From 000ed2ca2e9879c62a5aa9efa8b9263fd13514c6 Mon Sep 17 00:00:00 2001 From: "Gregory R. Warnes" Date: Sat, 4 Jul 2026 14:17:11 -0400 Subject: [PATCH 1/9] feat(ux): questions-panel group jump-back/overview affordance (GAP-16 Part D) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds a small numbered group-navigation strip so users can jump back to an earlier question group to review or edit it without losing forward progress or resubmitting anything. Groups are marked active (aria-current) or done (checkmark + non-color visual cue), never color-only. Buttons are plain ` + ); + } + return `
${dots.join("")}
`; + } + function _flushCurrentGroupAnswers() { + const qs = window.postAnalysisQuestions || []; + const groupStart = _currentGroup * GROUP_SIZE; + const groupEnd = Math.min(groupStart + GROUP_SIZE, qs.length); + for (let idx = groupStart; idx < groupEnd; idx++) { + const q2 = qs[idx]; + const ta = document.getElementById(`q-input-${idx}`); + if (q2 && ta && ta.value.trim()) { + if (!window.questionAnswers) window.questionAnswers = {}; + window.questionAnswers[q2.type] = ta.value.trim(); + } + } + } + function advanceQGroup() { + _flushCurrentGroupAnswers(); + persistPostAnalysisState(); + _currentGroup++; + renderQuestionsPanel(); + } + function jumpToQGroup(targetGroup) { + _flushCurrentGroupAnswers(); + persistPostAnalysisState(); + _currentGroup = targetGroup; + renderQuestionsPanel(); + } async function draftQuestionResponse(idx) { const qs = window.postAnalysisQuestions || []; const q2 = qs[idx]; @@ -22885,4 +22940,4 @@ Proceed anyway?` dompurify/dist/purify.es.mjs: (*! @license DOMPurify 3.3.3 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.3.3/LICENSE *) */ -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbm9kZV9tb2R1bGVzL2xvZ2xldmVsL2xpYi9sb2dsZXZlbC5qcyIsICJsb2dnZXIuanMiLCAidXRpbHMuanMiLCAiYXBpLWNsaWVudC5qcyIsICJmZXRjaC11dGlscy5qcyIsICJzdGF0ZS1tYW5hZ2VyLmpzIiwgInByb3ZpZGVyLWluZm8uanMiLCAidWktY29yZS5qcyIsICJsYXlvdXQtaW5zdHJ1Y3Rpb24uanMiLCAiYXRzLXJlZmluZW1lbnQuanMiLCAibWVzc2FnZS1xdWV1ZS5qcyIsICJyZXZpZXctdGFibGUtYmFzZS5qcyIsICJ3b3JrZmxvdy1zdGVwcy5qcyIsICJ2YWxpZGF0b3JzLmpzIiwgInJlY29tbWVuZGF0aW9uLWhlbHBlcnMuanMiLCAidWktaGVscGVycy5qcyIsICJwcm9wb3NhbC1yZXZpZXcuanMiLCAibGxtLWxvZy5qcyIsICJhdXRoLXByb3ZpZGVyLmpzIiwgImF0cy1tb2RhbHMuanMiLCAic2Vzc2lvbi1hY3Rpb25zLmpzIiwgImpvYi1hbmFseXNpcy5qcyIsICJnb2Fscy5qcyIsICJzZXNzaW9uLW1hbmFnZXIuanMiLCAiam9iLWlucHV0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tYXJrZWQvc3JjL2RlZmF1bHRzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9tYXJrZWQvc3JjL3J1bGVzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9tYXJrZWQvc3JjL2hlbHBlcnMudHMiLCAiLi4vbm9kZV9tb2R1bGVzL21hcmtlZC9zcmMvVG9rZW5pemVyLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9tYXJrZWQvc3JjL0xleGVyLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9tYXJrZWQvc3JjL1JlbmRlcmVyLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9tYXJrZWQvc3JjL1RleHRSZW5kZXJlci50cyIsICIuLi9ub2RlX21vZHVsZXMvbWFya2VkL3NyYy9QYXJzZXIudHMiLCAiLi4vbm9kZV9tb2R1bGVzL21hcmtlZC9zcmMvSG9va3MudHMiLCAiLi4vbm9kZV9tb2R1bGVzL21hcmtlZC9zcmMvSW5zdGFuY2UudHMiLCAiLi4vbm9kZV9tb2R1bGVzL21hcmtlZC9zcmMvbWFya2VkLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9kb21wdXJpZnkvc3JjL3V0aWxzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9kb21wdXJpZnkvc3JjL3RhZ3MudHMiLCAiLi4vbm9kZV9tb2R1bGVzL2RvbXB1cmlmeS9zcmMvYXR0cnMudHMiLCAiLi4vbm9kZV9tb2R1bGVzL2RvbXB1cmlmeS9zcmMvcmVnZXhwLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9kb21wdXJpZnkvc3JjL3B1cmlmeS50cyIsICJtZXNzYWdlLWRpc3BhdGNoLmpzIiwgInF1ZXN0aW9ucy1wYW5lbC5qcyIsICJyZXZpZXctaWNvbnMuanMiLCAiZXhwZXJpZW5jZS1yZXZpZXcuanMiLCAic2tpbGxzLXJldmlldy5qcyIsICJhY2hpZXZlbWVudHMtcmV2aWV3LmpzIiwgInRhZ2xpbmUtcmV2aWV3LmpzIiwgInN1bW1hcnktcmV2aWV3LmpzIiwgInB1YmxpY2F0aW9ucy1yZXZpZXcuanMiLCAicmV3cml0ZS1yZXZpZXcuanMiLCAic3BlbGwtY2hlY2suanMiLCAiZG93bmxvYWQtdGFiLmpzIiwgImZpbmFsLWdlbmVyYXRlLmpzIiwgIm1hc3Rlci1kYXRhLWFpLXVwZGF0ZS5qcyIsICJtYXN0ZXItY3YuanMiLCAiY292ZXItbGV0dGVyLmpzIiwgInNjcmVlbmluZy1xdWVzdGlvbnMuanMiLCAiZmluYWxpc2UuanMiLCAiaW50ZXJ2aWV3LXByZXAuanMiLCAidGhhbmsteW91LmpzIiwgImhhcnZlc3QuanMiLCAic2Vzc2lvbi1zd2l0Y2hlci11aS5qcyIsICJrZXlib2FyZC1zaG9ydGN1dHMuanMiLCAiYXBwLmpzIiwgInNyYy9tYWluLmpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKlxuKiBsb2dsZXZlbCAtIGh0dHBzOi8vZ2l0aHViLmNvbS9waW10ZXJyeS9sb2dsZXZlbFxuKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTMgVGltIFBlcnJ5XG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiovXG4oZnVuY3Rpb24gKHJvb3QsIGRlZmluaXRpb24pIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgICAgIGRlZmluZShkZWZpbml0aW9uKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgICAgIG1vZHVsZS5leHBvcnRzID0gZGVmaW5pdGlvbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJvb3QubG9nID0gZGVmaW5pdGlvbigpO1xuICAgIH1cbn0odGhpcywgZnVuY3Rpb24gKCkge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgLy8gU2xpZ2h0bHkgZHViaW91cyB0cmlja3MgdG8gY3V0IGRvd24gbWluaW1pemVkIGZpbGUgc2l6ZVxuICAgIHZhciBub29wID0gZnVuY3Rpb24oKSB7fTtcbiAgICB2YXIgdW5kZWZpbmVkVHlwZSA9IFwidW5kZWZpbmVkXCI7XG4gICAgdmFyIGlzSUUgPSAodHlwZW9mIHdpbmRvdyAhPT0gdW5kZWZpbmVkVHlwZSkgJiYgKHR5cGVvZiB3aW5kb3cubmF2aWdhdG9yICE9PSB1bmRlZmluZWRUeXBlKSAmJiAoXG4gICAgICAgIC9UcmlkZW50XFwvfE1TSUUgLy50ZXN0KHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50KVxuICAgICk7XG5cbiAgICB2YXIgbG9nTWV0aG9kcyA9IFtcbiAgICAgICAgXCJ0cmFjZVwiLFxuICAgICAgICBcImRlYnVnXCIsXG4gICAgICAgIFwiaW5mb1wiLFxuICAgICAgICBcIndhcm5cIixcbiAgICAgICAgXCJlcnJvclwiXG4gICAgXTtcblxuICAgIHZhciBfbG9nZ2Vyc0J5TmFtZSA9IHt9O1xuICAgIHZhciBkZWZhdWx0TG9nZ2VyID0gbnVsbDtcblxuICAgIC8vIENyb3NzLWJyb3dzZXIgYmluZCBlcXVpdmFsZW50IHRoYXQgd29ya3MgYXQgbGVhc3QgYmFjayB0byBJRTZcbiAgICBmdW5jdGlvbiBiaW5kTWV0aG9kKG9iaiwgbWV0aG9kTmFtZSkge1xuICAgICAgICB2YXIgbWV0aG9kID0gb2JqW21ldGhvZE5hbWVdO1xuICAgICAgICBpZiAodHlwZW9mIG1ldGhvZC5iaW5kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gbWV0aG9kLmJpbmQob2JqKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmNhbGwobWV0aG9kLCBvYmopO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIC8vIE1pc3NpbmcgYmluZCBzaGltIG9yIElFOCArIE1vZGVybml6ciwgZmFsbGJhY2sgdG8gd3JhcHBpbmdcbiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuYXBwbHkobWV0aG9kLCBbb2JqLCBhcmd1bWVudHNdKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVHJhY2UoKSBkb2Vzbid0IHByaW50IHRoZSBtZXNzYWdlIGluIElFLCBzbyBmb3IgdGhhdCBjYXNlIHdlIG5lZWQgdG8gd3JhcCBpdFxuICAgIGZ1bmN0aW9uIHRyYWNlRm9ySUUoKSB7XG4gICAgICAgIGlmIChjb25zb2xlLmxvZykge1xuICAgICAgICAgICAgaWYgKGNvbnNvbGUubG9nLmFwcGx5KSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2cuYXBwbHkoY29uc29sZSwgYXJndW1lbnRzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gSW4gb2xkIElFLCBuYXRpdmUgY29uc29sZSBtZXRob2RzIHRoZW1zZWx2ZXMgZG9uJ3QgaGF2ZSBhcHBseSgpLlxuICAgICAgICAgICAgICAgIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5hcHBseShjb25zb2xlLmxvZywgW2NvbnNvbGUsIGFyZ3VtZW50c10pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb25zb2xlLnRyYWNlKSBjb25zb2xlLnRyYWNlKCk7XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgdGhlIGJlc3QgbG9nZ2luZyBtZXRob2QgcG9zc2libGUgZm9yIHRoaXMgZW52XG4gICAgLy8gV2hlcmV2ZXIgcG9zc2libGUgd2Ugd2FudCB0byBiaW5kLCBub3Qgd3JhcCwgdG8gcHJlc2VydmUgc3RhY2sgdHJhY2VzXG4gICAgZnVuY3Rpb24gcmVhbE1ldGhvZChtZXRob2ROYW1lKSB7XG4gICAgICAgIGlmIChtZXRob2ROYW1lID09PSAnZGVidWcnKSB7XG4gICAgICAgICAgICBtZXRob2ROYW1lID0gJ2xvZyc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgPT09IHVuZGVmaW5lZFR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gTm8gbWV0aG9kIHBvc3NpYmxlLCBmb3Igbm93IC0gZml4ZWQgbGF0ZXIgYnkgZW5hYmxlTG9nZ2luZ1doZW5Db25zb2xlQXJyaXZlc1xuICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZE5hbWUgPT09ICd0cmFjZScgJiYgaXNJRSkge1xuICAgICAgICAgICAgcmV0dXJuIHRyYWNlRm9ySUU7XG4gICAgICAgIH0gZWxzZSBpZiAoY29uc29sZVttZXRob2ROYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYmluZE1ldGhvZChjb25zb2xlLCBtZXRob2ROYW1lKTtcbiAgICAgICAgfSBlbHNlIGlmIChjb25zb2xlLmxvZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYmluZE1ldGhvZChjb25zb2xlLCAnbG9nJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbm9vcDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoZXNlIHByaXZhdGUgZnVuY3Rpb25zIGFsd2F5cyBuZWVkIGB0aGlzYCB0byBiZSBzZXQgcHJvcGVybHlcblxuICAgIGZ1bmN0aW9uIHJlcGxhY2VMb2dnaW5nTWV0aG9kcygpIHtcbiAgICAgICAgLypqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi9cbiAgICAgICAgdmFyIGxldmVsID0gdGhpcy5nZXRMZXZlbCgpO1xuXG4gICAgICAgIC8vIFJlcGxhY2UgdGhlIGFjdHVhbCBtZXRob2RzLlxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxvZ01ldGhvZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBtZXRob2ROYW1lID0gbG9nTWV0aG9kc1tpXTtcbiAgICAgICAgICAgIHRoaXNbbWV0aG9kTmFtZV0gPSAoaSA8IGxldmVsKSA/XG4gICAgICAgICAgICAgICAgbm9vcCA6XG4gICAgICAgICAgICAgICAgdGhpcy5tZXRob2RGYWN0b3J5KG1ldGhvZE5hbWUsIGxldmVsLCB0aGlzLm5hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVmaW5lIGxvZy5sb2cgYXMgYW4gYWxpYXMgZm9yIGxvZy5kZWJ1Z1xuICAgICAgICB0aGlzLmxvZyA9IHRoaXMuZGVidWc7XG5cbiAgICAgICAgLy8gUmV0dXJuIGFueSBpbXBvcnRhbnQgd2FybmluZ3MuXG4gICAgICAgIGlmICh0eXBlb2YgY29uc29sZSA9PT0gdW5kZWZpbmVkVHlwZSAmJiBsZXZlbCA8IHRoaXMubGV2ZWxzLlNJTEVOVCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiTm8gY29uc29sZSBhdmFpbGFibGUgZm9yIGxvZ2dpbmdcIjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEluIG9sZCBJRSB2ZXJzaW9ucywgdGhlIGNvbnNvbGUgaXNuJ3QgcHJlc2VudCB1bnRpbCB5b3UgZmlyc3Qgb3BlbiBpdC5cbiAgICAvLyBXZSBidWlsZCByZWFsTWV0aG9kKCkgcmVwbGFjZW1lbnRzIGhlcmUgdGhhdCByZWdlbmVyYXRlIGxvZ2dpbmcgbWV0aG9kc1xuICAgIGZ1bmN0aW9uIGVuYWJsZUxvZ2dpbmdXaGVuQ29uc29sZUFycml2ZXMobWV0aG9kTmFtZSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSB1bmRlZmluZWRUeXBlKSB7XG4gICAgICAgICAgICAgICAgcmVwbGFjZUxvZ2dpbmdNZXRob2RzLmNhbGwodGhpcyk7XG4gICAgICAgICAgICAgICAgdGhpc1ttZXRob2ROYW1lXS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIEJ5IGRlZmF1bHQsIHdlIHVzZSBjbG9zZWx5IGJvdW5kIHJlYWwgbWV0aG9kcyB3aGVyZXZlciBwb3NzaWJsZSwgYW5kXG4gICAgLy8gb3RoZXJ3aXNlIHdlIHdhaXQgZm9yIGEgY29uc29sZSB0byBhcHBlYXIsIGFuZCB0aGVuIHRyeSBhZ2Fpbi5cbiAgICBmdW5jdGlvbiBkZWZhdWx0TWV0aG9kRmFjdG9yeShtZXRob2ROYW1lLCBfbGV2ZWwsIF9sb2dnZXJOYW1lKSB7XG4gICAgICAgIC8qanNoaW50IHZhbGlkdGhpczp0cnVlICovXG4gICAgICAgIHJldHVybiByZWFsTWV0aG9kKG1ldGhvZE5hbWUpIHx8XG4gICAgICAgICAgICAgICBlbmFibGVMb2dnaW5nV2hlbkNvbnNvbGVBcnJpdmVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gTG9nZ2VyKG5hbWUsIGZhY3RvcnkpIHtcbiAgICAgIC8vIFByaXZhdGUgaW5zdGFuY2UgdmFyaWFibGVzLlxuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgLyoqXG4gICAgICAgKiBUaGUgbGV2ZWwgaW5oZXJpdGVkIGZyb20gYSBwYXJlbnQgbG9nZ2VyIChvciBhIGdsb2JhbCBkZWZhdWx0KS4gV2VcbiAgICAgICAqIGNhY2hlIHRoaXMgaGVyZSByYXRoZXIgdGhhbiBkZWxlZ2F0aW5nIHRvIHRoZSBwYXJlbnQgc28gdGhhdCBpdCBzdGF5c1xuICAgICAgICogaW4gc3luYyB3aXRoIHRoZSBhY3R1YWwgbG9nZ2luZyBtZXRob2RzIHRoYXQgd2UgaGF2ZSBpbnN0YWxsZWQgKHRoZVxuICAgICAgICogcGFyZW50IGNvdWxkIGNoYW5nZSBsZXZlbHMgYnV0IHdlIG1pZ2h0IG5vdCBoYXZlIHJlYnVpbHQgdGhlIGxvZ2dlcnNcbiAgICAgICAqIGluIHRoaXMgY2hpbGQgeWV0KS5cbiAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgKi9cbiAgICAgIHZhciBpbmhlcml0ZWRMZXZlbDtcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGRlZmF1bHQgbGV2ZWwgZm9yIHRoaXMgbG9nZ2VyLCBpZiBhbnkuIElmIHNldCwgdGhpcyBvdmVycmlkZXNcbiAgICAgICAqIGBpbmhlcml0ZWRMZXZlbGAuXG4gICAgICAgKiBAdHlwZSB7bnVtYmVyfG51bGx9XG4gICAgICAgKi9cbiAgICAgIHZhciBkZWZhdWx0TGV2ZWw7XG4gICAgICAvKipcbiAgICAgICAqIEEgdXNlci1zcGVjaWZpYyBsZXZlbCBmb3IgdGhpcyBsb2dnZXIuIElmIHNldCwgdGhpcyBvdmVycmlkZXNcbiAgICAgICAqIGBkZWZhdWx0TGV2ZWxgLlxuICAgICAgICogQHR5cGUge251bWJlcnxudWxsfVxuICAgICAgICovXG4gICAgICB2YXIgdXNlckxldmVsO1xuXG4gICAgICB2YXIgc3RvcmFnZUtleSA9IFwibG9nbGV2ZWxcIjtcbiAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBzdG9yYWdlS2V5ICs9IFwiOlwiICsgbmFtZTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG5hbWUgPT09IFwic3ltYm9sXCIpIHtcbiAgICAgICAgc3RvcmFnZUtleSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gcGVyc2lzdExldmVsSWZQb3NzaWJsZShsZXZlbE51bSkge1xuICAgICAgICAgIHZhciBsZXZlbE5hbWUgPSAobG9nTWV0aG9kc1tsZXZlbE51bV0gfHwgJ3NpbGVudCcpLnRvVXBwZXJDYXNlKCk7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gdW5kZWZpbmVkVHlwZSB8fCAhc3RvcmFnZUtleSkgcmV0dXJuO1xuXG4gICAgICAgICAgLy8gVXNlIGxvY2FsU3RvcmFnZSBpZiBhdmFpbGFibGVcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlW3N0b3JhZ2VLZXldID0gbGV2ZWxOYW1lO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfSBjYXRjaCAoaWdub3JlKSB7fVxuXG4gICAgICAgICAgLy8gVXNlIHNlc3Npb24gY29va2llIGFzIGZhbGxiYWNrXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgd2luZG93LmRvY3VtZW50LmNvb2tpZSA9XG4gICAgICAgICAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KHN0b3JhZ2VLZXkpICsgXCI9XCIgKyBsZXZlbE5hbWUgKyBcIjtcIjtcbiAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGdldFBlcnNpc3RlZExldmVsKCkge1xuICAgICAgICAgIHZhciBzdG9yZWRMZXZlbDtcblxuICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSB1bmRlZmluZWRUeXBlIHx8ICFzdG9yYWdlS2V5KSByZXR1cm47XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBzdG9yZWRMZXZlbCA9IHdpbmRvdy5sb2NhbFN0b3JhZ2Vbc3RvcmFnZUtleV07XG4gICAgICAgICAgfSBjYXRjaCAoaWdub3JlKSB7fVxuXG4gICAgICAgICAgLy8gRmFsbGJhY2sgdG8gY29va2llcyBpZiBsb2NhbCBzdG9yYWdlIGdpdmVzIHVzIG5vdGhpbmdcbiAgICAgICAgICBpZiAodHlwZW9mIHN0b3JlZExldmVsID09PSB1bmRlZmluZWRUeXBlKSB7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICB2YXIgY29va2llID0gd2luZG93LmRvY3VtZW50LmNvb2tpZTtcbiAgICAgICAgICAgICAgICAgIHZhciBjb29raWVOYW1lID0gZW5jb2RlVVJJQ29tcG9uZW50KHN0b3JhZ2VLZXkpO1xuICAgICAgICAgICAgICAgICAgdmFyIGxvY2F0aW9uID0gY29va2llLmluZGV4T2YoY29va2llTmFtZSArIFwiPVwiKTtcbiAgICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbiAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICBzdG9yZWRMZXZlbCA9IC9eKFteO10rKS8uZXhlYyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29va2llLnNsaWNlKGxvY2F0aW9uICsgY29va2llTmFtZS5sZW5ndGggKyAxKVxuICAgICAgICAgICAgICAgICAgICAgIClbMV07XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGlnbm9yZSkge31cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBJZiB0aGUgc3RvcmVkIGxldmVsIGlzIG5vdCB2YWxpZCwgdHJlYXQgaXQgYXMgaWYgbm90aGluZyB3YXMgc3RvcmVkLlxuICAgICAgICAgIGlmIChzZWxmLmxldmVsc1tzdG9yZWRMZXZlbF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBzdG9yZWRMZXZlbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gc3RvcmVkTGV2ZWw7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGNsZWFyUGVyc2lzdGVkTGV2ZWwoKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IHVuZGVmaW5lZFR5cGUgfHwgIXN0b3JhZ2VLZXkpIHJldHVybjtcblxuICAgICAgICAgIC8vIFVzZSBsb2NhbFN0b3JhZ2UgaWYgYXZhaWxhYmxlXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHN0b3JhZ2VLZXkpO1xuICAgICAgICAgIH0gY2F0Y2ggKGlnbm9yZSkge31cblxuICAgICAgICAgIC8vIFVzZSBzZXNzaW9uIGNvb2tpZSBhcyBmYWxsYmFja1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHdpbmRvdy5kb2N1bWVudC5jb29raWUgPVxuICAgICAgICAgICAgICAgIGVuY29kZVVSSUNvbXBvbmVudChzdG9yYWdlS2V5KSArIFwiPTsgZXhwaXJlcz1UaHUsIDAxIEphbiAxOTcwIDAwOjAwOjAwIFVUQ1wiO1xuICAgICAgICAgIH0gY2F0Y2ggKGlnbm9yZSkge31cbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gbm9ybWFsaXplTGV2ZWwoaW5wdXQpIHtcbiAgICAgICAgICB2YXIgbGV2ZWwgPSBpbnB1dDtcbiAgICAgICAgICBpZiAodHlwZW9mIGxldmVsID09PSBcInN0cmluZ1wiICYmIHNlbGYubGV2ZWxzW2xldmVsLnRvVXBwZXJDYXNlKCldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgbGV2ZWwgPSBzZWxmLmxldmVsc1tsZXZlbC50b1VwcGVyQ2FzZSgpXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHR5cGVvZiBsZXZlbCA9PT0gXCJudW1iZXJcIiAmJiBsZXZlbCA+PSAwICYmIGxldmVsIDw9IHNlbGYubGV2ZWxzLlNJTEVOVCkge1xuICAgICAgICAgICAgICByZXR1cm4gbGV2ZWw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImxvZy5zZXRMZXZlbCgpIGNhbGxlZCB3aXRoIGludmFsaWQgbGV2ZWw6IFwiICsgaW5wdXQpO1xuICAgICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLypcbiAgICAgICAqXG4gICAgICAgKiBQdWJsaWMgbG9nZ2VyIEFQSSAtIHNlZSBodHRwczovL2dpdGh1Yi5jb20vcGltdGVycnkvbG9nbGV2ZWwgZm9yIGRldGFpbHNcbiAgICAgICAqXG4gICAgICAgKi9cblxuICAgICAgc2VsZi5uYW1lID0gbmFtZTtcblxuICAgICAgc2VsZi5sZXZlbHMgPSB7IFwiVFJBQ0VcIjogMCwgXCJERUJVR1wiOiAxLCBcIklORk9cIjogMiwgXCJXQVJOXCI6IDMsXG4gICAgICAgICAgXCJFUlJPUlwiOiA0LCBcIlNJTEVOVFwiOiA1fTtcblxuICAgICAgc2VsZi5tZXRob2RGYWN0b3J5ID0gZmFjdG9yeSB8fCBkZWZhdWx0TWV0aG9kRmFjdG9yeTtcblxuICAgICAgc2VsZi5nZXRMZXZlbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAodXNlckxldmVsICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB1c2VyTGV2ZWw7XG4gICAgICAgICAgfSBlbHNlIGlmIChkZWZhdWx0TGV2ZWwgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRMZXZlbDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGluaGVyaXRlZExldmVsO1xuICAgICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHNlbGYuc2V0TGV2ZWwgPSBmdW5jdGlvbiAobGV2ZWwsIHBlcnNpc3QpIHtcbiAgICAgICAgICB1c2VyTGV2ZWwgPSBub3JtYWxpemVMZXZlbChsZXZlbCk7XG4gICAgICAgICAgaWYgKHBlcnNpc3QgIT09IGZhbHNlKSB7ICAvLyBkZWZhdWx0cyB0byB0cnVlXG4gICAgICAgICAgICAgIHBlcnNpc3RMZXZlbElmUG9zc2libGUodXNlckxldmVsKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBOT1RFOiBpbiB2MiwgdGhpcyBzaG91bGQgY2FsbCByZWJ1aWxkKCksIHdoaWNoIHVwZGF0ZXMgY2hpbGRyZW4uXG4gICAgICAgICAgcmV0dXJuIHJlcGxhY2VMb2dnaW5nTWV0aG9kcy5jYWxsKHNlbGYpO1xuICAgICAgfTtcblxuICAgICAgc2VsZi5zZXREZWZhdWx0TGV2ZWwgPSBmdW5jdGlvbiAobGV2ZWwpIHtcbiAgICAgICAgICBkZWZhdWx0TGV2ZWwgPSBub3JtYWxpemVMZXZlbChsZXZlbCk7XG4gICAgICAgICAgaWYgKCFnZXRQZXJzaXN0ZWRMZXZlbCgpKSB7XG4gICAgICAgICAgICAgIHNlbGYuc2V0TGV2ZWwobGV2ZWwsIGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBzZWxmLnJlc2V0TGV2ZWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdXNlckxldmVsID0gbnVsbDtcbiAgICAgICAgICBjbGVhclBlcnNpc3RlZExldmVsKCk7XG4gICAgICAgICAgcmVwbGFjZUxvZ2dpbmdNZXRob2RzLmNhbGwoc2VsZik7XG4gICAgICB9O1xuXG4gICAgICBzZWxmLmVuYWJsZUFsbCA9IGZ1bmN0aW9uKHBlcnNpc3QpIHtcbiAgICAgICAgICBzZWxmLnNldExldmVsKHNlbGYubGV2ZWxzLlRSQUNFLCBwZXJzaXN0KTtcbiAgICAgIH07XG5cbiAgICAgIHNlbGYuZGlzYWJsZUFsbCA9IGZ1bmN0aW9uKHBlcnNpc3QpIHtcbiAgICAgICAgICBzZWxmLnNldExldmVsKHNlbGYubGV2ZWxzLlNJTEVOVCwgcGVyc2lzdCk7XG4gICAgICB9O1xuXG4gICAgICBzZWxmLnJlYnVpbGQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKGRlZmF1bHRMb2dnZXIgIT09IHNlbGYpIHtcbiAgICAgICAgICAgICAgaW5oZXJpdGVkTGV2ZWwgPSBub3JtYWxpemVMZXZlbChkZWZhdWx0TG9nZ2VyLmdldExldmVsKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXBsYWNlTG9nZ2luZ01ldGhvZHMuY2FsbChzZWxmKTtcblxuICAgICAgICAgIGlmIChkZWZhdWx0TG9nZ2VyID09PSBzZWxmKSB7XG4gICAgICAgICAgICAgIGZvciAodmFyIGNoaWxkTmFtZSBpbiBfbG9nZ2Vyc0J5TmFtZSkge1xuICAgICAgICAgICAgICAgIF9sb2dnZXJzQnlOYW1lW2NoaWxkTmFtZV0ucmVidWlsZCgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgLy8gSW5pdGlhbGl6ZSBhbGwgdGhlIGludGVybmFsIGxldmVscy5cbiAgICAgIGluaGVyaXRlZExldmVsID0gbm9ybWFsaXplTGV2ZWwoXG4gICAgICAgICAgZGVmYXVsdExvZ2dlciA/IGRlZmF1bHRMb2dnZXIuZ2V0TGV2ZWwoKSA6IFwiV0FSTlwiXG4gICAgICApO1xuICAgICAgdmFyIGluaXRpYWxMZXZlbCA9IGdldFBlcnNpc3RlZExldmVsKCk7XG4gICAgICBpZiAoaW5pdGlhbExldmVsICE9IG51bGwpIHtcbiAgICAgICAgICB1c2VyTGV2ZWwgPSBub3JtYWxpemVMZXZlbChpbml0aWFsTGV2ZWwpO1xuICAgICAgfVxuICAgICAgcmVwbGFjZUxvZ2dpbmdNZXRob2RzLmNhbGwoc2VsZik7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKlxuICAgICAqIFRvcC1sZXZlbCBBUElcbiAgICAgKlxuICAgICAqL1xuXG4gICAgZGVmYXVsdExvZ2dlciA9IG5ldyBMb2dnZXIoKTtcblxuICAgIGRlZmF1bHRMb2dnZXIuZ2V0TG9nZ2VyID0gZnVuY3Rpb24gZ2V0TG9nZ2VyKG5hbWUpIHtcbiAgICAgICAgaWYgKCh0eXBlb2YgbmFtZSAhPT0gXCJzeW1ib2xcIiAmJiB0eXBlb2YgbmFtZSAhPT0gXCJzdHJpbmdcIikgfHwgbmFtZSA9PT0gXCJcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIllvdSBtdXN0IHN1cHBseSBhIG5hbWUgd2hlbiBjcmVhdGluZyBhIGxvZ2dlci5cIik7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbG9nZ2VyID0gX2xvZ2dlcnNCeU5hbWVbbmFtZV07XG4gICAgICAgIGlmICghbG9nZ2VyKSB7XG4gICAgICAgICAgICBsb2dnZXIgPSBfbG9nZ2Vyc0J5TmFtZVtuYW1lXSA9IG5ldyBMb2dnZXIoXG4gICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICBkZWZhdWx0TG9nZ2VyLm1ldGhvZEZhY3RvcnlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxvZ2dlcjtcbiAgICB9O1xuXG4gICAgLy8gR3JhYiB0aGUgY3VycmVudCBnbG9iYWwgbG9nIHZhcmlhYmxlIGluIGNhc2Ugb2Ygb3ZlcndyaXRlXG4gICAgdmFyIF9sb2cgPSAodHlwZW9mIHdpbmRvdyAhPT0gdW5kZWZpbmVkVHlwZSkgPyB3aW5kb3cubG9nIDogdW5kZWZpbmVkO1xuICAgIGRlZmF1bHRMb2dnZXIubm9Db25mbGljdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gdW5kZWZpbmVkVHlwZSAmJlxuICAgICAgICAgICAgICAgd2luZG93LmxvZyA9PT0gZGVmYXVsdExvZ2dlcikge1xuICAgICAgICAgICAgd2luZG93LmxvZyA9IF9sb2c7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVmYXVsdExvZ2dlcjtcbiAgICB9O1xuXG4gICAgZGVmYXVsdExvZ2dlci5nZXRMb2dnZXJzID0gZnVuY3Rpb24gZ2V0TG9nZ2VycygpIHtcbiAgICAgICAgcmV0dXJuIF9sb2dnZXJzQnlOYW1lO1xuICAgIH07XG5cbiAgICAvLyBFUzYgZGVmYXVsdCBleHBvcnQsIGZvciBjb21wYXRpYmlsaXR5XG4gICAgZGVmYXVsdExvZ2dlclsnZGVmYXVsdCddID0gZGVmYXVsdExvZ2dlcjtcblxuICAgIHJldHVybiBkZWZhdWx0TG9nZ2VyO1xufSkpO1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvbG9nZ2VyLmpzXG4gKiBDZW50cmFsaXNlZCBsb2dnaW5nIHVzaW5nIHRoZSBsb2dsZXZlbCBsaWJyYXJ5LlxuICpcbiAqIFVzYWdlIChwZXItbW9kdWxlIG5hbWVkIGxvZ2dlcnMpOlxuICogICBpbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG4gKiAgIGNvbnN0IGxvZyA9IGdldExvZ2dlcignYXBpLWNsaWVudCcpO1xuICogICBsb2cuaW5mbygncmVxdWVzdCBzdGFydGVkJywgZW5kcG9pbnQpO1xuICogICBsb2cud2Fybignc2Vzc2lvbiBjb25mbGljdCcpO1xuICogICBsb2cuZXJyb3IoJ2ZhdGFsJywgZXJyb3IpO1xuICpcbiAqIFJvb3QgbG9nZ2VyICh1bmNoYW5nZWQgZ2xvYmFsIGxldmVsKTpcbiAqICAgaW1wb3J0IGxvZyBmcm9tICcuL2xvZ2dlci5qcyc7XG4gKiAgIGxvZy5zZXRMZXZlbCgnZGVidWcnKTsgICAvLyBsb3dlciB0aGUgZ2xvYmFsIG1pbmltdW1cbiAqXG4gKiBUaGUgZGVmYXVsdCBsZXZlbCBpcyAnd2FybicgaW4gcHJvZHVjdGlvbiBidWlsZHMgKE5PREVfRU5WPXByb2R1Y3Rpb24pIGFuZFxuICogJ2RlYnVnJyBpbiBkZXZlbG9wbWVudC4gIEluZGl2aWR1YWwgbW9kdWxlIGxldmVscyBjYW4gYmUgb3ZlcnJpZGRlbiBhdFxuICogcnVudGltZSB2aWEgdGhlIGJyb3dzZXIgY29uc29sZTpcbiAqICAgbG9nbGV2ZWwuZ2V0TG9nZ2VyKCdhcGktY2xpZW50Jykuc2V0TGV2ZWwoJ3RyYWNlJyk7XG4gKlxuICogREVQRU5ERU5DSUVTOiBsb2dsZXZlbCAobnBtKVxuICovXG5cbmltcG9ydCBsb2dsZXZlbCBmcm9tICdsb2dsZXZlbCc7XG5cbi8vIERlZmF1bHQgbGV2ZWw6IGRlYnVnIGluIGRldiwgd2FybiBpbiBwcm9kLlxuY29uc3QgREVGQVVMVF9MRVZFTCA9ICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vzcy5lbnYgJiYgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJylcbiAgPyAnd2FybidcbiAgOiAnZGVidWcnO1xuXG5sb2dsZXZlbC5zZXREZWZhdWx0TGV2ZWwoREVGQVVMVF9MRVZFTCk7XG5cbi8qKlxuICogR2V0IChvciBjcmVhdGUpIGEgbmFtZWQgY2hpbGQgbG9nZ2VyLlxuICogTmFtZWQgbG9nZ2VycyBpbmhlcml0IHRoZSByb290IGRlZmF1bHQgbGV2ZWwgYnV0IGNhbiBiZSB0dW5lZCBpbmRlcGVuZGVudGx5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gTW9kdWxlIG5hbWUsIGUuZy4gJ2FwaS1jbGllbnQnXG4gKiBAcmV0dXJucyB7aW1wb3J0KCdsb2dsZXZlbCcpLkxvZ2dlcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExvZ2dlcihuYW1lKSB7XG4gIHJldHVybiBsb2dsZXZlbC5nZXRMb2dnZXIobmFtZSk7XG59XG5cbi8vIEV4cG9zZSByb290IGxvZ2xldmVsIGluc3RhbmNlIG9uIGdsb2JhbFRoaXMgc28gdGhlIGJyb3dzZXIgY29uc29sZSBjYW5cbi8vIGFkanVzdCBsZXZlbHMgYXQgcnVudGltZSB3aXRob3V0IGEgYnVpbGQgc3RlcDpcbi8vICAgbG9nbGV2ZWwuc2V0TGV2ZWwoJ2RlYnVnJyk7XG4vLyAgIGxvZ2xldmVsLmdldExvZ2dlcignYXBpLWNsaWVudCcpLnNldExldmVsKCd0cmFjZScpO1xuaWYgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJykge1xuICBnbG9iYWxUaGlzLmxvZ2xldmVsID0gbG9nbGV2ZWw7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGxvZ2xldmVsO1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB1dGlscy5qc1xuICogVXRpbGl0eSBmdW5jdGlvbnMgZm9yIHRleHQgcHJvY2Vzc2luZywgZm9ybWF0dGluZywgYW5kIGRhdGEgbWFuaXB1bGF0aW9uLlxuICogTm8gZGVwZW5kZW5jaWVzIG9uIERPTSBvciBjb21wbGV4IHN0YXRlLiBQdXJlIGZ1bmN0aW9ucy5cbiAqL1xuXG4vKipcbiAqIE5vcm1hbGl6ZSB3aGl0ZXNwYWNlIGluIHRleHQ6XG4gKiAtIFJlbW92ZSBsZWFkaW5nL3RyYWlsaW5nIHdoaXRlc3BhY2VcbiAqIC0gQ29sbGFwc2UgaW50ZXJuYWwgd2hpdGVzcGFjZSB0byBzaW5nbGUgc3BhY2VzXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVRleHQodGV4dCkge1xuICByZXR1cm4gdGV4dFxuICAgIC50cmltKCkgIC8vIFJlbW92ZSBsZWFkaW5nL3RyYWlsaW5nIHdoaXRlc3BhY2VcbiAgICAucmVwbGFjZSgvXFxzKy9nLCAnICcpICAvLyBDb2xsYXBzZSBpbnRlcm5hbCB3aGl0ZXNwYWNlXG4gICAgLnRyaW0oKTtcbn1cblxuLyoqXG4gKiBGb3JtYXQgYSBVbml4IHRpbWVzdGFtcCBhcyBodW1hbi1yZWFkYWJsZSBkYXRlIHN0cmluZy5cbiAqIEV4YW1wbGU6IDE3MDkyMzY4MDAgXHUyMTkyIFwiTWFyIDEsIDIwMjRcIlxuICovXG5mdW5jdGlvbiBmbXREYXRlKHRzKSB7XG4gIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh0cyAqIDEwMDApO1xuICByZXR1cm4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcoJ2VuLVVTJywgeyBtb250aDogJ3Nob3J0JywgZGF5OiAnbnVtZXJpYycsIHllYXI6ICdudW1lcmljJyB9KTtcbn1cblxuLyoqXG4gKiBDbGVhbiBKU09OIHJlc3BvbnNlIGJ5IHJlbW92aW5nIG1hcmtkb3duIGNvZGUgYmxvY2tzLlxuICogSGFuZGxlcyBjb21tb24gcGF0dGVybnM6XG4gKiAtIGBgYGpzb24gLi4uIGBgYFxuICogLSBgYGBcbiAqICAgLi4uXG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gY2xlYW5Kc29uUmVzcG9uc2UodGV4dCkge1xuICBpZiAodHlwZW9mIHRleHQgIT09ICdzdHJpbmcnKSByZXR1cm4gdGV4dDtcbiAgbGV0IGNsZWFuZWQgPSB0ZXh0O1xuICAvLyBSZW1vdmUgYGBganNvbiB3cmFwcGVyXG4gIGNsZWFuZWQgPSBjbGVhbmVkLnJlcGxhY2UoL15gYGBqc29uXFxzKi9pLCAnJykucmVwbGFjZSgvYGBgXFxzKiQvaSwgJycpO1xuICAvLyBSZW1vdmUgYGBgIHdyYXBwZXJcbiAgY2xlYW5lZCA9IGNsZWFuZWQucmVwbGFjZSgvXmBgYFxccyovaSwgJycpLnJlcGxhY2UoL2BgYFxccyokL2ksICcnKTtcbiAgcmV0dXJuIGNsZWFuZWQudHJpbSgpO1xufVxuXG4vKipcbiAqIEV4dHJhY3QgYW5kIHBhcnNlIHRoZSBmaXJzdCB2YWxpZCBKU09OIG9iamVjdCBlbWJlZGRlZCBpbiBmcmVlLWZvcm0gdGV4dC5cbiAqIFJldHVybnMgbnVsbCB3aGVuIG5vIGNvbXBsZXRlIHBhcnNlYWJsZSBvYmplY3QgaXMgZm91bmQuXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RGaXJzdEpzb25PYmplY3QodGV4dCkge1xuICBpZiAodGV4dCA9PSBudWxsIHx8IHR5cGVvZiB0ZXh0ICE9PSAnc3RyaW5nJykgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgY2xlYW5lZCA9IGNsZWFuSnNvblJlc3BvbnNlKHRleHQpO1xuXG4gIGZvciAobGV0IHN0YXJ0ID0gMDsgc3RhcnQgPCBjbGVhbmVkLmxlbmd0aDsgc3RhcnQgKz0gMSkge1xuICAgIGlmIChjbGVhbmVkW3N0YXJ0XSAhPT0gJ3snKSBjb250aW51ZTtcblxuICAgIGxldCBkZXB0aCA9IDA7XG4gICAgbGV0IGluU3RyaW5nID0gZmFsc2U7XG4gICAgbGV0IGlzRXNjYXBlZCA9IGZhbHNlO1xuXG4gICAgZm9yIChsZXQgaW5kZXggPSBzdGFydDsgaW5kZXggPCBjbGVhbmVkLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgY29uc3QgY2hhciA9IGNsZWFuZWRbaW5kZXhdO1xuXG4gICAgICBpZiAoaW5TdHJpbmcpIHtcbiAgICAgICAgaWYgKGlzRXNjYXBlZCkge1xuICAgICAgICAgIGlzRXNjYXBlZCA9IGZhbHNlO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFyID09PSAnXFxcXCcpIHtcbiAgICAgICAgICBpc0VzY2FwZWQgPSB0cnVlO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFyID09PSAnXCInKSB7XG4gICAgICAgICAgaW5TdHJpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoYXIgPT09ICdcIicpIHtcbiAgICAgICAgaW5TdHJpbmcgPSB0cnVlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoYXIgPT09ICd7Jykge1xuICAgICAgICBkZXB0aCArPSAxO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoYXIgIT09ICd9JykgY29udGludWU7XG5cbiAgICAgIGRlcHRoIC09IDE7XG4gICAgICBpZiAoZGVwdGggIT09IDApIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBjYW5kaWRhdGUgPSBjbGVhbmVkLnNsaWNlKHN0YXJ0LCBpbmRleCArIDEpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoY2FuZGlkYXRlKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBFc2NhcGUgSFRNTCBzcGVjaWFsIGNoYXJhY3RlcnMgdG8gcHJldmVudCBpbmplY3Rpb24uXG4gKiBDb252ZXJ0czogJiA8ID4gXCIgJ1xuICovXG5mdW5jdGlvbiBlc2NhcGVIdG1sKHRleHQpIHtcbiAgaWYgKHRleHQgPT0gbnVsbCkgcmV0dXJuICcnO1xuICBpZiAodHlwZW9mIHRleHQgIT09ICdzdHJpbmcnKSByZXR1cm4gZXNjYXBlSHRtbChTdHJpbmcodGV4dCkpO1xuICBjb25zdCBtYXAgPSB7XG4gICAgJyYnOiAnJmFtcDsnLFxuICAgICc8JzogJyZsdDsnLFxuICAgICc+JzogJyZndDsnLFxuICAgICdcIic6ICcmcXVvdDsnLFxuICAgIFwiJ1wiOiAnJiMwMzk7J1xuICB9O1xuICByZXR1cm4gdGV4dC5yZXBsYWNlKC9bJjw+XCInXS9nLCBtID0+IG1hcFttXSk7XG59XG5cbi8qKlxuICogRXh0cmFjdCB0aXRsZSBhbmQgY29tcGFueSBmcm9tIGpvYiBkZXNjcmlwdGlvbiB0ZXh0LlxuICogUGF0dGVybnM6XG4gKiAtIFwiVGl0bGUgfCBDb21wYW55XCJcbiAqIC0gXCJUaXRsZSBhdCBDb21wYW55XCJcbiAqIC0gRmlyc3QgbGluZSBjb250YWluaW5nIFwidGl0bGVcIiwgXCJwb3NpdGlvblwiLCBcInJvbGVcIiwgXCJhcmNoaXRlY3RcIiwgZXRjLlxuICovXG5mdW5jdGlvbiBleHRyYWN0VGl0bGVBbmRDb21wYW55RnJvbUpvYlRleHQoam9iVGV4dCkge1xuICBjb25zdCBsaW5lcyA9IGpvYlRleHQuc3BsaXQoJ1xcbicpLm1hcChsID0+IGwudHJpbSgpKS5maWx0ZXIobCA9PiBsLmxlbmd0aCA+IDApO1xuXG4gIC8vIExvb2sgZm9yIHBhdHRlcm5zOiBcIlRpdGxlIHwgQ29tcGFueVwiIG9yIFwiVGl0bGUgYXQgQ29tcGFueVwiXG4gIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgIGlmIChsaW5lLmluY2x1ZGVzKCd8JykpIHtcbiAgICAgIGNvbnN0IFt0aXRsZSwgY29tcGFueV0gPSBsaW5lLnNwbGl0KCd8JykubWFwKHMgPT4gcy50cmltKCkpO1xuICAgICAgaWYgKHRpdGxlICYmIGNvbXBhbnkpIHtcbiAgICAgICAgcmV0dXJuIHsgdGl0bGUsIGNvbXBhbnkgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGxpbmUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnIGF0ICcpKSB7XG4gICAgICBjb25zdCBbdGl0bGUsIGNvbXBhbnldID0gbGluZS5zcGxpdCgvXFxzK2F0XFxzKy9pKS5tYXAocyA9PiBzLnRyaW0oKSk7XG4gICAgICBpZiAodGl0bGUgJiYgY29tcGFueSkge1xuICAgICAgICByZXR1cm4geyB0aXRsZSwgY29tcGFueSB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEZhbGxiYWNrOiB1c2UgZmlyc3Qgbm9uLWVtcHR5IGxpbmUgYXMgdGl0bGVcbiAgY29uc3QgdGl0bGVMaW5lID0gbGluZXNbMF07XG4gIHJldHVybiB7XG4gICAgdGl0bGU6IHRpdGxlTGluZSB8fCAnVW50aXRsZWQgUG9zaXRpb24nLFxuICAgIGNvbXBhbnk6IGxpbmVzLmZpbmQobCA9PiBsLnRvTG93ZXJDYXNlKCkgIT09IHRpdGxlTGluZS50b0xvd2VyQ2FzZSgpKSB8fCAnVW5rbm93biBDb21wYW55J1xuICB9O1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSBwb3NpdGlvbiBsYWJlbDpcbiAqIC0gQ2FwaXRhbGl6ZSBlYWNoIHdvcmRcbiAqIC0gUmVtb3ZlIHRyYWlsaW5nIFwicm9sZVwiLCBcInBvc2l0aW9uXCIsIFwidGl0bGVcIiwgXCJqb2JcIlxuICogRXhhbXBsZXM6XG4gKiAtIFwic2VuaW9yIGRhdGEgc2NpZW50aXN0XCIgXHUyMTkyIFwiU2VuaW9yIERhdGEgU2NpZW50aXN0XCJcbiAqIC0gXCJkaXJlY3RvciBvZiBlbmdpbmVlcmluZ1wiIFx1MjE5MiBcIkRpcmVjdG9yIG9mIEVuZ2luZWVyaW5nXCJcbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplUG9zaXRpb25MYWJlbCh0aXRsZSwgY29tcGFueSkge1xuICBsZXQgbm9ybWFsaXplZCA9IHRpdGxlXG4gICAgLnNwbGl0KCcgJylcbiAgICAubWFwKHdvcmQgPT4gd29yZC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHdvcmQuc2xpY2UoMSkudG9Mb3dlckNhc2UoKSlcbiAgICAuam9pbignICcpO1xuXG4gIC8vIFJlbW92ZSBjb21tb24gc3VmZml4ZXNcbiAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWRcbiAgICAucmVwbGFjZSgvXFxzKyhyb2xlfHBvc2l0aW9ufHRpdGxlfGpvYilcXHMqJC9pLCAnJylcbiAgICAudHJpbSgpO1xuXG4gIHJldHVybiBub3JtYWxpemVkIHx8ICdQcm9mZXNzaW9uYWwgUm9sZSc7XG59XG5cbi8qKlxuICogU3RyaXAgSFRNTCB0YWdzIGZyb20gc3RyaW5nLlxuICogVXNlcyBhbiBpbmVydCB0ZW1wbGF0ZSBlbGVtZW50LCB0aGVuIHJlbW92ZXMgZXhlY3V0YWJsZS9ub24tdmlzaWJsZSBub2Rlcy5cbiAqL1xuZnVuY3Rpb24gc3RyaXBIdG1sKGh0bWwpIHtcbiAgY29uc3QgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpO1xuICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBTdHJpbmcoaHRtbCA/PyAnJyk7XG4gIHRlbXBsYXRlLmNvbnRlbnQucXVlcnlTZWxlY3RvckFsbCgnc2NyaXB0LCBzdHlsZSwgbm9zY3JpcHQsIHRlbXBsYXRlJykuZm9yRWFjaChub2RlID0+IG5vZGUucmVtb3ZlKCkpO1xuICByZXR1cm4gdGVtcGxhdGUuY29udGVudC50ZXh0Q29udGVudCB8fCAnJztcbn1cblxuLyoqXG4gKiBUcnVuY2F0ZSB0ZXh0IHRvIG1heCBsZW5ndGggd2l0aCBlbGxpcHNpcy5cbiAqIFByZXNlcnZlcyB3b3JkIGJvdW5kYXJpZXMgd2hlbiBwb3NzaWJsZS5cbiAqL1xuZnVuY3Rpb24gdHJ1bmNhdGVUZXh0KHRleHQsIG1heExlbmd0aCA9IDEwMCkge1xuICBpZiAodGV4dC5sZW5ndGggPD0gbWF4TGVuZ3RoKSByZXR1cm4gdGV4dDtcblxuICAvLyBUcnVuY2F0ZSBhdCBtYXggbGVuZ3RoXG4gIGxldCB0cnVuY2F0ZWQgPSB0ZXh0LnN1YnN0cmluZygwLCBtYXhMZW5ndGgpO1xuXG4gIC8vIFRyeSB0byBmaW5kIHRoZSBsYXN0IHNwYWNlIHRvIGF2b2lkIGN1dHRpbmcgd29yZHNcbiAgY29uc3QgbGFzdFNwYWNlID0gdHJ1bmNhdGVkLmxhc3RJbmRleE9mKCcgJyk7XG4gIGlmIChsYXN0U3BhY2UgPiBNYXRoLmZsb29yKG1heExlbmd0aCAqIDAuNzUpKSB7XG4gICAgdHJ1bmNhdGVkID0gdHJ1bmNhdGVkLnN1YnN0cmluZygwLCBsYXN0U3BhY2UpO1xuICB9XG5cbiAgcmV0dXJuIHRydW5jYXRlZCArICdcdTIwMjYnO1xufVxuXG4vKipcbiAqIENhcGl0YWxpemUgZmlyc3QgbGV0dGVyIG9mIGVhY2ggd29yZC5cbiAqL1xuZnVuY3Rpb24gY2FwaXRhbGl6ZVdvcmRzKHRleHQpIHtcbiAgcmV0dXJuIHRleHRcbiAgICAuc3BsaXQoJyAnKVxuICAgIC5tYXAod29yZCA9PiB3b3JkLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgd29yZC5zbGljZSgxKS50b0xvd2VyQ2FzZSgpKVxuICAgIC5qb2luKCcgJyk7XG59XG5cbi8qKlxuICogQ29uZGl0aW9uYWwgcGx1cmFsaXphdGlvbiBoZWxwZXIuXG4gKiBFeGFtcGxlOiBwbHVyYWxpemUoMSwgJ2l0ZW0nLCAnaXRlbXMnKSBcdTIxOTIgJ2l0ZW0nXG4gKiAgICAgICAgICBwbHVyYWxpemUoMywgJ2l0ZW0nLCAnaXRlbXMnKSBcdTIxOTIgJ2l0ZW1zJ1xuICovXG5mdW5jdGlvbiBwbHVyYWxpemUoY291bnQsIHNpbmd1bGFyLCBwbHVyYWwpIHtcbiAgcmV0dXJuIGNvdW50ID09PSAxID8gc2luZ3VsYXIgOiBwbHVyYWw7XG59XG5cbi8qKlxuICogSHVtYW4tcmVhZGFibGUgdGltZSBkdXJhdGlvbi5cbiAqIEV4YW1wbGU6IDUwMDAgXHUyMTkyIFwiNSBzZWNvbmRzXCIsIDY1MDAwIFx1MjE5MiBcIjEgbWludXRlXCJcbiAqL1xuZnVuY3Rpb24gZm9ybWF0RHVyYXRpb24obXMpIHtcbiAgY29uc3Qgc2Vjb25kcyA9IE1hdGguZmxvb3IobXMgLyAxMDAwKTtcbiAgY29uc3QgbWludXRlcyA9IE1hdGguZmxvb3Ioc2Vjb25kcyAvIDYwKTtcbiAgY29uc3QgaG91cnMgPSBNYXRoLmZsb29yKG1pbnV0ZXMgLyA2MCk7XG5cbiAgaWYgKGhvdXJzID4gMCkgcmV0dXJuIGAke2hvdXJzfWggJHttaW51dGVzICUgNjB9bWA7XG4gIGlmIChtaW51dGVzID4gMCkgcmV0dXJuIGAke21pbnV0ZXN9bSAke3NlY29uZHMgJSA2MH1zYDtcbiAgcmV0dXJuIGAke3NlY29uZHN9c2A7XG59XG5cbi8qKlxuICogT3JkaW5hbCBudW1iZXIgc3VmZml4LlxuICogRXhhbXBsZTogMSBcdTIxOTIgXCIxc3RcIiwgMiBcdTIxOTIgXCIybmRcIiwgMyBcdTIxOTIgXCIzcmRcIiwgNCBcdTIxOTIgXCI0dGhcIlxuICovXG5mdW5jdGlvbiBvcmRpbmFsKG4pIHtcbiAgY29uc3QgcyA9IFsndGgnLCAnc3QnLCAnbmQnLCAncmQnXTtcbiAgY29uc3QgdiA9IG4gJSAxMDA7XG4gIHJldHVybiBuICsgKHNbKHYgLSAyMCkgJSAxMF0gfHwgc1t2XSB8fCBzWzBdKTtcbn1cblxuLy8gVXRpbGl0eSBmdW5jdGlvbnMgZm9yIHNlc3Npb24gbWFuYWdlbWVudCBhbmQgZm9ybWF0dGluZ1xuXG4vLyBGdWxsLWxlbmd0aCBwaGFzZSBsYWJlbHMgXHUyMDE0IHVzZWQgYnkgd29ya2Zsb3cgc3RlcCBkaXNwbGF5LCBzdGF0dXMgdGV4dCwgZXRjLlxuY29uc3QgU0VTU0lPTl9QSEFTRV9MQUJFTFMgPSB7XG4gIGluaXQ6ICAgICAgICAgICAgICdHZXR0aW5nIFN0YXJ0ZWQnLFxuICBqb2JfYW5hbHlzaXM6ICAgICAnSm9iIEFuYWx5c2lzJyxcbiAgY3VzdG9taXphdGlvbjogICAgJ0N1c3RvbWlzYXRpb24nLFxuICByZXdyaXRlX3JldmlldzogICAnUmV3cml0ZSBSZXZpZXcnLFxuICBzcGVsbF9jaGVjazogICAgICAnU3BlbGwgQ2hlY2snLFxuICBnZW5lcmF0aW9uOiAgICAgICAnR2VuZXJhdGlvbicsXG4gIGxheW91dF9yZXZpZXc6ICAgICdMYXlvdXQgUmV2aWV3JyxcbiAgcmVmaW5lbWVudDogICAgICAgJ0ZpbmFsaXNlJyxcbiAgZmluYWxfZ2VuZXJhdGlvbjogJ0ZpbmFsIEdlbmVyYXRpb24nLFxufTtcblxuLy8gQWJicmV2aWF0ZWQgcGhhc2UgbGFiZWxzIFx1MjAxNCB1c2VkIGJ5IHRoZSBjb21wYWN0IHNlc3Npb24tc3dpdGNoZXIgVUkuXG4vLyBJbnRlbnRpb25hbGx5IHNlcGFyYXRlIGZyb20gU0VTU0lPTl9QSEFTRV9MQUJFTFM6IHRoZSB0d28gc2V0cyBzZXJ2ZSBkaWZmZXJlbnRcbi8vIFVJIGNvbnRleHRzIChzcGFjZS1jb25zdHJhaW5lZCBoZWFkZXIgY2hpcCB2cy4gZnVsbCB3b3JrZmxvdyBzdGVwIGxhYmVsKS5cbmNvbnN0IFNFU1NJT05fUEhBU0VfTEFCRUxTX1NIT1JUID0ge1xuICBpbml0OiAgICAgICAgICAgICAnU2V0dXAnLFxuICBqb2JfYW5hbHlzaXM6ICAgICAnQW5hbHlzaXMnLFxuICBjdXN0b21pemF0aW9uOiAgICAnQ3VzdG9taXNpbmcnLFxuICByZXdyaXRlX3JldmlldzogICAnUmV3cml0ZXMnLFxuICBzcGVsbF9jaGVjazogICAgICAnU3BlbGwgQ2hlY2snLFxuICBnZW5lcmF0aW9uOiAgICAgICAnR2VuZXJhdGUnLFxuICBsYXlvdXRfcmV2aWV3OiAgICAnTGF5b3V0JyxcbiAgcmVmaW5lbWVudDogICAgICAgJ0ZpbmFsaXNlJyxcbiAgZmluYWxfZ2VuZXJhdGlvbjogJ0ZpbmFsIEdlbicsXG59O1xuXG4vKipcbiAqIEZvcm1hdCBzZXNzaW9uIHBoYXNlIGxhYmVscyAoZnVsbCBmb3JtKS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwaGFzZSAtIFRoZSBwaGFzZSBzdHJpbmcgdG8gZm9ybWF0LlxuICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgZm9ybWF0dGVkIHBoYXNlIGxhYmVsLlxuICovXG5mdW5jdGlvbiBmb3JtYXRTZXNzaW9uUGhhc2VMYWJlbChwaGFzZSkge1xuICBpZiAoIXBoYXNlKSByZXR1cm4gJ2luaXQnO1xuICByZXR1cm4gU0VTU0lPTl9QSEFTRV9MQUJFTFNbcGhhc2VdIHx8IFN0cmluZyhwaGFzZSkucmVwbGFjZSgvXy9nLCAnICcpO1xufVxuXG4vKipcbiAqIEZvcm1hdCBzZXNzaW9uIHRpbWVzdGFtcHMuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGltZXN0YW1wIC0gVGhlIHRpbWVzdGFtcCB0byBmb3JtYXQuXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyAtIEZvcm1hdHRpbmcgb3B0aW9ucy5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuaW5jbHVkZVRpbWU9dHJ1ZV0gLSBXaGV0aGVyIHRvIGluY2x1ZGUgdGltZSBpbiB0aGUgb3V0cHV0LlxuICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAqL1xuZnVuY3Rpb24gZm9ybWF0U2Vzc2lvblRpbWVzdGFtcCh0aW1lc3RhbXAsIHsgaW5jbHVkZVRpbWUgPSB0cnVlIH0gPSB7fSkge1xuICBpZiAoIXRpbWVzdGFtcCkgcmV0dXJuICdcdTIwMTQnO1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgRGF0ZSh0aW1lc3RhbXApLnRvTG9jYWxlU3RyaW5nKCdlbi1VUycsIHtcbiAgICAgIG1vbnRoOiAnc2hvcnQnLCBkYXk6ICdudW1lcmljJywgeWVhcjogJ251bWVyaWMnLFxuICAgICAgLi4uKGluY2x1ZGVUaW1lID8geyBob3VyOiAnbnVtZXJpYycsIG1pbnV0ZTogJzItZGlnaXQnIH0gOiB7fSksXG4gICAgfSk7XG4gIH0gY2F0Y2ggKF8pIHtcbiAgICByZXR1cm4gU3RyaW5nKHRpbWVzdGFtcCkucmVwbGFjZSgnVCcsICcgJykuc2xpY2UoMCwgaW5jbHVkZVRpbWUgPyAxNiA6IDEwKTtcbiAgfVxufVxuXG4vLyBTdHJ1Y3R1cmVkIGxvZ2dpbmcgaGVscGVyIChnbG9iYWwgYW5kIHRlc3QtZnJpZW5kbHkpLlxuY29uc3QgTE9HX0xFVkVMUyA9IHsgZGVidWc6IDEwLCBpbmZvOiAyMCwgd2FybjogMzAsIGVycm9yOiA0MCB9O1xuY29uc3QgREVGQVVMVF9MT0dfTEVWRUwgPSAnaW5mbyc7XG5cbmZ1bmN0aW9uIGNyZWF0ZUxvZ0VudHJ5KGxldmVsLCBtZXNzYWdlLCBtZXRhZGF0YSA9IHt9KSB7XG4gIGNvbnN0IGVudHJ5ID0ge1xuICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIGxldmVsLFxuICAgIG1lc3NhZ2U6IFN0cmluZyhtZXNzYWdlKSxcbiAgICAuLi5tZXRhZGF0YSxcbiAgfTtcbiAgcmV0dXJuIGVudHJ5O1xufVxuXG5jb25zdCBsb2dnZXIgPSB7XG4gIGxldmVsOiBERUZBVUxUX0xPR19MRVZFTCxcblxuICBzZXRMZXZlbChuZXdMZXZlbCkge1xuICAgIGlmIChMT0dfTEVWRUxTW25ld0xldmVsXSAhPSBudWxsKSB7XG4gICAgICB0aGlzLmxldmVsID0gbmV3TGV2ZWw7XG4gICAgfVxuICB9LFxuXG4gIHNob3VsZExvZyhsZXZlbCkge1xuICAgIGlmIChMT0dfTEVWRUxTW2xldmVsXSA9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIExPR19MRVZFTFNbbGV2ZWxdID49IExPR19MRVZFTFNbdGhpcy5sZXZlbF07XG4gIH0sXG5cbiAgbG9nKGxldmVsLCBtZXNzYWdlLCBtZXRhZGF0YSA9IHt9KSB7XG4gICAgaWYgKCF0aGlzLnNob3VsZExvZyhsZXZlbCkpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgZW50cnkgPSBjcmVhdGVMb2dFbnRyeShsZXZlbCwgbWVzc2FnZSwgbWV0YWRhdGEpO1xuICAgIGNvbnN0IGZvcm1hdHRlZCA9IEpTT04uc3RyaW5naWZ5KGVudHJ5KTtcblxuICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGlmIChsZXZlbCA9PT0gJ2Vycm9yJykgY29uc29sZS5lcnJvcihmb3JtYXR0ZWQpO1xuICAgICAgZWxzZSBpZiAobGV2ZWwgPT09ICd3YXJuJykgY29uc29sZS53YXJuKGZvcm1hdHRlZCk7XG4gICAgICBlbHNlIGNvbnNvbGUubG9nKGZvcm1hdHRlZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVudHJ5O1xuICB9LFxuXG4gIGRlYnVnKG1lc3NhZ2UsIG1ldGFkYXRhID0ge30pIHsgcmV0dXJuIHRoaXMubG9nKCdkZWJ1ZycsIG1lc3NhZ2UsIG1ldGFkYXRhKTsgfSxcbiAgaW5mbyhtZXNzYWdlLCBtZXRhZGF0YSA9IHt9KSB7IHJldHVybiB0aGlzLmxvZygnaW5mbycsIG1lc3NhZ2UsIG1ldGFkYXRhKTsgfSxcbiAgd2FybihtZXNzYWdlLCBtZXRhZGF0YSA9IHt9KSB7IHJldHVybiB0aGlzLmxvZygnd2FybicsIG1lc3NhZ2UsIG1ldGFkYXRhKTsgfSxcbiAgZXJyb3IobWVzc2FnZSwgbWV0YWRhdGEgPSB7fSkgeyByZXR1cm4gdGhpcy5sb2coJ2Vycm9yJywgbWVzc2FnZSwgbWV0YWRhdGEpOyB9LFxuXG4gIGV2ZW50KGFjdGlvbiwgbWV0YWRhdGEgPSB7fSkge1xuICAgIHJldHVybiB0aGlzLmluZm8oYGV2ZW50OiR7YWN0aW9ufWAsIHsgYWN0aW9uLCAuLi5tZXRhZGF0YSB9KTtcbiAgfSxcbn07XG5cbmlmICh0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgZ2xvYmFsVGhpcy5sb2dnZXIgPSBsb2dnZXI7XG59XG5cbmV4cG9ydCB7XG4gIG5vcm1hbGl6ZVRleHQsIGZtdERhdGUsIGNsZWFuSnNvblJlc3BvbnNlLCBleHRyYWN0Rmlyc3RKc29uT2JqZWN0LCBlc2NhcGVIdG1sLFxuICBleHRyYWN0VGl0bGVBbmRDb21wYW55RnJvbUpvYlRleHQsIG5vcm1hbGl6ZVBvc2l0aW9uTGFiZWwsXG4gIHN0cmlwSHRtbCwgdHJ1bmNhdGVUZXh0LCBjYXBpdGFsaXplV29yZHMsIHBsdXJhbGl6ZSxcbiAgZm9ybWF0RHVyYXRpb24sIG9yZGluYWwsXG4gIFNFU1NJT05fUEhBU0VfTEFCRUxTLCBTRVNTSU9OX1BIQVNFX0xBQkVMU19TSE9SVCxcbiAgZm9ybWF0U2Vzc2lvblBoYXNlTGFiZWwsXG4gIGxvZ2dlcixcbn07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIGFwaS1jbGllbnQuanNcbiAqIENlbnRyYWxpemVkIEhUVFAgY29tbXVuaWNhdGlvbiBsYXllci4gQWxsIEFQSSBjYWxscyBnbyB0aHJvdWdoIGFwaUNhbGwoKS5cbiAqIFByb3ZpZGVzIGVycm9yIGhhbmRsaW5nLCBsb2dnaW5nLCBhbmQgcmV0cnkgbG9naWMuXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgaGFuZGxlNDA5Q29uZmxpY3QgfSBmcm9tICcuL2ZldGNoLXV0aWxzLmpzJztcbmNvbnN0IGxvZyA9IGdldExvZ2dlcignYXBpLWNsaWVudCcpO1xuXG4vKipcbiAqIENlbnRyYWxpemVkIGxvY2FsU3RvcmFnZSBrZXkgbWFuYWdlbWVudCB0byBhdm9pZCBkdXBsaWNhdGlvblxuICovXG5jb25zdCBTdG9yYWdlS2V5cyA9IHtcbiAgU0VTU0lPTl9JRDogICAgICAgICAgICdjdi1idWlsZGVyLXNlc3Npb24taWQnLFxuICBTRVNTSU9OX1BBVEg6ICAgICAgICAgJ2N2LWJ1aWxkZXItc2Vzc2lvbi1wYXRoJyxcbiAgVEFCX0RBVEE6ICAgICAgICAgICAgICdjdi1idWlsZGVyLXRhYi1kYXRhJyxcbiAgQ1VSUkVOVF9UQUI6ICAgICAgICAgICdjdi1idWlsZGVyLWN1cnJlbnQtdGFiJyxcbiAgQ0hBVF9DT0xMQVBTRUQ6ICAgICAgICdjdi1idWlsZGVyLWNoYXQtY29sbGFwc2VkJyxcbiAgTExNX0RJU0NMT1NVUkVfU0hPV046ICdjdi1idWlsZGVyLWxsbS1kaXNjbG9zdXJlLXNob3duJyxcbn07XG5cbmNvbnN0IE9XTkVSX1RPS0VOX0tFWSA9ICdjdi1idWlsZGVyLW93bmVyLXRva2VuJztcblxuZnVuY3Rpb24gZ2V0U2Vzc2lvbklkRnJvbVVSTCgpIHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICF3aW5kb3cubG9jYXRpb24pIHJldHVybiBudWxsO1xuICByZXR1cm4gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKS5nZXQoJ3Nlc3Npb24nKTtcbn1cblxuZnVuY3Rpb24gZ2V0T3duZXJUb2tlbigpIHtcbiAgaWYgKHR5cGVvZiBzZXNzaW9uU3RvcmFnZSA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybiBudWxsO1xuICBsZXQgdG9rZW4gPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKE9XTkVSX1RPS0VOX0tFWSk7XG4gIGlmICghdG9rZW4pIHtcbiAgICBpZiAodHlwZW9mIGNyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNyeXB0by5yYW5kb21VVUlEID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0b2tlbiA9IGNyeXB0by5yYW5kb21VVUlEKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRva2VuID0gYHRhYi0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygxNikuc2xpY2UoMiwgMTApfWA7XG4gICAgfVxuICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oT1dORVJfVE9LRU5fS0VZLCB0b2tlbik7XG4gIH1cbiAgcmV0dXJuIHRva2VuO1xufVxuXG5mdW5jdGlvbiBnZXRTY29wZWRUYWJEYXRhU3RvcmFnZUtleShzZXNzaW9uSWQgPSBudWxsKSB7XG4gIGNvbnN0IHNjb3BlZFNlc3Npb25JZCA9IHNlc3Npb25JZCB8fCBnZXRTZXNzaW9uSWRGcm9tVVJMKCk7XG4gIHJldHVybiBzY29wZWRTZXNzaW9uSWRcbiAgICA/IGAke1N0b3JhZ2VLZXlzLlRBQl9EQVRBfS0ke3Njb3BlZFNlc3Npb25JZH1gXG4gICAgOiBTdG9yYWdlS2V5cy5UQUJfREFUQTtcbn1cblxuZnVuY3Rpb24gX2lzU2Vzc2lvbk1hbmFnZW1lbnRQYXRoKHBhdGhuYW1lKSB7XG4gIHJldHVybiBwYXRobmFtZSA9PT0gJy9hcGkvc2Vzc2lvbnMvbmV3J1xuICAgIHx8IHBhdGhuYW1lID09PSAnL2FwaS9zZXNzaW9ucy9jbGFpbSdcbiAgICB8fCBwYXRobmFtZSA9PT0gJy9hcGkvc2Vzc2lvbnMvdGFrZW92ZXInO1xufVxuXG5mdW5jdGlvbiBfYnVpbGRTZXNzaW9uQXdhcmVSZXF1ZXN0KGlucHV0LCBpbml0ID0ge30pIHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICF3aW5kb3cubG9jYXRpb24pIHtcbiAgICByZXR1cm4gW2lucHV0LCBpbml0XTtcbiAgfVxuXG4gIGNvbnN0IHVybCA9IG5ldyBVUkwodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJyA/IGlucHV0IDogaW5wdXQudXJsLCB3aW5kb3cubG9jYXRpb24ub3JpZ2luKTtcbiAgaWYgKCF1cmwucGF0aG5hbWUuc3RhcnRzV2l0aCgnL2FwaS8nKSkge1xuICAgIHJldHVybiBbaW5wdXQsIGluaXRdO1xuICB9XG5cbiAgY29uc3Qgb3duZXJUb2tlbiA9IGdldE93bmVyVG9rZW4oKTtcbiAgaWYgKCF1cmwuc2VhcmNoUGFyYW1zLmhhcygnb3duZXJfdG9rZW4nKSAmJiAhX2lzU2Vzc2lvbk1hbmFnZW1lbnRQYXRoKHVybC5wYXRobmFtZSkgJiYgb3duZXJUb2tlbikge1xuICAgIHVybC5zZWFyY2hQYXJhbXMuc2V0KCdvd25lcl90b2tlbicsIG93bmVyVG9rZW4pO1xuICB9XG5cbiAgY29uc3Qgc2Vzc2lvbklkID0gZ2V0U2Vzc2lvbklkRnJvbVVSTCgpO1xuICBpZiAoIXNlc3Npb25JZCkge1xuICAgIHJldHVybiBbdXJsLnRvU3RyaW5nKCksIGluaXRdO1xuICB9XG5cbiAgY29uc3QgbWV0aG9kID0gKGluaXQubWV0aG9kIHx8ICdHRVQnKS50b1VwcGVyQ2FzZSgpO1xuICBjb25zdCBuZXh0SW5pdCA9IHsgLi4uaW5pdCB9O1xuICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoaW5pdC5oZWFkZXJzIHx8IHt9KTtcblxuICBpZiAoIXVybC5zZWFyY2hQYXJhbXMuaGFzKCdzZXNzaW9uX2lkJykgJiYgIV9pc1Nlc3Npb25NYW5hZ2VtZW50UGF0aCh1cmwucGF0aG5hbWUpKSB7XG4gICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ3Nlc3Npb25faWQnLCBzZXNzaW9uSWQpO1xuICB9XG5cbiAgY29uc3QgbmVlZHNCb2R5Q29udGV4dCA9ICFbJ0dFVCcsICdIRUFEJ10uaW5jbHVkZXMobWV0aG9kKTtcbiAgY29uc3QgYm9keSA9IG5leHRJbml0LmJvZHk7XG4gIGNvbnN0IGlzRm9ybURhdGEgPSB0eXBlb2YgRm9ybURhdGEgIT09ICd1bmRlZmluZWQnICYmIGJvZHkgaW5zdGFuY2VvZiBGb3JtRGF0YTtcbiAgY29uc3QgaXNVUkxTZWFyY2hQYXJhbXMgPSB0eXBlb2YgVVJMU2VhcmNoUGFyYW1zICE9PSAndW5kZWZpbmVkJyAmJiBib2R5IGluc3RhbmNlb2YgVVJMU2VhcmNoUGFyYW1zO1xuICBjb25zdCBjb250ZW50VHlwZSA9IGhlYWRlcnMuZ2V0KCdDb250ZW50LVR5cGUnKSB8fCAnJztcblxuICBpZiAobmVlZHNCb2R5Q29udGV4dCAmJiAhaXNGb3JtRGF0YSAmJiAhaXNVUkxTZWFyY2hQYXJhbXMpIHtcbiAgICBsZXQgcGF5bG9hZCA9IHt9O1xuICAgIGlmICh0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycgJiYgYm9keS50cmltKCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHBheWxvYWQgPSBKU09OLnBhcnNlKGJvZHkpO1xuICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICByZXR1cm4gW3VybC50b1N0cmluZygpLCBuZXh0SW5pdF07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChib2R5ID09IG51bGwpIHtcbiAgICAgIHBheWxvYWQgPSB7fTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBib2R5ID09PSAnb2JqZWN0Jykge1xuICAgICAgcGF5bG9hZCA9IHsgLi4uYm9keSB9O1xuICAgIH1cblxuICAgIGlmIChwYXlsb2FkLnNlc3Npb25faWQgPT0gbnVsbCAmJiAhX2lzU2Vzc2lvbk1hbmFnZW1lbnRQYXRoKHVybC5wYXRobmFtZSkpIHtcbiAgICAgIHBheWxvYWQuc2Vzc2lvbl9pZCA9IHNlc3Npb25JZDtcbiAgICB9XG4gICAgaWYgKHBheWxvYWQub3duZXJfdG9rZW4gPT0gbnVsbCAmJiAhX2lzU2Vzc2lvbk1hbmFnZW1lbnRQYXRoKHVybC5wYXRobmFtZSkpIHtcbiAgICAgIGlmIChvd25lclRva2VuKSBwYXlsb2FkLm93bmVyX3Rva2VuID0gb3duZXJUb2tlbjtcbiAgICB9XG5cbiAgICBuZXh0SW5pdC5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocGF5bG9hZCk7XG4gICAgaWYgKCFjb250ZW50VHlwZSkge1xuICAgICAgaGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uJyk7XG4gICAgfVxuICB9XG5cbiAgbmV4dEluaXQuaGVhZGVycyA9IGhlYWRlcnM7XG4gIHJldHVybiBbdXJsLnRvU3RyaW5nKCksIG5leHRJbml0XTtcbn1cblxuY29uc3QgX25hdGl2ZUZldGNoID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5mZXRjaCA9PT0gJ2Z1bmN0aW9uJ1xuICA/IHdpbmRvdy5mZXRjaC5iaW5kKHdpbmRvdylcbiAgOiAodHlwZW9mIGdsb2JhbFRoaXMuZmV0Y2ggPT09ICdmdW5jdGlvbicgPyBnbG9iYWxUaGlzLmZldGNoLmJpbmQoZ2xvYmFsVGhpcykgOiBudWxsKTtcblxuYXN5bmMgZnVuY3Rpb24gc2Vzc2lvbkF3YXJlRmV0Y2goaW5wdXQsIGluaXQgPSB7fSkge1xuICBpZiAoX25hdGl2ZUZldGNoID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZldGNoIGlzIG5vdCBhdmFpbGFibGUnKTtcbiAgfVxuICBjb25zdCBbbmV4dElucHV0LCBuZXh0SW5pdF0gPSBfYnVpbGRTZXNzaW9uQXdhcmVSZXF1ZXN0KGlucHV0LCBpbml0KTtcbiAgbGV0IHJlc3AgPSBhd2FpdCBfbmF0aXZlRmV0Y2gobmV4dElucHV0LCBuZXh0SW5pdCk7XG4gIGlmIChyZXNwLnN0YXR1cyA9PT0gNDA5KSB7XG4gICAgY29uc3Qgc2hvdWxkUmV0cnkgPSBhd2FpdCBoYW5kbGU0MDlDb25mbGljdChuZXh0SW5wdXQsIG5leHRJbml0LCByZXNwKTtcbiAgICBpZiAoc2hvdWxkUmV0cnkpIHJlc3AgPSBhd2FpdCBfbmF0aXZlRmV0Y2gobmV4dElucHV0LCBuZXh0SW5pdCk7XG4gIH1cbiAgcmV0dXJuIHJlc3A7XG59XG5cbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93LmZldGNoID09PSAnZnVuY3Rpb24nKSB7XG4gIHdpbmRvdy5mZXRjaCA9IHNlc3Npb25Bd2FyZUZldGNoO1xufVxuXG4vKipcbiAqIEJhc2UgQVBJIGNhbGwgZnVuY3Rpb24gd2l0aCBlcnJvciBoYW5kbGluZyBhbmQgbG9nZ2luZy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2QgLSBIVFRQIG1ldGhvZCAoR0VULCBQT1NULCBldGMuKVxuICogQHBhcmFtIHtzdHJpbmd9IGVuZHBvaW50IC0gQVBJIGVuZHBvaW50IChlLmcuLCAnL2FwaS9zdGF0dXMnKVxuICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBSZXF1ZXN0IGJvZHkgZGF0YSAoZm9yIFBPU1QvUFVUKVxuICogQHJldHVybnMge1Byb21pc2U8b2JqZWN0Pn0gUGFyc2VkIEpTT04gcmVzcG9uc2VcbiAqL1xuYXN5bmMgZnVuY3Rpb24gYXBpQ2FsbChtZXRob2QsIGVuZHBvaW50LCBkYXRhID0gbnVsbCkge1xuICBjb25zdCBvcHRpb25zID0ge1xuICAgIG1ldGhvZCxcbiAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfVxuICB9O1xuXG4gIGlmIChkYXRhICYmIChtZXRob2QgPT09ICdQT1NUJyB8fCBtZXRob2QgPT09ICdQVVQnKSkge1xuICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNlc3Npb25Bd2FyZUZldGNoKGVuZHBvaW50LCBvcHRpb25zKTtcblxuICAgIC8vIEhhbmRsZSA0MDkgQ29uZmxpY3QgKHNlc3Npb24gYWxyZWFkeSBhY3RpdmUpXG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA5KSB7XG4gICAgICBsb2cud2FybihgU2Vzc2lvbiBjb25mbGljdCBvbiAke2VuZHBvaW50fWApO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTZXNzaW9uIGFscmVhZHkgYWN0aXZlIGluIGFub3RoZXIgdGFiJyk7XG4gICAgfVxuXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgbG9nLmVycm9yKGBBUEkgZXJyb3Igb24gJHttZXRob2R9ICR7ZW5kcG9pbnR9OmAsIHJlc3BvbnNlLnN0YXR1cywgcmVzcG9uc2Uuc3RhdHVzVGV4dCk7XG4gICAgICBsZXQgZXJyb3JNZXNzYWdlID0gcmVzcG9uc2Uuc3RhdHVzVGV4dDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGVycm9ySnNvbiA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgaWYgKGVycm9ySnNvbiAmJiB0eXBlb2YgZXJyb3JKc29uID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGVycm9ySnNvbi5lcnJvciB8fCBlcnJvckpzb24ubWVzc2FnZSB8fCBlcnJvck1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgLy8gRmFsbCBiYWNrIHRvIHN0YXR1cyB0ZXh0IHdoZW4gcmVzcG9uc2UgaXMgbm90IEpTT04uXG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7cmVzcG9uc2Uuc3RhdHVzfTogJHtlcnJvck1lc3NhZ2V9YCk7XG4gICAgfVxuXG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICByZXR1cm4ganNvbjtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cuZXJyb3IoYEFQSSBjYWxsIGZhaWxlZDogJHttZXRob2R9ICR7ZW5kcG9pbnR9YCwgZXJyb3IpO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09XG4vLyBTZXNzaW9uIE1hbmFnZW1lbnRcbi8vID09PT09PT09PT09PT09PT09PT09XG5cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVNlc3Npb24oKSB7XG4gIHJldHVybiBhcGlDYWxsKCdQT1NUJywgJy9hcGkvc2Vzc2lvbnMvbmV3Jyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoU3RhdHVzKCkge1xuICBjb25zdCBzdGF0dXMgPSBhd2FpdCBhcGlDYWxsKCdHRVQnLCAnL2FwaS9zdGF0dXMnKTtcblxuICAvLyBLZWVwIHByb3ZpZGVyL2F1dGggVUkgaW4gc3luYyB3aGVuZXZlciBzdGF0dXMgaXMgZmV0Y2hlZC5cbiAgY29uc3QgcHJvdmlkZXIgPSBzdGF0dXM/LmxsbV9wcm92aWRlciB8fCBudWxsO1xuICBpZiAocHJvdmlkZXIpIHtcbiAgICBnbG9iYWxUaGlzLmN1cnJlbnRQcm92aWRlciA9IHByb3ZpZGVyO1xuICB9XG4gIGlmICh0eXBlb2YgZ2xvYmFsVGhpcy51cGRhdGVBdXRoQmFkZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICBnbG9iYWxUaGlzLnVwZGF0ZUF1dGhCYWRnZShzdGF0dXM/LmNvcGlsb3RfYXV0aCB8fCB7fSwgcHJvdmlkZXIpO1xuICB9XG5cbiAgLy8gVXBkYXRlIHdvcmtmbG93IHN0ZXAgYmFyIChjbGlja2FibGUvY29tcGxldGVkL2FjdGl2ZSBzdGF0ZSkgb24gZXZlcnkgc3RhdHVzIGZldGNoLlxuICBpZiAodHlwZW9mIGdsb2JhbFRoaXMudXBkYXRlV29ya2Zsb3dTdGVwcyA9PT0gJ2Z1bmN0aW9uJyAmJiBzdGF0dXMgJiYgIXN0YXR1cy5fZXJyb3IpIHtcbiAgICBnbG9iYWxUaGlzLnVwZGF0ZVdvcmtmbG93U3RlcHMoc3RhdHVzKTtcbiAgfVxuXG4gIHJldHVybiBzdGF0dXM7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09XG4vLyBTZXR0aW5nc1xuLy8gPT09PT09PT09PT09PT09PT09PT1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hTZXR0aW5ncygpIHtcbiAgcmV0dXJuIGFwaUNhbGwoJ0dFVCcsICcvYXBpL3NldHRpbmdzJyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVNldHRpbmdzKHNldHRpbmdzKSB7XG4gIHJldHVybiBhcGlDYWxsKCdQVVQnLCAnL2FwaS9zZXR0aW5ncycsIHsgc2V0dGluZ3MgfSk7XG59XG5cbmV4cG9ydCB7XG4gIFN0b3JhZ2VLZXlzLFxuICBPV05FUl9UT0tFTl9LRVksXG4gIGFwaUNhbGwsXG4gIGdldFNlc3Npb25JZEZyb21VUkwsXG4gIGdldE93bmVyVG9rZW4sXG4gIGdldFNjb3BlZFRhYkRhdGFTdG9yYWdlS2V5LFxuICBzZXNzaW9uQXdhcmVGZXRjaCxcbiAgY3JlYXRlU2Vzc2lvbixcbiAgZmV0Y2hTdGF0dXMsXG4gIGZldGNoU2V0dGluZ3MsIHVwZGF0ZVNldHRpbmdzLFxufTtcblxuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvZmV0Y2gtdXRpbHMuanNcbiAqIEdsb2JhbCBmZXRjaCBpbnRlcmNlcHRvciwgNDA5LWNvbmZsaWN0IHJldHJ5IHF1ZXVlLCBMTE0gYnVzeSBvdmVybGF5LCBhbmRcbiAqIHRoZSBzZXRMb2FkaW5nIGhlbHBlciB0aGF0IGRyaXZlcyBidXR0b25zL3Byb2dyZXNzIGJhci9hYm9ydCBjb250cm9sbGVyLlxuICpcbiAqIERFUEVOREVOQ0lFUzogdWktY29yZS5qcyBleHBvcnRzICh0cmFwRm9jdXMgZXRjLikgYXZhaWxhYmxlIG9uIGdsb2JhbFRoaXMuXG4gKiAgICAgICAgICAgICAgIHNldExvYWRpbmcgY2FsbHMgX3VwZGF0ZUxMTU92ZXJsYXkgKGRlZmluZWQgaGVyZSkgYW5kXG4gKiAgICAgICAgICAgICAgIGFwcGVuZE1lc3NhZ2UgKGRlZmluZWQgaW4gbWVzc2FnZS1xdWV1ZS5qcywgb24gZ2xvYmFsVGhpcykuXG4gKi9cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyA0MDkgQ29uZmxpY3QgcmV0cnkgcXVldWVcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5jb25zdCBfY29uZmxpY3RSZXRyeVF1ZXVlID0gW107XG5sZXQgICBfY29uZmxpY3RUaW1lcklkICAgID0gbnVsbDtcbmxldCAgIF9jb25mbGljdENvdW50ZG93biAgPSAwO1xuXG4vKiogUmV0dXJuIHRydWUgaWYgdGhpcyByZXF1ZXN0IHNob3VsZCBiZSBpbnRlcmNlcHRlZCBieSB0aGUgNDA5IGhhbmRsZXIuICovXG5mdW5jdGlvbiBfc2hvdWxkSGFuZGxlQnVzeUNvbmZsaWN0KGFyZ3MpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCByYXdVcmwgPSB0eXBlb2YgYXJnc1swXSA9PT0gJ3N0cmluZycgPyBhcmdzWzBdIDogYXJnc1swXT8udXJsO1xuICAgIGlmICghcmF3VXJsKSByZXR1cm4gdHJ1ZTtcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHJhd1VybCwgd2luZG93LmxvY2F0aW9uLm9yaWdpbik7XG4gICAgcmV0dXJuIHVybC5wYXRobmFtZSAhPT0gJy9hcGkvc2Vzc2lvbnMvY2xhaW0nICYmIHVybC5wYXRobmFtZSAhPT0gJy9hcGkvc2Vzc2lvbnMvdGFrZW92ZXInO1xuICB9IGNhdGNoIChfKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBIYW5kbGUgYSA0MDkgQ29uZmxpY3QgcmVzcG9uc2U6IHNob3cgdGhlIGFtYmVyIGJhbm5lciBhbmQgYXdhaXQgdXNlciBjaG9pY2UuXG4gKiBSZXR1cm5zIGEgUHJvbWlzZTxib29sZWFuPiBcdTIwMTQgdHJ1ZSBtZWFucyBcInJldHJ5XCIsIGZhbHNlIG1lYW5zIFwiZGlzbWlzc1wiLlxuICogQ2FsbGVkIGZyb20gYXBpLWNsaWVudC5qcyBpbnNpZGUgc2Vzc2lvbkF3YXJlRmV0Y2ggc28gdGhlIGZ1bGwgZmV0Y2ggcGlwZWxpbmVcbiAqIGlzIG93bmVkIGJ5IGEgc2luZ2xlIG1vZHVsZS1sZXZlbCB3aW5kb3cuZmV0Y2ggYXNzaWdubWVudCB0aGVyZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xSZXF1ZXN0fSBpbnB1dCAtIFRoZSByZXF1ZXN0IFVSTC9vYmplY3QgKHVzZWQgZm9yIHBhdGggZmlsdGVyaW5nKS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBpbml0IC0gVGhlIGZldGNoIGluaXQgb3B0aW9ucy5cbiAqIEBwYXJhbSB7UmVzcG9uc2V9IFtyZXNwb25zZV0gLSBUaGUgNDA5IHJlc3BvbnNlICh1c2VkIHRvIGNoZWNrIGNvbmZsaWN0X3R5cGUpLlxuICovXG5hc3luYyBmdW5jdGlvbiBoYW5kbGU0MDlDb25mbGljdChpbnB1dCwgaW5pdCwgcmVzcG9uc2UpIHtcbiAgaWYgKCFfc2hvdWxkSGFuZGxlQnVzeUNvbmZsaWN0KFtpbnB1dCwgaW5pdF0pKSByZXR1cm4gZmFsc2U7XG4gIGlmIChyZXNwb25zZSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBib2R5ID0gYXdhaXQgcmVzcG9uc2UuY2xvbmUoKS5qc29uKCk7XG4gICAgICBpZiAoYm9keSAmJiBib2R5LmNvbmZsaWN0X3R5cGUgJiYgYm9keS5jb25mbGljdF90eXBlICE9PSAnc2Vzc2lvbl9vd25lcnNoaXAnKSByZXR1cm4gZmFsc2U7XG4gICAgfSBjYXRjaCAoXykgeyAvKiBub24tSlNPTiBib2R5IFx1MjAxNCBwcm9jZWVkIHRvIGJhbm5lciAqLyB9XG4gIH1cbiAgc2hvd1Nlc3Npb25Db25mbGljdEJhbm5lcigpO1xuICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBfY29uZmxpY3RSZXRyeVF1ZXVlLnB1c2gocmVzb2x2ZSkpO1xufVxuXG5mdW5jdGlvbiBzaG93U2Vzc2lvbkNvbmZsaWN0QmFubmVyKCkge1xuICBjb25zdCBiYW5uZXIgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXNzaW9uLWNvbmZsaWN0LWJhbm5lcicpO1xuICBjb25zdCBiYW5uZXJUZXh0ICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb25mbGljdC1iYW5uZXItdGV4dCcpO1xuICBjb25zdCBjb3VudGRvd25FbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb25mbGljdC1jb3VudGRvd24nKTtcbiAgaWYgKCFiYW5uZXIpIHJldHVybjtcbiAgYmFubmVyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICBpZiAoX2NvbmZsaWN0VGltZXJJZCkgeyBjbGVhckludGVydmFsKF9jb25mbGljdFRpbWVySWQpOyBfY29uZmxpY3RUaW1lcklkID0gbnVsbDsgfVxuICBfY29uZmxpY3RDb3VudGRvd24gPSAzMDtcbiAgaWYgKGJhbm5lclRleHQpICBiYW5uZXJUZXh0LnRleHRDb250ZW50ICA9ICdcdTI2QTAgQW5vdGhlciBvcGVyYXRpb24gaXMgaW4gcHJvZ3Jlc3MuIEF1dG8tcmV0cnlpbmcgaW4gJztcbiAgaWYgKGNvdW50ZG93bkVsKSBjb3VudGRvd25FbC50ZXh0Q29udGVudCA9IGAke19jb25mbGljdENvdW50ZG93bn1zXHUyMDI2YDtcbiAgX2NvbmZsaWN0VGltZXJJZCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICBfY29uZmxpY3RDb3VudGRvd24tLTtcbiAgICBpZiAoX2NvbmZsaWN0Q291bnRkb3duIDw9IDApIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwoX2NvbmZsaWN0VGltZXJJZCk7IF9jb25mbGljdFRpbWVySWQgPSBudWxsO1xuICAgICAgY29uZmxpY3RSZXRyeU5vdygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY291bnRkb3duRWwpIGNvdW50ZG93bkVsLnRleHRDb250ZW50ID0gYCR7X2NvbmZsaWN0Q291bnRkb3dufXNcdTIwMjZgO1xuICAgIH1cbiAgfSwgMTAwMCk7XG59XG5cbmZ1bmN0aW9uIGNvbmZsaWN0UmV0cnlOb3coKSB7XG4gIGlmIChfY29uZmxpY3RUaW1lcklkKSB7IGNsZWFySW50ZXJ2YWwoX2NvbmZsaWN0VGltZXJJZCk7IF9jb25mbGljdFRpbWVySWQgPSBudWxsOyB9XG4gIGNvbnN0IGJhbm5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXNzaW9uLWNvbmZsaWN0LWJhbm5lcicpO1xuICBpZiAoYmFubmVyKSBiYW5uZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgd2hpbGUgKF9jb25mbGljdFJldHJ5UXVldWUubGVuZ3RoKSBfY29uZmxpY3RSZXRyeVF1ZXVlLnNoaWZ0KCkodHJ1ZSk7XG59XG5cbmZ1bmN0aW9uIGNvbmZsaWN0RGlzbWlzcygpIHtcbiAgaWYgKF9jb25mbGljdFRpbWVySWQpIHsgY2xlYXJJbnRlcnZhbChfY29uZmxpY3RUaW1lcklkKTsgX2NvbmZsaWN0VGltZXJJZCA9IG51bGw7IH1cbiAgY29uc3QgYmFubmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Nlc3Npb24tY29uZmxpY3QtYmFubmVyJyk7XG4gIGlmIChiYW5uZXIpIGJhbm5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICB3aGlsZSAoX2NvbmZsaWN0UmV0cnlRdWV1ZS5sZW5ndGgpIF9jb25mbGljdFJldHJ5UXVldWUuc2hpZnQoKShmYWxzZSk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gTExNIGZldGNoIHdyYXBwZXIgKGF0dGFjaGVzIGFib3J0IHNpZ25hbClcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiBsbG1GZXRjaCh1cmwsIG9wdGlvbnMgPSB7fSkge1xuICBpZiAod2luZG93Ll9jdXJyZW50QWJvcnRDb250cm9sbGVyKSB7XG4gICAgb3B0aW9ucy5zaWduYWwgPSB3aW5kb3cuX2N1cnJlbnRBYm9ydENvbnRyb2xsZXIuc2lnbmFsO1xuICB9XG4gIHJldHVybiBmZXRjaCh1cmwsIG9wdGlvbnMpO1xufVxuXG5mdW5jdGlvbiBhYm9ydEN1cnJlbnRSZXF1ZXN0KCkge1xuICBpZiAod2luZG93Ll9jdXJyZW50QWJvcnRDb250cm9sbGVyKSB7XG4gICAgd2luZG93Ll9jdXJyZW50QWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gICAgd2luZG93Ll9jdXJyZW50QWJvcnRDb250cm9sbGVyID0gbnVsbDtcbiAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICBpZiAodHlwZW9mIGFwcGVuZE1lc3NhZ2UgPT09ICdmdW5jdGlvbicpIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsICdcdTIzRjkgUmVxdWVzdCBzdG9wcGVkLicpO1xuICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gTExNIGJ1c3kgb3ZlcmxheVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmxldCBfbGxtRWxhcHNlZFRpbWVyID0gbnVsbDtcbmxldCBfbGxtU3RhcnRUaW1lICAgID0gbnVsbDtcblxuZnVuY3Rpb24gX3VwZGF0ZUxMTU92ZXJsYXkobG9hZGluZywgbGFiZWwpIHtcbiAgY29uc3Qgb3ZlcmxheSAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtLWJ1c3ktb3ZlcmxheScpO1xuICBjb25zdCBsYWJlbEVsICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG0tYnVzeS1sYWJlbCcpO1xuICBjb25zdCBlbGFwc2VkICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG0tYnVzeS1lbGFwc2VkJyk7XG4gIGlmICghb3ZlcmxheSkgcmV0dXJuO1xuXG4gIGlmIChsb2FkaW5nKSB7XG4gICAgb3ZlcmxheS5jbGFzc0xpc3QuYWRkKCd2aXNpYmxlJyk7XG4gICAgb3ZlcmxheS5jbGFzc0xpc3QucmVtb3ZlKCdzbG93Jyk7XG4gICAgaWYgKGxhYmVsRWwpIGxhYmVsRWwudGV4dENvbnRlbnQgPSBsYWJlbCB8fCAnUmVhc29uaW5nXHUyMDI2JztcbiAgICBpZiAoZWxhcHNlZCkgIGVsYXBzZWQudGV4dENvbnRlbnQgPSAnMDowMCc7XG5cbiAgICBfbGxtU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBjbGVhckludGVydmFsKF9sbG1FbGFwc2VkVGltZXIpO1xuICAgIF9sbG1FbGFwc2VkVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICBjb25zdCBzZWNzID0gTWF0aC5mbG9vcigoRGF0ZS5ub3coKSAtIF9sbG1TdGFydFRpbWUpIC8gMTAwMCk7XG4gICAgICBjb25zdCBtbSA9IFN0cmluZyhNYXRoLmZsb29yKHNlY3MgLyA2MCkpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgICBjb25zdCBzcyA9IFN0cmluZyhzZWNzICUgNjApLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgICBpZiAoZWxhcHNlZCkgZWxhcHNlZC50ZXh0Q29udGVudCA9IGAke21tfToke3NzfWA7XG4gICAgICBpZiAoc2VjcyA+PSAzMCAmJiAhb3ZlcmxheS5jbGFzc0xpc3QuY29udGFpbnMoJ3Nsb3cnKSkge1xuICAgICAgICBvdmVybGF5LmNsYXNzTGlzdC5hZGQoJ3Nsb3cnKTtcbiAgICAgIH1cbiAgICB9LCAxMDAwKTtcbiAgfSBlbHNlIHtcbiAgICBjbGVhckludGVydmFsKF9sbG1FbGFwc2VkVGltZXIpO1xuICAgIF9sbG1FbGFwc2VkVGltZXIgPSBudWxsO1xuICAgIF9sbG1TdGFydFRpbWUgICAgPSBudWxsO1xuICAgIG92ZXJsYXkuY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZScsICdzbG93Jyk7XG4gICAgaWYgKGxhYmVsRWwpIGxhYmVsRWwudGV4dENvbnRlbnQgPSAnUmVhc29uaW5nXHUyMDI2JztcbiAgICBpZiAoZWxhcHNlZCkgIGVsYXBzZWQudGV4dENvbnRlbnQgPSAnMDowMCc7XG4gICAgX3JlZnJlc2hDb250ZXh0U3RhdHMoKTtcbiAgfVxufVxuXG4vLyBCYWNrd2FyZCBjb21wYXRpYmlsaXR5IGZvciB0ZXN0cy9pbXBvcnRzIHRoYXQgc3RpbGwgcmVmZXJlbmNlIHRoZSBvbGQgbmFtZS5cbmZ1bmN0aW9uIF91cGRhdGVMTE1TdGF0dXNCYXIobG9hZGluZywgbGFiZWwpIHtcbiAgX3VwZGF0ZUxMTU92ZXJsYXkobG9hZGluZywgbGFiZWwpO1xuXG4gIGNvbnN0IGJhciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG0tc3RhdHVzLWJhcicpO1xuICBjb25zdCB0aGlua2luZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG0tdGhpbmtpbmcnKTtcbiAgY29uc3Qgc3RlcExhYmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbS1zdGVwLWxhYmVsJyk7XG4gIGNvbnN0IGFib3J0QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbS1hYm9ydC1idG4nKTtcbiAgaWYgKCFiYXIpIHJldHVybjtcblxuICBpZiAobG9hZGluZykge1xuICAgIGJhci5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICAgIGlmICh0aGlua2luZykgdGhpbmtpbmcuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICBpZiAoc3RlcExhYmVsKSBzdGVwTGFiZWwudGV4dENvbnRlbnQgPSBsYWJlbCB8fCAnUmVhc29uaW5nXHUyMDI2JztcbiAgICBpZiAoYWJvcnRCdG4pIHtcbiAgICAgIGFib3J0QnRuLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIGFib3J0QnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmICh0aGlua2luZykgdGhpbmtpbmcuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBpZiAoYWJvcnRCdG4pIGFib3J0QnRuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgYmFyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gX3JlZnJlc2hDb250ZXh0U3RhdHMoKSB7XG4gIGNvbnN0IHRva2VuRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtLXRva2VuLWNvdW50Jyk7XG4gIGlmICghdG9rZW5FbCkgcmV0dXJuO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9jb250ZXh0LXN0YXRzJyk7XG4gICAgaWYgKCFyZXMub2spIHJldHVybjtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoIWRhdGEub2spIHJldHVybjtcbiAgICBjb25zdCBlc3QgICAgPSBkYXRhLmVzdGltYXRlZF90b2tlbnMgfHwgMDtcbiAgICBjb25zdCB3aW4gICAgPSBkYXRhLmNvbnRleHRfd2luZG93ICAgfHwgMTI4XzAwMDtcbiAgICBjb25zdCBleGFjdCAgPSBkYXRhLnRva2VuX3NvdXJjZSA9PT0gJ2V4YWN0JztcbiAgICBjb25zdCBwY3QgICAgPSBNYXRoLnJvdW5kKChlc3QgLyB3aW4pICogMTAwKTtcbiAgICBjb25zdCBlc3RTdHIgPSBlc3QgPj0gMTAwMCA/IGAkeyhlc3QgLyAxMDAwKS50b0ZpeGVkKDEpfUtgIDogYCR7ZXN0fWA7XG4gICAgY29uc3Qgd2luU3RyID0gd2luID49IDEwMDAgPyBgJHtNYXRoLnJvdW5kKHdpbiAvIDEwMDApfUtgICA6IGAke3dpbn1gO1xuICAgIHRva2VuRWwudGV4dENvbnRlbnQgPSBgJHtleGFjdCA/ICcnIDogJ34nfSR7ZXN0U3RyfSAvICR7d2luU3RyfSAoJHtwY3R9JSlgO1xuICB9IGNhdGNoIChfKSB7IC8qIHNpbGVudGx5IGlnbm9yZSAqLyB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gTG9hZGluZyBzdGF0ZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIHNldExvYWRpbmcobG9hZGluZywgbGFiZWwpIHtcbiAgaWYgKHR5cGVvZiBzdGF0ZU1hbmFnZXIgIT09ICd1bmRlZmluZWQnICYmIHN0YXRlTWFuYWdlcj8uc2V0TG9hZGluZykge1xuICAgIHN0YXRlTWFuYWdlci5zZXRMb2FkaW5nKGxvYWRpbmcpO1xuICB9XG5cbiAgaWYgKGxvYWRpbmcpIHtcbiAgICB3aW5kb3cuX2N1cnJlbnRBYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgLy8gRXhwYW5kIGNoYXQgcGFuZWwgaWYgY29sbGFwc2VkXG4gICAgY29uc3QgY2hhdEFyZWEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2hhdC1hcmVhJyk7XG4gICAgY29uc3Qgdmlld2VyQXJlYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2aWV3ZXItYXJlYScpO1xuICAgIGNvbnN0IHRvZ2dsZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2dnbGUtY2hhdCcpO1xuICAgIGlmIChjaGF0QXJlYT8uY2xhc3NMaXN0LmNvbnRhaW5zKCdjb2xsYXBzZWQnKSkge1xuICAgICAgY2hhdEFyZWEuY2xhc3NMaXN0LnJlbW92ZSgnY29sbGFwc2VkJyk7XG4gICAgICB2aWV3ZXJBcmVhPy5jbGFzc0xpc3QucmVtb3ZlKCdleHBhbmRlZCcpO1xuICAgICAgaWYgKHRvZ2dsZUJ0bikgdG9nZ2xlQnRuLnRleHRDb250ZW50ID0gJ1x1MjVDMCc7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHdpbmRvdy5fY3VycmVudEFib3J0Q29udHJvbGxlciA9IG51bGw7XG4gIH1cblxuICBfdXBkYXRlTExNU3RhdHVzQmFyKGxvYWRpbmcsIGxhYmVsKTtcblxuICAvLyBPbmx5IGRpc2FibGUgYnV0dG9ucyBpbnNpZGUgdGhlIGNoYXQvaW50ZXJhY3Rpb24gYXJlYSBcdTIwMTQgbm90IHRoZSB3aG9sZSBwYWdlLlxuICBjb25zdCBjaGF0QXJlYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaGF0LWFyZWEnKTtcbiAgY29uc3Qgc2NvcGUgPSBjaGF0QXJlYSB8fCBkb2N1bWVudDtcbiAgc2NvcGUucXVlcnlTZWxlY3RvckFsbCgnYnV0dG9uJykuZm9yRWFjaChidG4gPT4geyBidG4uZGlzYWJsZWQgPSBsb2FkaW5nOyB9KTtcbiAgY29uc3Qgc3RvcEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG0tYnVzeS1zdG9wJyk7XG4gIGlmIChzdG9wQnRuKSBzdG9wQnRuLmRpc2FibGVkID0gZmFsc2U7XG5cbiAgbGV0IGJhciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2FkaW5nLXByb2dyZXNzLWJhcicpO1xuICBpZiAobG9hZGluZykge1xuICAgIGlmICghYmFyKSB7XG4gICAgICBiYXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGJhci5pZCA9ICdsb2FkaW5nLXByb2dyZXNzLWJhcic7XG4gICAgICBkb2N1bWVudC5ib2R5LnByZXBlbmQoYmFyKTtcbiAgICB9XG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHsgYmFyLnN0eWxlLndpZHRoID0gJzcwJSc7IH0pO1xuICAgIGlmIChsYWJlbCkgYmFyLnRpdGxlID0gbGFiZWw7XG4gIH0gZWxzZSB7XG4gICAgaWYgKGJhcikge1xuICAgICAgYmFyLnN0eWxlLndpZHRoID0gJzEwMCUnO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiBiYXIucmVtb3ZlKCksIDQwMCk7XG4gICAgfVxuICB9XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnN0ZXAuYWN0aXZlJykuZm9yRWFjaChlbCA9PiB7XG4gICAgZWwuY2xhc3NMaXN0LnRvZ2dsZSgnbG9hZGluZy1zdGVwJywgbG9hZGluZyk7XG4gIH0pO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgRVMgbW9kdWxlIGV4cG9ydHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5leHBvcnQge1xuICBoYW5kbGU0MDlDb25mbGljdCxcbiAgc2hvd1Nlc3Npb25Db25mbGljdEJhbm5lciwgY29uZmxpY3RSZXRyeU5vdywgY29uZmxpY3REaXNtaXNzLFxuICBsbG1GZXRjaCwgYWJvcnRDdXJyZW50UmVxdWVzdCxcbiAgX3VwZGF0ZUxMTVN0YXR1c0JhcixcbiAgX3VwZGF0ZUxMTU92ZXJsYXksIF9yZWZyZXNoQ29udGV4dFN0YXRzLFxuICBzZXRMb2FkaW5nLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogc3RhdGUtbWFuYWdlci5qc1xuICogTWFuYWdlcyBzZXNzaW9uIHN0YXRlLCBsb2NhbFN0b3JhZ2UgcGVyc2lzdGVuY2UsIGFuZCBzdGF0ZSBpbml0aWFsaXphdGlvbi5cbiAqIENlbnRyYWxpemVzIGFsbCBzdGF0ZSBtYW5hZ2VtZW50IGxvZ2ljIChjdXJyZW50VGFiLCBpbnRlcmFjdGl2ZVN0YXRlLCBzZXNzaW9uSWQsIGV0Yy4pXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdzdGF0ZS1tYW5hZ2VyJyk7XG5cbmltcG9ydCB7IFN0b3JhZ2VLZXlzIH0gZnJvbSAnLi9hcGktY2xpZW50LmpzJztcblxuLyoqXG4gKiBNaXJyb3Igb2YgdGhlIFB5dGhvbiBQaGFzZSBlbnVtIGluIHNjcmlwdHMvdXRpbHMvY29udmVyc2F0aW9uX21hbmFnZXIucHkuXG4gKiBQeXRob24gaXMgdGhlIFNPVVJDRSBPRiBUUlVUSCBcdTIwMTQgdXBkYXRlIGJvdGggZmlsZXMgdG9nZXRoZXIgd2hlbmV2ZXIgYWRkaW5nXG4gKiBvciByZW5hbWluZyBhIHBoYXNlLlxuICovXG5jb25zdCBQSEFTRVMgPSB7XG4gIElOSVQ6ICAgICAgICAgICAgICdpbml0JyxcbiAgSk9CX0FOQUxZU0lTOiAgICAgJ2pvYl9hbmFseXNpcycsXG4gIENVU1RPTUlaQVRJT046ICAgICdjdXN0b21pemF0aW9uJyxcbiAgUkVXUklURV9SRVZJRVc6ICAgJ3Jld3JpdGVfcmV2aWV3JyxcbiAgU1BFTExfQ0hFQ0s6ICAgICAgJ3NwZWxsX2NoZWNrJyxcbiAgR0VORVJBVElPTjogICAgICAgJ2dlbmVyYXRpb24nLFxuICBMQVlPVVRfUkVWSUVXOiAgICAnbGF5b3V0X3JldmlldycsXG4gIEZJTkFMX0dFTkVSQVRJT046ICdmaW5hbF9nZW5lcmF0aW9uJyxcbiAgUkVGSU5FTUVOVDogICAgICAgJ3JlZmluZW1lbnQnLFxufTtcblxuY29uc3QgUEhBU0VfVE9fU1RFUCA9IHtcbiAgW1BIQVNFUy5JTklUXTogICAgICAgICAgICAgJ2pvYicsXG4gIFtQSEFTRVMuSk9CX0FOQUxZU0lTXTogICAgICdhbmFseXNpcycsXG4gIFtQSEFTRVMuQ1VTVE9NSVpBVElPTl06ICAgICdjdXN0b21pemF0aW9ucycsXG4gIFtQSEFTRVMuUkVXUklURV9SRVZJRVddOiAgICdyZXdyaXRlJyxcbiAgW1BIQVNFUy5TUEVMTF9DSEVDS106ICAgICAgJ3NwZWxsJyxcbiAgW1BIQVNFUy5HRU5FUkFUSU9OXTogICAgICAgJ2xheW91dCcsXG4gIFtQSEFTRVMuTEFZT1VUX1JFVklFV106ICAgICdsYXlvdXQnLFxuICBbUEhBU0VTLkZJTkFMX0dFTkVSQVRJT05dOiAnZG93bmxvYWQnLFxuICBbUEhBU0VTLlJFRklORU1FTlRdOiAgICAgICAnZG93bmxvYWQnLFxufTtcblxuZnVuY3Rpb24gZ2V0V29ya2Zsb3dTdGVwRm9yUGhhc2UocGhhc2UpIHtcbiAgcmV0dXJuIFBIQVNFX1RPX1NURVBbcGhhc2VdIHx8ICdqb2InO1xufVxuXG4vKipcbiAqIFN0YWdlZCBnZW5lcmF0aW9uIHdvcmtmbG93IHBoYXNlcyAoR0FQLTIwIGltcGxlbWVudGF0aW9uKS5cbiAqIFRoZXNlIHRyYWNrIHRoZSBwcmV2aWV3L2xheW91dCByZXZpZXcgXHUyMTkyIGNvbmZpcm1lZCBcdTIxOTIgZmluYWwgcGlwZWxpbmVcbiAqIGluZGVwZW5kZW50bHkgb2YgdGhlIG1haW4gY29udmVyc2F0aW9uIFBIQVNFUyBhYm92ZS5cbiAqIEJhY2tlbmQgc291cmNlIG9mIHRydXRoIGlzIHNlc3Npb25fZGF0YVsnZ2VuZXJhdGlvbl9zdGF0ZSddWydwaGFzZSddLlxuICovXG5jb25zdCBHRU5FUkFUSU9OX1BIQVNFUyA9IHtcbiAgSURMRTogICAgICAgICAgICdpZGxlJyxcbiAgTEFZT1VUX1JFVklFVzogICdsYXlvdXRfcmV2aWV3JyxcbiAgQ09ORklSTUVEOiAgICAgICdjb25maXJtZWQnLFxuICBGSU5BTF9DT01QTEVURTogJ2ZpbmFsX2NvbXBsZXRlJyxcbn07XG5cbmNvbnN0IEdFTkVSQVRJT05fU1RBVEVfRVZFTlQgPSAnY3ZidWlsZGVyOmdlbmVyYXRpb24tc3RhdGUtY2hhbmdlZCc7XG5cbmZ1bmN0aW9uIGNyZWF0ZURlZmF1bHRHZW5lcmF0aW9uU3RhdGUoKSB7XG4gIHJldHVybiB7XG4gICAgcGhhc2U6IEdFTkVSQVRJT05fUEhBU0VTLklETEUsXG4gICAgcHJldmlld0F2YWlsYWJsZTogZmFsc2UsXG4gICAgcHJldmlld091dHB1dHM6IG51bGwsXG4gICAgbGF5b3V0Q29uZmlybWVkOiBmYWxzZSxcbiAgICBwYWdlQ291bnRFc3RpbWF0ZTogbnVsbCxcbiAgICBwYWdlQ291bnRFeGFjdDogbnVsbCxcbiAgICBwYWdlQ291bnRDb25maWRlbmNlOiBudWxsLFxuICAgIHBhZ2VDb3VudFNvdXJjZTogbnVsbCxcbiAgICBwYWdlTmVlZHNFeGFjdFJlY2hlY2s6IGZhbHNlLFxuICAgIHBhZ2VXYXJuaW5nOiBmYWxzZSxcbiAgICBsYXlvdXRJbnN0cnVjdGlvbnNDb3VudDogMCxcbiAgICBmaW5hbEdlbmVyYXRlZEF0OiBudWxsLFxuICAgIHByZXZpZXdHZW5lcmF0ZWRBdDogbnVsbCxcbiAgICBwcmV2aWV3UmVxdWVzdElkOiBudWxsLFxuICAgIGNvbmZpcm1lZEF0OiBudWxsLFxuICAgIGNvbnRlbnRSZXZpc2lvbjogMCxcbiAgICBsYXN0UHJldmlld0NvbnRlbnRSZXZpc2lvbjogbnVsbCxcbiAgICBsYXN0RmluYWxDb250ZW50UmV2aXNpb246IG51bGwsXG4gICAgZGlydHlQaGFzZXM6IFtdLFxuICAgIGVhcmxpZXN0RGlydHlTdGVwOiBudWxsLFxuICB9O1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVSZXZpc2lvbih2YWx1ZSkge1xuICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHZhbHVlKSA/IHZhbHVlIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0TGFzdFJlbmRlcmVkQ29udGVudFJldmlzaW9uKHN0YXRlKSB7XG4gIGNvbnN0IHJldmlzaW9ucyA9IFtcbiAgICBub3JtYWxpemVSZXZpc2lvbihzdGF0ZS5sYXN0UHJldmlld0NvbnRlbnRSZXZpc2lvbiksXG4gICAgbm9ybWFsaXplUmV2aXNpb24oc3RhdGUubGFzdEZpbmFsQ29udGVudFJldmlzaW9uKSxcbiAgXS5maWx0ZXIodmFsdWUgPT4gdmFsdWUgIT09IG51bGwpO1xuICByZXR1cm4gcmV2aXNpb25zLmxlbmd0aCA+IDAgPyBNYXRoLm1heCguLi5yZXZpc2lvbnMpIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVTZXNzaW9uSWQoKSB7XG4gIGNvbnN0IGNyeXB0b0FwaSA9IGdsb2JhbFRoaXMuY3J5cHRvO1xuICBpZiAoY3J5cHRvQXBpPy5yYW5kb21VVUlEKSB7XG4gICAgcmV0dXJuIGBzZXNzaW9uLSR7Y3J5cHRvQXBpLnJhbmRvbVVVSUQoKX1gO1xuICB9XG5cbiAgaWYgKGNyeXB0b0FwaT8uZ2V0UmFuZG9tVmFsdWVzKSB7XG4gICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheSgxNik7XG4gICAgY3J5cHRvQXBpLmdldFJhbmRvbVZhbHVlcyhieXRlcyk7XG4gICAgY29uc3QgdG9rZW4gPSBBcnJheS5mcm9tKGJ5dGVzLCBieXRlID0+IGJ5dGUudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJykpLmpvaW4oJycpO1xuICAgIHJldHVybiBgc2Vzc2lvbi0ke3Rva2VufWA7XG4gIH1cblxuICBsb2cud2FybignV2ViIENyeXB0byBBUEkgdW5hdmFpbGFibGU7IGZhbGxpbmcgYmFjayB0byB0aW1lc3RhbXAtcGx1cy1yYW5kb20gc2Vzc2lvbiBpZCBnZW5lcmF0aW9uLicpO1xuICByZXR1cm4gYHNlc3Npb24tJHtEYXRlLm5vdygpLnRvU3RyaW5nKDM2KX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCAxMSl9YDtcbn1cblxuZnVuY3Rpb24gZ2V0TGF5b3V0RnJlc2huZXNzRnJvbVN0YXRlKHN0YXRlKSB7XG4gIGNvbnN0IHByZXZpZXdBdmFpbGFibGUgPSBCb29sZWFuKHN0YXRlLnByZXZpZXdBdmFpbGFibGUpO1xuICBjb25zdCBoYXNGaW5hbE91dHB1dHMgPSBCb29sZWFuKFxuICAgIHN0YXRlLmZpbmFsR2VuZXJhdGVkQXRcbiAgICAgIHx8IHN0YXRlLnBoYXNlID09PSBHRU5FUkFUSU9OX1BIQVNFUy5GSU5BTF9DT01QTEVURVxuICAgICAgfHwgbm9ybWFsaXplUmV2aXNpb24oc3RhdGUubGFzdEZpbmFsQ29udGVudFJldmlzaW9uKSAhPT0gbnVsbFxuICApO1xuXG4gIGlmICghcHJldmlld0F2YWlsYWJsZSkge1xuICAgIHJldHVybiB7XG4gICAgICBzaG93Q2hpcDogZmFsc2UsXG4gICAgICBpc1N0YWxlOiBmYWxzZSxcbiAgICAgIGlzQ3JpdGljYWw6IGZhbHNlLFxuICAgICAgaGFzRmluYWxPdXRwdXRzLFxuICAgICAgbGFiZWw6ICcnLFxuICAgICAgYXJpYUxhYmVsOiAnJyxcbiAgICAgIHRvbmU6ICdoaWRkZW4nLFxuICAgIH07XG4gIH1cblxuICBjb25zdCBjb250ZW50UmV2aXNpb24gPSBub3JtYWxpemVSZXZpc2lvbihzdGF0ZS5jb250ZW50UmV2aXNpb24pID8/IDA7XG4gIGNvbnN0IGxhc3RSZW5kZXJlZFJldmlzaW9uID0gZ2V0TGFzdFJlbmRlcmVkQ29udGVudFJldmlzaW9uKHN0YXRlKTtcbiAgY29uc3QgaXNTdGFsZSA9IGxhc3RSZW5kZXJlZFJldmlzaW9uICE9PSBudWxsICYmIGNvbnRlbnRSZXZpc2lvbiA+IGxhc3RSZW5kZXJlZFJldmlzaW9uO1xuICBjb25zdCBpc0NyaXRpY2FsID0gaXNTdGFsZSAmJiBoYXNGaW5hbE91dHB1dHM7XG5cbiAgaWYgKGlzQ3JpdGljYWwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2hvd0NoaXA6IHRydWUsXG4gICAgICBpc1N0YWxlLFxuICAgICAgaXNDcml0aWNhbCxcbiAgICAgIGhhc0ZpbmFsT3V0cHV0cyxcbiAgICAgIGxhYmVsOiAnRmlsZXMgb3V0ZGF0ZWQnLFxuICAgICAgYXJpYUxhYmVsOiAnRmlsZXMgb3V0ZGF0ZWQuIEFjdGl2YXRlIHRvIHJldmlldyBsYXlvdXQgYW5kIHJlZ2VuZXJhdGUgb3V0cHV0cy4nLFxuICAgICAgdG9uZTogJ2NyaXRpY2FsJyxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGlzU3RhbGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2hvd0NoaXA6IHRydWUsXG4gICAgICBpc1N0YWxlLFxuICAgICAgaXNDcml0aWNhbCxcbiAgICAgIGhhc0ZpbmFsT3V0cHV0cyxcbiAgICAgIGxhYmVsOiAnTGF5b3V0IG91dGRhdGVkJyxcbiAgICAgIGFyaWFMYWJlbDogJ0xheW91dCBvdXRkYXRlZC4gQWN0aXZhdGUgdG8gcmV2aWV3IGFuZCByZWdlbmVyYXRlIHByZXZpZXcuJyxcbiAgICAgIHRvbmU6ICdzdGFsZScsXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc2hvd0NoaXA6IHRydWUsXG4gICAgaXNTdGFsZSxcbiAgICBpc0NyaXRpY2FsLFxuICAgIGhhc0ZpbmFsT3V0cHV0cyxcbiAgICBsYWJlbDogJ0xheW91dCBjdXJyZW50JyxcbiAgICBhcmlhTGFiZWw6ICdMYXlvdXQgY3VycmVudC4gUHJldmlldyBtYXRjaGVzIGxhdGVzdCBjb250ZW50LicsXG4gICAgdG9uZTogJ2ZyZXNoJyxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZW1pdEdlbmVyYXRpb25TdGF0ZUNoYW5nZWQoKSB7XG4gIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2Ygd2luZG93LmRpc3BhdGNoRXZlbnQgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KEdFTkVSQVRJT05fU1RBVEVfRVZFTlQsIHtcbiAgICBkZXRhaWw6IHtcbiAgICAgIGdlbmVyYXRpb25TdGF0ZTogeyAuLi5nZW5lcmF0aW9uU3RhdGUgfSxcbiAgICAgIGxheW91dEZyZXNobmVzczogZ2V0TGF5b3V0RnJlc2huZXNzRnJvbVN0YXRlKGdlbmVyYXRpb25TdGF0ZSksXG4gICAgfSxcbiAgfSkpO1xufVxuXG4vLyBHbG9iYWwgc3RhdGUgdmFyaWFibGVzIChtb3ZlZCBpbnRvIG1vZHVsZSBmb3IgY2xhcml0eSlcbmxldCBjdXJyZW50VGFiID0gJ2pvYic7XG5sZXQgaXNMb2FkaW5nID0gZmFsc2U7XG5sZXQgdGFiRGF0YSA9IHtcbiAgYW5hbHlzaXM6IG51bGwsXG4gIGN1c3RvbWl6YXRpb25zOiBudWxsLFxuICBjdjogbnVsbFxufTtcbmxldCBpbnRlcmFjdGl2ZVN0YXRlID0ge1xuICBpc1Jldmlld2luZzogZmFsc2UsXG4gIGN1cnJlbnRJbmRleDogMCxcbiAgdHlwZTogbnVsbCwgLy8gJ2V4cGVyaWVuY2VzJyBvciAnc2tpbGxzJ1xuICBkYXRhOiBudWxsXG59O1xubGV0IHNlc3Npb25JZCA9IG51bGw7XG5sZXQgbGFzdEtub3duUGhhc2UgPSBQSEFTRVMuSU5JVDtcbmxldCBpc1JlY29ubmVjdGluZyA9IGZhbHNlO1xuY29uc3QgX3BoYXNlQ2hhbmdlTGlzdGVuZXJzID0gW107XG4vLyBDdXJyZW50IG1vZGVsL3Byb3ZpZGVyIHNlbGVjdGlvbiAocGVyc2lzdGVkIHRvIGxvY2FsU3RvcmFnZSlcbmxldCBjdXJyZW50TW9kZWxQcm92aWRlciA9IG51bGw7XG5sZXQgY3VycmVudE1vZGVsTmFtZSA9IG51bGw7XG5cblxuLy8gU3RhZ2VkIGdlbmVyYXRpb24gc3RhdGUgKEdBUC0yMCk6IHRyYWNrcyBwcmV2aWV3IFx1MjE5MiBjb25maXJtIFx1MjE5MiBmaW5hbCBwaXBlbGluZS5cbi8vIFN5bmNlZCBmcm9tIC9hcGkvY3YvZ2VuZXJhdGlvbi1zdGF0ZSBvbiBwYWdlIGxvYWQgYW5kIGFmdGVyIGtleSB0cmFuc2l0aW9ucy5cbmxldCBnZW5lcmF0aW9uU3RhdGUgPSBjcmVhdGVEZWZhdWx0R2VuZXJhdGlvblN0YXRlKCk7XG5cbi8vIEFUUyBzY29yZSBzdGF0ZSAoR0FQLTIxKTogY2FjaGVkIHNjb3JlIGZyb20gL2FwaS9jdi9hdHMtc2NvcmUuXG4vLyBOdWxsIHVudGlsIGZpcnN0IHNjb3JlIGlzIGZldGNoZWQuXG5sZXQgYXRzU2NvcmUgPSBudWxsO1xuXG4vLyBFeHBvcnQgc3RhdGUgZ2V0dGVycy9zZXR0ZXJzXG5jb25zdCBzdGF0ZU1hbmFnZXIgPSB7XG4gIC8vIFRhYiBzdGF0ZVxuICBnZXRDdXJyZW50VGFiOiAoKSA9PiBjdXJyZW50VGFiLFxuICBzZXRDdXJyZW50VGFiOiAodGFiKSA9PiB7IGN1cnJlbnRUYWIgPSB0YWI7IHNhdmVTdGF0ZVRvTG9jYWxTdG9yYWdlKCk7IH0sXG4gIGdldEN1cnJlbnRTdGFnZTogKCkgPT4gZ2V0V29ya2Zsb3dTdGVwRm9yUGhhc2UobGFzdEtub3duUGhhc2UpLFxuXG4gIC8vIExvYWRpbmcgc3RhdGVcbiAgaXNMb2FkaW5nOiAoKSA9PiBpc0xvYWRpbmcsXG4gIHNldExvYWRpbmc6IChsb2FkaW5nKSA9PiB7XG4gICAgaXNMb2FkaW5nID0gbG9hZGluZztcbiAgfSxcblxuICAvLyBUYWIgZGF0YSAoYW5hbHlzaXMsIGN1c3RvbWl6YXRpb25zLCBDVilcbiAgZ2V0VGFiRGF0YTogKHRhYikgPT4gdGFiRGF0YVt0YWJdLFxuICBnZXRBbGxUYWJEYXRhOiAoKSA9PiAoeyAuLi50YWJEYXRhIH0pLFxuICBzZXRUYWJEYXRhOiAodGFiLCBkYXRhKSA9PiB7IHRhYkRhdGFbdGFiXSA9IGRhdGE7IHNhdmVTdGF0ZVRvTG9jYWxTdG9yYWdlKCk7IH0sXG5cbiAgLy8gSW50ZXJhY3RpdmUgc3RhdGUgKGZvciBleHBlcmllbmNlL3NraWxsIHNlbGVjdGlvbiByZXZpZXcpXG4gIGdldEludGVyYWN0aXZlU3RhdGU6ICgpID0+IGludGVyYWN0aXZlU3RhdGUsXG4gIHNldEludGVyYWN0aXZlU3RhdGU6IChzdGF0ZSkgPT4geyBpbnRlcmFjdGl2ZVN0YXRlID0geyAuLi5pbnRlcmFjdGl2ZVN0YXRlLCAuLi5zdGF0ZSB9OyBzYXZlU3RhdGVUb0xvY2FsU3RvcmFnZSgpOyB9LFxuXG4gIC8vIFJlY29ubmVjdCBzdGF0ZVxuICBpc1JlY29ubmVjdGluZzogKCkgPT4gaXNSZWNvbm5lY3RpbmcsXG4gIHNldElzUmVjb25uZWN0aW5nOiAocmVjb25uZWN0aW5nKSA9PiB7IGlzUmVjb25uZWN0aW5nID0gQm9vbGVhbihyZWNvbm5lY3RpbmcpOyB9LFxuXG4gIC8vIFNlc3Npb24gbWFuYWdlbWVudFxuICBnZXRTZXNzaW9uSWQ6ICgpID0+IHNlc3Npb25JZCxcbiAgc2V0U2Vzc2lvbklkOiAoaWQpID0+IHsgc2Vzc2lvbklkID0gaWQ7IGxvY2FsU3RvcmFnZS5zZXRJdGVtKFN0b3JhZ2VLZXlzLlNFU1NJT05fSUQsIGlkKTsgfSxcblxuICAvLyBNb2RlbC9wcm92aWRlciBzZWxlY3Rpb25cbiAgZ2V0Q3VycmVudE1vZGVsUHJvdmlkZXI6ICgpID0+IGN1cnJlbnRNb2RlbFByb3ZpZGVyLFxuICBnZXRDdXJyZW50TW9kZWxOYW1lOiAoKSA9PiBjdXJyZW50TW9kZWxOYW1lLFxuICBzZXRDdXJyZW50TW9kZWw6IChwcm92aWRlciwgbW9kZWwpID0+IHsgY3VycmVudE1vZGVsUHJvdmlkZXIgPSBwcm92aWRlciB8fCBudWxsOyBjdXJyZW50TW9kZWxOYW1lID0gbW9kZWwgfHwgbnVsbDsgc2F2ZVN0YXRlVG9Mb2NhbFN0b3JhZ2UoKTsgfSxcblxuICAvLyBQaGFzZSB0cmFja2luZ1xuICBnZXRQaGFzZTogKCkgPT4gbGFzdEtub3duUGhhc2UsXG4gIHNldFBoYXNlOiAocGhhc2UpID0+IHtcbiAgICBsYXN0S25vd25QaGFzZSA9IHBoYXNlO1xuICAgIHNhdmVTdGF0ZVRvTG9jYWxTdG9yYWdlKCk7XG4gICAgX3BoYXNlQ2hhbmdlTGlzdGVuZXJzLmZvckVhY2goZm4gPT4geyB0cnkgeyBmbihwaGFzZSk7IH0gY2F0Y2ggKGUpIHsgLyogaWdub3JlICovIH0gfSk7XG4gIH0sXG4gIG9uUGhhc2VDaGFuZ2U6IChmbikgPT4geyBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSBfcGhhc2VDaGFuZ2VMaXN0ZW5lcnMucHVzaChmbik7IH0sXG4gIGdldFdvcmtmbG93U3RlcDogKCkgPT4gZ2V0V29ya2Zsb3dTdGVwRm9yUGhhc2UobGFzdEtub3duUGhhc2UpLFxuXG4gIC8vIFBvc3QtYW5hbHlzaXMgcXVlc3Rpb25zXG4gIGdldFBvc3RBbmFseXNpc1F1ZXN0aW9uczogKCkgPT4gd2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucyB8fCBbXSxcbiAgc2V0UG9zdEFuYWx5c2lzUXVlc3Rpb25zOiAocXVlc3Rpb25zKSA9PiB7IHdpbmRvdy5wb3N0QW5hbHlzaXNRdWVzdGlvbnMgPSBxdWVzdGlvbnM7IH0sXG5cbiAgLy8gUXVlc3Rpb24gYW5zd2Vyc1xuICBnZXRRdWVzdGlvbkFuc3dlcnM6ICgpID0+IHdpbmRvdy5xdWVzdGlvbkFuc3dlcnMgfHwge30sXG4gIHNldFF1ZXN0aW9uQW5zd2VyczogKGFuc3dlcnMpID0+IHsgd2luZG93LnF1ZXN0aW9uQW5zd2VycyA9IGFuc3dlcnM7IH0sXG5cbiAgLy8gUGVuZGluZyByZWNvbW1lbmRhdGlvbnNcbiAgZ2V0UGVuZGluZ1JlY29tbWVuZGF0aW9uczogKCkgPT4gd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnMgfHwgbnVsbCxcbiAgc2V0UGVuZGluZ1JlY29tbWVuZGF0aW9uczogKHJlYykgPT4geyB3aW5kb3cucGVuZGluZ1JlY29tbWVuZGF0aW9ucyA9IHJlYzsgc2F2ZVN0YXRlVG9Mb2NhbFN0b3JhZ2UoKTsgfSxcblxuICAvLyBBVFMgc2NvcmUgc3RhdGUgKEdBUC0yMSlcbiAgZ2V0QXRzU2NvcmU6ICgpID0+IGF0c1Njb3JlLFxuICBzZXRBdHNTY29yZTogKHNjb3JlKSA9PiB7IGF0c1Njb3JlID0gc2NvcmU7IHNhdmVTdGF0ZVRvTG9jYWxTdG9yYWdlKCk7IH0sXG4gIGNsZWFyQXRzU2NvcmU6ICgpID0+IHsgYXRzU2NvcmUgPSBudWxsOyBzYXZlU3RhdGVUb0xvY2FsU3RvcmFnZSgpOyB9LFxuXG4gIC8vIFN0YWdlZCBnZW5lcmF0aW9uIHN0YXRlIChHQVAtMjApXG4gIGdldEdlbmVyYXRpb25TdGF0ZTogKCkgPT4gZ2VuZXJhdGlvblN0YXRlLFxuICBnZXRMYXlvdXRGcmVzaG5lc3M6ICgpID0+IGdldExheW91dEZyZXNobmVzc0Zyb21TdGF0ZShnZW5lcmF0aW9uU3RhdGUpLFxuICBzZXRHZW5lcmF0aW9uU3RhdGU6ICh1cGRhdGUpID0+IHtcbiAgICBnZW5lcmF0aW9uU3RhdGUgPSB7IC4uLmdlbmVyYXRpb25TdGF0ZSwgLi4udXBkYXRlIH07XG4gICAgc2F2ZVN0YXRlVG9Mb2NhbFN0b3JhZ2UoKTtcbiAgICBlbWl0R2VuZXJhdGlvblN0YXRlQ2hhbmdlZCgpO1xuICB9LFxuICBtYXJrQ29udGVudENoYW5nZWQ6ICgpID0+IHtcbiAgICBnZW5lcmF0aW9uU3RhdGUgPSB7XG4gICAgICAuLi5nZW5lcmF0aW9uU3RhdGUsXG4gICAgICBjb250ZW50UmV2aXNpb246IChub3JtYWxpemVSZXZpc2lvbihnZW5lcmF0aW9uU3RhdGUuY29udGVudFJldmlzaW9uKSA/PyAwKSArIDEsXG4gICAgfTtcbiAgICBzYXZlU3RhdGVUb0xvY2FsU3RvcmFnZSgpO1xuICAgIGVtaXRHZW5lcmF0aW9uU3RhdGVDaGFuZ2VkKCk7XG4gIH0sXG4gIG1hcmtQcmV2aWV3R2VuZXJhdGVkOiAodXBkYXRlID0ge30pID0+IHtcbiAgICBjb25zdCBjb250ZW50UmV2aXNpb24gPSBub3JtYWxpemVSZXZpc2lvbihnZW5lcmF0aW9uU3RhdGUuY29udGVudFJldmlzaW9uKSA/PyAwO1xuICAgIGdlbmVyYXRpb25TdGF0ZSA9IHtcbiAgICAgIC4uLmdlbmVyYXRpb25TdGF0ZSxcbiAgICAgIC4uLnVwZGF0ZSxcbiAgICAgIHBoYXNlOiBHRU5FUkFUSU9OX1BIQVNFUy5MQVlPVVRfUkVWSUVXLFxuICAgICAgcHJldmlld0F2YWlsYWJsZTogdHJ1ZSxcbiAgICAgIGxheW91dENvbmZpcm1lZDogZmFsc2UsXG4gICAgICBsYXN0UHJldmlld0NvbnRlbnRSZXZpc2lvbjogY29udGVudFJldmlzaW9uLFxuICAgIH07XG4gICAgc2F2ZVN0YXRlVG9Mb2NhbFN0b3JhZ2UoKTtcbiAgICBlbWl0R2VuZXJhdGlvblN0YXRlQ2hhbmdlZCgpO1xuICB9LFxuICBtYXJrTGF5b3V0Q29uZmlybWVkOiAodXBkYXRlID0ge30pID0+IHtcbiAgICBnZW5lcmF0aW9uU3RhdGUgPSB7XG4gICAgICAuLi5nZW5lcmF0aW9uU3RhdGUsXG4gICAgICAuLi51cGRhdGUsXG4gICAgICBwaGFzZTogR0VORVJBVElPTl9QSEFTRVMuQ09ORklSTUVELFxuICAgICAgbGF5b3V0Q29uZmlybWVkOiB0cnVlLFxuICAgIH07XG4gICAgc2F2ZVN0YXRlVG9Mb2NhbFN0b3JhZ2UoKTtcbiAgICBlbWl0R2VuZXJhdGlvblN0YXRlQ2hhbmdlZCgpO1xuICB9LFxuICBtYXJrRmluYWxHZW5lcmF0ZWQ6IChnZW5lcmF0ZWRBdCA9IG51bGwsIHVwZGF0ZSA9IHt9KSA9PiB7XG4gICAgY29uc3QgY29udGVudFJldmlzaW9uID0gbm9ybWFsaXplUmV2aXNpb24oZ2VuZXJhdGlvblN0YXRlLmNvbnRlbnRSZXZpc2lvbikgPz8gMDtcbiAgICBnZW5lcmF0aW9uU3RhdGUgPSB7XG4gICAgICAuLi5nZW5lcmF0aW9uU3RhdGUsXG4gICAgICAuLi51cGRhdGUsXG4gICAgICBwaGFzZTogR0VORVJBVElPTl9QSEFTRVMuRklOQUxfQ09NUExFVEUsXG4gICAgICBsYXlvdXRDb25maXJtZWQ6IHRydWUsXG4gICAgICBmaW5hbEdlbmVyYXRlZEF0OiBnZW5lcmF0ZWRBdCB8fCB1cGRhdGUuZmluYWxHZW5lcmF0ZWRBdCB8fCBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICBsYXN0RmluYWxDb250ZW50UmV2aXNpb246IGNvbnRlbnRSZXZpc2lvbixcbiAgICB9O1xuICAgIHNhdmVTdGF0ZVRvTG9jYWxTdG9yYWdlKCk7XG4gICAgZW1pdEdlbmVyYXRpb25TdGF0ZUNoYW5nZWQoKTtcbiAgfSxcbiAgcmVzZXRHZW5lcmF0aW9uU3RhdGU6ICgpID0+IHtcbiAgICBnZW5lcmF0aW9uU3RhdGUgPSBjcmVhdGVEZWZhdWx0R2VuZXJhdGlvblN0YXRlKCk7XG4gICAgc2F2ZVN0YXRlVG9Mb2NhbFN0b3JhZ2UoKTtcbiAgICBlbWl0R2VuZXJhdGlvblN0YXRlQ2hhbmdlZCgpO1xuICB9LFxuICBzZXREaXJ0eVBoYXNlczogKHBoYXNlcywgZWFybGllc3RTdGVwKSA9PiB7XG4gICAgZ2VuZXJhdGlvblN0YXRlID0ge1xuICAgICAgLi4uZ2VuZXJhdGlvblN0YXRlLFxuICAgICAgZGlydHlQaGFzZXM6ICAgICAgIEFycmF5LmlzQXJyYXkocGhhc2VzKSA/IHBoYXNlcyA6IFtdLFxuICAgICAgZWFybGllc3REaXJ0eVN0ZXA6IGVhcmxpZXN0U3RlcCB8fCBudWxsLFxuICAgIH07XG4gICAgc2F2ZVN0YXRlVG9Mb2NhbFN0b3JhZ2UoKTtcbiAgICBlbWl0R2VuZXJhdGlvblN0YXRlQ2hhbmdlZCgpO1xuICB9LFxuICBjbGVhckRpcnR5UGhhc2VzOiAoKSA9PiB7XG4gICAgZ2VuZXJhdGlvblN0YXRlID0ge1xuICAgICAgLi4uZ2VuZXJhdGlvblN0YXRlLFxuICAgICAgZGlydHlQaGFzZXM6ICAgICAgIFtdLFxuICAgICAgZWFybGllc3REaXJ0eVN0ZXA6IG51bGwsXG4gICAgfTtcbiAgICBzYXZlU3RhdGVUb0xvY2FsU3RvcmFnZSgpO1xuICAgIGVtaXRHZW5lcmF0aW9uU3RhdGVDaGFuZ2VkKCk7XG4gIH0sXG4gIGdldERpcnR5UGhhc2VzOiAgICAgICAoKSA9PiBnZW5lcmF0aW9uU3RhdGUuZGlydHlQaGFzZXMgfHwgW10sXG4gIGdldEVhcmxpZXN0RGlydHlTdGVwOiAoKSA9PiBnZW5lcmF0aW9uU3RhdGUuZWFybGllc3REaXJ0eVN0ZXAgfHwgbnVsbCxcbn07XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBmcmVzaCBzdGF0ZSBvYmplY3Qgd2l0aCBhbGwgZGVmYXVsdCB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIGluaXRpYWxpemVTdGF0ZSgpIHtcbiAgY3VycmVudFRhYiA9ICdqb2InO1xuICBpc0xvYWRpbmcgPSBmYWxzZTtcbiAgdGFiRGF0YSA9IHtcbiAgICBhbmFseXNpczogbnVsbCxcbiAgICBjdXN0b21pemF0aW9uczogbnVsbCxcbiAgICBjdjogbnVsbFxuICB9O1xuICBpbnRlcmFjdGl2ZVN0YXRlID0ge1xuICAgIGlzUmV2aWV3aW5nOiBmYWxzZSxcbiAgICBjdXJyZW50SW5kZXg6IDAsXG4gICAgdHlwZTogbnVsbCxcbiAgICBkYXRhOiBudWxsXG4gIH07XG4gIHdpbmRvdy5wb3N0QW5hbHlzaXNRdWVzdGlvbnMgPSBbXTtcbiAgd2luZG93LnF1ZXN0aW9uQW5zd2VycyA9IHt9O1xuICBsYXN0S25vd25QaGFzZSA9IFBIQVNFUy5JTklUO1xuICBnZW5lcmF0aW9uU3RhdGUgPSBjcmVhdGVEZWZhdWx0R2VuZXJhdGlvblN0YXRlKCk7XG5cbiAgLy8gR2V0IG9yIGdlbmVyYXRlIHNlc3Npb24gSURcbiAgbGV0IHN0b3JlZElkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oU3RvcmFnZUtleXMuU0VTU0lPTl9JRCk7XG4gIGlmICghc3RvcmVkSWQpIHtcbiAgICBzdG9yZWRJZCA9IGdlbmVyYXRlU2Vzc2lvbklkKCk7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oU3RvcmFnZUtleXMuU0VTU0lPTl9JRCwgc3RvcmVkSWQpO1xuICB9XG4gIHNlc3Npb25JZCA9IHN0b3JlZElkO1xuXG4gIHNhdmVTdGF0ZVRvTG9jYWxTdG9yYWdlKCk7XG4gIGVtaXRHZW5lcmF0aW9uU3RhdGVDaGFuZ2VkKCk7XG59XG5cbi8qKlxuICogTG9hZCBzdGF0ZSBmcm9tIGJyb3dzZXIgbG9jYWxTdG9yYWdlLlxuICovXG5mdW5jdGlvbiBsb2FkU3RhdGVGcm9tTG9jYWxTdG9yYWdlKCkge1xuICB0cnkge1xuICAgIGNvbnN0IHNhdmVkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oU3RvcmFnZUtleXMuVEFCX0RBVEEpO1xuICAgIGlmICghc2F2ZWQpIHJldHVybiBmYWxzZTtcblxuICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKHNhdmVkKTtcblxuICAgIC8vIE9ubHkgcmVzdG9yZSBpZiBkYXRhIGlzIHJlY2VudCAod2l0aGluIDI0IGhvdXJzKVxuICAgIGNvbnN0IGFnZSA9IERhdGUubm93KCkgLSAoZGF0YS50aW1lc3RhbXAgfHwgMCk7XG4gICAgaWYgKGFnZSA+IDI0ICogNjAgKiA2MCAqIDEwMDApIHtcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKFN0b3JhZ2VLZXlzLlRBQl9EQVRBKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBSZXN0b3JlIHRhYiBkYXRhXG4gICAgaWYgKGRhdGEudGFiRGF0YSkge1xuICAgICAgdGFiRGF0YSA9IHsgLi4udGFiRGF0YSwgLi4uZGF0YS50YWJEYXRhIH07XG4gICAgfVxuXG4gICAgaWYgKGRhdGEuY3VycmVudFRhYikge1xuICAgICAgY3VycmVudFRhYiA9IGRhdGEuY3VycmVudFRhYjtcbiAgICB9XG5cbiAgICAvLyBSZXN0b3JlIGludGVyYWN0aXZlIHN0YXRlXG4gICAgaWYgKGRhdGEuaW50ZXJhY3RpdmVTdGF0ZSkge1xuICAgICAgaW50ZXJhY3RpdmVTdGF0ZSA9IHsgLi4uaW50ZXJhY3RpdmVTdGF0ZSwgLi4uZGF0YS5pbnRlcmFjdGl2ZVN0YXRlIH07XG4gICAgfVxuXG4gICAgLy8gUmVzdG9yZSBwZW5kaW5nIHJlY29tbWVuZGF0aW9uc1xuICAgIGlmIChkYXRhLnBlbmRpbmdSZWNvbW1lbmRhdGlvbnMpIHtcbiAgICAgIHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zID0gZGF0YS5wZW5kaW5nUmVjb21tZW5kYXRpb25zO1xuICAgIH1cblxuICAgIC8vIFJlc3RvcmUgc2F2ZWQgbW9kZWwvcHJvdmlkZXIgc2VsZWN0aW9uXG4gICAgaWYgKGRhdGEuY3VycmVudE1vZGVsUHJvdmlkZXIpIHtcbiAgICAgIGN1cnJlbnRNb2RlbFByb3ZpZGVyID0gZGF0YS5jdXJyZW50TW9kZWxQcm92aWRlcjtcbiAgICB9XG4gICAgaWYgKGRhdGEuY3VycmVudE1vZGVsTmFtZSkge1xuICAgICAgY3VycmVudE1vZGVsTmFtZSA9IGRhdGEuY3VycmVudE1vZGVsTmFtZTtcbiAgICB9XG5cbiAgICAvLyBSZXN0b3JlIHBvc3QtYW5hbHlzaXMgc3RhdGVcbiAgICBpZiAoZGF0YS5wb3N0QW5hbHlzaXNRdWVzdGlvbnMpIHtcbiAgICAgIHdpbmRvdy5wb3N0QW5hbHlzaXNRdWVzdGlvbnMgPSBkYXRhLnBvc3RBbmFseXNpc1F1ZXN0aW9ucztcbiAgICB9XG4gICAgaWYgKGRhdGEucXVlc3Rpb25BbnN3ZXJzKSB7XG4gICAgICB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzID0gZGF0YS5xdWVzdGlvbkFuc3dlcnM7XG4gICAgfVxuXG4gICAgLy8gUmVzdG9yZSBwaGFzZVxuICAgIGlmIChkYXRhLmxhc3RLbm93blBoYXNlKSB7XG4gICAgICBsYXN0S25vd25QaGFzZSA9IGRhdGEubGFzdEtub3duUGhhc2U7XG4gICAgfVxuXG4gICAgLy8gUmVzdG9yZSBzdGFnZWQgZ2VuZXJhdGlvbiBzdGF0ZVxuICAgIGlmIChkYXRhLmdlbmVyYXRpb25TdGF0ZSkge1xuICAgICAgZ2VuZXJhdGlvblN0YXRlID0geyAuLi5nZW5lcmF0aW9uU3RhdGUsIC4uLmRhdGEuZ2VuZXJhdGlvblN0YXRlIH07XG4gICAgfVxuXG4gICAgLy8gUmVzdG9yZSBBVFMgc2NvcmVcbiAgICBpZiAoZGF0YS5hdHNTY29yZSkge1xuICAgICAgYXRzU2NvcmUgPSBkYXRhLmF0c1Njb3JlO1xuICAgIH1cblxuICAgIGVtaXRHZW5lcmF0aW9uU3RhdGVDaGFuZ2VkKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nLndhcm4oJ0ZhaWxlZCB0byBsb2FkIHN0YXRlIGZyb20gbG9jYWxTdG9yYWdlOicsIGVycm9yKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBTYXZlIGN1cnJlbnQgc3RhdGUgdG8gYnJvd3NlciBsb2NhbFN0b3JhZ2UuXG4gKi9cbmZ1bmN0aW9uIHNhdmVTdGF0ZVRvTG9jYWxTdG9yYWdlKCkge1xuICB0cnkge1xuICAgIGNvbnN0IGRhdGFUb1NhdmUgPSB7XG4gICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICB0YWJEYXRhLFxuICAgICAgaW50ZXJhY3RpdmVTdGF0ZSxcbiAgICAgIHBlbmRpbmdSZWNvbW1lbmRhdGlvbnM6IHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zLFxuICAgICAgcG9zdEFuYWx5c2lzUXVlc3Rpb25zOiB3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zLFxuICAgICAgcXVlc3Rpb25BbnN3ZXJzOiB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzLFxuICAgICAgbGFzdEtub3duUGhhc2UsXG4gICAgICBjdXJyZW50VGFiLFxuICAgICAgLy8gUGVyc2lzdCBsYXN0LXNlbGVjdGVkIG1vZGVsL3Byb3ZpZGVyIHNvIFVJIHNlbGVjdGlvbnMgc3Vydml2ZSByZWxvYWRzXG4gICAgICBjdXJyZW50TW9kZWxQcm92aWRlcixcbiAgICAgIGN1cnJlbnRNb2RlbE5hbWUsXG4gICAgICBnZW5lcmF0aW9uU3RhdGUsXG4gICAgICBhdHNTY29yZSxcbiAgICB9O1xuXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oU3RvcmFnZUtleXMuVEFCX0RBVEEsIEpTT04uc3RyaW5naWZ5KGRhdGFUb1NhdmUpKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cud2FybignRmFpbGVkIHRvIHNhdmUgc3RhdGUgdG8gbG9jYWxTdG9yYWdlOicsIGVycm9yKTtcbiAgfVxufVxuXG4vKipcbiAqIENsZWFyIGFsbCBzdGF0ZSAob24gbmV3IHNlc3Npb24gb3IgcmVzZXQgYWN0aW9uKS5cbiAqL1xuZnVuY3Rpb24gY2xlYXJTdGF0ZSgpIHtcbiAgaW5pdGlhbGl6ZVN0YXRlKCk7XG4gIE9iamVjdC52YWx1ZXMoU3RvcmFnZUtleXMpLmZvckVhY2goa2V5ID0+IGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSkpO1xufVxuXG4vLyBUaGUgYXV0aG9yaXRhdGl2ZSByZXN0b3JlU2Vzc2lvbi9yZXN0b3JlQmFja2VuZFN0YXRlL2xvYWRTZXNzaW9uRmlsZVxuLy8gaW1wbGVtZW50YXRpb25zIGxpdmUgaW4gYHdlYi9hcHAuanNgLiBSZW1vdmUgZHVwbGljYXRlIGltcGxlbWVudGF0aW9uc1xuLy8gZnJvbSB0aGlzIG1vZHVsZSB0byBhdm9pZCBjb25mbGljdGluZyBiZWhhdmlvciBhbmQgZW5zdXJlIGEgc2luZ2xlXG4vLyByZXN0b3JlIHBhdGggaXMgdXNlZCBieSB0aGUgYXBwbGljYXRpb24uXG5cbmV4cG9ydCB7XG4gIFBIQVNFUyxcbiAgUEhBU0VfVE9fU1RFUCxcbiAgR0VORVJBVElPTl9QSEFTRVMsXG4gIEdFTkVSQVRJT05fU1RBVEVfRVZFTlQsXG4gIHN0YXRlTWFuYWdlcixcbiAgZ2V0V29ya2Zsb3dTdGVwRm9yUGhhc2UsXG4gIGluaXRpYWxpemVTdGF0ZSwgbG9hZFN0YXRlRnJvbUxvY2FsU3RvcmFnZSwgc2F2ZVN0YXRlVG9Mb2NhbFN0b3JhZ2UsXG4gIGNsZWFyU3RhdGUsXG59O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvcHJvdmlkZXItaW5mby5qcyBcdTIwMTQgTExNIHByb3ZpZGVyIGRpc3BsYXkgbWV0YWRhdGEgY2xpZW50LlxuICpcbiAqIFByb3ZpZGVyIGRhdGEgaXMgbm93IHRoZSBzaW5nbGUgc291cmNlIG9mIHRydXRoIGluIHNjcmlwdHMvdXRpbHMvcHJvdmlkZXJfcmVnaXN0cnkucHlcbiAqIGFuZCBzZXJ2ZWQgYnkgR0VUIC9hcGkvcHJvdmlkZXJzLiBUaGlzIG1vZHVsZSBmZXRjaGVzIGFuZCBjYWNoZXMgdGhhdCBkYXRhLlxuICpcbiAqIEFsbCBwcm92aWRlciBkZXNjcmlwdGlvbnMsIFVSTHMsIGFuZCB0aWVyL3ByaXZhY3kgZmxhZ3Mgc2hvdWxkIGJlIGVkaXRlZCBpblxuICogcHJvdmlkZXJfcmVnaXN0cnkucHkgcmF0aGVyIHRoYW4gaGVyZS5cbiAqXG4gKiBTZXJ2ZXIgZmllbGQgbmFtZXMgKHNuYWtlX2Nhc2UsIG1hdGNoaW5nIFB5dGhvbik6XG4gKiAgIGZyZWVfdGllciAgIFx1MjAxNCB3aGV0aGVyIGEgbm8tY29zdCBBUEkgZW50cnkgdGllciBpcyBhdmFpbGFibGVcbiAqICAgY29uZmlkZW50aWFsIFx1MjAxNCB3aGV0aGVyIHRoZSBwcm92aWRlciBjb21taXRzIG5vdCB0byB0cmFpbiBvbiBBUEkgcmVxdWVzdCBkYXRhXG4gKiAgIG5vdGUgICAgICAgIFx1MjAxNCBvbmUtc2VudGVuY2UgcGxhaW4tdGV4dCBkZXNjcmlwdGlvblxuICogICBob21lcGFnZSAgICBcdTIwMTQgcHJvdmlkZXIgbGFuZGluZyBwYWdlIFVSTCAobnVsbCBpZiBub3QgYXBwbGljYWJsZSlcbiAqICAgcHJpY2luZ191cmwgXHUyMDE0IHByaWNpbmcgLyBwbGFucyBwYWdlIFVSTCAobnVsbCBpZiBub3QgYXBwbGljYWJsZSlcbiAqICAgcHJpdmFjeV91cmwgXHUyMDE0IHByaXZhY3kgcG9saWN5IG9yIGRhdGEtdXNlIHBvbGljeSBVUkwgKG51bGwgaWYgbm90IGFwcGxpY2FibGUpXG4gKi9cblxuaW1wb3J0IHsgZXNjYXBlSHRtbCB9IGZyb20gJy4vdXRpbHMuanMnO1xuXG4vKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIG9iamVjdD58bnVsbH0gKi9cbmxldCBfY2FjaGUgPSBudWxsO1xuXG4vKipcbiAqIEZldGNoIHByb3ZpZGVyIGRpc3BsYXkgbWV0YWRhdGEgZnJvbSB0aGUgc2VydmVyIGFuZCBjYWNoZSBpdC5cbiAqIFNhZmUgdG8gY2FsbCBtdWx0aXBsZSB0aW1lcyBcdTIwMTQgcmV0dXJucyB0aGUgY2FjaGUgaWYgcG9wdWxhdGVkLCByZXRyaWVzIGlmXG4gKiB0aGUgaW5pdGlhbCBmZXRjaCBmYWlsZWQgKG5vbi1mYXRhbCwgcG9wb3ZlcnMgd2lsbCBqdXN0IG5vdCBhcHBlYXIpLlxuICogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywgb2JqZWN0PnxudWxsPn1cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRQcm92aWRlckluZm8oKSB7XG4gIGlmIChfY2FjaGUgIT09IG51bGwpIHJldHVybiBfY2FjaGU7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKCcvYXBpL3Byb3ZpZGVycycpO1xuICAgIGlmIChyZXNwLm9rKSB7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcC5qc29uKCk7XG4gICAgICBfY2FjaGUgPSBkYXRhLnByb3ZpZGVycyB8fCB7fTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIE5vbi1mYXRhbDogcG9wb3ZlcnMgc2ltcGx5IHdvbid0IGFwcGVhci5cbiAgfVxuICByZXR1cm4gX2NhY2hlO1xufVxuXG4vKipcbiAqIFJldHVybiBjYWNoZWQgZGlzcGxheSBpbmZvIGZvciBhIHByb3ZpZGVyLCBvciBudWxsIGlmIG5vdCBsb2FkZWQgLyB1bmtub3duLlxuICogQ2FsbCBsb2FkUHJvdmlkZXJJbmZvKCkgZmlyc3QgKGUuZy4gaW4gb3Blbk1vZGVsTW9kYWwpLlxuICogQHBhcmFtIHtzdHJpbmd9IHByb3ZpZGVyXG4gKiBAcmV0dXJucyB7b2JqZWN0fG51bGx9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcm92aWRlckluZm8ocHJvdmlkZXIpIHtcbiAgcmV0dXJuIF9jYWNoZSA/IChfY2FjaGVbcHJvdmlkZXJdIHx8IG51bGwpIDogbnVsbDtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgSFRNTCBjb250ZW50IHN0cmluZyBmb3IgYSBwcm92aWRlciBpbmZvIEJvb3RzdHJhcCA1IHBvcG92ZXIuXG4gKiBVc2VzIHNuYWtlX2Nhc2UgZmllbGQgbmFtZXMgYXMgcmV0dXJuZWQgYnkgR0VUIC9hcGkvcHJvdmlkZXJzLlxuICogQHBhcmFtIHtvYmplY3R9IGluZm8gLSBQcm92aWRlciBpbmZvIGVudHJ5IGZyb20gZ2V0UHJvdmlkZXJJbmZvKClcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEhUTUwgc3RyaW5nIChzYWZlIHRvIHBhc3MgdG8gQlM1IFBvcG92ZXIgd2l0aCBzYW5pdGl6ZTpmYWxzZSlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVySW5mb1BvcG92ZXJDb250ZW50KGluZm8pIHtcbiAgY29uc3QgdGllckljb24gID0gaW5mby5mcmVlX3RpZXIgICAgPyAnJiMxMDAwMzsgRnJlZSB0aWVyIGF2YWlsYWJsZScgICAgOiAnJiMxMDAwNzsgUGFpZCBvbmx5IChubyBmcmVlIEFQSSB0aWVyKSc7XG4gIGNvbnN0IHByaXZJY29uICA9IGluZm8uY29uZmlkZW50aWFsID8gJyYjMTI4Mjc0OyBEYXRhIGNvbmZpZGVudGlhbCcgICAgIDogJyYjOTg4ODsmIzY1MDM5OyBEYXRhIG1heSBiZSByZXZpZXdlZC9yZXRhaW5lZCc7XG4gIGNvbnN0IHRpZXJDb2xvciA9IGluZm8uZnJlZV90aWVyICAgID8gJyMwNjVmNDYnIDogJyM5MjQwMGUnO1xuICBjb25zdCBwcml2Q29sb3IgPSBpbmZvLmNvbmZpZGVudGlhbCA/ICcjMWU0MGFmJyA6ICcjOTI0MDBlJztcblxuICBjb25zdCBsaW5rcyA9IFtcbiAgICBpbmZvLmhvbWVwYWdlICAgID8gYDxhIGhyZWY9XCIke2VzY2FwZUh0bWwoaW5mby5ob21lcGFnZSl9XCIgICAgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiPkhvbWVwYWdlPC9hPmAgICAgICAgICAgIDogJycsXG4gICAgaW5mby5wcmljaW5nX3VybCA/IGA8YSBocmVmPVwiJHtlc2NhcGVIdG1sKGluZm8ucHJpY2luZ191cmwpfVwiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIj5QcmljaW5nICZhbXA7IHBsYW5zPC9hPmAgOiAnJyxcbiAgICBpbmZvLnByaXZhY3lfdXJsID8gYDxhIGhyZWY9XCIke2VzY2FwZUh0bWwoaW5mby5wcml2YWN5X3VybCl9XCIgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiPlByaXZhY3kgcG9saWN5PC9hPmAgICAgICA6ICcnLFxuICBdLmZpbHRlcihCb29sZWFuKTtcblxuICByZXR1cm4gJzxkaXYgc3R5bGU9XCJtaW4td2lkdGg6MjIwcHg7bWF4LXdpZHRoOjMwMHB4O2ZvbnQtc2l6ZTowLjgyZW07bGluZS1oZWlnaHQ6MS41O1wiPidcbiAgICArIGA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTo2cHg7XCI+PHNwYW4gc3R5bGU9XCJjb2xvcjoke3RpZXJDb2xvcn07XCI+JHt0aWVySWNvbn08L3NwYW4+PC9kaXY+YFxuICAgICsgYDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjhweDtcIj48c3BhbiBzdHlsZT1cImNvbG9yOiR7cHJpdkNvbG9yfTtcIj4ke3ByaXZJY29ufTwvc3Bhbj48L2Rpdj5gXG4gICAgKyBgPHAgc3R5bGU9XCJtYXJnaW46MCAwIDhweDtjb2xvcjojMzc0MTUxO1wiPiR7ZXNjYXBlSHRtbChpbmZvLm5vdGUpfTwvcD5gXG4gICAgKyAobGlua3MubGVuZ3RoID8gJzx1bCBzdHlsZT1cIm1hcmdpbjowO3BhZGRpbmctbGVmdDoxNnB4O1wiPicgKyBsaW5rcy5tYXAobCA9PiBgPGxpPiR7bH08L2xpPmApLmpvaW4oJycpICsgJzwvdWw+JyA6ICcnKVxuICAgICsgJzwvZGl2Pic7XG59XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHVpLWNvcmUuanNcbiAqIENvcmUgVUkgcm91dGluZywgdGFiIG1hbmFnZW1lbnQsIG1vZGFsIG1hbmFnZW1lbnQsIGFuZCBwYWdlIGluaXRpYWxpemF0aW9uLlxuICogRW50cnkgcG9pbnQgZm9yIHRoZSBhcHBsaWNhdGlvbiAtIGxvYWRzIG9uIERPTUNvbnRlbnRMb2FkZWQuXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCd1aS1jb3JlJyk7XG5cbmltcG9ydCB7IGVzY2FwZUh0bWwgfSBmcm9tICcuL3V0aWxzLmpzJztcbmltcG9ydCB7IFN0b3JhZ2VLZXlzLCBhcGlDYWxsLCBmZXRjaFN0YXR1cywgZmV0Y2hTZXR0aW5ncywgdXBkYXRlU2V0dGluZ3MgfSBmcm9tICcuL2FwaS1jbGllbnQuanMnO1xuaW1wb3J0IHtcbiAgZ2V0V29ya2Zsb3dTdGVwRm9yUGhhc2UsXG4gIGluaXRpYWxpemVTdGF0ZSxcbiAgbG9hZFN0YXRlRnJvbUxvY2FsU3RvcmFnZSxcbiAgc3RhdGVNYW5hZ2VyLFxufSBmcm9tICcuL3N0YXRlLW1hbmFnZXIuanMnO1xuXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbi8vIEFjY2Vzc2liaWxpdHk6IEZvY3VzIE1hbmFnZW1lbnQgZm9yIE1vZGFsc1xuLy8gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8qKiBTdGFjayBvZiBlbGVtZW50cyB0aGF0IG9wZW5lZCBlYWNoIG1vZGFsIChzdXBwb3J0cyBuZXN0ZWQgbW9kYWxzKS4gKi9cbmNvbnN0IF9mb2N1c1N0YWNrID0gW107XG5cbi8qKiBTdGFjayBvZiBmb2N1cy10cmFwIGxpc3RlbmVycyAob25lIHBlciBvcGVuIG1vZGFsKS4gKi9cbmNvbnN0IF9mb2N1c1RyYXBTdGFjayA9IFtdO1xubGV0IF9zZXR0aW5nc0RhdGEgPSBudWxsO1xuY29uc3QgUkVUUllfUE9MSUNZX1NUT1JBR0VfS0VZID0gJ2N2LWJ1aWxkZXItcmV0cnktcG9saWN5JztcblxuZnVuY3Rpb24gX2dldFJldHJ5UG9saWN5RnJvbVN0b3JhZ2UoKSB7XG4gIGNvbnN0IGRlZmF1bHRzID0ge1xuICAgIGJhc2VNczogMTUwMCxcbiAgICBjYXBNczogNjAwMDAsXG4gICAgbWF4QXR0ZW1wdHM6IDYsXG4gICAgYXV0b1JldHJ5OiB0cnVlLFxuICB9O1xuICB0cnkge1xuICAgIGNvbnN0IHJhdyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFJFVFJZX1BPTElDWV9TVE9SQUdFX0tFWSk7XG4gICAgaWYgKCFyYXcpIHJldHVybiBkZWZhdWx0cztcbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHJhdyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGJhc2VNczogTWF0aC5tYXgoMjAwLCBOdW1iZXIocGFyc2VkLmJhc2VNcyB8fCBkZWZhdWx0cy5iYXNlTXMpKSxcbiAgICAgIGNhcE1zOiBNYXRoLm1heCgxMDAwLCBOdW1iZXIocGFyc2VkLmNhcE1zIHx8IGRlZmF1bHRzLmNhcE1zKSksXG4gICAgICBtYXhBdHRlbXB0czogTWF0aC5tYXgoMSwgTnVtYmVyKHBhcnNlZC5tYXhBdHRlbXB0cyB8fCBkZWZhdWx0cy5tYXhBdHRlbXB0cykpLFxuICAgICAgYXV0b1JldHJ5OiBwYXJzZWQuYXV0b1JldHJ5ICE9PSBmYWxzZSxcbiAgICB9O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZGVmYXVsdHM7XG4gIH1cbn1cblxuZnVuY3Rpb24gX3NhdmVSZXRyeVBvbGljeVRvU3RvcmFnZShwb2xpY3kpIHtcbiAgdHJ5IHtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShSRVRSWV9QT0xJQ1lfU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KHBvbGljeSkpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy53YXJuKCdDb3VsZCBub3Qgc2F2ZSByZXRyeSBwb2xpY3kgcHJlZmVyZW5jZTonLCBlcnJvcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX3NldHRpbmdzU291cmNlTGFiZWwobWV0YSwga2V5LCBydW50aW1lT3ZlcnJpZGVzID0gbnVsbCkge1xuICBpZiAocnVudGltZU92ZXJyaWRlcyAmJiBrZXkgaW4gcnVudGltZU92ZXJyaWRlcykge1xuICAgIHJldHVybiAnU291cmNlOiBydW50aW1lIHNlbGVjdGlvbic7XG4gIH1cbiAgY29uc3Qgc291cmNlID0gbWV0YT8uc291cmNlcz8uW2tleV0gfHwgJ2RlZmF1bHQnO1xuICBjb25zdCBlbnZLZXkgPSBtZXRhPy5lbnZfa2V5cz8uW2tleV0gfHwgbnVsbDtcbiAgaWYgKHNvdXJjZSA9PT0gJ2VudicpIHJldHVybiBgU291cmNlOiBlbnZpcm9ubWVudCB2YXJpYWJsZSAoJHtlbnZLZXkgfHwgJ2xvY2tlZCd9KWA7XG4gIGlmIChzb3VyY2UgPT09ICdkb3RlbnYnKSByZXR1cm4gYFNvdXJjZTogLmVudiAoJHtlbnZLZXkgfHwgJ2xvY2tlZCd9KWA7XG4gIGlmIChzb3VyY2UgPT09ICdjb25maWcnKSByZXR1cm4gJ1NvdXJjZTogY29uZmlnLnlhbWwnO1xuICByZXR1cm4gJ1NvdXJjZTogYnVpbHQtaW4gZGVmYXVsdCc7XG59XG5cbmZ1bmN0aW9uIF9yZW5kZXJTZXR0aW5nc1NvdXJjZXMobWV0YSwgcnVudGltZU92ZXJyaWRlcyA9IG51bGwpIHtcbiAgY29uc3Qgc291cmNlVGFyZ2V0cyA9IFtcbiAgICAnbGxtLmRlZmF1bHRfcHJvdmlkZXInLFxuICAgICdsbG0uZGVmYXVsdF9tb2RlbCcsXG4gICAgJ2xsbS5yZXF1ZXN0X3RpbWVvdXRfc2Vjb25kcycsXG4gICAgJ2xsbS50ZW1wZXJhdHVyZScsXG4gICAgJ2dlbmVyYXRpb24ubWF4X3NraWxscycsXG4gICAgJ2dlbmVyYXRpb24ubWF4X2FjaGlldmVtZW50cycsXG4gICAgJ2dlbmVyYXRpb24ubWF4X3B1YmxpY2F0aW9ucycsXG4gICAgJ2dlbmVyYXRpb24uc2tpbGxzX3NlY3Rpb25fdGl0bGUnLFxuICAgICdnZW5lcmF0aW9uLmZvcm1hdHMuYXRzX2RvY3gnLFxuICAgICdnZW5lcmF0aW9uLmZvcm1hdHMuaHVtYW5fcGRmJyxcbiAgICAnZ2VuZXJhdGlvbi5mb3JtYXRzLmh1bWFuX2RvY3gnLFxuICBdO1xuICBzb3VyY2VUYXJnZXRzLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNvdXJjZS0ke2tleX1gKTtcbiAgICBpZiAoIWVsKSByZXR1cm47XG4gICAgZWwudGV4dENvbnRlbnQgPSBfc2V0dGluZ3NTb3VyY2VMYWJlbChtZXRhLCBrZXksIHJ1bnRpbWVPdmVycmlkZXMpO1xuICAgIGNvbnN0IHJ1bnRpbWVLZXkgPSBydW50aW1lT3ZlcnJpZGVzICYmIGtleSBpbiBydW50aW1lT3ZlcnJpZGVzO1xuICAgIGNvbnN0IGlzTG9ja2VkID0gQm9vbGVhbihtZXRhPy5sb2NrZWQ/LltrZXldKTtcbiAgICBlbC5zdHlsZS5jb2xvciA9IHJ1bnRpbWVLZXkgPyAnIzFlNDBhZicgOiAoaXNMb2NrZWQgPyAnI2I0NTMwOScgOiAnIzY0NzQ4YicpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gX3NldFNldHRpbmdzU3RhdHVzKG1lc3NhZ2UsIGtpbmQgPSAnaW5mbycpIHtcbiAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dGluZ3Mtc3RhdHVzLW1zZycpO1xuICBpZiAoIWVsKSByZXR1cm47XG4gIGVsLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgaWYgKGtpbmQgPT09ICdzdWNjZXNzJykge1xuICAgIGVsLnN0eWxlLmJhY2tncm91bmQgPSAnI2VjZmRmNSc7XG4gICAgZWwuc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCAjODZlZmFjJztcbiAgICBlbC5zdHlsZS5jb2xvciA9ICcjMTY2NTM0JztcbiAgfSBlbHNlIGlmIChraW5kID09PSAnZXJyb3InKSB7XG4gICAgZWwuc3R5bGUuYmFja2dyb3VuZCA9ICcjZmVmMmYyJztcbiAgICBlbC5zdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkICNmZWNhY2EnO1xuICAgIGVsLnN0eWxlLmNvbG9yID0gJyM5OTFiMWInO1xuICB9IGVsc2Uge1xuICAgIGVsLnN0eWxlLmJhY2tncm91bmQgPSAnI2VmZjZmZic7XG4gICAgZWwuc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCAjYmZkYmZlJztcbiAgICBlbC5zdHlsZS5jb2xvciA9ICcjMWU0MGFmJztcbiAgfVxuICBlbC50ZXh0Q29udGVudCA9IG1lc3NhZ2U7XG59XG5cbmZ1bmN0aW9uIF9jb2xsZWN0U2V0dGluZ3NQYXlsb2FkRnJvbUZvcm0oKSB7XG4gIHJldHVybiB7XG4gICAgbGxtOiB7XG4gICAgICBkZWZhdWx0X3Byb3ZpZGVyOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dGluZ3MtbGxtLWRlZmF1bHQtcHJvdmlkZXInKT8udmFsdWU/LnRyaW0oKSB8fCBudWxsLFxuICAgICAgZGVmYXVsdF9tb2RlbDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHRpbmdzLWxsbS1kZWZhdWx0LW1vZGVsJyk/LnZhbHVlPy50cmltKCkgfHwgbnVsbCxcbiAgICAgIHJlcXVlc3RfdGltZW91dF9zZWNvbmRzOiBOdW1iZXIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHRpbmdzLWxsbS1yZXF1ZXN0LXRpbWVvdXQnKT8udmFsdWUgfHwgMTIwKSxcbiAgICAgIHRlbXBlcmF0dXJlOiBOdW1iZXIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHRpbmdzLWxsbS10ZW1wZXJhdHVyZScpPy52YWx1ZSB8fCAwLjcpLFxuICAgIH0sXG4gICAgZ2VuZXJhdGlvbjoge1xuICAgICAgbWF4X3NraWxsczogTnVtYmVyKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR0aW5ncy1nZW4tbWF4LXNraWxscycpPy52YWx1ZSB8fCAyMCksXG4gICAgICBtYXhfYWNoaWV2ZW1lbnRzOiBOdW1iZXIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHRpbmdzLWdlbi1tYXgtYWNoaWV2ZW1lbnRzJyk/LnZhbHVlIHx8IDUpLFxuICAgICAgbWF4X3B1YmxpY2F0aW9uczogTnVtYmVyKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR0aW5ncy1nZW4tbWF4LXB1YmxpY2F0aW9ucycpPy52YWx1ZSB8fCAxMCksXG4gICAgICBza2lsbHNfc2VjdGlvbl90aXRsZTogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHRpbmdzLWdlbi1za2lsbHMtdGl0bGUnKT8udmFsdWU/LnRyaW0oKSB8fCAnU2tpbGxzJyxcbiAgICAgIGZvcm1hdHM6IHtcbiAgICAgICAgYXRzX2RvY3g6IEJvb2xlYW4oZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHRpbmdzLWZvcm1hdC1hdHMtZG9jeCcpPy5jaGVja2VkKSxcbiAgICAgICAgaHVtYW5fcGRmOiBCb29sZWFuKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR0aW5ncy1mb3JtYXQtaHVtYW4tcGRmJyk/LmNoZWNrZWQpLFxuICAgICAgICBodW1hbl9kb2N4OiBCb29sZWFuKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR0aW5ncy1mb3JtYXQtaHVtYW4tZG9jeCcpPy5jaGVja2VkKSxcbiAgICAgIH0sXG4gICAgICBhaV9hdHRyaWJ1dGlvbjogQm9vbGVhbihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dGluZ3MtZ2VuLWFpLWF0dHJpYnV0aW9uJyk/LmNoZWNrZWQpLFxuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIF9jb2xsZWN0UmV0cnlQb2xpY3lGcm9tRm9ybSgpIHtcbiAgcmV0dXJuIHtcbiAgICBiYXNlTXM6IE51bWJlcihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dGluZ3MtcmV0cnktYmFzZS1tcycpPy52YWx1ZSB8fCAxNTAwKSxcbiAgICBjYXBNczogTnVtYmVyKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR0aW5ncy1yZXRyeS1jYXAtbXMnKT8udmFsdWUgfHwgNjAwMDApLFxuICAgIG1heEF0dGVtcHRzOiBOdW1iZXIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHRpbmdzLXJldHJ5LW1heC1hdHRlbXB0cycpPy52YWx1ZSB8fCA2KSxcbiAgICBhdXRvUmV0cnk6IEJvb2xlYW4oZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHRpbmdzLXJldHJ5LWF1dG8nKT8uY2hlY2tlZCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIF9yZW5kZXJTZXR0aW5nc1RvRm9ybShwYXlsb2FkKSB7XG4gIGNvbnN0IHNldHRpbmdzID0gcGF5bG9hZD8uc2V0dGluZ3MgfHwge307XG4gIGNvbnN0IGxsbSA9IHNldHRpbmdzLmxsbSB8fCB7fTtcbiAgY29uc3QgZ2VuZXJhdGlvbiA9IHNldHRpbmdzLmdlbmVyYXRpb24gfHwge307XG4gIGNvbnN0IGZvcm1hdHMgPSBnZW5lcmF0aW9uLmZvcm1hdHMgfHwge307XG4gIGNvbnN0IHJ1bnRpbWVQcm92aWRlciA9IHBheWxvYWQ/LnJ1bnRpbWU/LmxsbT8ucHJvdmlkZXIgfHwgbnVsbDtcbiAgY29uc3QgcnVudGltZU1vZGVsID0gcGF5bG9hZD8ucnVudGltZT8ubGxtPy5tb2RlbCB8fCBudWxsO1xuICBjb25zdCBydW50aW1lT3ZlcnJpZGVzID0ge307XG4gIGlmIChydW50aW1lUHJvdmlkZXIpIHJ1bnRpbWVPdmVycmlkZXNbJ2xsbS5kZWZhdWx0X3Byb3ZpZGVyJ10gPSBydW50aW1lUHJvdmlkZXI7XG4gIGlmIChydW50aW1lTW9kZWwpIHJ1bnRpbWVPdmVycmlkZXNbJ2xsbS5kZWZhdWx0X21vZGVsJ10gPSBydW50aW1lTW9kZWw7XG5cbiAgY29uc3Qgc2V0VmFsdWUgPSAoaWQsIHZhbHVlKSA9PiB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgaWYgKGVsKSBlbC52YWx1ZSA9IHZhbHVlID8/ICcnO1xuICB9O1xuICBjb25zdCBzZXRDaGVja2VkID0gKGlkLCB2YWx1ZSkgPT4ge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgIGlmIChlbCkgZWwuY2hlY2tlZCA9IEJvb2xlYW4odmFsdWUpO1xuICB9O1xuXG4gIHNldFZhbHVlKCdzZXR0aW5ncy1sbG0tZGVmYXVsdC1wcm92aWRlcicsIHJ1bnRpbWVQcm92aWRlciB8fCBsbG0uZGVmYXVsdF9wcm92aWRlciB8fCAnJyk7XG4gIHNldFZhbHVlKCdzZXR0aW5ncy1sbG0tZGVmYXVsdC1tb2RlbCcsIHJ1bnRpbWVNb2RlbCB8fCBsbG0uZGVmYXVsdF9tb2RlbCB8fCAnJyk7XG4gIHNldFZhbHVlKCdzZXR0aW5ncy1sbG0tcmVxdWVzdC10aW1lb3V0JywgbGxtLnJlcXVlc3RfdGltZW91dF9zZWNvbmRzID8/IDEyMCk7XG4gIHNldFZhbHVlKCdzZXR0aW5ncy1sbG0tdGVtcGVyYXR1cmUnLCBsbG0udGVtcGVyYXR1cmUgPz8gMC43KTtcblxuICBzZXRWYWx1ZSgnc2V0dGluZ3MtZ2VuLW1heC1za2lsbHMnLCBnZW5lcmF0aW9uLm1heF9za2lsbHMgPz8gMjApO1xuICBzZXRWYWx1ZSgnc2V0dGluZ3MtZ2VuLW1heC1hY2hpZXZlbWVudHMnLCBnZW5lcmF0aW9uLm1heF9hY2hpZXZlbWVudHMgPz8gNSk7XG4gIHNldFZhbHVlKCdzZXR0aW5ncy1nZW4tbWF4LXB1YmxpY2F0aW9ucycsIGdlbmVyYXRpb24ubWF4X3B1YmxpY2F0aW9ucyA/PyAxMCk7XG4gIHNldFZhbHVlKCdzZXR0aW5ncy1nZW4tc2tpbGxzLXRpdGxlJywgZ2VuZXJhdGlvbi5za2lsbHNfc2VjdGlvbl90aXRsZSB8fCAnU2tpbGxzJyk7XG5cbiAgc2V0Q2hlY2tlZCgnc2V0dGluZ3MtZm9ybWF0LWF0cy1kb2N4JywgZm9ybWF0cy5hdHNfZG9jeCk7XG4gIHNldENoZWNrZWQoJ3NldHRpbmdzLWZvcm1hdC1odW1hbi1wZGYnLCBmb3JtYXRzLmh1bWFuX3BkZik7XG4gIHNldENoZWNrZWQoJ3NldHRpbmdzLWZvcm1hdC1odW1hbi1kb2N4JywgZm9ybWF0cy5odW1hbl9kb2N4KTtcbiAgc2V0Q2hlY2tlZCgnc2V0dGluZ3MtZ2VuLWFpLWF0dHJpYnV0aW9uJywgZ2VuZXJhdGlvbi5haV9hdHRyaWJ1dGlvbik7XG5cbiAgY29uc3QgcmV0cnlQb2xpY3kgPSBfZ2V0UmV0cnlQb2xpY3lGcm9tU3RvcmFnZSgpO1xuICBzZXRWYWx1ZSgnc2V0dGluZ3MtcmV0cnktYmFzZS1tcycsIHJldHJ5UG9saWN5LmJhc2VNcyk7XG4gIHNldFZhbHVlKCdzZXR0aW5ncy1yZXRyeS1jYXAtbXMnLCByZXRyeVBvbGljeS5jYXBNcyk7XG4gIHNldFZhbHVlKCdzZXR0aW5ncy1yZXRyeS1tYXgtYXR0ZW1wdHMnLCByZXRyeVBvbGljeS5tYXhBdHRlbXB0cyk7XG4gIHNldENoZWNrZWQoJ3NldHRpbmdzLXJldHJ5LWF1dG8nLCByZXRyeVBvbGljeS5hdXRvUmV0cnkpO1xuXG4gIF9yZW5kZXJTZXR0aW5nc1NvdXJjZXMocGF5bG9hZC5tZXRhIHx8IHt9LCBydW50aW1lT3ZlcnJpZGVzKTtcblxuICBjb25zdCBwYXRoRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dGluZ3MtY29uZmlnLXBhdGgnKTtcbiAgaWYgKHBhdGhFbCkge1xuICAgIHBhdGhFbC50ZXh0Q29udGVudCA9IHBheWxvYWQ/Lm1ldGE/LmNvbmZpZ19wYXRoXG4gICAgICA/IGBDb25maWcgZmlsZTogJHtwYXlsb2FkLm1ldGEuY29uZmlnX3BhdGh9YFxuICAgICAgOiAnJztcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZWxvYWRTZXR0aW5nc01vZGFsKCkge1xuICB0cnkge1xuICAgIF9zZXRTZXR0aW5nc1N0YXR1cygnTG9hZGluZyBzZXR0aW5ncy4uLicsICdpbmZvJyk7XG4gICAgY29uc3QgW3Jlc3VsdCwgc3RhdHVzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtmZXRjaFNldHRpbmdzKCksIGZldGNoU3RhdHVzKCkuY2F0Y2goKCkgPT4gbnVsbCldKTtcbiAgICBfcmVuZGVyU2V0dGluZ3NUb0Zvcm0ocmVzdWx0KTtcbiAgICAvLyBhaV9hdHRyaWJ1dGlvbiBpcyBwZXItc2Vzc2lvbiwgbm90IGluIGNvbmZpZy55YW1sIFx1MjAxNCByZWFkIGZyb20gc2Vzc2lvbiBzdGF0dXNcbiAgICBjb25zdCBhdHRyRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dGluZ3MtZ2VuLWFpLWF0dHJpYnV0aW9uJyk7XG4gICAgaWYgKGF0dHJFbCAmJiBzdGF0dXMpIGF0dHJFbC5jaGVja2VkID0gQm9vbGVhbihzdGF0dXMuYWlfYXR0cmlidXRpb24pO1xuICAgIF9zZXRTZXR0aW5nc1N0YXR1cygnU2V0dGluZ3MgbG9hZGVkLicsICdzdWNjZXNzJyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgX3NldFNldHRpbmdzU3RhdHVzKGBGYWlsZWQgdG8gbG9hZCBzZXR0aW5nczogJHtlcnJvci5tZXNzYWdlIHx8IGVycm9yfWAsICdlcnJvcicpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNhdmVTZXR0aW5nc01vZGFsKCkge1xuICBjb25zdCBzYXZlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHRpbmdzLXNhdmUtYnRuJyk7XG4gIHRyeSB7XG4gICAgaWYgKHNhdmVCdG4pIHtcbiAgICAgIHNhdmVCdG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgc2F2ZUJ0bi50ZXh0Q29udGVudCA9ICdTYXZpbmcuLi4nO1xuICAgIH1cbiAgICBfc2V0U2V0dGluZ3NTdGF0dXMoJ1NhdmluZyBzZXR0aW5ncy4uLicsICdpbmZvJyk7XG4gICAgY29uc3QgcGF5bG9hZCA9IF9jb2xsZWN0U2V0dGluZ3NQYXlsb2FkRnJvbUZvcm0oKTtcbiAgICBjb25zdCBhaUF0dHJpYnV0aW9uID0gQm9vbGVhbihwYXlsb2FkLmdlbmVyYXRpb24/LmFpX2F0dHJpYnV0aW9uKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB1cGRhdGVTZXR0aW5ncyhwYXlsb2FkKTtcbiAgICBfc2F2ZVJldHJ5UG9saWN5VG9TdG9yYWdlKF9jb2xsZWN0UmV0cnlQb2xpY3lGcm9tRm9ybSgpKTtcbiAgICBfc2V0dGluZ3NEYXRhID0gcmVzdWx0O1xuICAgIF9yZW5kZXJTZXR0aW5nc1RvRm9ybShyZXN1bHQpO1xuICAgIC8vIGFpX2F0dHJpYnV0aW9uIGlzIHBlci1zZXNzaW9uIHN0YXRlLCBub3QgYSBjb25maWcueWFtbCBrZXkgXHUyMDE0IHNhdmUgaXQgc2VwYXJhdGVseVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBhcGlDYWxsKCdQT1NUJywgJy9hcGkvZ2VuZXJhdGlvbi1zZXR0aW5ncycsIHsgYWlfYXR0cmlidXRpb246IGFpQXR0cmlidXRpb24gfSk7XG4gICAgfSBjYXRjaCAoXykgeyAvKiBub24tZmF0YWwgKi8gfVxuICAgIF9zZXRTZXR0aW5nc1N0YXR1cygnU2V0dGluZ3Mgc2F2ZWQgc3VjY2Vzc2Z1bGx5LicsICdzdWNjZXNzJyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgX3NldFNldHRpbmdzU3RhdHVzKGBGYWlsZWQgdG8gc2F2ZSBzZXR0aW5nczogJHtlcnJvci5tZXNzYWdlIHx8IGVycm9yfWAsICdlcnJvcicpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChzYXZlQnRuKSB7XG4gICAgICBzYXZlQnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICBzYXZlQnRuLnRleHRDb250ZW50ID0gJ1NhdmUgU2V0dGluZ3MnO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBvcGVuU2V0dGluZ3NNb2RhbCgpIHtcbiAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR0aW5ncy1tb2RhbC1vdmVybGF5Jyk7XG4gIGlmICghb3ZlcmxheSkgcmV0dXJuO1xuICBvdmVybGF5LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIF9mb2N1c1N0YWNrLnB1c2goZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7XG4gIHNldEluaXRpYWxGb2N1cygnc2V0dGluZ3MtbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ3NldHRpbmdzLW1vZGFsLW92ZXJsYXknKTtcbiAgYXdhaXQgcmVsb2FkU2V0dGluZ3NNb2RhbCgpO1xufVxuXG5mdW5jdGlvbiBjbG9zZVNldHRpbmdzTW9kYWwoKSB7XG4gIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dGluZ3MtbW9kYWwtb3ZlcmxheScpO1xuICBpZiAob3ZlcmxheSkgb3ZlcmxheS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICByZXN0b3JlRm9jdXMoKTtcbn1cblxuLyoqXG4gKiBHZXQgYWxsIGZvY3VzYWJsZSBlbGVtZW50cyB3aXRoaW4gYSBjb250YWluZXIuXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBjb250YWluZXIgLSBUaGUgbW9kYWwgb3IgY29udGFpbmVyIGVsZW1lbnRcbiAqIEByZXR1cm5zIHtIVE1MRWxlbWVudFtdfSBBcnJheSBvZiBmb2N1c2FibGUgZWxlbWVudHNcbiAqL1xuZnVuY3Rpb24gZ2V0Rm9jdXNhYmxlRWxlbWVudHMoY29udGFpbmVyKSB7XG4gIGNvbnN0IGZvY3VzYWJsZVNlbGVjdG9ycyA9IFtcbiAgICAnYVtocmVmXScsICdidXR0b246bm90KFtkaXNhYmxlZF0pJywgJ2lucHV0Om5vdChbZGlzYWJsZWRdKScsXG4gICAgJ3RleHRhcmVhOm5vdChbZGlzYWJsZWRdKScsICdzZWxlY3Q6bm90KFtkaXNhYmxlZF0pJyxcbiAgICAnW3RhYmluZGV4XTpub3QoW3RhYmluZGV4PVwiLTFcIl0pJyxcbiAgXS5qb2luKCcsICcpO1xuICByZXR1cm4gQXJyYXkuZnJvbShjb250YWluZXIucXVlcnlTZWxlY3RvckFsbChmb2N1c2FibGVTZWxlY3RvcnMpKTtcbn1cblxuLyoqXG4gKiBTZXQgaW5pdGlhbCBmb2N1cyB0byB0aGUgZmlyc3QgZm9jdXNhYmxlIGVsZW1lbnQgaW4gYSBtb2RhbC5cbiAqIFByaW9yaXRpemVzIGVsZW1lbnRzIHdpdGggaWQ9XCJbbW9kYWxJZF0tZm9jdXMtdGFyZ2V0XCIgaWYgcHJlc2VudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RhbElkIC0gSUQgb2YgdGhlIG1vZGFsXG4gKi9cbmZ1bmN0aW9uIHNldEluaXRpYWxGb2N1cyhtb2RhbElkKSB7XG4gIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobW9kYWxJZCk7XG4gIGlmICghbW9kYWwpIHJldHVybjtcblxuICAvLyBUcnkgdG8gZm9jdXMgYW4gZXhwbGljaXQgdGFyZ2V0IChlLmcuLCBpbnB1dCBmaWVsZCB3aXRoIGNsYXNzL2lkKVxuICBjb25zdCBmb2N1c1RhcmdldCA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWZvY3VzLXRhcmdldD1cInRydWVcIl0nKSB8fFxuICAgICAgICAgICAgICAgICAgICAgIG1vZGFsLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W3R5cGU9XCJ0ZXh0XCJdJykgfHxcbiAgICAgICAgICAgICAgICAgICAgICBtb2RhbC5xdWVyeVNlbGVjdG9yKCdidXR0b24nKTtcblxuICBpZiAoZm9jdXNUYXJnZXQpIHtcbiAgICAvLyBTbWFsbCBkZWxheSB0byBlbnN1cmUgbW9kYWwgcmVuZGVyICsgYWN0dWFsIGRpc3BsYXlcbiAgICBzZXRUaW1lb3V0KCgpID0+IGZvY3VzVGFyZ2V0LmZvY3VzKCksIDUwKTtcbiAgfVxufVxuXG4vKipcbiAqIFRyYXAgZm9jdXMgd2l0aGluIGEgbW9kYWwgdXNpbmcgVGFiL1NoaWZ0K1RhYi5cbiAqIFByZXZlbnRzIHVzZXIgdGFiYmluZyB0byBlbGVtZW50cyBvdXRzaWRlIHRoZSBtb2RhbC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RhbElkIC0gSUQgb2YgdGhlIG1vZGFsXG4gKi9cbmZ1bmN0aW9uIHRyYXBGb2N1cyhtb2RhbElkKSB7XG4gIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobW9kYWxJZCk7XG4gIGlmICghbW9kYWwpIHJldHVybjtcblxuICBjb25zdCBmb2N1c2FibGVFbGVtZW50cyA9IGdldEZvY3VzYWJsZUVsZW1lbnRzKG1vZGFsKTtcbiAgaWYgKGZvY3VzYWJsZUVsZW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIGNvbnN0IGZpcnN0RWxlbWVudCA9IGZvY3VzYWJsZUVsZW1lbnRzWzBdO1xuICBjb25zdCBsYXN0RWxlbWVudCA9IGZvY3VzYWJsZUVsZW1lbnRzW2ZvY3VzYWJsZUVsZW1lbnRzLmxlbmd0aCAtIDFdO1xuXG4gIGNvbnN0IGxpc3RlbmVyID0gKGUpID0+IHtcbiAgICBpZiAoZS5rZXkgIT09ICdUYWInKSByZXR1cm47XG5cbiAgICBjb25zdCBpc1NoaWZ0ID0gZS5zaGlmdEtleTtcbiAgICBjb25zdCBhY3RpdmVFbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG5cbiAgICBpZiAoaXNTaGlmdCkge1xuICAgICAgaWYgKGFjdGl2ZUVsID09PSBmaXJzdEVsZW1lbnQpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBsYXN0RWxlbWVudC5mb2N1cygpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoYWN0aXZlRWwgPT09IGxhc3RFbGVtZW50KSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZmlyc3RFbGVtZW50LmZvY3VzKCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBsaXN0ZW5lcik7XG4gIF9mb2N1c1RyYXBTdGFjay5wdXNoKGxpc3RlbmVyKTtcbn1cblxuLyoqXG4gKiBSZXN0b3JlIGZvY3VzIHRvIHRoZSBlbGVtZW50IHRoYXQgb3BlbmVkIHRoZSBtb2RhbC5cbiAqL1xuZnVuY3Rpb24gcmVzdG9yZUZvY3VzKCkge1xuICBjb25zdCBlbCA9IF9mb2N1c1N0YWNrLnBvcCgpO1xuICBpZiAoZWwgJiYgdHlwZW9mIGVsLmZvY3VzID09PSAnZnVuY3Rpb24nKSBlbC5mb2N1cygpO1xuXG4gIGNvbnN0IGxpc3RlbmVyID0gX2ZvY3VzVHJhcFN0YWNrLnBvcCgpO1xuICBpZiAobGlzdGVuZXIpIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBsaXN0ZW5lcik7XG59XG5cbmZ1bmN0aW9uIHB1c2hGb2N1c1N0YWNrKGVsKSB7XG4gIF9mb2N1c1N0YWNrLnB1c2goZWwgfHwgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7XG59XG5cbi8qKiBNYXBzIGVhY2ggd29ya2Zsb3cgc3RhZ2UgKHRvcCBiYXIpIHRvIHRoZSB0YWJzIHNob3duIGluIHRoZSBzZWNvbmQgbmF2IGJhci4gKi9cbmNvbnN0IFNUQUdFX1RBQlMgPSB7XG4gIGpvYjogICAgICAgICAgICBbJ2pvYicsICdtYXN0ZXInXSxcbiAgYW5hbHlzaXM6ICAgICAgIFsnYW5hbHlzaXMnXSxcbiAgY3VzdG9taXphdGlvbnM6IFsnZ29hbHMnLCAncXVlc3Rpb25zJywgJ2V4cC1yZXZpZXcnLCAnYWNoLWVkaXRvcicsICdza2lsbHMtcmV2aWV3JywgJ2FjaGlldmVtZW50cy1yZXZpZXcnLCAndGFnbGluZS1yZXZpZXcnLCAnc3VtbWFyeS1yZXZpZXcnLCAncHVibGljYXRpb25zLXJldmlldycsICdhdHMtc2NvcmUnXSxcbiAgcmV3cml0ZTogICAgICAgIFsncmV3cml0ZSddLFxuICBzcGVsbDogICAgICAgICAgWydzcGVsbCddLFxuICBsYXlvdXQ6ICAgICAgICAgWydsYXlvdXQnXSxcbiAgZG93bmxvYWQ6ICAgICAgIFsnZmluYWxfZ2VuZXJhdGUnLCAnZG93bmxvYWQnXSxcbiAgY292ZXJfbGV0dGVyOiAgIFsnY292ZXItbGV0dGVyJ10sXG4gIHNjcmVlbmluZzogICAgICBbJ3NjcmVlbmluZyddLFxuICBpbnRlcnZpZXdfcHJlcDogWydpbnRlcnZpZXctcHJlcCddLFxuICB0aGFua195b3U6ICAgICAgWyd0aGFuay15b3UnXSxcbiAgaGFydmVzdDogICAgICAgIFsnaGFydmVzdCddLFxufTtcblxuLyoqXG4gKiBDdXN0b20gY29uZmlybSBkaWFsb2cgXHUyMDE0IHJldHVybnMgYSBQcm9taXNlPGJvb2xlYW4+LlxuICogUmVwbGFjZXMgYnJvd3NlciBjb25maXJtKCkgd2hpY2ggY2FuIGJlIHNpbGVudGx5IHN1cHByZXNzZWQgb25jZSB0aGUgdXNlclxuICogY2hlY2tzIFwiUHJldmVudCB0aGlzIHBhZ2UgZnJvbSBjcmVhdGluZyBhZGRpdGlvbmFsIGRpYWxvZ3NcIi5cbiAqXG4gKiBVc2FnZTogIGlmIChhd2FpdCBjb25maXJtRGlhbG9nKCdBcmUgeW91IHN1cmU/JykpIHsgLi4uIH1cbiAqL1xuZnVuY3Rpb24gY29uZmlybURpYWxvZyhtZXNzYWdlLCB7IGNvbmZpcm1MYWJlbCA9ICdPSycsIGNhbmNlbExhYmVsID0gJ0NhbmNlbCcsIGRhbmdlciA9IGZhbHNlIH0gPSB7fSkge1xuICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgY29uc3QgcHJldmlvdXNGb2N1cyA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG5cbiAgICAvLyBSZXVzZSBvciBjcmVhdGUgdGhlIHNoYXJlZCBvdmVybGF5IGVsZW1lbnRcbiAgICBsZXQgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb25maXJtLWRpYWxvZy1vdmVybGF5Jyk7XG4gICAgaWYgKCFvdmVybGF5KSB7XG4gICAgICBvdmVybGF5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBvdmVybGF5LmlkID0gJ2NvbmZpcm0tZGlhbG9nLW92ZXJsYXknO1xuICAgICAgb3ZlcmxheS5zdHlsZS5jc3NUZXh0ID1cbiAgICAgICAgJ2Rpc3BsYXk6bm9uZTsgcG9zaXRpb246Zml4ZWQ7IGluc2V0OjA7IGJhY2tncm91bmQ6cmdiYSgwLDAsMCwwLjQ1KTsgei1pbmRleDo5OTk5OycgK1xuICAgICAgICAnYWxpZ24taXRlbXM6Y2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyOyc7XG4gICAgICBvdmVybGF5LmlubmVySFRNTCA9XG4gICAgICAgICc8ZGl2IGlkPVwiY29uZmlybS1kaWFsb2ctYm94XCIgcm9sZT1cImRpYWxvZ1wiIGFyaWEtbW9kYWw9XCJ0cnVlXCInICtcbiAgICAgICAgJyBhcmlhLWxhYmVsbGVkYnk9XCJjb25maXJtLWRpYWxvZy1tc2dcIicgK1xuICAgICAgICAnIHN0eWxlPVwiYmFja2dyb3VuZDojZmZmOyBib3JkZXItcmFkaXVzOjhweDsgcGFkZGluZzoyNHB4IDI4cHg7JyArXG4gICAgICAgICdtYXgtd2lkdGg6NDAwcHg7IHdpZHRoOjkwJTsgYm94LXNoYWRvdzowIDhweCAzMnB4IHJnYmEoMCwwLDAsMC4xOCk7IGZvbnQtZmFtaWx5OmluaGVyaXQ7XCI+JyArXG4gICAgICAgICc8cCBpZD1cImNvbmZpcm0tZGlhbG9nLW1zZ1wiIHN0eWxlPVwibWFyZ2luOjAgMCAyMHB4OyBmb250LXNpemU6MC45NWVtOyBjb2xvcjojMWUyOTNiOyB3aGl0ZS1zcGFjZTpwcmUtd3JhcDtcIj48L3A+JyArXG4gICAgICAgICc8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4OyBnYXA6OHB4OyBqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmQ7XCI+JyArXG4gICAgICAgICc8YnV0dG9uIGlkPVwiY29uZmlybS1kaWFsb2ctY2FuY2VsXCIgc3R5bGU9XCJwYWRkaW5nOjZweCAxNnB4OyBib3JkZXI6MXB4IHNvbGlkICNjYmQ1ZTE7JyArXG4gICAgICAgICdib3JkZXItcmFkaXVzOjVweDsgYmFja2dyb3VuZDojZjhmYWZjOyBjdXJzb3I6cG9pbnRlcjsgY29sb3I6IzQ3NTU2OTtcIj48L2J1dHRvbj4nICtcbiAgICAgICAgJzxidXR0b24gaWQ9XCJjb25maXJtLWRpYWxvZy1va1wiIHN0eWxlPVwicGFkZGluZzo2cHggMTZweDsgYm9yZGVyOm5vbmU7JyArXG4gICAgICAgICdib3JkZXItcmFkaXVzOjVweDsgY3Vyc29yOnBvaW50ZXI7IGNvbG9yOiNmZmY7IGZvbnQtd2VpZ2h0OjYwMDtcIj48L2J1dHRvbj4nICtcbiAgICAgICAgJzwvZGl2PjwvZGl2Pic7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG92ZXJsYXkpO1xuICAgIH1cblxuICAgIGNvbnN0IG9rQnRuICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb25maXJtLWRpYWxvZy1vaycpO1xuICAgIGNvbnN0IGNhbmNlbEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb25maXJtLWRpYWxvZy1jYW5jZWwnKTtcbiAgICBjb25zdCBtc2dFbCAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29uZmlybS1kaWFsb2ctbXNnJyk7XG5cbiAgICBtc2dFbC50ZXh0Q29udGVudCAgICAgICAgICA9IG1lc3NhZ2U7XG4gICAgb2tCdG4udGV4dENvbnRlbnQgICAgICAgICAgPSBjb25maXJtTGFiZWw7XG4gICAgY2FuY2VsQnRuLnRleHRDb250ZW50ICAgICAgPSBjYW5jZWxMYWJlbDtcbiAgICBva0J0bi5zdHlsZS5iYWNrZ3JvdW5kICAgICA9IGRhbmdlciA/ICcjZGMyNjI2JyA6ICcjM2I4MmY2JztcblxuICAgIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICBva0J0bi5mb2N1cygpO1xuXG4gICAgLy8gRm9jdXMgdHJhcCBcdTIwMTQga2VlcCBUYWIvU2hpZnQrVGFiIGluc2lkZSB0aGUgdHdvIGJ1dHRvbnNcbiAgICBjb25zdCB0cmFwRm9jdXMgPSAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ICE9PSAnVGFiJykgcmV0dXJuO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgY29uc3QgZm9jdXNlZCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoZS5zaGlmdEtleSkge1xuICAgICAgICAoZm9jdXNlZCA9PT0gY2FuY2VsQnRuID8gb2tCdG4gOiBjYW5jZWxCdG4pLmZvY3VzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAoZm9jdXNlZCA9PT0gb2tCdG4gPyBjYW5jZWxCdG4gOiBva0J0bikuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIG92ZXJsYXkuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRyYXBGb2N1cyk7XG5cbiAgICBjb25zdCBmaW5pc2ggPSAocmVzdWx0KSA9PiB7XG4gICAgICBvdmVybGF5LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICBvdmVybGF5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0cmFwRm9jdXMpO1xuICAgICAgLy8gUmVtb3ZlIGxpc3RlbmVycyB0byBhdm9pZCBzdGFja2luZyBoYW5kbGVyc1xuICAgICAgb2tCdG4ucmVwbGFjZVdpdGgob2tCdG4uY2xvbmVOb2RlKHRydWUpKTtcbiAgICAgIGNhbmNlbEJ0bi5yZXBsYWNlV2l0aChjYW5jZWxCdG4uY2xvbmVOb2RlKHRydWUpKTtcbiAgICAgIGlmIChwcmV2aW91c0ZvY3VzICYmIHR5cGVvZiBwcmV2aW91c0ZvY3VzLmZvY3VzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHByZXZpb3VzRm9jdXMuZm9jdXMoKTtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICB9O1xuXG4gICAgLy8gRXNjYXBlIGtleSBjYW5jZWxzXG4gICAgb3ZlcmxheS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGUpID0+IHsgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgZmluaXNoKGZhbHNlKTsgfSwgeyBvbmNlOiB0cnVlIH0pO1xuXG4gICAgLy8gUmViaW5kIGNsb25lZCBidXR0b25zXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbmZpcm0tZGlhbG9nLW9rJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAgICAgKCkgPT4gZmluaXNoKHRydWUpLCAgeyBvbmNlOiB0cnVlIH0pO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb25maXJtLWRpYWxvZy1jYW5jZWwnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IGZpbmlzaChmYWxzZSksIHsgb25jZTogdHJ1ZSB9KTtcbiAgICBvdmVybGF5LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZSA9PiB7IGlmIChlLnRhcmdldCA9PT0gb3ZlcmxheSkgZmluaXNoKGZhbHNlKTsgfSwgeyBvbmNlOiB0cnVlIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplIHRoZSBhcHBsaWNhdGlvbiBvbiBET00gcmVhZHkuXG4gKiBTZXRzIHVwIGV2ZW50IGxpc3RlbmVycywgcmVzdG9yZXMgc2Vzc2lvbiwgYW5kIGxvYWRzIGluaXRpYWwgdGFiLlxuICovXG4vKipcbiAqIFNldCB1cCBhbGwgZ2xvYmFsIGV2ZW50IGxpc3RlbmVycy5cbiAqL1xuZnVuY3Rpb24gc2V0dXBFdmVudExpc3RlbmVycygpIHtcbiAgLy8gVGFiIGJ1dHRvbnNcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnRhYicpLmZvckVhY2godGFiID0+IHtcbiAgICB0YWIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgY29uc3QgdGFiTmFtZSA9IGUudGFyZ2V0LmlkLnJlcGxhY2UoJ3RhYi0nLCAnJyk7XG4gICAgICBzd2l0Y2hUYWIodGFiTmFtZSk7XG4gICAgfSk7XG5cbiAgICAvLyBLZXlib2FyZCBuYXZpZ2F0aW9uIGZvciB0YWJzIChXQ0FHIDIuMSBBQSB0YWJsaXN0IHBhdHRlcm4pXG4gICAgdGFiLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4ge1xuICAgICAgLy8gRW50ZXIvU3BhY2UgYWN0aXZhdGUgdGhlIGZvY3VzZWQgdGFiXG4gICAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicgfHwgZS5rZXkgPT09ICcgJykge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUudGFyZ2V0LmNsaWNrKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIEFycm93L0hvbWUvRW5kIG5hdmlnYXRlIGFuZCBhY3RpdmF0ZVxuICAgICAgaWYgKFsnQXJyb3dMZWZ0JywgJ0Fycm93UmlnaHQnLCAnSG9tZScsICdFbmQnXS5pbmNsdWRlcyhlLmtleSkpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjb25zdCB0YWJzID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudGFiOm5vdChbc3R5bGUqPVwiZGlzcGxheTogbm9uZVwiXSknKSk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IHRhYnMuaW5kZXhPZihlLnRhcmdldCk7XG5cbiAgICAgICAgbGV0IG5leHRUYWI7XG4gICAgICAgIGlmIChlLmtleSA9PT0gJ0Fycm93TGVmdCcgfHwgZS5rZXkgPT09ICdIb21lJykge1xuICAgICAgICAgIG5leHRUYWIgPSBlLmtleSA9PT0gJ0hvbWUnID8gdGFic1swXSA6IHRhYnNbKGN1cnJlbnRJbmRleCAtIDEgKyB0YWJzLmxlbmd0aCkgJSB0YWJzLmxlbmd0aF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV4dFRhYiA9IGUua2V5ID09PSAnRW5kJyA/IHRhYnNbdGFicy5sZW5ndGggLSAxXSA6IHRhYnNbKGN1cnJlbnRJbmRleCArIDEpICUgdGFicy5sZW5ndGhdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5leHRUYWIpIHtcbiAgICAgICAgICBuZXh0VGFiLmZvY3VzKCk7XG4gICAgICAgICAgbmV4dFRhYi5jbGljaygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIE1lc3NhZ2UgaW5wdXQgKEVudGVyIGtleSB0byBzZW5kKVxuICBjb25zdCBtZXNzYWdlSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWVzc2FnZS1pbnB1dCcpO1xuICBpZiAobWVzc2FnZUlucHV0KSB7XG4gICAgbWVzc2FnZUlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXByZXNzJywgKGUpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJyAmJiAhZS5zaGlmdEtleSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcy5zZW5kTWVzc2FnZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGdsb2JhbFRoaXMuc2VuZE1lc3NhZ2UoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gTW9kYWwgY2xvc2Ugb24gRVNDIGtleVxuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGUpID0+IHtcbiAgICBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICBjbG9zZUFsbE1vZGFscygpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gQ2xvc2UgbW9kYWxzIG9uIGJhY2tncm91bmQgY2xpY2tcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW3JvbGU9XCJkaWFsb2dcIl0nKS5mb3JFYWNoKG1vZGFsID0+IHtcbiAgICBtb2RhbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICBpZiAoZS50YXJnZXQgPT09IG1vZGFsKSB7XG4gICAgICAgIGNsb3NlTW9kYWwobW9kYWwuaWQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdGhlIHN0YWdlIHRoYXQgb3ducyBhIGdpdmVuIHRhYiwgb3IgbnVsbCBpZiB1bm1hcHBlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWJcbiAqIEByZXR1cm5zIHtzdHJpbmd8bnVsbH1cbiAqL1xuZnVuY3Rpb24gZ2V0U3RhZ2VGb3JUYWIodGFiKSB7XG4gIGZvciAoY29uc3QgW3N0YWdlLCB0YWJzXSBvZiBPYmplY3QuZW50cmllcyhTVEFHRV9UQUJTKSkge1xuICAgIGlmICh0YWJzLmluY2x1ZGVzKHRhYikpIHJldHVybiBzdGFnZTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0VmlzaWJsZVN0YWdlKCkge1xuICBjb25zdCBhY3RpdmVUYWIgPSBzdGF0ZU1hbmFnZXIuZ2V0Q3VycmVudFRhYigpO1xuICByZXR1cm4gZ2V0U3RhZ2VGb3JUYWIoYWN0aXZlVGFiKSB8fCBnZXRXb3JrZmxvd1N0ZXBGb3JQaGFzZShzdGF0ZU1hbmFnZXIuZ2V0UGhhc2UoKSk7XG59XG5cbi8qKlxuICogU2hvdy9oaWRlIHRoZSBzY3JvbGwgYXJyb3cgYnV0dG9ucyBiYXNlZCBvbiB3aGV0aGVyIHRoZSB0YWIgYmFyIGlzIHNjcm9sbGFibGUuXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZVRhYlNjcm9sbEJ1dHRvbnMoKSB7XG4gIGNvbnN0IHRhYkJhciAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFiLWJhcicpO1xuICBjb25zdCBsZWZ0QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYi1zY3JvbGwtbGVmdCcpO1xuICBjb25zdCByaWdodEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWItc2Nyb2xsLXJpZ2h0Jyk7XG4gIGlmICghdGFiQmFyIHx8ICFsZWZ0QnRuIHx8ICFyaWdodEJ0bikgcmV0dXJuO1xuICBsZWZ0QnRuLnN0eWxlLmRpc3BsYXkgID0gdGFiQmFyLnNjcm9sbExlZnQgPiAwID8gJycgOiAnbm9uZSc7XG4gIHJpZ2h0QnRuLnN0eWxlLmRpc3BsYXkgPSB0YWJCYXIuc2Nyb2xsTGVmdCA8IHRhYkJhci5zY3JvbGxXaWR0aCAtIHRhYkJhci5jbGllbnRXaWR0aCAtIDEgPyAnJyA6ICdub25lJztcbn1cblxuLyoqXG4gKiBTaG93IG9ubHkgdGhlIHRhYnMgdGhhdCBiZWxvbmcgdG8gdGhlIGdpdmVuIHN0YWdlIGluIHRoZSBzZWNvbmQgbmF2IGJhci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzdGFnZSAtIEtleSBmcm9tIFNUQUdFX1RBQlNcbiAqL1xuZnVuY3Rpb24gdXBkYXRlVGFiQmFyRm9yU3RhZ2Uoc3RhZ2UpIHtcbiAgY29uc3Qgc3RhZ2VUYWJzID0gU1RBR0VfVEFCU1tzdGFnZV0gfHwgW107XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50YWInKS5mb3JFYWNoKHRhYiA9PiB7XG4gICAgdGFiLnN0eWxlLmRpc3BsYXkgPSBzdGFnZVRhYnMuaW5jbHVkZXModGFiLmRhdGFzZXQudGFiKSA/ICcnIDogJ25vbmUnO1xuICB9KTtcbiAgLy8gUmVzZXQgc2Nyb2xsIHBvc2l0aW9uIHRvIHNob3cgYWN0aXZlIHRhYiwgdGhlbiByZWZyZXNoIGFycm93IHZpc2liaWxpdHlcbiAgY29uc3QgdGFiQmFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYi1iYXInKTtcbiAgaWYgKHRhYkJhcikgdGFiQmFyLnNjcm9sbExlZnQgPSAwO1xuICB1cGRhdGVUYWJTY3JvbGxCdXR0b25zKCk7XG59XG5cbi8vIGxvYWRUYWJDb250ZW50KCkgbGl2ZXMgaW4gd2ViL3Jldmlldy10YWJsZS1iYXNlLmpzLCB3aGljaCBvd25zIHRoZVxuLy8gZnVsbCB+MjAtY2FzZSB0YWIgZGlzcGF0Y2ggKHRoaXMgZmlsZSdzIGNvcHkgb25seSBldmVyIGhhbmRsZWQgNSBvZiB0aGVtXG4vLyBhbmQgd2FzIG5ldmVyIGNhbGxlZCBpbnRlcm5hbGx5IFx1MjAxNCBkZWFkIGNvZGUsIHN1cGVyc2VkZWQgb25jZSB0aGUgdGFiXG4vLyBzeXN0ZW0gZ3JldykuIHJldmlldy10YWJsZS1iYXNlLmpzJ3MgdmVyc2lvbiBub3cgY2FycmllcyB0aGUgc2FtZVxuLy8gc2FmZSB0ZXh0Q29udGVudC1iYXNlZCBlcnJvciByZW5kZXJpbmcgdGhpcyBjb3B5IGhhZDsgc2VlIGl0cyBvd25cbi8vIHRyeS9jYXRjaC4gUmVtb3ZlZCBoZXJlIHJhdGhlciB0aGFuIGxlZnQgdG8gZHJpZnQgZnVydGhlciBvdXQgb2Ygc3luYy5cblxuLyoqXG4gKiBUb2dnbGUgY29sbGFwc2libGUgY2hhdCBwYW5lbCAoaW50ZXJhY3Rpb24gYXJlYSkuXG4gKi9cbmZ1bmN0aW9uIHRvZ2dsZUNoYXQoKSB7XG4gIGNvbnN0IGludGVyYWN0aW9uQXJlYSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5pbnRlcmFjdGlvbi1hcmVhJyk7XG4gIGNvbnN0IHZpZXdlckFyZWEgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudmlld2VyLWFyZWEnKTtcblxuICBpZiAoaW50ZXJhY3Rpb25BcmVhKSB7XG4gICAgY29uc3QgaXNDb2xsYXBzZWQgPSBpbnRlcmFjdGlvbkFyZWEuY2xhc3NMaXN0LnRvZ2dsZSgnY29sbGFwc2VkJyk7XG4gICAgaWYgKHZpZXdlckFyZWEpIHtcbiAgICAgIHZpZXdlckFyZWEuc3R5bGUuZmxleCA9IGlzQ29sbGFwc2VkID8gJzEgMSAxMDAlJyA6ICcwIDEgNjAlJztcbiAgICB9XG4gICAgLy8gS2VlcCBhcmlhLWxhYmVsIGFuZCBhcmlhLWV4cGFuZGVkIGluIHN5bmMgd2l0aCBjb2xsYXBzZWQgc3RhdGVcbiAgICBjb25zdCB0b2dnbGVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9nZ2xlLWNoYXQnKTtcbiAgICBpZiAodG9nZ2xlQnRuKSB7XG4gICAgICB0b2dnbGVCdG4uc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgU3RyaW5nKCFpc0NvbGxhcHNlZCkpO1xuICAgICAgdG9nZ2xlQnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIGlzQ29sbGFwc2VkID8gJ0V4cGFuZCBjaGF0IHBhbmVsJyA6ICdDb2xsYXBzZSBjaGF0IHBhbmVsJyk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShTdG9yYWdlS2V5cy5DSEFUX0NPTExBUFNFRCwgaXNDb2xsYXBzZWQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZy53YXJuKCdDb3VsZCBub3Qgc2F2ZSBjaGF0IHN0YXRlJyk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogT3BlbiBhIG1vZGFsIGJ5IElELlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGFsSWQgLSBJRCBvZiBtb2RhbCBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIG9wZW5Nb2RhbChtb2RhbElkKSB7XG4gIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobW9kYWxJZCk7XG4gIGlmIChtb2RhbCkge1xuICAgIC8vIFNhdmUgZm9jdXMgYmVmb3JlIG9wZW5pbmcgbW9kYWxcbiAgICBfZm9jdXNTdGFjay5wdXNoKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpO1xuXG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgndmlzaWJsZScpO1xuICAgIG1vZGFsLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAnZmFsc2UnKTtcbiAgICAvLyBMb2NrIGJvZHkgc2Nyb2xsXG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuXG4gICAgLy8gU2V0IGluaXRpYWwgZm9jdXMgYW5kIHRyYXAgZm9jdXMgd2l0aGluIG1vZGFsXG4gICAgc2V0SW5pdGlhbEZvY3VzKG1vZGFsSWQpO1xuICAgIHRyYXBGb2N1cyhtb2RhbElkKTtcbiAgfVxufVxuXG4vKipcbiAqIENsb3NlIGEgbW9kYWwgYnkgSUQuXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kYWxJZCAtIElEIG9mIG1vZGFsIGVsZW1lbnRcbiAqL1xuZnVuY3Rpb24gY2xvc2VNb2RhbChtb2RhbElkKSB7XG4gIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobW9kYWxJZCk7XG4gIGlmIChtb2RhbCkge1xuICAgIGlmIChtb2RhbC5kYXRhc2V0LmRpc21pc3NEaXNhYmxlZCA9PT0gJzEnKSByZXR1cm47XG4gICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZScpO1xuICAgIG1vZGFsLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xuICAgIC8vIFJlc3RvcmUgYm9keSBzY3JvbGxcbiAgICBpZiAoIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tyb2xlPVwiZGlhbG9nXCJdLnZpc2libGUnKSkge1xuICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICcnO1xuICAgIH1cbiAgICAvLyBSZXN0b3JlIGZvY3VzXG4gICAgcmVzdG9yZUZvY3VzKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBDbG9zZSBhbGwgb3BlbiBtb2RhbHMuXG4gKi9cbmZ1bmN0aW9uIGNsb3NlQWxsTW9kYWxzKCkge1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbcm9sZT1cImRpYWxvZ1wiXScpLmZvckVhY2gobW9kYWwgPT4ge1xuICAgIGlmIChtb2RhbC5kYXRhc2V0LmRpc21pc3NEaXNhYmxlZCA9PT0gJzEnKSByZXR1cm47XG4gICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZScpO1xuICAgIG1vZGFsLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xuICAgIGlmIChtb2RhbC5zdHlsZS5kaXNwbGF5ICYmIG1vZGFsLnN0eWxlLmRpc3BsYXkgIT09ICdub25lJykge1xuICAgICAgbW9kYWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9XG4gIH0pO1xuICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJyc7XG4gIC8vIFJlc3RvcmUgZm9jdXNcbiAgcmVzdG9yZUZvY3VzKCk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBNb2RlbCBzZWxlY3RvciBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxubGV0IF9tb2RlbERhdGEgPSBudWxsOyAvLyBjYWNoZWQgZnJvbSBsYXN0IGxvYWRNb2RlbFNlbGVjdG9yKCkgY2FsbFxubGV0IF9tb2RlbERhdGFUYWJsZSA9IG51bGw7XG5sZXQgX3NlbGVjdGVkTW9kZWxQcm92aWRlcnMgPSBuZXcgU2V0KCk7XG5sZXQgX21vZGVsU2VsZWN0b3JMb2FkaW5nID0gZmFsc2U7ICAgLy8gZ3VhcmQ6IGxvYWRNb2RlbFNlbGVjdG9yKCkgaW4gZmxpZ2h0XG5sZXQgX2NhdGFsb2dSZWZyZXNoaW5nID0gZmFsc2U7ICAgICAgLy8gZ3VhcmQ6IF9yZWZyZXNoTW9kZWxDYXRhbG9nRm9yU2VsZWN0aW9uKCkgaW4gZmxpZ2h0XG5sZXQgX2NhdGFsb2dSZWZyZXNoUGVuZGluZyA9IGZhbHNlOyAgLy8gcXVldWUgb25lIHJlcnVuIHdoZW4gdG9nZ2xlcyBoYXBwZW4gbWlkLXJlZnJlc2hcbmxldCBfc2hvd0Z1bGxNb2RlbENhdGFsb2cgPSBmYWxzZTtcbmxldCBfY29waWxvdEF1dGhQb2xsVGltZXIgPSBudWxsO1xubGV0IF9tb2RlbFdpemFyZFN0ZXAgPSAxO1xubGV0IF9tb2RlbFdpemFyZFNlbGVjdGVkUHJvdmlkZXIgPSBudWxsO1xuXG5cbmZ1bmN0aW9uIF9nZXRNb2RlbFByZWZzRnJvbVN0b3JhZ2UoKSB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2F2ZWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShTdG9yYWdlS2V5cy5UQUJfREFUQSk7XG4gICAgcmV0dXJuIHNhdmVkID8gKEpTT04ucGFyc2Uoc2F2ZWQpIHx8IHt9KSA6IHt9O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4ge307XG4gIH1cbn1cblxuZnVuY3Rpb24gX3NhdmVNb2RlbFByZWZzVG9TdG9yYWdlKHBhdGNoKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VkID0gX2dldE1vZGVsUHJlZnNGcm9tU3RvcmFnZSgpO1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFN0b3JhZ2VLZXlzLlRBQl9EQVRBLCBKU09OLnN0cmluZ2lmeSh7IC4uLnBhcnNlZCwgLi4ucGF0Y2ggfSkpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nLndhcm4oJ0ZhaWxlZCB0byBwZXJzaXN0IG1vZGVsIHByZWZlcmVuY2VzIGxvY2FsbHk6JywgZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2FwcGVuZFJlY2VudE1vZGVsKHByb3ZpZGVyLCBtb2RlbCkge1xuICBpZiAoIXByb3ZpZGVyIHx8ICFtb2RlbCkgcmV0dXJuO1xuICBjb25zdCBwYXJzZWQgPSBfZ2V0TW9kZWxQcmVmc0Zyb21TdG9yYWdlKCk7XG4gIGNvbnN0IGV4aXN0aW5nID0gQXJyYXkuaXNBcnJheShwYXJzZWQucmVjZW50TW9kZWxzKSA/IHBhcnNlZC5yZWNlbnRNb2RlbHMgOiBbXTtcbiAgY29uc3QgZmlsdGVyZWQgPSBleGlzdGluZy5maWx0ZXIoKGl0ZW0pID0+ICEoaXRlbS5wcm92aWRlciA9PT0gcHJvdmlkZXIgJiYgaXRlbS5tb2RlbCA9PT0gbW9kZWwpKTtcbiAgZmlsdGVyZWQudW5zaGlmdCh7IHByb3ZpZGVyLCBtb2RlbCB9KTtcbiAgX3NhdmVNb2RlbFByZWZzVG9TdG9yYWdlKHsgcmVjZW50TW9kZWxzOiBmaWx0ZXJlZC5zbGljZSgwLCA2KSB9KTtcbn1cblxuZnVuY3Rpb24gX3VwZGF0ZUxsbVN0YXR1c1BpbGwoa2luZCwgdGV4dCwgaWNvbiA9ICcnLCB0b29sdGlwID0gJycpIHtcbiAgY29uc3QgcGlsbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG0tc3RhdHVzLXBpbGwnKTtcbiAgY29uc3QgbGFiZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtLXN0YXR1cy1sYWJlbCcpO1xuICBjb25zdCBpY29uRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtLXN0YXR1cy1pY29uJyk7XG4gIGlmICghcGlsbCB8fCAhbGFiZWwpIHJldHVybjtcblxuICBjb25zdCBhbGlhc2VzID0ge1xuICAgIGF1dGhlbnRpY2F0ZWQ6ICdjb25uZWN0ZWQnLFxuICAgIHVuYXV0aGVudGljYXRlZDogJ3VuY29uZmlndXJlZCcsXG4gICAgcG9sbGluZzogJ2Nvbm5lY3RpbmcnLFxuICB9O1xuICBjb25zdCBub3JtYWxpemVkS2luZCA9IGFsaWFzZXNba2luZF0gfHwga2luZCB8fCAndW5jb25maWd1cmVkJztcbiAgY29uc3QgZGVmYXVsdFRvb2x0aXAgPSB7XG4gICAgdW5jb25maWd1cmVkOiAnTm8gcHJvdmlkZXIvbW9kZWwgaXMgY29uZmlndXJlZCB5ZXQuJyxcbiAgICBjb25maWd1cmVkOiAnUHJvdmlkZXIvbW9kZWwgaXMgY29uZmlndXJlZC4gQ29ubmVjdGl2aXR5IG5vdCB5ZXQgdmVyaWZpZWQuJyxcbiAgICBjb25uZWN0aW5nOiAnVGVzdGluZyBvciBjb25uZWN0aW5nIHRvIHRoZSBzZWxlY3RlZCBwcm92aWRlci4nLFxuICAgIGNvbm5lY3RlZDogJ1Byb3ZpZGVyIHJlc3BvbmRlZCBzdWNjZXNzZnVsbHkgdG8gYSBsaXZlIHJlcXVlc3QuJyxcbiAgICAnYXV0aC1yZXF1aXJlZCc6ICdBdXRoZW50aWNhdGlvbiBpcyByZXF1aXJlZC4gQ2hlY2sgQVBJIGtleSBvciBzaWduIGluLicsXG4gICAgJ3JhdGUtbGltaXRlZCc6ICdSYXRlIGxpbWl0IHJlYWNoZWQuIFdhaXQgYmVmb3JlIHJldHJ5aW5nIHJlcXVlc3RzLicsXG4gICAgdW5hdmFpbGFibGU6ICdQcm92aWRlciBpcyB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZSBvciB1bnJlYWNoYWJsZS4nLFxuICAgIGVycm9yOiAnQ29ubmVjdGlvbiBmYWlsZWQuIE9wZW4gbW9kZWwgc2V0dGluZ3MgZm9yIGRldGFpbHMuJyxcbiAgfTtcbiAgcGlsbC5jbGFzc0xpc3QucmVtb3ZlKCdhdXRoZW50aWNhdGVkJywgJ3VuYXV0aGVudGljYXRlZCcsICdwb2xsaW5nJywgJ3VuY29uZmlndXJlZCcsICdjb25maWd1cmVkJywgJ2Nvbm5lY3RpbmcnLCAnY29ubmVjdGVkJywgJ2F1dGgtcmVxdWlyZWQnLCAncmF0ZS1saW1pdGVkJywgJ3VuYXZhaWxhYmxlJywgJ2Vycm9yJyk7XG4gIGlmIChub3JtYWxpemVkS2luZCkgcGlsbC5jbGFzc0xpc3QuYWRkKG5vcm1hbGl6ZWRLaW5kKTtcbiAgbGFiZWwudGV4dENvbnRlbnQgPSB0ZXh0O1xuICBjb25zdCBpY29uQnlLaW5kID0ge1xuICAgIHVuY29uZmlndXJlZDogJ1x1MjVDQicsXG4gICAgY29uZmlndXJlZDogJ1x1MjVENCcsXG4gICAgY29ubmVjdGluZzogJ1x1MjlENycsXG4gICAgY29ubmVjdGVkOiAnXHUyNzEzJyxcbiAgICAnYXV0aC1yZXF1aXJlZCc6ICdcdUQ4M0RcdUREMTEnLFxuICAgICdyYXRlLWxpbWl0ZWQnOiAnXHUyM0YzJyxcbiAgICB1bmF2YWlsYWJsZTogJ1x1MjYwMScsXG4gICAgZXJyb3I6ICdcdTI2QTAnLFxuICB9O1xuICBjb25zdCBpY29uVGV4dCA9IGljb24gfHwgaWNvbkJ5S2luZFtub3JtYWxpemVkS2luZF0gfHwgJ1x1MjZBMCc7XG4gIGlmIChpY29uRWwpIGljb25FbC50ZXh0Q29udGVudCA9IGljb25UZXh0O1xuICBjb25zdCB0b29sdGlwVGV4dCA9IHRvb2x0aXAgfHwgZGVmYXVsdFRvb2x0aXBbbm9ybWFsaXplZEtpbmRdIHx8ICcnO1xuICBwaWxsLnRpdGxlID0gdG9vbHRpcFRleHQ7XG4gIGlmIChpY29uRWwpIGljb25FbC50aXRsZSA9IHRvb2x0aXBUZXh0O1xuICBsYWJlbC50aXRsZSA9IHRvb2x0aXBUZXh0O1xufVxuXG5hc3luYyBmdW5jdGlvbiBsb2FkTW9kZWxTZWxlY3RvcigpIHtcbiAgaWYgKF9tb2RlbFNlbGVjdG9yTG9hZGluZykgcmV0dXJuO1xuICBfbW9kZWxTZWxlY3RvckxvYWRpbmcgPSB0cnVlO1xuICB0cnkge1xuICAgIF9tb2RlbERhdGEgPSBhd2FpdCBhcGlDYWxsKCdHRVQnLCAnL2FwaS9tb2RlbCcpO1xuICAgIC8vIElmIGJhY2tlbmQgZGlkbid0IHJldHVybiBhIHBlcnNpc3RlbnQgc2VsZWN0aW9uLCBwcmVmZXIgYSBsb2NhbGx5LXNhdmVkIGNob2ljZVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBzYXZlZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFN0b3JhZ2VLZXlzLlRBQl9EQVRBKTtcbiAgICAgIGlmIChzYXZlZCkge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHNhdmVkKTtcbiAgICAgICAgaWYgKHBhcnNlZCAmJiAhKF9tb2RlbERhdGEgJiYgX21vZGVsRGF0YS5wcm92aWRlcikgJiYgcGFyc2VkLmN1cnJlbnRNb2RlbFByb3ZpZGVyKSB7XG4gICAgICAgICAgX21vZGVsRGF0YSA9IF9tb2RlbERhdGEgfHwge307XG4gICAgICAgICAgX21vZGVsRGF0YS5wcm92aWRlciA9IHBhcnNlZC5jdXJyZW50TW9kZWxQcm92aWRlcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyc2VkICYmICEoX21vZGVsRGF0YSAmJiBfbW9kZWxEYXRhLm1vZGVsKSAmJiBwYXJzZWQuY3VycmVudE1vZGVsTmFtZSkge1xuICAgICAgICAgIF9tb2RlbERhdGEgPSBfbW9kZWxEYXRhIHx8IHt9O1xuICAgICAgICAgIF9tb2RlbERhdGEubW9kZWwgPSBwYXJzZWQuY3VycmVudE1vZGVsTmFtZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZy53YXJuKCdDb3VsZCBub3QgcmVhZCBzYXZlZCBtb2RlbCBmcm9tIGxvY2FsU3RvcmFnZTonLCBlKTtcbiAgICB9XG4gICAgY29uc3QgbGFiZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtY3VycmVudC1sYWJlbCcpO1xuICAgIGlmIChsYWJlbCkge1xuICAgICAgY29uc3QgcHJvdiAgPSBfbW9kZWxEYXRhLnByb3ZpZGVyO1xuICAgICAgY29uc3QgbW9kZWwgPSBfbW9kZWxEYXRhLm1vZGVsIHx8ICdcdTIwMTQnO1xuICAgICAgbGFiZWwudGV4dENvbnRlbnQgPSBwcm92ID8gYCR7cHJvdn0gXHUwMEI3ICR7bW9kZWx9YCA6IG1vZGVsO1xuICAgIH1cbiAgICBpZiAoX21vZGVsRGF0YSAmJiBfbW9kZWxEYXRhLnByb3ZpZGVyKSB7XG4gICAgICBfc2VsZWN0ZWRNb2RlbFByb3ZpZGVycyA9IG5ldyBTZXQoW19tb2RlbERhdGEucHJvdmlkZXJdKTtcbiAgICAgIF91cGRhdGVMbG1TdGF0dXNQaWxsKCdjb25maWd1cmVkJywgYCR7X21vZGVsRGF0YS5wcm92aWRlcn0gY29uZmlndXJlZGApO1xuICAgIH0gZWxzZSB7XG4gICAgICBfdXBkYXRlTGxtU3RhdHVzUGlsbCgndW5jb25maWd1cmVkJywgJ05vdCBjb25maWd1cmVkJyk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nLndhcm4oJ0NvdWxkIG5vdCBsb2FkIG1vZGVsIGxpc3Q6JywgZSk7XG4gIH0gZmluYWxseSB7XG4gICAgX21vZGVsU2VsZWN0b3JMb2FkaW5nID0gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gX3Byb3ZpZGVyU3RhZ2VMYWJlbChwcm92aWRlciwgY2FwYWJsZVNldCkge1xuICBjb25zdCBpc0NhcGFibGUgPSBjYXBhYmxlU2V0Lmhhcyhwcm92aWRlcik7XG4gIHJldHVybiBpc0NhcGFibGUgPyAnbGlzdF9tb2RlbHMnIDogJ2ZhbGxiYWNrJztcbn1cblxuZnVuY3Rpb24gX3Byb3ZpZGVyRGlzcGxheUxhYmVsKHByb3ZpZGVyKSB7XG4gIGNvbnN0IGRlcHJlY2F0ZWQgPSB7XG4gICAgJ2NvcGlsb3Qtb2F1dGgnOiAnQ29waWxvdCBPQXV0aCAoZGVwcmVjYXRlZCknLFxuICAgIGNvcGlsb3Q6ICdDb3BpbG90IChkZXByZWNhdGVkKScsXG4gICAgZ2l0aHViOiAnR2l0SHViIE1vZGVscyAoZGVwcmVjYXRlZCknLFxuICAgICdjb3BpbG90LXNkayc6ICdDb3BpbG90IFNESyAocmVjb21tZW5kZWQpJyxcbiAgfTtcbiAgaWYgKGRlcHJlY2F0ZWRbcHJvdmlkZXJdKSByZXR1cm4gZGVwcmVjYXRlZFtwcm92aWRlcl07XG4gIHJldHVybiBwcm92aWRlcjtcbn1cblxuZnVuY3Rpb24gX2dldFF1aWNrTW9kZWxDYW5kaWRhdGVzKHJvd3MpIHtcbiAgY29uc3QgcGFyc2VkID0gX2dldE1vZGVsUHJlZnNGcm9tU3RvcmFnZSgpO1xuICBjb25zdCByZWNlbnRzID0gQXJyYXkuaXNBcnJheShwYXJzZWQucmVjZW50TW9kZWxzKSA/IHBhcnNlZC5yZWNlbnRNb2RlbHMgOiBbXTtcbiAgY29uc3QgcmFua2VkID0gW107XG5cbiAgZm9yIChjb25zdCByZWNlbnQgb2YgcmVjZW50cykge1xuICAgIGNvbnN0IGhpdCA9IHJvd3MuZmluZCgocm93KSA9PiByb3cucHJvdmlkZXIgPT09IHJlY2VudC5wcm92aWRlciAmJiByb3cubW9kZWwgPT09IHJlY2VudC5tb2RlbCk7XG4gICAgaWYgKGhpdCkgcmFua2VkLnB1c2goaGl0KTtcbiAgfVxuXG4gIGNvbnN0IHBvcHVsYXIgPSBbLi4ucm93c11cbiAgICAuc29ydCgoYSwgYikgPT4ge1xuICAgICAgY29uc3QgYW0gPSBOdW1iZXIoYS5jb3BpbG90X211bHRpcGxpZXIgPz8gOTk5KTtcbiAgICAgIGNvbnN0IGJtID0gTnVtYmVyKGIuY29waWxvdF9tdWx0aXBsaWVyID8/IDk5OSk7XG4gICAgICBpZiAoYW0gIT09IGJtKSByZXR1cm4gYW0gLSBibTtcbiAgICAgIGNvbnN0IGFjID0gTnVtYmVyKGEuY29udGV4dF93aW5kb3cgfHwgMCk7XG4gICAgICBjb25zdCBiYyA9IE51bWJlcihiLmNvbnRleHRfd2luZG93IHx8IDApO1xuICAgICAgcmV0dXJuIGJjIC0gYWM7XG4gICAgfSk7XG5cbiAgZm9yIChjb25zdCBpdGVtIG9mIHBvcHVsYXIpIHtcbiAgICBpZiAoIXJhbmtlZC5zb21lKChyKSA9PiByLnByb3ZpZGVyID09PSBpdGVtLnByb3ZpZGVyICYmIHIubW9kZWwgPT09IGl0ZW0ubW9kZWwpKSB7XG4gICAgICByYW5rZWQucHVzaChpdGVtKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmFua2VkLnNsaWNlKDAsIDgpO1xufVxuXG5mdW5jdGlvbiBfcmVuZGVyUXVpY2tNb2RlbExpc3Qocm93cykge1xuICBjb25zdCBxdWlja0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLXF1aWNrLWxpc3QnKTtcbiAgaWYgKCFxdWlja0VsKSByZXR1cm47XG4gIHF1aWNrRWwuaW5uZXJIVE1MID0gJyc7XG5cbiAgY29uc3QgY2FuZGlkYXRlcyA9IF9nZXRRdWlja01vZGVsQ2FuZGlkYXRlcyhyb3dzIHx8IFtdKTtcbiAgZm9yIChjb25zdCBpdGVtIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICBjb25zdCBpc0FjdGl2ZSA9IGl0ZW0ucHJvdmlkZXIgPT09IF9tb2RlbERhdGE/LnByb3ZpZGVyICYmIGl0ZW0ubW9kZWwgPT09IF9tb2RlbERhdGE/Lm1vZGVsO1xuICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgIGJ1dHRvbi5jbGFzc05hbWUgPSAnaGVhZGVyLXBpbGwtYnRuJztcbiAgICBidXR0b24uc3R5bGUucGFkZGluZyA9ICc1cHggMTBweCc7XG4gICAgYnV0dG9uLnN0eWxlLmZvbnRTaXplID0gJzAuODJlbSc7XG4gICAgYnV0dG9uLnN0eWxlLmJhY2tncm91bmQgPSBpc0FjdGl2ZSA/ICcjZGJlYWZlJyA6ICcjZjhmYWZjJztcbiAgICBidXR0b24uc3R5bGUuY29sb3IgPSBpc0FjdGl2ZSA/ICcjMWUzYThhJyA6ICcjMzM0MTU1JztcbiAgICBidXR0b24uc3R5bGUuYm9yZGVyQ29sb3IgPSBpc0FjdGl2ZSA/ICcjOTNjNWZkJyA6ICcjY2JkNWUxJztcbiAgICBidXR0b24udGl0bGUgPSBgJHtpdGVtLnByb3ZpZGVyfSBcdTAwQjcgJHtpdGVtLm1vZGVsfWA7XG4gICAgYnV0dG9uLnRleHRDb250ZW50ID0gYCR7aXRlbS5wcm92aWRlcn0gXHUwMEI3ICR7aXRlbS5tb2RlbH1gO1xuICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHNldE1vZGVsKGl0ZW0ubW9kZWwsIGl0ZW0ucHJvdmlkZXIpO1xuICAgIH0pO1xuICAgIHF1aWNrRWwuYXBwZW5kQ2hpbGQoYnV0dG9uKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfc3luY0NhdGFsb2dWaXNpYmlsaXR5KCkge1xuICBjb25zdCB3cmFwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLWZ1bGwtdGFibGUtd3JhcCcpO1xuICBjb25zdCBzZWFyY2ggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtZ2xvYmFsLXNlYXJjaCcpO1xuICBjb25zdCB0b2dnbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtc2hvdy1hbGwtYnRuJyk7XG4gIGlmICh3cmFwKSB3cmFwLnN0eWxlLmRpc3BsYXkgPSBfc2hvd0Z1bGxNb2RlbENhdGFsb2cgPyAnJyA6ICdub25lJztcbiAgaWYgKHNlYXJjaCkgc2VhcmNoLnN0eWxlLmRpc3BsYXkgPSBfc2hvd0Z1bGxNb2RlbENhdGFsb2cgPyAnJyA6ICdub25lJztcbiAgaWYgKHRvZ2dsZSkgdG9nZ2xlLnRleHRDb250ZW50ID0gX3Nob3dGdWxsTW9kZWxDYXRhbG9nID8gJ0hpZGUgRnVsbCBDYXRhbG9nJyA6ICdTaG93IEZ1bGwgQ2F0YWxvZyc7XG59XG5cbmZ1bmN0aW9uIHRvZ2dsZU1vZGVsQ2F0YWxvZ1Zpc2liaWxpdHkoKSB7XG4gIF9zaG93RnVsbE1vZGVsQ2F0YWxvZyA9ICFfc2hvd0Z1bGxNb2RlbENhdGFsb2c7XG4gIF9zeW5jQ2F0YWxvZ1Zpc2liaWxpdHkoKTtcbn1cblxuLy8gX3JlbmRlckF1dGhTdGVwIFx1MjAxNCBjYWxsZWQgYnkgX3NldE1vZGVsV2l6YXJkU3RlcCB3aGVuIGVudGVyaW5nIFN0ZXAgMi5cbi8vIFJlbmRlcnMgcHJvdmlkZXItc3BlY2lmaWMgY29udGVudCBpbnRvICNtb2RlbC1hdXRoLXN0ZXAtY29udGVudCBhbmQgc2hvd3Ncbi8vIHRoZSBhcHByb3ByaWF0ZSBzdWItcGFuZWwgKGtleSBpbnB1dCwgZGV2aWNlLWZsb3csIENMSSBub3RpY2UsIG9yIG5vbmUpLlxuYXN5bmMgZnVuY3Rpb24gX3JlbmRlckF1dGhTdGVwKHByb3ZpZGVyKSB7XG4gIGNvbnN0IGNvbnRlbnQgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtYXV0aC1zdGVwLWNvbnRlbnQnKTtcbiAgY29uc3Qga2V5UGFuZWwgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1hdXRoLWtleS1wYW5lbCcpO1xuICBjb25zdCBkZXZQYW5lbCAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLWF1dGgtZGV2aWNlLXBhbmVsJyk7XG4gIGNvbnN0IGtleUlucHV0ICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtYXV0aC1rZXktaW5wdXQnKTtcbiAgY29uc3Qga2V5U3RhdHVzICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1hdXRoLWtleS1zdGF0dXMnKTtcblxuICBpZiAoIWNvbnRlbnQpIHJldHVybjtcblxuICAvLyBSZXNldCBzdWItcGFuZWxzXG4gIGlmIChrZXlQYW5lbCkgIGtleVBhbmVsLnN0eWxlLmRpc3BsYXkgID0gJ25vbmUnO1xuICBpZiAoZGV2UGFuZWwpICBkZXZQYW5lbC5zdHlsZS5kaXNwbGF5ICA9ICdub25lJztcbiAgaWYgKGtleUlucHV0KSAga2V5SW5wdXQudmFsdWUgPSAnJztcbiAgaWYgKGtleVN0YXR1cykga2V5U3RhdHVzLnRleHRDb250ZW50ID0gJyc7XG5cbiAgaWYgKCFwcm92aWRlcikge1xuICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gJzxwIHN0eWxlPVwiY29sb3I6IzY0NzQ4YjtcIj5TZWxlY3QgYSBwcm92aWRlciBpbiBTdGVwIDEgZmlyc3QuPC9wPic7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IGNyZWREYXRhID0gbnVsbDtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2goJy9hcGkvc2V0dGluZ3MvY3JlZGVudGlhbHMvc3RhdHVzJyk7XG4gICAgaWYgKHJlc3Aub2spIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwLmpzb24oKTtcbiAgICAgIGNyZWREYXRhID0gKGRhdGEucHJvdmlkZXJzIHx8IHt9KVtwcm92aWRlcl0gfHwgbnVsbDtcbiAgICB9XG4gIH0gY2F0Y2ggeyAvKiBub24tZmF0YWwgKi8gfVxuXG4gIGNvbnN0IGF1dGhUeXBlICAgPSBjcmVkRGF0YT8uYXV0aF90eXBlICB8fCAnYXBpX2tleSc7XG4gIGNvbnN0IGxhYmVsICAgICAgPSBjcmVkRGF0YT8ubGFiZWwgICAgICB8fCBwcm92aWRlcjtcbiAgY29uc3QgaGVscFRleHQgICA9IGNyZWREYXRhPy5oZWxwX3RleHQgIHx8ICcnO1xuICBjb25zdCBnZXRLZXlVcmwgID0gY3JlZERhdGE/LmdldF9rZXlfdXJsIHx8ICcnO1xuICBjb25zdCBpc1NldCAgICAgID0gY3JlZERhdGE/LmlzX3NldCAgICAgfHwgZmFsc2U7XG4gIGNvbnN0IHNvdXJjZSAgICAgPSBjcmVkRGF0YT8uc291cmNlICAgICB8fCAndW5zZXQnO1xuICBjb25zdCBlbnZWYXIgICAgID0gY3JlZERhdGE/LmVudl92YXIgICAgfHwgbnVsbDtcbiAgY29uc3QgaXNMb2NrZWQgICA9IGNyZWREYXRhPy5sb2NrZWQgICAgIHx8IGZhbHNlO1xuXG4gIGNvbnN0IGlzU2V0QmFkZ2UgPSBpc1NldFxuICAgID8gJzxzcGFuIHN0eWxlPVwiZGlzcGxheTppbmxpbmUtYmxvY2s7cGFkZGluZzoycHggOHB4O2JvcmRlci1yYWRpdXM6OTk5cHg7YmFja2dyb3VuZDojZDFmYWU1O2NvbG9yOiMwNjVmNDY7Zm9udC1zaXplOjAuOGVtO2ZvbnQtd2VpZ2h0OjYwMDtcIj4mIzEwMDAzOyBLZXkgc2F2ZWQ8L3NwYW4+J1xuICAgIDogJzxzcGFuIHN0eWxlPVwiZGlzcGxheTppbmxpbmUtYmxvY2s7cGFkZGluZzoycHggOHB4O2JvcmRlci1yYWRpdXM6OTk5cHg7YmFja2dyb3VuZDojZmVlMmUyO2NvbG9yOiM5OTFiMWI7Zm9udC1zaXplOjAuOGVtO2ZvbnQtd2VpZ2h0OjYwMDtcIj5Ob3QgY29uZmlndXJlZDwvc3Bhbj4nO1xuXG4gIC8vIFNvdXJjZSBsYWJlbCArIFx1MjREOCB0b29sdGlwIFx1MjAxNCBtaXJyb3JzIHRoZSBzZXR0aW5ncyBkaWFsb2cgcGF0dGVybi5cbiAgbGV0IHNvdXJjZUxhYmVsID0gJyc7XG4gIGxldCB0b29sdGlwVGV4dCA9ICcnO1xuICBpZiAoc291cmNlID09PSAnZW52Jykge1xuICAgIHNvdXJjZUxhYmVsID0gYFNvdXJjZTogZW52aXJvbm1lbnQgdmFyaWFibGUgKCR7ZW52VmFyIHx8ICdsb2NrZWQnfSlgO1xuICAgIHRvb2x0aXBUZXh0ID0gYEN1cnJlbnRseSBsb2FkZWQgZnJvbSB0aGUgJHtlbnZWYXJ9IGVudmlyb25tZW50IHZhcmlhYmxlLiBgICtcbiAgICAgIGBUbyBjaGFuZ2UgaXQgcGVybWFuZW50bHksIHVwZGF0ZSB5b3VyIHNoZWxsIGNvbmZpZyAoZS5nLiB+Ly56c2hyYykgYW5kIHJlc3RhcnQgdGhlIHNlcnZlci4gYCArXG4gICAgICBgWW91IGNhbiBzdGlsbCBzYXZlIGEgdmFsdWUgYmVsb3cgXHUyMDE0IGl0IHRha2VzIGVmZmVjdCBpbW1lZGlhdGVseSBidXQgd2lsbCBiZSBvdmVycmlkZGVuIGJ5IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBvbiBuZXh0IHJlc3RhcnQuYDtcbiAgfSBlbHNlIGlmIChzb3VyY2UgPT09ICdkb3RlbnYnKSB7XG4gICAgc291cmNlTGFiZWwgPSBgU291cmNlOiAuZW52IGZpbGUgKCR7ZW52VmFyIHx8ICdsb2NrZWQnfSlgO1xuICAgIHRvb2x0aXBUZXh0ID0gYEN1cnJlbnRseSBsb2FkZWQgZnJvbSAke2VudlZhcn0gaW4geW91ciAuZW52IGZpbGUuIGAgK1xuICAgICAgYFRvIGNoYW5nZSBpdCBwZXJtYW5lbnRseSwgZWRpdCB0aGUgLmVudiBmaWxlIGluIHRoZSBwcm9qZWN0IGRpcmVjdG9yeSBhbmQgcmVzdGFydCB0aGUgc2VydmVyLiBgICtcbiAgICAgIGBZb3UgY2FuIHN0aWxsIHNhdmUgYSB2YWx1ZSBiZWxvdyBcdTIwMTQgaXQgdGFrZXMgZWZmZWN0IGltbWVkaWF0ZWx5IGJ1dCB3aWxsIGJlIG92ZXJyaWRkZW4gYnkgLmVudiBvbiBuZXh0IHJlc3RhcnQuYDtcbiAgfSBlbHNlIGlmIChzb3VyY2UgPT09ICdjb25maWcnKSB7XG4gICAgc291cmNlTGFiZWwgPSAnU291cmNlOiBjb25maWcueWFtbCc7XG4gICAgdG9vbHRpcFRleHQgPSAnU3RvcmVkIGluIGNvbmZpZy55YW1sLiBVcGRhdGUgaXQgdXNpbmcgdGhlIGlucHV0IGJlbG93Lic7XG4gIH1cblxuICBjb25zdCBpbmZvSWNvbiA9IHRvb2x0aXBUZXh0XG4gICAgPyBgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIHRpdGxlPVwiJHtlc2NhcGVIdG1sKHRvb2x0aXBUZXh0KX1cIiBhcmlhLWxhYmVsPVwiV2hlcmUgaXMgdGhpcyBrZXkgc3RvcmVkP1wiIGAgK1xuICAgICAgYHN0eWxlPVwiYmFja2dyb3VuZDpub25lO2JvcmRlcjpub25lO2N1cnNvcjpoZWxwO2NvbG9yOiM2NDc0OGI7Zm9udC1zaXplOjAuODVlbTtwYWRkaW5nOjAgMnB4O3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtsaW5lLWhlaWdodDoxO1wiPlx1MjREODwvYnV0dG9uPmBcbiAgICA6ICcnO1xuXG4gIGNvbnN0IHNvdXJjZUxhYmVsSHRtbCA9IHNvdXJjZUxhYmVsXG4gICAgPyBgPHNwYW4gc3R5bGU9XCJtYXJnaW4tbGVmdDoxMHB4O2ZvbnQtc2l6ZTowLjhlbTtjb2xvcjoke2lzTG9ja2VkID8gJyNiNDUzMDknIDogJyM2NDc0OGInfTtcIj4ke2VzY2FwZUh0bWwoc291cmNlTGFiZWwpfSR7aW5mb0ljb259PC9zcGFuPmBcbiAgICA6ICcnO1xuXG4gIC8vIEFtYmVyIHdhcm5pbmcgd2hlbiBhIGxvY2tlZCBzb3VyY2UgZXhpc3RzIFx1MjAxNCBpbnB1dCByZW1haW5zIGVuYWJsZWQgc28gdGhlXG4gIC8vIHVzZXIgY2FuIHNhdmUgYSBzZXNzaW9uL2NvbmZpZyBvdmVycmlkZSwgYnV0IHRoZSBwcmVjZWRlbmNlIHJ1bGUgaXMgY2xlYXIuXG4gIGNvbnN0IHNvdXJjZURlc2MgPSBzb3VyY2UgPT09ICdlbnYnID8gJ2Vudmlyb25tZW50IHZhcmlhYmxlJyA6ICcuZW52IGZpbGUnO1xuICBjb25zdCBzb3VyY2VSZWYgID0gZW52VmFyXG4gICAgPyBgJHtzb3VyY2VEZXNjfSA8Y29kZT4ke2VzY2FwZUh0bWwoZW52VmFyKX08L2NvZGU+YFxuICAgIDogc291cmNlRGVzYztcbiAgY29uc3QgbG9ja2VkV2Fybkh0bWwgPSBpc0xvY2tlZFxuICAgID8gYDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZWYzYzc7Ym9yZGVyOjFweCBzb2xpZCAjZjU5ZTBiO2JvcmRlci1yYWRpdXM6NnB4O3BhZGRpbmc6OHB4IDEycHg7bWFyZ2luOjhweCAwO2ZvbnQtc2l6ZTowLjg1ZW07Y29sb3I6IzkyNDAwZTtcIj5gICtcbiAgICAgIGBcdTI2QTAgVGhpcyBrZXkgaXMgbG9hZGVkIGZyb20gdGhlIDxzdHJvbmc+JHtzb3VyY2VSZWZ9PC9zdHJvbmc+LiBgICtcbiAgICAgIGBBbnkgdmFsdWUgc2F2ZWQgYmVsb3cgdGFrZXMgZWZmZWN0IGltbWVkaWF0ZWx5IGZvciB0aGUgY3VycmVudCBzZXNzaW9uLCBidXQgd2lsbCBiZSBgICtcbiAgICAgIGA8c3Ryb25nPm92ZXJyaWRkZW4gYnkgdGhlICR7c291cmNlRGVzY30gd2hlbiB0aGUgc2VydmVyIHJlc3RhcnRzIG9yIHJlbG9hZHM8L3N0cm9uZz4uPC9kaXY+YFxuICAgIDogJyc7XG5cbiAgY29uc3QgZ2V0S2V5TGluayA9IGdldEtleVVybFxuICAgID8gYDxhIGhyZWY9XCIke2VzY2FwZUh0bWwoZ2V0S2V5VXJsKX1cIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCIgc3R5bGU9XCJjb2xvcjojMjU2M2ViO1wiPkdldCB5b3VyIGtleSAmIzg1OTk7PC9hPmBcbiAgICA6ICcnO1xuXG4gIGNvbnRlbnQuaW5uZXJIVE1MID1cbiAgICBgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTBweDtcIj5gICtcbiAgICBgICA8c3Ryb25nPiR7ZXNjYXBlSHRtbChsYWJlbCl9PC9zdHJvbmc+ICR7aXNTZXRCYWRnZX0ke3NvdXJjZUxhYmVsSHRtbH1gICtcbiAgICAoZ2V0S2V5TGluayA/IGAgIDxzcGFuIHN0eWxlPVwibWFyZ2luLWxlZnQ6MTBweDtcIj4ke2dldEtleUxpbmt9PC9zcGFuPmAgOiAnJykgK1xuICAgIGA8L2Rpdj5gICtcbiAgICAoaGVscFRleHQgPyBgPHAgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2NvbG9yOiM0NzU1Njk7bWFyZ2luOjAgMCAxMnB4O1wiPiR7ZXNjYXBlSHRtbChoZWxwVGV4dCl9PC9wPmAgOiAnJykgK1xuICAgIGxvY2tlZFdhcm5IdG1sO1xuXG4gIGlmIChhdXRoVHlwZSA9PT0gJ2FwaV9rZXknKSB7XG4gICAgaWYgKGtleVBhbmVsKSB7XG4gICAgICBrZXlQYW5lbC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICBpZiAoa2V5SW5wdXQpIHtcbiAgICAgICAgLy8gQWx3YXlzIGVuYWJsZSBpbnB1dCBcdTIwMTQgdXNlciBjYW4gc2F2ZSBhIG5ldyB2YWx1ZSBldmVuIHdoZW4gZW52L2RvdGVudiBpcyB0aGUgY3VycmVudFxuICAgICAgICAvLyBzb3VyY2UuIFRoZSB3YXJuaW5nIGJhbm5lciBhYm92ZSBjb21tdW5pY2F0ZXMgdGhlIHJlc3RhcnQtcHJlY2VkZW5jZSBiZWhhdmlvdXIuXG4gICAgICAgIGtleUlucHV0LmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgIGtleUlucHV0LnN0eWxlLm9wYWNpdHkgPSAnJztcbiAgICAgICAga2V5SW5wdXQucGxhY2Vob2xkZXIgPSBpc1NldCA/ICdFbnRlciBuZXcga2V5IHRvIHJlcGxhY2UgdGhlIHNhdmVkIG9uZScgOiAnUGFzdGUgeW91ciBBUEkga2V5IGhlcmUnO1xuICAgICAgICBrZXlJbnB1dC5kYXRhc2V0LnByb3ZpZGVyID0gcHJvdmlkZXI7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKGF1dGhUeXBlID09PSAnZGV2aWNlX2Zsb3cnKSB7XG4gICAgaWYgKGRldlBhbmVsKSB7XG4gICAgICBkZXZQYW5lbC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICBhd2FpdCBfcmVmcmVzaENvcGlsb3RBdXRoU3RhdHVzKCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGF1dGhUeXBlID09PSAnY2xpJykge1xuICAgIGNvbnRlbnQuaW5uZXJIVE1MICs9XG4gICAgICBgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2YwZmRmNDtib3JkZXI6MXB4IHNvbGlkICNiYmY3ZDA7Ym9yZGVyLXJhZGl1czo2cHg7cGFkZGluZzoxMHB4IDE0cHg7Zm9udC1zaXplOjAuODhlbTtcIj5gICtcbiAgICAgIGA8cCBzdHlsZT1cIm1hcmdpbjowIDAgNnB4O1wiPlJ1biB0aGlzIGNvbW1hbmQgaW4gYSB0ZXJtaW5hbCwgdGhlbiByZXR1cm4gaGVyZSBhbmQgY2xpY2sgPHN0cm9uZz5OZXh0PC9zdHJvbmc+OjwvcD5gICtcbiAgICAgIGA8Y29kZSBzdHlsZT1cImZvbnQtc2l6ZToxZW07XCI+Z2ggYXV0aCBsb2dpbjwvY29kZT48L2Rpdj5gO1xuICB9IGVsc2Uge1xuICAgIGNvbnRlbnQuaW5uZXJIVE1MICs9XG4gICAgICBgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2Y4ZmFmYztib3JkZXI6MXB4IHNvbGlkICNlMmU4ZjA7Ym9yZGVyLXJhZGl1czo2cHg7cGFkZGluZzoxMHB4IDE0cHg7Zm9udC1zaXplOjAuODhlbTtjb2xvcjojNDc1NTY5O1wiPmAgK1xuICAgICAgYE5vIGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkIGZvciB0aGlzIHByb3ZpZGVyLjwvZGl2PmA7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gX3JlZnJlc2hDb3BpbG90QXV0aFN0YXR1cygpIHtcbiAgY29uc3Qgc3RhdHVzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtYXV0aC1zdGF0dXMnKTtcbiAgY29uc3Qgc3RhcnRCdG4gID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLWF1dGgtc3RhcnQtYnRuJyk7XG4gIGNvbnN0IGxvZ291dEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1hdXRoLWxvZ291dC1idG4nKTtcbiAgY29uc3QgY29kZUVsICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLWF1dGgtY29kZScpO1xuICBjb25zdCBsaW5rRWwgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtYXV0aC1saW5rJyk7XG4gIGlmICghc3RhdHVzRWwpIHJldHVybjtcblxuICBpZiAoY29kZUVsKSAgY29kZUVsLnRleHRDb250ZW50ID0gJyc7XG4gIGlmIChsaW5rRWwpICBsaW5rRWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICB0cnkge1xuICAgIGNvbnN0IHN0ID0gYXdhaXQgZmV0Y2goJy9hcGkvY29waWxvdC1hdXRoL3N0YXR1cycpLnRoZW4oKHJlcykgPT4gcmVzLmpzb24oKSk7XG4gICAgaWYgKHN0LmF1dGhlbnRpY2F0ZWQpIHtcbiAgICAgIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJ0F1dGhlbnRpY2F0ZWQgd2l0aCBHaXRIdWIgQ29waWxvdC4nO1xuICAgICAgaWYgKHN0YXJ0QnRuKSBzdGFydEJ0bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgaWYgKGxvZ291dEJ0bikgbG9nb3V0QnRuLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIF91cGRhdGVMbG1TdGF0dXNQaWxsKCdhdXRoZW50aWNhdGVkJywgJ0NvcGlsb3QgcmVhZHknKTtcbiAgICB9IGVsc2UgaWYgKHN0LnBvbGxpbmcpIHtcbiAgICAgIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJ1dhaXRpbmcgZm9yIGRldmljZSBhcHByb3ZhbFx1MjAyNic7XG4gICAgICBpZiAoc3RhcnRCdG4pIHN0YXJ0QnRuLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIGlmIChsb2dvdXRCdG4pIGxvZ291dEJ0bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgX3VwZGF0ZUxsbVN0YXR1c1BpbGwoJ3BvbGxpbmcnLCAnQ29waWxvdCBhdXRoIHBlbmRpbmcnLCAnXHUyOUQ3Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJ05vdCBhdXRoZW50aWNhdGVkLiBTdGFydCBzaWduLWluIHRvIGVuYWJsZSBDb3BpbG90IE9BdXRoLic7XG4gICAgICBpZiAoc3RhcnRCdG4pIHN0YXJ0QnRuLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIGlmIChsb2dvdXRCdG4pIGxvZ291dEJ0bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgX3VwZGF0ZUxsbVN0YXR1c1BpbGwoJ3VuYXV0aGVudGljYXRlZCcsICdDb3BpbG90IG5vdCBhdXRoZW50aWNhdGVkJyk7XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICdVbmFibGUgdG8gbG9hZCBhdXRoIHN0YXR1cy4nO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNhdmVQcm92aWRlckFwaUtleSgpIHtcbiAgY29uc3Qga2V5SW5wdXQgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLWF1dGgta2V5LWlucHV0Jyk7XG4gIGNvbnN0IGtleVN0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1hdXRoLWtleS1zdGF0dXMnKTtcbiAgY29uc3QgcHJvdmlkZXIgID0ga2V5SW5wdXQ/LmRhdGFzZXQ/LnByb3ZpZGVyIHx8IF9tb2RlbFdpemFyZFNlbGVjdGVkUHJvdmlkZXI7XG4gIGNvbnN0IHZhbHVlICAgICA9IChrZXlJbnB1dD8udmFsdWUgfHwgJycpLnRyaW0oKTtcblxuICBpZiAoIXZhbHVlKSB7XG4gICAgaWYgKGtleVN0YXR1cykgeyBrZXlTdGF0dXMudGV4dENvbnRlbnQgPSAnUGxlYXNlIGVudGVyIGEga2V5IHZhbHVlLic7IGtleVN0YXR1cy5zdHlsZS5jb2xvciA9ICcjYjkxYzFjJzsgfVxuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIXByb3ZpZGVyKSB7XG4gICAgaWYgKGtleVN0YXR1cykgeyBrZXlTdGF0dXMudGV4dENvbnRlbnQgPSAnTm8gcHJvdmlkZXIgc2VsZWN0ZWQuJzsga2V5U3RhdHVzLnN0eWxlLmNvbG9yID0gJyNiOTFjMWMnOyB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGtleVN0YXR1cykgeyBrZXlTdGF0dXMudGV4dENvbnRlbnQgPSAnU2F2aW5nXHUyMDI2Jzsga2V5U3RhdHVzLnN0eWxlLmNvbG9yID0gJyM0NzU1NjknOyB9XG4gIHRyeSB7XG4gICAgYXdhaXQgYXBpQ2FsbCgnUE9TVCcsICcvYXBpL3NldHRpbmdzL2NyZWRlbnRpYWxzJywgeyBwcm92aWRlciwga2V5X3ZhbHVlOiB2YWx1ZSB9KTtcbiAgICBpZiAoa2V5SW5wdXQpICBrZXlJbnB1dC52YWx1ZSA9ICcnO1xuICAgIGlmIChrZXlTdGF0dXMpIHtcbiAgICAgIGtleVN0YXR1cy50ZXh0Q29udGVudCA9ICdLZXkgc2F2ZWQgc3VjY2Vzc2Z1bGx5Lic7XG4gICAgICBrZXlTdGF0dXMuc3R5bGUuY29sb3IgPSAnIzA2NWY0Nic7XG4gICAgfVxuICAgIC8vIFJlLXJlbmRlciBiYWRnZSB0byBzaG93IGtleSBpcyBub3cgc2V0XG4gICAgYXdhaXQgX3JlbmRlckF1dGhTdGVwKHByb3ZpZGVyKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmIChrZXlTdGF0dXMpIHsga2V5U3RhdHVzLnRleHRDb250ZW50ID0gYEVycm9yOiAke2UubWVzc2FnZSB8fCBlfWA7IGtleVN0YXR1cy5zdHlsZS5jb2xvciA9ICcjYjkxYzFjJzsgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHRvZ2dsZUFwaUtleVZpc2liaWxpdHkoKSB7XG4gIGNvbnN0IGlucHV0ICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1hdXRoLWtleS1pbnB1dCcpO1xuICBjb25zdCB0b2dnbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtYXV0aC1rZXktdG9nZ2xlJyk7XG4gIGlmICghaW5wdXQpIHJldHVybjtcbiAgY29uc3QgaXNIaWRkZW4gPSBpbnB1dC50eXBlID09PSAncGFzc3dvcmQnO1xuICBpbnB1dC50eXBlID0gaXNIaWRkZW4gPyAndGV4dCcgOiAncGFzc3dvcmQnO1xuICBpZiAodG9nZ2xlKSB0b2dnbGUudGV4dENvbnRlbnQgPSBpc0hpZGRlbiA/ICdcdUQ4M0RcdURFNDgnIDogJ1x1RDgzRFx1REM0MSc7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0YXJ0Q29waWxvdEF1dGhGcm9tV2l6YXJkKCkge1xuICBjb25zdCBzdGF0dXNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1hdXRoLXN0YXR1cycpO1xuICBjb25zdCBjb2RlRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtYXV0aC1jb2RlJyk7XG4gIGNvbnN0IGxpbmtFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1hdXRoLWxpbmsnKTtcbiAgaWYgKCFzdGF0dXNFbCB8fCAhY29kZUVsIHx8ICFsaW5rRWwpIHJldHVybjtcblxuICBfc2hvd01vZGVsV2l6YXJkQnVzeSgnU3RhcnRpbmcgR2l0SHViIGRldmljZSBhdXRob3JpemF0aW9uLi4uJyk7XG4gIHRyeSB7XG4gICAgY29uc3QgZmxvd1JlcyA9IGF3YWl0IGZldGNoKCcvYXBpL2NvcGlsb3QtYXV0aC9zdGFydCcsIHsgbWV0aG9kOiAnUE9TVCcgfSk7XG4gICAgaWYgKCFmbG93UmVzLm9rKSB0aHJvdyBuZXcgRXJyb3IoYXdhaXQgZmxvd1Jlcy50ZXh0KCkpO1xuICAgIGNvbnN0IGZsb3cgPSBhd2FpdCBmbG93UmVzLmpzb24oKTtcblxuICAgIGNvZGVFbC50ZXh0Q29udGVudCA9IGZsb3cudXNlcl9jb2RlIHx8ICcnO1xuICAgIGxpbmtFbC5ocmVmID0gZmxvdy52ZXJpZmljYXRpb25fdXJpIHx8ICdodHRwczovL2dpdGh1Yi5jb20vbG9naW4vZGV2aWNlJztcbiAgICBsaW5rRWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJ09wZW4gR2l0SHViLCBlbnRlciB0aGUgY29kZSwgdGhlbiByZXR1cm4gaGVyZS4nO1xuICAgIHdpbmRvdy5vcGVuKGxpbmtFbC5ocmVmLCAnX2JsYW5rJyk7XG5cbiAgICBhd2FpdCBmZXRjaCgnL2FwaS9jb3BpbG90LWF1dGgvcG9sbCcsIHsgbWV0aG9kOiAnUE9TVCcgfSk7XG4gICAgX3VwZGF0ZUxsbVN0YXR1c1BpbGwoJ3BvbGxpbmcnLCAnQ29waWxvdCBhdXRoIHBlbmRpbmcnLCAnXHUyOUQ3Jyk7XG4gICAgaWYgKF9jb3BpbG90QXV0aFBvbGxUaW1lcikgY2xlYXJJbnRlcnZhbChfY29waWxvdEF1dGhQb2xsVGltZXIpO1xuICAgIF9jb3BpbG90QXV0aFBvbGxUaW1lciA9IHNldEludGVydmFsKGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHN0ID0gYXdhaXQgZmV0Y2goJy9hcGkvY29waWxvdC1hdXRoL3N0YXR1cycpLnRoZW4oKHJlcykgPT4gcmVzLmpzb24oKSk7XG4gICAgICAgIGlmIChzdC5hdXRoZW50aWNhdGVkKSB7XG4gICAgICAgICAgY2xlYXJJbnRlcnZhbChfY29waWxvdEF1dGhQb2xsVGltZXIpO1xuICAgICAgICAgIF9jb3BpbG90QXV0aFBvbGxUaW1lciA9IG51bGw7XG4gICAgICAgICAgYXdhaXQgX3JlZnJlc2hDb3BpbG90QXV0aFN0YXR1cygpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8ga2VlcCBwb2xsaW5nIHNpbGVudGx5IHVudGlsIGNsb3NlXG4gICAgICB9XG4gICAgfSwgNTAwMCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgc3RhdHVzRWwudGV4dENvbnRlbnQgPSBgQXV0aCBzdGFydCBmYWlsZWQ6ICR7ZXJyb3IubWVzc2FnZSB8fCBlcnJvcn1gO1xuICB9IGZpbmFsbHkge1xuICAgIF9oaWRlTW9kZWxXaXphcmRCdXN5KCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9nb3V0Q29waWxvdEF1dGhGcm9tV2l6YXJkKCkge1xuICBhd2FpdCBmZXRjaCgnL2FwaS9jb3BpbG90LWF1dGgvbG9nb3V0JywgeyBtZXRob2Q6ICdQT1NUJyB9KTtcbiAgYXdhaXQgX3JlZnJlc2hDb3BpbG90QXV0aFN0YXR1cygpO1xufVxuXG5mdW5jdGlvbiBfd2lyZUdsb2JhbE1vZGVsU2VhcmNoKCkge1xuICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1nbG9iYWwtc2VhcmNoJyk7XG4gIGlmICghaW5wdXQpIHJldHVybjtcbiAgaW5wdXQub25pbnB1dCA9ICgpID0+IHtcbiAgICBpZiAoX21vZGVsRGF0YVRhYmxlICYmIHR5cGVvZiBfbW9kZWxEYXRhVGFibGUuc2VhcmNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBfbW9kZWxEYXRhVGFibGUuc2VhcmNoKGlucHV0LnZhbHVlIHx8ICcnKS5kcmF3KCk7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBfcmVuZGVyUHJvdmlkZXJTZWxlY3RvcigpIHtcbiAgY29uc3QgbGlzdEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLXByb3ZpZGVyLWxpc3QnKTtcbiAgaWYgKCFsaXN0RWwgfHwgIV9tb2RlbERhdGEpIHJldHVybjtcblxuICBjb25zdCBwcm92aWRlcnMgPSBBcnJheS5pc0FycmF5KF9tb2RlbERhdGEucHJvdmlkZXJzKVxuICAgID8gX21vZGVsRGF0YS5wcm92aWRlcnNcbiAgICA6IEFycmF5LmZyb20obmV3IFNldCgoX21vZGVsRGF0YS5hbGxfbW9kZWxzIHx8IFtdKS5tYXAociA9PiByLnByb3ZpZGVyKS5maWx0ZXIoQm9vbGVhbikpKS5zb3J0KCk7XG4gIGNvbnN0IGNhcGFibGVTZXQgPSBuZXcgU2V0KF9tb2RlbERhdGEubGlzdF9tb2RlbHNfY2FwYWJsZSB8fCBbXSk7XG5cbiAgaWYgKCFfbW9kZWxXaXphcmRTZWxlY3RlZFByb3ZpZGVyKSB7XG4gICAgX21vZGVsV2l6YXJkU2VsZWN0ZWRQcm92aWRlciA9IF9tb2RlbERhdGEucHJvdmlkZXIgfHwgcHJvdmlkZXJzWzBdIHx8IG51bGw7XG4gIH1cbiAgaWYgKF9tb2RlbFdpemFyZFNlbGVjdGVkUHJvdmlkZXIpIHtcbiAgICBfc2VsZWN0ZWRNb2RlbFByb3ZpZGVycyA9IG5ldyBTZXQoW19tb2RlbFdpemFyZFNlbGVjdGVkUHJvdmlkZXJdKTtcbiAgfVxuXG4gIC8vIERpc3Bvc2UgYW55IGV4aXN0aW5nIEJTNSBwb3BvdmVycyBiZWZvcmUgY2xlYXJpbmcgdGhlIGxpc3QuXG4gIGxpc3RFbC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1icy10b2dnbGU9XCJwb3BvdmVyXCJdJykuZm9yRWFjaChlbCA9PiB7XG4gICAgd2luZG93LmJvb3RzdHJhcD8uUG9wb3Zlcj8uZ2V0SW5zdGFuY2UoZWwpPy5kaXNwb3NlKCk7XG4gIH0pO1xuXG4gIGxpc3RFbC5pbm5lckhUTUwgPSAnJztcbiAgcHJvdmlkZXJzLmZvckVhY2gocHJvdmlkZXIgPT4ge1xuICAgIGNvbnN0IGNoZWNrZWQgPSBwcm92aWRlciA9PT0gX21vZGVsV2l6YXJkU2VsZWN0ZWRQcm92aWRlcjtcbiAgICBjb25zdCBzb3VyY2VMYWJlbCA9IF9wcm92aWRlclN0YWdlTGFiZWwocHJvdmlkZXIsIGNhcGFibGVTZXQpO1xuICAgIGNvbnN0IGluZm8gPSBnZXRQcm92aWRlckluZm8ocHJvdmlkZXIpO1xuXG4gICAgY29uc3QgbGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsYWJlbCcpO1xuICAgIGxhYmVsLnN0eWxlLmNzc1RleHQgPSAnZGlzcGxheTpmbGV4OyBhbGlnbi1pdGVtczpjZW50ZXI7IGdhcDo2cHg7IHBhZGRpbmc6NHB4IDhweDsgYm9yZGVyOjFweCBzb2xpZCAjY2JkNWUxOyBib3JkZXItcmFkaXVzOjk5OXB4OyBmb250LXNpemU6MC44MmVtOyBiYWNrZ3JvdW5kOiNmZmY7IGN1cnNvcjpwb2ludGVyOyc7XG4gICAgbGFiZWwuaW5uZXJIVE1MID1cbiAgICAgIGA8aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cIm1vZGVsLXByb3ZpZGVyLWNob2ljZVwiIHZhbHVlPVwiJHtlc2NhcGVIdG1sKHByb3ZpZGVyKX1cIiAke2NoZWNrZWQgPyAnY2hlY2tlZCcgOiAnJ30gc3R5bGU9XCJtYXJnaW46MDtcIiAvPmAgK1xuICAgICAgYDxzcGFuPiR7ZXNjYXBlSHRtbChfcHJvdmlkZXJEaXNwbGF5TGFiZWwocHJvdmlkZXIpKX08L3NwYW4+YCArXG4gICAgICBgPHNwYW4gc3R5bGU9XCJjb2xvcjojNjQ3NDhiOyBmb250LXNpemU6MC44ZW07XCI+KCR7ZXNjYXBlSHRtbChzb3VyY2VMYWJlbCl9KTwvc3Bhbj5gO1xuXG4gICAgLy8gQXBwZW5kIGEgXHUyNEQ4IGJ1dHRvbiB3aXJlZCB0byBhIEJTNSBIVE1MIHBvcG92ZXIgc28gbGlua3MgaW5zaWRlIGFyZSBjbGlja2FibGUuXG4gICAgaWYgKGluZm8pIHtcbiAgICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgICAgYnRuLnR5cGUgPSAnYnV0dG9uJztcbiAgICAgIGJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnUHJvdmlkZXIgaW5mbycpO1xuICAgICAgYnRuLnNldEF0dHJpYnV0ZSgnZGF0YS1icy10b2dnbGUnLCAncG9wb3ZlcicpO1xuICAgICAgYnRuLnNldEF0dHJpYnV0ZSgnZGF0YS1icy10cmlnZ2VyJywgJ2NsaWNrJyk7XG4gICAgICBidG4uc2V0QXR0cmlidXRlKCdkYXRhLWJzLXBsYWNlbWVudCcsICdyaWdodCcpO1xuICAgICAgYnRuLnNldEF0dHJpYnV0ZSgnZGF0YS1icy1odG1sJywgJ3RydWUnKTtcbiAgICAgIGJ0bi5zZXRBdHRyaWJ1dGUoJ2RhdGEtYnMtY29udGFpbmVyJywgJ2JvZHknKTtcbiAgICAgIGJ0bi5zZXRBdHRyaWJ1dGUoJ2RhdGEtYnMtY29udGVudCcsIHByb3ZpZGVySW5mb1BvcG92ZXJDb250ZW50KGluZm8pKTtcbiAgICAgIGJ0bi5zdHlsZS5jc3NUZXh0ID0gJ2JhY2tncm91bmQ6bm9uZTtib3JkZXI6bm9uZTtjdXJzb3I6cG9pbnRlcjtjb2xvcjojNjQ3NDhiO2ZvbnQtc2l6ZTowLjllbTtwYWRkaW5nOjAgMXB4O2xpbmUtaGVpZ2h0OjE7dmVydGljYWwtYWxpZ246bWlkZGxlOyc7XG4gICAgICBidG4udGV4dENvbnRlbnQgPSAnXHUyNEQ4JztcbiAgICAgIC8vIFByZXZlbnQgdGhlIHJhZGlvLWxhYmVsIGNsaWNrIGZyb20gcHJvcGFnYXRpbmcgdG8gdGhlIHJhZGlvIGJ1dHRvbi5cbiAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGUgPT4gZS5zdG9wUHJvcGFnYXRpb24oKSk7XG4gICAgICBsYWJlbC5hcHBlbmRDaGlsZChidG4pO1xuXG4gICAgICAvLyBJbml0aWFsaXNlIGFmdGVyIGFwcGVuZCBcdTIwMTQgQlM1IG11c3QgZmluZCB0aGUgZWxlbWVudCBpbiB0aGUgRE9NLlxuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgaWYgKHdpbmRvdy5ib290c3RyYXA/LlBvcG92ZXIpIHtcbiAgICAgICAgICBuZXcgd2luZG93LmJvb3RzdHJhcC5Qb3BvdmVyKGJ0biwgeyBzYW5pdGl6ZTogZmFsc2UgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGNoZWNrYm94ID0gbGFiZWwucXVlcnlTZWxlY3RvcignaW5wdXQnKTtcbiAgICBjaGVja2JveC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICBpZiAoIWNoZWNrYm94LmNoZWNrZWQpIHJldHVybjtcbiAgICAgIF9tb2RlbFdpemFyZFNlbGVjdGVkUHJvdmlkZXIgPSBwcm92aWRlcjtcbiAgICAgIF9zZWxlY3RlZE1vZGVsUHJvdmlkZXJzID0gbmV3IFNldChbcHJvdmlkZXJdKTtcbiAgICAgIF91cGRhdGVNb2RlbFdpemFyZE5hdigpO1xuICAgIH0pO1xuXG4gICAgbGlzdEVsLmFwcGVuZENoaWxkKGxhYmVsKTtcbiAgfSk7XG5cbiAgX3VwZGF0ZU1vZGVsV2l6YXJkTmF2KCk7XG59XG5cbmZ1bmN0aW9uIF9zaG93TW9kZWxXaXphcmRCdXN5KG1lc3NhZ2UpIHtcbiAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC13aXphcmQtYnVzeS1vdmVybGF5Jyk7XG4gIGNvbnN0IG1lc3NhZ2VFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC13aXphcmQtYnVzeS1tZXNzYWdlJyk7XG4gIGlmIChtZXNzYWdlRWwpIG1lc3NhZ2VFbC50ZXh0Q29udGVudCA9IG1lc3NhZ2UgfHwgJ1dvcmtpbmcuLi4nO1xuICBpZiAob3ZlcmxheSkgb3ZlcmxheS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xufVxuXG5mdW5jdGlvbiBfaGlkZU1vZGVsV2l6YXJkQnVzeSgpIHtcbiAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC13aXphcmQtYnVzeS1vdmVybGF5Jyk7XG4gIGlmIChvdmVybGF5KSBvdmVybGF5LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG59XG5cbmZ1bmN0aW9uIF9zZXRNb2RlbFdpemFyZFN0ZXAoc3RlcCkge1xuICBfbW9kZWxXaXphcmRTdGVwID0gWzEsIDIsIDMsIDRdLmluY2x1ZGVzKHN0ZXApID8gc3RlcCA6IDE7XG4gIGNvbnN0IHBhbmVzID0ge1xuICAgIDE6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1zdGVwLXByb3ZpZGVyJyksXG4gICAgMjogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLXN0ZXAtYXV0aCcpLFxuICAgIDM6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1zdGVwLW1vZGVscycpLFxuICAgIDQ6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1zdGVwLXN1Y2Nlc3MnKSxcbiAgfTtcbiAgT2JqZWN0LmVudHJpZXMocGFuZXMpLmZvckVhY2goKFtudW0sIGVsXSkgPT4ge1xuICAgIGlmIChlbCkgZWwuc3R5bGUuZGlzcGxheSA9IE51bWJlcihudW0pID09PSBfbW9kZWxXaXphcmRTdGVwID8gJycgOiAnbm9uZSc7XG4gIH0pO1xuICBpZiAoX21vZGVsV2l6YXJkU3RlcCA9PT0gMikge1xuICAgIF9yZW5kZXJBdXRoU3RlcChfbW9kZWxXaXphcmRTZWxlY3RlZFByb3ZpZGVyKTtcbiAgfVxuICBfdXBkYXRlTW9kZWxXaXphcmROYXYoKTtcbn1cblxuZnVuY3Rpb24gX3VwZGF0ZU1vZGVsV2l6YXJkUHJvZ3Jlc3NCYXIoKSB7XG4gIFsxLCAyLCAzLCA0XS5mb3JFYWNoKChzdGVwTnVtKSA9PiB7XG4gICAgY29uc3Qgc3RlcEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYG1vZGVsLXByb2dyZXNzLXN0ZXAtJHtzdGVwTnVtfWApO1xuICAgIGlmICghc3RlcEVsKSByZXR1cm47XG4gICAgY29uc3QgYmFkZ2VFbCA9IHN0ZXBFbC5xdWVyeVNlbGVjdG9yKCcubW9kZWwtcHJvZ3Jlc3MtYmFkZ2UnKTtcbiAgICBzdGVwRWwuY2xhc3NMaXN0LnJlbW92ZSgnaXMtYWN0aXZlJywgJ2lzLWNvbXBsZXRlJywgJ2lzLXVwY29taW5nJyk7XG4gICAgaWYgKHN0ZXBOdW0gPCBfbW9kZWxXaXphcmRTdGVwKSB7XG4gICAgICBzdGVwRWwuY2xhc3NMaXN0LmFkZCgnaXMtY29tcGxldGUnKTtcbiAgICAgIHN0ZXBFbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtY3VycmVudCcsICdmYWxzZScpO1xuICAgICAgaWYgKGJhZGdlRWwpIGJhZGdlRWwudGV4dENvbnRlbnQgPSAnXHUyNzEzJztcbiAgICB9IGVsc2UgaWYgKHN0ZXBOdW0gPT09IF9tb2RlbFdpemFyZFN0ZXApIHtcbiAgICAgIHN0ZXBFbC5jbGFzc0xpc3QuYWRkKCdpcy1hY3RpdmUnKTtcbiAgICAgIHN0ZXBFbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtY3VycmVudCcsICdzdGVwJyk7XG4gICAgICBpZiAoYmFkZ2VFbCkgYmFkZ2VFbC50ZXh0Q29udGVudCA9IFN0cmluZyhzdGVwTnVtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RlcEVsLmNsYXNzTGlzdC5hZGQoJ2lzLXVwY29taW5nJyk7XG4gICAgICBzdGVwRWwuc2V0QXR0cmlidXRlKCdhcmlhLWN1cnJlbnQnLCAnZmFsc2UnKTtcbiAgICAgIGlmIChiYWRnZUVsKSBiYWRnZUVsLnRleHRDb250ZW50ID0gU3RyaW5nKHN0ZXBOdW0pO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIF91cGRhdGVNb2RlbFdpemFyZE5hdigpIHtcbiAgY29uc3Qgc3RlcExhYmVsICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC13aXphcmQtc3RlcC1sYWJlbCcpO1xuICBjb25zdCBiYWNrQnRuICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLXdpemFyZC1iYWNrLWJ0bicpO1xuICBjb25zdCBuZXh0QnRuICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLXdpemFyZC1uZXh0LWJ0bicpO1xuICBjb25zdCB0ZXN0QnRuICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLXRlc3QtYnRuJyk7XG4gIGNvbnN0IHJlZnJlc2hCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJpY2luZy1yZWZyZXNoLWJ0bicpO1xuICBjb25zdCBmb290ZXIgICAgID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm1vZGVsLXdpemFyZC1mb290ZXInKTtcblxuICBfdXBkYXRlTW9kZWxXaXphcmRQcm9ncmVzc0JhcigpO1xuXG4gIGlmIChzdGVwTGFiZWwpIHtcbiAgICBjb25zdCBsYWJlbHMgPSB7XG4gICAgICAxOiAnU3RlcCAxIG9mIDQ6IENob29zZSBwcm92aWRlcicsXG4gICAgICAyOiAnU3RlcCAyIG9mIDQ6IFNldCB1cCBhdXRoZW50aWNhdGlvbicsXG4gICAgICAzOiAnU3RlcCAzIG9mIDQ6IENob29zZSBtb2RlbCBhbmQgdGVzdCBjb25uZWN0aW9uJyxcbiAgICAgIDQ6ICdTdGVwIDQgb2YgNDogQ29tcGxldGUnLFxuICAgIH07XG4gICAgc3RlcExhYmVsLnRleHRDb250ZW50ID0gbGFiZWxzW19tb2RlbFdpemFyZFN0ZXBdIHx8ICcnO1xuICB9XG5cbiAgaWYgKGJhY2tCdG4pIHtcbiAgICBiYWNrQnRuLmRpc2FibGVkID0gX21vZGVsV2l6YXJkU3RlcCA9PT0gMTtcbiAgICBiYWNrQnRuLnN0eWxlLmRpc3BsYXkgPSBfbW9kZWxXaXphcmRTdGVwID09PSA0ID8gJ25vbmUnIDogJyc7XG4gIH1cbiAgLy8gTmV4dCBidXR0b246IHZpc2libGUgb24gc3RlcHMgMSBhbmQgMlxuICBpZiAobmV4dEJ0bikge1xuICAgIG5leHRCdG4uc3R5bGUuZGlzcGxheSA9IChfbW9kZWxXaXphcmRTdGVwID09PSAxIHx8IF9tb2RlbFdpemFyZFN0ZXAgPT09IDIpID8gJycgOiAnbm9uZSc7XG4gICAgbmV4dEJ0bi5kaXNhYmxlZCA9IF9tb2RlbFdpemFyZFN0ZXAgPT09IDEgJiYgIV9tb2RlbFdpemFyZFNlbGVjdGVkUHJvdmlkZXI7XG4gICAgbmV4dEJ0bi50ZXh0Q29udGVudCA9IF9tb2RlbFdpemFyZFN0ZXAgPT09IDIgPyAnTmV4dCcgOiAnTmV4dCc7XG4gIH1cbiAgaWYgKHRlc3RCdG4pICAgIHRlc3RCdG4uc3R5bGUuZGlzcGxheSAgICA9IF9tb2RlbFdpemFyZFN0ZXAgPT09IDMgPyAnJyA6ICdub25lJztcbiAgaWYgKHJlZnJlc2hCdG4pIHJlZnJlc2hCdG4uc3R5bGUuZGlzcGxheSA9IF9tb2RlbFdpemFyZFN0ZXAgPT09IDMgPyAnJyA6ICdub25lJztcbiAgaWYgKGZvb3RlcikgZm9vdGVyLnN0eWxlLmp1c3RpZnlDb250ZW50ICA9IF9tb2RlbFdpemFyZFN0ZXAgPT09IDQgPyAnY2VudGVyJyA6ICdzcGFjZS1iZXR3ZWVuJztcbn1cblxuYXN5bmMgZnVuY3Rpb24gX2xvYWRNb2RlbHNGb3JTZWxlY3RlZFByb3ZpZGVyKCkge1xuICBpZiAoIV9tb2RlbFdpemFyZFNlbGVjdGVkUHJvdmlkZXIpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBsb2FkaW5nRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtbW9kZWxzLWxvYWRpbmcnKTtcbiAgaWYgKGxvYWRpbmdFbCkge1xuICAgIGxvYWRpbmdFbC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgbG9hZGluZ0VsLnN0eWxlLmNvbG9yID0gJyM0NzU1NjknO1xuICAgIGxvYWRpbmdFbC5pbm5lckhUTUwgPSAnPHNwYW4gY2xhc3M9XCJsb2FkaW5nLXNwaW5uZXJcIiBzdHlsZT1cIndpZHRoOjE0cHg7aGVpZ2h0OjE0cHg7Ym9yZGVyLXdpZHRoOjJweDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7bWFyZ2luLXJpZ2h0OjZweDtcIj48L3NwYW4+TG9hZGluZyBtb2RlbHMgZm9yIHNlbGVjdGVkIHByb3ZpZGVyLi4uJztcbiAgfVxuXG4gIF9zaG93TW9kZWxXaXphcmRCdXN5KCdRdWVyeWluZyBhdmFpbGFibGUgbW9kZWxzLi4uJyk7XG4gIHRyeSB7XG4gICAgX3NlbGVjdGVkTW9kZWxQcm92aWRlcnMgPSBuZXcgU2V0KFtfbW9kZWxXaXphcmRTZWxlY3RlZFByb3ZpZGVyXSk7XG4gICAgX21vZGVsRGF0YS5wcm92aWRlciA9IF9tb2RlbFdpemFyZFNlbGVjdGVkUHJvdmlkZXI7XG4gICAgYXdhaXQgX3JlZnJlc2hNb2RlbENhdGFsb2dGb3JTZWxlY3Rpb24oKTtcbiAgICBpZiAobG9hZGluZ0VsKSB7XG4gICAgICBsb2FkaW5nRWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIGxvYWRpbmdFbC50ZXh0Q29udGVudCA9ICcnO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cud2FybignQ291bGQgbm90IGxvYWQgbW9kZWxzIGZvciBzZWxlY3RlZCBwcm92aWRlcjonLCBlcnJvcik7XG4gICAgaWYgKGxvYWRpbmdFbCkge1xuICAgICAgbG9hZGluZ0VsLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIGxvYWRpbmdFbC50ZXh0Q29udGVudCA9ICdGYWlsZWQgdG8gbG9hZCBtb2RlbHMgZm9yIHNlbGVjdGVkIHByb3ZpZGVyLic7XG4gICAgICBsb2FkaW5nRWwuc3R5bGUuY29sb3IgPSAnI2I5MWMxYyc7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSBmaW5hbGx5IHtcbiAgICBfaGlkZU1vZGVsV2l6YXJkQnVzeSgpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG5leHRXaXphcmRTdGVwKCkge1xuICBpZiAoX21vZGVsV2l6YXJkU3RlcCA9PT0gMSkge1xuICAgIGlmICghX21vZGVsV2l6YXJkU2VsZWN0ZWRQcm92aWRlcikgcmV0dXJuO1xuICAgIF9zZXRNb2RlbFdpemFyZFN0ZXAoMik7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChfbW9kZWxXaXphcmRTdGVwID09PSAyKSB7XG4gICAgY29uc3QgbG9hZGVkID0gYXdhaXQgX2xvYWRNb2RlbHNGb3JTZWxlY3RlZFByb3ZpZGVyKCk7XG4gICAgaWYgKCFsb2FkZWQpIHJldHVybjtcbiAgICBfc2V0TW9kZWxXaXphcmRTdGVwKDMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHByZXZpb3VzV2l6YXJkU3RlcCgpIHtcbiAgaWYgKF9tb2RlbFdpemFyZFN0ZXAgPT09IDIpIHsgX3NldE1vZGVsV2l6YXJkU3RlcCgxKTsgcmV0dXJuOyB9XG4gIGlmIChfbW9kZWxXaXphcmRTdGVwID09PSAzKSB7IF9zZXRNb2RlbFdpemFyZFN0ZXAoMik7IHJldHVybjsgfVxuICBpZiAoX21vZGVsV2l6YXJkU3RlcCA9PT0gNCkgeyBfc2V0TW9kZWxXaXphcmRTdGVwKDMpOyB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9yZWZyZXNoTW9kZWxDYXRhbG9nRm9yU2VsZWN0aW9uKCkge1xuICBpZiAoIV9tb2RlbERhdGEpIHJldHVybjtcbiAgaWYgKF9jYXRhbG9nUmVmcmVzaGluZykge1xuICAgIF9jYXRhbG9nUmVmcmVzaFBlbmRpbmcgPSB0cnVlO1xuICAgIHJldHVybjtcbiAgfVxuICBfY2F0YWxvZ1JlZnJlc2hpbmcgPSB0cnVlO1xuXG4gIHRyeSB7XG4gICAgY29uc3Qgc2VsZWN0ZWQgPSBBcnJheS5mcm9tKF9zZWxlY3RlZE1vZGVsUHJvdmlkZXJzKTtcbiAgICBpZiAoIXNlbGVjdGVkLmxlbmd0aCkge1xuICAgICAgX3NlbGVjdGVkTW9kZWxQcm92aWRlcnMgPSBuZXcgU2V0KFtfbW9kZWxEYXRhLnByb3ZpZGVyXSk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvdmlkZXJzUGFyYW0gPSBlbmNvZGVVUklDb21wb25lbnQoQXJyYXkuZnJvbShfc2VsZWN0ZWRNb2RlbFByb3ZpZGVycykuam9pbignLCcpKTtcbiAgICBjb25zdCBjYXRhbG9nID0gYXdhaXQgYXBpQ2FsbCgnR0VUJywgYC9hcGkvbW9kZWwtY2F0YWxvZz9wcm92aWRlcnM9JHtwcm92aWRlcnNQYXJhbX1gKTtcbiAgICBfbW9kZWxEYXRhLmFsbF9tb2RlbHMgPSBjYXRhbG9nLmFsbF9tb2RlbHMgfHwgW107XG4gICAgX21vZGVsRGF0YS5wcmljaW5nX3VwZGF0ZWRfYXQgPSBjYXRhbG9nLnByaWNpbmdfdXBkYXRlZF9hdCB8fCBfbW9kZWxEYXRhLnByaWNpbmdfdXBkYXRlZF9hdDtcbiAgICBfbW9kZWxEYXRhLnByaWNpbmdfc291cmNlID0gY2F0YWxvZy5wcmljaW5nX3NvdXJjZSB8fCBfbW9kZWxEYXRhLnByaWNpbmdfc291cmNlO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGNhdGFsb2cucHJvdmlkZXJzKSAmJiBjYXRhbG9nLnByb3ZpZGVycy5sZW5ndGgpIHtcbiAgICAgIF9tb2RlbERhdGEucHJvdmlkZXJzID0gY2F0YWxvZy5wcm92aWRlcnM7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KGNhdGFsb2cubGlzdF9tb2RlbHNfY2FwYWJsZSkpIHtcbiAgICAgIF9tb2RlbERhdGEubGlzdF9tb2RlbHNfY2FwYWJsZSA9IGNhdGFsb2cubGlzdF9tb2RlbHNfY2FwYWJsZTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nLndhcm4oJ0NvdWxkIG5vdCByZWZyZXNoIG1vZGVsIGNhdGFsb2cgZm9yIHNlbGVjdGVkIHByb3ZpZGVyczonLCBlcnJvcik7XG4gIH0gZmluYWxseSB7XG4gICAgX2NhdGFsb2dSZWZyZXNoaW5nID0gZmFsc2U7XG4gIH1cblxuICBfcmVuZGVyUHJvdmlkZXJTZWxlY3RvcigpO1xuICBfYnVpbGRNb2RlbFRhYmxlKCk7XG5cbiAgaWYgKF9jYXRhbG9nUmVmcmVzaFBlbmRpbmcpIHtcbiAgICBfY2F0YWxvZ1JlZnJlc2hQZW5kaW5nID0gZmFsc2U7XG4gICAgYXdhaXQgX3JlZnJlc2hNb2RlbENhdGFsb2dGb3JTZWxlY3Rpb24oKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBvcGVuTW9kZWxNb2RhbCgpIHtcbiAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1tb2RhbC1vdmVybGF5Jyk7XG4gIGlmICghb3ZlcmxheSkgcmV0dXJuO1xuXG4gIGlmICghX21vZGVsRGF0YSkge1xuICAgIGF3YWl0IGxvYWRNb2RlbFNlbGVjdG9yKCk7XG4gIH1cbiAgYXdhaXQgbG9hZFByb3ZpZGVySW5mbygpO1xuICBpZiAoIV9tb2RlbFdpemFyZFNlbGVjdGVkUHJvdmlkZXIpIHtcbiAgICBfbW9kZWxXaXphcmRTZWxlY3RlZFByb3ZpZGVyID0gX21vZGVsRGF0YT8ucHJvdmlkZXIgfHwgbnVsbDtcbiAgfVxuICBjb25zdCBzdWNjZXNzU3VtbWFyeSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1zdWNjZXNzLXN1bW1hcnknKTtcbiAgaWYgKHN1Y2Nlc3NTdW1tYXJ5KSB7XG4gICAgc3VjY2Vzc1N1bW1hcnkudGV4dENvbnRlbnQgPSAnUHJvdmlkZXIgYW5kIG1vZGVsIGFyZSBjb25maWd1cmVkIGFuZCB0aGUgY29ubmVjdGlvbiBjaGVjayBzdWNjZWVkZWQuJztcbiAgfVxuICBfcmVuZGVyUHJvdmlkZXJTZWxlY3RvcigpO1xuICBfc3luY0NhdGFsb2dWaXNpYmlsaXR5KCk7XG4gIF93aXJlR2xvYmFsTW9kZWxTZWFyY2goKTtcbiAgX3NldE1vZGVsV2l6YXJkU3RlcCgxKTtcbiAgX2hpZGVNb2RlbFdpemFyZEJ1c3koKTtcbiAgb3ZlcmxheS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICBfZm9jdXNTdGFjay5wdXNoKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpO1xuICBzZXRJbml0aWFsRm9jdXMoJ21vZGVsLW1vZGFsLW92ZXJsYXknKTtcbiAgdHJhcEZvY3VzKCdtb2RlbC1tb2RhbC1vdmVybGF5Jyk7XG59XG5cbmZ1bmN0aW9uIGNsb3NlTW9kZWxNb2RhbCgpIHtcbiAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1tb2RhbC1vdmVybGF5Jyk7XG4gIGlmIChvdmVybGF5KSBvdmVybGF5LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIF9zZXRNb2RlbFdpemFyZFN0ZXAoMSk7XG4gIF9oaWRlTW9kZWxXaXphcmRCdXN5KCk7XG4gIGlmIChfY29waWxvdEF1dGhQb2xsVGltZXIpIHtcbiAgICBjbGVhckludGVydmFsKF9jb3BpbG90QXV0aFBvbGxUaW1lcik7XG4gICAgX2NvcGlsb3RBdXRoUG9sbFRpbWVyID0gbnVsbDtcbiAgfVxuICByZXN0b3JlRm9jdXMoKTtcbn1cblxuZnVuY3Rpb24gX2FwcGx5TW9kZWxSb3dWaXN1YWxTdGF0ZSh0ciwgaXNBY3RpdmUpIHtcbiAgdHIuY2xhc3NMaXN0LnRvZ2dsZSgnbW9kZWwtcm93LWFjdGl2ZScsIGlzQWN0aXZlKTtcbiAgdHIuc3R5bGUuY3NzVGV4dCA9IGlzQWN0aXZlXG4gICAgPyAnYmFja2dyb3VuZDojZWZmNmZmOyBmb250LXdlaWdodDo2MDA7IGN1cnNvcjpwb2ludGVyOydcbiAgICA6ICdjdXJzb3I6cG9pbnRlcjsnO1xuXG4gIGNvbnN0IG1vZGVsID0gdHIuZ2V0QXR0cmlidXRlKCdkYXRhLW1vZGVsJykgfHwgJyc7XG4gIGNvbnN0IG1vZGVsQ2VsbCA9IHRyLmNlbGxzICYmIHRyLmNlbGxzWzFdO1xuICBpZiAobW9kZWxDZWxsKSB7XG4gICAgbW9kZWxDZWxsLmlubmVySFRNTCA9IGAke2VzY2FwZUh0bWwobW9kZWwpfWAgK1xuICAgICAgKGlzQWN0aXZlID8gJyA8c3BhbiBzdHlsZT1cImNvbG9yOiMzYjgyZjY7IGZvbnQtc2l6ZTowLjc1ZW07XCI+JiMxMDAwMzsgYWN0aXZlPC9zcGFuPicgOiAnJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX3N5bmNNb2RlbFRhYmxlU2VsZWN0aW9uKCkge1xuICBjb25zdCB0Ym9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC10YWJsZS1ib2R5Jyk7XG4gIGlmICghdGJvZHkgfHwgIV9tb2RlbERhdGEpIHJldHVybjtcblxuICBjb25zdCBhY3RpdmVQcm92aWRlciA9IF9tb2RlbERhdGEucHJvdmlkZXI7XG4gIGNvbnN0IGFjdGl2ZU1vZGVsID0gX21vZGVsRGF0YS5tb2RlbDtcbiAgdGJvZHkucXVlcnlTZWxlY3RvckFsbCgndHInKS5mb3JFYWNoKHRyID0+IHtcbiAgICBjb25zdCBpc0FjdGl2ZSA9IChcbiAgICAgIHRyLmdldEF0dHJpYnV0ZSgnZGF0YS1wcm92aWRlcicpID09PSBhY3RpdmVQcm92aWRlciAmJlxuICAgICAgdHIuZ2V0QXR0cmlidXRlKCdkYXRhLW1vZGVsJykgPT09IGFjdGl2ZU1vZGVsXG4gICAgKTtcbiAgICBfYXBwbHlNb2RlbFJvd1Zpc3VhbFN0YXRlKHRyLCBpc0FjdGl2ZSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBfYnVpbGRNb2RlbFRhYmxlKCkge1xuICBjb25zdCB0Ym9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC10YWJsZS1ib2R5Jyk7XG4gIGNvbnN0IHRoZWFkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLXRhYmxlLWhlYWQnKTtcbiAgaWYgKCF0Ym9keSB8fCAhX21vZGVsRGF0YSkgcmV0dXJuO1xuXG4gIGNvbnN0IGN1cnJlbnRQcm92aWRlciA9IF9tb2RlbERhdGEucHJvdmlkZXI7XG4gIGNvbnN0IGN1cnJlbnRNb2RlbCAgICA9IF9tb2RlbERhdGEubW9kZWw7XG5cbiAgLy8gRml4ZWQgNy1jb2x1bW4gaGVhZGVycyBcdTIwMTQgbm8gZHluYW1pYyByZWJ1aWxkaW5nIG5lZWRlZFxuICBpZiAodGhlYWQpIHtcbiAgICBjb25zdCB0aFMgPSAncGFkZGluZzoxMHB4IDE0cHg7IHdoaXRlLXNwYWNlOm5vd3JhcDsnO1xuICAgIHRoZWFkLmlubmVySFRNTCA9XG4gICAgICBgPHRyIHN0eWxlPVwiYmFja2dyb3VuZDojZjFmNWY5OyB0ZXh0LWFsaWduOmxlZnQ7XCI+YCArXG4gICAgICAgIGA8dGggc3R5bGU9XCIke3RoU31cIj5Qcm92aWRlcjwvdGg+YCArXG4gICAgICAgIGA8dGggc3R5bGU9XCIke3RoU31cIj5Nb2RlbDwvdGg+YCArXG4gICAgICAgIGA8dGggc3R5bGU9XCIke3RoU30gdGV4dC1hbGlnbjpyaWdodDtcIj5Db250ZXh0PC90aD5gICtcbiAgICAgICAgYDx0aCBzdHlsZT1cIiR7dGhTfSB0ZXh0LWFsaWduOnJpZ2h0O1wiIHRpdGxlPVwiVVNEIHBlciAxTSBpbnB1dCB0b2tlbnMgKGRpcmVjdCBBUEkgYmlsbGluZylcIj4kLzFNIGluPC90aD5gICtcbiAgICAgICAgYDx0aCBzdHlsZT1cIiR7dGhTfSB0ZXh0LWFsaWduOnJpZ2h0O1wiIHRpdGxlPVwiVVNEIHBlciAxTSBvdXRwdXQgdG9rZW5zIChkaXJlY3QgQVBJIGJpbGxpbmcpXCI+JC8xTSBvdXQ8L3RoPmAgK1xuICAgICAgICBgPHRoIHN0eWxlPVwiJHt0aFN9IHRleHQtYWxpZ246cmlnaHQ7XCIgdGl0bGU9XCJHaXRIdWIgQ29waWxvdCBwcmVtaXVtLXJlcXVlc3QgbXVsdGlwbGllciAoMCA9IGZyZWUgZm9yIHBhaWQgc3Vic2NyaWJlcnMpXCI+Q29waWxvdDwvdGg+YCArXG4gICAgICAgIGA8dGggc3R5bGU9XCIke3RoU31cIj5Tb3VyY2U8L3RoPmAgK1xuICAgICAgICBgPHRoIHN0eWxlPVwiJHt0aFN9XCI+Tm90ZXM8L3RoPmAgK1xuICAgICAgYDwvdHI+YDtcbiAgfVxuXG4gIC8vIFRlYXIgZG93biBhbnkgZXhpc3RpbmcgRGF0YVRhYmxlIGJlZm9yZSByZWJ1aWxkaW5nIHJvd3MuXG4gIGlmICh3aW5kb3cuJCAmJiAkLmZuICYmICQuZm4uRGF0YVRhYmxlICYmICQuZm4uRGF0YVRhYmxlLmlzRGF0YVRhYmxlKCcjbW9kZWwtdGFibGUnKSkge1xuICAgIHRyeSB7XG4gICAgICBfbW9kZWxEYXRhVGFibGUgPSAkKCcjbW9kZWwtdGFibGUnKS5EYXRhVGFibGUoKTtcbiAgICAgIF9tb2RlbERhdGFUYWJsZS5kZXN0cm95KCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nLndhcm4oJ0RhdGFUYWJsZS5kZXN0cm95KCkgZmFpbGVkICh0YWJsZSBtYXkgYWxyZWFkeSBiZSB0b3JuIGRvd24pOicsIGUpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBfbW9kZWxEYXRhVGFibGUgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8vIFByZWZlciBjcm9zcy1wcm92aWRlciBsaXN0OyBmYWxsIGJhY2sgdG8gY3VycmVudC1wcm92aWRlciBhdmFpbGFibGUgbGlzdFxuICBsZXQgcm93cyA9IChfbW9kZWxEYXRhLmFsbF9tb2RlbHMgJiYgX21vZGVsRGF0YS5hbGxfbW9kZWxzLmxlbmd0aClcbiAgICA/IF9tb2RlbERhdGEuYWxsX21vZGVscy5maWx0ZXIociA9PiByLm1vZGVsKVxuICAgIDogKF9tb2RlbERhdGEuYXZhaWxhYmxlIHx8IFtdKS5tYXAociA9PlxuICAgICAgICB0eXBlb2YgciA9PT0gJ29iamVjdCdcbiAgICAgICAgICA/IHsgLi4uciwgcHJvdmlkZXI6IGN1cnJlbnRQcm92aWRlciB9XG4gICAgICAgICAgOiB7IG1vZGVsOiByLCBwcm92aWRlcjogY3VycmVudFByb3ZpZGVyIH1cbiAgICAgICk7XG5cbiAgX3JlbmRlclF1aWNrTW9kZWxMaXN0KHJvd3MpO1xuICB0Ym9keS5pbm5lckhUTUwgPSAnJztcbiAgY29uc3QgdGRCYXNlICA9ICdwYWRkaW5nOjlweCAxNHB4OyBib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZTJlOGYwOyc7XG4gIGNvbnN0IGZtdENvc3QgPSB2ID0+ICh2ICE9IG51bGwpID8gJyQnICsgTnVtYmVyKHYpLnRvRml4ZWQodiA8IDEgPyAzIDogMikgOiAnXHUyMDE0JztcbiAgY29uc3QgZm10UHJpY2VIaW50ID0gc291cmNlID0+IHtcbiAgICBpZiAoc291cmNlID09PSAncnVudGltZV9jYWNoZScpIHtcbiAgICAgIHJldHVybiAnPHNwYW4gdGl0bGU9XCJQcmljZSBmcm9tIHJ1bnRpbWUgY2FjaGVcIiBzdHlsZT1cIm1hcmdpbi1sZWZ0OjZweDsgZGlzcGxheTppbmxpbmUtYmxvY2s7IHBhZGRpbmc6MXB4IDVweDsgYm9yZGVyLXJhZGl1czo5OTlweDsgYmFja2dyb3VuZDojZWNmZWZmOyBjb2xvcjojMGY3NjZlOyBmb250LXNpemU6MC43MmVtOyBmb250LXdlaWdodDo2MDA7IHZlcnRpY2FsLWFsaWduOm1pZGRsZTtcIj5jYWNoZTwvc3Bhbj4nO1xuICAgIH1cbiAgICByZXR1cm4gJzxzcGFuIHRpdGxlPVwiUHJpY2UgZnJvbSBzdGF0aWMgYmFzZWxpbmVcIiBzdHlsZT1cIm1hcmdpbi1sZWZ0OjZweDsgZGlzcGxheTppbmxpbmUtYmxvY2s7IHBhZGRpbmc6MXB4IDVweDsgYm9yZGVyLXJhZGl1czo5OTlweDsgYmFja2dyb3VuZDojZjhmYWZjOyBjb2xvcjojNjQ3NDhiOyBmb250LXNpemU6MC43MmVtOyBmb250LXdlaWdodDo2MDA7IHZlcnRpY2FsLWFsaWduOm1pZGRsZTtcIj5zdGF0aWM8L3NwYW4+JztcbiAgfTtcbiAgY29uc3QgZm10U291cmNlID0gcyA9PiB7XG4gICAgaWYgKHMgPT09ICdsaXN0X21vZGVscycpIHtcbiAgICAgIHJldHVybiAnPHNwYW4gc3R5bGU9XCJkaXNwbGF5OmlubGluZS1ibG9jazsgcGFkZGluZzoycHggNnB4OyBib3JkZXItcmFkaXVzOjk5OXB4OyBiYWNrZ3JvdW5kOiNlY2ZlZmY7IGNvbG9yOiMwZjc2NmU7IGZvbnQtc2l6ZTowLjc4ZW07IGZvbnQtd2VpZ2h0OjYwMDtcIj5saXN0X21vZGVsczwvc3Bhbj4nO1xuICAgIH1cbiAgICByZXR1cm4gJzxzcGFuIHN0eWxlPVwiZGlzcGxheTppbmxpbmUtYmxvY2s7IHBhZGRpbmc6MnB4IDZweDsgYm9yZGVyLXJhZGl1czo5OTlweDsgYmFja2dyb3VuZDojZjFmNWY5OyBjb2xvcjojNDc1NTY5OyBmb250LXNpemU6MC43OGVtOyBmb250LXdlaWdodDo2MDA7XCI+ZmFsbGJhY2tfc3RhdGljPC9zcGFuPic7XG4gIH07XG4gIGNvbnN0IGZtdE11bHQgPSB2ID0+IHtcbiAgICBpZiAodiA9PSBudWxsKSByZXR1cm4gJ1x1MjAxNCc7XG4gICAgaWYgKHYgPT09IDApICAgcmV0dXJuICc8c3BhbiBzdHlsZT1cImNvbG9yOiMxNmEzNGE7IGZvbnQtd2VpZ2h0OjYwMDtcIj5mcmVlPC9zcGFuPic7XG4gICAgcmV0dXJuIE51bWJlcih2KS50b0ZpeGVkKHYgJSAxID09PSAwID8gMCA6IDIpICsgJyZ0aW1lczsnO1xuICB9O1xuXG4gIHJvd3MuZm9yRWFjaChpdGVtID0+IHtcbiAgICBjb25zdCBwcm92aWRlciAgID0gaXRlbS5wcm92aWRlciB8fCBjdXJyZW50UHJvdmlkZXI7XG4gICAgY29uc3QgbSAgICAgICAgICA9IGl0ZW0ubW9kZWw7XG4gICAgY29uc3QgY3R4ICAgICAgICA9IGl0ZW0uY29udGV4dF93aW5kb3cgPyBOdW1iZXIoaXRlbS5jb250ZXh0X3dpbmRvdykudG9Mb2NhbGVTdHJpbmcoKSA6ICdcdTIwMTQnO1xuICAgIGNvbnN0IHNvdXJjZSAgICAgPSBpdGVtLnNvdXJjZSB8fCAnZmFsbGJhY2tfc3RhdGljJztcbiAgICBjb25zdCBwcmljZVNvdXJjZSA9IGl0ZW0ucHJpY2Vfc291cmNlIHx8ICdzdGF0aWNfYmFzZWxpbmUnO1xuICAgIGNvbnN0IG5vdGVzICAgICAgPSBpdGVtLm5vdGVzIHx8ICcnO1xuICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSAocHJvdmlkZXIgPT09IGN1cnJlbnRQcm92aWRlciAmJiBtID09PSBjdXJyZW50TW9kZWwpO1xuXG4gICAgY29uc3QgdHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpO1xuICAgIHRyLnNldEF0dHJpYnV0ZSgnZGF0YS1wcm92aWRlcicsIHByb3ZpZGVyKTtcbiAgICB0ci5zZXRBdHRyaWJ1dGUoJ2RhdGEtbW9kZWwnLCBtKTtcbiAgICBfYXBwbHlNb2RlbFJvd1Zpc3VhbFN0YXRlKHRyLCBpc1NlbGVjdGVkKTtcbiAgICB0ci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCAoKSA9PiB7XG4gICAgICBpZiAoIXRyLmNsYXNzTGlzdC5jb250YWlucygnbW9kZWwtcm93LWFjdGl2ZScpKSB0ci5zdHlsZS5iYWNrZ3JvdW5kID0gJyNmOGZhZmMnO1xuICAgIH0pO1xuICAgIHRyLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0JywgKCkgPT4ge1xuICAgICAgaWYgKCF0ci5jbGFzc0xpc3QuY29udGFpbnMoJ21vZGVsLXJvdy1hY3RpdmUnKSkgdHIuc3R5bGUuYmFja2dyb3VuZCA9ICcnO1xuICAgIH0pO1xuXG4gICAgdHIuaW5uZXJIVE1MID1cbiAgICAgIGA8dGQgc3R5bGU9XCIke3RkQmFzZX0gY29sb3I6IzY0NzQ4Yjsgd2hpdGUtc3BhY2U6bm93cmFwO1wiPiR7ZXNjYXBlSHRtbChfcHJvdmlkZXJEaXNwbGF5TGFiZWwocHJvdmlkZXIpKX08L3RkPmAgK1xuICAgICAgYDx0ZCBzdHlsZT1cIiR7dGRCYXNlfVwiPiR7ZXNjYXBlSHRtbChtKX08L3RkPmAgK1xuICAgICAgYDx0ZCBzdHlsZT1cIiR7dGRCYXNlfSB3aGl0ZS1zcGFjZTpub3dyYXA7IHRleHQtYWxpZ246cmlnaHQ7IGZvbnQtdmFyaWFudC1udW1lcmljOnRhYnVsYXItbnVtcztcIj4ke2N0eH08L3RkPmAgK1xuICAgICAgYDx0ZCBzdHlsZT1cIiR7dGRCYXNlfSB0ZXh0LWFsaWduOnJpZ2h0OyBmb250LXZhcmlhbnQtbnVtZXJpYzp0YWJ1bGFyLW51bXM7IHdoaXRlLXNwYWNlOm5vd3JhcDtcIj4ke2ZtdENvc3QoaXRlbS5jb3N0X2lucHV0KX0ke2ZtdFByaWNlSGludChwcmljZVNvdXJjZSl9PC90ZD5gICtcbiAgICAgIGA8dGQgc3R5bGU9XCIke3RkQmFzZX0gdGV4dC1hbGlnbjpyaWdodDsgZm9udC12YXJpYW50LW51bWVyaWM6dGFidWxhci1udW1zOyB3aGl0ZS1zcGFjZTpub3dyYXA7XCI+JHtmbXRDb3N0KGl0ZW0uY29zdF9vdXRwdXQpfSR7Zm10UHJpY2VIaW50KHByaWNlU291cmNlKX08L3RkPmAgK1xuICAgICAgYDx0ZCBzdHlsZT1cIiR7dGRCYXNlfSB0ZXh0LWFsaWduOnJpZ2h0OyBmb250LXZhcmlhbnQtbnVtZXJpYzp0YWJ1bGFyLW51bXM7IHdoaXRlLXNwYWNlOm5vd3JhcDtcIj4ke2ZtdE11bHQoaXRlbS5jb3BpbG90X211bHRpcGxpZXIpfTwvdGQ+YCArXG4gICAgICBgPHRkIHN0eWxlPVwiJHt0ZEJhc2V9IHdoaXRlLXNwYWNlOm5vd3JhcDtcIj4ke2ZtdFNvdXJjZShzb3VyY2UpfTwvdGQ+YCArXG4gICAgICBgPHRkIHN0eWxlPVwiJHt0ZEJhc2V9IGNvbG9yOiM2NDc0OGI7XCI+JHtlc2NhcGVIdG1sKG5vdGVzKX08L3RkPmA7XG4gICAgdGJvZHkuYXBwZW5kQ2hpbGQodHIpO1xuICB9KTtcblxuICAvLyBSZWJpbmQgcm93IGNsaWNrIHVzaW5nIGRlbGVnYXRpb24gc28gc29ydGluZy9maWx0ZXIgcmVkcmF3cyBzdGlsbCB3b3JrLlxuICB0Ym9keS5vbmNsaWNrID0gYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgY29uc3QgdHIgPSBldmVudC50YXJnZXQuY2xvc2VzdCgndHInKTtcbiAgICBpZiAoIXRyKSByZXR1cm47XG4gICAgY29uc3QgcHJvdmlkZXIgPSB0ci5nZXRBdHRyaWJ1dGUoJ2RhdGEtcHJvdmlkZXInKTtcbiAgICBjb25zdCBtb2RlbCA9IHRyLmdldEF0dHJpYnV0ZSgnZGF0YS1tb2RlbCcpO1xuICAgIGlmICghbW9kZWwpIHJldHVybjtcblxuICAgIC8vIEltbWVkaWF0ZSBmZWVkYmFjayB3aGlsZSB0aGUgQVBJIGNhbGwgaXMgaW4tZmxpZ2h0XG4gICAgdHIuc3R5bGUuY3NzVGV4dCA9ICdiYWNrZ3JvdW5kOiNmZWYzYzc7IGN1cnNvcjp3YWl0OyBvcGFjaXR5OjAuODU7JztcbiAgICBjb25zdCBtb2RlbENlbGwgPSB0ci5jZWxscyAmJiB0ci5jZWxsc1sxXTtcbiAgICBpZiAobW9kZWxDZWxsKSB7XG4gICAgICBtb2RlbENlbGwuaW5uZXJIVE1MID1cbiAgICAgICAgYDxzcGFuIGNsYXNzPVwibG9hZGluZy1zcGlubmVyXCIgc3R5bGU9XCJ3aWR0aDoxNHB4O2hlaWdodDoxNHB4O2JvcmRlci13aWR0aDoycHg7dmVydGljYWwtYWxpZ246bWlkZGxlO21hcmdpbi1yaWdodDo2cHg7XCI+PC9zcGFuPiR7ZXNjYXBlSHRtbChtb2RlbCl9YDtcbiAgICB9XG4gICAgY29uc3Qgc3RhdHVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLXRlc3Qtc3RhdHVzJyk7XG4gICAgaWYgKHN0YXR1cykge1xuICAgICAgc3RhdHVzLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIHN0YXR1cy5zdHlsZS5jb2xvciAgID0gJyM5MjQwMGUnO1xuICAgICAgc3RhdHVzLmlubmVySFRNTCAgICAgPVxuICAgICAgICBgPHNwYW4gY2xhc3M9XCJsb2FkaW5nLXNwaW5uZXJcIiBzdHlsZT1cIndpZHRoOjE0cHg7aGVpZ2h0OjE0cHg7Ym9yZGVyLXdpZHRoOjJweDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7bWFyZ2luLXJpZ2h0OjZweDtcIj48L3NwYW4+IFN3aXRjaGluZyB0byAke2VzY2FwZUh0bWwobW9kZWwpfVxcdTIwMjZgO1xuICAgIH1cblxuICAgIGF3YWl0IHNldE1vZGVsKG1vZGVsLCBwcm92aWRlcik7XG4gIH07XG5cbiAgLy8gRW5oYW5jZSB3aXRoIERhdGFUYWJsZXMgZm9yIHNvcnRpbmcvc2VhcmNoaW5nOyBrZWVwIHBhZ2luZyBkaXNhYmxlZC5cbiAgaWYgKHdpbmRvdy4kICYmICQuZm4gJiYgJC5mbi5EYXRhVGFibGUpIHtcbiAgICBfbW9kZWxEYXRhVGFibGUgPSAkKCcjbW9kZWwtdGFibGUnKS5EYXRhVGFibGUoe1xuICAgICAgcGFnaW5nOiBmYWxzZSxcbiAgICAgIHNlYXJjaGluZzogdHJ1ZSxcbiAgICAgIGluZm86IGZhbHNlLFxuICAgICAgb3JkZXJDZWxsc1RvcDogdHJ1ZSxcbiAgICAgIG9yZGVyOiBbWzAsICdhc2MnXSwgWzEsICdhc2MnXV0sXG4gICAgICBhdXRvV2lkdGg6IGZhbHNlLFxuICAgICAgbGFuZ3VhZ2U6IHsgc2VhcmNoOiAnRmlsdGVyOicgfSxcbiAgICAgIGluaXRDb21wbGV0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIGNvbnN0IGFwaSA9IHRoaXMuYXBpKCk7XG4gICAgICAgIGNvbnN0ICR0aGVhZCA9ICQoJyNtb2RlbC10YWJsZSB0aGVhZCcpO1xuICAgICAgICBjb25zdCBoYXNGaWx0ZXJSb3cgPSAkdGhlYWQuZmluZCgndHIubW9kZWwtZmlsdGVyLXJvdycpLmxlbmd0aCA+IDA7XG4gICAgICAgIGlmICghaGFzRmlsdGVyUm93KSB7XG4gICAgICAgICAgY29uc3QgJGZpbHRlclJvdyA9ICQoJzx0ciBjbGFzcz1cIm1vZGVsLWZpbHRlci1yb3dcIj48L3RyPicpO1xuICAgICAgICAgIGFwaS5jb2x1bW5zKCkuZXZlcnkoZnVuY3Rpb24oY29sSWR4KSB7XG4gICAgICAgICAgICBjb25zdCB0aXRsZSA9ICQoYXBpLmNvbHVtbihjb2xJZHgpLmhlYWRlcigpKS50ZXh0KCkudHJpbSgpO1xuICAgICAgICAgICAgY29uc3QgJHRoID0gJCgnPHRoIHN0eWxlPVwicGFkZGluZzo2cHggMTBweDsgYmFja2dyb3VuZDojZjhmYWZjOyBib3JkZXItdG9wOjFweCBzb2xpZCAjZTJlOGYwO1wiPjwvdGg+Jyk7XG4gICAgICAgICAgICBjb25zdCAkaW5wdXQgPSAkKCc8aW5wdXQ+Jywge1xuICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiB0aXRsZSxcbiAgICAgICAgICAgICAgc3R5bGU6ICd3aWR0aDoxMDAlOyBwYWRkaW5nOjRweCA2cHg7IGJvcmRlcjoxcHggc29saWQgI2NiZDVlMTsgYm9yZGVyLXJhZGl1czo0cHg7IGZvbnQtc2l6ZTowLjgyZW07JyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgJHRoLmFwcGVuZCgkaW5wdXQpO1xuICAgICAgICAgICAgJGZpbHRlclJvdy5hcHBlbmQoJHRoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICAkdGhlYWQuYXBwZW5kKCRmaWx0ZXJSb3cpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXBpLmNvbHVtbnMoKS5ldmVyeShmdW5jdGlvbihjb2xJZHgpIHtcbiAgICAgICAgICBjb25zdCAkaW5wdXQgPSAkKCcjbW9kZWwtdGFibGUgdGhlYWQgdHIubW9kZWwtZmlsdGVyLXJvdyB0aCcpLmVxKGNvbElkeCkuZmluZCgnaW5wdXQnKTtcbiAgICAgICAgICBpZiAoISRpbnB1dC5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgICAkaW5wdXQub2ZmKCdjbGljay5tb2RlbEZpbHRlciBrZXl1cC5tb2RlbEZpbHRlciBjaGFuZ2UubW9kZWxGaWx0ZXInKTtcbiAgICAgICAgICAkaW5wdXQub24oJ2NsaWNrLm1vZGVsRmlsdGVyJywgZnVuY3Rpb24oZXZlbnQpIHsgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IH0pO1xuICAgICAgICAgICRpbnB1dC5vbigna2V5dXAubW9kZWxGaWx0ZXIgY2hhbmdlLm1vZGVsRmlsdGVyJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgICAgICAgICBpZiAoYXBpLmNvbHVtbihjb2xJZHgpLnNlYXJjaCgpICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgICBhcGkuY29sdW1uKGNvbElkeCkuc2VhcmNoKHZhbHVlKS5kcmF3KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIF9zeW5jTW9kZWxUYWJsZVNlbGVjdGlvbigpO1xuXG4gIC8vIFVwZGF0ZSBwcmljaW5nIGZyZXNobmVzcyBmb290ZXJcbiAgX3VwZGF0ZVByaWNpbmdGb290ZXIoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0TW9kZWwobW9kZWwsIHByb3ZpZGVyKSB7XG4gIGlmICghbW9kZWwpIHJldHVybjtcbiAgX3Nob3dNb2RlbFdpemFyZEJ1c3koYEFwcGx5aW5nIG1vZGVsICR7bW9kZWx9Li4uYCk7XG4gIHRyeSB7XG4gICAgY29uc3QgcGF5bG9hZCA9IHByb3ZpZGVyID8geyBtb2RlbCwgcHJvdmlkZXIgfSA6IHsgbW9kZWwgfTtcbiAgICBhd2FpdCBhcGlDYWxsKCdQT1NUJywgJy9hcGkvbW9kZWwnLCBwYXlsb2FkKTtcbiAgICBpZiAoX21vZGVsRGF0YSkge1xuICAgICAgX21vZGVsRGF0YS5tb2RlbCA9IG1vZGVsO1xuICAgICAgaWYgKHByb3ZpZGVyKSBfbW9kZWxEYXRhLnByb3ZpZGVyID0gcHJvdmlkZXI7XG4gICAgfVxuICAgIGNvbnN0IGVmZmVjdGl2ZVByb3ZpZGVyID0gKF9tb2RlbERhdGEgJiYgX21vZGVsRGF0YS5wcm92aWRlcikgfHwgcHJvdmlkZXI7XG4gICAgY29uc3QgbGFiZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtY3VycmVudC1sYWJlbCcpO1xuICAgIGlmIChsYWJlbCkge1xuICAgICAgbGFiZWwudGV4dENvbnRlbnQgPSBlZmZlY3RpdmVQcm92aWRlciA/IGAke2VmZmVjdGl2ZVByb3ZpZGVyfSBcdTAwQjcgJHttb2RlbH1gIDogbW9kZWw7XG4gICAgfVxuICAgIF9hcHBlbmRSZWNlbnRNb2RlbChlZmZlY3RpdmVQcm92aWRlciwgbW9kZWwpO1xuICAgIF9zeW5jTW9kZWxUYWJsZVNlbGVjdGlvbigpO1xuICAgIF9yZW5kZXJRdWlja01vZGVsTGlzdCgoX21vZGVsRGF0YSAmJiBfbW9kZWxEYXRhLmFsbF9tb2RlbHMpIHx8IFtdKTtcbiAgICBfdXBkYXRlTGxtU3RhdHVzUGlsbCgnY29uZmlndXJlZCcsIGAke2VmZmVjdGl2ZVByb3ZpZGVyIHx8ICdQcm92aWRlcid9IGNvbmZpZ3VyZWRgKTtcblxuICAgIF9zYXZlTW9kZWxQcmVmc1RvU3RvcmFnZSh7XG4gICAgICBjdXJyZW50TW9kZWxQcm92aWRlcjogZWZmZWN0aXZlUHJvdmlkZXIgfHwgbnVsbCxcbiAgICAgIGN1cnJlbnRNb2RlbE5hbWU6IG1vZGVsIHx8IG51bGwsXG4gICAgfSk7XG4gICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzLnVwZGF0ZUF1dGhCYWRnZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZ2xvYmFsVGhpcy51cGRhdGVBdXRoQmFkZ2Uoe30sIGVmZmVjdGl2ZVByb3ZpZGVyIHx8IG51bGwpO1xuICAgIH1cbiAgICBhd2FpdCBfcmVmcmVzaENvcGlsb3RBdXRoU3RhdHVzKCk7XG4gICAgYXdhaXQgdGVzdEN1cnJlbnRNb2RlbCgpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nLmVycm9yKCdGYWlsZWQgdG8gc3dpdGNoIG1vZGVsOicsIGUpO1xuICAgIGNvbnN0IG1zZyA9IGUubWVzc2FnZSB8fCBTdHJpbmcoZSk7XG4gICAgX3N5bmNNb2RlbFRhYmxlU2VsZWN0aW9uKCk7XG4gICAgY29uc3Qgc3RhdHVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLXRlc3Qtc3RhdHVzJyk7XG4gICAgaWYgKHN0YXR1cykge1xuICAgICAgc3RhdHVzLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIHN0YXR1cy5zdHlsZS5jb2xvciA9ICcjZGMyNjI2JztcbiAgICAgIHN0YXR1cy50ZXh0Q29udGVudCA9IGBcdTI3NEMgJHttc2d9YDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBhcHBlbmRNZXNzYWdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCBgXHUyNzRDIE1vZGVsIHN3aXRjaCBmYWlsZWQ6ICR7bXNnfWApO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBfaGlkZU1vZGVsV2l6YXJkQnVzeSgpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRlc3RDdXJyZW50TW9kZWwoKSB7XG4gIC8vIFVwZGF0ZSBib3RoIHRoZSBoZWFkZXIgYmFkZ2UgYW5kIHRoZSBtb2RhbCBzdGF0dXMgbGluZVxuICBjb25zdCBiYWRnZSAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtdGVzdC1iYWRnZScpO1xuICBjb25zdCBzdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtdGVzdC1zdGF0dXMnKTtcbiAgY29uc3QgYnRuICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLXRlc3QtYnRuJyk7XG5cbiAgY29uc3QgU1BJTiA9ICdcdTIzRjMnO1xuICBjb25zdCBPSyAgID0gJ1x1MjcwNSc7XG4gIGNvbnN0IEZBSUwgPSAnXHUyNzRDJztcblxuICBjb25zdCBzZXRSdW5uaW5nID0gKCkgPT4ge1xuICAgIGlmIChiYWRnZSkgIHsgYmFkZ2UudGV4dENvbnRlbnQgID0gU1BJTjsgYmFkZ2Uuc3R5bGUuZGlzcGxheSAgPSAnJzsgYmFkZ2UudGl0bGUgID0gJ1Rlc3RpbmdcdTIwMjYnOyB9XG4gICAgaWYgKHN0YXR1cykgeyBzdGF0dXMuaW5uZXJIVE1MICAgPSBgJHtTUElOfSBUZXN0aW5nIGNvbm5lY3Rpb25cdTIwMjZgOyBzdGF0dXMuc3R5bGUuZGlzcGxheSA9ICcnOyB9XG4gICAgaWYgKGJ0bikgICAgeyBidG4uZGlzYWJsZWQgPSB0cnVlOyBidG4udGV4dENvbnRlbnQgPSAnXHUyM0YzIFRlc3RpbmdcdTIwMjYnOyB9XG4gICAgX3VwZGF0ZUxsbVN0YXR1c1BpbGwoJ2Nvbm5lY3RpbmcnLCAnQ29ubmVjdGluZ1x1MjAyNicsICdcdTI5RDcnKTtcbiAgfTtcblxuICBjb25zdCBzZXRPayA9IChsYXRlbmN5TXMpID0+IHtcbiAgICBjb25zdCB0aXAgPSBgQ29ubmVjdGVkIFx1MjAxNCAke2xhdGVuY3lNc31tc2A7XG4gICAgaWYgKGJhZGdlKSAgeyBiYWRnZS50ZXh0Q29udGVudCAgPSBPSzsgIGJhZGdlLnN0eWxlLmRpc3BsYXkgID0gJyc7IGJhZGdlLnRpdGxlICA9IHRpcDsgfVxuICAgIGlmIChzdGF0dXMpIHsgc3RhdHVzLmlubmVySFRNTCAgID0gYCR7T0t9ICR7dGlwfWA7IHN0YXR1cy5zdHlsZS5jb2xvciA9ICcjMTZhMzRhJzsgc3RhdHVzLnN0eWxlLmRpc3BsYXkgPSAnJzsgfVxuICAgIGlmIChidG4pICAgIHsgYnRuLmRpc2FibGVkID0gZmFsc2U7IGJ0bi5pbm5lckhUTUwgPSAnJiMxMDAwMzsgVGVzdCBjb25uZWN0aW9uJzsgfVxuICAgIF91cGRhdGVMbG1TdGF0dXNQaWxsKCdjb25uZWN0ZWQnLCBgSGVhbHRoeSAoJHtsYXRlbmN5TXN9bXMpYCwgJ1x1MjcxMycpO1xuICAgIGNvbnN0IHN1Y2Nlc3NTdW1tYXJ5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLXN1Y2Nlc3Mtc3VtbWFyeScpO1xuICAgIGlmIChzdWNjZXNzU3VtbWFyeSkge1xuICAgICAgc3VjY2Vzc1N1bW1hcnkudGV4dENvbnRlbnQgPSBgQ29ubmVjdGlvbiB2ZXJpZmllZCBpbiAke2xhdGVuY3lNc31tcy4gWW91IGNhbiBjbG9zZSB0aGUgd2l6YXJkIGFuZCBjb250aW51ZS5gO1xuICAgIH1cbiAgICBfc2V0TW9kZWxXaXphcmRTdGVwKDQpO1xuICB9O1xuXG4gIGNvbnN0IHNldEZhaWwgPSAoZXJyTXNnKSA9PiB7XG4gICAgaWYgKGJhZGdlKSAgeyBiYWRnZS50ZXh0Q29udGVudCAgPSBGQUlMOyBiYWRnZS5zdHlsZS5kaXNwbGF5ICA9ICcnOyBiYWRnZS50aXRsZSAgPSBlcnJNc2c7IH1cbiAgICBpZiAoc3RhdHVzKSB7XG4gICAgICBzdGF0dXMuaW5uZXJIVE1MICAgPSBgJHtGQUlMfSA8c3BhbiB0aXRsZT1cIiR7ZXJyTXNnLnJlcGxhY2UoL1wiL2csICcmcXVvdDsnKX1cIiBzdHlsZT1cImN1cnNvcjpoZWxwOyB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lIGRvdHRlZDtcIj5Db25uZWN0aW9uIGZhaWxlZDwvc3Bhbj5gO1xuICAgICAgc3RhdHVzLnN0eWxlLmNvbG9yID0gJyNkYzI2MjYnO1xuICAgICAgc3RhdHVzLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICB9XG4gICAgaWYgKGJ0bikgICAgeyBidG4uZGlzYWJsZWQgPSBmYWxzZTsgYnRuLmlubmVySFRNTCA9ICcmIzEwMDAzOyBUZXN0IGNvbm5lY3Rpb24nOyB9XG4gICAgX3VwZGF0ZUxsbVN0YXR1c1BpbGwoJ2Vycm9yJywgJ0Nvbm5lY3Rpb24gZmFpbGVkJywgJ1x1MjZBMCcsIGVyck1zZyk7XG4gICAgaWYgKF9tb2RlbFdpemFyZFN0ZXAgPT09IDMpIHtcbiAgICAgIF9zZXRNb2RlbFdpemFyZFN0ZXAoMik7XG4gICAgfVxuICB9O1xuXG4gIHNldFJ1bm5pbmcoKTtcbiAgX3Nob3dNb2RlbFdpemFyZEJ1c3koJ1Rlc3RpbmcgbW9kZWwgY29ubmVjdGlvbi4uLicpO1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFwaUNhbGwoJ1BPU1QnLCAnL2FwaS9tb2RlbC90ZXN0Jyk7XG4gICAgaWYgKHJlc3VsdC5vaykge1xuICAgICAgc2V0T2socmVzdWx0LmxhdGVuY3lfbXMpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHNldEZhaWwocmVzdWx0LmVycm9yIHx8ICdVbmtub3duIGVycm9yJyk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGNhdGNoIChlKSB7XG4gICAgc2V0RmFpbChlLm1lc3NhZ2UgfHwgU3RyaW5nKGUpKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZmluYWxseSB7XG4gICAgX2hpZGVNb2RlbFdpemFyZEJ1c3koKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfdXBkYXRlUHJpY2luZ0Zvb3RlcigpIHtcbiAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJpY2luZy11cGRhdGVkLWxhYmVsJyk7XG4gIGlmICghZWwgfHwgIV9tb2RlbERhdGEpIHJldHVybjtcbiAgY29uc3QgdHMgICAgID0gX21vZGVsRGF0YS5wcmljaW5nX3VwZGF0ZWRfYXQ7XG4gIGNvbnN0IHNvdXJjZSA9IF9tb2RlbERhdGEucHJpY2luZ19zb3VyY2U7XG5cbiAgY29uc3Qgc291cmNlTGFiZWwgPSAoc291cmNlID09PSAnb3BlbnJvdXRlcicpXG4gICAgPyAnPGEgaHJlZj1cImh0dHBzOi8vb3BlbnJvdXRlci5haVwiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyXCIgJyArXG4gICAgICAnc3R5bGU9XCJjb2xvcjppbmhlcml0OyB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lIGRvdHRlZDtcIj5PcGVuUm91dGVyPC9hPidcbiAgICA6ICdzdGF0aWMgYmFzZWxpbmUgKE1hcmNoIDIwMjYpJztcblxuICBpZiAoIXRzKSB7IGVsLmlubmVySFRNTCA9IGBQcmljZXM6ICR7c291cmNlTGFiZWx9YDsgcmV0dXJuOyB9XG4gIHRyeSB7XG4gICAgY29uc3QgZCAgID0gbmV3IERhdGUodHMpO1xuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgY29uc3QgaCAgID0gTWF0aC5yb3VuZCgobm93IC0gZCkgLyAzXzYwMF8wMDApO1xuICAgIGNvbnN0IGFnZSA9IGggPCAxID8gJ2p1c3Qgbm93JyA6IGggPCAyNCA/IGAke2h9aCBhZ29gIDogYCR7TWF0aC5yb3VuZChoIC8gMjQpfWQgYWdvYDtcbiAgICBlbC5pbm5lckhUTUwgPSBgUHJpY2VzIHZpYSAke3NvdXJjZUxhYmVsfSAmbWlkZG90OyB1cGRhdGVkICR7YWdlfWA7XG4gIH0gY2F0Y2ggeyBlbC5pbm5lckhUTUwgPSBgUHJpY2VzOiAke3NvdXJjZUxhYmVsfWA7IH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVmcmVzaE1vZGVsUHJpY2luZygpIHtcbiAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ByaWNpbmctcmVmcmVzaC1idG4nKTtcbiAgY29uc3QgbGJsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ByaWNpbmctdXBkYXRlZC1sYWJlbCcpO1xuICBpZiAoYnRuKSB7IGJ0bi5kaXNhYmxlZCA9IHRydWU7IGJ0bi50ZXh0Q29udGVudCA9ICdSZWZyZXNoaW5nXHUyMDI2JzsgfVxuICBfc2hvd01vZGVsV2l6YXJkQnVzeSgnUmVmcmVzaGluZyBtb2RlbCBwcmljaW5nLi4uJyk7XG4gIHRyeSB7XG4gICAgYXdhaXQgYXBpQ2FsbCgnUE9TVCcsICcvYXBpL21vZGVsLXByaWNpbmcvcmVmcmVzaCcpO1xuICAgIC8vIFJlLWZldGNoIG1vZGVsIGRhdGEgc28gdGhlIHRhYmxlIGdldHMgZnJlc2ggcHJpY2VzXG4gICAgX21vZGVsRGF0YSA9IGF3YWl0IGFwaUNhbGwoJ0dFVCcsICcvYXBpL21vZGVsJyk7XG4gICAgX2J1aWxkTW9kZWxUYWJsZSgpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKGxibCkgbGJsLnRleHRDb250ZW50ID0gJ1JlZnJlc2ggZmFpbGVkJztcbiAgICBsb2cuZXJyb3IoJ1ByaWNpbmcgcmVmcmVzaCBmYWlsZWQ6JywgZSk7XG4gIH0gZmluYWxseSB7XG4gICAgX2hpZGVNb2RlbFdpemFyZEJ1c3koKTtcbiAgICBpZiAoYnRuKSB7IGJ0bi5kaXNhYmxlZCA9IGZhbHNlOyBidG4udGV4dENvbnRlbnQgPSAnXHUyMUJCIFJlZnJlc2ggcHJpY2VzJzsgfVxuICB9XG59XG5cblxuLy8gSGVscGVyOiB1cGRhdGUgd29ya2Zsb3cgc3RlcCBiYXIgY2xpY2thYmxlIHN0YXRlXG5mdW5jdGlvbiB1cGRhdGVXb3JrZmxvd1N0ZXBzQ2xpY2thYmxlKGN1cnJlbnRQaGFzZSkge1xuICAvLyBTZXF1ZW50aWFsIHByZS1sYXlvdXQgc3RlcHMgdW5sb2NrIG9uZS1ieS1vbmUgYXMgdGhlIHVzZXIgcHJvZ3Jlc3Nlcy5cbiAgY29uc3Qgc2VxdWVudGlhbFN0ZXBzID0gW1xuICAgICdzdGVwLWpvYicsXG4gICAgJ3N0ZXAtYW5hbHlzaXMnLFxuICAgICdzdGVwLWN1c3RvbWl6YXRpb25zJyxcbiAgICAnc3RlcC1yZXdyaXRlJyxcbiAgICAnc3RlcC1zcGVsbCcsXG4gICAgJ3N0ZXAtbGF5b3V0JyxcbiAgXTtcbiAgLy8gUG9zdC1sYXlvdXQgc3RlcHMgYWxsIHVubG9jayBzaW11bHRhbmVvdXNseSBvbmNlIGxheW91dCBpcyBjb25maXJtZWQuXG4gIGNvbnN0IHBvc3RMYXlvdXRTdGVwcyA9IFtcbiAgICAnc3RlcC1kb3dubG9hZCcsXG4gICAgJ3N0ZXAtY292ZXJfbGV0dGVyJyxcbiAgICAnc3RlcC1zY3JlZW5pbmcnLFxuICAgICdzdGVwLWludGVydmlld19wcmVwJyxcbiAgICAnc3RlcC10aGFua195b3UnLFxuICAgICdzdGVwLWhhcnZlc3QnLFxuICBdO1xuICAvLyBNYXAgYmFja2VuZCBwaGFzZSBzdHJpbmdzIHRvIGhvdyBtYW55IHNlcXVlbnRpYWwgc3RlcHMgYXJlIHVubG9ja2VkICgwLWJhc2VkIGluZGV4KS5cbiAgY29uc3QgcGhhc2VUb0luZGV4ID0ge1xuICAgICdpbml0JzogICAgICAgICAgICAgMCxcbiAgICAnam9iX2FuYWx5c2lzJzogICAgIDEsXG4gICAgJ2N1c3RvbWl6YXRpb24nOiAgICAyLFxuICAgICdyZXdyaXRlX3Jldmlldyc6ICAgMyxcbiAgICAnc3BlbGxfY2hlY2snOiAgICAgIDQsXG4gICAgJ2dlbmVyYXRpb24nOiAgICAgICA1LFxuICAgICdsYXlvdXRfcmV2aWV3JzogICAgNSxcbiAgICAnZmluYWxfZ2VuZXJhdGlvbic6IDUsXG4gICAgJ3JlZmluZW1lbnQnOiAgICAgICA1LFxuICAgIC8vIExlZ2FjeSBmYWxsYmFja3MgKHN0ZXAgbmFtZXMgc29tZXRpbWVzIHBhc3NlZCBvbiBET01Db250ZW50TG9hZGVkKVxuICAgICdqb2InOiAgICAgICAgICAgICAgMCxcbiAgICAnbGF5b3V0JzogICAgICAgICAgIDUsXG4gICAgJ2ZpbmFsaXNlJzogICAgICAgICA1LFxuICB9O1xuICBjb25zdCBwb3N0TGF5b3V0VW5sb2NrZWQgPSBbJ2ZpbmFsX2dlbmVyYXRpb24nLCAncmVmaW5lbWVudCddLmluY2x1ZGVzKGN1cnJlbnRQaGFzZSk7XG4gIGNvbnN0IGN1cnJlbnRJZHggPSBwaGFzZVRvSW5kZXhbY3VycmVudFBoYXNlXSA/PyAwO1xuXG4gIGZ1bmN0aW9uIF9tYWtlU3RlcENsaWNrYWJsZShlbCkge1xuICAgIGlmICghZWwgfHwgZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdjbGlja2FibGUnKSkgcmV0dXJuO1xuICAgIGVsLmNsYXNzTGlzdC5hZGQoJ2NsaWNrYWJsZScpO1xuICAgIGVsLnNldEF0dHJpYnV0ZSgncm9sZScsICdidXR0b24nKTtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTtcbiAgICBpZiAoIWVsLl9zdGVwS2V5SGFuZGxlcikge1xuICAgICAgZWwuX3N0ZXBLZXlIYW5kbGVyID0gKGUpID0+IHtcbiAgICAgICAgaWYgKGUua2V5ID09PSAnRW50ZXInIHx8IGUua2V5ID09PSAnICcpIHtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgZWwuY2xpY2soKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBlbC5fc3RlcEtleUhhbmRsZXIpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIF9tYWtlU3RlcEluZXJ0KGVsKSB7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoJ2NsaWNrYWJsZScpO1xuICAgIGVsLnJlbW92ZUF0dHJpYnV0ZSgncm9sZScpO1xuICAgIGVsLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnLTEnKTtcbiAgICBpZiAoZWwuX3N0ZXBLZXlIYW5kbGVyKSB7XG4gICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZWwuX3N0ZXBLZXlIYW5kbGVyKTtcbiAgICAgIGRlbGV0ZSBlbC5fc3RlcEtleUhhbmRsZXI7XG4gICAgfVxuICB9XG5cbiAgc2VxdWVudGlhbFN0ZXBzLmZvckVhY2goKGlkLCBpZHgpID0+IHtcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICBpZiAoIWVsKSByZXR1cm47XG4gICAgaWYgKGlkeCA8PSBjdXJyZW50SWR4IHx8IHBvc3RMYXlvdXRVbmxvY2tlZCkge1xuICAgICAgX21ha2VTdGVwQ2xpY2thYmxlKGVsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgX21ha2VTdGVwSW5lcnQoZWwpO1xuICAgIH1cbiAgfSk7XG5cbiAgcG9zdExheW91dFN0ZXBzLmZvckVhY2goaWQgPT4ge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgIGlmICghZWwpIHJldHVybjtcbiAgICBpZiAocG9zdExheW91dFVubG9ja2VkKSB7XG4gICAgICBfbWFrZVN0ZXBDbGlja2FibGUoZWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICBfbWFrZVN0ZXBJbmVydChlbCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBNYXJrIHRoZSBjdXJyZW50bHkgYWN0aXZlIHN0ZXAgZm9yIHNjcmVlbiByZWFkZXJzLlxuICBjb25zdCBhbGxTdGVwSWRzID0gWy4uLnNlcXVlbnRpYWxTdGVwcywgLi4ucG9zdExheW91dFN0ZXBzXTtcbiAgYWxsU3RlcElkcy5mb3JFYWNoKGlkID0+IHtcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICBpZiAoZWwpIGVsLnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1jdXJyZW50Jyk7XG4gIH0pO1xuICAvLyBGb3IgcG9zdC1sYXlvdXQgcGhhc2VzLCBtYXJrIHN0ZXAtZG93bmxvYWQgYXMgdGhlIGFjdGl2ZSBzdGVwIHNvIHNjcmVlbiByZWFkZXJzXG4gIC8vIGhhdmUgYSBwcm9ncmFtbWF0aWMgY3VycmVudC1wb3NpdGlvbiBpbmRpY2F0b3IuXG4gIGNvbnN0IGFjdGl2ZVN0ZXBJZCA9IHBvc3RMYXlvdXRVbmxvY2tlZCA/ICdzdGVwLWRvd25sb2FkJyA6IHNlcXVlbnRpYWxTdGVwc1tjdXJyZW50SWR4XTtcbiAgaWYgKGFjdGl2ZVN0ZXBJZCkge1xuICAgIGNvbnN0IGFjdGl2ZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYWN0aXZlU3RlcElkKTtcbiAgICBpZiAoYWN0aXZlRWwpIGFjdGl2ZUVsLnNldEF0dHJpYnV0ZSgnYXJpYS1jdXJyZW50JywgJ3N0ZXAnKTtcbiAgfVxufVxuXG4vLyBJbml0aWFsaXplIG9uIHBhZ2UgbG9hZCBcdTIwMTQgZGVsZWdhdGVzIHRvIGFwcC5qcyBpbml0KCkgd2hpY2ggaXMgbG9hZGVkIGFmdGVyIHRoaXMgZmlsZVxuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsICgpID0+IHtcbiAgbG9hZE1vZGVsU2VsZWN0b3IoKTtcblxuICAvLyBXaXJlIHVwIHRhYiBzY3JvbGwgYXJyb3cgYnV0dG9uc1xuICBjb25zdCB0YWJCYXIgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWItYmFyJyk7XG4gIGNvbnN0IGxlZnRCdG4gID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYi1zY3JvbGwtbGVmdCcpO1xuICBjb25zdCByaWdodEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWItc2Nyb2xsLXJpZ2h0Jyk7XG4gIGlmICh0YWJCYXIgJiYgbGVmdEJ0biAmJiByaWdodEJ0bikge1xuICAgIGxlZnRCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAgKCkgPT4geyB0YWJCYXIuc2Nyb2xsQnkoeyBsZWZ0OiAtMTYwLCBiZWhhdmlvcjogJ3Ntb290aCcgfSk7IH0pO1xuICAgIHJpZ2h0QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4geyB0YWJCYXIuc2Nyb2xsQnkoeyBsZWZ0OiAgMTYwLCBiZWhhdmlvcjogJ3Ntb290aCcgfSk7IH0pO1xuICAgIHRhYkJhci5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB1cGRhdGVUYWJTY3JvbGxCdXR0b25zKTtcbiAgICBuZXcgUmVzaXplT2JzZXJ2ZXIodXBkYXRlVGFiU2Nyb2xsQnV0dG9ucykub2JzZXJ2ZSh0YWJCYXIpO1xuICB9XG5cbiAgLy8gU2hvdyBvbmx5IHRoZSBKb2IgdGFiIHVudGlsIGZldGNoU3RhdHVzIHJlc29sdmVzIHRoZSBhY3R1YWwgc3RhZ2VcbiAgdXBkYXRlVGFiQmFyRm9yU3RhZ2UoJ2pvYicpO1xuICB1cGRhdGVXb3JrZmxvd1N0ZXBzQ2xpY2thYmxlKCdqb2InKTtcblxuICAvLyBMaXN0ZW4gZm9yIHBoYXNlIGNoYW5nZXMgdG8gdXBkYXRlIGNsaWNrYWJsZSBzdGVwc1xuICBpZiAodHlwZW9mIHN0YXRlTWFuYWdlcj8ub25QaGFzZUNoYW5nZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHN0YXRlTWFuYWdlci5vblBoYXNlQ2hhbmdlKChwaGFzZSkgPT4ge1xuICAgICAgdXBkYXRlV29ya2Zsb3dTdGVwc0NsaWNrYWJsZShwaGFzZSk7XG4gICAgfSk7XG4gIH1cblxufSk7XG5cbi8vIFx1MjUwMFx1MjUwMCBFUyBtb2R1bGUgZXhwb3J0cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmV4cG9ydCB7XG4gIC8vIEZvY3VzIC8gYWNjZXNzaWJpbGl0eVxuICBzZXRJbml0aWFsRm9jdXMsIHRyYXBGb2N1cywgcmVzdG9yZUZvY3VzLCBwdXNoRm9jdXNTdGFjayxcbiAgLy8gRGlhbG9ncyAmIG1vZGFsc1xuICBjb25maXJtRGlhbG9nLCBvcGVuTW9kYWwsIGNsb3NlTW9kYWwsIGNsb3NlQWxsTW9kYWxzLFxuICAvLyBUYWIgJiBzdGFnZSBtYW5hZ2VtZW50XG4gIHNldHVwRXZlbnRMaXN0ZW5lcnMsIGdldFN0YWdlRm9yVGFiLCBnZXRWaXNpYmxlU3RhZ2UsIHVwZGF0ZVRhYkJhckZvclN0YWdlLFxuICAvLyBDaGF0XG4gIHRvZ2dsZUNoYXQsXG4gIC8vIE1vZGVsIHNlbGVjdG9yXG4gIGxvYWRNb2RlbFNlbGVjdG9yLCBvcGVuTW9kZWxNb2RhbCwgY2xvc2VNb2RlbE1vZGFsLCBzZXRNb2RlbCwgdGVzdEN1cnJlbnRNb2RlbCwgcmVmcmVzaE1vZGVsUHJpY2luZyxcbiAgdG9nZ2xlTW9kZWxDYXRhbG9nVmlzaWJpbGl0eSwgc3RhcnRDb3BpbG90QXV0aEZyb21XaXphcmQsIGxvZ291dENvcGlsb3RBdXRoRnJvbVdpemFyZCxcbiAgbmV4dFdpemFyZFN0ZXAsIHByZXZpb3VzV2l6YXJkU3RlcCxcbiAgc2F2ZVByb3ZpZGVyQXBpS2V5LCB0b2dnbGVBcGlLZXlWaXNpYmlsaXR5LFxuICBfdXBkYXRlTGxtU3RhdHVzUGlsbCxcbiAgLy8gU2V0dGluZ3MgbW9kYWxcbiAgb3BlblNldHRpbmdzTW9kYWwsIGNsb3NlU2V0dGluZ3NNb2RhbCwgc2F2ZVNldHRpbmdzTW9kYWwsIHJlbG9hZFNldHRpbmdzTW9kYWwsXG59O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiBsYXlvdXQtaW5zdHJ1Y3Rpb24uanNcbiAqIEZyb250ZW5kIFVJIGZvciBuYXR1cmFsLWxhbmd1YWdlIGxheW91dCBpbnN0cnVjdGlvbiB3b3JrZmxvdy5cbiAqIEhhbmRsZXMgaW5zdHJ1Y3Rpb24gc3VibWlzc2lvbiwgcHJldmlldyB1cGRhdGVzLCBhbmQgaW5zdHJ1Y3Rpb24gaGlzdG9yeS5cbiAqL1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5jb25zdCBsb2cgPSBnZXRMb2dnZXIoJ2xheW91dC1pbnN0cnVjdGlvbicpO1xuXG5pbXBvcnQgeyBhcGlDYWxsIH0gZnJvbSAnLi9hcGktY2xpZW50LmpzJztcbmltcG9ydCB7IHNjaGVkdWxlQXRzUmVmcmVzaCB9IGZyb20gJy4vYXRzLXJlZmluZW1lbnQuanMnO1xuaW1wb3J0IHsgYXBwZW5kTWVzc2FnZSwgYXBwZW5kTWVzc2FnZUh0bWwgfSBmcm9tICcuL21lc3NhZ2UtcXVldWUuanMnO1xuaW1wb3J0IHsgc3dpdGNoVGFiIH0gZnJvbSAnLi9yZXZpZXctdGFibGUtYmFzZS5qcyc7XG5pbXBvcnQgeyBzdGF0ZU1hbmFnZXIsIEdFTkVSQVRJT05fU1RBVEVfRVZFTlQsIEdFTkVSQVRJT05fUEhBU0VTIH0gZnJvbSAnLi9zdGF0ZS1tYW5hZ2VyLmpzJztcbmltcG9ydCB7IGVzY2FwZUh0bWwgfSBmcm9tICcuL3V0aWxzLmpzJztcbmltcG9ydCB7IGNvbmZpcm1SZVJ1blBoYXNlIH0gZnJvbSAnLi93b3JrZmxvdy1zdGVwcy5qcyc7XG5cbmxldCBkaXNtaXNzZWRTdGFsZUNhbGxvdXRSZXZpc2lvbiA9IG51bGw7XG5cbi8qKlxuICogQ29udmVydCBhIENTUyBwaXhlbCB2YWx1ZSB0byBpdHMgdHlwb2dyYXBoaWMgcG9pbnQgZXF1aXZhbGVudC5cbiAqIEFzc3VtZXMgdGhlIHN0YW5kYXJkIHNjcmVlbiByZXNvbHV0aW9uIGNvbnZlbnRpb246IDk2IHB4L2luLCA3MiBwdC9pbixcbiAqIHNvIDFweCA9IDAuNzUgcHQuXG4gKiBAcGFyYW0ge251bWJlcn0gcHhcbiAqIEByZXR1cm5zIHtudW1iZXJ9IHB0IHZhbHVlIHJvdW5kZWQgdG8gb25lIGRlY2ltYWwgcGxhY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHB4VG9QdChweCkge1xuICByZXR1cm4gTWF0aC5yb3VuZChweCAqIDAuNzUgKiAxMCkgLyAxMDtcbn1cblxuZnVuY3Rpb24gY29lcmNlQm9vbGVhbih2YWx1ZSwgZGVmYXVsdFZhbHVlID0gZmFsc2UpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSByZXR1cm4gdmFsdWU7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IHZhbHVlLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChbJzEnLCAndHJ1ZScsICd5ZXMnLCAnb24nXS5pbmNsdWRlcyhub3JtYWxpemVkKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKFsnMCcsICdmYWxzZScsICdubycsICdvZmYnXS5pbmNsdWRlcyhub3JtYWxpemVkKSkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICByZXR1cm4gQm9vbGVhbih2YWx1ZSk7XG59XG5cbi8vIFVuZG8gc3RhY2sgXHUyMDE0IGVhY2ggZW50cnkgaXMgeyBodG1sLCBpbnN0cnVjdGlvbnMgfSBzbmFwc2hvdHRlZCBiZWZvcmUgYVxuLy8gbGF5b3V0IGluc3RydWN0aW9uIGlzIGFwcGxpZWQuICBDYXAgYXQgMjAgZW50cmllcyB0byBib3VuZCBtZW1vcnkuXG5jb25zdCBfbGF5b3V0VW5kb1N0YWNrID0gW107XG5jb25zdCBfVU5ET19TVEFDS19NQVggPSAyMDtcblxuZnVuY3Rpb24gZ2V0Q3ZBcnRpZmFjdHMoKSB7XG4gIHJldHVybiBzdGF0ZU1hbmFnZXIuZ2V0VGFiRGF0YSgnY3YnKSB8fCB7fTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlQ3ZBcnRpZmFjdHMobmV4dEN2QXJ0aWZhY3RzKSB7XG4gIHN0YXRlTWFuYWdlci5zZXRUYWJEYXRhKCdjdicsIG5leHRDdkFydGlmYWN0cyk7XG59XG5cbmZ1bmN0aW9uIHNldFByZXZpZXdIdG1sKGh0bWwpIHtcbiAgdXBkYXRlQ3ZBcnRpZmFjdHMoeyAuLi5nZXRDdkFydGlmYWN0cygpLCAnKi5odG1sJzogaHRtbCB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0UHJldmlld091dHB1dHMoKSB7XG4gIHJldHVybiBzdGF0ZU1hbmFnZXI/LmdldEdlbmVyYXRpb25TdGF0ZT8uKCk/LnByZXZpZXdPdXRwdXRzIHx8IG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldFByZXZpZXdPdXRwdXRVcmwocmVuZGVyZXIpIHtcbiAgY29uc3Qgc2Vzc2lvbklkID0gc3RhdGVNYW5hZ2VyPy5nZXRTZXNzaW9uSWQ/LigpO1xuICBjb25zdCBzdWZmaXggPSBzZXNzaW9uSWRcbiAgICA/IGA/c2Vzc2lvbl9pZD0ke2VuY29kZVVSSUNvbXBvbmVudChzZXNzaW9uSWQpfWBcbiAgICA6ICcnO1xuICByZXR1cm4gYC9hcGkvY3YvcHJldmlldy1vdXRwdXQvJHtlbmNvZGVVUklDb21wb25lbnQocmVuZGVyZXIpfSR7c3VmZml4fWA7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclByZXZpZXdPdXRwdXRTdGF0dXMocHJldmlld091dHB1dHMgPSBudWxsKSB7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcmV2aWV3LW91dHB1dC1zdGF0dXMnKTtcbiAgaWYgKCFjb250YWluZXIpIHJldHVybjtcblxuICBjb25zdCBwZGZzID0gcHJldmlld091dHB1dHM/LnBkZnMgfHwge307XG4gIGNvbnN0IHJlbmRlcmVyT3JkZXIgPSBbJ2Nocm9tZScsICd3ZWFzeXByaW50J107XG4gIGNvbnN0IGF2YWlsYWJsZVJlbmRlcmVycyA9IHJlbmRlcmVyT3JkZXIuZmlsdGVyKChyZW5kZXJlcktleSkgPT4gcmVuZGVyZXJLZXkgaW4gcGRmcyk7XG5cbiAgaWYgKGF2YWlsYWJsZVJlbmRlcmVycy5sZW5ndGggPT09IDApIHtcbiAgICBjb250YWluZXIuaW5uZXJIVE1MID0gYFxuICAgICAgPGRpdiBjbGFzcz1cInByZXZpZXctb3V0cHV0LWVtcHR5XCI+XG4gICAgICAgIFByZXZpZXcgUERGcyB3aWxsIGFwcGVhciBoZXJlIGFmdGVyIHRoZSBjdXJyZW50IGxheW91dCBpcyByZW5kZXJlZC5cbiAgICAgIDwvZGl2PlxuICAgIGA7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcmVuZGVyZXJMYWJlbHMgPSB7XG4gICAgY2hyb21lOiAnQ2hyb21lJyxcbiAgICB3ZWFzeXByaW50OiAnV2Vhc3lQcmludCcsXG4gIH07XG5cbiAgY29udGFpbmVyLmlubmVySFRNTCA9IGF2YWlsYWJsZVJlbmRlcmVycy5tYXAoKHJlbmRlcmVyS2V5KSA9PiB7XG4gICAgY29uc3QgcmVuZGVyZXIgPSBwZGZzW3JlbmRlcmVyS2V5XSB8fCB7fTtcbiAgICBjb25zdCBvayA9IEJvb2xlYW4ocmVuZGVyZXIub2spO1xuICAgIGNvbnN0IGRldGFpbCA9IHJlbmRlcmVyLnJlbmRlcmVyX2RldGFpbCB8fCByZW5kZXJlci5lcnJvciB8fCAnTm8gZGV0YWlsIGF2YWlsYWJsZSc7XG4gICAgY29uc3QgcmVuZGVyZXJMYWJlbCA9IHJlbmRlcmVyTGFiZWxzW3JlbmRlcmVyS2V5XSB8fCByZW5kZXJlcktleTtcbiAgICBjb25zdCBiYWRnZU1hcmt1cCA9IG9rXG4gICAgICA/IGA8YSBjbGFzcz1cInByZXZpZXctb3V0cHV0LWJhZGdlIHByZXZpZXctb3V0cHV0LWJhZGdlLWxpbmsgaXMtcmVhZHlcIiBocmVmPVwiJHtnZXRQcmV2aWV3T3V0cHV0VXJsKHJlbmRlcmVyS2V5KX1cIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lclwiPiR7cmVuZGVyZXJMYWJlbH0gUmVhZHk8L2E+YFxuICAgICAgOiBgPHNwYW4gY2xhc3M9XCJwcmV2aWV3LW91dHB1dC1iYWRnZSBpcy1mYWlsZWRcIj4ke3JlbmRlcmVyTGFiZWx9IEZhaWxlZDwvc3Bhbj5gO1xuXG4gICAgcmV0dXJuIGBcbiAgICAgIDxkaXYgY2xhc3M9XCJwcmV2aWV3LW91dHB1dC1yb3cgJHtvayA/ICdpcy1yZWFkeScgOiAnaXMtZmFpbGVkJ31cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInByZXZpZXctb3V0cHV0LWNvcHlcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJldmlldy1vdXRwdXQtdGl0bGUtcm93XCI+XG4gICAgICAgICAgICAke2JhZGdlTWFya3VwfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcmV2aWV3LW91dHB1dC1kZXRhaWxcIj4ke2VzY2FwZUh0bWwoZGV0YWlsKX08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICBgO1xuICB9KS5qb2luKCcnKTtcbn1cblxuZnVuY3Rpb24gYXBwZW5kTGF5b3V0U2FmZXR5QWxlcnQoc2FmZXR5QWxlcnQpIHtcbiAgaWYgKCFzYWZldHlBbGVydD8uZmxhZ2dlZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGlzc3VlcyA9IChzYWZldHlBbGVydC5pc3N1ZXMgfHwgW10pXG4gICAgLm1hcChpc3N1ZSA9PiB7XG4gICAgICBjb25zdCB0ZXh0ID0gdHlwZW9mIGlzc3VlID09PSAnc3RyaW5nJ1xuICAgICAgICA/IGlzc3VlXG4gICAgICAgIDogKGlzc3VlPy5kZXRhaWwgfHwgaXNzdWU/Lmlzc3VlIHx8IEpTT04uc3RyaW5naWZ5KGlzc3VlKSk7XG4gICAgICByZXR1cm4gYDxsaT4ke2VzY2FwZUh0bWwodGV4dCl9PC9saT5gO1xuICAgIH0pXG4gICAgLmpvaW4oJycpO1xuXG4gIGFwcGVuZE1lc3NhZ2VIdG1sKFxuICAgICdzeXN0ZW0nLFxuICAgIGA8c3Ryb25nPlx1MjZBMFx1RkUwRiBMYXlvdXQgc2FmZXR5IHNhbml0aXphdGlvbiBhcHBsaWVkLjwvc3Ryb25nPjxicj4ke2VzY2FwZUh0bWwoc2FmZXR5QWxlcnQubWVzc2FnZSB8fCAnUG90ZW50aWFsIHByb21wdCBwYXlsb2FkcyBvciB1bnNhZmUgSFRNTCB3ZXJlIHJlbW92ZWQgYmVmb3JlIGFwcGx5aW5nIHRoZSBjaGFuZ2UuJyl9PGJyPjx1bCBzdHlsZT1cIm1hcmdpbjo2cHggMCAwIDE4cHhcIj4ke2lzc3Vlc308L3VsPmAsXG4gICk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUxheW91dEluc3RydWN0aW9uKGluc3RydWN0aW9uID0ge30pIHtcbiAgcmV0dXJuIHtcbiAgICB0aW1lc3RhbXA6IGluc3RydWN0aW9uLnRpbWVzdGFtcCB8fCAnJyxcbiAgICBpbnN0cnVjdGlvbl90ZXh0OiBpbnN0cnVjdGlvbi5pbnN0cnVjdGlvbl90ZXh0IHx8IGluc3RydWN0aW9uLmluc3RydWN0aW9uIHx8ICcnLFxuICAgIGNoYW5nZV9zdW1tYXJ5OiBpbnN0cnVjdGlvbi5jaGFuZ2Vfc3VtbWFyeSB8fCBpbnN0cnVjdGlvbi5zdW1tYXJ5IHx8ICcnLFxuICAgIGNvbmZpcm1hdGlvbjogaW5zdHJ1Y3Rpb24uY29uZmlybWF0aW9uICE9PSBmYWxzZSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0Q3VycmVudENvbnRlbnRSZXZpc2lvbigpIHtcbiAgcmV0dXJuIHN0YXRlTWFuYWdlci5nZXRHZW5lcmF0aW9uU3RhdGUoKS5jb250ZW50UmV2aXNpb24gPz8gMDtcbn1cblxuZnVuY3Rpb24gZm9ybWF0R2VuZXJhdGlvblRpbWVzdGFtcCh0aW1lc3RhbXApIHtcbiAgaWYgKCF0aW1lc3RhbXApIHJldHVybiAnJztcbiAgY29uc3QgcGFyc2VkID0gbmV3IERhdGUodGltZXN0YW1wKTtcbiAgaWYgKE51bWJlci5pc05hTihwYXJzZWQuZ2V0VGltZSgpKSkgcmV0dXJuICcnO1xuICByZXR1cm4gcGFyc2VkLnRvTG9jYWxlU3RyaW5nKFtdLCB7IG1vbnRoOiAnc2hvcnQnLCBkYXk6ICdudW1lcmljJywgaG91cjogJ251bWVyaWMnLCBtaW51dGU6ICcyLWRpZ2l0JyB9KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRMYXlvdXRGcmVzaG5lc3NDaGlwTWFya3VwKGZyZXNobmVzcykge1xuICBpZiAoIWZyZXNobmVzcz8uc2hvd0NoaXApIHJldHVybiAnJztcbiAgY29uc3QgaWNvbiA9IGZyZXNobmVzcy5pc0NyaXRpY2FsID8gJ1x1MjFCQicgOiAoZnJlc2huZXNzLmlzU3RhbGUgPyAnIScgOiAnXHUyNzEzJyk7XG4gIHJldHVybiBgPHNwYW4gY2xhc3M9XCJsYXlvdXQtZnJlc2huZXNzLWNoaXAgJHtmcmVzaG5lc3MudG9uZX0gbGF5b3V0LXBhbmUtZnJlc2huZXNzLWNoaXBcIlxuICAgIGFyaWEtbGFiZWw9XCIke2VzY2FwZUh0bWwoZnJlc2huZXNzLmFyaWFMYWJlbCB8fCAnJyl9XCI+XG4gICAgPHNwYW4gY2xhc3M9XCJsYXlvdXQtZnJlc2huZXNzLWljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj4ke2ljb259PC9zcGFuPlxuICAgIDxzcGFuIGNsYXNzPVwibGF5b3V0LWZyZXNobmVzcy1sYWJlbFwiPiR7ZXNjYXBlSHRtbChmcmVzaG5lc3MubGFiZWwgfHwgJycpfTwvc3Bhbj5cbiAgPC9zcGFuPmA7XG59XG5cbmZ1bmN0aW9uIHJlbmRlckxheW91dFByZXZpZXdTdGF0dXMoKSB7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYXlvdXQtcHJldmlldy1zdGF0dXMnKTtcbiAgaWYgKCFjb250YWluZXIpIHJldHVybjtcbiAgY29uc3QgZnJlc2huZXNzID0gc3RhdGVNYW5hZ2VyLmdldExheW91dEZyZXNobmVzcygpO1xuICBjb25zdCBnZW5lcmF0aW9uU3RhdGUgPSBzdGF0ZU1hbmFnZXIuZ2V0R2VuZXJhdGlvblN0YXRlKCk7XG4gIGlmICghZ2VuZXJhdGlvblN0YXRlLnByZXZpZXdBdmFpbGFibGUpIHtcbiAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG4gICAgY29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGxhc3RQcmV2aWV3UmV2aXNpb24gPSBOdW1iZXIuaXNGaW5pdGUoZ2VuZXJhdGlvblN0YXRlLmxhc3RQcmV2aWV3Q29udGVudFJldmlzaW9uKVxuICAgID8gZ2VuZXJhdGlvblN0YXRlLmxhc3RQcmV2aWV3Q29udGVudFJldmlzaW9uIDogbnVsbDtcbiAgY29uc3QgY3VycmVudFJldmlzaW9uID0gTnVtYmVyLmlzRmluaXRlKGdlbmVyYXRpb25TdGF0ZS5jb250ZW50UmV2aXNpb24pXG4gICAgPyBnZW5lcmF0aW9uU3RhdGUuY29udGVudFJldmlzaW9uIDogbnVsbDtcbiAgY29uc3QgcGVuZGluZ1JldmlzaW9uQ291bnQgPSBsYXN0UHJldmlld1JldmlzaW9uICE9PSBudWxsICYmIGN1cnJlbnRSZXZpc2lvbiAhPT0gbnVsbFxuICAgID8gTWF0aC5tYXgoMCwgY3VycmVudFJldmlzaW9uIC0gbGFzdFByZXZpZXdSZXZpc2lvbikgOiAwO1xuICBjb25zdCB0aW1lc3RhbXBMYWJlbCA9IGZvcm1hdEdlbmVyYXRpb25UaW1lc3RhbXAoZ2VuZXJhdGlvblN0YXRlLnByZXZpZXdHZW5lcmF0ZWRBdCk7XG4gIGNvbnN0IGRldGFpbExpbmVzID0gW107XG4gIGlmICh0aW1lc3RhbXBMYWJlbCkgZGV0YWlsTGluZXMucHVzaChgUHJldmlldyBnZW5lcmF0ZWQgJHt0aW1lc3RhbXBMYWJlbH1gKTtcbiAgaWYgKGdlbmVyYXRpb25TdGF0ZS5sYXlvdXRDb25maXJtZWQgJiYgZ2VuZXJhdGlvblN0YXRlLmNvbmZpcm1lZEF0KSB7XG4gICAgY29uc3QgY29uZmlybWVkTGFiZWwgPSBmb3JtYXRHZW5lcmF0aW9uVGltZXN0YW1wKGdlbmVyYXRpb25TdGF0ZS5jb25maXJtZWRBdCk7XG4gICAgaWYgKGNvbmZpcm1lZExhYmVsKSBkZXRhaWxMaW5lcy5wdXNoKGBMYXlvdXQgY29uZmlybWVkICR7Y29uZmlybWVkTGFiZWx9YCk7XG4gIH1cbiAgaWYgKGZyZXNobmVzcy5pc1N0YWxlKSB7XG4gICAgaWYgKHBlbmRpbmdSZXZpc2lvbkNvdW50ID4gMCkge1xuICAgICAgZGV0YWlsTGluZXMucHVzaChgJHtwZW5kaW5nUmV2aXNpb25Db3VudH0gY29udGVudCBjaGFuZ2Uke3BlbmRpbmdSZXZpc2lvbkNvdW50ID09PSAxID8gJycgOiAncyd9IHNpbmNlIHRoaXMgcHJldmlld2ApO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXRhaWxMaW5lcy5wdXNoKCdDb250ZW50IGNoYW5nZWQgYWZ0ZXIgdGhpcyBwcmV2aWV3IHdhcyBnZW5lcmF0ZWQnKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoZ2VuZXJhdGlvblN0YXRlLmxheW91dENvbmZpcm1lZCB8fCBnZW5lcmF0aW9uU3RhdGUucGhhc2UgPT09ICdjb25maXJtZWQnKSB7XG4gICAgZGV0YWlsTGluZXMucHVzaCgnQ29uZmlybWVkIHByZXZpZXcgbWF0Y2hlcyB0aGUgbGF0ZXN0IGFwcHJvdmVkIGNvbnRlbnQnKTtcbiAgfSBlbHNlIHtcbiAgICBkZXRhaWxMaW5lcy5wdXNoKCdQcmV2aWV3IG1hdGNoZXMgdGhlIGxhdGVzdCBhcHByb3ZlZCBjb250ZW50Jyk7XG4gIH1cbiAgY29uc3Qgc3RhZ2VMYWJlbCA9IGdlbmVyYXRpb25TdGF0ZS5sYXlvdXRDb25maXJtZWQgfHwgZ2VuZXJhdGlvblN0YXRlLnBoYXNlID09PSAnY29uZmlybWVkJ1xuICAgID8gJ1JlYWR5IGZvciBmaW5hbCBmaWxlcycgOiAnUmVhZHkgZm9yIGxheW91dCByZXZpZXcnO1xuICAvLyBQYWdlIGNvdW50IGJhZGdlOiBzaG93biB3aGVuIGEgcGFnZSBjb3VudCBpcyBhdmFpbGFibGUgZnJvbSB0aGUgcHJldmlld1xuICBjb25zdCBwYyA9IGdlbmVyYXRpb25TdGF0ZS5wYWdlQ291bnRFeGFjdCA/PyBnZW5lcmF0aW9uU3RhdGUucGFnZUNvdW50RXN0aW1hdGU7XG4gIGxldCBwYWdlQ291bnRCYWRnZSA9ICcnO1xuICBpZiAocGMgIT09IG51bGwgJiYgcGMgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IHBjTGFiZWwgID0gZ2VuZXJhdGlvblN0YXRlLnBhZ2VDb3VudEV4YWN0ICE9PSBudWxsID8gYCR7cGN9IHBhZ2Uke3BjICE9PSAxID8gJ3MnIDogJyd9YCA6IGB+JHtwY30gcGFnZSR7cGMgIT09IDEgPyAncycgOiAnJ31gO1xuICAgIGNvbnN0IHBjV2FybiAgID0gZ2VuZXJhdGlvblN0YXRlLnBhZ2VXYXJuaW5nO1xuICAgIHBhZ2VDb3VudEJhZGdlID0gYDxzcGFuIGNsYXNzPVwibGF5b3V0LXBhZ2UtY291bnQtYmFkZ2Uke3BjV2FybiA/ICcgd2FybicgOiAnJ31cIiB0aXRsZT1cIiR7cGNXYXJuID8gJ1BhZ2UgY291bnQgb3V0c2lkZSByZWNvbW1lbmRlZCByYW5nZScgOiAnUGFnZSBjb3VudCB3aXRoaW4gcmFuZ2UnfVwiPiR7cGNXYXJuID8gJ1x1MjZBMCAnIDogJ1x1RDgzRFx1RENDNCAnfSR7ZXNjYXBlSHRtbChwY0xhYmVsKX08L3NwYW4+YDtcbiAgfVxuICBjb250YWluZXIuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgY2xhc3M9XCJsYXlvdXQtcHJldmlldy1zdGF0dXMtY2FyZCAke2ZyZXNobmVzcy50b25lfVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImxheW91dC1wcmV2aWV3LXN0YXR1cy1oZWFkZXJcIj5cbiAgICAgICAgJHtidWlsZExheW91dEZyZXNobmVzc0NoaXBNYXJrdXAoZnJlc2huZXNzKX1cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJsYXlvdXQtcHJldmlldy1zdGF0dXMtc3RhZ2VcIj4ke2VzY2FwZUh0bWwoc3RhZ2VMYWJlbCl9PC9zcGFuPlxuICAgICAgICAke3BhZ2VDb3VudEJhZGdlfVxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwibGF5b3V0LXByZXZpZXctc3RhdHVzLWRldGFpbHNcIj5cbiAgICAgICAgJHtkZXRhaWxMaW5lcy5tYXAoKGxpbmUpID0+IGA8ZGl2PiR7ZXNjYXBlSHRtbChsaW5lKX08L2Rpdj5gKS5qb2luKCcnKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PmA7XG4gIGNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbn1cblxuZnVuY3Rpb24gcmVuZGVyTGF5b3V0U3RhbGVDYWxsb3V0KCkge1xuICBjb25zdCBjYWxsb3V0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xheW91dC1zdGFsZS1jYWxsb3V0Jyk7XG4gIGlmICghY2FsbG91dCkgcmV0dXJuO1xuXG4gIGNvbnN0IGZyZXNobmVzcyA9IHN0YXRlTWFuYWdlci5nZXRMYXlvdXRGcmVzaG5lc3MoKTtcbiAgY29uc3QgY29udGVudFJldmlzaW9uID0gZ2V0Q3VycmVudENvbnRlbnRSZXZpc2lvbigpO1xuICBjb25zdCBpc0Rpc21pc3NlZCA9IGRpc21pc3NlZFN0YWxlQ2FsbG91dFJldmlzaW9uID09PSBjb250ZW50UmV2aXNpb247XG5cbiAgaWYgKCFmcmVzaG5lc3MuaXNTdGFsZSB8fCBpc0Rpc21pc3NlZCkge1xuICAgIGlmICghZnJlc2huZXNzLmlzU3RhbGUpIGRpc21pc3NlZFN0YWxlQ2FsbG91dFJldmlzaW9uID0gbnVsbDtcbiAgICBjYWxsb3V0LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY2FsbG91dC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbn1cblxuZnVuY3Rpb24gcmVmcmVzaExheW91dFJldmlld1N0YXRlKCkge1xuICBjb25zdCBmcmVzaG5lc3MgPSBzdGF0ZU1hbmFnZXIuZ2V0TGF5b3V0RnJlc2huZXNzKCk7XG4gIGNvbnN0IGdlbmVyYXRpb25TdGF0ZSA9IHN0YXRlTWFuYWdlci5nZXRHZW5lcmF0aW9uU3RhdGUoKTtcbiAgY29uc3QgY29uZmlybUJ0biAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29uZmlybS1sYXlvdXQtYnRuJyk7XG4gIGNvbnN0IGZpbmFsQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Byb2NlZWQtdG8tZmluYWxpc2UtYnRuJyk7XG5cbiAgcmVuZGVyTGF5b3V0UHJldmlld1N0YXR1cygpO1xuICByZW5kZXJMYXlvdXRTdGFsZUNhbGxvdXQoKTtcbiAgcmVuZGVyRGlydHlQaGFzZXNDYWxsb3V0KCk7XG5cbiAgY29uc3QgZGlydHlQaGFzZXMgPSBzdGF0ZU1hbmFnZXIuZ2V0RGlydHlQaGFzZXMoKTtcbiAgY29uc3QgaGFzRGlydHkgPSBkaXJ0eVBoYXNlcy5sZW5ndGggPiAwO1xuXG4gIGNvbnN0IHNob3dDb25maXJtID0gZ2VuZXJhdGlvblN0YXRlLnByZXZpZXdBdmFpbGFibGUgJiYgIWZyZXNobmVzcy5pc1N0YWxlICYmICFnZW5lcmF0aW9uU3RhdGUubGF5b3V0Q29uZmlybWVkICYmICFoYXNEaXJ0eVxuICAgID8gJ2Jsb2NrJ1xuICAgIDogJ25vbmUnO1xuXG4gIGlmIChjb25maXJtQnRuKSAgY29uZmlybUJ0bi5zdHlsZS5kaXNwbGF5ICA9IHNob3dDb25maXJtO1xuICBjb25zdCBoaW50RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGF5b3V0LXR3by1zdGVwLWhpbnQnKTtcbiAgaWYgKGhpbnRFbCkgaGludEVsLnN0eWxlLmRpc3BsYXkgPSBzaG93Q29uZmlybTtcblxuICBpZiAoZmluYWxCdG4pIHtcbiAgICBmaW5hbEJ0bi5zdHlsZS5kaXNwbGF5ID0gZ2VuZXJhdGlvblN0YXRlLnByZXZpZXdBdmFpbGFibGVcbiAgICAgICYmICFmcmVzaG5lc3MuaXNTdGFsZVxuICAgICAgJiYgIWhhc0RpcnR5XG4gICAgICAmJiAoZ2VuZXJhdGlvblN0YXRlLmxheW91dENvbmZpcm1lZCB8fCBnZW5lcmF0aW9uU3RhdGUucGhhc2UgPT09ICdjb25maXJtZWQnKVxuICAgICAgPyAnYmxvY2snXG4gICAgICA6ICdub25lJztcbiAgfVxufVxuXG4vKipcbiAqIEluaXRpYWxpemUgbGF5b3V0IGluc3RydWN0aW9uIFVJIGFuZCBldmVudCBoYW5kbGVycy5cbiAqIENhbGxlZCB3aGVuIGxheW91dCB0YWIgaXMgYWN0aXZhdGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBpbml0aWF0ZUxheW91dEluc3RydWN0aW9ucygpIHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25UYWIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9jdW1lbnQtY29udGVudCcpO1xuICBpZiAoIWluc3RydWN0aW9uVGFiKSByZXR1cm47XG5cbiAgLy8gQ3JlYXRlIHR3by1jb2x1bW4gbGF5b3V0IGlmIGl0IGRvZXNuJ3QgZXhpc3RcbiAgaWYgKCFpbnN0cnVjdGlvblRhYi5xdWVyeVNlbGVjdG9yKCcubGF5b3V0LWluc3RydWN0aW9uLXBhbmVsJykpIHtcbiAgICBpbnN0cnVjdGlvblRhYi5pbm5lckhUTUwgPSBgXG4gICAgICA8ZGl2IGNsYXNzPVwibGF5b3V0LWluc3RydWN0aW9uLXBhbmVsXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsYXlvdXQtcHJldmlldy1wYW5lXCI+XG4gICAgICAgICAgPGgzPkN1cnJlbnQgTGF5b3V0IFByZXZpZXc8L2gzPlxuICAgICAgICAgIDxkaXYgaWQ9XCJsYXlvdXQtcHJldmlldy1zdGF0dXNcIiBjbGFzcz1cImxheW91dC1wcmV2aWV3LXN0YXR1c1wiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPjwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcmV2aWV3LWlmcmFtZS1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJwcmV2aWV3LWxvYWRpbmctb3ZlcmxheVwiIGNsYXNzPVwicHJldmlldy1sb2FkaW5nLW92ZXJsYXlcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNwaW5uZXJcIj48L2Rpdj5cbiAgICAgICAgICAgICAgPHAgY2xhc3M9XCJwcmV2aWV3LWxvYWRpbmctbGFiZWxcIj5SZW5kZXJpbmcgcHJldmlld1x1MjAyNjwvcD5cbiAgICAgICAgICAgICAgPHAgaWQ9XCJwcmV2aWV3LWxvYWRpbmctbG9nXCIgY2xhc3M9XCJwcmV2aWV3LWxvYWRpbmctbG9nXCI+PC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8aWZyYW1lIGlkPVwibGF5b3V0LXByZXZpZXdcIiBjbGFzcz1cImxheW91dC1wcmV2aWV3LWlmcmFtZVwiIHRpdGxlPVwiQ1YgTGF5b3V0IFByZXZpZXdcIiBzYW5kYm94PVwiYWxsb3ctc2FtZS1vcmlnaW5cIiByZWZlcnJlcnBvbGljeT1cIm5vLXJlZmVycmVyXCI+PC9pZnJhbWU+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJsYXlvdXQtaW5wdXQtcGFuZVwiPlxuICAgICAgICAgIDxoMz5MYXlvdXQgUmV2aWV3PC9oMz5cbiAgICAgICAgICA8cCBjbGFzcz1cImxheW91dC1zY29wZS1sYWJlbFwiPlx1RDgzRFx1RENBMSBEZXNjcmliZSBhIGxheW91dCBjaGFuZ2UgKHNwYWNpbmcsIG1hcmdpbnMsIGNvbHVtbiB3aWR0aHMsIHNlY3Rpb24gb3JkZXIpLiBUZXh0IGNvbnRlbnQgaXMgZmluYWxpc2VkIFx1MjAxNCBjb250ZW50IGVkaXRzIGFyZSBub3QgYXBwbGllZCBoZXJlLjwvcD5cbiAgICAgICAgICA8ZGl2IGlkPVwibGF5b3V0LXBhZ2UtZXN0aW1hdGVcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTttYXJnaW4tYm90dG9tOjEwcHg7XCI+PC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGlkPVwibGF5b3V0LXN0YWxlLWNhbGxvdXRcIiBjbGFzcz1cImxheW91dC1zdGFsZS1jYWxsb3V0XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+XG4gICAgICAgICAgICA8aDQ+TGF5b3V0IHByZXZpZXcgaXMgb3V0IG9mIGRhdGU8L2g0PlxuICAgICAgICAgICAgPHA+WW91IGNoYW5nZWQgQ1YgY29udGVudCBhZnRlciB0aGUgY3VycmVudCBwcmV2aWV3IHdhcyBnZW5lcmF0ZWQuIFJlZ2VuZXJhdGUgdGhlIHByZXZpZXcgYmVmb3JlIHRydXN0aW5nIHBhZ2UgY291bnQsIGxheW91dCBmZWVkYmFjaywgb3IgZmluYWwgZmlsZXMuPC9wPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxheW91dC1zdGFsZS1jYWxsb3V0LWFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInJlZ2VuZXJhdGUtbGF5b3V0LXByZXZpZXctYnRuXCIgY2xhc3M9XCJidG4td2FybmluZyBsYXlvdXQtYWN0aW9uLWJ0blwiPlJlZ2VuZXJhdGUgcHJldmlldzwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uIGlkPVwiZGlzbWlzcy1sYXlvdXQtc3RhbGUtYnRuXCIgY2xhc3M9XCJidG4tc2Vjb25kYXJ5IGxheW91dC1hY3Rpb24tYnRuXCI+S2VlcCByZXZpZXdpbmcgY3VycmVudCBwcmV2aWV3PC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcmV2aWV3LW91dHB1dC1jYXJkXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJldmlldy1vdXRwdXQtY2FyZC1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgPGg0PlByZXZpZXcgUERGczwvaDQ+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicHJldmlldy1vdXRwdXQtY2FyZC1ub3RlXCI+Q2hyb21lIGFuZCBXZWFzeVByaW50IHJlbmRlciBpbiBwYXJhbGxlbDwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBpZD1cInByZXZpZXctb3V0cHV0LXN0YXR1c1wiIGNsYXNzPVwicHJldmlldy1vdXRwdXQtc3RhdHVzXCI+PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibGF5b3V0LXNldHRpbmdzLXJvd1wiIHN0eWxlPVwiZGlzcGxheTpmbGV4OyBmbGV4LXdyYXA6d3JhcDsgYWxpZ24taXRlbXM6Y2VudGVyOyBnYXA6MTBweDsgbWFyZ2luLWJvdHRvbToxNHB4OyBwYWRkaW5nOjhweCAxMHB4OyBiYWNrZ3JvdW5kOiNmOGZhZmM7IGJvcmRlcjoxcHggc29saWQgI2UyZThmMDsgYm9yZGVyLXJhZGl1czo2cHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwiYmFzZS1mb250LXNpemUtaW5wdXRcIiBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07IGZvbnQtd2VpZ2h0OjYwMDsgY29sb3I6IzQ3NTU2OTsgd2hpdGUtc3BhY2U6bm93cmFwO1wiPkJhc2UgZm9udCBzaXplOjwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgaWQ9XCJiYXNlLWZvbnQtc2l6ZS1pbnB1dFwiXG4gICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICBtaW49XCI2XCIgbWF4PVwiMTZcIiBzdGVwPVwiMC41XCJcbiAgICAgICAgICAgICAgdmFsdWU9XCIxM1wiXG4gICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6NjBweDsgcGFkZGluZzozcHggNnB4OyBib3JkZXI6MXB4IHNvbGlkICNjYmQ1ZTE7IGJvcmRlci1yYWRpdXM6NHB4OyBmb250LXNpemU6MC45ZW07XCJcbiAgICAgICAgICAgICAgdGl0bGU9XCJDb250cm9scyB0aGUgcm9vdCBmb250IHNpemUgZm9yIHRoZSBDVi4gQWxsIHJlbS1iYXNlZCBzaXplcyBzY2FsZSB3aXRoIHRoaXMgdmFsdWUuXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8c3BhbiBpZD1cImZvbnQtc2l6ZS1wdC1kaXNwbGF5XCIgc3R5bGU9XCJmb250LXNpemU6MC44MmVtOyBjb2xvcjojNjQ3NDhiOyB3aGl0ZS1zcGFjZTpub3dyYXA7XCI+cHgmbmJzcDsoOS44Jm5ic3A7cHQpPC9zcGFuPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBhZ2UtbWFyZ2luLWlucHV0XCIgc3R5bGU9XCJmb250LXNpemU6MC44NWVtOyBmb250LXdlaWdodDo2MDA7IGNvbG9yOiM0NzU1Njk7IHdoaXRlLXNwYWNlOm5vd3JhcDsgbWFyZ2luLWxlZnQ6OHB4O1wiPlBhZ2UgbWFyZ2luIChpbik6PC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBpZD1cInBhZ2UtbWFyZ2luLWlucHV0XCJcbiAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgIG1pbj1cIjAuNVwiIG1heD1cIjEuNVwiIHN0ZXA9XCIwLjA1XCJcbiAgICAgICAgICAgICAgdmFsdWU9XCIwLjVcIlxuICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOjcycHg7IHBhZGRpbmc6M3B4IDZweDsgYm9yZGVyOjFweCBzb2xpZCAjY2JkNWUxOyBib3JkZXItcmFkaXVzOjRweDsgZm9udC1zaXplOjAuOWVtO1wiXG4gICAgICAgICAgICAgIHRpdGxlPVwiQ29udHJvbHMgdGhlIHByaW50IHBhZ2UgbWFyZ2lucyBmb3IgYWxsIFBERiBwYWdlcy5cIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwdWJsaWNhdGlvbnMtc3RhcnQtbmV3LXBhZ2UtaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6aW5saW5lLWZsZXg7IGFsaWduLWl0ZW1zOmNlbnRlcjsgZ2FwOjZweDsgZm9udC1zaXplOjAuODNlbTsgY29sb3I6IzMzNDE1NTsgbWFyZ2luLWxlZnQ6OHB4O1wiPlxuICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJwdWJsaWNhdGlvbnMtc3RhcnQtbmV3LXBhZ2UtaW5wdXRcIiB0eXBlPVwiY2hlY2tib3hcIiAvPlxuICAgICAgICAgICAgICBTdGFydCBQdWJsaWNhdGlvbnMgb24gbmV3IHBhZ2VcbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwic2tpbGxzLXNob3ctZXhwZXJpZW5jZS1zZWxlY3RcIiBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07IGZvbnQtd2VpZ2h0OjYwMDsgY29sb3I6IzQ3NTU2OTsgd2hpdGUtc3BhY2U6bm93cmFwOyBtYXJnaW4tbGVmdDo4cHg7XCI+U2tpbGwgZXhwZXJpZW5jZSBsZXZlbDo8L2xhYmVsPlxuICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICBpZD1cInNraWxscy1zaG93LWV4cGVyaWVuY2Utc2VsZWN0XCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJwYWRkaW5nOjNweCA2cHg7IGJvcmRlcjoxcHggc29saWQgI2NiZDVlMTsgYm9yZGVyLXJhZGl1czo0cHg7IGZvbnQtc2l6ZTowLjllbTtcIlxuICAgICAgICAgICAgICB0aXRsZT1cIkNvbnRyb2xzIHdoZXRoZXIgeWVhcnMgb2YgZXhwZXJpZW5jZSBhcmUgc2hvd24gbmV4dCB0byBlYWNoIHNraWxsLlwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJpbmRpdmlkdWFsXCI+SW5kaXZpZHVhbCBzZXR0aW5nPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJhbHdheXNcIj5BbHdheXM8L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIm5ldmVyXCI+TmV2ZXI8L29wdGlvbj5cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImFwcGx5LWxheW91dC1zZXR0aW5ncy1idG5cIiBjbGFzcz1cImJ0bi1zZWNvbmRhcnlcIiBzdHlsZT1cInBhZGRpbmc6M3B4IDEwcHg7IGZvbnQtc2l6ZTowLjg1ZW07XCI+QXBwbHk8L2J1dHRvbj5cbiAgICAgICAgICAgIDxzcGFuIGlkPVwibGF5b3V0LXNldHRpbmdzLXN0YXR1c1wiIHN0eWxlPVwiZm9udC1zaXplOjAuOGVtOyBjb2xvcjojNjQ3NDhiO1wiPjwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgICAgaWQ9XCJpbnN0cnVjdGlvbi1pbnB1dFwiXG4gICAgICAgICAgICBjbGFzcz1cImxheW91dC1pbnN0cnVjdGlvbi10ZXh0YXJlYVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4sIE1vdmUgUHVibGljYXRpb25zIHNlY3Rpb24gYWZ0ZXIgU2tpbGxzJiMxMDtvcjogU2hvcnRlbiB0aGUgc2Vjb25kIGJ1bGxldCB1bmRlciBHZW5lbnRlY2ggdG8gZm9jdXMgb24gaW1wYWN0JiMxMDtvcjogS2VlcCB0aGUgR2VuZW50ZWNoIGVudHJ5IG9uIG9uZSBwYWdlXCJcbiAgICAgICAgICAgIHJvd3M9XCI2XCI+PC90ZXh0YXJlYT5cblxuICAgICAgICAgIDxidXR0b24gaWQ9XCJhcHBseS1pbnN0cnVjdGlvbi1idG5cIiBjbGFzcz1cImJ0bi1wcmltYXJ5IGxheW91dC1hY3Rpb24tYnRuXCI+XG4gICAgICAgICAgICBBcHBseVxuICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImNvbmZpcm0tbGF5b3V0LWJ0blwiIGNsYXNzPVwiY29udGludWUtYnRuIGxheW91dC1hY3Rpb24tYnRuXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+XG4gICAgICAgICAgICBDb25maXJtIExheW91dFxuICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgPHAgaWQ9XCJsYXlvdXQtdHdvLXN0ZXAtaGludFwiIHN0eWxlPVwiZGlzcGxheTpub25lO2ZvbnQtc2l6ZTowLjgyZW07Y29sb3I6IzZiNzI4MDttYXJnaW46NnB4IDAgMnB4O1wiPlxuICAgICAgICAgICAgT25jZSB0aGUgcHJldmlldyBsb29rcyByaWdodCwgY29uZmlybSB0aGUgbGF5b3V0IFx1MjAxNCB0aGVuIGdlbmVyYXRlIHlvdXIgZmluYWwgc3VibWlzc2lvbiBmaWxlcy5cbiAgICAgICAgICA8L3A+XG5cbiAgICAgICAgICA8ZGl2IGlkPVwicHJvY2Vzc2luZy1pbmRpY2F0b3JcIiBjbGFzcz1cInByb2Nlc3NpbmctaW5kaWNhdG9yXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNwaW5uZXJcIj48L2Rpdj5cbiAgICAgICAgICAgIDxwPkFwcGx5aW5nIGluc3RydWN0aW9uLi4uPC9wPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBpZD1cImNvbmZpcm1hdGlvbi1tZXNzYWdlXCIgY2xhc3M9XCJjb25maXJtYXRpb24tbWVzc2FnZVwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj48L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYXlvdXQtaGlzdG9yeS1zZWN0aW9uXCI+XG4gICAgICAgICAgICA8aDQ+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGlzdG9yeS10b2dnbGVcIj5cdTI1QkM8L3NwYW4+XG4gICAgICAgICAgICAgIEluc3RydWN0aW9uIEhpc3RvcnkgKDxzcGFuIGlkPVwiaW5zdHJ1Y3Rpb24tY291bnRcIj4wPC9zcGFuPilcbiAgICAgICAgICAgIDwvaDQ+XG4gICAgICAgICAgICA8ZGl2IGlkPVwiaW5zdHJ1Y3Rpb24taGlzdG9yeVwiIGNsYXNzPVwiaW5zdHJ1Y3Rpb24taGlzdG9yeS1saXN0XCI+PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwicHJvY2VlZC10by1maW5hbGlzZS1idG5cIiBjbGFzcz1cImNvbnRpbnVlLWJ0biBsYXlvdXQtYWN0aW9uLWJ0blwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cbiAgICAgICAgICAgIEdlbmVyYXRlIEZpbmFsIEZpbGVzXG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8ZGl2IGlkPVwiY29udGVudC1wcm9wb3NhbC1wcm9jZXNzaW5nXCIgY2xhc3M9XCJwcm9jZXNzaW5nLWluZGljYXRvclwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNwaW5uZXJcIj48L2Rpdj5cbiAgICAgICAgICAgIDxwPkdlbmVyYXRpbmcgY29udGVudCBwcm9wb3NhbHNcdTIwMjY8L3A+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBpZD1cImNvbnRlbnQtcHJvcG9zYWxzLXBhbmVsXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+PC9kaXY+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImFwcGx5LWNvbnRlbnQtY2hhbmdlcy1idG5cIiBjbGFzcz1cImJ0bi13YXJuaW5nIGxheW91dC1hY3Rpb24tYnRuXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+XG4gICAgICAgICAgICBBcHBseSBBcHByb3ZlZCBDaGFuZ2VzXG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8ZGl2IGlkPVwiZGlydHktcGhhc2VzLWNhbGxvdXRcIiBjbGFzcz1cImRpcnR5LXBoYXNlcy1jYWxsb3V0XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+XG4gICAgICAgICAgICA8aDQ+XHUyNkEwIENvbnRlbnQgQ2hhbmdlZCBcdTIwMTQgUmUtcnVuIFJlcXVpcmVkPC9oND5cbiAgICAgICAgICAgIDxwPlRleHQgZWRpdHMgaGF2ZSBiZWVuIHN0YWdlZC4gVGhlIGN1cnJlbnQgcHJldmlldyBubyBsb25nZXIgcmVmbGVjdHMgdGhlIHVwZGF0ZWQgY29udGVudC48L3A+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGF5b3V0LXN0YWxlLWNhbGxvdXQtYWN0aW9uc1wiPlxuICAgICAgICAgICAgICA8YnV0dG9uIGlkPVwicmV0dXJuLXRvLWVhcmxpZXN0LWRpcnR5LWJ0blwiIGNsYXNzPVwiYnRuLXdhcm5pbmcgbGF5b3V0LWFjdGlvbi1idG5cIj5cdTIxQkIgUmV0dXJuIHRvIEdlbmVyYXRlIENWPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICBgO1xuXG4gICAgLy8gV2lyZSB1cCBldmVudCBsaXN0ZW5lcnNcbiAgICBzZXR1cExheW91dEluc3RydWN0aW9uTGlzdGVuZXJzKCk7XG4gIH1cblxuICAvLyBSZXN0b3JlIHNhdmVkIGZvbnQgc2l6ZSBmcm9tIHNlc3Npb24gc3RhdGUgaWYgYXZhaWxhYmxlXG4gIGNvbnN0IHNhdmVkRm9udFNpemUgPSBzdGF0ZU1hbmFnZXI/LmdldFNlc3Npb25TdGF0ZT8uKCk/LmJhc2VfZm9udF9zaXplO1xuICBpZiAoc2F2ZWRGb250U2l6ZSkge1xuICAgIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Jhc2UtZm9udC1zaXplLWlucHV0Jyk7XG4gICAgaWYgKGlucHV0KSB7XG4gICAgICBjb25zdCBweCA9IHBhcnNlRmxvYXQoc2F2ZWRGb250U2l6ZSkgfHwgMTM7XG4gICAgICBpbnB1dC52YWx1ZSA9IHB4O1xuICAgICAgY29uc3QgcHREaXNwbGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZvbnQtc2l6ZS1wdC1kaXNwbGF5Jyk7XG4gICAgICBpZiAocHREaXNwbGF5KSBwdERpc3BsYXkudGV4dENvbnRlbnQgPSBgcHhcXHUwMGEwKCR7cHhUb1B0KHB4KX1cXHUwMGEwcHQpYDtcbiAgICB9XG4gIH1cbiAgY29uc3Qgc2F2ZWRQYWdlTWFyZ2luID0gc3RhdGVNYW5hZ2VyPy5nZXRTZXNzaW9uU3RhdGU/LigpPy5wYWdlX21hcmdpbjtcbiAgaWYgKHNhdmVkUGFnZU1hcmdpbikge1xuICAgIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BhZ2UtbWFyZ2luLWlucHV0Jyk7XG4gICAgaWYgKGlucHV0KSBpbnB1dC52YWx1ZSA9IHBhcnNlRmxvYXQoc2F2ZWRQYWdlTWFyZ2luKSB8fCAwLjU7XG4gIH1cbiAgY29uc3QgcHVibGljYXRpb25zU3RhcnRJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWJsaWNhdGlvbnMtc3RhcnQtbmV3LXBhZ2UtaW5wdXQnKTtcbiAgaWYgKHB1YmxpY2F0aW9uc1N0YXJ0SW5wdXQpIHtcbiAgICBjb25zdCBzZXNzaW9uU3RhdGUgPSBzdGF0ZU1hbmFnZXI/LmdldFNlc3Npb25TdGF0ZT8uKCkgfHwge307XG4gICAgY29uc3QgY3VzdG9taXphdGlvblN0YXRlID0gc3RhdGVNYW5hZ2VyPy5nZXRUYWJEYXRhPy4oJ2N1c3RvbWl6YXRpb25zJykgfHwge307XG4gICAgY29uc3Qgc2F2ZWRQdWJsaWNhdGlvbnNTdGFydCA9XG4gICAgICBzZXNzaW9uU3RhdGUucHVibGljYXRpb25zX3N0YXJ0X25ld19wYWdlXG4gICAgICA/PyBzZXNzaW9uU3RhdGU/LmN1c3RvbWl6YXRpb25zPy5wdWJsaWNhdGlvbnNfc3RhcnRfbmV3X3BhZ2VcbiAgICAgID8/IGN1c3RvbWl6YXRpb25TdGF0ZS5wdWJsaWNhdGlvbnNfc3RhcnRfbmV3X3BhZ2VcbiAgICAgID8/IGN1c3RvbWl6YXRpb25TdGF0ZS5wdWJsaWNhdGlvbnNfcGFnZV9icmVha1xuICAgICAgPz8gY3VzdG9taXphdGlvblN0YXRlLnN0YXJ0X3B1YmxpY2F0aW9uc19vbl9uZXdfcGFnZVxuICAgICAgPz8gZmFsc2U7XG4gICAgcHVibGljYXRpb25zU3RhcnRJbnB1dC5jaGVja2VkID0gY29lcmNlQm9vbGVhbihzYXZlZFB1YmxpY2F0aW9uc1N0YXJ0LCBmYWxzZSk7XG4gIH1cbiAgY29uc3Qgc2tpbGxzU2hvd0V4cGVyaWVuY2VTZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGxzLXNob3ctZXhwZXJpZW5jZS1zZWxlY3QnKTtcbiAgaWYgKHNraWxsc1Nob3dFeHBlcmllbmNlU2VsZWN0KSB7XG4gICAgY29uc3Qgc2Vzc2lvblN0YXRlID0gc3RhdGVNYW5hZ2VyPy5nZXRTZXNzaW9uU3RhdGU/LigpIHx8IHt9O1xuICAgIGNvbnN0IGN1c3RvbWl6YXRpb25TdGF0ZSA9IHN0YXRlTWFuYWdlcj8uZ2V0VGFiRGF0YT8uKCdjdXN0b21pemF0aW9ucycpIHx8IHt9O1xuICAgIGNvbnN0IHNhdmVkU2tpbGxzRXhwID1cbiAgICAgIHNlc3Npb25TdGF0ZS5za2lsbHNfc2hvd19leHBlcmllbmNlXG4gICAgICA/PyBzZXNzaW9uU3RhdGU/LmN1c3RvbWl6YXRpb25zPy5za2lsbHNfc2hvd19leHBlcmllbmNlXG4gICAgICA/PyBjdXN0b21pemF0aW9uU3RhdGUuc2tpbGxzX3Nob3dfZXhwZXJpZW5jZVxuICAgICAgPz8gJ2luZGl2aWR1YWwnO1xuICAgIGNvbnN0IHZhbGlkID0gWydhbHdheXMnLCAnbmV2ZXInLCAnaW5kaXZpZHVhbCddO1xuICAgIHNraWxsc1Nob3dFeHBlcmllbmNlU2VsZWN0LnZhbHVlID0gdmFsaWQuaW5jbHVkZXMoc2F2ZWRTa2lsbHNFeHApID8gc2F2ZWRTa2lsbHNFeHAgOiAnaW5kaXZpZHVhbCc7XG4gIH1cblxuICByZW5kZXJQcmV2aWV3T3V0cHV0U3RhdHVzKGdldFByZXZpZXdPdXRwdXRzKCkpO1xuXG4gIC8vIExvYWQgYW5kIGRpc3BsYXkgY3VycmVudCBIVE1MIHByZXZpZXcgdmlhIHRoZSBzdGFnZWQgZ2VuZXJhdGlvbiBjb250cmFjdC5cbiAgLy8gL2FwaS9jdi9nZW5lcmF0ZS1wcmV2aWV3IGdlbmVyYXRlcyBmcmVzaCBIVE1MIGFuZCBzdG9yZXMgaXQgaW4gc2Vzc2lvbiBzdGF0ZS5cbiAgLy8gRmFsbCBiYWNrIHRvIHRoZSBsZWdhY3kgL2FwaS9sYXlvdXQtaHRtbCBlbmRwb2ludCBpZiB0aGUgc2Vzc2lvbiBoYXMgbm9cbiAgLy8gY3VzdG9taXphdGlvbiBkYXRhIHlldCAoZS5nLiBzZXNzaW9uIHJlc3RvcmVkIGFmdGVyIGZ1bGwgZ2VuZXJhdGlvbikuXG4gIGNvbnN0IGNhY2hlZEh0bWwgPSBnZXRDdkFydGlmYWN0cygpWycqLmh0bWwnXSB8fCAnJztcbiAgaWYgKGNhY2hlZEh0bWwpIHtcbiAgICBkaXNwbGF5TGF5b3V0UHJldmlldyhjYWNoZWRIdG1sKTtcbiAgfSBlbHNlIHtcbiAgICBfZmV0Y2hBbmREaXNwbGF5TGF5b3V0UHJldmlldygpO1xuICB9XG5cbiAgLy8gUmVzdG9yZSBhbnkgcHJpb3IgaW5zdHJ1Y3Rpb25zIGZyb20gc2Vzc2lvblxuICBhd2FpdCByZXN0b3JlSW5zdHJ1Y3Rpb25IaXN0b3J5KCk7XG4gIHJlZnJlc2hMYXlvdXRSZXZpZXdTdGF0ZSgpO1xuXG4gIC8vIFNob3cgYSBwcm9hY3RpdmUgcGFnZS1sZW5ndGggZXN0aW1hdGUgc28gdXNlcnMgY2FuIGFkanVzdCBjb250ZW50IGJlZm9yZSBnZW5lcmF0aW5nXG4gIF9mZXRjaFBhZ2VFc3RpbWF0ZSgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBfZmV0Y2hQYWdlRXN0aW1hdGUoKSB7XG4gIGNvbnN0IGJhbm5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYXlvdXQtcGFnZS1lc3RpbWF0ZScpO1xuICBpZiAoIWJhbm5lcikgcmV0dXJuO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL2VzdGltYXRlLXBhZ2VzJyk7XG4gICAgaWYgKCFyZXMub2spIHJldHVybjtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoIWRhdGEub2sgfHwgIWRhdGEuZXN0aW1hdGVkX3BhZ2VzKSByZXR1cm47XG4gICAgY29uc3QgcGFnZXMgPSBkYXRhLmVzdGltYXRlZF9wYWdlcztcbiAgICBjb25zdCBpc092ZXIgPSBwYWdlcyA+IDM7XG4gICAgY29uc3QgY29sb3IgPSBpc092ZXIgPyAnIzkyNDAwZScgOiAnIzE2NjUzNCc7XG4gICAgY29uc3QgYmcgICAgPSBpc092ZXIgPyAnI2ZlZjNjNycgOiAnI2YwZmRmNCc7XG4gICAgY29uc3QgYm9yZGVyID0gaXNPdmVyID8gJyNmY2QzNGQnIDogJyNiYmY3ZDAnO1xuICAgIGNvbnN0IG1zZyAgID0gaXNPdmVyXG4gICAgICA/IGBcdTI2QTAgRXN0aW1hdGVkIH4ke3BhZ2VzfSBwYWdlcyBcdTIwMTQgc2VuaW9yIGNhbmRpZGF0ZSB0YXJnZXQgaXMgMlx1MjAxMzMgcGFnZXMuIENvbnNpZGVyIHJlZHVjaW5nIHNlbGVjdGVkIGJ1bGxldCBwb2ludHMgYmVmb3JlIGdlbmVyYXRpbmcuYFxuICAgICAgOiBgXHUyNzEzIEVzdGltYXRlZCB+JHtwYWdlc30gcGFnZXMgXHUyMDE0IHdpdGhpbiB0aGUgMlx1MjAxMzMgcGFnZSB0YXJnZXQgZm9yIHNlbmlvciBjYW5kaWRhdGVzLmA7XG4gICAgYmFubmVyLnN0eWxlLmNzc1RleHQgPSBgZGlzcGxheTpibG9jaztwYWRkaW5nOjhweCAxMnB4O2JvcmRlci1yYWRpdXM6NnB4O2JvcmRlcjoxcHggc29saWQgJHtib3JkZXJ9O2JhY2tncm91bmQ6JHtiZ307Y29sb3I6JHtjb2xvcn07Zm9udC1zaXplOjAuODdlbTtgO1xuICAgIGJhbm5lci50ZXh0Q29udGVudCA9IG1zZztcbiAgfSBjYXRjaCAoXykgeyAvKiBzaWxlbnQgXHUyMDE0IG5vbi1jcml0aWNhbCAqLyB9XG59XG5cbi8qKlxuICogU2V0IHVwIGV2ZW50IGxpc3RlbmVycyBmb3IgbGF5b3V0IGluc3RydWN0aW9uIFVJLlxuICovXG5mdW5jdGlvbiBzZXR1cExheW91dEluc3RydWN0aW9uTGlzdGVuZXJzKCkge1xuICBjb25zdCBhcHBseUJ0biAgICAgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHBseS1pbnN0cnVjdGlvbi1idG4nKTtcbiAgY29uc3QgY29uZmlybUJ0biAgICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29uZmlybS1sYXlvdXQtYnRuJyk7XG4gIGNvbnN0IHByb2NlZWRCdG4gICAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Byb2NlZWQtdG8tZmluYWxpc2UtYnRuJyk7XG4gIGNvbnN0IHJlZ2VuZXJhdGVCdG4gICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlZ2VuZXJhdGUtbGF5b3V0LXByZXZpZXctYnRuJyk7XG4gIGNvbnN0IGRpc21pc3NDYWxsb3V0QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpc21pc3MtbGF5b3V0LXN0YWxlLWJ0bicpO1xuICBjb25zdCBpbnN0cnVjdGlvbklucHV0ICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnN0cnVjdGlvbi1pbnB1dCcpO1xuICBjb25zdCBoaXN0b3J5VG9nZ2xlICAgICA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5oaXN0b3J5LXRvZ2dsZScpO1xuICBjb25zdCBhcHBseVNldHRpbmdzQnRuICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHBseS1sYXlvdXQtc2V0dGluZ3MtYnRuJyk7XG4gIGNvbnN0IGZvbnRTaXplSW5wdXQgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Jhc2UtZm9udC1zaXplLWlucHV0Jyk7XG4gIGNvbnN0IHBhZ2VNYXJnaW5JbnB1dCAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BhZ2UtbWFyZ2luLWlucHV0Jyk7XG4gIGNvbnN0IHB1YmxpY2F0aW9uc1N0YXJ0SW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHVibGljYXRpb25zLXN0YXJ0LW5ldy1wYWdlLWlucHV0Jyk7XG4gIGNvbnN0IHNraWxsc1Nob3dFeHBlcmllbmNlU2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NraWxscy1zaG93LWV4cGVyaWVuY2Utc2VsZWN0Jyk7XG5cbiAgaWYgKGFwcGx5U2V0dGluZ3NCdG4gJiYgZm9udFNpemVJbnB1dCAmJiBwYWdlTWFyZ2luSW5wdXQgJiYgcHVibGljYXRpb25zU3RhcnRJbnB1dCkge1xuICAgIGFwcGx5U2V0dGluZ3NCdG4uYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICdjbGljaycsXG4gICAgICAoKSA9PiBhcHBseUxheW91dFNldHRpbmdzKFxuICAgICAgICBmb250U2l6ZUlucHV0LnZhbHVlLFxuICAgICAgICBwYWdlTWFyZ2luSW5wdXQudmFsdWUsXG4gICAgICAgIHB1YmxpY2F0aW9uc1N0YXJ0SW5wdXQuY2hlY2tlZCxcbiAgICAgICAgc2tpbGxzU2hvd0V4cGVyaWVuY2VTZWxlY3Q/LnZhbHVlIHx8ICdpbmRpdmlkdWFsJyxcbiAgICAgICksXG4gICAgKTtcbiAgICBmb250U2l6ZUlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xuICAgICAgY29uc3QgcHREaXNwbGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZvbnQtc2l6ZS1wdC1kaXNwbGF5Jyk7XG4gICAgICBpZiAocHREaXNwbGF5KSB7XG4gICAgICAgIGNvbnN0IHB4ID0gcGFyc2VGbG9hdChmb250U2l6ZUlucHV0LnZhbHVlKTtcbiAgICAgICAgcHREaXNwbGF5LnRleHRDb250ZW50ID0gaXNOYU4ocHgpID8gJ3B4JyA6IGBweFxcdTAwYTAoJHtweFRvUHQocHgpfVxcdTAwYTBwdClgO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGZvbnRTaXplSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5cHJlc3MnLCAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSAnRW50ZXInKSB7XG4gICAgICAgIGFwcGx5TGF5b3V0U2V0dGluZ3MoXG4gICAgICAgICAgZm9udFNpemVJbnB1dC52YWx1ZSxcbiAgICAgICAgICBwYWdlTWFyZ2luSW5wdXQudmFsdWUsXG4gICAgICAgICAgcHVibGljYXRpb25zU3RhcnRJbnB1dC5jaGVja2VkLFxuICAgICAgICAgIHNraWxsc1Nob3dFeHBlcmllbmNlU2VsZWN0Py52YWx1ZSB8fCAnaW5kaXZpZHVhbCcsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcGFnZU1hcmdpbklucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXByZXNzJywgKGUpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJykge1xuICAgICAgICBhcHBseUxheW91dFNldHRpbmdzKFxuICAgICAgICAgIGZvbnRTaXplSW5wdXQudmFsdWUsXG4gICAgICAgICAgcGFnZU1hcmdpbklucHV0LnZhbHVlLFxuICAgICAgICAgIHB1YmxpY2F0aW9uc1N0YXJ0SW5wdXQuY2hlY2tlZCxcbiAgICAgICAgICBza2lsbHNTaG93RXhwZXJpZW5jZVNlbGVjdD8udmFsdWUgfHwgJ2luZGl2aWR1YWwnLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgaWYgKGFwcGx5QnRuKSB7XG4gICAgYXBwbHlCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uSW5wdXQudmFsdWUudHJpbSgpO1xuICAgICAgaWYgKCFpbnN0cnVjdGlvbikge1xuICAgICAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnXHUyNkEwXHVGRTBGIFBsZWFzZSBlbnRlciBhbiBpbnN0cnVjdGlvbiBiZWZvcmUgc3VibWl0dGluZy4nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgc3VibWl0U21hcnRJbnN0cnVjdGlvbihpbnN0cnVjdGlvbik7XG4gICAgfSk7XG4gIH1cblxuICBpZiAoY29uZmlybUJ0bikge1xuICAgIGNvbmZpcm1CdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjb25maXJtTGF5b3V0UmV2aWV3KTtcbiAgfVxuXG4gIGlmIChwcm9jZWVkQnRuKSB7XG4gICAgcHJvY2VlZEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGdlbmVyYXRlRmluYWxPdXRwdXRzKTtcbiAgfVxuXG4gIGlmIChyZWdlbmVyYXRlQnRuKSB7XG4gICAgcmVnZW5lcmF0ZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZVJlZ2VuZXJhdGVQcmV2aWV3QWN0aW9uKTtcbiAgfVxuXG4gIGlmIChkaXNtaXNzQ2FsbG91dEJ0bikge1xuICAgIGRpc21pc3NDYWxsb3V0QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgZGlzbWlzc2VkU3RhbGVDYWxsb3V0UmV2aXNpb24gPSBnZXRDdXJyZW50Q29udGVudFJldmlzaW9uKCk7XG4gICAgICByZW5kZXJMYXlvdXRTdGFsZUNhbGxvdXQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChoaXN0b3J5VG9nZ2xlKSB7XG4gICAgaGlzdG9yeVRvZ2dsZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICBlLnRhcmdldC50ZXh0Q29udGVudCA9IGUudGFyZ2V0LnRleHRDb250ZW50ID09PSAnXHUyNUJDJyA/ICdcdTI1QjYnIDogJ1x1MjVCQyc7XG4gICAgICBjb25zdCBoaXN0b3J5TGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnN0cnVjdGlvbi1oaXN0b3J5Jyk7XG4gICAgICBpZiAoaGlzdG9yeUxpc3QpIHtcbiAgICAgICAgaGlzdG9yeUxpc3QuY2xhc3NMaXN0LnRvZ2dsZSgnY29sbGFwc2VkJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBBbGxvdyBFbnRlciBrZXkgdG8gc3VibWl0IGluIHRleHRhcmVhIChTaGlmdCtFbnRlciBmb3IgbmV3IGxpbmUpXG4gIGlmIChpbnN0cnVjdGlvbklucHV0KSB7XG4gICAgaW5zdHJ1Y3Rpb25JbnB1dC5hZGRFdmVudExpc3RlbmVyKCdrZXlwcmVzcycsIChlKSA9PiB7XG4gICAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicgJiYgIWUuc2hpZnRLZXkpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBhcHBseUJ0bj8uY2xpY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIENvbnRlbnQgcHJvcG9zYWwgYW5kIGRpcnR5LXBoYXNlIGJ1dHRvbnNcbiAgY29uc3QgYXBwbHlDb250ZW50Q2hhbmdlc0J0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHBseS1jb250ZW50LWNoYW5nZXMtYnRuJyk7XG4gIGNvbnN0IHJldHVyblRvRGlydHlCdG4gICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmV0dXJuLXRvLWVhcmxpZXN0LWRpcnR5LWJ0bicpO1xuXG4gIGlmIChhcHBseUNvbnRlbnRDaGFuZ2VzQnRuKSB7XG4gICAgYXBwbHlDb250ZW50Q2hhbmdlc0J0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFwcGx5QWNjZXB0ZWRQcm9wb3NhbHMpO1xuICB9XG5cbiAgaWYgKHJldHVyblRvRGlydHlCdG4pIHtcbiAgICByZXR1cm5Ub0RpcnR5QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgY29uc3Qgc3RlcCA9IHN0YXRlTWFuYWdlci5nZXRFYXJsaWVzdERpcnR5U3RlcCgpIHx8ICdnZW5lcmF0ZSc7XG4gICAgICBjb25maXJtUmVSdW5QaGFzZShzdGVwKTtcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFNhdmUgbGF5b3V0IGRpc3BsYXkgc2V0dGluZ3MgdG8gc2Vzc2lvbiBzdGF0ZSwgdGhlbiByZS1yZW5kZXIgdGhlIHByZXZpZXcuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGFwcGx5TGF5b3V0U2V0dGluZ3MoZm9udFNpemVWYWx1ZSwgcGFnZU1hcmdpblZhbHVlLCBwdWJsaWNhdGlvbnNTdGFydE5ld1BhZ2UgPSBmYWxzZSwgc2tpbGxzU2hvd0V4cGVyaWVuY2UgPSAnaW5kaXZpZHVhbCcpIHtcbiAgY29uc3Qgc3RhdHVzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGF5b3V0LXNldHRpbmdzLXN0YXR1cycpO1xuICBjb25zdCBwYXJzZWRGb250U2l6ZSA9IHBhcnNlRmxvYXQoZm9udFNpemVWYWx1ZSk7XG4gIGNvbnN0IHBhcnNlZFBhZ2VNYXJnaW4gPSBwYXJzZUZsb2F0KHBhZ2VNYXJnaW5WYWx1ZSk7XG4gIGlmIChpc05hTihwYXJzZWRGb250U2l6ZSkgfHwgcGFyc2VkRm9udFNpemUgPCA2IHx8IHBhcnNlZEZvbnRTaXplID4gMTYpIHtcbiAgICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJ1x1MjZBMFx1RkUwRiBGb250IG11c3QgYmUgNlx1MjAxMzE2JztcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGlzTmFOKHBhcnNlZFBhZ2VNYXJnaW4pIHx8IHBhcnNlZFBhZ2VNYXJnaW4gPCAwLjUgfHwgcGFyc2VkUGFnZU1hcmdpbiA+IDEuNSkge1xuICAgIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnXHUyNkEwXHVGRTBGIE1hcmdpbiBtdXN0IGJlIDAuNVx1MjAxMzEuNSc7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRyeSB7XG4gICAgaWYgKHN0YXR1c0VsKSBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICdTYXZpbmdcdTIwMjYnO1xuICAgIGNvbnN0IHNhdmVSZXMgPSBhd2FpdCBhcGlDYWxsKCdQT1NUJywgJy9hcGkvbGF5b3V0LXNldHRpbmdzJywge1xuICAgICAgYmFzZV9mb250X3NpemU6IGAke3BhcnNlZEZvbnRTaXplfXB4YCxcbiAgICAgIHBhZ2VfbWFyZ2luOiBgJHtwYXJzZWRQYWdlTWFyZ2lufWluYCxcbiAgICAgIHB1YmxpY2F0aW9uc19zdGFydF9uZXdfcGFnZTogQm9vbGVhbihwdWJsaWNhdGlvbnNTdGFydE5ld1BhZ2UpLFxuICAgICAgc2tpbGxzX3Nob3dfZXhwZXJpZW5jZTogc2tpbGxzU2hvd0V4cGVyaWVuY2UsXG4gICAgfSk7XG4gICAgaWYgKCFzYXZlUmVzLm9rKSB0aHJvdyBuZXcgRXJyb3Ioc2F2ZVJlcy5lcnJvciB8fCAnc2F2ZSBmYWlsZWQnKTtcblxuICAgIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnUmUtcmVuZGVyaW5nXHUyMDI2JztcbiAgICBjb25zdCBwcmV2aWV3UmVzID0gYXdhaXQgYXBpQ2FsbCgnUE9TVCcsICcvYXBpL2N2L2dlbmVyYXRlLXByZXZpZXcnLCB7IGNvbnRlbnRfcmV2aXNpb246IGdldEN1cnJlbnRDb250ZW50UmV2aXNpb24oKSB9KTtcbiAgICBpZiAocHJldmlld1Jlcy5vayAmJiBwcmV2aWV3UmVzLmh0bWwpIHtcbiAgICAgIGRpc3BsYXlMYXlvdXRQcmV2aWV3KHByZXZpZXdSZXMuaHRtbCk7XG4gICAgICBzZXRQcmV2aWV3SHRtbChwcmV2aWV3UmVzLmh0bWwpO1xuICAgICAgZGlzbWlzc2VkU3RhbGVDYWxsb3V0UmV2aXNpb24gPSBudWxsO1xuICAgICAgc3RhdGVNYW5hZ2VyPy5tYXJrUHJldmlld0dlbmVyYXRlZD8uKHtcbiAgICAgICAgcHJldmlld0F2YWlsYWJsZTogdHJ1ZSxcbiAgICAgICAgcHJldmlld091dHB1dHM6IHByZXZpZXdSZXMucHJldmlld19vdXRwdXRzIHx8IG51bGwsXG4gICAgICAgIHBhZ2VDb3VudEVzdGltYXRlOiBwcmV2aWV3UmVzLnBhZ2VfY291bnRfZXN0aW1hdGUgPz8gbnVsbCxcbiAgICAgICAgcGFnZUNvdW50RXhhY3Q6IHByZXZpZXdSZXMucGFnZV9jb3VudF9leGFjdCA/PyBudWxsLFxuICAgICAgICBwYWdlQ291bnRDb25maWRlbmNlOiBwcmV2aWV3UmVzLnBhZ2VfY291bnRfY29uZmlkZW5jZSA/PyBudWxsLFxuICAgICAgICBwYWdlQ291bnRTb3VyY2U6IHByZXZpZXdSZXMucGFnZV9jb3VudF9zb3VyY2UgfHwgbnVsbCxcbiAgICAgICAgcGFnZVdhcm5pbmc6IEJvb2xlYW4ocHJldmlld1Jlcy5wYWdlX2xlbmd0aF93YXJuaW5nKSxcbiAgICAgICAgcHJldmlld0dlbmVyYXRlZEF0OiBwcmV2aWV3UmVzLnByZXZpZXdfZ2VuZXJhdGVkX2F0IHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgcHJldmlld1JlcXVlc3RJZDogcHJldmlld1Jlcy5wcmV2aWV3X3JlcXVlc3RfaWQgfHwgbnVsbCxcbiAgICAgIH0pO1xuICAgICAgcmVuZGVyUHJldmlld091dHB1dFN0YXR1cyhwcmV2aWV3UmVzLnByZXZpZXdfb3V0cHV0cyB8fCBudWxsKTtcbiAgICAgIHJlZnJlc2hMYXlvdXRSZXZpZXdTdGF0ZSgpO1xuICAgICAgKHByZXZpZXdSZXMuY29udGVudF93YXJuaW5ncyB8fCBbXSkuZm9yRWFjaCh3ID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHNob3dUb2FzdCh3Lm1lc3NhZ2UsICd3YXJuaW5nJywgODAwMCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHN0YXR1c0VsKSB7IHN0YXR1c0VsLnRleHRDb250ZW50ID0gJ1x1MjcwNSBBcHBsaWVkJzsgc2V0VGltZW91dCgoKSA9PiB7IHN0YXR1c0VsLnRleHRDb250ZW50ID0gJyc7IH0sIDIwMDApOyB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSBgXHUyNzRDIEZhaWxlZCB0byBhcHBseSBcdTIwMTQgdHJ5IGFnYWluIG9yIHJlZnJlc2guYDtcbiAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCBgXHUyNzRDIENvdWxkIG5vdCBhcHBseSB0aGUgaW5zdHJ1Y3Rpb24uIFRyeSByZXBocmFzaW5nIGl0IG9yIHJlZnJlc2ggdGhlIHBhZ2UgaWYgdGhlIHByb2JsZW0gcGVyc2lzdHMuYCk7XG4gIH1cbn1cblxuLyoqXG4gKiBTdWJtaXQgYW4gaW5zdHJ1Y3Rpb24gdGhyb3VnaCB0aGUgdW5pZmllZCBzbWFydC1pbnN0cnVjdGlvbiBlbmRwb2ludC5cbiAqIFRoZSBiYWNrZW5kIGNsYXNzaWZpZXMgdGhlIGluc3RydWN0aW9uIGFzIGxheW91dCBvciBjb250ZW50IGFuZCBkZWxlZ2F0ZXNcbiAqIHRvIHRoZSBhcHByb3ByaWF0ZSBoYW5kbGVyLiBUaGUgcmVzcG9uc2UgaXMgcm91dGVkIGFjY29yZGluZ2x5IGhlcmUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN1Ym1pdFNtYXJ0SW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb25UZXh0KSB7XG4gIGNvbnN0IGN1cnJlbnRIdG1sID0gZ2V0Q3ZBcnRpZmFjdHMoKVsnKi5odG1sJ10gfHwgJyc7XG4gIC8vIFNuYXBzaG90IHN0YXRlIGZvciB1bmRvIGJlZm9yZSBhcHBseWluZy5cbiAgX2xheW91dFVuZG9TdGFjay5wdXNoKHtcbiAgICBodG1sOiBjdXJyZW50SHRtbCxcbiAgICBpbnN0cnVjdGlvbnM6ICh3aW5kb3cubGF5b3V0SW5zdHJ1Y3Rpb25zIHx8IFtdKS5tYXAoaSA9PiAoeyAuLi5pIH0pKSxcbiAgfSk7XG4gIGlmIChfbGF5b3V0VW5kb1N0YWNrLmxlbmd0aCA+IF9VTkRPX1NUQUNLX01BWCkge1xuICAgIF9sYXlvdXRVbmRvU3RhY2suc2hpZnQoKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgc2hvd1Byb2Nlc3NpbmcodHJ1ZSk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBhcGlDYWxsKCdQT1NUJywgJy9hcGkvY3Yvc21hcnQtaW5zdHJ1Y3Rpb24nLCB7IGluc3RydWN0aW9uOiBpbnN0cnVjdGlvblRleHQgfSk7XG5cbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICBpZiAocmVzcG9uc2UuZXJyb3IgPT09ICdjbGFyaWZ5Jykge1xuICAgICAgICBzaG93Q2xhcmlmaWNhdGlvbkRpYWxvZyhyZXNwb25zZS5xdWVzdGlvbiwgaW5zdHJ1Y3Rpb25UZXh0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFwcGVuZExheW91dFNhZmV0eUFsZXJ0KHJlc3BvbnNlLnNhZmV0eV9hbGVydCk7XG4gICAgICAgIGxldCBlcnJvckh0bWwgPSBgXHUyNkEwXHVGRTBGIEVycm9yOiAke2VzY2FwZUh0bWwocmVzcG9uc2UuZXJyb3IpfSBcdTIwMTQgJHtlc2NhcGVIdG1sKHJlc3BvbnNlLmRldGFpbHMgfHwgJycpfWA7XG4gICAgICAgIGlmIChyZXNwb25zZS5yYXdfcmVzcG9uc2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGVycm9ySHRtbCArPSBgPGJyPjxkZXRhaWxzIHN0eWxlPVwibWFyZ2luLXRvcDo2cHhcIj48c3VtbWFyeSBzdHlsZT1cImN1cnNvcjpwb2ludGVyO2ZvbnQtc2l6ZTowLjg1ZW07Y29sb3I6IzY0NzQ4YlwiPlJhdyBMTE0gcmVzcG9uc2U8L3N1bW1hcnk+PHByZSBzdHlsZT1cImZvbnQtc2l6ZTowLjc1ZW07d2hpdGUtc3BhY2U6cHJlLXdyYXA7d29yZC1icmVhazpicmVhay1hbGw7bWF4LWhlaWdodDoyMDBweDtvdmVyZmxvdy15OmF1dG87YmFja2dyb3VuZDojZjhmYWZjO2JvcmRlcjoxcHggc29saWQgI2UyZThmMDtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjhweDttYXJnaW4tdG9wOjRweFwiPiR7ZXNjYXBlSHRtbChyZXNwb25zZS5yYXdfcmVzcG9uc2UgfHwgJyhlbXB0eSknKX08L3ByZT48L2RldGFpbHM+YDtcbiAgICAgICAgfVxuICAgICAgICBhcHBlbmRNZXNzYWdlSHRtbCgnc3lzdGVtJywgZXJyb3JIdG1sKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpbnN0cnVjdGlvblR5cGUgPSByZXNwb25zZS5pbnN0cnVjdGlvbl90eXBlIHx8ICdsYXlvdXQnO1xuXG4gICAgaWYgKGluc3RydWN0aW9uVHlwZSA9PT0gJ2NvbnRlbnQnKSB7XG4gICAgICAvLyBDb250ZW50IHBhdGg6IHJlbmRlciBwcm9wb3NhbHMgZm9yIHJldmlld1xuICAgICAgY29uc3QgcHJvcG9zYWxzID0gcmVzcG9uc2UucHJvcG9zYWxzIHx8IFtdO1xuICAgICAgaWYgKHByb3Bvc2Fscy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgJ1x1MjZBMFx1RkUwRiBObyBjb250ZW50IHByb3Bvc2FscyB3ZXJlIGdlbmVyYXRlZC4gVHJ5IHJlcGhyYXNpbmcgeW91ciBpbnN0cnVjdGlvbi4nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlbmRlckNvbnRlbnRQcm9wb3NhbHMocHJvcG9zYWxzKTtcbiAgICAgICAgY29uc3QgcGFuZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGVudC1wcm9wb3NhbHMtcGFuZWwnKTtcbiAgICAgICAgaWYgKHBhbmVsKSBwYW5lbC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgIH1cbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnN0cnVjdGlvbi1pbnB1dCcpLnZhbHVlID0gJyc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gTGF5b3V0IHBhdGg6IHVwZGF0ZSBwcmV2aWV3XG4gICAgY29uc3QgbmV3SHRtbCA9IHJlc3BvbnNlLmh0bWw7XG4gICAgZGlzcGxheUxheW91dFByZXZpZXcobmV3SHRtbCk7XG4gICAgYXBwZW5kTGF5b3V0U2FmZXR5QWxlcnQocmVzcG9uc2Uuc2FmZXR5X2FsZXJ0KTtcbiAgICBzZXRQcmV2aWV3SHRtbChuZXdIdG1sKTtcbiAgICBkaXNtaXNzZWRTdGFsZUNhbGxvdXRSZXZpc2lvbiA9IG51bGw7XG4gICAgc3RhdGVNYW5hZ2VyPy5tYXJrUHJldmlld0dlbmVyYXRlZD8uKHtcbiAgICAgIHByZXZpZXdBdmFpbGFibGU6IHRydWUsXG4gICAgICBwcmV2aWV3T3V0cHV0czogcmVzcG9uc2UucHJldmlld19vdXRwdXRzIHx8IG51bGwsXG4gICAgICBsYXlvdXRDb25maXJtZWQ6IGZhbHNlLFxuICAgICAgcGFnZUNvdW50RXN0aW1hdGU6IHJlc3BvbnNlLnBhZ2VfY291bnRfZXN0aW1hdGUgPz8gbnVsbCxcbiAgICAgIHBhZ2VDb3VudEV4YWN0OiByZXNwb25zZS5wYWdlX2NvdW50X2V4YWN0ID8/IG51bGwsXG4gICAgICBwYWdlQ291bnRDb25maWRlbmNlOiByZXNwb25zZS5wYWdlX2NvdW50X2NvbmZpZGVuY2UgPz8gbnVsbCxcbiAgICAgIHBhZ2VDb3VudFNvdXJjZTogcmVzcG9uc2UucGFnZV9jb3VudF9zb3VyY2UgfHwgbnVsbCxcbiAgICAgIHBhZ2VXYXJuaW5nOiBCb29sZWFuKHJlc3BvbnNlLnBhZ2VfbGVuZ3RoX3dhcm5pbmcpLFxuICAgICAgcHJldmlld0dlbmVyYXRlZEF0OiByZXNwb25zZS5wcmV2aWV3X2dlbmVyYXRlZF9hdCB8fCBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICBwcmV2aWV3UmVxdWVzdElkOiByZXNwb25zZS5wcmV2aWV3X3JlcXVlc3RfaWQgfHwgbnVsbCxcbiAgICB9KTtcbiAgICByZW5kZXJQcmV2aWV3T3V0cHV0U3RhdHVzKHJlc3BvbnNlLnByZXZpZXdfb3V0cHV0cyB8fCBudWxsKTtcblxuICAgIGNvbnN0IGluc3RydWN0aW9uID0ge1xuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvTG9jYWxlVGltZVN0cmluZygpLFxuICAgICAgaW5zdHJ1Y3Rpb25fdGV4dDogaW5zdHJ1Y3Rpb25UZXh0LFxuICAgICAgY2hhbmdlX3N1bW1hcnk6IHJlc3BvbnNlLnN1bW1hcnksXG4gICAgICBjb25maXJtYXRpb246IHRydWUsXG4gICAgfTtcbiAgICBhZGRUb0luc3RydWN0aW9uSGlzdG9yeShpbnN0cnVjdGlvbik7XG4gICAgc2hvd0NvbmZpcm1hdGlvbk1lc3NhZ2UoYCR7cmVzcG9uc2Uuc2FmZXR5X2FsZXJ0Py5mbGFnZ2VkID8gJ1x1MjZBMFx1RkUwRiAnIDogJ1x1MjcwNSAnfSR7cmVzcG9uc2Uuc3VtbWFyeX1gKTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5zdHJ1Y3Rpb24taW5wdXQnKS52YWx1ZSA9ICcnO1xuICAgIHJlZnJlc2hMYXlvdXRSZXZpZXdTdGF0ZSgpO1xuXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgYFx1Mjc0QyBDb3VsZCBub3QgYXBwbHkgdGhlIGluc3RydWN0aW9uLiBUcnkgcmVwaHJhc2luZyBpdCwgb3IgY2xpY2sgXCJSZWdlbmVyYXRlIFByZXZpZXdcIiB0byByZXNldCB0aGUgcHJldmlldyBhbmQgdHJ5IGFnYWluLmApO1xuICB9IGZpbmFsbHkge1xuICAgIHNob3dQcm9jZXNzaW5nKGZhbHNlKTtcbiAgfVxufVxuXG4vKipcbiAqIFN1Ym1pdCBsYXlvdXQgaW5zdHJ1Y3Rpb24gdG8gYmFja2VuZCBmb3IgcHJvY2Vzc2luZy5cbiAqXG4gKiBVc2VzIFBPU1QgL2FwaS9jdi9sYXlvdXQtcmVmaW5lIChzdGFnZWQgZ2VuZXJhdGlvbiBjb250cmFjdCkgd2hlbiBhXG4gKiBzZXNzaW9uLXN0b3JlZCBwcmV2aWV3IGlzIGF2YWlsYWJsZS4gIEZhbGxzIGJhY2sgdG8gdGhlIGxlZ2FjeVxuICogUE9TVCAvYXBpL2xheW91dC1pbnN0cnVjdGlvbiBlbmRwb2ludCAod2hpY2ggcmVxdWlyZXMgdGhlIEhUTUwgaW4gdGhlXG4gKiByZXF1ZXN0IGJvZHkpIHdoZW4gbm8gc2Vzc2lvbiBwcmV2aWV3IGV4aXN0cy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3VibWl0TGF5b3V0SW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb25UZXh0KSB7XG4gIC8qIGR1Y2tmbG93OlxuICAgKiAgIGlkOiBsYXlvdXRfdWlfcmVmaW5lX2xpdmVcbiAgICogICBraW5kOiB1aVxuICAgKiAgIHRpbWVzdGFtcDogJzIwMjYtMDMtMjZUMDA6MjQ6MDBaJ1xuICAgKiAgIHN0YXR1czogbGl2ZVxuICAgKiAgIGhhbmRsZXM6XG4gICAqICAgLSB1aTpsYXlvdXQuc3VibWl0LWluc3RydWN0aW9uXG4gICAqICAgY2FsbHM6XG4gICAqICAgLSBQT1NUIC9hcGkvY3YvbGF5b3V0LXJlZmluZVxuICAgKiAgIC0gUE9TVCAvYXBpL2xheW91dC1pbnN0cnVjdGlvblxuICAgKiAgIHJlYWRzOlxuICAgKiAgIC0gZG9tOiNpbnN0cnVjdGlvbi1pbnB1dC52YWx1ZVxuICAgKiAgIC0gc3RhdGU6Z2VuZXJhdGlvbl9zdGF0ZS5wcmV2aWV3QXZhaWxhYmxlXG4gICAqICAgLSBzdGF0ZTpnZW5lcmF0aW9uX3N0YXRlLnBoYXNlXG4gICAqICAgLSB3aW5kb3c6bGF5b3V0SW5zdHJ1Y3Rpb25zXG4gICAqICAgd3JpdGVzOlxuICAgKiAgIC0gcmVxdWVzdDpQT1NUIC9hcGkvY3YvbGF5b3V0LXJlZmluZS5pbnN0cnVjdGlvblxuICAgKiAgIC0gZG9tOiNsYXlvdXQtcHJldmlld1xuICAgKiAgIC0gd2luZG93OmxheW91dEluc3RydWN0aW9uc1xuICAgKiAgIC0gc3RhdGU6Z2VuZXJhdGlvbl9zdGF0ZS5wcmV2aWV3X291dHB1dHNcbiAgICogICBub3RlczogU3VibWl0cyBhIG5hdHVyYWwtbGFuZ3VhZ2UgbGF5b3V0IGluc3RydWN0aW9uIGFnYWluc3QgdGhlIHN0YWdlZCBwcmV2aWV3IHdoZW4gYXZhaWxhYmxlLCB0aGVuIHJlZnJlc2hlcyB0aGUgcHJldmlldyBhbmQgbG9jYWwgaW5zdHJ1Y3Rpb24gaGlzdG9yeSBmcm9tIHRoZSByZXR1cm5lZCBIVE1MLlxuICAgKi9cbiAgY29uc3QgY3VycmVudEh0bWwgPSBnZXRDdkFydGlmYWN0cygpWycqLmh0bWwnXSB8fCAnJztcbiAgY29uc3QgcHJpb3JJbnN0cnVjdGlvbnMgPSB3aW5kb3cubGF5b3V0SW5zdHJ1Y3Rpb25zIHx8IFtdO1xuXG4gIC8vIFNuYXBzaG90IHN0YXRlIGJlZm9yZSBhcHBseWluZyBzbyBVbmRvIGNhbiByZXN0b3JlIGl0LlxuICBfbGF5b3V0VW5kb1N0YWNrLnB1c2goe1xuICAgIGh0bWw6IGN1cnJlbnRIdG1sLFxuICAgIGluc3RydWN0aW9uczogKHdpbmRvdy5sYXlvdXRJbnN0cnVjdGlvbnMgfHwgW10pLm1hcChpID0+ICh7IC4uLmkgfSkpLFxuICB9KTtcbiAgaWYgKF9sYXlvdXRVbmRvU3RhY2subGVuZ3RoID4gX1VORE9fU1RBQ0tfTUFYKSB7XG4gICAgX2xheW91dFVuZG9TdGFjay5zaGlmdCgpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBzaG93UHJvY2Vzc2luZyh0cnVlKTtcblxuICAgIC8vIFByZWZlciB0aGUgc2Vzc2lvbi1iYWNrZWQgZW5kcG9pbnQ7IGl0IG1hbmFnZXMgSFRNTCBzZXJ2ZXItc2lkZS5cbiAgICBsZXQgcmVzcG9uc2U7XG4gICAgY29uc3QgZ2VuU3RhdGUgPSBzdGF0ZU1hbmFnZXI/LmdldEdlbmVyYXRpb25TdGF0ZT8uKCkgfHwge307XG4gICAgY29uc3QgdXNlU2Vzc2lvbkVuZHBvaW50ID0gZ2VuU3RhdGUucHJldmlld0F2YWlsYWJsZSB8fCBnZW5TdGF0ZS5waGFzZSA9PT0gJ2xheW91dF9yZXZpZXcnO1xuXG4gICAgaWYgKHVzZVNlc3Npb25FbmRwb2ludCkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCBhcGlDYWxsKCdQT1NUJywgJy9hcGkvY3YvbGF5b3V0LXJlZmluZScsIHtcbiAgICAgICAgaW5zdHJ1Y3Rpb246IGluc3RydWN0aW9uVGV4dCxcbiAgICAgICAgY29udGVudF9yZXZpc2lvbjogZ2V0Q3VycmVudENvbnRlbnRSZXZpc2lvbigpLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgYXBpQ2FsbCgnUE9TVCcsICcvYXBpL2xheW91dC1pbnN0cnVjdGlvbicsIHtcbiAgICAgICAgaW5zdHJ1Y3Rpb246IGluc3RydWN0aW9uVGV4dCxcbiAgICAgICAgY3VycmVudF9odG1sOiBjdXJyZW50SHRtbCxcbiAgICAgICAgcHJpb3JfaW5zdHJ1Y3Rpb25zOiBwcmlvckluc3RydWN0aW9ucyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIGlmIChyZXNwb25zZS5lcnJvciA9PT0gJ2NsYXJpZnknKSB7XG4gICAgICAgIHNob3dDbGFyaWZpY2F0aW9uRGlhbG9nKHJlc3BvbnNlLnF1ZXN0aW9uLCBpbnN0cnVjdGlvblRleHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXBwZW5kTGF5b3V0U2FmZXR5QWxlcnQocmVzcG9uc2Uuc2FmZXR5X2FsZXJ0KTtcbiAgICAgICAgbGV0IGVycm9ySHRtbCA9IGBcdTI2QTBcdUZFMEYgRXJyb3I6ICR7ZXNjYXBlSHRtbChyZXNwb25zZS5lcnJvcil9IFx1MjAxNCAke2VzY2FwZUh0bWwocmVzcG9uc2UuZGV0YWlscyB8fCAnJyl9YDtcbiAgICAgICAgaWYgKHJlc3BvbnNlLnJhd19yZXNwb25zZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZXJyb3JIdG1sICs9IGA8YnI+PGRldGFpbHMgc3R5bGU9XCJtYXJnaW4tdG9wOjZweFwiPjxzdW1tYXJ5IHN0eWxlPVwiY3Vyc29yOnBvaW50ZXI7Zm9udC1zaXplOjAuODVlbTtjb2xvcjojNjQ3NDhiXCI+UmF3IExMTSByZXNwb25zZTwvc3VtbWFyeT48cHJlIHN0eWxlPVwiZm9udC1zaXplOjAuNzVlbTt3aGl0ZS1zcGFjZTpwcmUtd3JhcDt3b3JkLWJyZWFrOmJyZWFrLWFsbDttYXgtaGVpZ2h0OjIwMHB4O292ZXJmbG93LXk6YXV0bztiYWNrZ3JvdW5kOiNmOGZhZmM7Ym9yZGVyOjFweCBzb2xpZCAjZTJlOGYwO2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6OHB4O21hcmdpbi10b3A6NHB4XCI+JHtlc2NhcGVIdG1sKHJlc3BvbnNlLnJhd19yZXNwb25zZSB8fCAnKGVtcHR5KScpfTwvcHJlPjwvZGV0YWlscz5gO1xuICAgICAgICB9XG4gICAgICAgIGFwcGVuZE1lc3NhZ2VIdG1sKCdzeXN0ZW0nLCBlcnJvckh0bWwpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBwcmV2aWV3IHdpdGggbmV3IEhUTUxcbiAgICBjb25zdCBuZXdIdG1sID0gcmVzcG9uc2UuaHRtbDtcbiAgICBkaXNwbGF5TGF5b3V0UHJldmlldyhuZXdIdG1sKTtcblxuICAgIGFwcGVuZExheW91dFNhZmV0eUFsZXJ0KHJlc3BvbnNlLnNhZmV0eV9hbGVydCk7XG5cbiAgICAvLyBVcGRhdGUgc3RhdGVcbiAgICBzZXRQcmV2aWV3SHRtbChuZXdIdG1sKTtcbiAgICBkaXNtaXNzZWRTdGFsZUNhbGxvdXRSZXZpc2lvbiA9IG51bGw7XG4gICAgc3RhdGVNYW5hZ2VyPy5tYXJrUHJldmlld0dlbmVyYXRlZD8uKHtcbiAgICAgIHByZXZpZXdBdmFpbGFibGU6IHRydWUsXG4gICAgICBwcmV2aWV3T3V0cHV0czogcmVzcG9uc2UucHJldmlld19vdXRwdXRzIHx8IG51bGwsXG4gICAgICBsYXlvdXRDb25maXJtZWQ6IGZhbHNlLFxuICAgICAgcGFnZUNvdW50RXN0aW1hdGU6IHJlc3BvbnNlLnBhZ2VfY291bnRfZXN0aW1hdGUgPz8gbnVsbCxcbiAgICAgIHBhZ2VDb3VudEV4YWN0OiByZXNwb25zZS5wYWdlX2NvdW50X2V4YWN0ID8/IG51bGwsXG4gICAgICBwYWdlQ291bnRDb25maWRlbmNlOiByZXNwb25zZS5wYWdlX2NvdW50X2NvbmZpZGVuY2UgPz8gbnVsbCxcbiAgICAgIHBhZ2VDb3VudFNvdXJjZTogcmVzcG9uc2UucGFnZV9jb3VudF9zb3VyY2UgfHwgbnVsbCxcbiAgICAgIHBhZ2VXYXJuaW5nOiBCb29sZWFuKHJlc3BvbnNlLnBhZ2VfbGVuZ3RoX3dhcm5pbmcpLFxuICAgICAgcHJldmlld0dlbmVyYXRlZEF0OiByZXNwb25zZS5wcmV2aWV3X2dlbmVyYXRlZF9hdCB8fCBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICBwcmV2aWV3UmVxdWVzdElkOiByZXNwb25zZS5wcmV2aWV3X3JlcXVlc3RfaWQgfHwgbnVsbCxcbiAgICB9KTtcbiAgICByZW5kZXJQcmV2aWV3T3V0cHV0U3RhdHVzKHJlc3BvbnNlLnByZXZpZXdfb3V0cHV0cyB8fCBudWxsKTtcblxuICAgIC8vIEFkZCB0byBpbnN0cnVjdGlvbiBoaXN0b3J5XG4gICAgY29uc3QgaW5zdHJ1Y3Rpb24gPSB7XG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9Mb2NhbGVUaW1lU3RyaW5nKCksXG4gICAgICBpbnN0cnVjdGlvbl90ZXh0OiBpbnN0cnVjdGlvblRleHQsXG4gICAgICBjaGFuZ2Vfc3VtbWFyeTogcmVzcG9uc2Uuc3VtbWFyeSxcbiAgICAgIGNvbmZpcm1hdGlvbjogdHJ1ZVxuICAgIH07XG4gICAgYWRkVG9JbnN0cnVjdGlvbkhpc3RvcnkoaW5zdHJ1Y3Rpb24pO1xuXG4gICAgLy8gU2hvdyBjb25maXJtYXRpb25cbiAgICBzaG93Q29uZmlybWF0aW9uTWVzc2FnZShgJHtyZXNwb25zZS5zYWZldHlfYWxlcnQ/LmZsYWdnZWQgPyAnXHUyNkEwXHVGRTBGICcgOiAnXHUyNzA1ICd9JHtyZXNwb25zZS5zdW1tYXJ5fWApO1xuXG4gICAgLy8gQ2xlYXIgaW5wdXQgYW5kIHJlZnJlc2ggdGhlIHN0YWdlZCBjb250cm9scy5cbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5zdHJ1Y3Rpb24taW5wdXQnKS52YWx1ZSA9ICcnO1xuICAgIHJlZnJlc2hMYXlvdXRSZXZpZXdTdGF0ZSgpO1xuXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgYFx1Mjc0QyBDb3VsZCBub3QgYXBwbHkgdGhlIGxheW91dCBpbnN0cnVjdGlvbi4gVHJ5IHJlcGhyYXNpbmcgaXQsIG9yIGNsaWNrIFwiUmVnZW5lcmF0ZSBQcmV2aWV3XCIgdG8gcmVzZXQgYW5kIHRyeSBhZ2Fpbi5gKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBzaG93UHJvY2Vzc2luZyhmYWxzZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgbWFya1ByZXZpZXdHZW5lcmF0ZWQgcGF5bG9hZCBmcm9tIGEgL2FwaS9jdi9nZW5lcmF0ZS1wcmV2aWV3IHJlc3BvbnNlLlxuICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBSZXNwb25zZSBmcm9tIHRoZSBnZW5lcmF0ZS1wcmV2aWV3IGVuZHBvaW50LlxuICogQHJldHVybnMge09iamVjdH0gUGF5bG9hZCBzdWl0YWJsZSBmb3Igc3RhdGVNYW5hZ2VyLm1hcmtQcmV2aWV3R2VuZXJhdGVkKCkuXG4gKi9cbmZ1bmN0aW9uIF9idWlsZFByZXZpZXdQYXlsb2FkKGRhdGEpIHtcbiAgcmV0dXJuIHtcbiAgICBwcmV2aWV3QXZhaWxhYmxlOiAgICB0cnVlLFxuICAgIHByZXZpZXdPdXRwdXRzOiAgICAgIGRhdGEucHJldmlld19vdXRwdXRzICAgICAgfHwgbnVsbCxcbiAgICBwYWdlQ291bnRFc3RpbWF0ZTogICBkYXRhLnBhZ2VfY291bnRfZXN0aW1hdGUgID8/IG51bGwsXG4gICAgcGFnZUNvdW50RXhhY3Q6ICAgICAgZGF0YS5wYWdlX2NvdW50X2V4YWN0ICAgICAgPz8gbnVsbCxcbiAgICBwYWdlQ291bnRDb25maWRlbmNlOiBkYXRhLnBhZ2VfY291bnRfY29uZmlkZW5jZSA/PyBudWxsLFxuICAgIHBhZ2VDb3VudFNvdXJjZTogICAgIGRhdGEucGFnZV9jb3VudF9zb3VyY2UgICAgIHx8IG51bGwsXG4gICAgcGFnZVdhcm5pbmc6ICAgICAgICAgQm9vbGVhbihkYXRhLnBhZ2VfbGVuZ3RoX3dhcm5pbmcpLFxuICAgIHByZXZpZXdHZW5lcmF0ZWRBdDogIGRhdGEucHJldmlld19nZW5lcmF0ZWRfYXQgIHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICBwcmV2aWV3UmVxdWVzdElkOiAgICBkYXRhLnByZXZpZXdfcmVxdWVzdF9pZCAgICB8fCBudWxsLFxuICB9O1xufVxuXG4vKipcbiAqIEZldGNoIHRoZSBDViBIVE1MIHByZXZpZXcgdmlhIHRoZSBzdGFnZWQgZ2VuZXJhdGlvbiBjb250cmFjdC5cbiAqXG4gKiBTdHJhdGVneSBkZXBlbmRzIG9uIHRoZSBjdXJyZW50IGdlbmVyYXRpb24gc3RhdGU6XG4gKlxuICogLSBwaGFzZSBpcyBub3QgY29uZmlybWVkL2ZpbmFsX2NvbXBsZXRlOlxuICogICBBbHdheXMgY2FsbHMgUE9TVCAvYXBpL2N2L2dlbmVyYXRlLXByZXZpZXcsIHdoaWNoIHN0b3JlcyBwcmV2aWV3X2h0bWwgaW5cbiAqICAgZ2VuZXJhdGlvbl9zdGF0ZSAocmVxdWlyZWQgZm9yIGNvbmZpcm0tbGF5b3V0KSBhbmQgY2FsbHMgbWFya1ByZXZpZXdHZW5lcmF0ZWQuXG4gKiAgIFRoaXMgYm9vdHN0cmFwcyB0aGUgc3RhZ2VkIHN0YXRlIGV2ZW4gYWZ0ZXIgbGVnYWN5IGdlbmVyYXRlX2N2IGFjdGlvbnMgdGhhdFxuICogICB3cml0ZSBmaWxlcyB0byBkaXNrIHdpdGhvdXQgcG9wdWxhdGluZyBnZW5lcmF0aW9uX3N0YXRlLnByZXZpZXdfaHRtbC5cbiAqICAgRmFsbHMgYmFjayB0byBHRVQgL2FwaS9sYXlvdXQtaHRtbCAocGFzc2l2ZSwgbm8gc3RhdGUgY2hhbmdlKSB3aGVuXG4gKiAgIGdlbmVyYXRlLXByZXZpZXcgaXMgdW5hdmFpbGFibGUgKGUuZy4gc2Vzc2lvbiBoYXMgbm8gam9iX2FuYWx5c2lzIHlldCkuXG4gKlxuICogLSBwaGFzZSBpcyBjb25maXJtZWQvZmluYWxfY29tcGxldGUgKHBhc3NpdmUgcmVzdG9yZSk6XG4gKiAgIFJlYWRzIEhUTUwgZnJvbSBkaXNrIHZpYSBHRVQgL2FwaS9sYXlvdXQtaHRtbCB3aXRob3V0IHRvdWNoaW5nIHNlc3Npb24gc3RhdGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIF9mZXRjaEFuZERpc3BsYXlMYXlvdXRQcmV2aWV3KCkge1xuICBjb25zdCBnZW5TdGF0ZSAgICA9IHN0YXRlTWFuYWdlcj8uZ2V0R2VuZXJhdGlvblN0YXRlPy4oKSB8fCB7fTtcbiAgY29uc3QgaXNDb25maXJtZWQgPSBnZW5TdGF0ZS5waGFzZSA9PT0gR0VORVJBVElPTl9QSEFTRVMuQ09ORklSTUVEXG4gICAgICAgICAgICAgICAgICAgfHwgZ2VuU3RhdGUucGhhc2UgPT09IEdFTkVSQVRJT05fUEhBU0VTLkZJTkFMX0NPTVBMRVRFO1xuXG4gIHNob3dQcmV2aWV3TG9hZGluZyh0cnVlLCBpc0NvbmZpcm1lZCA/ICdMb2FkaW5nIHNhdmVkIGxheW91dFx1MjAyNicgOiAnR2VuZXJhdGluZyBwcmV2aWV3XHUyMDI2Jyk7XG4gIHRyeSB7XG4gICAgLy8gRnJlc2gtcmVuZGVyIHBhdGg6IGFsd2F5cyBwb3B1bGF0ZSBnZW5lcmF0aW9uX3N0YXRlLnByZXZpZXdfaHRtbCBvbiB0aGUgYmFja2VuZFxuICAgIC8vIHNvIHRoYXQgY29uZmlybS1sYXlvdXQgc3VjY2VlZHMuIENvdmVycyBib3RoIHRoZSBub3JtYWwgc3RhZ2VkIHBhdGggYW5kIHRoZVxuICAgIC8vIGxlZ2FjeSBnZW5lcmF0ZV9jdiBwYXRoIHRoYXQgZG9lcyBub3QgY2FsbCBnZW5lcmF0ZS1wcmV2aWV3IGl0c2VsZi5cbiAgICBpZiAoIWlzQ29uZmlybWVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgYXBpQ2FsbCgnUE9TVCcsICcvYXBpL2N2L2dlbmVyYXRlLXByZXZpZXcnLCB7fSk7XG4gICAgICAgIGlmIChkYXRhLm9rICYmIGRhdGEuaHRtbCkge1xuICAgICAgICAgIGRpc3BsYXlMYXlvdXRQcmV2aWV3KGRhdGEuaHRtbCk7XG4gICAgICAgICAgc2V0UHJldmlld0h0bWwoZGF0YS5odG1sKTtcbiAgICAgICAgICBkaXNtaXNzZWRTdGFsZUNhbGxvdXRSZXZpc2lvbiA9IG51bGw7XG4gICAgICAgICAgc3RhdGVNYW5hZ2VyPy5tYXJrUHJldmlld0dlbmVyYXRlZD8uKF9idWlsZFByZXZpZXdQYXlsb2FkKGRhdGEpKTtcbiAgICAgICAgICByZW5kZXJQcmV2aWV3T3V0cHV0U3RhdHVzKGRhdGEucHJldmlld19vdXRwdXRzIHx8IG51bGwpO1xuICAgICAgICAgIHJlZnJlc2hMYXlvdXRSZXZpZXdTdGF0ZSgpO1xuICAgICAgICAgIChkYXRhLmNvbnRlbnRfd2FybmluZ3MgfHwgW10pLmZvckVhY2godyA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHNob3dUb2FzdCA9PT0gJ2Z1bmN0aW9uJykgc2hvd1RvYXN0KHcubWVzc2FnZSwgJ3dhcm5pbmcnLCA4MDAwKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKF9lKSB7XG4gICAgICAgIC8vIGZhbGwgdGhyb3VnaCB0byBsZWdhY3kgZGlzayByZWFkXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUGFzc2l2ZSByZXN0b3JlIHBhdGg6IGxvYWQgc3RvcmVkIEhUTUwgZnJvbSBkaXNrIHdpdGhvdXQgdG91Y2hpbmcgZ2VuZXJhdGlvbiBzdGF0ZS5cbiAgICAvLyBVc2VkIGZvciBjb25maXJtZWQvZmluYWxfY29tcGxldGUgbGF5b3V0cywgb3IgYXMgZmFsbGJhY2sgd2hlbiBnZW5lcmF0ZS1wcmV2aWV3XG4gICAgLy8gaXMgdW5hdmFpbGFibGUgKGUuZy4gc2Vzc2lvbiBoYXMgbm8gam9iX2FuYWx5c2lzIHlldCkuXG4gICAgdHJ5IHtcbiAgICAgIHNob3dQcmV2aWV3TG9hZGluZyh0cnVlLCAnTG9hZGluZyBzdG9yZWQgbGF5b3V0XHUyMDI2Jyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgYXBpQ2FsbCgnR0VUJywgJy9hcGkvbGF5b3V0LWh0bWwnKTtcbiAgICAgIGlmIChkYXRhLm9rICYmIGRhdGEuaHRtbCkge1xuICAgICAgICBkaXNwbGF5TGF5b3V0UHJldmlldyhkYXRhLmh0bWwpO1xuICAgICAgICBzZXRQcmV2aWV3SHRtbChkYXRhLmh0bWwpO1xuICAgICAgICByZWZyZXNoTGF5b3V0UmV2aWV3U3RhdGUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbG9nLndhcm4oJ0xheW91dCBwcmV2aWV3IG5vdCBhdmFpbGFibGU6JywgZGF0YS5lcnJvciB8fCAnbm8gSFRNTCByZXR1cm5lZCcpO1xuICAgIH0gY2F0Y2ggKF9lKSB7XG4gICAgICAvLyBubyBwcmV2aWV3IGF2YWlsYWJsZVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBzaG93UHJldmlld0xvYWRpbmcoZmFsc2UpO1xuICB9XG59XG5cbi8qKlxuICogRGlzcGxheSBIVE1MIHByZXZpZXcgaW4gaWZyYW1lLlxuICovXG5mdW5jdGlvbiBkaXNwbGF5TGF5b3V0UHJldmlldyhodG1sKSB7XG4gIGNvbnN0IHByZXZpZXcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGF5b3V0LXByZXZpZXcnKTtcbiAgaWYgKCFwcmV2aWV3KSByZXR1cm47XG5cbiAgc2hvd1ByZXZpZXdMb2FkaW5nKGZhbHNlKTtcbiAgcHJldmlldy5vbmxvYWQgPSAoKSA9PiBmaXRMYXlvdXRQcmV2aWV3VG9QYW5lKHByZXZpZXcpO1xuICBwcmV2aWV3LnNldEF0dHJpYnV0ZSgnc2FuZGJveCcsICdhbGxvdy1zYW1lLW9yaWdpbicpO1xuICBwcmV2aWV3LnNldEF0dHJpYnV0ZSgncmVmZXJyZXJwb2xpY3knLCAnbm8tcmVmZXJyZXInKTtcbiAgcHJldmlldy5zcmNkb2MgPSBodG1sO1xuXG4gIGNvbnN0IGRvYyA9IHByZXZpZXcuY29udGVudERvY3VtZW50IHx8IHByZXZpZXcuY29udGVudFdpbmRvdz8uZG9jdW1lbnQ7XG4gIGlmIChkb2M/LnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScpIHtcbiAgICBmaXRMYXlvdXRQcmV2aWV3VG9QYW5lKHByZXZpZXcpO1xuICB9XG59XG5cbi8qKlxuICogU2NhbGUgdGhlIHByZXZpZXcgc28gYW4gZW50aXJlIENWIHBhZ2Ugd2lkdGggZml0cyB3aXRoaW4gdGhlIHByZXZpZXcgcGFuZS5cbiAqL1xuZnVuY3Rpb24gZml0TGF5b3V0UHJldmlld1RvUGFuZShwcmV2aWV3KSB7XG4gIGNvbnN0IGRvYyA9IHByZXZpZXc/LmNvbnRlbnREb2N1bWVudCB8fCBwcmV2aWV3Py5jb250ZW50V2luZG93Py5kb2N1bWVudDtcbiAgY29uc3QgY29udGFpbmVyID0gcHJldmlldz8uY2xvc2VzdCgnLnByZXZpZXctaWZyYW1lLWNvbnRhaW5lcicpO1xuICBpZiAoIWRvYyB8fCAhY29udGFpbmVyKSByZXR1cm47XG5cbiAgY29uc3QgcGFnZUNvbnRhaW5lciA9IGRvYy5xdWVyeVNlbGVjdG9yKCcucGFnZS1jb250YWluZXInKSB8fCBkb2MuYm9keTtcbiAgaWYgKCFwYWdlQ29udGFpbmVyKSByZXR1cm47XG5cbiAgY29uc3QgY29udGFpbmVyV2lkdGggPSBNYXRoLm1heChjb250YWluZXIuY2xpZW50V2lkdGggLSAyNCwgMSk7XG4gIGNvbnN0IGNvbnRlbnRXaWR0aCA9IE1hdGgubWF4KFxuICAgIE1hdGguY2VpbChwYWdlQ29udGFpbmVyLnNjcm9sbFdpZHRoIHx8IDApLFxuICAgIE1hdGguY2VpbChwYWdlQ29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoIHx8IDApLFxuICAgIDFcbiAgKTtcbiAgY29uc3Qgc2NhbGUgPSBNYXRoLm1pbigxLCBjb250YWluZXJXaWR0aCAvIGNvbnRlbnRXaWR0aCk7XG5cbiAgZG9jLmRvY3VtZW50RWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kID0gJyNmOGZhZmMnO1xuICBkb2MuYm9keS5zdHlsZS5tYXJnaW4gPSAnMCc7XG4gIGRvYy5ib2R5LnN0eWxlLnBhZGRpbmcgPSAnMCc7XG4gIGRvYy5ib2R5LnN0eWxlLmJhY2tncm91bmQgPSAnI2Y4ZmFmYyc7XG4gIGRvYy5ib2R5LnN0eWxlLm92ZXJmbG93WCA9ICdhdXRvJztcblxuICBwYWdlQ29udGFpbmVyLnN0eWxlLnpvb20gPSBgJHtzY2FsZX1gO1xuICBwYWdlQ29udGFpbmVyLnN0eWxlLnRyYW5zZm9ybSA9ICcnO1xuICBwYWdlQ29udGFpbmVyLnN0eWxlLnRyYW5zZm9ybU9yaWdpbiA9ICcnO1xuICBwYWdlQ29udGFpbmVyLnN0eWxlLm1hcmdpbiA9ICcxMnB4JztcbiAgcHJldmlldy5zdHlsZS5taW5XaWR0aCA9ICcnO1xufVxuXG4vKipcbiAqIEFkZCBpbnN0cnVjdGlvbiB0byBoaXN0b3J5IHBhbmVsLlxuICovXG5mdW5jdGlvbiBhZGRUb0luc3RydWN0aW9uSGlzdG9yeShpbnN0cnVjdGlvbikge1xuICAvLyBJbml0aWFsaXplIGdsb2JhbCBpbnN0cnVjdGlvbiBsaXN0IGlmIG5lZWRlZFxuICBpZiAoIXdpbmRvdy5sYXlvdXRJbnN0cnVjdGlvbnMpIHtcbiAgICB3aW5kb3cubGF5b3V0SW5zdHJ1Y3Rpb25zID0gW107XG4gIH1cblxuICB3aW5kb3cubGF5b3V0SW5zdHJ1Y3Rpb25zLnB1c2gobm9ybWFsaXplTGF5b3V0SW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb24pKTtcbiAgcmVuZGVySW5zdHJ1Y3Rpb25IaXN0b3J5KCk7XG59XG5cbi8qKlxuICogUmVuZGVyIGluc3RydWN0aW9uIGhpc3RvcnkgZnJvbSBjdXJyZW50IHN0YXRlIHdpdGhvdXQgbXV0YXRpbmcgaXQuXG4gKi9cbmZ1bmN0aW9uIHJlbmRlckluc3RydWN0aW9uSGlzdG9yeSgpIHtcbiAgY29uc3QgaGlzdG9yeUxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5zdHJ1Y3Rpb24taGlzdG9yeScpO1xuICBpZiAoIWhpc3RvcnlMaXN0KSByZXR1cm47XG5cbiAgY29uc3QgaW5zdHJ1Y3Rpb25zID0gd2luZG93LmxheW91dEluc3RydWN0aW9ucyB8fCBbXTtcbiAgaGlzdG9yeUxpc3QuaW5uZXJIVE1MID0gJyc7XG4gIGNvbnN0IGxhc3RJZHggPSBpbnN0cnVjdGlvbnMubGVuZ3RoIC0gMTtcbiAgaW5zdHJ1Y3Rpb25zLmZvckVhY2goKGluc3RydWN0aW9uLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IGVudHJ5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZW50cnkuY2xhc3NOYW1lID0gJ2luc3RydWN0aW9uLWhpc3RvcnktZW50cnknO1xuICAgIGNvbnN0IGlzTGFzdCA9IGluZGV4ID09PSBsYXN0SWR4O1xuICAgIGNvbnN0IHVuZG9IdG1sID0gaXNMYXN0XG4gICAgICA/IGA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0bi1zbVwiIG9uY2xpY2s9XCJ1bmRvSW5zdHJ1Y3Rpb24oJHtpbmRleH0pXCI+XHUyMUE5IFVuZG88L2J1dHRvbj5gXG4gICAgICA6IGA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0bi1zbVwiIGRpc2FibGVkIHRpdGxlPVwiVW5kbyBpcyBzZXF1ZW50aWFsIFx1MjAxNCB1bmRvIHRoZSBtb3N0IHJlY2VudCBpbnN0cnVjdGlvbiBmaXJzdFwiXG4gICAgICAgICAgIHN0eWxlPVwib3BhY2l0eTowLjM7Y3Vyc29yOm5vdC1hbGxvd2VkO1wiPlx1MjFBOSBVbmRvPC9idXR0b24+YDtcbiAgICBlbnRyeS5pbm5lckhUTUwgPSBgXG4gICAgICA8ZGl2IGNsYXNzPVwiaW5zdHJ1Y3Rpb24tdGltZVwiPiR7aW5zdHJ1Y3Rpb24udGltZXN0YW1wIHx8ICcnfTwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImluc3RydWN0aW9uLXRleHRcIj4ke2VzY2FwZUh0bWwoaW5zdHJ1Y3Rpb24uaW5zdHJ1Y3Rpb25fdGV4dCB8fCAnJyl9PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiaW5zdHJ1Y3Rpb24tc3VtbWFyeVwiPjxlbT4ke2VzY2FwZUh0bWwoaW5zdHJ1Y3Rpb24uY2hhbmdlX3N1bW1hcnkgfHwgJycpfTwvZW0+PC9kaXY+XG4gICAgICAke3VuZG9IdG1sfVxuICAgIGA7XG4gICAgaGlzdG9yeUxpc3QuYXBwZW5kQ2hpbGQoZW50cnkpO1xuICB9KTtcblxuICAvLyBVcGRhdGUgY291bnRcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2luc3RydWN0aW9uLWNvdW50JykudGV4dENvbnRlbnQgPSAod2luZG93LmxheW91dEluc3RydWN0aW9ucyB8fCBbXSkubGVuZ3RoO1xufVxuXG4vKipcbiAqIFJlc3RvcmUgaW5zdHJ1Y3Rpb24gaGlzdG9yeSBmcm9tIHNlc3Npb24gc3RhdGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxvYWRMYXlvdXRJbnN0cnVjdGlvbkhpc3RvcnkoKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBhcGlDYWxsKCdHRVQnLCAnL2FwaS9sYXlvdXQtaGlzdG9yeScpO1xuICAgIGlmICghcmVzcG9uc2U/Lmluc3RydWN0aW9ucyB8fCAhQXJyYXkuaXNBcnJheShyZXNwb25zZS5pbnN0cnVjdGlvbnMpKSB7XG4gICAgICByZXR1cm4gd2luZG93LmxheW91dEluc3RydWN0aW9ucyB8fCBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzcG9uc2UuaW5zdHJ1Y3Rpb25zLm1hcCgoaW5zdHJ1Y3Rpb24pID0+IG5vcm1hbGl6ZUxheW91dEluc3RydWN0aW9uKGluc3RydWN0aW9uKSk7XG4gIH0gY2F0Y2ggKF9lcnJvcikge1xuICAgIHJldHVybiB3aW5kb3cubGF5b3V0SW5zdHJ1Y3Rpb25zIHx8IFtdO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc3RvcmVJbnN0cnVjdGlvbkhpc3RvcnkoKSB7XG4gIHdpbmRvdy5sYXlvdXRJbnN0cnVjdGlvbnMgPSBhd2FpdCBsb2FkTGF5b3V0SW5zdHJ1Y3Rpb25IaXN0b3J5KCk7XG4gIHJlbmRlckluc3RydWN0aW9uSGlzdG9yeSgpO1xuICByZWZyZXNoTGF5b3V0UmV2aWV3U3RhdGUoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaGFuZGxlUmVnZW5lcmF0ZVByZXZpZXdBY3Rpb24oKSB7XG4gIHRyeSB7XG4gICAgc2hvd1Byb2Nlc3NpbmcodHJ1ZSk7XG4gICAgYXdhaXQgX2ZldGNoQW5kRGlzcGxheUxheW91dFByZXZpZXcoKTtcbiAgICBzaG93Q29uZmlybWF0aW9uTWVzc2FnZSgnXHUyNzA1IFByZXZpZXcgcmVnZW5lcmF0ZWQgZnJvbSB0aGUgbGF0ZXN0IGNvbnRlbnQuJyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgYFx1Mjc0QyBDb3VsZCBub3QgcmVnZW5lcmF0ZSB0aGUgcHJldmlldy4gQ2hlY2sgdGhhdCB5b3VyIHNlc3Npb24gaXMgYWN0aXZlIGFuZCB0cnkgYWdhaW4uIElmIHRoZSBwcm9ibGVtIHBlcnNpc3RzLCByZWxvYWQgdGhlIHBhZ2UuYCk7XG4gICAgc2hvd1ByZXZpZXdMb2FkaW5nKGZhbHNlKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBzaG93UHJvY2Vzc2luZyhmYWxzZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBTaG93IHByb2Nlc3Npbmcgc3Bpbm5lciAocmlnaHQtcGFuZSBpbmRpY2F0b3IgZm9yIGxheW91dC1pbnN0cnVjdGlvbiBhcHBseSkuXG4gKi9cbmZ1bmN0aW9uIHNob3dQcm9jZXNzaW5nKHNob3cpIHtcbiAgY29uc3QgaW5kaWNhdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Byb2Nlc3NpbmctaW5kaWNhdG9yJyk7XG4gIGlmIChpbmRpY2F0b3IpIHtcbiAgICBpbmRpY2F0b3Iuc3R5bGUuZGlzcGxheSA9IHNob3cgPyAnYmxvY2snIDogJ25vbmUnO1xuICB9XG59XG5cbi8qKlxuICogU2hvdyBvciBoaWRlIHRoZSBwcmV2aWV3LWFyZWEgbG9hZGluZyBvdmVybGF5LlxuICogQHBhcmFtIHtib29sZWFufSBzaG93XG4gKiBAcGFyYW0ge3N0cmluZ30gW2xvZ1RleHRdIE9wdGlvbmFsIHN0YXR1cyBsaW5lIHNob3duIGJlbG93IHRoZSBzcGlubmVyLlxuICovXG5mdW5jdGlvbiBzaG93UHJldmlld0xvYWRpbmcoc2hvdywgbG9nVGV4dCA9ICcnKSB7XG4gIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJldmlldy1sb2FkaW5nLW92ZXJsYXknKTtcbiAgaWYgKCFvdmVybGF5KSByZXR1cm47XG4gIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9IHNob3cgPyAnZmxleCcgOiAnbm9uZSc7XG4gIGNvbnN0IGxvZ0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ByZXZpZXctbG9hZGluZy1sb2cnKTtcbiAgaWYgKGxvZ0VsKSBsb2dFbC50ZXh0Q29udGVudCA9IGxvZ1RleHQ7XG59XG5cbi8qKlxuICogU2hvdyBjb25maXJtYXRpb24gbWVzc2FnZS5cbiAqL1xuZnVuY3Rpb24gc2hvd0NvbmZpcm1hdGlvbk1lc3NhZ2UobWVzc2FnZSkge1xuICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbmZpcm1hdGlvbi1tZXNzYWdlJyk7XG4gIGlmICghZWxlbWVudCkgcmV0dXJuO1xuXG4gIGVsZW1lbnQudGV4dENvbnRlbnQgPSBtZXNzYWdlO1xuICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuXG4gIC8vIEF1dG8taGlkZSBhZnRlciAzIHNlY29uZHNcbiAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICB9LCAzMDAwKTtcbn1cblxuLyoqXG4gKiBTaG93IGlubGluZSBjbGFyaWZpY2F0aW9uIHBhbmVsIHdoZW4gTExNIG5lZWRzIG1vcmUgaW5mby5cbiAqIFJlcGxhY2VzIHdpbmRvdy5wcm9tcHQoKSB3aXRoIGFuIGFjY2Vzc2libGUgaW5saW5lIGZvcm0uXG4gKi9cbmZ1bmN0aW9uIHNob3dDbGFyaWZpY2F0aW9uRGlhbG9nKHF1ZXN0aW9uLCBvcmlnaW5hbEluc3RydWN0aW9uKSB7XG4gIGNvbnN0IGlucHV0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5zdHJ1Y3Rpb24taW5wdXQnKTtcbiAgY29uc3QgY29udGFpbmVyID0gaW5wdXRFbCA/IGlucHV0RWwuY2xvc2VzdCgnZGl2JykgfHwgaW5wdXRFbC5wYXJlbnROb2RlIDogbnVsbDtcbiAgaWYgKCFjb250YWluZXIpIHJldHVybjtcblxuICBjb25zdCBleGlzdGluZ1BhbmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xheW91dC1jbGFyaWZpY2F0aW9uLXBhbmVsJyk7XG4gIGlmIChleGlzdGluZ1BhbmVsKSBleGlzdGluZ1BhbmVsLnJlbW92ZSgpO1xuXG4gIGNvbnN0IHBhbmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHBhbmVsLmlkID0gJ2xheW91dC1jbGFyaWZpY2F0aW9uLXBhbmVsJztcbiAgcGFuZWwuc2V0QXR0cmlidXRlKCdyb2xlJywgJ2FsZXJ0Jyk7XG4gIHBhbmVsLnN0eWxlLmNzc1RleHQgPSAnYmFja2dyb3VuZDojZmVmOWMzO2JvcmRlcjoxcHggc29saWQgI2ZkZTA0Nztib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjE0cHg7bWFyZ2luLXRvcDoxMHB4Oyc7XG4gIHBhbmVsLmlubmVySFRNTCA9IGBcbiAgICA8cCBzdHlsZT1cIm1hcmdpbjowIDAgOHB4O2ZvbnQtc2l6ZTowLjllbTtjb2xvcjojOTI0MDBlO2ZvbnQtd2VpZ2h0OjYwMDtcIj5cbiAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlx1Mjc1Mzwvc3Bhbj4gQ2xhcmlmaWNhdGlvbiBuZWVkZWRcbiAgICA8L3A+XG4gICAgPHAgc3R5bGU9XCJtYXJnaW46MCAwIDEwcHg7Zm9udC1zaXplOjAuODhlbTtjb2xvcjojNzgzNTBmO1wiPiR7ZXNjYXBlSHRtbChxdWVzdGlvbil9PC9wPlxuICAgIDxsYWJlbCBmb3I9XCJsYXlvdXQtY2xhcmlmaWNhdGlvbi1pbnB1dFwiIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtmb250LXdlaWdodDo2MDA7Y29sb3I6IzM3NDE1MTtkaXNwbGF5OmJsb2NrO21hcmdpbi1ib3R0b206NHB4O1wiPlxuICAgICAgWW91ciBjbGFyaWZpY2F0aW9uOlxuICAgIDwvbGFiZWw+XG4gICAgPHRleHRhcmVhIGlkPVwibGF5b3V0LWNsYXJpZmljYXRpb24taW5wdXRcIiByb3dzPVwiMlwiXG4gICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Ym94LXNpemluZzpib3JkZXItYm94O3BhZGRpbmc6OHB4O2JvcmRlcjoxcHggc29saWQgI2ZkZTA0Nztib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6MC44OGVtO3Jlc2l6ZTp2ZXJ0aWNhbDtcIlxuICAgICAgYXJpYS1sYWJlbD1cIkNsYXJpZmljYXRpb24gZm9yIGxheW91dCBpbnN0cnVjdGlvblwiPiR7ZXNjYXBlSHRtbChvcmlnaW5hbEluc3RydWN0aW9uKX08L3RleHRhcmVhPlxuICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjhweDttYXJnaW4tdG9wOjhweDtcIj5cbiAgICAgIDxidXR0b24gaWQ9XCJsYXlvdXQtY2xhcmlmaWNhdGlvbi1zdWJtaXRcIlxuICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6I2Q5NzcwNjtjb2xvcjojZmZmO2JvcmRlcjpub25lO2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6NnB4IDE0cHg7Zm9udC1zaXplOjAuODVlbTtjdXJzb3I6cG9pbnRlcjtmb250LXdlaWdodDo2MDA7XCI+XG4gICAgICAgIFN1Ym1pdCBjbGFyaWZpY2F0aW9uXG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gaWQ9XCJsYXlvdXQtY2xhcmlmaWNhdGlvbi1jYW5jZWxcIlxuICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6bm9uZTtib3JkZXI6MXB4IHNvbGlkICNkOTc3MDY7Y29sb3I6IzkyNDAwZTtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjZweCAxNHB4O2ZvbnQtc2l6ZTowLjg1ZW07Y3Vyc29yOnBvaW50ZXI7XCI+XG4gICAgICAgIENhbmNlbFxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+YDtcblxuICBjb250YWluZXIuYXBwZW5kQ2hpbGQocGFuZWwpO1xuXG4gIGNvbnN0IGNsYXJJbnB1dCAgPSBwYW5lbC5xdWVyeVNlbGVjdG9yKCcjbGF5b3V0LWNsYXJpZmljYXRpb24taW5wdXQnKTtcbiAgY29uc3Qgc3VibWl0QnRuICA9IHBhbmVsLnF1ZXJ5U2VsZWN0b3IoJyNsYXlvdXQtY2xhcmlmaWNhdGlvbi1zdWJtaXQnKTtcbiAgY29uc3QgY2FuY2VsQnRuICA9IHBhbmVsLnF1ZXJ5U2VsZWN0b3IoJyNsYXlvdXQtY2xhcmlmaWNhdGlvbi1jYW5jZWwnKTtcblxuICBjbGFySW5wdXQuZm9jdXMoKTtcbiAgY2xhcklucHV0LnNldFNlbGVjdGlvblJhbmdlKGNsYXJJbnB1dC52YWx1ZS5sZW5ndGgsIGNsYXJJbnB1dC52YWx1ZS5sZW5ndGgpO1xuXG4gIHN1Ym1pdEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBjb25zdCBjbGFyaWZpZWQgPSBjbGFySW5wdXQudmFsdWUudHJpbSgpO1xuICAgIHBhbmVsLnJlbW92ZSgpO1xuICAgIGlmIChjbGFyaWZpZWQgJiYgY2xhcmlmaWVkICE9PSBvcmlnaW5hbEluc3RydWN0aW9uKSB7XG4gICAgICBzdWJtaXRMYXlvdXRJbnN0cnVjdGlvbihjbGFyaWZpZWQpO1xuICAgIH1cbiAgfSk7XG4gIGNhbmNlbEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHBhbmVsLnJlbW92ZSgpKTtcbiAgY2xhcklucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBlID0+IHtcbiAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicgJiYgIWUuc2hpZnRLZXkpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyBzdWJtaXRCdG4uY2xpY2soKTsgfVxuICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIGNhbmNlbEJ0bi5jbGljaygpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBVbmRvIHRoZSBsYXN0IGxheW91dCBpbnN0cnVjdGlvbiBieSByZXN0b3JpbmcgdGhlIHByZXZpb3VzIHNuYXBzaG90LlxuICogVGhlIGluZGV4IHBhcmFtZXRlciBpcyBhY2NlcHRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBidXQgaXMgaWdub3JlZCBcdTIwMTRcbiAqIHRoZSB1bmRvIHN0YWNrIGFsd2F5cyByZXN0b3JlcyB0aGUgbW9zdCByZWNlbnQgcHJlLWluc3RydWN0aW9uIHN0YXRlLlxuICovXG5mdW5jdGlvbiB1bmRvSW5zdHJ1Y3Rpb24oX2luZGV4KSB7XG4gIGlmIChfbGF5b3V0VW5kb1N0YWNrLmxlbmd0aCA9PT0gMCkge1xuICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsICdcdTIxMzlcdUZFMEYgTm90aGluZyB0byB1bmRvLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHNuYXBzaG90ID0gX2xheW91dFVuZG9TdGFjay5wb3AoKTtcbiAgd2luZG93LmxheW91dEluc3RydWN0aW9ucyA9IHNuYXBzaG90Lmluc3RydWN0aW9ucztcblxuICBkaXNwbGF5TGF5b3V0UHJldmlldyhzbmFwc2hvdC5odG1sKTtcbiAgc2V0UHJldmlld0h0bWwoc25hcHNob3QuaHRtbCk7XG4gIHJlbmRlckluc3RydWN0aW9uSGlzdG9yeSgpO1xuICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnXHUyMUE5XHVGRTBGIExhc3QgbGF5b3V0IGluc3RydWN0aW9uIHVuZG9uZS4nKTtcbn1cblxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsICgpID0+IHtcbiAgY29uc3QgcHJldmlldyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYXlvdXQtcHJldmlldycpO1xuICBpZiAocHJldmlldykge1xuICAgIGZpdExheW91dFByZXZpZXdUb1BhbmUocHJldmlldyk7XG4gIH1cbn0pO1xuXG5hc3luYyBmdW5jdGlvbiBjb25maXJtTGF5b3V0UmV2aWV3KCkge1xuICB0cnkge1xuICAgIHNob3dQcm9jZXNzaW5nKHRydWUpO1xuXG4gICAgY29uc3QgZnJlc2huZXNzID0gc3RhdGVNYW5hZ2VyLmdldExheW91dEZyZXNobmVzcygpO1xuICAgIGlmIChmcmVzaG5lc3MuaXNTdGFsZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQcmV2aWV3IGlzIG91dGRhdGVkLiBSZWdlbmVyYXRlIHRoZSBwcmV2aWV3IGJlZm9yZSBjb25maXJtaW5nIGxheW91dC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb25maXJtUmVzID0gYXdhaXQgYXBpQ2FsbCgnUE9TVCcsICcvYXBpL2N2L2NvbmZpcm0tbGF5b3V0JywgeyBjb250ZW50X3JldmlzaW9uOiBnZXRDdXJyZW50Q29udGVudFJldmlzaW9uKCkgfSk7XG4gICAgaWYgKCFjb25maXJtUmVzPy5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGNvbmZpcm1SZXM/LmVycm9yIHx8ICdGYWlsZWQgdG8gY29uZmlybSBsYXlvdXQuJyk7XG4gICAgfVxuXG4gICAgc3RhdGVNYW5hZ2VyLm1hcmtMYXlvdXRDb25maXJtZWQoe1xuICAgICAgY29uZmlybWVkQXQ6IGNvbmZpcm1SZXMuY29uZmlybWVkX2F0IHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICB9KTtcbiAgICBzaG93Q29uZmlybWF0aW9uTWVzc2FnZSgnXHUyNzA1IExheW91dCBjb25maXJtZWQuIEdlbmVyYXRlIGZpbmFsIGZpbGVzIHdoZW4geW91IGFyZSByZWFkeS4nKTtcbiAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCAnXHUyNzA1IExheW91dCBjb25maXJtZWQuIFJldmlldyB0aGUgcHJldmlldyBpZiBuZWVkZWQsIHRoZW4gZ2VuZXJhdGUgdGhlIGZpbmFsIGZpbGVzLicpO1xuICAgIHJlZnJlc2hMYXlvdXRSZXZpZXdTdGF0ZSgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsIGBcdTI3NEMgQ291bGQgbm90IGNvbmZpcm0gdGhlIGxheW91dC4gVHJ5IGNsaWNraW5nIENvbmZpcm0gYWdhaW4uIElmIHRoZSBwcm9ibGVtIHBlcnNpc3RzLCByZWxvYWQgdGhlIHBhZ2UuYCk7XG4gIH0gZmluYWxseSB7XG4gICAgc2hvd1Byb2Nlc3NpbmcoZmFsc2UpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRmluYWxPdXRwdXRzKCkge1xuICAvKiBkdWNrZmxvdzpcbiAgICogICBpZDogbGF5b3V0X3VpX2dlbmVyYXRlX2ZpbmFsX2xpdmVcbiAgICogICBraW5kOiB1aVxuICAgKiAgIHRpbWVzdGFtcDogJzIwMjYtMDMtMjZUMDA6MjQ6MDBaJ1xuICAgKiAgIHN0YXR1czogbGl2ZVxuICAgKiAgIGhhbmRsZXM6XG4gICAqICAgLSB1aTpsYXlvdXQuZ2VuZXJhdGUtZmluYWxcbiAgICogICBjYWxsczpcbiAgICogICAtIFBPU1QgL2FwaS9jdi9nZW5lcmF0ZS1maW5hbFxuICAgKiAgIC0gUE9TVCAvYXBpL2xheW91dC1jb21wbGV0ZVxuICAgKiAgIHJlYWRzOlxuICAgKiAgIC0gc3RhdGU6Z2VuZXJhdGlvbl9zdGF0ZS5sYXlvdXRDb25maXJtZWRcbiAgICogICAtIHN0YXRlOmdlbmVyYXRpb25fc3RhdGUucGhhc2VcbiAgICogICAtIHN0YXRlOmxheW91dF9mcmVzaG5lc3NcbiAgICogICB3cml0ZXM6XG4gICAqICAgLSB0YWI6Y3ZBcnRpZmFjdHNcbiAgICogICAtIHN0YXRlOmdlbmVyYXRpb25fc3RhdGUuZmluYWxfZ2VuZXJhdGVkX2F0XG4gICAqICAgLSB1aTp3b3JrZmxvdy5yZWZpbmVtZW50XG4gICAqICAgbm90ZXM6IEdlbmVyYXRlcyB0aGUgZmluYWwgaHVtYW4tcmVhZGFibGUgb3V0cHV0cyBmcm9tIHRoZSBjb25maXJtZWQgcHJldmlldyBhbmQgYWR2YW5jZXMgdGhlIFVJIGludG8gZmlsZSByZXZpZXcvZmluYWxpc2Ugd2l0aCB0aGUgbmV3IGFydGlmYWN0IHNldC5cbiAgICovXG4gIHRyeSB7XG4gICAgc2hvd1Byb2Nlc3NpbmcodHJ1ZSk7XG5cbiAgICBjb25zdCBmcmVzaG5lc3MgPSBzdGF0ZU1hbmFnZXIuZ2V0TGF5b3V0RnJlc2huZXNzKCk7XG4gICAgY29uc3QgZ2VuZXJhdGlvblN0YXRlID0gc3RhdGVNYW5hZ2VyLmdldEdlbmVyYXRpb25TdGF0ZSgpO1xuICAgIGlmIChmcmVzaG5lc3MuaXNTdGFsZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQcmV2aWV3IGlzIG91dGRhdGVkLiBSZWdlbmVyYXRlIHRoZSBwcmV2aWV3IGJlZm9yZSBnZW5lcmF0aW5nIGZpbmFsIGZpbGVzLicpO1xuICAgIH1cbiAgICBpZiAoIWdlbmVyYXRpb25TdGF0ZS5sYXlvdXRDb25maXJtZWQgJiYgZ2VuZXJhdGlvblN0YXRlLnBoYXNlICE9PSAnY29uZmlybWVkJykge1xuICAgICAgY29uc3QgaGFzSW5zdHJ1Y3Rpb25zID0gKHdpbmRvdy5sYXlvdXRJbnN0cnVjdGlvbnMgfHwgW10pLmxlbmd0aCA+IDA7XG4gICAgICBpZiAoaGFzSW5zdHJ1Y3Rpb25zKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ29uZmlybSBsYXlvdXQgYmVmb3JlIGdlbmVyYXRpbmcgZmluYWwgZmlsZXMuJyk7XG4gICAgICB9XG4gICAgICAvLyBObyBpbnN0cnVjdGlvbnMgYWRkZWQgXHUyMDE0IGF1dG8tY29uZmlybSBzbyB1c2VycyBhcmVuJ3QgYmxvY2tlZCBieSBhIHJlZHVuZGFudCBjbGljay5cbiAgICAgIGNvbnN0IGNvbmZpcm1SZXMgPSBhd2FpdCBhcGlDYWxsKCdQT1NUJywgJy9hcGkvY3YvY29uZmlybS1sYXlvdXQnLCB7IGNvbnRlbnRfcmV2aXNpb246IGdldEN1cnJlbnRDb250ZW50UmV2aXNpb24oKSB9KTtcbiAgICAgIGlmICghY29uZmlybVJlcz8ub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGNvbmZpcm1SZXM/LmVycm9yIHx8ICdGYWlsZWQgdG8gYXV0by1jb25maXJtIGxheW91dC4nKTtcbiAgICAgIH1cbiAgICAgIHN0YXRlTWFuYWdlci5tYXJrTGF5b3V0Q29uZmlybWVkKHsgY29uZmlybWVkQXQ6IGNvbmZpcm1SZXMuY29uZmlybWVkX2F0IHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBmaW5hbFJlcyA9IGF3YWl0IGFwaUNhbGwoJ1BPU1QnLCAnL2FwaS9jdi9nZW5lcmF0ZS1maW5hbCcsIHt9KTtcbiAgICBpZiAoIWZpbmFsUmVzPy5vayB8fCAhZmluYWxSZXMub3V0cHV0cykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGZpbmFsUmVzPy5lcnJvciB8fCAnRmFpbGVkIHRvIGdlbmVyYXRlIGZpbmFsIENWIG91dHB1dC4nKTtcbiAgICB9XG5cbiAgICB1cGRhdGVDdkFydGlmYWN0cyhmaW5hbFJlcy5vdXRwdXRzKTtcbiAgICBzdGF0ZU1hbmFnZXIubWFya0ZpbmFsR2VuZXJhdGVkKGZpbmFsUmVzLmdlbmVyYXRlZF9hdCB8fCBudWxsLCB7XG4gICAgICBwYWdlQ291bnRFc3RpbWF0ZTogZmluYWxSZXMucGFnZV9jb3VudF9lc3RpbWF0ZSA/PyBudWxsLFxuICAgICAgcGFnZUNvdW50RXhhY3Q6IGZpbmFsUmVzLnBhZ2VfY291bnRfZXhhY3QgPz8gbnVsbCxcbiAgICB9KTtcblxuICAgIHNjaGVkdWxlQXRzUmVmcmVzaCgncG9zdF9nZW5lcmF0aW9uJyk7XG5cbiAgICBzdGF0ZU1hbmFnZXIuc2V0UGhhc2UoJ2ZpbmFsX2dlbmVyYXRpb24nKTtcbiAgICBzd2l0Y2hUYWIoJ2ZpbmFsX2dlbmVyYXRlJyk7XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ1x1MjcwNSBGaW5hbCBmaWxlcyBnZW5lcmF0ZWQgZnJvbSB0aGUgY29uZmlybWVkIGxheW91dC4nKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCBgXHUyNzRDIENvdWxkIG5vdCBnZW5lcmF0ZSBmaW5hbCBmaWxlczogJHtlcnJvci5tZXNzYWdlfSBUcnkgY2xpY2tpbmcgR2VuZXJhdGUgYWdhaW4uIElmIGxheW91dCBjb25maXJtYXRpb24gaXMgbmVlZGVkIGZpcnN0LCBjbGljayBDb25maXJtIExheW91dCwgdGhlbiB0cnkgYWdhaW4uYCk7XG4gIH0gZmluYWxseSB7XG4gICAgc2hvd1Byb2Nlc3NpbmcoZmFsc2UpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZUxheW91dFByaW1hcnlBY3Rpb24oKSB7XG4gIGNvbnN0IGZyZXNobmVzcyA9IHN0YXRlTWFuYWdlci5nZXRMYXlvdXRGcmVzaG5lc3MoKTtcbiAgY29uc3QgZ2VuZXJhdGlvblN0YXRlID0gc3RhdGVNYW5hZ2VyLmdldEdlbmVyYXRpb25TdGF0ZSgpO1xuICBpZiAoZnJlc2huZXNzLmlzU3RhbGUpIHJldHVybiBoYW5kbGVSZWdlbmVyYXRlUHJldmlld0FjdGlvbigpO1xuICBpZiAoZ2VuZXJhdGlvblN0YXRlLmxheW91dENvbmZpcm1lZCB8fCBnZW5lcmF0aW9uU3RhdGUucGhhc2UgPT09ICdjb25maXJtZWQnKSB7XG4gICAgcmV0dXJuIGdlbmVyYXRlRmluYWxPdXRwdXRzKCk7XG4gIH1cbiAgcmV0dXJuIGNvbmZpcm1MYXlvdXRSZXZpZXcoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29tcGxldGVMYXlvdXRSZXZpZXcoKSB7XG4gIHJldHVybiBoYW5kbGVMYXlvdXRQcmltYXJ5QWN0aW9uKCk7XG59XG5cbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihHRU5FUkFUSU9OX1NUQVRFX0VWRU5ULCByZWZyZXNoTGF5b3V0UmV2aWV3U3RhdGUpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgQ29udGVudCBwcm9wb3NhbCBmdW5jdGlvbnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8qKlxuICogU3VibWl0IGEgbmF0dXJhbC1sYW5ndWFnZSBjb250ZW50IGVkaXQgcmVxdWVzdCB0byB0aGUgYmFja2VuZCBhbmQgcmVuZGVyIHByb3Bvc2Fscy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3VibWl0Q29udGVudFByb3Bvc2FsKCkge1xuICBjb25zdCBpbnB1dCAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2luc3RydWN0aW9uLWlucHV0Jyk7XG4gIGNvbnN0IHByb2Nlc3NpbmcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGVudC1wcm9wb3NhbC1wcm9jZXNzaW5nJyk7XG4gIGNvbnN0IHBhbmVsICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGVudC1wcm9wb3NhbHMtcGFuZWwnKTtcblxuICBjb25zdCBpbnN0cnVjdGlvbiA9IGlucHV0Py52YWx1ZS50cmltKCk7XG4gIGlmICghaW5zdHJ1Y3Rpb24pIHtcbiAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnXHUyNkEwXHVGRTBGIFBsZWFzZSBkZXNjcmliZSB0aGUgY29udGVudCBjaGFuZ2UgeW91IHdhbnQgYmVmb3JlIHN1Ym1pdHRpbmcuJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHByb2Nlc3NpbmcpIHByb2Nlc3Npbmcuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgaWYgKHBhbmVsKSAgICAgICBwYW5lbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpQ2FsbCgnUE9TVCcsICcvYXBpL2N2L3Byb3Bvc2UtY29udGVudC1jaGFuZ2UnLCB7IGluc3RydWN0aW9uIH0pO1xuICAgIGlmICghcmVzPy5vaykge1xuICAgICAgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgYFx1Mjc0QyBDb3VsZCBub3QgZ2VuZXJhdGUgY29udGVudCBwcm9wb3NhbHMuIFRyeSByZXBocmFzaW5nIHlvdXIgaW5zdHJ1Y3Rpb24gb3IgY2hlY2sgdGhlIHNlc3Npb24gaXMgc3RpbGwgYWN0aXZlLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwcm9wb3NhbHMgPSByZXMucHJvcG9zYWxzIHx8IFtdO1xuICAgIGlmIChwcm9wb3NhbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnXHUyNkEwXHVGRTBGIE5vIHByb3Bvc2FscyB3ZXJlIGdlbmVyYXRlZC4gVHJ5IHJlcGhyYXNpbmcgeW91ciBpbnN0cnVjdGlvbi4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmVuZGVyQ29udGVudFByb3Bvc2Fscyhwcm9wb3NhbHMpO1xuICAgIGlmIChwYW5lbCkgcGFuZWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsIGBcdTI3NEMgQ291bGQgbm90IHN1Ym1pdCB0aGUgY29udGVudCBwcm9wb3NhbC4gQ2hlY2sgeW91ciBjb25uZWN0aW9uIGFuZCB0cnkgYWdhaW4uYCk7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKHByb2Nlc3NpbmcpIHByb2Nlc3Npbmcuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgfVxufVxuXG4vKipcbiAqIFJlbmRlciBhIGxpc3Qgb2YgY29udGVudCBwcm9wb3NhbHMgYXMgcmV2aWV3YWJsZSBjYXJkcyBpbnNpZGUgI2NvbnRlbnQtcHJvcG9zYWxzLXBhbmVsLlxuICogQHBhcmFtIHtBcnJheTx7aWQsIHR5cGUsIGxvY2F0aW9uLCBvcmlnaW5hbCwgcHJvcG9zZWQsIHJlYXNvbn0+fSBwcm9wb3NhbHNcbiAqL1xuZnVuY3Rpb24gcmVuZGVyQ29udGVudFByb3Bvc2Fscyhwcm9wb3NhbHMpIHtcbiAgY29uc3QgcGFuZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGVudC1wcm9wb3NhbHMtcGFuZWwnKTtcbiAgaWYgKCFwYW5lbCkgcmV0dXJuO1xuXG4gIGNvbnN0IGFwcGx5QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FwcGx5LWNvbnRlbnQtY2hhbmdlcy1idG4nKTtcblxuICBwYW5lbC5pbm5lckhUTUwgPSBgXG4gICAgPHAgY2xhc3M9XCJjb250ZW50LXByb3Bvc2Fscy1oZWFkaW5nXCI+JHtwcm9wb3NhbHMubGVuZ3RofSBwcm9wb3NhbCR7cHJvcG9zYWxzLmxlbmd0aCAhPT0gMSA/ICdzJyA6ICcnfSBcdTIwMTQgYXBwcm92ZSB0aGUgY2hhbmdlcyB5b3Ugd2FudCB0byBhcHBseTo8L3A+XG4gICAgJHtwcm9wb3NhbHMubWFwKChwLCBpKSA9PiBgXG4gICAgICA8ZGl2IGNsYXNzPVwiY29udGVudC1wcm9wb3NhbC1jYXJkXCIgZGF0YS1wcm9wb3NhbC1pZD1cIiR7ZXNjYXBlSHRtbChwLmlkKX1cIiBkYXRhLXByb3Bvc2FsLWluZGV4PVwiJHtpfVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHJvcG9zYWwtbWV0YVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwicHJvcG9zYWwtdHlwZS1iYWRnZVwiPiR7cC50eXBlID09PSAnc3VtbWFyeScgPyAnU3VtbWFyeScgOiAnQnVsbGV0J308L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJwcm9wb3NhbC1sb2NhdGlvblwiPiR7ZXNjYXBlSHRtbChwLmxvY2F0aW9uKX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHJvcG9zYWwtZGlmZlwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9wb3NhbC1vcmlnaW5hbFwiPjxzdHJvbmc+QmVmb3JlOjwvc3Ryb25nPiAke2VzY2FwZUh0bWwocC5vcmlnaW5hbCl9PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInByb3Bvc2FsLXByb3Bvc2VkXCI+PHN0cm9uZz5BZnRlcjo8L3N0cm9uZz4gJHtlc2NhcGVIdG1sKHAucHJvcG9zZWQpfTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgJHtwLnJlYXNvbiA/IGA8ZGl2IGNsYXNzPVwicHJvcG9zYWwtcmVhc29uXCI+PGVtPiR7ZXNjYXBlSHRtbChwLnJlYXNvbil9PC9lbT48L2Rpdj5gIDogJyd9XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwcm9wb3NhbC1hY3Rpb25zXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwicHJvcG9zYWwtYXBwcm92ZS1sYWJlbFwiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwicHJvcG9zYWwtYXBwcm92ZS1jaGVja2JveFwiIGNoZWNrZWQ+XG4gICAgICAgICAgICBBcHByb3ZlIHRoaXMgY2hhbmdlXG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5gKS5qb2luKCcnKX1cbiAgYDtcblxuICAvLyBTdG9yZSBwcm9wb3NhbHMgZm9yIGxhdGVyIHJldHJpZXZhbFxuICBwYW5lbC5kYXRhc2V0LnByb3Bvc2FscyA9IEpTT04uc3RyaW5naWZ5KHByb3Bvc2Fscyk7XG5cbiAgaWYgKGFwcGx5QnRuKSBhcHBseUJ0bi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbn1cblxuLyoqXG4gKiBDb2xsZWN0IGFwcHJvdmVkIHByb3Bvc2FscyBhbmQgUE9TVCB0aGVtIHRvIC9hcGkvY3YvYXBwbHktY29udGVudC1jaGFuZ2VzLlxuICogVXBkYXRlcyBkaXJ0eS1waGFzZSBzdGF0ZSBhbmQgc2hvd3MgdGhlIHJldHVybiBjYWxsb3V0LlxuICovXG5hc3luYyBmdW5jdGlvbiBhcHBseUFjY2VwdGVkUHJvcG9zYWxzKCkge1xuICBjb25zdCBwYW5lbCAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb250ZW50LXByb3Bvc2Fscy1wYW5lbCcpO1xuICBjb25zdCBhcHBseUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHBseS1jb250ZW50LWNoYW5nZXMtYnRuJyk7XG5cbiAgY29uc3QgYWxsUHJvcG9zYWxzID0gSlNPTi5wYXJzZShwYW5lbD8uZGF0YXNldC5wcm9wb3NhbHMgfHwgJ1tdJyk7XG4gIGNvbnN0IGNoZWNrYm94ZXMgICA9IHBhbmVsPy5xdWVyeVNlbGVjdG9yQWxsKCcucHJvcG9zYWwtYXBwcm92ZS1jaGVja2JveCcpIHx8IFtdO1xuXG4gIGNvbnN0IGFjY2VwdGVkID0gYWxsUHJvcG9zYWxzLmZpbHRlcigoXywgaSkgPT4gY2hlY2tib3hlc1tpXT8uY2hlY2tlZCk7XG4gIGlmIChhY2NlcHRlZC5sZW5ndGggPT09IDApIHtcbiAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnXHUyNkEwXHVGRTBGIE5vIHByb3Bvc2FscyBhcHByb3ZlZC4gVGljayBhdCBsZWFzdCBvbmUgY2hhbmdlIHRvIGFwcGx5LicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChhcHBseUJ0bikgYXBwbHlCdG4uZGlzYWJsZWQgPSB0cnVlO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpQ2FsbCgnUE9TVCcsICcvYXBpL2N2L2FwcGx5LWNvbnRlbnQtY2hhbmdlcycsIHsgYWNjZXB0ZWQgfSk7XG4gICAgaWYgKCFyZXM/Lm9rKSB7XG4gICAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCBgXHUyNzRDIEZhaWxlZCB0byBhcHBseSBjb250ZW50IGNoYW5nZXM6ICR7cmVzPy5lcnJvciB8fCAnVW5rbm93biBlcnJvcid9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3RhdGVNYW5hZ2VyLnNldERpcnR5UGhhc2VzKFxuICAgICAgcmVzLmRpcnR5X3BoYXNlcyB8fCBbJ2dlbmVyYXRlJywgJ2xheW91dCddLFxuICAgICAgcmVzLmVhcmxpZXN0X2RpcnR5X3N0ZXAgfHwgJ2dlbmVyYXRlJyxcbiAgICApO1xuXG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgYFx1MjcwNSAke3Jlcy5hcHBsaWVkX2NvdW50fSBjb250ZW50IGNoYW5nZSR7cmVzLmFwcGxpZWRfY291bnQgIT09IDEgPyAncycgOiAnJ30gc3RhZ2VkLiBSZXR1cm4gdG8gR2VuZXJhdGUgQ1YgdG8gYXBwbHkgdGhlbS5gKTtcblxuICAgIC8vIENsZWFyIHRoZSBwcm9wb3NhbCBwYW5lbFxuICAgIGlmIChwYW5lbCkgeyBwYW5lbC5pbm5lckhUTUwgPSAnJzsgcGFuZWwuc3R5bGUuZGlzcGxheSA9ICdub25lJzsgcGFuZWwuZGF0YXNldC5wcm9wb3NhbHMgPSAnW10nOyB9XG4gICAgaWYgKGFwcGx5QnRuKSBhcHBseUJ0bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgcmVmcmVzaExheW91dFJldmlld1N0YXRlKCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsIGBcdTI3NEMgQ291bGQgbm90IGFwcGx5IGNvbnRlbnQgY2hhbmdlcy4gQ2hlY2sgeW91ciBjb25uZWN0aW9uIGFuZCB0cnkgYWdhaW4uYCk7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKGFwcGx5QnRuKSBhcHBseUJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogU2hvdyBvciBoaWRlIHRoZSBkaXJ0eS1waGFzZXMgY2FsbG91dCBiYXNlZCBvbiBzdGF0ZU1hbmFnZXIuZ2V0RGlydHlQaGFzZXMoKS5cbiAqL1xuZnVuY3Rpb24gcmVuZGVyRGlydHlQaGFzZXNDYWxsb3V0KCkge1xuICBjb25zdCBjYWxsb3V0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RpcnR5LXBoYXNlcy1jYWxsb3V0Jyk7XG4gIGlmICghY2FsbG91dCkgcmV0dXJuO1xuICBjb25zdCBkaXJ0eSA9IHN0YXRlTWFuYWdlci5nZXREaXJ0eVBoYXNlcygpO1xuICBjYWxsb3V0LnN0eWxlLmRpc3BsYXkgPSBkaXJ0eS5sZW5ndGggPiAwID8gJ2Jsb2NrJyA6ICdub25lJztcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEVTIG1vZHVsZSBleHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuZXhwb3J0IHtcbiAgaW5pdGlhdGVMYXlvdXRJbnN0cnVjdGlvbnMsXG4gIGNvbXBsZXRlTGF5b3V0UmV2aWV3LFxuICBjb25maXJtTGF5b3V0UmV2aWV3LFxuICBnZW5lcmF0ZUZpbmFsT3V0cHV0cyxcbiAgaGFuZGxlTGF5b3V0UHJpbWFyeUFjdGlvbixcbiAgbG9hZExheW91dEluc3RydWN0aW9uSGlzdG9yeSxcbiAgcmVuZGVyUHJldmlld091dHB1dFN0YXR1cyxcbiAgcmVuZGVyTGF5b3V0UHJldmlld1N0YXR1cyxcbiAgZGlzcGxheUxheW91dFByZXZpZXcsXG4gIHN1Ym1pdExheW91dEluc3RydWN0aW9uLFxuICBzdWJtaXRTbWFydEluc3RydWN0aW9uLFxuICAvLyBoZWxwZXJzIGV4cG9ydGVkIGZvciB1bml0IHRlc3RzXG4gIHNob3dQcm9jZXNzaW5nLFxuICBzaG93Q29uZmlybWF0aW9uTWVzc2FnZSxcbiAgcmVuZGVySW5zdHJ1Y3Rpb25IaXN0b3J5LFxuICBhZGRUb0luc3RydWN0aW9uSGlzdG9yeSxcbiAgdW5kb0luc3RydWN0aW9uLFxuICAvLyBjb250ZW50IHByb3Bvc2FsXG4gIHN1Ym1pdENvbnRlbnRQcm9wb3NhbCxcbiAgcmVuZGVyQ29udGVudFByb3Bvc2FscyxcbiAgYXBwbHlBY2NlcHRlZFByb3Bvc2FscyxcbiAgcmVuZGVyRGlydHlQaGFzZXNDYWxsb3V0LFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL2F0cy1yZWZpbmVtZW50LmpzXG4gKiBBVFMgc2NvcmUgYmFkZ2UgZGlzcGxheSBhbmQgZGVib3VuY2VkIHJlZnJlc2ggc2NoZWR1bGluZy5cbiAqXG4gKiBERVBFTkRFTkNJRVM6XG4gKiAgIC0gZ2xvYmFsVGhpcy5zdGF0ZU1hbmFnZXIgZnJvbSBzdGF0ZS1tYW5hZ2VyLmpzIChhY2Nlc3NlZCB2aWEgZ2xvYmFsVGhpcyB0aHJvdWdob3V0KVxuICovXG5cbmZ1bmN0aW9uIF9kaXNwYXRjaEF0c1Njb3JlVXBkYXRlZCgpIHtcbiAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2F0cy1zY29yZS11cGRhdGVkJykpO1xufVxuXG5mdW5jdGlvbiBfc2FmZVRleHQodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZS50cmltKCkgOiAnJztcbn1cblxuZnVuY3Rpb24gX2NvZXJjZU9iamVjdCh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyA/IHZhbHVlIDoge307XG59XG5cbmZ1bmN0aW9uIF9mb3JtYXREYXRlTGFiZWwodmFsdWUpIHtcbiAgY29uc3QgdGV4dCA9IF9zYWZlVGV4dCh2YWx1ZSk7XG4gIGlmICghdGV4dCkgcmV0dXJuICcnO1xuXG4gIGlmICgvXlxcZHs0fS1cXGR7Mn0tXFxkezJ9JC8udGVzdCh0ZXh0KSkge1xuICAgIGNvbnN0IFt5ZWFyLCBtb250aCwgZGF5XSA9IHRleHQuc3BsaXQoJy0nKTtcbiAgICByZXR1cm4gYCR7bW9udGh9LyR7ZGF5fS8ke3llYXJ9YDtcbiAgfVxuXG4gIGNvbnN0IHBhcnNlZCA9IG5ldyBEYXRlKHRleHQpO1xuICBpZiAoIU51bWJlci5pc05hTihwYXJzZWQuZ2V0VGltZSgpKSkge1xuICAgIHJldHVybiBwYXJzZWQudG9JU09TdHJpbmcoKS5zbGljZSgwLCAxMCk7XG4gIH1cbiAgcmV0dXJuIHRleHQ7XG59XG5cbmZ1bmN0aW9uIF9nZXRQYWdlTGVuZ3RoTGFiZWwoKSB7XG4gIGNvbnN0IGdlbmVyYXRpb25TdGF0ZSA9IF9jb2VyY2VPYmplY3QoZ2xvYmFsVGhpcy5zdGF0ZU1hbmFnZXI/LmdldEdlbmVyYXRpb25TdGF0ZT8uKCkpO1xuICBjb25zdCBleGFjdCA9IE51bWJlcihnZW5lcmF0aW9uU3RhdGUucGFnZUNvdW50RXhhY3QpO1xuICBpZiAoTnVtYmVyLmlzRmluaXRlKGV4YWN0KSAmJiBleGFjdCA+IDApIHtcbiAgICByZXR1cm4gYExlbmd0aCAke2V4YWN0fSBwYWdlJHtleGFjdCA9PT0gMSA/ICcnIDogJ3MnfWA7XG4gIH1cblxuICBjb25zdCBlc3RpbWF0ZSA9IE51bWJlcihnZW5lcmF0aW9uU3RhdGUucGFnZUNvdW50RXN0aW1hdGUpO1xuICBpZiAoTnVtYmVyLmlzRmluaXRlKGVzdGltYXRlKSAmJiBlc3RpbWF0ZSA+IDApIHtcbiAgICByZXR1cm4gYExlbmd0aCAke2VzdGltYXRlLnRvRml4ZWQoMSl9IHBhZ2VzIGVzdGA7XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIF9nZXRKb2JTdW1tYXJ5TGFiZWwoKSB7XG4gIGNvbnN0IGludGFrZSA9IF9jb2VyY2VPYmplY3Qod2luZG93Ll9zdGF0dXNJbnRha2UpO1xuICBjb25zdCBhbmFseXNpcyA9IF9jb2VyY2VPYmplY3QoZ2xvYmFsVGhpcy5zdGF0ZU1hbmFnZXI/LmdldFRhYkRhdGE/LignYW5hbHlzaXMnKSk7XG4gIGNvbnN0IHBvc2l0aW9uRmFsbGJhY2sgPSBfc2FmZVRleHQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Bvc2l0aW9uLXRpdGxlJyk/LnRleHRDb250ZW50IHx8ICcnKTtcblxuICBjb25zdCByb2xlID0gX3NhZmVUZXh0KFxuICAgIGludGFrZS5yb2xlXG4gICAgICB8fCBhbmFseXNpcy5qb2JfdGl0bGVcbiAgICAgIHx8IGFuYWx5c2lzLnRpdGxlXG4gICAgICB8fCBhbmFseXNpcy5wb3NpdGlvbl9uYW1lXG4gICAgICB8fCAnJ1xuICApO1xuICBjb25zdCBjb21wYW55ID0gX3NhZmVUZXh0KGludGFrZS5jb21wYW55IHx8IGFuYWx5c2lzLmNvbXBhbnlfbmFtZSB8fCBhbmFseXNpcy5jb21wYW55IHx8ICcnKTtcbiAgY29uc3QgZGF0ZUFwcGxpZWQgPSBfZm9ybWF0RGF0ZUxhYmVsKFxuICAgIGludGFrZS5kYXRlX2FwcGxpZWRcbiAgICAgIHx8IGFuYWx5c2lzLmRhdGVfYXBwbGllZFxuICAgICAgfHwgYW5hbHlzaXMuYXBwbGljYXRpb25fZGF0ZVxuICAgICAgfHwgJydcbiAgKTtcblxuICBjb25zdCBwcmltYXJ5ID0gcm9sZSAmJiBjb21wYW55XG4gICAgPyBgJHtyb2xlfSBAICR7Y29tcGFueX1gXG4gICAgOiAocm9sZSB8fCBjb21wYW55IHx8IHBvc2l0aW9uRmFsbGJhY2spO1xuICBpZiAoIXByaW1hcnkpIHJldHVybiAnJztcbiAgaWYgKCFkYXRlQXBwbGllZCkgcmV0dXJuIHByaW1hcnk7XG4gIHJldHVybiBgJHtwcmltYXJ5fSAoJHtkYXRlQXBwbGllZH0pYDtcbn1cblxuZnVuY3Rpb24gX2tleXdvcmRDb3VudChrZXl3b3JkcywgdHlwZSwgc3RhdHVzZXMgPSBbJ21hdGNoZWQnLCAncGFydGlhbCddKSB7XG4gIHJldHVybiBrZXl3b3Jkcy5maWx0ZXIoa2V5d29yZCA9PiBrZXl3b3JkLnR5cGUgPT09IHR5cGUgJiYgc3RhdHVzZXMuaW5jbHVkZXMoa2V5d29yZC5zdGF0dXMpKS5sZW5ndGg7XG59XG5cbmZ1bmN0aW9uIF9idWlsZFN1bW1hcnlEZXRhaWwoc2NvcmUsIGtleXdvcmRzKSB7XG4gIGNvbnN0IG1pc3NpbmdIYXJkID0ga2V5d29yZHNcbiAgICAuZmlsdGVyKGtleXdvcmQgPT4ga2V5d29yZC50eXBlID09PSAnaGFyZCcgJiYga2V5d29yZC5zdGF0dXMgPT09ICdtaXNzaW5nJylcbiAgICAubWFwKGtleXdvcmQgPT4ga2V5d29yZC5rZXl3b3JkKVxuICAgIC5maWx0ZXIoQm9vbGVhbik7XG5cbiAgaWYgKG1pc3NpbmdIYXJkLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBwcmV2aWV3ID0gbWlzc2luZ0hhcmQuc2xpY2UoMCwgMikuam9pbignLCAnKTtcbiAgICBjb25zdCBzdWZmaXggPSBtaXNzaW5nSGFyZC5sZW5ndGggPiAyID8gYCArJHttaXNzaW5nSGFyZC5sZW5ndGggLSAyfSBtb3JlYCA6ICcnO1xuICAgIHJldHVybiBgTWlzc2luZyBoYXJkOiAke3ByZXZpZXd9JHtzdWZmaXh9YDtcbiAgfVxuXG4gIGNvbnN0IGV4YWN0ID0ga2V5d29yZHMuZmlsdGVyKGtleXdvcmQgPT4ga2V5d29yZC5tYXRjaF90eXBlID09PSAnZXhhY3QnIHx8IGtleXdvcmQubWF0Y2hfdHlwZSA9PT0gJ3N5bm9ueW0nKS5sZW5ndGg7XG4gIGNvbnN0IHBhcnRpYWwgPSBrZXl3b3Jkcy5maWx0ZXIoa2V5d29yZCA9PiBrZXl3b3JkLm1hdGNoX3R5cGUgPT09ICdwYXJ0aWFsJykubGVuZ3RoO1xuICBjb25zdCB0b3BTZWN0aW9ucyA9IE9iamVjdC5lbnRyaWVzKHNjb3JlLnNlY3Rpb25fc2NvcmVzIHx8IHt9KVxuICAgIC5maWx0ZXIoKFssIHZhbHVlXSkgPT4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiB2YWx1ZSA+IDApXG4gICAgLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiByaWdodFsxXSAtIGxlZnRbMV0pXG4gICAgLnNsaWNlKDAsIDIpXG4gICAgLm1hcCgoW3NlY3Rpb24sIHZhbHVlXSkgPT4gYCR7c2VjdGlvbn0gJHtNYXRoLnJvdW5kKHZhbHVlKX0lYCk7XG5cbiAgaWYgKHRvcFNlY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gYFRvcCBzZWN0aW9uczogJHt0b3BTZWN0aW9ucy5qb2luKCcgXHUyMDIyICcpfWA7XG4gIH1cblxuICBpZiAoZXhhY3QgPiAwIHx8IHBhcnRpYWwgPiAwKSB7XG4gICAgcmV0dXJuIGBNYXRjaCBxdWFsaXR5OiAke2V4YWN0fSBleGFjdCBcdTIwMjIgJHtwYXJ0aWFsfSBwYXJ0aWFsYDtcbiAgfVxuXG4gIHJldHVybiBgQmFzaXM6ICR7c2NvcmUuYmFzaXMgfHwgJ3Jldmlldyd9YDtcbn1cblxuZnVuY3Rpb24gZm9ybWF0QXRzU2NvcmVTdW1tYXJ5KHNjb3JlKSB7XG4gIGNvbnN0IGtleXdvcmRzID0gQXJyYXkuaXNBcnJheShzY29yZT8ua2V5d29yZF9zdGF0dXMpID8gc2NvcmUua2V5d29yZF9zdGF0dXMgOiBbXTtcbiAgY29uc3Qgb3ZlcmFsbCA9IHR5cGVvZiBzY29yZT8ub3ZlcmFsbCA9PT0gJ251bWJlcicgPyBNYXRoLnJvdW5kKHNjb3JlLm92ZXJhbGwpIDogbnVsbDtcblxuICBpZiAob3ZlcmFsbCA9PT0gbnVsbCkge1xuICAgIHJldHVybiB7IG92ZXJhbGw6IG51bGwsIGxpbmU6ICcnLCBkZXRhaWw6ICcnLCBrZXl3b3JkcyB9O1xuICB9XG5cbiAgaWYgKGtleXdvcmRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB7XG4gICAgICBvdmVyYWxsLFxuICAgICAgbGluZTogYE92ZXJhbGwgJHtvdmVyYWxsfSVgLFxuICAgICAgZGV0YWlsOiBgQmFzaXM6ICR7c2NvcmUuYmFzaXMgfHwgJ3Jldmlldyd9YCxcbiAgICAgIGtleXdvcmRzLFxuICAgIH07XG4gIH1cblxuICBjb25zdCBoYXJkVG90YWwgPSBrZXl3b3Jkcy5maWx0ZXIoa2V5d29yZCA9PiBrZXl3b3JkLnR5cGUgPT09ICdoYXJkJykubGVuZ3RoO1xuICBjb25zdCBzb2Z0VG90YWwgPSBrZXl3b3Jkcy5maWx0ZXIoa2V5d29yZCA9PiBrZXl3b3JkLnR5cGUgPT09ICdzb2Z0JykubGVuZ3RoO1xuICBjb25zdCBib251c1RvdGFsID0ga2V5d29yZHMuZmlsdGVyKGtleXdvcmQgPT4ga2V5d29yZC50eXBlID09PSAnYm9udXMnKS5sZW5ndGg7XG4gIGNvbnN0IHN1bW1hcnlQYXJ0cyA9IFtdO1xuXG4gIGlmIChoYXJkVG90YWwgPiAwKSB7XG4gICAgc3VtbWFyeVBhcnRzLnB1c2goYEhhcmQgJHtfa2V5d29yZENvdW50KGtleXdvcmRzLCAnaGFyZCcpfS8ke2hhcmRUb3RhbH1gKTtcbiAgfVxuICBpZiAoc29mdFRvdGFsID4gMCkge1xuICAgIHN1bW1hcnlQYXJ0cy5wdXNoKGBTb2Z0ICR7X2tleXdvcmRDb3VudChrZXl3b3JkcywgJ3NvZnQnKX0vJHtzb2Z0VG90YWx9YCk7XG4gIH1cbiAgaWYgKGJvbnVzVG90YWwgPiAwKSB7XG4gICAgc3VtbWFyeVBhcnRzLnB1c2goYEJvbnVzICR7X2tleXdvcmRDb3VudChrZXl3b3JkcywgJ2JvbnVzJyl9LyR7Ym9udXNUb3RhbH1gKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgb3ZlcmFsbCxcbiAgICBsaW5lOiBzdW1tYXJ5UGFydHMuam9pbignIFx1MjAyMiAnKSB8fCBgT3ZlcmFsbCAke292ZXJhbGx9JWAsXG4gICAgZGV0YWlsOiBfYnVpbGRTdW1tYXJ5RGV0YWlsKHNjb3JlLCBrZXl3b3JkcyksXG4gICAga2V5d29yZHMsXG4gIH07XG59XG5cbmZ1bmN0aW9uIF91cGRhdGVBdHNTdW1tYXJ5KHNjb3JlKSB7XG4gIGNvbnN0IGhlYWRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdHMtc2NvcmUtaGVhZGVyJyk7XG4gIGNvbnN0IHN1bW1hcnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXRzLXNjb3JlLXN1bW1hcnknKTtcbiAgY29uc3Qgc3VtbWFyeUxpbmUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXRzLXNjb3JlLXN1bW1hcnktbGluZScpO1xuICBjb25zdCBzdW1tYXJ5RGV0YWlsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F0cy1zY29yZS1zdW1tYXJ5LWRldGFpbCcpO1xuXG4gIGlmICghaGVhZGVyIHx8ICFzdW1tYXJ5IHx8ICFzdW1tYXJ5TGluZSB8fCAhc3VtbWFyeURldGFpbCkgcmV0dXJuO1xuXG4gIGNvbnN0IGtleXdvcmRzID0gQXJyYXkuaXNBcnJheShzY29yZT8ua2V5d29yZF9zdGF0dXMpID8gc2NvcmUua2V5d29yZF9zdGF0dXMgOiBbXTtcbiAgY29uc3QgaGFzU2NvcmUgPSBzY29yZSAmJiB0eXBlb2Ygc2NvcmUub3ZlcmFsbCA9PT0gJ251bWJlcic7XG4gIGNvbnN0IHBhZ2VMZW5ndGhMYWJlbCA9IF9nZXRQYWdlTGVuZ3RoTGFiZWwoKTtcbiAgY29uc3Qgam9iU3VtbWFyeUxhYmVsID0gX2dldEpvYlN1bW1hcnlMYWJlbCgpO1xuXG4gIGlmICghaGFzU2NvcmUpIHtcbiAgICBoZWFkZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBzdW1tYXJ5LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgc3VtbWFyeUxpbmUudGV4dENvbnRlbnQgPSAnJztcbiAgICBzdW1tYXJ5RGV0YWlsLnRleHRDb250ZW50ID0gJyc7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaGVhZGVyLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG5cbiAgY29uc3Qgc3VtbWFyeUNvbnRlbnQgPSBmb3JtYXRBdHNTY29yZVN1bW1hcnkoc2NvcmUpO1xuICBjb25zdCBsaW5lUGFydHMgPSBbc3VtbWFyeUNvbnRlbnQubGluZSwgcGFnZUxlbmd0aExhYmVsXS5maWx0ZXIoQm9vbGVhbik7XG4gIGNvbnN0IGRldGFpbFBhcnRzID0gW2pvYlN1bW1hcnlMYWJlbCwgc3VtbWFyeUNvbnRlbnQuZGV0YWlsXS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgaWYgKGxpbmVQYXJ0cy5sZW5ndGggPT09IDAgJiYgZGV0YWlsUGFydHMubGVuZ3RoID09PSAwICYmIGtleXdvcmRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHN1bW1hcnkuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBzdW1tYXJ5TGluZS50ZXh0Q29udGVudCA9ICcnO1xuICAgIHN1bW1hcnlEZXRhaWwudGV4dENvbnRlbnQgPSAnJztcbiAgICByZXR1cm47XG4gIH1cblxuICBzdW1tYXJ5TGluZS50ZXh0Q29udGVudCA9IGxpbmVQYXJ0cy5qb2luKCcgXHUyMDIyICcpO1xuICBzdW1tYXJ5RGV0YWlsLnRleHRDb250ZW50ID0gZGV0YWlsUGFydHMuam9pbignIFx1MjAyMiAnKTtcbiAgc3VtbWFyeS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVBdHNCYWRnZShzY29yZSkge1xuICBfdXBkYXRlQXRzU3VtbWFyeShzY29yZSk7XG5cbiAgY29uc3QgYmFkZ2UgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdHMtc2NvcmUtYmFkZ2UnKTtcbiAgY29uc3QgdmFsdWVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdHMtc2NvcmUtdmFsdWUnKTtcbiAgaWYgKCFiYWRnZSB8fCAhdmFsdWVFbCkge1xuICAgIF9kaXNwYXRjaEF0c1Njb3JlVXBkYXRlZCgpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICghc2NvcmUgfHwgdHlwZW9mIHNjb3JlLm92ZXJhbGwgIT09ICdudW1iZXInKSB7XG4gICAgYmFkZ2Uuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBfZGlzcGF0Y2hBdHNTY29yZVVwZGF0ZWQoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBvdmVyYWxsID0gTWF0aC5yb3VuZChzY29yZS5vdmVyYWxsKTtcbiAgdmFsdWVFbC50ZXh0Q29udGVudCA9IGAke292ZXJhbGx9JWA7XG4gIGJhZGdlLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG5cbiAgYmFkZ2UuY2xhc3NMaXN0LnJlbW92ZSgnc2NvcmUtaGlnaCcsICdzY29yZS1tZWRpdW0nLCAnc2NvcmUtbG93Jyk7XG4gIGlmIChvdmVyYWxsID49IDc1KSB7XG4gICAgYmFkZ2UuY2xhc3NMaXN0LmFkZCgnc2NvcmUtaGlnaCcpO1xuICB9IGVsc2UgaWYgKG92ZXJhbGwgPj0gNTApIHtcbiAgICBiYWRnZS5jbGFzc0xpc3QuYWRkKCdzY29yZS1tZWRpdW0nKTtcbiAgfSBlbHNlIHtcbiAgICBiYWRnZS5jbGFzc0xpc3QuYWRkKCdzY29yZS1sb3cnKTtcbiAgfVxuXG4gIGJhZGdlLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIGBBVFMgbWF0Y2ggc2NvcmU6ICR7b3ZlcmFsbH0lICgke3Njb3JlLmJhc2lzIHx8ICdyZXZpZXcnfSlgKTtcbiAgX2Rpc3BhdGNoQXRzU2NvcmVVcGRhdGVkKCk7XG59XG5cbi8qKlxuICogRmV0Y2ggQVRTIHNjb3JlIGZyb20gYmFja2VuZCBhbmQgdXBkYXRlIGJhZGdlICsgc3RhdGVNYW5hZ2VyLlxuICogU2FmZSB0byBjYWxsIGF0IGFueSBwaGFzZSBcdTIwMTQgZG9lcyBub3RoaW5nIHdoZW4gbm8gc2Vzc2lvbi9hbmFseXNpcyBhdmFpbGFibGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFtiYXNpc10gIFwiYW5hbHlzaXNcIiB8IFwicmV2aWV3X2NoZWNrcG9pbnRcIiB8IFwicG9zdF9nZW5lcmF0aW9uXCJcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVmcmVzaEF0c1Njb3JlKGJhc2lzID0gJ3Jldmlld19jaGVja3BvaW50Jykge1xuICBjb25zdCBzZXNzaW9uSWQgPSBnbG9iYWxUaGlzLnN0YXRlTWFuYWdlcj8uZ2V0U2Vzc2lvbklkPy4oKTtcbiAgaWYgKCFzZXNzaW9uSWQpIHJldHVybjtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9jdi9hdHMtc2NvcmUnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBzZXNzaW9uX2lkOiBzZXNzaW9uSWQsIGJhc2lzIH0pLFxuICAgIH0pO1xuICAgIGlmICghcmVzLm9rKSByZXR1cm47XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEub2sgJiYgZGF0YS5hdHNfc2NvcmUpIHtcbiAgICAgIGdsb2JhbFRoaXMuc3RhdGVNYW5hZ2VyPy5zZXRBdHNTY29yZT8uKGRhdGEuYXRzX3Njb3JlKTtcbiAgICAgIHVwZGF0ZUF0c0JhZGdlKGRhdGEuYXRzX3Njb3JlKTtcbiAgICB9XG4gIH0gY2F0Y2ggKF9lKSB7XG4gICAgLy8gTm9uLWZhdGFsIFx1MjAxNCBiYWRnZSBzdGF5cyBoaWRkZW4gb3Igc2hvd3Mgc3RhbGUgdmFsdWVcbiAgfVxufVxuXG4vKiogRGVib3VuY2VkOiBkZWZlcnMgcmVmcmVzaCA2MDBtcyBhZnRlciB0aGUgbGFzdCBjYWxsLiAqL1xubGV0IF9hdHNSZWZyZXNoVGltZXIgPSBudWxsO1xuZnVuY3Rpb24gc2NoZWR1bGVBdHNSZWZyZXNoKGJhc2lzID0gJ3Jldmlld19jaGVja3BvaW50Jykge1xuICBjbGVhclRpbWVvdXQoX2F0c1JlZnJlc2hUaW1lcik7XG4gIF9hdHNSZWZyZXNoVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHJlZnJlc2hBdHNTY29yZShiYXNpcyksIDYwMCk7XG59XG5cbmZ1bmN0aW9uIF9yZWZyZXNoU3VtbWFyeUZyb21TdGF0ZSgpIHtcbiAgY29uc3Qgc2NvcmUgPSBnbG9iYWxUaGlzLnN0YXRlTWFuYWdlcj8uZ2V0QXRzU2NvcmU/LigpO1xuICBpZiAoc2NvcmUgJiYgdHlwZW9mIHNjb3JlLm92ZXJhbGwgPT09ICdudW1iZXInKSB7XG4gICAgX3VwZGF0ZUF0c1N1bW1hcnkoc2NvcmUpO1xuICB9XG59XG5cbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignY3ZidWlsZGVyOmdlbmVyYXRpb24tc3RhdGUtY2hhbmdlZCcsICgpID0+IHtcbiAgICBfcmVmcmVzaFN1bW1hcnlGcm9tU3RhdGUoKTtcbiAgfSk7XG59XG5cbmlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gIGNvbnN0IHBvc2l0aW9uVGl0bGVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwb3NpdGlvbi10aXRsZScpO1xuICBpZiAocG9zaXRpb25UaXRsZUVsICYmIHR5cGVvZiBNdXRhdGlvbk9ic2VydmVyICE9PSAndW5kZWZpbmVkJykge1xuICAgIGNvbnN0IHRpdGxlT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7XG4gICAgICBfcmVmcmVzaFN1bW1hcnlGcm9tU3RhdGUoKTtcbiAgICB9KTtcbiAgICB0aXRsZU9ic2VydmVyLm9ic2VydmUocG9zaXRpb25UaXRsZUVsLCB7XG4gICAgICBjaGlsZExpc3Q6IHRydWUsXG4gICAgICBjaGFyYWN0ZXJEYXRhOiB0cnVlLFxuICAgICAgc3VidHJlZTogdHJ1ZSxcbiAgICB9KTtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgRVMgbW9kdWxlIGV4cG9ydHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5leHBvcnQgeyB1cGRhdGVBdHNCYWRnZSwgcmVmcmVzaEF0c1Njb3JlLCBzY2hlZHVsZUF0c1JlZnJlc2gsIGZvcm1hdEF0c1Njb3JlU3VtbWFyeSB9O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvbWVzc2FnZS1xdWV1ZS5qc1xuICogQ29udmVyc2F0aW9uIG1lc3NhZ2UgYXBwZW5kaW5nLCBsb2FkaW5nIG1lc3NhZ2VzLCBhbmQgdGhlIHByZS1ET00gYnVmZmVyXG4gKiBxdWV1ZSB0aGF0IGhvbGRzIG1lc3NhZ2VzIGVtaXR0ZWQgYmVmb3JlICNjb252ZXJzYXRpb24gZXhpc3RzLlxuICpcbiAqIERFUEVOREVOQ0lFUzpcbiAqICAgLSBjbGVhbkpzb25SZXNwb25zZSwgZXNjYXBlSHRtbCBmcm9tIHV0aWxzLmpzXG4gKiAgIC0gc2VuZE1lc3NhZ2UgZnJvbSBtZXNzYWdlLWRpc3BhdGNoLmpzIChvbiBnbG9iYWxUaGlzLCBmb3IgaW5saW5lIGJ1dHRvbnMpXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgY2xlYW5Kc29uUmVzcG9uc2UsIGVzY2FwZUh0bWwgfSBmcm9tICcuL3V0aWxzLmpzJztcbmNvbnN0IGxvZyA9IGdldExvZ2dlcignbWVzc2FnZS1xdWV1ZScpO1xuXG4vLyBCdWZmZXIgZm9yIG1lc3NhZ2VzIGVtaXR0ZWQgYmVmb3JlIHRoZSAjY29udmVyc2F0aW9uIGRpdiBleGlzdHMuXG4vLyBGbHVzaGVkIGF0IHRoZSBzdGFydCBvZiBpbml0KCkgb25jZSB0aGUgRE9NIGlzIGZ1bGx5IHJlYWR5LlxuY29uc3QgX21lc3NhZ2VRdWV1ZSA9IFtdO1xuXG5mdW5jdGlvbiBfZmx1c2hNZXNzYWdlUXVldWUoKSB7XG4gIHdoaWxlIChfbWVzc2FnZVF1ZXVlLmxlbmd0aCkge1xuICAgIGNvbnN0IHsgdHlwZSwgdGV4dCB9ID0gX21lc3NhZ2VRdWV1ZS5zaGlmdCgpO1xuICAgIGFwcGVuZE1lc3NhZ2UodHlwZSwgdGV4dCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYXBwZW5kTG9hZGluZ01lc3NhZ2UodGV4dCkge1xuICBjb25zdCBjb252ZXJzYXRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udmVyc2F0aW9uJyk7XG4gIGNvbnN0IG1lc3NhZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgbWVzc2FnZS5jbGFzc05hbWUgPSAnbWVzc2FnZSBzeXN0ZW0nO1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGNvbnRlbnQuY2xhc3NOYW1lID0gJ2NvbnRlbnQgbG9hZGluZy1tZXNzYWdlJztcbiAgY29udGVudC5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz1cImxvYWRpbmctc3Bpbm5lclwiPjwvZGl2PjxzcGFuPiR7dGV4dH08L3NwYW4+YDtcbiAgbWVzc2FnZS5hcHBlbmRDaGlsZChjb250ZW50KTtcbiAgY29udmVyc2F0aW9uLmFwcGVuZENoaWxkKG1lc3NhZ2UpO1xuICBjb252ZXJzYXRpb24uc2Nyb2xsVG9wID0gY29udmVyc2F0aW9uLnNjcm9sbEhlaWdodDtcbiAgcmV0dXJuIG1lc3NhZ2U7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUxvYWRpbmdNZXNzYWdlKG1lc3NhZ2VFbGVtZW50KSB7XG4gIGlmIChtZXNzYWdlRWxlbWVudCAmJiBtZXNzYWdlRWxlbWVudC5wYXJlbnROb2RlKSB7XG4gICAgbWVzc2FnZUVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChtZXNzYWdlRWxlbWVudCk7XG4gIH1cbn1cblxuLyoqIFJlc3RvcmVzIGEgcHJldmlvdXNseS1zYXZlZCBtZXNzYWdlIHdob3NlIGNvbnRlbnQgaXMgYWxyZWFkeSBIVE1MIChzYXZlZCB2aWEgaW5uZXJIVE1MKS4gKi9cbmZ1bmN0aW9uIGFwcGVuZE1lc3NhZ2VIdG1sKHR5cGUsIGh0bWwpIHtcbiAgY29uc3QgY29udmVyc2F0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbnZlcnNhdGlvbicpO1xuICBjb25zdCBtZXNzYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIG1lc3NhZ2UuY2xhc3NOYW1lID0gYG1lc3NhZ2UgJHt0eXBlfWA7XG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgY29udGVudC5jbGFzc05hbWUgPSAnY29udGVudCc7XG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gaHRtbDtcbiAgbWVzc2FnZS5hcHBlbmRDaGlsZChjb250ZW50KTtcbiAgY29udmVyc2F0aW9uLmFwcGVuZENoaWxkKG1lc3NhZ2UpO1xuICBjb252ZXJzYXRpb24uc2Nyb2xsVG9wID0gY29udmVyc2F0aW9uLnNjcm9sbEhlaWdodDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDb2xsYXBzaWJsZSBsb25nLWNvbnRlbnQgaGVscGVyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY29uc3QgQ09MTEFQU0VfTElORV9USFJFU0hPTEQgPSA4OyAgLy8gbGluZXMgYmVmb3JlIGNvbGxhcHNpbmdcbmNvbnN0IENPTExBUFNFX0NIQVJfVEhSRVNIT0xEID0gNDgwOyAvLyBjaGFycyBiZWZvcmUgY29sbGFwc2luZ1xuXG4vKipcbiAqIFdyYXAgcmVuZGVyZWQgSFRNTCBpbiBhIGNvbGxhcHNpYmxlIGNvbnRhaW5lciB3aGVuIHRoZSBjb250ZW50IGV4Y2VlZHMgdGhlXG4gKiB0aHJlc2hvbGQsIHNob3dpbmcgdGhlIGZpcnN0IGZldyBsaW5lcyB3aXRoIGEgdG9nZ2xlIGJ1dHRvbi5cbiAqL1xuZnVuY3Rpb24gX21ha2VDb2xsYXBzaWJsZUNvbnRlbnQoaHRtbCwgdGV4dFN0cikge1xuICBjb25zdCBsaW5lcyA9IHRleHRTdHIuc3BsaXQoJ1xcbicpO1xuICBpZiAobGluZXMubGVuZ3RoIDw9IENPTExBUFNFX0xJTkVfVEhSRVNIT0xEICYmIHRleHRTdHIubGVuZ3RoIDw9IENPTExBUFNFX0NIQVJfVEhSRVNIT0xEKSB7XG4gICAgcmV0dXJuIHsgaHRtbCwgY29sbGFwc2libGU6IGZhbHNlIH07XG4gIH1cblxuICAvLyBCdWlsZCBwcmV2aWV3OiBmaXJzdCBDT0xMQVBTRV9MSU5FX1RIUkVTSE9MRCBsaW5lcyB3b3J0aCBvZiBlc2NhcGVkIHRleHRcbiAgY29uc3QgcHJldmlld0xpbmVzID0gbGluZXMuc2xpY2UoMCwgQ09MTEFQU0VfTElORV9USFJFU0hPTEQpO1xuICBjb25zdCBwcmV2aWV3SHRtbCA9IGVzY2FwZUh0bWwocHJldmlld0xpbmVzLmpvaW4oJ1xcbicpKVxuICAgIC5yZXBsYWNlKC9cXCpcXCooLis/KVxcKlxcKi9nLCAnPHN0cm9uZz4kMTwvc3Ryb25nPicpXG4gICAgLnJlcGxhY2UoL1xcKiguKz8pXFwqL2csICc8ZW0+JDE8L2VtPicpXG4gICAgLnJlcGxhY2UoL2AoW15gXSspYC9nLCAnPGNvZGU+JDE8L2NvZGU+JylcbiAgICAucmVwbGFjZSgvXFxuL2csICc8YnI+Jyk7XG5cbiAgY29uc3Qgb3ZlcmZsb3cgPSBsaW5lcy5sZW5ndGggLSBDT0xMQVBTRV9MSU5FX1RIUkVTSE9MRDtcbiAgY29uc3QgaWQgPSBgY29sbGFwc2libGUtJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDcpfWA7XG5cbiAgY29uc3Qgd3JhcHBlZCA9IGBcbiAgICA8ZGl2IGNsYXNzPVwibXNnLXByZXZpZXdcIiBpZD1cIiR7aWR9LXByZXZpZXdcIj4ke3ByZXZpZXdIdG1sfTwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJtc2ctZnVsbFwiIGlkPVwiJHtpZH0tZnVsbFwiIHN0eWxlPVwiZGlzcGxheTpub25lXCI+JHtodG1sfTwvZGl2PlxuICAgIDxidXR0b24gY2xhc3M9XCJtc2ctdG9nZ2xlLWJ0blwiIG9uY2xpY2s9XCIoZnVuY3Rpb24oYnRuKXtcbiAgICAgIHZhciBwPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCcke2lkfS1wcmV2aWV3JyksXG4gICAgICAgICAgZj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnJHtpZH0tZnVsbCcpO1xuICAgICAgaWYoZi5zdHlsZS5kaXNwbGF5PT09J25vbmUnKXtcbiAgICAgICAgcC5zdHlsZS5kaXNwbGF5PSdub25lJzsgZi5zdHlsZS5kaXNwbGF5PSdibG9jayc7IGJ0bi50ZXh0Q29udGVudD0nU2hvdyBsZXNzJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHAuc3R5bGUuZGlzcGxheT0nJzsgZi5zdHlsZS5kaXNwbGF5PSdub25lJzsgYnRuLnRleHRDb250ZW50PSdTaG93ICR7b3ZlcmZsb3d9IG1vcmUgbGluZSR7b3ZlcmZsb3cgPT09IDEgPyAnJyA6ICdzJ31cdTIwMjYnO1xuICAgICAgfVxuICAgIH0pKHRoaXMpXCIgdHlwZT1cImJ1dHRvblwiPlNob3cgJHtvdmVyZmxvd30gbW9yZSBsaW5lJHtvdmVyZmxvdyA9PT0gMSA/ICcnIDogJ3MnfVx1MjAyNjwvYnV0dG9uPmA7XG5cbiAgcmV0dXJuIHsgaHRtbDogd3JhcHBlZCwgY29sbGFwc2libGU6IHRydWUgfTtcbn1cblxuZnVuY3Rpb24gYXBwZW5kTWVzc2FnZSh0eXBlLCB0ZXh0KSB7XG4gIGNvbnN0IGNvbnZlcnNhdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb252ZXJzYXRpb24nKTtcbiAgaWYgKCFjb252ZXJzYXRpb24pIHtcbiAgICAvLyBET00gbm90IHJlYWR5IHlldCBcdTIwMTQgYnVmZmVyIHVudGlsIF9mbHVzaE1lc3NhZ2VRdWV1ZSgpIGlzIGNhbGxlZCBmcm9tIGluaXQoKVxuICAgIF9tZXNzYWdlUXVldWUucHVzaCh7IHR5cGUsIHRleHQgfSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgbWVzc2FnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBtZXNzYWdlLmNsYXNzTmFtZSA9IGBtZXNzYWdlICR7dHlwZX1gO1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGNvbnRlbnQuY2xhc3NOYW1lID0gJ2NvbnRlbnQnO1xuXG4gIC8vIFNpbXBsZSBtYXJrZG93biByZW5kZXJpbmc6IGNvbnZlcnQgKip0ZXh0KiogdG8gPHN0cm9uZz4gYW5kIHByZXNlcnZlIG5ld2xpbmVzXG4gIGNvbnN0IHRleHRTdHIgPSB0eXBlb2YgdGV4dCA9PT0gJ3N0cmluZycgPyB0ZXh0IDogSlNPTi5zdHJpbmdpZnkodGV4dCwgbnVsbCwgMik7XG4gIGNvbnN0IHJlbmRlcmVkSHRtbCA9IGVzY2FwZUh0bWwodGV4dFN0cilcbiAgICAucmVwbGFjZSgvXFwqXFwqKC4rPylcXCpcXCovZywgJzxzdHJvbmc+JDE8L3N0cm9uZz4nKVxuICAgIC5yZXBsYWNlKC9cXCooLis/KVxcKi9nLCAnPGVtPiQxPC9lbT4nKVxuICAgIC5yZXBsYWNlKC9gKFteYF0rKWAvZywgJzxjb2RlPiQxPC9jb2RlPicpXG4gICAgLnJlcGxhY2UoL1xcbi9nLCAnPGJyPicpO1xuXG4gIC8vIEFwcGx5IGNvbGxhcHNpYmxlIHdyYXBwZXIgZm9yIGxvbmcgdXNlci9hc3Npc3RhbnQgbWVzc2FnZXNcbiAgaWYgKHR5cGUgPT09ICd1c2VyJyB8fCB0eXBlID09PSAnYXNzaXN0YW50Jykge1xuICAgIGNvbnN0IHsgaHRtbCwgY29sbGFwc2libGUgfSA9IF9tYWtlQ29sbGFwc2libGVDb250ZW50KHJlbmRlcmVkSHRtbCwgdGV4dFN0cik7XG4gICAgY29udGVudC5pbm5lckhUTUwgPSBodG1sO1xuICAgIGlmIChjb2xsYXBzaWJsZSkgY29udGVudC5jbGFzc0xpc3QuYWRkKCdjb2xsYXBzaWJsZS1tc2cnKTtcbiAgfSBlbHNlIHtcbiAgICBjb250ZW50LmlubmVySFRNTCA9IHJlbmRlcmVkSHRtbDtcbiAgfVxuICBtZXNzYWdlLmFwcGVuZENoaWxkKGNvbnRlbnQpO1xuXG4gIC8vIENoZWNrIGlmIG1lc3NhZ2UgZW5kcyB3aXRoIHJlc3BvbnNlIG9wdGlvbnMgbGlrZSAoeWVzL25vL21heWJlKVxuICBjb25zdCBvcHRpb25zTWF0Y2ggPSB0ZXh0U3RyLm1hdGNoKC9cXCgoW14pXStcXC9bXildKylcXClcXHMqJC8pO1xuICBpZiAob3B0aW9uc01hdGNoICYmIHR5cGUgPT09ICdhc3Npc3RhbnQnKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IG9wdGlvbnNNYXRjaFsxXS5zcGxpdCgnLycpLm1hcChvcHQgPT4gb3B0LnRyaW0oKSk7XG4gICAgY29uc3QgYnV0dG9uQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgYnV0dG9uQ29udGFpbmVyLnN0eWxlLmNzc1RleHQgPSAnbWFyZ2luLXRvcDogMTJweDsgZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IGZsZXgtd3JhcDogd3JhcDsnO1xuICAgIG9wdGlvbnMuZm9yRWFjaChvcHRpb24gPT4ge1xuICAgICAgY29uc3QgYnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgICBidG4udGV4dENvbnRlbnQgPSBvcHRpb247XG4gICAgICBidG4uY2xhc3NOYW1lID0gJ2FjdGlvbi1idG4nO1xuICAgICAgYnRuLnN0eWxlLmNzc1RleHQgPSAncGFkZGluZzogOHB4IDE2cHg7IGJhY2tncm91bmQ6ICMzYjgyZjY7IGNvbG9yOiB3aGl0ZTsgYm9yZGVyOiBub25lOyBib3JkZXItcmFkaXVzOiA2cHg7IGN1cnNvcjogcG9pbnRlcjsnO1xuICAgICAgYnRuLm9uY2xpY2sgPSAoKSA9PiB7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZXNzYWdlLWlucHV0JykudmFsdWUgPSBvcHRpb247XG4gICAgICAgIGlmICh0eXBlb2Ygc2VuZE1lc3NhZ2UgPT09ICdmdW5jdGlvbicpIHNlbmRNZXNzYWdlKCk7XG4gICAgICB9O1xuICAgICAgYnV0dG9uQ29udGFpbmVyLmFwcGVuZENoaWxkKGJ0bik7XG4gICAgfSk7XG4gICAgbWVzc2FnZS5hcHBlbmRDaGlsZChidXR0b25Db250YWluZXIpO1xuICB9XG5cbiAgY29udmVyc2F0aW9uLmFwcGVuZENoaWxkKG1lc3NhZ2UpO1xuICBjb252ZXJzYXRpb24uc2Nyb2xsVG9wID0gY29udmVyc2F0aW9uLnNjcm9sbEhlaWdodDtcbiAgcmV0dXJuIG1lc3NhZ2U7XG59XG5cbi8qKlxuICogQXBwZW5kcyBhIHN5c3RlbSBlcnJvciBtZXNzYWdlIHdpdGggYW4gb3B0aW9uYWwgUmV0cnkgYnV0dG9uLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgdGV4dCAgICAgICAtIEVycm9yIG1lc3NhZ2UgdGV4dCAoc3VwcG9ydHMgKipib2xkKiogbWFya2Rvd24pXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcmV0cnlGbl0gIC0gQ2FsbGVkIHdoZW4gUmV0cnkgaXMgY2xpY2tlZDsgb21pdCBmb3Igbm9uLXJldHJ5YWJsZSBlcnJvcnNcbiAqIEBwYXJhbSB7c3RyaW5nfSAgIFtyZXRyeUxhYmVsXSAtIFJldHJ5IGJ1dHRvbiBsYWJlbCAoZGVmYXVsdCAnUmV0cnknKVxuICovXG5mdW5jdGlvbiBhcHBlbmRSZXRyeU1lc3NhZ2UodGV4dCwgcmV0cnlGbiwgcmV0cnlMYWJlbCA9ICdSZXRyeScsIGNhbmNlbEZuID0gbnVsbCkge1xuICBjb25zdCBjb252ZXJzYXRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udmVyc2F0aW9uJyk7XG4gIGNvbnN0IG1lc3NhZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgbWVzc2FnZS5jbGFzc05hbWUgPSAnbWVzc2FnZSBzeXN0ZW0nO1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGNvbnRlbnQuY2xhc3NOYW1lID0gJ2NvbnRlbnQnO1xuICBjb25zdCBlc2NhcGVkID0gZXNjYXBlSHRtbCh0ZXh0KTtcbiAgY29udGVudC5pbm5lckhUTUwgPSBlc2NhcGVkXG4gICAgLnJlcGxhY2UoL1xcKlxcKiguKz8pXFwqXFwqL2csICc8c3Ryb25nPiQxPC9zdHJvbmc+JylcbiAgICAucmVwbGFjZSgvXFxuL2csICc8YnI+Jyk7XG4gIG1lc3NhZ2UuYXBwZW5kQ2hpbGQoY29udGVudCk7XG4gIGlmICh0eXBlb2YgcmV0cnlGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgIGJ0bi50ZXh0Q29udGVudCA9IHJldHJ5TGFiZWw7XG4gICAgYnRuLnN0eWxlLmNzc1RleHQgPSAnbWFyZ2luLXRvcDo4cHg7cGFkZGluZzo2cHggMTRweDtiYWNrZ3JvdW5kOiMzYjgyZjY7Y29sb3I6I2ZmZjtib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjZweDtjdXJzb3I6cG9pbnRlcjtmb250LXNpemU6MC44NXJlbTtkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW4tcmlnaHQ6OHB4Oyc7XG4gICAgYnRuLm9uY2xpY2sgPSAoKSA9PiB7IG1lc3NhZ2UucmVtb3ZlKCk7IHJldHJ5Rm4oKTsgfTtcbiAgICBtZXNzYWdlLmFwcGVuZENoaWxkKGJ0bik7XG4gIH1cbiAgaWYgKHR5cGVvZiBjYW5jZWxGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnN0IGNhbmNlbEJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgIGNhbmNlbEJ0bi50ZXh0Q29udGVudCA9ICdTdG9wIHJldHJpZXMnO1xuICAgIGNhbmNlbEJ0bi5zdHlsZS5jc3NUZXh0ID0gJ21hcmdpbi10b3A6OHB4O3BhZGRpbmc6NnB4IDE0cHg7YmFja2dyb3VuZDojNmI3MjgwO2NvbG9yOiNmZmY7Ym9yZGVyOm5vbmU7Ym9yZGVyLXJhZGl1czo2cHg7Y3Vyc29yOnBvaW50ZXI7Zm9udC1zaXplOjAuODVyZW07ZGlzcGxheTppbmxpbmUtYmxvY2s7JztcbiAgICBjYW5jZWxCdG4ub25jbGljayA9ICgpID0+IHsgbWVzc2FnZS5yZW1vdmUoKTsgY2FuY2VsRm4oKTsgfTtcbiAgICBtZXNzYWdlLmFwcGVuZENoaWxkKGNhbmNlbEJ0bik7XG4gIH1cbiAgY29udmVyc2F0aW9uLmFwcGVuZENoaWxkKG1lc3NhZ2UpO1xuICBjb252ZXJzYXRpb24uc2Nyb2xsVG9wID0gY29udmVyc2F0aW9uLnNjcm9sbEhlaWdodDtcbiAgcmV0dXJuIG1lc3NhZ2U7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZEZvcm1hdHRlZEFuYWx5c2lzKHJlc3VsdCkge1xuICB0cnkge1xuICAgIGNvbnN0IGNsZWFuUmVzdWx0ID0gY2xlYW5Kc29uUmVzcG9uc2UocmVzdWx0KTtcbiAgICBjb25zdCBkYXRhID0gdHlwZW9mIGNsZWFuUmVzdWx0ID09PSAnc3RyaW5nJyA/IEpTT04ucGFyc2UoY2xlYW5SZXN1bHQpIDogY2xlYW5SZXN1bHQ7XG5cbiAgICBpZiAoZGF0YSAmJiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiYgKGRhdGEudGl0bGUgfHwgZGF0YS5yZXF1aXJlZF9za2lsbHMpKSB7XG4gICAgICBjb25zdCBjb252ZXJzYXRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udmVyc2F0aW9uJyk7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBtZXNzYWdlLmNsYXNzTmFtZSA9ICdtZXNzYWdlIGFzc2lzdGFudCc7XG4gICAgICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBjb250ZW50LmNsYXNzTmFtZSA9ICdjb250ZW50IGpvYi1hbmFseXNpcyc7XG5cbiAgICAgIGxldCBodG1sID0gJzxoMz5cdUQ4M0RcdURDQ0IgSm9iIEFuYWx5c2lzIENvbXBsZXRlPC9oMz4nO1xuICAgICAgaWYgKGRhdGEudGl0bGUpICBodG1sICs9IGA8cD48c3Ryb25nPlBvc2l0aW9uOjwvc3Ryb25nPiAke2RhdGEudGl0bGV9IGF0ICR7ZGF0YS5jb21wYW55IHx8ICdDb21wYW55J308L3A+YDtcbiAgICAgIGlmIChkYXRhLmRvbWFpbikgaHRtbCArPSBgPHA+PHN0cm9uZz5Eb21haW46PC9zdHJvbmc+ICR7ZGF0YS5kb21haW59PC9wPmA7XG5cbiAgICAgIGlmIChkYXRhLnJlcXVpcmVkX3NraWxscz8ubGVuZ3RoKSB7XG4gICAgICAgIGh0bWwgKz0gJzxoND5cdUQ4M0NcdURGQUYgUmVxdWlyZWQgU2tpbGxzOjwvaDQ+PHVsPic7XG4gICAgICAgIGRhdGEucmVxdWlyZWRfc2tpbGxzLmZvckVhY2gocyA9PiB7IGh0bWwgKz0gYDxsaT4ke3N9PC9saT5gOyB9KTtcbiAgICAgICAgaHRtbCArPSAnPC91bD4nO1xuICAgICAgfVxuICAgICAgaWYgKGRhdGEucHJlZmVycmVkX3NraWxscz8ubGVuZ3RoKSB7XG4gICAgICAgIGh0bWwgKz0gJzxoND5cdTJCNTAgUHJlZmVycmVkIFNraWxsczo8L2g0Pjx1bD4nO1xuICAgICAgICBkYXRhLnByZWZlcnJlZF9za2lsbHMuZm9yRWFjaChzID0+IHsgaHRtbCArPSBgPGxpPiR7c308L2xpPmA7IH0pO1xuICAgICAgICBodG1sICs9ICc8L3VsPic7XG4gICAgICB9XG4gICAgICBpZiAoZGF0YS5uaWNlX3RvX2hhdmVfcmVxdWlyZW1lbnRzPy5sZW5ndGgpIHtcbiAgICAgICAgaHRtbCArPSAnPGg0Plx1MjcyOCBOaWNlIHRvIEhhdmU6PC9oND48dWw+JztcbiAgICAgICAgZGF0YS5uaWNlX3RvX2hhdmVfcmVxdWlyZW1lbnRzLmZvckVhY2gociA9PiB7IGh0bWwgKz0gYDxsaT4ke3J9PC9saT5gOyB9KTtcbiAgICAgICAgaHRtbCArPSAnPC91bD4nO1xuICAgICAgfVxuICAgICAgaWYgKGRhdGEuYXRzX2tleXdvcmRzPy5sZW5ndGgpIHtcbiAgICAgICAgaHRtbCArPSAnPGg0Plx1RDgzRFx1REQxMSBBVFMgS2V5d29yZHM6PC9oND48cCBzdHlsZT1cImxpbmUtaGVpZ2h0OiAyO1wiPic7XG4gICAgICAgIGRhdGEuYXRzX2tleXdvcmRzLmZvckVhY2goa3cgPT4ge1xuICAgICAgICAgIGh0bWwgKz0gYDxzcGFuIHN0eWxlPVwiZGlzcGxheTppbmxpbmUtYmxvY2s7YmFja2dyb3VuZDojZGJlYWZlO2NvbG9yOiMxZTQwYWY7Ym9yZGVyLXJhZGl1czo0cHg7cGFkZGluZzoycHggOHB4O21hcmdpbjoycHg7Zm9udC1zaXplOjAuODVlbTtcIj4ke2t3fTwvc3Bhbj5gO1xuICAgICAgICB9KTtcbiAgICAgICAgaHRtbCArPSAnPC9wPic7XG4gICAgICB9XG5cbiAgICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgIG1lc3NhZ2UuYXBwZW5kQ2hpbGQoY29udGVudCk7XG4gICAgICBjb252ZXJzYXRpb24uYXBwZW5kQ2hpbGQobWVzc2FnZSk7XG4gICAgICBjb252ZXJzYXRpb24uc2Nyb2xsVG9wID0gY29udmVyc2F0aW9uLnNjcm9sbEhlaWdodDtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgcmVzdWx0KTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2cuZXJyb3IoJ0FuYWx5c2lzIGRpc3BsYXkgZXJyb3I6JywgZSk7XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgcmVzdWx0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhcHBlbmRGb3JtYXR0ZWRSZXNwb25zZShyZXNwb25zZSkge1xuICB0cnkge1xuICAgIGNvbnN0IGRhdGEgPSB0eXBlb2YgcmVzcG9uc2UgPT09ICdzdHJpbmcnID8gSlNPTi5wYXJzZShyZXNwb25zZSkgOiByZXNwb25zZTtcbiAgICBpZiAoZGF0YSAmJiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiYgKGRhdGEudGl0bGUgfHwgZGF0YS5yZXF1aXJlZF9za2lsbHMpKSB7XG4gICAgICBhcHBlbmRGb3JtYXR0ZWRBbmFseXNpcyhyZXNwb25zZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIHJlc3BvbnNlKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCByZXNwb25zZSk7XG4gIH1cbn1cblxuLy8gYXBwZW5kUmF3SHRtbCBpcyBuZWVkZWQgYnkgbWVzc2FnZS1kaXNwYXRjaDsgZGVmaW5lZCBoZXJlIHNpbmNlIGl0IHVzZXMgdGhlXG4vLyBjb252ZXJzYXRpb24gZWxlbWVudCBwYXR0ZXJuLlxuZnVuY3Rpb24gYXBwZW5kUmF3SHRtbChodG1sKSB7XG4gIGNvbnN0IGNvbnZlcnNhdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb252ZXJzYXRpb24nKTtcbiAgaWYgKCFjb252ZXJzYXRpb24pIHJldHVybjtcbiAgY29udmVyc2F0aW9uLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJywgaHRtbCk7XG4gIGNvbnZlcnNhdGlvbi5zY3JvbGxUb3AgPSBjb252ZXJzYXRpb24uc2Nyb2xsSGVpZ2h0O1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgRVMgbW9kdWxlIGV4cG9ydHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5leHBvcnQge1xuICBfbWVzc2FnZVF1ZXVlLCBfZmx1c2hNZXNzYWdlUXVldWUsXG4gIGFwcGVuZExvYWRpbmdNZXNzYWdlLCByZW1vdmVMb2FkaW5nTWVzc2FnZSxcbiAgYXBwZW5kTWVzc2FnZUh0bWwsIGFwcGVuZE1lc3NhZ2UsXG4gIGFwcGVuZFJldHJ5TWVzc2FnZSxcbiAgYXBwZW5kRm9ybWF0dGVkQW5hbHlzaXMsIGFwcGVuZEZvcm1hdHRlZFJlc3BvbnNlLFxuICBhcHBlbmRSYXdIdG1sLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL3Jldmlldy10YWJsZS1iYXNlLmpzXG4gKiBUYWIgc3dpdGNoaW5nLCBhbmFseXNpcyB0YWIsIGN1c3RvbWl6YXRpb24gcmVzcG9uc2UgaGFuZGxlciwgcmV2aWV3LXBhbmVcbiAqIGNvb3JkaW5hdGlvbiwgYW5kIHRoZSBwYWdlLWVzdGltYXRlIHdpZGdldC5cbiAqXG4gKiBEZXBlbmRlbmNpZXMgKGFsbCByZXNvbHZlZCB0aHJvdWdoIGdsb2JhbFRoaXMgYXQgcnVudGltZSk6XG4gKiAgIGFwcGVuZE1lc3NhZ2UsIHNhdmVUYWJEYXRhLCBjbGVhbkpzb25SZXNwb25zZSwgZXNjYXBlSHRtbCxcbiAqICAgZ2V0U3RhZ2VGb3JUYWIsIHVwZGF0ZVRhYkJhckZvclN0YWdlLCB1cGRhdGVBY3Rpb25CdXR0b25zLFxuICogICBwb3B1bGF0ZUpvYlRhYiwgcG9wdWxhdGVRdWVzdGlvbnNUYWIsIGJ1aWxkQWNoaWV2ZW1lbnRzRWRpdG9yLFxuICogICByZW5kZXJSZXdyaXRlUGFuZWwsIHBvcHVsYXRlQ1ZFZGl0b3JUYWIsXG4gKiAgIHBvcHVsYXRlRG93bmxvYWRUYWIsIHBvcHVsYXRlU3BlbGxDaGVja1RhYiwgaW5pdGlhdGVMYXlvdXRJbnN0cnVjdGlvbnMsXG4gKiAgIHBvcHVsYXRlRmluYWxpc2VUYWIsIHBvcHVsYXRlTWFzdGVyVGFiLCBwb3B1bGF0ZUNvdmVyTGV0dGVyVGFiLFxuICogICBwb3B1bGF0ZVNjcmVlbmluZ1RhYiwgZXh0cmFjdEZpcnN0SnNvbk9iamVjdCxcbiAqICAgZmV0Y2hTdGF0dXMsIGFwaUNhbGwsXG4gKiAgIGJ1aWxkRXhwZXJpZW5jZVJldmlld1RhYmxlLCBidWlsZFNraWxsc1Jldmlld1RhYmxlLFxuICogICBidWlsZEFjaGlldmVtZW50c1Jldmlld1RhYmxlLCBidWlsZFN1bW1hcnlGb2N1c1NlY3Rpb24sXG4gKiAgIGJ1aWxkUHVibGljYXRpb25zUmV2aWV3VGFibGUsIGdldEV4cGVyaWVuY2VEZXRhaWxzLFxuICogICBnZXRFeHBlcmllbmNlUmVjb21tZW5kYXRpb24sIGFjaGlldmVtZW50RGVjaXNpb25zXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdyZXZpZXctdGFibGUtYmFzZScpO1xuXG5pbXBvcnQgeyBzdGF0ZU1hbmFnZXIgfSBmcm9tICcuL3N0YXRlLW1hbmFnZXIuanMnO1xuXG4vLyBcdTI1MDBcdTI1MDAgTW9kdWxlLWxldmVsIHN0YXRlIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5sZXQgdXNlclNlbGVjdGlvbnMgPSB7XG4gIGV4cGVyaWVuY2VzOiB7fSwgIC8vIGV4cF9pZCAtPiAnZW1waGFzaXplJ3wnaW5jbHVkZSd8J2RlLWVtcGhhc2l6ZSd8J2V4Y2x1ZGUnXG4gIHNraWxsczoge30gICAgICAgIC8vIHNraWxsX25hbWUgLT4gJ2VtcGhhc2l6ZSd8J2luY2x1ZGUnfCdkZS1lbXBoYXNpemUnfCdleGNsdWRlJ1xufTtcbmxldCBwYWdlRXN0aW1hdGVUaW1lciA9IG51bGw7XG5sZXQgcGFnZUVzdGltYXRlUmVxdWVzdElkID0gMDtcblxuLy8gRHJhZnQgaW5wdXQgY2FjaGUgXHUyMDEzIHByZXNlcnZlcyB1c2VyLXR5cGVkIHZhbHVlcyBhY3Jvc3MgdGFiIHN3aXRjaGVzXG5jb25zdCBfZHJhZnRJbnB1dHMgPSB7fTtcblxuZnVuY3Rpb24gX3NhdmVEcmFmdElucHV0c0ZvclRhYih0YWJOYW1lKSB7XG4gIGlmICghdGFiTmFtZSkgcmV0dXJuO1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgaWYgKCFjb250ZW50KSByZXR1cm47XG4gIGNvbnN0IHNhdmVkID0ge307XG4gIGNvbnRlbnQucXVlcnlTZWxlY3RvckFsbCgndGV4dGFyZWEsIGlucHV0LCBzZWxlY3QnKS5mb3JFYWNoKGVsID0+IHtcbiAgICBpZiAoIWVsLmlkIHx8IGVsLnR5cGUgPT09ICdmaWxlJykgcmV0dXJuO1xuICAgIHNhdmVkW2VsLmlkXSA9IChlbC50eXBlID09PSAnY2hlY2tib3gnIHx8IGVsLnR5cGUgPT09ICdyYWRpbycpID8gZWwuY2hlY2tlZCA6IGVsLnZhbHVlO1xuICB9KTtcbiAgaWYgKE9iamVjdC5rZXlzKHNhdmVkKS5sZW5ndGggPiAwKSB7XG4gICAgX2RyYWZ0SW5wdXRzW3RhYk5hbWVdID0gc2F2ZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gX3Jlc3RvcmVEcmFmdElucHV0c0ZvclRhYih0YWJOYW1lKSB7XG4gIGNvbnN0IGNhY2hlZCA9IF9kcmFmdElucHV0c1t0YWJOYW1lXTtcbiAgaWYgKCFjYWNoZWQpIHJldHVybjtcbiAgT2JqZWN0LmVudHJpZXMoY2FjaGVkKS5mb3JFYWNoKChbaWQsIHZhbHVlXSkgPT4ge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgIGlmICghZWwgfHwgZWwucmVhZE9ubHkgfHwgZWwuZGlzYWJsZWQgfHwgZWwudHlwZSA9PT0gJ2ZpbGUnKSByZXR1cm47XG4gICAgaWYgKGVsLnR5cGUgPT09ICdjaGVja2JveCcgfHwgZWwudHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgZWwuY2hlY2tlZCA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbC52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGVuc3VyZVRhYkRhdGFTdGF0ZSgpIHtcbiAgcmV0dXJuIHN0YXRlTWFuYWdlci5nZXRBbGxUYWJEYXRhKCk7XG59XG5cbmZ1bmN0aW9uIGlzUmVjb25uZWN0SW5Qcm9ncmVzcygpIHtcbiAgcmV0dXJuIHN0YXRlTWFuYWdlci5pc1JlY29ubmVjdGluZygpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgSW5jbHVzaW9uIGNvdW50cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gdXBkYXRlSW5jbHVzaW9uQ291bnRzKCkge1xuICB0cnkge1xuICAgIGNvbnN0IGV4cERlY3MgPSAod2luZG93Ll9zYXZlZERlY2lzaW9ucyAmJiB3aW5kb3cuX3NhdmVkRGVjaXNpb25zLmV4cGVyaWVuY2VfZGVjaXNpb25zKSB8fCB1c2VyU2VsZWN0aW9ucy5leHBlcmllbmNlcyB8fCB7fTtcbiAgICBjb25zdCBza2lsbERlY3MgPSAod2luZG93Ll9zYXZlZERlY2lzaW9ucyAmJiB3aW5kb3cuX3NhdmVkRGVjaXNpb25zLnNraWxsX2RlY2lzaW9ucykgfHwgdXNlclNlbGVjdGlvbnMuc2tpbGxzIHx8IHt9O1xuICAgIGNvbnN0IGFjaERlY3MgPSAod2luZG93Ll9zYXZlZERlY2lzaW9ucyAmJiB3aW5kb3cuX3NhdmVkRGVjaXNpb25zLmFjaGlldmVtZW50X2RlY2lzaW9ucykgfHwgd2luZG93LmFjaGlldmVtZW50RGVjaXNpb25zIHx8IHt9O1xuXG4gICAgY29uc3QgZXhwSW5jbHVkZWQgPSBPYmplY3QudmFsdWVzKGV4cERlY3MpLmZpbHRlcih2ID0+IHYgIT09ICdleGNsdWRlJykubGVuZ3RoO1xuICAgIGNvbnN0IHNraWxsSW5jbHVkZWQgPSBPYmplY3QudmFsdWVzKHNraWxsRGVjcykuZmlsdGVyKHYgPT4gdiAhPT0gJ2V4Y2x1ZGUnKS5sZW5ndGg7XG4gICAgY29uc3QgYWNoSW5jbHVkZWQgPSBPYmplY3QudmFsdWVzKGFjaERlY3MpLmZpbHRlcih2ID0+IHYgIT09ICdleGNsdWRlJykubGVuZ3RoO1xuXG4gICAgY29uc3QgZXhwVGFiID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYi1leHAtcmV2aWV3Jyk7XG4gICAgY29uc3Qgc2tpbGxUYWIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFiLXNraWxscy1yZXZpZXcnKTtcbiAgICBjb25zdCBhY2hUYWIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFiLWFjaGlldmVtZW50cy1yZXZpZXcnKTtcblxuICAgIGlmIChleHBUYWIpIGV4cFRhYi50ZXh0Q29udGVudCA9IGBcdUQ4M0RcdURDQ0EgRXhwZXJpZW5jZXMke2V4cEluY2x1ZGVkID8gJyAoJyArIGV4cEluY2x1ZGVkICsgJyknIDogJyd9YDtcbiAgICBpZiAoc2tpbGxUYWIpIHNraWxsVGFiLnRleHRDb250ZW50ID0gYFx1RDgzRFx1REVFMFx1RkUwRiBTa2lsbHMke3NraWxsSW5jbHVkZWQgPyAnICgnICsgc2tpbGxJbmNsdWRlZCArICcpJyA6ICcnfWA7XG4gICAgaWYgKGFjaFRhYikgYWNoVGFiLnRleHRDb250ZW50ID0gYFx1RDgzQ1x1REZDNiBBY2hpZXZlbWVudHMke2FjaEluY2x1ZGVkID8gJyAoJyArIGFjaEluY2x1ZGVkICsgJyknIDogJyd9YDtcbiAgfSBjYXRjaCAoZSkgeyBsb2cud2FybignRmFpbGVkIHRvIHVwZGF0ZSBpbmNsdXNpb24gY291bnRzOicsIGUpOyB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBHZW5lcmF0ZSBDViB0YWIgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIF9wb3B1bGF0ZUdlbmVyYXRlVGFiKGN2RGF0YSwgY29udGVudCkge1xuICBpZiAoIWN2RGF0YSB8fCAhY3ZEYXRhLmZpbGVzIHx8ICFjdkRhdGEuZmlsZXMubGVuZ3RoKSB7XG4gICAgY29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImVtcHR5LXN0YXRlXCI+PGRpdiBjbGFzcz1cImljb25cIj5cdUQ4M0RcdURDQzQ8L2Rpdj48aDM+R2VuZXJhdGVkIENWPC9oMz48cD5HZW5lcmF0ZSBDViB0byBzZWUgcHJldmlldzwvcD48L2Rpdj4nO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG1ldGEgICAgID0gY3ZEYXRhLm1ldGFkYXRhIHx8IHt9O1xuICBjb25zdCByb2xlICAgICA9IG1ldGEucm9sZSAgICAgfHwgbWV0YS5wb3NpdGlvbiB8fCAnJztcbiAgY29uc3QgY29tcGFueSAgPSBtZXRhLmNvbXBhbnkgIHx8ICcnO1xuICBjb25zdCBzdWJ0aXRsZSA9IHJvbGUgJiYgY29tcGFueSA/IGAke3JvbGV9IFx1MjAxNCAke2NvbXBhbnl9YCA6IHJvbGUgfHwgY29tcGFueSB8fCAnQ1YgZ2VuZXJhdGVkJztcblxuICBjb25zdCBJQ09OUyA9IHsgJy5wZGYnOiAnXHVEODNEXHVEQ0M0JywgJy5kb2N4JzogJ1x1RDgzRFx1RENERCcsICcuaHRtbCc6ICdcdUQ4M0NcdURGMTAnIH07XG4gIGNvbnN0IExBQkVMUyA9IHtcbiAgICAnLnBkZic6ICBmID0+IGYuaW5jbHVkZXMoJ0FUUycpID8gJ0FUUyBQREYnICA6ICdIdW1hbiBQREYnLFxuICAgICcuZG9jeCc6IGYgPT4gZi5pbmNsdWRlcygnQVRTJykgPyAnQVRTIERPQ1gnIDogZi5zdGFydHNXaXRoKCdDb3ZlckxldHRlcl8nKSA/ICdDb3ZlciBMZXR0ZXInIDogJ0h1bWFuIERPQ1gnLFxuICAgICcuaHRtbCc6ICgpID0+ICdIVE1MJyxcbiAgfTtcblxuICBjb25zdCBkb3dubG9hZGFibGVFeHRzID0gbmV3IFNldChbJy5wZGYnLCAnLmRvY3gnLCAnLmh0bWwnXSk7XG4gIGNvbnN0IGZpbGVzID0gKGN2RGF0YS5maWxlcyB8fCBbXSkuZmlsdGVyKGYgPT4ge1xuICAgIGNvbnN0IGV4dCA9IGYuc2xpY2UoZi5sYXN0SW5kZXhPZignLicpKS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiBkb3dubG9hZGFibGVFeHRzLmhhcyhleHQpICYmIGYgIT09ICdqb2JfZGVzY3JpcHRpb24udHh0JztcbiAgfSk7XG5cbiAgY29uc3Qgc2lkID0gdHlwZW9mIGdldFNlc3Npb25JZEZyb21VUkwgPT09ICdmdW5jdGlvbicgPyBnZXRTZXNzaW9uSWRGcm9tVVJMKCkgOiBudWxsO1xuICBjb25zdCBzZXNzaW9uUGFyYW0gPSBzaWQgPyBgP3Nlc3Npb25faWQ9JHtlbmNvZGVVUklDb21wb25lbnQoc2lkKX1gIDogJyc7XG5cbiAgbGV0IGZpbGVSb3dzID0gJyc7XG4gIGZvciAoY29uc3QgZiBvZiBmaWxlcykge1xuICAgIGNvbnN0IGV4dCAgID0gZi5zbGljZShmLmxhc3RJbmRleE9mKCcuJykpLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgaWNvbiAgPSBJQ09OU1tleHRdICB8fCAnXHVEODNEXHVEQ0MxJztcbiAgICBjb25zdCBsYWJlbCA9IExBQkVMU1tleHRdID8gTEFCRUxTW2V4dF0oZikgOiBmO1xuICAgIGZpbGVSb3dzICs9IGBcbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDoxMnB4O3BhZGRpbmc6MTBweCAwO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNmMWY1Zjk7XCI+XG4gICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjEuNGVtO1wiPiR7aWNvbn08L3NwYW4+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJmbGV4OjE7bWluLXdpZHRoOjA7XCI+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOiMzNzQxNTE7XCI+JHtsYWJlbH08L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuNzhlbTtjb2xvcjojOWNhM2FmO3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztcIj4ke2VzY2FwZUh0bWwoZil9PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8YSBocmVmPVwiL2FwaS9kb3dubG9hZC8ke2VuY29kZVVSSUNvbXBvbmVudChmKX0ke3Nlc3Npb25QYXJhbX1cIiBkb3dubG9hZD1cIiR7ZXNjYXBlSHRtbChmKX1cIlxuICAgICAgICAgICBjbGFzcz1cImJ0bi1zZWNvbmRhcnlcIiBzdHlsZT1cInBhZGRpbmc6NnB4IDE0cHg7Zm9udC1zaXplOjAuODVlbTt0ZXh0LWRlY29yYXRpb246bm9uZTtkaXNwbGF5OmlubGluZS1ibG9jaztcIj5Eb3dubG9hZDwvYT5cbiAgICAgIDwvZGl2PmA7XG4gIH1cblxuICBjb250ZW50LmlubmVySFRNTCA9IGBcbiAgICA8ZGl2IHN0eWxlPVwibWF4LXdpZHRoOjY0MHB4O21hcmdpbjowIGF1dG87cGFkZGluZzoyNHB4IDA7XCI+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTJweDttYXJnaW4tYm90dG9tOjI0cHg7XCI+XG4gICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjJlbTtcIj5cdTI3MDU8L3NwYW4+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGgyIHN0eWxlPVwibWFyZ2luOjA7Zm9udC1zaXplOjEuMmVtO2NvbG9yOiMxMTE4Mjc7XCI+Q1YgR2VuZXJhdGVkPC9oMj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuOWVtO2NvbG9yOiM2YjcyODA7XCI+JHtlc2NhcGVIdG1sKHN1YnRpdGxlKX08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZmY7Ym9yZGVyOjFweCBzb2xpZCAjZTJlOGYwO2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MCAxNnB4O21hcmdpbi1ib3R0b206MjRweDtcIj5cbiAgICAgICAgJHtmaWxlUm93c31cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cIm5hdi1idXR0b25zIG5hdi1lbmRcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbnRpbnVlLWJ0blwiIG9uY2xpY2s9XCJzd2l0Y2hUYWIoJ2xheW91dCcpXCI+T3BlbiBMYXlvdXQgUmV2aWV3IFx1MjE5MjwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+YDtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFRhYiBzd2l0Y2hpbmcgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8vIFRyYWNrcyB3aGljaCBjdXN0b21pc2Utc3RhZ2Ugc3ViLXRhYnMgaGF2ZSBiZWVuIHZpZXdlZCB0aGlzIHNlc3Npb24gKEdBUC0yNjkpLlxuY29uc3QgX3Zpc2l0ZWRDdXN0b21pc2VUYWJzID0gbmV3IFNldCgpO1xuY29uc3QgX0NVU1RPTUlTRV9UQUJTID0gbmV3IFNldChbJ2dvYWxzJywgJ3F1ZXN0aW9ucycsICdleHAtcmV2aWV3JywgJ2FjaC1lZGl0b3InLCAnc2tpbGxzLXJldmlldycsICdhY2hpZXZlbWVudHMtcmV2aWV3JywgJ3RhZ2xpbmUtcmV2aWV3JywgJ3N1bW1hcnktcmV2aWV3JywgJ3B1YmxpY2F0aW9ucy1yZXZpZXcnLCAnYXRzLXNjb3JlJ10pO1xuXG5mdW5jdGlvbiBfdXBkYXRlVmlzaXRlZFRhYkluZGljYXRvcnMoKSB7XG4gIF92aXNpdGVkQ3VzdG9taXNlVGFicy5mb3JFYWNoKG5hbWUgPT4ge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHRhYi0ke25hbWV9YCk7XG4gICAgaWYgKGVsKSBlbC5jbGFzc0xpc3QuYWRkKCd0YWItLXZpc2l0ZWQnKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHN3aXRjaFRhYih0YWIpIHtcbiAgLy8gQ2xlYXIga2V5Ym9hcmQtZm9jdXNlZCBjYXJkIHN0YXRlIHdoZW4gbGVhdmluZyBhIHJldmlldyB0YWJcbiAgaWYgKHR5cGVvZiByZXNldENhcmRGb2N1cyA9PT0gJ2Z1bmN0aW9uJykgcmVzZXRDYXJkRm9jdXMoKTtcblxuICAvLyBTYXZlIHVuc2F2ZWQgdXNlciBpbnB1dCBmcm9tIHRoZSB0YWIgd2UgYXJlIGxlYXZpbmdcbiAgX3NhdmVEcmFmdElucHV0c0ZvclRhYihzdGF0ZU1hbmFnZXIuZ2V0Q3VycmVudFRhYigpKTtcblxuICAvLyBTeW5jIHNlY29uZC1iYXIgdmlzaWJpbGl0eSB0byB0aGlzIHRhYidzIHN0YWdlXG4gIGlmICh0eXBlb2YgZ2V0U3RhZ2VGb3JUYWIgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHVwZGF0ZVRhYkJhckZvclN0YWdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY29uc3QgdGFiU3RhZ2UgPSBnZXRTdGFnZUZvclRhYih0YWIpO1xuICAgIGlmICh0YWJTdGFnZSkge1xuICAgICAgdXBkYXRlVGFiQmFyRm9yU3RhZ2UodGFiU3RhZ2UpO1xuICAgICAgdXBkYXRlQWN0aW9uQnV0dG9ucyh0YWJTdGFnZSk7XG4gICAgfVxuICB9XG4gIC8vIEFsd2F5cyB1cGRhdGUgd29ya2Zsb3cgY2xpY2thYmxlIHN0YXRlIHVzaW5nIGN1cnJlbnQgcGhhc2VcbiAgaWYgKHR5cGVvZiBzdGF0ZU1hbmFnZXI/LmdldFBoYXNlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB1cGRhdGVXb3JrZmxvd1N0ZXBzQ2xpY2thYmxlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdXBkYXRlV29ya2Zsb3dTdGVwc0NsaWNrYWJsZShzdGF0ZU1hbmFnZXIuZ2V0UGhhc2UoKSk7XG4gIH1cblxuICAvLyBVcGRhdGUgYWN0aXZlIHRhYiwgQVJJQSBzdGF0ZSwgYW5kIHJvdmluZyB0YWJpbmRleCAoV0NBRyAyLjEgdGFibGlzdCBwYXR0ZXJuKVxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudGFiJykuZm9yRWFjaCh0ID0+IHtcbiAgICB0LmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgIHQuc2V0QXR0cmlidXRlKCdhcmlhLXNlbGVjdGVkJywgJ2ZhbHNlJyk7XG4gICAgdC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJy0xJyk7XG4gIH0pO1xuICBjb25zdCBhY3RpdmVUYWIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgdGFiLSR7dGFifWApO1xuICBpZiAoYWN0aXZlVGFiKSB7XG4gICAgYWN0aXZlVGFiLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgIGFjdGl2ZVRhYi5zZXRBdHRyaWJ1dGUoJ2FyaWEtc2VsZWN0ZWQnLCAndHJ1ZScpO1xuICAgIGFjdGl2ZVRhYi5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTtcbiAgICBjb25zdCB0YWJwYW5lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gICAgaWYgKHRhYnBhbmVsKSB0YWJwYW5lbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWxsZWRieScsIGB0YWItJHt0YWJ9YCk7XG4gIH1cbiAgc3RhdGVNYW5hZ2VyLnNldEN1cnJlbnRUYWIodGFiKTtcblxuICAvLyBNYXJrIHRoaXMgdGFiIGFzIHZpc2l0ZWQgYW5kIHJlZnJlc2ggdGhlIHZpc2l0ZWQgaW5kaWNhdG9ycyAoR0FQLTI2OSlcbiAgaWYgKF9DVVNUT01JU0VfVEFCUy5oYXModGFiKSkge1xuICAgIF92aXNpdGVkQ3VzdG9taXNlVGFicy5hZGQodGFiKTtcbiAgICBfdXBkYXRlVmlzaXRlZFRhYkluZGljYXRvcnMoKTtcbiAgfVxuXG4gIC8vIEFubm91bmNlIHRoZSB0YWIgY2hhbmdlIHRvIHNjcmVlbiByZWFkZXJzIChHQVAtNzMpXG4gIGNvbnN0IGFubm91bmNlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd3b3JrZmxvdy1zdGFnZS1hbm5vdW5jZXInKTtcbiAgaWYgKGFubm91bmNlciAmJiBhY3RpdmVUYWIpIHtcbiAgICBhbm5vdW5jZXIudGV4dENvbnRlbnQgPSAnJztcbiAgICBzZXRUaW1lb3V0KCgpID0+IHsgYW5ub3VuY2VyLnRleHRDb250ZW50ID0gYE5vdyB2aWV3aW5nOiAke2FjdGl2ZVRhYi50ZXh0Q29udGVudC50cmltKCl9YDsgfSwgNTApO1xuICB9XG5cbiAgLy8gU3luYyB2aWV3LWN1cnNvciByaW5nIHRvIHRoZSBuZXdseSB2aXNpYmxlIHRhYlxuICBpZiAodHlwZW9mIF91cGRhdGVWaWV3aW5nSW5kaWNhdG9yID09PSAnZnVuY3Rpb24nKSBfdXBkYXRlVmlld2luZ0luZGljYXRvcih0YWIpO1xuXG4gIC8vIEFsbCB0YWJzIGV4Y2VwdCAnY3YnIHVzZSBmdWxsLXdpZHRoIGxheW91dCAobm8gcGFwZXItc2l6ZWQgY2VudGVyaW5nKVxuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgY29udGVudC5jbGFzc0xpc3QudG9nZ2xlKCdmdWxsLXdpZHRoJywgdGFiICE9PSAnZ2VuZXJhdGUnKTtcblxuICAvLyBMb2FkIGNvbnRlbnQgZm9yIHRhYlxuICBsb2FkVGFiQ29udGVudCh0YWIpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBsb2FkVGFiQ29udGVudCh0YWIpIHtcbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIGNvbnN0IHRhYkRhdGEgPSBlbnN1cmVUYWJEYXRhU3RhdGUoKTtcblxuICB0cnkge1xuICBzd2l0Y2ggKHRhYikge1xuICAgIGNhc2UgJ2pvYic6XG4gICAgICBhd2FpdCBwb3B1bGF0ZUpvYlRhYigpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZ29hbHMnOlxuICAgICAgaWYgKHR5cGVvZiBwb3B1bGF0ZUdvYWxzVGFiID09PSAnZnVuY3Rpb24nKSBhd2FpdCBwb3B1bGF0ZUdvYWxzVGFiKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdhbmFseXNpcyc6XG4gICAgICBpZiAodGFiRGF0YS5hbmFseXNpcykge1xuICAgICAgICBwb3B1bGF0ZUFuYWx5c2lzVGFiKHRhYkRhdGEuYW5hbHlzaXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImVtcHR5LXN0YXRlXCI+PGRpdiBjbGFzcz1cImljb25cIj5cdUQ4M0RcdUREMEQ8L2Rpdj48aDM+Sm9iIEFuYWx5c2lzPC9oMz48cD5DbGljayBcIkFuYWx5emUgSm9iXCIgdG8gZ2VuZXJhdGUgYW5hbHlzaXM8L3A+PC9kaXY+JztcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3F1ZXN0aW9ucyc6XG4gICAgICBwb3B1bGF0ZVF1ZXN0aW9uc1RhYigpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnY3VzdG9taXphdGlvbnMnOlxuICAgICAgc3dpdGNoVGFiKCdleHAtcmV2aWV3Jyk7XG4gICAgICByZXR1cm47XG4gICAgY2FzZSAnZXhwLXJldmlldyc6XG4gICAgICBhd2FpdCBwb3B1bGF0ZVJldmlld1RhYignZXhwZXJpZW5jZXMnKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2FjaC1lZGl0b3InOlxuICAgICAgYXdhaXQgYnVpbGRBY2hpZXZlbWVudHNFZGl0b3IoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3NraWxscy1yZXZpZXcnOlxuICAgICAgYXdhaXQgcG9wdWxhdGVSZXZpZXdUYWIoJ3NraWxscycpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYWNoaWV2ZW1lbnRzLXJldmlldyc6XG4gICAgICBhd2FpdCBwb3B1bGF0ZVJldmlld1RhYignYWNoaWV2ZW1lbnRzJyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd0YWdsaW5lLXJldmlldyc6XG4gICAgICBhd2FpdCBwb3B1bGF0ZVRhZ2xpbmVSZXZpZXdUYWIoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3N1bW1hcnktcmV2aWV3JzpcbiAgICAgIGF3YWl0IHBvcHVsYXRlUmV2aWV3VGFiKCdzdW1tYXJ5Jyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdwdWJsaWNhdGlvbnMtcmV2aWV3JzpcbiAgICAgIGF3YWl0IHBvcHVsYXRlUmV2aWV3VGFiKCdwdWJsaWNhdGlvbnMnKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2F0cy1zY29yZSc6XG4gICAgICBpZiAodHlwZW9mIHBvcHVsYXRlQXRzU2NvcmVUYWIgPT09ICdmdW5jdGlvbicpIGF3YWl0IHBvcHVsYXRlQXRzU2NvcmVUYWIoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3Jld3JpdGUnOlxuICAgICAgaWYgKHdpbmRvdy5fcmV3cml0ZVBhbmVsQ2FjaGUpIHtcbiAgICAgICAgcmVuZGVyUmV3cml0ZVBhbmVsKFxuICAgICAgICAgIHdpbmRvdy5fcmV3cml0ZVBhbmVsQ2FjaGUucmV3cml0ZXMsXG4gICAgICAgICAgd2luZG93Ll9yZXdyaXRlUGFuZWxDYWNoZS53YXJuaW5ncyxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJlbXB0eS1zdGF0ZVwiPjxkaXYgY2xhc3M9XCJpY29uXCI+XHUyNzBGXHVGRTBGPC9kaXY+PGgzPlJld3JpdGVzPC9oMz48cD5Mb2FkaW5nIHJld3JpdGVzXHUyMDI2PC9wPjwvZGl2Pic7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGFwaUNhbGwoJ0dFVCcsICcvYXBpL3Jld3JpdGVzJyk7XG4gICAgICAgICAgaWYgKGRhdGEucmV3cml0ZXMpIHtcbiAgICAgICAgICAgIHJlbmRlclJld3JpdGVQYW5lbChkYXRhLnJld3JpdGVzLCBkYXRhLnBlcnN1YXNpb25fd2FybmluZ3MgfHwgW10pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb250ZW50LmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwiZW1wdHktc3RhdGVcIj48ZGl2IGNsYXNzPVwiaWNvblwiPlx1MjcwRlx1RkUwRjwvZGl2PjxoMz5SZXdyaXRlczwvaDM+PHA+Q29tcGxldGUgY3VzdG9taXphdGlvbnMgdG8gcmVhY2ggdGhpcyBzdGVwPC9wPjwvZGl2Pic7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImVtcHR5LXN0YXRlXCI+PGRpdiBjbGFzcz1cImljb25cIj5cdTI3MEZcdUZFMEY8L2Rpdj48aDM+UmV3cml0ZXM8L2gzPjxwPkNvbXBsZXRlIGN1c3RvbWl6YXRpb25zIHRvIHJlYWNoIHRoaXMgc3RlcDwvcD48L2Rpdj4nO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdlZGl0b3InOlxuICAgICAgYXdhaXQgcG9wdWxhdGVDVkVkaXRvclRhYigpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZ2VuZXJhdGUnOlxuICAgICAgX3BvcHVsYXRlR2VuZXJhdGVUYWIodGFiRGF0YS5jdiwgY29udGVudCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdkb3dubG9hZCc6XG4gICAgICBpZiAodGFiRGF0YS5jdiAmJiBPYmplY3Qua2V5cyh0YWJEYXRhLmN2KS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGF3YWl0IHBvcHVsYXRlRG93bmxvYWRUYWIodGFiRGF0YS5jdik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250ZW50LmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwiZW1wdHktc3RhdGVcIj48ZGl2IGNsYXNzPVwiaWNvblwiPlx1MkIwN1x1RkUwRjwvZGl2PjxoMz5Eb3dubG9hZDwvaDM+PHA+R2VuZXJhdGUgQ1YgdG8gZW5hYmxlIGRvd25sb2FkczwvcD48L2Rpdj4nO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc3BlbGwnOlxuICAgICAgYXdhaXQgcG9wdWxhdGVTcGVsbENoZWNrVGFiKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdsYXlvdXQnOlxuICAgICAgaW5pdGlhdGVMYXlvdXRJbnN0cnVjdGlvbnMoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2ZpbmFsaXNlJzpcbiAgICAgIGF3YWl0IHBvcHVsYXRlRmluYWxpc2VUYWIoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2hhcnZlc3QnOlxuICAgICAgaWYgKHR5cGVvZiBwb3B1bGF0ZUhhcnZlc3RUYWIgPT09ICdmdW5jdGlvbicpIGF3YWl0IHBvcHVsYXRlSGFydmVzdFRhYigpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnaW50ZXJ2aWV3LXByZXAnOlxuICAgICAgaWYgKHR5cGVvZiBwb3B1bGF0ZUludGVydmlld1ByZXBUYWIgPT09ICdmdW5jdGlvbicpIGF3YWl0IHBvcHVsYXRlSW50ZXJ2aWV3UHJlcFRhYigpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndGhhbmsteW91JzpcbiAgICAgIGlmICh0eXBlb2YgcG9wdWxhdGVUaGFua1lvdVRhYiA9PT0gJ2Z1bmN0aW9uJykgYXdhaXQgcG9wdWxhdGVUaGFua1lvdVRhYigpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnbWFzdGVyJzpcbiAgICAgIGF3YWl0IHBvcHVsYXRlTWFzdGVyVGFiKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdjb3Zlci1sZXR0ZXInOlxuICAgICAgYXdhaXQgcG9wdWxhdGVDb3ZlckxldHRlclRhYigpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc2NyZWVuaW5nJzpcbiAgICAgIGF3YWl0IHBvcHVsYXRlU2NyZWVuaW5nVGFiKCk7XG4gICAgICBicmVhaztcbiAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy5lcnJvcihgRXJyb3IgbG9hZGluZyB0YWIgJHt0YWJ9OmAsIGVycm9yKTtcbiAgICAvLyB0ZXh0Q29udGVudCwgbm90IGlubmVySFRNTCBcdTIwMTQgYSB0aHJvd24gZXJyb3IgbWVzc2FnZSBtdXN0IG5ldmVyIGJlXG4gICAgLy8gaW50ZXJwcmV0ZWQgYXMgSFRNTCAoZS5nLiBhbiBlcnJvciBzdHJpbmcgY29udGFpbmluZyBhIHN0cmF5IDxpbWc+KS5cbiAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7XG4gICAgZXJyb3JNZXNzYWdlLnN0eWxlLmNzc1RleHQgPSAncGFkZGluZzogMjBweDsgY29sb3I6ICNjNDFlM2E7JztcbiAgICBlcnJvck1lc3NhZ2UudGV4dENvbnRlbnQgPSBgRXJyb3IgbG9hZGluZyBjb250ZW50OiAke2Vycm9yLm1lc3NhZ2V9YDtcbiAgICBjb250ZW50LmFwcGVuZENoaWxkKGVycm9yTWVzc2FnZSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gUmVzdG9yZSB1bnNhdmVkIHVzZXIgaW5wdXQgZm9yIHRoZSBuZXdseSBsb2FkZWQgdGFiXG4gIF9yZXN0b3JlRHJhZnRJbnB1dHNGb3JUYWIodGFiKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFJldmlldyB0YWIgKGZsYXQsIG9uZSBwYW5lIHBlciB0b3AtbGV2ZWwgdGFiKSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gc2hvd1RhYmxlQmFzZWRSZXZpZXcoKSB7XG4gIGlmICghd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnMpIHtcbiAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCAnTm8gcmVjb21tZW5kYXRpb25zIHRvIHJldmlldy4gUGxlYXNlIGdlbmVyYXRlIGN1c3RvbWl6YXRpb25zIGZpcnN0LicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHN3aXRjaFRhYignZXhwLXJldmlldycpO1xuICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCAnXHUyNzA1IEN1c3RvbWl6YXRpb25zIGdlbmVyYXRlZCEgUGxlYXNlIHJldmlldyBlYWNoIHNlY3Rpb24gaW4gdGhlICoqQ3VzdG9taXphdGlvbnMqKiB0YWIgXHUyMDE0IEV4cGVyaWVuY2VzLCBBY2hpZXZlbWVudHMsIFNraWxscywgU3VtbWFyeSwgYW5kIFB1YmxpY2F0aW9ucy4gU2VsZWN0IHlvdXIgcHJlZmVyZW5jZXMgdXNpbmcgdGhlIGFjdGlvbiBidXR0b25zLCB0aGVuIHN1Ym1pdCB5b3VyIGRlY2lzaW9ucy4nKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEFuYWx5c2lzIHRhYiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLy8gQ2FjaGVkIHN5bm9ueW0gbWFwOiBhbGlhcyAobG93ZXIpIFx1MjE5MiBjYW5vbmljYWwsIGFuZCBjYW5vbmljYWwgKGxvd2VyKSBcdTIxOTIgW2FsaWFzZXNdXG5sZXQgX3N5bm9ueW1NYXBDYWNoZSA9IG51bGw7XG5hc3luYyBmdW5jdGlvbiBfbG9hZFN5bm9ueW1NYXAoKSB7XG4gIGlmIChfc3lub255bU1hcENhY2hlKSByZXR1cm4gX3N5bm9ueW1NYXBDYWNoZTtcbiAgdHJ5IHtcbiAgICBjb25zdCBzZXNzaW9uSWQgPSBzdGF0ZU1hbmFnZXIuZ2V0U2Vzc2lvbklkICYmIHN0YXRlTWFuYWdlci5nZXRTZXNzaW9uSWQoKTtcbiAgICBjb25zdCB1cmwgPSBzZXNzaW9uSWQgPyBgL2FwaS9zeW5vbnltLW1hcD9zZXNzaW9uX2lkPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHNlc3Npb25JZCl9YCA6ICcvYXBpL3N5bm9ueW0tbWFwJztcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICBpZiAoIXJlcy5vaykgcmV0dXJuIChfc3lub255bU1hcENhY2hlID0ge30pO1xuICAgIGNvbnN0IHJhdyAgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGNvbnN0IGFsaWFzVG9DYW5vbiA9IHt9O1xuICAgIGNvbnN0IGNhbm9uVG9BbGlhc2VzID0ge307XG4gICAgT2JqZWN0LmVudHJpZXMocmF3KS5mb3JFYWNoKChbYWxpYXMsIGNhbm9uXSkgPT4ge1xuICAgICAgYWxpYXNUb0Nhbm9uW2FsaWFzLnRvTG93ZXJDYXNlKCldID0gY2Fub247XG4gICAgICBjb25zdCBjbCA9IGNhbm9uLnRvTG93ZXJDYXNlKCk7XG4gICAgICAoY2Fub25Ub0FsaWFzZXNbY2xdID0gY2Fub25Ub0FsaWFzZXNbY2xdIHx8IFtdKS5wdXNoKGFsaWFzKTtcbiAgICB9KTtcbiAgICBfc3lub255bU1hcENhY2hlID0geyBhbGlhc1RvQ2Fub24sIGNhbm9uVG9BbGlhc2VzIH07XG4gIH0gY2F0Y2ggKF8pIHsgX3N5bm9ueW1NYXBDYWNoZSA9IHt9OyB9XG4gIHJldHVybiBfc3lub255bU1hcENhY2hlO1xufVxuXG5mdW5jdGlvbiBfa3dTeW5vbnltQW5ub3RhdGlvbihrdywgc3luTWFwKSB7XG4gIGlmICghc3luTWFwIHx8ICghc3luTWFwLmFsaWFzVG9DYW5vbiAmJiAhc3luTWFwLmNhbm9uVG9BbGlhc2VzKSkgcmV0dXJuICcnO1xuICBjb25zdCBrbCA9IGt3LnRvTG93ZXJDYXNlKCk7XG4gIC8vIElzIGt3IGFuIGFsaWFzPyBTaG93IGNhbm9uaWNhbCBmb3JtLlxuICBpZiAoc3luTWFwLmFsaWFzVG9DYW5vbltrbF0pIHJldHVybiBgID0gJHtzeW5NYXAuYWxpYXNUb0Nhbm9uW2tsXX1gO1xuICAvLyBJcyBrdyBhIGNhbm9uaWNhbCBmb3JtPyBTaG93IGFsaWFzZXMuXG4gIGNvbnN0IGFsaWFzZXMgPSBzeW5NYXAuY2Fub25Ub0FsaWFzZXMgJiYgc3luTWFwLmNhbm9uVG9BbGlhc2VzW2tsXTtcbiAgaWYgKGFsaWFzZXMgJiYgYWxpYXNlcy5sZW5ndGgpIHJldHVybiBgICgke2FsaWFzZXMuam9pbignLCAnKX0pYDtcbiAgcmV0dXJuICcnO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwb3B1bGF0ZUFuYWx5c2lzVGFiKHJlc3VsdCkge1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgdHJ5IHtcbiAgICAvLyByZXN1bHQgbWF5IGFscmVhZHkgYmUgYSBwYXJzZWQgb2JqZWN0IChlLmcuIGNvbWluZyBmcm9tIHN0YXRlTWFuYWdlcikgb3IgYVxuICAgIC8vIHJhdyBKU09OIHN0cmluZy4gIGNsZWFuSnNvblJlc3BvbnNlIG9ubHkgaGFuZGxlcyBzdHJpbmdzLCBzbyBza2lwIGl0IHdoZW5cbiAgICAvLyB0aGUgdmFsdWUgaXMgYWxyZWFkeSBhbiBvYmplY3QgdG8gYXZvaWQgXCJjbGVhbmVkLnJlcGxhY2UgaXMgbm90IGEgZnVuY3Rpb25cIi5cbiAgICBsZXQgZGF0YTtcbiAgICBpZiAocmVzdWx0ICE9PSBudWxsICYmIHR5cGVvZiByZXN1bHQgPT09ICdvYmplY3QnKSB7XG4gICAgICBkYXRhID0gcmVzdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjbGVhblJlc3VsdCA9IGNsZWFuSnNvblJlc3BvbnNlKHJlc3VsdCk7XG4gICAgICBkYXRhID0gdHlwZW9mIGNsZWFuUmVzdWx0ID09PSAnc3RyaW5nJyA/IEpTT04ucGFyc2UoY2xlYW5SZXN1bHQpIDogY2xlYW5SZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8gUGVyc2lzdCBvbmx5IGFmdGVyIHRoZSBhbmFseXNpcyBwYXlsb2FkIGhhcyBiZWVuIHZhbGlkYXRlZC5cbiAgICBzdGF0ZU1hbmFnZXIuc2V0VGFiRGF0YSgnYW5hbHlzaXMnLCByZXN1bHQpO1xuICAgIHNhdmVUYWJEYXRhKCk7XG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgU2VjdGlvbiAxOiBSb2xlICYgRG9tYWluIGNhcmQgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgbGV0IGh0bWwgPSAnPGRpdiBjbGFzcz1cImFuYWx5c2lzLXBhZ2VcIj4nO1xuICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJhbmFseXNpcy1yb2xlLWNhcmRcIj4nO1xuICAgIGh0bWwgKz0gYDxoMT4ke2RhdGEudGl0bGUgfHwgJ1JvbGUnfTwvaDE+YDtcbiAgICBpZiAoZGF0YS5jb21wYW55KSBodG1sICs9IGA8cCBjbGFzcz1cImNvbXBhbnlcIj5cdUQ4M0NcdURGRTIgJHtkYXRhLmNvbXBhbnl9PC9wPmA7XG4gICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cIm1ldGFcIj4nO1xuICAgIGlmIChkYXRhLmRvbWFpbikge1xuICAgICAgY29uc3QgY29uZiA9IGRhdGEuZG9tYWluX2NvbmZpZGVuY2U7XG4gICAgICBsZXQgY29uZkxhYmVsID0gJyc7XG4gICAgICBsZXQgY29uZlRpdGxlID0gJyc7XG4gICAgICBpZiAodHlwZW9mIGNvbmYgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGlmIChjb25mID49IDAuOCkgeyBjb25mTGFiZWwgPSAnJzsgY29uZlRpdGxlID0gYERvbWFpbiBjb25maWRlbmNlOiBIaWdoICgke01hdGgucm91bmQoY29uZiAqIDEwMCl9JSlgOyB9XG4gICAgICAgIGVsc2UgaWYgKGNvbmYgPj0gMC42KSB7IGNvbmZMYWJlbCA9ICcgXHUyNkEwJzsgY29uZlRpdGxlID0gYERvbWFpbiBjb25maWRlbmNlOiBNZWRpdW0gKCR7TWF0aC5yb3VuZChjb25mICogMTAwKX0lKSBcdTIwMTQgdmVyaWZ5IHRoaXMgaXMgY29ycmVjdGA7IH1cbiAgICAgICAgZWxzZSB7IGNvbmZMYWJlbCA9ICcgXHUyNkEwJzsgY29uZlRpdGxlID0gYERvbWFpbiBjb25maWRlbmNlOiBMb3cgKCR7TWF0aC5yb3VuZChjb25mICogMTAwKX0lKSBcdTIwMTQgdGhlIEpEIHNwYW5zIG11bHRpcGxlIGRvbWFpbnM7IGNvbnNpZGVyIG92ZXJyaWRpbmdgOyB9XG4gICAgICB9XG4gICAgICBodG1sICs9IGA8c3BhbiBjbGFzcz1cIm1ldGEtY2hpcFwiIHRpdGxlPVwiJHtlc2NhcGVIdG1sKGNvbmZUaXRsZSB8fCAnSW5mZXJyZWQgdGVjaG5pY2FsIGRvbWFpbicpfVwiPlx1RDgzRFx1REQyQyAke2VzY2FwZUh0bWwoZGF0YS5kb21haW4pfSR7Y29uZkxhYmVsfTwvc3Bhbj5gO1xuICAgIH1cbiAgICBpZiAoZGF0YS5yb2xlX2xldmVsKSBodG1sICs9IGA8c3BhbiBjbGFzcz1cIm1ldGEtY2hpcFwiPlx1RDgzRFx1RENDQSAke2RhdGEucm9sZV9sZXZlbH08L3NwYW4+YDtcbiAgICBpZiAoZGF0YS5zdWdnZXN0ZWRfc3VtbWFyeSkgaHRtbCArPSBgPHNwYW4gY2xhc3M9XCJtZXRhLWNoaXBcIj5cdUQ4M0RcdURDQUMgJHtkYXRhLnN1Z2dlc3RlZF9zdW1tYXJ5fTwvc3Bhbj5gO1xuICAgIGh0bWwgKz0gJzwvZGl2PjwvZGl2Pic7XG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgTWlzbWF0Y2ggY2FsbG91dCAoY29tcHV0ZWQgZnJvbSBtYXN0ZXIgc2tpbGxzKSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICBjb25zdCByZXF1aXJlZFNraWxscyA9IEFycmF5LmlzQXJyYXkoZGF0YS5yZXF1aXJlZF9za2lsbHMpID8gZGF0YS5yZXF1aXJlZF9za2lsbHMgOiBbXTtcbiAgICBjb25zdCBtYXN0ZXJTa2lsbHMgPSB3aW5kb3cuX21hc3RlclNraWxscyB8fCBbXTtcbiAgICBpZiAocmVxdWlyZWRTa2lsbHMubGVuZ3RoID4gMCAmJiBtYXN0ZXJTa2lsbHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbWlzc2luZyA9IHJlcXVpcmVkU2tpbGxzLmZpbHRlcihza2lsbCA9PlxuICAgICAgICAhbWFzdGVyU2tpbGxzLnNvbWUobXMgPT4gbXMuaW5jbHVkZXMoc2tpbGwudG9Mb3dlckNhc2UoKSkgfHwgc2tpbGwudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhtcykpXG4gICAgICApO1xuICAgICAgaWYgKG1pc3NpbmcubGVuZ3RoID4gMCkge1xuICAgICAgICBodG1sICs9IGA8ZGl2IGNsYXNzPVwibWlzbWF0Y2gtY2FsbG91dFwiPlx1MjZBMCA8c3Ryb25nPiR7bWlzc2luZy5sZW5ndGh9IHJlcXVpcmVkIHNraWxsJHttaXNzaW5nLmxlbmd0aCA+IDEgPyAncycgOiAnJ30gbm90IGZvdW5kIGluIHlvdXIgbWFzdGVyIENWOjwvc3Ryb25nPiAke21pc3Npbmcuam9pbignLCAnKX08L2Rpdj5gO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFx1MjUwMFx1MjUwMCBTZWN0aW9uIDI6IFJlcXVpcmVkIFNraWxscyBncmlkIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIGlmIChyZXF1aXJlZFNraWxscy5sZW5ndGggPiAwKSB7XG4gICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwiYW5hbHlzaXMtc2VjdGlvblwiPjxoMj5cdUQ4M0NcdURGQUYgUmVxdWlyZWQgU2tpbGxzPC9oMj48ZGl2IGNsYXNzPVwic2tpbGwtZ3JpZFwiPic7XG4gICAgICByZXF1aXJlZFNraWxscy5mb3JFYWNoKHNraWxsID0+IHtcbiAgICAgICAgY29uc3QgaXNNaXNzaW5nID0gbWFzdGVyU2tpbGxzLmxlbmd0aCA+IDAgJiYgIW1hc3RlclNraWxscy5zb21lKFxuICAgICAgICAgIG1zID0+IG1zLmluY2x1ZGVzKHNraWxsLnRvTG93ZXJDYXNlKCkpIHx8IHNraWxsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobXMpXG4gICAgICAgICk7XG4gICAgICAgIGh0bWwgKz0gYDxzcGFuIGNsYXNzPVwic2tpbGwtYmFkZ2Uke2lzTWlzc2luZyA/ICcgbWlzc2luZycgOiAnJ31cIiB0aXRsZT1cIiR7aXNNaXNzaW5nID8gJ05vdCBpbiBtYXN0ZXIgQ1YnIDogJ0ZvdW5kIGluIG1hc3RlciBDVid9XCI+JHtza2lsbH0ke2lzTWlzc2luZyA/ICc8c3BhbiBjbGFzcz1cInNyLW9ubHlcIj4gKG5vdCBpbiBtYXN0ZXIgQ1YpPC9zcGFuPicgOiAnJ308L3NwYW4+YDtcbiAgICAgIH0pO1xuICAgICAgaHRtbCArPSAnPC9kaXY+PC9kaXY+JztcbiAgICB9XG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgU2VjdGlvbiAzOiBQcmVmZXJyZWQgLyBOaWNlLXRvLUhhdmUgbGlzdCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICBjb25zdCBwcmVmZXJyZWQgPSBbXG4gICAgICAuLi4oQXJyYXkuaXNBcnJheShkYXRhLnByZWZlcnJlZF9za2lsbHMpID8gZGF0YS5wcmVmZXJyZWRfc2tpbGxzIDogW10pLFxuICAgICAgLi4uKEFycmF5LmlzQXJyYXkoZGF0YS5uaWNlX3RvX2hhdmVfcmVxdWlyZW1lbnRzKSA/IGRhdGEubmljZV90b19oYXZlX3JlcXVpcmVtZW50cyA6IFtdKSxcbiAgICBdO1xuICAgIGlmIChwcmVmZXJyZWQubGVuZ3RoID4gMCkge1xuICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cImFuYWx5c2lzLXNlY3Rpb25cIj48aDI+XHUyQjUwIFByZWZlcnJlZCAvIE5pY2UtdG8tSGF2ZTwvaDI+PHVsIGNsYXNzPVwicHJlZmVycmVkLWxpc3RcIj4nO1xuICAgICAgcHJlZmVycmVkLmZvckVhY2goaXRlbSA9PiB7IGh0bWwgKz0gYDxsaT4ke2l0ZW19PC9saT5gOyB9KTtcbiAgICAgIGh0bWwgKz0gJzwvdWw+PC9kaXY+JztcbiAgICB9XG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgU2VjdGlvbiA0OiBBVFMgS2V5d29yZHMgd2l0aCByYW5rIGJhZGdlcyBhbmQgc3lub255bSBhbm5vdGF0aW9ucyBcdTI1MDBcdTI1MDBcbiAgICBjb25zdCBhdHNLd3MgPSBBcnJheS5pc0FycmF5KGRhdGEuYXRzX2tleXdvcmRzKSA/IGRhdGEuYXRzX2tleXdvcmRzIDogW107XG4gICAgaWYgKGF0c0t3cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBzeW5NYXAgPSBhd2FpdCBfbG9hZFN5bm9ueW1NYXAoKTtcbiAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJhbmFseXNpcy1zZWN0aW9uXCI+PGgyPlx1RDgzRFx1REQxMSBBVFMgS2V5d29yZHMgPHNtYWxsIHN0eWxlPVwiZm9udC13ZWlnaHQ6NDAwO2NvbG9yOiM2NDc0OGI7Zm9udC1zaXplOjEycHg7XCI+KGhpZ2hlciByYW5rID0gaGlnaGVyIHByaW9yaXR5KTwvc21hbGw+PC9oMj48ZGl2IGNsYXNzPVwia3ctYmFkZ2VzXCI+JztcbiAgICAgIGF0c0t3cy5mb3JFYWNoKChrdywgaWR4KSA9PiB7XG4gICAgICAgIGNvbnN0IGFubm90YXRpb24gPSBfa3dTeW5vbnltQW5ub3RhdGlvbihrdywgc3luTWFwKTtcbiAgICAgICAgY29uc3QgdGl0bGVBdHRyICA9IGFubm90YXRpb24gPyBgIHRpdGxlPVwiU3lub255bTogJHtlc2NhcGVIdG1sKGt3ICsgYW5ub3RhdGlvbil9XCJgIDogJyc7XG4gICAgICAgIGNvbnN0IGFubm90SHRtbCAgPSBhbm5vdGF0aW9uID8gYDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjEwcHg7Y29sb3I6IzY0NzQ4YjttYXJnaW4tbGVmdDozcHg7XCI+JHtlc2NhcGVIdG1sKGFubm90YXRpb24pfTwvc3Bhbj5gIDogJyc7XG4gICAgICAgIGh0bWwgKz0gYDxzcGFuIGNsYXNzPVwia3ctYmFkZ2VcIiR7dGl0bGVBdHRyfT48c3BhbiBjbGFzcz1cImt3LXJhbmtcIj4jJHtpZHggKyAxfTwvc3Bhbj4ke2VzY2FwZUh0bWwoa3cpfSR7YW5ub3RIdG1sfTwvc3Bhbj5gO1xuICAgICAgfSk7XG4gICAgICBodG1sICs9ICc8L2Rpdj48L2Rpdj4nO1xuICAgIH1cblxuICAgIC8vIFx1MjUwMFx1MjUwMCBDdWx0dXJlIGluZGljYXRvcnMgKG9wdGlvbmFsKSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICBjb25zdCBjdWx0dXJlID0gQXJyYXkuaXNBcnJheShkYXRhLmN1bHR1cmVfaW5kaWNhdG9ycykgPyBkYXRhLmN1bHR1cmVfaW5kaWNhdG9ycyA6IFtdO1xuICAgIGlmIChjdWx0dXJlLmxlbmd0aCA+IDApIHtcbiAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJhbmFseXNpcy1zZWN0aW9uXCI+PGgyPlx1RDgzQ1x1REZFMiBDdWx0dXJlIEluZGljYXRvcnM8L2gyPjx1bCBjbGFzcz1cInByZWZlcnJlZC1saXN0XCI+JztcbiAgICAgIGN1bHR1cmUuZm9yRWFjaChjID0+IHsgaHRtbCArPSBgPGxpPiR7Y308L2xpPmA7IH0pO1xuICAgICAgaHRtbCArPSAnPC91bD48L2Rpdj4nO1xuICAgIH1cblxuICAgIC8vIFx1MjUwMFx1MjUwMCBNdXN0LWhhdmUgcmVxdWlyZW1lbnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIGNvbnN0IG11c3RIYXZlID0gQXJyYXkuaXNBcnJheShkYXRhLm11c3RfaGF2ZV9yZXF1aXJlbWVudHMpID8gZGF0YS5tdXN0X2hhdmVfcmVxdWlyZW1lbnRzIDogW107XG4gICAgaWYgKG11c3RIYXZlLmxlbmd0aCA+IDApIHtcbiAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJhbmFseXNpcy1zZWN0aW9uXCI+PGgyPlx1MjcwNSBNdXN0LUhhdmUgUmVxdWlyZW1lbnRzPC9oMj48dWwgY2xhc3M9XCJwcmVmZXJyZWQtbGlzdFwiPic7XG4gICAgICBtdXN0SGF2ZS5mb3JFYWNoKHIgPT4geyBodG1sICs9IGA8bGk+JHtyfTwvbGk+YDsgfSk7XG4gICAgICBodG1sICs9ICc8L3VsPjwvZGl2Pic7XG4gICAgfVxuXG4gICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cIm5hdi1idXR0b25zIG5hdi1lbmRcIj48YnV0dG9uIGNsYXNzPVwiY29udGludWUtYnRuXCIgb25jbGljaz1cInNlbmRBY3Rpb24oXFx1MDAyN3JlY29tbWVuZF9jdXN0b21pemF0aW9uc1xcdTAwMjcpXCI+Q29udGludWUgdG8gQ3VzdG9taXphdGlvbnMgXHUyMTkyPC9idXR0b24+PC9kaXY+JztcbiAgICBodG1sICs9ICc8L2Rpdj4nOyAvLyAuYW5hbHlzaXMtcGFnZVxuICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gaHRtbDtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZy5lcnJvcignQW5hbHlzaXMgcGFyc2luZyBlcnJvcjonLCBlLCAnT3JpZ2luYWwgcmVzdWx0OicsIHJlc3VsdCk7XG4gICAgY29udGVudC5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz1cImVtcHR5LXN0YXRlXCI+PGRpdiBjbGFzcz1cImljb25cIj5cdTI3NEM8L2Rpdj48aDM+QW5hbHlzaXMgRXJyb3I8L2gzPjxwPkNvdWxkIG5vdCBwYXJzZSBhbmFseXNpcyByZXN1bHRzOiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX08L3A+PGRldGFpbHM+PHN1bW1hcnk+RGVidWcgSW5mbzwvc3VtbWFyeT48cHJlPiR7ZXNjYXBlSHRtbChKU09OLnN0cmluZ2lmeShyZXN1bHQsIG51bGwsIDIpKX08L3ByZT48L2RldGFpbHM+PC9kaXY+YDtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgQ3VzdG9taXphdGlvbiByZXNwb25zZSBoYW5kbGVyIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVDdXN0b21pemF0aW9uUmVzcG9uc2UocmVzcG9uc2UpIHtcbiAgdHJ5IHtcbiAgICAvLyBBY2NlcHQgYSBwcmUtcGFyc2VkIG9iamVjdCBvciBhIHJhdyBzdHJpbmcgKHBhcnNlIGF0IGJvdW5kYXJ5KS5cbiAgICBjb25zdCBkYXRhID0gKHJlc3BvbnNlICE9PSBudWxsICYmIHR5cGVvZiByZXNwb25zZSA9PT0gJ29iamVjdCcpXG4gICAgICA/IHJlc3BvbnNlXG4gICAgICA6IGV4dHJhY3RGaXJzdEpzb25PYmplY3QocmVzcG9uc2UpO1xuICAgIGlmICghZGF0YSkge1xuICAgICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgdHlwZW9mIHJlc3BvbnNlID09PSAnc3RyaW5nJyA/IHJlc3BvbnNlIDogJycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChkYXRhICYmIChkYXRhLnJlY29tbWVuZGVkX2V4cGVyaWVuY2VzIHx8IGRhdGEucmVjb21tZW5kZWRfc2tpbGxzKSkge1xuICAgICAgc3RhdGVNYW5hZ2VyLnNldFRhYkRhdGEoJ2N1c3RvbWl6YXRpb25zJywgZGF0YSk7XG4gICAgICB3aW5kb3cucGVuZGluZ1JlY29tbWVuZGF0aW9ucyA9IGRhdGE7XG4gICAgICBzYXZlVGFiRGF0YSgpO1xuXG4gICAgICBpZiAoIWlzUmVjb25uZWN0SW5Qcm9ncmVzcygpKSB7XG4gICAgICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsICdcdTI3MDUgQ3VzdG9taXphdGlvbnMgZ2VuZXJhdGVkISBQbGVhc2UgcmV2aWV3IGVhY2ggc2VjdGlvbiBpbiB0aGUgKipDdXN0b21pemF0aW9ucyoqIHRhYiBcdTIwMTQgRXhwZXJpZW5jZXMsIEFjaGlldmVtZW50cywgU2tpbGxzLCBTdW1tYXJ5LCBhbmQgUHVibGljYXRpb25zLiBTZWxlY3QgeW91ciBwcmVmZXJlbmNlcyB1c2luZyB0aGUgYWN0aW9uIGJ1dHRvbnMsIHRoZW4gc3VibWl0IHlvdXIgZGVjaXNpb25zLicpO1xuICAgICAgICBzd2l0Y2hUYWIoJ2V4cC1yZXZpZXcnKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFpc1JlY29ubmVjdEluUHJvZ3Jlc3MoKSkge1xuICAgICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgcmVzcG9uc2UpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZy5lcnJvcignQ3VzdG9taXphdGlvbiByZXNwb25zZSBlcnJvcjonLCBlKTtcbiAgICBpZiAoIWlzUmVjb25uZWN0SW5Qcm9ncmVzcygpKSB7XG4gICAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCByZXNwb25zZSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogU3luYyB0aGUgc2tpbGxzLXRpdGxlIHNlbGVjdC9jdXN0b20taW5wdXQgY29udHJvbHMgdG8gYSBnaXZlbiB0aXRsZSB2YWx1ZSxcbiAqIGFuZCBhdHRhY2ggY2hhbmdlIGxpc3RlbmVycyBzbyB1cGRhdGVzIGFyZSBzYXZlZCB2aWEgdGhlIEFQSS5cbiAqIGR1Y2tmbG93OlxuICogICBpZDogZ2VuZXJhdGlvbl9zZXR0aW5ncy53ZWJfcmV2aWV3X3RhYmxlX2Jhc2UuTDMzMFxuICogICBraW5kOiB1aVxuICogICB0aW1lc3RhbXA6ICcyMDI2LTAzLTI3VDAxOjIzOjI4WidcbiAqICAgc3RhdHVzOiBsaXZlXG4gKiAgIGhhbmRsZXM6XG4gKiAgIC0gdWk6Z2VuZXJhdGlvbi1zZXR0aW5ncy5zeW5jLXNraWxscy10aXRsZVxuICogICBjYWxsczpcbiAqICAgLSBQT1NUIC9hcGkvZ2VuZXJhdGlvbi1zZXR0aW5nc1xuICogICByZWFkczpcbiAqICAgLSByZXNwb25zZTpHRVQgL2FwaS9zdGF0dXMuc2tpbGxzX3NlY3Rpb25fdGl0bGVcbiAqICAgd3JpdGVzOlxuICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL2dlbmVyYXRpb24tc2V0dGluZ3Muc2tpbGxzX3NlY3Rpb25fdGl0bGVcbiAqICAgbm90ZXM6IEtlZXBzIHRoZSBVSSBza2lsbHMtdGl0bGUgY29udHJvbHMgaW4gc3luYyB3aXRoIHN0YXR1cyBkYXRhIGFuZCBwZXJzaXN0cyB0aXRsZSBjaGFuZ2VzIGJhY2sgdG8gdGhlIHNlc3Npb24gc2V0dGluZ3Mgcm91dGUuXG4gKi9cbmZ1bmN0aW9uIF9zeW5jU2tpbGxzVGl0bGVDb250cm9scyhjdXJyZW50VGl0bGUpIHtcbiAgY29uc3Qga25vd25PcHRpb25zID0gWydTa2lsbHMnLCAnVGVjaG5pY2FsIFNraWxscycsICdLZXkgU2tpbGxzJywgJ0NvcmUgU2tpbGxzJ107XG4gIGNvbnN0IHNlbCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGxzLXRpdGxlLXNlbGVjdCcpO1xuICBjb25zdCBjdXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NraWxscy10aXRsZS1jdXN0b20nKTtcbiAgaWYgKCFzZWwpIHJldHVybjtcblxuICBjb25zdCBpc0tub3duID0ga25vd25PcHRpb25zLmluY2x1ZGVzKGN1cnJlbnRUaXRsZSk7XG4gIGlmIChpc0tub3duKSB7XG4gICAgc2VsLnZhbHVlID0gY3VycmVudFRpdGxlO1xuICAgIGlmIChjdXN0KSBjdXN0LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIH0gZWxzZSB7XG4gICAgc2VsLnZhbHVlID0gJ19fY3VzdG9tX18nO1xuICAgIGlmIChjdXN0KSB7XG4gICAgICBjdXN0LnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIGN1c3QudmFsdWUgPSBjdXJyZW50VGl0bGU7XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc2F2ZVRpdGxlID0gYXN5bmMgKHRpdGxlKSA9PiB7XG4gICAgdHJ5IHsgYXdhaXQgYXBpQ2FsbCgnUE9TVCcsICcvYXBpL2dlbmVyYXRpb24tc2V0dGluZ3MnLCB7IHNraWxsc19zZWN0aW9uX3RpdGxlOiB0aXRsZSB9KTsgfVxuICAgIGNhdGNoIChlKSB7IGxvZy53YXJuKCdGYWlsZWQgdG8gc2F2ZSBza2lsbHNfc2VjdGlvbl90aXRsZSBzZXR0aW5nOicsIGUpOyB9XG4gIH07XG5cbiAgc2VsLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHtcbiAgICBpZiAoc2VsLnZhbHVlID09PSAnX19jdXN0b21fXycpIHtcbiAgICAgIGlmIChjdXN0KSB7IGN1c3Quc3R5bGUuZGlzcGxheSA9ICcnOyBjdXN0LmZvY3VzKCk7IH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGN1c3QpIGN1c3Quc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIHNhdmVUaXRsZShzZWwudmFsdWUpO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKGN1c3QpIHtcbiAgICBjdXN0LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHYgPSBjdXN0LnZhbHVlLnRyaW0oKTtcbiAgICAgIGlmICh2KSBzYXZlVGl0bGUodik7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZW5kZXJzIG9uZSBvZiB0aGUgNSByZXZpZXcgcGFuZXMgYXMgYSB0b3AtbGV2ZWwgdGFiLlxuICogUmVwbGFjZXMgdGhlIG9sZCBzdWItdGFiIGFwcHJvYWNoIHdpdGggYSBmbGF0IHNpbmdsZS1sZXZlbCB0YWIgc3RydWN0dXJlLlxuICovXG5hc3luYyBmdW5jdGlvbiBwb3B1bGF0ZVJldmlld1RhYihwYW5lKSB7XG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9jdW1lbnQtY29udGVudCcpO1xuICBjb25zdCBjdXN0b21pemF0aW9ucyA9IHN0YXRlTWFuYWdlci5nZXRUYWJEYXRhKCdjdXN0b21pemF0aW9ucycpO1xuXG4gIGlmICghd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnMgfHwgIWN1c3RvbWl6YXRpb25zKSB7XG4gICAgY29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImVtcHR5LXN0YXRlXCI+PGRpdiBjbGFzcz1cImljb25cIj5cdTI2OTlcdUZFMEY8L2Rpdj48aDM+UmV2aWV3IEN1c3RvbWl6YXRpb25zPC9oMz48cD5DbGljayBcIlJlY29tbWVuZCBDdXN0b21pemF0aW9uc1wiIHRvIGdlbmVyYXRlIHJlY29tbWVuZGF0aW9ucy48L3A+PC9kaXY+JztcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwYW5lQ29uZmlnID0ge1xuICAgIGV4cGVyaWVuY2VzOiAgIHsgdGl0bGU6ICcnLCBkZXNjOiAnU29ydGVkIGJ5IGRhdGUgKG1vc3QgcmVjZW50IGZpcnN0KS4gQ2xpY2sgYWN0aW9uIGJ1dHRvbnMgdG8gb3ZlcnJpZGUgcmVjb21tZW5kYXRpb25zLicsICAgICAgICAgY29udGFpbmVyOiAnZXhwZXJpZW5jZS10YWJsZS1jb250YWluZXInICAgfSxcbiAgICBza2lsbHM6ICAgICAgICB7IHRpdGxlOiAnXHVEODNEXHVERUUwXHVGRTBGIFNraWxscycsICAgICAgICAgICBkZXNjOiAnU29ydGVkIGJ5IHJlbGV2YW5jZS4gU2VsZWN0IGhvdyB0byBmZWF0dXJlIGVhY2ggc2tpbGwuJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcjogJ3NraWxscy10YWJsZS1jb250YWluZXInICAgICAgIH0sXG4gICAgYWNoaWV2ZW1lbnRzOiAgeyB0aXRsZTogJ1x1RDgzQ1x1REZDNiBBY2hpZXZlbWVudHMnLCAgICAgIGRlc2M6ICdTZWxlY3QgaG93IHRvIGZlYXR1cmUgZWFjaCBrZXkgYWNoaWV2ZW1lbnQuIEFJIHJlY29tbWVuZGF0aW9ucyBhcmUgcHJlLXNlbGVjdGVkLicsICBjb250YWluZXI6ICdhY2hpZXZlbWVudHMtdGFibGUtY29udGFpbmVyJyAgfSxcbiAgICBzdW1tYXJ5OiAgICAgICB7IHRpdGxlOiAnXHVEODNEXHVEQ0REIFByb2Zlc3Npb25hbCBTdW1tYXJ5JywgZGVzYzogJ1NlbGVjdCB3aGljaCBwcm9mZXNzaW9uYWwgc3VtbWFyeSB0byB1c2UuIFRoZSBBSVxcJ3MgcmVjb21tZW5kYXRpb24gaXMgcHJlLXNlbGVjdGVkLicsIGNvbnRhaW5lcjogJ3N1bW1hcnktZm9jdXMtY29udGFpbmVyJyAgICB9LFxuICAgIHB1YmxpY2F0aW9uczogIHsgdGl0bGU6ICdcdUQ4M0RcdURDQzQgUHVibGljYXRpb25zJywgICAgICBkZXNjOiAnQWxsIHB1YmxpY2F0aW9ucyByYW5rZWQgYnkgcmVsZXZhbmNlLiBBY2NlcHQgb3IgcmVqZWN0IGVhY2ggZm9yIHlvdXIgQ1YuJywgICAgICAgICAgY29udGFpbmVyOiAncHVibGljYXRpb25zLXRhYmxlLWNvbnRhaW5lcicgfSxcbiAgfTtcbiAgY29uc3QgY2ZnID0gcGFuZUNvbmZpZ1twYW5lXSB8fCB7fTtcblxuICBjb25zdCBoZWFkZXJIdG1sID0gcGFuZSA9PT0gJ2V4cGVyaWVuY2VzJyA/IGBcbiAgICA8aDE+XHUyNjk5XHVGRTBGIFJldmlldyBDdXN0b21pemF0aW9uIFJlY29tbWVuZGF0aW9uczwvaDE+XG4gICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO21hcmdpbi1ib3R0b206MTZweDtcIj5SZXZpZXcgdGhlIEFJJ3MgcmVjb21tZW5kYXRpb25zLiBVc2UgdGhlIGFjdGlvbiBidXR0b25zIHRvIGFkanVzdCBlYWNoIGl0ZW0sIHRoZW4gc2F2ZSB5b3VyIGRlY2lzaW9ucyBiZWZvcmUgZ2VuZXJhdGluZyB0aGUgQ1YuPC9wPlxuICAgIDxkaXYgaWQ9XCJwYWdlLWVzdGltYXRlLXdpZGdldFwiIGNsYXNzPVwicGFnZS1lc3RpbWF0ZSBva1wiPlxuICAgICAgPHNwYW4gaWQ9XCJwZS1pY29uXCI+XHVEODNEXHVEQ0M0PC9zcGFuPlxuICAgICAgPHNwYW4gaWQ9XCJwZS1sYWJlbFwiPkVzdGltYXRlZCBsZW5ndGg6IGNhbGN1bGF0aW5nXHUyMDI2PC9zcGFuPlxuICAgICAgPGRpdiBjbGFzcz1cInBlLWJhclwiPjxkaXYgY2xhc3M9XCJwZS1maWxsXCIgaWQ9XCJwZS1maWxsXCIgc3R5bGU9XCJ3aWR0aDowJTtiYWNrZ3JvdW5kOiM4NmVmYWM7XCI+PC9kaXY+PC9kaXY+XG4gICAgPC9kaXY+XG4gIGAgOiAoY2ZnLnRpdGxlID8gYDxoMiBzdHlsZT1cIm1hcmdpbjowIDAgMTJweDtcIj4ke2NmZy50aXRsZX08L2gyPmAgOiAnJyk7XG5cbiAgY29uc3QgbmF2QmFjayA9IHtcbiAgICBza2lsbHM6ICAgICAgIGA8YnV0dG9uIGNsYXNzPVwiYmFjay1idG5cIiBvbmNsaWNrPVwic3dpdGNoVGFiKCdhY2gtZWRpdG9yJylcIj5cdTIxOTAgQmFjayB0byBFeHBlcmllbmNlIEJ1bGxldHM8L2J1dHRvbj5gLFxuICAgIGFjaGlldmVtZW50czogYDxidXR0b24gY2xhc3M9XCJiYWNrLWJ0blwiIG9uY2xpY2s9XCJzd2l0Y2hUYWIoJ3NraWxscy1yZXZpZXcnKVwiPlx1MjE5MCBCYWNrIHRvIFNraWxsczwvYnV0dG9uPmAsXG4gICAgcHVibGljYXRpb25zOiBgPGJ1dHRvbiBjbGFzcz1cImJhY2stYnRuXCIgb25jbGljaz1cInN3aXRjaFRhYignc3VtbWFyeS1yZXZpZXcnKVwiPlx1MjE5MCBCYWNrIHRvIFN1bW1hcnk8L2J1dHRvbj5gLFxuICB9O1xuICBjb25zdCBuYXZDb250aW51ZSA9IHtcbiAgICBleHBlcmllbmNlczogIGA8YnV0dG9uIGNsYXNzPVwiY29udGludWUtYnRuXCIgb25jbGljaz1cInN1Ym1pdEV4cGVyaWVuY2VEZWNpc2lvbnMoKVwiPkNvbnRpbnVlIHRvIEV4cGVyaWVuY2UgQnVsbGV0cyBcdTIxOTI8L2J1dHRvbj5gLFxuICAgIHNraWxsczogICAgICAgYDxidXR0b24gY2xhc3M9XCJjb250aW51ZS1idG5cIiBvbmNsaWNrPVwic3VibWl0U2tpbGxEZWNpc2lvbnMoKVwiPkNvbnRpbnVlIHRvIEFjaGlldmVtZW50cyBcdTIxOTI8L2J1dHRvbj5gLFxuICAgIGFjaGlldmVtZW50czogYDxidXR0b24gY2xhc3M9XCJjb250aW51ZS1idG5cIiBvbmNsaWNrPVwic3VibWl0QWNoaWV2ZW1lbnREZWNpc2lvbnMoKVwiPkNvbnRpbnVlIHRvIFRhZ2xpbmUgXHUyMTkyPC9idXR0b24+YCxcbiAgICBwdWJsaWNhdGlvbnM6IGA8YnV0dG9uIGNsYXNzPVwiY29udGludWUtYnRuXCIgb25jbGljaz1cInN1Ym1pdFB1YmxpY2F0aW9uRGVjaXNpb25zKClcIj5Db250aW51ZSB0byBSZXdyaXRlIFx1MjE5MjwvYnV0dG9uPmAsXG4gIH07XG4gIGNvbnN0IG5hdkh0bWwgPSBwYW5lID09PSAnc3VtbWFyeScgPyAnJyA6IGBcbiAgICA8ZGl2IGNsYXNzPVwibmF2LWJ1dHRvbnMke3BhbmUgPT09ICdleHBlcmllbmNlcycgPyAnIG5hdi1lbmQnIDogJyd9XCIgc3R5bGU9XCJtYXJnaW46MTZweCAwO1wiPlxuICAgICAgJHtuYXZCYWNrW3BhbmVdIHx8ICcnfVxuICAgICAgJHtuYXZDb250aW51ZVtwYW5lXSB8fCAnJ31cbiAgICA8L2Rpdj5gO1xuXG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgICR7aGVhZGVySHRtbH1cbiAgICAke2NmZy5kZXNjID8gYDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtmb250LXNpemU6MC45NWVtO21hcmdpbi1ib3R0b206MTZweDtcIj4ke2VzY2FwZUh0bWwoY2ZnLmRlc2MpfTwvcD5gIDogJyd9XG4gICAgPGRpdiBpZD1cIiR7Y2ZnLmNvbnRhaW5lcn1cIj48L2Rpdj5cbiAgICAke25hdkh0bWx9XG4gIGA7XG5cbiAgd2luZG93Ll9hY3RpdmVSZXZpZXdQYW5lID0gcGFuZTtcbiAgc3dpdGNoIChwYW5lKSB7XG4gICAgY2FzZSAnZXhwZXJpZW5jZXMnOlxuICAgICAgYXdhaXQgYnVpbGRFeHBlcmllbmNlUmV2aWV3VGFibGUoKTtcbiAgICAgIF91cGRhdGVQYWdlRXN0aW1hdGUoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3NraWxscyc6XG4gICAgICBhd2FpdCBidWlsZFNraWxsc1Jldmlld1RhYmxlKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdhY2hpZXZlbWVudHMnOlxuICAgICAgYXdhaXQgYnVpbGRBY2hpZXZlbWVudHNSZXZpZXdUYWJsZSgpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc3VtbWFyeSc6XG4gICAgICBhd2FpdCBidWlsZFN1bW1hcnlGb2N1c1NlY3Rpb24oKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3B1YmxpY2F0aW9ucyc6XG4gICAgICBhd2FpdCBidWlsZFB1YmxpY2F0aW9uc1Jldmlld1RhYmxlKCk7XG4gICAgICBicmVhaztcbiAgfVxufVxuXG4vLyBUcmFjayB3aGljaCBwYW5lIGlzIGN1cnJlbnRseSBhY3RpdmVcbndpbmRvdy5fYWN0aXZlUmV2aWV3UGFuZSA9ICdleHBlcmllbmNlcyc7XG5cbmFzeW5jIGZ1bmN0aW9uIHN3aXRjaFJldmlld1N1YnRhYihwYW5lKSB7XG4gIC8vIFVwZGF0ZSBidXR0b24gc3RhdGVzXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5yZXZpZXctc3VidGFiJykuZm9yRWFjaChidG4gPT4ge1xuICAgIGJ0bi5jbGFzc0xpc3QudG9nZ2xlKCdhY3RpdmUnLCBidG4uZGF0YXNldC5wYW5lID09PSBwYW5lKTtcbiAgfSk7XG5cbiAgLy8gSGlkZSBhbGwgcGFuZXMsIHNob3cgdGhlIHNlbGVjdGVkIG9uZVxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucmV2aWV3LXBhbmUnKS5mb3JFYWNoKHAgPT4gcC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnKTtcbiAgY29uc3QgdGFyZ2V0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHJldmlldy1wYW5lLSR7cGFuZX1gKTtcbiAgaWYgKHRhcmdldCkgdGFyZ2V0LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuXG4gIHdpbmRvdy5fYWN0aXZlUmV2aWV3UGFuZSA9IHBhbmU7XG5cbiAgLy8gTGF6eS1sb2FkIHBhbmUgY29udGVudCBvbiBmaXJzdCB2aXNpdFxuICBpZiAoIXdpbmRvdy5fcmV2aWV3UGFuZUxvYWRlZCB8fCAhd2luZG93Ll9yZXZpZXdQYW5lTG9hZGVkW3BhbmVdKSB7XG4gICAgYXdhaXQgX2xvYWRSZXZpZXdQYW5lKHBhbmUpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9sb2FkUmV2aWV3UGFuZShwYW5lKSB7XG4gIGlmICghd2luZG93Ll9yZXZpZXdQYW5lTG9hZGVkKSB3aW5kb3cuX3Jldmlld1BhbmVMb2FkZWQgPSB7fTtcbiAgdHJ5IHtcbiAgICBzd2l0Y2ggKHBhbmUpIHtcbiAgICAgIGNhc2UgJ2V4cGVyaWVuY2VzJzogICBhd2FpdCBidWlsZEV4cGVyaWVuY2VSZXZpZXdUYWJsZSgpOyAgYnJlYWs7XG4gICAgICBjYXNlICdza2lsbHMnOiAgICAgICAgYXdhaXQgYnVpbGRTa2lsbHNSZXZpZXdUYWJsZSgpOyAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2FjaGlldmVtZW50cyc6ICBhd2FpdCBidWlsZEFjaGlldmVtZW50c1Jldmlld1RhYmxlKCk7IGJyZWFrO1xuICAgICAgY2FzZSAnc3VtbWFyeSc6ICAgICAgIGF3YWl0IGJ1aWxkU3VtbWFyeUZvY3VzU2VjdGlvbigpOyAgICAgYnJlYWs7XG4gICAgICBjYXNlICdwdWJsaWNhdGlvbnMnOiAgYXdhaXQgYnVpbGRQdWJsaWNhdGlvbnNSZXZpZXdUYWJsZSgpOyBicmVhaztcbiAgICAgIGRlZmF1bHQ6IHJldHVybjtcbiAgICB9XG4gICAgd2luZG93Ll9yZXZpZXdQYW5lTG9hZGVkW3BhbmVdID0gdHJ1ZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBkZWxldGUgd2luZG93Ll9yZXZpZXdQYW5lTG9hZGVkW3BhbmVdO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBQYWdlLWVzdGltYXRlIHdpZGdldCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gX3VwZGF0ZVBhZ2VFc3RpbWF0ZSgpIHtcbiAgY29uc3Qgd2lkZ2V0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BhZ2UtZXN0aW1hdGUtd2lkZ2V0Jyk7XG4gIGlmICghd2lkZ2V0KSByZXR1cm47XG5cbiAgY29uc3QgbGFiZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGUtbGFiZWwnKTtcbiAgY29uc3QgZmlsbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwZS1maWxsJyk7XG4gIGNvbnN0IGljb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGUtaWNvbicpO1xuXG4gIGlmIChsYWJlbCkgbGFiZWwudGV4dENvbnRlbnQgPSAnVXBkYXRpbmcgc2VydmVyIGxheW91dCBlc3RpbWF0ZVx1MjAyNic7XG4gIGlmIChmaWxsKSBmaWxsLnN0eWxlLndpZHRoID0gJzAlJztcbiAgaWYgKGljb24pIGljb24udGV4dENvbnRlbnQgPSAnXHUyM0YzJztcblxuICBjb25zdCBwYXlsb2FkID0ge1xuICAgIGV4cGVyaWVuY2VfZGVjaXNpb25zOiB7XG4gICAgICAuLi4oKHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMgJiYgd2luZG93Ll9zYXZlZERlY2lzaW9ucy5leHBlcmllbmNlX2RlY2lzaW9ucykgfHwge30pLFxuICAgICAgLi4uKHVzZXJTZWxlY3Rpb25zLmV4cGVyaWVuY2VzIHx8IHt9KSxcbiAgICB9LFxuICAgIHNraWxsX2RlY2lzaW9uczoge1xuICAgICAgLi4uKCh3aW5kb3cuX3NhdmVkRGVjaXNpb25zICYmIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMuc2tpbGxfZGVjaXNpb25zKSB8fCB7fSksXG4gICAgICAuLi4odXNlclNlbGVjdGlvbnMuc2tpbGxzIHx8IHt9KSxcbiAgICB9LFxuICAgIGFjaGlldmVtZW50X2RlY2lzaW9uczogKFxuICAgICAgKHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMgJiYgd2luZG93Ll9zYXZlZERlY2lzaW9ucy5hY2hpZXZlbWVudF9kZWNpc2lvbnMpXG4gICAgICB8fCB3aW5kb3cuYWNoaWV2ZW1lbnREZWNpc2lvbnNcbiAgICAgIHx8IHt9XG4gICAgKSxcbiAgICBwdWJsaWNhdGlvbl9kZWNpc2lvbnM6IChcbiAgICAgICh3aW5kb3cuX3NhdmVkRGVjaXNpb25zICYmIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMucHVibGljYXRpb25fZGVjaXNpb25zKVxuICAgICAgfHwgd2luZG93LnB1YmxpY2F0aW9uRGVjaXNpb25zXG4gICAgICB8fCB7fVxuICAgICksXG4gICAgc3VtbWFyeV9mb2N1c19vdmVycmlkZTogd2luZG93LnNlbGVjdGVkU3VtbWFyeUtleSB8fCBudWxsLFxuICB9O1xuXG4gIGNvbnN0IHJlcXVlc3RJZCA9ICsrcGFnZUVzdGltYXRlUmVxdWVzdElkO1xuICBjbGVhclRpbWVvdXQocGFnZUVzdGltYXRlVGltZXIpO1xuICBwYWdlRXN0aW1hdGVUaW1lciA9IHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGFwaUNhbGwoJ1BPU1QnLCAnL2FwaS9jdi9sYXlvdXQtZXN0aW1hdGUnLCBwYXlsb2FkKTtcbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHRocm93IG5ldyBFcnJvcihyZXNwb25zZS5lcnJvciB8fCAnZXN0aW1hdGUgZmFpbGVkJyk7XG4gICAgICBpZiAocmVxdWVzdElkICE9PSBwYWdlRXN0aW1hdGVSZXF1ZXN0SWQpIHJldHVybjtcblxuICAgICAgY29uc3QgcGFnZXMgPSBOdW1iZXIocmVzcG9uc2UucGFnZV9jb3VudF9lc3RpbWF0ZSB8fCAwKTtcbiAgICAgIGNvbnN0IHBjdCA9IE1hdGgubWluKDEwMCwgKHBhZ2VzIC8gMykgKiAxMDApO1xuICAgICAgY29uc3QgY29uZmlkZW5jZSA9IE51bWJlcihyZXNwb25zZS5wYWdlX2NvdW50X2NvbmZpZGVuY2UgfHwgMCk7XG5cbiAgICAgIGxldCBjbHMgPSAnb2snO1xuICAgICAgbGV0IGNvbG91ciA9ICcjMjJjNTVlJztcbiAgICAgIGxldCBpY29uVGV4dCA9IHJlc3BvbnNlLnBhZ2VfY291bnRfZXhhY3QgIT0gbnVsbCA/ICdcdTI3MDUnIDogJ1x1RDgzRFx1RENDNCc7XG4gICAgICBpZiAocmVzcG9uc2UucGFnZV9sZW5ndGhfd2FybmluZykge1xuICAgICAgICBjbHMgPSBwYWdlcyA+IDMgPyAnb3ZlcicgOiAnd2Fybic7XG4gICAgICAgIGNvbG91ciA9IHBhZ2VzID4gMyA/ICcjZWY0NDQ0JyA6ICcjZjU5ZTBiJztcbiAgICAgICAgaWNvblRleHQgPSBwYWdlcyA+IDMgPyAnXHVEODNEXHVERUE4JyA6ICdcdTI2QTBcdUZFMEYnO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzb3VyY2VMYWJlbCA9IHJlc3BvbnNlLnBhZ2VfY291bnRfZXhhY3QgIT0gbnVsbFxuICAgICAgICA/IGBFeGFjdDogJHtyZXNwb25zZS5wYWdlX2NvdW50X2V4YWN0fSBwYWdlJHtyZXNwb25zZS5wYWdlX2NvdW50X2V4YWN0ID09PSAxID8gJycgOiAncyd9YFxuICAgICAgICA6IGBFc3RpbWF0ZWQ6ICR7cGFnZXMudG9GaXhlZCgxKX0gcGFnZXNgO1xuICAgICAgY29uc3QgY29uZmlkZW5jZUxhYmVsID0gcmVzcG9uc2UucGFnZV9jb3VudF9leGFjdCAhPSBudWxsXG4gICAgICAgID8gJydcbiAgICAgICAgOiBgICgke01hdGgucm91bmQoY29uZmlkZW5jZSAqIDEwMCl9JSBjb25maWRlbmNlKWA7XG4gICAgICBjb25zdCBjb250cmlidXRvclRleHQgPSBBcnJheS5pc0FycmF5KHJlc3BvbnNlLmNvbnRyaWJ1dG9ycykgJiYgcmVzcG9uc2UuY29udHJpYnV0b3JzLmxlbmd0aCA+IDBcbiAgICAgICAgPyBgICR7cmVzcG9uc2UuY29udHJpYnV0b3JzWzBdfS5gXG4gICAgICAgIDogJyc7XG4gICAgICBjb25zdCByZWNoZWNrVGV4dCA9IHJlc3BvbnNlLnBhZ2VfY291bnRfbmVlZHNfZXhhY3RfcmVjaGVjayAmJiByZXNwb25zZS5wYWdlX2NvdW50X2V4YWN0ID09IG51bGxcbiAgICAgICAgPyAnIEV4YWN0IHJlY2hlY2sgcmVjb21tZW5kZWQuJ1xuICAgICAgICA6ICcnO1xuXG4gICAgICB3aWRnZXQuY2xhc3NOYW1lID0gYHBhZ2UtZXN0aW1hdGUgJHtjbHN9YDtcbiAgICAgIGlmIChsYWJlbCkge1xuICAgICAgICBsYWJlbC50ZXh0Q29udGVudCA9IGAke3NvdXJjZUxhYmVsfSR7Y29uZmlkZW5jZUxhYmVsfS4ke2NvbnRyaWJ1dG9yVGV4dH0ke3JlY2hlY2tUZXh0fWAudHJpbSgpO1xuICAgICAgfVxuICAgICAgaWYgKGZpbGwpIHtcbiAgICAgICAgZmlsbC5zdHlsZS53aWR0aCA9IGAke3BjdH0lYDtcbiAgICAgICAgZmlsbC5zdHlsZS5iYWNrZ3JvdW5kID0gY29sb3VyO1xuICAgICAgfVxuICAgICAgaWYgKGljb24pIGljb24udGV4dENvbnRlbnQgPSBpY29uVGV4dDtcblxuICAgICAgc3RhdGVNYW5hZ2VyLnNldEdlbmVyYXRpb25TdGF0ZSh7XG4gICAgICAgIHBhZ2VDb3VudEVzdGltYXRlOiByZXNwb25zZS5wYWdlX2NvdW50X2VzdGltYXRlID8/IG51bGwsXG4gICAgICAgIHBhZ2VDb3VudEV4YWN0OiByZXNwb25zZS5wYWdlX2NvdW50X2V4YWN0ID8/IG51bGwsXG4gICAgICAgIHBhZ2VDb3VudENvbmZpZGVuY2U6IHJlc3BvbnNlLnBhZ2VfY291bnRfY29uZmlkZW5jZSA/PyBudWxsLFxuICAgICAgICBwYWdlQ291bnRTb3VyY2U6IHJlc3BvbnNlLnBhZ2VfY291bnRfc291cmNlIHx8IG51bGwsXG4gICAgICAgIHBhZ2VOZWVkc0V4YWN0UmVjaGVjazogQm9vbGVhbihyZXNwb25zZS5wYWdlX2NvdW50X25lZWRzX2V4YWN0X3JlY2hlY2spLFxuICAgICAgICBwYWdlV2FybmluZzogQm9vbGVhbihyZXNwb25zZS5wYWdlX2xlbmd0aF93YXJuaW5nKSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAocmVxdWVzdElkICE9PSBwYWdlRXN0aW1hdGVSZXF1ZXN0SWQpIHJldHVybjtcbiAgICAgIHdpZGdldC5jbGFzc05hbWUgPSAncGFnZS1lc3RpbWF0ZSB3YXJuJztcbiAgICAgIGlmIChsYWJlbCkgbGFiZWwudGV4dENvbnRlbnQgPSBgTGF5b3V0IGVzdGltYXRlIHVuYXZhaWxhYmxlOiAke2Vycm9yLm1lc3NhZ2V9YDtcbiAgICAgIGlmIChmaWxsKSB7XG4gICAgICAgIGZpbGwuc3R5bGUud2lkdGggPSAnMCUnO1xuICAgICAgICBmaWxsLnN0eWxlLmJhY2tncm91bmQgPSAnI2Y1OWUwYic7XG4gICAgICB9XG4gICAgICBpZiAoaWNvbikgaWNvbi50ZXh0Q29udGVudCA9ICdcdTI2QTBcdUZFMEYnO1xuICAgIH1cbiAgfSwgMjUwKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFNoYXJlZCBhY3Rpb24gY2xpY2sgaGFuZGxlcnMgKGV4cGVyaWVuY2UgKyBza2lsbHMgdGFibGVzKSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gaGFuZGxlQWN0aW9uQ2xpY2soaXRlbUlkLCBhY3Rpb24sIHR5cGUpIHtcbiAgLy8gUmVtb3ZlIGFjdGl2ZSBjbGFzcyBmcm9tIGFsbCBidXR0b25zIGluIHRoaXMgcm93XG4gIGNvbnN0IHJvdyA9IHR5cGUgPT09ICdleHBlcmllbmNlJ1xuICAgID8gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgdHJbZGF0YS1leHAtaWQ9XCIke2l0ZW1JZH1cIl1gKVxuICAgIDogZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgdHJbZGF0YS1za2lsbD1cIiR7aXRlbUlkfVwiXWApO1xuXG4gIGNvbnN0IGJ1dHRvbnMgPSByb3cucXVlcnlTZWxlY3RvckFsbCgnLmljb24tYnRuJyk7XG4gIGJ1dHRvbnMuZm9yRWFjaChidG4gPT4ge1xuICAgIGJ0bi5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICBpZiAoYnRuLmhhc0F0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJykpIGJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsICdmYWxzZScpO1xuICB9KTtcblxuICAvLyBBZGQgYWN0aXZlIGNsYXNzIHRvIGNsaWNrZWQgYnV0dG9uXG4gIGNvbnN0IGNsaWNrZWRCdG4gPSByb3cucXVlcnlTZWxlY3RvcihgW2RhdGEtYWN0aW9uPVwiJHthY3Rpb259XCJdYCk7XG4gIGNsaWNrZWRCdG4uY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gIGlmIChjbGlja2VkQnRuLmhhc0F0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJykpIGNsaWNrZWRCdG4uc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCAndHJ1ZScpO1xuXG4gIC8vIFN0b3JlIHNlbGVjdGlvbiBhbmQgcmVjb3JkIGV4cGxpY2l0IHJldmlld1xuICBpZiAodHlwZSA9PT0gJ2V4cGVyaWVuY2UnKSB7XG4gICAgdXNlclNlbGVjdGlvbnMuZXhwZXJpZW5jZXNbaXRlbUlkXSA9IGFjdGlvbjtcbiAgICB3aW5kb3cuX2V4cGxpY2l0bHlSZXZpZXdlZCA9IHdpbmRvdy5fZXhwbGljaXRseVJldmlld2VkIHx8IHsgZXhwZXJpZW5jZXM6IG5ldyBTZXQoKSwgc2tpbGxzOiBuZXcgU2V0KCkgfTtcbiAgICB3aW5kb3cuX2V4cGxpY2l0bHlSZXZpZXdlZC5leHBlcmllbmNlcy5hZGQoaXRlbUlkKTtcbiAgfSBlbHNlIHtcbiAgICB1c2VyU2VsZWN0aW9ucy5za2lsbHNbaXRlbUlkXSA9IGFjdGlvbjtcbiAgICB3aW5kb3cuX2V4cGxpY2l0bHlSZXZpZXdlZCA9IHdpbmRvdy5fZXhwbGljaXRseVJldmlld2VkIHx8IHsgZXhwZXJpZW5jZXM6IG5ldyBTZXQoKSwgc2tpbGxzOiBuZXcgU2V0KCkgfTtcbiAgICB3aW5kb3cuX2V4cGxpY2l0bHlSZXZpZXdlZC5za2lsbHMuYWRkKGl0ZW1JZCk7XG4gIH1cbiAgX3VwZGF0ZVBhZ2VFc3RpbWF0ZSgpO1xufVxuXG4vKipcbiAqIEFwcGx5IGEgYnVsayBhY3Rpb24gdG8gYWxsIHZpc2libGUgKERhdGFUYWJsZS1maWx0ZXJlZCkgcm93cyBpbiBvbmUgdGFibGUuXG4gKiBhY3Rpb246ICdlbXBoYXNpemUnIHwgJ2luY2x1ZGUnIHwgJ2RlLWVtcGhhc2l6ZScgfCAnZXhjbHVkZScgfCAncmVjb21tZW5kZWQnXG4gKiB0eXBlOiAgICdleHBlcmllbmNlJyB8ICdza2lsbCdcbiAqL1xuZnVuY3Rpb24gYnVsa0FjdGlvbihhY3Rpb24sIHR5cGUpIHtcbiAgY29uc3QgdGFibGVJZCAgPSB0eXBlID09PSAnZXhwZXJpZW5jZScgPyAnI2V4cGVyaWVuY2UtcmV2aWV3LXRhYmxlJyA6ICcjc2tpbGxzLXJldmlldy10YWJsZSc7XG4gIGNvbnN0IGRhdGEgICAgID0gd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnMgfHwge307XG4gIGNvbnN0IGR0ICAgICAgID0gJC5mbi5EYXRhVGFibGUuaXNEYXRhVGFibGUodGFibGVJZCkgPyAkKHRhYmxlSWQpLkRhdGFUYWJsZSgpIDogbnVsbDtcblxuICAvLyBJdGVyYXRlIG9ubHkgdGhlIHJvd3MgdGhhdCBEYXRhVGFibGUgY3VycmVudGx5IHNob3dzIChyZXNwZWN0cyBzZWFyY2ggZmlsdGVyKVxuICBjb25zdCByb3dzID0gZHRcbiAgICA/IGR0LnJvd3MoeyBzZWFyY2g6ICdhcHBsaWVkJyB9KS5ub2RlcygpLnRvQXJyYXkoKVxuICAgIDogQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGAke3RhYmxlSWR9IHRib2R5IHRyYCkpO1xuXG4gIHJvd3MuZm9yRWFjaChyb3cgPT4ge1xuICAgIGNvbnN0IGV4cElkICAgID0gcm93LmRhdGFzZXQuZXhwSWQ7XG4gICAgY29uc3Qgc2tpbGxJZCAgPSByb3cuZGF0YXNldC5za2lsbDtcbiAgICBjb25zdCBpdGVtSWQgICA9IGV4cElkIHx8IHNraWxsSWQ7XG4gICAgaWYgKCFpdGVtSWQpIHJldHVybjtcblxuICAgIGxldCByZXNvbHZlZEFjdGlvbiA9IGFjdGlvbjtcbiAgICBpZiAoYWN0aW9uID09PSAncmVjb21tZW5kZWQnKSB7XG4gICAgICByZXNvbHZlZEFjdGlvbiA9IHR5cGUgPT09ICdleHBlcmllbmNlJ1xuICAgICAgICA/IF9yZXNvbHZlZEV4cEFjdGlvbihpdGVtSWQsIGRhdGEpXG4gICAgICAgIDogX3Jlc29sdmVkU2tpbGxBY3Rpb24oaXRlbUlkLCBkYXRhKTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgYnV0dG9uIHN0YXRlc1xuICAgIHJvdy5xdWVyeVNlbGVjdG9yQWxsKCcuaWNvbi1idG4nKS5mb3JFYWNoKGJ0biA9PiB7XG4gICAgICBidG4uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gICAgICBpZiAoYnRuLmhhc0F0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJykpIGJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsICdmYWxzZScpO1xuICAgIH0pO1xuICAgIGNvbnN0IHRhcmdldCA9IHJvdy5xdWVyeVNlbGVjdG9yKGBbZGF0YS1hY3Rpb249XCIke3Jlc29sdmVkQWN0aW9ufVwiXWApO1xuICAgIGlmICh0YXJnZXQpIHtcbiAgICAgIHRhcmdldC5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICAgIGlmICh0YXJnZXQuaGFzQXR0cmlidXRlKCdhcmlhLXByZXNzZWQnKSkgdGFyZ2V0LnNldEF0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJywgJ3RydWUnKTtcbiAgICB9XG5cbiAgICAvLyBTdG9yZSBzZWxlY3Rpb25cbiAgICBpZiAodHlwZSA9PT0gJ2V4cGVyaWVuY2UnKSB7XG4gICAgICB1c2VyU2VsZWN0aW9ucy5leHBlcmllbmNlc1tpdGVtSWRdID0gcmVzb2x2ZWRBY3Rpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIHVzZXJTZWxlY3Rpb25zLnNraWxsc1tpdGVtSWRdID0gcmVzb2x2ZWRBY3Rpb247XG4gICAgfVxuICB9KTtcbiAgX3VwZGF0ZVBhZ2VFc3RpbWF0ZSgpO1xufVxuXG5mdW5jdGlvbiBfcmVzb2x2ZWRFeHBBY3Rpb24oZXhwSWQsIGRhdGEpIHtcbiAgY29uc3QgcmVjID0gZ2V0RXhwZXJpZW5jZVJlY29tbWVuZGF0aW9uKGV4cElkLCBkYXRhKTtcbiAgaWYgKHJlYyA9PT0gJ0VtcGhhc2l6ZScpICAgIHJldHVybiAnZW1waGFzaXplJztcbiAgaWYgKHJlYyA9PT0gJ0luY2x1ZGUnKSAgICAgIHJldHVybiAnaW5jbHVkZSc7XG4gIGlmIChyZWMgPT09ICdEZS1lbXBoYXNpemUnKSByZXR1cm4gJ2RlLWVtcGhhc2l6ZSc7XG4gIHJldHVybiAnZXhjbHVkZSc7XG59XG5cbmZ1bmN0aW9uIF9yZXNvbHZlZFNraWxsQWN0aW9uKHNraWxsTmFtZSwgZGF0YSkge1xuICBjb25zdCByZWMgPSBnZXRTa2lsbFJlY29tbWVuZGF0aW9uKHNraWxsTmFtZSwgZGF0YSk7XG4gIGlmIChyZWMgPT09ICdFbXBoYXNpemUnKSAgICByZXR1cm4gJ2VtcGhhc2l6ZSc7XG4gIGlmIChyZWMgPT09ICdJbmNsdWRlJykgICAgICByZXR1cm4gJ2luY2x1ZGUnO1xuICBpZiAocmVjID09PSAnRGUtZW1waGFzaXplJykgcmV0dXJuICdkZS1lbXBoYXNpemUnO1xuICByZXR1cm4gJ2V4Y2x1ZGUnO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgVGFnbGluZSByZXZpZXcgdGFiIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBwb3B1bGF0ZVRhZ2xpbmVSZXZpZXdUYWIoKSB7XG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9jdW1lbnQtY29udGVudCcpO1xuICBpZiAoIWNvbnRlbnQpIHJldHVybjtcbiAgY29udGVudC5pbm5lckhUTUwgPSBgXG4gICAgPGgyIHN0eWxlPVwibWFyZ2luOjAgMCAxNnB4O1wiPlx1RDgzQ1x1REZGN1x1RkUwRiBBcHBsaWNhbnQgVGFnbGluZTwvaDI+XG4gICAgPGRpdiBpZD1cInRhZ2xpbmUtcmV2aWV3LWNvbnRhaW5lclwiPjwvZGl2PlxuICBgO1xuICBpZiAodHlwZW9mIGJ1aWxkVGFnbGluZVJldmlld1NlY3Rpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICBhd2FpdCBidWlsZFRhZ2xpbmVSZXZpZXdTZWN0aW9uKCk7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIEV4cG9ydHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmV4cG9ydCB7XG4gIHVzZXJTZWxlY3Rpb25zLFxuICB1cGRhdGVJbmNsdXNpb25Db3VudHMsXG4gIHN3aXRjaFRhYixcbiAgbG9hZFRhYkNvbnRlbnQsXG4gIHBvcHVsYXRlQW5hbHlzaXNUYWIsXG4gIGhhbmRsZUN1c3RvbWl6YXRpb25SZXNwb25zZSxcbiAgc2hvd1RhYmxlQmFzZWRSZXZpZXcsXG4gIHBvcHVsYXRlUmV2aWV3VGFiLFxuICBwb3B1bGF0ZVRhZ2xpbmVSZXZpZXdUYWIsXG4gIHN3aXRjaFJldmlld1N1YnRhYixcbiAgX2xvYWRSZXZpZXdQYW5lLFxuICBfdXBkYXRlUGFnZUVzdGltYXRlLFxuICBoYW5kbGVBY3Rpb25DbGljayxcbiAgYnVsa0FjdGlvbixcbiAgX3Jlc29sdmVkRXhwQWN0aW9uLFxuICBfcmVzb2x2ZWRTa2lsbEFjdGlvbixcbn07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi93b3JrZmxvdy1zdGVwcy5qc1xuICogV29ya2Zsb3cgcHJvZ3Jlc3MgYmFyLCBwaGFzZSByZS1ydW4vYmFjay1uYXYsIGFuZCBidWxsZXQgcmVvcmRlciBtb2RhbC5cbiAqXG4gKiBEZXBlbmRlbmNpZXMgKHJlc29sdmVkIHRocm91Z2ggZ2xvYmFsVGhpcyBhdCBydW50aW1lKTpcbiAqICAgUEhBU0VTLCBlc2NhcGVIdG1sLFxuICogICBhcHBlbmRMb2FkaW5nTWVzc2FnZSwgcmVtb3ZlTG9hZGluZ01lc3NhZ2UsIGFwcGVuZFJldHJ5TWVzc2FnZSwgYXBwZW5kTWVzc2FnZSxcbiAqICAgc2V0TG9hZGluZywgZmV0Y2hTdGF0dXMsIHN3aXRjaFRhYiwgc2VuZEFjdGlvbixcbiAqICAgc2hvd0xvYWRKb2JQYW5lbCwgdXBkYXRlQWN0aW9uQnV0dG9ucywgdXBkYXRlVGFiQmFyRm9yU3RhZ2UsXG4gKiAgIHRyYXBGb2N1cywgcmVzdG9yZUZvY3VzLCBfZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCxcbiAqICAgcG9zdEFuYWx5c2lzUXVlc3Rpb25zLCBxdWVzdGlvbkFuc3dlcnMsIENTU1xuICovXG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmNvbnN0IGxvZyA9IGdldExvZ2dlcignd29ya2Zsb3ctc3RlcHMnKTtcblxuaW1wb3J0IHsgc3RhdGVNYW5hZ2VyLCBHRU5FUkFUSU9OX1NUQVRFX0VWRU5UIH0gZnJvbSAnLi9zdGF0ZS1tYW5hZ2VyLmpzJztcblxuZnVuY3Rpb24gX2ZpbmRFeHBlcmllbmNlUmVjb21tZW5kYXRpb25SZWNvcmQoZXhwSWQpIHtcbiAgY29uc3QgZGF0YSA9IGdsb2JhbFRoaXMud2luZG93Py5wZW5kaW5nUmVjb21tZW5kYXRpb25zO1xuICBpZiAoIWRhdGEgfHwgIUFycmF5LmlzQXJyYXkoZGF0YS5leHBlcmllbmNlX3JlY29tbWVuZGF0aW9ucykpIHJldHVybiBudWxsO1xuICByZXR1cm4gZGF0YS5leHBlcmllbmNlX3JlY29tbWVuZGF0aW9ucy5maW5kKChyZWMpID0+IFN0cmluZyhyZWM/LmlkIHx8IHJlYz8uZXhwZXJpZW5jZV9pZCB8fCAnJykgPT09IFN0cmluZyhleHBJZCkpIHx8IG51bGw7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBTdGVwLW9yZGVyIGNvbnN0YW50cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuY29uc3QgX1NURVBfT1JERVIgPSBbXG4gICdqb2InLCAnYW5hbHlzaXMnLCAnY3VzdG9taXphdGlvbnMnLCAncmV3cml0ZScsICdzcGVsbCcsICdsYXlvdXQnLFxuICAnZG93bmxvYWQnLCAnY292ZXJfbGV0dGVyJywgJ3NjcmVlbmluZycsICdpbnRlcnZpZXdfcHJlcCcsICd0aGFua195b3UnLCAnaGFydmVzdCcsXG5dO1xuY29uc3QgX1NURVBfRElTUExBWSA9IHtcbiAgam9iOiAgICAgICAgICAgICdKb2IgSW5wdXQnLFxuICBhbmFseXNpczogICAgICAgJ0pvYiBBbmFseXNpcycsXG4gIGN1c3RvbWl6YXRpb25zOiAnQ3VzdG9taXNhdGlvbnMnLFxuICByZXdyaXRlOiAgICAgICAgJ1Jld3JpdGUgUmV2aWV3JyxcbiAgc3BlbGw6ICAgICAgICAgICdTcGVsbCBDaGVjaycsXG4gIGxheW91dDogICAgICAgICAnTGF5b3V0IFJldmlldycsXG4gIGRvd25sb2FkOiAgICAgICAnRmlsZSBSZXZpZXcnLFxuICBjb3Zlcl9sZXR0ZXI6ICAgJ0NvdmVyIExldHRlcicsXG4gIHNjcmVlbmluZzogICAgICAnU2NyZWVuaW5nJyxcbiAgaW50ZXJ2aWV3X3ByZXA6ICdJbnRlcnZpZXcgUHJlcCcsXG4gIHRoYW5rX3lvdTogICAgICAnVGhhbmsgWW91JyxcbiAgaGFydmVzdDogICAgICAgICdIYXJ2ZXN0Jyxcbn07XG5jb25zdCBfQUNUSU9OX0xBQkVMUyA9IHtcbiAgcmVjb21tZW5kX2N1c3RvbWl6YXRpb25zOiAnU2VsZWN0aW5nIGV4cGVyaWVuY2VzICYgc2tpbGxzXHUyMDI2JyxcbiAgZ2VuZXJhdGVfY3Y6ICdHZW5lcmF0aW5nIENWXHUyMDI2Jyxcbn07XG5cbmNvbnN0IF9OQVZfVEFCX0xBQkVMUyA9IHtcbiAgZG93bmxvYWQ6ICdcdTJCMDdcdUZFMEYgRmlsZSBSZXZpZXcnLFxufTtcblxuZnVuY3Rpb24gYXBwbHlMYXlvdXRGcmVzaG5lc3NOYXZpZ2F0aW9uU3RhdGUoKSB7XG4gIGNvbnN0IGZyZXNobmVzcyA9IHN0YXRlTWFuYWdlci5nZXRMYXlvdXRGcmVzaG5lc3MoKTtcbiAgY29uc3QgZ2VuZXJhdGlvblN0YXRlID0gc3RhdGVNYW5hZ2VyLmdldEdlbmVyYXRpb25TdGF0ZSgpO1xuICBjb25zdCBsYXlvdXRTdGVwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0ZXAtbGF5b3V0Jyk7XG5cbiAgaWYgKGxheW91dFN0ZXApIHtcbiAgICBsYXlvdXRTdGVwLmNsYXNzTGlzdC5yZW1vdmUoJ3N0YWxlJywgJ3N0YWxlLWNyaXRpY2FsJyk7XG4gICAgY29uc3QgcmVydW4gPSBsYXlvdXRTdGVwLnF1ZXJ5U2VsZWN0b3IoJy5zdGVwLXJlcnVuJyk/Lm91dGVySFRNTCB8fCAnJztcbiAgICBjb25zdCByZWZpbmVCYWRnZSA9IGxheW91dFN0ZXAucXVlcnlTZWxlY3RvcignLnN0ZXAtaW5saW5lLWJhZGdlJyk/Lm91dGVySFRNTCB8fCAnJztcbiAgICBjb25zdCBzdGFsZUJhZGdlID0gZnJlc2huZXNzLmlzU3RhbGVcbiAgICAgID8gJyA8c3BhbiBjbGFzcz1cInN0ZXAtaW5saW5lLWJhZGdlIHN0ZXAtc3RhbGUtYmFkZ2VcIj5PdXRkYXRlZDwvc3Bhbj4nXG4gICAgICA6ICcnO1xuICAgIGlmIChmcmVzaG5lc3MuaXNTdGFsZSkge1xuICAgICAgbGF5b3V0U3RlcC5jbGFzc0xpc3QuYWRkKCdzdGFsZScpO1xuICAgICAgaWYgKGZyZXNobmVzcy5pc0NyaXRpY2FsKSBsYXlvdXRTdGVwLmNsYXNzTGlzdC5hZGQoJ3N0YWxlLWNyaXRpY2FsJyk7XG4gICAgfVxuICAgIGxheW91dFN0ZXAuaW5uZXJIVE1MID0gYFx1RDgzQ1x1REZBOCBMYXlvdXQgUmV2aWV3JHtzdGFsZUJhZGdlfSR7cmVmaW5lQmFkZ2UgPyBgICR7cmVmaW5lQmFkZ2V9YCA6ICcnfSR7cmVydW4gPyBgICR7cmVydW59YCA6ICcnfWA7XG4gIH1cblxuICBjb25zdCBzaG93RG93bnN0cmVhbUJhZGdlID0gZnJlc2huZXNzLmlzU3RhbGUgJiYgQm9vbGVhbihcbiAgICBnZW5lcmF0aW9uU3RhdGUuZmluYWxHZW5lcmF0ZWRBdCB8fCBnZW5lcmF0aW9uU3RhdGUucGhhc2UgPT09ICdmaW5hbF9jb21wbGV0ZSdcbiAgKTtcbiAgT2JqZWN0LmVudHJpZXMoX05BVl9UQUJfTEFCRUxTKS5mb3JFYWNoKChbdGFiLCBsYWJlbF0pID0+IHtcbiAgICBjb25zdCB0YWJFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGB0YWItJHt0YWJ9YCk7XG4gICAgaWYgKCF0YWJFbCkgcmV0dXJuO1xuICAgIHRhYkVsLmNsYXNzTGlzdC5yZW1vdmUoJ3RhYi1zdGFsZScsICd0YWItc3RhbGUtY3JpdGljYWwnKTtcbiAgICBpZiAoc2hvd0Rvd25zdHJlYW1CYWRnZSkge1xuICAgICAgdGFiRWwuY2xhc3NMaXN0LmFkZCgndGFiLXN0YWxlJyk7XG4gICAgICBpZiAoZnJlc2huZXNzLmlzQ3JpdGljYWwpIHRhYkVsLmNsYXNzTGlzdC5hZGQoJ3RhYi1zdGFsZS1jcml0aWNhbCcpO1xuICAgICAgdGFiRWwuaW5uZXJIVE1MID0gYCR7bGFiZWx9IDxzcGFuIGNsYXNzPVwidGFiLXN0YWxlLWJhZGdlXCI+T3V0ZGF0ZWQ8L3NwYW4+YDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGFiRWwudGV4dENvbnRlbnQgPSBsYWJlbDtcbiAgICB9XG4gIH0pO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgQmFjayB0byBwaGFzZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gYmFja1RvUGhhc2Uoc3RlcCwgZmVlZGJhY2spIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBib2R5ID0gZmVlZGJhY2sgPyB7cGhhc2U6IHN0ZXAsIGZlZWRiYWNrfSA6IHtwaGFzZTogc3RlcH07XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL2JhY2stdG8tcGhhc2UnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmICghcmVzLm9rIHx8ICFkYXRhLm9rKSB7XG4gICAgICBhcHBlbmRSZXRyeU1lc3NhZ2UoJ1x1MjZBMCBDb3VsZCBub3QgbmF2aWdhdGUgYmFjazogJyArIChkYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yJyksICgpID0+IGJhY2tUb1BoYXNlKHN0ZXAsIGZlZWRiYWNrKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIGBcdTIxQkIgTmF2aWdhdGluZyBiYWNrIHRvICR7c3RlcH0uIFByaW9yIGRlY2lzaW9ucyBhbmQgYXBwcm92YWxzIGFyZSBwcmVzZXJ2ZWQuYCk7XG4gICAgaWYgKGZlZWRiYWNrKSBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCBgUmVmaW5lbWVudCBmZWVkYmFjayBxdWV1ZWQ6IFwiJHtmZWVkYmFja31cImApO1xuICAgIGF3YWl0IGZldGNoU3RhdHVzKCk7XG5cbiAgICAvLyBTd2l0Y2ggdG8gdGhlIGFwcHJvcHJpYXRlIHZpZXdlciB0YWJcbiAgICBjb25zdCB0YWJNYXAgPSB7XG4gICAgICBqb2I6ICAgICAgICAgICAgbnVsbCxcbiAgICAgIGFuYWx5c2lzOiAgICAgICAnYW5hbHlzaXMnLFxuICAgICAgY3VzdG9taXphdGlvbnM6ICdnb2FscycsXG4gICAgICByZXdyaXRlOiAgICAgICAgJ3Jld3JpdGUnLFxuICAgICAgc3BlbGw6ICAgICAgICAgICdzcGVsbCcsXG4gICAgfTtcbiAgICBjb25zdCByZXNvbHZlZFRhYiA9IHRhYk1hcFtzdGVwXSB8fCB0YWJNYXBbZGF0YS5waGFzZV0gfHwgbnVsbDtcbiAgICBpZiAocmVzb2x2ZWRUYWIpIHN3aXRjaFRhYihyZXNvbHZlZFRhYik7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGFwcGVuZFJldHJ5TWVzc2FnZSgnXHUyNkEwIE5ldHdvcmsgZXJyb3IgaW4gYmFja1RvUGhhc2U6ICcgKyBlcnIubWVzc2FnZSwgKCkgPT4gYmFja1RvUGhhc2Uoc3RlcCkpO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBSZS1ydW4gY29uZmlybSBtb2RhbCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLyoqXG4gKiBTaG93IGEgZG93bnN0cmVhbS1hd2FyZSBjb25maXJtYXRpb24gbW9kYWwgYmVmb3JlIHJlLXJ1bm5pbmcgb3IgYmFjay1uYXZpZ2F0aW5nLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgc3RlcCAgICAgIC0gVGhlIHRhcmdldCBzdGVwIGtleVxuICogQHBhcmFtIHsncmVydW4nfCdiYWNrLW5hdid9IG1vZGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IG9uQ29uZmlybSAtIENhbGxlZCBpZiB0aGUgdXNlciBjbGlja3MgUHJvY2VlZFxuICovXG5mdW5jdGlvbiBfc2hvd1JlUnVuQ29uZmlybU1vZGFsKHN0ZXAsIG1vZGUsIG9uQ29uZmlybSkge1xuICBjb25zdCBzdGVwSWR4ICAgID0gX1NURVBfT1JERVIuaW5kZXhPZihzdGVwKTtcbiAgLy8gT25seSBzaG93IGRvd25zdHJlYW0gc3RhZ2VzIHRoYXQgaGF2ZSBhY3R1YWxseSBiZWVuIGNvbXBsZXRlZFxuICBjb25zdCBkb3duc3RyZWFtID0gX1NURVBfT1JERVIuc2xpY2Uoc3RlcElkeCArIDEpLmZpbHRlcihzID0+IHtcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzdGVwLSR7c31gKTtcbiAgICByZXR1cm4gZWwgJiYgZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdjb21wbGV0ZWQnKTtcbiAgfSk7XG4gIGNvbnN0IHN0ZXBMYWJlbCAgPSBfU1RFUF9ESVNQTEFZW3N0ZXBdIHx8IHN0ZXA7XG5cbiAgY29uc3QgdGl0bGUgPSBtb2RlID09PSAncmVydW4nXG4gICAgPyBgXHUyMUJCIFJlLXJ1biAke3N0ZXBMYWJlbH0/YFxuICAgIDogYFx1MjE5MCBOYXZpZ2F0ZSBiYWNrIHRvICR7c3RlcExhYmVsfT9gO1xuICBjb25zdCBib2R5VGV4dCA9IG1vZGUgPT09ICdyZXJ1bidcbiAgICA/ICdUaGUgZm9sbG93aW5nIHN0YWdlcyB3aWxsIHNlZSB1cGRhdGVkIGlucHV0cyBhbmQgbWF5IHNob3cgY2hhbmdlZCByZWNvbW1lbmRhdGlvbnM6J1xuICAgIDogJ1lvdSBhcmUgbmF2aWdhdGluZyBiYWNrIHBhc3QgdGhlIGZvbGxvd2luZyBjb21wbGV0ZWQgc3RhZ2VzOic7XG4gIGNvbnN0IG5vdGUgPSAnQWxsIGV4aXN0aW5nIGFwcHJvdmFscyBhbmQgcmV3cml0ZXMgYXJlIHByZXNlcnZlZCBhcyBjb250ZXh0Lic7XG5cbiAgY29uc3QgbGlzdEh0bWwgPSBkb3duc3RyZWFtXG4gICAgLm1hcChzID0+IGA8bGkgc3R5bGU9XCJwYWRkaW5nOjJweCAwO1wiPiR7X1NURVBfRElTUExBWVtzXSB8fCBzfTwvbGk+YClcbiAgICAuam9pbignJyk7XG5cbiAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBvdmVybGF5LmlkID0gJ3JlcnVuLWNvbmZpcm0tb3ZlcmxheSc7XG4gIG92ZXJsYXkuc3R5bGUuY3NzVGV4dCA9IGBwb3NpdGlvbjpmaXhlZDtpbnNldDowO2JhY2tncm91bmQ6cmdiYSgwLDAsMCwwLjUpO1xuICAgIHotaW5kZXg6MTAwMDA7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2A7XG4gIG92ZXJsYXkuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgcm9sZT1cImRpYWxvZ1wiIGFyaWEtbW9kYWw9XCJ0cnVlXCIgYXJpYS1sYWJlbGxlZGJ5PVwicmVydW4tY29uZmlybS10aXRsZVwiXG4gICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6I2ZmZjtib3JkZXItcmFkaXVzOjEwcHg7cGFkZGluZzoyNHB4IDI4cHg7bWF4LXdpZHRoOjQ0MHB4O1xuICAgICAgICAgICAgICAgIHdpZHRoOjkyJTtib3gtc2hhZG93OjAgMjBweCA2MHB4IHJnYmEoMCwwLDAsMC4zKTtcIj5cbiAgICAgIDxoMyBpZD1cInJlcnVuLWNvbmZpcm0tdGl0bGVcIiBzdHlsZT1cIm1hcmdpbjowIDAgMTBweDtmb250LXNpemU6MS4xZW07Y29sb3I6IzFlMjkzYjtcIj5cbiAgICAgICAgJHtlc2NhcGVIdG1sKHRpdGxlKX08L2gzPlxuICAgICAgPHAgc3R5bGU9XCJtYXJnaW46MCAwIDhweDtmb250LXNpemU6MC45ZW07Y29sb3I6IzQ3NTU2OTtcIj4ke2VzY2FwZUh0bWwoYm9keVRleHQpfTwvcD5cbiAgICAgIDx1bCBzdHlsZT1cIm1hcmdpbjowIDAgMTJweDtwYWRkaW5nLWxlZnQ6MjBweDtmb250LXNpemU6MC45ZW07Y29sb3I6IzM3NDE1MTtcIj4ke2xpc3RIdG1sfTwvdWw+XG4gICAgICA8cCBzdHlsZT1cIm1hcmdpbjowIDAgMThweDtmb250LXNpemU6MC44NWVtO2NvbG9yOiM2YjcyODA7XCI+JHtlc2NhcGVIdG1sKG5vdGUpfTwvcD5cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjEwcHg7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kO1wiPlxuICAgICAgICA8YnV0dG9uIGlkPVwicmVydW4tY2FuY2VsLWJ0blwiIGNsYXNzPVwiYnRuLXNlY29uZGFyeVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwicmVydW4tcHJvY2VlZC1idG5cIiBjbGFzcz1cImJ0bi1wcmltYXJ5XCI+UHJvY2VlZDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+YDtcblxuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG92ZXJsYXkpO1xuICBfZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIGlmICh0eXBlb2YgdHJhcEZvY3VzID09PSAnZnVuY3Rpb24nKSB0cmFwRm9jdXMoJ3JlcnVuLWNvbmZpcm0tb3ZlcmxheScpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVydW4tcHJvY2VlZC1idG4nKS5mb2N1cygpO1xuXG4gIGNvbnN0IGNsb3NlID0gKCkgPT4geyBvdmVybGF5LnJlbW92ZSgpOyByZXN0b3JlRm9jdXMoKTsgfTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlcnVuLWNhbmNlbC1idG4nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNsb3NlKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlcnVuLXByb2NlZWQtYnRuJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7IGNsb3NlKCk7IG9uQ29uZmlybSgpOyB9KTtcbiAgb3ZlcmxheS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGUgPT4geyBpZiAoZS50YXJnZXQgPT09IG92ZXJsYXkpIGNsb3NlKCk7IH0pO1xuICBvdmVybGF5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBlID0+IHsgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgY2xvc2UoKTsgfSk7XG59XG5cbmZ1bmN0aW9uIGNvbmZpcm1SZVJ1blBoYXNlKHN0ZXApIHtcbiAgX3Nob3dSZVJ1bkNvbmZpcm1Nb2RhbChzdGVwLCAncmVydW4nLCAoKSA9PiBiYWNrVG9QaGFzZShzdGVwKSk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBWaWV3LWN1cnNvciBpbmRpY2F0b3IgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8qKlxuICogUmV0dXJuIGEgdG9vbHRpcCBzdHJpbmcgZm9yIGEgc3RlcCBwaWxsIGJhc2VkIG9uIGl0cyBjb21iaW5lZCBzdGF0ZS5cbiAqL1xuZnVuY3Rpb24gX2dldFN0ZXBUb29sdGlwKHN0ZXAsIGlzQWN0aXZlLCBpc1ZpZXdpbmcsIGlzQnJvd3NpbmdBd2F5LCBpc0NvbXBsZXRlZCwgaXNTdGFsZSwgaXNTdGFsZUNyaXRpY2FsKSB7XG4gIGlmIChpc1N0YWxlQ3JpdGljYWwpIHJldHVybiBpc1ZpZXdpbmcgPyAnQ3JpdGljYWwgY2hhbmdlcyBcdTIwMTQgcmV2aWV3IHJlcXVpcmVkLiBDbGljayBcdTIxQkIgdG8gcmVydW4uJyA6ICdDcml0aWNhbCBjaGFuZ2VzIFx1MjAxNCByZXZpZXcgcmVxdWlyZWQuJztcbiAgaWYgKGlzU3RhbGUpICAgICAgICAgcmV0dXJuIGlzVmlld2luZyA/ICdSZXN1bHRzIG1heSBiZSBvdXRkYXRlZC4gQ2xpY2sgXHUyMUJCIHRvIHJlcnVuLicgICAgICAgICAgIDogJ1Jlc3VsdHMgbWF5IGJlIG91dGRhdGVkLic7XG4gIGlmIChpc0Jyb3dzaW5nQXdheSkgIHJldHVybiAnQWN0aXZlIHN0ZXAgXHUyMDE0IGNsaWNrIHRvIHJldHVybic7XG4gIGlmIChpc0FjdGl2ZSAmJiBpc1ZpZXdpbmcpICAgIHJldHVybiAnQ3VycmVudCBzdGVwJztcbiAgaWYgKGlzQ29tcGxldGVkICYmIGlzVmlld2luZykgcmV0dXJuICdDbGljayBcdTIxQkIgdG8gcmVydW4gZnJvbSBoZXJlJztcbiAgaWYgKGlzQ29tcGxldGVkKSAgICAgICAgICAgICAgcmV0dXJuICdDbGljayB0byB2aWV3JztcbiAgcmV0dXJuICcnO1xufVxuXG4vKipcbiAqIFN5bmMgdGhlIGJsdWUgcmluZyAodmlldyBjdXJzb3IpIGFuZCBhbWJlciBwdWxzaW5nIHJpbmcgKGJyb3dzaW5nLWF3YXkpXG4gKiB0byB0aGUgY3VycmVudGx5IHZpc2libGUgdGFiLiBDYWxsZWQgYWZ0ZXIgZXZlcnkgdGFiIHN3aXRjaCBhbmQgc3RhdHVzIHVwZGF0ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWJOYW1lIC0gVGhlIGN1cnJlbnRseSB2aXNpYmxlIHRhYiBpZCAoZS5nLiAnYW5hbHlzaXMnLCAnZXhwLXJldmlldycpXG4gKi9cbmZ1bmN0aW9uIF91cGRhdGVWaWV3aW5nSW5kaWNhdG9yKHRhYk5hbWUpIHtcbiAgY29uc3QgdGFiVG9TdGVwID0ge1xuICAgICdqb2InOiAgICAgICAgICAgJ2pvYicsXG4gICAgJ2FuYWx5c2lzJzogICAgICAnYW5hbHlzaXMnLFxuICAgICdxdWVzdGlvbnMnOiAgICAgJ2FuYWx5c2lzJyxcbiAgICAnZXhwLXJldmlldyc6ICAgICdjdXN0b21pemF0aW9ucycsXG4gICAgJ3Jld3JpdGUnOiAgICAgICAncmV3cml0ZScsXG4gICAgJ3NwZWxsJzogICAgICAgICAnc3BlbGwnLFxuICAgICdsYXlvdXQnOiAgICAgICAgJ2xheW91dCcsXG4gICAgJ2ZpbmFsX2dlbmVyYXRlJzonZG93bmxvYWQnLFxuICAgICdkb3dubG9hZCc6ICAgICAgJ2Rvd25sb2FkJyxcbiAgICAnY292ZXItbGV0dGVyJzogICdjb3Zlcl9sZXR0ZXInLFxuICAgICdzY3JlZW5pbmcnOiAgICAgJ3NjcmVlbmluZycsXG4gICAgJ2ludGVydmlldy1wcmVwJzonaW50ZXJ2aWV3X3ByZXAnLFxuICAgICd0aGFuay15b3UnOiAgICAgJ3RoYW5rX3lvdScsXG4gICAgJ2hhcnZlc3QnOiAgICAgICAnaGFydmVzdCcsXG4gIH07XG4gIGNvbnN0IHZpZXdlZFN0ZXAgPSB0YWJUb1N0ZXBbdGFiTmFtZV0gfHwgbnVsbDtcblxuICBsZXQgYWN0aXZlU3RlcCA9IG51bGw7XG4gIF9TVEVQX09SREVSLmZvckVhY2goc3RlcCA9PiB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc3RlcC0ke3N0ZXB9YCk7XG4gICAgaWYgKGVsICYmIGVsLmNsYXNzTGlzdC5jb250YWlucygnYWN0aXZlJykpIGFjdGl2ZVN0ZXAgPSBzdGVwO1xuICB9KTtcblxuICBfU1RFUF9PUkRFUi5mb3JFYWNoKHN0ZXAgPT4ge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHN0ZXAtJHtzdGVwfWApO1xuICAgIGlmICghZWwpIHJldHVybjtcblxuICAgIGNvbnN0IGlzVmlld2luZyAgICAgID0gc3RlcCA9PT0gdmlld2VkU3RlcDtcbiAgICBjb25zdCBpc0FjdGl2ZSAgICAgICA9IHN0ZXAgPT09IGFjdGl2ZVN0ZXA7XG4gICAgY29uc3QgaXNCcm93c2luZ0F3YXkgPSBpc0FjdGl2ZSAmJiAhIXZpZXdlZFN0ZXAgJiYgdmlld2VkU3RlcCAhPT0gYWN0aXZlU3RlcDtcbiAgICBjb25zdCBpc0NvbXBsZXRlZCAgICA9IGVsLmNsYXNzTGlzdC5jb250YWlucygnY29tcGxldGVkJyk7XG4gICAgY29uc3QgaXNTdGFsZSAgICAgICAgPSBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ3N0YWxlJyk7XG4gICAgY29uc3QgaXNTdGFsZUNyaXRpY2FsID0gZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdzdGFsZS1jcml0aWNhbCcpO1xuXG4gICAgZWwuY2xhc3NMaXN0LnRvZ2dsZSgndmlld2luZycsICAgICAgIGlzVmlld2luZyk7XG4gICAgZWwuY2xhc3NMaXN0LnRvZ2dsZSgnYnJvd3NpbmctYXdheScsIGlzQnJvd3NpbmdBd2F5KTtcblxuICAgIGNvbnN0IHRvb2x0aXBUZXh0ID0gX2dldFN0ZXBUb29sdGlwKHN0ZXAsIGlzQWN0aXZlLCBpc1ZpZXdpbmcsIGlzQnJvd3NpbmdBd2F5LCBpc0NvbXBsZXRlZCwgaXNTdGFsZSwgaXNTdGFsZUNyaXRpY2FsKTtcbiAgICBpZiAodG9vbHRpcFRleHQpIHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZSgnZGF0YS1icy10b2dnbGUnLCAgICAndG9vbHRpcCcpO1xuICAgICAgZWwuc2V0QXR0cmlidXRlKCdkYXRhLWJzLXBsYWNlbWVudCcsICdib3R0b20nKTtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZSgnZGF0YS1icy10aXRsZScsICAgICB0b29sdGlwVGV4dCk7XG4gICAgICBpZiAodHlwZW9mIGJvb3RzdHJhcCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY29uc3QgdGlwID0gYm9vdHN0cmFwLlRvb2x0aXAuZ2V0SW5zdGFuY2UoZWwpO1xuICAgICAgICBpZiAodGlwKSB0aXAuc2V0Q29udGVudCh7ICcudG9vbHRpcC1pbm5lcic6IHRvb2x0aXBUZXh0IH0pO1xuICAgICAgICBlbHNlICAgICBuZXcgYm9vdHN0cmFwLlRvb2x0aXAoZWwpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtYnMtdG9nZ2xlJyk7XG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtYnMtdGl0bGUnKTtcbiAgICAgIGlmICh0eXBlb2YgYm9vdHN0cmFwICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBjb25zdCB0aXAgPSBib290c3RyYXAuVG9vbHRpcC5nZXRJbnN0YW5jZShlbCk7XG4gICAgICAgIGlmICh0aXApIHRpcC5kaXNwb3NlKCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFJlLXJ1biBwaGFzZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLyoqXG4gKiBTaG93IGFuIGFtZW5kLWNsYXJpZmljYXRpb25zIG1vZGFsIGJlZm9yZSByZS1ydW5uaW5nIHRoZSBhbmFseXNpcyBwaGFzZS5cbiAqIENhbGxzIG9uUHJvY2VlZCgpIGlmIHRoZSB1c2VyIGNvbmZpcm1zICh3aXRoIG9yIHdpdGhvdXQgdXBkYXRpbmcgYW5zd2VycykuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIF9zaG93QW5hbHlzaXNDbGFyaWZpY2F0aW9uQW1lbmRNb2RhbChvblByb2NlZWQpIHtcbiAgY29uc3QgcXVlc3Rpb25zID0gd2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucyB8fCBbXTtcbiAgY29uc3QgYW5zd2VycyAgID0gd2luZG93LnF1ZXN0aW9uQW5zd2VycyB8fCB7fTtcblxuICAvLyBObyBwcmlvciBxdWVzdGlvbnMgXHUyMDE0IHNraXAgdGhlIG1vZGFsIGFuZCBwcm9jZWVkIGRpcmVjdGx5LlxuICBpZiAoIXF1ZXN0aW9ucy5sZW5ndGgpIHsgYXdhaXQgb25Qcm9jZWVkKCk7IHJldHVybjsgfVxuXG4gIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgb3ZlcmxheS5pZCA9ICdjbGFyLWFtZW5kLW92ZXJsYXknO1xuICBvdmVybGF5LnN0eWxlLmNzc1RleHQgPSAncG9zaXRpb246Zml4ZWQ7aW5zZXQ6MDtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsMC41KTt6LWluZGV4OjEwMDAwO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjtvdmVyZmxvdy15OmF1dG87JztcblxuICBjb25zdCBmb3JtUm93cyA9IHF1ZXN0aW9ucy5tYXAoKHEsIGkpID0+IHtcbiAgICBjb25zdCBxdHlwZSAgPSBxLnR5cGUgfHwgYGNsYXJpZmljYXRpb25fJHtpICsgMX1gO1xuICAgIGNvbnN0IHF0ZXh0ICA9IGVzY2FwZUh0bWwocS5xdWVzdGlvbiB8fCAnJyk7XG4gICAgY29uc3QgY3VyQW5zID0gZXNjYXBlSHRtbChhbnN3ZXJzW3F0eXBlXSB8fCAnJyk7XG4gICAgY29uc3QgY2hvaWNlcyA9IEFycmF5LmlzQXJyYXkocS5jaG9pY2VzKSA/IHEuY2hvaWNlcyA6IFtdO1xuXG4gICAgaWYgKGNob2ljZXMubGVuZ3RoKSB7XG4gICAgICBjb25zdCByYWRpb3MgPSBjaG9pY2VzLm1hcChjID0+IGBcbiAgICAgICAgPGxhYmVsIHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6NnB4O21hcmdpbi1ib3R0b206NHB4O2N1cnNvcjpwb2ludGVyO1wiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwiY2xhci0ke2VzY2FwZUh0bWwocXR5cGUpfVwiIHZhbHVlPVwiJHtlc2NhcGVIdG1sKGMpfVwiXG4gICAgICAgICAgICAke2Fuc3dlcnNbcXR5cGVdID09PSBjID8gJ2NoZWNrZWQnIDogJyd9IHN0eWxlPVwiZmxleC1zaHJpbms6MDtcIj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjllbTtcIj4ke2VzY2FwZUh0bWwoYyl9PC9zcGFuPlxuICAgICAgICA8L2xhYmVsPmApLmpvaW4oJycpO1xuICAgICAgcmV0dXJuIGBcbiAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTRweDtcIj5cbiAgICAgICAgICA8bGFiZWwgc3R5bGU9XCJmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjAuOWVtO2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWJvdHRvbTo2cHg7XCI+JHtxdGV4dH08L2xhYmVsPlxuICAgICAgICAgICR7cmFkaW9zfVxuICAgICAgICA8L2Rpdj5gO1xuICAgIH1cbiAgICByZXR1cm4gYFxuICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTRweDtcIj5cbiAgICAgICAgPGxhYmVsIGZvcj1cImNsYXItYW5zLSR7ZXNjYXBlSHRtbChxdHlwZSl9XCIgc3R5bGU9XCJmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjAuOWVtO2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWJvdHRvbTo0cHg7XCI+JHtxdGV4dH08L2xhYmVsPlxuICAgICAgICA8dGV4dGFyZWEgaWQ9XCJjbGFyLWFucy0ke2VzY2FwZUh0bWwocXR5cGUpfVwiIG5hbWU9XCJjbGFyLSR7ZXNjYXBlSHRtbChxdHlwZSl9XCIgcm93cz1cIjJcIlxuICAgICAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTtib3gtc2l6aW5nOmJvcmRlci1ib3g7cGFkZGluZzo2cHggOHB4O2JvcmRlcjoxcHggc29saWQgI2QxZDVkYjtib3JkZXItcmFkaXVzOjZweDtmb250LXNpemU6MC45ZW07cmVzaXplOnZlcnRpY2FsO1wiXG4gICAgICAgID4ke2N1ckFuc308L3RleHRhcmVhPlxuICAgICAgPC9kaXY+YDtcbiAgfSkuam9pbignJyk7XG5cbiAgb3ZlcmxheS5pbm5lckhUTUwgPSBgXG4gICAgPGRpdiByb2xlPVwiZGlhbG9nXCIgYXJpYS1tb2RhbD1cInRydWVcIiBhcmlhLWxhYmVsbGVkYnk9XCJjbGFyLWFtZW5kLXRpdGxlXCJcbiAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDojZmZmO2JvcmRlci1yYWRpdXM6MTBweDtwYWRkaW5nOjI0cHggMjhweDttYXgtd2lkdGg6NTAwcHg7d2lkdGg6OTQlO1xuICAgICAgICAgICAgICAgIGJveC1zaGFkb3c6MCAyMHB4IDYwcHggcmdiYSgwLDAsMCwwLjMpO21hcmdpbjoyMHB4IGF1dG87XCI+XG4gICAgICA8aDMgaWQ9XCJjbGFyLWFtZW5kLXRpdGxlXCIgc3R5bGU9XCJtYXJnaW46MCAwIDZweDtmb250LXNpemU6MS4xZW07Y29sb3I6IzFlMjkzYjtcIj5cdTIxQkIgQW1lbmQgQ2xhcmlmaWNhdGlvbiBBbnN3ZXJzPC9oMz5cbiAgICAgIDxwIHN0eWxlPVwibWFyZ2luOjAgMCAxNnB4O2ZvbnQtc2l6ZTowLjg1ZW07Y29sb3I6IzZiNzI4MDtcIj5cbiAgICAgICAgVXBkYXRlIHlvdXIgYW5zd2VycyBiZWZvcmUgcmVydW5uaW5nIGFuYWx5c2lzLCBvciBrZWVwIHRoZW0gYXMtaXMuXG4gICAgICA8L3A+XG4gICAgICA8Zm9ybSBpZD1cImNsYXItYW1lbmQtZm9ybVwiIG9uc3VibWl0PVwicmV0dXJuIGZhbHNlO1wiPlxuICAgICAgICAke2Zvcm1Sb3dzfVxuICAgICAgPC9mb3JtPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6MTBweDtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmQ7bWFyZ2luLXRvcDo4cHg7ZmxleC13cmFwOndyYXA7XCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJjbGFyLWFtZW5kLWNhbmNlbFwiIGNsYXNzPVwiYnRuLXNlY29uZGFyeVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwiY2xhci1hbWVuZC1rZWVwXCIgICBjbGFzcz1cImJ0bi1zZWNvbmRhcnlcIj5LZWVwIEV4aXN0aW5nIEFuc3dlcnM8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImNsYXItYW1lbmQtc2F2ZVwiICAgY2xhc3M9XCJidG4tcHJpbWFyeVwiPlVwZGF0ZSAmYW1wOyBSZXJ1bjwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+YDtcblxuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG92ZXJsYXkpO1xuICBpZiAodHlwZW9mIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsICE9PSAndW5kZWZpbmVkJykgd2luZG93Ll9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgaWYgKHR5cGVvZiB0cmFwRm9jdXMgPT09ICdmdW5jdGlvbicpIHRyYXBGb2N1cygnY2xhci1hbWVuZC1vdmVybGF5Jyk7XG4gIG92ZXJsYXkucXVlcnlTZWxlY3RvcignI2NsYXItYW1lbmQtc2F2ZScpLmZvY3VzKCk7XG5cbiAgZnVuY3Rpb24gY2xvc2VNb2RhbCgpIHtcbiAgICBvdmVybGF5LnJlbW92ZSgpO1xuICAgIGlmICh0eXBlb2YgcmVzdG9yZUZvY3VzID09PSAnZnVuY3Rpb24nKSByZXN0b3JlRm9jdXMoKTtcbiAgfVxuXG4gIG92ZXJsYXkucXVlcnlTZWxlY3RvcignI2NsYXItYW1lbmQtY2FuY2VsJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjbG9zZU1vZGFsKTtcbiAgb3ZlcmxheS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGUgPT4geyBpZiAoZS50YXJnZXQgPT09IG92ZXJsYXkpIGNsb3NlTW9kYWwoKTsgfSk7XG4gIG92ZXJsYXkuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGUgPT4geyBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSBjbG9zZU1vZGFsKCk7IH0pO1xuXG4gIG92ZXJsYXkucXVlcnlTZWxlY3RvcignI2NsYXItYW1lbmQta2VlcCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGNsb3NlTW9kYWwoKTtcbiAgICBvblByb2NlZWQoKTtcbiAgfSk7XG5cbiAgb3ZlcmxheS5xdWVyeVNlbGVjdG9yKCcjY2xhci1hbWVuZC1zYXZlJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZm9ybSAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbGFyLWFtZW5kLWZvcm0nKTtcbiAgICBjb25zdCB1cGRhdGVkID0ge307XG4gICAgcXVlc3Rpb25zLmZvckVhY2goKHEsIGkpID0+IHtcbiAgICAgIGNvbnN0IHF0eXBlID0gcS50eXBlIHx8IGBjbGFyaWZpY2F0aW9uXyR7aSArIDF9YDtcbiAgICAgIGNvbnN0IGVsICAgID0gZm9ybS5xdWVyeVNlbGVjdG9yKGBbbmFtZT1cImNsYXItJHtxdHlwZX1cIl1gKTtcbiAgICAgIGlmICghZWwpIHJldHVybjtcbiAgICAgIGlmIChlbC50eXBlID09PSAncmFkaW8nKSB7XG4gICAgICAgIGNvbnN0IGNoZWNrZWQgPSBmb3JtLnF1ZXJ5U2VsZWN0b3IoYFtuYW1lPVwiY2xhci0ke3F0eXBlfVwiXTpjaGVja2VkYCk7XG4gICAgICAgIGlmIChjaGVja2VkKSB1cGRhdGVkW3F0eXBlXSA9IGNoZWNrZWQudmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB2YWwgPSBlbC52YWx1ZS50cmltKCk7XG4gICAgICAgIGlmICh2YWwpIHVwZGF0ZWRbcXR5cGVdID0gdmFsO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY2xvc2VNb2RhbCgpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmZXRjaCgnL2FwaS9wb3N0LWFuYWx5c2lzLXJlc3BvbnNlcycsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHF1ZXN0aW9ucywgYW5zd2VyczogdXBkYXRlZCB9KSxcbiAgICAgIH0pO1xuICAgICAgd2luZG93LnF1ZXN0aW9uQW5zd2VycyA9IHVwZGF0ZWQ7XG4gICAgfSBjYXRjaCAoX2UpIHsgLyogc2lsZW50IFx1MjAxNCBwcm9jZWVkIHdpdGggd2hhdGV2ZXIgdGhlIGJhY2tlbmQgYWxyZWFkeSBoYXMgKi8gfVxuICAgIGF3YWl0IG9uUHJvY2VlZCgpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVSdW5QaGFzZShzdGVwKSB7XG4gIC8vIEludGVyY2VwdCBhbmFseXNpcyByZXJ1bnMgdG8gbGV0IHRoZSB1c2VyIGFtZW5kIHByaW9yIGNsYXJpZmljYXRpb24gYW5zd2Vycy5cbiAgaWYgKHN0ZXAgPT09ICdhbmFseXNpcycpIHtcbiAgICBhd2FpdCBfc2hvd0FuYWx5c2lzQ2xhcmlmaWNhdGlvbkFtZW5kTW9kYWwoKCkgPT4gX2V4ZWN1dGVSZVJ1blBoYXNlKCdhbmFseXNpcycpKTtcbiAgICByZXR1cm47XG4gIH1cbiAgYXdhaXQgX2V4ZWN1dGVSZVJ1blBoYXNlKHN0ZXApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBfZXhlY3V0ZVJlUnVuUGhhc2Uoc3RlcCkge1xuICBjb25zdCBsb2FkaW5nTXNnID0gYXBwZW5kTG9hZGluZ01lc3NhZ2UoYFx1MjFCQiBSZS1ydW5uaW5nICR7c3RlcH1cdTIwMjZgKTtcbiAgc2V0TG9hZGluZyh0cnVlLCBgUmUtcnVubmluZyAke3N0ZXB9XHUyMDI2YCk7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL3JlLXJ1bi1waGFzZScsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeydDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbid9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe3BoYXNlOiBzdGVwfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgcmVtb3ZlTG9hZGluZ01lc3NhZ2UobG9hZGluZ01zZyk7XG4gICAgc2V0TG9hZGluZyhmYWxzZSk7XG5cbiAgICBpZiAoIXJlcy5vayB8fCAhZGF0YS5vaykge1xuICAgICAgYXBwZW5kUmV0cnlNZXNzYWdlKCdcdTI2QTAgUmUtcnVuIGZhaWxlZDogJyArIChkYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yJyksICgpID0+IHJlUnVuUGhhc2Uoc3RlcCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIGBcdTI3MDUgJHtzdGVwfSByZS1ydW4gY29tcGxldGUuIFJldmlldyB0aGUgdXBkYXRlZCByZXN1bHRzIFx1MjAxNCBjaGFuZ2VkIGl0ZW1zIGFyZSBoaWdobGlnaHRlZC5gKTtcbiAgICBhd2FpdCBmZXRjaFN0YXR1cygpO1xuXG4gICAgLy8gQ2xlYXIgcGVyLXBoYXNlIGNhY2hlcyBzbyBiYWNrLW5hdmlnYXRpb24gZmV0Y2hlcyBmcmVzaCByZXN1bHRzXG4gICAgaWYgKHN0ZXAgPT09ICdzcGVsbCcpICAgd2luZG93Ll9zcGVsbENoZWNrQ2FjaGUgID0gbnVsbDtcbiAgICBpZiAoc3RlcCA9PT0gJ3Jld3JpdGUnKSB3aW5kb3cuX3Jld3JpdGVQYW5lbENhY2hlID0gbnVsbDtcblxuICAgIC8vIE5hdmlnYXRlIHRvIHRoZSBzdGVwJ3Mgdmlld2VyIHRhYlxuICAgIGNvbnN0IHRhYk1hcCA9IHtcbiAgICAgIGFuYWx5c2lzOiAgICAgICAnYW5hbHlzaXMnLFxuICAgICAgY3VzdG9taXphdGlvbnM6ICdnb2FscycsXG4gICAgICByZXdyaXRlOiAgICAgICAgJ3Jld3JpdGUnLFxuICAgICAgc3BlbGw6ICAgICAgICAgICdzcGVsbCcsXG4gICAgfTtcbiAgICBpZiAodGFiTWFwW3N0ZXBdKSBzd2l0Y2hUYWIodGFiTWFwW3N0ZXBdKTtcblxuICAgIC8vIENvbXB1dGUgY2hhbmdlZC1pdGVtIElEcyBmcm9tIHByaW9yIHZzIG5ldyBvdXRwdXQgYW5kIGhpZ2hsaWdodCB0aGVtLlxuICAgIGlmIChkYXRhLnByaW9yX291dHB1dCAmJiBkYXRhLm5ld19vdXRwdXQpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gX2hpZ2hsaWdodENoYW5nZWRJdGVtcyhzdGVwLCBkYXRhLnByaW9yX291dHB1dCwgZGF0YS5uZXdfb3V0cHV0KSwgMzAwKTtcbiAgICB9XG5cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmVtb3ZlTG9hZGluZ01lc3NhZ2UobG9hZGluZ01zZyk7XG4gICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgYXBwZW5kUmV0cnlNZXNzYWdlKCdcdTI2QTAgTmV0d29yayBlcnJvciBpbiByZVJ1blBoYXNlOiAnICsgZXJyLm1lc3NhZ2UsICgpID0+IHJlUnVuUGhhc2Uoc3RlcCkpO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBIaWdobGlnaHQgY2hhbmdlZCBpdGVtcyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLyoqXG4gKiBDb21wYXJlIHByaW9yIGFuZCBuZXcgcmUtcnVuIG91dHB1dHM7IG1hcmsgRE9NIGVsZW1lbnRzIGZvciBjaGFuZ2VkIGVudGl0aWVzLlxuICpcbiAqIFN0cmF0ZWdpZXMgYnkgc3RlcDpcbiAqICAgcmV3cml0ZSAgICAgICAgXHUyMDE0IGNvbXBhcmUgcmV3cml0ZSBJRHM7IG1hcmsgcnctY2FyZC08aWQ+XG4gKiAgIGN1c3RvbWl6YXRpb25zIFx1MjAxNCBjb21wYXJlIGV4cGVyaWVuY2UgSURzOyBtYXJrIHRyW2RhdGEtZXhwLWlkXSBhbmQgdHJbZGF0YS1za2lsbF1cbiAqICAgYW5hbHlzaXMgICAgICAgXHUyMDE0IG5vIHBlci1lbnRpdHkgRE9NIHRhcmdldGluZzsgc2tpcFxuICovXG5mdW5jdGlvbiBfaGlnaGxpZ2h0Q2hhbmdlZEl0ZW1zKHN0ZXAsIHByaW9yT3V0cHV0LCBuZXdPdXRwdXQpIHtcbiAgaWYgKHN0ZXAgPT09ICdyZXdyaXRlJykge1xuICAgIGNvbnN0IHByaW9ySWRzID0gbmV3IFNldCgocHJpb3JPdXRwdXQucGVuZGluZ19yZXdyaXRlcyB8fCBbXSkubWFwKHIgPT4gU3RyaW5nKHIuaWQpKSk7XG4gICAgY29uc3QgbmV3SXRlbXMgID0gbmV3T3V0cHV0LnBlbmRpbmdfcmV3cml0ZXMgIHx8IFtdO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBuZXdJdGVtcykge1xuICAgICAgY29uc3QgaWQgICAgICA9IFN0cmluZyhpdGVtLmlkIHx8ICcnKTtcbiAgICAgIGNvbnN0IGNhcmRJZCAgPSBpZC5yZXBsYWNlKC9bXmEtekEtWjAtOV8tXS9nLCAnXycpO1xuICAgICAgY29uc3QgZWwgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBydy1jYXJkLSR7Y2FyZElkfWApO1xuICAgICAgaWYgKCFlbCkgY29udGludWU7XG4gICAgICBjb25zdCBpc05ldyAgICAgPSAhcHJpb3JJZHMuaGFzKGlkKTtcbiAgICAgIGNvbnN0IHByaW9ySXRlbSA9IChwcmlvck91dHB1dC5wZW5kaW5nX3Jld3JpdGVzIHx8IFtdKS5maW5kKHIgPT4gU3RyaW5nKHIuaWQpID09PSBpZCk7XG4gICAgICBjb25zdCBjaGFuZ2VkICAgPSBpc05ldyB8fCAocHJpb3JJdGVtICYmIHByaW9ySXRlbS5wcm9wb3NlZCAhPT0gaXRlbS5wcm9wb3NlZCk7XG4gICAgICBpZiAoY2hhbmdlZCkgX21hcmtDaGFuZ2VkKGVsKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHN0ZXAgPT09ICdjdXN0b21pemF0aW9ucycpIHtcbiAgICBjb25zdCBwcmlvckV4cElkcyA9IG5ldyBTZXQoXG4gICAgICAocHJpb3JPdXRwdXQuY3VzdG9taXphdGlvbnM/LmV4cGVyaWVuY2VfcmVjb21tZW5kYXRpb25zIHx8IFtdKS5tYXAociA9PiBTdHJpbmcoci5pZCkpXG4gICAgKTtcbiAgICBjb25zdCBuZXdFeHBSZWNzICA9IG5ld091dHB1dC5jdXN0b21pemF0aW9ucz8uZXhwZXJpZW5jZV9yZWNvbW1lbmRhdGlvbnMgfHwgW107XG4gICAgZm9yIChjb25zdCByZWMgb2YgbmV3RXhwUmVjcykge1xuICAgICAgY29uc3QgaWQgICA9IFN0cmluZyhyZWMuaWQgfHwgJycpO1xuICAgICAgY29uc3QgZWwgICA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYHRyW2RhdGEtZXhwLWlkPVwiJHtDU1MuZXNjYXBlKGlkKX1cIl1gKTtcbiAgICAgIGlmICghZWwpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgcHJpb3IgPSAocHJpb3JPdXRwdXQuY3VzdG9taXphdGlvbnM/LmV4cGVyaWVuY2VfcmVjb21tZW5kYXRpb25zIHx8IFtdKS5maW5kKHIgPT4gU3RyaW5nKHIuaWQpID09PSBpZCk7XG4gICAgICBpZiAoIXByaW9yRXhwSWRzLmhhcyhpZCkgfHwgKHByaW9yICYmIHByaW9yLnJlY29tbWVuZGF0aW9uICE9PSByZWMucmVjb21tZW5kYXRpb24pKSB7XG4gICAgICAgIF9tYXJrQ2hhbmdlZChlbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcHJpb3JTa2lsbHMgPSBuZXcgU2V0KFxuICAgICAgKHByaW9yT3V0cHV0LmN1c3RvbWl6YXRpb25zPy5za2lsbF9yZWNvbW1lbmRhdGlvbnMgfHwgW10pLm1hcChyID0+IChyLnNraWxsIHx8ICcnKS50b0xvd2VyQ2FzZSgpKVxuICAgICk7XG4gICAgY29uc3QgbmV3U2tpbGxSZWNzID0gbmV3T3V0cHV0LmN1c3RvbWl6YXRpb25zPy5za2lsbF9yZWNvbW1lbmRhdGlvbnMgfHwgW107XG4gICAgZm9yIChjb25zdCByZWMgb2YgbmV3U2tpbGxSZWNzKSB7XG4gICAgICBjb25zdCBuYW1lID0gKHJlYy5za2lsbCB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IGVsICAgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGB0cltkYXRhLXNraWxsPVwiJHtDU1MuZXNjYXBlKG5hbWUpfVwiXWApO1xuICAgICAgaWYgKCFlbCkgY29udGludWU7XG4gICAgICBjb25zdCBwcmlvciA9IChwcmlvck91dHB1dC5jdXN0b21pemF0aW9ucz8uc2tpbGxfcmVjb21tZW5kYXRpb25zIHx8IFtdKS5maW5kKFxuICAgICAgICByID0+IChyLnNraWxsIHx8ICcnKS50b0xvd2VyQ2FzZSgpID09PSBuYW1lXG4gICAgICApO1xuICAgICAgaWYgKCFwcmlvclNraWxscy5oYXMobmFtZSkgfHwgKHByaW9yICYmIHByaW9yLnJlY29tbWVuZGF0aW9uICE9PSByZWMucmVjb21tZW5kYXRpb24pKSB7XG4gICAgICAgIF9tYXJrQ2hhbmdlZChlbCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxufVxuXG4vKiogQXBwbHkgZGF0YS1jaGFuZ2VkIGF0dHJpYnV0ZSBhbmQgdHJpZ2dlciBoaWdobGlnaHQgYW5pbWF0aW9uIG9uIGFuIGVsZW1lbnQuICovXG5mdW5jdGlvbiBfbWFya0NoYW5nZWQoZWwpIHtcbiAgZWwuc2V0QXR0cmlidXRlKCdkYXRhLWNoYW5nZWQnLCAndHJ1ZScpO1xuICAvLyBSZW1vdmUgdGhlIGF0dHJpYnV0ZSBhZnRlciB0aGUgYW5pbWF0aW9uIGNvbXBsZXRlcyBzbyBpdCBjYW4gYmUgcmUtdHJpZ2dlcmVkIG9uIGEgc2Vjb25kIHJlcnVuLlxuICBzZXRUaW1lb3V0KCgpID0+IGVsLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1jaGFuZ2VkJyksIDI1MDApO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgQnVsbGV0IHJlb3JkZXIgbW9kYWwgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIHNob3dCdWxsZXRSZW9yZGVyKGV4cElkLCBleHBUaXRsZSkge1xuICAvLyBGZXRjaCBhY2hpZXZlbWVudHMgKHJlcXVpcmVkKSBhbmQgc3VnZ2VzdGVkIG9yZGVyIChiZXN0LWVmZm9ydCkuXG4gIGxldCBhY2hpZXZlbWVudHMgPSBbXTtcbiAgbGV0IHByb3Bvc2VkT3JkZXIgPSBudWxsO1xuICBsZXQgaGFzSm9iQW5hbHlzaXMgPSBmYWxzZTtcbiAgbGV0IHByb3Bvc2VkUmVhc29uaW5nID0gJyc7XG4gIGxldCBwcm9wb3NlZEF0c0ltcGFjdCA9ICcnO1xuICBsZXQgcHJvcG9zZWRQYWdlSW1wYWN0ID0gJyc7XG4gIHRyeSB7XG4gICAgY29uc3QgZGV0YWlsc1JlcyA9IGF3YWl0IGZldGNoKCcvYXBpL2V4cGVyaWVuY2UtZGV0YWlscycsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7J0NvbnRlbnQtVHlwZSc6J2FwcGxpY2F0aW9uL2pzb24nfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtleHBlcmllbmNlX2lkOiBleHBJZH0pLFxuICAgIH0pO1xuICAgIGlmICghZGV0YWlsc1Jlcy5vaykge1xuICAgICAgbGV0IGRldGFpbHNFcnIgPSBgSFRUUCAke2RldGFpbHNSZXMuc3RhdHVzfWA7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXlsb2FkID0gYXdhaXQgZGV0YWlsc1Jlcy5qc29uKCk7XG4gICAgICAgIGRldGFpbHNFcnIgPSBwYXlsb2FkLmVycm9yIHx8IHBheWxvYWQubWVzc2FnZSB8fCBkZXRhaWxzRXJyO1xuICAgICAgfSBjYXRjaCAoXykgeyAvKiBrZWVwIHN0YXR1cy1iYXNlZCBlcnJvciAqLyB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZGV0YWlsc0Vycik7XG4gICAgfVxuXG4gICAgY29uc3QgZGV0YWlsc0RhdGEgPSBhd2FpdCBkZXRhaWxzUmVzLmpzb24oKTtcbiAgICBhY2hpZXZlbWVudHMgID0gKGRldGFpbHNEYXRhLmV4cGVyaWVuY2UgJiYgZGV0YWlsc0RhdGEuZXhwZXJpZW5jZS5hY2hpZXZlbWVudHMpIHx8IFtdO1xuXG4gICAgY29uc3QgcmVjUmVjb3JkID0gX2ZpbmRFeHBlcmllbmNlUmVjb21tZW5kYXRpb25SZWNvcmQoZXhwSWQpO1xuICAgIGNvbnN0IGxsbUJ1bGxldE9yZGVyID0gcmVjUmVjb3JkICYmIHR5cGVvZiByZWNSZWNvcmQuYnVsbGV0X29yZGVyID09PSAnb2JqZWN0J1xuICAgICAgPyByZWNSZWNvcmQuYnVsbGV0X29yZGVyXG4gICAgICA6IG51bGw7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkobGxtQnVsbGV0T3JkZXI/Lm9yZGVyKSAmJiBsbG1CdWxsZXRPcmRlci5vcmRlci5sZW5ndGggPiAxKSB7XG4gICAgICBwcm9wb3NlZE9yZGVyID0gbGxtQnVsbGV0T3JkZXIub3JkZXI7XG4gICAgICBoYXNKb2JBbmFseXNpcyA9IHRydWU7XG4gICAgICBwcm9wb3NlZFJlYXNvbmluZyA9IFN0cmluZyhsbG1CdWxsZXRPcmRlci5yZWFzb25pbmcgfHwgJycpLnRyaW0oKTtcbiAgICAgIHByb3Bvc2VkQXRzSW1wYWN0ID0gU3RyaW5nKGxsbUJ1bGxldE9yZGVyLmF0c19pbXBhY3QgfHwgJycpLnRyaW0oKTtcbiAgICAgIHByb3Bvc2VkUGFnZUltcGFjdCA9IFN0cmluZyhsbG1CdWxsZXRPcmRlci5wYWdlX2xlbmd0aF9pbXBhY3QgfHwgJycpLnRyaW0oKTtcbiAgICB9XG5cbiAgICAvLyBTdWdnZXN0ZWQgb3JkZXIgaXMgb3B0aW9uYWw7IGZhaWx1cmVzIHNob3VsZCBub3QgYmxvY2sgb3BlbmluZyB0aGUgbW9kYWwuXG4gICAgaWYgKCFwcm9wb3NlZE9yZGVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwcm9wb3NlZFJlcyA9IGF3YWl0IGZldGNoKGAvYXBpL3Byb3Bvc2VkLWJ1bGxldC1vcmRlcj9leHBlcmllbmNlX2lkPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGV4cElkKX1gKTtcbiAgICAgICAgaWYgKHByb3Bvc2VkUmVzLm9rKSB7XG4gICAgICAgICAgY29uc3QgcHJvcG9zZWREYXRhID0gYXdhaXQgcHJvcG9zZWRSZXMuanNvbigpO1xuICAgICAgICAgIHByb3Bvc2VkT3JkZXIgPSBwcm9wb3NlZERhdGEucHJvcG9zZWRfb3JkZXIgfHwgbnVsbDtcbiAgICAgICAgICBoYXNKb2JBbmFseXNpcyA9IHByb3Bvc2VkRGF0YS5oYXNfam9iX2FuYWx5c2lzIHx8IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvZy53YXJuKCdDb3VsZCBub3QgbG9hZCBzdWdnZXN0ZWQgYnVsbGV0IG9yZGVyOicsIHByb3Bvc2VkUmVzLnN0YXR1cyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nLndhcm4oJ0NvdWxkIG5vdCBsb2FkIHN1Z2dlc3RlZCBidWxsZXQgb3JkZXI6JywgZSk7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc3QgZXJyb3JUZXh0ID0gZS5tZXNzYWdlID09PSAnRmFpbGVkIHRvIGZldGNoJ1xuICAgICAgPyAnRmFpbGVkIHRvIGZldGNoIChzZXJ2ZXIgdW5hdmFpbGFibGUpLidcbiAgICAgIDogZS5tZXNzYWdlO1xuICAgIGFwcGVuZFJldHJ5TWVzc2FnZSgnXHUyNkEwIENvdWxkIG5vdCBsb2FkIGJ1bGxldHM6ICcgKyBlcnJvclRleHQsICgpID0+IHNob3dCdWxsZXRSZW9yZGVyKGV4cElkLCBleHBUaXRsZSkpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIWFjaGlldmVtZW50cy5sZW5ndGgpIHtcbiAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnTm8gYnVsbGV0IHBvaW50cyBmb3VuZCBmb3IgdGhpcyBleHBlcmllbmNlLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFNhdmUgZm9jdXMgb3JpZ2luIGZvciByZXN0b3JhdGlvbiBvbiBjbG9zZSAoR0FQLTE3NilcbiAgaWYgKHR5cGVvZiBfZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBfZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIH1cblxuICAvLyBCdWlsZCBtb2RhbCBjb250ZW50XG4gIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIG1vZGFsLmlkID0gJ2J1bGxldC1yZW9yZGVyLW1vZGFsJztcbiAgbW9kYWwuc2V0QXR0cmlidXRlKCdyb2xlJywgJ2RpYWxvZycpO1xuICBtb2RhbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbW9kYWwnLCAndHJ1ZScpO1xuICBtb2RhbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWxsZWRieScsICdidWxsZXQtcmVvcmRlci10aXRsZScpO1xuICBtb2RhbC5zdHlsZS5jc3NUZXh0ID0gYFxuICAgIHBvc2l0aW9uOmZpeGVkO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JhY2tncm91bmQ6cmdiYSgwLDAsMCwwLjUpO1xuICAgIHotaW5kZXg6OTk5OTtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7YDtcblxuICBjb25zdCBzdWdnZXN0ZWRCdG4gPSBoYXNKb2JBbmFseXNpc1xuICAgID8gYDxidXR0b24gY2xhc3M9XCJidG4tc2Vjb25kYXJ5XCIgaWQ9XCJ1c2UtbGxtLW9yZGVyLWJ0blwiIHRpdGxlPVwiQXBwbHkgam9iLXJlbGV2YW5jZSByYW5raW5nIGZyb20geW91ciBqb2IgYW5hbHlzaXNcIlxuICAgICAgICAgc3R5bGU9XCJjb2xvcjojNjM2NmYxO2JvcmRlci1jb2xvcjojNjM2NmYxO1wiPlx1MjcyOCBVc2UgU3VnZ2VzdGVkIE9yZGVyPC9idXR0b24+YFxuICAgIDogJyc7XG4gIGNvbnN0IHN1Z2dlc3Rpb25NZXRhID0gcHJvcG9zZWRSZWFzb25pbmcgfHwgcHJvcG9zZWRBdHNJbXBhY3QgfHwgcHJvcG9zZWRQYWdlSW1wYWN0XG4gICAgPyBgPGRpdiBpZD1cImJ1bGxldC1vcmRlci1haS1ub3RlXCIgc3R5bGU9XCJmb250LXNpemU6MC44MmVtO2NvbG9yOiM0MzM4Y2E7YmFja2dyb3VuZDojZWVmMmZmO2JvcmRlcjoxcHggc29saWQgI2M3ZDJmZTtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjEwcHggMTJweDttYXJnaW4tYm90dG9tOjEycHg7XCI+XG4gICAgICAgICR7cHJvcG9zZWRSZWFzb25pbmcgPyBgPGRpdj48c3Ryb25nPkFJIHJhdGlvbmFsZTo8L3N0cm9uZz4gJHtlc2NhcGVIdG1sKHByb3Bvc2VkUmVhc29uaW5nKX08L2Rpdj5gIDogJyd9XG4gICAgICAgICR7cHJvcG9zZWRBdHNJbXBhY3QgPyBgPGRpdj48c3Ryb25nPkFUUyBpbXBhY3Q6PC9zdHJvbmc+ICR7ZXNjYXBlSHRtbChwcm9wb3NlZEF0c0ltcGFjdCl9PC9kaXY+YCA6ICcnfVxuICAgICAgICAke3Byb3Bvc2VkUGFnZUltcGFjdCA/IGA8ZGl2PjxzdHJvbmc+UGFnZSBsZW5ndGggaW1wYWN0Ojwvc3Ryb25nPiAke2VzY2FwZUh0bWwocHJvcG9zZWRQYWdlSW1wYWN0KX08L2Rpdj5gIDogJyd9XG4gICAgICA8L2Rpdj5gXG4gICAgOiAnJztcblxuICBtb2RhbC5pbm5lckhUTUwgPSBgXG4gICAgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2ZmZjtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjI0cHg7bWF4LXdpZHRoOjY0MHB4O3dpZHRoOjkyJTtcbiAgICAgICAgICAgICAgICBtYXgtaGVpZ2h0Ojgwdmg7b3ZlcmZsb3cteTphdXRvO2JveC1zaGFkb3c6MCAyMHB4IDYwcHggcmdiYSgwLDAsMCwwLjMpO1wiPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjthbGlnbi1pdGVtczpmbGV4LXN0YXJ0O21hcmdpbi1ib3R0b206MTZweDtcIj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8aDMgaWQ9XCJidWxsZXQtcmVvcmRlci10aXRsZVwiIHN0eWxlPVwibWFyZ2luOjA7Y29sb3I6IzFmMjkzNztcIj5cdTIxOTUgUmVvcmRlciBCdWxsZXRzPC9oMz5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiY29sb3I6IzZiNzI4MDtmb250LXNpemU6MC45ZW07bWFyZ2luLXRvcDo0cHg7XCI+JHtleHBUaXRsZX08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxidXR0b24gYXJpYS1sYWJlbD1cIkNsb3NlIHJlb3JkZXIgZGlhbG9nXCJcbiAgICAgICAgICBvbmNsaWNrPVwicmVzdG9yZUZvY3VzKCk7ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J1bGxldC1yZW9yZGVyLW1vZGFsJykucmVtb3ZlKClcIlxuICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDpub25lO2JvcmRlcjpub25lO2ZvbnQtc2l6ZToxLjRlbTtjdXJzb3I6cG9pbnRlcjtjb2xvcjojNmI3MjgwO1wiPlx1MjcxNTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtjb2xvcjojNmI3MjgwO21hcmdpbi1ib3R0b206MTJweDtcIj5cbiAgICAgICAgVXNlIFx1MjE5MSBcdTIxOTMgdG8gcmVvcmRlci4gQnVsbGV0cyBoaWdoZXIgaW4gdGhlIGxpc3QgYXBwZWFyIGZpcnN0IG9uIHlvdXIgQ1YuXG4gICAgICAgIFRoZSBtb3N0IHJlbGV2YW50IGJ1bGxldCB3aWxsIGJlIGF1dG8tcmFua2VkIGhpZ2hlc3QgaWYgeW91IHJlc2V0LlxuICAgICAgPC9kaXY+XG4gICAgICAke3N1Z2dlc3Rpb25NZXRhfVxuICAgICAgPG9sIGlkPVwiYnVsbGV0LXJlb3JkZXItbGlzdFwiIHN0eWxlPVwicGFkZGluZzowO21hcmdpbjowO2xpc3Qtc3R5bGU6bm9uZTtcIj5cbiAgICAgIDwvb2w+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDoxMHB4O21hcmdpbi10b3A6MThweDtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmQ7XCI+XG4gICAgICAgICR7c3VnZ2VzdGVkQnRufVxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLXNlY29uZGFyeVwiIG9uY2xpY2s9XCJyZXNldEJ1bGxldE9yZGVyKCcke2V4cElkfScpXCI+XHUyMUJBIFJlc2V0IHRvIEF1dG88L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1wcmltYXJ5XCIgICBvbmNsaWNrPVwic2F2ZUJ1bGxldE9yZGVyKCcke2V4cElkfScpO3Jlc3RvcmVGb2N1cygpXCI+U2F2ZSBPcmRlcjwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+YDtcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChtb2RhbCk7XG4gIGlmICh0eXBlb2YgdHJhcEZvY3VzID09PSAnZnVuY3Rpb24nKSB0cmFwRm9jdXMoJ2J1bGxldC1yZW9yZGVyLW1vZGFsJyk7XG4gIGlmICh0eXBlb2Ygc2V0SW5pdGlhbEZvY3VzID09PSAnZnVuY3Rpb24nKSBzZXRJbml0aWFsRm9jdXMoJ2J1bGxldC1yZW9yZGVyLW1vZGFsJyk7XG5cbiAgLy8gQ2xvc2Ugb24gRXNjYXBlXG4gIGNvbnN0IGVzY0hhbmRsZXIgPSAoZSkgPT4ge1xuICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHJlc3RvcmVGb2N1cygpO1xuICAgICAgbW9kYWwucmVtb3ZlKCk7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZXNjSGFuZGxlcik7XG4gICAgfVxuICB9O1xuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZXNjSGFuZGxlcik7XG5cbiAgLy8gUG9wdWxhdGUgbGlzdCBpdGVtc1xuICBjb25zdCBsaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J1bGxldC1yZW9yZGVyLWxpc3QnKTtcbiAgYWNoaWV2ZW1lbnRzLmZvckVhY2goKGFjaCwgaWR4KSA9PiB7XG4gICAgY29uc3QgdGV4dCA9ICh0eXBlb2YgYWNoID09PSAnb2JqZWN0JyA/IChhY2gudGV4dCB8fCAnJykgOiBTdHJpbmcoYWNoKSk7XG4gICAgY29uc3QgbGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpO1xuICAgIGxpLmRhdGFzZXQub3JpZ0luZGV4ID0gaWR4O1xuICAgIGxpLnN0eWxlLmNzc1RleHQgPSBgZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmZsZXgtc3RhcnQ7Z2FwOjhweDtwYWRkaW5nOjhweDttYXJnaW4tYm90dG9tOjZweDtcbiAgICAgIGJhY2tncm91bmQ6I2Y4ZmFmYztib3JkZXI6MXB4IHNvbGlkICNlMmU4ZjA7Ym9yZGVyLXJhZGl1czo2cHg7YDtcbiAgICBsaS5pbm5lckhUTUwgPSBgXG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtnYXA6MnB4O2ZsZXgtc2hyaW5rOjA7XCI+XG4gICAgICAgIDxidXR0b24gdGl0bGU9XCJNb3ZlIHVwXCIgYXJpYS1sYWJlbD1cIk1vdmUgYnVsbGV0IHVwXCJcbiAgICAgICAgICBvbmNsaWNrPVwibW92ZUJ1bGxldCh0aGlzLC0xKVwiXG4gICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOjFweCBzb2xpZCAjZDFkNWRiO2JvcmRlci1yYWRpdXM6M3B4O1xuICAgICAgICAgICAgICAgICBjdXJzb3I6cG9pbnRlcjtwYWRkaW5nOjFweCA1cHg7bGluZS1oZWlnaHQ6MS4yO2ZvbnQtc2l6ZTowLjllbTtcIj5cdTIxOTE8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiB0aXRsZT1cIk1vdmUgZG93blwiIGFyaWEtbGFiZWw9XCJNb3ZlIGJ1bGxldCBkb3duXCJcbiAgICAgICAgICBvbmNsaWNrPVwibW92ZUJ1bGxldCh0aGlzLCsxKVwiXG4gICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOjFweCBzb2xpZCAjZDFkNWRiO2JvcmRlci1yYWRpdXM6M3B4O1xuICAgICAgICAgICAgICAgICBjdXJzb3I6cG9pbnRlcjtwYWRkaW5nOjFweCA1cHg7bGluZS1oZWlnaHQ6MS4yO2ZvbnQtc2l6ZTowLjllbTtcIj5cdTIxOTM8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPHNwYW4gc3R5bGU9XCJmbGV4OjE7Zm9udC1zaXplOjAuOWVtO1wiPiR7dGV4dH08L3NwYW4+YDtcbiAgICBsaXN0LmFwcGVuZENoaWxkKGxpKTtcbiAgfSk7XG4gIF91cGRhdGVCdWxsZXRBcnJvd3MoKTtcblxuICAvLyBXaXJlIHVwIFwiVXNlIFN1Z2dlc3RlZCBPcmRlclwiIGJ1dHRvbiBpZiBqb2IgYW5hbHlzaXMgaXMgYXZhaWxhYmxlXG4gIGlmIChoYXNKb2JBbmFseXNpcyAmJiBwcm9wb3NlZE9yZGVyKSB7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VzZS1sbG0tb3JkZXItYnRuJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgX2FwcGx5QnVsbGV0T3JkZXIocHJvcG9zZWRPcmRlcik7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2FwcGx5QnVsbGV0T3JkZXIob3JkZXIpIHtcbiAgY29uc3QgbGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidWxsZXQtcmVvcmRlci1saXN0Jyk7XG4gIGlmICghbGlzdCkgcmV0dXJuO1xuICBjb25zdCBpdGVtcyA9IEFycmF5LmZyb20obGlzdC5xdWVyeVNlbGVjdG9yQWxsKCdsaScpKTtcbiAgLy8gQnVpbGQgYSBtYXAgZnJvbSBvcmlnSW5kZXggXHUyMTkyIGxpIGVsZW1lbnRcbiAgY29uc3QgYnlPcmlnID0ge307XG4gIGl0ZW1zLmZvckVhY2gobGkgPT4geyBieU9yaWdbcGFyc2VJbnQobGkuZGF0YXNldC5vcmlnSW5kZXgsIDEwKV0gPSBsaTsgfSk7XG4gIC8vIFJlLWFwcGVuZCBpbiBwcm9wb3NlZCBvcmRlciwgdGhlbiBhbnkgbm90IGxpc3RlZFxuICBjb25zdCBsaXN0ZWQgPSBuZXcgU2V0KG9yZGVyLm1hcChOdW1iZXIpKTtcbiAgb3JkZXIuZm9yRWFjaChpZHggPT4geyBpZiAoYnlPcmlnW2lkeF0pIGxpc3QuYXBwZW5kQ2hpbGQoYnlPcmlnW2lkeF0pOyB9KTtcbiAgaXRlbXMuZm9yRWFjaChsaSA9PiB7XG4gICAgaWYgKCFsaXN0ZWQuaGFzKHBhcnNlSW50KGxpLmRhdGFzZXQub3JpZ0luZGV4LCAxMCkpKSBsaXN0LmFwcGVuZENoaWxkKGxpKTtcbiAgfSk7XG4gIF91cGRhdGVCdWxsZXRBcnJvd3MoKTtcbn1cblxuZnVuY3Rpb24gbW92ZUJ1bGxldChidG4sIGRpcmVjdGlvbikge1xuICBjb25zdCBsaSAgID0gYnRuLmNsb3Nlc3QoJ2xpJyk7XG4gIGNvbnN0IGxpc3QgPSBsaS5wYXJlbnROb2RlO1xuICBpZiAoZGlyZWN0aW9uID09PSAtMSAmJiBsaS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nKSB7XG4gICAgbGlzdC5pbnNlcnRCZWZvcmUobGksIGxpLnByZXZpb3VzRWxlbWVudFNpYmxpbmcpO1xuICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gKzEgJiYgbGkubmV4dEVsZW1lbnRTaWJsaW5nKSB7XG4gICAgbGlzdC5pbnNlcnRCZWZvcmUobGkubmV4dEVsZW1lbnRTaWJsaW5nLCBsaSk7XG4gIH1cbiAgX3VwZGF0ZUJ1bGxldEFycm93cygpO1xufVxuXG5mdW5jdGlvbiBfdXBkYXRlQnVsbGV0QXJyb3dzKCkge1xuICBjb25zdCBsaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J1bGxldC1yZW9yZGVyLWxpc3QnKTtcbiAgaWYgKCFsaXN0KSByZXR1cm47XG4gIGNvbnN0IGl0ZW1zID0gbGlzdC5xdWVyeVNlbGVjdG9yQWxsKCdsaScpO1xuICBpdGVtcy5mb3JFYWNoKChsaSwgaWR4KSA9PiB7XG4gICAgY29uc3QgW3VwQnRuLCBkb3duQnRuXSA9IGxpLnF1ZXJ5U2VsZWN0b3JBbGwoJ2J1dHRvbicpO1xuICAgIHVwQnRuLmRpc2FibGVkICAgPSBpZHggPT09IDA7XG4gICAgZG93bkJ0bi5kaXNhYmxlZCA9IGlkeCA9PT0gaXRlbXMubGVuZ3RoIC0gMTtcbiAgICB1cEJ0bi5zdHlsZS5vcGFjaXR5ICAgPSB1cEJ0bi5kaXNhYmxlZCAgID8gJzAuMycgOiAnMSc7XG4gICAgZG93bkJ0bi5zdHlsZS5vcGFjaXR5ID0gZG93bkJ0bi5kaXNhYmxlZCA/ICcwLjMnIDogJzEnO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZUJ1bGxldE9yZGVyKGV4cElkKSB7XG4gIGNvbnN0IGxpc3QgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J1bGxldC1yZW9yZGVyLWxpc3QnKTtcbiAgY29uc3QgaXRlbXMgPSBsaXN0ID8gbGlzdC5xdWVyeVNlbGVjdG9yQWxsKCdsaScpIDogW107XG4gIGNvbnN0IG9yZGVyID0gQXJyYXkuZnJvbShpdGVtcykubWFwKGxpID0+IHBhcnNlSW50KGxpLmRhdGFzZXQub3JpZ0luZGV4LCAxMCkpO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9yZW9yZGVyLWJ1bGxldHMnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeydDb250ZW50LVR5cGUnOidhcHBsaWNhdGlvbi9qc29uJ30sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7ZXhwZXJpZW5jZV9pZDogZXhwSWQsIG9yZGVyfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKCFyZXMub2sgfHwgIWRhdGEub2spIHtcbiAgICAgIGFwcGVuZFJldHJ5TWVzc2FnZSgnXHUyNkEwIENvdWxkIG5vdCBzYXZlIGJ1bGxldCBvcmRlcjogJyArIChkYXRhLmVycm9yfHwnVW5rbm93bicpLCAoKSA9PiBzYXZlQnVsbGV0T3JkZXIoZXhwSWQpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ1x1MjE5NSBCdWxsZXQgb3JkZXIgc2F2ZWQuIEl0IHdpbGwgYXBwbHkgd2hlbiB5b3UgZ2VuZXJhdGUgdGhlIENWLicpO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidWxsZXQtcmVvcmRlci1tb2RhbCcpPy5yZW1vdmUoKTtcbiAgfSBjYXRjaChlKSB7XG4gICAgYXBwZW5kUmV0cnlNZXNzYWdlKCdcdTI2QTAgTmV0d29yayBlcnJvciBzYXZpbmcgYnVsbGV0IG9yZGVyOiAnICsgZS5tZXNzYWdlLCAoKSA9PiBzYXZlQnVsbGV0T3JkZXIoZXhwSWQpKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZXNldEJ1bGxldE9yZGVyKGV4cElkKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL3Jlb3JkZXItYnVsbGV0cycsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7J0NvbnRlbnQtVHlwZSc6J2FwcGxpY2F0aW9uL2pzb24nfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtleHBlcmllbmNlX2lkOiBleHBJZCwgb3JkZXI6IFtdfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKCFyZXMub2sgfHwgIWRhdGEub2spIHtcbiAgICAgIGFwcGVuZFJldHJ5TWVzc2FnZSgnXHUyNkEwIENvdWxkIG5vdCByZXNldCBidWxsZXQgb3JkZXI6ICcgKyAoZGF0YS5lcnJvcnx8J1Vua25vd24nKSwgKCkgPT4gcmVzZXRCdWxsZXRPcmRlcihleHBJZCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCAnXHUyMUJBIEJ1bGxldCBvcmRlciByZXNldC4gUmVsZXZhbmNlLWJhc2VkIG9yZGVyaW5nIHdpbGwgYXBwbHkuJyk7XG4gICAgcmVzdG9yZUZvY3VzKCk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J1bGxldC1yZW9yZGVyLW1vZGFsJyk/LnJlbW92ZSgpO1xuICB9IGNhdGNoKGUpIHtcbiAgICBhcHBlbmRSZXRyeU1lc3NhZ2UoJ1x1MjZBMCBOZXR3b3JrIGVycm9yIHJlc2V0dGluZyBidWxsZXQgb3JkZXI6ICcgKyBlLm1lc3NhZ2UsICgpID0+IHJlc2V0QnVsbGV0T3JkZXIoZXhwSWQpKTtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgRm9yd2FyZC1za2lwIHBoYXNlIHdhdGVybWFyayAoR0FQLTEwMSkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8vIEJhY2tlbmQgcGhhc2Ugb3JkZXJpbmcgKG1hdGNoZXMgY29udmVyc2F0aW9uX21hbmFnZXIucHkgX1BIQVNFX09SREVSKS5cbmNvbnN0IF9QSEFTRV9QUk9HUkVTU0lPTiA9IFtcbiAgJ2luaXQnLCAnam9iX2FuYWx5c2lzJywgJ2N1c3RvbWl6YXRpb24nLCAncmV3cml0ZV9yZXZpZXcnLFxuICAnc3BlbGxfY2hlY2snLCAnZ2VuZXJhdGlvbicsICdsYXlvdXRfcmV2aWV3JywgJ2ZpbmFsX2dlbmVyYXRpb24nLCAncmVmaW5lbWVudCcsXG5dO1xuXG4vLyBNaW5pbXVtIGhpZ2hlc3RQaGFzZSBpbmRleCByZXF1aXJlZCBmb3IgZWFjaCBzdGVwIHRvIGJlIGZvcndhcmQtc2tpcHBhYmxlLlxuY29uc3QgX1NURVBfRldEX1BIQVNFX01JTiA9IHtcbiAgYW5hbHlzaXM6ICAgICAgIDEsICAgLy8gam9iX2FuYWx5c2lzXG4gIGN1c3RvbWl6YXRpb25zOiAyLCAgIC8vIGN1c3RvbWl6YXRpb25cbiAgcmV3cml0ZTogICAgICAgIDMsICAgLy8gcmV3cml0ZV9yZXZpZXdcbiAgc3BlbGw6ICAgICAgICAgIDQsICAgLy8gc3BlbGxfY2hlY2tcbiAgbGF5b3V0OiAgICAgICAgIDUsICAgLy8gZ2VuZXJhdGlvblxuICBkb3dubG9hZDogICAgICAgNywgICAvLyBmaW5hbF9nZW5lcmF0aW9uXG4gIGNvdmVyX2xldHRlcjogICA3LFxuICBzY3JlZW5pbmc6ICAgICAgNyxcbiAgaW50ZXJ2aWV3X3ByZXA6IDcsXG4gIHRoYW5rX3lvdTogICAgICA3LFxuICBoYXJ2ZXN0OiAgICAgICAgNyxcbn07XG5cbi8vIFx1MjUwMFx1MjUwMCBXb3JrZmxvdyBzdGVwIGJhciBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gdXBkYXRlV29ya2Zsb3dTdGVwcyhzdGF0dXMpIHtcbiAgLy8gMTItc3RlcCB3b3JrZmxvdyBiYXI6IEpvYiBJbnB1dCBcdTIxOTIgQW5hbHlzaXMgXHUyMTkyIEN1c3RvbWlzZSBcdTIxOTIgUmV3cml0ZXMgXHUyMTkyXG4gIC8vICAgU3BlbGwgQ2hlY2sgXHUyMTkyIExheW91dCBSZXZpZXcgXHUyMTkyIERvd25sb2FkIFx1MjE5MiBDb3ZlciBMZXR0ZXIgXHUyMTkyIFNjcmVlbmluZyBcdTIxOTJcbiAgLy8gICBJbnRlcnZpZXcgUHJlcCBcdTIxOTIgVGhhbmsgWW91IFx1MjE5MiBIYXJ2ZXN0XG4gIC8vXG4gIGNvbnN0IFVQQ09NSU5HID0gbmV3IFNldCgpO1xuXG4gIC8vIFN0ZXBzIHRoYXQgc3VwcG9ydCBMTE0gcmUtZXhlY3V0aW9uIHZpYSAvYXBpL3JlLXJ1bi1waGFzZVxuICBjb25zdCBSRV9SVU5fU1RFUFMgPSBuZXcgU2V0KFsnYW5hbHlzaXMnLCAnY3VzdG9taXphdGlvbnMnLCAncmV3cml0ZScsICdzcGVsbCcsICdsYXlvdXQnXSk7XG5cbiAgLy8gQmFzZSBsYWJlbCBmb3IgZWFjaCBzdGVwICh1c2VkIHdoZW4gaW5qZWN0aW5nIFx1MjFCQiBidXR0b24pXG4gIGNvbnN0IFNURVBfTEFCRUxTID0ge1xuICAgIGpvYjogICAgICAgICAgICAnXHVEODNEXHVEQ0U1IEpvYiBJbnB1dCcsXG4gICAgYW5hbHlzaXM6ICAgICAgICdcdUQ4M0RcdUREMEQgQW5hbHlzaXMnLFxuICAgIGN1c3RvbWl6YXRpb25zOiAnXHUyNjk5XHVGRTBGIEN1c3RvbWlzZScsXG4gICAgcmV3cml0ZTogICAgICAgICdcdTI3MEZcdUZFMEYgUmV3cml0ZXMnLFxuICAgIHNwZWxsOiAgICAgICAgICAnXHVEODNEXHVERDI0IFNwZWxsIENoZWNrJyxcbiAgICBsYXlvdXQ6ICAgICAgICAgJ1x1RDgzQ1x1REZBOCBMYXlvdXQgUmV2aWV3JyxcbiAgICBkb3dubG9hZDogICAgICAgJ1x1MkIwN1x1RkUwRiBEb3dubG9hZCBGaWxlcycsXG4gICAgY292ZXJfbGV0dGVyOiAgICdcdUQ4M0RcdURDRTkgQ292ZXIgTGV0dGVyJyxcbiAgICBzY3JlZW5pbmc6ICAgICAgJ1x1RDgzRFx1RENDQiBTY3JlZW5pbmcnLFxuICAgIGludGVydmlld19wcmVwOiAnXHVEODNDXHVERkE0IEludGVydmlldyBQcmVwJyxcbiAgICB0aGFua195b3U6ICAgICAgJ1x1RDgzRFx1REU0RiBUaGFuayBZb3UnLFxuICAgIGhhcnZlc3Q6ICAgICAgICAnXHVEODNDXHVERjNFIEhhcnZlc3QnLFxuICB9O1xuXG4gIC8vIERldGVybWluZSB3aGljaCBzdGVwcyBhcmUgZG9uZSBiYXNlZCBvbiBzZXNzaW9uIHN0YXRlIGZpZWxkcy5cbiAgY29uc3QgcGhhc2UgPSBzdGF0dXMucGhhc2UgfHwgJyc7XG4gIC8vIEFsbCBwb3N0LWxheW91dCBwaGFzZXMgdW5sb2NrIHNpbXVsdGFuZW91c2x5IG9uY2UgbGF5b3V0IGlzIGNvbmZpcm1lZC5cbiAgY29uc3QgcG9zdExheW91dCA9IHBoYXNlID09PSBQSEFTRVMuRklOQUxfR0VORVJBVElPTiB8fCBwaGFzZSA9PT0gUEhBU0VTLlJFRklORU1FTlQ7XG4gIGNvbnN0IGRvbmUgPSB7XG4gICAgam9iOiAgICAgICAgICAgICEhc3RhdHVzLmpvYl9kZXNjcmlwdGlvbixcbiAgICBhbmFseXNpczogICAgICAgISFzdGF0dXMuam9iX2FuYWx5c2lzLFxuICAgIGN1c3RvbWl6YXRpb25zOiAhIXN0YXR1cy5jdXN0b21pemF0aW9ucyxcbiAgICByZXdyaXRlOiAgICAgICAgcGhhc2UgIT09IFBIQVNFUy5SRVdSSVRFX1JFVklFVyAmJiAoISFzdGF0dXMuY3VzdG9taXphdGlvbnMpLFxuICAgIHNwZWxsOiAgICAgICAgICBwaGFzZSA9PT0gUEhBU0VTLkdFTkVSQVRJT04gfHwgcGhhc2UgPT09IFBIQVNFUy5MQVlPVVRfUkVWSUVXIHx8XG4gICAgICAgICAgICAgICAgICAgIHBoYXNlID09PSBQSEFTRVMuRklOQUxfR0VORVJBVElPTiB8fCBwaGFzZSA9PT0gUEhBU0VTLlJFRklORU1FTlQsXG4gICAgbGF5b3V0OiAgICAgICAgIHBvc3RMYXlvdXQsXG4gICAgZG93bmxvYWQ6ICAgICAgIHBvc3RMYXlvdXQsXG4gICAgY292ZXJfbGV0dGVyOiAgIHBvc3RMYXlvdXQsXG4gICAgc2NyZWVuaW5nOiAgICAgIHBvc3RMYXlvdXQsXG4gICAgaW50ZXJ2aWV3X3ByZXA6IHBvc3RMYXlvdXQsXG4gICAgdGhhbmtfeW91OiAgICAgIHBvc3RMYXlvdXQsXG4gICAgaGFydmVzdDogICAgICAgIHBvc3RMYXlvdXQsXG4gIH07XG5cbiAgLy8gRm9yd2FyZC1za2lwIHdhdGVybWFyayAoR0FQLTEwMSk6IHN0ZXBzIHByZXZpb3VzbHkgcmVhY2hlZCBidXQgbm90IGN1cnJlbnRseVxuICAvLyBcImRvbmVcIiBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgcGhhc2UgYXJlIHN0aWxsIG5hdmlnYWJsZSB3aXRoIGEgY29uZmlybWF0aW9uLlxuICBjb25zdCBoaWdoZXN0UGhhc2VJZHggPSBfUEhBU0VfUFJPR1JFU1NJT04uaW5kZXhPZihzdGF0dXMuaGlnaGVzdF9waGFzZSB8fCAnJyk7XG4gIGNvbnN0IGN1cnJlbnRQaGFzZUlkeCA9IF9QSEFTRV9QUk9HUkVTU0lPTi5pbmRleE9mKHBoYXNlKTtcblxuICAvLyBEZXRlcm1pbmUgdGhlIGFjdGl2ZSBzdGVwIGZyb20gdGhlIGJhY2tlbmQgcGhhc2Ugc3RyaW5nLlxuICBjb25zdCBwaGFzZVRvU3RlcCA9IHtcbiAgICAnaW5pdCc6ICAgICAgICAgICAgICdqb2InLFxuICAgICdqb2JfYW5hbHlzaXMnOiAgICAgJ2FuYWx5c2lzJyxcbiAgICAnY3VzdG9taXphdGlvbic6ICAgICdjdXN0b21pemF0aW9ucycsXG4gICAgJ3Jld3JpdGVfcmV2aWV3JzogICAncmV3cml0ZScsXG4gICAgJ3NwZWxsX2NoZWNrJzogICAgICAnc3BlbGwnLFxuICAgICdnZW5lcmF0aW9uJzogICAgICAgJ2xheW91dCcsXG4gICAgJ2xheW91dF9yZXZpZXcnOiAgICAnbGF5b3V0JyxcbiAgICAnZmluYWxfZ2VuZXJhdGlvbic6ICdkb3dubG9hZCcsXG4gICAgJ3JlZmluZW1lbnQnOiAgICAgICAnZG93bmxvYWQnLFxuICB9O1xuICBjb25zdCBhY3RpdmVTdGVwID0gcGhhc2VUb1N0ZXBbcGhhc2VdIHx8ICdqb2InO1xuXG4gIC8vIFJlc29sdmUgdGhlIHJlZW50cnkgc3RlcCBmb3IgdGhlIFwiUmVmaW5pbmdcIiBiYWRnZVxuICBjb25zdCBfcGhhc2VUb1N0ZXAyID0gT2JqZWN0LmFzc2lnbih7J2luaXQnOiAnam9iJ30sIHBoYXNlVG9TdGVwKTtcbiAgY29uc3QgcmVlbnRyeVN0ZXAgPSBzdGF0dXMuaXRlcmF0aW5nXG4gICAgPyAoX3BoYXNlVG9TdGVwMltzdGF0dXMucmVlbnRyeV9waGFzZV0gfHwgc3RhdHVzLnJlZW50cnlfcGhhc2UgfHwgbnVsbClcbiAgICA6IG51bGw7XG5cbiAgY29uc3Qgc3RlcElkcyA9IFtcbiAgICAnam9iJywgJ2FuYWx5c2lzJywgJ2N1c3RvbWl6YXRpb25zJywgJ3Jld3JpdGUnLCAnc3BlbGwnLCAnbGF5b3V0JyxcbiAgICAnZG93bmxvYWQnLCAnY292ZXJfbGV0dGVyJywgJ3NjcmVlbmluZycsICdpbnRlcnZpZXdfcHJlcCcsICd0aGFua195b3UnLCAnaGFydmVzdCcsXG4gIF07XG4gIGNvbnN0IHN0YWxlU3RlcHMgPSBuZXcgU2V0KHN0YXR1cy5zdGFsZV9zdGVwcyB8fCBbXSk7XG4gIHN0ZXBJZHMuZm9yRWFjaChzdGVwID0+IHtcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzdGVwLSR7c3RlcH1gKTtcbiAgICBpZiAoIWVsKSByZXR1cm47XG4gICAgLy8gVXBjb21pbmcgc3RlcHMgYXJlIGZpeGVkIFx1MjAxNCBuZXZlciBjaGFuZ2UgdGhlaXIgY2xhc3MuXG4gICAgaWYgKFVQQ09NSU5HLmhhcyhzdGVwKSkgcmV0dXJuO1xuICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScsICdjb21wbGV0ZWQnLCAnY2xpY2thYmxlJywgJ3VwY29taW5nJywgJ3N0YWxlJywgJ2ZvcndhcmQtc2tpcCcpO1xuXG4gICAgbGV0IGxhYmVsID0gU1RFUF9MQUJFTFNbc3RlcF0gfHwgc3RlcDtcblxuICAgIGlmIChzdGVwID09PSBhY3RpdmVTdGVwKSB7XG4gICAgICBlbC5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICAgIC8vIFwiXHUyMUJCIFJlZmluaW5nXCIgYmFkZ2Ugc2hvd24gb24gdGhlIGFjdGl2ZSBzdGVwIHdoZW4gaXRlcmF0aW5nXG4gICAgICBpZiAoc3RhdHVzLml0ZXJhdGluZyAmJiByZWVudHJ5U3RlcCA9PT0gc3RlcCkge1xuICAgICAgICBsYWJlbCArPSAnIDxzcGFuIGNsYXNzPVwic3RlcC1pbmxpbmUtYmFkZ2VcIj5cdTIxQkIgUmVmaW5pbmc8L3NwYW4+JztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGRvbmVbc3RlcF0pIHtcbiAgICAgIGVsLmNsYXNzTGlzdC5hZGQoJ2NvbXBsZXRlZCcpO1xuICAgICAgLy8gQ29tcGxldGVkIHN0ZXBzIGFyZSBjbGlja2FibGUgZm9yIGJhY2stbmF2aWdhdGlvbi5cbiAgICAgIGVsLmNsYXNzTGlzdC5hZGQoJ2NsaWNrYWJsZScpO1xuICAgICAgLy8gQWRkIFx1MjFCQiByZS1ydW4gYnV0dG9uIGZvciBzdGVwcyB0aGF0IHN1cHBvcnQgTExNIHJlLWV4ZWN1dGlvblxuICAgICAgaWYgKFJFX1JVTl9TVEVQUy5oYXMoc3RlcCkpIHtcbiAgICAgICAgY29uc3QgcmVydW5MYWJlbCA9IF9TVEVQX0RJU1BMQVlbc3RlcF0gfHwgc3RlcDtcbiAgICAgICAgbGFiZWwgKz0gYCA8YnV0dG9uIGNsYXNzPVwic3RlcC1yZXJ1blwiIGFyaWEtbGFiZWw9XCJSZS1ydW4gJHtyZXJ1bkxhYmVsfVwiXG4gICAgICAgICAgdGl0bGU9XCJSZS1ydW4gJHtzdGVwfSB3aXRoIHVwZGF0ZWQgaW5wdXRzXCJcbiAgICAgICAgICBvbmNsaWNrPVwiZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7Y29uZmlybVJlUnVuUGhhc2UoJyR7c3RlcH0nKVwiXG4gICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6MC44ZW07b3BhY2l0eTowLjM1O3RyYW5zaXRpb246b3BhY2l0eSAwLjE1czttYXJnaW4tbGVmdDoycHg7Y3Vyc29yOnBvaW50ZXI7YmFja2dyb3VuZDpub25lO2JvcmRlcjpub25lO3BhZGRpbmc6MDtjb2xvcjppbmhlcml0O2xpbmUtaGVpZ2h0OjE7XCI+XHUyMUJCPC9idXR0b24+YDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGhpZ2hlc3RQaGFzZUlkeCA+PSAwICYmIChfU1RFUF9GV0RfUEhBU0VfTUlOW3N0ZXBdID8/IEluZmluaXR5KSA8PSBoaWdoZXN0UGhhc2VJZHhcbiAgICAgICAgICAgICAgICYmIGhpZ2hlc3RQaGFzZUlkeCA+IGN1cnJlbnRQaGFzZUlkeCkge1xuICAgICAgLy8gRm9yd2FyZC1za2lwOiBzdGVwIHdhcyBjb21wbGV0ZWQgaW4gYSBwcmlvciBpdGVyYXRpb24gYnV0IGlzIGFoZWFkIG9mIGN1cnJlbnQgcGhhc2UuXG4gICAgICBlbC5jbGFzc0xpc3QuYWRkKCdmb3J3YXJkLXNraXAnLCAnY2xpY2thYmxlJyk7XG4gICAgICBsYWJlbCArPSAnIDxzcGFuIGNsYXNzPVwic3RlcC1pbmxpbmUtYmFkZ2Ugc3RlcC1md2QtYmFkZ2VcIiB0aXRsZT1cIlByZXZpb3VzbHkgY29tcGxldGVkIFx1MjAxNCBjbGljayB0byBqdW1wIGFoZWFkXCI+XHUyM0U5PC9zcGFuPic7XG4gICAgfVxuXG4gICAgLy8gQXBwbHkgc3RhbGUgY2xhc3MgZm9yIHN0ZXBzIGRvd25zdHJlYW0gb2YgYSByZS1ydW5cbiAgICBpZiAoc3RhbGVTdGVwcy5oYXMoc3RlcCkpIGVsLmNsYXNzTGlzdC5hZGQoJ3N0YWxlJyk7XG5cbiAgICAvLyBBcHBlbmQgc3Itb25seSBzdGF0ZSBkZXNjcmlwdGlvbiBmb3Igc2NyZWVuIHJlYWRlciB1c2Vyc1xuICAgIGNvbnN0IGlzU3RhbGUgICAgICAgICA9IHN0YWxlU3RlcHMuaGFzKHN0ZXApO1xuICAgIGNvbnN0IGlzU3RhbGVDcml0aWNhbCA9IGVsLmNsYXNzTGlzdC5jb250YWlucygnc3RhbGUtY3JpdGljYWwnKTtcbiAgICBjb25zdCBpc0FjdGl2ZSAgICAgICAgPSBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2FjdGl2ZScpO1xuICAgIGNvbnN0IGlzQ29tcGxldGVkICAgICA9IGVsLmNsYXNzTGlzdC5jb250YWlucygnY29tcGxldGVkJyk7XG4gICAgY29uc3QgaXNGd2RTa2lwICAgICAgID0gZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdmb3J3YXJkLXNraXAnKTtcbiAgICBjb25zdCBzclN0YXRlID0gaXNTdGFsZUNyaXRpY2FsID8gJyAoY3JpdGljYWwgXHUyMDE0IHJldmlldyByZXF1aXJlZCknXG4gICAgICA6IGlzU3RhbGUgICAgID8gJyAoc3RhbGUgXHUyMDE0IHJlc3VsdHMgbWF5IGJlIG91dGRhdGVkKSdcbiAgICAgIDogaXNBY3RpdmUgICAgPyAnIChjdXJyZW50IHN0ZXApJ1xuICAgICAgOiBpc0NvbXBsZXRlZCA/ICcgKGNvbXBsZXRlZCknXG4gICAgICA6IGlzRndkU2tpcCAgID8gJyAocHJldmlvdXNseSBjb21wbGV0ZWQgXHUyMDE0IGNsaWNrIHRvIGp1bXAgYWhlYWQpJ1xuICAgICAgOiAnJztcbiAgICBpZiAoc3JTdGF0ZSkgbGFiZWwgKz0gYDxzcGFuIGNsYXNzPVwic3Itb25seVwiPiR7c3JTdGF0ZX08L3NwYW4+YDtcblxuICAgIGVsLmlubmVySFRNTCA9IGxhYmVsO1xuICB9KTtcblxuICBhcHBseUxheW91dEZyZXNobmVzc05hdmlnYXRpb25TdGF0ZSgpO1xuXG4gIC8vIFNob3cgXHUyMUJCIGljb25zIHZpYSBDU1MgOmhvdmVyIG9uIHRoZSBwYXJlbnQgLmNvbXBsZXRlZCBzdGVwXG4gIC8vIChpbmplY3QgYSA8c3R5bGU+IG9ubHkgb25jZSlcbiAgaWYgKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RlcC1yZXJ1bi1zdHlsZScpKSB7XG4gICAgY29uc3QgcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgcy5pZCA9ICdzdGVwLXJlcnVuLXN0eWxlJztcbiAgICBzLnRleHRDb250ZW50ID0gJy5zdGVwLmNvbXBsZXRlZDpob3ZlciAuc3RlcC1yZXJ1biwgLnN0ZXAuY29tcGxldGVkOmZvY3VzLXdpdGhpbiAuc3RlcC1yZXJ1biB7IG9wYWNpdHk6IDEgIWltcG9ydGFudDsgfSAuc3RlcC1yZXJ1bjpmb2N1cy12aXNpYmxlIHsgb3V0bGluZTogMnB4IHNvbGlkICMzYjgyZjY7IG91dGxpbmUtb2Zmc2V0OiAycHg7IG9wYWNpdHk6IDEgIWltcG9ydGFudDsgfSc7XG4gICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzKTtcbiAgfVxuXG4gIC8vIFN5bmMgc2Vjb25kLWJhciB0YWIgdmlzaWJpbGl0eSBhbmQgYWN0aW9uIGJ1dHRvbnMgdG8gdGhlIGFjdGl2ZSB3b3JrZmxvdyBzdGVwXG4gIGlmICh0eXBlb2YgdXBkYXRlVGFiQmFyRm9yU3RhZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICB1cGRhdGVUYWJCYXJGb3JTdGFnZShhY3RpdmVTdGVwKTtcbiAgfVxuICB1cGRhdGVBY3Rpb25CdXR0b25zKGFjdGl2ZVN0ZXApO1xuXG4gIC8vIFN5bmMgdmlldy1jdXJzb3IgcmluZyB0byB0aGUgY3VycmVudGx5IHZpc2libGUgdGFiXG4gIF91cGRhdGVWaWV3aW5nSW5kaWNhdG9yKHN0YXRlTWFuYWdlci5nZXRDdXJyZW50VGFiKCkpO1xufVxuXG5pZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoR0VORVJBVElPTl9TVEFURV9FVkVOVCwgYXBwbHlMYXlvdXRGcmVzaG5lc3NOYXZpZ2F0aW9uU3RhdGUpO1xuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihHRU5FUkFUSU9OX1NUQVRFX0VWRU5ULCBhcHBseURpcnR5UGhhc2VOYXZpZ2F0aW9uU3RhdGUpO1xufVxuXG4vKipcbiAqIE1hcmsgb3IgdW5tYXJrIHdvcmtmbG93IHN0ZXAgcGlsbHMgYXMgc3RhbGUgYmFzZWQgb24gZGlydHkgcGhhc2VzIHNldCBieVxuICogbGF5b3V0LXBoYXNlIGNvbnRlbnQgZWRpdHMgKFBPU1QgL2FwaS9jdi9hcHBseS1jb250ZW50LWNoYW5nZXMpLlxuICpcbiAqIE9ubHkgYWZmZWN0cyBzdGVwcyBsaXN0ZWQgaW4gc3RhdGVNYW5hZ2VyLmdldERpcnR5UGhhc2VzKCkgdGhhdCBhcmUgTk9UXG4gKiBhbHJlYWR5IGhhbmRsZWQgYnkgYXBwbHlMYXlvdXRGcmVzaG5lc3NOYXZpZ2F0aW9uU3RhdGUgKGkuZS4gbm90ICdsYXlvdXQnKS5cbiAqL1xuZnVuY3Rpb24gYXBwbHlEaXJ0eVBoYXNlTmF2aWdhdGlvblN0YXRlKCkge1xuICBjb25zdCBkaXJ0eVBoYXNlcyA9IHN0YXRlTWFuYWdlci5nZXREaXJ0eVBoYXNlcygpO1xuICBjb25zdCBzdGVwc1RvQ2xlYXIgPSBbXTsgICAgLy8gc3RlcHMgd2UgbWFuYWdlIGhlcmUgKG5vdCAnbGF5b3V0JylcblxuICBzdGVwc1RvQ2xlYXIuZm9yRWFjaChzdGVwID0+IHtcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzdGVwLSR7c3RlcH1gKTtcbiAgICBpZiAoIWVsKSByZXR1cm47XG5cbiAgICBjb25zdCBpc0RpcnR5ID0gZGlydHlQaGFzZXMuaW5jbHVkZXMoc3RlcCk7XG4gICAgZWwuY2xhc3NMaXN0LnRvZ2dsZSgnc3RhbGUnLCBpc0RpcnR5KTtcblxuICAgIC8vIFByZXNlcnZlIGV4aXN0aW5nIHJlcnVuIGJ1dHRvbiBtYXJrdXAsIHVwZGF0ZSB0ZXh0ICsgYmFkZ2VcbiAgICBjb25zdCByZXJ1bkh0bWwgPSBlbC5xdWVyeVNlbGVjdG9yKCcuc3RlcC1yZXJ1bicpPy5vdXRlckhUTUwgfHwgJyc7XG4gICAgY29uc3QgbGFiZWwgICAgID0gX1NURVBfRElTUExBWVtzdGVwXSB8fCBzdGVwO1xuICAgIGNvbnN0IGJhZGdlICAgICA9IGlzRGlydHlcbiAgICAgID8gJyA8c3BhbiBjbGFzcz1cInN0ZXAtaW5saW5lLWJhZGdlIHN0ZXAtc3RhbGUtYmFkZ2VcIj5Db250ZW50IGNoYW5nZWQ8L3NwYW4+J1xuICAgICAgOiAnJztcbiAgICBlbC5pbm5lckhUTUwgPSBgJHtsYWJlbH0ke2JhZGdlfSR7cmVydW5IdG1sID8gYCAke3JlcnVuSHRtbH1gIDogJyd9YDtcbiAgfSk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBTdGVwIG5hdmlnYXRpb24gaGVscGVyIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBfZG9TdGVwTmF2aWdhdGUoc3RlcCkge1xuICBjb25zdCBzdGVwVG9UYWIgPSB7XG4gICAgYW5hbHlzaXM6ICAgICAgICdhbmFseXNpcycsXG4gICAgY3VzdG9taXphdGlvbnM6ICdnb2FscycsXG4gICAgcmV3cml0ZTogICAgICAgICdyZXdyaXRlJyxcbiAgICBzcGVsbDogICAgICAgICAgJ3NwZWxsJyxcbiAgICBsYXlvdXQ6ICAgICAgICAgJ2xheW91dCcsXG4gICAgZG93bmxvYWQ6ICAgICAgICdmaW5hbF9nZW5lcmF0ZScsXG4gICAgY292ZXJfbGV0dGVyOiAgICdjb3Zlci1sZXR0ZXInLFxuICAgIHNjcmVlbmluZzogICAgICAnc2NyZWVuaW5nJyxcbiAgICBpbnRlcnZpZXdfcHJlcDogJ2ludGVydmlldy1wcmVwJyxcbiAgICB0aGFua195b3U6ICAgICAgJ3RoYW5rLXlvdScsXG4gICAgaGFydmVzdDogICAgICAgICdoYXJ2ZXN0JyxcbiAgfTtcbiAgY29uc3QgdGFiTmFtZSA9IHN0ZXBUb1RhYltzdGVwXTtcbiAgaWYgKCF0YWJOYW1lKSByZXR1cm47XG4gIGlmICh0eXBlb2YgdXBkYXRlVGFiQmFyRm9yU3RhZ2UgPT09ICdmdW5jdGlvbicpIHVwZGF0ZVRhYkJhckZvclN0YWdlKHN0ZXApO1xuICBzd2l0Y2hUYWIodGFiTmFtZSk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBTdGVwIGNsaWNrIChiYWNrLW5hdikgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8vIEJhY2stbmF2aWdhdGlvbjogY2xpY2tpbmcgYSBjb21wbGV0ZWQgd29ya2Zsb3cgc3RlcCBuYXZpZ2F0ZXMgdG8gaXRzIHZpZXdlciB0YWIuXG4vLyBDbGlja2luZyB0aGUgam9iIHN0ZXAgYWx3YXlzIG9wZW5zIHRoZSBsb2FkLWpvYiBwYW5lbC5cbmZ1bmN0aW9uIGhhbmRsZVN0ZXBDbGljayhzdGVwKSB7XG4gIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHN0ZXAtJHtzdGVwfWApO1xuICBpZiAoIWVsKSByZXR1cm47XG5cbiAgLy8gSm9iIHN0ZXA6IHNob3cgam9iIGNvbnRlbnQgaWYgYSBqb2IgaXMgbG9hZGVkLCBvdGhlcndpc2Ugb3BlbiB0aGUgbG9hZCBwYW5lbC5cbiAgaWYgKHN0ZXAgPT09ICdqb2InKSB7XG4gICAgaWYgKGVsLmNsYXNzTGlzdC5jb250YWlucygnY29tcGxldGVkJykgfHwgZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdhY3RpdmUnKSkge1xuICAgICAgc3dpdGNoVGFiKCdqb2InKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2hvd0xvYWRKb2JQYW5lbCgpO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBGb3J3YXJkLXNraXA6IHByZXZpb3VzbHkgcmVhY2hlZCBzdGFnZSB0aGF0IGlzIGFoZWFkIG9mIGN1cnJlbnQgcGhhc2UuXG4gIGlmIChlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2ZvcndhcmQtc2tpcCcpKSB7XG4gICAgY29uc3QgbGFiZWwgPSBfU1RFUF9ESVNQTEFZW3N0ZXBdIHx8IHN0ZXA7XG4gICAgaWYgKHR5cGVvZiBjb25maXJtRGlhbG9nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25maXJtRGlhbG9nKFxuICAgICAgICBgSnVtcCBhaGVhZCB0byAke2xhYmVsfT9cXG5cXG5JbnRlcm1lZGlhdGUgc3RhZ2VzIG1heSBuZWVkIHJlLXJ1bm5pbmcgaWYgeW91IG1ha2UgY2hhbmdlcyBoZXJlLmAsXG4gICAgICAgIHsgY29uZmlybUxhYmVsOiAnSnVtcCBhaGVhZCcsIGNhbmNlbExhYmVsOiAnU3RheSBoZXJlJyB9XG4gICAgICApLnRoZW4oY29uZmlybWVkID0+IHsgaWYgKGNvbmZpcm1lZCkgX2RvU3RlcE5hdmlnYXRlKHN0ZXApOyB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgX2RvU3RlcE5hdmlnYXRlKHN0ZXApO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBPbmx5IG5hdmlnYXRlIGlmIHRoZSBzdGVwIGlzIGNvbXBsZXRlZCAoYmFjay1uYXYpIG9yIGFjdGl2ZS5cbiAgaWYgKCFlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2NvbXBsZXRlZCcpICYmICFlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2FjdGl2ZScpKSByZXR1cm47XG5cbiAgY29uc3QgaGFzVW5hbnN3ZXJlZFBvc3RBbmFseXNpc1F1ZXN0aW9ucyA9ICgpID0+IHtcbiAgICBjb25zdCBxcyA9IEFycmF5LmlzQXJyYXkod2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucykgPyB3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zIDogW107XG4gICAgaWYgKHFzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGFuc3dlcnMgPSAod2luZG93LnF1ZXN0aW9uQW5zd2VycyAmJiB0eXBlb2Ygd2luZG93LnF1ZXN0aW9uQW5zd2VycyA9PT0gJ29iamVjdCcpXG4gICAgICA/IHdpbmRvdy5xdWVzdGlvbkFuc3dlcnNcbiAgICAgIDoge307XG4gICAgcmV0dXJuIHFzLnNvbWUocSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGFuc3dlcnNbcS50eXBlXTtcbiAgICAgIHJldHVybiAhdmFsdWUgfHwgIVN0cmluZyh2YWx1ZSkudHJpbSgpO1xuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IHN0ZXBUb1RhYiA9IHtcbiAgICBhbmFseXNpczogICAgICAgaGFzVW5hbnN3ZXJlZFBvc3RBbmFseXNpc1F1ZXN0aW9ucygpID8gJ3F1ZXN0aW9ucycgOiAnYW5hbHlzaXMnLFxuICAgIGN1c3RvbWl6YXRpb25zOiAnZ29hbHMnLFxuICAgIHJld3JpdGU6ICAgICAgICAncmV3cml0ZScsXG4gICAgc3BlbGw6ICAgICAgICAgICdzcGVsbCcsXG4gICAgbGF5b3V0OiAgICAgICAgICdsYXlvdXQnLFxuICAgIGRvd25sb2FkOiAgICAgICAnZmluYWxfZ2VuZXJhdGUnLFxuICAgIGNvdmVyX2xldHRlcjogICAnY292ZXItbGV0dGVyJyxcbiAgICBzY3JlZW5pbmc6ICAgICAgJ3NjcmVlbmluZycsXG4gICAgaW50ZXJ2aWV3X3ByZXA6ICdpbnRlcnZpZXctcHJlcCcsXG4gICAgdGhhbmtfeW91OiAgICAgICd0aGFuay15b3UnLFxuICAgIGhhcnZlc3Q6ICAgICAgICAnaGFydmVzdCcsXG4gIH07XG4gIGNvbnN0IHRhYk5hbWUgPSBzdGVwVG9UYWJbc3RlcF07XG4gIGlmICghdGFiTmFtZSkgcmV0dXJuO1xuXG4gIGNvbnN0IGRvTmF2aWdhdGUgPSAoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB1cGRhdGVUYWJCYXJGb3JTdGFnZSA9PT0gJ2Z1bmN0aW9uJykgdXBkYXRlVGFiQmFyRm9yU3RhZ2Uoc3RlcCk7XG4gICAgc3dpdGNoVGFiKHRhYk5hbWUpO1xuICB9O1xuXG4gIC8vIFNob3cgYSBkb3duc3RyZWFtLWF3YXJlbmVzcyBkaWFsb2cgd2hlbiBiYWNrLW5hdmlnYXRpbmcgdG8gYSBjb21wbGV0ZWQgc3RlcFxuICAvLyB0aGF0IGhhcyBkb3duc3RyZWFtIGNvbXBsZXRlZCBzdGVwcyAobm90IHdoZW4gdGhlIHN0ZXAgaXMgYWN0aXZlKS5cbiAgaWYgKGVsLmNsYXNzTGlzdC5jb250YWlucygnY29tcGxldGVkJykgJiYgIWVsLmNsYXNzTGlzdC5jb250YWlucygnYWN0aXZlJykpIHtcbiAgICBjb25zdCBzdGVwSWR4ID0gX1NURVBfT1JERVIuaW5kZXhPZihzdGVwKTtcbiAgICBjb25zdCBoYXNEb3duc3RyZWFtQ29tcGxldGVkID0gX1NURVBfT1JERVIuc2xpY2Uoc3RlcElkeCArIDEpLnNvbWUocyA9PiB7XG4gICAgICBjb25zdCBkb3duc3RyZWFtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHN0ZXAtJHtzfWApO1xuICAgICAgcmV0dXJuIGRvd25zdHJlYW0gJiYgZG93bnN0cmVhbS5jbGFzc0xpc3QuY29udGFpbnMoJ2NvbXBsZXRlZCcpO1xuICAgIH0pO1xuICAgIGlmIChoYXNEb3duc3RyZWFtQ29tcGxldGVkKSB7XG4gICAgICBfc2hvd1JlUnVuQ29uZmlybU1vZGFsKHN0ZXAsICdiYWNrLW5hdicsIGRvTmF2aWdhdGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGRvTmF2aWdhdGUoKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEV4cG9ydHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmV4cG9ydCB7XG4gIF9TVEVQX09SREVSLFxuICBfU1RFUF9ESVNQTEFZLFxuICBiYWNrVG9QaGFzZSxcbiAgX3Nob3dSZVJ1bkNvbmZpcm1Nb2RhbCxcbiAgX3Nob3dBbmFseXNpc0NsYXJpZmljYXRpb25BbWVuZE1vZGFsLFxuICBjb25maXJtUmVSdW5QaGFzZSxcbiAgcmVSdW5QaGFzZSxcbiAgX2V4ZWN1dGVSZVJ1blBoYXNlLFxuICBfZ2V0U3RlcFRvb2x0aXAsXG4gIF91cGRhdGVWaWV3aW5nSW5kaWNhdG9yLFxuICBfaGlnaGxpZ2h0Q2hhbmdlZEl0ZW1zLFxuICBfbWFya0NoYW5nZWQsXG4gIGFwcGx5TGF5b3V0RnJlc2huZXNzTmF2aWdhdGlvblN0YXRlLFxuICBhcHBseURpcnR5UGhhc2VOYXZpZ2F0aW9uU3RhdGUsXG4gIHNob3dCdWxsZXRSZW9yZGVyLFxuICBfYXBwbHlCdWxsZXRPcmRlcixcbiAgbW92ZUJ1bGxldCxcbiAgX3VwZGF0ZUJ1bGxldEFycm93cyxcbiAgc2F2ZUJ1bGxldE9yZGVyLFxuICByZXNldEJ1bGxldE9yZGVyLFxuICB1cGRhdGVXb3JrZmxvd1N0ZXBzLFxuICBoYW5kbGVTdGVwQ2xpY2ssXG4gIF9BQ1RJT05fTEFCRUxTLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL3ZhbGlkYXRvcnMuanNcbiAqIEFQSSByZXNwb25zZSB2YWxpZGF0b3JzIFx1MjAxNCBEVE8gbWlycm9ycyBvZiBQeXRob24gZGF0YWNsYXNzZXMgaW4gd2ViX2FwcC5weS5cbiAqXG4gKiBFYWNoIGZ1bmN0aW9uIGNoZWNrcyB0aGF0IHJlcXVpcmVkIGZpZWxkcyBhcmUgcHJlc2VudCBpbiBhbiBBUEkgcmVzcG9uc2UgYW5kXG4gKiBsb2dzIGEgY29uc29sZS53YXJuIGlmIGFueSBhcmUgbWlzc2luZyBvciBoYXZlIGFuIHVuZXhwZWN0ZWQgdHlwZS4gIFZhbGlkYXRvcnNcbiAqIHJldHVybiB0aGUgb3JpZ2luYWwgZGF0YSBvYmplY3QgdW5jaGFuZ2VkIHNvIHRoZXkgY2FuIGJlIHVzZWQgaW5saW5lLlxuICpcbiAqIFVwZGF0ZSBib3RoIHRoaXMgZmlsZSBhbmQgdGhlIFB5dGhvbiBkYXRhY2xhc3NlcyBpbiB3ZWJfYXBwLnB5IHRvZ2V0aGVyXG4gKiB3aGVuZXZlciBhZGRpbmcgb3IgcmVtb3ZpbmcgcmVzcG9uc2UgZmllbGRzLlxuICpcbiAqIERFUEVOREVOQ0lFUzogbm9uZVxuICovXG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmNvbnN0IGxvZyA9IGdldExvZ2dlcigndmFsaWRhdG9ycycpO1xuXG4vKiogVmFsaWRhdGUgR0VUIC9hcGkvc3RhdHVzIHJlc3BvbnNlLiAqL1xuZnVuY3Rpb24gcGFyc2VTdGF0dXNSZXNwb25zZShkYXRhKSB7XG4gIGNvbnN0IHJlcXVpcmVkID0gW1xuICAgICdwaGFzZScsICdsbG1fcHJvdmlkZXInLCAnam9iX2Rlc2NyaXB0aW9uJyxcbiAgICAncG9zdF9hbmFseXNpc19xdWVzdGlvbnMnLCAncG9zdF9hbmFseXNpc19hbnN3ZXJzJyxcbiAgICAnYWxsX2V4cGVyaWVuY2VfaWRzJywgJ2FsbF9leHBlcmllbmNlcycsICdhbGxfc2tpbGxzJywgJ2FsbF9hY2hpZXZlbWVudHMnLFxuICAgICdwcm9mZXNzaW9uYWxfc3VtbWFyaWVzJywgJ2NvcGlsb3RfYXV0aCcsICdpdGVyYXRpbmcnLFxuICAgICdleHBlcmllbmNlX2RlY2lzaW9ucycsICdza2lsbF9kZWNpc2lvbnMnLFxuICAgICdhY2hpZXZlbWVudF9kZWNpc2lvbnMnLCAncHVibGljYXRpb25fZGVjaXNpb25zJyxcbiAgICAnZXh0cmFfc2tpbGxzJywgJ2V4dHJhX3NraWxsX21hdGNoZXMnLCAnc2Vzc2lvbl9maWxlJyxcbiAgXTtcbiAgY29uc3QgbWlzc2luZyA9IHJlcXVpcmVkLmZpbHRlcihrID0+ICEoayBpbiBkYXRhKSk7XG4gIGlmIChtaXNzaW5nLmxlbmd0aCkge1xuICAgIGxvZy53YXJuKCdbcGFyc2VTdGF0dXNSZXNwb25zZV0gTWlzc2luZyBmaWVsZHM6JywgbWlzc2luZywgZGF0YSk7XG4gIH1cbiAgaWYgKCdwb3N0X2FuYWx5c2lzX3F1ZXN0aW9ucycgaW4gZGF0YSAmJiAhQXJyYXkuaXNBcnJheShkYXRhLnBvc3RfYW5hbHlzaXNfcXVlc3Rpb25zKSkge1xuICAgIGxvZy53YXJuKCdbcGFyc2VTdGF0dXNSZXNwb25zZV0gcG9zdF9hbmFseXNpc19xdWVzdGlvbnMgc2hvdWxkIGJlIGFuIGFycmF5OicsIGRhdGEucG9zdF9hbmFseXNpc19xdWVzdGlvbnMpO1xuICB9XG4gIGlmICgnYWxsX2V4cGVyaWVuY2VfaWRzJyBpbiBkYXRhICYmICFBcnJheS5pc0FycmF5KGRhdGEuYWxsX2V4cGVyaWVuY2VfaWRzKSkge1xuICAgIGxvZy53YXJuKCdbcGFyc2VTdGF0dXNSZXNwb25zZV0gYWxsX2V4cGVyaWVuY2VfaWRzIHNob3VsZCBiZSBhbiBhcnJheTonLCBkYXRhLmFsbF9leHBlcmllbmNlX2lkcyk7XG4gIH1cbiAgcmV0dXJuIGRhdGE7XG59XG5cbi8qKiBWYWxpZGF0ZSBHRVQgL2FwaS9zZXNzaW9ucyByZXNwb25zZS4gKi9cbmZ1bmN0aW9uIHBhcnNlU2Vzc2lvbkxpc3RSZXNwb25zZShkYXRhKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShkYXRhLnNlc3Npb25zKSkge1xuICAgIGxvZy53YXJuKCdbcGFyc2VTZXNzaW9uTGlzdFJlc3BvbnNlXSBzZXNzaW9ucyBzaG91bGQgYmUgYW4gYXJyYXk6JywgZGF0YSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgaXRlbVJlcXVpcmVkID0gWydwYXRoJywgJ3Bvc2l0aW9uX25hbWUnLCAndGltZXN0YW1wJywgJ3BoYXNlJywgJ2hhc19qb2InLCAnaGFzX2FuYWx5c2lzJywgJ2hhc19jdXN0b21pemF0aW9ucyddO1xuICAgIGRhdGEuc2Vzc2lvbnMuZm9yRWFjaCgocywgaSkgPT4ge1xuICAgICAgY29uc3QgbWlzc2luZyA9IGl0ZW1SZXF1aXJlZC5maWx0ZXIoayA9PiAhKGsgaW4gcykpO1xuICAgICAgaWYgKG1pc3NpbmcubGVuZ3RoKSBsb2cud2FybihgW3BhcnNlU2Vzc2lvbkxpc3RSZXNwb25zZV0gc2Vzc2lvbnNbJHtpfV0gbWlzc2luZyBmaWVsZHM6YCwgbWlzc2luZywgcyk7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGRhdGE7XG59XG5cbi8qKiBWYWxpZGF0ZSBHRVQgL2FwaS9yZXdyaXRlcyByZXNwb25zZS4gKi9cbmZ1bmN0aW9uIHBhcnNlUmV3cml0ZXNSZXNwb25zZShkYXRhKSB7XG4gIGNvbnN0IHJlcXVpcmVkID0gWydvaycsICdyZXdyaXRlcycsICdwZXJzdWFzaW9uX3dhcm5pbmdzJywgJ3BoYXNlJ107XG4gIGNvbnN0IG1pc3NpbmcgPSByZXF1aXJlZC5maWx0ZXIoayA9PiAhKGsgaW4gZGF0YSkpO1xuICBpZiAobWlzc2luZy5sZW5ndGgpIGxvZy53YXJuKCdbcGFyc2VSZXdyaXRlc1Jlc3BvbnNlXSBNaXNzaW5nIGZpZWxkczonLCBtaXNzaW5nLCBkYXRhKTtcbiAgaWYgKCdyZXdyaXRlcycgaW4gZGF0YSAmJiAhQXJyYXkuaXNBcnJheShkYXRhLnJld3JpdGVzKSkge1xuICAgIGxvZy53YXJuKCdbcGFyc2VSZXdyaXRlc1Jlc3BvbnNlXSByZXdyaXRlcyBzaG91bGQgYmUgYW4gYXJyYXk6JywgZGF0YS5yZXdyaXRlcyk7XG4gIH1cbiAgcmV0dXJuIGRhdGE7XG59XG5cbi8qKiBWYWxpZGF0ZSBQT1NUIC9hcGkvbWVzc2FnZSBhbmQgUE9TVCAvYXBpL2FjdGlvbiByZXNwb25zZXMuICovXG5mdW5jdGlvbiBwYXJzZU1lc3NhZ2VSZXNwb25zZShkYXRhKSB7XG4gIGlmICghZGF0YS5vayAmJiAhZGF0YS5lcnJvcikge1xuICAgIGxvZy53YXJuKCdbcGFyc2VNZXNzYWdlUmVzcG9uc2VdIFJlc3BvbnNlIGhhcyBuZWl0aGVyIG9rIG5vciBlcnJvcjonLCBkYXRhKTtcbiAgfVxuICByZXR1cm4gZGF0YTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEVTIG1vZHVsZSBleHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuZXhwb3J0IHtcbiAgcGFyc2VTdGF0dXNSZXNwb25zZSxcbiAgcGFyc2VTZXNzaW9uTGlzdFJlc3BvbnNlLFxuICBwYXJzZVJld3JpdGVzUmVzcG9uc2UsXG4gIHBhcnNlTWVzc2FnZVJlc3BvbnNlLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL3JlY29tbWVuZGF0aW9uLWhlbHBlcnMuanNcbiAqIFB1cmUgaGVscGVyIGZ1bmN0aW9ucyBmb3IgbG9va2luZyB1cCBMTE0gcmVjb21tZW5kYXRpb24gZGF0YSBmcm9tIHRoZVxuICogL2FwaS9zdGF0dXMgcmVzcG9uc2Ugb2JqZWN0LiAgU3VwcG9ydHMgZXhwZXJpZW5jZSwgc2tpbGwsIGFuZCBhY2hpZXZlbWVudFxuICogcmVjb21tZW5kYXRpb25zIHdpdGggYmFja3dhcmRzLWNvbXBhdGlibGUgZmxhdC1saXN0IGZhbGxiYWNrcyBmb3Igb2xkXG4gKiBzZXNzaW9uIGRhdGEuXG4gKlxuICogREVQRU5ERU5DSUVTOiBub25lXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdyZWNvbW1lbmRhdGlvbi1oZWxwZXJzJyk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gSW50ZXJuYWwgbG9va3VwIGhlbHBlcnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogTG9vayB1cCBhIHNpbmdsZSBleHBlcmllbmNlIGVudHJ5IGluIGV4cGVyaWVuY2VfcmVjb21tZW5kYXRpb25zLiAqL1xuZnVuY3Rpb24gX2ZpbmRFeHBSZWMoZXhwSWQsIGRhdGEpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEuZXhwZXJpZW5jZV9yZWNvbW1lbmRhdGlvbnMpKSB7XG4gICAgbG9nLndhcm4oJ1tyZWNvbW1lbmRhdGlvbl0gZXhwZXJpZW5jZV9yZWNvbW1lbmRhdGlvbnMgbWlzc2luZzsgdXNpbmcgZmxhdC1saXN0IGZhbGxiYWNrIGZvcicsIGV4cElkKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gZGF0YS5leHBlcmllbmNlX3JlY29tbWVuZGF0aW9ucy5maW5kKHIgPT4gci5pZCA9PT0gZXhwSWQgfHwgci5leHBlcmllbmNlX2lkID09PSBleHBJZCkgfHwgbnVsbDtcbn1cblxuLyoqIExvb2sgdXAgYSBzaW5nbGUgc2tpbGwgZW50cnkgaW4gc2tpbGxfcmVjb21tZW5kYXRpb25zLiAqL1xuZnVuY3Rpb24gX2ZpbmRTa2lsbFJlYyhza2lsbCwgZGF0YSkge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YS5za2lsbF9yZWNvbW1lbmRhdGlvbnMpKSB7XG4gICAgbG9nLndhcm4oJ1tyZWNvbW1lbmRhdGlvbl0gc2tpbGxfcmVjb21tZW5kYXRpb25zIG1pc3Npbmc7IHVzaW5nIGZsYXQtbGlzdCBmYWxsYmFjayBmb3InLCBza2lsbCk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIGRhdGEuc2tpbGxfcmVjb21tZW5kYXRpb25zLmZpbmQociA9PiByLnNraWxsID09PSBza2lsbCB8fCByLm5hbWUgPT09IHNraWxsKSB8fCBudWxsO1xufVxuXG4vKiogUGFyc2UgYSByYXcgY29uZmlkZW5jZSBzdHJpbmcgdG8gYSB7bGV2ZWwsIHRleHR9IG9iamVjdCwgb3IgbnVsbCBpZiB1bnJlY29nbmlzZWQuICovXG5mdW5jdGlvbiBfcGFyc2VDb25maWRlbmNlKGNvbmYpIHtcbiAgY29uc3QgYyA9IChjb25mIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICBpZiAoYy5pbmNsdWRlcygndmVyeSBoaWdoJykpIHJldHVybiB7IGxldmVsOiAndmVyeS1oaWdoJywgdGV4dDogJ1ZlcnkgSGlnaCBDb25maWRlbmNlJyB9O1xuICBpZiAoYy5pbmNsdWRlcygndmVyeSBsb3cnKSkgIHJldHVybiB7IGxldmVsOiAndmVyeS1sb3cnLCAgdGV4dDogJ1ZlcnkgTG93IENvbmZpZGVuY2UnICB9O1xuICBpZiAoYy5pbmNsdWRlcygnaGlnaCcpKSAgICAgIHJldHVybiB7IGxldmVsOiAnaGlnaCcsICAgICAgdGV4dDogJ0hpZ2ggQ29uZmlkZW5jZScgICAgICB9O1xuICBpZiAoYy5pbmNsdWRlcygnbWVkaXVtJykpICAgIHJldHVybiB7IGxldmVsOiAnbWVkaXVtJywgICAgdGV4dDogJ01lZGl1bSBDb25maWRlbmNlJyAgICB9O1xuICBpZiAoYy5pbmNsdWRlcygnbG93JykpICAgICAgIHJldHVybiB7IGxldmVsOiAnbG93JywgICAgICAgdGV4dDogJ0xvdyBDb25maWRlbmNlJyAgICAgICB9O1xuICByZXR1cm4gbnVsbDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBFeHBlcmllbmNlIHJlY29tbWVuZGF0aW9uc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIGdldEV4cGVyaWVuY2VSZWNvbW1lbmRhdGlvbihleHBJZCwgZGF0YSkge1xuICBjb25zdCByZWMgPSBfZmluZEV4cFJlYyhleHBJZCwgZGF0YSk7XG4gIGlmIChyZWMgJiYgcmVjLnJlY29tbWVuZGF0aW9uKSByZXR1cm4gcmVjLnJlY29tbWVuZGF0aW9uO1xuICAvLyBCYWNrd2FyZHMtY29tcGF0IGZsYXQtbGlzdCBmYWxsYmFja1xuICBpZiAoZGF0YS5vbWl0dGVkX2V4cGVyaWVuY2VzICAgICAmJiBkYXRhLm9taXR0ZWRfZXhwZXJpZW5jZXMuaW5jbHVkZXMoZXhwSWQpKSAgICAgcmV0dXJuICdPbWl0JztcbiAgaWYgKGRhdGEucmVjb21tZW5kZWRfZXhwZXJpZW5jZXMgJiYgZGF0YS5yZWNvbW1lbmRlZF9leHBlcmllbmNlcy5pbmNsdWRlcyhleHBJZCkpIHJldHVybiAnRW1waGFzaXplJztcbiAgcmV0dXJuICdJbmNsdWRlJztcbn1cblxuZnVuY3Rpb24gZ2V0Q29uZmlkZW5jZUxldmVsKGV4cElkLCBkYXRhKSB7XG4gIGNvbnN0IHJlYyA9IF9maW5kRXhwUmVjKGV4cElkLCBkYXRhKTtcbiAgcmV0dXJuIChyZWMgJiYgX3BhcnNlQ29uZmlkZW5jZShyZWMuY29uZmlkZW5jZSkpIHx8IHsgbGV2ZWw6ICdtZWRpdW0nLCB0ZXh0OiAnTWVkaXVtIENvbmZpZGVuY2UnIH07XG59XG5cbmZ1bmN0aW9uIGdldEV4cGVyaWVuY2VSZWFzb25pbmcoZXhwSWQsIGRhdGEpIHtcbiAgY29uc3QgcmVjID0gX2ZpbmRFeHBSZWMoZXhwSWQsIGRhdGEpO1xuICByZXR1cm4gKHJlYyAmJiByZWMucmVhc29uaW5nKSB8fCAnVGhpcyBleHBlcmllbmNlIHdhcyBzZWxlY3RlZCBiYXNlZCBvbiBpdHMgcmVsZXZhbmNlIHRvIHRoZSBwb3NpdGlvbiByZXF1aXJlbWVudHMuJztcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTa2lsbCByZWNvbW1lbmRhdGlvbnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiBnZXRTa2lsbFJlY29tbWVuZGF0aW9uKHNraWxsLCBkYXRhKSB7XG4gIGNvbnN0IHJlYyA9IF9maW5kU2tpbGxSZWMoc2tpbGwsIGRhdGEpO1xuICBpZiAocmVjICYmIHJlYy5yZWNvbW1lbmRhdGlvbikgcmV0dXJuIHJlYy5yZWNvbW1lbmRhdGlvbjtcbiAgaWYgKGRhdGEucmVjb21tZW5kZWRfc2tpbGxzICYmIGRhdGEucmVjb21tZW5kZWRfc2tpbGxzLmluY2x1ZGVzKHNraWxsKSkgcmV0dXJuICdJbmNsdWRlJztcbiAgcmV0dXJuICdPbWl0Jztcbn1cblxuZnVuY3Rpb24gZ2V0U2tpbGxDb25maWRlbmNlKHNraWxsLCBkYXRhKSB7XG4gIGNvbnN0IHJlYyA9IF9maW5kU2tpbGxSZWMoc2tpbGwsIGRhdGEpO1xuICBpZiAocmVjKSB7XG4gICAgY29uc3QgcGFyc2VkID0gX3BhcnNlQ29uZmlkZW5jZShyZWMuY29uZmlkZW5jZSk7XG4gICAgaWYgKHBhcnNlZCkgcmV0dXJuIHBhcnNlZDtcbiAgfVxuICBpZiAoZGF0YS5yZWNvbW1lbmRlZF9za2lsbHMgJiYgZGF0YS5yZWNvbW1lbmRlZF9za2lsbHMuaW5jbHVkZXMoc2tpbGwpKSB7XG4gICAgcmV0dXJuIHsgbGV2ZWw6ICdtZWRpdW0nLCB0ZXh0OiAnTWVkaXVtIENvbmZpZGVuY2UnIH07XG4gIH1cbiAgcmV0dXJuIHsgbGV2ZWw6ICdsb3cnLCB0ZXh0OiAnTG93IENvbmZpZGVuY2UnIH07XG59XG5cbmZ1bmN0aW9uIGdldFNraWxsUmVhc29uaW5nKHNraWxsLCBkYXRhKSB7XG4gIGNvbnN0IHJlYyA9IF9maW5kU2tpbGxSZWMoc2tpbGwsIGRhdGEpO1xuICBpZiAocmVjICYmIHJlYy5yZWFzb25pbmcpIHJldHVybiByZWMucmVhc29uaW5nO1xuICBpZiAoZGF0YS5yZWNvbW1lbmRlZF9za2lsbHMgJiYgZGF0YS5yZWNvbW1lbmRlZF9za2lsbHMuaW5jbHVkZXMoc2tpbGwpKSB7XG4gICAgcmV0dXJuICdUaGlzIHNraWxsIHdhcyBpZGVudGlmaWVkIGFzIHJlbGV2YW50IHRvIHRoZSBwb3NpdGlvbiByZXF1aXJlbWVudHMuJztcbiAgfVxuICByZXR1cm4gJ1RoaXMgc2tpbGwgd2FzIG5vdCBzcGVjaWZpY2FsbHkgbWVudGlvbmVkIGluIHRoZSBqb2IgcmVxdWlyZW1lbnRzLic7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQWNoaWV2ZW1lbnQgcmVjb21tZW5kYXRpb25zXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gZ2V0QWNoaWV2ZW1lbnRSZWNvbW1lbmRhdGlvbihhY2hJZCwgZGF0YSkge1xuICBpZiAoZGF0YS5hY2hpZXZlbWVudF9yZWNvbW1lbmRhdGlvbnMgJiYgQXJyYXkuaXNBcnJheShkYXRhLmFjaGlldmVtZW50X3JlY29tbWVuZGF0aW9ucykpIHtcbiAgICBjb25zdCByZWMgPSBkYXRhLmFjaGlldmVtZW50X3JlY29tbWVuZGF0aW9ucy5maW5kKHIgPT4gci5pZCA9PT0gYWNoSWQpO1xuICAgIGlmIChyZWMgJiYgcmVjLnJlY29tbWVuZGF0aW9uKSByZXR1cm4gcmVjLnJlY29tbWVuZGF0aW9uO1xuICB9XG4gIGlmIChkYXRhLnJlY29tbWVuZGVkX2FjaGlldmVtZW50cyAmJiBkYXRhLnJlY29tbWVuZGVkX2FjaGlldmVtZW50cy5pbmNsdWRlcyhhY2hJZCkpIHtcbiAgICByZXR1cm4gJ0luY2x1ZGUnO1xuICB9XG4gIHJldHVybiAnRGUtZW1waGFzaXplJztcbn1cblxuZnVuY3Rpb24gZ2V0QWNoaWV2ZW1lbnRDb25maWRlbmNlKGFjaElkLCBkYXRhLCBhY2hJbXBvcnRhbmNlKSB7XG4gIGlmIChkYXRhLmFjaGlldmVtZW50X3JlY29tbWVuZGF0aW9ucyAmJiBBcnJheS5pc0FycmF5KGRhdGEuYWNoaWV2ZW1lbnRfcmVjb21tZW5kYXRpb25zKSkge1xuICAgIGNvbnN0IHJlYyA9IGRhdGEuYWNoaWV2ZW1lbnRfcmVjb21tZW5kYXRpb25zLmZpbmQociA9PiByLmlkID09PSBhY2hJZCk7XG4gICAgaWYgKHJlYyAmJiByZWMuY29uZmlkZW5jZSkge1xuICAgICAgY29uc3QgY29uZiA9IHJlYy5jb25maWRlbmNlLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAoY29uZi5pbmNsdWRlcygndmVyeSBoaWdoJykpIHJldHVybiB7IGxldmVsOiAndmVyeS1oaWdoJywgdGV4dDogJ1ZlcnkgSGlnaCcgfTtcbiAgICAgIGlmIChjb25mLmluY2x1ZGVzKCdoaWdoJykpICAgICAgcmV0dXJuIHsgbGV2ZWw6ICdoaWdoJywgICAgICB0ZXh0OiAnSGlnaCcgICAgICB9O1xuICAgICAgaWYgKGNvbmYuaW5jbHVkZXMoJ21lZGl1bScpKSAgICByZXR1cm4geyBsZXZlbDogJ21lZGl1bScsICAgIHRleHQ6ICdNZWRpdW0nICAgIH07XG4gICAgICBpZiAoY29uZi5pbmNsdWRlcygndmVyeSBsb3cnKSkgIHJldHVybiB7IGxldmVsOiAndmVyeS1sb3cnLCAgdGV4dDogJ1ZlcnkgTG93JyAgfTtcbiAgICAgIGlmIChjb25mLmluY2x1ZGVzKCdsb3cnKSkgICAgICAgcmV0dXJuIHsgbGV2ZWw6ICdsb3cnLCAgICAgICB0ZXh0OiAnTG93JyAgICAgICB9O1xuICAgIH1cbiAgfVxuICBjb25zdCBpbXAgPSBhY2hJbXBvcnRhbmNlIHx8IDU7XG4gIGlmIChpbXAgPj0gOSkgcmV0dXJuIHsgbGV2ZWw6ICd2ZXJ5LWhpZ2gnLCB0ZXh0OiAnVmVyeSBIaWdoJyB9O1xuICBpZiAoaW1wID49IDcpIHJldHVybiB7IGxldmVsOiAnaGlnaCcsICAgICAgdGV4dDogJ0hpZ2gnICAgICAgfTtcbiAgaWYgKGltcCA+PSA1KSByZXR1cm4geyBsZXZlbDogJ21lZGl1bScsICAgIHRleHQ6ICdNZWRpdW0nICAgIH07XG4gIGlmIChpbXAgPj0gMykgcmV0dXJuIHsgbGV2ZWw6ICdsb3cnLCAgICAgICB0ZXh0OiAnTG93JyAgICAgICB9O1xuICByZXR1cm4geyBsZXZlbDogJ3ZlcnktbG93JywgdGV4dDogJ1ZlcnkgTG93JyB9O1xufVxuXG5mdW5jdGlvbiBnZXRBY2hpZXZlbWVudFJlYXNvbmluZyhhY2hJZCwgZGF0YSwgYWNoKSB7XG4gIGlmIChkYXRhLmFjaGlldmVtZW50X3JlY29tbWVuZGF0aW9ucyAmJiBBcnJheS5pc0FycmF5KGRhdGEuYWNoaWV2ZW1lbnRfcmVjb21tZW5kYXRpb25zKSkge1xuICAgIGNvbnN0IHJlYyA9IGRhdGEuYWNoaWV2ZW1lbnRfcmVjb21tZW5kYXRpb25zLmZpbmQociA9PiByLmlkID09PSBhY2hJZCk7XG4gICAgaWYgKHJlYyAmJiByZWMucmVhc29uaW5nKSByZXR1cm4gcmVjLnJlYXNvbmluZztcbiAgfVxuICBjb25zdCByZWxldmFudEZvciA9IChhY2gucmVsZXZhbnRfZm9yIHx8IFtdKS5qb2luKCcsICcpO1xuICBpZiAoZGF0YS5yZWNvbW1lbmRlZF9hY2hpZXZlbWVudHMgJiYgZGF0YS5yZWNvbW1lbmRlZF9hY2hpZXZlbWVudHMuaW5jbHVkZXMoYWNoSWQpKSB7XG4gICAgcmV0dXJuIHJlbGV2YW50Rm9yXG4gICAgICA/IGBSZWNvbW1lbmRlZCBmb3IgdGhpcyByb2xlLiBSZWxldmFudCBmb3I6ICR7cmVsZXZhbnRGb3J9LmBcbiAgICAgIDogJ1JlY29tbWVuZGVkIGJ5IEFJIGFzIHJlbGV2YW50IHRvIHRoaXMgcm9sZS4nO1xuICB9XG4gIHJldHVybiByZWxldmFudEZvclxuICAgID8gYFJlbGV2YW50IGZvcjogJHtyZWxldmFudEZvcn0uIE5vdCBzcGVjaWZpY2FsbHkgaGlnaGxpZ2h0ZWQgZm9yIHRoaXMgcm9sZS5gXG4gICAgOiAnTm90IHNwZWNpZmljYWxseSBoaWdobGlnaHRlZCBmb3IgdGhpcyByb2xlIGJhc2VkIG9uIGpvYiByZXF1aXJlbWVudHMuJztcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBGYWxsYmFjayBxdWVzdGlvbiBnZW5lcmF0aW9uXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gYnVpbGRGYWxsYmFja1Bvc3RBbmFseXNpc1F1ZXN0aW9ucyhkYXRhKSB7XG4gIGNvbnN0IHF1ZXN0aW9ucyA9IFtdO1xuXG4gIGlmIChkYXRhLnJvbGVfbGV2ZWwpIHtcbiAgICBxdWVzdGlvbnMucHVzaCh7XG4gICAgICBxdWVzdGlvbjogYFRoaXMgcm9sZSBhcHBlYXJzIHRvIGJlIGF0ICR7ZGF0YS5yb2xlX2xldmVsfSBsZXZlbC4gU2hvdWxkIEkgZW1waGFzaXplIHlvdXIgbW9zdCBzZW5pb3IgZXhwZXJpZW5jZXMgb3IgaW5jbHVkZSBhIGJyb2FkZXIgcmFuZ2UgdG8gc2hvdyBjYXJlZXIgcHJvZ3Jlc3Npb24/YCxcbiAgICAgIHR5cGU6ICdleHBlcmllbmNlX2xldmVsJyxcbiAgICAgIGNob2ljZXM6IFsnRW1waGFzaXplIG1vc3Qgc2VuaW9yJywgJ0Jyb2FkZXIgY2FyZWVyIHByb2dyZXNzaW9uJywgJ0xldCB5b3UgZGVjaWRlIGJhc2VkIG9uIGFuYWx5c2lzJ10sXG4gICAgfSk7XG4gIH1cblxuICBpZiAoZGF0YS5yZXF1aXJlZF9za2lsbHMgJiYgZGF0YS5yZXF1aXJlZF9za2lsbHMuc29tZShza2lsbCA9PlxuICAgICAgc2tpbGwudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnbGVhZGVyc2hpcCcpIHx8XG4gICAgICBza2lsbC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdtYW5hZ2VtZW50JykgfHxcbiAgICAgIHNraWxsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ3RlYW0nKSkpIHtcbiAgICBxdWVzdGlvbnMucHVzaCh7XG4gICAgICBxdWVzdGlvbjogJ1RoaXMgcm9sZSBoYXMgbGVhZGVyc2hpcCBjb21wb25lbnRzLiBXb3VsZCB5b3UgcHJlZmVyIG1lIHRvIGVtcGhhc2l6ZSB5b3VyIG1hbmFnZW1lbnQgZXhwZXJpZW5jZSBvciBmb2N1cyBtb3JlIG9uIHlvdXIgdGVjaG5pY2FsIGNvbnRyaWJ1dGlvbnM/JyxcbiAgICAgIHR5cGU6ICdsZWFkZXJzaGlwX2ZvY3VzJyxcbiAgICAgIGNob2ljZXM6IFsnRW1waGFzaXplIG1hbmFnZW1lbnQnLCAnRm9jdXMgb24gdGVjaG5pY2FsJywgJ0JhbGFuY2UgYm90aCBlcXVhbGx5J10sXG4gICAgfSk7XG4gIH1cblxuICBpZiAoZGF0YS5kb21haW4pIHtcbiAgICBxdWVzdGlvbnMucHVzaCh7XG4gICAgICBxdWVzdGlvbjogYFRoZSByb2xlIGlzIGluICR7ZGF0YS5kb21haW59LiBEbyB5b3UgaGF2ZSBwYXJ0aWN1bGFyIHByb2plY3RzIG9yIGFjaGlldmVtZW50cyBpbiB0aGlzIGRvbWFpbiB0aGF0IHlvdSdkIGxpa2UgbWUgdG8gaGlnaGxpZ2h0P2AsXG4gICAgICB0eXBlOiAnZG9tYWluX2V4cGVydGlzZScsXG4gICAgICBjaG9pY2VzOiBbJ0hpZ2hsaWdodCBkb21haW4tc3BlY2lmaWMgYWNoaWV2ZW1lbnRzJywgJ1VzZSBhbGwgYXZhaWxhYmxlIGV4cGVyaWVuY2UnLCAnUHJpb3JpdGl6ZSBtb3N0IHJlY2VudCB3b3JrJ10sXG4gICAgfSk7XG4gIH1cblxuICBpZiAoZGF0YS5jb21wYW55KSB7XG4gICAgcXVlc3Rpb25zLnB1c2goe1xuICAgICAgcXVlc3Rpb246IGBGb3IgJHtkYXRhLmNvbXBhbnl9LCB3b3VsZCB5b3UgbGlrZSBtZSB0byB0YWlsb3IgZW1waGFzaXMgdG93YXJkIHRoZWlyIGN1bHR1cmUgYW5kIHZhbHVlcz8gSWYgc28sIHdoYXQgc2hvdWxkIEkgcHJpb3JpdGl6ZT9gLFxuICAgICAgdHlwZTogJ2NvbXBhbnlfY3VsdHVyZScsXG4gICAgICBjaG9pY2VzOiBbJ1Jlc2VhcmNoLWRyaXZlbiAvIGFjYWRlbWljJywgJ0luZHVzdHJ5IC8gY29tbWVyY2lhbCBpbXBhY3QnLCAnSW5ub3ZhdGlvbiAvIHN0YXJ0dXAnLCAnVXNlIGN1bHR1cmFsIGluZGljYXRvcnMgZnJvbSBqb2IgZGVzY3JpcHRpb24nXSxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBxdWVzdGlvbnM7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFUyBtb2R1bGUgZXhwb3J0cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmV4cG9ydCB7XG4gIGdldEV4cGVyaWVuY2VSZWNvbW1lbmRhdGlvbiwgZ2V0Q29uZmlkZW5jZUxldmVsLCBnZXRFeHBlcmllbmNlUmVhc29uaW5nLFxuICBnZXRTa2lsbFJlY29tbWVuZGF0aW9uLCBnZXRTa2lsbENvbmZpZGVuY2UsIGdldFNraWxsUmVhc29uaW5nLFxuICBnZXRBY2hpZXZlbWVudFJlY29tbWVuZGF0aW9uLCBnZXRBY2hpZXZlbWVudENvbmZpZGVuY2UsIGdldEFjaGlldmVtZW50UmVhc29uaW5nLFxuICBidWlsZEZhbGxiYWNrUG9zdEFuYWx5c2lzUXVlc3Rpb25zLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL3VpLWhlbHBlcnMuanNcbiAqIExpZ2h0d2VpZ2h0IERPTSBoZWxwZXJzOiB0b2FzdHMsIGFsZXJ0L2NvbmZpcm0gbW9kYWxzLCBjaGF0IHRvZ2dsZSwgYW5kXG4gKiB3b3JrZmxvdy1zdGFnZSBhY3Rpb24tYnV0dG9uIG1hbmFnZW1lbnQuXG4gKlxuICogREVQRU5ERU5DSUVTOiB1aS1jb3JlLmpzIGV4cG9ydHMgKHRyYXBGb2N1cywgcmVzdG9yZUZvY3VzLCBzZXRJbml0aWFsRm9jdXMsXG4gKiAgICAgICAgICAgICAgIHB1c2hGb2N1c1N0YWNrKSBhdmFpbGFibGUgb24gZ2xvYmFsVGhpcyBhdCBydW50aW1lLlxuICovXG5cbmltcG9ydCB7IHN0YXRlTWFuYWdlciwgR0VORVJBVElPTl9TVEFURV9FVkVOVCB9IGZyb20gJy4vc3RhdGUtbWFuYWdlci5qcyc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQWxlcnQgbW9kYWwgKGluZm9ybWF0aW9uYWwgXHUyMDE0IHNpbmdsZSBPSyBidXR0b24pXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gX3NldE1vZGFsVGV4dChlbCwgbWVzc2FnZSkge1xuICBlbC50ZXh0Q29udGVudCA9ICcnO1xuICBjb25zdCBwYXJ0cyA9IFN0cmluZyhtZXNzYWdlIHx8ICcnKS5zcGxpdCgnXFxuJyk7XG4gIHBhcnRzLmZvckVhY2goKHBhcnQsIGkpID0+IHtcbiAgICBlbC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShwYXJ0KSk7XG4gICAgaWYgKGkgPCBwYXJ0cy5sZW5ndGggLSAxKSBlbC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdicicpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHNob3dBbGVydE1vZGFsKHRpdGxlLCBtZXNzYWdlKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhbGVydC1tb2RhbC10aXRsZScpLnRleHRDb250ZW50ID0gdGl0bGU7XG4gIF9zZXRNb2RhbFRleHQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FsZXJ0LW1vZGFsLW1lc3NhZ2UnKSwgbWVzc2FnZSk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhbGVydC1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gIC8vIHB1c2hGb2N1c1N0YWNrIChHQVAtMTk3KSBwYWlycyB3aXRoIHRyYXBGb2N1cy9yZXN0b3JlRm9jdXMgYmVsb3cgXHUyMDE0IHVzaW5nXG4gIC8vIHRoZSBzaGFyZWQgZm9jdXMtc3RhY2sgbWVjaGFuaXNtLCBub3QgYSBsb2NhbCB2YXJpYWJsZSwgc28gY2xvc2VBbGVydE1vZGFsXG4gIC8vIGFsc28gcG9wcyB0aGUga2V5ZG93biBsaXN0ZW5lciB0cmFwRm9jdXMgcmVnaXN0ZXJzIG9uIGRvY3VtZW50LiBBIHByaW9yXG4gIC8vIHZlcnNpb24gdHJhY2tlZCBpdHMgb3duIGBfYWxlcnRQcmV2aW91c0ZvY3VzYCBhbmQgbmV2ZXIgY2FsbGVkXG4gIC8vIHJlc3RvcmVGb2N1cygpLCB3aGljaCBsZWZ0IHRoYXQgdHJhcEZvY3VzIGxpc3RlbmVyIHBlcm1hbmVudGx5IGF0dGFjaGVkXG4gIC8vIGFmdGVyIGV2ZXJ5IGFsZXJ0IG1vZGFsIGNsb3NlLlxuICBpZiAodHlwZW9mIHB1c2hGb2N1c1N0YWNrID09PSAnZnVuY3Rpb24nKSBwdXNoRm9jdXNTdGFjayhkb2N1bWVudC5hY3RpdmVFbGVtZW50KTtcbiAgaWYgKHR5cGVvZiBzZXRJbml0aWFsRm9jdXMgPT09ICdmdW5jdGlvbicpIHNldEluaXRpYWxGb2N1cygnYWxlcnQtbW9kYWwtb3ZlcmxheScpO1xuICBpZiAodHlwZW9mIHRyYXBGb2N1cyA9PT0gJ2Z1bmN0aW9uJykgdHJhcEZvY3VzKCdhbGVydC1tb2RhbC1vdmVybGF5Jyk7XG59XG5cbmZ1bmN0aW9uIGNsb3NlQWxlcnRNb2RhbCgpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FsZXJ0LW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBpZiAodHlwZW9mIHJlc3RvcmVGb2N1cyA9PT0gJ2Z1bmN0aW9uJykgcmVzdG9yZUZvY3VzKCk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ29uZmlybSBtb2RhbCAocmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0cnVlL2ZhbHNlKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmxldCBfY29uZmlybVJlc29sdmUgPSBudWxsO1xubGV0IF9jb25maXJtUHJldmlvdXNGb2N1cyA9IG51bGw7XG5cbmZ1bmN0aW9uIHNob3dDb25maXJtTW9kYWwodGl0bGUsIG1lc3NhZ2UsIG9rTGFiZWwgPSAnT0snKSB7XG4gIF9jb25maXJtUHJldmlvdXNGb2N1cyA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb25maXJtLW1vZGFsLXRpdGxlJykudGV4dENvbnRlbnQgPSB0aXRsZTtcbiAgX3NldE1vZGFsVGV4dChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29uZmlybS1tb2RhbC1tZXNzYWdlJyksIG1lc3NhZ2UpO1xuICBjb25zdCBva0J0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb25maXJtLW1vZGFsLW9rJyk7XG4gIGlmIChva0J0bikgb2tCdG4udGV4dENvbnRlbnQgPSBva0xhYmVsO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29uZmlybS1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gIGlmIChva0J0bikgb2tCdG4uZm9jdXMoKTtcbiAgaWYgKHR5cGVvZiB0cmFwRm9jdXMgPT09ICdmdW5jdGlvbicpIHRyYXBGb2N1cygnY29uZmlybS1tb2RhbC1vdmVybGF5Jyk7XG4gIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHsgX2NvbmZpcm1SZXNvbHZlID0gcmVzb2x2ZTsgfSk7XG59XG5cbmZ1bmN0aW9uIGNsb3NlQ29uZmlybU1vZGFsKHJlc3VsdCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29uZmlybS1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgaWYgKHR5cGVvZiByZXN0b3JlRm9jdXMgPT09ICdmdW5jdGlvbicpIHJlc3RvcmVGb2N1cygpO1xuICBpZiAoX2NvbmZpcm1SZXNvbHZlKSB7IF9jb25maXJtUmVzb2x2ZShyZXN1bHQpOyBfY29uZmlybVJlc29sdmUgPSBudWxsOyB9XG4gIGlmIChfY29uZmlybVByZXZpb3VzRm9jdXMgJiYgdHlwZW9mIF9jb25maXJtUHJldmlvdXNGb2N1cy5mb2N1cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIF9jb25maXJtUHJldmlvdXNGb2N1cy5mb2N1cygpO1xuICB9XG4gIF9jb25maXJtUHJldmlvdXNGb2N1cyA9IG51bGw7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVG9hc3Qgbm90aWZpY2F0aW9uc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIHNob3dUb2FzdChtZXNzYWdlLCB0eXBlID0gJ3N1Y2Nlc3MnLCBkdXJhdGlvbiA9IDMwMDApIHtcbiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvYXN0LWNvbnRhaW5lcicpO1xuICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuO1xuICBjb25zdCB0b2FzdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICB0b2FzdC5jbGFzc05hbWUgPSBgdG9hc3QgdG9hc3QtJHt0eXBlfWA7XG4gIHRvYXN0LnRleHRDb250ZW50ID0gbWVzc2FnZTtcbiAgY29udGFpbmVyLmFwcGVuZENoaWxkKHRvYXN0KTtcbiAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHsgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHsgdG9hc3QuY2xhc3NMaXN0LmFkZCgndG9hc3Qtc2hvdycpOyB9KTsgfSk7XG4gIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIHRvYXN0LmNsYXNzTGlzdC5yZW1vdmUoJ3RvYXN0LXNob3cnKTtcbiAgICB0b2FzdC5hZGRFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgKCkgPT4gdG9hc3QucmVtb3ZlKCksIHsgb25jZTogdHJ1ZSB9KTtcbiAgfSwgZHVyYXRpb24pO1xufVxuXG5mdW5jdGlvbiByZWZyZXNoTGF5b3V0U3RhdHVzVUkoKSB7XG4gIGNvbnN0IGxheW91dENoaXAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGF5b3V0LWZyZXNobmVzcy1jaGlwJyk7XG4gIGNvbnN0IGxheW91dEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYXlvdXQtYnRuJyk7XG4gIGNvbnN0IGZyZXNobmVzcyA9IHN0YXRlTWFuYWdlci5nZXRMYXlvdXRGcmVzaG5lc3MoKTtcbiAgY29uc3QgZ2VuZXJhdGlvblN0YXRlID0gc3RhdGVNYW5hZ2VyLmdldEdlbmVyYXRpb25TdGF0ZSgpO1xuXG4gIGlmIChsYXlvdXRDaGlwKSB7XG4gICAgbGF5b3V0Q2hpcC5zdHlsZS5kaXNwbGF5ID0gZnJlc2huZXNzLnNob3dDaGlwID8gJycgOiAnbm9uZSc7XG4gICAgbGF5b3V0Q2hpcC5jbGFzc05hbWUgPSBgbGF5b3V0LWZyZXNobmVzcy1jaGlwICR7ZnJlc2huZXNzLnRvbmV9YDtcbiAgICBsYXlvdXRDaGlwLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIGZyZXNobmVzcy5hcmlhTGFiZWwgfHwgJycpO1xuICAgIGxheW91dENoaXAuaW5uZXJIVE1MID0gZnJlc2huZXNzLnNob3dDaGlwXG4gICAgICA/IGA8c3BhbiBjbGFzcz1cImxheW91dC1mcmVzaG5lc3MtaWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiR7ZnJlc2huZXNzLmlzQ3JpdGljYWwgPyAnXHUyMUJCJyA6IChmcmVzaG5lc3MuaXNTdGFsZSA/ICchJyA6ICdcdTI3MTMnKX08L3NwYW4+PHNwYW4gY2xhc3M9XCJsYXlvdXQtZnJlc2huZXNzLWxhYmVsXCI+JHtmcmVzaG5lc3MubGFiZWx9PC9zcGFuPmBcbiAgICAgIDogJyc7XG4gIH1cblxuICBpZiAobGF5b3V0QnRuKSB7XG4gICAgaWYgKGZyZXNobmVzcy5pc1N0YWxlKSB7XG4gICAgICBsYXlvdXRCdG4udGV4dENvbnRlbnQgPSAnXHUyMUJCIFJlZ2VuZXJhdGUgUHJldmlldyc7XG4gICAgICBsYXlvdXRCdG4udGl0bGUgPSAnUHJldmlldyBpcyBvdXQgb2YgZGF0ZSBcdTIwMTQgcmVnZW5lcmF0ZSBiZWZvcmUgY29uZmlybWluZyBsYXlvdXQnO1xuICAgIH0gZWxzZSBpZiAoZ2VuZXJhdGlvblN0YXRlLmxheW91dENvbmZpcm1lZCB8fCBnZW5lcmF0aW9uU3RhdGUucGhhc2UgPT09ICdjb25maXJtZWQnKSB7XG4gICAgICBsYXlvdXRCdG4udGV4dENvbnRlbnQgPSAnXHUyQjA3XHVGRTBGIEdlbmVyYXRlIEZpbmFsIEZpbGVzJztcbiAgICAgIGxheW91dEJ0bi50aXRsZSA9ICdMYXlvdXQgY29uZmlybWVkIFx1MjAxNCBwcm9kdWNlIGZpbmFsIHN1Ym1pc3Npb24tcmVhZHkgRE9DWCBhbmQgUERGIGZpbGVzJztcbiAgICB9IGVsc2Uge1xuICAgICAgbGF5b3V0QnRuLnRleHRDb250ZW50ID0gJ1x1MjcwNSBDb25maXJtIExheW91dCc7XG4gICAgICBsYXlvdXRCdG4udGl0bGUgPSAnU3RlcCAyIG9mIDM6IENvbmZpcm0gdGhlIGxheW91dCBsb29rcyByaWdodCBiZWZvcmUgZ2VuZXJhdGluZyBmaW5hbCBmaWxlcyc7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGhhbmRsZUxheW91dEZyZXNobmVzc0NoaXBDbGljaygpIHtcbiAgaWYgKHR5cGVvZiB1cGRhdGVUYWJCYXJGb3JTdGFnZSA9PT0gJ2Z1bmN0aW9uJykgdXBkYXRlVGFiQmFyRm9yU3RhZ2UoJ2xheW91dCcpO1xuICBpZiAodHlwZW9mIHVwZGF0ZUFjdGlvbkJ1dHRvbnMgPT09ICdmdW5jdGlvbicpIHVwZGF0ZUFjdGlvbkJ1dHRvbnMoJ2xheW91dCcpO1xuICBpZiAodHlwZW9mIHN3aXRjaFRhYiA9PT0gJ2Z1bmN0aW9uJykgc3dpdGNoVGFiKCdsYXlvdXQnKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBXb3JrZmxvdy1zdGFnZSBwcmltYXJ5IGFjdGlvbiBidXR0b25zXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIEFsbCBzdGFnZS1zcGVjaWZpYyBwcmltYXJ5IGFjdGlvbiBidXR0b24gSURzIChleGNsdWRlcyByZXNldCB3aGljaCBpcyBhbHdheXMgdmlzaWJsZSkuICovXG5jb25zdCBfU1RBR0VfQlVUVE9OUyA9IFtcbiAgJ2FuYWx5emUtYnRuJywgJ3JlY29tbWVuZC1idG4nLCAnZ2VuZXJhdGUtYnRuJyxcbiAgJ3Jld3JpdGUtYnRuJywgJ3NwZWxsLWJ0bicsICdnZW5lcmF0ZS1wcm9jZWVkLWJ0bicsXG4gICdsYXlvdXQtYnRuJywgJ2ZpbmFsLWdlbmVyYXRlLXByb2NlZWQtYnRuJywgJ2ZpbmFsaXNlLWFjdGlvbi1idG4nLFxuXTtcblxuLyoqIE1hcHMgZWFjaCB3b3JrZmxvdyBzdGFnZSB0byBpdHMgb25lIHByaW1hcnkgYWN0aW9uIGJ1dHRvbi4gKi9cbmNvbnN0IF9TVEFHRV9CVVRUT05fTUFQID0ge1xuICBqb2I6ICAgICAgICAgICAgJ2FuYWx5emUtYnRuJyxcbiAgYW5hbHlzaXM6ICAgICAgICdyZWNvbW1lbmQtYnRuJyxcbiAgY3VzdG9taXphdGlvbnM6ICdnZW5lcmF0ZS1idG4nLFxuICByZXdyaXRlOiAgICAgICAgJ3Jld3JpdGUtYnRuJyxcbiAgc3BlbGw6ICAgICAgICAgICdzcGVsbC1idG4nLFxuICBnZW5lcmF0ZTogICAgICAgJ2dlbmVyYXRlLXByb2NlZWQtYnRuJyxcbiAgbGF5b3V0OiAgICAgICAgICdsYXlvdXQtYnRuJyxcbiAgZmluYWxfZ2VuZXJhdGU6ICdmaW5hbC1nZW5lcmF0ZS1wcm9jZWVkLWJ0bicsXG4gIGZpbmFsaXNlOiAgICAgICAnZmluYWxpc2UtYWN0aW9uLWJ0bicsXG59O1xuXG4vKipcbiAqIFNob3cgb25seSB0aGUgcHJpbWFyeSBhY3Rpb24gYnV0dG9uIGZvciB0aGUgZ2l2ZW4gd29ya2Zsb3cgc3RhZ2UuXG4gKiBSZXNldCBpcyBhbHdheXMgdmlzaWJsZS4gIEFsbCBvdGhlciBzdGFnZSBidXR0b25zIGFyZSBoaWRkZW4uXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZUFjdGlvbkJ1dHRvbnMoc3RhZ2UpIHtcbiAgY29uc3QgYWN0aXZlSWQgPSBfU1RBR0VfQlVUVE9OX01BUFtzdGFnZV0gfHwgbnVsbDtcbiAgX1NUQUdFX0JVVFRPTlMuZm9yRWFjaChpZCA9PiB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgaWYgKGVsKSBlbC5zdHlsZS5kaXNwbGF5ID0gKGlkID09PSBhY3RpdmVJZCkgPyAnJyA6ICdub25lJztcbiAgfSk7XG4gIHJlZnJlc2hMYXlvdXRTdGF0dXNVSSgpO1xufVxuXG5pZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoR0VORVJBVElPTl9TVEFURV9FVkVOVCwgcmVmcmVzaExheW91dFN0YXR1c1VJKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEVTIG1vZHVsZSBleHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuZXhwb3J0IHtcbiAgc2hvd0FsZXJ0TW9kYWwsIGNsb3NlQWxlcnRNb2RhbCxcbiAgc2hvd0NvbmZpcm1Nb2RhbCwgY2xvc2VDb25maXJtTW9kYWwsXG4gIHNob3dUb2FzdCxcbiAgcmVmcmVzaExheW91dFN0YXR1c1VJLFxuICBoYW5kbGVMYXlvdXRGcmVzaG5lc3NDaGlwQ2xpY2ssXG4gIHVwZGF0ZUFjdGlvbkJ1dHRvbnMsXG59O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiBTaGFyZWQgcHJvcG9zYWwtcmV2aWV3IHJvdyByZW5kZXJlciwgZXh0cmFjdGVkIGZyb20gd2ViL2hhcnZlc3QuanMgc28gdGhlXG4gKiBHQVAtMDEgXCJVcGRhdGUgdmlhIEFJXCIgcGFuZWwgKHdlYi9tYXN0ZXItZGF0YS1haS11cGRhdGUuanMpIGRvZXNuJ3RcbiAqIGR1cGxpY2F0ZSBvciBmb3JrIHRoZSBzYW1lIGJlZm9yZS9hZnRlciBkaWZmLXJvdyBVSSBhIHRoaXJkIHRpbWUuXG4gKlxuICogUm93IG1hcmt1cCB1c2VzIGBkYXRhLXRvZ2dsZS1yZWFzb25pbmc9XCJJRFwiYCBhdHRyaWJ1dGVzIGluc3RlYWQgb2YgaW5saW5lXG4gKiBgb25jbGljaz1cIi4uLlwiYCBoYW5kbGVycyBcdTIwMTQgdGhlIGNhbGxlciBhdHRhY2hlcyBPTkUgZGVsZWdhdGVkIGNsaWNrXG4gKiBsaXN0ZW5lciAoYXR0YWNoUHJvcG9zYWxSb3dMaXN0ZW5lcnMpIHJhdGhlciB0aGFuIGVhY2ggcm93IHdpcmluZyBpdHMgb3duXG4gKiBpbmxpbmUgaGFuZGxlci4gVGhpcyBtYXR0ZXJzIGJlY2F1c2UgaGFydmVzdC5qcydzIG9yaWdpbmFsIGlubGluZS1vbmNsaWNrXG4gKiB2ZXJzaW9uIGNhbGxlZCBoYXJ2ZXN0LmpzLXNwZWNpZmljIGdsb2JhbCBmdW5jdGlvbnMgZGlyZWN0bHk7IGEgcm93XG4gKiByZW5kZXJlZCBieSBhIGRpZmZlcmVudCBtb2R1bGUgKG1hc3Rlci1kYXRhLWFpLXVwZGF0ZS5qcykgbXVzdCBub3RcbiAqIHNpbGVudGx5IHJlZmVyZW5jZSBmdW5jdGlvbnMgdGhhdCBkb24ndCBleGlzdCB0aGVyZS5cbiAqXG4gKiBgaWRQcmVmaXhgIGtlZXBzIGVhY2ggY2FsbGVyJ3MgZXhpc3RpbmcgRE9NLWlkIGNvbnZlbnRpb24gaW50YWN0IChlLmcuXG4gKiBoYXJ2ZXN0LmpzJ3MgYGhhcnZlc3Qtcm93LSpgL2BoYXJ2ZXN0LWNoay0qYCwgcmVmZXJlbmNlZCBlbHNld2hlcmUgaW4gdGhhdFxuICogZmlsZSwgbm90YWJseSBhcHBseUhhcnZlc3RTZWxlY3Rpb25zKSByYXRoZXIgdGhhbiBmb3JjaW5nIGEgcmVuYW1lLlxuICpcbiAqIFB1YmxpYyBleHBvcnRzOlxuICogICBlc2Moc3RyKVxuICogICByZW5kZXJQcm9wb3NhbFJvdyhpdGVtLCBvcHRzKVxuICogICBhdHRhY2hQcm9wb3NhbFJvd0xpc3RlbmVycyhjb250YWluZXJFbCwgaWRQcmVmaXgsIGhhbmRsZXJzKVxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBlc2Moc3RyKSB7XG4gIHJldHVybiBTdHJpbmcoc3RyID8/ICcnKVxuICAgIC5yZXBsYWNlKC8mL2csICcmYW1wOycpXG4gICAgLnJlcGxhY2UoLzwvZywgJyZsdDsnKVxuICAgIC5yZXBsYWNlKC8+L2csICcmZ3Q7JylcbiAgICAucmVwbGFjZSgvXCIvZywgJyZxdW90OycpO1xufVxuXG4vKipcbiAqIFJlbmRlciBvbmUgcHJvcG9zYWwtcmV2aWV3IHJvdyAoY2hlY2tib3ggKyBiZWZvcmUvYWZ0ZXIgKyBvcHRpb25hbFxuICogY29sbGFwc2libGUgZGV0YWlsICsgb3B0aW9uYWwgYmFkZ2VzL2ZsYWcgYmFubmVyKS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gaXRlbVxuICogQHBhcmFtIHtzdHJpbmd9IGl0ZW0uaWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBpdGVtLnR5cGVMYWJlbCAgICAgLSBzbWFsbCBjYXBzIGxhYmVsIGFib3ZlIHRoZSByb3cgKGUuZy4gc2VjdGlvbiBuYW1lKVxuICogQHBhcmFtIHtzdHJpbmd9IFtpdGVtLnNvdXJjZUJhZGdlSHRtbF1cbiAqIEBwYXJhbSB7c3RyaW5nfSBpdGVtLmxhYmVsICAgICAgICAgLSBzZWNvbmRhcnkgc3VtbWFyeSBsaW5lXG4gKiBAcGFyYW0ge3N0cmluZ30gW2l0ZW0ub3JpZ2luYWxdICAgIC0gXCJCZWZvcmVcIiBibG9jayB0ZXh0IChvbWl0IGZvciBhZGQtb25seSBwcm9wb3NhbHMpXG4gKiBAcGFyYW0ge3N0cmluZ30gW2l0ZW0ucHJvcG9zZWRdICAgIC0gXCJBZnRlclwiIGJsb2NrIHRleHQgKGFscmVhZHkgZGlzcGxheS1yZWFkeSwgbm90IGEgcmF3IG9iamVjdClcbiAqIEBwYXJhbSB7c3RyaW5nfSBbaXRlbS5kZXRhaWxUZXh0XSAgLSBjb2xsYXBzaWJsZSBkZXRhaWwgKGhhcnZlc3Q6IHJlYXNvbmluZzsgR0FQLTAxOiByYXRpb25hbGUpXG4gKiBAcGFyYW0ge3N0cmluZ30gW2l0ZW0uYmFkZ2VzSHRtbF0gIC0gcHJlLXJlbmRlcmVkIHJpZ2h0LXNpZGUgYmFkZ2UgSFRNTCAoY2FsbGVyLXNwZWNpZmljKVxuICogQHBhcmFtIHtzdHJpbmd9IFtpdGVtLmZsYWdIdG1sXSAgICAtIHByZS1yZW5kZXJlZCBhZHZpc29yeS93YXJuaW5nIGJhbm5lciAoZS5nLiBwb3NzaWJsZS1kdXBsaWNhdGUsIHN0YWxlKVxuICogQHBhcmFtIHtib29sZWFufSBbaXRlbS5jaGVja2VkXVxuICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLmlkUHJlZml4ICAgICAgICAgIC0gc2hhcmVkIHByZWZpeCBmb3Igcm93L3JlYXNvbi9jaGVja2JveCBpZHMsIGUuZy4gJ2hhcnZlc3QnIG9yICdtZHUnXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuY2hlY2tib3hEYXRhQXR0cl0gLSBrZWJhYi1jYXNlIGRhdGEtYXR0cmlidXRlIHN1ZmZpeCwgZS5nLiAnaGFydmVzdC1pZCcgb3IgJ21kdS1pZCdcbiAqICAgKE5PVCBjYW1lbENhc2UgXHUyMDE0IHRoaXMgaXMgaW50ZXJwb2xhdGVkIHZlcmJhdGltIGludG8gYGRhdGEtJHtjaGVja2JveERhdGFBdHRyfWAgaW4gdGhlIEhUTUwgc3RyaW5nO1xuICogICBhIGNhbWVsQ2FzZSB2YWx1ZSBsaWtlICdoYXJ2ZXN0SWQnIHByb2R1Y2VzIHRoZSBsaXRlcmFsIGF0dHJpYnV0ZSBgZGF0YS1oYXJ2ZXN0SWRgLCB3aGljaCB0aGUgSFRNTFxuICogICBwYXJzZXIgbG93ZXJjYXNlcyB0byBgZGF0YS1oYXJ2ZXN0aWRgIG9uIGluc2VydGlvbiwgc2lsZW50bHkgYnJlYWtpbmcgYC5kYXRhc2V0LmhhcnZlc3RJZGAgL1xuICogICBgW2RhdGEtaGFydmVzdC1pZF1gIGxvb2t1cHMgZWxzZXdoZXJlLiBUaGlzIGJpdCBtYXN0ZXItZGF0YS1haS11cGRhdGUuanMncyBvd24gZmlyc3QgZHJhZnQuKVxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmFyaWFMYWJlbFN1ZmZpeF0gIC0gYXBwZW5kZWQgdG8gdGhlIGNoZWNrYm94J3MgYXJpYS1sYWJlbCBhZnRlciBgbGFiZWxgIChlLmcuIGR1cGxpY2F0ZS9mbGFnIHRleHQpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJQcm9wb3NhbFJvdyhpdGVtLCBvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGlkUHJlZml4ID0gJ3Byb3Bvc2FsJyxcbiAgICBjaGVja2JveERhdGFBdHRyID0gJ3Byb3Bvc2FsLWlkJyxcbiAgICBhcmlhTGFiZWxTdWZmaXggPSAnJyxcbiAgfSA9IG9wdHM7XG5cbiAgY29uc3QgY2hlY2tlZCA9IGl0ZW0uY2hlY2tlZCA/ICcgY2hlY2tlZCcgOiAnJztcbiAgY29uc3Qgcm93SWQgPSBgJHtpZFByZWZpeH0tcm93LSR7ZXNjKGl0ZW0uaWQpfWA7XG4gIGNvbnN0IHJlYXNvbklkID0gYCR7aWRQcmVmaXh9LXJlYXNvbi0ke2VzYyhpdGVtLmlkKX1gO1xuICBjb25zdCBjaGVja2JveElkID0gYCR7aWRQcmVmaXh9LWNoay0ke2VzYyhpdGVtLmlkKX1gO1xuICBjb25zdCBhcmlhTGFiZWwgPSBlc2MoYCR7aXRlbS5sYWJlbCB8fCAnJ30ke2FyaWFMYWJlbFN1ZmZpeH1gKTtcblxuICBjb25zdCBoYXNEZXRhaWwgPSBCb29sZWFuKGl0ZW0uZGV0YWlsVGV4dCk7XG4gIGNvbnN0IGRldGFpbFRvZ2dsZSA9IGhhc0RldGFpbFxuICAgID8gYDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGRhdGEtdG9nZ2xlLXJlYXNvbmluZz1cIiR7ZXNjKGl0ZW0uaWQpfVwiIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiIGFyaWEtY29udHJvbHM9XCIke3JlYXNvbklkfVwiIHN0eWxlPVwiZm9udC1zaXplOjAuNzVlbTtiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOm5vbmU7Y29sb3I6dmFyKC0tY3YtZ3JheS01MDApO2N1cnNvcjpwb2ludGVyO3BhZGRpbmc6MCA0cHg7dmVydGljYWwtYWxpZ246bWlkZGxlO1wiIHRpdGxlPVwiVG9nZ2xlIGRldGFpbHNcIj5cdUQ4M0RcdURDQUM8L2J1dHRvbj5gXG4gICAgOiAnJztcbiAgY29uc3QgZGV0YWlsQmxvY2sgPSBoYXNEZXRhaWxcbiAgICA/IGA8ZGl2IGlkPVwiJHtyZWFzb25JZH1cIiBzdHlsZT1cImRpc3BsYXk6bm9uZTttYXJnaW4tdG9wOjZweDtwYWRkaW5nOjhweCAxMHB4O2JhY2tncm91bmQ6dmFyKC0tY3YtYmctbGlnaHQpO2JvcmRlci1sZWZ0OjNweCBzb2xpZCB2YXIoLS1jdi1zbGF0ZS00MDApO2JvcmRlci1yYWRpdXM6NHB4O2ZvbnQtc2l6ZTowLjgyZW07Y29sb3I6dmFyKC0tY3YtdGV4dC1tdXRlZCk7bGluZS1oZWlnaHQ6MS41O1wiPiR7ZXNjKGl0ZW0uZGV0YWlsVGV4dCl9PC9kaXY+YFxuICAgIDogJyc7XG5cbiAgcmV0dXJuIGBcbiAgICA8dHIgaWQ9XCIke3Jvd0lkfVwiIHN0eWxlPVwiYm9yZGVyLWJvdHRvbToxcHggc29saWQgdmFyKC0tY3YtYmctc3VidGxlKTtcIj5cbiAgICAgIDx0ZCBzdHlsZT1cInBhZGRpbmc6MTBweCAxMnB4O3dpZHRoOjM2cHg7dmVydGljYWwtYWxpZ246dG9wO1wiPlxuICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCIke2NoZWNrYm94SWR9XCIgZGF0YS0ke2NoZWNrYm94RGF0YUF0dHJ9PVwiJHtlc2MoaXRlbS5pZCl9XCIke2NoZWNrZWR9XG4gICAgICAgICAgYXJpYS1sYWJlbD1cIiR7YXJpYUxhYmVsfVwiXG4gICAgICAgICAgc3R5bGU9XCJ3aWR0aDoxNnB4O2hlaWdodDoxNnB4O2N1cnNvcjpwb2ludGVyO21hcmdpbi10b3A6MnB4O1wiPlxuICAgICAgPC90ZD5cbiAgICAgIDx0ZCBzdHlsZT1cInBhZGRpbmc6MTBweCAxMnB4O1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmZsZXgtc3RhcnQ7Z2FwOjhweDtmbGV4LXdyYXA6d3JhcDtcIj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDoxO21pbi13aWR0aDoyMDBweDtcIj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC43OGVtO2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjp2YXIoLS1jdi10ZXh0LXNlY29uZGFyeSk7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO2xldHRlci1zcGFjaW5nOjAuMDRlbTttYXJnaW4tYm90dG9tOjRweDtcIj5cbiAgICAgICAgICAgICAgJHtlc2MoaXRlbS50eXBlTGFiZWwgfHwgJycpfSR7aXRlbS5zb3VyY2VCYWRnZUh0bWwgfHwgJyd9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC44N2VtO2NvbG9yOnZhcigtLWN2LXNsYXRlLTQwMCk7bWFyZ2luLWJvdHRvbTo2cHg7XCI+JHtlc2MoaXRlbS5sYWJlbCB8fCAnJyl9PC9kaXY+XG4gICAgICAgICAgICAke2l0ZW0uZmxhZ0h0bWwgfHwgJyd9XG4gICAgICAgICAgICAke2l0ZW0ub3JpZ2luYWwgPyBgXG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTo2cHg7XCI+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC43MmVtO2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjp2YXIoLS1jdi1ncmF5LTUwMCk7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO2xldHRlci1zcGFjaW5nOjAuMDNlbTttYXJnaW4tYm90dG9tOjJweDtcIj5CZWZvcmU8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07Y29sb3I6dmFyKC0tY3YtZ3JheS01MDApO2JhY2tncm91bmQ6dmFyKC0tY3YtYmctbGlnaHQpO2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6NnB4IDhweDtib3JkZXItbGVmdDozcHggc29saWQgdmFyKC0tY3YtZ3JheS0zMDApO2xpbmUtaGVpZ2h0OjEuNTtcIj4ke2VzYyhpdGVtLm9yaWdpbmFsKX08L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PmAgOiAnJ31cbiAgICAgICAgICAgICR7aXRlbS5wcm9wb3NlZCA/IGBcbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjRweDtcIj5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjcyZW07Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOnZhcigtLWN2LWdyYXktNTAwKTt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7bGV0dGVyLXNwYWNpbmc6MC4wM2VtO21hcmdpbi1ib3R0b206MnB4O1wiPkFmdGVyPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2NvbG9yOnZhcigtLWN2LXRleHQtcHJpbWFyeSk7YmFja2dyb3VuZDp2YXIoLS1jdi1zdWNjZXNzLWJnKTtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjZweCA4cHg7Ym9yZGVyLWxlZnQ6M3B4IHNvbGlkIHZhcigtLWN2LXN1Y2Nlc3MtYm9yZGVyKTtsaW5lLWhlaWdodDoxLjU7XCI+JHtlc2MoaXRlbS5wcm9wb3NlZCl9PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5gIDogJyd9XG4gICAgICAgICAgICAke2RldGFpbEJsb2NrfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2dhcDo0cHg7YWxpZ24taXRlbXM6ZmxleC1lbmQ7ZmxleC1zaHJpbms6MDtcIj5cbiAgICAgICAgICAgICR7aXRlbS5iYWRnZXNIdG1sIHx8ICcnfVxuICAgICAgICAgICAgJHtkZXRhaWxUb2dnbGV9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC90ZD5cbiAgICA8L3RyPmA7XG59XG5cbi8qKlxuICogQXR0YWNoIG9uZSBkZWxlZ2F0ZWQgY2xpY2sgbGlzdGVuZXIgdG8gYGNvbnRhaW5lckVsYCBjb3ZlcmluZyBldmVyeVxuICogYFtkYXRhLXRvZ2dsZS1yZWFzb25pbmddYCBlbGVtZW50IHJlbmRlcmVkIGJ5IHJlbmRlclByb3Bvc2FsUm93IHdpdGggdGhlXG4gKiBtYXRjaGluZyBgaWRQcmVmaXhgLiBHdWFyZHMgYWdhaW5zdCBkb3VibGUtYXR0YWNoaW5nIGFjcm9zcyByZXBlYXRlZFxuICogY2FsbHMgKGUuZy4gYSB0YWIgYmVpbmcgcmUtcG9wdWxhdGVkKSB2aWEgYSBtYXJrZXIgb24gYGNvbnRhaW5lckVsYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF0dGFjaFByb3Bvc2FsUm93TGlzdGVuZXJzKGNvbnRhaW5lckVsLCBpZFByZWZpeCwgaGFuZGxlcnMgPSB7fSkge1xuICBpZiAoIWNvbnRhaW5lckVsKSByZXR1cm47XG4gIGNvbnN0IGd1YXJkS2V5ID0gYHByb3Bvc2FsTGlzdGVuZXJzQXR0YWNoZWRfJHtpZFByZWZpeH1gO1xuICBpZiAoY29udGFpbmVyRWwuZGF0YXNldFtndWFyZEtleV0pIHJldHVybjtcbiAgY29udGFpbmVyRWwuZGF0YXNldFtndWFyZEtleV0gPSAnMSc7XG5cbiAgY29udGFpbmVyRWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQpID0+IHtcbiAgICBjb25zdCB0b2dnbGUgPSBldmVudC50YXJnZXQuY2xvc2VzdCgnW2RhdGEtdG9nZ2xlLXJlYXNvbmluZ10nKTtcbiAgICBpZiAoIXRvZ2dsZSkgcmV0dXJuO1xuICAgIGNvbnN0IGlkID0gdG9nZ2xlLmRhdGFzZXQudG9nZ2xlUmVhc29uaW5nO1xuICAgIGNvbnN0IHJlYXNvbkVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7aWRQcmVmaXh9LXJlYXNvbi0ke2lkfWApO1xuICAgIGlmIChyZWFzb25FbCkge1xuICAgICAgY29uc3Qgbm93VmlzaWJsZSA9IHJlYXNvbkVsLnN0eWxlLmRpc3BsYXkgPT09ICdub25lJztcbiAgICAgIHJlYXNvbkVsLnN0eWxlLmRpc3BsYXkgPSBub3dWaXNpYmxlID8gJ2Jsb2NrJyA6ICdub25lJztcbiAgICAgIHRvZ2dsZS5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCBTdHJpbmcobm93VmlzaWJsZSkpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGhhbmRsZXJzLm9uVG9nZ2xlUmVhc29uaW5nID09PSAnZnVuY3Rpb24nKSBoYW5kbGVycy5vblRvZ2dsZVJlYXNvbmluZyhpZCk7XG4gIH0pO1xufVxuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvbGxtLWxvZy5qc1xuICogRmV0Y2hlcyByYXcgTExNIGludGVyYWN0aW9uIGxvZyBlbnRyaWVzIGZyb20gL2FwaS9sbG0tbG9nIGFuZCBkaXNwbGF5c1xuICogdGhlbSBpbiB0aGUgQ29udmVyc2F0aW9uIHBhbmVsIGFzIGNvbGxhcHNpYmxlIHRyYW5zY3JpcHQgZW50cmllcy5cbiAqXG4gKiBFYWNoIExMTSBjYWxsIHNob3dzOlxuICogICAtIEhlYWRlcjogdGltZXN0YW1wIGFuZCBtZXNzYWdlLWNvdW50IHN1bW1hcnlcbiAqICAgLSBQcm9tcHQgc2VjdGlvbjogYWxsIG1lc3NhZ2VzIHNlbnQgKHJvbGUtcHJlZml4ZWQpLCBjb2xsYXBzaWJsZSB3aGVuIGxvbmdcbiAqICAgLSBSZXNwb25zZSBzZWN0aW9uOiByYXcgTExNIHJlc3BvbnNlLCBjb2xsYXBzaWJsZSB3aGVuIGxvbmdcbiAqXG4gKiBERVBFTkRFTkNJRVMgKGdsb2JhbFRoaXMpOlxuICogICAtIGFwcGVuZE1lc3NhZ2VIdG1sICAobWVzc2FnZS1xdWV1ZS5qcylcbiAqICAgLSBnZXRTZXNzaW9uSWRGcm9tVVJMIChhcGktY2xpZW50LmpzKVxuICovXG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IGVzY2FwZUh0bWwgfSBmcm9tICcuL3V0aWxzLmpzJztcbmltcG9ydCB7IGdldFNlc3Npb25JZEZyb21VUkwgfSBmcm9tICcuL2FwaS1jbGllbnQuanMnO1xuXG5jb25zdCBsb2cgPSBnZXRMb2dnZXIoJ2xsbS1sb2cnKTtcblxuLy8gQ3Vyc29yIHRyYWNrcyB0aGUgbmV4dCBpbmRleCB0byBmZXRjaCBmcm9tIC9hcGkvbGxtLWxvZy5cbi8vIEluY3JlbWVudCBhZnRlciBlYWNoIHN1Y2Nlc3NmdWwgZmV0Y2ggYnkgYHRvdGFsYCByZXR1cm5lZCBmcm9tIHRoZSBzZXJ2ZXIuXG5sZXQgX2xsbUxvZ0N1cnNvciA9IDA7XG5cbi8qKiBSZXNldCB0aGUgY3Vyc29yIHRvIDAgKGNhbGwgd2hlbiBhIG5ldyBzZXNzaW9uIGlzIGxvYWRlZCkuICovXG5mdW5jdGlvbiByZXNldExsbUxvZ0N1cnNvcigpIHtcbiAgX2xsbUxvZ0N1cnNvciA9IDA7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ29sbGFwc2libGUgSFRNTCBidWlsZGVyIChtaXJyb3JzIF9tYWtlQ29sbGFwc2libGVDb250ZW50IGluIG1lc3NhZ2UtcXVldWUuanMpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY29uc3QgX0xPR19DT0xMQVBTRV9MSU5FUyA9IDg7XG5jb25zdCBfTE9HX0NPTExBUFNFX0NIQVJTID0gNDgwO1xuXG4vKipcbiAqIFdyYXAgYHRleHRgIGluIGEgY29sbGFwc2libGUgPHByZT4gYmxvY2sgd2hlbiBpdCBleGNlZWRzIHRoZSB0aHJlc2hvbGQuXG4gKiBSZXR1cm5zIGFuIEhUTUwgc3RyaW5nIHJlYWR5IGZvciBpbnNlcnRpb24gdmlhIGlubmVySFRNTC5cbiAqL1xuZnVuY3Rpb24gX2NvbGxhcHNpYmxlUHJlKHRleHQpIHtcbiAgY29uc3QgZXNjYXBlZCA9IGVzY2FwZUh0bWwodGV4dCk7XG4gIGNvbnN0IGxpbmVzICAgPSB0ZXh0LnNwbGl0KCdcXG4nKTtcblxuICBpZiAobGluZXMubGVuZ3RoIDw9IF9MT0dfQ09MTEFQU0VfTElORVMgJiYgdGV4dC5sZW5ndGggPD0gX0xPR19DT0xMQVBTRV9DSEFSUykge1xuICAgIHJldHVybiBgPHByZSBjbGFzcz1cImxsbS1sb2ctdGV4dFwiPiR7ZXNjYXBlZH08L3ByZT5gO1xuICB9XG5cbiAgY29uc3QgcHJldmlld1RleHQgPSBsaW5lcy5zbGljZSgwLCBfTE9HX0NPTExBUFNFX0xJTkVTKS5qb2luKCdcXG4nKTtcbiAgY29uc3Qgb3ZlcmZsb3cgICAgPSBsaW5lcy5sZW5ndGggLSBfTE9HX0NPTExBUFNFX0xJTkVTO1xuICBjb25zdCBpZCAgICAgICAgICA9IGBsbG1sb2ctJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDcpfWA7XG4gIGNvbnN0IGxhYmVsICAgICAgID0gYFNob3cgJHtvdmVyZmxvd30gbW9yZSBsaW5lJHtvdmVyZmxvdyA9PT0gMSA/ICcnIDogJ3MnfVx1MjAyNmA7XG5cbiAgcmV0dXJuIGBcbiAgICA8cHJlIGNsYXNzPVwibGxtLWxvZy10ZXh0IG1zZy1wcmV2aWV3XCIgaWQ9XCIke2lkfS1wcmV2aWV3XCI+JHtlc2NhcGVIdG1sKHByZXZpZXdUZXh0KX1cdTIwMjY8L3ByZT5cbiAgICA8cHJlIGNsYXNzPVwibGxtLWxvZy10ZXh0IG1zZy1mdWxsXCIgICAgaWQ9XCIke2lkfS1mdWxsXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmVcIj4ke2VzY2FwZWR9PC9wcmU+XG4gICAgPGJ1dHRvbiBjbGFzcz1cIm1zZy10b2dnbGUtYnRuXCIgdHlwZT1cImJ1dHRvblwiXG4gICAgICBvbmNsaWNrPVwiKGZ1bmN0aW9uKGJ0bil7XG4gICAgICAgIHZhciBwPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCcke2lkfS1wcmV2aWV3JyksXG4gICAgICAgICAgICBmPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCcke2lkfS1mdWxsJyk7XG4gICAgICAgIGlmKGYuc3R5bGUuZGlzcGxheT09PSdub25lJyl7XG4gICAgICAgICAgcC5zdHlsZS5kaXNwbGF5PSdub25lJzsgZi5zdHlsZS5kaXNwbGF5PSdibG9jayc7IGJ0bi50ZXh0Q29udGVudD0nU2hvdyBsZXNzJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwLnN0eWxlLmRpc3BsYXk9Jyc7IGYuc3R5bGUuZGlzcGxheT0nbm9uZSc7IGJ0bi50ZXh0Q29udGVudD0nJHtsYWJlbH0nO1xuICAgICAgICB9XG4gICAgICB9KSh0aGlzKVwiPiR7bGFiZWx9PC9idXR0b24+YDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBSZW5kZXIgb25lIGludGVyYWN0aW9uIGludG8gdGhlIGNvbnZlcnNhdGlvbiBwYW5lbFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIF9yZW5kZXJJbnRlcmFjdGlvbihpeCkge1xuICBjb25zdCBjb252ZXJzYXRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udmVyc2F0aW9uJyk7XG4gIGlmICghY29udmVyc2F0aW9uKSByZXR1cm47XG5cbiAgY29uc3QgdHMgPSBpeC50aW1lc3RhbXBcbiAgICA/IG5ldyBEYXRlKGl4LnRpbWVzdGFtcCkudG9Mb2NhbGVUaW1lU3RyaW5nKFtdLCB7IGhvdXI6ICcyLWRpZ2l0JywgbWludXRlOiAnMi1kaWdpdCcsIHNlY29uZDogJzItZGlnaXQnIH0pXG4gICAgOiAnJztcblxuICBjb25zdCBtc2dzICAgICA9IEFycmF5LmlzQXJyYXkoaXgubWVzc2FnZXMpID8gaXgubWVzc2FnZXMgOiBbXTtcbiAgY29uc3QgbXNnQ291bnQgPSBtc2dzLmxlbmd0aDtcblxuICAvLyBCdWlsZCBmb3JtYXR0ZWQgcHJvbXB0IHRleHQ6IGVhY2ggbWVzc2FnZSBvbiBpdHMgb3duIGxhYmVsbGVkIGJsb2NrXG4gIGNvbnN0IHByb21wdFRleHQgPSBtc2dzXG4gICAgLm1hcChtID0+IGBbJHsobS5yb2xlIHx8ICd1bmtub3duJykudG9VcHBlckNhc2UoKX1dXFxuJHttLmNvbnRlbnQgfHwgJyd9YClcbiAgICAuam9pbignXFxuXFxuXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXFxuXFxuJyk7XG5cbiAgY29uc3QgcmVzcG9uc2VUZXh0ID0gdHlwZW9mIGl4LnJlc3BvbnNlID09PSAnc3RyaW5nJyA/IGl4LnJlc3BvbnNlIDogJyc7XG5cbiAgY29uc3QgaHRtbCA9IGBcbiAgICA8ZGl2IGNsYXNzPVwibGxtLWxvZy1oZWFkZXJcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwibGxtLWxvZy1pY29uXCI+XHVEODNFXHVERDE2PC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJsbG0tbG9nLWxhYmVsXCI+TExNIEludGVyYWN0aW9uPC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJsbG0tbG9nLW1ldGFcIj4ke21zZ0NvdW50fSBtZXNzYWdlJHttc2dDb3VudCA9PT0gMSA/ICcnIDogJ3MnfTwvc3Bhbj5cbiAgICAgICR7dHMgPyBgPHNwYW4gY2xhc3M9XCJsbG0tbG9nLXRzXCI+JHtlc2NhcGVIdG1sKHRzKX08L3NwYW4+YCA6ICcnfVxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJsbG0tbG9nLXNlY3Rpb25cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJsbG0tbG9nLXNlY3Rpb24tbGFiZWxcIj5Qcm9tcHQ8L2Rpdj5cbiAgICAgICR7X2NvbGxhcHNpYmxlUHJlKHByb21wdFRleHQpfVxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJsbG0tbG9nLXNlY3Rpb25cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJsbG0tbG9nLXNlY3Rpb24tbGFiZWxcIj5SZXNwb25zZTwvZGl2PlxuICAgICAgJHtfY29sbGFwc2libGVQcmUocmVzcG9uc2VUZXh0KX1cbiAgICA8L2Rpdj5gO1xuXG4gIGNvbnN0IG1lc3NhZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgbWVzc2FnZS5jbGFzc05hbWUgPSAnbWVzc2FnZSBsbG0tcmF3JztcbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBjb250ZW50LmNsYXNzTmFtZSA9ICdjb250ZW50JztcbiAgY29udGVudC5pbm5lckhUTUwgPSBodG1sO1xuICBtZXNzYWdlLmFwcGVuZENoaWxkKGNvbnRlbnQpO1xuICBjb252ZXJzYXRpb24uYXBwZW5kQ2hpbGQobWVzc2FnZSk7XG4gIGNvbnZlcnNhdGlvbi5zY3JvbGxUb3AgPSBjb252ZXJzYXRpb24uc2Nyb2xsSGVpZ2h0O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFB1YmxpYyBBUElcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIEZldGNoIExMTSBpbnRlcmFjdGlvbiBsb2cgZW50cmllcyBhZGRlZCBzaW5jZSB0aGUgbGFzdCBjYWxsIGFuZCBkaXNwbGF5XG4gKiBlYWNoIG9uZSBpbiB0aGUgQ29udmVyc2F0aW9uIHBhbmVsLiAgU2FmZSB0byBjYWxsIGFmdGVyIGV2ZXJ5IGJhY2tlbmRcbiAqIG9wZXJhdGlvbiB0aGF0IG1heSB0cmlnZ2VyIExMTSBjYWxscy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZmV0Y2hBbmREaXNwbGF5TGxtTG9nKCkge1xuICBjb25zdCBzZXNzaW9uSWQgPSBnZXRTZXNzaW9uSWRGcm9tVVJMKCk7XG4gIGlmICghc2Vzc2lvbklkKSByZXR1cm47XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChcbiAgICAgIGAvYXBpL2xsbS1sb2c/c2Vzc2lvbl9pZD0ke2VuY29kZVVSSUNvbXBvbmVudChzZXNzaW9uSWQpfSZzaW5jZT0ke19sbG1Mb2dDdXJzb3J9YCxcbiAgICApO1xuICAgIGlmICghcmVzLm9rKSB7XG4gICAgICBsb2cud2FybignbGxtLWxvZyBmZXRjaCBmYWlsZWQnLCByZXMuc3RhdHVzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZGF0YSAgICAgICAgID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBjb25zdCBpbnRlcmFjdGlvbnMgPSBBcnJheS5pc0FycmF5KGRhdGEuaW50ZXJhY3Rpb25zKSA/IGRhdGEuaW50ZXJhY3Rpb25zIDogW107XG5cbiAgICBmb3IgKGNvbnN0IGl4IG9mIGludGVyYWN0aW9ucykge1xuICAgICAgX3JlbmRlckludGVyYWN0aW9uKGl4KTtcbiAgICB9XG5cbiAgICAvLyBBZHZhbmNlIGN1cnNvciB0byB0aGUgbmV3IHRvdGFsIHNvIHRoZSBuZXh0IGNhbGwgZmV0Y2hlcyBvbmx5IG5ldyBlbnRyaWVzLlxuICAgIGlmICh0eXBlb2YgZGF0YS50b3RhbCA9PT0gJ251bWJlcicpIHtcbiAgICAgIF9sbG1Mb2dDdXJzb3IgPSBkYXRhLnRvdGFsO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLmVycm9yKCdmZXRjaEFuZERpc3BsYXlMbG1Mb2cgZXJyb3I6JywgZXJyKTtcbiAgfVxufVxuXG5leHBvcnQgeyBmZXRjaEFuZERpc3BsYXlMbG1Mb2csIHJlc2V0TGxtTG9nQ3Vyc29yIH07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9hdXRoLXByb3ZpZGVyLmpzXG4gKiBDb3BpbG90IC8gR2l0SHViIE9BdXRoIGF1dGggZmxvdywgYmFkZ2UgdXBkYXRlcywgYW5kIHByb3ZpZGVyIGxhYmVsIGZvcm1hdHRpbmcuXG4gKlxuICogREVQRU5ERU5DSUVTOlxuICogICAtIGNvbmZpcm1EaWFsb2cgZnJvbSB1aS1jb3JlLmpzIChvbiBnbG9iYWxUaGlzKVxuICogICAtIHNldEluaXRpYWxGb2N1cywgdHJhcEZvY3VzLCByZXN0b3JlRm9jdXMgZnJvbSB1aS1jb3JlLmpzIChvbiBnbG9iYWxUaGlzKVxuICogICAtIHVwZGF0ZUF1dGhCYWRnZSAoc2VsZi1yZWZlcmVuY2U7IGV4cG9ydGVkIHRvIGdsb2JhbFRoaXMpXG4gKiAgIC0gZ2V0UHJvdmlkZXJJbmZvIGZyb20gcHJvdmlkZXItaW5mby5qcyAoaW1wb3J0ZWQgZGlyZWN0bHkpXG4gKi9cblxuaW1wb3J0IHsgZ2V0UHJvdmlkZXJJbmZvIH0gZnJvbSAnLi9wcm92aWRlci1pbmZvLmpzJztcblxubGV0IF9hdXRoUG9sbFRpbWVyID0gbnVsbDtcblxuZnVuY3Rpb24gZm9ybWF0UHJvdmlkZXJMYWJlbChwcm92aWRlcikge1xuICBpZiAoIXByb3ZpZGVyIHx8IHR5cGVvZiBwcm92aWRlciAhPT0gJ3N0cmluZycpIHJldHVybiAnUHJvdmlkZXInO1xuICBjb25zdCBhbGlhc2VzID0ge1xuICAgIG9wZW5haTogJ09wZW5BSScsXG4gICAgJ2NvcGlsb3Qtb2F1dGgnOiAnQ29waWxvdCBPQXV0aCAoZGVwcmVjYXRlZCknLFxuICAgIGNvcGlsb3Q6ICdDb3BpbG90IChkZXByZWNhdGVkKScsXG4gICAgZ2l0aHViOiAnR2l0SHViIE1vZGVscyAoZGVwcmVjYXRlZCknLFxuICAgICdjb3BpbG90LXNkayc6ICdDb3BpbG90IFNESyAocmVjb21tZW5kZWQpJyxcbiAgfTtcbiAgaWYgKGFsaWFzZXNbcHJvdmlkZXJdKSByZXR1cm4gYWxpYXNlc1twcm92aWRlcl07XG4gIHJldHVybiBwcm92aWRlclxuICAgIC5zcGxpdCgvWy1fXFxzXSsvKVxuICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAubWFwKHBhcnQgPT4gcGFydC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHBhcnQuc2xpY2UoMSkudG9Mb3dlckNhc2UoKSlcbiAgICAuam9pbignICcpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVBdXRoQmFkZ2UoYXV0aFN0YXR1cywgcHJvdmlkZXIgPSBudWxsKSB7XG4gIGNvbnN0IGxlZ2FjeUJhZGdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvcGlsb3QtYXV0aC1iYWRnZScpO1xuICBjb25zdCBsZWdhY3lJY29uICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdXRoLWJhZGdlLWljb24nKTtcbiAgY29uc3QgbGVnYWN5TGFiZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXV0aC1iYWRnZS1sYWJlbCcpO1xuXG4gIGNvbnN0IHBpbGwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtLXN0YXR1cy1waWxsJyk7XG4gIGNvbnN0IHBpbGxJY29uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbS1zdGF0dXMtaWNvbicpO1xuICBjb25zdCBwaWxsTGFiZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtLXN0YXR1cy1sYWJlbCcpO1xuXG4gIGNvbnN0IGFwcGx5U3RhdGUgPSAoa2luZCwgdGV4dCwgaWNvblRleHQpID0+IHtcbiAgICBpZiAobGVnYWN5QmFkZ2UgJiYgbGVnYWN5SWNvbiAmJiBsZWdhY3lMYWJlbCkge1xuICAgICAgbGVnYWN5QmFkZ2UuY2xhc3NMaXN0LnJlbW92ZSgnYXV0aGVudGljYXRlZCcsICd1bmF1dGhlbnRpY2F0ZWQnLCAncG9sbGluZycpO1xuICAgICAgbGVnYWN5QmFkZ2UuY2xhc3NMaXN0LmFkZChraW5kKTtcbiAgICAgIGlmIChraW5kID09PSAnY29ubmVjdGVkJyB8fCBraW5kID09PSAnY29uZmlndXJlZCcpIGxlZ2FjeUJhZGdlLmNsYXNzTGlzdC5hZGQoJ2F1dGhlbnRpY2F0ZWQnKTtcbiAgICAgIGlmIChraW5kID09PSAnY29ubmVjdGluZycpIGxlZ2FjeUJhZGdlLmNsYXNzTGlzdC5hZGQoJ3BvbGxpbmcnKTtcbiAgICAgIGlmIChraW5kID09PSAndW5jb25maWd1cmVkJyB8fCBraW5kID09PSAnYXV0aC1yZXF1aXJlZCcgfHwga2luZCA9PT0gJ3JhdGUtbGltaXRlZCcgfHwga2luZCA9PT0gJ3VuYXZhaWxhYmxlJyB8fCBraW5kID09PSAnZXJyb3InKSBsZWdhY3lCYWRnZS5jbGFzc0xpc3QuYWRkKCd1bmF1dGhlbnRpY2F0ZWQnKTtcbiAgICAgIGxlZ2FjeUljb24udGV4dENvbnRlbnQgPSBpY29uVGV4dDtcbiAgICAgIGxlZ2FjeUxhYmVsLnRleHRDb250ZW50ID0gdGV4dDtcbiAgICB9XG4gICAgaWYgKHBpbGwgJiYgcGlsbEljb24gJiYgcGlsbExhYmVsKSB7XG4gICAgICBwaWxsLmNsYXNzTGlzdC5yZW1vdmUoJ2F1dGhlbnRpY2F0ZWQnLCAndW5hdXRoZW50aWNhdGVkJywgJ3BvbGxpbmcnLCAndW5jb25maWd1cmVkJywgJ2NvbmZpZ3VyZWQnLCAnY29ubmVjdGluZycsICdjb25uZWN0ZWQnLCAnYXV0aC1yZXF1aXJlZCcsICdyYXRlLWxpbWl0ZWQnLCAndW5hdmFpbGFibGUnLCAnZXJyb3InKTtcbiAgICAgIHBpbGwuY2xhc3NMaXN0LmFkZChraW5kKTtcbiAgICAgIGlmIChraW5kID09PSAnY29ubmVjdGVkJyB8fCBraW5kID09PSAnY29uZmlndXJlZCcpIHBpbGwuY2xhc3NMaXN0LmFkZCgnYXV0aGVudGljYXRlZCcpO1xuICAgICAgaWYgKGtpbmQgPT09ICdjb25uZWN0aW5nJykgcGlsbC5jbGFzc0xpc3QuYWRkKCdwb2xsaW5nJyk7XG4gICAgICBpZiAoa2luZCA9PT0gJ3VuY29uZmlndXJlZCcgfHwga2luZCA9PT0gJ2F1dGgtcmVxdWlyZWQnIHx8IGtpbmQgPT09ICdyYXRlLWxpbWl0ZWQnIHx8IGtpbmQgPT09ICd1bmF2YWlsYWJsZScgfHwga2luZCA9PT0gJ2Vycm9yJykgcGlsbC5jbGFzc0xpc3QuYWRkKCd1bmF1dGhlbnRpY2F0ZWQnKTtcbiAgICAgIHBpbGxJY29uLnRleHRDb250ZW50ID0gaWNvblRleHQ7XG4gICAgICBwaWxsTGFiZWwudGV4dENvbnRlbnQgPSB0ZXh0O1xuICAgICAgY29uc3QgdG9vbHRpcE1hcCA9IHtcbiAgICAgICAgdW5jb25maWd1cmVkOiAnTm8gcHJvdmlkZXIvbW9kZWwgaXMgY29uZmlndXJlZCB5ZXQuJyxcbiAgICAgICAgY29uZmlndXJlZDogJ1Byb3ZpZGVyL21vZGVsIGlzIGNvbmZpZ3VyZWQuIENvbm5lY3Rpdml0eSBub3QgeWV0IHZlcmlmaWVkLicsXG4gICAgICAgIGNvbm5lY3Rpbmc6ICdUZXN0aW5nIG9yIGNvbm5lY3RpbmcgdG8gdGhlIHNlbGVjdGVkIHByb3ZpZGVyLicsXG4gICAgICAgIGNvbm5lY3RlZDogJ1Byb3ZpZGVyIHJlc3BvbmRlZCBzdWNjZXNzZnVsbHkgdG8gYSBsaXZlIHJlcXVlc3QuJyxcbiAgICAgICAgJ2F1dGgtcmVxdWlyZWQnOiAnQXV0aGVudGljYXRpb24gaXMgcmVxdWlyZWQuIENoZWNrIEFQSSBrZXkgb3Igc2lnbiBpbi4nLFxuICAgICAgICAncmF0ZS1saW1pdGVkJzogJ1JhdGUgbGltaXQgcmVhY2hlZC4gV2FpdCBiZWZvcmUgcmV0cnlpbmcgcmVxdWVzdHMuJyxcbiAgICAgICAgdW5hdmFpbGFibGU6ICdQcm92aWRlciBpcyB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZSBvciB1bnJlYWNoYWJsZS4nLFxuICAgICAgICBlcnJvcjogJ0Nvbm5lY3Rpb24gZmFpbGVkLiBPcGVuIG1vZGVsIHNldHRpbmdzIGZvciBkZXRhaWxzLicsXG4gICAgICB9O1xuICAgICAgY29uc3QgdGlwID0gdG9vbHRpcE1hcFtraW5kXSB8fCAnJztcbiAgICAgIHBpbGwudGl0bGUgPSB0aXA7XG4gICAgICBwaWxsSWNvbi50aXRsZSA9IHRpcDtcbiAgICAgIHBpbGxMYWJlbC50aXRsZSA9IHRpcDtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgYWN0aXZlUHJvdmlkZXIgPSBwcm92aWRlciB8fCB3aW5kb3cuY3VycmVudFByb3ZpZGVyIHx8IG51bGw7XG4gIGNvbnN0IGlzQ29waWxvdE9BdXRoID0gYWN0aXZlUHJvdmlkZXIgPT09ICdjb3BpbG90LW9hdXRoJztcblxuICAvLyBOb24tY29uZmlkZW50aWFsIGJhZGdlOiBzaG93IHVubGVzcyB0aGUgcHJvdmlkZXIgZXhwbGljaXRseSBtYXJrcyBjb25maWRlbnRpYWw6dHJ1ZS5cbiAgLy8gRGVmYXVsdCBpcyBub24tY29uZmlkZW50aWFsIChmYWlsLXNhZmUgXHUyMDE0IG1vc3QgcHJvdmlkZXJzIHJldGFpbi9yZXZpZXcgQVBJIGRhdGEpLlxuICBjb25zdCBuY0JhZGdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbS1ub24tY29uZmlkZW50aWFsLWJhZGdlJyk7XG4gIGlmIChuY0JhZGdlICYmIGFjdGl2ZVByb3ZpZGVyKSB7XG4gICAgY29uc3QgaW5mbyA9IGdldFByb3ZpZGVySW5mbyhhY3RpdmVQcm92aWRlcik7XG4gICAgbmNCYWRnZS5zdHlsZS5kaXNwbGF5ID0gKGluZm8gJiYgaW5mby5jb25maWRlbnRpYWwgIT09IHRydWUpID8gJycgOiAnbm9uZSc7XG4gIH1cblxuICBpZiAoYWN0aXZlUHJvdmlkZXIgJiYgIWlzQ29waWxvdE9BdXRoKSB7XG4gICAgYXBwbHlTdGF0ZSgnY29uZmlndXJlZCcsIGAke2Zvcm1hdFByb3ZpZGVyTGFiZWwoYWN0aXZlUHJvdmlkZXIpfSBjb25maWd1cmVkYCwgJ1x1MjVENCcpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChhdXRoU3RhdHVzLmF1dGhlbnRpY2F0ZWQpIHtcbiAgICBhcHBseVN0YXRlKCdjb25uZWN0ZWQnLCAnQ29waWxvdCByZWFkeScsICdcdTI3MTMnKTtcbiAgfSBlbHNlIGlmIChhdXRoU3RhdHVzLnBvbGxpbmcpIHtcbiAgICBhcHBseVN0YXRlKCdjb25uZWN0aW5nJywgJ1dhaXRpbmcgZm9yIGFwcHJvdmFsXHUyMDI2JywgJ1x1MjlENycpO1xuICB9IGVsc2Uge1xuICAgIGFwcGx5U3RhdGUoJ2F1dGgtcmVxdWlyZWQnLCAnTm90IGF1dGhlbnRpY2F0ZWQnLCAnXHVEODNEXHVERDExJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2xvc2VDb3BpbG90QXV0aE1vZGFsKCkge1xuICBpZiAoX2F1dGhQb2xsVGltZXIpIHsgY2xlYXJJbnRlcnZhbChfYXV0aFBvbGxUaW1lcik7IF9hdXRoUG9sbFRpbWVyID0gbnVsbDsgfVxuICBpZiAodHlwZW9mIGNsb3NlTW9kZWxNb2RhbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNsb3NlTW9kZWxNb2RhbCgpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBsZWdhY3lPdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F1dGgtbW9kYWwtb3ZlcmxheScpO1xuICBpZiAobGVnYWN5T3ZlcmxheSkgbGVnYWN5T3ZlcmxheS5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJyk7XG4gIGlmICh0eXBlb2YgcmVzdG9yZUZvY3VzID09PSAnZnVuY3Rpb24nKSByZXN0b3JlRm9jdXMoKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEVTIG1vZHVsZSBleHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuZXhwb3J0IHtcbiAgZm9ybWF0UHJvdmlkZXJMYWJlbCwgdXBkYXRlQXV0aEJhZGdlLFxuICBjbG9zZUNvcGlsb3RBdXRoTW9kYWwsXG59O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiBhdHMtbW9kYWxzLmpzXG4gKiBBVFMgUmVwb3J0IGFuZCBKb2IgQW5hbHlzaXMgbW9kYWwgZGlhbG9ncyArIEFUUyBTY29yZSB0YWIgcmVuZGVyZXIuXG4gKlxuICogREVQRU5ERU5DSUVTOlxuICogLSBzdGF0ZS1tYW5hZ2VyLmpzIGZvciBwZXJzaXN0ZWQgQVRTIHNjb3JlICsgYW5hbHlzaXMgZGF0YVxuICogLSB1dGlscy5qcyBmb3IgSFRNTCBlc2NhcGluZ1xuICogLSBhdHMtcmVmaW5lbWVudC5qcyBmb3IgQVRTIGZldGNoL2JhZGdlIHVwZGF0ZXNcbiAqIC0gaW5kZXguaHRtbCBtb2RhbCBvdmVybGF5czogI2F0cy1yZXBvcnQtbW9kYWwtb3ZlcmxheSwgI2pvYi1hbmFseXNpcy1tb2RhbC1vdmVybGF5XG4gKi9cblxuaW1wb3J0IHsgcmVmcmVzaEF0c1Njb3JlLCB1cGRhdGVBdHNCYWRnZSB9IGZyb20gJy4vYXRzLXJlZmluZW1lbnQuanMnO1xuaW1wb3J0IHsgc3RhdGVNYW5hZ2VyIH0gZnJvbSAnLi9zdGF0ZS1tYW5hZ2VyLmpzJztcbmltcG9ydCB7IGVzY2FwZUh0bWwgfSBmcm9tICcuL3V0aWxzLmpzJztcbmltcG9ydCB7IHRyYXBGb2N1cywgcmVzdG9yZUZvY3VzLCBwdXNoRm9jdXNTdGFjayB9IGZyb20gJy4vdWktY29yZS5qcyc7XG5cbmxldCBfYXRzU3lub255bU1hcENhY2hlID0gbnVsbDtcblxuYXN5bmMgZnVuY3Rpb24gX2xvYWRBdHNTeW5vbnltTWFwKCkge1xuICBpZiAoX2F0c1N5bm9ueW1NYXBDYWNoZSkgcmV0dXJuIF9hdHNTeW5vbnltTWFwQ2FjaGU7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2Vzc2lvbklkID0gc3RhdGVNYW5hZ2VyPy5nZXRTZXNzaW9uSWQ/LigpO1xuICAgIGNvbnN0IHVybCA9IHNlc3Npb25JZCA/IGAvYXBpL3N5bm9ueW0tbWFwP3Nlc3Npb25faWQ9JHtlbmNvZGVVUklDb21wb25lbnQoc2Vzc2lvbklkKX1gIDogJy9hcGkvc3lub255bS1tYXAnO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgaWYgKCFyZXMub2spIHJldHVybiAoX2F0c1N5bm9ueW1NYXBDYWNoZSA9IHt9KTtcbiAgICBjb25zdCByYXcgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGNvbnN0IGFsaWFzVG9DYW5vbiA9IHt9O1xuICAgIGNvbnN0IGNhbm9uVG9BbGlhc2VzID0ge307XG4gICAgT2JqZWN0LmVudHJpZXMocmF3KS5mb3JFYWNoKChbYWxpYXMsIGNhbm9uXSkgPT4ge1xuICAgICAgYWxpYXNUb0Nhbm9uW2FsaWFzLnRvTG93ZXJDYXNlKCldID0gY2Fub247XG4gICAgICBjb25zdCBjbCA9IGNhbm9uLnRvTG93ZXJDYXNlKCk7XG4gICAgICAoY2Fub25Ub0FsaWFzZXNbY2xdID0gY2Fub25Ub0FsaWFzZXNbY2xdIHx8IFtdKS5wdXNoKGFsaWFzKTtcbiAgICB9KTtcbiAgICBfYXRzU3lub255bU1hcENhY2hlID0geyBhbGlhc1RvQ2Fub24sIGNhbm9uVG9BbGlhc2VzIH07XG4gIH0gY2F0Y2ggKF8pIHsgX2F0c1N5bm9ueW1NYXBDYWNoZSA9IHt9OyB9XG4gIHJldHVybiBfYXRzU3lub255bU1hcENhY2hlO1xufVxuXG5mdW5jdGlvbiBfa3dTeW5Bbm5vdGF0aW9uKGt3LCBzeW5NYXApIHtcbiAgaWYgKCFzeW5NYXAgfHwgKCFzeW5NYXAuYWxpYXNUb0Nhbm9uICYmICFzeW5NYXAuY2Fub25Ub0FsaWFzZXMpKSByZXR1cm4gJyc7XG4gIGNvbnN0IGtsID0gKGt3IHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICBpZiAoc3luTWFwLmFsaWFzVG9DYW5vbiAmJiBzeW5NYXAuYWxpYXNUb0Nhbm9uW2tsXSkgcmV0dXJuIGA9ICR7c3luTWFwLmFsaWFzVG9DYW5vbltrbF19YDtcbiAgY29uc3QgYWxpYXNlcyA9IHN5bk1hcC5jYW5vblRvQWxpYXNlcyAmJiBzeW5NYXAuY2Fub25Ub0FsaWFzZXNba2xdO1xuICBpZiAoYWxpYXNlcyAmJiBhbGlhc2VzLmxlbmd0aCkgcmV0dXJuIGBhbHNvOiAke2FsaWFzZXMuam9pbignLCAnKX1gO1xuICByZXR1cm4gJyc7XG59XG5cbmNvbnN0IEFUU19HUk9VUFMgPSBbXG4gIFsnaGFyZCcsICdIYXJkIFJlcXVpcmVtZW50cyddLFxuICBbJ3NvZnQnLCAnUHJlZmVycmVkIFNraWxscyddLFxuICBbJ2JvbnVzJywgJ1x1MjYwNSBCb251cyBLZXl3b3JkcyddLFxuXTtcblxuZnVuY3Rpb24gX2tleXdvcmRTdGF0dXMoa2V5d29yZCkge1xuICByZXR1cm4ga2V5d29yZD8uc3RhdHVzIHx8IChrZXl3b3JkPy5mb3VuZCA/ICdtYXRjaGVkJyA6ICdtaXNzaW5nJyk7XG59XG5cbmZ1bmN0aW9uIF9rZXl3b3JkVHlwZShrZXl3b3JkKSB7XG4gIHJldHVybiBrZXl3b3JkPy50eXBlIHx8ICdvdGhlcic7XG59XG5cbmZ1bmN0aW9uIF9pc0V4YWN0TWF0Y2goa2V5d29yZCkge1xuICByZXR1cm4gX2tleXdvcmRTdGF0dXMoa2V5d29yZCkgPT09ICdtYXRjaGVkJyAmJiBrZXl3b3JkPy5tYXRjaF90eXBlICE9PSAncGFydGlhbCc7XG59XG5cbmZ1bmN0aW9uIF9pc1BhcnRpYWxNYXRjaChrZXl3b3JkKSB7XG4gIHJldHVybiBfa2V5d29yZFN0YXR1cyhrZXl3b3JkKSA9PT0gJ3BhcnRpYWwnIHx8IGtleXdvcmQ/Lm1hdGNoX3R5cGUgPT09ICdwYXJ0aWFsJztcbn1cblxuZnVuY3Rpb24gX2tleXdvcmRTb3J0VmFsdWUoa2V5d29yZCkge1xuICBpZiAoX2tleXdvcmRTdGF0dXMoa2V5d29yZCkgPT09ICdtaXNzaW5nJykgcmV0dXJuIDA7XG4gIGlmIChfaXNQYXJ0aWFsTWF0Y2goa2V5d29yZCkpIHJldHVybiAxO1xuICByZXR1cm4gMjtcbn1cblxuZnVuY3Rpb24gX2tleXdvcmRTdGF0dXNCYWRnZShrZXl3b3JkKSB7XG4gIGlmIChfa2V5d29yZFN0YXR1cyhrZXl3b3JkKSA9PT0gJ21pc3NpbmcnKSB7XG4gICAgcmV0dXJuICc8c3BhbiBzdHlsZT1cImRpc3BsYXk6aW5saW5lLWJsb2NrO3BhZGRpbmc6MnB4IDhweDtib3JkZXItcmFkaXVzOjk5OXB4O2JhY2tncm91bmQ6I2ZlZTJlMjtjb2xvcjojOTkxYjFiO2ZvbnQtc2l6ZTowLjhlbTtmb250LXdlaWdodDo2MDA7XCI+XHUyNzRDIE1pc3Npbmc8L3NwYW4+JztcbiAgfVxuICBpZiAoX2lzUGFydGlhbE1hdGNoKGtleXdvcmQpKSB7XG4gICAgcmV0dXJuICc8c3BhbiBzdHlsZT1cImRpc3BsYXk6aW5saW5lLWJsb2NrO3BhZGRpbmc6MnB4IDhweDtib3JkZXItcmFkaXVzOjk5OXB4O2JhY2tncm91bmQ6I2ZlZjNjNztjb2xvcjojOTI0MDBlO2ZvbnQtc2l6ZTowLjhlbTtmb250LXdlaWdodDo2MDA7XCI+XHUyNkEwIFBhcnRpYWw8L3NwYW4+JztcbiAgfVxuICByZXR1cm4gJzxzcGFuIHN0eWxlPVwiZGlzcGxheTppbmxpbmUtYmxvY2s7cGFkZGluZzoycHggOHB4O2JvcmRlci1yYWRpdXM6OTk5cHg7YmFja2dyb3VuZDojZGNmY2U3O2NvbG9yOiMxNjY1MzQ7Zm9udC1zaXplOjAuOGVtO2ZvbnQtd2VpZ2h0OjYwMDtcIj5cdTI3MDUgTWF0Y2hlZDwvc3Bhbj4nO1xufVxuXG5mdW5jdGlvbiBfcmVuZGVyS2V5d29yZEdyb3VwKHRpdGxlLCBrZXl3b3Jkcywgc3luTWFwKSB7XG4gIGlmIChrZXl3b3Jkcy5sZW5ndGggPT09IDApIHJldHVybiAnJztcblxuICBjb25zdCBleGFjdENvdW50ID0ga2V5d29yZHMuZmlsdGVyKF9pc0V4YWN0TWF0Y2gpLmxlbmd0aDtcbiAgY29uc3QgcGFydGlhbENvdW50ID0ga2V5d29yZHMuZmlsdGVyKF9pc1BhcnRpYWxNYXRjaCkubGVuZ3RoO1xuICBjb25zdCBtaXNzaW5nQ291bnQgPSBrZXl3b3Jkcy5maWx0ZXIoa2V5d29yZCA9PiBfa2V5d29yZFN0YXR1cyhrZXl3b3JkKSA9PT0gJ21pc3NpbmcnKS5sZW5ndGg7XG4gIGNvbnN0IHNvcnRlZCA9IFsuLi5rZXl3b3Jkc10uc29ydCgobGVmdCwgcmlnaHQpID0+IHtcbiAgICBjb25zdCBwcmlvcml0eSA9IF9rZXl3b3JkU29ydFZhbHVlKGxlZnQpIC0gX2tleXdvcmRTb3J0VmFsdWUocmlnaHQpO1xuICAgIGlmIChwcmlvcml0eSAhPT0gMCkgcmV0dXJuIHByaW9yaXR5O1xuICAgIHJldHVybiBTdHJpbmcobGVmdC5rZXl3b3JkIHx8IGxlZnQudGVybSB8fCAnJykubG9jYWxlQ29tcGFyZShTdHJpbmcocmlnaHQua2V5d29yZCB8fCByaWdodC50ZXJtIHx8ICcnKSk7XG4gIH0pO1xuXG4gIHJldHVybiBgXG4gICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6MTZweDtcIj5cbiAgICAgIDxoNCBzdHlsZT1cIm1hcmdpbjowIDAgOHB4O2ZvbnQtc2l6ZToxcmVtO2NvbG9yOiMzMzQxNTU7XCI+JHtlc2NhcGVIdG1sKHRpdGxlKX08L2g0PlxuICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjgyZW07Y29sb3I6IzY0NzQ4YjttYXJnaW4tYm90dG9tOjhweDtcIj4ke2V4YWN0Q291bnR9IGV4YWN0IFx1MjAyMiAke3BhcnRpYWxDb3VudH0gcGFydGlhbCBcdTIwMjIgJHttaXNzaW5nQ291bnR9IG1pc3Npbmc8L2Rpdj5cbiAgICAgIDx0YWJsZSBzdHlsZT1cIndpZHRoOjEwMCU7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlO2ZvbnQtc2l6ZTowLjllbTtcIj5cbiAgICAgICAgPHRoZWFkPlxuICAgICAgICAgIDx0ciBzdHlsZT1cInRleHQtYWxpZ246bGVmdDtjb2xvcjojNjQ3NDhiO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNlMmU4ZjA7XCI+XG4gICAgICAgICAgICA8dGggc3R5bGU9XCJwYWRkaW5nOjZweCA4cHg7XCI+S2V5d29yZDwvdGg+XG4gICAgICAgICAgICA8dGggc3R5bGU9XCJwYWRkaW5nOjZweCA4cHg7XCI+Q292ZXJhZ2U8L3RoPlxuICAgICAgICAgICAgPHRoIHN0eWxlPVwicGFkZGluZzo2cHggOHB4O1wiPlNlY3Rpb25zPC90aD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICA8L3RoZWFkPlxuICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgJHtzb3J0ZWQubWFwKGtleXdvcmQgPT4ge1xuICAgICAgICAgICAgY29uc3Qga3cgPSBrZXl3b3JkLmtleXdvcmQgfHwga2V5d29yZC50ZXJtIHx8ICcnO1xuICAgICAgICAgICAgY29uc3Qgc2VjdGlvbnMgPSBBcnJheS5pc0FycmF5KGtleXdvcmQubWF0Y2hlZF9pbl9zZWN0aW9ucykgJiYga2V5d29yZC5tYXRjaGVkX2luX3NlY3Rpb25zLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgPyBrZXl3b3JkLm1hdGNoZWRfaW5fc2VjdGlvbnMuam9pbignLCAnKVxuICAgICAgICAgICAgICA6ICdOb3QgZm91bmQnO1xuICAgICAgICAgICAgY29uc3Qgc3luQW5ub3QgPSBfa3dTeW5Bbm5vdGF0aW9uKGt3LCBzeW5NYXApO1xuICAgICAgICAgICAgY29uc3Qgc3luSHRtbCA9IHN5bkFubm90XG4gICAgICAgICAgICAgID8gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC43OGVtO2NvbG9yOiM2NDc0OGI7bWFyZ2luLXRvcDoycHg7XCIgdGl0bGU9XCJTeW5vbnltIGdyb3VwaW5nXCI+JHtlc2NhcGVIdG1sKHN5bkFubm90KX08L2Rpdj5gXG4gICAgICAgICAgICAgIDogJyc7XG4gICAgICAgICAgICByZXR1cm4gYFxuICAgICAgICAgICAgICA8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZjFmNWY5O3ZlcnRpY2FsLWFsaWduOnRvcDtcIj5cbiAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOjhweDtcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDo2MDA7Y29sb3I6IzFlMjkzYjtcIj4ke2VzY2FwZUh0bWwoa3cpfTwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjhlbTtjb2xvcjojOTRhM2I4O3RleHQtdHJhbnNmb3JtOmNhcGl0YWxpemU7XCI+JHtlc2NhcGVIdG1sKF9rZXl3b3JkVHlwZShrZXl3b3JkKSl9PC9kaXY+XG4gICAgICAgICAgICAgICAgICAke3N5bkh0bWx9XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOjhweDtcIj4ke19rZXl3b3JkU3RhdHVzQmFkZ2Uoa2V5d29yZCl9PC90ZD5cbiAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOjhweDtjb2xvcjojNDc1NTY5O1wiPiR7ZXNjYXBlSHRtbChzZWN0aW9ucyl9PC90ZD5cbiAgICAgICAgICAgICAgPC90cj5gO1xuICAgICAgICAgIH0pLmpvaW4oJycpfVxuICAgICAgICA8L3Rib2R5PlxuICAgICAgPC90YWJsZT5cbiAgICA8L2Rpdj5gO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEFUUyBSZXBvcnQgTW9kYWxcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIE9wZW4gdGhlIEFUUyBSZXBvcnQgbW9kYWwuIFJlbmRlcnMgdGhlIGNhY2hlZCBBVFMgc2NvcmUgZnJvbSBzdGF0ZSwgb3JcbiAqIGZldGNoZXMgYSBmcmVzaCBzY29yZSBpZiBub25lIGlzIGNhY2hlZC5cbiAqL1xuZnVuY3Rpb24gX2F0c0VzY2FwZUhhbmRsZXIoZSkge1xuICBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSBjbG9zZUF0c1JlcG9ydE1vZGFsKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG9wZW5BdHNSZXBvcnRNb2RhbCgpIHtcbiAgcHVzaEZvY3VzU3RhY2soZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7XG4gIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXRzLXJlcG9ydC1tb2RhbC1vdmVybGF5Jyk7XG4gIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIF9hdHNFc2NhcGVIYW5kbGVyKTtcbiAgLy8gTW92ZSBmb2N1cyB0byB0aGUgQ2xvc2UgYnV0dG9uIGluIHRoZSBtb2RhbCBmb290ZXJcbiAgY29uc3QgY2xvc2VCdG4gPSBvdmVybGF5LnF1ZXJ5U2VsZWN0b3IoJy5tb2RhbC1mb290ZXIgLmFjdGlvbi1idG4nKTtcbiAgaWYgKGNsb3NlQnRuKSBjbG9zZUJ0bi5mb2N1cygpO1xuICB0cmFwRm9jdXMoJ2F0cy1yZXBvcnQtbW9kYWwtb3ZlcmxheScpO1xuICBjb25zdCBib2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F0cy1yZXBvcnQtbW9kYWwtYm9keScpO1xuXG4gIC8vIEEgY2FjaGVkIHNjb3JlIHJlbmRlcnMgaW1tZWRpYXRlbHkgdXNpbmcgd2hhdGV2ZXIgc3lub255bSBtYXAgaXMgYWxyZWFkeVxuICAvLyBjYWNoZWQgKG9yIG5vbmUpIHJhdGhlciB0aGFuIGJsb2NraW5nIG9uIGEgbmV0d29yayByb3VuZC10cmlwIGZvciBpdCBcdTIwMTRcbiAgLy8gdGhlIGFubm90YXRpb25zIGFyZSBhbiBlbnJpY2htZW50LCBub3QgcmVxdWlyZWQgZm9yIF9yZW5kZXJBdHNSZXBvcnQgdG9cbiAgLy8gd29yaywgYW5kIGEgY2FjaGVkLXNjb3JlIG9wZW4gc2hvdWxkIGJlIGluc3RhbnQuXG4gIGNvbnN0IGNhY2hlZCA9IHN0YXRlTWFuYWdlcj8uZ2V0QXRzU2NvcmU/LigpO1xuICBpZiAoY2FjaGVkKSB7XG4gICAgYm9keS5pbm5lckhUTUwgPSBfcmVuZGVyQXRzUmVwb3J0KGNhY2hlZCwgX2F0c1N5bm9ueW1NYXBDYWNoZSB8fCB7fSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYm9keS5pbm5lckhUTUwgPSAnPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjEycHg7cGFkZGluZzoyNHB4O2NvbG9yOiM2YjcyODA7XCI+PGRpdiBjbGFzcz1cImxvYWRpbmctc3Bpbm5lclwiIHN0eWxlPVwid2lkdGg6MjBweDtoZWlnaHQ6MjBweDtib3JkZXItd2lkdGg6MnB4O2ZsZXgtc2hyaW5rOjA7XCI+PC9kaXY+PHNwYW4+RmV0Y2hpbmcgQVRTIHNjb3JlXHUyMDI2PC9zcGFuPjwvZGl2Pic7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2Vzc2lvbklkID0gc3RhdGVNYW5hZ2VyPy5nZXRTZXNzaW9uSWQ/LigpO1xuICAgIGNvbnN0IFtzeW5NYXAsIHJlc10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBfbG9hZEF0c1N5bm9ueW1NYXAoKSxcbiAgICAgIGZldGNoKCcvYXBpL2N2L2F0cy1zY29yZScsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHNlc3Npb25faWQ6IHNlc3Npb25JZCwgYmFzaXM6ICdyZXZpZXdfY2hlY2twb2ludCcgfSksXG4gICAgICB9KSxcbiAgICBdKTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vayAmJiBkYXRhLmF0c19zY29yZSkge1xuICAgICAgc3RhdGVNYW5hZ2VyPy5zZXRBdHNTY29yZT8uKGRhdGEuYXRzX3Njb3JlKTtcbiAgICAgIHVwZGF0ZUF0c0JhZGdlKGRhdGEuYXRzX3Njb3JlKTtcbiAgICAgIGJvZHkuaW5uZXJIVE1MID0gX3JlbmRlckF0c1JlcG9ydChkYXRhLmF0c19zY29yZSwgc3luTWFwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYm9keS5pbm5lckhUTUwgPSBgPHAgc3R5bGU9XCJwYWRkaW5nOjI0cHg7Y29sb3I6I2VmNDQ0NDtcIj5Db3VsZCBub3QgbG9hZCBBVFMgcmVwb3J0OiAke2VzY2FwZUh0bWwoZGF0YS5lcnJvciB8fCAndW5rbm93biBlcnJvcicpfTwvcD5gO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGJvZHkuaW5uZXJIVE1MID0gYDxwIHN0eWxlPVwicGFkZGluZzoyNHB4O2NvbG9yOiNlZjQ0NDQ7XCI+RXJyb3I6ICR7ZXNjYXBlSHRtbChlLm1lc3NhZ2UpfTwvcD5gO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNsb3NlQXRzUmVwb3J0TW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdHMtcmVwb3J0LW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgX2F0c0VzY2FwZUhhbmRsZXIpO1xuICByZXN0b3JlRm9jdXMoKTtcbn1cblxuLyoqXG4gKiBSZW5kZXIgYW4gQVRTIHNjb3JlIG9iamVjdCBpbnRvIEhUTUwgZm9yIHRoZSBtb2RhbCBib2R5LlxuICovXG5mdW5jdGlvbiBfcmVuZGVyQXRzUmVwb3J0KHNjb3JlLCBzeW5NYXApIHtcbiAgY29uc3Qgb3ZlcmFsbCA9IE1hdGgucm91bmQoc2NvcmUub3ZlcmFsbCA/PyAwKTtcbiAgY29uc3QgaGFyZCA9IE1hdGgucm91bmQoc2NvcmUuaGFyZF9yZXF1aXJlbWVudF9zY29yZSA/PyAwKTtcbiAgY29uc3Qgc29mdCA9IE1hdGgucm91bmQoc2NvcmUuc29mdF9yZXF1aXJlbWVudF9zY29yZSA/PyAwKTtcblxuICBjb25zdCBzY29yZUNvbG9yID0gb3ZlcmFsbCA+PSA3NSA/ICcjMTBiOTgxJyA6IG92ZXJhbGwgPj0gNTAgPyAnI2Y1OWUwYicgOiAnI2VmNDQ0NCc7XG5cbiAgY29uc3Qga2V5d29yZHMgPSBzY29yZS5rZXl3b3JkX3N0YXR1cyB8fCBbXTtcbiAgY29uc3QgbWlzc2luZ0t3ID0ga2V5d29yZHMuZmlsdGVyKGtleXdvcmQgPT4gX2tleXdvcmRTdGF0dXMoa2V5d29yZCkgPT09ICdtaXNzaW5nJyk7XG4gIGNvbnN0IG1pc3NpbmdIYXJkID0gbWlzc2luZ0t3LmZpbHRlcihrZXl3b3JkID0+IF9rZXl3b3JkVHlwZShrZXl3b3JkKSA9PT0gJ2hhcmQnKTtcbiAgY29uc3Qga2V5d29yZEdyb3VwcyA9IEFUU19HUk9VUFNcbiAgICAubWFwKChbdHlwZSwgdGl0bGVdKSA9PiBfcmVuZGVyS2V5d29yZEdyb3VwKHRpdGxlLCBrZXl3b3Jkcy5maWx0ZXIoa2V5d29yZCA9PiBfa2V5d29yZFR5cGUoa2V5d29yZCkgPT09IHR5cGUpLCBzeW5NYXApKVxuICAgIC5qb2luKCcnKTtcblxuICBjb25zdCBzZWN0aW9uU2NvcmVzID0gc2NvcmUuc2VjdGlvbl9zY29yZXMgfHwge307XG4gIGNvbnN0IHNlY3RIdG1sID0gT2JqZWN0LmtleXMoc2VjdGlvblNjb3JlcykubGVuZ3RoID09PSAwID8gJycgOiBgXG4gICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6MTZweDtcIj5cbiAgICAgIDxoNCBzdHlsZT1cIm1hcmdpbjowIDAgOHB4O2ZvbnQtc2l6ZToxcmVtO2NvbG9yOiMzMzQxNTU7XCI+U2VjdGlvbiBTY29yZXM8L2g0PlxuICAgICAgPHRhYmxlIHN0eWxlPVwid2lkdGg6MTAwJTtib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7Zm9udC1zaXplOjAuOWVtO1wiPlxuICAgICAgICAke09iamVjdC5lbnRyaWVzKHNlY3Rpb25TY29yZXMpLm1hcCgoW3NlYywgdmFsXSkgPT4gYFxuICAgICAgICAgIDx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206MXB4IHNvbGlkICNmMWY1Zjk7XCI+XG4gICAgICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOjRweCA4cHg7dGV4dC10cmFuc2Zvcm06Y2FwaXRhbGl6ZTtjb2xvcjojNDc1NTY5O1wiPiR7ZXNjYXBlSHRtbChzZWMpfTwvdGQ+XG4gICAgICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOjRweCA4cHg7Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOiMxZTI5M2I7XCI+JHtNYXRoLnJvdW5kKHZhbCl9JTwvdGQ+XG4gICAgICAgICAgPC90cj5gKS5qb2luKCcnKX1cbiAgICAgIDwvdGFibGU+XG4gICAgPC9kaXY+YDtcblxuICByZXR1cm4gYFxuICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nOjIwcHg7XCI+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MjRweDttYXJnaW4tYm90dG9tOjIwcHg7XCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6Mi40ZW07Zm9udC13ZWlnaHQ6NzAwO2NvbG9yOiR7c2NvcmVDb2xvcn07XCI+JHtvdmVyYWxsfSU8L2Rpdj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuOWVtO2NvbG9yOiM0NzU1Njk7XCI+SGFyZCByZXF1aXJlbWVudHM6IDxzdHJvbmc+JHtoYXJkfSU8L3N0cm9uZz48L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuOWVtO2NvbG9yOiM0NzU1Njk7XCI+UHJlZmVycmVkIHNraWxsczogPHN0cm9uZz4ke3NvZnR9JTwvc3Ryb25nPjwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC43NWVtO2NvbG9yOiM5NGEzYjg7bWFyZ2luLXRvcDoycHg7XCI+QmFzaXM6ICR7ZXNjYXBlSHRtbChzY29yZS5iYXNpcyB8fCAncmV2aWV3Jyl9PC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjc1ZW07Y29sb3I6Izk0YTNiODttYXJnaW4tdG9wOjRweDtcIiB0aXRsZT1cIlNjb3JlIHRocmVzaG9sZHNcIj5cbiAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIHN0eWxlPVwiY29sb3I6IzEwYjk4MTtcIj5cdTI1Q0Y8L3NwYW4+IFx1MjI2NTc1JSBTdHJvbmcgbWF0Y2ggJm5ic3A7XG4gICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIiBzdHlsZT1cImNvbG9yOiNmNTllMGI7XCI+XHUyNUNGPC9zcGFuPiA1MFx1MjAxMzc0JSBQYXJ0aWFsIG1hdGNoICZuYnNwO1xuICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCIgc3R5bGU9XCJjb2xvcjojZWY0NDQ0O1wiPlx1MjVDRjwvc3Bhbj4gJmx0OzUwJSBMb3cgbWF0Y2hcbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgICR7a2V5d29yZEdyb3Vwc31cbiAgICAgICR7c2VjdEh0bWx9XG4gICAgICAke21pc3NpbmdIYXJkLmxlbmd0aCA+IDAgPyBgXG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOjE2cHg7cGFkZGluZzoxMnB4O2JhY2tncm91bmQ6I2ZmZjdlZDtib3JkZXI6MXB4IHNvbGlkICNmZWQ3YWE7Ym9yZGVyLXJhZGl1czo2cHg7XCI+XG4gICAgICAgICAgPHN0cm9uZyBzdHlsZT1cImNvbG9yOiM5YTM0MTI7XCI+TWlzc2luZyBoYXJkIHJlcXVpcmVtZW50cyAoJHttaXNzaW5nSGFyZC5sZW5ndGh9KTo8L3N0cm9uZz5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiM3YzJkMTI7Zm9udC1zaXplOjAuOWVtO1wiPiAke21pc3NpbmdIYXJkLm1hcChrZXl3b3JkID0+IGVzY2FwZUh0bWwoa2V5d29yZC5rZXl3b3JkIHx8IGtleXdvcmQudGVybSB8fCAnJykpLmpvaW4oJywgJyl9PC9zcGFuPlxuICAgICAgICA8L2Rpdj5gIDogJyd9XG4gICAgICAke21pc3NpbmdLdy5sZW5ndGggPiBtaXNzaW5nSGFyZC5sZW5ndGggPyBgXG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOjE2cHg7cGFkZGluZzoxMnB4O2JhY2tncm91bmQ6I2ZmZjdlZDtib3JkZXI6MXB4IHNvbGlkICNmZWQ3YWE7Ym9yZGVyLXJhZGl1czo2cHg7XCI+XG4gICAgICAgICAgPHN0cm9uZyBzdHlsZT1cImNvbG9yOiM5YTM0MTI7XCI+UmVtYWluaW5nIGtleXdvcmQgZ2FwcyAoJHttaXNzaW5nS3cubGVuZ3RoIC0gbWlzc2luZ0hhcmQubGVuZ3RofSk6PC9zdHJvbmc+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjojN2MyZDEyO2ZvbnQtc2l6ZTowLjllbTtcIj4gJHttaXNzaW5nS3cuZmlsdGVyKGtleXdvcmQgPT4gX2tleXdvcmRUeXBlKGtleXdvcmQpICE9PSAnaGFyZCcpLm1hcChrZXl3b3JkID0+IGVzY2FwZUh0bWwoa2V5d29yZC5rZXl3b3JkIHx8IGtleXdvcmQudGVybSB8fCAnJykpLmpvaW4oJywgJyl9PC9zcGFuPlxuICAgICAgICA8L2Rpdj5gIDogJyd9XG4gICAgPC9kaXY+YDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBKb2IgQW5hbHlzaXMgTW9kYWxcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIE9wZW4gdGhlIEpvYiBBbmFseXNpcyBtb2RhbC4gUmV1c2VzIHRhYkRhdGEuYW5hbHlzaXMgaWYgYXZhaWxhYmxlLlxuICovXG5mdW5jdGlvbiBfam9iQW5hbHlzaXNFc2NhcGVIYW5kbGVyKGUpIHtcbiAgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgY2xvc2VKb2JBbmFseXNpc01vZGFsKCk7XG59XG5cbmZ1bmN0aW9uIG9wZW5Kb2JBbmFseXNpc01vZGFsKCkge1xuICBwdXNoRm9jdXNTdGFjayhkb2N1bWVudC5hY3RpdmVFbGVtZW50KTtcbiAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqb2ItYW5hbHlzaXMtbW9kYWwtb3ZlcmxheScpO1xuICBvdmVybGF5LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBfam9iQW5hbHlzaXNFc2NhcGVIYW5kbGVyKTtcbiAgY29uc3QgY2xvc2VCdG4gPSBvdmVybGF5LnF1ZXJ5U2VsZWN0b3IoJy5tb2RhbC1mb290ZXIgLmFjdGlvbi1idG4nKTtcbiAgaWYgKGNsb3NlQnRuKSBjbG9zZUJ0bi5mb2N1cygpO1xuICB0cmFwRm9jdXMoJ2pvYi1hbmFseXNpcy1tb2RhbC1vdmVybGF5Jyk7XG4gIGNvbnN0IGJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnam9iLWFuYWx5c2lzLW1vZGFsLWJvZHknKTtcblxuICBjb25zdCBhbmFseXNpcyA9IHN0YXRlTWFuYWdlci5nZXRUYWJEYXRhKCdhbmFseXNpcycpO1xuICBpZiAoYW5hbHlzaXMpIHtcbiAgICAvLyBSZW5kZXIgaW50byBhIHRlbXAgZGl2IHVzaW5nIHBvcHVsYXRlQW5hbHlzaXNUYWIncyBvdXRwdXQgcGF0dGVyblxuICAgIGNvbnN0IHRtcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRtcC5zdHlsZS5wYWRkaW5nID0gJzIwcHgnO1xuICAgIGJvZHkuaW5uZXJIVE1MID0gJyc7XG4gICAgYm9keS5hcHBlbmRDaGlsZCh0bXApO1xuICAgIC8vIHBvcHVsYXRlQW5hbHlzaXNUYWIgd3JpdGVzIHRvICNkb2N1bWVudC1jb250ZW50OyB1c2UgYSBzaGltXG4gICAgX3JlbmRlckFuYWx5c2lzSW50b0VsKHRtcCwgYW5hbHlzaXMpO1xuICB9IGVsc2Uge1xuICAgIGJvZHkuaW5uZXJIVE1MID0gJzxwIHN0eWxlPVwicGFkZGluZzoyNHB4O3RleHQtYWxpZ246Y2VudGVyO2NvbG9yOiM2YjcyODA7XCI+Tm8gam9iIGFuYWx5c2lzIGF2YWlsYWJsZS4gUnVuIGpvYiBhbmFseXNpcyBmaXJzdC48L3A+JztcbiAgfVxufVxuXG5mdW5jdGlvbiBjbG9zZUpvYkFuYWx5c2lzTW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqb2ItYW5hbHlzaXMtbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBfam9iQW5hbHlzaXNFc2NhcGVIYW5kbGVyKTtcbiAgcmVzdG9yZUZvY3VzKCk7XG59XG5cbi8qKlxuICogUmVuZGVyIGpvYiBhbmFseXNpcyBkYXRhIGludG8gYW4gYXJiaXRyYXJ5IGNvbnRhaW5lciBlbGVtZW50LlxuICogTWlycm9ycyB0aGUgc3RydWN0dXJlIGZyb20gcG9wdWxhdGVBbmFseXNpc1RhYiBpbiBhcHAuanMuXG4gKi9cbmZ1bmN0aW9uIF9yZW5kZXJBbmFseXNpc0ludG9FbChlbCwgcmVzdWx0KSB7XG4gIGlmICghcmVzdWx0KSB7XG4gICAgZWwuaW5uZXJIVE1MID0gJzxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtcIj5ObyBhbmFseXNpcyBkYXRhLjwvcD4nO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIERlZHVwbGljYXRlIGxpc3RzOiBjYXNlLWluc2Vuc2l0aXZlLCBrZWVwIGZpcnN0IG9jY3VycmVuY2Ugb2YgZWFjaCBub3JtYWxpc2VkIGZvcm0uXG4gIGNvbnN0IF9kZWR1cCA9IChhcnIpID0+IHtcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldCgpO1xuICAgIHJldHVybiAoYXJyIHx8IFtdKS5maWx0ZXIoaXRlbSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBTdHJpbmcodHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnID8gaXRlbSA6IGl0ZW0ua2V5d29yZCB8fCBpdGVtLnRlcm0gfHwgJycpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKCFrZXkgfHwgc2Vlbi5oYXMoa2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgc2Vlbi5hZGQoa2V5KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICB9O1xuICBjb25zdCByZXEgPSBfZGVkdXAocmVzdWx0LnJlcXVpcmVkX3NraWxscyk7XG4gIGNvbnN0IHByZWYgPSBfZGVkdXAocmVzdWx0LnByZWZlcnJlZF9za2lsbHMgfHwgcmVzdWx0Lm5pY2VfdG9faGF2ZSk7XG4gIGNvbnN0IGtleXdvcmRzID0gX2RlZHVwKHJlc3VsdC5hdHNfa2V5d29yZHMpO1xuICBjb25zdCBjdWx0dXJlID0gcmVzdWx0LmN1bHR1cmVfaW5kaWNhdG9ycyB8fCBbXTtcbiAgY29uc3QgbXVzdEhhdmUgPSByZXN1bHQubXVzdF9oYXZlX3JlcXVpcmVtZW50cyB8fCBbXTtcbiAgY29uc3QgbWlzc2luZyA9IHJlc3VsdC5taXNzaW5nX3JlcXVpcmVkIHx8IFtdO1xuXG4gIGVsLmlubmVySFRNTCA9IGBcbiAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuOTVlbTtsaW5lLWhlaWdodDoxLjY7XCI+XG4gICAgICA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZjhmYWZjO2JvcmRlcjoxcHggc29saWQgI2UyZThmMDtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjE0cHggMTZweDttYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MS4xZW07Zm9udC13ZWlnaHQ6NzAwO2NvbG9yOiMxZTI5M2I7XCI+JHtlc2NhcGVIdG1sKHJlc3VsdC5qb2JfdGl0bGUgfHwgcmVzdWx0LnRpdGxlIHx8ICdSb2xlJyl9PC9kaXY+XG4gICAgICAgICR7cmVzdWx0LmNvbXBhbnkgPyBgPGRpdiBzdHlsZT1cImNvbG9yOiM0NzU1Njk7XCI+JHtlc2NhcGVIdG1sKHJlc3VsdC5jb21wYW55KX08L2Rpdj5gIDogJyd9XG4gICAgICAgICR7cmVzdWx0LmRvbWFpbiA/IGA8c3BhbiBzdHlsZT1cImRpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbi10b3A6NnB4O3BhZGRpbmc6MnB4IDhweDtiYWNrZ3JvdW5kOiNkYmVhZmU7Y29sb3I6IzFlNDBhZjtib3JkZXItcmFkaXVzOjEwcHg7Zm9udC1zaXplOjAuOGVtO1wiPiR7ZXNjYXBlSHRtbChyZXN1bHQuZG9tYWluKX08L3NwYW4+YCA6ICcnfVxuICAgICAgPC9kaXY+XG5cbiAgICAgICR7bWlzc2luZy5sZW5ndGggPiAwID8gYFxuICAgICAgICA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZmZmN2VkO2JvcmRlcjoxcHggc29saWQgI2ZlZDdhYTtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjEwcHggMTRweDttYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgICAgPHN0cm9uZyBzdHlsZT1cImNvbG9yOiM5YTM0MTI7XCI+XHUyNkEwIE1pc3NpbmcgcmVxdWlyZWQgc2tpbGxzOjwvc3Ryb25nPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJjb2xvcjojN2MyZDEyO21hcmdpbi10b3A6NHB4O1wiPiR7bWlzc2luZy5tYXAocyA9PiBlc2NhcGVIdG1sKHMpKS5qb2luKCcgXHUwMEI3ICcpfTwvZGl2PlxuICAgICAgICA8L2Rpdj5gIDogJyd9XG5cbiAgICAgICR7cmVxLmxlbmd0aCA+IDAgPyBgXG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgICAgPGg0IHN0eWxlPVwibWFyZ2luOjAgMCA4cHg7Zm9udC1zaXplOjAuOTVlbTt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7bGV0dGVyLXNwYWNpbmc6LjVweDtjb2xvcjojMzM0MTU1O1wiPlJlcXVpcmVkIFNraWxsczwvaDQ+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtmbGV4LXdyYXA6d3JhcDtnYXA6NnB4O1wiPlxuICAgICAgICAgICAgJHtyZXEubWFwKHMgPT4gYDxzcGFuIHN0eWxlPVwicGFkZGluZzoycHggMTBweDtib3JkZXItcmFkaXVzOjEycHg7YmFja2dyb3VuZDoke21pc3NpbmcuaW5jbHVkZXMocyk/JyNmZWUyZTInOicjZGNmY2U3J307Y29sb3I6JHttaXNzaW5nLmluY2x1ZGVzKHMpPycjOTkxYjFiJzonIzE2NjUzNCd9O2ZvbnQtc2l6ZTowLjg1ZW07XCI+JHtlc2NhcGVIdG1sKHMpfTwvc3Bhbj5gKS5qb2luKCcnKX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+YCA6ICcnfVxuXG4gICAgICAke3ByZWYubGVuZ3RoID4gMCA/IGBcbiAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTRweDtcIj5cbiAgICAgICAgICA8aDQgc3R5bGU9XCJtYXJnaW46MCAwIDhweDtmb250LXNpemU6MC45NWVtO3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTtsZXR0ZXItc3BhY2luZzouNXB4O2NvbG9yOiMzMzQxNTU7XCI+UHJlZmVycmVkIC8gTmljZS10by1oYXZlPC9oND5cbiAgICAgICAgICA8dWwgc3R5bGU9XCJtYXJnaW46MDtwYWRkaW5nLWxlZnQ6MThweDtjb2xvcjojNDc1NTY5O1wiPiR7cHJlZi5tYXAocyA9PiBgPGxpPiR7ZXNjYXBlSHRtbChzKX08L2xpPmApLmpvaW4oJycpfTwvdWw+XG4gICAgICAgIDwvZGl2PmAgOiAnJ31cblxuICAgICAgJHtrZXl3b3Jkcy5sZW5ndGggPiAwID8gYFxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgIDxoNCBzdHlsZT1cIm1hcmdpbjowIDAgOHB4O2ZvbnQtc2l6ZTowLjk1ZW07dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO2xldHRlci1zcGFjaW5nOi41cHg7Y29sb3I6IzMzNDE1NTtcIj5BVFMgS2V5d29yZHM8L2g0PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7ZmxleC13cmFwOndyYXA7Z2FwOjZweDtcIj5cbiAgICAgICAgICAgICR7a2V5d29yZHMubWFwKChrLCBpKSA9PiBgPHNwYW4gc3R5bGU9XCJwYWRkaW5nOjJweCA4cHg7Ym9yZGVyLXJhZGl1czoxMnB4O2JhY2tncm91bmQ6I2YwZjlmZjtib3JkZXI6MXB4IHNvbGlkICNiYWU2ZmQ7Y29sb3I6IzAzNjlhMTtmb250LXNpemU6MC44MmVtO1wiPiR7aSA8IDUgPyBgPHN0cm9uZz4jJHtpKzF9PC9zdHJvbmc+IGAgOiAnJ30ke2VzY2FwZUh0bWwodHlwZW9mIGsgPT09ICdzdHJpbmcnID8gayA6IGsua2V5d29yZCB8fCBrLnRlcm0gfHwgJycpfTwvc3Bhbj5gKS5qb2luKCcnKX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+YCA6ICcnfVxuXG4gICAgICAke211c3RIYXZlLmxlbmd0aCA+IDAgPyBgXG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgICAgPGg0IHN0eWxlPVwibWFyZ2luOjAgMCA4cHg7Zm9udC1zaXplOjAuOTVlbTt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7bGV0dGVyLXNwYWNpbmc6LjVweDtjb2xvcjojMzM0MTU1O1wiPk11c3QtaGF2ZSBSZXF1aXJlbWVudHM8L2g0PlxuICAgICAgICAgIDx1bCBzdHlsZT1cIm1hcmdpbjowO3BhZGRpbmctbGVmdDoxOHB4O2NvbG9yOiM0NzU1Njk7XCI+JHttdXN0SGF2ZS5tYXAocyA9PiBgPGxpPiR7ZXNjYXBlSHRtbChzKX08L2xpPmApLmpvaW4oJycpfTwvdWw+XG4gICAgICAgIDwvZGl2PmAgOiAnJ31cblxuICAgICAgJHtjdWx0dXJlLmxlbmd0aCA+IDAgPyBgXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGg0IHN0eWxlPVwibWFyZ2luOjAgMCA4cHg7Zm9udC1zaXplOjAuOTVlbTt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7bGV0dGVyLXNwYWNpbmc6LjVweDtjb2xvcjojMzM0MTU1O1wiPkN1bHR1cmUgSW5kaWNhdG9yczwvaDQ+XG4gICAgICAgICAgPHVsIHN0eWxlPVwibWFyZ2luOjA7cGFkZGluZy1sZWZ0OjE4cHg7Y29sb3I6IzQ3NTU2OTtcIj4ke2N1bHR1cmUubWFwKHMgPT4gYDxsaT4ke2VzY2FwZUh0bWwocyl9PC9saT5gKS5qb2luKCcnKX08L3VsPlxuICAgICAgICA8L2Rpdj5gIDogJyd9XG4gICAgPC9kaXY+YDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBBVFMgU2NvcmUgVGFiIChpbiBjdXN0b21pemUgcGhhc2UpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBQb3B1bGF0ZSB0aGUgQVRTIFNjb3JlIHRhYiBjb250ZW50IGFyZWEuXG4gKiBDYWxsZWQgYnkgYXBwLmpzIHN3aXRjaFRhYiB3aGVuIGNhc2UgJ2F0cy1zY29yZScgaXMgc2VsZWN0ZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBvcHVsYXRlQXRzU2NvcmVUYWIoKSB7XG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9jdW1lbnQtY29udGVudCcpO1xuICBpZiAoIWNvbnRlbnQpIHJldHVybjtcblxuICBjb25zdCBjYWNoZWQgPSBzdGF0ZU1hbmFnZXI/LmdldEF0c1Njb3JlPy4oKTtcbiAgaWYgKGNhY2hlZCkge1xuICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gYDxkaXYgc3R5bGU9XCJtYXgtd2lkdGg6NjgwcHg7bWFyZ2luOjAgYXV0bztcIj4ke19yZW5kZXJBdHNSZXBvcnQoY2FjaGVkKX08L2Rpdj5gO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJlbXB0eS1zdGF0ZVwiPjxkaXYgY2xhc3M9XCJpY29uXCI+XHVEODNEXHVEQ0NBPC9kaXY+PGgzPkFUUyBTY29yZTwvaDM+PHA+Q29tcGxldGUgam9iIGFuYWx5c2lzIGFuZCBza2lsbHMgcmV2aWV3IHRvIHNlZSB5b3VyIEFUUyBzY29yZTwvcD48YnV0dG9uIGNsYXNzPVwiYnRuLXByaW1hcnlcIiBvbmNsaWNrPVwicmVmcmVzaEF0c1Njb3JlKFxcJ3Jldmlld19jaGVja3BvaW50XFwnKS50aGVuKCgpPT5wb3B1bGF0ZUF0c1Njb3JlVGFiKCkpXCI+Q29tcHV0ZSBBVFMgU2NvcmU8L2J1dHRvbj48L2Rpdj4nO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNob3cvaGlkZSB0aGUgbW9kYWwgc2hvcnRjdXQgYnV0dG9ucyB3aGVuIEFUUyBiYWRnZSBiZWNvbWVzIHZpc2libGVcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFNob3cgb3IgaGlkZSB0aGUgQVRTIFJlcG9ydCBhbmQgSm9iIEFuYWx5c2lzIHNob3J0Y3V0IGJ1dHRvbnMuXG4gKiBEcml2ZW4gYnkgdGhlICdhdHMtc2NvcmUtdXBkYXRlZCcgY3VzdG9tIGV2ZW50IGRpc3BhdGNoZWQgYnkgYXBwLmpzXG4gKiB3aGVuZXZlciB1cGRhdGVBdHNCYWRnZSgpIHJ1bnMuIE5vIG1vbmtleS1wYXRjaGluZyByZXF1aXJlZC5cbiAqL1xuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignYXRzLXNjb3JlLXVwZGF0ZWQnLCAoKSA9PiB7XG4gIGNvbnN0IGJhZGdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F0cy1zY29yZS1iYWRnZScpO1xuICBjb25zdCB2aXNpYmxlID0gYmFkZ2UgJiYgYmFkZ2Uuc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnO1xuICBjb25zdCByZXBvcnRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXRzLXJlcG9ydC1idG4nKTtcbiAgY29uc3QgYW5hbHlzaXNCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnam9iLWFuYWx5c2lzLWJ0bicpO1xuICBpZiAocmVwb3J0QnRuKSByZXBvcnRCdG4uc3R5bGUuZGlzcGxheSA9IHZpc2libGUgPyAnaW5saW5lLWJsb2NrJyA6ICdub25lJztcbiAgaWYgKGFuYWx5c2lzQnRuKSBhbmFseXNpc0J0bi5zdHlsZS5kaXNwbGF5ID0gdmlzaWJsZSA/ICdpbmxpbmUtYmxvY2snIDogJ25vbmUnO1xufSk7XG5cbmV4cG9ydCB7XG4gIG9wZW5BdHNSZXBvcnRNb2RhbCxcbiAgY2xvc2VBdHNSZXBvcnRNb2RhbCxcbiAgX3JlbmRlckF0c1JlcG9ydCxcbiAgb3BlbkpvYkFuYWx5c2lzTW9kYWwsXG4gIGNsb3NlSm9iQW5hbHlzaXNNb2RhbCxcbiAgX3JlbmRlckFuYWx5c2lzSW50b0VsLFxuICBwb3B1bGF0ZUF0c1Njb3JlVGFiLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL3Nlc3Npb24tYWN0aW9ucy5qc1xuICogU2Vzc2lvbi1sZXZlbCBkaXNwYXRjaCAoc2VuZEFjdGlvbiksIHNhdmUsIGFuZCBwb3NpdGlvbiB0aXRsZSB1cGRhdGVzLlxuICpcbiAqIERFUEVOREVOQ0lFUyAoYWxsIG9uIGdsb2JhbFRoaXMgYXQgcnVudGltZSk6XG4gKiAgIC0gc3RhdGVNYW5hZ2VyIChzdGF0ZS1tYW5hZ2VyLmpzIFx1MjAxNCBpc0xvYWRpbmcoKS9zZXRUYWJEYXRhKCkpXG4gKiAgIC0gdXNlclNlbGVjdGlvbnMgKHdpbmRvdyBnbG9iYWwgZnJvbSBhcHApXG4gKiAgIC0gYXBwZW5kTG9hZGluZ01lc3NhZ2UsIHJlbW92ZUxvYWRpbmdNZXNzYWdlLCBhcHBlbmRNZXNzYWdlLCBhcHBlbmRSZXRyeU1lc3NhZ2VcbiAqICAgLSBzZXRMb2FkaW5nLCBsbG1GZXRjaCAoZmV0Y2gtdXRpbHMuanMpXG4gKiAgIC0gcGFyc2VNZXNzYWdlUmVzcG9uc2UsIHBhcnNlU3RhdHVzUmVzcG9uc2UgKHZhbGlkYXRvcnMuanMpXG4gKiAgIC0gaGFuZGxlQ3VzdG9taXphdGlvblJlc3BvbnNlIChyZXZpZXctdGFibGUtYmFzZS5qcywgVGllciA0KVxuICogICAtIHJlZnJlc2hBdHNTY29yZSwgc3dpdGNoVGFiLCBmZXRjaFN0YXR1cyAoZ2xvYmFsVGhpcylcbiAqICAgLSBjbGVhclN0YXRlLCBTdG9yYWdlS2V5cyAoc3RhdGUtbWFuYWdlci5qcyAvIGFwaS1jbGllbnQuanMpXG4gKiAgIC0gc2hvd0xvYWRKb2JQYW5lbCwgY2xlYXJKb2JJbnB1dCwgY2xlYXJVUkxJbnB1dCwgX2NsZWFyRmllbGRFcnJvcixcbiAqICAgICBfdXBkYXRlUGFzdGVDaGFyQ291bnQgKGpvYi1pbnB1dC5qcywgVGllciAzKVxuICogICAtIG5vcm1hbGl6ZVBvc2l0aW9uTGFiZWwsIGV4dHJhY3RUaXRsZUFuZENvbXBhbnlGcm9tSm9iVGV4dCxcbiAqICAgICBjbGVhbkpzb25SZXNwb25zZSAodXRpbHMuanMpXG4gKiAgIC0gX3VwZGF0ZVNlc3Npb25Td2l0Y2hlckhlYWRlciAoc2Vzc2lvbi1zd2l0Y2hlci11aS5qcywgVGllciA3KVxuICovXG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmNvbnN0IGxvZyA9IGdldExvZ2dlcignc2Vzc2lvbi1hY3Rpb25zJyk7XG5cbmltcG9ydCB7IFN0b3JhZ2VLZXlzIH0gZnJvbSAnLi9hcGktY2xpZW50LmpzJztcbmltcG9ydCB7IHN0YXRlTWFuYWdlciB9IGZyb20gJy4vc3RhdGUtbWFuYWdlci5qcyc7XG5cbi8qKiBNYXBzIGFjdGlvbiBpZGVudGlmaWVycyB0byBodW1hbi1yZWFkYWJsZSBMTE0gc3RhdHVzIGJhciBsYWJlbHMuICovXG5jb25zdCBfQUNUSU9OX0xBQkVMUyA9IHtcbiAgYW5hbHl6ZV9qb2I6ICAgICAgICAgICAgICAnQW5hbHlzaW5nIGpvYiBkZXNjcmlwdGlvblx1MjAyNicsXG4gIHJlY29tbWVuZF9jdXN0b21pemF0aW9uczogJ0dlbmVyYXRpbmcgY3VzdG9taXNhdGlvbiByZWNvbW1lbmRhdGlvbnNcdTIwMjYnLFxuICBnZW5lcmF0ZV9jdjogICAgICAgICAgICAgICdHZW5lcmF0aW5nIENWIGZpbGVzXHUyMDI2Jyxcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIHNlbmRBY3Rpb24oYWN0aW9uKSB7XG4gIGlmIChzdGF0ZU1hbmFnZXIuaXNMb2FkaW5nKCkpIHJldHVybjtcblxuICBjb25zdCBsb2FkaW5nTXNnID0gYXBwZW5kTG9hZGluZ01lc3NhZ2UoYEV4ZWN1dGluZyAke2FjdGlvbn0uLi5gKTtcbiAgc2V0TG9hZGluZyh0cnVlLCBfQUNUSU9OX0xBQkVMU1thY3Rpb25dIHx8IGAke2FjdGlvbi5yZXBsYWNlKC9fL2csICcgJyl9XHUyMDI2YCk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwYXlsb2FkID0geyBhY3Rpb24gfTtcbiAgICBpZiAoYWN0aW9uID09PSAncmVjb21tZW5kX2N1c3RvbWl6YXRpb25zJyAmJiB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzKSB7XG4gICAgICBwYXlsb2FkLnVzZXJfcHJlZmVyZW5jZXMgPSB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGxsbUZldGNoKCcvYXBpL2FjdGlvbicsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShwYXlsb2FkKSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gcGFyc2VNZXNzYWdlUmVzcG9uc2UoYXdhaXQgcmVzLmpzb24oKSk7XG5cbiAgICByZW1vdmVMb2FkaW5nTWVzc2FnZShsb2FkaW5nTXNnKTtcblxuICAgIGlmIChkYXRhLmVycm9yKSB7XG4gICAgICBhcHBlbmRSZXRyeU1lc3NhZ2UoJ1x1Mjc0QyBFcnJvcjogJyArIGRhdGEuZXJyb3IsICgpID0+IHNlbmRBY3Rpb24oYWN0aW9uKSk7XG4gICAgfSBlbHNlIGlmIChhY3Rpb24gPT09ICdyZWNvbW1lbmRfY3VzdG9taXphdGlvbnMnKSB7XG4gICAgICBjb25zdCBjdXN0b21pemF0aW9uRGF0YSA9IGRhdGEucmVzdWx0Py5jb250ZXh0X2RhdGE/LmN1c3RvbWl6YXRpb25zID8/IGRhdGEucmVzdWx0O1xuICAgICAgYXdhaXQgaGFuZGxlQ3VzdG9taXphdGlvblJlc3BvbnNlKGN1c3RvbWl6YXRpb25EYXRhKTtcbiAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PT0gJ2dlbmVyYXRlX2N2Jykge1xuICAgICAgY29uc3QgZ2VuZXJhdGlvbk1zZyA9IGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsICdcdTIzRjMgR2VuZXJhdGluZyBDViBmaWxlcyAoQVRTIERPQ1ggXHUyMTkyIEhUTUwgXHUyMTkyIEh1bWFuIERPQ1gpLi4uJyk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEyMDsgaSsrKSB7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCA1MDApKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBzdGF0dXNSZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvc3RhdHVzJyk7XG4gICAgICAgICAgY29uc3Qgc3RhdHVzRGF0YSA9IHBhcnNlU3RhdHVzUmVzcG9uc2UoYXdhaXQgc3RhdHVzUmVzLmpzb24oKSk7XG4gICAgICAgICAgY29uc3QgcHJvZ3Jlc3MgICA9IHN0YXR1c0RhdGEuZ2VuZXJhdGlvbl9wcm9ncmVzcyB8fCBbXTtcbiAgICAgICAgICBpZiAocHJvZ3Jlc3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgdG90YWwgPSBwcm9ncmVzcy5sZW5ndGg7XG4gICAgICAgICAgICBjb25zdCBkb25lQ291bnQgPSBwcm9ncmVzcy5maWx0ZXIocCA9PiBwLnN0YXR1cyA9PT0gJ2NvbXBsZXRlJykubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgYWN0aXZlID0gcHJvZ3Jlc3MuZmluZChwID0+IHAuc3RhdHVzICE9PSAnY29tcGxldGUnKTtcbiAgICAgICAgICAgIGNvbnN0IHN0ZXBMYWJlbCA9IGFjdGl2ZVxuICAgICAgICAgICAgICA/IGAke2FjdGl2ZS5zdGVwLnJlcGxhY2UoL18vZywgJyAnKX0gKCR7ZG9uZUNvdW50ICsgMX0gb2YgJHt0b3RhbH0pYFxuICAgICAgICAgICAgICA6IGAke3RvdGFsfSBvZiAke3RvdGFsfSBjb21wbGV0ZWA7XG4gICAgICAgICAgICBpZiAodHlwZW9mIF91cGRhdGVMTE1TdGF0dXNCYXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgX3VwZGF0ZUxMTVN0YXR1c0Jhcih0cnVlLCBgR2VuZXJhdGluZyBDVjogJHtzdGVwTGFiZWx9XHUyMDI2YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzdGVwcyA9IHByb2dyZXNzLm1hcChwID0+XG4gICAgICAgICAgICAgIGAke3Auc3RhdHVzID09PSAnY29tcGxldGUnID8gJ1x1MjcxMycgOiAnXHUyM0YzJ30gJHtwLnN0ZXAucmVwbGFjZSgvXy9nLCAnICcpfSAke3AuZWxhcHNlZF9tcyA/IGAoJHtwLmVsYXBzZWRfbXN9bXMpYCA6ICcnfWBcbiAgICAgICAgICAgICkuam9pbignIFx1MjAyMiAnKTtcbiAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uTXNnKSBnZW5lcmF0aW9uTXNnLnF1ZXJ5U2VsZWN0b3IoJy5jb250ZW50JykudGV4dENvbnRlbnQgPSBgR2VuZXJhdGluZyBDVjogJHtzdGVwc31gO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocHJvZ3Jlc3MuZXZlcnkocCA9PiBwLnN0YXR1cyA9PT0gJ2NvbXBsZXRlJykgJiYgcHJvZ3Jlc3MubGVuZ3RoID4gMCkgYnJlYWs7XG4gICAgICAgIH0gY2F0Y2ggKF9lKSB7IC8qIHBvbGxpbmcgZXJyb3IgXHUyMDE0IGNvbnRpbnVlICovIH1cbiAgICAgIH1cbiAgICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsICdDViBnZW5lcmF0ZWQgc3VjY2Vzc2Z1bGx5ISBSZXZpZXcgeW91ciBsYXlvdXQgYmVsb3cuJyk7XG4gICAgICBzdGF0ZU1hbmFnZXIuc2V0VGFiRGF0YSgnY3YnLCBkYXRhLnJlc3VsdCk7XG4gICAgICByZWZyZXNoQXRzU2NvcmUoJ3Bvc3RfZ2VuZXJhdGlvbicpO1xuICAgICAgc3dpdGNoVGFiKCdsYXlvdXQnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgZGF0YS5yZXN1bHQpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cuZXJyb3IoJz09PSBTRU5EIEFDVElPTiBFUlJPUiA9PT0nLCBhY3Rpb24sIGVycm9yKTtcbiAgICByZW1vdmVMb2FkaW5nTWVzc2FnZShsb2FkaW5nTXNnKTtcbiAgICBpZiAoZXJyb3IubmFtZSAhPT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICBhcHBlbmRSZXRyeU1lc3NhZ2UoJ1x1Mjc0QyBFcnJvcjogJyArIGVycm9yLm1lc3NhZ2UsICgpID0+IHNlbmRBY3Rpb24oYWN0aW9uKSk7XG4gICAgfVxuICB9XG5cbiAgc2V0TG9hZGluZyhmYWxzZSk7XG4gIGF3YWl0IGZldGNoU3RhdHVzKCk7XG4gIGlmICh0eXBlb2YgZmV0Y2hBbmREaXNwbGF5TGxtTG9nID09PSAnZnVuY3Rpb24nKSBmZXRjaEFuZERpc3BsYXlMbG1Mb2coKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZVNlc3Npb24oKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL3NhdmUnLCB7IG1ldGhvZDogJ1BPU1QnIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBpZiAoZGF0YS5zZXNzaW9uX2ZpbGUpIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFN0b3JhZ2VLZXlzLlNFU1NJT05fUEFUSCwgZGF0YS5zZXNzaW9uX2ZpbGUpO1xuICAgICAgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgJ1Nlc3Npb24gc2F2ZWQgc3VjY2Vzc2Z1bGx5LicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcHBlbmRSZXRyeU1lc3NhZ2UoJ1x1Mjc0QyBFcnJvciBzYXZpbmcgc2Vzc2lvbjogJyArIGRhdGEuZXJyb3IsIHNhdmVTZXNzaW9uKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nLmVycm9yKCc9PT0gU0FWRSBTRVNTSU9OIEVSUk9SID09PScsIGVycm9yKTtcbiAgICBhcHBlbmRSZXRyeU1lc3NhZ2UoJ1x1Mjc0QyBFcnJvcjogJyArIGVycm9yLm1lc3NhZ2UsIHNhdmVTZXNzaW9uKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfZm9ybWF0QmFyRGF0ZSh2YWx1ZSkge1xuICBjb25zdCB0ZXh0ID0gU3RyaW5nKHZhbHVlIHx8ICcnKS50cmltKCk7XG4gIGlmICghdGV4dCkgcmV0dXJuICcnO1xuICBpZiAoL15cXGR7NH0tXFxkezJ9LVxcZHsyfSQvLnRlc3QodGV4dCkpIHtcbiAgICBjb25zdCBbeWVhciwgbW9udGgsIGRheV0gPSB0ZXh0LnNwbGl0KCctJyk7XG4gICAgcmV0dXJuIGAke21vbnRofS8ke2RheX0vJHt5ZWFyfWA7XG4gIH1cbiAgY29uc3QgcGFyc2VkID0gbmV3IERhdGUodGV4dCk7XG4gIGlmICghTnVtYmVyLmlzTmFOKHBhcnNlZC5nZXRUaW1lKCkpKSB7XG4gICAgcmV0dXJuIHBhcnNlZC50b0lTT1N0cmluZygpLnNsaWNlKDAsIDEwKTtcbiAgfVxuICByZXR1cm4gdGV4dDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlUG9zaXRpb25UaXRsZShzdGF0dXMgPSB7fSkge1xuICBjb25zdCBwb3NpdGlvbkVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Bvc2l0aW9uLXRpdGxlJyk7XG4gIGlmICghcG9zaXRpb25FbCkgcmV0dXJuO1xuXG4gIGNvbnN0IGZhbGxiYWNrQnJvd3NlclRpdGxlID0gJ0NWIEJ1aWxkZXIgXHUyMDE0IFByb2Zlc3Npb25hbCBXZWIgVUknO1xuICBsZXQgbGFiZWwgPSAoc3RhdHVzLnBvc2l0aW9uX25hbWUgfHwgJycpLnRvU3RyaW5nKCkudHJpbSgpO1xuICBsZXQgY29tcGFueSA9ICcnO1xuICBsZXQgZGF0ZUFwcGxpZWQgPSAnJztcblxuICBpZiAoIWxhYmVsICYmIHN0YXR1cy5qb2JfYW5hbHlzaXMpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYW5hbHlzaXMgPSB0eXBlb2Ygc3RhdHVzLmpvYl9hbmFseXNpcyA9PT0gJ3N0cmluZydcbiAgICAgICAgPyBKU09OLnBhcnNlKGNsZWFuSnNvblJlc3BvbnNlKHN0YXR1cy5qb2JfYW5hbHlzaXMpKVxuICAgICAgICA6IHN0YXR1cy5qb2JfYW5hbHlzaXM7XG4gICAgICBjb25zdCB0aXRsZSA9IGFuYWx5c2lzPy5qb2JfdGl0bGUgfHwgYW5hbHlzaXM/LnRpdGxlIHx8IGFuYWx5c2lzPy5wb3NpdGlvbl9uYW1lIHx8ICcnO1xuICAgICAgbGFiZWwgPSBub3JtYWxpemVQb3NpdGlvbkxhYmVsKHRpdGxlLCBhbmFseXNpcz8uY29tcGFueSk7XG4gICAgICBjb21wYW55ID0gKGFuYWx5c2lzPy5jb21wYW55X25hbWUgfHwgYW5hbHlzaXM/LmNvbXBhbnkgfHwgJycpLnRyaW0oKTtcbiAgICAgIGRhdGVBcHBsaWVkID0gX2Zvcm1hdEJhckRhdGUoYW5hbHlzaXM/LmRhdGVfYXBwbGllZCB8fCBhbmFseXNpcz8uYXBwbGljYXRpb25fZGF0ZSB8fCAnJyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZy53YXJuKCdGYWlsZWQgdG8gcGFyc2Ugam9iX2FuYWx5c2lzIGZvciB0aXRsZTonLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFsYWJlbCAmJiBzdGF0dXMuam9iX2Rlc2NyaXB0aW9uX3RleHQpIHtcbiAgICBjb25zdCBwYXJzZWQgPSBleHRyYWN0VGl0bGVBbmRDb21wYW55RnJvbUpvYlRleHQoc3RhdHVzLmpvYl9kZXNjcmlwdGlvbl90ZXh0KTtcbiAgICBsYWJlbCA9IG5vcm1hbGl6ZVBvc2l0aW9uTGFiZWwocGFyc2VkLnRpdGxlLCBwYXJzZWQuY29tcGFueSk7XG4gICAgaWYgKCFjb21wYW55KSBjb21wYW55ID0gKHBhcnNlZC5jb21wYW55IHx8ICcnKS50cmltKCk7XG4gIH1cblxuICBwb3NpdGlvbkVsLnRleHRDb250ZW50ID0gbGFiZWw7XG4gIGRvY3VtZW50LnRpdGxlID0gbGFiZWwgPyBgJHtsYWJlbH0gXHUyMDE0IENWIEJ1aWxkZXJgIDogZmFsbGJhY2tCcm93c2VyVGl0bGU7XG5cbiAgY29uc3QgcG9zaXRpb25Db21wYW55RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncG9zaXRpb24tY29tcGFueScpO1xuICBpZiAocG9zaXRpb25Db21wYW55RWwpIHtcbiAgICBjb25zdCBpbnRha2UgPSB3aW5kb3cuX3N0YXR1c0ludGFrZSB8fCB7fTtcbiAgICBjb25zdCBmaW5hbENvbXBhbnkgPSAoaW50YWtlLmNvbXBhbnkgfHwgJycpLnRyaW0oKSB8fCBjb21wYW55O1xuICAgIGNvbnN0IGZpbmFsRGF0ZSA9IGRhdGVBcHBsaWVkIHx8IF9mb3JtYXRCYXJEYXRlKGludGFrZS5kYXRlX2FwcGxpZWQgfHwgJycpO1xuICAgIGNvbnN0IHN1YnRpdGxlID0gW2ZpbmFsQ29tcGFueSwgZmluYWxEYXRlXS5maWx0ZXIoQm9vbGVhbikuam9pbignICBcdTAwQjcgICcpO1xuICAgIHBvc2l0aW9uQ29tcGFueUVsLnRleHRDb250ZW50ID0gc3VidGl0bGU7XG4gICAgcG9zaXRpb25Db21wYW55RWwuc3R5bGUuZGlzcGxheSA9IHN1YnRpdGxlID8gJycgOiAnbm9uZSc7XG4gIH1cblxuICBjb25zdCByZW5hbWVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVuYW1lLXNlc3Npb24tYnRuJyk7XG4gIGlmIChyZW5hbWVCdG4pIHJlbmFtZUJ0bi5zdHlsZS5kaXNwbGF5ID0gbGFiZWwgPyAnJyA6ICdub25lJztcbiAgaWYgKHR5cGVvZiBfdXBkYXRlU2Vzc2lvblN3aXRjaGVySGVhZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgX3VwZGF0ZVNlc3Npb25Td2l0Y2hlckhlYWRlcih7IHBvc2l0aW9uX25hbWU6IGxhYmVsLCBwaGFzZTogc3RhdHVzLnBoYXNlIHx8IG51bGwgfSk7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIEVTIG1vZHVsZSBleHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuZXhwb3J0IHsgc2VuZEFjdGlvbiwgc2F2ZVNlc3Npb24sIHVwZGF0ZVBvc2l0aW9uVGl0bGUsIF9BQ1RJT05fTEFCRUxTIH07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9qb2ItYW5hbHlzaXMuanNcbiAqIEpvYiBhbmFseXNpcyBvcmNoZXN0cmF0aW9uOiBmaXJlcyBhbmFseXplX2pvYiBhY3Rpb24sIG1lcmdlcyBwb3N0LWFuYWx5c2lzXG4gKiBxdWVzdGlvbnMsIGFuZCB0cmFuc2l0aW9ucyB0aGUgVUkgdG8gdGhlIGFuYWx5c2lzIHRhYi5cbiAqXG4gKiBERVBFTkRFTkNJRVMgKGFsbCBvbiBnbG9iYWxUaGlzIGF0IHJ1bnRpbWUpOlxuICogICAtIHN0YXRlTWFuYWdlciAoc3RhdGUtbWFuYWdlci5qcyBcdTIwMTQgaXNMb2FkaW5nKCkvc2V0VGFiRGF0YSgpKVxuICogICAtIGxsbUZldGNoLCBzZXRMb2FkaW5nIChmZXRjaC11dGlscy5qcylcbiAqICAgLSBhcHBlbmRMb2FkaW5nTWVzc2FnZSwgcmVtb3ZlTG9hZGluZ01lc3NhZ2UsIGFwcGVuZE1lc3NhZ2UsXG4gKiAgICAgYXBwZW5kUmV0cnlNZXNzYWdlLCBhcHBlbmRGb3JtYXR0ZWRBbmFseXNpcyAobWVzc2FnZS1xdWV1ZS5qcylcbiAqICAgLSBwYXJzZU1lc3NhZ2VSZXNwb25zZSAodmFsaWRhdG9ycy5qcylcbiAqICAgLSBhc2tQb3N0QW5hbHlzaXNRdWVzdGlvbnMgKHF1ZXN0aW9ucy1wYW5lbC5qcylcbiAqICAgLSByZWZyZXNoQXRzU2NvcmUgKGF0cy1yZWZpbmVtZW50LmpzKVxuICogICAtIHN3aXRjaFRhYiAocmV2aWV3LXRhYmxlLWJhc2UuanMsIFRpZXIgNClcbiAqICAgLSBmZXRjaFN0YXR1cyAoYXBwLmpzIG9yY2hlc3RyYXRvciwgVGllciA4KVxuICogICAtIF9zaG93SW50YWtlQ29uZmlybUNhcmQsIF9wcm9jZWVkQWZ0ZXJJbnRha2UgKG1lc3NhZ2UtZGlzcGF0Y2guanMsIFRpZXIgMylcbiAqL1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5jb25zdCBsb2cgPSBnZXRMb2dnZXIoJ2pvYi1hbmFseXNpcycpO1xuXG5pbXBvcnQgeyBTdG9yYWdlS2V5cyB9IGZyb20gJy4vYXBpLWNsaWVudC5qcyc7XG5pbXBvcnQgeyBzdGF0ZU1hbmFnZXIgfSBmcm9tICcuL3N0YXRlLW1hbmFnZXIuanMnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFBvc3QtYW5hbHlzaXMgcXVlc3Rpb24gaGVscGVyc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBOb3JtYWxpc2UgYSByYXcgcXVlc3Rpb25zIGFycmF5IHRvIFt7cXVlc3Rpb24sIHR5cGUsIGNob2ljZXN9XS4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBvc3RBbmFseXNpc1F1ZXN0aW9ucyhyYXdRdWVzdGlvbnMpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHJhd1F1ZXN0aW9ucykpIHJldHVybiBbXTtcbiAgcmV0dXJuIHJhd1F1ZXN0aW9uc1xuICAgIC5maWx0ZXIocSA9PiBxICYmIHR5cGVvZiBxLnF1ZXN0aW9uID09PSAnc3RyaW5nJyAmJiBxLnF1ZXN0aW9uLnRyaW0oKSlcbiAgICAubWFwKChxLCBpZHgpID0+ICh7XG4gICAgICBxdWVzdGlvbjogcS5xdWVzdGlvbi50cmltKCksXG4gICAgICB0eXBlOiAgICAgKHEudHlwZSB8fCBgY2xhcmlmaWNhdGlvbl8ke2lkeCArIDF9YCkudG9TdHJpbmcoKSxcbiAgICAgIGNob2ljZXM6ICBBcnJheS5pc0FycmF5KHEuY2hvaWNlcykgPyBxLmNob2ljZXMgOiBbXSxcbiAgICB9KSk7XG59XG5cbi8qKlxuICogRXh0cmFjdCBudW1iZXJlZC1saXN0IHF1ZXN0aW9ucyBmcm9tIHVuc3RydWN0dXJlZCBhc3Npc3RhbnQgdGV4dC5cbiAqIFJldHVybnMgYXQgbW9zdCA0IHF1ZXN0aW9ucy5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdFN0cnVjdHVyZWRRdWVzdGlvbnNGcm9tQXNzaXN0YW50VGV4dCh0ZXh0KSB7XG4gIGlmICh0eXBlb2YgdGV4dCAhPT0gJ3N0cmluZycgfHwgIXRleHQudHJpbSgpKSByZXR1cm4gW107XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSB0ZXh0LnJlcGxhY2UoL1xcclxcbi9nLCAnXFxuJyk7XG4gIGNvbnN0IGJsb2NrcyA9IG5vcm1hbGl6ZWQuc3BsaXQoL15cXHMqXFxkK1xcLlxccysvbSk7XG4gIGlmIChibG9ja3MubGVuZ3RoIDw9IDEpIHJldHVybiBbXTtcbiAgcmV0dXJuIGJsb2Nrc1xuICAgIC5zbGljZSgxKVxuICAgIC5tYXAoKGJsb2NrLCBpZHgpID0+IHtcbiAgICAgIGNvbnN0IHF1ZXN0aW9uID0gYmxvY2sudHJpbSgpO1xuICAgICAgaWYgKCFxdWVzdGlvbikgcmV0dXJuIG51bGw7XG4gICAgICByZXR1cm4geyBxdWVzdGlvbjogcXVlc3Rpb24uc2xpY2UoMCwgNDAwMCksIHR5cGU6IGBjbGFyaWZpY2F0aW9uXyR7aWR4ICsgMX1gLCBjaG9pY2VzOiBbXSB9O1xuICAgIH0pXG4gICAgLmZpbHRlcihCb29sZWFuKVxuICAgIC5zbGljZSgwLCA0KTtcbn1cblxuLyoqXG4gKiBNZXJnZSBzZXJ2ZXItcHJvdmlkZWQgcXVlc3Rpb25zIHdpdGggdGhvc2UgZXh0cmFjdGVkIGZyb20gdGhlIGFzc2lzdGFudCB0ZXh0LFxuICogZGUtZHVwbGljYXRpbmcgYnkgcXVlc3Rpb24gdGV4dCBhbmQgdHlwZS5cbiAqL1xuZnVuY3Rpb24gbWVyZ2VQb3N0QW5hbHlzaXNRdWVzdGlvbnMoZXhpc3RpbmdRdWVzdGlvbnMsIGluY29taW5nUXVlc3Rpb25zKSB7XG4gIGNvbnN0IGV4aXN0aW5nID0gbm9ybWFsaXplUG9zdEFuYWx5c2lzUXVlc3Rpb25zKGV4aXN0aW5nUXVlc3Rpb25zKTtcbiAgY29uc3QgaW5jb21pbmcgPSBub3JtYWxpemVQb3N0QW5hbHlzaXNRdWVzdGlvbnMoaW5jb21pbmdRdWVzdGlvbnMpO1xuXG4gIGNvbnN0IG1lcmdlZCAgICAgICAgPSBbLi4uZXhpc3RpbmddO1xuICBjb25zdCBzZWVuQnlRdWVzdGlvbiA9IG5ldyBTZXQoZXhpc3RpbmcubWFwKHEgPT4gcS5xdWVzdGlvbi50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xccysvZywgJyAnKS50cmltKCkpKTtcbiAgY29uc3QgdXNlZFR5cGVzICAgICAgPSBuZXcgU2V0KGV4aXN0aW5nLm1hcChxID0+IHEudHlwZSkpO1xuXG4gIGluY29taW5nLmZvckVhY2goKHEsIGlkeCkgPT4ge1xuICAgIGNvbnN0IGtleSA9IHEucXVlc3Rpb24udG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXHMrL2csICcgJykudHJpbSgpO1xuICAgIGlmICgha2V5IHx8IHNlZW5CeVF1ZXN0aW9uLmhhcyhrZXkpKSByZXR1cm47XG4gICAgbGV0IHR5cGUgPSBxLnR5cGUgfHwgYGNsYXJpZmljYXRpb25fJHttZXJnZWQubGVuZ3RoICsgaWR4ICsgMX1gO1xuICAgIGlmICh1c2VkVHlwZXMuaGFzKHR5cGUpKSB0eXBlID0gYCR7dHlwZX1fJHttZXJnZWQubGVuZ3RoICsgaWR4ICsgMX1gO1xuICAgIG1lcmdlZC5wdXNoKHsgcXVlc3Rpb246IHEucXVlc3Rpb24sIHR5cGUsIGNob2ljZXM6IEFycmF5LmlzQXJyYXkocS5jaG9pY2VzKSA/IHEuY2hvaWNlcyA6IFtdIH0pO1xuICAgIHNlZW5CeVF1ZXN0aW9uLmFkZChrZXkpO1xuICAgIHVzZWRUeXBlcy5hZGQodHlwZSk7XG4gIH0pO1xuXG4gIHJldHVybiBtZXJnZWQ7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gYW5hbHl6ZUpvYlxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmFzeW5jIGZ1bmN0aW9uIGFuYWx5emVKb2IoKSB7XG4gIGlmIChzdGF0ZU1hbmFnZXIuaXNMb2FkaW5nKCkpIHJldHVybjtcblxuICBpZiAoIWxvY2FsU3RvcmFnZS5nZXRJdGVtKFN0b3JhZ2VLZXlzLkxMTV9ESVNDTE9TVVJFX1NIT1dOKSkge1xuICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsICdcdTIxMzlcdUZFMEYgQ29udGVudCB5b3Ugc3VibWl0IGlzIHNlbnQgdG8gdGhlIGNvbmZpZ3VyZWQgTExNIHByb3ZpZGVyIGZvciBhbmFseXNpcy4gUmV2aWV3IHlvdXIgcHJvdmlkZXJcXCdzIGRhdGEgcG9saWN5IGZvciBkZXRhaWxzLicpO1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFN0b3JhZ2VLZXlzLkxMTV9ESVNDTE9TVVJFX1NIT1dOLCAnMScpO1xuICB9XG5cbiAgY29uc3QgbG9hZGluZ01zZyA9IGFwcGVuZExvYWRpbmdNZXNzYWdlKCdBbmFseXppbmcgam9iIGRlc2NyaXB0aW9uLi4uJyk7XG4gIHNldExvYWRpbmcodHJ1ZSwgJ0FuYWx5c2luZyBqb2IgZGVzY3JpcHRpb25cdTIwMjYnKTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBsbG1GZXRjaCgnL2FwaS9hY3Rpb24nLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBhY3Rpb246ICdhbmFseXplX2pvYicgfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IHBhcnNlTWVzc2FnZVJlc3BvbnNlKGF3YWl0IHJlcy5qc29uKCkpO1xuXG4gICAgcmVtb3ZlTG9hZGluZ01lc3NhZ2UobG9hZGluZ01zZyk7XG5cbiAgICBpZiAoZGF0YS5lcnJvcikge1xuICAgICAgYXBwZW5kUmV0cnlNZXNzYWdlKCdcdTI3NEMgRXJyb3I6ICcgKyBkYXRhLmVycm9yLCBhbmFseXplSm9iKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcmVzdWx0ICAgICAgID0gZGF0YS5yZXN1bHQ7XG4gICAgICBjb25zdCBhbmFseXNpc1RleHQgPSB0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJyA/IHJlc3VsdCA6IChyZXN1bHQ/LnRleHQpIHx8IG51bGw7XG4gICAgICBjb25zdCBhbmFseXNpc0RhdGEgPSB0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0JyAmJiByZXN1bHQgIT09IG51bGxcbiAgICAgICAgPyAocmVzdWx0LmNvbnRleHRfZGF0YT8uam9iX2FuYWx5c2lzID8/IHJlc3VsdClcbiAgICAgICAgOiByZXN1bHQ7XG4gICAgICBjb25zdCBjb250ZXh0UXVlc3Rpb25zID0gKHR5cGVvZiByZXN1bHQgPT09ICdvYmplY3QnICYmIHJlc3VsdCAhPT0gbnVsbClcbiAgICAgICAgPyByZXN1bHQuY29udGV4dF9kYXRhPy5wb3N0X2FuYWx5c2lzX3F1ZXN0aW9uc1xuICAgICAgICA6IG51bGw7XG4gICAgICBjb25zdCBzdHJ1Y3R1cmVkUXVlc3Rpb25zID0gbWVyZ2VQb3N0QW5hbHlzaXNRdWVzdGlvbnMoXG4gICAgICAgIGNvbnRleHRRdWVzdGlvbnMsXG4gICAgICAgIChjb250ZXh0UXVlc3Rpb25zICYmIGNvbnRleHRRdWVzdGlvbnMubGVuZ3RoID4gMClcbiAgICAgICAgICA/IFtdXG4gICAgICAgICAgOiBleHRyYWN0U3RydWN0dXJlZFF1ZXN0aW9uc0Zyb21Bc3Npc3RhbnRUZXh0KGFuYWx5c2lzVGV4dCksXG4gICAgICApO1xuXG4gICAgICBpZiAoYW5hbHlzaXNUZXh0KSBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCBhbmFseXNpc1RleHQpO1xuICAgICAgYXBwZW5kRm9ybWF0dGVkQW5hbHlzaXMoYW5hbHlzaXNEYXRhKTtcbiAgICAgIHN0YXRlTWFuYWdlci5zZXRUYWJEYXRhKCdhbmFseXNpcycsIGFuYWx5c2lzRGF0YSk7XG4gICAgICByZWZyZXNoQXRzU2NvcmUoJ2FuYWx5c2lzJyk7XG4gICAgICBzd2l0Y2hUYWIoJ2FuYWx5c2lzJyk7XG5cbiAgICAgIGNvbnN0IGNvbnRpbnVlQWZ0ZXJJbnRha2UgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGFza1Bvc3RBbmFseXNpc1F1ZXN0aW9ucyhhbmFseXNpc0RhdGEsIHN0cnVjdHVyZWRRdWVzdGlvbnMpO1xuICAgICAgfTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaW50YWtlUmVzICA9IGF3YWl0IGxsbUZldGNoKCcvYXBpL2ludGFrZS1tZXRhZGF0YScpO1xuICAgICAgICBjb25zdCBpbnRha2VEYXRhID0gYXdhaXQgaW50YWtlUmVzLmpzb24oKTtcbiAgICAgICAgaWYgKGludGFrZURhdGEuY29uZmlybWVkKSB7XG4gICAgICAgICAgYXdhaXQgX3Byb2NlZWRBZnRlckludGFrZShjb250aW51ZUFmdGVySW50YWtlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhd2FpdCBfc2hvd0ludGFrZUNvbmZpcm1DYXJkKGNvbnRpbnVlQWZ0ZXJJbnRha2UpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChfZSkge1xuICAgICAgICBhd2FpdCBjb250aW51ZUFmdGVySW50YWtlKCk7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy5lcnJvcignPT09IEFOQUxZWkUgSk9CIEVSUk9SID09PScsIGVycm9yKTtcbiAgICByZW1vdmVMb2FkaW5nTWVzc2FnZShsb2FkaW5nTXNnKTtcbiAgICBpZiAoZXJyb3IubmFtZSAhPT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICBhcHBlbmRSZXRyeU1lc3NhZ2UoJ1x1Mjc0QyBFcnJvcjogJyArIGVycm9yLm1lc3NhZ2UsIGFuYWx5emVKb2IpO1xuICAgIH1cbiAgfVxuXG4gIHNldExvYWRpbmcoZmFsc2UpO1xuICAvLyBVcGRhdGUgdGhlIHBvc2l0aW9uLXRpdGxlIGJhciB3aXRoIHRoZSBsYXRlc3Qgc2Vzc2lvbiBuYW1lIGFmdGVyIGFuYWx5c2lzLlxuICB0cnkge1xuICAgIGNvbnN0IGxhdGVzdFN0YXR1cyA9IGF3YWl0IGZldGNoU3RhdHVzKCk7XG4gICAgaWYgKGxhdGVzdFN0YXR1cyAmJiB0eXBlb2YgdXBkYXRlUG9zaXRpb25UaXRsZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdXBkYXRlUG9zaXRpb25UaXRsZShsYXRlc3RTdGF0dXMpO1xuICAgIH1cbiAgfSBjYXRjaCAoX2UpIHsgLyogbm9uLWZhdGFsICovIH1cbiAgaWYgKHR5cGVvZiBmZXRjaEFuZERpc3BsYXlMbG1Mb2cgPT09ICdmdW5jdGlvbicpIGZldGNoQW5kRGlzcGxheUxsbUxvZygpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgRVMgbW9kdWxlIGV4cG9ydHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5leHBvcnQge1xuICBub3JtYWxpemVQb3N0QW5hbHlzaXNRdWVzdGlvbnMsXG4gIGV4dHJhY3RTdHJ1Y3R1cmVkUXVlc3Rpb25zRnJvbUFzc2lzdGFudFRleHQsXG4gIG1lcmdlUG9zdEFuYWx5c2lzUXVlc3Rpb25zLFxuICBhbmFseXplSm9iLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL2dvYWxzLmpzIFx1MjAxNCBHZW5lcmF0aW9uIEdvYWxzIGNvbmZpZ3VyYXRpb24gdGFiLlxuICpcbiAqIEFsbG93cyB0aGUgdXNlciB0byBzZXQgZG9jdW1lbnQtbGVuZ3RoIGFuZCBjaGFyYWN0ZXItY291bnQgY29uc3RyYWludHMgdGhhdFxuICogYXJlIGluamVjdGVkIGludG8gZXZlcnkgTExNIHByb21wdCBhbmQgdXNlZCB0byBjb250cm9sIHRoZSBmaW5hbCBQREYgbGVuZ3RoLlxuICpcbiAqIEZpZWxkczpcbiAqICAgcGRmX3BhZ2VzX2VuYWJsZWQgICAgXHUyMDE0IHdoZXRoZXIgdGhlIFBERiBwYWdlIGdvYWwgaXMgYWN0aXZlXG4gKiAgIG1heF9wZGZfcGFnZXNfbW9kZSAgIFx1MjAxNCAnY29tYmluZWQnIHwgJ3NwbGl0J1xuICogICBtYXhfcGRmX3BhZ2VzICAgICAgICBcdTIwMTQgY29tYmluZWQgdG90YWwgUERGIHBhZ2UgZ29hbCAobW9kZT1jb21iaW5lZClcbiAqICAgbWF4X3BkZl9yZXN1bWVfcGFnZXMgXHUyMDE0IHJlc3VtZS1wb3J0aW9uIHBhZ2UgZ29hbCAobW9kZT1zcGxpdClcbiAqICAgbWF4X3BkZl9jdl9wYWdlcyAgICAgXHUyMDE0IENWL3B1YmxpY2F0aW9ucyBwb3J0aW9uIHBhZ2UgZ29hbCAobW9kZT1zcGxpdClcbiAqICAgYXRzX3BhZ2VzX2VuYWJsZWQgICAgXHUyMDE0IHdoZXRoZXIgdGhlIEFUUyBwYWdlIGdvYWwgaXMgYWN0aXZlXG4gKiAgIG1heF9hdHNfcGFnZXMgICAgICAgIFx1MjAxNCB0YXJnZXQgcGFnZSBjb3VudCBmb3IgQVRTIHBsYWluLXRleHQgb3V0cHV0XG4gKiAgIGF0c19jaGFyc19lbmFibGVkICAgIFx1MjAxNCB3aGV0aGVyIHRoZSBBVFMgY2hhcmFjdGVyIGxpbWl0IGlzIGFjdGl2ZSAoZGVmYXVsdCBmYWxzZSlcbiAqICAgbWF4X2F0c19jaGFycyAgICAgICAgXHUyMDE0IG1heGltdW0gY2hhcmFjdGVycyAoaW5jbHVkaW5nIHNwYWNlcykgZm9yIEFUUyB0ZXh0XG4gKlxuICogRWFjaCBnb2FsIGhhcyBhIGNoZWNrYm94IHRvIGVuYWJsZSBvciBkaXNhYmxlIGl0OyBkaXNhYmxlZCBnb2FscyBhcmUgbm90XG4gKiBzZW50IHRvIHRoZSBiYWNrZW5kIGFuZCBhcmUgbm90IGluamVjdGVkIGludG8gcHJvbXB0cy5cbiAqXG4gKiBERVBFTkRFTkNJRVMgKGF2YWlsYWJsZSBvbiBnbG9iYWxUaGlzIHZpYSBtYWluLmpzKTpcbiAqICAgYXBpQ2FsbCAoYXBpLWNsaWVudC5qcylcbiAqL1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5cbmNvbnN0IGxvZyA9IGdldExvZ2dlcignZ29hbHMnKTtcblxuY29uc3QgR09BTFNfREVGQVVMVFMgPSB7XG4gIHBkZl9wYWdlc19lbmFibGVkOiAgICB0cnVlLFxuICBtYXhfcGRmX3BhZ2VzX21vZGU6ICAgJ2NvbWJpbmVkJyxcbiAgbWF4X3BkZl9wYWdlczogICAgICAgIDIsXG4gIG1heF9wZGZfcmVzdW1lX3BhZ2VzOiAyLFxuICBtYXhfcGRmX2N2X3BhZ2VzOiAgICAgMSxcbiAgYXRzX3BhZ2VzX2VuYWJsZWQ6ICAgIHRydWUsXG4gIG1heF9hdHNfcGFnZXM6ICAgICAgICAxLFxuICBhdHNfY2hhcnNfZW5hYmxlZDogICAgZmFsc2UsXG4gIG1heF9hdHNfY2hhcnM6ICAgICAgICA1MDAwLFxufTtcblxuLyoqIFNoYXJlZCBpbmxpbmUgc3R5bGVzICovXG5jb25zdCBTID0ge1xuICBzZWN0aW9uOiAgICAnbWFyZ2luLWJvdHRvbToyMHB4O2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyLCNlMGUwZTApO2JvcmRlci1yYWRpdXM6NnB4O3BhZGRpbmc6MTZweCcsXG4gIGhlYWRlcjogICAgICdkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDoxMHB4O21hcmdpbi1ib3R0b206MTJweCcsXG4gIGNoZWNrYm94OiAgICd3aWR0aDoxNnB4O2hlaWdodDoxNnB4O2N1cnNvcjpwb2ludGVyO2ZsZXgtc2hyaW5rOjAnLFxuICBsYWJlbDogICAgICAnZm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxcmVtO2N1cnNvcjpwb2ludGVyO21hcmdpbjowJyxcbiAgaGludDogICAgICAgJ2ZvbnQtc2l6ZTowLjg3NXJlbTtjb2xvcjp2YXIoLS10ZXh0LXNlY29uZGFyeSwjNTU1KTttYXJnaW46MCAwIDhweCcsXG4gIG51bUlucHV0OiAgICdwYWRkaW5nOjZweCAxMHB4O2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyLCNjY2MpO2JvcmRlci1yYWRpdXM6NHB4O2ZvbnQtc2l6ZToxcmVtJyxcbiAgcm93OiAgICAgICAgJ2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweCcsXG4gIG11dGVkOiAgICAgICdjb2xvcjp2YXIoLS10ZXh0LXNlY29uZGFyeSwjNTU1KScsXG4gIHJhZGlvTGFiZWw6ICdkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6ZmxleC1zdGFydDtnYXA6OHB4O2N1cnNvcjpwb2ludGVyJyxcbiAgcmFkaW9JbnB1dDogJ21hcmdpbi10b3A6M3B4Jyxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwb3B1bGF0ZUdvYWxzVGFiKCkge1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgaWYgKCFjb250ZW50KSByZXR1cm47XG5cbiAgY29udGVudC5pbm5lckhUTUwgPSBgXG4gICAgPGRpdiBjbGFzcz1cImdvYWxzLXBhbmVsXCIgc3R5bGU9XCJtYXgtd2lkdGg6NjQwcHg7bWFyZ2luOjAgYXV0bztwYWRkaW5nOjI4cHggMjRweFwiPlxuICAgICAgPGgyIHN0eWxlPVwibWFyZ2luLXRvcDowO21hcmdpbi1ib3R0b206OHB4XCI+XHVEODNDXHVERkFGIEdlbmVyYXRpb24gR29hbHM8L2gyPlxuICAgICAgPHAgc3R5bGU9XCIke1MubXV0ZWR9O21hcmdpbi1ib3R0b206MjRweDtsaW5lLWhlaWdodDoxLjVcIj5cbiAgICAgICAgU2V0IG9wdGlvbmFsIGxlbmd0aCBjb25zdHJhaW50cyBmb3IgdGhlIGdlbmVyYXRlZCBDVi5cbiAgICAgICAgQ2hlY2sgZWFjaCBnb2FsIHlvdSB3YW50IHRvIGVuZm9yY2U7IHVuY2hlY2tlZCBnb2FscyBhcmUgaWdub3JlZC5cbiAgICAgICAgVGhlc2UgZ3VpZGUgdGhlIEFJIGF0IGV2ZXJ5IGVkaXRpbmcgc3RhZ2UgYW5kIGNvbnRyb2wgdGhlIGZpbmFsIGRvY3VtZW50IGxlbmd0aC5cbiAgICAgIDwvcD5cblxuICAgICAgPCEtLSBcdTI1MDBcdTI1MDAgUERGIFBhZ2UgTGVuZ3RoIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMCAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJnb2Fscy1zZWN0aW9uXCIgc3R5bGU9XCIke1Muc2VjdGlvbn1cIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cIiR7Uy5oZWFkZXJ9XCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiZ29hbHMtcGRmLWVuYWJsZWRcIlxuICAgICAgICAgICAgICAgICBvbmNoYW5nZT1cImdvYWxzVG9nZ2xlU2VjdGlvbigncGRmJylcIlxuICAgICAgICAgICAgICAgICBjaGVja2VkIHN0eWxlPVwiJHtTLmNoZWNrYm94fVwiPlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJnb2Fscy1wZGYtZW5hYmxlZFwiIHN0eWxlPVwiJHtTLmxhYmVsfVwiPlBERiBQYWdlIExlbmd0aDwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwiZ29hbHMtcGRmLWJvZHlcIj5cbiAgICAgICAgICA8cCBzdHlsZT1cIiR7Uy5oaW50fVwiPlxuICAgICAgICAgICAgVGFyZ2V0IHBhZ2UgY291bnQgZm9yIHRoZSBodW1hbi1yZWFkYWJsZSBQREYgKGUuZy4gMVx1MjAxMzMpLlxuICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtnYXA6MTJweFwiPlxuXG4gICAgICAgICAgICA8IS0tIFx1MjUwMFx1MjUwMCBTaW5nbGUgdG90YWwgb3B0aW9uIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMCAtLT5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBzdHlsZT1cIiR7Uy5yYWRpb0xhYmVsfVwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwiZ29hbHMtcGRmLW1vZGVcIiB2YWx1ZT1cImNvbWJpbmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJnb2Fscy1wZGYtbW9kZS1jb21iaW5lZFwiXG4gICAgICAgICAgICAgICAgICAgICAgIG9uY2hhbmdlPVwiZ29hbHNVcGRhdGVQZGZNb2RlKClcIiBjaGVja2VkXG4gICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiJHtTLnJhZGlvSW5wdXR9XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgICAgICA8c3Ryb25nPlNpbmdsZSB0b3RhbDwvc3Ryb25nPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtc2l6ZTowLjg3NXJlbTske1MubXV0ZWR9O21hcmdpbi10b3A6MnB4XCI+XG4gICAgICAgICAgICAgICAgICAgIE9uZSBwYWdlIGdvYWwgY292ZXJpbmcgdGhlIGVudGlyZSBkb2N1bWVudCwgaW5jbHVkaW5nXG4gICAgICAgICAgICAgICAgICAgIHB1YmxpY2F0aW9ucyBhbmQgY2l0YXRpb25zLlxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGRpdiBpZD1cImdvYWxzLXBkZi1jb21iaW5lZFwiXG4gICAgICAgICAgICAgICAgICAgc3R5bGU9XCJwYWRkaW5nLWxlZnQ6MjRweDttYXJnaW4tdG9wOjhweDske1Mucm93fVwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJnb2Fscy1tYXgtcGRmLXBhZ2VzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgbWluPVwiMVwiIG1heD1cIjEwXCIgc3RlcD1cIjFcIlxuICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT1cIiR7R09BTFNfREVGQVVMVFMubWF4X3BkZl9wYWdlc31cIlxuICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOjkwcHg7JHtTLm51bUlucHV0fVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiJHtTLm11dGVkfVwiPnBhZ2VzIHRvdGFsPC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIFx1MjUwMFx1MjUwMCBTcGxpdCBwb3J0aW9ucyBvcHRpb24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwIC0tPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIHN0eWxlPVwiJHtTLnJhZGlvTGFiZWx9XCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJnb2Fscy1wZGYtbW9kZVwiIHZhbHVlPVwic3BsaXRcIlxuICAgICAgICAgICAgICAgICAgICAgICBpZD1cImdvYWxzLXBkZi1tb2RlLXNwbGl0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgb25jaGFuZ2U9XCJnb2Fsc1VwZGF0ZVBkZk1vZGUoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiJHtTLnJhZGlvSW5wdXR9XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgICAgICA8c3Ryb25nPlNwbGl0IHBvcnRpb25zPC9zdHJvbmc+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC1zaXplOjAuODc1cmVtOyR7Uy5tdXRlZH07bWFyZ2luLXRvcDoycHhcIj5cbiAgICAgICAgICAgICAgICAgICAgU2VwYXJhdGUgcGFnZSBnb2FscyBmb3IgdGhlIHJlc3VtZSBwb3J0aW9uIChleHBlcmllbmNlLCBza2lsbHMpXG4gICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgQ1YvcHVibGljYXRpb25zIHBvcnRpb24gKGNpdGF0aW9ucywgcHVibGljYXRpb25zKS5cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxkaXYgaWQ9XCJnb2Fscy1wZGYtc3BsaXRcIlxuICAgICAgICAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZy1sZWZ0OjI0cHg7bWFyZ2luLXRvcDo4cHg7ZGlzcGxheTpub25lO2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtnYXA6OHB4XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cIiR7Uy5yb3d9XCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWwgc3R5bGU9XCJtaW4td2lkdGg6MTg1cHg7Zm9udC1zaXplOjAuOXJlbVwiPlJlc3VtZSBwb3J0aW9uOjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiZ29hbHMtbWF4LXBkZi1yZXN1bWUtcGFnZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIG1pbj1cIjFcIiBtYXg9XCIxMFwiIHN0ZXA9XCIxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT1cIiR7R09BTFNfREVGQVVMVFMubWF4X3BkZl9yZXN1bWVfcGFnZXN9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOjkwcHg7JHtTLm51bUlucHV0fVwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCIke1MubXV0ZWR9XCI+cGFnZXM8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cIiR7Uy5yb3d9XCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWwgc3R5bGU9XCJtaW4td2lkdGg6MTg1cHg7Zm9udC1zaXplOjAuOXJlbVwiPkNWIC8gUHVibGljYXRpb25zIHBvcnRpb246PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJnb2Fscy1tYXgtcGRmLWN2LXBhZ2VzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICBtaW49XCIxXCIgbWF4PVwiMTBcIiBzdGVwPVwiMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCIke0dPQUxTX0RFRkFVTFRTLm1heF9wZGZfY3ZfcGFnZXN9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOjkwcHg7JHtTLm51bUlucHV0fVwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCIke1MubXV0ZWR9XCI+cGFnZXM8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8L2Rpdj48IS0tIGVuZCBtb2RlIG9wdGlvbnMgY29sdW1uIC0tPlxuICAgICAgICA8L2Rpdj48IS0tIGVuZCBnb2Fscy1wZGYtYm9keSAtLT5cbiAgICAgIDwvZGl2PjwhLS0gZW5kIFBERiBzZWN0aW9uIC0tPlxuXG4gICAgICA8IS0tIFx1MjUwMFx1MjUwMCBBVFMgUGxhaW4tVGV4dCBQYWdlIExlbmd0aCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDAgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiZ29hbHMtc2VjdGlvblwiIHN0eWxlPVwiJHtTLnNlY3Rpb259XCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCIke1MuaGVhZGVyfVwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImdvYWxzLWF0cy1wYWdlcy1lbmFibGVkXCJcbiAgICAgICAgICAgICAgICAgb25jaGFuZ2U9XCJnb2Fsc1RvZ2dsZVNlY3Rpb24oJ2F0cy1wYWdlcycpXCJcbiAgICAgICAgICAgICAgICAgY2hlY2tlZCBzdHlsZT1cIiR7Uy5jaGVja2JveH1cIj5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwiZ29hbHMtYXRzLXBhZ2VzLWVuYWJsZWRcIiBzdHlsZT1cIiR7Uy5sYWJlbH1cIj5BVFMgUGxhaW4tVGV4dCBQYWdlIExlbmd0aDwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwiZ29hbHMtYXRzLXBhZ2VzLWJvZHlcIj5cbiAgICAgICAgICA8cCBzdHlsZT1cIiR7Uy5oaW50fVwiPlxuICAgICAgICAgICAgVGFyZ2V0IG51bWJlciBvZiBwYWdlcyBmb3IgdGhlIEFUUy1vcHRpbWlzZWQgcGxhaW4tdGV4dCBvdXRwdXQgKHR5cGljYWxseSAxXHUyMDEzMikuXG4gICAgICAgICAgPC9wPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCIke1Mucm93fVwiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cImdvYWxzLW1heC1hdHMtcGFnZXNcIlxuICAgICAgICAgICAgICAgICAgIG1pbj1cIjFcIiBtYXg9XCI1XCIgc3RlcD1cIjFcIlxuICAgICAgICAgICAgICAgICAgIHZhbHVlPVwiJHtHT0FMU19ERUZBVUxUUy5tYXhfYXRzX3BhZ2VzfVwiXG4gICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDo5MHB4OyR7Uy5udW1JbnB1dH1cIj5cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiJHtTLm11dGVkfVwiPnBhZ2VzPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFx1MjUwMFx1MjUwMCBBVFMgQ2hhcmFjdGVyIENvdW50IChkaXNhYmxlZCBieSBkZWZhdWx0KSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDAgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiZ29hbHMtc2VjdGlvblwiIHN0eWxlPVwiJHtTLnNlY3Rpb259O21hcmdpbi1ib3R0b206MjhweFwiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiJHtTLmhlYWRlcn1cIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJnb2Fscy1hdHMtY2hhcnMtZW5hYmxlZFwiXG4gICAgICAgICAgICAgICAgIG9uY2hhbmdlPVwiZ29hbHNUb2dnbGVTZWN0aW9uKCdhdHMtY2hhcnMnKVwiXG4gICAgICAgICAgICAgICAgIHN0eWxlPVwiJHtTLmNoZWNrYm94fVwiPlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJnb2Fscy1hdHMtY2hhcnMtZW5hYmxlZFwiIHN0eWxlPVwiJHtTLmxhYmVsfVwiPkFUUyBDaGFyYWN0ZXIgQ291bnQgTGltaXQ8L2xhYmVsPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjAuOHJlbTske1MubXV0ZWR9O2ZvbnQtc3R5bGU6aXRhbGljXCI+KG9wdGlvbmFsIFx1MjAxNCB1bmNvbW1vbik8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwiZ29hbHMtYXRzLWNoYXJzLWJvZHlcIiBzdHlsZT1cIm9wYWNpdHk6MC40O3BvaW50ZXItZXZlbnRzOm5vbmVcIj5cbiAgICAgICAgICA8cCBzdHlsZT1cIiR7Uy5oaW50fVwiPlxuICAgICAgICAgICAgTWF4aW11bSBjaGFyYWN0ZXJzIChpbmNsdWRpbmcgc3BhY2VzKSBpbiB0aGUgQVRTIHBsYWluLXRleHQgb3V0cHV0LlxuICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiJHtTLnJvd31cIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJnb2Fscy1tYXgtYXRzLWNoYXJzXCJcbiAgICAgICAgICAgICAgICAgICBtaW49XCI1MDBcIiBtYXg9XCIyMDAwMFwiIHN0ZXA9XCIxMDBcIlxuICAgICAgICAgICAgICAgICAgIHZhbHVlPVwiJHtHT0FMU19ERUZBVUxUUy5tYXhfYXRzX2NoYXJzfVwiXG4gICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDoxMTBweDske1MubnVtSW5wdXR9XCI+XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cIiR7Uy5tdXRlZH1cIj5jaGFyYWN0ZXJzPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFx1MjUwMFx1MjUwMCBHZW5lcmF0aW9uIFNldHRpbmdzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMCAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJnb2Fscy1zZWN0aW9uXCIgc3R5bGU9XCIke1Muc2VjdGlvbn07bWFyZ2luLWJvdHRvbToyOHB4XCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCIke1MuaGVhZGVyfVwiPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjEuMXJlbVwiPlx1MjY5OVx1RkUwRjwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cIiR7Uy5sYWJlbH1cIj5HZW5lcmF0aW9uIFNldHRpbmdzPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHAgc3R5bGU9XCIke1MuaGludH1cIj5cbiAgICAgICAgICBDb250cm9scyB0aGUgc2hhcGUgb2YgdGhlIGdlbmVyYXRlZCBDViBcdTIwMTQgYXBwbGllZCBkdXJpbmcgY3VzdG9taXphdGlvbiBhbmQgcmV3cml0ZSBzdGVwcy5cbiAgICAgICAgPC9wPlxuXG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2dhcDoxNHB4XCI+XG4gICAgICAgICAgPCEtLSBNYXggc2tpbGxzIC0tPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDoxMnB4O2ZsZXgtd3JhcDp3cmFwXCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwiZ29hbHMtbWF4LXNraWxscy1pbnB1dFwiIHN0eWxlPVwiZm9udC1zaXplOjAuOXJlbTtjb2xvcjojNGI1NTYzO3doaXRlLXNwYWNlOm5vd3JhcDttaW4td2lkdGg6MTYwcHhcIj5cbiAgICAgICAgICAgICAgTWF4IHNraWxscyBpbiBDVjpcbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhbmdlXCIgaWQ9XCJnb2Fscy1tYXgtc2tpbGxzLWlucHV0XCIgbWluPVwiMVwiIG1heD1cIjYwXCIgc3RlcD1cIjFcIiB2YWx1ZT1cIjIwXCJcbiAgICAgICAgICAgICAgICAgICBvbmlucHV0PVwiZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLW1heC1za2lsbHMtdmFsdWUnKS50ZXh0Q29udGVudD10aGlzLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICBvbmNoYW5nZT1cImdvYWxzQXV0b1NhdmVTZXR0aW5ncygpXCJcbiAgICAgICAgICAgICAgICAgICBzdHlsZT1cImZsZXg6MTttaW4td2lkdGg6MTIwcHg7YWNjZW50LWNvbG9yOiMzYjgyZjZcIj5cbiAgICAgICAgICAgIDxzcGFuIGlkPVwiZ29hbHMtbWF4LXNraWxscy12YWx1ZVwiIHN0eWxlPVwiZm9udC13ZWlnaHQ6NjAwO2NvbG9yOiMxZTI5M2I7bWluLXdpZHRoOjJlbTt0ZXh0LWFsaWduOnJpZ2h0XCI+MjA8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjgyZW07JHtTLm11dGVkfVwiPihkZWZhdWx0OiAyMCk8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIFNraWxscyBzZWN0aW9uIHRpdGxlIC0tPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDoxMnB4O2ZsZXgtd3JhcDp3cmFwXCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwiZ29hbHMtc2tpbGxzLXRpdGxlLXNlbGVjdFwiIHN0eWxlPVwiZm9udC1zaXplOjAuOXJlbTtjb2xvcjojNGI1NTYzO3doaXRlLXNwYWNlOm5vd3JhcDttaW4td2lkdGg6MTYwcHhcIj5cbiAgICAgICAgICAgICAgU2tpbGxzIHNlY3Rpb24gdGl0bGU6XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPHNlbGVjdCBpZD1cImdvYWxzLXNraWxscy10aXRsZS1zZWxlY3RcIlxuICAgICAgICAgICAgICAgICAgICBvbmNoYW5nZT1cImdvYWxzT25Ta2lsbHNUaXRsZVNlbGVjdCgpXCJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6MC45ZW07Ym9yZGVyOjFweCBzb2xpZCAjZDFkNWRiO2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMWUyOTNiXCI+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJTa2lsbHNcIj5Ta2lsbHM8L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlRlY2huaWNhbCBTa2lsbHNcIj5UZWNobmljYWwgU2tpbGxzPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJLZXkgU2tpbGxzXCI+S2V5IFNraWxsczwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiQ29yZSBTa2lsbHNcIj5Db3JlIFNraWxsczwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiX19jdXN0b21fX1wiPkN1c3RvbVx1MjAyNjwvb3B0aW9uPlxuICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImdvYWxzLXNraWxscy10aXRsZS1jdXN0b21cIiBwbGFjZWhvbGRlcj1cIkVudGVyIGN1c3RvbSB0aXRsZVwiXG4gICAgICAgICAgICAgICAgICAgb25jaGFuZ2U9XCJnb2Fsc0F1dG9TYXZlU2V0dGluZ3MoKVwiXG4gICAgICAgICAgICAgICAgICAgc3R5bGU9XCJkaXNwbGF5Om5vbmU7Zm9udC1zaXplOjAuOWVtO2JvcmRlcjoxcHggc29saWQgI2QxZDVkYjtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjRweCA4cHg7Y29sb3I6IzFlMjkzYjttaW4td2lkdGg6MTYwcHhcIj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxzcGFuIGlkPVwiZ29hbHMtc2V0dGluZ3Mtc3RhdHVzXCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO21hcmdpbi10b3A6OHB4O2ZvbnQtc2l6ZTowLjgycmVtO3RyYW5zaXRpb246Y29sb3IgMC4yc1wiPjwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IHN0eWxlPVwiJHtTLnJvd307Z2FwOjE0cHhcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInNhdmUtZ29hbHMtYnRuXCJcbiAgICAgICAgICAgICAgICBvbmNsaWNrPVwic2F2ZUdlbmVyYXRpb25Hb2FscygpXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1wcmltYXJ5XCJcbiAgICAgICAgICAgICAgICBzdHlsZT1cInBhZGRpbmc6OHB4IDIycHg7Zm9udC1zaXplOjAuOTVyZW1cIj5cbiAgICAgICAgICBTYXZlIEdvYWxzXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8c3BhbiBpZD1cImdvYWxzLXN0YXR1c1wiXG4gICAgICAgICAgICAgIHN0eWxlPVwiZm9udC1zaXplOjAuODc1cmVtO3RyYW5zaXRpb246Y29sb3IgMC4yc1wiPjwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgO1xuXG4gIC8vIFJlc3RvcmUgc2F2ZWQgZ29hbHMgZnJvbSB0aGUgYmFja2VuZCBzZXNzaW9uIHN0YXRlLlxuICBhd2FpdCBfbG9hZEdvYWxzRnJvbVN0YXR1cygpO1xufVxuXG4vKipcbiAqIFRvZ2dsZSB0aGUgZW5hYmxlZC9kaXNhYmxlZCBhcHBlYXJhbmNlIG9mIGEgZ29hbCBzZWN0aW9uLlxuICogRXhwb3J0ZWQgc28gdGhlIGlubGluZSBvbmNoYW5nZT1cImdvYWxzVG9nZ2xlU2VjdGlvbiguLi4pXCIgaGFuZGxlcnMgd29yay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdvYWxzVG9nZ2xlU2VjdGlvbihzZWN0aW9uKSB7XG4gIGNvbnN0IE1BUCA9IHtcbiAgICAncGRmJzogICAgICAgeyBjYjogJ2dvYWxzLXBkZi1lbmFibGVkJywgICAgICAgYm9keTogJ2dvYWxzLXBkZi1ib2R5JyAgICAgICB9LFxuICAgICdhdHMtcGFnZXMnOiB7IGNiOiAnZ29hbHMtYXRzLXBhZ2VzLWVuYWJsZWQnLCBib2R5OiAnZ29hbHMtYXRzLXBhZ2VzLWJvZHknIH0sXG4gICAgJ2F0cy1jaGFycyc6IHsgY2I6ICdnb2Fscy1hdHMtY2hhcnMtZW5hYmxlZCcsIGJvZHk6ICdnb2Fscy1hdHMtY2hhcnMtYm9keScgfSxcbiAgfTtcbiAgY29uc3Qgc2VsID0gTUFQW3NlY3Rpb25dO1xuICBpZiAoIXNlbCkgcmV0dXJuO1xuICBjb25zdCBjYiAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc2VsLmNiKTtcbiAgY29uc3QgYm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHNlbC5ib2R5KTtcbiAgaWYgKCFjYiB8fCAhYm9keSkgcmV0dXJuO1xuICBib2R5LnN0eWxlLm9wYWNpdHkgICAgICAgPSBjYi5jaGVja2VkID8gJzEnICAgIDogJzAuNCc7XG4gIGJvZHkuc3R5bGUucG9pbnRlckV2ZW50cyA9IGNiLmNoZWNrZWQgPyAnYXV0bycgOiAnbm9uZSc7XG59XG5cbi8qKlxuICogU2hvdy9oaWRlIGNvbWJpbmVkIHZzIHNwbGl0IFBERiBwYWdlIGlucHV0cyB3aGVuIHRoZSBtb2RlIHJhZGlvIGNoYW5nZXMuXG4gKiBFeHBvcnRlZCBzbyB0aGUgaW5saW5lIG9uY2hhbmdlPVwiZ29hbHNVcGRhdGVQZGZNb2RlKClcIiBoYW5kbGVyIHdvcmtzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ29hbHNVcGRhdGVQZGZNb2RlKCkge1xuICBjb25zdCBjb21iaW5lZFJhZGlvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLXBkZi1tb2RlLWNvbWJpbmVkJyk7XG4gIGNvbnN0IGlzQ29tYmluZWQgICAgPSBjb21iaW5lZFJhZGlvPy5jaGVja2VkID8/IHRydWU7XG4gIGNvbnN0IGNvbWJpbmVkRGl2ICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtcGRmLWNvbWJpbmVkJyk7XG4gIGNvbnN0IHNwbGl0RGl2ICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtcGRmLXNwbGl0Jyk7XG4gIGlmIChjb21iaW5lZERpdikgY29tYmluZWREaXYuc3R5bGUuZGlzcGxheSA9IGlzQ29tYmluZWQgPyAnZmxleCcgICA6ICdub25lJztcbiAgaWYgKHNwbGl0RGl2KSAgICBzcGxpdERpdi5zdHlsZS5kaXNwbGF5ICAgID0gaXNDb21iaW5lZCA/ICdub25lJyAgIDogJ2ZsZXgnO1xufVxuXG4vKipcbiAqIEZldGNoIGN1cnJlbnQgZ2VuZXJhdGlvbiBnb2FscyBmcm9tIHRoZSBzZXNzaW9uIGFuZCBwb3B1bGF0ZSB0aGUgZm9ybSBpbnB1dHMuXG4gKiBAcHJpdmF0ZVxuICovXG5hc3luYyBmdW5jdGlvbiBfbG9hZEdvYWxzRnJvbVN0YXR1cygpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBkYXRhICA9IGF3YWl0IGFwaUNhbGwoJ0dFVCcsICcvYXBpL3N0YXR1cycpO1xuICAgIGNvbnN0IGdvYWxzID0gZGF0YT8uZ2VuZXJhdGlvbl9nb2FscztcbiAgICBpZiAoIWdvYWxzKSByZXR1cm47XG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgRW5hYmxlZCBjaGVja2JveGVzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIGNvbnN0IHBkZkVuYWJsZWRDYiAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLXBkZi1lbmFibGVkJyk7XG4gICAgY29uc3QgYXRzUGFnZUVuYWJsZWRDYiAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtYXRzLXBhZ2VzLWVuYWJsZWQnKTtcbiAgICBjb25zdCBhdHNDaGFyc0VuYWJsZWRDYiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb2Fscy1hdHMtY2hhcnMtZW5hYmxlZCcpO1xuXG4gICAgaWYgKHBkZkVuYWJsZWRDYiAgICAgICYmIGdvYWxzLnBkZl9wYWdlc19lbmFibGVkICAhPSBudWxsKSBwZGZFbmFibGVkQ2IuY2hlY2tlZCAgICAgID0gZ29hbHMucGRmX3BhZ2VzX2VuYWJsZWQ7XG4gICAgaWYgKGF0c1BhZ2VFbmFibGVkQ2IgICYmIGdvYWxzLmF0c19wYWdlc19lbmFibGVkICAhPSBudWxsKSBhdHNQYWdlRW5hYmxlZENiLmNoZWNrZWQgID0gZ29hbHMuYXRzX3BhZ2VzX2VuYWJsZWQ7XG4gICAgaWYgKGF0c0NoYXJzRW5hYmxlZENiICYmIGdvYWxzLmF0c19jaGFyc19lbmFibGVkICAhPSBudWxsKSBhdHNDaGFyc0VuYWJsZWRDYi5jaGVja2VkID0gZ29hbHMuYXRzX2NoYXJzX2VuYWJsZWQ7XG5cbiAgICBnb2Fsc1RvZ2dsZVNlY3Rpb24oJ3BkZicpO1xuICAgIGdvYWxzVG9nZ2xlU2VjdGlvbignYXRzLXBhZ2VzJyk7XG4gICAgZ29hbHNUb2dnbGVTZWN0aW9uKCdhdHMtY2hhcnMnKTtcblxuICAgIC8vIFx1MjUwMFx1MjUwMCBQREYgbW9kZSByYWRpbyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICBpZiAoZ29hbHMubWF4X3BkZl9wYWdlc19tb2RlKSB7XG4gICAgICBjb25zdCByYWRpbyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgIGBpbnB1dFtuYW1lPVwiZ29hbHMtcGRmLW1vZGVcIl1bdmFsdWU9XCIke2dvYWxzLm1heF9wZGZfcGFnZXNfbW9kZX1cIl1gKTtcbiAgICAgIGlmIChyYWRpbykgcmFkaW8uY2hlY2tlZCA9IHRydWU7XG4gICAgICBnb2Fsc1VwZGF0ZVBkZk1vZGUoKTtcbiAgICB9XG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgTnVtZXJpYyB2YWx1ZXMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgY29uc3QgcGRmSW5wdXQgICAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLW1heC1wZGYtcGFnZXMnKTtcbiAgICBjb25zdCBwZGZSZXN1bWVJbnB1dCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtbWF4LXBkZi1yZXN1bWUtcGFnZXMnKTtcbiAgICBjb25zdCBwZGZDdklucHV0ICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtbWF4LXBkZi1jdi1wYWdlcycpO1xuICAgIGNvbnN0IGF0c1BhZ2VJbnB1dCAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb2Fscy1tYXgtYXRzLXBhZ2VzJyk7XG4gICAgY29uc3QgYXRzQ2hhcklucHV0ICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLW1heC1hdHMtY2hhcnMnKTtcblxuICAgIGlmIChwZGZJbnB1dCAgICAgICAmJiBnb2Fscy5tYXhfcGRmX3BhZ2VzICAgICAgICAgIT0gbnVsbCkgcGRmSW5wdXQudmFsdWUgICAgICAgPSBnb2Fscy5tYXhfcGRmX3BhZ2VzO1xuICAgIGlmIChwZGZSZXN1bWVJbnB1dCAmJiBnb2Fscy5tYXhfcGRmX3Jlc3VtZV9wYWdlcyAgIT0gbnVsbCkgcGRmUmVzdW1lSW5wdXQudmFsdWUgPSBnb2Fscy5tYXhfcGRmX3Jlc3VtZV9wYWdlcztcbiAgICBpZiAocGRmQ3ZJbnB1dCAgICAgJiYgZ29hbHMubWF4X3BkZl9jdl9wYWdlcyAgICAgICE9IG51bGwpIHBkZkN2SW5wdXQudmFsdWUgICAgID0gZ29hbHMubWF4X3BkZl9jdl9wYWdlcztcbiAgICBpZiAoYXRzUGFnZUlucHV0ICAgJiYgZ29hbHMubWF4X2F0c19wYWdlcyAgICAgICAgICE9IG51bGwpIGF0c1BhZ2VJbnB1dC52YWx1ZSAgID0gZ29hbHMubWF4X2F0c19wYWdlcztcbiAgICBpZiAoYXRzQ2hhcklucHV0ICAgJiYgZ29hbHMubWF4X2F0c19jaGFycyAgICAgICAgICE9IG51bGwpIGF0c0NoYXJJbnB1dC52YWx1ZSAgID0gZ29hbHMubWF4X2F0c19jaGFycztcblxuICAgIC8vIFx1MjUwMFx1MjUwMCBHZW5lcmF0aW9uIFNldHRpbmdzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIGNvbnN0IG1heFNraWxsc1NsaWRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb2Fscy1tYXgtc2tpbGxzLWlucHV0Jyk7XG4gICAgY29uc3QgbWF4U2tpbGxzTGFiZWwgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLW1heC1za2lsbHMtdmFsdWUnKTtcbiAgICBpZiAobWF4U2tpbGxzU2xpZGVyICYmIGRhdGEubWF4X3NraWxscyAhPSBudWxsKSB7XG4gICAgICBtYXhTa2lsbHNTbGlkZXIudmFsdWUgPSBkYXRhLm1heF9za2lsbHM7XG4gICAgICBpZiAobWF4U2tpbGxzTGFiZWwpIG1heFNraWxsc0xhYmVsLnRleHRDb250ZW50ID0gZGF0YS5tYXhfc2tpbGxzO1xuICAgIH1cbiAgICBjb25zdCBrbm93blRpdGxlcyA9IFsnU2tpbGxzJywgJ1RlY2huaWNhbCBTa2lsbHMnLCAnS2V5IFNraWxscycsICdDb3JlIFNraWxscyddO1xuICAgIGNvbnN0IGN1cnJlbnRUaXRsZSA9IGRhdGEuc2tpbGxzX3NlY3Rpb25fdGl0bGUgfHwgJ1NraWxscyc7XG4gICAgY29uc3QgdGl0bGVTZWxlY3QgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLXNraWxscy10aXRsZS1zZWxlY3QnKTtcbiAgICBjb25zdCB0aXRsZUN1c3RvbSAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtc2tpbGxzLXRpdGxlLWN1c3RvbScpO1xuICAgIGlmICh0aXRsZVNlbGVjdCkge1xuICAgICAgY29uc3QgaXNLbm93biA9IGtub3duVGl0bGVzLmluY2x1ZGVzKGN1cnJlbnRUaXRsZSk7XG4gICAgICB0aXRsZVNlbGVjdC52YWx1ZSA9IGlzS25vd24gPyBjdXJyZW50VGl0bGUgOiAnX19jdXN0b21fXyc7XG4gICAgICBpZiAodGl0bGVDdXN0b20pIHtcbiAgICAgICAgdGl0bGVDdXN0b20uc3R5bGUuZGlzcGxheSA9IGlzS25vd24gPyAnbm9uZScgOiAnJztcbiAgICAgICAgaWYgKCFpc0tub3duKSB0aXRsZUN1c3RvbS52YWx1ZSA9IGN1cnJlbnRUaXRsZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy53YXJuKCdGYWlsZWQgdG8gbG9hZCBnZW5lcmF0aW9uIGdvYWxzIGZyb20gYmFja2VuZDonLCBlcnIpO1xuICB9XG59XG5cbi8qKlxuICogUmVhZCB0aGUgZm9ybSBpbnB1dHMsIHZhbGlkYXRlLCBhbmQgUE9TVCB0byAvYXBpL2dlbmVyYXRpb24tZ29hbHMuXG4gKiBFeHBvc2VkIG9uIGdsb2JhbFRoaXMgc28gdGhlIGlubGluZSBvbmNsaWNrPVwic2F2ZUdlbmVyYXRpb25Hb2FscygpXCIgd29ya3MuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzYXZlR2VuZXJhdGlvbkdvYWxzKCkge1xuICBjb25zdCBzdGF0dXNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb2Fscy1zdGF0dXMnKTtcblxuICAvLyBcdTI1MDBcdTI1MDAgUmVhZCBlbmFibGVkIGZsYWdzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICBjb25zdCBwZGZFbmFibGVkICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtcGRmLWVuYWJsZWQnKT8uY2hlY2tlZCAgICAgID8/IHRydWU7XG4gIGNvbnN0IGF0c1BhZ2VFbmFibGVkICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb2Fscy1hdHMtcGFnZXMtZW5hYmxlZCcpPy5jaGVja2VkID8/IHRydWU7XG4gIGNvbnN0IGF0c0NoYXJzRW5hYmxlZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb2Fscy1hdHMtY2hhcnMtZW5hYmxlZCcpPy5jaGVja2VkID8/IGZhbHNlO1xuXG4gIC8vIFx1MjUwMFx1MjUwMCBSZWFkIFBERiBtb2RlIGFuZCB2YWx1ZXMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIGNvbnN0IHBkZk1vZGUgICAgICAgID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXRbbmFtZT1cImdvYWxzLXBkZi1tb2RlXCJdOmNoZWNrZWQnKT8udmFsdWUgPz8gJ2NvbWJpbmVkJztcbiAgY29uc3QgcGRmUGFnZXMgICAgICAgPSBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtbWF4LXBkZi1wYWdlcycpPy52YWx1ZSwgICAgICAgIDEwKTtcbiAgY29uc3QgcGRmUmVzdW1lUGFnZXMgPSBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtbWF4LXBkZi1yZXN1bWUtcGFnZXMnKT8udmFsdWUsIDEwKTtcbiAgY29uc3QgcGRmQ3ZQYWdlcyAgICAgPSBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtbWF4LXBkZi1jdi1wYWdlcycpPy52YWx1ZSwgICAgIDEwKTtcbiAgY29uc3QgYXRzUGFnZXMgICAgICAgPSBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtbWF4LWF0cy1wYWdlcycpPy52YWx1ZSwgICAgICAgIDEwKTtcbiAgY29uc3QgYXRzQ2hhcnMgICAgICAgPSBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtbWF4LWF0cy1jaGFycycpPy52YWx1ZSwgICAgICAgIDEwKTtcblxuICAvLyBcdTI1MDBcdTI1MDAgVmFsaWRhdGUgb25seSBlbmFibGVkIGZpZWxkcyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgaWYgKHBkZkVuYWJsZWQpIHtcbiAgICBpZiAocGRmTW9kZSA9PT0gJ2NvbWJpbmVkJykge1xuICAgICAgaWYgKCFwZGZQYWdlcyB8fCBwZGZQYWdlcyA8IDEgfHwgcGRmUGFnZXMgPiAxMCkge1xuICAgICAgICBfc2V0U3RhdHVzKHN0YXR1c0VsLCAnXHUyNkEwXHVGRTBGIFBERiBwYWdlcyBtdXN0IGJlIDFcdTIwMTMxMC4nLCAnd2FybicpOyByZXR1cm47XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghcGRmUmVzdW1lUGFnZXMgfHwgcGRmUmVzdW1lUGFnZXMgPCAxIHx8IHBkZlJlc3VtZVBhZ2VzID4gMTApIHtcbiAgICAgICAgX3NldFN0YXR1cyhzdGF0dXNFbCwgJ1x1MjZBMFx1RkUwRiBSZXN1bWUgcG9ydGlvbiBwYWdlcyBtdXN0IGJlIDFcdTIwMTMxMC4nLCAnd2FybicpOyByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoIXBkZkN2UGFnZXMgfHwgcGRmQ3ZQYWdlcyA8IDEgfHwgcGRmQ3ZQYWdlcyA+IDEwKSB7XG4gICAgICAgIF9zZXRTdGF0dXMoc3RhdHVzRWwsICdcdTI2QTBcdUZFMEYgQ1YgLyBQdWJsaWNhdGlvbnMgcG9ydGlvbiBwYWdlcyBtdXN0IGJlIDFcdTIwMTMxMC4nLCAnd2FybicpOyByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChhdHNQYWdlRW5hYmxlZCAgJiYgKCFhdHNQYWdlcyAgfHwgYXRzUGFnZXMgIDwgMSAgfHwgYXRzUGFnZXMgID4gNSkpICAgICB7IF9zZXRTdGF0dXMoc3RhdHVzRWwsICdcdTI2QTBcdUZFMEYgQVRTIHBhZ2VzIG11c3QgYmUgMVx1MjAxMzUuJywgICAgICAgICAgJ3dhcm4nKTsgcmV0dXJuOyB9XG4gIGlmIChhdHNDaGFyc0VuYWJsZWQgJiYgKCFhdHNDaGFycyAgfHwgYXRzQ2hhcnMgIDwgNTAwIHx8IGF0c0NoYXJzID4gMjAwMDApKSB7IF9zZXRTdGF0dXMoc3RhdHVzRWwsICdcdTI2QTBcdUZFMEYgQ2hhcmFjdGVycyBtdXN0IGJlIDUwMFx1MjAxMzIwIDAwMC4nLCAnd2FybicpOyByZXR1cm47IH1cblxuICAvLyBcdTI1MDBcdTI1MDAgQnVpbGQgcGF5bG9hZCAoaW5jbHVkZSBlbmFibGVkIGZsYWdzICsgYWN0aXZlIHZhbHVlcyBvbmx5KSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICBwZGZfcGFnZXNfZW5hYmxlZDogIHBkZkVuYWJsZWQsXG4gICAgYXRzX3BhZ2VzX2VuYWJsZWQ6ICBhdHNQYWdlRW5hYmxlZCxcbiAgICBhdHNfY2hhcnNfZW5hYmxlZDogIGF0c0NoYXJzRW5hYmxlZCxcbiAgICBtYXhfcGRmX3BhZ2VzX21vZGU6IHBkZk1vZGUsXG4gIH07XG5cbiAgaWYgKHBkZkVuYWJsZWQpIHtcbiAgICBpZiAocGRmTW9kZSA9PT0gJ2NvbWJpbmVkJykge1xuICAgICAgcGF5bG9hZC5tYXhfcGRmX3BhZ2VzID0gcGRmUGFnZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBheWxvYWQubWF4X3BkZl9yZXN1bWVfcGFnZXMgPSBwZGZSZXN1bWVQYWdlcztcbiAgICAgIHBheWxvYWQubWF4X3BkZl9jdl9wYWdlcyAgICAgPSBwZGZDdlBhZ2VzO1xuICAgIH1cbiAgfVxuICBpZiAoYXRzUGFnZUVuYWJsZWQpICBwYXlsb2FkLm1heF9hdHNfcGFnZXMgPSBhdHNQYWdlcztcbiAgaWYgKGF0c0NoYXJzRW5hYmxlZCkgcGF5bG9hZC5tYXhfYXRzX2NoYXJzID0gYXRzQ2hhcnM7XG5cbiAgX3NldFN0YXR1cyhzdGF0dXNFbCwgJ1NhdmluZ1x1MjAyNicsICdpbmZvJyk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBhcGlDYWxsKCdQT1NUJywgJy9hcGkvZ2VuZXJhdGlvbi1nb2FscycsIHBheWxvYWQpO1xuICAgIF9zZXRTdGF0dXMoc3RhdHVzRWwsICdcdTI3MTMgU2F2ZWQnLCAnb2snKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHsgaWYgKHN0YXR1c0VsKSBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICcnOyB9LCAzMDAwKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLmVycm9yKCdGYWlsZWQgdG8gc2F2ZSBnZW5lcmF0aW9uIGdvYWxzOicsIGVycik7XG4gICAgX3NldFN0YXR1cyhzdGF0dXNFbCwgJ1NhdmUgZmFpbGVkLiBQbGVhc2UgdHJ5IGFnYWluLicsICdlcnJvcicpO1xuICB9XG59XG5cbi8qKlxuICogU2hvdy9oaWRlIHRoZSBjdXN0b20tdGl0bGUgaW5wdXQgd2hlbiB0aGUgc2tpbGxzLXRpdGxlIHNlbGVjdCBjaGFuZ2VzLlxuICogRXhwb3J0ZWQgc28gdGhlIGlubGluZSBvbmNoYW5nZT1cImdvYWxzT25Ta2lsbHNUaXRsZVNlbGVjdCgpXCIgaGFuZGxlciB3b3Jrcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdvYWxzT25Ta2lsbHNUaXRsZVNlbGVjdCgpIHtcbiAgY29uc3Qgc2VsICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLXNraWxscy10aXRsZS1zZWxlY3QnKTtcbiAgY29uc3QgY3VzdG9tID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLXNraWxscy10aXRsZS1jdXN0b20nKTtcbiAgaWYgKCFzZWwpIHJldHVybjtcbiAgaWYgKHNlbC52YWx1ZSA9PT0gJ19fY3VzdG9tX18nKSB7XG4gICAgaWYgKGN1c3RvbSkgeyBjdXN0b20uc3R5bGUuZGlzcGxheSA9ICcnOyBjdXN0b20uZm9jdXMoKTsgfVxuICB9IGVsc2Uge1xuICAgIGlmIChjdXN0b20pIGN1c3RvbS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGdvYWxzQXV0b1NhdmVTZXR0aW5ncygpO1xuICB9XG59XG5cbi8qKlxuICogQXV0by1zYXZlIHRoZSBnZW5lcmF0aW9uIHNldHRpbmdzIChtYXhfc2tpbGxzICsgc2tpbGxzX3NlY3Rpb25fdGl0bGUpXG4gKiB2aWEgUE9TVCAvYXBpL2dlbmVyYXRpb24tc2V0dGluZ3Mgd2l0aG91dCBibG9ja2luZy5cbiAqIEV4cG9ydGVkIHNvIGlubGluZSBvbmNoYW5nZT1cImdvYWxzQXV0b1NhdmVTZXR0aW5ncygpXCIgaGFuZGxlcnMgd29yay5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdvYWxzQXV0b1NhdmVTZXR0aW5ncygpIHtcbiAgY29uc3Qgc3RhdHVzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtc2V0dGluZ3Mtc3RhdHVzJyk7XG4gIGNvbnN0IHNsaWRlciAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLW1heC1za2lsbHMtaW5wdXQnKTtcbiAgY29uc3Qgc2VsICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtc2tpbGxzLXRpdGxlLXNlbGVjdCcpO1xuICBjb25zdCBjdXN0b20gICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb2Fscy1za2lsbHMtdGl0bGUtY3VzdG9tJyk7XG5cbiAgY29uc3QgbWF4U2tpbGxzID0gc2xpZGVyID8gcGFyc2VJbnQoc2xpZGVyLnZhbHVlLCAxMCkgOiBudWxsO1xuICBjb25zdCB0aXRsZSAgICAgPSBzZWw/LnZhbHVlID09PSAnX19jdXN0b21fXydcbiAgICA/IChjdXN0b20/LnZhbHVlPy50cmltKCkgfHwgbnVsbClcbiAgICA6IChzZWw/LnZhbHVlIHx8IG51bGwpO1xuXG4gIGlmICghbWF4U2tpbGxzICYmICF0aXRsZSkgcmV0dXJuO1xuXG4gIGNvbnN0IHBheWxvYWQgPSB7fTtcbiAgaWYgKG1heFNraWxscyAmJiBtYXhTa2lsbHMgPj0gMSkgcGF5bG9hZC5tYXhfc2tpbGxzICAgICAgICAgID0gbWF4U2tpbGxzO1xuICBpZiAodGl0bGUpICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLnNraWxsc19zZWN0aW9uX3RpdGxlID0gdGl0bGU7XG5cbiAgX3NldFN0YXR1cyhzdGF0dXNFbCwgJ1NhdmluZ1x1MjAyNicsICdpbmZvJyk7XG4gIHRyeSB7XG4gICAgYXdhaXQgYXBpQ2FsbCgnUE9TVCcsICcvYXBpL2dlbmVyYXRpb24tc2V0dGluZ3MnLCBwYXlsb2FkKTtcbiAgICBfc2V0U3RhdHVzKHN0YXR1c0VsLCAnXHUyNzEzIFNhdmVkJywgJ29rJyk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7IGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnJzsgfSwgMjAwMCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy53YXJuKCdGYWlsZWQgdG8gc2F2ZSBnZW5lcmF0aW9uIHNldHRpbmdzOicsIGVycik7XG4gICAgX3NldFN0YXR1cyhzdGF0dXNFbCwgJ1NhdmUgZmFpbGVkJywgJ2Vycm9yJyk7XG4gIH1cbn1cblxuLyoqIEBwcml2YXRlICovXG5mdW5jdGlvbiBfc2V0U3RhdHVzKGVsLCBtZXNzYWdlLCBsZXZlbCkge1xuICBpZiAoIWVsKSByZXR1cm47XG4gIGNvbnN0IGNvbG91cnMgPSB7XG4gICAgb2s6ICAgICd2YXIoLS1zdWNjZXNzLCMyZTdkMzIpJyxcbiAgICBlcnJvcjogJ3ZhcigtLWRhbmdlciwjYzYyODI4KScsXG4gICAgd2FybjogICd2YXIoLS13YXJuaW5nLCNlNjUxMDApJyxcbiAgICBpbmZvOiAgJ3ZhcigtLXRleHQtc2Vjb25kYXJ5LCM1NTUpJyxcbiAgfTtcbiAgZWwuc3R5bGUuY29sb3IgID0gY29sb3Vyc1tsZXZlbF0gfHwgY29sb3Vycy5pbmZvO1xuICBlbC50ZXh0Q29udGVudCAgPSBtZXNzYWdlO1xufVxuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvc2Vzc2lvbi1tYW5hZ2VyLmpzXG4gKiBTZXNzaW9uIGxpZmVjeWNsZTogY3JlYXRlLCBjbGFpbSwgcmVzdG9yZSwgc2F2ZSwgbG9hZC5cbiAqIEFsc28gb3ducyBmb3JtYXRTZXNzaW9uUGhhc2VMYWJlbCBhbmQgcmVsYXRlZCBzZXNzaW9uLWxhYmVsIGhlbHBlcnMuXG4gKlxuICogREVQRU5ERU5DSUVTIChhbGwgb24gZ2xvYmFsVGhpcyBhdCBydW50aW1lKTpcbiAqICAgLSBjcmVhdGVTZXNzaW9uLCBmZXRjaFN0YXR1cyAoYXBpLWNsaWVudC5qcylcbiAqICAgLSBnZXRTZXNzaW9uSWRGcm9tVVJMLCBnZXRPd25lclRva2VuLCBTdG9yYWdlS2V5cywgZ2V0U2NvcGVkVGFiRGF0YVN0b3JhZ2VLZXkgKHN0YXRlLW1hbmFnZXIuanMpXG4gKiAgIC0gYXBwZW5kTWVzc2FnZSwgYXBwZW5kUmV0cnlNZXNzYWdlIChtZXNzYWdlLXF1ZXVlLmpzKVxuICogICAtIHBhcnNlU3RhdHVzUmVzcG9uc2UsIHBhcnNlUmV3cml0ZXNSZXNwb25zZSAodmFsaWRhdG9ycy5qcylcbiAqICAgLSByZWZyZXNoQXRzU2NvcmUgKGF0cy1yZWZpbmVtZW50LmpzKVxuICogICAtIHVwZGF0ZUluY2x1c2lvbkNvdW50cyAocmV2aWV3LXRhYmxlLWJhc2UuanMsIFRpZXIgNClcbiAqICAgLSBzd2l0Y2hUYWIgKHJldmlldy10YWJsZS1iYXNlLmpzLCBUaWVyIDQpXG4gKiAgIC0gcmVuZGVyUmV3cml0ZVBhbmVsIChyZXdyaXRlLXJldmlldy5qcywgVGllciA2KVxuICogICAtIHNob3dPd25lcnNoaXBDb25mbGljdERpYWxvZywgb3BlblNlc3Npb25zTW9kYWwgKHNlc3Npb24tc3dpdGNoZXItdWkuanMsIFRpZXIgNylcbiAqICAgLSB1cGRhdGVBY3Rpb25CdXR0b25zICh1aS1oZWxwZXJzLmpzKVxuICogICAtIHVwZGF0ZVBvc2l0aW9uVGl0bGUgKHNlc3Npb24tYWN0aW9ucy5qcylcbiAqICAgLSBlc2NhcGVIdG1sLCBTRVNTSU9OX1BIQVNFX0xBQkVMU19TSE9SVCAodXRpbHMuanMpXG4gKiAgIC0gc3RhdGVNYW5hZ2VyIChzdGF0ZS1tYW5hZ2VyLmpzIFx1MjAxNCBnZXRBbGxUYWJEYXRhKCkvZ2V0Q3VycmVudFRhYigpL3NldFRhYkRhdGEoKS9zZXRDdXJyZW50VGFiKCkpXG4gKiAgIC0gc2Vzc2lvbklkLCBpc1JlY29ubmVjdGluZywgbGFzdEtub3duUGhhc2UsIGludGVyYWN0aXZlU3RhdGUsXG4gKiAgICAgcmV3cml0ZURlY2lzaW9ucywgUEhBU0VTICh3aW5kb3cgZ2xvYmFscylcbiAqL1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5jb25zdCBsb2cgPSBnZXRMb2dnZXIoJ3Nlc3Npb24tbWFuYWdlcicpO1xuXG5pbXBvcnQgeyBTRVNTSU9OX1BIQVNFX0xBQkVMU19TSE9SVCwgU0VTU0lPTl9QSEFTRV9MQUJFTFMgfSBmcm9tICcuL3V0aWxzLmpzJztcbmltcG9ydCB7IFBIQVNFUywgc3RhdGVNYW5hZ2VyIH0gZnJvbSAnLi9zdGF0ZS1tYW5hZ2VyLmpzJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTZXNzaW9uIHBoYXNlIGxhYmVscyAoYWJicmV2aWF0ZWQgZm9ybSBcdTIwMTQgZm9yIGNvbXBhY3Qgc2Vzc2lvbi1zd2l0Y2hlciBVSSlcbi8vIEZ1bGwtbGVuZ3RoIGxhYmVscyBsaXZlIGluIHV0aWxzLmpzIFNFU1NJT05fUEhBU0VfTEFCRUxTLlxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIGZvcm1hdFNlc3Npb25QaGFzZUxhYmVsKHBoYXNlKSB7XG4gIGlmICghcGhhc2UpIHJldHVybiAnaW5pdCc7XG4gIHJldHVybiBTRVNTSU9OX1BIQVNFX0xBQkVMU19TSE9SVFtwaGFzZV0gfHwgU3RyaW5nKHBoYXNlKS5yZXBsYWNlKC9fL2csICcgJyk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ3VycmVudCBzZXNzaW9uIGlkZW50aXR5IGhlbHBlcnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiBfZ2V0Q3VycmVudFNlc3Npb25JZFZhbHVlKCkge1xuICBpZiAodHlwZW9mIGdldFNlc3Npb25JZEZyb21VUkwgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZ2V0U2Vzc2lvbklkRnJvbVVSTCgpO1xuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCkuZ2V0KCdzZXNzaW9uJyk7XG4gIH0gY2F0Y2ggKF8pIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBfZ2V0Q3VycmVudE93bmVyVG9rZW5WYWx1ZSgpIHtcbiAgaWYgKHR5cGVvZiBnZXRPd25lclRva2VuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGdldE93bmVyVG9rZW4oKTtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdjdi1idWlsZGVyLW93bmVyLXRva2VuJyk7XG4gIH0gY2F0Y2ggKF8pIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZFNlc3Npb25Td2l0Y2hlckxhYmVsKHN0YXR1cyA9IHt9KSB7XG4gIGNvbnN0IHBvc2l0aW9uTmFtZSA9IChzdGF0dXMucG9zaXRpb25fbmFtZSB8fCAnJykudG9TdHJpbmcoKS50cmltKCk7XG4gIGNvbnN0IHBoYXNlID0gZm9ybWF0U2Vzc2lvblBoYXNlTGFiZWwoc3RhdHVzLnBoYXNlKTtcbiAgaWYgKHBvc2l0aW9uTmFtZSkge1xuICAgIHJldHVybiBgJHtwb3NpdGlvbk5hbWV9IFx1MDBCNyAke3BoYXNlfWA7XG4gIH1cbiAgcmV0dXJuIF9nZXRDdXJyZW50U2Vzc2lvbklkVmFsdWUoKSA/IGBTZXNzaW9uIFx1MDBCNyAke3BoYXNlfWAgOiAnXHVEODNEXHVEQ0MyIFNlc3Npb25zJztcbn1cblxuZnVuY3Rpb24gZ2V0QWN0aXZlU2Vzc2lvbk93bmVyc2hpcE1ldGEoc2Vzc2lvbiwge1xuICBjdXJyZW50U2Vzc2lvbklkID0gX2dldEN1cnJlbnRTZXNzaW9uSWRWYWx1ZSgpLFxufSA9IHt9KSB7XG4gIGlmICghc2Vzc2lvbiB8fCB0eXBlb2Ygc2Vzc2lvbiAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4geyBsYWJlbDogJ1Vua25vd24nLCBjbGFzc05hbWU6ICdzZXNzaW9uLXN0YXR1cy11bmNsYWltZWQnLCBpc0N1cnJlbnQ6IGZhbHNlIH07XG4gIH1cblxuICBjb25zdCBpc0N1cnJlbnRTZXNzaW9uID0gQm9vbGVhbihjdXJyZW50U2Vzc2lvbklkKSAmJiBzZXNzaW9uLnNlc3Npb25faWQgPT09IGN1cnJlbnRTZXNzaW9uSWQ7XG4gIGNvbnN0IHNhbWVPd25lciA9IEJvb2xlYW4oc2Vzc2lvbi5vd25lZF9ieV9yZXF1ZXN0ZXIpO1xuXG4gIGlmIChpc0N1cnJlbnRTZXNzaW9uKSB7XG4gICAgcmV0dXJuIHsgbGFiZWw6ICdDdXJyZW50IHRhYicsIGNsYXNzTmFtZTogJ3Nlc3Npb24tc3RhdHVzLWN1cnJlbnQnLCBpc0N1cnJlbnQ6IHRydWUgfTtcbiAgfVxuICBpZiAoc2FtZU93bmVyKSB7XG4gICAgcmV0dXJuIHsgbGFiZWw6ICdPd25lZCBieSB0aGlzIHRhYicsIGNsYXNzTmFtZTogJ3Nlc3Npb24tc3RhdHVzLWN1cnJlbnQnLCBpc0N1cnJlbnQ6IGZhbHNlIH07XG4gIH1cbiAgaWYgKHNlc3Npb24uY2xhaW1lZCkge1xuICAgIHJldHVybiB7IGxhYmVsOiAnT3duZWQgYnkgYW5vdGhlciB0YWInLCBjbGFzc05hbWU6ICdzZXNzaW9uLXN0YXR1cy1vd25lZCcsIGlzQ3VycmVudDogZmFsc2UgfTtcbiAgfVxuICByZXR1cm4geyBsYWJlbDogJ1VuY2xhaW1lZCcsIGNsYXNzTmFtZTogJ3Nlc3Npb24tc3RhdHVzLXVuY2xhaW1lZCcsIGlzQ3VycmVudDogZmFsc2UgfTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0U2Vzc2lvblRpbWVzdGFtcCh0aW1lc3RhbXAsIHsgaW5jbHVkZVRpbWUgPSB0cnVlIH0gPSB7fSkge1xuICBpZiAoIXRpbWVzdGFtcCkgcmV0dXJuICdcdTIwMTQnO1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgRGF0ZSh0aW1lc3RhbXApLnRvTG9jYWxlU3RyaW5nKCdlbi1VUycsIHtcbiAgICAgIG1vbnRoOiAnc2hvcnQnLCBkYXk6ICdudW1lcmljJywgeWVhcjogJ251bWVyaWMnLFxuICAgICAgLi4uKGluY2x1ZGVUaW1lID8geyBob3VyOiAnbnVtZXJpYycsIG1pbnV0ZTogJzItZGlnaXQnIH0gOiB7fSksXG4gICAgfSk7XG4gIH0gY2F0Y2ggKF8pIHtcbiAgICByZXR1cm4gU3RyaW5nKHRpbWVzdGFtcCkucmVwbGFjZSgnVCcsICcgJykuc2xpY2UoMCwgaW5jbHVkZVRpbWUgPyAxNiA6IDEwKTtcbiAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFdlbGNvbWUgLyBvbmJvYXJkaW5nIG1vZGFsIChHQVAtMzYgLyBHQVAtMzcpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY29uc3QgX1dFTENPTUVfRElTTUlTU0VEX0tFWSA9ICdjdi1idWlsZGVyLXdlbGNvbWUtZGlzbWlzc2VkJztcblxuLyoqXG4gKiBTd2l0Y2ggd2hpY2ggY29udGVudCBzZWN0aW9uIGlzIHZpc2libGUgaW5zaWRlIHRoZSB3ZWxjb21lIG1vZGFsLlxuICogQHBhcmFtIHsncHJlc2VudCd8J21pc3NpbmcnfSBzZWN0aW9uXG4gKi9cbmZ1bmN0aW9uIF9zZXRXZWxjb21lU2VjdGlvbihzZWN0aW9uKSB7XG4gIGNvbnN0IHNQcmVzZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3dlbGNvbWUtc2VjdGlvbi1wcmVzZW50Jyk7XG4gIGNvbnN0IHNFbXB0eSAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3dlbGNvbWUtc2VjdGlvbi1lbXB0eScpO1xuICBjb25zdCBzTWlzc2luZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd3ZWxjb21lLXNlY3Rpb24tbWlzc2luZycpO1xuICBjb25zdCBmUHJlc2VudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd3ZWxjb21lLWZvb3Rlci1wcmVzZW50Jyk7XG4gIGNvbnN0IGZNaXNzaW5nID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3dlbGNvbWUtZm9vdGVyLW1pc3NpbmcnKTtcbiAgaWYgKHNQcmVzZW50KSBzUHJlc2VudC5zdHlsZS5kaXNwbGF5ID0gc2VjdGlvbiA9PT0gJ3ByZXNlbnQnID8gJycgOiAnbm9uZSc7XG4gIGlmIChzRW1wdHkpICAgc0VtcHR5LnN0eWxlLmRpc3BsYXkgICA9IHNlY3Rpb24gPT09ICdlbXB0eScgICA/ICcnIDogJ25vbmUnO1xuICBpZiAoc01pc3NpbmcpIHNNaXNzaW5nLnN0eWxlLmRpc3BsYXkgPSBzZWN0aW9uID09PSAnbWlzc2luZycgPyAnJyA6ICdub25lJztcbiAgLy8gRW1wdHkgc2tlbGV0b246IHNob3cgXCJwcmVzZW50XCIgZm9vdGVyIChDbG9zZS9kaXNtaXNzKSBub3QgXCJtaXNzaW5nXCIgZm9vdGVyIChDcmVhdGUvUmVsb2FkKVxuICBpZiAoZlByZXNlbnQpIGZQcmVzZW50LnN0eWxlLmRpc3BsYXkgPSAoc2VjdGlvbiA9PT0gJ3ByZXNlbnQnIHx8IHNlY3Rpb24gPT09ICdlbXB0eScpID8gJ2ZsZXgnIDogJ25vbmUnO1xuICBpZiAoZk1pc3NpbmcpIGZNaXNzaW5nLnN0eWxlLmRpc3BsYXkgPSBzZWN0aW9uID09PSAnbWlzc2luZycgPyAnZmxleCcgOiAnbm9uZSc7XG4gIC8vIEZvciBlbXB0eSBzdGF0ZTogY2hhbmdlIENUQSB0byBuYXZpZ2F0ZSB0byBNYXN0ZXIgQ1YgaW5zdGVhZCBvZiBqdXN0IGNsb3NpbmdcbiAgY29uc3QgZ2V0U3RhcnRlZEJ0biA9IGZQcmVzZW50ID8gZlByZXNlbnQucXVlcnlTZWxlY3RvcignYnV0dG9uLnByaW1hcnknKSA6IG51bGw7XG4gIGlmIChnZXRTdGFydGVkQnRuKSB7XG4gICAgaWYgKHNlY3Rpb24gPT09ICdlbXB0eScpIHtcbiAgICAgIGdldFN0YXJ0ZWRCdG4udGV4dENvbnRlbnQgPSAnT3BlbiBNYXN0ZXIgQ1YnO1xuICAgICAgZ2V0U3RhcnRlZEJ0bi5vbmNsaWNrID0gKCkgPT4geyBjbG9zZVdlbGNvbWVNb2RhbCgpOyBpZiAodHlwZW9mIG9wZW5NYXN0ZXJDdk1vZGFsID09PSAnZnVuY3Rpb24nKSBvcGVuTWFzdGVyQ3ZNb2RhbCgpOyB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBnZXRTdGFydGVkQnRuLnRleHRDb250ZW50ID0gJ0dldCBTdGFydGVkJztcbiAgICAgIGdldFN0YXJ0ZWRCdG4ub25jbGljayA9ICgpID0+IHtcbiAgICAgICAgY2xvc2VXZWxjb21lTW9kYWwoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBzd2l0Y2hUYWIgPT09ICdmdW5jdGlvbicpIHN3aXRjaFRhYignam9iJyk7XG4gICAgICB9O1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFNob3cgdGhlIG9uYm9hcmRpbmcgbW9kYWwgaW4gdGhlIFwibWlzc2luZyBtYXN0ZXIgQ1ZcIiBzdGF0ZS5cbiAqIENhbGxlZCBmcm9tIGNyZWF0ZU5ld1Nlc3Npb25BbmROYXZpZ2F0ZSgpIHdoZW4gdGhlIGJhY2tlbmQgcmV0dXJucyBtYXN0ZXJfY3ZfbWlzc2luZy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtYXN0ZXJDdlBhdGggLSBTZXJ2ZXItcmVwb3J0ZWQgZXhwZWN0ZWQgZmlsZSBwYXRoLlxuICovXG5mdW5jdGlvbiBzaG93T25ib2FyZGluZ01vZGFsKG1hc3RlckN2UGF0aCkge1xuICBjb25zdCBvdmVybGF5ICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvbmJvYXJkaW5nLW1vZGFsLW92ZXJsYXknKTtcbiAgY29uc3QgcGF0aEVsICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb25ib2FyZGluZy1tYXN0ZXItY3YtcGF0aCcpO1xuICBjb25zdCBzdGF0dXNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvbmJvYXJkaW5nLW1vZGFsLXN0YXR1cycpO1xuICBpZiAocGF0aEVsKSAgIHBhdGhFbC50ZXh0Q29udGVudCAgID0gbWFzdGVyQ3ZQYXRoIHx8ICcodW5rbm93biknO1xuICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJyc7XG4gIF9zZXRXZWxjb21lU2VjdGlvbignbWlzc2luZycpO1xuICBpZiAob3ZlcmxheSkge1xuICAgIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICBfb3Blbk9uYm9hcmRpbmdGb2N1c1RyYXAob3ZlcmxheSk7XG4gIH1cbn1cblxuLyoqXG4gKiBTaG93IHRoZSB3ZWxjb21lIG1vZGFsIHVubGVzcyB0aGUgdXNlciBoYXMgZGlzbWlzc2VkIGl0LlxuICogQ2FsbHMgL2FwaS9zZXR1cC9tYXN0ZXItY3Ytc3RhdHVzIHRvIGNob29zZSB3aGljaCBzZWN0aW9uIHRvIGRpc3BsYXkuXG4gKiBTYWZlIHRvIGNhbGwgb24gZXZlcnkgc3RhcnR1cCBcdTIwMTQgbm8tb3BzIGltbWVkaWF0ZWx5IGlmIGRpc21pc3NlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbWF5YmVTaG93V2VsY29tZU1vZGFsKCkge1xuICB0cnkge1xuICAgIGlmIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbShfV0VMQ09NRV9ESVNNSVNTRURfS0VZKSkgcmV0dXJuO1xuICB9IGNhdGNoIChfKSB7fVxuICBsZXQgc2VjdGlvbiA9ICdwcmVzZW50JztcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9zZXR1cC9tYXN0ZXItY3Ytc3RhdHVzJyk7XG4gICAgaWYgKHJlcy5vaykge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSk7XG4gICAgICBpZiAoIWRhdGEuZXhpc3RzKSB7XG4gICAgICAgIGNvbnN0IHBhdGhFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvbmJvYXJkaW5nLW1hc3Rlci1jdi1wYXRoJyk7XG4gICAgICAgIGlmIChwYXRoRWwpIHBhdGhFbC50ZXh0Q29udGVudCA9IGRhdGEucGF0aCB8fCAnKHVua25vd24pJztcbiAgICAgICAgc2VjdGlvbiA9ICdtaXNzaW5nJztcbiAgICAgIH0gZWxzZSBpZiAoZGF0YS5pc19lbXB0eSkge1xuICAgICAgICBzZWN0aW9uID0gJ2VtcHR5JztcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKF8pIHt9XG4gIGNvbnN0IHN0YXR1c0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ29uYm9hcmRpbmctbW9kYWwtc3RhdHVzJyk7XG4gIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnJztcbiAgX3NldFdlbGNvbWVTZWN0aW9uKHNlY3Rpb24pO1xuICBjb25zdCBvdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ29uYm9hcmRpbmctbW9kYWwtb3ZlcmxheScpO1xuICBpZiAob3ZlcmxheSkge1xuICAgIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICBfb3Blbk9uYm9hcmRpbmdGb2N1c1RyYXAob3ZlcmxheSk7XG4gIH1cbn1cblxuLyoqIFdpcmUgZm9jdXMgdHJhcCBhbmQgRXNjYXBlIGhhbmRsZXIgZm9yIHRoZSBvbmJvYXJkaW5nIG92ZXJsYXkgKFdDQUcgMi4xLjIpLiAqL1xuZnVuY3Rpb24gX29wZW5PbmJvYXJkaW5nRm9jdXNUcmFwKG92ZXJsYXkpIHtcbiAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzLnNldEluaXRpYWxGb2N1cyA9PT0gJ2Z1bmN0aW9uJykgZ2xvYmFsVGhpcy5zZXRJbml0aWFsRm9jdXMoJ29uYm9hcmRpbmctbW9kYWwtb3ZlcmxheScpO1xuICBpZiAodHlwZW9mIGdsb2JhbFRoaXMudHJhcEZvY3VzID09PSAnZnVuY3Rpb24nKSAgICAgICBnbG9iYWxUaGlzLnRyYXBGb2N1cygnb25ib2FyZGluZy1tb2RhbC1vdmVybGF5Jyk7XG4gIGlmICghb3ZlcmxheS5fb25ib2FyZGluZ0VzY0hhbmRsZXIpIHtcbiAgICBvdmVybGF5Ll9vbmJvYXJkaW5nRXNjSGFuZGxlciA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSBjbG9zZVdlbGNvbWVNb2RhbCgpO1xuICAgIH07XG4gICAgb3ZlcmxheS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb3ZlcmxheS5fb25ib2FyZGluZ0VzY0hhbmRsZXIpO1xuICB9XG59XG5cbi8qKlxuICogU2hvdyB0aGUgd2VsY29tZSBtb2RhbCB1bmNvbmRpdGlvbmFsbHkgKGlnbm9yZXMgdGhlIFwiZG9uJ3Qgc2hvdyBhZ2FpblwiIGZsYWcpLlxuICogVXNlZCBieSB0aGUgSGVscCBidXR0b24gc28gdXNlcnMgY2FuIGFsd2F5cyByZW9wZW4gb25ib2FyZGluZyBtaWQtc2Vzc2lvbi5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2hvd1dlbGNvbWVNb2RhbCgpIHtcbiAgbGV0IHNlY3Rpb24gPSAncHJlc2VudCc7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvc2V0dXAvbWFzdGVyLWN2LXN0YXR1cycpO1xuICAgIGlmIChyZXMub2spIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpLmNhdGNoKCgpID0+ICh7fSkpO1xuICAgICAgaWYgKCFkYXRhLmV4aXN0cykge1xuICAgICAgICBjb25zdCBwYXRoRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb25ib2FyZGluZy1tYXN0ZXItY3YtcGF0aCcpO1xuICAgICAgICBpZiAocGF0aEVsKSBwYXRoRWwudGV4dENvbnRlbnQgPSBkYXRhLnBhdGggfHwgJyh1bmtub3duKSc7XG4gICAgICAgIHNlY3Rpb24gPSAnbWlzc2luZyc7XG4gICAgICB9IGVsc2UgaWYgKGRhdGEuaXNfZW1wdHkpIHtcbiAgICAgICAgc2VjdGlvbiA9ICdlbXB0eSc7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChfKSB7fVxuICBjb25zdCBzdGF0dXNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvbmJvYXJkaW5nLW1vZGFsLXN0YXR1cycpO1xuICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJyc7XG4gIF9zZXRXZWxjb21lU2VjdGlvbihzZWN0aW9uKTtcbiAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvbmJvYXJkaW5nLW1vZGFsLW92ZXJsYXknKTtcbiAgaWYgKG92ZXJsYXkpIHtcbiAgICBvdmVybGF5LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgX29wZW5PbmJvYXJkaW5nRm9jdXNUcmFwKG92ZXJsYXkpO1xuICB9XG59XG5cbi8qKlxuICogQ2xvc2UgdGhlIHdlbGNvbWUgbW9kYWwuXG4gKiBJZiBcIkRvbid0IHNob3cgYWdhaW5cIiBpcyBjaGVja2VkLCBwZXJzaXN0cyB0aGUgZGlzbWlzc2FsIGluIGxvY2FsU3RvcmFnZS5cbiAqL1xuZnVuY3Rpb24gY2xvc2VXZWxjb21lTW9kYWwoKSB7XG4gIGNvbnN0IG92ZXJsYXkgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ29uYm9hcmRpbmctbW9kYWwtb3ZlcmxheScpO1xuICBjb25zdCBjaGVja2JveCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd3ZWxjb21lLWRvbnQtc2hvdy1hZ2FpbicpO1xuICBpZiAob3ZlcmxheSkge1xuICAgIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBpZiAob3ZlcmxheS5fb25ib2FyZGluZ0VzY0hhbmRsZXIpIHtcbiAgICAgIG92ZXJsYXkucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIG92ZXJsYXkuX29uYm9hcmRpbmdFc2NIYW5kbGVyKTtcbiAgICAgIGRlbGV0ZSBvdmVybGF5Ll9vbmJvYXJkaW5nRXNjSGFuZGxlcjtcbiAgICB9XG4gIH1cbiAgaWYgKGNoZWNrYm94ICYmIGNoZWNrYm94LmNoZWNrZWQpIHtcbiAgICB0cnkgeyBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShfV0VMQ09NRV9ESVNNSVNTRURfS0VZLCAnMScpOyB9IGNhdGNoIChfKSB7fVxuICB9XG4gIGlmICh0eXBlb2YgZ2xvYmFsVGhpcy5yZXN0b3JlRm9jdXMgPT09ICdmdW5jdGlvbicpIGdsb2JhbFRoaXMucmVzdG9yZUZvY3VzKCk7XG59XG5cbi8qKlxuICogQ2FsbGVkIGJ5IHRoZSBvbmJvYXJkaW5nIG1vZGFsIFwiQ3JlYXRlIGVtcHR5IHByb2ZpbGVcIiBidXR0b24uXG4gKiBQT1NUcyB0byAvYXBpL3NldHVwL2NyZWF0ZS1tYXN0ZXItY3YsIHRoZW4gbmF2aWdhdGVzIHRvIGEgbmV3IHNlc3Npb24uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG9uYm9hcmRpbmdDcmVhdGVFbXB0eVByb2ZpbGUoKSB7XG4gIGNvbnN0IGJ0biAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ29uYm9hcmRpbmctY3JlYXRlLWJ0bicpO1xuICBjb25zdCBzdGF0dXNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvbmJvYXJkaW5nLW1vZGFsLXN0YXR1cycpO1xuICBpZiAoYnRuKSBidG4uZGlzYWJsZWQgPSB0cnVlO1xuICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJ0NyZWF0aW5nIHByb2ZpbGVcdTIwMjYnO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9zZXR1cC9jcmVhdGUtbWFzdGVyLWN2JywgeyBtZXRob2Q6ICdQT1NUJyB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKTtcbiAgICBpZiAoIXJlcy5vaykge1xuICAgICAgY29uc3QgbXNnID0gZGF0YS5lcnJvciA9PT0gJ2FscmVhZHlfZXhpc3RzJ1xuICAgICAgICA/ICdGaWxlIGFscmVhZHkgZXhpc3RzIFx1MjAxNCBwbGVhc2UgcmVsb2FkIHRoZSBwYWdlLidcbiAgICAgICAgOiAoZGF0YS5lcnJvciB8fCBgU2VydmVyIGVycm9yICR7cmVzLnN0YXR1c31gKTtcbiAgICAgIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSBtc2c7XG4gICAgICBpZiAoYnRuKSBidG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gRmlsZSBjcmVhdGVkIFx1MjAxNCBub3cgbmF2aWdhdGUgdG8gYSBuZXcgc2Vzc2lvblxuICAgIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnUHJvZmlsZSBjcmVhdGVkISBTdGFydGluZyBzZXNzaW9uXHUyMDI2JztcbiAgICBhd2FpdCBjcmVhdGVOZXdTZXNzaW9uQW5kTmF2aWdhdGUoKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKHN0YXR1c0VsKSBzdGF0dXNFbC50ZXh0Q29udGVudCA9IGBFcnJvcjogJHtlcnIubWVzc2FnZX1gO1xuICAgIGlmIChidG4pIGJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU2Vzc2lvbiBjcmVhdGlvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZU5ld1Nlc3Npb25BbmROYXZpZ2F0ZSgpIHtcbiAgY29uc3QgZGF0YSA9IGF3YWl0IGNyZWF0ZVNlc3Npb24oKTtcbiAgaWYgKGRhdGEuZXJyb3IgPT09ICdtYXN0ZXJfY3ZfbWlzc2luZycpIHtcbiAgICBzaG93T25ib2FyZGluZ01vZGFsKGRhdGEubWFzdGVyX2N2X3BhdGggfHwgJycpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIWRhdGEuc2Vzc2lvbl9pZCkgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gY3JlYXRlIHNlc3Npb24nKTtcbiAgLy8gQ2xlYXIgYW55IHN0YWxlIHNlc3Npb24gcGF0aCBcdTIwMTQgdGhlIG5ldyBzZXNzaW9uIGhhcyBubyBzYXZlZCBmaWxlIHlldC5cbiAgLy8gSWYgU0VTU0lPTl9QQVRIIHdlcmUgbGVmdCBwb2ludGluZyBhdCBhIHByZXZpb3VzIHNlc3Npb24ncyBmaWxlLCB0aGVcbiAgLy8gZGlzay1yZXN0b3JlIGd1YXJkIGluIHJlc3RvcmVCYWNrZW5kU3RhdGUgY291bGQgbG9hZCB0aGUgd3Jvbmcgc2Vzc2lvblxuICAvLyBvbiB0aGUgbmV4dCB2aXNpdCBvbmNlIFNFU1NJT05fSUQgaXMgdXBkYXRlZCBieSB0aGUgYmVmb3JldW5sb2FkIGhhbmRsZXIuXG4gIHRyeSB7IGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdjdi1idWlsZGVyLXNlc3Npb24tcGF0aCcpOyB9IGNhdGNoIChfKSB7fVxuICB3aW5kb3cubG9jYXRpb24uYXNzaWduKGRhdGEucmVkaXJlY3RfdXJsIHx8IGAvP3Nlc3Npb249JHtkYXRhLnNlc3Npb25faWR9YCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZU5ld1Nlc3Npb25Jbk5ld1RhYigpIHtcbiAgY29uc3QgZGF0YSA9IGF3YWl0IGNyZWF0ZVNlc3Npb24oKTtcbiAgaWYgKGRhdGEuZXJyb3IgPT09ICdtYXN0ZXJfY3ZfbWlzc2luZycpIHtcbiAgICBzaG93T25ib2FyZGluZ01vZGFsKGRhdGEubWFzdGVyX2N2X3BhdGggfHwgJycpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIWRhdGEuc2Vzc2lvbl9pZCkgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gY3JlYXRlIHNlc3Npb24nKTtcbiAgd2luZG93Lm9wZW4oZGF0YS5yZWRpcmVjdF91cmwgfHwgYC8/c2Vzc2lvbj0ke2RhdGEuc2Vzc2lvbl9pZH1gLCAnX2JsYW5rJywgJ25vb3BlbmVyJyk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU2Vzc2lvbiBjbGFpbSAvIG93bmVyc2hpcFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmFzeW5jIGZ1bmN0aW9uIF9jbGFpbUN1cnJlbnRTZXNzaW9uKHNlc3Npb25JZFRvQ2xhaW0pIHtcbiAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvc2Vzc2lvbnMvY2xhaW0nLCB7XG4gICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgc2Vzc2lvbl9pZDogc2Vzc2lvbklkVG9DbGFpbSxcbiAgICAgIG93bmVyX3Rva2VuOiBnZXRPd25lclRva2VuKCksXG4gICAgfSksXG4gIH0pO1xuXG4gIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpLmNhdGNoKCgpID0+ICh7fSkpO1xuICBpZiAocmVzLm9rICYmIGRhdGEub2sgIT09IGZhbHNlKSByZXR1cm4gdHJ1ZTtcblxuICBpZiAocmVzLnN0YXR1cyA9PT0gNDA5ICYmIGRhdGEuZXJyb3IgPT09ICdzZXNzaW9uX293bmVkJykge1xuICAgIGNvbnN0IGFjdGlvbiA9IGF3YWl0IHNob3dPd25lcnNoaXBDb25mbGljdERpYWxvZyhcbiAgICAgICdUaGlzIHNlc3Npb24gaXMgY3VycmVudGx5IGNsYWltZWQgYnkgYW5vdGhlciBicm93c2VyIHRhYi4gWW91IGNhbiB0YWtlIGl0IG92ZXIsIHN0YXJ0IGEgbmV3IHNlc3Npb24sIG9yIGxvYWQgYSBkaWZmZXJlbnQgb25lLidcbiAgICApO1xuICAgIGlmIChhY3Rpb24gPT09ICduZXcnKSB7XG4gICAgICBhd2FpdCBjcmVhdGVOZXdTZXNzaW9uQW5kTmF2aWdhdGUoKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGFjdGlvbiAhPT0gJ3Rha2VvdmVyJykge1xuICAgICAgc2hvd1Nlc3Npb25zTGFuZGluZ1BhbmVsKCdTZWxlY3QgYSBkaWZmZXJlbnQgc2Vzc2lvbiBvciBjcmVhdGUgYSBuZXcgb25lLicpO1xuICAgICAgb3BlblNlc3Npb25zTW9kYWwoeyByZXF1aXJlZDogdHJ1ZSB9KTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCB0YWtlb3ZlclJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3Nlc3Npb25zL3Rha2VvdmVyJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgc2Vzc2lvbl9pZDogc2Vzc2lvbklkVG9DbGFpbSxcbiAgICAgICAgb3duZXJfdG9rZW46IGdldE93bmVyVG9rZW4oKSxcbiAgICAgIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IHRha2VvdmVyRGF0YSA9IGF3YWl0IHRha2VvdmVyUmVzLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKTtcbiAgICBpZiAoIXRha2VvdmVyUmVzLm9rKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IodGFrZW92ZXJEYXRhLmVycm9yIHx8ICdGYWlsZWQgdG8gdGFrZSBvdmVyIHNlc3Npb24nKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAocmVzLnN0YXR1cyA9PT0gNDA0IHx8IGRhdGEuZXJyb3IgPT09ICdzZXNzaW9uX25vdF9mb3VuZCcpIHtcbiAgICBzaG93U2Vzc2lvbnNMYW5kaW5nUGFuZWwoJ1RoYXQgc2Vzc2lvbiBpcyBubyBsb25nZXIgYWN0aXZlLiBMb2FkIGl0IGZyb20gZGlzayBvciBjcmVhdGUgYSBuZXcgb25lLicpO1xuICAgIG9wZW5TZXNzaW9uc01vZGFsKHsgcmVxdWlyZWQ6IHRydWUgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGRhdGEuZXJyb3IgfHwgYEZhaWxlZCB0byBjbGFpbSBzZXNzaW9uICgke3Jlcy5zdGF0dXN9KWApO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNlc3Npb24gbmF2aWdhdGlvbiBmcm9tIGxhbmRpbmcgcGFnZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIHNob3dTZXNzaW9uc0xhbmRpbmdQYW5lbChtZXNzYWdlID0gJycpIHtcbiAgc3RhdGVNYW5hZ2VyLnNldEN1cnJlbnRUYWIoJ2pvYicpO1xuICBzdGF0ZU1hbmFnZXIuc2V0UGhhc2UoUEhBU0VTLklOSVQpO1xuICB1cGRhdGVBY3Rpb25CdXR0b25zKCdqb2InKTtcbiAgdXBkYXRlUG9zaXRpb25UaXRsZSh7fSk7XG5cbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIGlmICghY29udGVudCkgcmV0dXJuO1xuXG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLWxhbmRpbmctc2hlbGxcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLWxhbmRpbmctaGVhZGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLWxhbmRpbmctY29weVwiPlxuICAgICAgICAgIDxoMj5TZWxlY3QgYSBTZXNzaW9uPC9oMj5cbiAgICAgICAgICA8cD5FYWNoIGJyb3dzZXIgdGFiIG5vdyB3b3JrcyBhZ2FpbnN0IGl0cyBvd24gVVJMLXNjb3BlZCBzZXNzaW9uLjwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLWxhbmRpbmctYWN0aW9uc1wiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgb25jbGljaz1cImNyZWF0ZU5ld1Nlc3Npb25Jbk5ld1RhYigpXCI+XHVGRjBCIE5ldyBTZXNzaW9uIGluIE5ldyBUYWI8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgICR7bWVzc2FnZSA/IGA8cCBzdHlsZT1cIm1hcmdpbi1ib3R0b206MjBweDtjb2xvcjojYjQ1MzA5O2ZvbnQtd2VpZ2h0OjYwMDtcIj4ke2VzY2FwZUh0bWwobWVzc2FnZSl9PC9wPmAgOiAnJ31cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjEycHg7bWFyZ2luLWJvdHRvbToyNHB4O2ZsZXgtd3JhcDp3cmFwO1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBwcmltYXJ5XCIgb25jbGljaz1cImNyZWF0ZU5ld1Nlc3Npb25BbmROYXZpZ2F0ZSgpXCI+KyBOZXcgU2Vzc2lvbjwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGA7XG59XG5cbmZ1bmN0aW9uIF9yZXN0b3JlVGFiRm9yUGhhc2Uoc2Vzc2lvblBoYXNlKSB7XG4gIGNvbnN0IHBoYXNlVGFiTWFwID0ge1xuICAgIFtQSEFTRVMuSU5JVF06ICAgICAgICAgICAgICdqb2InLFxuICAgIFtQSEFTRVMuSk9CX0FOQUxZU0lTXTogICAgICdhbmFseXNpcycsXG4gICAgW1BIQVNFUy5DVVNUT01JWkFUSU9OXTogICAgJ2V4cC1yZXZpZXcnLFxuICAgIFtQSEFTRVMuUkVXUklURV9SRVZJRVddOiAgICdyZXdyaXRlJyxcbiAgICBbUEhBU0VTLlNQRUxMX0NIRUNLXTogICAgICAnc3BlbGwnLFxuICAgIFtQSEFTRVMuR0VORVJBVElPTl06ICAgICAgICdsYXlvdXQnLFxuICAgIFtQSEFTRVMuTEFZT1VUX1JFVklFV106ICAgICdsYXlvdXQnLFxuICAgIFtQSEFTRVMuRklOQUxfR0VORVJBVElPTl06ICdmaW5hbF9nZW5lcmF0ZScsXG4gICAgW1BIQVNFUy5SRUZJTkVNRU5UXTogICAgICAgJ2Rvd25sb2FkJyxcbiAgfTtcbiAgY29uc3QgdGFyZ2V0VGFiID0gcGhhc2VUYWJNYXBbc2Vzc2lvblBoYXNlXSB8fCAnam9iJztcblxuICBpZiAodHlwZW9mIHN3aXRjaFRhYiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHN3aXRjaFRhYih0YXJnZXRUYWIpO1xuICB9IGVsc2Uge1xuICAgIHN0YXRlTWFuYWdlci5zZXRDdXJyZW50VGFiKHRhcmdldFRhYik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX3Jlc29sdmVSZXN0b3JlZFBoYXNlKHN0YXR1c0RhdGEpIHtcbiAgY29uc3QgcGhhc2UgPSBzdGF0dXNEYXRhPy5waGFzZSB8fCBQSEFTRVMuSU5JVDtcblxuICAvLyBHdWFyZDogbm8gam9iX2FuYWx5c2lzIG1lYW5zIHdlIGNhbm5vdCBiZSBwYXN0IHRoZSBpbml0aWFsIGlucHV0IHN0ZXAuXG4gIGlmICghc3RhdHVzRGF0YT8uam9iX2FuYWx5c2lzKSB7XG4gICAgcmV0dXJuIFBIQVNFUy5JTklUO1xuICB9XG5cbiAgLy8gR3VhcmQ6IHBoYXNlIGNsYWltcyBjdXN0b21pemF0aW9ucyB3ZXJlIHJldmlld2VkLCBidXQgdGhleSB3ZXJlIG5ldmVyXG4gIC8vIGdlbmVyYXRlZCAoZS5nLiBiYWNrZW5kIHJlc3RhcnRlZCBhZnRlciBhbmFseXplX2pvYiBidXQgYmVmb3JlXG4gIC8vIHJlY29tbWVuZF9jdXN0b21pemF0aW9ucyByYW4sIG9yIGxlZ2FjeSBzZXNzaW9ucyBzYXZlZCB3aXRoIHRoZSBvbGRcbiAgLy8gcHJlbWF0dXJlLUNVU1RPTUlaQVRJT04gYnVnKS4gRmFsbCBiYWNrIHNvIHRoZSB1c2VyIHNlZXMgdGhlIEFuYWx5c2lzXG4gIC8vIHN0ZXAgYW5kIGNhbiBydW4gUmVjb21tZW5kIEN1c3RvbWl6YXRpb25zIGZyb20gdGhlcmUuXG4gIGlmIChcbiAgICAocGhhc2UgPT09IFBIQVNFUy5DVVNUT01JWkFUSU9OIHx8IHBoYXNlID09PSBQSEFTRVMuUkVXUklURV9SRVZJRVcpXG4gICAgJiYgIXN0YXR1c0RhdGE/LmN1c3RvbWl6YXRpb25zXG4gICkge1xuICAgIHJldHVybiBQSEFTRVMuSk9CX0FOQUxZU0lTO1xuICB9XG5cbiAgcmV0dXJuIHBoYXNlO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNlc3Npb24gY29udGV4dCAvIHJlc3RvcmVcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5hc3luYyBmdW5jdGlvbiBlbnN1cmVTZXNzaW9uQ29udGV4dCgpIHtcbiAgY29uc3QgdXJsU2Vzc2lvbklkID0gZ2V0U2Vzc2lvbklkRnJvbVVSTCgpO1xuICBpZiAoIXVybFNlc3Npb25JZCkge1xuICAgIHNob3dTZXNzaW9uc0xhbmRpbmdQYW5lbCgpO1xuICAgIG9wZW5TZXNzaW9uc01vZGFsKHsgcmVxdWlyZWQ6IHRydWUgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgc3RhdGVNYW5hZ2VyLnNldFNlc3Npb25JZCh1cmxTZXNzaW9uSWQpO1xuICByZXR1cm4gX2NsYWltQ3VycmVudFNlc3Npb24odXJsU2Vzc2lvbklkKTtcbn1cblxuZnVuY3Rpb24gX2FwcGVuZFJlc3RvcmVkRGVjaXNpb25zU3VtbWFyeSgpIHtcbiAgY29uc3QgcGhhc2UgPSBzdGF0ZU1hbmFnZXIuZ2V0UGhhc2UoKTtcbiAgY29uc3QgY3VzdG9taXphdGlvbnMgPSBzdGF0ZU1hbmFnZXIuZ2V0VGFiRGF0YSgnY3VzdG9taXphdGlvbnMnKSB8fCB3aW5kb3cucGVuZGluZ1JlY29tbWVuZGF0aW9ucztcbiAgY29uc3QgcGFydHMgPSBbXTtcblxuICBpZiAoY3VzdG9taXphdGlvbnMpIHtcbiAgICBjb25zdCBleHBDb3VudCA9IChjdXN0b21pemF0aW9ucy5yZWNvbW1lbmRlZF9leHBlcmllbmNlcyB8fCBbXSkubGVuZ3RoO1xuICAgIGlmIChleHBDb3VudCA+IDApIHBhcnRzLnB1c2goYCR7ZXhwQ291bnR9IGV4cGVyaWVuY2Uke2V4cENvdW50ICE9PSAxID8gJ3MnIDogJyd9IHJlY29tbWVuZGVkYCk7XG4gICAgY29uc3Qgc2tpbGxDb3VudCA9IChjdXN0b21pemF0aW9ucy5yZWNvbW1lbmRlZF9za2lsbHMgfHwgW10pLmxlbmd0aDtcbiAgICBpZiAoc2tpbGxDb3VudCA+IDApIHBhcnRzLnB1c2goYCR7c2tpbGxDb3VudH0gc2tpbGwke3NraWxsQ291bnQgIT09IDEgPyAncycgOiAnJ30gcmVjb21tZW5kZWRgKTtcbiAgfVxuXG4gIGNvbnN0IGRlY2lzaW9ucyA9IHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMgfHwge307XG4gIGNvbnN0IGFwcHJvdmVkUmV3cml0ZXMgPSBBcnJheS5pc0FycmF5KHdpbmRvdy5hcHByb3ZlZFJld3JpdGVzKSA/IHdpbmRvdy5hcHByb3ZlZFJld3JpdGVzLmxlbmd0aFxuICAgIDogT2JqZWN0LmtleXMoZGVjaXNpb25zLmV4cGVyaWVuY2VfZGVjaXNpb25zIHx8IHt9KS5sZW5ndGg7XG4gIGlmIChhcHByb3ZlZFJld3JpdGVzID4gMCkgcGFydHMucHVzaChgJHthcHByb3ZlZFJld3JpdGVzfSByZXdyaXRlJHthcHByb3ZlZFJld3JpdGVzICE9PSAxID8gJ3MnIDogJyd9IGFwcHJvdmVkYCk7XG5cbiAgY29uc3QgYXRzID0gc3RhdGVNYW5hZ2VyLmdldEF0c1Njb3JlKCk7XG4gIGlmIChhdHMgJiYgdHlwZW9mIGF0cy5vdmVyYWxsID09PSAnbnVtYmVyJykge1xuICAgIHBhcnRzLnB1c2goYEFUUyBzY29yZSAke01hdGgucm91bmQoYXRzLm92ZXJhbGwpfSVgKTtcbiAgfVxuXG4gIGlmIChwYXJ0cy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgcGhhc2VMYWJlbCA9IFNFU1NJT05fUEhBU0VfTEFCRUxTX1NIT1JUW3BoYXNlXSB8fCBTdHJpbmcocGhhc2UpLnJlcGxhY2UoL18vZywgJyAnKTtcbiAgICBjb25zdCBwb3NpdGlvbkN0eCA9IHdpbmRvdy5fcmVzdG9yZWRQb3NpdGlvbk5hbWUgPyBgIGZvciAke3dpbmRvdy5fcmVzdG9yZWRQb3NpdGlvbk5hbWV9YCA6ICcnO1xuICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsIGBcdUQ4M0RcdURDQ0IgUmVzdG9yZWQke3Bvc2l0aW9uQ3R4fSBhdCBzdGFnZTogJHtwaGFzZUxhYmVsfSBcdTIwMTQgJHtwYXJ0cy5qb2luKCcsICcpfS5gKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZXN0b3JlU2Vzc2lvbigpIHtcbiAgdHJ5IHtcbiAgICBzdGF0ZU1hbmFnZXIuc2V0SXNSZWNvbm5lY3RpbmcodHJ1ZSk7XG5cbiAgICBjb25zdCBzdG9yZWRTZXNzaW9uSWQgPSBnZXRTZXNzaW9uSWRGcm9tVVJMKCkgfHwgbG9jYWxTdG9yYWdlLmdldEl0ZW0oU3RvcmFnZUtleXMuU0VTU0lPTl9JRCk7XG4gICAgaWYgKCFzdG9yZWRTZXNzaW9uSWQpIHtcbiAgICAgIHN0YXRlTWFuYWdlci5zZXRJc1JlY29ubmVjdGluZyhmYWxzZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN0YXRlTWFuYWdlci5zZXRTZXNzaW9uSWQoc3RvcmVkU2Vzc2lvbklkKTtcblxuICAgIC8vIFRyeSB0byByZXN0b3JlIGNvbnZlcnNhdGlvbiBoaXN0b3J5IGZyb20gYmFja2VuZFxuICAgIGNvbnN0IGhpc3RvcnlSZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9oaXN0b3J5Jyk7XG4gICAgaWYgKGhpc3RvcnlSZXMub2spIHtcbiAgICAgIGNvbnN0IGhpc3RvcnlEYXRhID0gYXdhaXQgaGlzdG9yeVJlcy5qc29uKCk7XG5cbiAgICAgIC8vIEFsd2F5cyBjbGVhciBwbGFjZWhvbGRlciBIVE1MIGNvbnRlbnQgbm93IHRoYXQgd2UgaGF2ZSBhIGxpdmUgc2Vzc2lvbiByZXNwb25zZS5cbiAgICAgIGNvbnN0IGNvbnZlcnNhdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb252ZXJzYXRpb24nKTtcbiAgICAgIGNvbnZlcnNhdGlvbi5pbm5lckhUTUwgPSAnJztcblxuICAgICAgLy8gQWx3YXlzIHJlc3RvcmUgZnJvbSB0aGUgc2VydmVyIHNlc3Npb24gZmlsZSAoYXV0aG9yaXRhdGl2ZSBoaXN0b3J5IHNvdXJjZSkuXG4gICAgICBpZiAoaGlzdG9yeURhdGEuaGlzdG9yeSAmJiBoaXN0b3J5RGF0YS5oaXN0b3J5Lmxlbmd0aCA+IDApIHtcblxuICAgICAgICBoaXN0b3J5RGF0YS5oaXN0b3J5LmZvckVhY2gobXNnID0+IHtcbiAgICAgICAgICBpZiAobXNnLnJvbGUgPT09ICd1c2VyJykge1xuICAgICAgICAgICAgYXBwZW5kTWVzc2FnZSgndXNlcicsIG1zZy5jb250ZW50KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKG1zZy5yb2xlID09PSAnYXNzaXN0YW50Jykge1xuICAgICAgICAgICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgbXNnLmNvbnRlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgJ1x1RDgzRFx1REQwNCBTZXNzaW9uIHJlc3RvcmVkIGZyb20gc2VydmVyLicpO1xuICAgICAgICBsb2cuaW5mbyhgUmVzdG9yZWQgJHtoaXN0b3J5RGF0YS5oaXN0b3J5Lmxlbmd0aH0gbWVzc2FnZXMgZnJvbSBiYWNrZW5kYCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSBwaGFzZVxuICAgICAgaWYgKGhpc3RvcnlEYXRhLnBoYXNlKSB7XG4gICAgICAgIHN0YXRlTWFuYWdlci5zZXRQaGFzZShoaXN0b3J5RGF0YS5waGFzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVHJ5IHRvIHJlc3RvcmUgYmFja2VuZCBzdGF0ZS5cbiAgICAvLyBSZXR1cm5zIHRydWUgd2hlbiBzZXJ2ZXIgaGFkIGxpdmUgc2Vzc2lvbiBkYXRhIChpbiBtZW1vcnkgb3IgbG9hZGVkIGZyb20gZGlzaykuXG4gICAgY29uc3Qgc2VydmVySGFzRGF0YSA9IGF3YWl0IHJlc3RvcmVCYWNrZW5kU3RhdGUoKTtcblxuICAgIC8vIFJlc3RvcmUgVUktb25seSBwcmVmcyAoYWN0aXZlUmV2aWV3UGFuZSkgZnJvbSBsb2NhbFN0b3JhZ2UuXG4gICAgcmVzdG9yZVRhYkRhdGEoeyB1aVByZWZzT25seTogc2VydmVySGFzRGF0YSB9KTtcblxuICAgIC8vIFNob3cgYSByZXN0b3JlZC1kZWNpc2lvbnMgc3VtbWFyeSB3aGVuIHRoZSBiYWNrZW5kIGhhZCBsaXZlIHNlc3Npb24gZGF0YS5cbiAgICBpZiAoc2VydmVySGFzRGF0YSkge1xuICAgICAgX2FwcGVuZFJlc3RvcmVkRGVjaXNpb25zU3VtbWFyeSgpO1xuICAgIH1cblxuICAgIHN0YXRlTWFuYWdlci5zZXRJc1JlY29ubmVjdGluZyhmYWxzZSk7XG5cbiAgICAvLyBSdW4gYSBiYWNrZ3JvdW5kIGhlYWx0aCBjaGVjayBzbyB0aGUgc3RhdHVzIHBpbGwgcmVmbGVjdHMgbGl2ZSBjb25uZWN0aXZpdHkuXG4gICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzLnRlc3RDdXJyZW50TW9kZWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGdsb2JhbFRoaXMudGVzdEN1cnJlbnRNb2RlbCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICB9XG5cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cud2FybignU2Vzc2lvbiByZXN0b3JhdGlvbiBmYWlsZWQ6JywgZXJyb3IpO1xuICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsIGBcdTI2QTBcdUZFMEYgQ291bGQgbm90IHJlc3RvcmUgcHJldmlvdXMgc2Vzc2lvbi4gU3RhcnRpbmcgZnJlc2guICgke2Vycm9yLm1lc3NhZ2V9KWApO1xuICAgIHN0YXRlTWFuYWdlci5zZXRJc1JlY29ubmVjdGluZyhmYWxzZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2h5ZHJhdGVTdGF0dXNEZXJpdmVkU3RhdGUoc3RhdHVzRGF0YSkge1xuICB3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0cyA9IHt9O1xuICB0cnkge1xuICAgIGlmIChzdGF0dXNEYXRhLmFjaGlldmVtZW50X2VkaXRzICYmIE9iamVjdC5rZXlzKHN0YXR1c0RhdGEuYWNoaWV2ZW1lbnRfZWRpdHMpLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHN0YXR1c0RhdGEuYWNoaWV2ZW1lbnRfZWRpdHMpKSB7XG4gICAgICAgIGNvbnN0IGlkeCA9IHBhcnNlSW50KGssIDEwKTtcbiAgICAgICAgY29uc3QgcmF3SXRlbXMgPSBBcnJheS5pc0FycmF5KHYpID8gdiA6IFt2XTtcbiAgICAgICAgd2luZG93LmFjaGlldmVtZW50RWRpdHNbaWR4XSA9IHJhd0l0ZW1zLm1hcChpdGVtID0+IHtcbiAgICAgICAgICBpZiAoaXRlbSAmJiB0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoaXRlbSkpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHRleHQ6IFN0cmluZyhpdGVtLnRleHQgPz8gaXRlbS5kZXNjcmlwdGlvbiA/PyBpdGVtLmNvbnRlbnQgPz8gJycpLFxuICAgICAgICAgICAgICBoaWRkZW46IEJvb2xlYW4oaXRlbS5oaWRkZW4pLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRleHQ6IFN0cmluZyhpdGVtID8/ICcnKSxcbiAgICAgICAgICAgIGhpZGRlbjogZmFsc2UsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChfZSkgeyAvKiBub24tZmF0YWwgKi8gfVxuXG4gIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMgPSB7XG4gICAgZXhwZXJpZW5jZV9kZWNpc2lvbnM6IHN0YXR1c0RhdGEuZXhwZXJpZW5jZV9kZWNpc2lvbnMgfHwge30sXG4gICAgc2tpbGxfZGVjaXNpb25zOiAgICAgIHN0YXR1c0RhdGEuc2tpbGxfZGVjaXNpb25zICAgICAgfHwge30sXG4gICAgYWNoaWV2ZW1lbnRfZGVjaXNpb25zOnN0YXR1c0RhdGEuYWNoaWV2ZW1lbnRfZGVjaXNpb25zIHx8IHt9LFxuICAgIHB1YmxpY2F0aW9uX2RlY2lzaW9uczpzdGF0dXNEYXRhLnB1YmxpY2F0aW9uX2RlY2lzaW9ucyB8fCB7fSxcbiAgICBzdW1tYXJ5X2ZvY3VzX292ZXJyaWRlOiBzdGF0dXNEYXRhLnN1bW1hcnlfZm9jdXNfb3ZlcnJpZGUgfHwgbnVsbCxcbiAgICBleHRyYV9za2lsbHM6ICAgICAgICAgICBzdGF0dXNEYXRhLmV4dHJhX3NraWxscyB8fCBbXSxcbiAgICBleHRyYV9za2lsbF9tYXRjaGVzOiAgICBzdGF0dXNEYXRhLmV4dHJhX3NraWxsX21hdGNoZXMgfHwge30sXG4gIH07XG4gIHdpbmRvdy5fYWxsRXhwZXJpZW5jZXMgPSBzdGF0dXNEYXRhLmFsbF9leHBlcmllbmNlcyB8fCBbXTtcbiAgd2luZG93LnNlbGVjdGVkU3VtbWFyeUtleSA9IHN0YXR1c0RhdGEuc3VtbWFyeV9mb2N1c19vdmVycmlkZSB8fCBzdGF0dXNEYXRhLnNlbGVjdGVkX3N1bW1hcnlfa2V5IHx8IG51bGw7XG4gIHdpbmRvdy5fbmV3U2tpbGxzRnJvbUxMTSA9IHN0YXR1c0RhdGEubmV3X3NraWxsc19mcm9tX2xsbSB8fCBbXTtcbiAgd2luZG93Ll9zdGF0dXNJbnRha2UgPSBzdGF0dXNEYXRhLmludGFrZSAmJiB0eXBlb2Ygc3RhdHVzRGF0YS5pbnRha2UgPT09ICdvYmplY3QnXG4gICAgPyBzdGF0dXNEYXRhLmludGFrZVxuICAgIDoge307XG4gIHdpbmRvdy5wb3N0QW5hbHlzaXNRdWVzdGlvbnMgPSBBcnJheS5pc0FycmF5KHN0YXR1c0RhdGEucG9zdF9hbmFseXNpc19xdWVzdGlvbnMpXG4gICAgPyBzdGF0dXNEYXRhLnBvc3RfYW5hbHlzaXNfcXVlc3Rpb25zXG4gICAgOiBbXTtcbiAgd2luZG93LnF1ZXN0aW9uQW5zd2VycyA9IChzdGF0dXNEYXRhLnBvc3RfYW5hbHlzaXNfYW5zd2VycyAmJiB0eXBlb2Ygc3RhdHVzRGF0YS5wb3N0X2FuYWx5c2lzX2Fuc3dlcnMgPT09ICdvYmplY3QnKVxuICAgID8gc3RhdHVzRGF0YS5wb3N0X2FuYWx5c2lzX2Fuc3dlcnNcbiAgICA6IHt9O1xuICB3aW5kb3cuX3Jlc3RvcmVkUG9zaXRpb25OYW1lID0gc3RhdHVzRGF0YS5wb3NpdGlvbl9uYW1lIHx8IG51bGw7XG59XG5cbmZ1bmN0aW9uIF9oeWRyYXRlU3RhdHVzVGFiU3RhdGUoc3RhdHVzRGF0YSkge1xuICBjb25zdCBoYXNBbmFseXNpcyA9IHN0YXR1c0RhdGEuam9iX2FuYWx5c2lzICE9PSB1bmRlZmluZWQgJiYgc3RhdHVzRGF0YS5qb2JfYW5hbHlzaXMgIT09IG51bGw7XG4gIGNvbnN0IGhhc0N1c3RvbWl6YXRpb25zID0gc3RhdHVzRGF0YS5jdXN0b21pemF0aW9ucyAhPT0gdW5kZWZpbmVkICYmIHN0YXR1c0RhdGEuY3VzdG9taXphdGlvbnMgIT09IG51bGw7XG4gIGNvbnN0IGhhc0dlbmVyYXRlZEZpbGVzID0gc3RhdHVzRGF0YS5nZW5lcmF0ZWRfZmlsZXMgIT09IHVuZGVmaW5lZCAmJiBzdGF0dXNEYXRhLmdlbmVyYXRlZF9maWxlcyAhPT0gbnVsbDtcblxuICBzdGF0ZU1hbmFnZXIuc2V0VGFiRGF0YSgnYW5hbHlzaXMnLCBoYXNBbmFseXNpcyA/IHN0YXR1c0RhdGEuam9iX2FuYWx5c2lzIDogbnVsbCk7XG4gIHN0YXRlTWFuYWdlci5zZXRUYWJEYXRhKCdjdXN0b21pemF0aW9ucycsIGhhc0N1c3RvbWl6YXRpb25zID8gc3RhdHVzRGF0YS5jdXN0b21pemF0aW9ucyA6IG51bGwpO1xuICBzdGF0ZU1hbmFnZXIuc2V0VGFiRGF0YSgnY3YnLCBoYXNHZW5lcmF0ZWRGaWxlcyA/IHN0YXR1c0RhdGEuZ2VuZXJhdGVkX2ZpbGVzIDogbnVsbCk7XG4gIHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zID0gaGFzQ3VzdG9taXphdGlvbnMgPyBzdGF0dXNEYXRhLmN1c3RvbWl6YXRpb25zIDogbnVsbDtcblxuICBpZiAoaGFzQW5hbHlzaXMpIHtcbiAgICByZWZyZXNoQXRzU2NvcmUoJ2FuYWx5c2lzJyk7XG4gIH1cblxuICByZXR1cm4gaGFzQW5hbHlzaXMgfHwgaGFzQ3VzdG9taXphdGlvbnMgfHwgaGFzR2VuZXJhdGVkRmlsZXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc3RvcmVCYWNrZW5kU3RhdGUoKSB7XG4gIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2VydmVyIGhhZCBhbnkgbGl2ZSBzZXNzaW9uIGRhdGEuXG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdHVzUmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvc3RhdHVzJyk7XG4gICAgaWYgKCFzdGF0dXNSZXMub2spIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBzdGF0dXNEYXRhID0gcGFyc2VTdGF0dXNSZXNwb25zZShhd2FpdCBzdGF0dXNSZXMuanNvbigpKTtcblxuICAgIGlmICh0eXBlb2YgdXBkYXRlQXV0aEJhZGdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB1cGRhdGVBdXRoQmFkZ2Uoc3RhdHVzRGF0YS5jb3BpbG90X2F1dGggfHwge30sIHN0YXR1c0RhdGEubGxtX3Byb3ZpZGVyIHx8IG51bGwpO1xuICAgIH1cblxuICAgIF9oeWRyYXRlU3RhdHVzRGVyaXZlZFN0YXRlKHN0YXR1c0RhdGEpO1xuXG4gICAgbGV0IHNlcnZlckhhc0RhdGEgPSBfaHlkcmF0ZVN0YXR1c1RhYlN0YXRlKHN0YXR1c0RhdGEpO1xuXG4gICAgaWYgKHN0YXR1c0RhdGEuam9iX2FuYWx5c2lzICE9PSB1bmRlZmluZWQgJiYgc3RhdHVzRGF0YS5qb2JfYW5hbHlzaXMgIT09IG51bGwpIHtcbiAgICAgIGxvZy5pbmZvKCdSZXN0b3JlZCBhbmFseXNpcyBkYXRhIGZyb20gYmFja2VuZCBtZW1vcnknKTtcbiAgICB9XG4gICAgaWYgKHN0YXR1c0RhdGEuY3VzdG9taXphdGlvbnMgIT09IHVuZGVmaW5lZCAmJiBzdGF0dXNEYXRhLmN1c3RvbWl6YXRpb25zICE9PSBudWxsKSB7XG4gICAgICBsb2cuaW5mbygnUmVzdG9yZWQgY3VzdG9taXphdGlvbnMgZGF0YSBmcm9tIGJhY2tlbmQgbWVtb3J5Jyk7XG4gICAgfVxuICAgIGlmIChzdGF0dXNEYXRhLmdlbmVyYXRlZF9maWxlcyAhPT0gdW5kZWZpbmVkICYmIHN0YXR1c0RhdGEuZ2VuZXJhdGVkX2ZpbGVzICE9PSBudWxsKSB7XG4gICAgICBsb2cuaW5mbygnUmVzdG9yZWQgQ1YgZGF0YSBmcm9tIGJhY2tlbmQgbWVtb3J5Jyk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGdlbmVyYXRpb25SZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9jdi9nZW5lcmF0aW9uLXN0YXRlJyk7XG4gICAgICBpZiAoZ2VuZXJhdGlvblJlcy5vaykge1xuICAgICAgICBjb25zdCBnZW5lcmF0aW9uRGF0YSA9IGF3YWl0IGdlbmVyYXRpb25SZXMuanNvbigpO1xuICAgICAgICBpZiAoZ2VuZXJhdGlvbkRhdGE/Lm9rKSB7XG4gICAgICAgICAgY29uc3QgaGFzQ2FjaGVkQXRzU2NvcmUgPSBCb29sZWFuKGdlbmVyYXRpb25EYXRhLmF0c19zY29yZSk7XG4gICAgICAgICAgY29uc3QgaGFzUGVyc2lzdGVkR2VuZXJhdGlvbkRhdGEgPSBCb29sZWFuKFxuICAgICAgICAgICAgZ2VuZXJhdGlvbkRhdGEucHJldmlld19hdmFpbGFibGVcbiAgICAgICAgICAgICAgfHwgZ2VuZXJhdGlvbkRhdGEuZmluYWxfZ2VuZXJhdGVkX2F0XG4gICAgICAgICAgICAgIHx8IGhhc0NhY2hlZEF0c1Njb3JlXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHN0YXRlTWFuYWdlci5zZXRHZW5lcmF0aW9uU3RhdGUoe1xuICAgICAgICAgICAgcGhhc2U6IGdlbmVyYXRpb25EYXRhLnBoYXNlIHx8ICdpZGxlJyxcbiAgICAgICAgICAgIHByZXZpZXdBdmFpbGFibGU6IEJvb2xlYW4oZ2VuZXJhdGlvbkRhdGEucHJldmlld19hdmFpbGFibGUpLFxuICAgICAgICAgICAgcHJldmlld091dHB1dHM6IGdlbmVyYXRpb25EYXRhLnByZXZpZXdfb3V0cHV0cyB8fCBudWxsLFxuICAgICAgICAgICAgbGF5b3V0Q29uZmlybWVkOiBCb29sZWFuKGdlbmVyYXRpb25EYXRhLmxheW91dF9jb25maXJtZWQpLFxuICAgICAgICAgICAgcGFnZUNvdW50RXN0aW1hdGU6IGdlbmVyYXRpb25EYXRhLnBhZ2VfY291bnRfZXN0aW1hdGUgPz8gbnVsbCxcbiAgICAgICAgICAgIHBhZ2VDb3VudEV4YWN0OiBnZW5lcmF0aW9uRGF0YS5wYWdlX2NvdW50X2V4YWN0ID8/IG51bGwsXG4gICAgICAgICAgICBwYWdlQ291bnRDb25maWRlbmNlOiBnZW5lcmF0aW9uRGF0YS5wYWdlX2NvdW50X2NvbmZpZGVuY2UgPz8gbnVsbCxcbiAgICAgICAgICAgIHBhZ2VDb3VudFNvdXJjZTogZ2VuZXJhdGlvbkRhdGEucGFnZV9jb3VudF9zb3VyY2UgfHwgbnVsbCxcbiAgICAgICAgICAgIHBhZ2VOZWVkc0V4YWN0UmVjaGVjazogQm9vbGVhbihcbiAgICAgICAgICAgICAgZ2VuZXJhdGlvbkRhdGEucGFnZV9jb3VudF9uZWVkc19leGFjdF9yZWNoZWNrLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHBhZ2VXYXJuaW5nOiBCb29sZWFuKGdlbmVyYXRpb25EYXRhLnBhZ2VfbGVuZ3RoX3dhcm5pbmcpLFxuICAgICAgICAgICAgbGF5b3V0SW5zdHJ1Y3Rpb25zQ291bnQ6IGdlbmVyYXRpb25EYXRhLmxheW91dF9pbnN0cnVjdGlvbnNfY291bnQgfHwgMCxcbiAgICAgICAgICAgIGZpbmFsR2VuZXJhdGVkQXQ6IGdlbmVyYXRpb25EYXRhLmZpbmFsX2dlbmVyYXRlZF9hdCB8fCBudWxsLFxuICAgICAgICAgICAgcHJldmlld0dlbmVyYXRlZEF0OiBnZW5lcmF0aW9uRGF0YS5wcmV2aWV3X2dlbmVyYXRlZF9hdCB8fCBudWxsLFxuICAgICAgICAgICAgcHJldmlld1JlcXVlc3RJZDogZ2VuZXJhdGlvbkRhdGEucHJldmlld19yZXF1ZXN0X2lkIHx8IG51bGwsXG4gICAgICAgICAgICBjb25maXJtZWRBdDogZ2VuZXJhdGlvbkRhdGEuY29uZmlybWVkX2F0IHx8IG51bGwsXG4gICAgICAgICAgICAvLyBPcHRpb25hbCBzZXJ2ZXItcHJvdmlkZWQgcmV2aXNpb24gbWV0YWRhdGEgKGlmIGJhY2tlbmQgZXhwb3NlcyB0aGVtKVxuICAgICAgICAgICAgY29udGVudFJldmlzaW9uOiAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHYgPSBnZW5lcmF0aW9uRGF0YS5jb250ZW50X3JldmlzaW9uID8/IGdlbmVyYXRpb25EYXRhLmNvbnRlbnRSZXZpc2lvbjtcbiAgICAgICAgICAgICAgcmV0dXJuICh2ID09PSB1bmRlZmluZWQgfHwgdiA9PT0gbnVsbCkgPyAwIDogKE51bWJlci5pc0Zpbml0ZShOdW1iZXIodikpID8gTnVtYmVyKHYpIDogMCk7XG4gICAgICAgICAgICB9KSgpLFxuICAgICAgICAgICAgbGFzdFByZXZpZXdDb250ZW50UmV2aXNpb246IGdlbmVyYXRpb25EYXRhLmxhc3RfcHJldmlld19jb250ZW50X3JldmlzaW9uID8/IGdlbmVyYXRpb25EYXRhLmxhc3RQcmV2aWV3Q29udGVudFJldmlzaW9uID8/IG51bGwsXG4gICAgICAgICAgICBsYXN0RmluYWxDb250ZW50UmV2aXNpb246IGdlbmVyYXRpb25EYXRhLmxhc3RfZmluYWxfY29udGVudF9yZXZpc2lvbiA/PyBnZW5lcmF0aW9uRGF0YS5sYXN0RmluYWxDb250ZW50UmV2aXNpb24gPz8gbnVsbCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmIChoYXNDYWNoZWRBdHNTY29yZSkge1xuICAgICAgICAgICAgc3RhdGVNYW5hZ2VyLnNldEF0c1Njb3JlKGdlbmVyYXRpb25EYXRhLmF0c19zY29yZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXRlTWFuYWdlci5jbGVhckF0c1Njb3JlKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGhhc1BlcnNpc3RlZEdlbmVyYXRpb25EYXRhKSB7XG4gICAgICAgICAgICBzZXJ2ZXJIYXNEYXRhID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChfZSkgeyAvKiBub24tZmF0YWwgKi8gfVxuXG4gICAgY29uc3QgcmVzdG9yZWRQaGFzZSA9IF9yZXNvbHZlUmVzdG9yZWRQaGFzZShzdGF0dXNEYXRhKTtcbiAgICBzdGF0ZU1hbmFnZXIuc2V0UGhhc2UocmVzdG9yZWRQaGFzZSk7XG4gICAgX3Jlc3RvcmVUYWJGb3JQaGFzZShyZXN0b3JlZFBoYXNlKTtcblxuICAgIC8vIEtlZXAgdGhlIHBvc2l0aW9uLXRpdGxlIGVsZW1lbnQgaW4gc3luYyB3aGVuZXZlciB3ZSByZXN0b3JlIHN0YXR1cyBkYXRhLlxuICAgIGlmICh0eXBlb2YgdXBkYXRlUG9zaXRpb25UaXRsZSA9PT0gJ2Z1bmN0aW9uJykgdXBkYXRlUG9zaXRpb25UaXRsZShzdGF0dXNEYXRhKTtcblxuICAgIGlmICh0eXBlb2YgdXBkYXRlSW5jbHVzaW9uQ291bnRzID09PSAnZnVuY3Rpb24nKSB1cGRhdGVJbmNsdXNpb25Db3VudHMoKTtcblxuICAgIGlmICghc3RhdHVzRGF0YS5wb3NpdGlvbl9uYW1lICYmICFzdGF0dXNEYXRhLmpvYl9hbmFseXNpcykge1xuICAgICAgY29uc3Qgc3RvcmVkUGF0aCAgICA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFN0b3JhZ2VLZXlzLlNFU1NJT05fUEFUSCk7XG4gICAgICBjb25zdCBzdG9yZWRTZXNzaW9uID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oU3RvcmFnZUtleXMuU0VTU0lPTl9JRCk7XG4gICAgICBjb25zdCBjdXJyZW50U2Vzc2lvbiA9IGdldFNlc3Npb25JZEZyb21VUkwgPyBnZXRTZXNzaW9uSWRGcm9tVVJMKCkgOiBudWxsO1xuICAgICAgLy8gT25seSBhdXRvLXJlc3RvcmUgZnJvbSBkaXNrIHdoZW4gcmVjb25uZWN0aW5nIHRvIHRoZSBTQU1FIHNlc3Npb25cbiAgICAgIC8vIChzdG9yZWRTZXNzaW9uIG1hdGNoZXMgdGhlIGN1cnJlbnQgVVJMIHNlc3Npb25faWQpLiAgQSBmcmVzaCBuZXcgc2Vzc2lvblxuICAgICAgLy8gd2lsbCBoYXZlIGEgZGlmZmVyZW50IElELCBzbyB0aGlzIGd1YXJkIHByZXZlbnRzIHRoZSBuZXcgc2Vzc2lvbiBmcm9tXG4gICAgICAvLyBzaWxlbnRseSBsb2FkaW5nIHRoZSBwcmV2aW91cyBzZXNzaW9uJ3MgZGF0YSBvZmYgZGlzay5cbiAgICAgIGlmIChzdG9yZWRQYXRoICYmIHN0b3JlZFNlc3Npb24gJiYgc3RvcmVkU2Vzc2lvbiA9PT0gY3VycmVudFNlc3Npb24pIHtcbiAgICAgICAgLy8gUGFzcyByZWRpcmVjdE9uTWlzbWF0Y2g6ZmFsc2Ugc28gdGhhdCBpZiB0aGUgZmlsZSBvbiBkaXNrIGJlbG9uZ3MgdG8gYVxuICAgICAgICAvLyBkaWZmZXJlbnQgc2Vzc2lvbiAoZS5nLiBTRVNTSU9OX1BBVEggd2FzIG5ldmVyIHVwZGF0ZWQgYWZ0ZXIgYSBuZXdcbiAgICAgICAgLy8gc2Vzc2lvbiB3YXMgY3JlYXRlZCksIHdlIHNpbGVudGx5IHNraXAgdGhlIHJlc3RvcmUgcmF0aGVyIHRoYW5cbiAgICAgICAgLy8gbmF2aWdhdGluZyB0aGUgYnJvd3NlciB0byBhIHNlc3Npb24gdGhlIHVzZXIgZGlkbid0IGFzayBmb3IuXG4gICAgICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IGxvYWRTZXNzaW9uRmlsZShzdG9yZWRQYXRoLCB7IHJlZGlyZWN0T25NaXNtYXRjaDogZmFsc2UgfSk7XG4gICAgICAgIGlmIChsb2FkZWQpIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzZXJ2ZXJIYXNEYXRhO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy53YXJuKCdGYWlsZWQgdG8gcmVzdG9yZSBiYWNrZW5kIHN0YXRlOicsIGVycm9yKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9hZFNlc3Npb25GaWxlKHBhdGgsIHsgcmVkaXJlY3RPbk1pc21hdGNoID0gdHJ1ZSB9ID0ge30pIHtcbiAgdHJ5IHtcbiAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnXHVEODNEXHVERDA0IFJlc3RvcmluZyBzZXNzaW9uIGZyb20gZmlsZS4uLicpO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL2xvYWQtc2Vzc2lvbicsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHBhdGggfSlcbiAgICB9KTtcbiAgICBpZiAoIXJlcy5vaykge1xuICAgICAgY29uc3QgZXJyID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsIGBcdTI3NEMgRmFpbGVkIHRvIHJlc3RvcmUgc2Vzc2lvbjogJHtlcnIuZXJyb3J9YCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuXG4gICAgaWYgKGRhdGEucmVkaXJlY3RfdXJsICYmIGdldFNlc3Npb25JZEZyb21VUkwoKSAhPT0gZGF0YS5zZXNzaW9uX2lkKSB7XG4gICAgICBpZiAoIXJlZGlyZWN0T25NaXNtYXRjaCkge1xuICAgICAgICAvLyBUaGUgZmlsZSBvbiBkaXNrIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgc2Vzc2lvbiB0aGFuIHRoZSBvbmUgaW4gdGhlXG4gICAgICAgIC8vIFVSTC4gIFNpbGVudGx5IGFib3J0IHJhdGhlciB0aGFuIHJlZGlyZWN0aW5nIHRoZSBicm93c2VyIFx1MjAxNCB0aGUgY2FsbGVyXG4gICAgICAgIC8vIChyZXN0b3JlQmFja2VuZFN0YXRlKSBvbmx5IHdhbnRzIHRvIHJlc3RvcmUgVEhJUyBzZXNzaW9uLCBub3QgbG9hZCBhXG4gICAgICAgIC8vIGRpZmZlcmVudCBvbmUuXG4gICAgICAgIGxvZy53YXJuKFxuICAgICAgICAgICdsb2FkU2Vzc2lvbkZpbGU6IHNlc3Npb25faWQgbWlzbWF0Y2ggKHVybD0lcywgZmlsZT0lcyk7IHNraXBwaW5nIHJlc3RvcmUnLFxuICAgICAgICAgIGdldFNlc3Npb25JZEZyb21VUkwoKSwgZGF0YS5zZXNzaW9uX2lkLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKGRhdGEucmVkaXJlY3RfdXJsKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFN0b3JhZ2VLZXlzLlNFU1NJT05fUEFUSCwgZGF0YS5zZXNzaW9uX2ZpbGUgfHwgcGF0aCk7XG5cbiAgICAvLyBSZXNldCBzZXNzaW9uLXNjb3BlZCBzdWdnZXN0aW9uIHN0YXRlXG4gICAgd2luZG93Ll9zdWdnZXN0ZWRBY2hzT3JkZXJlZCA9IG51bGw7XG5cbiAgICAvLyBSZWxvYWQgY29udmVyc2F0aW9uIGhpc3RvcnkgZnJvbSB0aGUgZnJlc2hseS1sb2FkZWQgYmFja2VuZFxuICAgIGNvbnN0IGhpc3RvcnlSZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9oaXN0b3J5Jyk7XG4gICAgaWYgKGhpc3RvcnlSZXMub2spIHtcbiAgICAgIGNvbnN0IGhpc3RvcnlEYXRhID0gYXdhaXQgaGlzdG9yeVJlcy5qc29uKCk7XG4gICAgICBjb25zdCBjb252ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbnZlcnNhdGlvbicpO1xuICAgICAgY29udi5pbm5lckhUTUwgPSAnJztcbiAgICAgIChoaXN0b3J5RGF0YS5oaXN0b3J5IHx8IFtdKS5mb3JFYWNoKG1zZyA9PiB7XG4gICAgICAgIGlmIChtc2cucm9sZSAhPT0gJ3N5c3RlbScpIGFwcGVuZE1lc3NhZ2UobXNnLnJvbGUsIG1zZy5jb250ZW50KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnXHUyNkEwIENvdWxkIG5vdCByZXN0b3JlIGNvbnZlcnNhdGlvbiBoaXN0b3J5LicpO1xuICAgIH1cblxuICAgIGF3YWl0IGZldGNoU3RhdHVzKCk7XG5cbiAgICAvLyBSdW4gYSBiYWNrZ3JvdW5kIGhlYWx0aCBjaGVjayBzbyB0aGUgc3RhdHVzIHBpbGwgcmVmbGVjdHMgbGl2ZSBjb25uZWN0aXZpdHkuXG4gICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzLnRlc3RDdXJyZW50TW9kZWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGdsb2JhbFRoaXMudGVzdEN1cnJlbnRNb2RlbCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICB9XG5cbiAgICAvLyBSZWh5ZHJhdGUgdGFiRGF0YSBhbmQgc3dpdGNoIHRvIHRoZSBjb3JyZWN0IHRhYiBmb3IgdGhlIHJlc3RvcmVkIHBoYXNlXG4gICAgY29uc3Qgc2Vzc2lvblBoYXNlID0gZGF0YS5waGFzZSB8fCBQSEFTRVMuSU5JVDtcbiAgICBjb25zdCBwaGFzZVRhYk1hcCA9IHtcbiAgICAgIFtQSEFTRVMuSU5JVF06ICAgICAgICAgICAgICdqb2InLFxuICAgICAgW1BIQVNFUy5KT0JfQU5BTFlTSVNdOiAgICAgJ2FuYWx5c2lzJyxcbiAgICAgIFtQSEFTRVMuQ1VTVE9NSVpBVElPTl06ICAgICdleHAtcmV2aWV3JyxcbiAgICAgIFtQSEFTRVMuUkVXUklURV9SRVZJRVddOiAgICdyZXdyaXRlJyxcbiAgICAgIFtQSEFTRVMuU1BFTExfQ0hFQ0tdOiAgICAgICdzcGVsbCcsXG4gICAgICBbUEhBU0VTLkdFTkVSQVRJT05dOiAgICAgICAnbGF5b3V0JyxcbiAgICAgIFtQSEFTRVMuTEFZT1VUX1JFVklFV106ICAgICdsYXlvdXQnLFxuICAgICAgW1BIQVNFUy5GSU5BTF9HRU5FUkFUSU9OXTogJ2ZpbmFsX2dlbmVyYXRlJyxcbiAgICAgIFtQSEFTRVMuUkVGSU5FTUVOVF06ICAgICAgICdkb3dubG9hZCcsXG4gICAgfTtcbiAgICBjb25zdCB0YXJnZXRUYWIgPSBwaGFzZVRhYk1hcFtzZXNzaW9uUGhhc2VdIHx8ICdqb2InO1xuXG4gICAgY29uc3QgY3VzdG9taXphdGlvblBoYXNlcyA9IFtcbiAgICAgIFBIQVNFUy5DVVNUT01JWkFUSU9OLCBQSEFTRVMuUkVXUklURV9SRVZJRVcsIFBIQVNFUy5TUEVMTF9DSEVDSyxcbiAgICAgIFBIQVNFUy5HRU5FUkFUSU9OLCBQSEFTRVMuTEFZT1VUX1JFVklFVywgUEhBU0VTLkZJTkFMX0dFTkVSQVRJT04sIFBIQVNFUy5SRUZJTkVNRU5ULFxuICAgIF07XG4gICAgaWYgKGN1c3RvbWl6YXRpb25QaGFzZXMuaW5jbHVkZXMoc2Vzc2lvblBoYXNlKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgczIgPSBhd2FpdCBmZXRjaCgnL2FwaS9zdGF0dXMnKTtcbiAgICAgICAgY29uc3Qgc2QgPSBwYXJzZVN0YXR1c1Jlc3BvbnNlKGF3YWl0IHMyLmpzb24oKSk7XG4gICAgICAgIF9oeWRyYXRlU3RhdHVzRGVyaXZlZFN0YXRlKHNkKTtcbiAgICAgICAgX2h5ZHJhdGVTdGF0dXNUYWJTdGF0ZShzZCk7XG4gICAgICB9IGNhdGNoIChfKSB7IC8qIG5vbi1mYXRhbCAqLyB9XG4gICAgfVxuXG4gICAgLy8gRm9yIHJld3JpdGVfcmV2aWV3IHBoYXNlLCBwcmUtcG9wdWxhdGUgdGhlIHJld3JpdGUgcGFuZWwgY2FjaGVcbiAgICBpZiAoc2Vzc2lvblBoYXNlID09PSBQSEFTRVMuUkVXUklURV9SRVZJRVcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJyID0gYXdhaXQgZmV0Y2goJy9hcGkvcmV3cml0ZXMnKTtcbiAgICAgICAgaWYgKHJyLm9rKSB7XG4gICAgICAgICAgY29uc3QgcmQgPSBwYXJzZVJld3JpdGVzUmVzcG9uc2UoYXdhaXQgcnIuanNvbigpKTtcbiAgICAgICAgICBjb25zdCByZXdyaXRlcyA9IHJkLnJld3JpdGVzIHx8IFtdO1xuICAgICAgICAgIGNvbnN0IHdhcm5pbmdzID0gcmQucGVyc3Vhc2lvbl93YXJuaW5ncyB8fCBbXTtcbiAgICAgICAgICByZXdyaXRlRGVjaXNpb25zID0ge307XG4gICAgICAgICAgcmVuZGVyUmV3cml0ZVBhbmVsKHJld3JpdGVzLCB3YXJuaW5ncyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKF8pIHsgLyogbm9uLWZhdGFsICovIH1cbiAgICB9XG5cbiAgICBzd2l0Y2hUYWIodGFyZ2V0VGFiKTtcbiAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCBgXHUyNzA1IFNlc3Npb24gcmVzdG9yZWQ6ICR7ZGF0YS5wb3NpdGlvbl9uYW1lIHx8ICdVbm5hbWVkJ30gKCR7U0VTU0lPTl9QSEFTRV9MQUJFTFNbZGF0YS5waGFzZV0gfHwgU3RyaW5nKGRhdGEucGhhc2UgfHwgUEhBU0VTLklOSVQpLnJlcGxhY2UoL18vZywgJyAnKX0pYCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsIGBcdTI3NEMgRXJyb3IgcmVzdG9yaW5nIHNlc3Npb246ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUmVuYW1lIC8gdGFiIGRhdGEgcGVyc2lzdGVuY2Vcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5hc3luYyBmdW5jdGlvbiBwcm9tcHRSZW5hbWVDdXJyZW50U2Vzc2lvbigpIHtcbiAgY29uc3QgdGl0bGVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwb3NpdGlvbi10aXRsZScpO1xuICBjb25zdCByZW5hbWVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVuYW1lLXNlc3Npb24tYnRuJyk7XG4gIGNvbnN0IGN1cnJlbnQgPSAodGl0bGVFbD8udGV4dENvbnRlbnQgfHwgJycpLnRyaW0oKTtcblxuICAvLyBCdWlsZCBpbmxpbmUgaW5wdXQgd2lkZ2V0IHNvIHdlIG5ldmVyIGNhbGwgd2luZG93LnByb21wdCgpXG4gIGNvbnN0IHdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gIHdyYXBwZXIuc3R5bGUuY3NzVGV4dCA9ICdkaXNwbGF5OmlubGluZS1mbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6NHB4Oyc7XG4gIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgaW5wdXQudHlwZSA9ICd0ZXh0JztcbiAgaW5wdXQudmFsdWUgPSBjdXJyZW50O1xuICBpbnB1dC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnTmV3IHNlc3Npb24gbmFtZScpO1xuICBpbnB1dC5zdHlsZS5jc3NUZXh0ID0gJ2ZvbnQtc2l6ZTppbmhlcml0O3BhZGRpbmc6MXB4IDRweDtib3JkZXI6MXB4IHNvbGlkICM5NGEzYjg7Ym9yZGVyLXJhZGl1czozcHg7d2lkdGg6MjIwcHg7JztcbiAgY29uc3Qgb2tCdG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgb2tCdG4udGV4dENvbnRlbnQgPSAnXHUyNzEzJztcbiAgb2tCdG4udGl0bGUgPSAnU2F2ZSByZW5hbWUnO1xuICBva0J0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnU2F2ZSByZW5hbWUnKTtcbiAgb2tCdG4uc3R5bGUuY3NzVGV4dCA9ICdiYWNrZ3JvdW5kOiMxMGI5ODE7Y29sb3I6I2ZmZjtib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjNweDtjdXJzb3I6cG9pbnRlcjtwYWRkaW5nOjFweCA2cHg7Zm9udC1zaXplOjFlbTsnO1xuICBjb25zdCBjYW5jZWxCdG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgY2FuY2VsQnRuLnRleHRDb250ZW50ID0gJ1x1MjcxNSc7XG4gIGNhbmNlbEJ0bi50aXRsZSA9ICdDYW5jZWwgcmVuYW1lJztcbiAgY2FuY2VsQnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsICdDYW5jZWwgcmVuYW1lJyk7XG4gIGNhbmNlbEJ0bi5zdHlsZS5jc3NUZXh0ID0gJ2JhY2tncm91bmQ6IzZiNzI4MDtjb2xvcjojZmZmO2JvcmRlcjpub25lO2JvcmRlci1yYWRpdXM6M3B4O2N1cnNvcjpwb2ludGVyO3BhZGRpbmc6MXB4IDZweDtmb250LXNpemU6MWVtOyc7XG4gIHdyYXBwZXIuYXBwZW5kKGlucHV0LCBva0J0biwgY2FuY2VsQnRuKTtcblxuICBpZiAodGl0bGVFbCkgdGl0bGVFbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBpZiAocmVuYW1lQnRuKSByZW5hbWVCdG4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgdGl0bGVFbD8ucGFyZW50RWxlbWVudD8uaW5zZXJ0QmVmb3JlKHdyYXBwZXIsIHRpdGxlRWwpO1xuICBpbnB1dC5mb2N1cygpO1xuICBpbnB1dC5zZWxlY3QoKTtcblxuICBhc3luYyBmdW5jdGlvbiBkb1JlbmFtZSgpIHtcbiAgICBjb25zdCBuZXdOYW1lID0gaW5wdXQudmFsdWUudHJpbSgpO1xuICAgIGNsZWFudXAoKTtcbiAgICBpZiAoIW5ld05hbWUgfHwgbmV3TmFtZSA9PT0gY3VycmVudCkgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvcmVuYW1lLWN1cnJlbnQtc2Vzc2lvbicsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IG5ld19uYW1lOiBuZXdOYW1lIH0pLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLm9rKSBhd2FpdCBmZXRjaFN0YXR1cygpO1xuICAgICAgZWxzZSBpZiAodHlwZW9mIHNob3dUb2FzdCA9PT0gJ2Z1bmN0aW9uJykgc2hvd1RvYXN0KGBSZW5hbWUgZmFpbGVkOiAke2RhdGEuZXJyb3J9YCwgJ2Vycm9yJyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHNob3dUb2FzdChgUmVuYW1lIGVycm9yOiAke2UubWVzc2FnZX1gLCAnZXJyb3InKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgIHdyYXBwZXIucmVtb3ZlKCk7XG4gICAgaWYgKHRpdGxlRWwpIHRpdGxlRWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgIGlmIChyZW5hbWVCdG4pIHJlbmFtZUJ0bi5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gIH1cblxuICBva0J0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGRvUmVuYW1lKTtcbiAgY2FuY2VsQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xlYW51cCk7XG4gIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBlID0+IHtcbiAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicpIGRvUmVuYW1lKCk7XG4gICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgY2xlYW51cCgpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gc2F2ZVRhYkRhdGEoKSB7XG4gIHRyeSB7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oZ2V0U2NvcGVkVGFiRGF0YVN0b3JhZ2VLZXkoc3RhdGVNYW5hZ2VyLmdldFNlc3Npb25JZCgpKSwgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgdGFiRGF0YTogc3RhdGVNYW5hZ2VyLmdldEFsbFRhYkRhdGEoKSxcbiAgICAgIGN1cnJlbnRUYWI6IHN0YXRlTWFuYWdlci5nZXRDdXJyZW50VGFiKCksXG4gICAgICBwZW5kaW5nUmVjb21tZW5kYXRpb25zOiB3aW5kb3cucGVuZGluZ1JlY29tbWVuZGF0aW9ucyB8fCBudWxsLFxuICAgICAgaW50ZXJhY3RpdmVTdGF0ZTogc3RhdGVNYW5hZ2VyLmdldEludGVyYWN0aXZlU3RhdGUoKSxcbiAgICAgIGFjdGl2ZVJldmlld1BhbmU6IHdpbmRvdy5fYWN0aXZlUmV2aWV3UGFuZSB8fCAnZXhwZXJpZW5jZXMnLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpXG4gICAgfSkpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy53YXJuKCdGYWlsZWQgdG8gc2F2ZSB0YWIgZGF0YTonLCBlcnJvcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzdG9yZVRhYkRhdGEoeyB1aVByZWZzT25seSA9IGZhbHNlIH0gPSB7fSkge1xuICB0cnkge1xuICAgIGNvbnN0IHNhdmVkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oZ2V0U2NvcGVkVGFiRGF0YVN0b3JhZ2VLZXkoc3RhdGVNYW5hZ2VyLmdldFNlc3Npb25JZCgpKSk7XG4gICAgaWYgKHNhdmVkKSB7XG4gICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShzYXZlZCk7XG5cbiAgICAgIGNvbnN0IGFnZSA9IERhdGUubm93KCkgLSAoZGF0YS50aW1lc3RhbXAgfHwgMCk7XG4gICAgICBpZiAoYWdlIDwgMjQgKiA2MCAqIDYwICogMTAwMCkge1xuICAgICAgICBpZiAoIXVpUHJlZnNPbmx5KSB7XG4gICAgICAgICAgaWYgKGRhdGEudGFiRGF0YSkge1xuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoZGF0YS50YWJEYXRhKS5mb3JFYWNoKChbdGFiLCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgICAgc3RhdGVNYW5hZ2VyLnNldFRhYkRhdGEodGFiLCB2YWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGRhdGEucGVuZGluZ1JlY29tbWVuZGF0aW9ucykge1xuICAgICAgICAgICAgd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnMgPSBkYXRhLnBlbmRpbmdSZWNvbW1lbmRhdGlvbnM7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChkYXRhLmludGVyYWN0aXZlU3RhdGUpIHtcbiAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zZXRJbnRlcmFjdGl2ZVN0YXRlKGRhdGEuaW50ZXJhY3RpdmVTdGF0ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhLmFjdGl2ZVJldmlld1BhbmUpIHtcbiAgICAgICAgICB3aW5kb3cuX2FjdGl2ZVJldmlld1BhbmUgPSBkYXRhLmFjdGl2ZVJldmlld1BhbmU7XG4gICAgICAgIH1cblxuICAgICAgICBsb2cuaW5mbyhgUmVzdG9yZWQgdGFiIGRhdGEgZnJvbSBsb2NhbFN0b3JhZ2UgKHVpUHJlZnNPbmx5PSR7dWlQcmVmc09ubHl9KWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oZ2V0U2NvcGVkVGFiRGF0YVN0b3JhZ2VLZXkoc3RhdGVNYW5hZ2VyLmdldFNlc3Npb25JZCgpKSk7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy53YXJuKCdGYWlsZWQgdG8gcmVzdG9yZSB0YWIgZGF0YTonLCBlcnJvcik7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIEVTIG1vZHVsZSBleHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuZXhwb3J0IHtcbiAgZm9ybWF0U2Vzc2lvblBoYXNlTGFiZWwsXG4gIF9nZXRDdXJyZW50U2Vzc2lvbklkVmFsdWUsXG4gIF9nZXRDdXJyZW50T3duZXJUb2tlblZhbHVlLFxuICBidWlsZFNlc3Npb25Td2l0Y2hlckxhYmVsLFxuICBnZXRBY3RpdmVTZXNzaW9uT3duZXJzaGlwTWV0YSxcbiAgZm9ybWF0U2Vzc2lvblRpbWVzdGFtcCxcbiAgY3JlYXRlTmV3U2Vzc2lvbkFuZE5hdmlnYXRlLFxuICBjcmVhdGVOZXdTZXNzaW9uSW5OZXdUYWIsXG4gIG9uYm9hcmRpbmdDcmVhdGVFbXB0eVByb2ZpbGUsXG4gIHNob3dPbmJvYXJkaW5nTW9kYWwsXG4gIG1heWJlU2hvd1dlbGNvbWVNb2RhbCxcbiAgc2hvd1dlbGNvbWVNb2RhbCxcbiAgY2xvc2VXZWxjb21lTW9kYWwsXG4gIF9jbGFpbUN1cnJlbnRTZXNzaW9uLFxuICBfcmVzb2x2ZVJlc3RvcmVkUGhhc2UsXG4gIHNob3dTZXNzaW9uc0xhbmRpbmdQYW5lbCxcbiAgZW5zdXJlU2Vzc2lvbkNvbnRleHQsXG4gIHJlc3RvcmVTZXNzaW9uLFxuICByZXN0b3JlQmFja2VuZFN0YXRlLFxuICBsb2FkU2Vzc2lvbkZpbGUsXG4gIHByb21wdFJlbmFtZUN1cnJlbnRTZXNzaW9uLFxuICBzYXZlVGFiRGF0YSxcbiAgcmVzdG9yZVRhYkRhdGEsXG59O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvam9iLWlucHV0LmpzXG4gKiBKb2IgZGVzY3JpcHRpb24gaW5wdXQgcGFuZWw6IHBhc3RlLCBVUkwgZmV0Y2gsIGZpbGUgdXBsb2FkLCBsb2FkLWl0ZW1zIHRhYmxlLlxuICpcbiAqIERFUEVOREVOQ0lFUyAoYWxsIG9uIGdsb2JhbFRoaXMgYXQgcnVudGltZSk6XG4gKiAgIC0gbWFya2VkLCBkb21wdXJpZnkgKG5wbSBcdTIwMTQgYnVuZGxlZDsgdXNlZCBpbnRlcm5hbGx5IGZvciBzYWZlIG1hcmtkb3duIHJlbmRlcmluZylcbiAqICAgLSBlc2NhcGVIdG1sICh1dGlscy5qcylcbiAqICAgLSBhcHBlbmRNZXNzYWdlLCBhcHBlbmRSZXRyeU1lc3NhZ2UgKG1lc3NhZ2UtcXVldWUuanMpXG4gKiAgIC0gc2V0TG9hZGluZyAoZmV0Y2gtdXRpbHMuanMpXG4gKiAgIC0gc2F2ZVRhYkRhdGEgKHNlc3Npb24tbWFuYWdlci5qcylcbiAqICAgLSBzd2l0Y2hUYWIgKHJldmlldy10YWJsZS1iYXNlLmpzLCBUaWVyIDQpXG4gKiAgIC0gYW5hbHl6ZUpvYiAoam9iLWFuYWx5c2lzLmpzKVxuICogICAtIGZldGNoU3RhdHVzIChhcGktY2xpZW50LmpzKVxuICogICAtIHNob3dBbGVydE1vZGFsICh1aS1oZWxwZXJzLmpzKVxuICogICAtIHN0YXRlTWFuYWdlciAoc3RhdGUtbWFuYWdlci5qcyBcdTIwMTQgZ2V0Q3VycmVudFRhYigpL3NldFRhYkRhdGEoKSlcbiAqICAgLSBQSEFTRVMgKHdpbmRvdyBnbG9iYWwpXG4gKlxuICogR0FQLTIzIGludGFrZSBjb25maXJtYXRpb246XG4gKiAgIEFsbCBqb2ItdGV4dCBzdWJtaXNzaW9ucyAocGFzdGUsIFVSTCwgZmlsZSkgcm91dGUgZGlyZWN0bHkgdG8gYW5hbHl6ZUpvYigpXG4gKiAgIHNvIGV2ZXJ5IHNvdXJjZSBmb2xsb3dzIHRoZSBzYW1lIHBvc3QtYW5hbHlzaXMgaW50YWtlIHBhdGguXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdqb2ItaW5wdXQnKTtcblxuaW1wb3J0IHsgUEhBU0VTLCBzdGF0ZU1hbmFnZXIgfSBmcm9tICcuL3N0YXRlLW1hbmFnZXIuanMnO1xuaW1wb3J0IHsgbWFya2VkIH0gZnJvbSAnbWFya2VkJztcbmltcG9ydCBET01QdXJpZnkgZnJvbSAnZG9tcHVyaWZ5JztcblxuLy8gUmVuZGVyIGpvYiBkZXNjcmlwdGlvbiB0ZXh0IHNhZmVseTogbWFya2VkIHBhcnNlcyBHRk0gKGluY2x1ZGluZyBlbWJlZGRlZCBIVE1MXG4vLyBhbmQgYXV0b2xpbmtzKSwgRE9NUHVyaWZ5IHNhbml0aXplcyB0aGUgb3V0cHV0IGJlZm9yZSB3cml0aW5nIHRvIGlubmVySFRNTC5cbi8vIEZPUkJJRF9BVFRSOiBbJ3N0eWxlJ10gc3RyaXBzIGlubGluZSBDU1MgZnJvbSBIVE1MIGVtYmVkZGVkIGluIHRoZSBqb2IgdGV4dFxuLy8gKGUuZy4gV29yZC1zdHlsZSBmb250LXNpemUvZm9udC1mYW1pbHkgZnJvbSBKU09OLUxEIGRlc2NyaXB0aW9uIGZpZWxkcyksXG4vLyBzbyB0aGUgcGFnZSdzIG93biBzdHlsZXNoZWV0IGNvbnRyb2xzIGZvbnQgcmVuZGVyaW5nIGNvbnNpc3RlbnRseS5cbmZ1bmN0aW9uIF9yZW5kZXJKb2JUZXh0KHRleHQpIHtcbiAgY29uc3QgcmF3ID0gbWFya2VkLnBhcnNlKHRleHQsIHsgZ2ZtOiB0cnVlLCBicmVha3M6IHRydWUgfSk7XG4gIHJldHVybiBET01QdXJpZnkuc2FuaXRpemUocmF3LCB7IEZPUkJJRF9BVFRSOiBbJ3N0eWxlJ10gfSk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gSm9iIHRhYiBkaXNwbGF5XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuYXN5bmMgZnVuY3Rpb24gcG9wdWxhdGVKb2JUYWIoKSB7XG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9jdW1lbnQtY29udGVudCcpO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3N0YXR1cycpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuXG4gICAgaWYgKGRhdGEuam9iX2Rlc2NyaXB0aW9uX3RleHQpIHtcbiAgICAgIGNvbnN0IGpvYlRleHQgPSBkYXRhLmpvYl9kZXNjcmlwdGlvbl90ZXh0O1xuICAgICAgY29uc3QgcG9zaXRpb25OYW1lID0gZGF0YS5wb3NpdGlvbl9uYW1lIHx8IG51bGw7XG4gICAgICBjb25zdCBqb2JVcmwgPSBkYXRhLmpvYl91cmwgfHwgbnVsbDtcbiAgICAgIGNvbnN0IHRpdGxlVGV4dCA9IHBvc2l0aW9uTmFtZVxuICAgICAgICA/IGVzY2FwZUh0bWwocG9zaXRpb25OYW1lKVxuICAgICAgICA6ICc8ZW0gc3R5bGU9XCJjb2xvcjojOWNhM2FmO1wiPlBvc2l0aW9uIHRpdGxlIG5vdCB5ZXQgZXh0cmFjdGVkXHUyMDI2PC9lbT4nO1xuICAgICAgY29uc3QgdGl0bGVDb250ZW50ID0gKHBvc2l0aW9uTmFtZSAmJiBqb2JVcmwpXG4gICAgICAgID8gYDxhIGhyZWY9XCIke2VzY2FwZUh0bWwoam9iVXJsKX1cIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCIgc3R5bGU9XCJjb2xvcjppbmhlcml0O3RleHQtZGVjb3JhdGlvbjpub25lO1wiPiR7dGl0bGVUZXh0fTwvYT5gXG4gICAgICAgIDogdGl0bGVUZXh0O1xuICAgICAgbGV0IGh0bWwgPSAnPGgxPicgKyB0aXRsZUNvbnRlbnQgKyAnPC9oMT4nO1xuICAgICAgaWYgKGpvYlVybCkge1xuICAgICAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwibWF4LXdpZHRoOjEwMCU7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7d2hpdGUtc3BhY2U6bm93cmFwO2NvbG9yOiM2NDc0OGI7Zm9udC1zaXplOjAuODVlbTttYXJnaW46LThweCAwIDhweCAwO1wiIHRpdGxlPVwiJHtlc2NhcGVIdG1sKGpvYlVybCl9XCI+PGEgaHJlZj1cIiR7ZXNjYXBlSHRtbChqb2JVcmwpfVwiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIiBzdHlsZT1cImNvbG9yOiMzYjgyZjY7dGV4dC1kZWNvcmF0aW9uOm5vbmU7XCI+JHtlc2NhcGVIdG1sKGpvYlVybCl9PC9hPjwvZGl2PmA7XG4gICAgICB9XG5cbiAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJsaW5lLWhlaWdodDogMS42OyBiYWNrZ3JvdW5kOiAjZjhmOWZhOyBwYWRkaW5nOiAyMHB4OyBib3JkZXItcmFkaXVzOiA4cHg7IG1hcmdpbjogMjBweCAwO1wiPicgKyBfcmVuZGVySm9iVGV4dChqb2JUZXh0KSArICc8L2Rpdj4nO1xuXG4gICAgICBjb25zdCBhbmFseXplQnRuID0gZGF0YS5waGFzZSA9PT0gUEhBU0VTLklOSVRcbiAgICAgICAgPyAnPGJ1dHRvbiBvbmNsaWNrPVwiYW5hbHl6ZUpvYigpXCIgY2xhc3M9XCJidG4tcHJpbWFyeVwiIHN0eWxlPVwibWFyZ2luLXJpZ2h0OjhweDtcIj5cdUQ4M0RcdUREMEQgQW5hbHlzZSBKb2I8L2J1dHRvbj4nXG4gICAgICAgIDogJyc7XG4gICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDoyMHB4O1wiPicgKyBhbmFseXplQnRuICsgJzxidXR0b24gb25jbGljaz1cInNob3dMb2FkSm9iUGFuZWwoKVwiIGNsYXNzPVwiYnRuLXNlY29uZGFyeVwiPlx1RDgzRFx1RENFNSBMb2FkIERpZmZlcmVudCBKb2I8L2J1dHRvbj48L2Rpdj4nO1xuICAgICAgY29udGVudC5pbm5lckhUTUwgPSBodG1sO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBzaG93TG9hZEpvYlBhbmVsKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy5lcnJvcignRXJyb3IgbG9hZGluZyBqb2IgZGVzY3JpcHRpb246JywgZXJyb3IpO1xuICAgIGF3YWl0IHNob3dMb2FkSm9iUGFuZWwoKTtcbiAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIExvYWQtam9iIHBhbmVsIChzZXNzaW9ucyArIHNlcnZlciBmaWxlcyB0YWJsZSArIGlucHV0IG1ldGhvZHMpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuYXN5bmMgZnVuY3Rpb24gc2hvd0xvYWRKb2JQYW5lbCgpIHtcbiAgaWYgKHN0YXRlTWFuYWdlci5nZXRDdXJyZW50VGFiKCkgIT09ICdqb2InKSB7XG4gICAgc3dpdGNoVGFiKCdqb2InKTtcbiAgfVxuXG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9jdW1lbnQtY29udGVudCcpO1xuICBjb250ZW50LmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwiZW1wdHktc3RhdGVcIj48ZGl2IGNsYXNzPVwibG9hZGluZy1zcGlubmVyXCI+PC9kaXY+PHAgc3R5bGU9XCJtYXJnaW4tdG9wOjEycHg7Y29sb3I6IzY0NzQ4YjtcIj5Mb2FkaW5nXHUyMDI2PC9wPjwvZGl2Pic7XG5cbiAgY29udGVudC5pbm5lckhUTUwgPSBgXG4gICAgPGRpdiBzdHlsZT1cIm1heC13aWR0aDo4MjBweDttYXJnaW46MCBhdXRvO3BhZGRpbmc6MjRweDtcIj5cbiAgICAgIDxoMSBzdHlsZT1cImZvbnQtc2l6ZToyMnB4O2ZvbnQtd2VpZ2h0OjcwMDtjb2xvcjojMWUyOTNiO21hcmdpbi1ib3R0b206NnB4O1wiPlx1RDgzRFx1RENFNSBBZGQgSm9iIERlc2NyaXB0aW9uPC9oMT5cblxuICAgICAgPGRpdiBzdHlsZT1cImJvcmRlcjoxcHggc29saWQgI2UyZThmMDtib3JkZXItcmFkaXVzOjhweDtvdmVyZmxvdzp2aXNpYmxlO1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZjhmYWZjO3BhZGRpbmc6MTBweCAxNnB4O2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNlMmU4ZjA7Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxM3B4O2NvbG9yOiM0NzU1Njk7XCI+QWRkIE5ldyBKb2IgRGVzY3JpcHRpb248L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6MjBweDtcIj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1tZXRob2QtdGFic1wiIHN0eWxlPVwibWFyZ2luLXRvcDowO1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImlucHV0LXRhYiBhY3RpdmVcIiBvbmNsaWNrPVwic3dpdGNoSW5wdXRNZXRob2QoJ3Bhc3RlJylcIj5cdUQ4M0RcdURDREQgUGFzdGUgVGV4dDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImlucHV0LXRhYlwiIG9uY2xpY2s9XCJzd2l0Y2hJbnB1dE1ldGhvZCgndXJsJylcIj5cdUQ4M0RcdUREMTcgRnJvbSBVUkw8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpbnB1dC10YWJcIiBvbmNsaWNrPVwic3dpdGNoSW5wdXRNZXRob2QoJ2ZpbGUnKVwiPlx1RDgzRFx1RENDMSBVcGxvYWQgRmlsZTwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LW1ldGhvZCBhY3RpdmVcIiBpZD1cInBhc3RlLW1ldGhvZFwiPlxuICAgICAgICAgICAgPHRleHRhcmVhIGlkPVwiam9iLXRleHQtaW5wdXRcIiBwbGFjZWhvbGRlcj1cIlBhc3RlIHRoZSBqb2IgZGVzY3JpcHRpb24gaGVyZVx1MjAyNlwiIHJvd3M9XCIxMlwiXG4gICAgICAgICAgICAgIGFyaWEtcmVxdWlyZWQ9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgYXJpYS1kZXNjcmliZWRieT1cInBhc3RlLWNoYXItY291bnQgcGFzdGUtZXJyb3JcIlxuICAgICAgICAgICAgICBvbmJsdXI9XCJfdmFsaWRhdGVQYXN0ZUZpZWxkKClcIiBvbmlucHV0PVwiX3VwZGF0ZVBhc3RlQ2hhckNvdW50KClcIlxuICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXNpemU6MTRweDtwYWRkaW5nOjEycHg7Ym9yZGVyOjFweCBzb2xpZCAjZDFkNWRiO2JvcmRlci1yYWRpdXM6NnB4O3Jlc2l6ZTp2ZXJ0aWNhbDttYXJnaW4tdG9wOjhweDtcIj48L3RleHRhcmVhPlxuICAgICAgICAgICAgPGRpdiBpZD1cInBhc3RlLWNoYXItY291bnRcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIlxuICAgICAgICAgICAgICBzdHlsZT1cImZvbnQtc2l6ZToxMnB4O2NvbG9yOiM5NGEzYjg7bWFyZ2luLXRvcDo0cHg7bWluLWhlaWdodDoxOHB4O1wiPjwvZGl2PlxuICAgICAgICAgICAgPHNwYW4gaWQ9XCJwYXN0ZS1lcnJvclwiIGNsYXNzPVwiZmllbGQtZXJyb3JcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIj48L3NwYW4+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDoxMHB4O2Rpc3BsYXk6ZmxleDtnYXA6MTJweDtcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPVwic3VibWl0Sm9iVGV4dCgpXCIgY2xhc3M9XCJidG4tcHJpbWFyeVwiPlN1Ym1pdCBKb2IgRGVzY3JpcHRpb248L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPVwiY2xlYXJKb2JJbnB1dCgpXCIgY2xhc3M9XCJidG4tc2Vjb25kYXJ5XCI+Q2xlYXI8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LW1ldGhvZFwiIGlkPVwidXJsLW1ldGhvZFwiPlxuICAgICAgICAgICAgPHAgc3R5bGU9XCJtYXJnaW46OHB4IDAgMTBweDtcIj5FbnRlciBhIFVSTCB0byBhdXRvbWF0aWNhbGx5IGV4dHJhY3QgdGhlIGpvYiBkZXNjcmlwdGlvbjo8L3A+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInVybFwiIGlkPVwiam9iLXVybC1pbnB1dFwiIHBsYWNlaG9sZGVyPVwiaHR0cHM6Ly9jb21wYW55LmNvbS9qb2ItcG9zdGluZ1wiXG4gICAgICAgICAgICAgIGFyaWEtcmVxdWlyZWQ9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgYXJpYS1kZXNjcmliZWRieT1cInVybC1lcnJvclwiXG4gICAgICAgICAgICAgIG9uYmx1cj1cIl92YWxpZGF0ZVVSTEZpZWxkKClcIlxuICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7cGFkZGluZzoxMnB4O2JvcmRlcjoxcHggc29saWQgI2QxZDVkYjtib3JkZXItcmFkaXVzOjZweDtcIiAvPlxuICAgICAgICAgICAgPHNwYW4gaWQ9XCJ1cmwtZXJyb3JcIiBjbGFzcz1cImZpZWxkLWVycm9yXCIgYXJpYS1saXZlPVwicG9saXRlXCI+PC9zcGFuPlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6MTBweDtkaXNwbGF5OmZsZXg7Z2FwOjEycHg7XCI+XG4gICAgICAgICAgICAgIDxidXR0b24gb25jbGljaz1cImZldGNoSm9iRnJvbVVSTCgpXCIgY2xhc3M9XCJidG4tcHJpbWFyeVwiPkZldGNoIEpvYiBEZXNjcmlwdGlvbjwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uIG9uY2xpY2s9XCJjbGVhclVSTElucHV0KClcIiBjbGFzcz1cImJ0bi1zZWNvbmRhcnlcIj5DbGVhcjwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDoxNHB4O2Rpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6MWZyIDFmcjtnYXA6MTBweDtmb250LXNpemU6MTNweDtcIj5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2YwZjlmZjtib3JkZXI6MXB4IHNvbGlkICMwZWE1ZTk7Ym9yZGVyLXJhZGl1czo2cHg7cGFkZGluZzoxMHB4O1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDo2MDA7Y29sb3I6IzAzNjlhMTttYXJnaW4tYm90dG9tOjRweDtcIj5cdTI3MDUgV29ya3Mgd2VsbCB3aXRoOjwvZGl2PlxuICAgICAgICAgICAgICAgIDx1bCBzdHlsZT1cIm1hcmdpbjowO3BhZGRpbmctbGVmdDoxNnB4O2NvbG9yOiMwMzY5YTE7bGluZS1oZWlnaHQ6MS43O1wiPjxsaT5Db21wYW55IGNhcmVlciBwYWdlczwvbGk+PGxpPkFuZ2VsTGlzdCwgUmVtb3RlT0s8L2xpPjxsaT5Hb3Zlcm5tZW50ICZhbXA7IHVuaXZlcnNpdHkgc2l0ZXM8L2xpPjwvdWw+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZmVmM2M3O2JvcmRlcjoxcHggc29saWQgI2Y1OWUwYjtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjEwcHg7XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtd2VpZ2h0OjYwMDtjb2xvcjojOTI0MDBlO21hcmdpbi1ib3R0b206NHB4O1wiPlx1MjZBMFx1RkUwRiBDb3B5IG1hbnVhbGx5IGZyb206PC9kaXY+XG4gICAgICAgICAgICAgICAgPHVsIHN0eWxlPVwibWFyZ2luOjA7cGFkZGluZy1sZWZ0OjE2cHg7Y29sb3I6IzkyNDAwZTtsaW5lLWhlaWdodDoxLjc7XCI+PGxpPjxzdHJvbmc+TGlua2VkSW48L3N0cm9uZz4gKGxvZ2luIHJlcXVpcmVkKTwvbGk+PGxpPjxzdHJvbmc+SW5kZWVkPC9zdHJvbmc+IChhbnRpLWJvdCk8L2xpPjxsaT48c3Ryb25nPkdsYXNzZG9vcjwvc3Ryb25nPiAoYXV0aCByZXF1aXJlZCk8L2xpPjwvdWw+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtbWV0aG9kXCIgaWQ9XCJmaWxlLW1ldGhvZFwiPlxuICAgICAgICAgICAgPGRpdiBpZD1cImZpbGUtZHJvcC16b25lXCJcbiAgICAgICAgICAgICAgICAgb25kcmFnb3Zlcj1cImV2ZW50LnByZXZlbnREZWZhdWx0KCk7IHRoaXMuY2xhc3NMaXN0LmFkZCgnZHJhZy1vdmVyJylcIlxuICAgICAgICAgICAgICAgICBvbmRyYWdsZWF2ZT1cInRoaXMuY2xhc3NMaXN0LnJlbW92ZSgnZHJhZy1vdmVyJylcIlxuICAgICAgICAgICAgICAgICBvbmRyb3A9XCJoYW5kbGVGaWxlRHJvcChldmVudClcIlxuICAgICAgICAgICAgICAgICBvbmNsaWNrPVwiZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pvYi1maWxlLWlucHV0JykuY2xpY2soKVwiXG4gICAgICAgICAgICAgICAgIHN0eWxlPVwiYm9yZGVyOjJweCBkYXNoZWQgI2QxZDVkYjtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjMycHggMTZweDt0ZXh0LWFsaWduOmNlbnRlcjtjdXJzb3I6cG9pbnRlcjt0cmFuc2l0aW9uOmJhY2tncm91bmQgMC4ycyxib3JkZXItY29sb3IgMC4yczttYXJnaW46OHB4IDA7XCI+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MnJlbTttYXJnaW4tYm90dG9tOjhweDtcIj5cdUQ4M0RcdURDQzQ8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5Ecm9wIGEgZmlsZSBoZXJlLCBvciBjbGljayB0byBicm93c2U8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjg1cmVtO2NvbG9yOiM2NDc0OGI7XCI+LnR4dCAmbmJzcDtcdTAwQjcmbmJzcDsgLm1kICZuYnNwO1x1MDBCNyZuYnNwOyAuaHRtbCAmbmJzcDtcdTAwQjcmbmJzcDsgLnBkZiAmbmJzcDtcdTAwQjcmbmJzcDsgLmRvY3ggJm5ic3A7XHUwMEI3Jm5ic3A7IC5ydGY8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgaWQ9XCJqb2ItZmlsZS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpub25lXCJcbiAgICAgICAgICAgICAgICAgICBhY2NlcHQ9XCIudHh0LC5tZCwucnN0LC50ZXh0LC5odG1sLC5odG0sLnBkZiwuZG9jeCwuZG9jLC5ydGZcIlxuICAgICAgICAgICAgICAgICAgIGFyaWEtZGVzY3JpYmVkYnk9XCJmaWxlLXVwbG9hZC1lcnJvclwiXG4gICAgICAgICAgICAgICAgICAgb25jaGFuZ2U9XCJoYW5kbGVGaWxlU2VsZWN0ZWQodGhpcy5maWxlc1swXSlcIj5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJmaWxlLXNlbGVjdGVkLWluZm9cIiBzdHlsZT1cImRpc3BsYXk6bm9uZTttYXJnaW46OHB4IDA7XCI+XG4gICAgICAgICAgICAgIDxzcGFuIGlkPVwiZmlsZS1zZWxlY3RlZC1uYW1lXCIgc3R5bGU9XCJmb250LXdlaWdodDo2MDA7XCI+PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBpZD1cImZpbGUtc2VsZWN0ZWQtc2l6ZVwiIHN0eWxlPVwiY29sb3I6IzY0NzQ4YjttYXJnaW4tbGVmdDo4cHg7XCI+PC9zcGFuPlxuICAgICAgICAgICAgICA8YnV0dG9uIG9uY2xpY2s9XCJjbGVhclNlbGVjdGVkRmlsZSgpXCIgc3R5bGU9XCJtYXJnaW4tbGVmdDo4cHg7YmFja2dyb3VuZDpub25lO2JvcmRlcjpub25lO2N1cnNvcjpwb2ludGVyO2NvbG9yOiM2NDc0OGI7XCI+XHUyNzE1PC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJmaWxlLXVwbG9hZC1lcnJvclwiIHN0eWxlPVwiZGlzcGxheTpub25lO2NvbG9yOiNjMDM5MmI7bWFyZ2luOjhweCAwO2ZvbnQtc2l6ZTowLjg1cmVtO1wiPjwvZGl2PlxuICAgICAgICAgICAgPGRpdiBpZD1cImZpbGUtc2l6ZS13YXJuaW5nXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7Y29sb3I6IzkyNDAwZTtiYWNrZ3JvdW5kOiNmZWYzYzc7Ym9yZGVyOjFweCBzb2xpZCAjZmNkMzRkO2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6NHB4IDhweDttYXJnaW46NHB4IDA7Zm9udC1zaXplOjAuODVyZW07XCI+PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDo4cHg7bWFyZ2luLXRvcDo0cHg7YWxpZ24taXRlbXM6Y2VudGVyO1wiPlxuICAgICAgICAgICAgICA8YnV0dG9uIGlkPVwiZmlsZS11cGxvYWQtYnRuXCIgb25jbGljaz1cInVwbG9hZEpvYkZpbGUoKVwiIGNsYXNzPVwiYnRuLXByaW1hcnlcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj5cdUQ4M0RcdURDRTQgVXNlIFRoaXMgRmlsZTwvYnV0dG9uPlxuICAgICAgICAgICAgICA8ZGl2IGlkPVwiZmlsZS11cGxvYWQtc3Bpbm5lclwiIHN0eWxlPVwiZGlzcGxheTpub25lO2ZvbnQtc2l6ZTowLjg1cmVtO2NvbG9yOiM2NDc0OGI7XCI+XHUyM0YzIFBhcnNpbmdcdTIwMjY8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGA7XG4gIC8vIFNob3cgbWluaW11bS1sZW5ndGggaGludCBpbW1lZGlhdGVseSBvbiBmaXJzdCByZW5kZXIgKEdBUC0yODgpLlxuICBfdXBkYXRlUGFzdGVDaGFyQ291bnQoKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBJbnB1dCBtZXRob2Qgc3dpdGNoaW5nXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gc3dpdGNoSW5wdXRNZXRob2QobWV0aG9kKSB7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5pbnB1dC10YWInKS5mb3JFYWNoKHRhYiA9PiB0YWIuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJykpO1xuICBldmVudC50YXJnZXQuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmlucHV0LW1ldGhvZCcpLmZvckVhY2gocGFuZWwgPT4gcGFuZWwuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJykpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChtZXRob2QgKyAnLW1ldGhvZCcpLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEZpbGUgdXBsb2FkXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxubGV0IF9wZW5kaW5nVXBsb2FkRmlsZSA9IG51bGw7XG5cbmZ1bmN0aW9uIGhhbmRsZUZpbGVEcm9wKGV2ZW50KSB7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlLWRyb3Atem9uZScpLmNsYXNzTGlzdC5yZW1vdmUoJ2RyYWctb3ZlcicpO1xuICBjb25zdCBmaWxlID0gZXZlbnQuZGF0YVRyYW5zZmVyLmZpbGVzWzBdO1xuICBpZiAoZmlsZSkgaGFuZGxlRmlsZVNlbGVjdGVkKGZpbGUpO1xufVxuXG5mdW5jdGlvbiBoYW5kbGVGaWxlU2VsZWN0ZWQoZmlsZSkge1xuICBpZiAoIWZpbGUpIHJldHVybjtcblxuICBjb25zdCBzaXplTWIgID0gKGZpbGUuc2l6ZSAvICgxMDI0ICogMTAyNCkpLnRvRml4ZWQoMSk7XG4gIGNvbnN0IHNpemVTdHIgPSBmaWxlLnNpemUgPiAxMDI0ICogMTAyNCA/IGAke3NpemVNYn0gTUJgIDogYCR7KGZpbGUuc2l6ZSAvIDEwMjQpLnRvRml4ZWQoMSl9IEtCYDtcbiAgY29uc3QgZXJyRWwgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlLXVwbG9hZC1lcnJvcicpO1xuICBjb25zdCB3YXJuRWwgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGUtc2l6ZS13YXJuaW5nJyk7XG5cbiAgY29uc3QgYWxsb3dlZE1pbWVzID0gWydhcHBsaWNhdGlvbi9wZGYnLCAnYXBwbGljYXRpb24vbXN3b3JkJyxcbiAgICAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LndvcmRwcm9jZXNzaW5nbWwuZG9jdW1lbnQnLFxuICAgICd0ZXh0L3BsYWluJywgJ3RleHQvaHRtbCddO1xuICBjb25zdCBhbGxvd2VkRXh0cyAgPSBbJy5wZGYnLCAnLmRvYycsICcuZG9jeCcsICcudHh0JywgJy5odG1sJywgJy5odG0nXTtcbiAgY29uc3QgZXh0ID0gJy4nICsgKGZpbGUubmFtZS5zcGxpdCgnLicpLnBvcCgpIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBtaW1lT2sgPSBhbGxvd2VkTWltZXMuc29tZShtID0+IGZpbGUudHlwZS5zdGFydHNXaXRoKG0pKSB8fCBmaWxlLnR5cGUgPT09ICcnO1xuICBjb25zdCBleHRPayAgPSBhbGxvd2VkRXh0cy5pbmNsdWRlcyhleHQpO1xuICBpZiAoIW1pbWVPayAmJiAhZXh0T2spIHtcbiAgICBlcnJFbC50ZXh0Q29udGVudCAgID0gYFVuc3VwcG9ydGVkIGZpbGUgdHlwZSBcIiR7ZXh0IHx8IGZpbGUudHlwZX1cIi4gU3VwcG9ydGVkIGZvcm1hdHM6IFBERiwgV29yZCAoLmRvYy8uZG9jeCksIHBsYWluIHRleHQsIEhUTUwuYDtcbiAgICBlcnJFbC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICBpZiAod2FybkVsKSB3YXJuRWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmlsZS11cGxvYWQtYnRuJykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoZmlsZS5zaXplID4gMjAgKiAxMDI0ICogMTAyNCkge1xuICAgIGVyckVsLnRleHRDb250ZW50ICAgPSBgRmlsZSBpcyB0b28gbGFyZ2UgKCR7c2l6ZU1ifSBNQikuIE1heGltdW0gYWxsb3dlZCBzaXplIGlzIDIwIE1CLmA7XG4gICAgZXJyRWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgaWYgKHdhcm5FbCkgd2FybkVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGUtdXBsb2FkLWJ0bicpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgX3BlbmRpbmdVcGxvYWRGaWxlID0gZmlsZTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGUtc2VsZWN0ZWQtbmFtZScpLnRleHRDb250ZW50ICA9IGZpbGUubmFtZTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGUtc2VsZWN0ZWQtc2l6ZScpLnRleHRDb250ZW50ICA9IGAoJHtzaXplU3RyfSlgO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmlsZS1zZWxlY3RlZC1pbmZvJykuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlLXVwbG9hZC1idG4nKS5zdHlsZS5kaXNwbGF5ICAgID0gJ2lubGluZS1ibG9jayc7XG4gIGVyckVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgaWYgKHdhcm5FbCkge1xuICAgIGlmIChmaWxlLnNpemUgPiA1ICogMTAyNCAqIDEwMjQpIHtcbiAgICAgIHdhcm5FbC50ZXh0Q29udGVudCAgID0gYFx1MjZBMCBMYXJnZSBmaWxlICgke3NpemVNYn0gTUIpIFx1MjAxNCBwYXJzaW5nIG1heSB0YWtlIGEgbW9tZW50LmA7XG4gICAgICB3YXJuRWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdhcm5FbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjbGVhclNlbGVjdGVkRmlsZSgpIHtcbiAgX3BlbmRpbmdVcGxvYWRGaWxlID0gbnVsbDtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pvYi1maWxlLWlucHV0JykudmFsdWUgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGUtc2VsZWN0ZWQtaW5mbycpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlLXVwbG9hZC1idG4nKS5zdHlsZS5kaXNwbGF5ICAgPSAnbm9uZSc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlLXVwbG9hZC1lcnJvcicpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIGNvbnN0IHdhcm4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmlsZS1zaXplLXdhcm5pbmcnKTtcbiAgaWYgKHdhcm4pIHdhcm4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBsb2FkSm9iRmlsZSgpIHtcbiAgaWYgKCFfcGVuZGluZ1VwbG9hZEZpbGUpIHJldHVybjtcblxuICBjb25zdCBlcnJFbCAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGUtdXBsb2FkLWVycm9yJyk7XG4gIGNvbnN0IHNwaW5uZXIgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmlsZS11cGxvYWQtc3Bpbm5lcicpO1xuICBjb25zdCB1cGxvYWRCdG4gID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGUtdXBsb2FkLWJ0bicpO1xuXG4gIGVyckVsLnN0eWxlLmRpc3BsYXkgICAgPSAnbm9uZSc7XG4gIHNwaW5uZXIuc3R5bGUuZGlzcGxheSAgPSAnaW5saW5lJztcbiAgdXBsb2FkQnRuLmRpc2FibGVkICAgICA9IHRydWU7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZScsIF9wZW5kaW5nVXBsb2FkRmlsZSk7XG5cbiAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2goJy9hcGkvdXBsb2FkLWZpbGUnLCB7IG1ldGhvZDogJ1BPU1QnLCBib2R5OiBmb3JtRGF0YSB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcC5qc29uKCk7XG5cbiAgICBpZiAoIXJlc3Aub2sgfHwgZGF0YS5lcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGRhdGEubWVzc2FnZSB8fCBkYXRhLmVycm9yIHx8IGBTZXJ2ZXIgZXJyb3IgJHtyZXNwLnN0YXR1c31gKTtcbiAgICB9XG5cbiAgICBjb25zdCBqb2JSZXNwID0gYXdhaXQgZmV0Y2goJy9hcGkvam9iJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgam9iX3RleHQ6IGRhdGEudGV4dCB9KVxuICAgIH0pO1xuICAgIGNvbnN0IGpvYkRhdGEgPSBhd2FpdCBqb2JSZXNwLmpzb24oKTtcbiAgICBpZiAoIWpvYlJlc3Aub2spIHRocm93IG5ldyBFcnJvcihqb2JEYXRhLmVycm9yIHx8ICdGYWlsZWQgdG8gcHJvY2VzcyBqb2IgZGVzY3JpcHRpb24nKTtcblxuICAgIGlmIChqb2JEYXRhLmVycm9yKSB7XG4gICAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnRXJyb3I6ICcgKyBqb2JEYXRhLmVycm9yKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGVNYW5hZ2VyLnNldFRhYkRhdGEoJ2pvYicsIGRhdGEudGV4dCk7XG4gICAgICBzYXZlVGFiRGF0YSgpO1xuICAgICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgYFx1MjcwNSBKb2IgZGVzY3JpcHRpb24gbG9hZGVkIGZyb20gXCIke2RhdGEuZmlsZW5hbWV9XCIgKCR7ZGF0YS5jb250ZW50X2xlbmd0aC50b0xvY2FsZVN0cmluZygpfSBjaGFycykuYCk7XG4gICAgICBhd2FpdCBhbmFseXplSm9iKCk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBlcnJFbC50ZXh0Q29udGVudCAgID0gZXJyLm1lc3NhZ2U7XG4gICAgZXJyRWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gIH0gZmluYWxseSB7XG4gICAgc3Bpbm5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIHVwbG9hZEJ0bi5kaXNhYmxlZCAgICA9IGZhbHNlO1xuICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUGFzdGUgdGV4dCBzdWJtaXNzaW9uXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY29uc3QgUEFTVEVfTUlOX0NIQVJTID0gMjAwO1xuXG5mdW5jdGlvbiBfdXBkYXRlUGFzdGVDaGFyQ291bnQoKSB7XG4gIGNvbnN0IHZhbCA9IChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnam9iLXRleHQtaW5wdXQnKT8udmFsdWUgfHwgJycpLnRyaW0oKTtcbiAgY29uc3QgY291bnRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYXN0ZS1jaGFyLWNvdW50Jyk7XG4gIGlmICghY291bnRFbCkgcmV0dXJuO1xuICBjb25zdCBuID0gdmFsLmxlbmd0aDtcbiAgaWYgKG4gPT09IDApIHtcbiAgICBjb3VudEVsLnN0eWxlLmNvbG9yID0gJyM5NGEzYjgnO1xuICAgIGNvdW50RWwudGV4dENvbnRlbnQgPSBgUGFzdGUgdGhlIGZ1bGwgam9iIGRlc2NyaXB0aW9uIChtaW5pbXVtICR7UEFTVEVfTUlOX0NIQVJTfSBjaGFyYWN0ZXJzIGZvciBiZXN0IHJlc3VsdHMpYDtcbiAgfSBlbHNlIGlmIChuIDwgUEFTVEVfTUlOX0NIQVJTKSB7XG4gICAgY291bnRFbC5zdHlsZS5jb2xvciA9ICcjZWY0NDQ0JztcbiAgICBjb3VudEVsLnRleHRDb250ZW50ID0gYCR7bn0gLyAke1BBU1RFX01JTl9DSEFSU30gbWluaW11bSBcdTIwMTQgVG9vIHNob3J0LCBhaW0gZm9yIGF0IGxlYXN0ICR7UEFTVEVfTUlOX0NIQVJTfSBjaGFyYWN0ZXJzYDtcbiAgfSBlbHNlIHtcbiAgICBjb3VudEVsLnN0eWxlLmNvbG9yID0gJyMxNmEzNGEnO1xuICAgIGNvdW50RWwudGV4dENvbnRlbnQgPSBgJHtufSAvICR7UEFTVEVfTUlOX0NIQVJTfSBtaW5pbXVtIFx1MjcxM2A7XG4gIH1cbn1cblxuZnVuY3Rpb24gX3ZhbGlkYXRlUGFzdGVGaWVsZCgpIHtcbiAgY29uc3QgdmFsID0gKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqb2ItdGV4dC1pbnB1dCcpPy52YWx1ZSB8fCAnJykudHJpbSgpO1xuICBfdXBkYXRlUGFzdGVDaGFyQ291bnQoKTtcbiAgaWYgKHZhbC5sZW5ndGggPiAwICYmIHZhbC5sZW5ndGggPCBQQVNURV9NSU5fQ0hBUlMpIHtcbiAgICBfc2hvd0ZpZWxkRXJyb3IoJ2pvYi10ZXh0LWlucHV0JywgJ3Bhc3RlLWVycm9yJywgYEpvYiBkZXNjcmlwdGlvbiBpcyB0b28gc2hvcnQgXHUyMDE0IHBsZWFzZSBwYXN0ZSBhdCBsZWFzdCAke1BBU1RFX01JTl9DSEFSU30gY2hhcmFjdGVycy5gKTtcbiAgfSBlbHNlIHtcbiAgICBfY2xlYXJGaWVsZEVycm9yKCdqb2ItdGV4dC1pbnB1dCcsICdwYXN0ZS1lcnJvcicpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN1Ym1pdEpvYlRleHQoKSB7XG4gIC8qIGR1Y2tmbG93OlxuICAgKiAgIGlkOiBqb2JfdWlfc3VibWl0X2xpdmVcbiAgICogICBraW5kOiB1aVxuICAgKiAgIHRpbWVzdGFtcDogJzIwMjYtMDMtMzFUMTI6NDk6NDdaJ1xuICAgKiAgIHN0YXR1czogbGl2ZVxuICAgKiAgIGhhbmRsZXM6XG4gICAqICAgLSB1aTpqb2ItaW5wdXQuc3VibWl0LXRleHRcbiAgICogICBjYWxsczpcbiAgICogICAtIFBPU1QgL2FwaS9qb2JcbiAgICogICAtIGFuYWx5emVKb2JcbiAgICogICByZWFkczpcbiAgICogICAtIGRvbTojam9iLXRleHQtaW5wdXQudmFsdWVcbiAgICogICB3cml0ZXM6XG4gICAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9qb2Iuam9iX3RleHRcbiAgICogICAtIHRhYjpqb2JcbiAgICogICAtIHVpOndvcmtmbG93LmpvYlxuICAgKiAgIG5vdGVzOiBTdWJtaXRzIHBhc3RlZCBqb2IgdGV4dCB0byB0aGUgYmFja2VuZCwgY2FjaGVzIHRoZSBzYW1lIHRleHQgaW4gdGFiIHN0YXRlLCB0aGVuIHJ1bnMgYW5hbHl6ZUpvYigpIHNvIGFsbCBqb2Igc291cmNlcyBzaGFyZSB0aGUgc2FtZSBhbmFseXNpcyBhbmQgaW50YWtlIGZsb3cuXG4gICAqL1xuICBjb25zdCB0ZXh0SW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnam9iLXRleHQtaW5wdXQnKTtcbiAgY29uc3Qgam9iVGV4dCA9IHRleHRJbnB1dC52YWx1ZS50cmltKCk7XG5cbiAgaWYgKCFqb2JUZXh0KSB7XG4gICAgX3Nob3dGaWVsZEVycm9yKCdqb2ItdGV4dC1pbnB1dCcsICdwYXN0ZS1lcnJvcicsICdQbGVhc2UgZW50ZXIgYSBqb2IgZGVzY3JpcHRpb24gYmVmb3JlIHN1Ym1pdHRpbmcuJyk7XG4gICAgdGV4dElucHV0LmZvY3VzKCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChqb2JUZXh0Lmxlbmd0aCA8IFBBU1RFX01JTl9DSEFSUykge1xuICAgIF9zaG93RmllbGRFcnJvcignam9iLXRleHQtaW5wdXQnLCAncGFzdGUtZXJyb3InLCBgSm9iIGRlc2NyaXB0aW9uIGlzIHRvbyBzaG9ydCBcdTIwMTQgcGxlYXNlIHBhc3RlIGF0IGxlYXN0ICR7UEFTVEVfTUlOX0NIQVJTfSBjaGFyYWN0ZXJzLmApO1xuICAgIHRleHRJbnB1dC5mb2N1cygpO1xuICAgIHJldHVybjtcbiAgfVxuICBfY2xlYXJGaWVsZEVycm9yKCdqb2ItdGV4dC1pbnB1dCcsICdwYXN0ZS1lcnJvcicpO1xuXG4gIHNldExvYWRpbmcodHJ1ZSwgJ0FuYWx5c2luZyBqb2IgZGVzY3JpcHRpb25cdTIwMjYnKTtcbiAgYXBwZW5kTWVzc2FnZSgndXNlcicsICdTdWJtaXR0aW5nIGpvYiBkZXNjcmlwdGlvbi4uLicpO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9qb2InLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBqb2JfdGV4dDogam9iVGV4dCB9KVxuICAgIH0pO1xuXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAgIGlmIChkYXRhLmVycm9yKSB7XG4gICAgICBfc2hvd0ZpZWxkRXJyb3IoJ2pvYi10ZXh0LWlucHV0JywgJ3Bhc3RlLWVycm9yJywgZGF0YS5lcnJvcik7XG4gICAgICBhcHBlbmRSZXRyeU1lc3NhZ2UoJ1x1Mjc0QyBFcnJvcjogJyArIGRhdGEuZXJyb3IsIHN1Ym1pdEpvYlRleHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBfY2xlYXJGaWVsZEVycm9yKCdqb2ItdGV4dC1pbnB1dCcsICdwYXN0ZS1lcnJvcicpO1xuICAgICAgc3RhdGVNYW5hZ2VyLnNldFRhYkRhdGEoJ2pvYicsIGpvYlRleHQpO1xuICAgICAgc2F2ZVRhYkRhdGEoKTtcbiAgICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsICdcdTI3MDUgSm9iIGRlc2NyaXB0aW9uIHN1Ym1pdHRlZCBzdWNjZXNzZnVsbHkuJyk7XG5cbiAgICAgIGlmICh0eXBlb2YgdXBkYXRlVGFiQmFyRm9yU3RhZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdXBkYXRlVGFiQmFyRm9yU3RhZ2UoJ2pvYicpO1xuICAgICAgfVxuICAgICAgc3dpdGNoVGFiKCdqb2InKTtcbiAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgICAgYXdhaXQgYW5hbHl6ZUpvYigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cuZXJyb3IoJ0Vycm9yIHN1Ym1pdHRpbmcgam9iOicsIGVycm9yKTtcbiAgICBhcHBlbmRSZXRyeU1lc3NhZ2UoJ1x1Mjc0QyBFcnJvciBzdWJtaXR0aW5nIGpvYiBkZXNjcmlwdGlvbjogJyArIGVycm9yLm1lc3NhZ2UsIHN1Ym1pdEpvYlRleHQpO1xuICB9XG5cbiAgc2V0TG9hZGluZyhmYWxzZSk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVVJMIGZldGNoXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gX3ZhbGlkYXRlVVJMRmllbGQoKSB7XG4gIGNvbnN0IHZhbCA9IChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnam9iLXVybC1pbnB1dCcpPy52YWx1ZSB8fCAnJykudHJpbSgpO1xuICBpZiAoIXZhbCkgeyBfY2xlYXJGaWVsZEVycm9yKCdqb2ItdXJsLWlucHV0JywgJ3VybC1lcnJvcicpOyByZXR1cm47IH1cbiAgdHJ5IHtcbiAgICBjb25zdCB1ID0gbmV3IFVSTCh2YWwpO1xuICAgIGlmICghWydodHRwOicsICdodHRwczonXS5pbmNsdWRlcyh1LnByb3RvY29sKSkgdGhyb3cgbmV3IEVycm9yKCdQcm90b2NvbCBub3QgaHR0cC9odHRwcycpO1xuICAgIF9jbGVhckZpZWxkRXJyb3IoJ2pvYi11cmwtaW5wdXQnLCAndXJsLWVycm9yJyk7XG4gIH0gY2F0Y2gge1xuICAgIF9zaG93RmllbGRFcnJvcignam9iLXVybC1pbnB1dCcsICd1cmwtZXJyb3InLCAnUGxlYXNlIGVudGVyIGEgdmFsaWQgVVJMIHN0YXJ0aW5nIHdpdGggaHR0cHM6Ly8gb3IgaHR0cDovLycpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoSm9iRnJvbVVSTCgpIHtcbiAgY29uc3QgdXJsSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnam9iLXVybC1pbnB1dCcpO1xuICBjb25zdCB1cmwgPSB1cmxJbnB1dC52YWx1ZS50cmltKCk7XG5cbiAgaWYgKCF1cmwpIHtcbiAgICBfc2hvd0ZpZWxkRXJyb3IoJ2pvYi11cmwtaW5wdXQnLCAndXJsLWVycm9yJywgJ1BsZWFzZSBlbnRlciBhIFVSTCBiZWZvcmUgZmV0Y2hpbmcuJyk7XG4gICAgdXJsSW5wdXQuZm9jdXMoKTtcbiAgICByZXR1cm47XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCB1ID0gbmV3IFVSTCh1cmwpO1xuICAgIGlmICghWydodHRwOicsICdodHRwczonXS5pbmNsdWRlcyh1LnByb3RvY29sKSkgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgX2NsZWFyRmllbGRFcnJvcignam9iLXVybC1pbnB1dCcsICd1cmwtZXJyb3InKTtcbiAgfSBjYXRjaCB7XG4gICAgX3Nob3dGaWVsZEVycm9yKCdqb2ItdXJsLWlucHV0JywgJ3VybC1lcnJvcicsICdQbGVhc2UgZW50ZXIgYSB2YWxpZCBVUkwgc3RhcnRpbmcgd2l0aCBodHRwczovLyBvciBodHRwOi8vJyk7XG4gICAgdXJsSW5wdXQuZm9jdXMoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBzZXRMb2FkaW5nKHRydWUsICdGZXRjaGluZyBqb2IgZnJvbSBVUkxcdTIwMjYnKTtcbiAgYXBwZW5kTWVzc2FnZSgndXNlcicsIGBGZXRjaGluZyBqb2IgZGVzY3JpcHRpb24gZnJvbSBVUkw6ICR7dXJsfWApO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9mZXRjaC1qb2ItdXJsJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgdXJsOiB1cmwgfSlcbiAgICB9KTtcblxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICBpZiAoZGF0YS5lcnJvcikge1xuICAgICAgbGV0IGVycm9yTWVzc2FnZSA9IGRhdGEuZXJyb3I7XG4gICAgICBsZXQgaGVscE1lc3NhZ2UgPSBkYXRhLm1lc3NhZ2UgfHwgJyc7XG5cbiAgICAgIGlmIChkYXRhLnByb3RlY3RlZF9zaXRlKSB7XG4gICAgICAgIGVycm9yTWVzc2FnZSA9IGAke2RhdGEuc2l0ZV9uYW1lfSBQcm90ZWN0aW9uIERldGVjdGVkYDtcbiAgICAgICAgaGVscE1lc3NhZ2UgPSBkYXRhLm1lc3NhZ2U7XG5cbiAgICAgICAgaWYgKGRhdGEuaW5zdHJ1Y3Rpb25zICYmIGRhdGEuaW5zdHJ1Y3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBoZWxwTWVzc2FnZSArPSAnXFxuXFxuSG93IHRvIHByb2NlZWQ6XFxuJyArIGRhdGEuaW5zdHJ1Y3Rpb25zLm1hcCgoaW5zdCwgaSkgPT4gYCR7aSArIDF9LiAke2luc3R9YCkuam9pbignXFxuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBzaG93UHJvdGVjdGVkU2l0ZU1vZGFsKGRhdGEuc2l0ZV9uYW1lLCBkYXRhLm1lc3NhZ2UsIGRhdGEuaW5zdHJ1Y3Rpb25zKTtcbiAgICAgIH0gZWxzZSBpZiAoZGF0YS5pbnN0cnVjdGlvbnMpIHtcbiAgICAgICAgaGVscE1lc3NhZ2UgKz0gJ1xcblxcblN1Z2dlc3RlZCBzb2x1dGlvbnM6XFxuJyArIGRhdGEuaW5zdHJ1Y3Rpb25zLm1hcCgoaW5zdCwgaSkgPT4gYCR7aSArIDF9LiAke2luc3R9YCkuam9pbignXFxuJyk7XG4gICAgICAgIHNob3dBbGVydE1vZGFsKCdVUkwgRmV0Y2ggRXJyb3InLCBgJHtlcnJvck1lc3NhZ2V9XFxuXFxuJHtoZWxwTWVzc2FnZX1gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF9zaG93RmllbGRFcnJvcignam9iLXVybC1pbnB1dCcsICd1cmwtZXJyb3InLCBlcnJvck1lc3NhZ2UpO1xuICAgICAgICBzaG93QWxlcnRNb2RhbCgnRXJyb3InLCBgJHtlcnJvck1lc3NhZ2V9JHtoZWxwTWVzc2FnZSA/ICdcXG5cXG4nICsgaGVscE1lc3NhZ2UgOiAnJ31gKTtcbiAgICAgIH1cblxuICAgICAgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgYFx1Mjc0QyAke2Vycm9yTWVzc2FnZX06ICR7ZGF0YS5tZXNzYWdlIHx8ICdQbGVhc2UgdHJ5IG1hbnVhbCBpbnB1dC4nfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZU1hbmFnZXIuc2V0VGFiRGF0YSgnam9iJywgZGF0YS5qb2JfdGV4dCk7XG4gICAgICBzYXZlVGFiRGF0YSgpO1xuICAgICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgYFx1MjcwNSAke2RhdGEubWVzc2FnZX0hIEZldGNoZWQgJHtkYXRhLmNvbnRlbnRfbGVuZ3RoIHx8ICdjb250ZW50J30gY2hhcmFjdGVycy4gUmV2aWV3IHRoZSBqb2IgZGVzY3JpcHRpb24gYmVsb3csIHRoZW4gY2xpY2sgXCJcdUQ4M0RcdUREMEQgQW5hbHlzZSBKb2JcIiB0byBjb250aW51ZS5gKTtcbiAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgICAgc3dpdGNoVGFiKCdqb2InKTtcbiAgICAgIGF3YWl0IHBvcHVsYXRlSm9iVGFiKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy5lcnJvcignRXJyb3IgZmV0Y2hpbmcgVVJMOicsIGVycm9yKTtcbiAgICBfc2hvd0ZpZWxkRXJyb3IoJ2pvYi11cmwtaW5wdXQnLCAndXJsLWVycm9yJywgYE5ldHdvcmsgZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICBhcHBlbmRSZXRyeU1lc3NhZ2UoYE5ldHdvcmsgZXJyb3Igb2NjdXJyZWQ6ICR7ZXJyb3IubWVzc2FnZX0uIFBsZWFzZSBjaGVjayB5b3VyIGNvbm5lY3Rpb24gb3IgdHJ5IG1hbnVhbCBpbnB1dC5gLCBmZXRjaEpvYkZyb21VUkwpO1xuICAgIHNob3dBbGVydE1vZGFsKCdOZXR3b3JrIEVycm9yJywgJ1VuYWJsZSB0byBjb25uZWN0IHRvIHRoZSBzZXJ2ZXIuIFBsZWFzZSB0cnkgYWdhaW4gb3IgdXNlIHRoZSBcIlBhc3RlIFRleHRcIiBvcHRpb24gdG8gaW5wdXQgdGhlIGpvYiBkZXNjcmlwdGlvbiBtYW51YWxseS4nKTtcbiAgfVxuXG4gIHNldExvYWRpbmcoZmFsc2UpO1xufVxuXG5mdW5jdGlvbiBzaG93UHJvdGVjdGVkU2l0ZU1vZGFsKHNpdGVOYW1lLCBtZXNzYWdlLCBpbnN0cnVjdGlvbnMpIHtcbiAgbGV0IGluc3RydWN0aW9uc0xpc3QgPSAnJztcbiAgaWYgKGluc3RydWN0aW9ucyAmJiBpbnN0cnVjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgIGluc3RydWN0aW9uc0xpc3QgPSAnPG9sIHN0eWxlPVwibWFyZ2luOiAxNnB4IDA7IHBhZGRpbmctbGVmdDogMjBweDtcIj4nICtcbiAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbnMubWFwKGluc3QgPT4gYDxsaSBzdHlsZT1cIm1hcmdpbjogOHB4IDA7XCI+JHtpbnN0fTwvbGk+YCkuam9pbignJykgK1xuICAgICAgICAgICAgICAgICAgICAgICc8L29sPic7XG4gIH1cblxuICBjb25zdCBzYWZlTmFtZSA9IGVzY2FwZUh0bWwoc2l0ZU5hbWUpO1xuICBjb25zdCBzYWZlTWVzc2FnZSA9IGVzY2FwZUh0bWwobWVzc2FnZSk7XG4gIGNvbnN0IG1vZGFsQ29udGVudCA9IGBcbiAgICA8ZGl2IHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyOyBtYXJnaW4tYm90dG9tOiAxNnB4O1wiPlxuICAgICAgXHVEODNEXHVERDEyIDxzdHJvbmc+JHtzYWZlTmFtZX0gcmVxdWlyZXMgbWFudWFsIGlucHV0PC9zdHJvbmc+XG4gICAgPC9kaXY+XG4gICAgPHA+JHtzYWZlTWVzc2FnZX08L3A+XG4gICAgJHtpbnN0cnVjdGlvbnNMaXN0fVxuICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAyMHB4OyBwYWRkaW5nOiAxMnB4OyBiYWNrZ3JvdW5kOiAjZjBmOWZmOyBib3JkZXI6IDFweCBzb2xpZCAjMGVhNWU5OyBib3JkZXItcmFkaXVzOiA2cHg7XCI+XG4gICAgICA8c3Ryb25nPlx1RDgzRFx1RENBMSBUaXA6PC9zdHJvbmc+IEFmdGVyIGNvcHlpbmcgdGhlIGpvYiBkZXNjcmlwdGlvbiwgY2xpY2sgdGhlIFwiUGFzdGUgVGV4dFwiIHRhYiBhYm92ZSB0byBzdWJtaXQgaXQgZGlyZWN0bHkuXG4gICAgPC9kaXY+XG4gIGA7XG5cbiAgc2hvd0FsZXJ0TW9kYWwoYCR7c2FmZU5hbWV9IElucHV0IFJlcXVpcmVkYCwgbW9kYWxDb250ZW50KTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDbGVhciBoZWxwZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gY2xlYXJKb2JJbnB1dCgpIHtcbiAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnam9iLXRleHQtaW5wdXQnKTtcbiAgaWYgKGVsKSBlbC52YWx1ZSA9ICcnO1xufVxuXG5mdW5jdGlvbiBjbGVhclVSTElucHV0KCkge1xuICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqb2ItdXJsLWlucHV0Jyk7XG4gIGlmIChlbCkgZWwudmFsdWUgPSAnJztcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBGaWVsZCBlcnJvciBoZWxwZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gX3Nob3dGaWVsZEVycm9yKGlucHV0SWQsIGVycm9ySWQsIG1zZykge1xuICBjb25zdCBpbnAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaW5wdXRJZCk7XG4gIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlcnJvcklkKTtcbiAgaWYgKHNwYW4pICB7IHNwYW4udGV4dENvbnRlbnQgPSBtc2c7IHNwYW4uY2xhc3NMaXN0LmFkZCgndmlzaWJsZScpOyB9XG4gIGlmIChpbnApICAge1xuICAgIGlucC5jbGFzc0xpc3QuYWRkKCdmaWVsZC1pbnZhbGlkJyk7XG4gICAgaW5wLnNldEF0dHJpYnV0ZSgnYXJpYS1pbnZhbGlkJywgJ3RydWUnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfY2xlYXJGaWVsZEVycm9yKGlucHV0SWQsIGVycm9ySWQpIHtcbiAgY29uc3QgaW5wICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlucHV0SWQpO1xuICBjb25zdCBzcGFuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZXJyb3JJZCk7XG4gIGlmIChzcGFuKSAgeyBzcGFuLnRleHRDb250ZW50ID0gJyc7IHNwYW4uY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZScpOyB9XG4gIGlmIChpbnApICAge1xuICAgIGlucC5jbGFzc0xpc3QucmVtb3ZlKCdmaWVsZC1pbnZhbGlkJyk7XG4gICAgaW5wLnNldEF0dHJpYnV0ZSgnYXJpYS1pbnZhbGlkJywgJ2ZhbHNlJyk7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIEVTIG1vZHVsZSBleHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuZXhwb3J0IHtcbiAgcG9wdWxhdGVKb2JUYWIsXG4gIHNob3dMb2FkSm9iUGFuZWwsXG4gIHN3aXRjaElucHV0TWV0aG9kLFxuICBfcGVuZGluZ1VwbG9hZEZpbGUsXG4gIGhhbmRsZUZpbGVEcm9wLFxuICBoYW5kbGVGaWxlU2VsZWN0ZWQsXG4gIGNsZWFyU2VsZWN0ZWRGaWxlLFxuICB1cGxvYWRKb2JGaWxlLFxuICBQQVNURV9NSU5fQ0hBUlMsXG4gIF91cGRhdGVQYXN0ZUNoYXJDb3VudCxcbiAgX3ZhbGlkYXRlUGFzdGVGaWVsZCxcbiAgc3VibWl0Sm9iVGV4dCxcbiAgX3ZhbGlkYXRlVVJMRmllbGQsXG4gIGZldGNoSm9iRnJvbVVSTCxcbiAgc2hvd1Byb3RlY3RlZFNpdGVNb2RhbCxcbiAgY2xlYXJKb2JJbnB1dCxcbiAgY2xlYXJVUkxJbnB1dCxcbiAgX3Nob3dGaWVsZEVycm9yLFxuICBfY2xlYXJGaWVsZEVycm9yLFxufTtcbiIsICJpbXBvcnQgdHlwZSB7IE1hcmtlZE9wdGlvbnMgfSBmcm9tICcuL01hcmtlZE9wdGlvbnMudHMnO1xuXG4vKipcbiAqIEdldHMgdGhlIG9yaWdpbmFsIG1hcmtlZCBkZWZhdWx0IG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfZ2V0RGVmYXVsdHM8UGFyc2VyT3V0cHV0ID0gc3RyaW5nLCBSZW5kZXJlck91dHB1dCA9IHN0cmluZz4oKTogTWFya2VkT3B0aW9uczxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0PiB7XG4gIHJldHVybiB7XG4gICAgYXN5bmM6IGZhbHNlLFxuICAgIGJyZWFrczogZmFsc2UsXG4gICAgZXh0ZW5zaW9uczogbnVsbCxcbiAgICBnZm06IHRydWUsXG4gICAgaG9va3M6IG51bGwsXG4gICAgcGVkYW50aWM6IGZhbHNlLFxuICAgIHJlbmRlcmVyOiBudWxsLFxuICAgIHNpbGVudDogZmFsc2UsXG4gICAgdG9rZW5pemVyOiBudWxsLFxuICAgIHdhbGtUb2tlbnM6IG51bGwsXG4gIH07XG59XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGxldCBfZGVmYXVsdHM6IE1hcmtlZE9wdGlvbnM8YW55LCBhbnk+ID0gX2dldERlZmF1bHRzKCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGFuZ2VEZWZhdWx0czxQYXJzZXJPdXRwdXQgPSBzdHJpbmcsIFJlbmRlcmVyT3V0cHV0ID0gc3RyaW5nPihuZXdEZWZhdWx0czogTWFya2VkT3B0aW9uczxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0Pikge1xuICBfZGVmYXVsdHMgPSBuZXdEZWZhdWx0cztcbn1cbiIsICJjb25zdCBub29wVGVzdCA9IHsgZXhlYzogKCkgPT4gbnVsbCB9IGFzIHVua25vd24gYXMgUmVnRXhwO1xuXG5mdW5jdGlvbiBlZGl0KHJlZ2V4OiBzdHJpbmcgfCBSZWdFeHAsIG9wdCA9ICcnKSB7XG4gIGxldCBzb3VyY2UgPSB0eXBlb2YgcmVnZXggPT09ICdzdHJpbmcnID8gcmVnZXggOiByZWdleC5zb3VyY2U7XG4gIGNvbnN0IG9iaiA9IHtcbiAgICByZXBsYWNlOiAobmFtZTogc3RyaW5nIHwgUmVnRXhwLCB2YWw6IHN0cmluZyB8IFJlZ0V4cCkgPT4ge1xuICAgICAgbGV0IHZhbFNvdXJjZSA9IHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnID8gdmFsIDogdmFsLnNvdXJjZTtcbiAgICAgIHZhbFNvdXJjZSA9IHZhbFNvdXJjZS5yZXBsYWNlKG90aGVyLmNhcmV0LCAnJDEnKTtcbiAgICAgIHNvdXJjZSA9IHNvdXJjZS5yZXBsYWNlKG5hbWUsIHZhbFNvdXJjZSk7XG4gICAgICByZXR1cm4gb2JqO1xuICAgIH0sXG4gICAgZ2V0UmVnZXg6ICgpID0+IHtcbiAgICAgIHJldHVybiBuZXcgUmVnRXhwKHNvdXJjZSwgb3B0KTtcbiAgICB9LFxuICB9O1xuICByZXR1cm4gb2JqO1xufVxuXG5jb25zdCBzdXBwb3J0c0xvb2tiZWhpbmQgPSAoKCkgPT4ge1xudHJ5IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1yZWdleC1saXRlcmFsc1xuICByZXR1cm4gISFuZXcgUmVnRXhwKCcoPzw9MSkoPzwhMSknKTtcbn0gY2F0Y2gge1xuICAvLyBTZWUgYnJvd3NlciBzdXBwb3J0IGhlcmU6XG4gIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL1JlZ3VsYXJfZXhwcmVzc2lvbnMvTG9va2JlaGluZF9hc3NlcnRpb25cbiAgcmV0dXJuIGZhbHNlO1xufVxufSkoKTtcblxuZXhwb3J0IGNvbnN0IG90aGVyID0ge1xuICBjb2RlUmVtb3ZlSW5kZW50OiAvXig/OiB7MSw0fXwgezAsM31cXHQpL2dtLFxuICBvdXRwdXRMaW5rUmVwbGFjZTogL1xcXFwoW1xcW1xcXV0pL2csXG4gIGluZGVudENvZGVDb21wZW5zYXRpb246IC9eKFxccyspKD86YGBgKS8sXG4gIGJlZ2lubmluZ1NwYWNlOiAvXlxccysvLFxuICBlbmRpbmdIYXNoOiAvIyQvLFxuICBzdGFydGluZ1NwYWNlQ2hhcjogL14gLyxcbiAgZW5kaW5nU3BhY2VDaGFyOiAvICQvLFxuICBub25TcGFjZUNoYXI6IC9bXiBdLyxcbiAgbmV3TGluZUNoYXJHbG9iYWw6IC9cXG4vZyxcbiAgdGFiQ2hhckdsb2JhbDogL1xcdC9nLFxuICBtdWx0aXBsZVNwYWNlR2xvYmFsOiAvXFxzKy9nLFxuICBibGFua0xpbmU6IC9eWyBcXHRdKiQvLFxuICBkb3VibGVCbGFua0xpbmU6IC9cXG5bIFxcdF0qXFxuWyBcXHRdKiQvLFxuICBibG9ja3F1b3RlU3RhcnQ6IC9eIHswLDN9Pi8sXG4gIGJsb2NrcXVvdGVTZXRleHRSZXBsYWNlOiAvXFxuIHswLDN9KCg/Oj0rfC0rKSAqKSg/PVxcbnwkKS9nLFxuICBibG9ja3F1b3RlU2V0ZXh0UmVwbGFjZTI6IC9eIHswLDN9PlsgXFx0XT8vZ20sXG4gIGxpc3RSZXBsYWNlTmVzdGluZzogL14gezEsNH0oPz0oIHs0fSkqW14gXSkvZyxcbiAgbGlzdElzVGFzazogL15cXFtbIHhYXVxcXSArXFxTLyxcbiAgbGlzdFJlcGxhY2VUYXNrOiAvXlxcW1sgeFhdXFxdICsvLFxuICBsaXN0VGFza0NoZWNrYm94OiAvXFxbWyB4WF1cXF0vLFxuICBhbnlMaW5lOiAvXFxuLipcXG4vLFxuICBocmVmQnJhY2tldHM6IC9ePCguKik+JC8sXG4gIHRhYmxlRGVsaW1pdGVyOiAvWzp8XS8sXG4gIHRhYmxlQWxpZ25DaGFyczogL15cXHx8XFx8ICokL2csXG4gIHRhYmxlUm93QmxhbmtMaW5lOiAvXFxuWyBcXHRdKiQvLFxuICB0YWJsZUFsaWduUmlnaHQ6IC9eICotKzogKiQvLFxuICB0YWJsZUFsaWduQ2VudGVyOiAvXiAqOi0rOiAqJC8sXG4gIHRhYmxlQWxpZ25MZWZ0OiAvXiAqOi0rICokLyxcbiAgc3RhcnRBVGFnOiAvXjxhIC9pLFxuICBlbmRBVGFnOiAvXjxcXC9hPi9pLFxuICBzdGFydFByZVNjcmlwdFRhZzogL148KHByZXxjb2RlfGtiZHxzY3JpcHQpKFxcc3w+KS9pLFxuICBlbmRQcmVTY3JpcHRUYWc6IC9ePFxcLyhwcmV8Y29kZXxrYmR8c2NyaXB0KShcXHN8PikvaSxcbiAgc3RhcnRBbmdsZUJyYWNrZXQ6IC9ePC8sXG4gIGVuZEFuZ2xlQnJhY2tldDogLz4kLyxcbiAgcGVkYW50aWNIcmVmVGl0bGU6IC9eKFteJ1wiXSpbXlxcc10pXFxzKyhbJ1wiXSkoLiopXFwyLyxcbiAgdW5pY29kZUFscGhhTnVtZXJpYzogL1tcXHB7TH1cXHB7Tn1dL3UsXG4gIGVzY2FwZVRlc3Q6IC9bJjw+XCInXS8sXG4gIGVzY2FwZVJlcGxhY2U6IC9bJjw+XCInXS9nLFxuICBlc2NhcGVUZXN0Tm9FbmNvZGU6IC9bPD5cIiddfCYoPyEoI1xcZHsxLDd9fCNbWHhdW2EtZkEtRjAtOV17MSw2fXxcXHcrKTspLyxcbiAgZXNjYXBlUmVwbGFjZU5vRW5jb2RlOiAvWzw+XCInXXwmKD8hKCNcXGR7MSw3fXwjW1h4XVthLWZBLUYwLTldezEsNn18XFx3Kyk7KS9nLFxuICBjYXJldDogLyhefFteXFxbXSlcXF4vZyxcbiAgcGVyY2VudERlY29kZTogLyUyNS9nLFxuICBmaW5kUGlwZTogL1xcfC9nLFxuICBzcGxpdFBpcGU6IC8gXFx8LyxcbiAgc2xhc2hQaXBlOiAvXFxcXFxcfC9nLFxuICBjYXJyaWFnZVJldHVybjogL1xcclxcbnxcXHIvZyxcbiAgc3BhY2VMaW5lOiAvXiArJC9nbSxcbiAgbm90U3BhY2VTdGFydDogL15cXFMqLyxcbiAgZW5kaW5nTmV3bGluZTogL1xcbiQvLFxuICBsaXN0SXRlbVJlZ2V4OiAoYnVsbDogc3RyaW5nKSA9PiBuZXcgUmVnRXhwKGBeKCB7MCwzfSR7YnVsbH0pKCg/OltcXHQgXVteXFxcXG5dKik/KD86XFxcXG58JCkpYCksXG4gIG5leHRCdWxsZXRSZWdleDogKGluZGVudDogbnVtYmVyKSA9PiBuZXcgUmVnRXhwKGBeIHswLCR7TWF0aC5taW4oMywgaW5kZW50IC0gMSl9fSg/OlsqKy1dfFxcXFxkezEsOX1bLildKSgoPzpbIFxcdF1bXlxcXFxuXSopPyg/OlxcXFxufCQpKWApLFxuICBoclJlZ2V4OiAoaW5kZW50OiBudW1iZXIpID0+IG5ldyBSZWdFeHAoYF4gezAsJHtNYXRoLm1pbigzLCBpbmRlbnQgLSAxKX19KCg/Oi0gKil7Myx9fCg/Ol8gKil7Myx9fCg/OlxcXFwqICopezMsfSkoPzpcXFxcbit8JClgKSxcbiAgZmVuY2VzQmVnaW5SZWdleDogKGluZGVudDogbnVtYmVyKSA9PiBuZXcgUmVnRXhwKGBeIHswLCR7TWF0aC5taW4oMywgaW5kZW50IC0gMSl9fSg/OlxcYFxcYFxcYHx+fn4pYCksXG4gIGhlYWRpbmdCZWdpblJlZ2V4OiAoaW5kZW50OiBudW1iZXIpID0+IG5ldyBSZWdFeHAoYF4gezAsJHtNYXRoLm1pbigzLCBpbmRlbnQgLSAxKX19I2ApLFxuICBodG1sQmVnaW5SZWdleDogKGluZGVudDogbnVtYmVyKSA9PiBuZXcgUmVnRXhwKGBeIHswLCR7TWF0aC5taW4oMywgaW5kZW50IC0gMSl9fTwoPzpbYS16XS4qPnwhLS0pYCwgJ2knKSxcbiAgYmxvY2txdW90ZUJlZ2luUmVnZXg6IChpbmRlbnQ6IG51bWJlcikgPT4gbmV3IFJlZ0V4cChgXiB7MCwke01hdGgubWluKDMsIGluZGVudCAtIDEpfX0+YCksXG59O1xuXG4vKipcbiAqIEJsb2NrLUxldmVsIEdyYW1tYXJcbiAqL1xuXG5jb25zdCBuZXdsaW5lID0gL14oPzpbIFxcdF0qKD86XFxufCQpKSsvO1xuY29uc3QgYmxvY2tDb2RlID0gL14oKD86IHs0fXwgezAsM31cXHQpW15cXG5dKyg/Olxcbig/OlsgXFx0XSooPzpcXG58JCkpKik/KSsvO1xuY29uc3QgZmVuY2VzID0gL14gezAsM30oYHszLH0oPz1bXmBcXG5dKig/OlxcbnwkKSl8fnszLH0pKFteXFxuXSopKD86XFxufCQpKD86fChbXFxzXFxTXSo/KSg/OlxcbnwkKSkoPzogezAsM31cXDFbfmBdKiAqKD89XFxufCQpfCQpLztcbmNvbnN0IGhyID0gL14gezAsM30oKD86LVtcXHQgXSopezMsfXwoPzpfWyBcXHRdKil7Myx9fCg/OlxcKlsgXFx0XSopezMsfSkoPzpcXG4rfCQpLztcbmNvbnN0IGhlYWRpbmcgPSAvXiB7MCwzfSgjezEsNn0pKD89XFxzfCQpKC4qKSg/Olxcbit8JCkvO1xuY29uc3QgYnVsbGV0ID0gLyB7MCwzfSg/OlsqKy1dfFxcZHsxLDl9Wy4pXSkvO1xuY29uc3QgbGhlYWRpbmdDb3JlID0gL14oPyFidWxsIHxibG9ja0NvZGV8ZmVuY2VzfGJsb2NrcXVvdGV8aGVhZGluZ3xodG1sfHRhYmxlKSgoPzoufFxcbig/IVxccyo/XFxufGJ1bGwgfGJsb2NrQ29kZXxmZW5jZXN8YmxvY2txdW90ZXxoZWFkaW5nfGh0bWx8dGFibGUpKSs/KVxcbiB7MCwzfSg9K3wtKykgKig/Olxcbit8JCkvO1xuY29uc3QgbGhlYWRpbmcgPSBlZGl0KGxoZWFkaW5nQ29yZSlcbiAgLnJlcGxhY2UoL2J1bGwvZywgYnVsbGV0KSAvLyBsaXN0cyBjYW4gaW50ZXJydXB0XG4gIC5yZXBsYWNlKC9ibG9ja0NvZGUvZywgLyg/OiB7NH18IHswLDN9XFx0KS8pIC8vIGluZGVudGVkIGNvZGUgYmxvY2tzIGNhbiBpbnRlcnJ1cHRcbiAgLnJlcGxhY2UoL2ZlbmNlcy9nLCAvIHswLDN9KD86YHszLH18fnszLH0pLykgLy8gZmVuY2VkIGNvZGUgYmxvY2tzIGNhbiBpbnRlcnJ1cHRcbiAgLnJlcGxhY2UoL2Jsb2NrcXVvdGUvZywgLyB7MCwzfT4vKSAvLyBibG9ja3F1b3RlIGNhbiBpbnRlcnJ1cHRcbiAgLnJlcGxhY2UoL2hlYWRpbmcvZywgLyB7MCwzfSN7MSw2fS8pIC8vIEFUWCBoZWFkaW5nIGNhbiBpbnRlcnJ1cHRcbiAgLnJlcGxhY2UoL2h0bWwvZywgLyB7MCwzfTxbXlxcbj5dKz5cXG4vKSAvLyBibG9jayBodG1sIGNhbiBpbnRlcnJ1cHRcbiAgLnJlcGxhY2UoL1xcfHRhYmxlL2csICcnKSAvLyB0YWJsZSBub3QgaW4gY29tbW9ubWFya1xuICAuZ2V0UmVnZXgoKTtcbmNvbnN0IGxoZWFkaW5nR2ZtID0gZWRpdChsaGVhZGluZ0NvcmUpXG4gIC5yZXBsYWNlKC9idWxsL2csIGJ1bGxldCkgLy8gbGlzdHMgY2FuIGludGVycnVwdFxuICAucmVwbGFjZSgvYmxvY2tDb2RlL2csIC8oPzogezR9fCB7MCwzfVxcdCkvKSAvLyBpbmRlbnRlZCBjb2RlIGJsb2NrcyBjYW4gaW50ZXJydXB0XG4gIC5yZXBsYWNlKC9mZW5jZXMvZywgLyB7MCwzfSg/OmB7Myx9fH57Myx9KS8pIC8vIGZlbmNlZCBjb2RlIGJsb2NrcyBjYW4gaW50ZXJydXB0XG4gIC5yZXBsYWNlKC9ibG9ja3F1b3RlL2csIC8gezAsM30+LykgLy8gYmxvY2txdW90ZSBjYW4gaW50ZXJydXB0XG4gIC5yZXBsYWNlKC9oZWFkaW5nL2csIC8gezAsM30jezEsNn0vKSAvLyBBVFggaGVhZGluZyBjYW4gaW50ZXJydXB0XG4gIC5yZXBsYWNlKC9odG1sL2csIC8gezAsM308W15cXG4+XSs+XFxuLykgLy8gYmxvY2sgaHRtbCBjYW4gaW50ZXJydXB0XG4gIC5yZXBsYWNlKC90YWJsZS9nLCAvIHswLDN9XFx8Pyg/Ols6XFwtIF0qXFx8KStbXFw6XFwtIF0qXFxuLykgLy8gdGFibGUgY2FuIGludGVycnVwdFxuICAuZ2V0UmVnZXgoKTtcbmNvbnN0IF9wYXJhZ3JhcGggPSAvXihbXlxcbl0rKD86XFxuKD8haHJ8aGVhZGluZ3xsaGVhZGluZ3xibG9ja3F1b3RlfGZlbmNlc3xsaXN0fGh0bWx8dGFibGV8ICtcXG4pW15cXG5dKykqKS87XG5jb25zdCBibG9ja1RleHQgPSAvXlteXFxuXSsvO1xuY29uc3QgX2Jsb2NrTGFiZWwgPSAvKD8hXFxzKlxcXSkoPzpcXFxcW1xcc1xcU118W15cXFtcXF1cXFxcXSkrLztcbmNvbnN0IGRlZiA9IGVkaXQoL14gezAsM31cXFsobGFiZWwpXFxdOiAqKD86XFxuWyBcXHRdKik/KFtePFxcc11bXlxcc10qfDwuKj8+KSg/Oig/OiArKD86XFxuWyBcXHRdKik/fCAqXFxuWyBcXHRdKikodGl0bGUpKT8gKig/Olxcbit8JCkvKVxuICAucmVwbGFjZSgnbGFiZWwnLCBfYmxvY2tMYWJlbClcbiAgLnJlcGxhY2UoJ3RpdGxlJywgLyg/OlwiKD86XFxcXFwiP3xbXlwiXFxcXF0pKlwifCdbXidcXG5dKig/OlxcblteJ1xcbl0rKSpcXG4/J3xcXChbXigpXSpcXCkpLylcbiAgLmdldFJlZ2V4KCk7XG5cbmNvbnN0IGxpc3QgPSBlZGl0KC9eKGJ1bGwpKFsgXFx0XVteXFxuXSs/KT8oPzpcXG58JCkvKVxuICAucmVwbGFjZSgvYnVsbC9nLCBidWxsZXQpXG4gIC5nZXRSZWdleCgpO1xuXG5jb25zdCBfdGFnID0gJ2FkZHJlc3N8YXJ0aWNsZXxhc2lkZXxiYXNlfGJhc2Vmb250fGJsb2NrcXVvdGV8Ym9keXxjYXB0aW9uJ1xuICArICd8Y2VudGVyfGNvbHxjb2xncm91cHxkZHxkZXRhaWxzfGRpYWxvZ3xkaXJ8ZGl2fGRsfGR0fGZpZWxkc2V0fGZpZ2NhcHRpb24nXG4gICsgJ3xmaWd1cmV8Zm9vdGVyfGZvcm18ZnJhbWV8ZnJhbWVzZXR8aFsxLTZdfGhlYWR8aGVhZGVyfGhyfGh0bWx8aWZyYW1lJ1xuICArICd8bGVnZW5kfGxpfGxpbmt8bWFpbnxtZW51fG1lbnVpdGVtfG1ldGF8bmF2fG5vZnJhbWVzfG9sfG9wdGdyb3VwfG9wdGlvbidcbiAgKyAnfHB8cGFyYW18c2VhcmNofHNlY3Rpb258c3VtbWFyeXx0YWJsZXx0Ym9keXx0ZHx0Zm9vdHx0aHx0aGVhZHx0aXRsZSdcbiAgKyAnfHRyfHRyYWNrfHVsJztcbmNvbnN0IF9jb21tZW50ID0gLzwhLS0oPzotPz58W1xcc1xcU10qPyg/Oi0tPnwkKSkvO1xuY29uc3QgaHRtbCA9IGVkaXQoXG4gICdeIHswLDN9KD86JyAvLyBvcHRpb25hbCBpbmRlbnRhdGlvblxuKyAnPChzY3JpcHR8cHJlfHN0eWxlfHRleHRhcmVhKVtcXFxccz5dW1xcXFxzXFxcXFNdKj8oPzo8L1xcXFwxPlteXFxcXG5dKlxcXFxuK3wkKScgLy8gKDEpXG4rICd8Y29tbWVudFteXFxcXG5dKihcXFxcbit8JCknIC8vICgyKVxuKyAnfDxcXFxcP1tcXFxcc1xcXFxTXSo/KD86XFxcXD8+XFxcXG4qfCQpJyAvLyAoMylcbisgJ3w8IVtBLVpdW1xcXFxzXFxcXFNdKj8oPzo+XFxcXG4qfCQpJyAvLyAoNClcbisgJ3w8IVxcXFxbQ0RBVEFcXFxcW1tcXFxcc1xcXFxTXSo/KD86XFxcXF1cXFxcXT5cXFxcbip8JCknIC8vICg1KVxuKyAnfDwvPyh0YWcpKD86ICt8XFxcXG58Lz8+KVtcXFxcc1xcXFxTXSo/KD86KD86XFxcXG5bIFxcdF0qKStcXFxcbnwkKScgLy8gKDYpXG4rICd8PCg/IXNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWEpKFthLXpdW1xcXFx3LV0qKSg/OmF0dHJpYnV0ZSkqPyAqLz8+KD89WyBcXFxcdF0qKD86XFxcXG58JCkpW1xcXFxzXFxcXFNdKj8oPzooPzpcXFxcblsgXFx0XSopK1xcXFxufCQpJyAvLyAoNykgb3BlbiB0YWdcbisgJ3w8Lyg/IXNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWEpW2Etel1bXFxcXHctXSpcXFxccyo+KD89WyBcXFxcdF0qKD86XFxcXG58JCkpW1xcXFxzXFxcXFNdKj8oPzooPzpcXFxcblsgXFx0XSopK1xcXFxufCQpJyAvLyAoNykgY2xvc2luZyB0YWdcbisgJyknLCAnaScpXG4gIC5yZXBsYWNlKCdjb21tZW50JywgX2NvbW1lbnQpXG4gIC5yZXBsYWNlKCd0YWcnLCBfdGFnKVxuICAucmVwbGFjZSgnYXR0cmlidXRlJywgLyArW2EtekEtWjpfXVtcXHcuOi1dKig/OiAqPSAqXCJbXlwiXFxuXSpcInwgKj0gKidbXidcXG5dKid8ICo9ICpbXlxcc1wiJz08PmBdKyk/LylcbiAgLmdldFJlZ2V4KCk7XG5cbmNvbnN0IHBhcmFncmFwaCA9IGVkaXQoX3BhcmFncmFwaClcbiAgLnJlcGxhY2UoJ2hyJywgaHIpXG4gIC5yZXBsYWNlKCdoZWFkaW5nJywgJyB7MCwzfSN7MSw2fSg/OlxcXFxzfCQpJylcbiAgLnJlcGxhY2UoJ3xsaGVhZGluZycsICcnKSAvLyBzZXRleHQgaGVhZGluZ3MgZG9uJ3QgaW50ZXJydXB0IGNvbW1vbm1hcmsgcGFyYWdyYXBoc1xuICAucmVwbGFjZSgnfHRhYmxlJywgJycpXG4gIC5yZXBsYWNlKCdibG9ja3F1b3RlJywgJyB7MCwzfT4nKVxuICAucmVwbGFjZSgnZmVuY2VzJywgJyB7MCwzfSg/OmB7Myx9KD89W15gXFxcXG5dKlxcXFxuKXx+ezMsfSlbXlxcXFxuXSpcXFxcbicpXG4gIC5yZXBsYWNlKCdsaXN0JywgJyB7MCwzfSg/OlsqKy1dfDFbLildKVsgXFxcXHRdJykgLy8gb25seSBsaXN0cyBzdGFydGluZyBmcm9tIDEgY2FuIGludGVycnVwdFxuICAucmVwbGFjZSgnaHRtbCcsICc8Lz8oPzp0YWcpKD86ICt8XFxcXG58Lz8+KXw8KD86c2NyaXB0fHByZXxzdHlsZXx0ZXh0YXJlYXwhLS0pJylcbiAgLnJlcGxhY2UoJ3RhZycsIF90YWcpIC8vIHBhcnMgY2FuIGJlIGludGVycnVwdGVkIGJ5IHR5cGUgKDYpIGh0bWwgYmxvY2tzXG4gIC5nZXRSZWdleCgpO1xuXG5jb25zdCBibG9ja3F1b3RlID0gZWRpdCgvXiggezAsM30+ID8ocGFyYWdyYXBofFteXFxuXSopKD86XFxufCQpKSsvKVxuICAucmVwbGFjZSgncGFyYWdyYXBoJywgcGFyYWdyYXBoKVxuICAuZ2V0UmVnZXgoKTtcblxuLyoqXG4gKiBOb3JtYWwgQmxvY2sgR3JhbW1hclxuICovXG5cbmNvbnN0IGJsb2NrTm9ybWFsID0ge1xuICBibG9ja3F1b3RlLFxuICBjb2RlOiBibG9ja0NvZGUsXG4gIGRlZixcbiAgZmVuY2VzLFxuICBoZWFkaW5nLFxuICBocixcbiAgaHRtbCxcbiAgbGhlYWRpbmcsXG4gIGxpc3QsXG4gIG5ld2xpbmUsXG4gIHBhcmFncmFwaCxcbiAgdGFibGU6IG5vb3BUZXN0LFxuICB0ZXh0OiBibG9ja1RleHQsXG59O1xuXG50eXBlIEJsb2NrS2V5cyA9IGtleW9mIHR5cGVvZiBibG9ja05vcm1hbDtcblxuLyoqXG4gKiBHRk0gQmxvY2sgR3JhbW1hclxuICovXG5cbmNvbnN0IGdmbVRhYmxlID0gZWRpdChcbiAgJ14gKihbXlxcXFxuIF0uKilcXFxcbicgLy8gSGVhZGVyXG4rICcgezAsM30oKD86XFxcXHwgKik/Oj8tKzo/ICooPzpcXFxcfCAqOj8tKzo/ICopKig/OlxcXFx8ICopPyknIC8vIEFsaWduXG4rICcoPzpcXFxcbigoPzooPyEgKlxcXFxufGhyfGhlYWRpbmd8YmxvY2txdW90ZXxjb2RlfGZlbmNlc3xsaXN0fGh0bWwpLiooPzpcXFxcbnwkKSkqKVxcXFxuKnwkKScpIC8vIENlbGxzXG4gIC5yZXBsYWNlKCdocicsIGhyKVxuICAucmVwbGFjZSgnaGVhZGluZycsICcgezAsM30jezEsNn0oPzpcXFxcc3wkKScpXG4gIC5yZXBsYWNlKCdibG9ja3F1b3RlJywgJyB7MCwzfT4nKVxuICAucmVwbGFjZSgnY29kZScsICcoPzogezR9fCB7MCwzfVxcdClbXlxcXFxuXScpXG4gIC5yZXBsYWNlKCdmZW5jZXMnLCAnIHswLDN9KD86YHszLH0oPz1bXmBcXFxcbl0qXFxcXG4pfH57Myx9KVteXFxcXG5dKlxcXFxuJylcbiAgLnJlcGxhY2UoJ2xpc3QnLCAnIHswLDN9KD86WyorLV18MVsuKV0pWyBcXFxcdF0nKSAvLyBvbmx5IGxpc3RzIHN0YXJ0aW5nIGZyb20gMSBjYW4gaW50ZXJydXB0XG4gIC5yZXBsYWNlKCdodG1sJywgJzwvPyg/OnRhZykoPzogK3xcXFxcbnwvPz4pfDwoPzpzY3JpcHR8cHJlfHN0eWxlfHRleHRhcmVhfCEtLSknKVxuICAucmVwbGFjZSgndGFnJywgX3RhZykgLy8gdGFibGVzIGNhbiBiZSBpbnRlcnJ1cHRlZCBieSB0eXBlICg2KSBodG1sIGJsb2Nrc1xuICAuZ2V0UmVnZXgoKTtcblxuY29uc3QgYmxvY2tHZm06IFJlY29yZDxCbG9ja0tleXMsIFJlZ0V4cD4gPSB7XG4gIC4uLmJsb2NrTm9ybWFsLFxuICBsaGVhZGluZzogbGhlYWRpbmdHZm0sXG4gIHRhYmxlOiBnZm1UYWJsZSxcbiAgcGFyYWdyYXBoOiBlZGl0KF9wYXJhZ3JhcGgpXG4gICAgLnJlcGxhY2UoJ2hyJywgaHIpXG4gICAgLnJlcGxhY2UoJ2hlYWRpbmcnLCAnIHswLDN9I3sxLDZ9KD86XFxcXHN8JCknKVxuICAgIC5yZXBsYWNlKCd8bGhlYWRpbmcnLCAnJykgLy8gc2V0ZXh0IGhlYWRpbmdzIGRvbid0IGludGVycnVwdCBjb21tb25tYXJrIHBhcmFncmFwaHNcbiAgICAucmVwbGFjZSgndGFibGUnLCBnZm1UYWJsZSkgLy8gaW50ZXJydXB0IHBhcmFncmFwaHMgd2l0aCB0YWJsZVxuICAgIC5yZXBsYWNlKCdibG9ja3F1b3RlJywgJyB7MCwzfT4nKVxuICAgIC5yZXBsYWNlKCdmZW5jZXMnLCAnIHswLDN9KD86YHszLH0oPz1bXmBcXFxcbl0qXFxcXG4pfH57Myx9KVteXFxcXG5dKlxcXFxuJylcbiAgICAucmVwbGFjZSgnbGlzdCcsICcgezAsM30oPzpbKistXXwxWy4pXSlbIFxcXFx0XScpIC8vIG9ubHkgbGlzdHMgc3RhcnRpbmcgZnJvbSAxIGNhbiBpbnRlcnJ1cHRcbiAgICAucmVwbGFjZSgnaHRtbCcsICc8Lz8oPzp0YWcpKD86ICt8XFxcXG58Lz8+KXw8KD86c2NyaXB0fHByZXxzdHlsZXx0ZXh0YXJlYXwhLS0pJylcbiAgICAucmVwbGFjZSgndGFnJywgX3RhZykgLy8gcGFycyBjYW4gYmUgaW50ZXJydXB0ZWQgYnkgdHlwZSAoNikgaHRtbCBibG9ja3NcbiAgICAuZ2V0UmVnZXgoKSxcbn07XG5cbi8qKlxuICogUGVkYW50aWMgZ3JhbW1hciAob3JpZ2luYWwgSm9obiBHcnViZXIncyBsb29zZSBtYXJrZG93biBzcGVjaWZpY2F0aW9uKVxuICovXG5cbmNvbnN0IGJsb2NrUGVkYW50aWM6IFJlY29yZDxCbG9ja0tleXMsIFJlZ0V4cD4gPSB7XG4gIC4uLmJsb2NrTm9ybWFsLFxuICBodG1sOiBlZGl0KFxuICAgICdeICooPzpjb21tZW50ICooPzpcXFxcbnxcXFxccyokKSdcbiAgICArICd8PCh0YWcpW1xcXFxzXFxcXFNdKz88L1xcXFwxPiAqKD86XFxcXG57Mix9fFxcXFxzKiQpJyAvLyBjbG9zZWQgdGFnXG4gICAgKyAnfDx0YWcoPzpcIlteXCJdKlwifFxcJ1teXFwnXSpcXCd8XFxcXHNbXlxcJ1wiLz5cXFxcc10qKSo/Lz8+ICooPzpcXFxcbnsyLH18XFxcXHMqJCkpJylcbiAgICAucmVwbGFjZSgnY29tbWVudCcsIF9jb21tZW50KVxuICAgIC5yZXBsYWNlKC90YWcvZywgJyg/ISg/OidcbiAgICAgICsgJ2F8ZW18c3Ryb25nfHNtYWxsfHN8Y2l0ZXxxfGRmbnxhYmJyfGRhdGF8dGltZXxjb2RlfHZhcnxzYW1wfGtiZHxzdWInXG4gICAgICArICd8c3VwfGl8Ynx1fG1hcmt8cnVieXxydHxycHxiZGl8YmRvfHNwYW58YnJ8d2JyfGluc3xkZWx8aW1nKSdcbiAgICAgICsgJ1xcXFxiKVxcXFx3Kyg/ITp8W15cXFxcd1xcXFxzQF0qQClcXFxcYicpXG4gICAgLmdldFJlZ2V4KCksXG4gIGRlZjogL14gKlxcWyhbXlxcXV0rKVxcXTogKjw/KFteXFxzPl0rKT4/KD86ICsoW1wiKF1bXlxcbl0rW1wiKV0pKT8gKig/Olxcbit8JCkvLFxuICBoZWFkaW5nOiAvXigjezEsNn0pKC4qKSg/Olxcbit8JCkvLFxuICBmZW5jZXM6IG5vb3BUZXN0LCAvLyBmZW5jZXMgbm90IHN1cHBvcnRlZFxuICBsaGVhZGluZzogL14oLis/KVxcbiB7MCwzfSg9K3wtKykgKig/Olxcbit8JCkvLFxuICBwYXJhZ3JhcGg6IGVkaXQoX3BhcmFncmFwaClcbiAgICAucmVwbGFjZSgnaHInLCBocilcbiAgICAucmVwbGFjZSgnaGVhZGluZycsICcgKiN7MSw2fSAqW15cXG5dJylcbiAgICAucmVwbGFjZSgnbGhlYWRpbmcnLCBsaGVhZGluZylcbiAgICAucmVwbGFjZSgnfHRhYmxlJywgJycpXG4gICAgLnJlcGxhY2UoJ2Jsb2NrcXVvdGUnLCAnIHswLDN9PicpXG4gICAgLnJlcGxhY2UoJ3xmZW5jZXMnLCAnJylcbiAgICAucmVwbGFjZSgnfGxpc3QnLCAnJylcbiAgICAucmVwbGFjZSgnfGh0bWwnLCAnJylcbiAgICAucmVwbGFjZSgnfHRhZycsICcnKVxuICAgIC5nZXRSZWdleCgpLFxufTtcblxuLyoqXG4gKiBJbmxpbmUtTGV2ZWwgR3JhbW1hclxuICovXG5cbmNvbnN0IGVzY2FwZSA9IC9eXFxcXChbIVwiIyQlJicoKSorLFxcLS4vOjs8PT4/QFxcW1xcXVxcXFxeX2B7fH1+XSkvO1xuY29uc3QgaW5saW5lQ29kZSA9IC9eKGArKShbXmBdfFteYF1bXFxzXFxTXSo/W15gXSlcXDEoPyFgKS87XG5jb25zdCBiciA9IC9eKCB7Mix9fFxcXFwpXFxuKD8hXFxzKiQpLztcbmNvbnN0IGlubGluZVRleHQgPSAvXihgK3xbXmBdKSg/Oig/PSB7Mix9XFxuKXxbXFxzXFxTXSo/KD86KD89W1xcXFw8IVxcW2AqX118XFxiX3wkKXxbXiBdKD89IHsyLH1cXG4pKSkvO1xuXG4vLyBsaXN0IG9mIHVuaWNvZGUgcHVuY3R1YXRpb24gbWFya3MsIHBsdXMgYW55IG1pc3NpbmcgY2hhcmFjdGVycyBmcm9tIENvbW1vbk1hcmsgc3BlY1xuY29uc3QgX3B1bmN0dWF0aW9uID0gL1tcXHB7UH1cXHB7U31dL3U7XG5jb25zdCBfcHVuY3R1YXRpb25PclNwYWNlID0gL1tcXHNcXHB7UH1cXHB7U31dL3U7XG5jb25zdCBfbm90UHVuY3R1YXRpb25PclNwYWNlID0gL1teXFxzXFxwe1B9XFxwe1N9XS91O1xuY29uc3QgcHVuY3R1YXRpb24gPSBlZGl0KC9eKCg/IVsqX10pcHVuY3RTcGFjZSkvLCAndScpXG4gIC5yZXBsYWNlKC9wdW5jdFNwYWNlL2csIF9wdW5jdHVhdGlvbk9yU3BhY2UpLmdldFJlZ2V4KCk7XG5cbi8vIEdGTSBhbGxvd3MgfiBpbnNpZGUgc3Ryb25nIGFuZCBlbSBmb3Igc3RyaWtldGhyb3VnaFxuY29uc3QgX3B1bmN0dWF0aW9uR2ZtU3Ryb25nRW0gPSAvKD8hfilbXFxwe1B9XFxwe1N9XS91O1xuY29uc3QgX3B1bmN0dWF0aW9uT3JTcGFjZUdmbVN0cm9uZ0VtID0gLyg/IX4pW1xcc1xccHtQfVxccHtTfV0vdTtcbmNvbnN0IF9ub3RQdW5jdHVhdGlvbk9yU3BhY2VHZm1TdHJvbmdFbSA9IC8oPzpbXlxcc1xccHtQfVxccHtTfV18fikvdTtcblxuLy8gc2VxdWVuY2VzIGVtIHNob3VsZCBza2lwIG92ZXIgW3RpdGxlXShsaW5rKSwgYGNvZGVgLCA8aHRtbD5cbmNvbnN0IGJsb2NrU2tpcCA9IGVkaXQoL2xpbmt8cHJlY29kZS1jb2RlfGh0bWwvLCAnZycpXG4gIC5yZXBsYWNlKCdsaW5rJywgL1xcWyg/OlteXFxbXFxdYF18KD88YT5gKylbXmBdK1xcazxhPig/IWApKSo/XFxdXFwoKD86XFxcXFtcXHNcXFNdfFteXFxcXFxcKFxcKV18XFwoKD86XFxcXFtcXHNcXFNdfFteXFxcXFxcKFxcKV0pKlxcKSkqXFwpLylcbiAgLnJlcGxhY2UoJ3ByZWNvZGUtJywgc3VwcG9ydHNMb29rYmVoaW5kID8gJyg/PCFgKSgpJyA6ICcoXl58W15gXSknKVxuICAucmVwbGFjZSgnY29kZScsIC8oPzxiPmArKVteYF0rXFxrPGI+KD8hYCkvKVxuICAucmVwbGFjZSgnaHRtbCcsIC88KD8hIClbXjw+XSo/Pi8pXG4gIC5nZXRSZWdleCgpO1xuXG5jb25zdCBlbVN0cm9uZ0xEZWxpbUNvcmUgPSAvXig/OlxcKisoPzooKD8hXFwqKXB1bmN0KXwoW15cXHMqXSkpPyl8Xl8rKD86KCg/IV8pcHVuY3QpfChbXlxcc19dKSk/LztcblxuY29uc3QgZW1TdHJvbmdMRGVsaW0gPSBlZGl0KGVtU3Ryb25nTERlbGltQ29yZSwgJ3UnKVxuICAucmVwbGFjZSgvcHVuY3QvZywgX3B1bmN0dWF0aW9uKVxuICAuZ2V0UmVnZXgoKTtcblxuY29uc3QgZW1TdHJvbmdMRGVsaW1HZm0gPSBlZGl0KGVtU3Ryb25nTERlbGltQ29yZSwgJ3UnKVxuICAucmVwbGFjZSgvcHVuY3QvZywgX3B1bmN0dWF0aW9uR2ZtU3Ryb25nRW0pXG4gIC5nZXRSZWdleCgpO1xuXG5jb25zdCBlbVN0cm9uZ1JEZWxpbUFzdENvcmUgPVxuICAnXlteXypdKj9fX1teXypdKj9cXFxcKlteXypdKj8oPz1fXyknIC8vIFNraXAgb3JwaGFuIGluc2lkZSBzdHJvbmdcbisgJ3xbXipdKyg/PVteKl0pJyAvLyBDb25zdW1lIHRvIGRlbGltXG4rICd8KD8hXFxcXCopcHVuY3QoXFxcXCorKSg/PVtcXFxcc118JCknIC8vICgxKSAjKioqIGNhbiBvbmx5IGJlIGEgUmlnaHQgRGVsaW1pdGVyXG4rICd8bm90UHVuY3RTcGFjZShcXFxcKispKD8hXFxcXCopKD89cHVuY3RTcGFjZXwkKScgLy8gKDIpIGEqKiojLCBhKioqIGNhbiBvbmx5IGJlIGEgUmlnaHQgRGVsaW1pdGVyXG4rICd8KD8hXFxcXCopcHVuY3RTcGFjZShcXFxcKispKD89bm90UHVuY3RTcGFjZSknIC8vICgzKSAjKioqYSwgKioqYSBjYW4gb25seSBiZSBMZWZ0IERlbGltaXRlclxuKyAnfFtcXFxcc10oXFxcXCorKSg/IVxcXFwqKSg/PXB1bmN0KScgLy8gKDQpICoqKiMgY2FuIG9ubHkgYmUgTGVmdCBEZWxpbWl0ZXJcbisgJ3woPyFcXFxcKilwdW5jdChcXFxcKispKD8hXFxcXCopKD89cHVuY3QpJyAvLyAoNSkgIyoqKiMgY2FuIGJlIGVpdGhlciBMZWZ0IG9yIFJpZ2h0IERlbGltaXRlclxuKyAnfG5vdFB1bmN0U3BhY2UoXFxcXCorKSg/PW5vdFB1bmN0U3BhY2UpJzsgLy8gKDYpIGEqKiphIGNhbiBiZSBlaXRoZXIgTGVmdCBvciBSaWdodCBEZWxpbWl0ZXJcblxuY29uc3QgZW1TdHJvbmdSRGVsaW1Bc3QgPSBlZGl0KGVtU3Ryb25nUkRlbGltQXN0Q29yZSwgJ2d1JylcbiAgLnJlcGxhY2UoL25vdFB1bmN0U3BhY2UvZywgX25vdFB1bmN0dWF0aW9uT3JTcGFjZSlcbiAgLnJlcGxhY2UoL3B1bmN0U3BhY2UvZywgX3B1bmN0dWF0aW9uT3JTcGFjZSlcbiAgLnJlcGxhY2UoL3B1bmN0L2csIF9wdW5jdHVhdGlvbilcbiAgLmdldFJlZ2V4KCk7XG5cbmNvbnN0IGVtU3Ryb25nUkRlbGltQXN0R2ZtID0gZWRpdChlbVN0cm9uZ1JEZWxpbUFzdENvcmUsICdndScpXG4gIC5yZXBsYWNlKC9ub3RQdW5jdFNwYWNlL2csIF9ub3RQdW5jdHVhdGlvbk9yU3BhY2VHZm1TdHJvbmdFbSlcbiAgLnJlcGxhY2UoL3B1bmN0U3BhY2UvZywgX3B1bmN0dWF0aW9uT3JTcGFjZUdmbVN0cm9uZ0VtKVxuICAucmVwbGFjZSgvcHVuY3QvZywgX3B1bmN0dWF0aW9uR2ZtU3Ryb25nRW0pXG4gIC5nZXRSZWdleCgpO1xuXG4vLyAoNikgTm90IGFsbG93ZWQgZm9yIF9cbmNvbnN0IGVtU3Ryb25nUkRlbGltVW5kID0gZWRpdChcbiAgJ15bXl8qXSo/XFxcXCpcXFxcKlteXypdKj9fW15fKl0qPyg/PVxcXFwqXFxcXCopJyAvLyBTa2lwIG9ycGhhbiBpbnNpZGUgc3Ryb25nXG4rICd8W15fXSsoPz1bXl9dKScgLy8gQ29uc3VtZSB0byBkZWxpbVxuKyAnfCg/IV8pcHVuY3QoXyspKD89W1xcXFxzXXwkKScgLy8gKDEpICNfX18gY2FuIG9ubHkgYmUgYSBSaWdodCBEZWxpbWl0ZXJcbisgJ3xub3RQdW5jdFNwYWNlKF8rKSg/IV8pKD89cHVuY3RTcGFjZXwkKScgLy8gKDIpIGFfX18jLCBhX19fIGNhbiBvbmx5IGJlIGEgUmlnaHQgRGVsaW1pdGVyXG4rICd8KD8hXylwdW5jdFNwYWNlKF8rKSg/PW5vdFB1bmN0U3BhY2UpJyAvLyAoMykgI19fX2EsIF9fX2EgY2FuIG9ubHkgYmUgTGVmdCBEZWxpbWl0ZXJcbisgJ3xbXFxcXHNdKF8rKSg/IV8pKD89cHVuY3QpJyAvLyAoNCkgX19fIyBjYW4gb25seSBiZSBMZWZ0IERlbGltaXRlclxuKyAnfCg/IV8pcHVuY3QoXyspKD8hXykoPz1wdW5jdCknLCAnZ3UnKSAvLyAoNSkgI19fXyMgY2FuIGJlIGVpdGhlciBMZWZ0IG9yIFJpZ2h0IERlbGltaXRlclxuICAucmVwbGFjZSgvbm90UHVuY3RTcGFjZS9nLCBfbm90UHVuY3R1YXRpb25PclNwYWNlKVxuICAucmVwbGFjZSgvcHVuY3RTcGFjZS9nLCBfcHVuY3R1YXRpb25PclNwYWNlKVxuICAucmVwbGFjZSgvcHVuY3QvZywgX3B1bmN0dWF0aW9uKVxuICAuZ2V0UmVnZXgoKTtcblxuLy8gVGlsZGUgbGVmdCBkZWxpbWl0ZXIgZm9yIHN0cmlrZXRocm91Z2ggKHNpbWlsYXIgdG8gZW1TdHJvbmdMRGVsaW0gZm9yIGFzdGVyaXNrKVxuY29uc3QgZGVsTERlbGltID0gZWRpdCgvXn5+Pyg/OigoPyF+KXB1bmN0KXxbXlxcc35dKS8sICd1JylcbiAgLnJlcGxhY2UoL3B1bmN0L2csIF9wdW5jdHVhdGlvbilcbiAgLmdldFJlZ2V4KCk7XG5cbi8vIFRpbGRlIGRlbGltaXRlciBwYXR0ZXJucyBmb3Igc3RyaWtldGhyb3VnaCAoc2ltaWxhciB0byBhc3RlcmlzaylcbmNvbnN0IGRlbFJEZWxpbUNvcmUgPVxuICAnXltefl0rKD89W15+XSknIC8vIENvbnN1bWUgdG8gZGVsaW1cbisgJ3woPyF+KXB1bmN0KH5+PykoPz1bXFxcXHNdfCQpJyAvLyAoMSkgI35+IGNhbiBvbmx5IGJlIGEgUmlnaHQgRGVsaW1pdGVyXG4rICd8bm90UHVuY3RTcGFjZSh+fj8pKD8hfikoPz1wdW5jdFNwYWNlfCQpJyAvLyAoMikgYX5+IywgYX5+IGNhbiBvbmx5IGJlIGEgUmlnaHQgRGVsaW1pdGVyXG4rICd8KD8hfilwdW5jdFNwYWNlKH5+PykoPz1ub3RQdW5jdFNwYWNlKScgLy8gKDMpICN+fmEsIH5+YSBjYW4gb25seSBiZSBMZWZ0IERlbGltaXRlclxuKyAnfFtcXFxcc10ofn4/KSg/IX4pKD89cHVuY3QpJyAvLyAoNCkgfn4jIGNhbiBvbmx5IGJlIExlZnQgRGVsaW1pdGVyXG4rICd8KD8hfilwdW5jdCh+fj8pKD8hfikoPz1wdW5jdCknIC8vICg1KSAjfn4jIGNhbiBiZSBlaXRoZXIgTGVmdCBvciBSaWdodCBEZWxpbWl0ZXJcbisgJ3xub3RQdW5jdFNwYWNlKH5+PykoPz1ub3RQdW5jdFNwYWNlKSc7IC8vICg2KSBhfn5hIGNhbiBiZSBlaXRoZXIgTGVmdCBvciBSaWdodCBEZWxpbWl0ZXJcblxuY29uc3QgZGVsUkRlbGltID0gZWRpdChkZWxSRGVsaW1Db3JlLCAnZ3UnKVxuICAucmVwbGFjZSgvbm90UHVuY3RTcGFjZS9nLCBfbm90UHVuY3R1YXRpb25PclNwYWNlKVxuICAucmVwbGFjZSgvcHVuY3RTcGFjZS9nLCBfcHVuY3R1YXRpb25PclNwYWNlKVxuICAucmVwbGFjZSgvcHVuY3QvZywgX3B1bmN0dWF0aW9uKVxuICAuZ2V0UmVnZXgoKTtcblxuY29uc3QgYW55UHVuY3R1YXRpb24gPSBlZGl0KC9cXFxcKHB1bmN0KS8sICdndScpXG4gIC5yZXBsYWNlKC9wdW5jdC9nLCBfcHVuY3R1YXRpb24pXG4gIC5nZXRSZWdleCgpO1xuXG5jb25zdCBhdXRvbGluayA9IGVkaXQoL148KHNjaGVtZTpbXlxcc1xceDAwLVxceDFmPD5dKnxlbWFpbCk+LylcbiAgLnJlcGxhY2UoJ3NjaGVtZScsIC9bYS16QS1aXVthLXpBLVowLTkrLi1dezEsMzF9LylcbiAgLnJlcGxhY2UoJ2VtYWlsJywgL1thLXpBLVowLTkuISMkJSYnKisvPT9eX2B7fH1+LV0rKEApW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSk/KD86XFwuW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSk/KSsoPyFbLV9dKS8pXG4gIC5nZXRSZWdleCgpO1xuXG5jb25zdCBfaW5saW5lQ29tbWVudCA9IGVkaXQoX2NvbW1lbnQpLnJlcGxhY2UoJyg/Oi0tPnwkKScsICctLT4nKS5nZXRSZWdleCgpO1xuY29uc3QgdGFnID0gZWRpdChcbiAgJ15jb21tZW50J1xuICAgICsgJ3xePC9bYS16QS1aXVtcXFxcdzotXSpcXFxccyo+JyAvLyBzZWxmLWNsb3NpbmcgdGFnXG4gICAgKyAnfF48W2EtekEtWl1bXFxcXHctXSooPzphdHRyaWJ1dGUpKj9cXFxccyovPz4nIC8vIG9wZW4gdGFnXG4gICAgKyAnfF48XFxcXD9bXFxcXHNcXFxcU10qP1xcXFw/PicgLy8gcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiwgZS5nLiA8P3BocCA/PlxuICAgICsgJ3xePCFbYS16QS1aXStcXFxcc1tcXFxcc1xcXFxTXSo/PicgLy8gZGVjbGFyYXRpb24sIGUuZy4gPCFET0NUWVBFIGh0bWw+XG4gICAgKyAnfF48IVxcXFxbQ0RBVEFcXFxcW1tcXFxcc1xcXFxTXSo/XFxcXF1cXFxcXT4nKSAvLyBDREFUQSBzZWN0aW9uXG4gIC5yZXBsYWNlKCdjb21tZW50JywgX2lubGluZUNvbW1lbnQpXG4gIC5yZXBsYWNlKCdhdHRyaWJ1dGUnLCAvXFxzK1thLXpBLVo6X11bXFx3LjotXSooPzpcXHMqPVxccypcIlteXCJdKlwifFxccyo9XFxzKidbXiddKid8XFxzKj1cXHMqW15cXHNcIic9PD5gXSspPy8pXG4gIC5nZXRSZWdleCgpO1xuXG5jb25zdCBfaW5saW5lTGFiZWwgPSAvKD86XFxbKD86XFxcXFtcXHNcXFNdfFteXFxbXFxdXFxcXF0pKlxcXXxcXFxcW1xcc1xcU118YCsoPyFgKVteYF0qP2ArKD8hYCl8YGArKD89XFxdKXxbXlxcW1xcXVxcXFxgXSkqPy87XG5cbmNvbnN0IGxpbmsgPSBlZGl0KC9eIT9cXFsobGFiZWwpXFxdXFwoXFxzKihocmVmKSg/Oig/OlsgXFx0XSsoPzpcXG5bIFxcdF0qKT98XFxuWyBcXHRdKikodGl0bGUpKT9cXHMqXFwpLylcbiAgLnJlcGxhY2UoJ2xhYmVsJywgX2lubGluZUxhYmVsKVxuICAucmVwbGFjZSgnaHJlZicsIC88KD86XFxcXC58W15cXG48PlxcXFxdKSs+fFteIFxcdFxcblxceDAwLVxceDFmXSovKVxuICAucmVwbGFjZSgndGl0bGUnLCAvXCIoPzpcXFxcXCI/fFteXCJcXFxcXSkqXCJ8Jyg/OlxcXFwnP3xbXidcXFxcXSkqJ3xcXCgoPzpcXFxcXFwpP3xbXilcXFxcXSkqXFwpLylcbiAgLmdldFJlZ2V4KCk7XG5cbmNvbnN0IHJlZmxpbmsgPSBlZGl0KC9eIT9cXFsobGFiZWwpXFxdXFxbKHJlZilcXF0vKVxuICAucmVwbGFjZSgnbGFiZWwnLCBfaW5saW5lTGFiZWwpXG4gIC5yZXBsYWNlKCdyZWYnLCBfYmxvY2tMYWJlbClcbiAgLmdldFJlZ2V4KCk7XG5cbmNvbnN0IG5vbGluayA9IGVkaXQoL14hP1xcWyhyZWYpXFxdKD86XFxbXFxdKT8vKVxuICAucmVwbGFjZSgncmVmJywgX2Jsb2NrTGFiZWwpXG4gIC5nZXRSZWdleCgpO1xuXG5jb25zdCByZWZsaW5rU2VhcmNoID0gZWRpdCgncmVmbGlua3xub2xpbmsoPyFcXFxcKCknLCAnZycpXG4gIC5yZXBsYWNlKCdyZWZsaW5rJywgcmVmbGluaylcbiAgLnJlcGxhY2UoJ25vbGluaycsIG5vbGluaylcbiAgLmdldFJlZ2V4KCk7XG5cbmNvbnN0IF9jYXNlSW5zZW5zaXRpdmVQcm90b2NvbCA9IC9baEhdW3RUXVt0VF1bcFBdW3NTXT98W2ZGXVt0VF1bcFBdLztcblxuLyoqXG4gKiBOb3JtYWwgSW5saW5lIEdyYW1tYXJcbiAqL1xuXG5jb25zdCBpbmxpbmVOb3JtYWwgPSB7XG4gIF9iYWNrcGVkYWw6IG5vb3BUZXN0LCAvLyBvbmx5IHVzZWQgZm9yIEdGTSB1cmxcbiAgYW55UHVuY3R1YXRpb24sXG4gIGF1dG9saW5rLFxuICBibG9ja1NraXAsXG4gIGJyLFxuICBjb2RlOiBpbmxpbmVDb2RlLFxuICBkZWw6IG5vb3BUZXN0LFxuICBkZWxMRGVsaW06IG5vb3BUZXN0LFxuICBkZWxSRGVsaW06IG5vb3BUZXN0LFxuICBlbVN0cm9uZ0xEZWxpbSxcbiAgZW1TdHJvbmdSRGVsaW1Bc3QsXG4gIGVtU3Ryb25nUkRlbGltVW5kLFxuICBlc2NhcGUsXG4gIGxpbmssXG4gIG5vbGluayxcbiAgcHVuY3R1YXRpb24sXG4gIHJlZmxpbmssXG4gIHJlZmxpbmtTZWFyY2gsXG4gIHRhZyxcbiAgdGV4dDogaW5saW5lVGV4dCxcbiAgdXJsOiBub29wVGVzdCxcbn07XG5cbnR5cGUgSW5saW5lS2V5cyA9IGtleW9mIHR5cGVvZiBpbmxpbmVOb3JtYWw7XG5cbi8qKlxuICogUGVkYW50aWMgSW5saW5lIEdyYW1tYXJcbiAqL1xuXG5jb25zdCBpbmxpbmVQZWRhbnRpYzogUmVjb3JkPElubGluZUtleXMsIFJlZ0V4cD4gPSB7XG4gIC4uLmlubGluZU5vcm1hbCxcbiAgbGluazogZWRpdCgvXiE/XFxbKGxhYmVsKVxcXVxcKCguKj8pXFwpLylcbiAgICAucmVwbGFjZSgnbGFiZWwnLCBfaW5saW5lTGFiZWwpXG4gICAgLmdldFJlZ2V4KCksXG4gIHJlZmxpbms6IGVkaXQoL14hP1xcWyhsYWJlbClcXF1cXHMqXFxbKFteXFxdXSopXFxdLylcbiAgICAucmVwbGFjZSgnbGFiZWwnLCBfaW5saW5lTGFiZWwpXG4gICAgLmdldFJlZ2V4KCksXG59O1xuXG4vKipcbiAqIEdGTSBJbmxpbmUgR3JhbW1hclxuICovXG5cbmNvbnN0IGlubGluZUdmbTogUmVjb3JkPElubGluZUtleXMsIFJlZ0V4cD4gPSB7XG4gIC4uLmlubGluZU5vcm1hbCxcbiAgZW1TdHJvbmdSRGVsaW1Bc3Q6IGVtU3Ryb25nUkRlbGltQXN0R2ZtLFxuICBlbVN0cm9uZ0xEZWxpbTogZW1TdHJvbmdMRGVsaW1HZm0sXG4gIGRlbExEZWxpbSxcbiAgZGVsUkRlbGltLFxuICB1cmw6IGVkaXQoL14oKD86cHJvdG9jb2wpOlxcL1xcL3x3d3dcXC4pKD86W2EtekEtWjAtOVxcLV0rXFwuPykrW15cXHM8XSp8XmVtYWlsLylcbiAgICAucmVwbGFjZSgncHJvdG9jb2wnLCBfY2FzZUluc2Vuc2l0aXZlUHJvdG9jb2wpXG4gICAgLnJlcGxhY2UoJ2VtYWlsJywgL1tBLVphLXowLTkuXystXSsoQClbYS16QS1aMC05LV9dKyg/OlxcLlthLXpBLVowLTktX10qW2EtekEtWjAtOV0pKyg/IVstX10pLylcbiAgICAuZ2V0UmVnZXgoKSxcbiAgX2JhY2twZWRhbDogLyg/OltePyEuLDo7Kl8nXCJ+KCkmXSt8XFwoW14pXSpcXCl8Jig/IVthLXpBLVowLTldKzskKXxbPyEuLDo7Kl8nXCJ+KV0rKD8hJCkpKy8sXG4gIGRlbDogL14ofn4/KSg/PVteXFxzfl0pKCg/OlxcXFxbXFxzXFxTXXxbXlxcXFxdKSo/KD86XFxcXFtcXHNcXFNdfFteXFxzflxcXFxdKSlcXDEoPz1bXn5dfCQpLyxcbiAgdGV4dDogZWRpdCgvXihbYH5dK3xbXmB+XSkoPzooPz0gezIsfVxcbil8KD89W2EtekEtWjAtOS4hIyQlJicqK1xcLz0/X2B7XFx8fX4tXStAKXxbXFxzXFxTXSo/KD86KD89W1xcXFw8IVxcW2Aqfl9dfFxcYl98cHJvdG9jb2w6XFwvXFwvfHd3d1xcLnwkKXxbXiBdKD89IHsyLH1cXG4pfFteYS16QS1aMC05LiEjJCUmJyorXFwvPT9fYHtcXHx9fi1dKD89W2EtekEtWjAtOS4hIyQlJicqK1xcLz0/X2B7XFx8fX4tXStAKSkpLylcbiAgICAucmVwbGFjZSgncHJvdG9jb2wnLCBfY2FzZUluc2Vuc2l0aXZlUHJvdG9jb2wpXG4gICAgLmdldFJlZ2V4KCksXG59O1xuXG4vKipcbiAqIEdGTSArIExpbmUgQnJlYWtzIElubGluZSBHcmFtbWFyXG4gKi9cblxuY29uc3QgaW5saW5lQnJlYWtzOiBSZWNvcmQ8SW5saW5lS2V5cywgUmVnRXhwPiA9IHtcbiAgLi4uaW5saW5lR2ZtLFxuICBicjogZWRpdChicikucmVwbGFjZSgnezIsfScsICcqJykuZ2V0UmVnZXgoKSxcbiAgdGV4dDogZWRpdChpbmxpbmVHZm0udGV4dClcbiAgICAucmVwbGFjZSgnXFxcXGJfJywgJ1xcXFxiX3wgezIsfVxcXFxuJylcbiAgICAucmVwbGFjZSgvXFx7MixcXH0vZywgJyonKVxuICAgIC5nZXRSZWdleCgpLFxufTtcblxuLyoqXG4gKiBleHBvcnRzXG4gKi9cblxuZXhwb3J0IGNvbnN0IGJsb2NrID0ge1xuICBub3JtYWw6IGJsb2NrTm9ybWFsLFxuICBnZm06IGJsb2NrR2ZtLFxuICBwZWRhbnRpYzogYmxvY2tQZWRhbnRpYyxcbn07XG5cbmV4cG9ydCBjb25zdCBpbmxpbmUgPSB7XG4gIG5vcm1hbDogaW5saW5lTm9ybWFsLFxuICBnZm06IGlubGluZUdmbSxcbiAgYnJlYWtzOiBpbmxpbmVCcmVha3MsXG4gIHBlZGFudGljOiBpbmxpbmVQZWRhbnRpYyxcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVsZXMge1xuICBvdGhlcjogdHlwZW9mIG90aGVyXG4gIGJsb2NrOiBSZWNvcmQ8QmxvY2tLZXlzLCBSZWdFeHA+XG4gIGlubGluZTogUmVjb3JkPElubGluZUtleXMsIFJlZ0V4cD5cbn1cbiIsICJpbXBvcnQgeyBvdGhlciB9IGZyb20gJy4vcnVsZXMudHMnO1xuXG4vKipcbiAqIEhlbHBlcnNcbiAqL1xuY29uc3QgZXNjYXBlUmVwbGFjZW1lbnRzOiB7IFtpbmRleDogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICcmJzogJyZhbXA7JyxcbiAgJzwnOiAnJmx0OycsXG4gICc+JzogJyZndDsnLFxuICAnXCInOiAnJnF1b3Q7JyxcbiAgXCInXCI6ICcmIzM5OycsXG59O1xuY29uc3QgZ2V0RXNjYXBlUmVwbGFjZW1lbnQgPSAoY2g6IHN0cmluZykgPT4gZXNjYXBlUmVwbGFjZW1lbnRzW2NoXTtcblxuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZUh0bWxFbnRpdGllcyhodG1sOiBzdHJpbmcsIGVuY29kZT86IGJvb2xlYW4pIHtcbiAgaWYgKGVuY29kZSkge1xuICAgIGlmIChvdGhlci5lc2NhcGVUZXN0LnRlc3QoaHRtbCkpIHtcbiAgICAgIHJldHVybiBodG1sLnJlcGxhY2Uob3RoZXIuZXNjYXBlUmVwbGFjZSwgZ2V0RXNjYXBlUmVwbGFjZW1lbnQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAob3RoZXIuZXNjYXBlVGVzdE5vRW5jb2RlLnRlc3QoaHRtbCkpIHtcbiAgICAgIHJldHVybiBodG1sLnJlcGxhY2Uob3RoZXIuZXNjYXBlUmVwbGFjZU5vRW5jb2RlLCBnZXRFc2NhcGVSZXBsYWNlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGh0bWw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhblVybChocmVmOiBzdHJpbmcpIHtcbiAgdHJ5IHtcbiAgICBocmVmID0gZW5jb2RlVVJJKGhyZWYpLnJlcGxhY2Uob3RoZXIucGVyY2VudERlY29kZSwgJyUnKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIGhyZWY7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdENlbGxzKHRhYmxlUm93OiBzdHJpbmcsIGNvdW50PzogbnVtYmVyKSB7XG4gIC8vIGVuc3VyZSB0aGF0IGV2ZXJ5IGNlbGwtZGVsaW1pdGluZyBwaXBlIGhhcyBhIHNwYWNlXG4gIC8vIGJlZm9yZSBpdCB0byBkaXN0aW5ndWlzaCBpdCBmcm9tIGFuIGVzY2FwZWQgcGlwZVxuICBjb25zdCByb3cgPSB0YWJsZVJvdy5yZXBsYWNlKG90aGVyLmZpbmRQaXBlLCAobWF0Y2gsIG9mZnNldCwgc3RyKSA9PiB7XG4gICAgICBsZXQgZXNjYXBlZCA9IGZhbHNlO1xuICAgICAgbGV0IGN1cnIgPSBvZmZzZXQ7XG4gICAgICB3aGlsZSAoLS1jdXJyID49IDAgJiYgc3RyW2N1cnJdID09PSAnXFxcXCcpIGVzY2FwZWQgPSAhZXNjYXBlZDtcbiAgICAgIGlmIChlc2NhcGVkKSB7XG4gICAgICAgIC8vIG9kZCBudW1iZXIgb2Ygc2xhc2hlcyBtZWFucyB8IGlzIGVzY2FwZWRcbiAgICAgICAgLy8gc28gd2UgbGVhdmUgaXQgYWxvbmVcbiAgICAgICAgcmV0dXJuICd8JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGFkZCBzcGFjZSBiZWZvcmUgdW5lc2NhcGVkIHxcbiAgICAgICAgcmV0dXJuICcgfCc7XG4gICAgICB9XG4gICAgfSksXG4gICAgY2VsbHMgPSByb3cuc3BsaXQob3RoZXIuc3BsaXRQaXBlKTtcbiAgbGV0IGkgPSAwO1xuXG4gIC8vIEZpcnN0L2xhc3QgY2VsbCBpbiBhIHJvdyBjYW5ub3QgYmUgZW1wdHkgaWYgaXQgaGFzIG5vIGxlYWRpbmcvdHJhaWxpbmcgcGlwZVxuICBpZiAoIWNlbGxzWzBdLnRyaW0oKSkge1xuICAgIGNlbGxzLnNoaWZ0KCk7XG4gIH1cbiAgaWYgKGNlbGxzLmxlbmd0aCA+IDAgJiYgIWNlbGxzLmF0KC0xKT8udHJpbSgpKSB7XG4gICAgY2VsbHMucG9wKCk7XG4gIH1cblxuICBpZiAoY291bnQpIHtcbiAgICBpZiAoY2VsbHMubGVuZ3RoID4gY291bnQpIHtcbiAgICAgIGNlbGxzLnNwbGljZShjb3VudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdoaWxlIChjZWxscy5sZW5ndGggPCBjb3VudCkgY2VsbHMucHVzaCgnJyk7XG4gICAgfVxuICB9XG5cbiAgZm9yICg7IGkgPCBjZWxscy5sZW5ndGg7IGkrKykge1xuICAgIC8vIGxlYWRpbmcgb3IgdHJhaWxpbmcgd2hpdGVzcGFjZSBpcyBpZ25vcmVkIHBlciB0aGUgZ2ZtIHNwZWNcbiAgICBjZWxsc1tpXSA9IGNlbGxzW2ldLnRyaW0oKS5yZXBsYWNlKG90aGVyLnNsYXNoUGlwZSwgJ3wnKTtcbiAgfVxuICByZXR1cm4gY2VsbHM7XG59XG5cbi8qKlxuICogUmVtb3ZlIHRyYWlsaW5nICdjJ3MuIEVxdWl2YWxlbnQgdG8gc3RyLnJlcGxhY2UoL2MqJC8sICcnKS5cbiAqIC9jKiQvIGlzIHZ1bG5lcmFibGUgdG8gUkVET1MuXG4gKlxuICogQHBhcmFtIHN0clxuICogQHBhcmFtIGNcbiAqIEBwYXJhbSBpbnZlcnQgUmVtb3ZlIHN1ZmZpeCBvZiBub24tYyBjaGFycyBpbnN0ZWFkLiBEZWZhdWx0IGZhbHNleS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ0cmltKHN0cjogc3RyaW5nLCBjOiBzdHJpbmcsIGludmVydD86IGJvb2xlYW4pIHtcbiAgY29uc3QgbCA9IHN0ci5sZW5ndGg7XG4gIGlmIChsID09PSAwKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgLy8gTGVuZ3RoIG9mIHN1ZmZpeCBtYXRjaGluZyB0aGUgaW52ZXJ0IGNvbmRpdGlvbi5cbiAgbGV0IHN1ZmZMZW4gPSAwO1xuXG4gIC8vIFN0ZXAgbGVmdCB1bnRpbCB3ZSBmYWlsIHRvIG1hdGNoIHRoZSBpbnZlcnQgY29uZGl0aW9uLlxuICB3aGlsZSAoc3VmZkxlbiA8IGwpIHtcbiAgICBjb25zdCBjdXJyQ2hhciA9IHN0ci5jaGFyQXQobCAtIHN1ZmZMZW4gLSAxKTtcbiAgICBpZiAoY3VyckNoYXIgPT09IGMgJiYgIWludmVydCkge1xuICAgICAgc3VmZkxlbisrO1xuICAgIH0gZWxzZSBpZiAoY3VyckNoYXIgIT09IGMgJiYgaW52ZXJ0KSB7XG4gICAgICBzdWZmTGVuKys7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdHIuc2xpY2UoMCwgbCAtIHN1ZmZMZW4pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZENsb3NpbmdCcmFja2V0KHN0cjogc3RyaW5nLCBiOiBzdHJpbmcpIHtcbiAgaWYgKHN0ci5pbmRleE9mKGJbMV0pID09PSAtMSkge1xuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIGxldCBsZXZlbCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHN0cltpXSA9PT0gJ1xcXFwnKSB7XG4gICAgICBpKys7XG4gICAgfSBlbHNlIGlmIChzdHJbaV0gPT09IGJbMF0pIHtcbiAgICAgIGxldmVsKys7XG4gICAgfSBlbHNlIGlmIChzdHJbaV0gPT09IGJbMV0pIHtcbiAgICAgIGxldmVsLS07XG4gICAgICBpZiAobGV2ZWwgPCAwKSB7XG4gICAgICAgIHJldHVybiBpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAobGV2ZWwgPiAwKSB7XG4gICAgcmV0dXJuIC0yO1xuICB9XG5cbiAgcmV0dXJuIC0xO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhwYW5kVGFicyhsaW5lOiBzdHJpbmcsIGluZGVudCA9IDApIHtcbiAgbGV0IGNvbCA9IGluZGVudDtcbiAgbGV0IGV4cGFuZGVkID0gJyc7XG4gIGZvciAoY29uc3QgY2hhciBvZiBsaW5lKSB7XG4gICAgaWYgKGNoYXIgPT09ICdcXHQnKSB7XG4gICAgICBjb25zdCBhZGRlZCA9IDQgLSAoY29sICUgNCk7XG4gICAgICBleHBhbmRlZCArPSAnICcucmVwZWF0KGFkZGVkKTtcbiAgICAgIGNvbCArPSBhZGRlZDtcbiAgICB9IGVsc2Uge1xuICAgICAgZXhwYW5kZWQgKz0gY2hhcjtcbiAgICAgIGNvbCsrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBleHBhbmRlZDtcbn1cbiIsICJpbXBvcnQgeyBfZGVmYXVsdHMgfSBmcm9tICcuL2RlZmF1bHRzLnRzJztcbmltcG9ydCB7XG4gIHJ0cmltLFxuICBzcGxpdENlbGxzLFxuICBmaW5kQ2xvc2luZ0JyYWNrZXQsXG4gIGV4cGFuZFRhYnMsXG59IGZyb20gJy4vaGVscGVycy50cyc7XG5pbXBvcnQgdHlwZSB7IFJ1bGVzIH0gZnJvbSAnLi9ydWxlcy50cyc7XG5pbXBvcnQgdHlwZSB7IF9MZXhlciB9IGZyb20gJy4vTGV4ZXIudHMnO1xuaW1wb3J0IHR5cGUgeyBMaW5rcywgVG9rZW5zLCBUb2tlbiB9IGZyb20gJy4vVG9rZW5zLnRzJztcbmltcG9ydCB0eXBlIHsgTWFya2VkT3B0aW9ucyB9IGZyb20gJy4vTWFya2VkT3B0aW9ucy50cyc7XG5cbmZ1bmN0aW9uIG91dHB1dExpbmsoY2FwOiBzdHJpbmdbXSwgbGluazogUGljazxUb2tlbnMuTGluaywgJ2hyZWYnIHwgJ3RpdGxlJz4sIHJhdzogc3RyaW5nLCBsZXhlcjogX0xleGVyLCBydWxlczogUnVsZXMpOiBUb2tlbnMuTGluayB8IFRva2Vucy5JbWFnZSB7XG4gIGNvbnN0IGhyZWYgPSBsaW5rLmhyZWY7XG4gIGNvbnN0IHRpdGxlID0gbGluay50aXRsZSB8fCBudWxsO1xuICBjb25zdCB0ZXh0ID0gY2FwWzFdLnJlcGxhY2UocnVsZXMub3RoZXIub3V0cHV0TGlua1JlcGxhY2UsICckMScpO1xuXG4gIGxleGVyLnN0YXRlLmluTGluayA9IHRydWU7XG4gIGNvbnN0IHRva2VuOiBUb2tlbnMuTGluayB8IFRva2Vucy5JbWFnZSA9IHtcbiAgICB0eXBlOiBjYXBbMF0uY2hhckF0KDApID09PSAnIScgPyAnaW1hZ2UnIDogJ2xpbmsnLFxuICAgIHJhdyxcbiAgICBocmVmLFxuICAgIHRpdGxlLFxuICAgIHRleHQsXG4gICAgdG9rZW5zOiBsZXhlci5pbmxpbmVUb2tlbnModGV4dCksXG4gIH07XG4gIGxleGVyLnN0YXRlLmluTGluayA9IGZhbHNlO1xuICByZXR1cm4gdG9rZW47XG59XG5cbmZ1bmN0aW9uIGluZGVudENvZGVDb21wZW5zYXRpb24ocmF3OiBzdHJpbmcsIHRleHQ6IHN0cmluZywgcnVsZXM6IFJ1bGVzKSB7XG4gIGNvbnN0IG1hdGNoSW5kZW50VG9Db2RlID0gcmF3Lm1hdGNoKHJ1bGVzLm90aGVyLmluZGVudENvZGVDb21wZW5zYXRpb24pO1xuXG4gIGlmIChtYXRjaEluZGVudFRvQ29kZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiB0ZXh0O1xuICB9XG5cbiAgY29uc3QgaW5kZW50VG9Db2RlID0gbWF0Y2hJbmRlbnRUb0NvZGVbMV07XG5cbiAgcmV0dXJuIHRleHRcbiAgICAuc3BsaXQoJ1xcbicpXG4gICAgLm1hcChub2RlID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoSW5kZW50SW5Ob2RlID0gbm9kZS5tYXRjaChydWxlcy5vdGhlci5iZWdpbm5pbmdTcGFjZSk7XG4gICAgICBpZiAobWF0Y2hJbmRlbnRJbk5vZGUgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IFtpbmRlbnRJbk5vZGVdID0gbWF0Y2hJbmRlbnRJbk5vZGU7XG5cbiAgICAgIGlmIChpbmRlbnRJbk5vZGUubGVuZ3RoID49IGluZGVudFRvQ29kZS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUuc2xpY2UoaW5kZW50VG9Db2RlLmxlbmd0aCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBub2RlO1xuICAgIH0pXG4gICAgLmpvaW4oJ1xcbicpO1xufVxuXG4vKipcbiAqIFRva2VuaXplclxuICovXG5leHBvcnQgY2xhc3MgX1Rva2VuaXplcjxQYXJzZXJPdXRwdXQgPSBzdHJpbmcsIFJlbmRlcmVyT3V0cHV0ID0gc3RyaW5nPiB7XG4gIG9wdGlvbnM6IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD47XG4gIHJ1bGVzITogUnVsZXM7IC8vIHNldCBieSB0aGUgbGV4ZXJcbiAgbGV4ZXIhOiBfTGV4ZXI8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD47IC8vIHNldCBieSB0aGUgbGV4ZXJcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zPzogTWFya2VkT3B0aW9uczxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0Pikge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwgX2RlZmF1bHRzO1xuICB9XG5cbiAgc3BhY2Uoc3JjOiBzdHJpbmcpOiBUb2tlbnMuU3BhY2UgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuYmxvY2submV3bGluZS5leGVjKHNyYyk7XG4gICAgaWYgKGNhcCAmJiBjYXBbMF0ubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ3NwYWNlJyxcbiAgICAgICAgcmF3OiBjYXBbMF0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGNvZGUoc3JjOiBzdHJpbmcpOiBUb2tlbnMuQ29kZSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5ibG9jay5jb2RlLmV4ZWMoc3JjKTtcbiAgICBpZiAoY2FwKSB7XG4gICAgICBjb25zdCB0ZXh0ID0gY2FwWzBdLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5jb2RlUmVtb3ZlSW5kZW50LCAnJyk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAnY29kZScsXG4gICAgICAgIHJhdzogY2FwWzBdLFxuICAgICAgICBjb2RlQmxvY2tTdHlsZTogJ2luZGVudGVkJyxcbiAgICAgICAgdGV4dDogIXRoaXMub3B0aW9ucy5wZWRhbnRpY1xuICAgICAgICAgID8gcnRyaW0odGV4dCwgJ1xcbicpXG4gICAgICAgICAgOiB0ZXh0LFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBmZW5jZXMoc3JjOiBzdHJpbmcpOiBUb2tlbnMuQ29kZSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5ibG9jay5mZW5jZXMuZXhlYyhzcmMpO1xuICAgIGlmIChjYXApIHtcbiAgICAgIGNvbnN0IHJhdyA9IGNhcFswXTtcbiAgICAgIGNvbnN0IHRleHQgPSBpbmRlbnRDb2RlQ29tcGVuc2F0aW9uKHJhdywgY2FwWzNdIHx8ICcnLCB0aGlzLnJ1bGVzKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ2NvZGUnLFxuICAgICAgICByYXcsXG4gICAgICAgIGxhbmc6IGNhcFsyXSA/IGNhcFsyXS50cmltKCkucmVwbGFjZSh0aGlzLnJ1bGVzLmlubGluZS5hbnlQdW5jdHVhdGlvbiwgJyQxJykgOiBjYXBbMl0sXG4gICAgICAgIHRleHQsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGhlYWRpbmcoc3JjOiBzdHJpbmcpOiBUb2tlbnMuSGVhZGluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5ibG9jay5oZWFkaW5nLmV4ZWMoc3JjKTtcbiAgICBpZiAoY2FwKSB7XG4gICAgICBsZXQgdGV4dCA9IGNhcFsyXS50cmltKCk7XG5cbiAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyAjc1xuICAgICAgaWYgKHRoaXMucnVsZXMub3RoZXIuZW5kaW5nSGFzaC50ZXN0KHRleHQpKSB7XG4gICAgICAgIGNvbnN0IHRyaW1tZWQgPSBydHJpbSh0ZXh0LCAnIycpO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnBlZGFudGljKSB7XG4gICAgICAgICAgdGV4dCA9IHRyaW1tZWQudHJpbSgpO1xuICAgICAgICB9IGVsc2UgaWYgKCF0cmltbWVkIHx8IHRoaXMucnVsZXMub3RoZXIuZW5kaW5nU3BhY2VDaGFyLnRlc3QodHJpbW1lZCkpIHtcbiAgICAgICAgICAvLyBDb21tb25NYXJrIHJlcXVpcmVzIHNwYWNlIGJlZm9yZSB0cmFpbGluZyAjc1xuICAgICAgICAgIHRleHQgPSB0cmltbWVkLnRyaW0oKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAnaGVhZGluZycsXG4gICAgICAgIHJhdzogY2FwWzBdLFxuICAgICAgICBkZXB0aDogY2FwWzFdLmxlbmd0aCxcbiAgICAgICAgdGV4dCxcbiAgICAgICAgdG9rZW5zOiB0aGlzLmxleGVyLmlubGluZSh0ZXh0KSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgaHIoc3JjOiBzdHJpbmcpOiBUb2tlbnMuSHIgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuYmxvY2suaHIuZXhlYyhzcmMpO1xuICAgIGlmIChjYXApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdocicsXG4gICAgICAgIHJhdzogcnRyaW0oY2FwWzBdLCAnXFxuJyksXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGJsb2NrcXVvdGUoc3JjOiBzdHJpbmcpOiBUb2tlbnMuQmxvY2txdW90ZSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5ibG9jay5ibG9ja3F1b3RlLmV4ZWMoc3JjKTtcbiAgICBpZiAoY2FwKSB7XG4gICAgICBsZXQgbGluZXMgPSBydHJpbShjYXBbMF0sICdcXG4nKS5zcGxpdCgnXFxuJyk7XG4gICAgICBsZXQgcmF3ID0gJyc7XG4gICAgICBsZXQgdGV4dCA9ICcnO1xuICAgICAgY29uc3QgdG9rZW5zOiBUb2tlbltdID0gW107XG5cbiAgICAgIHdoaWxlIChsaW5lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxldCBpbkJsb2NrcXVvdGUgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgY3VycmVudExpbmVzID0gW107XG5cbiAgICAgICAgbGV0IGk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIC8vIGdldCBsaW5lcyB1cCB0byBhIGNvbnRpbnVhdGlvblxuICAgICAgICAgIGlmICh0aGlzLnJ1bGVzLm90aGVyLmJsb2NrcXVvdGVTdGFydC50ZXN0KGxpbmVzW2ldKSkge1xuICAgICAgICAgICAgY3VycmVudExpbmVzLnB1c2gobGluZXNbaV0pO1xuICAgICAgICAgICAgaW5CbG9ja3F1b3RlID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCFpbkJsb2NrcXVvdGUpIHtcbiAgICAgICAgICAgIGN1cnJlbnRMaW5lcy5wdXNoKGxpbmVzW2ldKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxpbmVzID0gbGluZXMuc2xpY2UoaSk7XG5cbiAgICAgICAgY29uc3QgY3VycmVudFJhdyA9IGN1cnJlbnRMaW5lcy5qb2luKCdcXG4nKTtcbiAgICAgICAgY29uc3QgY3VycmVudFRleHQgPSBjdXJyZW50UmF3XG4gICAgICAgICAgLy8gcHJlY2VkZSBzZXRleHQgY29udGludWF0aW9uIHdpdGggNCBzcGFjZXMgc28gaXQgaXNuJ3QgYSBzZXRleHRcbiAgICAgICAgICAucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLmJsb2NrcXVvdGVTZXRleHRSZXBsYWNlLCAnXFxuICAgICQxJylcbiAgICAgICAgICAucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLmJsb2NrcXVvdGVTZXRleHRSZXBsYWNlMiwgJycpO1xuICAgICAgICByYXcgPSByYXcgPyBgJHtyYXd9XFxuJHtjdXJyZW50UmF3fWAgOiBjdXJyZW50UmF3O1xuICAgICAgICB0ZXh0ID0gdGV4dCA/IGAke3RleHR9XFxuJHtjdXJyZW50VGV4dH1gIDogY3VycmVudFRleHQ7XG5cbiAgICAgICAgLy8gcGFyc2UgYmxvY2txdW90ZSBsaW5lcyBhcyB0b3AgbGV2ZWwgdG9rZW5zXG4gICAgICAgIC8vIG1lcmdlIHBhcmFncmFwaHMgaWYgdGhpcyBpcyBhIGNvbnRpbnVhdGlvblxuICAgICAgICBjb25zdCB0b3AgPSB0aGlzLmxleGVyLnN0YXRlLnRvcDtcbiAgICAgICAgdGhpcy5sZXhlci5zdGF0ZS50b3AgPSB0cnVlO1xuICAgICAgICB0aGlzLmxleGVyLmJsb2NrVG9rZW5zKGN1cnJlbnRUZXh0LCB0b2tlbnMsIHRydWUpO1xuICAgICAgICB0aGlzLmxleGVyLnN0YXRlLnRvcCA9IHRvcDtcblxuICAgICAgICAvLyBpZiB0aGVyZSBpcyBubyBjb250aW51YXRpb24gdGhlbiB3ZSBhcmUgZG9uZVxuICAgICAgICBpZiAobGluZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsYXN0VG9rZW4gPSB0b2tlbnMuYXQoLTEpO1xuXG4gICAgICAgIGlmIChsYXN0VG9rZW4/LnR5cGUgPT09ICdjb2RlJykge1xuICAgICAgICAgIC8vIGJsb2NrcXVvdGUgY29udGludWF0aW9uIGNhbm5vdCBiZSBwcmVjZWRlZCBieSBhIGNvZGUgYmxvY2tcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBlbHNlIGlmIChsYXN0VG9rZW4/LnR5cGUgPT09ICdibG9ja3F1b3RlJykge1xuICAgICAgICAgIC8vIGluY2x1ZGUgY29udGludWF0aW9uIGluIG5lc3RlZCBibG9ja3F1b3RlXG4gICAgICAgICAgY29uc3Qgb2xkVG9rZW4gPSBsYXN0VG9rZW4gYXMgVG9rZW5zLkJsb2NrcXVvdGU7XG4gICAgICAgICAgY29uc3QgbmV3VGV4dCA9IG9sZFRva2VuLnJhdyArICdcXG4nICsgbGluZXMuam9pbignXFxuJyk7XG4gICAgICAgICAgY29uc3QgbmV3VG9rZW4gPSB0aGlzLmJsb2NrcXVvdGUobmV3VGV4dCkhO1xuICAgICAgICAgIHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV0gPSBuZXdUb2tlbjtcblxuICAgICAgICAgIHJhdyA9IHJhdy5zdWJzdHJpbmcoMCwgcmF3Lmxlbmd0aCAtIG9sZFRva2VuLnJhdy5sZW5ndGgpICsgbmV3VG9rZW4ucmF3O1xuICAgICAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cmluZygwLCB0ZXh0Lmxlbmd0aCAtIG9sZFRva2VuLnRleHQubGVuZ3RoKSArIG5ld1Rva2VuLnRleHQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSBpZiAobGFzdFRva2VuPy50eXBlID09PSAnbGlzdCcpIHtcbiAgICAgICAgICAvLyBpbmNsdWRlIGNvbnRpbnVhdGlvbiBpbiBuZXN0ZWQgbGlzdFxuICAgICAgICAgIGNvbnN0IG9sZFRva2VuID0gbGFzdFRva2VuIGFzIFRva2Vucy5MaXN0O1xuICAgICAgICAgIGNvbnN0IG5ld1RleHQgPSBvbGRUb2tlbi5yYXcgKyAnXFxuJyArIGxpbmVzLmpvaW4oJ1xcbicpO1xuICAgICAgICAgIGNvbnN0IG5ld1Rva2VuID0gdGhpcy5saXN0KG5ld1RleHQpITtcbiAgICAgICAgICB0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdID0gbmV3VG9rZW47XG5cbiAgICAgICAgICByYXcgPSByYXcuc3Vic3RyaW5nKDAsIHJhdy5sZW5ndGggLSBsYXN0VG9rZW4ucmF3Lmxlbmd0aCkgKyBuZXdUb2tlbi5yYXc7XG4gICAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIHRleHQubGVuZ3RoIC0gb2xkVG9rZW4ucmF3Lmxlbmd0aCkgKyBuZXdUb2tlbi5yYXc7XG4gICAgICAgICAgbGluZXMgPSBuZXdUZXh0LnN1YnN0cmluZyh0b2tlbnMuYXQoLTEpIS5yYXcubGVuZ3RoKS5zcGxpdCgnXFxuJyk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ2Jsb2NrcXVvdGUnLFxuICAgICAgICByYXcsXG4gICAgICAgIHRva2VucyxcbiAgICAgICAgdGV4dCxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgbGlzdChzcmM6IHN0cmluZyk6IFRva2Vucy5MaXN0IHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgY2FwID0gdGhpcy5ydWxlcy5ibG9jay5saXN0LmV4ZWMoc3JjKTtcbiAgICBpZiAoY2FwKSB7XG4gICAgICBsZXQgYnVsbCA9IGNhcFsxXS50cmltKCk7XG4gICAgICBjb25zdCBpc29yZGVyZWQgPSBidWxsLmxlbmd0aCA+IDE7XG5cbiAgICAgIGNvbnN0IGxpc3Q6IFRva2Vucy5MaXN0ID0ge1xuICAgICAgICB0eXBlOiAnbGlzdCcsXG4gICAgICAgIHJhdzogJycsXG4gICAgICAgIG9yZGVyZWQ6IGlzb3JkZXJlZCxcbiAgICAgICAgc3RhcnQ6IGlzb3JkZXJlZCA/ICtidWxsLnNsaWNlKDAsIC0xKSA6ICcnLFxuICAgICAgICBsb29zZTogZmFsc2UsXG4gICAgICAgIGl0ZW1zOiBbXSxcbiAgICAgIH07XG5cbiAgICAgIGJ1bGwgPSBpc29yZGVyZWQgPyBgXFxcXGR7MSw5fVxcXFwke2J1bGwuc2xpY2UoLTEpfWAgOiBgXFxcXCR7YnVsbH1gO1xuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLnBlZGFudGljKSB7XG4gICAgICAgIGJ1bGwgPSBpc29yZGVyZWQgPyBidWxsIDogJ1sqKy1dJztcbiAgICAgIH1cblxuICAgICAgLy8gR2V0IG5leHQgbGlzdCBpdGVtXG4gICAgICBjb25zdCBpdGVtUmVnZXggPSB0aGlzLnJ1bGVzLm90aGVyLmxpc3RJdGVtUmVnZXgoYnVsbCk7XG4gICAgICBsZXQgZW5kc1dpdGhCbGFua0xpbmUgPSBmYWxzZTtcbiAgICAgIC8vIENoZWNrIGlmIGN1cnJlbnQgYnVsbGV0IHBvaW50IGNhbiBzdGFydCBhIG5ldyBMaXN0IEl0ZW1cbiAgICAgIHdoaWxlIChzcmMpIHtcbiAgICAgICAgbGV0IGVuZEVhcmx5ID0gZmFsc2U7XG4gICAgICAgIGxldCByYXcgPSAnJztcbiAgICAgICAgbGV0IGl0ZW1Db250ZW50cyA9ICcnO1xuICAgICAgICBpZiAoIShjYXAgPSBpdGVtUmVnZXguZXhlYyhzcmMpKSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucnVsZXMuYmxvY2suaHIudGVzdChzcmMpKSB7IC8vIEVuZCBsaXN0IGlmIGJ1bGxldCB3YXMgYWN0dWFsbHkgSFIgKHBvc3NpYmx5IG1vdmUgaW50byBpdGVtUmVnZXg/KVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmF3ID0gY2FwWzBdO1xuICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHJhdy5sZW5ndGgpO1xuXG4gICAgICAgIGxldCBsaW5lID0gZXhwYW5kVGFicyhjYXBbMl0uc3BsaXQoJ1xcbicsIDEpWzBdLCBjYXBbMV0ubGVuZ3RoKTtcbiAgICAgICAgbGV0IG5leHRMaW5lID0gc3JjLnNwbGl0KCdcXG4nLCAxKVswXTtcbiAgICAgICAgbGV0IGJsYW5rTGluZSA9ICFsaW5lLnRyaW0oKTtcblxuICAgICAgICBsZXQgaW5kZW50ID0gMDtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5wZWRhbnRpYykge1xuICAgICAgICAgIGluZGVudCA9IDI7XG4gICAgICAgICAgaXRlbUNvbnRlbnRzID0gbGluZS50cmltU3RhcnQoKTtcbiAgICAgICAgfSBlbHNlIGlmIChibGFua0xpbmUpIHtcbiAgICAgICAgICBpbmRlbnQgPSBjYXBbMV0ubGVuZ3RoICsgMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpbmRlbnQgPSBsaW5lLnNlYXJjaCh0aGlzLnJ1bGVzLm90aGVyLm5vblNwYWNlQ2hhcik7IC8vIEZpbmQgZmlyc3Qgbm9uLXNwYWNlIGNoYXJcbiAgICAgICAgICBpbmRlbnQgPSBpbmRlbnQgPiA0ID8gMSA6IGluZGVudDsgLy8gVHJlYXQgaW5kZW50ZWQgY29kZSBibG9ja3MgKD4gNCBzcGFjZXMpIGFzIGhhdmluZyBvbmx5IDEgaW5kZW50XG4gICAgICAgICAgaXRlbUNvbnRlbnRzID0gbGluZS5zbGljZShpbmRlbnQpO1xuICAgICAgICAgIGluZGVudCArPSBjYXBbMV0ubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJsYW5rTGluZSAmJiB0aGlzLnJ1bGVzLm90aGVyLmJsYW5rTGluZS50ZXN0KG5leHRMaW5lKSkgeyAvLyBJdGVtcyBiZWdpbiB3aXRoIGF0IG1vc3Qgb25lIGJsYW5rIGxpbmVcbiAgICAgICAgICByYXcgKz0gbmV4dExpbmUgKyAnXFxuJztcbiAgICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKG5leHRMaW5lLmxlbmd0aCArIDEpO1xuICAgICAgICAgIGVuZEVhcmx5ID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZW5kRWFybHkpIHtcbiAgICAgICAgICBjb25zdCBuZXh0QnVsbGV0UmVnZXggPSB0aGlzLnJ1bGVzLm90aGVyLm5leHRCdWxsZXRSZWdleChpbmRlbnQpO1xuICAgICAgICAgIGNvbnN0IGhyUmVnZXggPSB0aGlzLnJ1bGVzLm90aGVyLmhyUmVnZXgoaW5kZW50KTtcbiAgICAgICAgICBjb25zdCBmZW5jZXNCZWdpblJlZ2V4ID0gdGhpcy5ydWxlcy5vdGhlci5mZW5jZXNCZWdpblJlZ2V4KGluZGVudCk7XG4gICAgICAgICAgY29uc3QgaGVhZGluZ0JlZ2luUmVnZXggPSB0aGlzLnJ1bGVzLm90aGVyLmhlYWRpbmdCZWdpblJlZ2V4KGluZGVudCk7XG4gICAgICAgICAgY29uc3QgaHRtbEJlZ2luUmVnZXggPSB0aGlzLnJ1bGVzLm90aGVyLmh0bWxCZWdpblJlZ2V4KGluZGVudCk7XG4gICAgICAgICAgY29uc3QgYmxvY2txdW90ZUJlZ2luUmVnZXggPSB0aGlzLnJ1bGVzLm90aGVyLmJsb2NrcXVvdGVCZWdpblJlZ2V4KGluZGVudCk7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiBmb2xsb3dpbmcgbGluZXMgc2hvdWxkIGJlIGluY2x1ZGVkIGluIExpc3QgSXRlbVxuICAgICAgICAgIHdoaWxlIChzcmMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJhd0xpbmUgPSBzcmMuc3BsaXQoJ1xcbicsIDEpWzBdO1xuICAgICAgICAgICAgbGV0IG5leHRMaW5lV2l0aG91dFRhYnM7XG4gICAgICAgICAgICBuZXh0TGluZSA9IHJhd0xpbmU7XG5cbiAgICAgICAgICAgIC8vIFJlLWFsaWduIHRvIGZvbGxvdyBjb21tb25tYXJrIG5lc3RpbmcgcnVsZXNcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucGVkYW50aWMpIHtcbiAgICAgICAgICAgICAgbmV4dExpbmUgPSBuZXh0TGluZS5yZXBsYWNlKHRoaXMucnVsZXMub3RoZXIubGlzdFJlcGxhY2VOZXN0aW5nLCAnICAnKTtcbiAgICAgICAgICAgICAgbmV4dExpbmVXaXRob3V0VGFicyA9IG5leHRMaW5lO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbmV4dExpbmVXaXRob3V0VGFicyA9IG5leHRMaW5lLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci50YWJDaGFyR2xvYmFsLCAnICAgICcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBFbmQgbGlzdCBpdGVtIGlmIGZvdW5kIGNvZGUgZmVuY2VzXG4gICAgICAgICAgICBpZiAoZmVuY2VzQmVnaW5SZWdleC50ZXN0KG5leHRMaW5lKSkge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRW5kIGxpc3QgaXRlbSBpZiBmb3VuZCBzdGFydCBvZiBuZXcgaGVhZGluZ1xuICAgICAgICAgICAgaWYgKGhlYWRpbmdCZWdpblJlZ2V4LnRlc3QobmV4dExpbmUpKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBFbmQgbGlzdCBpdGVtIGlmIGZvdW5kIHN0YXJ0IG9mIGh0bWwgYmxvY2tcbiAgICAgICAgICAgIGlmIChodG1sQmVnaW5SZWdleC50ZXN0KG5leHRMaW5lKSkge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRW5kIGxpc3QgaXRlbSBpZiBmb3VuZCBzdGFydCBvZiBibG9ja3F1b3RlXG4gICAgICAgICAgICBpZiAoYmxvY2txdW90ZUJlZ2luUmVnZXgudGVzdChuZXh0TGluZSkpIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEVuZCBsaXN0IGl0ZW0gaWYgZm91bmQgc3RhcnQgb2YgbmV3IGJ1bGxldFxuICAgICAgICAgICAgaWYgKG5leHRCdWxsZXRSZWdleC50ZXN0KG5leHRMaW5lKSkge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSG9yaXpvbnRhbCBydWxlIGZvdW5kXG4gICAgICAgICAgICBpZiAoaHJSZWdleC50ZXN0KG5leHRMaW5lKSkge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG5leHRMaW5lV2l0aG91dFRhYnMuc2VhcmNoKHRoaXMucnVsZXMub3RoZXIubm9uU3BhY2VDaGFyKSA+PSBpbmRlbnQgfHwgIW5leHRMaW5lLnRyaW0oKSkgeyAvLyBEZWRlbnQgaWYgcG9zc2libGVcbiAgICAgICAgICAgICAgaXRlbUNvbnRlbnRzICs9ICdcXG4nICsgbmV4dExpbmVXaXRob3V0VGFicy5zbGljZShpbmRlbnQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gbm90IGVub3VnaCBpbmRlbnRhdGlvblxuICAgICAgICAgICAgICBpZiAoYmxhbmtMaW5lKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBwYXJhZ3JhcGggY29udGludWF0aW9uIHVubGVzcyBsYXN0IGxpbmUgd2FzIGEgZGlmZmVyZW50IGJsb2NrIGxldmVsIGVsZW1lbnRcbiAgICAgICAgICAgICAgaWYgKGxpbmUucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLnRhYkNoYXJHbG9iYWwsICcgICAgJykuc2VhcmNoKHRoaXMucnVsZXMub3RoZXIubm9uU3BhY2VDaGFyKSA+PSA0KSB7IC8vIGluZGVudGVkIGNvZGUgYmxvY2tcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoZmVuY2VzQmVnaW5SZWdleC50ZXN0KGxpbmUpKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGhlYWRpbmdCZWdpblJlZ2V4LnRlc3QobGluZSkpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoaHJSZWdleC50ZXN0KGxpbmUpKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpdGVtQ29udGVudHMgKz0gJ1xcbicgKyBuZXh0TGluZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYmxhbmtMaW5lID0gIW5leHRMaW5lLnRyaW0oKTtcblxuICAgICAgICAgICAgcmF3ICs9IHJhd0xpbmUgKyAnXFxuJztcbiAgICAgICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcocmF3TGluZS5sZW5ndGggKyAxKTtcbiAgICAgICAgICAgIGxpbmUgPSBuZXh0TGluZVdpdGhvdXRUYWJzLnNsaWNlKGluZGVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFsaXN0Lmxvb3NlKSB7XG4gICAgICAgICAgLy8gSWYgdGhlIHByZXZpb3VzIGl0ZW0gZW5kZWQgd2l0aCBhIGJsYW5rIGxpbmUsIHRoZSBsaXN0IGlzIGxvb3NlXG4gICAgICAgICAgaWYgKGVuZHNXaXRoQmxhbmtMaW5lKSB7XG4gICAgICAgICAgICBsaXN0Lmxvb3NlID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucnVsZXMub3RoZXIuZG91YmxlQmxhbmtMaW5lLnRlc3QocmF3KSkge1xuICAgICAgICAgICAgZW5kc1dpdGhCbGFua0xpbmUgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxpc3QuaXRlbXMucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ2xpc3RfaXRlbScsXG4gICAgICAgICAgcmF3LFxuICAgICAgICAgIHRhc2s6ICEhdGhpcy5vcHRpb25zLmdmbSAmJiB0aGlzLnJ1bGVzLm90aGVyLmxpc3RJc1Rhc2sudGVzdChpdGVtQ29udGVudHMpLFxuICAgICAgICAgIGxvb3NlOiBmYWxzZSxcbiAgICAgICAgICB0ZXh0OiBpdGVtQ29udGVudHMsXG4gICAgICAgICAgdG9rZW5zOiBbXSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgbGlzdC5yYXcgKz0gcmF3O1xuICAgICAgfVxuXG4gICAgICAvLyBEbyBub3QgY29uc3VtZSBuZXdsaW5lcyBhdCBlbmQgb2YgZmluYWwgaXRlbS4gQWx0ZXJuYXRpdmVseSwgbWFrZSBpdGVtUmVnZXggKnN0YXJ0KiB3aXRoIGFueSBuZXdsaW5lcyB0byBzaW1wbGlmeS9zcGVlZCB1cCBlbmRzV2l0aEJsYW5rTGluZSBsb2dpY1xuICAgICAgY29uc3QgbGFzdEl0ZW0gPSBsaXN0Lml0ZW1zLmF0KC0xKTtcbiAgICAgIGlmIChsYXN0SXRlbSkge1xuICAgICAgICBsYXN0SXRlbS5yYXcgPSBsYXN0SXRlbS5yYXcudHJpbUVuZCgpO1xuICAgICAgICBsYXN0SXRlbS50ZXh0ID0gbGFzdEl0ZW0udGV4dC50cmltRW5kKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBub3QgYSBsaXN0IHNpbmNlIHRoZXJlIHdlcmUgbm8gaXRlbXNcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbGlzdC5yYXcgPSBsaXN0LnJhdy50cmltRW5kKCk7XG5cbiAgICAgIC8vIEl0ZW0gY2hpbGQgdG9rZW5zIGhhbmRsZWQgaGVyZSBhdCBlbmQgYmVjYXVzZSB3ZSBuZWVkZWQgdG8gaGF2ZSB0aGUgZmluYWwgaXRlbSB0byB0cmltIGl0IGZpcnN0XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbGlzdC5pdGVtcykge1xuICAgICAgICB0aGlzLmxleGVyLnN0YXRlLnRvcCA9IGZhbHNlO1xuICAgICAgICBpdGVtLnRva2VucyA9IHRoaXMubGV4ZXIuYmxvY2tUb2tlbnMoaXRlbS50ZXh0LCBbXSk7XG4gICAgICAgIGlmIChpdGVtLnRhc2spIHtcbiAgICAgICAgICAvLyBSZW1vdmUgY2hlY2tib3ggbWFya2Rvd24gZnJvbSBpdGVtIHRva2Vuc1xuICAgICAgICAgIGl0ZW0udGV4dCA9IGl0ZW0udGV4dC5yZXBsYWNlKHRoaXMucnVsZXMub3RoZXIubGlzdFJlcGxhY2VUYXNrLCAnJyk7XG4gICAgICAgICAgaWYgKGl0ZW0udG9rZW5zWzBdPy50eXBlID09PSAndGV4dCcgfHwgaXRlbS50b2tlbnNbMF0/LnR5cGUgPT09ICdwYXJhZ3JhcGgnKSB7XG4gICAgICAgICAgICBpdGVtLnRva2Vuc1swXS5yYXcgPSBpdGVtLnRva2Vuc1swXS5yYXcucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLmxpc3RSZXBsYWNlVGFzaywgJycpO1xuICAgICAgICAgICAgaXRlbS50b2tlbnNbMF0udGV4dCA9IGl0ZW0udG9rZW5zWzBdLnRleHQucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLmxpc3RSZXBsYWNlVGFzaywgJycpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMubGV4ZXIuaW5saW5lUXVldWUubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMucnVsZXMub3RoZXIubGlzdElzVGFzay50ZXN0KHRoaXMubGV4ZXIuaW5saW5lUXVldWVbaV0uc3JjKSkge1xuICAgICAgICAgICAgICAgIHRoaXMubGV4ZXIuaW5saW5lUXVldWVbaV0uc3JjID0gdGhpcy5sZXhlci5pbmxpbmVRdWV1ZVtpXS5zcmMucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLmxpc3RSZXBsYWNlVGFzaywgJycpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgdGFza1JhdyA9IHRoaXMucnVsZXMub3RoZXIubGlzdFRhc2tDaGVja2JveC5leGVjKGl0ZW0ucmF3KTtcbiAgICAgICAgICBpZiAodGFza1Jhdykge1xuICAgICAgICAgICAgY29uc3QgY2hlY2tib3hUb2tlbjogVG9rZW5zLkNoZWNrYm94ID0ge1xuICAgICAgICAgICAgICB0eXBlOiAnY2hlY2tib3gnLFxuICAgICAgICAgICAgICByYXc6IHRhc2tSYXdbMF0gKyAnICcsXG4gICAgICAgICAgICAgIGNoZWNrZWQ6IHRhc2tSYXdbMF0gIT09ICdbIF0nLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGl0ZW0uY2hlY2tlZCA9IGNoZWNrYm94VG9rZW4uY2hlY2tlZDtcbiAgICAgICAgICAgIGlmIChsaXN0Lmxvb3NlKSB7XG4gICAgICAgICAgICAgIGlmIChpdGVtLnRva2Vuc1swXSAmJiBbJ3BhcmFncmFwaCcsICd0ZXh0J10uaW5jbHVkZXMoaXRlbS50b2tlbnNbMF0udHlwZSkgJiYgJ3Rva2VucycgaW4gaXRlbS50b2tlbnNbMF0gJiYgaXRlbS50b2tlbnNbMF0udG9rZW5zKSB7XG4gICAgICAgICAgICAgICAgaXRlbS50b2tlbnNbMF0ucmF3ID0gY2hlY2tib3hUb2tlbi5yYXcgKyBpdGVtLnRva2Vuc1swXS5yYXc7XG4gICAgICAgICAgICAgICAgaXRlbS50b2tlbnNbMF0udGV4dCA9IGNoZWNrYm94VG9rZW4ucmF3ICsgaXRlbS50b2tlbnNbMF0udGV4dDtcbiAgICAgICAgICAgICAgICBpdGVtLnRva2Vuc1swXS50b2tlbnMudW5zaGlmdChjaGVja2JveFRva2VuKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpdGVtLnRva2Vucy51bnNoaWZ0KHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6ICdwYXJhZ3JhcGgnLFxuICAgICAgICAgICAgICAgICAgcmF3OiBjaGVja2JveFRva2VuLnJhdyxcbiAgICAgICAgICAgICAgICAgIHRleHQ6IGNoZWNrYm94VG9rZW4ucmF3LFxuICAgICAgICAgICAgICAgICAgdG9rZW5zOiBbY2hlY2tib3hUb2tlbl0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGl0ZW0udG9rZW5zLnVuc2hpZnQoY2hlY2tib3hUb2tlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFsaXN0Lmxvb3NlKSB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgbGlzdCBzaG91bGQgYmUgbG9vc2VcbiAgICAgICAgICBjb25zdCBzcGFjZXJzID0gaXRlbS50b2tlbnMuZmlsdGVyKHQgPT4gdC50eXBlID09PSAnc3BhY2UnKTtcbiAgICAgICAgICBjb25zdCBoYXNNdWx0aXBsZUxpbmVCcmVha3MgPSBzcGFjZXJzLmxlbmd0aCA+IDAgJiYgc3BhY2Vycy5zb21lKHQgPT4gdGhpcy5ydWxlcy5vdGhlci5hbnlMaW5lLnRlc3QodC5yYXcpKTtcblxuICAgICAgICAgIGxpc3QubG9vc2UgPSBoYXNNdWx0aXBsZUxpbmVCcmVha3M7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU2V0IGFsbCBpdGVtcyB0byBsb29zZSBpZiBsaXN0IGlzIGxvb3NlXG4gICAgICBpZiAobGlzdC5sb29zZSkge1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbGlzdC5pdGVtcykge1xuICAgICAgICAgIGl0ZW0ubG9vc2UgPSB0cnVlO1xuICAgICAgICAgIGZvciAoY29uc3QgdG9rZW4gb2YgaXRlbS50b2tlbnMpIHtcbiAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgICAgICAgdG9rZW4udHlwZSA9ICdwYXJhZ3JhcGgnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbGlzdDtcbiAgICB9XG4gIH1cblxuICBodG1sKHNyYzogc3RyaW5nKTogVG9rZW5zLkhUTUwgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuYmxvY2suaHRtbC5leGVjKHNyYyk7XG4gICAgaWYgKGNhcCkge1xuICAgICAgY29uc3QgdG9rZW46IFRva2Vucy5IVE1MID0ge1xuICAgICAgICB0eXBlOiAnaHRtbCcsXG4gICAgICAgIGJsb2NrOiB0cnVlLFxuICAgICAgICByYXc6IGNhcFswXSxcbiAgICAgICAgcHJlOiBjYXBbMV0gPT09ICdwcmUnIHx8IGNhcFsxXSA9PT0gJ3NjcmlwdCcgfHwgY2FwWzFdID09PSAnc3R5bGUnLFxuICAgICAgICB0ZXh0OiBjYXBbMF0sXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHRva2VuO1xuICAgIH1cbiAgfVxuXG4gIGRlZihzcmM6IHN0cmluZyk6IFRva2Vucy5EZWYgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuYmxvY2suZGVmLmV4ZWMoc3JjKTtcbiAgICBpZiAoY2FwKSB7XG4gICAgICBjb25zdCB0YWcgPSBjYXBbMV0udG9Mb3dlckNhc2UoKS5yZXBsYWNlKHRoaXMucnVsZXMub3RoZXIubXVsdGlwbGVTcGFjZUdsb2JhbCwgJyAnKTtcbiAgICAgIGNvbnN0IGhyZWYgPSBjYXBbMl0gPyBjYXBbMl0ucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLmhyZWZCcmFja2V0cywgJyQxJykucmVwbGFjZSh0aGlzLnJ1bGVzLmlubGluZS5hbnlQdW5jdHVhdGlvbiwgJyQxJykgOiAnJztcbiAgICAgIGNvbnN0IHRpdGxlID0gY2FwWzNdID8gY2FwWzNdLnN1YnN0cmluZygxLCBjYXBbM10ubGVuZ3RoIC0gMSkucmVwbGFjZSh0aGlzLnJ1bGVzLmlubGluZS5hbnlQdW5jdHVhdGlvbiwgJyQxJykgOiBjYXBbM107XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAnZGVmJyxcbiAgICAgICAgdGFnLFxuICAgICAgICByYXc6IGNhcFswXSxcbiAgICAgICAgaHJlZixcbiAgICAgICAgdGl0bGUsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHRhYmxlKHNyYzogc3RyaW5nKTogVG9rZW5zLlRhYmxlIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjYXAgPSB0aGlzLnJ1bGVzLmJsb2NrLnRhYmxlLmV4ZWMoc3JjKTtcbiAgICBpZiAoIWNhcCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5ydWxlcy5vdGhlci50YWJsZURlbGltaXRlci50ZXN0KGNhcFsyXSkpIHtcbiAgICAgIC8vIGRlbGltaXRlciByb3cgbXVzdCBoYXZlIGEgcGlwZSAofCkgb3IgY29sb24gKDopIG90aGVyd2lzZSBpdCBpcyBhIHNldGV4dCBoZWFkaW5nXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaGVhZGVycyA9IHNwbGl0Q2VsbHMoY2FwWzFdKTtcbiAgICBjb25zdCBhbGlnbnMgPSBjYXBbMl0ucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLnRhYmxlQWxpZ25DaGFycywgJycpLnNwbGl0KCd8Jyk7XG4gICAgY29uc3Qgcm93cyA9IGNhcFszXT8udHJpbSgpID8gY2FwWzNdLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci50YWJsZVJvd0JsYW5rTGluZSwgJycpLnNwbGl0KCdcXG4nKSA6IFtdO1xuXG4gICAgY29uc3QgaXRlbTogVG9rZW5zLlRhYmxlID0ge1xuICAgICAgdHlwZTogJ3RhYmxlJyxcbiAgICAgIHJhdzogY2FwWzBdLFxuICAgICAgaGVhZGVyOiBbXSxcbiAgICAgIGFsaWduOiBbXSxcbiAgICAgIHJvd3M6IFtdLFxuICAgIH07XG5cbiAgICBpZiAoaGVhZGVycy5sZW5ndGggIT09IGFsaWducy5sZW5ndGgpIHtcbiAgICAgIC8vIGhlYWRlciBhbmQgYWxpZ24gY29sdW1ucyBtdXN0IGJlIGVxdWFsLCByb3dzIGNhbiBiZSBkaWZmZXJlbnQuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBhbGlnbiBvZiBhbGlnbnMpIHtcbiAgICAgIGlmICh0aGlzLnJ1bGVzLm90aGVyLnRhYmxlQWxpZ25SaWdodC50ZXN0KGFsaWduKSkge1xuICAgICAgICBpdGVtLmFsaWduLnB1c2goJ3JpZ2h0Jyk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMucnVsZXMub3RoZXIudGFibGVBbGlnbkNlbnRlci50ZXN0KGFsaWduKSkge1xuICAgICAgICBpdGVtLmFsaWduLnB1c2goJ2NlbnRlcicpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnJ1bGVzLm90aGVyLnRhYmxlQWxpZ25MZWZ0LnRlc3QoYWxpZ24pKSB7XG4gICAgICAgIGl0ZW0uYWxpZ24ucHVzaCgnbGVmdCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXRlbS5hbGlnbi5wdXNoKG51bGwpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVhZGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgaXRlbS5oZWFkZXIucHVzaCh7XG4gICAgICAgIHRleHQ6IGhlYWRlcnNbaV0sXG4gICAgICAgIHRva2VuczogdGhpcy5sZXhlci5pbmxpbmUoaGVhZGVyc1tpXSksXG4gICAgICAgIGhlYWRlcjogdHJ1ZSxcbiAgICAgICAgYWxpZ246IGl0ZW0uYWxpZ25baV0sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICBpdGVtLnJvd3MucHVzaChzcGxpdENlbGxzKHJvdywgaXRlbS5oZWFkZXIubGVuZ3RoKS5tYXAoKGNlbGwsIGkpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0ZXh0OiBjZWxsLFxuICAgICAgICAgIHRva2VuczogdGhpcy5sZXhlci5pbmxpbmUoY2VsbCksXG4gICAgICAgICAgaGVhZGVyOiBmYWxzZSxcbiAgICAgICAgICBhbGlnbjogaXRlbS5hbGlnbltpXSxcbiAgICAgICAgfTtcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXRlbTtcbiAgfVxuXG4gIGxoZWFkaW5nKHNyYzogc3RyaW5nKTogVG9rZW5zLkhlYWRpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuYmxvY2subGhlYWRpbmcuZXhlYyhzcmMpO1xuICAgIGlmIChjYXApIHtcbiAgICAgIGNvbnN0IHRleHQgPSBjYXBbMV0udHJpbSgpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ2hlYWRpbmcnLFxuICAgICAgICByYXc6IGNhcFswXSxcbiAgICAgICAgZGVwdGg6IGNhcFsyXS5jaGFyQXQoMCkgPT09ICc9JyA/IDEgOiAyLFxuICAgICAgICB0ZXh0LFxuICAgICAgICB0b2tlbnM6IHRoaXMubGV4ZXIuaW5saW5lKHRleHQpLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBwYXJhZ3JhcGgoc3JjOiBzdHJpbmcpOiBUb2tlbnMuUGFyYWdyYXBoIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjYXAgPSB0aGlzLnJ1bGVzLmJsb2NrLnBhcmFncmFwaC5leGVjKHNyYyk7XG4gICAgaWYgKGNhcCkge1xuICAgICAgY29uc3QgdGV4dCA9IGNhcFsxXS5jaGFyQXQoY2FwWzFdLmxlbmd0aCAtIDEpID09PSAnXFxuJ1xuICAgICAgICA/IGNhcFsxXS5zbGljZSgwLCAtMSlcbiAgICAgICAgOiBjYXBbMV07XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAncGFyYWdyYXBoJyxcbiAgICAgICAgcmF3OiBjYXBbMF0sXG4gICAgICAgIHRleHQsXG4gICAgICAgIHRva2VuczogdGhpcy5sZXhlci5pbmxpbmUodGV4dCksXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHRleHQoc3JjOiBzdHJpbmcpOiBUb2tlbnMuVGV4dCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5ibG9jay50ZXh0LmV4ZWMoc3JjKTtcbiAgICBpZiAoY2FwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgIHJhdzogY2FwWzBdLFxuICAgICAgICB0ZXh0OiBjYXBbMF0sXG4gICAgICAgIHRva2VuczogdGhpcy5sZXhlci5pbmxpbmUoY2FwWzBdKSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgZXNjYXBlKHNyYzogc3RyaW5nKTogVG9rZW5zLkVzY2FwZSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5pbmxpbmUuZXNjYXBlLmV4ZWMoc3JjKTtcbiAgICBpZiAoY2FwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAnZXNjYXBlJyxcbiAgICAgICAgcmF3OiBjYXBbMF0sXG4gICAgICAgIHRleHQ6IGNhcFsxXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgdGFnKHNyYzogc3RyaW5nKTogVG9rZW5zLlRhZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5pbmxpbmUudGFnLmV4ZWMoc3JjKTtcbiAgICBpZiAoY2FwKSB7XG4gICAgICBpZiAoIXRoaXMubGV4ZXIuc3RhdGUuaW5MaW5rICYmIHRoaXMucnVsZXMub3RoZXIuc3RhcnRBVGFnLnRlc3QoY2FwWzBdKSkge1xuICAgICAgICB0aGlzLmxleGVyLnN0YXRlLmluTGluayA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMubGV4ZXIuc3RhdGUuaW5MaW5rICYmIHRoaXMucnVsZXMub3RoZXIuZW5kQVRhZy50ZXN0KGNhcFswXSkpIHtcbiAgICAgICAgdGhpcy5sZXhlci5zdGF0ZS5pbkxpbmsgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5sZXhlci5zdGF0ZS5pblJhd0Jsb2NrICYmIHRoaXMucnVsZXMub3RoZXIuc3RhcnRQcmVTY3JpcHRUYWcudGVzdChjYXBbMF0pKSB7XG4gICAgICAgIHRoaXMubGV4ZXIuc3RhdGUuaW5SYXdCbG9jayA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMubGV4ZXIuc3RhdGUuaW5SYXdCbG9jayAmJiB0aGlzLnJ1bGVzLm90aGVyLmVuZFByZVNjcmlwdFRhZy50ZXN0KGNhcFswXSkpIHtcbiAgICAgICAgdGhpcy5sZXhlci5zdGF0ZS5pblJhd0Jsb2NrID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdodG1sJyxcbiAgICAgICAgcmF3OiBjYXBbMF0sXG4gICAgICAgIGluTGluazogdGhpcy5sZXhlci5zdGF0ZS5pbkxpbmssXG4gICAgICAgIGluUmF3QmxvY2s6IHRoaXMubGV4ZXIuc3RhdGUuaW5SYXdCbG9jayxcbiAgICAgICAgYmxvY2s6IGZhbHNlLFxuICAgICAgICB0ZXh0OiBjYXBbMF0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGxpbmsoc3JjOiBzdHJpbmcpOiBUb2tlbnMuTGluayB8IFRva2Vucy5JbWFnZSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5pbmxpbmUubGluay5leGVjKHNyYyk7XG4gICAgaWYgKGNhcCkge1xuICAgICAgY29uc3QgdHJpbW1lZFVybCA9IGNhcFsyXS50cmltKCk7XG4gICAgICBpZiAoIXRoaXMub3B0aW9ucy5wZWRhbnRpYyAmJiB0aGlzLnJ1bGVzLm90aGVyLnN0YXJ0QW5nbGVCcmFja2V0LnRlc3QodHJpbW1lZFVybCkpIHtcbiAgICAgICAgLy8gY29tbW9ubWFyayByZXF1aXJlcyBtYXRjaGluZyBhbmdsZSBicmFja2V0c1xuICAgICAgICBpZiAoISh0aGlzLnJ1bGVzLm90aGVyLmVuZEFuZ2xlQnJhY2tldC50ZXN0KHRyaW1tZWRVcmwpKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVuZGluZyBhbmdsZSBicmFja2V0IGNhbm5vdCBiZSBlc2NhcGVkXG4gICAgICAgIGNvbnN0IHJ0cmltU2xhc2ggPSBydHJpbSh0cmltbWVkVXJsLnNsaWNlKDAsIC0xKSwgJ1xcXFwnKTtcbiAgICAgICAgaWYgKCh0cmltbWVkVXJsLmxlbmd0aCAtIHJ0cmltU2xhc2gubGVuZ3RoKSAlIDIgPT09IDApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGZpbmQgY2xvc2luZyBwYXJlbnRoZXNpc1xuICAgICAgICBjb25zdCBsYXN0UGFyZW5JbmRleCA9IGZpbmRDbG9zaW5nQnJhY2tldChjYXBbMl0sICcoKScpO1xuICAgICAgICBpZiAobGFzdFBhcmVuSW5kZXggPT09IC0yKSB7XG4gICAgICAgICAgLy8gbW9yZSBvcGVuIHBhcmVucyB0aGFuIGNsb3NlZFxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsYXN0UGFyZW5JbmRleCA+IC0xKSB7XG4gICAgICAgICAgY29uc3Qgc3RhcnQgPSBjYXBbMF0uaW5kZXhPZignIScpID09PSAwID8gNSA6IDQ7XG4gICAgICAgICAgY29uc3QgbGlua0xlbiA9IHN0YXJ0ICsgY2FwWzFdLmxlbmd0aCArIGxhc3RQYXJlbkluZGV4O1xuICAgICAgICAgIGNhcFsyXSA9IGNhcFsyXS5zdWJzdHJpbmcoMCwgbGFzdFBhcmVuSW5kZXgpO1xuICAgICAgICAgIGNhcFswXSA9IGNhcFswXS5zdWJzdHJpbmcoMCwgbGlua0xlbikudHJpbSgpO1xuICAgICAgICAgIGNhcFszXSA9ICcnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsZXQgaHJlZiA9IGNhcFsyXTtcbiAgICAgIGxldCB0aXRsZSA9ICcnO1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5wZWRhbnRpYykge1xuICAgICAgICAvLyBzcGxpdCBwZWRhbnRpYyBocmVmIGFuZCB0aXRsZVxuICAgICAgICBjb25zdCBsaW5rID0gdGhpcy5ydWxlcy5vdGhlci5wZWRhbnRpY0hyZWZUaXRsZS5leGVjKGhyZWYpO1xuXG4gICAgICAgIGlmIChsaW5rKSB7XG4gICAgICAgICAgaHJlZiA9IGxpbmtbMV07XG4gICAgICAgICAgdGl0bGUgPSBsaW5rWzNdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aXRsZSA9IGNhcFszXSA/IGNhcFszXS5zbGljZSgxLCAtMSkgOiAnJztcbiAgICAgIH1cblxuICAgICAgaHJlZiA9IGhyZWYudHJpbSgpO1xuICAgICAgaWYgKHRoaXMucnVsZXMub3RoZXIuc3RhcnRBbmdsZUJyYWNrZXQudGVzdChocmVmKSkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnBlZGFudGljICYmICEodGhpcy5ydWxlcy5vdGhlci5lbmRBbmdsZUJyYWNrZXQudGVzdCh0cmltbWVkVXJsKSkpIHtcbiAgICAgICAgICAvLyBwZWRhbnRpYyBhbGxvd3Mgc3RhcnRpbmcgYW5nbGUgYnJhY2tldCB3aXRob3V0IGVuZGluZyBhbmdsZSBicmFja2V0XG4gICAgICAgICAgaHJlZiA9IGhyZWYuc2xpY2UoMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaHJlZiA9IGhyZWYuc2xpY2UoMSwgLTEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gb3V0cHV0TGluayhjYXAsIHtcbiAgICAgICAgaHJlZjogaHJlZiA/IGhyZWYucmVwbGFjZSh0aGlzLnJ1bGVzLmlubGluZS5hbnlQdW5jdHVhdGlvbiwgJyQxJykgOiBocmVmLFxuICAgICAgICB0aXRsZTogdGl0bGUgPyB0aXRsZS5yZXBsYWNlKHRoaXMucnVsZXMuaW5saW5lLmFueVB1bmN0dWF0aW9uLCAnJDEnKSA6IHRpdGxlLFxuICAgICAgfSwgY2FwWzBdLCB0aGlzLmxleGVyLCB0aGlzLnJ1bGVzKTtcbiAgICB9XG4gIH1cblxuICByZWZsaW5rKHNyYzogc3RyaW5nLCBsaW5rczogTGlua3MpOiBUb2tlbnMuTGluayB8IFRva2Vucy5JbWFnZSB8IFRva2Vucy5UZXh0IHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgY2FwO1xuICAgIGlmICgoY2FwID0gdGhpcy5ydWxlcy5pbmxpbmUucmVmbGluay5leGVjKHNyYykpXG4gICAgICB8fCAoY2FwID0gdGhpcy5ydWxlcy5pbmxpbmUubm9saW5rLmV4ZWMoc3JjKSkpIHtcbiAgICAgIGNvbnN0IGxpbmtTdHJpbmcgPSAoY2FwWzJdIHx8IGNhcFsxXSkucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLm11bHRpcGxlU3BhY2VHbG9iYWwsICcgJyk7XG4gICAgICBjb25zdCBsaW5rID0gbGlua3NbbGlua1N0cmluZy50b0xvd2VyQ2FzZSgpXTtcbiAgICAgIGlmICghbGluaykge1xuICAgICAgICBjb25zdCB0ZXh0ID0gY2FwWzBdLmNoYXJBdCgwKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgcmF3OiB0ZXh0LFxuICAgICAgICAgIHRleHQsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gb3V0cHV0TGluayhjYXAsIGxpbmssIGNhcFswXSwgdGhpcy5sZXhlciwgdGhpcy5ydWxlcyk7XG4gICAgfVxuICB9XG5cbiAgZW1TdHJvbmcoc3JjOiBzdHJpbmcsIG1hc2tlZFNyYzogc3RyaW5nLCBwcmV2Q2hhciA9ICcnKTogVG9rZW5zLkVtIHwgVG9rZW5zLlN0cm9uZyB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IG1hdGNoID0gdGhpcy5ydWxlcy5pbmxpbmUuZW1TdHJvbmdMRGVsaW0uZXhlYyhzcmMpO1xuICAgIGlmICghbWF0Y2gpIHJldHVybjtcbiAgICBpZiAoIW1hdGNoWzFdICYmICFtYXRjaFsyXSAmJiAhbWF0Y2hbM10gJiYgIW1hdGNoWzRdKSByZXR1cm47XG5cbiAgICAvLyBfIGNhbid0IGJlIGJldHdlZW4gdHdvIGFscGhhbnVtZXJpY3MuIFxccHtMfVxccHtOfSBpbmNsdWRlcyBub24tZW5nbGlzaCBhbHBoYWJldC9udW1iZXJzIGFzIHdlbGxcbiAgICBpZiAobWF0Y2hbNF0gJiYgcHJldkNoYXIubWF0Y2godGhpcy5ydWxlcy5vdGhlci51bmljb2RlQWxwaGFOdW1lcmljKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgbmV4dENoYXIgPSBtYXRjaFsxXSB8fCBtYXRjaFszXSB8fCAnJztcblxuICAgIGlmICghbmV4dENoYXIgfHwgIXByZXZDaGFyIHx8IHRoaXMucnVsZXMuaW5saW5lLnB1bmN0dWF0aW9uLmV4ZWMocHJldkNoYXIpKSB7XG4gICAgICAvLyB1bmljb2RlIFJlZ2V4IGNvdW50cyBlbW9qaSBhcyAxIGNoYXI7IHNwcmVhZCBpbnRvIGFycmF5IGZvciBwcm9wZXIgY291bnQgKHVzZWQgbXVsdGlwbGUgdGltZXMgYmVsb3cpXG4gICAgICBjb25zdCBsTGVuZ3RoID0gWy4uLm1hdGNoWzBdXS5sZW5ndGggLSAxO1xuICAgICAgbGV0IHJEZWxpbSwgckxlbmd0aCwgZGVsaW1Ub3RhbCA9IGxMZW5ndGgsIG1pZERlbGltVG90YWwgPSAwO1xuXG4gICAgICBjb25zdCBlbmRSZWcgPSBtYXRjaFswXVswXSA9PT0gJyonID8gdGhpcy5ydWxlcy5pbmxpbmUuZW1TdHJvbmdSRGVsaW1Bc3QgOiB0aGlzLnJ1bGVzLmlubGluZS5lbVN0cm9uZ1JEZWxpbVVuZDtcbiAgICAgIGVuZFJlZy5sYXN0SW5kZXggPSAwO1xuXG4gICAgICAvLyBDbGlwIG1hc2tlZFNyYyB0byBzYW1lIHNlY3Rpb24gb2Ygc3RyaW5nIGFzIHNyYyAobW92ZSB0byBsZXhlcj8pXG4gICAgICBtYXNrZWRTcmMgPSBtYXNrZWRTcmMuc2xpY2UoLTEgKiBzcmMubGVuZ3RoICsgbExlbmd0aCk7XG5cbiAgICAgIHdoaWxlICgobWF0Y2ggPSBlbmRSZWcuZXhlYyhtYXNrZWRTcmMpKSAhPSBudWxsKSB7XG4gICAgICAgIHJEZWxpbSA9IG1hdGNoWzFdIHx8IG1hdGNoWzJdIHx8IG1hdGNoWzNdIHx8IG1hdGNoWzRdIHx8IG1hdGNoWzVdIHx8IG1hdGNoWzZdO1xuXG4gICAgICAgIGlmICghckRlbGltKSBjb250aW51ZTsgLy8gc2tpcCBzaW5nbGUgKiBpbiBfX2FiYyphYmNfX1xuXG4gICAgICAgIHJMZW5ndGggPSBbLi4uckRlbGltXS5sZW5ndGg7XG5cbiAgICAgICAgaWYgKG1hdGNoWzNdIHx8IG1hdGNoWzRdKSB7IC8vIGZvdW5kIGFub3RoZXIgTGVmdCBEZWxpbVxuICAgICAgICAgIGRlbGltVG90YWwgKz0gckxlbmd0aDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBlbHNlIGlmIChtYXRjaFs1XSB8fCBtYXRjaFs2XSkgeyAvLyBlaXRoZXIgTGVmdCBvciBSaWdodCBEZWxpbVxuICAgICAgICAgIGlmIChsTGVuZ3RoICUgMyAmJiAhKChsTGVuZ3RoICsgckxlbmd0aCkgJSAzKSkge1xuICAgICAgICAgICAgbWlkRGVsaW1Ub3RhbCArPSByTGVuZ3RoO1xuICAgICAgICAgICAgY29udGludWU7IC8vIENvbW1vbk1hcmsgRW1waGFzaXMgUnVsZXMgOS0xMFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGRlbGltVG90YWwgLT0gckxlbmd0aDtcblxuICAgICAgICBpZiAoZGVsaW1Ub3RhbCA+IDApIGNvbnRpbnVlOyAvLyBIYXZlbid0IGZvdW5kIGVub3VnaCBjbG9zaW5nIGRlbGltaXRlcnNcblxuICAgICAgICAvLyBSZW1vdmUgZXh0cmEgY2hhcmFjdGVycy4gKmEqKiogLT4gKmEqXG4gICAgICAgIHJMZW5ndGggPSBNYXRoLm1pbihyTGVuZ3RoLCByTGVuZ3RoICsgZGVsaW1Ub3RhbCArIG1pZERlbGltVG90YWwpO1xuICAgICAgICAvLyBjaGFyIGxlbmd0aCBjYW4gYmUgPjEgZm9yIHVuaWNvZGUgY2hhcmFjdGVycztcbiAgICAgICAgY29uc3QgbGFzdENoYXJMZW5ndGggPSBbLi4ubWF0Y2hbMF1dWzBdLmxlbmd0aDtcbiAgICAgICAgY29uc3QgcmF3ID0gc3JjLnNsaWNlKDAsIGxMZW5ndGggKyBtYXRjaC5pbmRleCArIGxhc3RDaGFyTGVuZ3RoICsgckxlbmd0aCk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGBlbWAgaWYgc21hbGxlc3QgZGVsaW1pdGVyIGhhcyBvZGQgY2hhciBjb3VudC4gKmEqKipcbiAgICAgICAgaWYgKE1hdGgubWluKGxMZW5ndGgsIHJMZW5ndGgpICUgMikge1xuICAgICAgICAgIGNvbnN0IHRleHQgPSByYXcuc2xpY2UoMSwgLTEpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnZW0nLFxuICAgICAgICAgICAgcmF3LFxuICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgIHRva2VuczogdGhpcy5sZXhlci5pbmxpbmVUb2tlbnModGV4dCksXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENyZWF0ZSAnc3Ryb25nJyBpZiBzbWFsbGVzdCBkZWxpbWl0ZXIgaGFzIGV2ZW4gY2hhciBjb3VudC4gKiphKioqXG4gICAgICAgIGNvbnN0IHRleHQgPSByYXcuc2xpY2UoMiwgLTIpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6ICdzdHJvbmcnLFxuICAgICAgICAgIHJhdyxcbiAgICAgICAgICB0ZXh0LFxuICAgICAgICAgIHRva2VuczogdGhpcy5sZXhlci5pbmxpbmVUb2tlbnModGV4dCksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29kZXNwYW4oc3JjOiBzdHJpbmcpOiBUb2tlbnMuQ29kZXNwYW4gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuaW5saW5lLmNvZGUuZXhlYyhzcmMpO1xuICAgIGlmIChjYXApIHtcbiAgICAgIGxldCB0ZXh0ID0gY2FwWzJdLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5uZXdMaW5lQ2hhckdsb2JhbCwgJyAnKTtcbiAgICAgIGNvbnN0IGhhc05vblNwYWNlQ2hhcnMgPSB0aGlzLnJ1bGVzLm90aGVyLm5vblNwYWNlQ2hhci50ZXN0KHRleHQpO1xuICAgICAgY29uc3QgaGFzU3BhY2VDaGFyc09uQm90aEVuZHMgPSB0aGlzLnJ1bGVzLm90aGVyLnN0YXJ0aW5nU3BhY2VDaGFyLnRlc3QodGV4dCkgJiYgdGhpcy5ydWxlcy5vdGhlci5lbmRpbmdTcGFjZUNoYXIudGVzdCh0ZXh0KTtcbiAgICAgIGlmIChoYXNOb25TcGFjZUNoYXJzICYmIGhhc1NwYWNlQ2hhcnNPbkJvdGhFbmRzKSB7XG4gICAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cmluZygxLCB0ZXh0Lmxlbmd0aCAtIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ2NvZGVzcGFuJyxcbiAgICAgICAgcmF3OiBjYXBbMF0sXG4gICAgICAgIHRleHQsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGJyKHNyYzogc3RyaW5nKTogVG9rZW5zLkJyIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjYXAgPSB0aGlzLnJ1bGVzLmlubGluZS5ici5leGVjKHNyYyk7XG4gICAgaWYgKGNhcCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ2JyJyxcbiAgICAgICAgcmF3OiBjYXBbMF0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGRlbChzcmM6IHN0cmluZywgbWFza2VkU3JjOiBzdHJpbmcsIHByZXZDaGFyID0gJycpOiBUb2tlbnMuRGVsIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgbWF0Y2ggPSB0aGlzLnJ1bGVzLmlubGluZS5kZWxMRGVsaW0uZXhlYyhzcmMpO1xuICAgIGlmICghbWF0Y2gpIHJldHVybjtcblxuICAgIGNvbnN0IG5leHRDaGFyID0gbWF0Y2hbMV0gfHwgJyc7XG5cbiAgICBpZiAoIW5leHRDaGFyIHx8ICFwcmV2Q2hhciB8fCB0aGlzLnJ1bGVzLmlubGluZS5wdW5jdHVhdGlvbi5leGVjKHByZXZDaGFyKSkge1xuICAgICAgLy8gdW5pY29kZSBSZWdleCBjb3VudHMgZW1vamkgYXMgMSBjaGFyOyBzcHJlYWQgaW50byBhcnJheSBmb3IgcHJvcGVyIGNvdW50XG4gICAgICBjb25zdCBsTGVuZ3RoID0gWy4uLm1hdGNoWzBdXS5sZW5ndGggLSAxO1xuICAgICAgbGV0IHJEZWxpbSwgckxlbmd0aCwgZGVsaW1Ub3RhbCA9IGxMZW5ndGg7XG5cbiAgICAgIGNvbnN0IGVuZFJlZyA9IHRoaXMucnVsZXMuaW5saW5lLmRlbFJEZWxpbTtcbiAgICAgIGVuZFJlZy5sYXN0SW5kZXggPSAwO1xuXG4gICAgICAvLyBDbGlwIG1hc2tlZFNyYyB0byBzYW1lIHNlY3Rpb24gb2Ygc3RyaW5nIGFzIHNyY1xuICAgICAgbWFza2VkU3JjID0gbWFza2VkU3JjLnNsaWNlKC0xICogc3JjLmxlbmd0aCArIGxMZW5ndGgpO1xuXG4gICAgICB3aGlsZSAoKG1hdGNoID0gZW5kUmVnLmV4ZWMobWFza2VkU3JjKSkgIT0gbnVsbCkge1xuICAgICAgICByRGVsaW0gPSBtYXRjaFsxXSB8fCBtYXRjaFsyXSB8fCBtYXRjaFszXSB8fCBtYXRjaFs0XSB8fCBtYXRjaFs1XSB8fCBtYXRjaFs2XTtcblxuICAgICAgICBpZiAoIXJEZWxpbSkgY29udGludWU7XG5cbiAgICAgICAgckxlbmd0aCA9IFsuLi5yRGVsaW1dLmxlbmd0aDtcblxuICAgICAgICBpZiAockxlbmd0aCAhPT0gbExlbmd0aCkgY29udGludWU7XG5cbiAgICAgICAgaWYgKG1hdGNoWzNdIHx8IG1hdGNoWzRdKSB7IC8vIGZvdW5kIGFub3RoZXIgTGVmdCBEZWxpbVxuICAgICAgICAgIGRlbGltVG90YWwgKz0gckxlbmd0aDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlbGltVG90YWwgLT0gckxlbmd0aDtcblxuICAgICAgICBpZiAoZGVsaW1Ub3RhbCA+IDApIGNvbnRpbnVlOyAvLyBIYXZlbid0IGZvdW5kIGVub3VnaCBjbG9zaW5nIGRlbGltaXRlcnNcblxuICAgICAgICAvLyBSZW1vdmUgZXh0cmEgY2hhcmFjdGVyc1xuICAgICAgICByTGVuZ3RoID0gTWF0aC5taW4ockxlbmd0aCwgckxlbmd0aCArIGRlbGltVG90YWwpO1xuICAgICAgICAvLyBjaGFyIGxlbmd0aCBjYW4gYmUgPjEgZm9yIHVuaWNvZGUgY2hhcmFjdGVyc1xuICAgICAgICBjb25zdCBsYXN0Q2hhckxlbmd0aCA9IFsuLi5tYXRjaFswXV1bMF0ubGVuZ3RoO1xuICAgICAgICBjb25zdCByYXcgPSBzcmMuc2xpY2UoMCwgbExlbmd0aCArIG1hdGNoLmluZGV4ICsgbGFzdENoYXJMZW5ndGggKyByTGVuZ3RoKTtcblxuICAgICAgICAvLyBDcmVhdGUgZGVsIHRva2VuIC0gb25seSBzaW5nbGUgfiBvciBkb3VibGUgfn4gc3VwcG9ydGVkXG4gICAgICAgIGNvbnN0IHRleHQgPSByYXcuc2xpY2UobExlbmd0aCwgLWxMZW5ndGgpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6ICdkZWwnLFxuICAgICAgICAgIHJhdyxcbiAgICAgICAgICB0ZXh0LFxuICAgICAgICAgIHRva2VuczogdGhpcy5sZXhlci5pbmxpbmVUb2tlbnModGV4dCksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXV0b2xpbmsoc3JjOiBzdHJpbmcpOiBUb2tlbnMuTGluayB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5pbmxpbmUuYXV0b2xpbmsuZXhlYyhzcmMpO1xuICAgIGlmIChjYXApIHtcbiAgICAgIGxldCB0ZXh0LCBocmVmO1xuICAgICAgaWYgKGNhcFsyXSA9PT0gJ0AnKSB7XG4gICAgICAgIHRleHQgPSBjYXBbMV07XG4gICAgICAgIGhyZWYgPSAnbWFpbHRvOicgKyB0ZXh0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGV4dCA9IGNhcFsxXTtcbiAgICAgICAgaHJlZiA9IHRleHQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdsaW5rJyxcbiAgICAgICAgcmF3OiBjYXBbMF0sXG4gICAgICAgIHRleHQsXG4gICAgICAgIGhyZWYsXG4gICAgICAgIHRva2VuczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgIHJhdzogdGV4dCxcbiAgICAgICAgICAgIHRleHQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgdXJsKHNyYzogc3RyaW5nKTogVG9rZW5zLkxpbmsgfCB1bmRlZmluZWQge1xuICAgIGxldCBjYXA7XG4gICAgaWYgKGNhcCA9IHRoaXMucnVsZXMuaW5saW5lLnVybC5leGVjKHNyYykpIHtcbiAgICAgIGxldCB0ZXh0LCBocmVmO1xuICAgICAgaWYgKGNhcFsyXSA9PT0gJ0AnKSB7XG4gICAgICAgIHRleHQgPSBjYXBbMF07XG4gICAgICAgIGhyZWYgPSAnbWFpbHRvOicgKyB0ZXh0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZG8gZXh0ZW5kZWQgYXV0b2xpbmsgcGF0aCB2YWxpZGF0aW9uXG4gICAgICAgIGxldCBwcmV2Q2FwWmVybztcbiAgICAgICAgZG8ge1xuICAgICAgICAgIHByZXZDYXBaZXJvID0gY2FwWzBdO1xuICAgICAgICAgIGNhcFswXSA9IHRoaXMucnVsZXMuaW5saW5lLl9iYWNrcGVkYWwuZXhlYyhjYXBbMF0pPy5bMF0gPz8gJyc7XG4gICAgICAgIH0gd2hpbGUgKHByZXZDYXBaZXJvICE9PSBjYXBbMF0pO1xuICAgICAgICB0ZXh0ID0gY2FwWzBdO1xuICAgICAgICBpZiAoY2FwWzFdID09PSAnd3d3LicpIHtcbiAgICAgICAgICBocmVmID0gJ2h0dHA6Ly8nICsgY2FwWzBdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGhyZWYgPSBjYXBbMF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdsaW5rJyxcbiAgICAgICAgcmF3OiBjYXBbMF0sXG4gICAgICAgIHRleHQsXG4gICAgICAgIGhyZWYsXG4gICAgICAgIHRva2VuczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgIHJhdzogdGV4dCxcbiAgICAgICAgICAgIHRleHQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgaW5saW5lVGV4dChzcmM6IHN0cmluZyk6IFRva2Vucy5UZXh0IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjYXAgPSB0aGlzLnJ1bGVzLmlubGluZS50ZXh0LmV4ZWMoc3JjKTtcbiAgICBpZiAoY2FwKSB7XG4gICAgICBjb25zdCBlc2NhcGVkID0gdGhpcy5sZXhlci5zdGF0ZS5pblJhd0Jsb2NrO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICByYXc6IGNhcFswXSxcbiAgICAgICAgdGV4dDogY2FwWzBdLFxuICAgICAgICBlc2NhcGVkLFxuICAgICAgfTtcbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBfVG9rZW5pemVyIH0gZnJvbSAnLi9Ub2tlbml6ZXIudHMnO1xuaW1wb3J0IHsgX2RlZmF1bHRzIH0gZnJvbSAnLi9kZWZhdWx0cy50cyc7XG5pbXBvcnQgeyBvdGhlciwgYmxvY2ssIGlubGluZSB9IGZyb20gJy4vcnVsZXMudHMnO1xuaW1wb3J0IHR5cGUgeyBUb2tlbiwgVG9rZW5zTGlzdCwgVG9rZW5zIH0gZnJvbSAnLi9Ub2tlbnMudHMnO1xuaW1wb3J0IHR5cGUgeyBNYXJrZWRPcHRpb25zIH0gZnJvbSAnLi9NYXJrZWRPcHRpb25zLnRzJztcblxuLyoqXG4gKiBCbG9jayBMZXhlclxuICovXG5leHBvcnQgY2xhc3MgX0xleGVyPFBhcnNlck91dHB1dCA9IHN0cmluZywgUmVuZGVyZXJPdXRwdXQgPSBzdHJpbmc+IHtcbiAgdG9rZW5zOiBUb2tlbnNMaXN0O1xuICBvcHRpb25zOiBNYXJrZWRPcHRpb25zPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+O1xuICBzdGF0ZToge1xuICAgIGluTGluazogYm9vbGVhbjtcbiAgICBpblJhd0Jsb2NrOiBib29sZWFuO1xuICAgIHRvcDogYm9vbGVhbjtcbiAgfTtcblxuICBwdWJsaWMgaW5saW5lUXVldWU6IHsgc3JjOiBzdHJpbmcsIHRva2VuczogVG9rZW5bXSB9W107XG5cbiAgcHJpdmF0ZSB0b2tlbml6ZXI6IF9Ub2tlbml6ZXI8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD47XG5cbiAgY29uc3RydWN0b3Iob3B0aW9ucz86IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4pIHtcbiAgICAvLyBUb2tlbkxpc3QgY2Fubm90IGJlIGNyZWF0ZWQgaW4gb25lIGdvXG4gICAgdGhpcy50b2tlbnMgPSBbXSBhcyB1bmtub3duIGFzIFRva2Vuc0xpc3Q7XG4gICAgdGhpcy50b2tlbnMubGlua3MgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwgX2RlZmF1bHRzO1xuICAgIHRoaXMub3B0aW9ucy50b2tlbml6ZXIgPSB0aGlzLm9wdGlvbnMudG9rZW5pemVyIHx8IG5ldyBfVG9rZW5pemVyPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+KCk7XG4gICAgdGhpcy50b2tlbml6ZXIgPSB0aGlzLm9wdGlvbnMudG9rZW5pemVyO1xuICAgIHRoaXMudG9rZW5pemVyLm9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgdGhpcy50b2tlbml6ZXIubGV4ZXIgPSB0aGlzO1xuICAgIHRoaXMuaW5saW5lUXVldWUgPSBbXTtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgaW5MaW5rOiBmYWxzZSxcbiAgICAgIGluUmF3QmxvY2s6IGZhbHNlLFxuICAgICAgdG9wOiB0cnVlLFxuICAgIH07XG5cbiAgICBjb25zdCBydWxlcyA9IHtcbiAgICAgIG90aGVyLFxuICAgICAgYmxvY2s6IGJsb2NrLm5vcm1hbCxcbiAgICAgIGlubGluZTogaW5saW5lLm5vcm1hbCxcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5wZWRhbnRpYykge1xuICAgICAgcnVsZXMuYmxvY2sgPSBibG9jay5wZWRhbnRpYztcbiAgICAgIHJ1bGVzLmlubGluZSA9IGlubGluZS5wZWRhbnRpYztcbiAgICB9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy5nZm0pIHtcbiAgICAgIHJ1bGVzLmJsb2NrID0gYmxvY2suZ2ZtO1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5icmVha3MpIHtcbiAgICAgICAgcnVsZXMuaW5saW5lID0gaW5saW5lLmJyZWFrcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJ1bGVzLmlubGluZSA9IGlubGluZS5nZm07XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMudG9rZW5pemVyLnJ1bGVzID0gcnVsZXM7XG4gIH1cblxuICAvKipcbiAgICogRXhwb3NlIFJ1bGVzXG4gICAqL1xuICBzdGF0aWMgZ2V0IHJ1bGVzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBibG9jayxcbiAgICAgIGlubGluZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXRpYyBMZXggTWV0aG9kXG4gICAqL1xuICBzdGF0aWMgbGV4PFBhcnNlck91dHB1dCA9IHN0cmluZywgUmVuZGVyZXJPdXRwdXQgPSBzdHJpbmc+KHNyYzogc3RyaW5nLCBvcHRpb25zPzogTWFya2VkT3B0aW9uczxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0Pikge1xuICAgIGNvbnN0IGxleGVyID0gbmV3IF9MZXhlcjxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0PihvcHRpb25zKTtcbiAgICByZXR1cm4gbGV4ZXIubGV4KHNyYyk7XG4gIH1cblxuICAvKipcbiAgICogU3RhdGljIExleCBJbmxpbmUgTWV0aG9kXG4gICAqL1xuICBzdGF0aWMgbGV4SW5saW5lPFBhcnNlck91dHB1dCA9IHN0cmluZywgUmVuZGVyZXJPdXRwdXQgPSBzdHJpbmc+KHNyYzogc3RyaW5nLCBvcHRpb25zPzogTWFya2VkT3B0aW9uczxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0Pikge1xuICAgIGNvbnN0IGxleGVyID0gbmV3IF9MZXhlcjxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0PihvcHRpb25zKTtcbiAgICByZXR1cm4gbGV4ZXIuaW5saW5lVG9rZW5zKHNyYyk7XG4gIH1cblxuICAvKipcbiAgICogUHJlcHJvY2Vzc2luZ1xuICAgKi9cbiAgbGV4KHNyYzogc3RyaW5nKSB7XG4gICAgc3JjID0gc3JjLnJlcGxhY2Uob3RoZXIuY2FycmlhZ2VSZXR1cm4sICdcXG4nKTtcblxuICAgIHRoaXMuYmxvY2tUb2tlbnMoc3JjLCB0aGlzLnRva2Vucyk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuaW5saW5lUXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5leHQgPSB0aGlzLmlubGluZVF1ZXVlW2ldO1xuICAgICAgdGhpcy5pbmxpbmVUb2tlbnMobmV4dC5zcmMsIG5leHQudG9rZW5zKTtcbiAgICB9XG4gICAgdGhpcy5pbmxpbmVRdWV1ZSA9IFtdO1xuXG4gICAgcmV0dXJuIHRoaXMudG9rZW5zO1xuICB9XG5cbiAgLyoqXG4gICAqIExleGluZ1xuICAgKi9cbiAgYmxvY2tUb2tlbnMoc3JjOiBzdHJpbmcsIHRva2Vucz86IFRva2VuW10sIGxhc3RQYXJhZ3JhcGhDbGlwcGVkPzogYm9vbGVhbik6IFRva2VuW107XG4gIGJsb2NrVG9rZW5zKHNyYzogc3RyaW5nLCB0b2tlbnM/OiBUb2tlbnNMaXN0LCBsYXN0UGFyYWdyYXBoQ2xpcHBlZD86IGJvb2xlYW4pOiBUb2tlbnNMaXN0O1xuICBibG9ja1Rva2VucyhzcmM6IHN0cmluZywgdG9rZW5zOiBUb2tlbltdID0gW10sIGxhc3RQYXJhZ3JhcGhDbGlwcGVkID0gZmFsc2UpIHtcbiAgICB0aGlzLnRva2VuaXplci5sZXhlciA9IHRoaXM7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5wZWRhbnRpYykge1xuICAgICAgc3JjID0gc3JjLnJlcGxhY2Uob3RoZXIudGFiQ2hhckdsb2JhbCwgJyAgICAnKS5yZXBsYWNlKG90aGVyLnNwYWNlTGluZSwgJycpO1xuICAgIH1cblxuICAgIHdoaWxlIChzcmMpIHtcbiAgICAgIGxldCB0b2tlbjogVG9rZW5zLkdlbmVyaWMgfCB1bmRlZmluZWQ7XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucz8uYmxvY2s/LnNvbWUoKGV4dFRva2VuaXplcikgPT4ge1xuICAgICAgICBpZiAodG9rZW4gPSBleHRUb2tlbml6ZXIuY2FsbCh7IGxleGVyOiB0aGlzIH0sIHNyYywgdG9rZW5zKSkge1xuICAgICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0pKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBuZXdsaW5lXG4gICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5zcGFjZShzcmMpKSB7XG4gICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IGxhc3RUb2tlbiA9IHRva2Vucy5hdCgtMSk7XG4gICAgICAgIGlmICh0b2tlbi5yYXcubGVuZ3RoID09PSAxICYmIGxhc3RUb2tlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gaWYgdGhlcmUncyBhIHNpbmdsZSBcXG4gYXMgYSBzcGFjZXIsIGl0J3MgdGVybWluYXRpbmcgdGhlIGxhc3QgbGluZSxcbiAgICAgICAgICAvLyBzbyBtb3ZlIGl0IHRoZXJlIHNvIHRoYXQgd2UgZG9uJ3QgZ2V0IHVubmVjZXNzYXJ5IHBhcmFncmFwaCB0YWdzXG4gICAgICAgICAgbGFzdFRva2VuLnJhdyArPSAnXFxuJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGNvZGVcbiAgICAgIGlmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLmNvZGUoc3JjKSkge1xuICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICBjb25zdCBsYXN0VG9rZW4gPSB0b2tlbnMuYXQoLTEpO1xuICAgICAgICAvLyBBbiBpbmRlbnRlZCBjb2RlIGJsb2NrIGNhbm5vdCBpbnRlcnJ1cHQgYSBwYXJhZ3JhcGguXG4gICAgICAgIGlmIChsYXN0VG9rZW4/LnR5cGUgPT09ICdwYXJhZ3JhcGgnIHx8IGxhc3RUb2tlbj8udHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICAgICAgbGFzdFRva2VuLnJhdyArPSAobGFzdFRva2VuLnJhdy5lbmRzV2l0aCgnXFxuJykgPyAnJyA6ICdcXG4nKSArIHRva2VuLnJhdztcbiAgICAgICAgICBsYXN0VG9rZW4udGV4dCArPSAnXFxuJyArIHRva2VuLnRleHQ7XG4gICAgICAgICAgdGhpcy5pbmxpbmVRdWV1ZS5hdCgtMSkhLnNyYyA9IGxhc3RUb2tlbi50ZXh0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gZmVuY2VzXG4gICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5mZW5jZXMoc3JjKSkge1xuICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBoZWFkaW5nXG4gICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5oZWFkaW5nKHNyYykpIHtcbiAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gaHJcbiAgICAgIGlmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLmhyKHNyYykpIHtcbiAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gYmxvY2txdW90ZVxuICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIuYmxvY2txdW90ZShzcmMpKSB7XG4gICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGxpc3RcbiAgICAgIGlmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLmxpc3Qoc3JjKSkge1xuICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBodG1sXG4gICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5odG1sKHNyYykpIHtcbiAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gZGVmXG4gICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5kZWYoc3JjKSkge1xuICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICBjb25zdCBsYXN0VG9rZW4gPSB0b2tlbnMuYXQoLTEpO1xuICAgICAgICBpZiAobGFzdFRva2VuPy50eXBlID09PSAncGFyYWdyYXBoJyB8fCBsYXN0VG9rZW4/LnR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgICAgIGxhc3RUb2tlbi5yYXcgKz0gKGxhc3RUb2tlbi5yYXcuZW5kc1dpdGgoJ1xcbicpID8gJycgOiAnXFxuJykgKyB0b2tlbi5yYXc7XG4gICAgICAgICAgbGFzdFRva2VuLnRleHQgKz0gJ1xcbicgKyB0b2tlbi5yYXc7XG4gICAgICAgICAgdGhpcy5pbmxpbmVRdWV1ZS5hdCgtMSkhLnNyYyA9IGxhc3RUb2tlbi50ZXh0O1xuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLnRva2Vucy5saW5rc1t0b2tlbi50YWddKSB7XG4gICAgICAgICAgdGhpcy50b2tlbnMubGlua3NbdG9rZW4udGFnXSA9IHtcbiAgICAgICAgICAgIGhyZWY6IHRva2VuLmhyZWYsXG4gICAgICAgICAgICB0aXRsZTogdG9rZW4udGl0bGUsXG4gICAgICAgICAgfTtcbiAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIHRhYmxlIChnZm0pXG4gICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci50YWJsZShzcmMpKSB7XG4gICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGxoZWFkaW5nXG4gICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5saGVhZGluZyhzcmMpKSB7XG4gICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIHRvcC1sZXZlbCBwYXJhZ3JhcGhcbiAgICAgIC8vIHByZXZlbnQgcGFyYWdyYXBoIGNvbnN1bWluZyBleHRlbnNpb25zIGJ5IGNsaXBwaW5nICdzcmMnIHRvIGV4dGVuc2lvbiBzdGFydFxuICAgICAgbGV0IGN1dFNyYyA9IHNyYztcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucz8uc3RhcnRCbG9jaykge1xuICAgICAgICBsZXQgc3RhcnRJbmRleCA9IEluZmluaXR5O1xuICAgICAgICBjb25zdCB0ZW1wU3JjID0gc3JjLnNsaWNlKDEpO1xuICAgICAgICBsZXQgdGVtcFN0YXJ0O1xuICAgICAgICB0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5zdGFydEJsb2NrLmZvckVhY2goKGdldFN0YXJ0SW5kZXgpID0+IHtcbiAgICAgICAgICB0ZW1wU3RhcnQgPSBnZXRTdGFydEluZGV4LmNhbGwoeyBsZXhlcjogdGhpcyB9LCB0ZW1wU3JjKTtcbiAgICAgICAgICBpZiAodHlwZW9mIHRlbXBTdGFydCA9PT0gJ251bWJlcicgJiYgdGVtcFN0YXJ0ID49IDApIHtcbiAgICAgICAgICAgIHN0YXJ0SW5kZXggPSBNYXRoLm1pbihzdGFydEluZGV4LCB0ZW1wU3RhcnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChzdGFydEluZGV4IDwgSW5maW5pdHkgJiYgc3RhcnRJbmRleCA+PSAwKSB7XG4gICAgICAgICAgY3V0U3JjID0gc3JjLnN1YnN0cmluZygwLCBzdGFydEluZGV4ICsgMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnN0YXRlLnRvcCAmJiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5wYXJhZ3JhcGgoY3V0U3JjKSkpIHtcbiAgICAgICAgY29uc3QgbGFzdFRva2VuID0gdG9rZW5zLmF0KC0xKTtcbiAgICAgICAgaWYgKGxhc3RQYXJhZ3JhcGhDbGlwcGVkICYmIGxhc3RUb2tlbj8udHlwZSA9PT0gJ3BhcmFncmFwaCcpIHtcbiAgICAgICAgICBsYXN0VG9rZW4ucmF3ICs9IChsYXN0VG9rZW4ucmF3LmVuZHNXaXRoKCdcXG4nKSA/ICcnIDogJ1xcbicpICsgdG9rZW4ucmF3O1xuICAgICAgICAgIGxhc3RUb2tlbi50ZXh0ICs9ICdcXG4nICsgdG9rZW4udGV4dDtcbiAgICAgICAgICB0aGlzLmlubGluZVF1ZXVlLnBvcCgpO1xuICAgICAgICAgIHRoaXMuaW5saW5lUXVldWUuYXQoLTEpIS5zcmMgPSBsYXN0VG9rZW4udGV4dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdFBhcmFncmFwaENsaXBwZWQgPSBjdXRTcmMubGVuZ3RoICE9PSBzcmMubGVuZ3RoO1xuICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gdGV4dFxuICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIudGV4dChzcmMpKSB7XG4gICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IGxhc3RUb2tlbiA9IHRva2Vucy5hdCgtMSk7XG4gICAgICAgIGlmIChsYXN0VG9rZW4/LnR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgICAgIGxhc3RUb2tlbi5yYXcgKz0gKGxhc3RUb2tlbi5yYXcuZW5kc1dpdGgoJ1xcbicpID8gJycgOiAnXFxuJykgKyB0b2tlbi5yYXc7XG4gICAgICAgICAgbGFzdFRva2VuLnRleHQgKz0gJ1xcbicgKyB0b2tlbi50ZXh0O1xuICAgICAgICAgIHRoaXMuaW5saW5lUXVldWUucG9wKCk7XG4gICAgICAgICAgdGhpcy5pbmxpbmVRdWV1ZS5hdCgtMSkhLnNyYyA9IGxhc3RUb2tlbi50ZXh0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNyYykge1xuICAgICAgICBjb25zdCBlcnJNc2cgPSAnSW5maW5pdGUgbG9vcCBvbiBieXRlOiAnICsgc3JjLmNoYXJDb2RlQXQoMCk7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJNc2cpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJNc2cpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zdGF0ZS50b3AgPSB0cnVlO1xuICAgIHJldHVybiB0b2tlbnM7XG4gIH1cblxuICBpbmxpbmUoc3JjOiBzdHJpbmcsIHRva2VuczogVG9rZW5bXSA9IFtdKSB7XG4gICAgdGhpcy5pbmxpbmVRdWV1ZS5wdXNoKHsgc3JjLCB0b2tlbnMgfSk7XG4gICAgcmV0dXJuIHRva2VucztcbiAgfVxuXG4gIC8qKlxuICAgKiBMZXhpbmcvQ29tcGlsaW5nXG4gICAqL1xuICBpbmxpbmVUb2tlbnMoc3JjOiBzdHJpbmcsIHRva2VuczogVG9rZW5bXSA9IFtdKTogVG9rZW5bXSB7XG4gICAgdGhpcy50b2tlbml6ZXIubGV4ZXIgPSB0aGlzO1xuICAgIC8vIFN0cmluZyB3aXRoIGxpbmtzIG1hc2tlZCB0byBhdm9pZCBpbnRlcmZlcmVuY2Ugd2l0aCBlbSBhbmQgc3Ryb25nXG4gICAgbGV0IG1hc2tlZFNyYyA9IHNyYztcbiAgICBsZXQgbWF0Y2g6IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGwgPSBudWxsO1xuXG4gICAgLy8gTWFzayBvdXQgcmVmbGlua3NcbiAgICBpZiAodGhpcy50b2tlbnMubGlua3MpIHtcbiAgICAgIGNvbnN0IGxpbmtzID0gT2JqZWN0LmtleXModGhpcy50b2tlbnMubGlua3MpO1xuICAgICAgaWYgKGxpbmtzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgd2hpbGUgKChtYXRjaCA9IHRoaXMudG9rZW5pemVyLnJ1bGVzLmlubGluZS5yZWZsaW5rU2VhcmNoLmV4ZWMobWFza2VkU3JjKSkgIT0gbnVsbCkge1xuICAgICAgICAgIGlmIChsaW5rcy5pbmNsdWRlcyhtYXRjaFswXS5zbGljZShtYXRjaFswXS5sYXN0SW5kZXhPZignWycpICsgMSwgLTEpKSkge1xuICAgICAgICAgICAgbWFza2VkU3JjID0gbWFza2VkU3JjLnNsaWNlKDAsIG1hdGNoLmluZGV4KVxuICAgICAgICAgICAgICArICdbJyArICdhJy5yZXBlYXQobWF0Y2hbMF0ubGVuZ3RoIC0gMikgKyAnXSdcbiAgICAgICAgICAgICAgKyBtYXNrZWRTcmMuc2xpY2UodGhpcy50b2tlbml6ZXIucnVsZXMuaW5saW5lLnJlZmxpbmtTZWFyY2gubGFzdEluZGV4KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBNYXNrIG91dCBlc2NhcGVkIGNoYXJhY3RlcnNcbiAgICB3aGlsZSAoKG1hdGNoID0gdGhpcy50b2tlbml6ZXIucnVsZXMuaW5saW5lLmFueVB1bmN0dWF0aW9uLmV4ZWMobWFza2VkU3JjKSkgIT0gbnVsbCkge1xuICAgICAgbWFza2VkU3JjID0gbWFza2VkU3JjLnNsaWNlKDAsIG1hdGNoLmluZGV4KSArICcrKycgKyBtYXNrZWRTcmMuc2xpY2UodGhpcy50b2tlbml6ZXIucnVsZXMuaW5saW5lLmFueVB1bmN0dWF0aW9uLmxhc3RJbmRleCk7XG4gICAgfVxuXG4gICAgLy8gTWFzayBvdXQgb3RoZXIgYmxvY2tzXG4gICAgbGV0IG9mZnNldDtcbiAgICB3aGlsZSAoKG1hdGNoID0gdGhpcy50b2tlbml6ZXIucnVsZXMuaW5saW5lLmJsb2NrU2tpcC5leGVjKG1hc2tlZFNyYykpICE9IG51bGwpIHtcbiAgICAgIG9mZnNldCA9IG1hdGNoWzJdID8gbWF0Y2hbMl0ubGVuZ3RoIDogMDtcbiAgICAgIG1hc2tlZFNyYyA9IG1hc2tlZFNyYy5zbGljZSgwLCBtYXRjaC5pbmRleCArIG9mZnNldCkgKyAnWycgKyAnYScucmVwZWF0KG1hdGNoWzBdLmxlbmd0aCAtIG9mZnNldCAtIDIpICsgJ10nICsgbWFza2VkU3JjLnNsaWNlKHRoaXMudG9rZW5pemVyLnJ1bGVzLmlubGluZS5ibG9ja1NraXAubGFzdEluZGV4KTtcbiAgICB9XG5cbiAgICAvLyBNYXNrIG91dCBibG9ja3MgZnJvbSBleHRlbnNpb25zXG4gICAgbWFza2VkU3JjID0gdGhpcy5vcHRpb25zLmhvb2tzPy5lbVN0cm9uZ01hc2s/LmNhbGwoeyBsZXhlcjogdGhpcyB9LCBtYXNrZWRTcmMpID8/IG1hc2tlZFNyYztcblxuICAgIGxldCBrZWVwUHJldkNoYXIgPSBmYWxzZTtcbiAgICBsZXQgcHJldkNoYXIgPSAnJztcbiAgICB3aGlsZSAoc3JjKSB7XG4gICAgICBpZiAoIWtlZXBQcmV2Q2hhcikge1xuICAgICAgICBwcmV2Q2hhciA9ICcnO1xuICAgICAgfVxuICAgICAga2VlcFByZXZDaGFyID0gZmFsc2U7XG5cbiAgICAgIGxldCB0b2tlbjogVG9rZW5zLkdlbmVyaWMgfCB1bmRlZmluZWQ7XG5cbiAgICAgIC8vIGV4dGVuc2lvbnNcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucz8uaW5saW5lPy5zb21lKChleHRUb2tlbml6ZXIpID0+IHtcbiAgICAgICAgaWYgKHRva2VuID0gZXh0VG9rZW5pemVyLmNhbGwoeyBsZXhlcjogdGhpcyB9LCBzcmMsIHRva2VucykpIHtcbiAgICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gZXNjYXBlXG4gICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5lc2NhcGUoc3JjKSkge1xuICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyB0YWdcbiAgICAgIGlmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLnRhZyhzcmMpKSB7XG4gICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGxpbmtcbiAgICAgIGlmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLmxpbmsoc3JjKSkge1xuICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyByZWZsaW5rLCBub2xpbmtcbiAgICAgIGlmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLnJlZmxpbmsoc3JjLCB0aGlzLnRva2Vucy5saW5rcykpIHtcbiAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgbGFzdFRva2VuID0gdG9rZW5zLmF0KC0xKTtcbiAgICAgICAgaWYgKHRva2VuLnR5cGUgPT09ICd0ZXh0JyAmJiBsYXN0VG9rZW4/LnR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgICAgIGxhc3RUb2tlbi5yYXcgKz0gdG9rZW4ucmF3O1xuICAgICAgICAgIGxhc3RUb2tlbi50ZXh0ICs9IHRva2VuLnRleHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBlbSAmIHN0cm9uZ1xuICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIuZW1TdHJvbmcoc3JjLCBtYXNrZWRTcmMsIHByZXZDaGFyKSkge1xuICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBjb2RlXG4gICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5jb2Rlc3BhbihzcmMpKSB7XG4gICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGJyXG4gICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5icihzcmMpKSB7XG4gICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGRlbCAoZ2ZtKVxuICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIuZGVsKHNyYywgbWFza2VkU3JjLCBwcmV2Q2hhcikpIHtcbiAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gYXV0b2xpbmtcbiAgICAgIGlmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLmF1dG9saW5rKHNyYykpIHtcbiAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gdXJsIChnZm0pXG4gICAgICBpZiAoIXRoaXMuc3RhdGUuaW5MaW5rICYmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLnVybChzcmMpKSkge1xuICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyB0ZXh0XG4gICAgICAvLyBwcmV2ZW50IGlubGluZVRleHQgY29uc3VtaW5nIGV4dGVuc2lvbnMgYnkgY2xpcHBpbmcgJ3NyYycgdG8gZXh0ZW5zaW9uIHN0YXJ0XG4gICAgICBsZXQgY3V0U3JjID0gc3JjO1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5leHRlbnNpb25zPy5zdGFydElubGluZSkge1xuICAgICAgICBsZXQgc3RhcnRJbmRleCA9IEluZmluaXR5O1xuICAgICAgICBjb25zdCB0ZW1wU3JjID0gc3JjLnNsaWNlKDEpO1xuICAgICAgICBsZXQgdGVtcFN0YXJ0O1xuICAgICAgICB0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5zdGFydElubGluZS5mb3JFYWNoKChnZXRTdGFydEluZGV4KSA9PiB7XG4gICAgICAgICAgdGVtcFN0YXJ0ID0gZ2V0U3RhcnRJbmRleC5jYWxsKHsgbGV4ZXI6IHRoaXMgfSwgdGVtcFNyYyk7XG4gICAgICAgICAgaWYgKHR5cGVvZiB0ZW1wU3RhcnQgPT09ICdudW1iZXInICYmIHRlbXBTdGFydCA+PSAwKSB7XG4gICAgICAgICAgICBzdGFydEluZGV4ID0gTWF0aC5taW4oc3RhcnRJbmRleCwgdGVtcFN0YXJ0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoc3RhcnRJbmRleCA8IEluZmluaXR5ICYmIHN0YXJ0SW5kZXggPj0gMCkge1xuICAgICAgICAgIGN1dFNyYyA9IHNyYy5zdWJzdHJpbmcoMCwgc3RhcnRJbmRleCArIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5pbmxpbmVUZXh0KGN1dFNyYykpIHtcbiAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgaWYgKHRva2VuLnJhdy5zbGljZSgtMSkgIT09ICdfJykgeyAvLyBUcmFjayBwcmV2Q2hhciBiZWZvcmUgc3RyaW5nIG9mIF9fX18gc3RhcnRlZFxuICAgICAgICAgIHByZXZDaGFyID0gdG9rZW4ucmF3LnNsaWNlKC0xKTtcbiAgICAgICAgfVxuICAgICAgICBrZWVwUHJldkNoYXIgPSB0cnVlO1xuICAgICAgICBjb25zdCBsYXN0VG9rZW4gPSB0b2tlbnMuYXQoLTEpO1xuICAgICAgICBpZiAobGFzdFRva2VuPy50eXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgICBsYXN0VG9rZW4ucmF3ICs9IHRva2VuLnJhdztcbiAgICAgICAgICBsYXN0VG9rZW4udGV4dCArPSB0b2tlbi50ZXh0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNyYykge1xuICAgICAgICBjb25zdCBlcnJNc2cgPSAnSW5maW5pdGUgbG9vcCBvbiBieXRlOiAnICsgc3JjLmNoYXJDb2RlQXQoMCk7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJNc2cpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJNc2cpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRva2VucztcbiAgfVxufVxuIiwgImltcG9ydCB7IF9kZWZhdWx0cyB9IGZyb20gJy4vZGVmYXVsdHMudHMnO1xuaW1wb3J0IHtcbiAgY2xlYW5VcmwsXG4gIGVzY2FwZUh0bWxFbnRpdGllcyxcbn0gZnJvbSAnLi9oZWxwZXJzLnRzJztcbmltcG9ydCB7IG90aGVyIH0gZnJvbSAnLi9ydWxlcy50cyc7XG5pbXBvcnQgdHlwZSB7IE1hcmtlZE9wdGlvbnMgfSBmcm9tICcuL01hcmtlZE9wdGlvbnMudHMnO1xuaW1wb3J0IHR5cGUgeyBUb2tlbnMgfSBmcm9tICcuL1Rva2Vucy50cyc7XG5pbXBvcnQgdHlwZSB7IF9QYXJzZXIgfSBmcm9tICcuL1BhcnNlci50cyc7XG5cbi8qKlxuICogUmVuZGVyZXJcbiAqL1xuZXhwb3J0IGNsYXNzIF9SZW5kZXJlcjxQYXJzZXJPdXRwdXQgPSBzdHJpbmcsIFJlbmRlcmVyT3V0cHV0ID0gc3RyaW5nPiB7XG4gIG9wdGlvbnM6IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD47XG4gIHBhcnNlciE6IF9QYXJzZXI8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD47IC8vIHNldCBieSB0aGUgcGFyc2VyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBNYXJrZWRPcHRpb25zPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+KSB7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCBfZGVmYXVsdHM7XG4gIH1cblxuICBzcGFjZSh0b2tlbjogVG9rZW5zLlNwYWNlKTogUmVuZGVyZXJPdXRwdXQge1xuICAgIHJldHVybiAnJyBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIGNvZGUoeyB0ZXh0LCBsYW5nLCBlc2NhcGVkIH06IFRva2Vucy5Db2RlKTogUmVuZGVyZXJPdXRwdXQge1xuICAgIGNvbnN0IGxhbmdTdHJpbmcgPSAobGFuZyB8fCAnJykubWF0Y2gob3RoZXIubm90U3BhY2VTdGFydCk/LlswXTtcblxuICAgIGNvbnN0IGNvZGUgPSB0ZXh0LnJlcGxhY2Uob3RoZXIuZW5kaW5nTmV3bGluZSwgJycpICsgJ1xcbic7XG5cbiAgICBpZiAoIWxhbmdTdHJpbmcpIHtcbiAgICAgIHJldHVybiAnPHByZT48Y29kZT4nXG4gICAgICAgICsgKGVzY2FwZWQgPyBjb2RlIDogZXNjYXBlSHRtbEVudGl0aWVzKGNvZGUsIHRydWUpKVxuICAgICAgICArICc8L2NvZGU+PC9wcmU+XFxuJyBhcyBSZW5kZXJlck91dHB1dDtcbiAgICB9XG5cbiAgICByZXR1cm4gJzxwcmU+PGNvZGUgY2xhc3M9XCJsYW5ndWFnZS0nXG4gICAgICArIGVzY2FwZUh0bWxFbnRpdGllcyhsYW5nU3RyaW5nKVxuICAgICAgKyAnXCI+J1xuICAgICAgKyAoZXNjYXBlZCA/IGNvZGUgOiBlc2NhcGVIdG1sRW50aXRpZXMoY29kZSwgdHJ1ZSkpXG4gICAgICArICc8L2NvZGU+PC9wcmU+XFxuJyBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIGJsb2NrcXVvdGUoeyB0b2tlbnMgfTogVG9rZW5zLkJsb2NrcXVvdGUpOiBSZW5kZXJlck91dHB1dCB7XG4gICAgY29uc3QgYm9keSA9IHRoaXMucGFyc2VyLnBhcnNlKHRva2Vucyk7XG4gICAgcmV0dXJuIGA8YmxvY2txdW90ZT5cXG4ke2JvZHl9PC9ibG9ja3F1b3RlPlxcbmAgYXMgUmVuZGVyZXJPdXRwdXQ7XG4gIH1cblxuICBodG1sKHsgdGV4dCB9OiBUb2tlbnMuSFRNTCB8IFRva2Vucy5UYWcpOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuIHRleHQgYXMgUmVuZGVyZXJPdXRwdXQ7XG4gIH1cblxuICBkZWYodG9rZW46IFRva2Vucy5EZWYpOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuICcnIGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgaGVhZGluZyh7IHRva2VucywgZGVwdGggfTogVG9rZW5zLkhlYWRpbmcpOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuIGA8aCR7ZGVwdGh9PiR7dGhpcy5wYXJzZXIucGFyc2VJbmxpbmUodG9rZW5zKX08L2gke2RlcHRofT5cXG5gIGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgaHIodG9rZW46IFRva2Vucy5Icik6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICByZXR1cm4gJzxocj5cXG4nIGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgbGlzdCh0b2tlbjogVG9rZW5zLkxpc3QpOiBSZW5kZXJlck91dHB1dCB7XG4gICAgY29uc3Qgb3JkZXJlZCA9IHRva2VuLm9yZGVyZWQ7XG4gICAgY29uc3Qgc3RhcnQgPSB0b2tlbi5zdGFydDtcblxuICAgIGxldCBib2R5ID0gJyc7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCB0b2tlbi5pdGVtcy5sZW5ndGg7IGorKykge1xuICAgICAgY29uc3QgaXRlbSA9IHRva2VuLml0ZW1zW2pdO1xuICAgICAgYm9keSArPSB0aGlzLmxpc3RpdGVtKGl0ZW0pO1xuICAgIH1cblxuICAgIGNvbnN0IHR5cGUgPSBvcmRlcmVkID8gJ29sJyA6ICd1bCc7XG4gICAgY29uc3Qgc3RhcnRBdHRyID0gKG9yZGVyZWQgJiYgc3RhcnQgIT09IDEpID8gKCcgc3RhcnQ9XCInICsgc3RhcnQgKyAnXCInKSA6ICcnO1xuICAgIHJldHVybiAnPCcgKyB0eXBlICsgc3RhcnRBdHRyICsgJz5cXG4nICsgYm9keSArICc8LycgKyB0eXBlICsgJz5cXG4nIGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgbGlzdGl0ZW0oaXRlbTogVG9rZW5zLkxpc3RJdGVtKTogUmVuZGVyZXJPdXRwdXQge1xuICAgIHJldHVybiBgPGxpPiR7dGhpcy5wYXJzZXIucGFyc2UoaXRlbS50b2tlbnMpfTwvbGk+XFxuYCBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIGNoZWNrYm94KHsgY2hlY2tlZCB9OiBUb2tlbnMuQ2hlY2tib3gpOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuICc8aW5wdXQgJ1xuICAgICAgKyAoY2hlY2tlZCA/ICdjaGVja2VkPVwiXCIgJyA6ICcnKVxuICAgICAgKyAnZGlzYWJsZWQ9XCJcIiB0eXBlPVwiY2hlY2tib3hcIj4gJyBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIHBhcmFncmFwaCh7IHRva2VucyB9OiBUb2tlbnMuUGFyYWdyYXBoKTogUmVuZGVyZXJPdXRwdXQge1xuICAgIHJldHVybiBgPHA+JHt0aGlzLnBhcnNlci5wYXJzZUlubGluZSh0b2tlbnMpfTwvcD5cXG5gIGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgdGFibGUodG9rZW46IFRva2Vucy5UYWJsZSk6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICBsZXQgaGVhZGVyID0gJyc7XG5cbiAgICAvLyBoZWFkZXJcbiAgICBsZXQgY2VsbCA9ICcnO1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgdG9rZW4uaGVhZGVyLmxlbmd0aDsgaisrKSB7XG4gICAgICBjZWxsICs9IHRoaXMudGFibGVjZWxsKHRva2VuLmhlYWRlcltqXSk7XG4gICAgfVxuICAgIGhlYWRlciArPSB0aGlzLnRhYmxlcm93KHsgdGV4dDogY2VsbCBhcyBQYXJzZXJPdXRwdXQgfSk7XG5cbiAgICBsZXQgYm9keSA9ICcnO1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgdG9rZW4ucm93cy5sZW5ndGg7IGorKykge1xuICAgICAgY29uc3Qgcm93ID0gdG9rZW4ucm93c1tqXTtcblxuICAgICAgY2VsbCA9ICcnO1xuICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCByb3cubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgY2VsbCArPSB0aGlzLnRhYmxlY2VsbChyb3dba10pO1xuICAgICAgfVxuXG4gICAgICBib2R5ICs9IHRoaXMudGFibGVyb3coeyB0ZXh0OiBjZWxsIGFzIFBhcnNlck91dHB1dCB9KTtcbiAgICB9XG4gICAgaWYgKGJvZHkpIGJvZHkgPSBgPHRib2R5PiR7Ym9keX08L3Rib2R5PmA7XG5cbiAgICByZXR1cm4gJzx0YWJsZT5cXG4nXG4gICAgICArICc8dGhlYWQ+XFxuJ1xuICAgICAgKyBoZWFkZXJcbiAgICAgICsgJzwvdGhlYWQ+XFxuJ1xuICAgICAgKyBib2R5XG4gICAgICArICc8L3RhYmxlPlxcbicgYXMgUmVuZGVyZXJPdXRwdXQ7XG4gIH1cblxuICB0YWJsZXJvdyh7IHRleHQgfTogVG9rZW5zLlRhYmxlUm93PFBhcnNlck91dHB1dD4pOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuIGA8dHI+XFxuJHt0ZXh0fTwvdHI+XFxuYCBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIHRhYmxlY2VsbCh0b2tlbjogVG9rZW5zLlRhYmxlQ2VsbCk6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICBjb25zdCBjb250ZW50ID0gdGhpcy5wYXJzZXIucGFyc2VJbmxpbmUodG9rZW4udG9rZW5zKTtcbiAgICBjb25zdCB0eXBlID0gdG9rZW4uaGVhZGVyID8gJ3RoJyA6ICd0ZCc7XG4gICAgY29uc3QgdGFnID0gdG9rZW4uYWxpZ25cbiAgICAgID8gYDwke3R5cGV9IGFsaWduPVwiJHt0b2tlbi5hbGlnbn1cIj5gXG4gICAgICA6IGA8JHt0eXBlfT5gO1xuICAgIHJldHVybiB0YWcgKyBjb250ZW50ICsgYDwvJHt0eXBlfT5cXG5gIGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgLyoqXG4gICAqIHNwYW4gbGV2ZWwgcmVuZGVyZXJcbiAgICovXG4gIHN0cm9uZyh7IHRva2VucyB9OiBUb2tlbnMuU3Ryb25nKTogUmVuZGVyZXJPdXRwdXQge1xuICAgIHJldHVybiBgPHN0cm9uZz4ke3RoaXMucGFyc2VyLnBhcnNlSW5saW5lKHRva2Vucyl9PC9zdHJvbmc+YCBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIGVtKHsgdG9rZW5zIH06IFRva2Vucy5FbSk6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICByZXR1cm4gYDxlbT4ke3RoaXMucGFyc2VyLnBhcnNlSW5saW5lKHRva2Vucyl9PC9lbT5gIGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgY29kZXNwYW4oeyB0ZXh0IH06IFRva2Vucy5Db2Rlc3Bhbik6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICByZXR1cm4gYDxjb2RlPiR7ZXNjYXBlSHRtbEVudGl0aWVzKHRleHQsIHRydWUpfTwvY29kZT5gIGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgYnIodG9rZW46IFRva2Vucy5Ccik6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICByZXR1cm4gJzxicj4nIGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgZGVsKHsgdG9rZW5zIH06IFRva2Vucy5EZWwpOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuIGA8ZGVsPiR7dGhpcy5wYXJzZXIucGFyc2VJbmxpbmUodG9rZW5zKX08L2RlbD5gIGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgbGluayh7IGhyZWYsIHRpdGxlLCB0b2tlbnMgfTogVG9rZW5zLkxpbmspOiBSZW5kZXJlck91dHB1dCB7XG4gICAgY29uc3QgdGV4dCA9IHRoaXMucGFyc2VyLnBhcnNlSW5saW5lKHRva2VucykgYXMgc3RyaW5nO1xuICAgIGNvbnN0IGNsZWFuSHJlZiA9IGNsZWFuVXJsKGhyZWYpO1xuICAgIGlmIChjbGVhbkhyZWYgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiB0ZXh0IGFzIFJlbmRlcmVyT3V0cHV0O1xuICAgIH1cbiAgICBocmVmID0gY2xlYW5IcmVmO1xuICAgIGxldCBvdXQgPSAnPGEgaHJlZj1cIicgKyBocmVmICsgJ1wiJztcbiAgICBpZiAodGl0bGUpIHtcbiAgICAgIG91dCArPSAnIHRpdGxlPVwiJyArIChlc2NhcGVIdG1sRW50aXRpZXModGl0bGUpKSArICdcIic7XG4gICAgfVxuICAgIG91dCArPSAnPicgKyB0ZXh0ICsgJzwvYT4nO1xuICAgIHJldHVybiBvdXQgYXMgUmVuZGVyZXJPdXRwdXQ7XG4gIH1cblxuICBpbWFnZSh7IGhyZWYsIHRpdGxlLCB0ZXh0LCB0b2tlbnMgfTogVG9rZW5zLkltYWdlKTogUmVuZGVyZXJPdXRwdXQge1xuICAgIGlmICh0b2tlbnMpIHtcbiAgICAgIHRleHQgPSB0aGlzLnBhcnNlci5wYXJzZUlubGluZSh0b2tlbnMsIHRoaXMucGFyc2VyLnRleHRSZW5kZXJlcikgYXMgc3RyaW5nO1xuICAgIH1cbiAgICBjb25zdCBjbGVhbkhyZWYgPSBjbGVhblVybChocmVmKTtcbiAgICBpZiAoY2xlYW5IcmVmID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gZXNjYXBlSHRtbEVudGl0aWVzKHRleHQpIGFzIFJlbmRlcmVyT3V0cHV0O1xuICAgIH1cbiAgICBocmVmID0gY2xlYW5IcmVmO1xuXG4gICAgbGV0IG91dCA9IGA8aW1nIHNyYz1cIiR7aHJlZn1cIiBhbHQ9XCIke2VzY2FwZUh0bWxFbnRpdGllcyh0ZXh0KX1cImA7XG4gICAgaWYgKHRpdGxlKSB7XG4gICAgICBvdXQgKz0gYCB0aXRsZT1cIiR7ZXNjYXBlSHRtbEVudGl0aWVzKHRpdGxlKX1cImA7XG4gICAgfVxuICAgIG91dCArPSAnPic7XG4gICAgcmV0dXJuIG91dCBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIHRleHQodG9rZW46IFRva2Vucy5UZXh0IHwgVG9rZW5zLkVzY2FwZSk6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICByZXR1cm4gJ3Rva2VucycgaW4gdG9rZW4gJiYgdG9rZW4udG9rZW5zXG4gICAgICA/IHRoaXMucGFyc2VyLnBhcnNlSW5saW5lKHRva2VuLnRva2VucykgYXMgdW5rbm93biBhcyBSZW5kZXJlck91dHB1dFxuICAgICAgOiAoJ2VzY2FwZWQnIGluIHRva2VuICYmIHRva2VuLmVzY2FwZWQgPyB0b2tlbi50ZXh0IGFzIFJlbmRlcmVyT3V0cHV0IDogZXNjYXBlSHRtbEVudGl0aWVzKHRva2VuLnRleHQpIGFzIFJlbmRlcmVyT3V0cHV0KTtcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgVG9rZW5zIH0gZnJvbSAnLi9Ub2tlbnMudHMnO1xuXG4vKipcbiAqIFRleHRSZW5kZXJlclxuICogcmV0dXJucyBvbmx5IHRoZSB0ZXh0dWFsIHBhcnQgb2YgdGhlIHRva2VuXG4gKi9cbmV4cG9ydCBjbGFzcyBfVGV4dFJlbmRlcmVyPFJlbmRlcmVyT3V0cHV0ID0gc3RyaW5nPiB7XG4gIC8vIG5vIG5lZWQgZm9yIGJsb2NrIGxldmVsIHJlbmRlcmVyc1xuICBzdHJvbmcoeyB0ZXh0IH06IFRva2Vucy5TdHJvbmcpOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuIHRleHQgYXMgUmVuZGVyZXJPdXRwdXQ7XG4gIH1cblxuICBlbSh7IHRleHQgfTogVG9rZW5zLkVtKTogUmVuZGVyZXJPdXRwdXQge1xuICAgIHJldHVybiB0ZXh0IGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgY29kZXNwYW4oeyB0ZXh0IH06IFRva2Vucy5Db2Rlc3Bhbik6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICByZXR1cm4gdGV4dCBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIGRlbCh7IHRleHQgfTogVG9rZW5zLkRlbCk6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICByZXR1cm4gdGV4dCBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIGh0bWwoeyB0ZXh0IH06IFRva2Vucy5IVE1MIHwgVG9rZW5zLlRhZyk6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICByZXR1cm4gdGV4dCBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIHRleHQoeyB0ZXh0IH06IFRva2Vucy5UZXh0IHwgVG9rZW5zLkVzY2FwZSB8IFRva2Vucy5UYWcpOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuIHRleHQgYXMgUmVuZGVyZXJPdXRwdXQ7XG4gIH1cblxuICBsaW5rKHsgdGV4dCB9OiBUb2tlbnMuTGluayk6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICByZXR1cm4gJycgKyB0ZXh0IGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgaW1hZ2UoeyB0ZXh0IH06IFRva2Vucy5JbWFnZSk6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICByZXR1cm4gJycgKyB0ZXh0IGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgYnIoKTogUmVuZGVyZXJPdXRwdXQge1xuICAgIHJldHVybiAnJyBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIGNoZWNrYm94KHsgcmF3IH06IFRva2Vucy5DaGVja2JveCk6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICByZXR1cm4gcmF3IGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgX1JlbmRlcmVyIH0gZnJvbSAnLi9SZW5kZXJlci50cyc7XG5pbXBvcnQgeyBfVGV4dFJlbmRlcmVyIH0gZnJvbSAnLi9UZXh0UmVuZGVyZXIudHMnO1xuaW1wb3J0IHsgX2RlZmF1bHRzIH0gZnJvbSAnLi9kZWZhdWx0cy50cyc7XG5pbXBvcnQgdHlwZSB7IE1hcmtlZFRva2VuLCBUb2tlbiwgVG9rZW5zIH0gZnJvbSAnLi9Ub2tlbnMudHMnO1xuaW1wb3J0IHR5cGUgeyBNYXJrZWRPcHRpb25zIH0gZnJvbSAnLi9NYXJrZWRPcHRpb25zLnRzJztcblxuLyoqXG4gKiBQYXJzaW5nICYgQ29tcGlsaW5nXG4gKi9cbmV4cG9ydCBjbGFzcyBfUGFyc2VyPFBhcnNlck91dHB1dCA9IHN0cmluZywgUmVuZGVyZXJPdXRwdXQgPSBzdHJpbmc+IHtcbiAgb3B0aW9uczogTWFya2VkT3B0aW9uczxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0PjtcbiAgcmVuZGVyZXI6IF9SZW5kZXJlcjxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0PjtcbiAgdGV4dFJlbmRlcmVyOiBfVGV4dFJlbmRlcmVyPFJlbmRlcmVyT3V0cHV0PjtcbiAgY29uc3RydWN0b3Iob3B0aW9ucz86IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4pIHtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IF9kZWZhdWx0cztcbiAgICB0aGlzLm9wdGlvbnMucmVuZGVyZXIgPSB0aGlzLm9wdGlvbnMucmVuZGVyZXIgfHwgbmV3IF9SZW5kZXJlcjxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0PigpO1xuICAgIHRoaXMucmVuZGVyZXIgPSB0aGlzLm9wdGlvbnMucmVuZGVyZXI7XG4gICAgdGhpcy5yZW5kZXJlci5vcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgIHRoaXMucmVuZGVyZXIucGFyc2VyID0gdGhpcztcbiAgICB0aGlzLnRleHRSZW5kZXJlciA9IG5ldyBfVGV4dFJlbmRlcmVyPFJlbmRlcmVyT3V0cHV0PigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXRpYyBQYXJzZSBNZXRob2RcbiAgICovXG4gIHN0YXRpYyBwYXJzZTxQYXJzZXJPdXRwdXQgPSBzdHJpbmcsIFJlbmRlcmVyT3V0cHV0ID0gc3RyaW5nPih0b2tlbnM6IFRva2VuW10sIG9wdGlvbnM/OiBNYXJrZWRPcHRpb25zPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+KSB7XG4gICAgY29uc3QgcGFyc2VyID0gbmV3IF9QYXJzZXI8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4ob3B0aW9ucyk7XG4gICAgcmV0dXJuIHBhcnNlci5wYXJzZSh0b2tlbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXRpYyBQYXJzZSBJbmxpbmUgTWV0aG9kXG4gICAqL1xuICBzdGF0aWMgcGFyc2VJbmxpbmU8UGFyc2VyT3V0cHV0ID0gc3RyaW5nLCBSZW5kZXJlck91dHB1dCA9IHN0cmluZz4odG9rZW5zOiBUb2tlbltdLCBvcHRpb25zPzogTWFya2VkT3B0aW9uczxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0Pikge1xuICAgIGNvbnN0IHBhcnNlciA9IG5ldyBfUGFyc2VyPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+KG9wdGlvbnMpO1xuICAgIHJldHVybiBwYXJzZXIucGFyc2VJbmxpbmUodG9rZW5zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBMb29wXG4gICAqL1xuICBwYXJzZSh0b2tlbnM6IFRva2VuW10pOiBQYXJzZXJPdXRwdXQge1xuICAgIHRoaXMucmVuZGVyZXIucGFyc2VyID0gdGhpcztcbiAgICBsZXQgb3V0ID0gJyc7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgYW55VG9rZW4gPSB0b2tlbnNbaV07XG5cbiAgICAgIC8vIFJ1biBhbnkgcmVuZGVyZXIgZXh0ZW5zaW9uc1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5leHRlbnNpb25zPy5yZW5kZXJlcnM/LlthbnlUb2tlbi50eXBlXSkge1xuICAgICAgICBjb25zdCBnZW5lcmljVG9rZW4gPSBhbnlUb2tlbiBhcyBUb2tlbnMuR2VuZXJpYztcbiAgICAgICAgY29uc3QgcmV0ID0gdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMucmVuZGVyZXJzW2dlbmVyaWNUb2tlbi50eXBlXS5jYWxsKHsgcGFyc2VyOiB0aGlzIH0sIGdlbmVyaWNUb2tlbik7XG4gICAgICAgIGlmIChyZXQgIT09IGZhbHNlIHx8ICFbJ3NwYWNlJywgJ2hyJywgJ2hlYWRpbmcnLCAnY29kZScsICd0YWJsZScsICdibG9ja3F1b3RlJywgJ2xpc3QnLCAnaHRtbCcsICdkZWYnLCAncGFyYWdyYXBoJywgJ3RleHQnXS5pbmNsdWRlcyhnZW5lcmljVG9rZW4udHlwZSkpIHtcbiAgICAgICAgICBvdXQgKz0gcmV0IHx8ICcnO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRva2VuID0gYW55VG9rZW4gYXMgTWFya2VkVG9rZW47XG5cbiAgICAgIHN3aXRjaCAodG9rZW4udHlwZSkge1xuICAgICAgICBjYXNlICdzcGFjZSc6IHtcbiAgICAgICAgICBvdXQgKz0gdGhpcy5yZW5kZXJlci5zcGFjZSh0b2tlbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnaHInOiB7XG4gICAgICAgICAgb3V0ICs9IHRoaXMucmVuZGVyZXIuaHIodG9rZW4pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2hlYWRpbmcnOiB7XG4gICAgICAgICAgb3V0ICs9IHRoaXMucmVuZGVyZXIuaGVhZGluZyh0b2tlbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnY29kZSc6IHtcbiAgICAgICAgICBvdXQgKz0gdGhpcy5yZW5kZXJlci5jb2RlKHRva2VuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0YWJsZSc6IHtcbiAgICAgICAgICBvdXQgKz0gdGhpcy5yZW5kZXJlci50YWJsZSh0b2tlbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnYmxvY2txdW90ZSc6IHtcbiAgICAgICAgICBvdXQgKz0gdGhpcy5yZW5kZXJlci5ibG9ja3F1b3RlKHRva2VuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdsaXN0Jzoge1xuICAgICAgICAgIG91dCArPSB0aGlzLnJlbmRlcmVyLmxpc3QodG9rZW4pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2NoZWNrYm94Jzoge1xuICAgICAgICAgIG91dCArPSB0aGlzLnJlbmRlcmVyLmNoZWNrYm94KHRva2VuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdodG1sJzoge1xuICAgICAgICAgIG91dCArPSB0aGlzLnJlbmRlcmVyLmh0bWwodG9rZW4pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RlZic6IHtcbiAgICAgICAgICBvdXQgKz0gdGhpcy5yZW5kZXJlci5kZWYodG9rZW4pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3BhcmFncmFwaCc6IHtcbiAgICAgICAgICBvdXQgKz0gdGhpcy5yZW5kZXJlci5wYXJhZ3JhcGgodG9rZW4pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3RleHQnOiB7XG4gICAgICAgICAgb3V0ICs9IHRoaXMucmVuZGVyZXIudGV4dCh0b2tlbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgY29uc3QgZXJyTXNnID0gJ1Rva2VuIHdpdGggXCInICsgdG9rZW4udHlwZSArICdcIiB0eXBlIHdhcyBub3QgZm91bmQuJztcbiAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNpbGVudCkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJNc2cpO1xuICAgICAgICAgICAgcmV0dXJuICcnIGFzIFBhcnNlck91dHB1dDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVyck1zZyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dCBhcyBQYXJzZXJPdXRwdXQ7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgSW5saW5lIFRva2Vuc1xuICAgKi9cbiAgcGFyc2VJbmxpbmUodG9rZW5zOiBUb2tlbltdLCByZW5kZXJlcjogX1JlbmRlcmVyPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+IHwgX1RleHRSZW5kZXJlcjxSZW5kZXJlck91dHB1dD4gPSB0aGlzLnJlbmRlcmVyKTogUGFyc2VyT3V0cHV0IHtcbiAgICB0aGlzLnJlbmRlcmVyLnBhcnNlciA9IHRoaXM7XG4gICAgbGV0IG91dCA9ICcnO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGFueVRva2VuID0gdG9rZW5zW2ldO1xuXG4gICAgICAvLyBSdW4gYW55IHJlbmRlcmVyIGV4dGVuc2lvbnNcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucz8ucmVuZGVyZXJzPy5bYW55VG9rZW4udHlwZV0pIHtcbiAgICAgICAgY29uc3QgcmV0ID0gdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMucmVuZGVyZXJzW2FueVRva2VuLnR5cGVdLmNhbGwoeyBwYXJzZXI6IHRoaXMgfSwgYW55VG9rZW4pO1xuICAgICAgICBpZiAocmV0ICE9PSBmYWxzZSB8fCAhWydlc2NhcGUnLCAnaHRtbCcsICdsaW5rJywgJ2ltYWdlJywgJ3N0cm9uZycsICdlbScsICdjb2Rlc3BhbicsICdicicsICdkZWwnLCAndGV4dCddLmluY2x1ZGVzKGFueVRva2VuLnR5cGUpKSB7XG4gICAgICAgICAgb3V0ICs9IHJldCB8fCAnJztcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCB0b2tlbiA9IGFueVRva2VuIGFzIE1hcmtlZFRva2VuO1xuXG4gICAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnZXNjYXBlJzoge1xuICAgICAgICAgIG91dCArPSByZW5kZXJlci50ZXh0KHRva2VuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdodG1sJzoge1xuICAgICAgICAgIG91dCArPSByZW5kZXJlci5odG1sKHRva2VuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdsaW5rJzoge1xuICAgICAgICAgIG91dCArPSByZW5kZXJlci5saW5rKHRva2VuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdpbWFnZSc6IHtcbiAgICAgICAgICBvdXQgKz0gcmVuZGVyZXIuaW1hZ2UodG9rZW4pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2NoZWNrYm94Jzoge1xuICAgICAgICAgIG91dCArPSByZW5kZXJlci5jaGVja2JveCh0b2tlbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc3Ryb25nJzoge1xuICAgICAgICAgIG91dCArPSByZW5kZXJlci5zdHJvbmcodG9rZW4pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2VtJzoge1xuICAgICAgICAgIG91dCArPSByZW5kZXJlci5lbSh0b2tlbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnY29kZXNwYW4nOiB7XG4gICAgICAgICAgb3V0ICs9IHJlbmRlcmVyLmNvZGVzcGFuKHRva2VuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdicic6IHtcbiAgICAgICAgICBvdXQgKz0gcmVuZGVyZXIuYnIodG9rZW4pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RlbCc6IHtcbiAgICAgICAgICBvdXQgKz0gcmVuZGVyZXIuZGVsKHRva2VuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0ZXh0Jzoge1xuICAgICAgICAgIG91dCArPSByZW5kZXJlci50ZXh0KHRva2VuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgY29uc3QgZXJyTXNnID0gJ1Rva2VuIHdpdGggXCInICsgdG9rZW4udHlwZSArICdcIiB0eXBlIHdhcyBub3QgZm91bmQuJztcbiAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNpbGVudCkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJNc2cpO1xuICAgICAgICAgICAgcmV0dXJuICcnIGFzIFBhcnNlck91dHB1dDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVyck1zZyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXQgYXMgUGFyc2VyT3V0cHV0O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgX2RlZmF1bHRzIH0gZnJvbSAnLi9kZWZhdWx0cy50cyc7XG5pbXBvcnQgeyBfTGV4ZXIgfSBmcm9tICcuL0xleGVyLnRzJztcbmltcG9ydCB7IF9QYXJzZXIgfSBmcm9tICcuL1BhcnNlci50cyc7XG5pbXBvcnQgdHlwZSB7IE1hcmtlZE9wdGlvbnMgfSBmcm9tICcuL01hcmtlZE9wdGlvbnMudHMnO1xuaW1wb3J0IHR5cGUgeyBUb2tlbiwgVG9rZW5zTGlzdCB9IGZyb20gJy4vVG9rZW5zLnRzJztcblxuZXhwb3J0IGNsYXNzIF9Ib29rczxQYXJzZXJPdXRwdXQgPSBzdHJpbmcsIFJlbmRlcmVyT3V0cHV0ID0gc3RyaW5nPiB7XG4gIG9wdGlvbnM6IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD47XG4gIGJsb2NrPzogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zPzogTWFya2VkT3B0aW9uczxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0Pikge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwgX2RlZmF1bHRzO1xuICB9XG5cbiAgc3RhdGljIHBhc3NUaHJvdWdoSG9va3MgPSBuZXcgU2V0KFtcbiAgICAncHJlcHJvY2VzcycsXG4gICAgJ3Bvc3Rwcm9jZXNzJyxcbiAgICAncHJvY2Vzc0FsbFRva2VucycsXG4gICAgJ2VtU3Ryb25nTWFzaycsXG4gIF0pO1xuXG4gIHN0YXRpYyBwYXNzVGhyb3VnaEhvb2tzUmVzcGVjdEFzeW5jID0gbmV3IFNldChbXG4gICAgJ3ByZXByb2Nlc3MnLFxuICAgICdwb3N0cHJvY2VzcycsXG4gICAgJ3Byb2Nlc3NBbGxUb2tlbnMnLFxuICBdKTtcblxuICAvKipcbiAgICogUHJvY2VzcyBtYXJrZG93biBiZWZvcmUgbWFya2VkXG4gICAqL1xuICBwcmVwcm9jZXNzKG1hcmtkb3duOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gbWFya2Rvd247XG4gIH1cblxuICAvKipcbiAgICogUHJvY2VzcyBIVE1MIGFmdGVyIG1hcmtlZCBpcyBmaW5pc2hlZFxuICAgKi9cbiAgcG9zdHByb2Nlc3MoaHRtbDogUGFyc2VyT3V0cHV0KSB7XG4gICAgcmV0dXJuIGh0bWw7XG4gIH1cblxuICAvKipcbiAgICogUHJvY2VzcyBhbGwgdG9rZW5zIGJlZm9yZSB3YWxrIHRva2Vuc1xuICAgKi9cbiAgcHJvY2Vzc0FsbFRva2Vucyh0b2tlbnM6IFRva2VuW10gfCBUb2tlbnNMaXN0KSB7XG4gICAgcmV0dXJuIHRva2VucztcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXNrIGNvbnRlbnRzIHRoYXQgc2hvdWxkIG5vdCBiZSBpbnRlcnByZXRlZCBhcyBlbS9zdHJvbmcgZGVsaW1pdGVyc1xuICAgKi9cbiAgZW1TdHJvbmdNYXNrKHNyYzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHNyYztcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm92aWRlIGZ1bmN0aW9uIHRvIHRva2VuaXplIG1hcmtkb3duXG4gICAqL1xuICBwcm92aWRlTGV4ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuYmxvY2sgPyBfTGV4ZXIubGV4IDogX0xleGVyLmxleElubGluZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm92aWRlIGZ1bmN0aW9uIHRvIHBhcnNlIHRva2Vuc1xuICAgKi9cbiAgcHJvdmlkZVBhcnNlcigpIHtcbiAgICByZXR1cm4gdGhpcy5ibG9jayA/IF9QYXJzZXIucGFyc2U8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4gOiBfUGFyc2VyLnBhcnNlSW5saW5lPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgX2dldERlZmF1bHRzIH0gZnJvbSAnLi9kZWZhdWx0cy50cyc7XG5pbXBvcnQgeyBfTGV4ZXIgfSBmcm9tICcuL0xleGVyLnRzJztcbmltcG9ydCB7IF9QYXJzZXIgfSBmcm9tICcuL1BhcnNlci50cyc7XG5pbXBvcnQgeyBfSG9va3MgfSBmcm9tICcuL0hvb2tzLnRzJztcbmltcG9ydCB7IF9SZW5kZXJlciB9IGZyb20gJy4vUmVuZGVyZXIudHMnO1xuaW1wb3J0IHsgX1Rva2VuaXplciB9IGZyb20gJy4vVG9rZW5pemVyLnRzJztcbmltcG9ydCB7IF9UZXh0UmVuZGVyZXIgfSBmcm9tICcuL1RleHRSZW5kZXJlci50cyc7XG5pbXBvcnQgeyBlc2NhcGVIdG1sRW50aXRpZXMgfSBmcm9tICcuL2hlbHBlcnMudHMnO1xuaW1wb3J0IHR5cGUgeyBNYXJrZWRFeHRlbnNpb24sIE1hcmtlZE9wdGlvbnMgfSBmcm9tICcuL01hcmtlZE9wdGlvbnMudHMnO1xuaW1wb3J0IHR5cGUgeyBUb2tlbiwgVG9rZW5zLCBUb2tlbnNMaXN0IH0gZnJvbSAnLi9Ub2tlbnMudHMnO1xuXG5leHBvcnQgdHlwZSBNYXliZVByb21pc2UgPSB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcblxudHlwZSBVbmtub3duRnVuY3Rpb24gPSAoLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duO1xudHlwZSBHZW5lcmljUmVuZGVyZXJGdW5jdGlvbiA9ICguLi5hcmdzOiB1bmtub3duW10pID0+IHN0cmluZyB8IGZhbHNlO1xuXG5leHBvcnQgY2xhc3MgTWFya2VkPFBhcnNlck91dHB1dCA9IHN0cmluZywgUmVuZGVyZXJPdXRwdXQgPSBzdHJpbmc+IHtcbiAgZGVmYXVsdHMgPSBfZ2V0RGVmYXVsdHM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4oKTtcbiAgb3B0aW9ucyA9IHRoaXMuc2V0T3B0aW9ucztcblxuICBwYXJzZSA9IHRoaXMucGFyc2VNYXJrZG93bih0cnVlKTtcbiAgcGFyc2VJbmxpbmUgPSB0aGlzLnBhcnNlTWFya2Rvd24oZmFsc2UpO1xuXG4gIFBhcnNlciA9IF9QYXJzZXI8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD47XG4gIFJlbmRlcmVyID0gX1JlbmRlcmVyPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+O1xuICBUZXh0UmVuZGVyZXIgPSBfVGV4dFJlbmRlcmVyPFJlbmRlcmVyT3V0cHV0PjtcbiAgTGV4ZXIgPSBfTGV4ZXI7XG4gIFRva2VuaXplciA9IF9Ub2tlbml6ZXI8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD47XG4gIEhvb2tzID0gX0hvb2tzPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+O1xuXG4gIGNvbnN0cnVjdG9yKC4uLmFyZ3M6IE1hcmtlZEV4dGVuc2lvbjxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0PltdKSB7XG4gICAgdGhpcy51c2UoLi4uYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogUnVuIGNhbGxiYWNrIGZvciBldmVyeSB0b2tlblxuICAgKi9cbiAgd2Fsa1Rva2Vucyh0b2tlbnM6IFRva2VuW10gfCBUb2tlbnNMaXN0LCBjYWxsYmFjazogKHRva2VuOiBUb2tlbikgPT4gTWF5YmVQcm9taXNlIHwgTWF5YmVQcm9taXNlW10pIHtcbiAgICBsZXQgdmFsdWVzOiBNYXliZVByb21pc2VbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdG9rZW5zKSB7XG4gICAgICB2YWx1ZXMgPSB2YWx1ZXMuY29uY2F0KGNhbGxiYWNrLmNhbGwodGhpcywgdG9rZW4pKTtcbiAgICAgIHN3aXRjaCAodG9rZW4udHlwZSkge1xuICAgICAgICBjYXNlICd0YWJsZSc6IHtcbiAgICAgICAgICBjb25zdCB0YWJsZVRva2VuID0gdG9rZW4gYXMgVG9rZW5zLlRhYmxlO1xuICAgICAgICAgIGZvciAoY29uc3QgY2VsbCBvZiB0YWJsZVRva2VuLmhlYWRlcikge1xuICAgICAgICAgICAgdmFsdWVzID0gdmFsdWVzLmNvbmNhdCh0aGlzLndhbGtUb2tlbnMoY2VsbC50b2tlbnMsIGNhbGxiYWNrKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvciAoY29uc3Qgcm93IG9mIHRhYmxlVG9rZW4ucm93cykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBjZWxsIG9mIHJvdykge1xuICAgICAgICAgICAgICB2YWx1ZXMgPSB2YWx1ZXMuY29uY2F0KHRoaXMud2Fsa1Rva2VucyhjZWxsLnRva2VucywgY2FsbGJhY2spKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnbGlzdCc6IHtcbiAgICAgICAgICBjb25zdCBsaXN0VG9rZW4gPSB0b2tlbiBhcyBUb2tlbnMuTGlzdDtcbiAgICAgICAgICB2YWx1ZXMgPSB2YWx1ZXMuY29uY2F0KHRoaXMud2Fsa1Rva2VucyhsaXN0VG9rZW4uaXRlbXMsIGNhbGxiYWNrKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIGNvbnN0IGdlbmVyaWNUb2tlbiA9IHRva2VuIGFzIFRva2Vucy5HZW5lcmljO1xuICAgICAgICAgIGlmICh0aGlzLmRlZmF1bHRzLmV4dGVuc2lvbnM/LmNoaWxkVG9rZW5zPy5bZ2VuZXJpY1Rva2VuLnR5cGVdKSB7XG4gICAgICAgICAgICB0aGlzLmRlZmF1bHRzLmV4dGVuc2lvbnMuY2hpbGRUb2tlbnNbZ2VuZXJpY1Rva2VuLnR5cGVdLmZvckVhY2goKGNoaWxkVG9rZW5zKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHRva2VucyA9IGdlbmVyaWNUb2tlbltjaGlsZFRva2Vuc10uZmxhdChJbmZpbml0eSkgYXMgVG9rZW5bXSB8IFRva2Vuc0xpc3Q7XG4gICAgICAgICAgICAgIHZhbHVlcyA9IHZhbHVlcy5jb25jYXQodGhpcy53YWxrVG9rZW5zKHRva2VucywgY2FsbGJhY2spKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZ2VuZXJpY1Rva2VuLnRva2Vucykge1xuICAgICAgICAgICAgdmFsdWVzID0gdmFsdWVzLmNvbmNhdCh0aGlzLndhbGtUb2tlbnMoZ2VuZXJpY1Rva2VuLnRva2VucywgY2FsbGJhY2spKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfVxuXG4gIHVzZSguLi5hcmdzOiBNYXJrZWRFeHRlbnNpb248UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD5bXSkge1xuICAgIGNvbnN0IGV4dGVuc2lvbnM6IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD5bJ2V4dGVuc2lvbnMnXSA9IHRoaXMuZGVmYXVsdHMuZXh0ZW5zaW9ucyB8fCB7IHJlbmRlcmVyczoge30sIGNoaWxkVG9rZW5zOiB7fSB9O1xuXG4gICAgYXJncy5mb3JFYWNoKChwYWNrKSA9PiB7XG4gICAgICAvLyBjb3B5IG9wdGlvbnMgdG8gbmV3IG9iamVjdFxuICAgICAgY29uc3Qgb3B0cyA9IHsgLi4ucGFjayB9IGFzIE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD47XG5cbiAgICAgIC8vIHNldCBhc3luYyB0byB0cnVlIGlmIGl0IHdhcyBzZXQgdG8gdHJ1ZSBiZWZvcmVcbiAgICAgIG9wdHMuYXN5bmMgPSB0aGlzLmRlZmF1bHRzLmFzeW5jIHx8IG9wdHMuYXN5bmMgfHwgZmFsc2U7XG5cbiAgICAgIC8vID09LS0gUGFyc2UgXCJhZGRvblwiIGV4dGVuc2lvbnMgLS09PSAvL1xuICAgICAgaWYgKHBhY2suZXh0ZW5zaW9ucykge1xuICAgICAgICBwYWNrLmV4dGVuc2lvbnMuZm9yRWFjaCgoZXh0KSA9PiB7XG4gICAgICAgICAgaWYgKCFleHQubmFtZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHRlbnNpb24gbmFtZSByZXF1aXJlZCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoJ3JlbmRlcmVyJyBpbiBleHQpIHsgLy8gUmVuZGVyZXIgZXh0ZW5zaW9uc1xuICAgICAgICAgICAgY29uc3QgcHJldlJlbmRlcmVyID0gZXh0ZW5zaW9ucy5yZW5kZXJlcnNbZXh0Lm5hbWVdO1xuICAgICAgICAgICAgaWYgKHByZXZSZW5kZXJlcikge1xuICAgICAgICAgICAgICAvLyBSZXBsYWNlIGV4dGVuc2lvbiB3aXRoIGZ1bmMgdG8gcnVuIG5ldyBleHRlbnNpb24gYnV0IGZhbGwgYmFjayBpZiBmYWxzZVxuICAgICAgICAgICAgICBleHRlbnNpb25zLnJlbmRlcmVyc1tleHQubmFtZV0gPSBmdW5jdGlvbiguLi5hcmdzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJldCA9IGV4dC5yZW5kZXJlci5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgICAgICAgICBpZiAocmV0ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgcmV0ID0gcHJldlJlbmRlcmVyLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZXh0ZW5zaW9ucy5yZW5kZXJlcnNbZXh0Lm5hbWVdID0gZXh0LnJlbmRlcmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoJ3Rva2VuaXplcicgaW4gZXh0KSB7IC8vIFRva2VuaXplciBFeHRlbnNpb25zXG4gICAgICAgICAgICBpZiAoIWV4dC5sZXZlbCB8fCAoZXh0LmxldmVsICE9PSAnYmxvY2snICYmIGV4dC5sZXZlbCAhPT0gJ2lubGluZScpKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImV4dGVuc2lvbiBsZXZlbCBtdXN0IGJlICdibG9jaycgb3IgJ2lubGluZSdcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBleHRMZXZlbCA9IGV4dGVuc2lvbnNbZXh0LmxldmVsXTtcbiAgICAgICAgICAgIGlmIChleHRMZXZlbCkge1xuICAgICAgICAgICAgICBleHRMZXZlbC51bnNoaWZ0KGV4dC50b2tlbml6ZXIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZXh0ZW5zaW9uc1tleHQubGV2ZWxdID0gW2V4dC50b2tlbml6ZXJdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV4dC5zdGFydCkgeyAvLyBGdW5jdGlvbiB0byBjaGVjayBmb3Igc3RhcnQgb2YgdG9rZW5cbiAgICAgICAgICAgICAgaWYgKGV4dC5sZXZlbCA9PT0gJ2Jsb2NrJykge1xuICAgICAgICAgICAgICAgIGlmIChleHRlbnNpb25zLnN0YXJ0QmxvY2spIHtcbiAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMuc3RhcnRCbG9jay5wdXNoKGV4dC5zdGFydCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMuc3RhcnRCbG9jayA9IFtleHQuc3RhcnRdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChleHQubGV2ZWwgPT09ICdpbmxpbmUnKSB7XG4gICAgICAgICAgICAgICAgaWYgKGV4dGVuc2lvbnMuc3RhcnRJbmxpbmUpIHtcbiAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMuc3RhcnRJbmxpbmUucHVzaChleHQuc3RhcnQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBleHRlbnNpb25zLnN0YXJ0SW5saW5lID0gW2V4dC5zdGFydF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICgnY2hpbGRUb2tlbnMnIGluIGV4dCAmJiBleHQuY2hpbGRUb2tlbnMpIHsgLy8gQ2hpbGQgdG9rZW5zIHRvIGJlIHZpc2l0ZWQgYnkgd2Fsa1Rva2Vuc1xuICAgICAgICAgICAgZXh0ZW5zaW9ucy5jaGlsZFRva2Vuc1tleHQubmFtZV0gPSBleHQuY2hpbGRUb2tlbnM7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgb3B0cy5leHRlbnNpb25zID0gZXh0ZW5zaW9ucztcbiAgICAgIH1cblxuICAgICAgLy8gPT0tLSBQYXJzZSBcIm92ZXJ3cml0ZVwiIGV4dGVuc2lvbnMgLS09PSAvL1xuICAgICAgaWYgKHBhY2sucmVuZGVyZXIpIHtcbiAgICAgICAgY29uc3QgcmVuZGVyZXIgPSB0aGlzLmRlZmF1bHRzLnJlbmRlcmVyIHx8IG5ldyBfUmVuZGVyZXI8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4odGhpcy5kZWZhdWx0cyk7XG4gICAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBwYWNrLnJlbmRlcmVyKSB7XG4gICAgICAgICAgaWYgKCEocHJvcCBpbiByZW5kZXJlcikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgcmVuZGVyZXIgJyR7cHJvcH0nIGRvZXMgbm90IGV4aXN0YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChbJ29wdGlvbnMnLCAncGFyc2VyJ10uaW5jbHVkZXMocHJvcCkpIHtcbiAgICAgICAgICAgIC8vIGlnbm9yZSBvcHRpb25zIHByb3BlcnR5XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcmVuZGVyZXJQcm9wID0gcHJvcCBhcyBFeGNsdWRlPGtleW9mIF9SZW5kZXJlcjxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0PiwgJ29wdGlvbnMnIHwgJ3BhcnNlcic+O1xuICAgICAgICAgIGNvbnN0IHJlbmRlcmVyRnVuYyA9IHBhY2sucmVuZGVyZXJbcmVuZGVyZXJQcm9wXSBhcyBHZW5lcmljUmVuZGVyZXJGdW5jdGlvbjtcbiAgICAgICAgICBjb25zdCBwcmV2UmVuZGVyZXIgPSByZW5kZXJlcltyZW5kZXJlclByb3BdIGFzIEdlbmVyaWNSZW5kZXJlckZ1bmN0aW9uO1xuICAgICAgICAgIC8vIFJlcGxhY2UgcmVuZGVyZXIgd2l0aCBmdW5jIHRvIHJ1biBleHRlbnNpb24sIGJ1dCBmYWxsIGJhY2sgaWYgZmFsc2VcbiAgICAgICAgICByZW5kZXJlcltyZW5kZXJlclByb3BdID0gKC4uLmFyZ3M6IHVua25vd25bXSkgPT4ge1xuICAgICAgICAgICAgbGV0IHJldCA9IHJlbmRlcmVyRnVuYy5hcHBseShyZW5kZXJlciwgYXJncyk7XG4gICAgICAgICAgICBpZiAocmV0ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICByZXQgPSBwcmV2UmVuZGVyZXIuYXBwbHkocmVuZGVyZXIsIGFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIChyZXQgfHwgJycpIGFzIFJlbmRlcmVyT3V0cHV0O1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgb3B0cy5yZW5kZXJlciA9IHJlbmRlcmVyO1xuICAgICAgfVxuICAgICAgaWYgKHBhY2sudG9rZW5pemVyKSB7XG4gICAgICAgIGNvbnN0IHRva2VuaXplciA9IHRoaXMuZGVmYXVsdHMudG9rZW5pemVyIHx8IG5ldyBfVG9rZW5pemVyPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+KHRoaXMuZGVmYXVsdHMpO1xuICAgICAgICBmb3IgKGNvbnN0IHByb3AgaW4gcGFjay50b2tlbml6ZXIpIHtcbiAgICAgICAgICBpZiAoIShwcm9wIGluIHRva2VuaXplcikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdG9rZW5pemVyICcke3Byb3B9JyBkb2VzIG5vdCBleGlzdGApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoWydvcHRpb25zJywgJ3J1bGVzJywgJ2xleGVyJ10uaW5jbHVkZXMocHJvcCkpIHtcbiAgICAgICAgICAgIC8vIGlnbm9yZSBvcHRpb25zLCBydWxlcywgYW5kIGxleGVyIHByb3BlcnRpZXNcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB0b2tlbml6ZXJQcm9wID0gcHJvcCBhcyBFeGNsdWRlPGtleW9mIF9Ub2tlbml6ZXI8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4sICdvcHRpb25zJyB8ICdydWxlcycgfCAnbGV4ZXInPjtcbiAgICAgICAgICBjb25zdCB0b2tlbml6ZXJGdW5jID0gcGFjay50b2tlbml6ZXJbdG9rZW5pemVyUHJvcF0gYXMgVW5rbm93bkZ1bmN0aW9uO1xuICAgICAgICAgIGNvbnN0IHByZXZUb2tlbml6ZXIgPSB0b2tlbml6ZXJbdG9rZW5pemVyUHJvcF0gYXMgVW5rbm93bkZ1bmN0aW9uO1xuICAgICAgICAgIC8vIFJlcGxhY2UgdG9rZW5pemVyIHdpdGggZnVuYyB0byBydW4gZXh0ZW5zaW9uLCBidXQgZmFsbCBiYWNrIGlmIGZhbHNlXG4gICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBjYW5ub3QgdHlwZSB0b2tlbml6ZXIgZnVuY3Rpb24gZHluYW1pY2FsbHlcbiAgICAgICAgICB0b2tlbml6ZXJbdG9rZW5pemVyUHJvcF0gPSAoLi4uYXJnczogdW5rbm93bltdKSA9PiB7XG4gICAgICAgICAgICBsZXQgcmV0ID0gdG9rZW5pemVyRnVuYy5hcHBseSh0b2tlbml6ZXIsIGFyZ3MpO1xuICAgICAgICAgICAgaWYgKHJldCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgcmV0ID0gcHJldlRva2VuaXplci5hcHBseSh0b2tlbml6ZXIsIGFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIG9wdHMudG9rZW5pemVyID0gdG9rZW5pemVyO1xuICAgICAgfVxuXG4gICAgICAvLyA9PS0tIFBhcnNlIEhvb2tzIGV4dGVuc2lvbnMgLS09PSAvL1xuICAgICAgaWYgKHBhY2suaG9va3MpIHtcbiAgICAgICAgY29uc3QgaG9va3MgPSB0aGlzLmRlZmF1bHRzLmhvb2tzIHx8IG5ldyBfSG9va3M8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4oKTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wIGluIHBhY2suaG9va3MpIHtcbiAgICAgICAgICBpZiAoIShwcm9wIGluIGhvb2tzKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBob29rICcke3Byb3B9JyBkb2VzIG5vdCBleGlzdGApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoWydvcHRpb25zJywgJ2Jsb2NrJ10uaW5jbHVkZXMocHJvcCkpIHtcbiAgICAgICAgICAgIC8vIGlnbm9yZSBvcHRpb25zIGFuZCBibG9jayBwcm9wZXJ0aWVzXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgaG9va3NQcm9wID0gcHJvcCBhcyBFeGNsdWRlPGtleW9mIF9Ib29rczxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0PiwgJ29wdGlvbnMnIHwgJ2Jsb2NrJz47XG4gICAgICAgICAgY29uc3QgaG9va3NGdW5jID0gcGFjay5ob29rc1tob29rc1Byb3BdIGFzIFVua25vd25GdW5jdGlvbjtcbiAgICAgICAgICBjb25zdCBwcmV2SG9vayA9IGhvb2tzW2hvb2tzUHJvcF0gYXMgVW5rbm93bkZ1bmN0aW9uO1xuICAgICAgICAgIGlmIChfSG9va3MucGFzc1Rocm91Z2hIb29rcy5oYXMocHJvcCkpIHtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgY2Fubm90IHR5cGUgaG9vayBmdW5jdGlvbiBkeW5hbWljYWxseVxuICAgICAgICAgICAgaG9va3NbaG9va3NQcm9wXSA9IChhcmc6IHVua25vd24pID0+IHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuZGVmYXVsdHMuYXN5bmMgJiYgX0hvb2tzLnBhc3NUaHJvdWdoSG9va3NSZXNwZWN0QXN5bmMuaGFzKHByb3ApKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChhc3luYygpID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJldCA9IGF3YWl0IGhvb2tzRnVuYy5jYWxsKGhvb2tzLCBhcmcpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHByZXZIb29rLmNhbGwoaG9va3MsIHJldCk7XG4gICAgICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNvbnN0IHJldCA9IGhvb2tzRnVuYy5jYWxsKGhvb2tzLCBhcmcpO1xuICAgICAgICAgICAgICByZXR1cm4gcHJldkhvb2suY2FsbChob29rcywgcmV0KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgY2Fubm90IHR5cGUgaG9vayBmdW5jdGlvbiBkeW5hbWljYWxseVxuICAgICAgICAgICAgaG9va3NbaG9va3NQcm9wXSA9ICguLi5hcmdzOiB1bmtub3duW10pID0+IHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuZGVmYXVsdHMuYXN5bmMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKGFzeW5jKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgbGV0IHJldCA9IGF3YWl0IGhvb2tzRnVuYy5hcHBseShob29rcywgYXJncyk7XG4gICAgICAgICAgICAgICAgICBpZiAocmV0ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICByZXQgPSBhd2FpdCBwcmV2SG9vay5hcHBseShob29rcywgYXJncyk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICAgICAgICAgIH0pKCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBsZXQgcmV0ID0gaG9va3NGdW5jLmFwcGx5KGhvb2tzLCBhcmdzKTtcbiAgICAgICAgICAgICAgaWYgKHJldCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXQgPSBwcmV2SG9vay5hcHBseShob29rcywgYXJncyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG9wdHMuaG9va3MgPSBob29rcztcbiAgICAgIH1cblxuICAgICAgLy8gPT0tLSBQYXJzZSBXYWxrVG9rZW5zIGV4dGVuc2lvbnMgLS09PSAvL1xuICAgICAgaWYgKHBhY2sud2Fsa1Rva2Vucykge1xuICAgICAgICBjb25zdCB3YWxrVG9rZW5zID0gdGhpcy5kZWZhdWx0cy53YWxrVG9rZW5zO1xuICAgICAgICBjb25zdCBwYWNrV2Fsa3Rva2VucyA9IHBhY2sud2Fsa1Rva2VucztcbiAgICAgICAgb3B0cy53YWxrVG9rZW5zID0gZnVuY3Rpb24odG9rZW4pIHtcbiAgICAgICAgICBsZXQgdmFsdWVzOiBNYXliZVByb21pc2VbXSA9IFtdO1xuICAgICAgICAgIHZhbHVlcy5wdXNoKHBhY2tXYWxrdG9rZW5zLmNhbGwodGhpcywgdG9rZW4pKTtcbiAgICAgICAgICBpZiAod2Fsa1Rva2Vucykge1xuICAgICAgICAgICAgdmFsdWVzID0gdmFsdWVzLmNvbmNhdCh3YWxrVG9rZW5zLmNhbGwodGhpcywgdG9rZW4pKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHZhbHVlcztcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5kZWZhdWx0cyA9IHsgLi4udGhpcy5kZWZhdWx0cywgLi4ub3B0cyB9O1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRPcHRpb25zKG9wdDogTWFya2VkT3B0aW9uczxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0Pikge1xuICAgIHRoaXMuZGVmYXVsdHMgPSB7IC4uLnRoaXMuZGVmYXVsdHMsIC4uLm9wdCB9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgbGV4ZXIoc3JjOiBzdHJpbmcsIG9wdGlvbnM/OiBNYXJrZWRPcHRpb25zPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+KSB7XG4gICAgcmV0dXJuIF9MZXhlci5sZXgoc3JjLCBvcHRpb25zID8/IHRoaXMuZGVmYXVsdHMpO1xuICB9XG5cbiAgcGFyc2VyKHRva2VuczogVG9rZW5bXSwgb3B0aW9ucz86IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4pIHtcbiAgICByZXR1cm4gX1BhcnNlci5wYXJzZTxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0Pih0b2tlbnMsIG9wdGlvbnMgPz8gdGhpcy5kZWZhdWx0cyk7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlTWFya2Rvd24oYmxvY2tUeXBlOiBib29sZWFuKSB7XG4gICAgdHlwZSBvdmVybG9hZGVkUGFyc2UgPSB7XG4gICAgICAoc3JjOiBzdHJpbmcsIG9wdGlvbnM6IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4gJiB7IGFzeW5jOiB0cnVlIH0pOiBQcm9taXNlPFBhcnNlck91dHB1dD47XG4gICAgICAoc3JjOiBzdHJpbmcsIG9wdGlvbnM6IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4gJiB7IGFzeW5jOiBmYWxzZSB9KTogUGFyc2VyT3V0cHV0O1xuICAgICAgKHNyYzogc3RyaW5nLCBvcHRpb25zPzogTWFya2VkT3B0aW9uczxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0PiB8IG51bGwpOiBQYXJzZXJPdXRwdXQgfCBQcm9taXNlPFBhcnNlck91dHB1dD47XG4gICAgfTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgY29uc3QgcGFyc2U6IG92ZXJsb2FkZWRQYXJzZSA9IChzcmM6IHN0cmluZywgb3B0aW9ucz86IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4gfCBudWxsKTogYW55ID0+IHtcbiAgICAgIGNvbnN0IG9yaWdPcHQgPSB7IC4uLm9wdGlvbnMgfTtcbiAgICAgIGNvbnN0IG9wdCA9IHsgLi4udGhpcy5kZWZhdWx0cywgLi4ub3JpZ09wdCB9O1xuXG4gICAgICBjb25zdCB0aHJvd0Vycm9yID0gdGhpcy5vbkVycm9yKCEhb3B0LnNpbGVudCwgISFvcHQuYXN5bmMpO1xuXG4gICAgICAvLyB0aHJvdyBlcnJvciBpZiBhbiBleHRlbnNpb24gc2V0IGFzeW5jIHRvIHRydWUgYnV0IHBhcnNlIHdhcyBjYWxsZWQgd2l0aCBhc3luYzogZmFsc2VcbiAgICAgIGlmICh0aGlzLmRlZmF1bHRzLmFzeW5jID09PSB0cnVlICYmIG9yaWdPcHQuYXN5bmMgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKG5ldyBFcnJvcignbWFya2VkKCk6IFRoZSBhc3luYyBvcHRpb24gd2FzIHNldCB0byB0cnVlIGJ5IGFuIGV4dGVuc2lvbi4gUmVtb3ZlIGFzeW5jOiBmYWxzZSBmcm9tIHRoZSBwYXJzZSBvcHRpb25zIG9iamVjdCB0byByZXR1cm4gYSBQcm9taXNlLicpKTtcbiAgICAgIH1cblxuICAgICAgLy8gdGhyb3cgZXJyb3IgaW4gY2FzZSBvZiBub24gc3RyaW5nIGlucHV0XG4gICAgICBpZiAodHlwZW9mIHNyYyA9PT0gJ3VuZGVmaW5lZCcgfHwgc3JjID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKG5ldyBFcnJvcignbWFya2VkKCk6IGlucHV0IHBhcmFtZXRlciBpcyB1bmRlZmluZWQgb3IgbnVsbCcpKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2Ygc3JjICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihuZXcgRXJyb3IoJ21hcmtlZCgpOiBpbnB1dCBwYXJhbWV0ZXIgaXMgb2YgdHlwZSAnXG4gICAgICAgICAgKyBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoc3JjKSArICcsIHN0cmluZyBleHBlY3RlZCcpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdC5ob29rcykge1xuICAgICAgICBvcHQuaG9va3Mub3B0aW9ucyA9IG9wdDtcbiAgICAgICAgb3B0Lmhvb2tzLmJsb2NrID0gYmxvY2tUeXBlO1xuICAgICAgfVxuXG4gICAgICBpZiAob3B0LmFzeW5jKSB7XG4gICAgICAgIHJldHVybiAoYXN5bmMoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcHJvY2Vzc2VkU3JjID0gb3B0Lmhvb2tzID8gYXdhaXQgb3B0Lmhvb2tzLnByZXByb2Nlc3Moc3JjKSA6IHNyYztcbiAgICAgICAgICBjb25zdCBsZXhlciA9IG9wdC5ob29rcyA/IGF3YWl0IG9wdC5ob29rcy5wcm92aWRlTGV4ZXIoKSA6IChibG9ja1R5cGUgPyBfTGV4ZXIubGV4IDogX0xleGVyLmxleElubGluZSk7XG4gICAgICAgICAgY29uc3QgdG9rZW5zID0gYXdhaXQgbGV4ZXIocHJvY2Vzc2VkU3JjLCBvcHQpO1xuICAgICAgICAgIGNvbnN0IHByb2Nlc3NlZFRva2VucyA9IG9wdC5ob29rcyA/IGF3YWl0IG9wdC5ob29rcy5wcm9jZXNzQWxsVG9rZW5zKHRva2VucykgOiB0b2tlbnM7XG4gICAgICAgICAgaWYgKG9wdC53YWxrVG9rZW5zKSB7XG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLndhbGtUb2tlbnMocHJvY2Vzc2VkVG9rZW5zLCBvcHQud2Fsa1Rva2VucykpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBwYXJzZXIgPSBvcHQuaG9va3MgPyBhd2FpdCBvcHQuaG9va3MucHJvdmlkZVBhcnNlcigpIDogKGJsb2NrVHlwZSA/IF9QYXJzZXIucGFyc2UgOiBfUGFyc2VyLnBhcnNlSW5saW5lKTtcbiAgICAgICAgICBjb25zdCBodG1sID0gYXdhaXQgcGFyc2VyKHByb2Nlc3NlZFRva2Vucywgb3B0KTtcbiAgICAgICAgICByZXR1cm4gb3B0Lmhvb2tzID8gYXdhaXQgb3B0Lmhvb2tzLnBvc3Rwcm9jZXNzKGh0bWwpIDogaHRtbDtcbiAgICAgICAgfSkoKS5jYXRjaCh0aHJvd0Vycm9yKTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKG9wdC5ob29rcykge1xuICAgICAgICAgIHNyYyA9IG9wdC5ob29rcy5wcmVwcm9jZXNzKHNyYykgYXMgc3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxleGVyID0gb3B0Lmhvb2tzID8gb3B0Lmhvb2tzLnByb3ZpZGVMZXhlcigpIDogKGJsb2NrVHlwZSA/IF9MZXhlci5sZXggOiBfTGV4ZXIubGV4SW5saW5lKTtcbiAgICAgICAgbGV0IHRva2VucyA9IGxleGVyKHNyYywgb3B0KTtcbiAgICAgICAgaWYgKG9wdC5ob29rcykge1xuICAgICAgICAgIHRva2VucyA9IG9wdC5ob29rcy5wcm9jZXNzQWxsVG9rZW5zKHRva2Vucyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdC53YWxrVG9rZW5zKSB7XG4gICAgICAgICAgdGhpcy53YWxrVG9rZW5zKHRva2Vucywgb3B0LndhbGtUb2tlbnMpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcnNlciA9IG9wdC5ob29rcyA/IG9wdC5ob29rcy5wcm92aWRlUGFyc2VyKCkgOiAoYmxvY2tUeXBlID8gX1BhcnNlci5wYXJzZSA6IF9QYXJzZXIucGFyc2VJbmxpbmUpO1xuICAgICAgICBsZXQgaHRtbCA9IHBhcnNlcih0b2tlbnMsIG9wdCk7XG4gICAgICAgIGlmIChvcHQuaG9va3MpIHtcbiAgICAgICAgICBodG1sID0gb3B0Lmhvb2tzLnBvc3Rwcm9jZXNzKGh0bWwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBodG1sO1xuICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGUgYXMgRXJyb3IpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gcGFyc2U7XG4gIH1cblxuICBwcml2YXRlIG9uRXJyb3Ioc2lsZW50OiBib29sZWFuLCBhc3luYzogYm9vbGVhbikge1xuICAgIHJldHVybiAoZTogRXJyb3IpOiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz4gPT4ge1xuICAgICAgZS5tZXNzYWdlICs9ICdcXG5QbGVhc2UgcmVwb3J0IHRoaXMgdG8gaHR0cHM6Ly9naXRodWIuY29tL21hcmtlZGpzL21hcmtlZC4nO1xuXG4gICAgICBpZiAoc2lsZW50KSB7XG4gICAgICAgIGNvbnN0IG1zZyA9ICc8cD5BbiBlcnJvciBvY2N1cnJlZDo8L3A+PHByZT4nXG4gICAgICAgICAgKyBlc2NhcGVIdG1sRW50aXRpZXMoZS5tZXNzYWdlICsgJycsIHRydWUpXG4gICAgICAgICAgKyAnPC9wcmU+JztcbiAgICAgICAgaWYgKGFzeW5jKSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtc2cpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtc2c7XG4gICAgICB9XG5cbiAgICAgIGlmIChhc3luYykge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlO1xuICAgIH07XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBfTGV4ZXIgfSBmcm9tICcuL0xleGVyLnRzJztcbmltcG9ydCB7IF9QYXJzZXIgfSBmcm9tICcuL1BhcnNlci50cyc7XG5pbXBvcnQgeyBfVG9rZW5pemVyIH0gZnJvbSAnLi9Ub2tlbml6ZXIudHMnO1xuaW1wb3J0IHsgX1JlbmRlcmVyIH0gZnJvbSAnLi9SZW5kZXJlci50cyc7XG5pbXBvcnQgeyBfVGV4dFJlbmRlcmVyIH0gZnJvbSAnLi9UZXh0UmVuZGVyZXIudHMnO1xuaW1wb3J0IHsgX0hvb2tzIH0gZnJvbSAnLi9Ib29rcy50cyc7XG5pbXBvcnQgeyBNYXJrZWQgfSBmcm9tICcuL0luc3RhbmNlLnRzJztcbmltcG9ydCB7XG4gIF9nZXREZWZhdWx0cyxcbiAgY2hhbmdlRGVmYXVsdHMsXG4gIF9kZWZhdWx0cyxcbn0gZnJvbSAnLi9kZWZhdWx0cy50cyc7XG5pbXBvcnQgdHlwZSB7IE1hcmtlZEV4dGVuc2lvbiwgTWFya2VkT3B0aW9ucyB9IGZyb20gJy4vTWFya2VkT3B0aW9ucy50cyc7XG5pbXBvcnQgdHlwZSB7IFRva2VuLCBUb2tlbnNMaXN0IH0gZnJvbSAnLi9Ub2tlbnMudHMnO1xuaW1wb3J0IHR5cGUgeyBNYXliZVByb21pc2UgfSBmcm9tICcuL0luc3RhbmNlLnRzJztcblxuY29uc3QgbWFya2VkSW5zdGFuY2UgPSBuZXcgTWFya2VkKCk7XG5cbi8qKlxuICogQ29tcGlsZXMgbWFya2Rvd24gdG8gSFRNTCBhc3luY2hyb25vdXNseS5cbiAqXG4gKiBAcGFyYW0gc3JjIFN0cmluZyBvZiBtYXJrZG93biBzb3VyY2UgdG8gYmUgY29tcGlsZWRcbiAqIEBwYXJhbSBvcHRpb25zIEhhc2ggb2Ygb3B0aW9ucywgaGF2aW5nIGFzeW5jOiB0cnVlXG4gKiBAcmV0dXJuIFByb21pc2Ugb2Ygc3RyaW5nIG9mIGNvbXBpbGVkIEhUTUxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcmtlZChzcmM6IHN0cmluZywgb3B0aW9uczogTWFya2VkT3B0aW9ucyAmIHsgYXN5bmM6IHRydWUgfSk6IFByb21pc2U8c3RyaW5nPjtcblxuLyoqXG4gKiBDb21waWxlcyBtYXJrZG93biB0byBIVE1MLlxuICpcbiAqIEBwYXJhbSBzcmMgU3RyaW5nIG9mIG1hcmtkb3duIHNvdXJjZSB0byBiZSBjb21waWxlZFxuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9uYWwgaGFzaCBvZiBvcHRpb25zXG4gKiBAcmV0dXJuIFN0cmluZyBvZiBjb21waWxlZCBIVE1MLiBXaWxsIGJlIGEgUHJvbWlzZSBvZiBzdHJpbmcgaWYgYXN5bmMgaXMgc2V0IHRvIHRydWUgYnkgYW55IGV4dGVuc2lvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXJrZWQoc3JjOiBzdHJpbmcsIG9wdGlvbnM6IE1hcmtlZE9wdGlvbnMgJiB7IGFzeW5jOiBmYWxzZSB9KTogc3RyaW5nO1xuZXhwb3J0IGZ1bmN0aW9uIG1hcmtlZChzcmM6IHN0cmluZywgb3B0aW9uczogTWFya2VkT3B0aW9ucyAmIHsgYXN5bmM6IHRydWUgfSk6IFByb21pc2U8c3RyaW5nPjtcbmV4cG9ydCBmdW5jdGlvbiBtYXJrZWQoc3JjOiBzdHJpbmcsIG9wdGlvbnM/OiBNYXJrZWRPcHRpb25zIHwgbnVsbCk6IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPjtcbmV4cG9ydCBmdW5jdGlvbiBtYXJrZWQoc3JjOiBzdHJpbmcsIG9wdD86IE1hcmtlZE9wdGlvbnMgfCBudWxsKTogc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+IHtcbiAgcmV0dXJuIG1hcmtlZEluc3RhbmNlLnBhcnNlKHNyYywgb3B0KTtcbn1cblxuLyoqXG4gKiBTZXRzIHRoZSBkZWZhdWx0IG9wdGlvbnMuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgSGFzaCBvZiBvcHRpb25zXG4gKi9cbm1hcmtlZC5vcHRpb25zID1cbiAgbWFya2VkLnNldE9wdGlvbnMgPSBmdW5jdGlvbihvcHRpb25zOiBNYXJrZWRPcHRpb25zKSB7XG4gICAgbWFya2VkSW5zdGFuY2Uuc2V0T3B0aW9ucyhvcHRpb25zKTtcbiAgICBtYXJrZWQuZGVmYXVsdHMgPSBtYXJrZWRJbnN0YW5jZS5kZWZhdWx0cztcbiAgICBjaGFuZ2VEZWZhdWx0cyhtYXJrZWQuZGVmYXVsdHMpO1xuICAgIHJldHVybiBtYXJrZWQ7XG4gIH07XG5cbi8qKlxuICogR2V0cyB0aGUgb3JpZ2luYWwgbWFya2VkIGRlZmF1bHQgb3B0aW9ucy5cbiAqL1xubWFya2VkLmdldERlZmF1bHRzID0gX2dldERlZmF1bHRzO1xuXG5tYXJrZWQuZGVmYXVsdHMgPSBfZGVmYXVsdHM7XG5cbi8qKlxuICogVXNlIEV4dGVuc2lvblxuICovXG5cbm1hcmtlZC51c2UgPSBmdW5jdGlvbiguLi5hcmdzOiBNYXJrZWRFeHRlbnNpb25bXSkge1xuICBtYXJrZWRJbnN0YW5jZS51c2UoLi4uYXJncyk7XG4gIG1hcmtlZC5kZWZhdWx0cyA9IG1hcmtlZEluc3RhbmNlLmRlZmF1bHRzO1xuICBjaGFuZ2VEZWZhdWx0cyhtYXJrZWQuZGVmYXVsdHMpO1xuICByZXR1cm4gbWFya2VkO1xufTtcblxuLyoqXG4gKiBSdW4gY2FsbGJhY2sgZm9yIGV2ZXJ5IHRva2VuXG4gKi9cblxubWFya2VkLndhbGtUb2tlbnMgPSBmdW5jdGlvbih0b2tlbnM6IFRva2VuW10gfCBUb2tlbnNMaXN0LCBjYWxsYmFjazogKHRva2VuOiBUb2tlbikgPT4gTWF5YmVQcm9taXNlIHwgTWF5YmVQcm9taXNlW10pIHtcbiAgcmV0dXJuIG1hcmtlZEluc3RhbmNlLndhbGtUb2tlbnModG9rZW5zLCBjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIENvbXBpbGVzIG1hcmtkb3duIHRvIEhUTUwgd2l0aG91dCBlbmNsb3NpbmcgYHBgIHRhZy5cbiAqXG4gKiBAcGFyYW0gc3JjIFN0cmluZyBvZiBtYXJrZG93biBzb3VyY2UgdG8gYmUgY29tcGlsZWRcbiAqIEBwYXJhbSBvcHRpb25zIEhhc2ggb2Ygb3B0aW9uc1xuICogQHJldHVybiBTdHJpbmcgb2YgY29tcGlsZWQgSFRNTFxuICovXG5tYXJrZWQucGFyc2VJbmxpbmUgPSBtYXJrZWRJbnN0YW5jZS5wYXJzZUlubGluZTtcblxuLyoqXG4gKiBFeHBvc2VcbiAqL1xubWFya2VkLlBhcnNlciA9IF9QYXJzZXI7XG5tYXJrZWQucGFyc2VyID0gX1BhcnNlci5wYXJzZTtcbm1hcmtlZC5SZW5kZXJlciA9IF9SZW5kZXJlcjtcbm1hcmtlZC5UZXh0UmVuZGVyZXIgPSBfVGV4dFJlbmRlcmVyO1xubWFya2VkLkxleGVyID0gX0xleGVyO1xubWFya2VkLmxleGVyID0gX0xleGVyLmxleDtcbm1hcmtlZC5Ub2tlbml6ZXIgPSBfVG9rZW5pemVyO1xubWFya2VkLkhvb2tzID0gX0hvb2tzO1xubWFya2VkLnBhcnNlID0gbWFya2VkO1xuXG5leHBvcnQgY29uc3Qgb3B0aW9ucyA9IG1hcmtlZC5vcHRpb25zO1xuZXhwb3J0IGNvbnN0IHNldE9wdGlvbnMgPSBtYXJrZWQuc2V0T3B0aW9ucztcbmV4cG9ydCBjb25zdCB1c2UgPSBtYXJrZWQudXNlO1xuZXhwb3J0IGNvbnN0IHdhbGtUb2tlbnMgPSBtYXJrZWQud2Fsa1Rva2VucztcbmV4cG9ydCBjb25zdCBwYXJzZUlubGluZSA9IG1hcmtlZC5wYXJzZUlubGluZTtcbmV4cG9ydCBjb25zdCBwYXJzZSA9IG1hcmtlZDtcbmV4cG9ydCBjb25zdCBwYXJzZXIgPSBfUGFyc2VyLnBhcnNlO1xuZXhwb3J0IGNvbnN0IGxleGVyID0gX0xleGVyLmxleDtcbmV4cG9ydCB7IF9kZWZhdWx0cyBhcyBkZWZhdWx0cywgX2dldERlZmF1bHRzIGFzIGdldERlZmF1bHRzIH0gZnJvbSAnLi9kZWZhdWx0cy50cyc7XG5leHBvcnQgeyBfTGV4ZXIgYXMgTGV4ZXIgfSBmcm9tICcuL0xleGVyLnRzJztcbmV4cG9ydCB7IF9QYXJzZXIgYXMgUGFyc2VyIH0gZnJvbSAnLi9QYXJzZXIudHMnO1xuZXhwb3J0IHsgX1Rva2VuaXplciBhcyBUb2tlbml6ZXIgfSBmcm9tICcuL1Rva2VuaXplci50cyc7XG5leHBvcnQgeyBfUmVuZGVyZXIgYXMgUmVuZGVyZXIgfSBmcm9tICcuL1JlbmRlcmVyLnRzJztcbmV4cG9ydCB7IF9UZXh0UmVuZGVyZXIgYXMgVGV4dFJlbmRlcmVyIH0gZnJvbSAnLi9UZXh0UmVuZGVyZXIudHMnO1xuZXhwb3J0IHsgX0hvb2tzIGFzIEhvb2tzIH0gZnJvbSAnLi9Ib29rcy50cyc7XG5leHBvcnQgeyBNYXJrZWQgfSBmcm9tICcuL0luc3RhbmNlLnRzJztcbmV4cG9ydCB0eXBlICogZnJvbSAnLi9NYXJrZWRPcHRpb25zLnRzJztcbmV4cG9ydCB0eXBlICogZnJvbSAnLi9Ub2tlbnMudHMnO1xuIiwgImNvbnN0IHtcbiAgZW50cmllcyxcbiAgc2V0UHJvdG90eXBlT2YsXG4gIGlzRnJvemVuLFxuICBnZXRQcm90b3R5cGVPZixcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxufSA9IE9iamVjdDtcblxubGV0IHsgZnJlZXplLCBzZWFsLCBjcmVhdGUgfSA9IE9iamVjdDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBpbXBvcnQvbm8tbXV0YWJsZS1leHBvcnRzXG5sZXQgeyBhcHBseSwgY29uc3RydWN0IH0gPSB0eXBlb2YgUmVmbGVjdCAhPT0gJ3VuZGVmaW5lZCcgJiYgUmVmbGVjdDtcblxuaWYgKCFmcmVlemUpIHtcbiAgZnJlZXplID0gZnVuY3Rpb24gPFQ+KHg6IFQpOiBUIHtcbiAgICByZXR1cm4geDtcbiAgfTtcbn1cblxuaWYgKCFzZWFsKSB7XG4gIHNlYWwgPSBmdW5jdGlvbiA8VD4oeDogVCk6IFQge1xuICAgIHJldHVybiB4O1xuICB9O1xufVxuXG5pZiAoIWFwcGx5KSB7XG4gIGFwcGx5ID0gZnVuY3Rpb24gPFQ+KFxuICAgIGZ1bmM6ICh0aGlzQXJnOiBhbnksIC4uLmFyZ3M6IGFueVtdKSA9PiBULFxuICAgIHRoaXNBcmc6IGFueSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBUIHtcbiAgICByZXR1cm4gZnVuYy5hcHBseSh0aGlzQXJnLCBhcmdzKTtcbiAgfTtcbn1cblxuaWYgKCFjb25zdHJ1Y3QpIHtcbiAgY29uc3RydWN0ID0gZnVuY3Rpb24gPFQ+KEZ1bmM6IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQsIC4uLmFyZ3M6IGFueVtdKTogVCB7XG4gICAgcmV0dXJuIG5ldyBGdW5jKC4uLmFyZ3MpO1xuICB9O1xufVxuXG5jb25zdCBhcnJheUZvckVhY2ggPSB1bmFwcGx5KEFycmF5LnByb3RvdHlwZS5mb3JFYWNoKTtcbmNvbnN0IGFycmF5SW5kZXhPZiA9IHVuYXBwbHkoQXJyYXkucHJvdG90eXBlLmluZGV4T2YpO1xuY29uc3QgYXJyYXlMYXN0SW5kZXhPZiA9IHVuYXBwbHkoQXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mKTtcbmNvbnN0IGFycmF5UG9wID0gdW5hcHBseShBcnJheS5wcm90b3R5cGUucG9wKTtcbmNvbnN0IGFycmF5UHVzaCA9IHVuYXBwbHkoQXJyYXkucHJvdG90eXBlLnB1c2gpO1xuY29uc3QgYXJyYXlTbGljZSA9IHVuYXBwbHkoQXJyYXkucHJvdG90eXBlLnNsaWNlKTtcbmNvbnN0IGFycmF5U3BsaWNlID0gdW5hcHBseShBcnJheS5wcm90b3R5cGUuc3BsaWNlKTtcblxuY29uc3Qgc3RyaW5nVG9Mb3dlckNhc2UgPSB1bmFwcGx5KFN0cmluZy5wcm90b3R5cGUudG9Mb3dlckNhc2UpO1xuY29uc3Qgc3RyaW5nVG9TdHJpbmcgPSB1bmFwcGx5KFN0cmluZy5wcm90b3R5cGUudG9TdHJpbmcpO1xuY29uc3Qgc3RyaW5nTWF0Y2ggPSB1bmFwcGx5KFN0cmluZy5wcm90b3R5cGUubWF0Y2gpO1xuY29uc3Qgc3RyaW5nUmVwbGFjZSA9IHVuYXBwbHkoU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlKTtcbmNvbnN0IHN0cmluZ0luZGV4T2YgPSB1bmFwcGx5KFN0cmluZy5wcm90b3R5cGUuaW5kZXhPZik7XG5jb25zdCBzdHJpbmdUcmltID0gdW5hcHBseShTdHJpbmcucHJvdG90eXBlLnRyaW0pO1xuXG5jb25zdCBvYmplY3RIYXNPd25Qcm9wZXJ0eSA9IHVuYXBwbHkoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSk7XG5cbmNvbnN0IHJlZ0V4cFRlc3QgPSB1bmFwcGx5KFJlZ0V4cC5wcm90b3R5cGUudGVzdCk7XG5cbmNvbnN0IHR5cGVFcnJvckNyZWF0ZSA9IHVuY29uc3RydWN0KFR5cGVFcnJvcik7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBmdW5jdGlvbiB0aGF0IGNhbGxzIHRoZSBnaXZlbiBmdW5jdGlvbiB3aXRoIGEgc3BlY2lmaWVkIHRoaXNBcmcgYW5kIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gZnVuYyAtIFRoZSBmdW5jdGlvbiB0byBiZSB3cmFwcGVkIGFuZCBjYWxsZWQuXG4gKiBAcmV0dXJucyBBIG5ldyBmdW5jdGlvbiB0aGF0IGNhbGxzIHRoZSBnaXZlbiBmdW5jdGlvbiB3aXRoIGEgc3BlY2lmaWVkIHRoaXNBcmcgYW5kIGFyZ3VtZW50cy5cbiAqL1xuZnVuY3Rpb24gdW5hcHBseTxUPihcbiAgZnVuYzogKHRoaXNBcmc6IGFueSwgLi4uYXJnczogYW55W10pID0+IFRcbik6ICh0aGlzQXJnOiBhbnksIC4uLmFyZ3M6IGFueVtdKSA9PiBUIHtcbiAgcmV0dXJuICh0aGlzQXJnOiBhbnksIC4uLmFyZ3M6IGFueVtdKTogVCA9PiB7XG4gICAgaWYgKHRoaXNBcmcgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgIHRoaXNBcmcubGFzdEluZGV4ID0gMDtcbiAgICB9XG5cbiAgICByZXR1cm4gYXBwbHkoZnVuYywgdGhpc0FyZywgYXJncyk7XG4gIH07XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBmdW5jdGlvbiB0aGF0IGNvbnN0cnVjdHMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdpdmVuIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIHdpdGggdGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gZnVuYyAtIFRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbiB0byBiZSB3cmFwcGVkIGFuZCBjYWxsZWQuXG4gKiBAcmV0dXJucyBBIG5ldyBmdW5jdGlvbiB0aGF0IGNvbnN0cnVjdHMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdpdmVuIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIHdpdGggdGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAqL1xuZnVuY3Rpb24gdW5jb25zdHJ1Y3Q8VD4oXG4gIEZ1bmM6IG5ldyAoLi4uYXJnczogYW55W10pID0+IFRcbik6ICguLi5hcmdzOiBhbnlbXSkgPT4gVCB7XG4gIHJldHVybiAoLi4uYXJnczogYW55W10pOiBUID0+IGNvbnN0cnVjdChGdW5jLCBhcmdzKTtcbn1cblxuLyoqXG4gKiBBZGQgcHJvcGVydGllcyB0byBhIGxvb2t1cCB0YWJsZVxuICpcbiAqIEBwYXJhbSBzZXQgLSBUaGUgc2V0IHRvIHdoaWNoIGVsZW1lbnRzIHdpbGwgYmUgYWRkZWQuXG4gKiBAcGFyYW0gYXJyYXkgLSBUaGUgYXJyYXkgY29udGFpbmluZyBlbGVtZW50cyB0byBiZSBhZGRlZCB0byB0aGUgc2V0LlxuICogQHBhcmFtIHRyYW5zZm9ybUNhc2VGdW5jIC0gQW4gb3B0aW9uYWwgZnVuY3Rpb24gdG8gdHJhbnNmb3JtIHRoZSBjYXNlIG9mIGVhY2ggZWxlbWVudCBiZWZvcmUgYWRkaW5nIHRvIHRoZSBzZXQuXG4gKiBAcmV0dXJucyBUaGUgbW9kaWZpZWQgc2V0IHdpdGggYWRkZWQgZWxlbWVudHMuXG4gKi9cbmZ1bmN0aW9uIGFkZFRvU2V0KFxuICBzZXQ6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIGFycmF5OiByZWFkb25seSBhbnlbXSxcbiAgdHJhbnNmb3JtQ2FzZUZ1bmM6IFJldHVyblR5cGU8dHlwZW9mIHVuYXBwbHk8c3RyaW5nPj4gPSBzdHJpbmdUb0xvd2VyQ2FzZVxuKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gIGlmIChzZXRQcm90b3R5cGVPZikge1xuICAgIC8vIE1ha2UgJ2luJyBhbmQgdHJ1dGh5IGNoZWNrcyBsaWtlIEJvb2xlYW4oc2V0LmNvbnN0cnVjdG9yKVxuICAgIC8vIGluZGVwZW5kZW50IG9mIGFueSBwcm9wZXJ0aWVzIGRlZmluZWQgb24gT2JqZWN0LnByb3RvdHlwZS5cbiAgICAvLyBQcmV2ZW50IHByb3RvdHlwZSBzZXR0ZXJzIGZyb20gaW50ZXJjZXB0aW5nIHNldCBhcyBhIHRoaXMgdmFsdWUuXG4gICAgc2V0UHJvdG90eXBlT2Yoc2V0LCBudWxsKTtcbiAgfVxuXG4gIGxldCBsID0gYXJyYXkubGVuZ3RoO1xuICB3aGlsZSAobC0tKSB7XG4gICAgbGV0IGVsZW1lbnQgPSBhcnJheVtsXTtcbiAgICBpZiAodHlwZW9mIGVsZW1lbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zdCBsY0VsZW1lbnQgPSB0cmFuc2Zvcm1DYXNlRnVuYyhlbGVtZW50KTtcbiAgICAgIGlmIChsY0VsZW1lbnQgIT09IGVsZW1lbnQpIHtcbiAgICAgICAgLy8gQ29uZmlnIHByZXNldHMgKGUuZy4gdGFncy5qcywgYXR0cnMuanMpIGFyZSBpbW11dGFibGUuXG4gICAgICAgIGlmICghaXNGcm96ZW4oYXJyYXkpKSB7XG4gICAgICAgICAgKGFycmF5IGFzIGFueVtdKVtsXSA9IGxjRWxlbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIGVsZW1lbnQgPSBsY0VsZW1lbnQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2V0W2VsZW1lbnRdID0gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBzZXQ7XG59XG5cbi8qKlxuICogQ2xlYW4gdXAgYW4gYXJyYXkgdG8gaGFyZGVuIGFnYWluc3QgQ1NQUFxuICpcbiAqIEBwYXJhbSBhcnJheSAtIFRoZSBhcnJheSB0byBiZSBjbGVhbmVkLlxuICogQHJldHVybnMgVGhlIGNsZWFuZWQgdmVyc2lvbiBvZiB0aGUgYXJyYXlcbiAqL1xuZnVuY3Rpb24gY2xlYW5BcnJheTxUPihhcnJheTogVFtdKTogQXJyYXk8VCB8IG51bGw+IHtcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGFycmF5Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IGlzUHJvcGVydHlFeGlzdCA9IG9iamVjdEhhc093blByb3BlcnR5KGFycmF5LCBpbmRleCk7XG5cbiAgICBpZiAoIWlzUHJvcGVydHlFeGlzdCkge1xuICAgICAgYXJyYXlbaW5kZXhdID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYXJyYXk7XG59XG5cbi8qKlxuICogU2hhbGxvdyBjbG9uZSBhbiBvYmplY3RcbiAqXG4gKiBAcGFyYW0gb2JqZWN0IC0gVGhlIG9iamVjdCB0byBiZSBjbG9uZWQuXG4gKiBAcmV0dXJucyBBIG5ldyBvYmplY3QgdGhhdCBjb3BpZXMgdGhlIG9yaWdpbmFsLlxuICovXG5mdW5jdGlvbiBjbG9uZTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4ob2JqZWN0OiBUKTogVCB7XG4gIGNvbnN0IG5ld09iamVjdCA9IGNyZWF0ZShudWxsKTtcblxuICBmb3IgKGNvbnN0IFtwcm9wZXJ0eSwgdmFsdWVdIG9mIGVudHJpZXMob2JqZWN0KSkge1xuICAgIGNvbnN0IGlzUHJvcGVydHlFeGlzdCA9IG9iamVjdEhhc093blByb3BlcnR5KG9iamVjdCwgcHJvcGVydHkpO1xuXG4gICAgaWYgKGlzUHJvcGVydHlFeGlzdCkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIG5ld09iamVjdFtwcm9wZXJ0eV0gPSBjbGVhbkFycmF5KHZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHZhbHVlICYmXG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgdmFsdWUuY29uc3RydWN0b3IgPT09IE9iamVjdFxuICAgICAgKSB7XG4gICAgICAgIG5ld09iamVjdFtwcm9wZXJ0eV0gPSBjbG9uZSh2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXdPYmplY3RbcHJvcGVydHldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ld09iamVjdDtcbn1cblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBhdXRvbWF0aWNhbGx5IGNoZWNrcyBpZiB0aGUgcHJvcCBpcyBmdW5jdGlvbiBvciBnZXR0ZXIgYW5kIGJlaGF2ZXMgYWNjb3JkaW5nbHkuXG4gKlxuICogQHBhcmFtIG9iamVjdCAtIFRoZSBvYmplY3QgdG8gbG9vayB1cCB0aGUgZ2V0dGVyIGZ1bmN0aW9uIGluIGl0cyBwcm90b3R5cGUgY2hhaW4uXG4gKiBAcGFyYW0gcHJvcCAtIFRoZSBwcm9wZXJ0eSBuYW1lIGZvciB3aGljaCB0byBmaW5kIHRoZSBnZXR0ZXIgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBUaGUgZ2V0dGVyIGZ1bmN0aW9uIGZvdW5kIGluIHRoZSBwcm90b3R5cGUgY2hhaW4gb3IgYSBmYWxsYmFjayBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gbG9va3VwR2V0dGVyPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PihcbiAgb2JqZWN0OiBULFxuICBwcm9wOiBzdHJpbmdcbik6IFJldHVyblR5cGU8dHlwZW9mIHVuYXBwbHk8YW55Pj4gfCAoKCkgPT4gbnVsbCkge1xuICB3aGlsZSAob2JqZWN0ICE9PSBudWxsKSB7XG4gICAgY29uc3QgZGVzYyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3ApO1xuXG4gICAgaWYgKGRlc2MpIHtcbiAgICAgIGlmIChkZXNjLmdldCkge1xuICAgICAgICByZXR1cm4gdW5hcHBseShkZXNjLmdldCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgZGVzYy52YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gdW5hcHBseShkZXNjLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBvYmplY3QgPSBnZXRQcm90b3R5cGVPZihvYmplY3QpO1xuICB9XG5cbiAgZnVuY3Rpb24gZmFsbGJhY2tWYWx1ZSgpOiBudWxsIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBmYWxsYmFja1ZhbHVlO1xufVxuXG5leHBvcnQge1xuICAvLyBBcnJheVxuICBhcnJheUZvckVhY2gsXG4gIGFycmF5SW5kZXhPZixcbiAgYXJyYXlMYXN0SW5kZXhPZixcbiAgYXJyYXlQb3AsXG4gIGFycmF5UHVzaCxcbiAgYXJyYXlTbGljZSxcbiAgYXJyYXlTcGxpY2UsXG4gIC8vIE9iamVjdFxuICBlbnRyaWVzLFxuICBmcmVlemUsXG4gIGdldFByb3RvdHlwZU9mLFxuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsXG4gIGlzRnJvemVuLFxuICBzZXRQcm90b3R5cGVPZixcbiAgc2VhbCxcbiAgY2xvbmUsXG4gIGNyZWF0ZSxcbiAgb2JqZWN0SGFzT3duUHJvcGVydHksXG4gIC8vIFJlZ0V4cFxuICByZWdFeHBUZXN0LFxuICAvLyBTdHJpbmdcbiAgc3RyaW5nSW5kZXhPZixcbiAgc3RyaW5nTWF0Y2gsXG4gIHN0cmluZ1JlcGxhY2UsXG4gIHN0cmluZ1RvTG93ZXJDYXNlLFxuICBzdHJpbmdUb1N0cmluZyxcbiAgc3RyaW5nVHJpbSxcbiAgLy8gRXJyb3JzXG4gIHR5cGVFcnJvckNyZWF0ZSxcbiAgLy8gT3RoZXJcbiAgbG9va3VwR2V0dGVyLFxuICBhZGRUb1NldCxcbiAgLy8gUmVmbGVjdFxuICB1bmFwcGx5LFxuICB1bmNvbnN0cnVjdCxcbn07XG4iLCAiaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi91dGlscy5qcyc7XG5cbmV4cG9ydCBjb25zdCBodG1sID0gZnJlZXplKFtcbiAgJ2EnLFxuICAnYWJicicsXG4gICdhY3JvbnltJyxcbiAgJ2FkZHJlc3MnLFxuICAnYXJlYScsXG4gICdhcnRpY2xlJyxcbiAgJ2FzaWRlJyxcbiAgJ2F1ZGlvJyxcbiAgJ2InLFxuICAnYmRpJyxcbiAgJ2JkbycsXG4gICdiaWcnLFxuICAnYmxpbmsnLFxuICAnYmxvY2txdW90ZScsXG4gICdib2R5JyxcbiAgJ2JyJyxcbiAgJ2J1dHRvbicsXG4gICdjYW52YXMnLFxuICAnY2FwdGlvbicsXG4gICdjZW50ZXInLFxuICAnY2l0ZScsXG4gICdjb2RlJyxcbiAgJ2NvbCcsXG4gICdjb2xncm91cCcsXG4gICdjb250ZW50JyxcbiAgJ2RhdGEnLFxuICAnZGF0YWxpc3QnLFxuICAnZGQnLFxuICAnZGVjb3JhdG9yJyxcbiAgJ2RlbCcsXG4gICdkZXRhaWxzJyxcbiAgJ2RmbicsXG4gICdkaWFsb2cnLFxuICAnZGlyJyxcbiAgJ2RpdicsXG4gICdkbCcsXG4gICdkdCcsXG4gICdlbGVtZW50JyxcbiAgJ2VtJyxcbiAgJ2ZpZWxkc2V0JyxcbiAgJ2ZpZ2NhcHRpb24nLFxuICAnZmlndXJlJyxcbiAgJ2ZvbnQnLFxuICAnZm9vdGVyJyxcbiAgJ2Zvcm0nLFxuICAnaDEnLFxuICAnaDInLFxuICAnaDMnLFxuICAnaDQnLFxuICAnaDUnLFxuICAnaDYnLFxuICAnaGVhZCcsXG4gICdoZWFkZXInLFxuICAnaGdyb3VwJyxcbiAgJ2hyJyxcbiAgJ2h0bWwnLFxuICAnaScsXG4gICdpbWcnLFxuICAnaW5wdXQnLFxuICAnaW5zJyxcbiAgJ2tiZCcsXG4gICdsYWJlbCcsXG4gICdsZWdlbmQnLFxuICAnbGknLFxuICAnbWFpbicsXG4gICdtYXAnLFxuICAnbWFyaycsXG4gICdtYXJxdWVlJyxcbiAgJ21lbnUnLFxuICAnbWVudWl0ZW0nLFxuICAnbWV0ZXInLFxuICAnbmF2JyxcbiAgJ25vYnInLFxuICAnb2wnLFxuICAnb3B0Z3JvdXAnLFxuICAnb3B0aW9uJyxcbiAgJ291dHB1dCcsXG4gICdwJyxcbiAgJ3BpY3R1cmUnLFxuICAncHJlJyxcbiAgJ3Byb2dyZXNzJyxcbiAgJ3EnLFxuICAncnAnLFxuICAncnQnLFxuICAncnVieScsXG4gICdzJyxcbiAgJ3NhbXAnLFxuICAnc2VhcmNoJyxcbiAgJ3NlY3Rpb24nLFxuICAnc2VsZWN0JyxcbiAgJ3NoYWRvdycsXG4gICdzbG90JyxcbiAgJ3NtYWxsJyxcbiAgJ3NvdXJjZScsXG4gICdzcGFjZXInLFxuICAnc3BhbicsXG4gICdzdHJpa2UnLFxuICAnc3Ryb25nJyxcbiAgJ3N0eWxlJyxcbiAgJ3N1YicsXG4gICdzdW1tYXJ5JyxcbiAgJ3N1cCcsXG4gICd0YWJsZScsXG4gICd0Ym9keScsXG4gICd0ZCcsXG4gICd0ZW1wbGF0ZScsXG4gICd0ZXh0YXJlYScsXG4gICd0Zm9vdCcsXG4gICd0aCcsXG4gICd0aGVhZCcsXG4gICd0aW1lJyxcbiAgJ3RyJyxcbiAgJ3RyYWNrJyxcbiAgJ3R0JyxcbiAgJ3UnLFxuICAndWwnLFxuICAndmFyJyxcbiAgJ3ZpZGVvJyxcbiAgJ3dicicsXG5dIGFzIGNvbnN0KTtcblxuZXhwb3J0IGNvbnN0IHN2ZyA9IGZyZWV6ZShbXG4gICdzdmcnLFxuICAnYScsXG4gICdhbHRnbHlwaCcsXG4gICdhbHRnbHlwaGRlZicsXG4gICdhbHRnbHlwaGl0ZW0nLFxuICAnYW5pbWF0ZWNvbG9yJyxcbiAgJ2FuaW1hdGVtb3Rpb24nLFxuICAnYW5pbWF0ZXRyYW5zZm9ybScsXG4gICdjaXJjbGUnLFxuICAnY2xpcHBhdGgnLFxuICAnZGVmcycsXG4gICdkZXNjJyxcbiAgJ2VsbGlwc2UnLFxuICAnZW50ZXJrZXloaW50JyxcbiAgJ2V4cG9ydHBhcnRzJyxcbiAgJ2ZpbHRlcicsXG4gICdmb250JyxcbiAgJ2cnLFxuICAnZ2x5cGgnLFxuICAnZ2x5cGhyZWYnLFxuICAnaGtlcm4nLFxuICAnaW1hZ2UnLFxuICAnaW5wdXRtb2RlJyxcbiAgJ2xpbmUnLFxuICAnbGluZWFyZ3JhZGllbnQnLFxuICAnbWFya2VyJyxcbiAgJ21hc2snLFxuICAnbWV0YWRhdGEnLFxuICAnbXBhdGgnLFxuICAncGFydCcsXG4gICdwYXRoJyxcbiAgJ3BhdHRlcm4nLFxuICAncG9seWdvbicsXG4gICdwb2x5bGluZScsXG4gICdyYWRpYWxncmFkaWVudCcsXG4gICdyZWN0JyxcbiAgJ3N0b3AnLFxuICAnc3R5bGUnLFxuICAnc3dpdGNoJyxcbiAgJ3N5bWJvbCcsXG4gICd0ZXh0JyxcbiAgJ3RleHRwYXRoJyxcbiAgJ3RpdGxlJyxcbiAgJ3RyZWYnLFxuICAndHNwYW4nLFxuICAndmlldycsXG4gICd2a2VybicsXG5dIGFzIGNvbnN0KTtcblxuZXhwb3J0IGNvbnN0IHN2Z0ZpbHRlcnMgPSBmcmVlemUoW1xuICAnZmVCbGVuZCcsXG4gICdmZUNvbG9yTWF0cml4JyxcbiAgJ2ZlQ29tcG9uZW50VHJhbnNmZXInLFxuICAnZmVDb21wb3NpdGUnLFxuICAnZmVDb252b2x2ZU1hdHJpeCcsXG4gICdmZURpZmZ1c2VMaWdodGluZycsXG4gICdmZURpc3BsYWNlbWVudE1hcCcsXG4gICdmZURpc3RhbnRMaWdodCcsXG4gICdmZURyb3BTaGFkb3cnLFxuICAnZmVGbG9vZCcsXG4gICdmZUZ1bmNBJyxcbiAgJ2ZlRnVuY0InLFxuICAnZmVGdW5jRycsXG4gICdmZUZ1bmNSJyxcbiAgJ2ZlR2F1c3NpYW5CbHVyJyxcbiAgJ2ZlSW1hZ2UnLFxuICAnZmVNZXJnZScsXG4gICdmZU1lcmdlTm9kZScsXG4gICdmZU1vcnBob2xvZ3knLFxuICAnZmVPZmZzZXQnLFxuICAnZmVQb2ludExpZ2h0JyxcbiAgJ2ZlU3BlY3VsYXJMaWdodGluZycsXG4gICdmZVNwb3RMaWdodCcsXG4gICdmZVRpbGUnLFxuICAnZmVUdXJidWxlbmNlJyxcbl0gYXMgY29uc3QpO1xuXG4vLyBMaXN0IG9mIFNWRyBlbGVtZW50cyB0aGF0IGFyZSBkaXNhbGxvd2VkIGJ5IGRlZmF1bHQuXG4vLyBXZSBzdGlsbCBuZWVkIHRvIGtub3cgdGhlbSBzbyB0aGF0IHdlIGNhbiBkbyBuYW1lc3BhY2Vcbi8vIGNoZWNrcyBwcm9wZXJseSBpbiBjYXNlIG9uZSB3YW50cyB0byBhZGQgdGhlbSB0b1xuLy8gYWxsb3ctbGlzdC5cbmV4cG9ydCBjb25zdCBzdmdEaXNhbGxvd2VkID0gZnJlZXplKFtcbiAgJ2FuaW1hdGUnLFxuICAnY29sb3ItcHJvZmlsZScsXG4gICdjdXJzb3InLFxuICAnZGlzY2FyZCcsXG4gICdmb250LWZhY2UnLFxuICAnZm9udC1mYWNlLWZvcm1hdCcsXG4gICdmb250LWZhY2UtbmFtZScsXG4gICdmb250LWZhY2Utc3JjJyxcbiAgJ2ZvbnQtZmFjZS11cmknLFxuICAnZm9yZWlnbm9iamVjdCcsXG4gICdoYXRjaCcsXG4gICdoYXRjaHBhdGgnLFxuICAnbWVzaCcsXG4gICdtZXNoZ3JhZGllbnQnLFxuICAnbWVzaHBhdGNoJyxcbiAgJ21lc2hyb3cnLFxuICAnbWlzc2luZy1nbHlwaCcsXG4gICdzY3JpcHQnLFxuICAnc2V0JyxcbiAgJ3NvbGlkY29sb3InLFxuICAndW5rbm93bicsXG4gICd1c2UnLFxuXSBhcyBjb25zdCk7XG5cbmV4cG9ydCBjb25zdCBtYXRoTWwgPSBmcmVlemUoW1xuICAnbWF0aCcsXG4gICdtZW5jbG9zZScsXG4gICdtZXJyb3InLFxuICAnbWZlbmNlZCcsXG4gICdtZnJhYycsXG4gICdtZ2x5cGgnLFxuICAnbWknLFxuICAnbWxhYmVsZWR0cicsXG4gICdtbXVsdGlzY3JpcHRzJyxcbiAgJ21uJyxcbiAgJ21vJyxcbiAgJ21vdmVyJyxcbiAgJ21wYWRkZWQnLFxuICAnbXBoYW50b20nLFxuICAnbXJvb3QnLFxuICAnbXJvdycsXG4gICdtcycsXG4gICdtc3BhY2UnLFxuICAnbXNxcnQnLFxuICAnbXN0eWxlJyxcbiAgJ21zdWInLFxuICAnbXN1cCcsXG4gICdtc3Vic3VwJyxcbiAgJ210YWJsZScsXG4gICdtdGQnLFxuICAnbXRleHQnLFxuICAnbXRyJyxcbiAgJ211bmRlcicsXG4gICdtdW5kZXJvdmVyJyxcbiAgJ21wcmVzY3JpcHRzJyxcbl0gYXMgY29uc3QpO1xuXG4vLyBTaW1pbGFybHkgdG8gU1ZHLCB3ZSB3YW50IHRvIGtub3cgYWxsIE1hdGhNTCBlbGVtZW50cyxcbi8vIGV2ZW4gdGhvc2UgdGhhdCB3ZSBkaXNhbGxvdyBieSBkZWZhdWx0LlxuZXhwb3J0IGNvbnN0IG1hdGhNbERpc2FsbG93ZWQgPSBmcmVlemUoW1xuICAnbWFjdGlvbicsXG4gICdtYWxpZ25ncm91cCcsXG4gICdtYWxpZ25tYXJrJyxcbiAgJ21sb25nZGl2JyxcbiAgJ21zY2FycmllcycsXG4gICdtc2NhcnJ5JyxcbiAgJ21zZ3JvdXAnLFxuICAnbXN0YWNrJyxcbiAgJ21zbGluZScsXG4gICdtc3JvdycsXG4gICdzZW1hbnRpY3MnLFxuICAnYW5ub3RhdGlvbicsXG4gICdhbm5vdGF0aW9uLXhtbCcsXG4gICdtcHJlc2NyaXB0cycsXG4gICdub25lJyxcbl0gYXMgY29uc3QpO1xuXG5leHBvcnQgY29uc3QgdGV4dCA9IGZyZWV6ZShbJyN0ZXh0J10gYXMgY29uc3QpO1xuIiwgImltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4vdXRpbHMuanMnO1xuXG5leHBvcnQgY29uc3QgaHRtbCA9IGZyZWV6ZShbXG4gICdhY2NlcHQnLFxuICAnYWN0aW9uJyxcbiAgJ2FsaWduJyxcbiAgJ2FsdCcsXG4gICdhdXRvY2FwaXRhbGl6ZScsXG4gICdhdXRvY29tcGxldGUnLFxuICAnYXV0b3BpY3R1cmVpbnBpY3R1cmUnLFxuICAnYXV0b3BsYXknLFxuICAnYmFja2dyb3VuZCcsXG4gICdiZ2NvbG9yJyxcbiAgJ2JvcmRlcicsXG4gICdjYXB0dXJlJyxcbiAgJ2NlbGxwYWRkaW5nJyxcbiAgJ2NlbGxzcGFjaW5nJyxcbiAgJ2NoZWNrZWQnLFxuICAnY2l0ZScsXG4gICdjbGFzcycsXG4gICdjbGVhcicsXG4gICdjb2xvcicsXG4gICdjb2xzJyxcbiAgJ2NvbHNwYW4nLFxuICAnY29udHJvbHMnLFxuICAnY29udHJvbHNsaXN0JyxcbiAgJ2Nvb3JkcycsXG4gICdjcm9zc29yaWdpbicsXG4gICdkYXRldGltZScsXG4gICdkZWNvZGluZycsXG4gICdkZWZhdWx0JyxcbiAgJ2RpcicsXG4gICdkaXNhYmxlZCcsXG4gICdkaXNhYmxlcGljdHVyZWlucGljdHVyZScsXG4gICdkaXNhYmxlcmVtb3RlcGxheWJhY2snLFxuICAnZG93bmxvYWQnLFxuICAnZHJhZ2dhYmxlJyxcbiAgJ2VuY3R5cGUnLFxuICAnZW50ZXJrZXloaW50JyxcbiAgJ2V4cG9ydHBhcnRzJyxcbiAgJ2ZhY2UnLFxuICAnZm9yJyxcbiAgJ2hlYWRlcnMnLFxuICAnaGVpZ2h0JyxcbiAgJ2hpZGRlbicsXG4gICdoaWdoJyxcbiAgJ2hyZWYnLFxuICAnaHJlZmxhbmcnLFxuICAnaWQnLFxuICAnaW5lcnQnLFxuICAnaW5wdXRtb2RlJyxcbiAgJ2ludGVncml0eScsXG4gICdpc21hcCcsXG4gICdraW5kJyxcbiAgJ2xhYmVsJyxcbiAgJ2xhbmcnLFxuICAnbGlzdCcsXG4gICdsb2FkaW5nJyxcbiAgJ2xvb3AnLFxuICAnbG93JyxcbiAgJ21heCcsXG4gICdtYXhsZW5ndGgnLFxuICAnbWVkaWEnLFxuICAnbWV0aG9kJyxcbiAgJ21pbicsXG4gICdtaW5sZW5ndGgnLFxuICAnbXVsdGlwbGUnLFxuICAnbXV0ZWQnLFxuICAnbmFtZScsXG4gICdub25jZScsXG4gICdub3NoYWRlJyxcbiAgJ25vdmFsaWRhdGUnLFxuICAnbm93cmFwJyxcbiAgJ29wZW4nLFxuICAnb3B0aW11bScsXG4gICdwYXJ0JyxcbiAgJ3BhdHRlcm4nLFxuICAncGxhY2Vob2xkZXInLFxuICAncGxheXNpbmxpbmUnLFxuICAncG9wb3ZlcicsXG4gICdwb3BvdmVydGFyZ2V0JyxcbiAgJ3BvcG92ZXJ0YXJnZXRhY3Rpb24nLFxuICAncG9zdGVyJyxcbiAgJ3ByZWxvYWQnLFxuICAncHViZGF0ZScsXG4gICdyYWRpb2dyb3VwJyxcbiAgJ3JlYWRvbmx5JyxcbiAgJ3JlbCcsXG4gICdyZXF1aXJlZCcsXG4gICdyZXYnLFxuICAncmV2ZXJzZWQnLFxuICAncm9sZScsXG4gICdyb3dzJyxcbiAgJ3Jvd3NwYW4nLFxuICAnc3BlbGxjaGVjaycsXG4gICdzY29wZScsXG4gICdzZWxlY3RlZCcsXG4gICdzaGFwZScsXG4gICdzaXplJyxcbiAgJ3NpemVzJyxcbiAgJ3Nsb3QnLFxuICAnc3BhbicsXG4gICdzcmNsYW5nJyxcbiAgJ3N0YXJ0JyxcbiAgJ3NyYycsXG4gICdzcmNzZXQnLFxuICAnc3RlcCcsXG4gICdzdHlsZScsXG4gICdzdW1tYXJ5JyxcbiAgJ3RhYmluZGV4JyxcbiAgJ3RpdGxlJyxcbiAgJ3RyYW5zbGF0ZScsXG4gICd0eXBlJyxcbiAgJ3VzZW1hcCcsXG4gICd2YWxpZ24nLFxuICAndmFsdWUnLFxuICAnd2lkdGgnLFxuICAnd3JhcCcsXG4gICd4bWxucycsXG4gICdzbG90Jyxcbl0gYXMgY29uc3QpO1xuXG5leHBvcnQgY29uc3Qgc3ZnID0gZnJlZXplKFtcbiAgJ2FjY2VudC1oZWlnaHQnLFxuICAnYWNjdW11bGF0ZScsXG4gICdhZGRpdGl2ZScsXG4gICdhbGlnbm1lbnQtYmFzZWxpbmUnLFxuICAnYW1wbGl0dWRlJyxcbiAgJ2FzY2VudCcsXG4gICdhdHRyaWJ1dGVuYW1lJyxcbiAgJ2F0dHJpYnV0ZXR5cGUnLFxuICAnYXppbXV0aCcsXG4gICdiYXNlZnJlcXVlbmN5JyxcbiAgJ2Jhc2VsaW5lLXNoaWZ0JyxcbiAgJ2JlZ2luJyxcbiAgJ2JpYXMnLFxuICAnYnknLFxuICAnY2xhc3MnLFxuICAnY2xpcCcsXG4gICdjbGlwcGF0aHVuaXRzJyxcbiAgJ2NsaXAtcGF0aCcsXG4gICdjbGlwLXJ1bGUnLFxuICAnY29sb3InLFxuICAnY29sb3ItaW50ZXJwb2xhdGlvbicsXG4gICdjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnMnLFxuICAnY29sb3ItcHJvZmlsZScsXG4gICdjb2xvci1yZW5kZXJpbmcnLFxuICAnY3gnLFxuICAnY3knLFxuICAnZCcsXG4gICdkeCcsXG4gICdkeScsXG4gICdkaWZmdXNlY29uc3RhbnQnLFxuICAnZGlyZWN0aW9uJyxcbiAgJ2Rpc3BsYXknLFxuICAnZGl2aXNvcicsXG4gICdkdXInLFxuICAnZWRnZW1vZGUnLFxuICAnZWxldmF0aW9uJyxcbiAgJ2VuZCcsXG4gICdleHBvbmVudCcsXG4gICdmaWxsJyxcbiAgJ2ZpbGwtb3BhY2l0eScsXG4gICdmaWxsLXJ1bGUnLFxuICAnZmlsdGVyJyxcbiAgJ2ZpbHRlcnVuaXRzJyxcbiAgJ2Zsb29kLWNvbG9yJyxcbiAgJ2Zsb29kLW9wYWNpdHknLFxuICAnZm9udC1mYW1pbHknLFxuICAnZm9udC1zaXplJyxcbiAgJ2ZvbnQtc2l6ZS1hZGp1c3QnLFxuICAnZm9udC1zdHJldGNoJyxcbiAgJ2ZvbnQtc3R5bGUnLFxuICAnZm9udC12YXJpYW50JyxcbiAgJ2ZvbnQtd2VpZ2h0JyxcbiAgJ2Z4JyxcbiAgJ2Z5JyxcbiAgJ2cxJyxcbiAgJ2cyJyxcbiAgJ2dseXBoLW5hbWUnLFxuICAnZ2x5cGhyZWYnLFxuICAnZ3JhZGllbnR1bml0cycsXG4gICdncmFkaWVudHRyYW5zZm9ybScsXG4gICdoZWlnaHQnLFxuICAnaHJlZicsXG4gICdpZCcsXG4gICdpbWFnZS1yZW5kZXJpbmcnLFxuICAnaW4nLFxuICAnaW4yJyxcbiAgJ2ludGVyY2VwdCcsXG4gICdrJyxcbiAgJ2sxJyxcbiAgJ2syJyxcbiAgJ2szJyxcbiAgJ2s0JyxcbiAgJ2tlcm5pbmcnLFxuICAna2V5cG9pbnRzJyxcbiAgJ2tleXNwbGluZXMnLFxuICAna2V5dGltZXMnLFxuICAnbGFuZycsXG4gICdsZW5ndGhhZGp1c3QnLFxuICAnbGV0dGVyLXNwYWNpbmcnLFxuICAna2VybmVsbWF0cml4JyxcbiAgJ2tlcm5lbHVuaXRsZW5ndGgnLFxuICAnbGlnaHRpbmctY29sb3InLFxuICAnbG9jYWwnLFxuICAnbWFya2VyLWVuZCcsXG4gICdtYXJrZXItbWlkJyxcbiAgJ21hcmtlci1zdGFydCcsXG4gICdtYXJrZXJoZWlnaHQnLFxuICAnbWFya2VydW5pdHMnLFxuICAnbWFya2Vyd2lkdGgnLFxuICAnbWFza2NvbnRlbnR1bml0cycsXG4gICdtYXNrdW5pdHMnLFxuICAnbWF4JyxcbiAgJ21hc2snLFxuICAnbWFzay10eXBlJyxcbiAgJ21lZGlhJyxcbiAgJ21ldGhvZCcsXG4gICdtb2RlJyxcbiAgJ21pbicsXG4gICduYW1lJyxcbiAgJ251bW9jdGF2ZXMnLFxuICAnb2Zmc2V0JyxcbiAgJ29wZXJhdG9yJyxcbiAgJ29wYWNpdHknLFxuICAnb3JkZXInLFxuICAnb3JpZW50JyxcbiAgJ29yaWVudGF0aW9uJyxcbiAgJ29yaWdpbicsXG4gICdvdmVyZmxvdycsXG4gICdwYWludC1vcmRlcicsXG4gICdwYXRoJyxcbiAgJ3BhdGhsZW5ndGgnLFxuICAncGF0dGVybmNvbnRlbnR1bml0cycsXG4gICdwYXR0ZXJudHJhbnNmb3JtJyxcbiAgJ3BhdHRlcm51bml0cycsXG4gICdwb2ludHMnLFxuICAncHJlc2VydmVhbHBoYScsXG4gICdwcmVzZXJ2ZWFzcGVjdHJhdGlvJyxcbiAgJ3ByaW1pdGl2ZXVuaXRzJyxcbiAgJ3InLFxuICAncngnLFxuICAncnknLFxuICAncmFkaXVzJyxcbiAgJ3JlZngnLFxuICAncmVmeScsXG4gICdyZXBlYXRjb3VudCcsXG4gICdyZXBlYXRkdXInLFxuICAncmVzdGFydCcsXG4gICdyZXN1bHQnLFxuICAncm90YXRlJyxcbiAgJ3NjYWxlJyxcbiAgJ3NlZWQnLFxuICAnc2hhcGUtcmVuZGVyaW5nJyxcbiAgJ3Nsb3BlJyxcbiAgJ3NwZWN1bGFyY29uc3RhbnQnLFxuICAnc3BlY3VsYXJleHBvbmVudCcsXG4gICdzcHJlYWRtZXRob2QnLFxuICAnc3RhcnRvZmZzZXQnLFxuICAnc3RkZGV2aWF0aW9uJyxcbiAgJ3N0aXRjaHRpbGVzJyxcbiAgJ3N0b3AtY29sb3InLFxuICAnc3RvcC1vcGFjaXR5JyxcbiAgJ3N0cm9rZS1kYXNoYXJyYXknLFxuICAnc3Ryb2tlLWRhc2hvZmZzZXQnLFxuICAnc3Ryb2tlLWxpbmVjYXAnLFxuICAnc3Ryb2tlLWxpbmVqb2luJyxcbiAgJ3N0cm9rZS1taXRlcmxpbWl0JyxcbiAgJ3N0cm9rZS1vcGFjaXR5JyxcbiAgJ3N0cm9rZScsXG4gICdzdHJva2Utd2lkdGgnLFxuICAnc3R5bGUnLFxuICAnc3VyZmFjZXNjYWxlJyxcbiAgJ3N5c3RlbWxhbmd1YWdlJyxcbiAgJ3RhYmluZGV4JyxcbiAgJ3RhYmxldmFsdWVzJyxcbiAgJ3RhcmdldHgnLFxuICAndGFyZ2V0eScsXG4gICd0cmFuc2Zvcm0nLFxuICAndHJhbnNmb3JtLW9yaWdpbicsXG4gICd0ZXh0LWFuY2hvcicsXG4gICd0ZXh0LWRlY29yYXRpb24nLFxuICAndGV4dC1yZW5kZXJpbmcnLFxuICAndGV4dGxlbmd0aCcsXG4gICd0eXBlJyxcbiAgJ3UxJyxcbiAgJ3UyJyxcbiAgJ3VuaWNvZGUnLFxuICAndmFsdWVzJyxcbiAgJ3ZpZXdib3gnLFxuICAndmlzaWJpbGl0eScsXG4gICd2ZXJzaW9uJyxcbiAgJ3ZlcnQtYWR2LXknLFxuICAndmVydC1vcmlnaW4teCcsXG4gICd2ZXJ0LW9yaWdpbi15JyxcbiAgJ3dpZHRoJyxcbiAgJ3dvcmQtc3BhY2luZycsXG4gICd3cmFwJyxcbiAgJ3dyaXRpbmctbW9kZScsXG4gICd4Y2hhbm5lbHNlbGVjdG9yJyxcbiAgJ3ljaGFubmVsc2VsZWN0b3InLFxuICAneCcsXG4gICd4MScsXG4gICd4MicsXG4gICd4bWxucycsXG4gICd5JyxcbiAgJ3kxJyxcbiAgJ3kyJyxcbiAgJ3onLFxuICAnem9vbWFuZHBhbicsXG5dIGFzIGNvbnN0KTtcblxuZXhwb3J0IGNvbnN0IG1hdGhNbCA9IGZyZWV6ZShbXG4gICdhY2NlbnQnLFxuICAnYWNjZW50dW5kZXInLFxuICAnYWxpZ24nLFxuICAnYmV2ZWxsZWQnLFxuICAnY2xvc2UnLFxuICAnY29sdW1uc2FsaWduJyxcbiAgJ2NvbHVtbmxpbmVzJyxcbiAgJ2NvbHVtbnNwYW4nLFxuICAnZGVub21hbGlnbicsXG4gICdkZXB0aCcsXG4gICdkaXInLFxuICAnZGlzcGxheScsXG4gICdkaXNwbGF5c3R5bGUnLFxuICAnZW5jb2RpbmcnLFxuICAnZmVuY2UnLFxuICAnZnJhbWUnLFxuICAnaGVpZ2h0JyxcbiAgJ2hyZWYnLFxuICAnaWQnLFxuICAnbGFyZ2VvcCcsXG4gICdsZW5ndGgnLFxuICAnbGluZXRoaWNrbmVzcycsXG4gICdsc3BhY2UnLFxuICAnbHF1b3RlJyxcbiAgJ21hdGhiYWNrZ3JvdW5kJyxcbiAgJ21hdGhjb2xvcicsXG4gICdtYXRoc2l6ZScsXG4gICdtYXRodmFyaWFudCcsXG4gICdtYXhzaXplJyxcbiAgJ21pbnNpemUnLFxuICAnbW92YWJsZWxpbWl0cycsXG4gICdub3RhdGlvbicsXG4gICdudW1hbGlnbicsXG4gICdvcGVuJyxcbiAgJ3Jvd2FsaWduJyxcbiAgJ3Jvd2xpbmVzJyxcbiAgJ3Jvd3NwYWNpbmcnLFxuICAncm93c3BhbicsXG4gICdyc3BhY2UnLFxuICAncnF1b3RlJyxcbiAgJ3NjcmlwdGxldmVsJyxcbiAgJ3NjcmlwdG1pbnNpemUnLFxuICAnc2NyaXB0c2l6ZW11bHRpcGxpZXInLFxuICAnc2VsZWN0aW9uJyxcbiAgJ3NlcGFyYXRvcicsXG4gICdzZXBhcmF0b3JzJyxcbiAgJ3N0cmV0Y2h5JyxcbiAgJ3N1YnNjcmlwdHNoaWZ0JyxcbiAgJ3N1cHNjcmlwdHNoaWZ0JyxcbiAgJ3N5bW1ldHJpYycsXG4gICd2b2Zmc2V0JyxcbiAgJ3dpZHRoJyxcbiAgJ3htbG5zJyxcbl0pO1xuXG5leHBvcnQgY29uc3QgeG1sID0gZnJlZXplKFtcbiAgJ3hsaW5rOmhyZWYnLFxuICAneG1sOmlkJyxcbiAgJ3hsaW5rOnRpdGxlJyxcbiAgJ3htbDpzcGFjZScsXG4gICd4bWxuczp4bGluaycsXG5dIGFzIGNvbnN0KTtcbiIsICJpbXBvcnQgeyBzZWFsIH0gZnJvbSAnLi91dGlscy5qcyc7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL2JldHRlci1yZWdleFxuZXhwb3J0IGNvbnN0IE1VU1RBQ0hFX0VYUFIgPSBzZWFsKC9cXHtcXHtbXFx3XFxXXSp8W1xcd1xcV10qXFx9XFx9L2dtKTsgLy8gU3BlY2lmeSB0ZW1wbGF0ZSBkZXRlY3Rpb24gcmVnZXggZm9yIFNBRkVfRk9SX1RFTVBMQVRFUyBtb2RlXG5leHBvcnQgY29uc3QgRVJCX0VYUFIgPSBzZWFsKC88JVtcXHdcXFddKnxbXFx3XFxXXSolPi9nbSk7XG5leHBvcnQgY29uc3QgVE1QTElUX0VYUFIgPSBzZWFsKC9cXCRcXHtbXFx3XFxXXSovZ20pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHVuaWNvcm4vYmV0dGVyLXJlZ2V4XG5leHBvcnQgY29uc3QgREFUQV9BVFRSID0gc2VhbCgvXmRhdGEtW1xcLVxcdy5cXHUwMEI3LVxcdUZGRkZdKyQvKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2VsZXNzLWVzY2FwZVxuZXhwb3J0IGNvbnN0IEFSSUFfQVRUUiA9IHNlYWwoL15hcmlhLVtcXC1cXHddKyQvKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2VsZXNzLWVzY2FwZVxuZXhwb3J0IGNvbnN0IElTX0FMTE9XRURfVVJJID0gc2VhbChcbiAgL14oPzooPzooPzpmfGh0KXRwcz98bWFpbHRvfHRlbHxjYWxsdG98c21zfGNpZHx4bXBwfG1hdHJpeCk6fFteYS16XXxbYS16Ky5cXC1dKyg/OlteYS16Ky5cXC06XXwkKSkvaSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZWxlc3MtZXNjYXBlXG4pO1xuZXhwb3J0IGNvbnN0IElTX1NDUklQVF9PUl9EQVRBID0gc2VhbCgvXig/OlxcdytzY3JpcHR8ZGF0YSk6L2kpO1xuZXhwb3J0IGNvbnN0IEFUVFJfV0hJVEVTUEFDRSA9IHNlYWwoXG4gIC9bXFx1MDAwMC1cXHUwMDIwXFx1MDBBMFxcdTE2ODBcXHUxODBFXFx1MjAwMC1cXHUyMDI5XFx1MjA1RlxcdTMwMDBdL2cgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb250cm9sLXJlZ2V4XG4pO1xuZXhwb3J0IGNvbnN0IERPQ1RZUEVfTkFNRSA9IHNlYWwoL15odG1sJC9pKTtcbmV4cG9ydCBjb25zdCBDVVNUT01fRUxFTUVOVCA9IHNlYWwoL15bYS16XVsuXFx3XSooLVsuXFx3XSspKyQvaSk7XG4iLCAiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L2luZGVudCAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIFRydXN0ZWRIVE1MLFxuICBUcnVzdGVkVHlwZXNXaW5kb3csXG59IGZyb20gJ3RydXN0ZWQtdHlwZXMvbGliL2luZGV4LmpzJztcbmltcG9ydCB0eXBlIHsgQ29uZmlnLCBVc2VQcm9maWxlc0NvbmZpZyB9IGZyb20gJy4vY29uZmlnJztcbmltcG9ydCAqIGFzIFRBR1MgZnJvbSAnLi90YWdzLmpzJztcbmltcG9ydCAqIGFzIEFUVFJTIGZyb20gJy4vYXR0cnMuanMnO1xuaW1wb3J0ICogYXMgRVhQUkVTU0lPTlMgZnJvbSAnLi9yZWdleHAuanMnO1xuaW1wb3J0IHtcbiAgYWRkVG9TZXQsXG4gIGNsb25lLFxuICBlbnRyaWVzLFxuICBmcmVlemUsXG4gIGFycmF5Rm9yRWFjaCxcbiAgYXJyYXlMYXN0SW5kZXhPZixcbiAgYXJyYXlQb3AsXG4gIGFycmF5UHVzaCxcbiAgYXJyYXlTcGxpY2UsXG4gIHN0cmluZ01hdGNoLFxuICBzdHJpbmdSZXBsYWNlLFxuICBzdHJpbmdUb0xvd2VyQ2FzZSxcbiAgc3RyaW5nVG9TdHJpbmcsXG4gIHN0cmluZ0luZGV4T2YsXG4gIHN0cmluZ1RyaW0sXG4gIHJlZ0V4cFRlc3QsXG4gIHR5cGVFcnJvckNyZWF0ZSxcbiAgbG9va3VwR2V0dGVyLFxuICBjcmVhdGUsXG4gIG9iamVjdEhhc093blByb3BlcnR5LFxufSBmcm9tICcuL3V0aWxzLmpzJztcblxuZXhwb3J0IHR5cGUgeyBDb25maWcgfSBmcm9tICcuL2NvbmZpZyc7XG5cbmRlY2xhcmUgY29uc3QgVkVSU0lPTjogc3RyaW5nO1xuXG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvTm9kZS9ub2RlVHlwZVxuY29uc3QgTk9ERV9UWVBFID0ge1xuICBlbGVtZW50OiAxLFxuICBhdHRyaWJ1dGU6IDIsXG4gIHRleHQ6IDMsXG4gIGNkYXRhU2VjdGlvbjogNCxcbiAgZW50aXR5UmVmZXJlbmNlOiA1LCAvLyBEZXByZWNhdGVkXG4gIGVudGl0eU5vZGU6IDYsIC8vIERlcHJlY2F0ZWRcbiAgcHJvZ3Jlc3NpbmdJbnN0cnVjdGlvbjogNyxcbiAgY29tbWVudDogOCxcbiAgZG9jdW1lbnQ6IDksXG4gIGRvY3VtZW50VHlwZTogMTAsXG4gIGRvY3VtZW50RnJhZ21lbnQ6IDExLFxuICBub3RhdGlvbjogMTIsIC8vIERlcHJlY2F0ZWRcbn07XG5cbmNvbnN0IGdldEdsb2JhbCA9IGZ1bmN0aW9uICgpOiBXaW5kb3dMaWtlIHtcbiAgcmV0dXJuIHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnID8gbnVsbCA6IHdpbmRvdztcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5vLW9wIHBvbGljeSBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuXG4gKiBEb24ndCBleHBvcnQgdGhpcyBmdW5jdGlvbiBvdXRzaWRlIHRoaXMgbW9kdWxlIVxuICogQHBhcmFtIHRydXN0ZWRUeXBlcyBUaGUgcG9saWN5IGZhY3RvcnkuXG4gKiBAcGFyYW0gcHVyaWZ5SG9zdEVsZW1lbnQgVGhlIFNjcmlwdCBlbGVtZW50IHVzZWQgdG8gbG9hZCBET01QdXJpZnkgKHRvIGRldGVybWluZSBwb2xpY3kgbmFtZSBzdWZmaXgpLlxuICogQHJldHVybiBUaGUgcG9saWN5IGNyZWF0ZWQgKG9yIG51bGwsIGlmIFRydXN0ZWQgVHlwZXNcbiAqIGFyZSBub3Qgc3VwcG9ydGVkIG9yIGNyZWF0aW5nIHRoZSBwb2xpY3kgZmFpbGVkKS5cbiAqL1xuY29uc3QgX2NyZWF0ZVRydXN0ZWRUeXBlc1BvbGljeSA9IGZ1bmN0aW9uIChcbiAgdHJ1c3RlZFR5cGVzOiBUcnVzdGVkVHlwZVBvbGljeUZhY3RvcnksXG4gIHB1cmlmeUhvc3RFbGVtZW50OiBIVE1MU2NyaXB0RWxlbWVudFxuKSB7XG4gIGlmIChcbiAgICB0eXBlb2YgdHJ1c3RlZFR5cGVzICE9PSAnb2JqZWN0JyB8fFxuICAgIHR5cGVvZiB0cnVzdGVkVHlwZXMuY3JlYXRlUG9saWN5ICE9PSAnZnVuY3Rpb24nXG4gICkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gQWxsb3cgdGhlIGNhbGxlcnMgdG8gY29udHJvbCB0aGUgdW5pcXVlIHBvbGljeSBuYW1lXG4gIC8vIGJ5IGFkZGluZyBhIGRhdGEtdHQtcG9saWN5LXN1ZmZpeCB0byB0aGUgc2NyaXB0IGVsZW1lbnQgd2l0aCB0aGUgRE9NUHVyaWZ5LlxuICAvLyBQb2xpY3kgY3JlYXRpb24gd2l0aCBkdXBsaWNhdGUgbmFtZXMgdGhyb3dzIGluIFRydXN0ZWQgVHlwZXMuXG4gIGxldCBzdWZmaXggPSBudWxsO1xuICBjb25zdCBBVFRSX05BTUUgPSAnZGF0YS10dC1wb2xpY3ktc3VmZml4JztcbiAgaWYgKHB1cmlmeUhvc3RFbGVtZW50ICYmIHB1cmlmeUhvc3RFbGVtZW50Lmhhc0F0dHJpYnV0ZShBVFRSX05BTUUpKSB7XG4gICAgc3VmZml4ID0gcHVyaWZ5SG9zdEVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJfTkFNRSk7XG4gIH1cblxuICBjb25zdCBwb2xpY3lOYW1lID0gJ2RvbXB1cmlmeScgKyAoc3VmZml4ID8gJyMnICsgc3VmZml4IDogJycpO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIHRydXN0ZWRUeXBlcy5jcmVhdGVQb2xpY3kocG9saWN5TmFtZSwge1xuICAgICAgY3JlYXRlSFRNTChodG1sKSB7XG4gICAgICAgIHJldHVybiBodG1sO1xuICAgICAgfSxcbiAgICAgIGNyZWF0ZVNjcmlwdFVSTChzY3JpcHRVcmwpIHtcbiAgICAgICAgcmV0dXJuIHNjcmlwdFVybDtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0gY2F0Y2ggKF8pIHtcbiAgICAvLyBQb2xpY3kgY3JlYXRpb24gZmFpbGVkIChtb3N0IGxpa2VseSBhbm90aGVyIERPTVB1cmlmeSBzY3JpcHQgaGFzXG4gICAgLy8gYWxyZWFkeSBydW4pLiBTa2lwIGNyZWF0aW5nIHRoZSBwb2xpY3ksIGFzIHRoaXMgd2lsbCBvbmx5IGNhdXNlIGVycm9yc1xuICAgIC8vIGlmIFRUIGFyZSBlbmZvcmNlZC5cbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAnVHJ1c3RlZFR5cGVzIHBvbGljeSAnICsgcG9saWN5TmFtZSArICcgY291bGQgbm90IGJlIGNyZWF0ZWQuJ1xuICAgICk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn07XG5cbmNvbnN0IF9jcmVhdGVIb29rc01hcCA9IGZ1bmN0aW9uICgpOiBIb29rc01hcCB7XG4gIHJldHVybiB7XG4gICAgYWZ0ZXJTYW5pdGl6ZUF0dHJpYnV0ZXM6IFtdLFxuICAgIGFmdGVyU2FuaXRpemVFbGVtZW50czogW10sXG4gICAgYWZ0ZXJTYW5pdGl6ZVNoYWRvd0RPTTogW10sXG4gICAgYmVmb3JlU2FuaXRpemVBdHRyaWJ1dGVzOiBbXSxcbiAgICBiZWZvcmVTYW5pdGl6ZUVsZW1lbnRzOiBbXSxcbiAgICBiZWZvcmVTYW5pdGl6ZVNoYWRvd0RPTTogW10sXG4gICAgdXBvblNhbml0aXplQXR0cmlidXRlOiBbXSxcbiAgICB1cG9uU2FuaXRpemVFbGVtZW50OiBbXSxcbiAgICB1cG9uU2FuaXRpemVTaGFkb3dOb2RlOiBbXSxcbiAgfTtcbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZURPTVB1cmlmeSh3aW5kb3c6IFdpbmRvd0xpa2UgPSBnZXRHbG9iYWwoKSk6IERPTVB1cmlmeSB7XG4gIGNvbnN0IERPTVB1cmlmeTogRE9NUHVyaWZ5ID0gKHJvb3Q6IFdpbmRvd0xpa2UpID0+IGNyZWF0ZURPTVB1cmlmeShyb290KTtcblxuICBET01QdXJpZnkudmVyc2lvbiA9IFZFUlNJT047XG5cbiAgRE9NUHVyaWZ5LnJlbW92ZWQgPSBbXTtcblxuICBpZiAoXG4gICAgIXdpbmRvdyB8fFxuICAgICF3aW5kb3cuZG9jdW1lbnQgfHxcbiAgICB3aW5kb3cuZG9jdW1lbnQubm9kZVR5cGUgIT09IE5PREVfVFlQRS5kb2N1bWVudCB8fFxuICAgICF3aW5kb3cuRWxlbWVudFxuICApIHtcbiAgICAvLyBOb3QgcnVubmluZyBpbiBhIGJyb3dzZXIsIHByb3ZpZGUgYSBmYWN0b3J5IGZ1bmN0aW9uXG4gICAgLy8gc28gdGhhdCB5b3UgY2FuIHBhc3MgeW91ciBvd24gV2luZG93XG4gICAgRE9NUHVyaWZ5LmlzU3VwcG9ydGVkID0gZmFsc2U7XG5cbiAgICByZXR1cm4gRE9NUHVyaWZ5O1xuICB9XG5cbiAgbGV0IHsgZG9jdW1lbnQgfSA9IHdpbmRvdztcblxuICBjb25zdCBvcmlnaW5hbERvY3VtZW50ID0gZG9jdW1lbnQ7XG4gIGNvbnN0IGN1cnJlbnRTY3JpcHQ6IEhUTUxTY3JpcHRFbGVtZW50ID1cbiAgICBvcmlnaW5hbERvY3VtZW50LmN1cnJlbnRTY3JpcHQgYXMgSFRNTFNjcmlwdEVsZW1lbnQ7XG4gIGNvbnN0IHtcbiAgICBEb2N1bWVudEZyYWdtZW50LFxuICAgIEhUTUxUZW1wbGF0ZUVsZW1lbnQsXG4gICAgTm9kZSxcbiAgICBFbGVtZW50LFxuICAgIE5vZGVGaWx0ZXIsXG4gICAgTmFtZWROb2RlTWFwID0gd2luZG93Lk5hbWVkTm9kZU1hcCB8fCAod2luZG93IGFzIGFueSkuTW96TmFtZWRBdHRyTWFwLFxuICAgIEhUTUxGb3JtRWxlbWVudCxcbiAgICBET01QYXJzZXIsXG4gICAgdHJ1c3RlZFR5cGVzLFxuICB9ID0gd2luZG93O1xuXG4gIGNvbnN0IEVsZW1lbnRQcm90b3R5cGUgPSBFbGVtZW50LnByb3RvdHlwZTtcblxuICBjb25zdCBjbG9uZU5vZGUgPSBsb29rdXBHZXR0ZXIoRWxlbWVudFByb3RvdHlwZSwgJ2Nsb25lTm9kZScpO1xuICBjb25zdCByZW1vdmUgPSBsb29rdXBHZXR0ZXIoRWxlbWVudFByb3RvdHlwZSwgJ3JlbW92ZScpO1xuICBjb25zdCBnZXROZXh0U2libGluZyA9IGxvb2t1cEdldHRlcihFbGVtZW50UHJvdG90eXBlLCAnbmV4dFNpYmxpbmcnKTtcbiAgY29uc3QgZ2V0Q2hpbGROb2RlcyA9IGxvb2t1cEdldHRlcihFbGVtZW50UHJvdG90eXBlLCAnY2hpbGROb2RlcycpO1xuICBjb25zdCBnZXRQYXJlbnROb2RlID0gbG9va3VwR2V0dGVyKEVsZW1lbnRQcm90b3R5cGUsICdwYXJlbnROb2RlJyk7XG5cbiAgLy8gQXMgcGVyIGlzc3VlICM0NywgdGhlIHdlYi1jb21wb25lbnRzIHJlZ2lzdHJ5IGlzIGluaGVyaXRlZCBieSBhXG4gIC8vIG5ldyBkb2N1bWVudCBjcmVhdGVkIHZpYSBjcmVhdGVIVE1MRG9jdW1lbnQuIEFzIHBlciB0aGUgc3BlY1xuICAvLyAoaHR0cDovL3czYy5naXRodWIuaW8vd2ViY29tcG9uZW50cy9zcGVjL2N1c3RvbS8jY3JlYXRpbmctYW5kLXBhc3NpbmctcmVnaXN0cmllcylcbiAgLy8gYSBuZXcgZW1wdHkgcmVnaXN0cnkgaXMgdXNlZCB3aGVuIGNyZWF0aW5nIGEgdGVtcGxhdGUgY29udGVudHMgb3duZXJcbiAgLy8gZG9jdW1lbnQsIHNvIHdlIHVzZSB0aGF0IGFzIG91ciBwYXJlbnQgZG9jdW1lbnQgdG8gZW5zdXJlIG5vdGhpbmdcbiAgLy8gaXMgaW5oZXJpdGVkLlxuICBpZiAodHlwZW9mIEhUTUxUZW1wbGF0ZUVsZW1lbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7XG4gICAgaWYgKHRlbXBsYXRlLmNvbnRlbnQgJiYgdGVtcGxhdGUuY29udGVudC5vd25lckRvY3VtZW50KSB7XG4gICAgICBkb2N1bWVudCA9IHRlbXBsYXRlLmNvbnRlbnQub3duZXJEb2N1bWVudDtcbiAgICB9XG4gIH1cblxuICBsZXQgdHJ1c3RlZFR5cGVzUG9saWN5O1xuICBsZXQgZW1wdHlIVE1MID0gJyc7XG5cbiAgY29uc3Qge1xuICAgIGltcGxlbWVudGF0aW9uLFxuICAgIGNyZWF0ZU5vZGVJdGVyYXRvcixcbiAgICBjcmVhdGVEb2N1bWVudEZyYWdtZW50LFxuICAgIGdldEVsZW1lbnRzQnlUYWdOYW1lLFxuICB9ID0gZG9jdW1lbnQ7XG4gIGNvbnN0IHsgaW1wb3J0Tm9kZSB9ID0gb3JpZ2luYWxEb2N1bWVudDtcblxuICBsZXQgaG9va3MgPSBfY3JlYXRlSG9va3NNYXAoKTtcblxuICAvKipcbiAgICogRXhwb3NlIHdoZXRoZXIgdGhpcyBicm93c2VyIHN1cHBvcnRzIHJ1bm5pbmcgdGhlIGZ1bGwgRE9NUHVyaWZ5LlxuICAgKi9cbiAgRE9NUHVyaWZ5LmlzU3VwcG9ydGVkID1cbiAgICB0eXBlb2YgZW50cmllcyA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIHR5cGVvZiBnZXRQYXJlbnROb2RlID09PSAnZnVuY3Rpb24nICYmXG4gICAgaW1wbGVtZW50YXRpb24gJiZcbiAgICBpbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQgIT09IHVuZGVmaW5lZDtcblxuICBjb25zdCB7XG4gICAgTVVTVEFDSEVfRVhQUixcbiAgICBFUkJfRVhQUixcbiAgICBUTVBMSVRfRVhQUixcbiAgICBEQVRBX0FUVFIsXG4gICAgQVJJQV9BVFRSLFxuICAgIElTX1NDUklQVF9PUl9EQVRBLFxuICAgIEFUVFJfV0hJVEVTUEFDRSxcbiAgICBDVVNUT01fRUxFTUVOVCxcbiAgfSA9IEVYUFJFU1NJT05TO1xuXG4gIGxldCB7IElTX0FMTE9XRURfVVJJIH0gPSBFWFBSRVNTSU9OUztcblxuICAvKipcbiAgICogV2UgY29uc2lkZXIgdGhlIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGJlbG93IHRvIGJlIHNhZmUuIElkZWFsbHlcbiAgICogZG9uJ3QgYWRkIGFueSBuZXcgb25lcyBidXQgZmVlbCBmcmVlIHRvIHJlbW92ZSB1bndhbnRlZCBvbmVzLlxuICAgKi9cblxuICAvKiBhbGxvd2VkIGVsZW1lbnQgbmFtZXMgKi9cbiAgbGV0IEFMTE9XRURfVEFHUyA9IG51bGw7XG4gIGNvbnN0IERFRkFVTFRfQUxMT1dFRF9UQUdTID0gYWRkVG9TZXQoe30sIFtcbiAgICAuLi5UQUdTLmh0bWwsXG4gICAgLi4uVEFHUy5zdmcsXG4gICAgLi4uVEFHUy5zdmdGaWx0ZXJzLFxuICAgIC4uLlRBR1MubWF0aE1sLFxuICAgIC4uLlRBR1MudGV4dCxcbiAgXSk7XG5cbiAgLyogQWxsb3dlZCBhdHRyaWJ1dGUgbmFtZXMgKi9cbiAgbGV0IEFMTE9XRURfQVRUUiA9IG51bGw7XG4gIGNvbnN0IERFRkFVTFRfQUxMT1dFRF9BVFRSID0gYWRkVG9TZXQoe30sIFtcbiAgICAuLi5BVFRSUy5odG1sLFxuICAgIC4uLkFUVFJTLnN2ZyxcbiAgICAuLi5BVFRSUy5tYXRoTWwsXG4gICAgLi4uQVRUUlMueG1sLFxuICBdKTtcblxuICAvKlxuICAgKiBDb25maWd1cmUgaG93IERPTVB1cmlmeSBzaG91bGQgaGFuZGxlIGN1c3RvbSBlbGVtZW50cyBhbmQgdGhlaXIgYXR0cmlidXRlcyBhcyB3ZWxsIGFzIGN1c3RvbWl6ZWQgYnVpbHQtaW4gZWxlbWVudHMuXG4gICAqIEBwcm9wZXJ0eSB7UmVnRXhwfEZ1bmN0aW9ufG51bGx9IHRhZ05hbWVDaGVjayBvbmUgb2YgW251bGwsIHJlZ2V4UGF0dGVybiwgcHJlZGljYXRlXS4gRGVmYXVsdDogYG51bGxgIChkaXNhbGxvdyBhbnkgY3VzdG9tIGVsZW1lbnRzKVxuICAgKiBAcHJvcGVydHkge1JlZ0V4cHxGdW5jdGlvbnxudWxsfSBhdHRyaWJ1dGVOYW1lQ2hlY2sgb25lIG9mIFtudWxsLCByZWdleFBhdHRlcm4sIHByZWRpY2F0ZV0uIERlZmF1bHQ6IGBudWxsYCAoZGlzYWxsb3cgYW55IGF0dHJpYnV0ZXMgbm90IG9uIHRoZSBhbGxvdyBsaXN0KVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IGFsbG93Q3VzdG9taXplZEJ1aWx0SW5FbGVtZW50cyBhbGxvdyBjdXN0b20gZWxlbWVudHMgZGVyaXZlZCBmcm9tIGJ1aWx0LWlucyBpZiB0aGV5IHBhc3MgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrLiBEZWZhdWx0OiBgZmFsc2VgLlxuICAgKi9cbiAgbGV0IENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HID0gT2JqZWN0LnNlYWwoXG4gICAgY3JlYXRlKG51bGwsIHtcbiAgICAgIHRhZ05hbWVDaGVjazoge1xuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IG51bGwsXG4gICAgICB9LFxuICAgICAgYXR0cmlidXRlTmFtZUNoZWNrOiB7XG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogbnVsbCxcbiAgICAgIH0sXG4gICAgICBhbGxvd0N1c3RvbWl6ZWRCdWlsdEluRWxlbWVudHM6IHtcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgfSlcbiAgKTtcblxuICAvKiBFeHBsaWNpdGx5IGZvcmJpZGRlbiB0YWdzIChvdmVycmlkZXMgQUxMT1dFRF9UQUdTL0FERF9UQUdTKSAqL1xuICBsZXQgRk9SQklEX1RBR1MgPSBudWxsO1xuXG4gIC8qIEV4cGxpY2l0bHkgZm9yYmlkZGVuIGF0dHJpYnV0ZXMgKG92ZXJyaWRlcyBBTExPV0VEX0FUVFIvQUREX0FUVFIpICovXG4gIGxldCBGT1JCSURfQVRUUiA9IG51bGw7XG5cbiAgLyogQ29uZmlnIG9iamVjdCB0byBzdG9yZSBBRERfVEFHUy9BRERfQVRUUiBmdW5jdGlvbnMgKHdoZW4gdXNlZCBhcyBmdW5jdGlvbnMpICovXG4gIGNvbnN0IEVYVFJBX0VMRU1FTlRfSEFORExJTkcgPSBPYmplY3Quc2VhbChcbiAgICBjcmVhdGUobnVsbCwge1xuICAgICAgdGFnQ2hlY2s6IHtcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgfSxcbiAgICAgIGF0dHJpYnV0ZUNoZWNrOiB7XG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogbnVsbCxcbiAgICAgIH0sXG4gICAgfSlcbiAgKTtcblxuICAvKiBEZWNpZGUgaWYgQVJJQSBhdHRyaWJ1dGVzIGFyZSBva2F5ICovXG4gIGxldCBBTExPV19BUklBX0FUVFIgPSB0cnVlO1xuXG4gIC8qIERlY2lkZSBpZiBjdXN0b20gZGF0YSBhdHRyaWJ1dGVzIGFyZSBva2F5ICovXG4gIGxldCBBTExPV19EQVRBX0FUVFIgPSB0cnVlO1xuXG4gIC8qIERlY2lkZSBpZiB1bmtub3duIHByb3RvY29scyBhcmUgb2theSAqL1xuICBsZXQgQUxMT1dfVU5LTk9XTl9QUk9UT0NPTFMgPSBmYWxzZTtcblxuICAvKiBEZWNpZGUgaWYgc2VsZi1jbG9zaW5nIHRhZ3MgaW4gYXR0cmlidXRlcyBhcmUgYWxsb3dlZC5cbiAgICogVXN1YWxseSByZW1vdmVkIGR1ZSB0byBhIG1YU1MgaXNzdWUgaW4galF1ZXJ5IDMuMCAqL1xuICBsZXQgQUxMT1dfU0VMRl9DTE9TRV9JTl9BVFRSID0gdHJ1ZTtcblxuICAvKiBPdXRwdXQgc2hvdWxkIGJlIHNhZmUgZm9yIGNvbW1vbiB0ZW1wbGF0ZSBlbmdpbmVzLlxuICAgKiBUaGlzIG1lYW5zLCBET01QdXJpZnkgcmVtb3ZlcyBkYXRhIGF0dHJpYnV0ZXMsIG11c3RhY2hlcyBhbmQgRVJCXG4gICAqL1xuICBsZXQgU0FGRV9GT1JfVEVNUExBVEVTID0gZmFsc2U7XG5cbiAgLyogT3V0cHV0IHNob3VsZCBiZSBzYWZlIGV2ZW4gZm9yIFhNTCB1c2VkIHdpdGhpbiBIVE1MIGFuZCBhbGlrZS5cbiAgICogVGhpcyBtZWFucywgRE9NUHVyaWZ5IHJlbW92ZXMgY29tbWVudHMgd2hlbiBjb250YWluaW5nIHJpc2t5IGNvbnRlbnQuXG4gICAqL1xuICBsZXQgU0FGRV9GT1JfWE1MID0gdHJ1ZTtcblxuICAvKiBEZWNpZGUgaWYgZG9jdW1lbnQgd2l0aCA8aHRtbD4uLi4gc2hvdWxkIGJlIHJldHVybmVkICovXG4gIGxldCBXSE9MRV9ET0NVTUVOVCA9IGZhbHNlO1xuXG4gIC8qIFRyYWNrIHdoZXRoZXIgY29uZmlnIGlzIGFscmVhZHkgc2V0IG9uIHRoaXMgaW5zdGFuY2Ugb2YgRE9NUHVyaWZ5LiAqL1xuICBsZXQgU0VUX0NPTkZJRyA9IGZhbHNlO1xuXG4gIC8qIERlY2lkZSBpZiBhbGwgZWxlbWVudHMgKGUuZy4gc3R5bGUsIHNjcmlwdCkgbXVzdCBiZSBjaGlsZHJlbiBvZlxuICAgKiBkb2N1bWVudC5ib2R5LiBCeSBkZWZhdWx0LCBicm93c2VycyBtaWdodCBtb3ZlIHRoZW0gdG8gZG9jdW1lbnQuaGVhZCAqL1xuICBsZXQgRk9SQ0VfQk9EWSA9IGZhbHNlO1xuXG4gIC8qIERlY2lkZSBpZiBhIERPTSBgSFRNTEJvZHlFbGVtZW50YCBzaG91bGQgYmUgcmV0dXJuZWQsIGluc3RlYWQgb2YgYSBodG1sXG4gICAqIHN0cmluZyAob3IgYSBUcnVzdGVkSFRNTCBvYmplY3QgaWYgVHJ1c3RlZCBUeXBlcyBhcmUgc3VwcG9ydGVkKS5cbiAgICogSWYgYFdIT0xFX0RPQ1VNRU5UYCBpcyBlbmFibGVkIGEgYEhUTUxIdG1sRWxlbWVudGAgd2lsbCBiZSByZXR1cm5lZCBpbnN0ZWFkXG4gICAqL1xuICBsZXQgUkVUVVJOX0RPTSA9IGZhbHNlO1xuXG4gIC8qIERlY2lkZSBpZiBhIERPTSBgRG9jdW1lbnRGcmFnbWVudGAgc2hvdWxkIGJlIHJldHVybmVkLCBpbnN0ZWFkIG9mIGEgaHRtbFxuICAgKiBzdHJpbmcgIChvciBhIFRydXN0ZWRIVE1MIG9iamVjdCBpZiBUcnVzdGVkIFR5cGVzIGFyZSBzdXBwb3J0ZWQpICovXG4gIGxldCBSRVRVUk5fRE9NX0ZSQUdNRU5UID0gZmFsc2U7XG5cbiAgLyogVHJ5IHRvIHJldHVybiBhIFRydXN0ZWQgVHlwZSBvYmplY3QgaW5zdGVhZCBvZiBhIHN0cmluZywgcmV0dXJuIGEgc3RyaW5nIGluXG4gICAqIGNhc2UgVHJ1c3RlZCBUeXBlcyBhcmUgbm90IHN1cHBvcnRlZCAgKi9cbiAgbGV0IFJFVFVSTl9UUlVTVEVEX1RZUEUgPSBmYWxzZTtcblxuICAvKiBPdXRwdXQgc2hvdWxkIGJlIGZyZWUgZnJvbSBET00gY2xvYmJlcmluZyBhdHRhY2tzP1xuICAgKiBUaGlzIHNhbml0aXplcyBtYXJrdXBzIG5hbWVkIHdpdGggY29sbGlkaW5nLCBjbG9iYmVyYWJsZSBidWlsdC1pbiBET00gQVBJcy5cbiAgICovXG4gIGxldCBTQU5JVElaRV9ET00gPSB0cnVlO1xuXG4gIC8qIEFjaGlldmUgZnVsbCBET00gQ2xvYmJlcmluZyBwcm90ZWN0aW9uIGJ5IGlzb2xhdGluZyB0aGUgbmFtZXNwYWNlIG9mIG5hbWVkXG4gICAqIHByb3BlcnRpZXMgYW5kIEpTIHZhcmlhYmxlcywgbWl0aWdhdGluZyBhdHRhY2tzIHRoYXQgYWJ1c2UgdGhlIEhUTUwvRE9NIHNwZWMgcnVsZXMuXG4gICAqXG4gICAqIEhUTUwvRE9NIHNwZWMgcnVsZXMgdGhhdCBlbmFibGUgRE9NIENsb2JiZXJpbmc6XG4gICAqICAgLSBOYW1lZCBBY2Nlc3Mgb24gV2luZG93ICjCpzcuMy4zKVxuICAgKiAgIC0gRE9NIFRyZWUgQWNjZXNzb3JzICjCpzMuMS41KVxuICAgKiAgIC0gRm9ybSBFbGVtZW50IFBhcmVudC1DaGlsZCBSZWxhdGlvbnMgKMKnNC4xMC4zKVxuICAgKiAgIC0gSWZyYW1lIHNyY2RvYyAvIE5lc3RlZCBXaW5kb3dQcm94aWVzICjCpzQuOC41KVxuICAgKiAgIC0gSFRNTENvbGxlY3Rpb24gKMKnNC4yLjEwLjIpXG4gICAqXG4gICAqIE5hbWVzcGFjZSBpc29sYXRpb24gaXMgaW1wbGVtZW50ZWQgYnkgcHJlZml4aW5nIGBpZGAgYW5kIGBuYW1lYCBhdHRyaWJ1dGVzXG4gICAqIHdpdGggYSBjb25zdGFudCBzdHJpbmcsIGkuZS4sIGB1c2VyLWNvbnRlbnQtYFxuICAgKi9cbiAgbGV0IFNBTklUSVpFX05BTUVEX1BST1BTID0gZmFsc2U7XG4gIGNvbnN0IFNBTklUSVpFX05BTUVEX1BST1BTX1BSRUZJWCA9ICd1c2VyLWNvbnRlbnQtJztcblxuICAvKiBLZWVwIGVsZW1lbnQgY29udGVudCB3aGVuIHJlbW92aW5nIGVsZW1lbnQ/ICovXG4gIGxldCBLRUVQX0NPTlRFTlQgPSB0cnVlO1xuXG4gIC8qIElmIGEgYE5vZGVgIGlzIHBhc3NlZCB0byBzYW5pdGl6ZSgpLCB0aGVuIHBlcmZvcm1zIHNhbml0aXphdGlvbiBpbi1wbGFjZSBpbnN0ZWFkXG4gICAqIG9mIGltcG9ydGluZyBpdCBpbnRvIGEgbmV3IERvY3VtZW50IGFuZCByZXR1cm5pbmcgYSBzYW5pdGl6ZWQgY29weSAqL1xuICBsZXQgSU5fUExBQ0UgPSBmYWxzZTtcblxuICAvKiBBbGxvdyB1c2FnZSBvZiBwcm9maWxlcyBsaWtlIGh0bWwsIHN2ZyBhbmQgbWF0aE1sICovXG4gIGxldCBVU0VfUFJPRklMRVM6IFVzZVByb2ZpbGVzQ29uZmlnIHwgZmFsc2UgPSB7fTtcblxuICAvKiBUYWdzIHRvIGlnbm9yZSBjb250ZW50IG9mIHdoZW4gS0VFUF9DT05URU5UIGlzIHRydWUgKi9cbiAgbGV0IEZPUkJJRF9DT05URU5UUyA9IG51bGw7XG4gIGNvbnN0IERFRkFVTFRfRk9SQklEX0NPTlRFTlRTID0gYWRkVG9TZXQoe30sIFtcbiAgICAnYW5ub3RhdGlvbi14bWwnLFxuICAgICdhdWRpbycsXG4gICAgJ2NvbGdyb3VwJyxcbiAgICAnZGVzYycsXG4gICAgJ2ZvcmVpZ25vYmplY3QnLFxuICAgICdoZWFkJyxcbiAgICAnaWZyYW1lJyxcbiAgICAnbWF0aCcsXG4gICAgJ21pJyxcbiAgICAnbW4nLFxuICAgICdtbycsXG4gICAgJ21zJyxcbiAgICAnbXRleHQnLFxuICAgICdub2VtYmVkJyxcbiAgICAnbm9mcmFtZXMnLFxuICAgICdub3NjcmlwdCcsXG4gICAgJ3BsYWludGV4dCcsXG4gICAgJ3NjcmlwdCcsXG4gICAgJ3N0eWxlJyxcbiAgICAnc3ZnJyxcbiAgICAndGVtcGxhdGUnLFxuICAgICd0aGVhZCcsXG4gICAgJ3RpdGxlJyxcbiAgICAndmlkZW8nLFxuICAgICd4bXAnLFxuICBdKTtcblxuICAvKiBUYWdzIHRoYXQgYXJlIHNhZmUgZm9yIGRhdGE6IFVSSXMgKi9cbiAgbGV0IERBVEFfVVJJX1RBR1MgPSBudWxsO1xuICBjb25zdCBERUZBVUxUX0RBVEFfVVJJX1RBR1MgPSBhZGRUb1NldCh7fSwgW1xuICAgICdhdWRpbycsXG4gICAgJ3ZpZGVvJyxcbiAgICAnaW1nJyxcbiAgICAnc291cmNlJyxcbiAgICAnaW1hZ2UnLFxuICAgICd0cmFjaycsXG4gIF0pO1xuXG4gIC8qIEF0dHJpYnV0ZXMgc2FmZSBmb3IgdmFsdWVzIGxpa2UgXCJqYXZhc2NyaXB0OlwiICovXG4gIGxldCBVUklfU0FGRV9BVFRSSUJVVEVTID0gbnVsbDtcbiAgY29uc3QgREVGQVVMVF9VUklfU0FGRV9BVFRSSUJVVEVTID0gYWRkVG9TZXQoe30sIFtcbiAgICAnYWx0JyxcbiAgICAnY2xhc3MnLFxuICAgICdmb3InLFxuICAgICdpZCcsXG4gICAgJ2xhYmVsJyxcbiAgICAnbmFtZScsXG4gICAgJ3BhdHRlcm4nLFxuICAgICdwbGFjZWhvbGRlcicsXG4gICAgJ3JvbGUnLFxuICAgICdzdW1tYXJ5JyxcbiAgICAndGl0bGUnLFxuICAgICd2YWx1ZScsXG4gICAgJ3N0eWxlJyxcbiAgICAneG1sbnMnLFxuICBdKTtcblxuICBjb25zdCBNQVRITUxfTkFNRVNQQUNFID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwnO1xuICBjb25zdCBTVkdfTkFNRVNQQUNFID0gJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJztcbiAgY29uc3QgSFRNTF9OQU1FU1BBQ0UgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCc7XG4gIC8qIERvY3VtZW50IG5hbWVzcGFjZSAqL1xuICBsZXQgTkFNRVNQQUNFID0gSFRNTF9OQU1FU1BBQ0U7XG4gIGxldCBJU19FTVBUWV9JTlBVVCA9IGZhbHNlO1xuXG4gIC8qIEFsbG93ZWQgWEhUTUwrWE1MIG5hbWVzcGFjZXMgKi9cbiAgbGV0IEFMTE9XRURfTkFNRVNQQUNFUyA9IG51bGw7XG4gIGNvbnN0IERFRkFVTFRfQUxMT1dFRF9OQU1FU1BBQ0VTID0gYWRkVG9TZXQoXG4gICAge30sXG4gICAgW01BVEhNTF9OQU1FU1BBQ0UsIFNWR19OQU1FU1BBQ0UsIEhUTUxfTkFNRVNQQUNFXSxcbiAgICBzdHJpbmdUb1N0cmluZ1xuICApO1xuXG4gIGxldCBNQVRITUxfVEVYVF9JTlRFR1JBVElPTl9QT0lOVFMgPSBhZGRUb1NldCh7fSwgW1xuICAgICdtaScsXG4gICAgJ21vJyxcbiAgICAnbW4nLFxuICAgICdtcycsXG4gICAgJ210ZXh0JyxcbiAgXSk7XG5cbiAgbGV0IEhUTUxfSU5URUdSQVRJT05fUE9JTlRTID0gYWRkVG9TZXQoe30sIFsnYW5ub3RhdGlvbi14bWwnXSk7XG5cbiAgLy8gQ2VydGFpbiBlbGVtZW50cyBhcmUgYWxsb3dlZCBpbiBib3RoIFNWRyBhbmQgSFRNTFxuICAvLyBuYW1lc3BhY2UuIFdlIG5lZWQgdG8gc3BlY2lmeSB0aGVtIGV4cGxpY2l0bHlcbiAgLy8gc28gdGhhdCB0aGV5IGRvbid0IGdldCBlcnJvbmVvdXNseSBkZWxldGVkIGZyb21cbiAgLy8gSFRNTCBuYW1lc3BhY2UuXG4gIGNvbnN0IENPTU1PTl9TVkdfQU5EX0hUTUxfRUxFTUVOVFMgPSBhZGRUb1NldCh7fSwgW1xuICAgICd0aXRsZScsXG4gICAgJ3N0eWxlJyxcbiAgICAnZm9udCcsXG4gICAgJ2EnLFxuICAgICdzY3JpcHQnLFxuICBdKTtcblxuICAvKiBQYXJzaW5nIG9mIHN0cmljdCBYSFRNTCBkb2N1bWVudHMgKi9cbiAgbGV0IFBBUlNFUl9NRURJQV9UWVBFOiBudWxsIHwgRE9NUGFyc2VyU3VwcG9ydGVkVHlwZSA9IG51bGw7XG4gIGNvbnN0IFNVUFBPUlRFRF9QQVJTRVJfTUVESUFfVFlQRVMgPSBbJ2FwcGxpY2F0aW9uL3hodG1sK3htbCcsICd0ZXh0L2h0bWwnXTtcbiAgY29uc3QgREVGQVVMVF9QQVJTRVJfTUVESUFfVFlQRSA9ICd0ZXh0L2h0bWwnO1xuICBsZXQgdHJhbnNmb3JtQ2FzZUZ1bmM6IG51bGwgfCBQYXJhbWV0ZXJzPHR5cGVvZiBhZGRUb1NldD5bMl0gPSBudWxsO1xuXG4gIC8qIEtlZXAgYSByZWZlcmVuY2UgdG8gY29uZmlnIHRvIHBhc3MgdG8gaG9va3MgKi9cbiAgbGV0IENPTkZJRzogQ29uZmlnIHwgbnVsbCA9IG51bGw7XG5cbiAgLyogSWRlYWxseSwgZG8gbm90IHRvdWNoIGFueXRoaW5nIGJlbG93IHRoaXMgbGluZSAqL1xuICAvKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICovXG5cbiAgY29uc3QgZm9ybUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdmb3JtJyk7XG5cbiAgY29uc3QgaXNSZWdleE9yRnVuY3Rpb24gPSBmdW5jdGlvbiAoXG4gICAgdGVzdFZhbHVlOiB1bmtub3duXG4gICk6IHRlc3RWYWx1ZSBpcyBGdW5jdGlvbiB8IFJlZ0V4cCB7XG4gICAgcmV0dXJuIHRlc3RWYWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCB8fCB0ZXN0VmFsdWUgaW5zdGFuY2VvZiBGdW5jdGlvbjtcbiAgfTtcblxuICAvKipcbiAgICogX3BhcnNlQ29uZmlnXG4gICAqXG4gICAqIEBwYXJhbSBjZmcgb3B0aW9uYWwgY29uZmlnIGxpdGVyYWxcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG4gIGNvbnN0IF9wYXJzZUNvbmZpZyA9IGZ1bmN0aW9uIChjZmc6IENvbmZpZyA9IHt9KTogdm9pZCB7XG4gICAgaWYgKENPTkZJRyAmJiBDT05GSUcgPT09IGNmZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8qIFNoaWVsZCBjb25maWd1cmF0aW9uIG9iamVjdCBmcm9tIHRhbXBlcmluZyAqL1xuICAgIGlmICghY2ZnIHx8IHR5cGVvZiBjZmcgIT09ICdvYmplY3QnKSB7XG4gICAgICBjZmcgPSB7fTtcbiAgICB9XG5cbiAgICAvKiBTaGllbGQgY29uZmlndXJhdGlvbiBvYmplY3QgZnJvbSBwcm90b3R5cGUgcG9sbHV0aW9uICovXG4gICAgY2ZnID0gY2xvbmUoY2ZnKTtcblxuICAgIFBBUlNFUl9NRURJQV9UWVBFID1cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL3ByZWZlci1pbmNsdWRlc1xuICAgICAgU1VQUE9SVEVEX1BBUlNFUl9NRURJQV9UWVBFUy5pbmRleE9mKGNmZy5QQVJTRVJfTUVESUFfVFlQRSkgPT09IC0xXG4gICAgICAgID8gREVGQVVMVF9QQVJTRVJfTUVESUFfVFlQRVxuICAgICAgICA6IGNmZy5QQVJTRVJfTUVESUFfVFlQRTtcblxuICAgIC8vIEhUTUwgdGFncyBhbmQgYXR0cmlidXRlcyBhcmUgbm90IGNhc2Utc2Vuc2l0aXZlLCBjb252ZXJ0aW5nIHRvIGxvd2VyY2FzZS4gS2VlcGluZyBYSFRNTCBhcyBpcy5cbiAgICB0cmFuc2Zvcm1DYXNlRnVuYyA9XG4gICAgICBQQVJTRVJfTUVESUFfVFlQRSA9PT0gJ2FwcGxpY2F0aW9uL3hodG1sK3htbCdcbiAgICAgICAgPyBzdHJpbmdUb1N0cmluZ1xuICAgICAgICA6IHN0cmluZ1RvTG93ZXJDYXNlO1xuXG4gICAgLyogU2V0IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyAqL1xuICAgIEFMTE9XRURfVEFHUyA9IG9iamVjdEhhc093blByb3BlcnR5KGNmZywgJ0FMTE9XRURfVEFHUycpXG4gICAgICA/IGFkZFRvU2V0KHt9LCBjZmcuQUxMT1dFRF9UQUdTLCB0cmFuc2Zvcm1DYXNlRnVuYylcbiAgICAgIDogREVGQVVMVF9BTExPV0VEX1RBR1M7XG4gICAgQUxMT1dFRF9BVFRSID0gb2JqZWN0SGFzT3duUHJvcGVydHkoY2ZnLCAnQUxMT1dFRF9BVFRSJylcbiAgICAgID8gYWRkVG9TZXQoe30sIGNmZy5BTExPV0VEX0FUVFIsIHRyYW5zZm9ybUNhc2VGdW5jKVxuICAgICAgOiBERUZBVUxUX0FMTE9XRURfQVRUUjtcbiAgICBBTExPV0VEX05BTUVTUEFDRVMgPSBvYmplY3RIYXNPd25Qcm9wZXJ0eShjZmcsICdBTExPV0VEX05BTUVTUEFDRVMnKVxuICAgICAgPyBhZGRUb1NldCh7fSwgY2ZnLkFMTE9XRURfTkFNRVNQQUNFUywgc3RyaW5nVG9TdHJpbmcpXG4gICAgICA6IERFRkFVTFRfQUxMT1dFRF9OQU1FU1BBQ0VTO1xuICAgIFVSSV9TQUZFX0FUVFJJQlVURVMgPSBvYmplY3RIYXNPd25Qcm9wZXJ0eShjZmcsICdBRERfVVJJX1NBRkVfQVRUUicpXG4gICAgICA/IGFkZFRvU2V0KFxuICAgICAgICAgIGNsb25lKERFRkFVTFRfVVJJX1NBRkVfQVRUUklCVVRFUyksXG4gICAgICAgICAgY2ZnLkFERF9VUklfU0FGRV9BVFRSLFxuICAgICAgICAgIHRyYW5zZm9ybUNhc2VGdW5jXG4gICAgICAgIClcbiAgICAgIDogREVGQVVMVF9VUklfU0FGRV9BVFRSSUJVVEVTO1xuICAgIERBVEFfVVJJX1RBR1MgPSBvYmplY3RIYXNPd25Qcm9wZXJ0eShjZmcsICdBRERfREFUQV9VUklfVEFHUycpXG4gICAgICA/IGFkZFRvU2V0KFxuICAgICAgICAgIGNsb25lKERFRkFVTFRfREFUQV9VUklfVEFHUyksXG4gICAgICAgICAgY2ZnLkFERF9EQVRBX1VSSV9UQUdTLFxuICAgICAgICAgIHRyYW5zZm9ybUNhc2VGdW5jXG4gICAgICAgIClcbiAgICAgIDogREVGQVVMVF9EQVRBX1VSSV9UQUdTO1xuICAgIEZPUkJJRF9DT05URU5UUyA9IG9iamVjdEhhc093blByb3BlcnR5KGNmZywgJ0ZPUkJJRF9DT05URU5UUycpXG4gICAgICA/IGFkZFRvU2V0KHt9LCBjZmcuRk9SQklEX0NPTlRFTlRTLCB0cmFuc2Zvcm1DYXNlRnVuYylcbiAgICAgIDogREVGQVVMVF9GT1JCSURfQ09OVEVOVFM7XG4gICAgRk9SQklEX1RBR1MgPSBvYmplY3RIYXNPd25Qcm9wZXJ0eShjZmcsICdGT1JCSURfVEFHUycpXG4gICAgICA/IGFkZFRvU2V0KHt9LCBjZmcuRk9SQklEX1RBR1MsIHRyYW5zZm9ybUNhc2VGdW5jKVxuICAgICAgOiBjbG9uZSh7fSk7XG4gICAgRk9SQklEX0FUVFIgPSBvYmplY3RIYXNPd25Qcm9wZXJ0eShjZmcsICdGT1JCSURfQVRUUicpXG4gICAgICA/IGFkZFRvU2V0KHt9LCBjZmcuRk9SQklEX0FUVFIsIHRyYW5zZm9ybUNhc2VGdW5jKVxuICAgICAgOiBjbG9uZSh7fSk7XG4gICAgVVNFX1BST0ZJTEVTID0gb2JqZWN0SGFzT3duUHJvcGVydHkoY2ZnLCAnVVNFX1BST0ZJTEVTJylcbiAgICAgID8gY2ZnLlVTRV9QUk9GSUxFU1xuICAgICAgOiBmYWxzZTtcbiAgICBBTExPV19BUklBX0FUVFIgPSBjZmcuQUxMT1dfQVJJQV9BVFRSICE9PSBmYWxzZTsgLy8gRGVmYXVsdCB0cnVlXG4gICAgQUxMT1dfREFUQV9BVFRSID0gY2ZnLkFMTE9XX0RBVEFfQVRUUiAhPT0gZmFsc2U7IC8vIERlZmF1bHQgdHJ1ZVxuICAgIEFMTE9XX1VOS05PV05fUFJPVE9DT0xTID0gY2ZnLkFMTE9XX1VOS05PV05fUFJPVE9DT0xTIHx8IGZhbHNlOyAvLyBEZWZhdWx0IGZhbHNlXG4gICAgQUxMT1dfU0VMRl9DTE9TRV9JTl9BVFRSID0gY2ZnLkFMTE9XX1NFTEZfQ0xPU0VfSU5fQVRUUiAhPT0gZmFsc2U7IC8vIERlZmF1bHQgdHJ1ZVxuICAgIFNBRkVfRk9SX1RFTVBMQVRFUyA9IGNmZy5TQUZFX0ZPUl9URU1QTEFURVMgfHwgZmFsc2U7IC8vIERlZmF1bHQgZmFsc2VcbiAgICBTQUZFX0ZPUl9YTUwgPSBjZmcuU0FGRV9GT1JfWE1MICE9PSBmYWxzZTsgLy8gRGVmYXVsdCB0cnVlXG4gICAgV0hPTEVfRE9DVU1FTlQgPSBjZmcuV0hPTEVfRE9DVU1FTlQgfHwgZmFsc2U7IC8vIERlZmF1bHQgZmFsc2VcbiAgICBSRVRVUk5fRE9NID0gY2ZnLlJFVFVSTl9ET00gfHwgZmFsc2U7IC8vIERlZmF1bHQgZmFsc2VcbiAgICBSRVRVUk5fRE9NX0ZSQUdNRU5UID0gY2ZnLlJFVFVSTl9ET01fRlJBR01FTlQgfHwgZmFsc2U7IC8vIERlZmF1bHQgZmFsc2VcbiAgICBSRVRVUk5fVFJVU1RFRF9UWVBFID0gY2ZnLlJFVFVSTl9UUlVTVEVEX1RZUEUgfHwgZmFsc2U7IC8vIERlZmF1bHQgZmFsc2VcbiAgICBGT1JDRV9CT0RZID0gY2ZnLkZPUkNFX0JPRFkgfHwgZmFsc2U7IC8vIERlZmF1bHQgZmFsc2VcbiAgICBTQU5JVElaRV9ET00gPSBjZmcuU0FOSVRJWkVfRE9NICE9PSBmYWxzZTsgLy8gRGVmYXVsdCB0cnVlXG4gICAgU0FOSVRJWkVfTkFNRURfUFJPUFMgPSBjZmcuU0FOSVRJWkVfTkFNRURfUFJPUFMgfHwgZmFsc2U7IC8vIERlZmF1bHQgZmFsc2VcbiAgICBLRUVQX0NPTlRFTlQgPSBjZmcuS0VFUF9DT05URU5UICE9PSBmYWxzZTsgLy8gRGVmYXVsdCB0cnVlXG4gICAgSU5fUExBQ0UgPSBjZmcuSU5fUExBQ0UgfHwgZmFsc2U7IC8vIERlZmF1bHQgZmFsc2VcbiAgICBJU19BTExPV0VEX1VSSSA9IGNmZy5BTExPV0VEX1VSSV9SRUdFWFAgfHwgRVhQUkVTU0lPTlMuSVNfQUxMT1dFRF9VUkk7XG4gICAgTkFNRVNQQUNFID0gY2ZnLk5BTUVTUEFDRSB8fCBIVE1MX05BTUVTUEFDRTtcbiAgICBNQVRITUxfVEVYVF9JTlRFR1JBVElPTl9QT0lOVFMgPVxuICAgICAgY2ZnLk1BVEhNTF9URVhUX0lOVEVHUkFUSU9OX1BPSU5UUyB8fCBNQVRITUxfVEVYVF9JTlRFR1JBVElPTl9QT0lOVFM7XG4gICAgSFRNTF9JTlRFR1JBVElPTl9QT0lOVFMgPVxuICAgICAgY2ZnLkhUTUxfSU5URUdSQVRJT05fUE9JTlRTIHx8IEhUTUxfSU5URUdSQVRJT05fUE9JTlRTO1xuXG4gICAgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcgPSBjZmcuQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcgfHwge307XG4gICAgaWYgKFxuICAgICAgY2ZnLkNVU1RPTV9FTEVNRU5UX0hBTkRMSU5HICYmXG4gICAgICBpc1JlZ2V4T3JGdW5jdGlvbihjZmcuQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrKVxuICAgICkge1xuICAgICAgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrID1cbiAgICAgICAgY2ZnLkNVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVjaztcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBjZmcuQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcgJiZcbiAgICAgIGlzUmVnZXhPckZ1bmN0aW9uKGNmZy5DVVNUT01fRUxFTUVOVF9IQU5ETElORy5hdHRyaWJ1dGVOYW1lQ2hlY2spXG4gICAgKSB7XG4gICAgICBDVVNUT01fRUxFTUVOVF9IQU5ETElORy5hdHRyaWJ1dGVOYW1lQ2hlY2sgPVxuICAgICAgICBjZmcuQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcuYXR0cmlidXRlTmFtZUNoZWNrO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGNmZy5DVVNUT01fRUxFTUVOVF9IQU5ETElORyAmJlxuICAgICAgdHlwZW9mIGNmZy5DVVNUT01fRUxFTUVOVF9IQU5ETElORy5hbGxvd0N1c3RvbWl6ZWRCdWlsdEluRWxlbWVudHMgPT09XG4gICAgICAgICdib29sZWFuJ1xuICAgICkge1xuICAgICAgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcuYWxsb3dDdXN0b21pemVkQnVpbHRJbkVsZW1lbnRzID1cbiAgICAgICAgY2ZnLkNVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLmFsbG93Q3VzdG9taXplZEJ1aWx0SW5FbGVtZW50cztcbiAgICB9XG5cbiAgICBpZiAoU0FGRV9GT1JfVEVNUExBVEVTKSB7XG4gICAgICBBTExPV19EQVRBX0FUVFIgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoUkVUVVJOX0RPTV9GUkFHTUVOVCkge1xuICAgICAgUkVUVVJOX0RPTSA9IHRydWU7XG4gICAgfVxuXG4gICAgLyogUGFyc2UgcHJvZmlsZSBpbmZvICovXG4gICAgaWYgKFVTRV9QUk9GSUxFUykge1xuICAgICAgQUxMT1dFRF9UQUdTID0gYWRkVG9TZXQoe30sIFRBR1MudGV4dCk7XG4gICAgICBBTExPV0VEX0FUVFIgPSBjcmVhdGUobnVsbCk7XG4gICAgICBpZiAoVVNFX1BST0ZJTEVTLmh0bWwgPT09IHRydWUpIHtcbiAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9UQUdTLCBUQUdTLmh0bWwpO1xuICAgICAgICBhZGRUb1NldChBTExPV0VEX0FUVFIsIEFUVFJTLmh0bWwpO1xuICAgICAgfVxuXG4gICAgICBpZiAoVVNFX1BST0ZJTEVTLnN2ZyA9PT0gdHJ1ZSkge1xuICAgICAgICBhZGRUb1NldChBTExPV0VEX1RBR1MsIFRBR1Muc3ZnKTtcbiAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9BVFRSLCBBVFRSUy5zdmcpO1xuICAgICAgICBhZGRUb1NldChBTExPV0VEX0FUVFIsIEFUVFJTLnhtbCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChVU0VfUFJPRklMRVMuc3ZnRmlsdGVycyA9PT0gdHJ1ZSkge1xuICAgICAgICBhZGRUb1NldChBTExPV0VEX1RBR1MsIFRBR1Muc3ZnRmlsdGVycyk7XG4gICAgICAgIGFkZFRvU2V0KEFMTE9XRURfQVRUUiwgQVRUUlMuc3ZnKTtcbiAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9BVFRSLCBBVFRSUy54bWwpO1xuICAgICAgfVxuXG4gICAgICBpZiAoVVNFX1BST0ZJTEVTLm1hdGhNbCA9PT0gdHJ1ZSkge1xuICAgICAgICBhZGRUb1NldChBTExPV0VEX1RBR1MsIFRBR1MubWF0aE1sKTtcbiAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9BVFRSLCBBVFRSUy5tYXRoTWwpO1xuICAgICAgICBhZGRUb1NldChBTExPV0VEX0FUVFIsIEFUVFJTLnhtbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogUHJldmVudCBmdW5jdGlvbi1iYXNlZCBBRERfQVRUUiAvIEFERF9UQUdTIGZyb20gbGVha2luZyBhY3Jvc3MgY2FsbHMgKi9cbiAgICBpZiAoIW9iamVjdEhhc093blByb3BlcnR5KGNmZywgJ0FERF9UQUdTJykpIHtcbiAgICAgIEVYVFJBX0VMRU1FTlRfSEFORExJTkcudGFnQ2hlY2sgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICghb2JqZWN0SGFzT3duUHJvcGVydHkoY2ZnLCAnQUREX0FUVFInKSkge1xuICAgICAgRVhUUkFfRUxFTUVOVF9IQU5ETElORy5hdHRyaWJ1dGVDaGVjayA9IG51bGw7XG4gICAgfVxuXG4gICAgLyogTWVyZ2UgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzICovXG4gICAgaWYgKGNmZy5BRERfVEFHUykge1xuICAgICAgaWYgKHR5cGVvZiBjZmcuQUREX1RBR1MgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgRVhUUkFfRUxFTUVOVF9IQU5ETElORy50YWdDaGVjayA9IGNmZy5BRERfVEFHUztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChBTExPV0VEX1RBR1MgPT09IERFRkFVTFRfQUxMT1dFRF9UQUdTKSB7XG4gICAgICAgICAgQUxMT1dFRF9UQUdTID0gY2xvbmUoQUxMT1dFRF9UQUdTKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFkZFRvU2V0KEFMTE9XRURfVEFHUywgY2ZnLkFERF9UQUdTLCB0cmFuc2Zvcm1DYXNlRnVuYyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNmZy5BRERfQVRUUikge1xuICAgICAgaWYgKHR5cGVvZiBjZmcuQUREX0FUVFIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgRVhUUkFfRUxFTUVOVF9IQU5ETElORy5hdHRyaWJ1dGVDaGVjayA9IGNmZy5BRERfQVRUUjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChBTExPV0VEX0FUVFIgPT09IERFRkFVTFRfQUxMT1dFRF9BVFRSKSB7XG4gICAgICAgICAgQUxMT1dFRF9BVFRSID0gY2xvbmUoQUxMT1dFRF9BVFRSKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFkZFRvU2V0KEFMTE9XRURfQVRUUiwgY2ZnLkFERF9BVFRSLCB0cmFuc2Zvcm1DYXNlRnVuYyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNmZy5BRERfVVJJX1NBRkVfQVRUUikge1xuICAgICAgYWRkVG9TZXQoVVJJX1NBRkVfQVRUUklCVVRFUywgY2ZnLkFERF9VUklfU0FGRV9BVFRSLCB0cmFuc2Zvcm1DYXNlRnVuYyk7XG4gICAgfVxuXG4gICAgaWYgKGNmZy5GT1JCSURfQ09OVEVOVFMpIHtcbiAgICAgIGlmIChGT1JCSURfQ09OVEVOVFMgPT09IERFRkFVTFRfRk9SQklEX0NPTlRFTlRTKSB7XG4gICAgICAgIEZPUkJJRF9DT05URU5UUyA9IGNsb25lKEZPUkJJRF9DT05URU5UUyk7XG4gICAgICB9XG5cbiAgICAgIGFkZFRvU2V0KEZPUkJJRF9DT05URU5UUywgY2ZnLkZPUkJJRF9DT05URU5UUywgdHJhbnNmb3JtQ2FzZUZ1bmMpO1xuICAgIH1cblxuICAgIGlmIChjZmcuQUREX0ZPUkJJRF9DT05URU5UUykge1xuICAgICAgaWYgKEZPUkJJRF9DT05URU5UUyA9PT0gREVGQVVMVF9GT1JCSURfQ09OVEVOVFMpIHtcbiAgICAgICAgRk9SQklEX0NPTlRFTlRTID0gY2xvbmUoRk9SQklEX0NPTlRFTlRTKTtcbiAgICAgIH1cblxuICAgICAgYWRkVG9TZXQoRk9SQklEX0NPTlRFTlRTLCBjZmcuQUREX0ZPUkJJRF9DT05URU5UUywgdHJhbnNmb3JtQ2FzZUZ1bmMpO1xuICAgIH1cblxuICAgIC8qIEFkZCAjdGV4dCBpbiBjYXNlIEtFRVBfQ09OVEVOVCBpcyBzZXQgdG8gdHJ1ZSAqL1xuICAgIGlmIChLRUVQX0NPTlRFTlQpIHtcbiAgICAgIEFMTE9XRURfVEFHU1snI3RleHQnXSA9IHRydWU7XG4gICAgfVxuXG4gICAgLyogQWRkIGh0bWwsIGhlYWQgYW5kIGJvZHkgdG8gQUxMT1dFRF9UQUdTIGluIGNhc2UgV0hPTEVfRE9DVU1FTlQgaXMgdHJ1ZSAqL1xuICAgIGlmIChXSE9MRV9ET0NVTUVOVCkge1xuICAgICAgYWRkVG9TZXQoQUxMT1dFRF9UQUdTLCBbJ2h0bWwnLCAnaGVhZCcsICdib2R5J10pO1xuICAgIH1cblxuICAgIC8qIEFkZCB0Ym9keSB0byBBTExPV0VEX1RBR1MgaW4gY2FzZSB0YWJsZXMgYXJlIHBlcm1pdHRlZCwgc2VlICMyODYsICMzNjUgKi9cbiAgICBpZiAoQUxMT1dFRF9UQUdTLnRhYmxlKSB7XG4gICAgICBhZGRUb1NldChBTExPV0VEX1RBR1MsIFsndGJvZHknXSk7XG4gICAgICBkZWxldGUgRk9SQklEX1RBR1MudGJvZHk7XG4gICAgfVxuXG4gICAgaWYgKGNmZy5UUlVTVEVEX1RZUEVTX1BPTElDWSkge1xuICAgICAgaWYgKHR5cGVvZiBjZmcuVFJVU1RFRF9UWVBFU19QT0xJQ1kuY3JlYXRlSFRNTCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyB0eXBlRXJyb3JDcmVhdGUoXG4gICAgICAgICAgJ1RSVVNURURfVFlQRVNfUE9MSUNZIGNvbmZpZ3VyYXRpb24gb3B0aW9uIG11c3QgcHJvdmlkZSBhIFwiY3JlYXRlSFRNTFwiIGhvb2suJ1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGNmZy5UUlVTVEVEX1RZUEVTX1BPTElDWS5jcmVhdGVTY3JpcHRVUkwgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgdHlwZUVycm9yQ3JlYXRlKFxuICAgICAgICAgICdUUlVTVEVEX1RZUEVTX1BPTElDWSBjb25maWd1cmF0aW9uIG9wdGlvbiBtdXN0IHByb3ZpZGUgYSBcImNyZWF0ZVNjcmlwdFVSTFwiIGhvb2suJ1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBPdmVyd3JpdGUgZXhpc3RpbmcgVHJ1c3RlZFR5cGVzIHBvbGljeS5cbiAgICAgIHRydXN0ZWRUeXBlc1BvbGljeSA9IGNmZy5UUlVTVEVEX1RZUEVTX1BPTElDWTtcblxuICAgICAgLy8gU2lnbiBsb2NhbCB2YXJpYWJsZXMgcmVxdWlyZWQgYnkgYHNhbml0aXplYC5cbiAgICAgIGVtcHR5SFRNTCA9IHRydXN0ZWRUeXBlc1BvbGljeS5jcmVhdGVIVE1MKCcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVW5pbml0aWFsaXplZCBwb2xpY3ksIGF0dGVtcHQgdG8gaW5pdGlhbGl6ZSB0aGUgaW50ZXJuYWwgZG9tcHVyaWZ5IHBvbGljeS5cbiAgICAgIGlmICh0cnVzdGVkVHlwZXNQb2xpY3kgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0cnVzdGVkVHlwZXNQb2xpY3kgPSBfY3JlYXRlVHJ1c3RlZFR5cGVzUG9saWN5KFxuICAgICAgICAgIHRydXN0ZWRUeXBlcyxcbiAgICAgICAgICBjdXJyZW50U2NyaXB0XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIGNyZWF0aW5nIHRoZSBpbnRlcm5hbCBwb2xpY3kgc3VjY2VlZGVkIHNpZ24gaW50ZXJuYWwgdmFyaWFibGVzLlxuICAgICAgaWYgKHRydXN0ZWRUeXBlc1BvbGljeSAhPT0gbnVsbCAmJiB0eXBlb2YgZW1wdHlIVE1MID09PSAnc3RyaW5nJykge1xuICAgICAgICBlbXB0eUhUTUwgPSB0cnVzdGVkVHlwZXNQb2xpY3kuY3JlYXRlSFRNTCgnJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUHJldmVudCBmdXJ0aGVyIG1hbmlwdWxhdGlvbiBvZiBjb25maWd1cmF0aW9uLlxuICAgIC8vIE5vdCBhdmFpbGFibGUgaW4gSUU4LCBTYWZhcmkgNSwgZXRjLlxuICAgIGlmIChmcmVlemUpIHtcbiAgICAgIGZyZWV6ZShjZmcpO1xuICAgIH1cblxuICAgIENPTkZJRyA9IGNmZztcbiAgfTtcblxuICAvKiBLZWVwIHRyYWNrIG9mIGFsbCBwb3NzaWJsZSBTVkcgYW5kIE1hdGhNTCB0YWdzXG4gICAqIHNvIHRoYXQgd2UgY2FuIHBlcmZvcm0gdGhlIG5hbWVzcGFjZSBjaGVja3NcbiAgICogY29ycmVjdGx5LiAqL1xuICBjb25zdCBBTExfU1ZHX1RBR1MgPSBhZGRUb1NldCh7fSwgW1xuICAgIC4uLlRBR1Muc3ZnLFxuICAgIC4uLlRBR1Muc3ZnRmlsdGVycyxcbiAgICAuLi5UQUdTLnN2Z0Rpc2FsbG93ZWQsXG4gIF0pO1xuICBjb25zdCBBTExfTUFUSE1MX1RBR1MgPSBhZGRUb1NldCh7fSwgW1xuICAgIC4uLlRBR1MubWF0aE1sLFxuICAgIC4uLlRBR1MubWF0aE1sRGlzYWxsb3dlZCxcbiAgXSk7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBlbGVtZW50IGEgRE9NIGVsZW1lbnQgd2hvc2UgbmFtZXNwYWNlIGlzIGJlaW5nIGNoZWNrZWRcbiAgICogQHJldHVybnMgUmV0dXJuIGZhbHNlIGlmIHRoZSBlbGVtZW50IGhhcyBhXG4gICAqICBuYW1lc3BhY2UgdGhhdCBhIHNwZWMtY29tcGxpYW50IHBhcnNlciB3b3VsZCBuZXZlclxuICAgKiAgcmV0dXJuLiBSZXR1cm4gdHJ1ZSBvdGhlcndpc2UuXG4gICAqL1xuICBjb25zdCBfY2hlY2tWYWxpZE5hbWVzcGFjZSA9IGZ1bmN0aW9uIChlbGVtZW50OiBFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgbGV0IHBhcmVudCA9IGdldFBhcmVudE5vZGUoZWxlbWVudCk7XG5cbiAgICAvLyBJbiBKU0RPTSwgaWYgd2UncmUgaW5zaWRlIHNoYWRvdyBET00sIHRoZW4gcGFyZW50Tm9kZVxuICAgIC8vIGNhbiBiZSBudWxsLiBXZSBqdXN0IHNpbXVsYXRlIHBhcmVudCBpbiB0aGlzIGNhc2UuXG4gICAgaWYgKCFwYXJlbnQgfHwgIXBhcmVudC50YWdOYW1lKSB7XG4gICAgICBwYXJlbnQgPSB7XG4gICAgICAgIG5hbWVzcGFjZVVSSTogTkFNRVNQQUNFLFxuICAgICAgICB0YWdOYW1lOiAndGVtcGxhdGUnLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCB0YWdOYW1lID0gc3RyaW5nVG9Mb3dlckNhc2UoZWxlbWVudC50YWdOYW1lKTtcbiAgICBjb25zdCBwYXJlbnRUYWdOYW1lID0gc3RyaW5nVG9Mb3dlckNhc2UocGFyZW50LnRhZ05hbWUpO1xuXG4gICAgaWYgKCFBTExPV0VEX05BTUVTUEFDRVNbZWxlbWVudC5uYW1lc3BhY2VVUkldKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnQubmFtZXNwYWNlVVJJID09PSBTVkdfTkFNRVNQQUNFKSB7XG4gICAgICAvLyBUaGUgb25seSB3YXkgdG8gc3dpdGNoIGZyb20gSFRNTCBuYW1lc3BhY2UgdG8gU1ZHXG4gICAgICAvLyBpcyB2aWEgPHN2Zz4uIElmIGl0IGhhcHBlbnMgdmlhIGFueSBvdGhlciB0YWcsIHRoZW5cbiAgICAgIC8vIGl0IHNob3VsZCBiZSBraWxsZWQuXG4gICAgICBpZiAocGFyZW50Lm5hbWVzcGFjZVVSSSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICAgICAgcmV0dXJuIHRhZ05hbWUgPT09ICdzdmcnO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGUgb25seSB3YXkgdG8gc3dpdGNoIGZyb20gTWF0aE1MIHRvIFNWRyBpcyB2aWFgXG4gICAgICAvLyBzdmcgaWYgcGFyZW50IGlzIGVpdGhlciA8YW5ub3RhdGlvbi14bWw+IG9yIE1hdGhNTFxuICAgICAgLy8gdGV4dCBpbnRlZ3JhdGlvbiBwb2ludHMuXG4gICAgICBpZiAocGFyZW50Lm5hbWVzcGFjZVVSSSA9PT0gTUFUSE1MX05BTUVTUEFDRSkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIHRhZ05hbWUgPT09ICdzdmcnICYmXG4gICAgICAgICAgKHBhcmVudFRhZ05hbWUgPT09ICdhbm5vdGF0aW9uLXhtbCcgfHxcbiAgICAgICAgICAgIE1BVEhNTF9URVhUX0lOVEVHUkFUSU9OX1BPSU5UU1twYXJlbnRUYWdOYW1lXSlcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gV2Ugb25seSBhbGxvdyBlbGVtZW50cyB0aGF0IGFyZSBkZWZpbmVkIGluIFNWR1xuICAgICAgLy8gc3BlYy4gQWxsIG90aGVycyBhcmUgZGlzYWxsb3dlZCBpbiBTVkcgbmFtZXNwYWNlLlxuICAgICAgcmV0dXJuIEJvb2xlYW4oQUxMX1NWR19UQUdTW3RhZ05hbWVdKTtcbiAgICB9XG5cbiAgICBpZiAoZWxlbWVudC5uYW1lc3BhY2VVUkkgPT09IE1BVEhNTF9OQU1FU1BBQ0UpIHtcbiAgICAgIC8vIFRoZSBvbmx5IHdheSB0byBzd2l0Y2ggZnJvbSBIVE1MIG5hbWVzcGFjZSB0byBNYXRoTUxcbiAgICAgIC8vIGlzIHZpYSA8bWF0aD4uIElmIGl0IGhhcHBlbnMgdmlhIGFueSBvdGhlciB0YWcsIHRoZW5cbiAgICAgIC8vIGl0IHNob3VsZCBiZSBraWxsZWQuXG4gICAgICBpZiAocGFyZW50Lm5hbWVzcGFjZVVSSSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICAgICAgcmV0dXJuIHRhZ05hbWUgPT09ICdtYXRoJztcbiAgICAgIH1cblxuICAgICAgLy8gVGhlIG9ubHkgd2F5IHRvIHN3aXRjaCBmcm9tIFNWRyB0byBNYXRoTUwgaXMgdmlhXG4gICAgICAvLyA8bWF0aD4gYW5kIEhUTUwgaW50ZWdyYXRpb24gcG9pbnRzXG4gICAgICBpZiAocGFyZW50Lm5hbWVzcGFjZVVSSSA9PT0gU1ZHX05BTUVTUEFDRSkge1xuICAgICAgICByZXR1cm4gdGFnTmFtZSA9PT0gJ21hdGgnICYmIEhUTUxfSU5URUdSQVRJT05fUE9JTlRTW3BhcmVudFRhZ05hbWVdO1xuICAgICAgfVxuXG4gICAgICAvLyBXZSBvbmx5IGFsbG93IGVsZW1lbnRzIHRoYXQgYXJlIGRlZmluZWQgaW4gTWF0aE1MXG4gICAgICAvLyBzcGVjLiBBbGwgb3RoZXJzIGFyZSBkaXNhbGxvd2VkIGluIE1hdGhNTCBuYW1lc3BhY2UuXG4gICAgICByZXR1cm4gQm9vbGVhbihBTExfTUFUSE1MX1RBR1NbdGFnTmFtZV0pO1xuICAgIH1cblxuICAgIGlmIChlbGVtZW50Lm5hbWVzcGFjZVVSSSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICAgIC8vIFRoZSBvbmx5IHdheSB0byBzd2l0Y2ggZnJvbSBTVkcgdG8gSFRNTCBpcyB2aWFcbiAgICAgIC8vIEhUTUwgaW50ZWdyYXRpb24gcG9pbnRzLCBhbmQgZnJvbSBNYXRoTUwgdG8gSFRNTFxuICAgICAgLy8gaXMgdmlhIE1hdGhNTCB0ZXh0IGludGVncmF0aW9uIHBvaW50c1xuICAgICAgaWYgKFxuICAgICAgICBwYXJlbnQubmFtZXNwYWNlVVJJID09PSBTVkdfTkFNRVNQQUNFICYmXG4gICAgICAgICFIVE1MX0lOVEVHUkFUSU9OX1BPSU5UU1twYXJlbnRUYWdOYW1lXVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBwYXJlbnQubmFtZXNwYWNlVVJJID09PSBNQVRITUxfTkFNRVNQQUNFICYmXG4gICAgICAgICFNQVRITUxfVEVYVF9JTlRFR1JBVElPTl9QT0lOVFNbcGFyZW50VGFnTmFtZV1cbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIFdlIGRpc2FsbG93IHRhZ3MgdGhhdCBhcmUgc3BlY2lmaWMgZm9yIE1hdGhNTFxuICAgICAgLy8gb3IgU1ZHIGFuZCBzaG91bGQgbmV2ZXIgYXBwZWFyIGluIEhUTUwgbmFtZXNwYWNlXG4gICAgICByZXR1cm4gKFxuICAgICAgICAhQUxMX01BVEhNTF9UQUdTW3RhZ05hbWVdICYmXG4gICAgICAgIChDT01NT05fU1ZHX0FORF9IVE1MX0VMRU1FTlRTW3RhZ05hbWVdIHx8ICFBTExfU1ZHX1RBR1NbdGFnTmFtZV0pXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEZvciBYSFRNTCBhbmQgWE1MIGRvY3VtZW50cyB0aGF0IHN1cHBvcnQgY3VzdG9tIG5hbWVzcGFjZXNcbiAgICBpZiAoXG4gICAgICBQQVJTRVJfTUVESUFfVFlQRSA9PT0gJ2FwcGxpY2F0aW9uL3hodG1sK3htbCcgJiZcbiAgICAgIEFMTE9XRURfTkFNRVNQQUNFU1tlbGVtZW50Lm5hbWVzcGFjZVVSSV1cbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIFRoZSBjb2RlIHNob3VsZCBuZXZlciByZWFjaCB0aGlzIHBsYWNlICh0aGlzIG1lYW5zXG4gICAgLy8gdGhhdCB0aGUgZWxlbWVudCBzb21laG93IGdvdCBuYW1lc3BhY2UgdGhhdCBpcyBub3RcbiAgICAvLyBIVE1MLCBTVkcsIE1hdGhNTCBvciBhbGxvd2VkIHZpYSBBTExPV0VEX05BTUVTUEFDRVMpLlxuICAgIC8vIFJldHVybiBmYWxzZSBqdXN0IGluIGNhc2UuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBfZm9yY2VSZW1vdmVcbiAgICpcbiAgICogQHBhcmFtIG5vZGUgYSBET00gbm9kZVxuICAgKi9cbiAgY29uc3QgX2ZvcmNlUmVtb3ZlID0gZnVuY3Rpb24gKG5vZGU6IE5vZGUpOiB2b2lkIHtcbiAgICBhcnJheVB1c2goRE9NUHVyaWZ5LnJlbW92ZWQsIHsgZWxlbWVudDogbm9kZSB9KTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9wcmVmZXItZG9tLW5vZGUtcmVtb3ZlXG4gICAgICBnZXRQYXJlbnROb2RlKG5vZGUpLnJlbW92ZUNoaWxkKG5vZGUpO1xuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIHJlbW92ZShub2RlKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIF9yZW1vdmVBdHRyaWJ1dGVcbiAgICpcbiAgICogQHBhcmFtIG5hbWUgYW4gQXR0cmlidXRlIG5hbWVcbiAgICogQHBhcmFtIGVsZW1lbnQgYSBET00gbm9kZVxuICAgKi9cbiAgY29uc3QgX3JlbW92ZUF0dHJpYnV0ZSA9IGZ1bmN0aW9uIChuYW1lOiBzdHJpbmcsIGVsZW1lbnQ6IEVsZW1lbnQpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgYXJyYXlQdXNoKERPTVB1cmlmeS5yZW1vdmVkLCB7XG4gICAgICAgIGF0dHJpYnV0ZTogZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKG5hbWUpLFxuICAgICAgICBmcm9tOiBlbGVtZW50LFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgYXJyYXlQdXNoKERPTVB1cmlmeS5yZW1vdmVkLCB7XG4gICAgICAgIGF0dHJpYnV0ZTogbnVsbCxcbiAgICAgICAgZnJvbTogZWxlbWVudCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuXG4gICAgLy8gV2Ugdm9pZCBhdHRyaWJ1dGUgdmFsdWVzIGZvciB1bnJlbW92YWJsZSBcImlzXCIgYXR0cmlidXRlc1xuICAgIGlmIChuYW1lID09PSAnaXMnKSB7XG4gICAgICBpZiAoUkVUVVJOX0RPTSB8fCBSRVRVUk5fRE9NX0ZSQUdNRU5UKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgX2ZvcmNlUmVtb3ZlKGVsZW1lbnQpO1xuICAgICAgICB9IGNhdGNoIChfKSB7fVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShuYW1lLCAnJyk7XG4gICAgICAgIH0gY2F0Y2ggKF8pIHt9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBfaW5pdERvY3VtZW50XG4gICAqXG4gICAqIEBwYXJhbSBkaXJ0eSAtIGEgc3RyaW5nIG9mIGRpcnR5IG1hcmt1cFxuICAgKiBAcmV0dXJuIGEgRE9NLCBmaWxsZWQgd2l0aCB0aGUgZGlydHkgbWFya3VwXG4gICAqL1xuICBjb25zdCBfaW5pdERvY3VtZW50ID0gZnVuY3Rpb24gKGRpcnR5OiBzdHJpbmcpOiBEb2N1bWVudCB7XG4gICAgLyogQ3JlYXRlIGEgSFRNTCBkb2N1bWVudCAqL1xuICAgIGxldCBkb2MgPSBudWxsO1xuICAgIGxldCBsZWFkaW5nV2hpdGVzcGFjZSA9IG51bGw7XG5cbiAgICBpZiAoRk9SQ0VfQk9EWSkge1xuICAgICAgZGlydHkgPSAnPHJlbW92ZT48L3JlbW92ZT4nICsgZGlydHk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIElmIEZPUkNFX0JPRFkgaXNuJ3QgdXNlZCwgbGVhZGluZyB3aGl0ZXNwYWNlIG5lZWRzIHRvIGJlIHByZXNlcnZlZCBtYW51YWxseSAqL1xuICAgICAgY29uc3QgbWF0Y2hlcyA9IHN0cmluZ01hdGNoKGRpcnR5LCAvXltcXHJcXG5cXHQgXSsvKTtcbiAgICAgIGxlYWRpbmdXaGl0ZXNwYWNlID0gbWF0Y2hlcyAmJiBtYXRjaGVzWzBdO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIFBBUlNFUl9NRURJQV9UWVBFID09PSAnYXBwbGljYXRpb24veGh0bWwreG1sJyAmJlxuICAgICAgTkFNRVNQQUNFID09PSBIVE1MX05BTUVTUEFDRVxuICAgICkge1xuICAgICAgLy8gUm9vdCBvZiBYSFRNTCBkb2MgbXVzdCBjb250YWluIHhtbG5zIGRlY2xhcmF0aW9uIChzZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL3hodG1sMS9ub3JtYXRpdmUuaHRtbCNzdHJpY3QpXG4gICAgICBkaXJ0eSA9XG4gICAgICAgICc8aHRtbCB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIj48aGVhZD48L2hlYWQ+PGJvZHk+JyArXG4gICAgICAgIGRpcnR5ICtcbiAgICAgICAgJzwvYm9keT48L2h0bWw+JztcbiAgICB9XG5cbiAgICBjb25zdCBkaXJ0eVBheWxvYWQgPSB0cnVzdGVkVHlwZXNQb2xpY3lcbiAgICAgID8gdHJ1c3RlZFR5cGVzUG9saWN5LmNyZWF0ZUhUTUwoZGlydHkpXG4gICAgICA6IGRpcnR5O1xuICAgIC8qXG4gICAgICogVXNlIHRoZSBET01QYXJzZXIgQVBJIGJ5IGRlZmF1bHQsIGZhbGxiYWNrIGxhdGVyIGlmIG5lZWRzIGJlXG4gICAgICogRE9NUGFyc2VyIG5vdCB3b3JrIGZvciBzdmcgd2hlbiBoYXMgbXVsdGlwbGUgcm9vdCBlbGVtZW50LlxuICAgICAqL1xuICAgIGlmIChOQU1FU1BBQ0UgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgICB0cnkge1xuICAgICAgICBkb2MgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKGRpcnR5UGF5bG9hZCwgUEFSU0VSX01FRElBX1RZUEUpO1xuICAgICAgfSBjYXRjaCAoXykge31cbiAgICB9XG5cbiAgICAvKiBVc2UgY3JlYXRlSFRNTERvY3VtZW50IGluIGNhc2UgRE9NUGFyc2VyIGlzIG5vdCBhdmFpbGFibGUgKi9cbiAgICBpZiAoIWRvYyB8fCAhZG9jLmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgZG9jID0gaW1wbGVtZW50YXRpb24uY3JlYXRlRG9jdW1lbnQoTkFNRVNQQUNFLCAndGVtcGxhdGUnLCBudWxsKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGRvYy5kb2N1bWVudEVsZW1lbnQuaW5uZXJIVE1MID0gSVNfRU1QVFlfSU5QVVRcbiAgICAgICAgICA/IGVtcHR5SFRNTFxuICAgICAgICAgIDogZGlydHlQYXlsb2FkO1xuICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAvLyBTeW50YXggZXJyb3IgaWYgZGlydHlQYXlsb2FkIGlzIGludmFsaWQgeG1sXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYm9keSA9IGRvYy5ib2R5IHx8IGRvYy5kb2N1bWVudEVsZW1lbnQ7XG5cbiAgICBpZiAoZGlydHkgJiYgbGVhZGluZ1doaXRlc3BhY2UpIHtcbiAgICAgIGJvZHkuaW5zZXJ0QmVmb3JlKFxuICAgICAgICBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShsZWFkaW5nV2hpdGVzcGFjZSksXG4gICAgICAgIGJvZHkuY2hpbGROb2Rlc1swXSB8fCBudWxsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8qIFdvcmsgb24gd2hvbGUgZG9jdW1lbnQgb3IganVzdCBpdHMgYm9keSAqL1xuICAgIGlmIChOQU1FU1BBQ0UgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgICByZXR1cm4gZ2V0RWxlbWVudHNCeVRhZ05hbWUuY2FsbChcbiAgICAgICAgZG9jLFxuICAgICAgICBXSE9MRV9ET0NVTUVOVCA/ICdodG1sJyA6ICdib2R5J1xuICAgICAgKVswXTtcbiAgICB9XG5cbiAgICByZXR1cm4gV0hPTEVfRE9DVU1FTlQgPyBkb2MuZG9jdW1lbnRFbGVtZW50IDogYm9keTtcbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIE5vZGVJdGVyYXRvciBvYmplY3QgdGhhdCB5b3UgY2FuIHVzZSB0byB0cmF2ZXJzZSBmaWx0ZXJlZCBsaXN0cyBvZiBub2RlcyBvciBlbGVtZW50cyBpbiBhIGRvY3VtZW50LlxuICAgKlxuICAgKiBAcGFyYW0gcm9vdCBUaGUgcm9vdCBlbGVtZW50IG9yIG5vZGUgdG8gc3RhcnQgdHJhdmVyc2luZyBvbi5cbiAgICogQHJldHVybiBUaGUgY3JlYXRlZCBOb2RlSXRlcmF0b3JcbiAgICovXG4gIGNvbnN0IF9jcmVhdGVOb2RlSXRlcmF0b3IgPSBmdW5jdGlvbiAocm9vdDogTm9kZSk6IE5vZGVJdGVyYXRvciB7XG4gICAgcmV0dXJuIGNyZWF0ZU5vZGVJdGVyYXRvci5jYWxsKFxuICAgICAgcm9vdC5vd25lckRvY3VtZW50IHx8IHJvb3QsXG4gICAgICByb290LFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2VcbiAgICAgIE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5UIHxcbiAgICAgICAgTm9kZUZpbHRlci5TSE9XX0NPTU1FTlQgfFxuICAgICAgICBOb2RlRmlsdGVyLlNIT1dfVEVYVCB8XG4gICAgICAgIE5vZGVGaWx0ZXIuU0hPV19QUk9DRVNTSU5HX0lOU1RSVUNUSU9OIHxcbiAgICAgICAgTm9kZUZpbHRlci5TSE9XX0NEQVRBX1NFQ1RJT04sXG4gICAgICBudWxsXG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAgICogX2lzQ2xvYmJlcmVkXG4gICAqXG4gICAqIEBwYXJhbSBlbGVtZW50IGVsZW1lbnQgdG8gY2hlY2sgZm9yIGNsb2JiZXJpbmcgYXR0YWNrc1xuICAgKiBAcmV0dXJuIHRydWUgaWYgY2xvYmJlcmVkLCBmYWxzZSBpZiBzYWZlXG4gICAqL1xuICBjb25zdCBfaXNDbG9iYmVyZWQgPSBmdW5jdGlvbiAoZWxlbWVudDogRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBlbGVtZW50IGluc3RhbmNlb2YgSFRNTEZvcm1FbGVtZW50ICYmXG4gICAgICAodHlwZW9mIGVsZW1lbnQubm9kZU5hbWUgIT09ICdzdHJpbmcnIHx8XG4gICAgICAgIHR5cGVvZiBlbGVtZW50LnRleHRDb250ZW50ICE9PSAnc3RyaW5nJyB8fFxuICAgICAgICB0eXBlb2YgZWxlbWVudC5yZW1vdmVDaGlsZCAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICAhKGVsZW1lbnQuYXR0cmlidXRlcyBpbnN0YW5jZW9mIE5hbWVkTm9kZU1hcCkgfHxcbiAgICAgICAgdHlwZW9mIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlICE9PSAnZnVuY3Rpb24nIHx8XG4gICAgICAgIHR5cGVvZiBlbGVtZW50LnNldEF0dHJpYnV0ZSAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICB0eXBlb2YgZWxlbWVudC5uYW1lc3BhY2VVUkkgIT09ICdzdHJpbmcnIHx8XG4gICAgICAgIHR5cGVvZiBlbGVtZW50Lmluc2VydEJlZm9yZSAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICB0eXBlb2YgZWxlbWVudC5oYXNDaGlsZE5vZGVzICE9PSAnZnVuY3Rpb24nKVxuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBvYmplY3QgaXMgYSBET00gbm9kZS5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIG9iamVjdCB0byBjaGVjayB3aGV0aGVyIGl0J3MgYSBET00gbm9kZVxuICAgKiBAcmV0dXJuIHRydWUgaXMgb2JqZWN0IGlzIGEgRE9NIG5vZGVcbiAgICovXG4gIGNvbnN0IF9pc05vZGUgPSBmdW5jdGlvbiAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBOb2RlIHtcbiAgICByZXR1cm4gdHlwZW9mIE5vZGUgPT09ICdmdW5jdGlvbicgJiYgdmFsdWUgaW5zdGFuY2VvZiBOb2RlO1xuICB9O1xuXG4gIGZ1bmN0aW9uIF9leGVjdXRlSG9va3M8VCBleHRlbmRzIEhvb2tGdW5jdGlvbj4oXG4gICAgaG9va3M6IEhvb2tGdW5jdGlvbltdLFxuICAgIGN1cnJlbnROb2RlOiBQYXJhbWV0ZXJzPFQ+WzBdLFxuICAgIGRhdGE6IFBhcmFtZXRlcnM8VD5bMV1cbiAgKTogdm9pZCB7XG4gICAgYXJyYXlGb3JFYWNoKGhvb2tzLCAoaG9vazogVCkgPT4ge1xuICAgICAgaG9vay5jYWxsKERPTVB1cmlmeSwgY3VycmVudE5vZGUsIGRhdGEsIENPTkZJRyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogX3Nhbml0aXplRWxlbWVudHNcbiAgICpcbiAgICogQHByb3RlY3Qgbm9kZU5hbWVcbiAgICogQHByb3RlY3QgdGV4dENvbnRlbnRcbiAgICogQHByb3RlY3QgcmVtb3ZlQ2hpbGRcbiAgICogQHBhcmFtIGN1cnJlbnROb2RlIHRvIGNoZWNrIGZvciBwZXJtaXNzaW9uIHRvIGV4aXN0XG4gICAqIEByZXR1cm4gdHJ1ZSBpZiBub2RlIHdhcyBraWxsZWQsIGZhbHNlIGlmIGxlZnQgYWxpdmVcbiAgICovXG4gIGNvbnN0IF9zYW5pdGl6ZUVsZW1lbnRzID0gZnVuY3Rpb24gKGN1cnJlbnROb2RlOiBhbnkpOiBib29sZWFuIHtcbiAgICBsZXQgY29udGVudCA9IG51bGw7XG5cbiAgICAvKiBFeGVjdXRlIGEgaG9vayBpZiBwcmVzZW50ICovXG4gICAgX2V4ZWN1dGVIb29rcyhob29rcy5iZWZvcmVTYW5pdGl6ZUVsZW1lbnRzLCBjdXJyZW50Tm9kZSwgbnVsbCk7XG5cbiAgICAvKiBDaGVjayBpZiBlbGVtZW50IGlzIGNsb2JiZXJlZCBvciBjYW4gY2xvYmJlciAqL1xuICAgIGlmIChfaXNDbG9iYmVyZWQoY3VycmVudE5vZGUpKSB7XG4gICAgICBfZm9yY2VSZW1vdmUoY3VycmVudE5vZGUpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyogTm93IGxldCdzIGNoZWNrIHRoZSBlbGVtZW50J3MgdHlwZSBhbmQgbmFtZSAqL1xuICAgIGNvbnN0IHRhZ05hbWUgPSB0cmFuc2Zvcm1DYXNlRnVuYyhjdXJyZW50Tm9kZS5ub2RlTmFtZSk7XG5cbiAgICAvKiBFeGVjdXRlIGEgaG9vayBpZiBwcmVzZW50ICovXG4gICAgX2V4ZWN1dGVIb29rcyhob29rcy51cG9uU2FuaXRpemVFbGVtZW50LCBjdXJyZW50Tm9kZSwge1xuICAgICAgdGFnTmFtZSxcbiAgICAgIGFsbG93ZWRUYWdzOiBBTExPV0VEX1RBR1MsXG4gICAgfSk7XG5cbiAgICAvKiBEZXRlY3QgbVhTUyBhdHRlbXB0cyBhYnVzaW5nIG5hbWVzcGFjZSBjb25mdXNpb24gKi9cbiAgICBpZiAoXG4gICAgICBTQUZFX0ZPUl9YTUwgJiZcbiAgICAgIGN1cnJlbnROb2RlLmhhc0NoaWxkTm9kZXMoKSAmJlxuICAgICAgIV9pc05vZGUoY3VycmVudE5vZGUuZmlyc3RFbGVtZW50Q2hpbGQpICYmXG4gICAgICByZWdFeHBUZXN0KC88Wy9cXHchXS9nLCBjdXJyZW50Tm9kZS5pbm5lckhUTUwpICYmXG4gICAgICByZWdFeHBUZXN0KC88Wy9cXHchXS9nLCBjdXJyZW50Tm9kZS50ZXh0Q29udGVudClcbiAgICApIHtcbiAgICAgIF9mb3JjZVJlbW92ZShjdXJyZW50Tm9kZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKiBSZW1vdmUgYW55IG9jY3VycmVuY2Ugb2YgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMgKi9cbiAgICBpZiAoY3VycmVudE5vZGUubm9kZVR5cGUgPT09IE5PREVfVFlQRS5wcm9ncmVzc2luZ0luc3RydWN0aW9uKSB7XG4gICAgICBfZm9yY2VSZW1vdmUoY3VycmVudE5vZGUpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyogUmVtb3ZlIGFueSBraW5kIG9mIHBvc3NpYmx5IGhhcm1mdWwgY29tbWVudHMgKi9cbiAgICBpZiAoXG4gICAgICBTQUZFX0ZPUl9YTUwgJiZcbiAgICAgIGN1cnJlbnROb2RlLm5vZGVUeXBlID09PSBOT0RFX1RZUEUuY29tbWVudCAmJlxuICAgICAgcmVnRXhwVGVzdCgvPFsvXFx3XS9nLCBjdXJyZW50Tm9kZS5kYXRhKVxuICAgICkge1xuICAgICAgX2ZvcmNlUmVtb3ZlKGN1cnJlbnROb2RlKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qIFJlbW92ZSBlbGVtZW50IGlmIGFueXRoaW5nIGZvcmJpZHMgaXRzIHByZXNlbmNlICovXG4gICAgaWYgKFxuICAgICAgIShcbiAgICAgICAgRVhUUkFfRUxFTUVOVF9IQU5ETElORy50YWdDaGVjayBpbnN0YW5jZW9mIEZ1bmN0aW9uICYmXG4gICAgICAgIEVYVFJBX0VMRU1FTlRfSEFORExJTkcudGFnQ2hlY2sodGFnTmFtZSlcbiAgICAgICkgJiZcbiAgICAgICghQUxMT1dFRF9UQUdTW3RhZ05hbWVdIHx8IEZPUkJJRF9UQUdTW3RhZ05hbWVdKVxuICAgICkge1xuICAgICAgLyogQ2hlY2sgaWYgd2UgaGF2ZSBhIGN1c3RvbSBlbGVtZW50IHRvIGhhbmRsZSAqL1xuICAgICAgaWYgKCFGT1JCSURfVEFHU1t0YWdOYW1lXSAmJiBfaXNCYXNpY0N1c3RvbUVsZW1lbnQodGFnTmFtZSkpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVjayBpbnN0YW5jZW9mIFJlZ0V4cCAmJlxuICAgICAgICAgIHJlZ0V4cFRlc3QoQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrLCB0YWdOYW1lKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrIGluc3RhbmNlb2YgRnVuY3Rpb24gJiZcbiAgICAgICAgICBDVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2sodGFnTmFtZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8qIEtlZXAgY29udGVudCBleGNlcHQgZm9yIGJhZC1saXN0ZWQgZWxlbWVudHMgKi9cbiAgICAgIGlmIChLRUVQX0NPTlRFTlQgJiYgIUZPUkJJRF9DT05URU5UU1t0YWdOYW1lXSkge1xuICAgICAgICBjb25zdCBwYXJlbnROb2RlID0gZ2V0UGFyZW50Tm9kZShjdXJyZW50Tm9kZSkgfHwgY3VycmVudE5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgY29uc3QgY2hpbGROb2RlcyA9IGdldENoaWxkTm9kZXMoY3VycmVudE5vZGUpIHx8IGN1cnJlbnROb2RlLmNoaWxkTm9kZXM7XG5cbiAgICAgICAgaWYgKGNoaWxkTm9kZXMgJiYgcGFyZW50Tm9kZSkge1xuICAgICAgICAgIGNvbnN0IGNoaWxkQ291bnQgPSBjaGlsZE5vZGVzLmxlbmd0aDtcblxuICAgICAgICAgIGZvciAobGV0IGkgPSBjaGlsZENvdW50IC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkQ2xvbmUgPSBjbG9uZU5vZGUoY2hpbGROb2Rlc1tpXSwgdHJ1ZSk7XG4gICAgICAgICAgICBjaGlsZENsb25lLl9fcmVtb3ZhbENvdW50ID0gKGN1cnJlbnROb2RlLl9fcmVtb3ZhbENvdW50IHx8IDApICsgMTtcbiAgICAgICAgICAgIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNoaWxkQ2xvbmUsIGdldE5leHRTaWJsaW5nKGN1cnJlbnROb2RlKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIF9mb3JjZVJlbW92ZShjdXJyZW50Tm9kZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKiBDaGVjayB3aGV0aGVyIGVsZW1lbnQgaGFzIGEgdmFsaWQgbmFtZXNwYWNlICovXG4gICAgaWYgKGN1cnJlbnROb2RlIGluc3RhbmNlb2YgRWxlbWVudCAmJiAhX2NoZWNrVmFsaWROYW1lc3BhY2UoY3VycmVudE5vZGUpKSB7XG4gICAgICBfZm9yY2VSZW1vdmUoY3VycmVudE5vZGUpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyogTWFrZSBzdXJlIHRoYXQgb2xkZXIgYnJvd3NlcnMgZG9uJ3QgZ2V0IGZhbGxiYWNrLXRhZyBtWFNTICovXG4gICAgaWYgKFxuICAgICAgKHRhZ05hbWUgPT09ICdub3NjcmlwdCcgfHxcbiAgICAgICAgdGFnTmFtZSA9PT0gJ25vZW1iZWQnIHx8XG4gICAgICAgIHRhZ05hbWUgPT09ICdub2ZyYW1lcycpICYmXG4gICAgICByZWdFeHBUZXN0KC88XFwvbm8oc2NyaXB0fGVtYmVkfGZyYW1lcykvaSwgY3VycmVudE5vZGUuaW5uZXJIVE1MKVxuICAgICkge1xuICAgICAgX2ZvcmNlUmVtb3ZlKGN1cnJlbnROb2RlKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qIFNhbml0aXplIGVsZW1lbnQgY29udGVudCB0byBiZSB0ZW1wbGF0ZS1zYWZlICovXG4gICAgaWYgKFNBRkVfRk9SX1RFTVBMQVRFUyAmJiBjdXJyZW50Tm9kZS5ub2RlVHlwZSA9PT0gTk9ERV9UWVBFLnRleHQpIHtcbiAgICAgIC8qIEdldCB0aGUgZWxlbWVudCdzIHRleHQgY29udGVudCAqL1xuICAgICAgY29udGVudCA9IGN1cnJlbnROb2RlLnRleHRDb250ZW50O1xuXG4gICAgICBhcnJheUZvckVhY2goW01VU1RBQ0hFX0VYUFIsIEVSQl9FWFBSLCBUTVBMSVRfRVhQUl0sIChleHByOiBSZWdFeHApID0+IHtcbiAgICAgICAgY29udGVudCA9IHN0cmluZ1JlcGxhY2UoY29udGVudCwgZXhwciwgJyAnKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoY3VycmVudE5vZGUudGV4dENvbnRlbnQgIT09IGNvbnRlbnQpIHtcbiAgICAgICAgYXJyYXlQdXNoKERPTVB1cmlmeS5yZW1vdmVkLCB7IGVsZW1lbnQ6IGN1cnJlbnROb2RlLmNsb25lTm9kZSgpIH0pO1xuICAgICAgICBjdXJyZW50Tm9kZS50ZXh0Q29udGVudCA9IGNvbnRlbnQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogRXhlY3V0ZSBhIGhvb2sgaWYgcHJlc2VudCAqL1xuICAgIF9leGVjdXRlSG9va3MoaG9va3MuYWZ0ZXJTYW5pdGl6ZUVsZW1lbnRzLCBjdXJyZW50Tm9kZSwgbnVsbCk7XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgLyoqXG4gICAqIF9pc1ZhbGlkQXR0cmlidXRlXG4gICAqXG4gICAqIEBwYXJhbSBsY1RhZyBMb3dlcmNhc2UgdGFnIG5hbWUgb2YgY29udGFpbmluZyBlbGVtZW50LlxuICAgKiBAcGFyYW0gbGNOYW1lIExvd2VyY2FzZSBhdHRyaWJ1dGUgbmFtZS5cbiAgICogQHBhcmFtIHZhbHVlIEF0dHJpYnV0ZSB2YWx1ZS5cbiAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgYHZhbHVlYCBpcyB2YWxpZCwgb3RoZXJ3aXNlIGZhbHNlLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbiAgY29uc3QgX2lzVmFsaWRBdHRyaWJ1dGUgPSBmdW5jdGlvbiAoXG4gICAgbGNUYWc6IHN0cmluZyxcbiAgICBsY05hbWU6IHN0cmluZyxcbiAgICB2YWx1ZTogc3RyaW5nXG4gICk6IGJvb2xlYW4ge1xuICAgIC8qIEZPUkJJRF9BVFRSIG11c3QgYWx3YXlzIHdpbiwgZXZlbiBpZiBBRERfQVRUUiBwcmVkaWNhdGUgd291bGQgYWxsb3cgaXQgKi9cbiAgICBpZiAoRk9SQklEX0FUVFJbbGNOYW1lXSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qIE1ha2Ugc3VyZSBhdHRyaWJ1dGUgY2Fubm90IGNsb2JiZXIgKi9cbiAgICBpZiAoXG4gICAgICBTQU5JVElaRV9ET00gJiZcbiAgICAgIChsY05hbWUgPT09ICdpZCcgfHwgbGNOYW1lID09PSAnbmFtZScpICYmXG4gICAgICAodmFsdWUgaW4gZG9jdW1lbnQgfHwgdmFsdWUgaW4gZm9ybUVsZW1lbnQpXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyogQWxsb3cgdmFsaWQgZGF0YS0qIGF0dHJpYnV0ZXM6IEF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIgYWZ0ZXIgXCItXCJcbiAgICAgICAgKGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2RvbS5odG1sI2VtYmVkZGluZy1jdXN0b20tbm9uLXZpc2libGUtZGF0YS13aXRoLXRoZS1kYXRhLSotYXR0cmlidXRlcylcbiAgICAgICAgWE1MLWNvbXBhdGlibGUgKGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2luZnJhc3RydWN0dXJlLmh0bWwjeG1sLWNvbXBhdGlibGUgYW5kIGh0dHA6Ly93d3cudzMub3JnL1RSL3htbC8jZDBlODA0KVxuICAgICAgICBXZSBkb24ndCBuZWVkIHRvIGNoZWNrIHRoZSB2YWx1ZTsgaXQncyBhbHdheXMgVVJJIHNhZmUuICovXG4gICAgaWYgKFxuICAgICAgQUxMT1dfREFUQV9BVFRSICYmXG4gICAgICAhRk9SQklEX0FUVFJbbGNOYW1lXSAmJlxuICAgICAgcmVnRXhwVGVzdChEQVRBX0FUVFIsIGxjTmFtZSlcbiAgICApIHtcbiAgICAgIC8vIFRoaXMgYXR0cmlidXRlIGlzIHNhZmVcbiAgICB9IGVsc2UgaWYgKEFMTE9XX0FSSUFfQVRUUiAmJiByZWdFeHBUZXN0KEFSSUFfQVRUUiwgbGNOYW1lKSkge1xuICAgICAgLy8gVGhpcyBhdHRyaWJ1dGUgaXMgc2FmZVxuICAgICAgLyogQ2hlY2sgaWYgQUREX0FUVFIgZnVuY3Rpb24gYWxsb3dzIHRoaXMgYXR0cmlidXRlICovXG4gICAgfSBlbHNlIGlmIChcbiAgICAgIEVYVFJBX0VMRU1FTlRfSEFORExJTkcuYXR0cmlidXRlQ2hlY2sgaW5zdGFuY2VvZiBGdW5jdGlvbiAmJlxuICAgICAgRVhUUkFfRUxFTUVOVF9IQU5ETElORy5hdHRyaWJ1dGVDaGVjayhsY05hbWUsIGxjVGFnKVxuICAgICkge1xuICAgICAgLy8gVGhpcyBhdHRyaWJ1dGUgaXMgc2FmZVxuICAgICAgLyogT3RoZXJ3aXNlLCBjaGVjayB0aGUgbmFtZSBpcyBwZXJtaXR0ZWQgKi9cbiAgICB9IGVsc2UgaWYgKCFBTExPV0VEX0FUVFJbbGNOYW1lXSB8fCBGT1JCSURfQVRUUltsY05hbWVdKSB7XG4gICAgICBpZiAoXG4gICAgICAgIC8vIEZpcnN0IGNvbmRpdGlvbiBkb2VzIGEgdmVyeSBiYXNpYyBjaGVjayBpZiBhKSBpdCdzIGJhc2ljYWxseSBhIHZhbGlkIGN1c3RvbSBlbGVtZW50IHRhZ25hbWUgQU5EXG4gICAgICAgIC8vIGIpIGlmIHRoZSB0YWdOYW1lIHBhc3NlcyB3aGF0ZXZlciB0aGUgdXNlciBoYXMgY29uZmlndXJlZCBmb3IgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrXG4gICAgICAgIC8vIGFuZCBjKSBpZiB0aGUgYXR0cmlidXRlIG5hbWUgcGFzc2VzIHdoYXRldmVyIHRoZSB1c2VyIGhhcyBjb25maWd1cmVkIGZvciBDVVNUT01fRUxFTUVOVF9IQU5ETElORy5hdHRyaWJ1dGVOYW1lQ2hlY2tcbiAgICAgICAgKF9pc0Jhc2ljQ3VzdG9tRWxlbWVudChsY1RhZykgJiZcbiAgICAgICAgICAoKENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVjayBpbnN0YW5jZW9mIFJlZ0V4cCAmJlxuICAgICAgICAgICAgcmVnRXhwVGVzdChDVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2ssIGxjVGFnKSkgfHxcbiAgICAgICAgICAgIChDVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2sgaW5zdGFuY2VvZiBGdW5jdGlvbiAmJlxuICAgICAgICAgICAgICBDVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2sobGNUYWcpKSkgJiZcbiAgICAgICAgICAoKENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLmF0dHJpYnV0ZU5hbWVDaGVjayBpbnN0YW5jZW9mIFJlZ0V4cCAmJlxuICAgICAgICAgICAgcmVnRXhwVGVzdChDVVNUT01fRUxFTUVOVF9IQU5ETElORy5hdHRyaWJ1dGVOYW1lQ2hlY2ssIGxjTmFtZSkpIHx8XG4gICAgICAgICAgICAoQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcuYXR0cmlidXRlTmFtZUNoZWNrIGluc3RhbmNlb2YgRnVuY3Rpb24gJiZcbiAgICAgICAgICAgICAgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcuYXR0cmlidXRlTmFtZUNoZWNrKGxjTmFtZSwgbGNUYWcpKSkpIHx8XG4gICAgICAgIC8vIEFsdGVybmF0aXZlLCBzZWNvbmQgY29uZGl0aW9uIGNoZWNrcyBpZiBpdCdzIGFuIGBpc2AtYXR0cmlidXRlLCBBTkRcbiAgICAgICAgLy8gdGhlIHZhbHVlIHBhc3NlcyB3aGF0ZXZlciB0aGUgdXNlciBoYXMgY29uZmlndXJlZCBmb3IgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrXG4gICAgICAgIChsY05hbWUgPT09ICdpcycgJiZcbiAgICAgICAgICBDVVNUT01fRUxFTUVOVF9IQU5ETElORy5hbGxvd0N1c3RvbWl6ZWRCdWlsdEluRWxlbWVudHMgJiZcbiAgICAgICAgICAoKENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVjayBpbnN0YW5jZW9mIFJlZ0V4cCAmJlxuICAgICAgICAgICAgcmVnRXhwVGVzdChDVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2ssIHZhbHVlKSkgfHxcbiAgICAgICAgICAgIChDVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2sgaW5zdGFuY2VvZiBGdW5jdGlvbiAmJlxuICAgICAgICAgICAgICBDVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2sodmFsdWUpKSkpXG4gICAgICApIHtcbiAgICAgICAgLy8gSWYgdXNlciBoYXMgc3VwcGxpZWQgYSByZWdleHAgb3IgZnVuY3Rpb24gaW4gQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrLCB3ZSBuZWVkIHRvIGFsc28gYWxsb3cgZGVyaXZlZCBjdXN0b20gZWxlbWVudHMgdXNpbmcgdGhlIHNhbWUgdGFnTmFtZSB0ZXN0LlxuICAgICAgICAvLyBBZGRpdGlvbmFsbHksIHdlIG5lZWQgdG8gYWxsb3cgYXR0cmlidXRlcyBwYXNzaW5nIHRoZSBDVVNUT01fRUxFTUVOVF9IQU5ETElORy5hdHRyaWJ1dGVOYW1lQ2hlY2sgdXNlciBoYXMgY29uZmlndXJlZCwgYXMgY3VzdG9tIGVsZW1lbnRzIGNhbiBkZWZpbmUgdGhlc2UgYXQgdGhlaXIgb3duIGRpc2NyZXRpb24uXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICAvKiBDaGVjayB2YWx1ZSBpcyBzYWZlLiBGaXJzdCwgaXMgYXR0ciBpbmVydD8gSWYgc28sIGlzIHNhZmUgKi9cbiAgICB9IGVsc2UgaWYgKFVSSV9TQUZFX0FUVFJJQlVURVNbbGNOYW1lXSkge1xuICAgICAgLy8gVGhpcyBhdHRyaWJ1dGUgaXMgc2FmZVxuICAgICAgLyogQ2hlY2sgbm8gc2NyaXB0LCBkYXRhIG9yIHVua25vd24gcG9zc2libHkgdW5zYWZlIFVSSVxuICAgICAgICB1bmxlc3Mgd2Uga25vdyBVUkkgdmFsdWVzIGFyZSBzYWZlIGZvciB0aGF0IGF0dHJpYnV0ZSAqL1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICByZWdFeHBUZXN0KElTX0FMTE9XRURfVVJJLCBzdHJpbmdSZXBsYWNlKHZhbHVlLCBBVFRSX1dISVRFU1BBQ0UsICcnKSlcbiAgICApIHtcbiAgICAgIC8vIFRoaXMgYXR0cmlidXRlIGlzIHNhZmVcbiAgICAgIC8qIEtlZXAgaW1hZ2UgZGF0YSBVUklzIGFsaXZlIGlmIHNyYy94bGluazpocmVmIGlzIGFsbG93ZWQgKi9cbiAgICAgIC8qIEZ1cnRoZXIgcHJldmVudCBnYWRnZXQgWFNTIGZvciBkeW5hbWljYWxseSBidWlsdCBzY3JpcHQgdGFncyAqL1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAobGNOYW1lID09PSAnc3JjJyB8fCBsY05hbWUgPT09ICd4bGluazpocmVmJyB8fCBsY05hbWUgPT09ICdocmVmJykgJiZcbiAgICAgIGxjVGFnICE9PSAnc2NyaXB0JyAmJlxuICAgICAgc3RyaW5nSW5kZXhPZih2YWx1ZSwgJ2RhdGE6JykgPT09IDAgJiZcbiAgICAgIERBVEFfVVJJX1RBR1NbbGNUYWddXG4gICAgKSB7XG4gICAgICAvLyBUaGlzIGF0dHJpYnV0ZSBpcyBzYWZlXG4gICAgICAvKiBBbGxvdyB1bmtub3duIHByb3RvY29sczogVGhpcyBwcm92aWRlcyBzdXBwb3J0IGZvciBsaW5rcyB0aGF0XG4gICAgICAgIGFyZSBoYW5kbGVkIGJ5IHByb3RvY29sIGhhbmRsZXJzIHdoaWNoIG1heSBiZSB1bmtub3duIGFoZWFkIG9mXG4gICAgICAgIHRpbWUsIGUuZy4gZmI6LCBzcG90aWZ5OiAqL1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBBTExPV19VTktOT1dOX1BST1RPQ09MUyAmJlxuICAgICAgIXJlZ0V4cFRlc3QoSVNfU0NSSVBUX09SX0RBVEEsIHN0cmluZ1JlcGxhY2UodmFsdWUsIEFUVFJfV0hJVEVTUEFDRSwgJycpKVxuICAgICkge1xuICAgICAgLy8gVGhpcyBhdHRyaWJ1dGUgaXMgc2FmZVxuICAgICAgLyogQ2hlY2sgZm9yIGJpbmFyeSBhdHRyaWJ1dGVzICovXG4gICAgfSBlbHNlIGlmICh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBCaW5hcnkgYXR0cmlidXRlcyBhcmUgc2FmZSBhdCB0aGlzIHBvaW50XG4gICAgICAvKiBBbnl0aGluZyBlbHNlLCBwcmVzdW1lIHVuc2FmZSwgZG8gbm90IGFkZCBpdCBiYWNrICovXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgLyoqXG4gICAqIF9pc0Jhc2ljQ3VzdG9tRWxlbWVudFxuICAgKiBjaGVja3MgaWYgYXQgbGVhc3Qgb25lIGRhc2ggaXMgaW5jbHVkZWQgaW4gdGFnTmFtZSwgYW5kIGl0J3Mgbm90IHRoZSBmaXJzdCBjaGFyXG4gICAqIGZvciBtb3JlIHNvcGhpc3RpY2F0ZWQgY2hlY2tpbmcgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMvdmFsaWRhdGUtZWxlbWVudC1uYW1lXG4gICAqXG4gICAqIEBwYXJhbSB0YWdOYW1lIG5hbWUgb2YgdGhlIHRhZyBvZiB0aGUgbm9kZSB0byBzYW5pdGl6ZVxuICAgKiBAcmV0dXJucyBSZXR1cm5zIHRydWUgaWYgdGhlIHRhZyBuYW1lIG1lZXRzIHRoZSBiYXNpYyBjcml0ZXJpYSBmb3IgYSBjdXN0b20gZWxlbWVudCwgb3RoZXJ3aXNlIGZhbHNlLlxuICAgKi9cbiAgY29uc3QgX2lzQmFzaWNDdXN0b21FbGVtZW50ID0gZnVuY3Rpb24gKHRhZ05hbWU6IHN0cmluZyk6IFJlZ0V4cE1hdGNoQXJyYXkge1xuICAgIHJldHVybiB0YWdOYW1lICE9PSAnYW5ub3RhdGlvbi14bWwnICYmIHN0cmluZ01hdGNoKHRhZ05hbWUsIENVU1RPTV9FTEVNRU5UKTtcbiAgfTtcblxuICAvKipcbiAgICogX3Nhbml0aXplQXR0cmlidXRlc1xuICAgKlxuICAgKiBAcHJvdGVjdCBhdHRyaWJ1dGVzXG4gICAqIEBwcm90ZWN0IG5vZGVOYW1lXG4gICAqIEBwcm90ZWN0IHJlbW92ZUF0dHJpYnV0ZVxuICAgKiBAcHJvdGVjdCBzZXRBdHRyaWJ1dGVcbiAgICpcbiAgICogQHBhcmFtIGN1cnJlbnROb2RlIHRvIHNhbml0aXplXG4gICAqL1xuICBjb25zdCBfc2FuaXRpemVBdHRyaWJ1dGVzID0gZnVuY3Rpb24gKGN1cnJlbnROb2RlOiBFbGVtZW50KTogdm9pZCB7XG4gICAgLyogRXhlY3V0ZSBhIGhvb2sgaWYgcHJlc2VudCAqL1xuICAgIF9leGVjdXRlSG9va3MoaG9va3MuYmVmb3JlU2FuaXRpemVBdHRyaWJ1dGVzLCBjdXJyZW50Tm9kZSwgbnVsbCk7XG5cbiAgICBjb25zdCB7IGF0dHJpYnV0ZXMgfSA9IGN1cnJlbnROb2RlO1xuXG4gICAgLyogQ2hlY2sgaWYgd2UgaGF2ZSBhdHRyaWJ1dGVzOyBpZiBub3Qgd2UgbWlnaHQgaGF2ZSBhIHRleHQgbm9kZSAqL1xuICAgIGlmICghYXR0cmlidXRlcyB8fCBfaXNDbG9iYmVyZWQoY3VycmVudE5vZGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaG9va0V2ZW50ID0ge1xuICAgICAgYXR0ck5hbWU6ICcnLFxuICAgICAgYXR0clZhbHVlOiAnJyxcbiAgICAgIGtlZXBBdHRyOiB0cnVlLFxuICAgICAgYWxsb3dlZEF0dHJpYnV0ZXM6IEFMTE9XRURfQVRUUixcbiAgICAgIGZvcmNlS2VlcEF0dHI6IHVuZGVmaW5lZCxcbiAgICB9O1xuICAgIGxldCBsID0gYXR0cmlidXRlcy5sZW5ndGg7XG5cbiAgICAvKiBHbyBiYWNrd2FyZHMgb3ZlciBhbGwgYXR0cmlidXRlczsgc2FmZWx5IHJlbW92ZSBiYWQgb25lcyAqL1xuICAgIHdoaWxlIChsLS0pIHtcbiAgICAgIGNvbnN0IGF0dHIgPSBhdHRyaWJ1dGVzW2xdO1xuICAgICAgY29uc3QgeyBuYW1lLCBuYW1lc3BhY2VVUkksIHZhbHVlOiBhdHRyVmFsdWUgfSA9IGF0dHI7XG4gICAgICBjb25zdCBsY05hbWUgPSB0cmFuc2Zvcm1DYXNlRnVuYyhuYW1lKTtcblxuICAgICAgY29uc3QgaW5pdFZhbHVlID0gYXR0clZhbHVlO1xuICAgICAgbGV0IHZhbHVlID0gbmFtZSA9PT0gJ3ZhbHVlJyA/IGluaXRWYWx1ZSA6IHN0cmluZ1RyaW0oaW5pdFZhbHVlKTtcblxuICAgICAgLyogRXhlY3V0ZSBhIGhvb2sgaWYgcHJlc2VudCAqL1xuICAgICAgaG9va0V2ZW50LmF0dHJOYW1lID0gbGNOYW1lO1xuICAgICAgaG9va0V2ZW50LmF0dHJWYWx1ZSA9IHZhbHVlO1xuICAgICAgaG9va0V2ZW50LmtlZXBBdHRyID0gdHJ1ZTtcbiAgICAgIGhvb2tFdmVudC5mb3JjZUtlZXBBdHRyID0gdW5kZWZpbmVkOyAvLyBBbGxvd3MgZGV2ZWxvcGVycyB0byBzZWUgdGhpcyBpcyBhIHByb3BlcnR5IHRoZXkgY2FuIHNldFxuICAgICAgX2V4ZWN1dGVIb29rcyhob29rcy51cG9uU2FuaXRpemVBdHRyaWJ1dGUsIGN1cnJlbnROb2RlLCBob29rRXZlbnQpO1xuICAgICAgdmFsdWUgPSBob29rRXZlbnQuYXR0clZhbHVlO1xuXG4gICAgICAvKiBGdWxsIERPTSBDbG9iYmVyaW5nIHByb3RlY3Rpb24gdmlhIG5hbWVzcGFjZSBpc29sYXRpb24sXG4gICAgICAgKiBQcmVmaXggaWQgYW5kIG5hbWUgYXR0cmlidXRlcyB3aXRoIGB1c2VyLWNvbnRlbnQtYFxuICAgICAgICovXG4gICAgICBpZiAoU0FOSVRJWkVfTkFNRURfUFJPUFMgJiYgKGxjTmFtZSA9PT0gJ2lkJyB8fCBsY05hbWUgPT09ICduYW1lJykpIHtcbiAgICAgICAgLy8gUmVtb3ZlIHRoZSBhdHRyaWJ1dGUgd2l0aCB0aGlzIHZhbHVlXG4gICAgICAgIF9yZW1vdmVBdHRyaWJ1dGUobmFtZSwgY3VycmVudE5vZGUpO1xuXG4gICAgICAgIC8vIFByZWZpeCB0aGUgdmFsdWUgYW5kIGxhdGVyIHJlLWNyZWF0ZSB0aGUgYXR0cmlidXRlIHdpdGggdGhlIHNhbml0aXplZCB2YWx1ZVxuICAgICAgICB2YWx1ZSA9IFNBTklUSVpFX05BTUVEX1BST1BTX1BSRUZJWCArIHZhbHVlO1xuICAgICAgfVxuXG4gICAgICAvKiBXb3JrIGFyb3VuZCBhIHNlY3VyaXR5IGlzc3VlIHdpdGggY29tbWVudHMgaW5zaWRlIGF0dHJpYnV0ZXMgKi9cbiAgICAgIGlmIChcbiAgICAgICAgU0FGRV9GT1JfWE1MICYmXG4gICAgICAgIHJlZ0V4cFRlc3QoXG4gICAgICAgICAgLygoLS0hP3xdKT4pfDxcXC8oc3R5bGV8c2NyaXB0fHRpdGxlfHhtcHx0ZXh0YXJlYXxub3NjcmlwdHxpZnJhbWV8bm9lbWJlZHxub2ZyYW1lcykvaSxcbiAgICAgICAgICB2YWx1ZVxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgX3JlbW92ZUF0dHJpYnV0ZShuYW1lLCBjdXJyZW50Tm9kZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvKiBNYWtlIHN1cmUgd2UgY2Fubm90IGVhc2lseSB1c2UgYW5pbWF0ZWQgaHJlZnMsIGV2ZW4gaWYgYW5pbWF0aW9ucyBhcmUgYWxsb3dlZCAqL1xuICAgICAgaWYgKGxjTmFtZSA9PT0gJ2F0dHJpYnV0ZW5hbWUnICYmIHN0cmluZ01hdGNoKHZhbHVlLCAnaHJlZicpKSB7XG4gICAgICAgIF9yZW1vdmVBdHRyaWJ1dGUobmFtZSwgY3VycmVudE5vZGUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLyogRGlkIHRoZSBob29rcyBhcHByb3ZlIG9mIHRoZSBhdHRyaWJ1dGU/ICovXG4gICAgICBpZiAoaG9va0V2ZW50LmZvcmNlS2VlcEF0dHIpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8qIERpZCB0aGUgaG9va3MgYXBwcm92ZSBvZiB0aGUgYXR0cmlidXRlPyAqL1xuICAgICAgaWYgKCFob29rRXZlbnQua2VlcEF0dHIpIHtcbiAgICAgICAgX3JlbW92ZUF0dHJpYnV0ZShuYW1lLCBjdXJyZW50Tm9kZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvKiBXb3JrIGFyb3VuZCBhIHNlY3VyaXR5IGlzc3VlIGluIGpRdWVyeSAzLjAgKi9cbiAgICAgIGlmICghQUxMT1dfU0VMRl9DTE9TRV9JTl9BVFRSICYmIHJlZ0V4cFRlc3QoL1xcLz4vaSwgdmFsdWUpKSB7XG4gICAgICAgIF9yZW1vdmVBdHRyaWJ1dGUobmFtZSwgY3VycmVudE5vZGUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLyogU2FuaXRpemUgYXR0cmlidXRlIGNvbnRlbnQgdG8gYmUgdGVtcGxhdGUtc2FmZSAqL1xuICAgICAgaWYgKFNBRkVfRk9SX1RFTVBMQVRFUykge1xuICAgICAgICBhcnJheUZvckVhY2goW01VU1RBQ0hFX0VYUFIsIEVSQl9FWFBSLCBUTVBMSVRfRVhQUl0sIChleHByOiBSZWdFeHApID0+IHtcbiAgICAgICAgICB2YWx1ZSA9IHN0cmluZ1JlcGxhY2UodmFsdWUsIGV4cHIsICcgJyk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvKiBJcyBgdmFsdWVgIHZhbGlkIGZvciB0aGlzIGF0dHJpYnV0ZT8gKi9cbiAgICAgIGNvbnN0IGxjVGFnID0gdHJhbnNmb3JtQ2FzZUZ1bmMoY3VycmVudE5vZGUubm9kZU5hbWUpO1xuICAgICAgaWYgKCFfaXNWYWxpZEF0dHJpYnV0ZShsY1RhZywgbGNOYW1lLCB2YWx1ZSkpIHtcbiAgICAgICAgX3JlbW92ZUF0dHJpYnV0ZShuYW1lLCBjdXJyZW50Tm9kZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvKiBIYW5kbGUgYXR0cmlidXRlcyB0aGF0IHJlcXVpcmUgVHJ1c3RlZCBUeXBlcyAqL1xuICAgICAgaWYgKFxuICAgICAgICB0cnVzdGVkVHlwZXNQb2xpY3kgJiZcbiAgICAgICAgdHlwZW9mIHRydXN0ZWRUeXBlcyA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgdHlwZW9mIHRydXN0ZWRUeXBlcy5nZXRBdHRyaWJ1dGVUeXBlID09PSAnZnVuY3Rpb24nXG4gICAgICApIHtcbiAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSkge1xuICAgICAgICAgIC8qIE5hbWVzcGFjZXMgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkLCBzZWUgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MTMwNTI5MyAqL1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN3aXRjaCAodHJ1c3RlZFR5cGVzLmdldEF0dHJpYnV0ZVR5cGUobGNUYWcsIGxjTmFtZSkpIHtcbiAgICAgICAgICAgIGNhc2UgJ1RydXN0ZWRIVE1MJzoge1xuICAgICAgICAgICAgICB2YWx1ZSA9IHRydXN0ZWRUeXBlc1BvbGljeS5jcmVhdGVIVE1MKHZhbHVlKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgJ1RydXN0ZWRTY3JpcHRVUkwnOiB7XG4gICAgICAgICAgICAgIHZhbHVlID0gdHJ1c3RlZFR5cGVzUG9saWN5LmNyZWF0ZVNjcmlwdFVSTCh2YWx1ZSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvKiBIYW5kbGUgaW52YWxpZCBkYXRhLSogYXR0cmlidXRlIHNldCBieSB0cnktY2F0Y2hpbmcgaXQgKi9cbiAgICAgIGlmICh2YWx1ZSAhPT0gaW5pdFZhbHVlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSkge1xuICAgICAgICAgICAgY3VycmVudE5vZGUuc2V0QXR0cmlidXRlTlMobmFtZXNwYWNlVVJJLCBuYW1lLCB2YWx1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8qIEZhbGxiYWNrIHRvIHNldEF0dHJpYnV0ZSgpIGZvciBicm93c2VyLXVucmVjb2duaXplZCBuYW1lc3BhY2VzIGUuZy4gXCJ4LXNjaGVtYVwiLiAqL1xuICAgICAgICAgICAgY3VycmVudE5vZGUuc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoX2lzQ2xvYmJlcmVkKGN1cnJlbnROb2RlKSkge1xuICAgICAgICAgICAgX2ZvcmNlUmVtb3ZlKGN1cnJlbnROb2RlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXJyYXlQb3AoRE9NUHVyaWZ5LnJlbW92ZWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAgIF9yZW1vdmVBdHRyaWJ1dGUobmFtZSwgY3VycmVudE5vZGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogRXhlY3V0ZSBhIGhvb2sgaWYgcHJlc2VudCAqL1xuICAgIF9leGVjdXRlSG9va3MoaG9va3MuYWZ0ZXJTYW5pdGl6ZUF0dHJpYnV0ZXMsIGN1cnJlbnROb2RlLCBudWxsKTtcbiAgfTtcblxuICAvKipcbiAgICogX3Nhbml0aXplU2hhZG93RE9NXG4gICAqXG4gICAqIEBwYXJhbSBmcmFnbWVudCB0byBpdGVyYXRlIG92ZXIgcmVjdXJzaXZlbHlcbiAgICovXG4gIGNvbnN0IF9zYW5pdGl6ZVNoYWRvd0RPTSA9IGZ1bmN0aW9uIChmcmFnbWVudDogRG9jdW1lbnRGcmFnbWVudCk6IHZvaWQge1xuICAgIGxldCBzaGFkb3dOb2RlID0gbnVsbDtcbiAgICBjb25zdCBzaGFkb3dJdGVyYXRvciA9IF9jcmVhdGVOb2RlSXRlcmF0b3IoZnJhZ21lbnQpO1xuXG4gICAgLyogRXhlY3V0ZSBhIGhvb2sgaWYgcHJlc2VudCAqL1xuICAgIF9leGVjdXRlSG9va3MoaG9va3MuYmVmb3JlU2FuaXRpemVTaGFkb3dET00sIGZyYWdtZW50LCBudWxsKTtcblxuICAgIHdoaWxlICgoc2hhZG93Tm9kZSA9IHNoYWRvd0l0ZXJhdG9yLm5leHROb2RlKCkpKSB7XG4gICAgICAvKiBFeGVjdXRlIGEgaG9vayBpZiBwcmVzZW50ICovXG4gICAgICBfZXhlY3V0ZUhvb2tzKGhvb2tzLnVwb25TYW5pdGl6ZVNoYWRvd05vZGUsIHNoYWRvd05vZGUsIG51bGwpO1xuXG4gICAgICAvKiBTYW5pdGl6ZSB0YWdzIGFuZCBlbGVtZW50cyAqL1xuICAgICAgX3Nhbml0aXplRWxlbWVudHMoc2hhZG93Tm9kZSk7XG5cbiAgICAgIC8qIENoZWNrIGF0dHJpYnV0ZXMgbmV4dCAqL1xuICAgICAgX3Nhbml0aXplQXR0cmlidXRlcyhzaGFkb3dOb2RlKTtcblxuICAgICAgLyogRGVlcCBzaGFkb3cgRE9NIGRldGVjdGVkICovXG4gICAgICBpZiAoc2hhZG93Tm9kZS5jb250ZW50IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCkge1xuICAgICAgICBfc2FuaXRpemVTaGFkb3dET00oc2hhZG93Tm9kZS5jb250ZW50KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBFeGVjdXRlIGEgaG9vayBpZiBwcmVzZW50ICovXG4gICAgX2V4ZWN1dGVIb29rcyhob29rcy5hZnRlclNhbml0aXplU2hhZG93RE9NLCBmcmFnbWVudCwgbnVsbCk7XG4gIH07XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbiAgRE9NUHVyaWZ5LnNhbml0aXplID0gZnVuY3Rpb24gKGRpcnR5LCBjZmcgPSB7fSkge1xuICAgIGxldCBib2R5ID0gbnVsbDtcbiAgICBsZXQgaW1wb3J0ZWROb2RlID0gbnVsbDtcbiAgICBsZXQgY3VycmVudE5vZGUgPSBudWxsO1xuICAgIGxldCByZXR1cm5Ob2RlID0gbnVsbDtcbiAgICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhIHN0cmluZyB0byBzYW5pdGl6ZS5cbiAgICAgIERPIE5PVCByZXR1cm4gZWFybHksIGFzIHRoaXMgd2lsbCByZXR1cm4gdGhlIHdyb25nIHR5cGUgaWZcbiAgICAgIHRoZSB1c2VyIGhhcyByZXF1ZXN0ZWQgYSBET00gb2JqZWN0IHJhdGhlciB0aGFuIGEgc3RyaW5nICovXG4gICAgSVNfRU1QVFlfSU5QVVQgPSAhZGlydHk7XG4gICAgaWYgKElTX0VNUFRZX0lOUFVUKSB7XG4gICAgICBkaXJ0eSA9ICc8IS0tPic7XG4gICAgfVxuXG4gICAgLyogU3RyaW5naWZ5LCBpbiBjYXNlIGRpcnR5IGlzIGFuIG9iamVjdCAqL1xuICAgIGlmICh0eXBlb2YgZGlydHkgIT09ICdzdHJpbmcnICYmICFfaXNOb2RlKGRpcnR5KSkge1xuICAgICAgaWYgKHR5cGVvZiBkaXJ0eS50b1N0cmluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBkaXJ0eSA9IGRpcnR5LnRvU3RyaW5nKCk7XG4gICAgICAgIGlmICh0eXBlb2YgZGlydHkgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgdHlwZUVycm9yQ3JlYXRlKCdkaXJ0eSBpcyBub3QgYSBzdHJpbmcsIGFib3J0aW5nJyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IHR5cGVFcnJvckNyZWF0ZSgndG9TdHJpbmcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBSZXR1cm4gZGlydHkgSFRNTCBpZiBET01QdXJpZnkgY2Fubm90IHJ1biAqL1xuICAgIGlmICghRE9NUHVyaWZ5LmlzU3VwcG9ydGVkKSB7XG4gICAgICByZXR1cm4gZGlydHk7XG4gICAgfVxuXG4gICAgLyogQXNzaWduIGNvbmZpZyB2YXJzICovXG4gICAgaWYgKCFTRVRfQ09ORklHKSB7XG4gICAgICBfcGFyc2VDb25maWcoY2ZnKTtcbiAgICB9XG5cbiAgICAvKiBDbGVhbiB1cCByZW1vdmVkIGVsZW1lbnRzICovXG4gICAgRE9NUHVyaWZ5LnJlbW92ZWQgPSBbXTtcblxuICAgIC8qIENoZWNrIGlmIGRpcnR5IGlzIGNvcnJlY3RseSB0eXBlZCBmb3IgSU5fUExBQ0UgKi9cbiAgICBpZiAodHlwZW9mIGRpcnR5ID09PSAnc3RyaW5nJykge1xuICAgICAgSU5fUExBQ0UgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoSU5fUExBQ0UpIHtcbiAgICAgIC8qIERvIHNvbWUgZWFybHkgcHJlLXNhbml0aXphdGlvbiB0byBhdm9pZCB1bnNhZmUgcm9vdCBub2RlcyAqL1xuICAgICAgaWYgKChkaXJ0eSBhcyBOb2RlKS5ub2RlTmFtZSkge1xuICAgICAgICBjb25zdCB0YWdOYW1lID0gdHJhbnNmb3JtQ2FzZUZ1bmMoKGRpcnR5IGFzIE5vZGUpLm5vZGVOYW1lKTtcbiAgICAgICAgaWYgKCFBTExPV0VEX1RBR1NbdGFnTmFtZV0gfHwgRk9SQklEX1RBR1NbdGFnTmFtZV0pIHtcbiAgICAgICAgICB0aHJvdyB0eXBlRXJyb3JDcmVhdGUoXG4gICAgICAgICAgICAncm9vdCBub2RlIGlzIGZvcmJpZGRlbiBhbmQgY2Fubm90IGJlIHNhbml0aXplZCBpbi1wbGFjZSdcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChkaXJ0eSBpbnN0YW5jZW9mIE5vZGUpIHtcbiAgICAgIC8qIElmIGRpcnR5IGlzIGEgRE9NIGVsZW1lbnQsIGFwcGVuZCB0byBhbiBlbXB0eSBkb2N1bWVudCB0byBhdm9pZFxuICAgICAgICAgZWxlbWVudHMgYmVpbmcgc3RyaXBwZWQgYnkgdGhlIHBhcnNlciAqL1xuICAgICAgYm9keSA9IF9pbml0RG9jdW1lbnQoJzwhLS0tLT4nKTtcbiAgICAgIGltcG9ydGVkTm9kZSA9IGJvZHkub3duZXJEb2N1bWVudC5pbXBvcnROb2RlKGRpcnR5LCB0cnVlKTtcbiAgICAgIGlmIChcbiAgICAgICAgaW1wb3J0ZWROb2RlLm5vZGVUeXBlID09PSBOT0RFX1RZUEUuZWxlbWVudCAmJlxuICAgICAgICBpbXBvcnRlZE5vZGUubm9kZU5hbWUgPT09ICdCT0RZJ1xuICAgICAgKSB7XG4gICAgICAgIC8qIE5vZGUgaXMgYWxyZWFkeSBhIGJvZHksIHVzZSBhcyBpcyAqL1xuICAgICAgICBib2R5ID0gaW1wb3J0ZWROb2RlO1xuICAgICAgfSBlbHNlIGlmIChpbXBvcnRlZE5vZGUubm9kZU5hbWUgPT09ICdIVE1MJykge1xuICAgICAgICBib2R5ID0gaW1wb3J0ZWROb2RlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vcHJlZmVyLWRvbS1ub2RlLWFwcGVuZFxuICAgICAgICBib2R5LmFwcGVuZENoaWxkKGltcG9ydGVkTm9kZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIEV4aXQgZGlyZWN0bHkgaWYgd2UgaGF2ZSBub3RoaW5nIHRvIGRvICovXG4gICAgICBpZiAoXG4gICAgICAgICFSRVRVUk5fRE9NICYmXG4gICAgICAgICFTQUZFX0ZPUl9URU1QTEFURVMgJiZcbiAgICAgICAgIVdIT0xFX0RPQ1VNRU5UICYmXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL3ByZWZlci1pbmNsdWRlc1xuICAgICAgICBkaXJ0eS5pbmRleE9mKCc8JykgPT09IC0xXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRydXN0ZWRUeXBlc1BvbGljeSAmJiBSRVRVUk5fVFJVU1RFRF9UWVBFXG4gICAgICAgICAgPyB0cnVzdGVkVHlwZXNQb2xpY3kuY3JlYXRlSFRNTChkaXJ0eSlcbiAgICAgICAgICA6IGRpcnR5O1xuICAgICAgfVxuXG4gICAgICAvKiBJbml0aWFsaXplIHRoZSBkb2N1bWVudCB0byB3b3JrIG9uICovXG4gICAgICBib2R5ID0gX2luaXREb2N1bWVudChkaXJ0eSk7XG5cbiAgICAgIC8qIENoZWNrIHdlIGhhdmUgYSBET00gbm9kZSBmcm9tIHRoZSBkYXRhICovXG4gICAgICBpZiAoIWJvZHkpIHtcbiAgICAgICAgcmV0dXJuIFJFVFVSTl9ET00gPyBudWxsIDogUkVUVVJOX1RSVVNURURfVFlQRSA/IGVtcHR5SFRNTCA6ICcnO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qIFJlbW92ZSBmaXJzdCBlbGVtZW50IG5vZGUgKG91cnMpIGlmIEZPUkNFX0JPRFkgaXMgc2V0ICovXG4gICAgaWYgKGJvZHkgJiYgRk9SQ0VfQk9EWSkge1xuICAgICAgX2ZvcmNlUmVtb3ZlKGJvZHkuZmlyc3RDaGlsZCk7XG4gICAgfVxuXG4gICAgLyogR2V0IG5vZGUgaXRlcmF0b3IgKi9cbiAgICBjb25zdCBub2RlSXRlcmF0b3IgPSBfY3JlYXRlTm9kZUl0ZXJhdG9yKElOX1BMQUNFID8gZGlydHkgOiBib2R5KTtcblxuICAgIC8qIE5vdyBzdGFydCBpdGVyYXRpbmcgb3ZlciB0aGUgY3JlYXRlZCBkb2N1bWVudCAqL1xuICAgIHdoaWxlICgoY3VycmVudE5vZGUgPSBub2RlSXRlcmF0b3IubmV4dE5vZGUoKSkpIHtcbiAgICAgIC8qIFNhbml0aXplIHRhZ3MgYW5kIGVsZW1lbnRzICovXG4gICAgICBfc2FuaXRpemVFbGVtZW50cyhjdXJyZW50Tm9kZSk7XG5cbiAgICAgIC8qIENoZWNrIGF0dHJpYnV0ZXMgbmV4dCAqL1xuICAgICAgX3Nhbml0aXplQXR0cmlidXRlcyhjdXJyZW50Tm9kZSk7XG5cbiAgICAgIC8qIFNoYWRvdyBET00gZGV0ZWN0ZWQsIHNhbml0aXplIGl0ICovXG4gICAgICBpZiAoY3VycmVudE5vZGUuY29udGVudCBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpIHtcbiAgICAgICAgX3Nhbml0aXplU2hhZG93RE9NKGN1cnJlbnROb2RlLmNvbnRlbnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qIElmIHdlIHNhbml0aXplZCBgZGlydHlgIGluLXBsYWNlLCByZXR1cm4gaXQuICovXG4gICAgaWYgKElOX1BMQUNFKSB7XG4gICAgICByZXR1cm4gZGlydHk7XG4gICAgfVxuXG4gICAgLyogUmV0dXJuIHNhbml0aXplZCBzdHJpbmcgb3IgRE9NICovXG4gICAgaWYgKFJFVFVSTl9ET00pIHtcbiAgICAgIGlmIChSRVRVUk5fRE9NX0ZSQUdNRU5UKSB7XG4gICAgICAgIHJldHVybk5vZGUgPSBjcmVhdGVEb2N1bWVudEZyYWdtZW50LmNhbGwoYm9keS5vd25lckRvY3VtZW50KTtcblxuICAgICAgICB3aGlsZSAoYm9keS5maXJzdENoaWxkKSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vcHJlZmVyLWRvbS1ub2RlLWFwcGVuZFxuICAgICAgICAgIHJldHVybk5vZGUuYXBwZW5kQ2hpbGQoYm9keS5maXJzdENoaWxkKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuTm9kZSA9IGJvZHk7XG4gICAgICB9XG5cbiAgICAgIGlmIChBTExPV0VEX0FUVFIuc2hhZG93cm9vdCB8fCBBTExPV0VEX0FUVFIuc2hhZG93cm9vdG1vZGUpIHtcbiAgICAgICAgLypcbiAgICAgICAgICBBZG9wdE5vZGUoKSBpcyBub3QgdXNlZCBiZWNhdXNlIGludGVybmFsIHN0YXRlIGlzIG5vdCByZXNldFxuICAgICAgICAgIChlLmcuIHRoZSBwYXN0IG5hbWVzIG1hcCBvZiBhIEhUTUxGb3JtRWxlbWVudCksIHRoaXMgaXMgc2FmZVxuICAgICAgICAgIGluIHRoZW9yeSBidXQgd2Ugd291bGQgcmF0aGVyIG5vdCByaXNrIGFub3RoZXIgYXR0YWNrIHZlY3Rvci5cbiAgICAgICAgICBUaGUgc3RhdGUgdGhhdCBpcyBjbG9uZWQgYnkgaW1wb3J0Tm9kZSgpIGlzIGV4cGxpY2l0bHkgZGVmaW5lZFxuICAgICAgICAgIGJ5IHRoZSBzcGVjcy5cbiAgICAgICAgKi9cbiAgICAgICAgcmV0dXJuTm9kZSA9IGltcG9ydE5vZGUuY2FsbChvcmlnaW5hbERvY3VtZW50LCByZXR1cm5Ob2RlLCB0cnVlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJldHVybk5vZGU7XG4gICAgfVxuXG4gICAgbGV0IHNlcmlhbGl6ZWRIVE1MID0gV0hPTEVfRE9DVU1FTlQgPyBib2R5Lm91dGVySFRNTCA6IGJvZHkuaW5uZXJIVE1MO1xuXG4gICAgLyogU2VyaWFsaXplIGRvY3R5cGUgaWYgYWxsb3dlZCAqL1xuICAgIGlmIChcbiAgICAgIFdIT0xFX0RPQ1VNRU5UICYmXG4gICAgICBBTExPV0VEX1RBR1NbJyFkb2N0eXBlJ10gJiZcbiAgICAgIGJvZHkub3duZXJEb2N1bWVudCAmJlxuICAgICAgYm9keS5vd25lckRvY3VtZW50LmRvY3R5cGUgJiZcbiAgICAgIGJvZHkub3duZXJEb2N1bWVudC5kb2N0eXBlLm5hbWUgJiZcbiAgICAgIHJlZ0V4cFRlc3QoRVhQUkVTU0lPTlMuRE9DVFlQRV9OQU1FLCBib2R5Lm93bmVyRG9jdW1lbnQuZG9jdHlwZS5uYW1lKVxuICAgICkge1xuICAgICAgc2VyaWFsaXplZEhUTUwgPVxuICAgICAgICAnPCFET0NUWVBFICcgKyBib2R5Lm93bmVyRG9jdW1lbnQuZG9jdHlwZS5uYW1lICsgJz5cXG4nICsgc2VyaWFsaXplZEhUTUw7XG4gICAgfVxuXG4gICAgLyogU2FuaXRpemUgZmluYWwgc3RyaW5nIHRlbXBsYXRlLXNhZmUgKi9cbiAgICBpZiAoU0FGRV9GT1JfVEVNUExBVEVTKSB7XG4gICAgICBhcnJheUZvckVhY2goW01VU1RBQ0hFX0VYUFIsIEVSQl9FWFBSLCBUTVBMSVRfRVhQUl0sIChleHByOiBSZWdFeHApID0+IHtcbiAgICAgICAgc2VyaWFsaXplZEhUTUwgPSBzdHJpbmdSZXBsYWNlKHNlcmlhbGl6ZWRIVE1MLCBleHByLCAnICcpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydXN0ZWRUeXBlc1BvbGljeSAmJiBSRVRVUk5fVFJVU1RFRF9UWVBFXG4gICAgICA/IHRydXN0ZWRUeXBlc1BvbGljeS5jcmVhdGVIVE1MKHNlcmlhbGl6ZWRIVE1MKVxuICAgICAgOiBzZXJpYWxpemVkSFRNTDtcbiAgfTtcblxuICBET01QdXJpZnkuc2V0Q29uZmlnID0gZnVuY3Rpb24gKGNmZyA9IHt9KSB7XG4gICAgX3BhcnNlQ29uZmlnKGNmZyk7XG4gICAgU0VUX0NPTkZJRyA9IHRydWU7XG4gIH07XG5cbiAgRE9NUHVyaWZ5LmNsZWFyQ29uZmlnID0gZnVuY3Rpb24gKCkge1xuICAgIENPTkZJRyA9IG51bGw7XG4gICAgU0VUX0NPTkZJRyA9IGZhbHNlO1xuICB9O1xuXG4gIERPTVB1cmlmeS5pc1ZhbGlkQXR0cmlidXRlID0gZnVuY3Rpb24gKHRhZywgYXR0ciwgdmFsdWUpIHtcbiAgICAvKiBJbml0aWFsaXplIHNoYXJlZCBjb25maWcgdmFycyBpZiBuZWNlc3NhcnkuICovXG4gICAgaWYgKCFDT05GSUcpIHtcbiAgICAgIF9wYXJzZUNvbmZpZyh7fSk7XG4gICAgfVxuXG4gICAgY29uc3QgbGNUYWcgPSB0cmFuc2Zvcm1DYXNlRnVuYyh0YWcpO1xuICAgIGNvbnN0IGxjTmFtZSA9IHRyYW5zZm9ybUNhc2VGdW5jKGF0dHIpO1xuICAgIHJldHVybiBfaXNWYWxpZEF0dHJpYnV0ZShsY1RhZywgbGNOYW1lLCB2YWx1ZSk7XG4gIH07XG5cbiAgRE9NUHVyaWZ5LmFkZEhvb2sgPSBmdW5jdGlvbiAoXG4gICAgZW50cnlQb2ludDoga2V5b2YgSG9va3NNYXAsXG4gICAgaG9va0Z1bmN0aW9uOiBIb29rRnVuY3Rpb25cbiAgKSB7XG4gICAgaWYgKHR5cGVvZiBob29rRnVuY3Rpb24gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhcnJheVB1c2goaG9va3NbZW50cnlQb2ludF0sIGhvb2tGdW5jdGlvbik7XG4gIH07XG5cbiAgRE9NUHVyaWZ5LnJlbW92ZUhvb2sgPSBmdW5jdGlvbiAoXG4gICAgZW50cnlQb2ludDoga2V5b2YgSG9va3NNYXAsXG4gICAgaG9va0Z1bmN0aW9uOiBIb29rRnVuY3Rpb25cbiAgKSB7XG4gICAgaWYgKGhvb2tGdW5jdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBpbmRleCA9IGFycmF5TGFzdEluZGV4T2YoaG9va3NbZW50cnlQb2ludF0sIGhvb2tGdW5jdGlvbik7XG5cbiAgICAgIHJldHVybiBpbmRleCA9PT0gLTFcbiAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgOiBhcnJheVNwbGljZShob29rc1tlbnRyeVBvaW50XSwgaW5kZXgsIDEpWzBdO1xuICAgIH1cblxuICAgIHJldHVybiBhcnJheVBvcChob29rc1tlbnRyeVBvaW50XSk7XG4gIH07XG5cbiAgRE9NUHVyaWZ5LnJlbW92ZUhvb2tzID0gZnVuY3Rpb24gKGVudHJ5UG9pbnQ6IGtleW9mIEhvb2tzTWFwKSB7XG4gICAgaG9va3NbZW50cnlQb2ludF0gPSBbXTtcbiAgfTtcblxuICBET01QdXJpZnkucmVtb3ZlQWxsSG9va3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgaG9va3MgPSBfY3JlYXRlSG9va3NNYXAoKTtcbiAgfTtcblxuICByZXR1cm4gRE9NUHVyaWZ5O1xufVxuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVET01QdXJpZnkoKTtcblxuZXhwb3J0IGludGVyZmFjZSBET01QdXJpZnkge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIERPTVB1cmlmeSBpbnN0YW5jZSB1c2luZyB0aGUgZ2l2ZW4gd2luZG93LWxpa2Ugb2JqZWN0LiBEZWZhdWx0cyB0byBgd2luZG93YC5cbiAgICovXG4gIChyb290PzogV2luZG93TGlrZSk6IERPTVB1cmlmeTtcblxuICAvKipcbiAgICogVmVyc2lvbiBsYWJlbCwgZXhwb3NlZCBmb3IgZWFzaWVyIGNoZWNrc1xuICAgKiBpZiBET01QdXJpZnkgaXMgdXAgdG8gZGF0ZSBvciBub3RcbiAgICovXG4gIHZlcnNpb246IHN0cmluZztcblxuICAvKipcbiAgICogQXJyYXkgb2YgZWxlbWVudHMgdGhhdCBET01QdXJpZnkgcmVtb3ZlZCBkdXJpbmcgc2FuaXRhdGlvbi5cbiAgICogRW1wdHkgaWYgbm90aGluZyB3YXMgcmVtb3ZlZC5cbiAgICovXG4gIHJlbW92ZWQ6IEFycmF5PFJlbW92ZWRFbGVtZW50IHwgUmVtb3ZlZEF0dHJpYnV0ZT47XG5cbiAgLyoqXG4gICAqIEV4cG9zZSB3aGV0aGVyIHRoaXMgYnJvd3NlciBzdXBwb3J0cyBydW5uaW5nIHRoZSBmdWxsIERPTVB1cmlmeS5cbiAgICovXG4gIGlzU3VwcG9ydGVkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGNvbmZpZ3VyYXRpb24gb25jZS5cbiAgICpcbiAgICogQHBhcmFtIGNmZyBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgKi9cbiAgc2V0Q29uZmlnKGNmZz86IENvbmZpZyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgdGhlIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBjbGVhckNvbmZpZygpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBQcm92aWRlcyBjb3JlIHNhbml0YXRpb24gZnVuY3Rpb25hbGl0eS5cbiAgICpcbiAgICogQHBhcmFtIGRpcnR5IHN0cmluZyBvciBET00gbm9kZVxuICAgKiBAcGFyYW0gY2ZnIG9iamVjdFxuICAgKiBAcmV0dXJucyBTYW5pdGl6ZWQgVHJ1c3RlZEhUTUwuXG4gICAqL1xuICBzYW5pdGl6ZShcbiAgICBkaXJ0eTogc3RyaW5nIHwgTm9kZSxcbiAgICBjZmc6IENvbmZpZyAmIHsgUkVUVVJOX1RSVVNURURfVFlQRTogdHJ1ZSB9XG4gICk6IFRydXN0ZWRIVE1MO1xuXG4gIC8qKlxuICAgKiBQcm92aWRlcyBjb3JlIHNhbml0YXRpb24gZnVuY3Rpb25hbGl0eS5cbiAgICpcbiAgICogQHBhcmFtIGRpcnR5IERPTSBub2RlXG4gICAqIEBwYXJhbSBjZmcgb2JqZWN0XG4gICAqIEByZXR1cm5zIFNhbml0aXplZCBET00gbm9kZS5cbiAgICovXG4gIHNhbml0aXplKGRpcnR5OiBOb2RlLCBjZmc6IENvbmZpZyAmIHsgSU5fUExBQ0U6IHRydWUgfSk6IE5vZGU7XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVzIGNvcmUgc2FuaXRhdGlvbiBmdW5jdGlvbmFsaXR5LlxuICAgKlxuICAgKiBAcGFyYW0gZGlydHkgc3RyaW5nIG9yIERPTSBub2RlXG4gICAqIEBwYXJhbSBjZmcgb2JqZWN0XG4gICAqIEByZXR1cm5zIFNhbml0aXplZCBET00gbm9kZS5cbiAgICovXG4gIHNhbml0aXplKGRpcnR5OiBzdHJpbmcgfCBOb2RlLCBjZmc6IENvbmZpZyAmIHsgUkVUVVJOX0RPTTogdHJ1ZSB9KTogTm9kZTtcblxuICAvKipcbiAgICogUHJvdmlkZXMgY29yZSBzYW5pdGF0aW9uIGZ1bmN0aW9uYWxpdHkuXG4gICAqXG4gICAqIEBwYXJhbSBkaXJ0eSBzdHJpbmcgb3IgRE9NIG5vZGVcbiAgICogQHBhcmFtIGNmZyBvYmplY3RcbiAgICogQHJldHVybnMgU2FuaXRpemVkIGRvY3VtZW50IGZyYWdtZW50LlxuICAgKi9cbiAgc2FuaXRpemUoXG4gICAgZGlydHk6IHN0cmluZyB8IE5vZGUsXG4gICAgY2ZnOiBDb25maWcgJiB7IFJFVFVSTl9ET01fRlJBR01FTlQ6IHRydWUgfVxuICApOiBEb2N1bWVudEZyYWdtZW50O1xuXG4gIC8qKlxuICAgKiBQcm92aWRlcyBjb3JlIHNhbml0YXRpb24gZnVuY3Rpb25hbGl0eS5cbiAgICpcbiAgICogQHBhcmFtIGRpcnR5IHN0cmluZyBvciBET00gbm9kZVxuICAgKiBAcGFyYW0gY2ZnIG9iamVjdFxuICAgKiBAcmV0dXJucyBTYW5pdGl6ZWQgc3RyaW5nLlxuICAgKi9cbiAgc2FuaXRpemUoZGlydHk6IHN0cmluZyB8IE5vZGUsIGNmZz86IENvbmZpZyk6IHN0cmluZztcblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGFuIGF0dHJpYnV0ZSB2YWx1ZSBpcyB2YWxpZC5cbiAgICogVXNlcyBsYXN0IHNldCBjb25maWcsIGlmIGFueS4gT3RoZXJ3aXNlLCB1c2VzIGNvbmZpZyBkZWZhdWx0cy5cbiAgICpcbiAgICogQHBhcmFtIHRhZyBUYWcgbmFtZSBvZiBjb250YWluaW5nIGVsZW1lbnQuXG4gICAqIEBwYXJhbSBhdHRyIEF0dHJpYnV0ZSBuYW1lLlxuICAgKiBAcGFyYW0gdmFsdWUgQXR0cmlidXRlIHZhbHVlLlxuICAgKiBAcmV0dXJucyBSZXR1cm5zIHRydWUgaWYgYHZhbHVlYCBpcyB2YWxpZC4gT3RoZXJ3aXNlLCByZXR1cm5zIGZhbHNlLlxuICAgKi9cbiAgaXNWYWxpZEF0dHJpYnV0ZSh0YWc6IHN0cmluZywgYXR0cjogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQWRkcyBhIERPTVB1cmlmeSBob29rLlxuICAgKlxuICAgKiBAcGFyYW0gZW50cnlQb2ludCBlbnRyeSBwb2ludCBmb3IgdGhlIGhvb2sgdG8gYWRkXG4gICAqIEBwYXJhbSBob29rRnVuY3Rpb24gZnVuY3Rpb24gdG8gZXhlY3V0ZVxuICAgKi9cbiAgYWRkSG9vayhlbnRyeVBvaW50OiBCYXNpY0hvb2tOYW1lLCBob29rRnVuY3Rpb246IE5vZGVIb29rKTogdm9pZDtcblxuICAvKipcbiAgICogQWRkcyBhIERPTVB1cmlmeSBob29rLlxuICAgKlxuICAgKiBAcGFyYW0gZW50cnlQb2ludCBlbnRyeSBwb2ludCBmb3IgdGhlIGhvb2sgdG8gYWRkXG4gICAqIEBwYXJhbSBob29rRnVuY3Rpb24gZnVuY3Rpb24gdG8gZXhlY3V0ZVxuICAgKi9cbiAgYWRkSG9vayhlbnRyeVBvaW50OiBFbGVtZW50SG9va05hbWUsIGhvb2tGdW5jdGlvbjogRWxlbWVudEhvb2spOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBBZGRzIGEgRE9NUHVyaWZ5IGhvb2suXG4gICAqXG4gICAqIEBwYXJhbSBlbnRyeVBvaW50IGVudHJ5IHBvaW50IGZvciB0aGUgaG9vayB0byBhZGRcbiAgICogQHBhcmFtIGhvb2tGdW5jdGlvbiBmdW5jdGlvbiB0byBleGVjdXRlXG4gICAqL1xuICBhZGRIb29rKFxuICAgIGVudHJ5UG9pbnQ6IERvY3VtZW50RnJhZ21lbnRIb29rTmFtZSxcbiAgICBob29rRnVuY3Rpb246IERvY3VtZW50RnJhZ21lbnRIb29rXG4gICk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBET01QdXJpZnkgaG9vay5cbiAgICpcbiAgICogQHBhcmFtIGVudHJ5UG9pbnQgZW50cnkgcG9pbnQgZm9yIHRoZSBob29rIHRvIGFkZFxuICAgKiBAcGFyYW0gaG9va0Z1bmN0aW9uIGZ1bmN0aW9uIHRvIGV4ZWN1dGVcbiAgICovXG4gIGFkZEhvb2soXG4gICAgZW50cnlQb2ludDogJ3Vwb25TYW5pdGl6ZUVsZW1lbnQnLFxuICAgIGhvb2tGdW5jdGlvbjogVXBvblNhbml0aXplRWxlbWVudEhvb2tcbiAgKTogdm9pZDtcblxuICAvKipcbiAgICogQWRkcyBhIERPTVB1cmlmeSBob29rLlxuICAgKlxuICAgKiBAcGFyYW0gZW50cnlQb2ludCBlbnRyeSBwb2ludCBmb3IgdGhlIGhvb2sgdG8gYWRkXG4gICAqIEBwYXJhbSBob29rRnVuY3Rpb24gZnVuY3Rpb24gdG8gZXhlY3V0ZVxuICAgKi9cbiAgYWRkSG9vayhcbiAgICBlbnRyeVBvaW50OiAndXBvblNhbml0aXplQXR0cmlidXRlJyxcbiAgICBob29rRnVuY3Rpb246IFVwb25TYW5pdGl6ZUF0dHJpYnV0ZUhvb2tcbiAgKTogdm9pZDtcblxuICAvKipcbiAgICogUmVtb3ZlIGEgRE9NUHVyaWZ5IGhvb2sgYXQgYSBnaXZlbiBlbnRyeVBvaW50XG4gICAqIChwb3BzIGl0IGZyb20gdGhlIHN0YWNrIG9mIGhvb2tzIGlmIGhvb2sgbm90IHNwZWNpZmllZClcbiAgICpcbiAgICogQHBhcmFtIGVudHJ5UG9pbnQgZW50cnkgcG9pbnQgZm9yIHRoZSBob29rIHRvIHJlbW92ZVxuICAgKiBAcGFyYW0gaG9va0Z1bmN0aW9uIG9wdGlvbmFsIHNwZWNpZmljIGhvb2sgdG8gcmVtb3ZlXG4gICAqIEByZXR1cm5zIHJlbW92ZWQgaG9va1xuICAgKi9cbiAgcmVtb3ZlSG9vayhcbiAgICBlbnRyeVBvaW50OiBCYXNpY0hvb2tOYW1lLFxuICAgIGhvb2tGdW5jdGlvbj86IE5vZGVIb29rXG4gICk6IE5vZGVIb29rIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBET01QdXJpZnkgaG9vayBhdCBhIGdpdmVuIGVudHJ5UG9pbnRcbiAgICogKHBvcHMgaXQgZnJvbSB0aGUgc3RhY2sgb2YgaG9va3MgaWYgaG9vayBub3Qgc3BlY2lmaWVkKVxuICAgKlxuICAgKiBAcGFyYW0gZW50cnlQb2ludCBlbnRyeSBwb2ludCBmb3IgdGhlIGhvb2sgdG8gcmVtb3ZlXG4gICAqIEBwYXJhbSBob29rRnVuY3Rpb24gb3B0aW9uYWwgc3BlY2lmaWMgaG9vayB0byByZW1vdmVcbiAgICogQHJldHVybnMgcmVtb3ZlZCBob29rXG4gICAqL1xuICByZW1vdmVIb29rKFxuICAgIGVudHJ5UG9pbnQ6IEVsZW1lbnRIb29rTmFtZSxcbiAgICBob29rRnVuY3Rpb24/OiBFbGVtZW50SG9va1xuICApOiBFbGVtZW50SG9vayB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogUmVtb3ZlIGEgRE9NUHVyaWZ5IGhvb2sgYXQgYSBnaXZlbiBlbnRyeVBvaW50XG4gICAqIChwb3BzIGl0IGZyb20gdGhlIHN0YWNrIG9mIGhvb2tzIGlmIGhvb2sgbm90IHNwZWNpZmllZClcbiAgICpcbiAgICogQHBhcmFtIGVudHJ5UG9pbnQgZW50cnkgcG9pbnQgZm9yIHRoZSBob29rIHRvIHJlbW92ZVxuICAgKiBAcGFyYW0gaG9va0Z1bmN0aW9uIG9wdGlvbmFsIHNwZWNpZmljIGhvb2sgdG8gcmVtb3ZlXG4gICAqIEByZXR1cm5zIHJlbW92ZWQgaG9va1xuICAgKi9cbiAgcmVtb3ZlSG9vayhcbiAgICBlbnRyeVBvaW50OiBEb2N1bWVudEZyYWdtZW50SG9va05hbWUsXG4gICAgaG9va0Z1bmN0aW9uPzogRG9jdW1lbnRGcmFnbWVudEhvb2tcbiAgKTogRG9jdW1lbnRGcmFnbWVudEhvb2sgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIERPTVB1cmlmeSBob29rIGF0IGEgZ2l2ZW4gZW50cnlQb2ludFxuICAgKiAocG9wcyBpdCBmcm9tIHRoZSBzdGFjayBvZiBob29rcyBpZiBob29rIG5vdCBzcGVjaWZpZWQpXG4gICAqXG4gICAqIEBwYXJhbSBlbnRyeVBvaW50IGVudHJ5IHBvaW50IGZvciB0aGUgaG9vayB0byByZW1vdmVcbiAgICogQHBhcmFtIGhvb2tGdW5jdGlvbiBvcHRpb25hbCBzcGVjaWZpYyBob29rIHRvIHJlbW92ZVxuICAgKiBAcmV0dXJucyByZW1vdmVkIGhvb2tcbiAgICovXG4gIHJlbW92ZUhvb2soXG4gICAgZW50cnlQb2ludDogJ3Vwb25TYW5pdGl6ZUVsZW1lbnQnLFxuICAgIGhvb2tGdW5jdGlvbj86IFVwb25TYW5pdGl6ZUVsZW1lbnRIb29rXG4gICk6IFVwb25TYW5pdGl6ZUVsZW1lbnRIb29rIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBET01QdXJpZnkgaG9vayBhdCBhIGdpdmVuIGVudHJ5UG9pbnRcbiAgICogKHBvcHMgaXQgZnJvbSB0aGUgc3RhY2sgb2YgaG9va3MgaWYgaG9vayBub3Qgc3BlY2lmaWVkKVxuICAgKlxuICAgKiBAcGFyYW0gZW50cnlQb2ludCBlbnRyeSBwb2ludCBmb3IgdGhlIGhvb2sgdG8gcmVtb3ZlXG4gICAqIEBwYXJhbSBob29rRnVuY3Rpb24gb3B0aW9uYWwgc3BlY2lmaWMgaG9vayB0byByZW1vdmVcbiAgICogQHJldHVybnMgcmVtb3ZlZCBob29rXG4gICAqL1xuICByZW1vdmVIb29rKFxuICAgIGVudHJ5UG9pbnQ6ICd1cG9uU2FuaXRpemVBdHRyaWJ1dGUnLFxuICAgIGhvb2tGdW5jdGlvbj86IFVwb25TYW5pdGl6ZUF0dHJpYnV0ZUhvb2tcbiAgKTogVXBvblNhbml0aXplQXR0cmlidXRlSG9vayB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogUmVtb3ZlcyBhbGwgRE9NUHVyaWZ5IGhvb2tzIGF0IGEgZ2l2ZW4gZW50cnlQb2ludFxuICAgKlxuICAgKiBAcGFyYW0gZW50cnlQb2ludCBlbnRyeSBwb2ludCBmb3IgdGhlIGhvb2tzIHRvIHJlbW92ZVxuICAgKi9cbiAgcmVtb3ZlSG9va3MoZW50cnlQb2ludDogSG9va05hbWUpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFsbCBET01QdXJpZnkgaG9va3MuXG4gICAqL1xuICByZW1vdmVBbGxIb29rcygpOiB2b2lkO1xufVxuXG4vKipcbiAqIEFuIGVsZW1lbnQgcmVtb3ZlZCBieSBET01QdXJpZnkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVtb3ZlZEVsZW1lbnQge1xuICAvKipcbiAgICogVGhlIGVsZW1lbnQgdGhhdCB3YXMgcmVtb3ZlZC5cbiAgICovXG4gIGVsZW1lbnQ6IE5vZGU7XG59XG5cbi8qKlxuICogQW4gZWxlbWVudCByZW1vdmVkIGJ5IERPTVB1cmlmeS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZW1vdmVkQXR0cmlidXRlIHtcbiAgLyoqXG4gICAqIFRoZSBhdHRyaWJ1dGUgdGhhdCB3YXMgcmVtb3ZlZC5cbiAgICovXG4gIGF0dHJpYnV0ZTogQXR0ciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBlbGVtZW50IHRoYXQgdGhlIGF0dHJpYnV0ZSB3YXMgcmVtb3ZlZC5cbiAgICovXG4gIGZyb206IE5vZGU7XG59XG5cbnR5cGUgQmFzaWNIb29rTmFtZSA9XG4gIHwgJ2JlZm9yZVNhbml0aXplRWxlbWVudHMnXG4gIHwgJ2FmdGVyU2FuaXRpemVFbGVtZW50cydcbiAgfCAndXBvblNhbml0aXplU2hhZG93Tm9kZSc7XG50eXBlIEVsZW1lbnRIb29rTmFtZSA9ICdiZWZvcmVTYW5pdGl6ZUF0dHJpYnV0ZXMnIHwgJ2FmdGVyU2FuaXRpemVBdHRyaWJ1dGVzJztcbnR5cGUgRG9jdW1lbnRGcmFnbWVudEhvb2tOYW1lID1cbiAgfCAnYmVmb3JlU2FuaXRpemVTaGFkb3dET00nXG4gIHwgJ2FmdGVyU2FuaXRpemVTaGFkb3dET00nO1xudHlwZSBVcG9uU2FuaXRpemVFbGVtZW50SG9va05hbWUgPSAndXBvblNhbml0aXplRWxlbWVudCc7XG50eXBlIFVwb25TYW5pdGl6ZUF0dHJpYnV0ZUhvb2tOYW1lID0gJ3Vwb25TYW5pdGl6ZUF0dHJpYnV0ZSc7XG5cbmludGVyZmFjZSBIb29rc01hcCB7XG4gIGJlZm9yZVNhbml0aXplRWxlbWVudHM6IE5vZGVIb29rW107XG4gIGFmdGVyU2FuaXRpemVFbGVtZW50czogTm9kZUhvb2tbXTtcbiAgYmVmb3JlU2FuaXRpemVTaGFkb3dET006IERvY3VtZW50RnJhZ21lbnRIb29rW107XG4gIHVwb25TYW5pdGl6ZVNoYWRvd05vZGU6IE5vZGVIb29rW107XG4gIGFmdGVyU2FuaXRpemVTaGFkb3dET006IERvY3VtZW50RnJhZ21lbnRIb29rW107XG4gIGJlZm9yZVNhbml0aXplQXR0cmlidXRlczogRWxlbWVudEhvb2tbXTtcbiAgYWZ0ZXJTYW5pdGl6ZUF0dHJpYnV0ZXM6IEVsZW1lbnRIb29rW107XG4gIHVwb25TYW5pdGl6ZUVsZW1lbnQ6IFVwb25TYW5pdGl6ZUVsZW1lbnRIb29rW107XG4gIHVwb25TYW5pdGl6ZUF0dHJpYnV0ZTogVXBvblNhbml0aXplQXR0cmlidXRlSG9va1tdO1xufVxuXG50eXBlIEFycmF5RWxlbWVudDxUPiA9IFQgZXh0ZW5kcyBBcnJheTxpbmZlciBVPiA/IFUgOiBuZXZlcjtcblxudHlwZSBIb29rRnVuY3Rpb24gPSBBcnJheUVsZW1lbnQ8SG9va3NNYXBba2V5b2YgSG9va3NNYXBdPjtcblxuZXhwb3J0IHR5cGUgSG9va05hbWUgPVxuICB8IEJhc2ljSG9va05hbWVcbiAgfCBFbGVtZW50SG9va05hbWVcbiAgfCBEb2N1bWVudEZyYWdtZW50SG9va05hbWVcbiAgfCBVcG9uU2FuaXRpemVFbGVtZW50SG9va05hbWVcbiAgfCBVcG9uU2FuaXRpemVBdHRyaWJ1dGVIb29rTmFtZTtcblxuZXhwb3J0IHR5cGUgTm9kZUhvb2sgPSAoXG4gIHRoaXM6IERPTVB1cmlmeSxcbiAgY3VycmVudE5vZGU6IE5vZGUsXG4gIGhvb2tFdmVudDogbnVsbCxcbiAgY29uZmlnOiBDb25maWdcbikgPT4gdm9pZDtcblxuZXhwb3J0IHR5cGUgRWxlbWVudEhvb2sgPSAoXG4gIHRoaXM6IERPTVB1cmlmeSxcbiAgY3VycmVudE5vZGU6IEVsZW1lbnQsXG4gIGhvb2tFdmVudDogbnVsbCxcbiAgY29uZmlnOiBDb25maWdcbikgPT4gdm9pZDtcblxuZXhwb3J0IHR5cGUgRG9jdW1lbnRGcmFnbWVudEhvb2sgPSAoXG4gIHRoaXM6IERPTVB1cmlmeSxcbiAgY3VycmVudE5vZGU6IERvY3VtZW50RnJhZ21lbnQsXG4gIGhvb2tFdmVudDogbnVsbCxcbiAgY29uZmlnOiBDb25maWdcbikgPT4gdm9pZDtcblxuZXhwb3J0IHR5cGUgVXBvblNhbml0aXplRWxlbWVudEhvb2sgPSAoXG4gIHRoaXM6IERPTVB1cmlmeSxcbiAgY3VycmVudE5vZGU6IE5vZGUsXG4gIGhvb2tFdmVudDogVXBvblNhbml0aXplRWxlbWVudEhvb2tFdmVudCxcbiAgY29uZmlnOiBDb25maWdcbikgPT4gdm9pZDtcblxuZXhwb3J0IHR5cGUgVXBvblNhbml0aXplQXR0cmlidXRlSG9vayA9IChcbiAgdGhpczogRE9NUHVyaWZ5LFxuICBjdXJyZW50Tm9kZTogRWxlbWVudCxcbiAgaG9va0V2ZW50OiBVcG9uU2FuaXRpemVBdHRyaWJ1dGVIb29rRXZlbnQsXG4gIGNvbmZpZzogQ29uZmlnXG4pID0+IHZvaWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXBvblNhbml0aXplRWxlbWVudEhvb2tFdmVudCB7XG4gIHRhZ05hbWU6IHN0cmluZztcbiAgYWxsb3dlZFRhZ3M6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVwb25TYW5pdGl6ZUF0dHJpYnV0ZUhvb2tFdmVudCB7XG4gIGF0dHJOYW1lOiBzdHJpbmc7XG4gIGF0dHJWYWx1ZTogc3RyaW5nO1xuICBrZWVwQXR0cjogYm9vbGVhbjtcbiAgYWxsb3dlZEF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+O1xuICBmb3JjZUtlZXBBdHRyOiBib29sZWFuIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEEgYFdpbmRvd2AtbGlrZSBvYmplY3QgY29udGFpbmluZyB0aGUgcHJvcGVydGllcyBhbmQgdHlwZXMgdGhhdCBET01QdXJpZnkgcmVxdWlyZXMuXG4gKi9cbmV4cG9ydCB0eXBlIFdpbmRvd0xpa2UgPSBQaWNrPFxuICB0eXBlb2YgZ2xvYmFsVGhpcyxcbiAgfCAnRG9jdW1lbnRGcmFnbWVudCdcbiAgfCAnSFRNTFRlbXBsYXRlRWxlbWVudCdcbiAgfCAnTm9kZSdcbiAgfCAnRWxlbWVudCdcbiAgfCAnTm9kZUZpbHRlcidcbiAgfCAnTmFtZWROb2RlTWFwJ1xuICB8ICdIVE1MRm9ybUVsZW1lbnQnXG4gIHwgJ0RPTVBhcnNlcidcbj4gJiB7XG4gIGRvY3VtZW50PzogRG9jdW1lbnQ7XG4gIE1vek5hbWVkQXR0ck1hcD86IHR5cGVvZiB3aW5kb3cuTmFtZWROb2RlTWFwO1xufSAmIFBpY2s8VHJ1c3RlZFR5cGVzV2luZG93LCAndHJ1c3RlZFR5cGVzJz47XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9tZXNzYWdlLWRpc3BhdGNoLmpzXG4gKiBDaGF0IG1lc3NhZ2UgZGlzcGF0Y2g6IHNlbmRNZXNzYWdlLCBpbnRha2UgY29uZmlybWF0aW9uIGNhcmQsXG4gKiBwcmlvci1jbGFyaWZpY2F0aW9uIHByZWxvYWQuXG4gKlxuICogREVQRU5ERU5DSUVTIChhbGwgb24gZ2xvYmFsVGhpcyBhdCBydW50aW1lKTpcbiAqICAgLSBwYXJzZU1lc3NhZ2VSZXNwb25zZSAodmFsaWRhdG9ycy5qcylcbiAqICAgLSBzZXRMb2FkaW5nLCBsbG1GZXRjaCAoZmV0Y2gtdXRpbHMuanMpXG4gKiAgIC0gYXBwZW5kTWVzc2FnZSwgYXBwZW5kUmV0cnlNZXNzYWdlLCBhcHBlbmRSYXdIdG1sIChtZXNzYWdlLXF1ZXVlLmpzKVxuICogICAtIG5vcm1hbGl6ZVRleHQsIGVzY2FwZUh0bWwgKHV0aWxzLmpzKVxuICogICAtIGZldGNoU3RhdHVzIChhcGktY2xpZW50LmpzKVxuICogICAtIGFuYWx5emVKb2IgKGpvYi1hbmFseXNpcy5qcylcbiAqICAgLSBzZW5kQWN0aW9uIChzZXNzaW9uLWFjdGlvbnMuanMpXG4gKiAgIC0gc2hvd1RhYmxlQmFzZWRSZXZpZXcgKHJldmlldy10YWJsZS1iYXNlLmpzLCBUaWVyIDQpXG4gKiAgIC0gaGFuZGxlRXhwZXJpZW5jZVJlc3BvbnNlIChleHBlcmllbmNlLXJldmlldy5qcywgVGllciA1KVxuICogICAtIGhhbmRsZVNraWxsc1Jlc3BvbnNlIChza2lsbHMtcmV2aWV3LmpzLCBUaWVyIDUpXG4gKiAgIC0gaGFuZGxlUXVlc3Rpb25SZXNwb25zZSAocXVlc3Rpb25zLXBhbmVsLmpzKVxuICogICAtIGV4dHJhY3RGaXJzdEpzb25PYmplY3QsIGhhbmRsZUN1c3RvbWl6YXRpb25SZXNwb25zZSAoYXBwLmpzIG9yY2hlc3RyYXRvcilcbiAqICAgLSBzdGF0ZU1hbmFnZXIgKHN0YXRlLW1hbmFnZXIuanMgXHUyMDE0IGlzTG9hZGluZygpKVxuICogICAtIHF1ZXN0aW9uQW5zd2VycywgcGVuZGluZ1JlY29tbWVuZGF0aW9ucyAod2luZG93IGdsb2JhbHMpXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdtZXNzYWdlLWRpc3BhdGNoJyk7XG5cbmltcG9ydCB7IHN0YXRlTWFuYWdlciB9IGZyb20gJy4vc3RhdGUtbWFuYWdlci5qcyc7XG5pbXBvcnQgeyBnZXRTZXNzaW9uSWRGcm9tVVJMIH0gZnJvbSAnLi9hcGktY2xpZW50LmpzJztcblxubGV0IF9wZW5kaW5nUG9zdEludGFrZUNvbnRpbnVhdGlvbiA9IG51bGw7XG5jb25zdCBSRVRSWV9QT0xJQ1lfU1RPUkFHRV9LRVkgPSAnY3YtYnVpbGRlci1yZXRyeS1wb2xpY3knO1xubGV0IF9yZXRyeUF0dGVtcHRDb3VudCA9IDA7XG5sZXQgX3JldHJ5VGltZXIgPSBudWxsO1xubGV0IF9yZXRyeUludGVydmFsID0gbnVsbDtcblxuZnVuY3Rpb24gX2NsZWFyUmV0cnlUaW1lcnMoKSB7XG4gIGlmIChfcmV0cnlUaW1lcikge1xuICAgIGNsZWFyVGltZW91dChfcmV0cnlUaW1lcik7XG4gICAgX3JldHJ5VGltZXIgPSBudWxsO1xuICB9XG4gIGlmIChfcmV0cnlJbnRlcnZhbCkge1xuICAgIGNsZWFySW50ZXJ2YWwoX3JldHJ5SW50ZXJ2YWwpO1xuICAgIF9yZXRyeUludGVydmFsID0gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBfZ2V0UmV0cnlQb2xpY3koKSB7XG4gIGNvbnN0IGRlZmF1bHRzID0ge1xuICAgIGJhc2VNczogMTUwMCxcbiAgICBjYXBNczogNjAwMDAsXG4gICAgbWF4QXR0ZW1wdHM6IDYsXG4gICAgYXV0b1JldHJ5OiB0cnVlLFxuICB9O1xuICB0cnkge1xuICAgIGNvbnN0IHJhdyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFJFVFJZX1BPTElDWV9TVE9SQUdFX0tFWSk7XG4gICAgaWYgKCFyYXcpIHJldHVybiBkZWZhdWx0cztcbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHJhdyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGJhc2VNczogTWF0aC5tYXgoMjAwLCBOdW1iZXIocGFyc2VkLmJhc2VNcyB8fCBkZWZhdWx0cy5iYXNlTXMpKSxcbiAgICAgIGNhcE1zOiBNYXRoLm1heCgxMDAwLCBOdW1iZXIocGFyc2VkLmNhcE1zIHx8IGRlZmF1bHRzLmNhcE1zKSksXG4gICAgICBtYXhBdHRlbXB0czogTWF0aC5tYXgoMSwgTnVtYmVyKHBhcnNlZC5tYXhBdHRlbXB0cyB8fCBkZWZhdWx0cy5tYXhBdHRlbXB0cykpLFxuICAgICAgYXV0b1JldHJ5OiBwYXJzZWQuYXV0b1JldHJ5ICE9PSBmYWxzZSxcbiAgICB9O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZGVmYXVsdHM7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2NhbGN1bGF0ZVJldHJ5RGVsYXlNcyhraW5kLCBlcnJvcikge1xuICBjb25zdCBwb2xpY3kgPSBfZ2V0UmV0cnlQb2xpY3koKTtcbiAgY29uc3QgZXhwID0gTWF0aC5taW4ocG9saWN5LmNhcE1zLCBwb2xpY3kuYmFzZU1zICogKDIgKiogX3JldHJ5QXR0ZW1wdENvdW50KSk7XG4gIGNvbnN0IGppdHRlciA9IE1hdGgucm91bmQoZXhwICogKDAuMSArIE1hdGgucmFuZG9tKCkgKiAwLjE1KSk7XG4gIGxldCBkZWxheU1zID0gTWF0aC5taW4ocG9saWN5LmNhcE1zLCBleHAgKyBqaXR0ZXIpO1xuXG4gIGlmIChraW5kID09PSAncmF0ZS1saW1pdGVkJykge1xuICAgIGNvbnN0IHJldHJ5QWZ0ZXJTZWMgPSBOdW1iZXIoZXJyb3I/LnJldHJ5QWZ0ZXJTZWMgfHwgMCk7XG4gICAgaWYgKHJldHJ5QWZ0ZXJTZWMgPiAwKSB7XG4gICAgICBkZWxheU1zID0gTWF0aC5tYXgoZGVsYXlNcywgcmV0cnlBZnRlclNlYyAqIDEwMDApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGVsYXlNcztcbn1cblxuZnVuY3Rpb24gX3NjaGVkdWxlUmV0cnkodGV4dCwgZGVyaXZlZCwgZXJyb3IpIHtcbiAgX2NsZWFyUmV0cnlUaW1lcnMoKTtcbiAgY29uc3QgcG9saWN5ID0gX2dldFJldHJ5UG9saWN5KCk7XG5cbiAgLy8gQ2xpZW50IGVycm9ycyAoNHh4KSBhbmQgYXV0aCBmYWlsdXJlcyBhcmUgbm90IHRyYW5zaWVudDsgZG8gbm90IGF1dG8tcmV0cnkuXG4gIGNvbnN0IE5PTl9SRVRSWUFCTEUgPSBuZXcgU2V0KFsnY2xpZW50LWVycm9yJywgJ2F1dGgtcmVxdWlyZWQnXSk7XG4gIGNvbnN0IGNhbkF1dG9SZXRyeSA9IHBvbGljeS5hdXRvUmV0cnlcbiAgICAmJiBfcmV0cnlBdHRlbXB0Q291bnQgPCBwb2xpY3kubWF4QXR0ZW1wdHNcbiAgICAmJiAhTk9OX1JFVFJZQUJMRS5oYXMoZGVyaXZlZC5raW5kKTtcblxuICBjb25zdCBkZWxheU1zID0gX2NhbGN1bGF0ZVJldHJ5RGVsYXlNcyhkZXJpdmVkLmtpbmQsIGVycm9yKTtcbiAgY29uc3QgdG90YWxTZWNvbmRzID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKGRlbGF5TXMgLyAxMDAwKSk7XG5cbiAgY29uc3QgcmV0cnlBY3Rpb24gPSAoKSA9PiB7XG4gICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWVzc2FnZS1pbnB1dCcpO1xuICAgIGlmIChpbnB1dCkgaW5wdXQudmFsdWUgPSB0ZXh0O1xuICAgIHNlbmRNZXNzYWdlKCk7XG4gIH07XG5cbiAgbGV0IHJldHJ5TWVzc2FnZTtcbiAgY29uc3QgY2FuY2VsRm4gPSBjYW5BdXRvUmV0cnkgPyAoKSA9PiB7XG4gICAgX2NsZWFyUmV0cnlUaW1lcnMoKTtcbiAgICBpZiAocmV0cnlNZXNzYWdlKSByZXRyeU1lc3NhZ2UucmVtb3ZlKCk7XG4gIH0gOiBudWxsO1xuXG4gIHJldHJ5TWVzc2FnZSA9IGFwcGVuZFJldHJ5TWVzc2FnZShcbiAgICBgXHUyNkEwXHVGRTBGICR7ZXJyb3IubWVzc2FnZX1gLFxuICAgICgpID0+IHtcbiAgICAgIF9jbGVhclJldHJ5VGltZXJzKCk7XG4gICAgICBfcmV0cnlBdHRlbXB0Q291bnQgKz0gMTtcbiAgICAgIHJldHJ5QWN0aW9uKCk7XG4gICAgfSxcbiAgICBjYW5BdXRvUmV0cnkgPyBgUmV0cnkgaW4gJHt0b3RhbFNlY29uZHN9c2AgOiAnUmV0cnknLFxuICAgIGNhbmNlbEZuLFxuICApO1xuXG4gIGlmICghY2FuQXV0b1JldHJ5KSByZXR1cm47XG5cbiAgY29uc3QgcmV0cnlCdG4gPSByZXRyeU1lc3NhZ2U/LnF1ZXJ5U2VsZWN0b3IoJ2J1dHRvbicpO1xuICBsZXQgcmVtYWluaW5nID0gdG90YWxTZWNvbmRzO1xuICBpZiAocmV0cnlCdG4pIHtcbiAgICByZXRyeUJ0bi50ZXh0Q29udGVudCA9IGBSZXRyeSBpbiAke3JlbWFpbmluZ31zYDtcbiAgICBpZiAoZGVyaXZlZC5raW5kID09PSAncmF0ZS1saW1pdGVkJykge1xuICAgICAgcmV0cnlCdG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgcmV0cnlCdG4uc3R5bGUub3BhY2l0eSA9ICcwLjcnO1xuICAgICAgcmV0cnlCdG4uc3R5bGUuY3Vyc29yID0gJ25vdC1hbGxvd2VkJztcbiAgICB9XG4gIH1cblxuICBfcmV0cnlJbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICByZW1haW5pbmcgLT0gMTtcbiAgICBpZiAocmV0cnlCdG4gJiYgcmVtYWluaW5nID4gMCkge1xuICAgICAgcmV0cnlCdG4udGV4dENvbnRlbnQgPSBgUmV0cnkgaW4gJHtyZW1haW5pbmd9c2A7XG4gICAgfVxuICAgIGlmIChyZW1haW5pbmcgPD0gMCkge1xuICAgICAgaWYgKHJldHJ5QnRuKSB7XG4gICAgICAgIHJldHJ5QnRuLnRleHRDb250ZW50ID0gJ1JldHJ5IE5vdyc7XG4gICAgICAgIHJldHJ5QnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgIHJldHJ5QnRuLnN0eWxlLm9wYWNpdHkgPSAnJztcbiAgICAgICAgcmV0cnlCdG4uc3R5bGUuY3Vyc29yID0gJyc7XG4gICAgICB9XG4gICAgICBjbGVhckludGVydmFsKF9yZXRyeUludGVydmFsKTtcbiAgICAgIF9yZXRyeUludGVydmFsID0gbnVsbDtcbiAgICB9XG4gIH0sIDEwMDApO1xuXG4gIF9yZXRyeVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgX3JldHJ5VGltZXIgPSBudWxsO1xuICAgIF9yZXRyeUF0dGVtcHRDb3VudCArPSAxO1xuICAgIHJldHJ5TWVzc2FnZT8ucmVtb3ZlKCk7XG4gICAgcmV0cnlBY3Rpb24oKTtcbiAgfSwgZGVsYXlNcyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9wYXJzZUFwaUpzb25SZXNwb25zZShyZXNwb25zZSwgZW5kcG9pbnQpIHtcbiAgY29uc3Qgc3RhdHVzID0gTnVtYmVyKHJlc3BvbnNlPy5zdGF0dXMgfHwgMCk7XG4gIGNvbnN0IHN0YXR1c1RleHQgPSByZXNwb25zZT8uc3RhdHVzVGV4dCB8fCAnVW5rbm93biBTdGF0dXMnO1xuICBjb25zdCBjb250ZW50VHlwZSA9IChyZXNwb25zZT8uaGVhZGVycz8uZ2V0KCdjb250ZW50LXR5cGUnKSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgcmF3ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICBsZXQgZGV0YWlsID0gc3RhdHVzVGV4dDtcbiAgICBpZiAoY29udGVudFR5cGUuaW5jbHVkZXMoJ2FwcGxpY2F0aW9uL2pzb24nKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IEpTT04ucGFyc2UocmF3IHx8ICd7fScpO1xuICAgICAgICBkZXRhaWwgPSBwYXlsb2FkPy5lcnJvciB8fCBwYXlsb2FkPy5tZXNzYWdlIHx8IGRldGFpbDtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBLZWVwIGZhbGxiYWNrIGRldGFpbCBpZiBtYWxmb3JtZWQgSlNPTiBlcnJvciBwYXlsb2FkLlxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoKHJhdyB8fCAnJykudHJpbSgpLnN0YXJ0c1dpdGgoJzwnKSkge1xuICAgICAgZGV0YWlsID0gJ3NlcnZlciByZXR1cm5lZCBIVE1MIGluc3RlYWQgb2YgSlNPTiAocG9zc2libGUgc2Vzc2lvbiByZWRpcmVjdCBvciBiYWNrZW5kIGVycm9yKSc7XG4gICAgfSBlbHNlIGlmICgocmF3IHx8ICcnKS50cmltKCkpIHtcbiAgICAgIGRldGFpbCA9IHJhdy50cmltKCkuc2xpY2UoMCwgMjIwKTtcbiAgICB9XG4gICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoYCR7c3RhdHVzfTogJHtkZXRhaWx9YCk7XG4gICAgZXJyb3Iuc3RhdHVzID0gc3RhdHVzO1xuICAgIGVycm9yLnJldHJ5QWZ0ZXJTZWMgPSBOdW1iZXIocmVzcG9uc2U/LmhlYWRlcnM/LmdldCgncmV0cnktYWZ0ZXInKSB8fCAwKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxuXG4gIGlmICghY29udGVudFR5cGUuaW5jbHVkZXMoJ2FwcGxpY2F0aW9uL2pzb24nKSkge1xuICAgIGNvbnN0IHNuaXBwZXQgPSAocmF3IHx8ICcnKS50cmltKCkuc2xpY2UoMCwgODApO1xuICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihcbiAgICAgIGBFeHBlY3RlZCBKU09OIGZyb20gJHtlbmRwb2ludH0sIGdvdCAke2NvbnRlbnRUeXBlIHx8ICd1bmtub3duIGNvbnRlbnQgdHlwZSd9JHtzbmlwcGV0ID8gYDogJHtzbmlwcGV0fWAgOiAnJ31gLFxuICAgICk7XG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBwYXJzZU1lc3NhZ2VSZXNwb25zZShKU09OLnBhcnNlKHJhdyB8fCAne30nKSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBJbnZhbGlkIEpTT04gZnJvbSAke2VuZHBvaW50fTogJHtlcnJvci5tZXNzYWdlfWApO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9zZXRMaXZlTGxtU3RhdGUoa2luZCwgdGV4dCwgaWNvbiA9ICcnLCB0b29sdGlwID0gJycpIHtcbiAgaWYgKHR5cGVvZiBfdXBkYXRlTGxtU3RhdHVzUGlsbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIF91cGRhdGVMbG1TdGF0dXNQaWxsKGtpbmQsIHRleHQsIGljb24sIHRvb2x0aXApO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9kZXJpdmVFcnJvclN0YXRlKGVycm9yKSB7XG4gIGNvbnN0IG1lc3NhZ2UgPSBTdHJpbmcoZXJyb3I/Lm1lc3NhZ2UgfHwgZXJyb3IgfHwgJ1Vua25vd24gZXJyb3InKTtcbiAgY29uc3QgbG93ZXIgPSBtZXNzYWdlLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IHN0YXR1cyA9IE51bWJlcihlcnJvcj8uc3RhdHVzIHx8IDApO1xuXG4gIGlmIChzdGF0dXMgPT09IDQwMSB8fCBzdGF0dXMgPT09IDQwMyB8fCBtZXNzYWdlLnN0YXJ0c1dpdGgoJzQwMTonKSB8fCBtZXNzYWdlLnN0YXJ0c1dpdGgoJzQwMzonKSB8fCBsb3dlci5pbmNsdWRlcygnYXV0aCcpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtpbmQ6ICdhdXRoLXJlcXVpcmVkJyxcbiAgICAgIHRleHQ6ICdBdXRoZW50aWNhdGlvbiByZXF1aXJlZCcsXG4gICAgICBpY29uOiAnXHVEODNEXHVERDExJyxcbiAgICAgIHRvb2x0aXA6ICdBdXRoZW50aWNhdGlvbiBmYWlsZWQuIENoZWNrIEFQSSBrZXkvdG9rZW4gb3Igc2lnbiBpbiBhZ2Fpbi4nLFxuICAgIH07XG4gIH1cblxuICBpZiAoc3RhdHVzID09PSA0MjkgfHwgbWVzc2FnZS5zdGFydHNXaXRoKCc0Mjk6JykgfHwgbG93ZXIuaW5jbHVkZXMoJ3JhdGUgbGltaXQnKSkge1xuICAgIHJldHVybiB7XG4gICAgICBraW5kOiAncmF0ZS1saW1pdGVkJyxcbiAgICAgIHRleHQ6ICdSYXRlIGxpbWl0ZWQnLFxuICAgICAgaWNvbjogJ1x1MjNGMycsXG4gICAgICB0b29sdGlwOiAnUHJvdmlkZXIgcmF0ZSBsaW1pdCByZWFjaGVkLiBXYWl0IGJyaWVmbHkgYW5kIHJldHJ5LicsXG4gICAgfTtcbiAgfVxuXG4gIGlmIChcbiAgICBzdGF0dXMgPT09IDUwMiB8fFxuICAgIHN0YXR1cyA9PT0gNTAzIHx8XG4gICAgc3RhdHVzID09PSA1MDQgfHxcbiAgICBtZXNzYWdlLnN0YXJ0c1dpdGgoJzUwMjonKSB8fFxuICAgIG1lc3NhZ2Uuc3RhcnRzV2l0aCgnNTAzOicpIHx8XG4gICAgbWVzc2FnZS5zdGFydHNXaXRoKCc1MDQ6JykgfHxcbiAgICBsb3dlci5pbmNsdWRlcygndGltZW91dCcpIHx8XG4gICAgbG93ZXIuaW5jbHVkZXMoJ3VuYXZhaWxhYmxlJykgfHxcbiAgICBsb3dlci5pbmNsdWRlcygnY2Fubm90IHJlYWNoJylcbiAgKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtpbmQ6ICd1bmF2YWlsYWJsZScsXG4gICAgICB0ZXh0OiAnUHJvdmlkZXIgdW5hdmFpbGFibGUnLFxuICAgICAgaWNvbjogJ1x1MjYwMScsXG4gICAgICB0b29sdGlwOiAnUHJvdmlkZXIgaXMgY3VycmVudGx5IHVuYXZhaWxhYmxlIG9yIHVucmVhY2hhYmxlLiBSZXRyeSBzb29uLicsXG4gICAgfTtcbiAgfVxuXG4gIC8vIDR4eCBjbGllbnQgZXJyb3JzIGFyZSBub3QgdHJhbnNpZW50IFx1MjAxNCByZXRyeWluZyB3aWxsIG5vdCBmaXggdGhlbS5cbiAgaWYgKHN0YXR1cyA+PSA0MDAgJiYgc3RhdHVzIDwgNTAwKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtpbmQ6ICdjbGllbnQtZXJyb3InLFxuICAgICAgdGV4dDogJ1JlcXVlc3QgZXJyb3InLFxuICAgICAgaWNvbjogJ1x1MjZBMCcsXG4gICAgICB0b29sdGlwOiBtZXNzYWdlLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGtpbmQ6ICdlcnJvcicsXG4gICAgdGV4dDogJ0Nvbm5lY3Rpb24gZmFpbGVkJyxcbiAgICBpY29uOiAnXHUyNkEwJyxcbiAgICB0b29sdGlwOiBtZXNzYWdlLFxuICB9O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIERlZmF1bHQgTExNIG1lc3NhZ2UgaGFuZGxlclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmFzeW5jIGZ1bmN0aW9uIF9oYW5kbGVMTE1NZXNzYWdlKHRleHQpIHtcbiAgX2NsZWFyUmV0cnlUaW1lcnMoKTtcbiAgc2V0TG9hZGluZyh0cnVlLCAnVGhpbmtpbmdcdTIwMjYnKTtcbiAgX3NldExpdmVMbG1TdGF0ZSgnY29ubmVjdGluZycsICdDb25uZWN0aW5nXHUyMDI2JywgJ1x1MjlENycsICdTZW5kaW5nIHJlcXVlc3QgdG8gcHJvdmlkZXIuJyk7XG4gIGxldCB0ZXJtaW5hbFN0YXRlID0gbnVsbDtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBsbG1GZXRjaCgnL2FwaS9tZXNzYWdlJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgbWVzc2FnZTogdGV4dCB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgX3BhcnNlQXBpSnNvblJlc3BvbnNlKHJlcywgJy9hcGkvbWVzc2FnZScpO1xuXG4gICAgaWYgKGRhdGEuZXJyb3IpIHtcbiAgICAgIGNvbnN0IGVycm9yTXNnID0gZGF0YS5lcnJvci50b1N0cmluZygpO1xuICAgICAgY29uc3QgZGVyaXZlZCA9IF9kZXJpdmVFcnJvclN0YXRlKG5ldyBFcnJvcihlcnJvck1zZykpO1xuICAgICAgX3NldExpdmVMbG1TdGF0ZShkZXJpdmVkLmtpbmQsIGRlcml2ZWQudGV4dCwgZGVyaXZlZC5pY29uLCBkZXJpdmVkLnRvb2x0aXApO1xuICAgICAgX3NjaGVkdWxlUmV0cnkodGV4dCwgZGVyaXZlZCwgbmV3IEVycm9yKGVycm9yTXNnKSk7XG4gICAgICB0ZXJtaW5hbFN0YXRlID0gZGVyaXZlZDtcbiAgICAgIGxvZy5lcnJvcignU2VydmVyIGVycm9yOicsIGRhdGEuZXJyb3IpO1xuICAgIH0gZWxzZSBpZiAoZGF0YS5yZXNwb25zZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY2xlYW5SZXNwb25zZSA9IGRhdGEucmVzcG9uc2U7XG4gICAgICAgIGNvbnN0IHBhcnNlZEN1c3RvbWl6YXRpb24gPSBleHRyYWN0Rmlyc3RKc29uT2JqZWN0KGNsZWFuUmVzcG9uc2UpO1xuICAgICAgICBpZiAocGFyc2VkQ3VzdG9taXphdGlvbiAmJiAocGFyc2VkQ3VzdG9taXphdGlvbi5yZWNvbW1lbmRlZF9leHBlcmllbmNlcyB8fCBwYXJzZWRDdXN0b21pemF0aW9uLnJlY29tbWVuZGVkX3NraWxscykpIHtcbiAgICAgICAgICBjb25zdCBqc29uU3RhcnQgPSBjbGVhblJlc3BvbnNlLmluZGV4T2YoJ3snKTtcbiAgICAgICAgICBjb25zdCB0ZXh0QmVmb3JlSnNvbiA9IGpzb25TdGFydCA+IDAgPyBjbGVhblJlc3BvbnNlLnN1YnN0cmluZygwLCBqc29uU3RhcnQpLnRyaW0oKSA6ICcnO1xuICAgICAgICAgIGlmICh0ZXh0QmVmb3JlSnNvbiAmJiAhdGV4dEJlZm9yZUpzb24uaW5jbHVkZXMoJ3tcImFjdGlvblwiOicpKSB7XG4gICAgICAgICAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCB0ZXh0QmVmb3JlSnNvbik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGF3YWl0IGhhbmRsZUN1c3RvbWl6YXRpb25SZXNwb25zZShwYXJzZWRDdXN0b21pemF0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoY2xlYW5SZXNwb25zZS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgY2xlYW5SZXNwb25zZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nLmVycm9yKCdFcnJvciBwcm9jZXNzaW5nIG1lc3NhZ2UgcmVzcG9uc2U6JywgZXJyLCBkYXRhLnJlc3BvbnNlKTtcbiAgICAgICAgY29uc3QgZGVyaXZlZCA9IF9kZXJpdmVFcnJvclN0YXRlKGVycik7XG4gICAgICAgIF9zZXRMaXZlTGxtU3RhdGUoZGVyaXZlZC5raW5kLCBkZXJpdmVkLnRleHQsIGRlcml2ZWQuaWNvbiwgZGVyaXZlZC50b29sdGlwKTtcbiAgICAgICAgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgYFx1MjZBMFx1RkUwRiBJIGVuY291bnRlcmVkIGFuIGlzc3VlIHByb2Nlc3NpbmcgdGhhdCByZXNwb25zZTogJHtlcnIubWVzc2FnZX0uIFRoZSBjb252ZXJzYXRpb24gaGFzIGJlZW4gc2F2ZWQuYCk7XG4gICAgICAgIHRlcm1pbmFsU3RhdGUgPSBkZXJpdmVkO1xuICAgICAgfVxuICAgICAgY29uc3QgY29ubmVjdGVkU3RhdGUgPSB7IGtpbmQ6ICdjb25uZWN0ZWQnLCB0ZXh0OiAnQ29ubmVjdGVkJywgaWNvbjogJ1x1MjcxMycsIHRvb2x0aXA6ICdQcm92aWRlciByZXNwb25kZWQgc3VjY2Vzc2Z1bGx5IHRvIGEgbGl2ZSByZXF1ZXN0LicgfTtcbiAgICAgIF9zZXRMaXZlTGxtU3RhdGUoY29ubmVjdGVkU3RhdGUua2luZCwgY29ubmVjdGVkU3RhdGUudGV4dCwgY29ubmVjdGVkU3RhdGUuaWNvbiwgY29ubmVjdGVkU3RhdGUudG9vbHRpcCk7XG4gICAgICB0ZXJtaW5hbFN0YXRlID0gY29ubmVjdGVkU3RhdGU7XG4gICAgICBfcmV0cnlBdHRlbXB0Q291bnQgPSAwO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cuZXJyb3IoJz09PSBNRVNTQUdFIEVSUk9SID09PScsIGVycm9yLm5hbWUsIGVycm9yLm1lc3NhZ2UsIGVycm9yLnN0YWNrKTtcbiAgICBpZiAoZXJyb3IubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICAvLyBVc2VyIGNsaWNrZWQgU3RvcCBcdTIwMTQgbWVzc2FnZSBhbHJlYWR5IHNob3duIGJ5IGFib3J0Q3VycmVudFJlcXVlc3QoKS5cbiAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkZXJpdmVkID0gX2Rlcml2ZUVycm9yU3RhdGUoZXJyb3IpO1xuICAgIF9zZXRMaXZlTGxtU3RhdGUoZGVyaXZlZC5raW5kLCBkZXJpdmVkLnRleHQsIGRlcml2ZWQuaWNvbiwgZGVyaXZlZC50b29sdGlwKTtcbiAgICBfc2NoZWR1bGVSZXRyeSh0ZXh0LCBkZXJpdmVkLCBlcnJvcik7XG4gICAgdGVybWluYWxTdGF0ZSA9IGRlcml2ZWQ7XG4gIH1cbiAgc2V0TG9hZGluZyhmYWxzZSk7XG4gIGF3YWl0IGZldGNoU3RhdHVzKCk7XG4gIGlmICh0ZXJtaW5hbFN0YXRlKSB7XG4gICAgX3NldExpdmVMbG1TdGF0ZSh0ZXJtaW5hbFN0YXRlLmtpbmQsIHRlcm1pbmFsU3RhdGUudGV4dCwgdGVybWluYWxTdGF0ZS5pY29uLCB0ZXJtaW5hbFN0YXRlLnRvb2x0aXApO1xuICB9XG4gIGlmICh0eXBlb2YgZmV0Y2hBbmREaXNwbGF5TGxtTG9nID09PSAnZnVuY3Rpb24nKSBmZXRjaEFuZERpc3BsYXlMbG1Mb2coKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBNZXNzYWdlIGRpc3BhdGNoIHRhYmxlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gSGFuZGxlcnMgY2hlY2tlZCBpbiBvcmRlcjsgZmlyc3QgbWF0Y2hpbmcgdGVzdCgpIHdpbnMuXG5jb25zdCBfbWVzc2FnZUhhbmRsZXJzID0gW1xuICB7XG4gICAgdGVzdDogdCA9PiB0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ3JldmlldyByZWNvbW1lbmRhdGlvbnMnKSB8fCB0LnRvTG93ZXJDYXNlKCkgPT09ICdyZXZpZXcnLFxuICAgIGhhbmRsZTogYXN5bmMgKCkgPT4gc2hvd1RhYmxlQmFzZWRSZXZpZXcoKSxcbiAgfSxcbiAge1xuICAgIHRlc3Q6ICgpID0+IHdpbmRvdy53YWl0aW5nRm9yRXhwZXJpZW5jZVJlc3BvbnNlLFxuICAgIGhhbmRsZTogYXN5bmMgdCA9PiBoYW5kbGVFeHBlcmllbmNlUmVzcG9uc2UodCksXG4gIH0sXG4gIHtcbiAgICB0ZXN0OiAoKSA9PiB3aW5kb3cud2FpdGluZ0ZvclNraWxsc1Jlc3BvbnNlLFxuICAgIGhhbmRsZTogYXN5bmMgdCA9PiBoYW5kbGVTa2lsbHNSZXNwb25zZSh0KSxcbiAgfSxcbiAge1xuICAgIC8vIFBvc3QtYW5hbHlzaXMgcXVlc3Rpb24gcmVzcG9uc2UgXHUyMDE0IGxvY2FsIGhhbmRsZXIgKyBiYWNrZW5kIHNhdmUuXG4gICAgdGVzdDogKCkgPT4gd2luZG93LndhaXRpbmdGb3JRdWVzdGlvblJlc3BvbnNlLFxuICAgIGhhbmRsZTogYXN5bmMgdCA9PiB7XG4gICAgICBjb25zdCBxdWVzdGlvbkhhbmRsZWQgPSBoYW5kbGVRdWVzdGlvblJlc3BvbnNlKHQpO1xuICAgICAgc2V0TG9hZGluZyh0cnVlLCAnVGhpbmtpbmdcdTIwMjYnKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGxsbUZldGNoKCcvYXBpL21lc3NhZ2UnLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBtZXNzYWdlOiB0IH0pLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IF9wYXJzZUFwaUpzb25SZXNwb25zZShyZXMsICcvYXBpL21lc3NhZ2UnKTtcbiAgICAgICAgaWYgKGRhdGEuZXJyb3IpIHtcbiAgICAgICAgICBsb2cuZXJyb3IoJ0JhY2tlbmQgZXJyb3Igc2F2aW5nIHF1ZXN0aW9uIHJlc3BvbnNlOicsIGRhdGEuZXJyb3IpO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGEucmVzcG9uc2UgJiYgIXF1ZXN0aW9uSGFuZGxlZCkge1xuICAgICAgICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIGRhdGEucmVzcG9uc2UpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGVyci5uYW1lICE9PSAnQWJvcnRFcnJvcicpIGxvZy5lcnJvcignPT09IFFVRVNUSU9OIFJFU1BPTlNFIFNBVkUgRVJST1IgPT09JywgZXJyKTtcbiAgICAgIH1cbiAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgICAgaWYgKCFxdWVzdGlvbkhhbmRsZWQpIGF3YWl0IF9oYW5kbGVMTE1NZXNzYWdlKHQpO1xuICAgIH0sXG4gIH0sXG4gIHtcbiAgICB0ZXN0OiB0ID0+IHQudG9Mb3dlckNhc2UoKSA9PT0gJ3Byb2NlZWQnLFxuICAgIGhhbmRsZTogYXN5bmMgKCkgPT4gd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnNcbiAgICAgID8gc2hvd1RhYmxlQmFzZWRSZXZpZXcoKVxuICAgICAgOiBzZW5kQWN0aW9uKCdyZWNvbW1lbmRfY3VzdG9taXphdGlvbnMnKSxcbiAgfSxcbiAge1xuICAgIHRlc3Q6ICgpID0+IHRydWUsXG4gICAgaGFuZGxlOiBfaGFuZGxlTExNTWVzc2FnZSxcbiAgfSxcbl07XG5cbmFzeW5jIGZ1bmN0aW9uIHNlbmRNZXNzYWdlKCkge1xuICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZXNzYWdlLWlucHV0Jyk7XG4gIGNvbnN0IHRleHQgPSBub3JtYWxpemVUZXh0KGlucHV0LnZhbHVlKTtcbiAgaWYgKCF0ZXh0IHx8IHN0YXRlTWFuYWdlci5pc0xvYWRpbmcoKSkgcmV0dXJuO1xuXG4gIGlmICghZ2V0U2Vzc2lvbklkRnJvbVVSTCgpKSB7XG4gICAgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgJ1x1MjZBMFx1RkUwRiBObyBhY3RpdmUgc2Vzc2lvbi4gQ3JlYXRlIG9yIGxvYWQgYSBzZXNzaW9uIGJlZm9yZSBzZW5kaW5nIG1lc3NhZ2VzLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGFwcGVuZE1lc3NhZ2UoJ3VzZXInLCB0ZXh0KTtcbiAgaW5wdXQudmFsdWUgPSAnJztcblxuICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgX21lc3NhZ2VIYW5kbGVycykge1xuICAgIGlmIChoYW5kbGVyLnRlc3QodGV4dCkpIHtcbiAgICAgIGF3YWl0IGhhbmRsZXIuaGFuZGxlKHRleHQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEludGFrZSBjb25maXJtYXRpb24gY2FyZCAoR0FQLTIzKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmFzeW5jIGZ1bmN0aW9uIF9zaG93SW50YWtlQ29uZmlybUNhcmQoY29udGludWF0aW9uID0gbnVsbCkge1xuICBpZiAodHlwZW9mIGNvbnRpbnVhdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIF9wZW5kaW5nUG9zdEludGFrZUNvbnRpbnVhdGlvbiA9IGNvbnRpbnVhdGlvbjtcbiAgfVxuXG4gIGxldCBleHRyYWN0ZWQgPSB7cm9sZTogJycsIGNvbXBhbnk6ICcnLCBkYXRlX2FwcGxpZWQ6ICcnfTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgbGxtRmV0Y2goJy9hcGkvaW50YWtlLW1ldGFkYXRhJyk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEuY29uZmlybWVkKSB7XG4gICAgICBhd2FpdCBfcHJvY2VlZEFmdGVySW50YWtlKGNvbnRpbnVhdGlvbik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGV4dHJhY3RlZCA9IGRhdGE7XG4gIH0gY2F0Y2ggKF9lKSB7IC8qIGZhbGwgdGhyb3VnaCB3aXRoIGVtcHR5IGRlZmF1bHRzICovIH1cblxuICBjb25zdCB0b2RheSA9IGV4dHJhY3RlZC5kYXRlX2FwcGxpZWQgfHwgbmV3IERhdGUoKS50b0lTT1N0cmluZygpLnNsaWNlKDAsIDEwKTtcbiAgY29uc3QgY2FyZEh0bWwgPSBgXG4gICAgPGRpdiBjbGFzcz1cImludGFrZS1jb25maXJtLWNhcmRcIiBpZD1cImludGFrZS1jb25maXJtLWNhcmRcIiByb2xlPVwiZm9ybVwiIGFyaWEtbGFiZWw9XCJDb25maXJtIGpvYiBkZXRhaWxzXCI+XG4gICAgICA8aDM+XHVEODNEXHVEQ0NCIENvbmZpcm0gam9iIGRldGFpbHM8L2gzPlxuICAgICAgPHA+UmV2aWV3IHRoZSBleHRyYWN0ZWQgZGV0YWlscyBiZWZvcmUgYW5hbHlzaXMgYmVnaW5zLiBFZGl0IGFueSBmaWVsZCBpZiBuZWVkZWQuPC9wPlxuICAgICAgPGRpdiBjbGFzcz1cImludGFrZS1maWVsZC1yb3dcIj5cbiAgICAgICAgPGxhYmVsIGZvcj1cImludGFrZS1yb2xlLWlucHV0XCI+Um9sZSAvIEpvYiBUaXRsZTwvbGFiZWw+XG4gICAgICAgIDxpbnB1dCBpZD1cImludGFrZS1yb2xlLWlucHV0XCIgdHlwZT1cInRleHRcIiB2YWx1ZT1cIiR7ZXNjYXBlSHRtbChleHRyYWN0ZWQucm9sZSB8fCAnJyl9XCJcbiAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBTZW5pb3IgU29mdHdhcmUgRW5naW5lZXJcIiBhdXRvY29tcGxldGU9XCJvZmZcIj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImludGFrZS1maWVsZC1yb3dcIj5cbiAgICAgICAgPGxhYmVsIGZvcj1cImludGFrZS1jb21wYW55LWlucHV0XCI+Q29tcGFueTwvbGFiZWw+XG4gICAgICAgIDxpbnB1dCBpZD1cImludGFrZS1jb21wYW55LWlucHV0XCIgdHlwZT1cInRleHRcIiB2YWx1ZT1cIiR7ZXNjYXBlSHRtbChleHRyYWN0ZWQuY29tcGFueSB8fCAnJyl9XCJcbiAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBBY21lIENvcnBcIiBhdXRvY29tcGxldGU9XCJvZmZcIj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImludGFrZS1maWVsZC1yb3dcIj5cbiAgICAgICAgPGxhYmVsIGZvcj1cImludGFrZS1kYXRlLWlucHV0XCI+RGF0ZSBBcHBsaWVkPC9sYWJlbD5cbiAgICAgICAgPGlucHV0IGlkPVwiaW50YWtlLWRhdGUtaW5wdXRcIiB0eXBlPVwiZGF0ZVwiIHZhbHVlPVwiJHtlc2NhcGVIdG1sKHRvZGF5KX1cIj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImludGFrZS1hY3Rpb25zXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4tc2Vjb25kYXJ5XCIgb25jbGljaz1cIl9za2lwSW50YWtlQ2FyZCgpXCIgdHlwZT1cImJ1dHRvblwiPlNraXA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1wcmltYXJ5XCIgICBvbmNsaWNrPVwiX3N1Ym1pdEludGFrZUNhcmQoKVwiIHR5cGU9XCJidXR0b25cIiBpZD1cImludGFrZS1jb25maXJtLWJ0blwiPkNvbmZpcm0gJmFtcDsgQ29udGludWU8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PmA7XG4gIGFwcGVuZFJhd0h0bWwoY2FyZEh0bWwpO1xuXG4gIGNvbnN0IHJvbGVJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnRha2Utcm9sZS1pbnB1dCcpO1xuICBpZiAocm9sZUlucHV0ICYmICFyb2xlSW5wdXQudmFsdWUudHJpbSgpKSByb2xlSW5wdXQuZm9jdXMoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gX3N1Ym1pdEludGFrZUNhcmQoY29udGludWF0aW9uID0gbnVsbCkge1xuICBjb25zdCByb2xlICAgICAgICAgPSAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ludGFrZS1yb2xlLWlucHV0Jyk/LnZhbHVlICAgIHx8ICcnKS50cmltKCk7XG4gIGNvbnN0IGNvbXBhbnkgICAgICA9IChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW50YWtlLWNvbXBhbnktaW5wdXQnKT8udmFsdWUgfHwgJycpLnRyaW0oKTtcbiAgY29uc3QgZGF0ZV9hcHBsaWVkID0gKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnRha2UtZGF0ZS1pbnB1dCcpPy52YWx1ZSAgICB8fCAnJykudHJpbSgpO1xuXG4gIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnRha2UtY29uZmlybS1idG4nKTtcbiAgaWYgKGJ0bikgYnRuLmRpc2FibGVkID0gdHJ1ZTtcblxuICB0cnkge1xuICAgIGF3YWl0IGxsbUZldGNoKCcvYXBpL2NvbmZpcm0taW50YWtlJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7J0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ30sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7cm9sZSwgY29tcGFueSwgZGF0ZV9hcHBsaWVkfSksXG4gICAgfSk7XG4gIH0gY2F0Y2ggKF9lKSB7IC8qIG5vbi1mYXRhbCAqLyB9XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ludGFrZS1jb25maXJtLWNhcmQnKT8ucmVtb3ZlKCk7XG4gIGF3YWl0IF9wcm9jZWVkQWZ0ZXJJbnRha2UoY29udGludWF0aW9uKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gX3NraXBJbnRha2VDYXJkKGNvbnRpbnVhdGlvbiA9IG51bGwpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ludGFrZS1jb25maXJtLWNhcmQnKT8ucmVtb3ZlKCk7XG4gIGF3YWl0IF9wcm9jZWVkQWZ0ZXJJbnRha2UoY29udGludWF0aW9uKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gX3Byb2NlZWRBZnRlckludGFrZShjb250aW51YXRpb24gPSBudWxsKSB7XG4gIGNvbnN0IGVmZmVjdGl2ZUNvbnRpbnVhdGlvbiA9XG4gICAgKHR5cGVvZiBjb250aW51YXRpb24gPT09ICdmdW5jdGlvbicgJiYgY29udGludWF0aW9uKVxuICAgIHx8IF9wZW5kaW5nUG9zdEludGFrZUNvbnRpbnVhdGlvblxuICAgIHx8IChhc3luYyAoKSA9PiBhbmFseXplSm9iKCkpO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGxsbUZldGNoKCcvYXBpL3ByaW9yLWNsYXJpZmljYXRpb25zJyk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEuZm91bmQgJiYgZGF0YS5tYXRjaGVzICYmIGRhdGEubWF0Y2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBiZXN0ID0gZGF0YS5tYXRjaGVzWzBdO1xuICAgICAgX3BlbmRpbmdQb3N0SW50YWtlQ29udGludWF0aW9uID0gZWZmZWN0aXZlQ29udGludWF0aW9uO1xuICAgICAgYXdhaXQgX29mZmVyUHJpb3JDbGFyaWZpY2F0aW9ucyhiZXN0KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH0gY2F0Y2ggKF9lKSB7IC8qIGZhbGwgdGhyb3VnaCAqLyB9XG5cbiAgX3BlbmRpbmdQb3N0SW50YWtlQ29udGludWF0aW9uID0gbnVsbDtcbiAgYXdhaXQgZWZmZWN0aXZlQ29udGludWF0aW9uKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9vZmZlclByaW9yQ2xhcmlmaWNhdGlvbnMobWF0Y2gpIHtcbiAgY29uc3Qgcm9sZU5hbWUgPSBlc2NhcGVIdG1sKG1hdGNoLnJvbGUgfHwgbWF0Y2gucG9zaXRpb25fbmFtZSB8fCAnYSBzaW1pbGFyIHJvbGUnKTtcbiAgY29uc3QgYmFubmVySHRtbCA9IGBcbiAgICA8ZGl2IGNsYXNzPVwicHJpb3ItY2xhcmlmaWNhdGlvbnMtYmFubmVyXCIgaWQ9XCJwcmlvci1jbGFyLWJhbm5lclwiIHJvbGU9XCJzdGF0dXNcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwY2ItdGV4dFwiPlxuICAgICAgICBcdUQ4M0RcdURDQTEgRm91bmQgcHJpb3IgYW5zd2VycyBmcm9tIDxzcGFuIGNsYXNzPVwicGNiLXJvbGVcIj4ke3JvbGVOYW1lfTwvc3Bhbj4uXG4gICAgICAgIExvYWQgdGhlbSBhcyBkZWZhdWx0cyBmb3IgdGhlIGNsYXJpZmljYXRpb24gcXVlc3Rpb25zP1xuICAgICAgPC9kaXY+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLXNlY29uZGFyeVwiIG9uY2xpY2s9XCJfZGlzbWlzc1ByaW9yQ2xhcmlmaWNhdGlvbnMoKVwiIHR5cGU9XCJidXR0b25cIj5ObyB0aGFua3M8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJidG4tcHJpbWFyeVwiICAgb25jbGljaz1cIl9sb2FkUHJpb3JDbGFyaWZpY2F0aW9ucygpXCIgdHlwZT1cImJ1dHRvblwiIGlkPVwicGNiLWxvYWQtYnRuXCI+TG9hZCBkZWZhdWx0czwvYnV0dG9uPlxuICAgIDwvZGl2PmA7XG4gIGFwcGVuZFJhd0h0bWwoYmFubmVySHRtbCk7XG5cbiAgd2luZG93Ll9wZW5kaW5nUHJpb3JBbnN3ZXJzID0gbWF0Y2guYW5zd2VycyB8fCB7fTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gX2Rpc21pc3NQcmlvckNsYXJpZmljYXRpb25zKCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJpb3ItY2xhci1iYW5uZXInKT8ucmVtb3ZlKCk7XG4gIGRlbGV0ZSB3aW5kb3cuX3BlbmRpbmdQcmlvckFuc3dlcnM7XG4gIGNvbnN0IGNvbnRpbnVhdGlvbiA9IF9wZW5kaW5nUG9zdEludGFrZUNvbnRpbnVhdGlvbiB8fCAoYXN5bmMgKCkgPT4gYW5hbHl6ZUpvYigpKTtcbiAgX3BlbmRpbmdQb3N0SW50YWtlQ29udGludWF0aW9uID0gbnVsbDtcbiAgYXdhaXQgY29udGludWF0aW9uKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9sb2FkUHJpb3JDbGFyaWZpY2F0aW9ucygpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ByaW9yLWNsYXItYmFubmVyJyk/LnJlbW92ZSgpO1xuICBjb25zdCBhbnN3ZXJzID0gd2luZG93Ll9wZW5kaW5nUHJpb3JBbnN3ZXJzIHx8IHt9O1xuICBkZWxldGUgd2luZG93Ll9wZW5kaW5nUHJpb3JBbnN3ZXJzO1xuICBpZiAodHlwZW9mIHF1ZXN0aW9uQW5zd2VycyA9PT0gJ29iamVjdCcgJiYgcXVlc3Rpb25BbnN3ZXJzICE9PSBudWxsKSB7XG4gICAgT2JqZWN0LmFzc2lnbihxdWVzdGlvbkFuc3dlcnMsIGFuc3dlcnMpO1xuICB9IGVsc2Uge1xuICAgIHdpbmRvdy5xdWVzdGlvbkFuc3dlcnMgPSBPYmplY3QuYXNzaWduKHt9LCBhbnN3ZXJzKTtcbiAgfVxuICBjb25zdCBjb250aW51YXRpb24gPSBfcGVuZGluZ1Bvc3RJbnRha2VDb250aW51YXRpb24gfHwgKGFzeW5jICgpID0+IGFuYWx5emVKb2IoKSk7XG4gIF9wZW5kaW5nUG9zdEludGFrZUNvbnRpbnVhdGlvbiA9IG51bGw7XG4gIGF3YWl0IGNvbnRpbnVhdGlvbigpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgRVMgbW9kdWxlIGV4cG9ydHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5leHBvcnQge1xuICBfaGFuZGxlTExNTWVzc2FnZSxcbiAgX21lc3NhZ2VIYW5kbGVycyxcbiAgc2VuZE1lc3NhZ2UsXG4gIF9zaG93SW50YWtlQ29uZmlybUNhcmQsXG4gIF9zdWJtaXRJbnRha2VDYXJkLFxuICBfc2tpcEludGFrZUNhcmQsXG4gIF9wcm9jZWVkQWZ0ZXJJbnRha2UsXG4gIF9vZmZlclByaW9yQ2xhcmlmaWNhdGlvbnMsXG4gIF9kaXNtaXNzUHJpb3JDbGFyaWZpY2F0aW9ucyxcbiAgX2xvYWRQcmlvckNsYXJpZmljYXRpb25zLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL3F1ZXN0aW9ucy1wYW5lbC5qc1xuICogUG9zdC1hbmFseXNpcyBjbGFyaWZ5aW5nIHF1ZXN0aW9ucyBwYW5lbDogcmVuZGVyLCBkcmFmdCwgc3VibWl0LlxuICpcbiAqIERFUEVOREVOQ0lFUyAoYWxsIG9uIGdsb2JhbFRoaXMgYXQgcnVudGltZSk6XG4gKiAgIC0gY2xlYW5Kc29uUmVzcG9uc2UgKHV0aWxzLmpzKVxuICogICAtIG1lcmdlUG9zdEFuYWx5c2lzUXVlc3Rpb25zLCBub3JtYWxpemVQb3N0QW5hbHlzaXNRdWVzdGlvbnMgKGpvYi1hbmFseXNpcy5qcylcbiAqICAgLSBidWlsZEZhbGxiYWNrUG9zdEFuYWx5c2lzUXVlc3Rpb25zIChyZWNvbW1lbmRhdGlvbi1oZWxwZXJzLmpzKVxuICogICAtIGFwcGVuZE1lc3NhZ2UgKG1lc3NhZ2UtcXVldWUuanMpXG4gKiAgIC0gc2VuZEFjdGlvbiAoc2Vzc2lvbi1hY3Rpb25zLmpzKVxuICogICAtIGVzY2FwZUh0bWwgKHV0aWxzLmpzKVxuICogICAtIHN3aXRjaFRhYiAocmV2aWV3LXRhYmxlLWJhc2UuanMsIFRpZXIgNClcbiAqICAgLSBzdGF0ZU1hbmFnZXIgKHN0YXRlLW1hbmFnZXIuanMgXHUyMDE0IGdldFRhYkRhdGEoKSlcbiAqICAgLSBwb3N0QW5hbHlzaXNRdWVzdGlvbnMsIHF1ZXN0aW9uQW5zd2VycyAod2luZG93IGdsb2JhbHMpXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdxdWVzdGlvbnMtcGFuZWwnKTtcblxuaW1wb3J0IHsgc3RhdGVNYW5hZ2VyIH0gZnJvbSAnLi9zdGF0ZS1tYW5hZ2VyLmpzJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTdGF0ZSBwZXJzaXN0ZW5jZSBoZWxwZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuYXN5bmMgZnVuY3Rpb24gcGVyc2lzdFBvc3RBbmFseXNpc1N0YXRlKCkge1xuICB0cnkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zKSkge1xuICAgICAgd2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucyA9IFtdO1xuICAgIH1cbiAgICBpZiAoIXdpbmRvdy5xdWVzdGlvbkFuc3dlcnMgfHwgdHlwZW9mIHdpbmRvdy5xdWVzdGlvbkFuc3dlcnMgIT09ICdvYmplY3QnKSB7XG4gICAgICB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzID0ge307XG4gICAgfVxuXG4gICAgYXdhaXQgZmV0Y2goJy9hcGkvcG9zdC1hbmFseXNpcy1yZXNwb25zZXMnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBxdWVzdGlvbnM6IHdpbmRvdy5wb3N0QW5hbHlzaXNRdWVzdGlvbnMsXG4gICAgICAgIGFuc3dlcnM6IHdpbmRvdy5xdWVzdGlvbkFuc3dlcnNcbiAgICAgIH0pXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nLndhcm4oJ0ZhaWxlZCB0byBwZXJzaXN0IHBvc3QtYW5hbHlzaXMgc3RhdGU6JywgZXJyb3IpO1xuICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gTWFya2Rvd24gcmVuZGVyZXIgZm9yIHF1ZXN0aW9uIHRleHRcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiByZW5kZXJRdWVzdGlvbk1hcmtkb3duKG1hcmtkb3duVGV4dCkge1xuICBjb25zdCBzYWZlID0gZXNjYXBlSHRtbChtYXJrZG93blRleHQgfHwgJycpO1xuICByZXR1cm4gc2FmZVxuICAgIC5yZXBsYWNlKC9cXCpcXCooLis/KVxcKlxcKi9nLCAnPHN0cm9uZz4kMTwvc3Ryb25nPicpXG4gICAgLnJlcGxhY2UoL1xcKiguKz8pXFwqL2csICc8ZW0+JDE8L2VtPicpXG4gICAgLnJlcGxhY2UoL2AoW15gXSspYC9nLCAnPGNvZGU+JDE8L2NvZGU+JylcbiAgICAucmVwbGFjZSgvXFxuL2csICc8YnI+Jyk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQVBJIGZldGNoIGZvciBxdWVzdGlvbnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaFBvc3RBbmFseXNpc1F1ZXN0aW9uc0Zyb21BcGkoYW5hbHlzaXNEYXRhKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvcG9zdC1hbmFseXNpcy1xdWVzdGlvbnMnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBhbmFseXNpczogYW5hbHlzaXNEYXRhIH0pXG4gICAgfSk7XG4gICAgaWYgKCFyZXMub2spIHJldHVybiBbXTtcbiAgICBjb25zdCBwYXlsb2FkID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICByZXR1cm4gbm9ybWFsaXplUG9zdEFuYWx5c2lzUXVlc3Rpb25zKHBheWxvYWQucXVlc3Rpb25zKTtcbiAgfSBjYXRjaCAoYXBpRXJyb3IpIHtcbiAgICBsb2cud2FybignRmFpbGVkIHRvIGZldGNoIHBvc3QtYW5hbHlzaXMgcXVlc3Rpb25zOicsIGFwaUVycm9yKTtcbiAgICByZXR1cm4gW107XG4gIH1cbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBNYWluIG9yY2hlc3RyYXRvcjogY2FsbGVkIGFmdGVyIGFuYWx5emVKb2IgY29tcGxldGVzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuYXN5bmMgZnVuY3Rpb24gYXNrUG9zdEFuYWx5c2lzUXVlc3Rpb25zKGFuYWx5c2lzUmVzdWx0LCBwcmVmZXJyZWRRdWVzdGlvbnMgPSBudWxsKSB7XG4gIHRyeSB7XG4gICAgbGV0IGRhdGE7XG4gICAgaWYgKGFuYWx5c2lzUmVzdWx0ICE9PSBudWxsICYmIHR5cGVvZiBhbmFseXNpc1Jlc3VsdCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGRhdGEgPSBhbmFseXNpc1Jlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY2xlYW5SZXN1bHQgPSBjbGVhbkpzb25SZXNwb25zZShhbmFseXNpc1Jlc3VsdCk7XG4gICAgICBkYXRhID0gdHlwZW9mIGNsZWFuUmVzdWx0ID09PSAnc3RyaW5nJyA/IEpTT04ucGFyc2UoY2xlYW5SZXN1bHQpIDogY2xlYW5SZXN1bHQ7XG4gICAgfVxuXG4gICAgd2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucyA9IG1lcmdlUG9zdEFuYWx5c2lzUXVlc3Rpb25zKFtdLCBwcmVmZXJyZWRRdWVzdGlvbnMpO1xuXG4gICAgaWYgKHdpbmRvdy5wb3N0QW5hbHlzaXNRdWVzdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zID0gYXdhaXQgZmV0Y2hQb3N0QW5hbHlzaXNRdWVzdGlvbnNGcm9tQXBpKGRhdGEpO1xuICAgIH1cblxuICAgIGlmICh3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgd2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucyA9IGJ1aWxkRmFsbGJhY2tQb3N0QW5hbHlzaXNRdWVzdGlvbnMoZGF0YSk7XG4gICAgfVxuXG4gICAgaWYgKCF3aW5kb3cucXVlc3Rpb25BbnN3ZXJzIHx8IHR5cGVvZiB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzICE9PSAnb2JqZWN0Jykge1xuICAgICAgd2luZG93LnF1ZXN0aW9uQW5zd2VycyA9IHt9O1xuICAgIH1cbiAgICBhd2FpdCBwZXJzaXN0UG9zdEFuYWx5c2lzU3RhdGUoKTtcblxuICAgIGlmICh3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHJlbmRlclF1ZXN0aW9uc1BhbmVsKCk7XG4gICAgICBzd2l0Y2hUYWIoJ3F1ZXN0aW9ucycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCAnQW5hbHlzaXMgY29tcGxldGUhIE5vIGNsYXJpZnlpbmcgcXVlc3Rpb25zIG5lZWRlZC4gR2VuZXJhdGluZyBjdXN0b21pemF0aW9uIHJlY29tbWVuZGF0aW9uc1x1MjAyNicpO1xuICAgICAgYXdhaXQgc2VuZEFjdGlvbigncmVjb21tZW5kX2N1c3RvbWl6YXRpb25zJyk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nLmVycm9yKCdFcnJvciBwYXJzaW5nIGFuYWx5c2lzIGZvciBxdWVzdGlvbnM6JywgZSk7XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ0FuYWx5c2lzIGNvbXBsZXRlISBDbGljayBcIlJlY29tbWVuZCBDdXN0b21pemF0aW9uc1wiIHdoZW4gcmVhZHkuJyk7XG4gIH1cbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBUYWIgcG9wdWxhdGlvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIHBvcHVsYXRlUXVlc3Rpb25zVGFiKCkge1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgaWYgKCFjb250ZW50KSByZXR1cm47XG5cbiAgaWYgKCFzdGF0ZU1hbmFnZXIuZ2V0VGFiRGF0YSgnYW5hbHlzaXMnKSkge1xuICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJlbXB0eS1zdGF0ZVwiPjxkaXYgY2xhc3M9XCJpY29uXCI+XHVEODNEXHVEQ0FDPC9kaXY+PGgzPk5vIFF1ZXN0aW9ucyBZZXQ8L2gzPjxwPlJ1biBcIkFuYWx5c2UgSm9iXCIgZmlyc3QgdG8gZ2VuZXJhdGUgY2xhcmlmeWluZyBxdWVzdGlvbnMuPC9wPjwvZGl2Pic7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgaGFzUXVlc3Rpb25zID0gQXJyYXkuaXNBcnJheSh3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zKSAmJiB3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zLmxlbmd0aCA+IDA7XG4gIGlmICghaGFzUXVlc3Rpb25zKSB7XG4gICAgY29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImVtcHR5LXN0YXRlXCI+PGRpdiBjbGFzcz1cImljb25cIj5cdTI3MDU8L2Rpdj48aDM+UXVlc3Rpb25zIENvbXBsZXRlPC9oMz48cD5ObyBwZW5kaW5nIGNsYXJpZnlpbmcgcXVlc3Rpb25zIFx1MjAxNCBjdXN0b21pemF0aW9uIHJlY29tbWVuZGF0aW9ucyB3aWxsIGJlIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LjwvcD48L2Rpdj4nO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIF9jdXJyZW50R3JvdXAgPSAwO1xuICBjb250ZW50LmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwiYW5hbHlzaXMtcGFnZVwiPjxkaXYgY2xhc3M9XCJhbmFseXNpcy1zZWN0aW9uXCI+PGgyPlx1RDgzRFx1RENBQyBDbGFyaWZ5aW5nIFF1ZXN0aW9uczwvaDI+PHAgc3R5bGU9XCJjb2xvcjojNjQ3NDhiOyBtYXJnaW46IDA7XCI+UGxlYXNlIGFuc3dlciBlYWNoIHF1ZXN0aW9uIHRvIGltcHJvdmUgcmVjb21tZW5kYXRpb24gcXVhbGl0eS48L3A+PC9kaXY+PC9kaXY+JztcbiAgcmVuZGVyUXVlc3Rpb25zUGFuZWwoKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBQYW5lbCByZW5kZXJlclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIHJlbmRlclF1ZXN0aW9uc1BhbmVsKCkge1xuICBjb25zdCBxcyA9IHdpbmRvdy5wb3N0QW5hbHlzaXNRdWVzdGlvbnMgfHwgW107XG4gIGlmIChxcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgaWYgKCFjb250ZW50KSByZXR1cm47XG5cbiAgY29uc3QgZXhpc3RpbmcgPSBjb250ZW50LnF1ZXJ5U2VsZWN0b3IoJy5xdWVzdGlvbnMtcGFuZWwnKTtcbiAgaWYgKGV4aXN0aW5nKSBleGlzdGluZy5yZW1vdmUoKTtcblxuICBjb25zdCB0b3RhbCAgICAgID0gcXMubGVuZ3RoO1xuICBjb25zdCBudW1Hcm91cHMgID0gTWF0aC5jZWlsKHRvdGFsIC8gR1JPVVBfU0laRSk7XG4gIC8vIENsYW1wIGdyb3VwIGluZGV4IGluIGNhc2UgcXMgc2hyYW5rIHNpbmNlIGxhc3QgcmVuZGVyLlxuICBfY3VycmVudEdyb3VwICAgID0gTWF0aC5taW4oX2N1cnJlbnRHcm91cCwgbnVtR3JvdXBzIC0gMSk7XG4gIGNvbnN0IGdyb3VwU3RhcnQgPSBfY3VycmVudEdyb3VwICogR1JPVVBfU0laRTtcbiAgY29uc3QgZ3JvdXBFbmQgICA9IE1hdGgubWluKGdyb3VwU3RhcnQgKyBHUk9VUF9TSVpFLCB0b3RhbCk7XG4gIGNvbnN0IGdyb3VwUXMgICAgPSBxcy5zbGljZShncm91cFN0YXJ0LCBncm91cEVuZCk7XG4gIGNvbnN0IGlzTGFzdEdyb3VwID0gX2N1cnJlbnRHcm91cCA9PT0gbnVtR3JvdXBzIC0gMTtcblxuICBjb25zdCBleGlzdGluZ0Fuc3dlcnMgPSAod2luZG93LnF1ZXN0aW9uQW5zd2VycyAmJiB0eXBlb2Ygd2luZG93LnF1ZXN0aW9uQW5zd2VycyA9PT0gJ29iamVjdCcpXG4gICAgPyB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzIDoge307XG5cbiAgY29uc3QgZ3JvdXBMYWJlbCA9IG51bUdyb3VwcyA+IDFcbiAgICA/IGBHcm91cCAke19jdXJyZW50R3JvdXAgKyAxfSBvZiAke251bUdyb3Vwc31gXG4gICAgOiBgJHt0b3RhbH0gcXVlc3Rpb24ke3RvdGFsID4gMSA/ICdzJyA6ICcnfWA7XG5cbiAgbGV0IHBhbmVsSHRtbCA9IGA8ZGl2IGNsYXNzPVwicXVlc3Rpb25zLXBhbmVsXCIgaWQ9XCJxdWVzdGlvbnMtcGFuZWxcIj5cbiAgICA8aDI+XHVEODNEXHVEQ0FDIEEgZmV3IHF1aWNrIHF1ZXN0aW9uczwvaDI+XG4gICAgPHAgY2xhc3M9XCJxLXByb2dyZXNzXCIgaWQ9XCJxLXByb2dyZXNzXCI+JHtncm91cExhYmVsfSBcdTIwMTQgYW5zd2VyIGVhY2ggdG8gY29udGludWUuPC9wPmA7XG5cbiAgZ3JvdXBRcy5mb3JFYWNoKChxLCBsb2NhbElkeCkgPT4ge1xuICAgIGNvbnN0IGlkeCA9IGdyb3VwU3RhcnQgKyBsb2NhbElkeDtcbiAgICBjb25zdCBzYXZlZEFuc3dlciA9IChleGlzdGluZ0Fuc3dlcnNbcS50eXBlXSB8fCAnJykudG9TdHJpbmcoKTtcbiAgICBjb25zdCBpc0Fuc3dlcmVkICA9IHNhdmVkQW5zd2VyLnRyaW0oKS5sZW5ndGggPiAwO1xuICAgIGNvbnN0IHJlbmRlcmVkUXVlc3Rpb24gPSByZW5kZXJRdWVzdGlvbk1hcmtkb3duKHEucXVlc3Rpb24pO1xuICAgIGNvbnN0IGNoaXBzID0gKHEuY2hvaWNlcyB8fCBbXSkubWFwKChjLCBjaSkgPT5cbiAgICAgIGA8YnV0dG9uIGNsYXNzPVwicS1jaGlwXCIgZGF0YS1xaWR4PVwiJHtpZHh9XCIgZGF0YS1jaWR4PVwiJHtjaX1cIiBvbmNsaWNrPVwic2VsZWN0UUNoaXAodGhpcywgJHtpZHh9KVwiPiR7ZXNjYXBlSHRtbChjKX08L2J1dHRvbj5gXG4gICAgKS5qb2luKCcnKTtcbiAgICBwYW5lbEh0bWwgKz0gYFxuICAgICAgPGRpdiBjbGFzcz1cInF1ZXN0aW9uLWl0ZW0ke2lzQW5zd2VyZWQgPyAnIGFuc3dlcmVkJyA6ICcnfVwiIGlkPVwicS1pdGVtLSR7aWR4fVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicS1oZWFkZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicS10ZXh0XCI+JHtpZHggKyAxfS4gJHtyZW5kZXJlZFF1ZXN0aW9ufTwvZGl2PlxuICAgICAgICAgICR7aXNBbnN3ZXJlZCA/ICc8c3BhbiBjbGFzcz1cInEtYW5zd2VyZWQtYmFkZ2VcIj5cdTI3MTMgQW5zd2VyZWQ8L3NwYW4+JyA6ICcnfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgJHtjaGlwcyA/IGA8ZGl2IGNsYXNzPVwicS1jaGlwc1wiPiR7Y2hpcHN9PC9kaXY+YCA6ICcnfVxuICAgICAgICA8ZGl2IGNsYXNzPVwicS1hbnN3ZXItcm93XCI+XG4gICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwicS1pbnB1dFwiIGlkPVwicS1pbnB1dC0ke2lkeH1cIiBwbGFjZWhvbGRlcj1cIllvdXIgYW5zd2VyXHUyMDI2XCIgb25pbnB1dD1cIm9uUUlucHV0Q2hhbmdlKCR7aWR4fSlcIj4ke2VzY2FwZUh0bWwoc2F2ZWRBbnN3ZXIpfTwvdGV4dGFyZWE+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInEtZHJhZnQtYnRuXCIgaWQ9XCJxLWRyYWZ0LWJ0bi0ke2lkeH1cIiBvbmNsaWNrPVwiZHJhZnRRdWVzdGlvblJlc3BvbnNlKCR7aWR4fSlcIiB0aXRsZT1cIkdlbmVyYXRlIGEgZHJhZnQgYW5zd2VyIHVzaW5nIEFJXCI+XHUyNzI4IERyYWZ0PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+YDtcbiAgfSk7XG5cbiAgaWYgKGlzTGFzdEdyb3VwKSB7XG4gICAgcGFuZWxIdG1sICs9IGA8YnV0dG9uIGNsYXNzPVwicXVlc3Rpb25zLXN1Ym1pdC1idG5cIiBpZD1cInEtc3VibWl0LWJ0blwiIG9uY2xpY2s9XCJzdWJtaXRBbGxBbnN3ZXJzKClcIiBkaXNhYmxlZD5TdWJtaXQgQW5zd2VyczwvYnV0dG9uPmA7XG4gIH0gZWxzZSB7XG4gICAgcGFuZWxIdG1sICs9IGA8YnV0dG9uIGNsYXNzPVwicXVlc3Rpb25zLXN1Ym1pdC1idG5cIiBpZD1cInEtc3VibWl0LWJ0blwiIG9uY2xpY2s9XCJhZHZhbmNlUUdyb3VwKClcIiBkaXNhYmxlZD5Db250aW51ZSBcdTIxOTIgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC44ZW07Zm9udC13ZWlnaHQ6NDAwO1wiPigke2dyb3VwRW5kfSBvZiAke3RvdGFsfSBhbnN3ZXJlZCk8L3NwYW4+PC9idXR0b24+YDtcbiAgfVxuICBwYW5lbEh0bWwgKz0gJzwvZGl2Pic7XG5cbiAgY29udGVudC5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsIHBhbmVsSHRtbCk7XG5cbiAgLy8gUmVzdG9yZSBjaGlwIHNlbGVjdGlvbiBmb3IgYW55IHF1ZXN0aW9uIHdob3NlIHNhdmVkIGFuc3dlciBtYXRjaGVzIGEgY2hpcCBsYWJlbC5cbiAgZ3JvdXBRcy5mb3JFYWNoKChxLCBsb2NhbElkeCkgPT4ge1xuICAgIGNvbnN0IGlkeCA9IGdyb3VwU3RhcnQgKyBsb2NhbElkeDtcbiAgICBjb25zdCBzYXZlZCA9IChleGlzdGluZ0Fuc3dlcnNbcS50eXBlXSB8fCAnJykudG9TdHJpbmcoKS50cmltKCk7XG4gICAgaWYgKCFzYXZlZCkgcmV0dXJuO1xuICAgIGNvbnN0IGl0ZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcS1pdGVtLSR7aWR4fWApO1xuICAgIGlmICghaXRlbSkgcmV0dXJuO1xuICAgIGl0ZW0ucXVlcnlTZWxlY3RvckFsbCgnLnEtY2hpcCcpLmZvckVhY2goY2hpcCA9PiB7XG4gICAgICBpZiAoKGNoaXAudGV4dENvbnRlbnQgfHwgJycpLnRyaW0oKSA9PT0gc2F2ZWQpIGNoaXAuY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgdXBkYXRlUVByb2dyZXNzKCk7XG59XG5cbmZ1bmN0aW9uIGFkdmFuY2VRR3JvdXAoKSB7XG4gIC8vIEZsdXNoIGN1cnJlbnQgZ3JvdXAncyB0ZXh0YXJlYSB2YWx1ZXMgaW50byB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzIGJlZm9yZSBhZHZhbmNpbmcuXG4gIGNvbnN0IHFzID0gd2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucyB8fCBbXTtcbiAgY29uc3QgZ3JvdXBTdGFydCA9IF9jdXJyZW50R3JvdXAgKiBHUk9VUF9TSVpFO1xuICBjb25zdCBncm91cEVuZCAgID0gTWF0aC5taW4oZ3JvdXBTdGFydCArIEdST1VQX1NJWkUsIHFzLmxlbmd0aCk7XG4gIGZvciAobGV0IGlkeCA9IGdyb3VwU3RhcnQ7IGlkeCA8IGdyb3VwRW5kOyBpZHgrKykge1xuICAgIGNvbnN0IHEgID0gcXNbaWR4XTtcbiAgICBjb25zdCB0YSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBxLWlucHV0LSR7aWR4fWApO1xuICAgIGlmIChxICYmIHRhICYmIHRhLnZhbHVlLnRyaW0oKSkge1xuICAgICAgaWYgKCF3aW5kb3cucXVlc3Rpb25BbnN3ZXJzKSB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzID0ge307XG4gICAgICB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzW3EudHlwZV0gPSB0YS52YWx1ZS50cmltKCk7XG4gICAgfVxuICB9XG4gIHBlcnNpc3RQb3N0QW5hbHlzaXNTdGF0ZSgpO1xuICBfY3VycmVudEdyb3VwKys7XG4gIHJlbmRlclF1ZXN0aW9uc1BhbmVsKCk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gSW50ZXJhY3Rpb24gaGFuZGxlcnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5hc3luYyBmdW5jdGlvbiBkcmFmdFF1ZXN0aW9uUmVzcG9uc2UoaWR4KSB7XG4gIGNvbnN0IHFzID0gd2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucyB8fCBbXTtcbiAgY29uc3QgcSAgPSBxc1tpZHhdO1xuICBpZiAoIXEpIHJldHVybjtcblxuICBjb25zdCBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcS1kcmFmdC1idG4tJHtpZHh9YCk7XG4gIGNvbnN0IHRhICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBxLWlucHV0LSR7aWR4fWApO1xuICBpZiAoIWJ0biB8fCAhdGEpIHJldHVybjtcblxuICBidG4uZGlzYWJsZWQgPSB0cnVlO1xuICBidG4uaW5uZXJIVE1MID0gJzxzcGFuIGNsYXNzPVwic3Bpbm5lclwiIHN0eWxlPVwiZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MTFweDtoZWlnaHQ6MTFweDtib3JkZXI6MnB4IHNvbGlkIGN1cnJlbnRDb2xvcjtib3JkZXItdG9wLWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlci1yYWRpdXM6NTAlO2FuaW1hdGlvbjpzcGluIDAuN3MgbGluZWFyIGluZmluaXRlO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtcIj48L3NwYW4+JztcblxuICB0cnkge1xuICAgIGxldCBhbmFseXNpc1BheWxvYWQgPSBudWxsO1xuICAgIGNvbnN0IGFuYWx5c2lzU3RhdGUgPSBzdGF0ZU1hbmFnZXIuZ2V0VGFiRGF0YSgnYW5hbHlzaXMnKTtcbiAgICBpZiAoYW5hbHlzaXNTdGF0ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY2xlYW5lZCA9IGNsZWFuSnNvblJlc3BvbnNlKGFuYWx5c2lzU3RhdGUpO1xuICAgICAgICBhbmFseXNpc1BheWxvYWQgPSB0eXBlb2YgY2xlYW5lZCA9PT0gJ3N0cmluZycgPyBKU09OLnBhcnNlKGNsZWFuZWQpIDogY2xlYW5lZDtcbiAgICAgIH0gY2F0Y2ggKF8pIHsgLyogdXNlIG51bGwgKi8gfVxuICAgIH1cblxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3Bvc3QtYW5hbHlzaXMtZHJhZnQtcmVzcG9uc2UnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBxdWVzdGlvbjogcS5xdWVzdGlvbiwgcXVlc3Rpb25fdHlwZTogcS50eXBlLCBhbmFseXNpczogYW5hbHlzaXNQYXlsb2FkIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rICYmIGRhdGEudGV4dCkge1xuICAgICAgdGEudmFsdWUgPSBkYXRhLnRleHQ7XG4gICAgICB1cGRhdGVRUHJvZ3Jlc3MoKTtcbiAgICAgIGNvbnN0IGl0ZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcS1pdGVtLSR7aWR4fWApO1xuICAgICAgaWYgKGl0ZW0pIGl0ZW0ucXVlcnlTZWxlY3RvckFsbCgnLnEtY2hpcCcpLmZvckVhY2goYyA9PiBjLmNsYXNzTGlzdC5yZW1vdmUoJ3NlbGVjdGVkJykpO1xuICAgICAgc2hvd0RyYWZ0RXJyb3IoaWR4LCBudWxsKTtcbiAgICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIGBcdTI3MjggRHJhZnQgYW5zd2VyIGZvciBRJHtpZHggKyAxfTpcXG5cXG4ke2RhdGEudGV4dH1cXG5cXG5SZXZpZXcgYW5kIGVkaXQgaW4gdGhlIGZpZWxkIGJlbG93IGJlZm9yZSBzdWJtaXR0aW5nLmApO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2cud2FybignRHJhZnQgZ2VuZXJhdGlvbiBmYWlsZWQ6JywgZGF0YS5lcnJvcik7XG4gICAgICBzaG93RHJhZnRFcnJvcihpZHgsIGRhdGEuZXJyb3IgfHwgJ0RyYWZ0IGZhaWxlZCBcdTIwMTQgcGxlYXNlIHRyeSBhZ2Fpbi4nKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy5lcnJvcignRHJhZnQgZmV0Y2ggZXJyb3I6JywgZXJyKTtcbiAgICBzaG93RHJhZnRFcnJvcihpZHgsICdOZXR3b3JrIGVycm9yIFx1MjAxNCBwbGVhc2UgdHJ5IGFnYWluLicpO1xuICB9IGZpbmFsbHkge1xuICAgIGJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIGJ0bi5pbm5lckhUTUwgPSAnXHUyNzI4IERyYWZ0JztcbiAgfVxufVxuXG5mdW5jdGlvbiBzZWxlY3RRQ2hpcChidG4sIHFJZHgpIHtcbiAgY29uc3QgcGFuZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcS1pdGVtLSR7cUlkeH1gKTtcbiAgaWYgKHBhbmVsKSB7XG4gICAgcGFuZWwucXVlcnlTZWxlY3RvckFsbCgnLnEtY2hpcCcpLmZvckVhY2goYyA9PiBjLmNsYXNzTGlzdC5yZW1vdmUoJ3NlbGVjdGVkJykpO1xuICB9XG4gIGJ0bi5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xuICBjb25zdCB0ZXh0YXJlYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBxLWlucHV0LSR7cUlkeH1gKTtcbiAgaWYgKHRleHRhcmVhKSB7XG4gICAgdGV4dGFyZWEudmFsdWUgPSBidG4udGV4dENvbnRlbnQ7XG4gICAgdXBkYXRlUVByb2dyZXNzKCk7XG4gIH1cbiAgLy8gUGVyc2lzdCB0aGUgY2hpcCBhbnN3ZXIgaW1tZWRpYXRlbHkgc28gaXQgc3Vydml2ZXMgdGFiIG5hdmlnYXRpb24uXG4gIGNvbnN0IHEgPSAod2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucyB8fCBbXSlbcUlkeF07XG4gIGlmIChxKSB7XG4gICAgaWYgKCF3aW5kb3cucXVlc3Rpb25BbnN3ZXJzIHx8IHR5cGVvZiB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzICE9PSAnb2JqZWN0Jykge1xuICAgICAgd2luZG93LnF1ZXN0aW9uQW5zd2VycyA9IHt9O1xuICAgIH1cbiAgICB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzW3EudHlwZV0gPSBidG4udGV4dENvbnRlbnQ7XG4gICAgcGVyc2lzdFBvc3RBbmFseXNpc1N0YXRlKCk7XG4gIH1cbn1cblxuLy8gQ3VycmVudCBxdWVzdGlvbi1ncm91cCBpbmRleCAoXHUyMjY0My1wZXItZ3JvdXAgZmxvdywgR0FQLTIwMSkuXG5sZXQgX2N1cnJlbnRHcm91cCA9IDA7XG5jb25zdCBHUk9VUF9TSVpFID0gMztcblxuLy8gRGVib3VuY2UgdGltZXIgZm9yIHBlcnNpc3RpbmcgYW5zd2VycyB3aGlsZSB0aGUgdXNlciB0eXBlcy5cbmxldCBfcGVyc2lzdERlYm91bmNlVGltZXIgPSBudWxsO1xuXG5mdW5jdGlvbiBvblFJbnB1dENoYW5nZShpZHgpIHtcbiAgdXBkYXRlUVByb2dyZXNzKCk7XG4gIGNvbnN0IHEgPSAod2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucyB8fCBbXSlbaWR4XTtcbiAgaWYgKCFxKSByZXR1cm47XG4gIGNvbnN0IHRhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHEtaW5wdXQtJHtpZHh9YCk7XG4gIGlmICghdGEpIHJldHVybjtcbiAgaWYgKCF3aW5kb3cucXVlc3Rpb25BbnN3ZXJzIHx8IHR5cGVvZiB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzICE9PSAnb2JqZWN0Jykge1xuICAgIHdpbmRvdy5xdWVzdGlvbkFuc3dlcnMgPSB7fTtcbiAgfVxuICB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzW3EudHlwZV0gPSB0YS52YWx1ZTtcblxuICAvLyBEZWJvdW5jZS1wZXJzaXN0IHNvIGFuc3dlcnMgc3Vydml2ZSB0YWIgbmF2aWdhdGlvbiBhbmQgc3RhdHVzIHBvbGxpbmcuXG4gIGNsZWFyVGltZW91dChfcGVyc2lzdERlYm91bmNlVGltZXIpO1xuICBfcGVyc2lzdERlYm91bmNlVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHBlcnNpc3RQb3N0QW5hbHlzaXNTdGF0ZSgpLCA1MDApO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVRUHJvZ3Jlc3MoKSB7XG4gIGNvbnN0IHFzID0gd2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucyB8fCBbXTtcbiAgY29uc3Qgc3RvcmVkQW5zd2VycyA9IHdpbmRvdy5xdWVzdGlvbkFuc3dlcnMgfHwge307XG4gIGNvbnN0IGdyb3VwU3RhcnQgPSBfY3VycmVudEdyb3VwICogR1JPVVBfU0laRTtcbiAgY29uc3QgZ3JvdXBFbmQgICA9IE1hdGgubWluKGdyb3VwU3RhcnQgKyBHUk9VUF9TSVpFLCBxcy5sZW5ndGgpO1xuXG4gIC8vIENvdW50IGFuc3dlcnM6IHVzZSBET00gdmFsdWVzIGZvciB0aGUgY3VycmVudCBncm91cCAobGl2ZSksIHN0b3JlZCBmb3Igb3RoZXJzLlxuICBjb25zdCBhbnN3ZXJlZCA9IHFzLmZpbHRlcigocSwgaWR4KSA9PiB7XG4gICAgaWYgKGlkeCA+PSBncm91cFN0YXJ0ICYmIGlkeCA8IGdyb3VwRW5kKSB7XG4gICAgICBjb25zdCB0YSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBxLWlucHV0LSR7aWR4fWApO1xuICAgICAgcmV0dXJuIHRhID8gdGEudmFsdWUudHJpbSgpLmxlbmd0aCA+IDAgOiAhIShzdG9yZWRBbnN3ZXJzW3EudHlwZV0gfHwgJycpLnRyaW0oKTtcbiAgICB9XG4gICAgcmV0dXJuICEhKHN0b3JlZEFuc3dlcnNbcS50eXBlXSB8fCAnJykudHJpbSgpO1xuICB9KS5sZW5ndGg7XG5cbiAgY29uc3QgZ3JvdXBBbnN3ZXJlZCA9IHFzLnNsaWNlKGdyb3VwU3RhcnQsIGdyb3VwRW5kKS5maWx0ZXIoKHEsIGxpKSA9PiB7XG4gICAgY29uc3QgdGEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcS1pbnB1dC0ke2dyb3VwU3RhcnQgKyBsaX1gKTtcbiAgICByZXR1cm4gdGEgPyB0YS52YWx1ZS50cmltKCkubGVuZ3RoID4gMCA6ICEhKHN0b3JlZEFuc3dlcnNbcS50eXBlXSB8fCAnJykudHJpbSgpO1xuICB9KS5sZW5ndGg7XG5cbiAgY29uc3QgbnVtR3JvdXBzICA9IE1hdGguY2VpbChxcy5sZW5ndGggLyBHUk9VUF9TSVpFKTtcbiAgY29uc3QgZ3JvdXBMYWJlbCA9IG51bUdyb3VwcyA+IDFcbiAgICA/IGBHcm91cCAke19jdXJyZW50R3JvdXAgKyAxfSBvZiAke251bUdyb3Vwc31gXG4gICAgOiBgJHtxcy5sZW5ndGh9IHF1ZXN0aW9uJHtxcy5sZW5ndGggPiAxID8gJ3MnIDogJyd9YDtcblxuICBjb25zdCBwcm9ncmVzc0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3EtcHJvZ3Jlc3MnKTtcbiAgaWYgKHByb2dyZXNzRWwpIHtcbiAgICBwcm9ncmVzc0VsLnRleHRDb250ZW50ID0gYCR7Z3JvdXBMYWJlbH0gXHUyMDE0ICR7YW5zd2VyZWR9IG9mICR7cXMubGVuZ3RofSBhbnN3ZXJlZGA7XG4gIH1cbiAgY29uc3Qgc3VibWl0QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Etc3VibWl0LWJ0bicpO1xuICBpZiAoc3VibWl0QnRuKSB7XG4gICAgY29uc3QgY3VycmVudEdyb3VwU2l6ZSA9IGdyb3VwRW5kIC0gZ3JvdXBTdGFydDtcbiAgICBzdWJtaXRCdG4uZGlzYWJsZWQgPSBncm91cEFuc3dlcmVkIDwgY3VycmVudEdyb3VwU2l6ZTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBzdWJtaXRBbGxBbnN3ZXJzKCkge1xuICAvKiBkdWNrZmxvdzpcbiAgICogICBpZDogcXVlc3Rpb25zX3VpX3N1Ym1pdF9saXZlXG4gICAqICAga2luZDogdWlcbiAgICogICB0aW1lc3RhbXA6ICcyMDI2LTAzLTI1VDIxOjM5OjQ4WidcbiAgICogICBzdGF0dXM6IGxpdmVcbiAgICogICBoYW5kbGVzOlxuICAgKiAgIC0gdWk6cXVlc3Rpb25zLnN1Ym1pdC1hbGxcbiAgICogICBjYWxsczpcbiAgICogICAtIFBPU1QgL2FwaS9wb3N0LWFuYWx5c2lzLXJlc3BvbnNlc1xuICAgKiAgIC0gUE9TVCAvYXBpL2FjdGlvblxuICAgKiAgIHJlYWRzOlxuICAgKiAgIC0gd2luZG93OnBvc3RBbmFseXNpc1F1ZXN0aW9uc1xuICAgKiAgIC0gZG9tOnEtaW5wdXQtKi52YWx1ZVxuICAgKiAgIHdyaXRlczpcbiAgICogICAtIHdpbmRvdzpxdWVzdGlvbkFuc3dlcnNcbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL3Bvc3QtYW5hbHlzaXMtcmVzcG9uc2VzLmFuc3dlcnNcbiAgICogICBub3RlczogQ29sbGVjdHMgdGhlIGNsYXJpZnlpbmctcXVlc3Rpb24gYW5zd2VycyBmcm9tIHRoZSBVSSwgcGVyc2lzdHMgdGhlbSB0byBzZXNzaW9uIHN0YXRlLCBhbmQgdGhlbiBhZHZhbmNlcyBpbnRvIGN1c3RvbWl6YXRpb24gcmVjb21tZW5kYXRpb24gZ2VuZXJhdGlvbi5cbiAgICovXG4gIGNvbnN0IHFzID0gd2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucyB8fCBbXTtcbiAgcXMuZm9yRWFjaCgocSwgaWR4KSA9PiB7XG4gICAgY29uc3QgdGEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcS1pbnB1dC0ke2lkeH1gKTtcbiAgICBpZiAodGEgJiYgdGEudmFsdWUudHJpbSgpKSB7XG4gICAgICB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzW3EudHlwZV0gPSB0YS52YWx1ZS50cmltKCk7XG4gICAgfVxuICB9KTtcbiAgYXdhaXQgcGVyc2lzdFBvc3RBbmFseXNpc1N0YXRlKCk7XG5cbiAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Etc3VibWl0LWJ0bicpO1xuICBpZiAoYnRuKSB7XG4gICAgYnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgICBidG4uaW5uZXJIVE1MID0gJzxzcGFuIGNsYXNzPVwic3Bpbm5lclwiIHN0eWxlPVwiZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MTRweDtoZWlnaHQ6MTRweDtib3JkZXI6MnB4IHNvbGlkICNmZmY7Ym9yZGVyLXRvcC1jb2xvcjp0cmFuc3BhcmVudDtib3JkZXItcmFkaXVzOjUwJTthbmltYXRpb246c3BpbiAwLjdzIGxpbmVhciBpbmZpbml0ZTt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7bWFyZ2luLXJpZ2h0OjZweDtcIj48L3NwYW4+UHJvY2Vzc2luZ1x1MjAyNic7XG4gIH1cblxuICB0cnkge1xuICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIGBcdTI3MTMgVGhhbmsgeW91ISAke3FzLmxlbmd0aH0gYW5zd2VyJHtxcy5sZW5ndGggPiAxID8gJ3MnIDogJyd9IHNhdmVkLiBHZW5lcmF0aW5nIGN1c3RvbWl6YXRpb24gcmVjb21tZW5kYXRpb25zXHUyMDI2YCk7XG4gICAgYXdhaXQgc2VuZEFjdGlvbigncmVjb21tZW5kX2N1c3RvbWl6YXRpb25zJyk7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKGJ0bikge1xuICAgICAgYnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICBidG4uaW5uZXJIVE1MID0gJ1N1Ym1pdCBBbnN3ZXJzJztcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvd0RyYWZ0RXJyb3IoaWR4LCBtZXNzYWdlKSB7XG4gIGNvbnN0IHJvdyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCNxLWl0ZW0tJHtpZHh9IC5xLWFuc3dlci1yb3dgKTtcbiAgaWYgKCFyb3cpIHJldHVybjtcbiAgbGV0IGVyckVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHEtZHJhZnQtZXJyLSR7aWR4fWApO1xuICBpZiAoIW1lc3NhZ2UpIHtcbiAgICBpZiAoZXJyRWwpIGVyckVsLnJlbW92ZSgpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIWVyckVsKSB7XG4gICAgZXJyRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBlcnJFbC5pZCA9IGBxLWRyYWZ0LWVyci0ke2lkeH1gO1xuICAgIGVyckVsLmNsYXNzTmFtZSA9ICdxLWRyYWZ0LWVycm9yJztcbiAgICByb3cuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdhZnRlcmVuZCcsIGVyckVsKTtcbiAgfVxuICBlcnJFbC50ZXh0Q29udGVudCA9IGBcdTI2QTAgJHttZXNzYWdlfWA7XG59XG5cbi8vIExlZ2FjeSBjb21wYXRpYmlsaXR5IHNoaW1cbmZ1bmN0aW9uIHNob3dOZXh0UXVlc3Rpb24oKSB7IHJlbmRlclF1ZXN0aW9uc1BhbmVsKCk7IH1cblxuZnVuY3Rpb24gaGFuZGxlUXVlc3Rpb25SZXNwb25zZShtZXNzYWdlKSB7XG4gIGlmICghd2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucyB8fCB3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoIXdpbmRvdy53YWl0aW5nRm9yUXVlc3Rpb25SZXNwb25zZSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBpZHggPSB3aW5kb3cuY3VycmVudFF1ZXN0aW9uSW5kZXggfHwgMDtcbiAgY29uc3QgcSA9IHdpbmRvdy5wb3N0QW5hbHlzaXNRdWVzdGlvbnNbaWR4XTtcbiAgaWYgKCFxKSByZXR1cm4gZmFsc2U7XG4gIHdpbmRvdy5xdWVzdGlvbkFuc3dlcnNbcS50eXBlXSA9IG1lc3NhZ2U7XG4gIHdpbmRvdy53YWl0aW5nRm9yUXVlc3Rpb25SZXNwb25zZSA9IGZhbHNlO1xuICB3aW5kb3cuY3VycmVudFF1ZXN0aW9uSW5kZXggPSBpZHggKyAxO1xuICBwZXJzaXN0UG9zdEFuYWx5c2lzU3RhdGUoKTtcbiAgcmVuZGVyUXVlc3Rpb25zUGFuZWwoKTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGZpbmlzaFBvc3RBbmFseXNpc1F1ZXN0aW9ucygpIHtcbiAgd2luZG93LndhaXRpbmdGb3JRdWVzdGlvblJlc3BvbnNlID0gZmFsc2U7XG4gIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsICdUaGFuayB5b3UgZm9yIHRob3NlIGluc2lnaHRzISBDbGljayBcIlJlY29tbWVuZCBDdXN0b21pemF0aW9uc1wiIHdoZW4geW91XFwncmUgcmVhZHkuJyk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFUyBtb2R1bGUgZXhwb3J0cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmV4cG9ydCB7XG4gIHBlcnNpc3RQb3N0QW5hbHlzaXNTdGF0ZSxcbiAgcmVuZGVyUXVlc3Rpb25NYXJrZG93bixcbiAgZmV0Y2hQb3N0QW5hbHlzaXNRdWVzdGlvbnNGcm9tQXBpLFxuICBhc2tQb3N0QW5hbHlzaXNRdWVzdGlvbnMsXG4gIHBvcHVsYXRlUXVlc3Rpb25zVGFiLFxuICByZW5kZXJRdWVzdGlvbnNQYW5lbCxcbiAgZHJhZnRRdWVzdGlvblJlc3BvbnNlLFxuICBzZWxlY3RRQ2hpcCxcbiAgb25RSW5wdXRDaGFuZ2UsXG4gIHVwZGF0ZVFQcm9ncmVzcyxcbiAgc3VibWl0QWxsQW5zd2VycyxcbiAgc2hvd0RyYWZ0RXJyb3IsXG4gIHNob3dOZXh0UXVlc3Rpb24sXG4gIGhhbmRsZVF1ZXN0aW9uUmVzcG9uc2UsXG4gIGZpbmlzaFBvc3RBbmFseXNpc1F1ZXN0aW9ucyxcbn07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG5mdW5jdGlvbiBleWVTbGFzaEljb24oKSB7XG4gIHJldHVybiBgXG4gICAgPHN2ZyBjbGFzcz1cImljb24tZ2x5cGhcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgZm9jdXNhYmxlPVwiZmFsc2VcIj5cbiAgICAgIDxwYXRoIGQ9XCJNMyAzbDE4IDE4XCI+PC9wYXRoPlxuICAgICAgPHBhdGggZD1cIk0xMC41OCAxMC41OGEyIDIgMCAwIDAgMi44MyAyLjgzXCI+PC9wYXRoPlxuICAgICAgPHBhdGggZD1cIk05Ljg4IDUuMDlBMTAuOTQgMTAuOTQgMCAwIDEgMTIgNWM1IDAgOS4yNyAzLjExIDExIDctMS4wNCAyLjM1LTIuNzggNC4zMi00Ljk2IDUuNDVcIj48L3BhdGg+XG4gICAgICA8cGF0aCBkPVwiTTYuNjEgNi42MUM0LjYyIDcuOSAzLjAzIDkuNzkgMiAxMmMxLjczIDMuODkgNiA3IDEwIDcgMS41MiAwIDIuOTgtLjM2IDQuMjktMVwiPjwvcGF0aD5cbiAgICA8L3N2Zz5cbiAgYDtcbn1cblxuZXhwb3J0IHsgZXllU2xhc2hJY29uIH07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9leHBlcmllbmNlLXJldmlldy5qc1xuICogRXhwZXJpZW5jZS1yZXZpZXcgdGFibGU6IGZldGNoLCByZW5kZXIsIHJvdy1yZW9yZGVyLCBhbmQgc3VibWl0IGRlY2lzaW9ucy5cbiAqXG4gKiBEZXBlbmRlbmNpZXMgKHJlc29sdmVkIHRocm91Z2ggZ2xvYmFsVGhpcyBhdCBydW50aW1lKTpcbiAqICAgdXNlclNlbGVjdGlvbnMsIHBlbmRpbmdSZWNvbW1lbmRhdGlvbnMsIF9zYXZlZERlY2lzaW9ucywgX2V4cGVyaWVuY2VzT3JkZXJlZCxcbiAqICAgcGFyc2VTdGF0dXNSZXNwb25zZSwgZ2V0RXhwZXJpZW5jZVJlY29tbWVuZGF0aW9uLCBnZXRDb25maWRlbmNlTGV2ZWwsXG4gKiAgIGdldEV4cGVyaWVuY2VSZWFzb25pbmcsIGVzY2FwZUh0bWwsIHNob3dCdWxsZXRSZW9yZGVyLFxuICogICBoYW5kbGVBY3Rpb25DbGljaywgYnVsa0FjdGlvbiwgX3VwZGF0ZVBhZ2VFc3RpbWF0ZSxcbiAqICAgdXBkYXRlSW5jbHVzaW9uQ291bnRzLCBzd2l0Y2hUYWIsXG4gKiAgIHNob3dBbGVydE1vZGFsLCBzaG93VG9hc3QsIHNjaGVkdWxlQXRzUmVmcmVzaCxcbiAqICAgJCwgJC5mbi5EYXRhVGFibGUgKGpRdWVyeSArIERhdGFUYWJsZXMpXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdleHBlcmllbmNlLXJldmlldycpO1xuXG5pbXBvcnQgeyBzdGF0ZU1hbmFnZXIgfSBmcm9tICcuL3N0YXRlLW1hbmFnZXIuanMnO1xuaW1wb3J0IHsgZXllU2xhc2hJY29uIH0gZnJvbSAnLi9yZXZpZXctaWNvbnMuanMnO1xuXG5mdW5jdGlvbiBfZmluZEV4cGVyaWVuY2VSZWNvbW1lbmRhdGlvblJlY29yZChleHBJZCwgZGF0YSkge1xuICBpZiAoIWRhdGEgfHwgIUFycmF5LmlzQXJyYXkoZGF0YS5leHBlcmllbmNlX3JlY29tbWVuZGF0aW9ucykpIHJldHVybiBudWxsO1xuICByZXR1cm4gZGF0YS5leHBlcmllbmNlX3JlY29tbWVuZGF0aW9ucy5maW5kKChyZWMpID0+IFN0cmluZyhyZWM/LmlkIHx8IHJlYz8uZXhwZXJpZW5jZV9pZCB8fCAnJykgPT09IFN0cmluZyhleHBJZCkpIHx8IG51bGw7XG59XG5cbmZ1bmN0aW9uIF9mb3JtYXRTdWdnZXN0ZWRPcmRlclN1bW1hcnkob3JkZXIpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KG9yZGVyKSB8fCBvcmRlci5sZW5ndGggPCAyKSByZXR1cm4gJyc7XG4gIHJldHVybiBvcmRlci5tYXAoKGlkeCkgPT4gU3RyaW5nKE51bWJlcihpZHgpICsgMSkpLmpvaW4oJyAtPiAnKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEV4cGVyaWVuY2UgZGV0YWlscyBmZXRjaCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gZ2V0RXhwZXJpZW5jZURldGFpbHMoZXhwSWQpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9leHBlcmllbmNlLWRldGFpbHMnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBleHBlcmllbmNlX2lkOiBleHBJZCB9KVxuICAgIH0pO1xuXG4gICAgaWYgKHJlcy5vaykge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICByZXR1cm4gZGF0YS5leHBlcmllbmNlIHx8IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZy53YXJuKCdDb3VsZCBub3QgZmV0Y2ggZXhwZXJpZW5jZSBkZXRhaWxzIGZvcicsIGV4cElkKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cud2FybignRXJyb3IgZmV0Y2hpbmcgZXhwZXJpZW5jZSBkZXRhaWxzOicsIGVycm9yKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgUmVydW4gc25hcHNob3QgKGNoYW5nZSBiYWRnZSBmb3IgZXhwZXJpZW5jZXMpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuZnVuY3Rpb24gX2V4cFNuYXBzaG90S2V5KCkge1xuICB0cnkge1xuICAgIGNvbnN0IHNpZCA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCkuZ2V0KCdzZXNzaW9uJyk7XG4gICAgcmV0dXJuIHNpZCA/IGBleHBfc25hcF8ke3NpZH1gIDogbnVsbDtcbiAgfSBjYXRjaCAoXykgeyByZXR1cm4gbnVsbDsgfVxufVxuZnVuY3Rpb24gX3NhdmVFeHBTbmFwc2hvdChyZWNvbW1lbmRlZElkcykge1xuICBjb25zdCBrZXkgPSBfZXhwU25hcHNob3RLZXkoKTtcbiAgaWYgKCFrZXkpIHJldHVybjtcbiAgdHJ5IHsgbG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCBKU09OLnN0cmluZ2lmeShbLi4ucmVjb21tZW5kZWRJZHNdKSk7IH0gY2F0Y2ggKF8pIHt9XG59XG5mdW5jdGlvbiBfZ2V0RXhwU25hcHNob3QoKSB7XG4gIGNvbnN0IGtleSA9IF9leHBTbmFwc2hvdEtleSgpO1xuICBpZiAoIWtleSkgcmV0dXJuIG51bGw7XG4gIHRyeSB7XG4gICAgY29uc3QgcmF3ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KTtcbiAgICByZXR1cm4gcmF3ID8gbmV3IFNldChKU09OLnBhcnNlKHJhdykpIDogbnVsbDtcbiAgfSBjYXRjaCAoXykgeyByZXR1cm4gbnVsbDsgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgQnVpbGQgcmV2aWV3IHRhYmxlIChmZXRjaCArIGluaXRpYWxpc2UpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBidWlsZEV4cGVyaWVuY2VSZXZpZXdUYWJsZSgpIHtcbiAgY29uc3QgZGF0YSA9IHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zO1xuICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwZXJpZW5jZS10YWJsZS1jb250YWluZXInKTtcbiAgaWYgKCFjb250YWluZXIpIHJldHVybjtcblxuICBjb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJlbXB0eS1zdGF0ZVwiPjxkaXYgY2xhc3M9XCJsb2FkaW5nLXNwaW5uZXJcIj48L2Rpdj48cCBzdHlsZT1cIm1hcmdpbi10b3A6MTJweDtjb2xvcjojNjQ3NDhiO1wiPkxvYWRpbmcgZXhwZXJpZW5jZSByZWNvbW1lbmRhdGlvbnNcdTIwMjY8L3A+PC9kaXY+JztcblxuICBsZXQgYWxsRXhwZXJpZW5jZUlkcyA9IFtdO1xuICBsZXQgc2F2ZWRSb3dPcmRlciA9IFtdO1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXR1c1JlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3N0YXR1cycpO1xuICAgIGNvbnN0IHN0YXR1c0RhdGEgPSBwYXJzZVN0YXR1c1Jlc3BvbnNlKGF3YWl0IHN0YXR1c1Jlcy5qc29uKCkpO1xuICAgIGFsbEV4cGVyaWVuY2VJZHMgPSBzdGF0dXNEYXRhLmFsbF9leHBlcmllbmNlX2lkcyB8fCBkYXRhLnJlY29tbWVuZGVkX2V4cGVyaWVuY2VzIHx8IFtdO1xuICAgIHNhdmVkUm93T3JkZXIgICAgPSBBcnJheS5pc0FycmF5KHN0YXR1c0RhdGEuZXhwZXJpZW5jZV9yb3dfb3JkZXIpID8gc3RhdHVzRGF0YS5leHBlcmllbmNlX3Jvd19vcmRlciA6IFtdO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGFsbEV4cGVyaWVuY2VJZHMgPSBkYXRhLnJlY29tbWVuZGVkX2V4cGVyaWVuY2VzIHx8IFtdO1xuICB9XG5cbiAgY29uc3QgcmVjb21tZW5kZWRTZXQgPSBuZXcgU2V0KGRhdGEucmVjb21tZW5kZWRfZXhwZXJpZW5jZXMgfHwgW10pO1xuXG4gIC8vIEZldGNoIGFsbCBleHBlcmllbmNlIGRldGFpbHNcbiAgY29uc3QgZXhwZXJpZW5jZXNXaXRoRGV0YWlscyA9IFtdO1xuICBmb3IgKGNvbnN0IGV4cElkIG9mIGFsbEV4cGVyaWVuY2VJZHMpIHtcbiAgICBjb25zdCBkZXRhaWxzID0gYXdhaXQgZ2V0RXhwZXJpZW5jZURldGFpbHMoZXhwSWQpO1xuICAgIGV4cGVyaWVuY2VzV2l0aERldGFpbHMucHVzaCh7IGlkOiBleHBJZCwgZGV0YWlscyB9KTtcbiAgfVxuXG4gIC8vIE9uIGZpcnN0IGxvYWQ6IHJlc3RvcmUgdXNlcidzIHNhdmVkIG9yZGVyIGlmIHByZXNlbnQ7IG90aGVyd2lzZSBkZWZhdWx0LXNvcnRcbiAgLy8gd2l0aCBwcmVzZW50L2N1cnJlbnQgcG9zaXRpb25zIGZpcnN0LCB0aGVuIHJldmVyc2UtY2hyb25vbG9naWNhbCBieSBlbmQgZGF0ZS5cbiAgLy8gT24gcmUtcmVuZGVyLCBwcmVzZXJ2ZSB0aGUgaW4tbWVtb3J5IHVzZXIgb3JkZXIuXG4gIGlmICghd2luZG93Ll9leHBlcmllbmNlc09yZGVyZWQpIHtcbiAgICBpZiAoc2F2ZWRSb3dPcmRlci5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBSZXN0b3JlIHVzZXIncyBleHBsaWNpdGx5IHNhdmVkIG9yZGVyaW5nIGZyb20gdGhlIHNlc3Npb25cbiAgICAgIGNvbnN0IG9yZGVyTWFwID0gT2JqZWN0LmZyb21FbnRyaWVzKHNhdmVkUm93T3JkZXIubWFwKChpZCwgaSkgPT4gW2lkLCBpXSkpO1xuICAgICAgZXhwZXJpZW5jZXNXaXRoRGV0YWlscy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIGNvbnN0IGFpID0gb3JkZXJNYXBbYS5pZF0gPz8gc2F2ZWRSb3dPcmRlci5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGJpID0gb3JkZXJNYXBbYi5pZF0gPz8gc2F2ZWRSb3dPcmRlci5sZW5ndGg7XG4gICAgICAgIHJldHVybiBhaSAtIGJpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIERlZmF1bHQ6IHNvcnQgYnkgTExNIHJlY29tbWVuZGF0aW9uIHN0cmVuZ3RoIGZpcnN0LCB0aGVuIHJldmVyc2UtY2hyb25vbG9naWNhbFxuICAgICAgY29uc3QgX0FDVElPTl9SQU5LID0geyBlbXBoYXNpemU6IDAsIGluY2x1ZGU6IDEsICdkZS1lbXBoYXNpemUnOiAyLCBleGNsdWRlOiAzIH07XG4gICAgICBjb25zdCBfcGFyc2VFbmRLZXkgPSAoZXhwKSA9PiB7XG4gICAgICAgIGNvbnN0IHJhdyA9IChleHAuZGV0YWlscz8uZW5kX2RhdGUgfHwgZXhwLmRldGFpbHM/LmVuZCB8fCAnJykudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICghcmF3IHx8IFsncHJlc2VudCcsICdjdXJyZW50JywgJ25vdycsICdvbmdvaW5nJ10uaW5jbHVkZXMocmF3KSkgcmV0dXJuICc5OTk5LTEyJztcbiAgICAgICAgaWYgKC9eXFxkezR9JC8udGVzdChyYXcpKSByZXR1cm4gcmF3ICsgJy0xMic7XG4gICAgICAgIHJldHVybiByYXc7XG4gICAgICB9O1xuICAgICAgY29uc3QgX2dldEFjdGlvblJhbmsgPSAoZXhwKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlYyA9IGdldEV4cGVyaWVuY2VSZWNvbW1lbmRhdGlvbihleHAuaWQsIGRhdGEpO1xuICAgICAgICBpZiAoIXJlYykgcmV0dXJuIDE7IC8vIGRlZmF1bHQgdG8gJ2luY2x1ZGUnIHJhbmsgd2hlbiBubyByZWNvbW1lbmRhdGlvblxuICAgICAgICBpZiAocmVjID09PSAnRW1waGFzaXplJykgICAgcmV0dXJuIDA7XG4gICAgICAgIGlmIChyZWMgPT09ICdJbmNsdWRlJykgICAgICByZXR1cm4gMTtcbiAgICAgICAgaWYgKHJlYyA9PT0gJ0RlLWVtcGhhc2l6ZScpIHJldHVybiAyO1xuICAgICAgICBpZiAocmVjID09PSAnT21pdCcpICAgICAgICAgcmV0dXJuIDM7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfTtcbiAgICAgIGV4cGVyaWVuY2VzV2l0aERldGFpbHMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICBjb25zdCByYW5rRGlmZiA9IF9nZXRBY3Rpb25SYW5rKGEpIC0gX2dldEFjdGlvblJhbmsoYik7XG4gICAgICAgIGlmIChyYW5rRGlmZiAhPT0gMCkgcmV0dXJuIHJhbmtEaWZmO1xuICAgICAgICByZXR1cm4gX3BhcnNlRW5kS2V5KGIpLmxvY2FsZUNvbXBhcmUoX3BhcnNlRW5kS2V5KGEpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB3aW5kb3cuX2V4cGVyaWVuY2VzT3JkZXJlZCA9IGV4cGVyaWVuY2VzV2l0aERldGFpbHM7XG4gIH0gZWxzZSB7XG4gICAgLy8gTWVyZ2UgYW55IG5ld2x5IGRpc2NvdmVyZWQgZXhwZXJpZW5jZXMgaW50byB0aGUgY2FjaGVkIG9yZGVyXG4gICAgY29uc3Qga25vd25JZHMgPSBuZXcgU2V0KHdpbmRvdy5fZXhwZXJpZW5jZXNPcmRlcmVkLm1hcChlID0+IGUuaWQpKTtcbiAgICBmb3IgKGNvbnN0IGV4cCBvZiBleHBlcmllbmNlc1dpdGhEZXRhaWxzKSB7XG4gICAgICBpZiAoIWtub3duSWRzLmhhcyhleHAuaWQpKSB3aW5kb3cuX2V4cGVyaWVuY2VzT3JkZXJlZC5wdXNoKGV4cCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQ29tcHV0ZSB3aGljaCByZWNvbW1lbmRhdGlvbnMgYXJlIG5ldyBzaW5jZSBsYXN0IHJlbmRlciAocmVydW4gY2hhbmdlIGJhZGdlcylcbiAgY29uc3QgcHJldkV4cFNuYXAgPSBfZ2V0RXhwU25hcHNob3QoKTtcbiAgY29uc3QgbmV3UmVjb21tZW5kZWRFeHBzID0gcHJldkV4cFNuYXBcbiAgICA/IG5ldyBTZXQoWy4uLnJlY29tbWVuZGVkU2V0XS5maWx0ZXIoaWQgPT4gIXByZXZFeHBTbmFwLmhhcyhpZCkpKVxuICAgIDogbmV3IFNldCgpO1xuICBfc2F2ZUV4cFNuYXBzaG90KHJlY29tbWVuZGVkU2V0KTtcblxuICAvLyBJbml0aWFsaXNlIHNhdmVkIGRlY2lzaW9uc1xuICBjb25zdCBzYXZlZEV4cERlY3MgPSB3aW5kb3cuX3NhdmVkRGVjaXNpb25zPy5leHBlcmllbmNlX2RlY2lzaW9ucyB8fCB7fTtcbiAgZm9yIChjb25zdCB7IGlkOiBleHBJZCB9IG9mIHdpbmRvdy5fZXhwZXJpZW5jZXNPcmRlcmVkKSB7XG4gICAgY29uc3QgcmVjb21tZW5kYXRpb24gPSBnZXRFeHBlcmllbmNlUmVjb21tZW5kYXRpb24oZXhwSWQsIGRhdGEpO1xuICAgIGNvbnN0IGlzUmVjb21tZW5kZWQgID0gcmVjb21tZW5kZWRTZXQuaGFzKGV4cElkKTtcbiAgICBsZXQgZGVmYXVsdEFjdGlvbiA9ICdleGNsdWRlJztcbiAgICBpZiAgICAgIChyZWNvbW1lbmRhdGlvbiA9PT0gJ0VtcGhhc2l6ZScpICAgIGRlZmF1bHRBY3Rpb24gPSAnZW1waGFzaXplJztcbiAgICBlbHNlIGlmIChyZWNvbW1lbmRhdGlvbiA9PT0gJ0luY2x1ZGUnKSAgICAgIGRlZmF1bHRBY3Rpb24gPSAnaW5jbHVkZSc7XG4gICAgZWxzZSBpZiAocmVjb21tZW5kYXRpb24gPT09ICdEZS1lbXBoYXNpemUnKSBkZWZhdWx0QWN0aW9uID0gJ2RlLWVtcGhhc2l6ZSc7XG4gICAgZWxzZSBpZiAocmVjb21tZW5kYXRpb24gPT09ICdPbWl0JykgICAgICAgICBkZWZhdWx0QWN0aW9uID0gJ2V4Y2x1ZGUnO1xuICAgIGVsc2UgaWYgKGlzUmVjb21tZW5kZWQpICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEFjdGlvbiA9ICdpbmNsdWRlJztcbiAgICB1c2VyU2VsZWN0aW9ucy5leHBlcmllbmNlc1tleHBJZF0gPSBzYXZlZEV4cERlY3NbZXhwSWRdIHx8IGRlZmF1bHRBY3Rpb247XG4gIH1cblxuICBfcmVuZGVyRXhwZXJpZW5jZVRhYmxlKGNvbnRhaW5lciwgcmVjb21tZW5kZWRTZXQsIGRhdGEsIG5ld1JlY29tbWVuZGVkRXhwcyk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBSZW5kZXIgdGFibGUgSFRNTCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gX3JlbmRlckV4cGVyaWVuY2VUYWJsZShjb250YWluZXIsIHJlY29tbWVuZGVkU2V0LCBkYXRhLCBuZXdSZWNvbW1lbmRlZEV4cHMgPSBuZXcgU2V0KCkpIHtcbiAgaWYgKCFjb250YWluZXIpIGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHBlcmllbmNlLXRhYmxlLWNvbnRhaW5lcicpO1xuICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuO1xuICBpZiAoIXJlY29tbWVuZGVkU2V0KSByZWNvbW1lbmRlZFNldCA9IG5ldyBTZXQoKHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zPy5yZWNvbW1lbmRlZF9leHBlcmllbmNlcykgfHwgW10pO1xuICBpZiAoIWRhdGEpIGRhdGEgPSB3aW5kb3cucGVuZGluZ1JlY29tbWVuZGF0aW9ucztcblxuICAvLyBEZXN0cm95IGFueSBleGlzdGluZyBEYXRhVGFibGUgYmVmb3JlIHJlYnVpbGRpbmdcbiAgaWYgKCQuZm4uRGF0YVRhYmxlLmlzRGF0YVRhYmxlKCcjZXhwZXJpZW5jZS1yZXZpZXctdGFibGUnKSkge1xuICAgICQoJyNleHBlcmllbmNlLXJldmlldy10YWJsZScpLkRhdGFUYWJsZSgpLmRlc3Ryb3koKTtcbiAgfVxuXG4gIGNvbnN0IGV4cHMgPSB3aW5kb3cuX2V4cGVyaWVuY2VzT3JkZXJlZCB8fCBbXTtcbiAgbGV0IHRhYmxlSFRNTCA9IGBcbiAgICA8dGFibGUgaWQ9XCJleHBlcmllbmNlLXJldmlldy10YWJsZVwiIGNsYXNzPVwicmV2aWV3LXRhYmxlXCI+XG4gICAgICA8dGhlYWQ+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8dGg+RXhwZXJpZW5jZTwvdGg+XG4gICAgICAgICAgPHRoPkRhdGVzPC90aD5cbiAgICAgICAgICA8dGg+UmVjb21tZW5kYXRpb248L3RoPlxuICAgICAgICAgIDx0aD5Db25maWRlbmNlPC90aD5cbiAgICAgICAgICA8dGg+UmVhc29uaW5nPC90aD5cbiAgICAgICAgICA8dGg+WW91ciBTZWxlY3Rpb248L3RoPlxuICAgICAgICA8L3RyPlxuICAgICAgPC90aGVhZD5cbiAgICAgIDx0Ym9keT5cbiAgYDtcblxuICBleHBzLmZvckVhY2goKHsgaWQ6IGV4cElkLCBkZXRhaWxzIH0sIHJvd0lkeCkgPT4ge1xuICAgIGNvbnN0IHJlY29tbWVuZGF0aW9uICAgID0gZ2V0RXhwZXJpZW5jZVJlY29tbWVuZGF0aW9uKGV4cElkLCBkYXRhKTtcbiAgICBjb25zdCBjb25maWRlbmNlICAgICAgICA9IGdldENvbmZpZGVuY2VMZXZlbChleHBJZCwgZGF0YSk7XG4gICAgY29uc3QgcmVhc29uaW5nICAgICAgICAgPSBnZXRFeHBlcmllbmNlUmVhc29uaW5nKGV4cElkLCBkYXRhKTtcbiAgICBjb25zdCByZWNSZWNvcmQgICAgICAgICA9IF9maW5kRXhwZXJpZW5jZVJlY29tbWVuZGF0aW9uUmVjb3JkKGV4cElkLCBkYXRhKTtcbiAgICBjb25zdCBidWxsZXRPcmRlciAgICAgICA9IHJlY1JlY29yZCAmJiB0eXBlb2YgcmVjUmVjb3JkLmJ1bGxldF9vcmRlciA9PT0gJ29iamVjdCcgPyByZWNSZWNvcmQuYnVsbGV0X29yZGVyIDogbnVsbDtcbiAgICBjb25zdCBidWxsZXRPcmRlclN1bW1hcnkgPSBfZm9ybWF0U3VnZ2VzdGVkT3JkZXJTdW1tYXJ5KGJ1bGxldE9yZGVyPy5vcmRlcik7XG4gICAgY29uc3QgdGl0bGUgICAgICAgICAgICAgPSBkZXRhaWxzID8gZGV0YWlscy50aXRsZSAgIDogZXhwSWQ7XG4gICAgY29uc3QgY29tcGFueSAgICAgICAgICAgPSBkZXRhaWxzID8gZGV0YWlscy5jb21wYW55IDogJyc7XG4gICAgY29uc3Qgc3RhcnREYXRlICAgICAgICAgPSBkZXRhaWxzPy5zdGFydF9kYXRlIHx8ICcnO1xuICAgIGNvbnN0IGVuZERhdGUgICAgICAgICAgID0gZGV0YWlscz8uZW5kX2RhdGUgICB8fCAncHJlc2VudCc7XG4gICAgY29uc3QgZHVyYXRpb24gICAgICAgICAgPSBzdGFydERhdGUgPyBgJHtzdGFydERhdGV9IC0gJHtlbmREYXRlfWAgOiAoZGV0YWlscz8uZHVyYXRpb24gfHwgJycpO1xuICAgIGNvbnN0IGRlZmF1bHRBY3Rpb24gICAgID0gdXNlclNlbGVjdGlvbnMuZXhwZXJpZW5jZXNbZXhwSWRdIHx8ICdpbmNsdWRlJztcbiAgICBjb25zdCByZWNvbW1lbmRhdGlvblRleHQgPSByZWNvbW1lbmRhdGlvbiB8fCAnSW5jbHVkZSc7XG4gICAgY29uc3QgY29uZmlkZW5jZUJhZGdlICAgPSBgPHNwYW4gY2xhc3M9XCJjb25maWRlbmNlLWJhZGdlIGNvbmZpZGVuY2UtJHtjb25maWRlbmNlLmxldmVsfVwiPiR7Y29uZmlkZW5jZS50ZXh0fTwvc3Bhbj5gO1xuICAgIGNvbnN0IHJlYXNvbmluZ1NlZ21lbnRzID0gW3JlYXNvbmluZyB8fCAnVGhpcyBleHBlcmllbmNlIHdhcyBzZWxlY3RlZCBiYXNlZCBvbiBpdHMgcmVsZXZhbmNlIHRvIHRoZSBwb3NpdGlvbiByZXF1aXJlbWVudHMuJ107XG4gICAgaWYgKGJ1bGxldE9yZGVyU3VtbWFyeSkgcmVhc29uaW5nU2VnbWVudHMucHVzaChgU3VnZ2VzdGVkIGJ1bGxldCBvcmRlcjogJHtidWxsZXRPcmRlclN1bW1hcnl9LmApO1xuICAgIGlmIChidWxsZXRPcmRlcj8ucmVhc29uaW5nKSByZWFzb25pbmdTZWdtZW50cy5wdXNoKFN0cmluZyhidWxsZXRPcmRlci5yZWFzb25pbmcpKTtcbiAgICBpZiAoYnVsbGV0T3JkZXI/LmF0c19pbXBhY3QpIHJlYXNvbmluZ1NlZ21lbnRzLnB1c2goYEFUUyBpbXBhY3Q6ICR7YnVsbGV0T3JkZXIuYXRzX2ltcGFjdH1gKTtcbiAgICBpZiAoYnVsbGV0T3JkZXI/LnBhZ2VfbGVuZ3RoX2ltcGFjdCkgcmVhc29uaW5nU2VnbWVudHMucHVzaChgUGFnZSBsZW5ndGggaW1wYWN0OiAke2J1bGxldE9yZGVyLnBhZ2VfbGVuZ3RoX2ltcGFjdH1gKTtcbiAgICBjb25zdCByZWFzb25pbmdUZXh0ICAgICA9IHJlYXNvbmluZ1NlZ21lbnRzLmpvaW4oJyAnKTtcbiAgICBjb25zdCBpc0ZpcnN0ICAgICAgICAgICA9IHJvd0lkeCA9PT0gMDtcbiAgICBjb25zdCBpc0xhc3QgICAgICAgICAgICA9IHJvd0lkeCA9PT0gZXhwcy5sZW5ndGggLSAxO1xuICAgIGNvbnN0IHRpdGxlRXNjICAgICAgICAgID0gZXNjYXBlSHRtbCh0aXRsZSk7XG4gICAgY29uc3QgcmVydW5OZXdCYWRnZSA9IG5ld1JlY29tbWVuZGVkRXhwcy5oYXMoZXhwSWQpXG4gICAgICA/ICc8c3BhbiBjbGFzcz1cInJ3LWNoYW5nZS1iYWRnZSBydy1jaGFuZ2UtbmV3XCIgYXJpYS1sYWJlbD1cIk5ldyByZWNvbW1lbmRhdGlvbiBzaW5jZSBwcmV2aW91cyBydW5cIj5cdUQ4M0NcdUREOTUgTmV3PC9zcGFuPidcbiAgICAgIDogJyc7XG5cbiAgICB0YWJsZUhUTUwgKz0gYFxuICAgICAgPHRyIGRhdGEtZXhwLWlkPVwiJHtleHBJZH1cIiBkYXRhLXN0YXJ0LWRhdGU9XCIke3N0YXJ0RGF0ZX1cIj5cbiAgICAgICAgPHRkPlxuICAgICAgICAgIDxzdHJvbmc+JHt0aXRsZUVzY308L3N0cm9uZz4ke3JlcnVuTmV3QmFkZ2V9PGJyPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtcIj4ke2VzY2FwZUh0bWwoY29tcGFueSl9PC9zcGFuPlxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJ3aGl0ZS1zcGFjZTpub3dyYXA7XCI+JHtlc2NhcGVIdG1sKGR1cmF0aW9uKX08L3RkPlxuICAgICAgICA8dGQ+PHN0cm9uZz4ke2VzY2FwZUh0bWwocmVjb21tZW5kYXRpb25UZXh0KX08L3N0cm9uZz48L3RkPlxuICAgICAgICA8dGQ+JHtjb25maWRlbmNlQmFkZ2V9PC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwibWF4LXdpZHRoOjMwMHB4O1wiPjxzbWFsbD4ke2VzY2FwZUh0bWwocmVhc29uaW5nVGV4dCl9PC9zbWFsbD48L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJhY3Rpb24tYnRuc1wiIHN0eWxlPVwid2hpdGUtc3BhY2U6bm93cmFwO1wiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0biAke2RlZmF1bHRBY3Rpb24gPT09ICdlbXBoYXNpemUnICAgID8gJ2FjdGl2ZScgOiAnJ31cIiBkYXRhLWFjdGlvbj1cImVtcGhhc2l6ZVwiICAgIGFyaWEtbGFiZWw9XCJFbXBoYXNpemUgJHt0aXRsZUVzY31cIiAgICAgICBhcmlhLXByZXNzZWQ9XCIke2RlZmF1bHRBY3Rpb24gPT09ICdlbXBoYXNpemUnfVwiICAgIHRpdGxlPVwiRW1waGFzaXplIFx1MjAxNCBmZWF0dXJlIHByb21pbmVudGx5XCIgc3R5bGU9XCJjb2xvcjojMTBiOTgxO1wiPlx1Mjc5NTwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0biAke2RlZmF1bHRBY3Rpb24gPT09ICdpbmNsdWRlJyAgICAgID8gJ2FjdGl2ZScgOiAnJ31cIiBkYXRhLWFjdGlvbj1cImluY2x1ZGVcIiAgICAgIGFyaWEtbGFiZWw9XCJJbmNsdWRlICR7dGl0bGVFc2N9XCIgICAgICAgICBhcmlhLXByZXNzZWQ9XCIke2RlZmF1bHRBY3Rpb24gPT09ICdpbmNsdWRlJ31cIiAgICAgIHRpdGxlPVwiSW5jbHVkZSBcdTIwMTQgc3RhbmRhcmQgdHJlYXRtZW50XCI+XHUyNzEzPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuICR7ZGVmYXVsdEFjdGlvbiA9PT0gJ2RlLWVtcGhhc2l6ZScgPyAnYWN0aXZlJyA6ICcnfVwiIGRhdGEtYWN0aW9uPVwiZGUtZW1waGFzaXplXCIgYXJpYS1sYWJlbD1cIkRlLWVtcGhhc2l6ZSAke3RpdGxlRXNjfVwiICAgIGFyaWEtcHJlc3NlZD1cIiR7ZGVmYXVsdEFjdGlvbiA9PT0gJ2RlLWVtcGhhc2l6ZSd9XCIgdGl0bGU9XCJEZS1lbXBoYXNpemUgXHUyMDE0IGJyaWVmIG1lbnRpb25cIiAgICBzdHlsZT1cImNvbG9yOiNmNTllMGI7XCI+XHUyNzk2PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuICR7ZGVmYXVsdEFjdGlvbiA9PT0gJ2V4Y2x1ZGUnICAgICAgPyAnYWN0aXZlJyA6ICcnfVwiIGRhdGEtYWN0aW9uPVwiZXhjbHVkZVwiICAgICAgYXJpYS1sYWJlbD1cIkV4Y2x1ZGUgJHt0aXRsZUVzY31cIiAgICAgICAgIGFyaWEtcHJlc3NlZD1cIiR7ZGVmYXVsdEFjdGlvbiA9PT0gJ2V4Y2x1ZGUnfVwiICAgICAgdGl0bGU9XCJFeGNsdWRlIFx1MjAxNCBvbWl0IGZyb20gQ1ZcIiAgICAgICAgICBzdHlsZT1cImNvbG9yOiNlZjQ0NDQ7XCI+JHtleWVTbGFzaEljb24oKX08L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBkYXRhLWFjdGlvbj1cInJlb3JkZXJcIiBhcmlhLWxhYmVsPVwiUmVvcmRlciBidWxsZXRzIGZvciAke3RpdGxlRXNjfVwiIHRpdGxlPVwiJHtidWxsZXRPcmRlclN1bW1hcnkgPyBgUmVvcmRlciBidWxsZXQgcG9pbnRzIChBSSBzdWdnZXN0ZWQgb3JkZXIgJHtidWxsZXRPcmRlclN1bW1hcnl9KWAgOiAnUmVvcmRlciBidWxsZXQgcG9pbnRzJ31cIiBzdHlsZT1cImNvbG9yOiM2MzY2ZjE7XCI+XHUyMTk1PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgZGF0YS1hY3Rpb249XCJyb3ctdXBcIiAgIGFyaWEtbGFiZWw9XCJNb3ZlICR7dGl0bGVFc2N9IGVhcmxpZXIgaW4gQ1ZcIiB0aXRsZT1cIk1vdmUgdXAgaW4gQ1ZcIiAgICR7aXNGaXJzdCA/ICdkaXNhYmxlZCcgOiAnJ30+XHUyMTkxPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgZGF0YS1hY3Rpb249XCJyb3ctZG93blwiIGFyaWEtbGFiZWw9XCJNb3ZlICR7dGl0bGVFc2N9IGxhdGVyIGluIENWXCIgICB0aXRsZT1cIk1vdmUgZG93biBpbiBDVlwiICR7aXNMYXN0ICA/ICdkaXNhYmxlZCcgOiAnJ30+XHUyMTkzPC9idXR0b24+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L3RyPlxuICAgIGA7XG4gIH0pO1xuXG4gIHRhYmxlSFRNTCArPSAnPC90Ym9keT48L3RhYmxlPic7XG4gIGNvbnRhaW5lci5pbm5lckhUTUwgPSB0YWJsZUhUTUw7XG5cbiAgLy8gRGVsZWdhdGVkIGNsaWNrIGhhbmRsZXJcbiAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJyNleHBlcmllbmNlLXJldmlldy10YWJsZSB0Ym9keScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGUgPT4ge1xuICAgIGNvbnN0IGJ0biA9IGUudGFyZ2V0LmNsb3Nlc3QoJy5pY29uLWJ0bicpO1xuICAgIGlmICghYnRuKSByZXR1cm47XG4gICAgY29uc3QgdHIgPSBidG4uY2xvc2VzdCgndHJbZGF0YS1leHAtaWRdJyk7XG4gICAgaWYgKCF0cikgcmV0dXJuO1xuICAgIGNvbnN0IGV4cElkICA9IHRyLmRhdGFzZXQuZXhwSWQ7XG4gICAgY29uc3QgYWN0aW9uID0gYnRuLmRhdGFzZXQuYWN0aW9uO1xuICAgIGlmIChhY3Rpb24gPT09ICdyZW9yZGVyJykge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGNvbnN0IHRpdGxlRWwgPSB0ci5xdWVyeVNlbGVjdG9yKCdzdHJvbmcnKTtcbiAgICAgIHNob3dCdWxsZXRSZW9yZGVyKGV4cElkLCB0aXRsZUVsID8gdGl0bGVFbC50ZXh0Q29udGVudCA6ICcnKTtcbiAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PT0gJ3Jvdy11cCcpIHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBtb3ZlRXhwZXJpZW5jZVJvdyhleHBJZCwgLTEpO1xuICAgIH0gZWxzZSBpZiAoYWN0aW9uID09PSAncm93LWRvd24nKSB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgbW92ZUV4cGVyaWVuY2VSb3coZXhwSWQsICsxKTtcbiAgICB9IGVsc2UgaWYgKGFjdGlvbikge1xuICAgICAgaGFuZGxlQWN0aW9uQ2xpY2soZXhwSWQsIGFjdGlvbiwgJ2V4cGVyaWVuY2UnKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIEJ1bGsgdG9vbGJhclxuICBjb25zdCBleHBUb29sYmFyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGV4cFRvb2xiYXIuY2xhc3NOYW1lID0gJ2J1bGstdG9vbGJhcic7XG4gIGV4cFRvb2xiYXIuaW5uZXJIVE1MID0gYFxuICAgIDxzcGFuPkJ1bGs6PC9zcGFuPlxuICAgIDxidXR0b24gY2xhc3M9XCJidWxrLWJ0biBidWxrLXJlY29tbWVuZGVkXCIgb25jbGljaz1cImJ1bGtBY3Rpb24oJ3JlY29tbWVuZGVkJywnZXhwZXJpZW5jZScpXCIgdGl0bGU9XCJTZXQgYWxsIHRvIHRoZSBMTE0gcmVjb21tZW5kYXRpb25cIj5cdTI3MjggQWNjZXB0IEFsbCBSZWNvbW1lbmRlZDwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJidWxrLWJ0biBidWxrLWVtcGhhc2l6ZVwiICAgb25jbGljaz1cImJ1bGtBY3Rpb24oJ2VtcGhhc2l6ZScsJ2V4cGVyaWVuY2UnKVwiPlx1Mjc5NSBFbXBoYXNpemUgQWxsPC9idXR0b24+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImJ1bGstYnRuIGJ1bGstaW5jbHVkZVwiICAgICBvbmNsaWNrPVwiYnVsa0FjdGlvbignaW5jbHVkZScsJ2V4cGVyaWVuY2UnKVwiPlx1MjcxMyBJbmNsdWRlIEFsbDwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJidWxrLWJ0biBidWxrLWV4Y2x1ZGVcIiAgICAgb25jbGljaz1cImJ1bGtBY3Rpb24oJ2V4Y2x1ZGUnLCdleHBlcmllbmNlJylcIj4ke2V5ZVNsYXNoSWNvbigpfSBFeGNsdWRlIEFsbDwvYnV0dG9uPlxuICBgO1xuICBjb250YWluZXIuaW5zZXJ0QmVmb3JlKGV4cFRvb2xiYXIsIGNvbnRhaW5lci5maXJzdENoaWxkKTtcblxuICAvLyBJbml0aWFsaXplIERhdGFUYWJsZSB3aXRoIG5vIGF1dG8tc29ydCAocm93cyBzdGF5IGluIHVzZXItc3BlY2lmaWVkIG9yZGVyKVxuICAkKCcjZXhwZXJpZW5jZS1yZXZpZXctdGFibGUnKS5EYXRhVGFibGUoe1xuICAgIHBhZ2luZzogZmFsc2UsXG4gICAgb3JkZXI6IFtdLFxuICAgIGxhbmd1YWdlOiB7IHNlYXJjaDogJ0ZpbHRlciBleHBlcmllbmNlczonIH1cbiAgfSk7XG4gIF91cGRhdGVQYWdlRXN0aW1hdGUoKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFJvdyByZW9yZGVyIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBtb3ZlRXhwZXJpZW5jZVJvdyhleHBJZCwgZGlyZWN0aW9uKSB7XG4gIGNvbnN0IGFyciA9IHdpbmRvdy5fZXhwZXJpZW5jZXNPcmRlcmVkO1xuICBpZiAoIWFycikgcmV0dXJuO1xuICBjb25zdCBpZHggPSBhcnIuZmluZEluZGV4KGUgPT4gZS5pZCA9PT0gZXhwSWQpO1xuICBpZiAoaWR4IDwgMCkgcmV0dXJuO1xuICBjb25zdCBuZXdJZHggPSBpZHggKyBkaXJlY3Rpb247XG4gIGlmIChuZXdJZHggPCAwIHx8IG5ld0lkeCA+PSBhcnIubGVuZ3RoKSByZXR1cm47XG4gIFthcnJbaWR4XSwgYXJyW25ld0lkeF1dID0gW2FycltuZXdJZHhdLCBhcnJbaWR4XV07XG4gIHdpbmRvdy5fZXhwZXJpZW5jZXNPcmRlcmVkID0gYXJyO1xuICBfcmVuZGVyRXhwZXJpZW5jZVRhYmxlKG51bGwsIG51bGwsIG51bGwpO1xuICAvLyBQZXJzaXN0IHRoZSBuZXcgb3JkZXIgdG8gdGhlIGJhY2tlbmQgKGZpcmUtYW5kLWZvcmdldDsgbm8gVUkgYmxvY2spXG4gIGZldGNoKCcvYXBpL3Jlb3JkZXItcm93cycsIHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHR5cGU6ICdleHBlcmllbmNlJywgb3JkZXJlZF9pZHM6IGFyci5tYXAoZSA9PiBlLmlkKSB9KVxuICB9KS5jYXRjaCgoKSA9PiB7fSk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBMZWdhY3kgaW50ZXJhY3RpdmUtbW9kZSByZXNwb25zZSBoYW5kbGVyIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVFeHBlcmllbmNlUmVzcG9uc2UobWVzc2FnZSkge1xuICB3aW5kb3cud2FpdGluZ0ZvckV4cGVyaWVuY2VSZXNwb25zZSA9IGZhbHNlO1xuICBjb25zdCByZXNwb25zZSA9IG1lc3NhZ2UudG9Mb3dlckNhc2UoKTtcblxuICBpZiAocmVzcG9uc2UuaW5jbHVkZXMoJ3llcycpKSB7XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ0dyZWF0ISBJXFwnbGwgaW5jbHVkZSB0aGlzIGV4cGVyaWVuY2UgcHJvbWluZW50bHkuJyk7XG4gIH0gZWxzZSBpZiAocmVzcG9uc2UuaW5jbHVkZXMoJ25vJykpIHtcbiAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCAnVW5kZXJzdG9vZC4gSVxcJ2xsIGV4Y2x1ZGUgdGhpcyBleHBlcmllbmNlIGZyb20gdGhlIGZpbmFsIENWLicpO1xuICB9IGVsc2UgaWYgKHJlc3BvbnNlLmluY2x1ZGVzKCdtYXliZScpKSB7XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ0lcXCdsbCBpbmNsdWRlIGl0IGJ1dCB3aXRoIGxlc3MgZW1waGFzaXMuJyk7XG4gIH0gZWxzZSB7XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ0lcXCdsbCBub3RlIHlvdXIgZmVlZGJhY2sgb24gdGhpcyBleHBlcmllbmNlLicpO1xuICB9XG5cbiAgLy8gTW92ZSB0byBuZXh0IGV4cGVyaWVuY2UgKGN1cnJlbnRJbmRleCBhbHJlYWR5IGluY3JlbWVudGVkIGluIHNob3dOZXh0RXhwZXJpZW5jZSlcbiAgc2V0VGltZW91dCgoKSA9PiBzaG93TmV4dEV4cGVyaWVuY2UoKSwgODAwKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFN1Ym1pdCBkZWNpc2lvbnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIHN1Ym1pdEV4cGVyaWVuY2VEZWNpc2lvbnMoKSB7XG4gIC8qIGR1Y2tmbG93OlxuICAgKiAgIGlkOiBleHBlcmllbmNlX3VpX3N1Ym1pdF9saXZlXG4gICAqICAga2luZDogdWlcbiAgICogICB0aW1lc3RhbXA6ICcyMDI2LTAzLTI1VDIxOjM5OjQ4WidcbiAgICogICBzdGF0dXM6IGxpdmVcbiAgICogICBoYW5kbGVzOlxuICAgKiAgIC0gdWk6ZXhwZXJpZW5jZS1yZXZpZXcuc3VibWl0XG4gICAqICAgY2FsbHM6XG4gICAqICAgLSBQT1NUIC9hcGkvcmV2aWV3LWRlY2lzaW9uc1xuICAgKiAgIC0gUE9TVCAvYXBpL2N2L2xheW91dC1lc3RpbWF0ZVxuICAgKiAgIHJlYWRzOlxuICAgKiAgIC0gd2luZG93OnVzZXJTZWxlY3Rpb25zLmV4cGVyaWVuY2VzXG4gICAqICAgd3JpdGVzOlxuICAgKiAgIC0gcmVxdWVzdDpQT1NUIC9hcGkvcmV2aWV3LWRlY2lzaW9ucy5kZWNpc2lvbnNcbiAgICogICAtIHdpbmRvdzpfc2F2ZWREZWNpc2lvbnMuZXhwZXJpZW5jZV9kZWNpc2lvbnNcbiAgICogICBub3RlczogUGVyc2lzdHMgcGVyLWV4cGVyaWVuY2UgaW5jbHVzaW9uIGRlY2lzaW9ucyBhbmQgdHJpZ2dlcnMgZG93bnN0cmVhbSBBVFMvbGF5b3V0IHJlZnJlc2hlcyB0aGF0IGRlcGVuZCBvbiB0aGUgc2FtZSByZXZpZXcgY2hvaWNlcy5cbiAgICovXG4gIGNvbnN0IGRlY2lzaW9ucyA9IHVzZXJTZWxlY3Rpb25zLmV4cGVyaWVuY2VzO1xuICBjb25zdCBjb3VudCA9IE9iamVjdC5rZXlzKGRlY2lzaW9ucykubGVuZ3RoO1xuXG4gIGlmIChjb3VudCA9PT0gMCkge1xuICAgIHNob3dBbGVydE1vZGFsKCdObyBTZWxlY3Rpb25zJywgJ1BsZWFzZSBzZWxlY3QgYWN0aW9ucyBmb3IgYXQgbGVhc3Qgb25lIGV4cGVyaWVuY2UgYmVmb3JlIHN1Ym1pdHRpbmcuJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3Jldmlldy1kZWNpc2lvbnMnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICB0eXBlOiAnZXhwZXJpZW5jZXMnLFxuICAgICAgICBkZWNpc2lvbnM6IGRlY2lzaW9uc1xuICAgICAgfSlcbiAgICB9KTtcblxuICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgc3RhdGVNYW5hZ2VyLm1hcmtDb250ZW50Q2hhbmdlZCgpO1xuICAgICAgc2hvd1RvYXN0KGBFeHBlcmllbmNlIGRlY2lzaW9ucyBzYXZlZCAoJHtjb3VudH0gaXRlbXMpYCk7XG4gICAgICBzY2hlZHVsZUF0c1JlZnJlc2goKTtcbiAgICAgIC8vIFBlcnNpc3Qgc2F2ZWQgZGVjaXNpb25zIGxvY2FsbHkgc28gdGhlIFVJIHJlZmxlY3RzIHRoZW0gaW1tZWRpYXRlbHlcbiAgICAgIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMgPSB3aW5kb3cuX3NhdmVkRGVjaXNpb25zIHx8IHt9O1xuICAgICAgd2luZG93Ll9zYXZlZERlY2lzaW9ucy5leHBlcmllbmNlX2RlY2lzaW9ucyA9IGRlY2lzaW9ucztcbiAgICAgIHVzZXJTZWxlY3Rpb25zLmV4cGVyaWVuY2VzID0geyAuLi5kZWNpc2lvbnMgfTtcbiAgICAgIGlmICh0eXBlb2YgdXBkYXRlSW5jbHVzaW9uQ291bnRzID09PSAnZnVuY3Rpb24nKSB1cGRhdGVJbmNsdXNpb25Db3VudHMoKTtcbiAgICAgIHN3aXRjaFRhYignYWNoLWVkaXRvcicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBlcnJvciA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIHNob3dUb2FzdChgRXJyb3I6ICR7ZXJyb3IuZXJyb3IgfHwgJ0ZhaWxlZCB0byBzYXZlIGRlY2lzaW9ucyd9YCwgJ2Vycm9yJyk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy5lcnJvcignRXJyb3Igc3VibWl0dGluZyBleHBlcmllbmNlIGRlY2lzaW9uczonLCBlcnJvcik7XG4gICAgc2hvd1RvYXN0KCdGYWlsZWQgdG8gc2F2ZSBkZWNpc2lvbnMuIFBsZWFzZSB0cnkgYWdhaW4uJywgJ2Vycm9yJyk7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIEV4cG9ydHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmV4cG9ydCB7XG4gIGdldEV4cGVyaWVuY2VEZXRhaWxzLFxuICBidWlsZEV4cGVyaWVuY2VSZXZpZXdUYWJsZSxcbiAgX3JlbmRlckV4cGVyaWVuY2VUYWJsZSxcbiAgbW92ZUV4cGVyaWVuY2VSb3csXG4gIGhhbmRsZUV4cGVyaWVuY2VSZXNwb25zZSxcbiAgc3VibWl0RXhwZXJpZW5jZURlY2lzaW9ucyxcbn07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9za2lsbHMtcmV2aWV3LmpzXG4gKiBTa2lsbHMtcmV2aWV3IHRhYmxlOiBmZXRjaCwgcmVuZGVyLCByb3ctcmVvcmRlciwgYW5kIHN1Ym1pdCBkZWNpc2lvbnMuXG4gKlxuICogRGVwZW5kZW5jaWVzIChyZXNvbHZlZCB0aHJvdWdoIGdsb2JhbFRoaXMgYXQgcnVudGltZSk6XG4gKiAgIHVzZXJTZWxlY3Rpb25zLCBwZW5kaW5nUmVjb21tZW5kYXRpb25zLCBfc2F2ZWREZWNpc2lvbnMsIF9za2lsbHNPcmRlcmVkLFxuICogICBfbmV3U2tpbGxzRnJvbUxMTSwgdGFiRGF0YSwgcGFyc2VTdGF0dXNSZXNwb25zZSxcbiAqICAgZ2V0U2tpbGxSZWNvbW1lbmRhdGlvbiwgZ2V0U2tpbGxDb25maWRlbmNlLCBnZXRTa2lsbFJlYXNvbmluZyxcbiAqICAgZXNjYXBlSHRtbCwgaGFuZGxlQWN0aW9uQ2xpY2ssIGJ1bGtBY3Rpb24sIF91cGRhdGVQYWdlRXN0aW1hdGUsXG4gKiAgIHVwZGF0ZUluY2x1c2lvbkNvdW50cywgc3dpdGNoVGFiLFxuICogICBzaG93QWxlcnRNb2RhbCwgc2hvd1RvYXN0LCBzY2hlZHVsZUF0c1JlZnJlc2gsXG4gKiAgICQsICQuZm4uRGF0YVRhYmxlIChqUXVlcnkgKyBEYXRhVGFibGVzKVxuICovXG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmNvbnN0IGxvZyA9IGdldExvZ2dlcignc2tpbGxzLXJldmlldycpO1xuXG5pbXBvcnQgeyBzdGF0ZU1hbmFnZXIgfSBmcm9tICcuL3N0YXRlLW1hbmFnZXIuanMnO1xuaW1wb3J0IHsgZXllU2xhc2hJY29uIH0gZnJvbSAnLi9yZXZpZXctaWNvbnMuanMnO1xuXG4vLyBcdTI1MDBcdTI1MDAgWWVhcnMtZnJvbS1leHBlcmllbmNlIGhlbHBlcnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIF9wYXJzZVllYXJGcm9tU3RyKHN0cikge1xuICBpZiAoIXN0cikgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHMgPSBTdHJpbmcoc3RyKS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgaWYgKFsnY3VycmVudCcsICdwcmVzZW50JywgJ25vdycsICdvbmdvaW5nJ10uaW5jbHVkZXMocykpIHJldHVybiBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCk7XG4gIGNvbnN0IG0gPSBzLm1hdGNoKC9cXGIoMTl8MjApXFxkezJ9XFxiLyk7XG4gIHJldHVybiBtID8gcGFyc2VJbnQobVswXSwgMTApIDogbnVsbDtcbn1cblxuLyoqXG4gKiBHaXZlbiBhIGxpc3Qgb2YgZXhwZXJpZW5jZSBJRHMgYW5kIHRoZSBmdWxsIGV4cGVyaWVuY2VzIGFycmF5LCByZXR1cm5cbiAqIHRoZSB0b3RhbCB5ZWFycyBvZiBleHBlcmllbmNlIChzdW0gb2YgZHVyYXRpb24gb2YgbWF0Y2hlZCBlbnRyaWVzKS5cbiAqIFJldHVybnMgbnVsbCBpZiBubyBtYXRjaGluZyBlbnRyaWVzIGZvdW5kLlxuICovXG5mdW5jdGlvbiBfY29tcHV0ZVllYXJzRnJvbUlkcyhpZHMsIGFsbEV4cGVyaWVuY2VzKSB7XG4gIGNvbnN0IGlkU2V0ID0gbmV3IFNldCgoaWRzIHx8IFtdKS5tYXAoeCA9PiBTdHJpbmcoeCkudHJpbSgpKS5maWx0ZXIoQm9vbGVhbikpO1xuICBpZiAoaWRTZXQuc2l6ZSA9PT0gMCkgcmV0dXJuIG51bGw7XG4gIGxldCB0b3RhbCA9IDA7XG4gIGNvbnN0IGN1cnJlbnRZZWFyID0gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpO1xuICBmb3IgKGNvbnN0IGV4cCBvZiAoYWxsRXhwZXJpZW5jZXMgfHwgW10pKSB7XG4gICAgaWYgKCFleHAgfHwgdHlwZW9mIGV4cCAhPT0gJ29iamVjdCcpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGV4cElkID0gU3RyaW5nKGV4cC5pZCB8fCAnJykudHJpbSgpO1xuICAgIGlmICghaWRTZXQuaGFzKGV4cElkKSkgY29udGludWU7XG4gICAgY29uc3Qgc3RhcnRZZWFyID0gX3BhcnNlWWVhckZyb21TdHIoZXhwLnN0YXJ0X2RhdGUgfHwgZXhwLnN0YXJ0KTtcbiAgICBjb25zdCBlbmRZZWFyICAgPSBfcGFyc2VZZWFyRnJvbVN0cihleHAuZW5kX2RhdGUgICB8fCBleHAuZW5kKSA/PyBjdXJyZW50WWVhcjtcbiAgICB0b3RhbCArPSBzdGFydFllYXIgPT0gbnVsbCA/IDEgOiBNYXRoLm1heCgxLCBlbmRZZWFyIC0gc3RhcnRZZWFyICsgMSk7XG4gIH1cbiAgcmV0dXJuIHRvdGFsID4gMCA/IHRvdGFsIDogbnVsbDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZVNraWxsR3JvdXBPdmVycmlkZShza2lsbE5hbWUsIGdyb3VwTmFtZSkge1xuICBjb25zdCBub3JtYWxpemVkR3JvdXAgPSBncm91cE5hbWUgPT0gbnVsbCA/IG51bGwgOiBTdHJpbmcoZ3JvdXBOYW1lKS50cmltKCkgfHwgbnVsbDtcbiAgY29uc3Qgc2sgPSAod2luZG93Ll9za2lsbHNPcmRlcmVkIHx8IFtdKS5maW5kKHMgPT4gKHR5cGVvZiBzID09PSAnc3RyaW5nJyA/IHMgOiBzLm5hbWUgfHwgcykgPT09IHNraWxsTmFtZSk7XG4gIGlmIChzayAmJiB0eXBlb2Ygc2sgPT09ICdvYmplY3QnKSBzay5ncm91cCA9IG5vcm1hbGl6ZWRHcm91cCB8fCAnJztcblxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3Jldmlldy1za2lsbC1ncm91cCcsIHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHNraWxsOiBza2lsbE5hbWUsIGdyb3VwOiBub3JtYWxpemVkR3JvdXAgfSksXG4gIH0pO1xuXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICBjb25zdCBlcnJvciA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3IuZXJyb3IgfHwgJ0ZhaWxlZCB0byBzYXZlIHNraWxsIGdyb3VwJyk7XG4gIH1cblxuICByZXR1cm4gcmVzcG9uc2U7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNhdmVTa2lsbENhdGVnb3J5T3ZlcnJpZGUoc2tpbGxOYW1lLCBjYXRlZ29yeU5hbWUpIHtcbiAgY29uc3Qgbm9ybWFsaXplZENhdGVnb3J5ID0gY2F0ZWdvcnlOYW1lID09IG51bGwgPyBudWxsIDogU3RyaW5nKGNhdGVnb3J5TmFtZSkudHJpbSgpIHx8IG51bGw7XG4gIGNvbnN0IHNrID0gKHdpbmRvdy5fc2tpbGxzT3JkZXJlZCB8fCBbXSkuZmluZChzID0+ICh0eXBlb2YgcyA9PT0gJ3N0cmluZycgPyBzIDogcy5uYW1lIHx8IHMpID09PSBza2lsbE5hbWUpO1xuICBpZiAoc2sgJiYgdHlwZW9mIHNrID09PSAnb2JqZWN0Jykge1xuICAgIGlmIChub3JtYWxpemVkQ2F0ZWdvcnkpIHNrLmNhdGVnb3J5ID0gbm9ybWFsaXplZENhdGVnb3J5O1xuICAgIGVsc2UgZGVsZXRlIHNrLmNhdGVnb3J5O1xuICB9XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9yZXZpZXctc2tpbGwtY2F0ZWdvcnknLCB7XG4gICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBza2lsbDogc2tpbGxOYW1lLCBjYXRlZ29yeTogbm9ybWFsaXplZENhdGVnb3J5IH0pLFxuICB9KTtcblxuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgY29uc3QgZXJyb3IgPSBhd2FpdCByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGVycm9yLmVycm9yIHx8ICdGYWlsZWQgdG8gc2F2ZSBza2lsbCBjYXRlZ29yeScpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3BvbnNlO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW5hbWVTa2lsbENhdGVnb3J5KG9sZENhdGVnb3J5LCBuZXdDYXRlZ29yeSkge1xuICBjb25zdCBub3JtYWxpemVkT2xkID0gU3RyaW5nKG9sZENhdGVnb3J5IHx8ICcnKS50cmltKCk7XG4gIGNvbnN0IG5vcm1hbGl6ZWROZXcgPSBTdHJpbmcobmV3Q2F0ZWdvcnkgfHwgJycpLnRyaW0oKTtcblxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3Jldmlldy1za2lsbC1jYXRlZ29yaWVzJywge1xuICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGFjdGlvbjogJ3JlbmFtZScsXG4gICAgICBvbGRfY2F0ZWdvcnk6IG5vcm1hbGl6ZWRPbGQsXG4gICAgICBuZXdfY2F0ZWdvcnk6IG5vcm1hbGl6ZWROZXcsXG4gICAgfSksXG4gIH0pO1xuXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICBjb25zdCBlcnJvciA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3IuZXJyb3IgfHwgJ0ZhaWxlZCB0byByZW5hbWUgc2tpbGwgY2F0ZWdvcnknKTtcbiAgfVxuXG4gIHJldHVybiByZXNwb25zZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZVNraWxsQ2F0ZWdvcnlPcmRlcihvcmRlcmVkQ2F0ZWdvcmllcykge1xuICBjb25zdCBub3JtYWxpemVkT3JkZXIgPSBBcnJheS5mcm9tKG5ldyBTZXQoXG4gICAgKG9yZGVyZWRDYXRlZ29yaWVzIHx8IFtdKVxuICAgICAgLm1hcChjYXRlZ29yeSA9PiBTdHJpbmcoY2F0ZWdvcnkgfHwgJycpLnRyaW0oKSlcbiAgICAgIC5maWx0ZXIoQm9vbGVhbiksXG4gICkpO1xuXG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvcmV2aWV3LXNraWxsLWNhdGVnb3JpZXMnLCB7XG4gICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgYWN0aW9uOiAncmVvcmRlcicsXG4gICAgICBvcmRlcmVkX2NhdGVnb3JpZXM6IG5vcm1hbGl6ZWRPcmRlcixcbiAgICB9KSxcbiAgfSk7XG5cbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIGNvbnN0IGVycm9yID0gYXdhaXQgcmVzcG9uc2UuanNvbigpLmNhdGNoKCgpID0+ICh7fSkpO1xuICAgIHRocm93IG5ldyBFcnJvcihlcnJvci5lcnJvciB8fCAnRmFpbGVkIHRvIHNhdmUgc2tpbGwgY2F0ZWdvcnkgb3JkZXInKTtcbiAgfVxuXG4gIHJldHVybiByZXNwb25zZTtcbn1cblxuZnVuY3Rpb24gX25vcm1hbGl6ZVNraWxsU3Vic2tpbGxzKHZhbHVlKSB7XG4gIGNvbnN0IHJhd1ZhbHVlcyA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBTdHJpbmcodmFsdWUgfHwgJycpLnNwbGl0KCcsJyk7XG4gIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQoXG4gICAgcmF3VmFsdWVzXG4gICAgICAubWFwKGl0ZW0gPT4gU3RyaW5nKGl0ZW0gfHwgJycpLnRyaW0oKSlcbiAgICAgIC5maWx0ZXIoQm9vbGVhbiksXG4gICkpO1xufVxuXG5mdW5jdGlvbiBfc2tpbGxOYW1lKHNraWxsKSB7XG4gIHJldHVybiB0eXBlb2Ygc2tpbGwgPT09ICdzdHJpbmcnID8gc2tpbGwgOiBTdHJpbmcoc2tpbGw/Lm5hbWUgfHwgc2tpbGwgfHwgJycpLnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gX25vcm1hbGl6ZUV4dHJhU2tpbGxFbnRyeShyYXdTa2lsbCwgeyB1c2VyQ3JlYXRlZCA9IGZhbHNlIH0gPSB7fSkge1xuICBpZiAodHlwZW9mIHJhd1NraWxsID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IG5hbWUgPSByYXdTa2lsbC50cmltKCk7XG4gICAgcmV0dXJuIG5hbWUgPyB7IG5hbWUsIF9pc05ldzogdHJ1ZSB9IDogbnVsbDtcbiAgfVxuICBpZiAoIXJhd1NraWxsIHx8IHR5cGVvZiByYXdTa2lsbCAhPT0gJ29iamVjdCcpIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IG5hbWUgPSBTdHJpbmcocmF3U2tpbGwubmFtZSB8fCAnJykudHJpbSgpO1xuICBpZiAoIW5hbWUpIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSB7XG4gICAgLi4ucmF3U2tpbGwsXG4gICAgbmFtZSxcbiAgICBfaXNOZXc6IHRydWUsXG4gIH07XG4gIGNvbnN0IHN1YnNraWxscyA9IF9ub3JtYWxpemVTa2lsbFN1YnNraWxscyhyYXdTa2lsbC5zdWJza2lsbHMgfHwgcmF3U2tpbGwuc3ViX3NraWxscyB8fCBbXSk7XG4gIGlmIChzdWJza2lsbHMubGVuZ3RoID4gMCkgbm9ybWFsaXplZC5zdWJza2lsbHMgPSBzdWJza2lsbHM7XG4gIGVsc2UgZGVsZXRlIG5vcm1hbGl6ZWQuc3Vic2tpbGxzO1xuXG4gIGlmICh1c2VyQ3JlYXRlZCB8fCByYXdTa2lsbC51c2VyX2NyZWF0ZWQgfHwgcmF3U2tpbGwuX2lzVXNlckNyZWF0ZWQpIHtcbiAgICBub3JtYWxpemVkLnVzZXJfY3JlYXRlZCA9IHRydWU7XG4gICAgbm9ybWFsaXplZC5faXNVc2VyQ3JlYXRlZCA9IHRydWU7XG4gIH1cblxuICByZXR1cm4gbm9ybWFsaXplZDtcbn1cblxuZnVuY3Rpb24gX3NraWxsSW5saW5lTGFiZWwoc2tpbGwpIHtcbiAgaWYgKCFza2lsbCB8fCB0eXBlb2Ygc2tpbGwgPT09ICdzdHJpbmcnKSByZXR1cm4gX3NraWxsTmFtZShza2lsbCk7XG4gIGNvbnN0IG5hbWUgPSBfc2tpbGxOYW1lKHNraWxsKTtcbiAgY29uc3QgcGFyZW50aGV0aWNhbCA9IFN0cmluZyhza2lsbC5wYXJlbnRoZXRpY2FsIHx8ICcnKS50cmltKCk7XG4gIGlmIChwYXJlbnRoZXRpY2FsKSByZXR1cm4gYCR7bmFtZX0gKCR7cGFyZW50aGV0aWNhbH0pYDtcblxuICBjb25zdCBxdWFsaWZpZXJQYXJ0cyA9IFtdO1xuICBjb25zdCBwcm9maWNpZW5jeSA9IFN0cmluZyhza2lsbC5wcm9maWNpZW5jeSB8fCAnJykudHJpbSgpO1xuICBpZiAocHJvZmljaWVuY3kpIHF1YWxpZmllclBhcnRzLnB1c2gocHJvZmljaWVuY3kuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBwcm9maWNpZW5jeS5zbGljZSgxKSk7XG4gIF9ub3JtYWxpemVTa2lsbFN1YnNraWxscyhza2lsbC5zdWJza2lsbHMgfHwgc2tpbGwuc3ViX3NraWxscyB8fCBbXSkuZm9yRWFjaChpdGVtID0+IHF1YWxpZmllclBhcnRzLnB1c2goaXRlbSkpO1xuICBpZiAocXVhbGlmaWVyUGFydHMubGVuZ3RoID4gMCkgcmV0dXJuIGAke25hbWV9ICgke3F1YWxpZmllclBhcnRzLmpvaW4oJywgJyl9KWA7XG4gIHJldHVybiBuYW1lO1xufVxuXG5mdW5jdGlvbiBfZmluZFNraWxsUmVjb21tZW5kYXRpb25SZWNvcmQoc2tpbGxOYW1lLCBkYXRhKSB7XG4gIGlmICghZGF0YSB8fCAhQXJyYXkuaXNBcnJheShkYXRhLnNraWxsX3JlY29tbWVuZGF0aW9ucykpIHJldHVybiBudWxsO1xuICByZXR1cm4gZGF0YS5za2lsbF9yZWNvbW1lbmRhdGlvbnMuZmluZCgocmVjKSA9PiB7XG4gICAgY29uc3QgcmVjTmFtZSA9IFN0cmluZyhyZWM/LnNraWxsIHx8IHJlYz8ubmFtZSB8fCAnJykudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIHJlY05hbWUgPT09IFN0cmluZyhza2lsbE5hbWUgfHwgJycpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICB9KSB8fCBudWxsO1xufVxuXG5mdW5jdGlvbiBfYnVpbGRTa2lsbEdyb3VwaW5nU3VnZ2VzdGlvbihyZWMsIHNraWxsKSB7XG4gIGNvbnN0IGdyb3VwaW5nID0gcmVjICYmIHR5cGVvZiByZWMuZ3JvdXBpbmcgPT09ICdvYmplY3QnID8gcmVjLmdyb3VwaW5nIDogbnVsbDtcbiAgaWYgKCFncm91cGluZykgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgY3VycmVudENhdGVnb3J5ID0gdHlwZW9mIHNraWxsID09PSAnb2JqZWN0JyA/IFN0cmluZyhza2lsbC5jYXRlZ29yeSB8fCAnJykudHJpbSgpIDogJyc7XG4gIGNvbnN0IGN1cnJlbnRHcm91cCA9IHR5cGVvZiBza2lsbCA9PT0gJ29iamVjdCcgPyBTdHJpbmcoc2tpbGwuZ3JvdXAgfHwgJycpLnRyaW0oKSA6ICcnO1xuICBjb25zdCBzdWdnZXN0ZWRDYXRlZ29yeSA9IFN0cmluZyhncm91cGluZy5jYXRlZ29yeSB8fCAnJykudHJpbSgpO1xuICBjb25zdCBzdWdnZXN0ZWRHcm91cCA9IFN0cmluZyhncm91cGluZy5ncm91cCB8fCAnJykudHJpbSgpO1xuICBjb25zdCBjYXRlZ29yeUNoYW5nZWQgPSBCb29sZWFuKHN1Z2dlc3RlZENhdGVnb3J5ICYmIHN1Z2dlc3RlZENhdGVnb3J5ICE9PSBjdXJyZW50Q2F0ZWdvcnkpO1xuICBjb25zdCBncm91cENoYW5nZWQgPSBCb29sZWFuKHN1Z2dlc3RlZEdyb3VwICYmIHN1Z2dlc3RlZEdyb3VwICE9PSBjdXJyZW50R3JvdXApO1xuXG4gIGlmICghY2F0ZWdvcnlDaGFuZ2VkICYmICFncm91cENoYW5nZWQpIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IGNoYW5nZVBhcnRzID0gW107XG4gIGlmIChjYXRlZ29yeUNoYW5nZWQpIHtcbiAgICBjaGFuZ2VQYXJ0cy5wdXNoKGBDYXRlZ29yeTogJHtjdXJyZW50Q2F0ZWdvcnkgfHwgJ1VuY2F0ZWdvcml6ZWQnfSAtPiAke3N1Z2dlc3RlZENhdGVnb3J5fWApO1xuICB9XG4gIGlmIChncm91cENoYW5nZWQpIHtcbiAgICBjaGFuZ2VQYXJ0cy5wdXNoKGBHcm91cDogJHtjdXJyZW50R3JvdXAgfHwgJ05vbmUnfSAtPiAke3N1Z2dlc3RlZEdyb3VwfWApO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBjYXRlZ29yeTogc3VnZ2VzdGVkQ2F0ZWdvcnksXG4gICAgZ3JvdXA6IHN1Z2dlc3RlZEdyb3VwLFxuICAgIGNhdGVnb3J5Q2hhbmdlZCxcbiAgICBncm91cENoYW5nZWQsXG4gICAgY2hhbmdlVGV4dDogY2hhbmdlUGFydHMuam9pbignIHwgJyksXG4gICAgcmVhc29uaW5nOiBTdHJpbmcoZ3JvdXBpbmcucmVhc29uaW5nIHx8ICcnKS50cmltKCksXG4gICAgYXRzSW1wYWN0OiBTdHJpbmcoZ3JvdXBpbmcuYXRzX2ltcGFjdCB8fCAnJykudHJpbSgpLFxuICAgIHBhZ2VMZW5ndGhJbXBhY3Q6IFN0cmluZyhncm91cGluZy5wYWdlX2xlbmd0aF9pbXBhY3QgfHwgJycpLnRyaW0oKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gX2Nzc0VzY2FwZSh2YWx1ZSkge1xuICBpZiAoZ2xvYmFsVGhpcy5DU1MgJiYgdHlwZW9mIGdsb2JhbFRoaXMuQ1NTLmVzY2FwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBnbG9iYWxUaGlzLkNTUy5lc2NhcGUoU3RyaW5nKHZhbHVlKSk7XG4gIH1cbiAgcmV0dXJuIFN0cmluZyh2YWx1ZSkucmVwbGFjZSgvXFxcXC9nLCAnXFxcXFxcXFwnKS5yZXBsYWNlKC9cIi9nLCAnXFxcXFwiJyk7XG59XG5cbmZ1bmN0aW9uIF9idWlsZEdyb3VwV2FybmluZ3Moc2tpbGxzKSB7XG4gIGNvbnN0IHdhcm5pbmdNYXAgPSBuZXcgTWFwKCk7XG4gIGNvbnN0IGdyb3VwcyA9IG5ldyBNYXAoKTtcbiAgZm9yIChjb25zdCBza2lsbCBvZiBza2lsbHMgfHwgW10pIHtcbiAgICBpZiAoIXNraWxsIHx8IHR5cGVvZiBza2lsbCAhPT0gJ29iamVjdCcpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHNraWxsTmFtZSA9IF9za2lsbE5hbWUoc2tpbGwpO1xuICAgIGNvbnN0IGdyb3VwTmFtZSA9IFN0cmluZyhza2lsbC5ncm91cCB8fCAnJykudHJpbSgpO1xuICAgIGlmICghc2tpbGxOYW1lIHx8ICFncm91cE5hbWUpIGNvbnRpbnVlO1xuICAgIGlmICghZ3JvdXBzLmhhcyhncm91cE5hbWUpKSBncm91cHMuc2V0KGdyb3VwTmFtZSwgW10pO1xuICAgIGdyb3Vwcy5nZXQoZ3JvdXBOYW1lKS5wdXNoKF9za2lsbElubGluZUxhYmVsKHNraWxsKSk7XG4gIH1cblxuICBncm91cHMuZm9yRWFjaCgobGFiZWxzLCBncm91cE5hbWUpID0+IHtcbiAgICBjb25zdCBwcmV2aWV3ID0gbGFiZWxzLmpvaW4oJywgJyk7XG4gICAgY29uc3QgY3Jvd2RlZCA9IHByZXZpZXcubGVuZ3RoID49IDkwIHx8IGxhYmVscy5sZW5ndGggPj0gNTtcbiAgICBpZiAoIWNyb3dkZWQpIHJldHVybjtcbiAgICB3YXJuaW5nTWFwLnNldChncm91cE5hbWUsIHtcbiAgICAgIHByZXZpZXcsXG4gICAgICBtZW1iZXJDb3VudDogbGFiZWxzLmxlbmd0aCxcbiAgICAgIG1lc3NhZ2U6IGBJbmxpbmUgYnVsbGV0IG1heSBiZSBoYXJkIHRvIHNjYW4gKCR7bGFiZWxzLmxlbmd0aH0gc2tpbGxzLCAke3ByZXZpZXcubGVuZ3RofSBjaGFycykuYCxcbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHdhcm5pbmdNYXA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNhdmVTa2lsbFF1YWxpZmllck92ZXJyaWRlKHNraWxsTmFtZSwgcXVhbGlmaWVycykge1xuICBjb25zdCBub3JtYWxpemVkU2tpbGwgPSBTdHJpbmcoc2tpbGxOYW1lIHx8ICcnKS50cmltKCk7XG4gIGlmICghbm9ybWFsaXplZFNraWxsKSB0aHJvdyBuZXcgRXJyb3IoJ1NraWxsIG5hbWUgaXMgcmVxdWlyZWQnKTtcblxuICBjb25zdCBub3JtYWxpemVkUHJvZmljaWVuY3kgPSBTdHJpbmcocXVhbGlmaWVycz8ucHJvZmljaWVuY3kgfHwgJycpLnRyaW0oKTtcbiAgY29uc3Qgbm9ybWFsaXplZFN1YnNraWxscyA9IF9ub3JtYWxpemVTa2lsbFN1YnNraWxscyhxdWFsaWZpZXJzPy5zdWJza2lsbHMpO1xuICBjb25zdCBub3JtYWxpemVkUGFyZW50aGV0aWNhbCA9IFN0cmluZyhxdWFsaWZpZXJzPy5wYXJlbnRoZXRpY2FsIHx8ICcnKS50cmltKCk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRTa2lsbFR5cGUgPSBTdHJpbmcocXVhbGlmaWVycz8uc2tpbGxfdHlwZSB8fCAnJykudHJpbSgpLnRvTG93ZXJDYXNlKCkgfHwgbnVsbDtcblxuICBjb25zdCBzayA9ICh3aW5kb3cuX3NraWxsc09yZGVyZWQgfHwgW10pLmZpbmQocyA9PiAodHlwZW9mIHMgPT09ICdzdHJpbmcnID8gcyA6IHMubmFtZSB8fCBzKSA9PT0gbm9ybWFsaXplZFNraWxsKTtcbiAgaWYgKHNrICYmIHR5cGVvZiBzayA9PT0gJ29iamVjdCcpIHtcbiAgICBpZiAobm9ybWFsaXplZFByb2ZpY2llbmN5KSBzay5wcm9maWNpZW5jeSA9IG5vcm1hbGl6ZWRQcm9maWNpZW5jeTtcbiAgICBlbHNlIGRlbGV0ZSBzay5wcm9maWNpZW5jeTtcblxuICAgIGlmIChub3JtYWxpemVkU3Vic2tpbGxzLmxlbmd0aCA+IDApIHNrLnN1YnNraWxscyA9IG5vcm1hbGl6ZWRTdWJza2lsbHM7XG4gICAgZWxzZSBkZWxldGUgc2suc3Vic2tpbGxzO1xuXG4gICAgaWYgKG5vcm1hbGl6ZWRQYXJlbnRoZXRpY2FsKSBzay5wYXJlbnRoZXRpY2FsID0gbm9ybWFsaXplZFBhcmVudGhldGljYWw7XG4gICAgZWxzZSBkZWxldGUgc2sucGFyZW50aGV0aWNhbDtcbiAgfVxuXG4gIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgc2tpbGw6IG5vcm1hbGl6ZWRTa2lsbCxcbiAgICBwcm9maWNpZW5jeTogbm9ybWFsaXplZFByb2ZpY2llbmN5LFxuICAgIHN1YnNraWxsczogbm9ybWFsaXplZFN1YnNraWxscyxcbiAgICBwYXJlbnRoZXRpY2FsOiBub3JtYWxpemVkUGFyZW50aGV0aWNhbCxcbiAgfTtcbiAgaWYgKCdza2lsbF90eXBlJyBpbiAocXVhbGlmaWVycyB8fCB7fSkpIHtcbiAgICBwYXlsb2FkLnNraWxsX3R5cGUgPSBub3JtYWxpemVkU2tpbGxUeXBlO1xuICB9XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9yZXZpZXctc2tpbGwtcXVhbGlmaWVycycsIHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeShwYXlsb2FkKSxcbiAgfSk7XG5cbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIGNvbnN0IGVycm9yID0gYXdhaXQgcmVzcG9uc2UuanNvbigpLmNhdGNoKCgpID0+ICh7fSkpO1xuICAgIHRocm93IG5ldyBFcnJvcihlcnJvci5lcnJvciB8fCAnRmFpbGVkIHRvIHNhdmUgc2tpbGwgcXVhbGlmaWVycycpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3BvbnNlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzYXZlVXNlckNyZWF0ZWRTa2lsbChza2lsbCkge1xuICBjb25zdCBwYXlsb2FkID0ge1xuICAgIG5hbWU6IFN0cmluZyhza2lsbD8ubmFtZSB8fCAnJykudHJpbSgpLFxuICAgIGNhdGVnb3J5OiBTdHJpbmcoc2tpbGw/LmNhdGVnb3J5IHx8ICcnKS50cmltKCksXG4gICAgZ3JvdXA6IFN0cmluZyhza2lsbD8uZ3JvdXAgfHwgJycpLnRyaW0oKSxcbiAgICBwcm9maWNpZW5jeTogU3RyaW5nKHNraWxsPy5wcm9maWNpZW5jeSB8fCAnJykudHJpbSgpLFxuICAgIHN1YnNraWxsczogX25vcm1hbGl6ZVNraWxsU3Vic2tpbGxzKHNraWxsPy5zdWJza2lsbHMpLFxuICAgIHBhcmVudGhldGljYWw6IFN0cmluZyhza2lsbD8ucGFyZW50aGV0aWNhbCB8fCAnJykudHJpbSgpLFxuICB9O1xuICBpZiAoIXBheWxvYWQubmFtZSkgdGhyb3cgbmV3IEVycm9yKCdTa2lsbCBuYW1lIGlzIHJlcXVpcmVkJyk7XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9yZXZpZXctc2tpbGwtYWRkJywge1xuICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpLFxuICB9KTtcblxuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgY29uc3QgZXJyb3IgPSBhd2FpdCByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGVycm9yLmVycm9yIHx8ICdGYWlsZWQgdG8gYWRkIHNraWxsJyk7XG4gIH1cblxuICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBfbm9ybWFsaXplRXh0cmFTa2lsbEVudHJ5KHJlc3VsdC5za2lsbCwgeyB1c2VyQ3JlYXRlZDogdHJ1ZSB9KTtcbiAgaWYgKCFub3JtYWxpemVkKSB0aHJvdyBuZXcgRXJyb3IoJ1NlcnZlciBkaWQgbm90IHJldHVybiBhIHNraWxsJyk7XG5cbiAgY29uc3QgY3VycmVudCA9IEFycmF5LmlzQXJyYXkod2luZG93Ll9za2lsbHNPcmRlcmVkKSA/IHdpbmRvdy5fc2tpbGxzT3JkZXJlZCA6IFtdO1xuICB3aW5kb3cuX3NraWxsc09yZGVyZWQgPSBbbm9ybWFsaXplZCwgLi4uY3VycmVudC5maWx0ZXIoc2tpbGwgPT4gX3NraWxsTmFtZShza2lsbCkgIT09IG5vcm1hbGl6ZWQubmFtZSldO1xuXG4gIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMgPSB3aW5kb3cuX3NhdmVkRGVjaXNpb25zIHx8IHt9O1xuICBjb25zdCBleGlzdGluZ0V4dHJhcyA9IEFycmF5LmlzQXJyYXkod2luZG93Ll9zYXZlZERlY2lzaW9ucy5leHRyYV9za2lsbHMpXG4gICAgPyB3aW5kb3cuX3NhdmVkRGVjaXNpb25zLmV4dHJhX3NraWxsc1xuICAgIDogW107XG4gIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMuZXh0cmFfc2tpbGxzID0gW1xuICAgIG5vcm1hbGl6ZWQsXG4gICAgLi4uZXhpc3RpbmdFeHRyYXMuZmlsdGVyKHNraWxsID0+IF9za2lsbE5hbWUoc2tpbGwpICE9PSBub3JtYWxpemVkLm5hbWUpLFxuICBdO1xuXG4gIHVzZXJTZWxlY3Rpb25zLnNraWxsc1tub3JtYWxpemVkLm5hbWVdID0gdXNlclNlbGVjdGlvbnMuc2tpbGxzW25vcm1hbGl6ZWQubmFtZV0gfHwgJ2luY2x1ZGUnO1xuICByZXR1cm4gbm9ybWFsaXplZDtcbn1cblxuZnVuY3Rpb24gX2VmZmVjdGl2ZVNraWxsQ2F0ZWdvcnkoc2tpbGwpIHtcbiAgaWYgKCFza2lsbCB8fCB0eXBlb2Ygc2tpbGwgPT09ICdzdHJpbmcnKSByZXR1cm4gJyc7XG4gIHJldHVybiBTdHJpbmcoc2tpbGwuY2F0ZWdvcnkgfHwgJycpLnRyaW0oKSB8fCAnR2VuZXJhbCc7XG59XG5cbmZ1bmN0aW9uIF9zeW5jU2tpbGxDYXRlZ29yeU9yZGVyKCkge1xuICBjb25zdCBza2lsbHMgPSBBcnJheS5pc0FycmF5KHdpbmRvdy5fc2tpbGxzT3JkZXJlZCkgPyB3aW5kb3cuX3NraWxsc09yZGVyZWQgOiBbXTtcbiAgY29uc3Qgb3JkZXJlZCA9IFtdO1xuICBmb3IgKGNvbnN0IHNraWxsIG9mIHNraWxscykge1xuICAgIGNvbnN0IGNhdGVnb3J5ID0gX2VmZmVjdGl2ZVNraWxsQ2F0ZWdvcnkoc2tpbGwpO1xuICAgIGlmIChjYXRlZ29yeSAmJiAhb3JkZXJlZC5pbmNsdWRlcyhjYXRlZ29yeSkpIG9yZGVyZWQucHVzaChjYXRlZ29yeSk7XG4gIH1cbiAgd2luZG93Ll9za2lsbENhdGVnb3J5T3JkZXIgPSBvcmRlcmVkO1xuICByZXR1cm4gb3JkZXJlZDtcbn1cblxuZnVuY3Rpb24gX3JlbmFtZVNraWxsQ2F0ZWdvcnlMb2NhbGx5KG9sZENhdGVnb3J5LCBuZXdDYXRlZ29yeSkge1xuICBjb25zdCBub3JtYWxpemVkT2xkID0gU3RyaW5nKG9sZENhdGVnb3J5IHx8ICcnKS50cmltKCk7XG4gIGNvbnN0IG5vcm1hbGl6ZWROZXcgPSBTdHJpbmcobmV3Q2F0ZWdvcnkgfHwgJycpLnRyaW0oKTtcbiAgaWYgKCFub3JtYWxpemVkT2xkIHx8ICFub3JtYWxpemVkTmV3KSByZXR1cm47XG5cbiAgZm9yIChjb25zdCBza2lsbCBvZiAod2luZG93Ll9za2lsbHNPcmRlcmVkIHx8IFtdKSkge1xuICAgIGlmICghc2tpbGwgfHwgdHlwZW9mIHNraWxsICE9PSAnb2JqZWN0JykgY29udGludWU7XG4gICAgaWYgKF9lZmZlY3RpdmVTa2lsbENhdGVnb3J5KHNraWxsKSA9PT0gbm9ybWFsaXplZE9sZCkge1xuICAgICAgc2tpbGwuY2F0ZWdvcnkgPSBub3JtYWxpemVkTmV3O1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGN1cnJlbnRPcmRlciA9IEFycmF5LmlzQXJyYXkod2luZG93Ll9za2lsbENhdGVnb3J5T3JkZXIpXG4gICAgPyB3aW5kb3cuX3NraWxsQ2F0ZWdvcnlPcmRlclxuICAgIDogX3N5bmNTa2lsbENhdGVnb3J5T3JkZXIoKTtcbiAgd2luZG93Ll9za2lsbENhdGVnb3J5T3JkZXIgPSBjdXJyZW50T3JkZXIubWFwKGNhdGVnb3J5ID0+IChcbiAgICBjYXRlZ29yeSA9PT0gbm9ybWFsaXplZE9sZCA/IG5vcm1hbGl6ZWROZXcgOiBjYXRlZ29yeVxuICApKS5maWx0ZXIoKGNhdGVnb3J5LCBpbmRleCwgYXJyKSA9PiBjYXRlZ29yeSAmJiBhcnIuaW5kZXhPZihjYXRlZ29yeSkgPT09IGluZGV4KTtcbn1cblxuZnVuY3Rpb24gX21vdmVTa2lsbENhdGVnb3J5TG9jYWxseShjYXRlZ29yeU5hbWUsIGRpcmVjdGlvbikge1xuICBjb25zdCBub3JtYWxpemVkQ2F0ZWdvcnkgPSBTdHJpbmcoY2F0ZWdvcnlOYW1lIHx8ICcnKS50cmltKCk7XG4gIGNvbnN0IG9yZGVyID0gQXJyYXkuaXNBcnJheSh3aW5kb3cuX3NraWxsQ2F0ZWdvcnlPcmRlcilcbiAgICA/IFsuLi53aW5kb3cuX3NraWxsQ2F0ZWdvcnlPcmRlcl1cbiAgICA6IF9zeW5jU2tpbGxDYXRlZ29yeU9yZGVyKCk7XG4gIGNvbnN0IGluZGV4ID0gb3JkZXIuaW5kZXhPZihub3JtYWxpemVkQ2F0ZWdvcnkpO1xuICBpZiAoaW5kZXggPCAwKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgbmV4dEluZGV4ID0gaW5kZXggKyBkaXJlY3Rpb247XG4gIGlmIChuZXh0SW5kZXggPCAwIHx8IG5leHRJbmRleCA+PSBvcmRlci5sZW5ndGgpIHJldHVybiBudWxsO1xuICBbb3JkZXJbaW5kZXhdLCBvcmRlcltuZXh0SW5kZXhdXSA9IFtvcmRlcltuZXh0SW5kZXhdLCBvcmRlcltpbmRleF1dO1xuICB3aW5kb3cuX3NraWxsQ2F0ZWdvcnlPcmRlciA9IG9yZGVyO1xuICByZXR1cm4gb3JkZXI7XG59XG5cbmZ1bmN0aW9uIF9idWlsZFNraWxsQ2F0ZWdvcnlNYW5hZ2VySHRtbCgpIHtcbiAgY29uc3QgY2F0ZWdvcmllcyA9IEFycmF5LmlzQXJyYXkod2luZG93Ll9za2lsbENhdGVnb3J5T3JkZXIpXG4gICAgPyB3aW5kb3cuX3NraWxsQ2F0ZWdvcnlPcmRlclxuICAgIDogX3N5bmNTa2lsbENhdGVnb3J5T3JkZXIoKTtcbiAgaWYgKGNhdGVnb3JpZXMubGVuZ3RoID09PSAwKSByZXR1cm4gJyc7XG5cbiAgcmV0dXJuIGBcbiAgICA8ZGl2IGNsYXNzPVwic2tpbGwtY2F0ZWdvcnktbWFuYWdlclwiIHN0eWxlPVwibWFyZ2luOjAgMCAxMnB4O3BhZGRpbmc6MTJweDtib3JkZXI6MXB4IHNvbGlkICNlNWU3ZWI7Ym9yZGVyLXJhZGl1czoxMHB4O2JhY2tncm91bmQ6I2Y4ZmFmYztcIj5cbiAgICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo4cHg7XCI+Q2F0ZWdvcnkgTGF5b3V0PC9kaXY+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtnYXA6OHB4O1wiPlxuICAgICAgICAke2NhdGVnb3JpZXMubWFwKChjYXRlZ29yeSwgaW5kZXgpID0+IGBcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2tpbGwtY2F0ZWdvcnktbWFuYWdlci1yb3dcIiBkYXRhLWNhdGVnb3J5PVwiJHtlc2NhcGVIdG1sKGNhdGVnb3J5KX1cIiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6OHB4O2FsaWduLWl0ZW1zOmNlbnRlcjtcIj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwic2tpbGwtY2F0ZWdvcnktbWFuYWdlci1pbnB1dFwiXG4gICAgICAgICAgICAgIHZhbHVlPVwiJHtlc2NhcGVIdG1sKGNhdGVnb3J5KX1cIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiUmVuYW1lIHNraWxsIGNhdGVnb3J5ICR7ZXNjYXBlSHRtbChjYXRlZ29yeSl9XCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJmbGV4OjE7bWluLXdpZHRoOjA7cGFkZGluZzo2cHggOHB4O2JvcmRlcjoxcHggc29saWQgI2QxZDVkYjtib3JkZXItcmFkaXVzOjZweDtcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIGRhdGEtYWN0aW9uPVwiY2F0ZWdvcnktdXBcIiBkYXRhLWNhdGVnb3J5PVwiJHtlc2NhcGVIdG1sKGNhdGVnb3J5KX1cIiBhcmlhLWxhYmVsPVwiTW92ZSAke2VzY2FwZUh0bWwoY2F0ZWdvcnkpfSBjYXRlZ29yeSB1cFwiIHRpdGxlPVwiTW92ZSBjYXRlZ29yeSB1cFwiICR7aW5kZXggPT09IDAgPyAnZGlzYWJsZWQnIDogJyd9Plx1MjE5MTwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgZGF0YS1hY3Rpb249XCJjYXRlZ29yeS1kb3duXCIgZGF0YS1jYXRlZ29yeT1cIiR7ZXNjYXBlSHRtbChjYXRlZ29yeSl9XCIgYXJpYS1sYWJlbD1cIk1vdmUgJHtlc2NhcGVIdG1sKGNhdGVnb3J5KX0gY2F0ZWdvcnkgZG93blwiIHRpdGxlPVwiTW92ZSBjYXRlZ29yeSBkb3duXCIgJHtpbmRleCA9PT0gY2F0ZWdvcmllcy5sZW5ndGggLSAxID8gJ2Rpc2FibGVkJyA6ICcnfT5cdTIxOTM8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgYCkuam9pbignJyl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYDtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFJlcnVuIHNuYXBzaG90IChjaGFuZ2UgYmFkZ2UgZm9yIHNraWxscykgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5mdW5jdGlvbiBfc2tpbGxTbmFwc2hvdEtleSgpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzaWQgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpLmdldCgnc2Vzc2lvbicpO1xuICAgIHJldHVybiBzaWQgPyBgc2tpbGxfc25hcF8ke3NpZH1gIDogbnVsbDtcbiAgfSBjYXRjaCAoXykgeyByZXR1cm4gbnVsbDsgfVxufVxuZnVuY3Rpb24gX3NhdmVTa2lsbFNuYXBzaG90KHJlY29tbWVuZGVkTmFtZXMpIHtcbiAgY29uc3Qga2V5ID0gX3NraWxsU25hcHNob3RLZXkoKTtcbiAgaWYgKCFrZXkpIHJldHVybjtcbiAgdHJ5IHsgbG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCBKU09OLnN0cmluZ2lmeShbLi4ucmVjb21tZW5kZWROYW1lc10pKTsgfSBjYXRjaCAoXykge31cbn1cbmZ1bmN0aW9uIF9nZXRTa2lsbFNuYXBzaG90KCkge1xuICBjb25zdCBrZXkgPSBfc2tpbGxTbmFwc2hvdEtleSgpO1xuICBpZiAoIWtleSkgcmV0dXJuIG51bGw7XG4gIHRyeSB7XG4gICAgY29uc3QgcmF3ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KTtcbiAgICByZXR1cm4gcmF3ID8gbmV3IFNldChKU09OLnBhcnNlKHJhdykpIDogbnVsbDtcbiAgfSBjYXRjaCAoXykgeyByZXR1cm4gbnVsbDsgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgQnVpbGQgcmV2aWV3IHRhYmxlIChmZXRjaCArIGluaXRpYWxpc2UpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBidWlsZFNraWxsc1Jldmlld1RhYmxlKCkge1xuICBjb25zdCBkYXRhID0gd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnM7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbHMtdGFibGUtY29udGFpbmVyJyk7XG5cbiAgLy8gQnVpbGQgc2tpbGwtdHlwZSBsb29rdXAgZnJvbSBqb2IgYW5hbHlzaXMgKGF2YWlsYWJsZSBpbiB0YWJEYXRhLmFuYWx5c2lzKVxuICBjb25zdCBqb2JBbmFseXNpcyA9IHN0YXRlTWFuYWdlci5nZXRUYWJEYXRhKCdhbmFseXNpcycpIHx8IHt9O1xuICBjb25zdCBoYXJkU2tpbGxTZXQgPSBuZXcgU2V0KChqb2JBbmFseXNpcy5yZXF1aXJlZF9za2lsbHMgICAgfHwgW10pLm1hcChzID0+IHMudG9Mb3dlckNhc2UoKSkpO1xuICBjb25zdCBzb2Z0U2tpbGxTZXQgPSBuZXcgU2V0KChqb2JBbmFseXNpcy5uaWNlX3RvX2hhdmVfc2tpbGxzIHx8IFtdKS5tYXAocyA9PiBzLnRvTG93ZXJDYXNlKCkpKTtcblxuICAvLyBHZXQgYWxsIHNraWxscyBmcm9tIHRoZSBBUEkgc3RhdHVzXG4gIGxldCBhbGxTa2lsbHMgPSBbXTtcbiAgbGV0IHBlcnNpc3RlZEV4dHJhU2tpbGxzID0gW107XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdHVzUmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvc3RhdHVzJyk7XG4gICAgY29uc3Qgc3RhdHVzRGF0YSA9IHBhcnNlU3RhdHVzUmVzcG9uc2UoYXdhaXQgc3RhdHVzUmVzLmpzb24oKSk7XG4gICAgYWxsU2tpbGxzID0gc3RhdHVzRGF0YS5hbGxfc2tpbGxzIHx8IFtdO1xuICAgIHBlcnNpc3RlZEV4dHJhU2tpbGxzID0gc3RhdHVzRGF0YS5leHRyYV9za2lsbHMgfHwgW107XG4gICAgd2luZG93Ll9hbGxFeHBlcmllbmNlcyA9IHN0YXR1c0RhdGEuYWxsX2V4cGVyaWVuY2VzIHx8IFtdO1xuICAgIGNvbnN0IHF1YWxPdmVycmlkZXMgPSBzdGF0dXNEYXRhLnNraWxsX3F1YWxpZmllcl9vdmVycmlkZXMgfHwge307XG4gICAgd2luZG93Ll9za2lsbFR5cGVPdmVycmlkZXMgPSB3aW5kb3cuX3NraWxsVHlwZU92ZXJyaWRlcyB8fCB7fTtcbiAgICBmb3IgKGNvbnN0IFtza2lsbE5hbWUsIG92ZXJyaWRlc10gb2YgT2JqZWN0LmVudHJpZXMocXVhbE92ZXJyaWRlcykpIHtcbiAgICAgIGlmIChvdmVycmlkZXMgJiYgb3ZlcnJpZGVzLnNraWxsX3R5cGUpIHtcbiAgICAgICAgd2luZG93Ll9za2lsbFR5cGVPdmVycmlkZXNbc2tpbGxOYW1lLnRvTG93ZXJDYXNlKCldID0gb3ZlcnJpZGVzLnNraWxsX3R5cGU7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy5lcnJvcignRXJyb3IgZmV0Y2hpbmcgYWxsIHNraWxsczonLCBlcnJvcik7XG4gICAgLy8gRmFsbGJhY2sgdG8ganVzdCByZWNvbW1lbmRlZCBza2lsbHNcbiAgICBhbGxTa2lsbHMgPSBkYXRhLnJlY29tbWVuZGVkX3NraWxscyB8fCBbXTtcbiAgICB3aW5kb3cuX2FsbEV4cGVyaWVuY2VzID0gW107XG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkUGVyc2lzdGVkRXh0cmFTa2lsbHMgPSAocGVyc2lzdGVkRXh0cmFTa2lsbHMgfHwgW10pXG4gICAgLm1hcChza2lsbCA9PiBfbm9ybWFsaXplRXh0cmFTa2lsbEVudHJ5KHNraWxsLCB7XG4gICAgICB1c2VyQ3JlYXRlZDogdHlwZW9mIHNraWxsID09PSAnb2JqZWN0JyAmJiAhIXNraWxsPy51c2VyX2NyZWF0ZWQsXG4gICAgfSkpXG4gICAgLmZpbHRlcihCb29sZWFuKTtcbiAgaWYgKG5vcm1hbGl6ZWRQZXJzaXN0ZWRFeHRyYVNraWxscy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgbWVyZ2VkU2tpbGxzID0gW107XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQoKTtcbiAgICBub3JtYWxpemVkUGVyc2lzdGVkRXh0cmFTa2lsbHMuZm9yRWFjaChza2lsbCA9PiB7XG4gICAgICBpZiAoc2Vlbi5oYXMoc2tpbGwubmFtZSkpIHJldHVybjtcbiAgICAgIG1lcmdlZFNraWxscy5wdXNoKHNraWxsKTtcbiAgICAgIHNlZW4uYWRkKHNraWxsLm5hbWUpO1xuICAgIH0pO1xuICAgIGFsbFNraWxscy5mb3JFYWNoKHNraWxsID0+IHtcbiAgICAgIGNvbnN0IHNraWxsTmFtZSA9IF9za2lsbE5hbWUoc2tpbGwpO1xuICAgICAgaWYgKCFza2lsbE5hbWUgfHwgc2Vlbi5oYXMoc2tpbGxOYW1lKSkgcmV0dXJuO1xuICAgICAgbWVyZ2VkU2tpbGxzLnB1c2goc2tpbGwpO1xuICAgICAgc2Vlbi5hZGQoc2tpbGxOYW1lKTtcbiAgICB9KTtcbiAgICBhbGxTa2lsbHMgPSBtZXJnZWRTa2lsbHM7XG4gIH1cblxuICAvLyBEZXRlY3Qgc2tpbGxzIHJlY29tbWVuZGVkIGJ5IExMTSB0aGF0IGFyZW4ndCBpbiBtYXN0ZXIgQ1YgYW5kIHByZXBlbmQgdGhlbVxuICBjb25zdCBtYXN0ZXJTa2lsbE5hbWVzID0gbmV3IFNldChhbGxTa2lsbHMubWFwKHNraWxsID0+IF9za2lsbE5hbWUoc2tpbGwpKSk7XG4gIGNvbnN0IG5ld1NraWxscyA9IChkYXRhLnJlY29tbWVuZGVkX3NraWxscyB8fCBbXSkuZmlsdGVyKHMgPT4gIW1hc3RlclNraWxsTmFtZXMuaGFzKHMpKTtcbiAgd2luZG93Ll9uZXdTa2lsbHNGcm9tTExNID0gbmV3U2tpbGxzO1xuICBpZiAobmV3U2tpbGxzLmxlbmd0aCA+IDApIHtcbiAgICBhbGxTa2lsbHMgPSBbLi4ubmV3U2tpbGxzLm1hcChzID0+ICh7IG5hbWU6IHMsIF9pc05ldzogdHJ1ZSB9KSksIC4uLmFsbFNraWxsc107XG4gIH1cblxuICBpZiAoYWxsU2tpbGxzLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnPHAgc3R5bGU9XCJwYWRkaW5nOjIwcHg7dGV4dC1hbGlnbjpjZW50ZXI7Y29sb3I6IzZiNzI4MDtcIj5ObyBza2lsbHMgZm91bmQgaW4gbWFzdGVyIENWIGRhdGEuPC9wPic7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gT24gZmlyc3QgbG9hZDogc29ydCBieSByZWNvbW1lbmRhdGlvbjsgcHJlc2VydmUgdXNlciBvcmRlciBvbiByZS1yZW5kZXJcbiAgaWYgKCF3aW5kb3cuX3NraWxsc09yZGVyZWQpIHtcbiAgICBjb25zdCByZWNvbW1lbmRhdGlvbk9yZGVyID0geyAnRW1waGFzaXplJzogMCwgJ0luY2x1ZGUnOiAxLCAnRGUtZW1waGFzaXplJzogMiwgJ09taXQnOiAzIH07XG4gICAgY29uc3QgbWFzdGVyU2tpbGxzICA9IGFsbFNraWxscy5maWx0ZXIocyA9PiAhcy5faXNOZXcpO1xuXG4gICAgLy8gUm9sZS1hd2FyZSBjYXRlZ29yeSBzY29yaW5nOiBjYXRlZ29yaWVzIHdpdGggbW9yZSByZXF1aXJlZC9uaWNlLXRvLWhhdmUgam9iIHNraWxscyByYW5rIGhpZ2hlclxuICAgIGNvbnN0IGNhdGVnb3J5U2NvcmVzID0ge307XG4gICAgZm9yIChjb25zdCBza2lsbCBvZiBtYXN0ZXJTa2lsbHMpIHtcbiAgICAgIGNvbnN0IGNhdCAgPSB0eXBlb2Ygc2tpbGwgPT09ICdvYmplY3QnID8gKHNraWxsLmNhdGVnb3J5IHx8ICcnKSA6ICcnO1xuICAgICAgY29uc3QgbmFtZSA9ICh0eXBlb2Ygc2tpbGwgPT09ICdzdHJpbmcnID8gc2tpbGwgOiBza2lsbC5uYW1lIHx8IHNraWxsKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKGNhdCkge1xuICAgICAgICBjYXRlZ29yeVNjb3Jlc1tjYXRdID0gKGNhdGVnb3J5U2NvcmVzW2NhdF0gfHwgMClcbiAgICAgICAgICArIChoYXJkU2tpbGxTZXQuaGFzKG5hbWUpID8gMiA6IHNvZnRTa2lsbFNldC5oYXMobmFtZSkgPyAxIDogMCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc29ydGVkTWFzdGVyICA9IG1hc3RlclNraWxscy5zbGljZSgpLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGNvbnN0IGFOYW1lICA9IHR5cGVvZiBhID09PSAnc3RyaW5nJyA/IGEgOiBhLm5hbWUgfHwgYTtcbiAgICAgIGNvbnN0IGJOYW1lICA9IHR5cGVvZiBiID09PSAnc3RyaW5nJyA/IGIgOiBiLm5hbWUgfHwgYjtcbiAgICAgIGNvbnN0IGFSZWMgICA9IHJlY29tbWVuZGF0aW9uT3JkZXJbZ2V0U2tpbGxSZWNvbW1lbmRhdGlvbihhTmFtZSwgZGF0YSldID8/IDM7XG4gICAgICBjb25zdCBiUmVjICAgPSByZWNvbW1lbmRhdGlvbk9yZGVyW2dldFNraWxsUmVjb21tZW5kYXRpb24oYk5hbWUsIGRhdGEpXSA/PyAzO1xuICAgICAgaWYgKGFSZWMgIT09IGJSZWMpIHJldHVybiBhUmVjIC0gYlJlYztcbiAgICAgIC8vIFdpdGhpbiB0aGUgc2FtZSByZWNvbW1lbmRhdGlvbiB0aWVyLCBzdXJmYWNlIHJvbGUtcmVsZXZhbnQgY2F0ZWdvcmllcyBmaXJzdFxuICAgICAgY29uc3QgYUNhdCAgID0gdHlwZW9mIGEgPT09ICdvYmplY3QnID8gKGEuY2F0ZWdvcnkgfHwgJycpIDogJyc7XG4gICAgICBjb25zdCBiQ2F0ICAgPSB0eXBlb2YgYiA9PT0gJ29iamVjdCcgPyAoYi5jYXRlZ29yeSB8fCAnJykgOiAnJztcbiAgICAgIHJldHVybiAoY2F0ZWdvcnlTY29yZXNbYkNhdF0gfHwgMCkgLSAoY2F0ZWdvcnlTY29yZXNbYUNhdF0gfHwgMCk7XG4gICAgfSk7XG4gICAgd2luZG93Ll9za2lsbHNPcmRlcmVkID0gWy4uLmFsbFNraWxscy5maWx0ZXIocyA9PiBzLl9pc05ldyksIC4uLnNvcnRlZE1hc3Rlcl07XG5cbiAgICAvLyBBcHBseSBqb2ItYW5hbHlzaXMtZGVyaXZlZCBjYXRlZ29yeSBvcmRlciBmcm9tIGJhY2tlbmQgKEdBUC04NilcbiAgICBjb25zdCBiYWNrZW5kT3JkZXIgPSAoc3RhdGVNYW5hZ2VyLmdldFRhYkRhdGEoJ2N1c3RvbWl6YXRpb25zJykgfHwge30pLnNraWxsX2NhdGVnb3J5X29yZGVyO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGJhY2tlbmRPcmRlcikgJiYgYmFja2VuZE9yZGVyLmxlbmd0aCA+IDApIHtcbiAgICAgIHdpbmRvdy5fc2tpbGxDYXRlZ29yeU9yZGVyID0gYmFja2VuZE9yZGVyO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zdCBrbm93bk5hbWVzID0gbmV3IFNldCh3aW5kb3cuX3NraWxsc09yZGVyZWQubWFwKHMgPT4gKHR5cGVvZiBzID09PSAnc3RyaW5nJyA/IHMgOiBzLm5hbWUgfHwgcykpKTtcbiAgICBmb3IgKGNvbnN0IHNrIG9mIGFsbFNraWxscykge1xuICAgICAgY29uc3Qgbm0gPSB0eXBlb2Ygc2sgPT09ICdzdHJpbmcnID8gc2sgOiBzay5uYW1lIHx8IHNrO1xuICAgICAgaWYgKCFrbm93bk5hbWVzLmhhcyhubSkpIHdpbmRvdy5fc2tpbGxzT3JkZXJlZC5wdXNoKHNrKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCByZWNvbW1lbmRlZFNldCA9IG5ldyBTZXQoZGF0YS5yZWNvbW1lbmRlZF9za2lsbHMgfHwgW10pO1xuXG4gIC8vIENvbXB1dGUgd2hpY2ggcmVjb21tZW5kYXRpb25zIGFyZSBuZXcgc2luY2UgbGFzdCByZW5kZXIgKHJlcnVuIGNoYW5nZSBiYWRnZXMpXG4gIGNvbnN0IHByZXZTa2lsbFNuYXAgPSBfZ2V0U2tpbGxTbmFwc2hvdCgpO1xuICBjb25zdCBuZXdSZWNvbW1lbmRlZFNraWxscyA9IHByZXZTa2lsbFNuYXBcbiAgICA/IG5ldyBTZXQoWy4uLnJlY29tbWVuZGVkU2V0XS5maWx0ZXIobmFtZSA9PiAhcHJldlNraWxsU25hcC5oYXMobmFtZSkpKVxuICAgIDogbmV3IFNldCgpO1xuICBfc2F2ZVNraWxsU25hcHNob3QocmVjb21tZW5kZWRTZXQpO1xuXG4gIC8vIEluaXRpYWxpc2Ugc2F2ZWQgZGVjaXNpb25zXG4gIGNvbnN0IHNhdmVkU2tpbGxEZWNzID0gd2luZG93Ll9zYXZlZERlY2lzaW9ucz8uc2tpbGxfZGVjaXNpb25zIHx8IHt9O1xuICBmb3IgKGNvbnN0IHNraWxsIG9mIHdpbmRvdy5fc2tpbGxzT3JkZXJlZCkge1xuICAgIGNvbnN0IHNraWxsTmFtZSAgICAgPSB0eXBlb2Ygc2tpbGwgPT09ICdzdHJpbmcnID8gc2tpbGwgOiBza2lsbC5uYW1lIHx8IHNraWxsO1xuICAgIGNvbnN0IGlzTmV3ICAgICAgICAgPSAoc2tpbGwuX2lzTmV3ID09PSB0cnVlKTtcbiAgICBjb25zdCBpc1JlY29tbWVuZGVkID0gcmVjb21tZW5kZWRTZXQuaGFzKHNraWxsTmFtZSk7XG4gICAgY29uc3QgcmVjb21tZW5kYXRpb24gPSBnZXRTa2lsbFJlY29tbWVuZGF0aW9uKHNraWxsTmFtZSwgZGF0YSk7XG4gICAgbGV0IGRlZmF1bHRBY3Rpb24gPSAnZXhjbHVkZSc7XG4gICAgaWYgICAgICAocmVjb21tZW5kYXRpb24gPT09ICdFbXBoYXNpemUnKSAgICBkZWZhdWx0QWN0aW9uID0gJ2VtcGhhc2l6ZSc7XG4gICAgZWxzZSBpZiAocmVjb21tZW5kYXRpb24gPT09ICdJbmNsdWRlJykgICAgICBkZWZhdWx0QWN0aW9uID0gJ2luY2x1ZGUnO1xuICAgIGVsc2UgaWYgKHJlY29tbWVuZGF0aW9uID09PSAnRGUtZW1waGFzaXplJykgZGVmYXVsdEFjdGlvbiA9ICdkZS1lbXBoYXNpemUnO1xuICAgIGVsc2UgaWYgKHJlY29tbWVuZGF0aW9uID09PSAnT21pdCcpICAgICAgICAgZGVmYXVsdEFjdGlvbiA9ICdleGNsdWRlJztcbiAgICBlbHNlIGlmIChpc1JlY29tbWVuZGVkIHx8IGlzTmV3KSAgICAgICAgICAgIGRlZmF1bHRBY3Rpb24gPSAnaW5jbHVkZSc7XG4gICAgdXNlclNlbGVjdGlvbnMuc2tpbGxzW3NraWxsTmFtZV0gPSBzYXZlZFNraWxsRGVjc1tza2lsbE5hbWVdIHx8IGRlZmF1bHRBY3Rpb247XG4gIH1cblxuICBfcmVuZGVyU2tpbGxzVGFibGUoY29udGFpbmVyLCByZWNvbW1lbmRlZFNldCwgZGF0YSwgaGFyZFNraWxsU2V0LCBzb2Z0U2tpbGxTZXQsIG5ld1JlY29tbWVuZGVkU2tpbGxzKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFJlbmRlciB0YWJsZSBIVE1MIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBfcmVuZGVyU2tpbGxzVGFibGUoY29udGFpbmVyLCByZWNvbW1lbmRlZFNldCwgZGF0YSwgaGFyZFNraWxsU2V0LCBzb2Z0U2tpbGxTZXQsIG5ld1JlY29tbWVuZGVkU2tpbGxzID0gbmV3IFNldCgpKSB7XG4gIGlmICghY29udGFpbmVyKSBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGxzLXRhYmxlLWNvbnRhaW5lcicpO1xuICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuO1xuICBpZiAoIXJlY29tbWVuZGVkU2V0KSByZWNvbW1lbmRlZFNldCA9IG5ldyBTZXQoKHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zPy5yZWNvbW1lbmRlZF9za2lsbHMpIHx8IFtdKTtcbiAgaWYgKCFkYXRhKSBkYXRhID0gd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnM7XG4gIGlmICghaGFyZFNraWxsU2V0KSB7XG4gICAgY29uc3QgamEgPSBzdGF0ZU1hbmFnZXIuZ2V0VGFiRGF0YSgnYW5hbHlzaXMnKSB8fCB7fTtcbiAgICBoYXJkU2tpbGxTZXQgPSBuZXcgU2V0KChqYS5yZXF1aXJlZF9za2lsbHMgICAgIHx8IFtdKS5tYXAocyA9PiBzLnRvTG93ZXJDYXNlKCkpKTtcbiAgICBzb2Z0U2tpbGxTZXQgPSBuZXcgU2V0KChqYS5uaWNlX3RvX2hhdmVfc2tpbGxzIHx8IFtdKS5tYXAocyA9PiBzLnRvTG93ZXJDYXNlKCkpKTtcbiAgfVxuXG4gIGlmICgkLmZuLkRhdGFUYWJsZS5pc0RhdGFUYWJsZSgnI3NraWxscy1yZXZpZXctdGFibGUnKSkge1xuICAgICQoJyNza2lsbHMtcmV2aWV3LXRhYmxlJykuRGF0YVRhYmxlKCkuZGVzdHJveSgpO1xuICB9XG5cbiAgY29uc3Qgc2tpbGxzID0gd2luZG93Ll9za2lsbHNPcmRlcmVkIHx8IFtdO1xuICBjb25zdCBncm91cFdhcm5pbmdzID0gX2J1aWxkR3JvdXBXYXJuaW5ncyhza2lsbHMpO1xuICBjb25zdCBjYXRlZ29yeVN1Z2dlc3Rpb25zID0gQXJyYXkuZnJvbShuZXcgU2V0KFxuICAgIHNraWxsc1xuICAgICAgLm1hcChza2lsbCA9PiAodHlwZW9mIHNraWxsID09PSAnb2JqZWN0JyAmJiBza2lsbC5jYXRlZ29yeSA/IFN0cmluZyhza2lsbC5jYXRlZ29yeSkudHJpbSgpIDogJycpKVxuICAgICAgLmZpbHRlcihCb29sZWFuKSxcbiAgKSkuc29ydCgobGVmdCwgcmlnaHQpID0+IGxlZnQubG9jYWxlQ29tcGFyZShyaWdodCkpO1xuICBfc3luY1NraWxsQ2F0ZWdvcnlPcmRlcigpO1xuICBjb25zdCBjYXRlZ29yeUxpc3RJZCA9ICdza2lsbC1jYXRlZ29yeS1zdWdnZXN0aW9ucyc7XG4gIGxldCB0YWJsZUhUTUwgPSBgXG4gICAgPGRpdiBjbGFzcz1cInNraWxsLWFkZC1wYW5lbFwiIHN0eWxlPVwibWFyZ2luOjAgMCAxMnB4O3BhZGRpbmc6MTJweDtib3JkZXI6MXB4IHNvbGlkICNkYmVhZmU7Ym9yZGVyLXJhZGl1czoxMHB4O2JhY2tncm91bmQ6I2VmZjZmZjtcIj5cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47YWxpZ24taXRlbXM6Y2VudGVyO2dhcDoxMnB4O2ZsZXgtd3JhcDp3cmFwO1wiPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDo2MDA7XCI+U2Vzc2lvbi1Pbmx5IFNraWxsczwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2NvbG9yOiM0NzU1Njk7XCI+QWRkIGEgc2tpbGwgZm9yIHRoaXMgQ1Ygd2l0aG91dCBjaGFuZ2luZyB0aGUgbWFzdGVyIHByb2ZpbGUuPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ1bGstYnRuXCIgaWQ9XCJ0b2dnbGUtYWRkLXNraWxsLWZvcm1cIj4rIEFkZCBTa2lsbDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8Zm9ybSBpZD1cImFkZC1za2lsbC1mb3JtXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7bWFyZ2luLXRvcDoxMnB4O1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpncmlkO2dyaWQtdGVtcGxhdGUtY29sdW1uczpyZXBlYXQoYXV0by1maXQsbWlubWF4KDE4MHB4LDFmcikpO2dhcDo4cHg7XCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cIm5hbWVcIiBwbGFjZWhvbGRlcj1cIlNraWxsIG5hbWVcIiBhcmlhLWxhYmVsPVwiTmV3IHNraWxsIG5hbWVcIiBzdHlsZT1cInBhZGRpbmc6NnB4IDhweDtib3JkZXI6MXB4IHNvbGlkICNiZmRiZmU7Ym9yZGVyLXJhZGl1czo2cHg7XCIgLz5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBuYW1lPVwiY2F0ZWdvcnlcIiBwbGFjZWhvbGRlcj1cIkNhdGVnb3J5XCIgYXJpYS1sYWJlbD1cIk5ldyBza2lsbCBjYXRlZ29yeVwiIGxpc3Q9XCIke2NhdGVnb3J5TGlzdElkfVwiIHN0eWxlPVwicGFkZGluZzo2cHggOHB4O2JvcmRlcjoxcHggc29saWQgI2JmZGJmZTtib3JkZXItcmFkaXVzOjZweDtcIiAvPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG5hbWU9XCJncm91cFwiIHBsYWNlaG9sZGVyPVwiR3JvdXAga2V5XCIgYXJpYS1sYWJlbD1cIk5ldyBza2lsbCBncm91cFwiIHN0eWxlPVwicGFkZGluZzo2cHggOHB4O2JvcmRlcjoxcHggc29saWQgI2JmZGJmZTtib3JkZXItcmFkaXVzOjZweDtcIiAvPlxuICAgICAgICAgIDxzZWxlY3QgbmFtZT1cInByb2ZpY2llbmN5XCIgYXJpYS1sYWJlbD1cIk5ldyBza2lsbCBwcm9maWNpZW5jeVwiIHN0eWxlPVwicGFkZGluZzo2cHggOHB4O2JvcmRlcjoxcHggc29saWQgI2JmZGJmZTtib3JkZXItcmFkaXVzOjZweDtcIj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj5ObyBwcm9maWNpZW5jeSBsYWJlbDwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImJlZ2lubmVyXCI+QmVnaW5uZXI8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJmYW1pbGlhclwiPkZhbWlsaWFyPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiaW50ZXJtZWRpYXRlXCI+SW50ZXJtZWRpYXRlPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiYWR2YW5jZWRcIj5BZHZhbmNlZDwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImV4cGVydFwiPkV4cGVydDwvb3B0aW9uPlxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG5hbWU9XCJzdWJza2lsbHNcIiBwbGFjZWhvbGRlcj1cIlN1Yi1za2lsbHNcIiBhcmlhLWxhYmVsPVwiTmV3IHNraWxsIHN1Yi1za2lsbHNcIiBzdHlsZT1cInBhZGRpbmc6NnB4IDhweDtib3JkZXI6MXB4IHNvbGlkICNiZmRiZmU7Ym9yZGVyLXJhZGl1czo2cHg7XCIgLz5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBuYW1lPVwicGFyZW50aGV0aWNhbFwiIHBsYWNlaG9sZGVyPVwiUGFyZW50aGV0aWNhbCBub3RlXCIgYXJpYS1sYWJlbD1cIk5ldyBza2lsbCBwYXJlbnRoZXRpY2FsXCIgc3R5bGU9XCJwYWRkaW5nOjZweCA4cHg7Ym9yZGVyOjFweCBzb2xpZCAjYmZkYmZlO2JvcmRlci1yYWRpdXM6NnB4O1wiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDo4cHg7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kO21hcmdpbi10b3A6MTBweDtcIj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ1bGstYnRuIGJ1bGstZXhjbHVkZVwiIGlkPVwiY2FuY2VsLWFkZC1za2lsbFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIGNsYXNzPVwiYnVsay1idG4gYnVsay1pbmNsdWRlXCI+U2F2ZSBTa2lsbDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZm9ybT5cbiAgICA8L2Rpdj5cbiAgICAke19idWlsZFNraWxsQ2F0ZWdvcnlNYW5hZ2VySHRtbCgpfVxuICAgIDxkYXRhbGlzdCBpZD1cIiR7Y2F0ZWdvcnlMaXN0SWR9XCI+XG4gICAgICAke2NhdGVnb3J5U3VnZ2VzdGlvbnMubWFwKGNhdGVnb3J5ID0+IGA8b3B0aW9uIHZhbHVlPVwiJHtlc2NhcGVIdG1sKGNhdGVnb3J5KX1cIj48L29wdGlvbj5gKS5qb2luKCcnKX1cbiAgICA8L2RhdGFsaXN0PlxuICAgIDx0YWJsZSBpZD1cInNraWxscy1yZXZpZXctdGFibGVcIiBjbGFzcz1cInJldmlldy10YWJsZVwiPlxuICAgICAgPHRoZWFkPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRoPlNraWxsPC90aD5cbiAgICAgICAgICA8dGg+Q2F0ZWdvcnk8L3RoPlxuICAgICAgICAgIDx0aD5Hcm91cDwvdGg+XG4gICAgICAgICAgPHRoPlByb2ZpY2llbmN5PC90aD5cbiAgICAgICAgICA8dGg+U3ViLXNraWxsczwvdGg+XG4gICAgICAgICAgPHRoPlBhcmVudGhldGljYWw8L3RoPlxuICAgICAgICAgIDx0aD5SZWNvbW1lbmRhdGlvbjwvdGg+XG4gICAgICAgICAgPHRoPkNvbmZpZGVuY2U8L3RoPlxuICAgICAgICAgIDx0aD5SZWFzb25pbmc8L3RoPlxuICAgICAgICAgIDx0aD5NYXRjaGVkIEV4cGVyaWVuY2VzPC90aD5cbiAgICAgICAgICA8dGg+WW91ciBTZWxlY3Rpb248L3RoPlxuICAgICAgICA8L3RyPlxuICAgICAgPC90aGVhZD5cbiAgICAgIDx0Ym9keT5cbiAgYDtcblxuICBjb25zdCBhbGxFeHBlcmllbmNlcyA9IEFycmF5LmlzQXJyYXkod2luZG93Ll9hbGxFeHBlcmllbmNlcykgPyB3aW5kb3cuX2FsbEV4cGVyaWVuY2VzIDogW107XG4gIGNvbnN0IHNhdmVkTWF0Y2hlcyA9ICh3aW5kb3cuX3NhdmVkRGVjaXNpb25zICYmIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMuZXh0cmFfc2tpbGxfbWF0Y2hlcykgfHwge307XG5cbiAgY29uc3QgZGVyaXZlTWF0Y2hlcyA9IChza2lsbE5hbWUpID0+IHtcbiAgICBjb25zdCBuZWVkbGUgPSBza2lsbE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBpZHMgPSBbXTtcbiAgICBhbGxFeHBlcmllbmNlcy5mb3JFYWNoKChleHApID0+IHtcbiAgICAgIGlmICghZXhwIHx8IHR5cGVvZiBleHAgIT09ICdvYmplY3QnKSByZXR1cm47XG4gICAgICBjb25zdCBhY2ggPSBBcnJheS5pc0FycmF5KGV4cC5hY2hpZXZlbWVudHMpID8gZXhwLmFjaGlldmVtZW50cy5qb2luKCcgJykgOiAnJztcbiAgICAgIGNvbnN0IGhheXN0YWNrID0gW2V4cC50aXRsZSB8fCAnJywgZXhwLmNvbXBhbnkgfHwgJycsIGFjaF0uam9pbignICcpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAoaGF5c3RhY2suaW5jbHVkZXMobmVlZGxlKSAmJiBleHAuaWQpIGlkcy5wdXNoKGV4cC5pZCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGlkcztcbiAgfTtcblxuICBza2lsbHMuZm9yRWFjaCgoc2tpbGwsIHJvd0lkeCkgPT4ge1xuICAgIGNvbnN0IHNraWxsTmFtZSAgICAgICAgICAgID0gdHlwZW9mIHNraWxsID09PSAnc3RyaW5nJyA/IHNraWxsIDogc2tpbGwubmFtZSB8fCBza2lsbDtcbiAgICBjb25zdCBpc05ldyAgICAgICAgICAgICAgICA9IChza2lsbC5faXNOZXcgPT09IHRydWUpO1xuICAgIGNvbnN0IGlzQ2FuZGlkYXRlVG9Db25maXJtID0gdHlwZW9mIHNraWxsID09PSAnb2JqZWN0JyAmJiBza2lsbC5jYW5kaWRhdGVfdG9fY29uZmlybSA9PT0gdHJ1ZTtcbiAgICBjb25zdCBpc1JlY29tbWVuZGVkICAgICAgICA9IHJlY29tbWVuZGVkU2V0Lmhhcyhza2lsbE5hbWUpO1xuICAgIGNvbnN0IHJlY29tbWVuZGF0aW9uID0gZ2V0U2tpbGxSZWNvbW1lbmRhdGlvbihza2lsbE5hbWUsIGRhdGEpO1xuICAgIGNvbnN0IGNvbmZpZGVuY2UgICAgID0gZ2V0U2tpbGxDb25maWRlbmNlKHNraWxsTmFtZSwgZGF0YSk7XG4gICAgY29uc3QgcmVhc29uaW5nICAgICAgPSBnZXRTa2lsbFJlYXNvbmluZyhza2lsbE5hbWUsIGRhdGEpO1xuICAgIGNvbnN0IHNraWxsUmVjICAgICAgID0gX2ZpbmRTa2lsbFJlY29tbWVuZGF0aW9uUmVjb3JkKHNraWxsTmFtZSwgZGF0YSk7XG4gICAgY29uc3QgZ3JvdXBpbmdTdWdnZXN0aW9uID0gX2J1aWxkU2tpbGxHcm91cGluZ1N1Z2dlc3Rpb24oc2tpbGxSZWMsIHNraWxsKTtcbiAgICBjb25zdCBkZWZhdWx0QWN0aW9uICA9IHVzZXJTZWxlY3Rpb25zLnNraWxsc1tza2lsbE5hbWVdIHx8ICdpbmNsdWRlJztcbiAgICBjb25zdCBpc0ZpcnN0ICAgICAgICA9IHJvd0lkeCA9PT0gMDtcbiAgICBjb25zdCBpc0xhc3QgICAgICAgICA9IHJvd0lkeCA9PT0gc2tpbGxzLmxlbmd0aCAtIDE7XG4gICAgY29uc3Qgc2tpbGxOYW1lRXNjICAgPSBlc2NhcGVIdG1sKHNraWxsTmFtZSk7XG5cbiAgICBjb25zdCBncm91cEtleSA9IHR5cGVvZiBza2lsbCA9PT0gJ29iamVjdCcgPyAoc2tpbGwuZ3JvdXAgfHwgJycpIDogJyc7XG4gICAgY29uc3QgZ3JvdXBXYXJuaW5nID0gZ3JvdXBXYXJuaW5ncy5nZXQoZ3JvdXBLZXkpO1xuICAgIGNvbnN0IGNhdGVnb3J5S2V5ID0gdHlwZW9mIHNraWxsID09PSAnb2JqZWN0JyA/IChza2lsbC5jYXRlZ29yeSB8fCAnJykgOiAnJztcbiAgICBjb25zdCBwcm9maWNpZW5jeUtleSA9IHR5cGVvZiBza2lsbCA9PT0gJ29iamVjdCcgPyBTdHJpbmcoc2tpbGwucHJvZmljaWVuY3kgfHwgJycpLnRyaW0oKSA6ICcnO1xuICAgIGNvbnN0IHN1YnNraWxscyA9IHR5cGVvZiBza2lsbCA9PT0gJ29iamVjdCdcbiAgICAgID8gQXJyYXkuaXNBcnJheShza2lsbC5zdWJza2lsbHMpXG4gICAgICAgID8gc2tpbGwuc3Vic2tpbGxzXG4gICAgICAgIDogQXJyYXkuaXNBcnJheShza2lsbC5zdWJfc2tpbGxzKVxuICAgICAgICAgID8gc2tpbGwuc3ViX3NraWxsc1xuICAgICAgICAgIDogW11cbiAgICAgIDogW107XG4gICAgY29uc3QgcGFyZW50aGV0aWNhbEtleSA9IHR5cGVvZiBza2lsbCA9PT0gJ29iamVjdCcgPyBTdHJpbmcoc2tpbGwucGFyZW50aGV0aWNhbCB8fCAnJykudHJpbSgpIDogJyc7XG5cbiAgICBjb25zdCBuZXdCYWRnZSA9IGlzTmV3XG4gICAgICA/IChza2lsbC5faXNVc2VyQ3JlYXRlZFxuICAgICAgICA/ICc8c3BhbiB0aXRsZT1cIkFkZGVkIGZvciB0aGlzIHNlc3Npb24gb25seVwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6NnB4O2ZvbnQtc2l6ZToxMHB4O2NvbG9yOiMwZjc2NmU7Ym9yZGVyOjFweCBzb2xpZCAjMGY3NjZlO2JvcmRlci1yYWRpdXM6M3B4O3BhZGRpbmc6MXB4IDVweDtjdXJzb3I6aGVscDtcIj5TZXNzaW9uIG9ubHk8L3NwYW4+J1xuICAgICAgICA6ICc8c3BhbiB0aXRsZT1cIkFJIHN1Z2dlc3RlZCBcdTIwMTQgbm90IHlldCBpbiBDViBwcm9maWxlXCIgc3R5bGU9XCJtYXJnaW4tbGVmdDo2cHg7Zm9udC1zaXplOjEwcHg7Y29sb3I6I2RjNzkwMDtib3JkZXI6MXB4IHNvbGlkICNkYzc5MDA7Ym9yZGVyLXJhZGl1czozcHg7cGFkZGluZzoxcHggNXB4O2N1cnNvcjpoZWxwO1wiPlx1MjZBMCBOb3QgaW4gQ1YgcHJvZmlsZTwvc3Bhbj4nKVxuICAgICAgOiAnJztcbiAgICBjb25zdCBfZXZpZGVuY2VUZXh0ID0gaXNDYW5kaWRhdGVUb0NvbmZpcm0gJiYgdHlwZW9mIHNraWxsID09PSAnb2JqZWN0JyA/IFN0cmluZyhza2lsbC5ldmlkZW5jZSB8fCAnJykudHJpbSgpIDogJyc7XG4gICAgY29uc3QgX2V2aWRlbmNlRmFsbGJhY2sgPSAnQ29uZmlybSB0aGlzIHNraWxsIGlzIGdlbnVpbmVseSBkZW1vbnN0cmF0ZWQgaW4geW91ciBleHBlcmllbmNlIGJlZm9yZSBpbmNsdWRpbmcgaXQuJztcbiAgICBjb25zdCBfZXZpZGVuY2VUaXAgPSBfZXZpZGVuY2VUZXh0ID8gYFdlYWsgZXZpZGVuY2UgXHUyMDE0ICR7X2V2aWRlbmNlVGV4dH1gIDogYFdlYWsgZXZpZGVuY2UgXHUyMDE0ICR7X2V2aWRlbmNlRmFsbGJhY2t9YDtcbiAgICBjb25zdCBjYW5kaWRhdGVCYWRnZSA9IGlzQ2FuZGlkYXRlVG9Db25maXJtXG4gICAgICA/IGA8c3BhbiB0aXRsZT1cIiR7ZXNjYXBlSHRtbChfZXZpZGVuY2VUaXApfVwiIGFyaWEtbGFiZWw9XCIke2VzY2FwZUh0bWwoX2V2aWRlbmNlVGlwKX1cIiBzdHlsZT1cIm1hcmdpbi1sZWZ0OjZweDtmb250LXNpemU6MTBweDtjb2xvcjojOWYxMjM5O2JvcmRlcjoxcHggc29saWQgIzlmMTIzOTtib3JkZXItcmFkaXVzOjNweDtwYWRkaW5nOjFweCA1cHg7Y3Vyc29yOmhlbHA7XCI+XHUyNkEwICR7X2V2aWRlbmNlVGV4dCA/ICdXZWFrIGV2aWRlbmNlJyA6ICdWZXJpZnkgZXZpZGVuY2UnfTwvc3Bhbj5gXG4gICAgICA6ICcnO1xuICAgIGNvbnN0IGV2aWRlbmNlTm90ZSA9IGlzQ2FuZGlkYXRlVG9Db25maXJtICYmIF9ldmlkZW5jZVRleHRcbiAgICAgID8gYDxzbWFsbCBzdHlsZT1cImRpc3BsYXk6YmxvY2s7bWFyZ2luLXRvcDozcHg7Zm9udC1zaXplOjAuNzhlbTtjb2xvcjojOWYxMjM5O1wiPiR7ZXNjYXBlSHRtbChfZXZpZGVuY2VUZXh0KX08L3NtYWxsPmBcbiAgICAgIDogJyc7XG4gICAgY29uc3QgcmVydW5OZXdCYWRnZSA9IG5ld1JlY29tbWVuZGVkU2tpbGxzLmhhcyhza2lsbE5hbWUpXG4gICAgICA/ICc8c3BhbiBjbGFzcz1cInJ3LWNoYW5nZS1iYWRnZSBydy1jaGFuZ2UtbmV3XCIgYXJpYS1sYWJlbD1cIk5ldyByZWNvbW1lbmRhdGlvbiBzaW5jZSBwcmV2aW91cyBydW5cIj5cdUQ4M0NcdUREOTUgTmV3PC9zcGFuPidcbiAgICAgIDogJyc7XG4gICAgY29uc3Qgc2tpbGxOYW1lTG93ZXIgID0gc2tpbGxOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgX3R5cGVPdmVycmlkZSAgID0gKHdpbmRvdy5fc2tpbGxUeXBlT3ZlcnJpZGVzIHx8IHt9KVtza2lsbE5hbWVMb3dlcl07XG4gICAgY29uc3QgX2Jhc2VUeXBlICAgICAgID0gaGFyZFNraWxsU2V0Lmhhcyhza2lsbE5hbWVMb3dlcikgPyAnaGFyZCdcbiAgICAgIDogc29mdFNraWxsU2V0Py5oYXMoc2tpbGxOYW1lTG93ZXIpID8gJ3NvZnQnIDogbnVsbDtcbiAgICBjb25zdCBfZWZmZWN0aXZlVHlwZSAgPSBfdHlwZU92ZXJyaWRlIHx8IF9iYXNlVHlwZTtcbiAgICBjb25zdCBfaXNPdmVycmlkZGVuICAgPSAhIV90eXBlT3ZlcnJpZGUgJiYgX3R5cGVPdmVycmlkZSAhPT0gX2Jhc2VUeXBlO1xuICAgIGNvbnN0IF90b2dnbGVUYXJnZXQgICA9IF9lZmZlY3RpdmVUeXBlID09PSAnaGFyZCcgPyAnc29mdCdcbiAgICAgIDogX2VmZmVjdGl2ZVR5cGUgPT09ICdzb2Z0JyA/IG51bGwgOiAnaGFyZCc7XG4gICAgY29uc3QgX2JhZGdlVGl0bGUgICAgID0gX2lzT3ZlcnJpZGRlblxuICAgICAgPyBgVXNlciBvdmVycmlkZTogJHtfZWZmZWN0aXZlVHlwZX0gKG9yaWdpbmFsOiAke19iYXNlVHlwZSB8fCAnbm9uZSd9KSBcdTIwMTQgY2xpY2sgdG8gY3ljbGVgXG4gICAgICA6IF9lZmZlY3RpdmVUeXBlXG4gICAgICAgID8gYCR7X2VmZmVjdGl2ZVR5cGUgPT09ICdoYXJkJyA/ICdSZXF1aXJlZCcgOiAnTmljZS10by1oYXZlJ30gcGVyIGpvYiBkZXNjcmlwdGlvbiBcdTIwMTQgY2xpY2sgdG8gb3ZlcnJpZGVgXG4gICAgICAgIDogJ05vdCBjbGFzc2lmaWVkIFx1MjAxNCBjbGljayB0byBtYXJrIGFzIEhhcmQnO1xuICAgIGNvbnN0IF9iYWRnZVN0eWxlICAgICA9IF9lZmZlY3RpdmVUeXBlID09PSAnaGFyZCdcbiAgICAgID8gYG1hcmdpbi1sZWZ0OjVweDtmb250LXNpemU6MTBweDtmb250LXdlaWdodDo2MDA7Y29sb3I6IzFkNGVkODtiYWNrZ3JvdW5kOiNkYmVhZmU7Ym9yZGVyLXJhZGl1czozcHg7cGFkZGluZzoxcHggNXB4O2N1cnNvcjpwb2ludGVyOyR7X2lzT3ZlcnJpZGRlbiA/ICdvdXRsaW5lOjJweCBzb2xpZCAjMWQ0ZWQ4O291dGxpbmUtb2Zmc2V0OjFweDsnIDogJyd9YFxuICAgICAgOiBfZWZmZWN0aXZlVHlwZSA9PT0gJ3NvZnQnXG4gICAgICAgID8gYG1hcmdpbi1sZWZ0OjVweDtmb250LXNpemU6MTBweDtmb250LXdlaWdodDo2MDA7Y29sb3I6IzZiMjFhODtiYWNrZ3JvdW5kOiNmM2U4ZmY7Ym9yZGVyLXJhZGl1czozcHg7cGFkZGluZzoxcHggNXB4O2N1cnNvcjpwb2ludGVyOyR7X2lzT3ZlcnJpZGRlbiA/ICdvdXRsaW5lOjJweCBzb2xpZCAjNmIyMWE4O291dGxpbmUtb2Zmc2V0OjFweDsnIDogJyd9YFxuICAgICAgICA6ICdtYXJnaW4tbGVmdDo1cHg7Zm9udC1zaXplOjEwcHg7Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOiM2YjcyODA7YmFja2dyb3VuZDojZjNmNGY2O2JvcmRlci1yYWRpdXM6M3B4O3BhZGRpbmc6MXB4IDVweDtjdXJzb3I6cG9pbnRlcjtib3JkZXI6MXB4IGRhc2hlZCAjOWNhM2FmOyc7XG4gICAgY29uc3QgX2JhZGdlTGFiZWwgICAgID0gX2VmZmVjdGl2ZVR5cGUgPyAoX2VmZmVjdGl2ZVR5cGUgPT09ICdoYXJkJyA/ICdIYXJkJyA6ICdTb2Z0JykgOiAnKyBUeXBlJztcbiAgICBjb25zdCBza2lsbFR5cGVCYWRnZSAgPSBgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJza2lsbC10eXBlLXRvZ2dsZVwiIGRhdGEtc2tpbGw9XCIke3NraWxsTmFtZUVzY31cIiBkYXRhLXRvZ2dsZS10bz1cIiR7X3RvZ2dsZVRhcmdldCB8fCAnJ31cIiB0aXRsZT1cIiR7X2JhZGdlVGl0bGV9XCIgc3R5bGU9XCIke19iYWRnZVN0eWxlfVwiIGFyaWEtbGFiZWw9XCJTa2lsbCB0eXBlOiAke19lZmZlY3RpdmVUeXBlIHx8ICd1bmNsYXNzaWZpZWQnfSwgY2xpY2sgdG8gdG9nZ2xlXCI+JHtfYmFkZ2VMYWJlbH08L2J1dHRvbj5gO1xuICAgIGNvbnN0IHJlY29tbWVuZGF0aW9uVGV4dCA9IHJlY29tbWVuZGF0aW9uIHx8IChza2lsbC5faXNVc2VyQ3JlYXRlZCA/ICdJbmNsdWRlIChzZXNzaW9uLWFkZGVkKScgOiAoaXNOZXcgPyAnSW5jbHVkZSAoQUkgc3VnZ2VzdGVkKScgOiAnT21pdCcpKTtcbiAgICBjb25zdCBjb25maWRlbmNlQmFkZ2UgICAgPSBgPHNwYW4gY2xhc3M9XCJjb25maWRlbmNlLWJhZGdlIGNvbmZpZGVuY2UtJHtjb25maWRlbmNlLmxldmVsfVwiPiR7Y29uZmlkZW5jZS50ZXh0fTwvc3Bhbj5gO1xuICAgIGNvbnN0IHJlYXNvbmluZ1RleHQgICAgICA9IHJlYXNvbmluZyB8fCAoc2tpbGwuX2lzVXNlckNyZWF0ZWRcbiAgICAgID8gJ1lvdSBhZGRlZCB0aGlzIHNraWxsIGZvciB0aGUgY3VycmVudCBDViBzZXNzaW9uIG9ubHkuJ1xuICAgICAgOiAoaXNOZXdcbiAgICAgICAgPyAnUmVjb21tZW5kZWQgYnkgQUkgYmFzZWQgb24gam9iIHJlcXVpcmVtZW50cyBidXQgbm90IGN1cnJlbnRseSBpbiB5b3VyIG1hc3RlciBDVi4nXG4gICAgICAgIDogJ1RoaXMgc2tpbGwgd2FzIG5vdCBzcGVjaWZpY2FsbHkgbWVudGlvbmVkIGluIHRoZSBqb2IgcmVxdWlyZW1lbnRzLicpKTtcbiAgICBjb25zdCBncm91cGluZ0NoYW5nZVRleHQgPSBncm91cGluZ1N1Z2dlc3Rpb24/LmNoYW5nZVRleHQgfHwgJyc7XG4gICAgY29uc3QgZ3JvdXBpbmdSZWFzb25UZXh0ID0gZ3JvdXBpbmdTdWdnZXN0aW9uPy5yZWFzb25pbmcgfHwgJyc7XG4gICAgY29uc3QgZ3JvdXBpbmdBdHNJbXBhY3QgPSBncm91cGluZ1N1Z2dlc3Rpb24/LmF0c0ltcGFjdCB8fCAnJztcbiAgICBjb25zdCBncm91cGluZ1BhZ2VJbXBhY3QgPSBncm91cGluZ1N1Z2dlc3Rpb24/LnBhZ2VMZW5ndGhJbXBhY3QgfHwgJyc7XG4gICAgY29uc3QgcmVhc29uaW5nU2VnbWVudHMgPSBbcmVhc29uaW5nVGV4dF07XG4gICAgaWYgKGdyb3VwaW5nQ2hhbmdlVGV4dCkgcmVhc29uaW5nU2VnbWVudHMucHVzaChgQ2hhbmdlOiAke2dyb3VwaW5nQ2hhbmdlVGV4dH1gKTtcbiAgICBpZiAoZ3JvdXBpbmdSZWFzb25UZXh0KSByZWFzb25pbmdTZWdtZW50cy5wdXNoKGdyb3VwaW5nUmVhc29uVGV4dCk7XG4gICAgaWYgKGdyb3VwaW5nQXRzSW1wYWN0KSByZWFzb25pbmdTZWdtZW50cy5wdXNoKGBBVFMgaW1wYWN0OiAke2dyb3VwaW5nQXRzSW1wYWN0fWApO1xuICAgIGlmIChncm91cGluZ1BhZ2VJbXBhY3QpIHJlYXNvbmluZ1NlZ21lbnRzLnB1c2goYFBhZ2UgbGVuZ3RoIGltcGFjdDogJHtncm91cGluZ1BhZ2VJbXBhY3R9YCk7XG4gICAgY29uc3QgZnVsbFJlYXNvbmluZ1RleHQgPSByZWFzb25pbmdTZWdtZW50cy5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuICAgIGNvbnN0IHJvd1N0eWxlICAgICAgICAgICA9IGlzTmV3ID8gJ2JhY2tncm91bmQ6I2ZmZmJlYjsnIDogJyc7XG4gICAgY29uc3QgZGVmYXVsdE1hdGNoZXMgPSBpc05ldyA/IChzYXZlZE1hdGNoZXNbc2tpbGxOYW1lXSB8fCBkZXJpdmVNYXRjaGVzKHNraWxsTmFtZSkpIDogW107XG4gICAgY29uc3QgbWF0Y2hWYWx1ZSA9IGRlZmF1bHRNYXRjaGVzLmpvaW4oJywgJyk7XG4gICAgY29uc3QgbWF0Y2hIZWxwID0gaXNOZXdcbiAgICAgID8gJ0NvbW1hLXNlcGFyYXRlZCBleHBlcmllbmNlIElEcy4gQXV0by1kZXJpdmVkOyB5b3UgY2FuIGVkaXQgYmVmb3JlIHN1Ym1pdC4nXG4gICAgICA6ICdPbmx5IHVzZWQgZm9yIEFJLXN1Z2dlc3RlZCBza2lsbHMuJztcbiAgICBjb25zdCBkZXJpdmVkWWVhcnMgPSBpc05ldyA/IF9jb21wdXRlWWVhcnNGcm9tSWRzKGRlZmF1bHRNYXRjaGVzLCBhbGxFeHBlcmllbmNlcykgOiBudWxsO1xuICAgIGNvbnN0IHllYXJzSGludCA9IGRlcml2ZWRZZWFycyAhPSBudWxsXG4gICAgICA/IGB+JHtkZXJpdmVkWWVhcnN9IHlyJHtkZXJpdmVkWWVhcnMgPT09IDEgPyAnJyA6ICdzJ31gXG4gICAgICA6IChpc05ldyA/ICdubyBtYXRjaCcgOiAnJyk7XG5cbiAgICB0YWJsZUhUTUwgKz0gYFxuICAgICAgPHRyIGRhdGEtc2tpbGw9XCIke3NraWxsTmFtZUVzY31cIiBzdHlsZT1cIiR7cm93U3R5bGV9XCI+XG4gICAgICAgIDx0ZD48c3Ryb25nPiR7c2tpbGxOYW1lRXNjfTwvc3Ryb25nPiR7c2tpbGxUeXBlQmFkZ2V9JHtyZXJ1bk5ld0JhZGdlfSR7bmV3QmFkZ2V9JHtjYW5kaWRhdGVCYWRnZX0ke2V2aWRlbmNlTm90ZX08L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJtaW4td2lkdGg6MTQwcHg7XCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJza2lsbC1jYXRlZ29yeS1pbnB1dFwiIGRhdGEtc2tpbGw9XCIke3NraWxsTmFtZUVzY31cIlxuICAgICAgICAgICAgdmFsdWU9XCIke2VzY2FwZUh0bWwoY2F0ZWdvcnlLZXkpfVwiXG4gICAgICAgICAgICBsaXN0PVwiJHtjYXRlZ29yeUxpc3RJZH1cIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIFByb2dyYW1taW5nXCJcbiAgICAgICAgICAgIHRpdGxlPVwiU2Vzc2lvbi1vbmx5IGNhdGVnb3J5IGxhYmVsIHVzZWQgd2hlbiBncm91cGluZyBza2lsbHMgaW4gdGhlIGdlbmVyYXRlZCBDVlwiXG4gICAgICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Zm9udC1zaXplOjAuOGVtO3BhZGRpbmc6NHB4IDZweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo0cHg7XCIvPlxuICAgICAgICAgICR7Z3JvdXBpbmdTdWdnZXN0aW9uPy5jYXRlZ29yeUNoYW5nZWQgPyBgPGRpdiBjbGFzcz1cInNraWxsLWFpLWhpbnRcIiBzdHlsZT1cIm1hcmdpbi10b3A6NHB4O2ZvbnQtc2l6ZTowLjc1ZW07Y29sb3I6IzQzMzhjYTtcIj5cbiAgICAgICAgICAgIEFJIHN1Z2dlc3Rpb246ICR7ZXNjYXBlSHRtbChncm91cGluZ1N1Z2dlc3Rpb24uY2F0ZWdvcnkpfVxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNraWxsLWFwcGx5LWFpXCIgZGF0YS1za2lsbD1cIiR7c2tpbGxOYW1lRXNjfVwiIGRhdGEtYWktZmllbGQ9XCJjYXRlZ29yeVwiIGRhdGEtYWktdmFsdWU9XCIke2VzY2FwZUh0bWwoZ3JvdXBpbmdTdWdnZXN0aW9uLmNhdGVnb3J5KX1cIiBzdHlsZT1cIm1hcmdpbi1sZWZ0OjZweDtib3JkZXI6MXB4IHNvbGlkICNjN2QyZmU7YmFja2dyb3VuZDojZWVmMmZmO2NvbG9yOiM0MzM4Y2E7Ym9yZGVyLXJhZGl1czo0cHg7cGFkZGluZzoxcHggNnB4O2N1cnNvcjpwb2ludGVyO1wiPkFwcGx5PC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+YCA6ICcnfVxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJtaW4td2lkdGg6MTAwcHg7XCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJza2lsbC1ncm91cC1pbnB1dFwiIGRhdGEtc2tpbGw9XCIke3NraWxsTmFtZUVzY31cIlxuICAgICAgICAgICAgdmFsdWU9XCIke2VzY2FwZUh0bWwoZ3JvdXBLZXkpfVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gY19mYW1pbHlcIlxuICAgICAgICAgICAgdGl0bGU9XCJTa2lsbHMgd2l0aCB0aGUgc2FtZSBncm91cCBrZXkgcmVuZGVyIGFzIG9uZSBjb21tYS1zZXBhcmF0ZWQgYnVsbGV0XCJcbiAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTtmb250LXNpemU6MC44ZW07cGFkZGluZzo0cHggNnB4O2JvcmRlcjoxcHggc29saWQgI2QxZDVkYjtib3JkZXItcmFkaXVzOjRweDtcIi8+XG4gICAgICAgICAgJHtncm91cGluZ1N1Z2dlc3Rpb24/Lmdyb3VwQ2hhbmdlZCA/IGA8ZGl2IGNsYXNzPVwic2tpbGwtYWktaGludFwiIHN0eWxlPVwibWFyZ2luLXRvcDo0cHg7Zm9udC1zaXplOjAuNzVlbTtjb2xvcjojNDMzOGNhO1wiPlxuICAgICAgICAgICAgQUkgc3VnZ2VzdGlvbjogJHtlc2NhcGVIdG1sKGdyb3VwaW5nU3VnZ2VzdGlvbi5ncm91cCl9XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2tpbGwtYXBwbHktYWlcIiBkYXRhLXNraWxsPVwiJHtza2lsbE5hbWVFc2N9XCIgZGF0YS1haS1maWVsZD1cImdyb3VwXCIgZGF0YS1haS12YWx1ZT1cIiR7ZXNjYXBlSHRtbChncm91cGluZ1N1Z2dlc3Rpb24uZ3JvdXApfVwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6NnB4O2JvcmRlcjoxcHggc29saWQgI2M3ZDJmZTtiYWNrZ3JvdW5kOiNlZWYyZmY7Y29sb3I6IzQzMzhjYTtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjFweCA2cHg7Y3Vyc29yOnBvaW50ZXI7XCI+QXBwbHk8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5gIDogJyd9XG4gICAgICAgICAgJHtncm91cFdhcm5pbmcgPyBgPGRpdiBjbGFzcz1cInNraWxsLWdyb3VwLXdhcm5pbmdcIiB0aXRsZT1cIiR7ZXNjYXBlSHRtbChncm91cFdhcm5pbmcucHJldmlldyl9XCIgc3R5bGU9XCJtYXJnaW4tdG9wOjRweDtmb250LXNpemU6MC43NWVtO2NvbG9yOiNiNDUzMDk7XCI+XHUyNkEwICR7ZXNjYXBlSHRtbChncm91cFdhcm5pbmcubWVzc2FnZSl9PC9kaXY+YCA6ICcnfVxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJtaW4td2lkdGg6MTIwcHg7XCI+XG4gICAgICAgICAgPHNlbGVjdCBjbGFzcz1cInNraWxsLXByb2ZpY2llbmN5LWlucHV0XCIgZGF0YS1za2lsbD1cIiR7c2tpbGxOYW1lRXNjfVwiXG4gICAgICAgICAgICB0aXRsZT1cIlNlc3Npb24tb25seSBwcm9maWNpZW5jeSBsYWJlbCB1c2VkIHdoZW4gcmVuZGVyaW5nIGlubGluZSBza2lsbCBidWxsZXRzXCJcbiAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTtmb250LXNpemU6MC44ZW07cGFkZGluZzo0cHggNnB4O2JvcmRlcjoxcHggc29saWQgI2QxZDVkYjtib3JkZXItcmFkaXVzOjRweDtcIj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIiAkeyFwcm9maWNpZW5jeUtleSA/ICdzZWxlY3RlZCcgOiAnJ30+Tm9uZTwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImJlZ2lubmVyXCIgJHtwcm9maWNpZW5jeUtleSA9PT0gJ2JlZ2lubmVyJyA/ICdzZWxlY3RlZCcgOiAnJ30+QmVnaW5uZXI8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJmYW1pbGlhclwiICR7cHJvZmljaWVuY3lLZXkgPT09ICdmYW1pbGlhcicgPyAnc2VsZWN0ZWQnIDogJyd9PkZhbWlsaWFyPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiaW50ZXJtZWRpYXRlXCIgJHtwcm9maWNpZW5jeUtleSA9PT0gJ2ludGVybWVkaWF0ZScgPyAnc2VsZWN0ZWQnIDogJyd9PkludGVybWVkaWF0ZTwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImFkdmFuY2VkXCIgJHtwcm9maWNpZW5jeUtleSA9PT0gJ2FkdmFuY2VkJyA/ICdzZWxlY3RlZCcgOiAnJ30+QWR2YW5jZWQ8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJleHBlcnRcIiAke3Byb2ZpY2llbmN5S2V5ID09PSAnZXhwZXJ0JyA/ICdzZWxlY3RlZCcgOiAnJ30+RXhwZXJ0PC9vcHRpb24+XG4gICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cIm1pbi13aWR0aDoxODBweDtcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cInNraWxsLXN1YnNraWxscy1pbnB1dFwiIGRhdGEtc2tpbGw9XCIke3NraWxsTmFtZUVzY31cIlxuICAgICAgICAgICAgdmFsdWU9XCIke2VzY2FwZUh0bWwoc3Vic2tpbGxzLmpvaW4oJywgJykpfVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gUGFuZGFzLCBOdW1QeVwiXG4gICAgICAgICAgICB0aXRsZT1cIkNvbW1hLXNlcGFyYXRlZCBzdWItc2tpbGxzIHVzZWQgaW4gaW5saW5lIHNraWxsIGJ1bGxldHNcIlxuICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDoxMDAlO2ZvbnQtc2l6ZTowLjhlbTtwYWRkaW5nOjRweCA2cHg7Ym9yZGVyOjFweCBzb2xpZCAjZDFkNWRiO2JvcmRlci1yYWRpdXM6NHB4O1wiLz5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwibWluLXdpZHRoOjE4MHB4O1wiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwic2tpbGwtcGFyZW50aGV0aWNhbC1pbnB1dFwiIGRhdGEtc2tpbGw9XCIke3NraWxsTmFtZUVzY31cIlxuICAgICAgICAgICAgdmFsdWU9XCIke2VzY2FwZUh0bWwocGFyZW50aGV0aWNhbEtleSl9XCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiT3B0aW9uYWwgaW5saW5lIG5vdGVcIlxuICAgICAgICAgICAgdGl0bGU9XCJGcmVlLWZvcm0gcGFyZW50aGV0aWNhbCBvdmVycmlkZSBmb3IgdGhlIHJlbmRlcmVkIGlubGluZSBza2lsbCBsYWJlbFwiXG4gICAgICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Zm9udC1zaXplOjAuOGVtO3BhZGRpbmc6NHB4IDZweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo0cHg7XCIvPlxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQ+PHN0cm9uZz4ke2VzY2FwZUh0bWwocmVjb21tZW5kYXRpb25UZXh0KX08L3N0cm9uZz48L3RkPlxuICAgICAgICA8dGQ+JHtjb25maWRlbmNlQmFkZ2V9PC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwibWF4LXdpZHRoOjMwMHB4O1wiPjxzbWFsbD4ke2VzY2FwZUh0bWwoZnVsbFJlYXNvbmluZ1RleHQpfTwvc21hbGw+PC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwibWluLXdpZHRoOjI2MHB4O1wiPlxuICAgICAgICAgICR7aXNOZXcgPyBgPGlucHV0XG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICBjbGFzcz1cInNraWxsLW1hdGNoLWlucHV0XCJcbiAgICAgICAgICAgIGRhdGEtc2tpbGw9XCIke3NraWxsTmFtZUVzY31cIlxuICAgICAgICAgICAgdmFsdWU9XCIke2VzY2FwZUh0bWwobWF0Y2hWYWx1ZSl9XCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZXhwXzEsIGV4cF8yXCJcbiAgICAgICAgICAgIHRpdGxlPVwiJHtlc2NhcGVIdG1sKG1hdGNoSGVscCl9XCJcbiAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTtmb250LXNpemU6MC44NWVtO3BhZGRpbmc6NnB4IDhweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo2cHg7XCJcbiAgICAgICAgICAvPjxzcGFuIGNsYXNzPVwiZGVyaXZlZC15ZWFycy1oaW50XCIgZGF0YS1za2lsbD1cIiR7c2tpbGxOYW1lRXNjfVwiIHRpdGxlPVwiRXN0aW1hdGVkIHllYXJzIGRlcml2ZWQgZnJvbSBtYXRjaGVkIGV4cGVyaWVuY2UgZW50cmllc1wiIHN0eWxlPVwiZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luLXRvcDo0cHg7Zm9udC1zaXplOjAuOGVtO2NvbG9yOiM2YjcyODA7XCI+JHtlc2NhcGVIdG1sKHllYXJzSGludCl9PC9zcGFuPmAgOiAnPHNwYW4gc3R5bGU9XCJjb2xvcjojOWNhM2FmO1wiPlx1MjAxNDwvc3Bhbj4nfVxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJhY3Rpb24tYnRuc1wiIHN0eWxlPVwid2hpdGUtc3BhY2U6bm93cmFwO1wiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0biAke2RlZmF1bHRBY3Rpb24gPT09ICdlbXBoYXNpemUnICAgID8gJ2FjdGl2ZScgOiAnJ31cIiBkYXRhLWFjdGlvbj1cImVtcGhhc2l6ZVwiICAgIGFyaWEtbGFiZWw9XCJFbXBoYXNpemUgJHtza2lsbE5hbWVFc2N9XCIgICAgYXJpYS1wcmVzc2VkPVwiJHtkZWZhdWx0QWN0aW9uID09PSAnZW1waGFzaXplJ31cIiAgICB0aXRsZT1cIkVtcGhhc2l6ZSBcdTIwMTQgZmVhdHVyZSBwcm9taW5lbnRseVwiIHN0eWxlPVwiY29sb3I6IzEwYjk4MTtcIj5cdTI3OTU8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG4gJHtkZWZhdWx0QWN0aW9uID09PSAnaW5jbHVkZScgICAgICA/ICdhY3RpdmUnIDogJyd9XCIgZGF0YS1hY3Rpb249XCJpbmNsdWRlXCIgICAgICBhcmlhLWxhYmVsPVwiSW5jbHVkZSAke3NraWxsTmFtZUVzY31cIiAgICAgIGFyaWEtcHJlc3NlZD1cIiR7ZGVmYXVsdEFjdGlvbiA9PT0gJ2luY2x1ZGUnfVwiICAgICAgdGl0bGU9XCJJbmNsdWRlIFx1MjAxNCBzdGFuZGFyZCBsaXN0aW5nXCI+XHUyNzEzPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuICR7ZGVmYXVsdEFjdGlvbiA9PT0gJ2RlLWVtcGhhc2l6ZScgPyAnYWN0aXZlJyA6ICcnfVwiIGRhdGEtYWN0aW9uPVwiZGUtZW1waGFzaXplXCIgYXJpYS1sYWJlbD1cIkRlLWVtcGhhc2l6ZSAke3NraWxsTmFtZUVzY31cIiBhcmlhLXByZXNzZWQ9XCIke2RlZmF1bHRBY3Rpb24gPT09ICdkZS1lbXBoYXNpemUnfVwiIHRpdGxlPVwiRGUtZW1waGFzaXplIFx1MjAxNCBicmllZiBtZW50aW9uXCIgICAgc3R5bGU9XCJjb2xvcjojZjU5ZTBiO1wiPlx1Mjc5NjwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0biAke2RlZmF1bHRBY3Rpb24gPT09ICdleGNsdWRlJyAgICAgID8gJ2FjdGl2ZScgOiAnJ31cIiBkYXRhLWFjdGlvbj1cImV4Y2x1ZGVcIiAgICAgIGFyaWEtbGFiZWw9XCJFeGNsdWRlICR7c2tpbGxOYW1lRXNjfVwiICAgICAgYXJpYS1wcmVzc2VkPVwiJHtkZWZhdWx0QWN0aW9uID09PSAnZXhjbHVkZSd9XCIgICAgICB0aXRsZT1cIkV4Y2x1ZGUgXHUyMDE0IG9taXQgZnJvbSBDVlwiICAgICAgICAgIHN0eWxlPVwiY29sb3I6I2VmNDQ0NDtcIj4ke2V5ZVNsYXNoSWNvbigpfTwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIGRhdGEtYWN0aW9uPVwicm93LXVwXCIgICBhcmlhLWxhYmVsPVwiTW92ZSAke3NraWxsTmFtZUVzY30gZWFybGllclwiIHRpdGxlPVwiTW92ZSB1cFwiICAgJHtpc0ZpcnN0ID8gJ2Rpc2FibGVkJyA6ICcnfT5cdTIxOTE8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBkYXRhLWFjdGlvbj1cInJvdy1kb3duXCIgYXJpYS1sYWJlbD1cIk1vdmUgJHtza2lsbE5hbWVFc2N9IGxhdGVyXCIgICB0aXRsZT1cIk1vdmUgZG93blwiICR7aXNMYXN0ICA/ICdkaXNhYmxlZCcgOiAnJ30+XHUyMTkzPC9idXR0b24+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L3RyPlxuICAgIGA7XG4gIH0pO1xuXG4gIHRhYmxlSFRNTCArPSAnPC90Ym9keT48L3RhYmxlPic7XG4gIGNvbnRhaW5lci5pbm5lckhUTUwgPSB0YWJsZUhUTUw7XG5cbiAgLy8gU2F2ZSBncm91cCBrZXkgZm9yIHRoaXMgc2Vzc2lvbiB3aGVuIHVzZXIgZmluaXNoZXMgZWRpdGluZ1xuICBjb250YWluZXIucXVlcnlTZWxlY3RvcignLnNraWxsLWNhdGVnb3J5LW1hbmFnZXInKT8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZSA9PiB7XG4gICAgY29uc3QgY2F0ZWdvcnlNYW5hZ2VySW5wdXQgPSBlLnRhcmdldC5jbG9zZXN0KCcuc2tpbGwtY2F0ZWdvcnktbWFuYWdlci1pbnB1dCcpO1xuICAgIGlmIChjYXRlZ29yeU1hbmFnZXJJbnB1dCkge1xuICAgICAgY29uc3QgbWFuYWdlclJvdyA9IGNhdGVnb3J5TWFuYWdlcklucHV0LmNsb3Nlc3QoJy5za2lsbC1jYXRlZ29yeS1tYW5hZ2VyLXJvdycpO1xuICAgICAgY29uc3Qgb2xkQ2F0ZWdvcnkgPSBtYW5hZ2VyUm93Py5kYXRhc2V0LmNhdGVnb3J5IHx8ICcnO1xuICAgICAgY29uc3QgbmV3Q2F0ZWdvcnkgPSBjYXRlZ29yeU1hbmFnZXJJbnB1dC52YWx1ZS50cmltKCk7XG4gICAgICBpZiAoIW9sZENhdGVnb3J5IHx8ICFuZXdDYXRlZ29yeSB8fCBvbGRDYXRlZ29yeSA9PT0gbmV3Q2F0ZWdvcnkpIHtcbiAgICAgICAgaWYgKG1hbmFnZXJSb3cpIGNhdGVnb3J5TWFuYWdlcklucHV0LnZhbHVlID0gb2xkQ2F0ZWdvcnk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIF9yZW5hbWVTa2lsbENhdGVnb3J5TG9jYWxseShvbGRDYXRlZ29yeSwgbmV3Q2F0ZWdvcnkpO1xuICAgICAgcmVuYW1lU2tpbGxDYXRlZ29yeShvbGRDYXRlZ29yeSwgbmV3Q2F0ZWdvcnkpXG4gICAgICAgIC50aGVuKCgpID0+IF9yZW5kZXJTa2lsbHNUYWJsZShjb250YWluZXIsIHJlY29tbWVuZGVkU2V0LCBkYXRhLCBoYXJkU2tpbGxTZXQsIHNvZnRTa2lsbFNldCkpXG4gICAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgX3JlbmFtZVNraWxsQ2F0ZWdvcnlMb2NhbGx5KG5ld0NhdGVnb3J5LCBvbGRDYXRlZ29yeSk7XG4gICAgICAgICAgaWYgKG1hbmFnZXJSb3cpIGNhdGVnb3J5TWFuYWdlcklucHV0LnZhbHVlID0gb2xkQ2F0ZWdvcnk7XG4gICAgICAgICAgc2hvd1RvYXN0KCdGYWlsZWQgdG8gcmVuYW1lIHNraWxsIGNhdGVnb3J5LicsICdlcnJvcicpO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcjc2tpbGxzLXJldmlldy10YWJsZSB0Ym9keScpPy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBlID0+IHtcbiAgICBjb25zdCBjYXRlZ29yeUlucHV0ID0gZS50YXJnZXQuY2xvc2VzdCgnLnNraWxsLWNhdGVnb3J5LWlucHV0Jyk7XG5cbiAgY29uc3QgYWRkU2tpbGxGb3JtID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJyNhZGQtc2tpbGwtZm9ybScpO1xuICBjb25zdCB0b2dnbGVBZGRTa2lsbEZvcm0gPSAoKSA9PiB7XG4gICAgaWYgKCFhZGRTa2lsbEZvcm0pIHJldHVybjtcbiAgICBhZGRTa2lsbEZvcm0uc3R5bGUuZGlzcGxheSA9IGFkZFNraWxsRm9ybS5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScgPyAnYmxvY2snIDogJ25vbmUnO1xuICB9O1xuICBjb250YWluZXIucXVlcnlTZWxlY3RvcignI3RvZ2dsZS1hZGQtc2tpbGwtZm9ybScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRvZ2dsZUFkZFNraWxsRm9ybSk7XG4gIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcjY2FuY2VsLWFkZC1za2lsbCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBpZiAoIWFkZFNraWxsRm9ybSkgcmV0dXJuO1xuICAgIGFkZFNraWxsRm9ybS5yZXNldCgpO1xuICAgIGFkZFNraWxsRm9ybS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICB9KTtcbiAgYWRkU2tpbGxGb3JtPy5hZGRFdmVudExpc3RlbmVyKCdzdWJtaXQnLCBhc3luYyBlID0+IHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoYWRkU2tpbGxGb3JtKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgc2F2ZVVzZXJDcmVhdGVkU2tpbGwoe1xuICAgICAgICBuYW1lOiBmb3JtRGF0YS5nZXQoJ25hbWUnKSxcbiAgICAgICAgY2F0ZWdvcnk6IGZvcm1EYXRhLmdldCgnY2F0ZWdvcnknKSxcbiAgICAgICAgZ3JvdXA6IGZvcm1EYXRhLmdldCgnZ3JvdXAnKSxcbiAgICAgICAgcHJvZmljaWVuY3k6IGZvcm1EYXRhLmdldCgncHJvZmljaWVuY3knKSxcbiAgICAgICAgc3Vic2tpbGxzOiBmb3JtRGF0YS5nZXQoJ3N1YnNraWxscycpLFxuICAgICAgICBwYXJlbnRoZXRpY2FsOiBmb3JtRGF0YS5nZXQoJ3BhcmVudGhldGljYWwnKSxcbiAgICAgIH0pO1xuICAgICAgc2hvd1RvYXN0KCdTZXNzaW9uLW9ubHkgc2tpbGwgYWRkZWQuJyk7XG4gICAgICBhZGRTa2lsbEZvcm0ucmVzZXQoKTtcbiAgICAgIGFkZFNraWxsRm9ybS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgX3JlbmRlclNraWxsc1RhYmxlKGNvbnRhaW5lciwgcmVjb21tZW5kZWRTZXQsIGRhdGEsIGhhcmRTa2lsbFNldCwgc29mdFNraWxsU2V0KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgc2hvd1RvYXN0KGVycm9yLm1lc3NhZ2UgfHwgJ0ZhaWxlZCB0byBhZGQgc2tpbGwuJywgJ2Vycm9yJyk7XG4gICAgfVxuICB9KTtcbiAgICBpZiAoY2F0ZWdvcnlJbnB1dCkge1xuICAgICAgY29uc3Qgc2tpbGxOYW1lID0gY2F0ZWdvcnlJbnB1dC5kYXRhc2V0LnNraWxsO1xuICAgICAgY29uc3QgbmV3Q2F0ZWdvcnkgPSBjYXRlZ29yeUlucHV0LnZhbHVlLnRyaW0oKTtcbiAgICAgIHNhdmVTa2lsbENhdGVnb3J5T3ZlcnJpZGUoc2tpbGxOYW1lLCBuZXdDYXRlZ29yeSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICBzaG93VG9hc3QoJ0ZhaWxlZCB0byBzYXZlIHNraWxsIGNhdGVnb3J5LicsICdlcnJvcicpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaW5wdXQgPSBlLnRhcmdldC5jbG9zZXN0KCcuc2tpbGwtZ3JvdXAtaW5wdXQnKTtcbiAgICBpZiAoaW5wdXQpIHtcbiAgICAgIGNvbnN0IHNraWxsTmFtZSA9IGlucHV0LmRhdGFzZXQuc2tpbGw7XG4gICAgICBjb25zdCBuZXdHcm91cCA9IGlucHV0LnZhbHVlLnRyaW0oKTtcbiAgICAgIHNhdmVTa2lsbEdyb3VwT3ZlcnJpZGUoc2tpbGxOYW1lLCBuZXdHcm91cCkuY2F0Y2goKCkgPT4ge1xuICAgICAgICBzaG93VG9hc3QoJ0ZhaWxlZCB0byBzYXZlIHNraWxsIGdyb3VwLicsICdlcnJvcicpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcXVhbGlmaWVySW5wdXQgPSBlLnRhcmdldC5jbG9zZXN0KCcuc2tpbGwtcHJvZmljaWVuY3ktaW5wdXQsIC5za2lsbC1zdWJza2lsbHMtaW5wdXQsIC5za2lsbC1wYXJlbnRoZXRpY2FsLWlucHV0Jyk7XG4gICAgaWYgKCFxdWFsaWZpZXJJbnB1dCkgcmV0dXJuO1xuICAgIGNvbnN0IHNraWxsTmFtZSA9IHF1YWxpZmllcklucHV0LmRhdGFzZXQuc2tpbGw7XG4gICAgY29uc3Qgcm93ID0gcXVhbGlmaWVySW5wdXQuY2xvc2VzdCgndHJbZGF0YS1za2lsbF0nKTtcbiAgICBpZiAoIXNraWxsTmFtZSB8fCAhcm93KSByZXR1cm47XG4gICAgY29uc3QgcHJvZmljaWVuY3kgPSByb3cucXVlcnlTZWxlY3RvcignLnNraWxsLXByb2ZpY2llbmN5LWlucHV0Jyk/LnZhbHVlIHx8ICcnO1xuICAgIGNvbnN0IHN1YnNraWxsc1ZhbHVlID0gcm93LnF1ZXJ5U2VsZWN0b3IoJy5za2lsbC1zdWJza2lsbHMtaW5wdXQnKT8udmFsdWUgfHwgJyc7XG4gICAgY29uc3QgcGFyZW50aGV0aWNhbCA9IHJvdy5xdWVyeVNlbGVjdG9yKCcuc2tpbGwtcGFyZW50aGV0aWNhbC1pbnB1dCcpPy52YWx1ZSB8fCAnJztcbiAgICBzYXZlU2tpbGxRdWFsaWZpZXJPdmVycmlkZShza2lsbE5hbWUsIHtcbiAgICAgIHByb2ZpY2llbmN5LFxuICAgICAgc3Vic2tpbGxzOiBzdWJza2lsbHNWYWx1ZSxcbiAgICAgIHBhcmVudGhldGljYWwsXG4gICAgfSkuY2F0Y2goKCkgPT4ge1xuICAgICAgc2hvd1RvYXN0KCdGYWlsZWQgdG8gc2F2ZSBza2lsbCBxdWFsaWZpZXJzLicsICdlcnJvcicpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBVcGRhdGUgZGVyaXZlZC15ZWFycyBoaW50IGxpdmUgYXMgdXNlciBlZGl0cyB0aGUgZXhwZXJpZW5jZSBtYXRjaCBpbnB1dFxuICBjb250YWluZXIucXVlcnlTZWxlY3RvcignI3NraWxscy1yZXZpZXctdGFibGUgdGJvZHknKT8uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBlID0+IHtcbiAgICBjb25zdCBpbnB1dCA9IGUudGFyZ2V0LmNsb3Nlc3QoJy5za2lsbC1tYXRjaC1pbnB1dCcpO1xuICAgIGlmICghaW5wdXQpIHJldHVybjtcbiAgICBjb25zdCBza2lsbE5hbWUgPSBpbnB1dC5kYXRhc2V0LnNraWxsO1xuICAgIGNvbnN0IGlkcyA9IGlucHV0LnZhbHVlLnNwbGl0KCcsJykubWFwKHggPT4geC50cmltKCkpLmZpbHRlcihCb29sZWFuKTtcbiAgICBjb25zdCB5ZWFycyA9IF9jb21wdXRlWWVhcnNGcm9tSWRzKGlkcywgYWxsRXhwZXJpZW5jZXMpO1xuICAgIGNvbnN0IGhpbnQgPSB5ZWFycyAhPSBudWxsID8gYH4ke3llYXJzfSB5ciR7eWVhcnMgPT09IDEgPyAnJyA6ICdzJ31gIDogJ25vIG1hdGNoJztcbiAgICBjb25zdCBzcGFuID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoYC5kZXJpdmVkLXllYXJzLWhpbnRbZGF0YS1za2lsbD1cIiR7Q1NTLmVzY2FwZShza2lsbE5hbWUpfVwiXWApO1xuICAgIGlmIChzcGFuKSBzcGFuLnRleHRDb250ZW50ID0gaGludDtcbiAgfSk7XG5cbiAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJyNza2lsbHMtcmV2aWV3LXRhYmxlIHRib2R5Jyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZSA9PiB7XG4gICAgY29uc3QgdHlwZVRvZ2dsZSA9IGUudGFyZ2V0LmNsb3Nlc3QoJy5za2lsbC10eXBlLXRvZ2dsZScpO1xuICAgIGlmICh0eXBlVG9nZ2xlKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgY29uc3Qgc2tpbGxOYW1lID0gdHlwZVRvZ2dsZS5kYXRhc2V0LnNraWxsO1xuICAgICAgY29uc3QgdG9nZ2xlVG8gPSB0eXBlVG9nZ2xlLmRhdGFzZXQudG9nZ2xlVG8gfHwgbnVsbDtcbiAgICAgIHdpbmRvdy5fc2tpbGxUeXBlT3ZlcnJpZGVzID0gd2luZG93Ll9za2lsbFR5cGVPdmVycmlkZXMgfHwge307XG4gICAgICBpZiAodG9nZ2xlVG8pIHtcbiAgICAgICAgd2luZG93Ll9za2lsbFR5cGVPdmVycmlkZXNbc2tpbGxOYW1lLnRvTG93ZXJDYXNlKCldID0gdG9nZ2xlVG87XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgd2luZG93Ll9za2lsbFR5cGVPdmVycmlkZXNbc2tpbGxOYW1lLnRvTG93ZXJDYXNlKCldO1xuICAgICAgfVxuICAgICAgc2F2ZVNraWxsUXVhbGlmaWVyT3ZlcnJpZGUoc2tpbGxOYW1lLCB7XG4gICAgICAgIHByb2ZpY2llbmN5OiBjb250YWluZXIucXVlcnlTZWxlY3RvcihgLnNraWxsLXByb2ZpY2llbmN5LWlucHV0W2RhdGEtc2tpbGw9XCIke19jc3NFc2NhcGUoc2tpbGxOYW1lKX1cIl1gKT8udmFsdWUgfHwgJycsXG4gICAgICAgIHN1YnNraWxsczogY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoYC5za2lsbC1zdWJza2lsbHMtaW5wdXRbZGF0YS1za2lsbD1cIiR7X2Nzc0VzY2FwZShza2lsbE5hbWUpfVwiXWApPy52YWx1ZSB8fCAnJyxcbiAgICAgICAgcGFyZW50aGV0aWNhbDogY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoYC5za2lsbC1wYXJlbnRoZXRpY2FsLWlucHV0W2RhdGEtc2tpbGw9XCIke19jc3NFc2NhcGUoc2tpbGxOYW1lKX1cIl1gKT8udmFsdWUgfHwgJycsXG4gICAgICAgIHNraWxsX3R5cGU6IHRvZ2dsZVRvIHx8ICcnLFxuICAgICAgfSkudGhlbigoKSA9PiBfcmVuZGVyU2tpbGxzVGFibGUoY29udGFpbmVyLCByZWNvbW1lbmRlZFNldCwgZGF0YSwgaGFyZFNraWxsU2V0LCBzb2Z0U2tpbGxTZXQpKVxuICAgICAgICAuY2F0Y2goKCkgPT4gc2hvd1RvYXN0KCdGYWlsZWQgdG8gc2F2ZSBza2lsbCB0eXBlIG92ZXJyaWRlLicsICdlcnJvcicpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBhaUJ0biA9IGUudGFyZ2V0LmNsb3Nlc3QoJy5za2lsbC1hcHBseS1haScpO1xuICAgIGlmIChhaUJ0bikge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGNvbnN0IHNraWxsTmFtZSA9IGFpQnRuLmRhdGFzZXQuc2tpbGw7XG4gICAgICBjb25zdCBmaWVsZCA9IGFpQnRuLmRhdGFzZXQuYWlGaWVsZDtcbiAgICAgIGNvbnN0IHZhbHVlID0gYWlCdG4uZGF0YXNldC5haVZhbHVlIHx8ICcnO1xuICAgICAgaWYgKGZpZWxkID09PSAnY2F0ZWdvcnknKSB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoYC5za2lsbC1jYXRlZ29yeS1pbnB1dFtkYXRhLXNraWxsPVwiJHtfY3NzRXNjYXBlKHNraWxsTmFtZSl9XCJdYCk7XG4gICAgICAgIGlmIChpbnB1dCkgaW5wdXQudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgc2F2ZVNraWxsQ2F0ZWdvcnlPdmVycmlkZShza2lsbE5hbWUsIHZhbHVlKVxuICAgICAgICAgIC50aGVuKCgpID0+IF9yZW5kZXJTa2lsbHNUYWJsZShjb250YWluZXIsIHJlY29tbWVuZGVkU2V0LCBkYXRhLCBoYXJkU2tpbGxTZXQsIHNvZnRTa2lsbFNldCkpXG4gICAgICAgICAgLmNhdGNoKCgpID0+IHNob3dUb2FzdCgnRmFpbGVkIHRvIGFwcGx5IEFJIGNhdGVnb3J5IHN1Z2dlc3Rpb24uJywgJ2Vycm9yJykpO1xuICAgICAgfSBlbHNlIGlmIChmaWVsZCA9PT0gJ2dyb3VwJykge1xuICAgICAgICBjb25zdCBpbnB1dCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKGAuc2tpbGwtZ3JvdXAtaW5wdXRbZGF0YS1za2lsbD1cIiR7X2Nzc0VzY2FwZShza2lsbE5hbWUpfVwiXWApO1xuICAgICAgICBpZiAoaW5wdXQpIGlucHV0LnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHNhdmVTa2lsbEdyb3VwT3ZlcnJpZGUoc2tpbGxOYW1lLCB2YWx1ZSlcbiAgICAgICAgICAudGhlbigoKSA9PiBfcmVuZGVyU2tpbGxzVGFibGUoY29udGFpbmVyLCByZWNvbW1lbmRlZFNldCwgZGF0YSwgaGFyZFNraWxsU2V0LCBzb2Z0U2tpbGxTZXQpKVxuICAgICAgICAgIC5jYXRjaCgoKSA9PiBzaG93VG9hc3QoJ0ZhaWxlZCB0byBhcHBseSBBSSBncm91cCBzdWdnZXN0aW9uLicsICdlcnJvcicpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgYnRuID0gZS50YXJnZXQuY2xvc2VzdCgnLmljb24tYnRuJyk7XG4gICAgaWYgKCFidG4pIHJldHVybjtcbiAgICBjb25zdCB0ciA9IGJ0bi5jbG9zZXN0KCd0cltkYXRhLXNraWxsXScpO1xuICAgIGlmICghdHIpIHJldHVybjtcbiAgICBjb25zdCBza2lsbE5hbWUgPSB0ci5kYXRhc2V0LnNraWxsO1xuICAgIGNvbnN0IGFjdGlvbiAgICA9IGJ0bi5kYXRhc2V0LmFjdGlvbjtcbiAgICBpZiAoYWN0aW9uID09PSAncm93LXVwJykge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIG1vdmVTa2lsbFJvdyhza2lsbE5hbWUsIC0xKTtcbiAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PT0gJ3Jvdy1kb3duJykge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIG1vdmVTa2lsbFJvdyhza2lsbE5hbWUsICsxKTtcbiAgICB9IGVsc2UgaWYgKGFjdGlvbikge1xuICAgICAgaGFuZGxlQWN0aW9uQ2xpY2soc2tpbGxOYW1lLCBhY3Rpb24sICdza2lsbCcpO1xuICAgIH1cbiAgfSk7XG5cbiAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5za2lsbC1jYXRlZ29yeS1tYW5hZ2VyJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZSA9PiB7XG4gICAgY29uc3QgYnRuID0gZS50YXJnZXQuY2xvc2VzdCgnLmljb24tYnRuW2RhdGEtYWN0aW9uXj1cImNhdGVnb3J5LVwiXScpO1xuICAgIGlmICghYnRuKSByZXR1cm47XG4gICAgY29uc3QgY2F0ZWdvcnlOYW1lID0gYnRuLmRhdGFzZXQuY2F0ZWdvcnkgfHwgJyc7XG4gICAgY29uc3QgZGlyZWN0aW9uID0gYnRuLmRhdGFzZXQuYWN0aW9uID09PSAnY2F0ZWdvcnktdXAnID8gLTEgOiAxO1xuICAgIGNvbnN0IHVwZGF0ZWRPcmRlciA9IF9tb3ZlU2tpbGxDYXRlZ29yeUxvY2FsbHkoY2F0ZWdvcnlOYW1lLCBkaXJlY3Rpb24pO1xuICAgIGlmICghdXBkYXRlZE9yZGVyKSByZXR1cm47XG4gICAgc2F2ZVNraWxsQ2F0ZWdvcnlPcmRlcih1cGRhdGVkT3JkZXIpXG4gICAgICAudGhlbigoKSA9PiBfcmVuZGVyU2tpbGxzVGFibGUoY29udGFpbmVyLCByZWNvbW1lbmRlZFNldCwgZGF0YSwgaGFyZFNraWxsU2V0LCBzb2Z0U2tpbGxTZXQpKVxuICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgX21vdmVTa2lsbENhdGVnb3J5TG9jYWxseShjYXRlZ29yeU5hbWUsIC1kaXJlY3Rpb24pO1xuICAgICAgICBzaG93VG9hc3QoJ0ZhaWxlZCB0byBzYXZlIHNraWxsIGNhdGVnb3J5IG9yZGVyLicsICdlcnJvcicpO1xuICAgICAgfSk7XG4gIH0pO1xuXG4gIGNvbnN0IHNraWxsVG9vbGJhciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBza2lsbFRvb2xiYXIuY2xhc3NOYW1lID0gJ2J1bGstdG9vbGJhcic7XG4gIHNraWxsVG9vbGJhci5pbm5lckhUTUwgPSBgXG4gICAgPHNwYW4+QnVsazo8L3NwYW4+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImJ1bGstYnRuIGJ1bGstcmVjb21tZW5kZWRcIiBvbmNsaWNrPVwiYnVsa0FjdGlvbigncmVjb21tZW5kZWQnLCdza2lsbCcpXCIgdGl0bGU9XCJTZXQgYWxsIHRvIHRoZSBMTE0gcmVjb21tZW5kYXRpb25cIj5cdTI3MjggQWNjZXB0IEFsbCBSZWNvbW1lbmRlZDwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJidWxrLWJ0biBidWxrLWVtcGhhc2l6ZVwiICAgb25jbGljaz1cImJ1bGtBY3Rpb24oJ2VtcGhhc2l6ZScsJ3NraWxsJylcIj5cdTI3OTUgRW1waGFzaXplIEFsbDwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJidWxrLWJ0biBidWxrLWluY2x1ZGVcIiAgICAgb25jbGljaz1cImJ1bGtBY3Rpb24oJ2luY2x1ZGUnLCdza2lsbCcpXCI+XHUyNzEzIEluY2x1ZGUgQWxsPC9idXR0b24+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImJ1bGstYnRuIGJ1bGstZXhjbHVkZVwiICAgICBvbmNsaWNrPVwiYnVsa0FjdGlvbignZXhjbHVkZScsJ3NraWxsJylcIj4ke2V5ZVNsYXNoSWNvbigpfSBFeGNsdWRlIEFsbDwvYnV0dG9uPlxuICBgO1xuICBjb250YWluZXIuaW5zZXJ0QmVmb3JlKHNraWxsVG9vbGJhciwgY29udGFpbmVyLmZpcnN0Q2hpbGQpO1xuXG4gICQoJyNza2lsbHMtcmV2aWV3LXRhYmxlJykuRGF0YVRhYmxlKHtcbiAgICBwYWdpbmc6IGZhbHNlLFxuICAgIG9yZGVyOiBbXSxcbiAgICBsYW5ndWFnZTogeyBzZWFyY2g6ICdGaWx0ZXIgc2tpbGxzOicgfVxuICB9KTtcbiAgX3VwZGF0ZVBhZ2VFc3RpbWF0ZSgpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgUm93IHJlb3JkZXIgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIG1vdmVTa2lsbFJvdyhza2lsbE5hbWUsIGRpcmVjdGlvbikge1xuICBjb25zdCBhcnIgPSB3aW5kb3cuX3NraWxsc09yZGVyZWQ7XG4gIGlmICghYXJyKSByZXR1cm47XG4gIGNvbnN0IGlkeCA9IGFyci5maW5kSW5kZXgocyA9PiAodHlwZW9mIHMgPT09ICdzdHJpbmcnID8gcyA6IHMubmFtZSB8fCBzKSA9PT0gc2tpbGxOYW1lKTtcbiAgaWYgKGlkeCA8IDApIHJldHVybjtcbiAgY29uc3QgbmV3SWR4ID0gaWR4ICsgZGlyZWN0aW9uO1xuICBpZiAobmV3SWR4IDwgMCB8fCBuZXdJZHggPj0gYXJyLmxlbmd0aCkgcmV0dXJuO1xuICBbYXJyW2lkeF0sIGFycltuZXdJZHhdXSA9IFthcnJbbmV3SWR4XSwgYXJyW2lkeF1dO1xuICB3aW5kb3cuX3NraWxsc09yZGVyZWQgPSBhcnI7XG4gIF9yZW5kZXJTa2lsbHNUYWJsZShudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTtcbiAgZmV0Y2goJy9hcGkvcmVvcmRlci1yb3dzJywge1xuICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgdHlwZTogJ3NraWxsJywgb3JkZXJlZF9pZHM6IGFyci5tYXAocyA9PiAodHlwZW9mIHMgPT09ICdzdHJpbmcnID8gcyA6IHMubmFtZSB8fCBzKSkgfSlcbiAgfSkuY2F0Y2goKCkgPT4ge30pO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgTGVnYWN5IGludGVyYWN0aXZlLW1vZGUgcmVzcG9uc2UgaGFuZGxlciBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gaGFuZGxlU2tpbGxzUmVzcG9uc2UobWVzc2FnZSkge1xuICB3aW5kb3cud2FpdGluZ0ZvclNraWxsc1Jlc3BvbnNlID0gZmFsc2U7XG4gIGNvbnN0IHJlc3BvbnNlID0gbWVzc2FnZS50b0xvd2VyQ2FzZSgpO1xuXG4gIGlmIChyZXNwb25zZS5pbmNsdWRlcygneWVzJykpIHtcbiAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCAnRXhjZWxsZW50ISBJXFwnbGwgdXNlIHRoaXMgc2tpbGxzIHN0cmF0ZWd5IGluIHlvdXIgQ1YuJyk7XG4gIH0gZWxzZSBpZiAocmVzcG9uc2UuaW5jbHVkZXMoJ25vJykgfHwgcmVzcG9uc2UuaW5jbHVkZXMoJ21vZGlmeScpKSB7XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ0kgdW5kZXJzdGFuZC4gV2hhdCBjaGFuZ2VzIHdvdWxkIHlvdSBsaWtlIG1lIHRvIG1ha2UgdG8gdGhlIHNraWxscyBlbXBoYXNpcz8nKTtcbiAgfSBlbHNlIHtcbiAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCAnSVxcJ2xsIG5vdGUgeW91ciBmZWVkYmFjayBvbiB0aGUgc2tpbGxzIHN0cmF0ZWd5LicpO1xuICB9XG5cbiAgZmluaXNoSW50ZXJhY3RpdmVSZXZpZXcoKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFN1Ym1pdCBkZWNpc2lvbnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIHN1Ym1pdFNraWxsRGVjaXNpb25zKCkge1xuICAvKiBkdWNrZmxvdzpcbiAgICogICBpZDogc2tpbGxzX3VpX3N1Ym1pdF9saXZlXG4gICAqICAga2luZDogdWlcbiAgICogICB0aW1lc3RhbXA6ICcyMDI2LTAzLTI1VDIxOjM5OjQ4WidcbiAgICogICBzdGF0dXM6IGxpdmVcbiAgICogICBoYW5kbGVzOlxuICAgKiAgIC0gdWk6c2tpbGxzLXJldmlldy5zdWJtaXRcbiAgICogICBjYWxsczpcbiAgICogICAtIFBPU1QgL2FwaS9yZXZpZXctZGVjaXNpb25zXG4gICAqICAgLSBQT1NUIC9hcGkvY3YvbGF5b3V0LWVzdGltYXRlXG4gICAqICAgcmVhZHM6XG4gICAqICAgLSB3aW5kb3c6dXNlclNlbGVjdGlvbnMuc2tpbGxzXG4gICAqICAgLSB3aW5kb3c6X3NraWxsc09yZGVyZWRcbiAgICogICAtIGRvbTouc2tpbGwtbWF0Y2gtaW5wdXQudmFsdWVcbiAgICogICB3cml0ZXM6XG4gICAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9yZXZpZXctZGVjaXNpb25zLmRlY2lzaW9uc1xuICAgKiAgIC0gcmVxdWVzdDpQT1NUIC9hcGkvcmV2aWV3LWRlY2lzaW9ucy5leHRyYV9za2lsbHNcbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL3Jldmlldy1kZWNpc2lvbnMuZXh0cmFfc2tpbGxfbWF0Y2hlc1xuICAgKiAgIC0gd2luZG93Ol9zYXZlZERlY2lzaW9ucy5za2lsbF9kZWNpc2lvbnNcbiAgICogICAtIHdpbmRvdzpfc2F2ZWREZWNpc2lvbnMuZXh0cmFfc2tpbGxzXG4gICAqICAgLSB3aW5kb3c6X3NhdmVkRGVjaXNpb25zLmV4dHJhX3NraWxsX21hdGNoZXNcbiAgICogICBub3RlczogU3VibWl0cyBza2lsbCBpbmNsdXNpb24gZGVjaXNpb25zIHRvZ2V0aGVyIHdpdGggc2Vzc2lvbi1vbmx5IGV4dHJhIHNraWxscyBhbmQgZXhwZXJpZW5jZS1tYXRjaCBldmlkZW5jZSBzbyBiYWNrZW5kIGdlbmVyYXRpb24gY2FuIG1hdGVyaWFsaXplIHRoZSBzYW1lIG92ZXJsYXkgc3RhdGUuXG4gICAqL1xuICBjb25zdCBkZWNpc2lvbnMgPSB1c2VyU2VsZWN0aW9ucy5za2lsbHM7XG4gIGNvbnN0IGNvdW50ID0gT2JqZWN0LmtleXMoZGVjaXNpb25zKS5sZW5ndGg7XG5cbiAgaWYgKGNvdW50ID09PSAwKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ05vIFNlbGVjdGlvbnMnLCAnUGxlYXNlIHNlbGVjdCBhY3Rpb25zIGZvciBhdCBsZWFzdCBvbmUgc2tpbGwgYmVmb3JlIHN1Ym1pdHRpbmcuJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBleHRyYVNraWxscyA9ICh3aW5kb3cuX3NraWxsc09yZGVyZWQgfHwgW10pXG4gICAgICAuZmlsdGVyKHNraWxsID0+IHNraWxsICYmIHR5cGVvZiBza2lsbCA9PT0gJ29iamVjdCcgJiYgc2tpbGwuX2lzTmV3KVxuICAgICAgLmZpbHRlcihza2lsbCA9PiB7XG4gICAgICAgIGNvbnN0IGFjdGlvbiA9IGRlY2lzaW9uc1tfc2tpbGxOYW1lKHNraWxsKV07XG4gICAgICAgIHJldHVybiBhY3Rpb24gPT09ICdpbmNsdWRlJyB8fCBhY3Rpb24gPT09ICdlbXBoYXNpemUnIHx8IGFjdGlvbiA9PT0gJ2RlLWVtcGhhc2l6ZSc7XG4gICAgICB9KVxuICAgICAgLm1hcChza2lsbCA9PiB7XG4gICAgICAgIGlmIChza2lsbC5faXNVc2VyQ3JlYXRlZCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiBfc2tpbGxOYW1lKHNraWxsKSxcbiAgICAgICAgICAgIGNhdGVnb3J5OiBTdHJpbmcoc2tpbGwuY2F0ZWdvcnkgfHwgJycpLnRyaW0oKSxcbiAgICAgICAgICAgIGdyb3VwOiBTdHJpbmcoc2tpbGwuZ3JvdXAgfHwgJycpLnRyaW0oKSxcbiAgICAgICAgICAgIHByb2ZpY2llbmN5OiBTdHJpbmcoc2tpbGwucHJvZmljaWVuY3kgfHwgJycpLnRyaW0oKSxcbiAgICAgICAgICAgIHN1YnNraWxsczogX25vcm1hbGl6ZVNraWxsU3Vic2tpbGxzKHNraWxsLnN1YnNraWxscyB8fCBza2lsbC5zdWJfc2tpbGxzIHx8IFtdKSxcbiAgICAgICAgICAgIHBhcmVudGhldGljYWw6IFN0cmluZyhza2lsbC5wYXJlbnRoZXRpY2FsIHx8ICcnKS50cmltKCksXG4gICAgICAgICAgICB1c2VyX2NyZWF0ZWQ6IHRydWUsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX3NraWxsTmFtZShza2lsbCk7XG4gICAgICB9KTtcbiAgICBjb25zdCBleHRyYVNraWxsTmFtZXMgPSBleHRyYVNraWxscy5tYXAoc2tpbGwgPT4gdHlwZW9mIHNraWxsID09PSAnc3RyaW5nJyA/IHNraWxsIDogc2tpbGwubmFtZSk7XG5cbiAgICBjb25zdCBtYXRjaElucHV0cyA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnNraWxsLW1hdGNoLWlucHV0JykpO1xuICAgIGNvbnN0IGFsbG93ZWQgPSBuZXcgU2V0KCh3aW5kb3cuX2FsbEV4cGVyaWVuY2VzIHx8IFtdKS5tYXAoZSA9PiBlLmlkKS5maWx0ZXIoQm9vbGVhbikpO1xuICAgIGNvbnN0IGV4dHJhU2tpbGxNYXRjaGVzID0ge307XG4gICAgZm9yIChjb25zdCBpbnB1dCBvZiBtYXRjaElucHV0cykge1xuICAgICAgY29uc3Qgc2tpbGxOYW1lID0gaW5wdXQuZGF0YXNldC5za2lsbDtcbiAgICAgIGlmICghc2tpbGxOYW1lIHx8ICFleHRyYVNraWxsTmFtZXMuaW5jbHVkZXMoc2tpbGxOYW1lKSkgY29udGludWU7XG4gICAgICBjb25zdCBpZHMgPSBTdHJpbmcoaW5wdXQudmFsdWUgfHwgJycpXG4gICAgICAgIC5zcGxpdCgnLCcpXG4gICAgICAgIC5tYXAoKHgpID0+IHgudHJpbSgpKVxuICAgICAgICAuZmlsdGVyKCh4KSA9PiB4ICYmIGFsbG93ZWQuaGFzKHgpKTtcbiAgICAgIGlmIChpZHMubGVuZ3RoID4gMCkgZXh0cmFTa2lsbE1hdGNoZXNbc2tpbGxOYW1lXSA9IGlkcztcbiAgICB9XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3Jldmlldy1kZWNpc2lvbnMnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICB0eXBlOiAnc2tpbGxzJyxcbiAgICAgICAgZGVjaXNpb25zOiBkZWNpc2lvbnMsXG4gICAgICAgIGV4dHJhX3NraWxsczogZXh0cmFTa2lsbHMsXG4gICAgICAgIGV4dHJhX3NraWxsX21hdGNoZXM6IGV4dHJhU2tpbGxNYXRjaGVzLFxuICAgICAgfSlcbiAgICB9KTtcblxuICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgc3RhdGVNYW5hZ2VyLm1hcmtDb250ZW50Q2hhbmdlZCgpO1xuICAgICAgY29uc3QgZXh0cmFOb3RlID0gZXh0cmFTa2lsbHMubGVuZ3RoID4gMFxuICAgICAgICA/IGAgKCR7ZXh0cmFTa2lsbHMubGVuZ3RofSBuZXcgc2tpbGwocykgYWRkZWQgXHUyMDE0IGF2YWlsYWJsZSBmb3Igd3JpdGUtYmFjayB0byBtYXN0ZXIgQ1YgaW4gdGhlIEhhcnZlc3QgdGFiKWBcbiAgICAgICAgOiAnJztcbiAgICAgIHNob3dUb2FzdChgU2tpbGwgZGVjaXNpb25zIHNhdmVkICgke2NvdW50fSBpdGVtcykke2V4dHJhTm90ZX1gKTtcbiAgICAgIHNjaGVkdWxlQXRzUmVmcmVzaCgpO1xuICAgICAgLy8gUGVyc2lzdCBzYXZlZCBkZWNpc2lvbnMgbG9jYWxseSBzbyB0aGUgVUkgcmVmbGVjdHMgdGhlbSBpbW1lZGlhdGVseVxuICAgICAgd2luZG93Ll9zYXZlZERlY2lzaW9ucyA9IHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMgfHwge307XG4gICAgICB3aW5kb3cuX3NhdmVkRGVjaXNpb25zLnNraWxsX2RlY2lzaW9ucyA9IGRlY2lzaW9ucztcbiAgICAgIGlmICghd2luZG93Ll9zYXZlZERlY2lzaW9ucy5leHRyYV9za2lsbHMpIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMuZXh0cmFfc2tpbGxzID0gW107XG4gICAgICBpZiAoZXh0cmFTa2lsbHMubGVuZ3RoID4gMCkgd2luZG93Ll9zYXZlZERlY2lzaW9ucy5leHRyYV9za2lsbHMgPSBleHRyYVNraWxscztcbiAgICAgIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMuZXh0cmFfc2tpbGxfbWF0Y2hlcyA9IGV4dHJhU2tpbGxNYXRjaGVzO1xuICAgICAgdXNlclNlbGVjdGlvbnMuc2tpbGxzID0geyAuLi5kZWNpc2lvbnMgfTtcbiAgICAgIGlmICh0eXBlb2YgdXBkYXRlSW5jbHVzaW9uQ291bnRzID09PSAnZnVuY3Rpb24nKSB1cGRhdGVJbmNsdXNpb25Db3VudHMoKTtcbiAgICAgIHN3aXRjaFRhYignYWNoaWV2ZW1lbnRzLXJldmlldycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBlcnJvciA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIHNob3dUb2FzdChgRXJyb3I6ICR7ZXJyb3IuZXJyb3IgfHwgJ0ZhaWxlZCB0byBzYXZlIGRlY2lzaW9ucyd9YCwgJ2Vycm9yJyk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy5lcnJvcignRXJyb3Igc3VibWl0dGluZyBza2lsbCBkZWNpc2lvbnM6JywgZXJyb3IpO1xuICAgIHNob3dUb2FzdCgnRmFpbGVkIHRvIHNhdmUgZGVjaXNpb25zLiBQbGVhc2UgdHJ5IGFnYWluLicsICdlcnJvcicpO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFeHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5leHBvcnQge1xuICBfcGFyc2VZZWFyRnJvbVN0cixcbiAgX2NvbXB1dGVZZWFyc0Zyb21JZHMsXG4gIHNhdmVTa2lsbEdyb3VwT3ZlcnJpZGUsXG4gIHNhdmVTa2lsbENhdGVnb3J5T3ZlcnJpZGUsXG4gIHJlbmFtZVNraWxsQ2F0ZWdvcnksXG4gIHNhdmVTa2lsbENhdGVnb3J5T3JkZXIsXG4gIHNhdmVTa2lsbFF1YWxpZmllck92ZXJyaWRlLFxuICBzYXZlVXNlckNyZWF0ZWRTa2lsbCxcbiAgYnVpbGRTa2lsbHNSZXZpZXdUYWJsZSxcbiAgX3JlbmRlclNraWxsc1RhYmxlLFxuICBtb3ZlU2tpbGxSb3csXG4gIGhhbmRsZVNraWxsc1Jlc3BvbnNlLFxuICBzdWJtaXRTa2lsbERlY2lzaW9ucyxcbn07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIGFjaGlldmVtZW50cy1yZXZpZXcuanNcbiAqIEVTIG1vZHVsZSBcdTIwMTQgQWNoaWV2ZW1lbnRzIHJldmlldyB0YWJsZSwgYWNoaWV2ZW1lbnRzIGVkaXRvciwgYW5kIEFJIHJld3JpdGUgbW9kYWwuXG4gKlxuICogRGVwZW5kZW5jaWVzIHJlc29sdmVkIHRocm91Z2ggZ2xvYmFsVGhpcyBhdCBydW50aW1lOlxuICogICAtIHBlbmRpbmdSZWNvbW1lbmRhdGlvbnMgICAgICAgICh3aW5kb3cpXG4gKiAgIC0gYWNoaWV2ZW1lbnREZWNpc2lvbnMgICAgICAgICAgKHdpbmRvdyBcdTIwMTQgYWxzbyBpbml0aWFsaXNlZCBoZXJlKVxuICogICAtIF9hY2hpZXZlbWVudHNPcmRlcmVkICAgICAgICAgICh3aW5kb3cgXHUyMDE0IGFsc28gaW5pdGlhbGlzZWQgaGVyZSlcbiAqICAgLSBfc3VnZ2VzdGVkQWNoc09yZGVyZWQgICAgICAgICAod2luZG93KVxuICogICAtIF9zYXZlZERlY2lzaW9ucyAgICAgICAgICAgICAgICh3aW5kb3cpXG4gKiAgIC0gYWNoaWV2ZW1lbnRFZGl0cyAgICAgICAgICAgICAgKHdpbmRvdylcbiAqICAgLSB1c2VyU2VsZWN0aW9ucyAgICAgICAgICAgICAgICAod2luZG93KVxuICogICAtIGdldEFjaGlldmVtZW50UmVjb21tZW5kYXRpb24gIChnbG9iYWxUaGlzIGZ1bmN0aW9uKVxuICogICAtIGdldEFjaGlldmVtZW50Q29uZmlkZW5jZSAgICAgIChnbG9iYWxUaGlzIGZ1bmN0aW9uKVxuICogICAtIGdldEFjaGlldmVtZW50UmVhc29uaW5nICAgICAgIChnbG9iYWxUaGlzIGZ1bmN0aW9uKVxuICogICAtIGVzY2FwZUh0bWwgICAgICAgICAgICAgICAgICAgIChnbG9iYWxUaGlzIGZ1bmN0aW9uKVxuICogICAtIGhhbmRsZUFjaGlldmVtZW50QWN0aW9uICAgICAgIChnbG9iYWxUaGlzIC8gdGhpcyBtb2R1bGUpXG4gKiAgIC0gYnVsa0FjaGlldmVtZW50QWN0aW9uICAgICAgICAgKGdsb2JhbFRoaXMgLyB0aGlzIG1vZHVsZSlcbiAqICAgLSBtb3ZlQWNoaWV2ZW1lbnRSb3cgICAgICAgICAgICAoZ2xvYmFsVGhpcyAvIHRoaXMgbW9kdWxlKVxuICogICAtIG1vdmVTdWdnZXN0ZWRBY2hpZXZlbWVudFJvdyAgIChnbG9iYWxUaGlzIC8gdGhpcyBtb2R1bGUpXG4gKiAgIC0gc2F2ZVRvcExldmVsQWNoaWV2ZW1lbnRGaWVsZCAgKGdsb2JhbFRoaXMgLyB0aGlzIG1vZHVsZSlcbiAqICAgLSBzYXZlU3VnZ2VzdGVkQWNoaWV2ZW1lbnRGaWVsZCAoZ2xvYmFsVGhpcyAvIHRoaXMgbW9kdWxlKVxuICogICAtIGFpUmV3cml0ZVRvcExldmVsQWNoaWV2ZW1lbnQgIChnbG9iYWxUaGlzIC8gdGhpcyBtb2R1bGUpXG4gKiAgIC0gYWlSZXdyaXRlU3VnZ2VzdGVkQWNoaWV2ZW1lbnQgKGdsb2JhbFRoaXMgLyB0aGlzIG1vZHVsZSlcbiAqICAgLSBkZWxldGVUb3BMZXZlbEFjaGlldmVtZW50ICAgICAoZ2xvYmFsVGhpcyAvIHRoaXMgbW9kdWxlKVxuICogICAtIGRlbGV0ZVN1Z2dlc3RlZEFjaGlldmVtZW50ICAgIChnbG9iYWxUaGlzIC8gdGhpcyBtb2R1bGUpXG4gKiAgIC0gc2hvd1RvYXN0ICAgICAgICAgICAgICAgICAgICAgKGdsb2JhbFRoaXMgZnVuY3Rpb24pXG4gKiAgIC0gc2NoZWR1bGVBdHNSZWZyZXNoICAgICAgICAgICAgKGdsb2JhbFRoaXMgZnVuY3Rpb24pXG4gKiAgIC0gdXBkYXRlSW5jbHVzaW9uQ291bnRzICAgICAgICAgKGdsb2JhbFRoaXMgZnVuY3Rpb24pXG4gKiAgIC0gc3dpdGNoVGFiICAgICAgICAgICAgICAgICAgICAgKGdsb2JhbFRoaXMgZnVuY3Rpb24pXG4gKiAgIC0gY29uZmlybURpYWxvZyAgICAgICAgICAgICAgICAgKGdsb2JhbFRoaXMgZnVuY3Rpb24pXG4gKiAgIC0gY2xvc2VBbGVydE1vZGFsICAgICAgICAgICAgICAgKGdsb2JhbFRoaXMgZnVuY3Rpb24pXG4gKiAgIC0gc2V0SW5pdGlhbEZvY3VzICAgICAgICAgICAgICAgKGdsb2JhbFRoaXMgZnVuY3Rpb24pXG4gKiAgIC0gdHJhcEZvY3VzICAgICAgICAgICAgICAgICAgICAgKGdsb2JhbFRoaXMgZnVuY3Rpb24pXG4gKiAgIC0gX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgICAgKGdsb2JhbFRoaXMpXG4gKiAgIC0gQ1NTLmVzY2FwZSAgICAgICAgICAgICAgICAgICAgKGJyb3dzZXIgYnVpbHQtaW4pXG4gKi9cblxuaW1wb3J0IHsgc3RhdGVNYW5hZ2VyIH0gZnJvbSAnLi9zdGF0ZS1tYW5hZ2VyLmpzJztcbmltcG9ydCB7IGV5ZVNsYXNoSWNvbiB9IGZyb20gJy4vcmV2aWV3LWljb25zLmpzJztcblxuLy8gTW9kdWxlLWxldmVsIHN0YXRlXG5sZXQgX3Jld3JpdGVTdWdnZXN0aW9uSGlzdG9yeSA9IFtdO1xubGV0IF9sYXN0UmV3cml0ZUxvZ0lkID0gbnVsbDtcbi8vIENhbGxiYWNrcyBmb3IgdGhlIGFjdGl2ZSByZXdyaXRlIG1vZGFsOiB7IGV4cGVyaWVuY2VJbmRleCwgb25BY2NlcHQgfVxubGV0IF9yZXdyaXRlQ2FsbGJhY2tzID0gbnVsbDtcbi8vIFRyYWNrcyBhY2hpZXZlbWVudHMgdGhhdCBhcmUgbmV3bHkgcmVjb21tZW5kZWQgc2luY2UgdGhlIHByZXZpb3VzIHJlbmRlciAoZm9yIFx1RDgzQ1x1REQ5NSBiYWRnZXMpXG5sZXQgX25ld1JlY29tbWVuZGVkQWNocyA9IG5ldyBTZXQoKTtcblxuZnVuY3Rpb24gX25vcm1hbGl6ZUFjaGlldmVtZW50RWRpdEVudHJ5KGVudHJ5KSB7XG4gIGlmIChlbnRyeSAmJiB0eXBlb2YgZW50cnkgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGVudHJ5KSkge1xuICAgIHJldHVybiB7XG4gICAgICB0ZXh0OiBTdHJpbmcoZW50cnkudGV4dCA/PyBlbnRyeS5kZXNjcmlwdGlvbiA/PyBlbnRyeS5jb250ZW50ID8/ICcnKSxcbiAgICAgIGhpZGRlbjogQm9vbGVhbihlbnRyeS5oaWRkZW4pLFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB0ZXh0OiBTdHJpbmcoZW50cnkgPz8gJycpLFxuICAgIGhpZGRlbjogZmFsc2UsXG4gIH07XG59XG5cbmZ1bmN0aW9uIF9ub3JtYWxpemVBY2hpZXZlbWVudEVkaXRMaXN0KGVudHJpZXMpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGVudHJpZXMpKSByZXR1cm4gW107XG4gIHJldHVybiBlbnRyaWVzLm1hcChfbm9ybWFsaXplQWNoaWV2ZW1lbnRFZGl0RW50cnkpO1xufVxuXG5mdW5jdGlvbiBfYWNoaWV2ZW1lbnRFbnRyeVRleHQoZW50cnkpIHtcbiAgcmV0dXJuIF9ub3JtYWxpemVBY2hpZXZlbWVudEVkaXRFbnRyeShlbnRyeSkudGV4dDtcbn1cblxuZnVuY3Rpb24gX2FjaGlldmVtZW50RW50cnlIaWRkZW4oZW50cnkpIHtcbiAgcmV0dXJuIF9ub3JtYWxpemVBY2hpZXZlbWVudEVkaXRFbnRyeShlbnRyeSkuaGlkZGVuO1xufVxuXG53aW5kb3cuYWNoaWV2ZW1lbnREZWNpc2lvbnMgPSB7fTtcbndpbmRvdy5fYWNoaWV2ZW1lbnRzT3JkZXJlZCA9IG51bGw7XG5cbi8vIFNtYWxsIGZldGNoIGhlbHBlciB3aXRoIHRpbWVvdXQgdG8gYXZvaWQgbGVhdmluZyBsb2FkZXJzIHZpc2libGUgb24gaGFuZ2luZyByZXF1ZXN0c1xuYXN5bmMgZnVuY3Rpb24gZmV0Y2hKc29uV2l0aFRpbWVvdXQodXJsLCBvcHRzID0ge30sIHRpbWVvdXQgPSA3MDAwKSB7XG4gIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIGNvbnN0IHNpZ25hbCA9IGNvbnRyb2xsZXIuc2lnbmFsO1xuICBjb25zdCBpZCA9IHNldFRpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydCgpLCB0aW1lb3V0KTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwsIE9iamVjdC5hc3NpZ24oe30sIG9wdHMsIHsgc2lnbmFsIH0pKTtcbiAgICBjbGVhclRpbWVvdXQoaWQpO1xuICAgIHJldHVybiByZXM7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNsZWFyVGltZW91dChpZCk7XG4gICAgdGhyb3cgZXJyO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9hY2hTbmFwc2hvdEtleSgpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzaWQgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpLmdldCgnc2Vzc2lvbicpO1xuICAgIHJldHVybiBzaWQgPyBgYWNoX3NuYXBfJHtzaWR9YCA6IG51bGw7XG4gIH0gY2F0Y2ggKF8pIHsgcmV0dXJuIG51bGw7IH1cbn1cbmZ1bmN0aW9uIF9zYXZlQWNoU25hcHNob3QocmVjb21tZW5kZWRJZHMpIHtcbiAgY29uc3Qga2V5ID0gX2FjaFNuYXBzaG90S2V5KCk7XG4gIGlmICgha2V5KSByZXR1cm47XG4gIHRyeSB7IGxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgSlNPTi5zdHJpbmdpZnkoWy4uLnJlY29tbWVuZGVkSWRzXSkpOyB9IGNhdGNoIChfKSB7fVxufVxuZnVuY3Rpb24gX2dldEFjaFNuYXBzaG90KCkge1xuICBjb25zdCBrZXkgPSBfYWNoU25hcHNob3RLZXkoKTtcbiAgaWYgKCFrZXkpIHJldHVybiBudWxsO1xuICB0cnkge1xuICAgIGNvbnN0IHJhdyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7XG4gICAgcmV0dXJuIHJhdyA/IG5ldyBTZXQoSlNPTi5wYXJzZShyYXcpKSA6IG51bGw7XG4gIH0gY2F0Y2ggKF8pIHsgcmV0dXJuIG51bGw7IH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gYnVpbGRBY2hpZXZlbWVudHNSZXZpZXdUYWJsZSgpIHtcbiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaGlldmVtZW50cy10YWJsZS1jb250YWluZXInKTtcbiAgaWYgKCFjb250YWluZXIpIHJldHVybjtcblxuICBjb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDoxMnB4O3BhZGRpbmc6MjBweDtjb2xvcjojNmI3MjgwO1wiPjxkaXYgY2xhc3M9XCJsb2FkaW5nLXNwaW5uZXJcIiBzdHlsZT1cIndpZHRoOjIwcHg7aGVpZ2h0OjIwcHg7Ym9yZGVyLXdpZHRoOjJweDtmbGV4LXNocmluazowO1wiPjwvZGl2PjxzcGFuPkxvYWRpbmcgYWNoaWV2ZW1lbnRzXHUyMDI2PC9zcGFuPjwvZGl2Pic7XG5cbiAgLy8gUHJlZmVyIHNlc3Npb24tYXdhcmUgc3RhdHVzIGRhdGEgc28gcmV2aWV3LXRpbWUgb3ZlcmxheXMgYXJlIHJlZmxlY3RlZC5cbiAgbGV0IGFsbEFjaGlldmVtZW50cyA9IFtdO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoSnNvbldpdGhUaW1lb3V0KCcvYXBpL3N0YXR1cycsIHt9LCA3MDAwKTtcbiAgICBpZiAoIXJlcy5vaykgdGhyb3cgbmV3IEVycm9yKCdzdGF0dXMgbm90IG9rJyk7XG4gICAgY29uc3Qgc3RhdHVzRGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgYWxsQWNoaWV2ZW1lbnRzID0gc3RhdHVzRGF0YS5hbGxfYWNoaWV2ZW1lbnRzIHx8IFtdO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBTZWNvbmRhcnkgZmFsbGJhY2s6IHJhdyBtYXN0ZXIgZmllbGRzLlxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMyID0gYXdhaXQgZmV0Y2hKc29uV2l0aFRpbWVvdXQoJy9hcGkvbWFzdGVyLWZpZWxkcycsIHt9LCA3MDAwKTtcbiAgICAgIGlmICghcmVzMi5vaykgdGhyb3cgbmV3IEVycm9yKCdtYXN0ZXItZmllbGRzIG5vdCBvaycpO1xuICAgICAgY29uc3QgbWFzdGVyRGF0YSA9IGF3YWl0IHJlczIuanNvbigpO1xuICAgICAgYWxsQWNoaWV2ZW1lbnRzID0gbWFzdGVyRGF0YS5zZWxlY3RlZF9hY2hpZXZlbWVudHMgfHwgW107XG4gICAgfSBjYXRjaCAoZXJyMikge1xuICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICc8cCBzdHlsZT1cImNvbG9yOiNlZjQ0NDQ7cGFkZGluZzoyMHB4O1wiPkZhaWxlZCB0byBsb2FkIGFjaGlldmVtZW50cy48L3A+JztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBpZiAoYWxsQWNoaWV2ZW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnPHAgc3R5bGU9XCJwYWRkaW5nOjIwcHg7Y29sb3I6IzZiNzI4MDtcIj5ObyBrZXkgYWNoaWV2ZW1lbnRzIGZvdW5kIGluIG1hc3RlciBDViBkYXRhLjwvcD4nO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFdyYXAgaW5pdGlhbGlzYXRpb24gKyByZW5kZXIgc28gYW4gdW5leHBlY3RlZCBleGNlcHRpb24gcmVwbGFjZXMgdGhlXG4gIC8vIHNwaW5uZXIgaW5zdGVhZCBvZiBsZWF2aW5nIGl0IGZyb3plbiBpbmRlZmluaXRlbHkuXG4gIHRyeSB7XG4gICAgY29uc3QgZGF0YSA9IHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zIHx8IHt9O1xuICAgIGNvbnN0IHJlY29tbWVuZGVkU2V0ID0gbmV3IFNldChkYXRhLnJlY29tbWVuZGVkX2FjaGlldmVtZW50cyB8fCBbXSk7XG5cbiAgICAvLyBTb3J0OiByZWNvbW1lbmRlZCBmaXJzdCwgdGhlbiBieSBpbXBvcnRhbmNlIGRlc2NlbmRpbmcgKG9ubHkgb24gZmlyc3QgbG9hZClcbiAgICBpZiAoIXdpbmRvdy5fYWNoaWV2ZW1lbnRzT3JkZXJlZCkge1xuICAgICAgYWxsQWNoaWV2ZW1lbnRzID0gWy4uLmFsbEFjaGlldmVtZW50c10uc29ydCgoYSwgYikgPT4ge1xuICAgICAgICBjb25zdCBhUmVjID0gcmVjb21tZW5kZWRTZXQuaGFzKGEuaWQpID8gMSA6IDA7XG4gICAgICAgIGNvbnN0IGJSZWMgPSByZWNvbW1lbmRlZFNldC5oYXMoYi5pZCkgPyAxIDogMDtcbiAgICAgICAgaWYgKGJSZWMgIT09IGFSZWMpIHJldHVybiBiUmVjIC0gYVJlYztcbiAgICAgICAgcmV0dXJuIChiLmltcG9ydGFuY2UgfHwgMCkgLSAoYS5pbXBvcnRhbmNlIHx8IDApO1xuICAgICAgfSk7XG4gICAgICB3aW5kb3cuX2FjaGlldmVtZW50c09yZGVyZWQgPSBhbGxBY2hpZXZlbWVudHM7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGlzZSBkZWNpc2lvbnNcbiAgICB3aW5kb3cuYWNoaWV2ZW1lbnREZWNpc2lvbnMgPSB7fTtcbiAgICB3aW5kb3cuX2FjaGlldmVtZW50c09yZGVyZWQuZm9yRWFjaChhY2ggPT4ge1xuICAgICAgY29uc3QgcmVjID0gZ2V0QWNoaWV2ZW1lbnRSZWNvbW1lbmRhdGlvbihhY2guaWQsIGRhdGEpO1xuICAgICAgbGV0IGRlZmF1bHRBY3Rpb24gPSAnaW5jbHVkZSc7XG4gICAgICBpZiAocmVjID09PSAnRW1waGFzaXplJykgICAgICAgICBkZWZhdWx0QWN0aW9uID0gJ2VtcGhhc2l6ZSc7XG4gICAgICBlbHNlIGlmIChyZWMgPT09ICdJbmNsdWRlJykgICAgICBkZWZhdWx0QWN0aW9uID0gJ2luY2x1ZGUnO1xuICAgICAgZWxzZSBpZiAocmVjID09PSAnRGUtZW1waGFzaXplJykgZGVmYXVsdEFjdGlvbiA9ICdkZS1lbXBoYXNpemUnO1xuICAgICAgZWxzZSBpZiAocmVjID09PSAnT21pdCcpICAgICAgICAgZGVmYXVsdEFjdGlvbiA9ICdleGNsdWRlJztcbiAgICAgIHdpbmRvdy5hY2hpZXZlbWVudERlY2lzaW9uc1thY2guaWRdID0gZGVmYXVsdEFjdGlvbjtcbiAgICB9KTtcbiAgICAvLyBBcHBseSBhbnkgcHJldmlvdXNseSBzYXZlZCB1c2VyIGRlY2lzaW9ucyBvdmVyIHRoZSBMTE0gZGVmYXVsdHNcbiAgICBjb25zdCBzYXZlZEFjaERlY3MgPSB3aW5kb3cuX3NhdmVkRGVjaXNpb25zPy5hY2hpZXZlbWVudF9kZWNpc2lvbnMgfHwge307XG4gICAgaWYgKE9iamVjdC5rZXlzKHNhdmVkQWNoRGVjcykubGVuZ3RoID4gMCkgT2JqZWN0LmFzc2lnbih3aW5kb3cuYWNoaWV2ZW1lbnREZWNpc2lvbnMsIHNhdmVkQWNoRGVjcyk7XG5cbiAgICAvLyBBbHNvIGhhbmRsZSBBSS1zdWdnZXN0ZWQgYWNoaWV2ZW1lbnRzIFx1MjAxNCBhc3NpZ24gc3RhYmxlIElEcyBvbmNlIG9uIGZpcnN0IGxvYWRcbiAgICAvLyBzbyB0aGF0IHJlb3JkZXIgLyBkZWxldGUgb3BlcmF0aW9ucyBuZXZlciBuZWVkIHRvIHJlbWFwIGRlY2lzaW9uIGtleXMuXG4gICAgaWYgKCF3aW5kb3cuX3N1Z2dlc3RlZEFjaHNPcmRlcmVkKSB7XG4gICAgICBsZXQgY291bnRlciA9IDA7XG4gICAgICB3aW5kb3cuX3N1Z2dlc3RlZEFjaHNPcmRlcmVkID0gKGRhdGEuc3VnZ2VzdGVkX2FjaGlldmVtZW50cyB8fCBbXSkubWFwKHMgPT4ge1xuICAgICAgICBjb25zdCBpdGVtID0gT2JqZWN0LmFzc2lnbih7fSwgcyk7XG4gICAgICAgIGl0ZW0uX3N1Z2dJZCA9IGBzdWdnOjoke2NvdW50ZXIrK31gO1xuICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB3aW5kb3cuX3N1Z2dlc3RlZEFjaHNPcmRlcmVkLmZvckVhY2gocyA9PiB7XG4gICAgICBpZiAoIShzLl9zdWdnSWQgaW4gd2luZG93LmFjaGlldmVtZW50RGVjaXNpb25zKSkgd2luZG93LmFjaGlldmVtZW50RGVjaXNpb25zW3MuX3N1Z2dJZF0gPSAnaW5jbHVkZSc7XG4gICAgfSk7XG5cbiAgICBjb25zdCBwcmV2QWNoU25hcCA9IF9nZXRBY2hTbmFwc2hvdCgpO1xuICAgIF9uZXdSZWNvbW1lbmRlZEFjaHMgPSBwcmV2QWNoU25hcFxuICAgICAgPyBuZXcgU2V0KFsuLi5yZWNvbW1lbmRlZFNldF0uZmlsdGVyKGlkID0+ICFwcmV2QWNoU25hcC5oYXMoaWQpKSlcbiAgICAgIDogbmV3IFNldCgpO1xuICAgIF9zYXZlQWNoU25hcHNob3QocmVjb21tZW5kZWRTZXQpO1xuXG4gICAgX3JlbmRlckFjaGlldmVtZW50c1Jldmlld1RhYmxlKGNvbnRhaW5lcik7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlICovXG4gICAgY29uc29sZS5lcnJvcignYnVpbGRBY2hpZXZlbWVudHNSZXZpZXdUYWJsZTogcmVuZGVyIGVycm9yOicsIGVycik7XG4gICAgY29udGFpbmVyLmlubmVySFRNTCA9ICc8cCBzdHlsZT1cImNvbG9yOiNlZjQ0NDQ7cGFkZGluZzoyMHB4O1wiPkVycm9yIHJlbmRlcmluZyBhY2hpZXZlbWVudHMgdGFibGUuIFBsZWFzZSByZWxvYWQgYW5kIHRyeSBhZ2Fpbi48L3A+JztcbiAgfVxufVxuXG5mdW5jdGlvbiBfcmVuZGVyQWNoaWV2ZW1lbnRzUmV2aWV3VGFibGUoY29udGFpbmVyKSB7XG4gIGlmICghY29udGFpbmVyKSBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoaWV2ZW1lbnRzLXRhYmxlLWNvbnRhaW5lcicpO1xuICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuO1xuXG4gIGNvbnN0IGRhdGEgPSB3aW5kb3cucGVuZGluZ1JlY29tbWVuZGF0aW9ucyB8fCB7fTtcbiAgY29uc3Qgb3JkZXJlZEFjaHMgID0gd2luZG93Ll9hY2hpZXZlbWVudHNPcmRlcmVkIHx8IFtdO1xuICBjb25zdCBzdWdnZXN0ZWRBY2hzID0gd2luZG93Ll9zdWdnZXN0ZWRBY2hzT3JkZXJlZCB8fCBbXTtcblxuICAvLyBCdWlsZCBmaWx0ZXIgKyB0YWJsZSBIVE1MXG4gIGxldCBodG1sID0gYFxuICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjEycHg7YWxpZ24taXRlbXM6Y2VudGVyO21hcmdpbi1ib3R0b206MTJweDtcIj5cbiAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiYWNoLXJldmlldy1maWx0ZXJcIlxuICAgICAgICBwbGFjZWhvbGRlcj1cIkZpbHRlciBhY2hpZXZlbWVudHNcdTIwMjZcIlxuICAgICAgICBvbmlucHV0PVwiX2ZpbHRlckFjaGlldmVtZW50c1RhYmxlKHRoaXMudmFsdWUpXCJcbiAgICAgICAgc3R5bGU9XCJmbGV4OjE7cGFkZGluZzo2cHggMTBweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo2cHg7Zm9udC1zaXplOjAuOWVtO1wiPlxuICAgICAgPHNwYW4gaWQ9XCJhY2gtcmV2aWV3LWNvdW50XCIgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2NvbG9yOiM2YjcyODA7d2hpdGUtc3BhY2U6bm93cmFwO1wiPiR7b3JkZXJlZEFjaHMubGVuZ3RoICsgc3VnZ2VzdGVkQWNocy5sZW5ndGh9IGFjaGlldmVtZW50czwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8dGFibGUgaWQ9XCJhY2hpZXZlbWVudHMtcmV2aWV3LXRhYmxlXCIgY2xhc3M9XCJyZXZpZXctdGFibGVcIiBzdHlsZT1cIndpZHRoOjEwMCU7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlO1wiPlxuICAgICAgPHRoZWFkPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRoPkFjaGlldmVtZW50PC90aD5cbiAgICAgICAgICA8dGg+UmVjb21tZW5kYXRpb248L3RoPlxuICAgICAgICAgIDx0aD5Db25maWRlbmNlPC90aD5cbiAgICAgICAgICA8dGg+UmVhc29uaW5nPC90aD5cbiAgICAgICAgICA8dGg+U2VsZWN0aW9uPC90aD5cbiAgICAgICAgPC90cj5cbiAgICAgIDwvdGhlYWQ+XG4gICAgICA8dGJvZHk+XG4gIGA7XG5cbiAgb3JkZXJlZEFjaHMuZm9yRWFjaCgoYWNoLCByb3dJZHgpID0+IHtcbiAgICBjb25zdCBpZCAgICAgICAgICAgICA9IGFjaC5pZCB8fCBhY2gudGl0bGUgfHwgJyc7XG4gICAgY29uc3QgdGl0bGUgICAgICAgICAgPSBhY2gudGl0bGUgfHwgaWQ7XG4gICAgY29uc3QgZGVzYyAgICAgICAgICAgPSBhY2guZGVzY3JpcHRpb24gfHwgJyc7XG4gICAgY29uc3QgcmVjb21tZW5kYXRpb24gPSBnZXRBY2hpZXZlbWVudFJlY29tbWVuZGF0aW9uKGlkLCBkYXRhKTtcbiAgICBjb25zdCBjb25maWRlbmNlICAgICA9IGdldEFjaGlldmVtZW50Q29uZmlkZW5jZShpZCwgZGF0YSwgYWNoLmltcG9ydGFuY2UpO1xuICAgIGNvbnN0IHJlYXNvbmluZyAgICAgID0gZ2V0QWNoaWV2ZW1lbnRSZWFzb25pbmcoaWQsIGRhdGEsIGFjaCk7XG4gICAgY29uc3QgZGVmYXVsdEFjdGlvbiAgPSB3aW5kb3cuYWNoaWV2ZW1lbnREZWNpc2lvbnNbaWRdIHx8ICdpbmNsdWRlJztcbiAgICBjb25zdCBjb25maWRlbmNlQmFkZ2UgPSBgPHNwYW4gY2xhc3M9XCJjb25maWRlbmNlLWJhZGdlIGNvbmZpZGVuY2UtJHtjb25maWRlbmNlLmxldmVsfVwiPiR7Y29uZmlkZW5jZS50ZXh0fTwvc3Bhbj5gO1xuICAgIGNvbnN0IHJlcnVuTmV3QmFkZ2UgPSBfbmV3UmVjb21tZW5kZWRBY2hzLmhhcyhpZClcbiAgICAgID8gJzxzcGFuIGNsYXNzPVwicnctY2hhbmdlLWJhZGdlIHJ3LWNoYW5nZS1uZXdcIiBhcmlhLWxhYmVsPVwiTmV3IHJlY29tbWVuZGF0aW9uIHNpbmNlIHByZXZpb3VzIHJ1blwiPlx1RDgzQ1x1REQ5NSBOZXc8L3NwYW4+J1xuICAgICAgOiAnJztcbiAgICBjb25zdCBpc0ZpcnN0ID0gcm93SWR4ID09PSAwO1xuICAgIGNvbnN0IGlzTGFzdCAgPSByb3dJZHggPT09IG9yZGVyZWRBY2hzLmxlbmd0aCAtIDE7XG5cbiAgICBodG1sICs9IGBcbiAgICAgIDx0ciBkYXRhLWFjaC1pZD1cIiR7ZXNjYXBlSHRtbChpZCl9XCI+XG4gICAgICAgIDx0ZCBzdHlsZT1cIm1pbi13aWR0aDoyMjBweDtcIj5cbiAgICAgICAgICA8aW5wdXQgaWQ9XCJhY2gtdGl0bGUtJHtlc2NhcGVIdG1sKGlkKX1cIlxuICAgICAgICAgICAgdHlwZT1cInRleHRcIiB2YWx1ZT1cIiR7ZXNjYXBlSHRtbCh0aXRsZSl9XCJcbiAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTtmb250LXdlaWdodDo2MDA7cGFkZGluZzozcHggNnB4O2JvcmRlcjoxcHggc29saWQgI2QxZDVkYjtib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6MC45ZW07Ym94LXNpemluZzpib3JkZXItYm94O1wiXG4gICAgICAgICAgICBvbmJsdXI9XCJzYXZlVG9wTGV2ZWxBY2hpZXZlbWVudEZpZWxkKCcke2VzY2FwZUh0bWwoaWQpfScsICd0aXRsZScsIHRoaXMudmFsdWUpXCJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJBY2hpZXZlbWVudCB0aXRsZVwiPiR7cmVydW5OZXdCYWRnZX1cbiAgICAgICAgICA8dGV4dGFyZWEgaWQ9XCJhY2gtZGVzYy0ke2VzY2FwZUh0bWwoaWQpfVwiXG4gICAgICAgICAgICByb3dzPVwiMlwiXG4gICAgICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7bWFyZ2luLXRvcDo0cHg7cGFkZGluZzozcHggNnB4O2JvcmRlcjoxcHggc29saWQgI2QxZDVkYjtib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6MC44NWVtO3Jlc2l6ZTp2ZXJ0aWNhbDtib3gtc2l6aW5nOmJvcmRlci1ib3g7XCJcbiAgICAgICAgICAgIG9uYmx1cj1cInNhdmVUb3BMZXZlbEFjaGlldmVtZW50RmllbGQoJyR7ZXNjYXBlSHRtbChpZCl9JywgJ2Rlc2NyaXB0aW9uJywgdGhpcy52YWx1ZSlcIlxuICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkFjaGlldmVtZW50IGRlc2NyaXB0aW9uXCJcbiAgICAgICAgICA+JHtlc2NhcGVIdG1sKGRlc2MpfTwvdGV4dGFyZWE+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZD48c3Ryb25nPiR7ZXNjYXBlSHRtbChyZWNvbW1lbmRhdGlvbil9PC9zdHJvbmc+PC90ZD5cbiAgICAgICAgPHRkPiR7Y29uZmlkZW5jZUJhZGdlfTwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cIm1heC13aWR0aDoyMDBweDtcIj48c21hbGw+JHtlc2NhcGVIdG1sKHJlYXNvbmluZyl9PC9zbWFsbD48L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJhY3Rpb24tYnRuc1wiIHN0eWxlPVwid2hpdGUtc3BhY2U6bm93cmFwO1wiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0biAke2RlZmF1bHRBY3Rpb24gPT09ICdlbXBoYXNpemUnICAgID8gJ2FjdGl2ZScgOiAnJ31cIiBkYXRhLWFjdGlvbj1cImVtcGhhc2l6ZVwiICAgIGFyaWEtbGFiZWw9XCJFbXBoYXNpemUgJHtlc2NhcGVIdG1sKHRpdGxlKX1cIiAgICB0aXRsZT1cIkVtcGhhc2l6ZSBcdTIwMTQgZmVhdHVyZSBwcm9taW5lbnRseVwiICBzdHlsZT1cImNvbG9yOiMxMGI5ODE7XCI+XHUyNzk1PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuICR7ZGVmYXVsdEFjdGlvbiA9PT0gJ2luY2x1ZGUnICAgICAgPyAnYWN0aXZlJyA6ICcnfVwiIGRhdGEtYWN0aW9uPVwiaW5jbHVkZVwiICAgICAgYXJpYS1sYWJlbD1cIkluY2x1ZGUgJHtlc2NhcGVIdG1sKHRpdGxlKX1cIiAgICAgIHRpdGxlPVwiSW5jbHVkZSBcdTIwMTQgc3RhbmRhcmQgdHJlYXRtZW50XCI+XHUyNzEzPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuICR7ZGVmYXVsdEFjdGlvbiA9PT0gJ2RlLWVtcGhhc2l6ZScgPyAnYWN0aXZlJyA6ICcnfVwiIGRhdGEtYWN0aW9uPVwiZGUtZW1waGFzaXplXCIgYXJpYS1sYWJlbD1cIkRlLWVtcGhhc2l6ZSAke2VzY2FwZUh0bWwodGl0bGUpfVwiIHRpdGxlPVwiRGUtZW1waGFzaXplIFx1MjAxNCBicmllZiBtZW50aW9uIG9ubHlcIiAgc3R5bGU9XCJjb2xvcjojZjU5ZTBiO1wiPlx1Mjc5NjwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0biAke2RlZmF1bHRBY3Rpb24gPT09ICdleGNsdWRlJyAgICAgID8gJ2FjdGl2ZScgOiAnJ31cIiBkYXRhLWFjdGlvbj1cImV4Y2x1ZGVcIiAgICAgIGFyaWEtbGFiZWw9XCJFeGNsdWRlICR7ZXNjYXBlSHRtbCh0aXRsZSl9XCIgICAgICB0aXRsZT1cIkV4Y2x1ZGUgXHUyMDE0IG9taXQgZnJvbSBDVlwiICAgICAgICAgICAgc3R5bGU9XCJjb2xvcjojZWY0NDQ0O1wiPiR7ZXllU2xhc2hJY29uKCl9PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgYXJpYS1sYWJlbD1cIkFJIHJld3JpdGUgJHtlc2NhcGVIdG1sKHRpdGxlKX1cIiB0aXRsZT1cIkFJIHJld3JpdGUgZGVzY3JpcHRpb25cIiBvbmNsaWNrPVwiYWlSZXdyaXRlVG9wTGV2ZWxBY2hpZXZlbWVudCgnJHtlc2NhcGVIdG1sKGlkKX0nKVwiPlx1MjcyODwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIGFyaWEtbGFiZWw9XCJNb3ZlICR7ZXNjYXBlSHRtbCh0aXRsZSl9IGVhcmxpZXJcIiB0aXRsZT1cIk1vdmUgdXBcIiAgICR7aXNGaXJzdCA/ICdkaXNhYmxlZCcgOiAnJ30gb25jbGljaz1cIm1vdmVBY2hpZXZlbWVudFJvdygnJHtlc2NhcGVIdG1sKGlkKX0nLC0xKVwiPlx1MjE5MTwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIGFyaWEtbGFiZWw9XCJNb3ZlICR7ZXNjYXBlSHRtbCh0aXRsZSl9IGxhdGVyXCIgICB0aXRsZT1cIk1vdmUgZG93blwiICR7aXNMYXN0ICA/ICdkaXNhYmxlZCcgOiAnJ30gb25jbGljaz1cIm1vdmVBY2hpZXZlbWVudFJvdygnJHtlc2NhcGVIdG1sKGlkKX0nLCsxKVwiPlx1MjE5MzwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIGFyaWEtbGFiZWw9XCJEZWxldGUgJHtlc2NhcGVIdG1sKHRpdGxlKX1cIiB0aXRsZT1cIkRlbGV0ZSBhY2hpZXZlbWVudFwiIG9uY2xpY2s9XCJkZWxldGVUb3BMZXZlbEFjaGlldmVtZW50KCcke2VzY2FwZUh0bWwoaWQpfScpXCIgc3R5bGU9XCJjb2xvcjojZWY0NDQ0O1wiPlx1RDgzRFx1REREMTwvYnV0dG9uPlxuICAgICAgICA8L3RkPlxuICAgICAgPC90cj5cbiAgICBgO1xuICB9KTtcblxuICAvLyBBSS1zdWdnZXN0ZWQgYWNoaWV2ZW1lbnRzIFx1MjAxNCBmdWxsIGVkaXRpbmcvY29udHJvbCBwYXJpdHkgd2l0aCB1c2VyIGFjaGlldmVtZW50c1xuICBzdWdnZXN0ZWRBY2hzLmZvckVhY2goKHN1Z2csIHJvd0lkeCkgPT4ge1xuICAgIGNvbnN0IHN1Z2dJZCAgICAgID0gc3VnZy5fc3VnZ0lkO1xuICAgIGNvbnN0IGNvbmZSYXcgICAgID0gKHN1Z2cuY29uZmlkZW5jZSB8fCAnTWVkaXVtJykudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBjb25mTGV2ZWwgICA9IGNvbmZSYXcuaW5jbHVkZXMoJ2hpZ2gnKSA/ICdoaWdoJyA6IGNvbmZSYXcuaW5jbHVkZXMoJ2xvdycpID8gJ2xvdycgOiAnbWVkaXVtJztcbiAgICBjb25zdCBjb25mVGV4dCAgICA9IHN1Z2cuY29uZmlkZW5jZSB8fCAnTWVkaXVtJztcbiAgICBjb25zdCBkZWZhdWx0QWN0aW9uID0gd2luZG93LmFjaGlldmVtZW50RGVjaXNpb25zW3N1Z2dJZF0gfHwgJ2luY2x1ZGUnO1xuICAgIGNvbnN0IGlzRmlyc3QgICAgID0gcm93SWR4ID09PSAwO1xuICAgIGNvbnN0IGlzTGFzdCAgICAgID0gcm93SWR4ID09PSBzdWdnZXN0ZWRBY2hzLmxlbmd0aCAtIDE7XG5cbiAgICBodG1sICs9IGBcbiAgICAgIDx0ciBkYXRhLWFjaC1pZD1cIiR7ZXNjYXBlSHRtbChzdWdnSWQpfVwiIHN0eWxlPVwiYmFja2dyb3VuZDojZmVmY2U4O1wiPlxuICAgICAgICA8dGQgc3R5bGU9XCJtaW4td2lkdGg6MjIwcHg7XCI+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJkaXNwbGF5OmlubGluZS1ibG9jaztiYWNrZ3JvdW5kOiNmNTllMGI7Y29sb3I6I2ZmZjtmb250LXNpemU6MC43ZW07Zm9udC13ZWlnaHQ6NzAwO3BhZGRpbmc6MXB4IDZweDtib3JkZXItcmFkaXVzOjEwcHg7bWFyZ2luLWJvdHRvbTo0cHg7dmVydGljYWwtYWxpZ246bWlkZGxlO1wiPlx1MkI1MCBBSSBTdWdnZXN0ZWQ8L3NwYW4+XG4gICAgICAgICAgPGlucHV0IGlkPVwiYWNoLXRpdGxlLSR7ZXNjYXBlSHRtbChzdWdnSWQpfVwiXG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiIHZhbHVlPVwiJHtlc2NhcGVIdG1sKHN1Z2cudGl0bGUgfHwgJycpfVwiXG4gICAgICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Zm9udC13ZWlnaHQ6NjAwO3BhZGRpbmc6M3B4IDZweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo0cHg7Zm9udC1zaXplOjAuOWVtO2JveC1zaXppbmc6Ym9yZGVyLWJveDtcIlxuICAgICAgICAgICAgb25ibHVyPVwic2F2ZVN1Z2dlc3RlZEFjaGlldmVtZW50RmllbGQoJyR7ZXNjYXBlSHRtbChzdWdnSWQpfScsICd0aXRsZScsIHRoaXMudmFsdWUpXCJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJBY2hpZXZlbWVudCB0aXRsZVwiPlxuICAgICAgICAgIDx0ZXh0YXJlYSBpZD1cImFjaC1kZXNjLSR7ZXNjYXBlSHRtbChzdWdnSWQpfVwiXG4gICAgICAgICAgICByb3dzPVwiMlwiXG4gICAgICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7bWFyZ2luLXRvcDo0cHg7cGFkZGluZzozcHggNnB4O2JvcmRlcjoxcHggc29saWQgI2QxZDVkYjtib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6MC44NWVtO3Jlc2l6ZTp2ZXJ0aWNhbDtib3gtc2l6aW5nOmJvcmRlci1ib3g7XCJcbiAgICAgICAgICAgIG9uYmx1cj1cInNhdmVTdWdnZXN0ZWRBY2hpZXZlbWVudEZpZWxkKCcke2VzY2FwZUh0bWwoc3VnZ0lkKX0nLCAnZGVzY3JpcHRpb24nLCB0aGlzLnZhbHVlKVwiXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiQWNoaWV2ZW1lbnQgZGVzY3JpcHRpb25cIlxuICAgICAgICAgID4ke2VzY2FwZUh0bWwoc3VnZy5kZXNjcmlwdGlvbiB8fCAnJyl9PC90ZXh0YXJlYT5cbiAgICAgICAgICAke3N1Z2cuZXhwZXJpZW5jZV9pZCA/IGA8c21hbGwgc3R5bGU9XCJjb2xvcjojOWNhM2FmO1wiPkV4cGVyaWVuY2U6ICR7ZXNjYXBlSHRtbChzdWdnLmV4cGVyaWVuY2VfaWQpfTwvc21hbGw+YCA6ICcnfVxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQ+PHN0cm9uZz5BZGQgTmV3PC9zdHJvbmc+PC90ZD5cbiAgICAgICAgPHRkPjxzcGFuIGNsYXNzPVwiY29uZmlkZW5jZS1iYWRnZSBjb25maWRlbmNlLSR7Y29uZkxldmVsfVwiPiR7ZXNjYXBlSHRtbChjb25mVGV4dCl9PC9zcGFuPjwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cIm1heC13aWR0aDoyMDBweDtcIj48c21hbGw+JHtlc2NhcGVIdG1sKHN1Z2cucmF0aW9uYWxlIHx8ICcnKX08L3NtYWxsPjwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cImFjdGlvbi1idG5zXCIgc3R5bGU9XCJ3aGl0ZS1zcGFjZTpub3dyYXA7XCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuICR7ZGVmYXVsdEFjdGlvbiA9PT0gJ2VtcGhhc2l6ZScgICAgPyAnYWN0aXZlJyA6ICcnfVwiIGRhdGEtYWN0aW9uPVwiZW1waGFzaXplXCIgICAgYXJpYS1sYWJlbD1cIkVtcGhhc2l6ZVwiICAgIHRpdGxlPVwiRW1waGFzaXplIFx1MjAxNCBmZWF0dXJlIHByb21pbmVudGx5XCIgIHN0eWxlPVwiY29sb3I6IzEwYjk4MTtcIj5cdTI3OTU8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG4gJHtkZWZhdWx0QWN0aW9uID09PSAnaW5jbHVkZScgICAgICA/ICdhY3RpdmUnIDogJyd9XCIgZGF0YS1hY3Rpb249XCJpbmNsdWRlXCIgICAgICBhcmlhLWxhYmVsPVwiSW5jbHVkZVwiICAgICAgdGl0bGU9XCJJbmNsdWRlIFx1MjAxNCBhZGQgdG8gQ1ZcIj5cdTI3MTM8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG4gJHtkZWZhdWx0QWN0aW9uID09PSAnZGUtZW1waGFzaXplJyA/ICdhY3RpdmUnIDogJyd9XCIgZGF0YS1hY3Rpb249XCJkZS1lbXBoYXNpemVcIiBhcmlhLWxhYmVsPVwiRGUtZW1waGFzaXplXCIgdGl0bGU9XCJEZS1lbXBoYXNpemUgXHUyMDE0IGJyaWVmIG1lbnRpb24gb25seVwiICBzdHlsZT1cImNvbG9yOiNmNTllMGI7XCI+XHUyNzk2PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuICR7ZGVmYXVsdEFjdGlvbiA9PT0gJ2V4Y2x1ZGUnICAgICAgPyAnYWN0aXZlJyA6ICcnfVwiIGRhdGEtYWN0aW9uPVwiZXhjbHVkZVwiICAgICAgYXJpYS1sYWJlbD1cIkV4Y2x1ZGVcIiAgICAgIHRpdGxlPVwiU2tpcCBcdTIwMTQgZG8gbm90IGFkZFwiICAgICAgICAgICAgICAgICBzdHlsZT1cImNvbG9yOiNlZjQ0NDQ7XCI+JHtleWVTbGFzaEljb24oKX08L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBhcmlhLWxhYmVsPVwiQUkgcmV3cml0ZVwiIHRpdGxlPVwiQUkgcmV3cml0ZSBkZXNjcmlwdGlvblwiIG9uY2xpY2s9XCJhaVJld3JpdGVTdWdnZXN0ZWRBY2hpZXZlbWVudCgnJHtlc2NhcGVIdG1sKHN1Z2dJZCl9JylcIj5cdTI3Mjg8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBhcmlhLWxhYmVsPVwiTW92ZSBlYXJsaWVyXCIgdGl0bGU9XCJNb3ZlIHVwXCIgICAke2lzRmlyc3QgPyAnZGlzYWJsZWQnIDogJyd9IG9uY2xpY2s9XCJtb3ZlU3VnZ2VzdGVkQWNoaWV2ZW1lbnRSb3coJyR7ZXNjYXBlSHRtbChzdWdnSWQpfScsLTEpXCI+XHUyMTkxPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgYXJpYS1sYWJlbD1cIk1vdmUgbGF0ZXJcIiAgIHRpdGxlPVwiTW92ZSBkb3duXCIgJHtpc0xhc3QgID8gJ2Rpc2FibGVkJyA6ICcnfSBvbmNsaWNrPVwibW92ZVN1Z2dlc3RlZEFjaGlldmVtZW50Um93KCcke2VzY2FwZUh0bWwoc3VnZ0lkKX0nLCsxKVwiPlx1MjE5MzwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIGFyaWEtbGFiZWw9XCJSZW1vdmUgc3VnZ2VzdGlvblwiIHRpdGxlPVwiUmVtb3ZlIHN1Z2dlc3Rpb25cIiBvbmNsaWNrPVwiZGVsZXRlU3VnZ2VzdGVkQWNoaWV2ZW1lbnQoJyR7ZXNjYXBlSHRtbChzdWdnSWQpfScpXCIgc3R5bGU9XCJjb2xvcjojZWY0NDQ0O1wiPlx1RDgzRFx1REREMTwvYnV0dG9uPlxuICAgICAgICA8L3RkPlxuICAgICAgPC90cj5cbiAgICBgO1xuICB9KTtcblxuICBodG1sICs9ICc8L3Rib2R5PjwvdGFibGU+JztcbiAgY29udGFpbmVyLmlubmVySFRNTCA9IGh0bWw7XG5cbiAgLy8gQnVsayB0b29sYmFyIGFib3ZlIHRoZSBmaWx0ZXIgcm93XG4gIGNvbnN0IGFjaFRvb2xiYXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgYWNoVG9vbGJhci5jbGFzc05hbWUgPSAnYnVsay10b29sYmFyJztcbiAgYWNoVG9vbGJhci5pbm5lckhUTUwgPSBgXG4gICAgPHNwYW4+QnVsazo8L3NwYW4+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImJ1bGstYnRuIGJ1bGstcmVjb21tZW5kZWRcIiBvbmNsaWNrPVwiYnVsa0FjaGlldmVtZW50QWN0aW9uKCdyZWNvbW1lbmRlZCcpXCIgdGl0bGU9XCJTZXQgYWxsIHRvIHRoZSBMTE0gcmVjb21tZW5kYXRpb25cIj5cdTI3MjggQWNjZXB0IEFsbCBSZWNvbW1lbmRlZDwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJidWxrLWJ0biBidWxrLWVtcGhhc2l6ZVwiICAgb25jbGljaz1cImJ1bGtBY2hpZXZlbWVudEFjdGlvbignZW1waGFzaXplJylcIj5cdTI3OTUgRW1waGFzaXplIEFsbDwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJidWxrLWJ0biBidWxrLWluY2x1ZGVcIiAgICAgb25jbGljaz1cImJ1bGtBY2hpZXZlbWVudEFjdGlvbignaW5jbHVkZScpXCI+XHUyNzEzIEluY2x1ZGUgQWxsPC9idXR0b24+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImJ1bGstYnRuIGJ1bGstZXhjbHVkZVwiICAgICBvbmNsaWNrPVwiYnVsa0FjaGlldmVtZW50QWN0aW9uKCdleGNsdWRlJylcIj4ke2V5ZVNsYXNoSWNvbigpfSBFeGNsdWRlIEFsbDwvYnV0dG9uPlxuICBgO1xuICBjb250YWluZXIuaW5zZXJ0QmVmb3JlKGFjaFRvb2xiYXIsIGNvbnRhaW5lci5maXJzdENoaWxkKTtcblxuICAvLyBEZWxlZ2F0ZWQgY2xpY2sgaGFuZGxlciBmb3IgZGVjaXNpb24gYnV0dG9uc1xuICBjb250YWluZXIucXVlcnlTZWxlY3RvcigndGJvZHknKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBlID0+IHtcbiAgICBjb25zdCBidG4gPSBlLnRhcmdldC5jbG9zZXN0KCcuaWNvbi1idG5bZGF0YS1hY3Rpb25dJyk7XG4gICAgaWYgKCFidG4pIHJldHVybjtcbiAgICBjb25zdCB0ciA9IGJ0bi5jbG9zZXN0KCd0cltkYXRhLWFjaC1pZF0nKTtcbiAgICBpZiAoIXRyKSByZXR1cm47XG4gICAgY29uc3QgYWN0aW9uID0gYnRuLmRhdGFzZXQuYWN0aW9uO1xuICAgIGlmIChhY3Rpb24pIGhhbmRsZUFjaGlldmVtZW50QWN0aW9uKHRyLmRhdGFzZXQuYWNoSWQsIGFjdGlvbik7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBidWxrQWNoaWV2ZW1lbnRBY3Rpb24oYWN0aW9uKSB7XG4gIGNvbnN0IGRhdGEgPSB3aW5kb3cucGVuZGluZ1JlY29tbWVuZGF0aW9ucyB8fCB7fTtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2FjaGlldmVtZW50cy1yZXZpZXctdGFibGUgdGJvZHkgdHJbZGF0YS1hY2gtaWRdJykuZm9yRWFjaChyb3cgPT4ge1xuICAgIGlmIChyb3cuc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnKSByZXR1cm47ICAgLy8gcmVzcGVjdCBmaWx0ZXJcbiAgICBjb25zdCBhY2hJZCA9IHJvdy5kYXRhc2V0LmFjaElkO1xuICAgIGlmICghYWNoSWQpIHJldHVybjtcbiAgICBsZXQgcmVzb2x2ZWRBY3Rpb24gPSBhY3Rpb247XG4gICAgaWYgKGFjdGlvbiA9PT0gJ3JlY29tbWVuZGVkJykge1xuICAgICAgaWYgKGFjaElkLnN0YXJ0c1dpdGgoJ3N1Z2c6OicpKSB7XG4gICAgICAgIHJlc29sdmVkQWN0aW9uID0gJ2luY2x1ZGUnOyAvLyBBSS1zdWdnZXN0ZWQgaXRlbXMgZGVmYXVsdCB0byBpbmNsdWRlIHdoZW4gYWNjZXB0aW5nIGFsbFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVjID0gZ2V0QWNoaWV2ZW1lbnRSZWNvbW1lbmRhdGlvbihhY2hJZCwgZGF0YSk7XG4gICAgICAgIGlmIChyZWMgPT09ICdFbXBoYXNpemUnKSAgICAgICAgIHJlc29sdmVkQWN0aW9uID0gJ2VtcGhhc2l6ZSc7XG4gICAgICAgIGVsc2UgaWYgKHJlYyA9PT0gJ0luY2x1ZGUnKSAgICAgIHJlc29sdmVkQWN0aW9uID0gJ2luY2x1ZGUnO1xuICAgICAgICBlbHNlIGlmIChyZWMgPT09ICdEZS1lbXBoYXNpemUnKSByZXNvbHZlZEFjdGlvbiA9ICdkZS1lbXBoYXNpemUnO1xuICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlZEFjdGlvbiA9ICdleGNsdWRlJztcbiAgICAgIH1cbiAgICB9XG4gICAgaGFuZGxlQWNoaWV2ZW1lbnRBY3Rpb24oYWNoSWQsIHJlc29sdmVkQWN0aW9uKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZUFjaGlldmVtZW50QWN0aW9uKGFjaElkLCBhY3Rpb24pIHtcbiAgd2luZG93LmFjaGlldmVtZW50RGVjaXNpb25zW2FjaElkXSA9IGFjdGlvbjtcbiAgY29uc3Qgcm93ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgdHJbZGF0YS1hY2gtaWQ9XCIke0NTUy5lc2NhcGUoYWNoSWQpfVwiXWApO1xuICBpZiAoIXJvdykgcmV0dXJuO1xuICByb3cucXVlcnlTZWxlY3RvckFsbCgnLmljb24tYnRuJykuZm9yRWFjaChidG4gPT4gYnRuLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpKTtcbiAgY29uc3QgYWN0aXZlQnRuID0gcm93LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWFjdGlvbj1cIiR7YWN0aW9ufVwiXWApO1xuICBpZiAoYWN0aXZlQnRuKSBhY3RpdmVCdG4uY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN1Ym1pdEFjaGlldmVtZW50RGVjaXNpb25zKCkge1xuICAvKiBkdWNrZmxvdzpcbiAgICogICBpZDogYWNoaWV2ZW1lbnRzX3VpX3N1Ym1pdF9saXZlXG4gICAqICAga2luZDogdWlcbiAgICogICB0aW1lc3RhbXA6ICcyMDI2LTAzLTI1VDIxOjM5OjQ4WidcbiAgICogICBzdGF0dXM6IGxpdmVcbiAgICogICBoYW5kbGVzOlxuICAgKiAgIC0gdWk6YWNoaWV2ZW1lbnRzLXJldmlldy5zdWJtaXRcbiAgICogICBjYWxsczpcbiAgICogICAtIFBPU1QgL2FwaS9yZXZpZXctZGVjaXNpb25zXG4gICAqICAgLSBQT1NUIC9hcGkvY3YvbGF5b3V0LWVzdGltYXRlXG4gICAqICAgcmVhZHM6XG4gICAqICAgLSB3aW5kb3c6YWNoaWV2ZW1lbnREZWNpc2lvbnNcbiAgICogICAtIHdpbmRvdzpfc3VnZ2VzdGVkQWNoc09yZGVyZWRcbiAgICogICB3cml0ZXM6XG4gICAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9yZXZpZXctZGVjaXNpb25zLmRlY2lzaW9uc1xuICAgKiAgIC0gcmVxdWVzdDpQT1NUIC9hcGkvcmV2aWV3LWRlY2lzaW9ucy5hY2NlcHRlZF9zdWdnZXN0aW9uc1xuICAgKiAgIC0gd2luZG93Ol9zYXZlZERlY2lzaW9ucy5hY2hpZXZlbWVudF9kZWNpc2lvbnNcbiAgICogICAtIHdpbmRvdzpfc2F2ZWREZWNpc2lvbnMuYWNjZXB0ZWRfc3VnZ2VzdGVkX2FjaGlldmVtZW50c1xuICAgKiAgIG5vdGVzOiBQZXJzaXN0cyBhY2hpZXZlbWVudCBpbmNsdXNpb24gZGVjaXNpb25zIGFuZCB0aGUgYWNjZXB0ZWQgQUktc3VnZ2VzdGVkIGFjaGlldmVtZW50cyB0aGF0IHNob3VsZCByZW1haW4gc2Vzc2lvbi1vbmx5IHVudGlsIGFuIGV4cGxpY2l0IGhhcnZlc3Qgc3RlcC5cbiAgICovXG4gIGNvbnN0IGFsbERlY2lzaW9ucyA9IHdpbmRvdy5hY2hpZXZlbWVudERlY2lzaW9ucyB8fCB7fTtcbiAgLy8gU2VwYXJhdGUgZXhpc3RpbmcgYWNoaWV2ZW1lbnRzIGZyb20gQUktc3VnZ2VzdGVkIG9uZXNcbiAgY29uc3QgZGVjaXNpb25zID0ge307XG4gIGNvbnN0IHN1Z2dlc3RlZERlY2lzaW9ucyA9IHt9O1xuICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhhbGxEZWNpc2lvbnMpKSB7XG4gICAgaWYgKGsuc3RhcnRzV2l0aCgnc3VnZzo6JykpIHN1Z2dlc3RlZERlY2lzaW9uc1trXSA9IHY7XG4gICAgZWxzZSBkZWNpc2lvbnNba10gPSB2O1xuICB9XG4gIGNvbnN0IGNvdW50ID0gT2JqZWN0LmtleXMoYWxsRGVjaXNpb25zKS5sZW5ndGg7XG4gIGlmIChjb3VudCA9PT0gMCkgcmV0dXJuO1xuICAvLyBSZXNvbHZlIHN1Z2dlc3RlZCBhY2hpZXZlbWVudCBvYmplY3RzIHRoYXQgd2VyZSBhY2NlcHRlZFxuICBjb25zdCBzdWdnZXN0ZWRBY2hzID0gd2luZG93Ll9zdWdnZXN0ZWRBY2hzT3JkZXJlZCB8fCBbXTtcbiAgY29uc3QgYWNjZXB0ZWRTdWdnZXN0aW9ucyA9IHN1Z2dlc3RlZEFjaHNcbiAgICAuZmlsdGVyKHMgPT4ge1xuICAgICAgY29uc3QgYWN0aW9uID0gc3VnZ2VzdGVkRGVjaXNpb25zW3MuX3N1Z2dJZF07XG4gICAgICByZXR1cm4gYWN0aW9uID09PSAnaW5jbHVkZScgfHwgYWN0aW9uID09PSAnZW1waGFzaXplJztcbiAgICB9KVxuICAgIC5tYXAocyA9PiAoeyB0aXRsZTogcy50aXRsZSwgZGVzY3JpcHRpb246IHMuZGVzY3JpcHRpb24sIGV4cGVyaWVuY2VfaWQ6IHMuZXhwZXJpZW5jZV9pZCwgcmF0aW9uYWxlOiBzLnJhdGlvbmFsZSB9KSk7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9yZXZpZXctZGVjaXNpb25zJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgdHlwZTogJ2FjaGlldmVtZW50cycsIGRlY2lzaW9ucywgYWNjZXB0ZWRfc3VnZ2VzdGlvbnM6IGFjY2VwdGVkU3VnZ2VzdGlvbnMgfSlcbiAgICB9KTtcbiAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgIHN0YXRlTWFuYWdlci5tYXJrQ29udGVudENoYW5nZWQoKTtcbiAgICAgIHNob3dUb2FzdChgQWNoaWV2ZW1lbnQgc2VsZWN0aW9ucyBzYXZlZCAoJHtjb3VudH0gaXRlbXMpYCk7XG4gICAgICBzY2hlZHVsZUF0c1JlZnJlc2goKTtcbiAgICAgIC8vIFBlcnNpc3QgbG9jYWxseSBzbyB0aGUgcmV2aWV3IFVJIGltbWVkaWF0ZWx5IHJlZmxlY3RzIHNhdmVkIGNob2ljZXNcbiAgICAgIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMgPSB3aW5kb3cuX3NhdmVkRGVjaXNpb25zIHx8IHt9O1xuICAgICAgd2luZG93Ll9zYXZlZERlY2lzaW9ucy5hY2hpZXZlbWVudF9kZWNpc2lvbnMgPSBkZWNpc2lvbnM7XG4gICAgICBpZiAoYWNjZXB0ZWRTdWdnZXN0aW9ucyAmJiBhY2NlcHRlZFN1Z2dlc3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgd2luZG93Ll9zYXZlZERlY2lzaW9ucy5hY2NlcHRlZF9zdWdnZXN0ZWRfYWNoaWV2ZW1lbnRzID0gYWNjZXB0ZWRTdWdnZXN0aW9ucztcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgdXBkYXRlSW5jbHVzaW9uQ291bnRzID09PSAnZnVuY3Rpb24nKSB1cGRhdGVJbmNsdXNpb25Db3VudHMoKTtcbiAgICAgIHN3aXRjaFRhYigndGFnbGluZS1yZXZpZXcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZXJyID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgc2hvd1RvYXN0KGBFcnJvcjogJHtlcnIuZXJyb3IgfHwgJ0ZhaWxlZCB0byBzYXZlIHNlbGVjdGlvbnMnfWAsICdlcnJvcicpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dUb2FzdCgnRmFpbGVkIHRvIHNhdmUgYWNoaWV2ZW1lbnQgc2VsZWN0aW9ucy4gUGxlYXNlIHRyeSBhZ2Fpbi4nLCAnZXJyb3InKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3ZlQWNoaWV2ZW1lbnRSb3coYWNoSWQsIGRpcmVjdGlvbikge1xuICBjb25zdCBhcnIgPSB3aW5kb3cuX2FjaGlldmVtZW50c09yZGVyZWQ7XG4gIGlmICghYXJyKSByZXR1cm47XG4gIGNvbnN0IGlkeCA9IGFyci5maW5kSW5kZXgoYSA9PiBhLmlkID09PSBhY2hJZCk7XG4gIGlmIChpZHggPCAwKSByZXR1cm47XG4gIGNvbnN0IG5ld0lkeCA9IGlkeCArIGRpcmVjdGlvbjtcbiAgaWYgKG5ld0lkeCA8IDAgfHwgbmV3SWR4ID49IGFyci5sZW5ndGgpIHJldHVybjtcbiAgW2FycltpZHhdLCBhcnJbbmV3SWR4XV0gPSBbYXJyW25ld0lkeF0sIGFycltpZHhdXTtcbiAgd2luZG93Ll9hY2hpZXZlbWVudHNPcmRlcmVkID0gYXJyO1xuICBfcmVuZGVyQWNoaWV2ZW1lbnRzUmV2aWV3VGFibGUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaGlldmVtZW50cy10YWJsZS1jb250YWluZXInKSk7XG59XG5cbi8vID09PT0gQWNoaWV2ZW1lbnRzIEVkaXRvciBUYWIgPT09PVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBwZXItZXhwZXJpZW5jZSBhY2hpZXZlbWVudHMgZWRpdG9yIHRhYi5cbiAqIEVhY2ggZXhwZXJpZW5jZSBnZXRzIGEgY29sbGFwc2libGUgY2FyZCB3aXRoIGl0cyBhY2hpZXZlbWVudHMgbGlzdGVkLlxuICogRWFjaCBhY2hpZXZlbWVudCBzdXBwb3J0czogaW5saW5lIGVkaXQsIHJlb3JkZXIgKFx1MjE5MVx1MjE5MyksIGRlbGV0ZSwgYW5kIExMTSByZXdyaXRlLlxuICovXG5hc3luYyBmdW5jdGlvbiBidWlsZEFjaGlldmVtZW50c0VkaXRvcigpIHtcbiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgaWYgKCFjb250YWluZXIpIHJldHVybjtcblxuICBjb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDoxMnB4O3BhZGRpbmc6MjBweDtjb2xvcjojNmI3MjgwO1wiPjxkaXYgY2xhc3M9XCJsb2FkaW5nLXNwaW5uZXJcIiBzdHlsZT1cIndpZHRoOjIwcHg7aGVpZ2h0OjIwcHg7Ym9yZGVyLXdpZHRoOjJweDtmbGV4LXNocmluazowO1wiPjwvZGl2PjxzcGFuPkxvYWRpbmcgZXhwZXJpZW5jZSBidWxsZXRzIGVkaXRvclx1MjAyNjwvc3Bhbj48L2Rpdj4nO1xuXG4gIC8vIEZldGNoIGV4cGVyaWVuY2VzICsgdGhlaXIgYWNoaWV2ZW1lbnRzIGZyb20gbWFzdGVyIGZpZWxkc1xuICBsZXQgZXhwZXJpZW5jZXMgPSBbXTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZmllbGRzJyk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgZXhwZXJpZW5jZXMgPSBkYXRhLmV4cGVyaWVuY2VzIHx8IFtdO1xuICB9IGNhdGNoIChfKSB7fVxuXG4gIGlmIChleHBlcmllbmNlcy5sZW5ndGggPT09IDApIHtcbiAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJzxwIHN0eWxlPVwicGFkZGluZzoyMHB4O2NvbG9yOiM2YjcyODA7XCI+Tm8gZXhwZXJpZW5jZXMgZm91bmQgaW4gbWFzdGVyIENWLjwvcD4nO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEluaXRpYWxpc2UgZWRpdHMgc3RvcmUgXHUyMDE0IGtleWVkIGJ5IGV4cGVyaWVuY2UgaW5kZXgsIHZhbHVlIGlzIGFycmF5IG9mIHsgdGV4dCwgaGlkZGVuIH1cbiAgd2luZG93LmFjaGlldmVtZW50RWRpdHMgPSB3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0cyB8fCB7fTtcbiAgZXhwZXJpZW5jZXMuZm9yRWFjaCgoZXhwLCBleHBJZHgpID0+IHtcbiAgICBpZiAoIXdpbmRvdy5hY2hpZXZlbWVudEVkaXRzW2V4cElkeF0pIHtcbiAgICAgIHdpbmRvdy5hY2hpZXZlbWVudEVkaXRzW2V4cElkeF0gPSAoZXhwLmtleV9hY2hpZXZlbWVudHMgfHwgZXhwLmFjaGlldmVtZW50cyB8fCBbXSkubWFwKGEgPT5cbiAgICAgICAgX25vcm1hbGl6ZUFjaGlldmVtZW50RWRpdEVudHJ5KFxuICAgICAgICAgIHR5cGVvZiBhID09PSAnc3RyaW5nJyA/IGEgOiAoYSAmJiAoYS50ZXh0IHx8IGEuZGVzY3JpcHRpb24gfHwgYS5jb250ZW50IHx8ICcnKSkgfHwgJydcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2luZG93LmFjaGlldmVtZW50RWRpdHNbZXhwSWR4XSA9IF9ub3JtYWxpemVBY2hpZXZlbWVudEVkaXRMaXN0KHdpbmRvdy5hY2hpZXZlbWVudEVkaXRzW2V4cElkeF0pO1xuICAgIH1cbiAgfSk7XG5cbiAgbGV0IGh0bWwgPSBgXG4gICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6MTZweDtcIj5cbiAgICAgIDxoMiBzdHlsZT1cIm1hcmdpbjowIDAgNHB4O1wiPlx1MjcwRlx1RkUwRiBFeHBlcmllbmNlIEJ1bGxldHM8L2gyPlxuICAgICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO21hcmdpbjowIDAgMTZweDtmb250LXNpemU6MC45ZW07XCI+XG4gICAgICAgIEVkaXQsIHJlb3JkZXIsIGRlbGV0ZSwgb3IgQUktcmV3cml0ZSBpbmRpdmlkdWFsIGV4cGVyaWVuY2UgYnVsbGV0cyBwZXIgcm9sZS5cbiAgICAgICAgQ2hhbmdlcyBhcmUgc2F2ZWQgYXV0b21hdGljYWxseSBhbmQgdXNlZCBkdXJpbmcgQ1YgZ2VuZXJhdGlvbi5cbiAgICAgIDwvcD5cbiAgYDtcblxuICAvLyBGaWx0ZXIgb3V0IGV4cGVyaWVuY2VzIHRoYXQgdXNlciBtYXJrZWQgYXMgZXhjbHVkZWQgKHBlcnNpc3RlZCBkZWNpc2lvbnMpXG4gIGNvbnN0IGV4cERlY2lzaW9ucyA9ICh3aW5kb3cuX3NhdmVkRGVjaXNpb25zICYmIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMuZXhwZXJpZW5jZV9kZWNpc2lvbnMpIHx8IHVzZXJTZWxlY3Rpb25zLmV4cGVyaWVuY2VzIHx8IHt9O1xuICBleHBlcmllbmNlcy5mb3JFYWNoKChleHAsIGV4cElkeCkgPT4ge1xuICAgIGNvbnN0IGV4cElkID0gZXhwLmlkIHx8IGV4cC5leHBlcmllbmNlX2lkIHx8IGBleHA6OiR7ZXhwSWR4fWA7XG4gICAgY29uc3QgZGVjaXNpb24gPSBleHBEZWNpc2lvbnNbZXhwSWRdO1xuICAgIGlmIChkZWNpc2lvbiA9PT0gJ2V4Y2x1ZGUnKSByZXR1cm47IC8vIG9taXQgZXhjbHVkZWQgZXhwZXJpZW5jZXMgZnJvbSBlZGl0b3JcbiAgICBjb25zdCB0aXRsZSAgICA9IGVzY2FwZUh0bWwoZXhwLnRpdGxlIHx8IGV4cC5wb3NpdGlvbiB8fCBgRXhwZXJpZW5jZSAke2V4cElkeCArIDF9YCk7XG4gICAgY29uc3QgY29tcGFueSAgPSBlc2NhcGVIdG1sKGV4cC5jb21wYW55IHx8IGV4cC5vcmdhbml6YXRpb24gfHwgJycpO1xuICAgIGNvbnN0IGFjaENvdW50ID0gd2luZG93LmFjaGlldmVtZW50RWRpdHNbZXhwSWR4XS5sZW5ndGg7XG5cbiAgICBodG1sICs9IGBcbiAgICAgIDxkZXRhaWxzIG9wZW4gc3R5bGU9XCJtYXJnaW4tYm90dG9tOjEycHg7Ym9yZGVyOjFweCBzb2xpZCAjZTVlN2ViO2JvcmRlci1yYWRpdXM6OHB4O292ZXJmbG93OmhpZGRlbjtcIj5cbiAgICAgICAgPHN1bW1hcnkgc3R5bGU9XCJwYWRkaW5nOjEycHggMTZweDtiYWNrZ3JvdW5kOiNmOWZhZmI7Y3Vyc29yOnBvaW50ZXI7Zm9udC13ZWlnaHQ6NjAwO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDtcIj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZsZXg6MTtcIj4ke3RpdGxlfSR7Y29tcGFueSA/IGAgPHNwYW4gc3R5bGU9XCJmb250LXdlaWdodDo0MDA7Y29sb3I6IzZiNzI4MDtcIj5AICR7Y29tcGFueX08L3NwYW4+YCA6ICcnfTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjhlbTtjb2xvcjojOWNhM2FmO1wiPiR7YWNoQ291bnR9IGJ1bGxldCR7YWNoQ291bnQgIT09IDEgPyAncycgOiAnJ308L3NwYW4+XG4gICAgICAgIDwvc3VtbWFyeT5cbiAgICAgICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6MTJweCAxNnB4O1wiIGlkPVwiYWNoLWVkaXRvci1leHAtJHtleHBJZHh9XCI+XG4gICAgICAgICAgPGRpdiBpZD1cImFjaC1saXN0LSR7ZXhwSWR4fVwiPjwvZGl2PlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4tc2Vjb25kYXJ5XCIgc3R5bGU9XCJtYXJnaW4tdG9wOjhweDtmb250LXNpemU6MC44NWVtO1wiXG4gICAgICAgICAgICBvbmNsaWNrPVwiYWRkQWNoaWV2ZW1lbnRSb3coJHtleHBJZHh9KVwiPisgQWRkIEJ1bGxldDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGV0YWlscz5cbiAgICBgO1xuICB9KTtcblxuICBodG1sICs9IGBcbiAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDoyMHB4O2Rpc3BsYXk6ZmxleDtnYXA6MTJweDthbGlnbi1pdGVtczpjZW50ZXI7XCI+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYmFjay1idG5cIiBvbmNsaWNrPVwic3dpdGNoVGFiKCdleHAtcmV2aWV3JylcIj5cdTIxOTAgQmFjayB0byBFeHBlcmllbmNlczwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbnRpbnVlLWJ0blwiIG9uY2xpY2s9XCJzYXZlQWNoaWV2ZW1lbnRFZGl0c0FuZENvbnRpbnVlKClcIj5TYXZlICZhbXA7IENvbnRpbnVlIHRvIFNraWxscyBcdTIxOTI8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYDtcblxuICBjb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDtcblxuICAvLyBSZW5kZXIgYWNoaWV2ZW1lbnQgcm93cyBmb3IgZWFjaCBleHBlcmllbmNlXG4gIGV4cGVyaWVuY2VzLmZvckVhY2goKF8sIGV4cElkeCkgPT4gcmVuZGVyQWNoaWV2ZW1lbnRFZGl0b3JSb3dzKGV4cElkeCkpO1xufVxuXG4vLyBWZXJicyB0aGF0IGdlbmVyYXRlIGEgd2Vhay12ZXJiIHdhcm5pbmcgYmFkZ2UgaW4gdGhlIGJ1bGxldCBlZGl0b3IuXG5jb25zdCBfQUNIX1BBU1NJVkVfU1RBUlRTID0gbmV3IFNldChbJ3dhcycsJ3dlcmUnLCdpcycsJ2FyZScsJ2JlZW4nXSk7XG5jb25zdCBfQUNIX1dFQUtfVkVSQlMgPSBuZXcgU2V0KFtcbiAgJ2Fzc2lzdGVkJywnY29udHJpYnV0ZWQnLCdoZWxwZWQnLCdwYXJ0aWNpcGF0ZWQnLCdzdXBwb3J0ZWQnLFxuICAnc3VwZXJ2aXNlZCcsJ3dvcmtlZCcsJ2NvbGxhYm9yYXRlZCcsJ2Nvb3BlcmF0ZWQnLFxuXSk7XG5jb25zdCBfQUNIX1NUUk9OR19WRVJCUyA9IG5ldyBTZXQoW1xuICAnYWNjZWxlcmF0ZWQnLCdhY2hpZXZlZCcsJ2FyY2hpdGVjdGVkJywnYXV0b21hdGVkJywnYnVpbHQnLFxuICAnY2hhbXBpb25lZCcsJ2NvaW5lZCcsJ2NvbmNlaXZlZCcsJ2NvbmR1Y3RlZCcsJ2NvbnNvbGlkYXRlZCcsXG4gICdjcmVhdGVkJywnY3V0JywnZGVsaXZlcmVkJywnZGVtb25zdHJhdGVkJywnZGVwbG95ZWQnLFxuICAnZGVzaWduZWQnLCdkZXZlbG9wZWQnLCdkaXJlY3RlZCcsJ2RvdWJsZWQnLCdkcm92ZScsXG4gICdlbmFibGVkJywnZXN0YWJsaXNoZWQnLCdleHBhbmRlZCcsJ2ZvdW5kZWQnLCdnZW5lcmF0ZWQnLFxuICAnZ3JldycsJ2ltcGxlbWVudGVkJywnaW1wcm92ZWQnLCdpbmNyZWFzZWQnLCdpbnRlZ3JhdGVkJyxcbiAgJ2ludmVudGVkJywnbGF1bmNoZWQnLCdsZWQnLCdtYW5hZ2VkJywnb3B0aW1pemVkJywncGlvbmVlcmVkJyxcbiAgJ3Byb3ZpZGVkJywncHVibGlzaGVkJywncmFpc2VkJywncmVkdWNlZCcsJ3JlZmFjdG9yZWQnLCdzY2FsZWQnLFxuICAnc2VjdXJlZCcsJ3NoaXBwZWQnLCdzcGVhcmhlYWRlZCcsJ3N0cmVhbWxpbmVkJywndGF1Z2h0JyxcbiAgJ3RyYW5zZm9ybWVkJywndHJhbnNsYXRlZCcsJ3RyaXBsZWQnLFxuXSk7XG5cbmZ1bmN0aW9uIF9hY2hWZXJiV2FybmluZyh0ZXh0KSB7XG4gIGNvbnN0IGZpcnN0V29yZCA9ICh0ZXh0IHx8ICcnKS50cmltKCkuc3BsaXQoL1tcXHMsLjo7XS8pWzBdLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvW15hLXpdL2csICcnKTtcbiAgaWYgKCFmaXJzdFdvcmQpIHJldHVybiBudWxsO1xuICBpZiAoX0FDSF9QQVNTSVZFX1NUQVJUUy5oYXMoZmlyc3RXb3JkKSkgcmV0dXJuIHsgbGV2ZWw6ICdwYXNzaXZlJywgd29yZDogZmlyc3RXb3JkIH07XG4gIGlmIChfQUNIX1dFQUtfVkVSQlMuaGFzKGZpcnN0V29yZCkpIHJldHVybiB7IGxldmVsOiAnd2VhaycsICAgIHdvcmQ6IGZpcnN0V29yZCB9O1xuICBpZiAoIV9BQ0hfU1RST05HX1ZFUkJTLmhhcyhmaXJzdFdvcmQpKSByZXR1cm4geyBsZXZlbDogJ25ldXRyYWwnLCB3b3JkOiBmaXJzdFdvcmQgfTtcbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogUmVuZGVyIHRoZSBlZGl0YWJsZSBhY2hpZXZlbWVudCByb3dzIGZvciBvbmUgZXhwZXJpZW5jZS5cbiAqL1xuZnVuY3Rpb24gcmVuZGVyQWNoaWV2ZW1lbnRFZGl0b3JSb3dzKGV4cElkeCkge1xuICBjb25zdCBsaXN0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgYWNoLWxpc3QtJHtleHBJZHh9YCk7XG4gIGlmICghbGlzdEVsKSByZXR1cm47XG4gIGNvbnN0IGFjaHMgPSBfbm9ybWFsaXplQWNoaWV2ZW1lbnRFZGl0TGlzdCh3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0c1tleHBJZHhdIHx8IFtdKTtcbiAgd2luZG93LmFjaGlldmVtZW50RWRpdHNbZXhwSWR4XSA9IGFjaHM7XG5cbiAgaWYgKGFjaHMubGVuZ3RoID09PSAwKSB7XG4gICAgbGlzdEVsLmlubmVySFRNTCA9ICc8cCBzdHlsZT1cImNvbG9yOiM5Y2EzYWY7Zm9udC1zaXplOjAuODVlbTtwYWRkaW5nOjRweCAwO1wiPk5vIGV4cGVyaWVuY2UgYnVsbGV0cyB5ZXQuPC9wPic7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGlzdEVsLmlubmVySFRNTCA9IGFjaHMubWFwKChlbnRyeSwgYWNoSWR4KSA9PiB7XG4gICAgY29uc3QgdGV4dCA9IF9hY2hpZXZlbWVudEVudHJ5VGV4dChlbnRyeSk7XG4gICAgY29uc3QgaGlkZGVuID0gX2FjaGlldmVtZW50RW50cnlIaWRkZW4oZW50cnkpO1xuICAgIGNvbnN0IHZlcmJXYXJuID0gX2FjaFZlcmJXYXJuaW5nKHRleHQpO1xuICAgIGNvbnN0IHZlcmJCYWRnZSA9IHZlcmJXYXJuXG4gICAgICA/ICh2ZXJiV2Fybi5sZXZlbCA9PT0gJ3Bhc3NpdmUnXG4gICAgICAgICAgPyBgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjc4ZW07Y29sb3I6IzlmMTIzOTtiYWNrZ3JvdW5kOiNmZmYxZjI7Ym9yZGVyOjFweCBzb2xpZCAjZmVjZGQzO2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6MnB4IDZweDttYXJnaW4tdG9wOjNweDtcIiB0aXRsZT1cIkJ1bGxldCBvcGVucyB3aXRoIHBhc3NpdmUgdm9pY2UgKCcke3ZlcmJXYXJuLndvcmR9JykgXHUyMDE0IHJld3JpdGUgd2l0aCBhbiBhY3RpdmUgb3BlbmluZyB2ZXJiXCI+XHUyNkEwIFBhc3NpdmUgdm9pY2UgXHUyMDE0IHJld3JpdGUgd2l0aCBhbiBhY3RpdmUgb3BlbmluZyB2ZXJiPC9kaXY+YFxuICAgICAgICAgIDogdmVyYldhcm4ubGV2ZWwgPT09ICd3ZWFrJ1xuICAgICAgICAgID8gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC43OGVtO2NvbG9yOiNiNDUzMDk7YmFja2dyb3VuZDojZmZmYmViO2JvcmRlcjoxcHggc29saWQgI2ZkZTY4YTtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjJweCA2cHg7bWFyZ2luLXRvcDozcHg7XCIgdGl0bGU9XCJPcGVuaW5nIHZlcmIgJyR7dmVyYldhcm4ud29yZH0nIGlzIHdlYWsgXHUyMDE0IGNvbnNpZGVyIExlZCwgQnVpbHQsIERyb3ZlLCBldGMuXCI+XHUyNkEwIFdlYWsgb3BlbmluZyB2ZXJiIFx1MjAxNCB1c2UgYSBzdHJvbmdlciBhY3Rpb24gdmVyYjwvZGl2PmBcbiAgICAgICAgICA6IGA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuNzhlbTtjb2xvcjojNmI3MjgwO2JhY2tncm91bmQ6I2Y5ZmFmYjtib3JkZXI6MXB4IHNvbGlkICNlNWU3ZWI7Ym9yZGVyLXJhZGl1czo0cHg7cGFkZGluZzoycHggNnB4O21hcmdpbi10b3A6M3B4O1wiIHRpdGxlPVwiJyR7dmVyYldhcm4ud29yZH0nIGlzIG5vdCBpbiB0aGUgc3Ryb25nLXZlcmIgbGlzdCBcdTIwMTQgdmVyaWZ5IGl0IG1ha2VzIGFuIGltcGFjdCBzdGF0ZW1lbnRcIj5cdTIxMzkgT3BlbmluZyB2ZXJiIG5vdCBpbiBzdHJvbmctdmVyYiBsaXN0PC9kaXY+YFxuICAgICAgICApXG4gICAgICA6ICcnO1xuICAgIHJldHVybiBgXG4gICAgPGRpdiBpZD1cImFjaC1yb3ctJHtleHBJZHh9LSR7YWNoSWR4fVwiIGNsYXNzPVwiJHtoaWRkZW4gPyAnYWNoaWV2ZW1lbnQtcm93LWhpZGRlbicgOiAnJ31cIiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6OHB4O2FsaWduLWl0ZW1zOmZsZXgtc3RhcnQ7bWFyZ2luLWJvdHRvbTo4cHg7XCI+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtnYXA6MnB4O3BhZGRpbmctdG9wOjRweDtcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgdGl0bGU9XCJNb3ZlIHVwXCIgICBhcmlhLWxhYmVsPVwiTW92ZSBidWxsZXQgdXBcIiAgIG9uY2xpY2s9XCJtb3ZlQWNoaWV2ZW1lbnQoJHtleHBJZHh9LCR7YWNoSWR4fSwtMSlcIj5cdTI1QjI8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgdGl0bGU9XCJNb3ZlIGRvd25cIiBhcmlhLWxhYmVsPVwiTW92ZSBidWxsZXQgZG93blwiIG9uY2xpY2s9XCJtb3ZlQWNoaWV2ZW1lbnQoJHtleHBJZHh9LCR7YWNoSWR4fSwrMSlcIj5cdTI1QkM8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBzdHlsZT1cImZsZXg6MTtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO1wiPlxuICAgICAgPHRleHRhcmVhIGlkPVwiYWNoLXRleHQtJHtleHBJZHh9LSR7YWNoSWR4fVwiXG4gICAgICAgIHJvd3M9XCIyXCJcbiAgICAgICAgc3R5bGU9XCJ3aWR0aDoxMDAlO3BhZGRpbmc6NnB4IDhweDtib3JkZXI6MXB4IHNvbGlkICR7aGlkZGVuID8gJyNmNTllMGInIDogdmVyYldhcm4/LmxldmVsID09PSAncGFzc2l2ZScgPyAnI2ZlY2RkMycgOiB2ZXJiV2Fybj8ubGV2ZWwgPT09ICd3ZWFrJyA/ICcjZmRlNjhhJyA6ICcjZDFkNWRiJ307Ym9yZGVyLXJhZGl1czo2cHg7Zm9udC1zaXplOjAuOWVtO3Jlc2l6ZTp2ZXJ0aWNhbDtib3gtc2l6aW5nOmJvcmRlci1ib3g7JHtoaWRkZW4gPyAnYmFja2dyb3VuZDojZmZmYmViO2NvbG9yOiM5MjQwMGU7JyA6ICcnfVwiXG4gICAgICAgIG9uY2hhbmdlPVwidXBkYXRlQWNoaWV2ZW1lbnRUZXh0KCR7ZXhwSWR4fSwke2FjaElkeH0sdGhpcy52YWx1ZSlcIlxuICAgICAgICBvbmJsdXI9XCJ1cGRhdGVBY2hpZXZlbWVudFRleHQoJHtleHBJZHh9LCR7YWNoSWR4fSx0aGlzLnZhbHVlKVwiXG4gICAgICA+JHtlc2NhcGVIdG1sKHRleHQpfTwvdGV4dGFyZWE+XG4gICAgICAke3ZlcmJCYWRnZX1cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Z2FwOjRweDtwYWRkaW5nLXRvcDoycHg7XCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0biAke2hpZGRlbiA/ICdhY3RpdmUnIDogJyd9XCIgdGl0bGU9XCIke2hpZGRlbiA/ICdTaG93IGJ1bGxldCBpbiBnZW5lcmF0ZWQgQ1YnIDogJ0hpZGUgYnVsbGV0IGZyb20gZ2VuZXJhdGVkIENWJ31cIlxuICAgICAgICAgIGFyaWEtbGFiZWw9XCIke2hpZGRlbiA/ICdTaG93IGJ1bGxldCBpbiBnZW5lcmF0ZWQgQ1YnIDogJ0hpZGUgYnVsbGV0IGZyb20gZ2VuZXJhdGVkIENWJ31cIiBhcmlhLXByZXNzZWQ9XCIke2hpZGRlbn1cIlxuICAgICAgICAgIG9uY2xpY2s9XCJ0b2dnbGVBY2hpZXZlbWVudEhpZGRlbigke2V4cElkeH0sJHthY2hJZHh9KVwiXG4gICAgICAgICAgc3R5bGU9XCJjb2xvcjoke2hpZGRlbiA/ICcjYjQ1MzA5JyA6ICcjNjQ3NDhiJ307XCI+JHtleWVTbGFzaEljb24oKX08L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgdGl0bGU9XCJBc2sgQUkgdG8gcmV3cml0ZVwiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIkFzayBBSSB0byByZXdyaXRlIHRoaXMgYnVsbGV0XCJcbiAgICAgICAgICBvbmNsaWNrPVwicmV3cml0ZUFjaGlldmVtZW50V2l0aExMTSgke2V4cElkeH0sJHthY2hJZHh9KVwiXG4gICAgICAgICAgPlx1MjcyODwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiB0aXRsZT1cIkRlbGV0ZVwiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIkRlbGV0ZSB0aGlzIGJ1bGxldFwiXG4gICAgICAgICAgb25jbGljaz1cImRlbGV0ZUFjaGlldmVtZW50KCR7ZXhwSWR4fSwke2FjaElkeH0pXCJcbiAgICAgICAgICBzdHlsZT1cImNvbG9yOiNlZjQ0NDQ7XCI+XHVEODNEXHVEREQxPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYDtcbiAgfSkuam9pbignJyk7XG59XG5cbi8vIERlYm91bmNlIHRpbWVyIGZvciBhdXRvLXBlcnNpc3RpbmcgYWNoaWV2ZW1lbnQgdGV4dCBlZGl0cy5cbmxldCBfYWNoUGVyc2lzdFRpbWVyID0gbnVsbDtcblxuZnVuY3Rpb24gdXBkYXRlQWNoaWV2ZW1lbnRUZXh0KGV4cElkeCwgYWNoSWR4LCB2YWx1ZSkge1xuICBpZiAoIXdpbmRvdy5hY2hpZXZlbWVudEVkaXRzW2V4cElkeF0pIHJldHVybjtcbiAgY29uc3QgZXhpc3RpbmcgPSBfbm9ybWFsaXplQWNoaWV2ZW1lbnRFZGl0RW50cnkod2luZG93LmFjaGlldmVtZW50RWRpdHNbZXhwSWR4XVthY2hJZHhdKTtcbiAgZXhpc3RpbmcudGV4dCA9IHZhbHVlO1xuICB3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0c1tleHBJZHhdW2FjaElkeF0gPSBleGlzdGluZztcblxuICAvLyBEZWJvdW5jZS1wZXJzaXN0IHNvIGVkaXRzIHN1cnZpdmUgdGFiIG5hdmlnYXRpb24gYW5kIHN0YXR1cyBwb2xsaW5nLlxuICBjbGVhclRpbWVvdXQoX2FjaFBlcnNpc3RUaW1lcik7XG4gIF9hY2hQZXJzaXN0VGltZXIgPSBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZmV0Y2goJy9hcGkvc2F2ZS1hY2hpZXZlbWVudC1lZGl0cycsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGVkaXRzOiB3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0cyB9KSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKF9lKSB7IC8qIHNpbGVudCBcdTIwMTQgdXNlciBzdGlsbCBoYXMgaW4tbWVtb3J5IHN0YXRlICovIH1cbiAgfSwgNTAwKTtcbn1cblxuZnVuY3Rpb24gdG9nZ2xlQWNoaWV2ZW1lbnRIaWRkZW4oZXhwSWR4LCBhY2hJZHgpIHtcbiAgaWYgKCF3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0c1tleHBJZHhdKSByZXR1cm47XG4gIGNvbnN0IGV4aXN0aW5nID0gX25vcm1hbGl6ZUFjaGlldmVtZW50RWRpdEVudHJ5KHdpbmRvdy5hY2hpZXZlbWVudEVkaXRzW2V4cElkeF1bYWNoSWR4XSk7XG4gIGV4aXN0aW5nLmhpZGRlbiA9ICFleGlzdGluZy5oaWRkZW47XG4gIHdpbmRvdy5hY2hpZXZlbWVudEVkaXRzW2V4cElkeF1bYWNoSWR4XSA9IGV4aXN0aW5nO1xuICByZW5kZXJBY2hpZXZlbWVudEVkaXRvclJvd3MoZXhwSWR4KTtcbn1cblxuZnVuY3Rpb24gbW92ZUFjaGlldmVtZW50KGV4cElkeCwgYWNoSWR4LCBkaXIpIHtcbiAgY29uc3QgYWNocyA9IHdpbmRvdy5hY2hpZXZlbWVudEVkaXRzW2V4cElkeF07XG4gIGlmICghYWNocykgcmV0dXJuO1xuICBjb25zdCBuZXdJZHggPSBhY2hJZHggKyBkaXI7XG4gIGlmIChuZXdJZHggPCAwIHx8IG5ld0lkeCA+PSBhY2hzLmxlbmd0aCkgcmV0dXJuO1xuICAvLyBGbHVzaCBjdXJyZW50IHRleHRhcmVhIHZhbHVlIGJlZm9yZSBtb3ZpbmdcbiAgY29uc3QgdGEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgYWNoLXRleHQtJHtleHBJZHh9LSR7YWNoSWR4fWApO1xuICBpZiAodGEpIHVwZGF0ZUFjaGlldmVtZW50VGV4dChleHBJZHgsIGFjaElkeCwgdGEudmFsdWUpO1xuICBbYWNoc1thY2hJZHhdLCBhY2hzW25ld0lkeF1dID0gW2FjaHNbbmV3SWR4XSwgYWNoc1thY2hJZHhdXTtcbiAgcmVuZGVyQWNoaWV2ZW1lbnRFZGl0b3JSb3dzKGV4cElkeCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUFjaGlldmVtZW50KGV4cElkeCwgYWNoSWR4KSB7XG4gIGNvbnN0IGFjaHMgPSB3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0c1tleHBJZHhdO1xuICBpZiAoIWFjaHMpIHJldHVybjtcbiAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgY29uZmlybURpYWxvZyhcbiAgICAnRGVsZXRlIHRoaXMgYnVsbGV0IGZyb20gdGhpcyBzZXNzaW9uPyBIaWRkZW4gYnVsbGV0cyByZW1haW4gYXZhaWxhYmxlIGZvciBsYXRlciBoYXJ2ZXN0LCBidXQgZGVsZXRlIHJlbW92ZXMgdGhlIGVkaXRlZCByb3cgZW50aXJlbHkuJyxcbiAgICB7IGNvbmZpcm1MYWJlbDogJ0RlbGV0ZScsIGNhbmNlbExhYmVsOiAnQ2FuY2VsJywgZGFuZ2VyOiB0cnVlIH0sXG4gICk7XG4gIGlmICghY29uZmlybWVkKSByZXR1cm47XG4gIGFjaHMuc3BsaWNlKGFjaElkeCwgMSk7XG4gIHJlbmRlckFjaGlldmVtZW50RWRpdG9yUm93cyhleHBJZHgpO1xufVxuXG5mdW5jdGlvbiBhZGRBY2hpZXZlbWVudFJvdyhleHBJZHgpIHtcbiAgaWYgKCF3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0c1tleHBJZHhdKSB3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0c1tleHBJZHhdID0gW107XG4gIHdpbmRvdy5hY2hpZXZlbWVudEVkaXRzW2V4cElkeF0ucHVzaCh7IHRleHQ6ICcnLCBoaWRkZW46IGZhbHNlIH0pO1xuICByZW5kZXJBY2hpZXZlbWVudEVkaXRvclJvd3MoZXhwSWR4KTtcbiAgLy8gRm9jdXMgdGhlIG5ldyB0ZXh0YXJlYVxuICBjb25zdCBuZXdJZHggPSB3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0c1tleHBJZHhdLmxlbmd0aCAtIDE7XG4gIGNvbnN0IHRhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYGFjaC10ZXh0LSR7ZXhwSWR4fS0ke25ld0lkeH1gKTtcbiAgaWYgKHRhKSB0YS5mb2N1cygpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXdyaXRlQWNoaWV2ZW1lbnRXaXRoTExNKGV4cElkeCwgYWNoSWR4KSB7XG4gIGNvbnN0IHRhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYGFjaC10ZXh0LSR7ZXhwSWR4fS0ke2FjaElkeH1gKTtcbiAgaWYgKCF0YSkgcmV0dXJuO1xuICBjb25zdCBvcmlnaW5hbFRleHQgPSB0YS52YWx1ZS50cmltKCk7XG4gIGlmICghb3JpZ2luYWxUZXh0KSB7IHNob3dUb2FzdCgnUGxlYXNlIGVudGVyIGEgYnVsbGV0IGZpcnN0LicsICdlcnJvcicpOyByZXR1cm47IH1cblxuICBfcmV3cml0ZVN1Z2dlc3Rpb25IaXN0b3J5ID0gW107XG4gIF9sYXN0UmV3cml0ZUxvZ0lkID0gbnVsbDtcbiAgX29wZW5SZXdyaXRlTW9kYWwob3JpZ2luYWxUZXh0LCAnJywgbnVsbCwge1xuICAgIGV4cGVyaWVuY2VJbmRleDogZXhwSWR4LFxuICAgIGFjaGlldmVtZW50SW5kZXg6IGFjaElkeCxcbiAgICBvbkFjY2VwdDogYXN5bmMgKHN1Z2dlc3Rpb24pID0+IHtcbiAgICAgIHVwZGF0ZUFjaGlldmVtZW50VGV4dChleHBJZHgsIGFjaElkeCwgc3VnZ2VzdGlvbik7XG4gICAgICBpZiAodGEpIHRhLnZhbHVlID0gc3VnZ2VzdGlvbjtcbiAgICAgIF9yZWNvcmRSZXdyaXRlT3V0Y29tZSgnYWNjZXB0ZWQnLCBzdWdnZXN0aW9uKTtcbiAgICAgIHNob3dUb2FzdCgnQnVsbGV0IHVwZGF0ZWQuJyk7XG4gICAgfSxcbiAgfSk7XG4gIGF3YWl0IF9ydW5SZXdyaXRlKG9yaWdpbmFsVGV4dCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGFpUmV3cml0ZVRvcExldmVsQWNoaWV2ZW1lbnQoYWNoSWQpIHtcbiAgY29uc3QgYWNoID0gKHdpbmRvdy5fYWNoaWV2ZW1lbnRzT3JkZXJlZCB8fCBbXSkuZmluZChhID0+IGEuaWQgPT09IGFjaElkKTtcbiAgaWYgKCFhY2gpIHJldHVybjtcbiAgY29uc3Qgb3JpZ2luYWxUZXh0ID0gYWNoLmRlc2NyaXB0aW9uIHx8ICcnO1xuICBpZiAoIW9yaWdpbmFsVGV4dCkgeyBzaG93VG9hc3QoJ1BsZWFzZSBlbnRlciBhIGRlc2NyaXB0aW9uIGZpcnN0LicsICdlcnJvcicpOyByZXR1cm47IH1cblxuICBfcmV3cml0ZVN1Z2dlc3Rpb25IaXN0b3J5ID0gW107XG4gIF9sYXN0UmV3cml0ZUxvZ0lkID0gbnVsbDtcbiAgX29wZW5SZXdyaXRlTW9kYWwob3JpZ2luYWxUZXh0LCAnJywgbnVsbCwge1xuICAgIGV4cGVyaWVuY2VJbmRleDogbnVsbCxcbiAgICBvbkFjY2VwdDogYXN5bmMgKHN1Z2dlc3Rpb24pID0+IHtcbiAgICAgIGF3YWl0IHNhdmVUb3BMZXZlbEFjaGlldmVtZW50RmllbGQoYWNoSWQsICdkZXNjcmlwdGlvbicsIHN1Z2dlc3Rpb24pO1xuICAgICAgY29uc3QgZGVzY0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYGFjaC1kZXNjLSR7Q1NTLmVzY2FwZShhY2hJZCl9YCk7XG4gICAgICBpZiAoZGVzY0VsKSBkZXNjRWwudmFsdWUgPSBzdWdnZXN0aW9uO1xuICAgICAgX3JlY29yZFJld3JpdGVPdXRjb21lKCdhY2NlcHRlZCcsIHN1Z2dlc3Rpb24pO1xuICAgICAgc2hvd1RvYXN0KCdBY2hpZXZlbWVudCB1cGRhdGVkLicpO1xuICAgIH0sXG4gIH0pO1xuICBhd2FpdCBfcnVuUmV3cml0ZShvcmlnaW5hbFRleHQpO1xufVxuXG5mdW5jdGlvbiBfb3BlblJld3JpdGVNb2RhbChvcmlnaW5hbFRleHQsIGN1cnJlbnRJbnN0cnVjdGlvbnMsIGN1cnJlbnRTdWdnZXN0aW9uLCBjYWxsYmFja3MpIHtcbiAgX3Jld3JpdGVDYWxsYmFja3MgPSBjYWxsYmFja3M7XG5cbiAgY29uc3Qgc3VnZ2VzdGVkSHRtbCA9IGN1cnJlbnRTdWdnZXN0aW9uICE9IG51bGxcbiAgICA/IGA8cCBpZD1cImFjaC1yZXdyaXRlLXN1Z2dlc3Rpb25cIiBzdHlsZT1cIm1hcmdpbjo0cHggMCAwO21pbi1oZWlnaHQ6Mi40ZW07XCI+JHtlc2NhcGVIdG1sKGN1cnJlbnRTdWdnZXN0aW9uKX08L3A+YFxuICAgIDogYDxwIGlkPVwiYWNoLXJld3JpdGUtc3VnZ2VzdGlvblwiIHN0eWxlPVwibWFyZ2luOjRweCAwIDA7bWluLWhlaWdodDoyLjRlbTtjb2xvcjojOWNhM2FmO2ZvbnQtc3R5bGU6aXRhbGljO1wiPlx1MjNGMyBHZW5lcmF0aW5nXHUyMDI2PC9wPmA7XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FsZXJ0LW1vZGFsLXRpdGxlJykudGV4dENvbnRlbnQgPSAnXHUyNzI4IEFJIFJld3JpdGUnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWxlcnQtbW9kYWwtbWVzc2FnZScpLmlubmVySFRNTCA9IGBcbiAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxMHB4O1wiPlxuICAgICAgPHN0cm9uZz5PcmlnaW5hbDo8L3N0cm9uZz5cbiAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDttYXJnaW46NHB4IDAgMDtmb250LXN0eWxlOml0YWxpYztmb250LXNpemU6MC45MmVtO1wiPiR7ZXNjYXBlSHRtbChvcmlnaW5hbFRleHQpfTwvcD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxMnB4O1wiPlxuICAgICAgPHN0cm9uZz5TdWdnZXN0ZWQ6PC9zdHJvbmc+XG4gICAgICAke3N1Z2dlc3RlZEh0bWx9XG4gICAgPC9kaXY+XG4gICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTZweDtcIj5cbiAgICAgIDxsYWJlbCBmb3I9XCJhY2gtcmV3cml0ZS1pbnN0cnVjdGlvbnNcIiBzdHlsZT1cImZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MC45MmVtO2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWJvdHRvbTo0cHg7XCI+SW5zdHJ1Y3Rpb25zIDxzcGFuIHN0eWxlPVwiZm9udC13ZWlnaHQ6NDAwO2NvbG9yOiM2YjcyODA7XCI+KG9wdGlvbmFsKTwvc3Bhbj48L2xhYmVsPlxuICAgICAgPHRleHRhcmVhIGlkPVwiYWNoLXJld3JpdGUtaW5zdHJ1Y3Rpb25zXCJcbiAgICAgICAgcm93cz1cIjJcIlxuICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gbWFrZSBpdCBtb3JlIGNvbmNpc2UsIGVtcGhhc2lzZSBsZWFkZXJzaGlwLCBhZGQgYSBtZXRyaWNcIlxuICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Ym94LXNpemluZzpib3JkZXItYm94O3BhZGRpbmc6NnB4IDhweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo2cHg7Zm9udC1zaXplOjAuOWVtO3Jlc2l6ZTp2ZXJ0aWNhbDtcIlxuICAgICAgPiR7ZXNjYXBlSHRtbChjdXJyZW50SW5zdHJ1Y3Rpb25zKX08L3RleHRhcmVhPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjhweDtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmQ7XCI+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLXNlY29uZGFyeVwiIGlkPVwiYWNoLXJld3JpdGUtcmVqZWN0LWJ0blwiIG9uY2xpY2s9XCJfcmVjb3JkUmV3cml0ZU91dGNvbWUoJ3JlamVjdGVkJyk7IGNsb3NlQWxlcnRNb2RhbCgpXCI+UmVqZWN0PC9idXR0b24+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLXNlY29uZGFyeVwiIGlkPVwiYWNoLXJld3JpdGUtZ2VuZXJhdGUtYnRuXCI+R2VuZXJhdGU8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJjb250aW51ZS1idG5cIiAgaWQ9XCJhY2gtcmV3cml0ZS1hY2NlcHQtYnRuXCI+QWNjZXB0PC9idXR0b24+XG4gICAgPC9kaXY+YDtcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWxlcnQtbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICBfZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIHNldEluaXRpYWxGb2N1cygnYWxlcnQtbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ2FsZXJ0LW1vZGFsLW92ZXJsYXknKTtcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLXJld3JpdGUtZ2VuZXJhdGUtYnRuJykub25jbGljayA9ICgpID0+IF9ydW5SZXdyaXRlKG9yaWdpbmFsVGV4dCk7XG5cbiAgX3VwZGF0ZVJld3JpdGVBY2NlcHRCdG4oY3VycmVudFN1Z2dlc3Rpb24pO1xufVxuXG5mdW5jdGlvbiBfdXBkYXRlUmV3cml0ZUFjY2VwdEJ0bihzdWdnZXN0aW9uKSB7XG4gIGNvbnN0IGFjY2VwdEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhY2gtcmV3cml0ZS1hY2NlcHQtYnRuJyk7XG4gIGlmICghYWNjZXB0QnRuKSByZXR1cm47XG4gIGFjY2VwdEJ0bi5kaXNhYmxlZCA9IHN1Z2dlc3Rpb24gPT0gbnVsbDtcbiAgYWNjZXB0QnRuLm9uY2xpY2sgPSBzdWdnZXN0aW9uID09IG51bGwgPyBudWxsIDogYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IF9yZXdyaXRlQ2FsbGJhY2tzLm9uQWNjZXB0KHN1Z2dlc3Rpb24pO1xuICAgIGNsb3NlQWxlcnRNb2RhbCgpO1xuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBfcmVjb3JkUmV3cml0ZU91dGNvbWUob3V0Y29tZSwgYWNjZXB0ZWRUZXh0KSB7XG4gIGlmICghX2xhc3RSZXdyaXRlTG9nSWQpIHJldHVybjtcbiAgY29uc3QgbG9nSWQgPSBfbGFzdFJld3JpdGVMb2dJZDtcbiAgX2xhc3RSZXdyaXRlTG9nSWQgPSBudWxsO1xuICBjb25zdCBib2R5ID0geyBsb2dfaWQ6IGxvZ0lkLCBvdXRjb21lIH07XG4gIGlmIChhY2NlcHRlZFRleHQgIT0gbnVsbCkgYm9keS5hY2NlcHRlZF90ZXh0ID0gYWNjZXB0ZWRUZXh0O1xuICB0cnkge1xuICAgIGF3YWl0IGZldGNoKCcvYXBpL3Jld3JpdGUtYWNoaWV2ZW1lbnQtb3V0Y29tZScsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSxcbiAgICB9KTtcbiAgfSBjYXRjaCAoXykgeyAvKiBmaXJlLWFuZC1mb3JnZXQgXHUyMDE0IGRvbid0IGRpc3J1cHQgdGhlIFVJICovIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gX3J1blJld3JpdGUob3JpZ2luYWxUZXh0KSB7XG4gIGNvbnN0IGluc3RydWN0aW9uc0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaC1yZXdyaXRlLWluc3RydWN0aW9ucycpO1xuICBjb25zdCB1c2VySW5zdHJ1Y3Rpb25zID0gaW5zdHJ1Y3Rpb25zRWwgPyBpbnN0cnVjdGlvbnNFbC52YWx1ZS50cmltKCkgOiAnJztcblxuICBjb25zdCBnZW5lcmF0ZUJ0biAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLXJld3JpdGUtZ2VuZXJhdGUtYnRuJyk7XG4gIGNvbnN0IGFjY2VwdEJ0biAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhY2gtcmV3cml0ZS1hY2NlcHQtYnRuJyk7XG4gIGNvbnN0IHJlamVjdEJ0biAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhY2gtcmV3cml0ZS1yZWplY3QtYnRuJyk7XG4gIGNvbnN0IHN1Z2dlc3Rpb25FbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhY2gtcmV3cml0ZS1zdWdnZXN0aW9uJyk7XG5cbiAgLy8gQ2FwdHVyZSB0aGUgY3VycmVudCBzdWdnZXN0aW9uIGFzIGEgcHJpb3IgYXR0ZW1wdCBiZWZvcmUgb3ZlcndyaXRpbmdcbiAgaWYgKHN1Z2dlc3Rpb25FbCkge1xuICAgIGNvbnN0IHByZXYgPSBzdWdnZXN0aW9uRWwudGV4dENvbnRlbnQudHJpbSgpO1xuICAgIGlmIChwcmV2ICYmIHByZXYgIT09ICdHZW5lcmF0aW5nXHUyMDI2JyAmJiAhcHJldi5zdGFydHNXaXRoKCdFcnJvcjonKSAmJiAhX3Jld3JpdGVTdWdnZXN0aW9uSGlzdG9yeS5pbmNsdWRlcyhwcmV2KSkge1xuICAgICAgX3Jld3JpdGVTdWdnZXN0aW9uSGlzdG9yeS5wdXNoKHByZXYpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChnZW5lcmF0ZUJ0bikgeyBnZW5lcmF0ZUJ0bi5kaXNhYmxlZCA9IHRydWU7IGdlbmVyYXRlQnRuLmlubmVySFRNTCA9ICc8c3BhbiBjbGFzcz1cImJ0bi1zcGlubmVyXCI+PC9zcGFuPkdlbmVyYXRpbmdcXHUyMDI2JzsgfVxuICBpZiAoYWNjZXB0QnRuKSAgIHsgYWNjZXB0QnRuLmRpc2FibGVkID0gdHJ1ZTsgfVxuICBpZiAoc3VnZ2VzdGlvbkVsKSB7IHN1Z2dlc3Rpb25FbC5zdHlsZS5jb2xvciA9ICcjOWNhM2FmJzsgc3VnZ2VzdGlvbkVsLnN0eWxlLmZvbnRTdHlsZSA9ICdpdGFsaWMnOyBzdWdnZXN0aW9uRWwudGV4dENvbnRlbnQgPSAnR2VuZXJhdGluZ1x1MjAyNic7IH1cblxuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3Jld3JpdGUtYWNoaWV2ZW1lbnQnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBhY2hpZXZlbWVudF90ZXh0OiAgICAgb3JpZ2luYWxUZXh0LFxuICAgICAgICBleHBlcmllbmNlX2luZGV4OiAgICAgX3Jld3JpdGVDYWxsYmFja3M/LmV4cGVyaWVuY2VJbmRleCA/PyBudWxsLFxuICAgICAgICBhY2hpZXZlbWVudF9pbmRleDogICAgX3Jld3JpdGVDYWxsYmFja3M/LmFjaGlldmVtZW50SW5kZXggPz8gbnVsbCxcbiAgICAgICAgdXNlcl9pbnN0cnVjdGlvbnM6ICAgIHVzZXJJbnN0cnVjdGlvbnMsXG4gICAgICAgIHByZXZpb3VzX3N1Z2dlc3Rpb25zOiBfcmV3cml0ZVN1Z2dlc3Rpb25IaXN0b3J5LFxuICAgICAgfSlcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoIXJlcy5vaykgdGhyb3cgbmV3IEVycm9yKGRhdGEuZXJyb3IgfHwgJ1Jld3JpdGUgZmFpbGVkJyk7XG5cbiAgICBjb25zdCByZXdyaXR0ZW4gPSBkYXRhLnJld3JpdHRlbiB8fCAnJztcbiAgICBfbGFzdFJld3JpdGVMb2dJZCA9IGRhdGEubG9nX2lkIHx8IG51bGw7XG4gICAgaWYgKHN1Z2dlc3Rpb25FbCkge1xuICAgICAgc3VnZ2VzdGlvbkVsLnN0eWxlLmNvbG9yID0gJyc7XG4gICAgICBzdWdnZXN0aW9uRWwuc3R5bGUuZm9udFN0eWxlID0gJyc7XG4gICAgICBzdWdnZXN0aW9uRWwudGV4dENvbnRlbnQgPSByZXdyaXR0ZW47XG4gICAgfVxuICAgIF91cGRhdGVSZXdyaXRlQWNjZXB0QnRuKHJld3JpdHRlbik7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChzdWdnZXN0aW9uRWwpIHsgc3VnZ2VzdGlvbkVsLnN0eWxlLmNvbG9yID0gJyNlZjQ0NDQnOyBzdWdnZXN0aW9uRWwuc3R5bGUuZm9udFN0eWxlID0gJyc7IHN1Z2dlc3Rpb25FbC50ZXh0Q29udGVudCA9IGBFcnJvcjogJHtlcnIubWVzc2FnZX1gOyB9XG4gICAgc2hvd1RvYXN0KGBBSSByZXdyaXRlIGZhaWxlZDogJHtlcnIubWVzc2FnZX1gLCAnZXJyb3InKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoZ2VuZXJhdGVCdG4pIHsgZ2VuZXJhdGVCdG4uZGlzYWJsZWQgPSBmYWxzZTsgZ2VuZXJhdGVCdG4udGV4dENvbnRlbnQgPSAnR2VuZXJhdGUnOyB9XG4gICAgaWYgKHJlamVjdEJ0bikgICB7IHJlamVjdEJ0bi5kaXNhYmxlZCA9IGZhbHNlOyB9XG4gIH1cbn1cblxuLyoqXG4gKiBTYXZlIGEgc2luZ2xlIGZpZWxkIG9mIGEgdG9wLWxldmVsIGFjaGlldmVtZW50IGluIHNlc3Npb24gc3RhdGUgYW5kIHVwZGF0ZSB0aGUgbG9jYWwgY2FjaGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNhdmVUb3BMZXZlbEFjaGlldmVtZW50RmllbGQoYWNoSWQsIGZpZWxkLCB2YWx1ZSkge1xuICBjb25zdCBhY2ggPSAod2luZG93Ll9hY2hpZXZlbWVudHNPcmRlcmVkIHx8IFtdKS5maW5kKGEgPT4gYS5pZCA9PT0gYWNoSWQpO1xuICBjb25zdCBwcmV2aW91cyA9IGFjaCA/IGFjaFtmaWVsZF0gOiB1bmRlZmluZWQ7XG4gIGlmIChhY2gpIGFjaFtmaWVsZF0gPSB2YWx1ZTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9yZXZpZXctYWNoaWV2ZW1lbnQnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBpZDogYWNoSWQsIGZpZWxkLCB2YWx1ZSB9KSxcbiAgICB9KTtcbiAgICBpZiAoIXJlcy5vaykgdGhyb3cgbmV3IEVycm9yKChhd2FpdCByZXMuanNvbigpKS5lcnJvciB8fCAnU2F2ZSBmYWlsZWQnKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gUm9sbCBiYWNrIHRoZSBvcHRpbWlzdGljIHVwZGF0ZVxuICAgIGlmIChhY2ggJiYgcHJldmlvdXMgIT09IHVuZGVmaW5lZCkgYWNoW2ZpZWxkXSA9IHByZXZpb3VzO1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZmllbGQgPT09ICd0aXRsZScgPyBgYWNoLXRpdGxlLSR7Q1NTLmVzY2FwZShhY2hJZCl9YCA6IGBhY2gtZGVzYy0ke0NTUy5lc2NhcGUoYWNoSWQpfWApO1xuICAgIGlmIChlbCkgZWwudmFsdWUgPSBwcmV2aW91cyA/PyAnJztcbiAgICBzaG93VG9hc3QoYEZhaWxlZCB0byBzYXZlIGFjaGlldmVtZW50OiAke2Vyci5tZXNzYWdlfWAsICdlcnJvcicpO1xuICB9XG59XG5cbi8qKlxuICogSGlkZSBhIHRvcC1sZXZlbCBhY2hpZXZlbWVudCBmb3IgdGhpcyBzZXNzaW9uIGFmdGVyIGNvbmZpcm1hdGlvbi5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGVsZXRlVG9wTGV2ZWxBY2hpZXZlbWVudChhY2hJZCkge1xuICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCBjb25maXJtRGlhbG9nKFxuICAgICdIaWRlIHRoaXMgYWNoaWV2ZW1lbnQgZm9yIHRoaXMgQ1Ygb25seT8gWW91IGNhbiByZXN0b3JlIGl0IGJ5IHN0YXJ0aW5nIG92ZXIgb3IgY2hhbmdpbmcgdGhlIHNlc3Npb24gc2VsZWN0aW9ucy4nLFxuICAgIHsgY29uZmlybUxhYmVsOiAnSGlkZScsIGNhbmNlbExhYmVsOiAnQ2FuY2VsJywgZGFuZ2VyOiB0cnVlIH0sXG4gICk7XG4gIGlmICghY29uZmlybWVkKSByZXR1cm47XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvcmV2aWV3LWFjaGlldmVtZW50Jywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgaWQ6IGFjaElkLCBhY3Rpb246ICdkZWxldGUnIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICB3aW5kb3cuX2FjaGlldmVtZW50c09yZGVyZWQgPSAod2luZG93Ll9hY2hpZXZlbWVudHNPcmRlcmVkIHx8IFtdKS5maWx0ZXIoYSA9PiBhLmlkICE9PSBhY2hJZCk7XG4gICAgICBkZWxldGUgd2luZG93LmFjaGlldmVtZW50RGVjaXNpb25zW2FjaElkXTtcbiAgICAgIF9yZW5kZXJBY2hpZXZlbWVudHNSZXZpZXdUYWJsZSgpO1xuICAgICAgc2hvd1RvYXN0KCdBY2hpZXZlbWVudCBoaWRkZW4gZm9yIHRoaXMgc2Vzc2lvbi4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2hvd1RvYXN0KGRhdGEuZXJyb3IgfHwgJ0RlbGV0ZSBmYWlsZWQuJywgJ2Vycm9yJyk7XG4gICAgfVxuICB9IGNhdGNoIChfKSB7XG4gICAgc2hvd1RvYXN0KCdGYWlsZWQgdG8gZGVsZXRlIGFjaGlldmVtZW50LicsICdlcnJvcicpO1xuICB9XG59XG5cbi8qKlxuICogU2F2ZSBhbiBlZGl0ZWQgZmllbGQgb24gYW4gQUktc3VnZ2VzdGVkIGFjaGlldmVtZW50IChpbi1tZW1vcnkgb25seTtcbiAqIHN1Z2dlc3Rpb25zIGFyZSBub3QgcGVyc2lzdGVkIHRvIHRoZSBzZXJ2ZXIgdW50aWwgYWNjZXB0ZWQpLlxuICovXG5mdW5jdGlvbiBzYXZlU3VnZ2VzdGVkQWNoaWV2ZW1lbnRGaWVsZChzdWdnSWQsIGZpZWxkLCB2YWx1ZSkge1xuICBjb25zdCBzdWdnID0gKHdpbmRvdy5fc3VnZ2VzdGVkQWNoc09yZGVyZWQgfHwgW10pLmZpbmQocyA9PiBzLl9zdWdnSWQgPT09IHN1Z2dJZCk7XG4gIGlmIChzdWdnKSBzdWdnW2ZpZWxkXSA9IHZhbHVlO1xufVxuXG4vKipcbiAqIE9wZW4gdGhlIEFJIHJld3JpdGUgbW9kYWwgZm9yIGEgc3VnZ2VzdGVkIGFjaGlldmVtZW50IGRlc2NyaXB0aW9uLlxuICovXG5hc3luYyBmdW5jdGlvbiBhaVJld3JpdGVTdWdnZXN0ZWRBY2hpZXZlbWVudChzdWdnSWQpIHtcbiAgY29uc3Qgc3VnZyA9ICh3aW5kb3cuX3N1Z2dlc3RlZEFjaHNPcmRlcmVkIHx8IFtdKS5maW5kKHMgPT4gcy5fc3VnZ0lkID09PSBzdWdnSWQpO1xuICBpZiAoIXN1Z2cpIHJldHVybjtcbiAgY29uc3Qgb3JpZ2luYWxUZXh0ID0gc3VnZy5kZXNjcmlwdGlvbiB8fCAnJztcbiAgaWYgKCFvcmlnaW5hbFRleHQpIHsgc2hvd1RvYXN0KCdQbGVhc2UgZW50ZXIgYSBkZXNjcmlwdGlvbiBmaXJzdC4nLCAnZXJyb3InKTsgcmV0dXJuOyB9XG5cbiAgX3Jld3JpdGVTdWdnZXN0aW9uSGlzdG9yeSA9IFtdO1xuICBfbGFzdFJld3JpdGVMb2dJZCA9IG51bGw7XG4gIF9vcGVuUmV3cml0ZU1vZGFsKG9yaWdpbmFsVGV4dCwgJycsIG51bGwsIHtcbiAgICBleHBlcmllbmNlSW5kZXg6IG51bGwsXG4gICAgb25BY2NlcHQ6IGFzeW5jIChzdWdnZXN0aW9uKSA9PiB7XG4gICAgICBzYXZlU3VnZ2VzdGVkQWNoaWV2ZW1lbnRGaWVsZChzdWdnSWQsICdkZXNjcmlwdGlvbicsIHN1Z2dlc3Rpb24pO1xuICAgICAgY29uc3QgZGVzY0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYGFjaC1kZXNjLSR7c3VnZ0lkfWApO1xuICAgICAgaWYgKGRlc2NFbCkgZGVzY0VsLnZhbHVlID0gc3VnZ2VzdGlvbjtcbiAgICAgIF9yZWNvcmRSZXdyaXRlT3V0Y29tZSgnYWNjZXB0ZWQnLCBzdWdnZXN0aW9uKTtcbiAgICAgIHNob3dUb2FzdCgnQWNoaWV2ZW1lbnQgdXBkYXRlZC4nKTtcbiAgICB9LFxuICB9KTtcbiAgYXdhaXQgX3J1blJld3JpdGUob3JpZ2luYWxUZXh0KTtcbn1cblxuLyoqXG4gKiBNb3ZlIGEgc3VnZ2VzdGVkIGFjaGlldmVtZW50IHVwIG9yIGRvd24gd2l0aGluIHRoZSBkaXNwbGF5IG9yZGVyLlxuICogU3RhYmxlIElEcyBtZWFuIG5vIGRlY2lzaW9uIHJlbWFwcGluZyBpcyBuZWVkZWQuXG4gKi9cbmZ1bmN0aW9uIG1vdmVTdWdnZXN0ZWRBY2hpZXZlbWVudFJvdyhzdWdnSWQsIGRpcmVjdGlvbikge1xuICBjb25zdCBhcnIgPSB3aW5kb3cuX3N1Z2dlc3RlZEFjaHNPcmRlcmVkO1xuICBpZiAoIWFycikgcmV0dXJuO1xuICBjb25zdCBpZHggPSBhcnIuZmluZEluZGV4KHMgPT4gcy5fc3VnZ0lkID09PSBzdWdnSWQpO1xuICBpZiAoaWR4IDwgMCkgcmV0dXJuO1xuICBjb25zdCBuZXdJZHggPSBpZHggKyBkaXJlY3Rpb247XG4gIGlmIChuZXdJZHggPCAwIHx8IG5ld0lkeCA+PSBhcnIubGVuZ3RoKSByZXR1cm47XG4gIFthcnJbaWR4XSwgYXJyW25ld0lkeF1dID0gW2FycltuZXdJZHhdLCBhcnJbaWR4XV07XG4gIF9yZW5kZXJBY2hpZXZlbWVudHNSZXZpZXdUYWJsZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoaWV2ZW1lbnRzLXRhYmxlLWNvbnRhaW5lcicpKTtcbn1cblxuLyoqXG4gKiBSZW1vdmUgYSBzdWdnZXN0ZWQgYWNoaWV2ZW1lbnQgZnJvbSB0aGUgbGlzdCBhZnRlciBjb25maXJtYXRpb24uXG4gKiBTdGFibGUgSURzIG1lYW4gbm8gb3RoZXIgZGVjaXNpb24ga2V5cyBuZWVkIHJlbWFwcGluZy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGVsZXRlU3VnZ2VzdGVkQWNoaWV2ZW1lbnQoc3VnZ0lkKSB7XG4gIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IGNvbmZpcm1EaWFsb2coJ1JlbW92ZSB0aGlzIEFJIHN1Z2dlc3Rpb24/JywgeyBjb25maXJtTGFiZWw6ICdSZW1vdmUnLCBkYW5nZXI6IHRydWUgfSk7XG4gIGlmICghY29uZmlybWVkKSByZXR1cm47XG4gIHdpbmRvdy5fc3VnZ2VzdGVkQWNoc09yZGVyZWQgPSAod2luZG93Ll9zdWdnZXN0ZWRBY2hzT3JkZXJlZCB8fCBbXSkuZmlsdGVyKHMgPT4gcy5fc3VnZ0lkICE9PSBzdWdnSWQpO1xuICBkZWxldGUgd2luZG93LmFjaGlldmVtZW50RGVjaXNpb25zW3N1Z2dJZF07XG4gIF9yZW5kZXJBY2hpZXZlbWVudHNSZXZpZXdUYWJsZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoaWV2ZW1lbnRzLXRhYmxlLWNvbnRhaW5lcicpKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZUFjaGlldmVtZW50RWRpdHNBbmRDb250aW51ZSgpIHtcbiAgdHJ5IHtcbiAgICAvLyBGbHVzaCBhbnkgY3VycmVudGx5LWZvY3VzZWQgdGV4dGFyZWFzXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2lkXj1cImFjaC10ZXh0LVwiXScpLmZvckVhY2godGEgPT4ge1xuICAgICAgY29uc3QgcGFydHMgPSB0YS5pZC5zcGxpdCgnLScpO1xuICAgICAgaWYgKHBhcnRzLmxlbmd0aCA+PSA0KSB7XG4gICAgICAgIGNvbnN0IGV4cElkeCA9IHBhcnNlSW50KHBhcnRzWzJdKTtcbiAgICAgICAgY29uc3QgYWNoSWR4ID0gcGFyc2VJbnQocGFydHNbM10pO1xuICAgICAgICBpZiAoIWlzTmFOKGV4cElkeCkgJiYgIWlzTmFOKGFjaElkeCkgJiYgd2luZG93LmFjaGlldmVtZW50RWRpdHNbZXhwSWR4XSkge1xuICAgICAgICAgIHVwZGF0ZUFjaGlldmVtZW50VGV4dChleHBJZHgsIGFjaElkeCwgdGEudmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9zYXZlLWFjaGlldmVtZW50LWVkaXRzJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgZWRpdHM6IHdpbmRvdy5hY2hpZXZlbWVudEVkaXRzIH0pXG4gICAgfSk7XG4gICAgaWYgKCFyZXMub2spIHtcbiAgICAgIGNvbnN0IGVyciA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBzaG93VG9hc3QoYEVycm9yIHNhdmluZzogJHtlcnIuZXJyb3IgfHwgJ1Vua25vd24gZXJyb3InfWAsICdlcnJvcicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzdGF0ZU1hbmFnZXIubWFya0NvbnRlbnRDaGFuZ2VkKCk7XG4gICAgc2hvd1RvYXN0KCdBY2hpZXZlbWVudCBlZGl0cyBzYXZlZC4nKTtcbiAgICBzd2l0Y2hUYWIoJ3NraWxscy1yZXZpZXcnKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dUb2FzdCgnRmFpbGVkIHRvIHNhdmUgYWNoaWV2ZW1lbnQgZWRpdHMuJywgJ2Vycm9yJyk7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgZmV0Y2hKc29uV2l0aFRpbWVvdXQsXG4gIF9hY2hWZXJiV2FybmluZyxcbiAgX2FjaFNuYXBzaG90S2V5LFxuICBfc2F2ZUFjaFNuYXBzaG90LFxuICBfZ2V0QWNoU25hcHNob3QsXG4gIGJ1aWxkQWNoaWV2ZW1lbnRzUmV2aWV3VGFibGUsXG4gIF9yZW5kZXJBY2hpZXZlbWVudHNSZXZpZXdUYWJsZSxcbiAgYnVsa0FjaGlldmVtZW50QWN0aW9uLFxuICBoYW5kbGVBY2hpZXZlbWVudEFjdGlvbixcbiAgc3VibWl0QWNoaWV2ZW1lbnREZWNpc2lvbnMsXG4gIG1vdmVBY2hpZXZlbWVudFJvdyxcbiAgYnVpbGRBY2hpZXZlbWVudHNFZGl0b3IsXG4gIHJlbmRlckFjaGlldmVtZW50RWRpdG9yUm93cyxcbiAgdXBkYXRlQWNoaWV2ZW1lbnRUZXh0LFxuICB0b2dnbGVBY2hpZXZlbWVudEhpZGRlbixcbiAgbW92ZUFjaGlldmVtZW50LFxuICBkZWxldGVBY2hpZXZlbWVudCxcbiAgYWRkQWNoaWV2ZW1lbnRSb3csXG4gIHJld3JpdGVBY2hpZXZlbWVudFdpdGhMTE0sXG4gIGFpUmV3cml0ZVRvcExldmVsQWNoaWV2ZW1lbnQsXG4gIF9vcGVuUmV3cml0ZU1vZGFsLFxuICBfdXBkYXRlUmV3cml0ZUFjY2VwdEJ0bixcbiAgX3JlY29yZFJld3JpdGVPdXRjb21lLFxuICBfcnVuUmV3cml0ZSxcbiAgc2F2ZVRvcExldmVsQWNoaWV2ZW1lbnRGaWVsZCxcbiAgZGVsZXRlVG9wTGV2ZWxBY2hpZXZlbWVudCxcbiAgc2F2ZVN1Z2dlc3RlZEFjaGlldmVtZW50RmllbGQsXG4gIGFpUmV3cml0ZVN1Z2dlc3RlZEFjaGlldmVtZW50LFxuICBtb3ZlU3VnZ2VzdGVkQWNoaWV2ZW1lbnRSb3csXG4gIGRlbGV0ZVN1Z2dlc3RlZEFjaGlldmVtZW50LFxuICBzYXZlQWNoaWV2ZW1lbnRFZGl0c0FuZENvbnRpbnVlLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL3RhZ2xpbmUtcmV2aWV3LmpzXG4gKiBBcHBsaWNhbnQgdGFnbGluZSAoaGVhZGxpbmUpIHJldmlldzogZGlzcGxheSBBSS1wcm9wb3NlZCB0YWdsaW5lLFxuICogYWxsb3cgZWRpdGluZywgcmVxdWlyZSBleHBsaWNpdCB1c2VyIGNvbmZpcm1hdGlvbiBiZWZvcmUgY29udGludWluZy5cbiAqXG4gKiBUaGUgdGFnbGluZSBpcyB0aGUgb25lLWxpbmUgcHJvZmVzc2lvbmFsIGlkZW50aXR5IHNob3duIHVuZGVyIHRoZVxuICogYXBwbGljYW50J3MgbmFtZSBvbiB0aGUgQ1YuICBJdCBpcyBOT1QgdGhlIHNhbWUgYXMgdGhlIGpvYiB0aXRsZSBcdTIwMTRcbiAqIGl0IGRlc2NyaWJlcyB0aGUgYXBwbGljYW50IChlLmcuIFwiU2VuaW9yIERhdGEgU2NpZW50aXN0IHNwZWNpYWxpc2luZ1xuICogaW4gYmlvc3RhdGlzdGljcyBhbmQgTUxcIiksIG5vdCB0aGUgcm9sZSBiZWluZyBhcHBsaWVkIGZvci5cbiAqXG4gKiBVc2VyIE1VU1QgY2xpY2sgXCJDb25maXJtIFRhZ2xpbmVcIiBiZWZvcmUgZ2VuZXJhdGlvbiBpcyBhbGxvd2VkLlxuICogVGhlIGNvbmZpcm1lZCB0ZXh0IGlzIHN0b3JlZCB2aWEgUE9TVCAvYXBpL3Jldmlldy1kZWNpc2lvbnMgKHR5cGU6ICd0YWdsaW5lJykuXG4gKlxuICogRGVwZW5kZW5jaWVzIChyZXNvbHZlZCB0aHJvdWdoIGdsb2JhbFRoaXMgYXQgcnVudGltZSk6XG4gKiAgIGVzY2FwZUh0bWwsIHNob3dUb2FzdCwgc3dpdGNoVGFiLCBzdGF0ZU1hbmFnZXJcbiAqL1xuXG5pbXBvcnQgeyBzdGF0ZU1hbmFnZXIgfSBmcm9tICcuL3N0YXRlLW1hbmFnZXIuanMnO1xuXG4vLyBcdTI1MDBcdTI1MDAgQnVpbGQgdGFnbGluZS1yZXZpZXcgc2VjdGlvbiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLyoqXG4gKiBkdWNrZmxvdzpcbiAqICAgaWQ6IHRhZ2xpbmVfdWlfYnVpbGRcbiAqICAga2luZDogdWlcbiAqICAgdGltZXN0YW1wOiBcIjIwMjYtMDUtMjhUMDA6MDA6MDBaXCJcbiAqICAgc3RhdHVzOiBsaXZlXG4gKiAgIGhhbmRsZXM6IFtcInVpOnRhZ2xpbmUtcmV2aWV3LmJ1aWxkXCJdXG4gKiAgIHJlYWRzOlxuICogICAgIC0gXCJ3aW5kb3c6cGVuZGluZ1JlY29tbWVuZGF0aW9uc1wiXG4gKiAgICAgLSBcInJlc3BvbnNlOkdFVCAvYXBpL3N0YXR1cy50YWdsaW5lX292ZXJyaWRlXCJcbiAqICAgICAtIFwicmVzcG9uc2U6R0VUIC9hcGkvc3RhdHVzLmRlY2lzaW9uc19jb25maXJtZWRcIlxuICogICB3cml0ZXM6IFtcImRvbTojdGFnbGluZS1yZXZpZXctY29udGFpbmVyXCJdXG4gKiAgIG5vdGVzOiBcIlJlbmRlcnMgcHJvcG9zZWQgdGFnbGluZSAoZnJvbSBMTE0gY3VzdG9taXphdGlvbnMpIHdpdGggYW4gZWRpdGFibGUgaW5wdXQgYW5kIGNvbmZpcm0gYnV0dG9uLlwiXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkVGFnbGluZVJldmlld1NlY3Rpb24oKSB7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWdsaW5lLXJldmlldy1jb250YWluZXInKTtcbiAgaWYgKCFjb250YWluZXIpIHJldHVybjtcblxuICAvLyBGZXRjaCBjdXJyZW50IHN0YXR1cyB0byBnZXQgdGFnbGluZV9vdmVycmlkZSArIHByb3Bvc2VkIHRhZ2xpbmVcbiAgbGV0IHByb3Bvc2VkVGFnbGluZSAgPSAnJztcbiAgbGV0IGNvbmZpcm1lZFRhZ2xpbmUgPSAnJztcbiAgbGV0IGFscmVhZHlDb25maXJtZWQgPSBmYWxzZTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgICA9IGF3YWl0IGZldGNoKCcvYXBpL3N0YXR1cycpO1xuICAgIGNvbnN0IHN0YXR1cyA9IHJlcy5vayA/IGF3YWl0IHJlcy5qc29uKCkgOiB7fTtcblxuICAgIC8vIHRhZ2xpbmVfb3ZlcnJpZGUgaXMgdGhlIHVzZXItY29uZmlybWVkIHZhbHVlIChtYXkgYmUgbnVsbClcbiAgICBjb25maXJtZWRUYWdsaW5lID0gc3RhdHVzLnRhZ2xpbmVfb3ZlcnJpZGUgfHwgJyc7XG4gICAgYWxyZWFkeUNvbmZpcm1lZCA9ICEhKHN0YXR1cy5kZWNpc2lvbnNfY29uZmlybWVkICYmIHN0YXR1cy5kZWNpc2lvbnNfY29uZmlybWVkLnRhZ2xpbmUpO1xuXG4gICAgLy8gUHJvcG9zZWQgdGFnbGluZSBmcm9tIHRoZSBMTE0gcmVjb21tZW5kYXRpb25zXG4gICAgY29uc3QgY3VzdG9taXphdGlvbnMgPSBzdGF0dXMuY3VzdG9taXphdGlvbnMgfHwge307XG4gICAgcHJvcG9zZWRUYWdsaW5lID0gY3VzdG9taXphdGlvbnMuYXBwbGljYW50X3RhZ2xpbmUgfHwgJyc7XG4gIH0gY2F0Y2ggKF9lKSB7XG4gICAgLy8gTmV0d29yayBmYWlsdXJlIFx1MjAxNCBsZWF2ZSBmaWVsZHMgZW1wdHksIHVzZXIgY2FuIHN0aWxsIHR5cGUgbWFudWFsbHlcbiAgfVxuXG4gIGNvbnN0IGluaXRpYWwgICA9IGNvbmZpcm1lZFRhZ2xpbmUgfHwgcHJvcG9zZWRUYWdsaW5lO1xuICBjb25zdCBzdGF0dXNNc2cgPSBhbHJlYWR5Q29uZmlybWVkXG4gICAgPyAnPHNwYW4gc3R5bGU9XCJjb2xvcjojMDY1ZjQ2O2ZvbnQtd2VpZ2h0OjYwMDtcIj5cdTI3MTMgQ29uZmlybWVkPC9zcGFuPidcbiAgICA6ICc8c3BhbiBzdHlsZT1cImNvbG9yOiM5MjQwMGU7XCI+UmVxdWlyZXMgeW91ciBjb25maXJtYXRpb24gYmVmb3JlIGdlbmVyYXRpbmc8L3NwYW4+JztcblxuICBjb250YWluZXIuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE2cHg7XCI+XG4gICAgICA8cCBzdHlsZT1cImNvbG9yOiMzNzQxNTE7Zm9udC1zaXplOjAuOTVlbTtsaW5lLWhlaWdodDoxLjY7bWFyZ2luOjAgMCA4cHg7XCI+XG4gICAgICAgIFRoZSA8c3Ryb25nPnRhZ2xpbmU8L3N0cm9uZz4gYXBwZWFycyBkaXJlY3RseSB1bmRlciB5b3VyIG5hbWUgb24gdGhlIENWLlxuICAgICAgICBJdCBzaG91bGQgZGVzY3JpYmUgPGVtPndobyB5b3UgYXJlPC9lbT4gYXMgYSBwcm9mZXNzaW9uYWwgXHUyMDE0IG5vdCB0aGUgam9iIHRpdGxlIHlvdSBhcmUgYXBwbHlpbmcgZm9yLlxuICAgICAgPC9wPlxuICAgICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO2ZvbnQtc2l6ZTowLjg1ZW07bWFyZ2luOjA7XCI+XG4gICAgICAgIEV4YW1wbGU6IDxlbT5cIlNlbmlvciBEYXRhIFNjaWVudGlzdCBzcGVjaWFsaXNpbmcgaW4gYmlvc3RhdGlzdGljcyBhbmQgbWFjaGluZSBsZWFybmluZ1wiPC9lbT5cbiAgICAgIDwvcD5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgc3R5bGU9XCJib3JkZXI6MXB4IHNvbGlkICNkMWZhZTU7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzoxNnB4O21hcmdpbi1ib3R0b206MjBweDtiYWNrZ3JvdW5kOiNmMGZkZjQ7XCI+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6OHB4O21hcmdpbi1ib3R0b206MTBweDtcIj5cbiAgICAgICAgPHN0cm9uZyBzdHlsZT1cImNvbG9yOiMwNjVmNDY7XCI+QXBwbGljYW50IFRhZ2xpbmU8L3N0cm9uZz5cbiAgICAgICAgPHNwYW4gaWQ9XCJ0YWdsaW5lLWNvbmZpcm0tc3RhdHVzXCIgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO1wiPiR7c3RhdHVzTXNnfTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8bGFiZWwgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjojMzc0MTUxO2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWJvdHRvbTo0cHg7XCJcbiAgICAgICAgICAgICBmb3I9XCJ0YWdsaW5lLWlucHV0XCI+XG4gICAgICAgIEVkaXQgdGFnbGluZSAocmVxdWlyZWQpOlxuICAgICAgPC9sYWJlbD5cbiAgICAgIDxpbnB1dCBpZD1cInRhZ2xpbmUtaW5wdXRcIiB0eXBlPVwidGV4dFwiXG4gICAgICAgIHZhbHVlPVwiJHtlc2NhcGVIdG1sKGluaXRpYWwpfVwiXG4gICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBTZW5pb3IgRGF0YSBTY2llbnRpc3Qgc3BlY2lhbGlzaW5nIGluIGJpb3N0YXRpc3RpY3MgYW5kIE1MXCJcbiAgICAgICAgc3R5bGU9XCJ3aWR0aDoxMDAlO2JveC1zaXppbmc6Ym9yZGVyLWJveDtwYWRkaW5nOjhweCAxMHB4O2JvcmRlcjoxcHggc29saWQgI2QxZDVkYjtib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6MC45NWVtO1wiXG4gICAgICAgIG9uaW5wdXQ9XCJvblRhZ2xpbmVJbnB1dENoYW5nZSgpXCIgLz5cblxuICAgICAgJHtwcm9wb3NlZFRhZ2xpbmUgJiYgcHJvcG9zZWRUYWdsaW5lICE9PSBjb25maXJtZWRUYWdsaW5lID8gYFxuICAgICAgPHAgc3R5bGU9XCJtYXJnaW46NnB4IDAgMDtmb250LXNpemU6MC44ZW07Y29sb3I6IzZiNzI4MDtcIj5cbiAgICAgICAgQUkgcHJvcG9zZWQ6IDxlbT4ke2VzY2FwZUh0bWwocHJvcG9zZWRUYWdsaW5lKX08L2VtPlxuICAgICAgICA8YnV0dG9uIG9uY2xpY2s9XCJyZXNldFRhZ2xpbmVUb1Byb3Bvc2VkKClcIiBzdHlsZT1cImJhY2tncm91bmQ6bm9uZTtib3JkZXI6bm9uZTtjdXJzb3I6cG9pbnRlcjtjb2xvcjojMjU2M2ViO2ZvbnQtc2l6ZTowLjhlbTtwYWRkaW5nOjAgNHB4O3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7XCI+VXNlIHRoaXM8L2J1dHRvbj5cbiAgICAgIDwvcD5gIDogJyd9XG5cbiAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOjEycHg7XCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJ0YWdsaW5lLWNvbmZpcm0tYnRuXCIgY2xhc3M9XCJzdWJtaXQtYnRuXCIgc3R5bGU9XCJmb250LXNpemU6MC45ZW07cGFkZGluZzo4cHggMjBweDtiYWNrZ3JvdW5kOiMxMGI5ODE7XCJcbiAgICAgICAgICBvbmNsaWNrPVwiY29uZmlybVRhZ2xpbmUoKVwiPlxuICAgICAgICAgIFx1MjcxMyBDb25maXJtIFRhZ2xpbmVcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgICR7YWxyZWFkeUNvbmZpcm1lZCA/ICc8c3BhbiBpZD1cInRhZ2xpbmUtY29uZmlybWVkLWJhZGdlXCIgc3R5bGU9XCJtYXJnaW4tbGVmdDoxMHB4O2ZvbnQtc2l6ZTowLjg1ZW07Y29sb3I6IzA2NWY0NjtcIj5TYXZlZCBcdTI3MTM8L3NwYW4+JyA6ICc8c3BhbiBpZD1cInRhZ2xpbmUtY29uZmlybWVkLWJhZGdlXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7bWFyZ2luLWxlZnQ6MTBweDtmb250LXNpemU6MC44NWVtO2NvbG9yOiMwNjVmNDY7XCI+U2F2ZWQgXHUyNzEzPC9zcGFuPid9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJuYXYtYnV0dG9uc1wiIHN0eWxlPVwibWFyZ2luLXRvcDoxNnB4O1wiPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImJhY2stYnRuXCIgb25jbGljaz1cInN3aXRjaFRhYignYWNoaWV2ZW1lbnRzLXJldmlldycpXCI+XHUyMTkwIEJhY2sgdG8gQWNoaWV2ZW1lbnRzPC9idXR0b24+XG4gICAgICA8YnV0dG9uIGlkPVwidGFnbGluZS1jb250aW51ZS1idG5cIiBjbGFzcz1cImNvbnRpbnVlLWJ0blwiXG4gICAgICAgIHN0eWxlPVwiJHthbHJlYWR5Q29uZmlybWVkID8gJycgOiAnb3BhY2l0eTowLjU7Y3Vyc29yOm5vdC1hbGxvd2VkOyd9XCJcbiAgICAgICAgb25jbGljaz1cInRhZ2xpbmVDb250aW51ZSgpXCJcbiAgICAgICAgJHthbHJlYWR5Q29uZmlybWVkID8gJycgOiAndGl0bGU9XCJQbGVhc2UgY29uZmlybSB0aGUgdGFnbGluZSBiZWZvcmUgY29udGludWluZ1wiJ30+XG4gICAgICAgIENvbnRpbnVlIHRvIFN1bW1hcnkgXHUyMTkyXG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5gO1xuXG4gIC8vIEV4cG9zZSBwcm9wb3NlZCB0YWdsaW5lIGZvciB0aGUgcmVzZXQgYnV0dG9uXG4gIHdpbmRvdy5fcHJvcG9zZWRUYWdsaW5lID0gcHJvcG9zZWRUYWdsaW5lO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgSW5wdXQgY2hhbmdlIGhhbmRsZXIgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIG9uVGFnbGluZUlucHV0Q2hhbmdlKCkge1xuICAvLyBXaGVuIHVzZXIgZWRpdHMgdGhlIHRleHQsIHVuLWNvbmZpcm0gdGhlIHByZXZpb3VzIHNhdmUgc28gdGhleSBtdXN0IHJlLWNvbmZpcm1cbiAgY29uc3QgYmFkZ2UgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWdsaW5lLWNvbmZpcm1lZC1iYWRnZScpO1xuICBjb25zdCBzdGF0dXNTcGFuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhZ2xpbmUtY29uZmlybS1zdGF0dXMnKTtcbiAgaWYgKGJhZGdlKSAgICAgIGJhZGdlLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIGlmIChzdGF0dXNTcGFuKSBzdGF0dXNTcGFuLmlubmVySFRNTCA9ICc8c3BhbiBzdHlsZT1cImNvbG9yOiM5MjQwMGU7XCI+UmVxdWlyZXMgeW91ciBjb25maXJtYXRpb24gYmVmb3JlIGdlbmVyYXRpbmc8L3NwYW4+JztcbiAgY29uc3QgY29udGludWVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFnbGluZS1jb250aW51ZS1idG4nKTtcbiAgaWYgKGNvbnRpbnVlQnRuKSB7XG4gICAgY29udGludWVCdG4uc3R5bGUub3BhY2l0eSAgICAgICA9ICcwLjUnO1xuICAgIGNvbnRpbnVlQnRuLnN0eWxlLmN1cnNvciAgICAgICAgPSAnbm90LWFsbG93ZWQnO1xuICAgIGNvbnRpbnVlQnRuLnRpdGxlICAgICAgICAgICAgICAgPSAnUGxlYXNlIGNvbmZpcm0gdGhlIHRhZ2xpbmUgYmVmb3JlIGNvbnRpbnVpbmcnO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBSZXNldCB0byBBSS1wcm9wb3NlZCB0YWdsaW5lIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiByZXNldFRhZ2xpbmVUb1Byb3Bvc2VkKCkge1xuICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWdsaW5lLWlucHV0Jyk7XG4gIGlmIChpbnB1dCAmJiB3aW5kb3cuX3Byb3Bvc2VkVGFnbGluZSkge1xuICAgIGlucHV0LnZhbHVlID0gd2luZG93Ll9wcm9wb3NlZFRhZ2xpbmU7XG4gICAgb25UYWdsaW5lSW5wdXRDaGFuZ2UoKTtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgQ29uZmlybSBhbmQgcGVyc2lzdCB0YWdsaW5lIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4vKipcbiAqIGR1Y2tmbG93OlxuICogICBpZDogdGFnbGluZV91aV9jb25maXJtXG4gKiAgIGtpbmQ6IHVpXG4gKiAgIHRpbWVzdGFtcDogXCIyMDI2LTA1LTI4VDAwOjAwOjAwWlwiXG4gKiAgIHN0YXR1czogbGl2ZVxuICogICBoYW5kbGVzOiBbXCJ1aTp0YWdsaW5lLXJldmlldy5jb25maXJtXCJdXG4gKiAgIGNhbGxzOiBbXCJQT1NUIC9hcGkvcmV2aWV3LWRlY2lzaW9uc1wiXVxuICogICByZWFkczogW1wiZG9tOiN0YWdsaW5lLWlucHV0XCJdXG4gKiAgIHdyaXRlczpcbiAqICAgICAtIFwicmVxdWVzdDpQT1NUIC9hcGkvcmV2aWV3LWRlY2lzaW9ucy50eXBlPXRhZ2xpbmVcIlxuICogICAgIC0gXCJyZXF1ZXN0OlBPU1QgL2FwaS9yZXZpZXctZGVjaXNpb25zLmRlY2lzaW9uc1wiXG4gKiAgIG5vdGVzOiBcIlBPU1RzIHRoZSBjb25maXJtZWQgdGFnbGluZSB0ZXh0OyBlbmFibGVzIHRoZSBjb250aW51ZSBidXR0b24gb24gc3VjY2Vzcy5cIlxuICovXG5hc3luYyBmdW5jdGlvbiBjb25maXJtVGFnbGluZSgpIHtcbiAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFnbGluZS1pbnB1dCcpO1xuICBpZiAoIWlucHV0KSByZXR1cm47XG5cbiAgY29uc3QgdGFnbGluZVRleHQgPSBpbnB1dC52YWx1ZS50cmltKCk7XG4gIGlmICghdGFnbGluZVRleHQpIHtcbiAgICBzaG93VG9hc3QoJ1BsZWFzZSBlbnRlciBhIHRhZ2xpbmUgYmVmb3JlIGNvbmZpcm1pbmcuJywgJ2Vycm9yJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhZ2xpbmUtY29uZmlybS1idG4nKTtcbiAgaWYgKGJ0bikgYnRuLmRpc2FibGVkID0gdHJ1ZTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvcmV2aWV3LWRlY2lzaW9ucycsIHtcbiAgICAgIG1ldGhvZDogICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogICAgSlNPTi5zdHJpbmdpZnkoeyB0eXBlOiAndGFnbGluZScsIGRlY2lzaW9uczogdGFnbGluZVRleHQgfSksXG4gICAgfSk7XG5cbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICBjb25zdCBlcnIgPSBhd2FpdCByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSk7XG4gICAgICBzaG93VG9hc3QoYEZhaWxlZCB0byBzYXZlIHRhZ2xpbmU6ICR7ZXJyLmVycm9yIHx8IHJlc3BvbnNlLnN0YXR1c1RleHR9YCwgJ2Vycm9yJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIFVJIHRvIHNob3cgY29uZmlybWVkIHN0YXRlXG4gICAgY29uc3QgYmFkZ2UgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWdsaW5lLWNvbmZpcm1lZC1iYWRnZScpO1xuICAgIGNvbnN0IHN0YXR1c1NwYW4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFnbGluZS1jb25maXJtLXN0YXR1cycpO1xuICAgIGlmIChiYWRnZSkgICAgICB7IGJhZGdlLnN0eWxlLmRpc3BsYXkgPSAnJzsgfVxuICAgIGlmIChzdGF0dXNTcGFuKSB7IHN0YXR1c1NwYW4uaW5uZXJIVE1MID0gJzxzcGFuIHN0eWxlPVwiY29sb3I6IzA2NWY0Njtmb250LXdlaWdodDo2MDA7XCI+XHUyNzEzIENvbmZpcm1lZDwvc3Bhbj4nOyB9XG5cbiAgICBjb25zdCBjb250aW51ZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWdsaW5lLWNvbnRpbnVlLWJ0bicpO1xuICAgIGlmIChjb250aW51ZUJ0bikge1xuICAgICAgY29udGludWVCdG4uc3R5bGUub3BhY2l0eSA9ICcnO1xuICAgICAgY29udGludWVCdG4uc3R5bGUuY3Vyc29yICA9ICcnO1xuICAgICAgY29udGludWVCdG4udGl0bGUgICAgICAgICA9ICcnO1xuICAgIH1cblxuICAgIHN0YXRlTWFuYWdlci5tYXJrQ29udGVudENoYW5nZWQoKTtcbiAgICBzaG93VG9hc3QoJ1RhZ2xpbmUgY29uZmlybWVkLicpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgc2hvd1RvYXN0KCdOZXR3b3JrIGVycm9yIHNhdmluZyB0YWdsaW5lLicsICdlcnJvcicpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChidG4pIGJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBDb250aW51ZSBuYXZpZ2F0aW9uIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiB0YWdsaW5lQ29udGludWUoKSB7XG4gIC8vIEd1YXJkOiBtdXN0IGJlIGNvbmZpcm1lZCBiZWZvcmUgcHJvY2VlZGluZ1xuICBjb25zdCBjb250aW51ZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWdsaW5lLWNvbnRpbnVlLWJ0bicpO1xuICBpZiAoY29udGludWVCdG4gJiYgY29udGludWVCdG4uc3R5bGUuY3Vyc29yID09PSAnbm90LWFsbG93ZWQnKSB7XG4gICAgc2hvd1RvYXN0KCdQbGVhc2UgY29uZmlybSB0aGUgdGFnbGluZSBiZWZvcmUgY29udGludWluZy4nLCAnZXJyb3InKTtcbiAgICByZXR1cm47XG4gIH1cbiAgc3dpdGNoVGFiKCdzdW1tYXJ5LXJldmlldycpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgRXhwb3J0cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZXhwb3J0IHtcbiAgYnVpbGRUYWdsaW5lUmV2aWV3U2VjdGlvbixcbiAgb25UYWdsaW5lSW5wdXRDaGFuZ2UsXG4gIHJlc2V0VGFnbGluZVRvUHJvcG9zZWQsXG4gIGNvbmZpcm1UYWdsaW5lLFxuICB0YWdsaW5lQ29udGludWUsXG59O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvc3VtbWFyeS1yZXZpZXcuanNcbiAqIFN1bW1hcnktZm9jdXMgc2VsZWN0aW9uOiBBSSBnZW5lcmF0aW9uLCBzdG9yZWQgdmFyaWFudHMsIHN1Ym1pdCBkZWNpc2lvbi5cbiAqXG4gKiBEZXBlbmRlbmNpZXMgKHJlc29sdmVkIHRocm91Z2ggZ2xvYmFsVGhpcyBhdCBydW50aW1lKTpcbiAqICAgcGVuZGluZ1JlY29tbWVuZGF0aW9ucywgc2VsZWN0ZWRTdW1tYXJ5S2V5LCBfYWlHZW5lcmF0ZWRTdW1tYXJ5LFxuICogICBlc2NhcGVIdG1sLCBzaG93VG9hc3QsIHN3aXRjaFRhYiwgc2V0TG9hZGluZywgc2NoZWR1bGVBdHNSZWZyZXNoXG4gKi9cblxuaW1wb3J0IHsgc3RhdGVNYW5hZ2VyIH0gZnJvbSAnLi9zdGF0ZS1tYW5hZ2VyLmpzJztcblxuLy8gXHUyNTAwXHUyNTAwIEJ1aWxkIHN1bW1hcnktZm9jdXMgc2VjdGlvbiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLyoqXG4gKiBkdWNrZmxvdzpcbiAqICAgaWQ6IHN1bW1hcnlfdWlfYnVpbGRcbiAqICAga2luZDogdWlcbiAqICAgdGltZXN0YW1wOiBcIjIwMjYtMDMtMjdUMDE6MjM6MjhaXCJcbiAqICAgc3RhdHVzOiBzaGFyZWRcbiAqICAgaGFuZGxlczogW1widWk6c3VtbWFyeS1yZXZpZXcuYnVpbGRcIl1cbiAqICAgY2FsbHM6IFtcIkdFVCAvYXBpL21hc3Rlci1maWVsZHNcIiwgXCJHRVQgL2FwaS9zdGF0dXNcIiwgXCJ1aTpzdW1tYXJ5LXJldmlldy5nZW5lcmF0ZVwiXVxuICogICByZWFkczpcbiAqICAgICAtIFwid2luZG93OnBlbmRpbmdSZWNvbW1lbmRhdGlvbnNcIlxuICogICAgIC0gXCJyZXNwb25zZTpHRVQgL2FwaS9tYXN0ZXItZmllbGRzLnByb2Zlc3Npb25hbF9zdW1tYXJpZXNcIlxuICogICAgIC0gXCJyZXNwb25zZTpHRVQgL2FwaS9zdGF0dXMucHJvZmVzc2lvbmFsX3N1bW1hcmllc1wiXG4gKiAgICAgLSBcInN0YXRlOnNlc3Npb25fc3VtbWFyaWVzLmFpX2dlbmVyYXRlZFwiXG4gKiAgIHdyaXRlczogW1wiZG9tOiNzdW1tYXJ5LWZvY3VzLWNvbnRhaW5lclwiLCBcIndpbmRvdzpzZWxlY3RlZFN1bW1hcnlLZXlcIl1cbiAqICAgbm90ZXM6IFwiQnVpbGRzIHRoZSBzdW1tYXJ5IHJldmlldyBVSSBmcm9tIG1hc3RlciB2YXJpYW50cyBwbHVzIHNlc3Npb24gb3ZlcnJpZGVzIGFuZCBzZWVkcyB0aGUgc2VsZWN0ZWQga2V5LlwiXG4gKi9cblxuYXN5bmMgZnVuY3Rpb24gYnVpbGRTdW1tYXJ5Rm9jdXNTZWN0aW9uKCkge1xuICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3VtbWFyeS1mb2N1cy1jb250YWluZXInKTtcbiAgaWYgKCFjb250YWluZXIpIHJldHVybjtcblxuICBjb25zdCBkYXRhID0gd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnM7XG5cbiAgLy8gXHUyNTAwXHUyNTAwIExvYWQgYWxsIGtub3duIHN1bW1hcmllcyAobWFzdGVyIGJhc2UgKyBzZXNzaW9uIG92ZXJyaWRlcykgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIC8vIEZldGNoIG1hc3RlciBmaWVsZHMgYW5kIHN0YXR1cyBpbiBwYXJhbGxlbDsgc2Vzc2lvbiBzdW1tYXJpZXMgb3ZlcndyaXRlIG1hc3RlciB2YXJpYW50cy5cbiAgbGV0IHByb2Zlc3Npb25hbFN1bW1hcmllcyA9IHt9O1xuICBjb25zdCBbbWZSZXN1bHQsIHN0YXR1c1Jlc3VsdF0gPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoW1xuICAgIGZldGNoKCcvYXBpL21hc3Rlci1maWVsZHMnKS50aGVuKHIgPT4gci5qc29uKCkpLFxuICAgIGZldGNoKCcvYXBpL3N0YXR1cycpLnRoZW4ociA9PiByLmpzb24oKSksXG4gIF0pO1xuICBpZiAobWZSZXN1bHQuc3RhdHVzID09PSAnZnVsZmlsbGVkJyAmJiBtZlJlc3VsdC52YWx1ZSAmJiBtZlJlc3VsdC52YWx1ZS5vaykge1xuICAgIE9iamVjdC5hc3NpZ24ocHJvZmVzc2lvbmFsU3VtbWFyaWVzLCBtZlJlc3VsdC52YWx1ZS5wcm9mZXNzaW9uYWxfc3VtbWFyaWVzIHx8IHt9KTtcbiAgfVxuICBpZiAoc3RhdHVzUmVzdWx0LnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcgJiYgc3RhdHVzUmVzdWx0LnZhbHVlKSB7XG4gICAgLy8gU2Vzc2lvbiBzdW1tYXJpZXMgKGUuZy4gYWlfZ2VuZXJhdGVkKSBvdmVyd3JpdGUgbWFzdGVyIHZhcmlhbnRzXG4gICAgT2JqZWN0LmFzc2lnbihwcm9mZXNzaW9uYWxTdW1tYXJpZXMsIHN0YXR1c1Jlc3VsdC52YWx1ZS5wcm9mZXNzaW9uYWxfc3VtbWFyaWVzIHx8IHt9KTtcbiAgfVxuXG4gIC8vIFx1MjUwMFx1MjUwMCBTdWdnZXN0ZWQgY29udGVudCByZW9yZGVyaW5nIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICBjb25zdCByZW9yZGVyaW5nVGV4dCA9IChkYXRhICYmIGRhdGEuc3VnZ2VzdGVkX2NvbnRlbnRfcmVvcmRlcmluZykgfHwgJyc7XG4gIGNvbnN0IHJlb3JkZXJpbmdIVE1MID0gcmVvcmRlcmluZ1RleHRcbiAgICA/IGA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZWZmNmZmO2JvcmRlcjoxcHggc29saWQgI2JmZGJmZTtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjEycHg7bWFyZ2luLWJvdHRvbToxNnB4O1wiPlxuICAgICAgICA8c3Ryb25nIHN0eWxlPVwiY29sb3I6IzFlNDBhZjtcIj5cdUQ4M0RcdURDQ0IgU3VnZ2VzdGVkIENvbnRlbnQgT3JkZXI6PC9zdHJvbmc+XG4gICAgICAgIDxwIHN0eWxlPVwibWFyZ2luOjZweCAwIDA7Y29sb3I6IzFlM2E4YTtmb250LXNpemU6MC45ZW07d2hpdGUtc3BhY2U6cHJlLWxpbmU7XCI+JHtlc2NhcGVIdG1sKHJlb3JkZXJpbmdUZXh0KX08L3A+XG4gICAgICAgPC9kaXY+YFxuICAgIDogJyc7XG5cbiAgLy8gXHUyNTAwXHUyNTAwIFJlbmRlciBza2VsZXRvbiB3aGlsZSB3ZSBnZW5lcmF0ZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgY29udGFpbmVyLmlubmVySFRNTCA9IGBcbiAgICAke3Jlb3JkZXJpbmdIVE1MfVxuICAgIDxkaXYgaWQ9XCJhaS1zdW1tYXJ5LXBhbmVsXCIgc3R5bGU9XCJib3JkZXI6MXB4IHNvbGlkICNkMWZhZTU7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzoxNnB4O21hcmdpbi1ib3R0b206MjBweDtiYWNrZ3JvdW5kOiNmMGZkZjQ7XCI+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6OHB4O21hcmdpbi1ib3R0b206MTBweDtcIj5cbiAgICAgICAgPHN0cm9uZyBzdHlsZT1cImNvbG9yOiMwNjVmNDY7XCI+XHVEODNFXHVERDE2IEFJLVByb3Bvc2VkIFN1bW1hcnk8L3N0cm9uZz5cbiAgICAgICAgPHNwYW4gaWQ9XCJhaS1zdW1tYXJ5LXN0YXR1c1wiIHN0eWxlPVwiZm9udC1zaXplOjAuOGVtO2NvbG9yOiM2YjcyODA7XCI+R2VuZXJhdGluZ1x1MjAyNjwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBpZD1cImFpLXN1bW1hcnktbG9hZGluZ1wiIHN0eWxlPVwiZm9udC1zaXplOjAuOWVtO2NvbG9yOiM5Y2EzYWY7bWluLWhlaWdodDo0MHB4O1wiPjxlbT5HZW5lcmF0aW5nIGEgdGFpbG9yZWQgc3VtbWFyeSBmb3IgdGhpcyBhcHBsaWNhdGlvblx1MjAyNjwvZW0+PC9kaXY+XG4gICAgICA8dGV4dGFyZWEgaWQ9XCJhaS1zdW1tYXJ5LXRleHRcIiByb3dzPVwiN1wiIG9uaW5wdXQ9XCJvblN1bW1hcnlUZXh0Q2hhbmdlKClcIlxuICAgICAgICBwbGFjZWhvbGRlcj1cIkdlbmVyYXRpbmdcdTIwMjZcIlxuICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Ym94LXNpemluZzpib3JkZXItYm94O3BhZGRpbmc6OHB4O2JvcmRlcjoxcHggc29saWQgI2QxZDVkYjtib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6MC45ZW07bGluZS1oZWlnaHQ6MS42O3Jlc2l6ZTp2ZXJ0aWNhbDtkaXNwbGF5Om5vbmU7XCI+PC90ZXh0YXJlYT5cbiAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOjEycHg7XCI+XG4gICAgICAgIDxsYWJlbCBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOiMzNzQxNTE7ZGlzcGxheTpibG9jazttYXJnaW4tYm90dG9tOjRweDtcIj5SZXF1ZXN0IGNoYW5nZXMgKG9wdGlvbmFsKTo8L2xhYmVsPlxuICAgICAgICA8dGV4dGFyZWEgaWQ9XCJzdW1tYXJ5LXJlZmluZW1lbnQtaW5wdXRcIiByb3dzPVwiMlwiXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuICdNYWtlIGl0IG1vcmUgY29uY2lzZScsICdFbXBoYXNpc2UgbXkgbGVhZGVyc2hpcCBleHBlcmllbmNlJywgJ1VzZSBhIG1vcmUgZm9ybWFsIHRvbmUnXHUyMDI2XCJcbiAgICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Ym94LXNpemluZzpib3JkZXItYm94O3BhZGRpbmc6OHB4O2JvcmRlcjoxcHggc29saWQgI2QxZDVkYjtib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6MC44NWVtO3Jlc2l6ZTp2ZXJ0aWNhbDtcIj48L3RleHRhcmVhPlxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDo4cHg7ZGlzcGxheTpmbGV4O2dhcDo4cHg7ZmxleC13cmFwOndyYXA7XCI+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImFpLXJlZ2VuZXJhdGUtYnRuXCIgY2xhc3M9XCJzdWJtaXQtYnRuXCIgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO3BhZGRpbmc6NnB4IDE0cHg7XCJcbiAgICAgICAgICAgIG9uY2xpY2s9XCJyZWdlbmVyYXRlQUlTdW1tYXJ5KClcIj5SZWdlbmVyYXRlPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInN1Ym1pdC1idG5cIiBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07cGFkZGluZzo2cHggMTRweDtiYWNrZ3JvdW5kOiMxMGI5ODE7XCJcbiAgICAgICAgICAgIG9uY2xpY2s9XCJ1c2VBSVN1bW1hcnkoKVwiPlVzZSBUaGlzIFN1bW1hcnk8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGlkPVwic3VtbWFyeS1zdG9yZWQtc2VjdGlvblwiPlxuICAgICAgPGRldGFpbHMgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjhweDtcIj5cbiAgICAgICAgPHN1bW1hcnkgc3R5bGU9XCJjdXJzb3I6cG9pbnRlcjtmb250LXNpemU6MC44NWVtO2NvbG9yOiM2YjcyODA7dXNlci1zZWxlY3Q6bm9uZTtcIj5cbiAgICAgICAgICBVc2UgYSBzdG9yZWQgc3VtbWFyeSB2YXJpYW50IGluc3RlYWRcbiAgICAgICAgPC9zdW1tYXJ5PlxuICAgICAgICA8ZGl2IGlkPVwic3VtbWFyeS1yYWRpb3NcIiBzdHlsZT1cIm1hcmdpbi10b3A6MTBweDtcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6OHB4O1wiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzdWJtaXQtYnRuXCIgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO3BhZGRpbmc6NnB4IDE0cHg7XCJcbiAgICAgICAgICAgIG9uY2xpY2s9XCJzdWJtaXRTdW1tYXJ5Rm9jdXNEZWNpc2lvbigpXCI+VXNlIFNlbGVjdGVkIFN0b3JlZCBTdW1tYXJ5PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kZXRhaWxzPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJuYXYtYnV0dG9uc1wiIHN0eWxlPVwibWFyZ2luLXRvcDoxNnB4O1wiPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImJhY2stYnRuXCIgb25jbGljaz1cInN3aXRjaFRhYigndGFnbGluZS1yZXZpZXcnKVwiPlx1MjE5MCBCYWNrIHRvIFRhZ2xpbmU8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJjb250aW51ZS1idG5cIiBvbmNsaWNrPVwic3VibWl0U3VtbWFyeUZvY3VzRGVjaXNpb24oKVwiPkNvbnRpbnVlIHRvIFB1YmxpY2F0aW9ucyBcdTIxOTI8L2J1dHRvbj5cbiAgICA8L2Rpdj5gO1xuXG4gIC8vIFJlbmRlciBzdG9yZWQgc3VtbWFyaWVzIGluIHRoZSBjb2xsYXBzaWJsZSBzZWN0aW9uXG4gIF9yZW5kZXJTdG9yZWRTdW1tYXJ5UmFkaW9zKHByb2Zlc3Npb25hbFN1bW1hcmllcyk7XG5cbiAgLy8gXHUyNTAwXHUyNTAwIEF1dG8tZ2VuZXJhdGUgb3IgbG9hZCBjYWNoZWQgQUkgc3VtbWFyeSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgY29uc3QgY2FjaGVkU3VtbWFyeSA9IHByb2Zlc3Npb25hbFN1bW1hcmllc1snYWlfZ2VuZXJhdGVkJ10gfHwgJyc7XG4gIGlmIChjYWNoZWRTdW1tYXJ5KSB7XG4gICAgX3Nob3dBSVN1bW1hcnkoY2FjaGVkU3VtbWFyeSwgJyhjYWNoZWQgXHUyMDE0IGNsaWNrIFJlZ2VuZXJhdGUgdG8gcmVmcmVzaCknKTtcbiAgICB3aW5kb3cuc2VsZWN0ZWRTdW1tYXJ5S2V5ID0gJ2FpX2dlbmVyYXRlZCc7XG4gICAgYXdhaXQgc2F2ZVN1bW1hcnlGb2N1c1RvQmFja2VuZCgnYWlfZ2VuZXJhdGVkJyk7XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgX2NhbGxHZW5lcmF0ZVN1bW1hcnkobnVsbCwgbnVsbCk7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIFJlbmRlciBzdG9yZWQgc3VtbWFyeSByYWRpbyBidXR0b25zIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBfcmVuZGVyU3RvcmVkU3VtbWFyeVJhZGlvcyhwcm9mZXNzaW9uYWxTdW1tYXJpZXMpIHtcbiAgY29uc3QgcmFkaW9zQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1bW1hcnktcmFkaW9zJyk7XG4gIGlmICghcmFkaW9zQ29udGFpbmVyKSByZXR1cm47XG4gIGNvbnN0IG1hc3RlcktleXMgPSBPYmplY3Qua2V5cyhwcm9mZXNzaW9uYWxTdW1tYXJpZXMpLmZpbHRlcihrID0+IGsgIT09ICdhaV9nZW5lcmF0ZWQnKTtcbiAgaWYgKG1hc3RlcktleXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmFkaW9zQ29udGFpbmVyLmlubmVySFRNTCA9ICc8cCBzdHlsZT1cImNvbG9yOiM5Y2EzYWY7Zm9udC1zaXplOjAuODVlbTtcIj5ObyBzdG9yZWQgc3VtbWFyaWVzIGF2YWlsYWJsZS48L3A+JztcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgY3VycmVudEtleSA9IHdpbmRvdy5zZWxlY3RlZFN1bW1hcnlLZXkgfHwgJyc7XG4gIHJhZGlvc0NvbnRhaW5lci5pbm5lckhUTUwgPSBtYXN0ZXJLZXlzLm1hcChrZXkgPT4ge1xuICAgIGNvbnN0IHByZXZpZXcgPSAocHJvZmVzc2lvbmFsU3VtbWFyaWVzW2tleV0gfHwgJycpLnNsaWNlKDAsIDIwMCk7XG4gICAgY29uc3QgbGFiZWwgPSBrZXkucmVwbGFjZSgvXy9nLCAnICcpLnJlcGxhY2UoL1xcYlxcdy9nLCBjID0+IGMudG9VcHBlckNhc2UoKSk7XG4gICAgY29uc3QgY2hlY2tlZCA9IGtleSA9PT0gY3VycmVudEtleSA/ICdjaGVja2VkJyA6ICcnO1xuICAgIHJldHVybiBgXG4gICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2JvcmRlcjoxcHggc29saWQgI2U1ZTdlYjtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjEycHg7bWFyZ2luLWJvdHRvbTo4cHg7Y3Vyc29yOnBvaW50ZXI7JHtjaGVja2VkID8gJ2JvcmRlci1jb2xvcjojMTBiOTgxO2JhY2tncm91bmQ6I2YwZmRmNDsnIDogJyd9XCI+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwic3VtbWFyeV9rZXlcIiB2YWx1ZT1cIiR7ZXNjYXBlSHRtbChrZXkpfVwiICR7Y2hlY2tlZH1cbiAgICAgICAgICBvbmNoYW5nZT1cInNlbGVjdFN1bW1hcnlLZXkoJyR7ZXNjYXBlSHRtbChrZXkpfScpXCIgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6OHB4O1wiPlxuICAgICAgICA8c3Ryb25nPiR7ZXNjYXBlSHRtbChsYWJlbCl9PC9zdHJvbmc+IDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjAuNzVlbTtwYWRkaW5nOjFweCA2cHg7Ym9yZGVyLXJhZGl1czo5OTlweDtiYWNrZ3JvdW5kOiNlZmY2ZmY7Y29sb3I6IzFkNGVkODtib3JkZXI6MXB4IHNvbGlkICNiZmRiZmU7Zm9udC13ZWlnaHQ6NjAwO1wiPlx1RDgzRFx1RENDNCBGcm9tIHlvdXIgTWFzdGVyIENWPC9zcGFuPlxuICAgICAgICA8cCBzdHlsZT1cIm1hcmdpbjo2cHggMCAwO2ZvbnQtc2l6ZTowLjg1ZW07Y29sb3I6IzZiNzI4MDtcIj4ke2VzY2FwZUh0bWwocHJldmlldyl9JHtwcmV2aWV3Lmxlbmd0aCA9PT0gMjAwID8gJ1x1MjAyNicgOiAnJ308L3A+XG4gICAgICA8L2xhYmVsPmA7XG4gIH0pLmpvaW4oJycpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgU2hvdyBBSS1nZW5lcmF0ZWQgc3VtbWFyeSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gX3Nob3dBSVN1bW1hcnkodGV4dCwgc3RhdHVzTGFiZWwpIHtcbiAgY29uc3QgdGV4dEVsICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FpLXN1bW1hcnktdGV4dCcpO1xuICBjb25zdCBsb2FkaW5nRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWktc3VtbWFyeS1sb2FkaW5nJyk7XG4gIGNvbnN0IHN0YXR1c0VsICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhaS1zdW1tYXJ5LXN0YXR1cycpO1xuICBpZiAodGV4dEVsKSB7XG4gICAgdGV4dEVsLnZhbHVlID0gdGV4dDtcbiAgICB0ZXh0RWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuICB9XG4gIGlmIChsb2FkaW5nRWwpIGxvYWRpbmdFbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBpZiAoc3RhdHVzRWwpICBzdGF0dXNFbC50ZXh0Q29udGVudCA9IHN0YXR1c0xhYmVsIHx8ICcnO1xuICB3aW5kb3cuX2FpR2VuZXJhdGVkU3VtbWFyeSA9IHRleHQ7XG4gIF91cGRhdGVTdW1tYXJ5U3BlY2lmaWNpdHlCYWRnZSh0ZXh0KTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFN1bW1hcnkgc3BlY2lmaWNpdHkgdmFsaWRhdG9yIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBfY2hlY2tTdW1tYXJ5U3BlY2lmaWNpdHkodGV4dCkge1xuICBpZiAoIXRleHQgfHwgIXRleHQudHJpbSgpKSByZXR1cm4gW107XG4gIGNvbnN0IHdhcm5pbmdzID0gW107XG4gIC8vIENoZWNrIDE6IHF1YW50aWZpZWQgY2xhaW0gKG51bWJlciwgcGVyY2VudGFnZSwgb3IgeWVhciByYW5nZSlcbiAgY29uc3QgaGFzUXVhbnRpZmllZCA9IC9cXGJcXGRbXFxkLF0qXFxzKiglfHBlcmNlbnR8eXJzP3x5ZWFycz98bW9udGhzP3x4XFxifFxcK3xrXFxifG1cXGJ8XFwuXFxkKS9pLnRlc3QodGV4dCkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIC9cXGJcXGQrXFwrXFxzKih5ZWFycz98eXJzP3xtb250aHM/KS9pLnRlc3QodGV4dCk7XG4gIGlmICghaGFzUXVhbnRpZmllZCkge1xuICAgIHdhcm5pbmdzLnB1c2goJ05vIHF1YW50aWZpZWQgY2xhaW0gZGV0ZWN0ZWQgKGUuZy4gXCI1KyB5ZWFyc1wiLCBcIjMwJSByZWR1Y3Rpb25cIiwgXCIkMk1cIikuIEFkZGluZyBhIG51bWJlciBzdHJlbmd0aGVucyBjcmVkaWJpbGl0eS4nKTtcbiAgfVxuICAvLyBDaGVjayAyOiB0YXJnZXQgcm9sZSBrZXl3b3JkIHByZXNlbnRcbiAgY29uc3QgYW5hbHlzaXMgPSB3aW5kb3cuX2xhc3RBbmFseXNpc0RhdGEgfHxcbiAgICAod2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnMgJiYgd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnMuam9iX2FuYWx5c2lzKSB8fCB7fTtcbiAgY29uc3Qgcm9sZVRpdGxlID0gKGFuYWx5c2lzLnRpdGxlIHx8IGFuYWx5c2lzLmpvYl90aXRsZSB8fCAnJykudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gIGlmIChyb2xlVGl0bGUgJiYgcm9sZVRpdGxlLmxlbmd0aCA+IDMpIHtcbiAgICBjb25zdCByb2xlUGFydHMgPSByb2xlVGl0bGUuc3BsaXQoL1tcXHMvLF0rLykuZmlsdGVyKHcgPT4gdy5sZW5ndGggPiAzKTtcbiAgICBjb25zdCBpblRleHQgPSByb2xlUGFydHMuc29tZShwYXJ0ID0+IHRleHQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhwYXJ0KSk7XG4gICAgaWYgKCFpblRleHQpIHtcbiAgICAgIHdhcm5pbmdzLnB1c2goYFRhcmdldCByb2xlIChcIiR7ZXNjYXBlSHRtbChyb2xlVGl0bGUpfVwiKSBub3QgbWVudGlvbmVkIFx1MjAxNCBjb25zaWRlciBlY2hvaW5nIHRoZSByb2xlIG9yIGEgc3lub255bS5gKTtcbiAgICB9XG4gIH1cbiAgLy8gQ2hlY2sgMzogZmFsbGJhY2sgZ2VuZXJpYyBwbGFjZWhvbGRlclxuICBjb25zdCBnZW5lcmljUGhyYXNlcyA9IFsnZXhwZXJpZW5jZWQgcHJvZmVzc2lvbmFsJywgJ3RyYWNrIHJlY29yZCBvZiBzdWNjZXNzJywgJ3NlZWtpbmcgYSBjaGFsbGVuZ2luZyddO1xuICBmb3IgKGNvbnN0IHBocmFzZSBvZiBnZW5lcmljUGhyYXNlcykge1xuICAgIGlmICh0ZXh0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocGhyYXNlKSkge1xuICAgICAgd2FybmluZ3MucHVzaChgR2VuZXJpYyBwbGFjZWhvbGRlciBwaHJhc2UgZGV0ZWN0ZWQgKFwiJHtwaHJhc2V9XCIpIFx1MjAxNCByZXBsYWNlIHdpdGggc3BlY2lmaWMgYWNoaWV2ZW1lbnRzLmApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gd2FybmluZ3M7XG59XG5cbmZ1bmN0aW9uIF91cGRhdGVTdW1tYXJ5U3BlY2lmaWNpdHlCYWRnZSh0ZXh0KSB7XG4gIGxldCBiYWRnZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdW1tYXJ5LXNwZWNpZmljaXR5LWJhZGdlJyk7XG4gIGlmICghYmFkZ2UpIHtcbiAgICBjb25zdCB0ZXh0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWktc3VtbWFyeS10ZXh0Jyk7XG4gICAgaWYgKCF0ZXh0RWwgfHwgIXRleHRFbC5wYXJlbnROb2RlKSByZXR1cm47XG4gICAgYmFkZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBiYWRnZS5pZCA9ICdzdW1tYXJ5LXNwZWNpZmljaXR5LWJhZGdlJztcbiAgICBiYWRnZS5zdHlsZS5jc3NUZXh0ID0gJ21hcmdpbi10b3A6NnB4O2ZvbnQtc2l6ZTowLjgyZW07JztcbiAgICB0ZXh0RWwucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYmFkZ2UsIHRleHRFbC5uZXh0U2libGluZyk7XG4gIH1cbiAgY29uc3Qgd2FybmluZ3MgPSBfY2hlY2tTdW1tYXJ5U3BlY2lmaWNpdHkodGV4dCk7XG4gIGlmICh3YXJuaW5ncy5sZW5ndGggPT09IDApIHtcbiAgICBiYWRnZS5pbm5lckhUTUwgPSAnPHNwYW4gc3R5bGU9XCJjb2xvcjojMTBiOTgxO1wiPlx1MjcxMyBTdW1tYXJ5IGhhcyBzcGVjaWZpYywgcXVhbnRpZmllZCBjb250ZW50Ljwvc3Bhbj4nO1xuICB9IGVsc2Uge1xuICAgIGJhZGdlLmlubmVySFRNTCA9IHdhcm5pbmdzLm1hcCh3ID0+XG4gICAgICBgPGRpdiBzdHlsZT1cImNvbG9yOiNiNDUzMDk7bWFyZ2luLXRvcDoycHg7XCI+XHUyNkEwICR7d308L2Rpdj5gXG4gICAgKS5qb2luKCcnKTtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgQ2FsbCBnZW5lcmF0ZS1zdW1tYXJ5IEFQSSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLyoqXG4gKiBkdWNrZmxvdzpcbiAqICAgaWQ6IHN1bW1hcnlfdWlfZ2VuZXJhdGVcbiAqICAga2luZDogdWlcbiAqICAgdGltZXN0YW1wOiBcIjIwMjYtMDMtMjdUMDE6MjM6MjhaXCJcbiAqICAgc3RhdHVzOiBzaGFyZWRcbiAqICAgaGFuZGxlczogW1widWk6c3VtbWFyeS1yZXZpZXcuZ2VuZXJhdGVcIl1cbiAqICAgY2FsbHM6IFtcIlBPU1QgL2FwaS9nZW5lcmF0ZS1zdW1tYXJ5XCIsIFwidWk6c3VtbWFyeS1yZXZpZXcucGVyc2lzdFwiXVxuICogICByZWFkczogW1wicmVzcG9uc2U6UE9TVCAvYXBpL2dlbmVyYXRlLXN1bW1hcnkuc3VtbWFyeVwiLCBcIndpbmRvdzpfYWlHZW5lcmF0ZWRTdW1tYXJ5XCJdXG4gKiAgIHdyaXRlczogW1wiZG9tOiNhaS1zdW1tYXJ5LXRleHRcIiwgXCJkb206I2FpLXN1bW1hcnktc3RhdHVzXCIsIFwid2luZG93Ol9haUdlbmVyYXRlZFN1bW1hcnlcIiwgXCJ3aW5kb3c6c2VsZWN0ZWRTdW1tYXJ5S2V5XCJdXG4gKiAgIG5vdGVzOiBcIlJlcXVlc3RzIGEgZ2VuZXJhdGVkIG9yIHJlZmluZWQgc3VtbWFyeSwgdXBkYXRlcyB0aGUgbG9jYWwgVUksIGFuZCBwZXJzaXN0cyB0aGUgc2VsZWN0ZWQgc3VtbWFyeSBrZXkuXCJcbiAqL1xuXG5hc3luYyBmdW5jdGlvbiBfY2FsbEdlbmVyYXRlU3VtbWFyeShyZWZpbmVtZW50UHJvbXB0LCBwcmV2aW91c1N1bW1hcnkpIHtcbiAgY29uc3QgYnRuICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWktcmVnZW5lcmF0ZS1idG4nKTtcbiAgY29uc3Qgc3RhdHVzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWktc3VtbWFyeS1zdGF0dXMnKTtcbiAgY29uc3QgdGV4dEVsICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWktc3VtbWFyeS10ZXh0Jyk7XG4gIGNvbnN0IGxvYWRpbmdFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhaS1zdW1tYXJ5LWxvYWRpbmcnKTtcbiAgaWYgKGJ0bikgICAgICBidG4uZGlzYWJsZWQgPSB0cnVlO1xuICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJ0dlbmVyYXRpbmdcdTIwMjYnO1xuICAvLyBTaG93IGxvYWRpbmcgaW5kaWNhdG9yOyBoaWRlIHRoZSB0ZXh0YXJlYSB3aGlsZSBnZW5lcmF0aW5nLlxuICBpZiAobG9hZGluZ0VsKSB7IGxvYWRpbmdFbC5pbm5lckhUTUwgPSAnPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjEwcHg7Y29sb3I6IzZiNzI4MDtwYWRkaW5nOjhweCAwO1wiPjxkaXYgY2xhc3M9XCJsb2FkaW5nLXNwaW5uZXJcIiBzdHlsZT1cIndpZHRoOjIwcHg7aGVpZ2h0OjIwcHg7Ym9yZGVyLXdpZHRoOjJweDtcIj48L2Rpdj48ZW0+R2VuZXJhdGluZyBhIHRhaWxvcmVkIHN1bW1hcnlcdTIwMjY8L2VtPjwvZGl2Pic7IGxvYWRpbmdFbC5zdHlsZS5kaXNwbGF5ID0gJyc7IH1cbiAgaWYgKHRleHRFbCkgICB0ZXh0RWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAvLyBVc2UgdGhlIGdsb2JhbCBMTE0gc3RhdHVzIGJhciBmb3IgdmlzaWJpbGl0eVxuICBzZXRMb2FkaW5nKHRydWUsICdHZW5lcmF0aW5nIHN1bW1hcnlcdTIwMjYnKTtcblxuICB0cnkge1xuICAgIGNvbnN0IGJvZHkgPSB7fTtcbiAgICBpZiAocmVmaW5lbWVudFByb21wdCkgYm9keS5yZWZpbmVtZW50X3Byb21wdCA9IHJlZmluZW1lbnRQcm9tcHQ7XG4gICAgaWYgKHByZXZpb3VzU3VtbWFyeSkgIGJvZHkucHJldmlvdXNfc3VtbWFyeSAgPSBwcmV2aW91c1N1bW1hcnk7XG5cbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvZ2VuZXJhdGUtc3VtbWFyeScsIHtcbiAgICAgIG1ldGhvZDogICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogICAgSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG5cbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgX3Nob3dBSVN1bW1hcnkoZGF0YS5zdW1tYXJ5LCAnXHUyNzEzIGdlbmVyYXRlZCcpO1xuICAgICAgd2luZG93LnNlbGVjdGVkU3VtbWFyeUtleSA9ICdhaV9nZW5lcmF0ZWQnO1xuICAgICAgYXdhaXQgc2F2ZVN1bW1hcnlGb2N1c1RvQmFja2VuZCgnYWlfZ2VuZXJhdGVkJyk7XG4gICAgICBzY2hlZHVsZUF0c1JlZnJlc2goJ3Jldmlld19jaGVja3BvaW50Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnXHUyNkEwIGVycm9yJztcbiAgICAgIGlmICh0ZXh0RWwpICAgdGV4dEVsLmlubmVySFRNTCA9IGA8c3BhbiBzdHlsZT1cImNvbG9yOiNlZjQ0NDQ7XCI+JHtlc2NhcGVIdG1sKGRhdGEuZXJyb3IgfHwgJ0dlbmVyYXRpb24gZmFpbGVkLicpfTwvc3Bhbj5gO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKHN0YXR1c0VsKSBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICdcdTI2QTAgbmV0d29yayBlcnJvcic7XG4gICAgaWYgKHRleHRFbCkgICB0ZXh0RWwuaW5uZXJIVE1MID0gJzxzcGFuIHN0eWxlPVwiY29sb3I6I2VmNDQ0NDtcIj5OZXR3b3JrIGVycm9yIFx1MjAxNCBwbGVhc2UgdHJ5IGFnYWluLjwvc3Bhbj4nO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChidG4pIGJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBSZWdlbmVyYXRlIC8gdXNlIEFJIHN1bW1hcnkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIHJlZ2VuZXJhdGVBSVN1bW1hcnkoKSB7XG4gIGNvbnN0IGlucHV0ICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3VtbWFyeS1yZWZpbmVtZW50LWlucHV0Jyk7XG4gIGNvbnN0IHByb21wdCAgPSBpbnB1dCA/IGlucHV0LnZhbHVlLnRyaW0oKSA6ICcnO1xuICBjb25zdCBjdXJyZW50ID0gd2luZG93Ll9haUdlbmVyYXRlZFN1bW1hcnkgfHwgJyc7XG4gIGF3YWl0IF9jYWxsR2VuZXJhdGVTdW1tYXJ5KHByb21wdCB8fCBudWxsLCBjdXJyZW50IHx8IG51bGwpO1xufVxuXG5hc3luYyBmdW5jdGlvbiB1c2VBSVN1bW1hcnkoKSB7XG4gIHdpbmRvdy5zZWxlY3RlZFN1bW1hcnlLZXkgPSAnYWlfZ2VuZXJhdGVkJztcbiAgY29uc3QgdGV4dEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FpLXN1bW1hcnktdGV4dCcpO1xuICBjb25zdCBjdXJyZW50VGV4dCA9IHRleHRFbCA/IHRleHRFbC52YWx1ZS50cmltKCkgOiAod2luZG93Ll9haUdlbmVyYXRlZFN1bW1hcnkgfHwgJycpO1xuICBhd2FpdCBzYXZlU3VtbWFyeUZvY3VzVG9CYWNrZW5kKCdhaV9nZW5lcmF0ZWQnLCBjdXJyZW50VGV4dCk7XG4gIHNjaGVkdWxlQXRzUmVmcmVzaCgncmV2aWV3X2NoZWNrcG9pbnQnKTtcbiAgc2hvd1RvYXN0KCdBSS1nZW5lcmF0ZWQgc3VtbWFyeSBzZWxlY3RlZCBmb3IgeW91ciBDVicpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgU2VsZWN0IHN0b3JlZCBzdW1tYXJ5IGtleSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gc2VsZWN0U3VtbWFyeUtleShrZXkpIHtcbiAgd2luZG93LnNlbGVjdGVkU3VtbWFyeUtleSA9IGtleTtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI3N1bW1hcnktcmFkaW9zIGxhYmVsJykuZm9yRWFjaChsYWJlbCA9PiB7XG4gICAgY29uc3QgcmFkaW8gPSBsYWJlbC5xdWVyeVNlbGVjdG9yKCdpbnB1dFt0eXBlPXJhZGlvXScpO1xuICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSByYWRpbyAmJiByYWRpby52YWx1ZSA9PT0ga2V5O1xuICAgIGxhYmVsLnN0eWxlLmJvcmRlckNvbG9yID0gaXNTZWxlY3RlZCA/ICcjMTBiOTgxJyA6ICcjZTVlN2ViJztcbiAgICBsYWJlbC5zdHlsZS5iYWNrZ3JvdW5kICA9IGlzU2VsZWN0ZWQgPyAnI2YwZmRmNCcgOiAnJztcbiAgfSk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBTYXZlIC8gc3VibWl0IFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4vKipcbiAqIGR1Y2tmbG93OlxuICogICBpZDogc3VtbWFyeV91aV9wZXJzaXN0XG4gKiAgIGtpbmQ6IHVpXG4gKiAgIHRpbWVzdGFtcDogXCIyMDI2LTAzLTI3VDAxOjIzOjI4WlwiXG4gKiAgIHN0YXR1czogc2hhcmVkXG4gKiAgIGhhbmRsZXM6IFtcInVpOnN1bW1hcnktcmV2aWV3LnBlcnNpc3RcIl1cbiAqICAgY2FsbHM6IFtcIlBPU1QgL2FwaS9yZXZpZXctZGVjaXNpb25zXCJdXG4gKiAgIHJlYWRzOiBbXCJ3aW5kb3c6c2VsZWN0ZWRTdW1tYXJ5S2V5XCJdXG4gKiAgIHdyaXRlczogW1wicmVxdWVzdDpQT1NUIC9hcGkvcmV2aWV3LWRlY2lzaW9ucy5zdW1tYXJ5X2ZvY3VzXCJdXG4gKiAgIG5vdGVzOiBcIlBlcnNpc3RzIG9ubHkgdGhlIHNlbGVjdGVkIHN1bW1hcnkga2V5IHNvIGJhY2tlbmQgc3RhdGUgY2FuIHJlc29sdmUgdGhlIGFjdGl2ZSBzdW1tYXJ5IHZhcmlhbnQgbGF0ZXIuXCJcbiAqL1xuXG4vLyBEZWJvdW5jZSB0aW1lciBmb3IgYXV0by1wZXJzaXN0aW5nIGVkaXRzIHRvIHRoZSBzdW1tYXJ5IHRleHQuXG5sZXQgX3N1bW1hcnlQZXJzaXN0VGltZXIgPSBudWxsO1xuXG5mdW5jdGlvbiBvblN1bW1hcnlUZXh0Q2hhbmdlKCkge1xuICBjb25zdCB0ZXh0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWktc3VtbWFyeS10ZXh0Jyk7XG4gIGlmICghdGV4dEVsKSByZXR1cm47XG4gIHdpbmRvdy5fYWlHZW5lcmF0ZWRTdW1tYXJ5ID0gdGV4dEVsLnZhbHVlO1xuICBfdXBkYXRlU3VtbWFyeVNwZWNpZmljaXR5QmFkZ2UodGV4dEVsLnZhbHVlKTtcbiAgY2xlYXJUaW1lb3V0KF9zdW1tYXJ5UGVyc2lzdFRpbWVyKTtcbiAgX3N1bW1hcnlQZXJzaXN0VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICBzYXZlU3VtbWFyeUZvY3VzVG9CYWNrZW5kKCdhaV9nZW5lcmF0ZWQnLCB0ZXh0RWwudmFsdWUudHJpbSgpKTtcbiAgfSwgNTAwKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZVN1bW1hcnlGb2N1c1RvQmFja2VuZChrZXksIHRleHQpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXlsb2FkID0geyB0eXBlOiAnc3VtbWFyeV9mb2N1cycsIGRlY2lzaW9uczoga2V5IH07XG4gICAgaWYgKHRleHQgIT09IHVuZGVmaW5lZCAmJiB0ZXh0ICE9PSBudWxsKSBwYXlsb2FkLnN1bW1hcnlfdGV4dCA9IHRleHQ7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9yZXZpZXctZGVjaXNpb25zJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLm9rO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN1Ym1pdFN1bW1hcnlGb2N1c0RlY2lzaW9uKCkge1xuICBjb25zdCBrZXkgPSB3aW5kb3cuc2VsZWN0ZWRTdW1tYXJ5S2V5O1xuICBpZiAoIWtleSkgcmV0dXJuO1xuICBjb25zdCBzYXZlZCA9IGF3YWl0IHNhdmVTdW1tYXJ5Rm9jdXNUb0JhY2tlbmQoa2V5KTtcbiAgaWYgKCFzYXZlZCkge1xuICAgIHNob3dUb2FzdCgnRmFpbGVkIHRvIHNhdmUgc3VtbWFyeSBzZWxlY3Rpb24uJywgJ2Vycm9yJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHN0YXRlTWFuYWdlci5tYXJrQ29udGVudENoYW5nZWQoKTtcbiAgc2NoZWR1bGVBdHNSZWZyZXNoKCdyZXZpZXdfY2hlY2twb2ludCcpO1xuICBzaG93VG9hc3QoYFN1bW1hcnkgc2VsZWN0aW9uIHNhdmVkOiBcIiR7a2V5LnJlcGxhY2UoL18vZywgJyAnKX1cImApO1xuICBzd2l0Y2hUYWIoJ3B1YmxpY2F0aW9ucy1yZXZpZXcnKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEV4cG9ydHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmV4cG9ydCB7XG4gIGJ1aWxkU3VtbWFyeUZvY3VzU2VjdGlvbixcbiAgX3JlbmRlclN0b3JlZFN1bW1hcnlSYWRpb3MsXG4gIF9zaG93QUlTdW1tYXJ5LFxuICBfY2FsbEdlbmVyYXRlU3VtbWFyeSxcbiAgcmVnZW5lcmF0ZUFJU3VtbWFyeSxcbiAgdXNlQUlTdW1tYXJ5LFxuICBvblN1bW1hcnlUZXh0Q2hhbmdlLFxuICBzZWxlY3RTdW1tYXJ5S2V5LFxuICBzYXZlU3VtbWFyeUZvY3VzVG9CYWNrZW5kLFxuICBfY2hlY2tTdW1tYXJ5U3BlY2lmaWNpdHksXG4gIF91cGRhdGVTdW1tYXJ5U3BlY2lmaWNpdHlCYWRnZSxcbiAgc3VibWl0U3VtbWFyeUZvY3VzRGVjaXNpb24sXG59O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvcHVibGljYXRpb25zLXJldmlldy5qc1xuICogUHVibGljYXRpb25zIHJldmlldyB0YWJsZTogZmV0Y2gsIHJlbmRlciwgdG9nZ2xlIGFjY2VwdC9yZWplY3QsIHN1Ym1pdCBkZWNpc2lvbnMuXG4gKlxuICogRGVwZW5kZW5jaWVzIChyZXNvbHZlZCB0aHJvdWdoIGdsb2JhbFRoaXMgYXQgcnVudGltZSk6XG4gKiAgIHB1YmxpY2F0aW9uRGVjaXNpb25zLCBfc2F2ZWREZWNpc2lvbnMsXG4gKiAgIGVzY2FwZUh0bWwsIHNob3dUb2FzdCwgZmV0Y2hBbmRSZXZpZXdSZXdyaXRlcywgQ1NTXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdwdWJsaWNhdGlvbnMtcmV2aWV3Jyk7XG5cbmltcG9ydCB7IHN0YXRlTWFuYWdlciB9IGZyb20gJy4vc3RhdGUtbWFuYWdlci5qcyc7XG5pbXBvcnQgeyBleWVTbGFzaEljb24gfSBmcm9tICcuL3Jldmlldy1pY29ucy5qcyc7XG5cbi8vIFRyYWNrIHB1YmxpY2F0aW9uIGFjY2VwdC9yZWplY3QgZGVjaXNpb25zOiBjaXRlX2tleSBcdTIxOTIgdHJ1ZSAoYWNjZXB0KSB8IGZhbHNlIChyZWplY3QpXG53aW5kb3cucHVibGljYXRpb25EZWNpc2lvbnMgPSB7fTtcbi8vIE9yZGVyZWQgbGlzdCBvZiBwdWJsaWNhdGlvbiBvYmplY3RzOyBtdXRhdGVkIGJ5IG1vdmVQdWJSb3coKVxud2luZG93Ll9wdWJsaWNhdGlvbnNPcmRlcmVkID0gW107XG5cbi8vIFx1MjUwMFx1MjUwMCBCdWlsZCBwdWJsaWNhdGlvbnMgcmV2aWV3IHRhYmxlIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBidWlsZFB1YmxpY2F0aW9uc1Jldmlld1RhYmxlKCkge1xuICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHVibGljYXRpb25zLXRhYmxlLWNvbnRhaW5lcicpO1xuICAvLyBJbiB0aGUgbmV3IHN1Yi10YWIgbGF5b3V0LCB3ZSB1c2UgdGhlIHBhbmUgd3JhcHBlciBpbnN0ZWFkIG9mIHRoZSBvbGQgc2VjdGlvblxuICBjb25zdCBzZWN0aW9uICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHVibGljYXRpb25zLXJldmlldy1zZWN0aW9uJykgfHxcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jldmlldy1wYW5lLXB1YmxpY2F0aW9ucycpO1xuICBjb25zdCBwdWJUYWJCdG4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucmV2aWV3LXN1YnRhYltkYXRhLXBhbmU9XCJwdWJsaWNhdGlvbnNcIl0nKTtcbiAgaWYgKCFjb250YWluZXIpIHJldHVybjtcblxuICBjb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDoxMnB4O3BhZGRpbmc6MjBweDtjb2xvcjojNmI3MjgwO1wiPjxkaXYgY2xhc3M9XCJsb2FkaW5nLXNwaW5uZXJcIiBzdHlsZT1cIndpZHRoOjIwcHg7aGVpZ2h0OjIwcHg7Ym9yZGVyLXdpZHRoOjJweDtmbGV4LXNocmluazowO1wiPjwvZGl2PjxzcGFuPkxvYWRpbmcgcHVibGljYXRpb24gcmVjb21tZW5kYXRpb25zXFx1MjAyNjwvc3Bhbj48L2Rpdj4nO1xuXG4gIGxldCByZWNvbW1lbmRhdGlvbnMgPSBbXTtcbiAgbGV0IHRvdGFsQ291bnQgPSAwO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9wdWJsaWNhdGlvbi1yZWNvbW1lbmRhdGlvbnMnKTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoIWRhdGEub2spIHsgY29udGFpbmVyLmlubmVySFRNTCA9IGA8cCBjbGFzcz1cImVycm9yLW1lc3NhZ2VcIj4ke2VzY2FwZUh0bWwoZGF0YS5lcnJvciB8fCAnRmFpbGVkIHRvIGxvYWQgcHVibGljYXRpb25zLicpfTwvcD5gOyByZXR1cm47IH1cbiAgICByZWNvbW1lbmRhdGlvbnMgPSBkYXRhLnJlY29tbWVuZGF0aW9ucyB8fCBbXTtcbiAgICB0b3RhbENvdW50ID0gZGF0YS50b3RhbF9jb3VudCB8fCByZWNvbW1lbmRhdGlvbnMubGVuZ3RoO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cuZXJyb3IoJ0Vycm9yIGZldGNoaW5nIHB1YmxpY2F0aW9uIHJlY29tbWVuZGF0aW9uczonLCBlcnIpO1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnPHAgc3R5bGU9XCJjb2xvcjogI2VmNDQ0NDsgcGFkZGluZzogMjBweDtcIj5GYWlsZWQgdG8gbG9hZCBwdWJsaWNhdGlvbiByZWNvbW1lbmRhdGlvbnMuPC9wPic7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHJlY29tbWVuZGF0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAvLyBObyBwdWJsaWNhdGlvbnMgXHUyMDE0IGhpZGUgdGhlIHBhbmUgYW5kIGRpc2FibGUgdGhlIHRhYiBidXR0b25cbiAgICBpZiAoc2VjdGlvbikgc2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGlmIChwdWJUYWJCdG4pIHB1YlRhYkJ0bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnPHAgc3R5bGU9XCJwYWRkaW5nOjIwcHg7Y29sb3I6IzZiNzI4MDtcIj5ObyBwdWJsaWNhdGlvbnMgZm91bmQuPC9wPic7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gU2hvdyBzZWN0aW9uIGFuZCB0YWIgYnV0dG9uXG4gIGlmIChwdWJUYWJCdG4pIHB1YlRhYkJ0bi5zdHlsZS5kaXNwbGF5ID0gJyc7XG5cbiAgLy8gVXBkYXRlIGhlYWRpbmcgY291bnQgKGhhbmRsZSBib3RoIHBhbmUgYXBwcm9hY2ggYW5kIGxlZ2FjeSBzZWN0aW9uIGFwcHJvYWNoKVxuICBjb25zdCBoZWFkaW5nID0gc2VjdGlvbiA/IHNlY3Rpb24ucXVlcnlTZWxlY3RvcignaDInKSA6IG51bGw7XG4gIGlmIChoZWFkaW5nKSB7XG4gICAgaGVhZGluZy50ZXh0Q29udGVudCA9IGBcdUQ4M0RcdURDQzQgU2VsZWN0ZWQgUHVibGljYXRpb25zYDtcbiAgfVxuXG4gIC8vIENvdW50IHJlY29tbWVuZGVkIHZzIHRvdGFsXG4gIGNvbnN0IHJlY29tbWVuZGVkQ291bnQgPSByZWNvbW1lbmRhdGlvbnMuZmlsdGVyKHAgPT4gcC5pc19yZWNvbW1lbmRlZCAhPT0gZmFsc2UpLmxlbmd0aDtcbiAgY29uc3QgY29udGV4dE5vdGUgPSBgPHN0cm9uZz4ke3JlY29tbWVuZGVkQ291bnR9PC9zdHJvbmc+IG9mIDxzdHJvbmc+JHt0b3RhbENvdW50fTwvc3Ryb25nPiBwdWJsaWNhdGlvbnMgcmVjb21tZW5kZWQgZm9yIHRoaXMgcm9sZS4gYCArXG4gICAgYFJlY29tbWVuZGVkIHB1YmxpY2F0aW9ucyAodG9wKSBhcmUgcHJlLXNlbGVjdGVkIGZvciBpbmNsdXNpb247IG90aGVycyAoYmVsb3cgdGhlIGRpdmlkZXIpIGFyZSBwcmUtZXhjbHVkZWQuIEFkanVzdCB1c2luZyB0aGUgdG9nZ2xlcy5gO1xuXG4gIC8vIEluaXRpYWxpc2UgZGVjaXNpb25zIFx1MjAxNCByZWNvbW1lbmRlZD1hY2NlcHQsIG5vdC1yZWNvbW1lbmRlZD1yZWplY3QgYnkgZGVmYXVsdFxuICB3aW5kb3cucHVibGljYXRpb25EZWNpc2lvbnMgPSB7fTtcbiAgcmVjb21tZW5kYXRpb25zLmZvckVhY2gocHViID0+IHtcbiAgICB3aW5kb3cucHVibGljYXRpb25EZWNpc2lvbnNbcHViLmNpdGVfa2V5XSA9IHB1Yi5pc19yZWNvbW1lbmRlZCAhPT0gZmFsc2U7XG4gIH0pO1xuICAvLyBBcHBseSBhbnkgcHJldmlvdXNseSBzYXZlZCB1c2VyIGRlY2lzaW9ucyBvdmVyIHRoZSBBUEkgZGVmYXVsdHNcbiAgY29uc3Qgc2F2ZWRQdWJEZWNzID0gd2luZG93Ll9zYXZlZERlY2lzaW9ucz8ucHVibGljYXRpb25fZGVjaXNpb25zIHx8IHt9O1xuICBpZiAoT2JqZWN0LmtleXMoc2F2ZWRQdWJEZWNzKS5sZW5ndGggPiAwKSBPYmplY3QuYXNzaWduKHdpbmRvdy5wdWJsaWNhdGlvbkRlY2lzaW9ucywgc2F2ZWRQdWJEZWNzKTtcblxuICAvLyBTZWVkIHRoZSBvcmRlcmVkIGxpc3QgZm9yIHJlb3JkZXIgY29udHJvbHNcbiAgd2luZG93Ll9wdWJsaWNhdGlvbnNPcmRlcmVkID0gWy4uLnJlY29tbWVuZGF0aW9uc107XG5cbiAgbGV0IHRhYmxlSFRNTCA9IGBcbiAgICA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7Zm9udC1zaXplOjAuOWVtO21hcmdpbi1ib3R0b206MTJweDtcIj4ke2NvbnRleHROb3RlfTwvcD5cbiAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTJweDtmbGV4LXdyYXA6d3JhcDttYXJnaW4tYm90dG9tOjEwcHg7XCI+XG4gICAgICA8bGFiZWwgc3R5bGU9XCJmb250LXNpemU6MC45ZW07Y29sb3I6IzM3NDE1MTtcIj5GaWx0ZXIgcHVibGljYXRpb25zOlxuICAgICAgICA8aW5wdXQgdHlwZT1cInNlYXJjaFwiIGlkPVwicHViLWZpbHRlci1pbnB1dFwiIHBsYWNlaG9sZGVyPVwiVHlwZSB0byBmaWx0ZXJcdTIwMjZcIlxuICAgICAgICAgIHN0eWxlPVwibWFyZ2luLWxlZnQ6OHB4O3BhZGRpbmc6NHB4IDhweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo0cHg7Zm9udC1zaXplOjAuOWVtO1wiXG4gICAgICAgICAgb25pbnB1dD1cImZpbHRlclB1YmxpY2F0aW9uc1RhYmxlKHRoaXMudmFsdWUpXCI+XG4gICAgICA8L2xhYmVsPlxuICAgICAgPHNwYW4gc3R5bGU9XCJtYXJnaW4tbGVmdDphdXRvO2Rpc3BsYXk6ZmxleDtnYXA6OHB4O2FsaWduLWl0ZW1zOmNlbnRlcjtcIj5cbiAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC44MmVtO2NvbG9yOiM2YjcyODA7XCI+QnVsazo8L3NwYW4+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHNlY29uZGFyeVwiIHN0eWxlPVwiZm9udC1zaXplOjAuOGVtO3BhZGRpbmc6NHB4IDEwcHg7XCJcbiAgICAgICAgICBvbmNsaWNrPVwiYnVsa1B1YkFjdGlvbigncmVjb21tZW5kZWQnKVwiIHRpdGxlPVwiQWNjZXB0IGFsbCByZWNvbW1lbmRlZCBhbmQgcmVqZWN0IHRoZSByZXN0XCI+QWNjZXB0IFJlY29tbWVuZGVkPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHNlY29uZGFyeVwiIHN0eWxlPVwiZm9udC1zaXplOjAuOGVtO3BhZGRpbmc6NHB4IDEwcHg7XCJcbiAgICAgICAgICBvbmNsaWNrPVwiYnVsa1B1YkFjdGlvbignYWNjZXB0LWFsbCcpXCIgdGl0bGU9XCJBY2NlcHQgYWxsIHB1YmxpY2F0aW9uc1wiPkFjY2VwdCBBbGw8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG4gc2Vjb25kYXJ5XCIgc3R5bGU9XCJmb250LXNpemU6MC44ZW07cGFkZGluZzo0cHggMTBweDtcIlxuICAgICAgICAgIG9uY2xpY2s9XCJidWxrUHViQWN0aW9uKCdyZWplY3QtYWxsJylcIiB0aXRsZT1cIlJlamVjdCBhbGwgcHVibGljYXRpb25zXCI+UmVqZWN0IEFsbDwvYnV0dG9uPlxuICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuICAgIDx0YWJsZSBpZD1cInB1YmxpY2F0aW9ucy1yZXZpZXctdGFibGVcIiBjbGFzcz1cInJldmlldy10YWJsZVwiPlxuICAgICAgPHRoZWFkPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6NDBweDtcIj5SYW5rPC90aD5cbiAgICAgICAgICA8dGg+Q2l0YXRpb248L3RoPlxuICAgICAgICAgIDx0aD5ZZWFyPC90aD5cbiAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDozNnB4O3RleHQtYWxpZ246Y2VudGVyO1wiIHRpdGxlPVwiRmlyc3QgYXV0aG9yXCI+MXN0XHUyNjA1PC90aD5cbiAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDo1MHB4O1wiPlNjb3JlPC90aD5cbiAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDo4MHB4O1wiPkNvbmZpZGVuY2U8L3RoPlxuICAgICAgICAgIDx0aD5SZWFzb25pbmc8L3RoPlxuICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOjgwcHg7XCI+SW5jbHVkZT88L3RoPlxuICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOjU2cHg7dGV4dC1hbGlnbjpjZW50ZXI7XCI+T3JkZXI8L3RoPlxuICAgICAgICA8L3RyPlxuICAgICAgPC90aGVhZD5cbiAgICAgIDx0Ym9keT5cbiAgYDtcblxuICBsZXQgZGl2aWRlckluc2VydGVkID0gZmFsc2U7XG4gIHJlY29tbWVuZGF0aW9ucy5mb3JFYWNoKChwdWIsIGlkeCkgPT4ge1xuICAgIC8vIEluc2VydCBhIHNlY3Rpb24gZGl2aWRlciBiZWZvcmUgdGhlIGZpcnN0IG5vbi1yZWNvbW1lbmRlZCBwdWJsaWNhdGlvblxuICAgIGlmICghZGl2aWRlckluc2VydGVkICYmIHB1Yi5pc19yZWNvbW1lbmRlZCA9PT0gZmFsc2UpIHtcbiAgICAgIGRpdmlkZXJJbnNlcnRlZCA9IHRydWU7XG4gICAgICBjb25zdCBkaXZpZGVyU3R5bGUgPSAnYmFja2dyb3VuZDojZjNmNGY2O2JvcmRlci10b3A6MnB4IHNvbGlkICNkMWQ1ZGI7cGFkZGluZzowOyc7XG4gICAgICB0YWJsZUhUTUwgKz0gYFxuICAgICAgICA8dHIgY2xhc3M9XCJwdWItZGl2aWRlci1yb3dcIj5cbiAgICAgICAgICA8dGQgc3R5bGU9XCIke2RpdmlkZXJTdHlsZX1cIj48L3RkPlxuICAgICAgICAgIDx0ZCBzdHlsZT1cIiR7ZGl2aWRlclN0eWxlfWNvbG9yOiM2YjcyODA7Zm9udC1zaXplOjAuODJlbTtmb250LXN0eWxlOml0YWxpYztwYWRkaW5nOjZweCAxMnB4O3RleHQtYWxpZ246Y2VudGVyO1wiPlxuICAgICAgICAgICAgXHUyMDE0IFB1YmxpY2F0aW9ucyBiZWxvdyB3ZXJlIG5vdCByZWNvbW1lbmRlZCBmb3IgdGhpcyByb2xlIChwcmUtZXhjbHVkZWQpIFx1MjAxNFxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPHRkIHN0eWxlPVwiJHtkaXZpZGVyU3R5bGV9XCI+PC90ZD5cbiAgICAgICAgICA8dGQgc3R5bGU9XCIke2RpdmlkZXJTdHlsZX1cIj48L3RkPlxuICAgICAgICAgIDx0ZCBzdHlsZT1cIiR7ZGl2aWRlclN0eWxlfVwiPjwvdGQ+XG4gICAgICAgICAgPHRkIHN0eWxlPVwiJHtkaXZpZGVyU3R5bGV9XCI+PC90ZD5cbiAgICAgICAgICA8dGQgc3R5bGU9XCIke2RpdmlkZXJTdHlsZX1cIj48L3RkPlxuICAgICAgICAgIDx0ZCBzdHlsZT1cIiR7ZGl2aWRlclN0eWxlfVwiPjwvdGQ+XG4gICAgICAgICAgPHRkIHN0eWxlPVwiJHtkaXZpZGVyU3R5bGV9XCI+PC90ZD5cbiAgICAgICAgPC90cj5cbiAgICAgIGA7XG4gICAgfVxuXG4gICAgY29uc3QgcmFuayAgICAgICA9IGlkeCArIDE7XG4gICAgY29uc3QgY2l0YXRpb24gICA9IHB1Yi5mb3JtYXR0ZWRfY2l0YXRpb24gfHwgW3B1Yi50aXRsZSwgcHViLnZlbnVlLCBwdWIueWVhcl0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJy4gJyk7XG4gICAgY29uc3QgeWVhciAgICAgICA9IHB1Yi55ZWFyIHx8ICdcdTIwMTQnO1xuICAgIGNvbnN0IGZpcnN0QXV0aCAgPSBwdWIuaXNfZmlyc3RfYXV0aG9yID8gJzxzcGFuIHN0eWxlPVwiY29sb3I6IzEwYjk4MTtmb250LXdlaWdodDo3MDA7XCIgdGl0bGU9XCJGaXJzdCBhdXRob3JcIj5cdTI2MDU8L3NwYW4+JyA6ICc8c3BhbiBzdHlsZT1cImNvbG9yOiNkMWQ1ZGI7XCI+XHUyNjA2PC9zcGFuPic7XG4gICAgY29uc3Qgc2NvcmUgICAgICA9IHB1Yi5yZWxldmFuY2Vfc2NvcmUgPyBwdWIucmVsZXZhbmNlX3Njb3JlIDogJ1x1MjAxNCc7XG4gICAgY29uc3QgY29uZmlkZW5jZSA9IHB1Yi5jb25maWRlbmNlIHx8ICcnO1xuICAgIGNvbnN0IGNvbmZDb2xvciAgPSBjb25maWRlbmNlID09PSAnSGlnaCcgPyAnIzEwYjk4MScgOiBjb25maWRlbmNlID09PSAnTG93JyA/ICcjZWY0NDQ0JyA6ICcjZjU5ZTBiJztcbiAgICBjb25zdCBjb25mQmFkZ2UgID0gY29uZmlkZW5jZSA/IGA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZToxMXB4O2NvbG9yOiR7Y29uZkNvbG9yfTtmb250LXdlaWdodDo2MDA7XCI+JHtlc2NhcGVIdG1sKGNvbmZpZGVuY2UpfTwvc3Bhbj5gIDogJyc7XG4gICAgY29uc3QgcmVhc29uaW5nICA9IHB1Yi5yYXRpb25hbGUgPyBgPHNtYWxsPiR7ZXNjYXBlSHRtbChwdWIucmF0aW9uYWxlKX08L3NtYWxsPmAgOiAnJztcbiAgICBjb25zdCB2ZW51ZVdhcm4gID0gcHViLnZlbnVlX3dhcm5pbmcgPyBgIDxzcGFuIHRpdGxlPVwiJHtlc2NhcGVIdG1sKHB1Yi52ZW51ZV93YXJuaW5nKX1cIiBzdHlsZT1cImNvbG9yOiNkYzc5MDA7Y3Vyc29yOmhlbHA7XCI+XHUyNkEwPC9zcGFuPmAgOiAnJztcbiAgICBjb25zdCBjaXRlS2V5ICAgID0gcHViLmNpdGVfa2V5IHx8ICcnO1xuICAgIGNvbnN0IGlzQWNjZXB0ZWQgPSB3aW5kb3cucHVibGljYXRpb25EZWNpc2lvbnNbY2l0ZUtleV0gIT09IGZhbHNlO1xuICAgIGNvbnN0IHJvd1N0eWxlICAgPSBwdWIuaXNfcmVjb21tZW5kZWQgPT09IGZhbHNlID8gJ29wYWNpdHk6MC43OycgOiAnJztcblxuICAgIGNvbnN0IGlzRmlyc3QgPSBpZHggPT09IDA7XG4gICAgY29uc3QgaXNMYXN0ICA9IGlkeCA9PT0gcmVjb21tZW5kYXRpb25zLmxlbmd0aCAtIDE7XG4gICAgdGFibGVIVE1MICs9IGBcbiAgICAgIDx0ciBkYXRhLWNpdGUta2V5PVwiJHtlc2NhcGVIdG1sKGNpdGVLZXkpfVwiIHN0eWxlPVwiJHtyb3dTdHlsZX1cIj5cbiAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7Zm9udC13ZWlnaHQ6NzAwO1wiPiR7cmFua308L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJmb250LXNpemU6MC44N2VtO1wiPiR7ZXNjYXBlSHRtbChjaXRhdGlvbil9JHt2ZW51ZVdhcm59PC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7XCI+JHt5ZWFyfTwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO1wiPiR7Zmlyc3RBdXRofTwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO1wiPiR7c2NvcmUgIT09ICdcdTIwMTQnID8gYDxzdHJvbmc+JHtzY29yZX08L3N0cm9uZz4vMTBgIDogJ1x1MjAxNCd9PC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7XCI+JHtjb25mQmFkZ2V9PC90ZD5cbiAgICAgICAgPHRkPiR7cmVhc29uaW5nfTwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cImFjdGlvbi1idG5zXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG4ke2lzQWNjZXB0ZWQgPyAnIGFjdGl2ZScgOiAnJ31cIiBkYXRhLWFjdGlvbj1cImFjY2VwdFwiIGFyaWEtbGFiZWw9XCJJbmNsdWRlIHB1YmxpY2F0aW9uICR7ZXNjYXBlSHRtbChjaXRlS2V5KX1cIiB0aXRsZT1cIkluY2x1ZGUgaW4gQ1ZcIlxuICAgICAgICAgICAgICBzdHlsZT1cImNvbG9yOiMxMGI5ODE7XCIgaWQ9XCJwdWItYWNjZXB0LSR7cmFua31cIj5cdTI3MTM8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0biR7IWlzQWNjZXB0ZWQgPyAnIGFjdGl2ZScgOiAnJ31cIiBkYXRhLWFjdGlvbj1cInJlamVjdFwiIGFyaWEtbGFiZWw9XCJFeGNsdWRlIHB1YmxpY2F0aW9uICR7ZXNjYXBlSHRtbChjaXRlS2V5KX1cIiB0aXRsZT1cIkV4Y2x1ZGUgZnJvbSBDVlwiXG4gICAgICAgICAgICAgIHN0eWxlPVwiY29sb3I6I2VmNDQ0NDtcIiBpZD1cInB1Yi1yZWplY3QtJHtyYW5rfVwiPiR7ZXllU2xhc2hJY29uKCl9PC9idXR0b24+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO3doaXRlLXNwYWNlOm5vd3JhcDtcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBkYXRhLWFjdGlvbj1cInB1Yi11cFwiIGRhdGEtY2l0ZS1rZXk9XCIke2VzY2FwZUh0bWwoY2l0ZUtleSl9XCJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJNb3ZlIHB1YmxpY2F0aW9uIHVwXCIgdGl0bGU9XCJNb3ZlIHVwXCIgJHtpc0ZpcnN0ID8gJ2Rpc2FibGVkIHN0eWxlPVwib3BhY2l0eTowLjM7XCInIDogJyd9Plx1MjE5MTwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIGRhdGEtYWN0aW9uPVwicHViLWRvd25cIiBkYXRhLWNpdGUta2V5PVwiJHtlc2NhcGVIdG1sKGNpdGVLZXkpfVwiXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiTW92ZSBwdWJsaWNhdGlvbiBkb3duXCIgdGl0bGU9XCJNb3ZlIGRvd25cIiAke2lzTGFzdCA/ICdkaXNhYmxlZCBzdHlsZT1cIm9wYWNpdHk6MC4zO1wiJyA6ICcnfT5cdTIxOTM8L2J1dHRvbj5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvdHI+XG4gICAgYDtcbiAgfSk7XG5cbiAgdGFibGVIVE1MICs9ICc8L3Rib2R5PjwvdGFibGU+JztcbiAgY29udGFpbmVyLmlubmVySFRNTCA9IHRhYmxlSFRNTDtcbiAgLy8gRGVsZWdhdGVkIGNsaWNrIGhhbmRsZXIgZm9yIHB1YmxpY2F0aW9uIGFjdGlvbiBidXR0b25zIChkYXRhLWNpdGUta2V5IG9uIDx0cj4gYXZvaWRzIG9uY2xpY2sgaW5qZWN0aW9uKVxuICBjb250YWluZXIucXVlcnlTZWxlY3RvcignI3B1YmxpY2F0aW9ucy1yZXZpZXctdGFibGUgdGJvZHknKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBlID0+IHtcbiAgICBjb25zdCBidG4gPSBlLnRhcmdldC5jbG9zZXN0KCcuaWNvbi1idG4nKTtcbiAgICBpZiAoIWJ0biB8fCBidG4uZGlzYWJsZWQpIHJldHVybjtcbiAgICBjb25zdCB0ciA9IGJ0bi5jbG9zZXN0KCd0cltkYXRhLWNpdGUta2V5XScpO1xuICAgIGlmICghdHIpIHJldHVybjtcbiAgICBjb25zdCBhY3Rpb24gPSBidG4uZGF0YXNldC5hY3Rpb247XG4gICAgaWYgICAgICAoYWN0aW9uID09PSAnYWNjZXB0JykgICBoYW5kbGVQdWJBY3Rpb24odHIuZGF0YXNldC5jaXRlS2V5LCB0cnVlKTtcbiAgICBlbHNlIGlmIChhY3Rpb24gPT09ICdyZWplY3QnKSAgIGhhbmRsZVB1YkFjdGlvbih0ci5kYXRhc2V0LmNpdGVLZXksIGZhbHNlKTtcbiAgICBlbHNlIGlmIChhY3Rpb24gPT09ICdwdWItdXAnKSAgIG1vdmVQdWJSb3coYnRuLmRhdGFzZXQuY2l0ZUtleSwgLTEpO1xuICAgIGVsc2UgaWYgKGFjdGlvbiA9PT0gJ3B1Yi1kb3duJykgbW92ZVB1YlJvdyhidG4uZGF0YXNldC5jaXRlS2V5LCArMSk7XG4gIH0pO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgRmlsdGVyIHRhYmxlIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBmaWx0ZXJQdWJsaWNhdGlvbnNUYWJsZShxdWVyeSkge1xuICBjb25zdCBxID0gcXVlcnkudG9Mb3dlckNhc2UoKTtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI3B1YmxpY2F0aW9ucy1yZXZpZXctdGFibGUgdGJvZHkgdHI6bm90KC5wdWItZGl2aWRlci1yb3cpJykuZm9yRWFjaChyb3cgPT4ge1xuICAgIHJvdy5zdHlsZS5kaXNwbGF5ID0gcSA9PT0gJycgfHwgcm93LnRleHRDb250ZW50LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkgPyAnJyA6ICdub25lJztcbiAgfSk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBSZW9yZGVyIHJvd3MgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIG1vdmVQdWJSb3coY2l0ZUtleSwgZGlyZWN0aW9uKSB7XG4gIGNvbnN0IGFyciA9IHdpbmRvdy5fcHVibGljYXRpb25zT3JkZXJlZDtcbiAgaWYgKCFhcnIgfHwgIWFyci5sZW5ndGgpIHJldHVybjtcbiAgY29uc3QgaWR4ID0gYXJyLmZpbmRJbmRleChwID0+IHAuY2l0ZV9rZXkgPT09IGNpdGVLZXkpO1xuICBpZiAoaWR4IDwgMCkgcmV0dXJuO1xuICBjb25zdCBuZXdJZHggPSBpZHggKyBkaXJlY3Rpb247XG4gIGlmIChuZXdJZHggPCAwIHx8IG5ld0lkeCA+PSBhcnIubGVuZ3RoKSByZXR1cm47XG4gIFthcnJbaWR4XSwgYXJyW25ld0lkeF1dID0gW2FycltuZXdJZHhdLCBhcnJbaWR4XV07XG4gIF9yZWJ1aWxkUHViVGFibGVCb2R5KGFycik7XG4gIC8vIFBlcnNpc3Qgb3JkZXIgdG8gYmFja2VuZCAoZmlyZS1hbmQtZm9yZ2V0KVxuICBmZXRjaCgnL2FwaS9yZW9yZGVyLXJvd3MnLCB7XG4gICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyB0eXBlOiAncHVibGljYXRpb24nLCBvcmRlcmVkX2lkczogYXJyLm1hcChwID0+IHAuY2l0ZV9rZXkpIH0pLFxuICB9KS5jYXRjaCgoKSA9PiB7fSk7XG59XG5cbmZ1bmN0aW9uIF9yZWJ1aWxkUHViVGFibGVCb2R5KHJlY29tbWVuZGF0aW9ucykge1xuICBjb25zdCB0Ym9keSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNwdWJsaWNhdGlvbnMtcmV2aWV3LXRhYmxlIHRib2R5Jyk7XG4gIGlmICghdGJvZHkpIHJldHVybjtcbiAgbGV0IGh0bWwgPSAnJztcbiAgbGV0IGRpdmlkZXJJbnNlcnRlZCA9IGZhbHNlO1xuICByZWNvbW1lbmRhdGlvbnMuZm9yRWFjaCgocHViLCBpZHgpID0+IHtcbiAgICBpZiAoIWRpdmlkZXJJbnNlcnRlZCAmJiBwdWIuaXNfcmVjb21tZW5kZWQgPT09IGZhbHNlKSB7XG4gICAgICBkaXZpZGVySW5zZXJ0ZWQgPSB0cnVlO1xuICAgICAgY29uc3QgZHMgPSAnYmFja2dyb3VuZDojZjNmNGY2O2JvcmRlci10b3A6MnB4IHNvbGlkICNkMWQ1ZGI7cGFkZGluZzowOyc7XG4gICAgICBodG1sICs9IGA8dHIgY2xhc3M9XCJwdWItZGl2aWRlci1yb3dcIj48dGQgc3R5bGU9XCIke2RzfVwiPjwvdGQ+PHRkIHN0eWxlPVwiJHtkc31jb2xvcjojNmI3MjgwO2ZvbnQtc2l6ZTowLjgyZW07Zm9udC1zdHlsZTppdGFsaWM7cGFkZGluZzo2cHggMTJweDt0ZXh0LWFsaWduOmNlbnRlcjtcIj5cdTIwMTQgUHVibGljYXRpb25zIGJlbG93IHdlcmUgbm90IHJlY29tbWVuZGVkIGZvciB0aGlzIHJvbGUgKHByZS1leGNsdWRlZCkgXHUyMDE0PC90ZD48dGQgc3R5bGU9XCIke2RzfVwiPjwvdGQ+PHRkIHN0eWxlPVwiJHtkc31cIj48L3RkPjx0ZCBzdHlsZT1cIiR7ZHN9XCI+PC90ZD48dGQgc3R5bGU9XCIke2RzfVwiPjwvdGQ+PHRkIHN0eWxlPVwiJHtkc31cIj48L3RkPjx0ZCBzdHlsZT1cIiR7ZHN9XCI+PC90ZD48dGQgc3R5bGU9XCIke2RzfVwiPjwvdGQ+PC90cj5gO1xuICAgIH1cbiAgICBjb25zdCByYW5rICAgICAgID0gaWR4ICsgMTtcbiAgICBjb25zdCBjaXRlS2V5ICAgID0gcHViLmNpdGVfa2V5IHx8ICcnO1xuICAgIGNvbnN0IGNpdGF0aW9uICAgPSBwdWIuZm9ybWF0dGVkX2NpdGF0aW9uIHx8IFtwdWIudGl0bGUsIHB1Yi52ZW51ZSwgcHViLnllYXJdLmZpbHRlcihCb29sZWFuKS5qb2luKCcuICcpO1xuICAgIGNvbnN0IHllYXIgICAgICAgPSBwdWIueWVhciB8fCAnXHUyMDE0JztcbiAgICBjb25zdCBmaXJzdEF1dGggID0gcHViLmlzX2ZpcnN0X2F1dGhvciA/ICc8c3BhbiBzdHlsZT1cImNvbG9yOiMxMGI5ODE7Zm9udC13ZWlnaHQ6NzAwO1wiIHRpdGxlPVwiRmlyc3QgYXV0aG9yXCI+XHUyNjA1PC9zcGFuPicgOiAnPHNwYW4gc3R5bGU9XCJjb2xvcjojZDFkNWRiO1wiPlx1MjYwNjwvc3Bhbj4nO1xuICAgIGNvbnN0IHNjb3JlICAgICAgPSBwdWIucmVsZXZhbmNlX3Njb3JlID8gcHViLnJlbGV2YW5jZV9zY29yZSA6ICdcdTIwMTQnO1xuICAgIGNvbnN0IGNvbmZpZGVuY2UgPSBwdWIuY29uZmlkZW5jZSB8fCAnJztcbiAgICBjb25zdCBjb25mQ29sb3IgID0gY29uZmlkZW5jZSA9PT0gJ0hpZ2gnID8gJyMxMGI5ODEnIDogY29uZmlkZW5jZSA9PT0gJ0xvdycgPyAnI2VmNDQ0NCcgOiAnI2Y1OWUwYic7XG4gICAgY29uc3QgY29uZkJhZGdlICA9IGNvbmZpZGVuY2UgPyBgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MTFweDtjb2xvcjoke2NvbmZDb2xvcn07Zm9udC13ZWlnaHQ6NjAwO1wiPiR7ZXNjYXBlSHRtbChjb25maWRlbmNlKX08L3NwYW4+YCA6ICcnO1xuICAgIGNvbnN0IHJlYXNvbmluZyAgPSBwdWIucmF0aW9uYWxlID8gYDxzbWFsbD4ke2VzY2FwZUh0bWwocHViLnJhdGlvbmFsZSl9PC9zbWFsbD5gIDogJyc7XG4gICAgY29uc3QgdmVudWVXYXJuICA9IHB1Yi52ZW51ZV93YXJuaW5nID8gYCA8c3BhbiB0aXRsZT1cIiR7ZXNjYXBlSHRtbChwdWIudmVudWVfd2FybmluZyl9XCIgc3R5bGU9XCJjb2xvcjojZGM3OTAwO2N1cnNvcjpoZWxwO1wiPlx1MjZBMDwvc3Bhbj5gIDogJyc7XG4gICAgY29uc3QgaXNBY2NlcHRlZCA9IHdpbmRvdy5wdWJsaWNhdGlvbkRlY2lzaW9uc1tjaXRlS2V5XSAhPT0gZmFsc2U7XG4gICAgY29uc3Qgcm93U3R5bGUgICA9IHB1Yi5pc19yZWNvbW1lbmRlZCA9PT0gZmFsc2UgPyAnb3BhY2l0eTowLjc7JyA6ICcnO1xuICAgIGNvbnN0IGlzRmlyc3QgICAgPSBpZHggPT09IDA7XG4gICAgY29uc3QgaXNMYXN0ICAgICA9IGlkeCA9PT0gcmVjb21tZW5kYXRpb25zLmxlbmd0aCAtIDE7XG4gICAgaHRtbCArPSBgPHRyIGRhdGEtY2l0ZS1rZXk9XCIke2VzY2FwZUh0bWwoY2l0ZUtleSl9XCIgc3R5bGU9XCIke3Jvd1N0eWxlfVwiPlxuICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7Zm9udC13ZWlnaHQ6NzAwO1wiPiR7cmFua308L3RkPlxuICAgICAgPHRkIHN0eWxlPVwiZm9udC1zaXplOjAuODdlbTtcIj4ke2VzY2FwZUh0bWwoY2l0YXRpb24pfSR7dmVudWVXYXJufTwvdGQ+XG4gICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjtcIj4ke3llYXJ9PC90ZD5cbiAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO1wiPiR7Zmlyc3RBdXRofTwvdGQ+XG4gICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjtcIj4ke3Njb3JlICE9PSAnXHUyMDE0JyA/IGA8c3Ryb25nPiR7c2NvcmV9PC9zdHJvbmc+LzEwYCA6ICdcdTIwMTQnfTwvdGQ+XG4gICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjtcIj4ke2NvbmZCYWRnZX08L3RkPlxuICAgICAgPHRkPiR7cmVhc29uaW5nfTwvdGQ+XG4gICAgICA8dGQgY2xhc3M9XCJhY3Rpb24tYnRuc1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG4ke2lzQWNjZXB0ZWQgPyAnIGFjdGl2ZScgOiAnJ31cIiBkYXRhLWFjdGlvbj1cImFjY2VwdFwiIGFyaWEtbGFiZWw9XCJJbmNsdWRlIHB1YmxpY2F0aW9uICR7ZXNjYXBlSHRtbChjaXRlS2V5KX1cIiB0aXRsZT1cIkluY2x1ZGUgaW4gQ1ZcIiBzdHlsZT1cImNvbG9yOiMxMGI5ODE7XCIgaWQ9XCJwdWItYWNjZXB0LSR7cmFua31cIj5cdTI3MTM8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuJHshaXNBY2NlcHRlZCA/ICcgYWN0aXZlJyA6ICcnfVwiIGRhdGEtYWN0aW9uPVwicmVqZWN0XCIgYXJpYS1sYWJlbD1cIkV4Y2x1ZGUgcHVibGljYXRpb24gJHtlc2NhcGVIdG1sKGNpdGVLZXkpfVwiIHRpdGxlPVwiRXhjbHVkZSBmcm9tIENWXCIgc3R5bGU9XCJjb2xvcjojZWY0NDQ0O1wiIGlkPVwicHViLXJlamVjdC0ke3Jhbmt9XCI+JHtleWVTbGFzaEljb24oKX08L2J1dHRvbj5cbiAgICAgIDwvdGQ+XG4gICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjt3aGl0ZS1zcGFjZTpub3dyYXA7XCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIGRhdGEtYWN0aW9uPVwicHViLXVwXCIgZGF0YS1jaXRlLWtleT1cIiR7ZXNjYXBlSHRtbChjaXRlS2V5KX1cIiBhcmlhLWxhYmVsPVwiTW92ZSBwdWJsaWNhdGlvbiB1cFwiIHRpdGxlPVwiTW92ZSB1cFwiICR7aXNGaXJzdCA/ICdkaXNhYmxlZCBzdHlsZT1cIm9wYWNpdHk6MC4zO1wiJyA6ICcnfT5cdTIxOTE8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgZGF0YS1hY3Rpb249XCJwdWItZG93blwiIGRhdGEtY2l0ZS1rZXk9XCIke2VzY2FwZUh0bWwoY2l0ZUtleSl9XCIgYXJpYS1sYWJlbD1cIk1vdmUgcHVibGljYXRpb24gZG93blwiIHRpdGxlPVwiTW92ZSBkb3duXCIgJHtpc0xhc3QgPyAnZGlzYWJsZWQgc3R5bGU9XCJvcGFjaXR5OjAuMztcIicgOiAnJ30+XHUyMTkzPC9idXR0b24+XG4gICAgICA8L3RkPlxuICAgIDwvdHI+YDtcbiAgfSk7XG4gIHRib2R5LmlubmVySFRNTCA9IGh0bWw7XG4gIC8vIFJlLWFwcGx5IGFueSBhY3RpdmUgZmlsdGVyXG4gIGNvbnN0IGZpbHRlclZhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWItZmlsdGVyLWlucHV0Jyk/LnZhbHVlIHx8ICcnO1xuICBpZiAoZmlsdGVyVmFsKSBmaWx0ZXJQdWJsaWNhdGlvbnNUYWJsZShmaWx0ZXJWYWwpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgVG9nZ2xlIGFjY2VwdCAvIHJlamVjdCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gaGFuZGxlUHViQWN0aW9uKGNpdGVLZXksIGFjY2VwdCkge1xuICB3aW5kb3cucHVibGljYXRpb25EZWNpc2lvbnNbY2l0ZUtleV0gPSBhY2NlcHQ7XG4gIC8vIHVwZGF0ZSBidXR0b24gYWN0aXZlIHN0YXRlcyBpbiB0aGUgcm93XG4gIGNvbnN0IHJvdyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYHRyW2RhdGEtY2l0ZS1rZXk9XCIke0NTUy5lc2NhcGUoY2l0ZUtleSl9XCJdYCk7XG4gIGlmICghcm93KSByZXR1cm47XG4gIHJvdy5xdWVyeVNlbGVjdG9yQWxsKCcuaWNvbi1idG4nKS5mb3JFYWNoKGJ0biA9PiBidG4uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJykpO1xuICBjb25zdCBhY3Rpb24gPSBhY2NlcHQgPyAnYWNjZXB0JyA6ICdyZWplY3QnO1xuICBjb25zdCBidG4gPSByb3cucXVlcnlTZWxlY3RvcihgW2RhdGEtYWN0aW9uPVwiJHthY3Rpb259XCJdYCk7XG4gIGlmIChidG4pIGJ0bi5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEJ1bGsgYWN0aW9ucyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gYnVsa1B1YkFjdGlvbihtb2RlKSB7XG4gIGNvbnN0IHB1YnMgPSB3aW5kb3cuX3B1YmxpY2F0aW9uc09yZGVyZWQgfHwgW107XG4gIGlmICghcHVicy5sZW5ndGgpIHJldHVybjtcblxuICBwdWJzLmZvckVhY2gocHViID0+IHtcbiAgICBjb25zdCBjaXRlS2V5ID0gcHViLmNpdGVfa2V5O1xuICAgIGxldCBhY2NlcHQ7XG4gICAgaWYgKG1vZGUgPT09ICdyZWNvbW1lbmRlZCcpIHtcbiAgICAgIGFjY2VwdCA9IHB1Yi5pc19yZWNvbW1lbmRlZCAhPT0gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChtb2RlID09PSAnYWNjZXB0LWFsbCcpIHtcbiAgICAgIGFjY2VwdCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFjY2VwdCA9IGZhbHNlO1xuICAgIH1cbiAgICB3aW5kb3cucHVibGljYXRpb25EZWNpc2lvbnNbY2l0ZUtleV0gPSBhY2NlcHQ7XG4gICAgLy8gVXBkYXRlIGJ1dHRvbiBzdGF0ZXMgaW4gdGhlIERPTVxuICAgIGNvbnN0IHJvdyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYHRyW2RhdGEtY2l0ZS1rZXk9XCIke0NTUy5lc2NhcGUoY2l0ZUtleSl9XCJdYCk7XG4gICAgaWYgKCFyb3cpIHJldHVybjtcbiAgICByb3cucXVlcnlTZWxlY3RvckFsbCgnLmljb24tYnRuW2RhdGEtYWN0aW9uPVwiYWNjZXB0XCJdLFtkYXRhLWFjdGlvbj1cInJlamVjdFwiXScpLmZvckVhY2goYnRuID0+IGJ0bi5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKSk7XG4gICAgY29uc3QgdGFyZ2V0ID0gcm93LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWFjdGlvbj1cIiR7YWNjZXB0ID8gJ2FjY2VwdCcgOiAncmVqZWN0J31cIl1gKTtcbiAgICBpZiAodGFyZ2V0KSB0YXJnZXQuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gIH0pO1xuXG4gIGNvbnN0IGFjY2VwdGVkID0gT2JqZWN0LnZhbHVlcyh3aW5kb3cucHVibGljYXRpb25EZWNpc2lvbnMpLmZpbHRlcihCb29sZWFuKS5sZW5ndGg7XG4gIHNob3dUb2FzdChgQnVsayBhY3Rpb24gYXBwbGllZDogJHthY2NlcHRlZH0gYWNjZXB0ZWQsICR7cHVicy5sZW5ndGggLSBhY2NlcHRlZH0gZXhjbHVkZWRgKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFN1Ym1pdCBkZWNpc2lvbnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIHN1Ym1pdFB1YmxpY2F0aW9uRGVjaXNpb25zKCkge1xuICAvKiBkdWNrZmxvdzpcbiAgICogICBpZDogcHVibGljYXRpb25zX3VpX3N1Ym1pdF9saXZlXG4gICAqICAga2luZDogdWlcbiAgICogICB0aW1lc3RhbXA6ICcyMDI2LTAzLTI1VDIxOjM5OjQ4WidcbiAgICogICBzdGF0dXM6IGxpdmVcbiAgICogICBoYW5kbGVzOlxuICAgKiAgIC0gdWk6cHVibGljYXRpb25zLXJldmlldy5zdWJtaXRcbiAgICogICBjYWxsczpcbiAgICogICAtIFBPU1QgL2FwaS9yZXZpZXctZGVjaXNpb25zXG4gICAqICAgLSBHRVQgL2FwaS9yZXdyaXRlc1xuICAgKiAgIHJlYWRzOlxuICAgKiAgIC0gd2luZG93OnB1YmxpY2F0aW9uRGVjaXNpb25zXG4gICAqICAgd3JpdGVzOlxuICAgKiAgIC0gcmVxdWVzdDpQT1NUIC9hcGkvcmV2aWV3LWRlY2lzaW9ucy5kZWNpc2lvbnNcbiAgICogICBub3RlczogUGVyc2lzdHMgcHVibGljYXRpb24gaW5jbHVkZS9leGNsdWRlIGRlY2lzaW9ucyBiZWZvcmUgdGhlIHJld3JpdGUgc3RhZ2UgZGVyaXZlcyBkb3duc3RyZWFtIGNvbnRlbnQgcHJvcG9zYWxzIGZyb20gdGhlIGFjY2VwdGVkIHB1YmxpY2F0aW9uIHNldC5cbiAgICovXG4gIGNvbnN0IGRlY2lzaW9ucyA9IHdpbmRvdy5wdWJsaWNhdGlvbkRlY2lzaW9ucyB8fCB7fTtcbiAgY29uc3QgY291bnQgPSBPYmplY3Qua2V5cyhkZWNpc2lvbnMpLmxlbmd0aDtcbiAgaWYgKGNvdW50ID09PSAwKSB7XG4gICAgc2hvd1RvYXN0KCdObyBwdWJsaWNhdGlvbiBkZWNpc2lvbnMgdG8gc2F2ZS4nLCAnZXJyb3InKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBQZXJzaXN0IGFzIGEgc3RydWN0dXJlZCBhbnN3ZXIgaW4gc2Vzc2lvbiBzdGF0ZVxuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvcmV2aWV3LWRlY2lzaW9ucycsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHR5cGU6ICdwdWJsaWNhdGlvbnMnLCBkZWNpc2lvbnM6IHdpbmRvdy5wdWJsaWNhdGlvbkRlY2lzaW9ucyB9KVxuICAgIH0pO1xuXG4gICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICBzdGF0ZU1hbmFnZXIubWFya0NvbnRlbnRDaGFuZ2VkKCk7XG4gICAgICBjb25zdCBhY2NlcHRlZCA9IE9iamVjdC52YWx1ZXMod2luZG93LnB1YmxpY2F0aW9uRGVjaXNpb25zKS5maWx0ZXIoQm9vbGVhbikubGVuZ3RoO1xuICAgICAgY29uc3QgcmVqZWN0ZWQgPSBjb3VudCAtIGFjY2VwdGVkO1xuICAgICAgc2hvd1RvYXN0KGBQdWJsaWNhdGlvbiBzZWxlY3Rpb25zIHNhdmVkOiAke2FjY2VwdGVkfSBrZXB0LCAke3JlamVjdGVkfSBleGNsdWRlZGApO1xuICAgICAgYXdhaXQgZmV0Y2hBbmRSZXZpZXdSZXdyaXRlcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBlcnIgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICBzaG93VG9hc3QoYEVycm9yOiAke2Vyci5lcnJvciB8fCAnRmFpbGVkIHRvIHNhdmUgcHVibGljYXRpb24gc2VsZWN0aW9ucyd9YCwgJ2Vycm9yJyk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cuZXJyb3IoJ0Vycm9yIHNhdmluZyBwdWJsaWNhdGlvbiBkZWNpc2lvbnM6JywgZXJyKTtcbiAgICBzaG93VG9hc3QoJ0ZhaWxlZCB0byBzYXZlIHB1YmxpY2F0aW9uIHNlbGVjdGlvbnMuIFBsZWFzZSB0cnkgYWdhaW4uJywgJ2Vycm9yJyk7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIEV4cG9ydHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmV4cG9ydCB7XG4gIGJ1aWxkUHVibGljYXRpb25zUmV2aWV3VGFibGUsXG4gIGJ1bGtQdWJBY3Rpb24sXG4gIGZpbHRlclB1YmxpY2F0aW9uc1RhYmxlLFxuICBoYW5kbGVQdWJBY3Rpb24sXG4gIHN1Ym1pdFB1YmxpY2F0aW9uRGVjaXNpb25zLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL3Jld3JpdGUtcmV2aWV3LmpzXG4gKiBSZXdyaXRlIHJldmlldyBwYW5lbDogZmV0Y2ggcmV3cml0ZXMsIHJlbmRlciBjYXJkcyB3aXRoIHdvcmQtZGlmZixcbiAqIGFjY2VwdC9lZGl0L3JlamVjdCBkZWNpc2lvbnMsIHN1Ym1pdC5cbiAqXG4gKiBEZXBlbmRlbmNpZXMgKHJlc29sdmVkIHRocm91Z2ggZ2xvYmFsVGhpcyBhdCBydW50aW1lKTpcbiAqICAgYXBwZW5kTG9hZGluZ01lc3NhZ2UsIHJlbW92ZUxvYWRpbmdNZXNzYWdlLCBhcHBlbmRSZXRyeU1lc3NhZ2UsIGFwcGVuZE1lc3NhZ2UsXG4gKiAgIHNldExvYWRpbmcsIHNlbmRBY3Rpb24sIHN3aXRjaFRhYiwgc2NoZWR1bGVBdHNSZWZyZXNoLFxuICogICBlc2NhcGVIdG1sLCBwYXJzZVJld3JpdGVzUmVzcG9uc2UsIFBIQVNFU1xuICovXG5cbmltcG9ydCB7IHN0YXRlTWFuYWdlciB9IGZyb20gJy4vc3RhdGUtbWFuYWdlci5qcyc7XG5cbi8vIE1vZHVsZS1sZXZlbCBzdGF0ZVxubGV0IHJld3JpdGVEZWNpc2lvbnMgPSB7fTtcbmxldCBfcmV3cml0ZVBhbmVsQ2FjaGUgPSBudWxsO1xubGV0IHBlcnN1YXNpb25XYXJuaW5nc0Fja25vd2xlZGdlZCA9IGZhbHNlO1xubGV0IF93YXJuaW5nc0J5UmV3cml0ZUlkID0ge307ICAvLyBNYXAgZnJvbSByZXdyaXRlIGlkIFx1MjE5MiB3YXJuaW5nIGxpc3QgKFBhdGggMSlcbmxldCBfcmVzdG9yZVRvYXN0U2hvd24gPSBmYWxzZTtcblxuZnVuY3Rpb24gc3luY1Jld3JpdGVHbG9iYWxzKCkge1xuICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgd2luZG93LnJld3JpdGVEZWNpc2lvbnMgPSByZXdyaXRlRGVjaXNpb25zO1xuICB3aW5kb3cuX3Jld3JpdGVQYW5lbENhY2hlID0gX3Jld3JpdGVQYW5lbENhY2hlO1xuICB3aW5kb3cuYWNjZXB0QWxsUmV3cml0ZXMgPSBhY2NlcHRBbGxSZXdyaXRlcztcbiAgd2luZG93LnJlamVjdEFsbFJld3JpdGVzID0gcmVqZWN0QWxsUmV3cml0ZXM7XG4gIHdpbmRvdy50b2dnbGVSZXdyaXRlQ29tcGFjdE1vZGUgPSB0b2dnbGVSZXdyaXRlQ29tcGFjdE1vZGU7XG59XG5cbmZ1bmN0aW9uIF9kZWNpc2lvbnNLZXkoKSB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2lkID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKS5nZXQoJ3Nlc3Npb24nKTtcbiAgICByZXR1cm4gc2lkID8gYHJ3X2RlY2lzaW9uc18ke3NpZH1gIDogbnVsbDtcbiAgfSBjYXRjaCAoXykgeyByZXR1cm4gbnVsbDsgfVxufVxuXG5mdW5jdGlvbiBfcGVyc2lzdERlY2lzaW9ucygpIHtcbiAgY29uc3Qga2V5ID0gX2RlY2lzaW9uc0tleSgpO1xuICBpZiAoIWtleSkgcmV0dXJuO1xuICB0cnkgeyBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIEpTT04uc3RyaW5naWZ5KHJld3JpdGVEZWNpc2lvbnMpKTsgfSBjYXRjaCAoXykge31cbn1cblxuLy8gRmFsbGJhY2sgYXVkaXQgZnJvbSB0aGUgbGFzdCAvYXBpL3Jld3JpdGVzIHJlc3BvbnNlIFx1MjAxNCB1c2VkIGZvciBjb2xkLXJlc3RvcmUgKEdBUC0xODYpLlxubGV0IF9iYWNrZW5kUmV3cml0ZUF1ZGl0ID0gW107XG5cbmZ1bmN0aW9uIF9yZXN0b3JlRGVjaXNpb25zKCkge1xuICBjb25zdCBrZXkgPSBfZGVjaXNpb25zS2V5KCk7XG4gIGlmICgha2V5KSByZXR1cm47XG4gIGNvbnN0IGhhZERlY2lzaW9ucyA9IE9iamVjdC5rZXlzKHJld3JpdGVEZWNpc2lvbnMpLmxlbmd0aCA+IDA7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2F2ZWQgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSkgfHwgJ251bGwnKTtcbiAgICBpZiAoc2F2ZWQgJiYgdHlwZW9mIHNhdmVkID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShzYXZlZCkpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24ocmV3cml0ZURlY2lzaW9ucywgc2F2ZWQpO1xuICAgICAgc3luY1Jld3JpdGVHbG9iYWxzKCk7XG4gICAgICBpZiAoIWhhZERlY2lzaW9ucyAmJiAhX3Jlc3RvcmVUb2FzdFNob3duICYmIE9iamVjdC5rZXlzKHJld3JpdGVEZWNpc2lvbnMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgX3Jlc3RvcmVUb2FzdFNob3duID0gdHJ1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBzaG93VG9hc3QoJ1lvdXIgcHJldmlvdXMgcmV3cml0ZSBkZWNpc2lvbnMgaGF2ZSBiZWVuIHJlc3RvcmVkIFx1MjAxNCB5b3UgY2FuIHN0aWxsIGNoYW5nZSB0aGVtLicsICd3YXJuaW5nJywgNjAwMCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH0gY2F0Y2ggKF8pIHt9XG5cbiAgLy8gQ29sZC1yZXN0b3JlIGZhbGxiYWNrOiBzZWVkIGRlY2lzaW9ucyBmcm9tIGJhY2tlbmQgcmV3cml0ZV9hdWRpdCB3aGVuXG4gIC8vIGxvY2FsU3RvcmFnZSBoYXMgbm90aGluZyAoZGlmZmVyZW50IGRldmljZSwgaW5jb2duaXRvLCBjbGVhcmVkIHN0b3JhZ2UpLlxuICBpZiAoX2JhY2tlbmRSZXdyaXRlQXVkaXQubGVuZ3RoID4gMCkge1xuICAgIGZvciAoY29uc3QgZW50cnkgb2YgX2JhY2tlbmRSZXdyaXRlQXVkaXQpIHtcbiAgICAgIGNvbnN0IGlkID0gZW50cnkuaWQ7XG4gICAgICBpZiAoIWlkIHx8ICFlbnRyeS5vdXRjb21lKSBjb250aW51ZTtcbiAgICAgIHJld3JpdGVEZWNpc2lvbnNbaWRdID0ge1xuICAgICAgICBvdXRjb21lOiBlbnRyeS5vdXRjb21lLFxuICAgICAgICBmaW5hbF90ZXh0OiBlbnRyeS5vdXRjb21lID09PSAnZWRpdCcgPyAoZW50cnkuZmluYWwgPz8gbnVsbCkgOiBudWxsLFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKE9iamVjdC5rZXlzKHJld3JpdGVEZWNpc2lvbnMpLmxlbmd0aCA+IDApIHtcbiAgICAgIHN5bmNSZXdyaXRlR2xvYmFscygpO1xuICAgICAgX3BlcnNpc3REZWNpc2lvbnMoKTtcbiAgICAgIGlmICghaGFkRGVjaXNpb25zICYmICFfcmVzdG9yZVRvYXN0U2hvd24pIHtcbiAgICAgICAgX3Jlc3RvcmVUb2FzdFNob3duID0gdHJ1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBzaG93VG9hc3QoJ1lvdXIgcHJldmlvdXMgcmV3cml0ZSBkZWNpc2lvbnMgaGF2ZSBiZWVuIHJlc3RvcmVkIFx1MjAxNCB5b3UgY2FuIHN0aWxsIGNoYW5nZSB0aGVtLicsICd3YXJuaW5nJywgNjAwMCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gX2NsZWFyUGVyc2lzdGVkRGVjaXNpb25zKCkge1xuICBjb25zdCBrZXkgPSBfZGVjaXNpb25zS2V5KCk7XG4gIGlmICgha2V5KSByZXR1cm47XG4gIHRyeSB7IGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7IH0gY2F0Y2ggKF8pIHt9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBSZXdyaXRlIHNuYXBzaG90IChjaGFuZ2VkLWl0ZW0gaGlnaGxpZ2h0aW5nKSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmZ1bmN0aW9uIF9zbmFwc2hvdEtleSgpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzaWQgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpLmdldCgnc2Vzc2lvbicpO1xuICAgIHJldHVybiBzaWQgPyBgcndfc25hcHNob3RfJHtzaWR9YCA6IG51bGw7XG4gIH0gY2F0Y2ggKF8pIHsgcmV0dXJuIG51bGw7IH1cbn1cblxuZnVuY3Rpb24gX3NhdmVSZXdyaXRlU25hcHNob3QocmV3cml0ZXMpIHtcbiAgY29uc3Qga2V5ID0gX3NuYXBzaG90S2V5KCk7XG4gIGlmICgha2V5KSByZXR1cm47XG4gIGNvbnN0IG1hcCA9IHt9O1xuICBmb3IgKGNvbnN0IHIgb2YgcmV3cml0ZXMpIHtcbiAgICBjb25zdCBjYXJkSWQgPSBTdHJpbmcoci5pZCkucmVwbGFjZSgvW15hLXpBLVowLTlfLV0vZywgJ18nKTtcbiAgICBtYXBbY2FyZElkXSA9IHIucHJvcG9zZWQgfHwgJyc7XG4gIH1cbiAgdHJ5IHsgbG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCBKU09OLnN0cmluZ2lmeShtYXApKTsgfSBjYXRjaCAoXykge31cbn1cblxuZnVuY3Rpb24gX2dldFJld3JpdGVTbmFwc2hvdCgpIHtcbiAgY29uc3Qga2V5ID0gX3NuYXBzaG90S2V5KCk7XG4gIGlmICgha2V5KSByZXR1cm4gbnVsbDtcbiAgdHJ5IHsgcmV0dXJuIEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KSB8fCAnbnVsbCcpOyB9IGNhdGNoIChfKSB7IHJldHVybiBudWxsOyB9XG59XG5cbmZ1bmN0aW9uIF9jbGVhclJld3JpdGVTbmFwc2hvdCgpIHtcbiAgY29uc3Qga2V5ID0gX3NuYXBzaG90S2V5KCk7XG4gIGlmICgha2V5KSByZXR1cm47XG4gIHRyeSB7IGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7IH0gY2F0Y2ggKF8pIHt9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoQW5kUmV2aWV3UmV3cml0ZXMoKSB7XG4gIGNvbnN0IGxvYWRpbmdNc2cgPSBhcHBlbmRMb2FkaW5nTWVzc2FnZSgnQ2hlY2tpbmcgZm9yIHRleHQgaW1wcm92ZW1lbnRzLi4uJyk7XG4gIHNldExvYWRpbmcodHJ1ZSwgJ1Jldmlld2luZyByZXdyaXRlc1x1MjAyNicpO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3Jld3JpdGVzJyk7XG4gICAgY29uc3QgZGF0YSA9IHBhcnNlUmV3cml0ZXNSZXNwb25zZShhd2FpdCByZXMuanNvbigpKTtcbiAgICByZW1vdmVMb2FkaW5nTWVzc2FnZShsb2FkaW5nTXNnKTtcbiAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICBpZiAoIXJlcy5vaykge1xuICAgICAgYXBwZW5kUmV0cnlNZXNzYWdlKCdcdTI3NEMgRXJyb3IgY2hlY2tpbmcgcmV3cml0ZXM6ICcgKyAoZGF0YS5lcnJvciB8fCAnVW5rbm93biBlcnJvcicpLCBmZXRjaEFuZFJldmlld1Jld3JpdGVzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmV3cml0ZXMgPSBkYXRhLnJld3JpdGVzIHx8IFtdO1xuICAgIGNvbnN0IHdhcm5pbmdzID0gZGF0YS5wZXJzdWFzaW9uX3dhcm5pbmdzIHx8IFtdOyAgLy8gUGhhc2UgMTBcbiAgICBfYmFja2VuZFJld3JpdGVBdWRpdCA9IGRhdGEucmV3cml0ZV9hdWRpdCB8fCBbXTtcblxuICAgIC8vIFNob3cgcGVyc3Vhc2lvbiB3YXJuaW5ncyBmaXJzdCAoUGhhc2UgMTApXG4gICAgcGVyc3Vhc2lvbldhcm5pbmdzQWNrbm93bGVkZ2VkID0gd2FybmluZ3MubGVuZ3RoID09PSAwOyAgLy8gTWFyayBhY2tub3dsZWRnZWQgaWYgbm8gd2FybmluZ3NcbiAgICBpZiAod2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbXNnID0gYFx1MjZBMFx1RkUwRiAqKiR7d2FybmluZ3MubGVuZ3RofSoqIHBlcnN1YXNpb24gY2hlY2ske3dhcm5pbmdzLmxlbmd0aCA+IDEgPyAncycgOiAnJ30gZmxhZ2dlZC4gUmV2aWV3IHRoZXNlIGJlZm9yZSBzdWJtaXR0aW5nLmA7XG4gICAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCBtc2cpO1xuICAgIH1cblxuICAgIC8vIFNob3cgcmV3cml0ZSByZXZpZXcgcGFuZWxcbiAgICByZXdyaXRlRGVjaXNpb25zID0ge307XG4gICAgc3luY1Jld3JpdGVHbG9iYWxzKCk7XG4gICAgcmVuZGVyUmV3cml0ZVBhbmVsKHJld3JpdGVzLCB3YXJuaW5ncyk7ICAvLyBQYXNzIHdhcm5pbmdzIHRvIHBhbmVsXG4gICAgc3dpdGNoVGFiKCdyZXdyaXRlJyk7XG4gICAgY29uc3QgbiA9IHJld3JpdGVzLmxlbmd0aDtcbiAgICBpZiAobiA9PT0gMCkge1xuICAgICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ1x1MjcwRlx1RkUwRiBObyByZXdyaXRlIHN1Z2dlc3Rpb25zIHdlcmUgbmVlZGVkIFx1MjAxNCB5b3VyIHNlbGVjdGVkIGNvbnRlbnQgYWxyZWFkeSB1c2VzIHRoZSBqb2JcXCdzIHRlcm1pbm9sb2d5IHdlbGwuIFRoZSAqKlJld3JpdGVzKiogdGFiIGlzIHN0aWxsIGF2YWlsYWJsZSBzbyB5b3UgY2FuIGNvbmZpcm0gYW5kIGNvbnRpbnVlIHRvICoqU3BlbGwgQ2hlY2sqKiB3aGVuIHJlYWR5LicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCBgXHUyNzBGXHVGRTBGIFlvdSd2ZSBjb25maXJtZWQgeW91ciBleHBlcmllbmNlLCBza2lsbCwgYW5kIGFjaGlldmVtZW50IHNlbGVjdGlvbnMuIEhlcmUgYXJlIHRoZSBBSSdzICoqJHtufSoqIHRleHQgaW1wcm92ZW1lbnQgc3VnZ2VzdGlvbiR7biA+IDEgPyAncycgOiAnJ30gZm9yIHRoZSBpbmNsdWRlZCBidWxsZXRzIFx1MjAxNCBlYWNoIG9uZSBpbnRyb2R1Y2VzIGpvYi1yZWxldmFudCBrZXl3b3JkcyB3aGlsZSBwcmVzZXJ2aW5nIHlvdXIgZmFjdHMuIFJldmlldyBlYWNoIHN1Z2dlc3Rpb24gaW4gdGhlICoqUmV3cml0ZXMqKiB0YWIsIHRoZW4gYWNjZXB0LCBlZGl0LCBvciByZWplY3QgYmVmb3JlIGNvbnRpbnVpbmcgdG8gc3BlbGwgY2hlY2suYCk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZW1vdmVMb2FkaW5nTWVzc2FnZShsb2FkaW5nTXNnKTtcbiAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICBhcHBlbmRSZXRyeU1lc3NhZ2UoJ1x1Mjc0QyBFcnJvcjogJyArIGVyci5tZXNzYWdlLCBmZXRjaEFuZFJldmlld1Jld3JpdGVzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfcmVuZGVyUmV3cml0ZUF1ZGl0TG9nKCkge1xuICBpZiAoIV9iYWNrZW5kUmV3cml0ZUF1ZGl0IHx8IF9iYWNrZW5kUmV3cml0ZUF1ZGl0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuICcnO1xuXG4gIGNvbnN0IE9VVENPTUVfSUNPTiA9IHsgYWNjZXB0OiAnXHUyNzA1JywgcmVqZWN0OiAnXHUyNzRDJywgZWRpdDogJ1x1MjcwRlx1RkUwRicgfTtcbiAgY29uc3QgT1VUQ09NRV9MQUJFTCA9IHsgYWNjZXB0OiAnQWNjZXB0ZWQnLCByZWplY3Q6ICdSZWplY3RlZCcsIGVkaXQ6ICdFZGl0ZWQnIH07XG5cbiAgY29uc3Qgcm93cyA9IF9iYWNrZW5kUmV3cml0ZUF1ZGl0Lm1hcChlbnRyeSA9PiB7XG4gICAgY29uc3QgaWNvbiAgPSBPVVRDT01FX0lDT05bZW50cnkub3V0Y29tZV0gfHwgJ1x1Mjc1Myc7XG4gICAgY29uc3QgbGFiZWwgPSBPVVRDT01FX0xBQkVMW2VudHJ5Lm91dGNvbWVdIHx8IGVudHJ5Lm91dGNvbWU7XG4gICAgY29uc3QgbG9jICAgPSBlc2NhcGVIdG1sKGVudHJ5LmxvY2F0aW9uIHx8IGVudHJ5LmZpZWxkIHx8ICcnKTtcbiAgICBjb25zdCBvcmlnICA9IGVzY2FwZUh0bWwoZW50cnkub3JpZ2luYWwgfHwgJycpO1xuICAgIGNvbnN0IHByb3AgID0gZXNjYXBlSHRtbChlbnRyeS5wcm9wb3NlZCB8fCAnJyk7XG4gICAgY29uc3QgZmluICAgPSBlbnRyeS5vdXRjb21lID09PSAnZWRpdCcgJiYgZW50cnkuZmluYWxcbiAgICAgID8gYDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOjRweDtjb2xvcjojMWQ0ZWQ4O2ZvbnQtc2l6ZTowLjg1ZW07XCI+RmluYWw6ICR7ZXNjYXBlSHRtbChlbnRyeS5maW5hbCl9PC9kaXY+YFxuICAgICAgOiAnJztcbiAgICByZXR1cm4gYFxuICAgICAgPGRpdiBzdHlsZT1cImJvcmRlci1ib3R0b206MXB4IHNvbGlkICNlMmU4ZjA7cGFkZGluZzo4cHggMDtmb250LXNpemU6MC44OGVtO1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6NnB4O21hcmdpbi1ib3R0b206NHB4O1wiPlxuICAgICAgICAgIDxzcGFuIHRpdGxlPVwiJHtsYWJlbH1cIj4ke2ljb259PC9zcGFuPlxuICAgICAgICAgIDxzdHJvbmcgc3R5bGU9XCJjb2xvcjojMzc0MTUxO1wiPiR7bGFiZWx9PC9zdHJvbmc+XG4gICAgICAgICAgJHtsb2MgPyBgPHNwYW4gc3R5bGU9XCJjb2xvcjojOWNhM2FmO2ZvbnQtc2l6ZTowLjg1ZW07XCI+XHUyMDE0ICR7bG9jfTwvc3Bhbj5gIDogJyd9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IHN0eWxlPVwiY29sb3I6IzZiNzI4MDt0ZXh0LWRlY29yYXRpb246bGluZS10aHJvdWdoO2ZvbnQtc2l6ZTowLjg1ZW07XCI+JHtvcmlnfTwvZGl2PlxuICAgICAgICA8ZGl2IHN0eWxlPVwiY29sb3I6IzM3NDE1MTtmb250LXNpemU6MC44NWVtO1wiPiR7cHJvcH08L2Rpdj5cbiAgICAgICAgJHtmaW59XG4gICAgICA8L2Rpdj5gO1xuICB9KS5qb2luKCcnKTtcblxuICByZXR1cm4gYFxuICAgIDxkZXRhaWxzIHN0eWxlPVwibWFyZ2luLXRvcDoyNHB4O2JvcmRlcjoxcHggc29saWQgI2UyZThmMDtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjEycHggMTZweDtcIj5cbiAgICAgIDxzdW1tYXJ5IHN0eWxlPVwiY3Vyc29yOnBvaW50ZXI7Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOiMzNzQxNTE7bGlzdC1zdHlsZTpub25lO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDtcIj5cbiAgICAgICAgPHNwYW4+XHVEODNEXHVEQ0NCPC9zcGFuPlxuICAgICAgICA8c3Bhbj5SZXdyaXRlIEF1ZGl0IExvZyAoJHtfYmFja2VuZFJld3JpdGVBdWRpdC5sZW5ndGh9IGRlY2lzaW9uJHtfYmFja2VuZFJld3JpdGVBdWRpdC5sZW5ndGggPT09IDEgPyAnJyA6ICdzJ30pPC9zcGFuPlxuICAgICAgICA8c3BhbiBzdHlsZT1cIm1hcmdpbi1sZWZ0OmF1dG87Y29sb3I6IzljYTNhZjtmb250LXNpemU6MC44NWVtO1wiPlx1MjVCQyBzaG93PC9zcGFuPlxuICAgICAgPC9zdW1tYXJ5PlxuICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6MTJweDtcIj4ke3Jvd3N9PC9kaXY+XG4gICAgPC9kZXRhaWxzPmA7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclJld3JpdGVQYW5lbChyZXdyaXRlcywgd2FybmluZ3MgPSBbXSkge1xuICBfcmV3cml0ZVBhbmVsQ2FjaGUgPSB7IHJld3JpdGVzLCB3YXJuaW5ncyB9O1xuICAvLyBCdWlsZCBwZXItY2FyZCB3YXJuaW5nIGluZGV4IGZvciBQYXRoIDEgYmFkZ2VzXG4gIF93YXJuaW5nc0J5UmV3cml0ZUlkID0ge307XG4gIGZvciAoY29uc3QgdyBvZiB3YXJuaW5ncykge1xuICAgIGlmICghX3dhcm5pbmdzQnlSZXdyaXRlSWRbdy5pZF0pIF93YXJuaW5nc0J5UmV3cml0ZUlkW3cuaWRdID0gW107XG4gICAgX3dhcm5pbmdzQnlSZXdyaXRlSWRbdy5pZF0ucHVzaCh3KTtcbiAgfVxuICBzeW5jUmV3cml0ZUdsb2JhbHMoKTtcbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIGNvbnN0IGhhc1Jld3JpdGVzID0gcmV3cml0ZXMubGVuZ3RoID4gMDtcblxuICAvLyBCdWlsZCBwZXJzdWFzaW9uIHdhcm5pbmdzIHNlY3Rpb24gKFBoYXNlIDEwKVxuICBsZXQgd2FybmluZ3NIdG1sID0gJyc7XG4gIGlmICh3YXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3Qgd2FybmluZ3NCeVR5cGUgPSB7fTtcbiAgICB3YXJuaW5ncy5mb3JFYWNoKHcgPT4ge1xuICAgICAgaWYgKCF3YXJuaW5nc0J5VHlwZVt3LmZsYWdfdHlwZV0pIHdhcm5pbmdzQnlUeXBlW3cuZmxhZ190eXBlXSA9IDA7XG4gICAgICB3YXJuaW5nc0J5VHlwZVt3LmZsYWdfdHlwZV0rKztcbiAgICB9KTtcbiAgICBjb25zdCB3YXJuaW5nQ291bnRzID0gT2JqZWN0LmVudHJpZXMod2FybmluZ3NCeVR5cGUpXG4gICAgICAubWFwKChbdHlwZSwgY291bnRdKSA9PiBgJHtjb3VudH0gJHt0eXBlLnJlcGxhY2UoL18vZywgJyAnKX1gKVxuICAgICAgLmpvaW4oJywgJyk7XG5cbiAgICB3YXJuaW5nc0h0bWwgPSBgXG4gICAgICA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZmVmMmYyO2JvcmRlcjoxcHggc29saWQgI2ZlY2FjYTtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjE0cHg7bWFyZ2luLWJvdHRvbToyMHB4O1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTBweDttYXJnaW4tYm90dG9tOjEwcHg7Y3Vyc29yOnBvaW50ZXI7XCIgb25jbGljaz1cInRoaXMucGFyZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yKCcjd2FybmluZ3MtZGV0YWlsJykuc3R5bGUuZGlzcGxheSA9IHRoaXMucGFyZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yKCcjd2FybmluZ3MtZGV0YWlsJykuc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnID8gJ2Jsb2NrJyA6ICdub25lJztcIj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZToyMHB4O1wiPlx1MjZBMFx1RkUwRjwvc3Bhbj5cbiAgICAgICAgICA8c3Ryb25nIHN0eWxlPVwiY29sb3I6Izk5MWIxYjtcIj5QZXJzdWFzaW9uIGNoZWNrczogJHt3YXJuaW5nQ291bnRzfTwvc3Ryb25nPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwibWFyZ2luLWxlZnQ6YXV0bztjb2xvcjojN2YxZDFkO1wiPlx1MjVCQzwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJ3YXJuaW5ncy1kZXRhaWxcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTttYXJnaW4tdG9wOjEwcHg7cGFkZGluZy10b3A6MTBweDtib3JkZXItdG9wOjFweCBzb2xpZCAjZmVjYWNhO1wiPlxuICAgICAgICAgICR7d2FybmluZ3MubWFwKHcgPT4gYFxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6OHB4O21hcmdpbi1ib3R0b206OHB4O2JhY2tncm91bmQ6I2ZmZjdlZDtib3JkZXItbGVmdDozcHggc29saWQgI2Y5NzMxNjtib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6MC45ZW07XCI+XG4gICAgICAgICAgICAgIDxzdHJvbmc+JHt3LmZsYWdfdHlwZS5yZXBsYWNlKC9fL2csICcgJyl9PC9zdHJvbmc+IGF0ICR7dy5sb2NhdGlvbn08YnI+XG4gICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6IzdjMmQxMjtcIj4ke3cuZGV0YWlsc308L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBgKS5qb2luKCcnKX1cbiAgICAgICAgICA8YnV0dG9uIHN0eWxlPVwibWFyZ2luLXRvcDoxMHB4O3BhZGRpbmc6OHB4IDEycHg7YmFja2dyb3VuZDojOTkxYjFiO2NvbG9yOndoaXRlO2JvcmRlcjpub25lO2JvcmRlci1yYWRpdXM6NHB4O2N1cnNvcjpwb2ludGVyO1wiIG9uY2xpY2s9XCJzZXRQZXJzdWFzaW9uV2FybmluZ3NBY2tub3dsZWRnZWQodHJ1ZSk7IHRoaXMucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMC42JzsgdXBkYXRlUmV3cml0ZVRhbGx5KCk7XCI+XG4gICAgICAgICAgICBcdTI3MTMgQWNrbm93bGVkZ2VkXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxuXG4gIC8vIENvbXB1dGUgcGVyLWNhcmQgY2hhbmdlIHN0YXR1cyByZWxhdGl2ZSB0byBwcmV2aW91cyByZW5kZXIncyBzbmFwc2hvdC5cbiAgY29uc3QgcHJldlNuYXBzaG90ID0gX2dldFJld3JpdGVTbmFwc2hvdCgpO1xuICBjb25zdCBjaGFuZ2VTdGF0dXNNYXAgPSB7fTtcbiAgaWYgKHByZXZTbmFwc2hvdCkge1xuICAgIGZvciAoY29uc3QgciBvZiByZXdyaXRlcykge1xuICAgICAgY29uc3QgY2FyZElkID0gU3RyaW5nKHIuaWQpLnJlcGxhY2UoL1teYS16QS1aMC05Xy1dL2csICdfJyk7XG4gICAgICBpZiAoIShjYXJkSWQgaW4gcHJldlNuYXBzaG90KSkge1xuICAgICAgICBjaGFuZ2VTdGF0dXNNYXBbY2FyZElkXSA9ICduZXcnO1xuICAgICAgfSBlbHNlIGlmIChwcmV2U25hcHNob3RbY2FyZElkXSAhPT0gKHIucHJvcG9zZWQgfHwgJycpKSB7XG4gICAgICAgIGNoYW5nZVN0YXR1c01hcFtjYXJkSWRdID0gJ3VwZGF0ZWQnO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvLyBTYXZlIGN1cnJlbnQgcmV3cml0ZXMgYXMgc25hcHNob3QgZm9yIG5leHQgcmVuZGVyIGNvbXBhcmlzb24uXG4gIF9zYXZlUmV3cml0ZVNuYXBzaG90KHJld3JpdGVzKTtcblxuICBjb250ZW50LmlubmVySFRNTCA9IHdhcm5pbmdzSHRtbCArIGBcbiAgICA8ZGl2IGlkPVwicmV3cml0ZS1wYW5lbFwiPlxuICAgICAgPGgxPlx1MjcwRlx1RkUwRiBSZXZpZXcgVGV4dCBJbXByb3ZlbWVudHM8L2gxPlxuICAgICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO21hcmdpbi1ib3R0b206MjBweDtcIj5cbiAgICAgICAgJHtoYXNSZXdyaXRlc1xuICAgID8gJ1JldmlldyBlYWNoIHN1Z2dlc3RlZCB0ZXh0IGltcHJvdmVtZW50LiBBY2NlcHQsIGVkaXQsIG9yIHJlamVjdCBhbGwgc3VnZ2VzdGlvbnMgYmVmb3JlIHByb2NlZWRpbmcgdG8gc3BlbGwgY2hlY2suJ1xuICAgIDogJ05vIHRleHQgaW1wcm92ZW1lbnRzIHdlcmUgc3VnZ2VzdGVkIGZvciB0aGlzIENWLiBDb250aW51ZSB3aGVuIHlvdSBhcmUgcmVhZHkgdG8gbW92ZSB0byBzcGVsbCBjaGVjay4nfVxuICAgICAgPC9wPlxuICAgICAgPGRpdiBjbGFzcz1cInJld3JpdGUtdGFsbHktYmFyXCIgaWQ9XCJyZXdyaXRlLXRhbGx5XCIgJHtoYXNSZXdyaXRlcyA/ICcnIDogJ3N0eWxlPVwiZGlzcGxheTpub25lXCInfT5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0YWxseS1hY2NlcHRlZFwiPlx1MjcxMyBBY2NlcHRlZDogPHN0cm9uZyBpZD1cInRhbGx5LWFjY2VwdGVkXCI+MDwvc3Ryb25nPjwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0YWxseS1yZWplY3RlZFwiPlx1MjcxNyBSZWplY3RlZDogPHN0cm9uZyBpZD1cInRhbGx5LXJlamVjdGVkXCI+MDwvc3Ryb25nPjwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0YWxseS1wZW5kaW5nXCI+XHUyM0YzIFBlbmRpbmc6IDxzdHJvbmcgaWQ9XCJ0YWxseS1wZW5kaW5nXCI+JHtyZXdyaXRlcy5sZW5ndGh9PC9zdHJvbmc+PC9zcGFuPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwicnctYnVsay1idG5cIiBvbmNsaWNrPVwiYWNjZXB0QWxsUmV3cml0ZXMoKVwiIHRpdGxlPVwiQWNjZXB0IGFsbCBwZW5kaW5nIHN1Z2dlc3Rpb25zXCI+XHUyNzEzIEFjY2VwdCBBbGw8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInJ3LWJ1bGstYnRuIHJ3LWJ1bGstcmVqZWN0XCIgb25jbGljaz1cInJlamVjdEFsbFJld3JpdGVzKClcIiB0aXRsZT1cIlJlamVjdCBhbGwgcGVuZGluZyBzdWdnZXN0aW9uc1wiPlx1MjcxNyBSZWplY3QgQWxsPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJydy1jb21wYWN0LXRvZ2dsZVwiIGlkPVwicnctY29tcGFjdC1idG5cIiBvbmNsaWNrPVwidG9nZ2xlUmV3cml0ZUNvbXBhY3RNb2RlKClcIiB0aXRsZT1cIlN3aXRjaCB0byBjb21wYWN0IHNpbmdsZS1saW5lIHZpZXcgZm9yIHJhcGlkIHJldmlld1wiPlx1MjI5RSBDb21wYWN0PC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJzdWJtaXQtcmV3cml0ZXMtYnRuXCIgaWQ9XCJzdWJtaXQtcmV3cml0ZXMtYnRuXCIgZGlzYWJsZWRcbiAgICAgICAgICAgICAgICBvbmNsaWNrPVwic3VibWl0UmV3cml0ZURlY2lzaW9ucygpXCI+U3VibWl0IEFsbCBEZWNpc2lvbnM8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBpZD1cInJld3JpdGUtY2FyZHNcIj5cbiAgICAgICAgJHtoYXNSZXdyaXRlc1xuICAgID8gcmV3cml0ZXMubWFwKHIgPT4ge1xuICAgICAgICBjb25zdCBjYXJkSWQgPSBTdHJpbmcoci5pZCkucmVwbGFjZSgvW15hLXpBLVowLTlfLV0vZywgJ18nKTtcbiAgICAgICAgcmV0dXJuIHJlbmRlclJld3JpdGVDYXJkKHIsIF93YXJuaW5nc0J5UmV3cml0ZUlkW3IuaWRdIHx8IFtdLCBjaGFuZ2VTdGF0dXNNYXBbY2FyZElkXSB8fCBudWxsKTtcbiAgICAgIH0pLmpvaW4oJycpXG4gICAgOiBgXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImVtcHR5LXN0YXRlXCIgc3R5bGU9XCJtYXJnaW4tdG9wOjI0cHg7XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWNvblwiPlx1MjcwRlx1RkUwRjwvZGl2PlxuICAgICAgICAgICAgPGgzPk5vIFJld3JpdGUgU3VnZ2VzdGlvbnM8L2gzPlxuICAgICAgICAgICAgPHA+VGhpcyBkcmFmdCBhbHJlYWR5IHBhc3NlcyB0aGUgcmV3cml0ZSBzdGFnZSB3aXRob3V0IHN1Z2dlc3RlZCB3b3JkaW5nIGNoYW5nZXMuPC9wPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInN1Ym1pdC1idG5cIiBpZD1cInN1Ym1pdC1yZXdyaXRlcy1idG5cIiBvbmNsaWNrPVwic3VibWl0UmV3cml0ZURlY2lzaW9ucygpXCI+Q29udGludWUgdG8gU3BlbGwgQ2hlY2s8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgYH1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgICR7X3JlbmRlclJld3JpdGVBdWRpdExvZygpfVxuICBgO1xuXG4gIC8vIFJlc3RvcmUgZGVjaXNpb25zIHBlcnNpc3RlZCBmcm9tIGEgcHJldmlvdXMgcGFnZSBsb2FkIChHQVAtMTY2KS5cbiAgX3Jlc3RvcmVEZWNpc2lvbnMoKTtcbiAgLy8gUmUtYXBwbHkgYW55IGRlY2lzaW9ucyBtYWRlIGJlZm9yZSB0aGUgbGFzdCB0YWIgbmF2aWdhdGlvbi5cbiAgaWYgKE9iamVjdC5rZXlzKHJld3JpdGVEZWNpc2lvbnMpLmxlbmd0aCA+IDApIHtcbiAgICBmb3IgKGNvbnN0IFtpZCwgZGVjXSBvZiBPYmplY3QuZW50cmllcyhyZXdyaXRlRGVjaXNpb25zKSkge1xuICAgICAgaWYgKCFkZWMgfHwgIWRlYy5vdXRjb21lKSBjb250aW51ZTtcbiAgICAgIGlmIChkZWMub3V0Y29tZSA9PT0gJ2VkaXQnICYmIGRlYy5maW5hbF90ZXh0ICE9IG51bGwpIHtcbiAgICAgICAgLy8gRW50ZXIgZWRpdCBtb2RlLCBpbmplY3QgdGhlIHNhdmVkIHRleHQsIHRoZW4gc2F2ZSBzbyB0aGUgY2FyZFxuICAgICAgICAvLyBzaG93cyBhcyBhY2NlcHRlZCB3aXRoIHRoZSBjb3JyZWN0IGRpZmYgcmVuZGVyZWQuXG4gICAgICAgIGFwcGx5UmV3cml0ZUFjdGlvbihpZCwgJ2VkaXQnKTtcbiAgICAgICAgY29uc3QgdGEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcnctdGV4dGFyZWEtJHtpZH1gKTtcbiAgICAgICAgaWYgKHRhKSB7XG4gICAgICAgICAgdGEudmFsdWUgPSBkZWMuZmluYWxfdGV4dDtcbiAgICAgICAgICBzYXZlUmV3cml0ZUVkaXQoaWQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhcHBseVJld3JpdGVBY3Rpb24oaWQsIGRlYy5vdXRjb21lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdXBkYXRlUmV3cml0ZVRhbGx5KCk7XG4gIH1cbn1cblxuLyoqXG4gKiBjb21wdXRlV29yZERpZmYob3JpZ2luYWwsIHByb3Bvc2VkKSBcdTIwMTQgTENTIHdvcmQtbGV2ZWwgZGlmZi5cbiAqXG4gKiBUb2tlbmlzZXMgYm90aCBzdHJpbmdzIGJ5IHNwbGl0dGluZyBvbiB3aGl0ZXNwYWNlIGJvdW5kYXJpZXMgd2hpbGVcbiAqIHByZXNlcnZpbmcgdGhlIHdoaXRlc3BhY2UgdG9rZW5zIHNvIHRoZSByZW5kZXJlZCBkaWZmIGhhcyB0aGUgc2FtZVxuICogc3BhY2luZyBhcyB0aGUgc291cmNlIHRleHQuICBSZXR1cm5zIGFuIGFycmF5IG9mXG4gKiB7dG9rZW46IHN0cmluZywgdHlwZTogJ3VuY2hhbmdlZCd8J3JlbW92ZWQnfCdhZGRlZCd9LlxuICovXG5mdW5jdGlvbiBjb21wdXRlV29yZERpZmYob3JpZ2luYWwsIHByb3Bvc2VkKSB7XG4gIC8vIFNwbGl0IG9uIHdoaXRlc3BhY2UgYnV0IGtlZXAgdGhlIHNlcGFyYXRvcnMgYXMgdG9rZW5zLlxuICBmdW5jdGlvbiB0b2tlbml6ZShzdHIpIHsgcmV0dXJuIChzdHIgfHwgJycpLnNwbGl0KC8oXFxzKykvKTsgfVxuXG4gIGNvbnN0IGEgPSB0b2tlbml6ZShvcmlnaW5hbCk7XG4gIGNvbnN0IGIgPSB0b2tlbml6ZShwcm9wb3NlZCk7XG4gIGNvbnN0IG0gPSBhLmxlbmd0aDtcbiAgY29uc3QgbiA9IGIubGVuZ3RoO1xuXG4gIC8vIEJ1aWxkIExDUyBEUCB0YWJsZSAoTyhtKm4pIFx1MjAxNCBhY2NlcHRhYmxlIGZvciBDViBidWxsZXQgbGVuZ3RocykuXG4gIGNvbnN0IGRwID0gQXJyYXkuZnJvbSh7bGVuZ3RoOiBtICsgMX0sICgpID0+IG5ldyBBcnJheShuICsgMSkuZmlsbCgwKSk7XG4gIGZvciAobGV0IGkgPSAxOyBpIDw9IG07IGkrKykge1xuICAgIGZvciAobGV0IGogPSAxOyBqIDw9IG47IGorKykge1xuICAgICAgZHBbaV1bal0gPSBhW2kgLSAxXSA9PT0gYltqIC0gMV1cbiAgICAgICAgPyBkcFtpIC0gMV1baiAtIDFdICsgMVxuICAgICAgICA6IE1hdGgubWF4KGRwW2kgLSAxXVtqXSwgZHBbaV1baiAtIDFdKTtcbiAgICB9XG4gIH1cblxuICAvLyBCYWNrdHJhY2sgdG8gcHJvZHVjZSB0aGUgZGlmZiBzZXF1ZW5jZS5cbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGxldCBpID0gbSwgaiA9IG47XG4gIHdoaWxlIChpID4gMCB8fCBqID4gMCkge1xuICAgIGlmIChpID4gMCAmJiBqID4gMCAmJiBhW2kgLSAxXSA9PT0gYltqIC0gMV0pIHtcbiAgICAgIHJlc3VsdC51bnNoaWZ0KHt0b2tlbjogYVtpIC0gMV0sIHR5cGU6ICd1bmNoYW5nZWQnfSk7XG4gICAgICBpLS07IGotLTtcbiAgICB9IGVsc2UgaWYgKGogPiAwICYmIChpID09PSAwIHx8IGRwW2ldW2ogLSAxXSA+PSBkcFtpIC0gMV1bal0pKSB7XG4gICAgICByZXN1bHQudW5zaGlmdCh7dG9rZW46IGJbaiAtIDFdLCB0eXBlOiAnYWRkZWQnfSk7XG4gICAgICBqLS07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC51bnNoaWZ0KHt0b2tlbjogYVtpIC0gMV0sIHR5cGU6ICdyZW1vdmVkJ30pO1xuICAgICAgaS0tO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKiogUmVuZGVyIGEge3Rva2VuLCB0eXBlfSBkaWZmIGFycmF5IGludG8gYW4gSFRNTCBzdHJpbmcuICovXG5mdW5jdGlvbiByZW5kZXJEaWZmSHRtbCh0b2tlbnMpIHtcbiAgcmV0dXJuIHRva2Vucy5tYXAodCA9PiB7XG4gICAgaWYgKHQudHlwZSA9PT0gJ3JlbW92ZWQnKSByZXR1cm4gYDxkZWwgY2xhc3M9XCJkaWZmLXJlbW92ZWRcIj4ke2VzY2FwZUh0bWwodC50b2tlbil9PC9kZWw+YDtcbiAgICBpZiAodC50eXBlID09PSAnYWRkZWQnKSAgIHJldHVybiBgPGlucyBjbGFzcz1cImRpZmYtYWRkZWRcIj4ke2VzY2FwZUh0bWwodC50b2tlbil9PC9pbnM+YDtcbiAgICByZXR1cm4gZXNjYXBlSHRtbCh0LnRva2VuKTtcbiAgfSkuam9pbignJyk7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclJld3JpdGVDYXJkKHIsIGNhcmRXYXJuaW5ncyA9IFtdLCBjaGFuZ2VTdGF0dXMgPSBudWxsKSB7XG4gIGNvbnN0IGlzV2Vha1NraWxsQWRkID0gci50eXBlID09PSAnc2tpbGxfYWRkJyAmJiByLmV2aWRlbmNlX3N0cmVuZ3RoID09PSAnd2Vhayc7XG4gIGNvbnN0IHdlYWtCYWRnZSAgICAgPSBpc1dlYWtTa2lsbEFkZFxuICAgID8gYDxzcGFuIGNsYXNzPVwid2Vhay1iYWRnZVwiPlx1MjZBMCBDYW5kaWRhdGUgdG8gY29uZmlybTwvc3Bhbj5gXG4gICAgOiAnJztcbiAgY29uc3QgY2hhbmdlQmFkZ2UgICA9IGNoYW5nZVN0YXR1cyA9PT0gJ25ldydcbiAgICA/IGA8c3BhbiBjbGFzcz1cInJ3LWNoYW5nZS1iYWRnZSBydy1jaGFuZ2UtbmV3XCIgYXJpYS1sYWJlbD1cIk5ldyBzdWdnZXN0aW9uIG5vdCBpbiBwcmV2aW91cyBydW5cIj5cdUQ4M0NcdUREOTUgTmV3PC9zcGFuPmBcbiAgICA6IGNoYW5nZVN0YXR1cyA9PT0gJ3VwZGF0ZWQnXG4gICAgICA/IGA8c3BhbiBjbGFzcz1cInJ3LWNoYW5nZS1iYWRnZSBydy1jaGFuZ2UtdXBkYXRlZFwiIGFyaWEtbGFiZWw9XCJTdWdnZXN0aW9uIGNoYW5nZWQgc2luY2UgcHJldmlvdXMgcnVuXCI+XHUyMUJCIFVwZGF0ZWQ8L3NwYW4+YFxuICAgICAgOiAnJztcbiAgLy8gS2V5d29yZCBwaWxscyB3aXRoIHBvc2l0aW9uLWJhc2VkIHJhbmsgYmFkZ2UgKCMxLCAjMiwgXHUyMDI2KVxuICBjb25zdCBrZXl3b3JkUGlsbHMgID0gKHIua2V5d29yZHNfaW50cm9kdWNlZCB8fCBbXSlcbiAgICAubWFwKChrLCBpZHgpID0+IGA8c3BhbiBjbGFzcz1cInJld3JpdGUta2V5d29yZFwiPjxzcGFuIGNsYXNzPVwia3ctcmFua1wiPiMke2lkeCArIDF9PC9zcGFuPiR7ZXNjYXBlSHRtbChrKX08L3NwYW4+YClcbiAgICAuam9pbignJyk7XG4gIGNvbnN0IHR5cGVMYWJlbCA9IChyLnR5cGUgfHwgJ3Jld3JpdGUnKS5yZXBsYWNlKC9fL2csICcgJyk7XG4gIC8vIFNhbml0aXplIElEOiBrZWVwIG9ubHkgYWxwaGFudW1lcmljLCB1bmRlcnNjb3JlLCBhbmQgaHlwaGVuIHNvIGl0IGlzXG4gIC8vIHNhZmUgYXMgYm90aCBhbiBIVE1MIGF0dHJpYnV0ZSB2YWx1ZSBhbmQgYSBKUyBzdHJpbmcgbGl0ZXJhbCBpbiBvbmNsaWNrLlxuICBjb25zdCBjYXJkSWQgICAgPSBTdHJpbmcoci5pZCkucmVwbGFjZSgvW15hLXpBLVowLTlfLV0vZywgJ18nKTtcblxuICAvLyBDb21wdXRlIHdvcmQtbGV2ZWwgZGlmZiBmb3IgdGhlIGlubGluZSBkaXNwbGF5LlxuICBjb25zdCBkaWZmVG9rZW5zID0gY29tcHV0ZVdvcmREaWZmKHIub3JpZ2luYWwgfHwgJycsIHIucHJvcG9zZWQgfHwgJycpO1xuICBjb25zdCBkaWZmSHRtbCAgID0gcmVuZGVyRGlmZkh0bWwoZGlmZlRva2Vucyk7XG5cbiAgcmV0dXJuIGBcbiAgICA8ZGl2IGNsYXNzPVwicmV3cml0ZS1jYXJkXCIgaWQ9XCJydy1jYXJkLSR7Y2FyZElkfVwiPlxuICAgICAgPGRpdiBjbGFzcz1cInJld3JpdGUtY2FyZC1oZWFkZXJcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXdyaXRlLWNhcmQtdHlwZVwiPiR7ZXNjYXBlSHRtbCh0eXBlTGFiZWwpfTwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXdyaXRlLWNhcmQtdGl0bGVcIj4ke2VzY2FwZUh0bWwoci5sb2NhdGlvbiB8fCByLmlkKX08L3NwYW4+XG4gICAgICAgICR7d2Vha0JhZGdlfSR7Y2hhbmdlQmFkZ2V9XG4gICAgICAgIDxzcGFuIGlkPVwicnctZGVjaXNpb24tYmFkZ2UtJHtjYXJkSWR9XCIgYXJpYS1saXZlPVwicG9saXRlXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7Zm9udC1zaXplOjAuNzhlbTtmb250LXdlaWdodDo2MDA7cGFkZGluZzoxcHggN3B4O2JvcmRlci1yYWRpdXM6OXB4O21hcmdpbi1sZWZ0OmF1dG87XCI+PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwicmV3cml0ZS1jYXJkLWJvZHlcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJld3JpdGUtaW5saW5lLWRpZmZcIiBpZD1cInJ3LWRpZmYtJHtjYXJkSWR9XCJcbiAgICAgICAgICAgICBkYXRhLW9yaWdpbmFsPVwiJHtlc2NhcGVIdG1sKHIub3JpZ2luYWwgfHwgJycpfVwiPiR7ZGlmZkh0bWx9PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyZXdyaXRlLWFmdGVyXCIgaWQ9XCJydy1hZnRlci0ke2NhcmRJZH1cIiBzdHlsZT1cImRpc3BsYXk6bm9uZVwiPlxuICAgICAgICAgIDxzcGFuIGlkPVwicnctYWZ0ZXItdGV4dC0ke2NhcmRJZH1cIj4ke2VzY2FwZUh0bWwoci5wcm9wb3NlZCB8fCAnJyl9PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgJHtrZXl3b3JkUGlsbHMgPyBgPGRpdiBjbGFzcz1cInJld3JpdGUta2V5d29yZHNcIj4ke2tleXdvcmRQaWxsc308L2Rpdj5gIDogJyd9XG4gICAgICAgICR7ci5yYXRpb25hbGUgPyBgXG4gICAgICAgIDxkZXRhaWxzIGNsYXNzPVwicmV3cml0ZS1yYXRpb25hbGVcIj5cbiAgICAgICAgICA8c3VtbWFyeT5SYXRpb25hbGUgJmFtcDsgRXZpZGVuY2U8L3N1bW1hcnk+XG4gICAgICAgICAgPHAgc3R5bGU9XCJtYXJnaW46NnB4IDAgMDtcIj4ke2VzY2FwZUh0bWwoci5yYXRpb25hbGUpfTwvcD5cbiAgICAgICAgICAke3IuZXZpZGVuY2UgPyBgPHAgc3R5bGU9XCJjb2xvcjojOWNhM2FmO2ZvbnQtc2l6ZTowLjg1ZW07bWFyZ2luOjRweCAwIDA7XCI+JHtlc2NhcGVIdG1sKHIuZXZpZGVuY2UpfTwvcD5gIDogJyd9XG4gICAgICAgIDwvZGV0YWlscz5gIDogJyd9XG4gICAgICAgICR7Y2FyZFdhcm5pbmdzLmxlbmd0aCA+IDAgPyBgXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyZXdyaXRlLXBlcnN1YXNpb24tYmFkZ2VzXCI+XG4gICAgICAgICAgJHtjYXJkV2FybmluZ3MubWFwKHcgPT4gYDxzcGFuIGNsYXNzPVwicGVyc3Vhc2lvbi1iYWRnZSBwZXJzdWFzaW9uLWJhZGdlLS0ke3cuc2V2ZXJpdHl9XCIgdGl0bGU9XCIke2VzY2FwZUh0bWwody5kZXRhaWxzKX1cIj5cdTI2QTAgJHtlc2NhcGVIdG1sKHcuZmxhZ190eXBlLnJlcGxhY2UoL18vZywgJyAnKSl9PC9zcGFuPmApLmpvaW4oJycpfVxuICAgICAgICA8L2Rpdj5gIDogJyd9XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyZXdyaXRlLWFjdGlvbnNcIj5cbiAgICAgICAgICA8YSBjbGFzcz1cInJ3LWJhY2stbGlua1wiIGhyZWY9XCIjXCIgb25jbGljaz1cImV2ZW50LnByZXZlbnREZWZhdWx0KCk7IHN3aXRjaFRhYignY3VzdG9taXphdGlvbnMnKVwiIHRpdGxlPVwiR28gYmFjayB0byBDdXN0b21pc2UgdG8gcmVjb25zaWRlciB3aGV0aGVyIHRvIGluY2x1ZGUgdGhpcyBjb250ZW50XCI+XHUyMUE5IFJlY29uc2lkZXIgaW5jbHVzaW9uPC9hPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJydy1idG4gYWNjZXB0XCIgaWQ9XCJydy1hY2NlcHQtJHtjYXJkSWR9XCIgYXJpYS1wcmVzc2VkPVwiZmFsc2VcIiBvbmNsaWNrPVwiYXBwbHlSZXdyaXRlQWN0aW9uKCcke2NhcmRJZH0nLCAnYWNjZXB0JylcIj5cdTI3MTMgQWNjZXB0PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInJ3LWJ0biBlZGl0XCIgICBpZD1cInJ3LWVkaXQtJHtjYXJkSWR9XCIgICBhcmlhLXByZXNzZWQ9XCJmYWxzZVwiIG9uY2xpY2s9XCJhcHBseVJld3JpdGVBY3Rpb24oJyR7Y2FyZElkfScsICdlZGl0JylcIj5cdTI3MEUgRWRpdDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJydy1idG4gcmVqZWN0XCIgaWQ9XCJydy1yZWplY3QtJHtjYXJkSWR9XCIgYXJpYS1wcmVzc2VkPVwiZmFsc2VcIiBvbmNsaWNrPVwiYXBwbHlSZXdyaXRlQWN0aW9uKCcke2NhcmRJZH0nLCAncmVqZWN0JylcIj5cdTI3MTcgUmVqZWN0PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+YDtcbn1cblxuZnVuY3Rpb24gYXBwbHlSZXdyaXRlQWN0aW9uKGlkLCBvdXRjb21lKSB7XG4gIGNvbnN0IGNhcmQgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcnctY2FyZC0ke2lkfWApO1xuICBjb25zdCBhZnRlckVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHJ3LWFmdGVyLSR7aWR9YCk7XG4gIGNvbnN0IGRpZmZFbCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcnctZGlmZi0ke2lkfWApO1xuICBpZiAoIWNhcmQgfHwgIWFmdGVyRWwpIHJldHVybjtcblxuICAvLyBDbGVhciBhbnkgcHJldmlvdXMgb3V0Y29tZSBzdHlsaW5nXG4gIGNhcmQuY2xhc3NMaXN0LnJlbW92ZSgnYWNjZXB0ZWQnLCAncmVqZWN0ZWQnKTtcbiAgWydhY2NlcHQnLCAnZWRpdCcsICdyZWplY3QnXS5mb3JFYWNoKGEgPT4ge1xuICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBydy0ke2F9LSR7aWR9YCk7XG4gICAgYnRuPy5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICBpZiAoYnRuKSBidG4uc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCAnZmFsc2UnKTtcbiAgfSk7XG4gIGNvbnN0IF9kZWNpc2lvbkJhZGdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHJ3LWRlY2lzaW9uLWJhZGdlLSR7aWR9YCk7XG4gIGlmIChfZGVjaXNpb25CYWRnZSkgX2RlY2lzaW9uQmFkZ2Uuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICBpZiAob3V0Y29tZSA9PT0gJ2VkaXQnKSB7XG4gICAgLy8gS2VlcCB0aGUgaW5saW5lIGRpZmYgdmlzaWJsZSBhcyBhIHJlZmVyZW5jZTsgc2hvdyB0aGUgZWRpdGFibGUgdGV4dGFyZWEgYmVsb3cgaXQuXG4gICAgY29uc3QgY3VycmVudFRleHQgPSBhZnRlckVsLnF1ZXJ5U2VsZWN0b3IoYCNydy1hZnRlci10ZXh0LSR7aWR9YCk/LnRleHRDb250ZW50XG4gICAgICAgICAgICAgICAgICAgICA/PyByZXdyaXRlRGVjaXNpb25zW2lkXT8uZmluYWxfdGV4dFxuICAgICAgICAgICAgICAgICAgICAgPz8gJyc7XG4gICAgaWYgKGRpZmZFbCkge1xuICAgICAgZGlmZkVsLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIGRpZmZFbC5zdHlsZS5vcGFjaXR5ID0gJzAuNTUnO1xuICAgICAgZGlmZkVsLnN0eWxlLmJvcmRlckxlZnQgPSAnM3B4IHNvbGlkICM5M2M1ZmQnO1xuICAgIH1cbiAgICBhZnRlckVsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgIGFmdGVyRWwuaW5uZXJIVE1MID0gYFxuICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjc4ZW07Y29sb3I6IzZiNzI4MDttYXJnaW4tYm90dG9tOjRweDtcIj5cdTI3MEUgWW91ciBlZGl0IChBSSBzdWdnZXN0aW9uIHNob3duIGFib3ZlIGZvciByZWZlcmVuY2UpOjwvZGl2PlxuICAgICAgPHRleHRhcmVhIGlkPVwicnctdGV4dGFyZWEtJHtpZH1cIj4ke2VzY2FwZUh0bWwoY3VycmVudFRleHQpfTwvdGV4dGFyZWE+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwicnctc2F2ZS1lZGl0LWJ0blwiIHN0eWxlPVwibWFyZ2luLXRvcDo2cHhcIlxuICAgICAgICAgICAgICBvbmNsaWNrPVwic2F2ZVJld3JpdGVFZGl0KCcke2lkfScpXCI+U2F2ZTwvYnV0dG9uPlxuICAgIGA7XG4gICAgY29uc3QgZWRpdEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBydy1lZGl0LSR7aWR9YCk7XG4gICAgZWRpdEJ0bj8uY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgaWYgKGVkaXRCdG4pIGVkaXRCdG4uc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCAndHJ1ZScpO1xuICAgIC8vIERlY2lzaW9uIGlzIHJlY29yZGVkIG9ubHkgd2hlbiB0aGUgdXNlciBjbGlja3MgU2F2ZVxuICB9IGVsc2Uge1xuICAgIC8vIFJlc3RvcmUgdGhlIGFmdGVyLXRleHQgc3BhbiBpZiB3ZSBwcmV2aW91c2x5IGVudGVyZWQgZWRpdCBtb2RlXG4gICAgY29uc3QgdGV4dGFyZWEgPSBhZnRlckVsLnF1ZXJ5U2VsZWN0b3IoJ3RleHRhcmVhJyk7XG4gICAgaWYgKHRleHRhcmVhKSB7XG4gICAgICBjb25zdCB0eHQgPSB0ZXh0YXJlYS52YWx1ZTtcbiAgICAgIGFmdGVyRWwuaW5uZXJIVE1MID0gYDxzcGFuIGlkPVwicnctYWZ0ZXItdGV4dC0ke2lkfVwiPiR7ZXNjYXBlSHRtbCh0eHQpfTwvc3Bhbj5gO1xuICAgIH1cbiAgICAvLyBSZS1zaG93IHRoZSBpbmxpbmUgZGlmZiBwYW5lbCBhdCBmdWxsIG9wYWNpdHk7IGhpZGUgdGhlIGVkaXQgYXJlYS5cbiAgICBpZiAoZGlmZkVsKSB7IGRpZmZFbC5zdHlsZS5kaXNwbGF5ID0gJyc7IGRpZmZFbC5zdHlsZS5vcGFjaXR5ID0gJyc7IGRpZmZFbC5zdHlsZS5ib3JkZXJMZWZ0ID0gJyc7IH1cbiAgICBhZnRlckVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICByZXdyaXRlRGVjaXNpb25zW2lkXSA9IHsgb3V0Y29tZSwgZmluYWxfdGV4dDogbnVsbCB9O1xuICAgIF9wZXJzaXN0RGVjaXNpb25zKCk7XG4gICAgY2FyZC5jbGFzc0xpc3QuYWRkKG91dGNvbWUgPT09ICdhY2NlcHQnID8gJ2FjY2VwdGVkJyA6ICdyZWplY3RlZCcpO1xuICAgIGNvbnN0IGFjdGl2ZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBydy0ke291dGNvbWV9LSR7aWR9YCk7XG4gICAgYWN0aXZlQnRuPy5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICBpZiAoYWN0aXZlQnRuKSBhY3RpdmVCdG4uc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCAndHJ1ZScpO1xuICAgIGNvbnN0IGRlY0JhZGdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHJ3LWRlY2lzaW9uLWJhZGdlLSR7aWR9YCk7XG4gICAgaWYgKGRlY0JhZGdlKSB7XG4gICAgICBkZWNCYWRnZS50ZXh0Q29udGVudCA9IG91dGNvbWUgPT09ICdhY2NlcHQnID8gJ1x1MjcxMyBBY2NlcHRlZCcgOiAnXHUyNzE3IFJlamVjdGVkJztcbiAgICAgIGRlY0JhZGdlLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIGRlY0JhZGdlLnN0eWxlLmJhY2tncm91bmQgPSBvdXRjb21lID09PSAnYWNjZXB0JyA/ICcjYmJmN2QwJyA6ICcjZmVjYWNhJztcbiAgICAgIGRlY0JhZGdlLnN0eWxlLmNvbG9yICAgICAgPSBvdXRjb21lID09PSAnYWNjZXB0JyA/ICcjMDY1ZjQ2JyA6ICcjOTkxYjFiJztcbiAgICB9XG4gICAgc3luY1Jld3JpdGVHbG9iYWxzKCk7XG4gICAgdXBkYXRlUmV3cml0ZVRhbGx5KCk7XG4gICAgX3Njcm9sbFRvTmV4dFBlbmRpbmdSZXdyaXRlKGlkKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfc2Nyb2xsVG9OZXh0UGVuZGluZ1Jld3JpdGUoYWZ0ZXJJZCkge1xuICBjb25zdCBhbGxDYXJkcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tpZF49XCJydy1jYXJkLVwiXScpO1xuICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBjYXJkIG9mIGFsbENhcmRzKSB7XG4gICAgY29uc3QgaWQgPSBjYXJkLmlkLnJlcGxhY2UoJ3J3LWNhcmQtJywgJycpO1xuICAgIGlmIChpZCA9PT0gYWZ0ZXJJZCkgeyBmb3VuZCA9IHRydWU7IGNvbnRpbnVlOyB9XG4gICAgaWYgKCFmb3VuZCkgY29udGludWU7XG4gICAgaWYgKCFyZXdyaXRlRGVjaXNpb25zW2lkXSkge1xuICAgICAgY2FyZC5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJywgYmxvY2s6ICdjZW50ZXInIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzYXZlUmV3cml0ZUVkaXQoaWQpIHtcbiAgY29uc3QgdGV4dGFyZWEgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBydy10ZXh0YXJlYS0ke2lkfWApO1xuICBjb25zdCBlZGl0ZWRUZXh0ID0gdGV4dGFyZWEgPyB0ZXh0YXJlYS52YWx1ZSA6ICcnO1xuICBjb25zdCBhZnRlckVsICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHJ3LWFmdGVyLSR7aWR9YCk7XG4gIGNvbnN0IGRpZmZFbCAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcnctZGlmZi0ke2lkfWApO1xuICBjb25zdCBjYXJkICAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHJ3LWNhcmQtJHtpZH1gKTtcbiAgaWYgKCFhZnRlckVsIHx8ICFjYXJkKSByZXR1cm47XG5cbiAgLy8gUmVwbGFjZSB0ZXh0YXJlYSB3aXRoIGZpbmFsIHNwYW4gKGhpZGRlbiBcdTIwMTQgcHJlc2VydmVzIHRleHQgZm9yIGZ1dHVyZSBlZGl0cykuXG4gIGFmdGVyRWwuaW5uZXJIVE1MID0gYDxzcGFuIGlkPVwicnctYWZ0ZXItdGV4dC0ke2lkfVwiPiR7ZXNjYXBlSHRtbChlZGl0ZWRUZXh0KX08L3NwYW4+YDtcbiAgYWZ0ZXJFbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gIC8vIFJlZ2VuZXJhdGUgdGhlIGlubGluZSBkaWZmIGFnYWluc3QgdGhlIG9yaWdpbmFsIHRleHQgYW5kIHJlLXNob3cgaXQgKGZ1bGwgb3BhY2l0eSkuXG4gIGlmIChkaWZmRWwpIHtcbiAgICBjb25zdCBvcmlnaW5hbCA9IGRpZmZFbC5kYXRhc2V0Lm9yaWdpbmFsIHx8ICcnO1xuICAgIGRpZmZFbC5pbm5lckhUTUwgPSByZW5kZXJEaWZmSHRtbChjb21wdXRlV29yZERpZmYob3JpZ2luYWwsIGVkaXRlZFRleHQpKTtcbiAgICBkaWZmRWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgIGRpZmZFbC5zdHlsZS5vcGFjaXR5ID0gJyc7XG4gICAgZGlmZkVsLnN0eWxlLmJvcmRlckxlZnQgPSAnJztcbiAgfVxuXG4gIHJld3JpdGVEZWNpc2lvbnNbaWRdID0geyBvdXRjb21lOiAnZWRpdCcsIGZpbmFsX3RleHQ6IGVkaXRlZFRleHQgfTtcbiAgX3BlcnNpc3REZWNpc2lvbnMoKTtcbiAgY2FyZC5jbGFzc0xpc3QucmVtb3ZlKCdyZWplY3RlZCcpO1xuICBjYXJkLmNsYXNzTGlzdC5hZGQoJ2FjY2VwdGVkJyk7XG4gIFsnYWNjZXB0JywgJ3JlamVjdCddLmZvckVhY2goYSA9PiB7XG4gICAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHJ3LSR7YX0tJHtpZH1gKTtcbiAgICBidG4/LmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgIGlmIChidG4pIGJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsICdmYWxzZScpO1xuICB9KTtcbiAgY29uc3Qgc2F2ZUVkaXRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcnctZWRpdC0ke2lkfWApO1xuICBzYXZlRWRpdEJ0bj8uY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gIGlmIChzYXZlRWRpdEJ0bikgc2F2ZUVkaXRCdG4uc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCAndHJ1ZScpO1xuICBjb25zdCBlZGl0RGVjQmFkZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcnctZGVjaXNpb24tYmFkZ2UtJHtpZH1gKTtcbiAgaWYgKGVkaXREZWNCYWRnZSkge1xuICAgIGVkaXREZWNCYWRnZS50ZXh0Q29udGVudCA9ICdcdTI3MTMgQWNjZXB0ZWQgKGVkaXRlZCknO1xuICAgIGVkaXREZWNCYWRnZS5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgZWRpdERlY0JhZGdlLnN0eWxlLmJhY2tncm91bmQgPSAnI2JiZjdkMCc7XG4gICAgZWRpdERlY0JhZGdlLnN0eWxlLmNvbG9yICAgICAgPSAnIzA2NWY0Nic7XG4gIH1cbiAgc3luY1Jld3JpdGVHbG9iYWxzKCk7XG4gIHVwZGF0ZVJld3JpdGVUYWxseSgpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVSZXdyaXRlVGFsbHkoKSB7XG4gIGNvbnN0IGNhcmRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnJld3JpdGUtY2FyZCcpO1xuICBsZXQgYWNjZXB0ZWQgPSAwLCByZWplY3RlZCA9IDAsIHBlbmRpbmcgPSAwO1xuICBjYXJkcy5mb3JFYWNoKGNhcmQgPT4ge1xuICAgIGNvbnN0IGlkICA9IGNhcmQuaWQucmVwbGFjZSgncnctY2FyZC0nLCAnJyk7XG4gICAgY29uc3QgZGVjID0gcmV3cml0ZURlY2lzaW9uc1tpZF07XG4gICAgaWYgICAgICAoIWRlYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZysrO1xuICAgIGVsc2UgaWYgKGRlYy5vdXRjb21lID09PSAnYWNjZXB0JyB8fCBkZWMub3V0Y29tZSA9PT0gJ2VkaXQnKSBhY2NlcHRlZCsrO1xuICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdGVkKys7XG4gIH0pO1xuXG4gIGNvbnN0IGFjY2VwdGVkRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFsbHktYWNjZXB0ZWQnKTtcbiAgY29uc3QgcmVqZWN0ZWRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWxseS1yZWplY3RlZCcpO1xuICBjb25zdCBwZW5kaW5nRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFsbHktcGVuZGluZycpO1xuXG4gIGlmIChhY2NlcHRlZEVsKSBhY2NlcHRlZEVsLnRleHRDb250ZW50ID0gYWNjZXB0ZWQ7XG4gIGlmIChyZWplY3RlZEVsKSByZWplY3RlZEVsLnRleHRDb250ZW50ID0gcmVqZWN0ZWQ7XG4gIGlmIChwZW5kaW5nRWwpIHBlbmRpbmdFbC50ZXh0Q29udGVudCAgPSBwZW5kaW5nO1xuXG4gIGNvbnN0IHN1Ym1pdEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdWJtaXQtcmV3cml0ZXMtYnRuJyk7XG4gIGlmIChzdWJtaXRCdG4pIHtcbiAgICBjb25zdCBuZWVkc0FjayA9ICFwZXJzdWFzaW9uV2FybmluZ3NBY2tub3dsZWRnZWQ7XG4gICAgc3VibWl0QnRuLmRpc2FibGVkID0gKHBlbmRpbmcgPiAwKSB8fCBuZWVkc0FjaztcbiAgICBzdWJtaXRCdG4udGl0bGUgPSBuZWVkc0Fja1xuICAgICAgPyAnQWNrbm93bGVkZ2UgdGhlIHBlcnN1YXNpb24gd2FybmluZ3MgYWJvdmUgYmVmb3JlIHN1Ym1pdHRpbmcnXG4gICAgICA6ICcnO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN1Ym1pdFJld3JpdGVEZWNpc2lvbnMoKSB7XG4gIGlmICghcGVyc3Vhc2lvbldhcm5pbmdzQWNrbm93bGVkZ2VkKSB7XG4gICAgY29uc3QgcHJvY2VlZCA9IGF3YWl0IHNob3dDb25maXJtTW9kYWwoXG4gICAgICAnXHUyNkEwXHVGRTBGIFBlcnN1YXNpb24gQ2hlY2tzJyxcbiAgICAgICdUaGVyZSBhcmUgdW5hY2tub3dsZWRnZWQgcGVyc3Vhc2lvbiB3YXJuaW5ncy4gSXQgaXMgcmVjb21tZW5kZWQgeW91IHJldmlldyBhbmQgYWNrbm93bGVkZ2UgdGhlbSBmaXJzdC5cXG5cXG5Qcm9jZWVkIGFueXdheT8nLFxuICAgICAgJ1N1Ym1pdCBBbnl3YXknXG4gICAgKTtcbiAgICBpZiAoIXByb2NlZWQpIHJldHVybjtcbiAgfVxuICAvKiBkdWNrZmxvdzpcbiAgICogICBpZDogcmV3cml0ZV91aV9zdWJtaXRfbGl2ZVxuICAgKiAgIGtpbmQ6IHVpXG4gICAqICAgdGltZXN0YW1wOiAnMjAyNi0wMy0yNVQyMTozOTo0OFonXG4gICAqICAgc3RhdHVzOiBsaXZlXG4gICAqICAgaGFuZGxlczpcbiAgICogICAtIHVpOnJld3JpdGUtcmV2aWV3LnN1Ym1pdFxuICAgKiAgIGNhbGxzOlxuICAgKiAgIC0gUE9TVCAvYXBpL3Jld3JpdGVzL2FwcHJvdmVcbiAgICogICAtIFBPU1QgL2FwaS9jdi9sYXlvdXQtZXN0aW1hdGVcbiAgICogICByZWFkczpcbiAgICogICAtIHdpbmRvdzpyZXdyaXRlRGVjaXNpb25zXG4gICAqICAgd3JpdGVzOlxuICAgKiAgIC0gcmVxdWVzdDpQT1NUIC9hcGkvcmV3cml0ZXMvYXBwcm92ZS5kZWNpc2lvbnNcbiAgICogICBub3RlczogU3VibWl0cyB0aGUgZmluYWwgcGVyLXJld3JpdGUgb3V0Y29tZXMgYW5kIGVkaXRlZCB0ZXh0IHNvIGJhY2tlbmQgc3RhdGUgY2FuIHBlcnNpc3QgYXBwcm92ZWQgcmV3cml0ZXMgYW5kIHRoZSBmdWxsIHJld3JpdGUgYXVkaXQgYmVmb3JlIHNwZWxsLWNoZWNrLlxuICAgKi9cbiAgY29uc3QgZGVjaXNpb25zID0gT2JqZWN0LmVudHJpZXMocmV3cml0ZURlY2lzaW9ucykubWFwKChbaWQsIGRlY10pID0+ICh7XG4gICAgaWQsXG4gICAgb3V0Y29tZTogICAgZGVjLm91dGNvbWUsXG4gICAgZmluYWxfdGV4dDogZGVjLmZpbmFsX3RleHQgPz8gbnVsbFxuICB9KSk7XG5cbiAgY29uc3QgbG9hZGluZ01zZyA9IGFwcGVuZExvYWRpbmdNZXNzYWdlKCdTdWJtaXR0aW5nIHJld3JpdGUgZGVjaXNpb25zLi4uJyk7XG4gIHNldExvYWRpbmcodHJ1ZSwgJ1N1Ym1pdHRpbmcgcmV3cml0ZSBkZWNpc2lvbnNcdTIwMjYnKTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9yZXdyaXRlcy9hcHByb3ZlJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgZGVjaXNpb25zIH0pXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgcmVtb3ZlTG9hZGluZ01lc3NhZ2UobG9hZGluZ01zZyk7XG4gICAgc2V0TG9hZGluZyhmYWxzZSk7XG5cbiAgICBpZiAoIXJlcy5vaykge1xuICAgICAgYXBwZW5kUmV0cnlNZXNzYWdlKCdcdTI3NEMgRXJyb3I6ICcgKyAoZGF0YS5lcnJvciB8fCAnRmFpbGVkIHRvIHN1Ym1pdCByZXdyaXRlIGRlY2lzaW9ucycpLCBzdWJtaXRSZXdyaXRlRGVjaXNpb25zKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBhY2NlcHRlZCA9IGRhdGEuYXBwcm92ZWRfY291bnQgfHwgMDtcbiAgICBjb25zdCByZWplY3RlZCA9IGRhdGEucmVqZWN0ZWRfY291bnQgfHwgMDtcbiAgICBzdGF0ZU1hbmFnZXIubWFya0NvbnRlbnRDaGFuZ2VkKCk7XG4gICAgX2NsZWFyUGVyc2lzdGVkRGVjaXNpb25zKCk7XG4gICAgX2NsZWFyUmV3cml0ZVNuYXBzaG90KCk7XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgYFx1MjcwNSBSZXdyaXRlIGRlY2lzaW9ucyByZWNvcmRlZDogJHthY2NlcHRlZH0gYWNjZXB0ZWQsICR7cmVqZWN0ZWR9IHJlamVjdGVkLiBTdGFydGluZyBzcGVsbCBjaGVja1x1MjAyNmApO1xuICAgIHNjaGVkdWxlQXRzUmVmcmVzaCgncmV2aWV3X2NoZWNrcG9pbnQnKTtcbiAgICBzd2l0Y2hUYWIoJ3NwZWxsJyk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJlbW92ZUxvYWRpbmdNZXNzYWdlKGxvYWRpbmdNc2cpO1xuICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgIGFwcGVuZFJldHJ5TWVzc2FnZSgnXHUyNzRDIEVycm9yOiAnICsgZXJyLm1lc3NhZ2UsIHN1Ym1pdFJld3JpdGVEZWNpc2lvbnMpO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFeHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuZnVuY3Rpb24gc2V0UGVyc3Vhc2lvbldhcm5pbmdzQWNrbm93bGVkZ2VkKHZhbHVlKSB7XG4gIHBlcnN1YXNpb25XYXJuaW5nc0Fja25vd2xlZGdlZCA9IHZhbHVlO1xufVxuXG4vKiogQnVsay1hY2NlcHQgYWxsIHBlbmRpbmcgcmV3cml0ZSBjYXJkcy4gKi9cbmZ1bmN0aW9uIGFjY2VwdEFsbFJld3JpdGVzKCkge1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucmV3cml0ZS1jYXJkJykuZm9yRWFjaChjYXJkID0+IHtcbiAgICBjb25zdCBpZCA9IGNhcmQuaWQucmVwbGFjZSgncnctY2FyZC0nLCAnJyk7XG4gICAgaWYgKCFyZXdyaXRlRGVjaXNpb25zW2lkXSkgYXBwbHlSZXdyaXRlQWN0aW9uKGlkLCAnYWNjZXB0Jyk7XG4gIH0pO1xuICB1cGRhdGVSZXdyaXRlVGFsbHkoKTtcbn1cblxuLyoqIEJ1bGstcmVqZWN0IGFsbCBwZW5kaW5nIHJld3JpdGUgY2FyZHMuICovXG5mdW5jdGlvbiByZWplY3RBbGxSZXdyaXRlcygpIHtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnJld3JpdGUtY2FyZCcpLmZvckVhY2goY2FyZCA9PiB7XG4gICAgY29uc3QgaWQgPSBjYXJkLmlkLnJlcGxhY2UoJ3J3LWNhcmQtJywgJycpO1xuICAgIGlmICghcmV3cml0ZURlY2lzaW9uc1tpZF0pIGFwcGx5UmV3cml0ZUFjdGlvbihpZCwgJ3JlamVjdCcpO1xuICB9KTtcbiAgdXBkYXRlUmV3cml0ZVRhbGx5KCk7XG59XG5cbi8qKiBUb2dnbGUgY29tcGFjdCAoc2luZ2xlLWxpbmUpIGNhcmQgZGlzcGxheSBmb3IgcmFwaWQgcmV2aWV3LiAqL1xuZnVuY3Rpb24gdG9nZ2xlUmV3cml0ZUNvbXBhY3RNb2RlKCkge1xuICBjb25zdCBjYXJkcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXdyaXRlLWNhcmRzJyk7XG4gIGNvbnN0IGJ0biAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3J3LWNvbXBhY3QtYnRuJyk7XG4gIGlmICghY2FyZHMpIHJldHVybjtcbiAgY29uc3QgaXNDb21wYWN0ID0gY2FyZHMuY2xhc3NMaXN0LnRvZ2dsZSgnY29tcGFjdC1tb2RlJyk7XG4gIGlmIChidG4pIHtcbiAgICBidG4uY2xhc3NMaXN0LnRvZ2dsZSgnYWN0aXZlJywgaXNDb21wYWN0KTtcbiAgICBidG4udGV4dENvbnRlbnQgPSBpc0NvbXBhY3QgPyAnXHUyMjlGIEZ1bGwgVmlldycgOiAnXHUyMjlFIENvbXBhY3QnO1xuICAgIGJ0bi50aXRsZSA9IGlzQ29tcGFjdCA/ICdTd2l0Y2ggdG8gZnVsbCBjYXJkIHZpZXcnIDogJ1N3aXRjaCB0byBjb21wYWN0IHNpbmdsZS1saW5lIHZpZXcgZm9yIHJhcGlkIHJldmlldyc7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgcmV3cml0ZURlY2lzaW9ucyxcbiAgX3Jld3JpdGVQYW5lbENhY2hlLFxuICBwZXJzdWFzaW9uV2FybmluZ3NBY2tub3dsZWRnZWQsXG4gIHNldFBlcnN1YXNpb25XYXJuaW5nc0Fja25vd2xlZGdlZCxcbiAgZmV0Y2hBbmRSZXZpZXdSZXdyaXRlcyxcbiAgcmVuZGVyUmV3cml0ZVBhbmVsLFxuICBjb21wdXRlV29yZERpZmYsXG4gIHJlbmRlckRpZmZIdG1sLFxuICByZW5kZXJSZXdyaXRlQ2FyZCxcbiAgYXBwbHlSZXdyaXRlQWN0aW9uLFxuICBzYXZlUmV3cml0ZUVkaXQsXG4gIHVwZGF0ZVJld3JpdGVUYWxseSxcbiAgc3VibWl0UmV3cml0ZURlY2lzaW9ucyxcbiAgYWNjZXB0QWxsUmV3cml0ZXMsXG4gIHJlamVjdEFsbFJld3JpdGVzLFxuICB0b2dnbGVSZXdyaXRlQ29tcGFjdE1vZGUsXG59O1xuXG5zeW5jUmV3cml0ZUdsb2JhbHMoKTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL3NwZWxsLWNoZWNrLmpzXG4gKiBTcGVsbCAmIGdyYW1tYXIgY2hlY2sgdGFiOiBmZXRjaCBzZWN0aW9ucywgcmVuZGVyIHN1Z2dlc3Rpb25zLFxuICogYXBwbHkvZGlzbWlzcyBjb3JyZWN0aW9ucywgc3VibWl0IGF1ZGl0LlxuICpcbiAqIERlcGVuZGVuY2llcyAocmVzb2x2ZWQgdGhyb3VnaCBnbG9iYWxUaGlzIGF0IHJ1bnRpbWUpOlxuICogICBlc2NhcGVIdG1sLCBhcHBlbmRMb2FkaW5nTWVzc2FnZSwgcmVtb3ZlTG9hZGluZ01lc3NhZ2UsIGFwcGVuZE1lc3NhZ2UsXG4gKiAgIHNob3dBbGVydE1vZGFsLCBzaG93Q29uZmlybU1vZGFsLCBzZXRMb2FkaW5nLCBmZXRjaFN0YXR1cywgc2VuZEFjdGlvbixcbiAqICAgc2NoZWR1bGVBdHNSZWZyZXNoLCBDU1NcbiAqL1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5jb25zdCBsb2cgPSBnZXRMb2dnZXIoJ3NwZWxsLWNoZWNrJyk7XG5cbmltcG9ydCB7IHN0YXRlTWFuYWdlciB9IGZyb20gJy4vc3RhdGUtbWFuYWdlci5qcyc7XG5cbi8vIE1vZHVsZS1sZXZlbCBzdGF0ZVxubGV0IHNwZWxsQXVkaXQgPSBbXTtcbmxldCBfc3BlbGxDaGVja0NhY2hlID0gbnVsbDtcblxuLy8gXHUyNTAwXHUyNTAwIFBvcHVsYXRlIHNwZWxsLWNoZWNrIHRhYiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gcG9wdWxhdGVTcGVsbENoZWNrVGFiKCkge1xuICAvLyBJZiB3ZSBoYXZlIGNhY2hlZCByZXN1bHRzIGZyb20gYSBwcmV2aW91cyBydW4sIHJlLXJlbmRlciBmcm9tIGNhY2hlXG4gIC8vIGluc3RlYWQgb2YgcmUtcnVubmluZyBMYW5ndWFnZVRvb2wgb24gZXZlcnkgYmFjay1uYXZpZ2F0aW9uLlxuICBpZiAod2luZG93Ll9zcGVsbENoZWNrQ2FjaGUpIHtcbiAgICBjb25zdCBjID0gd2luZG93Ll9zcGVsbENoZWNrQ2FjaGU7XG4gICAgaWYgKGMudHlwZSA9PT0gJ3plcm8nKSB7XG4gICAgICByZW5kZXJTcGVsbENoZWNrWmVyb1N0YXRlKGMubWVzc2FnZSwgYy5zdGF0c0xpbmUsIGMuY3VzdG9tRGljdFNpemUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgICAgICA8aDE+XHVEODNEXHVERDI0IFNwZWxsICZhbXA7IEdyYW1tYXIgQ2hlY2s8L2gxPlxuICAgICAgICA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7bWFyZ2luLWJvdHRvbToyNHB4O1wiPlJldmlldyBzcGVsbGluZyBhbmQgZ3JhbW1hciBzdWdnZXN0aW9ucy48L3A+XG4gICAgICAgIDxkaXYgaWQ9XCJzcGVsbC1yZXN1bHRzXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+PC9kaXY+XG4gICAgICBgO1xuICAgICAgcmVuZGVyU3BlbGxTdWdnZXN0aW9ucyhjLmZsYWdnZWRTZWN0aW9ucywgYy50b3RhbFNlY3Rpb25zLCBjLnN0YXRzLCBjLmN1c3RvbURpY3RTaXplKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgIDxoMT5cdUQ4M0RcdUREMjQgU3BlbGwgJmFtcDsgR3JhbW1hciBDaGVjazwvaDE+XG4gICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO21hcmdpbi1ib3R0b206MjRweDtcIj5DaGVja2luZyBDViBzZWN0aW9ucyBmb3Igc3BlbGxpbmcgYW5kIGdyYW1tYXIgaXNzdWVzXHUyMDI2PC9wPlxuICAgIDxkaXYgaWQ9XCJzcGVsbC1sb2FkaW5nXCIgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjtwYWRkaW5nOjQwcHg7XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibG9hZGluZy1zcGlubmVyXCI+PC9kaXY+XG4gICAgICA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7bWFyZ2luLXRvcDoxMnB4O1wiPlJ1bm5pbmcgTGFuZ3VhZ2VUb29sIGNoZWNrc1x1MjAyNjwvcD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGlkPVwic3BlbGwtcmVzdWx0c1wiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPjwvZGl2PlxuICBgO1xuICBzcGVsbEF1ZGl0ID0gW107XG4gIHdpbmRvdy5fc3BlbGxTdWdNYXAgPSB7fTtcblxuICB0cnkge1xuICAgIC8vIEZldGNoIHNlY3Rpb25zIHRvIGNoZWNrXG4gICAgY29uc3Qgc2VjdGlvbnNSZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9zcGVsbC1jaGVjay1zZWN0aW9ucycpO1xuICAgIGNvbnN0IHNlY3Rpb25zRGF0YSA9IGF3YWl0IHNlY3Rpb25zUmVzLmpzb24oKTtcbiAgICBpZiAoIXNlY3Rpb25zRGF0YS5vaykge1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NwZWxsLWxvYWRpbmcnKS5pbm5lckhUTUwgPSBgPHAgY2xhc3M9XCJlcnJvci1tZXNzYWdlXCI+RmFpbGVkIHRvIGxvYWQgc2VjdGlvbnM6ICR7c2VjdGlvbnNEYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yJ308L3A+YDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZWN0aW9ucyA9IHNlY3Rpb25zRGF0YS5zZWN0aW9ucyB8fCBbXTtcbiAgICBpZiAoc2VjdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZW5kZXJTcGVsbENoZWNrWmVyb1N0YXRlKCdObyBDViBzZWN0aW9ucyBhcmUgYXZhaWxhYmxlIHRvIGNoZWNrLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGVhY2ggc2VjdGlvblxuICAgIGNvbnN0IGZsYWdnZWRTZWN0aW9ucyA9IFtdO1xuICAgIGNvbnN0IGFnZ3JlZ2F0ZVN0YXRzID0gc2VjdGlvbnNEYXRhLmFnZ3JlZ2F0ZV9zdGF0cyB8fCB7fTtcbiAgICBsZXQgaW5jb3JyZWN0V29yZHMgPSAwO1xuICAgIGxldCBncmFtbWFySXNzdWVzID0gMDtcbiAgICBsZXQgY3VzdG9tRGljdFNpemUgPSBzZWN0aW9uc0RhdGEuY3VzdG9tX2RpY3Rfc2l6ZSB8fCAwO1xuICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBzZWN0aW9ucykge1xuICAgICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL3NwZWxsLWNoZWNrJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgdGV4dDogc2VjdGlvbi50ZXh0LCBjb250ZXh0OiBzZWN0aW9uLmNvbnRleHQgfSlcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5zdGF0cykge1xuICAgICAgICBpZiAoZGF0YS5jdXN0b21fZGljdF9zaXplKSBjdXN0b21EaWN0U2l6ZSA9IGRhdGEuY3VzdG9tX2RpY3Rfc2l6ZTtcbiAgICAgICAgaW5jb3JyZWN0V29yZHMgKz0gZGF0YS5zdGF0cy51bmtub3duX3dvcmRfY291bnQgfHwgMDtcbiAgICAgICAgZ3JhbW1hcklzc3VlcyArPSBkYXRhLnN0YXRzLmdyYW1tYXJfaXNzdWVfY291bnQgfHwgMDtcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhLm9rICYmIGRhdGEuc3VnZ2VzdGlvbnMgJiYgZGF0YS5zdWdnZXN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZsYWdnZWRTZWN0aW9ucy5wdXNoKHsgc2VjdGlvbiwgc3VnZ2VzdGlvbnM6IGRhdGEuc3VnZ2VzdGlvbnMgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NwZWxsLWxvYWRpbmcnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgaWYgKGZsYWdnZWRTZWN0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJlbmRlclNwZWxsQ2hlY2taZXJvU3RhdGUoXG4gICAgICAgICdTcGVsbCBjaGVjayBwYXNzZWQgXHUyMDE0IG5vIGlzc3VlcyBmb3VuZC4nLFxuICAgICAgICBidWlsZFNwZWxsU3RhdHNTdW1tYXJ5KHtcbiAgICAgICAgICB0b3RhbF9zZWN0aW9uczogc2VjdGlvbnMubGVuZ3RoLFxuICAgICAgICAgIHRvdGFsX3dvcmRzOiBhZ2dyZWdhdGVTdGF0cy53b3JkX2NvdW50IHx8IDAsXG4gICAgICAgICAgdW5pcXVlX3dvcmRzOiBhZ2dyZWdhdGVTdGF0cy51bmlxdWVfd29yZHMgfHwgMCxcbiAgICAgICAgICBjdXN0b21fZGljdF93b3JkczogYWdncmVnYXRlU3RhdHMuY3VzdG9tX2RpY3Rfd29yZHMgfHwgMCxcbiAgICAgICAgICBpbmNvcnJlY3Rfd29yZHM6IGluY29ycmVjdFdvcmRzLFxuICAgICAgICAgIGdyYW1tYXJfaXNzdWVzOiBncmFtbWFySXNzdWVzLFxuICAgICAgICB9KSxcbiAgICAgICAgY3VzdG9tRGljdFNpemUsXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFJlbmRlciBzdWdnZXN0aW9ucyBwYW5lbFxuICAgIHJlbmRlclNwZWxsU3VnZ2VzdGlvbnMoZmxhZ2dlZFNlY3Rpb25zLCBzZWN0aW9ucy5sZW5ndGgsIHtcbiAgICAgIHRvdGFsX3NlY3Rpb25zOiBzZWN0aW9ucy5sZW5ndGgsXG4gICAgICB0b3RhbF93b3JkczogYWdncmVnYXRlU3RhdHMud29yZF9jb3VudCB8fCAwLFxuICAgICAgdW5pcXVlX3dvcmRzOiBhZ2dyZWdhdGVTdGF0cy51bmlxdWVfd29yZHMgfHwgMCxcbiAgICAgIGN1c3RvbV9kaWN0X3dvcmRzOiBhZ2dyZWdhdGVTdGF0cy5jdXN0b21fZGljdF93b3JkcyB8fCAwLFxuICAgICAgaW5jb3JyZWN0X3dvcmRzOiBpbmNvcnJlY3RXb3JkcyxcbiAgICAgIGdyYW1tYXJfaXNzdWVzOiBncmFtbWFySXNzdWVzLFxuICAgIH0sIGN1c3RvbURpY3RTaXplKTtcblxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cuZXJyb3IoJ1NwZWxsIGNoZWNrIGVycm9yOicsIGVycik7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NwZWxsLWxvYWRpbmcnKS5pbm5lckhUTUwgPSBgPHAgc3R5bGU9XCJjb2xvcjojZWY0NDQ0O3BhZGRpbmc6MjBweDtcIj5TcGVsbCBjaGVjayBmYWlsZWQ6ICR7ZXJyLm1lc3NhZ2V9PC9wPmA7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIFplcm8tc3RhdGUgc3BlbGwgc3RhZ2UgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIHJlbmRlclNwZWxsQ2hlY2taZXJvU3RhdGUobWVzc2FnZSwgc3RhdHNMaW5lID0gJycsIGN1c3RvbURpY3RTaXplID0gMCkge1xuICB3aW5kb3cuX3NwZWxsQ2hlY2tDYWNoZSA9IHsgdHlwZTogJ3plcm8nLCBtZXNzYWdlLCBzdGF0c0xpbmUsIGN1c3RvbURpY3RTaXplIH07XG4gIF9zcGVsbENoZWNrQ2FjaGUgPSB3aW5kb3cuX3NwZWxsQ2hlY2tDYWNoZTtcbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIGNvbnN0IHN0YXRzUGFydHMgPSBbXTtcbiAgaWYgKHN0YXRzTGluZSkgc3RhdHNQYXJ0cy5wdXNoKGA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7Zm9udC1zaXplOjAuOTVlbTttYXJnaW46OHB4IDAgMDtcIj4ke2VzY2FwZUh0bWwoc3RhdHNMaW5lKX08L3A+YCk7XG4gIGlmIChjdXN0b21EaWN0U2l6ZSA+IDApIHN0YXRzUGFydHMucHVzaChgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO2ZvbnQtc2l6ZTowLjllbTttYXJnaW46NHB4IDAgMDtcIj5DdXN0b20gZGljdGlvbmFyeTogJHtjdXN0b21EaWN0U2l6ZS50b0xvY2FsZVN0cmluZygpfSB3b3JkJHtjdXN0b21EaWN0U2l6ZSAhPT0gMSA/ICdzJyA6ICcnfTwvcD5gKTtcbiAgY29udGVudC5pbm5lckhUTUwgPSBgXG4gICAgPGRpdiBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO3BhZGRpbmc6NjBweCAyMHB4O1wiPlxuICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTozZW07bWFyZ2luLWJvdHRvbToxNnB4O1wiPlx1MjcwNTwvZGl2PlxuICAgICAgPGgyIHN0eWxlPVwiY29sb3I6IzE2NjUzNDtcIj4ke2VzY2FwZUh0bWwobWVzc2FnZSl9PC9oMj5cbiAgICAgICR7c3RhdHNQYXJ0cy5qb2luKCdcXG4nKX1cbiAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDttYXJnaW46MTZweCAwIDI0cHg7XCI+Q29udGludWUgd2hlbiB5b3UgYXJlIHJlYWR5IHRvIGdlbmVyYXRlIHlvdXIgQ1YuPC9wPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cInN1Ym1pdC1idG5cIiBvbmNsaWNrPVwic3VibWl0RW1wdHlTcGVsbENoZWNrKClcIiB0aXRsZT1cIkdlbmVyYXRlIGFuIEhUTUwgcHJldmlldyBvZiB5b3VyIENWIFx1MjAxNCB5b3Ugd2lsbCByZXZpZXcgdGhlIGxheW91dCBiZWZvcmUgZmluYWwgRE9DWC9QREYgZmlsZXMgYXJlIHByb2R1Y2VkXCI+R2VuZXJhdGUgUHJldmlldyBcdTIxOTI8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgYDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc3VibWl0RW1wdHlTcGVsbENoZWNrKCkge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9zcGVsbC1jaGVjay1jb21wbGV0ZScsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHNwZWxsX2F1ZGl0OiBbXSB9KVxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmICghcmVzLm9rKSB7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgYEZhaWxlZCB0byBzYXZlIHNwZWxsIGNoZWNrOiAke2RhdGEuZXJyb3IgfHwgJ1Vua25vd24gZXJyb3InfWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwcm9jZWVkID0gYXdhaXQgX2NvbmZpcm1Qcm9jZWVkVG9HZW5lcmF0ZSgpO1xuICAgIGlmICghcHJvY2VlZCkgcmV0dXJuO1xuICAgIHN0YXRlTWFuYWdlci5tYXJrQ29udGVudENoYW5nZWQoKTtcbiAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCAnXHUyNzA1IFNwZWxsIGNoZWNrIGNvbXBsZXRlIFx1MjAxNCBubyBpc3N1ZXMgcmVxdWlyZWQgY2hhbmdlcy4gR2VuZXJhdGluZyB5b3VyIENWXHUyMDI2Jyk7XG4gICAgc2NoZWR1bGVBdHNSZWZyZXNoKCdyZXZpZXdfY2hlY2twb2ludCcpO1xuICAgIGF3YWl0IGZldGNoU3RhdHVzKCk7XG4gICAgYXdhaXQgc2VuZEFjdGlvbignZ2VuZXJhdGVfY3YnKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsIGBTcGVsbCBjaGVjayBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgU3RhdHMgc3VtbWFyeSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gYnVpbGRTcGVsbFN0YXRzU3VtbWFyeShzdGF0cyA9IHt9KSB7XG4gIHJldHVybiBbXG4gICAgYCR7KHN0YXRzLnRvdGFsX3NlY3Rpb25zIHx8IDApLnRvTG9jYWxlU3RyaW5nKCl9IHNlY3Rpb24ke3N0YXRzLnRvdGFsX3NlY3Rpb25zID09PSAxID8gJycgOiAncyd9IGNoZWNrZWRgLFxuICAgIGAkeyhzdGF0cy50b3RhbF93b3JkcyB8fCAwKS50b0xvY2FsZVN0cmluZygpfSB3b3Jkc2AsXG4gICAgYCR7KHN0YXRzLnVuaXF1ZV93b3JkcyB8fCAwKS50b0xvY2FsZVN0cmluZygpfSB1bmlxdWVgLFxuICAgIGAkeyhzdGF0cy5jdXN0b21fZGljdF93b3JkcyB8fCAwKS50b0xvY2FsZVN0cmluZygpfSBjdXN0b20gZGljdGlvbmFyeSBtYXRjaCR7c3RhdHMuY3VzdG9tX2RpY3Rfd29yZHMgPT09IDEgPyAnJyA6ICdlcyd9YCxcbiAgICBgJHsoc3RhdHMuaW5jb3JyZWN0X3dvcmRzIHx8IDApLnRvTG9jYWxlU3RyaW5nKCl9IHVua25vd24vaW5jb3JyZWN0YCxcbiAgICBgJHsoc3RhdHMuZ3JhbW1hcl9pc3N1ZXMgfHwgMCkudG9Mb2NhbGVTdHJpbmcoKX0gZ3JhbW1hciBpc3N1ZSR7c3RhdHMuZ3JhbW1hcl9pc3N1ZXMgPT09IDEgPyAnJyA6ICdzJ31gLFxuICBdLmpvaW4oJyBcdTAwQjcgJyk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBSZW5kZXIgc3VnZ2VzdGlvbnMgcGFuZWwgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIHJlbmRlclNwZWxsU3VnZ2VzdGlvbnMoZmxhZ2dlZFNlY3Rpb25zLCB0b3RhbFNlY3Rpb25zLCBzdGF0cyA9IHt9LCBjdXN0b21EaWN0U2l6ZSA9IDApIHtcbiAgd2luZG93Ll9zcGVsbENoZWNrQ2FjaGUgPSB7IHR5cGU6ICdzdWdnZXN0aW9ucycsIGZsYWdnZWRTZWN0aW9ucywgdG90YWxTZWN0aW9ucywgc3RhdHMsIGN1c3RvbURpY3RTaXplIH07XG4gIF9zcGVsbENoZWNrQ2FjaGUgPSB3aW5kb3cuX3NwZWxsQ2hlY2tDYWNoZTtcbiAgY29uc3QgcmVzdWx0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzcGVsbC1yZXN1bHRzJyk7XG4gIHJlc3VsdHMuc3R5bGUuZGlzcGxheSA9ICcnO1xuICBjb25zdCBzdGF0c0xpbmUgPSBidWlsZFNwZWxsU3RhdHNTdW1tYXJ5KHN0YXRzKTtcblxuICBsZXQgaHRtbCA9IGBcbiAgICA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZmVmOWMzO2JvcmRlcjoxcHggc29saWQgI2ZkZTA0Nztib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjEycHggMTZweDttYXJnaW4tYm90dG9tOjI0cHg7XCI+XG4gICAgICA8c3Ryb25nPlx1MjZBMCAke2ZsYWdnZWRTZWN0aW9ucy5yZWR1Y2UoKHQsIGYpID0+IHQgKyBmLnN1Z2dlc3Rpb25zLmxlbmd0aCwgMCl9IGlzc3VlJHtmbGFnZ2VkU2VjdGlvbnMucmVkdWNlKCh0LCBmKSA9PiB0ICsgZi5zdWdnZXN0aW9ucy5sZW5ndGgsIDApICE9PSAxID8gJ3MnIDogJyd9PC9zdHJvbmc+IGZvdW5kXG4gICAgICBhY3Jvc3MgJHtmbGFnZ2VkU2VjdGlvbnMubGVuZ3RofSBvZiAke3RvdGFsU2VjdGlvbnN9IHNlY3Rpb24ke3RvdGFsU2VjdGlvbnMgIT09IDEgPyAncycgOiAnJ30uXG4gICAgICBSZXZpZXcgZWFjaCBzdWdnZXN0aW9uIGJlbG93LCB0aGVuIGNsaWNrIDxzdHJvbmc+RG9uZTwvc3Ryb25nPi5cbiAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOjhweDtmb250LXNpemU6MC45MmVtO2NvbG9yOiM2YjcyODA7XCI+JHtlc2NhcGVIdG1sKHN0YXRzTGluZSl9PC9kaXY+XG4gICAgICAke2N1c3RvbURpY3RTaXplID4gMCA/IGA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDo0cHg7Zm9udC1zaXplOjAuODhlbTtjb2xvcjojNmI3MjgwO1wiPkN1c3RvbSBkaWN0aW9uYXJ5IHNpemU6ICR7Y3VzdG9tRGljdFNpemUudG9Mb2NhbGVTdHJpbmcoKX0gd29yZCR7Y3VzdG9tRGljdFNpemUgIT09IDEgPyAncycgOiAnJ308L2Rpdj5gIDogJyd9XG4gICAgPC9kaXY+XG4gIGA7XG5cbiAgY29uc3QgX3N1Z1NldmVyaXR5ID0gKHN1ZykgPT4ge1xuICAgIGNvbnN0IHJpZCA9IChzdWcucnVsZV9pZCB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBjYXQgPSAoc3VnLmNhdGVnb3J5IHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmICgvc3BlbGx8dHlwb3xtaXNzcGVsbC8udGVzdChyaWQpIHx8IC90eXBvLy50ZXN0KGNhdCkpIHJldHVybiAwO1xuICAgIGlmICgvZ3JhbW1hcnxhZ3JlZW1lbnR8dmVyYnx0ZW5zZXxhcnRpY2xlLy50ZXN0KHJpZCkgfHwgL2dyYW1tYXIvLnRlc3QoY2F0KSkgcmV0dXJuIDE7XG4gICAgaWYgKC9zdHlsZXxyZWR1bmRhbnx3b3JkeS8udGVzdChyaWQpIHx8IC9zdHlsZS8udGVzdChjYXQpKSByZXR1cm4gMjtcbiAgICByZXR1cm4gMztcbiAgfTtcblxuICBmbGFnZ2VkU2VjdGlvbnMuZm9yRWFjaCgoeyBzZWN0aW9uLCBzdWdnZXN0aW9uczogcmF3U3VnZ2VzdGlvbnMgfSkgPT4ge1xuICAgIGNvbnN0IHN1Z2dlc3Rpb25zID0gWy4uLnJhd1N1Z2dlc3Rpb25zXS5zb3J0KChhLCBiKSA9PiBfc3VnU2V2ZXJpdHkoYSkgLSBfc3VnU2V2ZXJpdHkoYikpO1xuICAgIGh0bWwgKz0gYDxkaXYgY2xhc3M9XCJyZXZpZXctc2VjdGlvblwiIHN0eWxlPVwibWFyZ2luLWJvdHRvbToyNHB4O1wiPlxuICAgICAgPGgzIHN0eWxlPVwiZm9udC1zaXplOjFlbTtmb250LXdlaWdodDo3MDA7Y29sb3I6IzM3NDE1MTttYXJnaW4tYm90dG9tOjEycHg7XCI+JHtlc2NhcGVIdG1sKHNlY3Rpb24ubGFiZWwpfTwvaDM+XG4gICAgICA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZjhmYWZjO2JvcmRlcjoxcHggc29saWQgI2UyZThmMDtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjEwcHggMTRweDttYXJnaW4tYm90dG9tOjEwcHg7Zm9udC1zaXplOjAuOWVtO3doaXRlLXNwYWNlOnByZS13cmFwO1wiPiR7ZXNjYXBlSHRtbChzZWN0aW9uLnRleHQpfTwvZGl2PlxuICAgIGA7XG4gICAgc3VnZ2VzdGlvbnMuZm9yRWFjaCgoc3VnLCBpZHgpID0+IHtcbiAgICAgIGNvbnN0IHN1Z0lkID0gYHN1Z18ke3NlY3Rpb24uaWR9XyR7aWR4fWA7XG4gICAgICBjb25zdCByZXBzID0gc3VnLnJlcGxhY2VtZW50cyB8fCBbXTtcbiAgICAgIGh0bWwgKz0gYFxuICAgICAgICA8ZGl2IGNsYXNzPVwic3BlbGwtc3VnZ2VzdGlvblwiIGlkPVwiJHtzdWdJZH1cIiBkYXRhLXNlY3Rpb24taWQ9XCIke2VzY2FwZUh0bWwoc2VjdGlvbi5pZCl9XCIgZGF0YS1pZHg9XCIke2lkeH1cIlxuICAgICAgICAgICAgIHN0eWxlPVwiYm9yZGVyOjFweCBzb2xpZCAjZTJlOGYwO2JvcmRlci1yYWRpdXM6NnB4O3BhZGRpbmc6MTBweCAxNHB4O21hcmdpbi1ib3R0b206OHB4O2JhY2tncm91bmQ6I2ZmZjtcIj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmZsZXgtc3RhcnQ7Z2FwOjEwcHg7XCI+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDoxO1wiPlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuODhlbTtjb2xvcjojNmI3MjgwO21hcmdpbi1ib3R0b206NHB4O1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiYmFja2dyb3VuZDojZmVlMmUyO2NvbG9yOiNkYzI2MjY7Ym9yZGVyLXJhZGl1czo0cHg7cGFkZGluZzoxcHggNnB4O2ZvbnQtd2VpZ2h0OjYwMDtcIj4ke2VzY2FwZUh0bWwoc3VnLmZsYWdnZWQpfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cIm1hcmdpbi1sZWZ0OjhweDtcIj4ke2VzY2FwZUh0bWwoc3VnLm1lc3NhZ2UpfTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXN0eWxlOml0YWxpYztmb250LXNpemU6MC44NWVtO2NvbG9yOiMzNzQxNTE7bWFyZ2luLWJvdHRvbTo4cHg7XCI+JHtlc2NhcGVIdG1sKHN1Zy5zbmlwcGV0KX08L2Rpdj5cbiAgICAgICAgICAgICAgJHtyZXBzLmxlbmd0aCA+IDAgPyBgXG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7ZmxleC13cmFwOndyYXA7Z2FwOjZweDttYXJnaW4tYm90dG9tOjhweDtcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjgyZW07Y29sb3I6IzZiNzI4MDthbGlnbi1zZWxmOmNlbnRlcjtcIj5TdWdnZXN0aW9uczo8L3NwYW4+XG4gICAgICAgICAgICAgICAgJHtyZXBzLm1hcCgociwgcmkpID0+IGA8YnV0dG9uIGNsYXNzPVwicmV3cml0ZS1rZXl3b3JkXCIgb25jbGljaz1cImFwcGx5U3BlbGxSZXBsYWNlbWVudCgnJHtlc2NhcGVIdG1sKHNlY3Rpb24uaWQpfScsICR7aWR4fSwgJHtyaX0pXCJcbiAgICAgICAgICAgICAgICAgIHN0eWxlPVwiY3Vyc29yOnBvaW50ZXI7Ym9yZGVyOjFweCBzb2xpZCAjM2I4MmY2O2JhY2tncm91bmQ6I2RiZWFmZTtcIj4ke2VzY2FwZUh0bWwocil9PC9idXR0b24+YCkuam9pbignJyl9XG4gICAgICAgICAgICAgIDwvZGl2PmAgOiAnJ31cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjZweDttYXJnaW4tYm90dG9tOjhweDtcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImVkaXRfJHtzdWdJZH1cIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJUeXBlIGN1c3RvbSBjb3JyZWN0aW9uXHUyMDI2XCJcbiAgICAgICAgICAgICAgICAgIHZhbHVlPVwiJHtlc2NhcGVIdG1sKHJlcHNbMF0gfHwgJycpfVwiXG4gICAgICAgICAgICAgICAgICBzdHlsZT1cImZsZXg6MTtmb250LXNpemU6MC44OGVtO3BhZGRpbmc6NHB4IDhweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo0cHg7XCJcbiAgICAgICAgICAgICAgICAgIG9ua2V5ZG93bj1cImlmKGV2ZW50LmtleT09PSdFbnRlcicpe2V2ZW50LnByZXZlbnREZWZhdWx0KCk7YXBwbHlDdXN0b21TcGVsbENvcnJlY3Rpb24oJyR7ZXNjYXBlSHRtbChzZWN0aW9uLmlkKX0nLCR7aWR4fSk7fVwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIG9uY2xpY2s9XCJhcHBseUN1c3RvbVNwZWxsQ29ycmVjdGlvbignJHtlc2NhcGVIdG1sKHNlY3Rpb24uaWQpfScsJHtpZHh9KVwiIHRpdGxlPVwiQXBwbHkgY3VzdG9tIGNvcnJlY3Rpb25cIiBhcmlhLWxhYmVsPVwiQXBwbHkgY3VzdG9tIGNvcnJlY3Rpb25cIj5BcHBseTwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6OHB4O2ZsZXgtd3JhcDp3cmFwO1wiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIG9uY2xpY2s9XCJkaXNtaXNzU3BlbGxTdWdnZXN0aW9uKCcke2VzY2FwZUh0bWwoc3VnSWQpfScsICcke2VzY2FwZUh0bWwoc2VjdGlvbi5pZCl9JywgJHtpZHh9LCAnJHtlc2NhcGVIdG1sKHN1Zy5mbGFnZ2VkKX0nKVwiXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiSWdub3JlIHRoaXMgc3VnZ2VzdGlvblwiIGFyaWEtbGFiZWw9XCJJZ25vcmUgdGhpcyBzdWdnZXN0aW9uXCI+SWdub3JlPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgb25jbGljaz1cImFkZFNwZWxsV29yZCgnJHtlc2NhcGVIdG1sKHN1Zy5mbGFnZ2VkKX0nLCAnJHtlc2NhcGVIdG1sKHN1Z0lkKX0nKVwiXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiQWRkIHRvIGN1c3RvbSBkaWN0aW9uYXJ5XCIgYXJpYS1sYWJlbD1cIkFkZCB0byBjdXN0b20gZGljdGlvbmFyeVwiPkFkZCB0byBEaWN0aW9uYXJ5PC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgYDtcbiAgICAgIC8vIFJlZ2lzdGVyIGluIGF1ZGl0IGFzIHBlbmRpbmdcbiAgICAgIGlmICghd2luZG93Ll9zcGVsbFN1Z01hcCkgd2luZG93Ll9zcGVsbFN1Z01hcCA9IHt9O1xuICAgICAgd2luZG93Ll9zcGVsbFN1Z01hcFtgJHtzZWN0aW9uLmlkfV8ke2lkeH1gXSA9IHtcbiAgICAgICAgc2VjdGlvbl9pZDogICAgc2VjdGlvbi5pZCxcbiAgICAgICAgY29udGV4dF90eXBlOiBzZWN0aW9uLmNvbnRleHQsXG4gICAgICAgIGxvY2F0aW9uOiAgICAgc2VjdGlvbi5sYWJlbCxcbiAgICAgICAgb3JpZ2luYWw6ICAgICBzdWcuZmxhZ2dlZCxcbiAgICAgICAgc3VnZ2VzdGlvbjogICAocmVwc1swXSB8fCAnJyksXG4gICAgICAgIG9mZnNldDogICAgICAgc3VnLm9mZnNldCxcbiAgICAgICAgbGVuZ3RoOiAgICAgICBzdWcubGVuZ3RoLFxuICAgICAgICBydWxlOiAgICAgICAgIHN1Zy5ydWxlX2lkIHx8ICcnLFxuICAgICAgICBvdXRjb21lOiAgICAgICdwZW5kaW5nJyxcbiAgICAgICAgZmluYWw6ICAgICAgICBzdWcuZmxhZ2dlZCxcbiAgICAgIH07XG4gICAgfSk7XG4gICAgaHRtbCArPSAnPC9kaXY+JztcbiAgfSk7XG5cbiAgaHRtbCArPSBgXG4gICAgPGRpdiBjbGFzcz1cIm5hdi1idXR0b25zXCIgc3R5bGU9XCJtYXJnaW46MjRweCAwO1wiPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cInN1Ym1pdC1idG5cIiBvbmNsaWNrPVwic3VibWl0U3BlbGxDaGVja0RlY2lzaW9ucygpXCI+R2VuZXJhdGUgUHJldmlldyBcdTIxOTI8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgYDtcbiAgcmVzdWx0cy5pbm5lckhUTUwgPSBodG1sO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgQXBwbHkgLyBkaXNtaXNzIGNvcnJlY3Rpb25zIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBhcHBseUN1c3RvbVNwZWxsQ29ycmVjdGlvbihzZWN0aW9uSWQsIGlkeCkge1xuICBjb25zdCBrZXkgICAgPSBgJHtzZWN0aW9uSWR9XyR7aWR4fWA7XG4gIGNvbnN0IGVudHJ5ICA9ICh3aW5kb3cuX3NwZWxsU3VnTWFwIHx8IHt9KVtrZXldO1xuICBpZiAoIWVudHJ5KSByZXR1cm47XG4gIGNvbnN0IGlucHV0ICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBlZGl0X3N1Z18ke3NlY3Rpb25JZH1fJHtpZHh9YCk7XG4gIGNvbnN0IGN1c3RvbSA9IGlucHV0ID8gaW5wdXQudmFsdWUudHJpbSgpIDogJyc7XG4gIGlmICghY3VzdG9tKSByZXR1cm47XG4gIGVudHJ5Lm91dGNvbWUgPSAnYWNjZXB0JztcbiAgZW50cnkuZmluYWwgICA9IGN1c3RvbTtcbiAgY29uc3Qgc3VnRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuc3BlbGwtc3VnZ2VzdGlvbltkYXRhLXNlY3Rpb24taWQ9XCIke0NTUy5lc2NhcGUoc2VjdGlvbklkKX1cIl1bZGF0YS1pZHg9XCIke2lkeH1cIl1gKTtcbiAgaWYgKCFzdWdFbCkgcmV0dXJuO1xuICBjb25zdCBmbGFnZ2VkU3BhbiA9IHN1Z0VsLnF1ZXJ5U2VsZWN0b3IoJ3NwYW5bc3R5bGUqPVwiYmFja2dyb3VuZDojZmVlMmUyXCJdJyk7XG4gIGlmIChmbGFnZ2VkU3Bhbikge1xuICAgIGZsYWdnZWRTcGFuLm91dGVySFRNTCA9IGA8ZGVsIHN0eWxlPVwiY29sb3I6I2RjMjYyNjtcIj4ke2VzY2FwZUh0bWwoZW50cnkub3JpZ2luYWwpfTwvZGVsPiBcdTIxOTIgPGlucyBzdHlsZT1cImNvbG9yOiMxNjY1MzQ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7XCI+JHtlc2NhcGVIdG1sKGN1c3RvbSl9PC9pbnM+YDtcbiAgfVxuICBzdWdFbC5zdHlsZS5vcGFjaXR5ID0gJzAuNSc7XG59XG5cbmZ1bmN0aW9uIGFwcGx5U3BlbGxSZXBsYWNlbWVudChzZWN0aW9uSWQsIGlkeCwgcmVwSWR4KSB7XG4gIGNvbnN0IGtleSAgPSBgJHtzZWN0aW9uSWR9XyR7aWR4fWA7XG4gIGNvbnN0IGVudHJ5ID0gKHdpbmRvdy5fc3BlbGxTdWdNYXAgfHwge30pW2tleV07XG4gIGlmICghZW50cnkpIHJldHVybjtcbiAgLy8gVGhlIHJlcGxhY2VtZW50cyBsaXN0IGlzIG5vdCBkaXJlY3RseSBhY2Nlc3NpYmxlIGhlcmUgXHUyMDE0IHJlYWQgZnJvbSBET00gc3VnZ2VzdGlvblxuICBjb25zdCBzdWdFbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC5zcGVsbC1zdWdnZXN0aW9uW2RhdGEtc2VjdGlvbi1pZD1cIiR7Q1NTLmVzY2FwZShzZWN0aW9uSWQpfVwiXVtkYXRhLWlkeD1cIiR7aWR4fVwiXWApO1xuICBpZiAoIXN1Z0VsKSByZXR1cm47XG4gIGNvbnN0IGJ1dHRvbnMgPSBzdWdFbC5xdWVyeVNlbGVjdG9yQWxsKCcucmV3cml0ZS1rZXl3b3JkJyk7XG4gIGNvbnN0IHJlcCA9IGJ1dHRvbnNbcmVwSWR4XSA/IGJ1dHRvbnNbcmVwSWR4XS50ZXh0Q29udGVudC50cmltKCkgOiAnJztcbiAgZW50cnkub3V0Y29tZSA9ICdhY2NlcHQnO1xuICBlbnRyeS5maW5hbCAgID0gcmVwO1xuICAvLyBWaXN1YWwgZmVlZGJhY2s6IHN0cmlrZSB0aGUgZmxhZ2dlZCB3b3JkLCBzaG93IHJlcGxhY2VtZW50XG4gIGNvbnN0IGZsYWdnZWRTcGFuID0gc3VnRWwucXVlcnlTZWxlY3Rvcignc3BhbltzdHlsZSo9XCJiYWNrZ3JvdW5kOiNmZWUyZTJcIl0nKTtcbiAgaWYgKGZsYWdnZWRTcGFuKSB7XG4gICAgZmxhZ2dlZFNwYW4ub3V0ZXJIVE1MID0gYDxkZWwgc3R5bGU9XCJjb2xvcjojZGMyNjI2O1wiPiR7ZXNjYXBlSHRtbChlbnRyeS5vcmlnaW5hbCl9PC9kZWw+IFx1MjE5MiA8aW5zIHN0eWxlPVwiY29sb3I6IzE2NjUzNDt0ZXh0LWRlY29yYXRpb246bm9uZTtcIj4ke2VzY2FwZUh0bWwocmVwKX08L2lucz5gO1xuICB9XG4gIHN1Z0VsLnN0eWxlLm9wYWNpdHkgPSAnMC41Jztcbn1cblxuZnVuY3Rpb24gZGlzbWlzc1NwZWxsU3VnZ2VzdGlvbihzdWdJZCwgc2VjdGlvbklkLCBpZHgsIHdvcmQpIHtcbiAgY29uc3Qga2V5ICAgPSBgJHtzZWN0aW9uSWR9XyR7aWR4fWA7XG4gIGNvbnN0IGVudHJ5ID0gKHdpbmRvdy5fc3BlbGxTdWdNYXAgfHwge30pW2tleV07XG4gIGlmIChlbnRyeSkgeyBlbnRyeS5vdXRjb21lID0gJ3JlamVjdCc7IGVudHJ5LmZpbmFsID0gd29yZDsgfVxuICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHN1Z0lkKTtcbiAgaWYgKGVsKSBlbC5zdHlsZS5vcGFjaXR5ID0gJzAuNCc7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGFkZFNwZWxsV29yZCh3b3JkLCBzdWdJZCkge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL2N1c3RvbS1kaWN0aW9uYXJ5Jywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgd29yZCB9KVxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHN1Z0lkKTtcbiAgICAgIGlmIChlbCkge1xuICAgICAgICBlbC5zdHlsZS5vcGFjaXR5ID0gJzAuNCc7XG4gICAgICAgIGNvbnN0IG1zZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBtc2cuc3R5bGUuY3NzVGV4dCA9ICdjb2xvcjojMTY2NTM0O2ZvbnQtc2l6ZTowLjg1ZW07bWFyZ2luLXRvcDo0cHg7JztcbiAgICAgICAgbXNnLnRleHRDb250ZW50ID0gYFwiJHt3b3JkfVwiIGFkZGVkIHRvIGRpY3Rpb25hcnkuYDtcbiAgICAgICAgZWwuYXBwZW5kQ2hpbGQobXNnKTtcbiAgICAgIH1cbiAgICAgIC8vIEFsc28gcmVjb3JkIGluIGF1ZGl0XG4gICAgICBjb25zdCBwYXJ0cyA9IHN1Z0lkLnJlcGxhY2UoL15zdWdfLywgJycpLnNwbGl0KCdfJyk7XG4gICAgICBjb25zdCBpZHggPSBwYXJzZUludChwYXJ0cy5wb3AoKSwgMTApO1xuICAgICAgY29uc3Qgc2VjdGlvbklkID0gcGFydHMuam9pbignXycpO1xuICAgICAgY29uc3Qga2V5ID0gYCR7c2VjdGlvbklkfV8ke2lkeH1gO1xuICAgICAgY29uc3QgZW50cnkgPSAod2luZG93Ll9zcGVsbFN1Z01hcCB8fCB7fSlba2V5XTtcbiAgICAgIGlmIChlbnRyeSkgeyBlbnRyeS5vdXRjb21lID0gJ2FkZF9kaWN0JzsgZW50cnkuZmluYWwgPSB3b3JkOyB9XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cuZXJyb3IoJ0Vycm9yIGFkZGluZyB0byBkaWN0aW9uYXJ5OicsIGVycik7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIFByZS1nZW5lcmF0aW9uIGNvbmZpcm1hdGlvbiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gX2NvbmZpcm1Qcm9jZWVkVG9HZW5lcmF0ZSgpIHtcbiAgLy8gR2F0ZTogdGFnbGluZSBtdXN0IGJlIGV4cGxpY2l0bHkgY29uZmlybWVkIGJlZm9yZSBnZW5lcmF0aW5nXG4gIGNvbnN0IHN0YXR1cyA9IGF3YWl0IGZldGNoU3RhdHVzKCkuY2F0Y2goKCkgPT4gKHt9KSk7XG4gIGlmICghc3RhdHVzPy5kZWNpc2lvbnNfY29uZmlybWVkPy50YWdsaW5lKSB7XG4gICAgYXdhaXQgc2hvd0FsZXJ0TW9kYWwoXG4gICAgICAnXHUyNkEwIFRhZ2xpbmUgTm90IENvbmZpcm1lZCcsXG4gICAgICAnWW91IG11c3QgY29uZmlybSB5b3VyIGFwcGxpY2FudCB0YWdsaW5lIGJlZm9yZSBnZW5lcmF0aW5nLlxcblxcbkdvIHRvIHRoZSBcdUQ4M0NcdURGRjdcdUZFMEYgVGFnbGluZSB0YWIgaW4gQ3VzdG9taXphdGlvbnMgdG8gY29uZmlybSBpdC4nXG4gICAgKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgYXRzU2NvcmUgPSBzdGF0ZU1hbmFnZXIuZ2V0QXRzU2NvcmUoKTtcbiAgY29uc3QgZnJlc2huZXNzID0gc3RhdGVNYW5hZ2VyLmdldExheW91dEZyZXNobmVzcygpO1xuICBjb25zdCBnZW5TdGF0ZSA9IHN0YXRlTWFuYWdlci5nZXRHZW5lcmF0aW9uU3RhdGUoKTtcbiAgY29uc3QgZGVjaXNpb25zQ29uZmlybWVkID0gc3RhdHVzPy5kZWNpc2lvbnNfY29uZmlybWVkIHx8IHt9O1xuICBjb25zdCBsaW5lcyA9IFsnWW91ciBDViBpcyByZWFkeSB0byBnZW5lcmF0ZS4nXTtcbiAgaWYgKGF0c1Njb3JlICE9PSBudWxsICYmIGF0c1Njb3JlICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGF0c1Njb3JlLm92ZXJhbGwgPT09ICdudW1iZXInKSB7XG4gICAgbGluZXMucHVzaChgQ3VycmVudCBBVFMgc2NvcmU6ICR7TWF0aC5yb3VuZChhdHNTY29yZS5vdmVyYWxsKX0lYCk7XG4gIH1cbiAgaWYgKGdlblN0YXRlLnBhZ2VXYXJuaW5nKSB7XG4gICAgY29uc3QgcGMgPSBnZW5TdGF0ZS5wYWdlQ291bnRFeGFjdCA/PyBnZW5TdGF0ZS5wYWdlQ291bnRFc3RpbWF0ZTtcbiAgICBjb25zdCBwY0xhYmVsID0gcGMgIT09IG51bGwgPyAoZ2VuU3RhdGUucGFnZUNvdW50RXhhY3QgIT09IG51bGwgPyBgJHtwY31gIDogYH4ke3BjfWApIDogbnVsbDtcbiAgICBjb25zdCBva1BhZ2UgPSBhd2FpdCBzaG93Q29uZmlybU1vZGFsKFxuICAgICAgJ1x1MjZBMCBQYWdlIENvdW50IE91dCBvZiBSYW5nZScsXG4gICAgICBgVGhlIENWIGlzIGVzdGltYXRlZCBhdCAke3BjTGFiZWwgPyBgJHtwY0xhYmVsfSBwYWdlJHtwYyAhPT0gMSA/ICdzJyA6ICcnfWAgOiAnYW4gdW51c3VhbCBwYWdlIGNvdW50J30sIHdoaWNoIGlzIG91dHNpZGUgdGhlIHJlY29tbWVuZGVkIHJhbmdlIGZvciBhIHNlbmlvciBjYW5kaWRhdGUgKDJcdTIwMTMzIHBhZ2VzKS5cXG5cXG5Db25zaWRlciBhZGp1c3RpbmcgeW91ciBsYXlvdXQgaW5zdHJ1Y3Rpb25zIGJlZm9yZSBnZW5lcmF0aW5nLlxcblxcblByb2NlZWQgYW55d2F5P2AsXG4gICAgICAnR2VuZXJhdGUgQW55d2F5J1xuICAgICk7XG4gICAgaWYgKCFva1BhZ2UpIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoZnJlc2huZXNzLmlzU3RhbGUpIHtcbiAgICBsaW5lcy5wdXNoKGBcdTI2QTAgJHtmcmVzaG5lc3MuYXJpYUxhYmVsfWApO1xuICB9XG4gIGNvbnN0IHJldmlld2VkU2VjdGlvbnMgPSBbJ2V4cGVyaWVuY2VzJywgJ3NraWxscycsICdhY2hpZXZlbWVudHMnXS5maWx0ZXIoayA9PiBkZWNpc2lvbnNDb25maXJtZWRba10pO1xuICBpZiAocmV2aWV3ZWRTZWN0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICBsaW5lcy5wdXNoKCdcdTI2QTAgTm8gY3VzdG9taXNhdGlvbiBzZWN0aW9ucyByZXZpZXdlZCBcdTIwMTQgZXhwZXJpZW5jZSwgc2tpbGwsIGFuZCBhY2hpZXZlbWVudCBzZWxlY3Rpb25zIGFyZSBhbGwgTExNIGRlZmF1bHRzLicpO1xuICB9XG4gIGxldCB3ZWFrQnVsbGV0Q291bnQgPSAwLCBwYXNzaXZlQnVsbGV0Q291bnQgPSAwO1xuICBPYmplY3QudmFsdWVzKHdpbmRvdy5hY2hpZXZlbWVudEVkaXRzIHx8IHt9KS5mb3JFYWNoKGxpc3QgPT4ge1xuICAgIChsaXN0IHx8IFtdKS5mb3JFYWNoKGUgPT4ge1xuICAgICAgY29uc3QgdHh0ID0gdHlwZW9mIGUgPT09ICdzdHJpbmcnID8gZSA6ICgoZSAmJiBlLnRleHQpIHx8ICcnKTtcbiAgICAgIGlmICghdHh0LnRyaW0oKSB8fCAoZSAmJiBlLmhpZGRlbikpIHJldHVybjtcbiAgICAgIGNvbnN0IHdhcm4gPSB0eXBlb2YgX2FjaFZlcmJXYXJuaW5nID09PSAnZnVuY3Rpb24nID8gX2FjaFZlcmJXYXJuaW5nKHR4dCkgOiBudWxsO1xuICAgICAgaWYgKHdhcm4/LmxldmVsID09PSAncGFzc2l2ZScpIHBhc3NpdmVCdWxsZXRDb3VudCsrO1xuICAgICAgZWxzZSBpZiAod2Fybj8ubGV2ZWwgPT09ICd3ZWFrJykgd2Vha0J1bGxldENvdW50Kys7XG4gICAgfSk7XG4gIH0pO1xuICBpZiAod2Vha0J1bGxldENvdW50ID4gMCB8fCBwYXNzaXZlQnVsbGV0Q291bnQgPiAwKSB7XG4gICAgY29uc3QgcGFydHMgPSBbXTtcbiAgICBpZiAocGFzc2l2ZUJ1bGxldENvdW50ID4gMCkgcGFydHMucHVzaChgJHtwYXNzaXZlQnVsbGV0Q291bnR9IHdpdGggcGFzc2l2ZSB2b2ljZWApO1xuICAgIGlmICh3ZWFrQnVsbGV0Q291bnQgPiAwKSBwYXJ0cy5wdXNoKGAke3dlYWtCdWxsZXRDb3VudH0gd2l0aCB3ZWFrIG9wZW5pbmcgdmVyYiR7d2Vha0J1bGxldENvdW50ICE9PSAxID8gJ3MnIDogJyd9YCk7XG4gICAgbGluZXMucHVzaChgXHUyNkEwICR7cGFydHMuam9pbignLCAnKX0gaW4gZXhwZXJpZW5jZSBidWxsZXRzIFx1MjAxNCBjb25zaWRlciBBSSByZXdyaXRlcyBpbiB0aGUgRXhwZXJpZW5jZSBCdWxsZXRzIGVkaXRvci5gKTtcbiAgfVxuICBsaW5lcy5wdXNoKCdcXG5Qcm9jZWVkPycpO1xuICByZXR1cm4gc2hvd0NvbmZpcm1Nb2RhbCgnXHVEODNEXHVEQ0M0IFByb2NlZWQgdG8gR2VuZXJhdGU/JywgbGluZXMuam9pbignXFxuJyksICdHZW5lcmF0ZSBOb3cnKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFN1Ym1pdCBhdWRpdCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gc3VibWl0U3BlbGxDaGVja0RlY2lzaW9ucygpIHtcbiAgLyogZHVja2Zsb3c6XG4gICAqICAgaWQ6IHNwZWxsX3VpX3N1Ym1pdF9saXZlXG4gICAqICAga2luZDogdWlcbiAgICogICB0aW1lc3RhbXA6ICcyMDI2LTA0LTIxVDE4OjAwOjAwWidcbiAgICogICBzdGF0dXM6IGxpdmVcbiAgICogICBoYW5kbGVzOlxuICAgKiAgIC0gdWk6c3BlbGwtY2hlY2suc3VibWl0XG4gICAqICAgY2FsbHM6XG4gICAqICAgLSBQT1NUIC9hcGkvc3BlbGwtY2hlY2stY29tcGxldGVcbiAgICogICAtIFBPU1QgL2FwaS9hY3Rpb25cbiAgICogICByZWFkczpcbiAgICogICAtIHdpbmRvdzpfc3BlbGxTdWdNYXBcbiAgICogICB3cml0ZXM6XG4gICAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9zcGVsbC1jaGVjay1jb21wbGV0ZS5zcGVsbF9hdWRpdFxuICAgKiAgIC0gd2luZG93OnNwZWxsQXVkaXRcbiAgICogICBub3RlczogQ29sbGFwc2VzIHJldmlld2VkIHNwZWxsIHN1Z2dlc3Rpb25zIGludG8gdGhlIGNhbm9uaWNhbCBzcGVsbCBhdWRpdCwgcGVyc2lzdHMgdGhhdCBhdWRpdCBpbiBzZXNzaW9uIHN0YXRlLCBzaG93cyBhIHByZS1nZW5lcmF0aW9uIGNvbmZpcm1hdGlvbiBtb2RhbCwgYW5kIHRoZW4gdHJpZ2dlcnMgZ2VuZXJhdGlvbiB1c2luZyB0aGUgY29ycmVjdGVkIGNvbnRlbnQuXG4gICAqL1xuICAvLyBDb3VudCBpdGVtcyBzdGlsbCBtYXJrZWQgJ3BlbmRpbmcnIChub3QgZXhwbGljaXRseSByZXZpZXdlZClcbiAgY29uc3QgcGVuZGluZ0VudHJpZXMgPSBPYmplY3QudmFsdWVzKHdpbmRvdy5fc3BlbGxTdWdNYXAgfHwge30pLmZpbHRlcihlID0+IGUub3V0Y29tZSA9PT0gJ3BlbmRpbmcnKTtcbiAgaWYgKHBlbmRpbmdFbnRyaWVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBuID0gcGVuZGluZ0VudHJpZXMubGVuZ3RoO1xuICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IHNob3dDb25maXJtTW9kYWwoXG4gICAgICAnXHUyNkEwIFVucmV2aWV3ZWQgSXNzdWVzJyxcbiAgICAgIGAke259IGlzc3VlJHtuICE9PSAxID8gJ3MgaGF2ZScgOiAnIGhhcyd9IG5vdCBiZWVuIHJldmlld2VkIGFuZCB3aWxsIGJlIGlnbm9yZWQuXFxuUHJvY2VlZCBhbnl3YXk/YCxcbiAgICAgICdQcm9jZWVkJ1xuICAgICk7XG4gICAgaWYgKCFjb25maXJtZWQpIHJldHVybjtcbiAgfVxuXG4gIC8vIENvbGxlY3QgYXVkaXQgZnJvbSBfc3BlbGxTdWdNYXBcbiAgY29uc3QgYXVkaXQgPSBPYmplY3QudmFsdWVzKHdpbmRvdy5fc3BlbGxTdWdNYXAgfHwge30pLmZpbHRlcihlID0+IGUub3V0Y29tZSAhPT0gJ3BlbmRpbmcnKTtcbiAgLy8gUmVtYWluaW5nICdwZW5kaW5nJyBpdGVtcyBhcmUgZXhwbGljaXRseSBhdXRvLWlnbm9yZWQgYWZ0ZXIgY29uZmlybWF0aW9uIGFib3ZlXG4gIE9iamVjdC52YWx1ZXMod2luZG93Ll9zcGVsbFN1Z01hcCB8fCB7fSkuZm9yRWFjaChlID0+IHtcbiAgICBpZiAoZS5vdXRjb21lID09PSAncGVuZGluZycpIHsgZS5vdXRjb21lID0gJ2lnbm9yZSc7IGF1ZGl0LnB1c2goZSk7IH1cbiAgfSk7XG4gIHNwZWxsQXVkaXQgPSBhdWRpdDtcblxuICBjb25zdCBsb2FkaW5nTXNnID0gYXBwZW5kTG9hZGluZ01lc3NhZ2UoJ1NhdmluZyBzcGVsbCBjaGVjayBkZWNpc2lvbnNcdTIwMjYnKTtcbiAgc2V0TG9hZGluZyh0cnVlLCAnU2F2aW5nIHNwZWxsLWNoZWNrIGRlY2lzaW9uc1x1MjAyNicpO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9zcGVsbC1jaGVjay1jb21wbGV0ZScsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHNwZWxsX2F1ZGl0OiBzcGVsbEF1ZGl0IH0pXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgcmVtb3ZlTG9hZGluZ01lc3NhZ2UobG9hZGluZ01zZyk7XG4gICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgaWYgKCFyZXMub2spIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCBgRmFpbGVkIHRvIHNhdmUgc3BlbGwgY2hlY2s6ICR7ZGF0YS5lcnJvciB8fCAnVW5rbm93biBlcnJvcid9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN0YXRlTWFuYWdlci5tYXJrQ29udGVudENoYW5nZWQoKTtcbiAgICBjb25zdCBwcm9jZWVkID0gYXdhaXQgX2NvbmZpcm1Qcm9jZWVkVG9HZW5lcmF0ZSgpO1xuICAgIGlmICghcHJvY2VlZCkgcmV0dXJuO1xuICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIGBcdTI3MDUgU3BlbGwgY2hlY2sgY29tcGxldGUgXHUyMDE0ICR7c3BlbGxBdWRpdC5sZW5ndGh9IGl0ZW0ke3NwZWxsQXVkaXQubGVuZ3RoICE9PSAxID8gJ3MnIDogJyd9IHJldmlld2VkLiBHZW5lcmF0aW5nIHlvdXIgQ1ZcdTIwMjZgKTtcbiAgICBzY2hlZHVsZUF0c1JlZnJlc2goJ3Jldmlld19jaGVja3BvaW50Jyk7XG4gICAgYXdhaXQgZmV0Y2hTdGF0dXMoKTtcbiAgICBhd2FpdCBzZW5kQWN0aW9uKCdnZW5lcmF0ZV9jdicpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZW1vdmVMb2FkaW5nTWVzc2FnZShsb2FkaW5nTXNnKTtcbiAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgYFNwZWxsIGNoZWNrIGVycm9yOiAke2Vyci5tZXNzYWdlfWApO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFeHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5leHBvcnQge1xuICBzcGVsbEF1ZGl0LFxuICBwb3B1bGF0ZVNwZWxsQ2hlY2tUYWIsXG4gIHJlbmRlclNwZWxsQ2hlY2taZXJvU3RhdGUsXG4gIHN1Ym1pdEVtcHR5U3BlbGxDaGVjayxcbiAgYnVpbGRTcGVsbFN0YXRzU3VtbWFyeSxcbiAgcmVuZGVyU3BlbGxTdWdnZXN0aW9ucyxcbiAgYXBwbHlDdXN0b21TcGVsbENvcnJlY3Rpb24sXG4gIGFwcGx5U3BlbGxSZXBsYWNlbWVudCxcbiAgZGlzbWlzc1NwZWxsU3VnZ2VzdGlvbixcbiAgYWRkU3BlbGxXb3JkLFxuICBzdWJtaXRTcGVsbENoZWNrRGVjaXNpb25zLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL2Rvd25sb2FkLXRhYi5qc1xuICogRmlsZSBSZXZpZXcgdGFiOiBBVFMgdmFsaWRhdGlvbiwgZ2VuZXJhdGVkLWZpbGUgZG93bmxvYWRzLCBwZXJzdWFzaW9uIGNoZWNrLFxuICogYW5kIHJlZmluZW1lbnQgc2hvcnRjdXRzLlxuICpcbiAqIERlcGVuZGVuY2llcyAocmVzb2x2ZWQgdGhyb3VnaCBnbG9iYWxUaGlzIGF0IHJ1bnRpbWUpOlxuICogICBlc2NhcGVIdG1sLCBiYWNrVG9QaGFzZVxuICovXG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmNvbnN0IGxvZyA9IGdldExvZ2dlcignZG93bmxvYWQtdGFiJyk7XG5cbmltcG9ydCB7IHN0YXRlTWFuYWdlciB9IGZyb20gJy4vc3RhdGUtbWFuYWdlci5qcyc7XG5cbmZ1bmN0aW9uIF9jb2xsZWN0RG93bmxvYWRhYmxlRmlsZXMoY3ZEYXRhID0ge30pIHtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQoKTtcbiAgY29uc3QgZmlsZXMgPSBbXTtcbiAgY29uc3QgcmF3RmlsZXMgPSBBcnJheS5pc0FycmF5KGN2RGF0YS5maWxlcykgPyBjdkRhdGEuZmlsZXMgOiBbXTtcbiAgY29uc3QgY2FuZGlkYXRlRmlsZXMgPSBbXG4gICAgLi4ucmF3RmlsZXMsXG4gICAgY3ZEYXRhLmZpbmFsX2h0bWwsXG4gICAgY3ZEYXRhLmZpbmFsX3BkZixcbiAgICBjdkRhdGEuaHRtbCxcbiAgICBjdkRhdGEucGRmLFxuICAgIGN2RGF0YS5kb2N4LFxuICAgIGN2RGF0YS5hdHNfZG9jeCxcbiAgXS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiBjYW5kaWRhdGVGaWxlcykge1xuICAgIGlmIChzZWVuLmhhcyhmaWxlbmFtZSkpIGNvbnRpbnVlO1xuICAgIHNlZW4uYWRkKGZpbGVuYW1lKTtcblxuICAgIGxldCBpY29uID0gJ1x1RDgzRFx1RENDMSc7XG4gICAgbGV0IGRlc2NyaXB0aW9uID0gJ0dlbmVyYXRlZCBmaWxlJztcbiAgICBsZXQgZm9ybWF0ID0gJ290aGVyJztcblxuICAgIGlmIChmaWxlbmFtZS5lbmRzV2l0aCgnLnBkZicpKSB7XG4gICAgICBpY29uID0gZmlsZW5hbWUuaW5jbHVkZXMoJ0FUUycpID8gJ1x1RDgzRVx1REQxNicgOiAnXHVEODNEXHVEQ0M0JztcbiAgICAgIGRlc2NyaXB0aW9uID0gZmlsZW5hbWUuaW5jbHVkZXMoJ0FUUycpXG4gICAgICAgID8gJ0FUUy1vcHRpbWlzZWQgUERGIFx1MjAxNCBtYWNoaW5lLXJlYWRhYmxlIGZvciBhdXRvbWF0ZWQgc2NyZWVuaW5nJ1xuICAgICAgICA6ICdIdW1hbi1yZWFkYWJsZSBQREYgXHUyMDE0IGZvciBodW1hbiByZXZpZXdlcnMgYW5kIHByaW50aW5nJztcbiAgICAgIGZvcm1hdCA9ICdwZGYnO1xuICAgIH0gZWxzZSBpZiAoZmlsZW5hbWUuZW5kc1dpdGgoJy5kb2N4JykpIHtcbiAgICAgIGljb24gPSAnXHVEODNEXHVEQ0REJztcbiAgICAgIGlmIChmaWxlbmFtZS5zdGFydHNXaXRoKCdDb3ZlckxldHRlcl8nKSkge1xuICAgICAgICBkZXNjcmlwdGlvbiA9ICdDb3ZlciBsZXR0ZXIgXHUyMDE0IFdvcmQgZG9jdW1lbnQgZm9yIHRoZSBhcHBsaWNhdGlvbic7XG4gICAgICB9IGVsc2UgaWYgKGZpbGVuYW1lLnN0YXJ0c1dpdGgoJ1NjcmVlbmluZ18nKSkge1xuICAgICAgICBkZXNjcmlwdGlvbiA9ICdTY3JlZW5pbmcgcXVlc3Rpb24gcmVzcG9uc2VzIFx1MjAxNCBXb3JkIGRvY3VtZW50JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlc2NyaXB0aW9uID0gZmlsZW5hbWUuaW5jbHVkZXMoJ0FUUycpXG4gICAgICAgICAgPyAnQVRTLW9wdGltaXNlZCBXb3JkIGRvY3VtZW50IFx1MjAxNCBrZXl3b3JkLW9wdGltaXNlZCBmb3Igam9iIGFwcGxpY2F0aW9ucydcbiAgICAgICAgICA6ICdIdW1hbi1yZWFkYWJsZSBXb3JkIGRvY3VtZW50IFx1MjAxNCBlZGl0YWJsZSBmb3JtYXQnO1xuICAgICAgfVxuICAgICAgZm9ybWF0ID0gJ2RvY3gnO1xuICAgIH0gZWxzZSBpZiAoZmlsZW5hbWUuZW5kc1dpdGgoJy5odG1sJykpIHtcbiAgICAgIGljb24gPSAnXHVEODNDXHVERjEwJztcbiAgICAgIGNvbnN0IGlzUHJldmlldyA9IC9wcmV2aWV3L2kudGVzdChmaWxlbmFtZSk7XG4gICAgICBkZXNjcmlwdGlvbiA9IGlzUHJldmlld1xuICAgICAgICA/ICdMYXlvdXQgcHJldmlldyBcdTIwMTQgaW50ZXJtZWRpYXRlIHdvcmtpbmcgZmlsZSwgbm90IGZvciBzdWJtaXNzaW9uJ1xuICAgICAgICA6ICdIVE1MIGZvcm1hdCB3aXRoIGVtYmVkZGVkIEpTT04tTEQgc3RydWN0dXJlZCBkYXRhJztcbiAgICAgIGZvcm1hdCA9IGlzUHJldmlldyA/ICdwcmV2aWV3JyA6ICdodG1sJztcbiAgICB9IGVsc2UgaWYgKGZpbGVuYW1lID09PSAnam9iX2Rlc2NyaXB0aW9uLnR4dCcpIHtcbiAgICAgIGljb24gPSAnXHVEODNEXHVEQ0NCJztcbiAgICAgIGRlc2NyaXB0aW9uID0gJ09yaWdpbmFsIGpvYiBkZXNjcmlwdGlvbiByZWZlcmVuY2UnO1xuICAgIH1cblxuICAgIGZpbGVzLnB1c2goeyBmaWxlbmFtZSwgZGVzY3JpcHRpb24sIGljb24sIGZvcm1hdCB9KTtcbiAgfVxuXG4gIHJldHVybiBmaWxlcztcbn1cblxuZnVuY3Rpb24gX3JlbmRlclZhbGlkYXRpb25TdW1tYXJ5KGNoZWNrcywgc3VtbWFyeSwgcGFnZUNvdW50LCBhdHNFcnJvcikge1xuICBsZXQgaHRtbCA9ICcnO1xuXG4gIGlmIChwYWdlQ291bnQgIT09IG51bGwpIHtcbiAgICBjb25zdCBwYWdlV2FybmluZyA9IHBhZ2VDb3VudCA8IDEuNSB8fCBwYWdlQ291bnQgPiAzO1xuICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJkaXNwbGF5OmlubGluZS1mbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6OHB4O1xuICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiR7cGFnZVdhcm5pbmcgPyAnI2ZlZjljMycgOiAnI2YwZmRmNCd9O1xuICAgICAgICAgICAgICBib3JkZXI6MXB4IHNvbGlkICR7cGFnZVdhcm5pbmcgPyAnI2ZkZTA0NycgOiAnI2JiZjdkMCd9O1xuICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjhweCAxNHB4O21hcmdpbi1ib3R0b206MTZweDtcIj5cbiAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjEuM2VtO1wiPlx1RDgzRFx1RENDNDwvc3Bhbj5cbiAgICAgIDxzdHJvbmc+JHtwYWdlQ291bnR9IHBhZ2Uke3BhZ2VDb3VudCAhPT0gMSA/ICdzJyA6ICcnfTwvc3Ryb25nPlxuICAgICAgJHtwYWdlV2FybmluZ1xuICAgICAgICA/ICc8c3BhbiBzdHlsZT1cImNvbG9yOiNkOTc3MDY7Zm9udC1zaXplOjAuODhlbTtcIj5cdTI2QTAgU2VuaW9yIGNhbmRpZGF0ZSB0YXJnZXQgaXMgMlx1MjAxMzMgcGFnZXM8L3NwYW4+J1xuICAgICAgICA6ICc8c3BhbiBzdHlsZT1cImNvbG9yOiMxNjY1MzQ7Zm9udC1zaXplOjAuODhlbTtcIj5cdTI3MTMgR29vZCBsZW5ndGg8L3NwYW4+J31cbiAgICA8L2Rpdj5gO1xuICB9XG5cbiAgaWYgKGF0c0Vycm9yKSB7XG4gICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2ZlZTJlMjtib3JkZXI6MXB4IHNvbGlkICNmY2E1YTU7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzoxMnB4IDE2cHg7bWFyZ2luLWJvdHRvbToyMHB4O1wiPlxuICAgICAgPHN0cm9uZz5cdTI2QTAgQVRTIHZhbGlkYXRpb24gZXJyb3I6PC9zdHJvbmc+ICR7ZXNjYXBlSHRtbChhdHNFcnJvcil9XG4gICAgPC9kaXY+YDtcbiAgICByZXR1cm4gaHRtbDtcbiAgfVxuXG4gIGlmICghY2hlY2tzLmxlbmd0aCkge1xuICAgIHJldHVybiBodG1sO1xuICB9XG5cbiAgY29uc3Qga2V5d29yZEZhaWwgPSBjaGVja3Muc29tZSgoY2hlY2spID0+IGNoZWNrLm5hbWUgPT09ICdhdHNfa2V5d29yZF9wcmVzZW5jZScgJiYgY2hlY2suc3RhdHVzID09PSAnZmFpbCcpO1xuICBjb25zdCBzdGF0dXNDb2xvdXIgPSBzdW1tYXJ5LmZhaWwgPiAwID8gJyNkYzI2MjYnIDogc3VtbWFyeS53YXJuID4gMCA/ICcjZDk3NzA2JyA6ICcjMTY2NTM0JztcbiAgY29uc3Qgc3RhdHVzSWNvbiA9IHN1bW1hcnkuZmFpbCA+IDAgPyAnXHUyNzRDJyA6IHN1bW1hcnkud2FybiA+IDAgPyAnXHUyNkEwJyA6ICdcdTI3MDUnO1xuXG4gIGh0bWwgKz0gYFxuICAgIDxkZXRhaWxzIG9wZW4gc3R5bGU9XCJtYXJnaW4tYm90dG9tOjIwcHg7XCI+XG4gICAgICA8c3VtbWFyeSBzdHlsZT1cImN1cnNvcjpwb2ludGVyO2ZvbnQtd2VpZ2h0OjcwMDtmb250LXNpemU6MWVtO3BhZGRpbmc6OHB4IDA7Y29sb3I6JHtzdGF0dXNDb2xvdXJ9O1wiPlxuICAgICAgICAke3N0YXR1c0ljb259IEFUUyBSZXBvcnQgXHUyMDE0ICR7c3VtbWFyeS5wYXNzfSBwYXNzLCAke3N1bW1hcnkud2Fybn0gd2FybiwgJHtzdW1tYXJ5LmZhaWx9IGZhaWxcbiAgICAgIDwvc3VtbWFyeT5cbiAgICAgIDx0YWJsZSBjbGFzcz1cInJldmlldy10YWJsZVwiIHN0eWxlPVwibWFyZ2luLXRvcDoxMHB4O2ZvbnQtc2l6ZTowLjg3ZW07XCI+XG4gICAgICAgIDx0aGVhZD48dHI+PHRoPkNoZWNrPC90aD48dGg+Rm9ybWF0PC90aD48dGg+U3RhdHVzPC90aD48dGg+RGV0YWlsPC90aD48L3RyPjwvdGhlYWQ+XG4gICAgICAgIDx0Ym9keT5gO1xuXG4gIGZvciAoY29uc3QgY2hlY2sgb2YgY2hlY2tzKSB7XG4gICAgY29uc3QgYmFja2dyb3VuZCA9IGNoZWNrLnN0YXR1cyA9PT0gJ3Bhc3MnID8gJyNmMGZkZjQnIDogY2hlY2suc3RhdHVzID09PSAnd2FybicgPyAnI2ZlZjljMycgOiAnI2ZlZTJlMic7XG4gICAgY29uc3QgaWNvbiA9IGNoZWNrLnN0YXR1cyA9PT0gJ3Bhc3MnID8gJ1x1MjcwNScgOiBjaGVjay5zdGF0dXMgPT09ICd3YXJuJyA/ICdcdTI2QTAnIDogJ1x1Mjc0Qyc7XG4gICAgY29uc3QgZm9ybWF0QmFkZ2UgPSBgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MTFweDtiYWNrZ3JvdW5kOiNlMGU3ZmY7Y29sb3I6IzM3MzBhMztib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjFweCA1cHg7XCI+JHtlc2NhcGVIdG1sKGNoZWNrLmZvcm1hdCl9PC9zcGFuPmA7XG5cbiAgICBodG1sICs9IGA8dHIgc3R5bGU9XCJiYWNrZ3JvdW5kOiR7YmFja2dyb3VuZH07XCI+XG4gICAgICA8dGQgc3R5bGU9XCJmb250LXdlaWdodDo2MDA7XCI+JHtlc2NhcGVIdG1sKGNoZWNrLmxhYmVsKX08L3RkPlxuICAgICAgPHRkPiR7Zm9ybWF0QmFkZ2V9PC90ZD5cbiAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO1wiPiR7aWNvbn08L3RkPlxuICAgICAgPHRkPjxzbWFsbD4ke2VzY2FwZUh0bWwoY2hlY2suZGV0YWlsKX08L3NtYWxsPjwvdGQ+XG4gICAgPC90cj5gO1xuICB9XG5cbiAgaHRtbCArPSAnPC90Ym9keT48L3RhYmxlPjwvZGV0YWlscz4nO1xuXG4gIGlmIChzdW1tYXJ5LmZhaWwgPiAwKSB7XG4gICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2ZlZTJlMjtib3JkZXI6MXB4IHNvbGlkICNmY2E1YTU7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzoxMHB4IDE2cHg7bWFyZ2luLWJvdHRvbToyMHB4O1wiPlxuICAgICAgPHN0cm9uZz5cdTI3NEMgRml4IHJlcXVpcmVkOjwvc3Ryb25nPiBTb21lIGNoZWNrcyBmYWlsZWQuIEJsb2NrZWQgZm9ybWF0cyBhcmUgZ3JleWVkIG91dCBiZWxvdy5cbiAgICAgICR7a2V5d29yZEZhaWxcbiAgICAgICAgPyAnPGJyPjxzdHJvbmc+QVRTIGtleXdvcmQgZmFpbHVyZSBibG9ja3MgYWxsIGRvd25sb2Fkczwvc3Ryb25nPiBcdTIwMTQgcmUtcnVuIGN1c3RvbWlzYXRpb25zIHRvIGltcHJvdmUga2V5d29yZCBjb3ZlcmFnZS4nXG4gICAgICAgIDogJyd9XG4gICAgPC9kaXY+YDtcbiAgfVxuXG4gIHJldHVybiBodG1sO1xufVxuXG4vLyBDaGVja3MgdGhhdCBhcmUgYWR2aXNvcnkgb25seSBcdTIwMTQgdGhleSB3YXJuIGJ1dCBuZXZlciBibG9jayB0aGUgZG93bmxvYWQgYnV0dG9uLlxuLy8gT25seSBnZW51aW5lbHkgY3JpdGljYWwgZmFpbHVyZXMgKGZpbGUgbm90IGZvdW5kLCBQREYgdW5yZWFkYWJsZSwgYnJva2VuIG91dHB1dClcbi8vIHNob3VsZCBwcmV2ZW50IGEgdXNlciBmcm9tIGRvd25sb2FkaW5nLlxuY29uc3QgX05PTl9CTE9DS0lOR19DSEVDS1MgPSBuZXcgU2V0KFtcbiAgJ2N2X3BhZ2VfY291bnQnLCAgICAgICAgICAgICAgIC8vIGFkdmlzb3J5OiBwYWdlIGxlbmd0aCBvdXRzaWRlIGlkZWFsIHJhbmdlXG4gICdwZGZfdXNfbGV0dGVyJywgICAgICAgICAgICAgICAvLyBhZHZpc29yeTogcGFnZSBzaXplXG4gICdkb2N4X3plcm9fc2hhcGVzJywgICAgICAgICAgICAvLyBhZHZpc29yeTogQVRTIGZvcm1hdHRpbmcgaGludFxuICAnZG9jeF9zdGFuZGFyZF9oZWFkaW5ncycsICAgICAgLy8gYWR2aXNvcnk6IEFUUyBoZWFkaW5nIHRleHRcbiAgJ2RvY3hfaGVhZGluZzFfcHJlc2VudCcsICAgICAgIC8vIGFkdmlzb3J5OiBBVFMgaGVhZGluZyBzdHlsZVxuICAnZG9jeF9kYXRlX2Zvcm1hdF9jb25zaXN0ZW50JywgLy8gYWR2aXNvcnk6IGRhdGUgZm9ybWF0IGNvbnNpc3RlbmN5XG4gICdkb2N4X3B1YmxpY2F0aW9uc19oZWFkaW5nJywgICAvLyBhZHZpc29yeTogcHVibGljYXRpb25zIGhlYWRpbmcgdGV4dFxuICAnaHRtbF9qc29ubGRfdmFsaWRfcGVyc29uJywgICAgLy8gYWR2aXNvcnk6IEpTT04tTEQgc2NoZW1hIHR5cGVcbiAgJ2h0bWxfanNvbmxkX2tub3dzX2Fib3V0JywgICAgIC8vIGFkdmlzb3J5OiBKU09OLUxEIHNraWxscyBwb3B1bGF0aW9uXG5dKTtcblxuZnVuY3Rpb24gX3JlbmRlckRvd25sb2FkR3JpZChmaWxlcywgY2hlY2tzLCBzdW1tYXJ5LCBnZW5lcmF0ZWRBdCA9IG51bGwsIGdlbmVyYXRpb25SdW4gPSBudWxsKSB7XG4gIGNvbnN0IGtleXdvcmRGYWlsID0gY2hlY2tzLnNvbWUoKGNoZWNrKSA9PiBjaGVjay5uYW1lID09PSAnYXRzX2tleXdvcmRfcHJlc2VuY2UnICYmIGNoZWNrLnN0YXR1cyA9PT0gJ2ZhaWwnKTtcbiAgY29uc3QgaXNDcml0aWNhbEZhaWwgPSAoY2hlY2spID0+IGNoZWNrLnN0YXR1cyA9PT0gJ2ZhaWwnICYmICFfTk9OX0JMT0NLSU5HX0NIRUNLUy5oYXMoY2hlY2submFtZSk7XG4gIGNvbnN0IGJsb2NrRG9jeCA9IGtleXdvcmRGYWlsIHx8IGNoZWNrcy5zb21lKChjaGVjaykgPT4gY2hlY2suZm9ybWF0ID09PSAnZG9jeCcgJiYgaXNDcml0aWNhbEZhaWwoY2hlY2spKTtcbiAgY29uc3QgYmxvY2tIdG1sID0ga2V5d29yZEZhaWwgfHwgY2hlY2tzLnNvbWUoKGNoZWNrKSA9PiBjaGVjay5mb3JtYXQgPT09ICdodG1sJyAmJiBpc0NyaXRpY2FsRmFpbChjaGVjaykpO1xuICBjb25zdCBibG9ja1BkZiAgPSBrZXl3b3JkRmFpbCB8fCBjaGVja3Muc29tZSgoY2hlY2spID0+IGNoZWNrLmZvcm1hdCA9PT0gJ3BkZicgICYmIGlzQ3JpdGljYWxGYWlsKGNoZWNrKSk7XG5cbiAgbGV0IGdlbmVyYXRlZExhYmVsID0gJyc7XG4gIGlmIChnZW5lcmF0ZWRBdCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkID0gbmV3IERhdGUoZ2VuZXJhdGVkQXQpO1xuICAgICAgY29uc3QgZGF0ZVN0ciA9IGQudG9Mb2NhbGVTdHJpbmcoJ2VuLVVTJywge1xuICAgICAgICBtb250aDogJ3Nob3J0JywgZGF5OiAnbnVtZXJpYycsIHllYXI6ICdudW1lcmljJyxcbiAgICAgICAgaG91cjogJ251bWVyaWMnLCBtaW51dGU6ICcyLWRpZ2l0JyxcbiAgICAgIH0pO1xuICAgICAgZ2VuZXJhdGVkTGFiZWwgPSAoZ2VuZXJhdGlvblJ1biAmJiBnZW5lcmF0aW9uUnVuID4gMSlcbiAgICAgICAgPyBgUnVuICMke2dlbmVyYXRpb25SdW59IFx1MjAxNCAke2RhdGVTdHJ9YFxuICAgICAgICA6IGRhdGVTdHI7XG4gICAgfSBjYXRjaCAoXykgeyAvKiBpZ25vcmUgKi8gfVxuICB9XG5cbiAgbGV0IGh0bWwgPSAnPGRpdiBjbGFzcz1cImRvd25sb2FkLXNlY3Rpb25cIj48ZGl2IGNsYXNzPVwiZG93bmxvYWQtZ3JpZFwiPic7XG4gIGlmICghZmlsZXMubGVuZ3RoKSB7XG4gICAgaHRtbCArPSAnPHA+Tm8gZG93bmxvYWRhYmxlIGZpbGVzIGZvdW5kLiBQbGVhc2UgdHJ5IGdlbmVyYXRpbmcgeW91ciBDViBhZ2Fpbi48L3A+JztcbiAgICBodG1sICs9ICc8L2Rpdj48L2Rpdj4nO1xuICAgIHJldHVybiBodG1sO1xuICB9XG5cbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgY29uc3QgYmxvY2tlZCA9IChmaWxlLmZvcm1hdCA9PT0gJ2RvY3gnICYmIGJsb2NrRG9jeClcbiAgICAgIHx8IChmaWxlLmZvcm1hdCA9PT0gJ2h0bWwnICYmIGJsb2NrSHRtbClcbiAgICAgIHx8IChmaWxlLmZvcm1hdCA9PT0gJ3BkZicgJiYgYmxvY2tQZGYpO1xuICAgIGNvbnN0IGJsb2NrZWRTdHlsZSA9IGJsb2NrZWRcbiAgICAgID8gJ2N1cnNvcjpub3QtYWxsb3dlZDtvcGFjaXR5OjAuNDtiYWNrZ3JvdW5kOiM5Y2EzYWY7Ym9yZGVyLWNvbG9yOiM5Y2EzYWY7J1xuICAgICAgOiAnJztcbiAgICBjb25zdCBibG9ja2VkTWVzc2FnZSA9IGJsb2NrZWRcbiAgICAgID8gJzxkaXYgc3R5bGU9XCJmb250LXNpemU6MC43OGVtO2NvbG9yOiNkYzI2MjY7bWFyZ2luLXRvcDo0cHg7XCI+XHUyNkQ0IEJsb2NrZWQgXHUyMDE0IG91dHB1dCBmaWxlIGNvdWxkIG5vdCBiZSBnZW5lcmF0ZWQ8L2Rpdj4nXG4gICAgICA6ICcnO1xuICAgIGNvbnN0IHRpbWVzdGFtcExpbmUgPSBnZW5lcmF0ZWRMYWJlbFxuICAgICAgPyBgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjc1ZW07Y29sb3I6IzljYTNhZjttYXJnaW4tdG9wOjNweDtcIj5HZW5lcmF0ZWQgJHtnZW5lcmF0ZWRMYWJlbH08L2Rpdj5gXG4gICAgICA6ICc8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuNzVlbTtjb2xvcjojYzBjNGNjO21hcmdpbi10b3A6M3B4O1wiPk5vdCB5ZXQgZ2VuZXJhdGVkPC9kaXY+JztcblxuICAgIGNvbnN0IHByZXZpZXdCYWRnZSA9IGZpbGUuZm9ybWF0ID09PSAncHJldmlldydcbiAgICAgID8gJzxzcGFuIHN0eWxlPVwiZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luLWxlZnQ6NnB4O2ZvbnQtc2l6ZTowLjc1ZW07Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOiM5MjQwMGU7YmFja2dyb3VuZDojZmVmM2M3O2JvcmRlcjoxcHggc29saWQgI2ZjZDM0ZDtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjFweCA1cHg7dmVydGljYWwtYWxpZ246bWlkZGxlO1wiPldvcmtpbmcgZmlsZSBcdTIwMTQgbm90IGZvciBzdWJtaXNzaW9uPC9zcGFuPidcbiAgICAgIDogJyc7XG5cbiAgICBodG1sICs9IGBcbiAgICAgIDxkaXYgY2xhc3M9XCJkb3dubG9hZC1pdGVtXCIgc3R5bGU9XCIke2Jsb2NrZWQgPyAnb3BhY2l0eTowLjc1OycgOiAnJ30ke2ZpbGUuZm9ybWF0ID09PSAncHJldmlldycgPyAnYm9yZGVyLXN0eWxlOmRhc2hlZDsnIDogJyd9XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkb3dubG9hZC1pY29uXCI+JHtmaWxlLmljb259PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkb3dubG9hZC1pbmZvXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRvd25sb2FkLW5hbWVcIj4ke2VzY2FwZUh0bWwoZmlsZS5maWxlbmFtZSl9JHtwcmV2aWV3QmFkZ2V9PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRvd25sb2FkLWRlc2NyaXB0aW9uXCI+JHtlc2NhcGVIdG1sKGZpbGUuZGVzY3JpcHRpb24pfTwvZGl2PlxuICAgICAgICAgICR7dGltZXN0YW1wTGluZX1cbiAgICAgICAgICAke2Jsb2NrZWRNZXNzYWdlfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgJHtibG9ja2VkXG4gICAgICAgICAgPyBgPGJ1dHRvbiBjbGFzcz1cImJ0bi1kb3dubG9hZFwiIGRpc2FibGVkIHN0eWxlPVwiJHtibG9ja2VkU3R5bGV9XCI+QmxvY2tlZDwvYnV0dG9uPmBcbiAgICAgICAgICA6ICgoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IF9zaWQgPSB0eXBlb2YgZ2V0U2Vzc2lvbklkRnJvbVVSTCA9PT0gJ2Z1bmN0aW9uJyA/IGdldFNlc3Npb25JZEZyb21VUkwoKSA6IG51bGw7XG4gICAgICAgICAgICAgIGNvbnN0IF9zcCAgPSBfc2lkID8gYD9zZXNzaW9uX2lkPSR7ZW5jb2RlVVJJQ29tcG9uZW50KF9zaWQpfWAgOiAnJztcbiAgICAgICAgICAgICAgcmV0dXJuIGA8YSBocmVmPVwiL2FwaS9kb3dubG9hZC8ke2VuY29kZVVSSUNvbXBvbmVudChmaWxlLmZpbGVuYW1lKX0ke19zcH1cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuLWRvd25sb2FkIGRvd25sb2FkLWxpbmtcIiBkb3dubG9hZD1cIiR7ZXNjYXBlSHRtbChmaWxlLmZpbGVuYW1lKX1cIlxuICAgICAgICAgICAgICAgIHN0eWxlPVwidGV4dC1kZWNvcmF0aW9uOm5vbmU7ZGlzcGxheTppbmxpbmUtZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjtcIj5Eb3dubG9hZDwvYT5gO1xuICAgICAgICAgICAgfSkoKX1cbiAgICAgIDwvZGl2PmA7XG4gIH1cblxuICBodG1sICs9ICc8L2Rpdj48L2Rpdj4nO1xuICBpZiAoc3VtbWFyeS5mYWlsID4gMCAmJiBmaWxlcy5sZW5ndGgpIHtcbiAgICBodG1sICs9ICc8cCBzdHlsZT1cIm1hcmdpbi10b3A6MTJweDtjb2xvcjojNmI3MjgwO2ZvbnQtc2l6ZTowLjg4ZW07XCI+QmxvY2tlZCBmb3JtYXRzIHJlZmxlY3QgQVRTIHZhbGlkYXRpb24gZmFpbHVyZXMgZm9yIHRoZSBjb3JyZXNwb25kaW5nIG91dHB1dCB0eXBlcy48L3A+JztcbiAgfVxuICByZXR1cm4gaHRtbDtcbn1cblxuZnVuY3Rpb24gX3JlbmRlclJlZmluZW1lbnRQYW5lbCgpIHtcbiAgcmV0dXJuIGA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDoyNHB4O3BhZGRpbmc6MTZweDtiYWNrZ3JvdW5kOiNmOGZhZmM7Ym9yZGVyOjFweCBzb2xpZCAjZTJlOGYwO1xuICAgICAgICAgICAgYm9yZGVyLXJhZGl1czo4cHg7XCI+XG4gICAgPGRpdiBzdHlsZT1cImZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjEwcHg7Y29sb3I6IzM3NDE1MTtcIj5cdTIxQkIgSXRlcmF0aXZlIFJlZmluZW1lbnQ8L2Rpdj5cbiAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuOWVtO2NvbG9yOiM2YjcyODA7bWFyZ2luLWJvdHRvbToxMnB4O1wiPlxuICAgICAgR28gYmFjayB0byByZWZpbmUgYW4gZWFybGllciBzdGVwIFx1MjAxNCBhbGwgcHJpb3IgZGVjaXNpb25zIGFuZCBhcHByb3ZhbHMgYXJlIHByZXNlcnZlZC5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDoxMHB4O2ZsZXgtd3JhcDp3cmFwO1wiPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1zZWNvbmRhcnlcIiBvbmNsaWNrPVwiYmFja1RvUGhhc2UoJ2N1c3RvbWl6YXRpb25zJylcIiB0aXRsZT1cIlJldHVybiB0byBDdXN0b21pc2F0aW9ucyBzdGVwXCI+XG4gICAgICAgIFx1MjFCQiBSZWZpbmUgQ3VzdG9taXNhdGlvbnNcbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1zZWNvbmRhcnlcIiBvbmNsaWNrPVwiYmFja1RvUGhhc2UoJ3Jld3JpdGUnKVwiIHRpdGxlPVwiUmV0dXJuIHRvIFJld3JpdGUgUmV2aWV3IHN0ZXBcIj5cbiAgICAgICAgXHUyMUJCIFJlZmluZSBSZXdyaXRlc1xuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLXNlY29uZGFyeVwiIG9uY2xpY2s9XCJiYWNrVG9QaGFzZSgnYW5hbHlzaXMnKVwiIHRpdGxlPVwiUmV0dXJuIHRvIEFuYWx5c2lzIHN0ZXBcIj5cbiAgICAgICAgXHUyMUJCIFJlLWFuYWx5c2UgSm9iXG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gX2ZldGNoUGVyc3Vhc2lvbkh0bWwoKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9wZXJzdWFzaW9uLWNoZWNrJyk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICBpZiAoIXJlc3BvbnNlLm9rIHx8ICFkYXRhLm9rKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgY29uc3Qgc3VtbWFyeSA9IGRhdGEuc3VtbWFyeSB8fCB7IGZsYWdnZWQ6IDAsIHN0cm9uZ19jb3VudDogMCwgdG90YWxfYnVsbGV0czogMCB9O1xuICAgIGNvbnN0IGZpbmRpbmdzID0gQXJyYXkuaXNBcnJheShkYXRhLmZpbmRpbmdzKSA/IGRhdGEuZmluZGluZ3MgOiBbXTtcbiAgICBjb25zdCBzY29yZUNvbG9yID0gc3VtbWFyeS5mbGFnZ2VkID09PSAwID8gJyMxMGI5ODEnIDogc3VtbWFyeS5mbGFnZ2VkIDw9IDMgPyAnI2Y1OWUwYicgOiAnI2VmNDQ0NCc7XG4gICAgY29uc3Qgc2NvcmVMYWJlbCA9IHN1bW1hcnkuZmxhZ2dlZCA9PT0gMFxuICAgICAgPyAnRXhjZWxsZW50J1xuICAgICAgOiBzdW1tYXJ5LmZsYWdnZWQgPD0gM1xuICAgICAgICA/ICdHb29kIFx1MjAxNCBtaW5vciBpbXByb3ZlbWVudHMgcG9zc2libGUnXG4gICAgICAgIDogJ05lZWRzIGF0dGVudGlvbic7XG5cbiAgICBsZXQgaHRtbCA9IGA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDoyMHB4O2JvcmRlcjoxcHggc29saWQgI2UyZThmMDtib3JkZXItcmFkaXVzOjhweDtvdmVyZmxvdzpoaWRkZW47XCI+XG4gICAgICA8ZGl2IHN0eWxlPVwicGFkZGluZzoxNHB4IDE2cHg7YmFja2dyb3VuZDojZjhmYWZjO2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjthbGlnbi1pdGVtczpjZW50ZXI7Y3Vyc29yOnBvaW50ZXI7XCJcbiAgICAgICAgICAgb25jbGljaz1cInRoaXMubmV4dEVsZW1lbnRTaWJsaW5nLnN0eWxlLmRpc3BsYXk9dGhpcy5uZXh0RWxlbWVudFNpYmxpbmcuc3R5bGUuZGlzcGxheT09PSdub25lJz8nYmxvY2snOidub25lJ1wiPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC13ZWlnaHQ6NjAwO2NvbG9yOiMxZjI5Mzc7XCI+XHVEODNEXHVEQ0FBIEJ1bGxldCBQZXJzdWFzaXZlbmVzczwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cIm1hcmdpbi1sZWZ0OjEycHg7YmFja2dyb3VuZDoke3Njb3JlQ29sb3J9O2NvbG9yOiNmZmY7Ym9yZGVyLXJhZGl1czo0cHg7cGFkZGluZzoycHggOHB4O2ZvbnQtc2l6ZTowLjhlbTtcIj4ke3Njb3JlTGFiZWx9PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07Y29sb3I6IzZiNzI4MDtcIj5cbiAgICAgICAgICAke3N1bW1hcnkuc3Ryb25nX2NvdW50fS8ke3N1bW1hcnkudG90YWxfYnVsbGV0c30gc3Ryb25nIFx1MDBCNyAke3N1bW1hcnkuZmxhZ2dlZH0gZmxhZ2dlZCBcdTAwQjcgY2xpY2sgdG8gJHtzdW1tYXJ5LmZsYWdnZWQgPiAwID8gJ2V4cGFuZCcgOiAnY29sbGFwc2UnfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PmA7XG5cbiAgICBpZiAoZmluZGluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cInBhZGRpbmc6MTJweCAxNnB4O2Rpc3BsYXk6JHtzdW1tYXJ5LmZsYWdnZWQgPD0gMyA/ICdibG9jaycgOiAnbm9uZSd9O1wiPmA7XG4gICAgICBmb3IgKGNvbnN0IGZpbmRpbmcgb2YgZmluZGluZ3MpIHtcbiAgICAgICAgY29uc3Qgc2V2ZXJpdHkgPSBmaW5kaW5nLnNldmVyaXR5ID09PSAnd2FybmluZydcbiAgICAgICAgICA/IHsgYmFja2dyb3VuZDogJyNmZmY3ZWQnLCBib3JkZXI6ICcjZjU5ZTBiJywgbGFiZWw6ICdcdTI2QTAgV2FybmluZycgfVxuICAgICAgICAgIDogeyBiYWNrZ3JvdW5kOiAnI2YwZjlmZicsIGJvcmRlcjogJyMzYjgyZjYnLCBsYWJlbDogJ1x1MjEzOSBJbmZvJyB9O1xuICAgICAgICBjb25zdCB0cnVuY2F0ZWRUZXh0ID0gZmluZGluZy50ZXh0ICYmIGZpbmRpbmcudGV4dC5sZW5ndGggPiAxMjBcbiAgICAgICAgICA/IGAke2ZpbmRpbmcudGV4dC5zbGljZSgwLCAxMjApfVx1MjAyNmBcbiAgICAgICAgICA6IGZpbmRpbmcudGV4dCB8fCAnJztcbiAgICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTJweDtwYWRkaW5nOjEwcHggMTJweDtiYWNrZ3JvdW5kOiR7c2V2ZXJpdHkuYmFja2dyb3VuZH07Ym9yZGVyLWxlZnQ6M3B4IHNvbGlkICR7c2V2ZXJpdHkuYm9yZGVyfTtib3JkZXItcmFkaXVzOjAgNnB4IDZweCAwO1wiPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC44ZW07Y29sb3I6IzZiNzI4MDttYXJnaW4tYm90dG9tOjRweDtcIj5cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiYmFja2dyb3VuZDoke3NldmVyaXR5LmJvcmRlcn07Y29sb3I6I2ZmZjtib3JkZXItcmFkaXVzOjNweDtwYWRkaW5nOjFweCA2cHg7Zm9udC1zaXplOjAuOWVtO1wiPiR7c2V2ZXJpdHkubGFiZWx9PC9zcGFuPlxuICAgICAgICAgICAgQnVsbGV0ICR7KGZpbmRpbmcuYnVsbGV0X2luZGV4ID8/IDApICsgMX0ke2ZpbmRpbmcuZXhwX2lkID8gYCBcdTAwQjcgJHtlc2NhcGVIdG1sKGZpbmRpbmcuZXhwX2lkKX1gIDogJyd9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjllbTtjb2xvcjojMzc0MTUxO21hcmdpbi1ib3R0b206NnB4O1wiPlwiJHtlc2NhcGVIdG1sKHRydW5jYXRlZFRleHQpfVwiPC9kaXY+XG4gICAgICAgICAgPHVsIHN0eWxlPVwibWFyZ2luOjA7cGFkZGluZy1sZWZ0OjE4cHg7XCI+YDtcbiAgICAgICAgZm9yIChjb25zdCBpc3N1ZSBvZiBmaW5kaW5nLmlzc3VlcyB8fCBbXSkge1xuICAgICAgICAgIGh0bWwgKz0gYDxsaSBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07Y29sb3I6IzZiNzI4MDttYXJnaW4tYm90dG9tOjJweDtcIj4ke2VzY2FwZUh0bWwoaXNzdWUuc3VnZ2VzdGlvbil9PC9saT5gO1xuICAgICAgICB9XG4gICAgICAgIGh0bWwgKz0gJzwvdWw+PC9kaXY+JztcbiAgICAgIH1cbiAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgfSBlbHNlIHtcbiAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJwYWRkaW5nOjEycHggMTZweDtjb2xvcjojMTBiOTgxO2ZvbnQtc2l6ZTowLjllbTtcIj5BbGwgYnVsbGV0cyBtZWV0IHBlcnN1YXNpdmVuZXNzIGNyaXRlcmlhLjwvZGl2Pic7XG4gICAgfVxuXG4gICAgLy8gTmFycmF0aXZlLXRocmVhZCBhZHZpc29yeSAoR0FQLTI4MSlcbiAgICBjb25zdCBudGEgPSBzdW1tYXJ5Lm5hcnJhdGl2ZV90aHJlYWRfYWR2aXNvcnk7XG4gICAgaWYgKG50YSkge1xuICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cInBhZGRpbmc6MTBweCAxNnB4O2JhY2tncm91bmQ6I2ZlZjljMztib3JkZXItdG9wOjFweCBzb2xpZCAjZmRlNjhhO1wiPlxuICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtd2VpZ2h0OjYwMDtjb2xvcjojOTI0MDBlO1wiPlx1RDgzRVx1RERGNSBOYXJyYXRpdmUgZm9jdXMgYWR2aXNvcnk6PC9zcGFuPlxuICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjllbTtjb2xvcjojNzgzNTBmO21hcmdpbi1sZWZ0OjZweDtcIj4ke2VzY2FwZUh0bWwobnRhLmRldGFpbCl9PC9zcGFuPlxuICAgICAgPC9kaXY+YDtcbiAgICB9XG5cbiAgICAvLyBOYXJyYXRpdmUtYXJjIGFkdmlzb3J5IChHQVAtMTcpOiByZWNlbnQgcm9sZSBzaG91bGQgc2hvdyBzdHJvbmdlc3QgdmVyYnNcbiAgICBjb25zdCBuYWEgPSBzdW1tYXJ5Lm5hcnJhdGl2ZV9hcmNfYWR2aXNvcnk7XG4gICAgaWYgKG5hYSkge1xuICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cInBhZGRpbmc6MTBweCAxNnB4O2JhY2tncm91bmQ6I2ZmZjdlZDtib3JkZXItdG9wOjFweCBzb2xpZCAjZmVkN2FhO1wiPlxuICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtd2VpZ2h0OjYwMDtjb2xvcjojOWEzNDEyO1wiPlx1RDgzRFx1RENDOCBOYXJyYXRpdmUgYXJjIGFkdmlzb3J5Ojwvc3Bhbj5cbiAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC45ZW07Y29sb3I6IzdjMmQxMjttYXJnaW4tbGVmdDo2cHg7XCI+JHtlc2NhcGVIdG1sKG5hYS5kZXRhaWwpfTwvc3Bhbj5cbiAgICAgIDwvZGl2PmA7XG4gICAgfVxuXG4gICAgaHRtbCArPSAnPC9kaXY+JztcbiAgICByZXR1cm4gaHRtbDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cud2FybignUGVyc3Vhc2lvbiBjaGVjayBmYWlsZWQ6JywgZXJyb3IpO1xuICAgIHJldHVybiAnJztcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBwb3B1bGF0ZURvd25sb2FkVGFiKGN2RGF0YSkge1xuICBzdGF0ZU1hbmFnZXIuc2V0VGFiRGF0YSgnY3YnLCBjdkRhdGEpO1xuXG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9jdW1lbnQtY29udGVudCcpO1xuICBpZiAoIWNvbnRlbnQpIHJldHVybjtcblxuICBpZiAoIWN2RGF0YSB8fCAodHlwZW9mIGN2RGF0YSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMoY3ZEYXRhKS5sZW5ndGggPT09IDApKSB7XG4gICAgY29udGVudC5pbm5lckhUTUwgPSAnPGgxPlx1MkIwN1x1RkUwRiBEb3dubG9hZCBHZW5lcmF0ZWQgRmlsZXM8L2gxPjxkaXYgY2xhc3M9XCJlbXB0eS1zdGF0ZVwiPjxkaXYgY2xhc3M9XCJpY29uXCI+XHUyQjA3XHVGRTBGPC9kaXY+PGgzPk5vIEZpbGVzIEF2YWlsYWJsZTwvaDM+PHA+R2VuZXJhdGUgYSBDViBmaXJzdCB0byBzZWUgZG93bmxvYWQgb3B0aW9ucy48L3A+PC9kaXY+JztcbiAgICByZXR1cm47XG4gIH1cblxuICBjb250ZW50LmlubmVySFRNTCA9ICc8aDE+XHUyQjA3XHVGRTBGIERvd25sb2FkIEdlbmVyYXRlZCBGaWxlczwvaDE+PHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO21hcmdpbi1ib3R0b206MTZweDtcIj5SdW5uaW5nIEFUUyB2YWxpZGF0aW9uXHUyMDI2PC9wPic7XG5cbiAgbGV0IGNoZWNrcyA9IFtdO1xuICBsZXQgcGFnZUNvdW50ID0gbnVsbDtcbiAgbGV0IHN1bW1hcnkgPSB7IHBhc3M6IDAsIHdhcm46IDAsIGZhaWw6IDAgfTtcbiAgbGV0IGF0c0Vycm9yID0gbnVsbDtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL2F0cy12YWxpZGF0ZScpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgaWYgKGRhdGEub2spIHtcbiAgICAgIGNoZWNrcyA9IGRhdGEuY2hlY2tzIHx8IFtdO1xuICAgICAgcGFnZUNvdW50ID0gZGF0YS5wYWdlX2NvdW50ID8/IG51bGw7XG4gICAgICBzdW1tYXJ5ID0gZGF0YS5zdW1tYXJ5IHx8IHN1bW1hcnk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF0c0Vycm9yID0gZGF0YS5lcnJvciB8fCAnVmFsaWRhdGlvbiBmYWlsZWQnO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBhdHNFcnJvciA9IGBOZXR3b3JrIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YDtcbiAgfVxuXG4gIGNvbnN0IGZpbGVzID0gX2NvbGxlY3REb3dubG9hZGFibGVGaWxlcyhjdkRhdGEpO1xuICBsZXQgaHRtbCA9ICc8aDE+XHUyQjA3XHVGRTBGIEZpbGUgUmV2aWV3PC9oMT4nO1xuICBodG1sICs9ICc8cCBzdHlsZT1cImZvbnQtc2l6ZTowLjgzZW07Y29sb3I6Izk0YTNiODttYXJnaW4tYm90dG9tOjE2cHg7cGFkZGluZzo4cHggMTJweDtiYWNrZ3JvdW5kOiNmOGZhZmM7Ym9yZGVyLXJhZGl1czo2cHg7Ym9yZGVyLWxlZnQ6M3B4IHNvbGlkICNlMmU4ZjA7XCI+XHUyNzA1IDxlbT5UaGlzIGlzIHRoZSA8c3Ryb25nPmNvbXBsZXRlbmVzcyBjaGVjazwvc3Ryb25nPiBzdGVwIFx1MjAxNCBBVFMgdmFsaWRhdGlvbiBydW5zIGhlcmUgYW5kIHlvdSBjYW4gYXJjaGl2ZSB0aGUgYXBwbGljYXRpb24uIFRvIGRvd25sb2FkIGZpbGVzIGltbWVkaWF0ZWx5IGFmdGVyIGdlbmVyYXRpb24sIHVzZSB0aGUgPHN0cm9uZz5HZW5lcmF0ZWQgRmlsZXM8L3N0cm9uZz4gdGFiLjwvZW0+PC9wPic7XG4gIGh0bWwgKz0gX3JlbmRlclZhbGlkYXRpb25TdW1tYXJ5KGNoZWNrcywgc3VtbWFyeSwgcGFnZUNvdW50LCBhdHNFcnJvcik7XG5cbiAgY29uc3Qgc3VtbWFyeVdhcm5pbmdzID0gKGN2RGF0YS5tZXRhZGF0YT8uc3VtbWFyeV93YXJuaW5ncyB8fCBbXSk7XG4gIGlmIChzdW1tYXJ5V2FybmluZ3MubGVuZ3RoKSB7XG4gICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2ZlZjljMztib3JkZXI6MXB4IHNvbGlkICNmY2QzNGQ7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzoxMnB4IDE2cHg7bWFyZ2luLWJvdHRvbToxNnB4O1wiPlxuICAgICAgPHN0cm9uZz5cdTI2QTAgUHJvZmVzc2lvbmFsIFN1bW1hcnkgcXVhbGl0eSBub3RpY2VzICgke3N1bW1hcnlXYXJuaW5ncy5sZW5ndGh9KTo8L3N0cm9uZz5cbiAgICAgIDx1bCBzdHlsZT1cIm1hcmdpbjo4cHggMCAwIDA7cGFkZGluZy1sZWZ0OjE4cHg7XCI+XG4gICAgICAgICR7c3VtbWFyeVdhcm5pbmdzLm1hcCh3ID0+IGA8bGkgc3R5bGU9XCJmb250LXNpemU6MC45ZW07XCI+JHtlc2NhcGVIdG1sKHcpfTwvbGk+YCkuam9pbignJyl9XG4gICAgICA8L3VsPlxuICAgICAgPHAgc3R5bGU9XCJtYXJnaW46OHB4IDAgMDtmb250LXNpemU6MC44N2VtO2NvbG9yOiM3ODM1MGY7XCI+VGhlc2UgYXJlIGFkdmlzb3J5IHdhcm5pbmdzIFx1MjAxNCByZXZpZXcgdGhlIFN1bW1hcnkgdGFiIGlmIHlvdSB3aXNoIHRvIHVwZGF0ZSB0aGUgc3VtbWFyeSBiZWZvcmUgc3VibWl0dGluZy48L3A+XG4gICAgPC9kaXY+YDtcbiAgfVxuXG4gIGNvbnN0IHB1YmxpY2F0aW9uV2FybmluZ3MgPSAoY3ZEYXRhLm1ldGFkYXRhPy5wdWJsaWNhdGlvbl93YXJuaW5ncyB8fCBbXSk7XG4gIGlmIChwdWJsaWNhdGlvbldhcm5pbmdzLmxlbmd0aCkge1xuICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZWY5YzM7Ym9yZGVyOjFweCBzb2xpZCAjZmNkMzRkO2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MTJweCAxNnB4O21hcmdpbi1ib3R0b206MTZweDtcIj5cbiAgICAgIDxzdHJvbmc+XHUyNkEwIFB1YmxpY2F0aW9uIHZlbnVlIGluZm9ybWF0aW9uIGluY29tcGxldGUgKCR7cHVibGljYXRpb25XYXJuaW5ncy5sZW5ndGh9KTo8L3N0cm9uZz5cbiAgICAgIDx1bCBzdHlsZT1cIm1hcmdpbjo4cHggMCAwIDA7cGFkZGluZy1sZWZ0OjE4cHg7XCI+XG4gICAgICAgICR7cHVibGljYXRpb25XYXJuaW5ncy5tYXAodyA9PiBgPGxpIHN0eWxlPVwiZm9udC1zaXplOjAuOWVtO1wiPiR7ZXNjYXBlSHRtbCh3KX08L2xpPmApLmpvaW4oJycpfVxuICAgICAgPC91bD5cbiAgICAgIDxwIHN0eWxlPVwibWFyZ2luOjhweCAwIDA7Zm9udC1zaXplOjAuODdlbTtjb2xvcjojNzgzNTBmO1wiPkFkZCBtaXNzaW5nIGpvdXJuYWwgb3IgY29uZmVyZW5jZSBuYW1lcyB0byB5b3VyIE1hc3RlciBDViBiZWZvcmUgc3VibWl0dGluZyBcdTIwMTQgaW5jb21wbGV0ZSB2ZW51ZSBkZXRhaWxzIHdlYWtlbiBjcmVkaWJpbGl0eS48L3A+XG4gICAgPC9kaXY+YDtcbiAgfVxuXG4gIGNvbnN0IGxvbmdCdWxsZXRXYXJuaW5ncyA9IChjdkRhdGEubWV0YWRhdGE/LmxvbmdfYnVsbGV0X3dhcm5pbmdzIHx8IFtdKTtcbiAgaWYgKGxvbmdCdWxsZXRXYXJuaW5ncy5sZW5ndGgpIHtcbiAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZmVmOWMzO2JvcmRlcjoxcHggc29saWQgI2ZjZDM0ZDtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjEycHggMTZweDttYXJnaW4tYm90dG9tOjE2cHg7XCI+XG4gICAgICA8c3Ryb25nPlx1MjZBMCBMb25nIGJ1bGxldCBwb2ludHMgZGV0ZWN0ZWQgKCR7bG9uZ0J1bGxldFdhcm5pbmdzLmxlbmd0aH0pIFx1MjAxNCBtYXkgZXhjZWVkIDIgbGluZXM6PC9zdHJvbmc+XG4gICAgICA8dWwgc3R5bGU9XCJtYXJnaW46OHB4IDAgMCAwO3BhZGRpbmctbGVmdDoxOHB4O2xpc3Qtc3R5bGU6bm9uZTtcIj5cbiAgICAgICAgJHtsb25nQnVsbGV0V2FybmluZ3MubWFwKHcgPT4gYDxsaSBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07bWFyZ2luLWJvdHRvbTo0cHg7XCI+PHN0cm9uZz4ke2VzY2FwZUh0bWwody5jb21wYW55KX0gXHUwMEI3ICR7ZXNjYXBlSHRtbCh3LnRpdGxlKX08L3N0cm9uZz4gKCR7dy5jaGFyX2NvdW50fSBjaGFycyk8YnI+PHNwYW4gc3R5bGU9XCJjb2xvcjojNmI3MjgwO1wiPlwiJHtlc2NhcGVIdG1sKHcuYnVsbGV0X3RleHQpfVwiPC9zcGFuPjwvbGk+YCkuam9pbignJyl9XG4gICAgICA8L3VsPlxuICAgICAgPHAgc3R5bGU9XCJtYXJnaW46OHB4IDAgMDtmb250LXNpemU6MC44N2VtO2NvbG9yOiM3ODM1MGY7XCI+Q29uc2lkZXIgc2hvcnRlbmluZyB0aGVzZSBidWxsZXRzIFx1MjAxNCBhaW0gZm9yIFx1MjI2NDIwMCBjaGFyYWN0ZXJzIGVhY2ggZm9yIGNsZWFuIDItbGluZSByZW5kZXJpbmcgaW4gdGhlIERPQ1guPC9wPlxuICAgIDwvZGl2PmA7XG4gIH1cblxuICBjb25zdCBzcGFyc2VFeHBXYXJuaW5ncyA9IChjdkRhdGEubWV0YWRhdGE/LnNwYXJzZV9leHBlcmllbmNlX3dhcm5pbmdzIHx8IFtdKTtcbiAgaWYgKHNwYXJzZUV4cFdhcm5pbmdzLmxlbmd0aCkge1xuICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZWY5YzM7Ym9yZGVyOjFweCBzb2xpZCAjZmNkMzRkO2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MTJweCAxNnB4O21hcmdpbi1ib3R0b206MTZweDtcIj5cbiAgICAgIDxzdHJvbmc+XHUyNkEwIFNwYXJzZSBleHBlcmllbmNlIGVudHJpZXMgKCR7c3BhcnNlRXhwV2FybmluZ3MubGVuZ3RofSkgXHUyMDE0IGZld2VyIHRoYW4gMiBidWxsZXRzOjwvc3Ryb25nPlxuICAgICAgPHVsIHN0eWxlPVwibWFyZ2luOjhweCAwIDAgMDtwYWRkaW5nLWxlZnQ6MThweDtsaXN0LXN0eWxlOm5vbmU7XCI+XG4gICAgICAgICR7c3BhcnNlRXhwV2FybmluZ3MubWFwKHcgPT4gYDxsaSBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07bWFyZ2luLWJvdHRvbToycHg7XCI+PHN0cm9uZz4ke2VzY2FwZUh0bWwody5jb21wYW55KX0gXHUwMEI3ICR7ZXNjYXBlSHRtbCh3LnRpdGxlKX08L3N0cm9uZz4gXHUyMDE0ICR7dy5idWxsZXRfY291bnQgPT09IDAgPyAnbm8gYnVsbGV0cyBzZWxlY3RlZCcgOiAnMSBidWxsZXQgc2VsZWN0ZWQnfTwvbGk+YCkuam9pbignJyl9XG4gICAgICA8L3VsPlxuICAgICAgPHAgc3R5bGU9XCJtYXJnaW46OHB4IDAgMDtmb250LXNpemU6MC44N2VtO2NvbG9yOiM3ODM1MGY7XCI+SW5jbHVkZSBhdCBsZWFzdCAyIGJ1bGxldHMgcGVyIHJvbGUgdG8gZGVtb25zdHJhdGUgaW1wYWN0LiBSZXR1cm4gdG8gdGhlIEV4cGVyaWVuY2UgdGFiIHRvIGFkZCBtb3JlLjwvcD5cbiAgICA8L2Rpdj5gO1xuICB9XG5cbiAgY29uc3QgeWVhck9ubHlEYXRlV2FybmluZ3MgPSAoY3ZEYXRhLm1ldGFkYXRhPy55ZWFyX29ubHlfZGF0ZV93YXJuaW5ncyB8fCBbXSk7XG4gIGlmICh5ZWFyT25seURhdGVXYXJuaW5ncy5sZW5ndGgpIHtcbiAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZmVmOWMzO2JvcmRlcjoxcHggc29saWQgI2ZjZDM0ZDtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjEycHggMTZweDttYXJnaW4tYm90dG9tOjE2cHg7XCI+XG4gICAgICA8c3Ryb25nPlx1MjZBMCBZZWFyLW9ubHkgZGF0ZXMgZGV0ZWN0ZWQgKCR7eWVhck9ubHlEYXRlV2FybmluZ3MubGVuZ3RofSkgXHUyMDE0IG1vbnRoL3llYXIgZm9ybWF0IHJlY29tbWVuZGVkOjwvc3Ryb25nPlxuICAgICAgPHVsIHN0eWxlPVwibWFyZ2luOjhweCAwIDAgMDtwYWRkaW5nLWxlZnQ6MThweDtsaXN0LXN0eWxlOm5vbmU7XCI+XG4gICAgICAgICR7eWVhck9ubHlEYXRlV2FybmluZ3MubWFwKHcgPT4gYDxsaSBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07bWFyZ2luLWJvdHRvbToycHg7XCI+PHN0cm9uZz4ke2VzY2FwZUh0bWwody5jb21wYW55KX0gXHUwMEI3ICR7ZXNjYXBlSHRtbCh3LnRpdGxlKX08L3N0cm9uZz4gXHUyMDE0ICR7dy5maWVsZCA9PT0gJ3N0YXJ0X2RhdGUnID8gJ3N0YXJ0JyA6ICdlbmQnfSBkYXRlIGlzIFwiJHtlc2NhcGVIdG1sKHcuZGF0ZV92YWx1ZSl9XCI8L2xpPmApLmpvaW4oJycpfVxuICAgICAgPC91bD5cbiAgICAgIDxwIHN0eWxlPVwibWFyZ2luOjhweCAwIDA7Zm9udC1zaXplOjAuODdlbTtjb2xvcjojNzgzNTBmO1wiPlllYXItb25seSBkYXRlcyByZWR1Y2UgY2hyb25vbG9naWNhbCBwcmVjaXNpb24uIFVwZGF0ZSB0byBNb250aCBZWVlZIGZvcm1hdCAoZS5nLiBcIkphbiAyMDIwXCIpIGluIHRoZSBNYXN0ZXIgQ1YgZm9yIGJlc3QgQVRTIGNvbXBhdGliaWxpdHkuPC9wPlxuICAgIDwvZGl2PmA7XG4gIH1cblxuICBjb25zdCByZXdyaXRlQXVkaXRNaXNtYXRjaGVzID0gKGN2RGF0YS5tZXRhZGF0YT8ucmV3cml0ZV9hdWRpdF9taXNtYXRjaGVzIHx8IFtdKTtcbiAgaWYgKHJld3JpdGVBdWRpdE1pc21hdGNoZXMubGVuZ3RoKSB7XG4gICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2ZlZjJmMjtib3JkZXI6MXB4IHNvbGlkICNmY2E1YTU7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzoxMnB4IDE2cHg7bWFyZ2luLWJvdHRvbToxNnB4O1wiPlxuICAgICAgPHN0cm9uZz5cdTI2QTAgUmV3cml0ZSBjb250ZW50IG1pc21hdGNoICgke3Jld3JpdGVBdWRpdE1pc21hdGNoZXMubGVuZ3RofSkgXHUyMDE0IGFjY2VwdGVkIHJld3JpdGVzIG5vdCBmb3VuZCBpbiBnZW5lcmF0ZWQgdGV4dDo8L3N0cm9uZz5cbiAgICAgIDx1bCBzdHlsZT1cIm1hcmdpbjo4cHggMCAwIDA7cGFkZGluZy1sZWZ0OjE4cHg7bGlzdC1zdHlsZTpub25lO1wiPlxuICAgICAgICAke3Jld3JpdGVBdWRpdE1pc21hdGNoZXMubWFwKG0gPT4gYDxsaSBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07bWFyZ2luLWJvdHRvbTo2cHg7XCI+PHN0cm9uZz4ke2VzY2FwZUh0bWwobS5sb2NhdGlvbiB8fCBtLnR5cGUpfTwvc3Ryb25nPjxicj48c3BhbiBzdHlsZT1cImNvbG9yOiMzNzQxNTE7XCI+RXhwZWN0ZWQ6IDxlbT5cIiR7ZXNjYXBlSHRtbCgobS5leHBlY3RlZCB8fCAnJykuc2xpY2UoMCwgMTIwKSl9JHsobS5leHBlY3RlZCB8fCAnJykubGVuZ3RoID4gMTIwID8gJ1x1MjAyNicgOiAnJ31cIjwvZW0+PC9zcGFuPjxicj48c3BhbiBzdHlsZT1cImNvbG9yOiM5Y2EzYWY7XCI+QWN0dWFsOiA8ZW0+XCIke2VzY2FwZUh0bWwoKG0uYWN0dWFsIHx8ICcnKS5zbGljZSgwLCAxMjApKX0keyhtLmFjdHVhbCB8fCAnJykubGVuZ3RoID4gMTIwID8gJ1x1MjAyNicgOiAnJ31cIjwvZW0+PC9zcGFuPjwvbGk+YCkuam9pbignJyl9XG4gICAgICA8L3VsPlxuICAgICAgPHAgc3R5bGU9XCJtYXJnaW46OHB4IDAgMDtmb250LXNpemU6MC44N2VtO2NvbG9yOiM3ZjFkMWQ7XCI+VGhlc2UgYWNjZXB0ZWQgcmV3cml0ZXMgbWF5IG5vdCBoYXZlIGJlZW4gYXBwbGllZC4gUmUtZ2VuZXJhdGUgdGhlIENWIG9yIGNoZWNrIHRoZSByZXdyaXRlIHJldmlldyBzdGVwLjwvcD5cbiAgICA8L2Rpdj5gO1xuICB9XG5cbiAgY29uc3Qgb3ZlcmxhcFdhcm5pbmdzID0gKGN2RGF0YS5kYXRlX292ZXJsYXBfd2FybmluZ3MgfHwgW10pO1xuICBpZiAob3ZlcmxhcFdhcm5pbmdzLmxlbmd0aCkge1xuICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZWY5YzM7Ym9yZGVyOjFweCBzb2xpZCAjZmRlMDQ3O2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MTJweCAxNnB4O21hcmdpbi1ib3R0b206MTZweDtcIj5cbiAgICAgIDxzdHJvbmc+XHUyNkEwIEVtcGxveW1lbnQgZGF0ZSBvdmVybGFwcyBkZXRlY3RlZCAoJHtvdmVybGFwV2FybmluZ3MubGVuZ3RofSk6PC9zdHJvbmc+XG4gICAgICA8dWwgc3R5bGU9XCJtYXJnaW46OHB4IDAgMCAwO3BhZGRpbmctbGVmdDoxOHB4O1wiPlxuICAgICAgICAke292ZXJsYXBXYXJuaW5ncy5tYXAodyA9PiBgPGxpPjxzdHJvbmc+JHtlc2NhcGVIdG1sKHcuZW50cnlfYSl9PC9zdHJvbmc+IG92ZXJsYXBzIHdpdGggPHN0cm9uZz4ke2VzY2FwZUh0bWwody5lbnRyeV9iKX08L3N0cm9uZz48YnI+PHNtYWxsIHN0eWxlPVwiY29sb3I6IzkyNDAwZTtcIj4ke2VzY2FwZUh0bWwody5vdmVybGFwX2Rlc2NyaXB0aW9uKX08L3NtYWxsPjwvbGk+YCkuam9pbignJyl9XG4gICAgICA8L3VsPlxuICAgICAgPHAgc3R5bGU9XCJtYXJnaW46OHB4IDAgMDtmb250LXNpemU6MC44N2VtO2NvbG9yOiM3ODM1MGY7XCI+UmV2aWV3IHRoZXNlIGVudHJpZXMgaW4gdGhlIEV4cGVyaWVuY2UgdGFiIGJlZm9yZSBzdWJtaXR0aW5nIHlvdXIgYXBwbGljYXRpb24uPC9wPlxuICAgIDwvZGl2PmA7XG4gIH1cblxuICBjb25zdCBnZW5lcmF0ZWRBdCA9IGN2RGF0YS5tZXRhZGF0YT8uZ2VuZXJhdGlvbl9kYXRlID8/IG51bGw7XG4gIGNvbnN0IGdlbmVyYXRpb25SdW4gPSBjdkRhdGEubWV0YWRhdGE/LmdlbmVyYXRpb25fcnVuID8/IG51bGw7XG4gIGh0bWwgKz0gX3JlbmRlckRvd25sb2FkR3JpZChmaWxlcywgY2hlY2tzLCBzdW1tYXJ5LCBnZW5lcmF0ZWRBdCwgZ2VuZXJhdGlvblJ1bik7XG5cbiAgaWYgKGN2RGF0YS5vdXRwdXRfZGlyKSB7XG4gICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6MjBweDtwYWRkaW5nOjEycHg7YmFja2dyb3VuZDojZjFmNWY5O2JvcmRlci1yYWRpdXM6NnB4O2ZvbnQtc2l6ZToxNHB4O2NvbG9yOiM2NDc0OGI7XCI+XG4gICAgICA8c3Ryb25nPk91dHB1dCBEaXJlY3Rvcnk6PC9zdHJvbmc+ICR7ZXNjYXBlSHRtbChjdkRhdGEub3V0cHV0X2Rpcil9XG4gICAgPC9kaXY+YDtcbiAgfVxuXG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gYCR7aHRtbH08cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7bWFyZ2luLXRvcDoxNnB4O2ZvbnQtc2l6ZTowLjllbTtcIj5BbmFseXNpbmcgYnVsbGV0IHBlcnN1YXNpdmVuZXNzXHUyMDI2PC9wPmA7XG4gIGh0bWwgKz0gYXdhaXQgX2ZldGNoUGVyc3Vhc2lvbkh0bWwoKTtcbiAgaHRtbCArPSBfcmVuZGVyUmVmaW5lbWVudFBhbmVsKCk7XG4gIGh0bWwgKz0gYDxkaXYgY2xhc3M9XCJuYXYtYnV0dG9ucyBuYXYtZW5kXCIgc3R5bGU9XCJtYXJnaW4tdG9wOjE2cHg7XCI+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImNvbnRpbnVlLWJ0blwiIG9uY2xpY2s9XCJoYW5kbGVTdGVwQ2xpY2soJ2NvdmVyX2xldHRlcicpXCI+XG4gICAgICBcdUQ4M0RcdURDRTkgUHJvY2VlZCB0byBDb3ZlciBMZXR0ZXIgXHUyMTkyXG4gICAgPC9idXR0b24+XG4gIDwvZGl2PmA7XG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gaHRtbDtcbn1cblxuZXhwb3J0IHsgcG9wdWxhdGVEb3dubG9hZFRhYiB9OyIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL2ZpbmFsLWdlbmVyYXRlLmpzXG4gKiBGaW5hbCBnZW5lcmF0aW9uIHN0ZXA6IHNob3dzIGRvd25sb2FkIGxpbmtzIGZvciB0aGUgZ2VuZXJhdGVkIGZpbGVzXG4gKiAoUERGLCBBVFMgRE9DWCwgaHVtYW4gRE9DWCkgYW5kIGEgXCJQcm9jZWVkIHRvIERvd25sb2FkIFJldmlldyBcdTIxOTJcIiBidXR0b25cbiAqIHRoYXQgYWR2YW5jZXMgdGhlIHdvcmtmbG93IHRvIHRoZSBkb3dubG9hZCBzdGVwLlxuICpcbiAqIERlcGVuZGVuY2llcyAocmVzb2x2ZWQgdGhyb3VnaCBnbG9iYWxUaGlzIGF0IHJ1bnRpbWUpOlxuICogICBhcGlDYWxsLCBhcHBlbmRNZXNzYWdlLCBlc2NhcGVIdG1sLCBzdGF0ZU1hbmFnZXIsIHN3aXRjaFRhYlxuICovXG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmNvbnN0IGxvZyA9IGdldExvZ2dlcignZmluYWwtZ2VuZXJhdGUnKTtcblxuaW1wb3J0IHsgc3RhdGVNYW5hZ2VyIH0gZnJvbSAnLi9zdGF0ZS1tYW5hZ2VyLmpzJztcblxuLy8gXHUyNTAwXHUyNTAwIFByZXZpZXcgc3RhdGUgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmxldCBfcHJldmlld09wZW4gPSB0cnVlO1xuXG4vLyBcdTI1MDBcdTI1MDAgRmlsZSB0eXBlIGhlbHBlcnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIF9maWxlTGFiZWwoZmlsZW5hbWUpIHtcbiAgaWYgKCFmaWxlbmFtZSkgcmV0dXJuICcnO1xuICBjb25zdCBiYXNlID0gZmlsZW5hbWUuc3BsaXQoJy8nKS5wb3AoKTtcbiAgaWYgKGJhc2UuZW5kc1dpdGgoJy5wZGYnKSAmJiBiYXNlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2F0cycpKVxuICAgIHJldHVybiAnQVRTIFBERic7XG4gIGlmIChiYXNlLmVuZHNXaXRoKCcucGRmJykpXG4gICAgcmV0dXJuICdIdW1hbiBQREYnO1xuICBpZiAoYmFzZS5lbmRzV2l0aCgnLmRvY3gnKSAmJiBiYXNlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2F0cycpKVxuICAgIHJldHVybiAnQVRTIFdvcmQnO1xuICBpZiAoYmFzZS5lbmRzV2l0aCgnLmRvY3gnKSlcbiAgICByZXR1cm4gJ0h1bWFuIFdvcmQnO1xuICBpZiAoYmFzZS5lbmRzV2l0aCgnLmh0bWwnKSlcbiAgICByZXR1cm4gJ0hUTUwnO1xuICByZXR1cm4gYmFzZTtcbn1cblxuZnVuY3Rpb24gX2ZpbGVJY29uKGZpbGVuYW1lKSB7XG4gIGlmICghZmlsZW5hbWUpIHJldHVybiAnXHVEODNEXHVEQ0MxJztcbiAgY29uc3QgZiA9IGZpbGVuYW1lLnRvTG93ZXJDYXNlKCk7XG4gIGlmIChmLmVuZHNXaXRoKCcucGRmJykpICByZXR1cm4gZi5pbmNsdWRlcygnYXRzJykgPyAnXHVEODNFXHVERDE2JyA6ICdcdUQ4M0RcdURDQzQnO1xuICBpZiAoZi5lbmRzV2l0aCgnLmRvY3gnKSkgcmV0dXJuICdcdUQ4M0RcdURDREQnO1xuICBpZiAoZi5lbmRzV2l0aCgnLmh0bWwnKSkgcmV0dXJuICdcdUQ4M0NcdURGMTAnO1xuICByZXR1cm4gJ1x1RDgzRFx1RENDMSc7XG59XG5cbmZ1bmN0aW9uIF9maWxlRGVzY3JpcHRpb24oZmlsZW5hbWUpIHtcbiAgaWYgKCFmaWxlbmFtZSkgcmV0dXJuICcnO1xuICBjb25zdCBmID0gZmlsZW5hbWUudG9Mb3dlckNhc2UoKTtcbiAgaWYgKGYuZW5kc1dpdGgoJy5wZGYnKSAmJiBmLmluY2x1ZGVzKCdhdHMnKSlcbiAgICByZXR1cm4gJ0FUUy1vcHRpbWlzZWQgUERGIFx1MjAxNCBtYWNoaW5lLXJlYWRhYmxlIGZvciBhdXRvbWF0ZWQgc2NyZWVuaW5nJztcbiAgaWYgKGYuZW5kc1dpdGgoJy5wZGYnKSlcbiAgICByZXR1cm4gJ0h1bWFuLXJlYWRhYmxlIFBERiBcdTIwMTQgZm9yIGh1bWFuIHJldmlld2VycyBhbmQgcHJpbnRpbmcnO1xuICBpZiAoZi5lbmRzV2l0aCgnLmRvY3gnKSAmJiBmLmluY2x1ZGVzKCdhdHMnKSlcbiAgICByZXR1cm4gJ0FUUyBXb3JkIGRvY3VtZW50IFx1MjAxNCBrZXl3b3JkLW9wdGltaXNlZCBmb3Igam9iIGFwcGxpY2F0aW9ucyc7XG4gIGlmIChmLmVuZHNXaXRoKCcuZG9jeCcpKVxuICAgIHJldHVybiAnSHVtYW4tcmVhZGFibGUgV29yZCBkb2N1bWVudCBcdTIwMTQgZWRpdGFibGUgZm9ybWF0JztcbiAgaWYgKGYuZW5kc1dpdGgoJy5odG1sJykpXG4gICAgcmV0dXJuICdIVE1MIGZvcm1hdCB3aXRoIGVtYmVkZGVkIEpTT04tTEQgc3RydWN0dXJlZCBkYXRhJztcbiAgcmV0dXJuICdHZW5lcmF0ZWQgZmlsZSc7XG59XG5cbmZ1bmN0aW9uIF9odG1sUHJldmlld0ZpbGUoZmlsZXMpIHtcbiAgLy8gUHJlZmVyIGh1bWFuLXJlYWRhYmxlIEhUTUwgKENWXyouaHRtbCwgbm90IEFUUylcbiAgY29uc3QgaHVtYW4gPSBmaWxlcy5maW5kKGYgPT4gZi5lbmRzV2l0aCgnLmh0bWwnKSAmJiAhZi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdhdHMnKSk7XG4gIHJldHVybiBodW1hbiB8fCBmaWxlcy5maW5kKGYgPT4gZi5lbmRzV2l0aCgnLmh0bWwnKSkgfHwgbnVsbDtcbn1cblxuZnVuY3Rpb24gX3JlbmRlclByZXZpZXdQYW5lKGh0bWxGaWxlKSB7XG4gIGlmICghaHRtbEZpbGUpIHJldHVybiAnJztcbiAgY29uc3QgYmFzZSA9IGh0bWxGaWxlLnNwbGl0KCcvJykucG9wKCk7XG4gIGNvbnN0IHNyYyA9IGAvYXBpL2Rvd25sb2FkLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGJhc2UpfWA7XG4gIHJldHVybiBgXG4gICAgPGRpdiBpZD1cImZpbmFsLXByZXZpZXctcGFuZVwiIHN0eWxlPVwibWFyZ2luLWJvdHRvbToyNHB4O2JvcmRlcjoxcHggc29saWQgI2UyZThmMDtib3JkZXItcmFkaXVzOjEwcHg7b3ZlcmZsb3c6aGlkZGVuOyR7X3ByZXZpZXdPcGVuID8gJycgOiAnZGlzcGxheTpub25lOyd9XCI+XG4gICAgICA8ZGl2IHN0eWxlPVwicGFkZGluZzoxMHB4IDE2cHg7YmFja2dyb3VuZDojZjFmNWY5O2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjEwcHg7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2UyZThmMDtcIj5cbiAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC45ZW07Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOiMxZTI5M2I7XCI+XHVEODNDXHVERjEwIEhUTUwgUHJldmlldzwvc3Bhbj5cbiAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC44ZW07Y29sb3I6IzY0NzQ4YjtmbGV4OjE7XCI+JHtlc2NhcGVIdG1sKGJhc2UpfTwvc3Bhbj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWQ9XCJmaW5hbC1wcmV2aWV3LWNsb3NlLWJ0blwiXG4gICAgICAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6MC44ZW07cGFkZGluZzozcHggMTBweDtib3JkZXI6MXB4IHNvbGlkICNjYmQ1ZTE7Ym9yZGVyLXJhZGl1czo1cHg7YmFja2dyb3VuZDojZmZmO2N1cnNvcjpwb2ludGVyO2NvbG9yOiM0NzU1Njk7XCJcbiAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiSGlkZSBwcmV2aWV3XCI+SGlkZTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IHN0eWxlPVwicG9zaXRpb246cmVsYXRpdmU7d2lkdGg6MTAwJTtwYWRkaW5nLXRvcDo1Ni4yNSU7YmFja2dyb3VuZDojZjhmYWZjO1wiPlxuICAgICAgICA8aWZyYW1lIGlkPVwiZmluYWwtY3YtcHJldmlld1wiXG4gICAgICAgICAgICAgICAgc3JjPVwiJHtzcmN9XCJcbiAgICAgICAgICAgICAgICB0aXRsZT1cIkZpbmFsIENWIEhUTUwgUHJldmlld1wiXG4gICAgICAgICAgICAgICAgc2FuZGJveD1cImFsbG93LXNhbWUtb3JpZ2luXCJcbiAgICAgICAgICAgICAgICByZWZlcnJlcnBvbGljeT1cIm5vLXJlZmVycmVyXCJcbiAgICAgICAgICAgICAgICBzdHlsZT1cInBvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JvcmRlcjpub25lO1wiXG4gICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkZpbmFsIGdlbmVyYXRlZCBDViBwcmV2aWV3XCI+PC9pZnJhbWU+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgVGFiIHJlbmRlcmVyIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4vKipcbiAqIFBvcHVsYXRlIHRoZSBcIkdlbmVyYXRlXCIgKGZpbmFsX2dlbmVyYXRlKSB0YWIgY29udGVudC5cbiAqIFNob3dzIGRvd25sb2FkIGxpbmtzIGZvciBhbGwgZmluYWwtZ2VuZXJhdGVkIGZpbGVzIGFuZCBhIFwiUHJvY2VlZCB0byBGaW5hbGlzZVwiIGJ1dHRvbi5cbiAqIEBwYXJhbSB7T2JqZWN0fSBjdkRhdGEgLSBDViBkYXRhIG9iamVjdCBmcm9tIHN0YXRlTWFuYWdlci5nZXRUYWJEYXRhKCdjdicpXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBvcHVsYXRlRmluYWxHZW5lcmF0ZVRhYihjdkRhdGEgPSB7fSkge1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgaWYgKCFjb250ZW50KSByZXR1cm47XG5cbiAgLy8gQ29sbGVjdCBjYW5kaWRhdGUgZmlsZXMsIGRlZHVwbGljYXRlXG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0KCk7XG4gIGNvbnN0IGNhbmRpZGF0ZXMgPSBbXG4gICAgY3ZEYXRhLmZpbmFsX2h0bWwsXG4gICAgY3ZEYXRhLmZpbmFsX3BkZixcbiAgICBjdkRhdGEuaHRtbCxcbiAgICBjdkRhdGEucGRmLFxuICAgIGN2RGF0YS5kb2N4LFxuICAgIGN2RGF0YS5hdHNfZG9jeCxcbiAgICBjdkRhdGEuaHVtYW5fZG9jeCxcbiAgICAuLi4oQXJyYXkuaXNBcnJheShjdkRhdGEuZmlsZXMpID8gY3ZEYXRhLmZpbGVzIDogW10pLFxuICBdLmZpbHRlcihCb29sZWFuKTtcblxuICBjb25zdCBmaWxlcyA9IFtdO1xuICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICBpZiAoc2Vlbi5oYXMoZmlsZW5hbWUpKSBjb250aW51ZTtcbiAgICBzZWVuLmFkZChmaWxlbmFtZSk7XG4gICAgaWYgKGZpbGVuYW1lLmVuZHNXaXRoKCcudHh0JykgfHwgZmlsZW5hbWUgPT09ICdqb2JfZGVzY3JpcHRpb24udHh0JykgY29udGludWU7XG4gICAgZmlsZXMucHVzaChmaWxlbmFtZSk7XG4gIH1cblxuICBjb25zdCBodG1sUHJldmlld0ZpbGUgPSBfaHRtbFByZXZpZXdGaWxlKGZpbGVzKTtcblxuICBsZXQgaHRtbCA9ICc8aDE+XHVEODNEXHVEQ0M0IEdlbmVyYXRlZCBGaWxlczwvaDE+JztcbiAgaHRtbCArPSAnPHAgc3R5bGU9XCJjb2xvcjojNDc1NTY5O21hcmdpbi1ib3R0b206OHB4O1wiPllvdXIgQ1YgZmlsZXMgYXJlIHJlYWR5IHRvIGRvd25sb2FkLiBQcmV2aWV3IHRoZSBIVE1MIHZlcnNpb24gYmVsb3csIHRoZW4gY2xpY2sgPHN0cm9uZz5Qcm9jZWVkIHRvIERvd25sb2FkIFJldmlldzwvc3Ryb25nPiB0byBydW4gQVRTIHZhbGlkYXRpb24gYW5kIGFyY2hpdmUgeW91ciBhcHBsaWNhdGlvbi48L3A+JztcbiAgaHRtbCArPSAnPHAgc3R5bGU9XCJmb250LXNpemU6MC44M2VtO2NvbG9yOiM5NGEzYjg7bWFyZ2luLWJvdHRvbToyMHB4O3BhZGRpbmc6OHB4IDEycHg7YmFja2dyb3VuZDojZjhmYWZjO2JvcmRlci1yYWRpdXM6NnB4O2JvcmRlci1sZWZ0OjNweCBzb2xpZCAjZTJlOGYwO1wiPlx1RDgzRFx1RENBMSA8ZW0+VGhpcyB0YWIgbGV0cyB5b3UgZG93bmxvYWQgZmlsZXMgaW1tZWRpYXRlbHkuIFRoZSA8c3Ryb25nPkZpbGUgUmV2aWV3PC9zdHJvbmc+IHN1Yi10YWIgaW4gRmluYWxpc2UgcnVucyBBVFMgY2hlY2tzLCBjb25maXJtcyB0aGUgcGFja2FnZSBpcyBjb21wbGV0ZSwgYW5kIGxldHMgeW91IGFyY2hpdmUgdGhlIGFwcGxpY2F0aW9uLjwvZW0+PC9wPic7XG5cbiAgaWYgKGh0bWxQcmV2aWV3RmlsZSkge1xuICAgIGNvbnN0IHNob3dIaWRlID0gX3ByZXZpZXdPcGVuID8gJ0hpZGUgcHJldmlldycgOiAnU2hvdyBwcmV2aWV3JztcbiAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxMnB4O2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDtcIj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlkPVwiZmluYWwtcHJldmlldy10b2dnbGUtYnRuXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO3BhZGRpbmc6NXB4IDE0cHg7Ym9yZGVyOjFweCBzb2xpZCAjM2I4MmY2O2JvcmRlci1yYWRpdXM6NnB4O2JhY2tncm91bmQ6JHtfcHJldmlld09wZW4gPyAnI2VmZjZmZicgOiAnI2ZmZid9O2NvbG9yOiMzYjgyZjY7Y3Vyc29yOnBvaW50ZXI7Zm9udC13ZWlnaHQ6NjAwO1wiXG4gICAgICAgICAgICAgIGFyaWEtZXhwYW5kZWQ9XCIke19wcmV2aWV3T3Blbn1cIlxuICAgICAgICAgICAgICBhcmlhLWNvbnRyb2xzPVwiZmluYWwtcHJldmlldy1wYW5lXCI+XG4gICAgICAgIFx1RDgzQ1x1REYxMCAke3Nob3dIaWRlfVxuICAgICAgPC9idXR0b24+XG4gICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjhlbTtjb2xvcjojOTRhM2I4O1wiPkluLWJyb3dzZXIgSFRNTCBwcmV2aWV3PC9zcGFuPlxuICAgIDwvZGl2PmA7XG4gICAgaHRtbCArPSBfcmVuZGVyUHJldmlld1BhbmUoaHRtbFByZXZpZXdGaWxlKTtcbiAgfVxuXG4gIGlmIChmaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICBodG1sICs9ICc8cCBzdHlsZT1cImNvbG9yOiM5Y2EzYWY7cGFkZGluZzoxNnB4O1wiPk5vIGZpbGVzIGdlbmVyYXRlZCB5ZXQuPC9wPic7XG4gIH0gZWxzZSB7XG4gICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cImRpc3BsYXk6Z3JpZDtnYXA6MTJweDttYXJnaW4tYm90dG9tOjI4cHg7XCI+JztcbiAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIGZpbGVzKSB7XG4gICAgICBjb25zdCBiYXNlICAgPSBmaWxlbmFtZS5zcGxpdCgnLycpLnBvcCgpO1xuICAgICAgY29uc3QgaWNvbiAgID0gX2ZpbGVJY29uKGZpbGVuYW1lKTtcbiAgICAgIGNvbnN0IGxhYmVsICA9IF9maWxlTGFiZWwoZmlsZW5hbWUpO1xuICAgICAgY29uc3QgZGVzYyAgID0gX2ZpbGVEZXNjcmlwdGlvbihmaWxlbmFtZSk7XG4gICAgICBodG1sICs9IGBcbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjE0cHg7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6I2Y4ZmFmYztib3JkZXI6MXB4IHNvbGlkICNlMmU4ZjA7XG4gICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MTRweCAxOHB4O1wiPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjEuOGVtO1wiPiR7aWNvbn08L3NwYW4+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImZsZXg6MTttaW4td2lkdGg6MDtcIj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjAuOTVlbTtjb2xvcjojMWUyOTNiO1wiPiR7ZXNjYXBlSHRtbChsYWJlbCl9PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuODNlbTtjb2xvcjojNjQ3NDhiO21hcmdpbi10b3A6MnB4O1wiPiR7ZXNjYXBlSHRtbChkZXNjKX08L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8YSBocmVmPVwiL2FwaS9kb3dubG9hZC8ke2VuY29kZVVSSUNvbXBvbmVudChiYXNlKX1cIlxuICAgICAgICAgICAgIGRvd25sb2FkPVwiJHtlc2NhcGVIdG1sKGJhc2UpfVwiXG4gICAgICAgICAgICAgc3R5bGU9XCJkaXNwbGF5OmlubGluZS1mbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6NnB4O1xuICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiMzYjgyZjY7Y29sb3I6I2ZmZjtcbiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzo3cHggMTZweDtib3JkZXItcmFkaXVzOjZweDtcbiAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOjAuODhlbTtmb250LXdlaWdodDo2MDA7dGV4dC1kZWNvcmF0aW9uOm5vbmU7XG4gICAgICAgICAgICAgICAgICAgIHdoaXRlLXNwYWNlOm5vd3JhcDtcIj5cbiAgICAgICAgICAgIFx1MkIwN1x1RkUwRiBEb3dubG9hZFxuICAgICAgICAgIDwvYT5cbiAgICAgICAgPC9kaXY+YDtcbiAgICB9XG4gICAgaHRtbCArPSAnPC9kaXY+JztcbiAgfVxuXG4gIGlmIChjdkRhdGEub3V0cHV0X2Rpcikge1xuICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjI0cHg7cGFkZGluZzoxMHB4IDE0cHg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6I2YxZjVmOTtib3JkZXItcmFkaXVzOjZweDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOjEzcHg7Y29sb3I6IzY0NzQ4YjtcIj5cbiAgICAgIDxzdHJvbmc+T3V0cHV0IGRpcmVjdG9yeTo8L3N0cm9uZz4gJHtlc2NhcGVIdG1sKGN2RGF0YS5vdXRwdXRfZGlyKX1cbiAgICA8L2Rpdj5gO1xuICB9XG5cbiAgaHRtbCArPSBgXG4gICAgPGRpdiBjbGFzcz1cIm5hdi1idXR0b25zIG5hdi1lbmRcIiBzdHlsZT1cIm1hcmdpbi10b3A6MjRweDtcIj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJjb250aW51ZS1idG5cIiBpZD1cImZpbmFsLWdlbmVyYXRlLWNvbnRpbnVlLWJ0blwiXG4gICAgICAgICAgICAgIG9uY2xpY2s9XCJmaW5hbEdlbmVyYXRpb25Db21wbGV0ZSgpXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6MWVtO3BhZGRpbmc6MTBweCAyNHB4O1wiPlxuICAgICAgICBcdTI3MDUgUHJvY2VlZCB0byBEb3dubG9hZCBSZXZpZXcgXHUyMTkyXG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5gO1xuXG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gaHRtbDtcblxuICAvLyBXaXJlIHVwIHByZXZpZXcgdG9nZ2xlXG4gIGlmIChodG1sUHJldmlld0ZpbGUpIHtcbiAgICBjb25zdCB0b2dnbGVCdG4gID0gY29udGVudC5xdWVyeVNlbGVjdG9yKCcjZmluYWwtcHJldmlldy10b2dnbGUtYnRuJyk7XG4gICAgY29uc3QgY2xvc2VCdG4gICA9IGNvbnRlbnQucXVlcnlTZWxlY3RvcignI2ZpbmFsLXByZXZpZXctY2xvc2UtYnRuJyk7XG4gICAgY29uc3QgcHJldmlld1BhbmUgPSBjb250ZW50LnF1ZXJ5U2VsZWN0b3IoJyNmaW5hbC1wcmV2aWV3LXBhbmUnKTtcblxuICAgIGNvbnN0IHNldFByZXZpZXdPcGVuID0gKG9wZW4pID0+IHtcbiAgICAgIF9wcmV2aWV3T3BlbiA9IG9wZW47XG4gICAgICBpZiAocHJldmlld1BhbmUpIHByZXZpZXdQYW5lLnN0eWxlLmRpc3BsYXkgPSBvcGVuID8gJycgOiAnbm9uZSc7XG4gICAgICBpZiAodG9nZ2xlQnRuKSB7XG4gICAgICAgIHRvZ2dsZUJ0bi50ZXh0Q29udGVudCA9IG9wZW4gPyAnXHVEODNDXHVERjEwIEhpZGUgcHJldmlldycgOiAnXHVEODNDXHVERjEwIFNob3cgcHJldmlldyc7XG4gICAgICAgIHRvZ2dsZUJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCBTdHJpbmcob3BlbikpO1xuICAgICAgICB0b2dnbGVCdG4uc3R5bGUuYmFja2dyb3VuZCA9IG9wZW4gPyAnI2VmZjZmZicgOiAnI2ZmZic7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRvZ2dsZUJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBzZXRQcmV2aWV3T3BlbighX3ByZXZpZXdPcGVuKSk7XG4gICAgY2xvc2VCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgICgpID0+IHNldFByZXZpZXdPcGVuKGZhbHNlKSk7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIFBoYXNlIHRyYW5zaXRpb24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8qKlxuICogQWR2YW5jZSB3b3JrZmxvdyBmcm9tIGZpbmFsX2dlbmVyYXRpb24gXHUyMTkyIHJlZmluZW1lbnQuXG4gKiBDYWxscyBQT1NUIC9hcGkvZmluYWwtZ2VuZXJhdGlvbi1jb21wbGV0ZSwgdXBkYXRlcyBmcm9udGVuZCBwaGFzZSwgYW5kXG4gKiBzd2l0Y2hlcyB0byB0aGUgZG93bmxvYWQgdGFiLlxuICovXG5hc3luYyBmdW5jdGlvbiBmaW5hbEdlbmVyYXRpb25Db21wbGV0ZSgpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGlDYWxsKCdQT1NUJywgJy9hcGkvZmluYWwtZ2VuZXJhdGlvbi1jb21wbGV0ZScsIHt9KTtcbiAgICBpZiAoIXJlcz8ub2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihyZXM/LmVycm9yIHx8ICdGYWlsZWQgdG8gYWR2YW5jZSB0byBGaWxlIFJldmlldyBzdGVwLicpO1xuICAgIH1cbiAgICBzdGF0ZU1hbmFnZXIuc2V0UGhhc2UoJ3JlZmluZW1lbnQnKTtcbiAgICBzd2l0Y2hUYWIoJ2Rvd25sb2FkJyk7XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ1x1MjcwNSBGaWxlcyBnZW5lcmF0ZWQuIFlvdSBjYW4gbm93IGZpbmFsaXNlIHlvdXIgYXBwbGljYXRpb24uJyk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy5lcnJvcignZmluYWxHZW5lcmF0aW9uQ29tcGxldGUgZXJyb3I6JywgZXJyKTtcbiAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCBgXHUyNzRDICR7ZXJyLm1lc3NhZ2V9YCk7XG4gIH1cbn1cblxuZXhwb3J0IHsgcG9wdWxhdGVGaW5hbEdlbmVyYXRlVGFiLCBmaW5hbEdlbmVyYXRpb25Db21wbGV0ZSB9O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiBcIlVwZGF0ZSB2aWEgQUlcIiBwYW5lbCAoR0FQLTAxKTogbmF0dXJhbC1sYW5ndWFnZSBpbnN0cnVjdGlvbiBvclxuICogZG9jdW1lbnQtaW5nZXN0aW9uIHVwZGF0ZXMgdG8gTWFzdGVyX0NWX0RhdGEuanNvbiwgcHJvcG9zZWQgYnkgYW4gTExNLFxuICogcmV2aWV3ZWQgYXMgYSBkaWZmLCBhbmQgd3JpdHRlbiBvbmx5IG9uIGV4cGxpY2l0IGNvbmZpcm1hdGlvbi5cbiAqXG4gKiBSZW5kZXJlZCBpbnNpZGUgdGhlIE1hc3RlciBDViB0YWIgKHNlZSB3ZWIvbWFzdGVyLWN2LmpzKSwgY29sbGFwc2VkIGJ5XG4gKiBkZWZhdWx0LiBSZXVzZXMgd2ViL3Byb3Bvc2FsLXJldmlldy5qcydzIHJvdyByZW5kZXJlciBmb3IgdGhlIGRpZmYgcmV2aWV3XG4gKiBsaXN0IHJhdGhlciB0aGFuIGZvcmtpbmcgYSB0aGlyZCBjb3B5IG9mIHRoYXQgVUkgKGhhcnZlc3QuanMgYW5kXG4gKiBsYXlvdXQtaW5zdHJ1Y3Rpb24uanMncyByZW5kZXJDb250ZW50UHJvcG9zYWxzIGFscmVhZHkgZXhpc3QpLlxuICpcbiAqIFB1YmxpYyBleHBvcnRzIChhc3NpZ25lZCB0byB3aW5kb3cgYnkgd2ViL3NyYy9tYWluLmpzJ3MgYnVuZGxlKTpcbiAqICAgcmVuZGVyTWFzdGVyRGF0YUFpVXBkYXRlUGFuZWwoKVxuICogICB0b2dnbGVNYXN0ZXJEYXRhQWlQYW5lbCgpXG4gKiAgIHNldE1hc3RlckRhdGFBaU1vZGUobW9kZSlcbiAqICAgaGFuZGxlTWFzdGVyRGF0YUFpRmlsZVVwbG9hZChldmVudClcbiAqICAgc3VibWl0TWFzdGVyRGF0YUFpUHJvcG9zZSgpXG4gKiAgIGRpc2NhcmRNYXN0ZXJEYXRhQWlQcm9wb3NhbCgpXG4gKiAgIGNvbmZpcm1NYXN0ZXJEYXRhQWlVcGRhdGUoKVxuICpcbiAqIEtleWJvYXJkOiBDdHJsL0NtZCtFbnRlciBvbiBlaXRoZXIgaW5wdXQgdGV4dGFyZWEgc3VibWl0cyBcIlByb3Bvc2UgVXBkYXRlXCJcbiAqICh3aXJlZCBsb2NhbGx5IHZpYSBvbmtleWRvd24sIG5vdCBrZXlib2FyZC1zaG9ydGN1dHMuanMncyBnbG9iYWxcbiAqIF9UQUJfQUNUSU9OX0JUTiBtYXAgXHUyMDE0IHRoZSBNYXN0ZXIgQ1YgdGFiIGhhcyBzZXZlcmFsIGluZGVwZW5kZW50IGZvcm1zIHdpdGhcbiAqIG5vIHNpbmdsZSBwcmltYXJ5IGFjdGlvbiwgc28gY2xhaW1pbmcgdGhpcyBwYW5lbCBhcyAqdGhlKiB0YWItd2lkZVxuICogQ3RybCtFbnRlciB0YXJnZXQgd291bGQgYmUgbWlzbGVhZGluZy9yZWdyZXNzIHRoZSB0YWIncyBvdGhlciBzYXZlXG4gKiBhY3Rpb25zOyBhIGxvY2FsLCBzY29wZWQgc2hvcnRjdXQgaXMgdGhlIGNvcnJlY3QgZml0IGhlcmUgaW5zdGVhZCkuXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZXNjLCByZW5kZXJQcm9wb3NhbFJvdywgYXR0YWNoUHJvcG9zYWxSb3dMaXN0ZW5lcnMgfSBmcm9tICcuL3Byb3Bvc2FsLXJldmlldy5qcyc7XG5cbmNvbnN0IGxvZyA9IGdldExvZ2dlcignbWFzdGVyLWRhdGEtYWktdXBkYXRlJyk7XG5cbi8vIFx1MjUwMFx1MjUwMCBTdGF0ZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbi8vIENsb3N1cmUtc2NvcGVkLCBjb25zaXN0ZW50IHdpdGggaG93IGhhcnZlc3QuanMgbWFuYWdlcyBpdHMgb3duIGxvY2FsIHN0YXRlIFx1MjAxNFxuLy8gdGhpcyBwYW5lbCBkb2Vzbid0IG5lZWQgdG8gcGFydGljaXBhdGUgaW4gc3RhdGUtbWFuYWdlci5qcydzIGdsb2JhbHMuXG5cbmxldCBfbWR1TW9kZSA9ICdubF9pbnN0cnVjdGlvbic7ICAgICAgICAgICAvLyAnbmxfaW5zdHJ1Y3Rpb24nIHwgJ2RvY3VtZW50X2luZ2VzdGlvbidcbmxldCBfbWR1UGVuZGluZ1Byb3Bvc2FsID0gbnVsbDsgICAgICAgICAgICAvLyB7IHByb3Bvc2FsSWQsIHNvdXJjZSwgY2hhbmdlcyB9XG5sZXQgX21kdVByaW9yQ2xhcmlmaWNhdGlvbnMgPSBbXTsgICAgICAgICAgLy8gW3txdWVzdGlvbiwgYW5zd2VyfSwgLi4uXVxuXG5mdW5jdGlvbiBfbWR1UmVzZXRTdGF0ZSgpIHtcbiAgX21kdU1vZGUgPSAnbmxfaW5zdHJ1Y3Rpb24nO1xuICBfbWR1UGVuZGluZ1Byb3Bvc2FsID0gbnVsbDtcbiAgX21kdVByaW9yQ2xhcmlmaWNhdGlvbnMgPSBbXTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFBhbmVsIHNoZWxsIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiByZW5kZXJNYXN0ZXJEYXRhQWlVcGRhdGVQYW5lbCgpIHtcbiAgLy8gUmVzZXQgbW9kdWxlIHN0YXRlIG9uIGV2ZXJ5IGZyZXNoIHJlbmRlciAobm90IGp1c3QgcGFnZSBsb2FkKSBcdTIwMTQgdGhlIERPTVxuICAvLyB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYWx3YXlzIGRlcGljdHMgdGhlIG5sX2luc3RydWN0aW9uL25vLXByb3Bvc2FsXG4gIC8vIGRlZmF1bHQsIHNvIGFueSBjYXJyaWVkLW92ZXIgc3RhdGUgZnJvbSBhIHByaW9yIHJlbmRlciAoZS5nLiB0aGUgdXNlclxuICAvLyBzd2l0Y2hlZCB0YWJzIG1pZC1wcm9wb3NhbCBhbmQgcG9wdWxhdGVNYXN0ZXJUYWIoKSByZS1yZW5kZXJlZCB0aGlzXG4gIC8vIHBhbmVsKSBtdXN0IGJlIGRpc2NhcmRlZCB0byBhdm9pZCB0aGUgdHdvIGdvaW5nIG91dCBvZiBzeW5jLlxuICBfbWR1UmVzZXRTdGF0ZSgpO1xuICByZXR1cm4gYFxuICAgIDxkaXYgaWQ9XCJtZHUtcGFuZWxcIiBzdHlsZT1cIm1hcmdpbjoxNnB4IDA7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1jdi1ib3JkZXIpO2JvcmRlci1yYWRpdXM6OHB4O292ZXJmbG93OmhpZGRlbjtcIj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlkPVwibWR1LXRvZ2dsZS1idG5cIiBvbmNsaWNrPVwidG9nZ2xlTWFzdGVyRGF0YUFpUGFuZWwoKVwiXG4gICAgICAgIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiIGFyaWEtY29udHJvbHM9XCJtZHUtcGFuZWwtYm9keVwiXG4gICAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTt0ZXh0LWFsaWduOmxlZnQ7YmFja2dyb3VuZDp2YXIoLS1jdi1iZy1saWdodCk7Ym9yZGVyOm5vbmU7cGFkZGluZzoxMnB4IDE2cHg7Zm9udC1zaXplOjAuOTVlbTtmb250LXdlaWdodDo3MDA7Y29sb3I6dmFyKC0tY3YtdGV4dC1wcmltYXJ5KTtjdXJzb3I6cG9pbnRlcjtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDo4cHg7XCI+XG4gICAgICAgIDxzcGFuIGlkPVwibWR1LXRvZ2dsZS1pY29uXCI+XHUyNUI4PC9zcGFuPiBcdUQ4M0VcdUREMTYgVXBkYXRlIHZpYSBBSVxuICAgICAgPC9idXR0b24+XG4gICAgICA8ZGl2IGlkPVwibWR1LXBhbmVsLWJvZHlcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtwYWRkaW5nOjE2cHg7XCI+XG4gICAgICAgIDxwIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtjb2xvcjp2YXIoLS1jdi10ZXh0LXNlY29uZGFyeSk7bWFyZ2luOjAgMCAxNHB4O1wiPlxuICAgICAgICAgIFByZWZlciBwbGFpbiBFbmdsaXNoLCBvciBoYXZlIGFuIG9sZCBDViBvciBMaW5rZWRJbiBleHBvcnQ/IERlc2NyaWJlIGEgY2hhbmdlIG9yIHBhc3RlL3VwbG9hZCBhXG4gICAgICAgICAgZG9jdW1lbnQgYW5kIEFJIHdpbGwgZHJhZnQgaXQgZm9yIHlvdSB0byByZXZpZXcgXHUyMDE0IG5vdGhpbmcgaXMgc2F2ZWQgdW50aWwgeW91IGNvbmZpcm0uXG4gICAgICAgIDwvcD5cblxuICAgICAgICA8ZGl2IHJvbGU9XCJ0YWJsaXN0XCIgYXJpYS1sYWJlbD1cIlVwZGF0ZSBtZXRob2RcIiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6NnB4O21hcmdpbi1ib3R0b206MTJweDtcIj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBpZD1cIm1kdS1tb2RlLW5sX2luc3RydWN0aW9uLWJ0blwiIHJvbGU9XCJ0YWJcIiBhcmlhLXNlbGVjdGVkPVwidHJ1ZVwiXG4gICAgICAgICAgICBvbmNsaWNrPVwic2V0TWFzdGVyRGF0YUFpTW9kZSgnbmxfaW5zdHJ1Y3Rpb24nKVwiXG4gICAgICAgICAgICBzdHlsZT1cInBhZGRpbmc6NnB4IDE0cHg7Zm9udC1zaXplOjAuODVlbTtib3JkZXItcmFkaXVzOjZweCA2cHggMCAwO2JvcmRlcjoxcHggc29saWQgdmFyKC0tY3YtYm9yZGVyKTtib3JkZXItYm90dG9tOm5vbmU7YmFja2dyb3VuZDp2YXIoLS1jdi13aGl0ZSk7Y29sb3I6dmFyKC0tY3YtdGV4dC1wcmltYXJ5KTtmb250LXdlaWdodDo2MDA7Y3Vyc29yOnBvaW50ZXI7XCI+XG4gICAgICAgICAgICBEZXNjcmliZSBhIGNoYW5nZVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlkPVwibWR1LW1vZGUtZG9jdW1lbnRfaW5nZXN0aW9uLWJ0blwiIHJvbGU9XCJ0YWJcIiBhcmlhLXNlbGVjdGVkPVwiZmFsc2VcIlxuICAgICAgICAgICAgb25jbGljaz1cInNldE1hc3RlckRhdGFBaU1vZGUoJ2RvY3VtZW50X2luZ2VzdGlvbicpXCJcbiAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZzo2cHggMTRweDtmb250LXNpemU6MC44NWVtO2JvcmRlci1yYWRpdXM6NnB4IDZweCAwIDA7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1jdi1ib3JkZXIpO2JvcmRlci1ib3R0b206bm9uZTtiYWNrZ3JvdW5kOnZhcigtLWN2LWJnLXN1YnRsZSk7Y29sb3I6dmFyKC0tY3YtdGV4dC1zZWNvbmRhcnkpO2N1cnNvcjpwb2ludGVyO1wiPlxuICAgICAgICAgICAgUGFzdGUgb3IgdXBsb2FkIGEgZG9jdW1lbnRcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBpZD1cIm1kdS1ubF9pbnN0cnVjdGlvbi1pbnB1dC1hcmVhXCI+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cIm1kdS1ubC10ZXh0YXJlYVwiIHN0eWxlPVwiZm9udC1zaXplOjAuODJlbTtmb250LXdlaWdodDo2MDA7Y29sb3I6dmFyKC0tY3YtdGV4dC1tdXRlZCk7ZGlzcGxheTpibG9jazttYXJnaW4tYm90dG9tOjRweDtcIj5cbiAgICAgICAgICAgIERlc2NyaWJlIHRoZSBjaGFuZ2VcbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDx0ZXh0YXJlYSBpZD1cIm1kdS1ubC10ZXh0YXJlYVwiIHJvd3M9XCIzXCIgbWF4bGVuZ3RoPVwiNDAwMFwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gJnF1b3Q7SSBqdXN0IGZpbmlzaGVkIGEgcHJvamVjdCBhdCBBY21lIHVzaW5nIEt1YmVybmV0ZXMgXHUyMDE0IGFkZCBpdCB0byB0aGF0IHJvbGUncyBhY2hpZXZlbWVudHMuJnF1b3Q7XCJcbiAgICAgICAgICAgIG9ua2V5ZG93bj1cImlmKChldmVudC5jdHJsS2V5fHxldmVudC5tZXRhS2V5KSYmZXZlbnQua2V5PT09J0VudGVyJyl7ZXZlbnQucHJldmVudERlZmF1bHQoKTtzdWJtaXRNYXN0ZXJEYXRhQWlQcm9wb3NlKCk7fVwiXG4gICAgICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Ym94LXNpemluZzpib3JkZXItYm94O3BhZGRpbmc6OHB4O2JvcmRlcjoxcHggc29saWQgdmFyKC0tY3YtYm9yZGVyKTtib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6MC44OGVtO3Jlc2l6ZTp2ZXJ0aWNhbDtcIj48L3RleHRhcmVhPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGlkPVwibWR1LWRvY3VtZW50X2luZ2VzdGlvbi1pbnB1dC1hcmVhXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cIm1kdS1kb2MtdGV4dGFyZWFcIiBzdHlsZT1cImZvbnQtc2l6ZTowLjgyZW07Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOnZhcigtLWN2LXRleHQtbXV0ZWQpO2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWJvdHRvbTo0cHg7XCI+XG4gICAgICAgICAgICBQYXN0ZSBkb2N1bWVudCB0ZXh0LCBvciB1cGxvYWQgYSBmaWxlXG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8dGV4dGFyZWEgaWQ9XCJtZHUtZG9jLXRleHRhcmVhXCIgcm93cz1cIjRcIiBtYXhsZW5ndGg9XCI2MDAwMFwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlBhc3RlIGFuIG9sZCBDViBvciBMaW5rZWRJbiBleHBvcnQuLi5cIlxuICAgICAgICAgICAgb25rZXlkb3duPVwiaWYoKGV2ZW50LmN0cmxLZXl8fGV2ZW50Lm1ldGFLZXkpJiZldmVudC5rZXk9PT0nRW50ZXInKXtldmVudC5wcmV2ZW50RGVmYXVsdCgpO3N1Ym1pdE1hc3RlckRhdGFBaVByb3Bvc2UoKTt9XCJcbiAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTtib3gtc2l6aW5nOmJvcmRlci1ib3g7cGFkZGluZzo4cHg7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1jdi1ib3JkZXIpO2JvcmRlci1yYWRpdXM6NHB4O2ZvbnQtc2l6ZTowLjg4ZW07cmVzaXplOnZlcnRpY2FsO21hcmdpbi1ib3R0b206OHB4O1wiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgaWQ9XCJtZHUtZG9jLWZpbGUtaW5wdXRcIiBhY2NlcHQ9XCIudHh0LC5tZCwucnN0LC5odG1sLC5odG0sLnBkZiwuZG9jeCwucnRmXCJcbiAgICAgICAgICAgIG9uY2hhbmdlPVwiaGFuZGxlTWFzdGVyRGF0YUFpRmlsZVVwbG9hZChldmVudClcIiBhcmlhLWRlc2NyaWJlZGJ5PVwibWR1LXVwbG9hZC1kaXNjbG9zdXJlXCJcbiAgICAgICAgICAgIHN0eWxlPVwiZm9udC1zaXplOjAuODJlbTtcIj5cbiAgICAgICAgICA8cCBpZD1cIm1kdS11cGxvYWQtZGlzY2xvc3VyZVwiIHN0eWxlPVwiZm9udC1zaXplOjAuNzhlbTtjb2xvcjp2YXIoLS1jdi10ZXh0LXNlY29uZGFyeSk7bWFyZ2luOjZweCAwIDA7XCI+XG4gICAgICAgICAgICBUaGlzIGRvY3VtZW50IHdpbGwgYmUgc2VudCB0byB5b3VyIGNvbmZpZ3VyZWQgQUkgcHJvdmlkZXIgXHUyMDE0IHNlZSB0aGUgZGF0YSBoYW5kbGluZyBiYWRnZSBhYm92ZS5cbiAgICAgICAgICAgIEFuIG9sZCBDViBvciBMaW5rZWRJbiBleHBvcnQgY2FuIGNhcnJ5IG1vcmUgcGVyc29uYWwgaW5mb3JtYXRpb24gdGhhbiBhIGpvYiBkZXNjcmlwdGlvbi5cbiAgICAgICAgICA8L3A+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjhweDthbGlnbi1pdGVtczpjZW50ZXI7bWFyZ2luLXRvcDoxMnB4O1wiPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlkPVwibWR1LXByb3Bvc2UtYnRuXCIgb25jbGljaz1cInN1Ym1pdE1hc3RlckRhdGFBaVByb3Bvc2UoKVwiXG4gICAgICAgICAgICBzdHlsZT1cInBhZGRpbmc6OHB4IDE4cHg7Zm9udC1zaXplOjAuODhlbTtmb250LXdlaWdodDo2MDA7Y3Vyc29yOnBvaW50ZXI7YmFja2dyb3VuZDp2YXIoLS1jdi1hY2NlbnQpO2NvbG9yOnZhcigtLWN2LXdoaXRlKTtib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjZweDtcIj5cbiAgICAgICAgICAgIFByb3Bvc2UgVXBkYXRlXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWQ9XCJtZHUtZGlzY2FyZC1idG5cIiBvbmNsaWNrPVwiZGlzY2FyZE1hc3RlckRhdGFBaVByb3Bvc2FsKClcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtwYWRkaW5nOjhweCAxNHB4O2ZvbnQtc2l6ZTowLjg1ZW07Y3Vyc29yOnBvaW50ZXI7YmFja2dyb3VuZDp2YXIoLS1jdi13aGl0ZSk7Y29sb3I6dmFyKC0tY3YtdGV4dC1zZWNvbmRhcnkpO2JvcmRlcjoxcHggc29saWQgdmFyKC0tY3YtYm9yZGVyKTtib3JkZXItcmFkaXVzOjZweDtcIj5cbiAgICAgICAgICAgIERpc2NhcmRcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBpZD1cIm1kdS1zdGF0dXNcIiByb2xlPVwic3RhdHVzXCIgYXJpYS1saXZlPVwicG9saXRlXCIgc3R5bGU9XCJtYXJnaW4tdG9wOjEwcHg7Zm9udC1zaXplOjAuODVlbTtjb2xvcjp2YXIoLS1jdi10ZXh0LXNlY29uZGFyeSk7XCI+PC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJtZHUtY2xhcmlmaWNhdGlvbi1jb250YWluZXJcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cIm1kdS1yZXZpZXctYXJlYVwiIHN0eWxlPVwibWFyZ2luLXRvcDoxMnB4O1wiPjwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwibWR1LXJlc3VsdFwiIHN0eWxlPVwibWFyZ2luLXRvcDoxMnB4O1wiPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+YDtcbn1cblxuZnVuY3Rpb24gcmVuZGVyTWFzdGVyRGF0YUFpVXBkYXRlRGlzYWJsZWROb3RlKCkge1xuICByZXR1cm4gYFxuICAgIDxkaXYgc3R5bGU9XCJtYXJnaW46MTZweCAwO3BhZGRpbmc6MTBweCAxNHB4O2JhY2tncm91bmQ6dmFyKC0tY3YtYmctc3VidGxlKTtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWN2LWJvcmRlcik7Ym9yZGVyLXJhZGl1czo2cHg7Zm9udC1zaXplOjAuODVlbTtjb2xvcjp2YXIoLS1jdi10ZXh0LXNlY29uZGFyeSk7XCI+XG4gICAgICBcdUQ4M0VcdUREMTYgVXBkYXRlIHZpYSBBSSBpcyBhdmFpbGFibGUgYmVmb3JlIGFuYWx5c2lzIHN0YXJ0cyBvciBkdXJpbmcgcmVmaW5lbWVudC5cbiAgICA8L2Rpdj5gO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgUGFuZWwgZXhwYW5kL2NvbGxhcHNlICsgbW9kZSB0b2dnbGUgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIHRvZ2dsZU1hc3RlckRhdGFBaVBhbmVsKCkge1xuICBjb25zdCBib2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1wYW5lbC1ib2R5Jyk7XG4gIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtdG9nZ2xlLWJ0bicpO1xuICBjb25zdCBpY29uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS10b2dnbGUtaWNvbicpO1xuICBpZiAoIWJvZHkgfHwgIWJ0bikgcmV0dXJuO1xuICBjb25zdCBleHBhbmRlZCA9IGJvZHkuc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnO1xuICBib2R5LnN0eWxlLmRpc3BsYXkgPSBleHBhbmRlZCA/ICdub25lJyA6ICdibG9jayc7XG4gIGJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCBTdHJpbmcoIWV4cGFuZGVkKSk7XG4gIGlmIChpY29uKSBpY29uLnRleHRDb250ZW50ID0gZXhwYW5kZWQgPyAnXHUyNUI4JyA6ICdcdTI1QkUnO1xufVxuXG5mdW5jdGlvbiBzZXRNYXN0ZXJEYXRhQWlNb2RlKG1vZGUpIHtcbiAgX21kdU1vZGUgPSBtb2RlO1xuICBmb3IgKGNvbnN0IG0gb2YgWydubF9pbnN0cnVjdGlvbicsICdkb2N1bWVudF9pbmdlc3Rpb24nXSkge1xuICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBtZHUtbW9kZS0ke219LWJ0bmApO1xuICAgIGNvbnN0IGFyZWEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgbWR1LSR7bX0taW5wdXQtYXJlYWApO1xuICAgIGNvbnN0IGFjdGl2ZSA9IG0gPT09IG1vZGU7XG4gICAgaWYgKGJ0bikge1xuICAgICAgYnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1zZWxlY3RlZCcsIFN0cmluZyhhY3RpdmUpKTtcbiAgICAgIGJ0bi5zdHlsZS5iYWNrZ3JvdW5kID0gYWN0aXZlID8gJ3ZhcigtLWN2LXdoaXRlKScgOiAndmFyKC0tY3YtYmctc3VidGxlKSc7XG4gICAgICBidG4uc3R5bGUuY29sb3IgPSBhY3RpdmUgPyAndmFyKC0tY3YtdGV4dC1wcmltYXJ5KScgOiAndmFyKC0tY3YtdGV4dC1zZWNvbmRhcnkpJztcbiAgICAgIGJ0bi5zdHlsZS5mb250V2VpZ2h0ID0gYWN0aXZlID8gJzYwMCcgOiAnNDAwJztcbiAgICB9XG4gICAgaWYgKGFyZWEpIGFyZWEuc3R5bGUuZGlzcGxheSA9IGFjdGl2ZSA/ICdibG9jaycgOiAnbm9uZSc7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIERvY3VtZW50IHVwbG9hZCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gaGFuZGxlTWFzdGVyRGF0YUFpRmlsZVVwbG9hZChldmVudCkge1xuICBjb25zdCBmaWxlID0gZXZlbnQudGFyZ2V0LmZpbGVzICYmIGV2ZW50LnRhcmdldC5maWxlc1swXTtcbiAgaWYgKCFmaWxlKSByZXR1cm47XG4gIGNvbnN0IHN0YXR1c0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1zdGF0dXMnKTtcbiAgaWYgKHN0YXR1c0VsKSBzdGF0dXNFbC50ZXh0Q29udGVudCA9IGBSZWFkaW5nICR7ZmlsZS5uYW1lfVx1MjAyNmA7XG4gIHRyeSB7XG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ2ZpbGUnLCBmaWxlKTtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2goJy9hcGkvdXBsb2FkLWZpbGUnLCB7IG1ldGhvZDogJ1BPU1QnLCBib2R5OiBmb3JtRGF0YSB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcC5qc29uKCk7XG4gICAgaWYgKCFyZXNwLm9rIHx8IGRhdGEuZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihkYXRhLm1lc3NhZ2UgfHwgZGF0YS5lcnJvciB8fCBgU2VydmVyIGVycm9yICR7cmVzcC5zdGF0dXN9YCk7XG4gICAgfVxuICAgIGNvbnN0IHRleHRhcmVhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1kb2MtdGV4dGFyZWEnKTtcbiAgICBpZiAodGV4dGFyZWEpIHRleHRhcmVhLnZhbHVlID0gZGF0YS50ZXh0O1xuICAgIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSBgTG9hZGVkICR7ZGF0YS5jb250ZW50X2xlbmd0aC50b0xvY2FsZVN0cmluZygpfSBjaGFyYWN0ZXJzIGZyb20gXCIke2RhdGEuZmlsZW5hbWV9XCIuYDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLmVycm9yKCdoYW5kbGVNYXN0ZXJEYXRhQWlGaWxlVXBsb2FkOiBmYWlsZWQnLCBlcnIpO1xuICAgIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSBgRXJyb3IgcmVhZGluZyBmaWxlOiAke2Vyci5tZXNzYWdlfWA7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIFByb3Bvc2UgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIF9tZHVFbmRwb2ludEZvck1vZGUobW9kZSkge1xuICByZXR1cm4gbW9kZSA9PT0gJ25sX2luc3RydWN0aW9uJyA/ICcvYXBpL21hc3Rlci1kYXRhL25sLXVwZGF0ZS9wcm9wb3NlJyA6ICcvYXBpL21hc3Rlci1kYXRhL2luZ2VzdC1kb2N1bWVudC9wcm9wb3NlJztcbn1cblxuZnVuY3Rpb24gX21kdUlucHV0Rm9yTW9kZShtb2RlKSB7XG4gIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobW9kZSA9PT0gJ25sX2luc3RydWN0aW9uJyA/ICdtZHUtbmwtdGV4dGFyZWEnIDogJ21kdS1kb2MtdGV4dGFyZWEnKTtcbiAgcmV0dXJuIGVsID8gZWwudmFsdWUudHJpbSgpIDogJyc7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN1Ym1pdE1hc3RlckRhdGFBaVByb3Bvc2UoKSB7XG4gIGNvbnN0IGlucHV0ID0gX21kdUlucHV0Rm9yTW9kZShfbWR1TW9kZSk7XG4gIGNvbnN0IHN0YXR1c0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1zdGF0dXMnKTtcbiAgY29uc3QgcmV2aWV3QXJlYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtcmV2aWV3LWFyZWEnKTtcbiAgY29uc3QgcmVzdWx0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWR1LXJlc3VsdCcpO1xuICBjb25zdCBwcm9wb3NlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1wcm9wb3NlLWJ0bicpO1xuXG4gIGlmICghaW5wdXQpIHtcbiAgICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gX21kdU1vZGUgPT09ICdubF9pbnN0cnVjdGlvbidcbiAgICAgID8gJ1BsZWFzZSBkZXNjcmliZSB0aGUgY2hhbmdlIGZpcnN0LidcbiAgICAgIDogJ1BsZWFzZSBwYXN0ZSBvciB1cGxvYWQgZG9jdW1lbnQgdGV4dCBmaXJzdC4nO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChyZXZpZXdBcmVhKSByZXZpZXdBcmVhLmlubmVySFRNTCA9ICcnO1xuICBpZiAocmVzdWx0RWwpIHJlc3VsdEVsLmlubmVySFRNTCA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWR1LWNsYXJpZmljYXRpb24tY29udGFpbmVyJykuaW5uZXJIVE1MID0gJyc7XG4gIGlmIChwcm9wb3NlQnRuKSB7IHByb3Bvc2VCdG4uZGlzYWJsZWQgPSB0cnVlOyBwcm9wb3NlQnRuLnRleHRDb250ZW50ID0gJ0FuYWx5emluZ1x1MjAyNic7IH1cbiAgaWYgKHN0YXR1c0VsKSBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICdBbmFseXppbmdcdTIwMjYnO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgYm9keSA9IHsgcHJpb3JfY2xhcmlmaWNhdGlvbnM6IF9tZHVQcmlvckNsYXJpZmljYXRpb25zIH07XG4gICAgYm9keVtfbWR1TW9kZSA9PT0gJ25sX2luc3RydWN0aW9uJyA/ICdpbnN0cnVjdGlvbicgOiAndGV4dCddID0gaW5wdXQ7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKF9tZHVFbmRwb2ludEZvck1vZGUoX21kdU1vZGUpLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3AuanNvbigpO1xuXG4gICAgaWYgKCFyZXNwLm9rIHx8IGRhdGEub2sgPT09IGZhbHNlKSB7XG4gICAgICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gYEVycm9yOiAke2VzYyhkYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yJyl9YDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZGF0YS5yZXF1aXJlc19jbGFyaWZpY2F0aW9uKSB7XG4gICAgICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJyc7XG4gICAgICBfbWR1U2hvd0NsYXJpZmljYXRpb25EaWFsb2coZGF0YS5jbGFyaWZpY2F0aW9uX3F1ZXN0aW9uLCBpbnB1dCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgX21kdVByaW9yQ2xhcmlmaWNhdGlvbnMgPSBbXTtcbiAgICBjb25zdCBjaGFuZ2VzID0gZGF0YS5jaGFuZ2VzIHx8IFtdO1xuICAgIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnJztcblxuICAgIGlmIChjaGFuZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaWYgKHJldmlld0FyZWEpIHJldmlld0FyZWEuaW5uZXJIVE1MID0gYDxwIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtjb2xvcjp2YXIoLS1jdi10ZXh0LXNlY29uZGFyeSk7XCI+Tm8gY2hhbmdlcyBjb3VsZCBiZSBwcm9wb3NlZCBmcm9tIHRoYXQgXHUyMDE0IHRyeSBhZGRpbmcgbW9yZSBkZXRhaWwuPC9wPmA7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgX21kdVBlbmRpbmdQcm9wb3NhbCA9IHsgcHJvcG9zYWxJZDogZGF0YS5wcm9wb3NhbF9pZCwgc291cmNlOiBfbWR1TW9kZSwgY2hhbmdlcyB9O1xuICAgIF9tZHVSZW5kZXJSZXZpZXdBcmVhKCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy5lcnJvcignc3VibWl0TWFzdGVyRGF0YUFpUHJvcG9zZTogZmFpbGVkJywgZXJyKTtcbiAgICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gYE5ldHdvcmsgZXJyb3I6ICR7ZXNjKGVyci5tZXNzYWdlKX1gO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChwcm9wb3NlQnRuKSB7IHByb3Bvc2VCdG4uZGlzYWJsZWQgPSBmYWxzZTsgcHJvcG9zZUJ0bi50ZXh0Q29udGVudCA9ICdQcm9wb3NlIFVwZGF0ZSc7IH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkaXNjYXJkTWFzdGVyRGF0YUFpUHJvcG9zYWwoKSB7XG4gIF9tZHVQZW5kaW5nUHJvcG9zYWwgPSBudWxsO1xuICBfbWR1UHJpb3JDbGFyaWZpY2F0aW9ucyA9IFtdO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWR1LXJldmlldy1hcmVhJykuaW5uZXJIVE1MID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtcmVzdWx0JykuaW5uZXJIVE1MID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtZGlzY2FyZC1idG4nKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBjb25zdCBzdGF0dXNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtc3RhdHVzJyk7XG4gIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnRGlzY2FyZGVkLic7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBDbGFyaWZpY2F0aW9uIGRpYWxvZyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbi8vIE1vZGVsZWQgb24gc2hvd0NsYXJpZmljYXRpb25EaWFsb2coKSBpbiB3ZWIvbGF5b3V0LWluc3RydWN0aW9uLmpzLCBub3QgYVxuLy8gbGl0ZXJhbCBjb3B5LXBhc3RlIHBvcnQ6IHRoYXQgdmVyc2lvbiBoYXJkLWNvZGVzIGl0cyBtb3VudCBwb2ludCBhbmQgdXNlc1xuLy8gbm9uLW5hbWVzcGFjZWQgZWxlbWVudCBpZHMgKGxheW91dC1jbGFyaWZpY2F0aW9uLSopLCB3aGljaCB3b3VsZCBjb2xsaWRlXG4vLyB3aXRoIHRoaXMgcGFuZWwncyBvd24gaWRzIGlmIGJvdGggdGFicyBhcmUgcHJlc2VudCBpbiB0aGUgRE9NIGF0IG9uY2Vcbi8vIChDU1MtaGlkZGVuIHRhYnMgYXJlbid0IHVubW91bnRlZCkuIFRoaXMgdmVyc2lvbiBtb3VudHMgaW50byB0aGUgcGFuZWwnc1xuLy8gb3duICNtZHUtY2xhcmlmaWNhdGlvbi1jb250YWluZXIgYW5kIHVzZXMgYW4gbWR1LSogaWQgbmFtZXNwYWNlIHRocm91Z2hvdXQuXG5cbmZ1bmN0aW9uIF9tZHVTaG93Q2xhcmlmaWNhdGlvbkRpYWxvZyhxdWVzdGlvbiwgb3JpZ2luYWxJbnN0cnVjdGlvbikge1xuICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWR1LWNsYXJpZmljYXRpb24tY29udGFpbmVyJyk7XG4gIGlmICghY29udGFpbmVyKSB7XG4gICAgbG9nLndhcm4oJ19tZHVTaG93Q2xhcmlmaWNhdGlvbkRpYWxvZzogI21kdS1jbGFyaWZpY2F0aW9uLWNvbnRhaW5lciBub3QgZm91bmQnKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBvcmlnaW5hdGluZ0J0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtcHJvcG9zZS1idG4nKTtcblxuICBjb25zdCBwYW5lbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBwYW5lbC5pZCA9ICdtZHUtY2xhcmlmaWNhdGlvbi1wYW5lbCc7XG4gIHBhbmVsLnNldEF0dHJpYnV0ZSgncm9sZScsICdhbGVydCcpO1xuICBwYW5lbC5zdHlsZS5jc3NUZXh0ID0gJ2JhY2tncm91bmQ6dmFyKC0tY3Ytd2Fybi1iZyk7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1jdi13YXJuLWxpZ2h0KTtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjE0cHg7bWFyZ2luLXRvcDoxMHB4Oyc7XG4gIHBhbmVsLmlubmVySFRNTCA9IGBcbiAgICA8cCBzdHlsZT1cIm1hcmdpbjowIDAgNnB4O2ZvbnQtc2l6ZTowLjg1ZW07Y29sb3I6dmFyKC0tY3Ytd2Fybi10ZXh0KTtmb250LXdlaWdodDo2MDA7XCI+XG4gICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj5cdTI3NTM8L3NwYW4+IEFsbW9zdCB0aGVyZSBcdTIwMTQgYSBiaXQgbW9yZSBkZXRhaWwgd291bGQgaGVscDpcbiAgICA8L3A+XG4gICAgPHAgc3R5bGU9XCJtYXJnaW46MCAwIDEwcHg7Zm9udC1zaXplOjAuODhlbTtjb2xvcjp2YXIoLS1jdi13YXJuLXRleHQpO1wiPiR7ZXNjKHF1ZXN0aW9uKX08L3A+XG4gICAgPGxhYmVsIGZvcj1cIm1kdS1jbGFyaWZpY2F0aW9uLWlucHV0XCIgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjp2YXIoLS1jdi10ZXh0LW11dGVkKTtkaXNwbGF5OmJsb2NrO21hcmdpbi1ib3R0b206NHB4O1wiPlxuICAgICAgWW91ciBjbGFyaWZpY2F0aW9uOlxuICAgIDwvbGFiZWw+XG4gICAgPHRleHRhcmVhIGlkPVwibWR1LWNsYXJpZmljYXRpb24taW5wdXRcIiByb3dzPVwiMlwiXG4gICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Ym94LXNpemluZzpib3JkZXItYm94O3BhZGRpbmc6OHB4O2JvcmRlcjoxcHggc29saWQgdmFyKC0tY3Ytd2Fybi1saWdodCk7Ym9yZGVyLXJhZGl1czo0cHg7Zm9udC1zaXplOjAuODhlbTtyZXNpemU6dmVydGljYWw7XCJcbiAgICAgIGFyaWEtbGFiZWw9XCJDbGFyaWZpY2F0aW9uIGZvciBtYXN0ZXIgZGF0YSB1cGRhdGVcIj4ke2VzYyhvcmlnaW5hbEluc3RydWN0aW9uKX08L3RleHRhcmVhPlxuICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjhweDttYXJnaW4tdG9wOjhweDtcIj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlkPVwibWR1LWNsYXJpZmljYXRpb24tc3VibWl0XCJcbiAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOnZhcigtLWN2LXdhcm4pO2NvbG9yOnZhcigtLWN2LXdoaXRlKTtib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjZweCAxNHB4O2ZvbnQtc2l6ZTowLjg1ZW07Y3Vyc29yOnBvaW50ZXI7Zm9udC13ZWlnaHQ6NjAwO1wiPlxuICAgICAgICBTdWJtaXQgY2xhcmlmaWNhdGlvblxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBpZD1cIm1kdS1jbGFyaWZpY2F0aW9uLWNhbmNlbFwiXG4gICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDpub25lO2JvcmRlcjoxcHggc29saWQgdmFyKC0tY3Ytd2Fybik7Y29sb3I6dmFyKC0tY3Ytd2Fybi10ZXh0KTtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjZweCAxNHB4O2ZvbnQtc2l6ZTowLjg1ZW07Y3Vyc29yOnBvaW50ZXI7XCI+XG4gICAgICAgIENhbmNlbFxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+YDtcblxuICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG4gIGNvbnRhaW5lci5hcHBlbmRDaGlsZChwYW5lbCk7XG5cbiAgY29uc3QgY2xhcklucHV0ID0gcGFuZWwucXVlcnlTZWxlY3RvcignI21kdS1jbGFyaWZpY2F0aW9uLWlucHV0Jyk7XG4gIGNvbnN0IHN1Ym1pdEJ0biA9IHBhbmVsLnF1ZXJ5U2VsZWN0b3IoJyNtZHUtY2xhcmlmaWNhdGlvbi1zdWJtaXQnKTtcbiAgY29uc3QgY2FuY2VsQnRuID0gcGFuZWwucXVlcnlTZWxlY3RvcignI21kdS1jbGFyaWZpY2F0aW9uLWNhbmNlbCcpO1xuXG4gIGNsYXJJbnB1dC5mb2N1cygpO1xuICBjbGFySW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2UoY2xhcklucHV0LnZhbHVlLmxlbmd0aCwgY2xhcklucHV0LnZhbHVlLmxlbmd0aCk7XG5cbiAgY29uc3QgY2xvc2VBbmRSZXN0b3JlRm9jdXMgPSAoKSA9PiB7XG4gICAgcGFuZWwucmVtb3ZlKCk7XG4gICAgaWYgKG9yaWdpbmF0aW5nQnRuKSBvcmlnaW5hdGluZ0J0bi5mb2N1cygpO1xuICB9O1xuXG4gIHN1Ym1pdEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBjb25zdCByZWZpbmVkID0gY2xhcklucHV0LnZhbHVlLnRyaW0oKTtcbiAgICBpZiAocmVmaW5lZCkge1xuICAgICAgX21kdVByaW9yQ2xhcmlmaWNhdGlvbnMgPSBbLi4uX21kdVByaW9yQ2xhcmlmaWNhdGlvbnMsIHsgcXVlc3Rpb24sIGFuc3dlcjogcmVmaW5lZCB9XTtcbiAgICAgIGNvbnN0IGlucHV0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChfbWR1TW9kZSA9PT0gJ25sX2luc3RydWN0aW9uJyA/ICdtZHUtbmwtdGV4dGFyZWEnIDogJ21kdS1kb2MtdGV4dGFyZWEnKTtcbiAgICAgIGlmIChpbnB1dEVsKSBpbnB1dEVsLnZhbHVlID0gcmVmaW5lZDtcbiAgICB9XG4gICAgY2xvc2VBbmRSZXN0b3JlRm9jdXMoKTtcbiAgICBpZiAocmVmaW5lZCkgc3VibWl0TWFzdGVyRGF0YUFpUHJvcG9zZSgpO1xuICB9KTtcbiAgY2FuY2VsQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xvc2VBbmRSZXN0b3JlRm9jdXMpO1xuICBjbGFySW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChlKSA9PiB7XG4gICAgaWYgKGUua2V5ID09PSAnRW50ZXInICYmICFlLnNoaWZ0S2V5KSB7IGUucHJldmVudERlZmF1bHQoKTsgc3VibWl0QnRuLmNsaWNrKCk7IH1cbiAgICBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSBjYW5jZWxCdG4uY2xpY2soKTtcbiAgfSk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBSZXZpZXcgYXJlYSAocHJvcG9zYWwgcm93cykgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIF9tZHVDaGFuZ2VEaXNwbGF5VGV4dChjaGFuZ2UpIHtcbiAgY29uc3QgcHJvcG9zZWQgPSBjaGFuZ2UucHJvcG9zZWQ7XG4gIGlmICh0eXBlb2YgcHJvcG9zZWQgPT09ICdzdHJpbmcnKSByZXR1cm4gcHJvcG9zZWQ7XG4gIGlmIChwcm9wb3NlZCAmJiB0eXBlb2YgcHJvcG9zZWQgPT09ICdvYmplY3QnKSB7XG4gICAgaWYgKCd0ZXh0JyBpbiBwcm9wb3NlZCkgcmV0dXJuIHByb3Bvc2VkLnRleHQ7XG4gICAgaWYgKCduYW1lJyBpbiBwcm9wb3NlZCkgcmV0dXJuIHByb3Bvc2VkLm5hbWU7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHByb3Bvc2VkKTtcbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIF9tZHVGbGFnSHRtbChjaGFuZ2UpIHtcbiAgaWYgKGNoYW5nZS5wb3NzaWJsZV9kdXBsaWNhdGVfb2YpIHtcbiAgICByZXR1cm4gYDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjZweDtwYWRkaW5nOjZweCA4cHg7YmFja2dyb3VuZDp2YXIoLS1jdi13YXJuLWJnKTtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWN2LXdhcm4tYm9yZGVyKTtib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6MC44ZW07Y29sb3I6dmFyKC0tY3Ytd2Fybi10ZXh0KTtcIj5cbiAgICAgIFx1MjZBMCBwb3NzaWJsZSBkdXBsaWNhdGUgb2YgJHtlc2MoY2hhbmdlLnBvc3NpYmxlX2R1cGxpY2F0ZV9vZil9XG4gICAgPC9kaXY+YDtcbiAgfVxuICBpZiAoY2hhbmdlLnBlcnN1YXNpb25fZmxhZ3MgJiYgY2hhbmdlLnBlcnN1YXNpb25fZmxhZ3MubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTo2cHg7cGFkZGluZzo2cHggOHB4O2JhY2tncm91bmQ6dmFyKC0tY3Ytd2Fybi1iZyk7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1jdi13YXJuLWJvcmRlcik7Ym9yZGVyLXJhZGl1czo0cHg7Zm9udC1zaXplOjAuOGVtO2NvbG9yOnZhcigtLWN2LXdhcm4tdGV4dCk7XCI+XG4gICAgICBcdTI2QTAgcXVhbGl0eSBhZHZpc29yeTogJHtlc2MoY2hhbmdlLnBlcnN1YXNpb25fZmxhZ3Muam9pbignLCAnKSl9XG4gICAgPC9kaXY+YDtcbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIF9tZHVBcmlhU3VmZml4KGNoYW5nZSkge1xuICBjb25zdCBwYXJ0cyA9IFtdO1xuICBpZiAoY2hhbmdlLnBvc3NpYmxlX2R1cGxpY2F0ZV9vZikgcGFydHMucHVzaChgcG9zc2libGUgZHVwbGljYXRlIG9mICR7Y2hhbmdlLnBvc3NpYmxlX2R1cGxpY2F0ZV9vZn1gKTtcbiAgaWYgKGNoYW5nZS5wZXJzdWFzaW9uX2ZsYWdzICYmIGNoYW5nZS5wZXJzdWFzaW9uX2ZsYWdzLmxlbmd0aCkgcGFydHMucHVzaChgcXVhbGl0eSBhZHZpc29yeTogJHtjaGFuZ2UucGVyc3Vhc2lvbl9mbGFncy5qb2luKCcsICcpfWApO1xuICByZXR1cm4gcGFydHMubGVuZ3RoID8gYCwgJHtwYXJ0cy5qb2luKCcsICcpfWAgOiAnJztcbn1cblxuZnVuY3Rpb24gX21kdVJlbmRlclJldmlld0FyZWEoKSB7XG4gIGNvbnN0IHJldmlld0FyZWEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWR1LXJldmlldy1hcmVhJyk7XG4gIGNvbnN0IGRpc2NhcmRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWR1LWRpc2NhcmQtYnRuJyk7XG4gIGlmICghcmV2aWV3QXJlYSB8fCAhX21kdVBlbmRpbmdQcm9wb3NhbCkgcmV0dXJuO1xuXG4gIGNvbnN0IGNoYW5nZXMgPSBfbWR1UGVuZGluZ1Byb3Bvc2FsLmNoYW5nZXM7XG4gIGNvbnN0IHJvd3NIdG1sID0gY2hhbmdlcy5tYXAoKGMpID0+IHJlbmRlclByb3Bvc2FsUm93KHtcbiAgICBpZDogYy5pZCxcbiAgICB0eXBlTGFiZWw6IGMuc2VjdGlvbixcbiAgICBsYWJlbDogYy5sYWJlbCxcbiAgICBwcm9wb3NlZDogX21kdUNoYW5nZURpc3BsYXlUZXh0KGMpLFxuICAgIGRldGFpbFRleHQ6IGMucmF0aW9uYWxlLFxuICAgIGZsYWdIdG1sOiBfbWR1RmxhZ0h0bWwoYyksXG4gICAgY2hlY2tlZDogZmFsc2UsXG4gIH0sIHtcbiAgICBpZFByZWZpeDogJ21kdScsXG4gICAgY2hlY2tib3hEYXRhQXR0cjogJ21kdS1pZCcsXG4gICAgYXJpYUxhYmVsU3VmZml4OiBfbWR1QXJpYVN1ZmZpeChjKSxcbiAgfSkpLmpvaW4oJycpO1xuXG4gIGNvbnN0IGZsYWdnZWRDb3VudCA9IGNoYW5nZXMuZmlsdGVyKGMgPT4gYy5wb3NzaWJsZV9kdXBsaWNhdGVfb2YgfHwgKGMucGVyc3Vhc2lvbl9mbGFncyAmJiBjLnBlcnN1YXNpb25fZmxhZ3MubGVuZ3RoKSkubGVuZ3RoO1xuXG4gIHJldmlld0FyZWEuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgcm9sZT1cImdyb3VwXCIgYXJpYS1sYWJlbD1cIlByb3Bvc2VkIGNoYW5nZXMsICR7Y2hhbmdlcy5sZW5ndGh9IGl0ZW1zLCAwIHNlbGVjdGVkXCIgaWQ9XCJtZHUtcm93LWdyb3VwXCI+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2FsaWduLWl0ZW1zOmNlbnRlcjttYXJnaW4tYm90dG9tOjhweDtcIj5cbiAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2NvbG9yOnZhcigtLWN2LXRleHQtc2Vjb25kYXJ5KTtcIj4ke2NoYW5nZXMubGVuZ3RofSBwcm9wb3NlZCBjaGFuZ2Uke2NoYW5nZXMubGVuZ3RoID09PSAxID8gJycgOiAncyd9PC9zcGFuPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBvbmNsaWNrPVwic2VsZWN0TWFzdGVyRGF0YUFpTm9uRmxhZ2dlZCgpXCIgc3R5bGU9XCJmb250LXNpemU6MC44ZW07cGFkZGluZzo0cHggMTBweDtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWN2LWJvcmRlcik7Ym9yZGVyLXJhZGl1czo0cHg7YmFja2dyb3VuZDp2YXIoLS1jdi13aGl0ZSk7Y29sb3I6dmFyKC0tY3YtdGV4dC1wcmltYXJ5KTtjdXJzb3I6cG9pbnRlcjtcIj5cbiAgICAgICAgICBTZWxlY3QgYWxsIG5vbi1mbGFnZ2VkXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8dGFibGUgc3R5bGU9XCJ3aWR0aDoxMDAlO2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTtcIj4ke3Jvd3NIdG1sfTwvdGFibGU+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBpZD1cIm1kdS1zZWxlY3Rpb24tbGl2ZVwiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiIGNsYXNzPVwic3Itb25seVwiIHN0eWxlPVwicG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O2hlaWdodDoxcHg7b3ZlcmZsb3c6aGlkZGVuO1wiPjwvZGl2PlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlkPVwibWR1LWNvbmZpcm0tYnRuXCIgb25jbGljaz1cImNvbmZpcm1NYXN0ZXJEYXRhQWlVcGRhdGUoKVwiIGRpc2FibGVkXG4gICAgICBzdHlsZT1cIm1hcmdpbi10b3A6MTBweDtwYWRkaW5nOjlweCAyMHB4O2ZvbnQtc2l6ZTowLjllbTtmb250LXdlaWdodDo2MDA7Y3Vyc29yOm5vdC1hbGxvd2VkO2JhY2tncm91bmQ6dmFyKC0tY3Ytc2xhdGUtMzAwKTtjb2xvcjp2YXIoLS1jdi13aGl0ZSk7Ym9yZGVyOm5vbmU7Ym9yZGVyLXJhZGl1czo2cHg7XCI+XG4gICAgICBDb25maXJtIGFuZCBXcml0ZVxuICAgIDwvYnV0dG9uPlxuICAgICR7ZmxhZ2dlZENvdW50ID8gYDxwIHN0eWxlPVwiZm9udC1zaXplOjAuNzhlbTtjb2xvcjp2YXIoLS1jdi13YXJuLXRleHQpO21hcmdpbi10b3A6NnB4O1wiPiR7ZmxhZ2dlZENvdW50fSBpdGVtJHtmbGFnZ2VkQ291bnQgPT09IDEgPyAnJyA6ICdzJ30gZmxhZ2dlZCBmb3IgcmV2aWV3IGFib3ZlLjwvcD5gIDogJyd9YDtcblxuICBpZiAoZGlzY2FyZEJ0bikgZGlzY2FyZEJ0bi5zdHlsZS5kaXNwbGF5ID0gJ2lubGluZS1ibG9jayc7XG5cbiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1yZXZpZXctYXJlYScpO1xuICBhdHRhY2hQcm9wb3NhbFJvd0xpc3RlbmVycyhjb250YWluZXIsICdtZHUnKTtcbiAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W2RhdGEtbWR1LWlkXScpLmZvckVhY2goKGNiKSA9PiB7XG4gICAgY2IuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgX21kdVVwZGF0ZUNvbmZpcm1CdXR0b25TdGF0ZSk7XG4gIH0pO1xuICBfbWR1VXBkYXRlQ29uZmlybUJ1dHRvblN0YXRlKCk7XG59XG5cbmZ1bmN0aW9uIF9tZHVVcGRhdGVDb25maXJtQnV0dG9uU3RhdGUoKSB7XG4gIGNvbnN0IGNoZWNrZWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtkYXRhLW1kdS1pZF06Y2hlY2tlZCcpO1xuICBjb25zdCBjb25maXJtQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1jb25maXJtLWJ0bicpO1xuICBjb25zdCBncm91cCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtcm93LWdyb3VwJyk7XG4gIGNvbnN0IGxpdmVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtc2VsZWN0aW9uLWxpdmUnKTtcbiAgY29uc3QgdG90YWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtkYXRhLW1kdS1pZF0nKS5sZW5ndGg7XG4gIGlmIChjb25maXJtQnRuKSB7XG4gICAgY29uZmlybUJ0bi5kaXNhYmxlZCA9IGNoZWNrZWQubGVuZ3RoID09PSAwO1xuICAgIGNvbmZpcm1CdG4uc3R5bGUuY3Vyc29yID0gY2hlY2tlZC5sZW5ndGggPT09IDAgPyAnbm90LWFsbG93ZWQnIDogJ3BvaW50ZXInO1xuICAgIGNvbmZpcm1CdG4uc3R5bGUuYmFja2dyb3VuZCA9IGNoZWNrZWQubGVuZ3RoID09PSAwID8gJ3ZhcigtLWN2LXNsYXRlLTMwMCknIDogJ3ZhcigtLWN2LXN1Y2Nlc3MtbWQpJztcbiAgfVxuICBpZiAoZ3JvdXApIGdyb3VwLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIGBQcm9wb3NlZCBjaGFuZ2VzLCAke3RvdGFsfSBpdGVtcywgJHtjaGVja2VkLmxlbmd0aH0gc2VsZWN0ZWRgKTtcbiAgaWYgKGxpdmVFbCkgbGl2ZUVsLnRleHRDb250ZW50ID0gYCR7Y2hlY2tlZC5sZW5ndGh9IG9mICR7dG90YWx9IHNlbGVjdGVkYDtcbn1cblxuZnVuY3Rpb24gc2VsZWN0TWFzdGVyRGF0YUFpTm9uRmxhZ2dlZCgpIHtcbiAgaWYgKCFfbWR1UGVuZGluZ1Byb3Bvc2FsKSByZXR1cm47XG4gIGNvbnN0IGZsYWdnZWRJZHMgPSBuZXcgU2V0KFxuICAgIF9tZHVQZW5kaW5nUHJvcG9zYWwuY2hhbmdlc1xuICAgICAgLmZpbHRlcihjID0+IGMucG9zc2libGVfZHVwbGljYXRlX29mIHx8IChjLnBlcnN1YXNpb25fZmxhZ3MgJiYgYy5wZXJzdWFzaW9uX2ZsYWdzLmxlbmd0aCkpXG4gICAgICAubWFwKGMgPT4gYy5pZCksXG4gICk7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W2RhdGEtbWR1LWlkXScpLmZvckVhY2goKGNiKSA9PiB7XG4gICAgaWYgKCFmbGFnZ2VkSWRzLmhhcyhjYi5kYXRhc2V0Lm1kdUlkKSkgY2IuY2hlY2tlZCA9IHRydWU7XG4gIH0pO1xuICBfbWR1VXBkYXRlQ29uZmlybUJ1dHRvblN0YXRlKCk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBDb25maXJtIGFuZCB3cml0ZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gY29uZmlybU1hc3RlckRhdGFBaVVwZGF0ZSgpIHtcbiAgaWYgKCFfbWR1UGVuZGluZ1Byb3Bvc2FsKSByZXR1cm47XG4gIGNvbnN0IHNlbGVjdGVkSWRzID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtkYXRhLW1kdS1pZF06Y2hlY2tlZCcpKS5tYXAoY2IgPT4gY2IuZGF0YXNldC5tZHVJZCk7XG4gIGlmIChzZWxlY3RlZElkcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBjb25zdCBzb3VyY2VMYWJlbCA9IF9tZHVQZW5kaW5nUHJvcG9zYWwuc291cmNlID09PSAnbmxfaW5zdHJ1Y3Rpb24nID8gJ3lvdXIgaW5zdHJ1Y3Rpb24nIDogJ3RoZSB1cGxvYWRlZCBkb2N1bWVudCc7XG4gIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0ICh0eXBlb2Ygc2hvd0NvbmZpcm1Nb2RhbCA9PT0gJ2Z1bmN0aW9uJ1xuICAgID8gc2hvd0NvbmZpcm1Nb2RhbChcbiAgICAgICAgYFdyaXRlICR7c2VsZWN0ZWRJZHMubGVuZ3RofSBjaGFuZ2Uke3NlbGVjdGVkSWRzLmxlbmd0aCA9PT0gMSA/ICcnIDogJ3MnfSB0byBNYXN0ZXIgQ1Y/YCxcbiAgICAgICAgYFRoZXNlICR7c2VsZWN0ZWRJZHMubGVuZ3RofSBjaGFuZ2Uke3NlbGVjdGVkSWRzLmxlbmd0aCA9PT0gMSA/ICcnIDogJ3MnfSB3ZXJlIHByb3Bvc2VkIGJ5IEFJIGZyb20gJHtzb3VyY2VMYWJlbH0gYW5kIGhhdmUgbm90IGJlZW4gcHJldmlvdXNseSByZXZpZXdlZC4gYCArXG4gICAgICAgIGBDb25maXJtaW5nIHdpbGwgcGVybWFuZW50bHkgd3JpdGUgdGhlbSB0byBNYXN0ZXJfQ1ZfRGF0YS5qc29uLiBBIGJhY2t1cCB3aWxsIGJlIGNyZWF0ZWQgZmlyc3QgXHUyMDE0IHNlZSBcdUQ4M0RcdURENTAgQmFja3VwcyBhYm92ZSB0byByZXN0b3JlIGl0IGlmIG5lZWRlZC5gLFxuICAgICAgKVxuICAgIDogUHJvbWlzZS5yZXNvbHZlKHdpbmRvdy5jb25maXJtKGBXcml0ZSAke3NlbGVjdGVkSWRzLmxlbmd0aH0gY2hhbmdlKHMpIHRvIE1hc3RlciBDVj8gVGhpcyB3aWxsIHBlcm1hbmVudGx5IHdyaXRlIGNoYW5nZXMgdG8gTWFzdGVyX0NWX0RhdGEuanNvbi5gKSkpO1xuXG4gIGlmICghY29uZmlybWVkKSByZXR1cm47XG5cbiAgY29uc3QgY29uZmlybUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtY29uZmlybS1idG4nKTtcbiAgY29uc3QgcmVzdWx0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWR1LXJlc3VsdCcpO1xuICBpZiAoY29uZmlybUJ0bikgeyBjb25maXJtQnRuLmRpc2FibGVkID0gdHJ1ZTsgY29uZmlybUJ0bi50ZXh0Q29udGVudCA9ICdXcml0aW5nXHUyMDI2JzsgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL2NvbmZpcm0tdXBkYXRlJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcHJvcG9zYWxfaWQ6IF9tZHVQZW5kaW5nUHJvcG9zYWwucHJvcG9zYWxJZCwgc2VsZWN0ZWRfaWRzOiBzZWxlY3RlZElkcyB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcC5qc29uKCk7XG5cbiAgICBpZiAoZGF0YS5vayA9PT0gZmFsc2UgJiYgZGF0YS5zdGFsZV9jaGFuZ2VzKSB7XG4gICAgICBfbWR1SGFuZGxlU3RhbGVDaGFuZ2VzKGRhdGEuc3RhbGVfY2hhbmdlcywgZGF0YS5hcHBsaWNhYmxlX2NoYW5nZXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWRhdGEub2spIHtcbiAgICAgIGlmIChyZXN1bHRFbCkgcmVzdWx0RWwuaW5uZXJIVE1MID0gYDxwIGNsYXNzPVwiZXJyb3ItbWVzc2FnZVwiPkNvbmZpcm0gZmFpbGVkOiAke2VzYyhkYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yJyl9PC9wPmA7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY2hhbmdlc0J5SWQgPSBPYmplY3QuZnJvbUVudHJpZXMoX21kdVBlbmRpbmdQcm9wb3NhbC5jaGFuZ2VzLm1hcChjID0+IFtjLmlkLCBjXSkpO1xuICAgIGNvbnN0IHdyaXR0ZW5MaW5lcyA9IChkYXRhLmRpZmZfc3VtbWFyeSB8fCBbXSlcbiAgICAgIC5maWx0ZXIoZCA9PiBkLmFwcGxpZWQpXG4gICAgICAubWFwKGQgPT4gYDxsaT4ke2VzYyhkLmxhYmVsIHx8IGQuaWQpfSR7Y2hhbmdlc0J5SWRbZC5pZF0/LnJhdGlvbmFsZSA/IGAgXHUyMDE0ICR7ZXNjKGNoYW5nZXNCeUlkW2QuaWRdLnJhdGlvbmFsZSl9YCA6ICcnfTwvbGk+YClcbiAgICAgIC5qb2luKCcnKTtcblxuICAgIGNvbnN0IGNvbW1pdEluZm8gPSBkYXRhLmNvbW1pdF9oYXNoID8gYCAoY29tbWl0ICR7ZXNjKGRhdGEuY29tbWl0X2hhc2gpfSlgIDogJyc7XG4gICAgY29uc3QgZ2l0V2FybmluZyA9IGRhdGEuZ2l0X2Vycm9yXG4gICAgICA/IGA8cCBzdHlsZT1cImNvbG9yOnZhcigtLWN2LXdhcm4tdGV4dCk7Zm9udC1zaXplOjAuODdlbTtcIj5cdTI2QTBcdUZFMEYgR2l0IGNvbW1pdCBza2lwcGVkOiAke2VzYyhkYXRhLmdpdF9lcnJvcj8ubWVzc2FnZSB8fCBkYXRhLmdpdF9lcnJvcil9PC9wPmBcbiAgICAgIDogJyc7XG4gICAgY29uc3QgcHVzaFdhcm5pbmcgPSBkYXRhLnB1c2hfZXJyb3JcbiAgICAgID8gYDxwIHN0eWxlPVwiY29sb3I6dmFyKC0tY3Ytd2Fybi10ZXh0KTtmb250LXNpemU6MC44N2VtO1wiPlx1MjZBMFx1RkUwRiBHaXQgcHVzaCBza2lwcGVkOiAke2VzYyhkYXRhLnB1c2hfZXJyb3IpfTwvcD5gXG4gICAgICA6ICcnO1xuXG4gICAgaWYgKHJlc3VsdEVsKSB7XG4gICAgICByZXN1bHRFbC5pbm5lckhUTUwgPSBgXG4gICAgICAgIDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOnZhcigtLWN2LXN1Y2Nlc3MtYmcpO2JvcmRlcjoxcHggc29saWQgdmFyKC0tY3Ytc3VjY2Vzcy1ib3JkZXIpO2JvcmRlci1yYWRpdXM6NnB4O3BhZGRpbmc6MTJweCAxNnB4O1wiPlxuICAgICAgICAgIDxwIHN0eWxlPVwiY29sb3I6dmFyKC0tY3Ytc3VjY2Vzcy10ZXh0KTtmb250LXdlaWdodDo2MDA7bWFyZ2luOjAgMCA2cHg7XCI+XG4gICAgICAgICAgICBcdTI3MDUgJHtkYXRhLndyaXR0ZW5fY291bnR9IGl0ZW0ke2RhdGEud3JpdHRlbl9jb3VudCA9PT0gMSA/ICcnIDogJ3MnfSB3cml0dGVuIHRvIG1hc3RlciBDViR7Y29tbWl0SW5mb30uXG4gICAgICAgICAgPC9wPlxuICAgICAgICAgICR7d3JpdHRlbkxpbmVzID8gYDx1bCBzdHlsZT1cImZvbnQtc2l6ZTowLjgyZW07Y29sb3I6dmFyKC0tY3YtdGV4dC1tdXRlZCk7bWFyZ2luOjRweCAwIDA7cGFkZGluZy1sZWZ0OjE4cHg7XCI+JHt3cml0dGVuTGluZXN9PC91bD5gIDogJyd9XG4gICAgICAgICAgJHtnaXRXYXJuaW5nfSR7cHVzaFdhcm5pbmd9XG4gICAgICAgIDwvZGl2PmA7XG4gICAgfVxuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1yZXZpZXctYXJlYScpLmlubmVySFRNTCA9ICcnO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtZGlzY2FyZC1idG4nKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIF9tZHVQZW5kaW5nUHJvcG9zYWwgPSBudWxsO1xuICAgIF9tZHVQcmlvckNsYXJpZmljYXRpb25zID0gW107XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy5lcnJvcignY29uZmlybU1hc3RlckRhdGFBaVVwZGF0ZTogZmFpbGVkJywgZXJyKTtcbiAgICBpZiAocmVzdWx0RWwpIHJlc3VsdEVsLmlubmVySFRNTCA9IGA8cCBjbGFzcz1cImVycm9yLW1lc3NhZ2VcIj5OZXR3b3JrIGVycm9yOiAke2VzYyhlcnIubWVzc2FnZSl9PC9wPmA7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKGNvbmZpcm1CdG4pIHsgY29uZmlybUJ0bi5kaXNhYmxlZCA9IGZhbHNlOyBjb25maXJtQnRuLnRleHRDb250ZW50ID0gJ0NvbmZpcm0gYW5kIFdyaXRlJzsgfVxuICB9XG59XG5cbmZ1bmN0aW9uIF9tZHVIYW5kbGVTdGFsZUNoYW5nZXMoc3RhbGVDaGFuZ2VzLCBhcHBsaWNhYmxlQ2hhbmdlcykge1xuICBjb25zdCByZXN1bHRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtcmVzdWx0Jyk7XG4gIGNvbnN0IHN0YWxlSWRzID0gbmV3IFNldChzdGFsZUNoYW5nZXMubWFwKHMgPT4gcy5pZCkpO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W2RhdGEtbWR1LWlkXScpLmZvckVhY2goKGNiKSA9PiB7XG4gICAgaWYgKHN0YWxlSWRzLmhhcyhjYi5kYXRhc2V0Lm1kdUlkKSkge1xuICAgICAgY2IuY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgY2IuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgY29uc3Qgcm93ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYG1kdS1yb3ctJHtjYi5kYXRhc2V0Lm1kdUlkfWApO1xuICAgICAgaWYgKHJvdykgcm93LnN0eWxlLm9wYWNpdHkgPSAnMC41JztcbiAgICB9XG4gIH0pO1xuICBfbWR1VXBkYXRlQ29uZmlybUJ1dHRvblN0YXRlKCk7XG5cbiAgY29uc3QgbGl2ZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1zZWxlY3Rpb24tbGl2ZScpO1xuICBjb25zdCBzdW1tYXJ5ID0gYCR7c3RhbGVDaGFuZ2VzLmxlbmd0aH0gaXRlbSR7c3RhbGVDaGFuZ2VzLmxlbmd0aCA9PT0gMSA/ICcgaXMnIDogJ3MgYXJlJ30gbm8gbG9uZ2VyIHZhbGlkIGFuZCAke3N0YWxlQ2hhbmdlcy5sZW5ndGggPT09IDEgPyAnd2FzJyA6ICd3ZXJlJ30gZGVzZWxlY3RlZDsgcmV2aWV3IGFuZCBjb25maXJtIGFnYWluLmA7XG4gIGlmIChsaXZlRWwpIGxpdmVFbC50ZXh0Q29udGVudCA9IHN1bW1hcnk7XG5cbiAgY29uc3Qgc3RhbGVMaXN0ID0gc3RhbGVDaGFuZ2VzLm1hcChzID0+IGA8bGk+JHtlc2Mocy5sYWJlbCB8fCBzLmlkKX0gXHUyMDE0ICR7ZXNjKHMucmVhc29uKX08L2xpPmApLmpvaW4oJycpO1xuICBpZiAocmVzdWx0RWwpIHtcbiAgICByZXN1bHRFbC5pbm5lckhUTUwgPSBgXG4gICAgICA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDp2YXIoLS1jdi1iZy1zdWJ0bGUpO2JvcmRlcjoxcHggc29saWQgdmFyKC0tY3Ytc2xhdGUtMzAwKTtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjEycHggMTZweDtcIj5cbiAgICAgICAgPHAgc3R5bGU9XCJjb2xvcjp2YXIoLS1jdi10ZXh0LW11dGVkKTtmb250LXdlaWdodDo2MDA7bWFyZ2luOjAgMCA2cHg7XCI+Tm90aGluZyB3YXMgd3JpdHRlbiBcdTIwMTQgJHtzdW1tYXJ5fTwvcD5cbiAgICAgICAgPHVsIHN0eWxlPVwiZm9udC1zaXplOjAuODJlbTtjb2xvcjp2YXIoLS1jdi10ZXh0LW11dGVkKTttYXJnaW46NHB4IDAgMDtwYWRkaW5nLWxlZnQ6MThweDtcIj4ke3N0YWxlTGlzdH08L3VsPlxuICAgICAgICA8cCBzdHlsZT1cImZvbnQtc2l6ZTowLjgyZW07Y29sb3I6dmFyKC0tY3YtdGV4dC1zZWNvbmRhcnkpO21hcmdpbi10b3A6OHB4O1wiPiR7YXBwbGljYWJsZUNoYW5nZXMubGVuZ3RofSBpdGVtJHthcHBsaWNhYmxlQ2hhbmdlcy5sZW5ndGggPT09IDEgPyAnJyA6ICdzJ30gJHthcHBsaWNhYmxlQ2hhbmdlcy5sZW5ndGggPT09IDEgPyAnaXMnIDogJ2FyZSd9IHN0aWxsIHZhbGlkIFx1MjAxNCBjbGljayBcIkNvbmZpcm0gYW5kIFdyaXRlXCIgYWdhaW4gdG8gYXBwbHkganVzdCB0aG9zZS48L3A+XG4gICAgICA8L2Rpdj5gO1xuICB9XG59XG5cbi8vIE5vdGU6IG5vIGNsaWVudC1zaWRlIFwicmVzdW1lIGFuIGluLXByb2dyZXNzIHByb3Bvc2FsXCIgYWZmb3JkYW5jZSBcdTIwMTQgdGhlXG4vLyBwYW5lbCByZXNldHMgaXRzIHN0YXRlIG9uIGV2ZXJ5IHJlbmRlciAoc2VlIF9tZHVSZXNldFN0YXRlLCBjYWxsZWQgZnJvbVxuLy8gcmVuZGVyTWFzdGVyRGF0YUFpVXBkYXRlUGFuZWwpLCBhbmQgcGVuZGluZyBwcm9wb3NhbHMgbGl2ZSBzZXJ2ZXItc2lkZVxuLy8ga2V5ZWQgYnkgcHJvcG9zYWxfaWQgd2l0aCB0aGVpciBvd24gVFRMIChzZWUgbWFzdGVyX2RhdGFfcm91dGVzLnB5KS5cbi8vIFJlc3VtaW5nIHdvdWxkIHJlcXVpcmUgYSBzZXNzaW9uLXN0YXR1cy1kcml2ZW4gY2hlY2sgZm9yIGFuIGV4aXN0aW5nXG4vLyBwZW5kaW5nIHByb3Bvc2FsIGJlZm9yZSB0aGUgcGFuZWwgZmlyc3QgcmVuZGVyczsgdHJhY2tlZCBhcyBhIGtub3duIHYxXG4vLyBsaW1pdGF0aW9uLCBub3Qgc2lsZW50bHkgYWJzZW50LlxuXG5leHBvcnQge1xuICByZW5kZXJNYXN0ZXJEYXRhQWlVcGRhdGVQYW5lbCxcbiAgcmVuZGVyTWFzdGVyRGF0YUFpVXBkYXRlRGlzYWJsZWROb3RlLFxuICB0b2dnbGVNYXN0ZXJEYXRhQWlQYW5lbCxcbiAgc2V0TWFzdGVyRGF0YUFpTW9kZSxcbiAgaGFuZGxlTWFzdGVyRGF0YUFpRmlsZVVwbG9hZCxcbiAgc3VibWl0TWFzdGVyRGF0YUFpUHJvcG9zZSxcbiAgZGlzY2FyZE1hc3RlckRhdGFBaVByb3Bvc2FsLFxuICBzZWxlY3RNYXN0ZXJEYXRhQWlOb25GbGFnZ2VkLFxuICBjb25maXJtTWFzdGVyRGF0YUFpVXBkYXRlLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL21hc3Rlci1jdi5qc1xuICogTWFzdGVyIENWIG1hbmFnZW1lbnQgdGFiOiBmZXRjaCwgcmVuZGVyLCBhbmQgQ1JVRCBmb3IgcGVyc29uYWwgaW5mbyxcbiAqIGV4cGVyaWVuY2VzLCBza2lsbHMsIGVkdWNhdGlvbiwgYXdhcmRzLCBhY2hpZXZlbWVudHMsIHN1bW1hcmllcy5cbiAqXG4gKiBEZXBlbmRlbmNpZXMgKHJlc29sdmVkIHRocm91Z2ggZ2xvYmFsVGhpcyBhdCBydW50aW1lKTpcbiAqICAgZXNjYXBlSHRtbCwgc2hvd1RvYXN0LCBzaG93QWxlcnRNb2RhbCwgY29uZmlybURpYWxvZyxcbiAqICAgYXBwZW5kTG9hZGluZ01lc3NhZ2UsIHJlbW92ZUxvYWRpbmdNZXNzYWdlLFxuICogICBzZXRMb2FkaW5nLCBzd2l0Y2hUYWIsIGFwcGVuZE1lc3NhZ2UsXG4gKiAgIHJlbmRlck1hc3RlckRhdGFBaVVwZGF0ZVBhbmVsLCByZW5kZXJNYXN0ZXJEYXRhQWlVcGRhdGVEaXNhYmxlZE5vdGVcbiAqICAgICAoZnJvbSB3ZWIvbWFzdGVyLWRhdGEtYWktdXBkYXRlLmpzLCBHQVAtMDEpXG4gKi9cblxubGV0IF9tYXN0ZXJDaGFuZ2VOb3RpY2UgPSAnJztcblxuLy8gVHJhY2tzIHRoZSBhY3RpdmUgcmVuZGVyIHRhcmdldDogbW9kYWwgYm9keSBkaXYgd2hlbiBvcGVuZWQgZnJvbSBoZWFkZXIsXG4vLyBudWxsIHdoZW4gcmVuZGVyZWQgaW50byB0aGUgbm9ybWFsIHRhYiB2aWV3ZXIuXG5sZXQgX21hc3RlckN2QWN0aXZlQ29udGFpbmVyID0gbnVsbDtcblxuLy8gRmlsZW5hbWUgb2YgdGhlIHNhZmV0eSBiYWNrdXAgY3JlYXRlZCBieSB0aGUgbW9zdCByZWNlbnQgdW5kbywgcmVzdG9yYWJsZVxuLy8gdmlhIHJlZG8uIFNpbmdsZS1sZXZlbCBieSBkZXNpZ24gKEdBUC0xOSAxNi43IHYxIHNjb3BlKSBcdTIwMTQgZnVydGhlci1iYWNrXG4vLyByZWNvdmVyeSByZW1haW5zIGF2YWlsYWJsZSB2aWEgdGhlIGZ1bGwgXCJcdUQ4M0RcdURENTAgQmFja3Vwc1wiIGhpc3RvcnkgbW9kYWwuXG4vLyBSZXNldCB0byBudWxsIGF0IHRoZSB0b3Agb2YgZXZlcnkgcG9wdWxhdGVNYXN0ZXJUYWIoKSByZS1yZW5kZXIgc28gYW55XG4vLyBvdGhlciBzYXZlIGFjdGlvbiAoc3RydWN0dXJlZCBlZGl0LCBBSS11cGRhdGUgY29uZmlybSwgaGFydmVzdCBhcHBseSlcbi8vIGludmFsaWRhdGVzIGEgc3RhbGUgcmVkbyB0YXJnZXQuIHVuZG9NYXN0ZXJEYXRhQ2hhbmdlKCkgc2V0c1xuLy8gX21hc3RlckN2U3VwcHJlc3NSZWRvUmVzZXQgYmVmb3JlIGl0cyBvd24gcG9wdWxhdGVNYXN0ZXJUYWIoKSBjYWxsIHNvIGl0c1xuLy8gZnJlc2hseS1zZXQgcmVkbyB0YXJnZXQgc3Vydml2ZXMgdGhhdCBvbmUgcmVuZGVyLlxubGV0IF9tYXN0ZXJDdlJlZG9CYWNrdXAgPSBudWxsO1xubGV0IF9tYXN0ZXJDdlN1cHByZXNzUmVkb1Jlc2V0ID0gZmFsc2U7XG5cbmZ1bmN0aW9uIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2Uoc2VjdGlvbiwgYWN0aW9uKSB7XG4gIGNvbnN0IGNsZWFuU2VjdGlvbiA9IFN0cmluZyhzZWN0aW9uIHx8ICdNYXN0ZXIgQ1YnKS50cmltKCk7XG4gIGNvbnN0IGNsZWFuQWN0aW9uID0gU3RyaW5nKGFjdGlvbiB8fCAndXBkYXRlZCcpLnRyaW0oKTtcbiAgX21hc3RlckNoYW5nZU5vdGljZSA9IGAke2NsZWFuU2VjdGlvbn0gJHtjbGVhbkFjdGlvbn0uYDtcbn1cblxuZnVuY3Rpb24gX3JlbmRlck1hc3RlckNoYW5nZU5vdGljZSgpIHtcbiAgaWYgKCFfbWFzdGVyQ2hhbmdlTm90aWNlKSByZXR1cm4gJyc7XG4gIHJldHVybiBgXG4gICAgPGRpdiBzdHlsZT1cIm1hcmdpbjoxMnB4IDAgMThweDtwYWRkaW5nOjEwcHggMTJweDtib3JkZXI6MXB4IHNvbGlkICNiYmY3ZDA7YmFja2dyb3VuZDojZjBmZGY0O2JvcmRlci1yYWRpdXM6OHB4O2NvbG9yOiMxNDUzMmQ7XCI+XG4gICAgICA8c3Ryb25nPkxhc3Qgc2F2ZWQgY2hhbmdlOjwvc3Ryb25nPiAke2VzY2FwZUh0bWwoX21hc3RlckNoYW5nZU5vdGljZSl9XG4gICAgPC9kaXY+XG4gIGA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHBvcHVsYXRlTWFzdGVyVGFiKGNvbnRhaW5lciA9IG51bGwpIHtcbiAgaWYgKGNvbnRhaW5lciAhPT0gbnVsbCkgX21hc3RlckN2QWN0aXZlQ29udGFpbmVyID0gY29udGFpbmVyO1xuICBpZiAoX21hc3RlckN2U3VwcHJlc3NSZWRvUmVzZXQpIHtcbiAgICBfbWFzdGVyQ3ZTdXBwcmVzc1JlZG9SZXNldCA9IGZhbHNlO1xuICB9IGVsc2Uge1xuICAgIF9tYXN0ZXJDdlJlZG9CYWNrdXAgPSBudWxsO1xuICB9XG4gIGNvbnN0IGNvbnRlbnQgPSBfbWFzdGVyQ3ZBY3RpdmVDb250YWluZXIgfHwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgY29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImVtcHR5LXN0YXRlXCI+PGRpdiBjbGFzcz1cImxvYWRpbmctc3Bpbm5lclwiPjwvZGl2PjxwIHN0eWxlPVwibWFyZ2luLXRvcDoxMnB4O2NvbG9yOiM2NDc0OGI7XCI+TG9hZGluZyBtYXN0ZXIgQ1YgZGF0YVx1MjAyNjwvcD48L2Rpdj4nO1xuXG4gIGxldCBvdmVydmlldyA9IHt9O1xuICBsZXQgZnVsbERhdGEgID0ge307XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBbb3ZSZXMsIGZkUmVzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL292ZXJ2aWV3JyksXG4gICAgICBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS9mdWxsJyksXG4gICAgXSk7XG4gICAgb3ZlcnZpZXcgPSAoYXdhaXQgb3ZSZXMuanNvbigpKSB8fCB7fTtcbiAgICBmdWxsRGF0YSAgPSAoYXdhaXQgZmRSZXMuanNvbigpKSB8fCB7fTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY29udGVudC5pbm5lckhUTUwgPSAnPHAgc3R5bGU9XCJjb2xvcjojZWY0NDQ0O3BhZGRpbmc6MjBweDtcIj5GYWlsZWQgdG8gbG9hZCBtYXN0ZXIgQ1YgZGF0YS48L3A+JztcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwZXJzb25hbEluZm8gPSBmdWxsRGF0YS5wZXJzb25hbF9pbmZvIHx8IHt9O1xuICBjb25zdCBleHBlcmllbmNlcyAgICAgPSBmdWxsRGF0YS5leHBlcmllbmNlIHx8IFtdO1xuICB3aW5kb3cuX21hc3RlckV4cGVyaWVuY2VPcHRpb25zID0gZXhwZXJpZW5jZXNcbiAgICAubWFwKChleHApID0+ICh7XG4gICAgICBpZDogZXhwLmlkIHx8ICcnLFxuICAgICAgbGFiZWw6IGAke2V4cC50aXRsZSB8fCAnUm9sZSd9IEAgJHtleHAuY29tcGFueSB8fCAnQ29tcGFueSd9YCxcbiAgICB9KSlcbiAgICAuZmlsdGVyKCh4KSA9PiB4LmlkKTtcbiAgLy8gRnVsbCBleHBlcmllbmNlIG9iamVjdHMgKGluY2x1ZGluZyBhY2hpZXZlbWVudHMpLCBrZXllZCBieSBpZCwgc29cbiAgLy8gZWRpdE1hc3RlckV4cGVyaWVuY2UoKSBjYW4gbG9vayB1cCBuZXN0ZWQgYWNoaWV2ZW1lbnRzIHdpdGhvdXRcbiAgLy8gZW1iZWRkaW5nIGFyYml0cmFyeSBhY2hpZXZlbWVudCB0ZXh0IGluc2lkZSBhbiBpbmxpbmUgb25jbGljayBhdHRyaWJ1dGUuXG4gIHdpbmRvdy5fbWFzdGVyRXhwZXJpZW5jZUZ1bGxEYXRhID0gZXhwZXJpZW5jZXM7XG4gIGNvbnN0IHNraWxscyAgICAgICAgICA9IGZ1bGxEYXRhLnNraWxscyB8fCBbXTtcbiAgY29uc3QgZWR1Y2F0aW9uICAgICAgID0gZnVsbERhdGEuZWR1Y2F0aW9uIHx8IFtdO1xuICBjb25zdCBhd2FyZHMgICAgICAgICAgPSBmdWxsRGF0YS5hd2FyZHMgfHwgW107XG4gIGNvbnN0IGNlcnRpZmljYXRpb25zICA9IGZ1bGxEYXRhLmNlcnRpZmljYXRpb25zIHx8IFtdO1xuICBjb25zdCBhY2hpZXZlbWVudHMgICAgPSBmdWxsRGF0YS5zZWxlY3RlZF9hY2hpZXZlbWVudHMgfHwgW107XG4gIGNvbnN0IHN1bW1hcmllcyAgICAgICA9IGZ1bGxEYXRhLnByb2Zlc3Npb25hbF9zdW1tYXJpZXMgfHwge307XG5cbiAgY29uc3QgY3VycmVudFBoYXNlID0gKHR5cGVvZiBzdGF0ZU1hbmFnZXIgIT09ICd1bmRlZmluZWQnICYmIHN0YXRlTWFuYWdlci5nZXRQaGFzZSlcbiAgICA/IHN0YXRlTWFuYWdlci5nZXRQaGFzZSgpXG4gICAgOiBudWxsO1xuICBjb25zdCBFRElUQUJMRV9QSEFTRVMgPSBuZXcgU2V0KFsnaW5pdCcsICdyZWZpbmVtZW50JywgbnVsbCwgdW5kZWZpbmVkLCAnJ10pO1xuICBjb25zdCBpc0VkaXRhYmxlID0gRURJVEFCTEVfUEhBU0VTLmhhcyhjdXJyZW50UGhhc2UpO1xuXG4gIGNvbnN0IHBoYXNlTG9ja0Jhbm5lciA9IGlzRWRpdGFibGUgPyAnJyA6IGBcbiAgICA8ZGl2IHJvbGU9XCJzdGF0dXNcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIlxuICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZWYyZjI7Ym9yZGVyOjFweCBzb2xpZCAjZmNhNWE1O2JvcmRlci1yYWRpdXM6NnB4O1xuICAgICAgICAgICAgICAgIHBhZGRpbmc6MTBweCAxNHB4O21hcmdpbi1ib3R0b206MTZweDtmb250LXNpemU6MC44OGVtO2NvbG9yOiM5OTFiMWI7XCI+XG4gICAgICA8c3Ryb25nPlx1RDgzRFx1REQxMiBSZWFkLW9ubHkgXHUyMDE0IGVkaXRpbmcgbG9ja2VkPC9zdHJvbmc+PGJyPlxuICAgICAgTWFzdGVyIENWIGVkaXRpbmcgaXMgb25seSBhdmFpbGFibGUgYmVmb3JlIGpvYiBhbmFseXNpcyBiZWdpbnMgb3IgZHVyaW5nIHRoZVxuICAgICAgUmVmaW5lbWVudCBzdGFnZS4gVGhlIGN1cnJlbnQgc3RhZ2UgaXMgPHN0cm9uZz4ke2VzY2FwZUh0bWwoY3VycmVudFBoYXNlIHx8ICd1bmtub3duJyl9PC9zdHJvbmc+LlxuICAgICAgU2F2ZSBvciBjb21wbGV0ZSB0aGUgY3VycmVudCBzdGFnZSB0byByZS1lbmFibGUgZWRpdGluZy5cbiAgICA8L2Rpdj5gO1xuXG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2ZsZXgtd3JhcDp3cmFwO2dhcDo4cHg7bWFyZ2luLWJvdHRvbTo0cHg7XCI+XG4gICAgICA8aDEgc3R5bGU9XCJtYXJnaW46MDtcIj5cdUQ4M0RcdURDREEgTWFzdGVyIENWIFByb2ZpbGU8L2gxPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6OHB4O2ZsZXgtd3JhcDp3cmFwO1wiPlxuICAgICAgICA8YnV0dG9uIGlkPVwibWFzdGVyLWN2LXVuZG8tYnRuXCIgY2xhc3M9XCJhY3Rpb24tYnRuIHNlY29uZGFyeVwiIG9uY2xpY2s9XCJ1bmRvTWFzdGVyRGF0YUNoYW5nZSgpXCJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJVbmRvIHRoZSBtb3N0IHJlY2VudCBNYXN0ZXIgQ1YgY2hhbmdlXCIgdGl0bGU9XCJVbmRvIChDdHJsK1opXCI+XG4gICAgICAgICAgXHUyMUE5IFVuZG9cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gaWQ9XCJtYXN0ZXItY3YtcmVkby1idG5cIiBjbGFzcz1cImFjdGlvbi1idG4gc2Vjb25kYXJ5XCIgb25jbGljaz1cInJlZG9NYXN0ZXJEYXRhQ2hhbmdlKClcIlxuICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlJlZG8gdGhlIHByZXZpb3VzbHkgdW5kb25lIE1hc3RlciBDViBjaGFuZ2VcIiB0aXRsZT1cIlJlZG8gKEN0cmwrU2hpZnQrWilcIiR7IV9tYXN0ZXJDdlJlZG9CYWNrdXAgPyAnIGRpc2FibGVkJyA6ICcnfT5cbiAgICAgICAgICBcdTIxQUEgUmVkb1xuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG4gc2Vjb25kYXJ5XCIgb25jbGljaz1cIm9wZW5CYWNrdXBIaXN0b3J5TW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJWaWV3IGJhY2t1cCBoaXN0b3J5XCI+XG4gICAgICAgICAgXHVEODNEXHVERDUwIEJhY2t1cHNcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHNlY29uZGFyeVwiIG9uY2xpY2s9XCJvcGVuRnVsbERhdGFQcmV2aWV3TW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJQcmV2aWV3IGZ1bGwgbWFzdGVyIENWIGRhdGFcIj5cbiAgICAgICAgICBcdUQ4M0RcdURDNDEgUHJldmlldyBGdWxsIERhdGFcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHNlY29uZGFyeVwiIG9uY2xpY2s9XCJleHBvcnRNYXN0ZXJDVigpXCIgYXJpYS1sYWJlbD1cIkRvd25sb2FkIE1hc3Rlcl9DVl9EYXRhLmpzb25cIj5cbiAgICAgICAgICBcdTJCMDdcdUZFMEYgRXhwb3J0IEpTT05cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHNlY29uZGFyeVwiIG9uY2xpY2s9XCJ0cmlnZ2VyTWFzdGVyQ3ZJbXBvcnQoKVwiIGFyaWEtbGFiZWw9XCJJbXBvcnQgYSBmdWxsIE1hc3Rlcl9DVl9EYXRhLmpzb24gZmlsZVwiJHtpc0VkaXRhYmxlID8gJycgOiAnIGRpc2FibGVkJ30+XG4gICAgICAgICAgXHUyQjA2XHVGRTBGIEltcG9ydCBKU09OXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiBpZD1cIm1hc3Rlci1jdi1pbXBvcnQtZmlsZS1pbnB1dFwiIGFjY2VwdD1cImFwcGxpY2F0aW9uL2pzb24sLmpzb25cIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIlxuICAgICAgICAgICAgb25jaGFuZ2U9XCJoYW5kbGVNYXN0ZXJDdkltcG9ydEZpbGUoZXZlbnQpXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDttYXJnaW4tYm90dG9tOjEycHg7XCI+XG4gICAgICBUaGlzIGlzIHlvdXIgcGVyc2lzdGVudCBtYXN0ZXIgQ1YgcHJvZmlsZS4gQ2hhbmdlcyBoZXJlIHVwZGF0ZVxuICAgICAgPGNvZGU+TWFzdGVyX0NWX0RhdGEuanNvbjwvY29kZT4gZGlyZWN0bHkgYW5kIHBlcnNpc3QgYWNyb3NzIGFsbCBzZXNzaW9ucy5cbiAgICA8L3A+XG5cbiAgICAke3BoYXNlTG9ja0Jhbm5lcn1cblxuICAgIDwhLS0gR292ZXJuYW5jZSBiYW5uZXIgLS0+XG4gICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1nb3Zlcm5hbmNlLW5vdGVcIiBzdHlsZT1cImJhY2tncm91bmQ6I2ZmZmJlYjtib3JkZXI6MXB4IHNvbGlkICNmY2QzNGQ7Ym9yZGVyLXJhZGl1czo2cHg7cGFkZGluZzoxMHB4IDE0cHg7bWFyZ2luLWJvdHRvbToxNnB4O2ZvbnQtc2l6ZTowLjg4ZW07Y29sb3I6Izc4MzUwZjtcIj5cbiAgICAgIDxzdHJvbmc+XHUyNkEwXHVGRTBGIFBlcnNpc3RlbnQgc3RvcmFnZSBcdTIwMTQgdGhpcyB0YWIgb25seTo8L3N0cm9uZz4gRWRpdHMgbWFkZSBoZXJlICh0aGUgc3RydWN0dXJlZFxuICAgICAgZWRpdG9ycyBiZWxvdywgYW5kIFwiVXBkYXRlIHZpYSBBSVwiKSB3cml0ZSBkaXJlY3RseSB0byA8Y29kZT5NYXN0ZXJfQ1ZfRGF0YS5qc29uPC9jb2RlPlxuICAgICAgaW1tZWRpYXRlbHkgYW5kIHBlcnNpc3QgYWNyb3NzIGV2ZXJ5IGZ1dHVyZSBqb2IgYXBwbGljYXRpb24uXG4gICAgICBKb2Itc3BlY2lmaWMgY2hvaWNlcyB5b3UgbWFrZSBlbHNld2hlcmUgaW4gdGhlIGFwcCBcdTIwMTQgd2hpY2ggc2tpbGxzL2V4cGVyaWVuY2VzIHRvIGZlYXR1cmUsXG4gICAgICByZXdyaXR0ZW4gYnVsbGV0IHRleHQsIGNvdmVyLWxldHRlciB0b25lIFx1MjAxNCBsaXZlIG9ubHkgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbiBhbmQgYXJlXG4gICAgICA8ZW0+bmV2ZXI8L2VtPiB3cml0dGVuIGhlcmUgYXV0b21hdGljYWxseS4gVG8gY2FycnkgYSBzZXNzaW9uJ3MgaW1wcm92ZW1lbnRzIGludG8geW91clxuICAgICAgcGVybWFuZW50IHByb2ZpbGUsIHVzZSBcIlx1RDgzRFx1RENFNSBVcGRhdGUgTWFzdGVyIENWIERhdGFcIiBvbiB0aGUgRmluYWxpc2Ugc3RlcC5cbiAgICA8L2Rpdj5cblxuICAgICR7aXNFZGl0YWJsZSA/IHJlbmRlck1hc3RlckRhdGFBaVVwZGF0ZVBhbmVsKCkgOiByZW5kZXJNYXN0ZXJEYXRhQWlVcGRhdGVEaXNhYmxlZE5vdGUoKX1cblxuICAgICR7X3JlbmRlck1hc3RlckNoYW5nZU5vdGljZSgpfVxuXG4gICAgPCEtLSBQcm9maWxlIG92ZXJ2aWV3IGNhcmQgLS0+XG4gICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1wcm9maWxlLWNhcmRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItcHJvZmlsZS1uYW1lXCI+JHtlc2NhcGVIdG1sKG92ZXJ2aWV3Lm5hbWUgfHwgJ1lvdXIgUHJvZmlsZScpfTwvZGl2PlxuICAgICAgJHtvdmVydmlldy5oZWFkbGluZSA/IGA8ZGl2IGNsYXNzPVwibWFzdGVyLXByb2ZpbGUtaGVhZGxpbmVcIj4ke2VzY2FwZUh0bWwob3ZlcnZpZXcuaGVhZGxpbmUpfTwvZGl2PmAgOiAnJ31cbiAgICAgICR7b3ZlcnZpZXcuZW1haWwgICAgPyBgPGRpdiBjbGFzcz1cIm1hc3Rlci1wcm9maWxlLWVtYWlsXCI+XHUyNzA5XHVGRTBGICR7ZXNjYXBlSHRtbChvdmVydmlldy5lbWFpbCl9PC9kaXY+YCA6ICcnfVxuICAgICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1zdGF0c1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXN0YXRcIj48c3BhbiBjbGFzcz1cIm1hc3Rlci1zdGF0LXZhbHVlXCI+JHtvdmVydmlldy5leHBlcmllbmNlX2NvdW50ID8/ICdcdTIwMTQnfTwvc3Bhbj48c3BhbiBjbGFzcz1cIm1hc3Rlci1zdGF0LWxhYmVsXCI+RXhwZXJpZW5jZXM8L3NwYW4+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc3RhdFwiPjxzcGFuIGNsYXNzPVwibWFzdGVyLXN0YXQtdmFsdWVcIj4ke292ZXJ2aWV3LnNraWxsX2NvdW50ID8/ICdcdTIwMTQnfTwvc3Bhbj48c3BhbiBjbGFzcz1cIm1hc3Rlci1zdGF0LWxhYmVsXCI+U2tpbGxzPC9zcGFuPjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXN0YXRcIj48c3BhbiBjbGFzcz1cIm1hc3Rlci1zdGF0LXZhbHVlXCI+JHtvdmVydmlldy5hY2hpZXZlbWVudF9jb3VudCA/PyAnXHUyMDE0J308L3NwYW4+PHNwYW4gY2xhc3M9XCJtYXN0ZXItc3RhdC1sYWJlbFwiPkFjaGlldmVtZW50czwvc3Bhbj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1zdGF0XCI+PHNwYW4gY2xhc3M9XCJtYXN0ZXItc3RhdC12YWx1ZVwiPiR7b3ZlcnZpZXcuc3VtbWFyeV9jb3VudCA/PyAnXHUyMDE0J308L3NwYW4+PHNwYW4gY2xhc3M9XCJtYXN0ZXItc3RhdC1sYWJlbFwiPlN1bW1hcmllczwvc3Bhbj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1zdGF0XCI+PHNwYW4gY2xhc3M9XCJtYXN0ZXItc3RhdC12YWx1ZVwiPiR7b3ZlcnZpZXcuZWR1Y2F0aW9uX2NvdW50ID8/ICdcdTIwMTQnfTwvc3Bhbj48c3BhbiBjbGFzcz1cIm1hc3Rlci1zdGF0LWxhYmVsXCI+RWR1Y2F0aW9uPC9zcGFuPjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXN0YXRcIj48c3BhbiBjbGFzcz1cIm1hc3Rlci1zdGF0LXZhbHVlXCI+JHtvdmVydmlldy5wdWJsaWNhdGlvbl9jb3VudCA/PyAnXHUyMDE0J308L3NwYW4+PHNwYW4gY2xhc3M9XCJtYXN0ZXItc3RhdC1sYWJlbFwiPlB1YmxpY2F0aW9uczwvc3Bhbj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBQZXJzb25hbCBJbmZvIHNlY3Rpb24gLS0+XG4gICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1zZWN0aW9uXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXNlY3Rpb24taGVhZGVyXCI+XG4gICAgICAgIDxoMj5cdUQ4M0RcdURDNjQgUGVyc29uYWwgSW5mb3JtYXRpb248L2gyPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0blwiIG9uY2xpY2s9XCJzaG93RWRpdFBlcnNvbmFsSW5mb01vZGFsKClcIiBhcmlhLWxhYmVsPVwiRWRpdCBwZXJzb25hbCBpbmZvcm1hdGlvblwiPlxuICAgICAgICAgIFx1MjcwRlx1RkUwRiBFZGl0XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGlkPVwibWFzdGVyLXBlcnNvbmFsLWluZm8tY29udGFpbmVyXCI+XG4gICAgICAgICR7X3JlbmRlclBlcnNvbmFsSW5mb0NhcmQocGVyc29uYWxJbmZvKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBFeHBlcmllbmNlcyBzZWN0aW9uIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc2VjdGlvblwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1zZWN0aW9uLWhlYWRlclwiPlxuICAgICAgICA8aDI+XHVEODNEXHVEQ0JDIFdvcmsgRXhwZXJpZW5jZTwvaDI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgb25jbGljaz1cInNob3dBZGRFeHBlcmllbmNlTW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJBZGQgbmV3IHdvcmsgZXhwZXJpZW5jZVwiPlxuICAgICAgICAgICsgQWRkIEV4cGVyaWVuY2VcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgaWQ9XCJtYXN0ZXItZXhwZXJpZW5jZXMtY29udGFpbmVyXCI+XG4gICAgICAgICR7X3JlbmRlckV4cGVyaWVuY2VzTGlzdChleHBlcmllbmNlcyl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gU2tpbGxzIHNlY3Rpb24gLS0+XG4gICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1zZWN0aW9uXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXNlY3Rpb24taGVhZGVyXCI+XG4gICAgICAgIDxoMj5cdUQ4M0RcdURFRTBcdUZFMEYgU2tpbGxzPC9oMj5cbiAgICAgICAgJHtBcnJheS5pc0FycmF5KHNraWxscykgPyBgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwic2hvd0FkZFNraWxsTW9kYWwoJycsIHRydWUpXCIgYXJpYS1sYWJlbD1cIkFkZCBuZXcgc2tpbGxcIj4rIEFkZCBTa2lsbDwvYnV0dG9uPmAgOiAnJ31cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBpZD1cIm1hc3Rlci1za2lsbHMtY29udGFpbmVyXCI+XG4gICAgICAgICR7X3JlbmRlclNraWxsc1NlY3Rpb24oc2tpbGxzKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBFZHVjYXRpb24gc2VjdGlvbiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXNlY3Rpb25cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc2VjdGlvbi1oZWFkZXJcIj5cbiAgICAgICAgPGgyPlx1RDgzQ1x1REY5MyBFZHVjYXRpb248L2gyPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0blwiIG9uY2xpY2s9XCJzaG93QWRkRWR1Y2F0aW9uTW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJBZGQgZWR1Y2F0aW9uIGVudHJ5XCI+XG4gICAgICAgICAgKyBBZGQgRWR1Y2F0aW9uXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGlkPVwibWFzdGVyLWVkdWNhdGlvbi1jb250YWluZXJcIj5cbiAgICAgICAgJHtfcmVuZGVyRWR1Y2F0aW9uTGlzdChlZHVjYXRpb24pfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFB1YmxpY2F0aW9ucyBzZWN0aW9uIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc2VjdGlvblwiIGlkPVwibWFzdGVyLXB1YmxpY2F0aW9ucy1zZWN0aW9uXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXNlY3Rpb24taGVhZGVyXCI+XG4gICAgICAgIDxoMj5cdUQ4M0RcdURDRDYgUHVibGljYXRpb25zPC9oMj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDtcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBzZWNvbmRhcnlcIiBpZD1cIm1hc3Rlci1wdWItaW1wb3J0LWJ0blwiXG4gICAgICAgICAgICAgIG9uY2xpY2s9XCJzaG93SW1wb3J0UHVibGljYXRpb25zTW9kYWwoKVwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJJbXBvcnQgQmliVGVYIHB1YmxpY2F0aW9uc1wiPlxuICAgICAgICAgICAgXHUyQjA2XHVGRTBGIEltcG9ydCBCaWJUZVhcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBzZWNvbmRhcnlcIiBpZD1cIm1hc3Rlci1wdWItY29udmVydC1idG5cIlxuICAgICAgICAgICAgICBvbmNsaWNrPVwic2hvd0NvbnZlcnRQdWJsaWNhdGlvbnNNb2RhbCgpXCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkNvbnZlcnQgY2l0YXRpb24gdGV4dCB0byBCaWJUZVhcIj5cbiAgICAgICAgICAgIFx1RDgzRVx1REU4NCBDb252ZXJ0IFRleHRcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBzZWNvbmRhcnlcIiBpZD1cIm1hc3Rlci1wdWItdG9nZ2xlLWJ0blwiXG4gICAgICAgICAgICAgIG9uY2xpY2s9XCJ0b2dnbGVQdWJsaWNhdGlvbnNWaWV3KClcIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiVG9nZ2xlIGJldHdlZW4gc3RydWN0dXJlZCBDUlVEIHZpZXcgYW5kIHJhdyBCaWJUZVggZWRpdG9yXCI+XG4gICAgICAgICAgICBcdTI3MEZcdUZFMEYgUmF3IEJpYlRlWFxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgaWQ9XCJtYXN0ZXItcHViLWFkZC1idG5cIlxuICAgICAgICAgICAgICBvbmNsaWNrPVwic2hvd0FkZFB1YmxpY2F0aW9uTW9kYWwoKVwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJBZGQgcHVibGljYXRpb25cIj5cbiAgICAgICAgICAgICsgQWRkIFB1YmxpY2F0aW9uXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8IS0tIENSVUQgc3RydWN0dXJlZCB2aWV3IChkZWZhdWx0KSAtLT5cbiAgICAgIDxkaXYgaWQ9XCJtYXN0ZXItcHViLWNydWQtdmlld1wiPlxuICAgICAgICA8ZGl2IGlkPVwibWFzdGVyLXB1Yi1jcnVkLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtwYWRkaW5nOjEycHggMDtcIj5Mb2FkaW5nIHB1YmxpY2F0aW9uc1x1MjAyNjwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDwhLS0gUmF3IEJpYlRlWCBlZGl0b3IgKGhpZGRlbiBieSBkZWZhdWx0KSAtLT5cbiAgICAgIDxkaXYgaWQ9XCJtYXN0ZXItcHViLXJhdy12aWV3XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+XG4gICAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtmb250LXNpemU6MC45ZW07bWFyZ2luLWJvdHRvbToxMHB4O1wiPlxuICAgICAgICAgIEVkaXQgeW91ciBCaWJUZVggYmlibGlvZ3JhcGh5IGZpbGUgZGlyZWN0bHkuIENoYW5nZXMgYXJlIHNhdmVkIHRvXG4gICAgICAgICAgPGNvZGU+cHVibGljYXRpb25zLmJpYjwvY29kZT4gYW5kIGEgdGltZXN0YW1wZWQgYmFja3VwIGlzIGNyZWF0ZWRcbiAgICAgICAgICBhdXRvbWF0aWNhbGx5LiBDb250ZW50IGlzIHZhbGlkYXRlZCBiZWZvcmUgd3JpdGluZy5cbiAgICAgICAgPC9wPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6OHB4O21hcmdpbi1ib3R0b206OHB4O1wiPlxuICAgICAgICAgIDxzcGFuIGlkPVwibWFzdGVyLXB1Yi1jb3VudFwiIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtmb250LXNpemU6MC45ZW07XCI+PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZmxleDoxO1wiPjwvc3Bhbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBzZWNvbmRhcnlcIiBvbmNsaWNrPVwidmFsaWRhdGVQdWJsaWNhdGlvbnNCaWIoKVwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJWYWxpZGF0ZSBCaWJUZVggd2l0aG91dCBzYXZpbmdcIj5cdUQ4M0RcdUREMEQgVmFsaWRhdGU8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBzZWNvbmRhcnlcIiBvbmNsaWNrPVwibG9hZFB1YmxpY2F0aW9uc0JpYigpXCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlJlbG9hZCBwdWJsaWNhdGlvbnMuYmliIGZyb20gZGlza1wiPlx1RDgzRFx1REQwNCBSZWxvYWQ8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBwcmltYXJ5XCIgaWQ9XCJtYXN0ZXItcHViLXNhdmUtYnRuXCJcbiAgICAgICAgICAgICAgb25jbGljaz1cInNhdmVQdWJsaWNhdGlvbnNCaWIoKVwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJTYXZlIEJpYlRlWCB0byBkaXNrXCI+XHVEODNEXHVEQ0JFIFNhdmU8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDx0ZXh0YXJlYSBpZD1cIm1hc3Rlci1wdWItdGV4dGFyZWFcIlxuICAgICAgICAgIGNsYXNzPVwiZWRpdC1pbnB1dFwiXG4gICAgICAgICAgcm93cz1cIjIwXCJcbiAgICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Zm9udC1mYW1pbHk6bW9ub3NwYWNlO2ZvbnQtc2l6ZTowLjg1ZW07cmVzaXplOnZlcnRpY2FsO1wiXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJMb2FkaW5nXHUyMDI2XCJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiQmliVGVYIGJpYmxpb2dyYXBoeSBjb250ZW50XCJcbiAgICAgICAgICBzcGVsbGNoZWNrPVwiZmFsc2VcIlxuICAgICAgICA+PC90ZXh0YXJlYT5cbiAgICAgICAgPGRpdiBpZD1cIm1hc3Rlci1wdWItc3RhdHVzXCJcbiAgICAgICAgICAgIHN0eWxlPVwibWFyZ2luLXRvcDo2cHg7Zm9udC1zaXplOjAuODVlbTtjb2xvcjojNmI3MjgwO1wiXG4gICAgICAgICAgICBhcmlhLWxpdmU9XCJwb2xpdGVcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBBd2FyZHMgc2VjdGlvbiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXNlY3Rpb25cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc2VjdGlvbi1oZWFkZXJcIj5cbiAgICAgICAgPGgyPlx1RDgzQ1x1REZDNSBBd2FyZHMgJmFtcDsgSG9ub3VyczwvaDI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgb25jbGljaz1cInNob3dBZGRBd2FyZE1vZGFsKClcIiBhcmlhLWxhYmVsPVwiQWRkIGF3YXJkXCI+XG4gICAgICAgICAgKyBBZGQgQXdhcmRcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgaWQ9XCJtYXN0ZXItYXdhcmRzLWNvbnRhaW5lclwiPlxuICAgICAgICAke19yZW5kZXJBd2FyZHNMaXN0KGF3YXJkcyl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gQ2VydGlmaWNhdGlvbnMgc2VjdGlvbiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXNlY3Rpb25cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc2VjdGlvbi1oZWFkZXJcIj5cbiAgICAgICAgPGgyPlx1RDgzQ1x1REY5MyBDZXJ0aWZpY2F0aW9uczwvaDI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgb25jbGljaz1cInNob3dBZGRDZXJ0aWZpY2F0aW9uTW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJBZGQgY2VydGlmaWNhdGlvblwiPlxuICAgICAgICAgICsgQWRkIENlcnRpZmljYXRpb25cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgaWQ9XCJtYXN0ZXItY2VydGlmaWNhdGlvbnMtY29udGFpbmVyXCI+XG4gICAgICAgICR7X3JlbmRlckNlcnRpZmljYXRpb25zTGlzdChjZXJ0aWZpY2F0aW9ucyl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gU2VsZWN0ZWQgQWNoaWV2ZW1lbnRzIHNlY3Rpb24gLS0+XG4gICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1zZWN0aW9uXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXNlY3Rpb24taGVhZGVyXCI+XG4gICAgICAgIDxoMj5cdUQ4M0NcdURGQzYgU2VsZWN0ZWQgQWNoaWV2ZW1lbnRzPC9oMj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwic2hvd0FkZEFjaGlldmVtZW50TW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJBZGQgbmV3IGFjaGlldmVtZW50IHRvIG1hc3RlciBDVlwiPlxuICAgICAgICAgICsgQWRkIEFjaGlldmVtZW50XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7Zm9udC1zaXplOjAuOWVtO21hcmdpbi1ib3R0b206MTJweDtcIj5cbiAgICAgICAgVGhlc2UgYXJlIGNyb3NzLXJvbGUgaGlnaGxpZ2h0cyBzaG93biBpbiB0aGUgQWNoaWV2ZW1lbnRzIHJldmlldyBkdXJpbmcgY3VzdG9taXNhdGlvbi5cbiAgICAgICAgVGhlIEhhcnZlc3QgZmVhdHVyZSAoSGFydmVzdCB0YWIpIGNhbiBhZGQgbmV3IG9uZXMgZnJvbSB5b3VyIGN1cnJlbnQgc2Vzc2lvbi5cbiAgICAgIDwvcD5cbiAgICAgIDxkaXYgaWQ9XCJtYXN0ZXItYWNoaWV2ZW1lbnRzLWNvbnRhaW5lclwiPlxuICAgICAgICAke19yZW5kZXJNYXN0ZXJBY2hpZXZlbWVudHNUYWJsZShhY2hpZXZlbWVudHMpfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFByb2Zlc3Npb25hbCBTdW1tYXJpZXMgc2VjdGlvbiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXNlY3Rpb25cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc2VjdGlvbi1oZWFkZXJcIj5cbiAgICAgICAgPGgyPlx1RDgzRFx1RENERCBQcm9mZXNzaW9uYWwgU3VtbWFyaWVzPC9oMj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwic2hvd0FkZFN1bW1hcnlNb2RhbCgpXCIgYXJpYS1sYWJlbD1cIkFkZCBuZXcgcHJvZmVzc2lvbmFsIHN1bW1hcnkgdmFyaWFudFwiPlxuICAgICAgICAgICsgQWRkIFN1bW1hcnlcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtmb250LXNpemU6MC45ZW07bWFyZ2luLWJvdHRvbToxMnB4O1wiPlxuICAgICAgICBOYW1lZCBzdW1tYXJ5IHZhcmlhbnRzIGxldCB5b3UgdGFpbG9yIHlvdXIgcHJvZmVzc2lvbmFsIHN0YXRlbWVudCBmb3IgZGlmZmVyZW50IHJvbGUgdHlwZXNcbiAgICAgICAgd2l0aG91dCByZWdlbmVyYXRpbmcgZnJvbSBzY3JhdGNoLiBUaGUgQUkgd2lsbCByZWNvbW1lbmQgdGhlIG1vc3QgcmVsZXZhbnQgdmFyaWFudFxuICAgICAgICBkdXJpbmcgdGhlIFN1bW1hcnkgRm9jdXMgc3RlcC5cbiAgICAgIDwvcD5cbiAgICAgIDxkaXYgaWQ9XCJtYXN0ZXItc3VtbWFyaWVzLWNvbnRhaW5lclwiPlxuICAgICAgICAke19yZW5kZXJTdW1tYXJpZXNMaXN0KHN1bW1hcmllcyl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gUHVibGljYXRpb24gYWRkL2VkaXQgbW9kYWwgLS0+XG4gICAgPGRpdiBpZD1cIm1hc3Rlci1wdWItbW9kYWwtb3ZlcmxheVwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLW1vZGFsPVwidHJ1ZVwiXG4gICAgICAgIGFyaWEtbGFiZWxsZWRieT1cIm1hc3Rlci1wdWItbW9kYWwtdGl0bGVcIiBjbGFzcz1cIm1vZGFsLW92ZXJsYXlcIlxuICAgICAgICBvbmNsaWNrPVwiaWYoZXZlbnQudGFyZ2V0PT09dGhpcyljbG9zZVB1YmxpY2F0aW9uTW9kYWwoKVwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsXCIgc3R5bGU9XCJtYXgtd2lkdGg6NTgwcHg7XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cbiAgICAgICAgICA8aDIgaWQ9XCJtYXN0ZXItcHViLW1vZGFsLXRpdGxlLWhlYWRpbmdcIiBpZD1cInB1Yi1tb2RhbC10aXRsZS1oZWFkaW5nXCI+QWRkIFB1YmxpY2F0aW9uPC9oMj5cbiAgICAgICAgICA8YnV0dG9uIG9uY2xpY2s9XCJjbG9zZVB1YmxpY2F0aW9uTW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJDbG9zZSBwdWJsaWNhdGlvbiBlZGl0b3JcIlxuICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6bm9uZTtib3JkZXI6bm9uZTtmb250LXNpemU6MS40ZW07Y3Vyc29yOnBvaW50ZXI7Y29sb3I6IzY0NzQ4YjtcIj4mdGltZXM7PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiIHN0eWxlPVwicGFkZGluZzoyMHB4O1wiPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjEycHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwicHViLW1vZGFsLWtleVwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+Q2l0ZSBLZXkgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+Kjwvc3Bhbj48L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJwdWItbW9kYWwta2V5XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiIGFyaWEtcmVxdWlyZWQ9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gc21pdGgyMDI0bWxcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjEycHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwicHViLW1vZGFsLXR5cGVcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkVudHJ5IFR5cGUgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+Kjwvc3Bhbj48L2xhYmVsPlxuICAgICAgICAgICAgPHNlbGVjdCBpZD1cInB1Yi1tb2RhbC10eXBlXCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiYXJ0aWNsZVwiPmFydGljbGU8L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImlucHJvY2VlZGluZ3NcIj5pbnByb2NlZWRpbmdzPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJib29rXCI+Ym9vazwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiaW5jb2xsZWN0aW9uXCI+aW5jb2xsZWN0aW9uPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ0ZWNocmVwb3J0XCI+dGVjaHJlcG9ydDwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicGhkdGhlc2lzXCI+cGhkdGhlc2lzPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJtYXN0ZXJzdGhlc2lzXCI+bWFzdGVyc3RoZXNpczwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwibWlzY1wiPm1pc2M8L29wdGlvbj5cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjEycHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgaWQ9XCJwdWItbW9kYWwtYXV0aG9yLWxhYmVsXCIgZm9yPVwicHViLW1vZGFsLWF1dGhvclwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+QXV0aG9yKHMpIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPio8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwicHViLW1vZGFsLWF1dGhvclwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiTGFzdCwgRmlyc3QgYW5kIExhc3QyLCBGaXJzdDJcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjEycHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwicHViLW1vZGFsLXRpdGxlXCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5UaXRsZSA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4qPC9zcGFuPjwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInB1Yi1tb2RhbC10aXRsZVwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIiBhcmlhLXJlcXVpcmVkPVwidHJ1ZVwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6MTJweDttYXJnaW4tYm90dG9tOjEycHg7XCI+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDowIDAgMTAwcHg7XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwdWItbW9kYWwteWVhclwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+WWVhciA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4qPC9zcGFuPjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJwdWItbW9kYWwteWVhclwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwcHg7XCJcbiAgICAgICAgICAgICAgICAgIG1pbj1cIjE5MDBcIiBtYXg9XCIyMTAwXCIgYXJpYS1yZXF1aXJlZD1cInRydWVcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDoxO1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicHViLW1vZGFsLWpvdXJuYWxcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkpvdXJuYWwgLyBCb29rdGl0bGU8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInB1Yi1tb2RhbC1qb3VybmFsXCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxMnB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cInB1Yi1tb2RhbC1kb2lcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkRPSSAvIFVSTDwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInB1Yi1tb2RhbC1kb2lcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIjEwLnh4eHgveHh4eHhcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjRweDtcIj5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwdWItbW9kYWwtZXh0cmFcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkV4dHJhIGZpZWxkcyA8c3BhbiBzdHlsZT1cImZvbnQtd2VpZ2h0OjQwMDtjb2xvcjojNmI3MjgwO1wiPihrZXk9dmFsdWUsIG9uZSBwZXIgbGluZSk8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD1cInB1Yi1tb2RhbC1leHRyYVwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHJvd3M9XCIzXCIgc3R5bGU9XCJ3aWR0aDoxMDAlO3Jlc2l6ZTp2ZXJ0aWNhbDtmb250LWZhbWlseTptb25vc3BhY2U7Zm9udC1zaXplOjAuODVlbTtcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwidm9sdW1lPTEyJiMxMDtwYWdlcz0xLS0yMFwiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCIgc3R5bGU9XCJkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kO2dhcDo4cHg7cGFkZGluZzoxNnB4IDIwcHg7XCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwiY2xvc2VQdWJsaWNhdGlvbk1vZGFsKClcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBwcmltYXJ5XCIgb25jbGljaz1cInNhdmVNYXN0ZXJQdWJsaWNhdGlvbigpXCI+U2F2ZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBpZD1cIm1hc3Rlci1wdWItaW1wb3J0LW1vZGFsLW92ZXJsYXlcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1tb2RhbD1cInRydWVcIlxuICAgICAgICBhcmlhLWxhYmVsbGVkYnk9XCJtYXN0ZXItcHViLWltcG9ydC1tb2RhbC10aXRsZVwiIGNsYXNzPVwibW9kYWwtb3ZlcmxheVwiXG4gICAgICAgIG9uY2xpY2s9XCJpZihldmVudC50YXJnZXQ9PT10aGlzKWNsb3NlSW1wb3J0UHVibGljYXRpb25zTW9kYWwoKVwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsXCIgc3R5bGU9XCJtYXgtd2lkdGg6NjgwcHg7XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cbiAgICAgICAgICA8aDIgaWQ9XCJtYXN0ZXItcHViLWltcG9ydC1tb2RhbC10aXRsZVwiPkltcG9ydCBCaWJUZVggUHVibGljYXRpb25zPC9oMj5cbiAgICAgICAgICA8YnV0dG9uIG9uY2xpY2s9XCJjbG9zZUltcG9ydFB1YmxpY2F0aW9uc01vZGFsKClcIiBhcmlhLWxhYmVsPVwiQ2xvc2UgQmliVGVYIGltcG9ydCBkaWFsb2dcIlxuICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6bm9uZTtib3JkZXI6bm9uZTtmb250LXNpemU6MS40ZW07Y3Vyc29yOnBvaW50ZXI7Y29sb3I6IzY0NzQ4YjtcIj4mdGltZXM7PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiIHN0eWxlPVwicGFkZGluZzoyMHB4O1wiPlxuICAgICAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtmb250LXNpemU6MC45ZW07bWFyZ2luOjAgMCAxMnB4O1wiPlxuICAgICAgICAgICAgUGFzdGUgb25lIG9yIG1vcmUgQmliVGVYIGVudHJpZXMgdG8gbWVyZ2UgdGhlbSBpbnRvIDxjb2RlPnB1YmxpY2F0aW9ucy5iaWI8L2NvZGU+LlxuICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8dGV4dGFyZWEgaWQ9XCJtYXN0ZXItcHViLWltcG9ydC10ZXh0YXJlYVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZWRpdC1pbnB1dFwiXG4gICAgICAgICAgICAgIHJvd3M9XCIxMlwiXG4gICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTtmb250LWZhbWlseTptb25vc3BhY2U7Zm9udC1zaXplOjAuODVlbTtyZXNpemU6dmVydGljYWw7XCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJAYXJ0aWNsZXtzbWl0aDIwMjUsLi4ufVwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJCaWJUZVggaW1wb3J0IGNvbnRlbnRcIlxuICAgICAgICAgICAgICBzcGVsbGNoZWNrPVwiZmFsc2VcIj48L3RleHRhcmVhPlxuICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDttYXJnaW4tdG9wOjEycHg7Y29sb3I6IzMzNDE1NTtcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cIm1hc3Rlci1wdWItaW1wb3J0LW92ZXJ3cml0ZVwiIC8+XG4gICAgICAgICAgICBPdmVyd3JpdGUgZXhpc3RpbmcgZW50cmllcyB3aGVuIGNpdGUga2V5cyBhbHJlYWR5IGV4aXN0XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8ZGl2IGlkPVwibWFzdGVyLXB1Yi1pbXBvcnQtc3RhdHVzXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJtYXJnaW4tdG9wOjEwcHg7Zm9udC1zaXplOjAuODVlbTtjb2xvcjojNmI3MjgwO1wiXG4gICAgICAgICAgICAgIGFyaWEtbGl2ZT1cInBvbGl0ZVwiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiIHN0eWxlPVwiZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpmbGV4LWVuZDtnYXA6OHB4O3BhZGRpbmc6MTZweCAyMHB4O1wiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgb25jbGljaz1cImNsb3NlSW1wb3J0UHVibGljYXRpb25zTW9kYWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHByaW1hcnlcIiBpZD1cIm1hc3Rlci1wdWItaW1wb3J0LXN1Ym1pdC1idG5cIlxuICAgICAgICAgICAgICBvbmNsaWNrPVwiaW1wb3J0UHVibGljYXRpb25zQmliKClcIj5JbXBvcnQ8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgaWQ9XCJtYXN0ZXItcHViLWNvbnZlcnQtbW9kYWwtb3ZlcmxheVwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLW1vZGFsPVwidHJ1ZVwiXG4gICAgICAgIGFyaWEtbGFiZWxsZWRieT1cIm1hc3Rlci1wdWItY29udmVydC1tb2RhbC10aXRsZVwiIGNsYXNzPVwibW9kYWwtb3ZlcmxheVwiXG4gICAgICAgIG9uY2xpY2s9XCJpZihldmVudC50YXJnZXQ9PT10aGlzKWNsb3NlQ29udmVydFB1YmxpY2F0aW9uc01vZGFsKClcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbFwiIHN0eWxlPVwibWF4LXdpZHRoOjc2MHB4O1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XG4gICAgICAgICAgPGgyIGlkPVwibWFzdGVyLXB1Yi1jb252ZXJ0LW1vZGFsLXRpdGxlXCI+Q29udmVydCBDaXRhdGlvbiBUZXh0IHRvIEJpYlRlWDwvaDI+XG4gICAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPVwiY2xvc2VDb252ZXJ0UHVibGljYXRpb25zTW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJDbG9zZSBjaXRhdGlvbiBjb252ZXJzaW9uIGRpYWxvZ1wiXG4gICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDpub25lO2JvcmRlcjpub25lO2ZvbnQtc2l6ZToxLjRlbTtjdXJzb3I6cG9pbnRlcjtjb2xvcjojNjQ3NDhiO1wiPiZ0aW1lczs8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCIgc3R5bGU9XCJwYWRkaW5nOjIwcHg7XCI+XG4gICAgICAgICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO2ZvbnQtc2l6ZTowLjllbTttYXJnaW46MCAwIDEycHg7XCI+XG4gICAgICAgICAgICBQYXN0ZSBmcmVlLWZvcm0gY2l0YXRpb24gdGV4dCwgcmV2aWV3IHRoZSBnZW5lcmF0ZWQgQmliVGVYLCB0aGVuIGltcG9ydCBpdCB3aGVuIGl0IGxvb2tzIGNvcnJlY3QuXG4gICAgICAgICAgPC9wPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmdyaWQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmcjtnYXA6MTRweDtcIj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJtYXN0ZXItcHViLWNvbnZlcnQtaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkNpdGF0aW9uIFRleHQ8L2xhYmVsPlxuICAgICAgICAgICAgICA8dGV4dGFyZWEgaWQ9XCJtYXN0ZXItcHViLWNvbnZlcnQtaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJlZGl0LWlucHV0XCJcbiAgICAgICAgICAgICAgICAgIHJvd3M9XCI3XCJcbiAgICAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTtyZXNpemU6dmVydGljYWw7XCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRG9lLCBKLiAoMjAyNSkuIEFydGljbGUgdGl0bGUuIEpvdXJuYWwgTmFtZSwgMTIoMyksIDEtMTAuXCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJDaXRhdGlvbiB0ZXh0IHRvIGNvbnZlcnRcIj48L3RleHRhcmVhPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwibWFzdGVyLXB1Yi1jb252ZXJ0LW91dHB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+R2VuZXJhdGVkIEJpYlRlWCBQcmV2aWV3PC9sYWJlbD5cbiAgICAgICAgICAgICAgPHRleHRhcmVhIGlkPVwibWFzdGVyLXB1Yi1jb252ZXJ0LW91dHB1dFwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImVkaXQtaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgcm93cz1cIjEwXCJcbiAgICAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTtmb250LWZhbWlseTptb25vc3BhY2U7Zm9udC1zaXplOjAuODVlbTtyZXNpemU6dmVydGljYWw7XCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQ29udmVydGVkIEJpYlRlWCB3aWxsIGFwcGVhciBoZXJlXCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJHZW5lcmF0ZWQgQmliVGVYIHByZXZpZXdcIlxuICAgICAgICAgICAgICAgICAgc3BlbGxjaGVjaz1cImZhbHNlXCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDttYXJnaW4tdG9wOjEycHg7Y29sb3I6IzMzNDE1NTtcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cIm1hc3Rlci1wdWItY29udmVydC1vdmVyd3JpdGVcIiAvPlxuICAgICAgICAgICAgT3ZlcndyaXRlIGV4aXN0aW5nIGVudHJpZXMgd2hlbiBpbXBvcnRpbmcgdGhlIGdlbmVyYXRlZCBCaWJUZVhcbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxkaXYgaWQ9XCJtYXN0ZXItcHViLWNvbnZlcnQtc3RhdHVzXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJtYXJnaW4tdG9wOjEwcHg7Zm9udC1zaXplOjAuODVlbTtjb2xvcjojNmI3MjgwO1wiXG4gICAgICAgICAgICAgIGFyaWEtbGl2ZT1cInBvbGl0ZVwiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiIHN0eWxlPVwiZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpmbGV4LWVuZDtnYXA6OHB4O3BhZGRpbmc6MTZweCAyMHB4O1wiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgb25jbGljaz1cImNsb3NlQ29udmVydFB1YmxpY2F0aW9uc01vZGFsKClcIj5DbG9zZTwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHNlY29uZGFyeVwiIGlkPVwibWFzdGVyLXB1Yi1jb252ZXJ0LXN1Ym1pdC1idG5cIlxuICAgICAgICAgICAgICBvbmNsaWNrPVwiY29udmVydFB1YmxpY2F0aW9uVGV4dCgpXCI+R2VuZXJhdGUgQmliVGVYPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG4gcHJpbWFyeVwiIGlkPVwibWFzdGVyLXB1Yi1jb252ZXJ0LWltcG9ydC1idG5cIlxuICAgICAgICAgICAgICBvbmNsaWNrPVwiaW1wb3J0Q29udmVydGVkUHVibGljYXRpb25UZXh0KClcIj5JbXBvcnQgUHJldmlldzwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBQZXJzb25hbCBJbmZvIG1vZGFsIC0tPlxuICAgIDxkaXYgaWQ9XCJtYXN0ZXItcGktbW9kYWwtb3ZlcmxheVwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLW1vZGFsPVwidHJ1ZVwiXG4gICAgICAgIGFyaWEtbGFiZWxsZWRieT1cIm1hc3Rlci1waS1tb2RhbC10aXRsZVwiIGNsYXNzPVwibW9kYWwtb3ZlcmxheVwiXG4gICAgICAgIG9uY2xpY2s9XCJpZihldmVudC50YXJnZXQ9PT10aGlzKWNsb3NlUGVyc29uYWxJbmZvTW9kYWwoKVwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsXCIgc3R5bGU9XCJtYXgtd2lkdGg6NjIwcHg7XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cbiAgICAgICAgICA8aDIgaWQ9XCJtYXN0ZXItcGktbW9kYWwtdGl0bGVcIj5FZGl0IFBlcnNvbmFsIEluZm9ybWF0aW9uPC9oMj5cbiAgICAgICAgICA8YnV0dG9uIG9uY2xpY2s9XCJjbG9zZVBlcnNvbmFsSW5mb01vZGFsKClcIiBhcmlhLWxhYmVsPVwiQ2xvc2UgcGVyc29uYWwgaW5mbyBlZGl0b3JcIlxuICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6bm9uZTtib3JkZXI6bm9uZTtmb250LXNpemU6MS40ZW07Y3Vyc29yOnBvaW50ZXI7Y29sb3I6IzY0NzQ4YjtcIj4mdGltZXM7PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiIHN0eWxlPVwicGFkZGluZzoyMHB4O1wiPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmdyaWQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmciAxZnI7Z2FwOjE0cHg7XCI+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZ3JpZC1jb2x1bW46MS8tMTtcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBpLW5hbWUtaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkZ1bGwgTmFtZTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwicGktbmFtZS1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIiBwbGFjZWhvbGRlcj1cImUuZy4gSmFuZSBTbWl0aCwgUGguRC5cIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZ3JpZC1jb2x1bW46MS8tMTtcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBpLXRpdGxlLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5Qcm9mZXNzaW9uYWwgVGl0bGUgLyBIZWFkbGluZTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwicGktdGl0bGUtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgcGxhY2Vob2xkZXI9XCJlLmcuIFNlbmlvciBEYXRhIFNjaWVudGlzdFwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwaS1lbWFpbC1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+RW1haWw8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImVtYWlsXCIgaWQ9XCJwaS1lbWFpbC1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIiBwbGFjZWhvbGRlcj1cInlvdUBleGFtcGxlLmNvbVwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwaS1waG9uZS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+UGhvbmU8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRlbFwiIGlkPVwicGktcGhvbmUtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgcGxhY2Vob2xkZXI9XCI1NTUtMTIzLTQ1NjdcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicGktbGlua2VkaW4taW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkxpbmtlZEluIFVSTDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidXJsXCIgaWQ9XCJwaS1saW5rZWRpbi1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIiBwbGFjZWhvbGRlcj1cImh0dHBzOi8vbGlua2VkaW4uY29tL2luL3lvdVwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwaS13ZWJzaXRlLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5XZWJzaXRlPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ1cmxcIiBpZD1cInBpLXdlYnNpdGUtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgcGxhY2Vob2xkZXI9XCJodHRwczovL3lvdXJzaXRlLmNvbVwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwaS1jaXR5LWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5DaXR5PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJwaS1jaXR5LWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiIHBsYWNlaG9sZGVyPVwiUm9jaGVzdGVyXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBpLXN0YXRlLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5TdGF0ZSAvIFJlZ2lvbjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwicGktc3RhdGUtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgcGxhY2Vob2xkZXI9XCJOWVwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0blwiIG9uY2xpY2s9XCJjbG9zZVBlcnNvbmFsSW5mb01vZGFsKClcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBwcmltYXJ5XCIgb25jbGljaz1cInNhdmVQZXJzb25hbEluZm8oKVwiPlNhdmU8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gRXhwZXJpZW5jZSBtb2RhbCAtLT5cbiAgICA8ZGl2IGlkPVwibWFzdGVyLWV4cC1tb2RhbC1vdmVybGF5XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCIgcm9sZT1cImRpYWxvZ1wiIGFyaWEtbW9kYWw9XCJ0cnVlXCJcbiAgICAgICAgYXJpYS1sYWJlbGxlZGJ5PVwibWFzdGVyLWV4cC1tb2RhbC10aXRsZVwiIGNsYXNzPVwibW9kYWwtb3ZlcmxheVwiXG4gICAgICAgIG9uY2xpY2s9XCJpZihldmVudC50YXJnZXQ9PT10aGlzKWNsb3NlRXhwZXJpZW5jZU1vZGFsKClcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbFwiIHN0eWxlPVwibWF4LXdpZHRoOjY0MHB4O1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XG4gICAgICAgICAgPGgyIGlkPVwibWFzdGVyLWV4cC1tb2RhbC10aXRsZVwiPldvcmsgRXhwZXJpZW5jZTwvaDI+XG4gICAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPVwiY2xvc2VFeHBlcmllbmNlTW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJDbG9zZSBleHBlcmllbmNlIGVkaXRvclwiXG4gICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDpub25lO2JvcmRlcjpub25lO2ZvbnQtc2l6ZToxLjRlbTtjdXJzb3I6cG9pbnRlcjtjb2xvcjojNjQ3NDhiO1wiPiZ0aW1lczs8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCIgc3R5bGU9XCJwYWRkaW5nOjIwcHg7XCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBpZD1cImV4cC1tb2RhbC1pZFwiIC8+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6MWZyIDFmcjtnYXA6MTRweDtcIj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJncmlkLWNvbHVtbjoxLy0xO1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZXhwLXRpdGxlLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5Kb2IgVGl0bGUgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+Kjwvc3Bhbj48L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImV4cC10aXRsZS1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIiBhcmlhLXJlcXVpcmVkPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gU2VuaW9yIERhdGEgU2NpZW50aXN0XCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImdyaWQtY29sdW1uOjEvLTE7XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJleHAtY29tcGFueS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+Q29tcGFueSA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4qPC9zcGFuPjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZXhwLWNvbXBhbnktaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgYXJpYS1yZXF1aXJlZD1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIEFjbWUgQ29ycFwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJleHAtY2l0eS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+Q2l0eTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZXhwLWNpdHktaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgcGxhY2Vob2xkZXI9XCJCb3N0b25cIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZXhwLXN0YXRlLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5TdGF0ZSAvIFJlZ2lvbjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZXhwLXN0YXRlLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiIHBsYWNlaG9sZGVyPVwiTUFcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZXhwLXN0YXJ0LWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5TdGFydCBEYXRlPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJleHAtc3RhcnQtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgcGxhY2Vob2xkZXI9XCIyMDIwLTAxXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImV4cC1lbmQtaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkVuZCBEYXRlIChibGFuayA9IHByZXNlbnQpPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJleHAtZW5kLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiIHBsYWNlaG9sZGVyPVwiMjAyNC0wNiBvciBsZWF2ZSBibGFua1wiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJleHAtdHlwZS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+RW1wbG95bWVudCBUeXBlPC9sYWJlbD5cbiAgICAgICAgICAgICAgPHNlbGVjdCBpZD1cImV4cC10eXBlLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiPlxuICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJmdWxsX3RpbWVcIj5GdWxsLXRpbWU8L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicGFydF90aW1lXCI+UGFydC10aW1lPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImNvbnRyYWN0XCI+Q29udHJhY3Q8L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiY29uc3VsdGluZ1wiPkNvbnN1bHRpbmc8L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiaW50ZXJuc2hpcFwiPkludGVybnNoaXA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwic2VsZl9lbXBsb3llZFwiPlNlbGYtZW1wbG95ZWQ8L29wdGlvbj5cbiAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJleHAtaW1wb3J0YW5jZS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+SW1wb3J0YW5jZSAoMVx1MjAxMzEwKTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJleHAtaW1wb3J0YW5jZS1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6ODBweDtcIlxuICAgICAgICAgICAgICAgICAgbWluPVwiMVwiIG1heD1cIjEwXCIgdmFsdWU9XCI1XCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImdyaWQtY29sdW1uOjEvLTE7XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJleHAtdGFncy1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+VGFncyAoY29tbWEtc2VwYXJhdGVkKTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZXhwLXRhZ3MtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBtbCwgbGVhZGVyc2hpcCwgcHl0aG9uXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImdyaWQtY29sdW1uOjEvLTE7Ym9yZGVyLXRvcDoxcHggc29saWQgdmFyKC0tY3YtYm9yZGVyKTtwYWRkaW5nLXRvcDoxNHB4O21hcmdpbi10b3A6NHB4O1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjZweDtcIj5BY2hpZXZlbWVudHM8L2xhYmVsPlxuICAgICAgICAgICAgICA8ZGl2IGlkPVwiZXhwLWFjaGlldmVtZW50cy1lZGl0b3ItbGlzdFwiPjwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDo2cHg7bWFyZ2luLXRvcDo2cHg7XCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJleHAtYWNoLW5ldy1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwiZmxleDoxO1wiXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQWRkIGFuIGFjaGlldmVtZW50IG9yIGJ1bGxldFx1MjAyNlwiXG4gICAgICAgICAgICAgICAgICAgIG9ua2V5ZG93bj1cImlmKGV2ZW50LmtleT09PSdFbnRlcicpe2V2ZW50LnByZXZlbnREZWZhdWx0KCk7X2FkZEV4cEFjaGlldmVtZW50KCk7fVwiIC8+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhY3Rpb24tYnRuIHNlY29uZGFyeVwiIG9uY2xpY2s9XCJfYWRkRXhwQWNoaWV2ZW1lbnQoKVwiPisgQWRkPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwiY2xvc2VFeHBlcmllbmNlTW9kYWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHByaW1hcnlcIiBvbmNsaWNrPVwic2F2ZU1hc3RlckV4cGVyaWVuY2UoKVwiPlNhdmU8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gU2tpbGwgYWRkIG1vZGFsIC0tPlxuICAgIDxkaXYgaWQ9XCJtYXN0ZXItc2tpbGwtbW9kYWwtb3ZlcmxheVwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLW1vZGFsPVwidHJ1ZVwiXG4gICAgICAgIGFyaWEtbGFiZWxsZWRieT1cIm1hc3Rlci1za2lsbC1tb2RhbC10aXRsZVwiIGNsYXNzPVwibW9kYWwtb3ZlcmxheVwiXG4gICAgICAgIG9uY2xpY2s9XCJpZihldmVudC50YXJnZXQ9PT10aGlzKWNsb3NlU2tpbGxNb2RhbCgpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWxcIiBzdHlsZT1cIm1heC13aWR0aDo0ODBweDtcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuICAgICAgICAgIDxoMiBpZD1cIm1hc3Rlci1za2lsbC1tb2RhbC10aXRsZVwiPkFkZCBTa2lsbDwvaDI+XG4gICAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPVwiY2xvc2VTa2lsbE1vZGFsKClcIiBhcmlhLWxhYmVsPVwiQ2xvc2Ugc2tpbGwgZWRpdG9yXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOm5vbmU7Zm9udC1zaXplOjEuNGVtO2N1cnNvcjpwb2ludGVyO2NvbG9yOiM2NDc0OGI7XCI+JnRpbWVzOzwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIiBzdHlsZT1cInBhZGRpbmc6MjBweDtcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImhpZGRlblwiIGlkPVwic2tpbGwtbW9kYWwtY2F0ZWdvcnlcIiAvPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJza2lsbC1tb2RhbC1pcy1mbGF0XCIgLz5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImhpZGRlblwiIGlkPVwic2tpbGwtbW9kYWwtb3JpZ2luYWwtbmFtZVwiIC8+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTRweDtcIiBpZD1cInNraWxsLWNhdGVnb3J5LXJvd1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cInNraWxsLWNhdGVnb3J5LWRpc3BsYXlcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkNhdGVnb3J5PC9sYWJlbD5cbiAgICAgICAgICAgIDxzcGFuIGlkPVwic2tpbGwtY2F0ZWdvcnktZGlzcGxheVwiIHN0eWxlPVwiZm9udC13ZWlnaHQ6NTAwO2NvbG9yOiMzMzQxNTU7XCI+PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwic2tpbGwtbmFtZS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+U2tpbGwgTmFtZSA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4qPC9zcGFuPjwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInNraWxsLW5hbWUtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgYXJpYS1yZXF1aXJlZD1cInRydWVcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBQeXRob25cIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwic2tpbGwtZXhwZXJpZW5jZXMtaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkFzc29jaWF0ZWQgRXhwZXJpZW5jZSBJRHMgKG9wdGlvbmFsKTwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInNraWxsLWV4cGVyaWVuY2VzLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIGV4cF8xMjMsIGV4cF80NTZcIiAvPlxuICAgICAgICAgICAgPHNtYWxsIHN0eWxlPVwiZGlzcGxheTpibG9jazttYXJnaW4tdG9wOjRweDtjb2xvcjojNjQ3NDhiO1wiPkNvbW1hLXNlcGFyYXRlZCBJRHMuIEEgc2tpbGwgY2FuIGJlIGxpbmtlZCB0byBtdWx0aXBsZSBleHBlcmllbmNlcy48L3NtYWxsPlxuICAgICAgICAgICAgPGRpdiBpZD1cInNraWxsLWV4cGVyaWVuY2UtaGludHNcIiBzdHlsZT1cIm1hcmdpbi10b3A6NnB4O2ZvbnQtc2l6ZTowLjhlbTtjb2xvcjojOTRhM2I4O1wiPjwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwic2tpbGwtYWxpYXNlcy1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+QWxpYXNlcyAoY29tbWEtc2VwYXJhdGVkLCBvcHRpb25hbCk8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJza2lsbC1hbGlhc2VzLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIEpTLCBFQ01BU2NyaXB0XCIgLz5cbiAgICAgICAgICAgIDxzbWFsbCBzdHlsZT1cImRpc3BsYXk6YmxvY2s7bWFyZ2luLXRvcDo0cHg7Y29sb3I6IzY0NzQ4YjtcIj5BbHRlcm5hdGUgbmFtZXMgYW4gQVRTIG9yIHJldmlld2VyIG1pZ2h0IHNlYXJjaCBmb3IuPC9zbWFsbD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cInNraWxsLXllYXJzLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5ZZWFycyBvZiBFeHBlcmllbmNlIChvcHRpb25hbCk8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cInNraWxsLXllYXJzLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMjBweDtcIiBtaW49XCIwXCIgc3RlcD1cIjAuNVwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwiY2xvc2VTa2lsbE1vZGFsKClcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBwcmltYXJ5XCIgaWQ9XCJtYXN0ZXItc2tpbGwtc2F2ZS1idG5cIiBvbmNsaWNrPVwic2F2ZU1hc3RlclNraWxsKClcIj5BZGQgU2tpbGw8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gRWR1Y2F0aW9uIG1vZGFsIC0tPlxuICAgIDxkaXYgaWQ9XCJtYXN0ZXItZWR1LW1vZGFsLW92ZXJsYXlcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1tb2RhbD1cInRydWVcIlxuICAgICAgICBhcmlhLWxhYmVsbGVkYnk9XCJtYXN0ZXItZWR1LW1vZGFsLXRpdGxlXCIgY2xhc3M9XCJtb2RhbC1vdmVybGF5XCJcbiAgICAgICAgb25jbGljaz1cImlmKGV2ZW50LnRhcmdldD09PXRoaXMpY2xvc2VFZHVjYXRpb25Nb2RhbCgpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWxcIiBzdHlsZT1cIm1heC13aWR0aDo1ODBweDtcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuICAgICAgICAgIDxoMiBpZD1cIm1hc3Rlci1lZHUtbW9kYWwtdGl0bGVcIj5FZHVjYXRpb248L2gyPlxuICAgICAgICAgIDxidXR0b24gb25jbGljaz1cImNsb3NlRWR1Y2F0aW9uTW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJDbG9zZSBlZHVjYXRpb24gZWRpdG9yXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOm5vbmU7Zm9udC1zaXplOjEuNGVtO2N1cnNvcjpwb2ludGVyO2NvbG9yOiM2NDc0OGI7XCI+JnRpbWVzOzwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIiBzdHlsZT1cInBhZGRpbmc6MjBweDtcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImhpZGRlblwiIGlkPVwiZWR1LW1vZGFsLWlkeFwiIHZhbHVlPVwiLTFcIiAvPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmdyaWQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmciAxZnI7Z2FwOjE0cHg7XCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZWR1LWRlZ3JlZS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+RGVncmVlIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPio8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJlZHUtZGVncmVlLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiIGFyaWEtcmVxdWlyZWQ9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBQaC5ELlwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJlZHUtZmllbGQtaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkZpZWxkIG9mIFN0dWR5PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJlZHUtZmllbGQtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBCaW9zdGF0aXN0aWNzXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImdyaWQtY29sdW1uOjEvLTE7XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJlZHUtaW5zdGl0dXRpb24taW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkluc3RpdHV0aW9uIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPio8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJlZHUtaW5zdGl0dXRpb24taW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgYXJpYS1yZXF1aXJlZD1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIFVuaXZlcnNpdHkgb2YgV2FzaGluZ3RvblwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJlZHUtY2l0eS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+Q2l0eTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZWR1LWNpdHktaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgcGxhY2Vob2xkZXI9XCJTZWF0dGxlXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImVkdS1zdGF0ZS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+U3RhdGU8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImVkdS1zdGF0ZS1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIiBwbGFjZWhvbGRlcj1cIldBXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImVkdS1zdGFydC15ZWFyLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5TdGFydCBZZWFyPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cImVkdS1zdGFydC15ZWFyLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiXG4gICAgICAgICAgICAgICAgICBtaW49XCIxOTUwXCIgbWF4PVwiMjA5OVwiIHBsYWNlaG9sZGVyPVwiMTk5NVwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJlZHUtZW5kLXllYXItaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkVuZCBZZWFyPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cImVkdS1lbmQteWVhci1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIlxuICAgICAgICAgICAgICAgICAgbWluPVwiMTk1MFwiIG1heD1cIjIwOTlcIiBwbGFjZWhvbGRlcj1cIjIwMDBcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwiY2xvc2VFZHVjYXRpb25Nb2RhbCgpXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG4gcHJpbWFyeVwiIG9uY2xpY2s9XCJzYXZlTWFzdGVyRWR1Y2F0aW9uKClcIj5TYXZlPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEF3YXJkIG1vZGFsIC0tPlxuICAgIDxkaXYgaWQ9XCJtYXN0ZXItYXdhcmQtbW9kYWwtb3ZlcmxheVwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLW1vZGFsPVwidHJ1ZVwiXG4gICAgICAgIGFyaWEtbGFiZWxsZWRieT1cIm1hc3Rlci1hd2FyZC1tb2RhbC10aXRsZVwiIGNsYXNzPVwibW9kYWwtb3ZlcmxheVwiXG4gICAgICAgIG9uY2xpY2s9XCJpZihldmVudC50YXJnZXQ9PT10aGlzKWNsb3NlQXdhcmRNb2RhbCgpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWxcIiBzdHlsZT1cIm1heC13aWR0aDo1ODBweDtcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuICAgICAgICAgIDxoMiBpZD1cIm1hc3Rlci1hd2FyZC1tb2RhbC10aXRsZVwiPkF3YXJkIC8gSG9ub3VyPC9oMj5cbiAgICAgICAgICA8YnV0dG9uIG9uY2xpY2s9XCJjbG9zZUF3YXJkTW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJDbG9zZSBhd2FyZCBlZGl0b3JcIlxuICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6bm9uZTtib3JkZXI6bm9uZTtmb250LXNpemU6MS40ZW07Y3Vyc29yOnBvaW50ZXI7Y29sb3I6IzY0NzQ4YjtcIj4mdGltZXM7PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiIHN0eWxlPVwicGFkZGluZzoyMHB4O1wiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJhd2FyZC1tb2RhbC1pZHhcIiB2YWx1ZT1cIi0xXCIgLz5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cImF3YXJkLXRpdGxlLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5UaXRsZSA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4qPC9zcGFuPjwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImF3YXJkLXRpdGxlLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiIGFyaWEtcmVxdWlyZWQ9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gRW1wbG95ZWUgb2YgdGhlIFllYXJcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwiYXdhcmQteWVhci1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+WWVhcjwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiYXdhcmQteWVhci1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwcHg7XCJcbiAgICAgICAgICAgICAgICBtaW49XCIxOTUwXCIgbWF4PVwiMjA5OVwiIHBsYWNlaG9sZGVyPVwiMjAyMlwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTRweDtcIj5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJhd2FyZC1kZXNjLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5EZXNjcmlwdGlvbjwvbGFiZWw+XG4gICAgICAgICAgICA8dGV4dGFyZWEgaWQ9XCJhd2FyZC1kZXNjLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgcm93cz1cIjNcIiBzdHlsZT1cIndpZHRoOjEwMCU7cmVzaXplOnZlcnRpY2FsO1wiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJCcmllZiBjb250ZXh0IG9yIGFjaGlldmVtZW50IGRlc2NyaXB0aW9uXCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cImF3YXJkLXJlbGV2YW50LWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5SZWxldmFudCBmb3IgKGNvbW1hLXNlcGFyYXRlZCk8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJhd2FyZC1yZWxldmFudC1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBsZWFkZXJzaGlwLCBwaGFybWFcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgb25jbGljaz1cImNsb3NlQXdhcmRNb2RhbCgpXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG4gcHJpbWFyeVwiIG9uY2xpY2s9XCJzYXZlTWFzdGVyQXdhcmQoKVwiPlNhdmU8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gQ2VydGlmaWNhdGlvbiBtb2RhbCAtLT5cbiAgICA8ZGl2IGlkPVwibWFzdGVyLWNlcnQtbW9kYWwtb3ZlcmxheVwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLW1vZGFsPVwidHJ1ZVwiXG4gICAgICAgIGFyaWEtbGFiZWxsZWRieT1cIm1hc3Rlci1jZXJ0LW1vZGFsLXRpdGxlXCIgY2xhc3M9XCJtb2RhbC1vdmVybGF5XCJcbiAgICAgICAgb25jbGljaz1cImlmKGV2ZW50LnRhcmdldD09PXRoaXMpY2xvc2VDZXJ0aWZpY2F0aW9uTW9kYWwoKVwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsXCIgc3R5bGU9XCJtYXgtd2lkdGg6NTAwcHg7XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cbiAgICAgICAgICA8aDIgaWQ9XCJtYXN0ZXItY2VydC1tb2RhbC10aXRsZVwiPkNlcnRpZmljYXRpb248L2gyPlxuICAgICAgICAgIDxidXR0b24gb25jbGljaz1cImNsb3NlQ2VydGlmaWNhdGlvbk1vZGFsKClcIiBhcmlhLWxhYmVsPVwiQ2xvc2UgY2VydGlmaWNhdGlvbiBlZGl0b3JcIlxuICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6bm9uZTtib3JkZXI6bm9uZTtmb250LXNpemU6MS40ZW07Y3Vyc29yOnBvaW50ZXI7Y29sb3I6IzY0NzQ4YjtcIj4mdGltZXM7PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiIHN0eWxlPVwicGFkZGluZzoyMHB4O1wiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJjZXJ0LW1vZGFsLWlkeFwiIHZhbHVlPVwiLTFcIiAvPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwiY2VydC1uYW1lLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5OYW1lIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPio8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiY2VydC1uYW1lLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiIGFyaWEtcmVxdWlyZWQ9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gQVdTIENlcnRpZmllZCBTb2x1dGlvbnMgQXJjaGl0ZWN0XCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNlcnQtaXNzdWVyLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5Jc3N1ZXI8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJjZXJ0LWlzc3Vlci1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBBbWF6b24gV2ViIFNlcnZpY2VzXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNlcnQteWVhci1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+WWVhcjwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiY2VydC15ZWFyLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDBweDtcIlxuICAgICAgICAgICAgICAgIG1pbj1cIjE5NTBcIiBtYXg9XCIyMDk5XCIgcGxhY2Vob2xkZXI9XCIyMDIzXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0blwiIG9uY2xpY2s9XCJjbG9zZUNlcnRpZmljYXRpb25Nb2RhbCgpXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG4gcHJpbWFyeVwiIG9uY2xpY2s9XCJzYXZlTWFzdGVyQ2VydGlmaWNhdGlvbigpXCI+U2F2ZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBBY2hpZXZlbWVudCBlZGl0IG1vZGFsIC0tPlxuICAgIDxkaXYgaWQ9XCJtYXN0ZXItYWNoLW1vZGFsLW92ZXJsYXlcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1tb2RhbD1cInRydWVcIlxuICAgICAgICBhcmlhLWxhYmVsbGVkYnk9XCJtYXN0ZXItYWNoLW1vZGFsLXRpdGxlXCIgY2xhc3M9XCJtb2RhbC1vdmVybGF5XCJcbiAgICAgICAgb25jbGljaz1cImlmKGV2ZW50LnRhcmdldD09PXRoaXMpY2xvc2VNYXN0ZXJBY2hNb2RhbCgpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWxcIiBzdHlsZT1cIm1heC13aWR0aDo2MDBweDtcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuICAgICAgICAgIDxoMiBpZD1cIm1hc3Rlci1hY2gtbW9kYWwtdGl0bGVcIj5BY2hpZXZlbWVudDwvaDI+XG4gICAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPVwiY2xvc2VNYXN0ZXJBY2hNb2RhbCgpXCIgYXJpYS1sYWJlbD1cIkNsb3NlIGFjaGlldmVtZW50IGVkaXRvclwiXG4gICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDpub25lO2JvcmRlcjpub25lO2ZvbnQtc2l6ZToxLjRlbTtjdXJzb3I6cG9pbnRlcjtjb2xvcjojNjQ3NDhiO1wiPiZ0aW1lczs8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCIgc3R5bGU9XCJwYWRkaW5nOjIwcHg7XCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBpZD1cImFjaC1tb2RhbC1pZFwiIC8+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTRweDtcIj5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJhY2gtbW9kYWwtdGl0bGUtaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPlRpdGxlIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPio8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiYWNoLW1vZGFsLXRpdGxlLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiIGFyaWEtcmVxdWlyZWQ9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gTGVkIDNcdTAwRDcgcmV2ZW51ZSBncm93dGggaW5pdGlhdGl2ZVwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTRweDtcIj5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJhY2gtbW9kYWwtZGVzYy1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+RGVzY3JpcHRpb248L2xhYmVsPlxuICAgICAgICAgICAgPHRleHRhcmVhIGlkPVwiYWNoLW1vZGFsLWRlc2MtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiByb3dzPVwiM1wiIHN0eWxlPVwid2lkdGg6MTAwJTtyZXNpemU6dmVydGljYWw7XCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIk9wdGlvbmFsIGRldGFpbCBvciBtZXRyaWNcIj48L3RleHRhcmVhPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwiYWNoLW1vZGFsLXJlbGV2YW50LWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5SZWxldmFudCBmb3IgKGNvbW1hLXNlcGFyYXRlZCByb2xlcy9kb21haW5zKTwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImFjaC1tb2RhbC1yZWxldmFudC1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBsZWFkZXJzaGlwLCBNTCBlbmdpbmVlcmluZywgZGF0YSBzY2llbmNlXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cImFjaC1tb2RhbC1pbXBvcnRhbmNlLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5JbXBvcnRhbmNlICgxXHUyMDEzMTApPC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJhY2gtbW9kYWwtaW1wb3J0YW5jZS1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6ODBweDtcIlxuICAgICAgICAgICAgICAgIG1pbj1cIjFcIiBtYXg9XCIxMFwiIHZhbHVlPVwiN1wiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwiY2xvc2VNYXN0ZXJBY2hNb2RhbCgpXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG4gcHJpbWFyeVwiIG9uY2xpY2s9XCJzYXZlTWFzdGVyQWNoaWV2ZW1lbnQoKVwiPlNhdmU8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gU3VtbWFyeSBlZGl0IG1vZGFsIC0tPlxuICAgIDxkaXYgaWQ9XCJtYXN0ZXItc3VtLW1vZGFsLW92ZXJsYXlcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1tb2RhbD1cInRydWVcIlxuICAgICAgICBhcmlhLWxhYmVsbGVkYnk9XCJtYXN0ZXItc3VtLW1vZGFsLXRpdGxlXCIgY2xhc3M9XCJtb2RhbC1vdmVybGF5XCJcbiAgICAgICAgb25jbGljaz1cImlmKGV2ZW50LnRhcmdldD09PXRoaXMpY2xvc2VNYXN0ZXJTdW1Nb2RhbCgpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWxcIiBzdHlsZT1cIm1heC13aWR0aDo2MDBweDtcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuICAgICAgICAgIDxoMiBpZD1cIm1hc3Rlci1zdW0tbW9kYWwtdGl0bGVcIj5Qcm9mZXNzaW9uYWwgU3VtbWFyeTwvaDI+XG4gICAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPVwiY2xvc2VNYXN0ZXJTdW1Nb2RhbCgpXCIgYXJpYS1sYWJlbD1cIkNsb3NlIHN1bW1hcnkgZWRpdG9yXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOm5vbmU7Zm9udC1zaXplOjEuNGVtO2N1cnNvcjpwb2ludGVyO2NvbG9yOiM2NDc0OGI7XCI+JnRpbWVzOzwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIiBzdHlsZT1cInBhZGRpbmc6MjBweDtcIj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cInN1bS1tb2RhbC1rZXktaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPktleS9uYW1lIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPio8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwic3VtLW1vZGFsLWtleS1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIiBhcmlhLXJlcXVpcmVkPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIG1sX2VuZ2luZWVyaW5nIG9yIGxlYWRlcnNoaXBcIiAvPlxuICAgICAgICAgICAgPHAgc3R5bGU9XCJmb250LXNpemU6MC44MmVtO2NvbG9yOiM2YjcyODA7bWFyZ2luOjRweCAwIDA7XCI+VXNlIGxvd2VyY2FzZV91bmRlcnNjb3JlIFx1MjAxNCB0aGlzIGlzIHRoZSBrZXkgdXNlZCBpbnRlcm5hbGx5IGFuZCBzaG93biBpbiB0aGUgU3VtbWFyeSBGb2N1cyBzdGVwLjwvcD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cInN1bS1tb2RhbC10ZXh0LWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5TdW1tYXJ5IHRleHQgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+Kjwvc3Bhbj48L2xhYmVsPlxuICAgICAgICAgICAgPHRleHRhcmVhIGlkPVwic3VtLW1vZGFsLXRleHQtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiByb3dzPVwiNVwiIHN0eWxlPVwid2lkdGg6MTAwJTtyZXNpemU6dmVydGljYWw7XCIgYXJpYS1yZXF1aXJlZD1cInRydWVcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiV3JpdGUgeW91ciBwcm9mZXNzaW9uYWwgc3VtbWFyeSB2YXJpYW50IGhlcmVcdTIwMjZcIj48L3RleHRhcmVhPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgb25jbGljaz1cImNsb3NlTWFzdGVyU3VtTW9kYWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHByaW1hcnlcIiBvbmNsaWNrPVwic2F2ZU1hc3RlclN1bW1hcnkoKVwiPlNhdmU8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYDtcbiAgLy8gRGlzYWJsZSB3cml0ZSBjb250cm9scyB3aGVuIHRoZSB3b3JrZmxvdyBwaGFzZSBkb2VzIG5vdCBwZXJtaXQgTWFzdGVyIENWIGVkaXRzLlxuICBpZiAoIWlzRWRpdGFibGUpIHtcbiAgICBjb25zdCBTQUZFX09OQ0xJQ0sgPSAvXihleHBvcnRNYXN0ZXJDVnx2YWxpZGF0ZVB1YmxpY2F0aW9uc0JpYnxvcGVuQmFja3VwSGlzdG9yeU1vZGFsfHJlc3RvcmVCYWNrdXB8b3BlbkZ1bGxEYXRhUHJldmlld01vZGFsKVxcKC87XG4gICAgY29udGVudC5xdWVyeVNlbGVjdG9yQWxsKCdidXR0b24nKS5mb3JFYWNoKGJ0biA9PiB7XG4gICAgICBjb25zdCBvbmNsaWNrID0gKGJ0bi5nZXRBdHRyaWJ1dGUoJ29uY2xpY2snKSB8fCAnJykudHJpbSgpO1xuICAgICAgaWYgKFNBRkVfT05DTElDSy50ZXN0KG9uY2xpY2spKSByZXR1cm47XG4gICAgICBidG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgYnRuLnN0eWxlLm9wYWNpdHkgPSAnMC40NSc7XG4gICAgICBidG4uc3R5bGUuY3Vyc29yID0gJ25vdC1hbGxvd2VkJztcbiAgICAgIGJ0bi5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgJ0VkaXRpbmcgbG9ja2VkIFx1MjAxNCBjb21wbGV0ZSB0aGUgY3VycmVudCBzdGFnZSB0byByZS1lbmFibGUnKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIExvYWQgcHVibGljYXRpb25zIGFzeW5jaHJvbm91c2x5IGFmdGVyIHRoZSBET00gaXMgcmVhZHkuXG4gIGxvYWRQdWJsaWNhdGlvbnMoKTtcbn1cblxuZnVuY3Rpb24gX3JlbmRlclBlcnNvbmFsSW5mb0NhcmQocGkpIHtcbiAgY29uc3QgY29udGFjdCA9IHBpLmNvbnRhY3QgfHwge307XG4gIGNvbnN0IGFkZHJlc3MgPSBjb250YWN0LmFkZHJlc3MgfHwge307XG4gIGNvbnN0IHJvd3MgPSBbXG4gICAgWydOYW1lJywgICAgICBwaS5uYW1lIHx8ICcnXSxcbiAgICBbJ1RpdGxlJywgICAgIHBpLnRpdGxlIHx8IHBpLmhlYWRsaW5lIHx8ICcnXSxcbiAgICBbJ0VtYWlsJywgICAgIGNvbnRhY3QuZW1haWwgfHwgcGkuZW1haWwgfHwgJyddLFxuICAgIFsnUGhvbmUnLCAgICAgY29udGFjdC5waG9uZSB8fCAnJ10sXG4gICAgWydMaW5rZWRJbicsICBjb250YWN0LmxpbmtlZGluIHx8ICcnXSxcbiAgICBbJ1dlYnNpdGUnLCAgIGNvbnRhY3Qud2Vic2l0ZSB8fCAnJ10sXG4gICAgWydMb2NhdGlvbicsICBbYWRkcmVzcy5jaXR5LCBhZGRyZXNzLnN0YXRlXS5maWx0ZXIoQm9vbGVhbikuam9pbignLCAnKV0sXG4gIF0uZmlsdGVyKChbLCB2XSkgPT4gdik7XG4gIGlmICghcm93cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gJzxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtwYWRkaW5nOjEycHggMDtcIj5ObyBwZXJzb25hbCBpbmZvcm1hdGlvbiBvbiBmaWxlLiBDbGljayBcIlx1MjcwRlx1RkUwRiBFZGl0XCIgYWJvdmUgdG8gYWRkIHlvdXIgZGV0YWlscy48L3A+JztcbiAgfVxuICByZXR1cm4gYDxkbCBjbGFzcz1cIm1hc3Rlci1pbmZvLWdyaWRcIj4ke3Jvd3MubWFwKChbbGFiZWwsIHZhbHVlXSkgPT5cbiAgICBgPGRpdiBjbGFzcz1cIm1hc3Rlci1pbmZvLXJvd1wiPjxkdD4ke2VzY2FwZUh0bWwobGFiZWwpfTwvZHQ+PGRkPiR7ZXNjYXBlSHRtbCh2YWx1ZSl9PC9kZD48L2Rpdj5gXG4gICkuam9pbignJyl9PC9kbD5gO1xufVxuXG5mdW5jdGlvbiBfcmVuZGVyRXhwZXJpZW5jZXNMaXN0KGV4cGVyaWVuY2VzKSB7XG4gIGlmICghZXhwZXJpZW5jZXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuICc8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7cGFkZGluZzoxMnB4IDA7XCI+Tm8gZXhwZXJpZW5jZSBlbnRyaWVzIHlldC4gQ2xpY2sgXCIrIEFkZCBFeHBlcmllbmNlXCIgYWJvdmUuPC9wPic7XG4gIH1cbiAgY29uc3Qgcm93cyA9IGV4cGVyaWVuY2VzLm1hcCgoZXhwLCBpZHgpID0+IHtcbiAgICBjb25zdCB0aXRsZSAgID0gZXNjYXBlSHRtbChleHAudGl0bGUgfHwgJycpO1xuICAgIGNvbnN0IGNvbXBhbnkgPSBlc2NhcGVIdG1sKGV4cC5jb21wYW55IHx8ICcnKTtcbiAgICBjb25zdCBsb2MgICAgID0gZXhwLmxvY2F0aW9uIHx8IHt9O1xuICAgIGNvbnN0IGxvY2F0aW9uID0gZXNjYXBlSHRtbChbbG9jLmNpdHksIGxvYy5zdGF0ZV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJywgJykpO1xuICAgIGNvbnN0IGRhdGVzICAgPSBlc2NhcGVIdG1sKFtleHAuc3RhcnRfZGF0ZSwgZXhwLmVuZF9kYXRlIHx8ICdQcmVzZW50J10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyBcdTIwMTMgJykpO1xuICAgIGNvbnN0IGFjaENvdW50ID0gKGV4cC5hY2hpZXZlbWVudHMgfHwgW10pLmxlbmd0aDtcbiAgICBjb25zdCBleHBJZCA9IGVzY2FwZUh0bWwoZXhwLmlkIHx8ICcnKTtcbiAgICByZXR1cm4gYFxuICAgICAgPHRyPlxuICAgICAgICA8dGQ+XG4gICAgICAgICAgPHN0cm9uZz4ke3RpdGxlfTwvc3Ryb25nPjxicj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiM0NzU1Njk7XCI+JHtjb21wYW55fTwvc3Bhbj5cbiAgICAgICAgICAke2xvY2F0aW9uID8gYDxzcGFuIHN0eWxlPVwiY29sb3I6Izk0YTNiODtmb250LXNpemU6MC44NWVtO1wiPiBcdTAwQjcgJHtsb2NhdGlvbn08L3NwYW4+YCA6ICcnfVxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2NvbG9yOiM0NzU1Njk7d2hpdGUtc3BhY2U6bm93cmFwO1wiPiR7ZGF0ZXN9PC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7Y29sb3I6Izk0YTNiODtmb250LXNpemU6MC44NWVtO1wiPiR7YWNoQ291bnR9PC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwiYWN0aW9uLWJ0bnNcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBvbmNsaWNrPVwiZWRpdE1hc3RlckV4cGVyaWVuY2UoJyR7ZXhwSWR9JylcIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiRWRpdCBleHBlcmllbmNlOiAke3RpdGxlfVwiIHRpdGxlPVwiRWRpdFwiPlx1MjcwRlx1RkUwRjwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIG9uY2xpY2s9XCJkZWxldGVNYXN0ZXJFeHBlcmllbmNlKCcke2VzY2FwZUh0bWwoZXhwLmlkIHx8ICcnKX0nLCAnJHt0aXRsZX0nKVwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJEZWxldGUgZXhwZXJpZW5jZTogJHt0aXRsZX1cIiB0aXRsZT1cIkRlbGV0ZVwiPlx1RDgzRFx1REREMVx1RkUwRjwvYnV0dG9uPlxuICAgICAgICA8L3RkPlxuICAgICAgPC90cj5gO1xuICB9KS5qb2luKCcnKTtcbiAgcmV0dXJuIGBcbiAgICA8dGFibGUgY2xhc3M9XCJyZXZpZXctdGFibGVcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCI+XG4gICAgICA8dGhlYWQ+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8dGg+Um9sZSAvIENvbXBhbnk8L3RoPlxuICAgICAgICAgIDx0aD5EYXRlczwvdGg+XG4gICAgICAgICAgPHRoIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7d2lkdGg6NjBweDtcIj5CdWxsZXRzPC90aD5cbiAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDo4MHB4O1wiPkFjdGlvbnM8L3RoPlxuICAgICAgICA8L3RyPlxuICAgICAgPC90aGVhZD5cbiAgICAgIDx0Ym9keT4ke3Jvd3N9PC90Ym9keT5cbiAgICA8L3RhYmxlPmA7XG59XG5cbmZ1bmN0aW9uIF9yZW5kZXJTa2lsbHNTZWN0aW9uKHNraWxscykge1xuICBjb25zdCBub3JtYWxpemVTa2lsbCA9IChzKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBzID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHsgbmFtZTogcywgZXhwZXJpZW5jZXM6IFtdIH07XG4gICAgfVxuICAgIGlmIChzICYmIHR5cGVvZiBzID09PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogcy5uYW1lIHx8ICcnLFxuICAgICAgICBleHBlcmllbmNlczogQXJyYXkuaXNBcnJheShzLmV4cGVyaWVuY2VzKSA/IHMuZXhwZXJpZW5jZXMgOiBbXSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7IG5hbWU6IFN0cmluZyhzIHx8ICcnKSwgZXhwZXJpZW5jZXM6IFtdIH07XG4gIH07XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoc2tpbGxzKSkge1xuICAgIGlmICghc2tpbGxzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuICc8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7cGFkZGluZzoxMnB4IDA7XCI+Tm8gc2tpbGxzIG9uIGZpbGUuIENsaWNrIFwiKyBBZGQgU2tpbGxcIiBhYm92ZS48L3A+JztcbiAgICB9XG4gICAgY29uc3QgY2hpcHMgPSBza2lsbHMubWFwKHMgPT4ge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZVNraWxsKHMpO1xuICAgICAgY29uc3QgbmFtZSA9IGVzY2FwZUh0bWwobm9ybWFsaXplZC5uYW1lKTtcbiAgICAgIGNvbnN0IHJhdyA9IGVzY2FwZUh0bWwobm9ybWFsaXplZC5uYW1lKTtcbiAgICAgIGNvbnN0IGJhZGdlID0gbm9ybWFsaXplZC5leHBlcmllbmNlcy5sZW5ndGhcbiAgICAgICAgPyBgPHNtYWxsIHN0eWxlPVwiY29sb3I6IzY0NzQ4YjttYXJnaW4tbGVmdDo2cHg7XCI+KCR7bm9ybWFsaXplZC5leHBlcmllbmNlcy5sZW5ndGh9IGV4cCk8L3NtYWxsPmBcbiAgICAgICAgOiAnJztcbiAgICAgIGNvbnN0IHNraWxsSnNvbiA9IGVzY2FwZUh0bWwoSlNPTi5zdHJpbmdpZnkoeyBuYW1lOiBub3JtYWxpemVkLm5hbWUsIGV4cGVyaWVuY2VzOiBub3JtYWxpemVkLmV4cGVyaWVuY2VzIH0pKTtcbiAgICAgIHJldHVybiBgPHNwYW4gY2xhc3M9XCJza2lsbC1jaGlwXCI+JHtuYW1lfSR7YmFkZ2V9PGJ1dHRvbiBjbGFzcz1cInNraWxsLWNoaXAtZGVsXCIgb25jbGljaz1cImVkaXRNYXN0ZXJTa2lsbCgke3NraWxsSnNvbn0sICcnLCB0cnVlKVwiIGFyaWEtbGFiZWw9XCJFZGl0IHNraWxsICR7bmFtZX1cIiB0aXRsZT1cIkVkaXRcIj5cdTI3MEZcdUZFMEY8L2J1dHRvbj48YnV0dG9uIGNsYXNzPVwic2tpbGwtY2hpcC1kZWxcIiBvbmNsaWNrPVwiZGVsZXRlTWFzdGVyU2tpbGwoJyR7cmF3fScsICcnLCB0cnVlKVwiIGFyaWEtbGFiZWw9XCJSZW1vdmUgc2tpbGwgJHtuYW1lfVwiIHRpdGxlPVwiUmVtb3ZlXCI+XHUwMEQ3PC9idXR0b24+PC9zcGFuPmA7XG4gICAgfSkuam9pbignJyk7XG4gICAgcmV0dXJuIGA8ZGl2IGNsYXNzPVwic2tpbGwtY2hpcHMtY29udGFpbmVyXCI+JHtjaGlwc308L2Rpdj5gO1xuICB9XG4gIGlmICh0eXBlb2Ygc2tpbGxzID09PSAnb2JqZWN0JyAmJiBza2lsbHMgIT09IG51bGwpIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoc2tpbGxzKTtcbiAgICBpZiAoIWtleXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gJzxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtwYWRkaW5nOjEycHggMDtcIj5ObyBza2lsbCBjYXRlZ29yaWVzIG9uIGZpbGUuPC9wPic7XG4gICAgfVxuICAgIHJldHVybiBrZXlzLm1hcChjYXRLZXkgPT4ge1xuICAgICAgY29uc3QgY2F0VmFsICA9IHNraWxsc1tjYXRLZXldO1xuICAgICAgY29uc3QgY2F0TmFtZSAgPSB0eXBlb2YgY2F0VmFsID09PSAnb2JqZWN0JyAmJiBjYXRWYWwuY2F0ZWdvcnkgPyBjYXRWYWwuY2F0ZWdvcnkgOiBjYXRLZXk7XG4gICAgICBjb25zdCBjYXRMaXN0ICA9IEFycmF5LmlzQXJyYXkoY2F0VmFsKSA/IGNhdFZhbFxuICAgICAgICAgICAgICAgICAgICAgOiBBcnJheS5pc0FycmF5KGNhdFZhbD8uc2tpbGxzKSA/IGNhdFZhbC5za2lsbHMgOiBbXTtcbiAgICAgIGNvbnN0IGNoaXBzICAgPSBjYXRMaXN0Lm1hcChzID0+IHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZVNraWxsKHMpO1xuICAgICAgICBjb25zdCBuYW1lID0gZXNjYXBlSHRtbChub3JtYWxpemVkLm5hbWUpO1xuICAgICAgICBjb25zdCBiYWRnZSA9IG5vcm1hbGl6ZWQuZXhwZXJpZW5jZXMubGVuZ3RoXG4gICAgICAgICAgPyBgPHNtYWxsIHN0eWxlPVwiY29sb3I6IzY0NzQ4YjttYXJnaW4tbGVmdDo2cHg7XCI+KCR7bm9ybWFsaXplZC5leHBlcmllbmNlcy5sZW5ndGh9IGV4cCk8L3NtYWxsPmBcbiAgICAgICAgICA6ICcnO1xuICAgICAgICBjb25zdCBza2lsbEpzb24gPSBlc2NhcGVIdG1sKEpTT04uc3RyaW5naWZ5KHsgbmFtZTogbm9ybWFsaXplZC5uYW1lLCBleHBlcmllbmNlczogbm9ybWFsaXplZC5leHBlcmllbmNlcyB9KSk7XG4gICAgICAgIHJldHVybiBgPHNwYW4gY2xhc3M9XCJza2lsbC1jaGlwXCI+JHtuYW1lfSR7YmFkZ2V9PGJ1dHRvbiBjbGFzcz1cInNraWxsLWNoaXAtZGVsXCIgb25jbGljaz1cImVkaXRNYXN0ZXJTa2lsbCgke3NraWxsSnNvbn0sICcke2VzY2FwZUh0bWwoY2F0S2V5KX0nLCBmYWxzZSlcIiBhcmlhLWxhYmVsPVwiRWRpdCAke25hbWV9XCIgdGl0bGU9XCJFZGl0XCI+XHUyNzBGXHVGRTBGPC9idXR0b24+PGJ1dHRvbiBjbGFzcz1cInNraWxsLWNoaXAtZGVsXCIgb25jbGljaz1cImRlbGV0ZU1hc3RlclNraWxsKCcke25hbWV9JywgJyR7ZXNjYXBlSHRtbChjYXRLZXkpfScsIGZhbHNlKVwiIGFyaWEtbGFiZWw9XCJSZW1vdmUgJHtuYW1lfVwiIHRpdGxlPVwiUmVtb3ZlXCI+XHUwMEQ3PC9idXR0b24+PC9zcGFuPmA7XG4gICAgICB9KS5qb2luKCcnKTtcbiAgICAgIGNvbnN0IGNhdEtleUVzYyAgPSBlc2NhcGVIdG1sKGNhdEtleSk7XG4gICAgICBjb25zdCBjYXROYW1lRXNjID0gZXNjYXBlSHRtbChjYXROYW1lKTtcbiAgICAgIHJldHVybiBgXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc2tpbGwtY2F0ZWdvcnlcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXNraWxsLWNhdC1oZWFkZXJcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWFzdGVyLXNraWxsLWNhdC1uYW1lXCI+JHtjYXROYW1lRXNjfTwvc3Bhbj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuLXNtXCIgb25jbGljaz1cInNob3dBZGRTa2lsbE1vZGFsKCcke2NhdEtleUVzY30nLCBmYWxzZSlcIlxuICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJBZGQgc2tpbGwgdG8gJHtjYXROYW1lRXNjfVwiPisgQWRkPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNraWxsLWNoaXBzLWNvbnRhaW5lclwiPiR7Y2hpcHMgfHwgJzxzcGFuIHN0eWxlPVwiY29sb3I6Izk0YTNiODtmb250LXNpemU6MC44NWVtO1wiPk5vIHNraWxscyBpbiB0aGlzIGNhdGVnb3J5PC9zcGFuPid9PC9kaXY+XG4gICAgICAgIDwvZGl2PmA7XG4gICAgfSkuam9pbignJyk7XG4gIH1cbiAgcmV0dXJuICc8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7XCI+U2tpbGxzIGRhdGEgZm9ybWF0IG5vdCByZWNvZ25pc2VkLjwvcD4nO1xufVxuXG5mdW5jdGlvbiBfcmVuZGVyRWR1Y2F0aW9uTGlzdChlZHVjYXRpb24pIHtcbiAgaWYgKCFlZHVjYXRpb24ubGVuZ3RoKSB7XG4gICAgcmV0dXJuICc8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7cGFkZGluZzoxMnB4IDA7XCI+Tm8gZWR1Y2F0aW9uIGVudHJpZXMgeWV0LiBDbGljayBcIisgQWRkIEVkdWNhdGlvblwiIGFib3ZlLjwvcD4nO1xuICB9XG4gIGNvbnN0IHJvd3MgPSBlZHVjYXRpb24ubWFwKChlZHUsIGlkeCkgPT4ge1xuICAgIGNvbnN0IGRlZ3JlZSAgICAgID0gZXNjYXBlSHRtbChlZHUuZGVncmVlIHx8ICcnKTtcbiAgICBjb25zdCBmaWVsZCAgICAgICA9IGVzY2FwZUh0bWwoZWR1LmZpZWxkIHx8ICcnKTtcbiAgICBjb25zdCBpbnN0aXR1dGlvbiA9IGVzY2FwZUh0bWwoZWR1Lmluc3RpdHV0aW9uIHx8ICcnKTtcbiAgICBjb25zdCBsb2MgICAgICAgICA9IGVkdS5sb2NhdGlvbiB8fCB7fTtcbiAgICBjb25zdCBsb2NhdGlvbiAgICA9IGVzY2FwZUh0bWwoW2xvYy5jaXR5LCBsb2Muc3RhdGVdLmZpbHRlcihCb29sZWFuKS5qb2luKCcsICcpKTtcbiAgICBjb25zdCB5ZWFycyAgICAgICA9IFtlZHUuc3RhcnRfeWVhciwgZWR1LmVuZF95ZWFyXS5maWx0ZXIoQm9vbGVhbikuam9pbignXHUyMDEzJyk7XG4gICAgY29uc3QgZWR1SnNvbiA9IGVzY2FwZUh0bWwoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZGVncmVlOiBlZHUuZGVncmVlIHx8ICcnLCBmaWVsZDogZWR1LmZpZWxkIHx8ICcnLCBpbnN0aXR1dGlvbjogZWR1Lmluc3RpdHV0aW9uIHx8ICcnLFxuICAgICAgY2l0eTogbG9jLmNpdHkgfHwgJycsIHN0YXRlOiBsb2Muc3RhdGUgfHwgJycsXG4gICAgICBzdGFydF95ZWFyOiBlZHUuc3RhcnRfeWVhciB8fCAnJywgZW5kX3llYXI6IGVkdS5lbmRfeWVhciB8fCAnJyxcbiAgICB9KSk7XG4gICAgcmV0dXJuIGBcbiAgICAgIDx0cj5cbiAgICAgICAgPHRkPlxuICAgICAgICAgIDxzdHJvbmc+JHtkZWdyZWV9JHtmaWVsZCA/IGAsICR7ZmllbGR9YCA6ICcnfTwvc3Ryb25nPjxicj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiM0NzU1Njk7XCI+JHtpbnN0aXR1dGlvbn08L3NwYW4+XG4gICAgICAgICAgJHtsb2NhdGlvbiA/IGA8c3BhbiBzdHlsZT1cImNvbG9yOiM5NGEzYjg7Zm9udC1zaXplOjAuODVlbTtcIj4gXHUwMEI3ICR7bG9jYXRpb259PC9zcGFuPmAgOiAnJ31cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtjb2xvcjojNDc1NTY5O3doaXRlLXNwYWNlOm5vd3JhcDtcIj4ke3llYXJzIHx8ICdcdTIwMTQnfTwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cImFjdGlvbi1idG5zXCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgb25jbGljaz1cImVkaXRNYXN0ZXJFZHVjYXRpb24oJHtlZHVKc29ufSwgJHtpZHh9KVwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJFZGl0IGVkdWNhdGlvbjogJHtpbnN0aXR1dGlvbn1cIiB0aXRsZT1cIkVkaXRcIj5cdTI3MEZcdUZFMEY8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBvbmNsaWNrPVwiZGVsZXRlTWFzdGVyRWR1Y2F0aW9uKCR7aWR4fSwgJyR7aW5zdGl0dXRpb259JylcIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiRGVsZXRlIGVkdWNhdGlvbjogJHtpbnN0aXR1dGlvbn1cIiB0aXRsZT1cIkRlbGV0ZVwiPlx1RDgzRFx1REREMVx1RkUwRjwvYnV0dG9uPlxuICAgICAgICA8L3RkPlxuICAgICAgPC90cj5gO1xuICB9KS5qb2luKCcnKTtcbiAgcmV0dXJuIGBcbiAgICA8dGFibGUgY2xhc3M9XCJyZXZpZXctdGFibGVcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCI+XG4gICAgICA8dGhlYWQ+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8dGg+RGVncmVlIC8gSW5zdGl0dXRpb248L3RoPlxuICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOjEwMHB4O1wiPlllYXJzPC90aD5cbiAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDo4MHB4O1wiPkFjdGlvbnM8L3RoPlxuICAgICAgICA8L3RyPlxuICAgICAgPC90aGVhZD5cbiAgICAgIDx0Ym9keT4ke3Jvd3N9PC90Ym9keT5cbiAgICA8L3RhYmxlPmA7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUHVibGljYXRpb25zIFx1MjAxNCBDUlVEICsgcmF3IEJpYlRlWCB0b2dnbGVcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogQ3VycmVudCB2aWV3IG1vZGU6ICdjcnVkJyB8ICdyYXcnICovXG5sZXQgX3B1YlZpZXdNb2RlID0gJ2NydWQnO1xubGV0IF9wdWJTb3J0TW9kZSA9ICd5ZWFyX2Rlc2MnO1xubGV0IF9wdWJHcm91cE1vZGUgPSAnbm9uZSc7XG4vKiogVHJ1ZSB3aGVuIHRoZSBlbnRyeSBiZWluZyBlZGl0ZWQgaGFkIGFuIGBlZGl0b3JgIGZpZWxkIGJ1dCBubyBgYXV0aG9yYC4gKi9cbmxldCBfcHViTW9kYWxVc2VzRWRpdG9yRmllbGQgPSBmYWxzZTtcblxuZnVuY3Rpb24gdG9nZ2xlUHVibGljYXRpb25zVmlldygpIHtcbiAgX3B1YlZpZXdNb2RlID0gX3B1YlZpZXdNb2RlID09PSAnY3J1ZCcgPyAncmF3JyA6ICdjcnVkJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItY3J1ZC12aWV3Jykuc3R5bGUuZGlzcGxheSA9IF9wdWJWaWV3TW9kZSA9PT0gJ2NydWQnID8gJycgOiAnbm9uZSc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLXJhdy12aWV3Jykuc3R5bGUuZGlzcGxheSAgPSBfcHViVmlld01vZGUgPT09ICdyYXcnICA/ICcnIDogJ25vbmUnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1hZGQtYnRuJykuc3R5bGUuZGlzcGxheSAgID0gX3B1YlZpZXdNb2RlID09PSAnY3J1ZCcgPyAnJyA6ICdub25lJztcbiAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItdG9nZ2xlLWJ0bicpO1xuICBpZiAoYnRuKSBidG4udGV4dENvbnRlbnQgPSBfcHViVmlld01vZGUgPT09ICdjcnVkJyA/ICdcdTI3MEZcdUZFMEYgUmF3IEJpYlRlWCcgOiAnXHVEODNEXHVEQ0NCIFN0cnVjdHVyZWQgVmlldyc7XG4gIGlmIChfcHViVmlld01vZGUgPT09ICdyYXcnKSBsb2FkUHVibGljYXRpb25zQmliKCk7XG59XG5cbi8qKiBMb2FkIGJvdGggc3RydWN0dXJlZCBsaXN0IGFuZCByYXcgY29udGVudCBmcm9tIGEgc2luZ2xlIEFQSSBjYWxsLiAqL1xuYXN5bmMgZnVuY3Rpb24gbG9hZFB1YmxpY2F0aW9ucygpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvcHVibGljYXRpb25zJyk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEub2spIHtcbiAgICAgIF9yZW5kZXJQdWJsaWNhdGlvbnNDcnVkTGlzdChkYXRhLnB1YmxpY2F0aW9ucyB8fCBbXSk7XG4gICAgICBjb25zdCB0YSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLXRleHRhcmVhJyk7XG4gICAgICBpZiAodGEpIHRhLnZhbHVlID0gZGF0YS5jb250ZW50IHx8ICcnO1xuICAgICAgX3VwZGF0ZVB1YkNvdW50KGRhdGEuY291bnQgPz8gMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNydWQtY29udGFpbmVyJykuaW5uZXJIVE1MID1cbiAgICAgICAgYDxwIHN0eWxlPVwiY29sb3I6I2VmNDQ0NDtwYWRkaW5nOjEycHggMDtcIj5cdTI2QTBcdUZFMEYgJHtlc2NhcGVIdG1sKGRhdGEuZXJyb3IgfHwgJ0ZhaWxlZCB0byBsb2FkJyl9PC9wPmA7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1jcnVkLWNvbnRhaW5lcicpLmlubmVySFRNTCA9XG4gICAgICBgPHAgc3R5bGU9XCJjb2xvcjojZWY0NDQ0O3BhZGRpbmc6MTJweCAwO1wiPlx1MjZBMFx1RkUwRiBGYWlsZWQgdG8gbG9hZDogJHtlc2NhcGVIdG1sKGVyci5tZXNzYWdlKX08L3A+YDtcbiAgfVxufVxuXG4vKiogUmVsb2FkIG9ubHkgdGhlIHJhdyB0ZXh0YXJlYSBjb250ZW50IChjYWxsZWQgd2hlbiBzd2l0Y2hpbmcgdG8gcmF3IHZpZXcpLiAqL1xuYXN5bmMgZnVuY3Rpb24gbG9hZFB1YmxpY2F0aW9uc0JpYigpIHtcbiAgY29uc3QgdGEgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItdGV4dGFyZWEnKTtcbiAgY29uc3Qgc3RhdHVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItc3RhdHVzJyk7XG4gIGlmICghdGEpIHJldHVybjtcbiAgdGEuZGlzYWJsZWQgICAgPSB0cnVlO1xuICB0YS5wbGFjZWhvbGRlciA9ICdMb2FkaW5nXHUyMDI2JztcbiAgaWYgKHN0YXR1cykgc3RhdHVzLnRleHRDb250ZW50ID0gJyc7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL3B1YmxpY2F0aW9ucycpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICB0YS52YWx1ZSA9IGRhdGEuY29udGVudCB8fCAnJztcbiAgICAgIF91cGRhdGVQdWJDb3VudChkYXRhLmNvdW50ID8/IDApO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc3RhdHVzKSBzdGF0dXMudGV4dENvbnRlbnQgPSAnXHUyNkEwXHVGRTBGICcgKyAoZGF0YS5lcnJvciB8fCAnRmFpbGVkIHRvIGxvYWQnKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChzdGF0dXMpIHN0YXR1cy50ZXh0Q29udGVudCA9ICdcdTI2QTBcdUZFMEYgRmFpbGVkIHRvIGxvYWQ6ICcgKyBlcnIubWVzc2FnZTtcbiAgfSBmaW5hbGx5IHtcbiAgICB0YS5kaXNhYmxlZCAgICA9IGZhbHNlO1xuICAgIHRhLnBsYWNlaG9sZGVyID0gJyc7XG4gIH1cbn1cblxuZnVuY3Rpb24gX3VwZGF0ZVB1YkNvdW50KG4pIHtcbiAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1jb3VudCcpO1xuICBpZiAoZWwpIGVsLnRleHRDb250ZW50ID0gYCR7bn0gcHVibGljYXRpb24ke24gIT09IDEgPyAncycgOiAnJ30gb24gZmlsZWA7XG59XG5cbmZ1bmN0aW9uIF9zZXRQdWJsaWNhdGlvblN0YXR1cyhlbGVtZW50SWQsIHRleHQsIGNvbG9yID0gJyM2YjcyODAnKSB7XG4gIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbWVudElkKTtcbiAgaWYgKCFlbCkgcmV0dXJuO1xuICBlbC50ZXh0Q29udGVudCA9IHRleHQ7XG4gIGVsLnN0eWxlLmNvbG9yID0gY29sb3I7XG59XG5cbmZ1bmN0aW9uIHNldFB1YmxpY2F0aW9uU29ydE1vZGUobW9kZSkge1xuICBfcHViU29ydE1vZGUgPSBtb2RlIHx8ICd5ZWFyX2Rlc2MnO1xuICB2b2lkIGxvYWRQdWJsaWNhdGlvbnMoKTtcbn1cblxuZnVuY3Rpb24gc2V0UHVibGljYXRpb25Hcm91cE1vZGUobW9kZSkge1xuICBfcHViR3JvdXBNb2RlID0gbW9kZSB8fCAnbm9uZSc7XG4gIHZvaWQgbG9hZFB1YmxpY2F0aW9ucygpO1xufVxuXG5mdW5jdGlvbiBfZ2V0UHVibGljYXRpb25ZZWFyKHB1Yikge1xuICBjb25zdCByYXdZZWFyID0gcHViPy5maWVsZHM/LnllYXIgPz8gcHViPy55ZWFyID8/ICcnO1xuICBjb25zdCBtYXRjaCA9IFN0cmluZyhyYXdZZWFyKS5tYXRjaCgvXFxkezR9Lyk7XG4gIHJldHVybiBtYXRjaCA/IE51bWJlcihtYXRjaFswXSkgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBfY29tcGFyZVB1YmxpY2F0aW9ucyhsZWZ0LCByaWdodCkge1xuICBjb25zdCBsZWZ0WWVhciA9IF9nZXRQdWJsaWNhdGlvblllYXIobGVmdCkgPz8gLUluZmluaXR5O1xuICBjb25zdCByaWdodFllYXIgPSBfZ2V0UHVibGljYXRpb25ZZWFyKHJpZ2h0KSA/PyAtSW5maW5pdHk7XG4gIGNvbnN0IGxlZnRUeXBlID0gU3RyaW5nKGxlZnQ/LnR5cGUgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IHJpZ2h0VHlwZSA9IFN0cmluZyhyaWdodD8udHlwZSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgbGVmdEtleSA9IFN0cmluZyhsZWZ0Py5rZXkgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IHJpZ2h0S2V5ID0gU3RyaW5nKHJpZ2h0Py5rZXkgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG5cbiAgc3dpdGNoIChfcHViU29ydE1vZGUpIHtcbiAgICBjYXNlICd5ZWFyX2FzYyc6XG4gICAgICByZXR1cm4gKGxlZnRZZWFyIC0gcmlnaHRZZWFyKSB8fCBsZWZ0VHlwZS5sb2NhbGVDb21wYXJlKHJpZ2h0VHlwZSkgfHwgbGVmdEtleS5sb2NhbGVDb21wYXJlKHJpZ2h0S2V5KTtcbiAgICBjYXNlICd0eXBlX2FzYyc6XG4gICAgICByZXR1cm4gbGVmdFR5cGUubG9jYWxlQ29tcGFyZShyaWdodFR5cGUpIHx8IChyaWdodFllYXIgLSBsZWZ0WWVhcikgfHwgbGVmdEtleS5sb2NhbGVDb21wYXJlKHJpZ2h0S2V5KTtcbiAgICBjYXNlICd0eXBlX2Rlc2MnOlxuICAgICAgcmV0dXJuIHJpZ2h0VHlwZS5sb2NhbGVDb21wYXJlKGxlZnRUeXBlKSB8fCAocmlnaHRZZWFyIC0gbGVmdFllYXIpIHx8IGxlZnRLZXkubG9jYWxlQ29tcGFyZShyaWdodEtleSk7XG4gICAgY2FzZSAneWVhcl9kZXNjJzpcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIChyaWdodFllYXIgLSBsZWZ0WWVhcikgfHwgbGVmdFR5cGUubG9jYWxlQ29tcGFyZShyaWdodFR5cGUpIHx8IGxlZnRLZXkubG9jYWxlQ29tcGFyZShyaWdodEtleSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2dyb3VwUHVibGljYXRpb25MYWJlbChwdWIpIHtcbiAgaWYgKF9wdWJHcm91cE1vZGUgPT09ICd5ZWFyJykge1xuICAgIHJldHVybiBTdHJpbmcoX2dldFB1YmxpY2F0aW9uWWVhcihwdWIpID8/ICdVbmtub3duIHllYXInKTtcbiAgfVxuICBpZiAoX3B1Ykdyb3VwTW9kZSA9PT0gJ3R5cGUnKSB7XG4gICAgcmV0dXJuIHB1Yj8udHlwZSA/IFN0cmluZyhwdWIudHlwZSkgOiAnVW5rbm93biB0eXBlJztcbiAgfVxuICByZXR1cm4gJ1B1YmxpY2F0aW9ucyc7XG59XG5cbmZ1bmN0aW9uIF9yZW5kZXJQdWJsaWNhdGlvbnNDcnVkTGlzdChwdWJzKSB7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNydWQtY29udGFpbmVyJyk7XG4gIGlmICghY29udGFpbmVyKSByZXR1cm47XG4gIGNvbnN0IGNvbnRyb2xzSHRtbCA9IGBcbiAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2ZsZXgtd3JhcDp3cmFwO2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTJweDttYXJnaW4tYm90dG9tOjEycHg7XCI+XG4gICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDo2cHg7Y29sb3I6IzQ3NTU2OTtmb250LXNpemU6MC45ZW07XCI+XG4gICAgICAgIFNvcnRcbiAgICAgICAgPHNlbGVjdCBpZD1cIm1hc3Rlci1wdWItc29ydC1zZWxlY3RcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOmF1dG87bWluLXdpZHRoOjE1MHB4O1wiIG9uY2hhbmdlPVwic2V0UHVibGljYXRpb25Tb3J0TW9kZSh0aGlzLnZhbHVlKVwiPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ5ZWFyX2Rlc2NcIiAke19wdWJTb3J0TW9kZSA9PT0gJ3llYXJfZGVzYycgPyAnc2VsZWN0ZWQnIDogJyd9PlllYXIgbmV3ZXN0IGZpcnN0PC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInllYXJfYXNjXCIgJHtfcHViU29ydE1vZGUgPT09ICd5ZWFyX2FzYycgPyAnc2VsZWN0ZWQnIDogJyd9PlllYXIgb2xkZXN0IGZpcnN0PC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInR5cGVfYXNjXCIgJHtfcHViU29ydE1vZGUgPT09ICd0eXBlX2FzYycgPyAnc2VsZWN0ZWQnIDogJyd9PlR5cGUgQVx1MjAxM1o8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwidHlwZV9kZXNjXCIgJHtfcHViU29ydE1vZGUgPT09ICd0eXBlX2Rlc2MnID8gJ3NlbGVjdGVkJyA6ICcnfT5UeXBlIFpcdTIwMTNBPC9vcHRpb24+XG4gICAgICAgIDwvc2VsZWN0PlxuICAgICAgPC9sYWJlbD5cbiAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjZweDtjb2xvcjojNDc1NTY5O2ZvbnQtc2l6ZTowLjllbTtcIj5cbiAgICAgICAgR3JvdXBcbiAgICAgICAgPHNlbGVjdCBpZD1cIm1hc3Rlci1wdWItZ3JvdXAtc2VsZWN0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDphdXRvO21pbi13aWR0aDoxNDBweDtcIiBvbmNoYW5nZT1cInNldFB1YmxpY2F0aW9uR3JvdXBNb2RlKHRoaXMudmFsdWUpXCI+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIm5vbmVcIiAke19wdWJHcm91cE1vZGUgPT09ICdub25lJyA/ICdzZWxlY3RlZCcgOiAnJ30+Tm8gZ3JvdXBpbmc8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwieWVhclwiICR7X3B1Ykdyb3VwTW9kZSA9PT0gJ3llYXInID8gJ3NlbGVjdGVkJyA6ICcnfT5CeSB5ZWFyPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInR5cGVcIiAke19wdWJHcm91cE1vZGUgPT09ICd0eXBlJyA/ICdzZWxlY3RlZCcgOiAnJ30+QnkgdHlwZTwvb3B0aW9uPlxuICAgICAgICA8L3NlbGVjdD5cbiAgICAgIDwvbGFiZWw+XG4gICAgPC9kaXY+YDtcbiAgaWYgKCFwdWJzLmxlbmd0aCkge1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBgJHtjb250cm9sc0h0bWx9PHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO3BhZGRpbmc6MTJweCAwO1wiPk5vIHB1YmxpY2F0aW9ucyBvbiBmaWxlLiBDbGljayBcIisgQWRkIFB1YmxpY2F0aW9uXCIgYWJvdmUsIG9yIHN3aXRjaCB0byBSYXcgQmliVGVYIHRvIHBhc3RlL2ltcG9ydCBlbnRyaWVzLjwvcD5gO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBzb3J0ZWQgPSBbLi4ucHVic10uc29ydChfY29tcGFyZVB1YmxpY2F0aW9ucyk7XG4gIGNvbnN0IGdyb3VwcyA9IFtdO1xuICBmb3IgKGNvbnN0IHB1YiBvZiBzb3J0ZWQpIHtcbiAgICBjb25zdCBsYWJlbCA9IF9ncm91cFB1YmxpY2F0aW9uTGFiZWwocHViKTtcbiAgICBsZXQgZ3JvdXAgPSBncm91cHMuZmluZCgoZW50cnkpID0+IGVudHJ5LmxhYmVsID09PSBsYWJlbCk7XG4gICAgaWYgKCFncm91cCkge1xuICAgICAgZ3JvdXAgPSB7IGxhYmVsLCBpdGVtczogW10gfTtcbiAgICAgIGdyb3Vwcy5wdXNoKGdyb3VwKTtcbiAgICB9XG4gICAgZ3JvdXAuaXRlbXMucHVzaChwdWIpO1xuICB9XG4gIGNvbnN0IHNlY3Rpb25IdG1sID0gZ3JvdXBzLm1hcCgoeyBsYWJlbCwgaXRlbXMgfSkgPT4ge1xuICAgIGNvbnN0IGhlYWRpbmdIdG1sID0gX3B1Ykdyb3VwTW9kZSA9PT0gJ25vbmUnXG4gICAgICA/ICcnXG4gICAgICA6IGA8ZGl2IHN0eWxlPVwibWFyZ2luOjE2cHggMCA4cHg7Zm9udC1zaXplOjAuOWVtO2ZvbnQtd2VpZ2h0OjcwMDtjb2xvcjojMzM0MTU1O1wiPiR7ZXNjYXBlSHRtbChsYWJlbCl9PC9kaXY+YDtcbiAgICBjb25zdCByb3dzID0gaXRlbXMubWFwKHB1YiA9PiB7XG4gICAgY29uc3Qga2V5ICAgICAgPSBlc2NhcGVIdG1sKHB1Yi5rZXkgfHwgJycpO1xuICAgIGNvbnN0IHR5cGUgICAgID0gZXNjYXBlSHRtbChwdWIudHlwZSB8fCAnJyk7XG4gICAgY29uc3QgY2l0YXRpb24gPSBlc2NhcGVIdG1sKChwdWIuZm9ybWF0dGVkX2NpdGF0aW9uIHx8ICcnKS5zbGljZSgwLCAxNjApKTtcbiAgICBjb25zdCBmdWxsICAgICA9IHB1Yi5mb3JtYXR0ZWRfY2l0YXRpb24gfHwgJyc7XG4gICAgY29uc3QgcHViSnNvbiAgPSBlc2NhcGVIdG1sKEpTT04uc3RyaW5naWZ5KHB1YikpO1xuICAgIHJldHVybiBgXG4gICAgICA8dHI+XG4gICAgICAgIDx0ZD5cbiAgICAgICAgICA8Y29kZSBzdHlsZT1cImZvbnQtc2l6ZTowLjhlbTtjb2xvcjojNDc1NTY5O1wiPiR7a2V5fTwvY29kZT5cbiAgICAgICAgICAke2NpdGF0aW9uID8gYDxicj48c21hbGwgc3R5bGU9XCJjb2xvcjojNmI3MjgwO1wiPiR7Y2l0YXRpb259JHtmdWxsLmxlbmd0aCA+IDE2MCA/ICdcdTIwMjYnIDogJyd9PC9zbWFsbD5gIDogJyd9XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO2NvbG9yOiM0NzU1Njk7Zm9udC1zaXplOjAuODVlbTtcIj4ke3R5cGV9PC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwiYWN0aW9uLWJ0bnNcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBvbmNsaWNrPVwiZWRpdE1hc3RlclB1YmxpY2F0aW9uKCR7cHViSnNvbn0pXCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkVkaXQgcHVibGljYXRpb246ICR7a2V5fVwiIHRpdGxlPVwiRWRpdFwiPlx1MjcwRlx1RkUwRjwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIG9uY2xpY2s9XCJkZWxldGVNYXN0ZXJQdWJsaWNhdGlvbignJHtrZXl9JylcIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiRGVsZXRlIHB1YmxpY2F0aW9uOiAke2tleX1cIiB0aXRsZT1cIkRlbGV0ZVwiPlx1RDgzRFx1REREMVx1RkUwRjwvYnV0dG9uPlxuICAgICAgICA8L3RkPlxuICAgICAgPC90cj5gO1xuICAgIH0pLmpvaW4oJycpO1xuICAgIHJldHVybiBgJHtoZWFkaW5nSHRtbH1cbiAgICA8dGFibGUgY2xhc3M9XCJyZXZpZXctdGFibGVcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCI+XG4gICAgICA8dGhlYWQ+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8dGg+UHVibGljYXRpb248L3RoPlxuICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOjExMHB4O3RleHQtYWxpZ246Y2VudGVyO1wiPlR5cGU8L3RoPlxuICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOjgwcHg7XCI+QWN0aW9uczwvdGg+XG4gICAgICAgIDwvdHI+XG4gICAgICA8L3RoZWFkPlxuICAgICAgPHRib2R5PiR7cm93c308L3Rib2R5PlxuICAgIDwvdGFibGU+YDtcbiAgfSkuam9pbignJyk7XG4gIGNvbnRhaW5lci5pbm5lckhUTUwgPSBgJHtjb250cm9sc0h0bWx9JHtzZWN0aW9uSHRtbH1gO1xufVxuXG4vKiogVmFsaWRhdGUgQmliVGVYIGluIHRoZSB0ZXh0YXJlYSB3aXRob3V0IHNhdmluZy4gKi9cbmFzeW5jIGZ1bmN0aW9uIHZhbGlkYXRlUHVibGljYXRpb25zQmliKCkge1xuICBjb25zdCB0YSAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi10ZXh0YXJlYScpO1xuICBjb25zdCBzdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1zdGF0dXMnKTtcbiAgaWYgKCF0YSB8fCAhc3RhdHVzKSByZXR1cm47XG4gIGNvbnN0IHRleHQgPSB0YS52YWx1ZTtcbiAgaWYgKCF0ZXh0LnRyaW0oKSkge1xuICAgIHN0YXR1cy50ZXh0Q29udGVudCA9ICdcdTIxMzlcdUZFMEYgRW1wdHkgXHUyMDE0IG5vdGhpbmcgdG8gdmFsaWRhdGUuJztcbiAgICBzdGF0dXMuc3R5bGUuY29sb3IgPSAnIzZiNzI4MCc7XG4gICAgcmV0dXJuO1xuICB9XG4gIHN0YXR1cy50ZXh0Q29udGVudCA9ICdcdUQ4M0RcdUREMEQgVmFsaWRhdGluZ1x1MjAyNic7XG4gIHN0YXR1cy5zdHlsZS5jb2xvciA9ICcjNmI3MjgwJztcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvcHVibGljYXRpb25zL3ZhbGlkYXRlJywge1xuICAgICAgbWV0aG9kOiAgJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiAgICBKU09OLnN0cmluZ2lmeSh7IGJpYnRleF90ZXh0OiB0ZXh0IH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBjb25zdCBuID0gZGF0YS5jb3VudCA/PyAwO1xuICAgICAgc3RhdHVzLnRleHRDb250ZW50ID0gYFx1MjcwNSBWYWxpZCBcdTIwMTQgJHtufSBlbnRyJHtuICE9PSAxID8gJ2llcycgOiAneSd9IGZvdW5kLmA7XG4gICAgICBzdGF0dXMuc3R5bGUuY29sb3IgPSAnIzE1ODAzZCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXR1cy50ZXh0Q29udGVudCA9ICdcdTI3NEMgJyArIChkYXRhLmVycm9yIHx8ICdWYWxpZGF0aW9uIGZhaWxlZCcpO1xuICAgICAgc3RhdHVzLnN0eWxlLmNvbG9yID0gJyNkYzI2MjYnO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgc3RhdHVzLnRleHRDb250ZW50ID0gJ1x1Mjc0QyAnICsgZXJyLm1lc3NhZ2U7XG4gICAgc3RhdHVzLnN0eWxlLmNvbG9yID0gJyNkYzI2MjYnO1xuICB9XG59XG5cbi8qKiBTYXZlIHJhdyBCaWJUZVggKHZhbGlkYXRlcyBzZXJ2ZXItc2lkZSBiZWZvcmUgd3JpdGluZykuICovXG5hc3luYyBmdW5jdGlvbiBzYXZlUHVibGljYXRpb25zQmliKCkge1xuICBjb25zdCB0YSAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi10ZXh0YXJlYScpO1xuICBjb25zdCBzdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1zdGF0dXMnKTtcbiAgY29uc3QgYnRuICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItc2F2ZS1idG4nKTtcbiAgaWYgKCF0YSkgcmV0dXJuO1xuICBjb25zdCBjb250ZW50ID0gdGEudmFsdWU7XG4gIGlmIChidG4pIHsgYnRuLmRpc2FibGVkID0gdHJ1ZTsgYnRuLnRleHRDb250ZW50ID0gJ1x1MjNGMyBTYXZpbmdcdTIwMjYnOyB9XG4gIGlmIChzdGF0dXMpIHsgc3RhdHVzLnRleHRDb250ZW50ID0gJyc7IHN0YXR1cy5zdHlsZS5jb2xvciA9ICcjNmI3MjgwJzsgfVxuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS9wdWJsaWNhdGlvbnMnLCB7XG4gICAgICBtZXRob2Q6ICAnUFVUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogICAgSlNPTi5zdHJpbmdpZnkoeyBjb250ZW50IH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBjb25zdCBuID0gZGF0YS5jb3VudCA/PyAwO1xuICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICBzdGF0dXMudGV4dENvbnRlbnQgPSBgXHUyNzA1IFNhdmVkIFx1MjAxNCAke259IGVudHIke24gIT09IDEgPyAnaWVzJyA6ICd5J30gcGFyc2VkLmA7XG4gICAgICAgIHN0YXR1cy5zdHlsZS5jb2xvciA9ICcjMTU4MDNkJztcbiAgICAgIH1cbiAgICAgIF91cGRhdGVQdWJDb3VudChuKTtcbiAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ1B1YmxpY2F0aW9ucycsICd1cGRhdGVkJyk7XG4gICAgICAvLyBSZWZyZXNoIENSVUQgbGlzdCB0byBzdGF5IGluIHN5bmNcbiAgICAgIGF3YWl0IGxvYWRQdWJsaWNhdGlvbnMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICBzdGF0dXMudGV4dENvbnRlbnQgPSAnXHUyNzRDICcgKyAoZGF0YS5lcnJvciB8fCAnU2F2ZSBmYWlsZWQnKTtcbiAgICAgICAgc3RhdHVzLnN0eWxlLmNvbG9yID0gJyNkYzI2MjYnO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKHN0YXR1cykge1xuICAgICAgc3RhdHVzLnRleHRDb250ZW50ID0gJ1x1Mjc0QyAnICsgZXJyLm1lc3NhZ2U7XG4gICAgICBzdGF0dXMuc3R5bGUuY29sb3IgPSAnI2RjMjYyNic7XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIGlmIChidG4pIHsgYnRuLmRpc2FibGVkID0gZmFsc2U7IGJ0bi50ZXh0Q29udGVudCA9ICdcdUQ4M0RcdURDQkUgU2F2ZSc7IH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzaG93SW1wb3J0UHVibGljYXRpb25zTW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWltcG9ydC10ZXh0YXJlYScpLnZhbHVlID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWltcG9ydC1vdmVyd3JpdGUnKS5jaGVja2VkID0gZmFsc2U7XG4gIF9zZXRQdWJsaWNhdGlvblN0YXR1cygnbWFzdGVyLXB1Yi1pbXBvcnQtc3RhdHVzJywgJycpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1pbXBvcnQtbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgc2V0SW5pdGlhbEZvY3VzKCdtYXN0ZXItcHViLWltcG9ydC1tb2RhbC1vdmVybGF5Jyk7XG4gIHRyYXBGb2N1cygnbWFzdGVyLXB1Yi1pbXBvcnQtbW9kYWwtb3ZlcmxheScpO1xufVxuXG5mdW5jdGlvbiBjbG9zZUltcG9ydFB1YmxpY2F0aW9uc01vZGFsKCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1pbXBvcnQtbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHJlc3RvcmVGb2N1cygpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBpbXBvcnRQdWJsaWNhdGlvbnNCaWIoKSB7XG4gIGNvbnN0IHRleHRhcmVhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItaW1wb3J0LXRleHRhcmVhJyk7XG4gIGNvbnN0IG92ZXJ3cml0ZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWltcG9ydC1vdmVyd3JpdGUnKTtcbiAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItaW1wb3J0LXN1Ym1pdC1idG4nKTtcbiAgaWYgKCF0ZXh0YXJlYSkgcmV0dXJuO1xuICBjb25zdCBiaWJ0ZXhUZXh0ID0gdGV4dGFyZWEudmFsdWUudHJpbSgpO1xuICBpZiAoIWJpYnRleFRleHQpIHtcbiAgICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItaW1wb3J0LXN0YXR1cycsICdcdTI2QTBcdUZFMEYgUGFzdGUgQmliVGVYIGVudHJpZXMgdG8gaW1wb3J0LicsICcjZGMyNjI2Jyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChidXR0b24pIHtcbiAgICBidXR0b24uZGlzYWJsZWQgPSB0cnVlO1xuICAgIGJ1dHRvbi50ZXh0Q29udGVudCA9ICdcdTIzRjMgSW1wb3J0aW5nXHUyMDI2JztcbiAgfVxuICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItaW1wb3J0LXN0YXR1cycsICdJbXBvcnRpbmcgQmliVGVYXHUyMDI2Jyk7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvcHVibGljYXRpb25zL2ltcG9ydCcsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGJpYnRleF90ZXh0OiBiaWJ0ZXhUZXh0LFxuICAgICAgICBvdmVyd3JpdGU6IEJvb2xlYW4ob3ZlcndyaXRlPy5jaGVja2VkKSxcbiAgICAgIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBjb25zdCBwYXJ0cyA9IFtcbiAgICAgICAgYCR7ZGF0YS5hZGRlZCB8fCAwfSBhZGRlZGAsXG4gICAgICAgIGAke2RhdGEudXBkYXRlZCB8fCAwfSB1cGRhdGVkYCxcbiAgICAgICAgYCR7ZGF0YS5za2lwcGVkIHx8IDB9IHNraXBwZWRgLFxuICAgICAgXTtcbiAgICAgIGlmIChkYXRhLmludmFsaWQpIHBhcnRzLnB1c2goYCR7ZGF0YS5pbnZhbGlkfSByZWplY3RlZCAobWlzc2luZyByZXF1aXJlZCBmaWVsZHMpYCk7XG4gICAgICBjb25zdCBza2lwcGVkRGV0YWlsID0gKGRhdGEuc2tpcHBlZF9rZXlzPy5sZW5ndGgpXG4gICAgICAgID8gYFxcblxcblNraXBwZWQgKGFscmVhZHkgZXhpc3QgXHUyMDE0IGVuYWJsZSBcIk92ZXJ3cml0ZVwiIHRvIHVwZGF0ZSk6XFxuXHUyMDIyICR7ZGF0YS5za2lwcGVkX2tleXMuam9pbignXFxuXHUyMDIyICcpfWBcbiAgICAgICAgOiAnJztcbiAgICAgIGNvbnN0IGludmFsaWREZXRhaWwgPSAoZGF0YS5pbnZhbGlkX2tleXM/Lmxlbmd0aClcbiAgICAgICAgPyBgXFxuXFxuUmVqZWN0ZWQgKG1pc3NpbmcgdGl0bGUsIHllYXIsIG9yIGF1dGhvcik6XFxuXHUyMDIyICR7ZGF0YS5pbnZhbGlkX2tleXMuam9pbignXFxuXHUyMDIyICcpfWBcbiAgICAgICAgOiAnJztcbiAgICAgIF9zZXRQdWJsaWNhdGlvblN0YXR1cygnbWFzdGVyLXB1Yi1pbXBvcnQtc3RhdHVzJywgYFx1MjcwNSBJbXBvcnRlZDogJHtwYXJ0cy5qb2luKCcsICcpfS5gLCAnIzE1ODAzZCcpO1xuICAgICAgX3NldE1hc3RlckNoYW5nZU5vdGljZSgnUHVibGljYXRpb25zJywgJ2ltcG9ydGVkJyk7XG4gICAgICBhd2FpdCBsb2FkUHVibGljYXRpb25zKCk7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzA1IEltcG9ydGVkJywgYEltcG9ydGVkIEJpYlRlWCBlbnRyaWVzOiAke3BhcnRzLmpvaW4oJywgJyl9LiR7c2tpcHBlZERldGFpbH0ke2ludmFsaWREZXRhaWx9YCk7XG4gICAgICBjbG9zZUltcG9ydFB1YmxpY2F0aW9uc01vZGFsKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIF9zZXRQdWJsaWNhdGlvblN0YXR1cygnbWFzdGVyLXB1Yi1pbXBvcnQtc3RhdHVzJywgYFx1Mjc0QyAke2RhdGEuZXJyb3IgfHwgJ0ltcG9ydCBmYWlsZWQnfWAsICcjZGMyNjI2Jyk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItaW1wb3J0LXN0YXR1cycsIGBcdTI3NEMgJHtlcnIubWVzc2FnZX1gLCAnI2RjMjYyNicpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChidXR0b24pIHtcbiAgICAgIGJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgYnV0dG9uLnRleHRDb250ZW50ID0gJ0ltcG9ydCc7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNob3dDb252ZXJ0UHVibGljYXRpb25zTW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNvbnZlcnQtaW5wdXQnKS52YWx1ZSA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1jb252ZXJ0LW91dHB1dCcpLnZhbHVlID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNvbnZlcnQtb3ZlcndyaXRlJykuY2hlY2tlZCA9IGZhbHNlO1xuICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItY29udmVydC1zdGF0dXMnLCAnJyk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNvbnZlcnQtbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgc2V0SW5pdGlhbEZvY3VzKCdtYXN0ZXItcHViLWNvbnZlcnQtbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ21hc3Rlci1wdWItY29udmVydC1tb2RhbC1vdmVybGF5Jyk7XG59XG5cbmZ1bmN0aW9uIGNsb3NlQ29udmVydFB1YmxpY2F0aW9uc01vZGFsKCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1jb252ZXJ0LW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICByZXN0b3JlRm9jdXMoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29udmVydFB1YmxpY2F0aW9uVGV4dCgpIHtcbiAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1jb252ZXJ0LWlucHV0Jyk7XG4gIGNvbnN0IG91dHB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNvbnZlcnQtb3V0cHV0Jyk7XG4gIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNvbnZlcnQtc3VibWl0LWJ0bicpO1xuICBpZiAoIWlucHV0IHx8ICFvdXRwdXQpIHJldHVybjtcbiAgY29uc3QgdGV4dCA9IGlucHV0LnZhbHVlLnRyaW0oKTtcbiAgaWYgKCF0ZXh0KSB7XG4gICAgX3NldFB1YmxpY2F0aW9uU3RhdHVzKCdtYXN0ZXItcHViLWNvbnZlcnQtc3RhdHVzJywgJ1x1MjZBMFx1RkUwRiBQYXN0ZSBjaXRhdGlvbiB0ZXh0IHRvIGNvbnZlcnQuJywgJyNkYzI2MjYnKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGJ1dHRvbikge1xuICAgIGJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7XG4gICAgYnV0dG9uLnRleHRDb250ZW50ID0gJ1x1MjNGMyBHZW5lcmF0aW5nXHUyMDI2JztcbiAgfVxuICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItY29udmVydC1zdGF0dXMnLCAnR2VuZXJhdGluZyBCaWJUZVggcHJldmlld1x1MjAyNicpO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL3B1YmxpY2F0aW9ucy9jb252ZXJ0Jywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgdGV4dCB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgb3V0cHV0LnZhbHVlID0gZGF0YS5iaWJ0ZXggfHwgJyc7XG4gICAgICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItY29udmVydC1zdGF0dXMnLCAnXHUyNzA1IFJldmlldyB0aGUgZ2VuZXJhdGVkIEJpYlRlWCwgdGhlbiBpbXBvcnQgaXQgaWYgaXQgbG9va3MgY29ycmVjdC4nLCAnIzE1ODAzZCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItY29udmVydC1zdGF0dXMnLCBgXHUyNzRDICR7ZGF0YS5lcnJvciB8fCAnQ29udmVyc2lvbiBmYWlsZWQnfWAsICcjZGMyNjI2Jyk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItY29udmVydC1zdGF0dXMnLCBgXHUyNzRDICR7ZXJyLm1lc3NhZ2V9YCwgJyNkYzI2MjYnKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoYnV0dG9uKSB7XG4gICAgICBidXR0b24uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIGJ1dHRvbi50ZXh0Q29udGVudCA9ICdHZW5lcmF0ZSBCaWJUZVgnO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBpbXBvcnRDb252ZXJ0ZWRQdWJsaWNhdGlvblRleHQoKSB7XG4gIGNvbnN0IG91dHB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNvbnZlcnQtb3V0cHV0Jyk7XG4gIGNvbnN0IG92ZXJ3cml0ZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNvbnZlcnQtb3ZlcndyaXRlJyk7XG4gIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNvbnZlcnQtaW1wb3J0LWJ0bicpO1xuICBpZiAoIW91dHB1dCkgcmV0dXJuO1xuICBjb25zdCBiaWJ0ZXhUZXh0ID0gb3V0cHV0LnZhbHVlLnRyaW0oKTtcbiAgaWYgKCFiaWJ0ZXhUZXh0KSB7XG4gICAgX3NldFB1YmxpY2F0aW9uU3RhdHVzKCdtYXN0ZXItcHViLWNvbnZlcnQtc3RhdHVzJywgJ1x1MjZBMFx1RkUwRiBHZW5lcmF0ZSBvciBlZGl0IEJpYlRlWCBiZWZvcmUgaW1wb3J0aW5nLicsICcjZGMyNjI2Jyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChidXR0b24pIHtcbiAgICBidXR0b24uZGlzYWJsZWQgPSB0cnVlO1xuICAgIGJ1dHRvbi50ZXh0Q29udGVudCA9ICdcdTIzRjMgSW1wb3J0aW5nXHUyMDI2JztcbiAgfVxuICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItY29udmVydC1zdGF0dXMnLCAnSW1wb3J0aW5nIHJldmlld2VkIEJpYlRlWFx1MjAyNicpO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL3B1YmxpY2F0aW9ucy9pbXBvcnQnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBiaWJ0ZXhfdGV4dDogYmlidGV4VGV4dCxcbiAgICAgICAgb3ZlcndyaXRlOiBCb29sZWFuKG92ZXJ3cml0ZT8uY2hlY2tlZCksXG4gICAgICB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgY29uc3QgcGFydHMgPSBbXG4gICAgICAgIGAke2RhdGEuYWRkZWQgfHwgMH0gYWRkZWRgLFxuICAgICAgICBgJHtkYXRhLnVwZGF0ZWQgfHwgMH0gdXBkYXRlZGAsXG4gICAgICAgIGAke2RhdGEuc2tpcHBlZCB8fCAwfSBza2lwcGVkYCxcbiAgICAgIF07XG4gICAgICBpZiAoZGF0YS5pbnZhbGlkKSBwYXJ0cy5wdXNoKGAke2RhdGEuaW52YWxpZH0gcmVqZWN0ZWQgKG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzKWApO1xuICAgICAgY29uc3Qgc2tpcHBlZERldGFpbCA9IChkYXRhLnNraXBwZWRfa2V5cz8ubGVuZ3RoKVxuICAgICAgICA/IGBcXG5cXG5Ta2lwcGVkIChhbHJlYWR5IGV4aXN0IFx1MjAxNCBlbmFibGUgXCJPdmVyd3JpdGVcIiB0byB1cGRhdGUpOlxcblx1MjAyMiAke2RhdGEuc2tpcHBlZF9rZXlzLmpvaW4oJ1xcblx1MjAyMiAnKX1gXG4gICAgICAgIDogJyc7XG4gICAgICBjb25zdCBpbnZhbGlkRGV0YWlsID0gKGRhdGEuaW52YWxpZF9rZXlzPy5sZW5ndGgpXG4gICAgICAgID8gYFxcblxcblJlamVjdGVkIChtaXNzaW5nIHRpdGxlLCB5ZWFyLCBvciBhdXRob3IpOlxcblx1MjAyMiAke2RhdGEuaW52YWxpZF9rZXlzLmpvaW4oJ1xcblx1MjAyMiAnKX1gXG4gICAgICAgIDogJyc7XG4gICAgICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItY29udmVydC1zdGF0dXMnLCBgXHUyNzA1IEltcG9ydGVkIHByZXZpZXc6ICR7cGFydHMuam9pbignLCAnKX0uYCwgJyMxNTgwM2QnKTtcbiAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ1B1YmxpY2F0aW9ucycsICdpbXBvcnRlZCcpO1xuICAgICAgYXdhaXQgbG9hZFB1YmxpY2F0aW9ucygpO1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjcwNSBJbXBvcnRlZCcsIGBJbXBvcnRlZCBnZW5lcmF0ZWQgQmliVGVYOiAke3BhcnRzLmpvaW4oJywgJyl9LiR7c2tpcHBlZERldGFpbH0ke2ludmFsaWREZXRhaWx9YCk7XG4gICAgICBjbG9zZUNvbnZlcnRQdWJsaWNhdGlvbnNNb2RhbCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItY29udmVydC1zdGF0dXMnLCBgXHUyNzRDICR7ZGF0YS5lcnJvciB8fCAnSW1wb3J0IGZhaWxlZCd9YCwgJyNkYzI2MjYnKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIF9zZXRQdWJsaWNhdGlvblN0YXR1cygnbWFzdGVyLXB1Yi1jb252ZXJ0LXN0YXR1cycsIGBcdTI3NEMgJHtlcnIubWVzc2FnZX1gLCAnI2RjMjYyNicpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChidXR0b24pIHtcbiAgICAgIGJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgYnV0dG9uLnRleHRDb250ZW50ID0gJ0ltcG9ydCBQcmV2aWV3JztcbiAgICB9XG4gIH1cbn1cblxuLy8gLS0tLSBQdWJsaWNhdGlvbiBhZGQvZWRpdCBtb2RhbCAtLS0tXG5cbmZ1bmN0aW9uIHNob3dBZGRQdWJsaWNhdGlvbk1vZGFsKCkge1xuICBfcHViTW9kYWxVc2VzRWRpdG9yRmllbGQgPSBmYWxzZTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1rZXknKS52YWx1ZSAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLW1vZGFsLXR5cGUnKS52YWx1ZSAgID0gJ2FydGljbGUnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLW1vZGFsLWF1dGhvcicpLnZhbHVlID0gJyc7XG4gIGNvbnN0IGF1dGhvckxhYmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1hdXRob3ItbGFiZWwnKTtcbiAgaWYgKGF1dGhvckxhYmVsKSBhdXRob3JMYWJlbC50ZXh0Q29udGVudCA9ICdBdXRob3IocyknO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLW1vZGFsLXRpdGxlJykudmFsdWUgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWItbW9kYWwteWVhcicpLnZhbHVlICAgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1qb3VybmFsJykudmFsdWUgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1kb2knKS52YWx1ZSAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLW1vZGFsLWV4dHJhJykudmFsdWUgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWItbW9kYWwta2V5JykuZGlzYWJsZWQgPSBmYWxzZTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC10aXRsZS1oZWFkaW5nJykudGV4dENvbnRlbnQgPSAnQWRkIFB1YmxpY2F0aW9uJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgc2V0SW5pdGlhbEZvY3VzKCdtYXN0ZXItcHViLW1vZGFsLW92ZXJsYXknKTtcbiAgdHJhcEZvY3VzKCdtYXN0ZXItcHViLW1vZGFsLW92ZXJsYXknKTtcbn1cblxuZnVuY3Rpb24gZWRpdE1hc3RlclB1YmxpY2F0aW9uKHB1Yikge1xuICBjb25zdCBmaWVsZHMgPSBwdWIuZmllbGRzIHx8IHt9O1xuICAvLyBUcmFjayB3aGV0aGVyIHRoaXMgZW50cnkgdXNlcyBgZWRpdG9yYCBzbyB3ZSBwcmVzZXJ2ZSBpdCBvbiBzYXZlXG4gIF9wdWJNb2RhbFVzZXNFZGl0b3JGaWVsZCA9ICFmaWVsZHMuYXV0aG9yICYmICEhZmllbGRzLmVkaXRvcjtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1rZXknKS52YWx1ZSAgICAgPSBwdWIua2V5IHx8ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLW1vZGFsLXR5cGUnKS52YWx1ZSAgICA9IHB1Yi50eXBlIHx8ICdhcnRpY2xlJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1hdXRob3InKS52YWx1ZSAgPSBmaWVsZHMuYXV0aG9yIHx8IGZpZWxkcy5lZGl0b3IgfHwgJyc7XG4gIC8vIFVwZGF0ZSB0aGUgQXV0aG9yL0VkaXRvciBsYWJlbCBzbyB0aGUgdXNlciBrbm93cyB3aGljaCBmaWVsZCBpcyBiZWluZyBlZGl0ZWRcbiAgY29uc3QgYXV0aG9yTGFiZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLW1vZGFsLWF1dGhvci1sYWJlbCcpO1xuICBpZiAoYXV0aG9yTGFiZWwpIGF1dGhvckxhYmVsLnRleHRDb250ZW50ID0gX3B1Yk1vZGFsVXNlc0VkaXRvckZpZWxkID8gJ0VkaXRvcihzKScgOiAnQXV0aG9yKHMpJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC10aXRsZScpLnZhbHVlICAgPSBmaWVsZHMudGl0bGUgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWItbW9kYWwteWVhcicpLnZhbHVlICAgID0gZmllbGRzLnllYXIgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWItbW9kYWwtam91cm5hbCcpLnZhbHVlID0gZmllbGRzLmpvdXJuYWwgfHwgZmllbGRzLmJvb2t0aXRsZSB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1kb2knKS52YWx1ZSAgICAgPSBmaWVsZHMuZG9pIHx8ICcnO1xuICAvLyBFeHRyYTogcmVtYWluaW5nIG5vbi1zdGFuZGFyZCBmaWVsZHMgYXMga2V5PXZhbHVlIGxpbmVzXG4gIGNvbnN0IGtub3duID0gbmV3IFNldChbJ2F1dGhvcicsJ2VkaXRvcicsJ3RpdGxlJywneWVhcicsJ2pvdXJuYWwnLCdib29rdGl0bGUnLCdkb2knXSk7XG4gIGNvbnN0IGV4dHJhID0gT2JqZWN0LmVudHJpZXMoZmllbGRzKVxuICAgIC5maWx0ZXIoKFtrXSkgPT4gIWtub3duLmhhcyhrKSlcbiAgICAubWFwKChbaywgdl0pID0+IGAke2t9PSR7dn1gKVxuICAgIC5qb2luKCdcXG4nKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1leHRyYScpLnZhbHVlICAgPSBleHRyYTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1rZXknKS5kaXNhYmxlZCAgPSB0cnVlOyAgLy8ga2V5IGlzIGltbXV0YWJsZSBvbiBlZGl0XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWItbW9kYWwtdGl0bGUtaGVhZGluZycpLnRleHRDb250ZW50ID0gJ0VkaXQgUHVibGljYXRpb24nO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBzZXRJbml0aWFsRm9jdXMoJ21hc3Rlci1wdWItbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ21hc3Rlci1wdWItbW9kYWwtb3ZlcmxheScpO1xufVxuXG5mdW5jdGlvbiBjbG9zZVB1YmxpY2F0aW9uTW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICByZXN0b3JlRm9jdXMoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZU1hc3RlclB1YmxpY2F0aW9uKCkge1xuICBjb25zdCBrZXlFbCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLW1vZGFsLWtleScpO1xuICBjb25zdCBrZXkgICAgPSBrZXlFbC52YWx1ZS50cmltKCk7XG4gIGNvbnN0IGFjdGlvbiA9IGtleUVsLmRpc2FibGVkID8gJ3VwZGF0ZScgOiAnYWRkJztcbiAgaWYgKCFrZXkpIHsgc2hvd0FsZXJ0TW9kYWwoJ1x1MjZBMFx1RkUwRiBWYWxpZGF0aW9uJywgJ0NpdGUga2V5IGlzIHJlcXVpcmVkLicpOyByZXR1cm47IH1cbiAgY29uc3QgdHlwZSAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC10eXBlJykudmFsdWUudHJpbSgpIHx8ICdhcnRpY2xlJztcbiAgY29uc3QgYXV0aG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1hdXRob3InKS52YWx1ZS50cmltKCk7XG4gIGNvbnN0IHRpdGxlICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWItbW9kYWwtdGl0bGUnKS52YWx1ZS50cmltKCk7XG4gIGNvbnN0IHllYXIgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWItbW9kYWwteWVhcicpLnZhbHVlLnRyaW0oKTtcbiAgaWYgKCF0aXRsZSkgIHsgc2hvd0FsZXJ0TW9kYWwoJ1x1MjZBMFx1RkUwRiBWYWxpZGF0aW9uJywgJ1RpdGxlIGlzIHJlcXVpcmVkLicpOyByZXR1cm47IH1cbiAgaWYgKCF5ZWFyKSAgIHsgc2hvd0FsZXJ0TW9kYWwoJ1x1MjZBMFx1RkUwRiBWYWxpZGF0aW9uJywgJ1llYXIgaXMgcmVxdWlyZWQuJyk7IHJldHVybjsgfVxuICBpZiAoIWF1dGhvcikgeyBzaG93QWxlcnRNb2RhbCgnXHUyNkEwXHVGRTBGIFZhbGlkYXRpb24nLCAnQXV0aG9yIG9yIGVkaXRvciBpcyByZXF1aXJlZC4nKTsgcmV0dXJuOyB9XG4gIC8vIFByZXNlcnZlIHRoZSBvcmlnaW5hbCBmaWVsZCBuYW1lOiBlZGl0b3IgZW50cmllcyBtdXN0IG5vdCBiZSBzYXZlZCBhcyBhdXRob3JcbiAgY29uc3QgZmllbGRzID0gX3B1Yk1vZGFsVXNlc0VkaXRvckZpZWxkID8geyBlZGl0b3I6IGF1dGhvciwgdGl0bGUsIHllYXIgfSA6IHsgYXV0aG9yLCB0aXRsZSwgeWVhciB9O1xuICBjb25zdCBqb3VybmFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1qb3VybmFsJykudmFsdWUudHJpbSgpO1xuICBpZiAoam91cm5hbCkge1xuICAgIGZpZWxkc1t0eXBlID09PSAnaW5wcm9jZWVkaW5ncycgPyAnYm9va3RpdGxlJyA6ICdqb3VybmFsJ10gPSBqb3VybmFsO1xuICB9XG4gIGNvbnN0IGRvaSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWItbW9kYWwtZG9pJykudmFsdWUudHJpbSgpO1xuICBpZiAoZG9pKSBmaWVsZHMuZG9pID0gZG9pO1xuICAvLyBQYXJzZSBleHRyYSBmaWVsZHMgKGtleT12YWx1ZSBwZXIgbGluZSlcbiAgY29uc3QgZXh0cmEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLW1vZGFsLWV4dHJhJykudmFsdWU7XG4gIGZvciAoY29uc3QgbGluZSBvZiBleHRyYS5zcGxpdCgnXFxuJykpIHtcbiAgICBjb25zdCBlcSA9IGxpbmUuaW5kZXhPZignPScpO1xuICAgIGlmIChlcSA+IDApIHtcbiAgICAgIGNvbnN0IGsgPSBsaW5lLnNsaWNlKDAsIGVxKS50cmltKCk7XG4gICAgICBjb25zdCB2ID0gbGluZS5zbGljZShlcSArIDEpLnRyaW0oKTtcbiAgICAgIGlmIChrICYmIHYpIGZpZWxkc1trXSA9IHY7XG4gICAgfVxuICB9XG4gIGNvbnN0IGJvZHkgPSB7IGFjdGlvbiwga2V5LCB0eXBlLCBmaWVsZHMgfTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvcHVibGljYXRpb24nLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBjbG9zZVB1YmxpY2F0aW9uTW9kYWwoKTtcbiAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ1B1YmxpY2F0aW9ucycsIGRhdGEuYWN0aW9uIHx8ICd1cGRhdGVkJyk7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzA1IFNhdmVkJywgYFB1YmxpY2F0aW9uIFwiJHtrZXl9XCIgJHtkYXRhLmFjdGlvbn0uYCk7XG4gICAgICBhd2FpdCBsb2FkUHVibGljYXRpb25zKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCBkYXRhLmVycm9yIHx8ICdTYXZlIGZhaWxlZCcpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIHNhdmUgcHVibGljYXRpb24nKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVNYXN0ZXJQdWJsaWNhdGlvbihrZXkpIHtcbiAgc2hvd0NvbmZpcm1Nb2RhbChcbiAgICAnXHVEODNEXHVEREQxXHVGRTBGIERlbGV0ZSBQdWJsaWNhdGlvbicsXG4gICAgYERlbGV0ZSBcIiR7a2V5fVwiPyBUaGlzIGNhbm5vdCBiZSB1bmRvbmUuYCxcbiAgICBhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvcHVibGljYXRpb24nLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgYWN0aW9uOiAnZGVsZXRlJywga2V5IH0pLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICAgICAgX3NldE1hc3RlckNoYW5nZU5vdGljZSgnUHVibGljYXRpb25zJywgJ2RlbGV0ZWQnKTtcbiAgICAgICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzA1IERlbGV0ZWQnLCBgUHVibGljYXRpb24gXCIke2tleX1cIiByZW1vdmVkLmApO1xuICAgICAgICAgIGF3YWl0IGxvYWRQdWJsaWNhdGlvbnMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgZGF0YS5lcnJvciB8fCAnRGVsZXRlIGZhaWxlZCcpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIGRlbGV0ZSBwdWJsaWNhdGlvbicpO1xuICAgICAgfVxuICAgIH1cbiAgKTtcbn1cblxuZnVuY3Rpb24gX3JlbmRlckF3YXJkc0xpc3QoYXdhcmRzKSB7XG4gIGlmICghYXdhcmRzLmxlbmd0aCkge1xuICAgIHJldHVybiAnPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO3BhZGRpbmc6MTJweCAwO1wiPk5vIGF3YXJkcyBvbiBmaWxlLiBDbGljayBcIisgQWRkIEF3YXJkXCIgYWJvdmUuPC9wPic7XG4gIH1cbiAgY29uc3Qgcm93cyA9IGF3YXJkcy5tYXAoKGF3YXJkLCBpZHgpID0+IHtcbiAgICBjb25zdCB0aXRsZSA9IGVzY2FwZUh0bWwoYXdhcmQudGl0bGUgfHwgJycpO1xuICAgIGNvbnN0IHllYXIgID0gYXdhcmQueWVhciA/IFN0cmluZyhhd2FyZC55ZWFyKSA6ICdcdTIwMTQnO1xuICAgIGNvbnN0IGRlc2MgID0gZXNjYXBlSHRtbCgoYXdhcmQuZGVzY3JpcHRpb24gfHwgJycpLnNsaWNlKDAsIDEwMCkpO1xuICAgIGNvbnN0IGF3YXJkSnNvbiA9IGVzY2FwZUh0bWwoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgdGl0bGU6IGF3YXJkLnRpdGxlIHx8ICcnLCB5ZWFyOiBhd2FyZC55ZWFyIHx8ICcnLFxuICAgICAgZGVzY3JpcHRpb246IGF3YXJkLmRlc2NyaXB0aW9uIHx8ICcnLFxuICAgICAgcmVsZXZhbnRfZm9yOiAoYXdhcmQucmVsZXZhbnRfZm9yIHx8IFtdKS5qb2luKCcsICcpLFxuICAgIH0pKTtcbiAgICByZXR1cm4gYFxuICAgICAgPHRyPlxuICAgICAgICA8dGQ+XG4gICAgICAgICAgPHN0cm9uZz4ke3RpdGxlfTwvc3Ryb25nPlxuICAgICAgICAgICR7ZGVzYyA/IGA8YnI+PHNtYWxsIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtcIj4ke2Rlc2N9JHsoYXdhcmQuZGVzY3JpcHRpb258fCcnKS5sZW5ndGggPiAxMDAgPyAnXHUyMDI2JyA6ICcnfTwvc21hbGw+YCA6ICcnfVxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjtjb2xvcjojNDc1NTY5O1wiPiR7eWVhcn08L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJhY3Rpb24tYnRuc1wiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIG9uY2xpY2s9XCJlZGl0TWFzdGVyQXdhcmQoJHthd2FyZEpzb259LCAke2lkeH0pXCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkVkaXQgYXdhcmQ6ICR7dGl0bGV9XCIgdGl0bGU9XCJFZGl0XCI+XHUyNzBGXHVGRTBGPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgb25jbGljaz1cImRlbGV0ZU1hc3RlckF3YXJkKCR7aWR4fSwgJyR7dGl0bGV9JylcIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiRGVsZXRlIGF3YXJkOiAke3RpdGxlfVwiIHRpdGxlPVwiRGVsZXRlXCI+XHVEODNEXHVEREQxXHVGRTBGPC9idXR0b24+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L3RyPmA7XG4gIH0pLmpvaW4oJycpO1xuICByZXR1cm4gYFxuICAgIDx0YWJsZSBjbGFzcz1cInJldmlldy10YWJsZVwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIj5cbiAgICAgIDx0aGVhZD5cbiAgICAgICAgPHRyPlxuICAgICAgICAgIDx0aD5Bd2FyZDwvdGg+XG4gICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6NzBweDt0ZXh0LWFsaWduOmNlbnRlcjtcIj5ZZWFyPC90aD5cbiAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDo4MHB4O1wiPkFjdGlvbnM8L3RoPlxuICAgICAgICA8L3RyPlxuICAgICAgPC90aGVhZD5cbiAgICAgIDx0Ym9keT4ke3Jvd3N9PC90Ym9keT5cbiAgICA8L3RhYmxlPmA7XG59XG5cblxuZnVuY3Rpb24gX3JlbmRlckNlcnRpZmljYXRpb25zTGlzdChjZXJ0cykge1xuICBpZiAoIWNlcnRzLmxlbmd0aCkge1xuICAgIHJldHVybiAnPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO3BhZGRpbmc6MTJweCAwO1wiPk5vIGNlcnRpZmljYXRpb25zIG9uIGZpbGUuIENsaWNrIFwiKyBBZGQgQ2VydGlmaWNhdGlvblwiIGFib3ZlLjwvcD4nO1xuICB9XG4gIGNvbnN0IHJvd3MgPSBjZXJ0cy5tYXAoKGNlcnQsIGlkeCkgPT4ge1xuICAgIGNvbnN0IG5hbWUgICA9IGVzY2FwZUh0bWwoY2VydC5uYW1lIHx8ICcnKTtcbiAgICBjb25zdCBpc3N1ZXIgPSBlc2NhcGVIdG1sKGNlcnQuaXNzdWVyIHx8ICdcdTIwMTQnKTtcbiAgICBjb25zdCB5ZWFyICAgPSBjZXJ0LnllYXIgPyBTdHJpbmcoY2VydC55ZWFyKSA6ICdcdTIwMTQnO1xuICAgIGNvbnN0IGNlcnRKc29uID0gZXNjYXBlSHRtbChKU09OLnN0cmluZ2lmeSh7XG4gICAgICBuYW1lOiBjZXJ0Lm5hbWUgfHwgJycsIGlzc3VlcjogY2VydC5pc3N1ZXIgfHwgJycsIHllYXI6IGNlcnQueWVhciB8fCAnJyxcbiAgICB9KSk7XG4gICAgcmV0dXJuIGBcbiAgICAgIDx0cj5cbiAgICAgICAgPHRkPjxzdHJvbmc+JHtuYW1lfTwvc3Ryb25nPjwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cImNvbG9yOiM0NzU1Njk7XCI+JHtpc3N1ZXJ9PC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7Y29sb3I6IzQ3NTU2OTtcIj4ke3llYXJ9PC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwiYWN0aW9uLWJ0bnNcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBvbmNsaWNrPVwiZWRpdE1hc3RlckNlcnRpZmljYXRpb24oJHtjZXJ0SnNvbn0sICR7aWR4fSlcIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiRWRpdCBjZXJ0aWZpY2F0aW9uOiAke25hbWV9XCIgdGl0bGU9XCJFZGl0XCI+XHUyNzBGXHVGRTBGPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgb25jbGljaz1cImRlbGV0ZU1hc3RlckNlcnRpZmljYXRpb24oJHtpZHh9LCAnJHtuYW1lfScpXCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkRlbGV0ZSBjZXJ0aWZpY2F0aW9uOiAke25hbWV9XCIgdGl0bGU9XCJEZWxldGVcIj5cdUQ4M0RcdURERDFcdUZFMEY8L2J1dHRvbj5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvdHI+YDtcbiAgfSkuam9pbignJyk7XG4gIHJldHVybiBgXG4gICAgPHRhYmxlIGNsYXNzPVwicmV2aWV3LXRhYmxlXCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiPlxuICAgICAgPHRoZWFkPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRoPk5hbWU8L3RoPlxuICAgICAgICAgIDx0aD5Jc3N1ZXI8L3RoPlxuICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOjcwcHg7dGV4dC1hbGlnbjpjZW50ZXI7XCI+WWVhcjwvdGg+XG4gICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6ODBweDtcIj5BY3Rpb25zPC90aD5cbiAgICAgICAgPC90cj5cbiAgICAgIDwvdGhlYWQ+XG4gICAgICA8dGJvZHk+JHtyb3dzfTwvdGJvZHk+XG4gICAgPC90YWJsZT5gO1xufVxuXG5cbmZ1bmN0aW9uIF9yZW5kZXJNYXN0ZXJBY2hpZXZlbWVudHNUYWJsZShhY2hpZXZlbWVudHMpIHtcbiAgaWYgKCFhY2hpZXZlbWVudHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuICc8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7cGFkZGluZzoxMnB4IDA7XCI+Tm8gc2VsZWN0ZWQgYWNoaWV2ZW1lbnRzIHlldC4gVXNlIHRoZSBIYXJ2ZXN0IGZlYXR1cmUgdG8gYWRkIGFjaGlldmVtZW50cyBmcm9tIGEgY29tcGxldGVkIHNlc3Npb24sIG9yIGNsaWNrIFwiKyBBZGQgQWNoaWV2ZW1lbnRcIiBhYm92ZS48L3A+JztcbiAgfVxuICBsZXQgcm93cyA9IGFjaGlldmVtZW50cy5tYXAoYWNoID0+IHtcbiAgICBjb25zdCBpZCAgICAgID0gZXNjYXBlSHRtbChhY2guaWQgfHwgJycpO1xuICAgIGNvbnN0IHRpdGxlICAgPSBlc2NhcGVIdG1sKGFjaC50aXRsZSB8fCAnJyk7XG4gICAgY29uc3QgZGVzYyAgICA9IGVzY2FwZUh0bWwoKGFjaC5kZXNjcmlwdGlvbiB8fCAnJykuc2xpY2UoMCwgMTAwKSk7XG4gICAgY29uc3QgaW1wICAgICA9IGFjaC5pbXBvcnRhbmNlID8/ICdcdTIwMTQnO1xuICAgIGNvbnN0IHJlbEZvciAgPSBlc2NhcGVIdG1sKChhY2gucmVsZXZhbnRfZm9yIHx8IFtdKS5qb2luKCcsICcpKTtcbiAgICByZXR1cm4gYFxuICAgICAgPHRyPlxuICAgICAgICA8dGQ+PHN0cm9uZz4ke3RpdGxlfTwvc3Ryb25nPiR7ZGVzYyA/IGA8YnI+PHNtYWxsIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtcIj4ke2Rlc2N9JHsoYWNoLmRlc2NyaXB0aW9ufHwnJykubGVuZ3RoID4gMTAwID8gJ1x1MjAyNicgOiAnJ308L3NtYWxsPmAgOiAnJ308L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjtcIj4ke2ltcH08L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2NvbG9yOiM0NzU1Njk7XCI+JHtyZWxGb3IgfHwgJ1x1MjAxNCd9PC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwiYWN0aW9uLWJ0bnNcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBvbmNsaWNrPVwiZWRpdE1hc3RlckFjaGlldmVtZW50KCR7ZXNjYXBlSHRtbChKU09OLnN0cmluZ2lmeSh7aWQ6IGFjaC5pZHx8JycsIHRpdGxlOiBhY2gudGl0bGV8fCcnLCBkZXNjcmlwdGlvbjogYWNoLmRlc2NyaXB0aW9ufHwnJywgcmVsZXZhbnRfZm9yOiBhY2gucmVsZXZhbnRfZm9yfHxbXSwgaW1wb3J0YW5jZTogYWNoLmltcG9ydGFuY2V8fDd9KSl9KVwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJFZGl0IGFjaGlldmVtZW50OiAke3RpdGxlfVwiIHRpdGxlPVwiRWRpdFwiPlx1MjcwRlx1RkUwRjwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIG9uY2xpY2s9XCJkZWxldGVNYXN0ZXJBY2hpZXZlbWVudCgnJHtpZH0nLCAnJHt0aXRsZX0nKVwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJEZWxldGUgYWNoaWV2ZW1lbnQ6ICR7dGl0bGV9XCIgdGl0bGU9XCJEZWxldGVcIj5cdUQ4M0RcdURERDFcdUZFMEY8L2J1dHRvbj5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvdHI+YDtcbiAgfSkuam9pbignJyk7XG4gIHJldHVybiBgXG4gICAgPHRhYmxlIGNsYXNzPVwicmV2aWV3LXRhYmxlXCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiPlxuICAgICAgPHRoZWFkPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRoPkFjaGlldmVtZW50PC90aD5cbiAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDo2MHB4O3RleHQtYWxpZ246Y2VudGVyO1wiPkltcG9ydGFuY2U8L3RoPlxuICAgICAgICAgIDx0aD5SZWxldmFudCBmb3I8L3RoPlxuICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOjgwcHg7XCI+QWN0aW9uczwvdGg+XG4gICAgICAgIDwvdHI+XG4gICAgICA8L3RoZWFkPlxuICAgICAgPHRib2R5PiR7cm93c308L3Rib2R5PlxuICAgIDwvdGFibGU+YDtcbn1cblxuZnVuY3Rpb24gX3JlbmRlclN1bW1hcmllc0xpc3Qoc3VtbWFyaWVzKSB7XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhzdW1tYXJpZXMpO1xuICBpZiAoIWtleXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuICc8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7cGFkZGluZzoxMnB4IDA7XCI+Tm8gcHJvZmVzc2lvbmFsIHN1bW1hcnkgdmFyaWFudHMgeWV0LiBDbGljayBcIisgQWRkIFN1bW1hcnlcIiBhYm92ZSB0byBjcmVhdGUgeW91ciBmaXJzdCBvbmUuPC9wPic7XG4gIH1cbiAgcmV0dXJuIGtleXMubWFwKGtleSA9PiB7XG4gICAgY29uc3QgdGV4dCAgICA9IHR5cGVvZiBzdW1tYXJpZXNba2V5XSA9PT0gJ3N0cmluZycgPyBzdW1tYXJpZXNba2V5XSA6IEpTT04uc3RyaW5naWZ5KHN1bW1hcmllc1trZXldKTtcbiAgICBjb25zdCBwcmV2aWV3ID0gZXNjYXBlSHRtbCh0ZXh0LnNsaWNlKDAsIDIwMCkpO1xuICAgIGNvbnN0IGtleUVzYyAgPSBlc2NhcGVIdG1sKGtleSk7XG4gICAgcmV0dXJuIGBcbiAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc3VtbWFyeS1jYXJkXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc3VtbWFyeS1oZWFkZXJcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hc3Rlci1zdW1tYXJ5LWtleVwiPiR7a2V5RXNjfTwvc3Bhbj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWJ0bnNcIiBzdHlsZT1cImdhcDo0cHg7XCI+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBvbmNsaWNrPVwiZWRpdE1hc3RlclN1bW1hcnkoJHtlc2NhcGVIdG1sKEpTT04uc3RyaW5naWZ5KHtrZXksIHRleHR9KSl9KVwiXG4gICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkVkaXQgc3VtbWFyeTogJHtrZXlFc2N9XCIgdGl0bGU9XCJFZGl0XCI+XHUyNzBGXHVGRTBGPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBvbmNsaWNrPVwiZGVsZXRlTWFzdGVyU3VtbWFyeSgnJHtrZXlFc2N9JylcIlxuICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJEZWxldGUgc3VtbWFyeTogJHtrZXlFc2N9XCIgdGl0bGU9XCJEZWxldGVcIj5cdUQ4M0RcdURERDFcdUZFMEY8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc3VtbWFyeS1wcmV2aWV3XCI+JHtwcmV2aWV3fSR7dGV4dC5sZW5ndGggPiAyMDAgPyAnXHUyMDI2JyA6ICcnfTwvZGl2PlxuICAgICAgPC9kaXY+YDtcbiAgfSkuam9pbignJyk7XG59XG5cbmZ1bmN0aW9uIHNob3dBZGRBY2hpZXZlbWVudE1vZGFsKCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLW1vZGFsLWlkJykudmFsdWUgICAgICAgICAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLW1vZGFsLXRpdGxlLWlucHV0JykudmFsdWUgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLW1vZGFsLWRlc2MtaW5wdXQnKS52YWx1ZSAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLW1vZGFsLXJlbGV2YW50LWlucHV0JykudmFsdWUgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaC1tb2RhbC1pbXBvcnRhbmNlLWlucHV0JykudmFsdWUgPSAnNyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItYWNoLW1vZGFsLXRpdGxlJykudGV4dENvbnRlbnQgPSAnQWRkIEFjaGlldmVtZW50JztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1hY2gtbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgc2V0SW5pdGlhbEZvY3VzKCdtYXN0ZXItYWNoLW1vZGFsLW92ZXJsYXknKTtcbiAgdHJhcEZvY3VzKCdtYXN0ZXItYWNoLW1vZGFsLW92ZXJsYXknKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaC1tb2RhbC10aXRsZS1pbnB1dCcpLmZvY3VzKCk7XG59XG5cbmZ1bmN0aW9uIGVkaXRNYXN0ZXJBY2hpZXZlbWVudChhY2gpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaC1tb2RhbC1pZCcpLnZhbHVlICAgICAgICAgICAgICA9IGFjaC5pZCB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaC1tb2RhbC10aXRsZS1pbnB1dCcpLnZhbHVlICAgICA9IGFjaC50aXRsZSB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaC1tb2RhbC1kZXNjLWlucHV0JykudmFsdWUgICAgICA9IGFjaC5kZXNjcmlwdGlvbiB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaC1tb2RhbC1yZWxldmFudC1pbnB1dCcpLnZhbHVlICA9IChhY2gucmVsZXZhbnRfZm9yIHx8IFtdKS5qb2luKCcsICcpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLW1vZGFsLWltcG9ydGFuY2UtaW5wdXQnKS52YWx1ZSA9IGFjaC5pbXBvcnRhbmNlIHx8IDc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItYWNoLW1vZGFsLXRpdGxlJykudGV4dENvbnRlbnQgPSAnRWRpdCBBY2hpZXZlbWVudCc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItYWNoLW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICBfZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIHNldEluaXRpYWxGb2N1cygnbWFzdGVyLWFjaC1tb2RhbC1vdmVybGF5Jyk7XG4gIHRyYXBGb2N1cygnbWFzdGVyLWFjaC1tb2RhbC1vdmVybGF5Jyk7XG59XG5cbmZ1bmN0aW9uIGNsb3NlTWFzdGVyQWNoTW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItYWNoLW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICByZXN0b3JlRm9jdXMoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZU1hc3RlckFjaGlldmVtZW50KCkge1xuICBjb25zdCBpZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhY2gtbW9kYWwtaWQnKS52YWx1ZS50cmltKCkgfHxcbiAgICAgICAgICAgICAnc2FfJyArIERhdGUubm93KCk7XG4gIGNvbnN0IHRpdGxlICAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaC1tb2RhbC10aXRsZS1pbnB1dCcpLnZhbHVlLnRyaW0oKTtcbiAgY29uc3QgZGVzY3JpcHRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLW1vZGFsLWRlc2MtaW5wdXQnKS52YWx1ZS50cmltKCk7XG4gIGNvbnN0IHJlbGV2YW50UmF3ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaC1tb2RhbC1yZWxldmFudC1pbnB1dCcpLnZhbHVlO1xuICBjb25zdCBpbXBvcnRhbmNlICA9IHBhcnNlSW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhY2gtbW9kYWwtaW1wb3J0YW5jZS1pbnB1dCcpLnZhbHVlLCAxMCkgfHwgNztcblxuICBpZiAoIXRpdGxlKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjZBMFx1RkUwRiBWYWxpZGF0aW9uJywgJ1RpdGxlIGlzIHJlcXVpcmVkLicpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCByZWxldmFudF9mb3IgPSByZWxldmFudFJhdy5zcGxpdCgnLCcpLm1hcChzID0+IHMudHJpbSgpKS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS91cGRhdGUtYWNoaWV2ZW1lbnQnLCB7XG4gICAgICBtZXRob2Q6ICAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6ICAgIEpTT04uc3RyaW5naWZ5KHsgaWQsIHRpdGxlLCBkZXNjcmlwdGlvbiwgcmVsZXZhbnRfZm9yLCBpbXBvcnRhbmNlIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBjbG9zZU1hc3RlckFjaE1vZGFsKCk7XG4gICAgICBfc2V0TWFzdGVyQ2hhbmdlTm90aWNlKCdTZWxlY3RlZCBBY2hpZXZlbWVudHMnLCBkYXRhLmFjdGlvbiB8fCAndXBkYXRlZCcpO1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjcwNSBTYXZlZCcsIGBBY2hpZXZlbWVudCBcIiR7dGl0bGV9XCIgJHtkYXRhLmFjdGlvbn0uYCk7XG4gICAgICBhd2FpdCBwb3B1bGF0ZU1hc3RlclRhYigpOyAgLy8gcmVmcmVzaFxuICAgIH0gZWxzZSB7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgZGF0YS5lcnJvciB8fCAnU2F2ZSBmYWlsZWQnKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgJ0ZhaWxlZCB0byBzYXZlIGFjaGlldmVtZW50Jyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvd0FkZFN1bW1hcnlNb2RhbCgpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1bS1tb2RhbC1rZXktaW5wdXQnKS52YWx1ZSAgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1bS1tb2RhbC10ZXh0LWlucHV0JykudmFsdWUgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1zdW0tbW9kYWwtdGl0bGUnKS50ZXh0Q29udGVudCA9ICdBZGQgUHJvZmVzc2lvbmFsIFN1bW1hcnknO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXN1bS1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBzZXRJbml0aWFsRm9jdXMoJ21hc3Rlci1zdW0tbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ21hc3Rlci1zdW0tbW9kYWwtb3ZlcmxheScpO1xufVxuXG5mdW5jdGlvbiBlZGl0TWFzdGVyU3VtbWFyeShvYmopIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1bS1tb2RhbC1rZXktaW5wdXQnKS52YWx1ZSAgPSBvYmoua2V5ICB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1bS1tb2RhbC10ZXh0LWlucHV0JykudmFsdWUgPSBvYmoudGV4dCB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1zdW0tbW9kYWwtdGl0bGUnKS50ZXh0Q29udGVudCA9ICdFZGl0IFByb2Zlc3Npb25hbCBTdW1tYXJ5JztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1zdW0tbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgc2V0SW5pdGlhbEZvY3VzKCdtYXN0ZXItc3VtLW1vZGFsLW92ZXJsYXknKTtcbiAgdHJhcEZvY3VzKCdtYXN0ZXItc3VtLW1vZGFsLW92ZXJsYXknKTtcbn1cblxuZnVuY3Rpb24gY2xvc2VNYXN0ZXJTdW1Nb2RhbCgpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1zdW0tbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHJlc3RvcmVGb2N1cygpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzYXZlTWFzdGVyU3VtbWFyeSgpIHtcbiAgY29uc3Qga2V5ICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdW0tbW9kYWwta2V5LWlucHV0JykudmFsdWUudHJpbSgpO1xuICBjb25zdCB0ZXh0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1bS1tb2RhbC10ZXh0LWlucHV0JykudmFsdWUudHJpbSgpO1xuICBpZiAoIWtleSB8fCAhdGV4dCkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI2QTBcdUZFMEYgVmFsaWRhdGlvbicsICdCb3RoIEtleSBhbmQgU3VtbWFyeSB0ZXh0IGFyZSByZXF1aXJlZC4nKTtcbiAgICByZXR1cm47XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS91cGRhdGUtc3VtbWFyeScsIHtcbiAgICAgIG1ldGhvZDogICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogICAgSlNPTi5zdHJpbmdpZnkoeyBrZXksIHRleHQgfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEub2spIHtcbiAgICAgIGNsb3NlTWFzdGVyU3VtTW9kYWwoKTtcbiAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ1Byb2Zlc3Npb25hbCBTdW1tYXJpZXMnLCBkYXRhLmFjdGlvbiB8fCAndXBkYXRlZCcpO1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjcwNSBTYXZlZCcsIGBTdW1tYXJ5IFwiJHtrZXl9XCIgJHtkYXRhLmFjdGlvbn0uYCk7XG4gICAgICBhd2FpdCBwb3B1bGF0ZU1hc3RlclRhYigpOyAgLy8gcmVmcmVzaFxuICAgIH0gZWxzZSB7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgZGF0YS5lcnJvciB8fCAnU2F2ZSBmYWlsZWQnKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgJ0ZhaWxlZCB0byBzYXZlIHN1bW1hcnknKTtcbiAgfVxufVxuXG4vLyAtLS0tIFBlcnNvbmFsIEluZm8gbW9kYWwgaGFuZGxlcnMgLS0tLVxuXG5mdW5jdGlvbiBzaG93RWRpdFBlcnNvbmFsSW5mb01vZGFsKCkge1xuICBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS9mdWxsJylcbiAgICAudGhlbihyID0+IHIuanNvbigpKVxuICAgIC50aGVuKGRhdGEgPT4ge1xuICAgICAgY29uc3QgcGkgICAgICA9IGRhdGEucGVyc29uYWxfaW5mbyB8fCB7fTtcbiAgICAgIGNvbnN0IGNvbnRhY3QgPSBwaS5jb250YWN0IHx8IHt9O1xuICAgICAgY29uc3QgYWRkcmVzcyA9IGNvbnRhY3QuYWRkcmVzcyB8fCB7fTtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwaS1uYW1lLWlucHV0JykudmFsdWUgICAgPSBwaS5uYW1lIHx8ICcnO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BpLXRpdGxlLWlucHV0JykudmFsdWUgICA9IHBpLnRpdGxlIHx8IHBpLmhlYWRsaW5lIHx8ICcnO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BpLWVtYWlsLWlucHV0JykudmFsdWUgICA9IGNvbnRhY3QuZW1haWwgfHwgcGkuZW1haWwgfHwgJyc7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGktcGhvbmUtaW5wdXQnKS52YWx1ZSAgID0gY29udGFjdC5waG9uZSB8fCAnJztcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwaS1saW5rZWRpbi1pbnB1dCcpLnZhbHVlID0gY29udGFjdC5saW5rZWRpbiB8fCAnJztcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwaS13ZWJzaXRlLWlucHV0JykudmFsdWUgID0gY29udGFjdC53ZWJzaXRlIHx8ICcnO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BpLWNpdHktaW5wdXQnKS52YWx1ZSAgICA9IGFkZHJlc3MuY2l0eSB8fCAnJztcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwaS1zdGF0ZS1pbnB1dCcpLnZhbHVlICAgPSBhZGRyZXNzLnN0YXRlIHx8ICcnO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1waS1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICAgIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICAgIHNldEluaXRpYWxGb2N1cygnbWFzdGVyLXBpLW1vZGFsLW92ZXJsYXknKTtcbiAgICAgIHRyYXBGb2N1cygnbWFzdGVyLXBpLW1vZGFsLW92ZXJsYXknKTtcbiAgICB9KVxuICAgIC5jYXRjaCgoKSA9PiBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgJ0NvdWxkIG5vdCBsb2FkIHBlcnNvbmFsIGluZm8nKSk7XG59XG5cbmZ1bmN0aW9uIGNsb3NlUGVyc29uYWxJbmZvTW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcGktbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHJlc3RvcmVGb2N1cygpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzYXZlUGVyc29uYWxJbmZvKCkge1xuICBjb25zdCBib2R5ID0ge1xuICAgIG5hbWU6ICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGktbmFtZS1pbnB1dCcpLnZhbHVlLnRyaW0oKSxcbiAgICB0aXRsZTogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BpLXRpdGxlLWlucHV0JykudmFsdWUudHJpbSgpLFxuICAgIGVtYWlsOiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGktZW1haWwtaW5wdXQnKS52YWx1ZS50cmltKCksXG4gICAgcGhvbmU6ICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwaS1waG9uZS1pbnB1dCcpLnZhbHVlLnRyaW0oKSxcbiAgICBsaW5rZWRpbjogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BpLWxpbmtlZGluLWlucHV0JykudmFsdWUudHJpbSgpLFxuICAgIHdlYnNpdGU6ICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGktd2Vic2l0ZS1pbnB1dCcpLnZhbHVlLnRyaW0oKSxcbiAgICBjaXR5OiAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BpLWNpdHktaW5wdXQnKS52YWx1ZS50cmltKCksXG4gICAgc3RhdGU6ICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwaS1zdGF0ZS1pbnB1dCcpLnZhbHVlLnRyaW0oKSxcbiAgfTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvcGVyc29uYWwtaW5mbycsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSwgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEub2spIHtcbiAgICAgIGNsb3NlUGVyc29uYWxJbmZvTW9kYWwoKTtcbiAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ1BlcnNvbmFsIEluZm9ybWF0aW9uJywgJ3VwZGF0ZWQnKTtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3MDUgU2F2ZWQnLCAnUGVyc29uYWwgaW5mb3JtYXRpb24gdXBkYXRlZC4nKTtcbiAgICAgIGF3YWl0IHBvcHVsYXRlTWFzdGVyVGFiKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCBkYXRhLmVycm9yIHx8ICdTYXZlIGZhaWxlZCcpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIHNhdmUgcGVyc29uYWwgaW5mbycpO1xuICB9XG59XG5cbi8vIC0tLS0gRXhwZXJpZW5jZSBtb2RhbCBoYW5kbGVycyAtLS0tXG5cbmZ1bmN0aW9uIHNob3dBZGRFeHBlcmllbmNlTW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtbW9kYWwtaWQnKS52YWx1ZSAgICAgICAgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC10aXRsZS1pbnB1dCcpLnZhbHVlICAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLWNvbXBhbnktaW5wdXQnKS52YWx1ZSAgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtY2l0eS1pbnB1dCcpLnZhbHVlICAgICAgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC1zdGF0ZS1pbnB1dCcpLnZhbHVlICAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLXN0YXJ0LWlucHV0JykudmFsdWUgICAgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtZW5kLWlucHV0JykudmFsdWUgICAgICAgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC10eXBlLWlucHV0JykudmFsdWUgICAgICA9ICdmdWxsX3RpbWUnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLWltcG9ydGFuY2UtaW5wdXQnKS52YWx1ZSA9ICc1JztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC10YWdzLWlucHV0JykudmFsdWUgICAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWV4cC1tb2RhbC10aXRsZScpLnRleHRDb250ZW50ID0gJ0FkZCBXb3JrIEV4cGVyaWVuY2UnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWV4cC1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgX21hc3RlckV4cE1vZGFsQWNoaWV2ZW1lbnRzID0gW107XG4gIF9yZW5kZXJFeHBBY2hpZXZlbWVudHNFZGl0b3IoKTtcbiAgX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBzZXRJbml0aWFsRm9jdXMoJ21hc3Rlci1leHAtbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ21hc3Rlci1leHAtbW9kYWwtb3ZlcmxheScpO1xufVxuXG4vLyBXb3JraW5nIGNvcHkgb2YgdGhlIGN1cnJlbnRseS1lZGl0ZWQgZXhwZXJpZW5jZSdzIGFjaGlldmVtZW50cyB3aGlsZSB0aGVcbi8vIG1vZGFsIGlzIG9wZW4gKEdBUC0xOSAxNi4xMSkuIGVkaXRNYXN0ZXJFeHBlcmllbmNlKCkgdGFrZXMgYW4gaWQgKG5vdCB0aGVcbi8vIGZ1bGwgb2JqZWN0KSBhbmQgbG9va3MgaXQgdXAgZnJvbSB3aW5kb3cuX21hc3RlckV4cGVyaWVuY2VGdWxsRGF0YSBcdTIwMTRcbi8vIGFjaGlldmVtZW50IHRleHQgY2FuIGNvbnRhaW4gcXVvdGVzL3VuaWNvZGUgdGhhdCB3b3VsZCBiZSBmcmFnaWxlIHRvXG4vLyBlbWJlZCBkaXJlY3RseSBpbnNpZGUgYW4gaW5saW5lIG9uY2xpY2sgYXR0cmlidXRlLlxubGV0IF9tYXN0ZXJFeHBNb2RhbEFjaGlldmVtZW50cyA9IFtdO1xuXG5mdW5jdGlvbiBfYWNoaWV2ZW1lbnRUZXh0KGEpIHtcbiAgcmV0dXJuIHR5cGVvZiBhID09PSAnc3RyaW5nJyA/IGEgOiAoYSAmJiBhLnRleHQpIHx8ICcnO1xufVxuXG5mdW5jdGlvbiBfcmVuZGVyRXhwQWNoaWV2ZW1lbnRzRWRpdG9yKCkge1xuICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLWFjaGlldmVtZW50cy1lZGl0b3ItbGlzdCcpO1xuICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuO1xuICBjb25zdCBsYXN0SWR4ID0gX21hc3RlckV4cE1vZGFsQWNoaWV2ZW1lbnRzLmxlbmd0aCAtIDE7XG4gIGNvbnRhaW5lci5pbm5lckhUTUwgPSBfbWFzdGVyRXhwTW9kYWxBY2hpZXZlbWVudHMubWFwKChhY2gsIGlkeCkgPT4gYFxuICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjZweDthbGlnbi1pdGVtczpjZW50ZXI7bWFyZ2luLWJvdHRvbTo2cHg7XCI+XG4gICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImVkaXQtaW5wdXQgZXhwLWFjaC10ZXh0LWlucHV0XCIgZGF0YS1pZHg9XCIke2lkeH1cIiBzdHlsZT1cImZsZXg6MTtcIlxuICAgICAgICAgIHZhbHVlPVwiJHtlc2NhcGVIdG1sKF9hY2hpZXZlbWVudFRleHQoYWNoKSl9XCIgYXJpYS1sYWJlbD1cIkFjaGlldmVtZW50ICR7aWR4ICsgMX0gdGV4dFwiIC8+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImljb24tYnRuXCIgb25jbGljaz1cIl9tb3ZlRXhwQWNoaWV2ZW1lbnQoJHtpZHh9LCAtMSlcIlxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJNb3ZlIGFjaGlldmVtZW50ICR7aWR4ICsgMX0gdXBcIiB0aXRsZT1cIk1vdmUgdXBcIiAke2lkeCA9PT0gMCA/ICdkaXNhYmxlZCcgOiAnJ30+XHUyMTkxPC9idXR0b24+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImljb24tYnRuXCIgb25jbGljaz1cIl9tb3ZlRXhwQWNoaWV2ZW1lbnQoJHtpZHh9LCAxKVwiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIk1vdmUgYWNoaWV2ZW1lbnQgJHtpZHggKyAxfSBkb3duXCIgdGl0bGU9XCJNb3ZlIGRvd25cIiAke2lkeCA9PT0gbGFzdElkeCA/ICdkaXNhYmxlZCcgOiAnJ30+XHUyMTkzPC9idXR0b24+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImljb24tYnRuXCIgb25jbGljaz1cIl9kZWxldGVFeHBBY2hpZXZlbWVudCgke2lkeH0pXCJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiRGVsZXRlIGFjaGlldmVtZW50ICR7aWR4ICsgMX1cIiB0aXRsZT1cIkRlbGV0ZVwiPlx1RDgzRFx1REREMVx1RkUwRjwvYnV0dG9uPlxuICAgIDwvZGl2PmApLmpvaW4oJycpIHx8ICc8cCBzdHlsZT1cImNvbG9yOiM5NGEzYjg7Zm9udC1zaXplOjAuODVlbTttYXJnaW46MCAwIDZweDtcIj5ObyBhY2hpZXZlbWVudHMgeWV0LjwvcD4nO1xufVxuXG4vLyBSZWFkIGFueSBpbi1wcm9ncmVzcyBlZGl0cyBvdXQgb2YgdGhlIGFjaGlldmVtZW50IHRleHQgaW5wdXRzIGJlZm9yZSBhXG4vLyByZW9yZGVyL2RlbGV0ZS9zYXZlIHJlYnVpbGRzIHRoZSBsaXN0IGZyb20gX21hc3RlckV4cE1vZGFsQWNoaWV2ZW1lbnRzIFx1MjAxNFxuLy8gb3RoZXJ3aXNlIGFuIHVuLXN1Ym1pdHRlZCB0ZXh0IGVkaXQgd291bGQgYmUgc2lsZW50bHkgbG9zdCBvbiByZS1yZW5kZXIuXG5mdW5jdGlvbiBfc3luY0V4cEFjaGlldmVtZW50c0Zyb21JbnB1dHMoKSB7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5leHAtYWNoLXRleHQtaW5wdXQnKS5mb3JFYWNoKChpbnB1dCkgPT4ge1xuICAgIGNvbnN0IGlkeCA9IHBhcnNlSW50KGlucHV0LmRhdGFzZXQuaWR4LCAxMCk7XG4gICAgY29uc3QgYWNoID0gX21hc3RlckV4cE1vZGFsQWNoaWV2ZW1lbnRzW2lkeF07XG4gICAgaWYgKHR5cGVvZiBhY2ggPT09ICdzdHJpbmcnIHx8IGFjaCA9PSBudWxsKSB7XG4gICAgICBfbWFzdGVyRXhwTW9kYWxBY2hpZXZlbWVudHNbaWR4XSA9IGlucHV0LnZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBhY2gudGV4dCA9IGlucHV0LnZhbHVlO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIF9hZGRFeHBBY2hpZXZlbWVudCgpIHtcbiAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLWFjaC1uZXctaW5wdXQnKTtcbiAgY29uc3QgdGV4dCA9IChpbnB1dC52YWx1ZSB8fCAnJykudHJpbSgpO1xuICBpZiAoIXRleHQpIHJldHVybjtcbiAgX3N5bmNFeHBBY2hpZXZlbWVudHNGcm9tSW5wdXRzKCk7XG4gIF9tYXN0ZXJFeHBNb2RhbEFjaGlldmVtZW50cy5wdXNoKHRleHQpO1xuICBpbnB1dC52YWx1ZSA9ICcnO1xuICBfcmVuZGVyRXhwQWNoaWV2ZW1lbnRzRWRpdG9yKCk7XG59XG5cbmZ1bmN0aW9uIF9tb3ZlRXhwQWNoaWV2ZW1lbnQoaWR4LCBkZWx0YSkge1xuICBfc3luY0V4cEFjaGlldmVtZW50c0Zyb21JbnB1dHMoKTtcbiAgY29uc3QgdGFyZ2V0ID0gaWR4ICsgZGVsdGE7XG4gIGlmICh0YXJnZXQgPCAwIHx8IHRhcmdldCA+PSBfbWFzdGVyRXhwTW9kYWxBY2hpZXZlbWVudHMubGVuZ3RoKSByZXR1cm47XG4gIGNvbnN0IFtpdGVtXSA9IF9tYXN0ZXJFeHBNb2RhbEFjaGlldmVtZW50cy5zcGxpY2UoaWR4LCAxKTtcbiAgX21hc3RlckV4cE1vZGFsQWNoaWV2ZW1lbnRzLnNwbGljZSh0YXJnZXQsIDAsIGl0ZW0pO1xuICBfcmVuZGVyRXhwQWNoaWV2ZW1lbnRzRWRpdG9yKCk7XG59XG5cbmZ1bmN0aW9uIF9kZWxldGVFeHBBY2hpZXZlbWVudChpZHgpIHtcbiAgX3N5bmNFeHBBY2hpZXZlbWVudHNGcm9tSW5wdXRzKCk7XG4gIF9tYXN0ZXJFeHBNb2RhbEFjaGlldmVtZW50cy5zcGxpY2UoaWR4LCAxKTtcbiAgX3JlbmRlckV4cEFjaGlldmVtZW50c0VkaXRvcigpO1xufVxuXG5mdW5jdGlvbiBlZGl0TWFzdGVyRXhwZXJpZW5jZShpZCkge1xuICBjb25zdCBleHAgPSAod2luZG93Ll9tYXN0ZXJFeHBlcmllbmNlRnVsbERhdGEgfHwgW10pLmZpbmQoKGUpID0+IGUuaWQgPT09IGlkKTtcbiAgaWYgKCFleHApIHtcbiAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgJ0NvdWxkIG5vdCBmaW5kIHRoYXQgZXhwZXJpZW5jZSBlbnRyeSBcdTIwMTQgdHJ5IHJlZnJlc2hpbmcgdGhlIHRhYi4nKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgbG9jID0gZXhwLmxvY2F0aW9uIHx8IHt9O1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLW1vZGFsLWlkJykudmFsdWUgICAgICAgICA9IGV4cC5pZCB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC10aXRsZS1pbnB1dCcpLnZhbHVlICAgICAgPSBleHAudGl0bGUgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtY29tcGFueS1pbnB1dCcpLnZhbHVlICAgID0gZXhwLmNvbXBhbnkgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtY2l0eS1pbnB1dCcpLnZhbHVlICAgICAgID0gbG9jLmNpdHkgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtc3RhdGUtaW5wdXQnKS52YWx1ZSAgICAgID0gbG9jLnN0YXRlIHx8ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLXN0YXJ0LWlucHV0JykudmFsdWUgICAgICA9IGV4cC5zdGFydF9kYXRlIHx8ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLWVuZC1pbnB1dCcpLnZhbHVlICAgICAgICA9IGV4cC5lbmRfZGF0ZSB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC10eXBlLWlucHV0JykudmFsdWUgICAgICAgPSBleHAuZW1wbG95bWVudF90eXBlIHx8ICdmdWxsX3RpbWUnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLWltcG9ydGFuY2UtaW5wdXQnKS52YWx1ZSAgPSBleHAuaW1wb3J0YW5jZSB8fCA1O1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLXRhZ3MtaW5wdXQnKS52YWx1ZSAgICAgICA9IHR5cGVvZiBleHAudGFncyA9PT0gJ3N0cmluZycgPyBleHAudGFnc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoZXhwLnRhZ3MgfHwgW10pLmpvaW4oJywgJyk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItZXhwLW1vZGFsLXRpdGxlJykudGV4dENvbnRlbnQgPSAnRWRpdCBXb3JrIEV4cGVyaWVuY2UnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWV4cC1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgX21hc3RlckV4cE1vZGFsQWNoaWV2ZW1lbnRzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShleHAuYWNoaWV2ZW1lbnRzIHx8IFtdKSk7XG4gIF9yZW5kZXJFeHBBY2hpZXZlbWVudHNFZGl0b3IoKTtcbiAgX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBzZXRJbml0aWFsRm9jdXMoJ21hc3Rlci1leHAtbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ21hc3Rlci1leHAtbW9kYWwtb3ZlcmxheScpO1xufVxuXG5mdW5jdGlvbiBjbG9zZUV4cGVyaWVuY2VNb2RhbCgpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1leHAtbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHJlc3RvcmVGb2N1cygpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzYXZlTWFzdGVyRXhwZXJpZW5jZSgpIHtcbiAgY29uc3QgaWQgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC1tb2RhbC1pZCcpLnZhbHVlLnRyaW0oKTtcbiAgY29uc3QgdGl0bGUgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC10aXRsZS1pbnB1dCcpLnZhbHVlLnRyaW0oKTtcbiAgY29uc3QgY29tcGFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtY29tcGFueS1pbnB1dCcpLnZhbHVlLnRyaW0oKTtcbiAgaWYgKCF0aXRsZSB8fCAhY29tcGFueSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI2QTBcdUZFMEYgVmFsaWRhdGlvbicsICdKb2IgdGl0bGUgYW5kIGNvbXBhbnkgYXJlIHJlcXVpcmVkLicpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB0YWdzUmF3ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC10YWdzLWlucHV0JykudmFsdWU7XG4gIF9zeW5jRXhwQWNoaWV2ZW1lbnRzRnJvbUlucHV0cygpO1xuICBjb25zdCBleHBEYXRhID0ge1xuICAgIHRpdGxlLCBjb21wYW55LFxuICAgIGNpdHk6ICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC1jaXR5LWlucHV0JykudmFsdWUudHJpbSgpLFxuICAgIHN0YXRlOiAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC1zdGF0ZS1pbnB1dCcpLnZhbHVlLnRyaW0oKSxcbiAgICBzdGFydF9kYXRlOiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtc3RhcnQtaW5wdXQnKS52YWx1ZS50cmltKCksXG4gICAgZW5kX2RhdGU6ICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLWVuZC1pbnB1dCcpLnZhbHVlLnRyaW0oKSxcbiAgICBlbXBsb3ltZW50X3R5cGU6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtdHlwZS1pbnB1dCcpLnZhbHVlLFxuICAgIGltcG9ydGFuY2U6ICAgICAgcGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC1pbXBvcnRhbmNlLWlucHV0JykudmFsdWUsIDEwKSB8fCA1LFxuICAgIHRhZ3M6ICAgICAgICAgICAgdGFnc1Jhdy5zcGxpdCgnLCcpLm1hcChzID0+IHMudHJpbSgpKS5maWx0ZXIoQm9vbGVhbiksXG4gICAgYWNoaWV2ZW1lbnRzOiAgICBfbWFzdGVyRXhwTW9kYWxBY2hpZXZlbWVudHMsXG4gIH07XG4gIGNvbnN0IGFjdGlvbiA9IGlkID8gJ3VwZGF0ZScgOiAnYWRkJztcbiAgY29uc3QgYm9keSAgID0gYWN0aW9uID09PSAndXBkYXRlJyA/IHsgYWN0aW9uLCBpZCwgZXhwZXJpZW5jZTogZXhwRGF0YSB9IDogeyBhY3Rpb24sIGV4cGVyaWVuY2U6IGV4cERhdGEgfTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvZXhwZXJpZW5jZScsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSwgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEub2spIHtcbiAgICAgIGNsb3NlRXhwZXJpZW5jZU1vZGFsKCk7XG4gICAgICBfc2V0TWFzdGVyQ2hhbmdlTm90aWNlKCdXb3JrIEV4cGVyaWVuY2UnLCBkYXRhLmFjdGlvbiB8fCAndXBkYXRlZCcpO1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjcwNSBTYXZlZCcsIGBFeHBlcmllbmNlIFwiJHt0aXRsZX1cIiAke2RhdGEuYWN0aW9ufS5gKTtcbiAgICAgIGF3YWl0IHBvcHVsYXRlTWFzdGVyVGFiKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCBkYXRhLmVycm9yIHx8ICdTYXZlIGZhaWxlZCcpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIHNhdmUgZXhwZXJpZW5jZScpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZU1hc3RlckV4cGVyaWVuY2UoaWQsIHRpdGxlKSB7XG4gIHNob3dDb25maXJtTW9kYWwoXG4gICAgJ1x1RDgzRFx1REREMVx1RkUwRiBEZWxldGUgRXhwZXJpZW5jZScsXG4gICAgYERlbGV0ZSBcIiR7dGl0bGV9XCI/IFRoaXMgY2Fubm90IGJlIHVuZG9uZS5gLFxuICAgIGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS9leHBlcmllbmNlJywge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGFjdGlvbjogJ2RlbGV0ZScsIGlkIH0pLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICAgICAgX3NldE1hc3RlckNoYW5nZU5vdGljZSgnV29yayBFeHBlcmllbmNlJywgZGF0YS5hY3Rpb24gfHwgJ2RlbGV0ZWQnKTtcbiAgICAgICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzA1IERlbGV0ZWQnLCBgRXhwZXJpZW5jZSBcIiR7dGl0bGV9XCIgcmVtb3ZlZC5gKTtcbiAgICAgICAgICBhd2FpdCBwb3B1bGF0ZU1hc3RlclRhYigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCBkYXRhLmVycm9yIHx8ICdEZWxldGUgZmFpbGVkJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsICdGYWlsZWQgdG8gZGVsZXRlIGV4cGVyaWVuY2UnKTtcbiAgICAgIH1cbiAgICB9XG4gICk7XG59XG5cbi8vIC0tLS0gU2tpbGwgbW9kYWwgaGFuZGxlcnMgLS0tLVxuXG5mdW5jdGlvbiBzaG93QWRkU2tpbGxNb2RhbChjYXRlZ29yeUtleSwgaXNGbGF0KSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1tb2RhbC1jYXRlZ29yeScpLnZhbHVlID0gY2F0ZWdvcnlLZXkgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1tb2RhbC1pcy1mbGF0JykudmFsdWUgID0gaXNGbGF0ID8gJzEnIDogJzAnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtbW9kYWwtb3JpZ2luYWwtbmFtZScpLnZhbHVlID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1uYW1lLWlucHV0JykudmFsdWUgICAgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1leHBlcmllbmNlcy1pbnB1dCcpLnZhbHVlID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1hbGlhc2VzLWlucHV0JykudmFsdWUgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC15ZWFycy1pbnB1dCcpLnZhbHVlICAgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItc2tpbGwtbW9kYWwtdGl0bGUnKS50ZXh0Q29udGVudCA9ICdBZGQgU2tpbGwnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXNraWxsLXNhdmUtYnRuJykudGV4dENvbnRlbnQgPSAnQWRkIFNraWxsJztcbiAgY29uc3QgaGludHMgPSAod2luZG93Ll9tYXN0ZXJFeHBlcmllbmNlT3B0aW9ucyB8fCBbXSlcbiAgICAuc2xpY2UoMCwgOClcbiAgICAubWFwKCh4KSA9PiBgJHt4LmlkfSAoJHt4LmxhYmVsfSlgKVxuICAgIC5qb2luKCcgXHUwMEI3ICcpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtZXhwZXJpZW5jZS1oaW50cycpLnRleHRDb250ZW50ID0gaGludHMgPyBgQXZhaWxhYmxlOiAke2hpbnRzfWAgOiAnJztcbiAgY29uc3QgY2F0Um93ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NraWxsLWNhdGVnb3J5LXJvdycpO1xuICBpZiAoY2F0ZWdvcnlLZXkpIHtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtY2F0ZWdvcnktZGlzcGxheScpLnRleHRDb250ZW50ID0gY2F0ZWdvcnlLZXk7XG4gICAgY2F0Um93LnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgfSBlbHNlIHtcbiAgICBjYXRSb3cuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgfVxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXNraWxsLW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICBfZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIHNldEluaXRpYWxGb2N1cygnbWFzdGVyLXNraWxsLW1vZGFsLW92ZXJsYXknKTtcbiAgdHJhcEZvY3VzKCdtYXN0ZXItc2tpbGwtbW9kYWwtb3ZlcmxheScpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtbmFtZS1pbnB1dCcpLmZvY3VzKCk7XG59XG5cbmZ1bmN0aW9uIGVkaXRNYXN0ZXJTa2lsbChza2lsbE9iaiwgY2F0ZWdvcnlLZXksIGlzRmxhdCkge1xuICBjb25zdCBuYW1lID0gdHlwZW9mIHNraWxsT2JqID09PSAnc3RyaW5nJyA/IHNraWxsT2JqIDogKHNraWxsT2JqPy5uYW1lIHx8ICcnKTtcbiAgY29uc3QgZXhwZXJpZW5jZXMgPSBBcnJheS5pc0FycmF5KHNraWxsT2JqPy5leHBlcmllbmNlcykgPyBza2lsbE9iai5leHBlcmllbmNlcyA6IFtdO1xuICBjb25zdCBhbGlhc2VzID0gQXJyYXkuaXNBcnJheShza2lsbE9iaj8uYWxpYXNlcykgPyBza2lsbE9iai5hbGlhc2VzIDogW107XG4gIGNvbnN0IHllYXJzID0gKHR5cGVvZiBza2lsbE9iaiA9PT0gJ29iamVjdCcgJiYgc2tpbGxPYmo/LnllYXJzICE9IG51bGwpID8gc2tpbGxPYmoueWVhcnMgOiAnJztcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtbW9kYWwtY2F0ZWdvcnknKS52YWx1ZSA9IGNhdGVnb3J5S2V5IHx8ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtbW9kYWwtaXMtZmxhdCcpLnZhbHVlICA9IGlzRmxhdCA/ICcxJyA6ICcwJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NraWxsLW1vZGFsLW9yaWdpbmFsLW5hbWUnKS52YWx1ZSA9IG5hbWU7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1uYW1lLWlucHV0JykudmFsdWUgPSBuYW1lO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtZXhwZXJpZW5jZXMtaW5wdXQnKS52YWx1ZSA9IGV4cGVyaWVuY2VzLmpvaW4oJywgJyk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1hbGlhc2VzLWlucHV0JykudmFsdWUgPSBhbGlhc2VzLmpvaW4oJywgJyk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC15ZWFycy1pbnB1dCcpLnZhbHVlID0geWVhcnM7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItc2tpbGwtbW9kYWwtdGl0bGUnKS50ZXh0Q29udGVudCA9ICdFZGl0IFNraWxsJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1za2lsbC1zYXZlLWJ0bicpLnRleHRDb250ZW50ID0gJ1NhdmUgU2tpbGwnO1xuXG4gIGNvbnN0IGhpbnRzID0gKHdpbmRvdy5fbWFzdGVyRXhwZXJpZW5jZU9wdGlvbnMgfHwgW10pXG4gICAgLnNsaWNlKDAsIDgpXG4gICAgLm1hcCgoeCkgPT4gYCR7eC5pZH0gKCR7eC5sYWJlbH0pYClcbiAgICAuam9pbignIFx1MDBCNyAnKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NraWxsLWV4cGVyaWVuY2UtaGludHMnKS50ZXh0Q29udGVudCA9IGhpbnRzID8gYEF2YWlsYWJsZTogJHtoaW50c31gIDogJyc7XG5cbiAgY29uc3QgY2F0Um93ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NraWxsLWNhdGVnb3J5LXJvdycpO1xuICBpZiAoY2F0ZWdvcnlLZXkpIHtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtY2F0ZWdvcnktZGlzcGxheScpLnRleHRDb250ZW50ID0gY2F0ZWdvcnlLZXk7XG4gICAgY2F0Um93LnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgfSBlbHNlIHtcbiAgICBjYXRSb3cuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgfVxuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItc2tpbGwtbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgc2V0SW5pdGlhbEZvY3VzKCdtYXN0ZXItc2tpbGwtbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ21hc3Rlci1za2lsbC1tb2RhbC1vdmVybGF5Jyk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1uYW1lLWlucHV0JykuZm9jdXMoKTtcbn1cblxuZnVuY3Rpb24gY2xvc2VTa2lsbE1vZGFsKCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXNraWxsLW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICByZXN0b3JlRm9jdXMoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZU1hc3RlclNraWxsKCkge1xuICBjb25zdCBza2lsbCAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1uYW1lLWlucHV0JykudmFsdWUudHJpbSgpO1xuICBjb25zdCBjYXRlZ29yeSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1tb2RhbC1jYXRlZ29yeScpLnZhbHVlLnRyaW0oKTtcbiAgY29uc3QgaXNGbGF0ICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtbW9kYWwtaXMtZmxhdCcpLnZhbHVlID09PSAnMSc7XG4gIGNvbnN0IG9yaWdpbmFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NraWxsLW1vZGFsLW9yaWdpbmFsLW5hbWUnKS52YWx1ZS50cmltKCk7XG4gIGNvbnN0IGV4cGVyaWVuY2VzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NraWxsLWV4cGVyaWVuY2VzLWlucHV0JykudmFsdWVcbiAgICAuc3BsaXQoJywnKVxuICAgIC5tYXAoKHMpID0+IHMudHJpbSgpKVxuICAgIC5maWx0ZXIoQm9vbGVhbik7XG4gIGNvbnN0IGFsaWFzZXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtYWxpYXNlcy1pbnB1dCcpLnZhbHVlXG4gICAgLnNwbGl0KCcsJylcbiAgICAubWFwKChzKSA9PiBzLnRyaW0oKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pO1xuICBjb25zdCB5ZWFyc1JhdyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC15ZWFycy1pbnB1dCcpLnZhbHVlLnRyaW0oKTtcbiAgY29uc3QgeWVhcnMgPSB5ZWFyc1JhdyA9PT0gJycgPyBudWxsIDogcGFyc2VGbG9hdCh5ZWFyc1Jhdyk7XG4gIGlmICghc2tpbGwpIHtcbiAgICBzaG93QWxlcnRNb2RhbCgnXHUyNkEwXHVGRTBGIFZhbGlkYXRpb24nLCAnU2tpbGwgbmFtZSBpcyByZXF1aXJlZC4nKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHllYXJzICE9PSBudWxsICYmICFOdW1iZXIuaXNGaW5pdGUoeWVhcnMpKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjZBMFx1RkUwRiBWYWxpZGF0aW9uJywgJ1llYXJzIG9mIGV4cGVyaWVuY2UgbXVzdCBiZSBhIGZpbml0ZSBudW1iZXIuJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGlzVXBkYXRlID0gQm9vbGVhbihvcmlnaW5hbCk7XG4gIGNvbnN0IGJhc2VCb2R5ID0ge1xuICAgIGFjdGlvbjogaXNVcGRhdGUgPyAndXBkYXRlJyA6ICdhZGQnLFxuICAgIHNraWxsOiBpc1VwZGF0ZSA/IG9yaWdpbmFsIDogc2tpbGwsXG4gICAgLi4uKGlzVXBkYXRlID8geyBza2lsbF9uZXc6IHNraWxsIH0gOiB7fSksXG4gICAgZXhwZXJpZW5jZXMsXG4gICAgYWxpYXNlcyxcbiAgICB5ZWFycyxcbiAgfTtcbiAgY29uc3QgYm9keSA9IGlzRmxhdCA/IGJhc2VCb2R5IDogeyAuLi5iYXNlQm9keSwgY2F0ZWdvcnkgfTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvc2tpbGwnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBjbG9zZVNraWxsTW9kYWwoKTtcbiAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ1NraWxscycsIGRhdGEuYWN0aW9uIHx8ICd1cGRhdGVkJyk7XG4gICAgICBhd2FpdCBwb3B1bGF0ZU1hc3RlclRhYigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgZGF0YS5lcnJvciB8fCAnQ291bGQgbm90IGFkZCBza2lsbCcpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIGFkZCBza2lsbCcpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZU1hc3RlclNraWxsKHNraWxsLCBjYXRlZ29yeSwgaXNGbGF0KSB7XG4gIGNvbnN0IGJvZHkgPSBpc0ZsYXQgPyB7IGFjdGlvbjogJ2RlbGV0ZScsIHNraWxsIH0gOiB7IGFjdGlvbjogJ2RlbGV0ZScsIHNraWxsLCBjYXRlZ29yeSB9O1xuICBjb25zdCBzY29wZSA9IGlzRmxhdCA/ICdTa2lsbHMnIDogYFNraWxscyBcdTIxOTIgJHtjYXRlZ29yeX1gO1xuICBzaG93Q29uZmlybU1vZGFsKFxuICAgICdcdUQ4M0RcdURERDFcdUZFMEYgRGVsZXRlIFNraWxsJyxcbiAgICBgRGVsZXRlIHNraWxsIFwiJHtza2lsbH1cIiBmcm9tICR7c2NvcGV9PyBUaGlzIGNhbm5vdCBiZSB1bmRvbmUuYCxcbiAgICBhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvc2tpbGwnLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LCBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICBpZiAoZGF0YS5vaykge1xuICAgICAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ1NraWxscycsIGRhdGEuYWN0aW9uIHx8ICd1cGRhdGVkJyk7XG4gICAgICAgICAgYXdhaXQgcG9wdWxhdGVNYXN0ZXJUYWIoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgZGF0YS5lcnJvciB8fCAnQ291bGQgbm90IHJlbW92ZSBza2lsbCcpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIHJlbW92ZSBza2lsbCcpO1xuICAgICAgfVxuICAgIH1cbiAgKTtcbn1cblxuLy8gLS0tLSBFZHVjYXRpb24gbW9kYWwgaGFuZGxlcnMgLS0tLVxuXG5mdW5jdGlvbiBzaG93QWRkRWR1Y2F0aW9uTW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtbW9kYWwtaWR4JykudmFsdWUgICAgICAgICAgICA9ICctMSc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtZGVncmVlLWlucHV0JykudmFsdWUgICAgICAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LWZpZWxkLWlucHV0JykudmFsdWUgICAgICAgICAgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkdS1pbnN0aXR1dGlvbi1pbnB1dCcpLnZhbHVlICAgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtY2l0eS1pbnB1dCcpLnZhbHVlICAgICAgICAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LXN0YXRlLWlucHV0JykudmFsdWUgICAgICAgICAgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkdS1zdGFydC15ZWFyLWlucHV0JykudmFsdWUgICAgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtZW5kLXllYXItaW5wdXQnKS52YWx1ZSAgICAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWVkdS1tb2RhbC10aXRsZScpLnRleHRDb250ZW50ID0gJ0FkZCBFZHVjYXRpb24nO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWVkdS1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBzZXRJbml0aWFsRm9jdXMoJ21hc3Rlci1lZHUtbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ21hc3Rlci1lZHUtbW9kYWwtb3ZlcmxheScpO1xufVxuXG5mdW5jdGlvbiBlZGl0TWFzdGVyRWR1Y2F0aW9uKGVkdSwgaWR4KSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtbW9kYWwtaWR4JykudmFsdWUgICAgICAgICA9IGlkeDtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkdS1kZWdyZWUtaW5wdXQnKS52YWx1ZSAgICAgID0gZWR1LmRlZ3JlZSB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkdS1maWVsZC1pbnB1dCcpLnZhbHVlICAgICAgID0gZWR1LmZpZWxkIHx8ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LWluc3RpdHV0aW9uLWlucHV0JykudmFsdWUgPSBlZHUuaW5zdGl0dXRpb24gfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtY2l0eS1pbnB1dCcpLnZhbHVlICAgICAgICA9IGVkdS5jaXR5IHx8ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LXN0YXRlLWlucHV0JykudmFsdWUgICAgICAgPSBlZHUuc3RhdGUgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtc3RhcnQteWVhci1pbnB1dCcpLnZhbHVlICA9IGVkdS5zdGFydF95ZWFyIHx8ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LWVuZC15ZWFyLWlucHV0JykudmFsdWUgICAgPSBlZHUuZW5kX3llYXIgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItZWR1LW1vZGFsLXRpdGxlJykudGV4dENvbnRlbnQgPSAnRWRpdCBFZHVjYXRpb24nO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWVkdS1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBzZXRJbml0aWFsRm9jdXMoJ21hc3Rlci1lZHUtbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ21hc3Rlci1lZHUtbW9kYWwtb3ZlcmxheScpO1xufVxuXG5mdW5jdGlvbiBjbG9zZUVkdWNhdGlvbk1vZGFsKCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWVkdS1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgcmVzdG9yZUZvY3VzKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNhdmVNYXN0ZXJFZHVjYXRpb24oKSB7XG4gIGNvbnN0IGlkeCAgICAgPSBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LW1vZGFsLWlkeCcpLnZhbHVlLCAxMCk7XG4gIGNvbnN0IGRlZ3JlZSAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LWRlZ3JlZS1pbnB1dCcpLnZhbHVlLnRyaW0oKTtcbiAgY29uc3QgaW5zdGl0dXRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LWluc3RpdHV0aW9uLWlucHV0JykudmFsdWUudHJpbSgpO1xuICBpZiAoIWRlZ3JlZSB8fCAhaW5zdGl0dXRpb24pIHtcbiAgICBzaG93QWxlcnRNb2RhbCgnXHUyNkEwXHVGRTBGIFZhbGlkYXRpb24nLCAnRGVncmVlIGFuZCBpbnN0aXR1dGlvbiBhcmUgcmVxdWlyZWQuJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGFjdGlvbiA9IGlkeCA+PSAwID8gJ3VwZGF0ZScgOiAnYWRkJztcbiAgY29uc3QgYm9keSA9IHtcbiAgICBhY3Rpb24sXG4gICAgZGVncmVlLFxuICAgIGZpZWxkOiAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LWZpZWxkLWlucHV0JykudmFsdWUudHJpbSgpLFxuICAgIGluc3RpdHV0aW9uLFxuICAgIGNpdHk6ICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LWNpdHktaW5wdXQnKS52YWx1ZS50cmltKCksXG4gICAgc3RhdGU6ICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtc3RhdGUtaW5wdXQnKS52YWx1ZS50cmltKCksXG4gICAgc3RhcnRfeWVhcjogIHBhcnNlSW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtc3RhcnQteWVhci1pbnB1dCcpLnZhbHVlLCAxMCkgfHwgbnVsbCxcbiAgICBlbmRfeWVhcjogICAgcGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkdS1lbmQteWVhci1pbnB1dCcpLnZhbHVlLCAxMCkgfHwgbnVsbCxcbiAgICAuLi4oYWN0aW9uID09PSAndXBkYXRlJyA/IHsgaWR4IH0gOiB7fSksXG4gIH07XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL2VkdWNhdGlvbicsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSwgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEub2spIHtcbiAgICAgIGNsb3NlRWR1Y2F0aW9uTW9kYWwoKTtcbiAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ0VkdWNhdGlvbicsIGRhdGEuYWN0aW9uIHx8ICd1cGRhdGVkJyk7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzA1IFNhdmVkJywgYEVkdWNhdGlvbiBcIiR7ZGVncmVlfSBcdTIwMTMgJHtpbnN0aXR1dGlvbn1cIiAke2RhdGEuYWN0aW9ufS5gKTtcbiAgICAgIGF3YWl0IHBvcHVsYXRlTWFzdGVyVGFiKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCBkYXRhLmVycm9yIHx8ICdTYXZlIGZhaWxlZCcpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIHNhdmUgZWR1Y2F0aW9uJyk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlTWFzdGVyRWR1Y2F0aW9uKGlkeCwgaW5zdGl0dXRpb24pIHtcbiAgc2hvd0NvbmZpcm1Nb2RhbChcbiAgICAnXHVEODNEXHVEREQxXHVGRTBGIERlbGV0ZSBFZHVjYXRpb24nLFxuICAgIGBEZWxldGUgXCIke2luc3RpdHV0aW9ufVwiPyBUaGlzIGNhbm5vdCBiZSB1bmRvbmUuYCxcbiAgICBhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvZWR1Y2F0aW9uJywge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGFjdGlvbjogJ2RlbGV0ZScsIGlkeCB9KSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICBpZiAoZGF0YS5vaykge1xuICAgICAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ0VkdWNhdGlvbicsIGRhdGEuYWN0aW9uIHx8ICdkZWxldGVkJyk7XG4gICAgICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjcwNSBEZWxldGVkJywgYEVkdWNhdGlvbiBlbnRyeSByZW1vdmVkLmApO1xuICAgICAgICAgIGF3YWl0IHBvcHVsYXRlTWFzdGVyVGFiKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsIGRhdGEuZXJyb3IgfHwgJ0RlbGV0ZSBmYWlsZWQnKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgJ0ZhaWxlZCB0byBkZWxldGUgZWR1Y2F0aW9uIGVudHJ5Jyk7XG4gICAgICB9XG4gICAgfVxuICApO1xufVxuXG4vLyAtLS0tIEF3YXJkIG1vZGFsIGhhbmRsZXJzIC0tLS1cblxuZnVuY3Rpb24gc2hvd0FkZEF3YXJkTW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhd2FyZC1tb2RhbC1pZHgnKS52YWx1ZSAgICA9ICctMSc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhd2FyZC10aXRsZS1pbnB1dCcpLnZhbHVlICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXdhcmQteWVhci1pbnB1dCcpLnZhbHVlICAgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F3YXJkLWRlc2MtaW5wdXQnKS52YWx1ZSAgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhd2FyZC1yZWxldmFudC1pbnB1dCcpLnZhbHVlID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItYXdhcmQtbW9kYWwtdGl0bGUnKS50ZXh0Q29udGVudCA9ICdBZGQgQXdhcmQgLyBIb25vdXInO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWF3YXJkLW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICBfZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIHNldEluaXRpYWxGb2N1cygnbWFzdGVyLWF3YXJkLW1vZGFsLW92ZXJsYXknKTtcbiAgdHJhcEZvY3VzKCdtYXN0ZXItYXdhcmQtbW9kYWwtb3ZlcmxheScpO1xufVxuXG5mdW5jdGlvbiBlZGl0TWFzdGVyQXdhcmQoYXdhcmQsIGlkeCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXdhcmQtbW9kYWwtaWR4JykudmFsdWUgICAgID0gaWR4O1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXdhcmQtdGl0bGUtaW5wdXQnKS52YWx1ZSAgID0gYXdhcmQudGl0bGUgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhd2FyZC15ZWFyLWlucHV0JykudmFsdWUgICAgPSBhd2FyZC55ZWFyIHx8ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXdhcmQtZGVzYy1pbnB1dCcpLnZhbHVlICAgID0gYXdhcmQuZGVzY3JpcHRpb24gfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhd2FyZC1yZWxldmFudC1pbnB1dCcpLnZhbHVlID0gdHlwZW9mIGF3YXJkLnJlbGV2YW50X2ZvciA9PT0gJ3N0cmluZydcbiAgICA/IGF3YXJkLnJlbGV2YW50X2ZvciA6IChhd2FyZC5yZWxldmFudF9mb3IgfHwgW10pLmpvaW4oJywgJyk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItYXdhcmQtbW9kYWwtdGl0bGUnKS50ZXh0Q29udGVudCA9ICdFZGl0IEF3YXJkIC8gSG9ub3VyJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1hd2FyZC1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBzZXRJbml0aWFsRm9jdXMoJ21hc3Rlci1hd2FyZC1tb2RhbC1vdmVybGF5Jyk7XG4gIHRyYXBGb2N1cygnbWFzdGVyLWF3YXJkLW1vZGFsLW92ZXJsYXknKTtcbn1cblxuZnVuY3Rpb24gY2xvc2VBd2FyZE1vZGFsKCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWF3YXJkLW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICByZXN0b3JlRm9jdXMoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZU1hc3RlckF3YXJkKCkge1xuICBjb25zdCBpZHggICA9IHBhcnNlSW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhd2FyZC1tb2RhbC1pZHgnKS52YWx1ZSwgMTApO1xuICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhd2FyZC10aXRsZS1pbnB1dCcpLnZhbHVlLnRyaW0oKTtcbiAgaWYgKCF0aXRsZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI2QTBcdUZFMEYgVmFsaWRhdGlvbicsICdBd2FyZCB0aXRsZSBpcyByZXF1aXJlZC4nKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgYWN0aW9uID0gaWR4ID49IDAgPyAndXBkYXRlJyA6ICdhZGQnO1xuICBjb25zdCByZWxldmFudFJhdyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhd2FyZC1yZWxldmFudC1pbnB1dCcpLnZhbHVlO1xuICBjb25zdCBib2R5ID0ge1xuICAgIGFjdGlvbiwgdGl0bGUsXG4gICAgeWVhcjogICAgICAgICBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXdhcmQteWVhci1pbnB1dCcpLnZhbHVlLCAxMCkgfHwgbnVsbCxcbiAgICBkZXNjcmlwdGlvbjogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhd2FyZC1kZXNjLWlucHV0JykudmFsdWUudHJpbSgpLFxuICAgIHJlbGV2YW50X2ZvcjogcmVsZXZhbnRSYXcuc3BsaXQoJywnKS5tYXAocyA9PiBzLnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pLFxuICAgIC4uLihhY3Rpb24gPT09ICd1cGRhdGUnID8geyBpZHggfSA6IHt9KSxcbiAgfTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvYXdhcmQnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBjbG9zZUF3YXJkTW9kYWwoKTtcbiAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ0F3YXJkcyAmIEhvbm91cnMnLCBkYXRhLmFjdGlvbiB8fCAndXBkYXRlZCcpO1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjcwNSBTYXZlZCcsIGBBd2FyZCBcIiR7dGl0bGV9XCIgJHtkYXRhLmFjdGlvbn0uYCk7XG4gICAgICBhd2FpdCBwb3B1bGF0ZU1hc3RlclRhYigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgZGF0YS5lcnJvciB8fCAnU2F2ZSBmYWlsZWQnKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgJ0ZhaWxlZCB0byBzYXZlIGF3YXJkJyk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlTWFzdGVyQXdhcmQoaWR4LCB0aXRsZSkge1xuICBzaG93Q29uZmlybU1vZGFsKFxuICAgICdcdUQ4M0RcdURERDFcdUZFMEYgRGVsZXRlIEF3YXJkJyxcbiAgICBgRGVsZXRlIFwiJHt0aXRsZX1cIj8gVGhpcyBjYW5ub3QgYmUgdW5kb25lLmAsXG4gICAgYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL2F3YXJkJywge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGFjdGlvbjogJ2RlbGV0ZScsIGlkeCB9KSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICBpZiAoZGF0YS5vaykge1xuICAgICAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ0F3YXJkcyAmIEhvbm91cnMnLCBkYXRhLmFjdGlvbiB8fCAnZGVsZXRlZCcpO1xuICAgICAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3MDUgRGVsZXRlZCcsIGBBd2FyZCByZW1vdmVkLmApO1xuICAgICAgICAgIGF3YWl0IHBvcHVsYXRlTWFzdGVyVGFiKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsIGRhdGEuZXJyb3IgfHwgJ0RlbGV0ZSBmYWlsZWQnKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgJ0ZhaWxlZCB0byBkZWxldGUgYXdhcmQnKTtcbiAgICAgIH1cbiAgICB9XG4gICk7XG59XG5cbi8vIC0tLS0gQ2VydGlmaWNhdGlvbiBDUlVEIGhhbmRsZXJzIC0tLS1cblxuZnVuY3Rpb24gc2hvd0FkZENlcnRpZmljYXRpb25Nb2RhbCgpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NlcnQtbW9kYWwtaWR4JykudmFsdWUgICAgPSAnLTEnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2VydC1uYW1lLWlucHV0JykudmFsdWUgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2VydC1pc3N1ZXItaW5wdXQnKS52YWx1ZSA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2VydC15ZWFyLWlucHV0JykudmFsdWUgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWNlcnQtbW9kYWwtdGl0bGUnKS50ZXh0Q29udGVudCA9ICdBZGQgQ2VydGlmaWNhdGlvbic7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItY2VydC1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBzZXRJbml0aWFsRm9jdXMoJ21hc3Rlci1jZXJ0LW1vZGFsLW92ZXJsYXknKTtcbiAgdHJhcEZvY3VzKCdtYXN0ZXItY2VydC1tb2RhbC1vdmVybGF5Jyk7XG59XG5cbmZ1bmN0aW9uIGVkaXRNYXN0ZXJDZXJ0aWZpY2F0aW9uKGNlcnQsIGlkeCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2VydC1tb2RhbC1pZHgnKS52YWx1ZSAgICA9IGlkeDtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NlcnQtbmFtZS1pbnB1dCcpLnZhbHVlICAgPSBjZXJ0Lm5hbWUgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjZXJ0LWlzc3Vlci1pbnB1dCcpLnZhbHVlID0gY2VydC5pc3N1ZXIgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjZXJ0LXllYXItaW5wdXQnKS52YWx1ZSAgID0gY2VydC55ZWFyIHx8ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWNlcnQtbW9kYWwtdGl0bGUnKS50ZXh0Q29udGVudCA9ICdFZGl0IENlcnRpZmljYXRpb24nO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWNlcnQtbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgc2V0SW5pdGlhbEZvY3VzKCdtYXN0ZXItY2VydC1tb2RhbC1vdmVybGF5Jyk7XG4gIHRyYXBGb2N1cygnbWFzdGVyLWNlcnQtbW9kYWwtb3ZlcmxheScpO1xufVxuXG5mdW5jdGlvbiBjbG9zZUNlcnRpZmljYXRpb25Nb2RhbCgpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1jZXJ0LW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICByZXN0b3JlRm9jdXMoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZU1hc3RlckNlcnRpZmljYXRpb24oKSB7XG4gIGNvbnN0IGlkeCAgPSBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2VydC1tb2RhbC1pZHgnKS52YWx1ZSwgMTApO1xuICBjb25zdCBuYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NlcnQtbmFtZS1pbnB1dCcpLnZhbHVlLnRyaW0oKTtcbiAgaWYgKCFuYW1lKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjZBMFx1RkUwRiBWYWxpZGF0aW9uJywgJ0NlcnRpZmljYXRpb24gbmFtZSBpcyByZXF1aXJlZC4nKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgYWN0aW9uID0gaWR4ID49IDAgPyAndXBkYXRlJyA6ICdhZGQnO1xuICBjb25zdCBib2R5ID0ge1xuICAgIGFjdGlvbiwgbmFtZSxcbiAgICBpc3N1ZXI6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjZXJ0LWlzc3Vlci1pbnB1dCcpLnZhbHVlLnRyaW0oKSxcbiAgICB5ZWFyOiAgIHBhcnNlSW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjZXJ0LXllYXItaW5wdXQnKS52YWx1ZSwgMTApIHx8IG51bGwsXG4gICAgLi4uKGFjdGlvbiA9PT0gJ3VwZGF0ZScgPyB7IGlkeCB9IDoge30pLFxuICB9O1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS9jZXJ0aWZpY2F0aW9uJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LCBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgY2xvc2VDZXJ0aWZpY2F0aW9uTW9kYWwoKTtcbiAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ0NlcnRpZmljYXRpb25zJywgZGF0YS5hY3Rpb24gfHwgJ3VwZGF0ZWQnKTtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3MDUgU2F2ZWQnLCBgQ2VydGlmaWNhdGlvbiBcIiR7bmFtZX1cIiAke2RhdGEuYWN0aW9ufS5gKTtcbiAgICAgIGF3YWl0IHBvcHVsYXRlTWFzdGVyVGFiKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCBkYXRhLmVycm9yIHx8ICdTYXZlIGZhaWxlZCcpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIHNhdmUgY2VydGlmaWNhdGlvbicpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZU1hc3RlckNlcnRpZmljYXRpb24oaWR4LCBuYW1lKSB7XG4gIHNob3dDb25maXJtTW9kYWwoXG4gICAgJ1x1RDgzRFx1REREMVx1RkUwRiBEZWxldGUgQ2VydGlmaWNhdGlvbicsXG4gICAgYERlbGV0ZSBcIiR7bmFtZX1cIj8gVGhpcyBjYW5ub3QgYmUgdW5kb25lLmAsXG4gICAgYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL2NlcnRpZmljYXRpb24nLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgYWN0aW9uOiAnZGVsZXRlJywgaWR4IH0pLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICAgICAgX3NldE1hc3RlckNoYW5nZU5vdGljZSgnQ2VydGlmaWNhdGlvbnMnLCBkYXRhLmFjdGlvbiB8fCAnZGVsZXRlZCcpO1xuICAgICAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3MDUgRGVsZXRlZCcsIGBDZXJ0aWZpY2F0aW9uIHJlbW92ZWQuYCk7XG4gICAgICAgICAgYXdhaXQgcG9wdWxhdGVNYXN0ZXJUYWIoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgZGF0YS5lcnJvciB8fCAnRGVsZXRlIGZhaWxlZCcpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIGRlbGV0ZSBjZXJ0aWZpY2F0aW9uJyk7XG4gICAgICB9XG4gICAgfVxuICApO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgQmFja3VwIEhpc3RvcnkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIG9wZW5CYWNrdXBIaXN0b3J5TW9kYWwoKSB7XG4gIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgb3ZlcmxheS5pZCA9ICdiYWNrdXAtaGlzdG9yeS1vdmVybGF5JztcbiAgb3ZlcmxheS5zdHlsZS5jc3NUZXh0ID0gJ3Bvc2l0aW9uOmZpeGVkO2luc2V0OjA7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLDAuNSk7ei1pbmRleDoxMDAwMDtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7JztcbiAgb3ZlcmxheS5pbm5lckhUTUwgPSBgXG4gICAgPGRpdiByb2xlPVwiZGlhbG9nXCIgYXJpYS1tb2RhbD1cInRydWVcIiBhcmlhLWxhYmVsbGVkYnk9XCJiYWNrdXAtbW9kYWwtdGl0bGVcIlxuICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZmY7Ym9yZGVyLXJhZGl1czoxMHB4O3BhZGRpbmc6MjRweCAyOHB4O21heC13aWR0aDo1NjBweDt3aWR0aDo5NCU7XG4gICAgICAgICAgICAgICAgbWF4LWhlaWdodDo4MHZoO292ZXJmbG93LXk6YXV0bztib3gtc2hhZG93OjAgMjBweCA2MHB4IHJnYmEoMCwwLDAsMC4zKTtcIj5cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO21hcmdpbi1ib3R0b206MTZweDtcIj5cbiAgICAgICAgPGgzIGlkPVwiYmFja3VwLW1vZGFsLXRpdGxlXCIgc3R5bGU9XCJtYXJnaW46MDtmb250LXNpemU6MS4xZW07Y29sb3I6IzFlMjkzYjtcIj5cdUQ4M0RcdURENTAgQmFja3VwIEhpc3Rvcnk8L2gzPlxuICAgICAgICA8YnV0dG9uIGlkPVwiYmFja3VwLW1vZGFsLWNsb3NlXCIgc3R5bGU9XCJiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOm5vbmU7Zm9udC1zaXplOjEuM2VtO2N1cnNvcjpwb2ludGVyO2NvbG9yOiM2NDc0OGI7XCIgYXJpYS1sYWJlbD1cIkNsb3NlXCI+XHUyNzE1PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxwIHN0eWxlPVwiZm9udC1zaXplOjAuODhlbTtjb2xvcjojNjQ3NDhiO21hcmdpbi1ib3R0b206MTZweDtcIj5cbiAgICAgICAgQSBiYWNrdXAgaXMgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IGJlZm9yZSBldmVyeSBzYXZlLiBSZXN0b3Jpbmcgd2lsbCBwcmVzZXJ2ZSB0aGUgY3VycmVudCB2ZXJzaW9uIGFzIGEgbmV3IGJhY2t1cCBmaXJzdC5cbiAgICAgIDwvcD5cbiAgICAgIDxkaXYgaWQ9XCJiYWNrdXAtbGlzdC1ib2R5XCIgc3R5bGU9XCJmb250LXNpemU6MC45ZW07XCI+TG9hZGluZ1x1MjAyNjwvZGl2PlxuICAgIDwvZGl2PmA7XG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQob3ZlcmxheSk7XG4gIGlmICh0eXBlb2YgdHJhcEZvY3VzID09PSAnZnVuY3Rpb24nKSB0cmFwRm9jdXMoJ2JhY2t1cC1oaXN0b3J5LW92ZXJsYXknKTtcbiAgY29uc3QgY2xvc2UgPSAoKSA9PiB7IG92ZXJsYXkucmVtb3ZlKCk7IGlmICh0eXBlb2YgcmVzdG9yZUZvY3VzID09PSAnZnVuY3Rpb24nKSByZXN0b3JlRm9jdXMoKTsgfTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhY2t1cC1tb2RhbC1jbG9zZScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xvc2UpO1xuICBvdmVybGF5LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZSA9PiB7IGlmIChlLnRhcmdldCA9PT0gb3ZlcmxheSkgY2xvc2UoKTsgfSk7XG4gIG92ZXJsYXkuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGUgPT4geyBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSBjbG9zZSgpOyB9KTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL2hpc3RvcnknKTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBjb25zdCBib2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhY2t1cC1saXN0LWJvZHknKTtcbiAgICBpZiAoIWJvZHkpIHJldHVybjtcbiAgICBpZiAoIWRhdGEub2sgfHwgIWRhdGEuc25hcHNob3RzPy5sZW5ndGgpIHtcbiAgICAgIGJvZHkudGV4dENvbnRlbnQgPSAnTm8gYmFja3VwcyBmb3VuZC4nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByb3dzID0gZGF0YS5zbmFwc2hvdHMubWFwKHMgPT4ge1xuICAgICAgY29uc3QgZHQgPSBuZXcgRGF0ZShzLm10aW1lICogMTAwMCkudG9Mb2NhbGVTdHJpbmcoKTtcbiAgICAgIGNvbnN0IGtiID0gKHMuc2l6ZSAvIDEwMjQpLnRvRml4ZWQoMSk7XG4gICAgICByZXR1cm4gYDx0cj5cbiAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzo2cHggOHB4O2NvbG9yOiMxZTI5M2I7XCI+JHtlc2NhcGVIdG1sKGR0KX08L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOjZweCA4cHg7Y29sb3I6IzY0NzQ4Yjt3aGl0ZS1zcGFjZTpub3dyYXA7XCI+JHtrYn0gS0I8L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOjZweCA4cHg7XCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG4gc2Vjb25kYXJ5XCIgc3R5bGU9XCJwYWRkaW5nOjNweCAxMHB4O2ZvbnQtc2l6ZTowLjgyZW07XCJcbiAgICAgICAgICAgIG9uY2xpY2s9XCJyZXN0b3JlQmFja3VwKCR7SlNPTi5zdHJpbmdpZnkocy5maWxlbmFtZSl9KVwiPlJlc3RvcmU8L2J1dHRvbj5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvdHI+YDtcbiAgICB9KS5qb2luKCcnKTtcbiAgICBib2R5LmlubmVySFRNTCA9IGA8dGFibGUgc3R5bGU9XCJ3aWR0aDoxMDAlO2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTtcIj5cbiAgICAgIDx0aGVhZD48dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZTJlOGYwO1wiPlxuICAgICAgICA8dGggc3R5bGU9XCJwYWRkaW5nOjRweCA4cHg7dGV4dC1hbGlnbjpsZWZ0O2NvbG9yOiM0NzU1Njk7Zm9udC13ZWlnaHQ6NjAwO1wiPlNhdmVkPC90aD5cbiAgICAgICAgPHRoIHN0eWxlPVwicGFkZGluZzo0cHggOHB4O3RleHQtYWxpZ246bGVmdDtjb2xvcjojNDc1NTY5O2ZvbnQtd2VpZ2h0OjYwMDtcIj5TaXplPC90aD5cbiAgICAgICAgPHRoPjwvdGg+XG4gICAgICA8L3RyPjwvdGhlYWQ+XG4gICAgICA8dGJvZHk+JHtyb3dzfTwvdGJvZHk+XG4gICAgPC90YWJsZT5gO1xuICB9IGNhdGNoIChfKSB7XG4gICAgY29uc3QgYm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYWNrdXAtbGlzdC1ib2R5Jyk7XG4gICAgaWYgKGJvZHkpIGJvZHkudGV4dENvbnRlbnQgPSAnRmFpbGVkIHRvIGxvYWQgYmFja3VwIGhpc3RvcnkuJztcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZXN0b3JlQmFja3VwKGZpbGVuYW1lKSB7XG4gIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0ICh0eXBlb2YgY29uZmlybURpYWxvZyA9PT0gJ2Z1bmN0aW9uJ1xuICAgID8gY29uZmlybURpYWxvZygnUmVzdG9yZSB0aGlzIGJhY2t1cD8gVGhlIGN1cnJlbnQgdmVyc2lvbiB3aWxsIGJlIHNhdmVkIGFzIGEgbmV3IGJhY2t1cCBmaXJzdC4nKVxuICAgIDogUHJvbWlzZS5yZXNvbHZlKHdpbmRvdy5jb25maXJtKCdSZXN0b3JlIHRoaXMgYmFja3VwPyBUaGUgY3VycmVudCB2ZXJzaW9uIHdpbGwgYmUgc2F2ZWQgYXMgYSBuZXcgYmFja3VwIGZpcnN0LicpKSk7XG4gIGlmICghY29uZmlybWVkKSByZXR1cm47XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvcmVzdG9yZScsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGZpbGVuYW1lIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja3VwLWhpc3Rvcnktb3ZlcmxheScpPy5yZW1vdmUoKTtcbiAgICAgIGlmICh0eXBlb2YgcmVzdG9yZUZvY3VzID09PSAnZnVuY3Rpb24nKSByZXN0b3JlRm9jdXMoKTtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3MDUgUmVzdG9yZWQnLCAnTWFzdGVyIENWIHJlc3RvcmVkIGZyb20gYmFja3VwLiBSZWxvYWQgdGhlIHRhYiB0byBzZWUgdGhlIHVwZGF0ZWQgZGF0YS4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsIGRhdGEuZXJyb3IgfHwgJ1Jlc3RvcmUgZmFpbGVkLicpO1xuICAgIH1cbiAgfSBjYXRjaCAoXykge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIHJlc3RvcmUgYmFja3VwLicpO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBVbmRvIC8gUmVkbyAoR0FQLTE5IDE2LjcpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuLy8gU2luZ2xlLWxldmVsOiBVbmRvIHJlc3RvcmVzIHRoZSBtb3N0IHJlY2VudCBiYWNrdXAgc25hcHNob3QgKGkuZS4gdGhlXG4vLyBzdGF0ZSBiZWZvcmUgdGhlIGxhc3Qgc2F2ZSk7IFJlZG8gcmVzdG9yZXMgdGhlIHNhZmV0eSBiYWNrdXAgdGhlIHJlc3RvcmVcbi8vIGVuZHBvaW50IHRvb2sgb2YgdGhlIHByZS11bmRvIHN0YXRlLiBCb3RoIHJldXNlIHRoZSBleGlzdGluZ1xuLy8gL2FwaS9tYXN0ZXItZGF0YS9oaXN0b3J5ICsgL2FwaS9tYXN0ZXItZGF0YS9yZXN0b3JlIGVuZHBvaW50cyByYXRoZXIgdGhhblxuLy8gYWRkaW5nIG5ldyBiYWNrZW5kIHN1cmZhY2UgXHUyMDE0IHNlZSBfbWFzdGVyQ3ZSZWRvQmFja3VwIGFib3ZlIGZvciB0aGUgcmVzZXRcbi8vIGNvbnRyYWN0IHdpdGggcG9wdWxhdGVNYXN0ZXJUYWIoKS5cblxuYXN5bmMgZnVuY3Rpb24gdW5kb01hc3RlckRhdGFDaGFuZ2UoKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvaGlzdG9yeScpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmICghZGF0YS5vayB8fCAhZGF0YS5zbmFwc2hvdHM/Lmxlbmd0aCkge1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjEzOVx1RkUwRiBOb3RoaW5nIHRvIHVuZG8nLCAnTm8gYmFja3VwIHNuYXBzaG90cyBhcmUgYXZhaWxhYmxlIHlldC4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbW9zdFJlY2VudCA9IGRhdGEuc25hcHNob3RzWzBdOyAvLyBoaXN0b3J5IHJvdXRlIHJldHVybnMgbmV3ZXN0LWZpcnN0XG4gICAgY29uc3Qgd2hlbiA9IG5ldyBEYXRlKG1vc3RSZWNlbnQubXRpbWUgKiAxMDAwKS50b0xvY2FsZVN0cmluZygpO1xuICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0ICh0eXBlb2YgY29uZmlybURpYWxvZyA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgPyBjb25maXJtRGlhbG9nKGBVbmRvIHRoZSBtb3N0IHJlY2VudCBjaGFuZ2U/IFRoaXMgcmVzdG9yZXMgdGhlIHZlcnNpb24gc2F2ZWQgJHt3aGVufS4gVGhlIGN1cnJlbnQgdmVyc2lvbiB3aWxsIGJlIHNhdmVkIGFzIGEgbmV3IGJhY2t1cCBmaXJzdC5gKVxuICAgICAgOiBQcm9taXNlLnJlc29sdmUod2luZG93LmNvbmZpcm0oYFVuZG8gdGhlIG1vc3QgcmVjZW50IGNoYW5nZT8gVGhpcyByZXN0b3JlcyB0aGUgdmVyc2lvbiBzYXZlZCAke3doZW59LmApKSk7XG4gICAgaWYgKCFjb25maXJtZWQpIHJldHVybjtcblxuICAgIGNvbnN0IHJlc3RvcmVSZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS9yZXN0b3JlJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgZmlsZW5hbWU6IG1vc3RSZWNlbnQuZmlsZW5hbWUgfSksXG4gICAgfSk7XG4gICAgY29uc3QgcmVzdG9yZURhdGEgPSBhd2FpdCByZXN0b3JlUmVzLmpzb24oKTtcbiAgICBpZiAocmVzdG9yZURhdGEub2spIHtcbiAgICAgIC8vIE11c3QgYmUgc2V0ICpiZWZvcmUqIHBvcHVsYXRlTWFzdGVyVGFiKCkgcmVuZGVycyB0aGUgUmVkbyBidXR0b24sXG4gICAgICAvLyBub3QgYWZ0ZXIgXHUyMDE0IHRoZSBidXR0b24ncyBkaXNhYmxlZCBzdGF0ZSBpcyBiYWtlZCBpbnRvIHRoYXQgcmVuZGVyLlxuICAgICAgX21hc3RlckN2UmVkb0JhY2t1cCA9IHJlc3RvcmVEYXRhLnNhZmV0eV9iYWNrdXAgfHwgbnVsbDtcbiAgICAgIF9tYXN0ZXJDdlN1cHByZXNzUmVkb1Jlc2V0ID0gdHJ1ZTtcbiAgICAgIGF3YWl0IHBvcHVsYXRlTWFzdGVyVGFiKCk7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzA1IFVuZG9uZScsICdNYXN0ZXIgQ1YgcmV2ZXJ0ZWQgdG8gdGhlIHByZXZpb3VzIHNhdmVkIHZlcnNpb24uJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCByZXN0b3JlRGF0YS5lcnJvciB8fCAnVW5kbyBmYWlsZWQuJyk7XG4gICAgfVxuICB9IGNhdGNoIChfKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsICdGYWlsZWQgdG8gdW5kby4nKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZWRvTWFzdGVyRGF0YUNoYW5nZSgpIHtcbiAgaWYgKCFfbWFzdGVyQ3ZSZWRvQmFja3VwKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjEzOVx1RkUwRiBOb3RoaW5nIHRvIHJlZG8nLCAnVGhlcmUgaXMgbm8gdW5kb25lIGNoYW5nZSB0byByZXN0b3JlLicpO1xuICAgIHJldHVybjtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL3Jlc3RvcmUnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBmaWxlbmFtZTogX21hc3RlckN2UmVkb0JhY2t1cCB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgLy8gRGVsaWJlcmF0ZWx5IGRvIG5vdCByZS1hcm0gcmVkbyBcdTIwMTQgdGhpcyByZXN0b3JlIGNvbnN1bWVzIHRoZSByZWRvXG4gICAgICAvLyB0YXJnZXQsIGFuZCBwb3B1bGF0ZU1hc3RlclRhYigpJ3MgZGVmYXVsdCByZXNldCBjbGVhcnMgaXQuXG4gICAgICBhd2FpdCBwb3B1bGF0ZU1hc3RlclRhYigpO1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjcwNSBSZWRvbmUnLCAnTWFzdGVyIENWIHJlc3RvcmVkIHRvIHRoZSB2ZXJzaW9uIGJlZm9yZSB0aGUgdW5kby4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsIGRhdGEuZXJyb3IgfHwgJ1JlZG8gZmFpbGVkLicpO1xuICAgIH1cbiAgfSBjYXRjaCAoXykge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIHJlZG8uJyk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZXhwb3J0TWFzdGVyQ1YoKSB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2Vzc2lvbklkID0gd2luZG93Ll9jdXJyZW50U2Vzc2lvbklkO1xuICAgIGNvbnN0IHVybCA9IGAvYXBpL21hc3Rlci1kYXRhL2V4cG9ydCR7c2Vzc2lvbklkID8gYD9zZXNzaW9uX2lkPSR7c2Vzc2lvbklkfWAgOiAnJ31gO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgaWYgKCFyZXMub2spIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRXhwb3J0IGZhaWxlZCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBibG9iID0gYXdhaXQgcmVzLmJsb2IoKTtcbiAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgIGEuaHJlZiA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgYS5kb3dubG9hZCA9ICdNYXN0ZXJfQ1ZfRGF0YS5qc29uJztcbiAgICBhLmNsaWNrKCk7XG4gICAgVVJMLnJldm9rZU9iamVjdFVSTChhLmhyZWYpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsICdGYWlsZWQgdG8gZXhwb3J0IG1hc3RlciBDVicpO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBGdWxsIGRhdGEgcHJldmlldyAoR0FQLTE5IDE2LjE1KSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gb3BlbkZ1bGxEYXRhUHJldmlld01vZGFsKCkge1xuICBjb25zdCBvdmVybGF5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIG92ZXJsYXkuaWQgPSAnbWFzdGVyLWN2LXByZXZpZXctb3ZlcmxheSc7XG4gIG92ZXJsYXkuc3R5bGUuY3NzVGV4dCA9ICdwb3NpdGlvbjpmaXhlZDtpbnNldDowO2JhY2tncm91bmQ6cmdiYSgwLDAsMCwwLjUpO3otaW5kZXg6MTAwMDA7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyOyc7XG4gIG92ZXJsYXkuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgcm9sZT1cImRpYWxvZ1wiIGFyaWEtbW9kYWw9XCJ0cnVlXCIgYXJpYS1sYWJlbGxlZGJ5PVwibWFzdGVyLWN2LXByZXZpZXctdGl0bGVcIlxuICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZmY7Ym9yZGVyLXJhZGl1czoxMHB4O3BhZGRpbmc6MjRweCAyOHB4O21heC13aWR0aDo3NjBweDt3aWR0aDo5NCU7XG4gICAgICAgICAgICAgICAgbWF4LWhlaWdodDo4NXZoO292ZXJmbG93LXk6YXV0bztib3gtc2hhZG93OjAgMjBweCA2MHB4IHJnYmEoMCwwLDAsMC4zKTtcIj5cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO21hcmdpbi1ib3R0b206MTZweDtcIj5cbiAgICAgICAgPGgzIGlkPVwibWFzdGVyLWN2LXByZXZpZXctdGl0bGVcIiBzdHlsZT1cIm1hcmdpbjowO2ZvbnQtc2l6ZToxLjFlbTtjb2xvcjojMWUyOTNiO1wiPlx1RDgzRFx1REM0MSBGdWxsIE1hc3RlciBDViBEYXRhIChyZWFkLW9ubHkpPC9oMz5cbiAgICAgICAgPGJ1dHRvbiBpZD1cIm1hc3Rlci1jdi1wcmV2aWV3LWNsb3NlXCIgc3R5bGU9XCJiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOm5vbmU7Zm9udC1zaXplOjEuM2VtO2N1cnNvcjpwb2ludGVyO2NvbG9yOiM2NDc0OGI7XCIgYXJpYS1sYWJlbD1cIkNsb3NlXCI+XHUyNzE1PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxwIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtjb2xvcjojNjQ3NDhiO21hcmdpbi1ib3R0b206MTJweDtcIj5cbiAgICAgICAgVGhlIGNvbXBsZXRlLCB1bmZpbHRlcmVkIGNvbnRlbnRzIG9mIDxjb2RlPk1hc3Rlcl9DVl9EYXRhLmpzb248L2NvZGU+IFx1MjAxNCBpbmNsdWRpbmcgYW55IGZpZWxkcyB0aGUgc3RydWN0dXJlZCBlZGl0b3JzIGFib3ZlIGRvbid0IHN1cmZhY2UuXG4gICAgICA8L3A+XG4gICAgICA8cHJlIGlkPVwibWFzdGVyLWN2LXByZXZpZXctYm9keVwiIHN0eWxlPVwiYmFja2dyb3VuZDojZjhmYWZjO2JvcmRlcjoxcHggc29saWQgI2UyZThmMDtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjEycHg7Zm9udC1zaXplOjAuOGVtO2xpbmUtaGVpZ2h0OjEuNTt3aGl0ZS1zcGFjZTpwcmUtd3JhcDt3b3JkLWJyZWFrOmJyZWFrLXdvcmQ7XCI+TG9hZGluZ1x1MjAyNjwvcHJlPlxuICAgIDwvZGl2PmA7XG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQob3ZlcmxheSk7XG4gIGlmICh0eXBlb2YgdHJhcEZvY3VzID09PSAnZnVuY3Rpb24nKSB0cmFwRm9jdXMoJ21hc3Rlci1jdi1wcmV2aWV3LW92ZXJsYXknKTtcbiAgY29uc3QgY2xvc2UgPSAoKSA9PiB7IG92ZXJsYXkucmVtb3ZlKCk7IGlmICh0eXBlb2YgcmVzdG9yZUZvY3VzID09PSAnZnVuY3Rpb24nKSByZXN0b3JlRm9jdXMoKTsgfTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1jdi1wcmV2aWV3LWNsb3NlJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjbG9zZSk7XG4gIG92ZXJsYXkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4geyBpZiAoZS50YXJnZXQgPT09IG92ZXJsYXkpIGNsb3NlKCk7IH0pO1xuICBvdmVybGF5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4geyBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSBjbG9zZSgpOyB9KTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL2Z1bGwnKTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBjb25zdCBib2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1jdi1wcmV2aWV3LWJvZHknKTtcbiAgICBpZiAoYm9keSkgYm9keS50ZXh0Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsIDIpO1xuICB9IGNhdGNoIChfKSB7XG4gICAgY29uc3QgYm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItY3YtcHJldmlldy1ib2R5Jyk7XG4gICAgaWYgKGJvZHkpIGJvZHkudGV4dENvbnRlbnQgPSAnRmFpbGVkIHRvIGxvYWQgbWFzdGVyIENWIGRhdGEuJztcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgRnVsbC1maWxlIEpTT04gaW1wb3J0IHdpdGggZGlmZiByZXZpZXcgKEdBUC0xOSAxNi4xNikgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4vL1xuLy8gTm90IGEgbWVyZ2U6IGltcG9ydC1jb25maXJtIHJlcGxhY2VzIHRoZSBlbnRpcmUgZmlsZS4gVGhlIGltcG9ydC1wcmV2aWV3XG4vLyBzdGVwJ3Mgc2VjdGlvbi1sZXZlbCBjaGFuZ2VkL2NvdW50IHN1bW1hcnkgaXMgdGhlIHVzZXIncyBjaGFuY2UgdG8gY2F0Y2hcbi8vIGFuIHVuaW50ZW5kZWQgb3ZlcndyaXRlIGJlZm9yZSBjb25maXJtaW5nIFx1MjAxNCBmdWxsIGZpZWxkLWxldmVsIGRpZmZpbmdcbi8vIHdpdGhpbiBhIGNoYW5nZWQgc2VjdGlvbiBpcyBhIGtub3duIHYxIGxpbWl0YXRpb24gKHRoZSBzYW1lIHBvc3R1cmVcbi8vIGFscmVhZHkgYWNjZXB0ZWQgZm9yIG90aGVyIGFkdmlzb3J5LW9ubHkgcmV2aWV3IHN1cmZhY2VzIGluIHRoaXMgdGFiKS5cblxubGV0IF9tYXN0ZXJDdkltcG9ydERhdGEgPSBudWxsO1xuXG5mdW5jdGlvbiB0cmlnZ2VyTWFzdGVyQ3ZJbXBvcnQoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItY3YtaW1wb3J0LWZpbGUtaW5wdXQnKT8uY2xpY2soKTtcbn1cblxuZnVuY3Rpb24gaGFuZGxlTWFzdGVyQ3ZJbXBvcnRGaWxlKGV2ZW50KSB7XG4gIGNvbnN0IGZpbGUgPSBldmVudC50YXJnZXQ/LmZpbGVzPy5bMF07XG4gIGV2ZW50LnRhcmdldC52YWx1ZSA9ICcnOyAvLyBhbGxvdyByZS1zZWxlY3RpbmcgdGhlIHNhbWUgZmlsZW5hbWUgbGF0ZXJcbiAgaWYgKCFmaWxlKSByZXR1cm47XG4gIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gIHJlYWRlci5vbmxvYWQgPSBhc3luYyAoKSA9PiB7XG4gICAgbGV0IHBhcnNlZDtcbiAgICB0cnkge1xuICAgICAgcGFyc2VkID0gSlNPTi5wYXJzZShTdHJpbmcocmVhZGVyLnJlc3VsdCkpO1xuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnVGhhdCBmaWxlIGlzIG5vdCB2YWxpZCBKU09OLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXBhcnNlZCB8fCB0eXBlb2YgcGFyc2VkICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHBhcnNlZCkpIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRXhwZWN0ZWQgYSBKU09OIG9iamVjdCAoTWFzdGVyX0NWX0RhdGEuanNvbiBzaGFwZSksIG5vdCBhbiBhcnJheSBvciBzY2FsYXIuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IF9zdWJtaXRNYXN0ZXJDdkltcG9ydFByZXZpZXcocGFyc2VkKTtcbiAgfTtcbiAgcmVhZGVyLm9uZXJyb3IgPSAoKSA9PiBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgJ0ZhaWxlZCB0byByZWFkIHRoZSBzZWxlY3RlZCBmaWxlLicpO1xuICByZWFkZXIucmVhZEFzVGV4dChmaWxlKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gX3N1Ym1pdE1hc3RlckN2SW1wb3J0UHJldmlldyhwYXJzZWQpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS9pbXBvcnQtcHJldmlldycsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgZGF0YTogcGFyc2VkIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmICghZGF0YS5vaykge1xuICAgICAgY29uc3QgZGV0YWlsID0gKGRhdGEudmFsaWRhdGlvbl9lcnJvcnMgfHwgW10pLmpvaW4oJzsgJyk7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgZGV0YWlsID8gYCR7ZGF0YS5lcnJvcn06ICR7ZGV0YWlsfWAgOiAoZGF0YS5lcnJvciB8fCAnSW1wb3J0IHByZXZpZXcgZmFpbGVkLicpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgX21hc3RlckN2SW1wb3J0RGF0YSA9IHBhcnNlZDtcbiAgICBfc2hvd01hc3RlckN2SW1wb3J0UHJldmlld01vZGFsKGRhdGEuc2VjdGlvbnMgfHwgW10pO1xuICB9IGNhdGNoIChfKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsICdGYWlsZWQgdG8gcHJldmlldyB0aGUgaW1wb3J0LicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9zaG93TWFzdGVyQ3ZJbXBvcnRQcmV2aWV3TW9kYWwoc2VjdGlvbnMpIHtcbiAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBvdmVybGF5LmlkID0gJ21hc3Rlci1jdi1pbXBvcnQtb3ZlcmxheSc7XG4gIG92ZXJsYXkuc3R5bGUuY3NzVGV4dCA9ICdwb3NpdGlvbjpmaXhlZDtpbnNldDowO2JhY2tncm91bmQ6cmdiYSgwLDAsMCwwLjUpO3otaW5kZXg6MTAwMDA7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyOyc7XG4gIGNvbnN0IGNoYW5nZWRTZWN0aW9ucyA9IHNlY3Rpb25zLmZpbHRlcigocykgPT4gcy5jaGFuZ2VkKTtcbiAgY29uc3Qgcm93cyA9IHNlY3Rpb25zLm1hcCgocykgPT4gYFxuICAgIDx0ciBzdHlsZT1cIiR7cy5jaGFuZ2VkID8gJ2JhY2tncm91bmQ6dmFyKC0tY3Ytd2FybmluZy1iZywgI2ZmZmJlYik7JyA6ICcnfVwiPlxuICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzo2cHggOHB4O2NvbG9yOiMxZTI5M2I7XCI+JHtlc2NhcGVIdG1sKHMuc2VjdGlvbil9PC90ZD5cbiAgICAgIDx0ZCBzdHlsZT1cInBhZGRpbmc6NnB4IDhweDt0ZXh0LWFsaWduOmNlbnRlcjtjb2xvcjojNjQ3NDhiO1wiPiR7cy5jdXJyZW50X2NvdW50fTwvdGQ+XG4gICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOjZweCA4cHg7dGV4dC1hbGlnbjpjZW50ZXI7Y29sb3I6IzY0NzQ4YjtcIj4ke3MubmV3X2NvdW50fTwvdGQ+XG4gICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOjZweCA4cHg7XCI+JHtzLmNoYW5nZWQgPyAnXHUyNkEwIGNoYW5nZWQnIDogJ1x1MjAxNCd9PC90ZD5cbiAgICA8L3RyPmApLmpvaW4oJycpO1xuICBvdmVybGF5LmlubmVySFRNTCA9IGBcbiAgICA8ZGl2IHJvbGU9XCJkaWFsb2dcIiBhcmlhLW1vZGFsPVwidHJ1ZVwiIGFyaWEtbGFiZWxsZWRieT1cIm1hc3Rlci1jdi1pbXBvcnQtdGl0bGVcIlxuICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZmY7Ym9yZGVyLXJhZGl1czoxMHB4O3BhZGRpbmc6MjRweCAyOHB4O21heC13aWR0aDo2NDBweDt3aWR0aDo5NCU7XG4gICAgICAgICAgICAgICAgbWF4LWhlaWdodDo4NXZoO292ZXJmbG93LXk6YXV0bztib3gtc2hhZG93OjAgMjBweCA2MHB4IHJnYmEoMCwwLDAsMC4zKTtcIj5cbiAgICAgIDxoMyBpZD1cIm1hc3Rlci1jdi1pbXBvcnQtdGl0bGVcIiBzdHlsZT1cIm1hcmdpbjowIDAgMTJweDtmb250LXNpemU6MS4xZW07Y29sb3I6IzFlMjkzYjtcIj5cdTJCMDZcdUZFMEYgSW1wb3J0IE1hc3RlciBDViBEYXRhIFx1MjAxNCBSZXZpZXc8L2gzPlxuICAgICAgPGRpdiByb2xlPVwiYWxlcnRcIiBzdHlsZT1cImJhY2tncm91bmQ6I2ZlZjJmMjtib3JkZXI6MXB4IHNvbGlkICNmY2E1YTU7Ym9yZGVyLXJhZGl1czo2cHg7cGFkZGluZzoxMHB4IDE0cHg7bWFyZ2luLWJvdHRvbToxNHB4O2ZvbnQtc2l6ZTowLjg2ZW07Y29sb3I6Izk5MWIxYjtcIj5cbiAgICAgICAgPHN0cm9uZz5UaGlzIHJlcGxhY2VzIHRoZSBlbnRpcmUgZmlsZTwvc3Ryb25nPiwgbm90IGp1c3QgdGhlIGNoYW5nZWQgc2VjdGlvbnMuIEEgYmFja3VwIGlzIGNyZWF0ZWRcbiAgICAgICAgYXV0b21hdGljYWxseSBiZWZvcmUgdGhlIHdyaXRlIFx1MjAxNCBzZWUgXHVEODNEXHVERDUwIEJhY2t1cHMgYWJvdmUgdG8gcmVzdG9yZSBpdCBpZiBuZWVkZWQuXG4gICAgICA8L2Rpdj5cbiAgICAgIDxwIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtjb2xvcjojNjQ3NDhiO21hcmdpbi1ib3R0b206OHB4O1wiPlxuICAgICAgICAke2NoYW5nZWRTZWN0aW9ucy5sZW5ndGggPyBgJHtjaGFuZ2VkU2VjdGlvbnMubGVuZ3RofSBzZWN0aW9uKHMpIHdvdWxkIGNoYW5nZTpgIDogJ05vIHNlY3Rpb25zIHdvdWxkIGNoYW5nZSBcdTIwMTQgdGhlIHVwbG9hZGVkIGZpbGUgbWF0Y2hlcyB0aGUgY3VycmVudCBkYXRhLid9XG4gICAgICA8L3A+XG4gICAgICA8dGFibGUgc3R5bGU9XCJ3aWR0aDoxMDAlO2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTtmb250LXNpemU6MC44NWVtO21hcmdpbi1ib3R0b206MTZweDtcIj5cbiAgICAgICAgPHRoZWFkPjx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206MXB4IHNvbGlkICNlMmU4ZjA7XCI+XG4gICAgICAgICAgPHRoIHN0eWxlPVwicGFkZGluZzo0cHggOHB4O3RleHQtYWxpZ246bGVmdDtjb2xvcjojNDc1NTY5O1wiPlNlY3Rpb248L3RoPlxuICAgICAgICAgIDx0aCBzdHlsZT1cInBhZGRpbmc6NHB4IDhweDtjb2xvcjojNDc1NTY5O1wiPkN1cnJlbnQ8L3RoPlxuICAgICAgICAgIDx0aCBzdHlsZT1cInBhZGRpbmc6NHB4IDhweDtjb2xvcjojNDc1NTY5O1wiPk5ldzwvdGg+XG4gICAgICAgICAgPHRoIHN0eWxlPVwicGFkZGluZzo0cHggOHB4O3RleHQtYWxpZ246bGVmdDtjb2xvcjojNDc1NTY5O1wiPjwvdGg+XG4gICAgICAgIDwvdHI+PC90aGVhZD5cbiAgICAgICAgPHRib2R5PiR7cm93c308L3Rib2R5PlxuICAgICAgPC90YWJsZT5cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kO2dhcDo4cHg7XCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgaWQ9XCJtYXN0ZXItY3YtaW1wb3J0LWNhbmNlbFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBwcmltYXJ5XCIgaWQ9XCJtYXN0ZXItY3YtaW1wb3J0LWNvbmZpcm1cIiR7Y2hhbmdlZFNlY3Rpb25zLmxlbmd0aCA/ICcnIDogJyBkaXNhYmxlZCd9PkNvbmZpcm0gSW1wb3J0PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG92ZXJsYXkpO1xuICBpZiAodHlwZW9mIHRyYXBGb2N1cyA9PT0gJ2Z1bmN0aW9uJykgdHJhcEZvY3VzKCdtYXN0ZXItY3YtaW1wb3J0LW92ZXJsYXknKTtcbiAgY29uc3QgY2xvc2UgPSAoKSA9PiB7IG92ZXJsYXkucmVtb3ZlKCk7IF9tYXN0ZXJDdkltcG9ydERhdGEgPSBudWxsOyBpZiAodHlwZW9mIHJlc3RvcmVGb2N1cyA9PT0gJ2Z1bmN0aW9uJykgcmVzdG9yZUZvY3VzKCk7IH07XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItY3YtaW1wb3J0LWNhbmNlbCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xvc2UpO1xuICBvdmVybGF5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4geyBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSBjbG9zZSgpOyB9KTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1jdi1pbXBvcnQtY29uZmlybScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gY29uZmlybU1hc3RlckN2SW1wb3J0KCkpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb25maXJtTWFzdGVyQ3ZJbXBvcnQoKSB7XG4gIGlmICghX21hc3RlckN2SW1wb3J0RGF0YSkgcmV0dXJuO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL2ltcG9ydC1jb25maXJtJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBkYXRhOiBfbWFzdGVyQ3ZJbXBvcnREYXRhIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItY3YtaW1wb3J0LW92ZXJsYXknKT8ucmVtb3ZlKCk7XG4gICAgX21hc3RlckN2SW1wb3J0RGF0YSA9IG51bGw7XG4gICAgaWYgKHR5cGVvZiByZXN0b3JlRm9jdXMgPT09ICdmdW5jdGlvbicpIHJlc3RvcmVGb2N1cygpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBfc2V0TWFzdGVyQ2hhbmdlTm90aWNlKCdNYXN0ZXIgQ1YgRGF0YScsICdpbXBvcnRlZCcpO1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoXG4gICAgICAgICdcdTI3MDUgSW1wb3J0ZWQnLFxuICAgICAgICBgTWFzdGVyIENWIGRhdGEgcmVwbGFjZWQuJHtkYXRhLmNvbW1pdF9oYXNoID8gYCBDb21taXQ6ICR7ZGF0YS5jb21taXRfaGFzaC5zbGljZSgwLCAxMCl9LmAgOiAnJ30ke2RhdGEuZ2l0X2Vycm9yID8gYCAoZ2l0IHdhcm5pbmc6ICR7ZGF0YS5naXRfZXJyb3J9KWAgOiAnJ31gXG4gICAgICApO1xuICAgICAgYXdhaXQgcG9wdWxhdGVNYXN0ZXJUYWIoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZGV0YWlsID0gKGRhdGEudmFsaWRhdGlvbl9lcnJvcnMgfHwgW10pLmpvaW4oJzsgJyk7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgZGV0YWlsID8gYCR7ZGF0YS5lcnJvcn06ICR7ZGV0YWlsfWAgOiAoZGF0YS5lcnJvciB8fCAnSW1wb3J0IGZhaWxlZC4nKSk7XG4gICAgfVxuICB9IGNhdGNoIChfKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsICdGYWlsZWQgdG8gaW1wb3J0IG1hc3RlciBDViBkYXRhLicpO1xuICB9XG59XG5cbi8vIC0tLS0gQWNoaWV2ZW1lbnQvU3VtbWFyeSBkZWxldGUgaGFuZGxlcnMgLS0tLVxuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVNYXN0ZXJBY2hpZXZlbWVudChpZCwgdGl0bGUpIHtcbiAgc2hvd0NvbmZpcm1Nb2RhbChcbiAgICAnXHVEODNEXHVEREQxXHVGRTBGIERlbGV0ZSBBY2hpZXZlbWVudCcsXG4gICAgYERlbGV0ZSBcIiR7dGl0bGV9XCI/IFRoaXMgY2Fubm90IGJlIHVuZG9uZS5gLFxuICAgIGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS91cGRhdGUtYWNoaWV2ZW1lbnQnLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgYWN0aW9uOiAnZGVsZXRlJywgaWQgfSksXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgaWYgKGRhdGEub2spIHtcbiAgICAgICAgICBfc2V0TWFzdGVyQ2hhbmdlTm90aWNlKCdTZWxlY3RlZCBBY2hpZXZlbWVudHMnLCBkYXRhLmFjdGlvbiB8fCAnZGVsZXRlZCcpO1xuICAgICAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3MDUgRGVsZXRlZCcsIGBBY2hpZXZlbWVudCByZW1vdmVkLmApO1xuICAgICAgICAgIGF3YWl0IHBvcHVsYXRlTWFzdGVyVGFiKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsIGRhdGEuZXJyb3IgfHwgJ0RlbGV0ZSBmYWlsZWQnKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgJ0ZhaWxlZCB0byBkZWxldGUgYWNoaWV2ZW1lbnQnKTtcbiAgICAgIH1cbiAgICB9XG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZU1hc3RlclN1bW1hcnkoa2V5KSB7XG4gIHNob3dDb25maXJtTW9kYWwoXG4gICAgJ1x1RDgzRFx1REREMVx1RkUwRiBEZWxldGUgU3VtbWFyeScsXG4gICAgYERlbGV0ZSBzdW1tYXJ5IHZhcmlhbnQgXCIke2tleX1cIj8gVGhpcyBjYW5ub3QgYmUgdW5kb25lLmAsXG4gICAgYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL3VwZGF0ZS1zdW1tYXJ5Jywge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGFjdGlvbjogJ2RlbGV0ZScsIGtleSB9KSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICBpZiAoZGF0YS5vaykge1xuICAgICAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ1Byb2Zlc3Npb25hbCBTdW1tYXJpZXMnLCBkYXRhLmFjdGlvbiB8fCAnZGVsZXRlZCcpO1xuICAgICAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3MDUgRGVsZXRlZCcsIGBTdW1tYXJ5IFwiJHtrZXl9XCIgcmVtb3ZlZC5gKTtcbiAgICAgICAgICBhd2FpdCBwb3B1bGF0ZU1hc3RlclRhYigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCBkYXRhLmVycm9yIHx8ICdEZWxldGUgZmFpbGVkJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsICdGYWlsZWQgdG8gZGVsZXRlIHN1bW1hcnknKTtcbiAgICAgIH1cbiAgICB9XG4gICk7XG59XG5cbmZ1bmN0aW9uIG9wZW5NYXN0ZXJDdk1vZGFsKCkge1xuICBjb25zdCBvdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1jdi1tb2RhbC1vdmVybGF5Jyk7XG4gIGlmICghb3ZlcmxheSkgcmV0dXJuO1xuICBfZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWN2LW1vZGFsLWJvZHknKTtcbiAgcG9wdWxhdGVNYXN0ZXJUYWIoY29udGFpbmVyKTtcbiAgc2V0SW5pdGlhbEZvY3VzKCdtYXN0ZXItY3YtbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ21hc3Rlci1jdi1tb2RhbC1vdmVybGF5Jyk7XG59XG5cbmZ1bmN0aW9uIGNsb3NlTWFzdGVyQ3ZNb2RhbCgpIHtcbiAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItY3YtbW9kYWwtb3ZlcmxheScpO1xuICBpZiAob3ZlcmxheSkgb3ZlcmxheS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBfbWFzdGVyQ3ZBY3RpdmVDb250YWluZXIgPSBudWxsO1xuICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJyc7XG4gIHJlc3RvcmVGb2N1cygpO1xufVxuXG5leHBvcnQge1xuICBwb3B1bGF0ZU1hc3RlclRhYixcbiAgb3Blbk1hc3RlckN2TW9kYWwsXG4gIGNsb3NlTWFzdGVyQ3ZNb2RhbCxcbiAgX3JlbmRlclBlcnNvbmFsSW5mb0NhcmQsXG4gIF9yZW5kZXJFeHBlcmllbmNlc0xpc3QsXG4gIF9yZW5kZXJTa2lsbHNTZWN0aW9uLFxuICBfcmVuZGVyRWR1Y2F0aW9uTGlzdCxcbiAgX3JlbmRlckF3YXJkc0xpc3QsXG4gIF9yZW5kZXJDZXJ0aWZpY2F0aW9uc0xpc3QsXG4gIF9yZW5kZXJNYXN0ZXJBY2hpZXZlbWVudHNUYWJsZSxcbiAgX3JlbmRlclN1bW1hcmllc0xpc3QsXG4gIHNob3dBZGRBY2hpZXZlbWVudE1vZGFsLFxuICBlZGl0TWFzdGVyQWNoaWV2ZW1lbnQsXG4gIGNsb3NlTWFzdGVyQWNoTW9kYWwsXG4gIHNhdmVNYXN0ZXJBY2hpZXZlbWVudCxcbiAgc2hvd0FkZFN1bW1hcnlNb2RhbCxcbiAgZWRpdE1hc3RlclN1bW1hcnksXG4gIGNsb3NlTWFzdGVyU3VtTW9kYWwsXG4gIHNhdmVNYXN0ZXJTdW1tYXJ5LFxuICBzaG93RWRpdFBlcnNvbmFsSW5mb01vZGFsLFxuICBjbG9zZVBlcnNvbmFsSW5mb01vZGFsLFxuICBzYXZlUGVyc29uYWxJbmZvLFxuICBzaG93QWRkRXhwZXJpZW5jZU1vZGFsLFxuICBlZGl0TWFzdGVyRXhwZXJpZW5jZSxcbiAgY2xvc2VFeHBlcmllbmNlTW9kYWwsXG4gIHNhdmVNYXN0ZXJFeHBlcmllbmNlLFxuICBkZWxldGVNYXN0ZXJFeHBlcmllbmNlLFxuICBfYWRkRXhwQWNoaWV2ZW1lbnQsXG4gIF9tb3ZlRXhwQWNoaWV2ZW1lbnQsXG4gIF9kZWxldGVFeHBBY2hpZXZlbWVudCxcbiAgc2hvd0FkZFNraWxsTW9kYWwsXG4gIGVkaXRNYXN0ZXJTa2lsbCxcbiAgY2xvc2VTa2lsbE1vZGFsLFxuICBzYXZlTWFzdGVyU2tpbGwsXG4gIGRlbGV0ZU1hc3RlclNraWxsLFxuICBzaG93QWRkRWR1Y2F0aW9uTW9kYWwsXG4gIGVkaXRNYXN0ZXJFZHVjYXRpb24sXG4gIGNsb3NlRWR1Y2F0aW9uTW9kYWwsXG4gIHNhdmVNYXN0ZXJFZHVjYXRpb24sXG4gIGRlbGV0ZU1hc3RlckVkdWNhdGlvbixcbiAgc2hvd0FkZEF3YXJkTW9kYWwsXG4gIGVkaXRNYXN0ZXJBd2FyZCxcbiAgY2xvc2VBd2FyZE1vZGFsLFxuICBzYXZlTWFzdGVyQXdhcmQsXG4gIGRlbGV0ZU1hc3RlckF3YXJkLFxuICBzaG93QWRkQ2VydGlmaWNhdGlvbk1vZGFsLFxuICBlZGl0TWFzdGVyQ2VydGlmaWNhdGlvbixcbiAgY2xvc2VDZXJ0aWZpY2F0aW9uTW9kYWwsXG4gIHNhdmVNYXN0ZXJDZXJ0aWZpY2F0aW9uLFxuICBkZWxldGVNYXN0ZXJDZXJ0aWZpY2F0aW9uLFxuICBleHBvcnRNYXN0ZXJDVixcbiAgb3BlbkJhY2t1cEhpc3RvcnlNb2RhbCxcbiAgcmVzdG9yZUJhY2t1cCxcbiAgdW5kb01hc3RlckRhdGFDaGFuZ2UsXG4gIHJlZG9NYXN0ZXJEYXRhQ2hhbmdlLFxuICBvcGVuRnVsbERhdGFQcmV2aWV3TW9kYWwsXG4gIHRyaWdnZXJNYXN0ZXJDdkltcG9ydCxcbiAgaGFuZGxlTWFzdGVyQ3ZJbXBvcnRGaWxlLFxuICBjb25maXJtTWFzdGVyQ3ZJbXBvcnQsXG4gIGRlbGV0ZU1hc3RlckFjaGlldmVtZW50LFxuICBkZWxldGVNYXN0ZXJTdW1tYXJ5LFxuICBsb2FkUHVibGljYXRpb25zLFxuICBsb2FkUHVibGljYXRpb25zQmliLFxuICB0b2dnbGVQdWJsaWNhdGlvbnNWaWV3LFxuICBzZXRQdWJsaWNhdGlvblNvcnRNb2RlLFxuICBzZXRQdWJsaWNhdGlvbkdyb3VwTW9kZSxcbiAgdmFsaWRhdGVQdWJsaWNhdGlvbnNCaWIsXG4gIHNhdmVQdWJsaWNhdGlvbnNCaWIsXG4gIHNob3dJbXBvcnRQdWJsaWNhdGlvbnNNb2RhbCxcbiAgY2xvc2VJbXBvcnRQdWJsaWNhdGlvbnNNb2RhbCxcbiAgaW1wb3J0UHVibGljYXRpb25zQmliLFxuICBzaG93Q29udmVydFB1YmxpY2F0aW9uc01vZGFsLFxuICBjbG9zZUNvbnZlcnRQdWJsaWNhdGlvbnNNb2RhbCxcbiAgY29udmVydFB1YmxpY2F0aW9uVGV4dCxcbiAgaW1wb3J0Q29udmVydGVkUHVibGljYXRpb25UZXh0LFxuICBzaG93QWRkUHVibGljYXRpb25Nb2RhbCxcbiAgZWRpdE1hc3RlclB1YmxpY2F0aW9uLFxuICBjbG9zZVB1YmxpY2F0aW9uTW9kYWwsXG4gIHNhdmVNYXN0ZXJQdWJsaWNhdGlvbixcbiAgZGVsZXRlTWFzdGVyUHVibGljYXRpb24sXG59O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvY292ZXItbGV0dGVyLmpzXG4gKiBDb3ZlciBsZXR0ZXIgdGFiOiBnZW5lcmF0ZSwgc2F2ZSwgdmFsaWRhdGUsIGNvbnNpc3RlbmN5IHJlcG9ydC5cbiAqXG4gKiBEZXBlbmRlbmNpZXMgKHJlc29sdmVkIHRocm91Z2ggZ2xvYmFsVGhpcyBhdCBydW50aW1lKTpcbiAqICAgZXNjYXBlSHRtbCwgc2hvd0FsZXJ0TW9kYWwsIHRhYkRhdGEsIHBlbmRpbmdSZWNvbW1lbmRhdGlvbnMsIENTU1xuICovXG5cbmltcG9ydCB7IHN0YXRlTWFuYWdlciB9IGZyb20gJy4vc3RhdGUtbWFuYWdlci5qcyc7XG5cbi8vIFx1MjUwMFx1MjUwMCBNb2R1bGUtbGV2ZWwgc3RhdGUgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmNvbnN0IENPVkVSX0xFVFRFUl9UT05FUyA9IFtcbiAgeyB2YWx1ZTogJ3N0YXJ0dXAvdGVjaCcsICAgbGFiZWw6ICdTdGFydHVwIC8gVGVjaCcgICAgfSxcbiAgeyB2YWx1ZTogJ3BoYXJtYS9iaW90ZWNoJywgbGFiZWw6ICdQaGFybWEgLyBCaW90ZWNoJyAgfSxcbiAgeyB2YWx1ZTogJ2FjYWRlbWlhJywgICAgICAgbGFiZWw6ICdBY2FkZW1pYScgICAgICAgICAgIH0sXG4gIHsgdmFsdWU6ICdmaW5hbmNpYWwnLCAgICAgIGxhYmVsOiAnRmluYW5jaWFsIFNlcnZpY2VzJyB9LFxuICB7IHZhbHVlOiAnbGVhZGVyc2hpcCcsICAgICBsYWJlbDogJ0xlYWRlcnNoaXAgLyBFeGVjJyAgfSxcbl07XG5cbmNvbnN0IENPVkVSX0xFVFRFUl9PUEVOSU5HUyA9IFtcbiAgeyB2YWx1ZTogJ2Zvcm1hbCcsICAgIGxhYmVsOiAnRm9ybWFsIHNhbHV0YXRpb24gXHUyMDE0IFx1MjAxQ0RlYXIgW25hbWVdLFx1MjAxRCcgfSxcbiAgeyB2YWx1ZTogJ2hvb2snLCAgICAgIGxhYmVsOiAnQXR0ZW50aW9uIGhvb2sgXHUyMDE0IGJvbGQgY2xhaW0gb3IgYWNoaWV2ZW1lbnQnIH0sXG4gIHsgdmFsdWU6ICduYXJyYXRpdmUnLCBsYWJlbDogJ05hcnJhdGl2ZSBvcGVuZXIgXHUyMDE0IHZpdmlkIHNjZW5lIG9yIHN0b3J5JyB9LFxuXTtcblxubGV0IF9jb3ZlckxldHRlclByaW9yU2Vzc2lvbnMgPSBbXTtcblxuLyoqIFN1cnZpdmVzIHRhYiBuYXZpZ2F0aW9uOiBmb3JtIGlucHV0cyBhbmQgdGhlIGdlbmVyYXRlZCBsZXR0ZXIgYm9keS4gKi9cbmxldCBfY292ZXJMZXR0ZXJGb3JtU3RhdGUgPSB7XG4gIHRvbmU6ICAgICAgICAgICAnJyxcbiAgb3BlbmluZ1N0eWxlOiAgICcnLFxuICBoaXJpbmdNYW5hZ2VyOiAgJycsXG4gIGNvbXBhbnlBZGRyZXNzOiAnJyxcbiAgaGlnaGxpZ2h0OiAgICAgICcnLFxuICBjb21wYW55Q29udGV4dDogJycsXG4gIGxldHRlclRleHQ6ICAgICAnJyxcbiAgbGV0dGVyVmlzaWJsZTogIGZhbHNlLFxufTtcblxuLy8gXHUyNTAwXHUyNTAwIFBvcHVsYXRlIGNvdmVyIGxldHRlciB0YWIgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIHBvcHVsYXRlQ292ZXJMZXR0ZXJUYWIoKSB7XG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9jdW1lbnQtY29udGVudCcpO1xuICBjb250ZW50LmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwiZW1wdHktc3RhdGVcIj48ZGl2IGNsYXNzPVwibG9hZGluZy1zcGlubmVyXCI+PC9kaXY+PHAgc3R5bGU9XCJtYXJnaW4tdG9wOjEycHg7Y29sb3I6IzY0NzQ4YjtcIj5Mb2FkaW5nIGNvdmVyIGxldHRlclx1MjAyNjwvcD48L2Rpdj4nO1xuXG4gIC8vIEZldGNoIHByaW9yIHNlc3Npb25zIHdpdGggY292ZXIgbGV0dGVyc1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9jb3Zlci1sZXR0ZXIvcHJpb3InKTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBfY292ZXJMZXR0ZXJQcmlvclNlc3Npb25zID0gKGRhdGEuc2Vzc2lvbnMgfHwgW10pO1xuICB9IGNhdGNoIChfKSB7XG4gICAgX2NvdmVyTGV0dGVyUHJpb3JTZXNzaW9ucyA9IFtdO1xuICB9XG5cbiAgY29uc3QgdG9uZU9wdGlvbnMgPSBDT1ZFUl9MRVRURVJfVE9ORVMubWFwKHQgPT5cbiAgICBgPG9wdGlvbiB2YWx1ZT1cIiR7dC52YWx1ZX1cIj4ke2VzY2FwZUh0bWwodC5sYWJlbCl9PC9vcHRpb24+YFxuICApLmpvaW4oJycpO1xuXG4gIGNvbnN0IG9wZW5pbmdPcHRpb25zID0gQ09WRVJfTEVUVEVSX09QRU5JTkdTLm1hcChvID0+XG4gICAgYDxvcHRpb24gdmFsdWU9XCIke28udmFsdWV9XCI+JHtlc2NhcGVIdG1sKG8ubGFiZWwpfTwvb3B0aW9uPmBcbiAgKS5qb2luKCcnKTtcblxuICBjb25zdCBwcmlvclNlY3Rpb24gPSBfY292ZXJMZXR0ZXJQcmlvclNlc3Npb25zLmxlbmd0aCA/IGBcbiAgICA8ZGl2IGNsYXNzPVwiY2wtcHJpb3Itc2VjdGlvblwiPlxuICAgICAgPGgzPlx1RDgzRFx1RENDQiBQcmlvciBDb3ZlciBMZXR0ZXJzPC9oMz5cbiAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtmb250LXNpemU6MC44NWVtO21hcmdpbi1ib3R0b206MTBweDtcIj5cbiAgICAgICAgU2VsZWN0IGEgcHJpb3IgbGV0dGVyIHRvIHVzZSBhcyBhIHN0YXJ0aW5nIHBvaW50LlxuICAgICAgPC9wPlxuICAgICAgPGRpdiBpZD1cImNsLXByaW9yLWxpc3RcIj5cbiAgICAgICAgJHtfY292ZXJMZXR0ZXJQcmlvclNlc3Npb25zLm1hcCgocywgaSkgPT4gYFxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbC1wcmlvci1jYXJkXCIgaWQ9XCJjbC1wcmlvci0ke2l9XCI+XG4gICAgICAgICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjEwcHg7YWxpZ24taXRlbXM6ZmxleC1zdGFydDtjdXJzb3I6cG9pbnRlcjtcIj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJjbC1wcmlvclwiIHZhbHVlPVwiJHtpfVwiIHN0eWxlPVwibWFyZ2luLXRvcDozcHg7XCIgLz5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8c3Ryb25nPiR7ZXNjYXBlSHRtbChzLnJvbGUgfHwgJ1JvbGUnKX0gYXQgJHtlc2NhcGVIdG1sKHMuY29tcGFueSB8fCAnQ29tcGFueScpfTwvc3Ryb25nPlxuICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6Izk0YTNiODtmb250LXNpemU6MC44MmVtO21hcmdpbi1sZWZ0OjZweDtcIj4ke2VzY2FwZUh0bWwocy5kYXRlIHx8ICcnKX08L3NwYW4+XG4gICAgICAgICAgICAgICAgJHtzLnRvbmUgPyBgPHNwYW4gY2xhc3M9XCJjbC10b25lLWJhZGdlXCI+JHtlc2NhcGVIdG1sKHMudG9uZSl9PC9zcGFuPmAgOiAnJ31cbiAgICAgICAgICAgICAgICA8cCBzdHlsZT1cImNvbG9yOiM2NDc0OGI7Zm9udC1zaXplOjAuODVlbTttYXJnaW46NHB4IDAgMDtcIj4ke2VzY2FwZUh0bWwoKHMucHJldmlldyB8fCAnJykuc2xpY2UoMCwgMTIwKSl9XHUyMDI2PC9wPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPC9kaXY+YCkuam9pbignJyl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gIDogJyc7XG5cbiAgY29udGVudC5pbm5lckhUTUwgPSBgXG4gICAgPGgxPlx1RDgzRFx1RENFOSBDb3ZlciBMZXR0ZXI8L2gxPlxuICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDttYXJnaW4tYm90dG9tOjIwcHg7XCI+XG4gICAgICBHZW5lcmF0ZSBhIHRhaWxvcmVkIGNvdmVyIGxldHRlciBmb3IgdGhpcyBhcHBsaWNhdGlvbiB1c2luZyB5b3VyIENWIGNvbnRlbnRcbiAgICAgIGFuZCBqb2IgYW5hbHlzaXMgYXMgY29udGV4dC5cbiAgICA8L3A+XG5cbiAgICAke3ByaW9yU2VjdGlvbn1cblxuICAgIDxkaXYgY2xhc3M9XCJjbC1mb3JtLXNlY3Rpb25cIj5cbiAgICAgIDxoMz5HZW5lcmF0aW9uIE9wdGlvbnM8L2gzPlxuICAgICAgPGRpdiBjbGFzcz1cImNsLWZvcm0tZ3JpZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2wtZm9ybS1maWVsZFwiPlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJjbC10b25lLXNlbGVjdFwiPlRvbmUgLyBJbmR1c3RyeTwvbGFiZWw+XG4gICAgICAgICAgPHNlbGVjdCBpZD1cImNsLXRvbmUtc2VsZWN0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCI+JHt0b25lT3B0aW9uc308L3NlbGVjdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjbC1mb3JtLWZpZWxkXCI+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cImNsLW9wZW5pbmctc3R5bGVcIj5PcGVuaW5nIFN0eWxlPC9sYWJlbD5cbiAgICAgICAgICA8c2VsZWN0IGlkPVwiY2wtb3BlbmluZy1zdHlsZVwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiPiR7b3BlbmluZ09wdGlvbnN9PC9zZWxlY3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2wtZm9ybS1maWVsZFwiPlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJjbC1oaXJpbmctbWFuYWdlclwiPkhpcmluZyBNYW5hZ2VyIE5hbWUvVGl0bGUgPHNwYW4gc3R5bGU9XCJjb2xvcjojOTRhM2I4O2ZvbnQtd2VpZ2h0OjQwMDtcIj4ob3B0aW9uYWwpPC9zcGFuPjwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJjbC1oaXJpbmctbWFuYWdlclwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBEci4gSmFuZSBTbWl0aCwgSGVhZCBvZiBEYXRhIFNjaWVuY2VcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNsLWZvcm0tZmllbGRcIiBzdHlsZT1cIm1hcmdpbi10b3A6MTJweDtcIj5cbiAgICAgICAgPGxhYmVsIGZvcj1cImNsLWNvbXBhbnktYWRkcmVzc1wiPkNvbXBhbnkgQWRkcmVzcyA8c3BhbiBzdHlsZT1cImNvbG9yOiM5NGEzYjg7Zm9udC13ZWlnaHQ6NDAwO1wiPihvcHRpb25hbCk8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgPHRleHRhcmVhIGlkPVwiY2wtY29tcGFueS1hZGRyZXNzXCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgcm93cz1cIjJcIlxuICAgICAgICAgICAgc3R5bGU9XCJyZXNpemU6dmVydGljYWw7XCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBBY21lIENvcnAsIDEyMyBNYWluIFN0LCBCb3N0b24gTUEgMDIxMzRcIj48L3RleHRhcmVhPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2wtZm9ybS1maWVsZFwiIHN0eWxlPVwibWFyZ2luLXRvcDoxMnB4O1wiPlxuICAgICAgICA8bGFiZWwgZm9yPVwiY2wtaGlnaGxpZ2h0XCI+U3BlY2lmaWMgYWNoaWV2ZW1lbnQgb3IgcHJvamVjdCB0byBoaWdobGlnaHQgPHNwYW4gc3R5bGU9XCJjb2xvcjojOTRhM2I4O2ZvbnQtd2VpZ2h0OjQwMDtcIj4ob3B0aW9uYWwpPC9zcGFuPjwvbGFiZWw+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiY2wtaGlnaGxpZ2h0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBMZWQgdGhlIG1pZ3JhdGlvbiB0byBLdWJlcm5ldGVzIHNhdmluZyAzMCUgaW5mcmEgY29zdFwiIC8+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjbC1mb3JtLWZpZWxkXCIgc3R5bGU9XCJtYXJnaW4tdG9wOjEycHg7XCI+XG4gICAgICAgIDxsYWJlbCBmb3I9XCJjbC1jb21wYW55LWNvbnRleHRcIj5Db21wYW55IGNvbnRleHQgPHNwYW4gc3R5bGU9XCJjb2xvcjojOTRhM2I4O2ZvbnQtd2VpZ2h0OjQwMDtcIj4ob3B0aW9uYWwgXHUyMDE0IHBhc3RlIHNwZWNpZmljIGluaXRpYXRpdmVzLCBwcm9kdWN0cywgdmFsdWVzLCBvciByZWNlbnQgbmV3cyk8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgPHRleHRhcmVhIGlkPVwiY2wtY29tcGFueS1jb250ZXh0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgcm93cz1cIjNcIlxuICAgICAgICAgICAgc3R5bGU9XCJyZXNpemU6dmVydGljYWw7XCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBUaGV5IGp1c3QgbGF1bmNoZWQgYSBuZXcgQUkgcGxhdGZvcm0gZm9yIGhlYWx0aGNhcmU7IHRoZWlyIENUTyB3cm90ZSBhYm91dCBwcmlvcml0aXNpbmcgcmVsaWFiaWxpdHkgb3ZlciBzcGVlZFx1MjAyNlwiPjwvdGV4dGFyZWE+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOjE2cHg7XCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHByaW1hcnlcIiBpZD1cImNsLWdlbmVyYXRlLWJ0blwiIG9uY2xpY2s9XCJnZW5lcmF0ZUNvdmVyTGV0dGVyKClcIj5cbiAgICAgICAgICBcdTI3MjggR2VuZXJhdGUgQ292ZXIgTGV0dGVyXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGlkPVwiY2wtcmVzdWx0LXNlY3Rpb25cIiBzdHlsZT1cImRpc3BsYXk6bm9uZTttYXJnaW4tdG9wOjI0cHg7XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2wtcmVzdWx0LWhlYWRlclwiPlxuICAgICAgICA8aDM+R2VuZXJhdGVkIENvdmVyIExldHRlcjwvaDM+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjhweDtmbGV4LXdyYXA6d3JhcDtcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0blwiIG9uY2xpY2s9XCJnZW5lcmF0ZUNvdmVyTGV0dGVyKClcIiB0aXRsZT1cIlJlZ2VuZXJhdGVcIj5cdUQ4M0RcdUREMDQgUmVnZW5lcmF0ZTwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHByaW1hcnlcIiBvbmNsaWNrPVwic2F2ZUNvdmVyTGV0dGVyKClcIiBpZD1cImNsLXNhdmUtYnRuXCI+XHVEODNEXHVEQ0JFIFNhdmUgQ292ZXIgTGV0dGVyPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7Zm9udC1zaXplOjAuODVlbTttYXJnaW4tYm90dG9tOjhweDtcIj5cbiAgICAgICAgRWRpdCB0aGUgdGV4dCBiZWxvdyBiZWZvcmUgc2F2aW5nLlxuICAgICAgPC9wPlxuICAgICAgPHRleHRhcmVhIGlkPVwiY2wtbGV0dGVyLXRleHRhcmVhXCIgY2xhc3M9XCJjbC1sZXR0ZXItdGV4dGFyZWFcIiByb3dzPVwiMjJcIlxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJDb3ZlciBsZXR0ZXIgdGV4dCBcdTIwMTQgZWRpdCBhcyBuZWVkZWRcIlxuICAgICAgICAgIG9uaW5wdXQ9XCJfZGVib3VuY2VkVmFsaWRhdGVDTCgpOyBfY292ZXJMZXR0ZXJGb3JtU3RhdGUubGV0dGVyVGV4dCA9IHRoaXMudmFsdWU7XCI+PC90ZXh0YXJlYT5cbiAgICAgIDxkaXYgaWQ9XCJjbC12YWxpZGF0aW9uLXBhbmVsXCIgY2xhc3M9XCJjbC12YWxpZGF0aW9uLXBhbmVsXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+XG4gICAgICAgIDxoND5cdUQ4M0RcdURDQ0EgUXVhbGl0eSBDaGVja3M8L2g0PlxuICAgICAgICA8ZGl2IGlkPVwiY2wtY2hlY2tzLWNvbnRhaW5lclwiPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwibmF2LWJ1dHRvbnMgbmF2LWVuZFwiIHN0eWxlPVwibWFyZ2luLXRvcDoyNHB4O1wiPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbnRpbnVlLWJ0blwiIG9uY2xpY2s9XCJoYW5kbGVTdGVwQ2xpY2soJ3NjcmVlbmluZycpXCI+XHVEODNEXHVEQ0NCIFByb2NlZWQgdG8gU2NyZWVuaW5nIFx1MjE5MjwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICBgO1xuXG4gIC8vIFJlc3RvcmUgc2F2ZWQgZm9ybSBzdGF0ZSBhbmQgd2lyZSB1cCBzYXZlLW9uLWNoYW5nZSBsaXN0ZW5lcnMuXG4gIF9yZXN0b3JlQ292ZXJMZXR0ZXJGb3JtU3RhdGUoKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIENvdmVyIGxldHRlciBmb3JtIHN0YXRlIGhlbHBlcnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIF9yZXN0b3JlQ292ZXJMZXR0ZXJGb3JtU3RhdGUoKSB7XG4gIGNvbnN0IHRvbmVFbCAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC10b25lLXNlbGVjdCcpO1xuICBjb25zdCBvcGVuaW5nRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtb3BlbmluZy1zdHlsZScpO1xuICBjb25zdCBobUVsICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtaGlyaW5nLW1hbmFnZXInKTtcbiAgY29uc3QgYWRkckVsICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWNvbXBhbnktYWRkcmVzcycpO1xuICBjb25zdCBobEVsICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtaGlnaGxpZ2h0Jyk7XG4gIGNvbnN0IGN0eEVsICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1jb21wYW55LWNvbnRleHQnKTtcbiAgY29uc3QgcmVzdWx0RWwgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLXJlc3VsdC1zZWN0aW9uJyk7XG4gIGNvbnN0IGxldHRlckVsICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1sZXR0ZXItdGV4dGFyZWEnKTtcblxuICBpZiAodG9uZUVsICYmIF9jb3ZlckxldHRlckZvcm1TdGF0ZS50b25lKVxuICAgIHRvbmVFbC52YWx1ZSA9IF9jb3ZlckxldHRlckZvcm1TdGF0ZS50b25lO1xuICBpZiAob3BlbmluZ0VsICYmIF9jb3ZlckxldHRlckZvcm1TdGF0ZS5vcGVuaW5nU3R5bGUpXG4gICAgb3BlbmluZ0VsLnZhbHVlID0gX2NvdmVyTGV0dGVyRm9ybVN0YXRlLm9wZW5pbmdTdHlsZTtcbiAgaWYgKGhtRWwgJiYgX2NvdmVyTGV0dGVyRm9ybVN0YXRlLmhpcmluZ01hbmFnZXIpXG4gICAgaG1FbC52YWx1ZSA9IF9jb3ZlckxldHRlckZvcm1TdGF0ZS5oaXJpbmdNYW5hZ2VyO1xuICBpZiAoYWRkckVsICYmIF9jb3ZlckxldHRlckZvcm1TdGF0ZS5jb21wYW55QWRkcmVzcylcbiAgICBhZGRyRWwudmFsdWUgPSBfY292ZXJMZXR0ZXJGb3JtU3RhdGUuY29tcGFueUFkZHJlc3M7XG4gIGlmIChobEVsICYmIF9jb3ZlckxldHRlckZvcm1TdGF0ZS5oaWdobGlnaHQpXG4gICAgaGxFbC52YWx1ZSA9IF9jb3ZlckxldHRlckZvcm1TdGF0ZS5oaWdobGlnaHQ7XG4gIGlmIChjdHhFbCAmJiBfY292ZXJMZXR0ZXJGb3JtU3RhdGUuY29tcGFueUNvbnRleHQpXG4gICAgY3R4RWwudmFsdWUgPSBfY292ZXJMZXR0ZXJGb3JtU3RhdGUuY29tcGFueUNvbnRleHQ7XG5cbiAgaWYgKF9jb3ZlckxldHRlckZvcm1TdGF0ZS5sZXR0ZXJWaXNpYmxlICYmIF9jb3ZlckxldHRlckZvcm1TdGF0ZS5sZXR0ZXJUZXh0KSB7XG4gICAgaWYgKHJlc3VsdEVsKSByZXN1bHRFbC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICBpZiAobGV0dGVyRWwpIHtcbiAgICAgIGxldHRlckVsLnZhbHVlID0gX2NvdmVyTGV0dGVyRm9ybVN0YXRlLmxldHRlclRleHQ7XG4gICAgICBfdmFsaWRhdGVDb3ZlckxldHRlcihsZXR0ZXJFbC52YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gV2lyZSB1cCBzYXZlLW9uLWNoYW5nZSBsaXN0ZW5lcnMgKGlubGluZSBvbmlucHV0IGFscmVhZHkgaGFuZGxlcyBsZXR0ZXJUZXh0KS5cbiAgaWYgKHRvbmVFbCkgICAgdG9uZUVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICAgKCkgPT4geyBfY292ZXJMZXR0ZXJGb3JtU3RhdGUudG9uZSA9IHRvbmVFbC52YWx1ZTsgfSk7XG4gIGlmIChvcGVuaW5nRWwpIG9wZW5pbmdFbC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7IF9jb3ZlckxldHRlckZvcm1TdGF0ZS5vcGVuaW5nU3R5bGUgPSBvcGVuaW5nRWwudmFsdWU7IH0pO1xuICBpZiAoaG1FbCkgICAgICBobUVsLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgICAgICAoKSA9PiB7IF9jb3ZlckxldHRlckZvcm1TdGF0ZS5oaXJpbmdNYW5hZ2VyID0gaG1FbC52YWx1ZTsgfSk7XG4gIGlmIChhZGRyRWwpICAgIGFkZHJFbC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICAgICgpID0+IHsgX2NvdmVyTGV0dGVyRm9ybVN0YXRlLmNvbXBhbnlBZGRyZXNzID0gYWRkckVsLnZhbHVlOyB9KTtcbiAgaWYgKGhsRWwpICAgICAgaGxFbC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICAgICAgKCkgPT4geyBfY292ZXJMZXR0ZXJGb3JtU3RhdGUuaGlnaGxpZ2h0ID0gaGxFbC52YWx1ZTsgfSk7XG4gIGlmIChjdHhFbCkgICAgIGN0eEVsLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgICAgICgpID0+IHsgX2NvdmVyTGV0dGVyRm9ybVN0YXRlLmNvbXBhbnlDb250ZXh0ID0gY3R4RWwudmFsdWU7IH0pO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgR2VuZXJhdGUgY292ZXIgbGV0dGVyIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUNvdmVyTGV0dGVyKCkge1xuICAvKiBkdWNrZmxvdzpcbiAgICogICBpZDogY292ZXJfbGV0dGVyX3VpX2dlbmVyYXRlX2xpdmVcbiAgICogICBraW5kOiB1aVxuICAgKiAgIHRpbWVzdGFtcDogJzIwMjYtMDQtMjFUMTg6MDA6MDBaJ1xuICAgKiAgIHN0YXR1czogbGl2ZVxuICAgKiAgIGhhbmRsZXM6XG4gICAqICAgLSB1aTpjb3Zlci1sZXR0ZXIuZ2VuZXJhdGVcbiAgICogICBjYWxsczpcbiAgICogICAtIFBPU1QgL2FwaS9jb3Zlci1sZXR0ZXIvZ2VuZXJhdGVcbiAgICogICByZWFkczpcbiAgICogICAtIGRvbTojY2wtdG9uZS1zZWxlY3QudmFsdWVcbiAgICogICAtIGRvbTojY2wtb3BlbmluZy1zdHlsZS52YWx1ZVxuICAgKiAgIC0gZG9tOiNjbC1oaXJpbmctbWFuYWdlci52YWx1ZVxuICAgKiAgIC0gZG9tOiNjbC1jb21wYW55LWFkZHJlc3MudmFsdWVcbiAgICogICAtIGRvbTojY2wtaGlnaGxpZ2h0LnZhbHVlXG4gICAqICAgLSBkb206aW5wdXRbbmFtZT1jbC1wcmlvcl0uY2hlY2tlZFxuICAgKiAgIHdyaXRlczpcbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL2NvdmVyLWxldHRlci9nZW5lcmF0ZS50b25lXG4gICAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9jb3Zlci1sZXR0ZXIvZ2VuZXJhdGUub3BlbmluZ19zdHlsZVxuICAgKiAgIC0gcmVxdWVzdDpQT1NUIC9hcGkvY292ZXItbGV0dGVyL2dlbmVyYXRlLmhpcmluZ19tYW5hZ2VyXG4gICAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9jb3Zlci1sZXR0ZXIvZ2VuZXJhdGUuY29tcGFueV9hZGRyZXNzXG4gICAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9jb3Zlci1sZXR0ZXIvZ2VuZXJhdGUuaGlnaGxpZ2h0XG4gICAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9jb3Zlci1sZXR0ZXIvZ2VuZXJhdGUucmV1c2VfYm9keVxuICAgKiAgIC0gZG9tOiNjbC1sZXR0ZXItdGV4dGFyZWEudmFsdWVcbiAgICogICBub3RlczogU3VibWl0cyBjb3Zlci1sZXR0ZXIgcHJvbXB0IGlucHV0cyAoaW5jbHVkaW5nIGNvbmZpZ3VyYWJsZSBvcGVuaW5nIHN0eWxlKSBhbmQgb3B0aW9uYWwgcmV1c2UgdGV4dCwgdGhlbiB3cml0ZXMgdGhlIGdlbmVyYXRlZCBib2R5IGludG8gdGhlIGVkaXRhYmxlIGNvdmVyLWxldHRlciB0ZXh0YXJlYS5cbiAgICovXG4gIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1nZW5lcmF0ZS1idG4nKTtcbiAgYnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgYnRuLnRleHRDb250ZW50ID0gJ1x1MjNGMyBHZW5lcmF0aW5nXHUyMDI2JztcblxuICBjb25zdCB0b25lICAgICAgICAgICAgPSAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLXRvbmUtc2VsZWN0JykgICAgICB8fCB7fSkudmFsdWUgfHwgJ3N0YXJ0dXAvdGVjaCc7XG4gIGNvbnN0IG9wZW5pbmdfc3R5bGUgICA9IChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtb3BlbmluZy1zdHlsZScpICAgIHx8IHt9KS52YWx1ZSB8fCAnZm9ybWFsJztcbiAgY29uc3QgaGlyaW5nX21hbmFnZXIgID0gKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1oaXJpbmctbWFuYWdlcicpICAgfHwge30pLnZhbHVlIHx8ICcnO1xuICBjb25zdCBjb21wYW55X2FkZHJlc3MgPSAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWNvbXBhbnktYWRkcmVzcycpICB8fCB7fSkudmFsdWUgfHwgJyc7XG4gIGNvbnN0IGhpZ2hsaWdodCAgICAgICA9IChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtaGlnaGxpZ2h0JykgICAgICAgICB8fCB7fSkudmFsdWUgfHwgJyc7XG4gIGNvbnN0IGNvbXBhbnlfY29udGV4dCA9IChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtY29tcGFueS1jb250ZXh0JykgIHx8IHt9KS52YWx1ZSB8fCAnJztcblxuICAvLyBDaGVjayBmb3IgcHJpb3IgbGV0dGVyIHNlbGVjdGlvblxuICBsZXQgcmV1c2VfYm9keSA9ICcnO1xuICBjb25zdCBjaGVja2VkUHJpb3IgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFtuYW1lPVwiY2wtcHJpb3JcIl06Y2hlY2tlZCcpO1xuICBpZiAoY2hlY2tlZFByaW9yKSB7XG4gICAgY29uc3QgaWR4ID0gcGFyc2VJbnQoY2hlY2tlZFByaW9yLnZhbHVlLCAxMCk7XG4gICAgcmV1c2VfYm9keSA9IChfY292ZXJMZXR0ZXJQcmlvclNlc3Npb25zW2lkeF0gfHwge30pLmZ1bGxfdGV4dCB8fCAnJztcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL2NvdmVyLWxldHRlci9nZW5lcmF0ZScsIHtcbiAgICAgIG1ldGhvZDogICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogICAgSlNPTi5zdHJpbmdpZnkoeyB0b25lLCBvcGVuaW5nX3N0eWxlLCBoaXJpbmdfbWFuYWdlciwgY29tcGFueV9hZGRyZXNzLCBoaWdobGlnaHQsIGNvbXBhbnlfY29udGV4dCwgcmV1c2VfYm9keSB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcblxuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBjb25zdCByZXN1bHRTZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLXJlc3VsdC1zZWN0aW9uJyk7XG4gICAgICBjb25zdCB0ZXh0YXJlYSAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWxldHRlci10ZXh0YXJlYScpO1xuICAgICAgaWYgKHJlc3VsdFNlY3Rpb24pIHJlc3VsdFNlY3Rpb24uc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICBpZiAodGV4dGFyZWEpIHtcbiAgICAgICAgdGV4dGFyZWEudmFsdWUgPSBkYXRhLnRleHQ7XG4gICAgICAgIF92YWxpZGF0ZUNvdmVyTGV0dGVyKHRleHRhcmVhLnZhbHVlKTtcbiAgICAgIH1cbiAgICAgIF9jb3ZlckxldHRlckZvcm1TdGF0ZS5sZXR0ZXJUZXh0ICAgID0gZGF0YS50ZXh0O1xuICAgICAgX2NvdmVyTGV0dGVyRm9ybVN0YXRlLmxldHRlclZpc2libGUgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEdlbmVyYXRpb24gRmFpbGVkJywgZGF0YS5lcnJvciB8fCAnTExNIGRpZCBub3QgcmV0dXJuIGEgY292ZXIgbGV0dGVyLicpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIGNvbnRhY3Qgc2VydmVyLicpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChidG4pIHtcbiAgICAgIGJ0bi5kaXNhYmxlZCAgICA9IGZhbHNlO1xuICAgICAgYnRuLnRleHRDb250ZW50ID0gJ1x1MjcyOCBHZW5lcmF0ZSBDb3ZlciBMZXR0ZXInO1xuICAgIH1cbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgU2F2ZSBjb3ZlciBsZXR0ZXIgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIHNhdmVDb3ZlckxldHRlcigpIHtcbiAgLyogZHVja2Zsb3c6XG4gICAqICAgaWQ6IGNvdmVyX2xldHRlcl91aV9zYXZlX2xpdmVcbiAgICogICBraW5kOiB1aVxuICAgKiAgIHRpbWVzdGFtcDogJzIwMjYtMDMtMjVUMjE6Mzk6NDhaJ1xuICAgKiAgIHN0YXR1czogbGl2ZVxuICAgKiAgIGhhbmRsZXM6XG4gICAqICAgLSB1aTpjb3Zlci1sZXR0ZXIuc2F2ZVxuICAgKiAgIGNhbGxzOlxuICAgKiAgIC0gUE9TVCAvYXBpL2NvdmVyLWxldHRlci9zYXZlXG4gICAqICAgcmVhZHM6XG4gICAqICAgLSBkb206I2NsLWxldHRlci10ZXh0YXJlYS52YWx1ZVxuICAgKiAgIHdyaXRlczpcbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL2NvdmVyLWxldHRlci9zYXZlLnRleHRcbiAgICogICBub3RlczogU3VibWl0cyB0aGUgdXNlci1lZGl0ZWQgY292ZXItbGV0dGVyIGJvZHkgZm9yIHNlc3Npb24gcGVyc2lzdGVuY2UsIG1ldGFkYXRhIHdyaXRlLXRocm91Z2gsIGFuZCBhcmNoaXZlIGFydGlmYWN0IGdlbmVyYXRpb24uXG4gICAqL1xuICBjb25zdCB0ZXh0YXJlYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1sZXR0ZXItdGV4dGFyZWEnKTtcbiAgaWYgKCF0ZXh0YXJlYSkgcmV0dXJuO1xuICBjb25zdCB0ZXh0ID0gdGV4dGFyZWEudmFsdWUudHJpbSgpO1xuICBpZiAoIXRleHQpIHtcbiAgICBzaG93QWxlcnRNb2RhbCgnXHUyNkEwXHVGRTBGIEVtcHR5IExldHRlcicsICdQbGVhc2UgZ2VuZXJhdGUgb3IgdHlwZSBhIGNvdmVyIGxldHRlciBiZWZvcmUgc2F2aW5nLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1zYXZlLWJ0bicpO1xuICBpZiAoYnRuKSB7IGJ0bi5kaXNhYmxlZCA9IHRydWU7IGJ0bi50ZXh0Q29udGVudCA9ICdcdTIzRjMgU2F2aW5nXHUyMDI2JzsgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL2NvdmVyLWxldHRlci9zYXZlJywge1xuICAgICAgbWV0aG9kOiAgJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiAgICBKU09OLnN0cmluZ2lmeSh7IHRleHQgfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG5cbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjcwNSBTYXZlZCcsIGBDb3ZlciBsZXR0ZXIgc2F2ZWQgYXMgPHN0cm9uZz4ke2VzY2FwZUh0bWwoZGF0YS5maWxlbmFtZSl9PC9zdHJvbmc+IGluIHlvdXIgYXBwbGljYXRpb24gZm9sZGVyLmApO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIFNhdmUgRmFpbGVkJywgZGF0YS5lcnJvciB8fCAnQ291bGQgbm90IHNhdmUgY292ZXIgbGV0dGVyLicpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIGNvbnRhY3Qgc2VydmVyLicpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChidG4pIHsgYnRuLmRpc2FibGVkID0gZmFsc2U7IGJ0bi50ZXh0Q29udGVudCA9ICdcdUQ4M0RcdURDQkUgU2F2ZSBDb3ZlciBMZXR0ZXInOyB9XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIENyb3NzLWRvY3VtZW50IGNvbnNpc3RlbmN5IHJlcG9ydCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLyoqXG4gKiBCdWlsZCBhbmQgcmVuZGVyIHRoZSBjcm9zcy1kb2N1bWVudCBjb25zaXN0ZW5jeSByZXBvcnQgaW4gdGhlIEZpbmFsaXNlIHRhYi5cbiAqIENoZWNrcyBjb21wYW55IG5hbWUsIGpvYiB0aXRsZSwgQVRTIGtleXdvcmRzLCBhbmQgZGF0ZSBmb3JtYXR0aW5nIGFjcm9zc1xuICogdGhlIENWICh0YWJEYXRhLmN2KSBhbmQgY292ZXIgbGV0dGVyICgjY2wtbGV0dGVyLXRleHRhcmVhKS5cbiAqL1xuZnVuY3Rpb24gX3JlbmRlckNvbnNpc3RlbmN5UmVwb3J0KHN0YXR1c0RhdGEpIHtcbiAgY29uc3QgcGFuZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29uc2lzdGVuY3ktcmVwb3J0Jyk7XG4gIGlmICghcGFuZWwpIHJldHVybjtcblxuICBjb25zdCBhbmFseXNpcyAgICA9IHN0YXR1c0RhdGEuam9iX2FuYWx5c2lzIHx8IHt9O1xuICBjb25zdCBjb21wYW55ICAgICA9IChhbmFseXNpcy5jb21wYW55ICB8fCAnJykudHJpbSgpO1xuICBjb25zdCBqb2JUaXRsZSAgICA9IChhbmFseXNpcy50aXRsZSAgICB8fCAnJykudHJpbSgpO1xuICBjb25zdCBhdHNLZXl3b3JkcyA9IChhbmFseXNpcy5hdHNfa2V5d29yZHMgfHwgW10pLmZpbHRlcihCb29sZWFuKS5zbGljZSgwLCA4KTtcblxuICAvLyBTdHJpcCBIVE1MIHRhZ3MgZnJvbSBDViBjb250ZW50IGZvciB0ZXh0IHNlYXJjaFxuICBjb25zdCBjdlN0YXRlID0gc3RhdGVNYW5hZ2VyLmdldFRhYkRhdGEoJ2N2JykgfHwgJyc7XG4gIGNvbnN0IGN2SHRtbCA9IHR5cGVvZiBjdlN0YXRlID09PSAnc3RyaW5nJyA/IGN2U3RhdGUgOiAoY3ZTdGF0ZT8uWycqLmh0bWwnXSB8fCAnJyk7XG4gIGNvbnN0IGN2VGV4dCA9IGN2SHRtbC5yZXBsYWNlKC88W14+XSs+L2csICcgJykucmVwbGFjZSgvXFxzKy9nLCAnICcpLnRvTG93ZXJDYXNlKCk7XG5cbiAgLy8gR2V0IGNvdmVyIGxldHRlciB0ZXh0IGlmIHByZXNlbnRcbiAgY29uc3QgY2xFbCAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWxldHRlci10ZXh0YXJlYScpO1xuICBjb25zdCBjbFJhdyAgPSBjbEVsID8gY2xFbC52YWx1ZSA6ICcnO1xuICBjb25zdCBjbFRleHQgPSBjbFJhdy50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBoYXNDTCAgPSBjbFJhdy50cmltKCkubGVuZ3RoID4gNTA7XG5cbiAgaWYgKCFjb21wYW55ICYmICFqb2JUaXRsZSAmJiAhYXRzS2V5d29yZHMubGVuZ3RoKSB7XG4gICAgcGFuZWwuaW5uZXJIVE1MID0gJyc7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY2hlY2tzID0gW107XG5cbiAgLy8gXHUyNTAwXHUyNTAwIDEuIENvbXBhbnkgbmFtZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgaWYgKGNvbXBhbnkpIHtcbiAgICBjb25zdCBjb21wTGMgPSBjb21wYW55LnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgaW5DViAgID0gY3ZUZXh0LmluY2x1ZGVzKGNvbXBMYyk7XG4gICAgY29uc3QgaW5DTCAgID0gaGFzQ0wgJiYgY2xUZXh0LmluY2x1ZGVzKGNvbXBMYyk7XG4gICAgY29uc3QgbWlzc2luZyA9IFtdO1xuICAgIGlmICghaW5DVikgICAgICAgICAgbWlzc2luZy5wdXNoKCdDVicpO1xuICAgIGlmIChoYXNDTCAmJiAhaW5DTCkgbWlzc2luZy5wdXNoKCdjb3ZlciBsZXR0ZXInKTtcbiAgICBjb25zdCBzdGF0dXMgPSBtaXNzaW5nLmxlbmd0aCA9PT0gMCA/ICdwYXNzJyA6IG1pc3NpbmcubGVuZ3RoIDwgMiAmJiBoYXNDTCA/ICd3YXJuJyA6ICdmYWlsJztcbiAgICBjaGVja3MucHVzaCh7XG4gICAgICBzdGF0dXMsXG4gICAgICBsYWJlbDogICdDb21wYW55IG5hbWUnLFxuICAgICAgZGV0YWlsOiBzdGF0dXMgPT09ICdwYXNzJ1xuICAgICAgICA/IGBcXHUyMDFjJHtlc2NhcGVIdG1sKGNvbXBhbnkpfVxcdTIwMWQgZm91bmQgaW4gYWxsIGRvY3VtZW50cy5gXG4gICAgICAgIDogYFxcdTIwMWMke2VzY2FwZUh0bWwoY29tcGFueSl9XFx1MjAxZCBtaXNzaW5nIGZyb206ICR7bWlzc2luZy5qb2luKCcsICcpfS5gLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gXHUyNTAwXHUyNTAwIDIuIEpvYiB0aXRsZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgaWYgKGpvYlRpdGxlKSB7XG4gICAgY29uc3QgdGl0bGVMYyAgID0gam9iVGl0bGUudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCB0aXRsZUNvcmUgPSB0aXRsZUxjLnJlcGxhY2UoL14oc2VuaW9yfGp1bmlvcnxsZWFkfHByaW5jaXBhbHxzdGFmZnxhc3NvY2lhdGUpXFxzKy8sICcnKTtcbiAgICBjb25zdCBpbkNWICAgICAgPSBjdlRleHQuaW5jbHVkZXModGl0bGVMYykgfHwgY3ZUZXh0LmluY2x1ZGVzKHRpdGxlQ29yZSk7XG4gICAgY29uc3QgaW5DTCAgICAgID0gaGFzQ0wgJiYgKGNsVGV4dC5pbmNsdWRlcyh0aXRsZUxjKSB8fCBjbFRleHQuaW5jbHVkZXModGl0bGVDb3JlKSk7XG4gICAgY29uc3QgbWlzc2luZyAgID0gW107XG4gICAgaWYgKCFpbkNWKSAgICAgICAgICBtaXNzaW5nLnB1c2goJ0NWJyk7XG4gICAgaWYgKGhhc0NMICYmICFpbkNMKSBtaXNzaW5nLnB1c2goJ2NvdmVyIGxldHRlcicpO1xuICAgIGNvbnN0IHN0YXR1cyA9IG1pc3NpbmcubGVuZ3RoID09PSAwID8gJ3Bhc3MnIDogbWlzc2luZy5sZW5ndGggPCAyICYmIGhhc0NMID8gJ3dhcm4nIDogJ2ZhaWwnO1xuICAgIGNoZWNrcy5wdXNoKHtcbiAgICAgIHN0YXR1cyxcbiAgICAgIGxhYmVsOiAgJ0pvYiB0aXRsZScsXG4gICAgICBkZXRhaWw6IHN0YXR1cyA9PT0gJ3Bhc3MnXG4gICAgICAgID8gYFxcdTIwMWMke2VzY2FwZUh0bWwoam9iVGl0bGUpfVxcdTIwMWQgZm91bmQgaW4gYWxsIGRvY3VtZW50cy5gXG4gICAgICAgIDogYFxcdTIwMWMke2VzY2FwZUh0bWwoam9iVGl0bGUpfVxcdTIwMWQgbWlzc2luZyBmcm9tOiAke21pc3Npbmcuam9pbignLCAnKX0uYCxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFx1MjUwMFx1MjUwMCAzLiBBVFMga2V5d29yZHMgKHRvcCA4KSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgaWYgKGF0c0tleXdvcmRzLmxlbmd0aCkge1xuICAgIGNvbnN0IG1pc3NpbmdDViA9IGF0c0tleXdvcmRzLmZpbHRlcihrdyA9PiAhY3ZUZXh0LmluY2x1ZGVzKGt3LnRvTG93ZXJDYXNlKCkpKTtcbiAgICBjb25zdCBtaXNzaW5nQ0wgPSBoYXNDTCA/IGF0c0tleXdvcmRzLmZpbHRlcihrdyA9PiAhY2xUZXh0LmluY2x1ZGVzKGt3LnRvTG93ZXJDYXNlKCkpKSA6IFtdO1xuICAgIGNvbnN0IHRvdGFsTWlzc2luZyA9IG5ldyBTZXQoWy4uLm1pc3NpbmdDViwgLi4ubWlzc2luZ0NMXSkuc2l6ZTtcbiAgICBjb25zdCBzdGF0dXMgPSB0b3RhbE1pc3NpbmcgPT09IDAgPyAncGFzcycgOiB0b3RhbE1pc3NpbmcgPD0gMyA/ICd3YXJuJyA6ICdmYWlsJztcbiAgICBjb25zdCBwYXJ0cyAgPSBbXTtcbiAgICBpZiAobWlzc2luZ0NWLmxlbmd0aCkgcGFydHMucHVzaChgTWlzc2luZyBmcm9tIENWOiAke21pc3NpbmdDVi5tYXAoayA9PiBgPGVtPiR7ZXNjYXBlSHRtbChrKX08L2VtPmApLmpvaW4oJywgJyl9YCk7XG4gICAgaWYgKG1pc3NpbmdDTC5sZW5ndGgpIHBhcnRzLnB1c2goYE1pc3NpbmcgZnJvbSBjb3ZlciBsZXR0ZXI6ICR7bWlzc2luZ0NMLm1hcChrID0+IGA8ZW0+JHtlc2NhcGVIdG1sKGspfTwvZW0+YCkuam9pbignLCAnKX1gKTtcbiAgICBjaGVja3MucHVzaCh7XG4gICAgICBzdGF0dXMsXG4gICAgICBsYWJlbDogIGBBVFMga2V5d29yZHMgKCR7YXRzS2V5d29yZHMubGVuZ3RofSBjaGVja2VkKWAsXG4gICAgICBkZXRhaWw6IHBhcnRzLmxlbmd0aCA/IHBhcnRzLmpvaW4oJy4gJykgKyAnLicgOiBgQWxsICR7YXRzS2V5d29yZHMubGVuZ3RofSBrZXl3b3JkcyBwcmVzZW50IGluIGRvY3VtZW50cy5gLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gXHUyNTAwXHUyNTAwIDQuIERhdGUgZm9ybWF0IGNvbnNpc3RlbmN5IChDVikgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIGlmIChjdlRleHQpIHtcbiAgICBjb25zdCBoYXNXcml0dGVuID0gL1xcYihqYW58ZmVifG1hcnxhcHJ8bWF5fGp1bnxqdWx8YXVnfHNlcHxvY3R8bm92fGRlYylcXHcqXFxzK1xcZHs0fVxcYi9pLnRlc3QoY3ZUZXh0KTtcbiAgICBjb25zdCBoYXNJU08gICAgID0gL1xcYlxcZHs0fS1cXGR7Mn1cXGIvLnRlc3QoY3ZUZXh0KTtcbiAgICBjb25zdCBoYXNTbGFzaCAgID0gL1xcYlxcZHsxLDJ9XFwvXFxkezR9XFxiLy50ZXN0KGN2VGV4dCk7XG4gICAgY29uc3QgZm9ybWF0Q291bnQgPSBbaGFzV3JpdHRlbiwgaGFzSVNPLCBoYXNTbGFzaF0uZmlsdGVyKEJvb2xlYW4pLmxlbmd0aDtcbiAgICBjaGVja3MucHVzaCh7XG4gICAgICBzdGF0dXM6IGZvcm1hdENvdW50IDw9IDEgPyAncGFzcycgOiAnd2FybicsXG4gICAgICBsYWJlbDogICdEYXRlIGZvcm1hdHMgKENWKScsXG4gICAgICBkZXRhaWw6IGZvcm1hdENvdW50IDw9IDFcbiAgICAgICAgPyAnQ29uc2lzdGVudCBkYXRlIGZvcm1hdCB0aHJvdWdob3V0IENWLidcbiAgICAgICAgOiAnTWl4ZWQgZGF0ZSBmb3JtYXRzIGRldGVjdGVkIChlLmcuIFxcdTIwMWNKYW4gMjAyMFxcdTIwMWQgYW5kIFxcdTIwMWMyMDIwLTAxXFx1MjAxZCkgXFx1MjAxNCBzdGFuZGFyZGlzZSBmb3IgYSBwb2xpc2hlZCBsb29rLicsXG4gICAgfSk7XG4gIH1cblxuICAvLyBcXHUyNTAwXFx1MjUwMCA1LiBDcm9zcy1kb2N1bWVudCB0ZXJtaW5vbG9neSBjb25zaXN0ZW5jeSBcXHUyNTAwXFx1MjUwMFxcdTI1MDBcXHUyNTAwXFx1MjUwMFxcdTI1MDBcXHUyNTAwXFx1MjUwMFxcdTI1MDBcXHUyNTAwXFx1MjUwMFxcdTI1MDBcXHUyNTAwXFx1MjUwMFxcdTI1MDBcXHUyNTAwXFx1MjUwMFxcdTI1MDBcXHUyNTAwXFx1MjUwMFxcdTI1MDBcbiAgY29uc3Qgc3FUZXh0cyA9IFsuLi5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCd0ZXh0YXJlYVtpZF49XCJzYy10ZXh0LVwiXScpXVxuICAgIC5tYXAoZWwgPT4gZWwudmFsdWUudG9Mb3dlckNhc2UoKSkuZmlsdGVyKEJvb2xlYW4pO1xuICBjb25zdCBhbGxEb2NUZXh0ID0gW2N2VGV4dCwgY2xUZXh0LCAuLi5zcVRleHRzXTtcblxuICBjb25zdCBfVEVSTV9QQUlSUyA9IFtcbiAgICBbJ21hY2hpbmUgbGVhcm5pbmcnLCAnbWwnXSwgWydhcnRpZmljaWFsIGludGVsbGlnZW5jZScsICdhaSddLFxuICAgIFsnbmF0dXJhbCBsYW5ndWFnZSBwcm9jZXNzaW5nJywgJ25scCddLCBbJ2RlZXAgbGVhcm5pbmcnLCAnZGwnXSxcbiAgICBbJ2xhcmdlIGxhbmd1YWdlIG1vZGVsJywgJ2xsbSddLCBbJ3VzZXIgaW50ZXJmYWNlJywgJ3VpJ10sXG4gICAgWyd1c2VyIGV4cGVyaWVuY2UnLCAndXgnXSwgWydhcHBsaWNhdGlvbiBwcm9ncmFtbWluZyBpbnRlcmZhY2UnLCAnYXBpJ10sXG4gICAgWydrdWJlcm5ldGVzJywgJ2s4cyddLCBbJ2NvbnRpbnVvdXMgaW50ZWdyYXRpb24nLCAnY2kvY2QnXSxcbiAgXTtcbiAgY29uc3QgdGVybU1pc21hdGNoZXMgPSBbXTtcbiAgZm9yIChjb25zdCBbbG9uZywgc2hvcnRdIG9mIF9URVJNX1BBSVJTKSB7XG4gICAgY29uc3QgcmUgPSBuZXcgUmVnRXhwKGBcXFxcYiR7c2hvcnQucmVwbGFjZSgnLycsICdcXFxcLycpfVxcXFxiYCk7XG4gICAgaWYgKGFsbERvY1RleHQuc29tZSh0ID0+IHQuaW5jbHVkZXMobG9uZykpICYmIGFsbERvY1RleHQuc29tZSh0ID0+IHJlLnRlc3QodCkpKSB7XG4gICAgICB0ZXJtTWlzbWF0Y2hlcy5wdXNoKGBcXHUyMDFjJHtsb25nfVxcdTIwMWQgLyBcXHUyMDFjJHtzaG9ydC50b1VwcGVyQ2FzZSgpfVxcdTIwMWRgKTtcbiAgICB9XG4gIH1cbiAgaWYgKHRlcm1NaXNtYXRjaGVzLmxlbmd0aCA+IDApIHtcbiAgICBjaGVja3MucHVzaCh7XG4gICAgICBzdGF0dXM6ICd3YXJuJyxcbiAgICAgIGxhYmVsOiAgJ1Rlcm1pbm9sb2d5IGNvbnNpc3RlbmN5JyxcbiAgICAgIGRldGFpbDogYE1peGVkIGZvcm1zIGRldGVjdGVkIGFjcm9zcyBkb2N1bWVudHM6ICR7dGVybU1pc21hdGNoZXMuam9pbignOyAnKX0uIFN0YW5kYXJkaXNlIHRvIG9uZSBmb3JtIHBlciBjb25jZXB0LmAsXG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoYWxsRG9jVGV4dC5zb21lKHQgPT4gdC5sZW5ndGggPiA1MCkpIHtcbiAgICBjaGVja3MucHVzaCh7XG4gICAgICBzdGF0dXM6ICdwYXNzJyxcbiAgICAgIGxhYmVsOiAgJ1Rlcm1pbm9sb2d5IGNvbnNpc3RlbmN5JyxcbiAgICAgIGRldGFpbDogJ05vIG1peGVkIGFiYnJldmlhdGlvbi9leHBhbnNpb24gcGFpcnMgZGV0ZWN0ZWQgYWNyb3NzIENWLCBjb3ZlciBsZXR0ZXIsIGFuZCBzY3JlZW5pbmcgYW5zd2Vycy4nLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gXHUyNTAwXHUyNTAwIFJlbmRlciBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgY29uc3QgaWNvbnMgPSB7IHBhc3M6ICdcXHUyNzA1Jywgd2FybjogJ1xcdTI2YTBcXHVmZTBmJywgZmFpbDogJ1xcdTI3NGMnIH07XG4gIGNvbnN0IG92ZXJhbGxGYWlsICAgPSBjaGVja3Muc29tZShjID0+IGMuc3RhdHVzID09PSAnZmFpbCcpO1xuICBjb25zdCBvdmVyYWxsV2FybiAgID0gY2hlY2tzLnNvbWUoYyA9PiBjLnN0YXR1cyA9PT0gJ3dhcm4nKTtcbiAgY29uc3Qgb3ZlcmFsbFN0YXR1cyA9IG92ZXJhbGxGYWlsID8gJ2ZhaWwnIDogb3ZlcmFsbFdhcm4gPyAnd2FybicgOiAncGFzcyc7XG4gIGNvbnN0IG92ZXJhbGxNc2cgICAgPSBvdmVyYWxsRmFpbFxuICAgID8gJ0lzc3VlcyBmb3VuZCBcXHUyMDE0IHJldmlldyBiZWZvcmUgc2VuZGluZydcbiAgICA6IG92ZXJhbGxXYXJuID8gJ01pbm9yIGluY29uc2lzdGVuY2llcyBkZXRlY3RlZCcgOiAnQWxsIGNoZWNrcyBwYXNzZWQnO1xuXG4gIHBhbmVsLmlubmVySFRNTCA9IGBcbiAgICA8ZGl2IGNsYXNzPVwiY29uc2lzdGVuY3ktcmVwb3J0XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3ItaGVhZGVyXCI+XG4gICAgICAgIDxoMyBzdHlsZT1cIm1hcmdpbjowO2ZvbnQtc2l6ZToxZW07XCI+JHtpY29uc1tvdmVyYWxsU3RhdHVzXX0gQ3Jvc3MtRG9jdW1lbnQgQ29uc2lzdGVuY3k8L2gzPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImNyLWJhZGdlIGNyLSR7b3ZlcmFsbFN0YXR1c31cIj4ke2VzY2FwZUh0bWwob3ZlcmFsbE1zZyl9PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7Zm9udC1zaXplOjAuODNlbTttYXJnaW46MCAwIDEycHg7XCI+XG4gICAgICAgIENoZWNrcyBjb21wYW55IG5hbWUsIGpvYiB0aXRsZSwgQVRTIGtleXdvcmRzLCBkYXRlIGZvcm1hdHRpbmcsIGFuZCB0ZXJtaW5vbG9neSBjb25zaXN0ZW5jeSBhY3Jvc3MgQ1YsIGNvdmVyIGxldHRlciwgYW5kIHNjcmVlbmluZyBhbnN3ZXJzLlxuICAgICAgPC9wPlxuICAgICAgPGRpdiBjbGFzcz1cImNyLWNoZWNrc1wiPlxuICAgICAgICAke2NoZWNrcy5tYXAoYyA9PiBgXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNyLWNoZWNrIGNyLSR7Yy5zdGF0dXN9XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNyLWljb25cIj4ke2ljb25zW2Muc3RhdHVzXX08L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNyLWxhYmVsXCI+JHtlc2NhcGVIdG1sKGMubGFiZWwpfTwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3ItZGV0YWlsXCI+JHtjLmRldGFpbH08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+YCkuam9pbignJyl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgRGVib3VuY2VkIHZhbGlkYXRpb24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmxldCBfY2xWYWxpZGF0ZVRpbWVyID0gbnVsbDtcbmZ1bmN0aW9uIF9kZWJvdW5jZWRWYWxpZGF0ZUNMKCkge1xuICBjbGVhclRpbWVvdXQoX2NsVmFsaWRhdGVUaW1lcik7XG4gIF9jbFZhbGlkYXRlVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICBjb25zdCB0YSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1sZXR0ZXItdGV4dGFyZWEnKTtcbiAgICBpZiAodGEpIF92YWxpZGF0ZUNvdmVyTGV0dGVyKHRhLnZhbHVlKTtcbiAgfSwgNjAwKTtcbn1cblxuLyoqXG4gKiBDbGllbnQtc2lkZSBjb3ZlciBsZXR0ZXIgcXVhbGl0eSBjaGVja3MuXG4gKiA1IHJ1bGVzOiBvcGVuaW5nLCBJLWZpcnN0IGdhdGUsIGNvbXBhbnkgbmFtZSwgd29yZCBjb3VudCAocm9sZS1kaWZmZXJlbnRpYXRlZCksIGNhbGwtdG8tYWN0aW9uLlxuICovXG5mdW5jdGlvbiBfdmFsaWRhdGVDb3ZlckxldHRlcih0ZXh0KSB7XG4gIGNvbnN0IHBhbmVsICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC12YWxpZGF0aW9uLXBhbmVsJyk7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1jaGVja3MtY29udGFpbmVyJyk7XG4gIGlmICghcGFuZWwgfHwgIWNvbnRhaW5lciB8fCAhdGV4dC50cmltKCkpIHJldHVybjtcblxuICAvLyBcdTI1MDBcdTI1MDAgUnVsZSAxOiBPcGVuaW5nIHBhdHRlcm4gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIGNvbnN0IGZpcnN0TGluZSA9ICh0ZXh0LnNwbGl0KCdcXG4nKS5maW5kKGwgPT4gbC50cmltKCkpIHx8ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgZ2VuZXJpY09wZW5pbmdzID0gW1xuICAgIC9eZGVhciBoaXJpbmcgbWFuYWdlci8sXG4gICAgL15kZWFyIHNpciBvciBtYWRhbS8sXG4gICAgL150byB3aG9tIGl0IG1heSBjb25jZXJuLyxcbiAgICAvXmRlYXIgcmVjcnVpdGVyLyxcbiAgICAvXmRlYXIgaHVtYW4gcmVzb3VyY2VzLyxcbiAgICAvXmRlYXIgaHIvLFxuICBdO1xuICBjb25zdCBnZW5lcmljT3BlbmluZyA9IGdlbmVyaWNPcGVuaW5ncy5zb21lKHJlID0+IHJlLnRlc3QoZmlyc3RMaW5lKSk7XG4gIGNvbnN0IG9wZW5pbmdDaGVjayA9IHtcbiAgICBwYXNzOiAhZ2VuZXJpY09wZW5pbmcsXG4gICAgbGFiZWw6ICdPcGVuaW5nIHNhbHV0YXRpb24nLFxuICAgIGRldGFpbDogZ2VuZXJpY09wZW5pbmdcbiAgICAgID8gJ1VzZXMgYSBnZW5lcmljIG9wZW5lciAoXCJEZWFyIEhpcmluZyBNYW5hZ2VyXCIgZXRjLikgXHUyMDE0IHBlcnNvbmFsaXNlIHdpdGggYSBuYW1lIG9yIHJvbGUuJ1xuICAgICAgOiAnUGVyc29uYWxpc2VkIG9wZW5lciBcdTIwMTQgZ29vZC4nLFxuICB9O1xuXG4gIC8vIFx1MjUwMFx1MjUwMCBSdWxlIDFiOiBCb2R5IG11c3Qgbm90IG9wZW4gd2l0aCBcIklcIiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgY29uc3QgYWxsTGluZXMgPSB0ZXh0LnNwbGl0KCdcXG4nKS5tYXAobCA9PiBsLnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pO1xuICBjb25zdCBzYWx1dGF0aW9uSWR4ID0gYWxsTGluZXMuZmluZEluZGV4KFxuICAgIGwgPT4gbC50b0xvd2VyQ2FzZSgpID09PSBmaXJzdExpbmUudG9Mb3dlckNhc2UoKVxuICApO1xuICBjb25zdCBib2R5TGluZXMgPSBhbGxMaW5lcy5zbGljZShNYXRoLm1heCgwLCBzYWx1dGF0aW9uSWR4ICsgMSkpO1xuICBjb25zdCBmaXJzdEJvZHlXb3JkID0gKGJvZHlMaW5lcy5maW5kKGwgPT4gbC50cmltKCkpIHx8ICcnKS5zcGxpdCgvXFxzKy8pWzBdIHx8ICcnO1xuICAvLyBTcGxpdCBvbiBub24tYWxwaGEgc28gXCJJJ21cIiBcdTIxOTIgdG9rZW4gXCJJXCIsIFwiSW5cIiBcdTIxOTIgdG9rZW4gXCJJblwiXG4gIGNvbnN0IGZpcnN0Qm9keVRva2VuID0gZmlyc3RCb2R5V29yZC5zcGxpdCgvW15hLXpBLVpdLylbMF0gfHwgJyc7XG4gIGNvbnN0IGJvZHlTdGFydHNXaXRoSSA9IGZpcnN0Qm9keVRva2VuLnRvTG93ZXJDYXNlKCkgPT09ICdpJztcbiAgY29uc3QgaUZpcnN0Q2hlY2sgPSB7XG4gICAgcGFzczogIWJvZHlTdGFydHNXaXRoSSxcbiAgICBsYWJlbDogJ09wZW5pbmcgd29yZCcsXG4gICAgZGV0YWlsOiBib2R5U3RhcnRzV2l0aElcbiAgICAgID8gJ0JvZHkgb3BlbnMgd2l0aCBcIklcIiBcdTIwMTQgbGVhZCB3aXRoIHlvdXIgdmFsdWUsIHRoZSByb2xlLCBvciB0aGUgY29tcGFueSBpbnN0ZWFkLidcbiAgICAgIDogJ0JvZHkgZG9lcyBub3Qgb3BlbiB3aXRoIFwiSVwiIFx1MjAxNCBnb29kLicsXG4gIH07XG5cbiAgLy8gXHUyNTAwXHUyNTAwIFJ1bGUgMjogQ29tcGFueS1zcGVjaWZpYyByZWZlcmVuY2UgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIGNvbnN0IGNvbXBhbnlOYW1lID0gX2dldENvbXBhbnlOYW1lRm9yQ0woKTtcbiAgbGV0IGNvbXBhbnlDaGVjaztcbiAgaWYgKCFjb21wYW55TmFtZSkge1xuICAgIGNvbXBhbnlDaGVjayA9IHsgd2FybjogdHJ1ZSwgbGFiZWw6ICdDb21wYW55IHJlZmVyZW5jZScsIGRldGFpbDogJ0NvbXBhbnkgbmFtZSBub3QgZGV0ZWN0ZWQgZnJvbSBqb2IgZGVzY3JpcHRpb24gXHUyMDE0IHZlcmlmeSBtYW51YWxseS4nIH07XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgbWVudGlvbnMgPSAodGV4dC50b0xvd2VyQ2FzZSgpLm1hdGNoKG5ldyBSZWdFeHAoY29tcGFueU5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgJ1xcXFwkJicpLCAnZycpKSB8fCBbXSkubGVuZ3RoO1xuICAgIGNvbXBhbnlDaGVjayA9IHtcbiAgICAgIHBhc3M6IG1lbnRpb25zID49IDIsXG4gICAgICB3YXJuOiBtZW50aW9ucyA9PT0gMSxcbiAgICAgIGxhYmVsOiAnQ29tcGFueSByZWZlcmVuY2UnLFxuICAgICAgZGV0YWlsOiBtZW50aW9ucyA9PT0gMFxuICAgICAgICA/IGBcIiR7ZXNjYXBlSHRtbChjb21wYW55TmFtZSl9XCIgbm90IG1lbnRpb25lZCBcdTIwMTQgYWRkIHNwZWNpZmljIHJlZmVyZW5jZXMuYFxuICAgICAgICA6IG1lbnRpb25zID09PSAxXG4gICAgICAgICAgPyBgXCIke2VzY2FwZUh0bWwoY29tcGFueU5hbWUpfVwiIG1lbnRpb25lZCBvbmNlIFx1MjAxNCBhIHNlY29uZCBzcGVjaWZpYyByZWZlcmVuY2Ugc3RyZW5ndGhlbnMgdGhlIGxldHRlci5gXG4gICAgICAgICAgOiBgXCIke2VzY2FwZUh0bWwoY29tcGFueU5hbWUpfVwiIG1lbnRpb25lZCAke21lbnRpb25zfSB0aW1lcyBcdTIwMTQgZ29vZCBzcGVjaWZpY2l0eS5gLFxuICAgIH07XG4gIH1cblxuICAvLyBcdTI1MDBcdTI1MDAgUnVsZSAzOiBXb3JkIGNvdW50IChyb2xlLWRpZmZlcmVudGlhdGVkIHRhcmdldCkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIGNvbnN0IF9yb2xlQW5hbHlzaXMgPSB3aW5kb3cuX2xhc3RBbmFseXNpc0RhdGEgfHxcbiAgICAod2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnMgJiYgd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnMuam9iX2FuYWx5c2lzKSB8fCB7fTtcbiAgY29uc3QgX3JvbGVMZXZlbCAgPSAoX3JvbGVBbmFseXNpcy5yb2xlX2xldmVsIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBfcm9sZURvbWFpbiA9IChfcm9sZUFuYWx5c2lzLmRvbWFpbiB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgaXNFeGVjICAgICAgPSAvZXhlY3x2cHxjLXN1aXRlfGNoaWVmfGRpcmVjdG9yfHByZXNpZGVudHxwYXJ0bmVyLy50ZXN0KF9yb2xlTGV2ZWwpO1xuICBjb25zdCBpc0FjYWRlbWljICA9IC9hY2FkZW1pY3xyZXNlYXJjaHxmYWN1bHR5fHByb2Zlc3Nvcnxwb3N0ZG9jLy50ZXN0KF9yb2xlRG9tYWluICsgJyAnICsgX3JvbGVMZXZlbCk7XG4gIGNvbnN0IHdjVGFyZ2V0ICAgID0gaXNBY2FkZW1pYyA/IHsgbG86IDUwMCwgaGk6IDYwMCwgd2FybkxvOiA0MDAsIHdhcm5IaTogNjUwIH1cbiAgICAgICAgICAgICAgICAgICAgOiBpc0V4ZWMgICAgID8geyBsbzogNDAwLCBoaTogNTAwLCB3YXJuTG86IDMwMCwgd2FybkhpOiA1NTAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7IGxvOiAyNTAsIGhpOiAzMDAsIHdhcm5MbzogMjAwLCB3YXJuSGk6IDQwMCB9O1xuICBjb25zdCB3Y0xhYmVsICAgICA9IGlzQWNhZGVtaWMgPyBgJHt3Y1RhcmdldC5sb31cdTIwMTMke3djVGFyZ2V0LmhpfSAoYWNhZGVtaWMvcmVzZWFyY2gpYFxuICAgICAgICAgICAgICAgICAgICA6IGlzRXhlYyAgICAgPyBgJHt3Y1RhcmdldC5sb31cdTIwMTMke3djVGFyZ2V0LmhpfSAoZXhlY3V0aXZlKWBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYFx1MjI2NCR7d2NUYXJnZXQuaGl9IChzdGFuZGFyZClgO1xuXG4gIGNvbnN0IHdvcmRzICAgID0gdGV4dC50cmltKCkuc3BsaXQoL1xccysvKS5maWx0ZXIoQm9vbGVhbikubGVuZ3RoO1xuICBjb25zdCB3Y1BjdCAgICA9IE1hdGgubWluKDEwMCwgKHdvcmRzIC8gd2NUYXJnZXQuaGkpICogMTAwKTtcbiAgY29uc3Qgd2NDb2xvdXIgPSB3b3JkcyA8IHdjVGFyZ2V0Lndhcm5MbyA/ICcjZWY0NDQ0J1xuICAgICAgICAgICAgICAgICA6IHdvcmRzIDwgd2NUYXJnZXQubG8gICAgICA/ICcjZjU5ZTBiJ1xuICAgICAgICAgICAgICAgICA6IHdvcmRzIDw9IHdjVGFyZ2V0LmhpICAgICA/ICcjMjJjNTVlJ1xuICAgICAgICAgICAgICAgICA6IHdvcmRzIDw9IHdjVGFyZ2V0Lndhcm5IaSA/ICcjZjU5ZTBiJ1xuICAgICAgICAgICAgICAgICA6ICcjZWY0NDQ0JztcbiAgY29uc3Qgd2NTdGF0dXMgPSB3b3JkcyA+PSB3Y1RhcmdldC5sbyAmJiB3b3JkcyA8PSB3Y1RhcmdldC5oaSA/ICdwYXNzJ1xuICAgICAgICAgICAgICAgICA6IHdvcmRzID49IHdjVGFyZ2V0Lndhcm5MbyAmJiB3b3JkcyA8PSB3Y1RhcmdldC53YXJuSGkgPyAnd2FybidcbiAgICAgICAgICAgICAgICAgOiAnZmFpbCc7XG4gIGNvbnN0IHdjQmFyICAgID0gYDxzcGFuIGNsYXNzPVwiY2wtd2MtYmFyXCI+PHNwYW4gY2xhc3M9XCJjbC13Yy1maWxsXCIgc3R5bGU9XCJ3aWR0aDoke3djUGN0fSU7YmFja2dyb3VuZDoke3djQ29sb3VyfTtcIj48L3NwYW4+PC9zcGFuPmA7XG4gIGNvbnN0IHdvcmRDb3VudENoZWNrID0ge1xuICAgIFt3Y1N0YXR1c106IHRydWUsXG4gICAgbGFiZWw6IGBXb3JkIGNvdW50ICgke3djTGFiZWx9KWAsXG4gICAgZGV0YWlsOiBgJHt3b3Jkc30gd29yZHMgJHt3Y0Jhcn0gXHUyMDE0ICR7XG4gICAgICB3b3JkcyA8IHdjVGFyZ2V0LmxvID8gYHRvbyBzaG9ydDsgYWltIGZvciAke3djVGFyZ2V0LmxvfVx1MjAxMyR7d2NUYXJnZXQuaGl9LmBcbiAgICAgIDogd29yZHMgPiB3Y1RhcmdldC5oaSA/IGB0b28gbG9uZzsgdHJpbSB0byAke3djVGFyZ2V0LmhpfSB3b3Jkcy5gXG4gICAgICA6ICd3aXRoaW4gdGFyZ2V0IHJhbmdlLidcbiAgICB9YCxcbiAgfTtcblxuICAvLyBcdTI1MDBcdTI1MDAgUnVsZSA0OiBDYWxsLXRvLWFjdGlvbiBjbG9zaW5nIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICBjb25zdCBsYXN0UGFyYSA9IHRleHQuc3BsaXQoL1xcbnsyLH0vKS5maWx0ZXIocCA9PiBwLnRyaW0oKSkuc2xpY2UoLTEpWzBdIHx8ICcnO1xuICAvLyBBc3NlcnRpdmUgQ1RBczogY2FuZGlkYXRlIHRha2VzIGluaXRpYXRpdmUgKHBhc3MpXG4gIGNvbnN0IGFzc2VydGl2ZUN0YVBhdHRlcm5zID0gW1xuICAgIC9pbnRlcnZpZXcvaSwgL2Rpc2N1c3MvaSwgL29wcG9ydHVuaXR5IHRvIChzcGVha3x0YWxrfG1lZXR8Y29ubmVjdCkvaSxcbiAgICAvaSB3aWxsIChjYWxsfGZvbGxvdy4/dXB8cmVhY2ggb3V0fGNvbnRhY3R8c2VuZCkvaSxcbiAgICAvaSAocGxhbnxpbnRlbmQpIHRvL2ksIC93ZWxjb21lIHRoZSBjaGFuY2UvaSxcbiAgICAvYXZhaWxhYmxlIChmb3J8dG8pL2ksIC9jb250YWN0IG1lL2ksXG4gIF07XG4gIC8vIFBhc3NpdmUgQ1RBczogd2FpdGluZyBmb3IgYSByZXNwb25zZSAoZmFpbCBcdTIwMTQgc3RvcnkgVVMtUDUgcmVxdWlyZXMgcmVqZWN0aW9uKVxuICBjb25zdCBwYXNzaXZlQ3RhUGF0dGVybnMgPSBbXG4gICAgL2hlYXIgZnJvbSB5b3UvaSwgL2xvb2sgZm9yd2FyZCB0byAoeW91cnxoZWFyaW5nKS9pLFxuICAgIC9hd2FpdChpbmcpPyB5b3VyL2ksIC9ob3BlIHRvIChoZWFyfG1lZXQpL2ksXG4gIF07XG4gIGNvbnN0IGhhc0Fzc2VydGl2ZUN0YSA9IGFzc2VydGl2ZUN0YVBhdHRlcm5zLnNvbWUocmUgPT4gcmUudGVzdChsYXN0UGFyYSkpO1xuICBjb25zdCBoYXNQYXNzaXZlQ3RhICAgPSBwYXNzaXZlQ3RhUGF0dGVybnMuc29tZShyZSA9PiByZS50ZXN0KGxhc3RQYXJhKSk7XG4gIGNvbnN0IGN0YUNoZWNrID0ge1xuICAgIHBhc3M6IGhhc0Fzc2VydGl2ZUN0YSxcbiAgICBmYWlsOiAhaGFzQXNzZXJ0aXZlQ3RhICYmIGhhc1Bhc3NpdmVDdGEsXG4gICAgbGFiZWw6ICdDYWxsLXRvLWFjdGlvbiBjbG9zaW5nJyxcbiAgICBkZXRhaWw6IGhhc0Fzc2VydGl2ZUN0YVxuICAgICAgPyAnQXNzZXJ0aXZlIGNhbGwtdG8tYWN0aW9uIFx1MjAxNCB0YWtlcyBpbml0aWF0aXZlLidcbiAgICAgIDogaGFzUGFzc2l2ZUN0YVxuICAgICAgICA/ICdQYXNzaXZlIGNsb3NpbmcgcmVqZWN0ZWQgXHUyMDE0IHBocmFzZXMgbGlrZSBcIkkgbG9vayBmb3J3YXJkIHRvIGhlYXJpbmcgZnJvbSB5b3VcIiBhcmUgdG9vIHBhc3NpdmUuIFJlcGxhY2Ugd2l0aCBhIGRpcmVjdCBpbnRlcnZpZXcgcmVxdWVzdDogXCJJIHdvdWxkIHdlbGNvbWUgdGhlIG9wcG9ydHVuaXR5IHRvIGludGVydmlld1wiIG9yIFwiSSB3aWxsIGZvbGxvdyB1cCBuZXh0IHdlZWsuXCInXG4gICAgICAgIDogJ05vIGNhbGwtdG8tYWN0aW9uIGZvdW5kIFx1MjAxNCBhZGQgYSBkaXJlY3QgaW50ZXJ2aWV3IHJlcXVlc3Qgb3IgcHJvYWN0aXZlIGZvbGxvdy11cCBzdGF0ZW1lbnQuJyxcbiAgfTtcblxuICAvLyBcdTI1MDBcdTI1MDAgUnVsZSA1OiBOYW1lZCBvciBxdWFudGlmaWVkIGFjaGlldmVtZW50IFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICBjb25zdCBhY2hpZXZlbWVudFBhdHRlcm5zID0gW1xuICAgIC9cXGQrJS8sICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwZXJjZW50YWdlc1xuICAgIC9cXCRbXFxkLF0rLywgICAgICAgICAgICAgICAgICAgICAgLy8gZG9sbGFyIGFtb3VudHNcbiAgICAvXFxkKyAodGltZXN8eHxmb2xkfHllYXJ8bW9udGh8d2Vla3xkYXl8dGVhbXxwZW9wbGV8c3RhZmZ8Y2xpZW50fGN1c3RvbWVyfHByb2plY3R8cHJvZHVjdHxzeXN0ZW18YXdhcmR8cGF0ZW50KS9pLFxuICAgIC9yZWR1Y2VkfGluY3JlYXNlZHxncmV3fGdyZXd8ZG91YmxlZHx0cmlwbGVkfHNhdmVkfGdlbmVyYXRlZHxkZWxpdmVyZWR8bGF1bmNoZWR8bGVkfGJ1aWx0fGRlc2lnbmVkfGFyY2hpdGVjdGVkfHBpb25lZXJlZHx3b258YXdhcmRlZHxlYXJuZWR8YWNoaWV2ZWQvaSxcbiAgXTtcbiAgY29uc3QgaGFzQWNoaWV2ZW1lbnQgPSBhY2hpZXZlbWVudFBhdHRlcm5zLnNvbWUocmUgPT4gcmUudGVzdCh0ZXh0KSk7XG4gIGNvbnN0IGFjaGlldmVtZW50Q2hlY2sgPSB7XG4gICAgcGFzczogaGFzQWNoaWV2ZW1lbnQsXG4gICAgd2FybjogIWhhc0FjaGlldmVtZW50LFxuICAgIGxhYmVsOiAnU3BlY2lmaWMgYWNoaWV2ZW1lbnQnLFxuICAgIGRldGFpbDogaGFzQWNoaWV2ZW1lbnRcbiAgICAgID8gJ0NvbnRhaW5zIGEgcXVhbnRpZmllZCBvciBuYW1lZCBhY2hpZXZlbWVudCBcdTIwMTQgZ29vZC4nXG4gICAgICA6ICdObyBxdWFudGlmaWVkIGFjaGlldmVtZW50IGRldGVjdGVkIFx1MjAxNCBhZGQgYXQgbGVhc3Qgb25lIHNwZWNpZmljIHJlc3VsdCAoZS5nLiwgXCJpbmNyZWFzZWQgcmV2ZW51ZSBieSAzMCVcIiwgXCJsZWQgYSB0ZWFtIG9mIDhcIikuJyxcbiAgfTtcblxuICAvLyBcdTI1MDBcdTI1MDAgUnVsZSA3OiBHZW5lcmljIGZpbGxlciBwaHJhc2VzIChHQVAtMTcpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICBjb25zdCBfQ0xfRklMTEVSID0gW1xuICAgICdpIGFtIHdyaXRpbmcgdG8gYXBwbHknLCAnaSBhbSBleGNpdGVkIHRvIGFwcGx5JywgJ2kgYW0gcGxlYXNlZCB0byBhcHBseScsXG4gICAgJ3BsZWFzZSBmaW5kIG15JywgJ2F0dGFjaGVkIHBsZWFzZSBmaW5kJywgJ2VuY2xvc2VkIHBsZWFzZSBmaW5kJyxcbiAgICAndGhpcyBsZXR0ZXIgaXMgdG8gZXhwcmVzcycsICdpIGZlZWwgaSB3b3VsZCBiZSBhIGdyZWF0IGZpdCcsXG4gICAgJ2kgYmVsaWV2ZSBpIHdvdWxkIGJlIGEgcGVyZmVjdCBmaXQnLCAnaSBhbSBjb25maWRlbnQgdGhhdCBpJyxcbiAgICAncmVzdWx0cy1kcml2ZW4nLCAnZGV0YWlsLW9yaWVudGVkJywgJ3NlYXNvbmVkIHByb2Zlc3Npb25hbCcsXG4gICAgJ3Bhc3Npb25hdGUgYWJvdXQnLCAnZHluYW1pYyBwcm9mZXNzaW9uYWwnLCAnaGlnaGx5IG1vdGl2YXRlZCcsXG4gICAgJ3RlYW0gcGxheWVyJywgJ3NlbGYtc3RhcnRlcicsICdoYXJkIHdvcmtpbmcnLFxuICBdO1xuICBjb25zdCBfdGV4dExjICAgID0gdGV4dC50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBmb3VuZEZpbGwgID0gX0NMX0ZJTExFUi5maWx0ZXIocCA9PiBfdGV4dExjLmluY2x1ZGVzKHApKTtcbiAgY29uc3QgZmlsbGVyQ2hlY2sgPSB7XG4gICAgcGFzczogZm91bmRGaWxsLmxlbmd0aCA9PT0gMCxcbiAgICB3YXJuOiBmb3VuZEZpbGwubGVuZ3RoID4gMCAmJiBmb3VuZEZpbGwubGVuZ3RoIDw9IDIsXG4gICAgZmFpbDogZm91bmRGaWxsLmxlbmd0aCA+IDIsXG4gICAgbGFiZWw6ICdGaWxsZXIgcGhyYXNlcycsXG4gICAgZGV0YWlsOiBmb3VuZEZpbGwubGVuZ3RoID09PSAwXG4gICAgICA/ICdObyBnZW5lcmljIGZpbGxlciBwaHJhc2VzIGRldGVjdGVkIFx1MjAxNCBnb29kLidcbiAgICAgIDogYEdlbmVyaWMgcGhyYXNlJHtmb3VuZEZpbGwubGVuZ3RoID4gMSA/ICdzJyA6ICcnfSBkZXRlY3RlZDogJHtmb3VuZEZpbGwuc2xpY2UoMCwgMykubWFwKHAgPT4gYFx1MjAxQyR7cH1cdTIwMURgKS5qb2luKCcsICcpfSR7Zm91bmRGaWxsLmxlbmd0aCA+IDMgPyAnXHUyMDI2JyA6ICcnfSBcdTIwMTQgcmVwbGFjZSB3aXRoIHNwZWNpZmljIHZhbHVlIGNsYWltcy5gLFxuICB9O1xuXG4gIC8vIFx1MjUwMFx1MjUwMCBSZW5kZXIgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIGNvbnN0IGNoZWNrcyA9IFtvcGVuaW5nQ2hlY2ssIGlGaXJzdENoZWNrLCBjb21wYW55Q2hlY2ssIHdvcmRDb3VudENoZWNrLCBjdGFDaGVjaywgYWNoaWV2ZW1lbnRDaGVjaywgZmlsbGVyQ2hlY2tdO1xuICBjb250YWluZXIuaW5uZXJIVE1MID0gY2hlY2tzLm1hcChjID0+IHtcbiAgICBjb25zdCBzdGF0ZSA9IGMucGFzcyA/ICdwYXNzJyA6IGMud2FybiA/ICd3YXJuJyA6ICdmYWlsJztcbiAgICByZXR1cm4gYDxkaXYgY2xhc3M9XCJjbC1jaGVjayAke3N0YXRlfVwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjYy1pY29uXCI+PC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjYy1sYWJlbFwiPiR7ZXNjYXBlSHRtbChjLmxhYmVsKX08L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cImNjLWRldGFpbFwiPiR7Yy5kZXRhaWx9PC9zcGFuPlxuICAgIDwvZGl2PmA7XG4gIH0pLmpvaW4oJycpO1xuXG4gIHBhbmVsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgR2V0IGNvbXBhbnkgbmFtZSBmb3IgY292ZXIgbGV0dGVyIHZhbGlkYXRpb24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIF9nZXRDb21wYW55TmFtZUZvckNMKCkge1xuICAvLyBUcnkgYW5hbHlzaXMgZGF0YSBmaXJzdCwgdGhlbiBmYWxsIGJhY2sgdG8gam9iIGRlc2NyaXB0aW9uIGZpcnN0IGxpbmVcbiAgY29uc3QgYW5hbHlzaXMgPSB3aW5kb3cuX2xhc3RBbmFseXNpc0RhdGEgfHwgKHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zICYmIHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zLmpvYl9hbmFseXNpcyk7XG4gIGlmIChhbmFseXNpcyAmJiBhbmFseXNpcy5jb21wYW55X25hbWUpIHJldHVybiBhbmFseXNpcy5jb21wYW55X25hbWU7XG4gIGlmIChhbmFseXNpcyAmJiBhbmFseXNpcy5jb21wYW55KSAgICAgIHJldHVybiBhbmFseXNpcy5jb21wYW55O1xuICAvLyBGYWxsIGJhY2s6IGZpcnN0IG5vbi1lbXB0eSBsaW5lIG9mIGpvYiBkZXNjcmlwdGlvbiBpbiB0YWJEYXRhXG4gIGNvbnN0IGpkID0gc3RhdGVNYW5hZ2VyLmdldFRhYkRhdGEoJ2pvYicpIHx8ICcnO1xuICBjb25zdCBmaXJzdExpbmUgPSBqZC5zcGxpdCgnXFxuJykuZmluZChsID0+IGwudHJpbSgpKTtcbiAgcmV0dXJuIGZpcnN0TGluZSA/IGZpcnN0TGluZS50cmltKCkuc2xpY2UoMCwgNjApIDogJyc7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFeHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5leHBvcnQge1xuICBDT1ZFUl9MRVRURVJfVE9ORVMsXG4gIF9jb3ZlckxldHRlckZvcm1TdGF0ZSxcbiAgcG9wdWxhdGVDb3ZlckxldHRlclRhYixcbiAgZ2VuZXJhdGVDb3ZlckxldHRlcixcbiAgc2F2ZUNvdmVyTGV0dGVyLFxuICBfcmVuZGVyQ29uc2lzdGVuY3lSZXBvcnQsXG4gIF9kZWJvdW5jZWRWYWxpZGF0ZUNMLFxuICBfdmFsaWRhdGVDb3ZlckxldHRlcixcbiAgX2dldENvbXBhbnlOYW1lRm9yQ0wsXG59O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvc2NyZWVuaW5nLXF1ZXN0aW9ucy5qc1xuICogU2NyZWVuaW5nIHF1ZXN0aW9ucyB0YWI6IHBhcnNlLCBzZWFyY2gsIGdlbmVyYXRlLCBzYXZlIHJlc3BvbnNlcy5cbiAqXG4gKiBEZXBlbmRlbmNpZXMgKHJlc29sdmVkIHRocm91Z2ggZ2xvYmFsVGhpcyBhdCBydW50aW1lKTpcbiAqICAgZXNjYXBlSHRtbCwgc2hvd0FsZXJ0TW9kYWxcbiAqL1xuXG4vLyBcdTI1MDBcdTI1MDAgTW9kdWxlLWxldmVsIHN0YXRlIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4vKiogUGVyLXF1ZXN0aW9uIGRyYWZ0IHN0YXRlOiB7IGZvcm1hdCwgZXhwZXJpZW5jZUluZGljZXMsIHJlc3BvbnNlVGV4dCwgdG9waWNUYWcsIHByaW9yUmVzcG9uc2UgfSAqL1xuY29uc3QgX3NjcmVlbmluZ1N0YXRlID0ge307XG5cbi8qKiBSYXcgdGV4dCBmcm9tIHRoZSBzYy1pbnB1dCB0ZXh0YXJlYSBcdTIwMTQgc3Vydml2ZXMgdGFiIG5hdmlnYXRpb24uICovXG5sZXQgX3NjcmVlbmluZ0lucHV0VGV4dCA9ICcnO1xuXG4vKiogUmVzZXQgZnVuY3Rpb24gZm9yIHRlc3RpbmcgXHUyMDE0IGNsZWFycyBzYXZlZCB0ZXh0YXJlYSBzdGF0ZS4gKi9cbmZ1bmN0aW9uIF9yZXNldFNjcmVlbmluZ0lucHV0VGV4dCgpIHsgX3NjcmVlbmluZ0lucHV0VGV4dCA9ICcnOyB9XG5cbi8vIFx1MjUwMFx1MjUwMCBQb3B1bGF0ZSBzY3JlZW5pbmcgdGFiIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBwb3B1bGF0ZVNjcmVlbmluZ1RhYigpIHtcbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgc3R5bGU9XCJtYXgtd2lkdGg6OTAwcHg7bWFyZ2luOjAgYXV0bztwYWRkaW5nOjIwcHggMTBweDtcIj5cbiAgICAgIDxoMiBzdHlsZT1cImZvbnQtc2l6ZToxLjNlbTtmb250LXdlaWdodDo3MDA7bWFyZ2luLWJvdHRvbTo4cHg7XCI+XHVEODNEXHVEQ0NCIFNjcmVlbmluZyBRdWVzdGlvbnM8L2gyPlxuICAgICAgPHAgY2xhc3M9XCJzYy1pbnRyb1wiPlBhc3RlIG9uZSBvciBtb3JlIHNjcmVlbmluZyBxdWVzdGlvbnMgYmVsb3cgXHUyMDE0IG9uZSBwZXIgbGluZSwgb3Igc2VwYXJhdGVkIGJ5IGJsYW5rIGxpbmVzLiBDbGljayA8c3Ryb25nPlBhcnNlIFF1ZXN0aW9uczwvc3Ryb25nPiB0byBnZW5lcmF0ZSB0YWlsb3JlZCBkcmFmdCByZXNwb25zZXMuPC9wPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6MTBweDthbGlnbi1pdGVtczpmbGV4LXN0YXJ0O21hcmdpbi1ib3R0b206MjBweDtcIj5cbiAgICAgICAgPHRleHRhcmVhIGlkPVwic2MtaW5wdXRcIiByb3dzPVwiNlwiIHN0eWxlPVwiZmxleDoxO3BhZGRpbmc6MTJweDtib3JkZXI6MXB4IHNvbGlkICNlMmU4ZjA7Ym9yZGVyLXJhZGl1czo4cHg7Zm9udC1zaXplOjAuOTNlbTtyZXNpemU6dmVydGljYWw7XCIgcGxhY2Vob2xkZXI9XCJQYXN0ZSBzY3JlZW5pbmcgcXVlc3Rpb25zIGhlcmVcdTIwMjYmIzEwOyYjMTA7RS5nLiYjMTA7RGVzY3JpYmUgYSB0aW1lIHlvdSBsZWQgYSBjcm9zcy1mdW5jdGlvbmFsIHByb2plY3QuJiMxMDsmIzEwO0hvdyBkbyB5b3UgaGFuZGxlIHRpZ2h0IGRlYWRsaW5lcz9cIj48L3RleHRhcmVhPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLXByaW1hcnlcIiBvbmNsaWNrPVwicGFyc2VTY3JlZW5pbmdRdWVzdGlvbnMoKVwiPlBhcnNlIFF1ZXN0aW9uczwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGlkPVwic2MtcXVlc3Rpb25zLWNvbnRhaW5lclwiPjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInNjLXNhdmUtYmFyXCIgaWQ9XCJzYy1zYXZlLWJhclwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29udGludWUtYnRuXCIgaWQ9XCJzYy1zYXZlLWJ0blwiIG9uY2xpY2s9XCJzYXZlU2NyZWVuaW5nUmVzcG9uc2VzKClcIj5cdUQ4M0RcdURDQkUgU2F2ZSBBbGwgUmVzcG9uc2VzPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJuYXYtYnV0dG9ucyBuYXYtZW5kXCIgc3R5bGU9XCJtYXJnaW4tdG9wOjI0cHg7XCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJjb250aW51ZS1idG5cIiBvbmNsaWNrPVwiaGFuZGxlU3RlcENsaWNrKCdpbnRlcnZpZXdfcHJlcCcpXCI+XHVEODNDXHVERkE0IFByb2NlZWQgdG8gSW50ZXJ2aWV3IFByZXAgXHUyMTkyPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xuXG4gIC8vIFJlc3RvcmUgdGhlIHJhdyBpbnB1dCB0ZXh0IGFuZCB3aXJlIHVwIHNhdmUtb24taW5wdXQgbGlzdGVuZXIuXG4gIGNvbnN0IHNjSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2MtaW5wdXQnKTtcbiAgaWYgKHNjSW5wdXQpIHtcbiAgICBpZiAoX3NjcmVlbmluZ0lucHV0VGV4dCkgc2NJbnB1dC52YWx1ZSA9IF9zY3JlZW5pbmdJbnB1dFRleHQ7XG4gICAgc2NJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHsgX3NjcmVlbmluZ0lucHV0VGV4dCA9IHNjSW5wdXQudmFsdWU7IH0pO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBQYXJzZSBxdWVzdGlvbnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIHBhcnNlU2NyZWVuaW5nUXVlc3Rpb25zKCkge1xuICBjb25zdCByYXcgPSAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NjLWlucHV0Jyk/LnZhbHVlIHx8ICcnKS50cmltKCk7XG4gIGlmICghcmF3KSB7IHNob3dBbGVydE1vZGFsKCdcdTI2QTBcdUZFMEYgTm8gSW5wdXQnLCAnUGxlYXNlIHBhc3RlIGF0IGxlYXN0IG9uZSBzY3JlZW5pbmcgcXVlc3Rpb24gZmlyc3QuJyk7IHJldHVybjsgfVxuXG4gIC8vIFNwbGl0IG9uIGJsYW5rIGxpbmVzIChwcmVmZXJyZWQpIG9yIG51bWJlcmVkIGxpc3QgcGF0dGVybnM7IGZpbHRlciBlbXB0eSByZXN1bHRzXG4gIGxldCBxdWVzdGlvbnMgPSByYXcuc3BsaXQoL1xcblxccypcXG4rLykubWFwKHEgPT4gcS50cmltKCkpLmZpbHRlcihCb29sZWFuKTtcbiAgaWYgKHF1ZXN0aW9ucy5sZW5ndGggPT09IDEpIHtcbiAgICAvLyBUcnkgbnVtYmVyZWQgcGF0dGVybnMgbGlrZSBcIjEuIFwiIG9yIFwiMSkgXCIgb3IgXCJRMTpcIiB3aXRob3V0IHJlcXVpcmluZyBzcGFjZSBhZnRlclxuICAgIGNvbnN0IG51bWJlcmVkID0gcmF3LnNwbGl0KC9cXG4oPz1cXGQrWy5cXCldXFxzKig/PVtBLVpdKXxRXFxkK1s6XFwuXT9cXHMqKD89W0EtWl0pKS8pXG4gICAgICAubWFwKHEgPT4gcS50cmltKCkpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGlmIChudW1iZXJlZC5sZW5ndGggPiAxKSBxdWVzdGlvbnMgPSBudW1iZXJlZDtcbiAgfVxuICBpZiAocXVlc3Rpb25zLmxlbmd0aCA9PT0gMSkge1xuICAgIC8vIExhc3QgcmVzb3J0OiBzcGxpdCBvbiBhbnkgc2luZ2xlIG5ld2xpbmUgaWYgd2Ugc3RpbGwgaGF2ZSBqdXN0IG9uZSBcInF1ZXN0aW9uXCJcbiAgICBjb25zdCBzaW5nbGVMaW5lID0gcmF3LnNwbGl0KC9cXG4rLykubWFwKHEgPT4gcS50cmltKCkpLmZpbHRlcihxID0+IHEubGVuZ3RoID4gMCk7XG4gICAgaWYgKHNpbmdsZUxpbmUubGVuZ3RoID4gMSkgcXVlc3Rpb25zID0gc2luZ2xlTGluZTtcbiAgfVxuXG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzYy1xdWVzdGlvbnMtY29udGFpbmVyJyk7XG4gIGNvbnRhaW5lci5pbm5lckhUTUwgPSBxdWVzdGlvbnMubWFwKChxLCBpKSA9PiByZW5kZXJRdWVzdGlvbkJsb2NrKHEsIGkpKS5qb2luKCcnKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NjLXNhdmUtYmFyJykuc3R5bGUuZGlzcGxheSA9IHF1ZXN0aW9ucy5sZW5ndGggPyAnJyA6ICdub25lJztcblxuICAvLyBLaWNrIG9mZiBzZWFyY2hlcyBpbiBwYXJhbGxlbFxuICBxdWVzdGlvbnMuZm9yRWFjaCgocSwgaSkgPT4gc2VhcmNoRm9yUXVlc3Rpb24ocSwgaSkpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgUmVuZGVyIHF1ZXN0aW9uIGJsb2NrIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiByZW5kZXJRdWVzdGlvbkJsb2NrKHF1ZXN0aW9uLCBpZHgpIHtcbiAgcmV0dXJuIGBcbiAgICA8ZGl2IGNsYXNzPVwic2MtcXVlc3Rpb24tYmxvY2tcIiBpZD1cInNjLWJsb2NrLSR7aWR4fVwiIGRhdGEtcXVlc3Rpb249XCIke2VzY2FwZUh0bWwocXVlc3Rpb24pfVwiPlxuICAgICAgPGRpdiBjbGFzcz1cInNjLXF1ZXN0aW9uLWhlYWRlclwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInNjLXF1ZXN0aW9uLW51bVwiPiR7aWR4ICsgMX08L3NwYW4+XG4gICAgICAgIDxzcGFuPiR7ZXNjYXBlSHRtbChxdWVzdGlvbil9PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwic2MtcXVlc3Rpb24tYm9keVwiPlxuICAgICAgICA8ZGl2IGlkPVwic2MtcHJpb3ItJHtpZHh9XCI+PGVtIHN0eWxlPVwiY29sb3I6Izk0YTNiODtmb250LXNpemU6MC44N2VtO1wiPlNlYXJjaGluZyByZXNwb25zZSBsaWJyYXJ5XHUyMDI2PC9lbT48L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cInNjLWV4cC0ke2lkeH1cIj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNjLWZvcm1hdC1yb3dcIiBpZD1cInNjLWZtdC0ke2lkeH1cIj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOiMzNzQxNTE7YWxpZ24tc2VsZjpjZW50ZXI7XCI+Rm9ybWF0Ojwvc3Bhbj5cbiAgICAgICAgICAke1snZGlyZWN0Jywnc3RhcicsJ3RlY2huaWNhbCddLm1hcChmID0+IGBcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzYy1mb3JtYXQtYnRuJHtmID09PSAnZGlyZWN0JyA/ICcgYWN0aXZlJyA6ICcnfVwiIGRhdGEtZm10PVwiJHtmfVwiIG9uY2xpY2s9XCJzZWxlY3RGb3JtYXQoJHtpZHh9LCcke2Z9Jyx0aGlzKVwiPiR7X2ZtdExhYmVsKGYpfTwvYnV0dG9uPmApLmpvaW4oJycpfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1wcmltYXJ5XCIgaWQ9XCJzYy1nZW4tYnRuLSR7aWR4fVwiIG9uY2xpY2s9XCJnZW5lcmF0ZVNjcmVlbmluZ1Jlc3BvbnNlKCR7aWR4fSlcIj5cdTI3MjggR2VuZXJhdGUgRHJhZnQ8L2J1dHRvbj5cbiAgICAgICAgPGRpdiBpZD1cInNjLXJlc3VsdC0ke2lkeH1cIiBzdHlsZT1cIm1hcmdpbi10b3A6MTJweDtcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNjLXRvcGljLXJvd1wiIGlkPVwic2MtdG9waWMtcm93LSR7aWR4fVwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJzYy10b3BpYy0ke2lkeH1cIj5Ub3BpYyB0YWc6PC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJzYy10b3BpYy1pbnB1dFwiIGlkPVwic2MtdG9waWMtJHtpZHh9XCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cImUuZy4gbGVhZGVyc2hpcCwgY3Jvc3MtZnVuY3Rpb25hbCwgZGVhZGxpbmUtbWFuYWdlbWVudFwiPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PmA7XG59XG5cbmZ1bmN0aW9uIF9mbXRMYWJlbChmbXQpIHtcbiAgcmV0dXJuIHsgZGlyZWN0OiAnRGlyZWN0L0NvbmNpc2UgKDE1MFx1MjAxMzIwMHcpJywgc3RhcjogJ1NUQVIgKDI1MFx1MjAxMzM1MHcpJywgdGVjaG5pY2FsOiAnVGVjaG5pY2FsIERldGFpbCAoNDAwXHUyMDEzNTAwdyknIH1bZm10XSB8fCBmbXQ7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBGb3JtYXQgc2VsZWN0aW9uIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBzZWxlY3RGb3JtYXQoaWR4LCBmbXQsIGJ0bikge1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGAjc2MtZm10LSR7aWR4fSAuc2MtZm9ybWF0LWJ0bmApLmZvckVhY2goYiA9PiBiLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpKTtcbiAgYnRuLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICBpZiAoIV9zY3JlZW5pbmdTdGF0ZVtpZHhdKSBfc2NyZWVuaW5nU3RhdGVbaWR4XSA9IHt9O1xuICBfc2NyZWVuaW5nU3RhdGVbaWR4XS5mb3JtYXQgPSBmbXQ7XG59XG5cbmZ1bmN0aW9uIF9nZXRTZWxlY3RlZEZvcm1hdChpZHgpIHtcbiAgY29uc3QgYWN0aXZlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgI3NjLWZtdC0ke2lkeH0gLnNjLWZvcm1hdC1idG4uYWN0aXZlYCk7XG4gIHJldHVybiBhY3RpdmUgPyBhY3RpdmUuZ2V0QXR0cmlidXRlKCdkYXRhLWZtdCcpIDogJ2RpcmVjdCc7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBTZWFyY2ggZm9yIHByaW9yIHJlc3BvbnNlcyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gc2VhcmNoRm9yUXVlc3Rpb24ocXVlc3Rpb24sIGlkeCkge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9zY3JlZW5pbmcvc2VhcmNoJywge1xuICAgICAgbWV0aG9kOiAgJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiAgICBKU09OLnN0cmluZ2lmeSh7IHF1ZXN0aW9uIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmICghZGF0YS5vaykgeyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc2MtcHJpb3ItJHtpZHh9YCkuaW5uZXJIVE1MID0gJyc7IHJldHVybjsgfVxuXG4gICAgLy8gUmVuZGVyIHByaW9yIG1hdGNoXG4gICAgY29uc3QgcHJpb3JFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzYy1wcmlvci0ke2lkeH1gKTtcbiAgICBpZiAoZGF0YS5wcmlvcikge1xuICAgICAgY29uc3QgcCA9IGRhdGEucHJpb3I7XG4gICAgICBwcmlvckVsLmlubmVySFRNTCA9IGBcbiAgICAgICAgPGRpdiBjbGFzcz1cInNjLXByaW9yLW1hdGNoXCI+XG4gICAgICAgICAgPHN0cm9uZz5cdUQ4M0RcdURDREEgU2ltaWxhciBwcmlvciByZXNwb25zZSBmb3VuZDwvc3Ryb25nPiBcdTIwMTQgJHtlc2NhcGVIdG1sKHAuY29tcGFueSB8fCAnJyl9ICgke2VzY2FwZUh0bWwocC5kYXRlIHx8ICcnKX0pPGJyPlxuICAgICAgICAgIDxlbSBzdHlsZT1cImNvbG9yOiM3ODM1MGY7XCI+XCIke2VzY2FwZUh0bWwoKHAucXVlc3Rpb24gfHwgJycpLnN1YnN0cmluZygwLCAxMjApKX1cdTIwMjZcIjwvZW0+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6NnB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtcIj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwic2MtdXNlLXByaW9yLSR7aWR4fVwiIG9uY2hhbmdlPVwidG9nZ2xlUHJpb3JVc2UoJHtpZHh9KVwiPiBVc2UgYXMgc3RhcnRpbmcgcG9pbnRcbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PmA7XG4gICAgICBpZiAoIV9zY3JlZW5pbmdTdGF0ZVtpZHhdKSBfc2NyZWVuaW5nU3RhdGVbaWR4XSA9IHt9O1xuICAgICAgX3NjcmVlbmluZ1N0YXRlW2lkeF0ucHJpb3JSZXNwb25zZSA9IHAucmVzcG9uc2VfdGV4dCB8fCAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgcHJpb3JFbC5pbm5lckhUTUwgPSAnJztcbiAgICB9XG5cbiAgICAvLyBSZW5kZXIgZXhwZXJpZW5jZSBjYXJkc1xuICAgIGNvbnN0IGV4cEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNjLWV4cC0ke2lkeH1gKTtcbiAgICBpZiAoZGF0YS5leHBlcmllbmNlcyAmJiBkYXRhLmV4cGVyaWVuY2VzLmxlbmd0aCkge1xuICAgICAgY29uc3QgY2FyZHMgPSBkYXRhLmV4cGVyaWVuY2VzLm1hcChlID0+IGBcbiAgICAgICAgPGxhYmVsIGNsYXNzPVwic2MtZXhwLWNhcmRcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1pZHg9XCIke2UuaWR4fVwiIGNoZWNrZWQgb25jaGFuZ2U9XCJ1cGRhdGVFeHBTZWxlY3Rpb24oJHtpZHh9KVwiPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmbGV4OjE7XCI+XG4gICAgICAgICAgICA8c3Ryb25nPiR7ZXNjYXBlSHRtbChlLnRpdGxlKX08L3N0cm9uZz4gXHUwMEI3ICR7ZXNjYXBlSHRtbChlLmNvbXBhbnkpfVxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYy1zY29yZS1iYWRnZVwiPiR7TWF0aC5yb3VuZChlLnNjb3JlICogMTAwKX0lIG1hdGNoPC9zcGFuPlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImNvbG9yOiM2NDc0OGI7bWFyZ2luLXRvcDoycHg7XCI+JHtlc2NhcGVIdG1sKGUuc3VtbWFyeSl9PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbGFiZWw+YCkuam9pbignJyk7XG4gICAgICBleHBFbC5pbm5lckhUTUwgPSBgPHAgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjojMzc0MTUxO21hcmdpbi1ib3R0b206NnB4O1wiPlJlbGV2YW50IGV4cGVyaWVuY2U6PC9wPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2MtZXhwLWxpc3RcIj4ke2NhcmRzfTwvZGl2PmA7XG4gICAgICBpZiAoIV9zY3JlZW5pbmdTdGF0ZVtpZHhdKSBfc2NyZWVuaW5nU3RhdGVbaWR4XSA9IHt9O1xuICAgICAgX3NjcmVlbmluZ1N0YXRlW2lkeF0uZXhwZXJpZW5jZUluZGljZXMgPSBkYXRhLmV4cGVyaWVuY2VzLm1hcChlID0+IGUuaWR4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXhwRWwuaW5uZXJIVE1MID0gJyc7XG4gICAgfVxuICB9IGNhdGNoIChfKSB7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNjLXByaW9yLSR7aWR4fWApLmlubmVySFRNTCA9ICcnO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBUb2dnbGUgcHJpb3IgdXNlIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiB0b2dnbGVQcmlvclVzZShpZHgpIHtcbiAgY29uc3QgY2IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc2MtdXNlLXByaW9yLSR7aWR4fWApO1xuICBpZiAoIV9zY3JlZW5pbmdTdGF0ZVtpZHhdKSBfc2NyZWVuaW5nU3RhdGVbaWR4XSA9IHt9O1xuICBfc2NyZWVuaW5nU3RhdGVbaWR4XS51c2VQcmlvciA9IGNiPy5jaGVja2VkID8/IGZhbHNlO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVFeHBTZWxlY3Rpb24oaWR4KSB7XG4gIGNvbnN0IGJsb2NrICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzYy1ibG9jay0ke2lkeH1gKTtcbiAgY29uc3QgY2hlY2tlZCAgID0gQXJyYXkuZnJvbShibG9jay5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFt0eXBlPWNoZWNrYm94XVtkYXRhLWlkeF0nKSlcbiAgICAuZmlsdGVyKGNiID0+IGNiLmNoZWNrZWQpXG4gICAgLm1hcChjYiA9PiBwYXJzZUludChjYi5nZXRBdHRyaWJ1dGUoJ2RhdGEtaWR4JyksIDEwKSk7XG4gIGlmICghX3NjcmVlbmluZ1N0YXRlW2lkeF0pIF9zY3JlZW5pbmdTdGF0ZVtpZHhdID0ge307XG4gIF9zY3JlZW5pbmdTdGF0ZVtpZHhdLmV4cGVyaWVuY2VJbmRpY2VzID0gY2hlY2tlZDtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEdlbmVyYXRlIHNjcmVlbmluZyByZXNwb25zZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVTY3JlZW5pbmdSZXNwb25zZShpZHgpIHtcbiAgLyogZHVja2Zsb3c6XG4gICAqICAgaWQ6IHNjcmVlbmluZ191aV9nZW5lcmF0ZV9saXZlXG4gICAqICAga2luZDogdWlcbiAgICogICB0aW1lc3RhbXA6ICcyMDI2LTAzLTI1VDIxOjM5OjQ4WidcbiAgICogICBzdGF0dXM6IGxpdmVcbiAgICogICBoYW5kbGVzOlxuICAgKiAgIC0gdWk6c2NyZWVuaW5nLmdlbmVyYXRlLXJlc3BvbnNlXG4gICAqICAgY2FsbHM6XG4gICAqICAgLSBQT1NUIC9hcGkvc2NyZWVuaW5nL2dlbmVyYXRlXG4gICAqICAgcmVhZHM6XG4gICAqICAgLSBkb206c2MtcXVlc3Rpb24tYmxvY2sucXVlc3Rpb25cbiAgICogICAtIHdpbmRvdzpfc2NyZWVuaW5nU3RhdGUuZm9ybWF0XG4gICAqICAgLSB3aW5kb3c6X3NjcmVlbmluZ1N0YXRlLnByaW9yUmVzcG9uc2VcbiAgICogICAtIHdpbmRvdzpfc2NyZWVuaW5nU3RhdGUuZXhwZXJpZW5jZUluZGljZXNcbiAgICogICB3cml0ZXM6XG4gICAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9zY3JlZW5pbmcvZ2VuZXJhdGUucXVlc3Rpb25cbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL3NjcmVlbmluZy9nZW5lcmF0ZS5mb3JtYXRcbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL3NjcmVlbmluZy9nZW5lcmF0ZS5leHBlcmllbmNlX2luZGljZXNcbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL3NjcmVlbmluZy9nZW5lcmF0ZS5wcmlvcl9yZXNwb25zZVxuICAgKiAgIC0gd2luZG93Ol9zY3JlZW5pbmdTdGF0ZS5yZXNwb25zZVRleHRcbiAgICogICAtIHdpbmRvdzpfc2NyZWVuaW5nU3RhdGUuZm9ybWF0XG4gICAqICAgbm90ZXM6IEdlbmVyYXRlcyBhIHNpbmdsZSBzY3JlZW5pbmcgcmVzcG9uc2UgZnJvbSB0aGUgc2VsZWN0ZWQgZm9ybWF0LCBwcmlvci1yZXNwb25zZSBzZWVkLCBhbmQgY2hvc2VuIGV4cGVyaWVuY2UgZXZpZGVuY2UsIHRoZW4gc3RvcmVzIHRoZSBkcmFmdCBiYWNrIGludG8gVUkgc3RhdGUgZm9yIGVkaXRpbmcuXG4gICAqL1xuICBjb25zdCBidG4gICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzYy1nZW4tYnRuLSR7aWR4fWApO1xuICBpZiAoYnRuKSB7IGJ0bi5kaXNhYmxlZCA9IHRydWU7IGJ0bi50ZXh0Q29udGVudCA9ICdcdTIzRjMgR2VuZXJhdGluZ1x1MjAyNic7IH1cblxuICBjb25zdCBxdWVzdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzYy1ibG9jay0ke2lkeH1gKT8uZGF0YXNldC5xdWVzdGlvbiB8fCAnJztcbiAgY29uc3Qgc3RhdGUgICAgPSBfc2NyZWVuaW5nU3RhdGVbaWR4XSB8fCB7fTtcbiAgY29uc3QgZm10ICAgICAgPSBfZ2V0U2VsZWN0ZWRGb3JtYXQoaWR4KTtcbiAgY29uc3QgcHJpb3IgICAgPSAoc3RhdGUudXNlUHJpb3IgJiYgc3RhdGUucHJpb3JSZXNwb25zZSkgPyBzdGF0ZS5wcmlvclJlc3BvbnNlIDogJyc7XG4gIGNvbnN0IGV4cElkeCAgID0gc3RhdGUuZXhwZXJpZW5jZUluZGljZXMgPz8gW107XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvc2NyZWVuaW5nL2dlbmVyYXRlJywge1xuICAgICAgbWV0aG9kOiAgJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIHF1ZXN0aW9uLFxuICAgICAgICBmb3JtYXQ6ICAgICAgICAgICAgICBmbXQsXG4gICAgICAgIGV4cGVyaWVuY2VfaW5kaWNlczogIGV4cElkeCxcbiAgICAgICAgcHJpb3JfcmVzcG9uc2U6ICAgICAgcHJpb3IsXG4gICAgICB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoIWRhdGEub2spIHsgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsIGRhdGEuZXJyb3IgfHwgJ0dlbmVyYXRpb24gZmFpbGVkLicpOyByZXR1cm47IH1cblxuICAgIGlmICghX3NjcmVlbmluZ1N0YXRlW2lkeF0pIF9zY3JlZW5pbmdTdGF0ZVtpZHhdID0ge307XG4gICAgX3NjcmVlbmluZ1N0YXRlW2lkeF0ucmVzcG9uc2VUZXh0ID0gZGF0YS50ZXh0O1xuICAgIF9zY3JlZW5pbmdTdGF0ZVtpZHhdLmZvcm1hdCAgICAgICA9IGZtdDtcblxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzYy1yZXN1bHQtJHtpZHh9YCkuaW5uZXJIVE1MID0gYFxuICAgICAgPHRleHRhcmVhIGNsYXNzPVwic2MtcmVzcG9uc2UtdGV4dGFyZWFcIiBpZD1cInNjLXRleHQtJHtpZHh9XCIgcm93cz1cIjdcIlxuICAgICAgICBvbmlucHV0PVwiX3NjcmVlbmluZ1N0YXRlWyR7aWR4fV0gPSBfc2NyZWVuaW5nU3RhdGVbJHtpZHh9XSB8fCB7fTsgX3NjcmVlbmluZ1N0YXRlWyR7aWR4fV0ucmVzcG9uc2VUZXh0ID0gdGhpcy52YWx1ZTtcIlxuICAgICAgPiR7ZXNjYXBlSHRtbChkYXRhLnRleHQpfTwvdGV4dGFyZWE+YDtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc2MtdG9waWMtcm93LSR7aWR4fWApLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIGNvbnRhY3Qgc2VydmVyLicpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChidG4pIHsgYnRuLmRpc2FibGVkID0gZmFsc2U7IGJ0bi50ZXh0Q29udGVudCA9ICdcdTI3MjggR2VuZXJhdGUgRHJhZnQnOyB9XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIFNhdmUgcmVzcG9uc2VzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBzYXZlU2NyZWVuaW5nUmVzcG9uc2VzKCkge1xuICAvKiBkdWNrZmxvdzpcbiAgICogICBpZDogc2NyZWVuaW5nX3VpX3NhdmVfbGl2ZVxuICAgKiAgIGtpbmQ6IHVpXG4gICAqICAgdGltZXN0YW1wOiAnMjAyNi0wMy0yNVQyMTozOTo0OFonXG4gICAqICAgc3RhdHVzOiBsaXZlXG4gICAqICAgaGFuZGxlczpcbiAgICogICAtIHVpOnNjcmVlbmluZy5zYXZlLWFsbFxuICAgKiAgIGNhbGxzOlxuICAgKiAgIC0gUE9TVCAvYXBpL3NjcmVlbmluZy9zYXZlXG4gICAqICAgcmVhZHM6XG4gICAqICAgLSB3aW5kb3c6X3NjcmVlbmluZ1N0YXRlXG4gICAqICAgLSBkb206LnNjLXF1ZXN0aW9uLWJsb2NrXG4gICAqICAgLSBkb206I3NjLXRleHQtKi52YWx1ZVxuICAgKiAgIC0gZG9tOiNzYy10b3BpYy0qLnZhbHVlXG4gICAqICAgd3JpdGVzOlxuICAgKiAgIC0gcmVxdWVzdDpQT1NUIC9hcGkvc2NyZWVuaW5nL3NhdmUucmVzcG9uc2VzXG4gICAqICAgbm90ZXM6IEFnZ3JlZ2F0ZXMgdGhlIGVkaXRlZCBzY3JlZW5pbmcgcmVzcG9uc2VzIGFuZCB0b3BpYyB0YWdzIGZyb20gdGhlIFVJIGludG8gdGhlIHN0cnVjdHVyZWQgcGF5bG9hZCB0aGF0IGJhY2tlbmQgc3RhdGUsIG1ldGFkYXRhLCBhcmNoaXZlIERPQ1gsIGFuZCB0aGUgcmVzcG9uc2UgbGlicmFyeSBhbGwgcGVyc2lzdC5cbiAgICovXG4gIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzYy1zYXZlLWJ0bicpO1xuICBpZiAoYnRuKSB7IGJ0bi5kaXNhYmxlZCA9IHRydWU7IGJ0bi50ZXh0Q29udGVudCA9ICdcdTIzRjMgU2F2aW5nXHUyMDI2JzsgfVxuXG4gIGNvbnN0IHJlc3BvbnNlcyA9IFtdO1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2MtcXVlc3Rpb24tYmxvY2snKS5mb3JFYWNoKChibG9jaywgaSkgPT4ge1xuICAgIGNvbnN0IHFFbCAgICA9IGJsb2NrLnF1ZXJ5U2VsZWN0b3IoJy5zYy1xdWVzdGlvbi1oZWFkZXIgc3BhbjpsYXN0LWNoaWxkJyk7XG4gICAgY29uc3QgdGV4dEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNjLXRleHQtJHtpfWApO1xuICAgIGNvbnN0IHRvcGljRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc2MtdG9waWMtJHtpfWApO1xuICAgIGlmICghdGV4dEVsKSByZXR1cm47IC8vIG5vdCB5ZXQgZ2VuZXJhdGVkIFx1MjAxNCBza2lwXG5cbiAgICBjb25zdCBxdWVzdGlvbiAgICAgPSBxRWwgPyBxRWwudGV4dENvbnRlbnQudHJpbSgpIDogJyc7XG4gICAgY29uc3QgcmVzcG9uc2VUZXh0ID0gKF9zY3JlZW5pbmdTdGF0ZVtpXT8ucmVzcG9uc2VUZXh0KSB8fCB0ZXh0RWwudmFsdWUgfHwgJyc7XG4gICAgY29uc3QgZm10ICAgICAgICAgID0gX2dldFNlbGVjdGVkRm9ybWF0KGkpO1xuICAgIGNvbnN0IHRvcGljVGFnICAgICA9IHRvcGljRWwgPyB0b3BpY0VsLnZhbHVlLnRyaW0oKSA6ICcnO1xuXG4gICAgcmVzcG9uc2VzLnB1c2goeyBxdWVzdGlvbiwgdG9waWNfdGFnOiB0b3BpY1RhZywgZm9ybWF0OiBmbXQsIHJlc3BvbnNlX3RleHQ6IHJlc3BvbnNlVGV4dCB9KTtcbiAgfSk7XG5cbiAgaWYgKCFyZXNwb25zZXMubGVuZ3RoKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjZBMFx1RkUwRiBOb3RoaW5nIHRvIFNhdmUnLCAnUGxlYXNlIGdlbmVyYXRlIGF0IGxlYXN0IG9uZSByZXNwb25zZSBiZWZvcmUgc2F2aW5nLicpO1xuICAgIGlmIChidG4pIHsgYnRuLmRpc2FibGVkID0gZmFsc2U7IGJ0bi50ZXh0Q29udGVudCA9ICdcdUQ4M0RcdURDQkUgU2F2ZSBBbGwgUmVzcG9uc2VzJzsgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL3NjcmVlbmluZy9zYXZlJywge1xuICAgICAgbWV0aG9kOiAgJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiAgICBKU09OLnN0cmluZ2lmeSh7IHJlc3BvbnNlcyB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjcwNSBTYXZlZCcsIGAke2RhdGEuY291bnR9IHJlc3BvbnNlJHtkYXRhLmNvdW50ICE9PSAxID8gJ3MnIDogJyd9IHNhdmVkIGFzIDxzdHJvbmc+JHtlc2NhcGVIdG1sKGRhdGEuZmlsZW5hbWUpfTwvc3Ryb25nPiBhbmQgYWRkZWQgdG8geW91ciByZXNwb25zZSBsaWJyYXJ5LmApO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIFNhdmUgRmFpbGVkJywgZGF0YS5lcnJvciB8fCAnQ291bGQgbm90IHNhdmUgcmVzcG9uc2VzLicpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIGNvbnRhY3Qgc2VydmVyLicpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChidG4pIHsgYnRuLmRpc2FibGVkID0gZmFsc2U7IGJ0bi50ZXh0Q29udGVudCA9ICdcdUQ4M0RcdURDQkUgU2F2ZSBBbGwgUmVzcG9uc2VzJzsgfVxuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFeHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5leHBvcnQge1xuICBfc2NyZWVuaW5nU3RhdGUsXG4gIF9zY3JlZW5pbmdJbnB1dFRleHQsXG4gIF9yZXNldFNjcmVlbmluZ0lucHV0VGV4dCxcbiAgcG9wdWxhdGVTY3JlZW5pbmdUYWIsXG4gIHBhcnNlU2NyZWVuaW5nUXVlc3Rpb25zLFxuICByZW5kZXJRdWVzdGlvbkJsb2NrLFxuICBfZm10TGFiZWwsXG4gIHNlbGVjdEZvcm1hdCxcbiAgX2dldFNlbGVjdGVkRm9ybWF0LFxuICBzZWFyY2hGb3JRdWVzdGlvbixcbiAgdG9nZ2xlUHJpb3JVc2UsXG4gIHVwZGF0ZUV4cFNlbGVjdGlvbixcbiAgZ2VuZXJhdGVTY3JlZW5pbmdSZXNwb25zZSxcbiAgc2F2ZVNjcmVlbmluZ1Jlc3BvbnNlcyxcbn07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9maW5hbGlzZS5qc1xuICogRmluYWxpc2UgJiBhcmNoaXZlIHRhYjogZmluYWxpc2UgYXBwbGljYXRpb24sIGhhcnZlc3QgY2FuZGlkYXRlcyxcbiAqIGFwcGx5IHNlbGVjdGVkIHVwZGF0ZXMgdG8gbWFzdGVyIENWIGRhdGEuXG4gKlxuICogRGVwZW5kZW5jaWVzIChyZXNvbHZlZCB0aHJvdWdoIGdsb2JhbFRoaXMgYXQgcnVudGltZSk6XG4gKiAgIGVzY2FwZUh0bWwsIF9yZW5kZXJDb25zaXN0ZW5jeVJlcG9ydFxuICovXG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IGZvcm1hdEF0c1Njb3JlU3VtbWFyeSB9IGZyb20gJy4vYXRzLXJlZmluZW1lbnQuanMnO1xuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdmaW5hbGlzZScpO1xuXG5mdW5jdGlvbiBfZm9ybWF0RHVyYXRpb24oc2Vjcykge1xuICBpZiAoc2VjcyA9PSBudWxsIHx8IHNlY3MgPCAwKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgaCA9IE1hdGguZmxvb3Ioc2VjcyAvIDM2MDApO1xuICBjb25zdCBtID0gTWF0aC5mbG9vcigoc2VjcyAlIDM2MDApIC8gNjApO1xuICBjb25zdCBzID0gc2VjcyAlIDYwO1xuICBpZiAoaCA+IDApIHJldHVybiBgJHtofWggJHttfW1gO1xuICBpZiAobSA+IDApIHJldHVybiBgJHttfW0gJHtzfXNgO1xuICByZXR1cm4gYCR7c31zYDtcbn1cblxuZnVuY3Rpb24gX3JlbmRlckZpbmFsaXNlQXRzSXRlbXMoc2NvcmUsIGF0c0tleXdvcmRzKSB7XG4gIGlmICghc2NvcmUgfHwgdHlwZW9mIHNjb3JlLm92ZXJhbGwgIT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGA8bGk+QVRTIGtleXdvcmRzIHRyYWNrZWQ6ICR7YXRzS2V5d29yZHMubGVuZ3RofTwvbGk+YDtcbiAgfVxuXG4gIGNvbnN0IHN1bW1hcnkgPSBmb3JtYXRBdHNTY29yZVN1bW1hcnkoc2NvcmUpO1xuICBjb25zdCBoYXJkU2NvcmUgPSB0eXBlb2Ygc2NvcmUuaGFyZF9yZXF1aXJlbWVudF9zY29yZSA9PT0gJ251bWJlcidcbiAgICA/IGAke01hdGgucm91bmQoc2NvcmUuaGFyZF9yZXF1aXJlbWVudF9zY29yZSl9JWBcbiAgICA6ICduL2EnO1xuICBjb25zdCBzb2Z0U2NvcmUgPSB0eXBlb2Ygc2NvcmUuc29mdF9yZXF1aXJlbWVudF9zY29yZSA9PT0gJ251bWJlcidcbiAgICA/IGAke01hdGgucm91bmQoc2NvcmUuc29mdF9yZXF1aXJlbWVudF9zY29yZSl9JWBcbiAgICA6ICduL2EnO1xuXG4gIHJldHVybiBbXG4gICAgYDxsaT5BVFMgc2NvcmU6IDxzdHJvbmc+JHtzdW1tYXJ5Lm92ZXJhbGx9JTwvc3Ryb25nPiA8c3BhbiBzdHlsZT1cImNvbG9yOiM0NzU1Njk7XCI+KGhhcmQgJHtoYXJkU2NvcmV9IFx1MjAyMiBzb2Z0ICR7c29mdFNjb3JlfSk8L3NwYW4+PC9saT5gLFxuICAgIGA8bGk+QVRTIGNvdmVyYWdlOiAke2VzY2FwZUh0bWwoc3VtbWFyeS5saW5lKX08L2xpPmAsXG4gICAgYDxsaT5BVFMgZGV0YWlsOiAke2VzY2FwZUh0bWwoc3VtbWFyeS5kZXRhaWwpfTwvbGk+YCxcbiAgXS5qb2luKCcnKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFBvcHVsYXRlIGZpbmFsaXNlIHRhYiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gcG9wdWxhdGVGaW5hbGlzZVRhYigpIHtcbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG5cbiAgLy8gRmV0Y2ggY3VycmVudCBzdGF0dXMgdG8gZ2V0IGdlbmVyYXRlZCBmaWxlcyBhbmQgam9iIGFuYWx5c2lzIGZvciBjb25zaXN0ZW5jeSBjaGVja1xuICBsZXQgZ2VuZXJhdGVkICA9IG51bGw7XG4gIGxldCBzdGF0dXNEYXRhID0gbnVsbDtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvc3RhdHVzJyk7XG4gICAgc3RhdHVzRGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgZ2VuZXJhdGVkICA9IHN0YXR1c0RhdGEuZ2VuZXJhdGVkX2ZpbGVzIHx8IG51bGw7XG4gIH0gY2F0Y2ggKGVycikgeyBsb2cud2FybignRmFpbGVkIHRvIGZldGNoIHN0YXR1cyBmb3IgZmluYWxpc2UgdGFiOicsIGVycik7IH1cblxuICBpZiAoIWdlbmVyYXRlZCB8fCAhZ2VuZXJhdGVkLm91dHB1dF9kaXIpIHtcbiAgICBjb250ZW50LmlubmVySFRNTCA9IGBcbiAgICAgIDxoMT5cdTI3MDUgRmluYWxpc2UgQXBwbGljYXRpb248L2gxPlxuICAgICAgPGRpdiBjbGFzcz1cImVtcHR5LXN0YXRlXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpY29uXCI+XHVEODNEXHVEQ0MyPC9kaXY+XG4gICAgICAgIDxoMz5ObyBDViBHZW5lcmF0ZWQgWWV0PC9oMz5cbiAgICAgICAgPHA+UGxlYXNlIGdlbmVyYXRlIGEgQ1YgZmlyc3QgYmVmb3JlIGZpbmFsaXNpbmcuPC9wPlxuICAgICAgPC9kaXY+YDtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBmaWxlcyA9IGdlbmVyYXRlZC5maWxlcyB8fCBbXTtcblxuICBsZXQgaHRtbCA9IGBcbiAgICA8aDE+XHUyNzA1IEZpbmFsaXNlIEFwcGxpY2F0aW9uPC9oMT5cbiAgICA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7bWFyZ2luLWJvdHRvbToyNHB4O1wiPlxuICAgICAgQXJjaGl2ZSB0aGlzIGFwcGxpY2F0aW9uIHRvIHlvdXIgQ1YgaGlzdG9yeSwgdXBkYXRlIHRoZSByZXNwb25zZSBsaWJyYXJ5LCBhbmQgb3B0aW9uYWxseVxuICAgICAgd3JpdGUgYW55IGltcHJvdmVtZW50cyBiYWNrIHRvIE1hc3RlciBDViBEYXRhLlxuICAgIDwvcD5cblxuICAgIDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmMGZkZjQ7Ym9yZGVyOjFweCBzb2xpZCAjYmJmN2QwO2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MTZweDttYXJnaW4tYm90dG9tOjI0cHg7XCI+XG4gICAgICA8aDMgc3R5bGU9XCJtYXJnaW46MCAwIDEwcHg7XCI+XHVEODNEXHVEQ0MyIEdlbmVyYXRlZCBGaWxlczwvaDM+XG4gICAgICA8dWwgc3R5bGU9XCJtYXJnaW46MDtwYWRkaW5nLWxlZnQ6MjBweDtsaW5lLWhlaWdodDoxLjg7XCI+XG4gICAgICAgICR7ZmlsZXMubWFwKGYgPT4gYDxsaT48Y29kZSBzdHlsZT1cImZvbnQtc2l6ZTowLjllbTtcIj4ke2VzY2FwZUh0bWwoZil9PC9jb2RlPjwvbGk+YCkuam9pbignJykgfHwgJzxsaT4obm9uZSk8L2xpPid9XG4gICAgICA8L3VsPlxuICAgICAgPHAgc3R5bGU9XCJtYXJnaW46OHB4IDAgMDtmb250LXNpemU6MC44NWVtO2NvbG9yOiMxNjY1MzQ7XCI+T3V0cHV0IGRpcjogPGNvZGU+JHtlc2NhcGVIdG1sKGdlbmVyYXRlZC5vdXRwdXRfZGlyKX08L2NvZGU+PC9wPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBpZD1cInJlYWRpbmVzcy1jaGVja2xpc3RcIj48L2Rpdj5cbiAgICA8ZGl2IGlkPVwiY29uc2lzdGVuY3ktcmVwb3J0XCI+PC9kaXY+XG4gICAgPGRpdiBpZD1cInJld3JpdGUtYXVkaXQtbG9nXCI+PC9kaXY+XG5cbiAgICA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZmZmO2JvcmRlcjoxcHggc29saWQgI2UyZThmMDtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjIwcHg7bWFyZ2luLWJvdHRvbToyNHB4O1wiPlxuICAgICAgPGgzIHN0eWxlPVwibWFyZ2luOjAgMCAxNnB4O1wiPlx1RDgzRFx1RENDQiBBcHBsaWNhdGlvbiBTdGF0dXM8L2gzPlxuXG4gICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNnB4O1wiPlxuICAgICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjZweDtcIiBmb3I9XCJmaW5hbGlzZS1zdGF0dXNcIj5TdGF0dXM8L2xhYmVsPlxuICAgICAgICA8c2VsZWN0IGlkPVwiZmluYWxpc2Utc3RhdHVzXCIgc3R5bGU9XCJ3aWR0aDoyMjBweDtwYWRkaW5nOjhweCAxMHB4O2JvcmRlcjoxcHggc29saWQgI2NiZDVlMTtib3JkZXItcmFkaXVzOjZweDtmb250LXNpemU6MC45NWVtO1wiPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJkcmFmdFwiPkRyYWZ0IFx1MjAxNCBub3QgeWV0IHNlbnQ8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicmVhZHlcIiBzZWxlY3RlZD5SZWFkeSB0byBzZW5kPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInNlbnRcIj5TZW50PC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImludGVydmlld1wiPkludGVydmlldyBzY2hlZHVsZWQ8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicmVqZWN0ZWRcIj5SZWplY3RlZDwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJhY2NlcHRlZFwiPkFjY2VwdGVkPC9vcHRpb24+XG4gICAgICAgIDwvc2VsZWN0PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjIwcHg7XCI+XG4gICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NnB4O1wiIGZvcj1cImZpbmFsaXNlLW5vdGVzXCI+Tm90ZXM8L2xhYmVsPlxuICAgICAgICA8dGV4dGFyZWEgaWQ9XCJmaW5hbGlzZS1ub3Rlc1wiIHJvd3M9XCI0XCIgbWF4bGVuZ3RoPVwiMjAwMFwiXG4gICAgICAgICAgb25pbnB1dD1cImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaW5hbGlzZS1ub3Rlcy1jb3VudGVyJykudGV4dENvbnRlbnQ9dGhpcy52YWx1ZS5sZW5ndGgrJyAvIDIwMDAnO2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaW5hbGlzZS1ub3Rlcy1jb3VudGVyJykuc3R5bGUuY29sb3I9dGhpcy52YWx1ZS5sZW5ndGg+MTgwMD8nI2RjMjYyNic6dGhpcy52YWx1ZS5sZW5ndGg+MTYwMD8nI2Q5NzcwNic6JyM2YjcyODAnXCJcbiAgICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7cGFkZGluZzoxMHB4O2JvcmRlcjoxcHggc29saWQgI2NiZDVlMTtib3JkZXItcmFkaXVzOjZweDtcbiAgICAgICAgICAgICAgICAgZm9udC1zaXplOjAuOTJlbTtyZXNpemU6dmVydGljYWw7Ym94LXNpemluZzpib3JkZXItYm94O1wiXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJSZWNydWl0ZXIgbmFtZSwgc2FsYXJ5IGluZm8sIGZvbGxvdy11cCBkYXRlLCBpbnRlcnZpZXcgbm90ZXNcdTIwMjZcIj48L3RleHRhcmVhPlxuICAgICAgICA8ZGl2IGlkPVwiZmluYWxpc2Utbm90ZXMtY291bnRlclwiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiIHN0eWxlPVwidGV4dC1hbGlnbjpyaWdodDtmb250LXNpemU6MC44ZW07Y29sb3I6IzZiNzI4MDttYXJnaW4tdG9wOjJweDtcIj4wIC8gMjAwMDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxidXR0b24gaWQ9XCJmaW5hbGlzZS1idG5cIiBvbmNsaWNrPVwiZmluYWxpc2VBcHBsaWNhdGlvbigpXCJcbiAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiMwNTk2Njk7Y29sb3I6I2ZmZjtib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjZweDtcbiAgICAgICAgICAgICAgIHBhZGRpbmc6MTBweCAyNHB4O2ZvbnQtc2l6ZToxZW07Zm9udC13ZWlnaHQ6NjAwO2N1cnNvcjpwb2ludGVyO1wiPlxuICAgICAgICBcdTI3MDUgRmluYWxpc2UgJmFtcDsgQXJjaGl2ZVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGlkPVwiZmluYWxpc2UtcmVzdWx0XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+PC9kaXY+XG4gICAgPGRpdiBpZD1cImhhcnZlc3Qtc2VjdGlvblwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPjwvZGl2PlxuICBgO1xuXG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gaHRtbDtcbiAgX3JlbmRlclJlYWRpbmVzc0NoZWNrbGlzdChmaWxlcywgc3RhdHVzRGF0YSk7XG4gIGlmIChzdGF0dXNEYXRhKSBfcmVuZGVyQ29uc2lzdGVuY3lSZXBvcnQoc3RhdHVzRGF0YSk7XG4gIF9yZW5kZXJSZXdyaXRlQXVkaXRMb2coKTtcbiAgX3Jlc3RvcmVGaW5hbGlzZU1ldGEoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gX3Jlc3RvcmVGaW5hbGlzZU1ldGEoKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvZmluYWxpc2UtbWV0YScpO1xuICAgIGlmICghcmVzLm9rKSByZXR1cm47XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgY29uc3Qgc3RhdHVzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmluYWxpc2Utc3RhdHVzJyk7XG4gICAgY29uc3Qgbm90ZXNFbCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmluYWxpc2Utbm90ZXMnKTtcbiAgICBpZiAoc3RhdHVzRWwgJiYgZGF0YS5hcHBsaWNhdGlvbl9zdGF0dXMpIHN0YXR1c0VsLnZhbHVlID0gZGF0YS5hcHBsaWNhdGlvbl9zdGF0dXM7XG4gICAgaWYgKG5vdGVzRWwgICYmIGRhdGEubm90ZXMpIHtcbiAgICAgIG5vdGVzRWwudmFsdWUgPSBkYXRhLm5vdGVzO1xuICAgICAgY29uc3QgY291bnRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaW5hbGlzZS1ub3Rlcy1jb3VudGVyJyk7XG4gICAgICBpZiAoY291bnRlcikge1xuICAgICAgICBjb25zdCBsZW4gPSBkYXRhLm5vdGVzLmxlbmd0aDtcbiAgICAgICAgY291bnRlci50ZXh0Q29udGVudCA9IGAke2xlbn0gLyAyMDAwYDtcbiAgICAgICAgY291bnRlci5zdHlsZS5jb2xvciA9IGxlbiA+IDE4MDAgPyAnI2RjMjYyNicgOiBsZW4gPiAxNjAwID8gJyNkOTc3MDYnIDogJyM2YjcyODAnO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoXykge31cbn1cblxuLy8gXHUyNTAwXHUyNTAwIFN1Ym1pc3Npb24gcmVhZGluZXNzIGNoZWNrbGlzdCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gX3JlbmRlclJlYWRpbmVzc0NoZWNrbGlzdChmaWxlcywgc3RhdHVzRGF0YSkge1xuICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWFkaW5lc3MtY2hlY2tsaXN0Jyk7XG4gIGlmICghZWwpIHJldHVybjtcblxuICBjb25zdCBmaWxlU2V0ID0gbmV3IFNldCgoZmlsZXMgfHwgW10pLm1hcChmID0+IChmIHx8ICcnKS50b0xvd2VyQ2FzZSgpKSk7XG4gIGNvbnN0IGhhc1BkZiAgPSBbLi4uZmlsZVNldF0uc29tZShmID0+IGYuZW5kc1dpdGgoJy5wZGYnKSAmJiAhZi5pbmNsdWRlcygnY292ZXJsZXR0ZXInKSAmJiAhZi5pbmNsdWRlcygnY292ZXJfbGV0dGVyJykpO1xuICBjb25zdCBoYXNEb2N4ID0gWy4uLmZpbGVTZXRdLnNvbWUoZiA9PiBmLmVuZHNXaXRoKCcuZG9jeCcpICYmICFmLmluY2x1ZGVzKCdjb3ZlcmxldHRlcicpICYmICFmLmluY2x1ZGVzKCdjb3Zlcl9sZXR0ZXInKSAmJiAhZi5pbmNsdWRlcygnc2NyZWVuaW5nJykpO1xuICBjb25zdCBoYXNIdG1sID0gWy4uLmZpbGVTZXRdLnNvbWUoZiA9PiBmLmVuZHNXaXRoKCcuaHRtbCcpKTtcbiAgY29uc3QgaGFzQ2wgICA9IFsuLi5maWxlU2V0XS5zb21lKGYgPT4gZi5pbmNsdWRlcygnY292ZXJsZXR0ZXInKSB8fCBmLmluY2x1ZGVzKCdjb3Zlcl9sZXR0ZXInKSk7XG4gIGNvbnN0IGhhc1NjciAgPSBbLi4uZmlsZVNldF0uc29tZShmID0+IGYuaW5jbHVkZXMoJ3NjcmVlbmluZycpKTtcblxuICBjb25zdCBhdHNDaGVja3MgID0gc3RhdHVzRGF0YT8uYXRzX2NoZWNrcyB8fCBbXTtcbiAgY29uc3QgYXRzRmFpbHMgICA9IChhdHNDaGVja3MpLmZpbHRlcihjID0+IGMuc3RhdHVzID09PSAnZmFpbCcgfHwgYy5zdGF0dXMgPT09ICdlcnJvcicpLmxlbmd0aDtcbiAgY29uc3QgYXRzU2Nhbm5lZCA9IGF0c0NoZWNrcy5sZW5ndGggPiAwO1xuXG4gIGNvbnN0IGxheW91dEZyZXNoID0gc3RhdHVzRGF0YT8ubGF5b3V0X2ZyZXNobmVzcyAhPT0gJ3N0YWxlJztcblxuICBjb25zdCBpdGVtcyA9IFtcbiAgICB7IG9rOiBoYXNQZGYsICAgbGFiZWw6ICdDViBQREYgZ2VuZXJhdGVkJywgICAgICAgIHdhcm46IGZhbHNlIH0sXG4gICAgeyBvazogaGFzRG9jeCwgIGxhYmVsOiAnQ1YgRE9DWCBnZW5lcmF0ZWQnLCAgICAgICB3YXJuOiBmYWxzZSB9LFxuICAgIHsgb2s6IGhhc0h0bWwsICBsYWJlbDogJ0NWIEhUTUwgZ2VuZXJhdGVkJywgICAgICAgd2FybjogZmFsc2UgfSxcbiAgICB7IG9rOiBoYXNDbCwgICAgbGFiZWw6ICdDb3ZlciBsZXR0ZXIgZ2VuZXJhdGVkJywgIHdhcm46IHRydWUgIH0sXG4gICAgeyBvazogaGFzU2NyLCAgIGxhYmVsOiAnU2NyZWVuaW5nIFEmQSBnZW5lcmF0ZWQnLCB3YXJuOiB0cnVlICB9LFxuICAgIHsgb2s6IGF0c1NjYW5uZWQgJiYgYXRzRmFpbHMgPT09IDAsIHdhcm46IHRydWUsXG4gICAgICBsYWJlbDogYXRzU2Nhbm5lZFxuICAgICAgICA/IChhdHNGYWlscyA+IDAgPyBgQVRTIHZhbGlkYXRpb24gXHUyMDE0ICR7YXRzRmFpbHN9IGlzc3VlJHthdHNGYWlscyAhPT0gMSA/ICdzJyA6ICcnfSBmb3VuZGAgOiAnQVRTIHZhbGlkYXRpb24gcGFzc2VkJylcbiAgICAgICAgOiAnQVRTIHZhbGlkYXRpb24gbm90IHlldCBydW4nIH0sXG4gICAgeyBvazogbGF5b3V0RnJlc2gsIHdhcm46IHRydWUsIGxhYmVsOiAnTGF5b3V0IGlzIGN1cnJlbnQgKG5vdCBzdGFsZSknIH0sXG4gIF07XG5cbiAgY29uc3Qgcm93cyA9IGl0ZW1zLm1hcCgoeyBvaywgbGFiZWwsIHdhcm4gfSkgPT4ge1xuICAgIGNvbnN0IGljb24gID0gb2sgPyAnXHUyNzA1JyA6ICh3YXJuID8gJ1x1MjZBMCcgOiAnXHUyNzRDJyk7XG4gICAgY29uc3QgY29sb3IgPSBvayA/ICcjMDY1ZjQ2JyA6ICh3YXJuID8gJyM5MjQwMGUnIDogJyM5OTFiMWInKTtcbiAgICBjb25zdCBiZyAgICA9IG9rID8gJyNmMGZkZjQnIDogKHdhcm4gPyAnI2ZmZmJlYicgOiAnI2ZlZjJmMicpO1xuICAgIHJldHVybiBgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjEwcHg7cGFkZGluZzo4cHggMTJweDtiYWNrZ3JvdW5kOiR7Ymd9O2JvcmRlci1yYWRpdXM6NnB4O21hcmdpbi1ib3R0b206NnB4O1wiPlxuICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCIgc3R5bGU9XCJmb250LXNpemU6MS4xZW07XCI+JHtpY29ufTwvc3Bhbj5cbiAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6JHtjb2xvcn07Zm9udC1zaXplOjAuOTJlbTtcIj4ke2VzY2FwZUh0bWwobGFiZWwpfTwvc3Bhbj5cbiAgICA8L2Rpdj5gO1xuICB9KS5qb2luKCcnKTtcblxuICBjb25zdCBhbGxSZXF1aXJlZCA9IGhhc1BkZiAmJiBoYXNEb2N4ICYmIGhhc0h0bWw7XG4gIGNvbnN0IGhlYWRlckNvbG9yID0gYWxsUmVxdWlyZWQgPyAnIzA2NWY0NicgOiAnIzkyNDAwZSc7XG4gIGVsLmlubmVySFRNTCA9IGBcbiAgICA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZmZmO2JvcmRlcjoxcHggc29saWQgI2UyZThmMDtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjE2cHggMjBweDttYXJnaW4tYm90dG9tOjI0cHg7XCI+XG4gICAgICA8aDMgc3R5bGU9XCJtYXJnaW46MCAwIDEycHg7Y29sb3I6JHtoZWFkZXJDb2xvcn07XCI+XHVEODNEXHVEQ0NCIFN1Ym1pc3Npb24gUmVhZGluZXNzPC9oMz5cbiAgICAgICR7cm93c31cbiAgICAgIDxwIHN0eWxlPVwibWFyZ2luOjEwcHggMCAwO2ZvbnQtc2l6ZTowLjgyZW07Y29sb3I6IzY0NzQ4YjtcIj5cbiAgICAgICAgXHUyNkEwIGl0ZW1zIGFyZSBvcHRpb25hbCBcdTIwMTQgdGhleSB3YXJuIGJ1dCBkbyBub3QgYmxvY2sgYXJjaGl2aW5nLlxuICAgICAgICBcdTI3NEMgaXRlbXMgbXVzdCBiZSByZXNvbHZlZCBiZWZvcmUgc3VibWl0dGluZy5cbiAgICAgIDwvcD5cbiAgICA8L2Rpdj5gO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgUmV3cml0ZSBhdWRpdCBsb2cgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIF9yZW5kZXJSZXdyaXRlQXVkaXRMb2coKSB7XG4gIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jld3JpdGUtYXVkaXQtbG9nJyk7XG4gIGlmICghZWwpIHJldHVybjtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvcmV3cml0ZXMnKTtcbiAgICBpZiAoIXJlcy5vaykgcmV0dXJuO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGNvbnN0IGF1ZGl0ID0gZGF0YS5yZXdyaXRlX2F1ZGl0IHx8IFtdO1xuICAgIGlmIChhdWRpdC5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICBjb25zdCByb3dzID0gYXVkaXQubWFwKGVudHJ5ID0+IHtcbiAgICAgIGNvbnN0IG91dGNvbWUgPSBlbnRyeS5vdXRjb21lIHx8IGVudHJ5LmRlY2lzaW9uIHx8ICdcdTIwMTQnO1xuICAgICAgY29uc3QgaWNvbiA9IG91dGNvbWUgPT09ICdhY2NlcHRlZCcgPyAnXHUyNzA1JyA6IG91dGNvbWUgPT09ICdlZGl0ZWQnID8gJ1x1MjcwRlx1RkUwRicgOiBvdXRjb21lID09PSAncmVqZWN0ZWQnID8gJ1x1Mjc0QycgOiAnXHUyMDE0JztcbiAgICAgIGNvbnN0IG9yaWdpbmFsICA9IGVzY2FwZUh0bWwoKGVudHJ5Lm9yaWdpbmFsX3RleHQgfHwgZW50cnkub3JpZ2luYWwgfHwgJycpLnNsaWNlKDAsIDEyMCkpO1xuICAgICAgY29uc3QgZmluYWwgICAgID0gZXNjYXBlSHRtbCgoZW50cnkuZmluYWxfdGV4dCB8fCBlbnRyeS5yZXdyaXR0ZW4gfHwgZW50cnkuc3VnZ2VzdGVkIHx8ICcnKS5zbGljZSgwLCAxMjApKTtcbiAgICAgIGNvbnN0IGZpZWxkICAgICA9IGVzY2FwZUh0bWwoZW50cnkuZmllbGQgfHwgZW50cnkudHlwZSB8fCAnXHUyMDE0Jyk7XG4gICAgICByZXR1cm4gYDx0cj5cbiAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzo2cHggOHB4O2ZvbnQtc2l6ZTowLjhlbTtjb2xvcjojNmI3MjgwO1wiPiR7ZmllbGR9PC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzo2cHggOHB4O2ZvbnQtc2l6ZTowLjhlbTtjb2xvcjojMzc0MTUxO1wiPiR7b3JpZ2luYWx9JHtvcmlnaW5hbC5sZW5ndGggPT09IDEyMCA/ICdcdTIwMjYnIDogJyd9PC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzo2cHggOHB4O2ZvbnQtc2l6ZTowLjhlbTtjb2xvcjojMzc0MTUxO1wiPiR7ZmluYWx9JHtmaW5hbC5sZW5ndGggPT09IDEyMCA/ICdcdTIwMjYnIDogJyd9PC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzo2cHggOHB4O2ZvbnQtc2l6ZTowLjhlbTt0ZXh0LWFsaWduOmNlbnRlcjtcIj4ke2ljb259ICR7ZXNjYXBlSHRtbChvdXRjb21lKX08L3RkPlxuICAgICAgPC90cj5gO1xuICAgIH0pLmpvaW4oJycpO1xuICAgIGVsLmlubmVySFRNTCA9IGBcbiAgICAgIDxkZXRhaWxzIHN0eWxlPVwibWFyZ2luLWJvdHRvbToyNHB4O1wiPlxuICAgICAgICA8c3VtbWFyeSBzdHlsZT1cImN1cnNvcjpwb2ludGVyO2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MC45NWVtO3BhZGRpbmc6MTBweCAwO2NvbG9yOiMzNzQxNTE7dXNlci1zZWxlY3Q6bm9uZTtcIj5cbiAgICAgICAgICBcdUQ4M0RcdURDQ0IgUmV3cml0ZSBhdWRpdCBsb2cgKCR7YXVkaXQubGVuZ3RofSBkZWNpc2lvbiR7YXVkaXQubGVuZ3RoICE9PSAxID8gJ3MnIDogJyd9KVxuICAgICAgICA8L3N1bW1hcnk+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJvdmVyZmxvdy14OmF1dG87bWFyZ2luLXRvcDoxMHB4O1wiPlxuICAgICAgICAgIDx0YWJsZSBzdHlsZT1cIndpZHRoOjEwMCU7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlO2ZvbnQtc2l6ZTowLjg1ZW07XCI+XG4gICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgIDx0ciBzdHlsZT1cImJhY2tncm91bmQ6I2Y4ZmFmYztib3JkZXItYm90dG9tOjJweCBzb2xpZCAjZTJlOGYwO1wiPlxuICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cInBhZGRpbmc6OHB4O3RleHQtYWxpZ246bGVmdDtjb2xvcjojMzc0MTUxO2ZvbnQtd2VpZ2h0OjYwMDtcIj5GaWVsZDwvdGg+XG4gICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwicGFkZGluZzo4cHg7dGV4dC1hbGlnbjpsZWZ0O2NvbG9yOiMzNzQxNTE7Zm9udC13ZWlnaHQ6NjAwO1wiPk9yaWdpbmFsPC90aD5cbiAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJwYWRkaW5nOjhweDt0ZXh0LWFsaWduOmxlZnQ7Y29sb3I6IzM3NDE1MTtmb250LXdlaWdodDo2MDA7XCI+RmluYWw8L3RoPlxuICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cInBhZGRpbmc6OHB4O3RleHQtYWxpZ246Y2VudGVyO2NvbG9yOiMzNzQxNTE7Zm9udC13ZWlnaHQ6NjAwO1wiPk91dGNvbWU8L3RoPlxuICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICAgIDx0Ym9keT4ke3Jvd3N9PC90Ym9keT5cbiAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGV0YWlscz5gO1xuICB9IGNhdGNoIHsgLyogbm9uLWZhdGFsICovIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIEZpbmFsaXNlIGFwcGxpY2F0aW9uIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBmaW5hbGlzZUFwcGxpY2F0aW9uKCkge1xuICAvKiBkdWNrZmxvdzpcbiAgICogICBpZDogZmluYWxpc2VfdWlfc3VibWl0X2xpdmVcbiAgICogICBraW5kOiB1aVxuICAgKiAgIHRpbWVzdGFtcDogJzIwMjYtMDMtMjVUMjE6Mzk6NDhaJ1xuICAgKiAgIHN0YXR1czogbGl2ZVxuICAgKiAgIGhhbmRsZXM6XG4gICAqICAgLSB1aTpmaW5hbGlzZS5zdWJtaXRcbiAgICogICBjYWxsczpcbiAgICogICAtIFBPU1QgL2FwaS9maW5hbGlzZVxuICAgKiAgIHJlYWRzOlxuICAgKiAgIC0gZG9tOiNmaW5hbGlzZS1zdGF0dXMudmFsdWVcbiAgICogICAtIGRvbTojZmluYWxpc2Utbm90ZXMudmFsdWVcbiAgICogICB3cml0ZXM6XG4gICAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9maW5hbGlzZS5zdGF0dXNcbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL2ZpbmFsaXNlLm5vdGVzXG4gICAqICAgLSBkb206I2ZpbmFsaXNlLXJlc3VsdFxuICAgKiAgIG5vdGVzOiBTdWJtaXRzIGZpbmFsIGFwcGxpY2F0aW9uIHN0YXR1cyBhbmQgbm90ZXMgc28gYmFja2VuZCBtZXRhZGF0YSwgYXJjaGl2ZSBzdGF0ZSwgYW5kIG9wdGlvbmFsIGdpdCBmaW5hbGl6YXRpb24gY2FuIGJlIHdyaXR0ZW4gZnJvbSB0aGUgY3VycmVudCBzZXNzaW9uLlxuICAgKi9cbiAgY29uc3QgYnRuICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbmFsaXNlLWJ0bicpO1xuICBjb25zdCByZXN1bHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmluYWxpc2UtcmVzdWx0Jyk7XG4gIGNvbnN0IHN0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaW5hbGlzZS1zdGF0dXMnKS52YWx1ZTtcbiAgY29uc3Qgbm90ZXMgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbmFsaXNlLW5vdGVzJykudmFsdWU7XG5cbiAgYnRuLmRpc2FibGVkICAgID0gdHJ1ZTtcbiAgYnRuLnRleHRDb250ZW50ID0gJ1x1MjNGMyBGaW5hbGlzaW5nXHUyMDI2JztcbiAgcmVzdWx0LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHJlc3VsdC5pbm5lckhUTUwgICAgID0gJyc7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvZmluYWxpc2UnLCB7XG4gICAgICBtZXRob2Q6ICAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6ICAgIEpTT04uc3RyaW5naWZ5KHsgc3RhdHVzLCBub3RlcyB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcblxuICAgIGlmICghcmVzLm9rIHx8ICFkYXRhLm9rKSB7XG4gICAgICByZXN1bHQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICByZXN1bHQuaW5uZXJIVE1MID0gYDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZWUyZTI7Ym9yZGVyOjFweCBzb2xpZCAjZmNhNWE1O2JvcmRlci1yYWRpdXM6OHB4O1xuICAgICAgICBwYWRkaW5nOjE0cHggMThweDtjb2xvcjojOTkxYjFiO1wiPlxuICAgICAgICA8c3Ryb25nPlx1Mjc0QyBFcnJvcjo8L3N0cm9uZz4gJHtlc2NhcGVIdG1sKGRhdGEuZXJyb3IgfHwgJ0ZpbmFsaXNlIGZhaWxlZCcpfVxuICAgICAgPC9kaXY+YDtcbiAgICAgIGJ0bi5kaXNhYmxlZCAgICA9IGZhbHNlO1xuICAgICAgYnRuLnRleHRDb250ZW50ID0gJ1x1MjcwNSBGaW5hbGlzZSAmIEFyY2hpdmUnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN1bW1hcnkgPSBkYXRhLnN1bW1hcnkgfHwge307XG4gICAgY29uc3QgaGFzaCAgICA9IGRhdGEuY29tbWl0X2hhc2ggPyBgPGNvZGUgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO1wiPiR7ZXNjYXBlSHRtbChkYXRhLmNvbW1pdF9oYXNoKX08L2NvZGU+YCA6ICcobm8gY29tbWl0KSc7XG4gICAgY29uc3QgZ2l0V2FybiA9IGRhdGEuZ2l0X2Vycm9yXG4gICAgICA/IGA8cCBzdHlsZT1cImNvbG9yOiNkOTc3MDY7Zm9udC1zaXplOjAuODdlbTttYXJnaW4tdG9wOjhweDtcIj5cdTI2QTAgR2l0OiAke2VzY2FwZUh0bWwoZGF0YS5naXRfZXJyb3IpfTwvcD5gXG4gICAgICA6ICcnO1xuICAgIGNvbnN0IGFwcHJvdmVkQ291bnQgPSBzdW1tYXJ5LmFwcHJvdmVkX3Jld3JpdGVzID8/IDA7XG4gICAgY29uc3QgYXRzS2V5d29yZHMgICA9IHN1bW1hcnkuYXRzX2tleXdvcmRzIHx8IFtdO1xuICAgIGNvbnN0IGF0c1Njb3JlICAgICAgPSBzdW1tYXJ5LmF0c19zY29yZSB8fCBudWxsO1xuICAgIGNvbnN0IGR1cmF0aW9uU2VjcyAgPSBzdW1tYXJ5LnNlc3Npb25fZHVyYXRpb25fc2VjcztcbiAgICBjb25zdCBkdXJhdGlvblN0ciAgID0gZHVyYXRpb25TZWNzICE9IG51bGwgPyBfZm9ybWF0RHVyYXRpb24oZHVyYXRpb25TZWNzKSA6IG51bGw7XG5cbiAgICByZXN1bHQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgcmVzdWx0LmlubmVySFRNTCA9IGBcbiAgICAgIDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmMGZkZjQ7Ym9yZGVyOjFweCBzb2xpZCAjODZlZmFjO2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MTZweCAyMHB4O21hcmdpbi1ib3R0b206MjBweDtcIj5cbiAgICAgICAgPHN0cm9uZz5cdTI3MDUgQXBwbGljYXRpb24gYXJjaGl2ZWQhPC9zdHJvbmc+XG4gICAgICAgIDx1bCBzdHlsZT1cIm1hcmdpbjo4cHggMCAwO3BhZGRpbmctbGVmdDoyMHB4O2xpbmUtaGVpZ2h0OjEuODtmb250LXNpemU6MC45MmVtO1wiPlxuICAgICAgICAgIDxsaT5TdGF0dXM6IDxzdHJvbmc+JHtlc2NhcGVIdG1sKHN0YXR1cyl9PC9zdHJvbmc+PC9saT5cbiAgICAgICAgICA8bGk+QXBwcm92ZWQgcmV3cml0ZXM6ICR7YXBwcm92ZWRDb3VudH08L2xpPlxuICAgICAgICAgICR7X3JlbmRlckZpbmFsaXNlQXRzSXRlbXMoYXRzU2NvcmUsIGF0c0tleXdvcmRzKX1cbiAgICAgICAgICAke2R1cmF0aW9uU3RyID8gYDxsaT5TZXNzaW9uIGR1cmF0aW9uOiAke2VzY2FwZUh0bWwoZHVyYXRpb25TdHIpfTwvbGk+YCA6ICcnfVxuICAgICAgICAgIDxsaT5HaXQgY29tbWl0OiAke2hhc2h9PC9saT5cbiAgICAgICAgPC91bD5cbiAgICAgICAgJHtnaXRXYXJufVxuICAgICAgPC9kaXY+YDtcblxuICAgIGJ0bi50ZXh0Q29udGVudCA9ICdcdTI3MDUgQXJjaGl2ZWQnO1xuXG4gICAgLy8gU2hvdyBoYXJ2ZXN0IHNlY3Rpb25cbiAgICBhd2FpdCBzaG93SGFydmVzdFNlY3Rpb24oKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmVzdWx0LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgIHJlc3VsdC5pbm5lckhUTUwgPSBgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2ZlZTJlMjtib3JkZXI6MXB4IHNvbGlkICNmY2E1YTU7Ym9yZGVyLXJhZGl1czo4cHg7XG4gICAgICBwYWRkaW5nOjE0cHggMThweDtjb2xvcjojOTkxYjFiO1wiPlxuICAgICAgPHN0cm9uZz5cdTI3NEMgTmV0d29yayBlcnJvcjo8L3N0cm9uZz4gJHtlc2NhcGVIdG1sKGVyci5tZXNzYWdlKX1cbiAgICA8L2Rpdj5gO1xuICAgIGJ0bi5kaXNhYmxlZCAgICA9IGZhbHNlO1xuICAgIGJ0bi50ZXh0Q29udGVudCA9ICdcdTI3MDUgRmluYWxpc2UgJiBBcmNoaXZlJztcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgU2hvdyBoYXJ2ZXN0IHNlY3Rpb24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIHNob3dIYXJ2ZXN0U2VjdGlvbigpIHtcbiAgY29uc3Qgc2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoYXJ2ZXN0LXNlY3Rpb24nKTtcbiAgc2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgc2VjdGlvbi5pbm5lckhUTUwgPSBgXG4gICAgPGgyIHN0eWxlPVwibWFyZ2luLXRvcDowO1wiPlx1RDgzRFx1RENFNSBVcGRhdGUgTWFzdGVyIENWIERhdGE8L2gyPlxuICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDttYXJnaW4tYm90dG9tOjE2cHg7XCI+TG9hZGluZyBpbXByb3ZlbWVudCBjYW5kaWRhdGVzIGZyb20gdGhpcyBzZXNzaW9uXHUyMDI2PC9wPlxuICAgIDxkaXYgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjtwYWRkaW5nOjI0cHg7XCI+PGRpdiBjbGFzcz1cImxvYWRpbmctc3Bpbm5lclwiPjwvZGl2PjwvZGl2PmA7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvaGFydmVzdC9jYW5kaWRhdGVzJyk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG5cbiAgICBpZiAoIWRhdGEub2spIHtcbiAgICAgIHNlY3Rpb24uaW5uZXJIVE1MID0gYFxuICAgICAgICA8aDIgc3R5bGU9XCJtYXJnaW4tdG9wOjA7XCI+XHVEODNEXHVEQ0U1IFVwZGF0ZSBNYXN0ZXIgQ1YgRGF0YTwvaDI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZWUyZTI7Ym9yZGVyOjFweCBzb2xpZCAjZmNhNWE1O2JvcmRlci1yYWRpdXM6OHB4O1xuICAgICAgICAgIHBhZGRpbmc6MTJweCAxNnB4O2NvbG9yOiM5OTFiMWI7XCI+XG4gICAgICAgICAgXHUyNzRDICR7ZXNjYXBlSHRtbChkYXRhLmVycm9yIHx8ICdGYWlsZWQgdG8gbG9hZCBjYW5kaWRhdGVzJyl9XG4gICAgICAgIDwvZGl2PmA7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY2FuZGlkYXRlcyA9IGRhdGEuY2FuZGlkYXRlcyB8fCBbXTtcblxuICAgIGlmIChjYW5kaWRhdGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgc2VjdGlvbi5pbm5lckhUTUwgPSBgXG4gICAgICAgIDxoMiBzdHlsZT1cIm1hcmdpbi10b3A6MDtcIj5cdUQ4M0RcdURDRTUgVXBkYXRlIE1hc3RlciBDViBEYXRhPC9oMj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImVtcHR5LXN0YXRlXCIgc3R5bGU9XCJwYWRkaW5nOjI0cHggMDtcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWNvblwiPlx1RDgzRFx1RENDQjwvZGl2PlxuICAgICAgICAgIDxoMz5ObyBVcGRhdGUgQ2FuZGlkYXRlczwvaDM+XG4gICAgICAgICAgPHA+Tm90aGluZyBmcm9tIHRoaXMgc2Vzc2lvbiB3YXJyYW50cyB3cml0aW5nIGJhY2sgdG8gdGhlIG1hc3RlciBDVi48L3A+XG4gICAgICAgIDwvZGl2PmA7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdHlwZUljb25zID0ge1xuICAgICAgaW1wcm92ZWRfYnVsbGV0OiAgICAnXHUyNzBGXHVGRTBGJyxcbiAgICAgIG5ld19za2lsbDogICAgICAgICAgJ1x1RDgzRFx1REVFMCcsXG4gICAgICBzdW1tYXJ5X3ZhcmlhbnQ6ICAgICdcdUQ4M0RcdURDREQnLFxuICAgICAgc2tpbGxfZ2FwX2NvbmZpcm1lZDonXHUyNzA1JyxcbiAgICB9O1xuXG4gICAgbGV0IGh0bWwgPSBgXG4gICAgICA8aDIgc3R5bGU9XCJtYXJnaW4tdG9wOjA7XCI+XHVEODNEXHVEQ0U1IFVwZGF0ZSBNYXN0ZXIgQ1YgRGF0YTwvaDI+XG4gICAgICA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7bWFyZ2luLWJvdHRvbToxNnB4O1wiPlxuICAgICAgICBTZWxlY3QgaW1wcm92ZW1lbnRzIGZyb20gdGhpcyBzZXNzaW9uIHRvIHdyaXRlIGJhY2sgdG8gPGNvZGU+TWFzdGVyX0NWX0RhdGEuanNvbjwvY29kZT4uXG4gICAgICAgIE5vIGl0ZW1zIGFyZSBwcmUtc2VsZWN0ZWQgXHUyMDE0IGNob29zZSBvbmx5IHdoYXQgeW91IHdhbnQgdG8ga2VlcC5cbiAgICAgIDwvcD5cbiAgICAgIDx0YWJsZSBjbGFzcz1cInJldmlldy10YWJsZVwiIHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNnB4O1wiPlxuICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgPHRyPlxuICAgICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6MzZweDt0ZXh0LWFsaWduOmNlbnRlcjtcIj5JbmNsdWRlPC90aD5cbiAgICAgICAgICAgIDx0aD5UeXBlPC90aD5cbiAgICAgICAgICAgIDx0aD5DaGFuZ2U8L3RoPlxuICAgICAgICAgICAgPHRoPlJhdGlvbmFsZTwvdGg+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgPC90aGVhZD5cbiAgICAgICAgPHRib2R5PmA7XG5cbiAgICBmb3IgKGNvbnN0IGMgb2YgY2FuZGlkYXRlcykge1xuICAgICAgY29uc3QgaWNvbiAgICAgPSB0eXBlSWNvbnNbYy50eXBlXSB8fCAnXHVEODNEXHVEQ0NDJztcbiAgICAgIGNvbnN0IG9yaWdpbmFsID0gYy5vcmlnaW5hbCAmJiBjLm9yaWdpbmFsICE9PSAnKG5vdCBpbiBtYXN0ZXIgZGF0YSknXG4gICAgICAgID8gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC44MmVtO2NvbG9yOiM2YjcyODA7bWFyZ2luLXRvcDo0cHg7bWFyZ2luLWJvdHRvbToycHg7XG4gICAgICAgICAgICAgICB0ZXh0LWRlY29yYXRpb246bGluZS10aHJvdWdoO1wiPiR7ZXNjYXBlSHRtbChjLm9yaWdpbmFsKX08L2Rpdj5gXG4gICAgICAgIDogJyc7XG4gICAgICBodG1sICs9IGBcbiAgICAgICAgPHRyIGlkPVwiaGFydmVzdC1yb3ctJHtlc2NhcGVIdG1sKGMuaWQpfVwiPlxuICAgICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO1wiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiaGFydmVzdC1jaGstJHtlc2NhcGVIdG1sKGMuaWQpfVwiXG4gICAgICAgICAgICAgIGRhdGEtaGFydmVzdC1pZD1cIiR7ZXNjYXBlSHRtbChjLmlkKX1cIiBzdHlsZT1cIndpZHRoOjE2cHg7aGVpZ2h0OjE2cHg7Y3Vyc29yOnBvaW50ZXI7XCI+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICA8c3BhbiB0aXRsZT1cIiR7ZXNjYXBlSHRtbChjLnR5cGUpfVwiPiR7aWNvbn08L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07Y29sb3I6IzQ3NTU2OTttYXJnaW4tbGVmdDo0cHg7XCI+JHtlc2NhcGVIdG1sKGMudHlwZS5yZXBsYWNlKC9fL2csJyAnKSl9PC9zcGFuPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPHRkPlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtd2VpZ2h0OjUwMDtcIj4ke2VzY2FwZUh0bWwoYy5sYWJlbCl9PC9kaXY+XG4gICAgICAgICAgICAke29yaWdpbmFsfVxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjg4ZW07Y29sb3I6IzFlMjkzYjttYXJnaW4tdG9wOjJweDtcIj4ke2VzY2FwZUh0bWwoYy5wcm9wb3NlZCl9PC9kaXY+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8dGQgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2NvbG9yOiM2NDc0OGI7XCI+JHtlc2NhcGVIdG1sKGMucmF0aW9uYWxlKX08L3RkPlxuICAgICAgICA8L3RyPmA7XG4gICAgfVxuXG4gICAgaHRtbCArPSBgXG4gICAgICAgIDwvdGJvZHk+XG4gICAgICA8L3RhYmxlPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6MTJweDthbGlnbi1pdGVtczpjZW50ZXI7XCI+XG4gICAgICAgIDxidXR0b24gb25jbGljaz1cImFwcGx5SGFydmVzdFNlbGVjdGlvbnMoKVwiXG4gICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiMwZWE1ZTk7Y29sb3I6I2ZmZjtib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjZweDtcbiAgICAgICAgICAgICAgICAgcGFkZGluZzoxMHB4IDI0cHg7Zm9udC1zaXplOjFlbTtmb250LXdlaWdodDo2MDA7Y3Vyc29yOnBvaW50ZXI7XCIgaWQ9XCJoYXJ2ZXN0LWFwcGx5LWJ0blwiPlxuICAgICAgICAgIFx1RDgzRFx1RENFNSBBcHBseSBTZWxlY3RlZCBVcGRhdGVzXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIG9uY2xpY2s9XCJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGFydmVzdC1zZWN0aW9uJykuc3R5bGUuZGlzcGxheT0nbm9uZSdcIlxuICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDojZjFmNWY5O2NvbG9yOiM0NzU1Njk7Ym9yZGVyOjFweCBzb2xpZCAjY2JkNWUxO2JvcmRlci1yYWRpdXM6NnB4O1xuICAgICAgICAgICAgICAgICBwYWRkaW5nOjEwcHggMjBweDtmb250LXNpemU6MC45NWVtO2N1cnNvcjpwb2ludGVyO1wiPlxuICAgICAgICAgIFNraXBcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgaWQ9XCJoYXJ2ZXN0LXJlc3VsdFwiIHN0eWxlPVwibWFyZ2luLXRvcDoxNnB4O1wiPjwvZGl2PmA7XG5cbiAgICBzZWN0aW9uLmlubmVySFRNTCA9IGh0bWw7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHNlY3Rpb24uaW5uZXJIVE1MID0gYFxuICAgICAgPGgyIHN0eWxlPVwibWFyZ2luLXRvcDowO1wiPlx1RDgzRFx1RENFNSBVcGRhdGUgTWFzdGVyIENWIERhdGE8L2gyPlxuICAgICAgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2ZlZTJlMjtib3JkZXI6MXB4IHNvbGlkICNmY2E1YTU7Ym9yZGVyLXJhZGl1czo4cHg7XG4gICAgICAgIHBhZGRpbmc6MTJweCAxNnB4O2NvbG9yOiM5OTFiMWI7XCI+XG4gICAgICAgIFx1Mjc0QyBOZXR3b3JrIGVycm9yOiAke2VzY2FwZUh0bWwoZXJyLm1lc3NhZ2UpfVxuICAgICAgPC9kaXY+YDtcbiAgfVxufVxuXG4vLyBhcHBseUhhcnZlc3RTZWxlY3Rpb25zKCkgKGJvdW5kIHZpYSB0aGUgYnV0dG9uJ3Mgb25jbGljayBhYm92ZSkgbGl2ZXMgaW5cbi8vIHdlYi9oYXJ2ZXN0LmpzLCBub3QgaGVyZSBcdTIwMTQgdGhpcyBmaWxlIHVzZWQgdG8gY2FycnkgaXRzIG93biBkaXZlcmdlbnRcbi8vIGR1cGxpY2F0ZSAoZGlmZmVyZW50IGNvbmZpcm0vbWVzc2FnZSBjb3B5LCBubyBjb25maXJtLW1vZGFsIHN0ZXApLCBidXRcbi8vIHNpbmNlIGJvdGggZmlsZXMgcmVuZGVyIGEgYnV0dG9uIHdpdGggdGhlIHNhbWUgb25jbGljayBhbmQgd2luZG93IHJlc29sdmVzXG4vLyBiYXJlIGlkZW50aWZpZXJzIGF0IGNsaWNrIHRpbWUsIGhhcnZlc3QuanMncyB2ZXJzaW9uIHdhcyBhbHdheXMgdGhlIG9uZVxuLy8gYWN0dWFsbHkgaW52b2tlZCBpbiBwcm9kdWN0aW9uIHJlZ2FyZGxlc3M7IHRoaXMgY29weSB3YXMgdW5yZWFjaGFibGUgZGVhZFxuLy8gY29kZS4gUmVtb3ZlZDsgc2VlIHdlYi9oYXJ2ZXN0LmpzLlxuXG4vLyBcdTI1MDBcdTI1MDAgRXhwb3J0cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZXhwb3J0IHtcbiAgcG9wdWxhdGVGaW5hbGlzZVRhYixcbiAgZmluYWxpc2VBcHBsaWNhdGlvbixcbiAgc2hvd0hhcnZlc3RTZWN0aW9uLFxuICBfcmVuZGVyUmVhZGluZXNzQ2hlY2tsaXN0LFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL2ludGVydmlldy1wcmVwLmpzXG4gKiBJbnRlcnZpZXcgUHJlcGFyYXRpb24gcGhhc2UgXHUyMDE0IHBsYWNlaG9sZGVyIGNvbnRlbnQgd2l0aCBuYXZpZ2F0aW9uLlxuICpcbiAqIERlcGVuZGVuY2llcyAocmVzb2x2ZWQgdGhyb3VnaCBnbG9iYWxUaGlzIGF0IHJ1bnRpbWUpOlxuICogICBoYW5kbGVTdGVwQ2xpY2tcbiAqL1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5jb25zdCBsb2cgPSBnZXRMb2dnZXIoJ2ludGVydmlldy1wcmVwJyk7XG5cbmFzeW5jIGZ1bmN0aW9uIHBvcHVsYXRlSW50ZXJ2aWV3UHJlcFRhYigpIHtcbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIGlmICghY29udGVudCkgcmV0dXJuO1xuXG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgc3R5bGU9XCJtYXgtd2lkdGg6NzAwcHg7bWFyZ2luOjAgYXV0bztwYWRkaW5nOjQwcHggMjBweDt0ZXh0LWFsaWduOmNlbnRlcjtcIj5cbiAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6M2VtO21hcmdpbi1ib3R0b206MTZweDtcIj5cdUQ4M0NcdURGQTQ8L2Rpdj5cbiAgICAgIDxoMiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTJweDtcIj5JbnRlcnZpZXcgUHJlcGFyYXRpb248L2gyPlxuICAgICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO21hcmdpbi1ib3R0b206OHB4O1wiPlxuICAgICAgICBBSS1nZW5lcmF0ZWQgaW50ZXJ2aWV3IHByZXBhcmF0aW9uIGJhc2VkIG9uIHRoaXMgam9iIGFuZCB5b3VyIENWIGlzIGNvbWluZyBzb29uLlxuICAgICAgPC9wPlxuICAgICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO2ZvbnQtc2l6ZTowLjllbTtcIj5cbiAgICAgICAgVGhpcyB3aWxsIGluY2x1ZGUgbGlrZWx5IGludGVydmlldyBxdWVzdGlvbnMsIHN1Z2dlc3RlZCB0YWxraW5nIHBvaW50cywgYW5kXG4gICAgICAgIFNUQVItZm9ybWF0IGFuc3dlcnMgZHJhd24gZnJvbSB5b3VyIGV4cGVyaWVuY2UuXG4gICAgICA8L3A+XG4gICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDo0MHB4O1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLXByaW1hcnlcIiBvbmNsaWNrPVwiaGFuZGxlU3RlcENsaWNrKCd0aGFua195b3UnKVwiXG4gICAgICAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6MWVtO3BhZGRpbmc6MTBweCAyNHB4O1wiPlxuICAgICAgICAgIFByb2NlZWQgdG8gVGhhbmsgWW91IExldHRlciBcdTIxOTJcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xuXG4gIGxvZy5kZWJ1ZygnSW50ZXJ2aWV3IHByZXAgcGxhY2Vob2xkZXIgcmVuZGVyZWQnKTtcbn1cblxuZXhwb3J0IHsgcG9wdWxhdGVJbnRlcnZpZXdQcmVwVGFiIH07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi90aGFuay15b3UuanNcbiAqIFRoYW5rIFlvdSBMZXR0ZXIgcGhhc2UgXHUyMDE0IHBsYWNlaG9sZGVyIGNvbnRlbnQgd2l0aCBuYXZpZ2F0aW9uLlxuICpcbiAqIERlcGVuZGVuY2llcyAocmVzb2x2ZWQgdGhyb3VnaCBnbG9iYWxUaGlzIGF0IHJ1bnRpbWUpOlxuICogICBoYW5kbGVTdGVwQ2xpY2tcbiAqL1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5jb25zdCBsb2cgPSBnZXRMb2dnZXIoJ3RoYW5rLXlvdScpO1xuXG5hc3luYyBmdW5jdGlvbiBwb3B1bGF0ZVRoYW5rWW91VGFiKCkge1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgaWYgKCFjb250ZW50KSByZXR1cm47XG5cbiAgY29udGVudC5pbm5lckhUTUwgPSBgXG4gICAgPGRpdiBzdHlsZT1cIm1heC13aWR0aDo3MDBweDttYXJnaW46MCBhdXRvO3BhZGRpbmc6NDBweCAyMHB4O3RleHQtYWxpZ246Y2VudGVyO1wiPlxuICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTozZW07bWFyZ2luLWJvdHRvbToxNnB4O1wiPlx1RDgzRFx1REU0RjwvZGl2PlxuICAgICAgPGgyIHN0eWxlPVwibWFyZ2luLWJvdHRvbToxMnB4O1wiPlRoYW5rIFlvdSBMZXR0ZXI8L2gyPlxuICAgICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO21hcmdpbi1ib3R0b206OHB4O1wiPlxuICAgICAgICBBSS1nZW5lcmF0ZWQgdGhhbmsgeW91IGxldHRlciB0ZW1wbGF0ZXMgYXJlIGNvbWluZyBzb29uLlxuICAgICAgPC9wPlxuICAgICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO2ZvbnQtc2l6ZTowLjllbTtcIj5cbiAgICAgICAgQWZ0ZXIgeW91ciBpbnRlcnZpZXcsIHVzZSB0aGlzIHRvIGdlbmVyYXRlIGEgcGVyc29uYWxpc2VkIHRoYW5rIHlvdSBub3RlXG4gICAgICAgIHRoYXQgcmVpbmZvcmNlcyB5b3VyIGZpdCBmb3IgdGhlIHJvbGUuXG4gICAgICA8L3A+XG4gICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDo0MHB4O1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLXByaW1hcnlcIiBvbmNsaWNrPVwiaGFuZGxlU3RlcENsaWNrKCdoYXJ2ZXN0JylcIlxuICAgICAgICAgICAgICAgIHN0eWxlPVwiZm9udC1zaXplOjFlbTtwYWRkaW5nOjEwcHggMjRweDtcIj5cbiAgICAgICAgICBQcm9jZWVkIHRvIEhhcnZlc3QgSW1wcm92ZW1lbnRzIFx1MjE5MlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PmA7XG5cbiAgbG9nLmRlYnVnKCdUaGFuayB5b3UgbGV0dGVyIHBsYWNlaG9sZGVyIHJlbmRlcmVkJyk7XG59XG5cbmV4cG9ydCB7IHBvcHVsYXRlVGhhbmtZb3VUYWIgfTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogSGFydmVzdCB0YWI6IExMTS1zY29yZWQgZ3JvdXBlZCB2aWV3IG9mIG1hc3Rlci1DViBpbXByb3ZlbWVudCBjYW5kaWRhdGVzLlxuICpcbiAqIFB1YmxpYyBleHBvcnRzOlxuICogICBwb3B1bGF0ZUhhcnZlc3RUYWIoKSAgICAgICAgXHUyMDE0IGNhbGxlZCBieSByZXZpZXctdGFibGUtYmFzZS5qcyBvbiB0YWIgc3dpdGNoXG4gKiAgIGFwcGx5SGFydmVzdFNlbGVjdGlvbnMoKSAgICBcdTIwMTQgY2FsbGVkIGJ5IGlubGluZSBvbmNsaWNrIG9uIHRoZSBBcHBseSBidXR0b25cbiAqICAgcmVmcmVzaEhhcnZlc3RBbmFseXNpcygpICAgIFx1MjAxNCBjYWxsZWQgYnkgaW5saW5lIG9uY2xpY2sgb24gdGhlIFJlZnJlc2ggYnV0dG9uXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZXNjLCByZW5kZXJQcm9wb3NhbFJvdywgYXR0YWNoUHJvcG9zYWxSb3dMaXN0ZW5lcnMgfSBmcm9tICcuL3Byb3Bvc2FsLXJldmlldy5qcyc7XG5cbmNvbnN0IGxvZyA9IGdldExvZ2dlcignaGFydmVzdCcpO1xuXG4vLyBcdTI1MDBcdTI1MDAgRGlzcGxheSBjb25maWcgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8qKlxuICogTWVyZ2VkIGRpc3BsYXkgdHlwZSBjb25maWcuXG4gKiBuZXdfc2tpbGwgYW5kIHNraWxsX2dhcF9jb25maXJtZWQgYm90aCBtYXAgdG8gdGhlICdza2lsbCcgZGlzcGxheSBncm91cC5cbiAqL1xuY29uc3QgSEFSVkVTVF9UWVBFX0NPTkZJRyA9IHtcbiAgaW1wcm92ZWRfYnVsbGV0OiAgICAgeyBsYWJlbDogJ0V4cGVyaWVuY2UgQnVsbGV0cycsICAgICBpY29uOiAnXHUyNzBGXHVGRTBGJywgIHNvcnQ6IDEsIGRpc3BsYXlUeXBlOiAnaW1wcm92ZWRfYnVsbGV0JyAgICAgfSxcbiAgbmV3X3NraWxsOiAgICAgICAgICAgeyBsYWJlbDogJ1NraWxscycsICAgICAgICAgICAgICAgICBpY29uOiAnXHVEODNEXHVERUUwXHVGRTBGJywgIHNvcnQ6IDIsIGRpc3BsYXlUeXBlOiAnc2tpbGwnICAgICAgICAgICAgICAgfSxcbiAgc2tpbGxfZ2FwX2NvbmZpcm1lZDogeyBsYWJlbDogJ1NraWxscycsICAgICAgICAgICAgICAgICBpY29uOiAnXHVEODNEXHVERUUwXHVGRTBGJywgIHNvcnQ6IDIsIGRpc3BsYXlUeXBlOiAnc2tpbGwnICAgICAgICAgICAgICAgfSxcbiAgc3VtbWFyeV92YXJpYW50OiAgICAgeyBsYWJlbDogJ1Byb2Zlc3Npb25hbCBTdW1tYXJ5JywgICBpY29uOiAnXHVEODNEXHVEQ0REJywgIHNvcnQ6IDMsIGRpc3BsYXlUeXBlOiAnc3VtbWFyeV92YXJpYW50JyAgICAgfSxcbiAgc2tpbGxfdHlwZV91cGRhdGU6ICAgeyBsYWJlbDogJ1NraWxsIENsYXNzaWZpY2F0aW9uJywgICBpY29uOiAnXHVEODNDXHVERkY3XHVGRTBGJywgIHNvcnQ6IDQsIGRpc3BsYXlUeXBlOiAnc2tpbGxfdHlwZV91cGRhdGUnICB9LFxufTtcblxuY29uc3QgSEFSVkVTVF9UWVBFX0RFU0NSSVBUSU9OUyA9IHtcbiAgaW1wcm92ZWRfYnVsbGV0OiAgICAgICdSZXdyaXR0ZW4gYWNoaWV2ZW1lbnQgYnVsbGV0cyB5b3UgYXBwcm92ZWQgaW4gdGhlIFJld3JpdGVzIHN0ZXAuIFByb21vdGluZyB1cGRhdGVzIHRoZSBidWxsZXQgdGV4dCBpbiB5b3VyIG1hc3RlciBDVi4nLFxuICBza2lsbDogICAgICAgICAgICAgICAgJ1NraWxscyBhYnNlbnQgZnJvbSB5b3VyIG1hc3RlciBDViBcdTIwMTQgZWl0aGVyIGFkZGVkIChcdUQ4M0NcdUREOTUgQWRkZWQpIGR1cmluZyB0aGUgU2tpbGxzIFJldmlldyBvciBjb25maXJtZWQgd2hlbiBhc2tlZCAoXHUyNzA1IENvbmZpcm1lZCkuIFByb21vdGluZyBhZGRzIHRoZW0gdG8geW91ciBza2lsbHMgc2VjdGlvbi4nLFxuICBzdW1tYXJ5X3ZhcmlhbnQ6ICAgICAgJ0EgcmV3cml0dGVuIHZlcnNpb24gb2YgeW91ciBwcm9mZXNzaW9uYWwgc3VtbWFyeS4gUHJvbW90aW5nIHN0b3JlcyBpdCBhcyBhIG5hbWVkIHZhcmlhbnQgaW4geW91ciBtYXN0ZXIgQ1YuJyxcbiAgc2tpbGxfdHlwZV91cGRhdGU6ICAgICdIYXJkL3NvZnQgc2tpbGwgY2xhc3NpZmljYXRpb25zIHlvdSBjaGFuZ2VkIGR1cmluZyB0aGlzIHNlc3Npb24uIFByb21vdGluZyBwZXJzaXN0cyB0aGUgbmV3IHR5cGUgc28gaXQgaXMgbm90IHJlLWNsYXNzaWZpZWQgb24gZXZlcnkgYXBwbGljYXRpb24uJyxcbn07XG5cbmNvbnN0IEhBUlZFU1RfU09VUkNFX0JBREdFID0ge1xuICBuZXdfc2tpbGw6ICAgICAgICAgICAnPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC43NWVtO2JhY2tncm91bmQ6I2RiZWFmZTtjb2xvcjojMWQ0ZWQ4O2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6MXB4IDZweDttYXJnaW4tbGVmdDo2cHg7d2hpdGUtc3BhY2U6bm93cmFwO1wiPlx1RDgzQ1x1REQ5NSBBZGRlZDwvc3Bhbj4nLFxuICBza2lsbF9nYXBfY29uZmlybWVkOiAnPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC43NWVtO2JhY2tncm91bmQ6I2RjZmNlNztjb2xvcjojMTY2NTM0O2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6MXB4IDZweDttYXJnaW4tbGVmdDo2cHg7d2hpdGUtc3BhY2U6bm93cmFwO1wiPlx1MjcwNSBDb25maXJtZWQ8L3NwYW4+JyxcbiAgc2tpbGxfdHlwZV91cGRhdGU6ICAgJzxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjAuNzVlbTtiYWNrZ3JvdW5kOiNmZWY5YzM7Y29sb3I6Izg1NGQwZTtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjFweCA2cHg7bWFyZ2luLWxlZnQ6NnB4O3doaXRlLXNwYWNlOm5vd3JhcDtcIj5cdUQ4M0NcdURGRjdcdUZFMEYgUmVjbGFzc2lmaWVkPC9zcGFuPicsXG59O1xuXG5jb25zdCBSRUNfQ09ORklHID0ge1xuICBwcm9tb3RlOiB7IGxhYmVsOiAnUHJvbW90ZScsICAgICAgaWNvbjogJ1x1MkIwNlx1RkUwRicsICBjb2xvcjogJyMxNjY1MzQnLCBiZzogJyNmMGZkZjQnLCBzb3J0OiAwIH0sXG4gIHNraXA6ICAgIHsgbGFiZWw6ICdTa2lwJywgICAgICAgICBpY29uOiAnXHUyM0VEXHVGRTBGJywgIGNvbG9yOiAnIzlhMzQxMicsIGJnOiAnI2ZmZjdlZCcsIHNvcnQ6IDEgfSxcbiAgbnVsbDogICAgeyBsYWJlbDogJ1VuYW5hbHl6ZWQnLCAgIGljb246ICdcdTI3NTMnLCAgY29sb3I6ICcjNGI1NTYzJywgYmc6ICcjZjlmYWZiJywgc29ydDogMiB9LFxufTtcblxuY29uc3QgQ09ORl9DT05GSUcgPSB7XG4gIGhpZ2g6ICAgeyBsYWJlbDogJ0hpZ2gnLCAgIGNvbG9yOiAnIzE1ODAzZCcsIGJnOiAnI2YwZmRmNCcsIHNvcnQ6IDAgfSxcbiAgbWVkaXVtOiB7IGxhYmVsOiAnTWVkaXVtJywgY29sb3I6ICcjYjQ1MzA5JywgYmc6ICcjZmZmYmViJywgc29ydDogMSB9LFxuICBsb3c6ICAgIHsgbGFiZWw6ICdMb3cnLCAgICBjb2xvcjogJyNiOTFjMWMnLCBiZzogJyNmZWYyZjInLCBzb3J0OiAyIH0sXG4gIG51bGw6ICAgeyBsYWJlbDogJycsICAgICAgIGNvbG9yOiAnIzZiNzI4MCcsIGJnOiAnI2Y5ZmFmYicsIHNvcnQ6IDMgfSxcbn07XG5cbi8vIFx1MjUwMFx1MjUwMCBHcm91cGluZyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gZ2V0RGlzcGxheVR5cGUoY2FuZGlkYXRlKSB7XG4gIHJldHVybiBIQVJWRVNUX1RZUEVfQ09ORklHW2NhbmRpZGF0ZS50eXBlXT8uZGlzcGxheVR5cGUgPz8gY2FuZGlkYXRlLnR5cGU7XG59XG5cbi8qKlxuICogR3JvdXAgZW5yaWNoZWQgY2FuZGlkYXRlcyBpbnRvIGEgbmVzdGVkIHN0cnVjdHVyZTpcbiAqICAgeyBkaXNwbGF5VHlwZSBcdTIxOTIgeyByZWMgXHUyMTkyIHsgY29uZmlkZW5jZSBcdTIxOTIgW2NhbmRpZGF0ZSwgXHUyMDI2XSB9IH0gfVxuICovXG5mdW5jdGlvbiBncm91cENhbmRpZGF0ZXMoZW5yaWNoZWQpIHtcbiAgY29uc3QgZ3JvdXBzID0ge307XG4gIGZvciAoY29uc3QgYyBvZiBlbnJpY2hlZCkge1xuICAgIGNvbnN0IGR0ICAgPSBnZXREaXNwbGF5VHlwZShjKTtcbiAgICBjb25zdCByZWMgID0gYy5yZWNvbW1lbmRhdGlvbiA/PyAnbnVsbCc7XG4gICAgY29uc3QgY29uZiA9IGMuY29uZmlkZW5jZSAgICAgPz8gJ251bGwnO1xuICAgIGlmICghZ3JvdXBzW2R0XSkgICAgICAgICAgICAgICAgZ3JvdXBzW2R0XSAgICAgICA9IHt9O1xuICAgIGlmICghZ3JvdXBzW2R0XVtyZWNdKSAgICAgICAgICAgZ3JvdXBzW2R0XVtyZWNdICA9IHt9O1xuICAgIGlmICghZ3JvdXBzW2R0XVtyZWNdW2NvbmZdKSAgICAgZ3JvdXBzW2R0XVtyZWNdW2NvbmZdID0gW107XG4gICAgZ3JvdXBzW2R0XVtyZWNdW2NvbmZdLnB1c2goYyk7XG4gIH1cbiAgcmV0dXJuIGdyb3Vwcztcbn1cblxuZnVuY3Rpb24gc29ydGVkS2V5cyhvYmosIGNvbmZpZ01hcCkge1xuICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5zb3J0KChhLCBiKSA9PiB7XG4gICAgY29uc3Qgc2EgPSBjb25maWdNYXBbYV0/LnNvcnQgPz8gOTk7XG4gICAgY29uc3Qgc2IgPSBjb25maWdNYXBbYl0/LnNvcnQgPz8gOTk7XG4gICAgcmV0dXJuIHNhIC0gc2I7XG4gIH0pO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgUHJlLWNoZWNrIGxvZ2ljIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuLy8gQWxsIGhhcnZlc3QgaXRlbXMgc3RhcnQgdW5jaGVja2VkIFx1MjAxNCBtYXN0ZXIgQ1YgdXBkYXRlcyBhcmUgb3B0LWluIG9ubHkgKFVTLUExMSkuXG4vLyBHcm91cHMgd2l0aCBoaWdoL21lZGl1bSBjb25maWRlbmNlIHByb21vdGlvbnMgYXJlIGV4cGFuZGVkIHNvIGNhbmRpZGF0ZXMgYXJlXG4vLyBwcm9taW5lbnQsIGJ1dCBubyBjaGVja2JveCBpcyBwcmUtc2VsZWN0ZWQuXG5cbmZ1bmN0aW9uIHNob3VsZFByZUNoZWNrKF9jYW5kaWRhdGUpIHtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgQ29sbGFwc2UgZGVmYXVsdCBsb2dpYyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gdHlwZUdyb3VwRXhwYW5kZWQoZHRDYW5kaWRhdGVzKSB7XG4gIHJldHVybiBkdENhbmRpZGF0ZXMuc29tZShjID0+IGMucmVjb21tZW5kYXRpb24gPT09ICdwcm9tb3RlJyAmJlxuICAgIChjLmNvbmZpZGVuY2UgPT09ICdoaWdoJyB8fCBjLmNvbmZpZGVuY2UgPT09ICdtZWRpdW0nKSk7XG59XG5cbmZ1bmN0aW9uIHJlY0dyb3VwRXhwYW5kZWQocmVjLCBjb25mQ2FuZGlkYXRlcykge1xuICBpZiAocmVjICE9PSAncHJvbW90ZScpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGNvbmZDYW5kaWRhdGVzLnNvbWUoYyA9PiBjLmNvbmZpZGVuY2UgPT09ICdoaWdoJyB8fCBjLmNvbmZpZGVuY2UgPT09ICdtZWRpdW0nKTtcbn1cblxuZnVuY3Rpb24gY29uZlRpZXJFeHBhbmRlZChyZWMsIGNvbmYpIHtcbiAgcmV0dXJuIHJlYyA9PT0gJ3Byb21vdGUnICYmIChjb25mID09PSAnaGlnaCcgfHwgY29uZiA9PT0gJ21lZGl1bScpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgUmVuZGVyaW5nIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiByZW5kZXJDb25maWRlbmNlQmFkZ2UoY29uZikge1xuICBjb25zdCBjZmcgPSBDT05GX0NPTkZJR1tjb25mXSA/PyBDT05GX0NPTkZJR1snbnVsbCddO1xuICBpZiAoIWNmZy5sYWJlbCkgcmV0dXJuICcnO1xuICByZXR1cm4gYDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjAuN2VtO2ZvbnQtd2VpZ2h0OjYwMDtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjFweCA2cHg7YmFja2dyb3VuZDoke2NmZy5iZ307Y29sb3I6JHtjZmcuY29sb3J9O2JvcmRlcjoxcHggc29saWQgJHtjZmcuY29sb3J9MzA7d2hpdGUtc3BhY2U6bm93cmFwO1wiPiR7ZXNjKGNmZy5sYWJlbCl9PC9zcGFuPmA7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclJlY29tbWVuZGF0aW9uQmFkZ2UocmVjKSB7XG4gIGNvbnN0IGNmZyA9IFJFQ19DT05GSUdbcmVjXSA/PyBSRUNfQ09ORklHWydudWxsJ107XG4gIHJldHVybiBgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC43NWVtO2ZvbnQtd2VpZ2h0OjYwMDtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjJweCA4cHg7YmFja2dyb3VuZDoke2NmZy5iZ307Y29sb3I6JHtjZmcuY29sb3J9O3doaXRlLXNwYWNlOm5vd3JhcDtcIj4ke2NmZy5pY29ufSAke2VzYyhjZmcubGFiZWwpfTwvc3Bhbj5gO1xufVxuXG5mdW5jdGlvbiByZW5kZXJDYW5kaWRhdGVSb3coYywgaWR4KSB7XG4gIGNvbnN0IHR5cGVDZmcgICA9IEhBUlZFU1RfVFlQRV9DT05GSUdbYy50eXBlXSA/PyB7fTtcbiAgY29uc3QgcmVjQmFkZ2UgID0gYy5yZWNvbW1lbmRhdGlvbiA/IHJlbmRlclJlY29tbWVuZGF0aW9uQmFkZ2UoYy5yZWNvbW1lbmRhdGlvbikgOiAnJztcbiAgY29uc3QgY29uZkJhZGdlID0gYy5jb25maWRlbmNlID8gcmVuZGVyQ29uZmlkZW5jZUJhZGdlKGMuY29uZmlkZW5jZSkgOiAnJztcbiAgY29uc3QgaGFzUmVhc29uaW5nID0gYy5hbmFseXNpc0F2YWlsYWJsZSAmJiBjLnJlYXNvbmluZztcblxuICByZXR1cm4gcmVuZGVyUHJvcG9zYWxSb3coe1xuICAgIGlkOiAgICAgICAgICAgICAgYy5pZCxcbiAgICB0eXBlTGFiZWw6ICAgICAgIHR5cGVDZmcubGFiZWwgPz8gYy50eXBlLFxuICAgIHNvdXJjZUJhZGdlSHRtbDogSEFSVkVTVF9TT1VSQ0VfQkFER0VbYy50eXBlXSA/PyAnJyxcbiAgICBsYWJlbDogICAgICAgICAgIGMubGFiZWwsXG4gICAgb3JpZ2luYWw6ICAgICAgICBjLm9yaWdpbmFsLFxuICAgIHByb3Bvc2VkOiAgICAgICAgYy5wcm9wb3NlZCxcbiAgICBkZXRhaWxUZXh0OiAgICAgIGhhc1JlYXNvbmluZyA/IGMucmVhc29uaW5nIDogbnVsbCxcbiAgICBiYWRnZXNIdG1sOiAgICAgICBgJHtyZWNCYWRnZX0ke2NvbmZCYWRnZX1gLFxuICAgIGNoZWNrZWQ6ICAgICAgICAgc2hvdWxkUHJlQ2hlY2soYyksXG4gIH0sIHtcbiAgICBpZFByZWZpeDogICAgICAgICAnaGFydmVzdCcsXG4gICAgY2hlY2tib3hEYXRhQXR0cjogJ2hhcnZlc3QtaWQnLFxuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVuZGVyQ29uZmlkZW5jZVRpZXIocmVjLCBjb25mLCBjYW5kaWRhdGVzKSB7XG4gIGNvbnN0IGNmZyAgICAgID0gQ09ORl9DT05GSUdbY29uZl0gPz8gQ09ORl9DT05GSUdbJ251bGwnXTtcbiAgY29uc3QgZXhwYW5kZWQgPSBjb25mVGllckV4cGFuZGVkKHJlYywgY29uZik7XG4gIGNvbnN0IHRpZXJJZCAgID0gYGhhcnZlc3QtY29uZi0ke3JlY30tJHtjb25mfS0ke0RhdGUubm93KCl9YDtcbiAgY29uc3QgY291bnQgICAgPSBjYW5kaWRhdGVzLmxlbmd0aDtcblxuICBpZiAoIWNmZy5sYWJlbCkge1xuICAgIC8vIE5vLWFuYWx5c2lzIHRpZXIgXHUyMDE0IHJlbmRlciByb3dzIGRpcmVjdGx5IHdpdGhvdXQgYSBzdWItaGVhZGVyXG4gICAgcmV0dXJuIGNhbmRpZGF0ZXMubWFwKChjLCBpKSA9PiByZW5kZXJDYW5kaWRhdGVSb3coYywgaSkpLmpvaW4oJycpO1xuICB9XG5cbiAgY29uc3QgdG9nZ2xlSWNvbiA9IGV4cGFuZGVkID8gJ1x1MjVCRScgOiAnXHUyNUI4JztcbiAgY29uc3QgaGVhZGVySHRtbCA9IGBcbiAgICA8dHIgY2xhc3M9XCJoYXJ2ZXN0LWNvbmYtaGVhZGVyXCIgc3R5bGU9XCJjdXJzb3I6cG9pbnRlcjtiYWNrZ3JvdW5kOiNmYWZhZmE7XCIgb25jbGljaz1cInRvZ2dsZUhhcnZlc3RTZWN0aW9uKCcke3RpZXJJZH0nKVwiPlxuICAgICAgPHRkIGNvbHNwYW49XCIyXCIgc3R5bGU9XCJwYWRkaW5nOjZweCAxMnB4IDZweCAzNnB4O2ZvbnQtc2l6ZTowLjhlbTtjb2xvcjoke2NmZy5jb2xvcn07Zm9udC13ZWlnaHQ6NjAwO1wiPlxuICAgICAgICA8c3BhbiBpZD1cIiR7dGllcklkfS1pY29uXCI+JHt0b2dnbGVJY29ufTwvc3Bhbj5cbiAgICAgICAgJHtlc2MoY2ZnLmxhYmVsKX0gY29uZmlkZW5jZVxuICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07Zm9udC13ZWlnaHQ6NDAwO2NvbG9yOiM5Y2EzYWY7bWFyZ2luLWxlZnQ6NnB4O1wiPigke2NvdW50fSk8L3NwYW4+XG4gICAgICA8L3RkPlxuICAgIDwvdHI+XG4gICAgPHRib2R5IGlkPVwiJHt0aWVySWR9XCIgc3R5bGU9XCIke2V4cGFuZGVkID8gJycgOiAnZGlzcGxheTpub25lOyd9XCI+XG4gICAgICAke2NhbmRpZGF0ZXMubWFwKChjLCBpKSA9PiByZW5kZXJDYW5kaWRhdGVSb3coYywgaSkpLmpvaW4oJycpfVxuICAgIDwvdGJvZHk+YDtcbiAgcmV0dXJuIGhlYWRlckh0bWw7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclJlY0dyb3VwKGR0LCByZWMsIGNvbmZNYXApIHtcbiAgY29uc3QgY2ZnID0gUkVDX0NPTkZJR1tyZWNdID8/IFJFQ19DT05GSUdbJ251bGwnXTtcbiAgY29uc3QgYWxsQ2FuZHMgPSBPYmplY3QudmFsdWVzKGNvbmZNYXApLmZsYXQoKTtcbiAgY29uc3QgZXhwYW5kZWQgPSByZWNHcm91cEV4cGFuZGVkKHJlYywgYWxsQ2FuZHMpO1xuICBjb25zdCBncm91cElkICA9IGBoYXJ2ZXN0LXJlYy0ke2R0fS0ke3JlY30tJHtEYXRlLm5vdygpfWA7XG4gIGNvbnN0IGNvdW50ICAgID0gYWxsQ2FuZHMubGVuZ3RoO1xuXG4gIGNvbnN0IGNvbmZzICAgID0gc29ydGVkS2V5cyhjb25mTWFwLCBDT05GX0NPTkZJRyk7XG4gIGNvbnN0IGhhc011bHRpcGxlQ29uZnMgPSBjb25mcy5sZW5ndGggPiAxIHx8IChjb25mcy5sZW5ndGggPT09IDEgJiYgQ09ORl9DT05GSUdbY29uZnNbMF1dPy5sYWJlbCk7XG5cbiAgY29uc3QgaW5uZXJSb3dzID0gY29uZnMubWFwKGNvbmYgPT4gcmVuZGVyQ29uZmlkZW5jZVRpZXIocmVjLCBjb25mLCBjb25mTWFwW2NvbmZdKSkuam9pbignJyk7XG5cbiAgY29uc3QgdG9nZ2xlSWNvbiA9IGV4cGFuZGVkID8gJ1x1MjVCRScgOiAnXHUyNUI4JztcbiAgcmV0dXJuIGBcbiAgICA8dHIgY2xhc3M9XCJoYXJ2ZXN0LXJlYy1oZWFkZXJcIiBzdHlsZT1cImN1cnNvcjpwb2ludGVyO2JhY2tncm91bmQ6JHtjZmcuYmd9O1wiIG9uY2xpY2s9XCJ0b2dnbGVIYXJ2ZXN0U2VjdGlvbignJHtncm91cElkfScpXCI+XG4gICAgICA8dGQgY29sc3Bhbj1cIjJcIiBzdHlsZT1cInBhZGRpbmc6OHB4IDEycHggOHB4IDI0cHg7Zm9udC1zaXplOjAuODVlbTtjb2xvcjoke2NmZy5jb2xvcn07Zm9udC13ZWlnaHQ6NzAwO1wiPlxuICAgICAgICA8c3BhbiBpZD1cIiR7Z3JvdXBJZH0taWNvblwiPiR7dG9nZ2xlSWNvbn08L3NwYW4+XG4gICAgICAgICR7Y2ZnLmljb259ICR7ZXNjKGNmZy5sYWJlbCl9XG4gICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtmb250LXdlaWdodDo0MDA7Y29sb3I6IzljYTNhZjttYXJnaW4tbGVmdDo2cHg7XCI+KCR7Y291bnR9KTwvc3Bhbj5cbiAgICAgIDwvdGQ+XG4gICAgPC90cj5cbiAgICA8dGJvZHkgaWQ9XCIke2dyb3VwSWR9XCIgc3R5bGU9XCIke2V4cGFuZGVkID8gJycgOiAnZGlzcGxheTpub25lOyd9XCI+XG4gICAgICAke2hhc011bHRpcGxlQ29uZnMgPyBpbm5lclJvd3MgOiBhbGxDYW5kcy5tYXAoKGMsIGkpID0+IHJlbmRlckNhbmRpZGF0ZVJvdyhjLCBpKSkuam9pbignJyl9XG4gICAgPC90Ym9keT5gO1xufVxuXG5mdW5jdGlvbiByZW5kZXJUeXBlR3JvdXAoZHQsIHJlY01hcCwgYWxsRHRDYW5kaWRhdGVzKSB7XG4gIGNvbnN0IGNmZyAgICAgID0gSEFSVkVTVF9UWVBFX0NPTkZJR1tkdF0gPz8geyBsYWJlbDogZHQsIGljb246ICdcdUQ4M0RcdURDQ0InLCBzb3J0OiA5OSB9O1xuICBjb25zdCBleHBhbmRlZCA9IHR5cGVHcm91cEV4cGFuZGVkKGFsbER0Q2FuZGlkYXRlcyk7XG4gIGNvbnN0IGdyb3VwSWQgID0gYGhhcnZlc3QtdHlwZS0ke2R0fS0ke0RhdGUubm93KCl9YDtcbiAgY29uc3QgY291bnQgICAgPSBhbGxEdENhbmRpZGF0ZXMubGVuZ3RoO1xuICBjb25zdCBkZXNjICAgICA9IEhBUlZFU1RfVFlQRV9ERVNDUklQVElPTlNbZHRdID8/ICcnO1xuXG4gIGNvbnN0IHJlY3MgICAgICAgID0gc29ydGVkS2V5cyhyZWNNYXAsIFJFQ19DT05GSUcpO1xuICBjb25zdCBoYXNNdWx0aXBsZVJlY3MgPSByZWNzLmxlbmd0aCA+IDE7XG5cbiAgY29uc3QgaW5uZXJIdG1sID0gcmVjcy5tYXAocmVjID0+IHtcbiAgICBpZiAoIWhhc011bHRpcGxlUmVjcykge1xuICAgICAgLy8gU3VwcHJlc3MgdGhlIHJlYy1sZXZlbCBoZWFkZXI7IHJlbmRlciBjb25maWRlbmNlIHRpZXJzIGRpcmVjdGx5XG4gICAgICBjb25zdCBjb25mTWFwICA9IHJlY01hcFtyZWNdO1xuICAgICAgY29uc3QgY29uZnMgICAgPSBzb3J0ZWRLZXlzKGNvbmZNYXAsIENPTkZfQ09ORklHKTtcbiAgICAgIGNvbnN0IGhhc0NvbmZzID0gY29uZnMubGVuZ3RoID4gMSB8fCAoY29uZnMubGVuZ3RoID09PSAxICYmIENPTkZfQ09ORklHW2NvbmZzWzBdXT8ubGFiZWwpO1xuICAgICAgcmV0dXJuIGhhc0NvbmZzXG4gICAgICAgID8gY29uZnMubWFwKGNvbmYgPT4gcmVuZGVyQ29uZmlkZW5jZVRpZXIocmVjLCBjb25mLCBjb25mTWFwW2NvbmZdKSkuam9pbignJylcbiAgICAgICAgOiBjb25mTWFwW2NvbmZzWzBdXS5tYXAoKGMsIGkpID0+IHJlbmRlckNhbmRpZGF0ZVJvdyhjLCBpKSkuam9pbignJyk7XG4gICAgfVxuICAgIHJldHVybiByZW5kZXJSZWNHcm91cChkdCwgcmVjLCByZWNNYXBbcmVjXSk7XG4gIH0pLmpvaW4oJycpO1xuXG4gIGNvbnN0IHRvZ2dsZUljb24gPSBleHBhbmRlZCA/ICdcdTI1QkUnIDogJ1x1MjVCOCc7XG4gIHJldHVybiBgXG4gICAgPGRpdiBjbGFzcz1cImhhcnZlc3QtdHlwZS1zZWN0aW9uXCIgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjI0cHg7Ym9yZGVyOjFweCBzb2xpZCAjZTJlOGYwO2JvcmRlci1yYWRpdXM6OHB4O292ZXJmbG93OmhpZGRlbjtcIj5cbiAgICAgIDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmOGZhZmM7cGFkZGluZzoxMnB4IDE2cHg7Y3Vyc29yOnBvaW50ZXI7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTBweDtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZTJlOGYwO1wiXG4gICAgICAgICAgIG9uY2xpY2s9XCJ0b2dnbGVIYXJ2ZXN0U2VjdGlvbignJHtncm91cElkfScpXCI+XG4gICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjEuMjVlbTtcIj4ke2NmZy5pY29ufTwvc3Bhbj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImZsZXg6MTtcIj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6NzAwO2NvbG9yOiMwZjE3MmE7Zm9udC1zaXplOjAuOTVlbTtcIj5cbiAgICAgICAgICAgIDxzcGFuIGlkPVwiJHtncm91cElkfS1pY29uXCI+JHt0b2dnbGVJY29ufTwvc3Bhbj5cbiAgICAgICAgICAgICR7ZXNjKGNmZy5sYWJlbCl9XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjgyZW07Zm9udC13ZWlnaHQ6NDAwO2NvbG9yOiM5NGEzYjg7bWFyZ2luLWxlZnQ6NnB4O1wiPigke2NvdW50fSk8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgJHtkZXNjID8gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC43OGVtO2NvbG9yOiM2NDc0OGI7bWFyZ2luLXRvcDoycHg7XCI+JHtlc2MoZGVzYyl9PC9kaXY+YCA6ICcnfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBpZD1cIiR7Z3JvdXBJZH1cIiBzdHlsZT1cIiR7ZXhwYW5kZWQgPyAnJyA6ICdkaXNwbGF5Om5vbmU7J31cIj5cbiAgICAgICAgPHRhYmxlIHN0eWxlPVwid2lkdGg6MTAwJTtib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7XCI+XG4gICAgICAgICAgJHtpbm5lckh0bWx9XG4gICAgICAgIDwvdGFibGU+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xufVxuXG5mdW5jdGlvbiByZW5kZXJIYXJ2ZXN0VGFiSHRtbChlbnJpY2hlZCwgYW5hbHlzaXNPaywgYW5hbHlzaXNFcnJvcikge1xuICBjb25zdCBncm91cHMgPSBncm91cENhbmRpZGF0ZXMoZW5yaWNoZWQpO1xuICBjb25zdCBkdEtleXMgPSBzb3J0ZWRLZXlzKGdyb3VwcywgT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKEhBUlZFU1RfVFlQRV9DT05GSUcpLm1hcCgoW2ssIHZdKSA9PiBbdi5kaXNwbGF5VHlwZSwgdl0pXG4gICkpO1xuXG4gIGNvbnN0IHRvdGFsQ291bnQgPSBlbnJpY2hlZC5sZW5ndGg7XG5cbiAgY29uc3QgYW5hbHlzaXNXYXJuaW5nID0gIWFuYWx5c2lzT2tcbiAgICA/IGA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZmZmYmViO2JvcmRlcjoxcHggc29saWQgI2ZjZDM0ZDtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjEwcHggMTRweDttYXJnaW4tYm90dG9tOjE2cHg7Zm9udC1zaXplOjAuODdlbTtjb2xvcjojOTI0MDBlO1wiPlxuICAgICAgICBcdTI2QTBcdUZFMEYgTExNIGFuYWx5c2lzIHVuYXZhaWxhYmxlJHthbmFseXNpc0Vycm9yID8gYDogJHtlc2MoYW5hbHlzaXNFcnJvcil9YCA6ICcnfS4gQ2hlY2tib3hlcyBhcmUgdW5jaGVja2VkIFx1MjAxNCByZXZpZXcgbWFudWFsbHkuXG4gICAgICAgIDxidXR0b24gb25jbGljaz1cInJlZnJlc2hIYXJ2ZXN0QW5hbHlzaXMoKVwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6MTBweDtmb250LXNpemU6MC44NWVtO3BhZGRpbmc6MnB4IDEwcHg7Ym9yZGVyOjFweCBzb2xpZCAjZDk3NzA2O2JvcmRlci1yYWRpdXM6NHB4O2JhY2tncm91bmQ6d2hpdGU7Y29sb3I6I2I0NTMwOTtjdXJzb3I6cG9pbnRlcjtcIj5SZXRyeSBhbmFseXNpczwvYnV0dG9uPlxuICAgICAgPC9kaXY+YFxuICAgIDogJyc7XG5cbiAgY29uc3Qgc2VjdGlvbnNIdG1sID0gZHRLZXlzLm1hcChkdCA9PiB7XG4gICAgY29uc3QgcmVjTWFwICAgICAgPSBncm91cHNbZHRdO1xuICAgIGNvbnN0IGFsbER0Q2FuZHMgID0gT2JqZWN0LnZhbHVlcyhyZWNNYXApLmZsYXRNYXAoY29uZk1hcCA9PiBPYmplY3QudmFsdWVzKGNvbmZNYXApLmZsYXQoKSk7XG4gICAgcmV0dXJuIHJlbmRlclR5cGVHcm91cChkdCwgcmVjTWFwLCBhbGxEdENhbmRzKTtcbiAgfSkuam9pbignJyk7XG5cbiAgcmV0dXJuIGBcbiAgICA8aDE+XHVEODNDXHVERjNFIEhhcnZlc3QgSW1wcm92ZW1lbnRzPC9oMT5cbiAgICA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7bWFyZ2luLWJvdHRvbTo4cHg7XCI+XG4gICAgICBSZXZpZXcgTExNLXNjb3JlZCBjYW5kaWRhdGVzIGZvciBwcm9tb3Rpb24gdG8geW91ciBtYXN0ZXIgQ1YuXG4gICAgICBDaGVjayB0aGUgaXRlbXMgeW91IHdhbnQgdG8gYXBwbHkgKCR7dG90YWxDb3VudH0gY2FuZGlkYXRlJHt0b3RhbENvdW50ID09PSAxID8gJycgOiAncyd9IGZvdW5kKS5cbiAgICA8L3A+XG4gICAgJHthbmFseXNpc1dhcm5pbmd9XG4gICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6MTBweDthbGlnbi1pdGVtczpjZW50ZXI7bWFyZ2luLWJvdHRvbToyMHB4O2ZsZXgtd3JhcDp3cmFwO1wiPlxuICAgICAgPGJ1dHRvbiBpZD1cImhhcnZlc3QtYXBwbHktYnRuXCIgb25jbGljaz1cImFwcGx5SGFydmVzdFNlbGVjdGlvbnMoKVwiXG4gICAgICAgIHN0eWxlPVwicGFkZGluZzoxMHB4IDI0cHg7Zm9udC1zaXplOjFlbTtmb250LXdlaWdodDo2MDA7Y3Vyc29yOnBvaW50ZXI7YmFja2dyb3VuZDojMTZhMzRhO2NvbG9yOndoaXRlO2JvcmRlcjpub25lO2JvcmRlci1yYWRpdXM6NnB4O1wiPlxuICAgICAgICBcdTI3MDUgQXBwbHkgU2VsZWN0ZWQgdG8gTWFzdGVyIENWXG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gb25jbGljaz1cInJlZnJlc2hIYXJ2ZXN0QW5hbHlzaXMoKVwiXG4gICAgICAgIHN0eWxlPVwicGFkZGluZzoxMHB4IDE4cHg7Zm9udC1zaXplOjAuOWVtO2N1cnNvcjpwb2ludGVyO2JhY2tncm91bmQ6d2hpdGU7Y29sb3I6IzQ3NTU2OTtib3JkZXI6MXB4IHNvbGlkICNjYmQ1ZTE7Ym9yZGVyLXJhZGl1czo2cHg7XCI+XG4gICAgICAgIFx1RDgzRFx1REQwNCBSZS1hbmFseXNlXG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtjb2xvcjojOTRhM2I4O1wiPlxuICAgICAgICAke3RvdGFsQ291bnR9IGNhbmRpZGF0ZSR7dG90YWxDb3VudCAhPT0gMSA/ICdzJyA6ICcnfVxuICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuICAgICR7c2VjdGlvbnNIdG1sfVxuICAgIDxkaXYgaWQ9XCJoYXJ2ZXN0LXJlc3VsdFwiIHN0eWxlPVwibWFyZ2luLXRvcDoyMHB4O1wiPjwvZGl2PmA7XG59XG5cbmZ1bmN0aW9uIHJlbmRlckVtcHR5U3RhdGVIdG1sKCkge1xuICByZXR1cm4gYFxuICAgIDxoMT5cdUQ4M0NcdURGM0UgSGFydmVzdCBJbXByb3ZlbWVudHM8L2gxPlxuICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtcIj5ObyBoYXJ2ZXN0IGNhbmRpZGF0ZXMgZm91bmQgZm9yIHRoaXMgc2Vzc2lvbi48L3A+XG4gICAgPHAgc3R5bGU9XCJjb2xvcjojOTRhM2I4O2ZvbnQtc2l6ZTowLjllbTtcIj5cbiAgICAgIENhbmRpZGF0ZXMgYXJlIGdlbmVyYXRlZCBmcm9tIGFwcHJvdmVkIHJld3JpdGVzLCBza2lsbHMgYWRkZWQgZHVyaW5nIHJldmlldyxcbiAgICAgIGFuZCBzdW1tYXJ5IHZhcmlhbnRzIGNyZWF0ZWQgZHVyaW5nIHRoZSBzZXNzaW9uLlxuICAgIDwvcD5gO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgQVBJIGNhbGxzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaENhbmRpZGF0ZXMoKSB7XG4gIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9oYXJ2ZXN0L2NhbmRpZGF0ZXMnKTtcbiAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gIHJldHVybiBkYXRhO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaEFuYWx5c2lzKGZvcmNlUmVmcmVzaCA9IGZhbHNlKSB7XG4gIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9oYXJ2ZXN0L2FuYWx5emUnLCB7XG4gICAgbWV0aG9kOiAgJ1BPU1QnLFxuICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgIGJvZHk6ICAgIEpTT04uc3RyaW5naWZ5KHsgZm9yY2VfcmVmcmVzaDogZm9yY2VSZWZyZXNoIH0pLFxuICB9KTtcbiAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gIHJldHVybiBkYXRhO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgVG9nZ2xlIGhlbHBlcnMgKGNhbGxlZCBieSBpbmxpbmUgb25jbGljaykgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIHRvZ2dsZUhhcnZlc3RTZWN0aW9uKGlkKSB7XG4gIGNvbnN0IGVsICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gIGNvbnN0IGljb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtpZH0taWNvbmApO1xuICBpZiAoIWVsKSByZXR1cm47XG4gIGNvbnN0IGhpZGRlbiA9IGVsLnN0eWxlLmRpc3BsYXkgPT09ICdub25lJztcbiAgZWwuc3R5bGUuZGlzcGxheSA9IGhpZGRlbiA/ICcnIDogJ25vbmUnO1xuICBpZiAoaWNvbikgaWNvbi50ZXh0Q29udGVudCA9IGhpZGRlbiA/ICdcdTI1QkUnIDogJ1x1MjVCOCc7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBNYWluIGVudHJ5IHBvaW50cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gcG9wdWxhdGVIYXJ2ZXN0VGFiKCkge1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgaWYgKCFjb250ZW50KSByZXR1cm47XG5cbiAgY29udGVudC5pbm5lckhUTUwgPSBgXG4gICAgPGgxPlx1RDgzQ1x1REYzRSBIYXJ2ZXN0IEltcHJvdmVtZW50czwvaDE+XG4gICAgPGRpdiBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO3BhZGRpbmc6NDBweDtcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJsb2FkaW5nLXNwaW5uZXJcIj48L2Rpdj5cbiAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDttYXJnaW4tdG9wOjEycHg7XCI+TG9hZGluZyBjYW5kaWRhdGVzIGFuZCBydW5uaW5nIExMTSBhbmFseXNpc1x1MjAyNjwvcD5cbiAgICA8L2Rpdj5gO1xuXG4gIGxldCBjYW5kaWRhdGVzID0gW107XG4gIGxldCBhbmFseXNpc09rID0gZmFsc2U7XG4gIGxldCBhbmFseXNlcyAgID0gW107XG4gIGxldCBhbmFseXNpc0Vycm9yID0gbnVsbDtcblxuICB0cnkge1xuICAgIGNvbnN0IGNhbmREYXRhID0gYXdhaXQgZmV0Y2hDYW5kaWRhdGVzKCk7XG4gICAgaWYgKCFjYW5kRGF0YS5vaykge1xuICAgICAgY29udGVudC5pbm5lckhUTUwgPSBgPGgxPlx1RDgzQ1x1REYzRSBIYXJ2ZXN0IEltcHJvdmVtZW50czwvaDE+PHAgY2xhc3M9XCJlcnJvci1tZXNzYWdlXCI+RmFpbGVkIHRvIGxvYWQgY2FuZGlkYXRlczogJHtlc2MoY2FuZERhdGEuZXJyb3IgfHwgJ1Vua25vd24gZXJyb3InKX08L3A+YDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY2FuZGlkYXRlcyA9IGNhbmREYXRhLmNhbmRpZGF0ZXMgfHwgW107XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy5lcnJvcigncG9wdWxhdGVIYXJ2ZXN0VGFiOiBjYW5kaWRhdGVzIGZldGNoIGZhaWxlZCcsIGVycik7XG4gICAgY29udGVudC5pbm5lckhUTUwgPSBgPGgxPlx1RDgzQ1x1REYzRSBIYXJ2ZXN0IEltcHJvdmVtZW50czwvaDE+PHAgY2xhc3M9XCJlcnJvci1tZXNzYWdlXCI+TmV0d29yayBlcnJvciBsb2FkaW5nIGNhbmRpZGF0ZXMuPC9wPmA7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGNhbmRpZGF0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgY29udGVudC5pbm5lckhUTUwgPSByZW5kZXJFbXB0eVN0YXRlSHRtbCgpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgYW5hbHlzaXNEYXRhID0gYXdhaXQgZmV0Y2hBbmFseXNpcyhmYWxzZSk7XG4gICAgaWYgKGFuYWx5c2lzRGF0YS5vaykge1xuICAgICAgYW5hbHlzaXNPayA9IHRydWU7XG4gICAgICBhbmFseXNlcyAgID0gYW5hbHlzaXNEYXRhLmFuYWx5c2VzIHx8IFtdO1xuICAgIH0gZWxzZSB7XG4gICAgICBhbmFseXNpc0Vycm9yID0gYW5hbHlzaXNEYXRhLmVycm9yIHx8ICdBbmFseXNpcyBmYWlsZWQnO1xuICAgICAgbG9nLndhcm4oJ3BvcHVsYXRlSGFydmVzdFRhYjogYW5hbHlzaXMgbm90IG9rJywgYW5hbHlzaXNFcnJvcik7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cuZXJyb3IoJ3BvcHVsYXRlSGFydmVzdFRhYjogYW5hbHlzaXMgZmV0Y2ggZmFpbGVkJywgZXJyKTtcbiAgICBhbmFseXNpc0Vycm9yID0gZXJyLm1lc3NhZ2U7XG4gIH1cblxuICBjb25zdCBhbmFseXNlc0J5SWQgPSBPYmplY3QuZnJvbUVudHJpZXMoYW5hbHlzZXMubWFwKGEgPT4gW2EuaWQsIGFdKSk7XG4gIGNvbnN0IGVucmljaGVkID0gY2FuZGlkYXRlcy5tYXAoYyA9PiAoe1xuICAgIC4uLmMsXG4gICAgcmVjb21tZW5kYXRpb246ICAgIGFuYWx5c2VzQnlJZFtjLmlkXT8ucmVjb21tZW5kYXRpb24gPz8gbnVsbCxcbiAgICBjb25maWRlbmNlOiAgICAgICAgYW5hbHlzZXNCeUlkW2MuaWRdPy5jb25maWRlbmNlICAgICA/PyBudWxsLFxuICAgIHJlYXNvbmluZzogICAgICAgICBhbmFseXNlc0J5SWRbYy5pZF0/LnJlYXNvbmluZyAgICAgID8/IG51bGwsXG4gICAgYW5hbHlzaXNBdmFpbGFibGU6IGFuYWx5c2lzT2ssXG4gIH0pKTtcblxuICBjb250ZW50LmlubmVySFRNTCA9IHJlbmRlckhhcnZlc3RUYWJIdG1sKGVucmljaGVkLCBhbmFseXNpc09rLCBhbmFseXNpc0Vycm9yKTtcbiAgYXR0YWNoUHJvcG9zYWxSb3dMaXN0ZW5lcnMoY29udGVudCwgJ2hhcnZlc3QnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVmcmVzaEhhcnZlc3RBbmFseXNpcygpIHtcbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIGlmICghY29udGVudCkgcmV0dXJuO1xuXG4gIC8vIFNob3cgc3Bpbm5lciBpbmxpbmUgd2hpbGUgcmUtZmV0Y2hpbmdcbiAgY29uc3QgYXBwbHlCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGFydmVzdC1hcHBseS1idG4nKTtcbiAgaWYgKGFwcGx5QnRuKSBhcHBseUJ0bi5kaXNhYmxlZCA9IHRydWU7XG5cbiAgLy8gUmUtcnVuIGZ1bGwgcG9wdWxhdGUgd2l0aCBmb3JjZSByZWZyZXNoXG4gIHRyeSB7XG4gICAgY29uc3QgY2FuZERhdGEgPSBhd2FpdCBmZXRjaENhbmRpZGF0ZXMoKTtcbiAgICBjb25zdCBjYW5kaWRhdGVzID0gKGNhbmREYXRhLm9rICYmIGNhbmREYXRhLmNhbmRpZGF0ZXMpID8gY2FuZERhdGEuY2FuZGlkYXRlcyA6IFtdO1xuXG4gICAgaWYgKGNhbmRpZGF0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb250ZW50LmlubmVySFRNTCA9IHJlbmRlckVtcHR5U3RhdGVIdG1sKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGFuYWx5c2lzT2sgPSBmYWxzZTtcbiAgICBsZXQgYW5hbHlzZXMgICA9IFtdO1xuICAgIGxldCBhbmFseXNpc0Vycm9yID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYW5hbHlzaXNEYXRhID0gYXdhaXQgZmV0Y2hBbmFseXNpcyh0cnVlKTtcbiAgICAgIGlmIChhbmFseXNpc0RhdGEub2spIHtcbiAgICAgICAgYW5hbHlzaXNPayA9IHRydWU7XG4gICAgICAgIGFuYWx5c2VzICAgPSBhbmFseXNpc0RhdGEuYW5hbHlzZXMgfHwgW107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhbmFseXNpc0Vycm9yID0gYW5hbHlzaXNEYXRhLmVycm9yIHx8ICdBbmFseXNpcyBmYWlsZWQnO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgYW5hbHlzaXNFcnJvciA9IGVyci5tZXNzYWdlO1xuICAgIH1cblxuICAgIGNvbnN0IGFuYWx5c2VzQnlJZCA9IE9iamVjdC5mcm9tRW50cmllcyhhbmFseXNlcy5tYXAoYSA9PiBbYS5pZCwgYV0pKTtcbiAgICBjb25zdCBlbnJpY2hlZCA9IGNhbmRpZGF0ZXMubWFwKGMgPT4gKHtcbiAgICAgIC4uLmMsXG4gICAgICByZWNvbW1lbmRhdGlvbjogICAgYW5hbHlzZXNCeUlkW2MuaWRdPy5yZWNvbW1lbmRhdGlvbiA/PyBudWxsLFxuICAgICAgY29uZmlkZW5jZTogICAgICAgIGFuYWx5c2VzQnlJZFtjLmlkXT8uY29uZmlkZW5jZSAgICAgPz8gbnVsbCxcbiAgICAgIHJlYXNvbmluZzogICAgICAgICBhbmFseXNlc0J5SWRbYy5pZF0/LnJlYXNvbmluZyAgICAgID8/IG51bGwsXG4gICAgICBhbmFseXNpc0F2YWlsYWJsZTogYW5hbHlzaXNPayxcbiAgICB9KSk7XG5cbiAgICBjb250ZW50LmlubmVySFRNTCA9IHJlbmRlckhhcnZlc3RUYWJIdG1sKGVucmljaGVkLCBhbmFseXNpc09rLCBhbmFseXNpc0Vycm9yKTtcbiAgICBhdHRhY2hQcm9wb3NhbFJvd0xpc3RlbmVycyhjb250ZW50LCAnaGFydmVzdCcpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cuZXJyb3IoJ3JlZnJlc2hIYXJ2ZXN0QW5hbHlzaXM6IGZhaWxlZCcsIGVycik7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gYXBwbHlIYXJ2ZXN0U2VsZWN0aW9ucygpIHtcbiAgY29uc3QgY2hlY2tib3hlcyAgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtkYXRhLWhhcnZlc3QtaWRdOmNoZWNrZWQnKTtcbiAgY29uc3Qgc2VsZWN0ZWRJZHMgPSBBcnJheS5mcm9tKGNoZWNrYm94ZXMpLm1hcChjYiA9PiBjYi5kYXRhc2V0LmhhcnZlc3RJZCk7XG4gIGNvbnN0IHJlc3VsdERpdiAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hhcnZlc3QtcmVzdWx0Jyk7XG4gIGNvbnN0IGFwcGx5QnRuICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hhcnZlc3QtYXBwbHktYnRuJyk7XG5cbiAgaWYgKHNlbGVjdGVkSWRzLmxlbmd0aCA9PT0gMCkge1xuICAgIGlmIChyZXN1bHREaXYpIHJlc3VsdERpdi5pbm5lckhUTUwgPSAnPHAgc3R5bGU9XCJjb2xvcjojYjQ1MzA5O1wiPk5vIGl0ZW1zIHNlbGVjdGVkLjwvcD4nO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0ICh0eXBlb2Ygc2hvd0NvbmZpcm1Nb2RhbCA9PT0gJ2Z1bmN0aW9uJ1xuICAgID8gc2hvd0NvbmZpcm1Nb2RhbChcbiAgICAgICAgYFByb21vdGUgJHtzZWxlY3RlZElkcy5sZW5ndGh9IGl0ZW0ke3NlbGVjdGVkSWRzLmxlbmd0aCAhPT0gMSA/ICdzJyA6ICcnfSB0byBtYXN0ZXIgQ1Y/YCxcbiAgICAgICAgJ1RoaXMgd2lsbCBwZXJtYW5lbnRseSB3cml0ZSBjaGFuZ2VzIHRvIHlvdXIgTWFzdGVyX0NWX0RhdGEuanNvbi4gQSBiYWNrdXAgd2lsbCBiZSBjcmVhdGVkIGZpcnN0LicsXG4gICAgICApXG4gICAgOiBQcm9taXNlLnJlc29sdmUod2luZG93LmNvbmZpcm0oYFByb21vdGUgJHtzZWxlY3RlZElkcy5sZW5ndGh9IGl0ZW0ocykgdG8gbWFzdGVyIENWP1xcblxcblRoaXMgd2lsbCBwZXJtYW5lbnRseSB3cml0ZSBjaGFuZ2VzIHRvIHlvdXIgTWFzdGVyX0NWX0RhdGEuanNvbi5gKSkpO1xuXG4gIGlmICghY29uZmlybWVkKSByZXR1cm47XG5cbiAgaWYgKGFwcGx5QnRuKSB7IGFwcGx5QnRuLmRpc2FibGVkID0gdHJ1ZTsgYXBwbHlCdG4udGV4dENvbnRlbnQgPSAnQXBwbHlpbmdcdTIwMjYnOyB9XG4gIGlmIChyZXN1bHREaXYpIHJlc3VsdERpdi5pbm5lckhUTUwgPSAnJztcblxuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9oYXJ2ZXN0L2FwcGx5Jywge1xuICAgICAgbWV0aG9kOiAgJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiAgICBKU09OLnN0cmluZ2lmeSh7IHNlbGVjdGVkX2lkczogc2VsZWN0ZWRJZHMgfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG5cbiAgICBpZiAoIWRhdGEub2spIHtcbiAgICAgIGlmIChyZXN1bHREaXYpIHJlc3VsdERpdi5pbm5lckhUTUwgPSBgPHAgY2xhc3M9XCJlcnJvci1tZXNzYWdlXCI+QXBwbHkgZmFpbGVkOiAke2VzYyhkYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yJyl9PC9wPmA7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgd3JpdHRlbkNvdW50ID0gZGF0YS53cml0dGVuX2NvdW50ID8/IDA7XG4gICAgY29uc3QgY29tbWl0SGFzaCAgID0gZGF0YS5jb21taXRfaGFzaCAgID8gYCAoY29tbWl0ICR7ZXNjKGRhdGEuY29tbWl0X2hhc2gpfSlgIDogJyc7XG4gICAgY29uc3QgYmFja3VwTm90ZSAgID0gZGF0YS5iYWNrdXBfcGF0aCAgID8gYCBCYWNrdXAgc2F2ZWQgdG8gPGNvZGU+JHtlc2MoZGF0YS5iYWNrdXBfcGF0aCl9PC9jb2RlPi5gIDogJyc7XG4gICAgY29uc3QgZ2l0V2FybmluZyAgID0gZGF0YS5naXRfZXJyb3JcbiAgICAgID8gYDxwIHN0eWxlPVwiY29sb3I6I2I0NTMwOTtmb250LXNpemU6MC44N2VtO1wiPlx1MjZBMFx1RkUwRiBHaXQgY29tbWl0IHNraXBwZWQ6ICR7ZXNjKGRhdGEuZ2l0X2Vycm9yPy5tZXNzYWdlIHx8IGRhdGEuZ2l0X2Vycm9yKX08L3A+YFxuICAgICAgOiAnJztcblxuICAgIGlmIChyZXN1bHREaXYpIHtcbiAgICAgIHJlc3VsdERpdi5pbm5lckhUTUwgPSBgXG4gICAgICAgIDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmMGZkZjQ7Ym9yZGVyOjFweCBzb2xpZCAjODZlZmFjO2JvcmRlci1yYWRpdXM6NnB4O3BhZGRpbmc6MTJweCAxNnB4O1wiPlxuICAgICAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzE2NjUzNDtmb250LXdlaWdodDo2MDA7bWFyZ2luOjAgMCA0cHg7XCI+XG4gICAgICAgICAgICBcdTI3MDUgJHt3cml0dGVuQ291bnR9IGl0ZW0ke3dyaXR0ZW5Db3VudCAhPT0gMSA/ICdzJyA6ICcnfSB3cml0dGVuIHRvIG1hc3RlciBDViR7Y29tbWl0SGFzaH0uXG4gICAgICAgICAgPC9wPlxuICAgICAgICAgICR7YmFja3VwTm90ZSA/IGA8cCBzdHlsZT1cImZvbnQtc2l6ZTowLjgyZW07Y29sb3I6IzZiNzI4MDttYXJnaW46NHB4IDAgMDtcIj4ke2JhY2t1cE5vdGV9PC9wPmAgOiAnJ31cbiAgICAgICAgICAke2dpdFdhcm5pbmd9XG4gICAgICAgIDwvZGl2PmA7XG4gICAgfVxuXG4gICAgLy8gRGlzYWJsZSBjaGVja2JveGVzIGZvciBhcHBsaWVkIGl0ZW1zXG4gICAgZm9yIChjb25zdCBpZCBvZiBzZWxlY3RlZElkcykge1xuICAgICAgY29uc3QgY2IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgaGFydmVzdC1jaGstJHtpZH1gKTtcbiAgICAgIGlmIChjYikgeyBjYi5kaXNhYmxlZCA9IHRydWU7IGNiLmNoZWNrZWQgPSBmYWxzZTsgfVxuICAgICAgY29uc3Qgcm93ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYGhhcnZlc3Qtcm93LSR7aWR9YCk7XG4gICAgICBpZiAocm93KSByb3cuc3R5bGUub3BhY2l0eSA9ICcwLjQ1JztcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy5lcnJvcignYXBwbHlIYXJ2ZXN0U2VsZWN0aW9uczogZmFpbGVkJywgZXJyKTtcbiAgICBpZiAocmVzdWx0RGl2KSByZXN1bHREaXYuaW5uZXJIVE1MID0gYDxwIGNsYXNzPVwiZXJyb3ItbWVzc2FnZVwiPk5ldHdvcmsgZXJyb3I6ICR7ZXNjKGVyci5tZXNzYWdlKX08L3A+YDtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoYXBwbHlCdG4pIHsgYXBwbHlCdG4uZGlzYWJsZWQgPSBmYWxzZTsgYXBwbHlCdG4udGV4dENvbnRlbnQgPSAnXHUyNzA1IEFwcGx5IFNlbGVjdGVkIHRvIE1hc3RlciBDVic7IH1cbiAgfVxufVxuXG5leHBvcnQgeyBwb3B1bGF0ZUhhcnZlc3RUYWIsIGFwcGx5SGFydmVzdFNlbGVjdGlvbnMsIHJlZnJlc2hIYXJ2ZXN0QW5hbHlzaXMsIHRvZ2dsZUhhcnZlc3RTZWN0aW9uIH07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9zZXNzaW9uLXN3aXRjaGVyLXVpLmpzXG4gKiBTZXNzaW9uIG1hbmFnZW1lbnQgbW9kYWwsIHRyYXNoIHZpZXcsIGFuZCBvd25lcnNoaXAgY29uZmxpY3QgZGlhbG9nLlxuICpcbiAqIFRoZSBzZXNzaW9uLWNvbmZsaWN0IHJldHJ5IGJhbm5lciAoc2hvd1Nlc3Npb25Db25mbGljdEJhbm5lci9cbiAqIGNvbmZsaWN0UmV0cnlOb3cvY29uZmxpY3REaXNtaXNzKSBsaXZlcyBpbiB3ZWIvZmV0Y2gtdXRpbHMuanMsIHdoaWNoIG93bnNcbiAqIGhhbmRsZTQwOUNvbmZsaWN0ICh0aGUgYWN0dWFsIHRyaWdnZXIpIFx1MjAxNCB0aGlzIGZpbGUgdXNlZCB0byBjYXJyeSBpdHMgb3duXG4gKiBieXRlLWZvci1ieXRlIGR1cGxpY2F0ZSB3aXRoIGEgc2VwYXJhdGUgcmV0cnkgcXVldWUvdGltZXIsIHdoaWNoIG1lYW50XG4gKiBjbGlja2luZyBcIlJldHJ5IE5vd1wiIGNvdWxkIHNpbGVudGx5IGRyYWluIHRoZSB3cm9uZyAoYWx3YXlzLWVtcHR5KSBxdWV1ZVxuICogZGVwZW5kaW5nIG9uIHdlYi9zcmMvbWFpbi5qcydzIG1vZHVsZSBsb2FkIG9yZGVyLCBuZXZlciBhY3R1YWxseVxuICogcmVzb2x2aW5nIHRoZSBwZW5kaW5nIHJldHJpZWQgcmVxdWVzdC4gUmVtb3ZlZDsgc2VlIHdlYi9mZXRjaC11dGlscy5qcy5cbiAqXG4gKiBEZXBlbmRlbmNpZXMgKHJlc29sdmVkIHRocm91Z2ggZ2xvYmFsVGhpcyBhdCBydW50aW1lKTpcbiAqICAgZXNjYXBlSHRtbCwgcGFyc2VTZXNzaW9uTGlzdFJlc3BvbnNlLCBmb3JtYXRTZXNzaW9uUGhhc2VMYWJlbCxcbiAqICAgZm9ybWF0U2Vzc2lvblRpbWVzdGFtcCwgYnVpbGRTZXNzaW9uU3dpdGNoZXJMYWJlbCxcbiAqICAgZ2V0QWN0aXZlU2Vzc2lvbk93bmVyc2hpcE1ldGEsIF9nZXRDdXJyZW50U2Vzc2lvbklkVmFsdWUsXG4gKiAgIGxvYWRTZXNzaW9uRmlsZSwgY3JlYXRlTmV3U2Vzc2lvbkFuZE5hdmlnYXRlLCBmZXRjaFN0YXR1cyxcbiAqICAgc2V0SW5pdGlhbEZvY3VzLCB0cmFwRm9jdXMsIHJlc3RvcmVGb2N1cywgY29uZmlybURpYWxvZ1xuICovXG5cbi8vIFx1MjUwMFx1MjUwMCBTb3J0IHN0YXRlICYgc2Vzc2lvbiBjYWNoZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmNvbnN0IF9TTV9TVE9SQUdFX0tFWSA9ICdjdl9zbV9zb3J0X2tleSc7XG5jb25zdCBfU01fU1RPUkFHRV9ESVIgPSAnY3Zfc21fc29ydF9kaXInO1xuXG5sZXQgX3NtU29ydEtleSA9ICgoKSA9PiB7IHRyeSB7IHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShfU01fU1RPUkFHRV9LRVkpIHx8ICdsYXN0TW9kaWZpZWQnOyB9IGNhdGNoIChfKSB7IHJldHVybiAnbGFzdE1vZGlmaWVkJzsgfSB9KSgpO1xubGV0IF9zbVNvcnREaXIgPSAoKCkgPT4geyB0cnkgeyByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oX1NNX1NUT1JBR0VfRElSKSB8fCAnZGVzYyc7ICAgICAgICAgfSBjYXRjaCAoXykgeyByZXR1cm4gJ2Rlc2MnOyAgICAgICAgIH0gfSkoKTtcblxubGV0IF9zbUFjdGl2ZUNhY2hlID0gW107XG5sZXQgX3NtU2F2ZWRDYWNoZSAgPSBbXTtcblxuLy8gXHUyNTAwXHUyNTAwIFJlbmRlciBoZWxwZXJzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBfcmVuZGVyQWN0aXZlU2Vzc2lvblJvd3MoYWN0aXZlU2Vzc2lvbnMpIHtcbiAgaWYgKCFhY3RpdmVTZXNzaW9ucy5sZW5ndGgpIHtcbiAgICByZXR1cm4gJzxwIGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1lbXB0eVwiPk5vIGFjdGl2ZSBpbi1tZW1vcnkgc2Vzc2lvbnMuPC9wPic7XG4gIH1cblxuICBjb25zdCBjdXJyZW50U2Vzc2lvbklkID0gX2dldEN1cnJlbnRTZXNzaW9uSWRWYWx1ZSgpO1xuXG4gIHJldHVybiBgPGRpdiBjbGFzcz1cInNlc3Npb24tc3dpdGNoZXItbGlzdFwiPiR7YWN0aXZlU2Vzc2lvbnMubWFwKHNlc3Npb24gPT4ge1xuICAgIGNvbnN0IG93bmVyc2hpcCA9IGdldEFjdGl2ZVNlc3Npb25Pd25lcnNoaXBNZXRhKHNlc3Npb24sIHsgY3VycmVudFNlc3Npb25JZCB9KTtcbiAgICBjb25zdCBvcGVuSHJlZiA9IGAvP3Nlc3Npb249JHtlbmNvZGVVUklDb21wb25lbnQoc2Vzc2lvbi5zZXNzaW9uX2lkIHx8ICcnKX1gO1xuICAgIGNvbnN0IGFjdGlvbkh0bWwgPSBvd25lcnNoaXAuaXNDdXJyZW50XG4gICAgICA/ICc8c3BhbiBjbGFzcz1cInNlc3Npb24tc3dpdGNoZXItYnRuXCIgYXJpYS1kaXNhYmxlZD1cInRydWVcIj5DdXJyZW50PC9zcGFuPidcbiAgICAgIDogYDxhIGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1saW5rXCIgaHJlZj1cIiR7b3BlbkhyZWZ9XCI+T3BlbjwvYT5gO1xuICAgIHJldHVybiBgXG4gICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1yb3dcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNlc3Npb24tc3dpdGNoZXItcm93LW1haW5cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1yb3ctdGl0bGVcIj5cbiAgICAgICAgICAgIDxzdHJvbmc+JHtlc2NhcGVIdG1sKHNlc3Npb24ucG9zaXRpb25fbmFtZSB8fCAnVW50aXRsZWQnKX08L3N0cm9uZz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2Vzc2lvbi1zdGF0dXMtcGlsbCAke293bmVyc2hpcC5jbGFzc05hbWV9XCI+PHNwYW4gY2xhc3M9XCJzZXNzaW9uLXN0YXR1cy1kb3RcIj48L3NwYW4+JHtlc2NhcGVIdG1sKG93bmVyc2hpcC5sYWJlbCl9PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLXJvdy1tZXRhXCI+XG4gICAgICAgICAgICAke2VzY2FwZUh0bWwoZm9ybWF0U2Vzc2lvblBoYXNlTGFiZWwoc2Vzc2lvbi5waGFzZSkpfSBcdTAwQjcgQ3JlYXRlZCAke2VzY2FwZUh0bWwoZm9ybWF0U2Vzc2lvblRpbWVzdGFtcChzZXNzaW9uLmNyZWF0ZWQpKX0gXHUwMEI3IExhc3QgbW9kaWZpZWQgJHtlc2NhcGVIdG1sKGZvcm1hdFNlc3Npb25UaW1lc3RhbXAoc2Vzc2lvbi5sYXN0X21vZGlmaWVkKSl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1hY3Rpb25zXCI+JHthY3Rpb25IdG1sfTwvZGl2PlxuICAgICAgPC9kaXY+YDtcbiAgfSkuam9pbignJyl9PC9kaXY+YDtcbn1cblxuZnVuY3Rpb24gX3JlbmRlclNhdmVkU2Vzc2lvblJvd3Moc2F2ZWRTZXNzaW9ucywgeyBpbmNsdWRlTWFuYWdlbWVudCA9IGZhbHNlIH0gPSB7fSkge1xuICBpZiAoIXNhdmVkU2Vzc2lvbnMubGVuZ3RoKSB7XG4gICAgcmV0dXJuICc8cCBjbGFzcz1cInNlc3Npb24tc3dpdGNoZXItZW1wdHlcIj5ObyBzYXZlZCBzZXNzaW9ucyBmb3VuZC48L3A+JztcbiAgfVxuXG4gIGZ1bmN0aW9uIF9jcmVhdGVkSXNvRnJvbVNlc3Npb25QYXRoKHNlc3Npb25QYXRoKSB7XG4gICAgaWYgKCFzZXNzaW9uUGF0aCkgcmV0dXJuICcnO1xuICAgIGNvbnN0IHBhdGhUZXh0ID0gU3RyaW5nKHNlc3Npb25QYXRoKTtcbiAgICBjb25zdCBwYXJ0cyA9IHBhdGhUZXh0LnNwbGl0KC9bXFxcXC9dLykuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGlmIChwYXJ0cy5sZW5ndGggPCAyKSByZXR1cm4gJyc7XG5cbiAgICBjb25zdCBkaXJOYW1lID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMl07XG4gICAgY29uc3QgbWF0Y2ggPSBkaXJOYW1lLm1hdGNoKC8oXFxkezR9KShcXGR7Mn0pKFxcZHsyfSlbXy1dPyhcXGR7Mn0pKFxcZHsyfSkoXFxkezJ9KS8pO1xuICAgIGlmICghbWF0Y2gpIHJldHVybiAnJztcblxuICAgIGNvbnN0IFssIHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kXSA9IG1hdGNoO1xuICAgIHJldHVybiBgJHt5ZWFyfS0ke21vbnRofS0ke2RheX1UJHtob3VyfToke21pbnV0ZX06JHtzZWNvbmR9WmA7XG4gIH1cblxuICByZXR1cm4gYDxkaXYgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLWxpc3RcIj4ke3NhdmVkU2Vzc2lvbnMubWFwKChzZXNzaW9uLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IGVzY2FwZWRQYXRoID0gZXNjYXBlSHRtbChzZXNzaW9uLnBhdGggfHwgJycpO1xuICAgIGNvbnN0IGNyZWF0ZWRJc28gPSBfY3JlYXRlZElzb0Zyb21TZXNzaW9uUGF0aChzZXNzaW9uLnBhdGgpO1xuICAgIGNvbnN0IGNyZWF0ZWRMYWJlbCA9IGNyZWF0ZWRJc28gPyBmb3JtYXRTZXNzaW9uVGltZXN0YW1wKGNyZWF0ZWRJc28pIDogJ1x1MjAxNCc7XG4gICAgY29uc3Qgc2F2ZWRMYWJlbCA9IGZvcm1hdFNlc3Npb25UaW1lc3RhbXAoc2Vzc2lvbi50aW1lc3RhbXApO1xuICAgIGNvbnN0IHNhdmVkTWV0YSA9IHNhdmVkTGFiZWwgPT09ICdcdTIwMTQnID8gJycgOiBgIFx1MDBCNyBTYXZlZCAke2VzY2FwZUh0bWwoc2F2ZWRMYWJlbCl9YDtcbiAgICBjb25zdCBtYW5hZ2VtZW50SHRtbCA9IGluY2x1ZGVNYW5hZ2VtZW50XG4gICAgICA/IGBcbiAgICAgICAgPGJ1dHRvbiBkYXRhLXNtLWFjdGlvbj1cInJlbmFtZVwiIGRhdGEtc20tcGF0aD1cIiR7ZXNjYXBlZFBhdGh9XCIgZGF0YS1zbS1pZHg9XCIke2luZGV4fVwiIGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1idG5cIiB0aXRsZT1cIlJlbmFtZSBzZXNzaW9uXCI+UmVuYW1lPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gZGF0YS1zbS1hY3Rpb249XCJkZWxldGVcIiBkYXRhLXNtLXBhdGg9XCIke2VzY2FwZWRQYXRofVwiIGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1idG4gZGFuZ2VyXCIgdGl0bGU9XCJNb3ZlIHNlc3Npb24gdG8gVHJhc2hcIj5Nb3ZlIHRvIFRyYXNoPC9idXR0b24+YFxuICAgICAgOiAnJztcblxuICAgIHJldHVybiBgXG4gICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1yb3dcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNlc3Npb24tc3dpdGNoZXItcm93LW1haW5cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1yb3ctdGl0bGVcIj5cbiAgICAgICAgICAgIDxzdHJvbmcgaWQ9XCJzbS1uYW1lLSR7aW5kZXh9XCI+JHtlc2NhcGVIdG1sKHNlc3Npb24ucG9zaXRpb25fbmFtZSB8fCAnVW50aXRsZWQnKX08L3N0cm9uZz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2Vzc2lvbi1zdGF0dXMtcGlsbCBzZXNzaW9uLXN0YXR1cy1zYXZlZFwiPjxzcGFuIGNsYXNzPVwic2Vzc2lvbi1zdGF0dXMtZG90XCI+PC9zcGFuPlNhdmVkPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgaWQ9XCJzbS1yZW5hbWUtJHtpbmRleH1cIiBzdHlsZT1cImRpc3BsYXk6bm9uZTthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjZweDttYXJnaW46OHB4IDAgNHB4O1wiPlxuICAgICAgICAgICAgPGlucHV0IGlkPVwic20taW5wdXQtJHtpbmRleH1cIiB0eXBlPVwidGV4dFwiIHZhbHVlPVwiJHtlc2NhcGVIdG1sKHNlc3Npb24ucG9zaXRpb25fbmFtZSB8fCAnJyl9XCIgY2xhc3M9XCJzbS1rZXktaW5wdXRcIiBkYXRhLXNtLXBhdGg9XCIke2VzY2FwZWRQYXRofVwiIGRhdGEtc20taWR4PVwiJHtpbmRleH1cIiBzdHlsZT1cImJvcmRlcjoxcHggc29saWQgIzNiODJmNjtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjZweCAxMHB4O2ZvbnQtc2l6ZToxM3B4O2ZsZXg6MTttaW4td2lkdGg6MDtcIj5cbiAgICAgICAgICAgIDxidXR0b24gZGF0YS1zbS1hY3Rpb249XCJzdWJtaXQtcmVuYW1lXCIgZGF0YS1zbS1wYXRoPVwiJHtlc2NhcGVkUGF0aH1cIiBkYXRhLXNtLWlkeD1cIiR7aW5kZXh9XCIgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLWJ0blwiPlNhdmU8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gZGF0YS1zbS1hY3Rpb249XCJjYW5jZWwtcmVuYW1lXCIgZGF0YS1zbS1pZHg9XCIke2luZGV4fVwiIGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1idG5cIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1yb3ctbWV0YVwiPlxuICAgICAgICAgICAgJHtlc2NhcGVIdG1sKGZvcm1hdFNlc3Npb25QaGFzZUxhYmVsKHNlc3Npb24ucGhhc2UpKX0gXHUwMEI3IENyZWF0ZWQgJHtlc2NhcGVIdG1sKGNyZWF0ZWRMYWJlbCl9JHtzYXZlZE1ldGF9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1hY3Rpb25zXCI+XG4gICAgICAgICAgPGJ1dHRvbiBkYXRhLXNtLWFjdGlvbj1cImxvYWRcIiBkYXRhLXNtLXBhdGg9XCIke2VzY2FwZWRQYXRofVwiIGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1saW5rXCI+TG9hZDwvYnV0dG9uPlxuICAgICAgICAgICR7bWFuYWdlbWVudEh0bWx9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+YDtcbiAgfSkuam9pbignJyl9PC9kaXY+YDtcbn1cblxuZnVuY3Rpb24gX3JlbmRlclNlc3Npb25Td2l0Y2hlclNlY3Rpb25zKGFjdGl2ZVNlc3Npb25zLCBzYXZlZFNlc3Npb25zLCB7IGluY2x1ZGVTYXZlZE1hbmFnZW1lbnQgPSBmYWxzZSB9ID0ge30pIHtcbiAgY29uc3Qgc2F2ZWRTZWN0aW9uTm90ZSA9IGluY2x1ZGVTYXZlZE1hbmFnZW1lbnRcbiAgICA/ICdMb2FkIGZyb20gZGlzaywgcmVuYW1lLCBvciBtb3ZlIHNhdmVkIHdvcmsgdG8gVHJhc2guJ1xuICAgIDogJ0xvYWQgc2F2ZWQgd29yayBmcm9tIGRpc2suJztcblxuICByZXR1cm4gYFxuICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLXNlY3Rpb25zXCI+XG4gICAgICA8c2VjdGlvbiBjbGFzcz1cInNlc3Npb24tc3dpdGNoZXItc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1zZWN0aW9uLWhlYWRlclwiPlxuICAgICAgICAgIDxoMz5BY3RpdmUgU2Vzc2lvbnM8L2gzPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1zZWN0aW9uLW5vdGVcIj5Jbi1tZW1vcnkgc2Vzc2lvbnMgdGhhdCBjYW4gYmUgb3BlbmVkIGRpcmVjdGx5Ljwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgICR7X3JlbmRlckFjdGl2ZVNlc3Npb25Sb3dzKGFjdGl2ZVNlc3Npb25zKX1cbiAgICAgIDwvc2VjdGlvbj5cbiAgICAgIDxzZWN0aW9uIGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1zZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLXNlY3Rpb24taGVhZGVyXCI+XG4gICAgICAgICAgPGgzPlNhdmVkIFNlc3Npb25zPC9oMz5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlc3Npb24tc3dpdGNoZXItc2VjdGlvbi1ub3RlXCI+JHtzYXZlZFNlY3Rpb25Ob3RlfTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgICR7X3JlbmRlclNhdmVkU2Vzc2lvblJvd3Moc2F2ZWRTZXNzaW9ucywgeyBpbmNsdWRlTWFuYWdlbWVudDogaW5jbHVkZVNhdmVkTWFuYWdlbWVudCB9KX1cbiAgICAgIDwvc2VjdGlvbj5cbiAgICA8L2Rpdj5gO1xufVxuXG5mdW5jdGlvbiBfdXBkYXRlU2Vzc2lvblN3aXRjaGVySGVhZGVyKHN0YXR1cyA9IHt9KSB7XG4gIGNvbnN0IGxhYmVsID0gYnVpbGRTZXNzaW9uU3dpdGNoZXJMYWJlbChzdGF0dXMpO1xuICBjb25zdCBzd2l0Y2hlckxhYmVsRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2Vzc2lvbi1zd2l0Y2hlci1sYWJlbCcpO1xuICBjb25zdCBzd2l0Y2hlckJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXNzaW9uLXN3aXRjaGVyLWJ0bicpO1xuICBjb25zdCBzdWJ0aXRsZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWRlci1zZXNzaW9uLW5hbWUnKTtcbiAgY29uc3QgaGFzU2Vzc2lvbiA9IEJvb2xlYW4oX2dldEN1cnJlbnRTZXNzaW9uSWRWYWx1ZSgpKTtcblxuICBpZiAoc3dpdGNoZXJMYWJlbEVsKSBzd2l0Y2hlckxhYmVsRWwudGV4dENvbnRlbnQgPSBsYWJlbDtcbiAgaWYgKHN3aXRjaGVyQnRuKSBzd2l0Y2hlckJ0bi5jbGFzc0xpc3QudG9nZ2xlKCdpcy1zZXNzaW9uLWFjdGl2ZScsIGhhc1Nlc3Npb24pO1xuICBpZiAoc3VidGl0bGVFbCkge1xuICAgIHN1YnRpdGxlRWwudGV4dENvbnRlbnQgPSBoYXNTZXNzaW9uID8gYEN1cnJlbnQgc2Vzc2lvbjogJHtsYWJlbH1gIDogJ1NlbGVjdCBvciBjcmVhdGUgYSBzZXNzaW9uJztcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgT3duZXJzaGlwIGNvbmZsaWN0IGRpYWxvZyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gc2hvd093bmVyc2hpcENvbmZsaWN0RGlhbG9nKG1lc3NhZ2UgPSAnVGhpcyBzZXNzaW9uIGlzIGN1cnJlbnRseSBjbGFpbWVkIGJ5IGFub3RoZXIgYnJvd3NlciB0YWIuJykge1xuICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvd25lcnNoaXAtY29uZmxpY3Qtb3ZlcmxheScpO1xuICAgIGNvbnN0IG1lc3NhZ2VFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvd25lcnNoaXAtY29uZmxpY3QtbWVzc2FnZScpO1xuICAgIGNvbnN0IGxvYWREaWZmZXJlbnRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3duZXJzaGlwLWxvYWQtZGlmZmVyZW50LWJ0bicpO1xuICAgIGNvbnN0IG5ld1Nlc3Npb25CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3duZXJzaGlwLW5ldy1zZXNzaW9uLWJ0bicpO1xuICAgIGNvbnN0IHRha2VvdmVyQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ293bmVyc2hpcC10YWtlb3Zlci1idG4nKTtcbiAgICBpZiAoIW92ZXJsYXkgfHwgIW1lc3NhZ2VFbCB8fCAhbG9hZERpZmZlcmVudEJ0biB8fCAhbmV3U2Vzc2lvbkJ0biB8fCAhdGFrZW92ZXJCdG4pIHtcbiAgICAgIHJlc29sdmUoJ2RpZmZlcmVudCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNsZWFudXAgPSAoY2hvaWNlKSA9PiB7XG4gICAgICBvdmVybGF5LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICByZXN0b3JlRm9jdXMoKTtcbiAgICAgIGxvYWREaWZmZXJlbnRCdG4ub25jbGljayA9IG51bGw7XG4gICAgICBuZXdTZXNzaW9uQnRuLm9uY2xpY2sgPSBudWxsO1xuICAgICAgdGFrZW92ZXJCdG4ub25jbGljayA9IG51bGw7XG4gICAgICByZXNvbHZlKGNob2ljZSk7XG4gICAgfTtcblxuICAgIG1lc3NhZ2VFbC50ZXh0Q29udGVudCA9IG1lc3NhZ2U7XG4gICAgb3ZlcmxheS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICAgIHdpbmRvdy5fZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgc2V0SW5pdGlhbEZvY3VzKCdvd25lcnNoaXAtY29uZmxpY3Qtb3ZlcmxheScpO1xuICAgIHRyYXBGb2N1cygnb3duZXJzaGlwLWNvbmZsaWN0LW92ZXJsYXknKTtcblxuICAgIGxvYWREaWZmZXJlbnRCdG4ub25jbGljayA9ICgpID0+IGNsZWFudXAoJ2RpZmZlcmVudCcpO1xuICAgIG5ld1Nlc3Npb25CdG4ub25jbGljayA9ICgpID0+IGNsZWFudXAoJ25ldycpO1xuICAgIHRha2VvdmVyQnRuLm9uY2xpY2sgPSAoKSA9PiBjbGVhbnVwKCd0YWtlb3ZlcicpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gY2xvc2VPd25lcnNoaXBDb25mbGljdERpYWxvZyhjaG9pY2UgPSAnZGlmZmVyZW50Jykge1xuICBjb25zdCBvdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ293bmVyc2hpcC1jb25mbGljdC1vdmVybGF5Jyk7XG4gIGlmIChvdmVybGF5KSBvdmVybGF5LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHJlc3RvcmVGb2N1cygpO1xuICBjb25zdCBsb2FkRGlmZmVyZW50QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ293bmVyc2hpcC1sb2FkLWRpZmZlcmVudC1idG4nKTtcbiAgaWYgKGxvYWREaWZmZXJlbnRCdG4gJiYgdHlwZW9mIGxvYWREaWZmZXJlbnRCdG4ub25jbGljayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGxvYWREaWZmZXJlbnRCdG4ub25jbGljaygpO1xuICAgIHJldHVybjtcbiAgfVxuICByZXR1cm4gY2hvaWNlO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgU2Vzc2lvbiBmaWxlLWJyb3dzZXIgdGFibGUgaGVscGVycyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gX3NldFNtU29ydChrZXkpIHtcbiAgaWYgKF9zbVNvcnRLZXkgPT09IGtleSkge1xuICAgIF9zbVNvcnREaXIgPSBfc21Tb3J0RGlyID09PSAnYXNjJyA/ICdkZXNjJyA6ICdhc2MnO1xuICB9IGVsc2Uge1xuICAgIF9zbVNvcnRLZXkgPSBrZXk7XG4gICAgX3NtU29ydERpciA9IGtleSA9PT0gJ2xhc3RNb2RpZmllZCcgPyAnZGVzYycgOiAnYXNjJztcbiAgfVxuICB0cnkge1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKF9TTV9TVE9SQUdFX0tFWSwgX3NtU29ydEtleSk7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oX1NNX1NUT1JBR0VfRElSLCBfc21Tb3J0RGlyKTtcbiAgfSBjYXRjaCAoXykgeyAvKiBzdG9yYWdlIHVuYXZhaWxhYmxlICovIH1cbiAgX3JlbmRlclNlc3Npb25UYWJsZUZyb21DYWNoZSgpO1xufVxuXG5mdW5jdGlvbiBfY3JlYXRlZElzb0Zyb21TZXNzaW9uUGF0aChzZXNzaW9uUGF0aCkge1xuICBpZiAoIXNlc3Npb25QYXRoKSByZXR1cm4gJyc7XG4gIGNvbnN0IHBhdGhUZXh0ID0gU3RyaW5nKHNlc3Npb25QYXRoKTtcbiAgY29uc3QgcGFydHMgICAgPSBwYXRoVGV4dC5zcGxpdCgvW1xcXFwvXS8pLmZpbHRlcihCb29sZWFuKTtcbiAgaWYgKHBhcnRzLmxlbmd0aCA8IDIpIHJldHVybiAnJztcbiAgY29uc3QgZGlyTmFtZSAgPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAyXTtcbiAgY29uc3QgbWF0Y2ggICAgPSBkaXJOYW1lLm1hdGNoKC8oXFxkezR9KShcXGR7Mn0pKFxcZHsyfSlbXy1dPyhcXGR7Mn0pKFxcZHsyfSkoXFxkezJ9KS8pO1xuICBpZiAoIW1hdGNoKSByZXR1cm4gJyc7XG4gIGNvbnN0IFssIHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kXSA9IG1hdGNoO1xuICByZXR1cm4gYCR7eWVhcn0tJHttb250aH0tJHtkYXl9VCR7aG91cn06JHttaW51dGV9OiR7c2Vjb25kfVpgO1xufVxuXG5mdW5jdGlvbiBfbm9ybWFsaXplU2Vzc2lvbnNGb3JUYWJsZShhY3RpdmVTZXNzaW9ucywgc2F2ZWRTZXNzaW9ucykge1xuICBjb25zdCBjdXJyZW50U2Vzc2lvbklkID0gX2dldEN1cnJlbnRTZXNzaW9uSWRWYWx1ZSgpO1xuICBjb25zdCByb3dzID0gW107XG5cbiAgZm9yIChjb25zdCBzIG9mIGFjdGl2ZVNlc3Npb25zKSB7XG4gICAgY29uc3Qgb3duZXJzaGlwID0gZ2V0QWN0aXZlU2Vzc2lvbk93bmVyc2hpcE1ldGEocywgeyBjdXJyZW50U2Vzc2lvbklkIH0pO1xuICAgIHJvd3MucHVzaCh7XG4gICAgICB0eXBlOiAgICAgICAgICAgICAgJ2FjdGl2ZScsXG4gICAgICBuYW1lOiAgICAgICAgICAgICAgIHMucG9zaXRpb25fbmFtZSB8fCAnVW50aXRsZWQnLFxuICAgICAgY29tcGFueTogICAgICAgICAgICBzLmNvbXBhbnkgfHwgJycsXG4gICAgICBwaGFzZTogICAgICAgICAgICAgIHMucGhhc2UgICAgICAgICB8fCAnJyxcbiAgICAgIGFwcGxpY2F0aW9uU3RhdHVzOiAgcy5hcHBsaWNhdGlvbl9zdGF0dXMgfHwgJycsXG4gICAgICBhdHNTY29yZTogICAgICAgICAgIHMuYXRzX3Njb3JlID8/IG51bGwsXG4gICAgICBsYXN0TW9kaWZpZWQ6ICAgICAgIHMubGFzdF9tb2RpZmllZCAgPyBuZXcgRGF0ZShzLmxhc3RfbW9kaWZpZWQpIDogbnVsbCxcbiAgICAgIGNyZWF0ZWQ6ICAgICAgICAgICAgcy5jcmVhdGVkICAgICAgICA/IG5ldyBEYXRlKHMuY3JlYXRlZCkgICAgICAgOiBudWxsLFxuICAgICAgb3duZXJzaGlwLFxuICAgICAgc2Vzc2lvbklkOiAgICAgICAgICBzLnNlc3Npb25faWQsXG4gICAgICBwYXRoOiAgICAgICAgICAgICAgIG51bGwsXG4gICAgICBpZHg6ICAgICAgICAgICAgICAgIG51bGwsXG4gICAgfSk7XG4gIH1cblxuICBzYXZlZFNlc3Npb25zLmZvckVhY2goKHMsIGlkeCkgPT4ge1xuICAgIGNvbnN0IGNyZWF0ZWRJc28gPSBfY3JlYXRlZElzb0Zyb21TZXNzaW9uUGF0aChzLnBhdGgpO1xuICAgIHJvd3MucHVzaCh7XG4gICAgICB0eXBlOiAgICAgICAgICAgICAgJ3NhdmVkJyxcbiAgICAgIG5hbWU6ICAgICAgICAgICAgICAgcy5wb3NpdGlvbl9uYW1lIHx8ICdVbnRpdGxlZCcsXG4gICAgICBjb21wYW55OiAgICAgICAgICAgIHMuY29tcGFueSB8fCAnJyxcbiAgICAgIHBoYXNlOiAgICAgICAgICAgICAgcy5waGFzZSAgICAgICAgIHx8ICcnLFxuICAgICAgYXBwbGljYXRpb25TdGF0dXM6ICBzLmFwcGxpY2F0aW9uX3N0YXR1cyB8fCAnJyxcbiAgICAgIG5vdGVzOiAgICAgICAgICAgICAgcy5ub3RlcyB8fCAnJyxcbiAgICAgIGF0c1Njb3JlOiAgICAgICAgICAgcy5hdHNfc2NvcmUgPz8gbnVsbCxcbiAgICAgIGxhc3RNb2RpZmllZDogICAgICAgcy50aW1lc3RhbXAgID8gbmV3IERhdGUocy50aW1lc3RhbXApICA6IG51bGwsXG4gICAgICBjcmVhdGVkOiAgICAgICAgICAgIGNyZWF0ZWRJc28gICA/IG5ldyBEYXRlKGNyZWF0ZWRJc28pICAgOiBudWxsLFxuICAgICAgb3duZXJzaGlwOiAgICAgICAgICBudWxsLFxuICAgICAgc2Vzc2lvbklkOiAgICAgICAgICBudWxsLFxuICAgICAgcGF0aDogICAgICAgICAgICAgICBzLnBhdGgsXG4gICAgICBpZHgsXG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiByb3dzO1xufVxuXG5mdW5jdGlvbiBfc29ydFNlc3Npb25Sb3dzKHJvd3MsIGtleSwgZGlyKSB7XG4gIHJldHVybiBbLi4ucm93c10uc29ydCgoYSwgYikgPT4ge1xuICAgIGxldCBhdiwgYnY7XG4gICAgc3dpdGNoIChrZXkpIHtcbiAgICAgIGNhc2UgJ25hbWUnOlxuICAgICAgICBhdiA9IChhLm5hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGJ2ID0gKGIubmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgcmV0dXJuIGRpciA9PT0gJ2FzYycgPyBhdi5sb2NhbGVDb21wYXJlKGJ2KSA6IGJ2LmxvY2FsZUNvbXBhcmUoYXYpO1xuICAgICAgY2FzZSAnc3RhdHVzJzoge1xuICAgICAgICBjb25zdCByYW5rID0gciA9PiByLnR5cGUgPT09ICdhY3RpdmUnID8gKHIub3duZXJzaGlwPy5pc0N1cnJlbnQgPyAwIDogMSkgOiAyO1xuICAgICAgICBhdiA9IHJhbmsoYSk7IGJ2ID0gcmFuayhiKTtcbiAgICAgICAgcmV0dXJuIGRpciA9PT0gJ2FzYycgPyBhdiAtIGJ2IDogYnYgLSBhdjtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3BoYXNlJzpcbiAgICAgICAgYXYgPSAoYS5waGFzZSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgYnYgPSAoYi5waGFzZSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgcmV0dXJuIGRpciA9PT0gJ2FzYycgPyBhdi5sb2NhbGVDb21wYXJlKGJ2KSA6IGJ2LmxvY2FsZUNvbXBhcmUoYXYpO1xuICAgICAgY2FzZSAnbGFzdE1vZGlmaWVkJzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGF2ID0gYS5sYXN0TW9kaWZpZWQgPyBhLmxhc3RNb2RpZmllZC5nZXRUaW1lKCkgOiAwO1xuICAgICAgICBidiA9IGIubGFzdE1vZGlmaWVkID8gYi5sYXN0TW9kaWZpZWQuZ2V0VGltZSgpIDogMDtcbiAgICAgICAgcmV0dXJuIGRpciA9PT0gJ2FzYycgPyBhdiAtIGJ2IDogYnYgLSBhdjtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBfcmVuZGVyU2Vzc2lvblRhYmxlSGVhZGVyKCkge1xuICBjb25zdCBjb2xzID0gW1xuICAgIHsga2V5OiAnbmFtZScsICAgICAgICAgbGFiZWw6ICdOYW1lJyAgICAgfSxcbiAgICB7IGtleTogJ3N0YXR1cycsICAgICAgIGxhYmVsOiAnU3RhdHVzJyAgIH0sXG4gICAgeyBrZXk6ICdwaGFzZScsICAgICAgICBsYWJlbDogJ1BoYXNlJyAgICB9LFxuICAgIHsga2V5OiAnbGFzdE1vZGlmaWVkJywgbGFiZWw6ICdNb2RpZmllZCcgfSxcbiAgXTtcbiAgY29uc3QgY2VsbHMgPSBjb2xzLm1hcCgoeyBrZXksIGxhYmVsIH0pID0+IHtcbiAgICBjb25zdCBhY3RpdmUgPSBfc21Tb3J0S2V5ID09PSBrZXk7XG4gICAgY29uc3QgaWNvbiAgID0gYWN0aXZlID8gKF9zbVNvcnREaXIgPT09ICdhc2MnID8gJ1xcdTI1YjInIDogJ1xcdTI1YmMnKSA6ICdcXHUyMWM1JztcbiAgICByZXR1cm4gYDxzcGFuIGNsYXNzPVwic20tdGgke2FjdGl2ZSA/ICcgc20tdGgtc29ydGVkJyA6ICcnfVwiIGRhdGEtc20tc29ydD1cIiR7a2V5fVwiIHJvbGU9XCJidXR0b25cIiB0YWJpbmRleD1cIjBcIiB0aXRsZT1cIlNvcnQgYnkgJHtsYWJlbH1cIj4ke2VzY2FwZUh0bWwobGFiZWwpfSA8c3BhbiBjbGFzcz1cInNtLXNvcnQtaWNvbiR7YWN0aXZlID8gJyBzbS1zb3J0LWFjdGl2ZScgOiAnJ31cIj4ke2ljb259PC9zcGFuPjwvc3Bhbj5gO1xuICB9KTtcbiAgcmV0dXJuIGA8ZGl2IGNsYXNzPVwic20tdGhlYWRcIj4ke2NlbGxzLmpvaW4oJycpfTxzcGFuIGNsYXNzPVwic20tdGggc20tdGgtYWN0aW9uc1wiPkFjdGlvbnM8L3NwYW4+PC9kaXY+YDtcbn1cblxuZnVuY3Rpb24gX2ZtdERhdGVDb21wYWN0KGQpIHtcbiAgaWYgKCFkKSByZXR1cm4gJ1xcdTIwMTQnO1xuICB0cnkge1xuICAgIHJldHVybiBkLnRvTG9jYWxlU3RyaW5nKCdlbi1VUycsIHtcbiAgICAgIG1vbnRoOiAnbnVtZXJpYycsIGRheTogJ251bWVyaWMnLCB5ZWFyOiAnMi1kaWdpdCcsXG4gICAgICBob3VyOiAnbnVtZXJpYycsIG1pbnV0ZTogJzItZGlnaXQnLFxuICAgIH0pO1xuICB9IGNhdGNoIChfKSB7IHJldHVybiAnXFx1MjAxNCc7IH1cbn1cblxuZnVuY3Rpb24gX3JlbmRlclNlc3Npb25UYWJsZVJvdyhyb3cpIHtcbiAgY29uc3QgcGhhc2VMYWJlbCA9IGVzY2FwZUh0bWwoZm9ybWF0U2Vzc2lvblBoYXNlTGFiZWwocm93LnBoYXNlKSk7XG4gIGNvbnN0IG1vZExhYmVsICAgPSBlc2NhcGVIdG1sKF9mbXREYXRlQ29tcGFjdChyb3cubGFzdE1vZGlmaWVkKSk7XG5cbiAgY29uc3Qgc3RhdHVzUGlsbCA9IHJvdy50eXBlID09PSAnYWN0aXZlJ1xuICAgID8gYDxzcGFuIGNsYXNzPVwic2Vzc2lvbi1zdGF0dXMtcGlsbCAke3Jvdy5vd25lcnNoaXAuY2xhc3NOYW1lfVwiPjxzcGFuIGNsYXNzPVwic2Vzc2lvbi1zdGF0dXMtZG90XCI+PC9zcGFuPiR7ZXNjYXBlSHRtbChyb3cub3duZXJzaGlwLmxhYmVsKX08L3NwYW4+YFxuICAgIDogYDxzcGFuIGNsYXNzPVwic2Vzc2lvbi1zdGF0dXMtcGlsbCBzZXNzaW9uLXN0YXR1cy1zYXZlZFwiPjxzcGFuIGNsYXNzPVwic2Vzc2lvbi1zdGF0dXMtZG90XCI+PC9zcGFuPlNhdmVkPC9zcGFuPmA7XG5cbiAgbGV0IGFjdGlvbkh0bWw7XG4gIGlmIChyb3cudHlwZSA9PT0gJ2FjdGl2ZScpIHtcbiAgICBjb25zdCBocmVmID0gYC8/c2Vzc2lvbj0ke2VuY29kZVVSSUNvbXBvbmVudChyb3cuc2Vzc2lvbklkIHx8ICcnKX1gO1xuICAgIGFjdGlvbkh0bWwgPSByb3cub3duZXJzaGlwLmlzQ3VycmVudFxuICAgICAgPyAnPHNwYW4gY2xhc3M9XCJzbS1idG4gc20tYnRuLWRpc2FibGVkXCIgYXJpYS1kaXNhYmxlZD1cInRydWVcIj5DdXJyZW50PC9zcGFuPidcbiAgICAgIDogYDxhIGNsYXNzPVwic20tYnRuIHNtLWJ0bi1vcGVuXCIgaHJlZj1cIiR7aHJlZn1cIj5PcGVuPC9hPmA7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZXAgID0gZXNjYXBlSHRtbChyb3cucGF0aCB8fCAnJyk7XG4gICAgY29uc3QgaWR4ID0gcm93LmlkeDtcbiAgICBhY3Rpb25IdG1sID1cbiAgICAgIGA8YnV0dG9uIGRhdGEtc20tYWN0aW9uPVwibG9hZFwiICAgZGF0YS1zbS1wYXRoPVwiJHtlcH1cIiBjbGFzcz1cInNtLWJ0biBzbS1idG4tb3BlbiBzbS1idG4taWNvblwiIHRpdGxlPVwiTG9hZCBzZXNzaW9uXCIgYXJpYS1sYWJlbD1cIkxvYWQgc2Vzc2lvblwiPjxpIGNsYXNzPVwiZmEtc29saWQgZmEtZm9sZGVyLW9wZW5cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+PC9idXR0b24+YCArXG4gICAgICBgPGJ1dHRvbiBkYXRhLXNtLWFjdGlvbj1cInJlbmFtZVwiIGRhdGEtc20tcGF0aD1cIiR7ZXB9XCIgZGF0YS1zbS1pZHg9XCIke2lkeH1cIiBjbGFzcz1cInNtLWJ0biBzbS1idG4taWNvblwiIHRpdGxlPVwiUmVuYW1lIHNlc3Npb25cIiBhcmlhLWxhYmVsPVwiUmVuYW1lIHNlc3Npb25cIj48aSBjbGFzcz1cImZhLXNvbGlkIGZhLXBlbmNpbFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT48L2J1dHRvbj5gICtcbiAgICAgIGA8YnV0dG9uIGRhdGEtc20tYWN0aW9uPVwiZHVwbGljYXRlXCIgZGF0YS1zbS1wYXRoPVwiJHtlcH1cIiBjbGFzcz1cInNtLWJ0biBzbS1idG4taWNvblwiIHRpdGxlPVwiRHVwbGljYXRlIHNlc3Npb25cIiBhcmlhLWxhYmVsPVwiRHVwbGljYXRlIHNlc3Npb25cIj48aSBjbGFzcz1cImZhLXNvbGlkIGZhLWNvcHlcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+PC9idXR0b24+YCArXG4gICAgICBgPGJ1dHRvbiBkYXRhLXNtLWFjdGlvbj1cImRlbGV0ZVwiIGRhdGEtc20tcGF0aD1cIiR7ZXB9XCIgY2xhc3M9XCJzbS1idG4gc20tYnRuLWRhbmdlciBzbS1idG4taWNvblwiIHRpdGxlPVwiTW92ZSB0byBUcmFzaFwiIGFyaWEtbGFiZWw9XCJNb3ZlIHNlc3Npb24gdG8gVHJhc2hcIj48aSBjbGFzcz1cImZhLXNvbGlkIGZhLXRyYXNoXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPjwvYnV0dG9uPmA7XG4gIH1cblxuICBjb25zdCByb3dDbGFzcyA9IChyb3cudHlwZSA9PT0gJ2FjdGl2ZScgJiYgcm93Lm93bmVyc2hpcC5pc0N1cnJlbnQpID8gJ3NtLXRyIHNtLXRyLWN1cnJlbnQnIDogJ3NtLXRyJztcblxuICBjb25zdCBjb21wYW55U3ViID0gcm93LmNvbXBhbnlcbiAgICA/IGA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuOGVtO2NvbG9yOiM5NGEzYjg7bWFyZ2luLXRvcDoxcHg7XCI+JHtlc2NhcGVIdG1sKHJvdy5jb21wYW55KX08L2Rpdj5gXG4gICAgOiAnJztcbiAgY29uc3QgbmFtZUNlbGwgPSByb3cudHlwZSA9PT0gJ3NhdmVkJ1xuICAgID8gYDxzcGFuIGlkPVwic20tbmFtZS0ke3Jvdy5pZHh9XCI+JHtlc2NhcGVIdG1sKHJvdy5uYW1lKX08L3NwYW4+YCArXG4gICAgICBgJHtjb21wYW55U3VifWAgK1xuICAgICAgYDxzcGFuIGlkPVwic20tcmVuYW1lLSR7cm93LmlkeH1cIiBzdHlsZT1cImRpc3BsYXk6bm9uZTthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjRweDttYXJnaW4tdG9wOjNweDtcIj5gICtcbiAgICAgICAgYDxpbnB1dCBpZD1cInNtLWlucHV0LSR7cm93LmlkeH1cIiB0eXBlPVwidGV4dFwiIHZhbHVlPVwiJHtlc2NhcGVIdG1sKHJvdy5uYW1lKX1cIiBjbGFzcz1cInNtLWtleS1pbnB1dFwiYCArXG4gICAgICAgICAgYCBkYXRhLXNtLXBhdGg9XCIke2VzY2FwZUh0bWwocm93LnBhdGggfHwgJycpfVwiIGRhdGEtc20taWR4PVwiJHtyb3cuaWR4fVwiYCArXG4gICAgICAgICAgYCBzdHlsZT1cImJvcmRlcjoxcHggc29saWQgIzNiODJmNjtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjNweCA4cHg7Zm9udC1zaXplOjEycHg7ZmxleDoxO21pbi13aWR0aDo2MHB4O1wiPmAgK1xuICAgICAgICBgPGJ1dHRvbiBkYXRhLXNtLWFjdGlvbj1cInN1Ym1pdC1yZW5hbWVcIiBkYXRhLXNtLXBhdGg9XCIke2VzY2FwZUh0bWwocm93LnBhdGggfHwgJycpfVwiIGRhdGEtc20taWR4PVwiJHtyb3cuaWR4fVwiIGNsYXNzPVwic20tYnRuXCIgdGl0bGU9XCJTYXZlIHJlbmFtZVwiIGFyaWEtbGFiZWw9XCJTYXZlIHJlbmFtZVwiPlxcdTI3MTM8L2J1dHRvbj5gICtcbiAgICAgICAgYDxidXR0b24gZGF0YS1zbS1hY3Rpb249XCJjYW5jZWwtcmVuYW1lXCIgZGF0YS1zbS1pZHg9XCIke3Jvdy5pZHh9XCIgY2xhc3M9XCJzbS1idG5cIiB0aXRsZT1cIkNhbmNlbCByZW5hbWVcIiBhcmlhLWxhYmVsPVwiQ2FuY2VsIHJlbmFtZVwiPlxcdTI3MTU8L2J1dHRvbj5gICtcbiAgICAgIGA8L3NwYW4+YFxuICAgIDogYDxzcGFuPiR7ZXNjYXBlSHRtbChyb3cubmFtZSl9PC9zcGFuPiR7Y29tcGFueVN1Yn1gO1xuXG4gIGNvbnN0IGFwcFN0YXR1c0xhYmVscyA9IHtcbiAgICBkcmFmdDogJ0RyYWZ0JywgcmVhZHk6ICdSZWFkeScsIHNlbnQ6ICdTZW50JywgcXVldWVkOiAnUXVldWVkJyxcbiAgICBpbnRlcnZpZXc6ICdJbnRlcnZpZXcnLCByZWplY3RlZDogJ1JlamVjdGVkJywgYWNjZXB0ZWQ6ICdBY2NlcHRlZCcsXG4gICAgcGFya2VkOiAnUGFya2VkJyxcbiAgfTtcbiAgY29uc3QgYXBwU3RhdHVzQ29sb3JzID0ge1xuICAgIGRyYWZ0OiAnIzk0YTNiOCcsIHJlYWR5OiAnIzNiODJmNicsIHNlbnQ6ICcjMjJjNTVlJywgcXVldWVkOiAnI2VhYjMwOCcsXG4gICAgaW50ZXJ2aWV3OiAnI2E4NTVmNycsIHJlamVjdGVkOiAnI2VmNDQ0NCcsIGFjY2VwdGVkOiAnIzA1OTY2OScsXG4gICAgcGFya2VkOiAnI2Y5NzMxNicsXG4gIH07XG4gIGNvbnN0IGFwcFN0YXR1cyA9IHJvdy5hcHBsaWNhdGlvblN0YXR1cyB8fCAnJztcbiAgY29uc3QgYXBwU3RhdHVzQmFkZ2UgPSBhcHBTdGF0dXMgJiYgYXBwU3RhdHVzTGFiZWxzW2FwcFN0YXR1c11cbiAgICA/IGAgPHNwYW4gaWQ9XCJzbS1zdGF0dXMtYmFkZ2UtJHtyb3cuaWR4fVwiIHN0eWxlPVwiZm9udC1zaXplOjAuNzVlbTtwYWRkaW5nOjFweCA2cHg7Ym9yZGVyLXJhZGl1czo5cHg7YmFja2dyb3VuZDoke2FwcFN0YXR1c0NvbG9yc1thcHBTdGF0dXNdfTtjb2xvcjojZmZmO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtcIj4ke2FwcFN0YXR1c0xhYmVsc1thcHBTdGF0dXNdfTwvc3Bhbj5gXG4gICAgOiBgPHNwYW4gaWQ9XCJzbS1zdGF0dXMtYmFkZ2UtJHtyb3cuaWR4fVwiPjwvc3Bhbj5gO1xuXG4gIC8vIFN0YXR1cy1lZGl0IGlubGluZSB3aWRnZXQgKHNhdmVkIHJvd3Mgb25seSlcbiAgY29uc3Qgc3RhdHVzRWRpdFdpZGdldCA9IHJvdy50eXBlID09PSAnc2F2ZWQnXG4gICAgPyBgPHNwYW4gaWQ9XCJzbS1zdGF0dXMtZWRpdC0ke3Jvdy5pZHh9XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDo0cHg7bWFyZ2luLXRvcDoycHg7XCI+YCArXG4gICAgICAgIGA8c2VsZWN0IGlkPVwic20tc3RhdHVzLXNlbC0ke3Jvdy5pZHh9XCIgY2xhc3M9XCJzbS1rZXktaW5wdXRcIiBzdHlsZT1cImJvcmRlcjoxcHggc29saWQgIzNiODJmNjtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjJweCA0cHg7Zm9udC1zaXplOjEycHg7XCIgYXJpYS1sYWJlbD1cIlNlbGVjdCBhcHBsaWNhdGlvbiBzdGF0dXNcIj5gICtcbiAgICAgICAgICBgPG9wdGlvbiB2YWx1ZT1cIlwiPi0tIGNsZWFyIC0tPC9vcHRpb24+YCArXG4gICAgICAgICAgT2JqZWN0LmVudHJpZXMoYXBwU3RhdHVzTGFiZWxzKS5tYXAoKFt2LCBsXSkgPT5cbiAgICAgICAgICAgIGA8b3B0aW9uIHZhbHVlPVwiJHt2fVwiJHthcHBTdGF0dXMgPT09IHYgPyAnIHNlbGVjdGVkJyA6ICcnfT4ke2x9PC9vcHRpb24+YFxuICAgICAgICAgICkuam9pbignJykgK1xuICAgICAgICBgPC9zZWxlY3Q+YCArXG4gICAgICAgIGA8YnV0dG9uIGRhdGEtc20tYWN0aW9uPVwic3VibWl0LXN0YXR1c1wiIGRhdGEtc20tcGF0aD1cIiR7ZXNjYXBlSHRtbChyb3cucGF0aCB8fCAnJyl9XCIgZGF0YS1zbS1pZHg9XCIke3Jvdy5pZHh9XCIgY2xhc3M9XCJzbS1idG5cIiB0aXRsZT1cIlNhdmUgc3RhdHVzXCIgYXJpYS1sYWJlbD1cIlNhdmUgc3RhdHVzXCI+JiMxMDAwMzs8L2J1dHRvbj5gICtcbiAgICAgICAgYDxidXR0b24gZGF0YS1zbS1hY3Rpb249XCJjYW5jZWwtc3RhdHVzXCIgZGF0YS1zbS1pZHg9XCIke3Jvdy5pZHh9XCIgY2xhc3M9XCJzbS1idG5cIiB0aXRsZT1cIkNhbmNlbFwiIGFyaWEtbGFiZWw9XCJDYW5jZWwgc3RhdHVzIGVkaXRcIj4mIzEwMDA1OzwvYnV0dG9uPmAgK1xuICAgICAgYDwvc3Bhbj5gXG4gICAgOiAnJztcblxuICAvLyBOb3Rlcy1lZGl0IGlubGluZSB3aWRnZXQgKHNhdmVkIHJvd3Mgb25seSlcbiAgY29uc3Qgbm90ZXNQcmV2aWV3ID0gcm93Lm5vdGVzXG4gICAgPyBgPGRpdiBpZD1cInNtLW5vdGVzLXByZXZpZXctJHtyb3cuaWR4fVwiIHN0eWxlPVwiZm9udC1zaXplOjAuNzhlbTtjb2xvcjojOTRhM2I4O21hcmdpbi10b3A6MnB4O21heC13aWR0aDoyNjBweDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpczt3aGl0ZS1zcGFjZTpub3dyYXA7XCIgdGl0bGU9XCIke2VzY2FwZUh0bWwocm93Lm5vdGVzKX1cIj4ke2VzY2FwZUh0bWwocm93Lm5vdGVzKX08L2Rpdj5gXG4gICAgOiBgPGRpdiBpZD1cInNtLW5vdGVzLXByZXZpZXctJHtyb3cuaWR4fVwiIHN0eWxlPVwiZGlzcGxheTpub25lO2ZvbnQtc2l6ZTowLjc4ZW07Y29sb3I6Izk0YTNiODttYXJnaW4tdG9wOjJweDtcIj48L2Rpdj5gO1xuICBjb25zdCBub3Rlc0VkaXRXaWRnZXQgPSByb3cudHlwZSA9PT0gJ3NhdmVkJ1xuICAgID8gYDxzcGFuIGlkPVwic20tbm90ZXMtZWRpdC0ke3Jvdy5pZHh9XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2dhcDo0cHg7bWFyZ2luLXRvcDo0cHg7d2lkdGg6MTAwJTtcIj5gICtcbiAgICAgICAgYDx0ZXh0YXJlYSBpZD1cInNtLW5vdGVzLXRhLSR7cm93LmlkeH1cIiByb3dzPVwiMlwiIG1heGxlbmd0aD1cIjIwMDBcImAgK1xuICAgICAgICAgIGAgc3R5bGU9XCJ3aWR0aDoxMDAlO2ZvbnQtc2l6ZToxMnB4O3BhZGRpbmc6NHB4O2JvcmRlcjoxcHggc29saWQgIzNiODJmNjtib3JkZXItcmFkaXVzOjRweDtyZXNpemU6dmVydGljYWw7XCJgICtcbiAgICAgICAgICBgIGFyaWEtbGFiZWw9XCJTZXNzaW9uIG5vdGVzXCIgcGxhY2Vob2xkZXI9XCJlLmcuLCBJbnRlcnZpZXdlZCAyMDI1LTAzLTEwLCBhd2FpdGluZyBjYWxsYmFja1wiPiR7ZXNjYXBlSHRtbChyb3cubm90ZXMgfHwgJycpfTwvdGV4dGFyZWE+YCArXG4gICAgICAgIGA8c3BhbiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6NHB4O1wiPmAgK1xuICAgICAgICAgIGA8YnV0dG9uIGRhdGEtc20tYWN0aW9uPVwic3VibWl0LW5vdGVzXCIgZGF0YS1zbS1wYXRoPVwiJHtlc2NhcGVIdG1sKHJvdy5wYXRoIHx8ICcnKX1cIiBkYXRhLXNtLWlkeD1cIiR7cm93LmlkeH1cIiBjbGFzcz1cInNtLWJ0blwiIHRpdGxlPVwiU2F2ZSBub3Rlc1wiIGFyaWEtbGFiZWw9XCJTYXZlIG5vdGVzXCI+JiMxMDAwMzs8L2J1dHRvbj5gICtcbiAgICAgICAgICBgPGJ1dHRvbiBkYXRhLXNtLWFjdGlvbj1cImNhbmNlbC1ub3Rlc1wiIGRhdGEtc20taWR4PVwiJHtyb3cuaWR4fVwiIGNsYXNzPVwic20tYnRuXCIgdGl0bGU9XCJDYW5jZWxcIiBhcmlhLWxhYmVsPVwiQ2FuY2VsIG5vdGVzIGVkaXRcIj4mIzEwMDA1OzwvYnV0dG9uPmAgK1xuICAgICAgICBgPC9zcGFuPmAgK1xuICAgICAgYDwvc3Bhbj5gXG4gICAgOiAnJztcblxuICBpZiAocm93LnR5cGUgPT09ICdzYXZlZCcpIHtcbiAgICBhY3Rpb25IdG1sICs9XG4gICAgICBgPGJ1dHRvbiBkYXRhLXNtLWFjdGlvbj1cImVkaXQtc3RhdHVzXCIgZGF0YS1zbS1wYXRoPVwiJHtlc2NhcGVIdG1sKHJvdy5wYXRoIHx8ICcnKX1cIiBkYXRhLXNtLWlkeD1cIiR7cm93LmlkeH1cIiBjbGFzcz1cInNtLWJ0biBzbS1idG4taWNvblwiIHRpdGxlPVwiVXBkYXRlIGFwcGxpY2F0aW9uIHN0YXR1c1wiIGFyaWEtbGFiZWw9XCJVcGRhdGUgYXBwbGljYXRpb24gc3RhdHVzXCI+PGkgY2xhc3M9XCJmYS1zb2xpZCBmYS10YWdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+PC9idXR0b24+YDtcbiAgICBhY3Rpb25IdG1sICs9XG4gICAgICBgPGJ1dHRvbiBkYXRhLXNtLWFjdGlvbj1cImVkaXQtbm90ZXNcIiBkYXRhLXNtLXBhdGg9XCIke2VzY2FwZUh0bWwocm93LnBhdGggfHwgJycpfVwiIGRhdGEtc20taWR4PVwiJHtyb3cuaWR4fVwiIGNsYXNzPVwic20tYnRuIHNtLWJ0bi1pY29uXCIgdGl0bGU9XCJFZGl0IG5vdGVzXCIgYXJpYS1sYWJlbD1cIkVkaXQgbm90ZXNcIj48aSBjbGFzcz1cImZhLXNvbGlkIGZhLW5vdGUtc3RpY2t5XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPjwvYnV0dG9uPmA7XG4gIH1cblxuICBjb25zdCBhdHNTY29yZUxhYmVsID0gcm93LmF0c1Njb3JlICE9IG51bGxcbiAgICA/ICgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHMgPSBOdW1iZXIocm93LmF0c1Njb3JlKTtcbiAgICAgICAgY29uc3QgY29sb3IgPSBzID49IDc1ID8gJyMwNTk2NjknIDogcyA+PSA1MCA/ICcjZDk3NzA2JyA6ICcjZGMyNjI2JztcbiAgICAgICAgcmV0dXJuIGAgPHNwYW4gdGl0bGU9XCJBVFMgbWF0Y2ggc2NvcmVcIiBzdHlsZT1cImZvbnQtc2l6ZTowLjc4ZW07cGFkZGluZzoxcHggNXB4O2JvcmRlci1yYWRpdXM6OXB4O2JhY2tncm91bmQ6JHtjb2xvcn07Y29sb3I6I2ZmZjt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7Zm9udC13ZWlnaHQ6NjAwO1wiPiR7c30lPC9zcGFuPmA7XG4gICAgICB9KSgpXG4gICAgOiAnJztcblxuICByZXR1cm4gYDxkaXYgY2xhc3M9XCIke3Jvd0NsYXNzfVwiPmAgK1xuICAgIGA8c3BhbiBjbGFzcz1cInNtLXRkIHNtLXRkLW5hbWVcIj4ke25hbWVDZWxsfTwvc3Bhbj5gICtcbiAgICBgPHNwYW4gY2xhc3M9XCJzbS10ZCBzbS10ZC1zdGF0dXNcIj4ke3N0YXR1c1BpbGx9PC9zcGFuPmAgK1xuICAgIGA8c3BhbiBjbGFzcz1cInNtLXRkIHNtLXRkLXBoYXNlXCI+PHNwYW4gaWQ9XCJzbS1waGFzZS0ke3Jvdy5pZHh9XCI+JHtwaGFzZUxhYmVsfSR7YXRzU2NvcmVMYWJlbH0ke2FwcFN0YXR1c0JhZGdlfTwvc3Bhbj4ke3N0YXR1c0VkaXRXaWRnZXR9JHtub3Rlc1ByZXZpZXd9JHtub3Rlc0VkaXRXaWRnZXR9PC9zcGFuPmAgK1xuICAgIGA8c3BhbiBjbGFzcz1cInNtLXRkIHNtLXRkLWRhdGVcIj4ke21vZExhYmVsfTwvc3Bhbj5gICtcbiAgICBgPHNwYW4gY2xhc3M9XCJzbS10ZCBzbS10ZC1hY3Rpb25zXCI+JHthY3Rpb25IdG1sfTwvc3Bhbj5gICtcbiAgICBgPC9kaXY+YDtcbn1cblxuZnVuY3Rpb24gX3JlbmRlclJlY2VudHNTdHJpcChyZWNlbnRSb3dzKSB7XG4gIGlmICghcmVjZW50Um93cy5sZW5ndGgpIHJldHVybiAnJztcbiAgY29uc3QgaXRlbXMgPSByZWNlbnRSb3dzLm1hcChyb3cgPT4ge1xuICAgIGNvbnN0IGxhYmVsICAgID0gZXNjYXBlSHRtbChyb3cubmFtZSk7XG4gICAgY29uc3QgZG90Q2xhc3MgPSByb3cudHlwZSA9PT0gJ2FjdGl2ZSdcbiAgICAgID8gKHJvdy5vd25lcnNoaXAuaXNDdXJyZW50ID8gJ3NtLXJlY2VudC1kb3QtY3VycmVudCcgOiAnc20tcmVjZW50LWRvdC1vdGhlcicpXG4gICAgICA6ICdzbS1yZWNlbnQtZG90LXNhdmVkJztcbiAgICBjb25zdCBkb3QgPSBgPHNwYW4gY2xhc3M9XCJzbS1yZWNlbnQtZG90ICR7ZG90Q2xhc3N9XCI+PC9zcGFuPmA7XG4gICAgaWYgKHJvdy50eXBlID09PSAnYWN0aXZlJykge1xuICAgICAgY29uc3QgaHJlZiAgPSBgLz9zZXNzaW9uPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHJvdy5zZXNzaW9uSWQgfHwgJycpfWA7XG4gICAgICBjb25zdCBleHRyYSA9IHJvdy5vd25lcnNoaXAuaXNDdXJyZW50ID8gJyBzbS1yZWNlbnQtY3VycmVudCcgOiAnJztcbiAgICAgIHJldHVybiBgPGEgY2xhc3M9XCJzbS1yZWNlbnQtaXRlbSR7ZXh0cmF9XCIgaHJlZj1cIiR7aHJlZn1cIj4ke2RvdH0ke2xhYmVsfTwvYT5gO1xuICAgIH1cbiAgICByZXR1cm4gYDxidXR0b24gY2xhc3M9XCJzbS1yZWNlbnQtaXRlbVwiIGRhdGEtc20tYWN0aW9uPVwibG9hZFwiIGRhdGEtc20tcGF0aD1cIiR7ZXNjYXBlSHRtbChyb3cucGF0aCB8fCAnJyl9XCI+JHtkb3R9JHtsYWJlbH08L2J1dHRvbj5gO1xuICB9KS5qb2luKCcnKTtcbiAgcmV0dXJuIGA8ZGl2IGNsYXNzPVwic20tcmVjZW50c1wiPjxkaXYgY2xhc3M9XCJzbS1yZWNlbnRzLWxhYmVsXCI+UmVjZW50PC9kaXY+PGRpdiBjbGFzcz1cInNtLXJlY2VudHMtbGlzdFwiPiR7aXRlbXN9PC9kaXY+PC9kaXY+YDtcbn1cblxuZnVuY3Rpb24gX3JlbmRlclNlc3Npb25UYWJsZUZyb21DYWNoZSgpIHtcbiAgY29uc3QgYm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXNzaW9ucy1tb2RhbC1ib2R5Jyk7XG4gIGlmICghYm9keSkgcmV0dXJuO1xuXG4gIGNvbnN0IHJvd3MgICA9IF9ub3JtYWxpemVTZXNzaW9uc0ZvclRhYmxlKF9zbUFjdGl2ZUNhY2hlLCBfc21TYXZlZENhY2hlKTtcbiAgY29uc3QgYnlEYXRlID0gX3NvcnRTZXNzaW9uUm93cyhyb3dzLCAnbGFzdE1vZGlmaWVkJywgJ2Rlc2MnKTtcbiAgY29uc3Qgc29ydGVkID0gX3NvcnRTZXNzaW9uUm93cyhyb3dzLCBfc21Tb3J0S2V5LCBfc21Tb3J0RGlyKTtcblxuICBpZiAoc29ydGVkLmxlbmd0aCA9PT0gMCkge1xuICAgIGJvZHkuaW5uZXJIVE1MID0gJzxwIGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1lbXB0eVwiIHN0eWxlPVwicGFkZGluZzoyNHB4IDE2cHg7XCI+Tm8gc2Vzc2lvbnMgZm91bmQuIENyZWF0ZSBvbmUgdG8gZ2V0IHN0YXJ0ZWQuPC9wPic7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcGFydHMgPSBbXG4gICAgX3NtQWN0aXZlQ2FjaGUubGVuZ3RoID8gYCR7X3NtQWN0aXZlQ2FjaGUubGVuZ3RofSBhY3RpdmVgIDogJycsXG4gICAgX3NtU2F2ZWRDYWNoZS5sZW5ndGggID8gYCR7X3NtU2F2ZWRDYWNoZS5sZW5ndGh9IHNhdmVkYCAgIDogJycsXG4gIF0uZmlsdGVyKEJvb2xlYW4pO1xuXG4gIGJvZHkuaW5uZXJIVE1MID1cbiAgICBfcmVuZGVyUmVjZW50c1N0cmlwKGJ5RGF0ZS5zbGljZSgwLCA1KSkgK1xuICAgIGA8ZGl2IGNsYXNzPVwic20tdGFibGUtd3JhcFwiPmAgK1xuICAgICAgYDxkaXYgY2xhc3M9XCJzbS10YWJsZS1pbmZvXCI+JHtwYXJ0cy5qb2luKCcgXFx1MDBiNyAnKX08L2Rpdj5gICtcbiAgICAgIF9yZW5kZXJTZXNzaW9uVGFibGVIZWFkZXIoKSArXG4gICAgICBgPGRpdiBjbGFzcz1cInNtLXRib2R5XCI+JHtzb3J0ZWQubWFwKF9yZW5kZXJTZXNzaW9uVGFibGVSb3cpLmpvaW4oJycpfTwvZGl2PmAgK1xuICAgIGA8L2Rpdj5gO1xufVxuXG5mdW5jdGlvbiBfaGFuZGxlU2Vzc2lvbk1vZGFsQ2xpY2soZSkge1xuICBjb25zdCBzb3J0QnRuID0gZS50YXJnZXQuY2xvc2VzdCgnW2RhdGEtc20tc29ydF0nKTtcbiAgaWYgKHNvcnRCdG4pIHsgX3NldFNtU29ydChzb3J0QnRuLmRhdGFzZXQuc21Tb3J0KTsgcmV0dXJuOyB9XG5cbiAgY29uc3QgYnRuID0gZS50YXJnZXQuY2xvc2VzdCgnW2RhdGEtc20tYWN0aW9uXScpO1xuICBpZiAoIWJ0bikgcmV0dXJuO1xuICBjb25zdCBwYXRoICAgPSBidG4uZGF0YXNldC5zbVBhdGg7XG4gIGNvbnN0IGlkeCAgICA9IHBhcnNlSW50KGJ0bi5kYXRhc2V0LnNtSWR4ID8/ICctMScsIDEwKTtcbiAgY29uc3QgYWN0aW9uID0gYnRuLmRhdGFzZXQuc21BY3Rpb247XG4gIGlmICAgICAgKGFjdGlvbiA9PT0gJ3JlbmFtZScpICAgICAgICBzdGFydFNlc3Npb25Nb2RhbFJlbmFtZShwYXRoLCBpZHgpO1xuICBlbHNlIGlmIChhY3Rpb24gPT09ICdzdWJtaXQtcmVuYW1lJykgc3VibWl0U2Vzc2lvbk1vZGFsUmVuYW1lKHBhdGgsIGlkeCk7XG4gIGVsc2UgaWYgKGFjdGlvbiA9PT0gJ2NhbmNlbC1yZW5hbWUnKSBjYW5jZWxTZXNzaW9uTW9kYWxSZW5hbWUoaWR4KTtcbiAgZWxzZSBpZiAoYWN0aW9uID09PSAnZWRpdC1zdGF0dXMnKSAgIHN0YXJ0U2Vzc2lvblN0YXR1c0VkaXQoaWR4KTtcbiAgZWxzZSBpZiAoYWN0aW9uID09PSAnc3VibWl0LXN0YXR1cycpIHN1Ym1pdFNlc3Npb25TdGF0dXNFZGl0KHBhdGgsIGlkeCk7XG4gIGVsc2UgaWYgKGFjdGlvbiA9PT0gJ2NhbmNlbC1zdGF0dXMnKSBjYW5jZWxTZXNzaW9uU3RhdHVzRWRpdChpZHgpO1xuICBlbHNlIGlmIChhY3Rpb24gPT09ICdlZGl0LW5vdGVzJykgICAgc3RhcnRTZXNzaW9uTm90ZXNFZGl0KGlkeCk7XG4gIGVsc2UgaWYgKGFjdGlvbiA9PT0gJ3N1Ym1pdC1ub3RlcycpICBzdWJtaXRTZXNzaW9uTm90ZXNFZGl0KHBhdGgsIGlkeCk7XG4gIGVsc2UgaWYgKGFjdGlvbiA9PT0gJ2NhbmNlbC1ub3RlcycpICBjYW5jZWxTZXNzaW9uTm90ZXNFZGl0KGlkeCk7XG4gIGVsc2UgaWYgKGFjdGlvbiA9PT0gJ2xvYWQnKSAgICAgICAgICBsb2FkU2Vzc2lvbkFuZENsb3NlTW9kYWwocGF0aCk7XG4gIGVsc2UgaWYgKGFjdGlvbiA9PT0gJ2R1cGxpY2F0ZScpICAgICBfZHVwbGljYXRlU2Vzc2lvbkZyb21Nb2RhbChwYXRoKTtcbiAgZWxzZSBpZiAoYWN0aW9uID09PSAnZGVsZXRlJykgICAgICAgIF9kZWxldGVTZXNzaW9uRnJvbU1vZGFsKHBhdGgsIGUpO1xufVxuXG5mdW5jdGlvbiBfaGFuZGxlU2Vzc2lvbk1vZGFsS2V5ZG93bihlKSB7XG4gIGlmICgoZS5rZXkgPT09ICdFbnRlcicgfHwgZS5rZXkgPT09ICcgJykgJiYgZS50YXJnZXQuY2xvc2VzdCgnW2RhdGEtc20tc29ydF0nKSkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBfc2V0U21Tb3J0KGUudGFyZ2V0LmNsb3Nlc3QoJ1tkYXRhLXNtLXNvcnRdJykuZGF0YXNldC5zbVNvcnQpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBpbnB1dCA9IGUudGFyZ2V0LmNsb3Nlc3QoJy5zbS1rZXktaW5wdXQnKTtcbiAgaWYgKCFpbnB1dCkgcmV0dXJuO1xuICBjb25zdCBwYXRoID0gaW5wdXQuZGF0YXNldC5zbVBhdGg7XG4gIGNvbnN0IGlkeCAgPSBwYXJzZUludChpbnB1dC5kYXRhc2V0LnNtSWR4LCAxMCk7XG4gIGlmICAgICAgKGUua2V5ID09PSAnRW50ZXInKSAgc3VibWl0U2Vzc2lvbk1vZGFsUmVuYW1lKHBhdGgsIGlkeCk7XG4gIGVsc2UgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgY2FuY2VsU2Vzc2lvbk1vZGFsUmVuYW1lKGlkeCk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBTZXNzaW9ucyBtb2RhbCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gb3BlblNlc3Npb25zTW9kYWwoeyByZXF1aXJlZCA9IGZhbHNlIH0gPSB7fSkge1xuICBjb25zdCBvdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Nlc3Npb25zLW1vZGFsLW92ZXJsYXknKTtcbiAgaWYgKCFvdmVybGF5KSByZXR1cm47XG4gIG92ZXJsYXkuZGF0YXNldC5kaXNtaXNzRGlzYWJsZWQgPSByZXF1aXJlZCA/ICcxJyA6ICcnO1xuICBjb25zdCBjbG9zZVggICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXNzaW9ucy1tb2RhbC1jbG9zZS14Jyk7XG4gIGNvbnN0IGNsb3NlRm9vdGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Nlc3Npb25zLW1vZGFsLWNsb3NlLWZvb3RlcicpO1xuICBpZiAoY2xvc2VYKSAgICAgIGNsb3NlWC5zdHlsZS5kaXNwbGF5ICAgICAgPSByZXF1aXJlZCA/ICdub25lJyA6ICcnO1xuICBpZiAoY2xvc2VGb290ZXIpIGNsb3NlRm9vdGVyLnN0eWxlLmRpc3BsYXkgPSByZXF1aXJlZCA/ICdub25lJyA6ICcnO1xuICBvdmVybGF5LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIHdpbmRvdy5fZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIGF3YWl0IF9yZW5kZXJTZXNzaW9uc01vZGFsQm9keSgpO1xuICBfcmVmcmVzaFRyYXNoQmFkZ2UoKTtcbiAgdHJhcEZvY3VzKCdzZXNzaW9ucy1tb2RhbC1vdmVybGF5Jyk7XG4gIHNldEluaXRpYWxGb2N1cygnc2Vzc2lvbnMtbW9kYWwtb3ZlcmxheScpO1xufVxuXG5mdW5jdGlvbiBjbG9zZVNlc3Npb25zTW9kYWwoKSB7XG4gIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2Vzc2lvbnMtbW9kYWwtb3ZlcmxheScpO1xuICBpZiAoIW92ZXJsYXkpIHJldHVybjtcbiAgaWYgKG92ZXJsYXkuZGF0YXNldC5kaXNtaXNzRGlzYWJsZWQgPT09ICcxJykgcmV0dXJuO1xuICBvdmVybGF5LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHJlc3RvcmVGb2N1cygpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBfcmVuZGVyU2Vzc2lvbnNNb2RhbEJvZHkoKSB7XG4gIGNvbnN0IGJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2Vzc2lvbnMtbW9kYWwtYm9keScpO1xuICBpZiAoIWJvZHkpIHJldHVybjtcbiAgYm9keS5pbm5lckhUTUwgPSAnPGRpdiBzdHlsZT1cInBhZGRpbmc6MjRweDtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7Z2FwOjEwcHg7Y29sb3I6IzZiNzI4MDtcIj48c3BhbiBjbGFzcz1cImxvYWRpbmctc3Bpbm5lclwiPjwvc3Bhbj4gTG9hZGluZyBzZXNzaW9uc1xcdTIwMjY8L2Rpdj4nO1xuICB0cnkge1xuICAgIGNvbnN0IFthY3RpdmVSZXMsIHNhdmVkUmVzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGZldGNoKCcvYXBpL3Nlc3Npb25zL2FjdGl2ZScpLFxuICAgICAgZmV0Y2goJy9hcGkvc2Vzc2lvbnMnKSxcbiAgICBdKTtcbiAgICBfc21BY3RpdmVDYWNoZSA9IGFjdGl2ZVJlcy5vayA/ICgoYXdhaXQgYWN0aXZlUmVzLmpzb24oKSkuc2Vzc2lvbnMgfHwgW10pIDogW107XG4gICAgY29uc3Qgc2F2ZWREYXRhID0gc2F2ZWRSZXMub2sgPyBwYXJzZVNlc3Npb25MaXN0UmVzcG9uc2UoYXdhaXQgc2F2ZWRSZXMuanNvbigpKSA6IHsgc2Vzc2lvbnM6IFtdIH07XG4gICAgX3NtU2F2ZWRDYWNoZSAgID0gc2F2ZWREYXRhLnNlc3Npb25zIHx8IFtdO1xuICB9IGNhdGNoIChlKSB7XG4gICAgYm9keS5pbm5lckhUTUwgPSBgPHAgc3R5bGU9XCJwYWRkaW5nOjIwcHg7Y29sb3I6I2VmNDQ0NDtcIj5Db3VsZCBub3QgbG9hZCBzZXNzaW9uczogJHtlc2NhcGVIdG1sKGUubWVzc2FnZSl9PC9wPmA7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIFdpcmUgZXZlbnQgZGVsZWdhdGlvbiBvbmNlOyBwZXJzaXN0cyBhY3Jvc3MgcmUtcmVuZGVycyBzaW5jZSBib2R5IGVsZW1lbnQgaXMgc3RhYmxlXG4gIGlmICghYm9keS5fc21MaXN0ZW5lckF0dGFjaGVkKSB7XG4gICAgYm9keS5fc21MaXN0ZW5lckF0dGFjaGVkID0gdHJ1ZTtcbiAgICBib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgICBfaGFuZGxlU2Vzc2lvbk1vZGFsQ2xpY2spO1xuICAgIGJvZHkuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIF9oYW5kbGVTZXNzaW9uTW9kYWxLZXlkb3duKTtcbiAgfVxuICBfcmVuZGVyU2Vzc2lvblRhYmxlRnJvbUNhY2hlKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxvYWRTZXNzaW9uQW5kQ2xvc2VNb2RhbChwYXRoKSB7XG4gIC8vIENsZWFyIGRpc21pc3NEaXNhYmxlZCBzbyBsb2FkaW5nIGEgc2Vzc2lvbiBhbHdheXMgY2xvc2VzIHRoZSBtb2RhbCxcbiAgLy8gZXZlbiB3aGVuIGl0IHdhcyBvcGVuZWQgaW4gcmVxdWlyZWQgKHN0YXJ0dXApIG1vZGUuXG4gIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2Vzc2lvbnMtbW9kYWwtb3ZlcmxheScpO1xuICBpZiAob3ZlcmxheSkgb3ZlcmxheS5kYXRhc2V0LmRpc21pc3NEaXNhYmxlZCA9ICcnO1xuICBjbG9zZVNlc3Npb25zTW9kYWwoKTtcbiAgYXdhaXQgbG9hZFNlc3Npb25GaWxlKHBhdGgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBuZXdTZXNzaW9uRnJvbU1vZGFsKCkge1xuICBjbG9zZVNlc3Npb25zTW9kYWwoKTtcbiAgYXdhaXQgY3JlYXRlTmV3U2Vzc2lvbkFuZE5hdmlnYXRlKCk7XG59XG5cbmZ1bmN0aW9uIHN0YXJ0U2Vzc2lvbk1vZGFsUmVuYW1lKHBhdGgsIGlkeCkge1xuICBjb25zdCBuYW1lRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc20tbmFtZS0ke2lkeH1gKTtcbiAgY29uc3QgZm9ybSAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNtLXJlbmFtZS0ke2lkeH1gKTtcbiAgaWYgKG5hbWVFbCkgbmFtZUVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIGlmIChmb3JtKSAgIGZvcm0uc3R5bGUuZGlzcGxheSAgID0gJ2ZsZXgnO1xuICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzbS1pbnB1dC0ke2lkeH1gKTtcbiAgaWYgKGlucHV0KSB7IGlucHV0LmZvY3VzKCk7IGlucHV0LnNlbGVjdCgpOyB9XG59XG5cbmZ1bmN0aW9uIGNhbmNlbFNlc3Npb25Nb2RhbFJlbmFtZShpZHgpIHtcbiAgY29uc3QgbmFtZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNtLW5hbWUtJHtpZHh9YCk7XG4gIGNvbnN0IGZvcm0gICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzbS1yZW5hbWUtJHtpZHh9YCk7XG4gIGlmIChmb3JtKSAgIGZvcm0uc3R5bGUuZGlzcGxheSAgID0gJ25vbmUnO1xuICBpZiAobmFtZUVsKSBuYW1lRWwuc3R5bGUuZGlzcGxheSA9ICcnO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzdWJtaXRTZXNzaW9uTW9kYWxSZW5hbWUocGF0aCwgaWR4KSB7XG4gIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNtLWlucHV0LSR7aWR4fWApO1xuICBpZiAoIWlucHV0KSByZXR1cm47XG4gIGNvbnN0IG5ld05hbWUgPSBpbnB1dC52YWx1ZS50cmltKCk7XG4gIGlmICghbmV3TmFtZSkgcmV0dXJuO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9yZW5hbWUtc2Vzc2lvbicsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcGF0aCwgbmV3X25hbWU6IG5ld05hbWUgfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEub2spIHtcbiAgICAgIGNvbnN0IG5hbWVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzbS1uYW1lLSR7aWR4fWApO1xuICAgICAgaWYgKG5hbWVFbCkgbmFtZUVsLnRleHRDb250ZW50ID0gbmV3TmFtZTtcbiAgICAgIGNhbmNlbFNlc3Npb25Nb2RhbFJlbmFtZShpZHgpO1xuICAgICAgYXdhaXQgZmV0Y2hTdGF0dXMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHNob3dUb2FzdChgUmVuYW1lIGZhaWxlZDogJHtkYXRhLmVycm9yfWAsICdlcnJvcicpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkgeyBpZiAodHlwZW9mIHNob3dUb2FzdCA9PT0gJ2Z1bmN0aW9uJykgc2hvd1RvYXN0KGBSZW5hbWUgZXJyb3I6ICR7ZS5tZXNzYWdlfWAsICdlcnJvcicpOyB9XG59XG5cbmZ1bmN0aW9uIHN0YXJ0U2Vzc2lvblN0YXR1c0VkaXQoaWR4KSB7XG4gIGNvbnN0IHBoYXNlRWwgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNtLXBoYXNlLSR7aWR4fWApO1xuICBjb25zdCBlZGl0V2lkZ2V0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNtLXN0YXR1cy1lZGl0LSR7aWR4fWApO1xuICBpZiAocGhhc2VFbCkgICAgcGhhc2VFbC5zdHlsZS5kaXNwbGF5ICAgID0gJ25vbmUnO1xuICBpZiAoZWRpdFdpZGdldCkgZWRpdFdpZGdldC5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICBjb25zdCBzZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc20tc3RhdHVzLXNlbC0ke2lkeH1gKTtcbiAgaWYgKHNlbCkgc2VsLmZvY3VzKCk7XG59XG5cbmZ1bmN0aW9uIGNhbmNlbFNlc3Npb25TdGF0dXNFZGl0KGlkeCkge1xuICBjb25zdCBwaGFzZUVsICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNtLXBoYXNlLSR7aWR4fWApO1xuICBjb25zdCBlZGl0V2lkZ2V0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNtLXN0YXR1cy1lZGl0LSR7aWR4fWApO1xuICBpZiAoZWRpdFdpZGdldCkgZWRpdFdpZGdldC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBpZiAocGhhc2VFbCkgICAgcGhhc2VFbC5zdHlsZS5kaXNwbGF5ICAgID0gJyc7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN1Ym1pdFNlc3Npb25TdGF0dXNFZGl0KHBhdGgsIGlkeCkge1xuICBjb25zdCBzZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc20tc3RhdHVzLXNlbC0ke2lkeH1gKTtcbiAgaWYgKCFzZWwpIHJldHVybjtcbiAgY29uc3QgbmV3U3RhdHVzID0gc2VsLnZhbHVlO1xuICBjb25zdCBfYXBwU3RhdHVzTGFiZWxzID0ge1xuICAgIGRyYWZ0OiAnRHJhZnQnLCByZWFkeTogJ1JlYWR5Jywgc2VudDogJ1NlbnQnLCBxdWV1ZWQ6ICdRdWV1ZWQnLFxuICAgIGludGVydmlldzogJ0ludGVydmlldycsIHJlamVjdGVkOiAnUmVqZWN0ZWQnLCBhY2NlcHRlZDogJ0FjY2VwdGVkJyxcbiAgICBwYXJrZWQ6ICdQYXJrZWQnLFxuICB9O1xuICBjb25zdCBfYXBwU3RhdHVzQ29sb3JzID0ge1xuICAgIGRyYWZ0OiAnIzk0YTNiOCcsIHJlYWR5OiAnIzNiODJmNicsIHNlbnQ6ICcjMjJjNTVlJywgcXVldWVkOiAnI2VhYjMwOCcsXG4gICAgaW50ZXJ2aWV3OiAnI2E4NTVmNycsIHJlamVjdGVkOiAnI2VmNDQ0NCcsIGFjY2VwdGVkOiAnIzA1OTY2OScsXG4gICAgcGFya2VkOiAnI2Y5NzMxNicsXG4gIH07XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL3Nlc3Npb25zL21ldGFkYXRhJywge1xuICAgICAgbWV0aG9kOiAnUEFUQ0gnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcGF0aCwgYXBwbGljYXRpb25fc3RhdHVzOiBuZXdTdGF0dXMgfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEub2spIHtcbiAgICAgIGNvbnN0IGJhZGdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNtLXN0YXR1cy1iYWRnZS0ke2lkeH1gKTtcbiAgICAgIGlmIChiYWRnZSkge1xuICAgICAgICBpZiAobmV3U3RhdHVzICYmIF9hcHBTdGF0dXNMYWJlbHNbbmV3U3RhdHVzXSkge1xuICAgICAgICAgIGJhZGdlLnRleHRDb250ZW50ID0gX2FwcFN0YXR1c0xhYmVsc1tuZXdTdGF0dXNdO1xuICAgICAgICAgIGJhZGdlLnN0eWxlLmNzc1RleHQgPSBgZm9udC1zaXplOjAuNzVlbTtwYWRkaW5nOjFweCA2cHg7Ym9yZGVyLXJhZGl1czo5cHg7YmFja2dyb3VuZDoke19hcHBTdGF0dXNDb2xvcnNbbmV3U3RhdHVzXX07Y29sb3I6I2ZmZjt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBiYWRnZS50ZXh0Q29udGVudCA9ICcnO1xuICAgICAgICAgIGJhZGdlLnN0eWxlLmNzc1RleHQgPSAnJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2FuY2VsU2Vzc2lvblN0YXR1c0VkaXQoaWR4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHNob3dUb2FzdChgU3RhdHVzIHVwZGF0ZSBmYWlsZWQ6ICR7ZGF0YS5lcnJvciB8fCAnVW5rbm93biBlcnJvcid9YCwgJ2Vycm9yJyk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHNob3dUb2FzdChgU3RhdHVzIHVwZGF0ZSBlcnJvcjogJHtlLm1lc3NhZ2V9YCwgJ2Vycm9yJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3RhcnRTZXNzaW9uTm90ZXNFZGl0KGlkeCkge1xuICBjb25zdCBlZGl0V2lkZ2V0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNtLW5vdGVzLWVkaXQtJHtpZHh9YCk7XG4gIGNvbnN0IHByZXZpZXcgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc20tbm90ZXMtcHJldmlldy0ke2lkeH1gKTtcbiAgaWYgKHByZXZpZXcpICAgIHByZXZpZXcuc3R5bGUuZGlzcGxheSAgICA9ICdub25lJztcbiAgaWYgKGVkaXRXaWRnZXQpIGVkaXRXaWRnZXQuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgY29uc3QgdGEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc20tbm90ZXMtdGEtJHtpZHh9YCk7XG4gIGlmICh0YSkgeyB0YS5mb2N1cygpOyB0YS5zZWxlY3Rpb25TdGFydCA9IHRhLnNlbGVjdGlvbkVuZCA9IHRhLnZhbHVlLmxlbmd0aDsgfVxufVxuXG5mdW5jdGlvbiBjYW5jZWxTZXNzaW9uTm90ZXNFZGl0KGlkeCkge1xuICBjb25zdCBlZGl0V2lkZ2V0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNtLW5vdGVzLWVkaXQtJHtpZHh9YCk7XG4gIGNvbnN0IHByZXZpZXcgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc20tbm90ZXMtcHJldmlldy0ke2lkeH1gKTtcbiAgaWYgKGVkaXRXaWRnZXQpIGVkaXRXaWRnZXQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgaWYgKHByZXZpZXcpICAgIHByZXZpZXcuc3R5bGUuZGlzcGxheSAgICA9ICcnO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzdWJtaXRTZXNzaW9uTm90ZXNFZGl0KHBhdGgsIGlkeCkge1xuICBjb25zdCB0YSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzbS1ub3Rlcy10YS0ke2lkeH1gKTtcbiAgaWYgKCF0YSkgcmV0dXJuO1xuICBjb25zdCBuZXdOb3RlcyA9IHRhLnZhbHVlO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9zZXNzaW9ucy9tZXRhZGF0YScsIHtcbiAgICAgIG1ldGhvZDogJ1BBVENIJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHBhdGgsIG5vdGVzOiBuZXdOb3RlcyB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgY29uc3QgcHJldmlldyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzbS1ub3Rlcy1wcmV2aWV3LSR7aWR4fWApO1xuICAgICAgaWYgKHByZXZpZXcpIHtcbiAgICAgICAgcHJldmlldy50ZXh0Q29udGVudCA9IG5ld05vdGVzO1xuICAgICAgICBwcmV2aWV3LnRpdGxlICAgICAgID0gbmV3Tm90ZXM7XG4gICAgICAgIHByZXZpZXcuc3R5bGUuZGlzcGxheSA9IG5ld05vdGVzID8gJycgOiAnbm9uZSc7XG4gICAgICB9XG4gICAgICBjYW5jZWxTZXNzaW9uTm90ZXNFZGl0KGlkeCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0eXBlb2Ygc2hvd1RvYXN0ID09PSAnZnVuY3Rpb24nKSBzaG93VG9hc3QoYE5vdGVzIHVwZGF0ZSBmYWlsZWQ6ICR7ZGF0YS5lcnJvciB8fCAnVW5rbm93biBlcnJvcid9YCwgJ2Vycm9yJyk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHNob3dUb2FzdChgTm90ZXMgdXBkYXRlIGVycm9yOiAke2UubWVzc2FnZX1gLCAnZXJyb3InKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBfZGVsZXRlU2Vzc2lvbkZyb21Nb2RhbChwYXRoLCBldmVudCkge1xuICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgaWYgKHR5cGVvZiBjb25maXJtRGlhbG9nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY29uc3Qgb2sgPSBhd2FpdCBjb25maXJtRGlhbG9nKCdNb3ZlIHRoaXMgc2Vzc2lvbiB0byBUcmFzaD8gWW91IGNhbiByZXN0b3JlIGl0IGZyb20gdGhlIFRyYXNoIHZpZXcuJyk7XG4gICAgaWYgKCFvaykgcmV0dXJuO1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL2RlbGV0ZS1zZXNzaW9uJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBwYXRoIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgIGF3YWl0IF9yZW5kZXJTZXNzaW9uc01vZGFsQm9keSgpO1xuICAgICAgYXdhaXQgX3JlZnJlc2hUcmFzaEJhZGdlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0eXBlb2Ygc2hvd1RvYXN0ID09PSAnZnVuY3Rpb24nKSBzaG93VG9hc3QoYEZhaWxlZCB0byBtb3ZlIHNlc3Npb24gdG8gVHJhc2g6ICR7ZGF0YS5lcnJvciB8fCAnVW5rbm93biBlcnJvcid9YCwgJ2Vycm9yJyk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7IGlmICh0eXBlb2Ygc2hvd1RvYXN0ID09PSAnZnVuY3Rpb24nKSBzaG93VG9hc3QoYEVycm9yOiAke2UubWVzc2FnZX1gLCAnZXJyb3InKTsgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgRHVwbGljYXRlIHNlc3Npb24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIF9kdXBsaWNhdGVTZXNzaW9uRnJvbU1vZGFsKHBhdGgpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvc2Vzc2lvbnMvZHVwbGljYXRlJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBwYXRoIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBhd2FpdCBfcmVuZGVyU2Vzc2lvbnNNb2RhbEJvZHkoKTtcbiAgICAgIGlmICh0eXBlb2Ygc2hvd1RvYXN0ID09PSAnZnVuY3Rpb24nKSBzaG93VG9hc3QoYFNlc3Npb24gZHVwbGljYXRlZDogXCIke2RhdGEubmV3X25hbWV9XCJgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHNob3dUb2FzdChgRmFpbGVkIHRvIGR1cGxpY2F0ZSBzZXNzaW9uOiAke2RhdGEuZXJyb3IgfHwgJ1Vua25vd24gZXJyb3InfWAsICdlcnJvcicpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkgeyBpZiAodHlwZW9mIHNob3dUb2FzdCA9PT0gJ2Z1bmN0aW9uJykgc2hvd1RvYXN0KGBFcnJvcjogJHtlLm1lc3NhZ2V9YCwgJ2Vycm9yJyk7IH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIFRyYXNoIGJhZGdlIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBfcmVmcmVzaFRyYXNoQmFkZ2UoKSB7XG4gIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXNzaW9ucy10cmFzaC1idG4nKTtcbiAgaWYgKCFidG4pIHJldHVybjtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvdHJhc2gnKTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBjb25zdCBuID0gKGRhdGEuaXRlbXMgfHwgW10pLmxlbmd0aDtcbiAgICBidG4udGV4dENvbnRlbnQgPSBuID4gMCA/IGBcdUQ4M0RcdURERDEgVHJhc2ggKCR7bn0pYCA6ICdcdUQ4M0RcdURERDEgVHJhc2gnO1xuICB9IGNhdGNoIChfKSB7IC8qIGlnbm9yZSAqLyB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBUcmFzaCB2aWV3IChpbmxpbmUgaW4gc2Vzc2lvbnMgbW9kYWwpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBvcGVuVHJhc2hWaWV3KCkge1xuICBjb25zdCBib2R5ICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2Vzc2lvbnMtbW9kYWwtYm9keScpO1xuICBjb25zdCBmb290ZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc2Vzc2lvbnMtbW9kYWwtb3ZlcmxheSAubW9kYWwtZm9vdGVyJyk7XG4gIGlmICghYm9keSkgcmV0dXJuO1xuXG4gIGJvZHkuaW5uZXJIVE1MID0gJzxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDoxMnB4O3BhZGRpbmc6MjRweDtjb2xvcjojNmI3MjgwO1wiPjxkaXYgY2xhc3M9XCJsb2FkaW5nLXNwaW5uZXJcIiBzdHlsZT1cIndpZHRoOjIwcHg7aGVpZ2h0OjIwcHg7Ym9yZGVyLXdpZHRoOjJweDtmbGV4LXNocmluazowO1wiPjwvZGl2PjxzcGFuPkxvYWRpbmcgdHJhc2hcdTIwMjY8L3NwYW4+PC9kaXY+JztcblxuICBpZiAoZm9vdGVyKSB7XG4gICAgZm9vdGVyLmlubmVySFRNTCA9IGBcbiAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgb25jbGljaz1cImVtcHR5VHJhc2goKVwiXG4gICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDojZmVlMmUyO2NvbG9yOiNkYzI2MjY7Ym9yZGVyLWNvbG9yOiNmZWNhY2E7XCI+RW1wdHkgVHJhc2g8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgb25jbGljaz1cImNsb3NlVHJhc2hWaWV3KClcIj5cdTIxOTAgQmFjazwvYnV0dG9uPmA7XG4gIH1cblxuICBhd2FpdCBfcmVuZGVyVHJhc2hWaWV3KCk7XG59XG5cbmZ1bmN0aW9uIGNsb3NlVHJhc2hWaWV3KCkge1xuICBjb25zdCBmb290ZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc2Vzc2lvbnMtbW9kYWwtb3ZlcmxheSAubW9kYWwtZm9vdGVyJyk7XG4gIGlmIChmb290ZXIpIHtcbiAgICBmb290ZXIuaW5uZXJIVE1MID0gYFxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwibmV3U2Vzc2lvbkZyb21Nb2RhbCgpXCJcbiAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiMxMGI5ODE7Y29sb3I6I2ZmZjtib3JkZXItY29sb3I6IzEwYjk4MTtcIj5cdUZGMEIgTmV3IFNlc3Npb248L2J1dHRvbj5cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjhweDthbGlnbi1pdGVtczpjZW50ZXI7XCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJzZXNzaW9ucy10cmFzaC1idG5cIiBjbGFzcz1cImFjdGlvbi1idG5cIlxuICAgICAgICAgIG9uY2xpY2s9XCJvcGVuVHJhc2hWaWV3KClcIlxuICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDojZjFmNWY5O2NvbG9yOiM2NDc0OGI7Ym9yZGVyLWNvbG9yOiNlMmU4ZjA7XCI+XHVEODNEXHVEREQxIFRyYXNoPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgb25jbGljaz1cImNsb3NlU2Vzc2lvbnNNb2RhbCgpXCI+Q2xvc2U8L2J1dHRvbj5cbiAgICAgIDwvZGl2PmA7XG4gIH1cbiAgX3JlbmRlclNlc3Npb25zTW9kYWxCb2R5KCk7XG4gIF9yZWZyZXNoVHJhc2hCYWRnZSgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBfcmVuZGVyVHJhc2hWaWV3KCkge1xuICBjb25zdCBib2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Nlc3Npb25zLW1vZGFsLWJvZHknKTtcbiAgaWYgKCFib2R5KSByZXR1cm47XG4gIGxldCBpdGVtcyA9IFtdO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS90cmFzaCcpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGl0ZW1zID0gZGF0YS5pdGVtcyB8fCBbXTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGJvZHkuaW5uZXJIVE1MID0gYDxwIHN0eWxlPVwicGFkZGluZzoyMHB4O2NvbG9yOiNlZjQ0NDQ7XCI+Q291bGQgbm90IGxvYWQgdHJhc2g6ICR7ZXNjYXBlSHRtbChlLm1lc3NhZ2UpfTwvcD5gO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoaXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgYm9keS5pbm5lckhUTUwgPSAnPHAgc3R5bGU9XCJwYWRkaW5nOjI0cHg7dGV4dC1hbGlnbjpjZW50ZXI7Y29sb3I6IzZiNzI4MDtcIj5UcmFzaCBpcyBlbXB0eS48L3A+JztcbiAgICByZXR1cm47XG4gIH1cblxuICBmdW5jdGlvbiBmbXREYXRlKHRzKSB7XG4gICAgaWYgKCF0cykgcmV0dXJuICcnO1xuICAgIHRyeSB7IHJldHVybiBuZXcgRGF0ZSh0cykudG9Mb2NhbGVEYXRlU3RyaW5nKCdlbi1VUycsIHsgbW9udGg6ICdzaG9ydCcsIGRheTogJ251bWVyaWMnLCB5ZWFyOiAnbnVtZXJpYycgfSk7IH1cbiAgICBjYXRjaCB7IHJldHVybiB0cy5zbGljZSgwLCAxMCk7IH1cbiAgfVxuXG4gIGxldCBodG1sID0gJzx0YWJsZSBzdHlsZT1cIndpZHRoOjEwMCU7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlO1wiPic7XG4gIGl0ZW1zLmZvckVhY2gocyA9PiB7XG4gICAgY29uc3QgZXAgPSBlc2NhcGVIdG1sKHMucGF0aCk7XG4gICAgaHRtbCArPSBgXG4gICAgICA8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZjFmNWY5O3ZlcnRpY2FsLWFsaWduOnRvcDtcIj5cbiAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzoxMnB4IDE2cHg7XCI+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtd2VpZ2h0OjYwMDtjb2xvcjojMWUyOTNiO1wiPiR7ZXNjYXBlSHRtbChzLnBvc2l0aW9uX25hbWUgfHwgJ1VudGl0bGVkJyl9PC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZToxMnB4O2NvbG9yOiM5NGEzYjg7bWFyZ2luLXRvcDoycHg7XCI+JHtmbXREYXRlKHMudGltZXN0YW1wKX0ke3MucGhhc2UgPyAnIFx1MDBCNyAnICsgZXNjYXBlSHRtbChzLnBoYXNlKSA6ICcnfTwvZGl2PlxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOjEycHggMTZweDt3aGl0ZS1zcGFjZTpub3dyYXA7dmVydGljYWwtYWxpZ246bWlkZGxlO1wiPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjZweDtcIj5cbiAgICAgICAgICAgIDxidXR0b24gZGF0YS10cmFzaC1hY3Rpb249XCJyZXN0b3JlXCIgZGF0YS10cmFzaC1wYXRoPVwiJHtlcH1cIlxuICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6I2RiZWFmZTtjb2xvcjojMWQ0ZWQ4O2JvcmRlcjoxcHggc29saWQgI2JmZGJmZTtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjZweCAxMnB4O2ZvbnQtc2l6ZToxM3B4O2ZvbnQtd2VpZ2h0OjYwMDtjdXJzb3I6cG9pbnRlcjtcIj5SZXN0b3JlPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIGRhdGEtdHJhc2gtYWN0aW9uPVwiZGVsZXRlLWZvcmV2ZXJcIiBkYXRhLXRyYXNoLXBhdGg9XCIke2VwfVwiXG4gICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDojZmVlMmUyO2NvbG9yOiNkYzI2MjY7Ym9yZGVyOjFweCBzb2xpZCAjZmVjYWNhO2JvcmRlci1yYWRpdXM6NnB4O3BhZGRpbmc6NnB4IDhweDtmb250LXNpemU6MTNweDtjdXJzb3I6cG9pbnRlcjtcIiB0aXRsZT1cIkRlbGV0ZSBwZXJtYW5lbnRseVwiIGFyaWEtbGFiZWw9XCJEZWxldGUgcGVybWFuZW50bHlcIj5cdTI3MTU8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvdHI+YDtcbiAgfSk7XG4gIGh0bWwgKz0gJzwvdGFibGU+JztcbiAgY29uc3QgdHJhc2hXcmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHRyYXNoV3JhcHBlci5pbm5lckhUTUwgPSBodG1sO1xuICBib2R5LmlubmVySFRNTCA9ICcnO1xuICBib2R5LmFwcGVuZENoaWxkKHRyYXNoV3JhcHBlcik7XG4gIC8vIFdpcmUgdXAgdHJhc2ggYWN0aW9uIGJ1dHRvbnMgdmlhIGV2ZW50IGRlbGVnYXRpb25cbiAgdHJhc2hXcmFwcGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZSA9PiB7XG4gICAgY29uc3QgYnRuID0gZS50YXJnZXQuY2xvc2VzdCgnW2RhdGEtdHJhc2gtYWN0aW9uXScpO1xuICAgIGlmICghYnRuKSByZXR1cm47XG4gICAgY29uc3QgcGF0aCAgID0gYnRuLmRhdGFzZXQudHJhc2hQYXRoO1xuICAgIGNvbnN0IGFjdGlvbiA9IGJ0bi5kYXRhc2V0LnRyYXNoQWN0aW9uO1xuICAgIGlmICAgICAgKGFjdGlvbiA9PT0gJ3Jlc3RvcmUnKSAgICAgICAgcmVzdG9yZUZyb21UcmFzaChwYXRoKTtcbiAgICBlbHNlIGlmIChhY3Rpb24gPT09ICdkZWxldGUtZm9yZXZlcicpIGRlbGV0ZUZvcmV2ZXIocGF0aCk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXN0b3JlRnJvbVRyYXNoKHBhdGgpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvdHJhc2gvcmVzdG9yZScsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcGF0aCB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5zdWNjZXNzKSB7IGF3YWl0IF9yZW5kZXJUcmFzaFZpZXcoKTsgYXdhaXQgX3JlZnJlc2hUcmFzaEJhZGdlKCk7IH1cbiAgICBlbHNlIGlmICh0eXBlb2Ygc2hvd1RvYXN0ID09PSAnZnVuY3Rpb24nKSBzaG93VG9hc3QoYFJlc3RvcmUgZmFpbGVkOiAke2RhdGEuZXJyb3IgfHwgJ1Vua25vd24gZXJyb3InfWAsICdlcnJvcicpO1xuICB9IGNhdGNoIChlKSB7IGlmICh0eXBlb2Ygc2hvd1RvYXN0ID09PSAnZnVuY3Rpb24nKSBzaG93VG9hc3QoYEVycm9yOiAke2UubWVzc2FnZX1gLCAnZXJyb3InKTsgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVGb3JldmVyKHBhdGgpIHtcbiAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgY29uZmlybURpYWxvZyhcbiAgICAnUGVybWFuZW50bHkgZGVsZXRlIHRoaXMgc2Vzc2lvbj8gVGhpcyBjYW5ub3QgYmUgdW5kb25lLicsXG4gICAgeyBjb25maXJtTGFiZWw6ICdEZWxldGUgRm9yZXZlcicsIGNhbmNlbExhYmVsOiAnQ2FuY2VsJywgZGFuZ2VyOiB0cnVlIH1cbiAgKTtcbiAgaWYgKCFjb25maXJtZWQpIHJldHVybjtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvdHJhc2gvZGVsZXRlJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBwYXRoIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHsgYXdhaXQgX3JlbmRlclRyYXNoVmlldygpOyBhd2FpdCBfcmVmcmVzaFRyYXNoQmFkZ2UoKTsgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHNob3dUb2FzdChgRGVsZXRlIGZhaWxlZDogJHtkYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yJ31gLCAnZXJyb3InKTtcbiAgfSBjYXRjaCAoZSkgeyBpZiAodHlwZW9mIHNob3dUb2FzdCA9PT0gJ2Z1bmN0aW9uJykgc2hvd1RvYXN0KGBFcnJvcjogJHtlLm1lc3NhZ2V9YCwgJ2Vycm9yJyk7IH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZW1wdHlUcmFzaCgpIHtcbiAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgY29uZmlybURpYWxvZyhcbiAgICAnUGVybWFuZW50bHkgZGVsZXRlIGFsbCBpdGVtcyBpbiBUcmFzaD8gVGhpcyBjYW5ub3QgYmUgdW5kb25lLicsXG4gICAgeyBjb25maXJtTGFiZWw6ICdFbXB0eSBUcmFzaCcsIGNhbmNlbExhYmVsOiAnQ2FuY2VsJywgZGFuZ2VyOiB0cnVlIH1cbiAgKTtcbiAgaWYgKCFjb25maXJtZWQpIHJldHVybjtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvdHJhc2gvZW1wdHknLCB7IG1ldGhvZDogJ1BPU1QnIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHsgYXdhaXQgX3JlbmRlclRyYXNoVmlldygpOyBhd2FpdCBfcmVmcmVzaFRyYXNoQmFkZ2UoKTsgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHNob3dUb2FzdChgRmFpbGVkIHRvIGVtcHR5IHRyYXNoOiAke2RhdGEuZXJyb3IgfHwgJ1Vua25vd24gZXJyb3InfWAsICdlcnJvcicpO1xuICB9IGNhdGNoIChlKSB7IGlmICh0eXBlb2Ygc2hvd1RvYXN0ID09PSAnZnVuY3Rpb24nKSBzaG93VG9hc3QoYEVycm9yOiAke2UubWVzc2FnZX1gLCAnZXJyb3InKTsgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgRXhwb3J0cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZXhwb3J0IHtcbiAgX3JlbmRlckFjdGl2ZVNlc3Npb25Sb3dzLFxuICBfcmVuZGVyU2F2ZWRTZXNzaW9uUm93cyxcbiAgX3JlbmRlclNlc3Npb25Td2l0Y2hlclNlY3Rpb25zLFxuICBfdXBkYXRlU2Vzc2lvblN3aXRjaGVySGVhZGVyLFxuICBzaG93T3duZXJzaGlwQ29uZmxpY3REaWFsb2csXG4gIGNsb3NlT3duZXJzaGlwQ29uZmxpY3REaWFsb2csXG4gIG9wZW5TZXNzaW9uc01vZGFsLFxuICBjbG9zZVNlc3Npb25zTW9kYWwsXG4gIF9yZW5kZXJTZXNzaW9uc01vZGFsQm9keSxcbiAgbG9hZFNlc3Npb25BbmRDbG9zZU1vZGFsLFxuICBuZXdTZXNzaW9uRnJvbU1vZGFsLFxuICBzdGFydFNlc3Npb25Nb2RhbFJlbmFtZSxcbiAgY2FuY2VsU2Vzc2lvbk1vZGFsUmVuYW1lLFxuICBzdWJtaXRTZXNzaW9uTW9kYWxSZW5hbWUsXG4gIF9kZWxldGVTZXNzaW9uRnJvbU1vZGFsLFxuICBfZHVwbGljYXRlU2Vzc2lvbkZyb21Nb2RhbCxcbiAgX3JlZnJlc2hUcmFzaEJhZGdlLFxuICBvcGVuVHJhc2hWaWV3LFxuICBjbG9zZVRyYXNoVmlldyxcbiAgX3JlbmRlclRyYXNoVmlldyxcbiAgcmVzdG9yZUZyb21UcmFzaCxcbiAgZGVsZXRlRm9yZXZlcixcbiAgZW1wdHlUcmFzaCxcbn07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9rZXlib2FyZC1zaG9ydGN1dHMuanMgXHUyMDE0IEdsb2JhbCBrZXlib2FyZCBzaG9ydGN1dHMgZm9yIHdvcmtmbG93IG5hdmlnYXRpb24uXG4gKlxuICogU2hvcnRjdXRzIGltcGxlbWVudGVkOlxuICogICBDdHJsK0VudGVyICAgICAgIFRyaWdnZXIgdGhlIHByaW1hcnkgYWN0aW9uIGJ1dHRvbiBvbiB0aGUgY3VycmVudCB0YWJcbiAqICAgQ3RybCtTaGlmdCtSICAgICBSZS1ydW4gdGhlIGN1cnJlbnQgd29ya2Zsb3cgcGhhc2UgKGNhbGxzIGNvbmZpcm1SZVJ1blBoYXNlKVxuICogICBBICAgICAgICAgICAgICAgIEFjY2VwdCB0aGUgZm9jdXNlZCByZXZpZXcgY2FyZCAocmV3cml0ZSAvIHNwZWxsLWNoZWNrIHRhYnMpXG4gKiAgIFIgICAgICAgICAgICAgICAgUmVqZWN0IHRoZSBmb2N1c2VkIHJldmlldyBjYXJkIChyZXdyaXRlIC8gc3BlbGwtY2hlY2sgdGFicylcbiAqICAgXHUyMTkxIC8gXHUyMTkzICAgICAgICAgICAgTmF2aWdhdGUgYmV0d2VlbiByZXZpZXcgY2FyZHMgb24gcmV2aWV3IHRhYnNcbiAqICAgQ3RybCtaICAgICAgICAgICBVbmRvIHRoZSBtb3N0IHJlY2VudCBNYXN0ZXIgQ1YgZGF0YSBjaGFuZ2UgKE1hc3RlciBDViBtb2RhbCBvbmx5KVxuICogICBDdHJsK1NoaWZ0K1ogICAgIFJlZG8gdGhlIHByZXZpb3VzbHkgdW5kb25lIE1hc3RlciBDViBkYXRhIGNoYW5nZSAoTWFzdGVyIENWIG1vZGFsIG9ubHkpXG4gKiAgID8gICAgICAgICAgICAgICAgVG9nZ2xlIGtleWJvYXJkIHNob3J0Y3V0IGhlbHAgcGFuZWxcbiAqL1xuXG4vKiogVHJhY2sgd2hpY2ggY2FyZCBpcyBrZXlib2FyZC1mb2N1c2VkIG9uIHRoZSBjdXJyZW50IHJldmlldyB0YWIuICovXG5sZXQgX2ZvY3VzZWRDYXJkSW5kZXggPSAtMTtcblxuLyoqIFJldHVybnMgdHJ1ZSBpZiBmb2N1cyBpcyBpbnNpZGUgYSB0ZXh0IGlucHV0LCBzbyBBL1IvXHUyMTkxL1x1MjE5MyBzaG91bGQgbm90IGZpcmUuICovXG5mdW5jdGlvbiBfaW5UZXh0SW5wdXQoKSB7XG4gIGNvbnN0IGVsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgaWYgKCFlbCkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCB0YWcgPSBlbC50YWdOYW1lO1xuICByZXR1cm4gdGFnID09PSAnSU5QVVQnIHx8IHRhZyA9PT0gJ1RFWFRBUkVBJyB8fCB0YWcgPT09ICdTRUxFQ1QnIHx8IGVsLmlzQ29udGVudEVkaXRhYmxlO1xufVxuXG4vKiogUmV0dXJucyB0cnVlIGlmIGFueSBtb2RhbCBvdmVybGF5IGlzIGN1cnJlbnRseSB2aXNpYmxlLiAqL1xuZnVuY3Rpb24gX21vZGFsT3BlbigpIHtcbiAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tyb2xlPVwiZGlhbG9nXCJdOm5vdChbc3R5bGUqPVwiZGlzcGxheTogbm9uZVwiXSk6bm90KFtzdHlsZSo9XCJkaXNwbGF5Om5vbmVcIl0pJykgIT09IG51bGw7XG59XG5cbi8qKiBSZXR1cm5zIHRydWUgaWYgdGhlIE1hc3RlciBDViBtb2RhbCAod2ViL2luZGV4Lmh0bWwjbWFzdGVyLWN2LW1vZGFsLW92ZXJsYXkpIGlzIG9wZW4uICovXG5mdW5jdGlvbiBfbWFzdGVyQ3ZNb2RhbE9wZW4oKSB7XG4gIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1jdi1tb2RhbC1vdmVybGF5Jyk7XG4gIHJldHVybiAhIWVsICYmIGVsLnN0eWxlLmRpc3BsYXkgIT09ICdub25lJztcbn1cblxuLyoqXG4gKiBNYXAgdGFiIElEcyB0byB0aGVpciBwcmltYXJ5IGFjdGlvbiBidXR0b24gSURzLlxuICogQnV0dG9ucyB0aGF0IG1pZ2h0IGJlIGRpc2FibGVkIGF0IHJ1bnRpbWUgYXJlIHN0aWxsIGNsaWNrZWQgXHUyMDE0IHRoZSBidXR0b24nc1xuICogb3duIGRpc2FibGVkIGNoZWNrIHByZXZlbnRzIGFjY2lkZW50YWwgc3VibWlzc2lvbi5cbiAqL1xuY29uc3QgX1RBQl9BQ1RJT05fQlROID0ge1xuICAnam9iJzogICAgICAgICAgICAgICAgICAgJ3NlbmQtYnRuJyxcbiAgJ2FuYWx5c2lzJzogICAgICAgICAgICAgICdhbmFseXplLWJ0bicsXG4gICdnb2Fscyc6ICAgICAgICAgICAgICAgICAncmVjb21tZW5kLWJ0bicsXG4gICdyZXdyaXRlJzogICAgICAgICAgICAgICAncmV3cml0ZS1idG4nLFxuICAnc3BlbGwnOiAgICAgICAgICAgICAgICAgJ3NwZWxsLWJ0bicsXG4gICdmaW5hbF9nZW5lcmF0ZSc6ICAgICAgICAnZ2VuZXJhdGUtYnRuJyxcbiAgJ2xheW91dCc6ICAgICAgICAgICAgICAgICdsYXlvdXQtYnRuJyxcbiAgJ2Rvd25sb2FkJzogICAgICAgICAgICAgICdmaW5hbC1nZW5lcmF0ZS1wcm9jZWVkLWJ0bicsXG4gICdmaW5hbGlzZSc6ICAgICAgICAgICAgICAnZmluYWxpc2UtYWN0aW9uLWJ0bicsXG59O1xuXG4vKiogQ2xpY2sgdGhlIHByaW1hcnkgYWN0aW9uIGJ1dHRvbiBmb3IgdGhlIGN1cnJlbnQgdGFiIChDdHJsK0VudGVyKS4gKi9cbmZ1bmN0aW9uIF90cmlnZ2VyUHJpbWFyeUFjdGlvbigpIHtcbiAgY29uc3QgdGFiID0gdHlwZW9mIHN0YXRlTWFuYWdlciAhPT0gJ3VuZGVmaW5lZCcgPyBzdGF0ZU1hbmFnZXIuZ2V0Q3VycmVudFRhYigpIDogbnVsbDtcbiAgaWYgKCF0YWIpIHJldHVybjtcbiAgY29uc3QgYnRuSWQgPSBfVEFCX0FDVElPTl9CVE5bdGFiXTtcbiAgaWYgKCFidG5JZCkgcmV0dXJuO1xuICBjb25zdCBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChidG5JZCk7XG4gIGlmIChidG4gJiYgIWJ0bi5kaXNhYmxlZCkgYnRuLmNsaWNrKCk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBDYXJkIG5hdmlnYXRpb24gaGVscGVycyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLyoqIFJldHVybiB2aXNpYmxlIHJldmlldyBjYXJkcyBmb3IgdGhlIGN1cnJlbnQgdGFiLiAqL1xuZnVuY3Rpb24gX2dldENhcmRzKCkge1xuICBjb25zdCB0YWIgPSB0eXBlb2Ygc3RhdGVNYW5hZ2VyICE9PSAndW5kZWZpbmVkJyA/IHN0YXRlTWFuYWdlci5nZXRDdXJyZW50VGFiKCkgOiBudWxsO1xuICBpZiAodGFiID09PSAncmV3cml0ZScpIHJldHVybiBbLi4uZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnJld3JpdGUtY2FyZCcpXTtcbiAgaWYgKHRhYiA9PT0gJ3NwZWxsJykgICByZXR1cm4gWy4uLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zcGVsbC1jYXJkJyldO1xuICByZXR1cm4gW107XG59XG5cbi8qKiBWaXN1YWxseSBoaWdobGlnaHQgYSBjYXJkIGFzIGtleWJvYXJkLWZvY3VzZWQuICovXG5mdW5jdGlvbiBfaGlnaGxpZ2h0Q2FyZChjYXJkcywgaWR4KSB7XG4gIGNhcmRzLmZvckVhY2goKGMsIGkpID0+IHtcbiAgICBpZiAoaSA9PT0gaWR4KSB7XG4gICAgICBjLmNsYXNzTGlzdC5hZGQoJ2tiLWZvY3VzZWQnKTtcbiAgICAgIGMuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ25lYXJlc3QnLCBiZWhhdmlvcjogJ3Ntb290aCcgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGMuY2xhc3NMaXN0LnJlbW92ZSgna2ItZm9jdXNlZCcpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKiBNb3ZlIHRoZSBrZXlib2FyZCBmb2N1cyB0byBjYXJkIGF0IGRlbHRhIG9mZnNldCBmcm9tIGN1cnJlbnQuICovXG5mdW5jdGlvbiBfbW92ZUNhcmRGb2N1cyhkZWx0YSkge1xuICBjb25zdCBjYXJkcyA9IF9nZXRDYXJkcygpO1xuICBpZiAoIWNhcmRzLmxlbmd0aCkgcmV0dXJuO1xuICBfZm9jdXNlZENhcmRJbmRleCA9IE1hdGgubWF4KDAsIE1hdGgubWluKGNhcmRzLmxlbmd0aCAtIDEsIF9mb2N1c2VkQ2FyZEluZGV4ICsgZGVsdGEpKTtcbiAgX2hpZ2hsaWdodENhcmQoY2FyZHMsIF9mb2N1c2VkQ2FyZEluZGV4KTtcbn1cblxuLyoqIEFjY2VwdCB0aGUgY3VycmVudGx5IGtleWJvYXJkLWZvY3VzZWQgcmV3cml0ZSBjYXJkLiAqL1xuZnVuY3Rpb24gX2FjY2VwdEZvY3VzZWRDYXJkKCkge1xuICBjb25zdCB0YWIgPSB0eXBlb2Ygc3RhdGVNYW5hZ2VyICE9PSAndW5kZWZpbmVkJyA/IHN0YXRlTWFuYWdlci5nZXRDdXJyZW50VGFiKCkgOiBudWxsO1xuICBpZiAodGFiID09PSAncmV3cml0ZScpIHtcbiAgICBjb25zdCBjYXJkcyA9IF9nZXRDYXJkcygpO1xuICAgIGlmIChfZm9jdXNlZENhcmRJbmRleCA8IDAgfHwgX2ZvY3VzZWRDYXJkSW5kZXggPj0gY2FyZHMubGVuZ3RoKSByZXR1cm47XG4gICAgY29uc3QgY2FyZCA9IGNhcmRzW19mb2N1c2VkQ2FyZEluZGV4XTtcbiAgICBjb25zdCBpZCA9IGNhcmQuaWQucmVwbGFjZSgncnctY2FyZC0nLCAnJyk7XG4gICAgaWYgKHR5cGVvZiBhcHBseVJld3JpdGVBY3Rpb24gPT09ICdmdW5jdGlvbicpIGFwcGx5UmV3cml0ZUFjdGlvbihpZCwgJ2FjY2VwdCcpO1xuICB9IGVsc2UgaWYgKHRhYiA9PT0gJ3NwZWxsJykge1xuICAgIGNvbnN0IGNhcmRzID0gX2dldENhcmRzKCk7XG4gICAgaWYgKF9mb2N1c2VkQ2FyZEluZGV4IDwgMCB8fCBfZm9jdXNlZENhcmRJbmRleCA+PSBjYXJkcy5sZW5ndGgpIHJldHVybjtcbiAgICAvLyBzcGVsbCBjYXJkczogZmluZCB0aGUgYWNjZXB0IGJ1dHRvbiB3aXRoaW4gdGhlIGZvY3VzZWQgY2FyZFxuICAgIGNvbnN0IGJ0biA9IGNhcmRzW19mb2N1c2VkQ2FyZEluZGV4XS5xdWVyeVNlbGVjdG9yKCdbZGF0YS1hY3Rpb249XCJrZWVwXCJdLCAuc3BlbGwta2VlcC1idG4nKTtcbiAgICBpZiAoYnRuKSBidG4uY2xpY2soKTtcbiAgfVxufVxuXG4vKiogUmVqZWN0IHRoZSBjdXJyZW50bHkga2V5Ym9hcmQtZm9jdXNlZCByZXZpZXcgY2FyZC4gKi9cbmZ1bmN0aW9uIF9yZWplY3RGb2N1c2VkQ2FyZCgpIHtcbiAgY29uc3QgdGFiID0gdHlwZW9mIHN0YXRlTWFuYWdlciAhPT0gJ3VuZGVmaW5lZCcgPyBzdGF0ZU1hbmFnZXIuZ2V0Q3VycmVudFRhYigpIDogbnVsbDtcbiAgaWYgKHRhYiA9PT0gJ3Jld3JpdGUnKSB7XG4gICAgY29uc3QgY2FyZHMgPSBfZ2V0Q2FyZHMoKTtcbiAgICBpZiAoX2ZvY3VzZWRDYXJkSW5kZXggPCAwIHx8IF9mb2N1c2VkQ2FyZEluZGV4ID49IGNhcmRzLmxlbmd0aCkgcmV0dXJuO1xuICAgIGNvbnN0IGNhcmQgPSBjYXJkc1tfZm9jdXNlZENhcmRJbmRleF07XG4gICAgY29uc3QgaWQgPSBjYXJkLmlkLnJlcGxhY2UoJ3J3LWNhcmQtJywgJycpO1xuICAgIGlmICh0eXBlb2YgYXBwbHlSZXdyaXRlQWN0aW9uID09PSAnZnVuY3Rpb24nKSBhcHBseVJld3JpdGVBY3Rpb24oaWQsICdyZWplY3QnKTtcbiAgfSBlbHNlIGlmICh0YWIgPT09ICdzcGVsbCcpIHtcbiAgICBjb25zdCBjYXJkcyA9IF9nZXRDYXJkcygpO1xuICAgIGlmIChfZm9jdXNlZENhcmRJbmRleCA8IDAgfHwgX2ZvY3VzZWRDYXJkSW5kZXggPj0gY2FyZHMubGVuZ3RoKSByZXR1cm47XG4gICAgY29uc3QgYnRuID0gY2FyZHNbX2ZvY3VzZWRDYXJkSW5kZXhdLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWFjdGlvbj1cImFwcGx5XCJdLCAuc3BlbGwtYXBwbHktYnRuJyk7XG4gICAgaWYgKGJ0bikgYnRuLmNsaWNrKCk7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIFNob3J0Y3V0IGhlbHAgcGFuZWwgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmNvbnN0IF9QQU5FTF9JRCA9ICdrYi1zaG9ydGN1dHMtcGFuZWwnO1xuXG4vKiogVG9nZ2xlIHRoZSBrZXlib2FyZCBzaG9ydGN1dCBoZWxwIHBhbmVsLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNob3dLZXlib2FyZFNob3J0Y3V0c1BhbmVsKCkge1xuICBjb25zdCBleGlzdGluZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKF9QQU5FTF9JRCk7XG4gIGlmIChleGlzdGluZykgeyBleGlzdGluZy5yZW1vdmUoKTsgcmV0dXJuOyB9XG5cbiAgY29uc3QgcGFuZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgcGFuZWwuaWQgPSBfUEFORUxfSUQ7XG4gIHBhbmVsLnNldEF0dHJpYnV0ZSgncm9sZScsICdkaWFsb2cnKTtcbiAgcGFuZWwuc2V0QXR0cmlidXRlKCdhcmlhLW1vZGFsJywgJ3RydWUnKTtcbiAgcGFuZWwuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgJ0tleWJvYXJkIHNob3J0Y3V0cycpO1xuICBwYW5lbC5pbm5lckhUTUwgPSBgXG4gICAgPGRpdiBpZD1cImtiLXNob3J0Y3V0cy1pbm5lclwiPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjthbGlnbi1pdGVtczpjZW50ZXI7bWFyZ2luLWJvdHRvbToxMnB4XCI+XG4gICAgICAgIDxzdHJvbmc+S2V5Ym9hcmQgU2hvcnRjdXRzPC9zdHJvbmc+XG4gICAgICAgIDxidXR0b24gaWQ9XCJrYi1zaG9ydGN1dHMtY2xvc2VcIiBhcmlhLWxhYmVsPVwiQ2xvc2Uga2V5Ym9hcmQgc2hvcnRjdXRzXCIgc3R5bGU9XCJiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOm5vbmU7Zm9udC1zaXplOjEuMmVtO2N1cnNvcjpwb2ludGVyO3BhZGRpbmc6MnB4IDZweFwiPlx1MjcxNTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8dGFibGUgc3R5bGU9XCJib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7d2lkdGg6MTAwJVwiPlxuICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgPHRyPjx0ZCBzdHlsZT1cInBhZGRpbmc6NHB4IDEycHggNHB4IDBcIj48a2JkPkN0cmw8L2tiZD4rPGtiZD5FbnRlcjwva2JkPjwvdGQ+PHRkPlRyaWdnZXIgcHJpbWFyeSBhY3Rpb24gb24gY3VycmVudCBzdGVwPC90ZD48L3RyPlxuICAgICAgICAgIDx0cj48dGQgc3R5bGU9XCJwYWRkaW5nOjRweCAxMnB4IDRweCAwXCI+PGtiZD5DdHJsPC9rYmQ+KzxrYmQ+U2hpZnQ8L2tiZD4rPGtiZD5SPC9rYmQ+PC90ZD48dGQ+UmUtcnVuIGN1cnJlbnQgd29ya2Zsb3cgcGhhc2U8L3RkPjwvdHI+XG4gICAgICAgICAgPHRyPjx0ZCBzdHlsZT1cInBhZGRpbmc6NHB4IDEycHggNHB4IDBcIj48a2JkPlx1MjE5MTwva2JkPiAvIDxrYmQ+XHUyMTkzPC9rYmQ+PC90ZD48dGQ+TmF2aWdhdGUgYmV0d2VlbiByZXZpZXcgY2FyZHM8L3RkPjwvdHI+XG4gICAgICAgICAgPHRyPjx0ZCBzdHlsZT1cInBhZGRpbmc6NHB4IDEycHggNHB4IDBcIj48a2JkPkE8L2tiZD48L3RkPjx0ZD5BY2NlcHQgZm9jdXNlZCBjYXJkIChyZXdyaXRlIC8gc3BlbGwpPC90ZD48L3RyPlxuICAgICAgICAgIDx0cj48dGQgc3R5bGU9XCJwYWRkaW5nOjRweCAxMnB4IDRweCAwXCI+PGtiZD5SPC9rYmQ+PC90ZD48dGQ+UmVqZWN0IGZvY3VzZWQgY2FyZCAocmV3cml0ZSAvIHNwZWxsKTwvdGQ+PC90cj5cbiAgICAgICAgICA8dHI+PHRkIHN0eWxlPVwicGFkZGluZzo0cHggMTJweCA0cHggMFwiPjxrYmQ+Q3RybDwva2JkPis8a2JkPlo8L2tiZD48L3RkPjx0ZD5VbmRvIE1hc3RlciBDViBjaGFuZ2UgKE1hc3RlciBDViBtb2RhbCk8L3RkPjwvdHI+XG4gICAgICAgICAgPHRyPjx0ZCBzdHlsZT1cInBhZGRpbmc6NHB4IDEycHggNHB4IDBcIj48a2JkPkN0cmw8L2tiZD4rPGtiZD5TaGlmdDwva2JkPis8a2JkPlo8L2tiZD48L3RkPjx0ZD5SZWRvIE1hc3RlciBDViBjaGFuZ2UgKE1hc3RlciBDViBtb2RhbCk8L3RkPjwvdHI+XG4gICAgICAgICAgPHRyPjx0ZCBzdHlsZT1cInBhZGRpbmc6NHB4IDEycHggNHB4IDBcIj48a2JkPj88L2tiZD48L3RkPjx0ZD5Ub2dnbGUgdGhpcyBoZWxwIHBhbmVsPC90ZD48L3RyPlxuICAgICAgICAgIDx0cj48dGQgc3R5bGU9XCJwYWRkaW5nOjRweCAxMnB4IDRweCAwXCI+PGtiZD5Fc2M8L2tiZD48L3RkPjx0ZD5DbG9zZSBtb2RhbHMgLyB0aGlzIHBhbmVsPC90ZD48L3RyPlxuICAgICAgICA8L3Rib2R5PlxuICAgICAgPC90YWJsZT5cbiAgICA8L2Rpdj5gO1xuICBPYmplY3QuYXNzaWduKHBhbmVsLnN0eWxlLCB7XG4gICAgcG9zaXRpb246ICAgJ2ZpeGVkJyxcbiAgICBib3R0b206ICAgICAnODBweCcsXG4gICAgcmlnaHQ6ICAgICAgJzI0cHgnLFxuICAgIGJhY2tncm91bmQ6ICcjMWYyOTM3JyxcbiAgICBjb2xvcjogICAgICAnI2Y5ZmFmYicsXG4gICAgYm9yZGVyOiAgICAgJzFweCBzb2xpZCAjMzc0MTUxJyxcbiAgICBib3JkZXJSYWRpdXM6ICc4cHgnLFxuICAgIHBhZGRpbmc6ICAgICcxNnB4IDIwcHgnLFxuICAgIHpJbmRleDogICAgICcxMDAwMCcsXG4gICAgZm9udFNpemU6ICAgJzAuODVlbScsXG4gICAgbWluV2lkdGg6ICAgJzM0MHB4JyxcbiAgICBib3hTaGFkb3c6ICAnMCA0cHggMjBweCByZ2JhKDAsMCwwLDAuNSknLFxuICB9KTtcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChwYW5lbCk7XG4gIHBhbmVsLnF1ZXJ5U2VsZWN0b3IoJyNrYi1zaG9ydGN1dHMtY2xvc2UnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHBhbmVsLnJlbW92ZSgpKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFJlc2V0IGNhcmQgZm9jdXMgd2hlbiB0YWIgY2hhbmdlcyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLyoqIENhbGxlZCB3aGVuZXZlciB0aGUgYWN0aXZlIHRhYiBjaGFuZ2VzIHNvIGNhcmQgZm9jdXMgcmVzZXRzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0Q2FyZEZvY3VzKCkge1xuICBfZm9jdXNlZENhcmRJbmRleCA9IC0xO1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcua2ItZm9jdXNlZCcpLmZvckVhY2goZWwgPT4gZWwuY2xhc3NMaXN0LnJlbW92ZSgna2ItZm9jdXNlZCcpKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEdsb2JhbCBrZXlkb3duIGhhbmRsZXIgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIF9vbktleURvd24oZSkge1xuICAvLyBDdHJsK0VudGVyIFx1MjE5MiBwcmltYXJ5IGFjdGlvbiAoYWx3YXlzLCBldmVuIGluIHRleHQgaW5wdXRzIHdoZW4gdGhlIG1haW5cbiAgLy8gc2VuZC1ib3ggaXMgZm9jdXNlZCwgdG8gbWF0Y2ggdGhlIGV4aXN0aW5nIEVudGVyIGJlaGF2aW91ciB0aGVyZSkuXG4gIGlmIChlLmN0cmxLZXkgJiYgZS5rZXkgPT09ICdFbnRlcicpIHtcbiAgICBfdHJpZ2dlclByaW1hcnlBY3Rpb24oKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBDdHJsK1NoaWZ0K1IgXHUyMTkyIHJlLXJ1biBjdXJyZW50IHBoYXNlXG4gIGlmIChlLmN0cmxLZXkgJiYgZS5zaGlmdEtleSAmJiBlLmtleSA9PT0gJ1InKSB7XG4gICAgY29uc3QgYWN0aXZlRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbaWRePVwic3RlcC1cIl0uYWN0aXZlJyk7XG4gICAgY29uc3Qgc3RlcCA9IGFjdGl2ZUVsID8gYWN0aXZlRWwuaWQucmVwbGFjZSgnc3RlcC0nLCAnJykgOiBudWxsO1xuICAgIGlmIChzdGVwICYmIHR5cGVvZiBjb25maXJtUmVSdW5QaGFzZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgY29uZmlybVJlUnVuUGhhc2Uoc3RlcCk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEN0cmwrWiAvIEN0cmwrU2hpZnQrWiBcdTIxOTIgdW5kby9yZWRvIHRoZSBtb3N0IHJlY2VudCBNYXN0ZXIgQ1YgZGF0YSBjaGFuZ2UuXG4gIC8vIFNjb3BlZCB0byB3aGVuIHRoZSBNYXN0ZXIgQ1YgbW9kYWwgaXMgb3BlbiBcdTIwMTQgYW5kIG5vIG5lc3RlZCBzdWItbW9kYWxcbiAgLy8gKGUuZy4gdGhlIGJhY2t1cC1oaXN0b3J5IGJyb3dzZXIpIGlzIHN0YWNrZWQgb24gdG9wIG9mIGl0IFx1MjAxNCBhbmQgZm9jdXNcbiAgLy8gaXNuJ3QgaW4gYSB0ZXh0IGZpZWxkLCBzaW5jZSBDdHJsK1ogaW5zaWRlIGEgdGV4dGFyZWEgbXVzdCBzdGlsbCBwZXJmb3JtXG4gIC8vIG5hdGl2ZSB0ZXh0LXVuZG8gcmF0aGVyIHRoYW4gYmVpbmcgaGlqYWNrZWQgYnkgdGhpcyBzaG9ydGN1dC5cbiAgaWYgKGUuY3RybEtleSAmJiAhZS5hbHRLZXkgJiYgKGUua2V5ID09PSAneicgfHwgZS5rZXkgPT09ICdaJylcbiAgICAgICYmIF9tYXN0ZXJDdk1vZGFsT3BlbigpICYmICFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja3VwLWhpc3Rvcnktb3ZlcmxheScpXG4gICAgICAmJiAhX2luVGV4dElucHV0KCkpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgaWYgKGUuc2hpZnRLZXkpIHtcbiAgICAgIGlmICh0eXBlb2YgcmVkb01hc3RlckRhdGFDaGFuZ2UgPT09ICdmdW5jdGlvbicpIHJlZG9NYXN0ZXJEYXRhQ2hhbmdlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0eXBlb2YgdW5kb01hc3RlckRhdGFDaGFuZ2UgPT09ICdmdW5jdGlvbicpIHVuZG9NYXN0ZXJEYXRhQ2hhbmdlKCk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEFsbCBzaW5nbGUta2V5IHNob3J0Y3V0cyBhcmUgc3VwcHJlc3NlZCB3aGVuIHR5cGluZyBpbnRvIGFuIGlucHV0LlxuICBpZiAoX2luVGV4dElucHV0KCkpIHJldHVybjtcbiAgLy8gQWxsIHNpbmdsZS1rZXkgc2hvcnRjdXRzIGFyZSBzdXBwcmVzc2VkIHdoZW4gYSBtb2RhbCBkaWFsb2cgaXMgb3BlbixcbiAgLy8gZXhjZXB0IEVzY2FwZSAoaGFuZGxlZCBieSB1aS1jb3JlLmpzKS5cbiAgaWYgKF9tb2RhbE9wZW4oKSkgcmV0dXJuO1xuXG4gIHN3aXRjaCAoZS5rZXkpIHtcbiAgICBjYXNlICc/JzpcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHNob3dLZXlib2FyZFNob3J0Y3V0c1BhbmVsKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIF9tb3ZlQ2FyZEZvY3VzKC0xKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ0Fycm93RG93bic6XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBfbW92ZUNhcmRGb2N1cygxKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2EnOlxuICAgIGNhc2UgJ0EnOlxuICAgICAgX2FjY2VwdEZvY3VzZWRDYXJkKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdyJzpcbiAgICBjYXNlICdSJzpcbiAgICAgIF9yZWplY3RGb2N1c2VkQ2FyZCgpO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGJyZWFrO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBJbml0aWFsaXNhdGlvbiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLyoqXG4gKiBBdHRhY2ggdGhlIGdsb2JhbCBrZXlib2FyZC1zaG9ydGN1dCBsaXN0ZW5lci5cbiAqIENhbGxlZCBvbmNlIGZyb20gYXBwLmpzIGFmdGVyIERPTUNvbnRlbnRMb2FkZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0S2V5Ym9hcmRTaG9ydGN1dHMoKSB7XG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBfb25LZXlEb3duKTtcbn1cbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8vIE9yY2hlc3RyYXRvciBlbnRyeS1wb2ludCBcdTIwMTQgYWxsIG1vZHVsZSBmdW5jdGlvbnMgYXJlIGV4cG9zZWQgYXMgZ2xvYmFscyBieSBidW5kbGUuanMuXG4vLyBOb3RlOiBhcHAuanMgaXMgYSBwbGFpbiBsZWdhY3kgc2NyaXB0IChub3QgYnVuZGxlZCkuIGxvZ2xldmVsIGlzIGF2YWlsYWJsZVxuLy8gdmlhIGdsb2JhbFRoaXMubG9nbGV2ZWwgKHNldCBieSBidW5kbGUuanMgd2hpY2ggaW5jbHVkZXMgd2ViL2xvZ2dlci5qcykuXG5jb25zdCBfYXBwTG9nID0gKHR5cGVvZiBsb2dsZXZlbCAhPT0gJ3VuZGVmaW5lZCcpID8gbG9nbGV2ZWwuZ2V0TG9nZ2VyKCdhcHAnKSA6IGNvbnNvbGU7XG4vLyBUaGlzIGZpbGUgY29udGFpbnMgb25seSBpbml0KCkgYW5kIHRvcC1sZXZlbCBldmVudC13aXJpbmcgKFx1MjI2NCAzMDAgbGluZXMpLlxuXG5sZXQgX2xpc3RlbmVyc1JlZ2lzdGVyZWQgPSBmYWxzZTtcblxuZnVuY3Rpb24gX3NldENvbm5lY3Rpb25NZXNzYWdlKG1lc3NhZ2VOb2RlLCB0ZXh0LCBraW5kID0gJ2luZm8nKSB7XG4gIGlmICghbWVzc2FnZU5vZGUpIHJldHVybjtcbiAgY29uc3QgY29udGVudCA9IG1lc3NhZ2VOb2RlLnF1ZXJ5U2VsZWN0b3IoJy5jb250ZW50Jyk7XG4gIGlmICghY29udGVudCkgcmV0dXJuO1xuICBjb250ZW50LnRleHRDb250ZW50ID0gdGV4dDtcbiAgY29udGVudC5zdHlsZS5kaXNwbGF5ID0gJ2lubGluZS1ibG9jayc7XG4gIGNvbnRlbnQuc3R5bGUucGFkZGluZyA9ICc2cHggMTBweCc7XG4gIGNvbnRlbnQuc3R5bGUuYm9yZGVyUmFkaXVzID0gJzk5OXB4JztcbiAgY29udGVudC5zdHlsZS5mb250V2VpZ2h0ID0gJzYwMCc7XG4gIGNvbnRlbnQuc3R5bGUuZm9udFNpemUgPSAnMC44OGVtJztcbiAgY29udGVudC5zdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkICNjYmQ1ZTEnO1xuICBpZiAoa2luZCA9PT0gJ3N1Y2Nlc3MnKSB7XG4gICAgY29udGVudC5zdHlsZS5jb2xvciA9ICcjMTY2NTM0JztcbiAgICBjb250ZW50LnN0eWxlLmJhY2tncm91bmQgPSAnI2VjZmRmNSc7XG4gICAgY29udGVudC5zdHlsZS5ib3JkZXJDb2xvciA9ICcjODZlZmFjJztcbiAgfSBlbHNlIGlmIChraW5kID09PSAnZXJyb3InKSB7XG4gICAgY29udGVudC5zdHlsZS5jb2xvciA9ICcjYjkxYzFjJztcbiAgICBjb250ZW50LnN0eWxlLmJhY2tncm91bmQgPSAnI2ZlZjJmMic7XG4gICAgY29udGVudC5zdHlsZS5ib3JkZXJDb2xvciA9ICcjZmVjYWNhJztcbiAgfSBlbHNlIHtcbiAgICBjb250ZW50LnN0eWxlLmNvbG9yID0gJyMxZTQwYWYnO1xuICAgIGNvbnRlbnQuc3R5bGUuYmFja2dyb3VuZCA9ICcjZWZmNmZmJztcbiAgICBjb250ZW50LnN0eWxlLmJvcmRlckNvbG9yID0gJyNiZmRiZmUnO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGluaXQoKSB7XG4gIC8vIEluaXRpYWxpemUgYWJvcnQgY29udHJvbGxlciB0byBudWxsIChzZXQgdG8gbmV3IEFib3J0Q29udHJvbGxlciBieSBzZXRMb2FkaW5nKHRydWUpKVxuICB3aW5kb3cuX2N1cnJlbnRBYm9ydENvbnRyb2xsZXIgPSBudWxsO1xuXG4gIC8vIEZsdXNoIGFueSBtZXNzYWdlcyB0aGF0IHdlcmUgcXVldWVkIGJlZm9yZSBET01Db250ZW50TG9hZGVkIChkZWZlbnNpdmUgXHUyMDE0IHNob3VsZCBiZSBlbXB0eSBpbiBwcmFjdGljZSkuXG4gIF9mbHVzaE1lc3NhZ2VRdWV1ZSgpO1xuXG4gIGNvbnN0IGhhc0FjdGl2ZVNlc3Npb24gPSBhd2FpdCBlbnN1cmVTZXNzaW9uQ29udGV4dCgpO1xuICBpZiAoIWhhc0FjdGl2ZVNlc3Npb24pIHtcbiAgICBjb25zdCBmYWlsZWRNZXNzYWdlID0gYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgJ1x1MjZBMFx1RkUwRiBDb3VsZCBub3QgZXN0YWJsaXNoIGEgc2Vzc2lvbi4gQ3JlYXRlIG9yIGxvYWQgYSBzZXNzaW9uIHRvIGNvbnRpbnVlLicpO1xuICAgIF9zZXRDb25uZWN0aW9uTWVzc2FnZShmYWlsZWRNZXNzYWdlLCAnXHUyNkEwXHVGRTBGIENvdWxkIG5vdCBlc3RhYmxpc2ggYSBzZXNzaW9uLiBDcmVhdGUgb3IgbG9hZCBhIHNlc3Npb24gdG8gY29udGludWUuJywgJ2Vycm9yJyk7XG4gICAgc2V0dXBFdmVudExpc3RlbmVycygpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFNob3cgd2VsY29tZS9vbmJvYXJkaW5nIG1vZGFsIG9uIGV2ZXJ5IHN0YXJ0dXAgdW50aWwgdXNlciBkaXNtaXNzZXMgaXQuXG4gIGF3YWl0IG1heWJlU2hvd1dlbGNvbWVNb2RhbCgpO1xuXG4gIC8vIFJlc3RvcmUgc2Vzc2lvbiBzdGF0ZSBmaXJzdFxuICBhd2FpdCByZXN0b3JlU2Vzc2lvbigpO1xuXG4gIC8vIFNob3cgY29ubmVjdGlvbiBzdGF0dXMgYWZ0ZXIgcmVzdG9yZVNlc3Npb24gc28gaXQgaXMgbm90IHJlbW92ZWQgYnkgaGlzdG9yeSByZXN0b3JlLlxuICBjb25zdCBjb25uZWN0aW9uTWVzc2FnZSA9IGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsICdcdUQ4M0RcdUREMDQgQ29ubmVjdGluZyB0byBDViBCdWlsZGVyLi4uJyk7XG4gIF9zZXRDb25uZWN0aW9uTWVzc2FnZShjb25uZWN0aW9uTWVzc2FnZSwgJ1x1RDgzRFx1REQwNCBDb25uZWN0aW5nIHRvIENWIEJ1aWxkZXIuLi4nLCAnaW5mbycpO1xuXG4gIC8vIFJlc3RvcmUgQVRTIGJhZGdlIGZyb20gY2FjaGVkIHNjb3JlIChpZiBhbnkpXG4gIHVwZGF0ZUF0c0JhZGdlKHN0YXRlTWFuYWdlci5nZXRBdHNTY29yZSgpKTtcblxuICAvLyBJbml0aWFsaXplIHRoZSByZXN0XG4gIGF3YWl0IGZldGNoU3RhdHVzKCk7XG4gIGNvbnN0IGNvbm5lY3RlZE1lc3NhZ2UgPSBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnXHUyNzA1IENvbm5lY3Rpb24gc3VjY2Vzc2Z1bC4nKTtcbiAgX3NldENvbm5lY3Rpb25NZXNzYWdlKGNvbm5lY3RlZE1lc3NhZ2UsICdcdTI3MDUgQ29ubmVjdGlvbiBzdWNjZXNzZnVsLicsICdzdWNjZXNzJyk7XG4gIGlmIChzdGF0ZU1hbmFnZXIuZ2V0Q3VycmVudFRhYigpID09PSAnam9iJykgYXdhaXQgcG9wdWxhdGVKb2JUYWIoKTtcbiAgc2V0dXBFdmVudExpc3RlbmVycygpO1xuXG4gIC8vIFNldCB1cCBwZXJpb2RpYyBzdGF0ZSBzYXZpbmdcbiAgc2V0SW50ZXJ2YWwoc2F2ZVRhYkRhdGEsIDUwMDApOyAvLyBTYXZlIGV2ZXJ5IDUgc2Vjb25kc1xuXG4gIC8vIFNhdmUgc3RhdGUgYmVmb3JlIHBhZ2UgdW5sb2FkXG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCAoKSA9PiB7XG4gICAgc2F2ZVRhYkRhdGEoKTtcbiAgICBjb25zdCBhY3RpdmVTZXNzaW9uSWQgPSBzdGF0ZU1hbmFnZXIuZ2V0U2Vzc2lvbklkKCk7XG4gICAgaWYgKGFjdGl2ZVNlc3Npb25JZCkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oU3RvcmFnZUtleXMuU0VTU0lPTl9JRCwgYWN0aXZlU2Vzc2lvbklkKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIFByb21wdCB1c2VyIHRvIGFuYWx5emUgaWYgYSBqb2IgZGVzY3JpcHRpb24gaXMgbG9hZGVkIGJ1dCBub3QgeWV0IGFuYWx5emVkLlxuICAvLyBEbyBOT1QgYXV0by1maXJlIFx1MjAxNCBhIHJldHVybmluZyB1c2VyIG1heSBoYXZlIGludGVudGlvbmFsbHkgbGVmdCBpdCB1bmFuYWx5emVkXG4gIC8vIChlLmcuIG1pZC1lZGl0KS4gTGV0IHRoZW0gY2xpY2sgQW5hbHlzZSBKb2IgZXhwbGljaXRseSAoR0FQLTI0OCkuXG4gIGlmICghc3RhdGVNYW5hZ2VyLmlzUmVjb25uZWN0aW5nKCkpIHtcbiAgICBjb25zdCBzdGF0dXMgPSBhd2FpdCBmZXRjaFN0YXR1cygpO1xuICAgIGlmICghc3RhdHVzLl9lcnJvciAmJiBzdGF0dXMuam9iX2Rlc2NyaXB0aW9uICYmICFzdGF0dXMuam9iX2FuYWx5c2lzKSB7XG4gICAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnXHVEODNEXHVEQ0NCIEpvYiBkZXNjcmlwdGlvbiBkZXRlY3RlZCBcdTIwMTQgY2xpY2sgPHN0cm9uZz5BbmFseXNlIEpvYjwvc3Ryb25nPiB3aGVuIHJlYWR5IHRvIGJlZ2luLicpO1xuICAgICAgY29uc3QgYW5hbHl6ZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhbmFseXplLWJ0bicpO1xuICAgICAgaWYgKGFuYWx5emVCdG4pIHtcbiAgICAgICAgYW5hbHl6ZUJ0bi5zdHlsZS5vdXRsaW5lID0gJzJweCBzb2xpZCAjM2I4MmY2JztcbiAgICAgICAgYW5hbHl6ZUJ0bi5zdHlsZS5vdXRsaW5lT2Zmc2V0ID0gJzJweCc7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzdGF0dXMuam9iX2FuYWx5c2lzKSB7XG4gICAgICBfYXBwTG9nLmluZm8oJ0pvYiBhbmFseXNpcyBhbHJlYWR5IGNvbXBsZXRlLCBza2lwcGluZyBhdXRvLWFuYWx5c2lzJyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIF9hcHBMb2cuaW5mbygnUmVjb25uZWN0aW5nIHRvIGV4aXN0aW5nIHNlc3Npb24sIHNraXBwaW5nIGF1dG8tYW5hbHlzaXMnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzZXR1cEV2ZW50TGlzdGVuZXJzKCkge1xuICBpZiAoX2xpc3RlbmVyc1JlZ2lzdGVyZWQpIHJldHVybjtcbiAgX2xpc3RlbmVyc1JlZ2lzdGVyZWQgPSB0cnVlO1xuXG4gIC8vIFRhYiBzd2l0Y2hpbmdcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnRhYicpLmZvckVhY2godGFiID0+IHtcbiAgICB0YWIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBzd2l0Y2hUYWIodGFiLmRhdGFzZXQudGFiKSk7XG4gIH0pO1xuXG4gIC8vIE1lc3NhZ2Ugc2VuZGluZ1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VuZC1idG4nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHNlbmRNZXNzYWdlKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21lc3NhZ2UtaW5wdXQnKS5hZGRFdmVudExpc3RlbmVyKCdrZXlwcmVzcycsIChlKSA9PiB7XG4gICAgaWYgKGUua2V5ID09PSAnRW50ZXInKSBzZW5kTWVzc2FnZSgpO1xuICB9KTtcblxuICAvLyBBY3Rpb24gYnV0dG9ucyBcdTIwMTQgb25lIHBlciB3b3JrZmxvdyBzdGFnZVxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYW5hbHl6ZS1idG4nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFuYWx5emVKb2IpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjb21tZW5kLWJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gc2VuZEFjdGlvbigncmVjb21tZW5kX2N1c3RvbWl6YXRpb25zJykpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ2VuZXJhdGUtYnRuJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gU29mdCBnYXRlOiB3YXJuIGlmIGN1c3RvbWlzYXRpb24gaXRlbXMgaGF2ZSBuZXZlciBiZWVuIGluZGl2aWR1YWxseSByZXZpZXdlZCAoR0FQLTExNilcbiAgICBjb25zdCByZXZpZXdlZCA9IHdpbmRvdy5fZXhwbGljaXRseVJldmlld2VkIHx8IHsgZXhwZXJpZW5jZXM6IG5ldyBTZXQoKSwgc2tpbGxzOiBuZXcgU2V0KCkgfTtcbiAgICBjb25zdCB0b3RhbEV4cCA9ICh3aW5kb3cuX2V4cGVyaWVuY2VzT3JkZXJlZCB8fCBbXSkubGVuZ3RoO1xuICAgIGNvbnN0IHRvdGFsU2tpbGwgPSBPYmplY3Qua2V5cyh1c2VyU2VsZWN0aW9ucz8uc2tpbGxzIHx8IHt9KS5sZW5ndGg7XG4gICAgY29uc3QgdW5yZXZpZXdlZEV4cCA9IHRvdGFsRXhwIC0gcmV2aWV3ZWQuZXhwZXJpZW5jZXMuc2l6ZTtcbiAgICBjb25zdCB1bnJldmlld2VkU2tpbGwgPSB0b3RhbFNraWxsIC0gcmV2aWV3ZWQuc2tpbGxzLnNpemU7XG4gICAgY29uc3QgdW5yZXZpZXdlZFRvdGFsID0gTWF0aC5tYXgoMCwgdW5yZXZpZXdlZEV4cCkgKyBNYXRoLm1heCgwLCB1bnJldmlld2VkU2tpbGwpO1xuICAgIGlmICh1bnJldmlld2VkVG90YWwgPiAwKSB7XG4gICAgICBjb25zdCBwYXJ0cyA9IFtdO1xuICAgICAgaWYgKHVucmV2aWV3ZWRFeHAgPiAwKSBwYXJ0cy5wdXNoKGAke3VucmV2aWV3ZWRFeHB9IGV4cGVyaWVuY2UgZW50ciR7dW5yZXZpZXdlZEV4cCA9PT0gMSA/ICd5JyA6ICdpZXMnfWApO1xuICAgICAgaWYgKHVucmV2aWV3ZWRTa2lsbCA+IDApIHBhcnRzLnB1c2goYCR7dW5yZXZpZXdlZFNraWxsfSBza2lsbCR7dW5yZXZpZXdlZFNraWxsID09PSAxID8gJycgOiAncyd9YCk7XG4gICAgICBjb25zdCBvayA9IHdpbmRvdy5jb25maXJtKFxuICAgICAgICBgJHtwYXJ0cy5qb2luKCcgYW5kICcpfSBub3QgaW5kaXZpZHVhbGx5IHJldmlld2VkIFx1MjAxNCB0aGUgQUkncyByZWNvbW1lbmRhdGlvbiB3aWxsIGJlIHVzZWQgZm9yIHRoZXNlLlxcblxcblByb2NlZWQgYW55d2F5P2BcbiAgICAgICk7XG4gICAgICBpZiAoIW9rKSByZXR1cm47XG4gICAgfVxuICAgIGlmICh1c2VyU2VsZWN0aW9ucyAmJiAoT2JqZWN0LmtleXModXNlclNlbGVjdGlvbnMuZXhwZXJpZW5jZXMpLmxlbmd0aCA+IDAgfHwgT2JqZWN0LmtleXModXNlclNlbGVjdGlvbnMuc2tpbGxzKS5sZW5ndGggPiAwKSkge1xuICAgICAgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgJ0FwcGx5aW5nIHlvdXIgcmV2aWV3IGRlY2lzaW9ucy4uLicpO1xuICAgICAgLy8gRGVjaXNpb25zIHdlcmUgYWxyZWFkeSBzdWJtaXR0ZWQgdmlhIHN1Ym1pdEV4cGVyaWVuY2VEZWNpc2lvbnMvc3VibWl0U2tpbGxEZWNpc2lvbnNcbiAgICAgIC8vIEJhY2tlbmQgaGFzIHRoZW0gaW4gY29udmVyc2F0aW9uLnN0YXRlWydleHBlcmllbmNlX2RlY2lzaW9ucyddIGFuZCBbJ3NraWxsX2RlY2lzaW9ucyddXG4gICAgfVxuICAgIGF3YWl0IGZldGNoQW5kUmV2aWV3UmV3cml0ZXMoKTtcbiAgfSk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXdyaXRlLWJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc3VibWl0UmV3cml0ZURlY2lzaW9ucyk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzcGVsbC1idG4nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHN1Ym1pdFNwZWxsQ2hlY2tEZWNpc2lvbnMpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ2VuZXJhdGUtcHJvY2VlZC1idG4nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHN3aXRjaFRhYignbGF5b3V0JykpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGF5b3V0LWJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlTGF5b3V0UHJpbWFyeUFjdGlvbik7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaW5hbC1nZW5lcmF0ZS1wcm9jZWVkLWJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZmluYWxHZW5lcmF0aW9uQ29tcGxldGUpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmluYWxpc2UtYWN0aW9uLWJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gc3dpdGNoVGFiKCdmaW5hbGlzZScpKTtcblxuICBpZiAodHlwZW9mIGluaXRLZXlib2FyZFNob3J0Y3V0cyA9PT0gJ2Z1bmN0aW9uJykgaW5pdEtleWJvYXJkU2hvcnRjdXRzKCk7XG59XG5cbi8vIFRlc3RzIG5vdyBpbXBvcnQgaGVscGVyIGZ1bmN0aW9ucyBmcm9tIHRoZWlyIGNhbm9uaWNhbCBFUyBtb2R1bGVzIGRpcmVjdGx5LlxuXG5leHBvcnQgeyBpbml0LCBzZXR1cEV2ZW50TGlzdGVuZXJzIH07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9zcmMvbWFpbi5qcyBcdTIwMTQgZXNidWlsZCBlbnRyeSBwb2ludCBmb3IgdGhlIGZ1bGwgYnJvd3NlciBidW5kbGUuXG4gKlxuICogUGhhc2UgMiBtb2R1bGVzOiB1dGlscywgYXBpLWNsaWVudCwgc3RhdGUtbWFuYWdlciwgdWktY29yZSwgbGF5b3V0LWluc3RydWN0aW9uXG4gKiBQaGFzZSAzIG1vZHVsZXM6IGFsbCBkb21haW4gc3BsaXQgbW9kdWxlcyAoVGllciAwXHUyMDEzNykgZnJvbSB0aGUgYXBwLmpzIG1vZHVsYXJpc2F0aW9uLlxuICpcbiAqIEV2ZXJ5IGV4cG9ydCBpcyBhc3NpZ25lZCB0byBgd2luZG93YCBzbyB0aGF0IGxlZ2FjeSBpbmxpbmUgb25jbGljaz1cImZuKClcIlxuICogaGFuZGxlcnMgYW5kIGFwcC5qcyBjb250aW51ZSB0byB3b3JrIHVuY2hhbmdlZC5cbiAqXG4gKiBCdWlsZDogIG5wbSBydW4gYnVpbGQgICAgICAgICAgXHUyMTkyIHdlYi9idW5kbGUuanMgKGRldmVsb3BtZW50LCB1bm1pbmlmaWVkKVxuICogICAgICAgICBucG0gcnVuIGJ1aWxkOnByb2QgICAgIFx1MjE5MiB3ZWIvYnVuZGxlLmpzIChtaW5pZmllZClcbiAqICAgICAgICAgbnBtIHJ1biBidWlsZDp3YXRjaCAgICBcdTIxOTIgcmVidWlsZCBvbiBldmVyeSBzb3VyY2UgY2hhbmdlXG4gKi9cblxuLy8gXHUyNTAwXHUyNTAwIExvZ2dlciAobXVzdCBiZSBmaXJzdCBzbyBuYW1lZCBsb2dnZXJzIGFyZSBhdmFpbGFibGUgdG8gYWxsIG1vZHVsZXMpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuaW1wb3J0ICogYXMgTG9nZ2VyIGZyb20gJy4uL2xvZ2dlci5qcyc7XG5cbi8vIFx1MjUwMFx1MjUwMCBQaGFzZSAyIChvcmlnaW5hbCBidW5kbGUpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuaW1wb3J0ICogYXMgVXRpbHMgICAgICAgICAgICAgZnJvbSAnLi4vdXRpbHMuanMnO1xuaW1wb3J0ICogYXMgQXBpQ2xpZW50ICAgICAgICAgZnJvbSAnLi4vYXBpLWNsaWVudC5qcyc7XG5pbXBvcnQgKiBhcyBTdGF0ZSAgICAgICAgICAgICBmcm9tICcuLi9zdGF0ZS1tYW5hZ2VyLmpzJztcbmltcG9ydCAqIGFzIFByb3ZpZGVySW5mbyAgICAgIGZyb20gJy4uL3Byb3ZpZGVyLWluZm8uanMnO1xuaW1wb3J0ICogYXMgVWlDb3JlICAgICAgICAgICAgZnJvbSAnLi4vdWktY29yZS5qcyc7XG5pbXBvcnQgKiBhcyBMYXlvdXRJbnN0cnVjdGlvbiBmcm9tICcuLi9sYXlvdXQtaW5zdHJ1Y3Rpb24uanMnO1xuXG4vLyBcdTI1MDBcdTI1MDAgVGllciAwIFx1MjAxNCBubyBkZXBlbmRlbmNpZXMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5pbXBvcnQgKiBhcyBWYWxpZGF0b3JzICAgICAgICAgICAgZnJvbSAnLi4vdmFsaWRhdG9ycy5qcyc7XG5pbXBvcnQgKiBhcyBSZWNvbW1lbmRhdGlvbkhlbHBlcnMgZnJvbSAnLi4vcmVjb21tZW5kYXRpb24taGVscGVycy5qcyc7XG5pbXBvcnQgKiBhcyBVaUhlbHBlcnMgICAgICAgICAgICAgZnJvbSAnLi4vdWktaGVscGVycy5qcyc7XG5pbXBvcnQgKiBhcyBQcm9wb3NhbFJldmlldyAgICAgICAgZnJvbSAnLi4vcHJvcG9zYWwtcmV2aWV3LmpzJztcblxuLy8gXHUyNTAwXHUyNTAwIFRpZXIgMSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmltcG9ydCAqIGFzIEZldGNoVXRpbHMgICBmcm9tICcuLi9mZXRjaC11dGlscy5qcyc7XG5pbXBvcnQgKiBhcyBNZXNzYWdlUXVldWUgZnJvbSAnLi4vbWVzc2FnZS1xdWV1ZS5qcyc7XG5pbXBvcnQgKiBhcyBMbG1Mb2cgICAgICAgZnJvbSAnLi4vbGxtLWxvZy5qcyc7XG5cbi8vIFx1MjUwMFx1MjUwMCBUaWVyIDIgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5pbXBvcnQgKiBhcyBBdXRoUHJvdmlkZXIgICBmcm9tICcuLi9hdXRoLXByb3ZpZGVyLmpzJztcbmltcG9ydCAqIGFzIEF0c1JlZmluZW1lbnQgIGZyb20gJy4uL2F0cy1yZWZpbmVtZW50LmpzJztcbmltcG9ydCAqIGFzIEF0c01vZGFscyAgICAgIGZyb20gJy4uL2F0cy1tb2RhbHMuanMnO1xuaW1wb3J0ICogYXMgU2Vzc2lvbkFjdGlvbnMgZnJvbSAnLi4vc2Vzc2lvbi1hY3Rpb25zLmpzJztcbmltcG9ydCAqIGFzIEpvYkFuYWx5c2lzICAgIGZyb20gJy4uL2pvYi1hbmFseXNpcy5qcyc7XG5cbi8vIFx1MjUwMFx1MjUwMCBUaWVyIDMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5pbXBvcnQgKiBhcyBHb2FscyAgICAgICAgICAgZnJvbSAnLi4vZ29hbHMuanMnO1xuaW1wb3J0ICogYXMgU2Vzc2lvbk1hbmFnZXIgIGZyb20gJy4uL3Nlc3Npb24tbWFuYWdlci5qcyc7XG5pbXBvcnQgKiBhcyBKb2JJbnB1dCAgICAgICAgZnJvbSAnLi4vam9iLWlucHV0LmpzJztcbmltcG9ydCAqIGFzIE1lc3NhZ2VEaXNwYXRjaCBmcm9tICcuLi9tZXNzYWdlLWRpc3BhdGNoLmpzJztcbmltcG9ydCAqIGFzIFF1ZXN0aW9uc1BhbmVsICBmcm9tICcuLi9xdWVzdGlvbnMtcGFuZWwuanMnO1xuXG4vLyBcdTI1MDBcdTI1MDAgVGllciA0IFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuaW1wb3J0ICogYXMgUmV2aWV3SWNvbnMgICAgZnJvbSAnLi4vcmV2aWV3LWljb25zLmpzJztcbmltcG9ydCAqIGFzIFJldmlld1RhYmxlQmFzZSBmcm9tICcuLi9yZXZpZXctdGFibGUtYmFzZS5qcyc7XG5cbi8vIFx1MjUwMFx1MjUwMCBUaWVyIDUgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5pbXBvcnQgKiBhcyBFeHBlcmllbmNlUmV2aWV3ICAgZnJvbSAnLi4vZXhwZXJpZW5jZS1yZXZpZXcuanMnO1xuaW1wb3J0ICogYXMgU2tpbGxzUmV2aWV3ICAgICAgIGZyb20gJy4uL3NraWxscy1yZXZpZXcuanMnO1xuaW1wb3J0ICogYXMgQWNoaWV2ZW1lbnRzUmV2aWV3IGZyb20gJy4uL2FjaGlldmVtZW50cy1yZXZpZXcuanMnO1xuaW1wb3J0ICogYXMgVGFnbGluZVJldmlldyAgICAgIGZyb20gJy4uL3RhZ2xpbmUtcmV2aWV3LmpzJztcbmltcG9ydCAqIGFzIFN1bW1hcnlSZXZpZXcgICAgICBmcm9tICcuLi9zdW1tYXJ5LXJldmlldy5qcyc7XG5pbXBvcnQgKiBhcyBQdWJsaWNhdGlvbnNSZXZpZXcgZnJvbSAnLi4vcHVibGljYXRpb25zLXJldmlldy5qcyc7XG5cbi8vIFx1MjUwMFx1MjUwMCBUaWVyIDYgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5pbXBvcnQgKiBhcyBSZXdyaXRlUmV2aWV3ICAgICAgZnJvbSAnLi4vcmV3cml0ZS1yZXZpZXcuanMnO1xuaW1wb3J0ICogYXMgU3BlbGxDaGVjayAgICAgICAgIGZyb20gJy4uL3NwZWxsLWNoZWNrLmpzJztcbmltcG9ydCAqIGFzIERvd25sb2FkVGFiICAgICAgICBmcm9tICcuLi9kb3dubG9hZC10YWIuanMnO1xuaW1wb3J0ICogYXMgRmluYWxHZW5lcmF0ZSAgICAgIGZyb20gJy4uL2ZpbmFsLWdlbmVyYXRlLmpzJztcbmltcG9ydCAqIGFzIFdvcmtmbG93U3RlcHMgICAgICBmcm9tICcuLi93b3JrZmxvdy1zdGVwcy5qcyc7XG5pbXBvcnQgKiBhcyBNYXN0ZXJEYXRhQWlVcGRhdGUgZnJvbSAnLi4vbWFzdGVyLWRhdGEtYWktdXBkYXRlLmpzJztcbmltcG9ydCAqIGFzIE1hc3RlckN2ICAgICAgICAgICBmcm9tICcuLi9tYXN0ZXItY3YuanMnO1xuaW1wb3J0ICogYXMgQ292ZXJMZXR0ZXIgICAgICAgIGZyb20gJy4uL2NvdmVyLWxldHRlci5qcyc7XG5pbXBvcnQgKiBhcyBTY3JlZW5pbmdRdWVzdGlvbnMgZnJvbSAnLi4vc2NyZWVuaW5nLXF1ZXN0aW9ucy5qcyc7XG5pbXBvcnQgKiBhcyBGaW5hbGlzZSAgICAgICAgICAgZnJvbSAnLi4vZmluYWxpc2UuanMnO1xuaW1wb3J0ICogYXMgSW50ZXJ2aWV3UHJlcCAgICAgIGZyb20gJy4uL2ludGVydmlldy1wcmVwLmpzJztcbmltcG9ydCAqIGFzIFRoYW5rWW91ICAgICAgICAgICBmcm9tICcuLi90aGFuay15b3UuanMnO1xuaW1wb3J0ICogYXMgSGFydmVzdCAgICAgICAgICAgIGZyb20gJy4uL2hhcnZlc3QuanMnO1xuXG4vLyBcdTI1MDBcdTI1MDAgVGllciA3IFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuaW1wb3J0ICogYXMgU2Vzc2lvblN3aXRjaGVyVWkgIGZyb20gJy4uL3Nlc3Npb24tc3dpdGNoZXItdWkuanMnO1xuaW1wb3J0ICogYXMgS2V5Ym9hcmRTaG9ydGN1dHMgIGZyb20gJy4uL2tleWJvYXJkLXNob3J0Y3V0cy5qcyc7XG5cbi8vIFx1MjUwMFx1MjUwMCBBcHAgb3JjaGVzdHJhdG9yIChmb2xkZWQgaW50byBidW5kbGUgXHUyMDE0IEdBUC02NCkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5pbXBvcnQgKiBhcyBBcHAgZnJvbSAnLi4vYXBwLmpzJztcblxuLy8gXHUyNTAwXHUyNTAwIEFzc2lnbiBhbGwgZXhwb3J0cyB0byBnbG9iYWxUaGlzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuLy8gUGhhc2UgMiBtb2R1bGVzIGZpcnN0OyBwaGFzZSAzIGRvbWFpbiBtb2R1bGVzIGZvbGxvdyBzbyBmdWxseS1mZWF0dXJlZFxuLy8gaW1wbGVtZW50YXRpb25zIG92ZXJyaWRlIGFueSBwbGFjZWhvbGRlciBzdHVicyAoZS5nLiBzaG93U2Vzc2lvbkNvbmZsaWN0QmFubmVyXG4vLyBpbiBzZXNzaW9uLXN3aXRjaGVyLXVpIG92ZXJyaWRlcyB0aGUgc2ltcGxlIHN0dWIgaW4gdWktY29yZSkuXG5PYmplY3QuYXNzaWduKGdsb2JhbFRoaXMsXG4gIExvZ2dlciwgVXRpbHMsIEFwaUNsaWVudCwgU3RhdGUsIFByb3ZpZGVySW5mbywgVWlDb3JlLCBMYXlvdXRJbnN0cnVjdGlvbixcbiAgVmFsaWRhdG9ycywgUmVjb21tZW5kYXRpb25IZWxwZXJzLCBVaUhlbHBlcnMsIFByb3Bvc2FsUmV2aWV3LFxuICBGZXRjaFV0aWxzLCBNZXNzYWdlUXVldWUsIExsbUxvZyxcbiAgQXV0aFByb3ZpZGVyLCBBdHNSZWZpbmVtZW50LCBBdHNNb2RhbHMsIFNlc3Npb25BY3Rpb25zLCBKb2JBbmFseXNpcyxcbiAgR29hbHMsXG4gIFNlc3Npb25NYW5hZ2VyLCBKb2JJbnB1dCwgTWVzc2FnZURpc3BhdGNoLCBRdWVzdGlvbnNQYW5lbCxcbiAgUmV2aWV3VGFibGVCYXNlLFxuICBFeHBlcmllbmNlUmV2aWV3LCBTa2lsbHNSZXZpZXcsIEFjaGlldmVtZW50c1JldmlldywgVGFnbGluZVJldmlldywgU3VtbWFyeVJldmlldywgUHVibGljYXRpb25zUmV2aWV3LCBSZXZpZXdJY29ucyxcbiAgUmV3cml0ZVJldmlldywgU3BlbGxDaGVjaywgRG93bmxvYWRUYWIsIEZpbmFsR2VuZXJhdGUsIFdvcmtmbG93U3RlcHMsIE1hc3RlckRhdGFBaVVwZGF0ZSwgTWFzdGVyQ3YsXG4gIENvdmVyTGV0dGVyLCBTY3JlZW5pbmdRdWVzdGlvbnMsIEZpbmFsaXNlLCBJbnRlcnZpZXdQcmVwLCBUaGFua1lvdSwgSGFydmVzdCxcbiAgU2Vzc2lvblN3aXRjaGVyVWksIEtleWJvYXJkU2hvcnRjdXRzLFxuICBBcHAsXG4pO1xuXG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgQXBwLmluaXQpO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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QUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxVQThFL0Isa0JBQWtCLE1BQU0sQ0FBQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFVBYXpCLDBCQUEwQixjQUFjLENBQUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFVBaUJ6QywrQkFBK0IsWUFBWSxDQUFDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFVBa0I1QyxxQkFBcUIsU0FBUyxDQUFDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUE0aEJ2QyxRQUFJLENBQUMsWUFBWTtBQUNmLFlBQU0sZUFBZTtBQUNyQixjQUFRLGlCQUFpQixRQUFRLEVBQUUsUUFBUSxTQUFPO0FBQ2hELGNBQU0sV0FBVyxJQUFJLGFBQWEsU0FBUyxLQUFLLElBQUksS0FBSztBQUN6RCxZQUFJLGFBQWEsS0FBSyxPQUFPLEVBQUc7QUFDaEMsWUFBSSxXQUFXO0FBQ2YsWUFBSSxNQUFNLFVBQVU7QUFDcEIsWUFBSSxNQUFNLFNBQVM7QUFDbkIsWUFBSSxhQUFhLFNBQVMsK0RBQTBEO0FBQUEsTUFDdEYsQ0FBQztBQUFBLElBQ0g7QUFHQSxxQkFBaUI7QUFBQSxFQUNuQjtBQUVBLFdBQVMsd0JBQXdCLElBQUk7QUFDbkMsVUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDO0FBQy9CLFVBQU0sVUFBVSxRQUFRLFdBQVcsQ0FBQztBQUNwQyxVQUFNLE9BQU87QUFBQSxNQUNYLENBQUMsUUFBYSxHQUFHLFFBQVEsRUFBRTtBQUFBLE1BQzNCLENBQUMsU0FBYSxHQUFHLFNBQVMsR0FBRyxZQUFZLEVBQUU7QUFBQSxNQUMzQyxDQUFDLFNBQWEsUUFBUSxTQUFTLEdBQUcsU0FBUyxFQUFFO0FBQUEsTUFDN0MsQ0FBQyxTQUFhLFFBQVEsU0FBUyxFQUFFO0FBQUEsTUFDakMsQ0FBQyxZQUFhLFFBQVEsWUFBWSxFQUFFO0FBQUEsTUFDcEMsQ0FBQyxXQUFhLFFBQVEsV0FBVyxFQUFFO0FBQUEsTUFDbkMsQ0FBQyxZQUFhLENBQUMsUUFBUSxNQUFNLFFBQVEsS0FBSyxFQUFFLE9BQU8sT0FBTyxFQUFFLEtBQUssSUFBSSxDQUFDO0FBQUEsSUFDeEUsRUFBRSxPQUFPLENBQUMsQ0FBQyxFQUFFQyxFQUFDLE1BQU1BLEVBQUM7QUFDckIsUUFBSSxDQUFDLEtBQUssUUFBUTtBQUNoQixhQUFPO0FBQUEsSUFDVDtBQUNBLFdBQU8sZ0NBQWdDLEtBQUs7QUFBQSxNQUFJLENBQUMsQ0FBQyxPQUFPLEtBQUssTUFDNUQsb0NBQW9DLFdBQVcsS0FBSyxDQUFDLFlBQVksV0FBVyxLQUFLLENBQUM7QUFBQSxJQUNwRixFQUFFLEtBQUssRUFBRSxDQUFDO0FBQUEsRUFDWjtBQUVBLFdBQVMsdUJBQXVCLGFBQWE7QUFDM0MsUUFBSSxDQUFDLFlBQVksUUFBUTtBQUN2QixhQUFPO0FBQUEsSUFDVDtBQUNBLFVBQU0sT0FBTyxZQUFZLElBQUksQ0FBQyxLQUFLLFFBQVE7QUFDekMsWUFBTSxRQUFVLFdBQVcsSUFBSSxTQUFTLEVBQUU7QUFDMUMsWUFBTSxVQUFVLFdBQVcsSUFBSSxXQUFXLEVBQUU7QUFDNUMsWUFBTSxNQUFVLElBQUksWUFBWSxDQUFDO0FBQ2pDLFlBQU0sV0FBVyxXQUFXLENBQUMsSUFBSSxNQUFNLElBQUksS0FBSyxFQUFFLE9BQU8sT0FBTyxFQUFFLEtBQUssSUFBSSxDQUFDO0FBQzVFLFlBQU0sUUFBVSxXQUFXLENBQUMsSUFBSSxZQUFZLElBQUksWUFBWSxTQUFTLEVBQUUsT0FBTyxPQUFPLEVBQUUsS0FBSyxVQUFLLENBQUM7QUFDbEcsWUFBTSxZQUFZLElBQUksZ0JBQWdCLENBQUMsR0FBRztBQUMxQyxZQUFNLFFBQVEsV0FBVyxJQUFJLE1BQU0sRUFBRTtBQUNyQyxhQUFPO0FBQUE7QUFBQTtBQUFBLG9CQUdTLEtBQUs7QUFBQSx5Q0FDZ0IsT0FBTztBQUFBLFlBQ3BDLFdBQVcsdURBQW9ELFFBQVEsWUFBWSxFQUFFO0FBQUE7QUFBQSx5RUFFeEIsS0FBSztBQUFBLHdFQUNOLFFBQVE7QUFBQTtBQUFBLG9FQUVaLEtBQUs7QUFBQSw2Q0FDNUIsS0FBSztBQUFBLHNFQUNvQixXQUFXLElBQUksTUFBTSxFQUFFLENBQUMsT0FBTyxLQUFLO0FBQUEsK0NBQzNELEtBQUs7QUFBQTtBQUFBO0FBQUEsSUFHbEQsQ0FBQyxFQUFFLEtBQUssRUFBRTtBQUNWLFdBQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxlQVVNLElBQUk7QUFBQTtBQUFBLEVBRW5CO0FBRUEsV0FBUyxxQkFBcUIsUUFBUTtBQUNwQyxVQUFNLGlCQUFpQixDQUFDLE1BQU07QUFDNUIsVUFBSSxPQUFPLE1BQU0sVUFBVTtBQUN6QixlQUFPLEVBQUUsTUFBTSxHQUFHLGFBQWEsQ0FBQyxFQUFFO0FBQUEsTUFDcEM7QUFDQSxVQUFJLEtBQUssT0FBTyxNQUFNLFVBQVU7QUFDOUIsZUFBTztBQUFBLFVBQ0wsTUFBTSxFQUFFLFFBQVE7QUFBQSxVQUNoQixhQUFhLE1BQU0sUUFBUSxFQUFFLFdBQVcsSUFBSSxFQUFFLGNBQWMsQ0FBQztBQUFBLFFBQy9EO0FBQUEsTUFDRjtBQUNBLGFBQU8sRUFBRSxNQUFNLE9BQU8sS0FBSyxFQUFFLEdBQUcsYUFBYSxDQUFDLEVBQUU7QUFBQSxJQUNsRDtBQUVBLFFBQUksTUFBTSxRQUFRLE1BQU0sR0FBRztBQUN6QixVQUFJLENBQUMsT0FBTyxRQUFRO0FBQ2xCLGVBQU87QUFBQSxNQUNUO0FBQ0EsWUFBTSxRQUFRLE9BQU8sSUFBSSxPQUFLO0FBQzVCLGNBQU0sYUFBYSxlQUFlLENBQUM7QUFDbkMsY0FBTSxPQUFPLFdBQVcsV0FBVyxJQUFJO0FBQ3ZDLGNBQU0sTUFBTSxXQUFXLFdBQVcsSUFBSTtBQUN0QyxjQUFNLFFBQVEsV0FBVyxZQUFZLFNBQ2pDLGtEQUFrRCxXQUFXLFlBQVksTUFBTSxrQkFDL0U7QUFDSixjQUFNLFlBQVksV0FBVyxLQUFLLFVBQVUsRUFBRSxNQUFNLFdBQVcsTUFBTSxhQUFhLFdBQVcsWUFBWSxDQUFDLENBQUM7QUFDM0csZUFBTyw0QkFBNEIsSUFBSSxHQUFHLEtBQUssMkRBQTJELFNBQVMsdUNBQXVDLElBQUksa0dBQXdGLEdBQUcsMENBQTBDLElBQUk7QUFBQSxNQUN6UyxDQUFDLEVBQUUsS0FBSyxFQUFFO0FBQ1YsYUFBTyxzQ0FBc0MsS0FBSztBQUFBLElBQ3BEO0FBQ0EsUUFBSSxPQUFPLFdBQVcsWUFBWSxXQUFXLE1BQU07QUFDakQsWUFBTSxPQUFPLE9BQU8sS0FBSyxNQUFNO0FBQy9CLFVBQUksQ0FBQyxLQUFLLFFBQVE7QUFDaEIsZUFBTztBQUFBLE1BQ1Q7QUFDQSxhQUFPLEtBQUssSUFBSSxZQUFVO0FBQ3hCLGNBQU0sU0FBVSxPQUFPLE1BQU07QUFDN0IsY0FBTSxVQUFXLE9BQU8sV0FBVyxZQUFZLE9BQU8sV0FBVyxPQUFPLFdBQVc7QUFDbkYsY0FBTSxVQUFXLE1BQU0sUUFBUSxNQUFNLElBQUksU0FDeEIsTUFBTSxRQUFRLFFBQVEsTUFBTSxJQUFJLE9BQU8sU0FBUyxDQUFDO0FBQ2xFLGNBQU0sUUFBVSxRQUFRLElBQUksT0FBSztBQUMvQixnQkFBTSxhQUFhLGVBQWUsQ0FBQztBQUNuQyxnQkFBTSxPQUFPLFdBQVcsV0FBVyxJQUFJO0FBQ3ZDLGdCQUFNLFFBQVEsV0FBVyxZQUFZLFNBQ2pDLGtEQUFrRCxXQUFXLFlBQVksTUFBTSxrQkFDL0U7QUFDSixnQkFBTSxZQUFZLFdBQVcsS0FBSyxVQUFVLEVBQUUsTUFBTSxXQUFXLE1BQU0sYUFBYSxXQUFXLFlBQVksQ0FBQyxDQUFDO0FBQzNHLGlCQUFPLDRCQUE0QixJQUFJLEdBQUcsS0FBSywyREFBMkQsU0FBUyxNQUFNLFdBQVcsTUFBTSxDQUFDLCtCQUErQixJQUFJLGtHQUF3RixJQUFJLE9BQU8sV0FBVyxNQUFNLENBQUMsaUNBQWlDLElBQUk7QUFBQSxRQUMxVSxDQUFDLEVBQUUsS0FBSyxFQUFFO0FBQ1YsY0FBTSxZQUFhLFdBQVcsTUFBTTtBQUNwQyxjQUFNLGFBQWEsV0FBVyxPQUFPO0FBQ3JDLGVBQU87QUFBQTtBQUFBO0FBQUEsa0RBR3FDLFVBQVU7QUFBQSx3RUFDWSxTQUFTO0FBQUEsMkNBQ3RDLFVBQVU7QUFBQTtBQUFBLCtDQUVOLFNBQVMsaUZBQWlGO0FBQUE7QUFBQSxNQUVySSxDQUFDLEVBQUUsS0FBSyxFQUFFO0FBQUEsSUFDWjtBQUNBLFdBQU87QUFBQSxFQUNUO0FBRUEsV0FBUyxxQkFBcUIsV0FBVztBQUN2QyxRQUFJLENBQUMsVUFBVSxRQUFRO0FBQ3JCLGFBQU87QUFBQSxJQUNUO0FBQ0EsVUFBTSxPQUFPLFVBQVUsSUFBSSxDQUFDLEtBQUssUUFBUTtBQUN2QyxZQUFNLFNBQWMsV0FBVyxJQUFJLFVBQVUsRUFBRTtBQUMvQyxZQUFNLFFBQWMsV0FBVyxJQUFJLFNBQVMsRUFBRTtBQUM5QyxZQUFNLGNBQWMsV0FBVyxJQUFJLGVBQWUsRUFBRTtBQUNwRCxZQUFNLE1BQWMsSUFBSSxZQUFZLENBQUM7QUFDckMsWUFBTSxXQUFjLFdBQVcsQ0FBQyxJQUFJLE1BQU0sSUFBSSxLQUFLLEVBQUUsT0FBTyxPQUFPLEVBQUUsS0FBSyxJQUFJLENBQUM7QUFDL0UsWUFBTSxRQUFjLENBQUMsSUFBSSxZQUFZLElBQUksUUFBUSxFQUFFLE9BQU8sT0FBTyxFQUFFLEtBQUssUUFBRztBQUMzRSxZQUFNLFVBQVUsV0FBVyxLQUFLLFVBQVU7QUFBQSxRQUN4QyxRQUFRLElBQUksVUFBVTtBQUFBLFFBQUksT0FBTyxJQUFJLFNBQVM7QUFBQSxRQUFJLGFBQWEsSUFBSSxlQUFlO0FBQUEsUUFDbEYsTUFBTSxJQUFJLFFBQVE7QUFBQSxRQUFJLE9BQU8sSUFBSSxTQUFTO0FBQUEsUUFDMUMsWUFBWSxJQUFJLGNBQWM7QUFBQSxRQUFJLFVBQVUsSUFBSSxZQUFZO0FBQUEsTUFDOUQsQ0FBQyxDQUFDO0FBQ0YsYUFBTztBQUFBO0FBQUE7QUFBQSxvQkFHUyxNQUFNLEdBQUcsUUFBUSxLQUFLLEtBQUssS0FBSyxFQUFFO0FBQUEseUNBQ2IsV0FBVztBQUFBLFlBQ3hDLFdBQVcsdURBQW9ELFFBQVEsWUFBWSxFQUFFO0FBQUE7QUFBQSx5RUFFeEIsU0FBUyxRQUFHO0FBQUE7QUFBQSxrRUFFbkIsT0FBTyxLQUFLLEdBQUc7QUFBQSw0Q0FDckMsV0FBVztBQUFBLG9FQUNhLEdBQUcsTUFBTSxXQUFXO0FBQUEsOENBQzFDLFdBQVc7QUFBQTtBQUFBO0FBQUEsSUFHdkQsQ0FBQyxFQUFFLEtBQUssRUFBRTtBQUNWLFdBQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsZUFTTSxJQUFJO0FBQUE7QUFBQSxFQUVuQjtBQU9BLE1BQUksZUFBZTtBQUNuQixNQUFJLGVBQWU7QUFDbkIsTUFBSSxnQkFBZ0I7QUFFcEIsTUFBSSwyQkFBMkI7QUFFL0IsV0FBUyx5QkFBeUI7QUFDaEMsbUJBQWUsaUJBQWlCLFNBQVMsUUFBUTtBQUNqRCxhQUFTLGVBQWUsc0JBQXNCLEVBQUUsTUFBTSxVQUFVLGlCQUFpQixTQUFTLEtBQUs7QUFDL0YsYUFBUyxlQUFlLHFCQUFxQixFQUFFLE1BQU0sVUFBVyxpQkFBaUIsUUFBUyxLQUFLO0FBQy9GLGFBQVMsZUFBZSxvQkFBb0IsRUFBRSxNQUFNLFVBQVksaUJBQWlCLFNBQVMsS0FBSztBQUMvRixVQUFNLE1BQU0sU0FBUyxlQUFlLHVCQUF1QjtBQUMzRCxRQUFJLElBQUssS0FBSSxjQUFjLGlCQUFpQixTQUFTLDRCQUFrQjtBQUN2RSxRQUFJLGlCQUFpQixNQUFPLHFCQUFvQjtBQUFBLEVBQ2xEO0FBR0EsaUJBQWUsbUJBQW1CO0FBQ2hDLFFBQUk7QUFDRixZQUFNLE1BQU8sTUFBTSxNQUFNLCtCQUErQjtBQUN4RCxZQUFNLE9BQU8sTUFBTSxJQUFJLEtBQUs7QUFDNUIsVUFBSSxLQUFLLElBQUk7QUFDWCxvQ0FBNEIsS0FBSyxnQkFBZ0IsQ0FBQyxDQUFDO0FBQ25ELGNBQU0sS0FBSyxTQUFTLGVBQWUscUJBQXFCO0FBQ3hELFlBQUksR0FBSSxJQUFHLFFBQVEsS0FBSyxXQUFXO0FBQ25DLHdCQUFnQixLQUFLLFNBQVMsQ0FBQztBQUFBLE1BQ2pDLE9BQU87QUFDTCxpQkFBUyxlQUFlLDJCQUEyQixFQUFFLFlBQ25ELHlEQUErQyxXQUFXLEtBQUssU0FBUyxnQkFBZ0IsQ0FBQztBQUFBLE1BQzdGO0FBQUEsSUFDRixTQUFTLEtBQUs7QUFDWixlQUFTLGVBQWUsMkJBQTJCLEVBQUUsWUFDbkQseUVBQStELFdBQVcsSUFBSSxPQUFPLENBQUM7QUFBQSxJQUMxRjtBQUFBLEVBQ0Y7QUFHQSxpQkFBZSxzQkFBc0I7QUFDbkMsVUFBTSxLQUFTLFNBQVMsZUFBZSxxQkFBcUI7QUFDNUQsVUFBTSxTQUFTLFNBQVMsZUFBZSxtQkFBbUI7QUFDMUQsUUFBSSxDQUFDLEdBQUk7QUFDVCxPQUFHLFdBQWM7QUFDakIsT0FBRyxjQUFjO0FBQ2pCLFFBQUksT0FBUSxRQUFPLGNBQWM7QUFDakMsUUFBSTtBQUNGLFlBQU0sTUFBTyxNQUFNLE1BQU0sK0JBQStCO0FBQ3hELFlBQU0sT0FBTyxNQUFNLElBQUksS0FBSztBQUM1QixVQUFJLEtBQUssSUFBSTtBQUNYLFdBQUcsUUFBUSxLQUFLLFdBQVc7QUFDM0Isd0JBQWdCLEtBQUssU0FBUyxDQUFDO0FBQUEsTUFDakMsT0FBTztBQUNMLFlBQUksT0FBUSxRQUFPLGNBQWMsbUJBQVMsS0FBSyxTQUFTO0FBQUEsTUFDMUQ7QUFBQSxJQUNGLFNBQVMsS0FBSztBQUNaLFVBQUksT0FBUSxRQUFPLGNBQWMsa0NBQXdCLElBQUk7QUFBQSxJQUMvRCxVQUFFO0FBQ0EsU0FBRyxXQUFjO0FBQ2pCLFNBQUcsY0FBYztBQUFBLElBQ25CO0FBQUEsRUFDRjtBQUVBLFdBQVMsZ0JBQWdCLEdBQUc7QUFDMUIsVUFBTSxLQUFLLFNBQVMsZUFBZSxrQkFBa0I7QUFDckQsUUFBSSxHQUFJLElBQUcsY0FBYyxHQUFHLENBQUMsZUFBZSxNQUFNLElBQUksTUFBTSxFQUFFO0FBQUEsRUFDaEU7QUFFQSxXQUFTLHNCQUFzQixXQUFXQyxPQUFNLFFBQVEsV0FBVztBQUNqRSxVQUFNLEtBQUssU0FBUyxlQUFlLFNBQVM7QUFDNUMsUUFBSSxDQUFDLEdBQUk7QUFDVCxPQUFHLGNBQWNBO0FBQ2pCLE9BQUcsTUFBTSxRQUFRO0FBQUEsRUFDbkI7QUFFQSxXQUFTLHVCQUF1QixNQUFNO0FBQ3BDLG1CQUFlLFFBQVE7QUFDdkIsU0FBSyxpQkFBaUI7QUFBQSxFQUN4QjtBQUVBLFdBQVMsd0JBQXdCLE1BQU07QUFDckMsb0JBQWdCLFFBQVE7QUFDeEIsU0FBSyxpQkFBaUI7QUFBQSxFQUN4QjtBQUVBLFdBQVMsb0JBQW9CLEtBQUs7QUFDaEMsVUFBTSxVQUFVLEtBQUssUUFBUSxRQUFRLEtBQUssUUFBUTtBQUNsRCxVQUFNLFFBQVEsT0FBTyxPQUFPLEVBQUUsTUFBTSxPQUFPO0FBQzNDLFdBQU8sUUFBUSxPQUFPLE1BQU0sQ0FBQyxDQUFDLElBQUk7QUFBQSxFQUNwQztBQUVBLFdBQVMscUJBQXFCLE1BQU0sT0FBTztBQUN6QyxVQUFNLFdBQVcsb0JBQW9CLElBQUksS0FBSztBQUM5QyxVQUFNLFlBQVksb0JBQW9CLEtBQUssS0FBSztBQUNoRCxVQUFNLFdBQVcsT0FBTyxNQUFNLFFBQVEsRUFBRSxFQUFFLFlBQVk7QUFDdEQsVUFBTSxZQUFZLE9BQU8sT0FBTyxRQUFRLEVBQUUsRUFBRSxZQUFZO0FBQ3hELFVBQU0sVUFBVSxPQUFPLE1BQU0sT0FBTyxFQUFFLEVBQUUsWUFBWTtBQUNwRCxVQUFNLFdBQVcsT0FBTyxPQUFPLE9BQU8sRUFBRSxFQUFFLFlBQVk7QUFFdEQsWUFBUSxjQUFjO0FBQUEsTUFDcEIsS0FBSztBQUNILGVBQVEsV0FBVyxhQUFjLFNBQVMsY0FBYyxTQUFTLEtBQUssUUFBUSxjQUFjLFFBQVE7QUFBQSxNQUN0RyxLQUFLO0FBQ0gsZUFBTyxTQUFTLGNBQWMsU0FBUyxLQUFNLFlBQVksWUFBYSxRQUFRLGNBQWMsUUFBUTtBQUFBLE1BQ3RHLEtBQUs7QUFDSCxlQUFPLFVBQVUsY0FBYyxRQUFRLEtBQU0sWUFBWSxZQUFhLFFBQVEsY0FBYyxRQUFRO0FBQUEsTUFDdEcsS0FBSztBQUFBLE1BQ0w7QUFDRSxlQUFRLFlBQVksWUFBYSxTQUFTLGNBQWMsU0FBUyxLQUFLLFFBQVEsY0FBYyxRQUFRO0FBQUEsSUFDeEc7QUFBQSxFQUNGO0FBRUEsV0FBUyx1QkFBdUIsS0FBSztBQUNuQyxRQUFJLGtCQUFrQixRQUFRO0FBQzVCLGFBQU8sT0FBTyxvQkFBb0IsR0FBRyxLQUFLLGNBQWM7QUFBQSxJQUMxRDtBQUNBLFFBQUksa0JBQWtCLFFBQVE7QUFDNUIsYUFBTyxLQUFLLE9BQU8sT0FBTyxJQUFJLElBQUksSUFBSTtBQUFBLElBQ3hDO0FBQ0EsV0FBTztBQUFBLEVBQ1Q7QUFFQSxXQUFTLDRCQUE0QixNQUFNO0FBQ3pDLFVBQU0sWUFBWSxTQUFTLGVBQWUsMkJBQTJCO0FBQ3JFLFFBQUksQ0FBQyxVQUFXO0FBQ2hCLFVBQU0sZUFBZTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsc0NBS2UsaUJBQWlCLGNBQWMsYUFBYSxFQUFFO0FBQUEscUNBQy9DLGlCQUFpQixhQUFhLGFBQWEsRUFBRTtBQUFBLHFDQUM3QyxpQkFBaUIsYUFBYSxhQUFhLEVBQUU7QUFBQSxzQ0FDNUMsaUJBQWlCLGNBQWMsYUFBYSxFQUFFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGlDQU1uRCxrQkFBa0IsU0FBUyxhQUFhLEVBQUU7QUFBQSxpQ0FDMUMsa0JBQWtCLFNBQVMsYUFBYSxFQUFFO0FBQUEsaUNBQzFDLGtCQUFrQixTQUFTLGFBQWEsRUFBRTtBQUFBO0FBQUE7QUFBQTtBQUl6RSxRQUFJLENBQUMsS0FBSyxRQUFRO0FBQ2hCLGdCQUFVLFlBQVksR0FBRyxZQUFZO0FBQ3JDO0FBQUEsSUFDRjtBQUNBLFVBQU0sU0FBUyxDQUFDLEdBQUcsSUFBSSxFQUFFLEtBQUssb0JBQW9CO0FBQ2xELFVBQU0sU0FBUyxDQUFDO0FBQ2hCLGVBQVcsT0FBTyxRQUFRO0FBQ3hCLFlBQU0sUUFBUSx1QkFBdUIsR0FBRztBQUN4QyxVQUFJLFFBQVEsT0FBTyxLQUFLLENBQUMsVUFBVSxNQUFNLFVBQVUsS0FBSztBQUN4RCxVQUFJLENBQUMsT0FBTztBQUNWLGdCQUFRLEVBQUUsT0FBTyxPQUFPLENBQUMsRUFBRTtBQUMzQixlQUFPLEtBQUssS0FBSztBQUFBLE1BQ25CO0FBQ0EsWUFBTSxNQUFNLEtBQUssR0FBRztBQUFBLElBQ3RCO0FBQ0EsVUFBTSxjQUFjLE9BQU8sSUFBSSxDQUFDLEVBQUUsT0FBTyxNQUFNLE1BQU07QUFDbkQsWUFBTSxjQUFjLGtCQUFrQixTQUNsQyxLQUNBLGlGQUFpRixXQUFXLEtBQUssQ0FBQztBQUN0RyxZQUFNLE9BQU8sTUFBTSxJQUFJLFNBQU87QUFDOUIsY0FBTSxNQUFXLFdBQVcsSUFBSSxPQUFPLEVBQUU7QUFDekMsY0FBTSxPQUFXLFdBQVcsSUFBSSxRQUFRLEVBQUU7QUFDMUMsY0FBTSxXQUFXLFlBQVksSUFBSSxzQkFBc0IsSUFBSSxNQUFNLEdBQUcsR0FBRyxDQUFDO0FBQ3hFLGNBQU0sT0FBVyxJQUFJLHNCQUFzQjtBQUMzQyxjQUFNLFVBQVcsV0FBVyxLQUFLLFVBQVUsR0FBRyxDQUFDO0FBQy9DLGVBQU87QUFBQTtBQUFBO0FBQUEseURBRzhDLEdBQUc7QUFBQSxZQUNoRCxXQUFXLHFDQUFxQyxRQUFRLEdBQUcsS0FBSyxTQUFTLE1BQU0sV0FBTSxFQUFFLGFBQWEsRUFBRTtBQUFBO0FBQUEsd0VBRTFDLElBQUk7QUFBQTtBQUFBLG9FQUVSLE9BQU87QUFBQSw4Q0FDN0IsR0FBRztBQUFBLHVFQUNzQixHQUFHO0FBQUEsZ0RBQzFCLEdBQUc7QUFBQTtBQUFBO0FBQUEsTUFHL0MsQ0FBQyxFQUFFLEtBQUssRUFBRTtBQUNWLGFBQU8sR0FBRyxXQUFXO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGVBU1YsSUFBSTtBQUFBO0FBQUEsSUFFakIsQ0FBQyxFQUFFLEtBQUssRUFBRTtBQUNWLGNBQVUsWUFBWSxHQUFHLFlBQVksR0FBRyxXQUFXO0FBQUEsRUFDckQ7QUFHQSxpQkFBZSwwQkFBMEI7QUFDdkMsVUFBTSxLQUFTLFNBQVMsZUFBZSxxQkFBcUI7QUFDNUQsVUFBTSxTQUFTLFNBQVMsZUFBZSxtQkFBbUI7QUFDMUQsUUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFRO0FBQ3BCLFVBQU1BLFFBQU8sR0FBRztBQUNoQixRQUFJLENBQUNBLE1BQUssS0FBSyxHQUFHO0FBQ2hCLGFBQU8sY0FBYztBQUNyQixhQUFPLE1BQU0sUUFBUTtBQUNyQjtBQUFBLElBQ0Y7QUFDQSxXQUFPLGNBQWM7QUFDckIsV0FBTyxNQUFNLFFBQVE7QUFDckIsUUFBSTtBQUNGLFlBQU0sTUFBTyxNQUFNLE1BQU0sMENBQTBDO0FBQUEsUUFDakUsUUFBUztBQUFBLFFBQ1QsU0FBUyxFQUFFLGdCQUFnQixtQkFBbUI7QUFBQSxRQUM5QyxNQUFTLEtBQUssVUFBVSxFQUFFLGFBQWFBLE1BQUssQ0FBQztBQUFBLE1BQy9DLENBQUM7QUFDRCxZQUFNLE9BQU8sTUFBTSxJQUFJLEtBQUs7QUFDNUIsVUFBSSxLQUFLLElBQUk7QUFDWCxjQUFNLElBQUksS0FBSyxTQUFTO0FBQ3hCLGVBQU8sY0FBYyx1QkFBYSxDQUFDLFFBQVEsTUFBTSxJQUFJLFFBQVEsR0FBRztBQUNoRSxlQUFPLE1BQU0sUUFBUTtBQUFBLE1BQ3ZCLE9BQU87QUFDTCxlQUFPLGNBQWMsYUFBUSxLQUFLLFNBQVM7QUFDM0MsZUFBTyxNQUFNLFFBQVE7QUFBQSxNQUN2QjtBQUFBLElBQ0YsU0FBUyxLQUFLO0FBQ1osYUFBTyxjQUFjLFlBQU8sSUFBSTtBQUNoQyxhQUFPLE1BQU0sUUFBUTtBQUFBLElBQ3ZCO0FBQUEsRUFDRjtBQUdBLGlCQUFlLHNCQUFzQjtBQUNuQyxVQUFNLEtBQVMsU0FBUyxlQUFlLHFCQUFxQjtBQUM1RCxVQUFNLFNBQVMsU0FBUyxlQUFlLG1CQUFtQjtBQUMxRCxVQUFNLE1BQVMsU0FBUyxlQUFlLHFCQUFxQjtBQUM1RCxRQUFJLENBQUMsR0FBSTtBQUNULFVBQU0sVUFBVSxHQUFHO0FBQ25CLFFBQUksS0FBSztBQUFFLFVBQUksV0FBVztBQUFNLFVBQUksY0FBYztBQUFBLElBQWE7QUFDL0QsUUFBSSxRQUFRO0FBQUUsYUFBTyxjQUFjO0FBQUksYUFBTyxNQUFNLFFBQVE7QUFBQSxJQUFXO0FBQ3ZFLFFBQUk7QUFDRixZQUFNLE1BQU8sTUFBTSxNQUFNLGlDQUFpQztBQUFBLFFBQ3hELFFBQVM7QUFBQSxRQUNULFNBQVMsRUFBRSxnQkFBZ0IsbUJBQW1CO0FBQUEsUUFDOUMsTUFBUyxLQUFLLFVBQVUsRUFBRSxRQUFRLENBQUM7QUFBQSxNQUNyQyxDQUFDO0FBQ0QsWUFBTSxPQUFPLE1BQU0sSUFBSSxLQUFLO0FBQzVCLFVBQUksS0FBSyxJQUFJO0FBQ1gsY0FBTSxJQUFJLEtBQUssU0FBUztBQUN4QixZQUFJLFFBQVE7QUFDVixpQkFBTyxjQUFjLHVCQUFhLENBQUMsUUFBUSxNQUFNLElBQUksUUFBUSxHQUFHO0FBQ2hFLGlCQUFPLE1BQU0sUUFBUTtBQUFBLFFBQ3ZCO0FBQ0Esd0JBQWdCLENBQUM7QUFDakIsK0JBQXVCLGdCQUFnQixTQUFTO0FBRWhELGNBQU0saUJBQWlCO0FBQUEsTUFDekIsT0FBTztBQUNMLFlBQUksUUFBUTtBQUNWLGlCQUFPLGNBQWMsYUFBUSxLQUFLLFNBQVM7QUFDM0MsaUJBQU8sTUFBTSxRQUFRO0FBQUEsUUFDdkI7QUFBQSxNQUNGO0FBQUEsSUFDRixTQUFTLEtBQUs7QUFDWixVQUFJLFFBQVE7QUFDVixlQUFPLGNBQWMsWUFBTyxJQUFJO0FBQ2hDLGVBQU8sTUFBTSxRQUFRO0FBQUEsTUFDdkI7QUFBQSxJQUNGLFVBQUU7QUFDQSxVQUFJLEtBQUs7QUFBRSxZQUFJLFdBQVc7QUFBTyxZQUFJLGNBQWM7QUFBQSxNQUFXO0FBQUEsSUFDaEU7QUFBQSxFQUNGO0FBRUEsV0FBUyw4QkFBOEI7QUFDckMsYUFBUyxlQUFlLDRCQUE0QixFQUFFLFFBQVE7QUFDOUQsYUFBUyxlQUFlLDZCQUE2QixFQUFFLFVBQVU7QUFDakUsMEJBQXNCLDRCQUE0QixFQUFFO0FBQ3BELGFBQVMsZUFBZSxpQ0FBaUMsRUFBRSxNQUFNLFVBQVU7QUFDM0UsaUNBQTZCLFNBQVM7QUFDdEMsb0JBQWdCLGlDQUFpQztBQUNqRCxjQUFVLGlDQUFpQztBQUFBLEVBQzdDO0FBRUEsV0FBUywrQkFBK0I7QUFDdEMsYUFBUyxlQUFlLGlDQUFpQyxFQUFFLE1BQU0sVUFBVTtBQUMzRSxpQkFBYTtBQUFBLEVBQ2Y7QUFFQSxpQkFBZSx3QkFBd0I7QUFDckMsVUFBTSxXQUFXLFNBQVMsZUFBZSw0QkFBNEI7QUFDckUsVUFBTSxZQUFZLFNBQVMsZUFBZSw2QkFBNkI7QUFDdkUsVUFBTSxTQUFTLFNBQVMsZUFBZSw4QkFBOEI7QUFDckUsUUFBSSxDQUFDLFNBQVU7QUFDZixVQUFNLGFBQWEsU0FBUyxNQUFNLEtBQUs7QUFDdkMsUUFBSSxDQUFDLFlBQVk7QUFDZiw0QkFBc0IsNEJBQTRCLGdEQUFzQyxTQUFTO0FBQ2pHO0FBQUEsSUFDRjtBQUNBLFFBQUksUUFBUTtBQUNWLGFBQU8sV0FBVztBQUNsQixhQUFPLGNBQWM7QUFBQSxJQUN2QjtBQUNBLDBCQUFzQiw0QkFBNEIsd0JBQW1CO0FBQ3JFLFFBQUk7QUFDRixZQUFNLE1BQU0sTUFBTSxNQUFNLHdDQUF3QztBQUFBLFFBQzlELFFBQVE7QUFBQSxRQUNSLFNBQVMsRUFBRSxnQkFBZ0IsbUJBQW1CO0FBQUEsUUFDOUMsTUFBTSxLQUFLLFVBQVU7QUFBQSxVQUNuQixhQUFhO0FBQUEsVUFDYixXQUFXLFFBQVEsV0FBVyxPQUFPO0FBQUEsUUFDdkMsQ0FBQztBQUFBLE1BQ0gsQ0FBQztBQUNELFlBQU0sT0FBTyxNQUFNLElBQUksS0FBSztBQUM1QixVQUFJLEtBQUssSUFBSTtBQUNYLGNBQU0sUUFBUTtBQUFBLFVBQ1osR0FBRyxLQUFLLFNBQVMsQ0FBQztBQUFBLFVBQ2xCLEdBQUcsS0FBSyxXQUFXLENBQUM7QUFBQSxVQUNwQixHQUFHLEtBQUssV0FBVyxDQUFDO0FBQUEsUUFDdEI7QUFDQSxZQUFJLEtBQUssUUFBUyxPQUFNLEtBQUssR0FBRyxLQUFLLE9BQU8scUNBQXFDO0FBQ2pGLGNBQU0sZ0JBQWlCLEtBQUssY0FBYyxTQUN0QztBQUFBO0FBQUE7QUFBQSxTQUFrRSxLQUFLLGFBQWEsS0FBSyxXQUFNLENBQUMsS0FDaEc7QUFDSixjQUFNLGdCQUFpQixLQUFLLGNBQWMsU0FDdEM7QUFBQTtBQUFBO0FBQUEsU0FBcUQsS0FBSyxhQUFhLEtBQUssV0FBTSxDQUFDLEtBQ25GO0FBQ0osOEJBQXNCLDRCQUE0QixvQkFBZSxNQUFNLEtBQUssSUFBSSxDQUFDLEtBQUssU0FBUztBQUMvRiwrQkFBdUIsZ0JBQWdCLFVBQVU7QUFDakQsY0FBTSxpQkFBaUI7QUFDdkIsdUJBQWUsbUJBQWMsNEJBQTRCLE1BQU0sS0FBSyxJQUFJLENBQUMsSUFBSSxhQUFhLEdBQUcsYUFBYSxFQUFFO0FBQzVHLHFDQUE2QjtBQUFBLE1BQy9CLE9BQU87QUFDTCw4QkFBc0IsNEJBQTRCLFVBQUssS0FBSyxTQUFTLGVBQWUsSUFBSSxTQUFTO0FBQUEsTUFDbkc7QUFBQSxJQUNGLFNBQVMsS0FBSztBQUNaLDRCQUFzQiw0QkFBNEIsVUFBSyxJQUFJLE9BQU8sSUFBSSxTQUFTO0FBQUEsSUFDakYsVUFBRTtBQUNBLFVBQUksUUFBUTtBQUNWLGVBQU8sV0FBVztBQUNsQixlQUFPLGNBQWM7QUFBQSxNQUN2QjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsV0FBUywrQkFBK0I7QUFDdEMsYUFBUyxlQUFlLDBCQUEwQixFQUFFLFFBQVE7QUFDNUQsYUFBUyxlQUFlLDJCQUEyQixFQUFFLFFBQVE7QUFDN0QsYUFBUyxlQUFlLDhCQUE4QixFQUFFLFVBQVU7QUFDbEUsMEJBQXNCLDZCQUE2QixFQUFFO0FBQ3JELGFBQVMsZUFBZSxrQ0FBa0MsRUFBRSxNQUFNLFVBQVU7QUFDNUUsaUNBQTZCLFNBQVM7QUFDdEMsb0JBQWdCLGtDQUFrQztBQUNsRCxjQUFVLGtDQUFrQztBQUFBLEVBQzlDO0FBRUEsV0FBUyxnQ0FBZ0M7QUFDdkMsYUFBUyxlQUFlLGtDQUFrQyxFQUFFLE1BQU0sVUFBVTtBQUM1RSxpQkFBYTtBQUFBLEVBQ2Y7QUFFQSxpQkFBZSx5QkFBeUI7QUFDdEMsVUFBTSxRQUFRLFNBQVMsZUFBZSwwQkFBMEI7QUFDaEUsVUFBTSxTQUFTLFNBQVMsZUFBZSwyQkFBMkI7QUFDbEUsVUFBTSxTQUFTLFNBQVMsZUFBZSwrQkFBK0I7QUFDdEUsUUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFRO0FBQ3ZCLFVBQU1BLFFBQU8sTUFBTSxNQUFNLEtBQUs7QUFDOUIsUUFBSSxDQUFDQSxPQUFNO0FBQ1QsNEJBQXNCLDZCQUE2QixnREFBc0MsU0FBUztBQUNsRztBQUFBLElBQ0Y7QUFDQSxRQUFJLFFBQVE7QUFDVixhQUFPLFdBQVc7QUFDbEIsYUFBTyxjQUFjO0FBQUEsSUFDdkI7QUFDQSwwQkFBc0IsNkJBQTZCLGlDQUE0QjtBQUMvRSxRQUFJO0FBQ0YsWUFBTSxNQUFNLE1BQU0sTUFBTSx5Q0FBeUM7QUFBQSxRQUMvRCxRQUFRO0FBQUEsUUFDUixTQUFTLEVBQUUsZ0JBQWdCLG1CQUFtQjtBQUFBLFFBQzlDLE1BQU0sS0FBSyxVQUFVLEVBQUUsTUFBQUEsTUFBSyxDQUFDO0FBQUEsTUFDL0IsQ0FBQztBQUNELFlBQU0sT0FBTyxNQUFNLElBQUksS0FBSztBQUM1QixVQUFJLEtBQUssSUFBSTtBQUNYLGVBQU8sUUFBUSxLQUFLLFVBQVU7QUFDOUIsOEJBQXNCLDZCQUE2QiwyRUFBc0UsU0FBUztBQUFBLE1BQ3BJLE9BQU87QUFDTCw4QkFBc0IsNkJBQTZCLFVBQUssS0FBSyxTQUFTLG1CQUFtQixJQUFJLFNBQVM7QUFBQSxNQUN4RztBQUFBLElBQ0YsU0FBUyxLQUFLO0FBQ1osNEJBQXNCLDZCQUE2QixVQUFLLElBQUksT0FBTyxJQUFJLFNBQVM7QUFBQSxJQUNsRixVQUFFO0FBQ0EsVUFBSSxRQUFRO0FBQ1YsZUFBTyxXQUFXO0FBQ2xCLGVBQU8sY0FBYztBQUFBLE1BQ3ZCO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFFQSxpQkFBZSxpQ0FBaUM7QUFDOUMsVUFBTSxTQUFTLFNBQVMsZUFBZSwyQkFBMkI7QUFDbEUsVUFBTSxZQUFZLFNBQVMsZUFBZSw4QkFBOEI7QUFDeEUsVUFBTSxTQUFTLFNBQVMsZUFBZSwrQkFBK0I7QUFDdEUsUUFBSSxDQUFDLE9BQVE7QUFDYixVQUFNLGFBQWEsT0FBTyxNQUFNLEtBQUs7QUFDckMsUUFBSSxDQUFDLFlBQVk7QUFDZiw0QkFBc0IsNkJBQTZCLDBEQUFnRCxTQUFTO0FBQzVHO0FBQUEsSUFDRjtBQUNBLFFBQUksUUFBUTtBQUNWLGFBQU8sV0FBVztBQUNsQixhQUFPLGNBQWM7QUFBQSxJQUN2QjtBQUNBLDBCQUFzQiw2QkFBNkIsaUNBQTRCO0FBQy9FLFFBQUk7QUFDRixZQUFNLE1BQU0sTUFBTSxNQUFNLHdDQUF3QztBQUFBLFFBQzlELFFBQVE7QUFBQSxRQUNSLFNBQVMsRUFBRSxnQkFBZ0IsbUJBQW1CO0FBQUEsUUFDOUMsTUFBTSxLQUFLLFVBQVU7QUFBQSxVQUNuQixhQUFhO0FBQUEsVUFDYixXQUFXLFFBQVEsV0FBVyxPQUFPO0FBQUEsUUFDdkMsQ0FBQztBQUFBLE1BQ0gsQ0FBQztBQUNELFlBQU0sT0FBTyxNQUFNLElBQUksS0FBSztBQUM1QixVQUFJLEtBQUssSUFBSTtBQUNYLGNBQU0sUUFBUTtBQUFBLFVBQ1osR0FBRyxLQUFLLFNBQVMsQ0FBQztBQUFBLFVBQ2xCLEdBQUcsS0FBSyxXQUFXLENBQUM7QUFBQSxVQUNwQixHQUFHLEtBQUssV0FBVyxDQUFDO0FBQUEsUUFDdEI7QUFDQSxZQUFJLEtBQUssUUFBUyxPQUFNLEtBQUssR0FBRyxLQUFLLE9BQU8scUNBQXFDO0FBQ2pGLGNBQU0sZ0JBQWlCLEtBQUssY0FBYyxTQUN0QztBQUFBO0FBQUE7QUFBQSxTQUFrRSxLQUFLLGFBQWEsS0FBSyxXQUFNLENBQUMsS0FDaEc7QUFDSixjQUFNLGdCQUFpQixLQUFLLGNBQWMsU0FDdEM7QUFBQTtBQUFBO0FBQUEsU0FBcUQsS0FBSyxhQUFhLEtBQUssV0FBTSxDQUFDLEtBQ25GO0FBQ0osOEJBQXNCLDZCQUE2Qiw0QkFBdUIsTUFBTSxLQUFLLElBQUksQ0FBQyxLQUFLLFNBQVM7QUFDeEcsK0JBQXVCLGdCQUFnQixVQUFVO0FBQ2pELGNBQU0saUJBQWlCO0FBQ3ZCLHVCQUFlLG1CQUFjLDhCQUE4QixNQUFNLEtBQUssSUFBSSxDQUFDLElBQUksYUFBYSxHQUFHLGFBQWEsRUFBRTtBQUM5RyxzQ0FBOEI7QUFBQSxNQUNoQyxPQUFPO0FBQ0wsOEJBQXNCLDZCQUE2QixVQUFLLEtBQUssU0FBUyxlQUFlLElBQUksU0FBUztBQUFBLE1BQ3BHO0FBQUEsSUFDRixTQUFTLEtBQUs7QUFDWiw0QkFBc0IsNkJBQTZCLFVBQUssSUFBSSxPQUFPLElBQUksU0FBUztBQUFBLElBQ2xGLFVBQUU7QUFDQSxVQUFJLFFBQVE7QUFDVixlQUFPLFdBQVc7QUFDbEIsZUFBTyxjQUFjO0FBQUEsTUFDdkI7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUlBLFdBQVMsMEJBQTBCO0FBQ2pDLCtCQUEyQjtBQUMzQixhQUFTLGVBQWUsZUFBZSxFQUFFLFFBQVc7QUFDcEQsYUFBUyxlQUFlLGdCQUFnQixFQUFFLFFBQVU7QUFDcEQsYUFBUyxlQUFlLGtCQUFrQixFQUFFLFFBQVE7QUFDcEQsVUFBTSxjQUFjLFNBQVMsZUFBZSx3QkFBd0I7QUFDcEUsUUFBSSxZQUFhLGFBQVksY0FBYztBQUMzQyxhQUFTLGVBQWUsaUJBQWlCLEVBQUUsUUFBUztBQUNwRCxhQUFTLGVBQWUsZ0JBQWdCLEVBQUUsUUFBVTtBQUNwRCxhQUFTLGVBQWUsbUJBQW1CLEVBQUUsUUFBUTtBQUNyRCxhQUFTLGVBQWUsZUFBZSxFQUFFLFFBQVc7QUFDcEQsYUFBUyxlQUFlLGlCQUFpQixFQUFFLFFBQVM7QUFDcEQsYUFBUyxlQUFlLGVBQWUsRUFBRSxXQUFXO0FBQ3BELGFBQVMsZUFBZSx5QkFBeUIsRUFBRSxjQUFjO0FBQ2pFLGFBQVMsZUFBZSwwQkFBMEIsRUFBRSxNQUFNLFVBQVU7QUFDcEUsaUNBQTZCLFNBQVM7QUFDdEMsb0JBQWdCLDBCQUEwQjtBQUMxQyxjQUFVLDBCQUEwQjtBQUFBLEVBQ3RDO0FBRUEsV0FBUyxzQkFBc0IsS0FBSztBQUNsQyxVQUFNLFNBQVMsSUFBSSxVQUFVLENBQUM7QUFFOUIsK0JBQTJCLENBQUMsT0FBTyxVQUFVLENBQUMsQ0FBQyxPQUFPO0FBQ3RELGFBQVMsZUFBZSxlQUFlLEVBQUUsUUFBWSxJQUFJLE9BQU87QUFDaEUsYUFBUyxlQUFlLGdCQUFnQixFQUFFLFFBQVcsSUFBSSxRQUFRO0FBQ2pFLGFBQVMsZUFBZSxrQkFBa0IsRUFBRSxRQUFTLE9BQU8sVUFBVSxPQUFPLFVBQVU7QUFFdkYsVUFBTSxjQUFjLFNBQVMsZUFBZSx3QkFBd0I7QUFDcEUsUUFBSSxZQUFhLGFBQVksY0FBYywyQkFBMkIsY0FBYztBQUNwRixhQUFTLGVBQWUsaUJBQWlCLEVBQUUsUUFBVSxPQUFPLFNBQVM7QUFDckUsYUFBUyxlQUFlLGdCQUFnQixFQUFFLFFBQVcsT0FBTyxRQUFRO0FBQ3BFLGFBQVMsZUFBZSxtQkFBbUIsRUFBRSxRQUFRLE9BQU8sV0FBVyxPQUFPLGFBQWE7QUFDM0YsYUFBUyxlQUFlLGVBQWUsRUFBRSxRQUFZLE9BQU8sT0FBTztBQUVuRSxVQUFNLFFBQVEsb0JBQUksSUFBSSxDQUFDLFVBQVMsVUFBUyxTQUFRLFFBQU8sV0FBVSxhQUFZLEtBQUssQ0FBQztBQUNwRixVQUFNLFFBQVEsT0FBTyxRQUFRLE1BQU0sRUFDaEMsT0FBTyxDQUFDLENBQUNDLEVBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSUEsRUFBQyxDQUFDLEVBQzdCLElBQUksQ0FBQyxDQUFDQSxJQUFHRixFQUFDLE1BQU0sR0FBR0UsRUFBQyxJQUFJRixFQUFDLEVBQUUsRUFDM0IsS0FBSyxJQUFJO0FBQ1osYUFBUyxlQUFlLGlCQUFpQixFQUFFLFFBQVU7QUFDckQsYUFBUyxlQUFlLGVBQWUsRUFBRSxXQUFZO0FBQ3JELGFBQVMsZUFBZSx5QkFBeUIsRUFBRSxjQUFjO0FBQ2pFLGFBQVMsZUFBZSwwQkFBMEIsRUFBRSxNQUFNLFVBQVU7QUFDcEUsaUNBQTZCLFNBQVM7QUFDdEMsb0JBQWdCLDBCQUEwQjtBQUMxQyxjQUFVLDBCQUEwQjtBQUFBLEVBQ3RDO0FBRUEsV0FBUyx3QkFBd0I7QUFDL0IsYUFBUyxlQUFlLDBCQUEwQixFQUFFLE1BQU0sVUFBVTtBQUNwRSxpQkFBYTtBQUFBLEVBQ2Y7QUFFQSxpQkFBZSx3QkFBd0I7QUFDckMsVUFBTSxRQUFTLFNBQVMsZUFBZSxlQUFlO0FBQ3RELFVBQU0sTUFBUyxNQUFNLE1BQU0sS0FBSztBQUNoQyxVQUFNLFNBQVMsTUFBTSxXQUFXLFdBQVc7QUFDM0MsUUFBSSxDQUFDLEtBQUs7QUFBRSxxQkFBZSwyQkFBaUIsdUJBQXVCO0FBQUc7QUFBQSxJQUFRO0FBQzlFLFVBQU0sT0FBUyxTQUFTLGVBQWUsZ0JBQWdCLEVBQUUsTUFBTSxLQUFLLEtBQUs7QUFDekUsVUFBTSxTQUFTLFNBQVMsZUFBZSxrQkFBa0IsRUFBRSxNQUFNLEtBQUs7QUFDdEUsVUFBTSxRQUFTLFNBQVMsZUFBZSxpQkFBaUIsRUFBRSxNQUFNLEtBQUs7QUFDckUsVUFBTSxPQUFTLFNBQVMsZUFBZSxnQkFBZ0IsRUFBRSxNQUFNLEtBQUs7QUFDcEUsUUFBSSxDQUFDLE9BQVE7QUFBRSxxQkFBZSwyQkFBaUIsb0JBQW9CO0FBQUc7QUFBQSxJQUFRO0FBQzlFLFFBQUksQ0FBQyxNQUFRO0FBQUUscUJBQWUsMkJBQWlCLG1CQUFtQjtBQUFHO0FBQUEsSUFBUTtBQUM3RSxRQUFJLENBQUMsUUFBUTtBQUFFLHFCQUFlLDJCQUFpQiwrQkFBK0I7QUFBRztBQUFBLElBQVE7QUFFekYsVUFBTSxTQUFTLDJCQUEyQixFQUFFLFFBQVEsUUFBUSxPQUFPLEtBQUssSUFBSSxFQUFFLFFBQVEsT0FBTyxLQUFLO0FBQ2xHLFVBQU0sVUFBVSxTQUFTLGVBQWUsbUJBQW1CLEVBQUUsTUFBTSxLQUFLO0FBQ3hFLFFBQUksU0FBUztBQUNYLGFBQU8sU0FBUyxrQkFBa0IsY0FBYyxTQUFTLElBQUk7QUFBQSxJQUMvRDtBQUNBLFVBQU0sTUFBTSxTQUFTLGVBQWUsZUFBZSxFQUFFLE1BQU0sS0FBSztBQUNoRSxRQUFJLElBQUssUUFBTyxNQUFNO0FBRXRCLFVBQU0sUUFBUSxTQUFTLGVBQWUsaUJBQWlCLEVBQUU7QUFDekQsZUFBVyxRQUFRLE1BQU0sTUFBTSxJQUFJLEdBQUc7QUFDcEMsWUFBTSxLQUFLLEtBQUssUUFBUSxHQUFHO0FBQzNCLFVBQUksS0FBSyxHQUFHO0FBQ1YsY0FBTUUsS0FBSSxLQUFLLE1BQU0sR0FBRyxFQUFFLEVBQUUsS0FBSztBQUNqQyxjQUFNRixLQUFJLEtBQUssTUFBTSxLQUFLLENBQUMsRUFBRSxLQUFLO0FBQ2xDLFlBQUlFLE1BQUtGLEdBQUcsUUFBT0UsRUFBQyxJQUFJRjtBQUFBLE1BQzFCO0FBQUEsSUFDRjtBQUNBLFVBQU0sT0FBTyxFQUFFLFFBQVEsS0FBSyxNQUFNLE9BQU87QUFDekMsUUFBSTtBQUNGLFlBQU0sTUFBTyxNQUFNLE1BQU0sZ0NBQWdDO0FBQUEsUUFDdkQsUUFBUTtBQUFBLFFBQVEsU0FBUyxFQUFFLGdCQUFnQixtQkFBbUI7QUFBQSxRQUFHLE1BQU0sS0FBSyxVQUFVLElBQUk7QUFBQSxNQUM1RixDQUFDO0FBQ0QsWUFBTSxPQUFPLE1BQU0sSUFBSSxLQUFLO0FBQzVCLFVBQUksS0FBSyxJQUFJO0FBQ1gsOEJBQXNCO0FBQ3RCLCtCQUF1QixnQkFBZ0IsS0FBSyxVQUFVLFNBQVM7QUFDL0QsdUJBQWUsZ0JBQVcsZ0JBQWdCLEdBQUcsS0FBSyxLQUFLLE1BQU0sR0FBRztBQUNoRSxjQUFNLGlCQUFpQjtBQUFBLE1BQ3pCLE9BQU87QUFDTCx1QkFBZSxnQkFBVyxLQUFLLFNBQVMsYUFBYTtBQUFBLE1BQ3ZEO0FBQUEsSUFDRixTQUFTLEdBQUc7QUFDVixxQkFBZSxnQkFBVyw0QkFBNEI7QUFBQSxJQUN4RDtBQUFBLEVBQ0Y7QUFFQSxpQkFBZSx3QkFBd0IsS0FBSztBQUMxQztBQUFBLE1BQ0U7QUFBQSxNQUNBLFdBQVcsR0FBRztBQUFBLE1BQ2QsWUFBWTtBQUNWLFlBQUk7QUFDRixnQkFBTSxNQUFPLE1BQU0sTUFBTSxnQ0FBZ0M7QUFBQSxZQUN2RCxRQUFRO0FBQUEsWUFBUSxTQUFTLEVBQUUsZ0JBQWdCLG1CQUFtQjtBQUFBLFlBQzlELE1BQU0sS0FBSyxVQUFVLEVBQUUsUUFBUSxVQUFVLElBQUksQ0FBQztBQUFBLFVBQ2hELENBQUM7QUFDRCxnQkFBTSxPQUFPLE1BQU0sSUFBSSxLQUFLO0FBQzVCLGNBQUksS0FBSyxJQUFJO0FBQ1gsbUNBQXVCLGdCQUFnQixTQUFTO0FBQ2hELDJCQUFlLGtCQUFhLGdCQUFnQixHQUFHLFlBQVk7QUFDM0Qsa0JBQU0saUJBQWlCO0FBQUEsVUFDekIsT0FBTztBQUNMLDJCQUFlLGdCQUFXLEtBQUssU0FBUyxlQUFlO0FBQUEsVUFDekQ7QUFBQSxRQUNGLFNBQVMsR0FBRztBQUNWLHlCQUFlLGdCQUFXLDhCQUE4QjtBQUFBLFFBQzFEO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsV0FBUyxrQkFBa0IsUUFBUTtBQUNqQyxRQUFJLENBQUMsT0FBTyxRQUFRO0FBQ2xCLGFBQU87QUFBQSxJQUNUO0FBQ0EsVUFBTSxPQUFPLE9BQU8sSUFBSSxDQUFDLE9BQU8sUUFBUTtBQUN0QyxZQUFNLFFBQVEsV0FBVyxNQUFNLFNBQVMsRUFBRTtBQUMxQyxZQUFNLE9BQVEsTUFBTSxPQUFPLE9BQU8sTUFBTSxJQUFJLElBQUk7QUFDaEQsWUFBTSxPQUFRLFlBQVksTUFBTSxlQUFlLElBQUksTUFBTSxHQUFHLEdBQUcsQ0FBQztBQUNoRSxZQUFNLFlBQVksV0FBVyxLQUFLLFVBQVU7QUFBQSxRQUMxQyxPQUFPLE1BQU0sU0FBUztBQUFBLFFBQUksTUFBTSxNQUFNLFFBQVE7QUFBQSxRQUM5QyxhQUFhLE1BQU0sZUFBZTtBQUFBLFFBQ2xDLGVBQWUsTUFBTSxnQkFBZ0IsQ0FBQyxHQUFHLEtBQUssSUFBSTtBQUFBLE1BQ3BELENBQUMsQ0FBQztBQUNGLGFBQU87QUFBQTtBQUFBO0FBQUEsb0JBR1MsS0FBSztBQUFBLFlBQ2IsT0FBTyxxQ0FBcUMsSUFBSSxJQUFJLE1BQU0sZUFBYSxJQUFJLFNBQVMsTUFBTSxXQUFNLEVBQUUsYUFBYSxFQUFFO0FBQUE7QUFBQSx1REFFdEUsSUFBSTtBQUFBO0FBQUEsOERBRUcsU0FBUyxLQUFLLEdBQUc7QUFBQSx3Q0FDdkMsS0FBSztBQUFBLGdFQUNtQixHQUFHLE1BQU0sS0FBSztBQUFBLDBDQUNwQyxLQUFLO0FBQUE7QUFBQTtBQUFBLElBRzdDLENBQUMsRUFBRSxLQUFLLEVBQUU7QUFDVixXQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGVBU00sSUFBSTtBQUFBO0FBQUEsRUFFbkI7QUFHQSxXQUFTLDBCQUEwQixPQUFPO0FBQ3hDLFFBQUksQ0FBQyxNQUFNLFFBQVE7QUFDakIsYUFBTztBQUFBLElBQ1Q7QUFDQSxVQUFNLE9BQU8sTUFBTSxJQUFJLENBQUMsTUFBTSxRQUFRO0FBQ3BDLFlBQU0sT0FBUyxXQUFXLEtBQUssUUFBUSxFQUFFO0FBQ3pDLFlBQU0sU0FBUyxXQUFXLEtBQUssVUFBVSxRQUFHO0FBQzVDLFlBQU0sT0FBUyxLQUFLLE9BQU8sT0FBTyxLQUFLLElBQUksSUFBSTtBQUMvQyxZQUFNLFdBQVcsV0FBVyxLQUFLLFVBQVU7QUFBQSxRQUN6QyxNQUFNLEtBQUssUUFBUTtBQUFBLFFBQUksUUFBUSxLQUFLLFVBQVU7QUFBQSxRQUFJLE1BQU0sS0FBSyxRQUFRO0FBQUEsTUFDdkUsQ0FBQyxDQUFDO0FBQ0YsYUFBTztBQUFBO0FBQUEsc0JBRVcsSUFBSTtBQUFBLHFDQUNXLE1BQU07QUFBQSx1REFDWSxJQUFJO0FBQUE7QUFBQSxzRUFFVyxRQUFRLEtBQUssR0FBRztBQUFBLGdEQUN0QyxJQUFJO0FBQUEsd0VBQ29CLEdBQUcsTUFBTSxJQUFJO0FBQUEsa0RBQ25DLElBQUk7QUFBQTtBQUFBO0FBQUEsSUFHcEQsQ0FBQyxFQUFFLEtBQUssRUFBRTtBQUNWLFdBQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxlQVVNLElBQUk7QUFBQTtBQUFBLEVBRW5CO0FBR0EsV0FBUywrQkFBK0IsY0FBYztBQUNwRCxRQUFJLENBQUMsYUFBYSxRQUFRO0FBQ3hCLGFBQU87QUFBQSxJQUNUO0FBQ0EsUUFBSSxPQUFPLGFBQWEsSUFBSSxTQUFPO0FBQ2pDLFlBQU0sS0FBVSxXQUFXLElBQUksTUFBTSxFQUFFO0FBQ3ZDLFlBQU0sUUFBVSxXQUFXLElBQUksU0FBUyxFQUFFO0FBQzFDLFlBQU0sT0FBVSxZQUFZLElBQUksZUFBZSxJQUFJLE1BQU0sR0FBRyxHQUFHLENBQUM7QUFDaEUsWUFBTSxNQUFVLElBQUksY0FBYztBQUNsQyxZQUFNLFNBQVUsWUFBWSxJQUFJLGdCQUFnQixDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUM7QUFDOUQsYUFBTztBQUFBO0FBQUEsc0JBRVcsS0FBSyxZQUFZLE9BQU8scUNBQXFDLElBQUksSUFBSSxJQUFJLGVBQWEsSUFBSSxTQUFTLE1BQU0sV0FBTSxFQUFFLGFBQWEsRUFBRTtBQUFBLHlDQUM3RyxHQUFHO0FBQUEsc0RBQ1UsVUFBVSxRQUFHO0FBQUE7QUFBQSxvRUFFQyxXQUFXLEtBQUssVUFBVSxFQUFDLElBQUksSUFBSSxNQUFJLElBQUksT0FBTyxJQUFJLFNBQU8sSUFBSSxhQUFhLElBQUksZUFBYSxJQUFJLGNBQWMsSUFBSSxnQkFBYyxDQUFDLEdBQUcsWUFBWSxJQUFJLGNBQVksRUFBQyxDQUFDLENBQUMsQ0FBQztBQUFBLDhDQUM3TCxLQUFLO0FBQUEsdUVBQ29CLEVBQUUsT0FBTyxLQUFLO0FBQUEsZ0RBQ3JDLEtBQUs7QUFBQTtBQUFBO0FBQUEsSUFHbkQsQ0FBQyxFQUFFLEtBQUssRUFBRTtBQUNWLFdBQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxlQVVNLElBQUk7QUFBQTtBQUFBLEVBRW5CO0FBRUEsV0FBUyxxQkFBcUIsV0FBVztBQUN2QyxVQUFNLE9BQU8sT0FBTyxLQUFLLFNBQVM7QUFDbEMsUUFBSSxDQUFDLEtBQUssUUFBUTtBQUNoQixhQUFPO0FBQUEsSUFDVDtBQUNBLFdBQU8sS0FBSyxJQUFJLFNBQU87QUFDckIsWUFBTUMsUUFBVSxPQUFPLFVBQVUsR0FBRyxNQUFNLFdBQVcsVUFBVSxHQUFHLElBQUksS0FBSyxVQUFVLFVBQVUsR0FBRyxDQUFDO0FBQ25HLFlBQU0sVUFBVSxXQUFXQSxNQUFLLE1BQU0sR0FBRyxHQUFHLENBQUM7QUFDN0MsWUFBTSxTQUFVLFdBQVcsR0FBRztBQUM5QixhQUFPO0FBQUE7QUFBQTtBQUFBLDZDQUdrQyxNQUFNO0FBQUE7QUFBQSxrRUFFZSxXQUFXLEtBQUssVUFBVSxFQUFDLEtBQUssTUFBQUEsTUFBSSxDQUFDLENBQUMsQ0FBQztBQUFBLDRDQUM3RCxNQUFNO0FBQUEscUVBQ21CLE1BQU07QUFBQSw4Q0FDN0IsTUFBTTtBQUFBO0FBQUE7QUFBQSw4Q0FHTixPQUFPLEdBQUdBLE1BQUssU0FBUyxNQUFNLFdBQU0sRUFBRTtBQUFBO0FBQUEsSUFFbEYsQ0FBQyxFQUFFLEtBQUssRUFBRTtBQUFBLEVBQ1o7QUFFQSxXQUFTLDBCQUEwQjtBQUNqQyxhQUFTLGVBQWUsY0FBYyxFQUFFLFFBQW1CO0FBQzNELGFBQVMsZUFBZSx1QkFBdUIsRUFBRSxRQUFVO0FBQzNELGFBQVMsZUFBZSxzQkFBc0IsRUFBRSxRQUFXO0FBQzNELGFBQVMsZUFBZSwwQkFBMEIsRUFBRSxRQUFRO0FBQzVELGFBQVMsZUFBZSw0QkFBNEIsRUFBRSxRQUFRO0FBQzlELGFBQVMsZUFBZSx3QkFBd0IsRUFBRSxjQUFjO0FBQ2hFLGFBQVMsZUFBZSwwQkFBMEIsRUFBRSxNQUFNLFVBQVU7QUFDcEUsaUNBQTZCLFNBQVM7QUFDdEMsb0JBQWdCLDBCQUEwQjtBQUMxQyxjQUFVLDBCQUEwQjtBQUNwQyxhQUFTLGVBQWUsdUJBQXVCLEVBQUUsTUFBTTtBQUFBLEVBQ3pEO0FBRUEsV0FBUyxzQkFBc0IsS0FBSztBQUNsQyxhQUFTLGVBQWUsY0FBYyxFQUFFLFFBQXFCLElBQUksTUFBTTtBQUN2RSxhQUFTLGVBQWUsdUJBQXVCLEVBQUUsUUFBWSxJQUFJLFNBQVM7QUFDMUUsYUFBUyxlQUFlLHNCQUFzQixFQUFFLFFBQWEsSUFBSSxlQUFlO0FBQ2hGLGFBQVMsZUFBZSwwQkFBMEIsRUFBRSxTQUFVLElBQUksZ0JBQWdCLENBQUMsR0FBRyxLQUFLLElBQUk7QUFDL0YsYUFBUyxlQUFlLDRCQUE0QixFQUFFLFFBQVEsSUFBSSxjQUFjO0FBQ2hGLGFBQVMsZUFBZSx3QkFBd0IsRUFBRSxjQUFjO0FBQ2hFLGFBQVMsZUFBZSwwQkFBMEIsRUFBRSxNQUFNLFVBQVU7QUFDcEUsaUNBQTZCLFNBQVM7QUFDdEMsb0JBQWdCLDBCQUEwQjtBQUMxQyxjQUFVLDBCQUEwQjtBQUFBLEVBQ3RDO0FBRUEsV0FBUyxzQkFBc0I7QUFDN0IsYUFBUyxlQUFlLDBCQUEwQixFQUFFLE1BQU0sVUFBVTtBQUNwRSxpQkFBYTtBQUFBLEVBQ2Y7QUFFQSxpQkFBZSx3QkFBd0I7QUFDckMsVUFBTSxLQUFLLFNBQVMsZUFBZSxjQUFjLEVBQUUsTUFBTSxLQUFLLEtBQ25ELFFBQVEsS0FBSyxJQUFJO0FBQzVCLFVBQU0sUUFBYyxTQUFTLGVBQWUsdUJBQXVCLEVBQUUsTUFBTSxLQUFLO0FBQ2hGLFVBQU0sY0FBYyxTQUFTLGVBQWUsc0JBQXNCLEVBQUUsTUFBTSxLQUFLO0FBQy9FLFVBQU0sY0FBYyxTQUFTLGVBQWUsMEJBQTBCLEVBQUU7QUFDeEUsVUFBTSxhQUFjLFNBQVMsU0FBUyxlQUFlLDRCQUE0QixFQUFFLE9BQU8sRUFBRSxLQUFLO0FBRWpHLFFBQUksQ0FBQyxPQUFPO0FBQ1YscUJBQWUsMkJBQWlCLG9CQUFvQjtBQUNwRDtBQUFBLElBQ0Y7QUFDQSxVQUFNLGVBQWUsWUFBWSxNQUFNLEdBQUcsRUFBRSxJQUFJLE9BQUssRUFBRSxLQUFLLENBQUMsRUFBRSxPQUFPLE9BQU87QUFFN0UsUUFBSTtBQUNGLFlBQU0sTUFBTSxNQUFNLE1BQU0sdUNBQXVDO0FBQUEsUUFDN0QsUUFBUztBQUFBLFFBQ1QsU0FBUyxFQUFFLGdCQUFnQixtQkFBbUI7QUFBQSxRQUM5QyxNQUFTLEtBQUssVUFBVSxFQUFFLElBQUksT0FBTyxhQUFhLGNBQWMsV0FBVyxDQUFDO0FBQUEsTUFDOUUsQ0FBQztBQUNELFlBQU0sT0FBTyxNQUFNLElBQUksS0FBSztBQUM1QixVQUFJLEtBQUssSUFBSTtBQUNYLDRCQUFvQjtBQUNwQiwrQkFBdUIseUJBQXlCLEtBQUssVUFBVSxTQUFTO0FBQ3hFLHVCQUFlLGdCQUFXLGdCQUFnQixLQUFLLEtBQUssS0FBSyxNQUFNLEdBQUc7QUFDbEUsY0FBTUwsbUJBQWtCO0FBQUEsTUFDMUIsT0FBTztBQUNMLHVCQUFlLGdCQUFXLEtBQUssU0FBUyxhQUFhO0FBQUEsTUFDdkQ7QUFBQSxJQUNGLFNBQVMsR0FBRztBQUNWLHFCQUFlLGdCQUFXLDRCQUE0QjtBQUFBLElBQ3hEO0FBQUEsRUFDRjtBQUVBLFdBQVMsc0JBQXNCO0FBQzdCLGFBQVMsZUFBZSxxQkFBcUIsRUFBRSxRQUFTO0FBQ3hELGFBQVMsZUFBZSxzQkFBc0IsRUFBRSxRQUFRO0FBQ3hELGFBQVMsZUFBZSx3QkFBd0IsRUFBRSxjQUFjO0FBQ2hFLGFBQVMsZUFBZSwwQkFBMEIsRUFBRSxNQUFNLFVBQVU7QUFDcEUsaUNBQTZCLFNBQVM7QUFDdEMsb0JBQWdCLDBCQUEwQjtBQUMxQyxjQUFVLDBCQUEwQjtBQUFBLEVBQ3RDO0FBRUEsV0FBUyxrQkFBa0IsS0FBSztBQUM5QixhQUFTLGVBQWUscUJBQXFCLEVBQUUsUUFBUyxJQUFJLE9BQVE7QUFDcEUsYUFBUyxlQUFlLHNCQUFzQixFQUFFLFFBQVEsSUFBSSxRQUFRO0FBQ3BFLGFBQVMsZUFBZSx3QkFBd0IsRUFBRSxjQUFjO0FBQ2hFLGFBQVMsZUFBZSwwQkFBMEIsRUFBRSxNQUFNLFVBQVU7QUFDcEUsaUNBQTZCLFNBQVM7QUFDdEMsb0JBQWdCLDBCQUEwQjtBQUMxQyxjQUFVLDBCQUEwQjtBQUFBLEVBQ3RDO0FBRUEsV0FBUyxzQkFBc0I7QUFDN0IsYUFBUyxlQUFlLDBCQUEwQixFQUFFLE1BQU0sVUFBVTtBQUNwRSxpQkFBYTtBQUFBLEVBQ2Y7QUFFQSxpQkFBZSxvQkFBb0I7QUFDakMsVUFBTSxNQUFPLFNBQVMsZUFBZSxxQkFBcUIsRUFBRSxNQUFNLEtBQUs7QUFDdkUsVUFBTUssUUFBTyxTQUFTLGVBQWUsc0JBQXNCLEVBQUUsTUFBTSxLQUFLO0FBQ3hFLFFBQUksQ0FBQyxPQUFPLENBQUNBLE9BQU07QUFDakIscUJBQWUsMkJBQWlCLHlDQUF5QztBQUN6RTtBQUFBLElBQ0Y7QUFDQSxRQUFJO0FBQ0YsWUFBTSxNQUFNLE1BQU0sTUFBTSxtQ0FBbUM7QUFBQSxRQUN6RCxRQUFTO0FBQUEsUUFDVCxTQUFTLEVBQUUsZ0JBQWdCLG1CQUFtQjtBQUFBLFFBQzlDLE1BQVMsS0FBSyxVQUFVLEVBQUUsS0FBSyxNQUFBQSxNQUFLLENBQUM7QUFBQSxNQUN2QyxDQUFDO0FBQ0QsWUFBTSxPQUFPLE1BQU0sSUFBSSxLQUFLO0FBQzVCLFVBQUksS0FBSyxJQUFJO0FBQ1gsNEJBQW9CO0FBQ3BCLCtCQUF1QiwwQkFBMEIsS0FBSyxVQUFVLFNBQVM7QUFDekUsdUJBQWUsZ0JBQVcsWUFBWSxHQUFHLEtBQUssS0FBSyxNQUFNLEdBQUc7QUFDNUQsY0FBTUwsbUJBQWtCO0FBQUEsTUFDMUIsT0FBTztBQUNMLHVCQUFlLGdCQUFXLEtBQUssU0FBUyxhQUFhO0FBQUEsTUFDdkQ7QUFBQSxJQUNGLFNBQVMsR0FBRztBQUNWLHFCQUFlLGdCQUFXLHdCQUF3QjtBQUFBLElBQ3BEO0FBQUEsRUFDRjtBQUlBLFdBQVMsNEJBQTRCO0FBQ25DLFVBQU0sdUJBQXVCLEVBQzFCLEtBQUssT0FBSyxFQUFFLEtBQUssQ0FBQyxFQUNsQixLQUFLLFVBQVE7QUFDWixZQUFNLEtBQVUsS0FBSyxpQkFBaUIsQ0FBQztBQUN2QyxZQUFNLFVBQVUsR0FBRyxXQUFXLENBQUM7QUFDL0IsWUFBTSxVQUFVLFFBQVEsV0FBVyxDQUFDO0FBQ3BDLGVBQVMsZUFBZSxlQUFlLEVBQUUsUUFBVyxHQUFHLFFBQVE7QUFDL0QsZUFBUyxlQUFlLGdCQUFnQixFQUFFLFFBQVUsR0FBRyxTQUFTLEdBQUcsWUFBWTtBQUMvRSxlQUFTLGVBQWUsZ0JBQWdCLEVBQUUsUUFBVSxRQUFRLFNBQVMsR0FBRyxTQUFTO0FBQ2pGLGVBQVMsZUFBZSxnQkFBZ0IsRUFBRSxRQUFVLFFBQVEsU0FBUztBQUNyRSxlQUFTLGVBQWUsbUJBQW1CLEVBQUUsUUFBUSxRQUFRLFlBQVk7QUFDekUsZUFBUyxlQUFlLGtCQUFrQixFQUFFLFFBQVMsUUFBUSxXQUFXO0FBQ3hFLGVBQVMsZUFBZSxlQUFlLEVBQUUsUUFBVyxRQUFRLFFBQVE7QUFDcEUsZUFBUyxlQUFlLGdCQUFnQixFQUFFLFFBQVUsUUFBUSxTQUFTO0FBQ3JFLGVBQVMsZUFBZSx5QkFBeUIsRUFBRSxNQUFNLFVBQVU7QUFDbkUsbUNBQTZCLFNBQVM7QUFDdEMsc0JBQWdCLHlCQUF5QjtBQUN6QyxnQkFBVSx5QkFBeUI7QUFBQSxJQUNyQyxDQUFDLEVBQ0EsTUFBTSxNQUFNLGVBQWUsZ0JBQVcsOEJBQThCLENBQUM7QUFBQSxFQUMxRTtBQUVBLFdBQVMseUJBQXlCO0FBQ2hDLGFBQVMsZUFBZSx5QkFBeUIsRUFBRSxNQUFNLFVBQVU7QUFDbkUsaUJBQWE7QUFBQSxFQUNmO0FBRUEsaUJBQWUsbUJBQW1CO0FBQ2hDLFVBQU0sT0FBTztBQUFBLE1BQ1gsTUFBVSxTQUFTLGVBQWUsZUFBZSxFQUFFLE1BQU0sS0FBSztBQUFBLE1BQzlELE9BQVUsU0FBUyxlQUFlLGdCQUFnQixFQUFFLE1BQU0sS0FBSztBQUFBLE1BQy9ELE9BQVUsU0FBUyxlQUFlLGdCQUFnQixFQUFFLE1BQU0sS0FBSztBQUFBLE1BQy9ELE9BQVUsU0FBUyxlQUFlLGdCQUFnQixFQUFFLE1BQU0sS0FBSztBQUFBLE1BQy9ELFVBQVUsU0FBUyxlQUFlLG1CQUFtQixFQUFFLE1BQU0sS0FBSztBQUFBLE1BQ2xFLFNBQVUsU0FBUyxlQUFlLGtCQUFrQixFQUFFLE1BQU0sS0FBSztBQUFBLE1BQ2pFLE1BQVUsU0FBUyxlQUFlLGVBQWUsRUFBRSxNQUFNLEtBQUs7QUFBQSxNQUM5RCxPQUFVLFNBQVMsZUFBZSxnQkFBZ0IsRUFBRSxNQUFNLEtBQUs7QUFBQSxJQUNqRTtBQUNBLFFBQUk7QUFDRixZQUFNLE1BQU8sTUFBTSxNQUFNLGtDQUFrQztBQUFBLFFBQ3pELFFBQVE7QUFBQSxRQUFRLFNBQVMsRUFBRSxnQkFBZ0IsbUJBQW1CO0FBQUEsUUFBRyxNQUFNLEtBQUssVUFBVSxJQUFJO0FBQUEsTUFDNUYsQ0FBQztBQUNELFlBQU0sT0FBTyxNQUFNLElBQUksS0FBSztBQUM1QixVQUFJLEtBQUssSUFBSTtBQUNYLCtCQUF1QjtBQUN2QiwrQkFBdUIsd0JBQXdCLFNBQVM7QUFDeEQsdUJBQWUsZ0JBQVcsK0JBQStCO0FBQ3pELGNBQU1BLG1CQUFrQjtBQUFBLE1BQzFCLE9BQU87QUFDTCx1QkFBZSxnQkFBVyxLQUFLLFNBQVMsYUFBYTtBQUFBLE1BQ3ZEO0FBQUEsSUFDRixTQUFTLEdBQUc7QUFDVixxQkFBZSxnQkFBVyw4QkFBOEI7QUFBQSxJQUMxRDtBQUFBLEVBQ0Y7QUFJQSxXQUFTLHlCQUF5QjtBQUNoQyxhQUFTLGVBQWUsY0FBYyxFQUFFLFFBQWU7QUFDdkQsYUFBUyxlQUFlLGlCQUFpQixFQUFFLFFBQVk7QUFDdkQsYUFBUyxlQUFlLG1CQUFtQixFQUFFLFFBQVU7QUFDdkQsYUFBUyxlQUFlLGdCQUFnQixFQUFFLFFBQWE7QUFDdkQsYUFBUyxlQUFlLGlCQUFpQixFQUFFLFFBQVk7QUFDdkQsYUFBUyxlQUFlLGlCQUFpQixFQUFFLFFBQVk7QUFDdkQsYUFBUyxlQUFlLGVBQWUsRUFBRSxRQUFjO0FBQ3ZELGFBQVMsZUFBZSxnQkFBZ0IsRUFBRSxRQUFhO0FBQ3ZELGFBQVMsZUFBZSxzQkFBc0IsRUFBRSxRQUFRO0FBQ3hELGFBQVMsZUFBZSxnQkFBZ0IsRUFBRSxRQUFhO0FBQ3ZELGFBQVMsZUFBZSx3QkFBd0IsRUFBRSxjQUFjO0FBQ2hFLGFBQVMsZUFBZSwwQkFBMEIsRUFBRSxNQUFNLFVBQVU7QUFDcEUsa0NBQThCLENBQUM7QUFDL0IsaUNBQTZCO0FBQzdCLGlDQUE2QixTQUFTO0FBQ3RDLG9CQUFnQiwwQkFBMEI7QUFDMUMsY0FBVSwwQkFBMEI7QUFBQSxFQUN0QztBQU9BLE1BQUksOEJBQThCLENBQUM7QUFFbkMsV0FBUyxpQkFBaUIsR0FBRztBQUMzQixXQUFPLE9BQU8sTUFBTSxXQUFXLElBQUssS0FBSyxFQUFFLFFBQVM7QUFBQSxFQUN0RDtBQUVBLFdBQVMsK0JBQStCO0FBQ3RDLFVBQU0sWUFBWSxTQUFTLGVBQWUsOEJBQThCO0FBQ3hFLFFBQUksQ0FBQyxVQUFXO0FBQ2hCLFVBQU0sVUFBVSw0QkFBNEIsU0FBUztBQUNyRCxjQUFVLFlBQVksNEJBQTRCLElBQUksQ0FBQyxLQUFLLFFBQVE7QUFBQTtBQUFBLDJFQUVLLEdBQUc7QUFBQSxtQkFDM0QsV0FBVyxpQkFBaUIsR0FBRyxDQUFDLENBQUMsNkJBQTZCLE1BQU0sQ0FBQztBQUFBLDRFQUNaLEdBQUc7QUFBQSx5Q0FDdEMsTUFBTSxDQUFDLHdCQUF3QixRQUFRLElBQUksYUFBYSxFQUFFO0FBQUEsNEVBQ3ZCLEdBQUc7QUFBQSx5Q0FDdEMsTUFBTSxDQUFDLDRCQUE0QixRQUFRLFVBQVUsYUFBYSxFQUFFO0FBQUEsOEVBQy9CLEdBQUc7QUFBQSwyQ0FDdEMsTUFBTSxDQUFDO0FBQUEsV0FDdkMsRUFBRSxLQUFLLEVBQUUsS0FBSztBQUFBLEVBQ3pCO0FBS0EsV0FBUyxpQ0FBaUM7QUFDeEMsYUFBUyxpQkFBaUIscUJBQXFCLEVBQUUsUUFBUSxDQUFDLFVBQVU7QUFDbEUsWUFBTSxNQUFNLFNBQVMsTUFBTSxRQUFRLEtBQUssRUFBRTtBQUMxQyxZQUFNLE1BQU0sNEJBQTRCLEdBQUc7QUFDM0MsVUFBSSxPQUFPLFFBQVEsWUFBWSxPQUFPLE1BQU07QUFDMUMsb0NBQTRCLEdBQUcsSUFBSSxNQUFNO0FBQUEsTUFDM0MsT0FBTztBQUNMLFlBQUksT0FBTyxNQUFNO0FBQUEsTUFDbkI7QUFBQSxJQUNGLENBQUM7QUFBQSxFQUNIO0FBRUEsV0FBUyxxQkFBcUI7QUFDNUIsVUFBTSxRQUFRLFNBQVMsZUFBZSxtQkFBbUI7QUFDekQsVUFBTUssU0FBUSxNQUFNLFNBQVMsSUFBSSxLQUFLO0FBQ3RDLFFBQUksQ0FBQ0EsTUFBTTtBQUNYLG1DQUErQjtBQUMvQixnQ0FBNEIsS0FBS0EsS0FBSTtBQUNyQyxVQUFNLFFBQVE7QUFDZCxpQ0FBNkI7QUFBQSxFQUMvQjtBQUVBLFdBQVMsb0JBQW9CLEtBQUssT0FBTztBQUN2QyxtQ0FBK0I7QUFDL0IsVUFBTSxTQUFTLE1BQU07QUFDckIsUUFBSSxTQUFTLEtBQUssVUFBVSw0QkFBNEIsT0FBUTtBQUNoRSxVQUFNLENBQUMsSUFBSSxJQUFJLDRCQUE0QixPQUFPLEtBQUssQ0FBQztBQUN4RCxnQ0FBNEIsT0FBTyxRQUFRLEdBQUcsSUFBSTtBQUNsRCxpQ0FBNkI7QUFBQSxFQUMvQjtBQUVBLFdBQVMsc0JBQXNCLEtBQUs7QUFDbEMsbUNBQStCO0FBQy9CLGdDQUE0QixPQUFPLEtBQUssQ0FBQztBQUN6QyxpQ0FBNkI7QUFBQSxFQUMvQjtBQUVBLFdBQVMscUJBQXFCLElBQUk7QUFDaEMsVUFBTSxPQUFPLE9BQU8sNkJBQTZCLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRTtBQUM1RSxRQUFJLENBQUMsS0FBSztBQUNSLHFCQUFlLGdCQUFXLHFFQUFnRTtBQUMxRjtBQUFBLElBQ0Y7QUFDQSxVQUFNLE1BQU0sSUFBSSxZQUFZLENBQUM7QUFDN0IsYUFBUyxlQUFlLGNBQWMsRUFBRSxRQUFnQixJQUFJLE1BQU07QUFDbEUsYUFBUyxlQUFlLGlCQUFpQixFQUFFLFFBQWEsSUFBSSxTQUFTO0FBQ3JFLGFBQVMsZUFBZSxtQkFBbUIsRUFBRSxRQUFXLElBQUksV0FBVztBQUN2RSxhQUFTLGVBQWUsZ0JBQWdCLEVBQUUsUUFBYyxJQUFJLFFBQVE7QUFDcEUsYUFBUyxlQUFlLGlCQUFpQixFQUFFLFFBQWEsSUFBSSxTQUFTO0FBQ3JFLGFBQVMsZUFBZSxpQkFBaUIsRUFBRSxRQUFhLElBQUksY0FBYztBQUMxRSxhQUFTLGVBQWUsZUFBZSxFQUFFLFFBQWUsSUFBSSxZQUFZO0FBQ3hFLGFBQVMsZUFBZSxnQkFBZ0IsRUFBRSxRQUFjLElBQUksbUJBQW1CO0FBQy9FLGFBQVMsZUFBZSxzQkFBc0IsRUFBRSxRQUFTLElBQUksY0FBYztBQUMzRSxhQUFTLGVBQWUsZ0JBQWdCLEVBQUUsUUFBYyxPQUFPLElBQUksU0FBUyxXQUFXLElBQUksUUFDakMsSUFBSSxRQUFRLENBQUMsR0FBRyxLQUFLLElBQUk7QUFDbkYsYUFBUyxlQUFlLHdCQUF3QixFQUFFLGNBQWM7QUFDaEUsYUFBUyxlQUFlLDBCQUEwQixFQUFFLE1BQU0sVUFBVTtBQUNwRSxrQ0FBOEIsS0FBSyxNQUFNLEtBQUssVUFBVSxJQUFJLGdCQUFnQixDQUFDLENBQUMsQ0FBQztBQUMvRSxpQ0FBNkI7QUFDN0IsaUNBQTZCLFNBQVM7QUFDdEMsb0JBQWdCLDBCQUEwQjtBQUMxQyxjQUFVLDBCQUEwQjtBQUFBLEVBQ3RDO0FBRUEsV0FBUyx1QkFBdUI7QUFDOUIsYUFBUyxlQUFlLDBCQUEwQixFQUFFLE1BQU0sVUFBVTtBQUNwRSxpQkFBYTtBQUFBLEVBQ2Y7QUFFQSxpQkFBZSx1QkFBdUI7QUFDcEMsVUFBTSxLQUFTLFNBQVMsZUFBZSxjQUFjLEVBQUUsTUFBTSxLQUFLO0FBQ2xFLFVBQU0sUUFBUyxTQUFTLGVBQWUsaUJBQWlCLEVBQUUsTUFBTSxLQUFLO0FBQ3JFLFVBQU0sVUFBVSxTQUFTLGVBQWUsbUJBQW1CLEVBQUUsTUFBTSxLQUFLO0FBQ3hFLFFBQUksQ0FBQyxTQUFTLENBQUMsU0FBUztBQUN0QixxQkFBZSwyQkFBaUIscUNBQXFDO0FBQ3JFO0FBQUEsSUFDRjtBQUNBLFVBQU0sVUFBVSxTQUFTLGVBQWUsZ0JBQWdCLEVBQUU7QUFDMUQsbUNBQStCO0FBQy9CLFVBQU0sVUFBVTtBQUFBLE1BQ2Q7QUFBQSxNQUFPO0FBQUEsTUFDUCxNQUFpQixTQUFTLGVBQWUsZ0JBQWdCLEVBQUUsTUFBTSxLQUFLO0FBQUEsTUFDdEUsT0FBaUIsU0FBUyxlQUFlLGlCQUFpQixFQUFFLE1BQU0sS0FBSztBQUFBLE1BQ3ZFLFlBQWlCLFNBQVMsZUFBZSxpQkFBaUIsRUFBRSxNQUFNLEtBQUs7QUFBQSxNQUN2RSxVQUFpQixTQUFTLGVBQWUsZUFBZSxFQUFFLE1BQU0sS0FBSztBQUFBLE1BQ3JFLGlCQUFpQixTQUFTLGVBQWUsZ0JBQWdCLEVBQUU7QUFBQSxNQUMzRCxZQUFpQixTQUFTLFNBQVMsZUFBZSxzQkFBc0IsRUFBRSxPQUFPLEVBQUUsS0FBSztBQUFBLE1BQ3hGLE1BQWlCLFFBQVEsTUFBTSxHQUFHLEVBQUUsSUFBSSxPQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTyxPQUFPO0FBQUEsTUFDckUsY0FBaUI7QUFBQSxJQUNuQjtBQUNBLFVBQU0sU0FBUyxLQUFLLFdBQVc7QUFDL0IsVUFBTSxPQUFTLFdBQVcsV0FBVyxFQUFFLFFBQVEsSUFBSSxZQUFZLFFBQVEsSUFBSSxFQUFFLFFBQVEsWUFBWSxRQUFRO0FBQ3pHLFFBQUk7QUFDRixZQUFNLE1BQU8sTUFBTSxNQUFNLCtCQUErQjtBQUFBLFFBQ3RELFFBQVE7QUFBQSxRQUFRLFNBQVMsRUFBRSxnQkFBZ0IsbUJBQW1CO0FBQUEsUUFBRyxNQUFNLEtBQUssVUFBVSxJQUFJO0FBQUEsTUFDNUYsQ0FBQztBQUNELFlBQU0sT0FBTyxNQUFNLElBQUksS0FBSztBQUM1QixVQUFJLEtBQUssSUFBSTtBQUNYLDZCQUFxQjtBQUNyQiwrQkFBdUIsbUJBQW1CLEtBQUssVUFBVSxTQUFTO0FBQ2xFLHVCQUFlLGdCQUFXLGVBQWUsS0FBSyxLQUFLLEtBQUssTUFBTSxHQUFHO0FBQ2pFLGNBQU1MLG1CQUFrQjtBQUFBLE1BQzFCLE9BQU87QUFDTCx1QkFBZSxnQkFBVyxLQUFLLFNBQVMsYUFBYTtBQUFBLE1BQ3ZEO0FBQUEsSUFDRixTQUFTLEdBQUc7QUFDVixxQkFBZSxnQkFBVywyQkFBMkI7QUFBQSxJQUN2RDtBQUFBLEVBQ0Y7QUFFQSxpQkFBZSx1QkFBdUIsSUFBSSxPQUFPO0FBQy9DO0FBQUEsTUFDRTtBQUFBLE1BQ0EsV0FBVyxLQUFLO0FBQUEsTUFDaEIsWUFBWTtBQUNWLFlBQUk7QUFDRixnQkFBTSxNQUFPLE1BQU0sTUFBTSwrQkFBK0I7QUFBQSxZQUN0RCxRQUFRO0FBQUEsWUFBUSxTQUFTLEVBQUUsZ0JBQWdCLG1CQUFtQjtBQUFBLFlBQzlELE1BQU0sS0FBSyxVQUFVLEVBQUUsUUFBUSxVQUFVLEdBQUcsQ0FBQztBQUFBLFVBQy9DLENBQUM7QUFDRCxnQkFBTSxPQUFPLE1BQU0sSUFBSSxLQUFLO0FBQzVCLGNBQUksS0FBSyxJQUFJO0FBQ1gsbUNBQXVCLG1CQUFtQixLQUFLLFVBQVUsU0FBUztBQUNsRSwyQkFBZSxrQkFBYSxlQUFlLEtBQUssWUFBWTtBQUM1RCxrQkFBTUEsbUJBQWtCO0FBQUEsVUFDMUIsT0FBTztBQUNMLDJCQUFlLGdCQUFXLEtBQUssU0FBUyxlQUFlO0FBQUEsVUFDekQ7QUFBQSxRQUNGLFNBQVMsR0FBRztBQUNWLHlCQUFlLGdCQUFXLDZCQUE2QjtBQUFBLFFBQ3pEO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBSUEsV0FBUyxrQkFBa0IsYUFBYSxRQUFRO0FBQzlDLGFBQVMsZUFBZSxzQkFBc0IsRUFBRSxRQUFRLGVBQWU7QUFDdkUsYUFBUyxlQUFlLHFCQUFxQixFQUFFLFFBQVMsU0FBUyxNQUFNO0FBQ3ZFLGFBQVMsZUFBZSwyQkFBMkIsRUFBRSxRQUFRO0FBQzdELGFBQVMsZUFBZSxrQkFBa0IsRUFBRSxRQUFZO0FBQ3hELGFBQVMsZUFBZSx5QkFBeUIsRUFBRSxRQUFRO0FBQzNELGFBQVMsZUFBZSxxQkFBcUIsRUFBRSxRQUFTO0FBQ3hELGFBQVMsZUFBZSxtQkFBbUIsRUFBRSxRQUFXO0FBQ3hELGFBQVMsZUFBZSwwQkFBMEIsRUFBRSxjQUFjO0FBQ2xFLGFBQVMsZUFBZSx1QkFBdUIsRUFBRSxjQUFjO0FBQy9ELFVBQU0sU0FBUyxPQUFPLDRCQUE0QixDQUFDLEdBQ2hELE1BQU0sR0FBRyxDQUFDLEVBQ1YsSUFBSSxDQUFDRyxPQUFNLEdBQUdBLEdBQUUsRUFBRSxLQUFLQSxHQUFFLEtBQUssR0FBRyxFQUNqQyxLQUFLLFFBQUs7QUFDYixhQUFTLGVBQWUsd0JBQXdCLEVBQUUsY0FBYyxRQUFRLGNBQWMsS0FBSyxLQUFLO0FBQ2hHLFVBQU0sU0FBUyxTQUFTLGVBQWUsb0JBQW9CO0FBQzNELFFBQUksYUFBYTtBQUNmLGVBQVMsZUFBZSx3QkFBd0IsRUFBRSxjQUFjO0FBQ2hFLGFBQU8sTUFBTSxVQUFVO0FBQUEsSUFDekIsT0FBTztBQUNMLGFBQU8sTUFBTSxVQUFVO0FBQUEsSUFDekI7QUFDQSxhQUFTLGVBQWUsNEJBQTRCLEVBQUUsTUFBTSxVQUFVO0FBQ3RFLGlDQUE2QixTQUFTO0FBQ3RDLG9CQUFnQiw0QkFBNEI7QUFDNUMsY0FBVSw0QkFBNEI7QUFDdEMsYUFBUyxlQUFlLGtCQUFrQixFQUFFLE1BQU07QUFBQSxFQUNwRDtBQUVBLFdBQVMsZ0JBQWdCLFVBQVUsYUFBYSxRQUFRO0FBQ3RELFVBQU0sT0FBTyxPQUFPLGFBQWEsV0FBVyxXQUFZLFVBQVUsUUFBUTtBQUMxRSxVQUFNLGNBQWMsTUFBTSxRQUFRLFVBQVUsV0FBVyxJQUFJLFNBQVMsY0FBYyxDQUFDO0FBQ25GLFVBQU0sVUFBVSxNQUFNLFFBQVEsVUFBVSxPQUFPLElBQUksU0FBUyxVQUFVLENBQUM7QUFDdkUsVUFBTSxRQUFTLE9BQU8sYUFBYSxZQUFZLFVBQVUsU0FBUyxPQUFRLFNBQVMsUUFBUTtBQUUzRixhQUFTLGVBQWUsc0JBQXNCLEVBQUUsUUFBUSxlQUFlO0FBQ3ZFLGFBQVMsZUFBZSxxQkFBcUIsRUFBRSxRQUFTLFNBQVMsTUFBTTtBQUN2RSxhQUFTLGVBQWUsMkJBQTJCLEVBQUUsUUFBUTtBQUM3RCxhQUFTLGVBQWUsa0JBQWtCLEVBQUUsUUFBUTtBQUNwRCxhQUFTLGVBQWUseUJBQXlCLEVBQUUsUUFBUSxZQUFZLEtBQUssSUFBSTtBQUNoRixhQUFTLGVBQWUscUJBQXFCLEVBQUUsUUFBUSxRQUFRLEtBQUssSUFBSTtBQUN4RSxhQUFTLGVBQWUsbUJBQW1CLEVBQUUsUUFBUTtBQUNyRCxhQUFTLGVBQWUsMEJBQTBCLEVBQUUsY0FBYztBQUNsRSxhQUFTLGVBQWUsdUJBQXVCLEVBQUUsY0FBYztBQUUvRCxVQUFNLFNBQVMsT0FBTyw0QkFBNEIsQ0FBQyxHQUNoRCxNQUFNLEdBQUcsQ0FBQyxFQUNWLElBQUksQ0FBQ0EsT0FBTSxHQUFHQSxHQUFFLEVBQUUsS0FBS0EsR0FBRSxLQUFLLEdBQUcsRUFDakMsS0FBSyxRQUFLO0FBQ2IsYUFBUyxlQUFlLHdCQUF3QixFQUFFLGNBQWMsUUFBUSxjQUFjLEtBQUssS0FBSztBQUVoRyxVQUFNLFNBQVMsU0FBUyxlQUFlLG9CQUFvQjtBQUMzRCxRQUFJLGFBQWE7QUFDZixlQUFTLGVBQWUsd0JBQXdCLEVBQUUsY0FBYztBQUNoRSxhQUFPLE1BQU0sVUFBVTtBQUFBLElBQ3pCLE9BQU87QUFDTCxhQUFPLE1BQU0sVUFBVTtBQUFBLElBQ3pCO0FBRUEsYUFBUyxlQUFlLDRCQUE0QixFQUFFLE1BQU0sVUFBVTtBQUN0RSxpQ0FBNkIsU0FBUztBQUN0QyxvQkFBZ0IsNEJBQTRCO0FBQzVDLGNBQVUsNEJBQTRCO0FBQ3RDLGFBQVMsZUFBZSxrQkFBa0IsRUFBRSxNQUFNO0FBQUEsRUFDcEQ7QUFFQSxXQUFTLGtCQUFrQjtBQUN6QixhQUFTLGVBQWUsNEJBQTRCLEVBQUUsTUFBTSxVQUFVO0FBQ3RFLGlCQUFhO0FBQUEsRUFDZjtBQUVBLGlCQUFlLGtCQUFrQjtBQUMvQixVQUFNLFFBQVcsU0FBUyxlQUFlLGtCQUFrQixFQUFFLE1BQU0sS0FBSztBQUN4RSxVQUFNLFdBQVcsU0FBUyxlQUFlLHNCQUFzQixFQUFFLE1BQU0sS0FBSztBQUM1RSxVQUFNLFNBQVcsU0FBUyxlQUFlLHFCQUFxQixFQUFFLFVBQVU7QUFDMUUsVUFBTSxXQUFXLFNBQVMsZUFBZSwyQkFBMkIsRUFBRSxNQUFNLEtBQUs7QUFDakYsVUFBTSxjQUFjLFNBQVMsZUFBZSx5QkFBeUIsRUFBRSxNQUNwRSxNQUFNLEdBQUcsRUFDVCxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxFQUNuQixPQUFPLE9BQU87QUFDakIsVUFBTSxVQUFVLFNBQVMsZUFBZSxxQkFBcUIsRUFBRSxNQUM1RCxNQUFNLEdBQUcsRUFDVCxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxFQUNuQixPQUFPLE9BQU87QUFDakIsVUFBTSxXQUFXLFNBQVMsZUFBZSxtQkFBbUIsRUFBRSxNQUFNLEtBQUs7QUFDekUsVUFBTSxRQUFRLGFBQWEsS0FBSyxPQUFPLFdBQVcsUUFBUTtBQUMxRCxRQUFJLENBQUMsT0FBTztBQUNWLHFCQUFlLDJCQUFpQix5QkFBeUI7QUFDekQ7QUFBQSxJQUNGO0FBQ0EsUUFBSSxVQUFVLFFBQVEsQ0FBQyxPQUFPLFNBQVMsS0FBSyxHQUFHO0FBQzdDLHFCQUFlLDJCQUFpQiw4Q0FBOEM7QUFDOUU7QUFBQSxJQUNGO0FBQ0EsVUFBTSxXQUFXLFFBQVEsUUFBUTtBQUNqQyxVQUFNLFdBQVc7QUFBQSxNQUNmLFFBQVEsV0FBVyxXQUFXO0FBQUEsTUFDOUIsT0FBTyxXQUFXLFdBQVc7QUFBQSxNQUM3QixHQUFJLFdBQVcsRUFBRSxXQUFXLE1BQU0sSUFBSSxDQUFDO0FBQUEsTUFDdkM7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0Y7QUFDQSxVQUFNLE9BQU8sU0FBUyxXQUFXLEVBQUUsR0FBRyxVQUFVLFNBQVM7QUFDekQsUUFBSTtBQUNGLFlBQU0sTUFBTyxNQUFNLE1BQU0sMEJBQTBCO0FBQUEsUUFDakQsUUFBUTtBQUFBLFFBQVEsU0FBUyxFQUFFLGdCQUFnQixtQkFBbUI7QUFBQSxRQUFHLE1BQU0sS0FBSyxVQUFVLElBQUk7QUFBQSxNQUM1RixDQUFDO0FBQ0QsWUFBTSxPQUFPLE1BQU0sSUFBSSxLQUFLO0FBQzVCLFVBQUksS0FBSyxJQUFJO0FBQ1gsd0JBQWdCO0FBQ2hCLCtCQUF1QixVQUFVLEtBQUssVUFBVSxTQUFTO0FBQ3pELGNBQU1ILG1CQUFrQjtBQUFBLE1BQzFCLE9BQU87QUFDTCx1QkFBZSxnQkFBVyxLQUFLLFNBQVMscUJBQXFCO0FBQUEsTUFDL0Q7QUFBQSxJQUNGLFNBQVMsR0FBRztBQUNWLHFCQUFlLGdCQUFXLHFCQUFxQjtBQUFBLElBQ2pEO0FBQUEsRUFDRjtBQUVBLGlCQUFlLGtCQUFrQixPQUFPLFVBQVUsUUFBUTtBQUN4RCxVQUFNLE9BQU8sU0FBUyxFQUFFLFFBQVEsVUFBVSxNQUFNLElBQUksRUFBRSxRQUFRLFVBQVUsT0FBTyxTQUFTO0FBQ3hGLFVBQU0sUUFBUSxTQUFTLFdBQVcsaUJBQVksUUFBUTtBQUN0RDtBQUFBLE1BQ0U7QUFBQSxNQUNBLGlCQUFpQixLQUFLLFVBQVUsS0FBSztBQUFBLE1BQ3JDLFlBQVk7QUFDVixZQUFJO0FBQ0YsZ0JBQU0sTUFBTyxNQUFNLE1BQU0sMEJBQTBCO0FBQUEsWUFDakQsUUFBUTtBQUFBLFlBQVEsU0FBUyxFQUFFLGdCQUFnQixtQkFBbUI7QUFBQSxZQUFHLE1BQU0sS0FBSyxVQUFVLElBQUk7QUFBQSxVQUM1RixDQUFDO0FBQ0QsZ0JBQU0sT0FBTyxNQUFNLElBQUksS0FBSztBQUM1QixjQUFJLEtBQUssSUFBSTtBQUNYLG1DQUF1QixVQUFVLEtBQUssVUFBVSxTQUFTO0FBQ3pELGtCQUFNQSxtQkFBa0I7QUFBQSxVQUMxQixPQUFPO0FBQ0wsMkJBQWUsZ0JBQVcsS0FBSyxTQUFTLHdCQUF3QjtBQUFBLFVBQ2xFO0FBQUEsUUFDRixTQUFTLEdBQUc7QUFDVix5QkFBZSxnQkFBVyx3QkFBd0I7QUFBQSxRQUNwRDtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUlBLFdBQVMsd0JBQXdCO0FBQy9CLGFBQVMsZUFBZSxlQUFlLEVBQUUsUUFBbUI7QUFDNUQsYUFBUyxlQUFlLGtCQUFrQixFQUFFLFFBQWdCO0FBQzVELGFBQVMsZUFBZSxpQkFBaUIsRUFBRSxRQUFpQjtBQUM1RCxhQUFTLGVBQWUsdUJBQXVCLEVBQUUsUUFBVztBQUM1RCxhQUFTLGVBQWUsZ0JBQWdCLEVBQUUsUUFBa0I7QUFDNUQsYUFBUyxlQUFlLGlCQUFpQixFQUFFLFFBQWlCO0FBQzVELGFBQVMsZUFBZSxzQkFBc0IsRUFBRSxRQUFZO0FBQzVELGFBQVMsZUFBZSxvQkFBb0IsRUFBRSxRQUFjO0FBQzVELGFBQVMsZUFBZSx3QkFBd0IsRUFBRSxjQUFjO0FBQ2hFLGFBQVMsZUFBZSwwQkFBMEIsRUFBRSxNQUFNLFVBQVU7QUFDcEUsaUNBQTZCLFNBQVM7QUFDdEMsb0JBQWdCLDBCQUEwQjtBQUMxQyxjQUFVLDBCQUEwQjtBQUFBLEVBQ3RDO0FBRUEsV0FBUyxvQkFBb0IsS0FBSyxLQUFLO0FBQ3JDLGFBQVMsZUFBZSxlQUFlLEVBQUUsUUFBZ0I7QUFDekQsYUFBUyxlQUFlLGtCQUFrQixFQUFFLFFBQWEsSUFBSSxVQUFVO0FBQ3ZFLGFBQVMsZUFBZSxpQkFBaUIsRUFBRSxRQUFjLElBQUksU0FBUztBQUN0RSxhQUFTLGVBQWUsdUJBQXVCLEVBQUUsUUFBUSxJQUFJLGVBQWU7QUFDNUUsYUFBUyxlQUFlLGdCQUFnQixFQUFFLFFBQWUsSUFBSSxRQUFRO0FBQ3JFLGFBQVMsZUFBZSxpQkFBaUIsRUFBRSxRQUFjLElBQUksU0FBUztBQUN0RSxhQUFTLGVBQWUsc0JBQXNCLEVBQUUsUUFBUyxJQUFJLGNBQWM7QUFDM0UsYUFBUyxlQUFlLG9CQUFvQixFQUFFLFFBQVcsSUFBSSxZQUFZO0FBQ3pFLGFBQVMsZUFBZSx3QkFBd0IsRUFBRSxjQUFjO0FBQ2hFLGFBQVMsZUFBZSwwQkFBMEIsRUFBRSxNQUFNLFVBQVU7QUFDcEUsaUNBQTZCLFNBQVM7QUFDdEMsb0JBQWdCLDBCQUEwQjtBQUMxQyxjQUFVLDBCQUEwQjtBQUFBLEVBQ3RDO0FBRUEsV0FBUyxzQkFBc0I7QUFDN0IsYUFBUyxlQUFlLDBCQUEwQixFQUFFLE1BQU0sVUFBVTtBQUNwRSxpQkFBYTtBQUFBLEVBQ2Y7QUFFQSxpQkFBZSxzQkFBc0I7QUFDbkMsVUFBTSxNQUFVLFNBQVMsU0FBUyxlQUFlLGVBQWUsRUFBRSxPQUFPLEVBQUU7QUFDM0UsVUFBTSxTQUFVLFNBQVMsZUFBZSxrQkFBa0IsRUFBRSxNQUFNLEtBQUs7QUFDdkUsVUFBTSxjQUFjLFNBQVMsZUFBZSx1QkFBdUIsRUFBRSxNQUFNLEtBQUs7QUFDaEYsUUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhO0FBQzNCLHFCQUFlLDJCQUFpQixzQ0FBc0M7QUFDdEU7QUFBQSxJQUNGO0FBQ0EsVUFBTSxTQUFTLE9BQU8sSUFBSSxXQUFXO0FBQ3JDLFVBQU0sT0FBTztBQUFBLE1BQ1g7QUFBQSxNQUNBO0FBQUEsTUFDQSxPQUFhLFNBQVMsZUFBZSxpQkFBaUIsRUFBRSxNQUFNLEtBQUs7QUFBQSxNQUNuRTtBQUFBLE1BQ0EsTUFBYSxTQUFTLGVBQWUsZ0JBQWdCLEVBQUUsTUFBTSxLQUFLO0FBQUEsTUFDbEUsT0FBYSxTQUFTLGVBQWUsaUJBQWlCLEVBQUUsTUFBTSxLQUFLO0FBQUEsTUFDbkUsWUFBYSxTQUFTLFNBQVMsZUFBZSxzQkFBc0IsRUFBRSxPQUFPLEVBQUUsS0FBSztBQUFBLE1BQ3BGLFVBQWEsU0FBUyxTQUFTLGVBQWUsb0JBQW9CLEVBQUUsT0FBTyxFQUFFLEtBQUs7QUFBQSxNQUNsRixHQUFJLFdBQVcsV0FBVyxFQUFFLElBQUksSUFBSSxDQUFDO0FBQUEsSUFDdkM7QUFDQSxRQUFJO0FBQ0YsWUFBTSxNQUFPLE1BQU0sTUFBTSw4QkFBOEI7QUFBQSxRQUNyRCxRQUFRO0FBQUEsUUFBUSxTQUFTLEVBQUUsZ0JBQWdCLG1CQUFtQjtBQUFBLFFBQUcsTUFBTSxLQUFLLFVBQVUsSUFBSTtBQUFBLE1BQzVGLENBQUM7QUFDRCxZQUFNLE9BQU8sTUFBTSxJQUFJLEtBQUs7QUFDNUIsVUFBSSxLQUFLLElBQUk7QUFDWCw0QkFBb0I7QUFDcEIsK0JBQXVCLGFBQWEsS0FBSyxVQUFVLFNBQVM7QUFDNUQsdUJBQWUsZ0JBQVcsY0FBYyxNQUFNLFdBQU0sV0FBVyxLQUFLLEtBQUssTUFBTSxHQUFHO0FBQ2xGLGNBQU1BLG1CQUFrQjtBQUFBLE1BQzFCLE9BQU87QUFDTCx1QkFBZSxnQkFBVyxLQUFLLFNBQVMsYUFBYTtBQUFBLE1BQ3ZEO0FBQUEsSUFDRixTQUFTLEdBQUc7QUFDVixxQkFBZSxnQkFBVywwQkFBMEI7QUFBQSxJQUN0RDtBQUFBLEVBQ0Y7QUFFQSxpQkFBZSxzQkFBc0IsS0FBSyxhQUFhO0FBQ3JEO0FBQUEsTUFDRTtBQUFBLE1BQ0EsV0FBVyxXQUFXO0FBQUEsTUFDdEIsWUFBWTtBQUNWLFlBQUk7QUFDRixnQkFBTSxNQUFPLE1BQU0sTUFBTSw4QkFBOEI7QUFBQSxZQUNyRCxRQUFRO0FBQUEsWUFBUSxTQUFTLEVBQUUsZ0JBQWdCLG1CQUFtQjtBQUFBLFlBQzlELE1BQU0sS0FBSyxVQUFVLEVBQUUsUUFBUSxVQUFVLElBQUksQ0FBQztBQUFBLFVBQ2hELENBQUM7QUFDRCxnQkFBTSxPQUFPLE1BQU0sSUFBSSxLQUFLO0FBQzVCLGNBQUksS0FBSyxJQUFJO0FBQ1gsbUNBQXVCLGFBQWEsS0FBSyxVQUFVLFNBQVM7QUFDNUQsMkJBQWUsa0JBQWEsMEJBQTBCO0FBQ3RELGtCQUFNQSxtQkFBa0I7QUFBQSxVQUMxQixPQUFPO0FBQ0wsMkJBQWUsZ0JBQVcsS0FBSyxTQUFTLGVBQWU7QUFBQSxVQUN6RDtBQUFBLFFBQ0YsU0FBUyxHQUFHO0FBQ1YseUJBQWUsZ0JBQVcsa0NBQWtDO0FBQUEsUUFDOUQ7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFJQSxXQUFTLG9CQUFvQjtBQUMzQixhQUFTLGVBQWUsaUJBQWlCLEVBQUUsUUFBVztBQUN0RCxhQUFTLGVBQWUsbUJBQW1CLEVBQUUsUUFBUztBQUN0RCxhQUFTLGVBQWUsa0JBQWtCLEVBQUUsUUFBVTtBQUN0RCxhQUFTLGVBQWUsa0JBQWtCLEVBQUUsUUFBVTtBQUN0RCxhQUFTLGVBQWUsc0JBQXNCLEVBQUUsUUFBUTtBQUN4RCxhQUFTLGVBQWUsMEJBQTBCLEVBQUUsY0FBYztBQUNsRSxhQUFTLGVBQWUsNEJBQTRCLEVBQUUsTUFBTSxVQUFVO0FBQ3RFLGlDQUE2QixTQUFTO0FBQ3RDLG9CQUFnQiw0QkFBNEI7QUFDNUMsY0FBVSw0QkFBNEI7QUFBQSxFQUN4QztBQUVBLFdBQVMsZ0JBQWdCLE9BQU8sS0FBSztBQUNuQyxhQUFTLGVBQWUsaUJBQWlCLEVBQUUsUUFBWTtBQUN2RCxhQUFTLGVBQWUsbUJBQW1CLEVBQUUsUUFBVSxNQUFNLFNBQVM7QUFDdEUsYUFBUyxlQUFlLGtCQUFrQixFQUFFLFFBQVcsTUFBTSxRQUFRO0FBQ3JFLGFBQVMsZUFBZSxrQkFBa0IsRUFBRSxRQUFXLE1BQU0sZUFBZTtBQUM1RSxhQUFTLGVBQWUsc0JBQXNCLEVBQUUsUUFBUSxPQUFPLE1BQU0saUJBQWlCLFdBQ2xGLE1BQU0sZ0JBQWdCLE1BQU0sZ0JBQWdCLENBQUMsR0FBRyxLQUFLLElBQUk7QUFDN0QsYUFBUyxlQUFlLDBCQUEwQixFQUFFLGNBQWM7QUFDbEUsYUFBUyxlQUFlLDRCQUE0QixFQUFFLE1BQU0sVUFBVTtBQUN0RSxpQ0FBNkIsU0FBUztBQUN0QyxvQkFBZ0IsNEJBQTRCO0FBQzVDLGNBQVUsNEJBQTRCO0FBQUEsRUFDeEM7QUFFQSxXQUFTLGtCQUFrQjtBQUN6QixhQUFTLGVBQWUsNEJBQTRCLEVBQUUsTUFBTSxVQUFVO0FBQ3RFLGlCQUFhO0FBQUEsRUFDZjtBQUVBLGlCQUFlLGtCQUFrQjtBQUMvQixVQUFNLE1BQVEsU0FBUyxTQUFTLGVBQWUsaUJBQWlCLEVBQUUsT0FBTyxFQUFFO0FBQzNFLFVBQU0sUUFBUSxTQUFTLGVBQWUsbUJBQW1CLEVBQUUsTUFBTSxLQUFLO0FBQ3RFLFFBQUksQ0FBQyxPQUFPO0FBQ1YscUJBQWUsMkJBQWlCLDBCQUEwQjtBQUMxRDtBQUFBLElBQ0Y7QUFDQSxVQUFNLFNBQVMsT0FBTyxJQUFJLFdBQVc7QUFDckMsVUFBTSxjQUFjLFNBQVMsZUFBZSxzQkFBc0IsRUFBRTtBQUNwRSxVQUFNLE9BQU87QUFBQSxNQUNYO0FBQUEsTUFBUTtBQUFBLE1BQ1IsTUFBYyxTQUFTLFNBQVMsZUFBZSxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsS0FBSztBQUFBLE1BQ2pGLGFBQWMsU0FBUyxlQUFlLGtCQUFrQixFQUFFLE1BQU0sS0FBSztBQUFBLE1BQ3JFLGNBQWMsWUFBWSxNQUFNLEdBQUcsRUFBRSxJQUFJLE9BQUssRUFBRSxLQUFLLENBQUMsRUFBRSxPQUFPLE9BQU87QUFBQSxNQUN0RSxHQUFJLFdBQVcsV0FBVyxFQUFFLElBQUksSUFBSSxDQUFDO0FBQUEsSUFDdkM7QUFDQSxRQUFJO0FBQ0YsWUFBTSxNQUFPLE1BQU0sTUFBTSwwQkFBMEI7QUFBQSxRQUNqRCxRQUFRO0FBQUEsUUFBUSxTQUFTLEVBQUUsZ0JBQWdCLG1CQUFtQjtBQUFBLFFBQUcsTUFBTSxLQUFLLFVBQVUsSUFBSTtBQUFBLE1BQzVGLENBQUM7QUFDRCxZQUFNLE9BQU8sTUFBTSxJQUFJLEtBQUs7QUFDNUIsVUFBSSxLQUFLLElBQUk7QUFDWCx3QkFBZ0I7QUFDaEIsK0JBQXVCLG9CQUFvQixLQUFLLFVBQVUsU0FBUztBQUNuRSx1QkFBZSxnQkFBVyxVQUFVLEtBQUssS0FBSyxLQUFLLE1BQU0sR0FBRztBQUM1RCxjQUFNQSxtQkFBa0I7QUFBQSxNQUMxQixPQUFPO0FBQ0wsdUJBQWUsZ0JBQVcsS0FBSyxTQUFTLGFBQWE7QUFBQSxNQUN2RDtBQUFBLElBQ0YsU0FBUyxHQUFHO0FBQ1YscUJBQWUsZ0JBQVcsc0JBQXNCO0FBQUEsSUFDbEQ7QUFBQSxFQUNGO0FBRUEsaUJBQWUsa0JBQWtCLEtBQUssT0FBTztBQUMzQztBQUFBLE1BQ0U7QUFBQSxNQUNBLFdBQVcsS0FBSztBQUFBLE1BQ2hCLFlBQVk7QUFDVixZQUFJO0FBQ0YsZ0JBQU0sTUFBTyxNQUFNLE1BQU0sMEJBQTBCO0FBQUEsWUFDakQsUUFBUTtBQUFBLFlBQVEsU0FBUyxFQUFFLGdCQUFnQixtQkFBbUI7QUFBQSxZQUM5RCxNQUFNLEtBQUssVUFBVSxFQUFFLFFBQVEsVUFBVSxJQUFJLENBQUM7QUFBQSxVQUNoRCxDQUFDO0FBQ0QsZ0JBQU0sT0FBTyxNQUFNLElBQUksS0FBSztBQUM1QixjQUFJLEtBQUssSUFBSTtBQUNYLG1DQUF1QixvQkFBb0IsS0FBSyxVQUFVLFNBQVM7QUFDbkUsMkJBQWUsa0JBQWEsZ0JBQWdCO0FBQzVDLGtCQUFNQSxtQkFBa0I7QUFBQSxVQUMxQixPQUFPO0FBQ0wsMkJBQWUsZ0JBQVcsS0FBSyxTQUFTLGVBQWU7QUFBQSxVQUN6RDtBQUFBLFFBQ0YsU0FBUyxHQUFHO0FBQ1YseUJBQWUsZ0JBQVcsd0JBQXdCO0FBQUEsUUFDcEQ7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFJQSxXQUFTLDRCQUE0QjtBQUNuQyxhQUFTLGVBQWUsZ0JBQWdCLEVBQUUsUUFBVztBQUNyRCxhQUFTLGVBQWUsaUJBQWlCLEVBQUUsUUFBVTtBQUNyRCxhQUFTLGVBQWUsbUJBQW1CLEVBQUUsUUFBUTtBQUNyRCxhQUFTLGVBQWUsaUJBQWlCLEVBQUUsUUFBVTtBQUNyRCxhQUFTLGVBQWUseUJBQXlCLEVBQUUsY0FBYztBQUNqRSxhQUFTLGVBQWUsMkJBQTJCLEVBQUUsTUFBTSxVQUFVO0FBQ3JFLGlDQUE2QixTQUFTO0FBQ3RDLG9CQUFnQiwyQkFBMkI7QUFDM0MsY0FBVSwyQkFBMkI7QUFBQSxFQUN2QztBQUVBLFdBQVMsd0JBQXdCLE1BQU0sS0FBSztBQUMxQyxhQUFTLGVBQWUsZ0JBQWdCLEVBQUUsUUFBVztBQUNyRCxhQUFTLGVBQWUsaUJBQWlCLEVBQUUsUUFBVSxLQUFLLFFBQVE7QUFDbEUsYUFBUyxlQUFlLG1CQUFtQixFQUFFLFFBQVEsS0FBSyxVQUFVO0FBQ3BFLGFBQVMsZUFBZSxpQkFBaUIsRUFBRSxRQUFVLEtBQUssUUFBUTtBQUNsRSxhQUFTLGVBQWUseUJBQXlCLEVBQUUsY0FBYztBQUNqRSxhQUFTLGVBQWUsMkJBQTJCLEVBQUUsTUFBTSxVQUFVO0FBQ3JFLGlDQUE2QixTQUFTO0FBQ3RDLG9CQUFnQiwyQkFBMkI7QUFDM0MsY0FBVSwyQkFBMkI7QUFBQSxFQUN2QztBQUVBLFdBQVMsMEJBQTBCO0FBQ2pDLGFBQVMsZUFBZSwyQkFBMkIsRUFBRSxNQUFNLFVBQVU7QUFDckUsaUJBQWE7QUFBQSxFQUNmO0FBRUEsaUJBQWUsMEJBQTBCO0FBQ3ZDLFVBQU0sTUFBTyxTQUFTLFNBQVMsZUFBZSxnQkFBZ0IsRUFBRSxPQUFPLEVBQUU7QUFDekUsVUFBTSxPQUFPLFNBQVMsZUFBZSxpQkFBaUIsRUFBRSxNQUFNLEtBQUs7QUFDbkUsUUFBSSxDQUFDLE1BQU07QUFDVCxxQkFBZSwyQkFBaUIsaUNBQWlDO0FBQ2pFO0FBQUEsSUFDRjtBQUNBLFVBQU0sU0FBUyxPQUFPLElBQUksV0FBVztBQUNyQyxVQUFNLE9BQU87QUFBQSxNQUNYO0FBQUEsTUFBUTtBQUFBLE1BQ1IsUUFBUSxTQUFTLGVBQWUsbUJBQW1CLEVBQUUsTUFBTSxLQUFLO0FBQUEsTUFDaEUsTUFBUSxTQUFTLFNBQVMsZUFBZSxpQkFBaUIsRUFBRSxPQUFPLEVBQUUsS0FBSztBQUFBLE1BQzFFLEdBQUksV0FBVyxXQUFXLEVBQUUsSUFBSSxJQUFJLENBQUM7QUFBQSxJQUN2QztBQUNBLFFBQUk7QUFDRixZQUFNLE1BQU8sTUFBTSxNQUFNLGtDQUFrQztBQUFBLFFBQ3pELFFBQVE7QUFBQSxRQUFRLFNBQVMsRUFBRSxnQkFBZ0IsbUJBQW1CO0FBQUEsUUFBRyxNQUFNLEtBQUssVUFBVSxJQUFJO0FBQUEsTUFDNUYsQ0FBQztBQUNELFlBQU0sT0FBTyxNQUFNLElBQUksS0FBSztBQUM1QixVQUFJLEtBQUssSUFBSTtBQUNYLGdDQUF3QjtBQUN4QiwrQkFBdUIsa0JBQWtCLEtBQUssVUFBVSxTQUFTO0FBQ2pFLHVCQUFlLGdCQUFXLGtCQUFrQixJQUFJLEtBQUssS0FBSyxNQUFNLEdBQUc7QUFDbkUsY0FBTUEsbUJBQWtCO0FBQUEsTUFDMUIsT0FBTztBQUNMLHVCQUFlLGdCQUFXLEtBQUssU0FBUyxhQUFhO0FBQUEsTUFDdkQ7QUFBQSxJQUNGLFNBQVMsR0FBRztBQUNWLHFCQUFlLGdCQUFXLDhCQUE4QjtBQUFBLElBQzFEO0FBQUEsRUFDRjtBQUVBLGlCQUFlLDBCQUEwQixLQUFLLE1BQU07QUFDbEQ7QUFBQSxNQUNFO0FBQUEsTUFDQSxXQUFXLElBQUk7QUFBQSxNQUNmLFlBQVk7QUFDVixZQUFJO0FBQ0YsZ0JBQU0sTUFBTyxNQUFNLE1BQU0sa0NBQWtDO0FBQUEsWUFDekQsUUFBUTtBQUFBLFlBQVEsU0FBUyxFQUFFLGdCQUFnQixtQkFBbUI7QUFBQSxZQUM5RCxNQUFNLEtBQUssVUFBVSxFQUFFLFFBQVEsVUFBVSxJQUFJLENBQUM7QUFBQSxVQUNoRCxDQUFDO0FBQ0QsZ0JBQU0sT0FBTyxNQUFNLElBQUksS0FBSztBQUM1QixjQUFJLEtBQUssSUFBSTtBQUNYLG1DQUF1QixrQkFBa0IsS0FBSyxVQUFVLFNBQVM7QUFDakUsMkJBQWUsa0JBQWEsd0JBQXdCO0FBQ3BELGtCQUFNQSxtQkFBa0I7QUFBQSxVQUMxQixPQUFPO0FBQ0wsMkJBQWUsZ0JBQVcsS0FBSyxTQUFTLGVBQWU7QUFBQSxVQUN6RDtBQUFBLFFBQ0YsU0FBUyxHQUFHO0FBQ1YseUJBQWUsZ0JBQVcsZ0NBQWdDO0FBQUEsUUFDNUQ7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFJQSxpQkFBZSx5QkFBeUI7QUFDdEMsVUFBTSxVQUFVLFNBQVMsY0FBYyxLQUFLO0FBQzVDLFlBQVEsS0FBSztBQUNiLFlBQVEsTUFBTSxVQUFVO0FBQ3hCLFlBQVEsWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWFwQixhQUFTLEtBQUssWUFBWSxPQUFPO0FBQ2pDLFFBQUksT0FBTyxjQUFjLFdBQVksV0FBVSx3QkFBd0I7QUFDdkUsVUFBTSxRQUFRLE1BQU07QUFBRSxjQUFRLE9BQU87QUFBRyxVQUFJLE9BQU8saUJBQWlCLFdBQVksY0FBYTtBQUFBLElBQUc7QUFDaEcsYUFBUyxlQUFlLG9CQUFvQixFQUFFLGlCQUFpQixTQUFTLEtBQUs7QUFDN0UsWUFBUSxpQkFBaUIsU0FBUyxPQUFLO0FBQUUsVUFBSSxFQUFFLFdBQVcsUUFBUyxPQUFNO0FBQUEsSUFBRyxDQUFDO0FBQzdFLFlBQVEsaUJBQWlCLFdBQVcsT0FBSztBQUFFLFVBQUksRUFBRSxRQUFRLFNBQVUsT0FBTTtBQUFBLElBQUcsQ0FBQztBQUU3RSxRQUFJO0FBQ0YsWUFBTSxNQUFNLE1BQU0sTUFBTSwwQkFBMEI7QUFDbEQsWUFBTSxPQUFPLE1BQU0sSUFBSSxLQUFLO0FBQzVCLFlBQU0sT0FBTyxTQUFTLGVBQWUsa0JBQWtCO0FBQ3ZELFVBQUksQ0FBQyxLQUFNO0FBQ1gsVUFBSSxDQUFDLEtBQUssTUFBTSxDQUFDLEtBQUssV0FBVyxRQUFRO0FBQ3ZDLGFBQUssY0FBYztBQUNuQjtBQUFBLE1BQ0Y7QUFDQSxZQUFNLE9BQU8sS0FBSyxVQUFVLElBQUksT0FBSztBQUNuQyxjQUFNLEtBQUssSUFBSSxLQUFLLEVBQUUsUUFBUSxHQUFJLEVBQUUsZUFBZTtBQUNuRCxjQUFNLE1BQU0sRUFBRSxPQUFPLE1BQU0sUUFBUSxDQUFDO0FBQ3BDLGVBQU87QUFBQSxxREFDd0MsV0FBVyxFQUFFLENBQUM7QUFBQSx3RUFDSyxFQUFFO0FBQUE7QUFBQTtBQUFBLHFDQUdyQyxLQUFLLFVBQVUsRUFBRSxRQUFRLENBQUM7QUFBQTtBQUFBO0FBQUEsTUFHM0QsQ0FBQyxFQUFFLEtBQUssRUFBRTtBQUNWLFdBQUssWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxlQU1OLElBQUk7QUFBQTtBQUFBLElBRWpCLFNBQVNPLElBQUc7QUFDVixZQUFNLE9BQU8sU0FBUyxlQUFlLGtCQUFrQjtBQUN2RCxVQUFJLEtBQU0sTUFBSyxjQUFjO0FBQUEsSUFDL0I7QUFBQSxFQUNGO0FBRUEsaUJBQWUsY0FBYyxVQUFVO0FBQ3JDLFVBQU0sWUFBWSxPQUFPLE9BQU8sa0JBQWtCLGFBQzlDLGNBQWMsK0VBQStFLElBQzdGLFFBQVEsUUFBUSxPQUFPLFFBQVEsK0VBQStFLENBQUM7QUFDbkgsUUFBSSxDQUFDLFVBQVc7QUFDaEIsUUFBSTtBQUNGLFlBQU0sTUFBTSxNQUFNLE1BQU0sNEJBQTRCO0FBQUEsUUFDbEQsUUFBUTtBQUFBLFFBQ1IsU0FBUyxFQUFFLGdCQUFnQixtQkFBbUI7QUFBQSxRQUM5QyxNQUFNLEtBQUssVUFBVSxFQUFFLFNBQVMsQ0FBQztBQUFBLE1BQ25DLENBQUM7QUFDRCxZQUFNLE9BQU8sTUFBTSxJQUFJLEtBQUs7QUFDNUIsVUFBSSxLQUFLLElBQUk7QUFDWCxpQkFBUyxlQUFlLHdCQUF3QixHQUFHLE9BQU87QUFDMUQsWUFBSSxPQUFPLGlCQUFpQixXQUFZLGNBQWE7QUFDckQsdUJBQWUsbUJBQWMseUVBQXlFO0FBQUEsTUFDeEcsT0FBTztBQUNMLHVCQUFlLGdCQUFXLEtBQUssU0FBUyxpQkFBaUI7QUFBQSxNQUMzRDtBQUFBLElBQ0YsU0FBU0EsSUFBRztBQUNWLHFCQUFlLGdCQUFXLDJCQUEyQjtBQUFBLElBQ3ZEO0FBQUEsRUFDRjtBQVVBLGlCQUFlTCx3QkFBdUI7QUFDcEMsUUFBSTtBQUNGLFlBQU0sTUFBTSxNQUFNLE1BQU0sMEJBQTBCO0FBQ2xELFlBQU0sT0FBTyxNQUFNLElBQUksS0FBSztBQUM1QixVQUFJLENBQUMsS0FBSyxNQUFNLENBQUMsS0FBSyxXQUFXLFFBQVE7QUFDdkMsdUJBQWUsZ0NBQXNCLHdDQUF3QztBQUM3RTtBQUFBLE1BQ0Y7QUFDQSxZQUFNLGFBQWEsS0FBSyxVQUFVLENBQUM7QUFDbkMsWUFBTSxPQUFPLElBQUksS0FBSyxXQUFXLFFBQVEsR0FBSSxFQUFFLGVBQWU7QUFDOUQsWUFBTSxZQUFZLE9BQU8sT0FBTyxrQkFBa0IsYUFDOUMsY0FBYyxnRUFBZ0UsSUFBSSw0REFBNEQsSUFDOUksUUFBUSxRQUFRLE9BQU8sUUFBUSxnRUFBZ0UsSUFBSSxHQUFHLENBQUM7QUFDM0csVUFBSSxDQUFDLFVBQVc7QUFFaEIsWUFBTSxhQUFhLE1BQU0sTUFBTSw0QkFBNEI7QUFBQSxRQUN6RCxRQUFRO0FBQUEsUUFDUixTQUFTLEVBQUUsZ0JBQWdCLG1CQUFtQjtBQUFBLFFBQzlDLE1BQU0sS0FBSyxVQUFVLEVBQUUsVUFBVSxXQUFXLFNBQVMsQ0FBQztBQUFBLE1BQ3hELENBQUM7QUFDRCxZQUFNLGNBQWMsTUFBTSxXQUFXLEtBQUs7QUFDMUMsVUFBSSxZQUFZLElBQUk7QUFHbEIsOEJBQXNCLFlBQVksaUJBQWlCO0FBQ25ELHFDQUE2QjtBQUM3QixjQUFNRixtQkFBa0I7QUFDeEIsdUJBQWUsaUJBQVksbURBQW1EO0FBQUEsTUFDaEYsT0FBTztBQUNMLHVCQUFlLGdCQUFXLFlBQVksU0FBUyxjQUFjO0FBQUEsTUFDL0Q7QUFBQSxJQUNGLFNBQVNPLElBQUc7QUFDVixxQkFBZSxnQkFBVyxpQkFBaUI7QUFBQSxJQUM3QztBQUFBLEVBQ0Y7QUFFQSxpQkFBZU4sd0JBQXVCO0FBQ3BDLFFBQUksQ0FBQyxxQkFBcUI7QUFDeEIscUJBQWUsZ0NBQXNCLHVDQUF1QztBQUM1RTtBQUFBLElBQ0Y7QUFDQSxRQUFJO0FBQ0YsWUFBTSxNQUFNLE1BQU0sTUFBTSw0QkFBNEI7QUFBQSxRQUNsRCxRQUFRO0FBQUEsUUFDUixTQUFTLEVBQUUsZ0JBQWdCLG1CQUFtQjtBQUFBLFFBQzlDLE1BQU0sS0FBSyxVQUFVLEVBQUUsVUFBVSxvQkFBb0IsQ0FBQztBQUFBLE1BQ3hELENBQUM7QUFDRCxZQUFNLE9BQU8sTUFBTSxJQUFJLEtBQUs7QUFDNUIsVUFBSSxLQUFLLElBQUk7QUFHWCxjQUFNRCxtQkFBa0I7QUFDeEIsdUJBQWUsaUJBQVksb0RBQW9EO0FBQUEsTUFDakYsT0FBTztBQUNMLHVCQUFlLGdCQUFXLEtBQUssU0FBUyxjQUFjO0FBQUEsTUFDeEQ7QUFBQSxJQUNGLFNBQVNPLElBQUc7QUFDVixxQkFBZSxnQkFBVyxpQkFBaUI7QUFBQSxJQUM3QztBQUFBLEVBQ0Y7QUFFQSxpQkFBZSxpQkFBaUI7QUFDOUIsUUFBSTtBQUNGLFlBQU1DLGFBQVksT0FBTztBQUN6QixZQUFNLE1BQU0sMEJBQTBCQSxhQUFZLGVBQWVBLFVBQVMsS0FBSyxFQUFFO0FBQ2pGLFlBQU0sTUFBTSxNQUFNLE1BQU0sR0FBRztBQUMzQixVQUFJLENBQUMsSUFBSSxJQUFJO0FBQ1gsdUJBQWUsZ0JBQVcsZUFBZTtBQUN6QztBQUFBLE1BQ0Y7QUFDQSxZQUFNLE9BQU8sTUFBTSxJQUFJLEtBQUs7QUFDNUIsWUFBTSxJQUFJLFNBQVMsY0FBYyxHQUFHO0FBQ3BDLFFBQUUsT0FBTyxJQUFJLGdCQUFnQixJQUFJO0FBQ2pDLFFBQUUsV0FBVztBQUNiLFFBQUUsTUFBTTtBQUNSLFVBQUksZ0JBQWdCLEVBQUUsSUFBSTtBQUFBLElBQzVCLFNBQVMsR0FBRztBQUNWLHFCQUFlLGdCQUFXLDRCQUE0QjtBQUFBLElBQ3hEO0FBQUEsRUFDRjtBQUlBLGlCQUFlLDJCQUEyQjtBQUN4QyxVQUFNLFVBQVUsU0FBUyxjQUFjLEtBQUs7QUFDNUMsWUFBUSxLQUFLO0FBQ2IsWUFBUSxNQUFNLFVBQVU7QUFDeEIsWUFBUSxZQUFZO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBYXBCLGFBQVMsS0FBSyxZQUFZLE9BQU87QUFDakMsUUFBSSxPQUFPLGNBQWMsV0FBWSxXQUFVLDJCQUEyQjtBQUMxRSxVQUFNLFFBQVEsTUFBTTtBQUFFLGNBQVEsT0FBTztBQUFHLFVBQUksT0FBTyxpQkFBaUIsV0FBWSxjQUFhO0FBQUEsSUFBRztBQUNoRyxhQUFTLGVBQWUseUJBQXlCLEVBQUUsaUJBQWlCLFNBQVMsS0FBSztBQUNsRixZQUFRLGlCQUFpQixTQUFTLENBQUMsTUFBTTtBQUFFLFVBQUksRUFBRSxXQUFXLFFBQVMsT0FBTTtBQUFBLElBQUcsQ0FBQztBQUMvRSxZQUFRLGlCQUFpQixXQUFXLENBQUMsTUFBTTtBQUFFLFVBQUksRUFBRSxRQUFRLFNBQVUsT0FBTTtBQUFBLElBQUcsQ0FBQztBQUUvRSxRQUFJO0FBQ0YsWUFBTSxNQUFNLE1BQU0sTUFBTSx1QkFBdUI7QUFDL0MsWUFBTSxPQUFPLE1BQU0sSUFBSSxLQUFLO0FBQzVCLFlBQU0sT0FBTyxTQUFTLGVBQWUsd0JBQXdCO0FBQzdELFVBQUksS0FBTSxNQUFLLGNBQWMsS0FBSyxVQUFVLE1BQU0sTUFBTSxDQUFDO0FBQUEsSUFDM0QsU0FBU0QsSUFBRztBQUNWLFlBQU0sT0FBTyxTQUFTLGVBQWUsd0JBQXdCO0FBQzdELFVBQUksS0FBTSxNQUFLLGNBQWM7QUFBQSxJQUMvQjtBQUFBLEVBQ0Y7QUFVQSxNQUFJLHNCQUFzQjtBQUUxQixXQUFTLHdCQUF3QjtBQUMvQixhQUFTLGVBQWUsNkJBQTZCLEdBQUcsTUFBTTtBQUFBLEVBQ2hFO0FBRUEsV0FBUyx5QkFBeUJFLFFBQU87QUFDdkMsVUFBTSxPQUFPQSxPQUFNLFFBQVEsUUFBUSxDQUFDO0FBQ3BDLElBQUFBLE9BQU0sT0FBTyxRQUFRO0FBQ3JCLFFBQUksQ0FBQyxLQUFNO0FBQ1gsVUFBTSxTQUFTLElBQUksV0FBVztBQUM5QixXQUFPLFNBQVMsWUFBWTtBQUMxQixVQUFJO0FBQ0osVUFBSTtBQUNGLGlCQUFTLEtBQUssTUFBTSxPQUFPLE9BQU8sTUFBTSxDQUFDO0FBQUEsTUFDM0MsU0FBU0YsSUFBRztBQUNWLHVCQUFlLGdCQUFXLDhCQUE4QjtBQUN4RDtBQUFBLE1BQ0Y7QUFDQSxVQUFJLENBQUMsVUFBVSxPQUFPLFdBQVcsWUFBWSxNQUFNLFFBQVEsTUFBTSxHQUFHO0FBQ2xFLHVCQUFlLGdCQUFXLDZFQUE2RTtBQUN2RztBQUFBLE1BQ0Y7QUFDQSxZQUFNLDZCQUE2QixNQUFNO0FBQUEsSUFDM0M7QUFDQSxXQUFPLFVBQVUsTUFBTSxlQUFlLGdCQUFXLG1DQUFtQztBQUNwRixXQUFPLFdBQVcsSUFBSTtBQUFBLEVBQ3hCO0FBRUEsaUJBQWUsNkJBQTZCLFFBQVE7QUFDbEQsUUFBSTtBQUNGLFlBQU0sTUFBTSxNQUFNLE1BQU0sbUNBQW1DO0FBQUEsUUFDekQsUUFBUTtBQUFBLFFBQVEsU0FBUyxFQUFFLGdCQUFnQixtQkFBbUI7QUFBQSxRQUM5RCxNQUFNLEtBQUssVUFBVSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQUEsTUFDdkMsQ0FBQztBQUNELFlBQU0sT0FBTyxNQUFNLElBQUksS0FBSztBQUM1QixVQUFJLENBQUMsS0FBSyxJQUFJO0FBQ1osY0FBTSxVQUFVLEtBQUsscUJBQXFCLENBQUMsR0FBRyxLQUFLLElBQUk7QUFDdkQsdUJBQWUsZ0JBQVcsU0FBUyxHQUFHLEtBQUssS0FBSyxLQUFLLE1BQU0sS0FBTSxLQUFLLFNBQVMsd0JBQXlCO0FBQ3hHO0FBQUEsTUFDRjtBQUNBLDRCQUFzQjtBQUN0QixzQ0FBZ0MsS0FBSyxZQUFZLENBQUMsQ0FBQztBQUFBLElBQ3JELFNBQVNBLElBQUc7QUFDVixxQkFBZSxnQkFBVywrQkFBK0I7QUFBQSxJQUMzRDtBQUFBLEVBQ0Y7QUFFQSxXQUFTLGdDQUFnQyxVQUFVO0FBQ2pELFVBQU0sVUFBVSxTQUFTLGNBQWMsS0FBSztBQUM1QyxZQUFRLEtBQUs7QUFDYixZQUFRLE1BQU0sVUFBVTtBQUN4QixVQUFNLGtCQUFrQixTQUFTLE9BQU8sQ0FBQyxNQUFNLEVBQUUsT0FBTztBQUN4RCxVQUFNLE9BQU8sU0FBUyxJQUFJLENBQUMsTUFBTTtBQUFBLGlCQUNsQixFQUFFLFVBQVUsOENBQThDLEVBQUU7QUFBQSxtREFDMUIsV0FBVyxFQUFFLE9BQU8sQ0FBQztBQUFBLHFFQUNILEVBQUUsYUFBYTtBQUFBLHFFQUNmLEVBQUUsU0FBUztBQUFBLHFDQUMzQyxFQUFFLFVBQVUsbUJBQWMsUUFBRztBQUFBLFVBQ3hELEVBQUUsS0FBSyxFQUFFO0FBQ2pCLFlBQVEsWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFVBVVosZ0JBQWdCLFNBQVMsR0FBRyxnQkFBZ0IsTUFBTSw4QkFBOEIsNkVBQXdFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGlCQVNqSixJQUFJO0FBQUE7QUFBQTtBQUFBO0FBQUEsMEVBSXFELGdCQUFnQixTQUFTLEtBQUssV0FBVztBQUFBO0FBQUE7QUFHakgsYUFBUyxLQUFLLFlBQVksT0FBTztBQUNqQyxRQUFJLE9BQU8sY0FBYyxXQUFZLFdBQVUsMEJBQTBCO0FBQ3pFLFVBQU0sUUFBUSxNQUFNO0FBQUUsY0FBUSxPQUFPO0FBQUcsNEJBQXNCO0FBQU0sVUFBSSxPQUFPLGlCQUFpQixXQUFZLGNBQWE7QUFBQSxJQUFHO0FBQzVILGFBQVMsZUFBZSx5QkFBeUIsRUFBRSxpQkFBaUIsU0FBUyxLQUFLO0FBQ2xGLFlBQVEsaUJBQWlCLFdBQVcsQ0FBQyxNQUFNO0FBQUUsVUFBSSxFQUFFLFFBQVEsU0FBVSxPQUFNO0FBQUEsSUFBRyxDQUFDO0FBQy9FLGFBQVMsZUFBZSwwQkFBMEIsRUFBRSxpQkFBaUIsU0FBUyxNQUFNLHNCQUFzQixDQUFDO0FBQUEsRUFDN0c7QUFFQSxpQkFBZSx3QkFBd0I7QUFDckMsUUFBSSxDQUFDLG9CQUFxQjtBQUMxQixRQUFJO0FBQ0YsWUFBTSxNQUFNLE1BQU0sTUFBTSxtQ0FBbUM7QUFBQSxRQUN6RCxRQUFRO0FBQUEsUUFBUSxTQUFTLEVBQUUsZ0JBQWdCLG1CQUFtQjtBQUFBLFFBQzlELE1BQU0sS0FBSyxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUFBLE1BQ3BELENBQUM7QUFDRCxZQUFNLE9BQU8sTUFBTSxJQUFJLEtBQUs7QUFDNUIsZUFBUyxlQUFlLDBCQUEwQixHQUFHLE9BQU87QUFDNUQsNEJBQXNCO0FBQ3RCLFVBQUksT0FBTyxpQkFBaUIsV0FBWSxjQUFhO0FBQ3JELFVBQUksS0FBSyxJQUFJO0FBQ1gsK0JBQXVCLGtCQUFrQixVQUFVO0FBQ25EO0FBQUEsVUFDRTtBQUFBLFVBQ0EsMkJBQTJCLEtBQUssY0FBYyxZQUFZLEtBQUssWUFBWSxNQUFNLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxHQUFHLEtBQUssWUFBWSxrQkFBa0IsS0FBSyxTQUFTLE1BQU0sRUFBRTtBQUFBLFFBQzdKO0FBQ0EsY0FBTVAsbUJBQWtCO0FBQUEsTUFDMUIsT0FBTztBQUNMLGNBQU0sVUFBVSxLQUFLLHFCQUFxQixDQUFDLEdBQUcsS0FBSyxJQUFJO0FBQ3ZELHVCQUFlLGdCQUFXLFNBQVMsR0FBRyxLQUFLLEtBQUssS0FBSyxNQUFNLEtBQU0sS0FBSyxTQUFTLGdCQUFpQjtBQUFBLE1BQ2xHO0FBQUEsSUFDRixTQUFTTyxJQUFHO0FBQ1YscUJBQWUsZ0JBQVcsa0NBQWtDO0FBQUEsSUFDOUQ7QUFBQSxFQUNGO0FBSUEsaUJBQWUsd0JBQXdCLElBQUksT0FBTztBQUNoRDtBQUFBLE1BQ0U7QUFBQSxNQUNBLFdBQVcsS0FBSztBQUFBLE1BQ2hCLFlBQVk7QUFDVixZQUFJO0FBQ0YsZ0JBQU0sTUFBTyxNQUFNLE1BQU0sdUNBQXVDO0FBQUEsWUFDOUQsUUFBUTtBQUFBLFlBQVEsU0FBUyxFQUFFLGdCQUFnQixtQkFBbUI7QUFBQSxZQUM5RCxNQUFNLEtBQUssVUFBVSxFQUFFLFFBQVEsVUFBVSxHQUFHLENBQUM7QUFBQSxVQUMvQyxDQUFDO0FBQ0QsZ0JBQU0sT0FBTyxNQUFNLElBQUksS0FBSztBQUM1QixjQUFJLEtBQUssSUFBSTtBQUNYLG1DQUF1Qix5QkFBeUIsS0FBSyxVQUFVLFNBQVM7QUFDeEUsMkJBQWUsa0JBQWEsc0JBQXNCO0FBQ2xELGtCQUFNUCxtQkFBa0I7QUFBQSxVQUMxQixPQUFPO0FBQ0wsMkJBQWUsZ0JBQVcsS0FBSyxTQUFTLGVBQWU7QUFBQSxVQUN6RDtBQUFBLFFBQ0YsU0FBUyxHQUFHO0FBQ1YseUJBQWUsZ0JBQVcsOEJBQThCO0FBQUEsUUFDMUQ7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFFQSxpQkFBZSxvQkFBb0IsS0FBSztBQUN0QztBQUFBLE1BQ0U7QUFBQSxNQUNBLDJCQUEyQixHQUFHO0FBQUEsTUFDOUIsWUFBWTtBQUNWLFlBQUk7QUFDRixnQkFBTSxNQUFPLE1BQU0sTUFBTSxtQ0FBbUM7QUFBQSxZQUMxRCxRQUFRO0FBQUEsWUFBUSxTQUFTLEVBQUUsZ0JBQWdCLG1CQUFtQjtBQUFBLFlBQzlELE1BQU0sS0FBSyxVQUFVLEVBQUUsUUFBUSxVQUFVLElBQUksQ0FBQztBQUFBLFVBQ2hELENBQUM7QUFDRCxnQkFBTSxPQUFPLE1BQU0sSUFBSSxLQUFLO0FBQzVCLGNBQUksS0FBSyxJQUFJO0FBQ1gsbUNBQXVCLDBCQUEwQixLQUFLLFVBQVUsU0FBUztBQUN6RSwyQkFBZSxrQkFBYSxZQUFZLEdBQUcsWUFBWTtBQUN2RCxrQkFBTUEsbUJBQWtCO0FBQUEsVUFDMUIsT0FBTztBQUNMLDJCQUFlLGdCQUFXLEtBQUssU0FBUyxlQUFlO0FBQUEsVUFDekQ7QUFBQSxRQUNGLFNBQVMsR0FBRztBQUNWLHlCQUFlLGdCQUFXLDBCQUEwQjtBQUFBLFFBQ3REO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsV0FBU0QscUJBQW9CO0FBQzNCLFVBQU0sVUFBVSxTQUFTLGVBQWUseUJBQXlCO0FBQ2pFLFFBQUksQ0FBQyxRQUFTO0FBQ2QsaUNBQTZCLFNBQVM7QUFDdEMsWUFBUSxNQUFNLFVBQVU7QUFDeEIsYUFBUyxLQUFLLE1BQU0sV0FBVztBQUMvQixVQUFNLFlBQVksU0FBUyxlQUFlLHNCQUFzQjtBQUNoRSxJQUFBQyxtQkFBa0IsU0FBUztBQUMzQixvQkFBZ0IseUJBQXlCO0FBQ3pDLGNBQVUseUJBQXlCO0FBQUEsRUFDckM7QUFFQSxXQUFTLHFCQUFxQjtBQUM1QixVQUFNLFVBQVUsU0FBUyxlQUFlLHlCQUF5QjtBQUNqRSxRQUFJLFFBQVMsU0FBUSxNQUFNLFVBQVU7QUFDckMsK0JBQTJCO0FBQzNCLGFBQVMsS0FBSyxNQUFNLFdBQVc7QUFDL0IsaUJBQWE7QUFBQSxFQUNmOzs7QUN4OEZBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLG9DQUFBVTtBQUFBLElBQUE7QUFBQTtBQUFBLGtDQUFBQztBQUFBLElBQUE7QUFBQTtBQWtCQSxNQUFNLHFCQUFxQjtBQUFBLElBQ3pCLEVBQUUsT0FBTyxnQkFBa0IsT0FBTyxpQkFBb0I7QUFBQSxJQUN0RCxFQUFFLE9BQU8sa0JBQWtCLE9BQU8sbUJBQW9CO0FBQUEsSUFDdEQsRUFBRSxPQUFPLFlBQWtCLE9BQU8sV0FBcUI7QUFBQSxJQUN2RCxFQUFFLE9BQU8sYUFBa0IsT0FBTyxxQkFBcUI7QUFBQSxJQUN2RCxFQUFFLE9BQU8sY0FBa0IsT0FBTyxvQkFBcUI7QUFBQSxFQUN6RDtBQUVBLE1BQU0sd0JBQXdCO0FBQUEsSUFDNUIsRUFBRSxPQUFPLFVBQWEsT0FBTyxvREFBcUM7QUFBQSxJQUNsRSxFQUFFLE9BQU8sUUFBYSxPQUFPLGtEQUE2QztBQUFBLElBQzFFLEVBQUUsT0FBTyxhQUFhLE9BQU8sK0NBQTBDO0FBQUEsRUFDekU7QUFFQSxNQUFJLDRCQUE0QixDQUFDO0FBR2pDLE1BQUksd0JBQXdCO0FBQUEsSUFDMUIsTUFBZ0I7QUFBQSxJQUNoQixjQUFnQjtBQUFBLElBQ2hCLGVBQWdCO0FBQUEsSUFDaEIsZ0JBQWdCO0FBQUEsSUFDaEIsV0FBZ0I7QUFBQSxJQUNoQixnQkFBZ0I7QUFBQSxJQUNoQixZQUFnQjtBQUFBLElBQ2hCLGVBQWdCO0FBQUEsRUFDbEI7QUFJQSxpQkFBZUMsMEJBQXlCO0FBQ3RDLFVBQU0sVUFBVSxTQUFTLGVBQWUsa0JBQWtCO0FBQzFELFlBQVEsWUFBWTtBQUdwQixRQUFJO0FBQ0YsWUFBTSxNQUFPLE1BQU0sTUFBTSx5QkFBeUI7QUFDbEQsWUFBTSxPQUFPLE1BQU0sSUFBSSxLQUFLO0FBQzVCLGtDQUE2QixLQUFLLFlBQVksQ0FBQztBQUFBLElBQ2pELFNBQVNDLElBQUc7QUFDVixrQ0FBNEIsQ0FBQztBQUFBLElBQy9CO0FBRUEsVUFBTSxjQUFjLG1CQUFtQjtBQUFBLE1BQUksT0FDekMsa0JBQWtCLEVBQUUsS0FBSyxLQUFLLFdBQVcsRUFBRSxLQUFLLENBQUM7QUFBQSxJQUNuRCxFQUFFLEtBQUssRUFBRTtBQUVULFVBQU0saUJBQWlCLHNCQUFzQjtBQUFBLE1BQUksT0FDL0Msa0JBQWtCLEVBQUUsS0FBSyxLQUFLLFdBQVcsRUFBRSxLQUFLLENBQUM7QUFBQSxJQUNuRCxFQUFFLEtBQUssRUFBRTtBQUVULFVBQU0sZUFBZSwwQkFBMEIsU0FBUztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFVBT2hELDBCQUEwQixJQUFJLENBQUMsR0FBRyxNQUFNO0FBQUEsb0RBQ0UsQ0FBQztBQUFBO0FBQUEsMkRBRU0sQ0FBQztBQUFBO0FBQUEsMEJBRWxDLFdBQVcsRUFBRSxRQUFRLE1BQU0sQ0FBQyxPQUFPLFdBQVcsRUFBRSxXQUFXLFNBQVMsQ0FBQztBQUFBLGdGQUNmLFdBQVcsRUFBRSxRQUFRLEVBQUUsQ0FBQztBQUFBLGtCQUN0RixFQUFFLE9BQU8sK0JBQStCLFdBQVcsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFO0FBQUEsNEVBQ2QsWUFBWSxFQUFFLFdBQVcsSUFBSSxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFBQTtBQUFBO0FBQUEsaUJBR3RHLEVBQUUsS0FBSyxFQUFFLENBQUM7QUFBQTtBQUFBLGNBRWI7QUFFWixZQUFRLFlBQVk7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQU9oQixZQUFZO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsMkRBT3lDLFdBQVc7QUFBQTtBQUFBO0FBQUE7QUFBQSw2REFJVCxjQUFjO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUEwRHpFLGlDQUE2QjtBQUFBLEVBQy9CO0FBSUEsV0FBUywrQkFBK0I7QUFDdEMsVUFBTSxTQUFZLFNBQVMsZUFBZSxnQkFBZ0I7QUFDMUQsVUFBTSxZQUFZLFNBQVMsZUFBZSxrQkFBa0I7QUFDNUQsVUFBTSxPQUFZLFNBQVMsZUFBZSxtQkFBbUI7QUFDN0QsVUFBTSxTQUFZLFNBQVMsZUFBZSxvQkFBb0I7QUFDOUQsVUFBTSxPQUFZLFNBQVMsZUFBZSxjQUFjO0FBQ3hELFVBQU0sUUFBWSxTQUFTLGVBQWUsb0JBQW9CO0FBQzlELFVBQU0sV0FBWSxTQUFTLGVBQWUsbUJBQW1CO0FBQzdELFVBQU0sV0FBWSxTQUFTLGVBQWUsb0JBQW9CO0FBRTlELFFBQUksVUFBVSxzQkFBc0I7QUFDbEMsYUFBTyxRQUFRLHNCQUFzQjtBQUN2QyxRQUFJLGFBQWEsc0JBQXNCO0FBQ3JDLGdCQUFVLFFBQVEsc0JBQXNCO0FBQzFDLFFBQUksUUFBUSxzQkFBc0I7QUFDaEMsV0FBSyxRQUFRLHNCQUFzQjtBQUNyQyxRQUFJLFVBQVUsc0JBQXNCO0FBQ2xDLGFBQU8sUUFBUSxzQkFBc0I7QUFDdkMsUUFBSSxRQUFRLHNCQUFzQjtBQUNoQyxXQUFLLFFBQVEsc0JBQXNCO0FBQ3JDLFFBQUksU0FBUyxzQkFBc0I7QUFDakMsWUFBTSxRQUFRLHNCQUFzQjtBQUV0QyxRQUFJLHNCQUFzQixpQkFBaUIsc0JBQXNCLFlBQVk7QUFDM0UsVUFBSSxTQUFVLFVBQVMsTUFBTSxVQUFVO0FBQ3ZDLFVBQUksVUFBVTtBQUNaLGlCQUFTLFFBQVEsc0JBQXNCO0FBQ3ZDLDZCQUFxQixTQUFTLEtBQUs7QUFBQSxNQUNyQztBQUFBLElBQ0Y7QUFHQSxRQUFJLE9BQVcsUUFBTyxpQkFBaUIsVUFBWSxNQUFNO0FBQUUsNEJBQXNCLE9BQU8sT0FBTztBQUFBLElBQU8sQ0FBQztBQUN2RyxRQUFJLFVBQVcsV0FBVSxpQkFBaUIsVUFBVSxNQUFNO0FBQUUsNEJBQXNCLGVBQWUsVUFBVTtBQUFBLElBQU8sQ0FBQztBQUNuSCxRQUFJLEtBQVcsTUFBSyxpQkFBaUIsU0FBYyxNQUFNO0FBQUUsNEJBQXNCLGdCQUFnQixLQUFLO0FBQUEsSUFBTyxDQUFDO0FBQzlHLFFBQUksT0FBVyxRQUFPLGlCQUFpQixTQUFZLE1BQU07QUFBRSw0QkFBc0IsaUJBQWlCLE9BQU87QUFBQSxJQUFPLENBQUM7QUFDakgsUUFBSSxLQUFXLE1BQUssaUJBQWlCLFNBQWMsTUFBTTtBQUFFLDRCQUFzQixZQUFZLEtBQUs7QUFBQSxJQUFPLENBQUM7QUFDMUcsUUFBSSxNQUFXLE9BQU0saUJBQWlCLFNBQWEsTUFBTTtBQUFFLDRCQUFzQixpQkFBaUIsTUFBTTtBQUFBLElBQU8sQ0FBQztBQUFBLEVBQ2xIO0FBSUEsaUJBQWUsc0JBQXNCO0FBMkJuQyxVQUFNLE1BQU0sU0FBUyxlQUFlLGlCQUFpQjtBQUNyRCxRQUFJLFdBQVc7QUFDZixRQUFJLGNBQWM7QUFFbEIsVUFBTSxRQUFtQixTQUFTLGVBQWUsZ0JBQWdCLEtBQVUsQ0FBQyxHQUFHLFNBQVM7QUFDeEYsVUFBTSxpQkFBbUIsU0FBUyxlQUFlLGtCQUFrQixLQUFRLENBQUMsR0FBRyxTQUFTO0FBQ3hGLFVBQU0sa0JBQW1CLFNBQVMsZUFBZSxtQkFBbUIsS0FBTyxDQUFDLEdBQUcsU0FBUztBQUN4RixVQUFNLG1CQUFtQixTQUFTLGVBQWUsb0JBQW9CLEtBQU0sQ0FBQyxHQUFHLFNBQVM7QUFDeEYsVUFBTSxhQUFtQixTQUFTLGVBQWUsY0FBYyxLQUFhLENBQUMsR0FBRyxTQUFTO0FBQ3pGLFVBQU0sbUJBQW1CLFNBQVMsZUFBZSxvQkFBb0IsS0FBTSxDQUFDLEdBQUcsU0FBUztBQUd4RixRQUFJLGFBQWE7QUFDakIsVUFBTSxlQUFlLFNBQVMsY0FBYyxnQ0FBZ0M7QUFDNUUsUUFBSSxjQUFjO0FBQ2hCLFlBQU0sTUFBTSxTQUFTLGFBQWEsT0FBTyxFQUFFO0FBQzNDLG9CQUFjLDBCQUEwQixHQUFHLEtBQUssQ0FBQyxHQUFHLGFBQWE7QUFBQSxJQUNuRTtBQUVBLFFBQUk7QUFDRixZQUFNLE1BQU8sTUFBTSxNQUFNLDhCQUE4QjtBQUFBLFFBQ3JELFFBQVM7QUFBQSxRQUNULFNBQVMsRUFBRSxnQkFBZ0IsbUJBQW1CO0FBQUEsUUFDOUMsTUFBUyxLQUFLLFVBQVUsRUFBRSxNQUFNLGVBQWUsZ0JBQWdCLGlCQUFpQixXQUFXLGlCQUFpQixXQUFXLENBQUM7QUFBQSxNQUMxSCxDQUFDO0FBQ0QsWUFBTSxPQUFPLE1BQU0sSUFBSSxLQUFLO0FBRTVCLFVBQUksS0FBSyxJQUFJO0FBQ1gsY0FBTSxnQkFBZ0IsU0FBUyxlQUFlLG1CQUFtQjtBQUNqRSxjQUFNLFdBQWdCLFNBQVMsZUFBZSxvQkFBb0I7QUFDbEUsWUFBSSxjQUFlLGVBQWMsTUFBTSxVQUFVO0FBQ2pELFlBQUksVUFBVTtBQUNaLG1CQUFTLFFBQVEsS0FBSztBQUN0QiwrQkFBcUIsU0FBUyxLQUFLO0FBQUEsUUFDckM7QUFDQSw4QkFBc0IsYUFBZ0IsS0FBSztBQUMzQyw4QkFBc0IsZ0JBQWdCO0FBQUEsTUFDeEMsT0FBTztBQUNMLHVCQUFlLDRCQUF1QixLQUFLLFNBQVMsb0NBQW9DO0FBQUEsTUFDMUY7QUFBQSxJQUNGLFNBQVMsR0FBRztBQUNWLHFCQUFlLGdCQUFXLDJCQUEyQjtBQUFBLElBQ3ZELFVBQUU7QUFDQSxVQUFJLEtBQUs7QUFDUCxZQUFJLFdBQWM7QUFDbEIsWUFBSSxjQUFjO0FBQUEsTUFDcEI7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUlBLGlCQUFlLGtCQUFrQjtBQWdCL0IsVUFBTSxXQUFXLFNBQVMsZUFBZSxvQkFBb0I7QUFDN0QsUUFBSSxDQUFDLFNBQVU7QUFDZixVQUFNQyxRQUFPLFNBQVMsTUFBTSxLQUFLO0FBQ2pDLFFBQUksQ0FBQ0EsT0FBTTtBQUNULHFCQUFlLDZCQUFtQix1REFBdUQ7QUFDekY7QUFBQSxJQUNGO0FBRUEsVUFBTSxNQUFNLFNBQVMsZUFBZSxhQUFhO0FBQ2pELFFBQUksS0FBSztBQUFFLFVBQUksV0FBVztBQUFNLFVBQUksY0FBYztBQUFBLElBQWE7QUFFL0QsUUFBSTtBQUNGLFlBQU0sTUFBTyxNQUFNLE1BQU0sMEJBQTBCO0FBQUEsUUFDakQsUUFBUztBQUFBLFFBQ1QsU0FBUyxFQUFFLGdCQUFnQixtQkFBbUI7QUFBQSxRQUM5QyxNQUFTLEtBQUssVUFBVSxFQUFFLE1BQUFBLE1BQUssQ0FBQztBQUFBLE1BQ2xDLENBQUM7QUFDRCxZQUFNLE9BQU8sTUFBTSxJQUFJLEtBQUs7QUFFNUIsVUFBSSxLQUFLLElBQUk7QUFDWCx1QkFBZSxnQkFBVyxpQ0FBaUMsV0FBVyxLQUFLLFFBQVEsQ0FBQyx1Q0FBdUM7QUFBQSxNQUM3SCxPQUFPO0FBQ0wsdUJBQWUsc0JBQWlCLEtBQUssU0FBUyw4QkFBOEI7QUFBQSxNQUM5RTtBQUFBLElBQ0YsU0FBUyxHQUFHO0FBQ1YscUJBQWUsZ0JBQVcsMkJBQTJCO0FBQUEsSUFDdkQsVUFBRTtBQUNBLFVBQUksS0FBSztBQUFFLFlBQUksV0FBVztBQUFPLFlBQUksY0FBYztBQUFBLE1BQXdCO0FBQUEsSUFDN0U7QUFBQSxFQUNGO0FBU0EsV0FBU0MsMEJBQXlCLFlBQVk7QUFDNUMsVUFBTSxRQUFRLFNBQVMsZUFBZSxvQkFBb0I7QUFDMUQsUUFBSSxDQUFDLE1BQU87QUFFWixVQUFNLFdBQWMsV0FBVyxnQkFBZ0IsQ0FBQztBQUNoRCxVQUFNLFdBQWUsU0FBUyxXQUFZLElBQUksS0FBSztBQUNuRCxVQUFNLFlBQWUsU0FBUyxTQUFZLElBQUksS0FBSztBQUNuRCxVQUFNLGVBQWUsU0FBUyxnQkFBZ0IsQ0FBQyxHQUFHLE9BQU8sT0FBTyxFQUFFLE1BQU0sR0FBRyxDQUFDO0FBRzVFLFVBQU0sVUFBVUMsY0FBYSxXQUFXLElBQUksS0FBSztBQUNqRCxVQUFNLFNBQVMsT0FBTyxZQUFZLFdBQVcsVUFBVyxVQUFVLFFBQVEsS0FBSztBQUMvRSxVQUFNLFNBQVMsT0FBTyxRQUFRLFlBQVksR0FBRyxFQUFFLFFBQVEsUUFBUSxHQUFHLEVBQUUsWUFBWTtBQUdoRixVQUFNLE9BQVMsU0FBUyxlQUFlLG9CQUFvQjtBQUMzRCxVQUFNLFFBQVMsT0FBTyxLQUFLLFFBQVE7QUFDbkMsVUFBTSxTQUFTLE1BQU0sWUFBWTtBQUNqQyxVQUFNLFFBQVMsTUFBTSxLQUFLLEVBQUUsU0FBUztBQUVyQyxRQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxZQUFZLFFBQVE7QUFDaEQsWUFBTSxZQUFZO0FBQ2xCO0FBQUEsSUFDRjtBQUVBLFVBQU0sU0FBUyxDQUFDO0FBR2hCLFFBQUksU0FBUztBQUNYLFlBQU0sU0FBUyxRQUFRLFlBQVk7QUFDbkMsWUFBTSxPQUFTLE9BQU8sU0FBUyxNQUFNO0FBQ3JDLFlBQU0sT0FBUyxTQUFTLE9BQU8sU0FBUyxNQUFNO0FBQzlDLFlBQU0sVUFBVSxDQUFDO0FBQ2pCLFVBQUksQ0FBQyxLQUFlLFNBQVEsS0FBSyxJQUFJO0FBQ3JDLFVBQUksU0FBUyxDQUFDLEtBQU0sU0FBUSxLQUFLLGNBQWM7QUFDL0MsWUFBTSxTQUFTLFFBQVEsV0FBVyxJQUFJLFNBQVMsUUFBUSxTQUFTLEtBQUssUUFBUSxTQUFTO0FBQ3RGLGFBQU8sS0FBSztBQUFBLFFBQ1Y7QUFBQSxRQUNBLE9BQVE7QUFBQSxRQUNSLFFBQVEsV0FBVyxTQUNmLFNBQVMsV0FBVyxPQUFPLENBQUMsbUNBQzVCLFNBQVMsV0FBVyxPQUFPLENBQUMsd0JBQXdCLFFBQVEsS0FBSyxJQUFJLENBQUM7QUFBQSxNQUM1RSxDQUFDO0FBQUEsSUFDSDtBQUdBLFFBQUksVUFBVTtBQUNaLFlBQU0sVUFBWSxTQUFTLFlBQVk7QUFDdkMsWUFBTSxZQUFZLFFBQVEsUUFBUSxzREFBc0QsRUFBRTtBQUMxRixZQUFNLE9BQVksT0FBTyxTQUFTLE9BQU8sS0FBSyxPQUFPLFNBQVMsU0FBUztBQUN2RSxZQUFNLE9BQVksVUFBVSxPQUFPLFNBQVMsT0FBTyxLQUFLLE9BQU8sU0FBUyxTQUFTO0FBQ2pGLFlBQU0sVUFBWSxDQUFDO0FBQ25CLFVBQUksQ0FBQyxLQUFlLFNBQVEsS0FBSyxJQUFJO0FBQ3JDLFVBQUksU0FBUyxDQUFDLEtBQU0sU0FBUSxLQUFLLGNBQWM7QUFDL0MsWUFBTSxTQUFTLFFBQVEsV0FBVyxJQUFJLFNBQVMsUUFBUSxTQUFTLEtBQUssUUFBUSxTQUFTO0FBQ3RGLGFBQU8sS0FBSztBQUFBLFFBQ1Y7QUFBQSxRQUNBLE9BQVE7QUFBQSxRQUNSLFFBQVEsV0FBVyxTQUNmLFNBQVMsV0FBVyxRQUFRLENBQUMsbUNBQzdCLFNBQVMsV0FBVyxRQUFRLENBQUMsd0JBQXdCLFFBQVEsS0FBSyxJQUFJLENBQUM7QUFBQSxNQUM3RSxDQUFDO0FBQUEsSUFDSDtBQUdBLFFBQUksWUFBWSxRQUFRO0FBQ3RCLFlBQU0sWUFBWSxZQUFZLE9BQU8sUUFBTSxDQUFDLE9BQU8sU0FBUyxHQUFHLFlBQVksQ0FBQyxDQUFDO0FBQzdFLFlBQU0sWUFBWSxRQUFRLFlBQVksT0FBTyxRQUFNLENBQUMsT0FBTyxTQUFTLEdBQUcsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQzFGLFlBQU0sZ0JBQWUsb0JBQUksSUFBSSxDQUFDLEdBQUcsV0FBVyxHQUFHLFNBQVMsQ0FBQyxHQUFFO0FBQzNELFlBQU0sU0FBUyxpQkFBaUIsSUFBSSxTQUFTLGdCQUFnQixJQUFJLFNBQVM7QUFDMUUsWUFBTSxRQUFTLENBQUM7QUFDaEIsVUFBSSxVQUFVLE9BQVEsT0FBTSxLQUFLLG9CQUFvQixVQUFVLElBQUksQ0FBQUMsT0FBSyxPQUFPLFdBQVdBLEVBQUMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRTtBQUNqSCxVQUFJLFVBQVUsT0FBUSxPQUFNLEtBQUssOEJBQThCLFVBQVUsSUFBSSxDQUFBQSxPQUFLLE9BQU8sV0FBV0EsRUFBQyxDQUFDLE9BQU8sRUFBRSxLQUFLLElBQUksQ0FBQyxFQUFFO0FBQzNILGFBQU8sS0FBSztBQUFBLFFBQ1Y7QUFBQSxRQUNBLE9BQVEsaUJBQWlCLFlBQVksTUFBTTtBQUFBLFFBQzNDLFFBQVEsTUFBTSxTQUFTLE1BQU0sS0FBSyxJQUFJLElBQUksTUFBTSxPQUFPLFlBQVksTUFBTTtBQUFBLE1BQzNFLENBQUM7QUFBQSxJQUNIO0FBR0EsUUFBSSxRQUFRO0FBQ1YsWUFBTSxhQUFhLG9FQUFvRSxLQUFLLE1BQU07QUFDbEcsWUFBTSxTQUFhLGtCQUFrQixLQUFLLE1BQU07QUFDaEQsWUFBTSxXQUFhLHFCQUFxQixLQUFLLE1BQU07QUFDbkQsWUFBTSxjQUFjLENBQUMsWUFBWSxRQUFRLFFBQVEsRUFBRSxPQUFPLE9BQU8sRUFBRTtBQUNuRSxhQUFPLEtBQUs7QUFBQSxRQUNWLFFBQVEsZUFBZSxJQUFJLFNBQVM7QUFBQSxRQUNwQyxPQUFRO0FBQUEsUUFDUixRQUFRLGVBQWUsSUFDbkIsMENBQ0E7QUFBQSxNQUNOLENBQUM7QUFBQSxJQUNIO0FBR0EsVUFBTSxVQUFVLENBQUMsR0FBRyxTQUFTLGlCQUFpQiwwQkFBMEIsQ0FBQyxFQUN0RSxJQUFJLFFBQU0sR0FBRyxNQUFNLFlBQVksQ0FBQyxFQUFFLE9BQU8sT0FBTztBQUNuRCxVQUFNLGFBQWEsQ0FBQyxRQUFRLFFBQVEsR0FBRyxPQUFPO0FBRTlDLFVBQU0sY0FBYztBQUFBLE1BQ2xCLENBQUMsb0JBQW9CLElBQUk7QUFBQSxNQUFHLENBQUMsMkJBQTJCLElBQUk7QUFBQSxNQUM1RCxDQUFDLCtCQUErQixLQUFLO0FBQUEsTUFBRyxDQUFDLGlCQUFpQixJQUFJO0FBQUEsTUFDOUQsQ0FBQyx3QkFBd0IsS0FBSztBQUFBLE1BQUcsQ0FBQyxrQkFBa0IsSUFBSTtBQUFBLE1BQ3hELENBQUMsbUJBQW1CLElBQUk7QUFBQSxNQUFHLENBQUMscUNBQXFDLEtBQUs7QUFBQSxNQUN0RSxDQUFDLGNBQWMsS0FBSztBQUFBLE1BQUcsQ0FBQywwQkFBMEIsT0FBTztBQUFBLElBQzNEO0FBQ0EsVUFBTSxpQkFBaUIsQ0FBQztBQUN4QixlQUFXLENBQUMsTUFBTSxLQUFLLEtBQUssYUFBYTtBQUN2QyxZQUFNQyxNQUFLLElBQUksT0FBTyxNQUFNLE1BQU0sUUFBUSxLQUFLLEtBQUssQ0FBQyxLQUFLO0FBQzFELFVBQUksV0FBVyxLQUFLLE9BQUssRUFBRSxTQUFTLElBQUksQ0FBQyxLQUFLLFdBQVcsS0FBSyxPQUFLQSxJQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUc7QUFDOUUsdUJBQWUsS0FBSyxTQUFTLElBQUksa0JBQWtCLE1BQU0sWUFBWSxDQUFDLFFBQVE7QUFBQSxNQUNoRjtBQUFBLElBQ0Y7QUFDQSxRQUFJLGVBQWUsU0FBUyxHQUFHO0FBQzdCLGFBQU8sS0FBSztBQUFBLFFBQ1YsUUFBUTtBQUFBLFFBQ1IsT0FBUTtBQUFBLFFBQ1IsUUFBUSwwQ0FBMEMsZUFBZSxLQUFLLElBQUksQ0FBQztBQUFBLE1BQzdFLENBQUM7QUFBQSxJQUNILFdBQVcsV0FBVyxLQUFLLE9BQUssRUFBRSxTQUFTLEVBQUUsR0FBRztBQUM5QyxhQUFPLEtBQUs7QUFBQSxRQUNWLFFBQVE7QUFBQSxRQUNSLE9BQVE7QUFBQSxRQUNSLFFBQVE7QUFBQSxNQUNWLENBQUM7QUFBQSxJQUNIO0FBR0EsVUFBTSxRQUFRLEVBQUUsTUFBTSxVQUFVLE1BQU0sZ0JBQWdCLE1BQU0sU0FBUztBQUNyRSxVQUFNLGNBQWdCLE9BQU8sS0FBSyxPQUFLLEVBQUUsV0FBVyxNQUFNO0FBQzFELFVBQU0sY0FBZ0IsT0FBTyxLQUFLLE9BQUssRUFBRSxXQUFXLE1BQU07QUFDMUQsVUFBTSxnQkFBZ0IsY0FBYyxTQUFTLGNBQWMsU0FBUztBQUNwRSxVQUFNLGFBQWdCLGNBQ2xCLDhDQUNBLGNBQWMsbUNBQW1DO0FBRXJELFVBQU0sWUFBWTtBQUFBO0FBQUE7QUFBQSw4Q0FHMEIsTUFBTSxhQUFhLENBQUM7QUFBQSxtQ0FDL0IsYUFBYSxLQUFLLFdBQVcsVUFBVSxDQUFDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFVBTWpFLE9BQU8sSUFBSSxPQUFLO0FBQUEsb0NBQ1UsRUFBRSxNQUFNO0FBQUEsb0NBQ1IsTUFBTSxFQUFFLE1BQU0sQ0FBQztBQUFBLHFDQUNkLFdBQVcsRUFBRSxLQUFLLENBQUM7QUFBQSxzQ0FDbEIsRUFBRSxNQUFNO0FBQUEsaUJBQzdCLEVBQUUsS0FBSyxFQUFFLENBQUM7QUFBQTtBQUFBO0FBQUEsRUFHM0I7QUFJQSxNQUFJLG1CQUFtQjtBQUN2QixXQUFTLHVCQUF1QjtBQUM5QixpQkFBYSxnQkFBZ0I7QUFDN0IsdUJBQW1CLFdBQVcsTUFBTTtBQUNsQyxZQUFNLEtBQUssU0FBUyxlQUFlLG9CQUFvQjtBQUN2RCxVQUFJLEdBQUksc0JBQXFCLEdBQUcsS0FBSztBQUFBLElBQ3ZDLEdBQUcsR0FBRztBQUFBLEVBQ1I7QUFNQSxXQUFTLHFCQUFxQkosT0FBTTtBQUNsQyxVQUFNLFFBQVksU0FBUyxlQUFlLHFCQUFxQjtBQUMvRCxVQUFNLFlBQVksU0FBUyxlQUFlLHFCQUFxQjtBQUMvRCxRQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQ0EsTUFBSyxLQUFLLEVBQUc7QUFHMUMsVUFBTSxhQUFhQSxNQUFLLE1BQU0sSUFBSSxFQUFFLEtBQUssT0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLElBQUksS0FBSyxFQUFFLFlBQVk7QUFDbEYsVUFBTSxrQkFBa0I7QUFBQSxNQUN0QjtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsSUFDRjtBQUNBLFVBQU0saUJBQWlCLGdCQUFnQixLQUFLLENBQUFJLFFBQU1BLElBQUcsS0FBSyxTQUFTLENBQUM7QUFDcEUsVUFBTSxlQUFlO0FBQUEsTUFDbkIsTUFBTSxDQUFDO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxRQUFRLGlCQUNKLCtGQUNBO0FBQUEsSUFDTjtBQUdBLFVBQU0sV0FBV0osTUFBSyxNQUFNLElBQUksRUFBRSxJQUFJLE9BQUssRUFBRSxLQUFLLENBQUMsRUFBRSxPQUFPLE9BQU87QUFDbkUsVUFBTSxnQkFBZ0IsU0FBUztBQUFBLE1BQzdCLE9BQUssRUFBRSxZQUFZLE1BQU0sVUFBVSxZQUFZO0FBQUEsSUFDakQ7QUFDQSxVQUFNLFlBQVksU0FBUyxNQUFNLEtBQUssSUFBSSxHQUFHLGdCQUFnQixDQUFDLENBQUM7QUFDL0QsVUFBTSxpQkFBaUIsVUFBVSxLQUFLLE9BQUssRUFBRSxLQUFLLENBQUMsS0FBSyxJQUFJLE1BQU0sS0FBSyxFQUFFLENBQUMsS0FBSztBQUUvRSxVQUFNLGlCQUFpQixjQUFjLE1BQU0sV0FBVyxFQUFFLENBQUMsS0FBSztBQUM5RCxVQUFNLGtCQUFrQixlQUFlLFlBQVksTUFBTTtBQUN6RCxVQUFNLGNBQWM7QUFBQSxNQUNsQixNQUFNLENBQUM7QUFBQSxNQUNQLE9BQU87QUFBQSxNQUNQLFFBQVEsa0JBQ0osdUZBQ0E7QUFBQSxJQUNOO0FBR0EsVUFBTSxjQUFjLHFCQUFxQjtBQUN6QyxRQUFJO0FBQ0osUUFBSSxDQUFDLGFBQWE7QUFDaEIscUJBQWUsRUFBRSxNQUFNLE1BQU0sT0FBTyxxQkFBcUIsUUFBUSx5RUFBb0U7QUFBQSxJQUN2SSxPQUFPO0FBQ0wsWUFBTSxZQUFZQSxNQUFLLFlBQVksRUFBRSxNQUFNLElBQUksT0FBTyxZQUFZLFlBQVksRUFBRSxRQUFRLHVCQUF1QixNQUFNLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHO0FBQ3JJLHFCQUFlO0FBQUEsUUFDYixNQUFNLFlBQVk7QUFBQSxRQUNsQixNQUFNLGFBQWE7QUFBQSxRQUNuQixPQUFPO0FBQUEsUUFDUCxRQUFRLGFBQWEsSUFDakIsSUFBSSxXQUFXLFdBQVcsQ0FBQyxvREFDM0IsYUFBYSxJQUNYLElBQUksV0FBVyxXQUFXLENBQUMsZ0ZBQzNCLElBQUksV0FBVyxXQUFXLENBQUMsZUFBZSxRQUFRO0FBQUEsTUFDMUQ7QUFBQSxJQUNGO0FBR0EsVUFBTSxnQkFBZ0IsT0FBTyxxQkFDMUIsT0FBTywwQkFBMEIsT0FBTyx1QkFBdUIsZ0JBQWlCLENBQUM7QUFDcEYsVUFBTSxjQUFlLGNBQWMsY0FBYyxJQUFJLFlBQVk7QUFDakUsVUFBTSxlQUFlLGNBQWMsVUFBVSxJQUFJLFlBQVk7QUFDN0QsVUFBTSxTQUFjLG1EQUFtRCxLQUFLLFVBQVU7QUFDdEYsVUFBTSxhQUFjLDhDQUE4QyxLQUFLLGNBQWMsTUFBTSxVQUFVO0FBQ3JHLFVBQU0sV0FBYyxhQUFhLEVBQUUsSUFBSSxLQUFLLElBQUksS0FBSyxRQUFRLEtBQUssUUFBUSxJQUFJLElBQzFELFNBQWEsRUFBRSxJQUFJLEtBQUssSUFBSSxLQUFLLFFBQVEsS0FBSyxRQUFRLElBQUksSUFDN0MsRUFBRSxJQUFJLEtBQUssSUFBSSxLQUFLLFFBQVEsS0FBSyxRQUFRLElBQUk7QUFDOUUsVUFBTSxVQUFjLGFBQWEsR0FBRyxTQUFTLEVBQUUsU0FBSSxTQUFTLEVBQUUseUJBQzFDLFNBQWEsR0FBRyxTQUFTLEVBQUUsU0FBSSxTQUFTLEVBQUUsaUJBQzdCLFNBQUksU0FBUyxFQUFFO0FBRWhELFVBQU0sUUFBV0EsTUFBSyxLQUFLLEVBQUUsTUFBTSxLQUFLLEVBQUUsT0FBTyxPQUFPLEVBQUU7QUFDMUQsVUFBTSxRQUFXLEtBQUssSUFBSSxLQUFNLFFBQVEsU0FBUyxLQUFNLEdBQUc7QUFDMUQsVUFBTSxXQUFXLFFBQVEsU0FBUyxTQUFTLFlBQzFCLFFBQVEsU0FBUyxLQUFVLFlBQzNCLFNBQVMsU0FBUyxLQUFTLFlBQzNCLFNBQVMsU0FBUyxTQUFTLFlBQzNCO0FBQ2pCLFVBQU0sV0FBVyxTQUFTLFNBQVMsTUFBTSxTQUFTLFNBQVMsS0FBSyxTQUMvQyxTQUFTLFNBQVMsVUFBVSxTQUFTLFNBQVMsU0FBUyxTQUN2RDtBQUNqQixVQUFNLFFBQVcsaUVBQWlFLEtBQUssZ0JBQWdCLFFBQVE7QUFDL0csVUFBTSxpQkFBaUI7QUFBQSxNQUNyQixDQUFDLFFBQVEsR0FBRztBQUFBLE1BQ1osT0FBTyxlQUFlLE9BQU87QUFBQSxNQUM3QixRQUFRLEdBQUcsS0FBSyxVQUFVLEtBQUssV0FDN0IsUUFBUSxTQUFTLEtBQUssc0JBQXNCLFNBQVMsRUFBRSxTQUFJLFNBQVMsRUFBRSxNQUNwRSxRQUFRLFNBQVMsS0FBSyxxQkFBcUIsU0FBUyxFQUFFLFlBQ3RELHNCQUNKO0FBQUEsSUFDRjtBQUdBLFVBQU0sV0FBV0EsTUFBSyxNQUFNLFFBQVEsRUFBRSxPQUFPLE9BQUssRUFBRSxLQUFLLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLEtBQUs7QUFFNUUsVUFBTSx1QkFBdUI7QUFBQSxNQUMzQjtBQUFBLE1BQWM7QUFBQSxNQUFZO0FBQUEsTUFDMUI7QUFBQSxNQUNBO0FBQUEsTUFBdUI7QUFBQSxNQUN2QjtBQUFBLE1BQXVCO0FBQUEsSUFDekI7QUFFQSxVQUFNLHFCQUFxQjtBQUFBLE1BQ3pCO0FBQUEsTUFBa0I7QUFBQSxNQUNsQjtBQUFBLE1BQXFCO0FBQUEsSUFDdkI7QUFDQSxVQUFNLGtCQUFrQixxQkFBcUIsS0FBSyxDQUFBSSxRQUFNQSxJQUFHLEtBQUssUUFBUSxDQUFDO0FBQ3pFLFVBQU0sZ0JBQWtCLG1CQUFtQixLQUFLLENBQUFBLFFBQU1BLElBQUcsS0FBSyxRQUFRLENBQUM7QUFDdkUsVUFBTSxXQUFXO0FBQUEsTUFDZixNQUFNO0FBQUEsTUFDTixNQUFNLENBQUMsbUJBQW1CO0FBQUEsTUFDMUIsT0FBTztBQUFBLE1BQ1AsUUFBUSxrQkFDSixzREFDQSxnQkFDRSxnT0FDQTtBQUFBLElBQ1I7QUFHQSxVQUFNLHNCQUFzQjtBQUFBLE1BQzFCO0FBQUE7QUFBQSxNQUNBO0FBQUE7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0Y7QUFDQSxVQUFNLGlCQUFpQixvQkFBb0IsS0FBSyxDQUFBQSxRQUFNQSxJQUFHLEtBQUtKLEtBQUksQ0FBQztBQUNuRSxVQUFNLG1CQUFtQjtBQUFBLE1BQ3ZCLE1BQU07QUFBQSxNQUNOLE1BQU0sQ0FBQztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsUUFBUSxpQkFDSiw0REFDQTtBQUFBLElBQ047QUFHQSxVQUFNLGFBQWE7QUFBQSxNQUNqQjtBQUFBLE1BQXlCO0FBQUEsTUFBeUI7QUFBQSxNQUNsRDtBQUFBLE1BQWtCO0FBQUEsTUFBd0I7QUFBQSxNQUMxQztBQUFBLE1BQTZCO0FBQUEsTUFDN0I7QUFBQSxNQUFzQztBQUFBLE1BQ3RDO0FBQUEsTUFBa0I7QUFBQSxNQUFtQjtBQUFBLE1BQ3JDO0FBQUEsTUFBb0I7QUFBQSxNQUF3QjtBQUFBLE1BQzVDO0FBQUEsTUFBZTtBQUFBLE1BQWdCO0FBQUEsSUFDakM7QUFDQSxVQUFNLFVBQWFBLE1BQUssWUFBWTtBQUNwQyxVQUFNLFlBQWEsV0FBVyxPQUFPLE9BQUssUUFBUSxTQUFTLENBQUMsQ0FBQztBQUM3RCxVQUFNLGNBQWM7QUFBQSxNQUNsQixNQUFNLFVBQVUsV0FBVztBQUFBLE1BQzNCLE1BQU0sVUFBVSxTQUFTLEtBQUssVUFBVSxVQUFVO0FBQUEsTUFDbEQsTUFBTSxVQUFVLFNBQVM7QUFBQSxNQUN6QixPQUFPO0FBQUEsTUFDUCxRQUFRLFVBQVUsV0FBVyxJQUN6QixvREFDQSxpQkFBaUIsVUFBVSxTQUFTLElBQUksTUFBTSxFQUFFLGNBQWMsVUFBVSxNQUFNLEdBQUcsQ0FBQyxFQUFFLElBQUksT0FBSyxTQUFJLENBQUMsUUFBRyxFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsVUFBVSxTQUFTLElBQUksV0FBTSxFQUFFO0FBQUEsSUFDeko7QUFHQSxVQUFNLFNBQVMsQ0FBQyxjQUFjLGFBQWEsY0FBYyxnQkFBZ0IsVUFBVSxrQkFBa0IsV0FBVztBQUNoSCxjQUFVLFlBQVksT0FBTyxJQUFJLE9BQUs7QUFDcEMsWUFBTSxRQUFRLEVBQUUsT0FBTyxTQUFTLEVBQUUsT0FBTyxTQUFTO0FBQ2xELGFBQU8sd0JBQXdCLEtBQUs7QUFBQTtBQUFBLCtCQUVULFdBQVcsRUFBRSxLQUFLLENBQUM7QUFBQSxnQ0FDbEIsRUFBRSxNQUFNO0FBQUE7QUFBQSxJQUV0QyxDQUFDLEVBQUUsS0FBSyxFQUFFO0FBRVYsVUFBTSxNQUFNLFVBQVU7QUFBQSxFQUN4QjtBQUlBLFdBQVMsdUJBQXVCO0FBRTlCLFVBQU0sV0FBVyxPQUFPLHFCQUFzQixPQUFPLDBCQUEwQixPQUFPLHVCQUF1QjtBQUM3RyxRQUFJLFlBQVksU0FBUyxhQUFjLFFBQU8sU0FBUztBQUN2RCxRQUFJLFlBQVksU0FBUyxRQUFjLFFBQU8sU0FBUztBQUV2RCxVQUFNLEtBQUtFLGNBQWEsV0FBVyxLQUFLLEtBQUs7QUFDN0MsVUFBTSxZQUFZLEdBQUcsTUFBTSxJQUFJLEVBQUUsS0FBSyxPQUFLLEVBQUUsS0FBSyxDQUFDO0FBQ25ELFdBQU8sWUFBWSxVQUFVLEtBQUssRUFBRSxNQUFNLEdBQUcsRUFBRSxJQUFJO0FBQUEsRUFDckQ7OztBQ2xzQkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsZ0NBQUFHO0FBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWlCQSxNQUFNLGtCQUFrQixDQUFDO0FBR3pCLE1BQUksc0JBQXNCO0FBRzFCLFdBQVMsMkJBQTJCO0FBQUUsMEJBQXNCO0FBQUEsRUFBSTtBQUloRSxpQkFBZUEsd0JBQXVCO0FBQ3BDLFVBQU0sVUFBVSxTQUFTLGVBQWUsa0JBQWtCO0FBQzFELFlBQVEsWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWtCcEIsVUFBTSxVQUFVLFNBQVMsZUFBZSxVQUFVO0FBQ2xELFFBQUksU0FBUztBQUNYLFVBQUksb0JBQXFCLFNBQVEsUUFBUTtBQUN6QyxjQUFRLGlCQUFpQixTQUFTLE1BQU07QUFBRSw4QkFBc0IsUUFBUTtBQUFBLE1BQU8sQ0FBQztBQUFBLElBQ2xGO0FBQUEsRUFDRjtBQUlBLFdBQVMsMEJBQTBCO0FBQ2pDLFVBQU0sT0FBTyxTQUFTLGVBQWUsVUFBVSxHQUFHLFNBQVMsSUFBSSxLQUFLO0FBQ3BFLFFBQUksQ0FBQyxLQUFLO0FBQUUscUJBQWUseUJBQWUscURBQXFEO0FBQUc7QUFBQSxJQUFRO0FBRzFHLFFBQUksWUFBWSxJQUFJLE1BQU0sVUFBVSxFQUFFLElBQUksQ0FBQUMsT0FBS0EsR0FBRSxLQUFLLENBQUMsRUFBRSxPQUFPLE9BQU87QUFDdkUsUUFBSSxVQUFVLFdBQVcsR0FBRztBQUUxQixZQUFNLFdBQVcsSUFBSSxNQUFNLG1EQUFtRCxFQUMzRSxJQUFJLENBQUFBLE9BQUtBLEdBQUUsS0FBSyxDQUFDLEVBQ2pCLE9BQU8sT0FBTztBQUNqQixVQUFJLFNBQVMsU0FBUyxFQUFHLGFBQVk7QUFBQSxJQUN2QztBQUNBLFFBQUksVUFBVSxXQUFXLEdBQUc7QUFFMUIsWUFBTSxhQUFhLElBQUksTUFBTSxLQUFLLEVBQUUsSUFBSSxDQUFBQSxPQUFLQSxHQUFFLEtBQUssQ0FBQyxFQUFFLE9BQU8sQ0FBQUEsT0FBS0EsR0FBRSxTQUFTLENBQUM7QUFDL0UsVUFBSSxXQUFXLFNBQVMsRUFBRyxhQUFZO0FBQUEsSUFDekM7QUFFQSxVQUFNLFlBQVksU0FBUyxlQUFlLHdCQUF3QjtBQUNsRSxjQUFVLFlBQVksVUFBVSxJQUFJLENBQUNBLElBQUcsTUFBTSxvQkFBb0JBLElBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFO0FBQ2hGLGFBQVMsZUFBZSxhQUFhLEVBQUUsTUFBTSxVQUFVLFVBQVUsU0FBUyxLQUFLO0FBRy9FLGNBQVUsUUFBUSxDQUFDQSxJQUFHLE1BQU0sa0JBQWtCQSxJQUFHLENBQUMsQ0FBQztBQUFBLEVBQ3JEO0FBSUEsV0FBUyxvQkFBb0IsVUFBVSxLQUFLO0FBQzFDLFdBQU87QUFBQSxrREFDeUMsR0FBRyxvQkFBb0IsV0FBVyxRQUFRLENBQUM7QUFBQTtBQUFBLHdDQUVyRCxNQUFNLENBQUM7QUFBQSxnQkFDL0IsV0FBVyxRQUFRLENBQUM7QUFBQTtBQUFBO0FBQUEsNEJBR1IsR0FBRztBQUFBLDBCQUNMLEdBQUc7QUFBQSxnREFDbUIsR0FBRztBQUFBO0FBQUEsWUFFdkMsQ0FBQyxVQUFTLFFBQU8sV0FBVyxFQUFFLElBQUksT0FBSztBQUFBLDBDQUNULE1BQU0sV0FBVyxZQUFZLEVBQUUsZUFBZSxDQUFDLDJCQUEyQixHQUFHLEtBQUssQ0FBQyxZQUFZLFVBQVUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUFBO0FBQUEscURBRXJILEdBQUcsd0NBQXdDLEdBQUc7QUFBQSw2QkFDdEUsR0FBRztBQUFBLHFEQUNxQixHQUFHO0FBQUEsaUNBQ3ZCLEdBQUc7QUFBQSx1REFDbUIsR0FBRztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSTFEO0FBRUEsV0FBUyxVQUFVLEtBQUs7QUFDdEIsV0FBTyxFQUFFLFFBQVEsa0NBQTZCLE1BQU0sd0JBQW1CLFdBQVcsbUNBQThCLEVBQUUsR0FBRyxLQUFLO0FBQUEsRUFDNUg7QUFJQSxXQUFTLGFBQWEsS0FBSyxLQUFLLEtBQUs7QUFDbkMsYUFBUyxpQkFBaUIsV0FBVyxHQUFHLGlCQUFpQixFQUFFLFFBQVEsQ0FBQUMsT0FBS0EsR0FBRSxVQUFVLE9BQU8sUUFBUSxDQUFDO0FBQ3BHLFFBQUksVUFBVSxJQUFJLFFBQVE7QUFDMUIsUUFBSSxDQUFDLGdCQUFnQixHQUFHLEVBQUcsaUJBQWdCLEdBQUcsSUFBSSxDQUFDO0FBQ25ELG9CQUFnQixHQUFHLEVBQUUsU0FBUztBQUFBLEVBQ2hDO0FBRUEsV0FBUyxtQkFBbUIsS0FBSztBQUMvQixVQUFNLFNBQVMsU0FBUyxjQUFjLFdBQVcsR0FBRyx3QkFBd0I7QUFDNUUsV0FBTyxTQUFTLE9BQU8sYUFBYSxVQUFVLElBQUk7QUFBQSxFQUNwRDtBQUlBLGlCQUFlLGtCQUFrQixVQUFVLEtBQUs7QUFDOUMsUUFBSTtBQUNGLFlBQU0sTUFBTyxNQUFNLE1BQU0seUJBQXlCO0FBQUEsUUFDaEQsUUFBUztBQUFBLFFBQ1QsU0FBUyxFQUFFLGdCQUFnQixtQkFBbUI7QUFBQSxRQUM5QyxNQUFTLEtBQUssVUFBVSxFQUFFLFNBQVMsQ0FBQztBQUFBLE1BQ3RDLENBQUM7QUFDRCxZQUFNLE9BQU8sTUFBTSxJQUFJLEtBQUs7QUFDNUIsVUFBSSxDQUFDLEtBQUssSUFBSTtBQUFFLGlCQUFTLGVBQWUsWUFBWSxHQUFHLEVBQUUsRUFBRSxZQUFZO0FBQUk7QUFBQSxNQUFRO0FBR25GLFlBQU0sVUFBVSxTQUFTLGVBQWUsWUFBWSxHQUFHLEVBQUU7QUFDekQsVUFBSSxLQUFLLE9BQU87QUFDZCxjQUFNLElBQUksS0FBSztBQUNmLGdCQUFRLFlBQVk7QUFBQTtBQUFBLDJFQUVxQyxXQUFXLEVBQUUsV0FBVyxFQUFFLENBQUMsS0FBSyxXQUFXLEVBQUUsUUFBUSxFQUFFLENBQUM7QUFBQSx3Q0FDL0UsWUFBWSxFQUFFLFlBQVksSUFBSSxVQUFVLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFBQTtBQUFBO0FBQUEsd0RBR2hDLEdBQUcsOEJBQThCLEdBQUc7QUFBQTtBQUFBO0FBQUE7QUFJdEYsWUFBSSxDQUFDLGdCQUFnQixHQUFHLEVBQUcsaUJBQWdCLEdBQUcsSUFBSSxDQUFDO0FBQ25ELHdCQUFnQixHQUFHLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCO0FBQUEsTUFDMUQsT0FBTztBQUNMLGdCQUFRLFlBQVk7QUFBQSxNQUN0QjtBQUdBLFlBQU0sUUFBUSxTQUFTLGVBQWUsVUFBVSxHQUFHLEVBQUU7QUFDckQsVUFBSSxLQUFLLGVBQWUsS0FBSyxZQUFZLFFBQVE7QUFDL0MsY0FBTSxRQUFRLEtBQUssWUFBWSxJQUFJLE9BQUs7QUFBQTtBQUFBLDZDQUVELEVBQUUsR0FBRywwQ0FBMEMsR0FBRztBQUFBO0FBQUEsc0JBRXpFLFdBQVcsRUFBRSxLQUFLLENBQUMsa0JBQWUsV0FBVyxFQUFFLE9BQU8sQ0FBQztBQUFBLDJDQUNsQyxLQUFLLE1BQU0sRUFBRSxRQUFRLEdBQUcsQ0FBQztBQUFBLHlEQUNYLFdBQVcsRUFBRSxPQUFPLENBQUM7QUFBQTtBQUFBLGlCQUU3RCxFQUFFLEtBQUssRUFBRTtBQUNwQixjQUFNLFlBQVk7QUFBQSxtQ0FDVyxLQUFLO0FBQ2xDLFlBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFHLGlCQUFnQixHQUFHLElBQUksQ0FBQztBQUNuRCx3QkFBZ0IsR0FBRyxFQUFFLG9CQUFvQixLQUFLLFlBQVksSUFBSSxPQUFLLEVBQUUsR0FBRztBQUFBLE1BQzFFLE9BQU87QUFDTCxjQUFNLFlBQVk7QUFBQSxNQUNwQjtBQUFBLElBQ0YsU0FBU0MsSUFBRztBQUNWLGVBQVMsZUFBZSxZQUFZLEdBQUcsRUFBRSxFQUFFLFlBQVk7QUFBQSxJQUN6RDtBQUFBLEVBQ0Y7QUFJQSxXQUFTLGVBQWUsS0FBSztBQUMzQixVQUFNLEtBQUssU0FBUyxlQUFlLGdCQUFnQixHQUFHLEVBQUU7QUFDeEQsUUFBSSxDQUFDLGdCQUFnQixHQUFHLEVBQUcsaUJBQWdCLEdBQUcsSUFBSSxDQUFDO0FBQ25ELG9CQUFnQixHQUFHLEVBQUUsV0FBVyxJQUFJLFdBQVc7QUFBQSxFQUNqRDtBQUVBLFdBQVMsbUJBQW1CLEtBQUs7QUFDL0IsVUFBTSxRQUFZLFNBQVMsZUFBZSxZQUFZLEdBQUcsRUFBRTtBQUMzRCxVQUFNLFVBQVksTUFBTSxLQUFLLE1BQU0saUJBQWlCLGdDQUFnQyxDQUFDLEVBQ2xGLE9BQU8sUUFBTSxHQUFHLE9BQU8sRUFDdkIsSUFBSSxRQUFNLFNBQVMsR0FBRyxhQUFhLFVBQVUsR0FBRyxFQUFFLENBQUM7QUFDdEQsUUFBSSxDQUFDLGdCQUFnQixHQUFHLEVBQUcsaUJBQWdCLEdBQUcsSUFBSSxDQUFDO0FBQ25ELG9CQUFnQixHQUFHLEVBQUUsb0JBQW9CO0FBQUEsRUFDM0M7QUFJQSxpQkFBZSwwQkFBMEIsS0FBSztBQXdCNUMsVUFBTSxNQUFXLFNBQVMsZUFBZSxjQUFjLEdBQUcsRUFBRTtBQUM1RCxRQUFJLEtBQUs7QUFBRSxVQUFJLFdBQVc7QUFBTSxVQUFJLGNBQWM7QUFBQSxJQUFpQjtBQUVuRSxVQUFNLFdBQVcsU0FBUyxlQUFlLFlBQVksR0FBRyxFQUFFLEdBQUcsUUFBUSxZQUFZO0FBQ2pGLFVBQU0sUUFBVyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7QUFDMUMsVUFBTSxNQUFXLG1CQUFtQixHQUFHO0FBQ3ZDLFVBQU0sUUFBWSxNQUFNLFlBQVksTUFBTSxnQkFBaUIsTUFBTSxnQkFBZ0I7QUFDakYsVUFBTSxTQUFXLE1BQU0scUJBQXFCLENBQUM7QUFFN0MsUUFBSTtBQUNGLFlBQU0sTUFBTyxNQUFNLE1BQU0sMkJBQTJCO0FBQUEsUUFDbEQsUUFBUztBQUFBLFFBQ1QsU0FBUyxFQUFFLGdCQUFnQixtQkFBbUI7QUFBQSxRQUM5QyxNQUFTLEtBQUssVUFBVTtBQUFBLFVBQ3RCO0FBQUEsVUFDQSxRQUFxQjtBQUFBLFVBQ3JCLG9CQUFxQjtBQUFBLFVBQ3JCLGdCQUFxQjtBQUFBLFFBQ3ZCLENBQUM7QUFBQSxNQUNILENBQUM7QUFDRCxZQUFNLE9BQU8sTUFBTSxJQUFJLEtBQUs7QUFDNUIsVUFBSSxDQUFDLEtBQUssSUFBSTtBQUFFLHVCQUFlLGdCQUFXLEtBQUssU0FBUyxvQkFBb0I7QUFBRztBQUFBLE1BQVE7QUFFdkYsVUFBSSxDQUFDLGdCQUFnQixHQUFHLEVBQUcsaUJBQWdCLEdBQUcsSUFBSSxDQUFDO0FBQ25ELHNCQUFnQixHQUFHLEVBQUUsZUFBZSxLQUFLO0FBQ3pDLHNCQUFnQixHQUFHLEVBQUUsU0FBZTtBQUVwQyxlQUFTLGVBQWUsYUFBYSxHQUFHLEVBQUUsRUFBRSxZQUFZO0FBQUEsMkRBQ0QsR0FBRztBQUFBLG1DQUMzQixHQUFHLHVCQUF1QixHQUFHLDRCQUE0QixHQUFHO0FBQUEsU0FDdEYsV0FBVyxLQUFLLElBQUksQ0FBQztBQUMxQixlQUFTLGVBQWUsZ0JBQWdCLEdBQUcsRUFBRSxFQUFFLE1BQU0sVUFBVTtBQUFBLElBQ2pFLFNBQVMsR0FBRztBQUNWLHFCQUFlLGdCQUFXLDJCQUEyQjtBQUFBLElBQ3ZELFVBQUU7QUFDQSxVQUFJLEtBQUs7QUFBRSxZQUFJLFdBQVc7QUFBTyxZQUFJLGNBQWM7QUFBQSxNQUFvQjtBQUFBLElBQ3pFO0FBQUEsRUFDRjtBQUlBLGlCQUFlLHlCQUF5QjtBQW1CdEMsVUFBTSxNQUFNLFNBQVMsZUFBZSxhQUFhO0FBQ2pELFFBQUksS0FBSztBQUFFLFVBQUksV0FBVztBQUFNLFVBQUksY0FBYztBQUFBLElBQWE7QUFFL0QsVUFBTSxZQUFZLENBQUM7QUFDbkIsYUFBUyxpQkFBaUIsb0JBQW9CLEVBQUUsUUFBUSxDQUFDLE9BQU8sTUFBTTtBQUNwRSxZQUFNLE1BQVMsTUFBTSxjQUFjLHFDQUFxQztBQUN4RSxZQUFNLFNBQVMsU0FBUyxlQUFlLFdBQVcsQ0FBQyxFQUFFO0FBQ3JELFlBQU0sVUFBVSxTQUFTLGVBQWUsWUFBWSxDQUFDLEVBQUU7QUFDdkQsVUFBSSxDQUFDLE9BQVE7QUFFYixZQUFNLFdBQWUsTUFBTSxJQUFJLFlBQVksS0FBSyxJQUFJO0FBQ3BELFlBQU0sZUFBZ0IsZ0JBQWdCLENBQUMsR0FBRyxnQkFBaUIsT0FBTyxTQUFTO0FBQzNFLFlBQU0sTUFBZSxtQkFBbUIsQ0FBQztBQUN6QyxZQUFNLFdBQWUsVUFBVSxRQUFRLE1BQU0sS0FBSyxJQUFJO0FBRXRELGdCQUFVLEtBQUssRUFBRSxVQUFVLFdBQVcsVUFBVSxRQUFRLEtBQUssZUFBZSxhQUFhLENBQUM7QUFBQSxJQUM1RixDQUFDO0FBRUQsUUFBSSxDQUFDLFVBQVUsUUFBUTtBQUNyQixxQkFBZSxnQ0FBc0Isc0RBQXNEO0FBQzNGLFVBQUksS0FBSztBQUFFLFlBQUksV0FBVztBQUFPLFlBQUksY0FBYztBQUFBLE1BQXlCO0FBQzVFO0FBQUEsSUFDRjtBQUVBLFFBQUk7QUFDRixZQUFNLE1BQU8sTUFBTSxNQUFNLHVCQUF1QjtBQUFBLFFBQzlDLFFBQVM7QUFBQSxRQUNULFNBQVMsRUFBRSxnQkFBZ0IsbUJBQW1CO0FBQUEsUUFDOUMsTUFBUyxLQUFLLFVBQVUsRUFBRSxVQUFVLENBQUM7QUFBQSxNQUN2QyxDQUFDO0FBQ0QsWUFBTSxPQUFPLE1BQU0sSUFBSSxLQUFLO0FBQzVCLFVBQUksS0FBSyxJQUFJO0FBQ1gsdUJBQWUsZ0JBQVcsR0FBRyxLQUFLLEtBQUssWUFBWSxLQUFLLFVBQVUsSUFBSSxNQUFNLEVBQUUscUJBQXFCLFdBQVcsS0FBSyxRQUFRLENBQUMsK0NBQStDO0FBQUEsTUFDN0ssT0FBTztBQUNMLHVCQUFlLHNCQUFpQixLQUFLLFNBQVMsMkJBQTJCO0FBQUEsTUFDM0U7QUFBQSxJQUNGLFNBQVMsR0FBRztBQUNWLHFCQUFlLGdCQUFXLDJCQUEyQjtBQUFBLElBQ3ZELFVBQUU7QUFDQSxVQUFJLEtBQUs7QUFBRSxZQUFJLFdBQVc7QUFBTyxZQUFJLGNBQWM7QUFBQSxNQUF5QjtBQUFBLElBQzlFO0FBQUEsRUFDRjs7O0FDeFVBO0FBQUE7QUFBQTtBQUFBO0FBQUEsK0JBQUFDO0FBQUEsSUFBQTtBQUFBO0FBaUJBLE1BQU1DLFFBQU0sVUFBVSxVQUFVO0FBRWhDLFdBQVMsZ0JBQWdCLE1BQU07QUFDN0IsUUFBSSxRQUFRLFFBQVEsT0FBTyxFQUFHLFFBQU87QUFDckMsVUFBTSxJQUFJLEtBQUssTUFBTSxPQUFPLElBQUk7QUFDaEMsVUFBTUMsS0FBSSxLQUFLLE1BQU8sT0FBTyxPQUFRLEVBQUU7QUFDdkMsVUFBTSxJQUFJLE9BQU87QUFDakIsUUFBSSxJQUFJLEVBQUcsUUFBTyxHQUFHLENBQUMsS0FBS0EsRUFBQztBQUM1QixRQUFJQSxLQUFJLEVBQUcsUUFBTyxHQUFHQSxFQUFDLEtBQUssQ0FBQztBQUM1QixXQUFPLEdBQUcsQ0FBQztBQUFBLEVBQ2I7QUFFQSxXQUFTLHdCQUF3QixPQUFPLGFBQWE7QUFDbkQsUUFBSSxDQUFDLFNBQVMsT0FBTyxNQUFNLFlBQVksVUFBVTtBQUMvQyxhQUFPLDZCQUE2QixZQUFZLE1BQU07QUFBQSxJQUN4RDtBQUVBLFVBQU0sVUFBVSxzQkFBc0IsS0FBSztBQUMzQyxVQUFNLFlBQVksT0FBTyxNQUFNLDJCQUEyQixXQUN0RCxHQUFHLEtBQUssTUFBTSxNQUFNLHNCQUFzQixDQUFDLE1BQzNDO0FBQ0osVUFBTSxZQUFZLE9BQU8sTUFBTSwyQkFBMkIsV0FDdEQsR0FBRyxLQUFLLE1BQU0sTUFBTSxzQkFBc0IsQ0FBQyxNQUMzQztBQUVKLFdBQU87QUFBQSxNQUNMLDBCQUEwQixRQUFRLE9BQU8saURBQWlELFNBQVMsZ0JBQVcsU0FBUztBQUFBLE1BQ3ZILHFCQUFxQixXQUFXLFFBQVEsSUFBSSxDQUFDO0FBQUEsTUFDN0MsbUJBQW1CLFdBQVcsUUFBUSxNQUFNLENBQUM7QUFBQSxJQUMvQyxFQUFFLEtBQUssRUFBRTtBQUFBLEVBQ1g7QUFJQSxpQkFBZUMsdUJBQXNCO0FBQ25DLFVBQU0sVUFBVSxTQUFTLGVBQWUsa0JBQWtCO0FBRzFELFFBQUksWUFBYTtBQUNqQixRQUFJLGFBQWE7QUFDakIsUUFBSTtBQUNGLFlBQU0sTUFBTyxNQUFNLE1BQU0sYUFBYTtBQUN0QyxtQkFBYSxNQUFNLElBQUksS0FBSztBQUM1QixrQkFBYSxXQUFXLG1CQUFtQjtBQUFBLElBQzdDLFNBQVMsS0FBSztBQUFFLE1BQUFGLE1BQUksS0FBSyw0Q0FBNEMsR0FBRztBQUFBLElBQUc7QUFFM0UsUUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLFlBQVk7QUFDdkMsY0FBUSxZQUFZO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBT3BCO0FBQUEsSUFDRjtBQUVBLFVBQU0sUUFBUSxVQUFVLFNBQVMsQ0FBQztBQUVsQyxRQUFJRyxRQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsVUFVSCxNQUFNLElBQUksT0FBSyxzQ0FBc0MsV0FBVyxDQUFDLENBQUMsY0FBYyxFQUFFLEtBQUssRUFBRSxLQUFLLGlCQUFpQjtBQUFBO0FBQUEsb0ZBRXJDLFdBQVcsVUFBVSxVQUFVLENBQUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBMkNsSCxZQUFRLFlBQVlBO0FBQ3BCLDhCQUEwQixPQUFPLFVBQVU7QUFDM0MsUUFBSSxXQUFZLDBCQUF5QixVQUFVO0FBQ25ELElBQUFDLHdCQUF1QjtBQUN2Qix5QkFBcUI7QUFBQSxFQUN2QjtBQUVBLGlCQUFlLHVCQUF1QjtBQUNwQyxRQUFJO0FBQ0YsWUFBTSxNQUFNLE1BQU0sTUFBTSxvQkFBb0I7QUFDNUMsVUFBSSxDQUFDLElBQUksR0FBSTtBQUNiLFlBQU0sT0FBTyxNQUFNLElBQUksS0FBSztBQUM1QixZQUFNLFdBQVcsU0FBUyxlQUFlLGlCQUFpQjtBQUMxRCxZQUFNLFVBQVcsU0FBUyxlQUFlLGdCQUFnQjtBQUN6RCxVQUFJLFlBQVksS0FBSyxtQkFBb0IsVUFBUyxRQUFRLEtBQUs7QUFDL0QsVUFBSSxXQUFZLEtBQUssT0FBTztBQUMxQixnQkFBUSxRQUFRLEtBQUs7QUFDckIsY0FBTSxVQUFVLFNBQVMsZUFBZSx3QkFBd0I7QUFDaEUsWUFBSSxTQUFTO0FBQ1gsZ0JBQU0sTUFBTSxLQUFLLE1BQU07QUFDdkIsa0JBQVEsY0FBYyxHQUFHLEdBQUc7QUFDNUIsa0JBQVEsTUFBTSxRQUFRLE1BQU0sT0FBTyxZQUFZLE1BQU0sT0FBTyxZQUFZO0FBQUEsUUFDMUU7QUFBQSxNQUNGO0FBQUEsSUFDRixTQUFTQyxJQUFHO0FBQUEsSUFBQztBQUFBLEVBQ2Y7QUFJQSxXQUFTLDBCQUEwQixPQUFPLFlBQVk7QUFDcEQsVUFBTSxLQUFLLFNBQVMsZUFBZSxxQkFBcUI7QUFDeEQsUUFBSSxDQUFDLEdBQUk7QUFFVCxVQUFNLFVBQVUsSUFBSSxLQUFLLFNBQVMsQ0FBQyxHQUFHLElBQUksUUFBTSxLQUFLLElBQUksWUFBWSxDQUFDLENBQUM7QUFDdkUsVUFBTSxTQUFVLENBQUMsR0FBRyxPQUFPLEVBQUUsS0FBSyxPQUFLLEVBQUUsU0FBUyxNQUFNLEtBQUssQ0FBQyxFQUFFLFNBQVMsYUFBYSxLQUFLLENBQUMsRUFBRSxTQUFTLGNBQWMsQ0FBQztBQUN0SCxVQUFNLFVBQVUsQ0FBQyxHQUFHLE9BQU8sRUFBRSxLQUFLLE9BQUssRUFBRSxTQUFTLE9BQU8sS0FBSyxDQUFDLEVBQUUsU0FBUyxhQUFhLEtBQUssQ0FBQyxFQUFFLFNBQVMsY0FBYyxLQUFLLENBQUMsRUFBRSxTQUFTLFdBQVcsQ0FBQztBQUNuSixVQUFNLFVBQVUsQ0FBQyxHQUFHLE9BQU8sRUFBRSxLQUFLLE9BQUssRUFBRSxTQUFTLE9BQU8sQ0FBQztBQUMxRCxVQUFNLFFBQVUsQ0FBQyxHQUFHLE9BQU8sRUFBRSxLQUFLLE9BQUssRUFBRSxTQUFTLGFBQWEsS0FBSyxFQUFFLFNBQVMsY0FBYyxDQUFDO0FBQzlGLFVBQU0sU0FBVSxDQUFDLEdBQUcsT0FBTyxFQUFFLEtBQUssT0FBSyxFQUFFLFNBQVMsV0FBVyxDQUFDO0FBRTlELFVBQU0sWUFBYSxZQUFZLGNBQWMsQ0FBQztBQUM5QyxVQUFNLFdBQWMsVUFBVyxPQUFPLE9BQUssRUFBRSxXQUFXLFVBQVUsRUFBRSxXQUFXLE9BQU8sRUFBRTtBQUN4RixVQUFNLGFBQWEsVUFBVSxTQUFTO0FBRXRDLFVBQU0sY0FBYyxZQUFZLHFCQUFxQjtBQUVyRCxVQUFNLFFBQVE7QUFBQSxNQUNaLEVBQUUsSUFBSSxRQUFVLE9BQU8sb0JBQTJCLE1BQU0sTUFBTTtBQUFBLE1BQzlELEVBQUUsSUFBSSxTQUFVLE9BQU8scUJBQTJCLE1BQU0sTUFBTTtBQUFBLE1BQzlELEVBQUUsSUFBSSxTQUFVLE9BQU8scUJBQTJCLE1BQU0sTUFBTTtBQUFBLE1BQzlELEVBQUUsSUFBSSxPQUFVLE9BQU8sMEJBQTJCLE1BQU0sS0FBTTtBQUFBLE1BQzlELEVBQUUsSUFBSSxRQUFVLE9BQU8sMkJBQTJCLE1BQU0sS0FBTTtBQUFBLE1BQzlEO0FBQUEsUUFBRSxJQUFJLGNBQWMsYUFBYTtBQUFBLFFBQUcsTUFBTTtBQUFBLFFBQ3hDLE9BQU8sYUFDRixXQUFXLElBQUkseUJBQW9CLFFBQVEsU0FBUyxhQUFhLElBQUksTUFBTSxFQUFFLFdBQVcsMEJBQ3pGO0FBQUEsTUFBNkI7QUFBQSxNQUNuQyxFQUFFLElBQUksYUFBYSxNQUFNLE1BQU0sT0FBTyxnQ0FBZ0M7QUFBQSxJQUN4RTtBQUVBLFVBQU0sT0FBTyxNQUFNLElBQUksQ0FBQyxFQUFFLElBQUksT0FBTyxLQUFLLE1BQU07QUFDOUMsWUFBTSxPQUFRLEtBQUssV0FBTyxPQUFPLFdBQU07QUFDdkMsWUFBTSxRQUFRLEtBQUssWUFBYSxPQUFPLFlBQVk7QUFDbkQsWUFBTSxLQUFRLEtBQUssWUFBYSxPQUFPLFlBQVk7QUFDbkQsYUFBTyxvRkFBb0YsRUFBRTtBQUFBLDBEQUN2QyxJQUFJO0FBQUEsMkJBQ25DLEtBQUssdUJBQXVCLFdBQVcsS0FBSyxDQUFDO0FBQUE7QUFBQSxJQUV0RSxDQUFDLEVBQUUsS0FBSyxFQUFFO0FBRVYsVUFBTSxjQUFjLFVBQVUsV0FBVztBQUN6QyxVQUFNLGNBQWMsY0FBYyxZQUFZO0FBQzlDLE9BQUcsWUFBWTtBQUFBO0FBQUEseUNBRXdCLFdBQVc7QUFBQSxRQUM1QyxJQUFJO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTVo7QUFJQSxpQkFBZUQsMEJBQXlCO0FBQ3RDLFVBQU0sS0FBSyxTQUFTLGVBQWUsbUJBQW1CO0FBQ3RELFFBQUksQ0FBQyxHQUFJO0FBQ1QsUUFBSTtBQUNGLFlBQU0sTUFBTyxNQUFNLE1BQU0sZUFBZTtBQUN4QyxVQUFJLENBQUMsSUFBSSxHQUFJO0FBQ2IsWUFBTSxPQUFPLE1BQU0sSUFBSSxLQUFLO0FBQzVCLFlBQU0sUUFBUSxLQUFLLGlCQUFpQixDQUFDO0FBQ3JDLFVBQUksTUFBTSxXQUFXLEVBQUc7QUFDeEIsWUFBTSxPQUFPLE1BQU0sSUFBSSxXQUFTO0FBQzlCLGNBQU0sVUFBVSxNQUFNLFdBQVcsTUFBTSxZQUFZO0FBQ25ELGNBQU0sT0FBTyxZQUFZLGFBQWEsV0FBTSxZQUFZLFdBQVcsaUJBQU8sWUFBWSxhQUFhLFdBQU07QUFDekcsY0FBTSxXQUFZLFlBQVksTUFBTSxpQkFBaUIsTUFBTSxZQUFZLElBQUksTUFBTSxHQUFHLEdBQUcsQ0FBQztBQUN4RixjQUFNLFFBQVksWUFBWSxNQUFNLGNBQWMsTUFBTSxhQUFhLE1BQU0sYUFBYSxJQUFJLE1BQU0sR0FBRyxHQUFHLENBQUM7QUFDekcsY0FBTSxRQUFZLFdBQVcsTUFBTSxTQUFTLE1BQU0sUUFBUSxRQUFHO0FBQzdELGVBQU87QUFBQSxxRUFDd0QsS0FBSztBQUFBLHFFQUNMLFFBQVEsR0FBRyxTQUFTLFdBQVcsTUFBTSxXQUFNLEVBQUU7QUFBQSxxRUFDN0MsS0FBSyxHQUFHLE1BQU0sV0FBVyxNQUFNLFdBQU0sRUFBRTtBQUFBLHlFQUNuQyxJQUFJLElBQUksV0FBVyxPQUFPLENBQUM7QUFBQTtBQUFBLE1BRWhHLENBQUMsRUFBRSxLQUFLLEVBQUU7QUFDVixTQUFHLFlBQVk7QUFBQTtBQUFBO0FBQUEseUNBR2UsTUFBTSxNQUFNLFlBQVksTUFBTSxXQUFXLElBQUksTUFBTSxFQUFFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLHFCQVlsRSxJQUFJO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFJdkIsUUFBUTtBQUFBLElBQWtCO0FBQUEsRUFDNUI7QUFJQSxpQkFBZSxzQkFBc0I7QUFtQm5DLFVBQU0sTUFBUyxTQUFTLGVBQWUsY0FBYztBQUNyRCxVQUFNLFNBQVMsU0FBUyxlQUFlLGlCQUFpQjtBQUN4RCxVQUFNLFNBQVMsU0FBUyxlQUFlLGlCQUFpQixFQUFFO0FBQzFELFVBQU0sUUFBUyxTQUFTLGVBQWUsZ0JBQWdCLEVBQUU7QUFFekQsUUFBSSxXQUFjO0FBQ2xCLFFBQUksY0FBYztBQUNsQixXQUFPLE1BQU0sVUFBVTtBQUN2QixXQUFPLFlBQWdCO0FBRXZCLFFBQUk7QUFDRixZQUFNLE1BQU8sTUFBTSxNQUFNLGlCQUFpQjtBQUFBLFFBQ3hDLFFBQVM7QUFBQSxRQUNULFNBQVMsRUFBRSxnQkFBZ0IsbUJBQW1CO0FBQUEsUUFDOUMsTUFBUyxLQUFLLFVBQVUsRUFBRSxRQUFRLE1BQU0sQ0FBQztBQUFBLE1BQzNDLENBQUM7QUFDRCxZQUFNLE9BQU8sTUFBTSxJQUFJLEtBQUs7QUFFNUIsVUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLEtBQUssSUFBSTtBQUN2QixlQUFPLE1BQU0sVUFBVTtBQUN2QixlQUFPLFlBQVk7QUFBQTtBQUFBLHlDQUVXLFdBQVcsS0FBSyxTQUFTLGlCQUFpQixDQUFDO0FBQUE7QUFFekUsWUFBSSxXQUFjO0FBQ2xCLFlBQUksY0FBYztBQUNsQjtBQUFBLE1BQ0Y7QUFFQSxZQUFNLFVBQVUsS0FBSyxXQUFXLENBQUM7QUFDakMsWUFBTSxPQUFVLEtBQUssY0FBYyxtQ0FBbUMsV0FBVyxLQUFLLFdBQVcsQ0FBQyxZQUFZO0FBQzlHLFlBQU0sVUFBVSxLQUFLLFlBQ2pCLHlFQUFvRSxXQUFXLEtBQUssU0FBUyxDQUFDLFNBQzlGO0FBQ0osWUFBTSxnQkFBZ0IsUUFBUSxxQkFBcUI7QUFDbkQsWUFBTSxjQUFnQixRQUFRLGdCQUFnQixDQUFDO0FBQy9DLFlBQU1FLFlBQWdCLFFBQVEsYUFBYTtBQUMzQyxZQUFNLGVBQWdCLFFBQVE7QUFDOUIsWUFBTSxjQUFnQixnQkFBZ0IsT0FBTyxnQkFBZ0IsWUFBWSxJQUFJO0FBRTdFLGFBQU8sTUFBTSxVQUFVO0FBQ3ZCLGFBQU8sWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBLGdDQUlTLFdBQVcsTUFBTSxDQUFDO0FBQUEsbUNBQ2YsYUFBYTtBQUFBLFlBQ3BDLHdCQUF3QkEsV0FBVSxXQUFXLENBQUM7QUFBQSxZQUM5QyxjQUFjLHlCQUF5QixXQUFXLFdBQVcsQ0FBQyxVQUFVLEVBQUU7QUFBQSw0QkFDMUQsSUFBSTtBQUFBO0FBQUEsVUFFdEIsT0FBTztBQUFBO0FBR2IsVUFBSSxjQUFjO0FBR2xCLFlBQU0sbUJBQW1CO0FBQUEsSUFDM0IsU0FBUyxLQUFLO0FBQ1osYUFBTyxNQUFNLFVBQVU7QUFDdkIsYUFBTyxZQUFZO0FBQUE7QUFBQSwrQ0FFbUIsV0FBVyxJQUFJLE9BQU8sQ0FBQztBQUFBO0FBRTdELFVBQUksV0FBYztBQUNsQixVQUFJLGNBQWM7QUFBQSxJQUNwQjtBQUFBLEVBQ0Y7QUFJQSxpQkFBZSxxQkFBcUI7QUFDbEMsVUFBTSxVQUFVLFNBQVMsZUFBZSxpQkFBaUI7QUFDekQsWUFBUSxNQUFNLFVBQVU7QUFDeEIsWUFBUSxZQUFZO0FBQUE7QUFBQTtBQUFBO0FBS3BCLFFBQUk7QUFDRixZQUFNLE1BQU8sTUFBTSxNQUFNLHlCQUF5QjtBQUNsRCxZQUFNLE9BQU8sTUFBTSxJQUFJLEtBQUs7QUFFNUIsVUFBSSxDQUFDLEtBQUssSUFBSTtBQUNaLGdCQUFRLFlBQVk7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQkFJWixXQUFXLEtBQUssU0FBUywyQkFBMkIsQ0FBQztBQUFBO0FBRTdEO0FBQUEsTUFDRjtBQUVBLFlBQU0sYUFBYSxLQUFLLGNBQWMsQ0FBQztBQUV2QyxVQUFJLFdBQVcsV0FBVyxHQUFHO0FBQzNCLGdCQUFRLFlBQVk7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFPcEI7QUFBQSxNQUNGO0FBRUEsWUFBTSxZQUFZO0FBQUEsUUFDaEIsaUJBQW9CO0FBQUEsUUFDcEIsV0FBb0I7QUFBQSxRQUNwQixpQkFBb0I7QUFBQSxRQUNwQixxQkFBb0I7QUFBQSxNQUN0QjtBQUVBLFVBQUlILFFBQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFpQlgsaUJBQVcsS0FBSyxZQUFZO0FBQzFCLGNBQU0sT0FBVyxVQUFVLEVBQUUsSUFBSSxLQUFLO0FBQ3RDLGNBQU0sV0FBVyxFQUFFLFlBQVksRUFBRSxhQUFhLHlCQUMxQztBQUFBLGdEQUNzQyxXQUFXLEVBQUUsUUFBUSxDQUFDLFdBQzVEO0FBQ0osUUFBQUEsU0FBUTtBQUFBLDhCQUNnQixXQUFXLEVBQUUsRUFBRSxDQUFDO0FBQUE7QUFBQSxxREFFTyxXQUFXLEVBQUUsRUFBRSxDQUFDO0FBQUEsaUNBQ3BDLFdBQVcsRUFBRSxFQUFFLENBQUM7QUFBQTtBQUFBO0FBQUEsMkJBR3RCLFdBQVcsRUFBRSxJQUFJLENBQUMsS0FBSyxJQUFJO0FBQUEsNEVBQ3NCLFdBQVcsRUFBRSxLQUFLLFFBQVEsTUFBSyxHQUFHLENBQUMsQ0FBQztBQUFBO0FBQUE7QUFBQSw0Q0FHcEUsV0FBVyxFQUFFLEtBQUssQ0FBQztBQUFBLGNBQ2pELFFBQVE7QUFBQSwwRUFDb0QsV0FBVyxFQUFFLFFBQVEsQ0FBQztBQUFBO0FBQUEsd0RBRXhDLFdBQVcsRUFBRSxTQUFTLENBQUM7QUFBQTtBQUFBLE1BRTNFO0FBRUEsTUFBQUEsU0FBUTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWlCUixjQUFRLFlBQVlBO0FBQUEsSUFDdEIsU0FBUyxLQUFLO0FBQ1osY0FBUSxZQUFZO0FBQUE7QUFBQTtBQUFBO0FBQUEsZ0NBSUcsV0FBVyxJQUFJLE9BQU8sQ0FBQztBQUFBO0FBQUEsSUFFaEQ7QUFBQSxFQUNGOzs7QUM3Y0E7QUFBQTtBQUFBLG9DQUFBSTtBQUFBO0FBZUEsTUFBTUMsUUFBTSxVQUFVLGdCQUFnQjtBQUV0QyxpQkFBZUMsNEJBQTJCO0FBQ3hDLFVBQU0sVUFBVSxTQUFTLGVBQWUsa0JBQWtCO0FBQzFELFFBQUksQ0FBQyxRQUFTO0FBRWQsWUFBUSxZQUFZO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQW1CcEIsSUFBQUQsTUFBSSxNQUFNLHFDQUFxQztBQUFBLEVBQ2pEOzs7QUN6Q0E7QUFBQTtBQUFBLCtCQUFBRTtBQUFBO0FBZUEsTUFBTUMsUUFBTSxVQUFVLFdBQVc7QUFFakMsaUJBQWVDLHVCQUFzQjtBQUNuQyxVQUFNLFVBQVUsU0FBUyxlQUFlLGtCQUFrQjtBQUMxRCxRQUFJLENBQUMsUUFBUztBQUVkLFlBQVEsWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFtQnBCLElBQUFELE1BQUksTUFBTSx1Q0FBdUM7QUFBQSxFQUNuRDs7O0FDekNBO0FBQUE7QUFBQTtBQUFBLDhCQUFBRTtBQUFBLElBQUE7QUFBQTtBQUFBO0FBa0JBLE1BQU1DLFFBQU0sVUFBVSxTQUFTO0FBUS9CLE1BQU0sc0JBQXNCO0FBQUEsSUFDMUIsaUJBQXFCLEVBQUUsT0FBTyxzQkFBMEIsTUFBTSxnQkFBTyxNQUFNLEdBQUcsYUFBYSxrQkFBc0I7QUFBQSxJQUNqSCxXQUFxQixFQUFFLE9BQU8sVUFBMEIsTUFBTSxtQkFBUSxNQUFNLEdBQUcsYUFBYSxRQUFzQjtBQUFBLElBQ2xILHFCQUFxQixFQUFFLE9BQU8sVUFBMEIsTUFBTSxtQkFBUSxNQUFNLEdBQUcsYUFBYSxRQUFzQjtBQUFBLElBQ2xILGlCQUFxQixFQUFFLE9BQU8sd0JBQTBCLE1BQU0sYUFBTyxNQUFNLEdBQUcsYUFBYSxrQkFBc0I7QUFBQSxJQUNqSCxtQkFBcUIsRUFBRSxPQUFPLHdCQUEwQixNQUFNLG1CQUFRLE1BQU0sR0FBRyxhQUFhLG9CQUFxQjtBQUFBLEVBQ25IO0FBRUEsTUFBTSw0QkFBNEI7QUFBQSxJQUNoQyxpQkFBc0I7QUFBQSxJQUN0QixPQUFzQjtBQUFBLElBQ3RCLGlCQUFzQjtBQUFBLElBQ3RCLG1CQUFzQjtBQUFBLEVBQ3hCO0FBRUEsTUFBTSx1QkFBdUI7QUFBQSxJQUMzQixXQUFxQjtBQUFBLElBQ3JCLHFCQUFxQjtBQUFBLElBQ3JCLG1CQUFxQjtBQUFBLEVBQ3ZCO0FBRUEsTUFBTSxhQUFhO0FBQUEsSUFDakIsU0FBUyxFQUFFLE9BQU8sV0FBZ0IsTUFBTSxnQkFBTyxPQUFPLFdBQVcsSUFBSSxXQUFXLE1BQU0sRUFBRTtBQUFBLElBQ3hGLE1BQVMsRUFBRSxPQUFPLFFBQWdCLE1BQU0sZ0JBQU8sT0FBTyxXQUFXLElBQUksV0FBVyxNQUFNLEVBQUU7QUFBQSxJQUN4RixNQUFTLEVBQUUsT0FBTyxjQUFnQixNQUFNLFVBQU0sT0FBTyxXQUFXLElBQUksV0FBVyxNQUFNLEVBQUU7QUFBQSxFQUN6RjtBQUVBLE1BQU0sY0FBYztBQUFBLElBQ2xCLE1BQVEsRUFBRSxPQUFPLFFBQVUsT0FBTyxXQUFXLElBQUksV0FBVyxNQUFNLEVBQUU7QUFBQSxJQUNwRSxRQUFRLEVBQUUsT0FBTyxVQUFVLE9BQU8sV0FBVyxJQUFJLFdBQVcsTUFBTSxFQUFFO0FBQUEsSUFDcEUsS0FBUSxFQUFFLE9BQU8sT0FBVSxPQUFPLFdBQVcsSUFBSSxXQUFXLE1BQU0sRUFBRTtBQUFBLElBQ3BFLE1BQVEsRUFBRSxPQUFPLElBQVUsT0FBTyxXQUFXLElBQUksV0FBVyxNQUFNLEVBQUU7QUFBQSxFQUN0RTtBQUlBLFdBQVMsZUFBZSxXQUFXO0FBQ2pDLFdBQU8sb0JBQW9CLFVBQVUsSUFBSSxHQUFHLGVBQWUsVUFBVTtBQUFBLEVBQ3ZFO0FBTUEsV0FBUyxnQkFBZ0IsVUFBVTtBQUNqQyxVQUFNLFNBQVMsQ0FBQztBQUNoQixlQUFXLEtBQUssVUFBVTtBQUN4QixZQUFNLEtBQU8sZUFBZSxDQUFDO0FBQzdCLFlBQU0sTUFBTyxFQUFFLGtCQUFrQjtBQUNqQyxZQUFNLE9BQU8sRUFBRSxjQUFrQjtBQUNqQyxVQUFJLENBQUMsT0FBTyxFQUFFLEVBQWtCLFFBQU8sRUFBRSxJQUFVLENBQUM7QUFDcEQsVUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLEdBQUcsRUFBYSxRQUFPLEVBQUUsRUFBRSxHQUFHLElBQUssQ0FBQztBQUNwRCxVQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBTyxRQUFPLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxJQUFJLENBQUM7QUFDekQsYUFBTyxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUM7QUFBQSxJQUM5QjtBQUNBLFdBQU87QUFBQSxFQUNUO0FBRUEsV0FBUyxXQUFXLEtBQUssV0FBVztBQUNsQyxXQUFPLE9BQU8sS0FBSyxHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUdDLE9BQU07QUFDckMsWUFBTSxLQUFLLFVBQVUsQ0FBQyxHQUFHLFFBQVE7QUFDakMsWUFBTSxLQUFLLFVBQVVBLEVBQUMsR0FBRyxRQUFRO0FBQ2pDLGFBQU8sS0FBSztBQUFBLElBQ2QsQ0FBQztBQUFBLEVBQ0g7QUFPQSxXQUFTLGVBQWUsWUFBWTtBQUNsQyxXQUFPO0FBQUEsRUFDVDtBQUlBLFdBQVMsa0JBQWtCLGNBQWM7QUFDdkMsV0FBTyxhQUFhLEtBQUssT0FBSyxFQUFFLG1CQUFtQixjQUNoRCxFQUFFLGVBQWUsVUFBVSxFQUFFLGVBQWUsU0FBUztBQUFBLEVBQzFEO0FBRUEsV0FBUyxpQkFBaUIsS0FBSyxnQkFBZ0I7QUFDN0MsUUFBSSxRQUFRLFVBQVcsUUFBTztBQUM5QixXQUFPLGVBQWUsS0FBSyxPQUFLLEVBQUUsZUFBZSxVQUFVLEVBQUUsZUFBZSxRQUFRO0FBQUEsRUFDdEY7QUFFQSxXQUFTLGlCQUFpQixLQUFLLE1BQU07QUFDbkMsV0FBTyxRQUFRLGNBQWMsU0FBUyxVQUFVLFNBQVM7QUFBQSxFQUMzRDtBQUlBLFdBQVMsc0JBQXNCLE1BQU07QUFDbkMsVUFBTSxNQUFNLFlBQVksSUFBSSxLQUFLLFlBQVksTUFBTTtBQUNuRCxRQUFJLENBQUMsSUFBSSxNQUFPLFFBQU87QUFDdkIsV0FBTyw2RkFBNkYsSUFBSSxFQUFFLFVBQVUsSUFBSSxLQUFLLHFCQUFxQixJQUFJLEtBQUssMkJBQTJCLElBQUksSUFBSSxLQUFLLENBQUM7QUFBQSxFQUN0TTtBQUVBLFdBQVMsMEJBQTBCLEtBQUs7QUFDdEMsVUFBTSxNQUFNLFdBQVcsR0FBRyxLQUFLLFdBQVcsTUFBTTtBQUNoRCxXQUFPLDhGQUE4RixJQUFJLEVBQUUsVUFBVSxJQUFJLEtBQUsseUJBQXlCLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxLQUFLLENBQUM7QUFBQSxFQUNuTDtBQUVBLFdBQVMsbUJBQW1CLEdBQUcsS0FBSztBQUNsQyxVQUFNLFVBQVksb0JBQW9CLEVBQUUsSUFBSSxLQUFLLENBQUM7QUFDbEQsVUFBTSxXQUFZLEVBQUUsaUJBQWlCLDBCQUEwQixFQUFFLGNBQWMsSUFBSTtBQUNuRixVQUFNLFlBQVksRUFBRSxhQUFhLHNCQUFzQixFQUFFLFVBQVUsSUFBSTtBQUN2RSxVQUFNLGVBQWUsRUFBRSxxQkFBcUIsRUFBRTtBQUU5QyxXQUFPLGtCQUFrQjtBQUFBLE1BQ3ZCLElBQWlCLEVBQUU7QUFBQSxNQUNuQixXQUFpQixRQUFRLFNBQVMsRUFBRTtBQUFBLE1BQ3BDLGlCQUFpQixxQkFBcUIsRUFBRSxJQUFJLEtBQUs7QUFBQSxNQUNqRCxPQUFpQixFQUFFO0FBQUEsTUFDbkIsVUFBaUIsRUFBRTtBQUFBLE1BQ25CLFVBQWlCLEVBQUU7QUFBQSxNQUNuQixZQUFpQixlQUFlLEVBQUUsWUFBWTtBQUFBLE1BQzlDLFlBQWtCLEdBQUcsUUFBUSxHQUFHLFNBQVM7QUFBQSxNQUN6QyxTQUFpQixlQUFlLENBQUM7QUFBQSxJQUNuQyxHQUFHO0FBQUEsTUFDRCxVQUFrQjtBQUFBLE1BQ2xCLGtCQUFrQjtBQUFBLElBQ3BCLENBQUM7QUFBQSxFQUNIO0FBRUEsV0FBUyxxQkFBcUIsS0FBSyxNQUFNLFlBQVk7QUFDbkQsVUFBTSxNQUFXLFlBQVksSUFBSSxLQUFLLFlBQVksTUFBTTtBQUN4RCxVQUFNLFdBQVcsaUJBQWlCLEtBQUssSUFBSTtBQUMzQyxVQUFNLFNBQVcsZ0JBQWdCLEdBQUcsSUFBSSxJQUFJLElBQUksS0FBSyxJQUFJLENBQUM7QUFDMUQsVUFBTSxRQUFXLFdBQVc7QUFFNUIsUUFBSSxDQUFDLElBQUksT0FBTztBQUVkLGFBQU8sV0FBVyxJQUFJLENBQUMsR0FBRyxNQUFNLG1CQUFtQixHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRTtBQUFBLElBQ25FO0FBRUEsVUFBTSxhQUFhLFdBQVcsV0FBTTtBQUNwQyxVQUFNLGFBQWE7QUFBQSxnSEFDMkYsTUFBTTtBQUFBLCtFQUN2QyxJQUFJLEtBQUs7QUFBQSxvQkFDcEUsTUFBTSxVQUFVLFVBQVU7QUFBQSxVQUNwQyxJQUFJLElBQUksS0FBSyxDQUFDO0FBQUEseUZBQ2lFLEtBQUs7QUFBQTtBQUFBO0FBQUEsaUJBRzdFLE1BQU0sWUFBWSxXQUFXLEtBQUssZUFBZTtBQUFBLFFBQzFELFdBQVcsSUFBSSxDQUFDLEdBQUcsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUFBO0FBRWpFLFdBQU87QUFBQSxFQUNUO0FBRUEsV0FBUyxlQUFlLElBQUksS0FBSyxTQUFTO0FBQ3hDLFVBQU0sTUFBTSxXQUFXLEdBQUcsS0FBSyxXQUFXLE1BQU07QUFDaEQsVUFBTSxXQUFXLE9BQU8sT0FBTyxPQUFPLEVBQUUsS0FBSztBQUM3QyxVQUFNLFdBQVcsaUJBQWlCLEtBQUssUUFBUTtBQUMvQyxVQUFNLFVBQVcsZUFBZSxFQUFFLElBQUksR0FBRyxJQUFJLEtBQUssSUFBSSxDQUFDO0FBQ3ZELFVBQU0sUUFBVyxTQUFTO0FBRTFCLFVBQU0sUUFBVyxXQUFXLFNBQVMsV0FBVztBQUNoRCxVQUFNLG1CQUFtQixNQUFNLFNBQVMsS0FBTSxNQUFNLFdBQVcsS0FBSyxZQUFZLE1BQU0sQ0FBQyxDQUFDLEdBQUc7QUFFM0YsVUFBTSxZQUFZLE1BQU0sSUFBSSxVQUFRLHFCQUFxQixLQUFLLE1BQU0sUUFBUSxJQUFJLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRTtBQUUzRixVQUFNLGFBQWEsV0FBVyxXQUFNO0FBQ3BDLFdBQU87QUFBQSxzRUFDNkQsSUFBSSxFQUFFLHFDQUFxQyxPQUFPO0FBQUEsZ0ZBQ3hDLElBQUksS0FBSztBQUFBLG9CQUNyRSxPQUFPLFVBQVUsVUFBVTtBQUFBLFVBQ3JDLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxLQUFLLENBQUM7QUFBQSx5RkFDcUQsS0FBSztBQUFBO0FBQUE7QUFBQSxpQkFHN0UsT0FBTyxZQUFZLFdBQVcsS0FBSyxlQUFlO0FBQUEsUUFDM0QsbUJBQW1CLFlBQVksU0FBUyxJQUFJLENBQUMsR0FBRyxNQUFNLG1CQUFtQixHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDO0FBQUE7QUFBQSxFQUVoRztBQUVBLFdBQVMsZ0JBQWdCLElBQUksUUFBUSxpQkFBaUI7QUFDcEQsVUFBTSxNQUFXLG9CQUFvQixFQUFFLEtBQUssRUFBRSxPQUFPLElBQUksTUFBTSxhQUFNLE1BQU0sR0FBRztBQUM5RSxVQUFNLFdBQVcsa0JBQWtCLGVBQWU7QUFDbEQsVUFBTSxVQUFXLGdCQUFnQixFQUFFLElBQUksS0FBSyxJQUFJLENBQUM7QUFDakQsVUFBTSxRQUFXLGdCQUFnQjtBQUNqQyxVQUFNLE9BQVcsMEJBQTBCLEVBQUUsS0FBSztBQUVsRCxVQUFNLE9BQWMsV0FBVyxRQUFRLFVBQVU7QUFDakQsVUFBTSxrQkFBa0IsS0FBSyxTQUFTO0FBRXRDLFVBQU0sWUFBWSxLQUFLLElBQUksU0FBTztBQUNoQyxVQUFJLENBQUMsaUJBQWlCO0FBRXBCLGNBQU0sVUFBVyxPQUFPLEdBQUc7QUFDM0IsY0FBTSxRQUFXLFdBQVcsU0FBUyxXQUFXO0FBQ2hELGNBQU0sV0FBVyxNQUFNLFNBQVMsS0FBTSxNQUFNLFdBQVcsS0FBSyxZQUFZLE1BQU0sQ0FBQyxDQUFDLEdBQUc7QUFDbkYsZUFBTyxXQUNILE1BQU0sSUFBSSxVQUFRLHFCQUFxQixLQUFLLE1BQU0sUUFBUSxJQUFJLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUN6RSxRQUFRLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUU7QUFBQSxNQUN2RTtBQUNBLGFBQU8sZUFBZSxJQUFJLEtBQUssT0FBTyxHQUFHLENBQUM7QUFBQSxJQUM1QyxDQUFDLEVBQUUsS0FBSyxFQUFFO0FBRVYsVUFBTSxhQUFhLFdBQVcsV0FBTTtBQUNwQyxXQUFPO0FBQUE7QUFBQTtBQUFBLDRDQUdtQyxPQUFPO0FBQUEsMENBQ1QsSUFBSSxJQUFJO0FBQUE7QUFBQTtBQUFBLHdCQUcxQixPQUFPLFVBQVUsVUFBVTtBQUFBLGNBQ3JDLElBQUksSUFBSSxLQUFLLENBQUM7QUFBQSw2RkFDaUUsS0FBSztBQUFBO0FBQUEsWUFFdEYsT0FBTywrREFBK0QsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO0FBQUE7QUFBQTtBQUFBLGlCQUd2RixPQUFPLFlBQVksV0FBVyxLQUFLLGVBQWU7QUFBQTtBQUFBLFlBRXZELFNBQVM7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlyQjtBQUVBLFdBQVMscUJBQXFCLFVBQVUsWUFBWSxlQUFlO0FBQ2pFLFVBQU0sU0FBUyxnQkFBZ0IsUUFBUTtBQUN2QyxVQUFNLFNBQVMsV0FBVyxRQUFRLE9BQU87QUFBQSxNQUN2QyxPQUFPLFFBQVEsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLENBQUNDLElBQUdDLEVBQUMsTUFBTSxDQUFDQSxHQUFFLGFBQWFBLEVBQUMsQ0FBQztBQUFBLElBQ3hFLENBQUM7QUFFRCxVQUFNLGFBQWEsU0FBUztBQUU1QixVQUFNLGtCQUFrQixDQUFDLGFBQ3JCO0FBQUEsK0NBQytCLGdCQUFnQixLQUFLLElBQUksYUFBYSxDQUFDLEtBQUssRUFBRTtBQUFBO0FBQUEsZ0JBRzdFO0FBRUosVUFBTSxlQUFlLE9BQU8sSUFBSSxRQUFNO0FBQ3BDLFlBQU0sU0FBYyxPQUFPLEVBQUU7QUFDN0IsWUFBTSxhQUFjLE9BQU8sT0FBTyxNQUFNLEVBQUUsUUFBUSxhQUFXLE9BQU8sT0FBTyxPQUFPLEVBQUUsS0FBSyxDQUFDO0FBQzFGLGFBQU8sZ0JBQWdCLElBQUksUUFBUSxVQUFVO0FBQUEsSUFDL0MsQ0FBQyxFQUFFLEtBQUssRUFBRTtBQUVWLFdBQU87QUFBQTtBQUFBO0FBQUE7QUFBQSwyQ0FJa0MsVUFBVSxhQUFhLGVBQWUsSUFBSSxLQUFLLEdBQUc7QUFBQTtBQUFBLE1BRXZGLGVBQWU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFVBV1gsVUFBVSxhQUFhLGVBQWUsSUFBSSxNQUFNLEVBQUU7QUFBQTtBQUFBO0FBQUEsTUFHdEQsWUFBWTtBQUFBO0FBQUEsRUFFbEI7QUFFQSxXQUFTLHVCQUF1QjtBQUM5QixXQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPVDtBQUlBLGlCQUFlLGtCQUFrQjtBQUMvQixVQUFNLE1BQU8sTUFBTSxNQUFNLHlCQUF5QjtBQUNsRCxVQUFNLE9BQU8sTUFBTSxJQUFJLEtBQUs7QUFDNUIsV0FBTztBQUFBLEVBQ1Q7QUFFQSxpQkFBZSxjQUFjLGVBQWUsT0FBTztBQUNqRCxVQUFNLE1BQU8sTUFBTSxNQUFNLHdCQUF3QjtBQUFBLE1BQy9DLFFBQVM7QUFBQSxNQUNULFNBQVMsRUFBRSxnQkFBZ0IsbUJBQW1CO0FBQUEsTUFDOUMsTUFBUyxLQUFLLFVBQVUsRUFBRSxlQUFlLGFBQWEsQ0FBQztBQUFBLElBQ3pELENBQUM7QUFDRCxVQUFNLE9BQU8sTUFBTSxJQUFJLEtBQUs7QUFDNUIsV0FBTztBQUFBLEVBQ1Q7QUFJQSxXQUFTLHFCQUFxQixJQUFJO0FBQ2hDLFVBQU0sS0FBTyxTQUFTLGVBQWUsRUFBRTtBQUN2QyxVQUFNLE9BQU8sU0FBUyxlQUFlLEdBQUcsRUFBRSxPQUFPO0FBQ2pELFFBQUksQ0FBQyxHQUFJO0FBQ1QsVUFBTSxTQUFTLEdBQUcsTUFBTSxZQUFZO0FBQ3BDLE9BQUcsTUFBTSxVQUFVLFNBQVMsS0FBSztBQUNqQyxRQUFJLEtBQU0sTUFBSyxjQUFjLFNBQVMsV0FBTTtBQUFBLEVBQzlDO0FBSUEsaUJBQWVDLHNCQUFxQjtBQUNsQyxVQUFNLFVBQVUsU0FBUyxlQUFlLGtCQUFrQjtBQUMxRCxRQUFJLENBQUMsUUFBUztBQUVkLFlBQVEsWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFPcEIsUUFBSSxhQUFhLENBQUM7QUFDbEIsUUFBSSxhQUFhO0FBQ2pCLFFBQUksV0FBYSxDQUFDO0FBQ2xCLFFBQUksZ0JBQWdCO0FBRXBCLFFBQUk7QUFDRixZQUFNLFdBQVcsTUFBTSxnQkFBZ0I7QUFDdkMsVUFBSSxDQUFDLFNBQVMsSUFBSTtBQUNoQixnQkFBUSxZQUFZLDhGQUF1RixJQUFJLFNBQVMsU0FBUyxlQUFlLENBQUM7QUFDako7QUFBQSxNQUNGO0FBQ0EsbUJBQWEsU0FBUyxjQUFjLENBQUM7QUFBQSxJQUN2QyxTQUFTLEtBQUs7QUFDWixNQUFBSixNQUFJLE1BQU0sK0NBQStDLEdBQUc7QUFDNUQsY0FBUSxZQUFZO0FBQ3BCO0FBQUEsSUFDRjtBQUVBLFFBQUksV0FBVyxXQUFXLEdBQUc7QUFDM0IsY0FBUSxZQUFZLHFCQUFxQjtBQUN6QztBQUFBLElBQ0Y7QUFFQSxRQUFJO0FBQ0YsWUFBTSxlQUFlLE1BQU0sY0FBYyxLQUFLO0FBQzlDLFVBQUksYUFBYSxJQUFJO0FBQ25CLHFCQUFhO0FBQ2IsbUJBQWEsYUFBYSxZQUFZLENBQUM7QUFBQSxNQUN6QyxPQUFPO0FBQ0wsd0JBQWdCLGFBQWEsU0FBUztBQUN0QyxRQUFBQSxNQUFJLEtBQUssdUNBQXVDLGFBQWE7QUFBQSxNQUMvRDtBQUFBLElBQ0YsU0FBUyxLQUFLO0FBQ1osTUFBQUEsTUFBSSxNQUFNLDZDQUE2QyxHQUFHO0FBQzFELHNCQUFnQixJQUFJO0FBQUEsSUFDdEI7QUFFQSxVQUFNLGVBQWUsT0FBTyxZQUFZLFNBQVMsSUFBSSxPQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ3BFLFVBQU0sV0FBVyxXQUFXLElBQUksUUFBTTtBQUFBLE1BQ3BDLEdBQUc7QUFBQSxNQUNILGdCQUFtQixhQUFhLEVBQUUsRUFBRSxHQUFHLGtCQUFrQjtBQUFBLE1BQ3pELFlBQW1CLGFBQWEsRUFBRSxFQUFFLEdBQUcsY0FBa0I7QUFBQSxNQUN6RCxXQUFtQixhQUFhLEVBQUUsRUFBRSxHQUFHLGFBQWtCO0FBQUEsTUFDekQsbUJBQW1CO0FBQUEsSUFDckIsRUFBRTtBQUVGLFlBQVEsWUFBWSxxQkFBcUIsVUFBVSxZQUFZLGFBQWE7QUFDNUUsK0JBQTJCLFNBQVMsU0FBUztBQUFBLEVBQy9DO0FBRUEsaUJBQWUseUJBQXlCO0FBQ3RDLFVBQU0sVUFBVSxTQUFTLGVBQWUsa0JBQWtCO0FBQzFELFFBQUksQ0FBQyxRQUFTO0FBR2QsVUFBTSxXQUFXLFNBQVMsZUFBZSxtQkFBbUI7QUFDNUQsUUFBSSxTQUFVLFVBQVMsV0FBVztBQUdsQyxRQUFJO0FBQ0YsWUFBTSxXQUFXLE1BQU0sZ0JBQWdCO0FBQ3ZDLFlBQU0sYUFBYyxTQUFTLE1BQU0sU0FBUyxhQUFjLFNBQVMsYUFBYSxDQUFDO0FBRWpGLFVBQUksV0FBVyxXQUFXLEdBQUc7QUFDM0IsZ0JBQVEsWUFBWSxxQkFBcUI7QUFDekM7QUFBQSxNQUNGO0FBRUEsVUFBSSxhQUFhO0FBQ2pCLFVBQUksV0FBYSxDQUFDO0FBQ2xCLFVBQUksZ0JBQWdCO0FBQ3BCLFVBQUk7QUFDRixjQUFNLGVBQWUsTUFBTSxjQUFjLElBQUk7QUFDN0MsWUFBSSxhQUFhLElBQUk7QUFDbkIsdUJBQWE7QUFDYixxQkFBYSxhQUFhLFlBQVksQ0FBQztBQUFBLFFBQ3pDLE9BQU87QUFDTCwwQkFBZ0IsYUFBYSxTQUFTO0FBQUEsUUFDeEM7QUFBQSxNQUNGLFNBQVMsS0FBSztBQUNaLHdCQUFnQixJQUFJO0FBQUEsTUFDdEI7QUFFQSxZQUFNLGVBQWUsT0FBTyxZQUFZLFNBQVMsSUFBSSxPQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ3BFLFlBQU0sV0FBVyxXQUFXLElBQUksUUFBTTtBQUFBLFFBQ3BDLEdBQUc7QUFBQSxRQUNILGdCQUFtQixhQUFhLEVBQUUsRUFBRSxHQUFHLGtCQUFrQjtBQUFBLFFBQ3pELFlBQW1CLGFBQWEsRUFBRSxFQUFFLEdBQUcsY0FBa0I7QUFBQSxRQUN6RCxXQUFtQixhQUFhLEVBQUUsRUFBRSxHQUFHLGFBQWtCO0FBQUEsUUFDekQsbUJBQW1CO0FBQUEsTUFDckIsRUFBRTtBQUVGLGNBQVEsWUFBWSxxQkFBcUIsVUFBVSxZQUFZLGFBQWE7QUFDNUUsaUNBQTJCLFNBQVMsU0FBUztBQUFBLElBQy9DLFNBQVMsS0FBSztBQUNaLE1BQUFBLE1BQUksTUFBTSxrQ0FBa0MsR0FBRztBQUFBLElBQ2pEO0FBQUEsRUFDRjtBQUVBLGlCQUFlLHlCQUF5QjtBQUN0QyxVQUFNLGFBQWMsU0FBUyxpQkFBaUIsZ0NBQWdDO0FBQzlFLFVBQU0sY0FBYyxNQUFNLEtBQUssVUFBVSxFQUFFLElBQUksUUFBTSxHQUFHLFFBQVEsU0FBUztBQUN6RSxVQUFNLFlBQWMsU0FBUyxlQUFlLGdCQUFnQjtBQUM1RCxVQUFNLFdBQWMsU0FBUyxlQUFlLG1CQUFtQjtBQUUvRCxRQUFJLFlBQVksV0FBVyxHQUFHO0FBQzVCLFVBQUksVUFBVyxXQUFVLFlBQVk7QUFDckM7QUFBQSxJQUNGO0FBRUEsVUFBTSxZQUFZLE9BQU8sT0FBTyxxQkFBcUIsYUFDakQ7QUFBQSxNQUNFLFdBQVcsWUFBWSxNQUFNLFFBQVEsWUFBWSxXQUFXLElBQUksTUFBTSxFQUFFO0FBQUEsTUFDeEU7QUFBQSxJQUNGLElBQ0EsUUFBUSxRQUFRLE9BQU8sUUFBUSxXQUFXLFlBQVksTUFBTTtBQUFBO0FBQUEsaUVBQTRGLENBQUM7QUFFN0osUUFBSSxDQUFDLFVBQVc7QUFFaEIsUUFBSSxVQUFVO0FBQUUsZUFBUyxXQUFXO0FBQU0sZUFBUyxjQUFjO0FBQUEsSUFBYTtBQUM5RSxRQUFJLFVBQVcsV0FBVSxZQUFZO0FBRXJDLFFBQUk7QUFDRixZQUFNLE1BQU8sTUFBTSxNQUFNLHNCQUFzQjtBQUFBLFFBQzdDLFFBQVM7QUFBQSxRQUNULFNBQVMsRUFBRSxnQkFBZ0IsbUJBQW1CO0FBQUEsUUFDOUMsTUFBUyxLQUFLLFVBQVUsRUFBRSxjQUFjLFlBQVksQ0FBQztBQUFBLE1BQ3ZELENBQUM7QUFDRCxZQUFNLE9BQU8sTUFBTSxJQUFJLEtBQUs7QUFFNUIsVUFBSSxDQUFDLEtBQUssSUFBSTtBQUNaLFlBQUksVUFBVyxXQUFVLFlBQVksMENBQTBDLElBQUksS0FBSyxTQUFTLGVBQWUsQ0FBQztBQUNqSDtBQUFBLE1BQ0Y7QUFFQSxZQUFNLGVBQWUsS0FBSyxpQkFBaUI7QUFDM0MsWUFBTSxhQUFlLEtBQUssY0FBZ0IsWUFBWSxJQUFJLEtBQUssV0FBVyxDQUFDLE1BQU07QUFDakYsWUFBTSxhQUFlLEtBQUssY0FBZ0IsMEJBQTBCLElBQUksS0FBSyxXQUFXLENBQUMsYUFBYTtBQUN0RyxZQUFNLGFBQWUsS0FBSyxZQUN0QiwrRUFBcUUsSUFBSSxLQUFLLFdBQVcsV0FBVyxLQUFLLFNBQVMsQ0FBQyxTQUNuSDtBQUVKLFVBQUksV0FBVztBQUNiLGtCQUFVLFlBQVk7QUFBQTtBQUFBO0FBQUEscUJBR1osWUFBWSxRQUFRLGlCQUFpQixJQUFJLE1BQU0sRUFBRSx3QkFBd0IsVUFBVTtBQUFBO0FBQUEsWUFFdkYsYUFBYSw2REFBNkQsVUFBVSxTQUFTLEVBQUU7QUFBQSxZQUMvRixVQUFVO0FBQUE7QUFBQSxNQUVsQjtBQUdBLGlCQUFXLE1BQU0sYUFBYTtBQUM1QixjQUFNLEtBQUssU0FBUyxlQUFlLGVBQWUsRUFBRSxFQUFFO0FBQ3RELFlBQUksSUFBSTtBQUFFLGFBQUcsV0FBVztBQUFNLGFBQUcsVUFBVTtBQUFBLFFBQU87QUFDbEQsY0FBTSxNQUFNLFNBQVMsZUFBZSxlQUFlLEVBQUUsRUFBRTtBQUN2RCxZQUFJLElBQUssS0FBSSxNQUFNLFVBQVU7QUFBQSxNQUMvQjtBQUFBLElBQ0YsU0FBUyxLQUFLO0FBQ1osTUFBQUEsTUFBSSxNQUFNLGtDQUFrQyxHQUFHO0FBQy9DLFVBQUksVUFBVyxXQUFVLFlBQVksMkNBQTJDLElBQUksSUFBSSxPQUFPLENBQUM7QUFBQSxJQUNsRyxVQUFFO0FBQ0EsVUFBSSxVQUFVO0FBQUUsaUJBQVMsV0FBVztBQUFPLGlCQUFTLGNBQWM7QUFBQSxNQUFpQztBQUFBLElBQ3JHO0FBQUEsRUFDRjs7O0FDamdCQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLHdDQUFBSztBQUFBLElBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLDZCQUFBQztBQUFBLElBQUE7QUFBQTtBQUFBLHVDQUFBQztBQUFBLElBQUE7QUFBQTtBQUFBO0FBMkJBLE1BQU0sa0JBQWtCO0FBQ3hCLE1BQU0sa0JBQWtCO0FBRXhCLE1BQUksY0FBYyxNQUFNO0FBQUUsUUFBSTtBQUFFLGFBQU8sYUFBYSxRQUFRLGVBQWUsS0FBSztBQUFBLElBQWdCLFNBQVNDLElBQUc7QUFBRSxhQUFPO0FBQUEsSUFBZ0I7QUFBQSxFQUFFLEdBQUc7QUFDMUksTUFBSSxjQUFjLE1BQU07QUFBRSxRQUFJO0FBQUUsYUFBTyxhQUFhLFFBQVEsZUFBZSxLQUFLO0FBQUEsSUFBZ0IsU0FBU0EsSUFBRztBQUFFLGFBQU87QUFBQSxJQUFnQjtBQUFBLEVBQUUsR0FBRztBQUUxSSxNQUFJLGlCQUFpQixDQUFDO0FBQ3RCLE1BQUksZ0JBQWlCLENBQUM7QUFJdEIsV0FBUyx5QkFBeUIsZ0JBQWdCO0FBQ2hELFFBQUksQ0FBQyxlQUFlLFFBQVE7QUFDMUIsYUFBTztBQUFBLElBQ1Q7QUFFQSxVQUFNLG1CQUFtQiwwQkFBMEI7QUFFbkQsV0FBTyxzQ0FBc0MsZUFBZSxJQUFJLGFBQVc7QUFDekUsWUFBTSxZQUFZLDhCQUE4QixTQUFTLEVBQUUsaUJBQWlCLENBQUM7QUFDN0UsWUFBTSxXQUFXLGFBQWEsbUJBQW1CLFFBQVEsY0FBYyxFQUFFLENBQUM7QUFDMUUsWUFBTSxhQUFhLFVBQVUsWUFDekIsMkVBQ0EsMENBQTBDLFFBQVE7QUFDdEQsYUFBTztBQUFBO0FBQUE7QUFBQTtBQUFBLHNCQUlXLFdBQVcsUUFBUSxpQkFBaUIsVUFBVSxDQUFDO0FBQUEsK0NBQ3RCLFVBQVUsU0FBUyw2Q0FBNkMsV0FBVyxVQUFVLEtBQUssQ0FBQztBQUFBO0FBQUE7QUFBQSxjQUc1SCxXQUFXLHdCQUF3QixRQUFRLEtBQUssQ0FBQyxDQUFDLGlCQUFjLFdBQVcsdUJBQXVCLFFBQVEsT0FBTyxDQUFDLENBQUMsdUJBQW9CLFdBQVcsdUJBQXVCLFFBQVEsYUFBYSxDQUFDLENBQUM7QUFBQTtBQUFBO0FBQUEsZ0RBRzlKLFVBQVU7QUFBQTtBQUFBLElBRXhELENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUFBLEVBQ2I7QUFFQSxXQUFTLHdCQUF3QixlQUFlLEVBQUUsb0JBQW9CLE1BQU0sSUFBSSxDQUFDLEdBQUc7QUFDbEYsUUFBSSxDQUFDLGNBQWMsUUFBUTtBQUN6QixhQUFPO0FBQUEsSUFDVDtBQUVBLGFBQVNDLDRCQUEyQixhQUFhO0FBQy9DLFVBQUksQ0FBQyxZQUFhLFFBQU87QUFDekIsWUFBTSxXQUFXLE9BQU8sV0FBVztBQUNuQyxZQUFNLFFBQVEsU0FBUyxNQUFNLE9BQU8sRUFBRSxPQUFPLE9BQU87QUFDcEQsVUFBSSxNQUFNLFNBQVMsRUFBRyxRQUFPO0FBRTdCLFlBQU0sVUFBVSxNQUFNLE1BQU0sU0FBUyxDQUFDO0FBQ3RDLFlBQU0sUUFBUSxRQUFRLE1BQU0saURBQWlEO0FBQzdFLFVBQUksQ0FBQyxNQUFPLFFBQU87QUFFbkIsWUFBTSxDQUFDLEVBQUUsTUFBTSxPQUFPLEtBQUssTUFBTSxRQUFRLE1BQU0sSUFBSTtBQUNuRCxhQUFPLEdBQUcsSUFBSSxJQUFJLEtBQUssSUFBSSxHQUFHLElBQUksSUFBSSxJQUFJLE1BQU0sSUFBSSxNQUFNO0FBQUEsSUFDNUQ7QUFFQSxXQUFPLHNDQUFzQyxjQUFjLElBQUksQ0FBQyxTQUFTLFVBQVU7QUFDakYsWUFBTSxjQUFjLFdBQVcsUUFBUSxRQUFRLEVBQUU7QUFDakQsWUFBTSxhQUFhQSw0QkFBMkIsUUFBUSxJQUFJO0FBQzFELFlBQU0sZUFBZSxhQUFhLHVCQUF1QixVQUFVLElBQUk7QUFDdkUsWUFBTSxhQUFhLHVCQUF1QixRQUFRLFNBQVM7QUFDM0QsWUFBTSxZQUFZLGVBQWUsV0FBTSxLQUFLLGVBQVksV0FBVyxVQUFVLENBQUM7QUFDOUUsWUFBTSxpQkFBaUIsb0JBQ25CO0FBQUEsd0RBQ2dELFdBQVcsa0JBQWtCLEtBQUs7QUFBQSx3REFDbEMsV0FBVywrRkFDM0Q7QUFFSixhQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUEsa0NBSXVCLEtBQUssS0FBSyxXQUFXLFFBQVEsaUJBQWlCLFVBQVUsQ0FBQztBQUFBO0FBQUE7QUFBQSwrQkFHNUQsS0FBSztBQUFBLGtDQUNGLEtBQUssd0JBQXdCLFdBQVcsUUFBUSxpQkFBaUIsRUFBRSxDQUFDLHdDQUF3QyxXQUFXLGtCQUFrQixLQUFLO0FBQUEsbUVBQzdHLFdBQVcsa0JBQWtCLEtBQUs7QUFBQSxrRUFDbkMsS0FBSztBQUFBO0FBQUE7QUFBQSxjQUd6RCxXQUFXLHdCQUF3QixRQUFRLEtBQUssQ0FBQyxDQUFDLGlCQUFjLFdBQVcsWUFBWSxDQUFDLEdBQUcsU0FBUztBQUFBO0FBQUE7QUFBQTtBQUFBLHdEQUkxRCxXQUFXO0FBQUEsWUFDdkQsY0FBYztBQUFBO0FBQUE7QUFBQSxJQUd4QixDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUM7QUFBQSxFQUNiO0FBRUEsV0FBUywrQkFBK0IsZ0JBQWdCLGVBQWUsRUFBRSx5QkFBeUIsTUFBTSxJQUFJLENBQUMsR0FBRztBQUM5RyxVQUFNLG1CQUFtQix5QkFDckIseURBQ0E7QUFFSixXQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsVUFPQyx5QkFBeUIsY0FBYyxDQUFDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSx3REFLTSxnQkFBZ0I7QUFBQTtBQUFBLFVBRTlELHdCQUF3QixlQUFlLEVBQUUsbUJBQW1CLHVCQUF1QixDQUFDLENBQUM7QUFBQTtBQUFBO0FBQUEsRUFHL0Y7QUFFQSxXQUFTSiw4QkFBNkIsU0FBUyxDQUFDLEdBQUc7QUFDakQsVUFBTSxRQUFRLDBCQUEwQixNQUFNO0FBQzlDLFVBQU0sa0JBQWtCLFNBQVMsZUFBZSx3QkFBd0I7QUFDeEUsVUFBTSxjQUFjLFNBQVMsZUFBZSxzQkFBc0I7QUFDbEUsVUFBTSxhQUFhLFNBQVMsZUFBZSxxQkFBcUI7QUFDaEUsVUFBTSxhQUFhLFFBQVEsMEJBQTBCLENBQUM7QUFFdEQsUUFBSSxnQkFBaUIsaUJBQWdCLGNBQWM7QUFDbkQsUUFBSSxZQUFhLGFBQVksVUFBVSxPQUFPLHFCQUFxQixVQUFVO0FBQzdFLFFBQUksWUFBWTtBQUNkLGlCQUFXLGNBQWMsYUFBYSxvQkFBb0IsS0FBSyxLQUFLO0FBQUEsSUFDdEU7QUFBQSxFQUNGO0FBSUEsV0FBU0UsNkJBQTRCLFVBQVUsNkRBQTZEO0FBQzFHLFdBQU8sSUFBSSxRQUFRLGFBQVc7QUFDNUIsWUFBTSxVQUFVLFNBQVMsZUFBZSw0QkFBNEI7QUFDcEUsWUFBTSxZQUFZLFNBQVMsZUFBZSw0QkFBNEI7QUFDdEUsWUFBTSxtQkFBbUIsU0FBUyxlQUFlLDhCQUE4QjtBQUMvRSxZQUFNLGdCQUFnQixTQUFTLGVBQWUsMkJBQTJCO0FBQ3pFLFlBQU0sY0FBYyxTQUFTLGVBQWUsd0JBQXdCO0FBQ3BFLFVBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLG9CQUFvQixDQUFDLGlCQUFpQixDQUFDLGFBQWE7QUFDakYsZ0JBQVEsV0FBVztBQUNuQjtBQUFBLE1BQ0Y7QUFFQSxZQUFNLFVBQVUsQ0FBQyxXQUFXO0FBQzFCLGdCQUFRLE1BQU0sVUFBVTtBQUN4QixxQkFBYTtBQUNiLHlCQUFpQixVQUFVO0FBQzNCLHNCQUFjLFVBQVU7QUFDeEIsb0JBQVksVUFBVTtBQUN0QixnQkFBUSxNQUFNO0FBQUEsTUFDaEI7QUFFQSxnQkFBVSxjQUFjO0FBQ3hCLGNBQVEsTUFBTSxVQUFVO0FBQ3hCLGFBQU8sNkJBQTZCLFNBQVM7QUFDN0Msc0JBQWdCLDRCQUE0QjtBQUM1QyxnQkFBVSw0QkFBNEI7QUFFdEMsdUJBQWlCLFVBQVUsTUFBTSxRQUFRLFdBQVc7QUFDcEQsb0JBQWMsVUFBVSxNQUFNLFFBQVEsS0FBSztBQUMzQyxrQkFBWSxVQUFVLE1BQU0sUUFBUSxVQUFVO0FBQUEsSUFDaEQsQ0FBQztBQUFBLEVBQ0g7QUFFQSxXQUFTLDZCQUE2QixTQUFTLGFBQWE7QUFDMUQsVUFBTSxVQUFVLFNBQVMsZUFBZSw0QkFBNEI7QUFDcEUsUUFBSSxRQUFTLFNBQVEsTUFBTSxVQUFVO0FBQ3JDLGlCQUFhO0FBQ2IsVUFBTSxtQkFBbUIsU0FBUyxlQUFlLDhCQUE4QjtBQUMvRSxRQUFJLG9CQUFvQixPQUFPLGlCQUFpQixZQUFZLFlBQVk7QUFDdEUsdUJBQWlCLFFBQVE7QUFDekI7QUFBQSxJQUNGO0FBQ0EsV0FBTztBQUFBLEVBQ1Q7QUFJQSxXQUFTLFdBQVcsS0FBSztBQUN2QixRQUFJLGVBQWUsS0FBSztBQUN0QixtQkFBYSxlQUFlLFFBQVEsU0FBUztBQUFBLElBQy9DLE9BQU87QUFDTCxtQkFBYTtBQUNiLG1CQUFhLFFBQVEsaUJBQWlCLFNBQVM7QUFBQSxJQUNqRDtBQUNBLFFBQUk7QUFDRixtQkFBYSxRQUFRLGlCQUFpQixVQUFVO0FBQ2hELG1CQUFhLFFBQVEsaUJBQWlCLFVBQVU7QUFBQSxJQUNsRCxTQUFTQyxJQUFHO0FBQUEsSUFBNEI7QUFDeEMsaUNBQTZCO0FBQUEsRUFDL0I7QUFFQSxXQUFTLDJCQUEyQixhQUFhO0FBQy9DLFFBQUksQ0FBQyxZQUFhLFFBQU87QUFDekIsVUFBTSxXQUFXLE9BQU8sV0FBVztBQUNuQyxVQUFNLFFBQVcsU0FBUyxNQUFNLE9BQU8sRUFBRSxPQUFPLE9BQU87QUFDdkQsUUFBSSxNQUFNLFNBQVMsRUFBRyxRQUFPO0FBQzdCLFVBQU0sVUFBVyxNQUFNLE1BQU0sU0FBUyxDQUFDO0FBQ3ZDLFVBQU0sUUFBVyxRQUFRLE1BQU0saURBQWlEO0FBQ2hGLFFBQUksQ0FBQyxNQUFPLFFBQU87QUFDbkIsVUFBTSxDQUFDLEVBQUUsTUFBTSxPQUFPLEtBQUssTUFBTSxRQUFRLE1BQU0sSUFBSTtBQUNuRCxXQUFPLEdBQUcsSUFBSSxJQUFJLEtBQUssSUFBSSxHQUFHLElBQUksSUFBSSxJQUFJLE1BQU0sSUFBSSxNQUFNO0FBQUEsRUFDNUQ7QUFFQSxXQUFTLDJCQUEyQixnQkFBZ0IsZUFBZTtBQUNqRSxVQUFNLG1CQUFtQiwwQkFBMEI7QUFDbkQsVUFBTSxPQUFPLENBQUM7QUFFZCxlQUFXLEtBQUssZ0JBQWdCO0FBQzlCLFlBQU0sWUFBWSw4QkFBOEIsR0FBRyxFQUFFLGlCQUFpQixDQUFDO0FBQ3ZFLFdBQUssS0FBSztBQUFBLFFBQ1IsTUFBbUI7QUFBQSxRQUNuQixNQUFvQixFQUFFLGlCQUFpQjtBQUFBLFFBQ3ZDLFNBQW9CLEVBQUUsV0FBVztBQUFBLFFBQ2pDLE9BQW9CLEVBQUUsU0FBaUI7QUFBQSxRQUN2QyxtQkFBb0IsRUFBRSxzQkFBc0I7QUFBQSxRQUM1QyxVQUFvQixFQUFFLGFBQWE7QUFBQSxRQUNuQyxjQUFvQixFQUFFLGdCQUFpQixJQUFJLEtBQUssRUFBRSxhQUFhLElBQUk7QUFBQSxRQUNuRSxTQUFvQixFQUFFLFVBQWlCLElBQUksS0FBSyxFQUFFLE9BQU8sSUFBVTtBQUFBLFFBQ25FO0FBQUEsUUFDQSxXQUFvQixFQUFFO0FBQUEsUUFDdEIsTUFBb0I7QUFBQSxRQUNwQixLQUFvQjtBQUFBLE1BQ3RCLENBQUM7QUFBQSxJQUNIO0FBRUEsa0JBQWMsUUFBUSxDQUFDLEdBQUcsUUFBUTtBQUNoQyxZQUFNLGFBQWEsMkJBQTJCLEVBQUUsSUFBSTtBQUNwRCxXQUFLLEtBQUs7QUFBQSxRQUNSLE1BQW1CO0FBQUEsUUFDbkIsTUFBb0IsRUFBRSxpQkFBaUI7QUFBQSxRQUN2QyxTQUFvQixFQUFFLFdBQVc7QUFBQSxRQUNqQyxPQUFvQixFQUFFLFNBQWlCO0FBQUEsUUFDdkMsbUJBQW9CLEVBQUUsc0JBQXNCO0FBQUEsUUFDNUMsT0FBb0IsRUFBRSxTQUFTO0FBQUEsUUFDL0IsVUFBb0IsRUFBRSxhQUFhO0FBQUEsUUFDbkMsY0FBb0IsRUFBRSxZQUFhLElBQUksS0FBSyxFQUFFLFNBQVMsSUFBSztBQUFBLFFBQzVELFNBQW9CLGFBQWUsSUFBSSxLQUFLLFVBQVUsSUFBTTtBQUFBLFFBQzVELFdBQW9CO0FBQUEsUUFDcEIsV0FBb0I7QUFBQSxRQUNwQixNQUFvQixFQUFFO0FBQUEsUUFDdEI7QUFBQSxNQUNGLENBQUM7QUFBQSxJQUNILENBQUM7QUFFRCxXQUFPO0FBQUEsRUFDVDtBQUVBLFdBQVMsaUJBQWlCLE1BQU0sS0FBSyxLQUFLO0FBQ3hDLFdBQU8sQ0FBQyxHQUFHLElBQUksRUFBRSxLQUFLLENBQUMsR0FBR0UsT0FBTTtBQUM5QixVQUFJLElBQUk7QUFDUixjQUFRLEtBQUs7QUFBQSxRQUNYLEtBQUs7QUFDSCxnQkFBTSxFQUFFLFFBQVEsSUFBSSxZQUFZO0FBQ2hDLGdCQUFNQSxHQUFFLFFBQVEsSUFBSSxZQUFZO0FBQ2hDLGlCQUFPLFFBQVEsUUFBUSxHQUFHLGNBQWMsRUFBRSxJQUFJLEdBQUcsY0FBYyxFQUFFO0FBQUEsUUFDbkUsS0FBSyxVQUFVO0FBQ2IsZ0JBQU0sT0FBTyxPQUFLLEVBQUUsU0FBUyxXQUFZLEVBQUUsV0FBVyxZQUFZLElBQUksSUFBSztBQUMzRSxlQUFLLEtBQUssQ0FBQztBQUFHLGVBQUssS0FBS0EsRUFBQztBQUN6QixpQkFBTyxRQUFRLFFBQVEsS0FBSyxLQUFLLEtBQUs7QUFBQSxRQUN4QztBQUFBLFFBQ0EsS0FBSztBQUNILGdCQUFNLEVBQUUsU0FBUyxJQUFJLFlBQVk7QUFDakMsZ0JBQU1BLEdBQUUsU0FBUyxJQUFJLFlBQVk7QUFDakMsaUJBQU8sUUFBUSxRQUFRLEdBQUcsY0FBYyxFQUFFLElBQUksR0FBRyxjQUFjLEVBQUU7QUFBQSxRQUNuRSxLQUFLO0FBQUEsUUFDTDtBQUNFLGVBQUssRUFBRSxlQUFlLEVBQUUsYUFBYSxRQUFRLElBQUk7QUFDakQsZUFBS0EsR0FBRSxlQUFlQSxHQUFFLGFBQWEsUUFBUSxJQUFJO0FBQ2pELGlCQUFPLFFBQVEsUUFBUSxLQUFLLEtBQUssS0FBSztBQUFBLE1BQzFDO0FBQUEsSUFDRixDQUFDO0FBQUEsRUFDSDtBQUVBLFdBQVMsNEJBQTRCO0FBQ25DLFVBQU0sT0FBTztBQUFBLE1BQ1gsRUFBRSxLQUFLLFFBQWdCLE9BQU8sT0FBVztBQUFBLE1BQ3pDLEVBQUUsS0FBSyxVQUFnQixPQUFPLFNBQVc7QUFBQSxNQUN6QyxFQUFFLEtBQUssU0FBZ0IsT0FBTyxRQUFXO0FBQUEsTUFDekMsRUFBRSxLQUFLLGdCQUFnQixPQUFPLFdBQVc7QUFBQSxJQUMzQztBQUNBLFVBQU0sUUFBUSxLQUFLLElBQUksQ0FBQyxFQUFFLEtBQUssTUFBTSxNQUFNO0FBQ3pDLFlBQU0sU0FBUyxlQUFlO0FBQzlCLFlBQU0sT0FBUyxTQUFVLGVBQWUsUUFBUSxXQUFXLFdBQVk7QUFDdkUsYUFBTyxxQkFBcUIsU0FBUyxrQkFBa0IsRUFBRSxtQkFBbUIsR0FBRywrQ0FBK0MsS0FBSyxLQUFLLFdBQVcsS0FBSyxDQUFDLDZCQUE2QixTQUFTLG9CQUFvQixFQUFFLEtBQUssSUFBSTtBQUFBLElBQ2hPLENBQUM7QUFDRCxXQUFPLHlCQUF5QixNQUFNLEtBQUssRUFBRSxDQUFDO0FBQUEsRUFDaEQ7QUFFQSxXQUFTLGdCQUFnQixHQUFHO0FBQzFCLFFBQUksQ0FBQyxFQUFHLFFBQU87QUFDZixRQUFJO0FBQ0YsYUFBTyxFQUFFLGVBQWUsU0FBUztBQUFBLFFBQy9CLE9BQU87QUFBQSxRQUFXLEtBQUs7QUFBQSxRQUFXLE1BQU07QUFBQSxRQUN4QyxNQUFNO0FBQUEsUUFBVyxRQUFRO0FBQUEsTUFDM0IsQ0FBQztBQUFBLElBQ0gsU0FBU0YsSUFBRztBQUFFLGFBQU87QUFBQSxJQUFVO0FBQUEsRUFDakM7QUFFQSxXQUFTLHVCQUF1QixLQUFLO0FBQ25DLFVBQU0sYUFBYSxXQUFXLHdCQUF3QixJQUFJLEtBQUssQ0FBQztBQUNoRSxVQUFNLFdBQWEsV0FBVyxnQkFBZ0IsSUFBSSxZQUFZLENBQUM7QUFFL0QsVUFBTSxhQUFhLElBQUksU0FBUyxXQUM1QixvQ0FBb0MsSUFBSSxVQUFVLFNBQVMsNkNBQTZDLFdBQVcsSUFBSSxVQUFVLEtBQUssQ0FBQyxZQUN2STtBQUVKLFFBQUk7QUFDSixRQUFJLElBQUksU0FBUyxVQUFVO0FBQ3pCLFlBQU0sT0FBTyxhQUFhLG1CQUFtQixJQUFJLGFBQWEsRUFBRSxDQUFDO0FBQ2pFLG1CQUFhLElBQUksVUFBVSxZQUN2Qiw2RUFDQSx1Q0FBdUMsSUFBSTtBQUFBLElBQ2pELE9BQU87QUFDTCxZQUFNLEtBQU0sV0FBVyxJQUFJLFFBQVEsRUFBRTtBQUNyQyxZQUFNLE1BQU0sSUFBSTtBQUNoQixtQkFDRSxpREFBaUQsRUFBRSw0TUFDRixFQUFFLGtCQUFrQixHQUFHLGtNQUNwQixFQUFFLG1NQUNMLEVBQUU7QUFBQSxJQUN2RDtBQUVBLFVBQU0sV0FBWSxJQUFJLFNBQVMsWUFBWSxJQUFJLFVBQVUsWUFBYSx3QkFBd0I7QUFFOUYsVUFBTSxhQUFhLElBQUksVUFDbkIsOERBQThELFdBQVcsSUFBSSxPQUFPLENBQUMsV0FDckY7QUFDSixVQUFNLFdBQVcsSUFBSSxTQUFTLFVBQzFCLHFCQUFxQixJQUFJLEdBQUcsS0FBSyxXQUFXLElBQUksSUFBSSxDQUFDLFVBQ2xELFVBQVUsdUJBQ1UsSUFBSSxHQUFHLHlGQUNMLElBQUksR0FBRyx3QkFBd0IsV0FBVyxJQUFJLElBQUksQ0FBQyx3Q0FDdEQsV0FBVyxJQUFJLFFBQVEsRUFBRSxDQUFDLGtCQUFrQixJQUFJLEdBQUcsbUtBRWYsV0FBVyxJQUFJLFFBQVEsRUFBRSxDQUFDLGtCQUFrQixJQUFJLEdBQUcsb0lBQ3BELElBQUksR0FBRyw2RkFFaEUsU0FBUyxXQUFXLElBQUksSUFBSSxDQUFDLFVBQVUsVUFBVTtBQUVyRCxVQUFNLGtCQUFrQjtBQUFBLE1BQ3RCLE9BQU87QUFBQSxNQUFTLE9BQU87QUFBQSxNQUFTLE1BQU07QUFBQSxNQUFRLFFBQVE7QUFBQSxNQUN0RCxXQUFXO0FBQUEsTUFBYSxVQUFVO0FBQUEsTUFBWSxVQUFVO0FBQUEsTUFDeEQsUUFBUTtBQUFBLElBQ1Y7QUFDQSxVQUFNLGtCQUFrQjtBQUFBLE1BQ3RCLE9BQU87QUFBQSxNQUFXLE9BQU87QUFBQSxNQUFXLE1BQU07QUFBQSxNQUFXLFFBQVE7QUFBQSxNQUM3RCxXQUFXO0FBQUEsTUFBVyxVQUFVO0FBQUEsTUFBVyxVQUFVO0FBQUEsTUFDckQsUUFBUTtBQUFBLElBQ1Y7QUFDQSxVQUFNLFlBQVksSUFBSSxxQkFBcUI7QUFDM0MsVUFBTSxpQkFBaUIsYUFBYSxnQkFBZ0IsU0FBUyxJQUN6RCw4QkFBOEIsSUFBSSxHQUFHLDBFQUEwRSxnQkFBZ0IsU0FBUyxDQUFDLHVDQUF1QyxnQkFBZ0IsU0FBUyxDQUFDLFlBQzFNLDZCQUE2QixJQUFJLEdBQUc7QUFHeEMsVUFBTSxtQkFBbUIsSUFBSSxTQUFTLFVBQ2xDLDRCQUE0QixJQUFJLEdBQUcsK0ZBQ0osSUFBSSxHQUFHLDJMQUVsQyxPQUFPLFFBQVEsZUFBZSxFQUFFO0FBQUEsTUFBSSxDQUFDLENBQUNHLElBQUcsQ0FBQyxNQUN4QyxrQkFBa0JBLEVBQUMsSUFBSSxjQUFjQSxLQUFJLGNBQWMsRUFBRSxJQUFJLENBQUM7QUFBQSxJQUNoRSxFQUFFLEtBQUssRUFBRSxJQUNYLGlFQUN3RCxXQUFXLElBQUksUUFBUSxFQUFFLENBQUMsa0JBQWtCLElBQUksR0FBRyxzSUFDcEQsSUFBSSxHQUFHLDZGQUVoRTtBQUdKLFVBQU0sZUFBZSxJQUFJLFFBQ3JCLDZCQUE2QixJQUFJLEdBQUcsNklBQTZJLFdBQVcsSUFBSSxLQUFLLENBQUMsS0FBSyxXQUFXLElBQUksS0FBSyxDQUFDLFdBQ2hPLDZCQUE2QixJQUFJLEdBQUc7QUFDeEMsVUFBTSxrQkFBa0IsSUFBSSxTQUFTLFVBQ2pDLDJCQUEyQixJQUFJLEdBQUcsNkdBQ0gsSUFBSSxHQUFHLGtPQUUyRCxXQUFXLElBQUksU0FBUyxFQUFFLENBQUMsc0dBRWpFLFdBQVcsSUFBSSxRQUFRLEVBQUUsQ0FBQyxrQkFBa0IsSUFBSSxHQUFHLG1JQUNwRCxJQUFJLEdBQUcsbUdBR2pFO0FBRUosUUFBSSxJQUFJLFNBQVMsU0FBUztBQUN4QixvQkFDRSxzREFBc0QsV0FBVyxJQUFJLFFBQVEsRUFBRSxDQUFDLGtCQUFrQixJQUFJLEdBQUc7QUFDM0csb0JBQ0UscURBQXFELFdBQVcsSUFBSSxRQUFRLEVBQUUsQ0FBQyxrQkFBa0IsSUFBSSxHQUFHO0FBQUEsSUFDNUc7QUFFQSxVQUFNLGdCQUFnQixJQUFJLFlBQVksUUFDakMsTUFBTTtBQUNMLFlBQU0sSUFBSSxPQUFPLElBQUksUUFBUTtBQUM3QixZQUFNLFFBQVEsS0FBSyxLQUFLLFlBQVksS0FBSyxLQUFLLFlBQVk7QUFDMUQsYUFBTyx1R0FBdUcsS0FBSyx1REFBdUQsQ0FBQztBQUFBLElBQzdLLEdBQUcsSUFDSDtBQUVKLFdBQU8sZUFBZSxRQUFRLG9DQUNNLFFBQVEsMkNBQ04sVUFBVSw2REFDUSxJQUFJLEdBQUcsS0FBSyxVQUFVLEdBQUcsYUFBYSxHQUFHLGNBQWMsVUFBVSxnQkFBZ0IsR0FBRyxZQUFZLEdBQUcsZUFBZSx5Q0FDdEksUUFBUSw0Q0FDTCxVQUFVO0FBQUEsRUFFbkQ7QUFFQSxXQUFTLG9CQUFvQixZQUFZO0FBQ3ZDLFFBQUksQ0FBQyxXQUFXLE9BQVEsUUFBTztBQUMvQixVQUFNLFFBQVEsV0FBVyxJQUFJLFNBQU87QUFDbEMsWUFBTSxRQUFXLFdBQVcsSUFBSSxJQUFJO0FBQ3BDLFlBQU0sV0FBVyxJQUFJLFNBQVMsV0FDekIsSUFBSSxVQUFVLFlBQVksMEJBQTBCLHdCQUNyRDtBQUNKLFlBQU0sTUFBTSw4QkFBOEIsUUFBUTtBQUNsRCxVQUFJLElBQUksU0FBUyxVQUFVO0FBQ3pCLGNBQU0sT0FBUSxhQUFhLG1CQUFtQixJQUFJLGFBQWEsRUFBRSxDQUFDO0FBQ2xFLGNBQU0sUUFBUSxJQUFJLFVBQVUsWUFBWSx1QkFBdUI7QUFDL0QsZUFBTywyQkFBMkIsS0FBSyxXQUFXLElBQUksS0FBSyxHQUFHLEdBQUcsS0FBSztBQUFBLE1BQ3hFO0FBQ0EsYUFBTyxzRUFBc0UsV0FBVyxJQUFJLFFBQVEsRUFBRSxDQUFDLEtBQUssR0FBRyxHQUFHLEtBQUs7QUFBQSxJQUN6SCxDQUFDLEVBQUUsS0FBSyxFQUFFO0FBQ1YsV0FBTyxrR0FBa0csS0FBSztBQUFBLEVBQ2hIO0FBRUEsV0FBUywrQkFBK0I7QUFDdEMsVUFBTSxPQUFPLFNBQVMsZUFBZSxxQkFBcUI7QUFDMUQsUUFBSSxDQUFDLEtBQU07QUFFWCxVQUFNLE9BQVMsMkJBQTJCLGdCQUFnQixhQUFhO0FBQ3ZFLFVBQU0sU0FBUyxpQkFBaUIsTUFBTSxnQkFBZ0IsTUFBTTtBQUM1RCxVQUFNLFNBQVMsaUJBQWlCLE1BQU0sWUFBWSxVQUFVO0FBRTVELFFBQUksT0FBTyxXQUFXLEdBQUc7QUFDdkIsV0FBSyxZQUFZO0FBQ2pCO0FBQUEsSUFDRjtBQUVBLFVBQU0sUUFBUTtBQUFBLE1BQ1osZUFBZSxTQUFTLEdBQUcsZUFBZSxNQUFNLFlBQVk7QUFBQSxNQUM1RCxjQUFjLFNBQVUsR0FBRyxjQUFjLE1BQU0sV0FBYTtBQUFBLElBQzlELEVBQUUsT0FBTyxPQUFPO0FBRWhCLFNBQUssWUFDSCxvQkFBb0IsT0FBTyxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQ3RDLHlEQUNnQyxNQUFNLEtBQUssUUFBVSxDQUFDLFdBQ3BELDBCQUEwQixJQUMxQix5QkFBeUIsT0FBTyxJQUFJLHNCQUFzQixFQUFFLEtBQUssRUFBRSxDQUFDO0FBQUEsRUFFMUU7QUFFQSxXQUFTLHlCQUF5QixHQUFHO0FBQ25DLFVBQU0sVUFBVSxFQUFFLE9BQU8sUUFBUSxnQkFBZ0I7QUFDakQsUUFBSSxTQUFTO0FBQUUsaUJBQVcsUUFBUSxRQUFRLE1BQU07QUFBRztBQUFBLElBQVE7QUFFM0QsVUFBTSxNQUFNLEVBQUUsT0FBTyxRQUFRLGtCQUFrQjtBQUMvQyxRQUFJLENBQUMsSUFBSztBQUNWLFVBQU0sT0FBUyxJQUFJLFFBQVE7QUFDM0IsVUFBTSxNQUFTLFNBQVMsSUFBSSxRQUFRLFNBQVMsTUFBTSxFQUFFO0FBQ3JELFVBQU0sU0FBUyxJQUFJLFFBQVE7QUFDM0IsUUFBUyxXQUFXLFNBQWlCLHlCQUF3QixNQUFNLEdBQUc7QUFBQSxhQUM3RCxXQUFXLGdCQUFpQiwwQkFBeUIsTUFBTSxHQUFHO0FBQUEsYUFDOUQsV0FBVyxnQkFBaUIsMEJBQXlCLEdBQUc7QUFBQSxhQUN4RCxXQUFXLGNBQWlCLHdCQUF1QixHQUFHO0FBQUEsYUFDdEQsV0FBVyxnQkFBaUIseUJBQXdCLE1BQU0sR0FBRztBQUFBLGFBQzdELFdBQVcsZ0JBQWlCLHlCQUF3QixHQUFHO0FBQUEsYUFDdkQsV0FBVyxhQUFpQix1QkFBc0IsR0FBRztBQUFBLGFBQ3JELFdBQVcsZUFBaUIsd0JBQXVCLE1BQU0sR0FBRztBQUFBLGFBQzVELFdBQVcsZUFBaUIsd0JBQXVCLEdBQUc7QUFBQSxhQUN0RCxXQUFXLE9BQWlCLDBCQUF5QixJQUFJO0FBQUEsYUFDekQsV0FBVyxZQUFpQiw0QkFBMkIsSUFBSTtBQUFBLGFBQzNELFdBQVcsU0FBaUIseUJBQXdCLE1BQU0sQ0FBQztBQUFBLEVBQ3RFO0FBRUEsV0FBUywyQkFBMkIsR0FBRztBQUNyQyxTQUFLLEVBQUUsUUFBUSxXQUFXLEVBQUUsUUFBUSxRQUFRLEVBQUUsT0FBTyxRQUFRLGdCQUFnQixHQUFHO0FBQzlFLFFBQUUsZUFBZTtBQUNqQixpQkFBVyxFQUFFLE9BQU8sUUFBUSxnQkFBZ0IsRUFBRSxRQUFRLE1BQU07QUFDNUQ7QUFBQSxJQUNGO0FBQ0EsVUFBTSxRQUFRLEVBQUUsT0FBTyxRQUFRLGVBQWU7QUFDOUMsUUFBSSxDQUFDLE1BQU87QUFDWixVQUFNLE9BQU8sTUFBTSxRQUFRO0FBQzNCLFVBQU0sTUFBTyxTQUFTLE1BQU0sUUFBUSxPQUFPLEVBQUU7QUFDN0MsUUFBUyxFQUFFLFFBQVEsUUFBVSwwQkFBeUIsTUFBTSxHQUFHO0FBQUEsYUFDdEQsRUFBRSxRQUFRLFNBQVUsMEJBQXlCLEdBQUc7QUFBQSxFQUMzRDtBQUlBLGlCQUFlTCxtQkFBa0IsRUFBRSxXQUFXLE1BQU0sSUFBSSxDQUFDLEdBQUc7QUFDMUQsVUFBTSxVQUFVLFNBQVMsZUFBZSx3QkFBd0I7QUFDaEUsUUFBSSxDQUFDLFFBQVM7QUFDZCxZQUFRLFFBQVEsa0JBQWtCLFdBQVcsTUFBTTtBQUNuRCxVQUFNLFNBQWMsU0FBUyxlQUFlLHdCQUF3QjtBQUNwRSxVQUFNLGNBQWMsU0FBUyxlQUFlLDZCQUE2QjtBQUN6RSxRQUFJLE9BQWEsUUFBTyxNQUFNLFVBQWUsV0FBVyxTQUFTO0FBQ2pFLFFBQUksWUFBYSxhQUFZLE1BQU0sVUFBVSxXQUFXLFNBQVM7QUFDakUsWUFBUSxNQUFNLFVBQVU7QUFDeEIsV0FBTyw2QkFBNkIsU0FBUztBQUM3QyxVQUFNLHlCQUF5QjtBQUMvQix1QkFBbUI7QUFDbkIsY0FBVSx3QkFBd0I7QUFDbEMsb0JBQWdCLHdCQUF3QjtBQUFBLEVBQzFDO0FBRUEsV0FBUyxxQkFBcUI7QUFDNUIsVUFBTSxVQUFVLFNBQVMsZUFBZSx3QkFBd0I7QUFDaEUsUUFBSSxDQUFDLFFBQVM7QUFDZCxRQUFJLFFBQVEsUUFBUSxvQkFBb0IsSUFBSztBQUM3QyxZQUFRLE1BQU0sVUFBVTtBQUN4QixpQkFBYTtBQUFBLEVBQ2Y7QUFFQSxpQkFBZSwyQkFBMkI7QUFDeEMsVUFBTSxPQUFPLFNBQVMsZUFBZSxxQkFBcUI7QUFDMUQsUUFBSSxDQUFDLEtBQU07QUFDWCxTQUFLLFlBQVk7QUFDakIsUUFBSTtBQUNGLFlBQU0sQ0FBQyxXQUFXLFFBQVEsSUFBSSxNQUFNLFFBQVEsSUFBSTtBQUFBLFFBQzlDLE1BQU0sc0JBQXNCO0FBQUEsUUFDNUIsTUFBTSxlQUFlO0FBQUEsTUFDdkIsQ0FBQztBQUNELHVCQUFpQixVQUFVLE1BQU8sTUFBTSxVQUFVLEtBQUssR0FBRyxZQUFZLENBQUMsSUFBSyxDQUFDO0FBQzdFLFlBQU0sWUFBWSxTQUFTLEtBQUsseUJBQXlCLE1BQU0sU0FBUyxLQUFLLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxFQUFFO0FBQ2pHLHNCQUFrQixVQUFVLFlBQVksQ0FBQztBQUFBLElBQzNDLFNBQVMsR0FBRztBQUNWLFdBQUssWUFBWSxtRUFBbUUsV0FBVyxFQUFFLE9BQU8sQ0FBQztBQUN6RztBQUFBLElBQ0Y7QUFFQSxRQUFJLENBQUMsS0FBSyxxQkFBcUI7QUFDN0IsV0FBSyxzQkFBc0I7QUFDM0IsV0FBSyxpQkFBaUIsU0FBVyx3QkFBd0I7QUFDekQsV0FBSyxpQkFBaUIsV0FBVywwQkFBMEI7QUFBQSxJQUM3RDtBQUNBLGlDQUE2QjtBQUFBLEVBQy9CO0FBRUEsaUJBQWUseUJBQXlCLE1BQU07QUFHNUMsVUFBTSxVQUFVLFNBQVMsZUFBZSx3QkFBd0I7QUFDaEUsUUFBSSxRQUFTLFNBQVEsUUFBUSxrQkFBa0I7QUFDL0MsdUJBQW1CO0FBQ25CLFVBQU0sZ0JBQWdCLElBQUk7QUFBQSxFQUM1QjtBQUVBLGlCQUFlLHNCQUFzQjtBQUNuQyx1QkFBbUI7QUFDbkIsVUFBTSw0QkFBNEI7QUFBQSxFQUNwQztBQUVBLFdBQVMsd0JBQXdCLE1BQU0sS0FBSztBQUMxQyxVQUFNLFNBQVMsU0FBUyxlQUFlLFdBQVcsR0FBRyxFQUFFO0FBQ3ZELFVBQU0sT0FBUyxTQUFTLGVBQWUsYUFBYSxHQUFHLEVBQUU7QUFDekQsUUFBSSxPQUFRLFFBQU8sTUFBTSxVQUFVO0FBQ25DLFFBQUksS0FBUSxNQUFLLE1BQU0sVUFBWTtBQUNuQyxVQUFNLFFBQVEsU0FBUyxlQUFlLFlBQVksR0FBRyxFQUFFO0FBQ3ZELFFBQUksT0FBTztBQUFFLFlBQU0sTUFBTTtBQUFHLFlBQU0sT0FBTztBQUFBLElBQUc7QUFBQSxFQUM5QztBQUVBLFdBQVMseUJBQXlCLEtBQUs7QUFDckMsVUFBTSxTQUFTLFNBQVMsZUFBZSxXQUFXLEdBQUcsRUFBRTtBQUN2RCxVQUFNLE9BQVMsU0FBUyxlQUFlLGFBQWEsR0FBRyxFQUFFO0FBQ3pELFFBQUksS0FBUSxNQUFLLE1BQU0sVUFBWTtBQUNuQyxRQUFJLE9BQVEsUUFBTyxNQUFNLFVBQVU7QUFBQSxFQUNyQztBQUVBLGlCQUFlLHlCQUF5QixNQUFNLEtBQUs7QUFDakQsVUFBTSxRQUFRLFNBQVMsZUFBZSxZQUFZLEdBQUcsRUFBRTtBQUN2RCxRQUFJLENBQUMsTUFBTztBQUNaLFVBQU0sVUFBVSxNQUFNLE1BQU0sS0FBSztBQUNqQyxRQUFJLENBQUMsUUFBUztBQUNkLFFBQUk7QUFDRixZQUFNLE1BQU8sTUFBTSxNQUFNLHVCQUF1QjtBQUFBLFFBQzlDLFFBQVE7QUFBQSxRQUFRLFNBQVMsRUFBRSxnQkFBZ0IsbUJBQW1CO0FBQUEsUUFDOUQsTUFBTSxLQUFLLFVBQVUsRUFBRSxNQUFNLFVBQVUsUUFBUSxDQUFDO0FBQUEsTUFDbEQsQ0FBQztBQUNELFlBQU0sT0FBTyxNQUFNLElBQUksS0FBSztBQUM1QixVQUFJLEtBQUssSUFBSTtBQUNYLGNBQU0sU0FBUyxTQUFTLGVBQWUsV0FBVyxHQUFHLEVBQUU7QUFDdkQsWUFBSSxPQUFRLFFBQU8sY0FBYztBQUNqQyxpQ0FBeUIsR0FBRztBQUM1QixjQUFNLFlBQVk7QUFBQSxNQUNwQixPQUFPO0FBQ0wsWUFBSSxPQUFPLGNBQWMsV0FBWSxXQUFVLGtCQUFrQixLQUFLLEtBQUssSUFBSSxPQUFPO0FBQUEsTUFDeEY7QUFBQSxJQUNGLFNBQVMsR0FBRztBQUFFLFVBQUksT0FBTyxjQUFjLFdBQVksV0FBVSxpQkFBaUIsRUFBRSxPQUFPLElBQUksT0FBTztBQUFBLElBQUc7QUFBQSxFQUN2RztBQUVBLFdBQVMsdUJBQXVCLEtBQUs7QUFDbkMsVUFBTSxVQUFXLFNBQVMsZUFBZSxZQUFZLEdBQUcsRUFBRTtBQUMxRCxVQUFNLGFBQWEsU0FBUyxlQUFlLGtCQUFrQixHQUFHLEVBQUU7QUFDbEUsUUFBSSxRQUFZLFNBQVEsTUFBTSxVQUFhO0FBQzNDLFFBQUksV0FBWSxZQUFXLE1BQU0sVUFBVTtBQUMzQyxVQUFNLE1BQU0sU0FBUyxlQUFlLGlCQUFpQixHQUFHLEVBQUU7QUFDMUQsUUFBSSxJQUFLLEtBQUksTUFBTTtBQUFBLEVBQ3JCO0FBRUEsV0FBUyx3QkFBd0IsS0FBSztBQUNwQyxVQUFNLFVBQWEsU0FBUyxlQUFlLFlBQVksR0FBRyxFQUFFO0FBQzVELFVBQU0sYUFBYSxTQUFTLGVBQWUsa0JBQWtCLEdBQUcsRUFBRTtBQUNsRSxRQUFJLFdBQVksWUFBVyxNQUFNLFVBQVU7QUFDM0MsUUFBSSxRQUFZLFNBQVEsTUFBTSxVQUFhO0FBQUEsRUFDN0M7QUFFQSxpQkFBZSx3QkFBd0IsTUFBTSxLQUFLO0FBQ2hELFVBQU0sTUFBTSxTQUFTLGVBQWUsaUJBQWlCLEdBQUcsRUFBRTtBQUMxRCxRQUFJLENBQUMsSUFBSztBQUNWLFVBQU0sWUFBWSxJQUFJO0FBQ3RCLFVBQU0sbUJBQW1CO0FBQUEsTUFDdkIsT0FBTztBQUFBLE1BQVMsT0FBTztBQUFBLE1BQVMsTUFBTTtBQUFBLE1BQVEsUUFBUTtBQUFBLE1BQ3RELFdBQVc7QUFBQSxNQUFhLFVBQVU7QUFBQSxNQUFZLFVBQVU7QUFBQSxNQUN4RCxRQUFRO0FBQUEsSUFDVjtBQUNBLFVBQU0sbUJBQW1CO0FBQUEsTUFDdkIsT0FBTztBQUFBLE1BQVcsT0FBTztBQUFBLE1BQVcsTUFBTTtBQUFBLE1BQVcsUUFBUTtBQUFBLE1BQzdELFdBQVc7QUFBQSxNQUFXLFVBQVU7QUFBQSxNQUFXLFVBQVU7QUFBQSxNQUNyRCxRQUFRO0FBQUEsSUFDVjtBQUNBLFFBQUk7QUFDRixZQUFNLE1BQU8sTUFBTSxNQUFNLDBCQUEwQjtBQUFBLFFBQ2pELFFBQVE7QUFBQSxRQUFTLFNBQVMsRUFBRSxnQkFBZ0IsbUJBQW1CO0FBQUEsUUFDL0QsTUFBTSxLQUFLLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixVQUFVLENBQUM7QUFBQSxNQUM5RCxDQUFDO0FBQ0QsWUFBTSxPQUFPLE1BQU0sSUFBSSxLQUFLO0FBQzVCLFVBQUksS0FBSyxJQUFJO0FBQ1gsY0FBTSxRQUFRLFNBQVMsZUFBZSxtQkFBbUIsR0FBRyxFQUFFO0FBQzlELFlBQUksT0FBTztBQUNULGNBQUksYUFBYSxpQkFBaUIsU0FBUyxHQUFHO0FBQzVDLGtCQUFNLGNBQWMsaUJBQWlCLFNBQVM7QUFDOUMsa0JBQU0sTUFBTSxVQUFVLGlFQUFpRSxpQkFBaUIsU0FBUyxDQUFDO0FBQUEsVUFDcEgsT0FBTztBQUNMLGtCQUFNLGNBQWM7QUFDcEIsa0JBQU0sTUFBTSxVQUFVO0FBQUEsVUFDeEI7QUFBQSxRQUNGO0FBQ0EsZ0NBQXdCLEdBQUc7QUFBQSxNQUM3QixPQUFPO0FBQ0wsWUFBSSxPQUFPLGNBQWMsV0FBWSxXQUFVLHlCQUF5QixLQUFLLFNBQVMsZUFBZSxJQUFJLE9BQU87QUFBQSxNQUNsSDtBQUFBLElBQ0YsU0FBUyxHQUFHO0FBQ1YsVUFBSSxPQUFPLGNBQWMsV0FBWSxXQUFVLHdCQUF3QixFQUFFLE9BQU8sSUFBSSxPQUFPO0FBQUEsSUFDN0Y7QUFBQSxFQUNGO0FBRUEsV0FBUyxzQkFBc0IsS0FBSztBQUNsQyxVQUFNLGFBQWEsU0FBUyxlQUFlLGlCQUFpQixHQUFHLEVBQUU7QUFDakUsVUFBTSxVQUFhLFNBQVMsZUFBZSxvQkFBb0IsR0FBRyxFQUFFO0FBQ3BFLFFBQUksUUFBWSxTQUFRLE1BQU0sVUFBYTtBQUMzQyxRQUFJLFdBQVksWUFBVyxNQUFNLFVBQVU7QUFDM0MsVUFBTSxLQUFLLFNBQVMsZUFBZSxlQUFlLEdBQUcsRUFBRTtBQUN2RCxRQUFJLElBQUk7QUFBRSxTQUFHLE1BQU07QUFBRyxTQUFHLGlCQUFpQixHQUFHLGVBQWUsR0FBRyxNQUFNO0FBQUEsSUFBUTtBQUFBLEVBQy9FO0FBRUEsV0FBUyx1QkFBdUIsS0FBSztBQUNuQyxVQUFNLGFBQWEsU0FBUyxlQUFlLGlCQUFpQixHQUFHLEVBQUU7QUFDakUsVUFBTSxVQUFhLFNBQVMsZUFBZSxvQkFBb0IsR0FBRyxFQUFFO0FBQ3BFLFFBQUksV0FBWSxZQUFXLE1BQU0sVUFBVTtBQUMzQyxRQUFJLFFBQVksU0FBUSxNQUFNLFVBQWE7QUFBQSxFQUM3QztBQUVBLGlCQUFlLHVCQUF1QixNQUFNLEtBQUs7QUFDL0MsVUFBTSxLQUFLLFNBQVMsZUFBZSxlQUFlLEdBQUcsRUFBRTtBQUN2RCxRQUFJLENBQUMsR0FBSTtBQUNULFVBQU0sV0FBVyxHQUFHO0FBQ3BCLFFBQUk7QUFDRixZQUFNLE1BQU8sTUFBTSxNQUFNLDBCQUEwQjtBQUFBLFFBQ2pELFFBQVE7QUFBQSxRQUFTLFNBQVMsRUFBRSxnQkFBZ0IsbUJBQW1CO0FBQUEsUUFDL0QsTUFBTSxLQUFLLFVBQVUsRUFBRSxNQUFNLE9BQU8sU0FBUyxDQUFDO0FBQUEsTUFDaEQsQ0FBQztBQUNELFlBQU0sT0FBTyxNQUFNLElBQUksS0FBSztBQUM1QixVQUFJLEtBQUssSUFBSTtBQUNYLGNBQU0sVUFBVSxTQUFTLGVBQWUsb0JBQW9CLEdBQUcsRUFBRTtBQUNqRSxZQUFJLFNBQVM7QUFDWCxrQkFBUSxjQUFjO0FBQ3RCLGtCQUFRLFFBQWM7QUFDdEIsa0JBQVEsTUFBTSxVQUFVLFdBQVcsS0FBSztBQUFBLFFBQzFDO0FBQ0EsK0JBQXVCLEdBQUc7QUFBQSxNQUM1QixPQUFPO0FBQ0wsWUFBSSxPQUFPLGNBQWMsV0FBWSxXQUFVLHdCQUF3QixLQUFLLFNBQVMsZUFBZSxJQUFJLE9BQU87QUFBQSxNQUNqSDtBQUFBLElBQ0YsU0FBUyxHQUFHO0FBQ1YsVUFBSSxPQUFPLGNBQWMsV0FBWSxXQUFVLHVCQUF1QixFQUFFLE9BQU8sSUFBSSxPQUFPO0FBQUEsSUFDNUY7QUFBQSxFQUNGO0FBRUEsaUJBQWUsd0JBQXdCLE1BQU1NLFFBQU87QUFDbEQsSUFBQUEsT0FBTSxnQkFBZ0I7QUFDdEIsUUFBSSxPQUFPLGtCQUFrQixZQUFZO0FBQ3ZDLFlBQU0sS0FBSyxNQUFNLGNBQWMscUVBQXFFO0FBQ3BHLFVBQUksQ0FBQyxHQUFJO0FBQUEsSUFDWDtBQUNBLFFBQUk7QUFDRixZQUFNLE1BQU8sTUFBTSxNQUFNLHVCQUF1QjtBQUFBLFFBQzlDLFFBQVE7QUFBQSxRQUFRLFNBQVMsRUFBRSxnQkFBZ0IsbUJBQW1CO0FBQUEsUUFDOUQsTUFBTSxLQUFLLFVBQVUsRUFBRSxLQUFLLENBQUM7QUFBQSxNQUMvQixDQUFDO0FBQ0QsWUFBTSxPQUFPLE1BQU0sSUFBSSxLQUFLO0FBQzVCLFVBQUksS0FBSyxTQUFTO0FBQ2hCLGNBQU0seUJBQXlCO0FBQy9CLGNBQU0sbUJBQW1CO0FBQUEsTUFDM0IsT0FBTztBQUNMLFlBQUksT0FBTyxjQUFjLFdBQVksV0FBVSxvQ0FBb0MsS0FBSyxTQUFTLGVBQWUsSUFBSSxPQUFPO0FBQUEsTUFDN0g7QUFBQSxJQUNGLFNBQVMsR0FBRztBQUFFLFVBQUksT0FBTyxjQUFjLFdBQVksV0FBVSxVQUFVLEVBQUUsT0FBTyxJQUFJLE9BQU87QUFBQSxJQUFHO0FBQUEsRUFDaEc7QUFJQSxpQkFBZSwyQkFBMkIsTUFBTTtBQUM5QyxRQUFJO0FBQ0YsWUFBTSxNQUFPLE1BQU0sTUFBTSwyQkFBMkI7QUFBQSxRQUNsRCxRQUFRO0FBQUEsUUFBUSxTQUFTLEVBQUUsZ0JBQWdCLG1CQUFtQjtBQUFBLFFBQzlELE1BQU0sS0FBSyxVQUFVLEVBQUUsS0FBSyxDQUFDO0FBQUEsTUFDL0IsQ0FBQztBQUNELFlBQU0sT0FBTyxNQUFNLElBQUksS0FBSztBQUM1QixVQUFJLEtBQUssSUFBSTtBQUNYLGNBQU0seUJBQXlCO0FBQy9CLFlBQUksT0FBTyxjQUFjLFdBQVksV0FBVSx3QkFBd0IsS0FBSyxRQUFRLEdBQUc7QUFBQSxNQUN6RixPQUFPO0FBQ0wsWUFBSSxPQUFPLGNBQWMsV0FBWSxXQUFVLGdDQUFnQyxLQUFLLFNBQVMsZUFBZSxJQUFJLE9BQU87QUFBQSxNQUN6SDtBQUFBLElBQ0YsU0FBUyxHQUFHO0FBQUUsVUFBSSxPQUFPLGNBQWMsV0FBWSxXQUFVLFVBQVUsRUFBRSxPQUFPLElBQUksT0FBTztBQUFBLElBQUc7QUFBQSxFQUNoRztBQUlBLGlCQUFlLHFCQUFxQjtBQUNsQyxVQUFNLE1BQU0sU0FBUyxlQUFlLG9CQUFvQjtBQUN4RCxRQUFJLENBQUMsSUFBSztBQUNWLFFBQUk7QUFDRixZQUFNLE1BQU8sTUFBTSxNQUFNLFlBQVk7QUFDckMsWUFBTSxPQUFPLE1BQU0sSUFBSSxLQUFLO0FBQzVCLFlBQU0sS0FBSyxLQUFLLFNBQVMsQ0FBQyxHQUFHO0FBQzdCLFVBQUksY0FBYyxJQUFJLElBQUksb0JBQWEsQ0FBQyxNQUFNO0FBQUEsSUFDaEQsU0FBU0osSUFBRztBQUFBLElBQWU7QUFBQSxFQUM3QjtBQUlBLGlCQUFlLGdCQUFnQjtBQUM3QixVQUFNLE9BQVMsU0FBUyxlQUFlLHFCQUFxQjtBQUM1RCxVQUFNLFNBQVMsU0FBUyxjQUFjLHVDQUF1QztBQUM3RSxRQUFJLENBQUMsS0FBTTtBQUVYLFNBQUssWUFBWTtBQUVqQixRQUFJLFFBQVE7QUFDVixhQUFPLFlBQVk7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUlyQjtBQUVBLFVBQU0saUJBQWlCO0FBQUEsRUFDekI7QUFFQSxXQUFTLGlCQUFpQjtBQUN4QixVQUFNLFNBQVMsU0FBUyxjQUFjLHVDQUF1QztBQUM3RSxRQUFJLFFBQVE7QUFDVixhQUFPLFlBQVk7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFTckI7QUFDQSw2QkFBeUI7QUFDekIsdUJBQW1CO0FBQUEsRUFDckI7QUFFQSxpQkFBZSxtQkFBbUI7QUFDaEMsVUFBTSxPQUFPLFNBQVMsZUFBZSxxQkFBcUI7QUFDMUQsUUFBSSxDQUFDLEtBQU07QUFDWCxRQUFJLFFBQVEsQ0FBQztBQUNiLFFBQUk7QUFDRixZQUFNLE1BQU8sTUFBTSxNQUFNLFlBQVk7QUFDckMsWUFBTSxPQUFPLE1BQU0sSUFBSSxLQUFLO0FBQzVCLGNBQVEsS0FBSyxTQUFTLENBQUM7QUFBQSxJQUN6QixTQUFTLEdBQUc7QUFDVixXQUFLLFlBQVksZ0VBQWdFLFdBQVcsRUFBRSxPQUFPLENBQUM7QUFDdEc7QUFBQSxJQUNGO0FBQ0EsUUFBSSxNQUFNLFdBQVcsR0FBRztBQUN0QixXQUFLLFlBQVk7QUFDakI7QUFBQSxJQUNGO0FBRUEsYUFBU0ssU0FBUSxJQUFJO0FBQ25CLFVBQUksQ0FBQyxHQUFJLFFBQU87QUFDaEIsVUFBSTtBQUFFLGVBQU8sSUFBSSxLQUFLLEVBQUUsRUFBRSxtQkFBbUIsU0FBUyxFQUFFLE9BQU8sU0FBUyxLQUFLLFdBQVcsTUFBTSxVQUFVLENBQUM7QUFBQSxNQUFHLFFBQ3RHO0FBQUUsZUFBTyxHQUFHLE1BQU0sR0FBRyxFQUFFO0FBQUEsTUFBRztBQUFBLElBQ2xDO0FBRUEsUUFBSUMsUUFBTztBQUNYLFVBQU0sUUFBUSxPQUFLO0FBQ2pCLFlBQU0sS0FBSyxXQUFXLEVBQUUsSUFBSTtBQUM1QixNQUFBQSxTQUFRO0FBQUE7QUFBQTtBQUFBLHdEQUc0QyxXQUFXLEVBQUUsaUJBQWlCLFVBQVUsQ0FBQztBQUFBLHNFQUMzQkQsU0FBUSxFQUFFLFNBQVMsQ0FBQyxHQUFHLEVBQUUsUUFBUSxXQUFRLFdBQVcsRUFBRSxLQUFLLElBQUksRUFBRTtBQUFBO0FBQUE7QUFBQTtBQUFBLG1FQUlwRSxFQUFFO0FBQUE7QUFBQSwwRUFFSyxFQUFFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUsxRSxDQUFDO0FBQ0QsSUFBQUMsU0FBUTtBQUNSLFVBQU0sZUFBZSxTQUFTLGNBQWMsS0FBSztBQUNqRCxpQkFBYSxZQUFZQTtBQUN6QixTQUFLLFlBQVk7QUFDakIsU0FBSyxZQUFZLFlBQVk7QUFFN0IsaUJBQWEsaUJBQWlCLFNBQVMsT0FBSztBQUMxQyxZQUFNLE1BQU0sRUFBRSxPQUFPLFFBQVEscUJBQXFCO0FBQ2xELFVBQUksQ0FBQyxJQUFLO0FBQ1YsWUFBTSxPQUFTLElBQUksUUFBUTtBQUMzQixZQUFNLFNBQVMsSUFBSSxRQUFRO0FBQzNCLFVBQVMsV0FBVyxVQUFrQixrQkFBaUIsSUFBSTtBQUFBLGVBQ2xELFdBQVcsaUJBQWtCLGVBQWMsSUFBSTtBQUFBLElBQzFELENBQUM7QUFBQSxFQUNIO0FBRUEsaUJBQWUsaUJBQWlCLE1BQU07QUFDcEMsUUFBSTtBQUNGLFlBQU0sTUFBTyxNQUFNLE1BQU0sc0JBQXNCO0FBQUEsUUFDN0MsUUFBUTtBQUFBLFFBQVEsU0FBUyxFQUFFLGdCQUFnQixtQkFBbUI7QUFBQSxRQUM5RCxNQUFNLEtBQUssVUFBVSxFQUFFLEtBQUssQ0FBQztBQUFBLE1BQy9CLENBQUM7QUFDRCxZQUFNLE9BQU8sTUFBTSxJQUFJLEtBQUs7QUFDNUIsVUFBSSxLQUFLLFNBQVM7QUFBRSxjQUFNLGlCQUFpQjtBQUFHLGNBQU0sbUJBQW1CO0FBQUEsTUFBRyxXQUNqRSxPQUFPLGNBQWMsV0FBWSxXQUFVLG1CQUFtQixLQUFLLFNBQVMsZUFBZSxJQUFJLE9BQU87QUFBQSxJQUNqSCxTQUFTLEdBQUc7QUFBRSxVQUFJLE9BQU8sY0FBYyxXQUFZLFdBQVUsVUFBVSxFQUFFLE9BQU8sSUFBSSxPQUFPO0FBQUEsSUFBRztBQUFBLEVBQ2hHO0FBRUEsaUJBQWUsY0FBYyxNQUFNO0FBQ2pDLFVBQU0sWUFBWSxNQUFNO0FBQUEsTUFDdEI7QUFBQSxNQUNBLEVBQUUsY0FBYyxrQkFBa0IsYUFBYSxVQUFVLFFBQVEsS0FBSztBQUFBLElBQ3hFO0FBQ0EsUUFBSSxDQUFDLFVBQVc7QUFDaEIsUUFBSTtBQUNGLFlBQU0sTUFBTyxNQUFNLE1BQU0scUJBQXFCO0FBQUEsUUFDNUMsUUFBUTtBQUFBLFFBQVEsU0FBUyxFQUFFLGdCQUFnQixtQkFBbUI7QUFBQSxRQUM5RCxNQUFNLEtBQUssVUFBVSxFQUFFLEtBQUssQ0FBQztBQUFBLE1BQy9CLENBQUM7QUFDRCxZQUFNLE9BQU8sTUFBTSxJQUFJLEtBQUs7QUFDNUIsVUFBSSxLQUFLLFNBQVM7QUFBRSxjQUFNLGlCQUFpQjtBQUFHLGNBQU0sbUJBQW1CO0FBQUEsTUFBRyxXQUNqRSxPQUFPLGNBQWMsV0FBWSxXQUFVLGtCQUFrQixLQUFLLFNBQVMsZUFBZSxJQUFJLE9BQU87QUFBQSxJQUNoSCxTQUFTLEdBQUc7QUFBRSxVQUFJLE9BQU8sY0FBYyxXQUFZLFdBQVUsVUFBVSxFQUFFLE9BQU8sSUFBSSxPQUFPO0FBQUEsSUFBRztBQUFBLEVBQ2hHO0FBRUEsaUJBQWUsYUFBYTtBQUMxQixVQUFNLFlBQVksTUFBTTtBQUFBLE1BQ3RCO0FBQUEsTUFDQSxFQUFFLGNBQWMsZUFBZSxhQUFhLFVBQVUsUUFBUSxLQUFLO0FBQUEsSUFDckU7QUFDQSxRQUFJLENBQUMsVUFBVztBQUNoQixRQUFJO0FBQ0YsWUFBTSxNQUFPLE1BQU0sTUFBTSxvQkFBb0IsRUFBRSxRQUFRLE9BQU8sQ0FBQztBQUMvRCxZQUFNLE9BQU8sTUFBTSxJQUFJLEtBQUs7QUFDNUIsVUFBSSxLQUFLLFNBQVM7QUFBRSxjQUFNLGlCQUFpQjtBQUFHLGNBQU0sbUJBQW1CO0FBQUEsTUFBRyxXQUNqRSxPQUFPLGNBQWMsV0FBWSxXQUFVLDBCQUEwQixLQUFLLFNBQVMsZUFBZSxJQUFJLE9BQU87QUFBQSxJQUN4SCxTQUFTLEdBQUc7QUFBRSxVQUFJLE9BQU8sY0FBYyxXQUFZLFdBQVUsVUFBVSxFQUFFLE9BQU8sSUFBSSxPQUFPO0FBQUEsSUFBRztBQUFBLEVBQ2hHOzs7QUM5NEJBO0FBQUE7QUFBQSxpQ0FBQUM7QUFBQSxJQUFBLHNCQUFBQztBQUFBLElBQUE7QUFBQTtBQXFCQSxNQUFJLG9CQUFvQjtBQUd4QixXQUFTLGVBQWU7QUFDdEIsVUFBTSxLQUFLLFNBQVM7QUFDcEIsUUFBSSxDQUFDLEdBQUksUUFBTztBQUNoQixVQUFNLE1BQU0sR0FBRztBQUNmLFdBQU8sUUFBUSxXQUFXLFFBQVEsY0FBYyxRQUFRLFlBQVksR0FBRztBQUFBLEVBQ3pFO0FBR0EsV0FBUyxhQUFhO0FBQ3BCLFdBQU8sU0FBUyxjQUFjLDRFQUE0RSxNQUFNO0FBQUEsRUFDbEg7QUFHQSxXQUFTLHFCQUFxQjtBQUM1QixVQUFNLEtBQUssU0FBUyxlQUFlLHlCQUF5QjtBQUM1RCxXQUFPLENBQUMsQ0FBQyxNQUFNLEdBQUcsTUFBTSxZQUFZO0FBQUEsRUFDdEM7QUFPQSxNQUFNLGtCQUFrQjtBQUFBLElBQ3RCLE9BQXlCO0FBQUEsSUFDekIsWUFBeUI7QUFBQSxJQUN6QixTQUF5QjtBQUFBLElBQ3pCLFdBQXlCO0FBQUEsSUFDekIsU0FBeUI7QUFBQSxJQUN6QixrQkFBeUI7QUFBQSxJQUN6QixVQUF5QjtBQUFBLElBQ3pCLFlBQXlCO0FBQUEsSUFDekIsWUFBeUI7QUFBQSxFQUMzQjtBQUdBLFdBQVMsd0JBQXdCO0FBQy9CLFVBQU0sTUFBTSxPQUFPLGlCQUFpQixjQUFjLGFBQWEsY0FBYyxJQUFJO0FBQ2pGLFFBQUksQ0FBQyxJQUFLO0FBQ1YsVUFBTSxRQUFRLGdCQUFnQixHQUFHO0FBQ2pDLFFBQUksQ0FBQyxNQUFPO0FBQ1osVUFBTSxNQUFNLFNBQVMsZUFBZSxLQUFLO0FBQ3pDLFFBQUksT0FBTyxDQUFDLElBQUksU0FBVSxLQUFJLE1BQU07QUFBQSxFQUN0QztBQUtBLFdBQVMsWUFBWTtBQUNuQixVQUFNLE1BQU0sT0FBTyxpQkFBaUIsY0FBYyxhQUFhLGNBQWMsSUFBSTtBQUNqRixRQUFJLFFBQVEsVUFBVyxRQUFPLENBQUMsR0FBRyxTQUFTLGlCQUFpQixlQUFlLENBQUM7QUFDNUUsUUFBSSxRQUFRLFFBQVcsUUFBTyxDQUFDLEdBQUcsU0FBUyxpQkFBaUIsYUFBYSxDQUFDO0FBQzFFLFdBQU8sQ0FBQztBQUFBLEVBQ1Y7QUFHQSxXQUFTLGVBQWUsT0FBTyxLQUFLO0FBQ2xDLFVBQU0sUUFBUSxDQUFDLEdBQUcsTUFBTTtBQUN0QixVQUFJLE1BQU0sS0FBSztBQUNiLFVBQUUsVUFBVSxJQUFJLFlBQVk7QUFDNUIsVUFBRSxlQUFlLEVBQUUsT0FBTyxXQUFXLFVBQVUsU0FBUyxDQUFDO0FBQUEsTUFDM0QsT0FBTztBQUNMLFVBQUUsVUFBVSxPQUFPLFlBQVk7QUFBQSxNQUNqQztBQUFBLElBQ0YsQ0FBQztBQUFBLEVBQ0g7QUFHQSxXQUFTLGVBQWUsT0FBTztBQUM3QixVQUFNLFFBQVEsVUFBVTtBQUN4QixRQUFJLENBQUMsTUFBTSxPQUFRO0FBQ25CLHdCQUFvQixLQUFLLElBQUksR0FBRyxLQUFLLElBQUksTUFBTSxTQUFTLEdBQUcsb0JBQW9CLEtBQUssQ0FBQztBQUNyRixtQkFBZSxPQUFPLGlCQUFpQjtBQUFBLEVBQ3pDO0FBR0EsV0FBUyxxQkFBcUI7QUFDNUIsVUFBTSxNQUFNLE9BQU8saUJBQWlCLGNBQWMsYUFBYSxjQUFjLElBQUk7QUFDakYsUUFBSSxRQUFRLFdBQVc7QUFDckIsWUFBTSxRQUFRLFVBQVU7QUFDeEIsVUFBSSxvQkFBb0IsS0FBSyxxQkFBcUIsTUFBTSxPQUFRO0FBQ2hFLFlBQU0sT0FBTyxNQUFNLGlCQUFpQjtBQUNwQyxZQUFNLEtBQUssS0FBSyxHQUFHLFFBQVEsWUFBWSxFQUFFO0FBQ3pDLFVBQUksT0FBTyx1QkFBdUIsV0FBWSxvQkFBbUIsSUFBSSxRQUFRO0FBQUEsSUFDL0UsV0FBVyxRQUFRLFNBQVM7QUFDMUIsWUFBTSxRQUFRLFVBQVU7QUFDeEIsVUFBSSxvQkFBb0IsS0FBSyxxQkFBcUIsTUFBTSxPQUFRO0FBRWhFLFlBQU0sTUFBTSxNQUFNLGlCQUFpQixFQUFFLGNBQWMsdUNBQXVDO0FBQzFGLFVBQUksSUFBSyxLQUFJLE1BQU07QUFBQSxJQUNyQjtBQUFBLEVBQ0Y7QUFHQSxXQUFTLHFCQUFxQjtBQUM1QixVQUFNLE1BQU0sT0FBTyxpQkFBaUIsY0FBYyxhQUFhLGNBQWMsSUFBSTtBQUNqRixRQUFJLFFBQVEsV0FBVztBQUNyQixZQUFNLFFBQVEsVUFBVTtBQUN4QixVQUFJLG9CQUFvQixLQUFLLHFCQUFxQixNQUFNLE9BQVE7QUFDaEUsWUFBTSxPQUFPLE1BQU0saUJBQWlCO0FBQ3BDLFlBQU0sS0FBSyxLQUFLLEdBQUcsUUFBUSxZQUFZLEVBQUU7QUFDekMsVUFBSSxPQUFPLHVCQUF1QixXQUFZLG9CQUFtQixJQUFJLFFBQVE7QUFBQSxJQUMvRSxXQUFXLFFBQVEsU0FBUztBQUMxQixZQUFNLFFBQVEsVUFBVTtBQUN4QixVQUFJLG9CQUFvQixLQUFLLHFCQUFxQixNQUFNLE9BQVE7QUFDaEUsWUFBTSxNQUFNLE1BQU0saUJBQWlCLEVBQUUsY0FBYyx5Q0FBeUM7QUFDNUYsVUFBSSxJQUFLLEtBQUksTUFBTTtBQUFBLElBQ3JCO0FBQUEsRUFDRjtBQUlBLE1BQU0sWUFBWTtBQUdYLFdBQVMsNkJBQTZCO0FBQzNDLFVBQU0sV0FBVyxTQUFTLGVBQWUsU0FBUztBQUNsRCxRQUFJLFVBQVU7QUFBRSxlQUFTLE9BQU87QUFBRztBQUFBLElBQVE7QUFFM0MsVUFBTSxRQUFRLFNBQVMsY0FBYyxLQUFLO0FBQzFDLFVBQU0sS0FBSztBQUNYLFVBQU0sYUFBYSxRQUFRLFFBQVE7QUFDbkMsVUFBTSxhQUFhLGNBQWMsTUFBTTtBQUN2QyxVQUFNLGFBQWEsY0FBYyxvQkFBb0I7QUFDckQsVUFBTSxZQUFZO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFvQmxCLFdBQU8sT0FBTyxNQUFNLE9BQU87QUFBQSxNQUN6QixVQUFZO0FBQUEsTUFDWixRQUFZO0FBQUEsTUFDWixPQUFZO0FBQUEsTUFDWixZQUFZO0FBQUEsTUFDWixPQUFZO0FBQUEsTUFDWixRQUFZO0FBQUEsTUFDWixjQUFjO0FBQUEsTUFDZCxTQUFZO0FBQUEsTUFDWixRQUFZO0FBQUEsTUFDWixVQUFZO0FBQUEsTUFDWixVQUFZO0FBQUEsTUFDWixXQUFZO0FBQUEsSUFDZCxDQUFDO0FBQ0QsYUFBUyxLQUFLLFlBQVksS0FBSztBQUMvQixVQUFNLGNBQWMscUJBQXFCLEVBQUUsaUJBQWlCLFNBQVMsTUFBTSxNQUFNLE9BQU8sQ0FBQztBQUFBLEVBQzNGO0FBS08sV0FBU0Esa0JBQWlCO0FBQy9CLHdCQUFvQjtBQUNwQixhQUFTLGlCQUFpQixhQUFhLEVBQUUsUUFBUSxRQUFNLEdBQUcsVUFBVSxPQUFPLFlBQVksQ0FBQztBQUFBLEVBQzFGO0FBSUEsV0FBUyxXQUFXLEdBQUc7QUFHckIsUUFBSSxFQUFFLFdBQVcsRUFBRSxRQUFRLFNBQVM7QUFDbEMsNEJBQXNCO0FBQ3RCO0FBQUEsSUFDRjtBQUdBLFFBQUksRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLFFBQVEsS0FBSztBQUM1QyxZQUFNLFdBQVcsU0FBUyxjQUFjLHNCQUFzQjtBQUM5RCxZQUFNLE9BQU8sV0FBVyxTQUFTLEdBQUcsUUFBUSxTQUFTLEVBQUUsSUFBSTtBQUMzRCxVQUFJLFFBQVEsT0FBTyxzQkFBc0IsWUFBWTtBQUNuRCxVQUFFLGVBQWU7QUFDakIsMEJBQWtCLElBQUk7QUFBQSxNQUN4QjtBQUNBO0FBQUEsSUFDRjtBQU9BLFFBQUksRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLEVBQUUsUUFBUSxPQUFPLEVBQUUsUUFBUSxRQUNuRCxtQkFBbUIsS0FBSyxDQUFDLFNBQVMsZUFBZSx3QkFBd0IsS0FDekUsQ0FBQyxhQUFhLEdBQUc7QUFDdEIsUUFBRSxlQUFlO0FBQ2pCLFVBQUksRUFBRSxVQUFVO0FBQ2QsWUFBSSxPQUFPLHlCQUF5QixXQUFZLHNCQUFxQjtBQUFBLE1BQ3ZFLE9BQU87QUFDTCxZQUFJLE9BQU8seUJBQXlCLFdBQVksc0JBQXFCO0FBQUEsTUFDdkU7QUFDQTtBQUFBLElBQ0Y7QUFHQSxRQUFJLGFBQWEsRUFBRztBQUdwQixRQUFJLFdBQVcsRUFBRztBQUVsQixZQUFRLEVBQUUsS0FBSztBQUFBLE1BQ2IsS0FBSztBQUNILFVBQUUsZUFBZTtBQUNqQixtQ0FBMkI7QUFDM0I7QUFBQSxNQUNGLEtBQUs7QUFDSCxVQUFFLGVBQWU7QUFDakIsdUJBQWUsRUFBRTtBQUNqQjtBQUFBLE1BQ0YsS0FBSztBQUNILFVBQUUsZUFBZTtBQUNqQix1QkFBZSxDQUFDO0FBQ2hCO0FBQUEsTUFDRixLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQ0gsMkJBQW1CO0FBQ25CO0FBQUEsTUFDRixLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQ0gsMkJBQW1CO0FBQ25CO0FBQUEsTUFDRjtBQUNFO0FBQUEsSUFDSjtBQUFBLEVBQ0Y7QUFRTyxXQUFTRCx5QkFBd0I7QUFDdEMsYUFBUyxpQkFBaUIsV0FBVyxVQUFVO0FBQUEsRUFDakQ7OztBQ2hSQTtBQUFBO0FBQUE7QUFBQSwrQkFBQUU7QUFBQTtBQVNBLE1BQU0sVUFBVyxPQUFPLGFBQWEsY0FBZSxTQUFTLFVBQVUsS0FBSyxJQUFJO0FBR2hGLE1BQUksdUJBQXVCO0FBRTNCLFdBQVMsc0JBQXNCLGFBQWFDLE9BQU0sT0FBTyxRQUFRO0FBQy9ELFFBQUksQ0FBQyxZQUFhO0FBQ2xCLFVBQU0sVUFBVSxZQUFZLGNBQWMsVUFBVTtBQUNwRCxRQUFJLENBQUMsUUFBUztBQUNkLFlBQVEsY0FBY0E7QUFDdEIsWUFBUSxNQUFNLFVBQVU7QUFDeEIsWUFBUSxNQUFNLFVBQVU7QUFDeEIsWUFBUSxNQUFNLGVBQWU7QUFDN0IsWUFBUSxNQUFNLGFBQWE7QUFDM0IsWUFBUSxNQUFNLFdBQVc7QUFDekIsWUFBUSxNQUFNLFNBQVM7QUFDdkIsUUFBSSxTQUFTLFdBQVc7QUFDdEIsY0FBUSxNQUFNLFFBQVE7QUFDdEIsY0FBUSxNQUFNLGFBQWE7QUFDM0IsY0FBUSxNQUFNLGNBQWM7QUFBQSxJQUM5QixXQUFXLFNBQVMsU0FBUztBQUMzQixjQUFRLE1BQU0sUUFBUTtBQUN0QixjQUFRLE1BQU0sYUFBYTtBQUMzQixjQUFRLE1BQU0sY0FBYztBQUFBLElBQzlCLE9BQU87QUFDTCxjQUFRLE1BQU0sUUFBUTtBQUN0QixjQUFRLE1BQU0sYUFBYTtBQUMzQixjQUFRLE1BQU0sY0FBYztBQUFBLElBQzlCO0FBQUEsRUFDRjtBQUVBLGlCQUFlLE9BQU87QUFFcEIsV0FBTywwQkFBMEI7QUFHakMsdUJBQW1CO0FBRW5CLFVBQU0sbUJBQW1CLE1BQU0scUJBQXFCO0FBQ3BELFFBQUksQ0FBQyxrQkFBa0I7QUFDckIsWUFBTSxnQkFBZ0IsY0FBYyxVQUFVLG1GQUF5RTtBQUN2SCw0QkFBc0IsZUFBZSxxRkFBMkUsT0FBTztBQUN2SCxNQUFBRCxxQkFBb0I7QUFDcEI7QUFBQSxJQUNGO0FBR0EsVUFBTSxzQkFBc0I7QUFHNUIsVUFBTSxlQUFlO0FBR3JCLFVBQU0sb0JBQW9CLGNBQWMsVUFBVSx1Q0FBZ0M7QUFDbEYsMEJBQXNCLG1CQUFtQix5Q0FBa0MsTUFBTTtBQUdqRixtQkFBZSxhQUFhLFlBQVksQ0FBQztBQUd6QyxVQUFNLFlBQVk7QUFDbEIsVUFBTSxtQkFBbUIsY0FBYyxVQUFVLCtCQUEwQjtBQUMzRSwwQkFBc0Isa0JBQWtCLGlDQUE0QixTQUFTO0FBQzdFLFFBQUksYUFBYSxjQUFjLE1BQU0sTUFBTyxPQUFNLGVBQWU7QUFDakUsSUFBQUEscUJBQW9CO0FBR3BCLGdCQUFZLGFBQWEsR0FBSTtBQUc3QixXQUFPLGlCQUFpQixnQkFBZ0IsTUFBTTtBQUM1QyxrQkFBWTtBQUNaLFlBQU0sa0JBQWtCLGFBQWEsYUFBYTtBQUNsRCxVQUFJLGlCQUFpQjtBQUNuQixxQkFBYSxRQUFRLFlBQVksWUFBWSxlQUFlO0FBQUEsTUFDOUQ7QUFBQSxJQUNGLENBQUM7QUFLRCxRQUFJLENBQUMsYUFBYSxlQUFlLEdBQUc7QUFDbEMsWUFBTSxTQUFTLE1BQU0sWUFBWTtBQUNqQyxVQUFJLENBQUMsT0FBTyxVQUFVLE9BQU8sbUJBQW1CLENBQUMsT0FBTyxjQUFjO0FBQ3BFLHNCQUFjLFVBQVUsbUdBQXVGO0FBQy9HLGNBQU0sYUFBYSxTQUFTLGVBQWUsYUFBYTtBQUN4RCxZQUFJLFlBQVk7QUFDZCxxQkFBVyxNQUFNLFVBQVU7QUFDM0IscUJBQVcsTUFBTSxnQkFBZ0I7QUFBQSxRQUNuQztBQUFBLE1BQ0YsV0FBVyxPQUFPLGNBQWM7QUFDOUIsZ0JBQVEsS0FBSyx1REFBdUQ7QUFBQSxNQUN0RTtBQUFBLElBQ0YsT0FBTztBQUNMLGNBQVEsS0FBSywwREFBMEQ7QUFBQSxJQUN6RTtBQUFBLEVBQ0Y7QUFFQSxXQUFTQSx1QkFBc0I7QUFDN0IsUUFBSSxxQkFBc0I7QUFDMUIsMkJBQXVCO0FBR3ZCLGFBQVMsaUJBQWlCLE1BQU0sRUFBRSxRQUFRLFNBQU87QUFDL0MsVUFBSSxpQkFBaUIsU0FBUyxNQUFNLFVBQVUsSUFBSSxRQUFRLEdBQUcsQ0FBQztBQUFBLElBQ2hFLENBQUM7QUFHRCxhQUFTLGVBQWUsVUFBVSxFQUFFLGlCQUFpQixTQUFTLFdBQVc7QUFDekUsYUFBUyxlQUFlLGVBQWUsRUFBRSxpQkFBaUIsWUFBWSxDQUFDLE1BQU07QUFDM0UsVUFBSSxFQUFFLFFBQVEsUUFBUyxhQUFZO0FBQUEsSUFDckMsQ0FBQztBQUdELGFBQVMsZUFBZSxhQUFhLEVBQUUsaUJBQWlCLFNBQVMsVUFBVTtBQUMzRSxhQUFTLGVBQWUsZUFBZSxFQUFFLGlCQUFpQixTQUFTLE1BQU0sV0FBVywwQkFBMEIsQ0FBQztBQUMvRyxhQUFTLGVBQWUsY0FBYyxFQUFFLGlCQUFpQixTQUFTLFlBQVk7QUFFNUUsWUFBTSxXQUFXLE9BQU8sdUJBQXVCLEVBQUUsYUFBYSxvQkFBSSxJQUFJLEdBQUcsUUFBUSxvQkFBSSxJQUFJLEVBQUU7QUFDM0YsWUFBTSxZQUFZLE9BQU8sdUJBQXVCLENBQUMsR0FBRztBQUNwRCxZQUFNLGFBQWEsT0FBTyxLQUFLLGdCQUFnQixVQUFVLENBQUMsQ0FBQyxFQUFFO0FBQzdELFlBQU0sZ0JBQWdCLFdBQVcsU0FBUyxZQUFZO0FBQ3RELFlBQU0sa0JBQWtCLGFBQWEsU0FBUyxPQUFPO0FBQ3JELFlBQU0sa0JBQWtCLEtBQUssSUFBSSxHQUFHLGFBQWEsSUFBSSxLQUFLLElBQUksR0FBRyxlQUFlO0FBQ2hGLFVBQUksa0JBQWtCLEdBQUc7QUFDdkIsY0FBTSxRQUFRLENBQUM7QUFDZixZQUFJLGdCQUFnQixFQUFHLE9BQU0sS0FBSyxHQUFHLGFBQWEsbUJBQW1CLGtCQUFrQixJQUFJLE1BQU0sS0FBSyxFQUFFO0FBQ3hHLFlBQUksa0JBQWtCLEVBQUcsT0FBTSxLQUFLLEdBQUcsZUFBZSxTQUFTLG9CQUFvQixJQUFJLEtBQUssR0FBRyxFQUFFO0FBQ2pHLGNBQU0sS0FBSyxPQUFPO0FBQUEsVUFDaEIsR0FBRyxNQUFNLEtBQUssT0FBTyxDQUFDO0FBQUE7QUFBQTtBQUFBLFFBQ3hCO0FBQ0EsWUFBSSxDQUFDLEdBQUk7QUFBQSxNQUNYO0FBQ0EsVUFBSSxtQkFBbUIsT0FBTyxLQUFLLGVBQWUsV0FBVyxFQUFFLFNBQVMsS0FBSyxPQUFPLEtBQUssZUFBZSxNQUFNLEVBQUUsU0FBUyxJQUFJO0FBQzNILHNCQUFjLFVBQVUsbUNBQW1DO0FBQUEsTUFHN0Q7QUFDQSxZQUFNLHVCQUF1QjtBQUFBLElBQy9CLENBQUM7QUFDRCxhQUFTLGVBQWUsYUFBYSxFQUFFLGlCQUFpQixTQUFTLHNCQUFzQjtBQUN2RixhQUFTLGVBQWUsV0FBVyxFQUFFLGlCQUFpQixTQUFTLHlCQUF5QjtBQUN4RixhQUFTLGVBQWUsc0JBQXNCLEVBQUUsaUJBQWlCLFNBQVMsTUFBTSxVQUFVLFFBQVEsQ0FBQztBQUNuRyxhQUFTLGVBQWUsWUFBWSxFQUFFLGlCQUFpQixTQUFTLHlCQUF5QjtBQUN6RixhQUFTLGVBQWUsNEJBQTRCLEVBQUUsaUJBQWlCLFNBQVMsdUJBQXVCO0FBQ3ZHLGFBQVMsZUFBZSxxQkFBcUIsRUFBRSxpQkFBaUIsU0FBUyxNQUFNLFVBQVUsVUFBVSxDQUFDO0FBRXBHLFFBQUksT0FBTywwQkFBMEIsV0FBWSx1QkFBc0I7QUFBQSxFQUN6RTs7O0FDL0RBLFNBQU87QUFBQSxJQUFPO0FBQUEsSUFDWjtBQUFBLElBQVE7QUFBQSxJQUFPO0FBQUEsSUFBVztBQUFBLElBQU87QUFBQSxJQUFjO0FBQUEsSUFBUTtBQUFBLElBQ3ZEO0FBQUEsSUFBWTtBQUFBLElBQXVCO0FBQUEsSUFBVztBQUFBLElBQzlDO0FBQUEsSUFBWTtBQUFBLElBQWM7QUFBQSxJQUMxQjtBQUFBLElBQWM7QUFBQSxJQUFlO0FBQUEsSUFBVztBQUFBLElBQWdCO0FBQUEsSUFDeEQ7QUFBQSxJQUNBO0FBQUEsSUFBZ0I7QUFBQSxJQUFVO0FBQUEsSUFBaUI7QUFBQSxJQUMzQztBQUFBLElBQ0E7QUFBQSxJQUFrQjtBQUFBLElBQWM7QUFBQSxJQUFvQjtBQUFBLElBQWU7QUFBQSxJQUFlO0FBQUEsSUFBb0I7QUFBQSxJQUN0RztBQUFBLElBQWU7QUFBQSxJQUFZO0FBQUEsSUFBYTtBQUFBLElBQWU7QUFBQSxJQUFlO0FBQUEsSUFBb0I7QUFBQSxJQUMxRjtBQUFBLElBQWE7QUFBQSxJQUFvQjtBQUFBLElBQVU7QUFBQSxJQUFlO0FBQUEsSUFBVTtBQUFBLElBQ3BFO0FBQUEsSUFBbUI7QUFBQSxJQUNuQjtBQUFBLEVBQ0Y7QUFFQSxXQUFTLGlCQUFpQixvQkFBd0IsSUFBSTsiLAogICJuYW1lcyI6IFsiZ2V0TG9nZ2VyIiwgImxvZ2dlciIsICJsb2dsZXZlbCIsICJjbGVhbkpzb25SZXNwb25zZSIsICJlc2NhcGVIdG1sIiwgImV4dHJhY3RGaXJzdEpzb25PYmplY3QiLCAiZXh0cmFjdFRpdGxlQW5kQ29tcGFueUZyb21Kb2JUZXh0IiwgImZvcm1hdFNlc3Npb25QaGFzZUxhYmVsIiwgIm5vcm1hbGl6ZVBvc2l0aW9uTGFiZWwiLCAibm9ybWFsaXplVGV4dCIsICJ0ZXh0IiwgIm0iLCAiaHRtbCIsICJ2IiwgIlN0b3JhZ2VLZXlzIiwgImFwaUNhbGwiLCAiY3JlYXRlU2Vzc2lvbiIsICJmZXRjaFN0YXR1cyIsICJnZXRPd25lclRva2VuIiwgImdldFNjb3BlZFRhYkRhdGFTdG9yYWdlS2V5IiwgImdldFNlc3Npb25JZEZyb21VUkwiLCAiX3VwZGF0ZUxMTVN0YXR1c0JhciIsICJsbG1GZXRjaCIsICJzZXRMb2FkaW5nIiwgIl8iLCAiaW5pdCIsICJjaGF0QXJlYSIsICJTdG9yYWdlS2V5cyIsICJnZXRTZXNzaW9uSWRGcm9tVVJMIiwgImdldE93bmVyVG9rZW4iLCAiZ2V0U2NvcGVkVGFiRGF0YVN0b3JhZ2VLZXkiLCAic2Vzc2lvbklkIiwgImluaXQiLCAiXyIsICJhcGlDYWxsIiwgImNyZWF0ZVNlc3Npb24iLCAiZmV0Y2hTdGF0dXMiLCAiUEhBU0VTIiwgInN0YXRlTWFuYWdlciIsICJsb2ciLCAiUEhBU0VTIiwgInN0YXRlTWFuYWdlciIsICJTdG9yYWdlS2V5cyIsICJnZXRQcm92aWRlckluZm8iLCAibG9hZFByb3ZpZGVySW5mbyIsICJwcm92aWRlckluZm9Qb3BvdmVyQ29udGVudCIsICJsb2FkUHJvdmlkZXJJbmZvIiwgImdldFByb3ZpZGVySW5mbyIsICJwcm92aWRlckluZm9Qb3BvdmVyQ29udGVudCIsICJlc2NhcGVIdG1sIiwgIl91cGRhdGVMbG1TdGF0dXNQaWxsIiwgImNsb3NlTW9kZWxNb2RhbCIsICJjb25maXJtRGlhbG9nIiwgImdldFN0YWdlRm9yVGFiIiwgInB1c2hGb2N1c1N0YWNrIiwgInJlc3RvcmVGb2N1cyIsICJzZXRJbml0aWFsRm9jdXMiLCAidHJhcEZvY3VzIiwgInVwZGF0ZVRhYkJhckZvclN0YWdlIiwgImxvZyIsICJmZXRjaFN0YXR1cyIsICJhcGlDYWxsIiwgIl8iLCAic2V0SW5pdGlhbEZvY3VzIiwgInRyYXBGb2N1cyIsICJyZXN0b3JlRm9jdXMiLCAicHVzaEZvY3VzU3RhY2siLCAiY29uZmlybURpYWxvZyIsICJnZXRTdGFnZUZvclRhYiIsICJzdGF0ZU1hbmFnZXIiLCAidXBkYXRlVGFiQmFyRm9yU3RhZ2UiLCAiU3RvcmFnZUtleXMiLCAiX3VwZGF0ZUxsbVN0YXR1c1BpbGwiLCAidGV4dCIsICJiIiwgImVzY2FwZUh0bWwiLCAiY2xvc2VNb2RlbE1vZGFsIiwgInYiLCAibSIsICJldmVudCIsICJ1cGRhdGVXb3JrZmxvd1N0ZXBzQ2xpY2thYmxlIiwgImhhbmRsZUxheW91dFByaW1hcnlBY3Rpb24iLCAiaW5pdGlhdGVMYXlvdXRJbnN0cnVjdGlvbnMiLCAicmVmcmVzaEF0c1Njb3JlIiwgInNjaGVkdWxlQXRzUmVmcmVzaCIsICJ1cGRhdGVBdHNCYWRnZSIsICJ0ZXh0IiwgImdlbmVyYXRpb25TdGF0ZSIsICJzZXNzaW9uSWQiLCAiX2UiLCAiX2ZsdXNoTWVzc2FnZVF1ZXVlIiwgImFwcGVuZEZvcm1hdHRlZEFuYWx5c2lzIiwgImFwcGVuZExvYWRpbmdNZXNzYWdlIiwgImFwcGVuZE1lc3NhZ2UiLCAiYXBwZW5kUmF3SHRtbCIsICJhcHBlbmRSZXRyeU1lc3NhZ2UiLCAicmVtb3ZlTG9hZGluZ01lc3NhZ2UiLCAibG9nIiwgIl9mbHVzaE1lc3NhZ2VRdWV1ZSIsICJ0ZXh0IiwgImFwcGVuZE1lc3NhZ2UiLCAiYXBwZW5kTG9hZGluZ01lc3NhZ2UiLCAicmVtb3ZlTG9hZGluZ01lc3NhZ2UiLCAiaHRtbCIsICJlc2NhcGVIdG1sIiwgImFwcGVuZFJldHJ5TWVzc2FnZSIsICJhcHBlbmRGb3JtYXR0ZWRBbmFseXNpcyIsICJjbGVhbkpzb25SZXNwb25zZSIsICJhcHBlbmRSYXdIdG1sIiwgIl91cGRhdGVQYWdlRXN0aW1hdGUiLCAiaGFuZGxlQWN0aW9uQ2xpY2siLCAiaGFuZGxlQ3VzdG9taXphdGlvblJlc3BvbnNlIiwgInNob3dUYWJsZUJhc2VkUmV2aWV3IiwgInN3aXRjaFRhYiIsICJ1cGRhdGVJbmNsdXNpb25Db3VudHMiLCAidXNlclNlbGVjdGlvbnMiLCAibG9nIiwgInVzZXJTZWxlY3Rpb25zIiwgInN0YXRlTWFuYWdlciIsICJ1cGRhdGVJbmNsdXNpb25Db3VudHMiLCAidiIsICJzd2l0Y2hUYWIiLCAidGFiRGF0YSIsICJzaG93VGFibGVCYXNlZFJldmlldyIsICJzZXNzaW9uSWQiLCAiXyIsICJodG1sIiwgImhhbmRsZUN1c3RvbWl6YXRpb25SZXNwb25zZSIsICJzdGF0ZU1hbmFnZXIiLCAiX3VwZGF0ZVBhZ2VFc3RpbWF0ZSIsICJ1c2VyU2VsZWN0aW9ucyIsICJoYW5kbGVBY3Rpb25DbGljayIsICJfdXBkYXRlVmlld2luZ0luZGljYXRvciIsICJjb25maXJtUmVSdW5QaGFzZSIsICJzaG93QnVsbGV0UmVvcmRlciIsICJsb2ciLCAic3RhdGVNYW5hZ2VyIiwgImdlbmVyYXRpb25TdGF0ZSIsICJjb25maXJtUmVSdW5QaGFzZSIsICJfdXBkYXRlVmlld2luZ0luZGljYXRvciIsICJxIiwgImNsb3NlTW9kYWwiLCAiX2UiLCAic2hvd0J1bGxldFJlb3JkZXIiLCAiXyIsICJ0ZXh0IiwgImxvZyIsICJzdGF0ZU1hbmFnZXIiLCAiaHRtbCIsICJzZXNzaW9uSWQiLCAiZXNjYXBlSHRtbCIsICJ0ZXh0IiwgImdlbmVyYXRpb25TdGF0ZSIsICJpbml0aWF0ZUxheW91dEluc3RydWN0aW9ucyIsICJfIiwgImFwcGVuZE1lc3NhZ2UiLCAiY29uZmlybVJlUnVuUGhhc2UiLCAiYXBpQ2FsbCIsICJ3IiwgIl9lIiwgInNjaGVkdWxlQXRzUmVmcmVzaCIsICJzd2l0Y2hUYWIiLCAiaGFuZGxlTGF5b3V0UHJpbWFyeUFjdGlvbiIsICJwYXJzZU1lc3NhZ2VSZXNwb25zZSIsICJwYXJzZVJld3JpdGVzUmVzcG9uc2UiLCAicGFyc2VTZXNzaW9uTGlzdFJlc3BvbnNlIiwgInBhcnNlU3RhdHVzUmVzcG9uc2UiLCAibG9nIiwgInBhcnNlU3RhdHVzUmVzcG9uc2UiLCAiayIsICJwYXJzZVNlc3Npb25MaXN0UmVzcG9uc2UiLCAicGFyc2VSZXdyaXRlc1Jlc3BvbnNlIiwgInBhcnNlTWVzc2FnZVJlc3BvbnNlIiwgImJ1aWxkRmFsbGJhY2tQb3N0QW5hbHlzaXNRdWVzdGlvbnMiLCAiZ2V0QWNoaWV2ZW1lbnRDb25maWRlbmNlIiwgImdldEFjaGlldmVtZW50UmVhc29uaW5nIiwgImdldEFjaGlldmVtZW50UmVjb21tZW5kYXRpb24iLCAiZ2V0Q29uZmlkZW5jZUxldmVsIiwgImdldEV4cGVyaWVuY2VSZWFzb25pbmciLCAiZ2V0RXhwZXJpZW5jZVJlY29tbWVuZGF0aW9uIiwgImdldFNraWxsQ29uZmlkZW5jZSIsICJnZXRTa2lsbFJlYXNvbmluZyIsICJnZXRTa2lsbFJlY29tbWVuZGF0aW9uIiwgImxvZyIsICJnZXRFeHBlcmllbmNlUmVjb21tZW5kYXRpb24iLCAiZ2V0Q29uZmlkZW5jZUxldmVsIiwgImdldEV4cGVyaWVuY2VSZWFzb25pbmciLCAiZ2V0U2tpbGxSZWNvbW1lbmRhdGlvbiIsICJnZXRTa2lsbENvbmZpZGVuY2UiLCAiZ2V0U2tpbGxSZWFzb25pbmciLCAiZ2V0QWNoaWV2ZW1lbnRSZWNvbW1lbmRhdGlvbiIsICJnZXRBY2hpZXZlbWVudENvbmZpZGVuY2UiLCAiZ2V0QWNoaWV2ZW1lbnRSZWFzb25pbmciLCAiYnVpbGRGYWxsYmFja1Bvc3RBbmFseXNpc1F1ZXN0aW9ucyIsICJjbG9zZUFsZXJ0TW9kYWwiLCAic2hvd0FsZXJ0TW9kYWwiLCAic2hvd0NvbmZpcm1Nb2RhbCIsICJzaG93VG9hc3QiLCAidXBkYXRlQWN0aW9uQnV0dG9ucyIsICJzaG93QWxlcnRNb2RhbCIsICJjbG9zZUFsZXJ0TW9kYWwiLCAic2hvd0NvbmZpcm1Nb2RhbCIsICJzaG93VG9hc3QiLCAic3RhdGVNYW5hZ2VyIiwgImdlbmVyYXRpb25TdGF0ZSIsICJ1cGRhdGVBY3Rpb25CdXR0b25zIiwgImV2ZW50IiwgImZldGNoQW5kRGlzcGxheUxsbUxvZyIsICJsb2ciLCAidGV4dCIsICJlc2NhcGVIdG1sIiwgIm0iLCAiaHRtbCIsICJmZXRjaEFuZERpc3BsYXlMbG1Mb2ciLCAic2Vzc2lvbklkIiwgImdldFNlc3Npb25JZEZyb21VUkwiLCAidXBkYXRlQXV0aEJhZGdlIiwgInVwZGF0ZUF1dGhCYWRnZSIsICJ0ZXh0IiwgImdldFByb3ZpZGVySW5mbyIsICJwb3B1bGF0ZUF0c1Njb3JlVGFiIiwgInNlc3Npb25JZCIsICJzdGF0ZU1hbmFnZXIiLCAiXyIsICJlc2NhcGVIdG1sIiwgInB1c2hGb2N1c1N0YWNrIiwgInRyYXBGb2N1cyIsICJ1cGRhdGVBdHNCYWRnZSIsICJyZXN0b3JlRm9jdXMiLCAiayIsICJwb3B1bGF0ZUF0c1Njb3JlVGFiIiwgIl9BQ1RJT05fTEFCRUxTIiwgInNlbmRBY3Rpb24iLCAidXBkYXRlUG9zaXRpb25UaXRsZSIsICJsb2ciLCAiX0FDVElPTl9MQUJFTFMiLCAic2VuZEFjdGlvbiIsICJzdGF0ZU1hbmFnZXIiLCAiX2UiLCAiU3RvcmFnZUtleXMiLCAidGV4dCIsICJ1cGRhdGVQb3NpdGlvblRpdGxlIiwgImFuYWx5emVKb2IiLCAibWVyZ2VQb3N0QW5hbHlzaXNRdWVzdGlvbnMiLCAibm9ybWFsaXplUG9zdEFuYWx5c2lzUXVlc3Rpb25zIiwgImxvZyIsICJub3JtYWxpemVQb3N0QW5hbHlzaXNRdWVzdGlvbnMiLCAicSIsICJ0ZXh0IiwgIm1lcmdlUG9zdEFuYWx5c2lzUXVlc3Rpb25zIiwgImFuYWx5emVKb2IiLCAic3RhdGVNYW5hZ2VyIiwgIlN0b3JhZ2VLZXlzIiwgIl9lIiwgInBvcHVsYXRlR29hbHNUYWIiLCAibG9nIiwgInBvcHVsYXRlR29hbHNUYWIiLCAiX2dldEN1cnJlbnRTZXNzaW9uSWRWYWx1ZSIsICJidWlsZFNlc3Npb25Td2l0Y2hlckxhYmVsIiwgImNyZWF0ZU5ld1Nlc3Npb25BbmROYXZpZ2F0ZSIsICJlbnN1cmVTZXNzaW9uQ29udGV4dCIsICJmb3JtYXRTZXNzaW9uUGhhc2VMYWJlbCIsICJmb3JtYXRTZXNzaW9uVGltZXN0YW1wIiwgImdldEFjdGl2ZVNlc3Npb25Pd25lcnNoaXBNZXRhIiwgImxvYWRTZXNzaW9uRmlsZSIsICJtYXliZVNob3dXZWxjb21lTW9kYWwiLCAicmVzdG9yZVNlc3Npb24iLCAic2F2ZVRhYkRhdGEiLCAibG9nIiwgImZvcm1hdFNlc3Npb25QaGFzZUxhYmVsIiwgIl9nZXRDdXJyZW50U2Vzc2lvbklkVmFsdWUiLCAiXyIsICJidWlsZFNlc3Npb25Td2l0Y2hlckxhYmVsIiwgImdldEFjdGl2ZVNlc3Npb25Pd25lcnNoaXBNZXRhIiwgImZvcm1hdFNlc3Npb25UaW1lc3RhbXAiLCAibWF5YmVTaG93V2VsY29tZU1vZGFsIiwgImNyZWF0ZU5ld1Nlc3Npb25BbmROYXZpZ2F0ZSIsICJzdGF0ZU1hbmFnZXIiLCAiUEhBU0VTIiwgImVuc3VyZVNlc3Npb25Db250ZXh0IiwgInJlc3RvcmVTZXNzaW9uIiwgImsiLCAidiIsICJfZSIsICJsb2FkU2Vzc2lvbkZpbGUiLCAic2F2ZVRhYkRhdGEiLCAicG9wdWxhdGVKb2JUYWIiLCAic2hvd0xvYWRKb2JQYW5lbCIsICJfZ2V0RGVmYXVsdHMiLCAiX2RlZmF1bHRzIiwgImNoYW5nZURlZmF1bHRzIiwgIm5ld0RlZmF1bHRzIiwgIm5vb3BUZXN0IiwgImVkaXQiLCAicmVnZXgiLCAib3B0IiwgInNvdXJjZSIsICJvYmoiLCAibmFtZSIsICJ2YWwiLCAidmFsU291cmNlIiwgIm90aGVyIiwgInN1cHBvcnRzTG9va2JlaGluZCIsICJidWxsIiwgImluZGVudCIsICJuZXdsaW5lIiwgImJsb2NrQ29kZSIsICJmZW5jZXMiLCAiaHIiLCAiaGVhZGluZyIsICJidWxsZXQiLCAibGhlYWRpbmdDb3JlIiwgImxoZWFkaW5nIiwgImxoZWFkaW5nR2ZtIiwgIl9wYXJhZ3JhcGgiLCAiYmxvY2tUZXh0IiwgIl9ibG9ja0xhYmVsIiwgImRlZiIsICJsaXN0IiwgIl90YWciLCAiX2NvbW1lbnQiLCAiaHRtbCIsICJwYXJhZ3JhcGgiLCAiYmxvY2txdW90ZSIsICJibG9ja05vcm1hbCIsICJnZm1UYWJsZSIsICJibG9ja0dmbSIsICJibG9ja1BlZGFudGljIiwgImVzY2FwZSIsICJpbmxpbmVDb2RlIiwgImJyIiwgImlubGluZVRleHQiLCAiX3B1bmN0dWF0aW9uIiwgIl9wdW5jdHVhdGlvbk9yU3BhY2UiLCAiX25vdFB1bmN0dWF0aW9uT3JTcGFjZSIsICJwdW5jdHVhdGlvbiIsICJfcHVuY3R1YXRpb25HZm1TdHJvbmdFbSIsICJfcHVuY3R1YXRpb25PclNwYWNlR2ZtU3Ryb25nRW0iLCAiX25vdFB1bmN0dWF0aW9uT3JTcGFjZUdmbVN0cm9uZ0VtIiwgImJsb2NrU2tpcCIsICJlbVN0cm9uZ0xEZWxpbUNvcmUiLCAiZW1TdHJvbmdMRGVsaW0iLCAiZW1TdHJvbmdMRGVsaW1HZm0iLCAiZW1TdHJvbmdSRGVsaW1Bc3RDb3JlIiwgImVtU3Ryb25nUkRlbGltQXN0IiwgImVtU3Ryb25nUkRlbGltQXN0R2ZtIiwgImVtU3Ryb25nUkRlbGltVW5kIiwgImRlbExEZWxpbSIsICJkZWxSRGVsaW1Db3JlIiwgImRlbFJEZWxpbSIsICJhbnlQdW5jdHVhdGlvbiIsICJhdXRvbGluayIsICJfaW5saW5lQ29tbWVudCIsICJ0YWciLCAiX2lubGluZUxhYmVsIiwgImxpbmsiLCAicmVmbGluayIsICJub2xpbmsiLCAicmVmbGlua1NlYXJjaCIsICJfY2FzZUluc2Vuc2l0aXZlUHJvdG9jb2wiLCAiaW5saW5lTm9ybWFsIiwgImlubGluZVBlZGFudGljIiwgImlubGluZUdmbSIsICJpbmxpbmVCcmVha3MiLCAiYmxvY2siLCAiaW5saW5lIiwgImVzY2FwZVJlcGxhY2VtZW50cyIsICJnZXRFc2NhcGVSZXBsYWNlbWVudCIsICJjaCIsICJlc2NhcGVIdG1sRW50aXRpZXMiLCAiZW5jb2RlIiwgImNsZWFuVXJsIiwgImhyZWYiLCAic3BsaXRDZWxscyIsICJ0YWJsZVJvdyIsICJjb3VudCIsICJyb3ciLCAibWF0Y2giLCAib2Zmc2V0IiwgInN0ciIsICJlc2NhcGVkIiwgImN1cnIiLCAiY2VsbHMiLCAiaSIsICJydHJpbSIsICJjIiwgImludmVydCIsICJsIiwgInN1ZmZMZW4iLCAiY3VyckNoYXIiLCAiZmluZENsb3NpbmdCcmFja2V0IiwgImIiLCAibGV2ZWwiLCAiZXhwYW5kVGFicyIsICJsaW5lIiwgImNvbCIsICJleHBhbmRlZCIsICJjaGFyIiwgImFkZGVkIiwgIm91dHB1dExpbmsiLCAiY2FwIiwgInJhdyIsICJsZXhlciIsICJydWxlcyIsICJ0aXRsZSIsICJ0ZXh0IiwgInRva2VuIiwgImluZGVudENvZGVDb21wZW5zYXRpb24iLCAibWF0Y2hJbmRlbnRUb0NvZGUiLCAiaW5kZW50VG9Db2RlIiwgIm5vZGUiLCAibWF0Y2hJbmRlbnRJbk5vZGUiLCAiaW5kZW50SW5Ob2RlIiwgIl9Ub2tlbml6ZXIiLCAib3B0aW9ucyIsICJzcmMiLCAidHJpbW1lZCIsICJsaW5lcyIsICJ0b2tlbnMiLCAiaW5CbG9ja3F1b3RlIiwgImN1cnJlbnRMaW5lcyIsICJjdXJyZW50UmF3IiwgImN1cnJlbnRUZXh0IiwgInRvcCIsICJsYXN0VG9rZW4iLCAib2xkVG9rZW4iLCAibmV3VGV4dCIsICJuZXdUb2tlbiIsICJpc29yZGVyZWQiLCAiaXRlbVJlZ2V4IiwgImVuZHNXaXRoQmxhbmtMaW5lIiwgImVuZEVhcmx5IiwgIml0ZW1Db250ZW50cyIsICJuZXh0TGluZSIsICJibGFua0xpbmUiLCAibmV4dEJ1bGxldFJlZ2V4IiwgImhyUmVnZXgiLCAiZmVuY2VzQmVnaW5SZWdleCIsICJoZWFkaW5nQmVnaW5SZWdleCIsICJodG1sQmVnaW5SZWdleCIsICJibG9ja3F1b3RlQmVnaW5SZWdleCIsICJyYXdMaW5lIiwgIm5leHRMaW5lV2l0aG91dFRhYnMiLCAibGFzdEl0ZW0iLCAiaXRlbSIsICJ0YXNrUmF3IiwgImNoZWNrYm94VG9rZW4iLCAic3BhY2VycyIsICJ0IiwgImhhc011bHRpcGxlTGluZUJyZWFrcyIsICJoZWFkZXJzIiwgImFsaWducyIsICJyb3dzIiwgImFsaWduIiwgImNlbGwiLCAidHJpbW1lZFVybCIsICJydHJpbVNsYXNoIiwgImxhc3RQYXJlbkluZGV4IiwgImxpbmtMZW4iLCAibGlua3MiLCAibGlua1N0cmluZyIsICJtYXNrZWRTcmMiLCAicHJldkNoYXIiLCAibExlbmd0aCIsICJyRGVsaW0iLCAickxlbmd0aCIsICJkZWxpbVRvdGFsIiwgIm1pZERlbGltVG90YWwiLCAiZW5kUmVnIiwgImxhc3RDaGFyTGVuZ3RoIiwgImhhc05vblNwYWNlQ2hhcnMiLCAiaGFzU3BhY2VDaGFyc09uQm90aEVuZHMiLCAicHJldkNhcFplcm8iLCAiX0xleGVyIiwgIl9fTGV4ZXIiLCAibmV4dCIsICJsYXN0UGFyYWdyYXBoQ2xpcHBlZCIsICJleHRUb2tlbml6ZXIiLCAiY3V0U3JjIiwgInN0YXJ0SW5kZXgiLCAidGVtcFNyYyIsICJ0ZW1wU3RhcnQiLCAiZ2V0U3RhcnRJbmRleCIsICJlcnJNc2ciLCAia2VlcFByZXZDaGFyIiwgIl9SZW5kZXJlciIsICJsYW5nIiwgImxhbmdTdHJpbmciLCAiY29kZSIsICJkZXB0aCIsICJvcmRlcmVkIiwgInN0YXJ0IiwgImJvZHkiLCAiaiIsICJ0eXBlIiwgInN0YXJ0QXR0ciIsICJjaGVja2VkIiwgImhlYWRlciIsICJrIiwgImNvbnRlbnQiLCAiY2xlYW5IcmVmIiwgIm91dCIsICJfVGV4dFJlbmRlcmVyIiwgIl9QYXJzZXIiLCAiX19QYXJzZXIiLCAiYW55VG9rZW4iLCAiZ2VuZXJpY1Rva2VuIiwgInJldCIsICJyZW5kZXJlciIsICJfSG9va3MiLCAibWFya2Rvd24iLCAiTWFya2VkIiwgImFyZ3MiLCAiY2FsbGJhY2siLCAidmFsdWVzIiwgInRhYmxlVG9rZW4iLCAibGlzdFRva2VuIiwgImNoaWxkVG9rZW5zIiwgImV4dGVuc2lvbnMiLCAicGFjayIsICJvcHRzIiwgImV4dCIsICJwcmV2UmVuZGVyZXIiLCAiZXh0TGV2ZWwiLCAicHJvcCIsICJyZW5kZXJlclByb3AiLCAicmVuZGVyZXJGdW5jIiwgInRva2VuaXplciIsICJ0b2tlbml6ZXJQcm9wIiwgInRva2VuaXplckZ1bmMiLCAicHJldlRva2VuaXplciIsICJob29rcyIsICJob29rc1Byb3AiLCAiaG9va3NGdW5jIiwgInByZXZIb29rIiwgImFyZyIsICJ3YWxrVG9rZW5zIiwgInBhY2tXYWxrdG9rZW5zIiwgImJsb2NrVHlwZSIsICJvcmlnT3B0IiwgInRocm93RXJyb3IiLCAicHJvY2Vzc2VkU3JjIiwgInByb2Nlc3NlZFRva2VucyIsICJlIiwgInNpbGVudCIsICJhc3luYyIsICJtc2ciLCAibWFya2VkSW5zdGFuY2UiLCAibWFya2VkIiwgInNldE9wdGlvbnMiLCAidXNlIiwgInBhcnNlSW5saW5lIiwgInBhcnNlciIsICJfUGFyc2VyIiwgImxleGVyIiwgIl9MZXhlciIsICJlbnRyaWVzIiwgInNldFByb3RvdHlwZU9mIiwgImlzRnJvemVuIiwgImdldFByb3RvdHlwZU9mIiwgImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsICJPYmplY3QiLCAiZnJlZXplIiwgInNlYWwiLCAiY3JlYXRlIiwgImFwcGx5IiwgImNvbnN0cnVjdCIsICJSZWZsZWN0IiwgIngiLCAiZnVuYyIsICJ0aGlzQXJnIiwgIl9sZW4iLCAiYXJndW1lbnRzIiwgImxlbmd0aCIsICJhcmdzIiwgIkFycmF5IiwgIl9rZXkiLCAiRnVuYyIsICJfbGVuMiIsICJfa2V5MiIsICJhcnJheUZvckVhY2giLCAidW5hcHBseSIsICJwcm90b3R5cGUiLCAiZm9yRWFjaCIsICJhcnJheUxhc3RJbmRleE9mIiwgImxhc3RJbmRleE9mIiwgImFycmF5UG9wIiwgInBvcCIsICJhcnJheVB1c2giLCAicHVzaCIsICJhcnJheVNwbGljZSIsICJzcGxpY2UiLCAic3RyaW5nVG9Mb3dlckNhc2UiLCAiU3RyaW5nIiwgInRvTG93ZXJDYXNlIiwgInN0cmluZ1RvU3RyaW5nIiwgInRvU3RyaW5nIiwgInN0cmluZ01hdGNoIiwgIm1hdGNoIiwgInN0cmluZ1JlcGxhY2UiLCAicmVwbGFjZSIsICJzdHJpbmdJbmRleE9mIiwgImluZGV4T2YiLCAic3RyaW5nVHJpbSIsICJ0cmltIiwgIm9iamVjdEhhc093blByb3BlcnR5IiwgImhhc093blByb3BlcnR5IiwgInJlZ0V4cFRlc3QiLCAiUmVnRXhwIiwgInRlc3QiLCAidHlwZUVycm9yQ3JlYXRlIiwgInVuY29uc3RydWN0IiwgIlR5cGVFcnJvciIsICJsYXN0SW5kZXgiLCAiX2xlbjMiLCAiX2tleTMiLCAiX2xlbjQiLCAiX2tleTQiLCAiYWRkVG9TZXQiLCAic2V0IiwgImFycmF5IiwgInRyYW5zZm9ybUNhc2VGdW5jIiwgImwiLCAiZWxlbWVudCIsICJsY0VsZW1lbnQiLCAiY2xlYW5BcnJheSIsICJpbmRleCIsICJpc1Byb3BlcnR5RXhpc3QiLCAiY2xvbmUiLCAib2JqZWN0IiwgIm5ld09iamVjdCIsICJwcm9wZXJ0eSIsICJ2YWx1ZSIsICJpc0FycmF5IiwgImNvbnN0cnVjdG9yIiwgImxvb2t1cEdldHRlciIsICJwcm9wIiwgImRlc2MiLCAiZ2V0IiwgImZhbGxiYWNrVmFsdWUiLCAiaHRtbCIsICJzdmciLCAic3ZnRmlsdGVycyIsICJzdmdEaXNhbGxvd2VkIiwgIm1hdGhNbCIsICJtYXRoTWxEaXNhbGxvd2VkIiwgInRleHQiLCAieG1sIiwgIk1VU1RBQ0hFX0VYUFIiLCAiRVJCX0VYUFIiLCAiVE1QTElUX0VYUFIiLCAiREFUQV9BVFRSIiwgIkFSSUFfQVRUUiIsICJJU19BTExPV0VEX1VSSSIsICJJU19TQ1JJUFRfT1JfREFUQSIsICJBVFRSX1dISVRFU1BBQ0UiLCAiRE9DVFlQRV9OQU1FIiwgIkNVU1RPTV9FTEVNRU5UIiwgIk5PREVfVFlQRSIsICJhdHRyaWJ1dGUiLCAiY2RhdGFTZWN0aW9uIiwgImVudGl0eVJlZmVyZW5jZSIsICJlbnRpdHlOb2RlIiwgInByb2dyZXNzaW5nSW5zdHJ1Y3Rpb24iLCAiY29tbWVudCIsICJkb2N1bWVudCIsICJkb2N1bWVudFR5cGUiLCAiZG9jdW1lbnRGcmFnbWVudCIsICJub3RhdGlvbiIsICJnZXRHbG9iYWwiLCAid2luZG93IiwgIl9jcmVhdGVUcnVzdGVkVHlwZXNQb2xpY3kiLCAidHJ1c3RlZFR5cGVzIiwgInB1cmlmeUhvc3RFbGVtZW50IiwgImNyZWF0ZVBvbGljeSIsICJzdWZmaXgiLCAiQVRUUl9OQU1FIiwgImhhc0F0dHJpYnV0ZSIsICJnZXRBdHRyaWJ1dGUiLCAicG9saWN5TmFtZSIsICJjcmVhdGVIVE1MIiwgImNyZWF0ZVNjcmlwdFVSTCIsICJzY3JpcHRVcmwiLCAiXyIsICJjb25zb2xlIiwgIndhcm4iLCAiX2NyZWF0ZUhvb2tzTWFwIiwgImFmdGVyU2FuaXRpemVBdHRyaWJ1dGVzIiwgImFmdGVyU2FuaXRpemVFbGVtZW50cyIsICJhZnRlclNhbml0aXplU2hhZG93RE9NIiwgImJlZm9yZVNhbml0aXplQXR0cmlidXRlcyIsICJiZWZvcmVTYW5pdGl6ZUVsZW1lbnRzIiwgImJlZm9yZVNhbml0aXplU2hhZG93RE9NIiwgInVwb25TYW5pdGl6ZUF0dHJpYnV0ZSIsICJ1cG9uU2FuaXRpemVFbGVtZW50IiwgInVwb25TYW5pdGl6ZVNoYWRvd05vZGUiLCAiY3JlYXRlRE9NUHVyaWZ5IiwgInVuZGVmaW5lZCIsICJET01QdXJpZnkiLCAicm9vdCIsICJ2ZXJzaW9uIiwgIlZFUlNJT04iLCAicmVtb3ZlZCIsICJub2RlVHlwZSIsICJFbGVtZW50IiwgImlzU3VwcG9ydGVkIiwgIm9yaWdpbmFsRG9jdW1lbnQiLCAiY3VycmVudFNjcmlwdCIsICJEb2N1bWVudEZyYWdtZW50IiwgIkhUTUxUZW1wbGF0ZUVsZW1lbnQiLCAiTm9kZSIsICJOb2RlRmlsdGVyIiwgIk5hbWVkTm9kZU1hcCIsICJNb3pOYW1lZEF0dHJNYXAiLCAiSFRNTEZvcm1FbGVtZW50IiwgIkRPTVBhcnNlciIsICJFbGVtZW50UHJvdG90eXBlIiwgImNsb25lTm9kZSIsICJyZW1vdmUiLCAiZ2V0TmV4dFNpYmxpbmciLCAiZ2V0Q2hpbGROb2RlcyIsICJnZXRQYXJlbnROb2RlIiwgInRlbXBsYXRlIiwgImNyZWF0ZUVsZW1lbnQiLCAiY29udGVudCIsICJvd25lckRvY3VtZW50IiwgInRydXN0ZWRUeXBlc1BvbGljeSIsICJlbXB0eUhUTUwiLCAiaW1wbGVtZW50YXRpb24iLCAiY3JlYXRlTm9kZUl0ZXJhdG9yIiwgImNyZWF0ZURvY3VtZW50RnJhZ21lbnQiLCAiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCAiaW1wb3J0Tm9kZSIsICJob29rcyIsICJjcmVhdGVIVE1MRG9jdW1lbnQiLCAiRVhQUkVTU0lPTlMiLCAiQUxMT1dFRF9UQUdTIiwgIkRFRkFVTFRfQUxMT1dFRF9UQUdTIiwgIlRBR1MiLCAiQUxMT1dFRF9BVFRSIiwgIkRFRkFVTFRfQUxMT1dFRF9BVFRSIiwgIkFUVFJTIiwgIkNVU1RPTV9FTEVNRU5UX0hBTkRMSU5HIiwgInRhZ05hbWVDaGVjayIsICJ3cml0YWJsZSIsICJjb25maWd1cmFibGUiLCAiZW51bWVyYWJsZSIsICJhdHRyaWJ1dGVOYW1lQ2hlY2siLCAiYWxsb3dDdXN0b21pemVkQnVpbHRJbkVsZW1lbnRzIiwgIkZPUkJJRF9UQUdTIiwgIkZPUkJJRF9BVFRSIiwgIkVYVFJBX0VMRU1FTlRfSEFORExJTkciLCAidGFnQ2hlY2siLCAiYXR0cmlidXRlQ2hlY2siLCAiQUxMT1dfQVJJQV9BVFRSIiwgIkFMTE9XX0RBVEFfQVRUUiIsICJBTExPV19VTktOT1dOX1BST1RPQ09MUyIsICJBTExPV19TRUxGX0NMT1NFX0lOX0FUVFIiLCAiU0FGRV9GT1JfVEVNUExBVEVTIiwgIlNBRkVfRk9SX1hNTCIsICJXSE9MRV9ET0NVTUVOVCIsICJTRVRfQ09ORklHIiwgIkZPUkNFX0JPRFkiLCAiUkVUVVJOX0RPTSIsICJSRVRVUk5fRE9NX0ZSQUdNRU5UIiwgIlJFVFVSTl9UUlVTVEVEX1RZUEUiLCAiU0FOSVRJWkVfRE9NIiwgIlNBTklUSVpFX05BTUVEX1BST1BTIiwgIlNBTklUSVpFX05BTUVEX1BST1BTX1BSRUZJWCIsICJLRUVQX0NPTlRFTlQiLCAiSU5fUExBQ0UiLCAiVVNFX1BST0ZJTEVTIiwgIkZPUkJJRF9DT05URU5UUyIsICJERUZBVUxUX0ZPUkJJRF9DT05URU5UUyIsICJEQVRBX1VSSV9UQUdTIiwgIkRFRkFVTFRfREFUQV9VUklfVEFHUyIsICJVUklfU0FGRV9BVFRSSUJVVEVTIiwgIkRFRkFVTFRfVVJJX1NBRkVfQVRUUklCVVRFUyIsICJNQVRITUxfTkFNRVNQQUNFIiwgIlNWR19OQU1FU1BBQ0UiLCAiSFRNTF9OQU1FU1BBQ0UiLCAiTkFNRVNQQUNFIiwgIklTX0VNUFRZX0lOUFVUIiwgIkFMTE9XRURfTkFNRVNQQUNFUyIsICJERUZBVUxUX0FMTE9XRURfTkFNRVNQQUNFUyIsICJNQVRITUxfVEVYVF9JTlRFR1JBVElPTl9QT0lOVFMiLCAiSFRNTF9JTlRFR1JBVElPTl9QT0lOVFMiLCAiQ09NTU9OX1NWR19BTkRfSFRNTF9FTEVNRU5UUyIsICJQQVJTRVJfTUVESUFfVFlQRSIsICJTVVBQT1JURURfUEFSU0VSX01FRElBX1RZUEVTIiwgIkRFRkFVTFRfUEFSU0VSX01FRElBX1RZUEUiLCAiQ09ORklHIiwgImZvcm1FbGVtZW50IiwgImlzUmVnZXhPckZ1bmN0aW9uIiwgInRlc3RWYWx1ZSIsICJGdW5jdGlvbiIsICJfcGFyc2VDb25maWciLCAiY2ZnIiwgIkFERF9VUklfU0FGRV9BVFRSIiwgIkFERF9EQVRBX1VSSV9UQUdTIiwgIkFMTE9XRURfVVJJX1JFR0VYUCIsICJBRERfVEFHUyIsICJBRERfQVRUUiIsICJBRERfRk9SQklEX0NPTlRFTlRTIiwgInRhYmxlIiwgInRib2R5IiwgIlRSVVNURURfVFlQRVNfUE9MSUNZIiwgIkFMTF9TVkdfVEFHUyIsICJBTExfTUFUSE1MX1RBR1MiLCAiX2NoZWNrVmFsaWROYW1lc3BhY2UiLCAicGFyZW50IiwgInRhZ05hbWUiLCAibmFtZXNwYWNlVVJJIiwgInBhcmVudFRhZ05hbWUiLCAiQm9vbGVhbiIsICJfZm9yY2VSZW1vdmUiLCAibm9kZSIsICJyZW1vdmVDaGlsZCIsICJfcmVtb3ZlQXR0cmlidXRlIiwgIm5hbWUiLCAiZ2V0QXR0cmlidXRlTm9kZSIsICJmcm9tIiwgInJlbW92ZUF0dHJpYnV0ZSIsICJzZXRBdHRyaWJ1dGUiLCAiX2luaXREb2N1bWVudCIsICJkaXJ0eSIsICJkb2MiLCAibGVhZGluZ1doaXRlc3BhY2UiLCAibWF0Y2hlcyIsICJkaXJ0eVBheWxvYWQiLCAicGFyc2VGcm9tU3RyaW5nIiwgImRvY3VtZW50RWxlbWVudCIsICJjcmVhdGVEb2N1bWVudCIsICJpbm5lckhUTUwiLCAiYm9keSIsICJpbnNlcnRCZWZvcmUiLCAiY3JlYXRlVGV4dE5vZGUiLCAiY2hpbGROb2RlcyIsICJjYWxsIiwgIl9jcmVhdGVOb2RlSXRlcmF0b3IiLCAiU0hPV19FTEVNRU5UIiwgIlNIT1dfQ09NTUVOVCIsICJTSE9XX1RFWFQiLCAiU0hPV19QUk9DRVNTSU5HX0lOU1RSVUNUSU9OIiwgIlNIT1dfQ0RBVEFfU0VDVElPTiIsICJfaXNDbG9iYmVyZWQiLCAibm9kZU5hbWUiLCAidGV4dENvbnRlbnQiLCAiYXR0cmlidXRlcyIsICJoYXNDaGlsZE5vZGVzIiwgIl9pc05vZGUiLCAiX2V4ZWN1dGVIb29rcyIsICJjdXJyZW50Tm9kZSIsICJkYXRhIiwgImhvb2siLCAiX3Nhbml0aXplRWxlbWVudHMiLCAiYWxsb3dlZFRhZ3MiLCAiZmlyc3RFbGVtZW50Q2hpbGQiLCAiX2lzQmFzaWNDdXN0b21FbGVtZW50IiwgInBhcmVudE5vZGUiLCAiY2hpbGRDb3VudCIsICJpIiwgImNoaWxkQ2xvbmUiLCAiX19yZW1vdmFsQ291bnQiLCAiZXhwciIsICJfaXNWYWxpZEF0dHJpYnV0ZSIsICJsY1RhZyIsICJsY05hbWUiLCAiX3Nhbml0aXplQXR0cmlidXRlcyIsICJob29rRXZlbnQiLCAiYXR0ck5hbWUiLCAiYXR0clZhbHVlIiwgImtlZXBBdHRyIiwgImFsbG93ZWRBdHRyaWJ1dGVzIiwgImZvcmNlS2VlcEF0dHIiLCAiYXR0ciIsICJpbml0VmFsdWUiLCAiZ2V0QXR0cmlidXRlVHlwZSIsICJzZXRBdHRyaWJ1dGVOUyIsICJfc2FuaXRpemVTaGFkb3dET00iLCAiZnJhZ21lbnQiLCAic2hhZG93Tm9kZSIsICJzaGFkb3dJdGVyYXRvciIsICJuZXh0Tm9kZSIsICJzYW5pdGl6ZSIsICJpbXBvcnRlZE5vZGUiLCAicmV0dXJuTm9kZSIsICJhcHBlbmRDaGlsZCIsICJmaXJzdENoaWxkIiwgIm5vZGVJdGVyYXRvciIsICJzaGFkb3dyb290IiwgInNoYWRvd3Jvb3Rtb2RlIiwgInNlcmlhbGl6ZWRIVE1MIiwgIm91dGVySFRNTCIsICJkb2N0eXBlIiwgInNldENvbmZpZyIsICJjbGVhckNvbmZpZyIsICJpc1ZhbGlkQXR0cmlidXRlIiwgInRhZyIsICJhZGRIb29rIiwgImVudHJ5UG9pbnQiLCAiaG9va0Z1bmN0aW9uIiwgInJlbW92ZUhvb2siLCAicmVtb3ZlSG9va3MiLCAicmVtb3ZlQWxsSG9va3MiLCAibG9nIiwgInRleHQiLCAicG9wdWxhdGVKb2JUYWIiLCAiaHRtbCIsICJQSEFTRVMiLCAic2hvd0xvYWRKb2JQYW5lbCIsICJzdGF0ZU1hbmFnZXIiLCAiZXZlbnQiLCAibSIsICJ1IiwgIl9wcm9jZWVkQWZ0ZXJJbnRha2UiLCAiX3Nob3dJbnRha2VDb25maXJtQ2FyZCIsICJzZW5kTWVzc2FnZSIsICJsb2ciLCAiUkVUUllfUE9MSUNZX1NUT1JBR0VfS0VZIiwgInRleHQiLCAic2VuZE1lc3NhZ2UiLCAic3RhdGVNYW5hZ2VyIiwgImdldFNlc3Npb25JZEZyb21VUkwiLCAiX3Nob3dJbnRha2VDb25maXJtQ2FyZCIsICJfcHJvY2VlZEFmdGVySW50YWtlIiwgIl9lIiwgImFza1Bvc3RBbmFseXNpc1F1ZXN0aW9ucyIsICJoYW5kbGVRdWVzdGlvblJlc3BvbnNlIiwgInBvcHVsYXRlUXVlc3Rpb25zVGFiIiwgImxvZyIsICJhc2tQb3N0QW5hbHlzaXNRdWVzdGlvbnMiLCAicG9wdWxhdGVRdWVzdGlvbnNUYWIiLCAic3RhdGVNYW5hZ2VyIiwgInEiLCAicSIsICJzdGF0ZU1hbmFnZXIiLCAiXyIsICJsb2ciLCAiaGFuZGxlUXVlc3Rpb25SZXNwb25zZSIsICJidWlsZEV4cGVyaWVuY2VSZXZpZXdUYWJsZSIsICJoYW5kbGVFeHBlcmllbmNlUmVzcG9uc2UiLCAibG9nIiwgIl9maW5kRXhwZXJpZW5jZVJlY29tbWVuZGF0aW9uUmVjb3JkIiwgIl8iLCAiYnVpbGRFeHBlcmllbmNlUmV2aWV3VGFibGUiLCAiYiIsICJoYW5kbGVFeHBlcmllbmNlUmVzcG9uc2UiLCAic3RhdGVNYW5hZ2VyIiwgImJ1aWxkU2tpbGxzUmV2aWV3VGFibGUiLCAiaGFuZGxlU2tpbGxzUmVzcG9uc2UiLCAibG9nIiwgIm0iLCAieCIsICJuYW1lIiwgInNraWxsIiwgIl8iLCAiYnVpbGRTa2lsbHNSZXZpZXdUYWJsZSIsICJzdGF0ZU1hbmFnZXIiLCAiYiIsICJlIiwgInNraWxsTmFtZSIsICJoYW5kbGVTa2lsbHNSZXNwb25zZSIsICJfYWNoVmVyYldhcm5pbmciLCAiYnVpbGRBY2hpZXZlbWVudHNFZGl0b3IiLCAiYnVpbGRBY2hpZXZlbWVudHNSZXZpZXdUYWJsZSIsICJlbnRyaWVzIiwgIl8iLCAiYnVpbGRBY2hpZXZlbWVudHNSZXZpZXdUYWJsZSIsICJiIiwgImh0bWwiLCAiayIsICJ2IiwgInN0YXRlTWFuYWdlciIsICJidWlsZEFjaGlldmVtZW50c0VkaXRvciIsICJfYWNoVmVyYldhcm5pbmciLCAidGV4dCIsICJfZSIsICJidWlsZFRhZ2xpbmVSZXZpZXdTZWN0aW9uIiwgImJ1aWxkVGFnbGluZVJldmlld1NlY3Rpb24iLCAiX2UiLCAic3RhdGVNYW5hZ2VyIiwgImJ1aWxkU3VtbWFyeUZvY3VzU2VjdGlvbiIsICJidWlsZFN1bW1hcnlGb2N1c1NlY3Rpb24iLCAiayIsICJ0ZXh0IiwgInciLCAic3RhdGVNYW5hZ2VyIiwgImJ1aWxkUHVibGljYXRpb25zUmV2aWV3VGFibGUiLCAibG9nIiwgImJ1aWxkUHVibGljYXRpb25zUmV2aWV3VGFibGUiLCAicSIsICJodG1sIiwgImJ0biIsICJzdGF0ZU1hbmFnZXIiLCAiYXBwbHlSZXdyaXRlQWN0aW9uIiwgImZldGNoQW5kUmV2aWV3UmV3cml0ZXMiLCAicmVuZGVyUmV3cml0ZVBhbmVsIiwgInJld3JpdGVEZWNpc2lvbnMiLCAic3VibWl0UmV3cml0ZURlY2lzaW9ucyIsICJyZXdyaXRlRGVjaXNpb25zIiwgIl8iLCAiZmV0Y2hBbmRSZXZpZXdSZXdyaXRlcyIsICJyZW5kZXJSZXdyaXRlUGFuZWwiLCAidyIsICJhcHBseVJld3JpdGVBY3Rpb24iLCAiYiIsICJtIiwgImkiLCAiaiIsICJrIiwgInN1Ym1pdFJld3JpdGVEZWNpc2lvbnMiLCAic3RhdGVNYW5hZ2VyIiwgInBvcHVsYXRlU3BlbGxDaGVja1RhYiIsICJzdWJtaXRTcGVsbENoZWNrRGVjaXNpb25zIiwgImxvZyIsICJwb3B1bGF0ZVNwZWxsQ2hlY2tUYWIiLCAiY29udGVudCIsICJzdGF0ZU1hbmFnZXIiLCAiaHRtbCIsICJiIiwgImF0c1Njb3JlIiwgImsiLCAic3VibWl0U3BlbGxDaGVja0RlY2lzaW9ucyIsICJwb3B1bGF0ZURvd25sb2FkVGFiIiwgImxvZyIsICJodG1sIiwgIl8iLCAicG9wdWxhdGVEb3dubG9hZFRhYiIsICJzdGF0ZU1hbmFnZXIiLCAidyIsICJtIiwgImZpbmFsR2VuZXJhdGlvbkNvbXBsZXRlIiwgImxvZyIsICJodG1sIiwgImZpbmFsR2VuZXJhdGlvbkNvbXBsZXRlIiwgInN0YXRlTWFuYWdlciIsICJyZW5kZXJNYXN0ZXJEYXRhQWlVcGRhdGVEaXNhYmxlZE5vdGUiLCAicmVuZGVyTWFzdGVyRGF0YUFpVXBkYXRlUGFuZWwiLCAibG9nIiwgInJlbmRlck1hc3RlckRhdGFBaVVwZGF0ZVBhbmVsIiwgInJlbmRlck1hc3RlckRhdGFBaVVwZGF0ZURpc2FibGVkTm90ZSIsICJtIiwgImV2ZW50IiwgIm9wZW5NYXN0ZXJDdk1vZGFsIiwgInBvcHVsYXRlTWFzdGVyVGFiIiwgInJlZG9NYXN0ZXJEYXRhQ2hhbmdlIiwgInVuZG9NYXN0ZXJEYXRhQ2hhbmdlIiwgIngiLCAidiIsICJ0ZXh0IiwgImsiLCAiXyIsICJzZXNzaW9uSWQiLCAiZXZlbnQiLCAiX3JlbmRlckNvbnNpc3RlbmN5UmVwb3J0IiwgInBvcHVsYXRlQ292ZXJMZXR0ZXJUYWIiLCAicG9wdWxhdGVDb3ZlckxldHRlclRhYiIsICJfIiwgInRleHQiLCAiX3JlbmRlckNvbnNpc3RlbmN5UmVwb3J0IiwgInN0YXRlTWFuYWdlciIsICJrIiwgInJlIiwgInBvcHVsYXRlU2NyZWVuaW5nVGFiIiwgInEiLCAiYiIsICJfIiwgInBvcHVsYXRlRmluYWxpc2VUYWIiLCAibG9nIiwgIm0iLCAicG9wdWxhdGVGaW5hbGlzZVRhYiIsICJodG1sIiwgIl9yZW5kZXJSZXdyaXRlQXVkaXRMb2ciLCAiXyIsICJhdHNTY29yZSIsICJwb3B1bGF0ZUludGVydmlld1ByZXBUYWIiLCAibG9nIiwgInBvcHVsYXRlSW50ZXJ2aWV3UHJlcFRhYiIsICJwb3B1bGF0ZVRoYW5rWW91VGFiIiwgImxvZyIsICJwb3B1bGF0ZVRoYW5rWW91VGFiIiwgInBvcHVsYXRlSGFydmVzdFRhYiIsICJsb2ciLCAiYiIsICJrIiwgInYiLCAicG9wdWxhdGVIYXJ2ZXN0VGFiIiwgIl91cGRhdGVTZXNzaW9uU3dpdGNoZXJIZWFkZXIiLCAib3BlblNlc3Npb25zTW9kYWwiLCAic2hvd093bmVyc2hpcENvbmZsaWN0RGlhbG9nIiwgIl8iLCAiX2NyZWF0ZWRJc29Gcm9tU2Vzc2lvblBhdGgiLCAiYiIsICJ2IiwgImV2ZW50IiwgImZtdERhdGUiLCAiaHRtbCIsICJpbml0S2V5Ym9hcmRTaG9ydGN1dHMiLCAicmVzZXRDYXJkRm9jdXMiLCAic2V0dXBFdmVudExpc3RlbmVycyIsICJ0ZXh0Il0KfQo= +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbm9kZV9tb2R1bGVzL2xvZ2xldmVsL2xpYi9sb2dsZXZlbC5qcyIsICJsb2dnZXIuanMiLCAidXRpbHMuanMiLCAiYXBpLWNsaWVudC5qcyIsICJmZXRjaC11dGlscy5qcyIsICJzdGF0ZS1tYW5hZ2VyLmpzIiwgInByb3ZpZGVyLWluZm8uanMiLCAidWktY29yZS5qcyIsICJsYXlvdXQtaW5zdHJ1Y3Rpb24uanMiLCAiYXRzLXJlZmluZW1lbnQuanMiLCAibWVzc2FnZS1xdWV1ZS5qcyIsICJyZXZpZXctdGFibGUtYmFzZS5qcyIsICJ3b3JrZmxvdy1zdGVwcy5qcyIsICJ2YWxpZGF0b3JzLmpzIiwgInJlY29tbWVuZGF0aW9uLWhlbHBlcnMuanMiLCAidWktaGVscGVycy5qcyIsICJwcm9wb3NhbC1yZXZpZXcuanMiLCAibGxtLWxvZy5qcyIsICJhdXRoLXByb3ZpZGVyLmpzIiwgImF0cy1tb2RhbHMuanMiLCAic2Vzc2lvbi1hY3Rpb25zLmpzIiwgImpvYi1hbmFseXNpcy5qcyIsICJnb2Fscy5qcyIsICJzZXNzaW9uLW1hbmFnZXIuanMiLCAiam9iLWlucHV0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tYXJrZWQvc3JjL2RlZmF1bHRzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9tYXJrZWQvc3JjL3J1bGVzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9tYXJrZWQvc3JjL2hlbHBlcnMudHMiLCAiLi4vbm9kZV9tb2R1bGVzL21hcmtlZC9zcmMvVG9rZW5pemVyLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9tYXJrZWQvc3JjL0xleGVyLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9tYXJrZWQvc3JjL1JlbmRlcmVyLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9tYXJrZWQvc3JjL1RleHRSZW5kZXJlci50cyIsICIuLi9ub2RlX21vZHVsZXMvbWFya2VkL3NyYy9QYXJzZXIudHMiLCAiLi4vbm9kZV9tb2R1bGVzL21hcmtlZC9zcmMvSG9va3MudHMiLCAiLi4vbm9kZV9tb2R1bGVzL21hcmtlZC9zcmMvSW5zdGFuY2UudHMiLCAiLi4vbm9kZV9tb2R1bGVzL21hcmtlZC9zcmMvbWFya2VkLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9kb21wdXJpZnkvc3JjL3V0aWxzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9kb21wdXJpZnkvc3JjL3RhZ3MudHMiLCAiLi4vbm9kZV9tb2R1bGVzL2RvbXB1cmlmeS9zcmMvYXR0cnMudHMiLCAiLi4vbm9kZV9tb2R1bGVzL2RvbXB1cmlmeS9zcmMvcmVnZXhwLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9kb21wdXJpZnkvc3JjL3B1cmlmeS50cyIsICJtZXNzYWdlLWRpc3BhdGNoLmpzIiwgInF1ZXN0aW9ucy1wYW5lbC5qcyIsICJyZXZpZXctaWNvbnMuanMiLCAiZXhwZXJpZW5jZS1yZXZpZXcuanMiLCAic2tpbGxzLXJldmlldy5qcyIsICJhY2hpZXZlbWVudHMtcmV2aWV3LmpzIiwgInRhZ2xpbmUtcmV2aWV3LmpzIiwgInN1bW1hcnktcmV2aWV3LmpzIiwgInB1YmxpY2F0aW9ucy1yZXZpZXcuanMiLCAicmV3cml0ZS1yZXZpZXcuanMiLCAic3BlbGwtY2hlY2suanMiLCAiZG93bmxvYWQtdGFiLmpzIiwgImZpbmFsLWdlbmVyYXRlLmpzIiwgIm1hc3Rlci1kYXRhLWFpLXVwZGF0ZS5qcyIsICJtYXN0ZXItY3YuanMiLCAiY292ZXItbGV0dGVyLmpzIiwgInNjcmVlbmluZy1xdWVzdGlvbnMuanMiLCAiZmluYWxpc2UuanMiLCAiaW50ZXJ2aWV3LXByZXAuanMiLCAidGhhbmsteW91LmpzIiwgImhhcnZlc3QuanMiLCAic2Vzc2lvbi1zd2l0Y2hlci11aS5qcyIsICJrZXlib2FyZC1zaG9ydGN1dHMuanMiLCAiYXBwLmpzIiwgInNyYy9tYWluLmpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKlxuKiBsb2dsZXZlbCAtIGh0dHBzOi8vZ2l0aHViLmNvbS9waW10ZXJyeS9sb2dsZXZlbFxuKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTMgVGltIFBlcnJ5XG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiovXG4oZnVuY3Rpb24gKHJvb3QsIGRlZmluaXRpb24pIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgICAgIGRlZmluZShkZWZpbml0aW9uKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgICAgIG1vZHVsZS5leHBvcnRzID0gZGVmaW5pdGlvbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJvb3QubG9nID0gZGVmaW5pdGlvbigpO1xuICAgIH1cbn0odGhpcywgZnVuY3Rpb24gKCkge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgLy8gU2xpZ2h0bHkgZHViaW91cyB0cmlja3MgdG8gY3V0IGRvd24gbWluaW1pemVkIGZpbGUgc2l6ZVxuICAgIHZhciBub29wID0gZnVuY3Rpb24oKSB7fTtcbiAgICB2YXIgdW5kZWZpbmVkVHlwZSA9IFwidW5kZWZpbmVkXCI7XG4gICAgdmFyIGlzSUUgPSAodHlwZW9mIHdpbmRvdyAhPT0gdW5kZWZpbmVkVHlwZSkgJiYgKHR5cGVvZiB3aW5kb3cubmF2aWdhdG9yICE9PSB1bmRlZmluZWRUeXBlKSAmJiAoXG4gICAgICAgIC9UcmlkZW50XFwvfE1TSUUgLy50ZXN0KHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50KVxuICAgICk7XG5cbiAgICB2YXIgbG9nTWV0aG9kcyA9IFtcbiAgICAgICAgXCJ0cmFjZVwiLFxuICAgICAgICBcImRlYnVnXCIsXG4gICAgICAgIFwiaW5mb1wiLFxuICAgICAgICBcIndhcm5cIixcbiAgICAgICAgXCJlcnJvclwiXG4gICAgXTtcblxuICAgIHZhciBfbG9nZ2Vyc0J5TmFtZSA9IHt9O1xuICAgIHZhciBkZWZhdWx0TG9nZ2VyID0gbnVsbDtcblxuICAgIC8vIENyb3NzLWJyb3dzZXIgYmluZCBlcXVpdmFsZW50IHRoYXQgd29ya3MgYXQgbGVhc3QgYmFjayB0byBJRTZcbiAgICBmdW5jdGlvbiBiaW5kTWV0aG9kKG9iaiwgbWV0aG9kTmFtZSkge1xuICAgICAgICB2YXIgbWV0aG9kID0gb2JqW21ldGhvZE5hbWVdO1xuICAgICAgICBpZiAodHlwZW9mIG1ldGhvZC5iaW5kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gbWV0aG9kLmJpbmQob2JqKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmNhbGwobWV0aG9kLCBvYmopO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIC8vIE1pc3NpbmcgYmluZCBzaGltIG9yIElFOCArIE1vZGVybml6ciwgZmFsbGJhY2sgdG8gd3JhcHBpbmdcbiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuYXBwbHkobWV0aG9kLCBbb2JqLCBhcmd1bWVudHNdKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVHJhY2UoKSBkb2Vzbid0IHByaW50IHRoZSBtZXNzYWdlIGluIElFLCBzbyBmb3IgdGhhdCBjYXNlIHdlIG5lZWQgdG8gd3JhcCBpdFxuICAgIGZ1bmN0aW9uIHRyYWNlRm9ySUUoKSB7XG4gICAgICAgIGlmIChjb25zb2xlLmxvZykge1xuICAgICAgICAgICAgaWYgKGNvbnNvbGUubG9nLmFwcGx5KSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2cuYXBwbHkoY29uc29sZSwgYXJndW1lbnRzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gSW4gb2xkIElFLCBuYXRpdmUgY29uc29sZSBtZXRob2RzIHRoZW1zZWx2ZXMgZG9uJ3QgaGF2ZSBhcHBseSgpLlxuICAgICAgICAgICAgICAgIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5hcHBseShjb25zb2xlLmxvZywgW2NvbnNvbGUsIGFyZ3VtZW50c10pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb25zb2xlLnRyYWNlKSBjb25zb2xlLnRyYWNlKCk7XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgdGhlIGJlc3QgbG9nZ2luZyBtZXRob2QgcG9zc2libGUgZm9yIHRoaXMgZW52XG4gICAgLy8gV2hlcmV2ZXIgcG9zc2libGUgd2Ugd2FudCB0byBiaW5kLCBub3Qgd3JhcCwgdG8gcHJlc2VydmUgc3RhY2sgdHJhY2VzXG4gICAgZnVuY3Rpb24gcmVhbE1ldGhvZChtZXRob2ROYW1lKSB7XG4gICAgICAgIGlmIChtZXRob2ROYW1lID09PSAnZGVidWcnKSB7XG4gICAgICAgICAgICBtZXRob2ROYW1lID0gJ2xvZyc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgPT09IHVuZGVmaW5lZFR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gTm8gbWV0aG9kIHBvc3NpYmxlLCBmb3Igbm93IC0gZml4ZWQgbGF0ZXIgYnkgZW5hYmxlTG9nZ2luZ1doZW5Db25zb2xlQXJyaXZlc1xuICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZE5hbWUgPT09ICd0cmFjZScgJiYgaXNJRSkge1xuICAgICAgICAgICAgcmV0dXJuIHRyYWNlRm9ySUU7XG4gICAgICAgIH0gZWxzZSBpZiAoY29uc29sZVttZXRob2ROYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYmluZE1ldGhvZChjb25zb2xlLCBtZXRob2ROYW1lKTtcbiAgICAgICAgfSBlbHNlIGlmIChjb25zb2xlLmxvZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYmluZE1ldGhvZChjb25zb2xlLCAnbG9nJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbm9vcDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoZXNlIHByaXZhdGUgZnVuY3Rpb25zIGFsd2F5cyBuZWVkIGB0aGlzYCB0byBiZSBzZXQgcHJvcGVybHlcblxuICAgIGZ1bmN0aW9uIHJlcGxhY2VMb2dnaW5nTWV0aG9kcygpIHtcbiAgICAgICAgLypqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi9cbiAgICAgICAgdmFyIGxldmVsID0gdGhpcy5nZXRMZXZlbCgpO1xuXG4gICAgICAgIC8vIFJlcGxhY2UgdGhlIGFjdHVhbCBtZXRob2RzLlxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxvZ01ldGhvZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBtZXRob2ROYW1lID0gbG9nTWV0aG9kc1tpXTtcbiAgICAgICAgICAgIHRoaXNbbWV0aG9kTmFtZV0gPSAoaSA8IGxldmVsKSA/XG4gICAgICAgICAgICAgICAgbm9vcCA6XG4gICAgICAgICAgICAgICAgdGhpcy5tZXRob2RGYWN0b3J5KG1ldGhvZE5hbWUsIGxldmVsLCB0aGlzLm5hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVmaW5lIGxvZy5sb2cgYXMgYW4gYWxpYXMgZm9yIGxvZy5kZWJ1Z1xuICAgICAgICB0aGlzLmxvZyA9IHRoaXMuZGVidWc7XG5cbiAgICAgICAgLy8gUmV0dXJuIGFueSBpbXBvcnRhbnQgd2FybmluZ3MuXG4gICAgICAgIGlmICh0eXBlb2YgY29uc29sZSA9PT0gdW5kZWZpbmVkVHlwZSAmJiBsZXZlbCA8IHRoaXMubGV2ZWxzLlNJTEVOVCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiTm8gY29uc29sZSBhdmFpbGFibGUgZm9yIGxvZ2dpbmdcIjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEluIG9sZCBJRSB2ZXJzaW9ucywgdGhlIGNvbnNvbGUgaXNuJ3QgcHJlc2VudCB1bnRpbCB5b3UgZmlyc3Qgb3BlbiBpdC5cbiAgICAvLyBXZSBidWlsZCByZWFsTWV0aG9kKCkgcmVwbGFjZW1lbnRzIGhlcmUgdGhhdCByZWdlbmVyYXRlIGxvZ2dpbmcgbWV0aG9kc1xuICAgIGZ1bmN0aW9uIGVuYWJsZUxvZ2dpbmdXaGVuQ29uc29sZUFycml2ZXMobWV0aG9kTmFtZSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSB1bmRlZmluZWRUeXBlKSB7XG4gICAgICAgICAgICAgICAgcmVwbGFjZUxvZ2dpbmdNZXRob2RzLmNhbGwodGhpcyk7XG4gICAgICAgICAgICAgICAgdGhpc1ttZXRob2ROYW1lXS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIEJ5IGRlZmF1bHQsIHdlIHVzZSBjbG9zZWx5IGJvdW5kIHJlYWwgbWV0aG9kcyB3aGVyZXZlciBwb3NzaWJsZSwgYW5kXG4gICAgLy8gb3RoZXJ3aXNlIHdlIHdhaXQgZm9yIGEgY29uc29sZSB0byBhcHBlYXIsIGFuZCB0aGVuIHRyeSBhZ2Fpbi5cbiAgICBmdW5jdGlvbiBkZWZhdWx0TWV0aG9kRmFjdG9yeShtZXRob2ROYW1lLCBfbGV2ZWwsIF9sb2dnZXJOYW1lKSB7XG4gICAgICAgIC8qanNoaW50IHZhbGlkdGhpczp0cnVlICovXG4gICAgICAgIHJldHVybiByZWFsTWV0aG9kKG1ldGhvZE5hbWUpIHx8XG4gICAgICAgICAgICAgICBlbmFibGVMb2dnaW5nV2hlbkNvbnNvbGVBcnJpdmVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gTG9nZ2VyKG5hbWUsIGZhY3RvcnkpIHtcbiAgICAgIC8vIFByaXZhdGUgaW5zdGFuY2UgdmFyaWFibGVzLlxuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgLyoqXG4gICAgICAgKiBUaGUgbGV2ZWwgaW5oZXJpdGVkIGZyb20gYSBwYXJlbnQgbG9nZ2VyIChvciBhIGdsb2JhbCBkZWZhdWx0KS4gV2VcbiAgICAgICAqIGNhY2hlIHRoaXMgaGVyZSByYXRoZXIgdGhhbiBkZWxlZ2F0aW5nIHRvIHRoZSBwYXJlbnQgc28gdGhhdCBpdCBzdGF5c1xuICAgICAgICogaW4gc3luYyB3aXRoIHRoZSBhY3R1YWwgbG9nZ2luZyBtZXRob2RzIHRoYXQgd2UgaGF2ZSBpbnN0YWxsZWQgKHRoZVxuICAgICAgICogcGFyZW50IGNvdWxkIGNoYW5nZSBsZXZlbHMgYnV0IHdlIG1pZ2h0IG5vdCBoYXZlIHJlYnVpbHQgdGhlIGxvZ2dlcnNcbiAgICAgICAqIGluIHRoaXMgY2hpbGQgeWV0KS5cbiAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgKi9cbiAgICAgIHZhciBpbmhlcml0ZWRMZXZlbDtcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGRlZmF1bHQgbGV2ZWwgZm9yIHRoaXMgbG9nZ2VyLCBpZiBhbnkuIElmIHNldCwgdGhpcyBvdmVycmlkZXNcbiAgICAgICAqIGBpbmhlcml0ZWRMZXZlbGAuXG4gICAgICAgKiBAdHlwZSB7bnVtYmVyfG51bGx9XG4gICAgICAgKi9cbiAgICAgIHZhciBkZWZhdWx0TGV2ZWw7XG4gICAgICAvKipcbiAgICAgICAqIEEgdXNlci1zcGVjaWZpYyBsZXZlbCBmb3IgdGhpcyBsb2dnZXIuIElmIHNldCwgdGhpcyBvdmVycmlkZXNcbiAgICAgICAqIGBkZWZhdWx0TGV2ZWxgLlxuICAgICAgICogQHR5cGUge251bWJlcnxudWxsfVxuICAgICAgICovXG4gICAgICB2YXIgdXNlckxldmVsO1xuXG4gICAgICB2YXIgc3RvcmFnZUtleSA9IFwibG9nbGV2ZWxcIjtcbiAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBzdG9yYWdlS2V5ICs9IFwiOlwiICsgbmFtZTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG5hbWUgPT09IFwic3ltYm9sXCIpIHtcbiAgICAgICAgc3RvcmFnZUtleSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gcGVyc2lzdExldmVsSWZQb3NzaWJsZShsZXZlbE51bSkge1xuICAgICAgICAgIHZhciBsZXZlbE5hbWUgPSAobG9nTWV0aG9kc1tsZXZlbE51bV0gfHwgJ3NpbGVudCcpLnRvVXBwZXJDYXNlKCk7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gdW5kZWZpbmVkVHlwZSB8fCAhc3RvcmFnZUtleSkgcmV0dXJuO1xuXG4gICAgICAgICAgLy8gVXNlIGxvY2FsU3RvcmFnZSBpZiBhdmFpbGFibGVcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlW3N0b3JhZ2VLZXldID0gbGV2ZWxOYW1lO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfSBjYXRjaCAoaWdub3JlKSB7fVxuXG4gICAgICAgICAgLy8gVXNlIHNlc3Npb24gY29va2llIGFzIGZhbGxiYWNrXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgd2luZG93LmRvY3VtZW50LmNvb2tpZSA9XG4gICAgICAgICAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KHN0b3JhZ2VLZXkpICsgXCI9XCIgKyBsZXZlbE5hbWUgKyBcIjtcIjtcbiAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGdldFBlcnNpc3RlZExldmVsKCkge1xuICAgICAgICAgIHZhciBzdG9yZWRMZXZlbDtcblxuICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSB1bmRlZmluZWRUeXBlIHx8ICFzdG9yYWdlS2V5KSByZXR1cm47XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBzdG9yZWRMZXZlbCA9IHdpbmRvdy5sb2NhbFN0b3JhZ2Vbc3RvcmFnZUtleV07XG4gICAgICAgICAgfSBjYXRjaCAoaWdub3JlKSB7fVxuXG4gICAgICAgICAgLy8gRmFsbGJhY2sgdG8gY29va2llcyBpZiBsb2NhbCBzdG9yYWdlIGdpdmVzIHVzIG5vdGhpbmdcbiAgICAgICAgICBpZiAodHlwZW9mIHN0b3JlZExldmVsID09PSB1bmRlZmluZWRUeXBlKSB7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICB2YXIgY29va2llID0gd2luZG93LmRvY3VtZW50LmNvb2tpZTtcbiAgICAgICAgICAgICAgICAgIHZhciBjb29raWVOYW1lID0gZW5jb2RlVVJJQ29tcG9uZW50KHN0b3JhZ2VLZXkpO1xuICAgICAgICAgICAgICAgICAgdmFyIGxvY2F0aW9uID0gY29va2llLmluZGV4T2YoY29va2llTmFtZSArIFwiPVwiKTtcbiAgICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbiAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICBzdG9yZWRMZXZlbCA9IC9eKFteO10rKS8uZXhlYyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29va2llLnNsaWNlKGxvY2F0aW9uICsgY29va2llTmFtZS5sZW5ndGggKyAxKVxuICAgICAgICAgICAgICAgICAgICAgIClbMV07XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGlnbm9yZSkge31cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBJZiB0aGUgc3RvcmVkIGxldmVsIGlzIG5vdCB2YWxpZCwgdHJlYXQgaXQgYXMgaWYgbm90aGluZyB3YXMgc3RvcmVkLlxuICAgICAgICAgIGlmIChzZWxmLmxldmVsc1tzdG9yZWRMZXZlbF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBzdG9yZWRMZXZlbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gc3RvcmVkTGV2ZWw7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGNsZWFyUGVyc2lzdGVkTGV2ZWwoKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IHVuZGVmaW5lZFR5cGUgfHwgIXN0b3JhZ2VLZXkpIHJldHVybjtcblxuICAgICAgICAgIC8vIFVzZSBsb2NhbFN0b3JhZ2UgaWYgYXZhaWxhYmxlXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHN0b3JhZ2VLZXkpO1xuICAgICAgICAgIH0gY2F0Y2ggKGlnbm9yZSkge31cblxuICAgICAgICAgIC8vIFVzZSBzZXNzaW9uIGNvb2tpZSBhcyBmYWxsYmFja1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHdpbmRvdy5kb2N1bWVudC5jb29raWUgPVxuICAgICAgICAgICAgICAgIGVuY29kZVVSSUNvbXBvbmVudChzdG9yYWdlS2V5KSArIFwiPTsgZXhwaXJlcz1UaHUsIDAxIEphbiAxOTcwIDAwOjAwOjAwIFVUQ1wiO1xuICAgICAgICAgIH0gY2F0Y2ggKGlnbm9yZSkge31cbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gbm9ybWFsaXplTGV2ZWwoaW5wdXQpIHtcbiAgICAgICAgICB2YXIgbGV2ZWwgPSBpbnB1dDtcbiAgICAgICAgICBpZiAodHlwZW9mIGxldmVsID09PSBcInN0cmluZ1wiICYmIHNlbGYubGV2ZWxzW2xldmVsLnRvVXBwZXJDYXNlKCldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgbGV2ZWwgPSBzZWxmLmxldmVsc1tsZXZlbC50b1VwcGVyQ2FzZSgpXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHR5cGVvZiBsZXZlbCA9PT0gXCJudW1iZXJcIiAmJiBsZXZlbCA+PSAwICYmIGxldmVsIDw9IHNlbGYubGV2ZWxzLlNJTEVOVCkge1xuICAgICAgICAgICAgICByZXR1cm4gbGV2ZWw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImxvZy5zZXRMZXZlbCgpIGNhbGxlZCB3aXRoIGludmFsaWQgbGV2ZWw6IFwiICsgaW5wdXQpO1xuICAgICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLypcbiAgICAgICAqXG4gICAgICAgKiBQdWJsaWMgbG9nZ2VyIEFQSSAtIHNlZSBodHRwczovL2dpdGh1Yi5jb20vcGltdGVycnkvbG9nbGV2ZWwgZm9yIGRldGFpbHNcbiAgICAgICAqXG4gICAgICAgKi9cblxuICAgICAgc2VsZi5uYW1lID0gbmFtZTtcblxuICAgICAgc2VsZi5sZXZlbHMgPSB7IFwiVFJBQ0VcIjogMCwgXCJERUJVR1wiOiAxLCBcIklORk9cIjogMiwgXCJXQVJOXCI6IDMsXG4gICAgICAgICAgXCJFUlJPUlwiOiA0LCBcIlNJTEVOVFwiOiA1fTtcblxuICAgICAgc2VsZi5tZXRob2RGYWN0b3J5ID0gZmFjdG9yeSB8fCBkZWZhdWx0TWV0aG9kRmFjdG9yeTtcblxuICAgICAgc2VsZi5nZXRMZXZlbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAodXNlckxldmVsICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB1c2VyTGV2ZWw7XG4gICAgICAgICAgfSBlbHNlIGlmIChkZWZhdWx0TGV2ZWwgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRMZXZlbDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGluaGVyaXRlZExldmVsO1xuICAgICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHNlbGYuc2V0TGV2ZWwgPSBmdW5jdGlvbiAobGV2ZWwsIHBlcnNpc3QpIHtcbiAgICAgICAgICB1c2VyTGV2ZWwgPSBub3JtYWxpemVMZXZlbChsZXZlbCk7XG4gICAgICAgICAgaWYgKHBlcnNpc3QgIT09IGZhbHNlKSB7ICAvLyBkZWZhdWx0cyB0byB0cnVlXG4gICAgICAgICAgICAgIHBlcnNpc3RMZXZlbElmUG9zc2libGUodXNlckxldmVsKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBOT1RFOiBpbiB2MiwgdGhpcyBzaG91bGQgY2FsbCByZWJ1aWxkKCksIHdoaWNoIHVwZGF0ZXMgY2hpbGRyZW4uXG4gICAgICAgICAgcmV0dXJuIHJlcGxhY2VMb2dnaW5nTWV0aG9kcy5jYWxsKHNlbGYpO1xuICAgICAgfTtcblxuICAgICAgc2VsZi5zZXREZWZhdWx0TGV2ZWwgPSBmdW5jdGlvbiAobGV2ZWwpIHtcbiAgICAgICAgICBkZWZhdWx0TGV2ZWwgPSBub3JtYWxpemVMZXZlbChsZXZlbCk7XG4gICAgICAgICAgaWYgKCFnZXRQZXJzaXN0ZWRMZXZlbCgpKSB7XG4gICAgICAgICAgICAgIHNlbGYuc2V0TGV2ZWwobGV2ZWwsIGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBzZWxmLnJlc2V0TGV2ZWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdXNlckxldmVsID0gbnVsbDtcbiAgICAgICAgICBjbGVhclBlcnNpc3RlZExldmVsKCk7XG4gICAgICAgICAgcmVwbGFjZUxvZ2dpbmdNZXRob2RzLmNhbGwoc2VsZik7XG4gICAgICB9O1xuXG4gICAgICBzZWxmLmVuYWJsZUFsbCA9IGZ1bmN0aW9uKHBlcnNpc3QpIHtcbiAgICAgICAgICBzZWxmLnNldExldmVsKHNlbGYubGV2ZWxzLlRSQUNFLCBwZXJzaXN0KTtcbiAgICAgIH07XG5cbiAgICAgIHNlbGYuZGlzYWJsZUFsbCA9IGZ1bmN0aW9uKHBlcnNpc3QpIHtcbiAgICAgICAgICBzZWxmLnNldExldmVsKHNlbGYubGV2ZWxzLlNJTEVOVCwgcGVyc2lzdCk7XG4gICAgICB9O1xuXG4gICAgICBzZWxmLnJlYnVpbGQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKGRlZmF1bHRMb2dnZXIgIT09IHNlbGYpIHtcbiAgICAgICAgICAgICAgaW5oZXJpdGVkTGV2ZWwgPSBub3JtYWxpemVMZXZlbChkZWZhdWx0TG9nZ2VyLmdldExldmVsKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXBsYWNlTG9nZ2luZ01ldGhvZHMuY2FsbChzZWxmKTtcblxuICAgICAgICAgIGlmIChkZWZhdWx0TG9nZ2VyID09PSBzZWxmKSB7XG4gICAgICAgICAgICAgIGZvciAodmFyIGNoaWxkTmFtZSBpbiBfbG9nZ2Vyc0J5TmFtZSkge1xuICAgICAgICAgICAgICAgIF9sb2dnZXJzQnlOYW1lW2NoaWxkTmFtZV0ucmVidWlsZCgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgLy8gSW5pdGlhbGl6ZSBhbGwgdGhlIGludGVybmFsIGxldmVscy5cbiAgICAgIGluaGVyaXRlZExldmVsID0gbm9ybWFsaXplTGV2ZWwoXG4gICAgICAgICAgZGVmYXVsdExvZ2dlciA/IGRlZmF1bHRMb2dnZXIuZ2V0TGV2ZWwoKSA6IFwiV0FSTlwiXG4gICAgICApO1xuICAgICAgdmFyIGluaXRpYWxMZXZlbCA9IGdldFBlcnNpc3RlZExldmVsKCk7XG4gICAgICBpZiAoaW5pdGlhbExldmVsICE9IG51bGwpIHtcbiAgICAgICAgICB1c2VyTGV2ZWwgPSBub3JtYWxpemVMZXZlbChpbml0aWFsTGV2ZWwpO1xuICAgICAgfVxuICAgICAgcmVwbGFjZUxvZ2dpbmdNZXRob2RzLmNhbGwoc2VsZik7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKlxuICAgICAqIFRvcC1sZXZlbCBBUElcbiAgICAgKlxuICAgICAqL1xuXG4gICAgZGVmYXVsdExvZ2dlciA9IG5ldyBMb2dnZXIoKTtcblxuICAgIGRlZmF1bHRMb2dnZXIuZ2V0TG9nZ2VyID0gZnVuY3Rpb24gZ2V0TG9nZ2VyKG5hbWUpIHtcbiAgICAgICAgaWYgKCh0eXBlb2YgbmFtZSAhPT0gXCJzeW1ib2xcIiAmJiB0eXBlb2YgbmFtZSAhPT0gXCJzdHJpbmdcIikgfHwgbmFtZSA9PT0gXCJcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIllvdSBtdXN0IHN1cHBseSBhIG5hbWUgd2hlbiBjcmVhdGluZyBhIGxvZ2dlci5cIik7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbG9nZ2VyID0gX2xvZ2dlcnNCeU5hbWVbbmFtZV07XG4gICAgICAgIGlmICghbG9nZ2VyKSB7XG4gICAgICAgICAgICBsb2dnZXIgPSBfbG9nZ2Vyc0J5TmFtZVtuYW1lXSA9IG5ldyBMb2dnZXIoXG4gICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICBkZWZhdWx0TG9nZ2VyLm1ldGhvZEZhY3RvcnlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxvZ2dlcjtcbiAgICB9O1xuXG4gICAgLy8gR3JhYiB0aGUgY3VycmVudCBnbG9iYWwgbG9nIHZhcmlhYmxlIGluIGNhc2Ugb2Ygb3ZlcndyaXRlXG4gICAgdmFyIF9sb2cgPSAodHlwZW9mIHdpbmRvdyAhPT0gdW5kZWZpbmVkVHlwZSkgPyB3aW5kb3cubG9nIDogdW5kZWZpbmVkO1xuICAgIGRlZmF1bHRMb2dnZXIubm9Db25mbGljdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gdW5kZWZpbmVkVHlwZSAmJlxuICAgICAgICAgICAgICAgd2luZG93LmxvZyA9PT0gZGVmYXVsdExvZ2dlcikge1xuICAgICAgICAgICAgd2luZG93LmxvZyA9IF9sb2c7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVmYXVsdExvZ2dlcjtcbiAgICB9O1xuXG4gICAgZGVmYXVsdExvZ2dlci5nZXRMb2dnZXJzID0gZnVuY3Rpb24gZ2V0TG9nZ2VycygpIHtcbiAgICAgICAgcmV0dXJuIF9sb2dnZXJzQnlOYW1lO1xuICAgIH07XG5cbiAgICAvLyBFUzYgZGVmYXVsdCBleHBvcnQsIGZvciBjb21wYXRpYmlsaXR5XG4gICAgZGVmYXVsdExvZ2dlclsnZGVmYXVsdCddID0gZGVmYXVsdExvZ2dlcjtcblxuICAgIHJldHVybiBkZWZhdWx0TG9nZ2VyO1xufSkpO1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvbG9nZ2VyLmpzXG4gKiBDZW50cmFsaXNlZCBsb2dnaW5nIHVzaW5nIHRoZSBsb2dsZXZlbCBsaWJyYXJ5LlxuICpcbiAqIFVzYWdlIChwZXItbW9kdWxlIG5hbWVkIGxvZ2dlcnMpOlxuICogICBpbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG4gKiAgIGNvbnN0IGxvZyA9IGdldExvZ2dlcignYXBpLWNsaWVudCcpO1xuICogICBsb2cuaW5mbygncmVxdWVzdCBzdGFydGVkJywgZW5kcG9pbnQpO1xuICogICBsb2cud2Fybignc2Vzc2lvbiBjb25mbGljdCcpO1xuICogICBsb2cuZXJyb3IoJ2ZhdGFsJywgZXJyb3IpO1xuICpcbiAqIFJvb3QgbG9nZ2VyICh1bmNoYW5nZWQgZ2xvYmFsIGxldmVsKTpcbiAqICAgaW1wb3J0IGxvZyBmcm9tICcuL2xvZ2dlci5qcyc7XG4gKiAgIGxvZy5zZXRMZXZlbCgnZGVidWcnKTsgICAvLyBsb3dlciB0aGUgZ2xvYmFsIG1pbmltdW1cbiAqXG4gKiBUaGUgZGVmYXVsdCBsZXZlbCBpcyAnd2FybicgaW4gcHJvZHVjdGlvbiBidWlsZHMgKE5PREVfRU5WPXByb2R1Y3Rpb24pIGFuZFxuICogJ2RlYnVnJyBpbiBkZXZlbG9wbWVudC4gIEluZGl2aWR1YWwgbW9kdWxlIGxldmVscyBjYW4gYmUgb3ZlcnJpZGRlbiBhdFxuICogcnVudGltZSB2aWEgdGhlIGJyb3dzZXIgY29uc29sZTpcbiAqICAgbG9nbGV2ZWwuZ2V0TG9nZ2VyKCdhcGktY2xpZW50Jykuc2V0TGV2ZWwoJ3RyYWNlJyk7XG4gKlxuICogREVQRU5ERU5DSUVTOiBsb2dsZXZlbCAobnBtKVxuICovXG5cbmltcG9ydCBsb2dsZXZlbCBmcm9tICdsb2dsZXZlbCc7XG5cbi8vIERlZmF1bHQgbGV2ZWw6IGRlYnVnIGluIGRldiwgd2FybiBpbiBwcm9kLlxuY29uc3QgREVGQVVMVF9MRVZFTCA9ICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vzcy5lbnYgJiYgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJylcbiAgPyAnd2FybidcbiAgOiAnZGVidWcnO1xuXG5sb2dsZXZlbC5zZXREZWZhdWx0TGV2ZWwoREVGQVVMVF9MRVZFTCk7XG5cbi8qKlxuICogR2V0IChvciBjcmVhdGUpIGEgbmFtZWQgY2hpbGQgbG9nZ2VyLlxuICogTmFtZWQgbG9nZ2VycyBpbmhlcml0IHRoZSByb290IGRlZmF1bHQgbGV2ZWwgYnV0IGNhbiBiZSB0dW5lZCBpbmRlcGVuZGVudGx5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gTW9kdWxlIG5hbWUsIGUuZy4gJ2FwaS1jbGllbnQnXG4gKiBAcmV0dXJucyB7aW1wb3J0KCdsb2dsZXZlbCcpLkxvZ2dlcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExvZ2dlcihuYW1lKSB7XG4gIHJldHVybiBsb2dsZXZlbC5nZXRMb2dnZXIobmFtZSk7XG59XG5cbi8vIEV4cG9zZSByb290IGxvZ2xldmVsIGluc3RhbmNlIG9uIGdsb2JhbFRoaXMgc28gdGhlIGJyb3dzZXIgY29uc29sZSBjYW5cbi8vIGFkanVzdCBsZXZlbHMgYXQgcnVudGltZSB3aXRob3V0IGEgYnVpbGQgc3RlcDpcbi8vICAgbG9nbGV2ZWwuc2V0TGV2ZWwoJ2RlYnVnJyk7XG4vLyAgIGxvZ2xldmVsLmdldExvZ2dlcignYXBpLWNsaWVudCcpLnNldExldmVsKCd0cmFjZScpO1xuaWYgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJykge1xuICBnbG9iYWxUaGlzLmxvZ2xldmVsID0gbG9nbGV2ZWw7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGxvZ2xldmVsO1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB1dGlscy5qc1xuICogVXRpbGl0eSBmdW5jdGlvbnMgZm9yIHRleHQgcHJvY2Vzc2luZywgZm9ybWF0dGluZywgYW5kIGRhdGEgbWFuaXB1bGF0aW9uLlxuICogTm8gZGVwZW5kZW5jaWVzIG9uIERPTSBvciBjb21wbGV4IHN0YXRlLiBQdXJlIGZ1bmN0aW9ucy5cbiAqL1xuXG4vKipcbiAqIE5vcm1hbGl6ZSB3aGl0ZXNwYWNlIGluIHRleHQ6XG4gKiAtIFJlbW92ZSBsZWFkaW5nL3RyYWlsaW5nIHdoaXRlc3BhY2VcbiAqIC0gQ29sbGFwc2UgaW50ZXJuYWwgd2hpdGVzcGFjZSB0byBzaW5nbGUgc3BhY2VzXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVRleHQodGV4dCkge1xuICByZXR1cm4gdGV4dFxuICAgIC50cmltKCkgIC8vIFJlbW92ZSBsZWFkaW5nL3RyYWlsaW5nIHdoaXRlc3BhY2VcbiAgICAucmVwbGFjZSgvXFxzKy9nLCAnICcpICAvLyBDb2xsYXBzZSBpbnRlcm5hbCB3aGl0ZXNwYWNlXG4gICAgLnRyaW0oKTtcbn1cblxuLyoqXG4gKiBGb3JtYXQgYSBVbml4IHRpbWVzdGFtcCBhcyBodW1hbi1yZWFkYWJsZSBkYXRlIHN0cmluZy5cbiAqIEV4YW1wbGU6IDE3MDkyMzY4MDAgXHUyMTkyIFwiTWFyIDEsIDIwMjRcIlxuICovXG5mdW5jdGlvbiBmbXREYXRlKHRzKSB7XG4gIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh0cyAqIDEwMDApO1xuICByZXR1cm4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcoJ2VuLVVTJywgeyBtb250aDogJ3Nob3J0JywgZGF5OiAnbnVtZXJpYycsIHllYXI6ICdudW1lcmljJyB9KTtcbn1cblxuLyoqXG4gKiBDbGVhbiBKU09OIHJlc3BvbnNlIGJ5IHJlbW92aW5nIG1hcmtkb3duIGNvZGUgYmxvY2tzLlxuICogSGFuZGxlcyBjb21tb24gcGF0dGVybnM6XG4gKiAtIGBgYGpzb24gLi4uIGBgYFxuICogLSBgYGBcbiAqICAgLi4uXG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gY2xlYW5Kc29uUmVzcG9uc2UodGV4dCkge1xuICBpZiAodHlwZW9mIHRleHQgIT09ICdzdHJpbmcnKSByZXR1cm4gdGV4dDtcbiAgbGV0IGNsZWFuZWQgPSB0ZXh0O1xuICAvLyBSZW1vdmUgYGBganNvbiB3cmFwcGVyXG4gIGNsZWFuZWQgPSBjbGVhbmVkLnJlcGxhY2UoL15gYGBqc29uXFxzKi9pLCAnJykucmVwbGFjZSgvYGBgXFxzKiQvaSwgJycpO1xuICAvLyBSZW1vdmUgYGBgIHdyYXBwZXJcbiAgY2xlYW5lZCA9IGNsZWFuZWQucmVwbGFjZSgvXmBgYFxccyovaSwgJycpLnJlcGxhY2UoL2BgYFxccyokL2ksICcnKTtcbiAgcmV0dXJuIGNsZWFuZWQudHJpbSgpO1xufVxuXG4vKipcbiAqIEV4dHJhY3QgYW5kIHBhcnNlIHRoZSBmaXJzdCB2YWxpZCBKU09OIG9iamVjdCBlbWJlZGRlZCBpbiBmcmVlLWZvcm0gdGV4dC5cbiAqIFJldHVybnMgbnVsbCB3aGVuIG5vIGNvbXBsZXRlIHBhcnNlYWJsZSBvYmplY3QgaXMgZm91bmQuXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RGaXJzdEpzb25PYmplY3QodGV4dCkge1xuICBpZiAodGV4dCA9PSBudWxsIHx8IHR5cGVvZiB0ZXh0ICE9PSAnc3RyaW5nJykgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgY2xlYW5lZCA9IGNsZWFuSnNvblJlc3BvbnNlKHRleHQpO1xuXG4gIGZvciAobGV0IHN0YXJ0ID0gMDsgc3RhcnQgPCBjbGVhbmVkLmxlbmd0aDsgc3RhcnQgKz0gMSkge1xuICAgIGlmIChjbGVhbmVkW3N0YXJ0XSAhPT0gJ3snKSBjb250aW51ZTtcblxuICAgIGxldCBkZXB0aCA9IDA7XG4gICAgbGV0IGluU3RyaW5nID0gZmFsc2U7XG4gICAgbGV0IGlzRXNjYXBlZCA9IGZhbHNlO1xuXG4gICAgZm9yIChsZXQgaW5kZXggPSBzdGFydDsgaW5kZXggPCBjbGVhbmVkLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgY29uc3QgY2hhciA9IGNsZWFuZWRbaW5kZXhdO1xuXG4gICAgICBpZiAoaW5TdHJpbmcpIHtcbiAgICAgICAgaWYgKGlzRXNjYXBlZCkge1xuICAgICAgICAgIGlzRXNjYXBlZCA9IGZhbHNlO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFyID09PSAnXFxcXCcpIHtcbiAgICAgICAgICBpc0VzY2FwZWQgPSB0cnVlO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFyID09PSAnXCInKSB7XG4gICAgICAgICAgaW5TdHJpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoYXIgPT09ICdcIicpIHtcbiAgICAgICAgaW5TdHJpbmcgPSB0cnVlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoYXIgPT09ICd7Jykge1xuICAgICAgICBkZXB0aCArPSAxO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoYXIgIT09ICd9JykgY29udGludWU7XG5cbiAgICAgIGRlcHRoIC09IDE7XG4gICAgICBpZiAoZGVwdGggIT09IDApIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBjYW5kaWRhdGUgPSBjbGVhbmVkLnNsaWNlKHN0YXJ0LCBpbmRleCArIDEpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoY2FuZGlkYXRlKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBFc2NhcGUgSFRNTCBzcGVjaWFsIGNoYXJhY3RlcnMgdG8gcHJldmVudCBpbmplY3Rpb24uXG4gKiBDb252ZXJ0czogJiA8ID4gXCIgJ1xuICovXG5mdW5jdGlvbiBlc2NhcGVIdG1sKHRleHQpIHtcbiAgaWYgKHRleHQgPT0gbnVsbCkgcmV0dXJuICcnO1xuICBpZiAodHlwZW9mIHRleHQgIT09ICdzdHJpbmcnKSByZXR1cm4gZXNjYXBlSHRtbChTdHJpbmcodGV4dCkpO1xuICBjb25zdCBtYXAgPSB7XG4gICAgJyYnOiAnJmFtcDsnLFxuICAgICc8JzogJyZsdDsnLFxuICAgICc+JzogJyZndDsnLFxuICAgICdcIic6ICcmcXVvdDsnLFxuICAgIFwiJ1wiOiAnJiMwMzk7J1xuICB9O1xuICByZXR1cm4gdGV4dC5yZXBsYWNlKC9bJjw+XCInXS9nLCBtID0+IG1hcFttXSk7XG59XG5cbi8qKlxuICogRXh0cmFjdCB0aXRsZSBhbmQgY29tcGFueSBmcm9tIGpvYiBkZXNjcmlwdGlvbiB0ZXh0LlxuICogUGF0dGVybnM6XG4gKiAtIFwiVGl0bGUgfCBDb21wYW55XCJcbiAqIC0gXCJUaXRsZSBhdCBDb21wYW55XCJcbiAqIC0gRmlyc3QgbGluZSBjb250YWluaW5nIFwidGl0bGVcIiwgXCJwb3NpdGlvblwiLCBcInJvbGVcIiwgXCJhcmNoaXRlY3RcIiwgZXRjLlxuICovXG5mdW5jdGlvbiBleHRyYWN0VGl0bGVBbmRDb21wYW55RnJvbUpvYlRleHQoam9iVGV4dCkge1xuICBjb25zdCBsaW5lcyA9IGpvYlRleHQuc3BsaXQoJ1xcbicpLm1hcChsID0+IGwudHJpbSgpKS5maWx0ZXIobCA9PiBsLmxlbmd0aCA+IDApO1xuXG4gIC8vIExvb2sgZm9yIHBhdHRlcm5zOiBcIlRpdGxlIHwgQ29tcGFueVwiIG9yIFwiVGl0bGUgYXQgQ29tcGFueVwiXG4gIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgIGlmIChsaW5lLmluY2x1ZGVzKCd8JykpIHtcbiAgICAgIGNvbnN0IFt0aXRsZSwgY29tcGFueV0gPSBsaW5lLnNwbGl0KCd8JykubWFwKHMgPT4gcy50cmltKCkpO1xuICAgICAgaWYgKHRpdGxlICYmIGNvbXBhbnkpIHtcbiAgICAgICAgcmV0dXJuIHsgdGl0bGUsIGNvbXBhbnkgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGxpbmUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnIGF0ICcpKSB7XG4gICAgICBjb25zdCBbdGl0bGUsIGNvbXBhbnldID0gbGluZS5zcGxpdCgvXFxzK2F0XFxzKy9pKS5tYXAocyA9PiBzLnRyaW0oKSk7XG4gICAgICBpZiAodGl0bGUgJiYgY29tcGFueSkge1xuICAgICAgICByZXR1cm4geyB0aXRsZSwgY29tcGFueSB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEZhbGxiYWNrOiB1c2UgZmlyc3Qgbm9uLWVtcHR5IGxpbmUgYXMgdGl0bGVcbiAgY29uc3QgdGl0bGVMaW5lID0gbGluZXNbMF07XG4gIHJldHVybiB7XG4gICAgdGl0bGU6IHRpdGxlTGluZSB8fCAnVW50aXRsZWQgUG9zaXRpb24nLFxuICAgIGNvbXBhbnk6IGxpbmVzLmZpbmQobCA9PiBsLnRvTG93ZXJDYXNlKCkgIT09IHRpdGxlTGluZS50b0xvd2VyQ2FzZSgpKSB8fCAnVW5rbm93biBDb21wYW55J1xuICB9O1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSBwb3NpdGlvbiBsYWJlbDpcbiAqIC0gQ2FwaXRhbGl6ZSBlYWNoIHdvcmRcbiAqIC0gUmVtb3ZlIHRyYWlsaW5nIFwicm9sZVwiLCBcInBvc2l0aW9uXCIsIFwidGl0bGVcIiwgXCJqb2JcIlxuICogRXhhbXBsZXM6XG4gKiAtIFwic2VuaW9yIGRhdGEgc2NpZW50aXN0XCIgXHUyMTkyIFwiU2VuaW9yIERhdGEgU2NpZW50aXN0XCJcbiAqIC0gXCJkaXJlY3RvciBvZiBlbmdpbmVlcmluZ1wiIFx1MjE5MiBcIkRpcmVjdG9yIG9mIEVuZ2luZWVyaW5nXCJcbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplUG9zaXRpb25MYWJlbCh0aXRsZSwgY29tcGFueSkge1xuICBsZXQgbm9ybWFsaXplZCA9IHRpdGxlXG4gICAgLnNwbGl0KCcgJylcbiAgICAubWFwKHdvcmQgPT4gd29yZC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHdvcmQuc2xpY2UoMSkudG9Mb3dlckNhc2UoKSlcbiAgICAuam9pbignICcpO1xuXG4gIC8vIFJlbW92ZSBjb21tb24gc3VmZml4ZXNcbiAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWRcbiAgICAucmVwbGFjZSgvXFxzKyhyb2xlfHBvc2l0aW9ufHRpdGxlfGpvYilcXHMqJC9pLCAnJylcbiAgICAudHJpbSgpO1xuXG4gIHJldHVybiBub3JtYWxpemVkIHx8ICdQcm9mZXNzaW9uYWwgUm9sZSc7XG59XG5cbi8qKlxuICogU3RyaXAgSFRNTCB0YWdzIGZyb20gc3RyaW5nLlxuICogVXNlcyBhbiBpbmVydCB0ZW1wbGF0ZSBlbGVtZW50LCB0aGVuIHJlbW92ZXMgZXhlY3V0YWJsZS9ub24tdmlzaWJsZSBub2Rlcy5cbiAqL1xuZnVuY3Rpb24gc3RyaXBIdG1sKGh0bWwpIHtcbiAgY29uc3QgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpO1xuICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBTdHJpbmcoaHRtbCA/PyAnJyk7XG4gIHRlbXBsYXRlLmNvbnRlbnQucXVlcnlTZWxlY3RvckFsbCgnc2NyaXB0LCBzdHlsZSwgbm9zY3JpcHQsIHRlbXBsYXRlJykuZm9yRWFjaChub2RlID0+IG5vZGUucmVtb3ZlKCkpO1xuICByZXR1cm4gdGVtcGxhdGUuY29udGVudC50ZXh0Q29udGVudCB8fCAnJztcbn1cblxuLyoqXG4gKiBUcnVuY2F0ZSB0ZXh0IHRvIG1heCBsZW5ndGggd2l0aCBlbGxpcHNpcy5cbiAqIFByZXNlcnZlcyB3b3JkIGJvdW5kYXJpZXMgd2hlbiBwb3NzaWJsZS5cbiAqL1xuZnVuY3Rpb24gdHJ1bmNhdGVUZXh0KHRleHQsIG1heExlbmd0aCA9IDEwMCkge1xuICBpZiAodGV4dC5sZW5ndGggPD0gbWF4TGVuZ3RoKSByZXR1cm4gdGV4dDtcblxuICAvLyBUcnVuY2F0ZSBhdCBtYXggbGVuZ3RoXG4gIGxldCB0cnVuY2F0ZWQgPSB0ZXh0LnN1YnN0cmluZygwLCBtYXhMZW5ndGgpO1xuXG4gIC8vIFRyeSB0byBmaW5kIHRoZSBsYXN0IHNwYWNlIHRvIGF2b2lkIGN1dHRpbmcgd29yZHNcbiAgY29uc3QgbGFzdFNwYWNlID0gdHJ1bmNhdGVkLmxhc3RJbmRleE9mKCcgJyk7XG4gIGlmIChsYXN0U3BhY2UgPiBNYXRoLmZsb29yKG1heExlbmd0aCAqIDAuNzUpKSB7XG4gICAgdHJ1bmNhdGVkID0gdHJ1bmNhdGVkLnN1YnN0cmluZygwLCBsYXN0U3BhY2UpO1xuICB9XG5cbiAgcmV0dXJuIHRydW5jYXRlZCArICdcdTIwMjYnO1xufVxuXG4vKipcbiAqIENhcGl0YWxpemUgZmlyc3QgbGV0dGVyIG9mIGVhY2ggd29yZC5cbiAqL1xuZnVuY3Rpb24gY2FwaXRhbGl6ZVdvcmRzKHRleHQpIHtcbiAgcmV0dXJuIHRleHRcbiAgICAuc3BsaXQoJyAnKVxuICAgIC5tYXAod29yZCA9PiB3b3JkLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgd29yZC5zbGljZSgxKS50b0xvd2VyQ2FzZSgpKVxuICAgIC5qb2luKCcgJyk7XG59XG5cbi8qKlxuICogQ29uZGl0aW9uYWwgcGx1cmFsaXphdGlvbiBoZWxwZXIuXG4gKiBFeGFtcGxlOiBwbHVyYWxpemUoMSwgJ2l0ZW0nLCAnaXRlbXMnKSBcdTIxOTIgJ2l0ZW0nXG4gKiAgICAgICAgICBwbHVyYWxpemUoMywgJ2l0ZW0nLCAnaXRlbXMnKSBcdTIxOTIgJ2l0ZW1zJ1xuICovXG5mdW5jdGlvbiBwbHVyYWxpemUoY291bnQsIHNpbmd1bGFyLCBwbHVyYWwpIHtcbiAgcmV0dXJuIGNvdW50ID09PSAxID8gc2luZ3VsYXIgOiBwbHVyYWw7XG59XG5cbi8qKlxuICogSHVtYW4tcmVhZGFibGUgdGltZSBkdXJhdGlvbi5cbiAqIEV4YW1wbGU6IDUwMDAgXHUyMTkyIFwiNSBzZWNvbmRzXCIsIDY1MDAwIFx1MjE5MiBcIjEgbWludXRlXCJcbiAqL1xuZnVuY3Rpb24gZm9ybWF0RHVyYXRpb24obXMpIHtcbiAgY29uc3Qgc2Vjb25kcyA9IE1hdGguZmxvb3IobXMgLyAxMDAwKTtcbiAgY29uc3QgbWludXRlcyA9IE1hdGguZmxvb3Ioc2Vjb25kcyAvIDYwKTtcbiAgY29uc3QgaG91cnMgPSBNYXRoLmZsb29yKG1pbnV0ZXMgLyA2MCk7XG5cbiAgaWYgKGhvdXJzID4gMCkgcmV0dXJuIGAke2hvdXJzfWggJHttaW51dGVzICUgNjB9bWA7XG4gIGlmIChtaW51dGVzID4gMCkgcmV0dXJuIGAke21pbnV0ZXN9bSAke3NlY29uZHMgJSA2MH1zYDtcbiAgcmV0dXJuIGAke3NlY29uZHN9c2A7XG59XG5cbi8qKlxuICogT3JkaW5hbCBudW1iZXIgc3VmZml4LlxuICogRXhhbXBsZTogMSBcdTIxOTIgXCIxc3RcIiwgMiBcdTIxOTIgXCIybmRcIiwgMyBcdTIxOTIgXCIzcmRcIiwgNCBcdTIxOTIgXCI0dGhcIlxuICovXG5mdW5jdGlvbiBvcmRpbmFsKG4pIHtcbiAgY29uc3QgcyA9IFsndGgnLCAnc3QnLCAnbmQnLCAncmQnXTtcbiAgY29uc3QgdiA9IG4gJSAxMDA7XG4gIHJldHVybiBuICsgKHNbKHYgLSAyMCkgJSAxMF0gfHwgc1t2XSB8fCBzWzBdKTtcbn1cblxuLy8gVXRpbGl0eSBmdW5jdGlvbnMgZm9yIHNlc3Npb24gbWFuYWdlbWVudCBhbmQgZm9ybWF0dGluZ1xuXG4vLyBGdWxsLWxlbmd0aCBwaGFzZSBsYWJlbHMgXHUyMDE0IHVzZWQgYnkgd29ya2Zsb3cgc3RlcCBkaXNwbGF5LCBzdGF0dXMgdGV4dCwgZXRjLlxuY29uc3QgU0VTU0lPTl9QSEFTRV9MQUJFTFMgPSB7XG4gIGluaXQ6ICAgICAgICAgICAgICdHZXR0aW5nIFN0YXJ0ZWQnLFxuICBqb2JfYW5hbHlzaXM6ICAgICAnSm9iIEFuYWx5c2lzJyxcbiAgY3VzdG9taXphdGlvbjogICAgJ0N1c3RvbWlzYXRpb24nLFxuICByZXdyaXRlX3JldmlldzogICAnUmV3cml0ZSBSZXZpZXcnLFxuICBzcGVsbF9jaGVjazogICAgICAnU3BlbGwgQ2hlY2snLFxuICBnZW5lcmF0aW9uOiAgICAgICAnR2VuZXJhdGlvbicsXG4gIGxheW91dF9yZXZpZXc6ICAgICdMYXlvdXQgUmV2aWV3JyxcbiAgcmVmaW5lbWVudDogICAgICAgJ0ZpbmFsaXNlJyxcbiAgZmluYWxfZ2VuZXJhdGlvbjogJ0ZpbmFsIEdlbmVyYXRpb24nLFxufTtcblxuLy8gQWJicmV2aWF0ZWQgcGhhc2UgbGFiZWxzIFx1MjAxNCB1c2VkIGJ5IHRoZSBjb21wYWN0IHNlc3Npb24tc3dpdGNoZXIgVUkuXG4vLyBJbnRlbnRpb25hbGx5IHNlcGFyYXRlIGZyb20gU0VTU0lPTl9QSEFTRV9MQUJFTFM6IHRoZSB0d28gc2V0cyBzZXJ2ZSBkaWZmZXJlbnRcbi8vIFVJIGNvbnRleHRzIChzcGFjZS1jb25zdHJhaW5lZCBoZWFkZXIgY2hpcCB2cy4gZnVsbCB3b3JrZmxvdyBzdGVwIGxhYmVsKS5cbmNvbnN0IFNFU1NJT05fUEhBU0VfTEFCRUxTX1NIT1JUID0ge1xuICBpbml0OiAgICAgICAgICAgICAnU2V0dXAnLFxuICBqb2JfYW5hbHlzaXM6ICAgICAnQW5hbHlzaXMnLFxuICBjdXN0b21pemF0aW9uOiAgICAnQ3VzdG9taXNpbmcnLFxuICByZXdyaXRlX3JldmlldzogICAnUmV3cml0ZXMnLFxuICBzcGVsbF9jaGVjazogICAgICAnU3BlbGwgQ2hlY2snLFxuICBnZW5lcmF0aW9uOiAgICAgICAnR2VuZXJhdGUnLFxuICBsYXlvdXRfcmV2aWV3OiAgICAnTGF5b3V0JyxcbiAgcmVmaW5lbWVudDogICAgICAgJ0ZpbmFsaXNlJyxcbiAgZmluYWxfZ2VuZXJhdGlvbjogJ0ZpbmFsIEdlbicsXG59O1xuXG4vKipcbiAqIEZvcm1hdCBzZXNzaW9uIHBoYXNlIGxhYmVscyAoZnVsbCBmb3JtKS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwaGFzZSAtIFRoZSBwaGFzZSBzdHJpbmcgdG8gZm9ybWF0LlxuICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgZm9ybWF0dGVkIHBoYXNlIGxhYmVsLlxuICovXG5mdW5jdGlvbiBmb3JtYXRTZXNzaW9uUGhhc2VMYWJlbChwaGFzZSkge1xuICBpZiAoIXBoYXNlKSByZXR1cm4gJ2luaXQnO1xuICByZXR1cm4gU0VTU0lPTl9QSEFTRV9MQUJFTFNbcGhhc2VdIHx8IFN0cmluZyhwaGFzZSkucmVwbGFjZSgvXy9nLCAnICcpO1xufVxuXG4vKipcbiAqIEZvcm1hdCBzZXNzaW9uIHRpbWVzdGFtcHMuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGltZXN0YW1wIC0gVGhlIHRpbWVzdGFtcCB0byBmb3JtYXQuXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyAtIEZvcm1hdHRpbmcgb3B0aW9ucy5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuaW5jbHVkZVRpbWU9dHJ1ZV0gLSBXaGV0aGVyIHRvIGluY2x1ZGUgdGltZSBpbiB0aGUgb3V0cHV0LlxuICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAqL1xuZnVuY3Rpb24gZm9ybWF0U2Vzc2lvblRpbWVzdGFtcCh0aW1lc3RhbXAsIHsgaW5jbHVkZVRpbWUgPSB0cnVlIH0gPSB7fSkge1xuICBpZiAoIXRpbWVzdGFtcCkgcmV0dXJuICdcdTIwMTQnO1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgRGF0ZSh0aW1lc3RhbXApLnRvTG9jYWxlU3RyaW5nKCdlbi1VUycsIHtcbiAgICAgIG1vbnRoOiAnc2hvcnQnLCBkYXk6ICdudW1lcmljJywgeWVhcjogJ251bWVyaWMnLFxuICAgICAgLi4uKGluY2x1ZGVUaW1lID8geyBob3VyOiAnbnVtZXJpYycsIG1pbnV0ZTogJzItZGlnaXQnIH0gOiB7fSksXG4gICAgfSk7XG4gIH0gY2F0Y2ggKF8pIHtcbiAgICByZXR1cm4gU3RyaW5nKHRpbWVzdGFtcCkucmVwbGFjZSgnVCcsICcgJykuc2xpY2UoMCwgaW5jbHVkZVRpbWUgPyAxNiA6IDEwKTtcbiAgfVxufVxuXG4vLyBTdHJ1Y3R1cmVkIGxvZ2dpbmcgaGVscGVyIChnbG9iYWwgYW5kIHRlc3QtZnJpZW5kbHkpLlxuY29uc3QgTE9HX0xFVkVMUyA9IHsgZGVidWc6IDEwLCBpbmZvOiAyMCwgd2FybjogMzAsIGVycm9yOiA0MCB9O1xuY29uc3QgREVGQVVMVF9MT0dfTEVWRUwgPSAnaW5mbyc7XG5cbmZ1bmN0aW9uIGNyZWF0ZUxvZ0VudHJ5KGxldmVsLCBtZXNzYWdlLCBtZXRhZGF0YSA9IHt9KSB7XG4gIGNvbnN0IGVudHJ5ID0ge1xuICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIGxldmVsLFxuICAgIG1lc3NhZ2U6IFN0cmluZyhtZXNzYWdlKSxcbiAgICAuLi5tZXRhZGF0YSxcbiAgfTtcbiAgcmV0dXJuIGVudHJ5O1xufVxuXG5jb25zdCBsb2dnZXIgPSB7XG4gIGxldmVsOiBERUZBVUxUX0xPR19MRVZFTCxcblxuICBzZXRMZXZlbChuZXdMZXZlbCkge1xuICAgIGlmIChMT0dfTEVWRUxTW25ld0xldmVsXSAhPSBudWxsKSB7XG4gICAgICB0aGlzLmxldmVsID0gbmV3TGV2ZWw7XG4gICAgfVxuICB9LFxuXG4gIHNob3VsZExvZyhsZXZlbCkge1xuICAgIGlmIChMT0dfTEVWRUxTW2xldmVsXSA9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIExPR19MRVZFTFNbbGV2ZWxdID49IExPR19MRVZFTFNbdGhpcy5sZXZlbF07XG4gIH0sXG5cbiAgbG9nKGxldmVsLCBtZXNzYWdlLCBtZXRhZGF0YSA9IHt9KSB7XG4gICAgaWYgKCF0aGlzLnNob3VsZExvZyhsZXZlbCkpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgZW50cnkgPSBjcmVhdGVMb2dFbnRyeShsZXZlbCwgbWVzc2FnZSwgbWV0YWRhdGEpO1xuICAgIGNvbnN0IGZvcm1hdHRlZCA9IEpTT04uc3RyaW5naWZ5KGVudHJ5KTtcblxuICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGlmIChsZXZlbCA9PT0gJ2Vycm9yJykgY29uc29sZS5lcnJvcihmb3JtYXR0ZWQpO1xuICAgICAgZWxzZSBpZiAobGV2ZWwgPT09ICd3YXJuJykgY29uc29sZS53YXJuKGZvcm1hdHRlZCk7XG4gICAgICBlbHNlIGNvbnNvbGUubG9nKGZvcm1hdHRlZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVudHJ5O1xuICB9LFxuXG4gIGRlYnVnKG1lc3NhZ2UsIG1ldGFkYXRhID0ge30pIHsgcmV0dXJuIHRoaXMubG9nKCdkZWJ1ZycsIG1lc3NhZ2UsIG1ldGFkYXRhKTsgfSxcbiAgaW5mbyhtZXNzYWdlLCBtZXRhZGF0YSA9IHt9KSB7IHJldHVybiB0aGlzLmxvZygnaW5mbycsIG1lc3NhZ2UsIG1ldGFkYXRhKTsgfSxcbiAgd2FybihtZXNzYWdlLCBtZXRhZGF0YSA9IHt9KSB7IHJldHVybiB0aGlzLmxvZygnd2FybicsIG1lc3NhZ2UsIG1ldGFkYXRhKTsgfSxcbiAgZXJyb3IobWVzc2FnZSwgbWV0YWRhdGEgPSB7fSkgeyByZXR1cm4gdGhpcy5sb2coJ2Vycm9yJywgbWVzc2FnZSwgbWV0YWRhdGEpOyB9LFxuXG4gIGV2ZW50KGFjdGlvbiwgbWV0YWRhdGEgPSB7fSkge1xuICAgIHJldHVybiB0aGlzLmluZm8oYGV2ZW50OiR7YWN0aW9ufWAsIHsgYWN0aW9uLCAuLi5tZXRhZGF0YSB9KTtcbiAgfSxcbn07XG5cbmlmICh0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgZ2xvYmFsVGhpcy5sb2dnZXIgPSBsb2dnZXI7XG59XG5cbmV4cG9ydCB7XG4gIG5vcm1hbGl6ZVRleHQsIGZtdERhdGUsIGNsZWFuSnNvblJlc3BvbnNlLCBleHRyYWN0Rmlyc3RKc29uT2JqZWN0LCBlc2NhcGVIdG1sLFxuICBleHRyYWN0VGl0bGVBbmRDb21wYW55RnJvbUpvYlRleHQsIG5vcm1hbGl6ZVBvc2l0aW9uTGFiZWwsXG4gIHN0cmlwSHRtbCwgdHJ1bmNhdGVUZXh0LCBjYXBpdGFsaXplV29yZHMsIHBsdXJhbGl6ZSxcbiAgZm9ybWF0RHVyYXRpb24sIG9yZGluYWwsXG4gIFNFU1NJT05fUEhBU0VfTEFCRUxTLCBTRVNTSU9OX1BIQVNFX0xBQkVMU19TSE9SVCxcbiAgZm9ybWF0U2Vzc2lvblBoYXNlTGFiZWwsXG4gIGxvZ2dlcixcbn07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIGFwaS1jbGllbnQuanNcbiAqIENlbnRyYWxpemVkIEhUVFAgY29tbXVuaWNhdGlvbiBsYXllci4gQWxsIEFQSSBjYWxscyBnbyB0aHJvdWdoIGFwaUNhbGwoKS5cbiAqIFByb3ZpZGVzIGVycm9yIGhhbmRsaW5nLCBsb2dnaW5nLCBhbmQgcmV0cnkgbG9naWMuXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgaGFuZGxlNDA5Q29uZmxpY3QgfSBmcm9tICcuL2ZldGNoLXV0aWxzLmpzJztcbmNvbnN0IGxvZyA9IGdldExvZ2dlcignYXBpLWNsaWVudCcpO1xuXG4vKipcbiAqIENlbnRyYWxpemVkIGxvY2FsU3RvcmFnZSBrZXkgbWFuYWdlbWVudCB0byBhdm9pZCBkdXBsaWNhdGlvblxuICovXG5jb25zdCBTdG9yYWdlS2V5cyA9IHtcbiAgU0VTU0lPTl9JRDogICAgICAgICAgICdjdi1idWlsZGVyLXNlc3Npb24taWQnLFxuICBTRVNTSU9OX1BBVEg6ICAgICAgICAgJ2N2LWJ1aWxkZXItc2Vzc2lvbi1wYXRoJyxcbiAgVEFCX0RBVEE6ICAgICAgICAgICAgICdjdi1idWlsZGVyLXRhYi1kYXRhJyxcbiAgQ1VSUkVOVF9UQUI6ICAgICAgICAgICdjdi1idWlsZGVyLWN1cnJlbnQtdGFiJyxcbiAgQ0hBVF9DT0xMQVBTRUQ6ICAgICAgICdjdi1idWlsZGVyLWNoYXQtY29sbGFwc2VkJyxcbiAgTExNX0RJU0NMT1NVUkVfU0hPV046ICdjdi1idWlsZGVyLWxsbS1kaXNjbG9zdXJlLXNob3duJyxcbn07XG5cbmNvbnN0IE9XTkVSX1RPS0VOX0tFWSA9ICdjdi1idWlsZGVyLW93bmVyLXRva2VuJztcblxuZnVuY3Rpb24gZ2V0U2Vzc2lvbklkRnJvbVVSTCgpIHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICF3aW5kb3cubG9jYXRpb24pIHJldHVybiBudWxsO1xuICByZXR1cm4gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKS5nZXQoJ3Nlc3Npb24nKTtcbn1cblxuZnVuY3Rpb24gZ2V0T3duZXJUb2tlbigpIHtcbiAgaWYgKHR5cGVvZiBzZXNzaW9uU3RvcmFnZSA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybiBudWxsO1xuICBsZXQgdG9rZW4gPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKE9XTkVSX1RPS0VOX0tFWSk7XG4gIGlmICghdG9rZW4pIHtcbiAgICBpZiAodHlwZW9mIGNyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNyeXB0by5yYW5kb21VVUlEID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0b2tlbiA9IGNyeXB0by5yYW5kb21VVUlEKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRva2VuID0gYHRhYi0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygxNikuc2xpY2UoMiwgMTApfWA7XG4gICAgfVxuICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oT1dORVJfVE9LRU5fS0VZLCB0b2tlbik7XG4gIH1cbiAgcmV0dXJuIHRva2VuO1xufVxuXG5mdW5jdGlvbiBnZXRTY29wZWRUYWJEYXRhU3RvcmFnZUtleShzZXNzaW9uSWQgPSBudWxsKSB7XG4gIGNvbnN0IHNjb3BlZFNlc3Npb25JZCA9IHNlc3Npb25JZCB8fCBnZXRTZXNzaW9uSWRGcm9tVVJMKCk7XG4gIHJldHVybiBzY29wZWRTZXNzaW9uSWRcbiAgICA/IGAke1N0b3JhZ2VLZXlzLlRBQl9EQVRBfS0ke3Njb3BlZFNlc3Npb25JZH1gXG4gICAgOiBTdG9yYWdlS2V5cy5UQUJfREFUQTtcbn1cblxuZnVuY3Rpb24gX2lzU2Vzc2lvbk1hbmFnZW1lbnRQYXRoKHBhdGhuYW1lKSB7XG4gIHJldHVybiBwYXRobmFtZSA9PT0gJy9hcGkvc2Vzc2lvbnMvbmV3J1xuICAgIHx8IHBhdGhuYW1lID09PSAnL2FwaS9zZXNzaW9ucy9jbGFpbSdcbiAgICB8fCBwYXRobmFtZSA9PT0gJy9hcGkvc2Vzc2lvbnMvdGFrZW92ZXInO1xufVxuXG5mdW5jdGlvbiBfYnVpbGRTZXNzaW9uQXdhcmVSZXF1ZXN0KGlucHV0LCBpbml0ID0ge30pIHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICF3aW5kb3cubG9jYXRpb24pIHtcbiAgICByZXR1cm4gW2lucHV0LCBpbml0XTtcbiAgfVxuXG4gIGNvbnN0IHVybCA9IG5ldyBVUkwodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJyA/IGlucHV0IDogaW5wdXQudXJsLCB3aW5kb3cubG9jYXRpb24ub3JpZ2luKTtcbiAgaWYgKCF1cmwucGF0aG5hbWUuc3RhcnRzV2l0aCgnL2FwaS8nKSkge1xuICAgIHJldHVybiBbaW5wdXQsIGluaXRdO1xuICB9XG5cbiAgY29uc3Qgb3duZXJUb2tlbiA9IGdldE93bmVyVG9rZW4oKTtcbiAgaWYgKCF1cmwuc2VhcmNoUGFyYW1zLmhhcygnb3duZXJfdG9rZW4nKSAmJiAhX2lzU2Vzc2lvbk1hbmFnZW1lbnRQYXRoKHVybC5wYXRobmFtZSkgJiYgb3duZXJUb2tlbikge1xuICAgIHVybC5zZWFyY2hQYXJhbXMuc2V0KCdvd25lcl90b2tlbicsIG93bmVyVG9rZW4pO1xuICB9XG5cbiAgY29uc3Qgc2Vzc2lvbklkID0gZ2V0U2Vzc2lvbklkRnJvbVVSTCgpO1xuICBpZiAoIXNlc3Npb25JZCkge1xuICAgIHJldHVybiBbdXJsLnRvU3RyaW5nKCksIGluaXRdO1xuICB9XG5cbiAgY29uc3QgbWV0aG9kID0gKGluaXQubWV0aG9kIHx8ICdHRVQnKS50b1VwcGVyQ2FzZSgpO1xuICBjb25zdCBuZXh0SW5pdCA9IHsgLi4uaW5pdCB9O1xuICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoaW5pdC5oZWFkZXJzIHx8IHt9KTtcblxuICBpZiAoIXVybC5zZWFyY2hQYXJhbXMuaGFzKCdzZXNzaW9uX2lkJykgJiYgIV9pc1Nlc3Npb25NYW5hZ2VtZW50UGF0aCh1cmwucGF0aG5hbWUpKSB7XG4gICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ3Nlc3Npb25faWQnLCBzZXNzaW9uSWQpO1xuICB9XG5cbiAgY29uc3QgbmVlZHNCb2R5Q29udGV4dCA9ICFbJ0dFVCcsICdIRUFEJ10uaW5jbHVkZXMobWV0aG9kKTtcbiAgY29uc3QgYm9keSA9IG5leHRJbml0LmJvZHk7XG4gIGNvbnN0IGlzRm9ybURhdGEgPSB0eXBlb2YgRm9ybURhdGEgIT09ICd1bmRlZmluZWQnICYmIGJvZHkgaW5zdGFuY2VvZiBGb3JtRGF0YTtcbiAgY29uc3QgaXNVUkxTZWFyY2hQYXJhbXMgPSB0eXBlb2YgVVJMU2VhcmNoUGFyYW1zICE9PSAndW5kZWZpbmVkJyAmJiBib2R5IGluc3RhbmNlb2YgVVJMU2VhcmNoUGFyYW1zO1xuICBjb25zdCBjb250ZW50VHlwZSA9IGhlYWRlcnMuZ2V0KCdDb250ZW50LVR5cGUnKSB8fCAnJztcblxuICBpZiAobmVlZHNCb2R5Q29udGV4dCAmJiAhaXNGb3JtRGF0YSAmJiAhaXNVUkxTZWFyY2hQYXJhbXMpIHtcbiAgICBsZXQgcGF5bG9hZCA9IHt9O1xuICAgIGlmICh0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycgJiYgYm9keS50cmltKCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHBheWxvYWQgPSBKU09OLnBhcnNlKGJvZHkpO1xuICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICByZXR1cm4gW3VybC50b1N0cmluZygpLCBuZXh0SW5pdF07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChib2R5ID09IG51bGwpIHtcbiAgICAgIHBheWxvYWQgPSB7fTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBib2R5ID09PSAnb2JqZWN0Jykge1xuICAgICAgcGF5bG9hZCA9IHsgLi4uYm9keSB9O1xuICAgIH1cblxuICAgIGlmIChwYXlsb2FkLnNlc3Npb25faWQgPT0gbnVsbCAmJiAhX2lzU2Vzc2lvbk1hbmFnZW1lbnRQYXRoKHVybC5wYXRobmFtZSkpIHtcbiAgICAgIHBheWxvYWQuc2Vzc2lvbl9pZCA9IHNlc3Npb25JZDtcbiAgICB9XG4gICAgaWYgKHBheWxvYWQub3duZXJfdG9rZW4gPT0gbnVsbCAmJiAhX2lzU2Vzc2lvbk1hbmFnZW1lbnRQYXRoKHVybC5wYXRobmFtZSkpIHtcbiAgICAgIGlmIChvd25lclRva2VuKSBwYXlsb2FkLm93bmVyX3Rva2VuID0gb3duZXJUb2tlbjtcbiAgICB9XG5cbiAgICBuZXh0SW5pdC5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocGF5bG9hZCk7XG4gICAgaWYgKCFjb250ZW50VHlwZSkge1xuICAgICAgaGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uJyk7XG4gICAgfVxuICB9XG5cbiAgbmV4dEluaXQuaGVhZGVycyA9IGhlYWRlcnM7XG4gIHJldHVybiBbdXJsLnRvU3RyaW5nKCksIG5leHRJbml0XTtcbn1cblxuY29uc3QgX25hdGl2ZUZldGNoID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5mZXRjaCA9PT0gJ2Z1bmN0aW9uJ1xuICA/IHdpbmRvdy5mZXRjaC5iaW5kKHdpbmRvdylcbiAgOiAodHlwZW9mIGdsb2JhbFRoaXMuZmV0Y2ggPT09ICdmdW5jdGlvbicgPyBnbG9iYWxUaGlzLmZldGNoLmJpbmQoZ2xvYmFsVGhpcykgOiBudWxsKTtcblxuYXN5bmMgZnVuY3Rpb24gc2Vzc2lvbkF3YXJlRmV0Y2goaW5wdXQsIGluaXQgPSB7fSkge1xuICBpZiAoX25hdGl2ZUZldGNoID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZldGNoIGlzIG5vdCBhdmFpbGFibGUnKTtcbiAgfVxuICBjb25zdCBbbmV4dElucHV0LCBuZXh0SW5pdF0gPSBfYnVpbGRTZXNzaW9uQXdhcmVSZXF1ZXN0KGlucHV0LCBpbml0KTtcbiAgbGV0IHJlc3AgPSBhd2FpdCBfbmF0aXZlRmV0Y2gobmV4dElucHV0LCBuZXh0SW5pdCk7XG4gIGlmIChyZXNwLnN0YXR1cyA9PT0gNDA5KSB7XG4gICAgY29uc3Qgc2hvdWxkUmV0cnkgPSBhd2FpdCBoYW5kbGU0MDlDb25mbGljdChuZXh0SW5wdXQsIG5leHRJbml0LCByZXNwKTtcbiAgICBpZiAoc2hvdWxkUmV0cnkpIHJlc3AgPSBhd2FpdCBfbmF0aXZlRmV0Y2gobmV4dElucHV0LCBuZXh0SW5pdCk7XG4gIH1cbiAgcmV0dXJuIHJlc3A7XG59XG5cbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93LmZldGNoID09PSAnZnVuY3Rpb24nKSB7XG4gIHdpbmRvdy5mZXRjaCA9IHNlc3Npb25Bd2FyZUZldGNoO1xufVxuXG4vKipcbiAqIEJhc2UgQVBJIGNhbGwgZnVuY3Rpb24gd2l0aCBlcnJvciBoYW5kbGluZyBhbmQgbG9nZ2luZy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2QgLSBIVFRQIG1ldGhvZCAoR0VULCBQT1NULCBldGMuKVxuICogQHBhcmFtIHtzdHJpbmd9IGVuZHBvaW50IC0gQVBJIGVuZHBvaW50IChlLmcuLCAnL2FwaS9zdGF0dXMnKVxuICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBSZXF1ZXN0IGJvZHkgZGF0YSAoZm9yIFBPU1QvUFVUKVxuICogQHJldHVybnMge1Byb21pc2U8b2JqZWN0Pn0gUGFyc2VkIEpTT04gcmVzcG9uc2VcbiAqL1xuYXN5bmMgZnVuY3Rpb24gYXBpQ2FsbChtZXRob2QsIGVuZHBvaW50LCBkYXRhID0gbnVsbCkge1xuICBjb25zdCBvcHRpb25zID0ge1xuICAgIG1ldGhvZCxcbiAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfVxuICB9O1xuXG4gIGlmIChkYXRhICYmIChtZXRob2QgPT09ICdQT1NUJyB8fCBtZXRob2QgPT09ICdQVVQnKSkge1xuICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNlc3Npb25Bd2FyZUZldGNoKGVuZHBvaW50LCBvcHRpb25zKTtcblxuICAgIC8vIEhhbmRsZSA0MDkgQ29uZmxpY3QgKHNlc3Npb24gYWxyZWFkeSBhY3RpdmUpXG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA5KSB7XG4gICAgICBsb2cud2FybihgU2Vzc2lvbiBjb25mbGljdCBvbiAke2VuZHBvaW50fWApO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTZXNzaW9uIGFscmVhZHkgYWN0aXZlIGluIGFub3RoZXIgdGFiJyk7XG4gICAgfVxuXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgbG9nLmVycm9yKGBBUEkgZXJyb3Igb24gJHttZXRob2R9ICR7ZW5kcG9pbnR9OmAsIHJlc3BvbnNlLnN0YXR1cywgcmVzcG9uc2Uuc3RhdHVzVGV4dCk7XG4gICAgICBsZXQgZXJyb3JNZXNzYWdlID0gcmVzcG9uc2Uuc3RhdHVzVGV4dDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGVycm9ySnNvbiA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgaWYgKGVycm9ySnNvbiAmJiB0eXBlb2YgZXJyb3JKc29uID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGVycm9ySnNvbi5lcnJvciB8fCBlcnJvckpzb24ubWVzc2FnZSB8fCBlcnJvck1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgLy8gRmFsbCBiYWNrIHRvIHN0YXR1cyB0ZXh0IHdoZW4gcmVzcG9uc2UgaXMgbm90IEpTT04uXG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7cmVzcG9uc2Uuc3RhdHVzfTogJHtlcnJvck1lc3NhZ2V9YCk7XG4gICAgfVxuXG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICByZXR1cm4ganNvbjtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cuZXJyb3IoYEFQSSBjYWxsIGZhaWxlZDogJHttZXRob2R9ICR7ZW5kcG9pbnR9YCwgZXJyb3IpO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09XG4vLyBTZXNzaW9uIE1hbmFnZW1lbnRcbi8vID09PT09PT09PT09PT09PT09PT09XG5cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVNlc3Npb24oKSB7XG4gIHJldHVybiBhcGlDYWxsKCdQT1NUJywgJy9hcGkvc2Vzc2lvbnMvbmV3Jyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoU3RhdHVzKCkge1xuICBjb25zdCBzdGF0dXMgPSBhd2FpdCBhcGlDYWxsKCdHRVQnLCAnL2FwaS9zdGF0dXMnKTtcblxuICAvLyBLZWVwIHByb3ZpZGVyL2F1dGggVUkgaW4gc3luYyB3aGVuZXZlciBzdGF0dXMgaXMgZmV0Y2hlZC5cbiAgY29uc3QgcHJvdmlkZXIgPSBzdGF0dXM/LmxsbV9wcm92aWRlciB8fCBudWxsO1xuICBpZiAocHJvdmlkZXIpIHtcbiAgICBnbG9iYWxUaGlzLmN1cnJlbnRQcm92aWRlciA9IHByb3ZpZGVyO1xuICB9XG4gIGlmICh0eXBlb2YgZ2xvYmFsVGhpcy51cGRhdGVBdXRoQmFkZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICBnbG9iYWxUaGlzLnVwZGF0ZUF1dGhCYWRnZShzdGF0dXM/LmNvcGlsb3RfYXV0aCB8fCB7fSwgcHJvdmlkZXIpO1xuICB9XG5cbiAgLy8gVXBkYXRlIHdvcmtmbG93IHN0ZXAgYmFyIChjbGlja2FibGUvY29tcGxldGVkL2FjdGl2ZSBzdGF0ZSkgb24gZXZlcnkgc3RhdHVzIGZldGNoLlxuICBpZiAodHlwZW9mIGdsb2JhbFRoaXMudXBkYXRlV29ya2Zsb3dTdGVwcyA9PT0gJ2Z1bmN0aW9uJyAmJiBzdGF0dXMgJiYgIXN0YXR1cy5fZXJyb3IpIHtcbiAgICBnbG9iYWxUaGlzLnVwZGF0ZVdvcmtmbG93U3RlcHMoc3RhdHVzKTtcbiAgfVxuXG4gIHJldHVybiBzdGF0dXM7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09XG4vLyBTZXR0aW5nc1xuLy8gPT09PT09PT09PT09PT09PT09PT1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hTZXR0aW5ncygpIHtcbiAgcmV0dXJuIGFwaUNhbGwoJ0dFVCcsICcvYXBpL3NldHRpbmdzJyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVNldHRpbmdzKHNldHRpbmdzKSB7XG4gIHJldHVybiBhcGlDYWxsKCdQVVQnLCAnL2FwaS9zZXR0aW5ncycsIHsgc2V0dGluZ3MgfSk7XG59XG5cbmV4cG9ydCB7XG4gIFN0b3JhZ2VLZXlzLFxuICBPV05FUl9UT0tFTl9LRVksXG4gIGFwaUNhbGwsXG4gIGdldFNlc3Npb25JZEZyb21VUkwsXG4gIGdldE93bmVyVG9rZW4sXG4gIGdldFNjb3BlZFRhYkRhdGFTdG9yYWdlS2V5LFxuICBzZXNzaW9uQXdhcmVGZXRjaCxcbiAgY3JlYXRlU2Vzc2lvbixcbiAgZmV0Y2hTdGF0dXMsXG4gIGZldGNoU2V0dGluZ3MsIHVwZGF0ZVNldHRpbmdzLFxufTtcblxuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvZmV0Y2gtdXRpbHMuanNcbiAqIEdsb2JhbCBmZXRjaCBpbnRlcmNlcHRvciwgNDA5LWNvbmZsaWN0IHJldHJ5IHF1ZXVlLCBMTE0gYnVzeSBvdmVybGF5LCBhbmRcbiAqIHRoZSBzZXRMb2FkaW5nIGhlbHBlciB0aGF0IGRyaXZlcyBidXR0b25zL3Byb2dyZXNzIGJhci9hYm9ydCBjb250cm9sbGVyLlxuICpcbiAqIERFUEVOREVOQ0lFUzogdWktY29yZS5qcyBleHBvcnRzICh0cmFwRm9jdXMgZXRjLikgYXZhaWxhYmxlIG9uIGdsb2JhbFRoaXMuXG4gKiAgICAgICAgICAgICAgIHNldExvYWRpbmcgY2FsbHMgX3VwZGF0ZUxMTU92ZXJsYXkgKGRlZmluZWQgaGVyZSkgYW5kXG4gKiAgICAgICAgICAgICAgIGFwcGVuZE1lc3NhZ2UgKGRlZmluZWQgaW4gbWVzc2FnZS1xdWV1ZS5qcywgb24gZ2xvYmFsVGhpcykuXG4gKi9cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyA0MDkgQ29uZmxpY3QgcmV0cnkgcXVldWVcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5jb25zdCBfY29uZmxpY3RSZXRyeVF1ZXVlID0gW107XG5sZXQgICBfY29uZmxpY3RUaW1lcklkICAgID0gbnVsbDtcbmxldCAgIF9jb25mbGljdENvdW50ZG93biAgPSAwO1xuXG4vKiogUmV0dXJuIHRydWUgaWYgdGhpcyByZXF1ZXN0IHNob3VsZCBiZSBpbnRlcmNlcHRlZCBieSB0aGUgNDA5IGhhbmRsZXIuICovXG5mdW5jdGlvbiBfc2hvdWxkSGFuZGxlQnVzeUNvbmZsaWN0KGFyZ3MpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCByYXdVcmwgPSB0eXBlb2YgYXJnc1swXSA9PT0gJ3N0cmluZycgPyBhcmdzWzBdIDogYXJnc1swXT8udXJsO1xuICAgIGlmICghcmF3VXJsKSByZXR1cm4gdHJ1ZTtcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHJhd1VybCwgd2luZG93LmxvY2F0aW9uLm9yaWdpbik7XG4gICAgcmV0dXJuIHVybC5wYXRobmFtZSAhPT0gJy9hcGkvc2Vzc2lvbnMvY2xhaW0nICYmIHVybC5wYXRobmFtZSAhPT0gJy9hcGkvc2Vzc2lvbnMvdGFrZW92ZXInO1xuICB9IGNhdGNoIChfKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBIYW5kbGUgYSA0MDkgQ29uZmxpY3QgcmVzcG9uc2U6IHNob3cgdGhlIGFtYmVyIGJhbm5lciBhbmQgYXdhaXQgdXNlciBjaG9pY2UuXG4gKiBSZXR1cm5zIGEgUHJvbWlzZTxib29sZWFuPiBcdTIwMTQgdHJ1ZSBtZWFucyBcInJldHJ5XCIsIGZhbHNlIG1lYW5zIFwiZGlzbWlzc1wiLlxuICogQ2FsbGVkIGZyb20gYXBpLWNsaWVudC5qcyBpbnNpZGUgc2Vzc2lvbkF3YXJlRmV0Y2ggc28gdGhlIGZ1bGwgZmV0Y2ggcGlwZWxpbmVcbiAqIGlzIG93bmVkIGJ5IGEgc2luZ2xlIG1vZHVsZS1sZXZlbCB3aW5kb3cuZmV0Y2ggYXNzaWdubWVudCB0aGVyZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xSZXF1ZXN0fSBpbnB1dCAtIFRoZSByZXF1ZXN0IFVSTC9vYmplY3QgKHVzZWQgZm9yIHBhdGggZmlsdGVyaW5nKS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBpbml0IC0gVGhlIGZldGNoIGluaXQgb3B0aW9ucy5cbiAqIEBwYXJhbSB7UmVzcG9uc2V9IFtyZXNwb25zZV0gLSBUaGUgNDA5IHJlc3BvbnNlICh1c2VkIHRvIGNoZWNrIGNvbmZsaWN0X3R5cGUpLlxuICovXG5hc3luYyBmdW5jdGlvbiBoYW5kbGU0MDlDb25mbGljdChpbnB1dCwgaW5pdCwgcmVzcG9uc2UpIHtcbiAgaWYgKCFfc2hvdWxkSGFuZGxlQnVzeUNvbmZsaWN0KFtpbnB1dCwgaW5pdF0pKSByZXR1cm4gZmFsc2U7XG4gIGlmIChyZXNwb25zZSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBib2R5ID0gYXdhaXQgcmVzcG9uc2UuY2xvbmUoKS5qc29uKCk7XG4gICAgICBpZiAoYm9keSAmJiBib2R5LmNvbmZsaWN0X3R5cGUgJiYgYm9keS5jb25mbGljdF90eXBlICE9PSAnc2Vzc2lvbl9vd25lcnNoaXAnKSByZXR1cm4gZmFsc2U7XG4gICAgfSBjYXRjaCAoXykgeyAvKiBub24tSlNPTiBib2R5IFx1MjAxNCBwcm9jZWVkIHRvIGJhbm5lciAqLyB9XG4gIH1cbiAgc2hvd1Nlc3Npb25Db25mbGljdEJhbm5lcigpO1xuICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBfY29uZmxpY3RSZXRyeVF1ZXVlLnB1c2gocmVzb2x2ZSkpO1xufVxuXG5mdW5jdGlvbiBzaG93U2Vzc2lvbkNvbmZsaWN0QmFubmVyKCkge1xuICBjb25zdCBiYW5uZXIgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXNzaW9uLWNvbmZsaWN0LWJhbm5lcicpO1xuICBjb25zdCBiYW5uZXJUZXh0ICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb25mbGljdC1iYW5uZXItdGV4dCcpO1xuICBjb25zdCBjb3VudGRvd25FbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb25mbGljdC1jb3VudGRvd24nKTtcbiAgaWYgKCFiYW5uZXIpIHJldHVybjtcbiAgYmFubmVyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICBpZiAoX2NvbmZsaWN0VGltZXJJZCkgeyBjbGVhckludGVydmFsKF9jb25mbGljdFRpbWVySWQpOyBfY29uZmxpY3RUaW1lcklkID0gbnVsbDsgfVxuICBfY29uZmxpY3RDb3VudGRvd24gPSAzMDtcbiAgaWYgKGJhbm5lclRleHQpICBiYW5uZXJUZXh0LnRleHRDb250ZW50ICA9ICdcdTI2QTAgQW5vdGhlciBvcGVyYXRpb24gaXMgaW4gcHJvZ3Jlc3MuIEF1dG8tcmV0cnlpbmcgaW4gJztcbiAgaWYgKGNvdW50ZG93bkVsKSBjb3VudGRvd25FbC50ZXh0Q29udGVudCA9IGAke19jb25mbGljdENvdW50ZG93bn1zXHUyMDI2YDtcbiAgX2NvbmZsaWN0VGltZXJJZCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICBfY29uZmxpY3RDb3VudGRvd24tLTtcbiAgICBpZiAoX2NvbmZsaWN0Q291bnRkb3duIDw9IDApIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwoX2NvbmZsaWN0VGltZXJJZCk7IF9jb25mbGljdFRpbWVySWQgPSBudWxsO1xuICAgICAgY29uZmxpY3RSZXRyeU5vdygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY291bnRkb3duRWwpIGNvdW50ZG93bkVsLnRleHRDb250ZW50ID0gYCR7X2NvbmZsaWN0Q291bnRkb3dufXNcdTIwMjZgO1xuICAgIH1cbiAgfSwgMTAwMCk7XG59XG5cbmZ1bmN0aW9uIGNvbmZsaWN0UmV0cnlOb3coKSB7XG4gIGlmIChfY29uZmxpY3RUaW1lcklkKSB7IGNsZWFySW50ZXJ2YWwoX2NvbmZsaWN0VGltZXJJZCk7IF9jb25mbGljdFRpbWVySWQgPSBudWxsOyB9XG4gIGNvbnN0IGJhbm5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXNzaW9uLWNvbmZsaWN0LWJhbm5lcicpO1xuICBpZiAoYmFubmVyKSBiYW5uZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgd2hpbGUgKF9jb25mbGljdFJldHJ5UXVldWUubGVuZ3RoKSBfY29uZmxpY3RSZXRyeVF1ZXVlLnNoaWZ0KCkodHJ1ZSk7XG59XG5cbmZ1bmN0aW9uIGNvbmZsaWN0RGlzbWlzcygpIHtcbiAgaWYgKF9jb25mbGljdFRpbWVySWQpIHsgY2xlYXJJbnRlcnZhbChfY29uZmxpY3RUaW1lcklkKTsgX2NvbmZsaWN0VGltZXJJZCA9IG51bGw7IH1cbiAgY29uc3QgYmFubmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Nlc3Npb24tY29uZmxpY3QtYmFubmVyJyk7XG4gIGlmIChiYW5uZXIpIGJhbm5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICB3aGlsZSAoX2NvbmZsaWN0UmV0cnlRdWV1ZS5sZW5ndGgpIF9jb25mbGljdFJldHJ5UXVldWUuc2hpZnQoKShmYWxzZSk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gTExNIGZldGNoIHdyYXBwZXIgKGF0dGFjaGVzIGFib3J0IHNpZ25hbClcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiBsbG1GZXRjaCh1cmwsIG9wdGlvbnMgPSB7fSkge1xuICBpZiAod2luZG93Ll9jdXJyZW50QWJvcnRDb250cm9sbGVyKSB7XG4gICAgb3B0aW9ucy5zaWduYWwgPSB3aW5kb3cuX2N1cnJlbnRBYm9ydENvbnRyb2xsZXIuc2lnbmFsO1xuICB9XG4gIHJldHVybiBmZXRjaCh1cmwsIG9wdGlvbnMpO1xufVxuXG5mdW5jdGlvbiBhYm9ydEN1cnJlbnRSZXF1ZXN0KCkge1xuICBpZiAod2luZG93Ll9jdXJyZW50QWJvcnRDb250cm9sbGVyKSB7XG4gICAgd2luZG93Ll9jdXJyZW50QWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gICAgd2luZG93Ll9jdXJyZW50QWJvcnRDb250cm9sbGVyID0gbnVsbDtcbiAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICBpZiAodHlwZW9mIGFwcGVuZE1lc3NhZ2UgPT09ICdmdW5jdGlvbicpIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsICdcdTIzRjkgUmVxdWVzdCBzdG9wcGVkLicpO1xuICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gTExNIGJ1c3kgb3ZlcmxheVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmxldCBfbGxtRWxhcHNlZFRpbWVyID0gbnVsbDtcbmxldCBfbGxtU3RhcnRUaW1lICAgID0gbnVsbDtcblxuZnVuY3Rpb24gX3VwZGF0ZUxMTU92ZXJsYXkobG9hZGluZywgbGFiZWwpIHtcbiAgY29uc3Qgb3ZlcmxheSAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtLWJ1c3ktb3ZlcmxheScpO1xuICBjb25zdCBsYWJlbEVsICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG0tYnVzeS1sYWJlbCcpO1xuICBjb25zdCBlbGFwc2VkICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG0tYnVzeS1lbGFwc2VkJyk7XG4gIGlmICghb3ZlcmxheSkgcmV0dXJuO1xuXG4gIGlmIChsb2FkaW5nKSB7XG4gICAgb3ZlcmxheS5jbGFzc0xpc3QuYWRkKCd2aXNpYmxlJyk7XG4gICAgb3ZlcmxheS5jbGFzc0xpc3QucmVtb3ZlKCdzbG93Jyk7XG4gICAgaWYgKGxhYmVsRWwpIGxhYmVsRWwudGV4dENvbnRlbnQgPSBsYWJlbCB8fCAnUmVhc29uaW5nXHUyMDI2JztcbiAgICBpZiAoZWxhcHNlZCkgIGVsYXBzZWQudGV4dENvbnRlbnQgPSAnMDowMCc7XG5cbiAgICBfbGxtU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBjbGVhckludGVydmFsKF9sbG1FbGFwc2VkVGltZXIpO1xuICAgIF9sbG1FbGFwc2VkVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICBjb25zdCBzZWNzID0gTWF0aC5mbG9vcigoRGF0ZS5ub3coKSAtIF9sbG1TdGFydFRpbWUpIC8gMTAwMCk7XG4gICAgICBjb25zdCBtbSA9IFN0cmluZyhNYXRoLmZsb29yKHNlY3MgLyA2MCkpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgICBjb25zdCBzcyA9IFN0cmluZyhzZWNzICUgNjApLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgICBpZiAoZWxhcHNlZCkgZWxhcHNlZC50ZXh0Q29udGVudCA9IGAke21tfToke3NzfWA7XG4gICAgICBpZiAoc2VjcyA+PSAzMCAmJiAhb3ZlcmxheS5jbGFzc0xpc3QuY29udGFpbnMoJ3Nsb3cnKSkge1xuICAgICAgICBvdmVybGF5LmNsYXNzTGlzdC5hZGQoJ3Nsb3cnKTtcbiAgICAgIH1cbiAgICB9LCAxMDAwKTtcbiAgfSBlbHNlIHtcbiAgICBjbGVhckludGVydmFsKF9sbG1FbGFwc2VkVGltZXIpO1xuICAgIF9sbG1FbGFwc2VkVGltZXIgPSBudWxsO1xuICAgIF9sbG1TdGFydFRpbWUgICAgPSBudWxsO1xuICAgIG92ZXJsYXkuY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZScsICdzbG93Jyk7XG4gICAgaWYgKGxhYmVsRWwpIGxhYmVsRWwudGV4dENvbnRlbnQgPSAnUmVhc29uaW5nXHUyMDI2JztcbiAgICBpZiAoZWxhcHNlZCkgIGVsYXBzZWQudGV4dENvbnRlbnQgPSAnMDowMCc7XG4gICAgX3JlZnJlc2hDb250ZXh0U3RhdHMoKTtcbiAgfVxufVxuXG4vLyBCYWNrd2FyZCBjb21wYXRpYmlsaXR5IGZvciB0ZXN0cy9pbXBvcnRzIHRoYXQgc3RpbGwgcmVmZXJlbmNlIHRoZSBvbGQgbmFtZS5cbmZ1bmN0aW9uIF91cGRhdGVMTE1TdGF0dXNCYXIobG9hZGluZywgbGFiZWwpIHtcbiAgX3VwZGF0ZUxMTU92ZXJsYXkobG9hZGluZywgbGFiZWwpO1xuXG4gIGNvbnN0IGJhciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG0tc3RhdHVzLWJhcicpO1xuICBjb25zdCB0aGlua2luZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG0tdGhpbmtpbmcnKTtcbiAgY29uc3Qgc3RlcExhYmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbS1zdGVwLWxhYmVsJyk7XG4gIGNvbnN0IGFib3J0QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbS1hYm9ydC1idG4nKTtcbiAgaWYgKCFiYXIpIHJldHVybjtcblxuICBpZiAobG9hZGluZykge1xuICAgIGJhci5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICAgIGlmICh0aGlua2luZykgdGhpbmtpbmcuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICBpZiAoc3RlcExhYmVsKSBzdGVwTGFiZWwudGV4dENvbnRlbnQgPSBsYWJlbCB8fCAnUmVhc29uaW5nXHUyMDI2JztcbiAgICBpZiAoYWJvcnRCdG4pIHtcbiAgICAgIGFib3J0QnRuLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIGFib3J0QnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmICh0aGlua2luZykgdGhpbmtpbmcuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBpZiAoYWJvcnRCdG4pIGFib3J0QnRuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgYmFyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gX3JlZnJlc2hDb250ZXh0U3RhdHMoKSB7XG4gIGNvbnN0IHRva2VuRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtLXRva2VuLWNvdW50Jyk7XG4gIGlmICghdG9rZW5FbCkgcmV0dXJuO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9jb250ZXh0LXN0YXRzJyk7XG4gICAgaWYgKCFyZXMub2spIHJldHVybjtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoIWRhdGEub2spIHJldHVybjtcbiAgICBjb25zdCBlc3QgICAgPSBkYXRhLmVzdGltYXRlZF90b2tlbnMgfHwgMDtcbiAgICBjb25zdCB3aW4gICAgPSBkYXRhLmNvbnRleHRfd2luZG93ICAgfHwgMTI4XzAwMDtcbiAgICBjb25zdCBleGFjdCAgPSBkYXRhLnRva2VuX3NvdXJjZSA9PT0gJ2V4YWN0JztcbiAgICBjb25zdCBwY3QgICAgPSBNYXRoLnJvdW5kKChlc3QgLyB3aW4pICogMTAwKTtcbiAgICBjb25zdCBlc3RTdHIgPSBlc3QgPj0gMTAwMCA/IGAkeyhlc3QgLyAxMDAwKS50b0ZpeGVkKDEpfUtgIDogYCR7ZXN0fWA7XG4gICAgY29uc3Qgd2luU3RyID0gd2luID49IDEwMDAgPyBgJHtNYXRoLnJvdW5kKHdpbiAvIDEwMDApfUtgICA6IGAke3dpbn1gO1xuICAgIHRva2VuRWwudGV4dENvbnRlbnQgPSBgJHtleGFjdCA/ICcnIDogJ34nfSR7ZXN0U3RyfSAvICR7d2luU3RyfSAoJHtwY3R9JSlgO1xuICB9IGNhdGNoIChfKSB7IC8qIHNpbGVudGx5IGlnbm9yZSAqLyB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gTG9hZGluZyBzdGF0ZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIHNldExvYWRpbmcobG9hZGluZywgbGFiZWwpIHtcbiAgaWYgKHR5cGVvZiBzdGF0ZU1hbmFnZXIgIT09ICd1bmRlZmluZWQnICYmIHN0YXRlTWFuYWdlcj8uc2V0TG9hZGluZykge1xuICAgIHN0YXRlTWFuYWdlci5zZXRMb2FkaW5nKGxvYWRpbmcpO1xuICB9XG5cbiAgaWYgKGxvYWRpbmcpIHtcbiAgICB3aW5kb3cuX2N1cnJlbnRBYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgLy8gRXhwYW5kIGNoYXQgcGFuZWwgaWYgY29sbGFwc2VkXG4gICAgY29uc3QgY2hhdEFyZWEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2hhdC1hcmVhJyk7XG4gICAgY29uc3Qgdmlld2VyQXJlYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2aWV3ZXItYXJlYScpO1xuICAgIGNvbnN0IHRvZ2dsZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2dnbGUtY2hhdCcpO1xuICAgIGlmIChjaGF0QXJlYT8uY2xhc3NMaXN0LmNvbnRhaW5zKCdjb2xsYXBzZWQnKSkge1xuICAgICAgY2hhdEFyZWEuY2xhc3NMaXN0LnJlbW92ZSgnY29sbGFwc2VkJyk7XG4gICAgICB2aWV3ZXJBcmVhPy5jbGFzc0xpc3QucmVtb3ZlKCdleHBhbmRlZCcpO1xuICAgICAgaWYgKHRvZ2dsZUJ0bikgdG9nZ2xlQnRuLnRleHRDb250ZW50ID0gJ1x1MjVDMCc7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHdpbmRvdy5fY3VycmVudEFib3J0Q29udHJvbGxlciA9IG51bGw7XG4gIH1cblxuICBfdXBkYXRlTExNU3RhdHVzQmFyKGxvYWRpbmcsIGxhYmVsKTtcblxuICAvLyBPbmx5IGRpc2FibGUgYnV0dG9ucyBpbnNpZGUgdGhlIGNoYXQvaW50ZXJhY3Rpb24gYXJlYSBcdTIwMTQgbm90IHRoZSB3aG9sZSBwYWdlLlxuICBjb25zdCBjaGF0QXJlYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaGF0LWFyZWEnKTtcbiAgY29uc3Qgc2NvcGUgPSBjaGF0QXJlYSB8fCBkb2N1bWVudDtcbiAgc2NvcGUucXVlcnlTZWxlY3RvckFsbCgnYnV0dG9uJykuZm9yRWFjaChidG4gPT4geyBidG4uZGlzYWJsZWQgPSBsb2FkaW5nOyB9KTtcbiAgY29uc3Qgc3RvcEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG0tYnVzeS1zdG9wJyk7XG4gIGlmIChzdG9wQnRuKSBzdG9wQnRuLmRpc2FibGVkID0gZmFsc2U7XG5cbiAgbGV0IGJhciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2FkaW5nLXByb2dyZXNzLWJhcicpO1xuICBpZiAobG9hZGluZykge1xuICAgIGlmICghYmFyKSB7XG4gICAgICBiYXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGJhci5pZCA9ICdsb2FkaW5nLXByb2dyZXNzLWJhcic7XG4gICAgICBkb2N1bWVudC5ib2R5LnByZXBlbmQoYmFyKTtcbiAgICB9XG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHsgYmFyLnN0eWxlLndpZHRoID0gJzcwJSc7IH0pO1xuICAgIGlmIChsYWJlbCkgYmFyLnRpdGxlID0gbGFiZWw7XG4gIH0gZWxzZSB7XG4gICAgaWYgKGJhcikge1xuICAgICAgYmFyLnN0eWxlLndpZHRoID0gJzEwMCUnO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiBiYXIucmVtb3ZlKCksIDQwMCk7XG4gICAgfVxuICB9XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnN0ZXAuYWN0aXZlJykuZm9yRWFjaChlbCA9PiB7XG4gICAgZWwuY2xhc3NMaXN0LnRvZ2dsZSgnbG9hZGluZy1zdGVwJywgbG9hZGluZyk7XG4gIH0pO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgRVMgbW9kdWxlIGV4cG9ydHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5leHBvcnQge1xuICBoYW5kbGU0MDlDb25mbGljdCxcbiAgc2hvd1Nlc3Npb25Db25mbGljdEJhbm5lciwgY29uZmxpY3RSZXRyeU5vdywgY29uZmxpY3REaXNtaXNzLFxuICBsbG1GZXRjaCwgYWJvcnRDdXJyZW50UmVxdWVzdCxcbiAgX3VwZGF0ZUxMTVN0YXR1c0JhcixcbiAgX3VwZGF0ZUxMTU92ZXJsYXksIF9yZWZyZXNoQ29udGV4dFN0YXRzLFxuICBzZXRMb2FkaW5nLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogc3RhdGUtbWFuYWdlci5qc1xuICogTWFuYWdlcyBzZXNzaW9uIHN0YXRlLCBsb2NhbFN0b3JhZ2UgcGVyc2lzdGVuY2UsIGFuZCBzdGF0ZSBpbml0aWFsaXphdGlvbi5cbiAqIENlbnRyYWxpemVzIGFsbCBzdGF0ZSBtYW5hZ2VtZW50IGxvZ2ljIChjdXJyZW50VGFiLCBpbnRlcmFjdGl2ZVN0YXRlLCBzZXNzaW9uSWQsIGV0Yy4pXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdzdGF0ZS1tYW5hZ2VyJyk7XG5cbmltcG9ydCB7IFN0b3JhZ2VLZXlzIH0gZnJvbSAnLi9hcGktY2xpZW50LmpzJztcblxuLyoqXG4gKiBNaXJyb3Igb2YgdGhlIFB5dGhvbiBQaGFzZSBlbnVtIGluIHNjcmlwdHMvdXRpbHMvY29udmVyc2F0aW9uX21hbmFnZXIucHkuXG4gKiBQeXRob24gaXMgdGhlIFNPVVJDRSBPRiBUUlVUSCBcdTIwMTQgdXBkYXRlIGJvdGggZmlsZXMgdG9nZXRoZXIgd2hlbmV2ZXIgYWRkaW5nXG4gKiBvciByZW5hbWluZyBhIHBoYXNlLlxuICovXG5jb25zdCBQSEFTRVMgPSB7XG4gIElOSVQ6ICAgICAgICAgICAgICdpbml0JyxcbiAgSk9CX0FOQUxZU0lTOiAgICAgJ2pvYl9hbmFseXNpcycsXG4gIENVU1RPTUlaQVRJT046ICAgICdjdXN0b21pemF0aW9uJyxcbiAgUkVXUklURV9SRVZJRVc6ICAgJ3Jld3JpdGVfcmV2aWV3JyxcbiAgU1BFTExfQ0hFQ0s6ICAgICAgJ3NwZWxsX2NoZWNrJyxcbiAgR0VORVJBVElPTjogICAgICAgJ2dlbmVyYXRpb24nLFxuICBMQVlPVVRfUkVWSUVXOiAgICAnbGF5b3V0X3JldmlldycsXG4gIEZJTkFMX0dFTkVSQVRJT046ICdmaW5hbF9nZW5lcmF0aW9uJyxcbiAgUkVGSU5FTUVOVDogICAgICAgJ3JlZmluZW1lbnQnLFxufTtcblxuY29uc3QgUEhBU0VfVE9fU1RFUCA9IHtcbiAgW1BIQVNFUy5JTklUXTogICAgICAgICAgICAgJ2pvYicsXG4gIFtQSEFTRVMuSk9CX0FOQUxZU0lTXTogICAgICdhbmFseXNpcycsXG4gIFtQSEFTRVMuQ1VTVE9NSVpBVElPTl06ICAgICdjdXN0b21pemF0aW9ucycsXG4gIFtQSEFTRVMuUkVXUklURV9SRVZJRVddOiAgICdyZXdyaXRlJyxcbiAgW1BIQVNFUy5TUEVMTF9DSEVDS106ICAgICAgJ3NwZWxsJyxcbiAgW1BIQVNFUy5HRU5FUkFUSU9OXTogICAgICAgJ2xheW91dCcsXG4gIFtQSEFTRVMuTEFZT1VUX1JFVklFV106ICAgICdsYXlvdXQnLFxuICBbUEhBU0VTLkZJTkFMX0dFTkVSQVRJT05dOiAnZG93bmxvYWQnLFxuICBbUEhBU0VTLlJFRklORU1FTlRdOiAgICAgICAnZG93bmxvYWQnLFxufTtcblxuZnVuY3Rpb24gZ2V0V29ya2Zsb3dTdGVwRm9yUGhhc2UocGhhc2UpIHtcbiAgcmV0dXJuIFBIQVNFX1RPX1NURVBbcGhhc2VdIHx8ICdqb2InO1xufVxuXG4vKipcbiAqIFN0YWdlZCBnZW5lcmF0aW9uIHdvcmtmbG93IHBoYXNlcyAoR0FQLTIwIGltcGxlbWVudGF0aW9uKS5cbiAqIFRoZXNlIHRyYWNrIHRoZSBwcmV2aWV3L2xheW91dCByZXZpZXcgXHUyMTkyIGNvbmZpcm1lZCBcdTIxOTIgZmluYWwgcGlwZWxpbmVcbiAqIGluZGVwZW5kZW50bHkgb2YgdGhlIG1haW4gY29udmVyc2F0aW9uIFBIQVNFUyBhYm92ZS5cbiAqIEJhY2tlbmQgc291cmNlIG9mIHRydXRoIGlzIHNlc3Npb25fZGF0YVsnZ2VuZXJhdGlvbl9zdGF0ZSddWydwaGFzZSddLlxuICovXG5jb25zdCBHRU5FUkFUSU9OX1BIQVNFUyA9IHtcbiAgSURMRTogICAgICAgICAgICdpZGxlJyxcbiAgTEFZT1VUX1JFVklFVzogICdsYXlvdXRfcmV2aWV3JyxcbiAgQ09ORklSTUVEOiAgICAgICdjb25maXJtZWQnLFxuICBGSU5BTF9DT01QTEVURTogJ2ZpbmFsX2NvbXBsZXRlJyxcbn07XG5cbmNvbnN0IEdFTkVSQVRJT05fU1RBVEVfRVZFTlQgPSAnY3ZidWlsZGVyOmdlbmVyYXRpb24tc3RhdGUtY2hhbmdlZCc7XG5cbmZ1bmN0aW9uIGNyZWF0ZURlZmF1bHRHZW5lcmF0aW9uU3RhdGUoKSB7XG4gIHJldHVybiB7XG4gICAgcGhhc2U6IEdFTkVSQVRJT05fUEhBU0VTLklETEUsXG4gICAgcHJldmlld0F2YWlsYWJsZTogZmFsc2UsXG4gICAgcHJldmlld091dHB1dHM6IG51bGwsXG4gICAgbGF5b3V0Q29uZmlybWVkOiBmYWxzZSxcbiAgICBwYWdlQ291bnRFc3RpbWF0ZTogbnVsbCxcbiAgICBwYWdlQ291bnRFeGFjdDogbnVsbCxcbiAgICBwYWdlQ291bnRDb25maWRlbmNlOiBudWxsLFxuICAgIHBhZ2VDb3VudFNvdXJjZTogbnVsbCxcbiAgICBwYWdlTmVlZHNFeGFjdFJlY2hlY2s6IGZhbHNlLFxuICAgIHBhZ2VXYXJuaW5nOiBmYWxzZSxcbiAgICBsYXlvdXRJbnN0cnVjdGlvbnNDb3VudDogMCxcbiAgICBmaW5hbEdlbmVyYXRlZEF0OiBudWxsLFxuICAgIHByZXZpZXdHZW5lcmF0ZWRBdDogbnVsbCxcbiAgICBwcmV2aWV3UmVxdWVzdElkOiBudWxsLFxuICAgIGNvbmZpcm1lZEF0OiBudWxsLFxuICAgIGNvbnRlbnRSZXZpc2lvbjogMCxcbiAgICBsYXN0UHJldmlld0NvbnRlbnRSZXZpc2lvbjogbnVsbCxcbiAgICBsYXN0RmluYWxDb250ZW50UmV2aXNpb246IG51bGwsXG4gICAgZGlydHlQaGFzZXM6IFtdLFxuICAgIGVhcmxpZXN0RGlydHlTdGVwOiBudWxsLFxuICB9O1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVSZXZpc2lvbih2YWx1ZSkge1xuICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHZhbHVlKSA/IHZhbHVlIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0TGFzdFJlbmRlcmVkQ29udGVudFJldmlzaW9uKHN0YXRlKSB7XG4gIGNvbnN0IHJldmlzaW9ucyA9IFtcbiAgICBub3JtYWxpemVSZXZpc2lvbihzdGF0ZS5sYXN0UHJldmlld0NvbnRlbnRSZXZpc2lvbiksXG4gICAgbm9ybWFsaXplUmV2aXNpb24oc3RhdGUubGFzdEZpbmFsQ29udGVudFJldmlzaW9uKSxcbiAgXS5maWx0ZXIodmFsdWUgPT4gdmFsdWUgIT09IG51bGwpO1xuICByZXR1cm4gcmV2aXNpb25zLmxlbmd0aCA+IDAgPyBNYXRoLm1heCguLi5yZXZpc2lvbnMpIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVTZXNzaW9uSWQoKSB7XG4gIGNvbnN0IGNyeXB0b0FwaSA9IGdsb2JhbFRoaXMuY3J5cHRvO1xuICBpZiAoY3J5cHRvQXBpPy5yYW5kb21VVUlEKSB7XG4gICAgcmV0dXJuIGBzZXNzaW9uLSR7Y3J5cHRvQXBpLnJhbmRvbVVVSUQoKX1gO1xuICB9XG5cbiAgaWYgKGNyeXB0b0FwaT8uZ2V0UmFuZG9tVmFsdWVzKSB7XG4gICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheSgxNik7XG4gICAgY3J5cHRvQXBpLmdldFJhbmRvbVZhbHVlcyhieXRlcyk7XG4gICAgY29uc3QgdG9rZW4gPSBBcnJheS5mcm9tKGJ5dGVzLCBieXRlID0+IGJ5dGUudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJykpLmpvaW4oJycpO1xuICAgIHJldHVybiBgc2Vzc2lvbi0ke3Rva2VufWA7XG4gIH1cblxuICBsb2cud2FybignV2ViIENyeXB0byBBUEkgdW5hdmFpbGFibGU7IGZhbGxpbmcgYmFjayB0byB0aW1lc3RhbXAtcGx1cy1yYW5kb20gc2Vzc2lvbiBpZCBnZW5lcmF0aW9uLicpO1xuICByZXR1cm4gYHNlc3Npb24tJHtEYXRlLm5vdygpLnRvU3RyaW5nKDM2KX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCAxMSl9YDtcbn1cblxuZnVuY3Rpb24gZ2V0TGF5b3V0RnJlc2huZXNzRnJvbVN0YXRlKHN0YXRlKSB7XG4gIGNvbnN0IHByZXZpZXdBdmFpbGFibGUgPSBCb29sZWFuKHN0YXRlLnByZXZpZXdBdmFpbGFibGUpO1xuICBjb25zdCBoYXNGaW5hbE91dHB1dHMgPSBCb29sZWFuKFxuICAgIHN0YXRlLmZpbmFsR2VuZXJhdGVkQXRcbiAgICAgIHx8IHN0YXRlLnBoYXNlID09PSBHRU5FUkFUSU9OX1BIQVNFUy5GSU5BTF9DT01QTEVURVxuICAgICAgfHwgbm9ybWFsaXplUmV2aXNpb24oc3RhdGUubGFzdEZpbmFsQ29udGVudFJldmlzaW9uKSAhPT0gbnVsbFxuICApO1xuXG4gIGlmICghcHJldmlld0F2YWlsYWJsZSkge1xuICAgIHJldHVybiB7XG4gICAgICBzaG93Q2hpcDogZmFsc2UsXG4gICAgICBpc1N0YWxlOiBmYWxzZSxcbiAgICAgIGlzQ3JpdGljYWw6IGZhbHNlLFxuICAgICAgaGFzRmluYWxPdXRwdXRzLFxuICAgICAgbGFiZWw6ICcnLFxuICAgICAgYXJpYUxhYmVsOiAnJyxcbiAgICAgIHRvbmU6ICdoaWRkZW4nLFxuICAgIH07XG4gIH1cblxuICBjb25zdCBjb250ZW50UmV2aXNpb24gPSBub3JtYWxpemVSZXZpc2lvbihzdGF0ZS5jb250ZW50UmV2aXNpb24pID8/IDA7XG4gIGNvbnN0IGxhc3RSZW5kZXJlZFJldmlzaW9uID0gZ2V0TGFzdFJlbmRlcmVkQ29udGVudFJldmlzaW9uKHN0YXRlKTtcbiAgY29uc3QgaXNTdGFsZSA9IGxhc3RSZW5kZXJlZFJldmlzaW9uICE9PSBudWxsICYmIGNvbnRlbnRSZXZpc2lvbiA+IGxhc3RSZW5kZXJlZFJldmlzaW9uO1xuICBjb25zdCBpc0NyaXRpY2FsID0gaXNTdGFsZSAmJiBoYXNGaW5hbE91dHB1dHM7XG5cbiAgaWYgKGlzQ3JpdGljYWwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2hvd0NoaXA6IHRydWUsXG4gICAgICBpc1N0YWxlLFxuICAgICAgaXNDcml0aWNhbCxcbiAgICAgIGhhc0ZpbmFsT3V0cHV0cyxcbiAgICAgIGxhYmVsOiAnRmlsZXMgb3V0ZGF0ZWQnLFxuICAgICAgYXJpYUxhYmVsOiAnRmlsZXMgb3V0ZGF0ZWQuIEFjdGl2YXRlIHRvIHJldmlldyBsYXlvdXQgYW5kIHJlZ2VuZXJhdGUgb3V0cHV0cy4nLFxuICAgICAgdG9uZTogJ2NyaXRpY2FsJyxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGlzU3RhbGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2hvd0NoaXA6IHRydWUsXG4gICAgICBpc1N0YWxlLFxuICAgICAgaXNDcml0aWNhbCxcbiAgICAgIGhhc0ZpbmFsT3V0cHV0cyxcbiAgICAgIGxhYmVsOiAnTGF5b3V0IG91dGRhdGVkJyxcbiAgICAgIGFyaWFMYWJlbDogJ0xheW91dCBvdXRkYXRlZC4gQWN0aXZhdGUgdG8gcmV2aWV3IGFuZCByZWdlbmVyYXRlIHByZXZpZXcuJyxcbiAgICAgIHRvbmU6ICdzdGFsZScsXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc2hvd0NoaXA6IHRydWUsXG4gICAgaXNTdGFsZSxcbiAgICBpc0NyaXRpY2FsLFxuICAgIGhhc0ZpbmFsT3V0cHV0cyxcbiAgICBsYWJlbDogJ0xheW91dCBjdXJyZW50JyxcbiAgICBhcmlhTGFiZWw6ICdMYXlvdXQgY3VycmVudC4gUHJldmlldyBtYXRjaGVzIGxhdGVzdCBjb250ZW50LicsXG4gICAgdG9uZTogJ2ZyZXNoJyxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZW1pdEdlbmVyYXRpb25TdGF0ZUNoYW5nZWQoKSB7XG4gIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2Ygd2luZG93LmRpc3BhdGNoRXZlbnQgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KEdFTkVSQVRJT05fU1RBVEVfRVZFTlQsIHtcbiAgICBkZXRhaWw6IHtcbiAgICAgIGdlbmVyYXRpb25TdGF0ZTogeyAuLi5nZW5lcmF0aW9uU3RhdGUgfSxcbiAgICAgIGxheW91dEZyZXNobmVzczogZ2V0TGF5b3V0RnJlc2huZXNzRnJvbVN0YXRlKGdlbmVyYXRpb25TdGF0ZSksXG4gICAgfSxcbiAgfSkpO1xufVxuXG4vLyBHbG9iYWwgc3RhdGUgdmFyaWFibGVzIChtb3ZlZCBpbnRvIG1vZHVsZSBmb3IgY2xhcml0eSlcbmxldCBjdXJyZW50VGFiID0gJ2pvYic7XG5sZXQgaXNMb2FkaW5nID0gZmFsc2U7XG5sZXQgdGFiRGF0YSA9IHtcbiAgYW5hbHlzaXM6IG51bGwsXG4gIGN1c3RvbWl6YXRpb25zOiBudWxsLFxuICBjdjogbnVsbFxufTtcbmxldCBpbnRlcmFjdGl2ZVN0YXRlID0ge1xuICBpc1Jldmlld2luZzogZmFsc2UsXG4gIGN1cnJlbnRJbmRleDogMCxcbiAgdHlwZTogbnVsbCwgLy8gJ2V4cGVyaWVuY2VzJyBvciAnc2tpbGxzJ1xuICBkYXRhOiBudWxsXG59O1xubGV0IHNlc3Npb25JZCA9IG51bGw7XG5sZXQgbGFzdEtub3duUGhhc2UgPSBQSEFTRVMuSU5JVDtcbmxldCBpc1JlY29ubmVjdGluZyA9IGZhbHNlO1xuY29uc3QgX3BoYXNlQ2hhbmdlTGlzdGVuZXJzID0gW107XG4vLyBDdXJyZW50IG1vZGVsL3Byb3ZpZGVyIHNlbGVjdGlvbiAocGVyc2lzdGVkIHRvIGxvY2FsU3RvcmFnZSlcbmxldCBjdXJyZW50TW9kZWxQcm92aWRlciA9IG51bGw7XG5sZXQgY3VycmVudE1vZGVsTmFtZSA9IG51bGw7XG5cblxuLy8gU3RhZ2VkIGdlbmVyYXRpb24gc3RhdGUgKEdBUC0yMCk6IHRyYWNrcyBwcmV2aWV3IFx1MjE5MiBjb25maXJtIFx1MjE5MiBmaW5hbCBwaXBlbGluZS5cbi8vIFN5bmNlZCBmcm9tIC9hcGkvY3YvZ2VuZXJhdGlvbi1zdGF0ZSBvbiBwYWdlIGxvYWQgYW5kIGFmdGVyIGtleSB0cmFuc2l0aW9ucy5cbmxldCBnZW5lcmF0aW9uU3RhdGUgPSBjcmVhdGVEZWZhdWx0R2VuZXJhdGlvblN0YXRlKCk7XG5cbi8vIEFUUyBzY29yZSBzdGF0ZSAoR0FQLTIxKTogY2FjaGVkIHNjb3JlIGZyb20gL2FwaS9jdi9hdHMtc2NvcmUuXG4vLyBOdWxsIHVudGlsIGZpcnN0IHNjb3JlIGlzIGZldGNoZWQuXG5sZXQgYXRzU2NvcmUgPSBudWxsO1xuXG4vLyBFeHBvcnQgc3RhdGUgZ2V0dGVycy9zZXR0ZXJzXG5jb25zdCBzdGF0ZU1hbmFnZXIgPSB7XG4gIC8vIFRhYiBzdGF0ZVxuICBnZXRDdXJyZW50VGFiOiAoKSA9PiBjdXJyZW50VGFiLFxuICBzZXRDdXJyZW50VGFiOiAodGFiKSA9PiB7IGN1cnJlbnRUYWIgPSB0YWI7IHNhdmVTdGF0ZVRvTG9jYWxTdG9yYWdlKCk7IH0sXG4gIGdldEN1cnJlbnRTdGFnZTogKCkgPT4gZ2V0V29ya2Zsb3dTdGVwRm9yUGhhc2UobGFzdEtub3duUGhhc2UpLFxuXG4gIC8vIExvYWRpbmcgc3RhdGVcbiAgaXNMb2FkaW5nOiAoKSA9PiBpc0xvYWRpbmcsXG4gIHNldExvYWRpbmc6IChsb2FkaW5nKSA9PiB7XG4gICAgaXNMb2FkaW5nID0gbG9hZGluZztcbiAgfSxcblxuICAvLyBUYWIgZGF0YSAoYW5hbHlzaXMsIGN1c3RvbWl6YXRpb25zLCBDVilcbiAgZ2V0VGFiRGF0YTogKHRhYikgPT4gdGFiRGF0YVt0YWJdLFxuICBnZXRBbGxUYWJEYXRhOiAoKSA9PiAoeyAuLi50YWJEYXRhIH0pLFxuICBzZXRUYWJEYXRhOiAodGFiLCBkYXRhKSA9PiB7IHRhYkRhdGFbdGFiXSA9IGRhdGE7IHNhdmVTdGF0ZVRvTG9jYWxTdG9yYWdlKCk7IH0sXG5cbiAgLy8gSW50ZXJhY3RpdmUgc3RhdGUgKGZvciBleHBlcmllbmNlL3NraWxsIHNlbGVjdGlvbiByZXZpZXcpXG4gIGdldEludGVyYWN0aXZlU3RhdGU6ICgpID0+IGludGVyYWN0aXZlU3RhdGUsXG4gIHNldEludGVyYWN0aXZlU3RhdGU6IChzdGF0ZSkgPT4geyBpbnRlcmFjdGl2ZVN0YXRlID0geyAuLi5pbnRlcmFjdGl2ZVN0YXRlLCAuLi5zdGF0ZSB9OyBzYXZlU3RhdGVUb0xvY2FsU3RvcmFnZSgpOyB9LFxuXG4gIC8vIFJlY29ubmVjdCBzdGF0ZVxuICBpc1JlY29ubmVjdGluZzogKCkgPT4gaXNSZWNvbm5lY3RpbmcsXG4gIHNldElzUmVjb25uZWN0aW5nOiAocmVjb25uZWN0aW5nKSA9PiB7IGlzUmVjb25uZWN0aW5nID0gQm9vbGVhbihyZWNvbm5lY3RpbmcpOyB9LFxuXG4gIC8vIFNlc3Npb24gbWFuYWdlbWVudFxuICBnZXRTZXNzaW9uSWQ6ICgpID0+IHNlc3Npb25JZCxcbiAgc2V0U2Vzc2lvbklkOiAoaWQpID0+IHsgc2Vzc2lvbklkID0gaWQ7IGxvY2FsU3RvcmFnZS5zZXRJdGVtKFN0b3JhZ2VLZXlzLlNFU1NJT05fSUQsIGlkKTsgfSxcblxuICAvLyBNb2RlbC9wcm92aWRlciBzZWxlY3Rpb25cbiAgZ2V0Q3VycmVudE1vZGVsUHJvdmlkZXI6ICgpID0+IGN1cnJlbnRNb2RlbFByb3ZpZGVyLFxuICBnZXRDdXJyZW50TW9kZWxOYW1lOiAoKSA9PiBjdXJyZW50TW9kZWxOYW1lLFxuICBzZXRDdXJyZW50TW9kZWw6IChwcm92aWRlciwgbW9kZWwpID0+IHsgY3VycmVudE1vZGVsUHJvdmlkZXIgPSBwcm92aWRlciB8fCBudWxsOyBjdXJyZW50TW9kZWxOYW1lID0gbW9kZWwgfHwgbnVsbDsgc2F2ZVN0YXRlVG9Mb2NhbFN0b3JhZ2UoKTsgfSxcblxuICAvLyBQaGFzZSB0cmFja2luZ1xuICBnZXRQaGFzZTogKCkgPT4gbGFzdEtub3duUGhhc2UsXG4gIHNldFBoYXNlOiAocGhhc2UpID0+IHtcbiAgICBsYXN0S25vd25QaGFzZSA9IHBoYXNlO1xuICAgIHNhdmVTdGF0ZVRvTG9jYWxTdG9yYWdlKCk7XG4gICAgX3BoYXNlQ2hhbmdlTGlzdGVuZXJzLmZvckVhY2goZm4gPT4geyB0cnkgeyBmbihwaGFzZSk7IH0gY2F0Y2ggKGUpIHsgLyogaWdub3JlICovIH0gfSk7XG4gIH0sXG4gIG9uUGhhc2VDaGFuZ2U6IChmbikgPT4geyBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSBfcGhhc2VDaGFuZ2VMaXN0ZW5lcnMucHVzaChmbik7IH0sXG4gIGdldFdvcmtmbG93U3RlcDogKCkgPT4gZ2V0V29ya2Zsb3dTdGVwRm9yUGhhc2UobGFzdEtub3duUGhhc2UpLFxuXG4gIC8vIFBvc3QtYW5hbHlzaXMgcXVlc3Rpb25zXG4gIGdldFBvc3RBbmFseXNpc1F1ZXN0aW9uczogKCkgPT4gd2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucyB8fCBbXSxcbiAgc2V0UG9zdEFuYWx5c2lzUXVlc3Rpb25zOiAocXVlc3Rpb25zKSA9PiB7IHdpbmRvdy5wb3N0QW5hbHlzaXNRdWVzdGlvbnMgPSBxdWVzdGlvbnM7IH0sXG5cbiAgLy8gUXVlc3Rpb24gYW5zd2Vyc1xuICBnZXRRdWVzdGlvbkFuc3dlcnM6ICgpID0+IHdpbmRvdy5xdWVzdGlvbkFuc3dlcnMgfHwge30sXG4gIHNldFF1ZXN0aW9uQW5zd2VyczogKGFuc3dlcnMpID0+IHsgd2luZG93LnF1ZXN0aW9uQW5zd2VycyA9IGFuc3dlcnM7IH0sXG5cbiAgLy8gUGVuZGluZyByZWNvbW1lbmRhdGlvbnNcbiAgZ2V0UGVuZGluZ1JlY29tbWVuZGF0aW9uczogKCkgPT4gd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnMgfHwgbnVsbCxcbiAgc2V0UGVuZGluZ1JlY29tbWVuZGF0aW9uczogKHJlYykgPT4geyB3aW5kb3cucGVuZGluZ1JlY29tbWVuZGF0aW9ucyA9IHJlYzsgc2F2ZVN0YXRlVG9Mb2NhbFN0b3JhZ2UoKTsgfSxcblxuICAvLyBBVFMgc2NvcmUgc3RhdGUgKEdBUC0yMSlcbiAgZ2V0QXRzU2NvcmU6ICgpID0+IGF0c1Njb3JlLFxuICBzZXRBdHNTY29yZTogKHNjb3JlKSA9PiB7IGF0c1Njb3JlID0gc2NvcmU7IHNhdmVTdGF0ZVRvTG9jYWxTdG9yYWdlKCk7IH0sXG4gIGNsZWFyQXRzU2NvcmU6ICgpID0+IHsgYXRzU2NvcmUgPSBudWxsOyBzYXZlU3RhdGVUb0xvY2FsU3RvcmFnZSgpOyB9LFxuXG4gIC8vIFN0YWdlZCBnZW5lcmF0aW9uIHN0YXRlIChHQVAtMjApXG4gIGdldEdlbmVyYXRpb25TdGF0ZTogKCkgPT4gZ2VuZXJhdGlvblN0YXRlLFxuICBnZXRMYXlvdXRGcmVzaG5lc3M6ICgpID0+IGdldExheW91dEZyZXNobmVzc0Zyb21TdGF0ZShnZW5lcmF0aW9uU3RhdGUpLFxuICBzZXRHZW5lcmF0aW9uU3RhdGU6ICh1cGRhdGUpID0+IHtcbiAgICBnZW5lcmF0aW9uU3RhdGUgPSB7IC4uLmdlbmVyYXRpb25TdGF0ZSwgLi4udXBkYXRlIH07XG4gICAgc2F2ZVN0YXRlVG9Mb2NhbFN0b3JhZ2UoKTtcbiAgICBlbWl0R2VuZXJhdGlvblN0YXRlQ2hhbmdlZCgpO1xuICB9LFxuICBtYXJrQ29udGVudENoYW5nZWQ6ICgpID0+IHtcbiAgICBnZW5lcmF0aW9uU3RhdGUgPSB7XG4gICAgICAuLi5nZW5lcmF0aW9uU3RhdGUsXG4gICAgICBjb250ZW50UmV2aXNpb246IChub3JtYWxpemVSZXZpc2lvbihnZW5lcmF0aW9uU3RhdGUuY29udGVudFJldmlzaW9uKSA/PyAwKSArIDEsXG4gICAgfTtcbiAgICBzYXZlU3RhdGVUb0xvY2FsU3RvcmFnZSgpO1xuICAgIGVtaXRHZW5lcmF0aW9uU3RhdGVDaGFuZ2VkKCk7XG4gIH0sXG4gIG1hcmtQcmV2aWV3R2VuZXJhdGVkOiAodXBkYXRlID0ge30pID0+IHtcbiAgICBjb25zdCBjb250ZW50UmV2aXNpb24gPSBub3JtYWxpemVSZXZpc2lvbihnZW5lcmF0aW9uU3RhdGUuY29udGVudFJldmlzaW9uKSA/PyAwO1xuICAgIGdlbmVyYXRpb25TdGF0ZSA9IHtcbiAgICAgIC4uLmdlbmVyYXRpb25TdGF0ZSxcbiAgICAgIC4uLnVwZGF0ZSxcbiAgICAgIHBoYXNlOiBHRU5FUkFUSU9OX1BIQVNFUy5MQVlPVVRfUkVWSUVXLFxuICAgICAgcHJldmlld0F2YWlsYWJsZTogdHJ1ZSxcbiAgICAgIGxheW91dENvbmZpcm1lZDogZmFsc2UsXG4gICAgICBsYXN0UHJldmlld0NvbnRlbnRSZXZpc2lvbjogY29udGVudFJldmlzaW9uLFxuICAgIH07XG4gICAgc2F2ZVN0YXRlVG9Mb2NhbFN0b3JhZ2UoKTtcbiAgICBlbWl0R2VuZXJhdGlvblN0YXRlQ2hhbmdlZCgpO1xuICB9LFxuICBtYXJrTGF5b3V0Q29uZmlybWVkOiAodXBkYXRlID0ge30pID0+IHtcbiAgICBnZW5lcmF0aW9uU3RhdGUgPSB7XG4gICAgICAuLi5nZW5lcmF0aW9uU3RhdGUsXG4gICAgICAuLi51cGRhdGUsXG4gICAgICBwaGFzZTogR0VORVJBVElPTl9QSEFTRVMuQ09ORklSTUVELFxuICAgICAgbGF5b3V0Q29uZmlybWVkOiB0cnVlLFxuICAgIH07XG4gICAgc2F2ZVN0YXRlVG9Mb2NhbFN0b3JhZ2UoKTtcbiAgICBlbWl0R2VuZXJhdGlvblN0YXRlQ2hhbmdlZCgpO1xuICB9LFxuICBtYXJrRmluYWxHZW5lcmF0ZWQ6IChnZW5lcmF0ZWRBdCA9IG51bGwsIHVwZGF0ZSA9IHt9KSA9PiB7XG4gICAgY29uc3QgY29udGVudFJldmlzaW9uID0gbm9ybWFsaXplUmV2aXNpb24oZ2VuZXJhdGlvblN0YXRlLmNvbnRlbnRSZXZpc2lvbikgPz8gMDtcbiAgICBnZW5lcmF0aW9uU3RhdGUgPSB7XG4gICAgICAuLi5nZW5lcmF0aW9uU3RhdGUsXG4gICAgICAuLi51cGRhdGUsXG4gICAgICBwaGFzZTogR0VORVJBVElPTl9QSEFTRVMuRklOQUxfQ09NUExFVEUsXG4gICAgICBsYXlvdXRDb25maXJtZWQ6IHRydWUsXG4gICAgICBmaW5hbEdlbmVyYXRlZEF0OiBnZW5lcmF0ZWRBdCB8fCB1cGRhdGUuZmluYWxHZW5lcmF0ZWRBdCB8fCBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICBsYXN0RmluYWxDb250ZW50UmV2aXNpb246IGNvbnRlbnRSZXZpc2lvbixcbiAgICB9O1xuICAgIHNhdmVTdGF0ZVRvTG9jYWxTdG9yYWdlKCk7XG4gICAgZW1pdEdlbmVyYXRpb25TdGF0ZUNoYW5nZWQoKTtcbiAgfSxcbiAgcmVzZXRHZW5lcmF0aW9uU3RhdGU6ICgpID0+IHtcbiAgICBnZW5lcmF0aW9uU3RhdGUgPSBjcmVhdGVEZWZhdWx0R2VuZXJhdGlvblN0YXRlKCk7XG4gICAgc2F2ZVN0YXRlVG9Mb2NhbFN0b3JhZ2UoKTtcbiAgICBlbWl0R2VuZXJhdGlvblN0YXRlQ2hhbmdlZCgpO1xuICB9LFxuICBzZXREaXJ0eVBoYXNlczogKHBoYXNlcywgZWFybGllc3RTdGVwKSA9PiB7XG4gICAgZ2VuZXJhdGlvblN0YXRlID0ge1xuICAgICAgLi4uZ2VuZXJhdGlvblN0YXRlLFxuICAgICAgZGlydHlQaGFzZXM6ICAgICAgIEFycmF5LmlzQXJyYXkocGhhc2VzKSA/IHBoYXNlcyA6IFtdLFxuICAgICAgZWFybGllc3REaXJ0eVN0ZXA6IGVhcmxpZXN0U3RlcCB8fCBudWxsLFxuICAgIH07XG4gICAgc2F2ZVN0YXRlVG9Mb2NhbFN0b3JhZ2UoKTtcbiAgICBlbWl0R2VuZXJhdGlvblN0YXRlQ2hhbmdlZCgpO1xuICB9LFxuICBjbGVhckRpcnR5UGhhc2VzOiAoKSA9PiB7XG4gICAgZ2VuZXJhdGlvblN0YXRlID0ge1xuICAgICAgLi4uZ2VuZXJhdGlvblN0YXRlLFxuICAgICAgZGlydHlQaGFzZXM6ICAgICAgIFtdLFxuICAgICAgZWFybGllc3REaXJ0eVN0ZXA6IG51bGwsXG4gICAgfTtcbiAgICBzYXZlU3RhdGVUb0xvY2FsU3RvcmFnZSgpO1xuICAgIGVtaXRHZW5lcmF0aW9uU3RhdGVDaGFuZ2VkKCk7XG4gIH0sXG4gIGdldERpcnR5UGhhc2VzOiAgICAgICAoKSA9PiBnZW5lcmF0aW9uU3RhdGUuZGlydHlQaGFzZXMgfHwgW10sXG4gIGdldEVhcmxpZXN0RGlydHlTdGVwOiAoKSA9PiBnZW5lcmF0aW9uU3RhdGUuZWFybGllc3REaXJ0eVN0ZXAgfHwgbnVsbCxcbn07XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBmcmVzaCBzdGF0ZSBvYmplY3Qgd2l0aCBhbGwgZGVmYXVsdCB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIGluaXRpYWxpemVTdGF0ZSgpIHtcbiAgY3VycmVudFRhYiA9ICdqb2InO1xuICBpc0xvYWRpbmcgPSBmYWxzZTtcbiAgdGFiRGF0YSA9IHtcbiAgICBhbmFseXNpczogbnVsbCxcbiAgICBjdXN0b21pemF0aW9uczogbnVsbCxcbiAgICBjdjogbnVsbFxuICB9O1xuICBpbnRlcmFjdGl2ZVN0YXRlID0ge1xuICAgIGlzUmV2aWV3aW5nOiBmYWxzZSxcbiAgICBjdXJyZW50SW5kZXg6IDAsXG4gICAgdHlwZTogbnVsbCxcbiAgICBkYXRhOiBudWxsXG4gIH07XG4gIHdpbmRvdy5wb3N0QW5hbHlzaXNRdWVzdGlvbnMgPSBbXTtcbiAgd2luZG93LnF1ZXN0aW9uQW5zd2VycyA9IHt9O1xuICBsYXN0S25vd25QaGFzZSA9IFBIQVNFUy5JTklUO1xuICBnZW5lcmF0aW9uU3RhdGUgPSBjcmVhdGVEZWZhdWx0R2VuZXJhdGlvblN0YXRlKCk7XG5cbiAgLy8gR2V0IG9yIGdlbmVyYXRlIHNlc3Npb24gSURcbiAgbGV0IHN0b3JlZElkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oU3RvcmFnZUtleXMuU0VTU0lPTl9JRCk7XG4gIGlmICghc3RvcmVkSWQpIHtcbiAgICBzdG9yZWRJZCA9IGdlbmVyYXRlU2Vzc2lvbklkKCk7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oU3RvcmFnZUtleXMuU0VTU0lPTl9JRCwgc3RvcmVkSWQpO1xuICB9XG4gIHNlc3Npb25JZCA9IHN0b3JlZElkO1xuXG4gIHNhdmVTdGF0ZVRvTG9jYWxTdG9yYWdlKCk7XG4gIGVtaXRHZW5lcmF0aW9uU3RhdGVDaGFuZ2VkKCk7XG59XG5cbi8qKlxuICogTG9hZCBzdGF0ZSBmcm9tIGJyb3dzZXIgbG9jYWxTdG9yYWdlLlxuICovXG5mdW5jdGlvbiBsb2FkU3RhdGVGcm9tTG9jYWxTdG9yYWdlKCkge1xuICB0cnkge1xuICAgIGNvbnN0IHNhdmVkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oU3RvcmFnZUtleXMuVEFCX0RBVEEpO1xuICAgIGlmICghc2F2ZWQpIHJldHVybiBmYWxzZTtcblxuICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKHNhdmVkKTtcblxuICAgIC8vIE9ubHkgcmVzdG9yZSBpZiBkYXRhIGlzIHJlY2VudCAod2l0aGluIDI0IGhvdXJzKVxuICAgIGNvbnN0IGFnZSA9IERhdGUubm93KCkgLSAoZGF0YS50aW1lc3RhbXAgfHwgMCk7XG4gICAgaWYgKGFnZSA+IDI0ICogNjAgKiA2MCAqIDEwMDApIHtcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKFN0b3JhZ2VLZXlzLlRBQl9EQVRBKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBSZXN0b3JlIHRhYiBkYXRhXG4gICAgaWYgKGRhdGEudGFiRGF0YSkge1xuICAgICAgdGFiRGF0YSA9IHsgLi4udGFiRGF0YSwgLi4uZGF0YS50YWJEYXRhIH07XG4gICAgfVxuXG4gICAgaWYgKGRhdGEuY3VycmVudFRhYikge1xuICAgICAgY3VycmVudFRhYiA9IGRhdGEuY3VycmVudFRhYjtcbiAgICB9XG5cbiAgICAvLyBSZXN0b3JlIGludGVyYWN0aXZlIHN0YXRlXG4gICAgaWYgKGRhdGEuaW50ZXJhY3RpdmVTdGF0ZSkge1xuICAgICAgaW50ZXJhY3RpdmVTdGF0ZSA9IHsgLi4uaW50ZXJhY3RpdmVTdGF0ZSwgLi4uZGF0YS5pbnRlcmFjdGl2ZVN0YXRlIH07XG4gICAgfVxuXG4gICAgLy8gUmVzdG9yZSBwZW5kaW5nIHJlY29tbWVuZGF0aW9uc1xuICAgIGlmIChkYXRhLnBlbmRpbmdSZWNvbW1lbmRhdGlvbnMpIHtcbiAgICAgIHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zID0gZGF0YS5wZW5kaW5nUmVjb21tZW5kYXRpb25zO1xuICAgIH1cblxuICAgIC8vIFJlc3RvcmUgc2F2ZWQgbW9kZWwvcHJvdmlkZXIgc2VsZWN0aW9uXG4gICAgaWYgKGRhdGEuY3VycmVudE1vZGVsUHJvdmlkZXIpIHtcbiAgICAgIGN1cnJlbnRNb2RlbFByb3ZpZGVyID0gZGF0YS5jdXJyZW50TW9kZWxQcm92aWRlcjtcbiAgICB9XG4gICAgaWYgKGRhdGEuY3VycmVudE1vZGVsTmFtZSkge1xuICAgICAgY3VycmVudE1vZGVsTmFtZSA9IGRhdGEuY3VycmVudE1vZGVsTmFtZTtcbiAgICB9XG5cbiAgICAvLyBSZXN0b3JlIHBvc3QtYW5hbHlzaXMgc3RhdGVcbiAgICBpZiAoZGF0YS5wb3N0QW5hbHlzaXNRdWVzdGlvbnMpIHtcbiAgICAgIHdpbmRvdy5wb3N0QW5hbHlzaXNRdWVzdGlvbnMgPSBkYXRhLnBvc3RBbmFseXNpc1F1ZXN0aW9ucztcbiAgICB9XG4gICAgaWYgKGRhdGEucXVlc3Rpb25BbnN3ZXJzKSB7XG4gICAgICB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzID0gZGF0YS5xdWVzdGlvbkFuc3dlcnM7XG4gICAgfVxuXG4gICAgLy8gUmVzdG9yZSBwaGFzZVxuICAgIGlmIChkYXRhLmxhc3RLbm93blBoYXNlKSB7XG4gICAgICBsYXN0S25vd25QaGFzZSA9IGRhdGEubGFzdEtub3duUGhhc2U7XG4gICAgfVxuXG4gICAgLy8gUmVzdG9yZSBzdGFnZWQgZ2VuZXJhdGlvbiBzdGF0ZVxuICAgIGlmIChkYXRhLmdlbmVyYXRpb25TdGF0ZSkge1xuICAgICAgZ2VuZXJhdGlvblN0YXRlID0geyAuLi5nZW5lcmF0aW9uU3RhdGUsIC4uLmRhdGEuZ2VuZXJhdGlvblN0YXRlIH07XG4gICAgfVxuXG4gICAgLy8gUmVzdG9yZSBBVFMgc2NvcmVcbiAgICBpZiAoZGF0YS5hdHNTY29yZSkge1xuICAgICAgYXRzU2NvcmUgPSBkYXRhLmF0c1Njb3JlO1xuICAgIH1cblxuICAgIGVtaXRHZW5lcmF0aW9uU3RhdGVDaGFuZ2VkKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nLndhcm4oJ0ZhaWxlZCB0byBsb2FkIHN0YXRlIGZyb20gbG9jYWxTdG9yYWdlOicsIGVycm9yKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBTYXZlIGN1cnJlbnQgc3RhdGUgdG8gYnJvd3NlciBsb2NhbFN0b3JhZ2UuXG4gKi9cbmZ1bmN0aW9uIHNhdmVTdGF0ZVRvTG9jYWxTdG9yYWdlKCkge1xuICB0cnkge1xuICAgIGNvbnN0IGRhdGFUb1NhdmUgPSB7XG4gICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICB0YWJEYXRhLFxuICAgICAgaW50ZXJhY3RpdmVTdGF0ZSxcbiAgICAgIHBlbmRpbmdSZWNvbW1lbmRhdGlvbnM6IHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zLFxuICAgICAgcG9zdEFuYWx5c2lzUXVlc3Rpb25zOiB3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zLFxuICAgICAgcXVlc3Rpb25BbnN3ZXJzOiB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzLFxuICAgICAgbGFzdEtub3duUGhhc2UsXG4gICAgICBjdXJyZW50VGFiLFxuICAgICAgLy8gUGVyc2lzdCBsYXN0LXNlbGVjdGVkIG1vZGVsL3Byb3ZpZGVyIHNvIFVJIHNlbGVjdGlvbnMgc3Vydml2ZSByZWxvYWRzXG4gICAgICBjdXJyZW50TW9kZWxQcm92aWRlcixcbiAgICAgIGN1cnJlbnRNb2RlbE5hbWUsXG4gICAgICBnZW5lcmF0aW9uU3RhdGUsXG4gICAgICBhdHNTY29yZSxcbiAgICB9O1xuXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oU3RvcmFnZUtleXMuVEFCX0RBVEEsIEpTT04uc3RyaW5naWZ5KGRhdGFUb1NhdmUpKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cud2FybignRmFpbGVkIHRvIHNhdmUgc3RhdGUgdG8gbG9jYWxTdG9yYWdlOicsIGVycm9yKTtcbiAgfVxufVxuXG4vKipcbiAqIENsZWFyIGFsbCBzdGF0ZSAob24gbmV3IHNlc3Npb24gb3IgcmVzZXQgYWN0aW9uKS5cbiAqL1xuZnVuY3Rpb24gY2xlYXJTdGF0ZSgpIHtcbiAgaW5pdGlhbGl6ZVN0YXRlKCk7XG4gIE9iamVjdC52YWx1ZXMoU3RvcmFnZUtleXMpLmZvckVhY2goa2V5ID0+IGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSkpO1xufVxuXG4vLyBUaGUgYXV0aG9yaXRhdGl2ZSByZXN0b3JlU2Vzc2lvbi9yZXN0b3JlQmFja2VuZFN0YXRlL2xvYWRTZXNzaW9uRmlsZVxuLy8gaW1wbGVtZW50YXRpb25zIGxpdmUgaW4gYHdlYi9hcHAuanNgLiBSZW1vdmUgZHVwbGljYXRlIGltcGxlbWVudGF0aW9uc1xuLy8gZnJvbSB0aGlzIG1vZHVsZSB0byBhdm9pZCBjb25mbGljdGluZyBiZWhhdmlvciBhbmQgZW5zdXJlIGEgc2luZ2xlXG4vLyByZXN0b3JlIHBhdGggaXMgdXNlZCBieSB0aGUgYXBwbGljYXRpb24uXG5cbmV4cG9ydCB7XG4gIFBIQVNFUyxcbiAgUEhBU0VfVE9fU1RFUCxcbiAgR0VORVJBVElPTl9QSEFTRVMsXG4gIEdFTkVSQVRJT05fU1RBVEVfRVZFTlQsXG4gIHN0YXRlTWFuYWdlcixcbiAgZ2V0V29ya2Zsb3dTdGVwRm9yUGhhc2UsXG4gIGluaXRpYWxpemVTdGF0ZSwgbG9hZFN0YXRlRnJvbUxvY2FsU3RvcmFnZSwgc2F2ZVN0YXRlVG9Mb2NhbFN0b3JhZ2UsXG4gIGNsZWFyU3RhdGUsXG59O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvcHJvdmlkZXItaW5mby5qcyBcdTIwMTQgTExNIHByb3ZpZGVyIGRpc3BsYXkgbWV0YWRhdGEgY2xpZW50LlxuICpcbiAqIFByb3ZpZGVyIGRhdGEgaXMgbm93IHRoZSBzaW5nbGUgc291cmNlIG9mIHRydXRoIGluIHNjcmlwdHMvdXRpbHMvcHJvdmlkZXJfcmVnaXN0cnkucHlcbiAqIGFuZCBzZXJ2ZWQgYnkgR0VUIC9hcGkvcHJvdmlkZXJzLiBUaGlzIG1vZHVsZSBmZXRjaGVzIGFuZCBjYWNoZXMgdGhhdCBkYXRhLlxuICpcbiAqIEFsbCBwcm92aWRlciBkZXNjcmlwdGlvbnMsIFVSTHMsIGFuZCB0aWVyL3ByaXZhY3kgZmxhZ3Mgc2hvdWxkIGJlIGVkaXRlZCBpblxuICogcHJvdmlkZXJfcmVnaXN0cnkucHkgcmF0aGVyIHRoYW4gaGVyZS5cbiAqXG4gKiBTZXJ2ZXIgZmllbGQgbmFtZXMgKHNuYWtlX2Nhc2UsIG1hdGNoaW5nIFB5dGhvbik6XG4gKiAgIGZyZWVfdGllciAgIFx1MjAxNCB3aGV0aGVyIGEgbm8tY29zdCBBUEkgZW50cnkgdGllciBpcyBhdmFpbGFibGVcbiAqICAgY29uZmlkZW50aWFsIFx1MjAxNCB3aGV0aGVyIHRoZSBwcm92aWRlciBjb21taXRzIG5vdCB0byB0cmFpbiBvbiBBUEkgcmVxdWVzdCBkYXRhXG4gKiAgIG5vdGUgICAgICAgIFx1MjAxNCBvbmUtc2VudGVuY2UgcGxhaW4tdGV4dCBkZXNjcmlwdGlvblxuICogICBob21lcGFnZSAgICBcdTIwMTQgcHJvdmlkZXIgbGFuZGluZyBwYWdlIFVSTCAobnVsbCBpZiBub3QgYXBwbGljYWJsZSlcbiAqICAgcHJpY2luZ191cmwgXHUyMDE0IHByaWNpbmcgLyBwbGFucyBwYWdlIFVSTCAobnVsbCBpZiBub3QgYXBwbGljYWJsZSlcbiAqICAgcHJpdmFjeV91cmwgXHUyMDE0IHByaXZhY3kgcG9saWN5IG9yIGRhdGEtdXNlIHBvbGljeSBVUkwgKG51bGwgaWYgbm90IGFwcGxpY2FibGUpXG4gKi9cblxuaW1wb3J0IHsgZXNjYXBlSHRtbCB9IGZyb20gJy4vdXRpbHMuanMnO1xuXG4vKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIG9iamVjdD58bnVsbH0gKi9cbmxldCBfY2FjaGUgPSBudWxsO1xuXG4vKipcbiAqIEZldGNoIHByb3ZpZGVyIGRpc3BsYXkgbWV0YWRhdGEgZnJvbSB0aGUgc2VydmVyIGFuZCBjYWNoZSBpdC5cbiAqIFNhZmUgdG8gY2FsbCBtdWx0aXBsZSB0aW1lcyBcdTIwMTQgcmV0dXJucyB0aGUgY2FjaGUgaWYgcG9wdWxhdGVkLCByZXRyaWVzIGlmXG4gKiB0aGUgaW5pdGlhbCBmZXRjaCBmYWlsZWQgKG5vbi1mYXRhbCwgcG9wb3ZlcnMgd2lsbCBqdXN0IG5vdCBhcHBlYXIpLlxuICogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywgb2JqZWN0PnxudWxsPn1cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRQcm92aWRlckluZm8oKSB7XG4gIGlmIChfY2FjaGUgIT09IG51bGwpIHJldHVybiBfY2FjaGU7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKCcvYXBpL3Byb3ZpZGVycycpO1xuICAgIGlmIChyZXNwLm9rKSB7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcC5qc29uKCk7XG4gICAgICBfY2FjaGUgPSBkYXRhLnByb3ZpZGVycyB8fCB7fTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIE5vbi1mYXRhbDogcG9wb3ZlcnMgc2ltcGx5IHdvbid0IGFwcGVhci5cbiAgfVxuICByZXR1cm4gX2NhY2hlO1xufVxuXG4vKipcbiAqIFJldHVybiBjYWNoZWQgZGlzcGxheSBpbmZvIGZvciBhIHByb3ZpZGVyLCBvciBudWxsIGlmIG5vdCBsb2FkZWQgLyB1bmtub3duLlxuICogQ2FsbCBsb2FkUHJvdmlkZXJJbmZvKCkgZmlyc3QgKGUuZy4gaW4gb3Blbk1vZGVsTW9kYWwpLlxuICogQHBhcmFtIHtzdHJpbmd9IHByb3ZpZGVyXG4gKiBAcmV0dXJucyB7b2JqZWN0fG51bGx9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcm92aWRlckluZm8ocHJvdmlkZXIpIHtcbiAgcmV0dXJuIF9jYWNoZSA/IChfY2FjaGVbcHJvdmlkZXJdIHx8IG51bGwpIDogbnVsbDtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgSFRNTCBjb250ZW50IHN0cmluZyBmb3IgYSBwcm92aWRlciBpbmZvIEJvb3RzdHJhcCA1IHBvcG92ZXIuXG4gKiBVc2VzIHNuYWtlX2Nhc2UgZmllbGQgbmFtZXMgYXMgcmV0dXJuZWQgYnkgR0VUIC9hcGkvcHJvdmlkZXJzLlxuICogQHBhcmFtIHtvYmplY3R9IGluZm8gLSBQcm92aWRlciBpbmZvIGVudHJ5IGZyb20gZ2V0UHJvdmlkZXJJbmZvKClcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEhUTUwgc3RyaW5nIChzYWZlIHRvIHBhc3MgdG8gQlM1IFBvcG92ZXIgd2l0aCBzYW5pdGl6ZTpmYWxzZSlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVySW5mb1BvcG92ZXJDb250ZW50KGluZm8pIHtcbiAgY29uc3QgdGllckljb24gID0gaW5mby5mcmVlX3RpZXIgICAgPyAnJiMxMDAwMzsgRnJlZSB0aWVyIGF2YWlsYWJsZScgICAgOiAnJiMxMDAwNzsgUGFpZCBvbmx5IChubyBmcmVlIEFQSSB0aWVyKSc7XG4gIGNvbnN0IHByaXZJY29uICA9IGluZm8uY29uZmlkZW50aWFsID8gJyYjMTI4Mjc0OyBEYXRhIGNvbmZpZGVudGlhbCcgICAgIDogJyYjOTg4ODsmIzY1MDM5OyBEYXRhIG1heSBiZSByZXZpZXdlZC9yZXRhaW5lZCc7XG4gIGNvbnN0IHRpZXJDb2xvciA9IGluZm8uZnJlZV90aWVyICAgID8gJyMwNjVmNDYnIDogJyM5MjQwMGUnO1xuICBjb25zdCBwcml2Q29sb3IgPSBpbmZvLmNvbmZpZGVudGlhbCA/ICcjMWU0MGFmJyA6ICcjOTI0MDBlJztcblxuICBjb25zdCBsaW5rcyA9IFtcbiAgICBpbmZvLmhvbWVwYWdlICAgID8gYDxhIGhyZWY9XCIke2VzY2FwZUh0bWwoaW5mby5ob21lcGFnZSl9XCIgICAgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiPkhvbWVwYWdlPC9hPmAgICAgICAgICAgIDogJycsXG4gICAgaW5mby5wcmljaW5nX3VybCA/IGA8YSBocmVmPVwiJHtlc2NhcGVIdG1sKGluZm8ucHJpY2luZ191cmwpfVwiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIj5QcmljaW5nICZhbXA7IHBsYW5zPC9hPmAgOiAnJyxcbiAgICBpbmZvLnByaXZhY3lfdXJsID8gYDxhIGhyZWY9XCIke2VzY2FwZUh0bWwoaW5mby5wcml2YWN5X3VybCl9XCIgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiPlByaXZhY3kgcG9saWN5PC9hPmAgICAgICA6ICcnLFxuICBdLmZpbHRlcihCb29sZWFuKTtcblxuICByZXR1cm4gJzxkaXYgc3R5bGU9XCJtaW4td2lkdGg6MjIwcHg7bWF4LXdpZHRoOjMwMHB4O2ZvbnQtc2l6ZTowLjgyZW07bGluZS1oZWlnaHQ6MS41O1wiPidcbiAgICArIGA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTo2cHg7XCI+PHNwYW4gc3R5bGU9XCJjb2xvcjoke3RpZXJDb2xvcn07XCI+JHt0aWVySWNvbn08L3NwYW4+PC9kaXY+YFxuICAgICsgYDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjhweDtcIj48c3BhbiBzdHlsZT1cImNvbG9yOiR7cHJpdkNvbG9yfTtcIj4ke3ByaXZJY29ufTwvc3Bhbj48L2Rpdj5gXG4gICAgKyBgPHAgc3R5bGU9XCJtYXJnaW46MCAwIDhweDtjb2xvcjojMzc0MTUxO1wiPiR7ZXNjYXBlSHRtbChpbmZvLm5vdGUpfTwvcD5gXG4gICAgKyAobGlua3MubGVuZ3RoID8gJzx1bCBzdHlsZT1cIm1hcmdpbjowO3BhZGRpbmctbGVmdDoxNnB4O1wiPicgKyBsaW5rcy5tYXAobCA9PiBgPGxpPiR7bH08L2xpPmApLmpvaW4oJycpICsgJzwvdWw+JyA6ICcnKVxuICAgICsgJzwvZGl2Pic7XG59XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHVpLWNvcmUuanNcbiAqIENvcmUgVUkgcm91dGluZywgdGFiIG1hbmFnZW1lbnQsIG1vZGFsIG1hbmFnZW1lbnQsIGFuZCBwYWdlIGluaXRpYWxpemF0aW9uLlxuICogRW50cnkgcG9pbnQgZm9yIHRoZSBhcHBsaWNhdGlvbiAtIGxvYWRzIG9uIERPTUNvbnRlbnRMb2FkZWQuXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCd1aS1jb3JlJyk7XG5cbmltcG9ydCB7IGVzY2FwZUh0bWwgfSBmcm9tICcuL3V0aWxzLmpzJztcbmltcG9ydCB7IFN0b3JhZ2VLZXlzLCBhcGlDYWxsLCBmZXRjaFN0YXR1cywgZmV0Y2hTZXR0aW5ncywgdXBkYXRlU2V0dGluZ3MgfSBmcm9tICcuL2FwaS1jbGllbnQuanMnO1xuaW1wb3J0IHtcbiAgZ2V0V29ya2Zsb3dTdGVwRm9yUGhhc2UsXG4gIGluaXRpYWxpemVTdGF0ZSxcbiAgbG9hZFN0YXRlRnJvbUxvY2FsU3RvcmFnZSxcbiAgc3RhdGVNYW5hZ2VyLFxufSBmcm9tICcuL3N0YXRlLW1hbmFnZXIuanMnO1xuXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbi8vIEFjY2Vzc2liaWxpdHk6IEZvY3VzIE1hbmFnZW1lbnQgZm9yIE1vZGFsc1xuLy8gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8qKiBTdGFjayBvZiBlbGVtZW50cyB0aGF0IG9wZW5lZCBlYWNoIG1vZGFsIChzdXBwb3J0cyBuZXN0ZWQgbW9kYWxzKS4gKi9cbmNvbnN0IF9mb2N1c1N0YWNrID0gW107XG5cbi8qKiBTdGFjayBvZiBmb2N1cy10cmFwIGxpc3RlbmVycyAob25lIHBlciBvcGVuIG1vZGFsKS4gKi9cbmNvbnN0IF9mb2N1c1RyYXBTdGFjayA9IFtdO1xubGV0IF9zZXR0aW5nc0RhdGEgPSBudWxsO1xuY29uc3QgUkVUUllfUE9MSUNZX1NUT1JBR0VfS0VZID0gJ2N2LWJ1aWxkZXItcmV0cnktcG9saWN5JztcblxuZnVuY3Rpb24gX2dldFJldHJ5UG9saWN5RnJvbVN0b3JhZ2UoKSB7XG4gIGNvbnN0IGRlZmF1bHRzID0ge1xuICAgIGJhc2VNczogMTUwMCxcbiAgICBjYXBNczogNjAwMDAsXG4gICAgbWF4QXR0ZW1wdHM6IDYsXG4gICAgYXV0b1JldHJ5OiB0cnVlLFxuICB9O1xuICB0cnkge1xuICAgIGNvbnN0IHJhdyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFJFVFJZX1BPTElDWV9TVE9SQUdFX0tFWSk7XG4gICAgaWYgKCFyYXcpIHJldHVybiBkZWZhdWx0cztcbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHJhdyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGJhc2VNczogTWF0aC5tYXgoMjAwLCBOdW1iZXIocGFyc2VkLmJhc2VNcyB8fCBkZWZhdWx0cy5iYXNlTXMpKSxcbiAgICAgIGNhcE1zOiBNYXRoLm1heCgxMDAwLCBOdW1iZXIocGFyc2VkLmNhcE1zIHx8IGRlZmF1bHRzLmNhcE1zKSksXG4gICAgICBtYXhBdHRlbXB0czogTWF0aC5tYXgoMSwgTnVtYmVyKHBhcnNlZC5tYXhBdHRlbXB0cyB8fCBkZWZhdWx0cy5tYXhBdHRlbXB0cykpLFxuICAgICAgYXV0b1JldHJ5OiBwYXJzZWQuYXV0b1JldHJ5ICE9PSBmYWxzZSxcbiAgICB9O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZGVmYXVsdHM7XG4gIH1cbn1cblxuZnVuY3Rpb24gX3NhdmVSZXRyeVBvbGljeVRvU3RvcmFnZShwb2xpY3kpIHtcbiAgdHJ5IHtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShSRVRSWV9QT0xJQ1lfU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KHBvbGljeSkpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy53YXJuKCdDb3VsZCBub3Qgc2F2ZSByZXRyeSBwb2xpY3kgcHJlZmVyZW5jZTonLCBlcnJvcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX3NldHRpbmdzU291cmNlTGFiZWwobWV0YSwga2V5LCBydW50aW1lT3ZlcnJpZGVzID0gbnVsbCkge1xuICBpZiAocnVudGltZU92ZXJyaWRlcyAmJiBrZXkgaW4gcnVudGltZU92ZXJyaWRlcykge1xuICAgIHJldHVybiAnU291cmNlOiBydW50aW1lIHNlbGVjdGlvbic7XG4gIH1cbiAgY29uc3Qgc291cmNlID0gbWV0YT8uc291cmNlcz8uW2tleV0gfHwgJ2RlZmF1bHQnO1xuICBjb25zdCBlbnZLZXkgPSBtZXRhPy5lbnZfa2V5cz8uW2tleV0gfHwgbnVsbDtcbiAgaWYgKHNvdXJjZSA9PT0gJ2VudicpIHJldHVybiBgU291cmNlOiBlbnZpcm9ubWVudCB2YXJpYWJsZSAoJHtlbnZLZXkgfHwgJ2xvY2tlZCd9KWA7XG4gIGlmIChzb3VyY2UgPT09ICdkb3RlbnYnKSByZXR1cm4gYFNvdXJjZTogLmVudiAoJHtlbnZLZXkgfHwgJ2xvY2tlZCd9KWA7XG4gIGlmIChzb3VyY2UgPT09ICdjb25maWcnKSByZXR1cm4gJ1NvdXJjZTogY29uZmlnLnlhbWwnO1xuICByZXR1cm4gJ1NvdXJjZTogYnVpbHQtaW4gZGVmYXVsdCc7XG59XG5cbmZ1bmN0aW9uIF9yZW5kZXJTZXR0aW5nc1NvdXJjZXMobWV0YSwgcnVudGltZU92ZXJyaWRlcyA9IG51bGwpIHtcbiAgY29uc3Qgc291cmNlVGFyZ2V0cyA9IFtcbiAgICAnbGxtLmRlZmF1bHRfcHJvdmlkZXInLFxuICAgICdsbG0uZGVmYXVsdF9tb2RlbCcsXG4gICAgJ2xsbS5yZXF1ZXN0X3RpbWVvdXRfc2Vjb25kcycsXG4gICAgJ2xsbS50ZW1wZXJhdHVyZScsXG4gICAgJ2dlbmVyYXRpb24ubWF4X3NraWxscycsXG4gICAgJ2dlbmVyYXRpb24ubWF4X2FjaGlldmVtZW50cycsXG4gICAgJ2dlbmVyYXRpb24ubWF4X3B1YmxpY2F0aW9ucycsXG4gICAgJ2dlbmVyYXRpb24uc2tpbGxzX3NlY3Rpb25fdGl0bGUnLFxuICAgICdnZW5lcmF0aW9uLmZvcm1hdHMuYXRzX2RvY3gnLFxuICAgICdnZW5lcmF0aW9uLmZvcm1hdHMuaHVtYW5fcGRmJyxcbiAgICAnZ2VuZXJhdGlvbi5mb3JtYXRzLmh1bWFuX2RvY3gnLFxuICBdO1xuICBzb3VyY2VUYXJnZXRzLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNvdXJjZS0ke2tleX1gKTtcbiAgICBpZiAoIWVsKSByZXR1cm47XG4gICAgZWwudGV4dENvbnRlbnQgPSBfc2V0dGluZ3NTb3VyY2VMYWJlbChtZXRhLCBrZXksIHJ1bnRpbWVPdmVycmlkZXMpO1xuICAgIGNvbnN0IHJ1bnRpbWVLZXkgPSBydW50aW1lT3ZlcnJpZGVzICYmIGtleSBpbiBydW50aW1lT3ZlcnJpZGVzO1xuICAgIGNvbnN0IGlzTG9ja2VkID0gQm9vbGVhbihtZXRhPy5sb2NrZWQ/LltrZXldKTtcbiAgICBlbC5zdHlsZS5jb2xvciA9IHJ1bnRpbWVLZXkgPyAnIzFlNDBhZicgOiAoaXNMb2NrZWQgPyAnI2I0NTMwOScgOiAnIzY0NzQ4YicpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gX3NldFNldHRpbmdzU3RhdHVzKG1lc3NhZ2UsIGtpbmQgPSAnaW5mbycpIHtcbiAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dGluZ3Mtc3RhdHVzLW1zZycpO1xuICBpZiAoIWVsKSByZXR1cm47XG4gIGVsLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgaWYgKGtpbmQgPT09ICdzdWNjZXNzJykge1xuICAgIGVsLnN0eWxlLmJhY2tncm91bmQgPSAnI2VjZmRmNSc7XG4gICAgZWwuc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCAjODZlZmFjJztcbiAgICBlbC5zdHlsZS5jb2xvciA9ICcjMTY2NTM0JztcbiAgfSBlbHNlIGlmIChraW5kID09PSAnZXJyb3InKSB7XG4gICAgZWwuc3R5bGUuYmFja2dyb3VuZCA9ICcjZmVmMmYyJztcbiAgICBlbC5zdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkICNmZWNhY2EnO1xuICAgIGVsLnN0eWxlLmNvbG9yID0gJyM5OTFiMWInO1xuICB9IGVsc2Uge1xuICAgIGVsLnN0eWxlLmJhY2tncm91bmQgPSAnI2VmZjZmZic7XG4gICAgZWwuc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCAjYmZkYmZlJztcbiAgICBlbC5zdHlsZS5jb2xvciA9ICcjMWU0MGFmJztcbiAgfVxuICBlbC50ZXh0Q29udGVudCA9IG1lc3NhZ2U7XG59XG5cbmZ1bmN0aW9uIF9jb2xsZWN0U2V0dGluZ3NQYXlsb2FkRnJvbUZvcm0oKSB7XG4gIHJldHVybiB7XG4gICAgbGxtOiB7XG4gICAgICBkZWZhdWx0X3Byb3ZpZGVyOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dGluZ3MtbGxtLWRlZmF1bHQtcHJvdmlkZXInKT8udmFsdWU/LnRyaW0oKSB8fCBudWxsLFxuICAgICAgZGVmYXVsdF9tb2RlbDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHRpbmdzLWxsbS1kZWZhdWx0LW1vZGVsJyk/LnZhbHVlPy50cmltKCkgfHwgbnVsbCxcbiAgICAgIHJlcXVlc3RfdGltZW91dF9zZWNvbmRzOiBOdW1iZXIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHRpbmdzLWxsbS1yZXF1ZXN0LXRpbWVvdXQnKT8udmFsdWUgfHwgMTIwKSxcbiAgICAgIHRlbXBlcmF0dXJlOiBOdW1iZXIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHRpbmdzLWxsbS10ZW1wZXJhdHVyZScpPy52YWx1ZSB8fCAwLjcpLFxuICAgIH0sXG4gICAgZ2VuZXJhdGlvbjoge1xuICAgICAgbWF4X3NraWxsczogTnVtYmVyKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR0aW5ncy1nZW4tbWF4LXNraWxscycpPy52YWx1ZSB8fCAyMCksXG4gICAgICBtYXhfYWNoaWV2ZW1lbnRzOiBOdW1iZXIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHRpbmdzLWdlbi1tYXgtYWNoaWV2ZW1lbnRzJyk/LnZhbHVlIHx8IDUpLFxuICAgICAgbWF4X3B1YmxpY2F0aW9uczogTnVtYmVyKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR0aW5ncy1nZW4tbWF4LXB1YmxpY2F0aW9ucycpPy52YWx1ZSB8fCAxMCksXG4gICAgICBza2lsbHNfc2VjdGlvbl90aXRsZTogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHRpbmdzLWdlbi1za2lsbHMtdGl0bGUnKT8udmFsdWU/LnRyaW0oKSB8fCAnU2tpbGxzJyxcbiAgICAgIGZvcm1hdHM6IHtcbiAgICAgICAgYXRzX2RvY3g6IEJvb2xlYW4oZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHRpbmdzLWZvcm1hdC1hdHMtZG9jeCcpPy5jaGVja2VkKSxcbiAgICAgICAgaHVtYW5fcGRmOiBCb29sZWFuKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR0aW5ncy1mb3JtYXQtaHVtYW4tcGRmJyk/LmNoZWNrZWQpLFxuICAgICAgICBodW1hbl9kb2N4OiBCb29sZWFuKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR0aW5ncy1mb3JtYXQtaHVtYW4tZG9jeCcpPy5jaGVja2VkKSxcbiAgICAgIH0sXG4gICAgICBhaV9hdHRyaWJ1dGlvbjogQm9vbGVhbihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dGluZ3MtZ2VuLWFpLWF0dHJpYnV0aW9uJyk/LmNoZWNrZWQpLFxuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIF9jb2xsZWN0UmV0cnlQb2xpY3lGcm9tRm9ybSgpIHtcbiAgcmV0dXJuIHtcbiAgICBiYXNlTXM6IE51bWJlcihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dGluZ3MtcmV0cnktYmFzZS1tcycpPy52YWx1ZSB8fCAxNTAwKSxcbiAgICBjYXBNczogTnVtYmVyKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR0aW5ncy1yZXRyeS1jYXAtbXMnKT8udmFsdWUgfHwgNjAwMDApLFxuICAgIG1heEF0dGVtcHRzOiBOdW1iZXIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHRpbmdzLXJldHJ5LW1heC1hdHRlbXB0cycpPy52YWx1ZSB8fCA2KSxcbiAgICBhdXRvUmV0cnk6IEJvb2xlYW4oZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHRpbmdzLXJldHJ5LWF1dG8nKT8uY2hlY2tlZCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIF9yZW5kZXJTZXR0aW5nc1RvRm9ybShwYXlsb2FkKSB7XG4gIGNvbnN0IHNldHRpbmdzID0gcGF5bG9hZD8uc2V0dGluZ3MgfHwge307XG4gIGNvbnN0IGxsbSA9IHNldHRpbmdzLmxsbSB8fCB7fTtcbiAgY29uc3QgZ2VuZXJhdGlvbiA9IHNldHRpbmdzLmdlbmVyYXRpb24gfHwge307XG4gIGNvbnN0IGZvcm1hdHMgPSBnZW5lcmF0aW9uLmZvcm1hdHMgfHwge307XG4gIGNvbnN0IHJ1bnRpbWVQcm92aWRlciA9IHBheWxvYWQ/LnJ1bnRpbWU/LmxsbT8ucHJvdmlkZXIgfHwgbnVsbDtcbiAgY29uc3QgcnVudGltZU1vZGVsID0gcGF5bG9hZD8ucnVudGltZT8ubGxtPy5tb2RlbCB8fCBudWxsO1xuICBjb25zdCBydW50aW1lT3ZlcnJpZGVzID0ge307XG4gIGlmIChydW50aW1lUHJvdmlkZXIpIHJ1bnRpbWVPdmVycmlkZXNbJ2xsbS5kZWZhdWx0X3Byb3ZpZGVyJ10gPSBydW50aW1lUHJvdmlkZXI7XG4gIGlmIChydW50aW1lTW9kZWwpIHJ1bnRpbWVPdmVycmlkZXNbJ2xsbS5kZWZhdWx0X21vZGVsJ10gPSBydW50aW1lTW9kZWw7XG5cbiAgY29uc3Qgc2V0VmFsdWUgPSAoaWQsIHZhbHVlKSA9PiB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgaWYgKGVsKSBlbC52YWx1ZSA9IHZhbHVlID8/ICcnO1xuICB9O1xuICBjb25zdCBzZXRDaGVja2VkID0gKGlkLCB2YWx1ZSkgPT4ge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgIGlmIChlbCkgZWwuY2hlY2tlZCA9IEJvb2xlYW4odmFsdWUpO1xuICB9O1xuXG4gIHNldFZhbHVlKCdzZXR0aW5ncy1sbG0tZGVmYXVsdC1wcm92aWRlcicsIHJ1bnRpbWVQcm92aWRlciB8fCBsbG0uZGVmYXVsdF9wcm92aWRlciB8fCAnJyk7XG4gIHNldFZhbHVlKCdzZXR0aW5ncy1sbG0tZGVmYXVsdC1tb2RlbCcsIHJ1bnRpbWVNb2RlbCB8fCBsbG0uZGVmYXVsdF9tb2RlbCB8fCAnJyk7XG4gIHNldFZhbHVlKCdzZXR0aW5ncy1sbG0tcmVxdWVzdC10aW1lb3V0JywgbGxtLnJlcXVlc3RfdGltZW91dF9zZWNvbmRzID8/IDEyMCk7XG4gIHNldFZhbHVlKCdzZXR0aW5ncy1sbG0tdGVtcGVyYXR1cmUnLCBsbG0udGVtcGVyYXR1cmUgPz8gMC43KTtcblxuICBzZXRWYWx1ZSgnc2V0dGluZ3MtZ2VuLW1heC1za2lsbHMnLCBnZW5lcmF0aW9uLm1heF9za2lsbHMgPz8gMjApO1xuICBzZXRWYWx1ZSgnc2V0dGluZ3MtZ2VuLW1heC1hY2hpZXZlbWVudHMnLCBnZW5lcmF0aW9uLm1heF9hY2hpZXZlbWVudHMgPz8gNSk7XG4gIHNldFZhbHVlKCdzZXR0aW5ncy1nZW4tbWF4LXB1YmxpY2F0aW9ucycsIGdlbmVyYXRpb24ubWF4X3B1YmxpY2F0aW9ucyA/PyAxMCk7XG4gIHNldFZhbHVlKCdzZXR0aW5ncy1nZW4tc2tpbGxzLXRpdGxlJywgZ2VuZXJhdGlvbi5za2lsbHNfc2VjdGlvbl90aXRsZSB8fCAnU2tpbGxzJyk7XG5cbiAgc2V0Q2hlY2tlZCgnc2V0dGluZ3MtZm9ybWF0LWF0cy1kb2N4JywgZm9ybWF0cy5hdHNfZG9jeCk7XG4gIHNldENoZWNrZWQoJ3NldHRpbmdzLWZvcm1hdC1odW1hbi1wZGYnLCBmb3JtYXRzLmh1bWFuX3BkZik7XG4gIHNldENoZWNrZWQoJ3NldHRpbmdzLWZvcm1hdC1odW1hbi1kb2N4JywgZm9ybWF0cy5odW1hbl9kb2N4KTtcbiAgc2V0Q2hlY2tlZCgnc2V0dGluZ3MtZ2VuLWFpLWF0dHJpYnV0aW9uJywgZ2VuZXJhdGlvbi5haV9hdHRyaWJ1dGlvbik7XG5cbiAgY29uc3QgcmV0cnlQb2xpY3kgPSBfZ2V0UmV0cnlQb2xpY3lGcm9tU3RvcmFnZSgpO1xuICBzZXRWYWx1ZSgnc2V0dGluZ3MtcmV0cnktYmFzZS1tcycsIHJldHJ5UG9saWN5LmJhc2VNcyk7XG4gIHNldFZhbHVlKCdzZXR0aW5ncy1yZXRyeS1jYXAtbXMnLCByZXRyeVBvbGljeS5jYXBNcyk7XG4gIHNldFZhbHVlKCdzZXR0aW5ncy1yZXRyeS1tYXgtYXR0ZW1wdHMnLCByZXRyeVBvbGljeS5tYXhBdHRlbXB0cyk7XG4gIHNldENoZWNrZWQoJ3NldHRpbmdzLXJldHJ5LWF1dG8nLCByZXRyeVBvbGljeS5hdXRvUmV0cnkpO1xuXG4gIF9yZW5kZXJTZXR0aW5nc1NvdXJjZXMocGF5bG9hZC5tZXRhIHx8IHt9LCBydW50aW1lT3ZlcnJpZGVzKTtcblxuICBjb25zdCBwYXRoRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dGluZ3MtY29uZmlnLXBhdGgnKTtcbiAgaWYgKHBhdGhFbCkge1xuICAgIHBhdGhFbC50ZXh0Q29udGVudCA9IHBheWxvYWQ/Lm1ldGE/LmNvbmZpZ19wYXRoXG4gICAgICA/IGBDb25maWcgZmlsZTogJHtwYXlsb2FkLm1ldGEuY29uZmlnX3BhdGh9YFxuICAgICAgOiAnJztcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZWxvYWRTZXR0aW5nc01vZGFsKCkge1xuICB0cnkge1xuICAgIF9zZXRTZXR0aW5nc1N0YXR1cygnTG9hZGluZyBzZXR0aW5ncy4uLicsICdpbmZvJyk7XG4gICAgY29uc3QgW3Jlc3VsdCwgc3RhdHVzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtmZXRjaFNldHRpbmdzKCksIGZldGNoU3RhdHVzKCkuY2F0Y2goKCkgPT4gbnVsbCldKTtcbiAgICBfcmVuZGVyU2V0dGluZ3NUb0Zvcm0ocmVzdWx0KTtcbiAgICAvLyBhaV9hdHRyaWJ1dGlvbiBpcyBwZXItc2Vzc2lvbiwgbm90IGluIGNvbmZpZy55YW1sIFx1MjAxNCByZWFkIGZyb20gc2Vzc2lvbiBzdGF0dXNcbiAgICBjb25zdCBhdHRyRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dGluZ3MtZ2VuLWFpLWF0dHJpYnV0aW9uJyk7XG4gICAgaWYgKGF0dHJFbCAmJiBzdGF0dXMpIGF0dHJFbC5jaGVja2VkID0gQm9vbGVhbihzdGF0dXMuYWlfYXR0cmlidXRpb24pO1xuICAgIF9zZXRTZXR0aW5nc1N0YXR1cygnU2V0dGluZ3MgbG9hZGVkLicsICdzdWNjZXNzJyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgX3NldFNldHRpbmdzU3RhdHVzKGBGYWlsZWQgdG8gbG9hZCBzZXR0aW5nczogJHtlcnJvci5tZXNzYWdlIHx8IGVycm9yfWAsICdlcnJvcicpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNhdmVTZXR0aW5nc01vZGFsKCkge1xuICBjb25zdCBzYXZlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHRpbmdzLXNhdmUtYnRuJyk7XG4gIHRyeSB7XG4gICAgaWYgKHNhdmVCdG4pIHtcbiAgICAgIHNhdmVCdG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgc2F2ZUJ0bi50ZXh0Q29udGVudCA9ICdTYXZpbmcuLi4nO1xuICAgIH1cbiAgICBfc2V0U2V0dGluZ3NTdGF0dXMoJ1NhdmluZyBzZXR0aW5ncy4uLicsICdpbmZvJyk7XG4gICAgY29uc3QgcGF5bG9hZCA9IF9jb2xsZWN0U2V0dGluZ3NQYXlsb2FkRnJvbUZvcm0oKTtcbiAgICBjb25zdCBhaUF0dHJpYnV0aW9uID0gQm9vbGVhbihwYXlsb2FkLmdlbmVyYXRpb24/LmFpX2F0dHJpYnV0aW9uKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB1cGRhdGVTZXR0aW5ncyhwYXlsb2FkKTtcbiAgICBfc2F2ZVJldHJ5UG9saWN5VG9TdG9yYWdlKF9jb2xsZWN0UmV0cnlQb2xpY3lGcm9tRm9ybSgpKTtcbiAgICBfc2V0dGluZ3NEYXRhID0gcmVzdWx0O1xuICAgIF9yZW5kZXJTZXR0aW5nc1RvRm9ybShyZXN1bHQpO1xuICAgIC8vIGFpX2F0dHJpYnV0aW9uIGlzIHBlci1zZXNzaW9uIHN0YXRlLCBub3QgYSBjb25maWcueWFtbCBrZXkgXHUyMDE0IHNhdmUgaXQgc2VwYXJhdGVseVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBhcGlDYWxsKCdQT1NUJywgJy9hcGkvZ2VuZXJhdGlvbi1zZXR0aW5ncycsIHsgYWlfYXR0cmlidXRpb246IGFpQXR0cmlidXRpb24gfSk7XG4gICAgfSBjYXRjaCAoXykgeyAvKiBub24tZmF0YWwgKi8gfVxuICAgIF9zZXRTZXR0aW5nc1N0YXR1cygnU2V0dGluZ3Mgc2F2ZWQgc3VjY2Vzc2Z1bGx5LicsICdzdWNjZXNzJyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgX3NldFNldHRpbmdzU3RhdHVzKGBGYWlsZWQgdG8gc2F2ZSBzZXR0aW5nczogJHtlcnJvci5tZXNzYWdlIHx8IGVycm9yfWAsICdlcnJvcicpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChzYXZlQnRuKSB7XG4gICAgICBzYXZlQnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICBzYXZlQnRuLnRleHRDb250ZW50ID0gJ1NhdmUgU2V0dGluZ3MnO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBvcGVuU2V0dGluZ3NNb2RhbCgpIHtcbiAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR0aW5ncy1tb2RhbC1vdmVybGF5Jyk7XG4gIGlmICghb3ZlcmxheSkgcmV0dXJuO1xuICBvdmVybGF5LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIF9mb2N1c1N0YWNrLnB1c2goZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7XG4gIHNldEluaXRpYWxGb2N1cygnc2V0dGluZ3MtbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ3NldHRpbmdzLW1vZGFsLW92ZXJsYXknKTtcbiAgYXdhaXQgcmVsb2FkU2V0dGluZ3NNb2RhbCgpO1xufVxuXG5mdW5jdGlvbiBjbG9zZVNldHRpbmdzTW9kYWwoKSB7XG4gIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dGluZ3MtbW9kYWwtb3ZlcmxheScpO1xuICBpZiAob3ZlcmxheSkgb3ZlcmxheS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICByZXN0b3JlRm9jdXMoKTtcbn1cblxuLyoqXG4gKiBHZXQgYWxsIGZvY3VzYWJsZSBlbGVtZW50cyB3aXRoaW4gYSBjb250YWluZXIuXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBjb250YWluZXIgLSBUaGUgbW9kYWwgb3IgY29udGFpbmVyIGVsZW1lbnRcbiAqIEByZXR1cm5zIHtIVE1MRWxlbWVudFtdfSBBcnJheSBvZiBmb2N1c2FibGUgZWxlbWVudHNcbiAqL1xuZnVuY3Rpb24gZ2V0Rm9jdXNhYmxlRWxlbWVudHMoY29udGFpbmVyKSB7XG4gIGNvbnN0IGZvY3VzYWJsZVNlbGVjdG9ycyA9IFtcbiAgICAnYVtocmVmXScsICdidXR0b246bm90KFtkaXNhYmxlZF0pJywgJ2lucHV0Om5vdChbZGlzYWJsZWRdKScsXG4gICAgJ3RleHRhcmVhOm5vdChbZGlzYWJsZWRdKScsICdzZWxlY3Q6bm90KFtkaXNhYmxlZF0pJyxcbiAgICAnW3RhYmluZGV4XTpub3QoW3RhYmluZGV4PVwiLTFcIl0pJyxcbiAgXS5qb2luKCcsICcpO1xuICByZXR1cm4gQXJyYXkuZnJvbShjb250YWluZXIucXVlcnlTZWxlY3RvckFsbChmb2N1c2FibGVTZWxlY3RvcnMpKTtcbn1cblxuLyoqXG4gKiBTZXQgaW5pdGlhbCBmb2N1cyB0byB0aGUgZmlyc3QgZm9jdXNhYmxlIGVsZW1lbnQgaW4gYSBtb2RhbC5cbiAqIFByaW9yaXRpemVzIGVsZW1lbnRzIHdpdGggaWQ9XCJbbW9kYWxJZF0tZm9jdXMtdGFyZ2V0XCIgaWYgcHJlc2VudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RhbElkIC0gSUQgb2YgdGhlIG1vZGFsXG4gKi9cbmZ1bmN0aW9uIHNldEluaXRpYWxGb2N1cyhtb2RhbElkKSB7XG4gIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobW9kYWxJZCk7XG4gIGlmICghbW9kYWwpIHJldHVybjtcblxuICAvLyBUcnkgdG8gZm9jdXMgYW4gZXhwbGljaXQgdGFyZ2V0IChlLmcuLCBpbnB1dCBmaWVsZCB3aXRoIGNsYXNzL2lkKVxuICBjb25zdCBmb2N1c1RhcmdldCA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWZvY3VzLXRhcmdldD1cInRydWVcIl0nKSB8fFxuICAgICAgICAgICAgICAgICAgICAgIG1vZGFsLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W3R5cGU9XCJ0ZXh0XCJdJykgfHxcbiAgICAgICAgICAgICAgICAgICAgICBtb2RhbC5xdWVyeVNlbGVjdG9yKCdidXR0b24nKTtcblxuICBpZiAoZm9jdXNUYXJnZXQpIHtcbiAgICAvLyBTbWFsbCBkZWxheSB0byBlbnN1cmUgbW9kYWwgcmVuZGVyICsgYWN0dWFsIGRpc3BsYXlcbiAgICBzZXRUaW1lb3V0KCgpID0+IGZvY3VzVGFyZ2V0LmZvY3VzKCksIDUwKTtcbiAgfVxufVxuXG4vKipcbiAqIFRyYXAgZm9jdXMgd2l0aGluIGEgbW9kYWwgdXNpbmcgVGFiL1NoaWZ0K1RhYi5cbiAqIFByZXZlbnRzIHVzZXIgdGFiYmluZyB0byBlbGVtZW50cyBvdXRzaWRlIHRoZSBtb2RhbC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RhbElkIC0gSUQgb2YgdGhlIG1vZGFsXG4gKi9cbmZ1bmN0aW9uIHRyYXBGb2N1cyhtb2RhbElkKSB7XG4gIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobW9kYWxJZCk7XG4gIGlmICghbW9kYWwpIHJldHVybjtcblxuICBjb25zdCBmb2N1c2FibGVFbGVtZW50cyA9IGdldEZvY3VzYWJsZUVsZW1lbnRzKG1vZGFsKTtcbiAgaWYgKGZvY3VzYWJsZUVsZW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIGNvbnN0IGZpcnN0RWxlbWVudCA9IGZvY3VzYWJsZUVsZW1lbnRzWzBdO1xuICBjb25zdCBsYXN0RWxlbWVudCA9IGZvY3VzYWJsZUVsZW1lbnRzW2ZvY3VzYWJsZUVsZW1lbnRzLmxlbmd0aCAtIDFdO1xuXG4gIGNvbnN0IGxpc3RlbmVyID0gKGUpID0+IHtcbiAgICBpZiAoZS5rZXkgIT09ICdUYWInKSByZXR1cm47XG5cbiAgICBjb25zdCBpc1NoaWZ0ID0gZS5zaGlmdEtleTtcbiAgICBjb25zdCBhY3RpdmVFbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG5cbiAgICBpZiAoaXNTaGlmdCkge1xuICAgICAgaWYgKGFjdGl2ZUVsID09PSBmaXJzdEVsZW1lbnQpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBsYXN0RWxlbWVudC5mb2N1cygpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoYWN0aXZlRWwgPT09IGxhc3RFbGVtZW50KSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZmlyc3RFbGVtZW50LmZvY3VzKCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBsaXN0ZW5lcik7XG4gIF9mb2N1c1RyYXBTdGFjay5wdXNoKGxpc3RlbmVyKTtcbn1cblxuLyoqXG4gKiBSZXN0b3JlIGZvY3VzIHRvIHRoZSBlbGVtZW50IHRoYXQgb3BlbmVkIHRoZSBtb2RhbC5cbiAqL1xuZnVuY3Rpb24gcmVzdG9yZUZvY3VzKCkge1xuICBjb25zdCBlbCA9IF9mb2N1c1N0YWNrLnBvcCgpO1xuICBpZiAoZWwgJiYgdHlwZW9mIGVsLmZvY3VzID09PSAnZnVuY3Rpb24nKSBlbC5mb2N1cygpO1xuXG4gIGNvbnN0IGxpc3RlbmVyID0gX2ZvY3VzVHJhcFN0YWNrLnBvcCgpO1xuICBpZiAobGlzdGVuZXIpIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBsaXN0ZW5lcik7XG59XG5cbmZ1bmN0aW9uIHB1c2hGb2N1c1N0YWNrKGVsKSB7XG4gIF9mb2N1c1N0YWNrLnB1c2goZWwgfHwgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7XG59XG5cbi8qKiBNYXBzIGVhY2ggd29ya2Zsb3cgc3RhZ2UgKHRvcCBiYXIpIHRvIHRoZSB0YWJzIHNob3duIGluIHRoZSBzZWNvbmQgbmF2IGJhci4gKi9cbmNvbnN0IFNUQUdFX1RBQlMgPSB7XG4gIGpvYjogICAgICAgICAgICBbJ2pvYicsICdtYXN0ZXInXSxcbiAgYW5hbHlzaXM6ICAgICAgIFsnYW5hbHlzaXMnXSxcbiAgY3VzdG9taXphdGlvbnM6IFsnZ29hbHMnLCAncXVlc3Rpb25zJywgJ2V4cC1yZXZpZXcnLCAnYWNoLWVkaXRvcicsICdza2lsbHMtcmV2aWV3JywgJ2FjaGlldmVtZW50cy1yZXZpZXcnLCAndGFnbGluZS1yZXZpZXcnLCAnc3VtbWFyeS1yZXZpZXcnLCAncHVibGljYXRpb25zLXJldmlldycsICdhdHMtc2NvcmUnXSxcbiAgcmV3cml0ZTogICAgICAgIFsncmV3cml0ZSddLFxuICBzcGVsbDogICAgICAgICAgWydzcGVsbCddLFxuICBsYXlvdXQ6ICAgICAgICAgWydsYXlvdXQnXSxcbiAgZG93bmxvYWQ6ICAgICAgIFsnZmluYWxfZ2VuZXJhdGUnLCAnZG93bmxvYWQnXSxcbiAgY292ZXJfbGV0dGVyOiAgIFsnY292ZXItbGV0dGVyJ10sXG4gIHNjcmVlbmluZzogICAgICBbJ3NjcmVlbmluZyddLFxuICBpbnRlcnZpZXdfcHJlcDogWydpbnRlcnZpZXctcHJlcCddLFxuICB0aGFua195b3U6ICAgICAgWyd0aGFuay15b3UnXSxcbiAgaGFydmVzdDogICAgICAgIFsnaGFydmVzdCddLFxufTtcblxuLyoqXG4gKiBDdXN0b20gY29uZmlybSBkaWFsb2cgXHUyMDE0IHJldHVybnMgYSBQcm9taXNlPGJvb2xlYW4+LlxuICogUmVwbGFjZXMgYnJvd3NlciBjb25maXJtKCkgd2hpY2ggY2FuIGJlIHNpbGVudGx5IHN1cHByZXNzZWQgb25jZSB0aGUgdXNlclxuICogY2hlY2tzIFwiUHJldmVudCB0aGlzIHBhZ2UgZnJvbSBjcmVhdGluZyBhZGRpdGlvbmFsIGRpYWxvZ3NcIi5cbiAqXG4gKiBVc2FnZTogIGlmIChhd2FpdCBjb25maXJtRGlhbG9nKCdBcmUgeW91IHN1cmU/JykpIHsgLi4uIH1cbiAqL1xuZnVuY3Rpb24gY29uZmlybURpYWxvZyhtZXNzYWdlLCB7IGNvbmZpcm1MYWJlbCA9ICdPSycsIGNhbmNlbExhYmVsID0gJ0NhbmNlbCcsIGRhbmdlciA9IGZhbHNlIH0gPSB7fSkge1xuICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgY29uc3QgcHJldmlvdXNGb2N1cyA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG5cbiAgICAvLyBSZXVzZSBvciBjcmVhdGUgdGhlIHNoYXJlZCBvdmVybGF5IGVsZW1lbnRcbiAgICBsZXQgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb25maXJtLWRpYWxvZy1vdmVybGF5Jyk7XG4gICAgaWYgKCFvdmVybGF5KSB7XG4gICAgICBvdmVybGF5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBvdmVybGF5LmlkID0gJ2NvbmZpcm0tZGlhbG9nLW92ZXJsYXknO1xuICAgICAgb3ZlcmxheS5zdHlsZS5jc3NUZXh0ID1cbiAgICAgICAgJ2Rpc3BsYXk6bm9uZTsgcG9zaXRpb246Zml4ZWQ7IGluc2V0OjA7IGJhY2tncm91bmQ6cmdiYSgwLDAsMCwwLjQ1KTsgei1pbmRleDo5OTk5OycgK1xuICAgICAgICAnYWxpZ24taXRlbXM6Y2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyOyc7XG4gICAgICBvdmVybGF5LmlubmVySFRNTCA9XG4gICAgICAgICc8ZGl2IGlkPVwiY29uZmlybS1kaWFsb2ctYm94XCIgcm9sZT1cImRpYWxvZ1wiIGFyaWEtbW9kYWw9XCJ0cnVlXCInICtcbiAgICAgICAgJyBhcmlhLWxhYmVsbGVkYnk9XCJjb25maXJtLWRpYWxvZy1tc2dcIicgK1xuICAgICAgICAnIHN0eWxlPVwiYmFja2dyb3VuZDojZmZmOyBib3JkZXItcmFkaXVzOjhweDsgcGFkZGluZzoyNHB4IDI4cHg7JyArXG4gICAgICAgICdtYXgtd2lkdGg6NDAwcHg7IHdpZHRoOjkwJTsgYm94LXNoYWRvdzowIDhweCAzMnB4IHJnYmEoMCwwLDAsMC4xOCk7IGZvbnQtZmFtaWx5OmluaGVyaXQ7XCI+JyArXG4gICAgICAgICc8cCBpZD1cImNvbmZpcm0tZGlhbG9nLW1zZ1wiIHN0eWxlPVwibWFyZ2luOjAgMCAyMHB4OyBmb250LXNpemU6MC45NWVtOyBjb2xvcjojMWUyOTNiOyB3aGl0ZS1zcGFjZTpwcmUtd3JhcDtcIj48L3A+JyArXG4gICAgICAgICc8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4OyBnYXA6OHB4OyBqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmQ7XCI+JyArXG4gICAgICAgICc8YnV0dG9uIGlkPVwiY29uZmlybS1kaWFsb2ctY2FuY2VsXCIgc3R5bGU9XCJwYWRkaW5nOjZweCAxNnB4OyBib3JkZXI6MXB4IHNvbGlkICNjYmQ1ZTE7JyArXG4gICAgICAgICdib3JkZXItcmFkaXVzOjVweDsgYmFja2dyb3VuZDojZjhmYWZjOyBjdXJzb3I6cG9pbnRlcjsgY29sb3I6IzQ3NTU2OTtcIj48L2J1dHRvbj4nICtcbiAgICAgICAgJzxidXR0b24gaWQ9XCJjb25maXJtLWRpYWxvZy1va1wiIHN0eWxlPVwicGFkZGluZzo2cHggMTZweDsgYm9yZGVyOm5vbmU7JyArXG4gICAgICAgICdib3JkZXItcmFkaXVzOjVweDsgY3Vyc29yOnBvaW50ZXI7IGNvbG9yOiNmZmY7IGZvbnQtd2VpZ2h0OjYwMDtcIj48L2J1dHRvbj4nICtcbiAgICAgICAgJzwvZGl2PjwvZGl2Pic7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG92ZXJsYXkpO1xuICAgIH1cblxuICAgIGNvbnN0IG9rQnRuICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb25maXJtLWRpYWxvZy1vaycpO1xuICAgIGNvbnN0IGNhbmNlbEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb25maXJtLWRpYWxvZy1jYW5jZWwnKTtcbiAgICBjb25zdCBtc2dFbCAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29uZmlybS1kaWFsb2ctbXNnJyk7XG5cbiAgICBtc2dFbC50ZXh0Q29udGVudCAgICAgICAgICA9IG1lc3NhZ2U7XG4gICAgb2tCdG4udGV4dENvbnRlbnQgICAgICAgICAgPSBjb25maXJtTGFiZWw7XG4gICAgY2FuY2VsQnRuLnRleHRDb250ZW50ICAgICAgPSBjYW5jZWxMYWJlbDtcbiAgICBva0J0bi5zdHlsZS5iYWNrZ3JvdW5kICAgICA9IGRhbmdlciA/ICcjZGMyNjI2JyA6ICcjM2I4MmY2JztcblxuICAgIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICBva0J0bi5mb2N1cygpO1xuXG4gICAgLy8gRm9jdXMgdHJhcCBcdTIwMTQga2VlcCBUYWIvU2hpZnQrVGFiIGluc2lkZSB0aGUgdHdvIGJ1dHRvbnNcbiAgICBjb25zdCB0cmFwRm9jdXMgPSAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ICE9PSAnVGFiJykgcmV0dXJuO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgY29uc3QgZm9jdXNlZCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoZS5zaGlmdEtleSkge1xuICAgICAgICAoZm9jdXNlZCA9PT0gY2FuY2VsQnRuID8gb2tCdG4gOiBjYW5jZWxCdG4pLmZvY3VzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAoZm9jdXNlZCA9PT0gb2tCdG4gPyBjYW5jZWxCdG4gOiBva0J0bikuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIG92ZXJsYXkuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRyYXBGb2N1cyk7XG5cbiAgICBjb25zdCBmaW5pc2ggPSAocmVzdWx0KSA9PiB7XG4gICAgICBvdmVybGF5LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICBvdmVybGF5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0cmFwRm9jdXMpO1xuICAgICAgLy8gUmVtb3ZlIGxpc3RlbmVycyB0byBhdm9pZCBzdGFja2luZyBoYW5kbGVyc1xuICAgICAgb2tCdG4ucmVwbGFjZVdpdGgob2tCdG4uY2xvbmVOb2RlKHRydWUpKTtcbiAgICAgIGNhbmNlbEJ0bi5yZXBsYWNlV2l0aChjYW5jZWxCdG4uY2xvbmVOb2RlKHRydWUpKTtcbiAgICAgIGlmIChwcmV2aW91c0ZvY3VzICYmIHR5cGVvZiBwcmV2aW91c0ZvY3VzLmZvY3VzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHByZXZpb3VzRm9jdXMuZm9jdXMoKTtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICB9O1xuXG4gICAgLy8gRXNjYXBlIGtleSBjYW5jZWxzXG4gICAgb3ZlcmxheS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGUpID0+IHsgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgZmluaXNoKGZhbHNlKTsgfSwgeyBvbmNlOiB0cnVlIH0pO1xuXG4gICAgLy8gUmViaW5kIGNsb25lZCBidXR0b25zXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbmZpcm0tZGlhbG9nLW9rJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAgICAgKCkgPT4gZmluaXNoKHRydWUpLCAgeyBvbmNlOiB0cnVlIH0pO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb25maXJtLWRpYWxvZy1jYW5jZWwnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IGZpbmlzaChmYWxzZSksIHsgb25jZTogdHJ1ZSB9KTtcbiAgICBvdmVybGF5LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZSA9PiB7IGlmIChlLnRhcmdldCA9PT0gb3ZlcmxheSkgZmluaXNoKGZhbHNlKTsgfSwgeyBvbmNlOiB0cnVlIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplIHRoZSBhcHBsaWNhdGlvbiBvbiBET00gcmVhZHkuXG4gKiBTZXRzIHVwIGV2ZW50IGxpc3RlbmVycywgcmVzdG9yZXMgc2Vzc2lvbiwgYW5kIGxvYWRzIGluaXRpYWwgdGFiLlxuICovXG4vKipcbiAqIFNldCB1cCBhbGwgZ2xvYmFsIGV2ZW50IGxpc3RlbmVycy5cbiAqL1xuZnVuY3Rpb24gc2V0dXBFdmVudExpc3RlbmVycygpIHtcbiAgLy8gVGFiIGJ1dHRvbnNcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnRhYicpLmZvckVhY2godGFiID0+IHtcbiAgICB0YWIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgY29uc3QgdGFiTmFtZSA9IGUudGFyZ2V0LmlkLnJlcGxhY2UoJ3RhYi0nLCAnJyk7XG4gICAgICBzd2l0Y2hUYWIodGFiTmFtZSk7XG4gICAgfSk7XG5cbiAgICAvLyBLZXlib2FyZCBuYXZpZ2F0aW9uIGZvciB0YWJzIChXQ0FHIDIuMSBBQSB0YWJsaXN0IHBhdHRlcm4pXG4gICAgdGFiLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4ge1xuICAgICAgLy8gRW50ZXIvU3BhY2UgYWN0aXZhdGUgdGhlIGZvY3VzZWQgdGFiXG4gICAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicgfHwgZS5rZXkgPT09ICcgJykge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUudGFyZ2V0LmNsaWNrKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIEFycm93L0hvbWUvRW5kIG5hdmlnYXRlIGFuZCBhY3RpdmF0ZVxuICAgICAgaWYgKFsnQXJyb3dMZWZ0JywgJ0Fycm93UmlnaHQnLCAnSG9tZScsICdFbmQnXS5pbmNsdWRlcyhlLmtleSkpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjb25zdCB0YWJzID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudGFiOm5vdChbc3R5bGUqPVwiZGlzcGxheTogbm9uZVwiXSknKSk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IHRhYnMuaW5kZXhPZihlLnRhcmdldCk7XG5cbiAgICAgICAgbGV0IG5leHRUYWI7XG4gICAgICAgIGlmIChlLmtleSA9PT0gJ0Fycm93TGVmdCcgfHwgZS5rZXkgPT09ICdIb21lJykge1xuICAgICAgICAgIG5leHRUYWIgPSBlLmtleSA9PT0gJ0hvbWUnID8gdGFic1swXSA6IHRhYnNbKGN1cnJlbnRJbmRleCAtIDEgKyB0YWJzLmxlbmd0aCkgJSB0YWJzLmxlbmd0aF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV4dFRhYiA9IGUua2V5ID09PSAnRW5kJyA/IHRhYnNbdGFicy5sZW5ndGggLSAxXSA6IHRhYnNbKGN1cnJlbnRJbmRleCArIDEpICUgdGFicy5sZW5ndGhdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5leHRUYWIpIHtcbiAgICAgICAgICBuZXh0VGFiLmZvY3VzKCk7XG4gICAgICAgICAgbmV4dFRhYi5jbGljaygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIE1lc3NhZ2UgaW5wdXQgKEVudGVyIGtleSB0byBzZW5kKVxuICBjb25zdCBtZXNzYWdlSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWVzc2FnZS1pbnB1dCcpO1xuICBpZiAobWVzc2FnZUlucHV0KSB7XG4gICAgbWVzc2FnZUlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXByZXNzJywgKGUpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJyAmJiAhZS5zaGlmdEtleSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcy5zZW5kTWVzc2FnZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGdsb2JhbFRoaXMuc2VuZE1lc3NhZ2UoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gTW9kYWwgY2xvc2Ugb24gRVNDIGtleVxuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGUpID0+IHtcbiAgICBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICBjbG9zZUFsbE1vZGFscygpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gQ2xvc2UgbW9kYWxzIG9uIGJhY2tncm91bmQgY2xpY2tcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW3JvbGU9XCJkaWFsb2dcIl0nKS5mb3JFYWNoKG1vZGFsID0+IHtcbiAgICBtb2RhbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICBpZiAoZS50YXJnZXQgPT09IG1vZGFsKSB7XG4gICAgICAgIGNsb3NlTW9kYWwobW9kYWwuaWQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdGhlIHN0YWdlIHRoYXQgb3ducyBhIGdpdmVuIHRhYiwgb3IgbnVsbCBpZiB1bm1hcHBlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWJcbiAqIEByZXR1cm5zIHtzdHJpbmd8bnVsbH1cbiAqL1xuZnVuY3Rpb24gZ2V0U3RhZ2VGb3JUYWIodGFiKSB7XG4gIGZvciAoY29uc3QgW3N0YWdlLCB0YWJzXSBvZiBPYmplY3QuZW50cmllcyhTVEFHRV9UQUJTKSkge1xuICAgIGlmICh0YWJzLmluY2x1ZGVzKHRhYikpIHJldHVybiBzdGFnZTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0VmlzaWJsZVN0YWdlKCkge1xuICBjb25zdCBhY3RpdmVUYWIgPSBzdGF0ZU1hbmFnZXIuZ2V0Q3VycmVudFRhYigpO1xuICByZXR1cm4gZ2V0U3RhZ2VGb3JUYWIoYWN0aXZlVGFiKSB8fCBnZXRXb3JrZmxvd1N0ZXBGb3JQaGFzZShzdGF0ZU1hbmFnZXIuZ2V0UGhhc2UoKSk7XG59XG5cbi8qKlxuICogU2hvdy9oaWRlIHRoZSBzY3JvbGwgYXJyb3cgYnV0dG9ucyBiYXNlZCBvbiB3aGV0aGVyIHRoZSB0YWIgYmFyIGlzIHNjcm9sbGFibGUuXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZVRhYlNjcm9sbEJ1dHRvbnMoKSB7XG4gIGNvbnN0IHRhYkJhciAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFiLWJhcicpO1xuICBjb25zdCBsZWZ0QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYi1zY3JvbGwtbGVmdCcpO1xuICBjb25zdCByaWdodEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWItc2Nyb2xsLXJpZ2h0Jyk7XG4gIGlmICghdGFiQmFyIHx8ICFsZWZ0QnRuIHx8ICFyaWdodEJ0bikgcmV0dXJuO1xuICBsZWZ0QnRuLnN0eWxlLmRpc3BsYXkgID0gdGFiQmFyLnNjcm9sbExlZnQgPiAwID8gJycgOiAnbm9uZSc7XG4gIHJpZ2h0QnRuLnN0eWxlLmRpc3BsYXkgPSB0YWJCYXIuc2Nyb2xsTGVmdCA8IHRhYkJhci5zY3JvbGxXaWR0aCAtIHRhYkJhci5jbGllbnRXaWR0aCAtIDEgPyAnJyA6ICdub25lJztcbn1cblxuLyoqXG4gKiBTaG93IG9ubHkgdGhlIHRhYnMgdGhhdCBiZWxvbmcgdG8gdGhlIGdpdmVuIHN0YWdlIGluIHRoZSBzZWNvbmQgbmF2IGJhci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzdGFnZSAtIEtleSBmcm9tIFNUQUdFX1RBQlNcbiAqL1xuZnVuY3Rpb24gdXBkYXRlVGFiQmFyRm9yU3RhZ2Uoc3RhZ2UpIHtcbiAgY29uc3Qgc3RhZ2VUYWJzID0gU1RBR0VfVEFCU1tzdGFnZV0gfHwgW107XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50YWInKS5mb3JFYWNoKHRhYiA9PiB7XG4gICAgdGFiLnN0eWxlLmRpc3BsYXkgPSBzdGFnZVRhYnMuaW5jbHVkZXModGFiLmRhdGFzZXQudGFiKSA/ICcnIDogJ25vbmUnO1xuICB9KTtcbiAgLy8gUmVzZXQgc2Nyb2xsIHBvc2l0aW9uIHRvIHNob3cgYWN0aXZlIHRhYiwgdGhlbiByZWZyZXNoIGFycm93IHZpc2liaWxpdHlcbiAgY29uc3QgdGFiQmFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYi1iYXInKTtcbiAgaWYgKHRhYkJhcikgdGFiQmFyLnNjcm9sbExlZnQgPSAwO1xuICB1cGRhdGVUYWJTY3JvbGxCdXR0b25zKCk7XG59XG5cbi8vIGxvYWRUYWJDb250ZW50KCkgbGl2ZXMgaW4gd2ViL3Jldmlldy10YWJsZS1iYXNlLmpzLCB3aGljaCBvd25zIHRoZVxuLy8gZnVsbCB+MjAtY2FzZSB0YWIgZGlzcGF0Y2ggKHRoaXMgZmlsZSdzIGNvcHkgb25seSBldmVyIGhhbmRsZWQgNSBvZiB0aGVtXG4vLyBhbmQgd2FzIG5ldmVyIGNhbGxlZCBpbnRlcm5hbGx5IFx1MjAxNCBkZWFkIGNvZGUsIHN1cGVyc2VkZWQgb25jZSB0aGUgdGFiXG4vLyBzeXN0ZW0gZ3JldykuIHJldmlldy10YWJsZS1iYXNlLmpzJ3MgdmVyc2lvbiBub3cgY2FycmllcyB0aGUgc2FtZVxuLy8gc2FmZSB0ZXh0Q29udGVudC1iYXNlZCBlcnJvciByZW5kZXJpbmcgdGhpcyBjb3B5IGhhZDsgc2VlIGl0cyBvd25cbi8vIHRyeS9jYXRjaC4gUmVtb3ZlZCBoZXJlIHJhdGhlciB0aGFuIGxlZnQgdG8gZHJpZnQgZnVydGhlciBvdXQgb2Ygc3luYy5cblxuLyoqXG4gKiBUb2dnbGUgY29sbGFwc2libGUgY2hhdCBwYW5lbCAoaW50ZXJhY3Rpb24gYXJlYSkuXG4gKi9cbmZ1bmN0aW9uIHRvZ2dsZUNoYXQoKSB7XG4gIGNvbnN0IGludGVyYWN0aW9uQXJlYSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5pbnRlcmFjdGlvbi1hcmVhJyk7XG4gIGNvbnN0IHZpZXdlckFyZWEgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudmlld2VyLWFyZWEnKTtcblxuICBpZiAoaW50ZXJhY3Rpb25BcmVhKSB7XG4gICAgY29uc3QgaXNDb2xsYXBzZWQgPSBpbnRlcmFjdGlvbkFyZWEuY2xhc3NMaXN0LnRvZ2dsZSgnY29sbGFwc2VkJyk7XG4gICAgaWYgKHZpZXdlckFyZWEpIHtcbiAgICAgIHZpZXdlckFyZWEuc3R5bGUuZmxleCA9IGlzQ29sbGFwc2VkID8gJzEgMSAxMDAlJyA6ICcwIDEgNjAlJztcbiAgICB9XG4gICAgLy8gS2VlcCBhcmlhLWxhYmVsIGFuZCBhcmlhLWV4cGFuZGVkIGluIHN5bmMgd2l0aCBjb2xsYXBzZWQgc3RhdGVcbiAgICBjb25zdCB0b2dnbGVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9nZ2xlLWNoYXQnKTtcbiAgICBpZiAodG9nZ2xlQnRuKSB7XG4gICAgICB0b2dnbGVCdG4uc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgU3RyaW5nKCFpc0NvbGxhcHNlZCkpO1xuICAgICAgdG9nZ2xlQnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIGlzQ29sbGFwc2VkID8gJ0V4cGFuZCBjaGF0IHBhbmVsJyA6ICdDb2xsYXBzZSBjaGF0IHBhbmVsJyk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShTdG9yYWdlS2V5cy5DSEFUX0NPTExBUFNFRCwgaXNDb2xsYXBzZWQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZy53YXJuKCdDb3VsZCBub3Qgc2F2ZSBjaGF0IHN0YXRlJyk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogT3BlbiBhIG1vZGFsIGJ5IElELlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGFsSWQgLSBJRCBvZiBtb2RhbCBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIG9wZW5Nb2RhbChtb2RhbElkKSB7XG4gIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobW9kYWxJZCk7XG4gIGlmIChtb2RhbCkge1xuICAgIC8vIFNhdmUgZm9jdXMgYmVmb3JlIG9wZW5pbmcgbW9kYWxcbiAgICBfZm9jdXNTdGFjay5wdXNoKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpO1xuXG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgndmlzaWJsZScpO1xuICAgIG1vZGFsLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAnZmFsc2UnKTtcbiAgICAvLyBMb2NrIGJvZHkgc2Nyb2xsXG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuXG4gICAgLy8gU2V0IGluaXRpYWwgZm9jdXMgYW5kIHRyYXAgZm9jdXMgd2l0aGluIG1vZGFsXG4gICAgc2V0SW5pdGlhbEZvY3VzKG1vZGFsSWQpO1xuICAgIHRyYXBGb2N1cyhtb2RhbElkKTtcbiAgfVxufVxuXG4vKipcbiAqIENsb3NlIGEgbW9kYWwgYnkgSUQuXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kYWxJZCAtIElEIG9mIG1vZGFsIGVsZW1lbnRcbiAqL1xuZnVuY3Rpb24gY2xvc2VNb2RhbChtb2RhbElkKSB7XG4gIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobW9kYWxJZCk7XG4gIGlmIChtb2RhbCkge1xuICAgIGlmIChtb2RhbC5kYXRhc2V0LmRpc21pc3NEaXNhYmxlZCA9PT0gJzEnKSByZXR1cm47XG4gICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZScpO1xuICAgIG1vZGFsLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xuICAgIC8vIFJlc3RvcmUgYm9keSBzY3JvbGxcbiAgICBpZiAoIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tyb2xlPVwiZGlhbG9nXCJdLnZpc2libGUnKSkge1xuICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICcnO1xuICAgIH1cbiAgICAvLyBSZXN0b3JlIGZvY3VzXG4gICAgcmVzdG9yZUZvY3VzKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBDbG9zZSBhbGwgb3BlbiBtb2RhbHMuXG4gKi9cbmZ1bmN0aW9uIGNsb3NlQWxsTW9kYWxzKCkge1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbcm9sZT1cImRpYWxvZ1wiXScpLmZvckVhY2gobW9kYWwgPT4ge1xuICAgIGlmIChtb2RhbC5kYXRhc2V0LmRpc21pc3NEaXNhYmxlZCA9PT0gJzEnKSByZXR1cm47XG4gICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZScpO1xuICAgIG1vZGFsLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xuICAgIGlmIChtb2RhbC5zdHlsZS5kaXNwbGF5ICYmIG1vZGFsLnN0eWxlLmRpc3BsYXkgIT09ICdub25lJykge1xuICAgICAgbW9kYWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9XG4gIH0pO1xuICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJyc7XG4gIC8vIFJlc3RvcmUgZm9jdXNcbiAgcmVzdG9yZUZvY3VzKCk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBNb2RlbCBzZWxlY3RvciBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxubGV0IF9tb2RlbERhdGEgPSBudWxsOyAvLyBjYWNoZWQgZnJvbSBsYXN0IGxvYWRNb2RlbFNlbGVjdG9yKCkgY2FsbFxubGV0IF9tb2RlbERhdGFUYWJsZSA9IG51bGw7XG5sZXQgX3NlbGVjdGVkTW9kZWxQcm92aWRlcnMgPSBuZXcgU2V0KCk7XG5sZXQgX21vZGVsU2VsZWN0b3JMb2FkaW5nID0gZmFsc2U7ICAgLy8gZ3VhcmQ6IGxvYWRNb2RlbFNlbGVjdG9yKCkgaW4gZmxpZ2h0XG5sZXQgX2NhdGFsb2dSZWZyZXNoaW5nID0gZmFsc2U7ICAgICAgLy8gZ3VhcmQ6IF9yZWZyZXNoTW9kZWxDYXRhbG9nRm9yU2VsZWN0aW9uKCkgaW4gZmxpZ2h0XG5sZXQgX2NhdGFsb2dSZWZyZXNoUGVuZGluZyA9IGZhbHNlOyAgLy8gcXVldWUgb25lIHJlcnVuIHdoZW4gdG9nZ2xlcyBoYXBwZW4gbWlkLXJlZnJlc2hcbmxldCBfc2hvd0Z1bGxNb2RlbENhdGFsb2cgPSBmYWxzZTtcbmxldCBfY29waWxvdEF1dGhQb2xsVGltZXIgPSBudWxsO1xubGV0IF9tb2RlbFdpemFyZFN0ZXAgPSAxO1xubGV0IF9tb2RlbFdpemFyZFNlbGVjdGVkUHJvdmlkZXIgPSBudWxsO1xuXG5cbmZ1bmN0aW9uIF9nZXRNb2RlbFByZWZzRnJvbVN0b3JhZ2UoKSB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2F2ZWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShTdG9yYWdlS2V5cy5UQUJfREFUQSk7XG4gICAgcmV0dXJuIHNhdmVkID8gKEpTT04ucGFyc2Uoc2F2ZWQpIHx8IHt9KSA6IHt9O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4ge307XG4gIH1cbn1cblxuZnVuY3Rpb24gX3NhdmVNb2RlbFByZWZzVG9TdG9yYWdlKHBhdGNoKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VkID0gX2dldE1vZGVsUHJlZnNGcm9tU3RvcmFnZSgpO1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFN0b3JhZ2VLZXlzLlRBQl9EQVRBLCBKU09OLnN0cmluZ2lmeSh7IC4uLnBhcnNlZCwgLi4ucGF0Y2ggfSkpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nLndhcm4oJ0ZhaWxlZCB0byBwZXJzaXN0IG1vZGVsIHByZWZlcmVuY2VzIGxvY2FsbHk6JywgZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2FwcGVuZFJlY2VudE1vZGVsKHByb3ZpZGVyLCBtb2RlbCkge1xuICBpZiAoIXByb3ZpZGVyIHx8ICFtb2RlbCkgcmV0dXJuO1xuICBjb25zdCBwYXJzZWQgPSBfZ2V0TW9kZWxQcmVmc0Zyb21TdG9yYWdlKCk7XG4gIGNvbnN0IGV4aXN0aW5nID0gQXJyYXkuaXNBcnJheShwYXJzZWQucmVjZW50TW9kZWxzKSA/IHBhcnNlZC5yZWNlbnRNb2RlbHMgOiBbXTtcbiAgY29uc3QgZmlsdGVyZWQgPSBleGlzdGluZy5maWx0ZXIoKGl0ZW0pID0+ICEoaXRlbS5wcm92aWRlciA9PT0gcHJvdmlkZXIgJiYgaXRlbS5tb2RlbCA9PT0gbW9kZWwpKTtcbiAgZmlsdGVyZWQudW5zaGlmdCh7IHByb3ZpZGVyLCBtb2RlbCB9KTtcbiAgX3NhdmVNb2RlbFByZWZzVG9TdG9yYWdlKHsgcmVjZW50TW9kZWxzOiBmaWx0ZXJlZC5zbGljZSgwLCA2KSB9KTtcbn1cblxuZnVuY3Rpb24gX3VwZGF0ZUxsbVN0YXR1c1BpbGwoa2luZCwgdGV4dCwgaWNvbiA9ICcnLCB0b29sdGlwID0gJycpIHtcbiAgY29uc3QgcGlsbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG0tc3RhdHVzLXBpbGwnKTtcbiAgY29uc3QgbGFiZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtLXN0YXR1cy1sYWJlbCcpO1xuICBjb25zdCBpY29uRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtLXN0YXR1cy1pY29uJyk7XG4gIGlmICghcGlsbCB8fCAhbGFiZWwpIHJldHVybjtcblxuICBjb25zdCBhbGlhc2VzID0ge1xuICAgIGF1dGhlbnRpY2F0ZWQ6ICdjb25uZWN0ZWQnLFxuICAgIHVuYXV0aGVudGljYXRlZDogJ3VuY29uZmlndXJlZCcsXG4gICAgcG9sbGluZzogJ2Nvbm5lY3RpbmcnLFxuICB9O1xuICBjb25zdCBub3JtYWxpemVkS2luZCA9IGFsaWFzZXNba2luZF0gfHwga2luZCB8fCAndW5jb25maWd1cmVkJztcbiAgY29uc3QgZGVmYXVsdFRvb2x0aXAgPSB7XG4gICAgdW5jb25maWd1cmVkOiAnTm8gcHJvdmlkZXIvbW9kZWwgaXMgY29uZmlndXJlZCB5ZXQuJyxcbiAgICBjb25maWd1cmVkOiAnUHJvdmlkZXIvbW9kZWwgaXMgY29uZmlndXJlZC4gQ29ubmVjdGl2aXR5IG5vdCB5ZXQgdmVyaWZpZWQuJyxcbiAgICBjb25uZWN0aW5nOiAnVGVzdGluZyBvciBjb25uZWN0aW5nIHRvIHRoZSBzZWxlY3RlZCBwcm92aWRlci4nLFxuICAgIGNvbm5lY3RlZDogJ1Byb3ZpZGVyIHJlc3BvbmRlZCBzdWNjZXNzZnVsbHkgdG8gYSBsaXZlIHJlcXVlc3QuJyxcbiAgICAnYXV0aC1yZXF1aXJlZCc6ICdBdXRoZW50aWNhdGlvbiBpcyByZXF1aXJlZC4gQ2hlY2sgQVBJIGtleSBvciBzaWduIGluLicsXG4gICAgJ3JhdGUtbGltaXRlZCc6ICdSYXRlIGxpbWl0IHJlYWNoZWQuIFdhaXQgYmVmb3JlIHJldHJ5aW5nIHJlcXVlc3RzLicsXG4gICAgdW5hdmFpbGFibGU6ICdQcm92aWRlciBpcyB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZSBvciB1bnJlYWNoYWJsZS4nLFxuICAgIGVycm9yOiAnQ29ubmVjdGlvbiBmYWlsZWQuIE9wZW4gbW9kZWwgc2V0dGluZ3MgZm9yIGRldGFpbHMuJyxcbiAgfTtcbiAgcGlsbC5jbGFzc0xpc3QucmVtb3ZlKCdhdXRoZW50aWNhdGVkJywgJ3VuYXV0aGVudGljYXRlZCcsICdwb2xsaW5nJywgJ3VuY29uZmlndXJlZCcsICdjb25maWd1cmVkJywgJ2Nvbm5lY3RpbmcnLCAnY29ubmVjdGVkJywgJ2F1dGgtcmVxdWlyZWQnLCAncmF0ZS1saW1pdGVkJywgJ3VuYXZhaWxhYmxlJywgJ2Vycm9yJyk7XG4gIGlmIChub3JtYWxpemVkS2luZCkgcGlsbC5jbGFzc0xpc3QuYWRkKG5vcm1hbGl6ZWRLaW5kKTtcbiAgbGFiZWwudGV4dENvbnRlbnQgPSB0ZXh0O1xuICBjb25zdCBpY29uQnlLaW5kID0ge1xuICAgIHVuY29uZmlndXJlZDogJ1x1MjVDQicsXG4gICAgY29uZmlndXJlZDogJ1x1MjVENCcsXG4gICAgY29ubmVjdGluZzogJ1x1MjlENycsXG4gICAgY29ubmVjdGVkOiAnXHUyNzEzJyxcbiAgICAnYXV0aC1yZXF1aXJlZCc6ICdcdUQ4M0RcdUREMTEnLFxuICAgICdyYXRlLWxpbWl0ZWQnOiAnXHUyM0YzJyxcbiAgICB1bmF2YWlsYWJsZTogJ1x1MjYwMScsXG4gICAgZXJyb3I6ICdcdTI2QTAnLFxuICB9O1xuICBjb25zdCBpY29uVGV4dCA9IGljb24gfHwgaWNvbkJ5S2luZFtub3JtYWxpemVkS2luZF0gfHwgJ1x1MjZBMCc7XG4gIGlmIChpY29uRWwpIGljb25FbC50ZXh0Q29udGVudCA9IGljb25UZXh0O1xuICBjb25zdCB0b29sdGlwVGV4dCA9IHRvb2x0aXAgfHwgZGVmYXVsdFRvb2x0aXBbbm9ybWFsaXplZEtpbmRdIHx8ICcnO1xuICBwaWxsLnRpdGxlID0gdG9vbHRpcFRleHQ7XG4gIGlmIChpY29uRWwpIGljb25FbC50aXRsZSA9IHRvb2x0aXBUZXh0O1xuICBsYWJlbC50aXRsZSA9IHRvb2x0aXBUZXh0O1xufVxuXG5hc3luYyBmdW5jdGlvbiBsb2FkTW9kZWxTZWxlY3RvcigpIHtcbiAgaWYgKF9tb2RlbFNlbGVjdG9yTG9hZGluZykgcmV0dXJuO1xuICBfbW9kZWxTZWxlY3RvckxvYWRpbmcgPSB0cnVlO1xuICB0cnkge1xuICAgIF9tb2RlbERhdGEgPSBhd2FpdCBhcGlDYWxsKCdHRVQnLCAnL2FwaS9tb2RlbCcpO1xuICAgIC8vIElmIGJhY2tlbmQgZGlkbid0IHJldHVybiBhIHBlcnNpc3RlbnQgc2VsZWN0aW9uLCBwcmVmZXIgYSBsb2NhbGx5LXNhdmVkIGNob2ljZVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBzYXZlZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFN0b3JhZ2VLZXlzLlRBQl9EQVRBKTtcbiAgICAgIGlmIChzYXZlZCkge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHNhdmVkKTtcbiAgICAgICAgaWYgKHBhcnNlZCAmJiAhKF9tb2RlbERhdGEgJiYgX21vZGVsRGF0YS5wcm92aWRlcikgJiYgcGFyc2VkLmN1cnJlbnRNb2RlbFByb3ZpZGVyKSB7XG4gICAgICAgICAgX21vZGVsRGF0YSA9IF9tb2RlbERhdGEgfHwge307XG4gICAgICAgICAgX21vZGVsRGF0YS5wcm92aWRlciA9IHBhcnNlZC5jdXJyZW50TW9kZWxQcm92aWRlcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyc2VkICYmICEoX21vZGVsRGF0YSAmJiBfbW9kZWxEYXRhLm1vZGVsKSAmJiBwYXJzZWQuY3VycmVudE1vZGVsTmFtZSkge1xuICAgICAgICAgIF9tb2RlbERhdGEgPSBfbW9kZWxEYXRhIHx8IHt9O1xuICAgICAgICAgIF9tb2RlbERhdGEubW9kZWwgPSBwYXJzZWQuY3VycmVudE1vZGVsTmFtZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZy53YXJuKCdDb3VsZCBub3QgcmVhZCBzYXZlZCBtb2RlbCBmcm9tIGxvY2FsU3RvcmFnZTonLCBlKTtcbiAgICB9XG4gICAgY29uc3QgbGFiZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtY3VycmVudC1sYWJlbCcpO1xuICAgIGlmIChsYWJlbCkge1xuICAgICAgY29uc3QgcHJvdiAgPSBfbW9kZWxEYXRhLnByb3ZpZGVyO1xuICAgICAgY29uc3QgbW9kZWwgPSBfbW9kZWxEYXRhLm1vZGVsIHx8ICdcdTIwMTQnO1xuICAgICAgbGFiZWwudGV4dENvbnRlbnQgPSBwcm92ID8gYCR7cHJvdn0gXHUwMEI3ICR7bW9kZWx9YCA6IG1vZGVsO1xuICAgIH1cbiAgICBpZiAoX21vZGVsRGF0YSAmJiBfbW9kZWxEYXRhLnByb3ZpZGVyKSB7XG4gICAgICBfc2VsZWN0ZWRNb2RlbFByb3ZpZGVycyA9IG5ldyBTZXQoW19tb2RlbERhdGEucHJvdmlkZXJdKTtcbiAgICAgIF91cGRhdGVMbG1TdGF0dXNQaWxsKCdjb25maWd1cmVkJywgYCR7X21vZGVsRGF0YS5wcm92aWRlcn0gY29uZmlndXJlZGApO1xuICAgIH0gZWxzZSB7XG4gICAgICBfdXBkYXRlTGxtU3RhdHVzUGlsbCgndW5jb25maWd1cmVkJywgJ05vdCBjb25maWd1cmVkJyk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nLndhcm4oJ0NvdWxkIG5vdCBsb2FkIG1vZGVsIGxpc3Q6JywgZSk7XG4gIH0gZmluYWxseSB7XG4gICAgX21vZGVsU2VsZWN0b3JMb2FkaW5nID0gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gX3Byb3ZpZGVyU3RhZ2VMYWJlbChwcm92aWRlciwgY2FwYWJsZVNldCkge1xuICBjb25zdCBpc0NhcGFibGUgPSBjYXBhYmxlU2V0Lmhhcyhwcm92aWRlcik7XG4gIHJldHVybiBpc0NhcGFibGUgPyAnbGlzdF9tb2RlbHMnIDogJ2ZhbGxiYWNrJztcbn1cblxuZnVuY3Rpb24gX3Byb3ZpZGVyRGlzcGxheUxhYmVsKHByb3ZpZGVyKSB7XG4gIGNvbnN0IGRlcHJlY2F0ZWQgPSB7XG4gICAgJ2NvcGlsb3Qtb2F1dGgnOiAnQ29waWxvdCBPQXV0aCAoZGVwcmVjYXRlZCknLFxuICAgIGNvcGlsb3Q6ICdDb3BpbG90IChkZXByZWNhdGVkKScsXG4gICAgZ2l0aHViOiAnR2l0SHViIE1vZGVscyAoZGVwcmVjYXRlZCknLFxuICAgICdjb3BpbG90LXNkayc6ICdDb3BpbG90IFNESyAocmVjb21tZW5kZWQpJyxcbiAgfTtcbiAgaWYgKGRlcHJlY2F0ZWRbcHJvdmlkZXJdKSByZXR1cm4gZGVwcmVjYXRlZFtwcm92aWRlcl07XG4gIHJldHVybiBwcm92aWRlcjtcbn1cblxuZnVuY3Rpb24gX2dldFF1aWNrTW9kZWxDYW5kaWRhdGVzKHJvd3MpIHtcbiAgY29uc3QgcGFyc2VkID0gX2dldE1vZGVsUHJlZnNGcm9tU3RvcmFnZSgpO1xuICBjb25zdCByZWNlbnRzID0gQXJyYXkuaXNBcnJheShwYXJzZWQucmVjZW50TW9kZWxzKSA/IHBhcnNlZC5yZWNlbnRNb2RlbHMgOiBbXTtcbiAgY29uc3QgcmFua2VkID0gW107XG5cbiAgZm9yIChjb25zdCByZWNlbnQgb2YgcmVjZW50cykge1xuICAgIGNvbnN0IGhpdCA9IHJvd3MuZmluZCgocm93KSA9PiByb3cucHJvdmlkZXIgPT09IHJlY2VudC5wcm92aWRlciAmJiByb3cubW9kZWwgPT09IHJlY2VudC5tb2RlbCk7XG4gICAgaWYgKGhpdCkgcmFua2VkLnB1c2goaGl0KTtcbiAgfVxuXG4gIGNvbnN0IHBvcHVsYXIgPSBbLi4ucm93c11cbiAgICAuc29ydCgoYSwgYikgPT4ge1xuICAgICAgY29uc3QgYW0gPSBOdW1iZXIoYS5jb3BpbG90X211bHRpcGxpZXIgPz8gOTk5KTtcbiAgICAgIGNvbnN0IGJtID0gTnVtYmVyKGIuY29waWxvdF9tdWx0aXBsaWVyID8/IDk5OSk7XG4gICAgICBpZiAoYW0gIT09IGJtKSByZXR1cm4gYW0gLSBibTtcbiAgICAgIGNvbnN0IGFjID0gTnVtYmVyKGEuY29udGV4dF93aW5kb3cgfHwgMCk7XG4gICAgICBjb25zdCBiYyA9IE51bWJlcihiLmNvbnRleHRfd2luZG93IHx8IDApO1xuICAgICAgcmV0dXJuIGJjIC0gYWM7XG4gICAgfSk7XG5cbiAgZm9yIChjb25zdCBpdGVtIG9mIHBvcHVsYXIpIHtcbiAgICBpZiAoIXJhbmtlZC5zb21lKChyKSA9PiByLnByb3ZpZGVyID09PSBpdGVtLnByb3ZpZGVyICYmIHIubW9kZWwgPT09IGl0ZW0ubW9kZWwpKSB7XG4gICAgICByYW5rZWQucHVzaChpdGVtKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmFua2VkLnNsaWNlKDAsIDgpO1xufVxuXG5mdW5jdGlvbiBfcmVuZGVyUXVpY2tNb2RlbExpc3Qocm93cykge1xuICBjb25zdCBxdWlja0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLXF1aWNrLWxpc3QnKTtcbiAgaWYgKCFxdWlja0VsKSByZXR1cm47XG4gIHF1aWNrRWwuaW5uZXJIVE1MID0gJyc7XG5cbiAgY29uc3QgY2FuZGlkYXRlcyA9IF9nZXRRdWlja01vZGVsQ2FuZGlkYXRlcyhyb3dzIHx8IFtdKTtcbiAgZm9yIChjb25zdCBpdGVtIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICBjb25zdCBpc0FjdGl2ZSA9IGl0ZW0ucHJvdmlkZXIgPT09IF9tb2RlbERhdGE/LnByb3ZpZGVyICYmIGl0ZW0ubW9kZWwgPT09IF9tb2RlbERhdGE/Lm1vZGVsO1xuICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgIGJ1dHRvbi5jbGFzc05hbWUgPSAnaGVhZGVyLXBpbGwtYnRuJztcbiAgICBidXR0b24uc3R5bGUucGFkZGluZyA9ICc1cHggMTBweCc7XG4gICAgYnV0dG9uLnN0eWxlLmZvbnRTaXplID0gJzAuODJlbSc7XG4gICAgYnV0dG9uLnN0eWxlLmJhY2tncm91bmQgPSBpc0FjdGl2ZSA/ICcjZGJlYWZlJyA6ICcjZjhmYWZjJztcbiAgICBidXR0b24uc3R5bGUuY29sb3IgPSBpc0FjdGl2ZSA/ICcjMWUzYThhJyA6ICcjMzM0MTU1JztcbiAgICBidXR0b24uc3R5bGUuYm9yZGVyQ29sb3IgPSBpc0FjdGl2ZSA/ICcjOTNjNWZkJyA6ICcjY2JkNWUxJztcbiAgICBidXR0b24udGl0bGUgPSBgJHtpdGVtLnByb3ZpZGVyfSBcdTAwQjcgJHtpdGVtLm1vZGVsfWA7XG4gICAgYnV0dG9uLnRleHRDb250ZW50ID0gYCR7aXRlbS5wcm92aWRlcn0gXHUwMEI3ICR7aXRlbS5tb2RlbH1gO1xuICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHNldE1vZGVsKGl0ZW0ubW9kZWwsIGl0ZW0ucHJvdmlkZXIpO1xuICAgIH0pO1xuICAgIHF1aWNrRWwuYXBwZW5kQ2hpbGQoYnV0dG9uKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfc3luY0NhdGFsb2dWaXNpYmlsaXR5KCkge1xuICBjb25zdCB3cmFwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLWZ1bGwtdGFibGUtd3JhcCcpO1xuICBjb25zdCBzZWFyY2ggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtZ2xvYmFsLXNlYXJjaCcpO1xuICBjb25zdCB0b2dnbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtc2hvdy1hbGwtYnRuJyk7XG4gIGlmICh3cmFwKSB3cmFwLnN0eWxlLmRpc3BsYXkgPSBfc2hvd0Z1bGxNb2RlbENhdGFsb2cgPyAnJyA6ICdub25lJztcbiAgaWYgKHNlYXJjaCkgc2VhcmNoLnN0eWxlLmRpc3BsYXkgPSBfc2hvd0Z1bGxNb2RlbENhdGFsb2cgPyAnJyA6ICdub25lJztcbiAgaWYgKHRvZ2dsZSkgdG9nZ2xlLnRleHRDb250ZW50ID0gX3Nob3dGdWxsTW9kZWxDYXRhbG9nID8gJ0hpZGUgRnVsbCBDYXRhbG9nJyA6ICdTaG93IEZ1bGwgQ2F0YWxvZyc7XG59XG5cbmZ1bmN0aW9uIHRvZ2dsZU1vZGVsQ2F0YWxvZ1Zpc2liaWxpdHkoKSB7XG4gIF9zaG93RnVsbE1vZGVsQ2F0YWxvZyA9ICFfc2hvd0Z1bGxNb2RlbENhdGFsb2c7XG4gIF9zeW5jQ2F0YWxvZ1Zpc2liaWxpdHkoKTtcbn1cblxuLy8gX3JlbmRlckF1dGhTdGVwIFx1MjAxNCBjYWxsZWQgYnkgX3NldE1vZGVsV2l6YXJkU3RlcCB3aGVuIGVudGVyaW5nIFN0ZXAgMi5cbi8vIFJlbmRlcnMgcHJvdmlkZXItc3BlY2lmaWMgY29udGVudCBpbnRvICNtb2RlbC1hdXRoLXN0ZXAtY29udGVudCBhbmQgc2hvd3Ncbi8vIHRoZSBhcHByb3ByaWF0ZSBzdWItcGFuZWwgKGtleSBpbnB1dCwgZGV2aWNlLWZsb3csIENMSSBub3RpY2UsIG9yIG5vbmUpLlxuYXN5bmMgZnVuY3Rpb24gX3JlbmRlckF1dGhTdGVwKHByb3ZpZGVyKSB7XG4gIGNvbnN0IGNvbnRlbnQgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtYXV0aC1zdGVwLWNvbnRlbnQnKTtcbiAgY29uc3Qga2V5UGFuZWwgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1hdXRoLWtleS1wYW5lbCcpO1xuICBjb25zdCBkZXZQYW5lbCAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLWF1dGgtZGV2aWNlLXBhbmVsJyk7XG4gIGNvbnN0IGtleUlucHV0ICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtYXV0aC1rZXktaW5wdXQnKTtcbiAgY29uc3Qga2V5U3RhdHVzICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1hdXRoLWtleS1zdGF0dXMnKTtcblxuICBpZiAoIWNvbnRlbnQpIHJldHVybjtcblxuICAvLyBSZXNldCBzdWItcGFuZWxzXG4gIGlmIChrZXlQYW5lbCkgIGtleVBhbmVsLnN0eWxlLmRpc3BsYXkgID0gJ25vbmUnO1xuICBpZiAoZGV2UGFuZWwpICBkZXZQYW5lbC5zdHlsZS5kaXNwbGF5ICA9ICdub25lJztcbiAgaWYgKGtleUlucHV0KSAga2V5SW5wdXQudmFsdWUgPSAnJztcbiAgaWYgKGtleVN0YXR1cykga2V5U3RhdHVzLnRleHRDb250ZW50ID0gJyc7XG5cbiAgaWYgKCFwcm92aWRlcikge1xuICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gJzxwIHN0eWxlPVwiY29sb3I6IzY0NzQ4YjtcIj5TZWxlY3QgYSBwcm92aWRlciBpbiBTdGVwIDEgZmlyc3QuPC9wPic7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IGNyZWREYXRhID0gbnVsbDtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2goJy9hcGkvc2V0dGluZ3MvY3JlZGVudGlhbHMvc3RhdHVzJyk7XG4gICAgaWYgKHJlc3Aub2spIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwLmpzb24oKTtcbiAgICAgIGNyZWREYXRhID0gKGRhdGEucHJvdmlkZXJzIHx8IHt9KVtwcm92aWRlcl0gfHwgbnVsbDtcbiAgICB9XG4gIH0gY2F0Y2ggeyAvKiBub24tZmF0YWwgKi8gfVxuXG4gIGNvbnN0IGF1dGhUeXBlICAgPSBjcmVkRGF0YT8uYXV0aF90eXBlICB8fCAnYXBpX2tleSc7XG4gIGNvbnN0IGxhYmVsICAgICAgPSBjcmVkRGF0YT8ubGFiZWwgICAgICB8fCBwcm92aWRlcjtcbiAgY29uc3QgaGVscFRleHQgICA9IGNyZWREYXRhPy5oZWxwX3RleHQgIHx8ICcnO1xuICBjb25zdCBnZXRLZXlVcmwgID0gY3JlZERhdGE/LmdldF9rZXlfdXJsIHx8ICcnO1xuICBjb25zdCBpc1NldCAgICAgID0gY3JlZERhdGE/LmlzX3NldCAgICAgfHwgZmFsc2U7XG4gIGNvbnN0IHNvdXJjZSAgICAgPSBjcmVkRGF0YT8uc291cmNlICAgICB8fCAndW5zZXQnO1xuICBjb25zdCBlbnZWYXIgICAgID0gY3JlZERhdGE/LmVudl92YXIgICAgfHwgbnVsbDtcbiAgY29uc3QgaXNMb2NrZWQgICA9IGNyZWREYXRhPy5sb2NrZWQgICAgIHx8IGZhbHNlO1xuXG4gIGNvbnN0IGlzU2V0QmFkZ2UgPSBpc1NldFxuICAgID8gJzxzcGFuIHN0eWxlPVwiZGlzcGxheTppbmxpbmUtYmxvY2s7cGFkZGluZzoycHggOHB4O2JvcmRlci1yYWRpdXM6OTk5cHg7YmFja2dyb3VuZDojZDFmYWU1O2NvbG9yOiMwNjVmNDY7Zm9udC1zaXplOjAuOGVtO2ZvbnQtd2VpZ2h0OjYwMDtcIj4mIzEwMDAzOyBLZXkgc2F2ZWQ8L3NwYW4+J1xuICAgIDogJzxzcGFuIHN0eWxlPVwiZGlzcGxheTppbmxpbmUtYmxvY2s7cGFkZGluZzoycHggOHB4O2JvcmRlci1yYWRpdXM6OTk5cHg7YmFja2dyb3VuZDojZmVlMmUyO2NvbG9yOiM5OTFiMWI7Zm9udC1zaXplOjAuOGVtO2ZvbnQtd2VpZ2h0OjYwMDtcIj5Ob3QgY29uZmlndXJlZDwvc3Bhbj4nO1xuXG4gIC8vIFNvdXJjZSBsYWJlbCArIFx1MjREOCB0b29sdGlwIFx1MjAxNCBtaXJyb3JzIHRoZSBzZXR0aW5ncyBkaWFsb2cgcGF0dGVybi5cbiAgbGV0IHNvdXJjZUxhYmVsID0gJyc7XG4gIGxldCB0b29sdGlwVGV4dCA9ICcnO1xuICBpZiAoc291cmNlID09PSAnZW52Jykge1xuICAgIHNvdXJjZUxhYmVsID0gYFNvdXJjZTogZW52aXJvbm1lbnQgdmFyaWFibGUgKCR7ZW52VmFyIHx8ICdsb2NrZWQnfSlgO1xuICAgIHRvb2x0aXBUZXh0ID0gYEN1cnJlbnRseSBsb2FkZWQgZnJvbSB0aGUgJHtlbnZWYXJ9IGVudmlyb25tZW50IHZhcmlhYmxlLiBgICtcbiAgICAgIGBUbyBjaGFuZ2UgaXQgcGVybWFuZW50bHksIHVwZGF0ZSB5b3VyIHNoZWxsIGNvbmZpZyAoZS5nLiB+Ly56c2hyYykgYW5kIHJlc3RhcnQgdGhlIHNlcnZlci4gYCArXG4gICAgICBgWW91IGNhbiBzdGlsbCBzYXZlIGEgdmFsdWUgYmVsb3cgXHUyMDE0IGl0IHRha2VzIGVmZmVjdCBpbW1lZGlhdGVseSBidXQgd2lsbCBiZSBvdmVycmlkZGVuIGJ5IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBvbiBuZXh0IHJlc3RhcnQuYDtcbiAgfSBlbHNlIGlmIChzb3VyY2UgPT09ICdkb3RlbnYnKSB7XG4gICAgc291cmNlTGFiZWwgPSBgU291cmNlOiAuZW52IGZpbGUgKCR7ZW52VmFyIHx8ICdsb2NrZWQnfSlgO1xuICAgIHRvb2x0aXBUZXh0ID0gYEN1cnJlbnRseSBsb2FkZWQgZnJvbSAke2VudlZhcn0gaW4geW91ciAuZW52IGZpbGUuIGAgK1xuICAgICAgYFRvIGNoYW5nZSBpdCBwZXJtYW5lbnRseSwgZWRpdCB0aGUgLmVudiBmaWxlIGluIHRoZSBwcm9qZWN0IGRpcmVjdG9yeSBhbmQgcmVzdGFydCB0aGUgc2VydmVyLiBgICtcbiAgICAgIGBZb3UgY2FuIHN0aWxsIHNhdmUgYSB2YWx1ZSBiZWxvdyBcdTIwMTQgaXQgdGFrZXMgZWZmZWN0IGltbWVkaWF0ZWx5IGJ1dCB3aWxsIGJlIG92ZXJyaWRkZW4gYnkgLmVudiBvbiBuZXh0IHJlc3RhcnQuYDtcbiAgfSBlbHNlIGlmIChzb3VyY2UgPT09ICdjb25maWcnKSB7XG4gICAgc291cmNlTGFiZWwgPSAnU291cmNlOiBjb25maWcueWFtbCc7XG4gICAgdG9vbHRpcFRleHQgPSAnU3RvcmVkIGluIGNvbmZpZy55YW1sLiBVcGRhdGUgaXQgdXNpbmcgdGhlIGlucHV0IGJlbG93Lic7XG4gIH1cblxuICBjb25zdCBpbmZvSWNvbiA9IHRvb2x0aXBUZXh0XG4gICAgPyBgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIHRpdGxlPVwiJHtlc2NhcGVIdG1sKHRvb2x0aXBUZXh0KX1cIiBhcmlhLWxhYmVsPVwiV2hlcmUgaXMgdGhpcyBrZXkgc3RvcmVkP1wiIGAgK1xuICAgICAgYHN0eWxlPVwiYmFja2dyb3VuZDpub25lO2JvcmRlcjpub25lO2N1cnNvcjpoZWxwO2NvbG9yOiM2NDc0OGI7Zm9udC1zaXplOjAuODVlbTtwYWRkaW5nOjAgMnB4O3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtsaW5lLWhlaWdodDoxO1wiPlx1MjREODwvYnV0dG9uPmBcbiAgICA6ICcnO1xuXG4gIGNvbnN0IHNvdXJjZUxhYmVsSHRtbCA9IHNvdXJjZUxhYmVsXG4gICAgPyBgPHNwYW4gc3R5bGU9XCJtYXJnaW4tbGVmdDoxMHB4O2ZvbnQtc2l6ZTowLjhlbTtjb2xvcjoke2lzTG9ja2VkID8gJyNiNDUzMDknIDogJyM2NDc0OGInfTtcIj4ke2VzY2FwZUh0bWwoc291cmNlTGFiZWwpfSR7aW5mb0ljb259PC9zcGFuPmBcbiAgICA6ICcnO1xuXG4gIC8vIEFtYmVyIHdhcm5pbmcgd2hlbiBhIGxvY2tlZCBzb3VyY2UgZXhpc3RzIFx1MjAxNCBpbnB1dCByZW1haW5zIGVuYWJsZWQgc28gdGhlXG4gIC8vIHVzZXIgY2FuIHNhdmUgYSBzZXNzaW9uL2NvbmZpZyBvdmVycmlkZSwgYnV0IHRoZSBwcmVjZWRlbmNlIHJ1bGUgaXMgY2xlYXIuXG4gIGNvbnN0IHNvdXJjZURlc2MgPSBzb3VyY2UgPT09ICdlbnYnID8gJ2Vudmlyb25tZW50IHZhcmlhYmxlJyA6ICcuZW52IGZpbGUnO1xuICBjb25zdCBzb3VyY2VSZWYgID0gZW52VmFyXG4gICAgPyBgJHtzb3VyY2VEZXNjfSA8Y29kZT4ke2VzY2FwZUh0bWwoZW52VmFyKX08L2NvZGU+YFxuICAgIDogc291cmNlRGVzYztcbiAgY29uc3QgbG9ja2VkV2Fybkh0bWwgPSBpc0xvY2tlZFxuICAgID8gYDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZWYzYzc7Ym9yZGVyOjFweCBzb2xpZCAjZjU5ZTBiO2JvcmRlci1yYWRpdXM6NnB4O3BhZGRpbmc6OHB4IDEycHg7bWFyZ2luOjhweCAwO2ZvbnQtc2l6ZTowLjg1ZW07Y29sb3I6IzkyNDAwZTtcIj5gICtcbiAgICAgIGBcdTI2QTAgVGhpcyBrZXkgaXMgbG9hZGVkIGZyb20gdGhlIDxzdHJvbmc+JHtzb3VyY2VSZWZ9PC9zdHJvbmc+LiBgICtcbiAgICAgIGBBbnkgdmFsdWUgc2F2ZWQgYmVsb3cgdGFrZXMgZWZmZWN0IGltbWVkaWF0ZWx5IGZvciB0aGUgY3VycmVudCBzZXNzaW9uLCBidXQgd2lsbCBiZSBgICtcbiAgICAgIGA8c3Ryb25nPm92ZXJyaWRkZW4gYnkgdGhlICR7c291cmNlRGVzY30gd2hlbiB0aGUgc2VydmVyIHJlc3RhcnRzIG9yIHJlbG9hZHM8L3N0cm9uZz4uPC9kaXY+YFxuICAgIDogJyc7XG5cbiAgY29uc3QgZ2V0S2V5TGluayA9IGdldEtleVVybFxuICAgID8gYDxhIGhyZWY9XCIke2VzY2FwZUh0bWwoZ2V0S2V5VXJsKX1cIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCIgc3R5bGU9XCJjb2xvcjojMjU2M2ViO1wiPkdldCB5b3VyIGtleSAmIzg1OTk7PC9hPmBcbiAgICA6ICcnO1xuXG4gIGNvbnRlbnQuaW5uZXJIVE1MID1cbiAgICBgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTBweDtcIj5gICtcbiAgICBgICA8c3Ryb25nPiR7ZXNjYXBlSHRtbChsYWJlbCl9PC9zdHJvbmc+ICR7aXNTZXRCYWRnZX0ke3NvdXJjZUxhYmVsSHRtbH1gICtcbiAgICAoZ2V0S2V5TGluayA/IGAgIDxzcGFuIHN0eWxlPVwibWFyZ2luLWxlZnQ6MTBweDtcIj4ke2dldEtleUxpbmt9PC9zcGFuPmAgOiAnJykgK1xuICAgIGA8L2Rpdj5gICtcbiAgICAoaGVscFRleHQgPyBgPHAgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2NvbG9yOiM0NzU1Njk7bWFyZ2luOjAgMCAxMnB4O1wiPiR7ZXNjYXBlSHRtbChoZWxwVGV4dCl9PC9wPmAgOiAnJykgK1xuICAgIGxvY2tlZFdhcm5IdG1sO1xuXG4gIGlmIChhdXRoVHlwZSA9PT0gJ2FwaV9rZXknKSB7XG4gICAgaWYgKGtleVBhbmVsKSB7XG4gICAgICBrZXlQYW5lbC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICBpZiAoa2V5SW5wdXQpIHtcbiAgICAgICAgLy8gQWx3YXlzIGVuYWJsZSBpbnB1dCBcdTIwMTQgdXNlciBjYW4gc2F2ZSBhIG5ldyB2YWx1ZSBldmVuIHdoZW4gZW52L2RvdGVudiBpcyB0aGUgY3VycmVudFxuICAgICAgICAvLyBzb3VyY2UuIFRoZSB3YXJuaW5nIGJhbm5lciBhYm92ZSBjb21tdW5pY2F0ZXMgdGhlIHJlc3RhcnQtcHJlY2VkZW5jZSBiZWhhdmlvdXIuXG4gICAgICAgIGtleUlucHV0LmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgIGtleUlucHV0LnN0eWxlLm9wYWNpdHkgPSAnJztcbiAgICAgICAga2V5SW5wdXQucGxhY2Vob2xkZXIgPSBpc1NldCA/ICdFbnRlciBuZXcga2V5IHRvIHJlcGxhY2UgdGhlIHNhdmVkIG9uZScgOiAnUGFzdGUgeW91ciBBUEkga2V5IGhlcmUnO1xuICAgICAgICBrZXlJbnB1dC5kYXRhc2V0LnByb3ZpZGVyID0gcHJvdmlkZXI7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKGF1dGhUeXBlID09PSAnZGV2aWNlX2Zsb3cnKSB7XG4gICAgaWYgKGRldlBhbmVsKSB7XG4gICAgICBkZXZQYW5lbC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICBhd2FpdCBfcmVmcmVzaENvcGlsb3RBdXRoU3RhdHVzKCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGF1dGhUeXBlID09PSAnY2xpJykge1xuICAgIGNvbnRlbnQuaW5uZXJIVE1MICs9XG4gICAgICBgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2YwZmRmNDtib3JkZXI6MXB4IHNvbGlkICNiYmY3ZDA7Ym9yZGVyLXJhZGl1czo2cHg7cGFkZGluZzoxMHB4IDE0cHg7Zm9udC1zaXplOjAuODhlbTtcIj5gICtcbiAgICAgIGA8cCBzdHlsZT1cIm1hcmdpbjowIDAgNnB4O1wiPlJ1biB0aGlzIGNvbW1hbmQgaW4gYSB0ZXJtaW5hbCwgdGhlbiByZXR1cm4gaGVyZSBhbmQgY2xpY2sgPHN0cm9uZz5OZXh0PC9zdHJvbmc+OjwvcD5gICtcbiAgICAgIGA8Y29kZSBzdHlsZT1cImZvbnQtc2l6ZToxZW07XCI+Z2ggYXV0aCBsb2dpbjwvY29kZT48L2Rpdj5gO1xuICB9IGVsc2Uge1xuICAgIGNvbnRlbnQuaW5uZXJIVE1MICs9XG4gICAgICBgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2Y4ZmFmYztib3JkZXI6MXB4IHNvbGlkICNlMmU4ZjA7Ym9yZGVyLXJhZGl1czo2cHg7cGFkZGluZzoxMHB4IDE0cHg7Zm9udC1zaXplOjAuODhlbTtjb2xvcjojNDc1NTY5O1wiPmAgK1xuICAgICAgYE5vIGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkIGZvciB0aGlzIHByb3ZpZGVyLjwvZGl2PmA7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gX3JlZnJlc2hDb3BpbG90QXV0aFN0YXR1cygpIHtcbiAgY29uc3Qgc3RhdHVzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtYXV0aC1zdGF0dXMnKTtcbiAgY29uc3Qgc3RhcnRCdG4gID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLWF1dGgtc3RhcnQtYnRuJyk7XG4gIGNvbnN0IGxvZ291dEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1hdXRoLWxvZ291dC1idG4nKTtcbiAgY29uc3QgY29kZUVsICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLWF1dGgtY29kZScpO1xuICBjb25zdCBsaW5rRWwgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtYXV0aC1saW5rJyk7XG4gIGlmICghc3RhdHVzRWwpIHJldHVybjtcblxuICBpZiAoY29kZUVsKSAgY29kZUVsLnRleHRDb250ZW50ID0gJyc7XG4gIGlmIChsaW5rRWwpICBsaW5rRWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICB0cnkge1xuICAgIGNvbnN0IHN0ID0gYXdhaXQgZmV0Y2goJy9hcGkvY29waWxvdC1hdXRoL3N0YXR1cycpLnRoZW4oKHJlcykgPT4gcmVzLmpzb24oKSk7XG4gICAgaWYgKHN0LmF1dGhlbnRpY2F0ZWQpIHtcbiAgICAgIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJ0F1dGhlbnRpY2F0ZWQgd2l0aCBHaXRIdWIgQ29waWxvdC4nO1xuICAgICAgaWYgKHN0YXJ0QnRuKSBzdGFydEJ0bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgaWYgKGxvZ291dEJ0bikgbG9nb3V0QnRuLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIF91cGRhdGVMbG1TdGF0dXNQaWxsKCdhdXRoZW50aWNhdGVkJywgJ0NvcGlsb3QgcmVhZHknKTtcbiAgICB9IGVsc2UgaWYgKHN0LnBvbGxpbmcpIHtcbiAgICAgIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJ1dhaXRpbmcgZm9yIGRldmljZSBhcHByb3ZhbFx1MjAyNic7XG4gICAgICBpZiAoc3RhcnRCdG4pIHN0YXJ0QnRuLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIGlmIChsb2dvdXRCdG4pIGxvZ291dEJ0bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgX3VwZGF0ZUxsbVN0YXR1c1BpbGwoJ3BvbGxpbmcnLCAnQ29waWxvdCBhdXRoIHBlbmRpbmcnLCAnXHUyOUQ3Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJ05vdCBhdXRoZW50aWNhdGVkLiBTdGFydCBzaWduLWluIHRvIGVuYWJsZSBDb3BpbG90IE9BdXRoLic7XG4gICAgICBpZiAoc3RhcnRCdG4pIHN0YXJ0QnRuLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIGlmIChsb2dvdXRCdG4pIGxvZ291dEJ0bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgX3VwZGF0ZUxsbVN0YXR1c1BpbGwoJ3VuYXV0aGVudGljYXRlZCcsICdDb3BpbG90IG5vdCBhdXRoZW50aWNhdGVkJyk7XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICdVbmFibGUgdG8gbG9hZCBhdXRoIHN0YXR1cy4nO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNhdmVQcm92aWRlckFwaUtleSgpIHtcbiAgY29uc3Qga2V5SW5wdXQgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLWF1dGgta2V5LWlucHV0Jyk7XG4gIGNvbnN0IGtleVN0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1hdXRoLWtleS1zdGF0dXMnKTtcbiAgY29uc3QgcHJvdmlkZXIgID0ga2V5SW5wdXQ/LmRhdGFzZXQ/LnByb3ZpZGVyIHx8IF9tb2RlbFdpemFyZFNlbGVjdGVkUHJvdmlkZXI7XG4gIGNvbnN0IHZhbHVlICAgICA9IChrZXlJbnB1dD8udmFsdWUgfHwgJycpLnRyaW0oKTtcblxuICBpZiAoIXZhbHVlKSB7XG4gICAgaWYgKGtleVN0YXR1cykgeyBrZXlTdGF0dXMudGV4dENvbnRlbnQgPSAnUGxlYXNlIGVudGVyIGEga2V5IHZhbHVlLic7IGtleVN0YXR1cy5zdHlsZS5jb2xvciA9ICcjYjkxYzFjJzsgfVxuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIXByb3ZpZGVyKSB7XG4gICAgaWYgKGtleVN0YXR1cykgeyBrZXlTdGF0dXMudGV4dENvbnRlbnQgPSAnTm8gcHJvdmlkZXIgc2VsZWN0ZWQuJzsga2V5U3RhdHVzLnN0eWxlLmNvbG9yID0gJyNiOTFjMWMnOyB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGtleVN0YXR1cykgeyBrZXlTdGF0dXMudGV4dENvbnRlbnQgPSAnU2F2aW5nXHUyMDI2Jzsga2V5U3RhdHVzLnN0eWxlLmNvbG9yID0gJyM0NzU1NjknOyB9XG4gIHRyeSB7XG4gICAgYXdhaXQgYXBpQ2FsbCgnUE9TVCcsICcvYXBpL3NldHRpbmdzL2NyZWRlbnRpYWxzJywgeyBwcm92aWRlciwga2V5X3ZhbHVlOiB2YWx1ZSB9KTtcbiAgICBpZiAoa2V5SW5wdXQpICBrZXlJbnB1dC52YWx1ZSA9ICcnO1xuICAgIGlmIChrZXlTdGF0dXMpIHtcbiAgICAgIGtleVN0YXR1cy50ZXh0Q29udGVudCA9ICdLZXkgc2F2ZWQgc3VjY2Vzc2Z1bGx5Lic7XG4gICAgICBrZXlTdGF0dXMuc3R5bGUuY29sb3IgPSAnIzA2NWY0Nic7XG4gICAgfVxuICAgIC8vIFJlLXJlbmRlciBiYWRnZSB0byBzaG93IGtleSBpcyBub3cgc2V0XG4gICAgYXdhaXQgX3JlbmRlckF1dGhTdGVwKHByb3ZpZGVyKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmIChrZXlTdGF0dXMpIHsga2V5U3RhdHVzLnRleHRDb250ZW50ID0gYEVycm9yOiAke2UubWVzc2FnZSB8fCBlfWA7IGtleVN0YXR1cy5zdHlsZS5jb2xvciA9ICcjYjkxYzFjJzsgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHRvZ2dsZUFwaUtleVZpc2liaWxpdHkoKSB7XG4gIGNvbnN0IGlucHV0ICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1hdXRoLWtleS1pbnB1dCcpO1xuICBjb25zdCB0b2dnbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtYXV0aC1rZXktdG9nZ2xlJyk7XG4gIGlmICghaW5wdXQpIHJldHVybjtcbiAgY29uc3QgaXNIaWRkZW4gPSBpbnB1dC50eXBlID09PSAncGFzc3dvcmQnO1xuICBpbnB1dC50eXBlID0gaXNIaWRkZW4gPyAndGV4dCcgOiAncGFzc3dvcmQnO1xuICBpZiAodG9nZ2xlKSB0b2dnbGUudGV4dENvbnRlbnQgPSBpc0hpZGRlbiA/ICdcdUQ4M0RcdURFNDgnIDogJ1x1RDgzRFx1REM0MSc7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0YXJ0Q29waWxvdEF1dGhGcm9tV2l6YXJkKCkge1xuICBjb25zdCBzdGF0dXNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1hdXRoLXN0YXR1cycpO1xuICBjb25zdCBjb2RlRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtYXV0aC1jb2RlJyk7XG4gIGNvbnN0IGxpbmtFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1hdXRoLWxpbmsnKTtcbiAgaWYgKCFzdGF0dXNFbCB8fCAhY29kZUVsIHx8ICFsaW5rRWwpIHJldHVybjtcblxuICBfc2hvd01vZGVsV2l6YXJkQnVzeSgnU3RhcnRpbmcgR2l0SHViIGRldmljZSBhdXRob3JpemF0aW9uLi4uJyk7XG4gIHRyeSB7XG4gICAgY29uc3QgZmxvd1JlcyA9IGF3YWl0IGZldGNoKCcvYXBpL2NvcGlsb3QtYXV0aC9zdGFydCcsIHsgbWV0aG9kOiAnUE9TVCcgfSk7XG4gICAgaWYgKCFmbG93UmVzLm9rKSB0aHJvdyBuZXcgRXJyb3IoYXdhaXQgZmxvd1Jlcy50ZXh0KCkpO1xuICAgIGNvbnN0IGZsb3cgPSBhd2FpdCBmbG93UmVzLmpzb24oKTtcblxuICAgIGNvZGVFbC50ZXh0Q29udGVudCA9IGZsb3cudXNlcl9jb2RlIHx8ICcnO1xuICAgIGxpbmtFbC5ocmVmID0gZmxvdy52ZXJpZmljYXRpb25fdXJpIHx8ICdodHRwczovL2dpdGh1Yi5jb20vbG9naW4vZGV2aWNlJztcbiAgICBsaW5rRWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJ09wZW4gR2l0SHViLCBlbnRlciB0aGUgY29kZSwgdGhlbiByZXR1cm4gaGVyZS4nO1xuICAgIHdpbmRvdy5vcGVuKGxpbmtFbC5ocmVmLCAnX2JsYW5rJyk7XG5cbiAgICBhd2FpdCBmZXRjaCgnL2FwaS9jb3BpbG90LWF1dGgvcG9sbCcsIHsgbWV0aG9kOiAnUE9TVCcgfSk7XG4gICAgX3VwZGF0ZUxsbVN0YXR1c1BpbGwoJ3BvbGxpbmcnLCAnQ29waWxvdCBhdXRoIHBlbmRpbmcnLCAnXHUyOUQ3Jyk7XG4gICAgaWYgKF9jb3BpbG90QXV0aFBvbGxUaW1lcikgY2xlYXJJbnRlcnZhbChfY29waWxvdEF1dGhQb2xsVGltZXIpO1xuICAgIF9jb3BpbG90QXV0aFBvbGxUaW1lciA9IHNldEludGVydmFsKGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHN0ID0gYXdhaXQgZmV0Y2goJy9hcGkvY29waWxvdC1hdXRoL3N0YXR1cycpLnRoZW4oKHJlcykgPT4gcmVzLmpzb24oKSk7XG4gICAgICAgIGlmIChzdC5hdXRoZW50aWNhdGVkKSB7XG4gICAgICAgICAgY2xlYXJJbnRlcnZhbChfY29waWxvdEF1dGhQb2xsVGltZXIpO1xuICAgICAgICAgIF9jb3BpbG90QXV0aFBvbGxUaW1lciA9IG51bGw7XG4gICAgICAgICAgYXdhaXQgX3JlZnJlc2hDb3BpbG90QXV0aFN0YXR1cygpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8ga2VlcCBwb2xsaW5nIHNpbGVudGx5IHVudGlsIGNsb3NlXG4gICAgICB9XG4gICAgfSwgNTAwMCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgc3RhdHVzRWwudGV4dENvbnRlbnQgPSBgQXV0aCBzdGFydCBmYWlsZWQ6ICR7ZXJyb3IubWVzc2FnZSB8fCBlcnJvcn1gO1xuICB9IGZpbmFsbHkge1xuICAgIF9oaWRlTW9kZWxXaXphcmRCdXN5KCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9nb3V0Q29waWxvdEF1dGhGcm9tV2l6YXJkKCkge1xuICBhd2FpdCBmZXRjaCgnL2FwaS9jb3BpbG90LWF1dGgvbG9nb3V0JywgeyBtZXRob2Q6ICdQT1NUJyB9KTtcbiAgYXdhaXQgX3JlZnJlc2hDb3BpbG90QXV0aFN0YXR1cygpO1xufVxuXG5mdW5jdGlvbiBfd2lyZUdsb2JhbE1vZGVsU2VhcmNoKCkge1xuICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1nbG9iYWwtc2VhcmNoJyk7XG4gIGlmICghaW5wdXQpIHJldHVybjtcbiAgaW5wdXQub25pbnB1dCA9ICgpID0+IHtcbiAgICBpZiAoX21vZGVsRGF0YVRhYmxlICYmIHR5cGVvZiBfbW9kZWxEYXRhVGFibGUuc2VhcmNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBfbW9kZWxEYXRhVGFibGUuc2VhcmNoKGlucHV0LnZhbHVlIHx8ICcnKS5kcmF3KCk7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBfcmVuZGVyUHJvdmlkZXJTZWxlY3RvcigpIHtcbiAgY29uc3QgbGlzdEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLXByb3ZpZGVyLWxpc3QnKTtcbiAgaWYgKCFsaXN0RWwgfHwgIV9tb2RlbERhdGEpIHJldHVybjtcblxuICBjb25zdCBwcm92aWRlcnMgPSBBcnJheS5pc0FycmF5KF9tb2RlbERhdGEucHJvdmlkZXJzKVxuICAgID8gX21vZGVsRGF0YS5wcm92aWRlcnNcbiAgICA6IEFycmF5LmZyb20obmV3IFNldCgoX21vZGVsRGF0YS5hbGxfbW9kZWxzIHx8IFtdKS5tYXAociA9PiByLnByb3ZpZGVyKS5maWx0ZXIoQm9vbGVhbikpKS5zb3J0KCk7XG4gIGNvbnN0IGNhcGFibGVTZXQgPSBuZXcgU2V0KF9tb2RlbERhdGEubGlzdF9tb2RlbHNfY2FwYWJsZSB8fCBbXSk7XG5cbiAgaWYgKCFfbW9kZWxXaXphcmRTZWxlY3RlZFByb3ZpZGVyKSB7XG4gICAgX21vZGVsV2l6YXJkU2VsZWN0ZWRQcm92aWRlciA9IF9tb2RlbERhdGEucHJvdmlkZXIgfHwgcHJvdmlkZXJzWzBdIHx8IG51bGw7XG4gIH1cbiAgaWYgKF9tb2RlbFdpemFyZFNlbGVjdGVkUHJvdmlkZXIpIHtcbiAgICBfc2VsZWN0ZWRNb2RlbFByb3ZpZGVycyA9IG5ldyBTZXQoW19tb2RlbFdpemFyZFNlbGVjdGVkUHJvdmlkZXJdKTtcbiAgfVxuXG4gIC8vIERpc3Bvc2UgYW55IGV4aXN0aW5nIEJTNSBwb3BvdmVycyBiZWZvcmUgY2xlYXJpbmcgdGhlIGxpc3QuXG4gIGxpc3RFbC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1icy10b2dnbGU9XCJwb3BvdmVyXCJdJykuZm9yRWFjaChlbCA9PiB7XG4gICAgd2luZG93LmJvb3RzdHJhcD8uUG9wb3Zlcj8uZ2V0SW5zdGFuY2UoZWwpPy5kaXNwb3NlKCk7XG4gIH0pO1xuXG4gIGxpc3RFbC5pbm5lckhUTUwgPSAnJztcbiAgcHJvdmlkZXJzLmZvckVhY2gocHJvdmlkZXIgPT4ge1xuICAgIGNvbnN0IGNoZWNrZWQgPSBwcm92aWRlciA9PT0gX21vZGVsV2l6YXJkU2VsZWN0ZWRQcm92aWRlcjtcbiAgICBjb25zdCBzb3VyY2VMYWJlbCA9IF9wcm92aWRlclN0YWdlTGFiZWwocHJvdmlkZXIsIGNhcGFibGVTZXQpO1xuICAgIGNvbnN0IGluZm8gPSBnZXRQcm92aWRlckluZm8ocHJvdmlkZXIpO1xuXG4gICAgY29uc3QgbGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsYWJlbCcpO1xuICAgIGxhYmVsLnN0eWxlLmNzc1RleHQgPSAnZGlzcGxheTpmbGV4OyBhbGlnbi1pdGVtczpjZW50ZXI7IGdhcDo2cHg7IHBhZGRpbmc6NHB4IDhweDsgYm9yZGVyOjFweCBzb2xpZCAjY2JkNWUxOyBib3JkZXItcmFkaXVzOjk5OXB4OyBmb250LXNpemU6MC44MmVtOyBiYWNrZ3JvdW5kOiNmZmY7IGN1cnNvcjpwb2ludGVyOyc7XG4gICAgbGFiZWwuaW5uZXJIVE1MID1cbiAgICAgIGA8aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cIm1vZGVsLXByb3ZpZGVyLWNob2ljZVwiIHZhbHVlPVwiJHtlc2NhcGVIdG1sKHByb3ZpZGVyKX1cIiAke2NoZWNrZWQgPyAnY2hlY2tlZCcgOiAnJ30gc3R5bGU9XCJtYXJnaW46MDtcIiAvPmAgK1xuICAgICAgYDxzcGFuPiR7ZXNjYXBlSHRtbChfcHJvdmlkZXJEaXNwbGF5TGFiZWwocHJvdmlkZXIpKX08L3NwYW4+YCArXG4gICAgICBgPHNwYW4gc3R5bGU9XCJjb2xvcjojNjQ3NDhiOyBmb250LXNpemU6MC44ZW07XCI+KCR7ZXNjYXBlSHRtbChzb3VyY2VMYWJlbCl9KTwvc3Bhbj5gO1xuXG4gICAgLy8gQXBwZW5kIGEgXHUyNEQ4IGJ1dHRvbiB3aXJlZCB0byBhIEJTNSBIVE1MIHBvcG92ZXIgc28gbGlua3MgaW5zaWRlIGFyZSBjbGlja2FibGUuXG4gICAgaWYgKGluZm8pIHtcbiAgICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgICAgYnRuLnR5cGUgPSAnYnV0dG9uJztcbiAgICAgIGJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnUHJvdmlkZXIgaW5mbycpO1xuICAgICAgYnRuLnNldEF0dHJpYnV0ZSgnZGF0YS1icy10b2dnbGUnLCAncG9wb3ZlcicpO1xuICAgICAgYnRuLnNldEF0dHJpYnV0ZSgnZGF0YS1icy10cmlnZ2VyJywgJ2NsaWNrJyk7XG4gICAgICBidG4uc2V0QXR0cmlidXRlKCdkYXRhLWJzLXBsYWNlbWVudCcsICdyaWdodCcpO1xuICAgICAgYnRuLnNldEF0dHJpYnV0ZSgnZGF0YS1icy1odG1sJywgJ3RydWUnKTtcbiAgICAgIGJ0bi5zZXRBdHRyaWJ1dGUoJ2RhdGEtYnMtY29udGFpbmVyJywgJ2JvZHknKTtcbiAgICAgIGJ0bi5zZXRBdHRyaWJ1dGUoJ2RhdGEtYnMtY29udGVudCcsIHByb3ZpZGVySW5mb1BvcG92ZXJDb250ZW50KGluZm8pKTtcbiAgICAgIGJ0bi5zdHlsZS5jc3NUZXh0ID0gJ2JhY2tncm91bmQ6bm9uZTtib3JkZXI6bm9uZTtjdXJzb3I6cG9pbnRlcjtjb2xvcjojNjQ3NDhiO2ZvbnQtc2l6ZTowLjllbTtwYWRkaW5nOjAgMXB4O2xpbmUtaGVpZ2h0OjE7dmVydGljYWwtYWxpZ246bWlkZGxlOyc7XG4gICAgICBidG4udGV4dENvbnRlbnQgPSAnXHUyNEQ4JztcbiAgICAgIC8vIFByZXZlbnQgdGhlIHJhZGlvLWxhYmVsIGNsaWNrIGZyb20gcHJvcGFnYXRpbmcgdG8gdGhlIHJhZGlvIGJ1dHRvbi5cbiAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGUgPT4gZS5zdG9wUHJvcGFnYXRpb24oKSk7XG4gICAgICBsYWJlbC5hcHBlbmRDaGlsZChidG4pO1xuXG4gICAgICAvLyBJbml0aWFsaXNlIGFmdGVyIGFwcGVuZCBcdTIwMTQgQlM1IG11c3QgZmluZCB0aGUgZWxlbWVudCBpbiB0aGUgRE9NLlxuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgaWYgKHdpbmRvdy5ib290c3RyYXA/LlBvcG92ZXIpIHtcbiAgICAgICAgICBuZXcgd2luZG93LmJvb3RzdHJhcC5Qb3BvdmVyKGJ0biwgeyBzYW5pdGl6ZTogZmFsc2UgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGNoZWNrYm94ID0gbGFiZWwucXVlcnlTZWxlY3RvcignaW5wdXQnKTtcbiAgICBjaGVja2JveC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICBpZiAoIWNoZWNrYm94LmNoZWNrZWQpIHJldHVybjtcbiAgICAgIF9tb2RlbFdpemFyZFNlbGVjdGVkUHJvdmlkZXIgPSBwcm92aWRlcjtcbiAgICAgIF9zZWxlY3RlZE1vZGVsUHJvdmlkZXJzID0gbmV3IFNldChbcHJvdmlkZXJdKTtcbiAgICAgIF91cGRhdGVNb2RlbFdpemFyZE5hdigpO1xuICAgIH0pO1xuXG4gICAgbGlzdEVsLmFwcGVuZENoaWxkKGxhYmVsKTtcbiAgfSk7XG5cbiAgX3VwZGF0ZU1vZGVsV2l6YXJkTmF2KCk7XG59XG5cbmZ1bmN0aW9uIF9zaG93TW9kZWxXaXphcmRCdXN5KG1lc3NhZ2UpIHtcbiAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC13aXphcmQtYnVzeS1vdmVybGF5Jyk7XG4gIGNvbnN0IG1lc3NhZ2VFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC13aXphcmQtYnVzeS1tZXNzYWdlJyk7XG4gIGlmIChtZXNzYWdlRWwpIG1lc3NhZ2VFbC50ZXh0Q29udGVudCA9IG1lc3NhZ2UgfHwgJ1dvcmtpbmcuLi4nO1xuICBpZiAob3ZlcmxheSkgb3ZlcmxheS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xufVxuXG5mdW5jdGlvbiBfaGlkZU1vZGVsV2l6YXJkQnVzeSgpIHtcbiAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC13aXphcmQtYnVzeS1vdmVybGF5Jyk7XG4gIGlmIChvdmVybGF5KSBvdmVybGF5LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG59XG5cbmZ1bmN0aW9uIF9zZXRNb2RlbFdpemFyZFN0ZXAoc3RlcCkge1xuICBfbW9kZWxXaXphcmRTdGVwID0gWzEsIDIsIDMsIDRdLmluY2x1ZGVzKHN0ZXApID8gc3RlcCA6IDE7XG4gIGNvbnN0IHBhbmVzID0ge1xuICAgIDE6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1zdGVwLXByb3ZpZGVyJyksXG4gICAgMjogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLXN0ZXAtYXV0aCcpLFxuICAgIDM6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1zdGVwLW1vZGVscycpLFxuICAgIDQ6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1zdGVwLXN1Y2Nlc3MnKSxcbiAgfTtcbiAgT2JqZWN0LmVudHJpZXMocGFuZXMpLmZvckVhY2goKFtudW0sIGVsXSkgPT4ge1xuICAgIGlmIChlbCkgZWwuc3R5bGUuZGlzcGxheSA9IE51bWJlcihudW0pID09PSBfbW9kZWxXaXphcmRTdGVwID8gJycgOiAnbm9uZSc7XG4gIH0pO1xuICBpZiAoX21vZGVsV2l6YXJkU3RlcCA9PT0gMikge1xuICAgIF9yZW5kZXJBdXRoU3RlcChfbW9kZWxXaXphcmRTZWxlY3RlZFByb3ZpZGVyKTtcbiAgfVxuICBfdXBkYXRlTW9kZWxXaXphcmROYXYoKTtcbn1cblxuZnVuY3Rpb24gX3VwZGF0ZU1vZGVsV2l6YXJkUHJvZ3Jlc3NCYXIoKSB7XG4gIFsxLCAyLCAzLCA0XS5mb3JFYWNoKChzdGVwTnVtKSA9PiB7XG4gICAgY29uc3Qgc3RlcEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYG1vZGVsLXByb2dyZXNzLXN0ZXAtJHtzdGVwTnVtfWApO1xuICAgIGlmICghc3RlcEVsKSByZXR1cm47XG4gICAgY29uc3QgYmFkZ2VFbCA9IHN0ZXBFbC5xdWVyeVNlbGVjdG9yKCcubW9kZWwtcHJvZ3Jlc3MtYmFkZ2UnKTtcbiAgICBzdGVwRWwuY2xhc3NMaXN0LnJlbW92ZSgnaXMtYWN0aXZlJywgJ2lzLWNvbXBsZXRlJywgJ2lzLXVwY29taW5nJyk7XG4gICAgaWYgKHN0ZXBOdW0gPCBfbW9kZWxXaXphcmRTdGVwKSB7XG4gICAgICBzdGVwRWwuY2xhc3NMaXN0LmFkZCgnaXMtY29tcGxldGUnKTtcbiAgICAgIHN0ZXBFbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtY3VycmVudCcsICdmYWxzZScpO1xuICAgICAgaWYgKGJhZGdlRWwpIGJhZGdlRWwudGV4dENvbnRlbnQgPSAnXHUyNzEzJztcbiAgICB9IGVsc2UgaWYgKHN0ZXBOdW0gPT09IF9tb2RlbFdpemFyZFN0ZXApIHtcbiAgICAgIHN0ZXBFbC5jbGFzc0xpc3QuYWRkKCdpcy1hY3RpdmUnKTtcbiAgICAgIHN0ZXBFbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtY3VycmVudCcsICdzdGVwJyk7XG4gICAgICBpZiAoYmFkZ2VFbCkgYmFkZ2VFbC50ZXh0Q29udGVudCA9IFN0cmluZyhzdGVwTnVtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RlcEVsLmNsYXNzTGlzdC5hZGQoJ2lzLXVwY29taW5nJyk7XG4gICAgICBzdGVwRWwuc2V0QXR0cmlidXRlKCdhcmlhLWN1cnJlbnQnLCAnZmFsc2UnKTtcbiAgICAgIGlmIChiYWRnZUVsKSBiYWRnZUVsLnRleHRDb250ZW50ID0gU3RyaW5nKHN0ZXBOdW0pO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIF91cGRhdGVNb2RlbFdpemFyZE5hdigpIHtcbiAgY29uc3Qgc3RlcExhYmVsICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC13aXphcmQtc3RlcC1sYWJlbCcpO1xuICBjb25zdCBiYWNrQnRuICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLXdpemFyZC1iYWNrLWJ0bicpO1xuICBjb25zdCBuZXh0QnRuICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLXdpemFyZC1uZXh0LWJ0bicpO1xuICBjb25zdCB0ZXN0QnRuICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLXRlc3QtYnRuJyk7XG4gIGNvbnN0IHJlZnJlc2hCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJpY2luZy1yZWZyZXNoLWJ0bicpO1xuICBjb25zdCBmb290ZXIgICAgID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm1vZGVsLXdpemFyZC1mb290ZXInKTtcblxuICBfdXBkYXRlTW9kZWxXaXphcmRQcm9ncmVzc0JhcigpO1xuXG4gIGlmIChzdGVwTGFiZWwpIHtcbiAgICBjb25zdCBsYWJlbHMgPSB7XG4gICAgICAxOiAnU3RlcCAxIG9mIDQ6IENob29zZSBwcm92aWRlcicsXG4gICAgICAyOiAnU3RlcCAyIG9mIDQ6IFNldCB1cCBhdXRoZW50aWNhdGlvbicsXG4gICAgICAzOiAnU3RlcCAzIG9mIDQ6IENob29zZSBtb2RlbCBhbmQgdGVzdCBjb25uZWN0aW9uJyxcbiAgICAgIDQ6ICdTdGVwIDQgb2YgNDogQ29tcGxldGUnLFxuICAgIH07XG4gICAgc3RlcExhYmVsLnRleHRDb250ZW50ID0gbGFiZWxzW19tb2RlbFdpemFyZFN0ZXBdIHx8ICcnO1xuICB9XG5cbiAgaWYgKGJhY2tCdG4pIHtcbiAgICBiYWNrQnRuLmRpc2FibGVkID0gX21vZGVsV2l6YXJkU3RlcCA9PT0gMTtcbiAgICBiYWNrQnRuLnN0eWxlLmRpc3BsYXkgPSBfbW9kZWxXaXphcmRTdGVwID09PSA0ID8gJ25vbmUnIDogJyc7XG4gIH1cbiAgLy8gTmV4dCBidXR0b246IHZpc2libGUgb24gc3RlcHMgMSBhbmQgMlxuICBpZiAobmV4dEJ0bikge1xuICAgIG5leHRCdG4uc3R5bGUuZGlzcGxheSA9IChfbW9kZWxXaXphcmRTdGVwID09PSAxIHx8IF9tb2RlbFdpemFyZFN0ZXAgPT09IDIpID8gJycgOiAnbm9uZSc7XG4gICAgbmV4dEJ0bi5kaXNhYmxlZCA9IF9tb2RlbFdpemFyZFN0ZXAgPT09IDEgJiYgIV9tb2RlbFdpemFyZFNlbGVjdGVkUHJvdmlkZXI7XG4gICAgbmV4dEJ0bi50ZXh0Q29udGVudCA9IF9tb2RlbFdpemFyZFN0ZXAgPT09IDIgPyAnTmV4dCcgOiAnTmV4dCc7XG4gIH1cbiAgaWYgKHRlc3RCdG4pICAgIHRlc3RCdG4uc3R5bGUuZGlzcGxheSAgICA9IF9tb2RlbFdpemFyZFN0ZXAgPT09IDMgPyAnJyA6ICdub25lJztcbiAgaWYgKHJlZnJlc2hCdG4pIHJlZnJlc2hCdG4uc3R5bGUuZGlzcGxheSA9IF9tb2RlbFdpemFyZFN0ZXAgPT09IDMgPyAnJyA6ICdub25lJztcbiAgaWYgKGZvb3RlcikgZm9vdGVyLnN0eWxlLmp1c3RpZnlDb250ZW50ICA9IF9tb2RlbFdpemFyZFN0ZXAgPT09IDQgPyAnY2VudGVyJyA6ICdzcGFjZS1iZXR3ZWVuJztcbn1cblxuYXN5bmMgZnVuY3Rpb24gX2xvYWRNb2RlbHNGb3JTZWxlY3RlZFByb3ZpZGVyKCkge1xuICBpZiAoIV9tb2RlbFdpemFyZFNlbGVjdGVkUHJvdmlkZXIpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBsb2FkaW5nRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtbW9kZWxzLWxvYWRpbmcnKTtcbiAgaWYgKGxvYWRpbmdFbCkge1xuICAgIGxvYWRpbmdFbC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgbG9hZGluZ0VsLnN0eWxlLmNvbG9yID0gJyM0NzU1NjknO1xuICAgIGxvYWRpbmdFbC5pbm5lckhUTUwgPSAnPHNwYW4gY2xhc3M9XCJsb2FkaW5nLXNwaW5uZXJcIiBzdHlsZT1cIndpZHRoOjE0cHg7aGVpZ2h0OjE0cHg7Ym9yZGVyLXdpZHRoOjJweDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7bWFyZ2luLXJpZ2h0OjZweDtcIj48L3NwYW4+TG9hZGluZyBtb2RlbHMgZm9yIHNlbGVjdGVkIHByb3ZpZGVyLi4uJztcbiAgfVxuXG4gIF9zaG93TW9kZWxXaXphcmRCdXN5KCdRdWVyeWluZyBhdmFpbGFibGUgbW9kZWxzLi4uJyk7XG4gIHRyeSB7XG4gICAgX3NlbGVjdGVkTW9kZWxQcm92aWRlcnMgPSBuZXcgU2V0KFtfbW9kZWxXaXphcmRTZWxlY3RlZFByb3ZpZGVyXSk7XG4gICAgX21vZGVsRGF0YS5wcm92aWRlciA9IF9tb2RlbFdpemFyZFNlbGVjdGVkUHJvdmlkZXI7XG4gICAgYXdhaXQgX3JlZnJlc2hNb2RlbENhdGFsb2dGb3JTZWxlY3Rpb24oKTtcbiAgICBpZiAobG9hZGluZ0VsKSB7XG4gICAgICBsb2FkaW5nRWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIGxvYWRpbmdFbC50ZXh0Q29udGVudCA9ICcnO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cud2FybignQ291bGQgbm90IGxvYWQgbW9kZWxzIGZvciBzZWxlY3RlZCBwcm92aWRlcjonLCBlcnJvcik7XG4gICAgaWYgKGxvYWRpbmdFbCkge1xuICAgICAgbG9hZGluZ0VsLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIGxvYWRpbmdFbC50ZXh0Q29udGVudCA9ICdGYWlsZWQgdG8gbG9hZCBtb2RlbHMgZm9yIHNlbGVjdGVkIHByb3ZpZGVyLic7XG4gICAgICBsb2FkaW5nRWwuc3R5bGUuY29sb3IgPSAnI2I5MWMxYyc7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSBmaW5hbGx5IHtcbiAgICBfaGlkZU1vZGVsV2l6YXJkQnVzeSgpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG5leHRXaXphcmRTdGVwKCkge1xuICBpZiAoX21vZGVsV2l6YXJkU3RlcCA9PT0gMSkge1xuICAgIGlmICghX21vZGVsV2l6YXJkU2VsZWN0ZWRQcm92aWRlcikgcmV0dXJuO1xuICAgIF9zZXRNb2RlbFdpemFyZFN0ZXAoMik7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChfbW9kZWxXaXphcmRTdGVwID09PSAyKSB7XG4gICAgY29uc3QgbG9hZGVkID0gYXdhaXQgX2xvYWRNb2RlbHNGb3JTZWxlY3RlZFByb3ZpZGVyKCk7XG4gICAgaWYgKCFsb2FkZWQpIHJldHVybjtcbiAgICBfc2V0TW9kZWxXaXphcmRTdGVwKDMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHByZXZpb3VzV2l6YXJkU3RlcCgpIHtcbiAgaWYgKF9tb2RlbFdpemFyZFN0ZXAgPT09IDIpIHsgX3NldE1vZGVsV2l6YXJkU3RlcCgxKTsgcmV0dXJuOyB9XG4gIGlmIChfbW9kZWxXaXphcmRTdGVwID09PSAzKSB7IF9zZXRNb2RlbFdpemFyZFN0ZXAoMik7IHJldHVybjsgfVxuICBpZiAoX21vZGVsV2l6YXJkU3RlcCA9PT0gNCkgeyBfc2V0TW9kZWxXaXphcmRTdGVwKDMpOyB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9yZWZyZXNoTW9kZWxDYXRhbG9nRm9yU2VsZWN0aW9uKCkge1xuICBpZiAoIV9tb2RlbERhdGEpIHJldHVybjtcbiAgaWYgKF9jYXRhbG9nUmVmcmVzaGluZykge1xuICAgIF9jYXRhbG9nUmVmcmVzaFBlbmRpbmcgPSB0cnVlO1xuICAgIHJldHVybjtcbiAgfVxuICBfY2F0YWxvZ1JlZnJlc2hpbmcgPSB0cnVlO1xuXG4gIHRyeSB7XG4gICAgY29uc3Qgc2VsZWN0ZWQgPSBBcnJheS5mcm9tKF9zZWxlY3RlZE1vZGVsUHJvdmlkZXJzKTtcbiAgICBpZiAoIXNlbGVjdGVkLmxlbmd0aCkge1xuICAgICAgX3NlbGVjdGVkTW9kZWxQcm92aWRlcnMgPSBuZXcgU2V0KFtfbW9kZWxEYXRhLnByb3ZpZGVyXSk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvdmlkZXJzUGFyYW0gPSBlbmNvZGVVUklDb21wb25lbnQoQXJyYXkuZnJvbShfc2VsZWN0ZWRNb2RlbFByb3ZpZGVycykuam9pbignLCcpKTtcbiAgICBjb25zdCBjYXRhbG9nID0gYXdhaXQgYXBpQ2FsbCgnR0VUJywgYC9hcGkvbW9kZWwtY2F0YWxvZz9wcm92aWRlcnM9JHtwcm92aWRlcnNQYXJhbX1gKTtcbiAgICBfbW9kZWxEYXRhLmFsbF9tb2RlbHMgPSBjYXRhbG9nLmFsbF9tb2RlbHMgfHwgW107XG4gICAgX21vZGVsRGF0YS5wcmljaW5nX3VwZGF0ZWRfYXQgPSBjYXRhbG9nLnByaWNpbmdfdXBkYXRlZF9hdCB8fCBfbW9kZWxEYXRhLnByaWNpbmdfdXBkYXRlZF9hdDtcbiAgICBfbW9kZWxEYXRhLnByaWNpbmdfc291cmNlID0gY2F0YWxvZy5wcmljaW5nX3NvdXJjZSB8fCBfbW9kZWxEYXRhLnByaWNpbmdfc291cmNlO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGNhdGFsb2cucHJvdmlkZXJzKSAmJiBjYXRhbG9nLnByb3ZpZGVycy5sZW5ndGgpIHtcbiAgICAgIF9tb2RlbERhdGEucHJvdmlkZXJzID0gY2F0YWxvZy5wcm92aWRlcnM7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KGNhdGFsb2cubGlzdF9tb2RlbHNfY2FwYWJsZSkpIHtcbiAgICAgIF9tb2RlbERhdGEubGlzdF9tb2RlbHNfY2FwYWJsZSA9IGNhdGFsb2cubGlzdF9tb2RlbHNfY2FwYWJsZTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nLndhcm4oJ0NvdWxkIG5vdCByZWZyZXNoIG1vZGVsIGNhdGFsb2cgZm9yIHNlbGVjdGVkIHByb3ZpZGVyczonLCBlcnJvcik7XG4gIH0gZmluYWxseSB7XG4gICAgX2NhdGFsb2dSZWZyZXNoaW5nID0gZmFsc2U7XG4gIH1cblxuICBfcmVuZGVyUHJvdmlkZXJTZWxlY3RvcigpO1xuICBfYnVpbGRNb2RlbFRhYmxlKCk7XG5cbiAgaWYgKF9jYXRhbG9nUmVmcmVzaFBlbmRpbmcpIHtcbiAgICBfY2F0YWxvZ1JlZnJlc2hQZW5kaW5nID0gZmFsc2U7XG4gICAgYXdhaXQgX3JlZnJlc2hNb2RlbENhdGFsb2dGb3JTZWxlY3Rpb24oKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBvcGVuTW9kZWxNb2RhbCgpIHtcbiAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1tb2RhbC1vdmVybGF5Jyk7XG4gIGlmICghb3ZlcmxheSkgcmV0dXJuO1xuXG4gIGlmICghX21vZGVsRGF0YSkge1xuICAgIGF3YWl0IGxvYWRNb2RlbFNlbGVjdG9yKCk7XG4gIH1cbiAgYXdhaXQgbG9hZFByb3ZpZGVySW5mbygpO1xuICBpZiAoIV9tb2RlbFdpemFyZFNlbGVjdGVkUHJvdmlkZXIpIHtcbiAgICBfbW9kZWxXaXphcmRTZWxlY3RlZFByb3ZpZGVyID0gX21vZGVsRGF0YT8ucHJvdmlkZXIgfHwgbnVsbDtcbiAgfVxuICBjb25zdCBzdWNjZXNzU3VtbWFyeSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1zdWNjZXNzLXN1bW1hcnknKTtcbiAgaWYgKHN1Y2Nlc3NTdW1tYXJ5KSB7XG4gICAgc3VjY2Vzc1N1bW1hcnkudGV4dENvbnRlbnQgPSAnUHJvdmlkZXIgYW5kIG1vZGVsIGFyZSBjb25maWd1cmVkIGFuZCB0aGUgY29ubmVjdGlvbiBjaGVjayBzdWNjZWVkZWQuJztcbiAgfVxuICBfcmVuZGVyUHJvdmlkZXJTZWxlY3RvcigpO1xuICBfc3luY0NhdGFsb2dWaXNpYmlsaXR5KCk7XG4gIF93aXJlR2xvYmFsTW9kZWxTZWFyY2goKTtcbiAgX3NldE1vZGVsV2l6YXJkU3RlcCgxKTtcbiAgX2hpZGVNb2RlbFdpemFyZEJ1c3koKTtcbiAgb3ZlcmxheS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICBfZm9jdXNTdGFjay5wdXNoKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpO1xuICBzZXRJbml0aWFsRm9jdXMoJ21vZGVsLW1vZGFsLW92ZXJsYXknKTtcbiAgdHJhcEZvY3VzKCdtb2RlbC1tb2RhbC1vdmVybGF5Jyk7XG59XG5cbmZ1bmN0aW9uIGNsb3NlTW9kZWxNb2RhbCgpIHtcbiAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1tb2RhbC1vdmVybGF5Jyk7XG4gIGlmIChvdmVybGF5KSBvdmVybGF5LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIF9zZXRNb2RlbFdpemFyZFN0ZXAoMSk7XG4gIF9oaWRlTW9kZWxXaXphcmRCdXN5KCk7XG4gIGlmIChfY29waWxvdEF1dGhQb2xsVGltZXIpIHtcbiAgICBjbGVhckludGVydmFsKF9jb3BpbG90QXV0aFBvbGxUaW1lcik7XG4gICAgX2NvcGlsb3RBdXRoUG9sbFRpbWVyID0gbnVsbDtcbiAgfVxuICByZXN0b3JlRm9jdXMoKTtcbn1cblxuZnVuY3Rpb24gX2FwcGx5TW9kZWxSb3dWaXN1YWxTdGF0ZSh0ciwgaXNBY3RpdmUpIHtcbiAgdHIuY2xhc3NMaXN0LnRvZ2dsZSgnbW9kZWwtcm93LWFjdGl2ZScsIGlzQWN0aXZlKTtcbiAgdHIuc3R5bGUuY3NzVGV4dCA9IGlzQWN0aXZlXG4gICAgPyAnYmFja2dyb3VuZDojZWZmNmZmOyBmb250LXdlaWdodDo2MDA7IGN1cnNvcjpwb2ludGVyOydcbiAgICA6ICdjdXJzb3I6cG9pbnRlcjsnO1xuXG4gIGNvbnN0IG1vZGVsID0gdHIuZ2V0QXR0cmlidXRlKCdkYXRhLW1vZGVsJykgfHwgJyc7XG4gIGNvbnN0IG1vZGVsQ2VsbCA9IHRyLmNlbGxzICYmIHRyLmNlbGxzWzFdO1xuICBpZiAobW9kZWxDZWxsKSB7XG4gICAgbW9kZWxDZWxsLmlubmVySFRNTCA9IGAke2VzY2FwZUh0bWwobW9kZWwpfWAgK1xuICAgICAgKGlzQWN0aXZlID8gJyA8c3BhbiBzdHlsZT1cImNvbG9yOiMzYjgyZjY7IGZvbnQtc2l6ZTowLjc1ZW07XCI+JiMxMDAwMzsgYWN0aXZlPC9zcGFuPicgOiAnJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX3N5bmNNb2RlbFRhYmxlU2VsZWN0aW9uKCkge1xuICBjb25zdCB0Ym9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC10YWJsZS1ib2R5Jyk7XG4gIGlmICghdGJvZHkgfHwgIV9tb2RlbERhdGEpIHJldHVybjtcblxuICBjb25zdCBhY3RpdmVQcm92aWRlciA9IF9tb2RlbERhdGEucHJvdmlkZXI7XG4gIGNvbnN0IGFjdGl2ZU1vZGVsID0gX21vZGVsRGF0YS5tb2RlbDtcbiAgdGJvZHkucXVlcnlTZWxlY3RvckFsbCgndHInKS5mb3JFYWNoKHRyID0+IHtcbiAgICBjb25zdCBpc0FjdGl2ZSA9IChcbiAgICAgIHRyLmdldEF0dHJpYnV0ZSgnZGF0YS1wcm92aWRlcicpID09PSBhY3RpdmVQcm92aWRlciAmJlxuICAgICAgdHIuZ2V0QXR0cmlidXRlKCdkYXRhLW1vZGVsJykgPT09IGFjdGl2ZU1vZGVsXG4gICAgKTtcbiAgICBfYXBwbHlNb2RlbFJvd1Zpc3VhbFN0YXRlKHRyLCBpc0FjdGl2ZSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBfYnVpbGRNb2RlbFRhYmxlKCkge1xuICBjb25zdCB0Ym9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC10YWJsZS1ib2R5Jyk7XG4gIGNvbnN0IHRoZWFkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLXRhYmxlLWhlYWQnKTtcbiAgaWYgKCF0Ym9keSB8fCAhX21vZGVsRGF0YSkgcmV0dXJuO1xuXG4gIGNvbnN0IGN1cnJlbnRQcm92aWRlciA9IF9tb2RlbERhdGEucHJvdmlkZXI7XG4gIGNvbnN0IGN1cnJlbnRNb2RlbCAgICA9IF9tb2RlbERhdGEubW9kZWw7XG5cbiAgLy8gRml4ZWQgNy1jb2x1bW4gaGVhZGVycyBcdTIwMTQgbm8gZHluYW1pYyByZWJ1aWxkaW5nIG5lZWRlZFxuICBpZiAodGhlYWQpIHtcbiAgICBjb25zdCB0aFMgPSAncGFkZGluZzoxMHB4IDE0cHg7IHdoaXRlLXNwYWNlOm5vd3JhcDsnO1xuICAgIHRoZWFkLmlubmVySFRNTCA9XG4gICAgICBgPHRyIHN0eWxlPVwiYmFja2dyb3VuZDojZjFmNWY5OyB0ZXh0LWFsaWduOmxlZnQ7XCI+YCArXG4gICAgICAgIGA8dGggc3R5bGU9XCIke3RoU31cIj5Qcm92aWRlcjwvdGg+YCArXG4gICAgICAgIGA8dGggc3R5bGU9XCIke3RoU31cIj5Nb2RlbDwvdGg+YCArXG4gICAgICAgIGA8dGggc3R5bGU9XCIke3RoU30gdGV4dC1hbGlnbjpyaWdodDtcIj5Db250ZXh0PC90aD5gICtcbiAgICAgICAgYDx0aCBzdHlsZT1cIiR7dGhTfSB0ZXh0LWFsaWduOnJpZ2h0O1wiIHRpdGxlPVwiVVNEIHBlciAxTSBpbnB1dCB0b2tlbnMgKGRpcmVjdCBBUEkgYmlsbGluZylcIj4kLzFNIGluPC90aD5gICtcbiAgICAgICAgYDx0aCBzdHlsZT1cIiR7dGhTfSB0ZXh0LWFsaWduOnJpZ2h0O1wiIHRpdGxlPVwiVVNEIHBlciAxTSBvdXRwdXQgdG9rZW5zIChkaXJlY3QgQVBJIGJpbGxpbmcpXCI+JC8xTSBvdXQ8L3RoPmAgK1xuICAgICAgICBgPHRoIHN0eWxlPVwiJHt0aFN9IHRleHQtYWxpZ246cmlnaHQ7XCIgdGl0bGU9XCJHaXRIdWIgQ29waWxvdCBwcmVtaXVtLXJlcXVlc3QgbXVsdGlwbGllciAoMCA9IGZyZWUgZm9yIHBhaWQgc3Vic2NyaWJlcnMpXCI+Q29waWxvdDwvdGg+YCArXG4gICAgICAgIGA8dGggc3R5bGU9XCIke3RoU31cIj5Tb3VyY2U8L3RoPmAgK1xuICAgICAgICBgPHRoIHN0eWxlPVwiJHt0aFN9XCI+Tm90ZXM8L3RoPmAgK1xuICAgICAgYDwvdHI+YDtcbiAgfVxuXG4gIC8vIFRlYXIgZG93biBhbnkgZXhpc3RpbmcgRGF0YVRhYmxlIGJlZm9yZSByZWJ1aWxkaW5nIHJvd3MuXG4gIGlmICh3aW5kb3cuJCAmJiAkLmZuICYmICQuZm4uRGF0YVRhYmxlICYmICQuZm4uRGF0YVRhYmxlLmlzRGF0YVRhYmxlKCcjbW9kZWwtdGFibGUnKSkge1xuICAgIHRyeSB7XG4gICAgICBfbW9kZWxEYXRhVGFibGUgPSAkKCcjbW9kZWwtdGFibGUnKS5EYXRhVGFibGUoKTtcbiAgICAgIF9tb2RlbERhdGFUYWJsZS5kZXN0cm95KCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nLndhcm4oJ0RhdGFUYWJsZS5kZXN0cm95KCkgZmFpbGVkICh0YWJsZSBtYXkgYWxyZWFkeSBiZSB0b3JuIGRvd24pOicsIGUpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBfbW9kZWxEYXRhVGFibGUgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8vIFByZWZlciBjcm9zcy1wcm92aWRlciBsaXN0OyBmYWxsIGJhY2sgdG8gY3VycmVudC1wcm92aWRlciBhdmFpbGFibGUgbGlzdFxuICBsZXQgcm93cyA9IChfbW9kZWxEYXRhLmFsbF9tb2RlbHMgJiYgX21vZGVsRGF0YS5hbGxfbW9kZWxzLmxlbmd0aClcbiAgICA/IF9tb2RlbERhdGEuYWxsX21vZGVscy5maWx0ZXIociA9PiByLm1vZGVsKVxuICAgIDogKF9tb2RlbERhdGEuYXZhaWxhYmxlIHx8IFtdKS5tYXAociA9PlxuICAgICAgICB0eXBlb2YgciA9PT0gJ29iamVjdCdcbiAgICAgICAgICA/IHsgLi4uciwgcHJvdmlkZXI6IGN1cnJlbnRQcm92aWRlciB9XG4gICAgICAgICAgOiB7IG1vZGVsOiByLCBwcm92aWRlcjogY3VycmVudFByb3ZpZGVyIH1cbiAgICAgICk7XG5cbiAgX3JlbmRlclF1aWNrTW9kZWxMaXN0KHJvd3MpO1xuICB0Ym9keS5pbm5lckhUTUwgPSAnJztcbiAgY29uc3QgdGRCYXNlICA9ICdwYWRkaW5nOjlweCAxNHB4OyBib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZTJlOGYwOyc7XG4gIGNvbnN0IGZtdENvc3QgPSB2ID0+ICh2ICE9IG51bGwpID8gJyQnICsgTnVtYmVyKHYpLnRvRml4ZWQodiA8IDEgPyAzIDogMikgOiAnXHUyMDE0JztcbiAgY29uc3QgZm10UHJpY2VIaW50ID0gc291cmNlID0+IHtcbiAgICBpZiAoc291cmNlID09PSAncnVudGltZV9jYWNoZScpIHtcbiAgICAgIHJldHVybiAnPHNwYW4gdGl0bGU9XCJQcmljZSBmcm9tIHJ1bnRpbWUgY2FjaGVcIiBzdHlsZT1cIm1hcmdpbi1sZWZ0OjZweDsgZGlzcGxheTppbmxpbmUtYmxvY2s7IHBhZGRpbmc6MXB4IDVweDsgYm9yZGVyLXJhZGl1czo5OTlweDsgYmFja2dyb3VuZDojZWNmZWZmOyBjb2xvcjojMGY3NjZlOyBmb250LXNpemU6MC43MmVtOyBmb250LXdlaWdodDo2MDA7IHZlcnRpY2FsLWFsaWduOm1pZGRsZTtcIj5jYWNoZTwvc3Bhbj4nO1xuICAgIH1cbiAgICByZXR1cm4gJzxzcGFuIHRpdGxlPVwiUHJpY2UgZnJvbSBzdGF0aWMgYmFzZWxpbmVcIiBzdHlsZT1cIm1hcmdpbi1sZWZ0OjZweDsgZGlzcGxheTppbmxpbmUtYmxvY2s7IHBhZGRpbmc6MXB4IDVweDsgYm9yZGVyLXJhZGl1czo5OTlweDsgYmFja2dyb3VuZDojZjhmYWZjOyBjb2xvcjojNjQ3NDhiOyBmb250LXNpemU6MC43MmVtOyBmb250LXdlaWdodDo2MDA7IHZlcnRpY2FsLWFsaWduOm1pZGRsZTtcIj5zdGF0aWM8L3NwYW4+JztcbiAgfTtcbiAgY29uc3QgZm10U291cmNlID0gcyA9PiB7XG4gICAgaWYgKHMgPT09ICdsaXN0X21vZGVscycpIHtcbiAgICAgIHJldHVybiAnPHNwYW4gc3R5bGU9XCJkaXNwbGF5OmlubGluZS1ibG9jazsgcGFkZGluZzoycHggNnB4OyBib3JkZXItcmFkaXVzOjk5OXB4OyBiYWNrZ3JvdW5kOiNlY2ZlZmY7IGNvbG9yOiMwZjc2NmU7IGZvbnQtc2l6ZTowLjc4ZW07IGZvbnQtd2VpZ2h0OjYwMDtcIj5saXN0X21vZGVsczwvc3Bhbj4nO1xuICAgIH1cbiAgICByZXR1cm4gJzxzcGFuIHN0eWxlPVwiZGlzcGxheTppbmxpbmUtYmxvY2s7IHBhZGRpbmc6MnB4IDZweDsgYm9yZGVyLXJhZGl1czo5OTlweDsgYmFja2dyb3VuZDojZjFmNWY5OyBjb2xvcjojNDc1NTY5OyBmb250LXNpemU6MC43OGVtOyBmb250LXdlaWdodDo2MDA7XCI+ZmFsbGJhY2tfc3RhdGljPC9zcGFuPic7XG4gIH07XG4gIGNvbnN0IGZtdE11bHQgPSB2ID0+IHtcbiAgICBpZiAodiA9PSBudWxsKSByZXR1cm4gJ1x1MjAxNCc7XG4gICAgaWYgKHYgPT09IDApICAgcmV0dXJuICc8c3BhbiBzdHlsZT1cImNvbG9yOiMxNmEzNGE7IGZvbnQtd2VpZ2h0OjYwMDtcIj5mcmVlPC9zcGFuPic7XG4gICAgcmV0dXJuIE51bWJlcih2KS50b0ZpeGVkKHYgJSAxID09PSAwID8gMCA6IDIpICsgJyZ0aW1lczsnO1xuICB9O1xuXG4gIHJvd3MuZm9yRWFjaChpdGVtID0+IHtcbiAgICBjb25zdCBwcm92aWRlciAgID0gaXRlbS5wcm92aWRlciB8fCBjdXJyZW50UHJvdmlkZXI7XG4gICAgY29uc3QgbSAgICAgICAgICA9IGl0ZW0ubW9kZWw7XG4gICAgY29uc3QgY3R4ICAgICAgICA9IGl0ZW0uY29udGV4dF93aW5kb3cgPyBOdW1iZXIoaXRlbS5jb250ZXh0X3dpbmRvdykudG9Mb2NhbGVTdHJpbmcoKSA6ICdcdTIwMTQnO1xuICAgIGNvbnN0IHNvdXJjZSAgICAgPSBpdGVtLnNvdXJjZSB8fCAnZmFsbGJhY2tfc3RhdGljJztcbiAgICBjb25zdCBwcmljZVNvdXJjZSA9IGl0ZW0ucHJpY2Vfc291cmNlIHx8ICdzdGF0aWNfYmFzZWxpbmUnO1xuICAgIGNvbnN0IG5vdGVzICAgICAgPSBpdGVtLm5vdGVzIHx8ICcnO1xuICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSAocHJvdmlkZXIgPT09IGN1cnJlbnRQcm92aWRlciAmJiBtID09PSBjdXJyZW50TW9kZWwpO1xuXG4gICAgY29uc3QgdHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpO1xuICAgIHRyLnNldEF0dHJpYnV0ZSgnZGF0YS1wcm92aWRlcicsIHByb3ZpZGVyKTtcbiAgICB0ci5zZXRBdHRyaWJ1dGUoJ2RhdGEtbW9kZWwnLCBtKTtcbiAgICBfYXBwbHlNb2RlbFJvd1Zpc3VhbFN0YXRlKHRyLCBpc1NlbGVjdGVkKTtcbiAgICB0ci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCAoKSA9PiB7XG4gICAgICBpZiAoIXRyLmNsYXNzTGlzdC5jb250YWlucygnbW9kZWwtcm93LWFjdGl2ZScpKSB0ci5zdHlsZS5iYWNrZ3JvdW5kID0gJyNmOGZhZmMnO1xuICAgIH0pO1xuICAgIHRyLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0JywgKCkgPT4ge1xuICAgICAgaWYgKCF0ci5jbGFzc0xpc3QuY29udGFpbnMoJ21vZGVsLXJvdy1hY3RpdmUnKSkgdHIuc3R5bGUuYmFja2dyb3VuZCA9ICcnO1xuICAgIH0pO1xuXG4gICAgdHIuaW5uZXJIVE1MID1cbiAgICAgIGA8dGQgc3R5bGU9XCIke3RkQmFzZX0gY29sb3I6IzY0NzQ4Yjsgd2hpdGUtc3BhY2U6bm93cmFwO1wiPiR7ZXNjYXBlSHRtbChfcHJvdmlkZXJEaXNwbGF5TGFiZWwocHJvdmlkZXIpKX08L3RkPmAgK1xuICAgICAgYDx0ZCBzdHlsZT1cIiR7dGRCYXNlfVwiPiR7ZXNjYXBlSHRtbChtKX08L3RkPmAgK1xuICAgICAgYDx0ZCBzdHlsZT1cIiR7dGRCYXNlfSB3aGl0ZS1zcGFjZTpub3dyYXA7IHRleHQtYWxpZ246cmlnaHQ7IGZvbnQtdmFyaWFudC1udW1lcmljOnRhYnVsYXItbnVtcztcIj4ke2N0eH08L3RkPmAgK1xuICAgICAgYDx0ZCBzdHlsZT1cIiR7dGRCYXNlfSB0ZXh0LWFsaWduOnJpZ2h0OyBmb250LXZhcmlhbnQtbnVtZXJpYzp0YWJ1bGFyLW51bXM7IHdoaXRlLXNwYWNlOm5vd3JhcDtcIj4ke2ZtdENvc3QoaXRlbS5jb3N0X2lucHV0KX0ke2ZtdFByaWNlSGludChwcmljZVNvdXJjZSl9PC90ZD5gICtcbiAgICAgIGA8dGQgc3R5bGU9XCIke3RkQmFzZX0gdGV4dC1hbGlnbjpyaWdodDsgZm9udC12YXJpYW50LW51bWVyaWM6dGFidWxhci1udW1zOyB3aGl0ZS1zcGFjZTpub3dyYXA7XCI+JHtmbXRDb3N0KGl0ZW0uY29zdF9vdXRwdXQpfSR7Zm10UHJpY2VIaW50KHByaWNlU291cmNlKX08L3RkPmAgK1xuICAgICAgYDx0ZCBzdHlsZT1cIiR7dGRCYXNlfSB0ZXh0LWFsaWduOnJpZ2h0OyBmb250LXZhcmlhbnQtbnVtZXJpYzp0YWJ1bGFyLW51bXM7IHdoaXRlLXNwYWNlOm5vd3JhcDtcIj4ke2ZtdE11bHQoaXRlbS5jb3BpbG90X211bHRpcGxpZXIpfTwvdGQ+YCArXG4gICAgICBgPHRkIHN0eWxlPVwiJHt0ZEJhc2V9IHdoaXRlLXNwYWNlOm5vd3JhcDtcIj4ke2ZtdFNvdXJjZShzb3VyY2UpfTwvdGQ+YCArXG4gICAgICBgPHRkIHN0eWxlPVwiJHt0ZEJhc2V9IGNvbG9yOiM2NDc0OGI7XCI+JHtlc2NhcGVIdG1sKG5vdGVzKX08L3RkPmA7XG4gICAgdGJvZHkuYXBwZW5kQ2hpbGQodHIpO1xuICB9KTtcblxuICAvLyBSZWJpbmQgcm93IGNsaWNrIHVzaW5nIGRlbGVnYXRpb24gc28gc29ydGluZy9maWx0ZXIgcmVkcmF3cyBzdGlsbCB3b3JrLlxuICB0Ym9keS5vbmNsaWNrID0gYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgY29uc3QgdHIgPSBldmVudC50YXJnZXQuY2xvc2VzdCgndHInKTtcbiAgICBpZiAoIXRyKSByZXR1cm47XG4gICAgY29uc3QgcHJvdmlkZXIgPSB0ci5nZXRBdHRyaWJ1dGUoJ2RhdGEtcHJvdmlkZXInKTtcbiAgICBjb25zdCBtb2RlbCA9IHRyLmdldEF0dHJpYnV0ZSgnZGF0YS1tb2RlbCcpO1xuICAgIGlmICghbW9kZWwpIHJldHVybjtcblxuICAgIC8vIEltbWVkaWF0ZSBmZWVkYmFjayB3aGlsZSB0aGUgQVBJIGNhbGwgaXMgaW4tZmxpZ2h0XG4gICAgdHIuc3R5bGUuY3NzVGV4dCA9ICdiYWNrZ3JvdW5kOiNmZWYzYzc7IGN1cnNvcjp3YWl0OyBvcGFjaXR5OjAuODU7JztcbiAgICBjb25zdCBtb2RlbENlbGwgPSB0ci5jZWxscyAmJiB0ci5jZWxsc1sxXTtcbiAgICBpZiAobW9kZWxDZWxsKSB7XG4gICAgICBtb2RlbENlbGwuaW5uZXJIVE1MID1cbiAgICAgICAgYDxzcGFuIGNsYXNzPVwibG9hZGluZy1zcGlubmVyXCIgc3R5bGU9XCJ3aWR0aDoxNHB4O2hlaWdodDoxNHB4O2JvcmRlci13aWR0aDoycHg7dmVydGljYWwtYWxpZ246bWlkZGxlO21hcmdpbi1yaWdodDo2cHg7XCI+PC9zcGFuPiR7ZXNjYXBlSHRtbChtb2RlbCl9YDtcbiAgICB9XG4gICAgY29uc3Qgc3RhdHVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLXRlc3Qtc3RhdHVzJyk7XG4gICAgaWYgKHN0YXR1cykge1xuICAgICAgc3RhdHVzLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIHN0YXR1cy5zdHlsZS5jb2xvciAgID0gJyM5MjQwMGUnO1xuICAgICAgc3RhdHVzLmlubmVySFRNTCAgICAgPVxuICAgICAgICBgPHNwYW4gY2xhc3M9XCJsb2FkaW5nLXNwaW5uZXJcIiBzdHlsZT1cIndpZHRoOjE0cHg7aGVpZ2h0OjE0cHg7Ym9yZGVyLXdpZHRoOjJweDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7bWFyZ2luLXJpZ2h0OjZweDtcIj48L3NwYW4+IFN3aXRjaGluZyB0byAke2VzY2FwZUh0bWwobW9kZWwpfVxcdTIwMjZgO1xuICAgIH1cblxuICAgIGF3YWl0IHNldE1vZGVsKG1vZGVsLCBwcm92aWRlcik7XG4gIH07XG5cbiAgLy8gRW5oYW5jZSB3aXRoIERhdGFUYWJsZXMgZm9yIHNvcnRpbmcvc2VhcmNoaW5nOyBrZWVwIHBhZ2luZyBkaXNhYmxlZC5cbiAgaWYgKHdpbmRvdy4kICYmICQuZm4gJiYgJC5mbi5EYXRhVGFibGUpIHtcbiAgICBfbW9kZWxEYXRhVGFibGUgPSAkKCcjbW9kZWwtdGFibGUnKS5EYXRhVGFibGUoe1xuICAgICAgcGFnaW5nOiBmYWxzZSxcbiAgICAgIHNlYXJjaGluZzogdHJ1ZSxcbiAgICAgIGluZm86IGZhbHNlLFxuICAgICAgb3JkZXJDZWxsc1RvcDogdHJ1ZSxcbiAgICAgIG9yZGVyOiBbWzAsICdhc2MnXSwgWzEsICdhc2MnXV0sXG4gICAgICBhdXRvV2lkdGg6IGZhbHNlLFxuICAgICAgbGFuZ3VhZ2U6IHsgc2VhcmNoOiAnRmlsdGVyOicgfSxcbiAgICAgIGluaXRDb21wbGV0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIGNvbnN0IGFwaSA9IHRoaXMuYXBpKCk7XG4gICAgICAgIGNvbnN0ICR0aGVhZCA9ICQoJyNtb2RlbC10YWJsZSB0aGVhZCcpO1xuICAgICAgICBjb25zdCBoYXNGaWx0ZXJSb3cgPSAkdGhlYWQuZmluZCgndHIubW9kZWwtZmlsdGVyLXJvdycpLmxlbmd0aCA+IDA7XG4gICAgICAgIGlmICghaGFzRmlsdGVyUm93KSB7XG4gICAgICAgICAgY29uc3QgJGZpbHRlclJvdyA9ICQoJzx0ciBjbGFzcz1cIm1vZGVsLWZpbHRlci1yb3dcIj48L3RyPicpO1xuICAgICAgICAgIGFwaS5jb2x1bW5zKCkuZXZlcnkoZnVuY3Rpb24oY29sSWR4KSB7XG4gICAgICAgICAgICBjb25zdCB0aXRsZSA9ICQoYXBpLmNvbHVtbihjb2xJZHgpLmhlYWRlcigpKS50ZXh0KCkudHJpbSgpO1xuICAgICAgICAgICAgY29uc3QgJHRoID0gJCgnPHRoIHN0eWxlPVwicGFkZGluZzo2cHggMTBweDsgYmFja2dyb3VuZDojZjhmYWZjOyBib3JkZXItdG9wOjFweCBzb2xpZCAjZTJlOGYwO1wiPjwvdGg+Jyk7XG4gICAgICAgICAgICBjb25zdCAkaW5wdXQgPSAkKCc8aW5wdXQ+Jywge1xuICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiB0aXRsZSxcbiAgICAgICAgICAgICAgc3R5bGU6ICd3aWR0aDoxMDAlOyBwYWRkaW5nOjRweCA2cHg7IGJvcmRlcjoxcHggc29saWQgI2NiZDVlMTsgYm9yZGVyLXJhZGl1czo0cHg7IGZvbnQtc2l6ZTowLjgyZW07JyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgJHRoLmFwcGVuZCgkaW5wdXQpO1xuICAgICAgICAgICAgJGZpbHRlclJvdy5hcHBlbmQoJHRoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICAkdGhlYWQuYXBwZW5kKCRmaWx0ZXJSb3cpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXBpLmNvbHVtbnMoKS5ldmVyeShmdW5jdGlvbihjb2xJZHgpIHtcbiAgICAgICAgICBjb25zdCAkaW5wdXQgPSAkKCcjbW9kZWwtdGFibGUgdGhlYWQgdHIubW9kZWwtZmlsdGVyLXJvdyB0aCcpLmVxKGNvbElkeCkuZmluZCgnaW5wdXQnKTtcbiAgICAgICAgICBpZiAoISRpbnB1dC5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgICAkaW5wdXQub2ZmKCdjbGljay5tb2RlbEZpbHRlciBrZXl1cC5tb2RlbEZpbHRlciBjaGFuZ2UubW9kZWxGaWx0ZXInKTtcbiAgICAgICAgICAkaW5wdXQub24oJ2NsaWNrLm1vZGVsRmlsdGVyJywgZnVuY3Rpb24oZXZlbnQpIHsgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IH0pO1xuICAgICAgICAgICRpbnB1dC5vbigna2V5dXAubW9kZWxGaWx0ZXIgY2hhbmdlLm1vZGVsRmlsdGVyJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgICAgICAgICBpZiAoYXBpLmNvbHVtbihjb2xJZHgpLnNlYXJjaCgpICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgICBhcGkuY29sdW1uKGNvbElkeCkuc2VhcmNoKHZhbHVlKS5kcmF3KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIF9zeW5jTW9kZWxUYWJsZVNlbGVjdGlvbigpO1xuXG4gIC8vIFVwZGF0ZSBwcmljaW5nIGZyZXNobmVzcyBmb290ZXJcbiAgX3VwZGF0ZVByaWNpbmdGb290ZXIoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0TW9kZWwobW9kZWwsIHByb3ZpZGVyKSB7XG4gIGlmICghbW9kZWwpIHJldHVybjtcbiAgX3Nob3dNb2RlbFdpemFyZEJ1c3koYEFwcGx5aW5nIG1vZGVsICR7bW9kZWx9Li4uYCk7XG4gIHRyeSB7XG4gICAgY29uc3QgcGF5bG9hZCA9IHByb3ZpZGVyID8geyBtb2RlbCwgcHJvdmlkZXIgfSA6IHsgbW9kZWwgfTtcbiAgICBhd2FpdCBhcGlDYWxsKCdQT1NUJywgJy9hcGkvbW9kZWwnLCBwYXlsb2FkKTtcbiAgICBpZiAoX21vZGVsRGF0YSkge1xuICAgICAgX21vZGVsRGF0YS5tb2RlbCA9IG1vZGVsO1xuICAgICAgaWYgKHByb3ZpZGVyKSBfbW9kZWxEYXRhLnByb3ZpZGVyID0gcHJvdmlkZXI7XG4gICAgfVxuICAgIGNvbnN0IGVmZmVjdGl2ZVByb3ZpZGVyID0gKF9tb2RlbERhdGEgJiYgX21vZGVsRGF0YS5wcm92aWRlcikgfHwgcHJvdmlkZXI7XG4gICAgY29uc3QgbGFiZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtY3VycmVudC1sYWJlbCcpO1xuICAgIGlmIChsYWJlbCkge1xuICAgICAgbGFiZWwudGV4dENvbnRlbnQgPSBlZmZlY3RpdmVQcm92aWRlciA/IGAke2VmZmVjdGl2ZVByb3ZpZGVyfSBcdTAwQjcgJHttb2RlbH1gIDogbW9kZWw7XG4gICAgfVxuICAgIF9hcHBlbmRSZWNlbnRNb2RlbChlZmZlY3RpdmVQcm92aWRlciwgbW9kZWwpO1xuICAgIF9zeW5jTW9kZWxUYWJsZVNlbGVjdGlvbigpO1xuICAgIF9yZW5kZXJRdWlja01vZGVsTGlzdCgoX21vZGVsRGF0YSAmJiBfbW9kZWxEYXRhLmFsbF9tb2RlbHMpIHx8IFtdKTtcbiAgICBfdXBkYXRlTGxtU3RhdHVzUGlsbCgnY29uZmlndXJlZCcsIGAke2VmZmVjdGl2ZVByb3ZpZGVyIHx8ICdQcm92aWRlcid9IGNvbmZpZ3VyZWRgKTtcblxuICAgIF9zYXZlTW9kZWxQcmVmc1RvU3RvcmFnZSh7XG4gICAgICBjdXJyZW50TW9kZWxQcm92aWRlcjogZWZmZWN0aXZlUHJvdmlkZXIgfHwgbnVsbCxcbiAgICAgIGN1cnJlbnRNb2RlbE5hbWU6IG1vZGVsIHx8IG51bGwsXG4gICAgfSk7XG4gICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzLnVwZGF0ZUF1dGhCYWRnZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZ2xvYmFsVGhpcy51cGRhdGVBdXRoQmFkZ2Uoe30sIGVmZmVjdGl2ZVByb3ZpZGVyIHx8IG51bGwpO1xuICAgIH1cbiAgICBhd2FpdCBfcmVmcmVzaENvcGlsb3RBdXRoU3RhdHVzKCk7XG4gICAgYXdhaXQgdGVzdEN1cnJlbnRNb2RlbCgpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nLmVycm9yKCdGYWlsZWQgdG8gc3dpdGNoIG1vZGVsOicsIGUpO1xuICAgIGNvbnN0IG1zZyA9IGUubWVzc2FnZSB8fCBTdHJpbmcoZSk7XG4gICAgX3N5bmNNb2RlbFRhYmxlU2VsZWN0aW9uKCk7XG4gICAgY29uc3Qgc3RhdHVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLXRlc3Qtc3RhdHVzJyk7XG4gICAgaWYgKHN0YXR1cykge1xuICAgICAgc3RhdHVzLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIHN0YXR1cy5zdHlsZS5jb2xvciA9ICcjZGMyNjI2JztcbiAgICAgIHN0YXR1cy50ZXh0Q29udGVudCA9IGBcdTI3NEMgJHttc2d9YDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBhcHBlbmRNZXNzYWdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCBgXHUyNzRDIE1vZGVsIHN3aXRjaCBmYWlsZWQ6ICR7bXNnfWApO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBfaGlkZU1vZGVsV2l6YXJkQnVzeSgpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRlc3RDdXJyZW50TW9kZWwoKSB7XG4gIC8vIFVwZGF0ZSBib3RoIHRoZSBoZWFkZXIgYmFkZ2UgYW5kIHRoZSBtb2RhbCBzdGF0dXMgbGluZVxuICBjb25zdCBiYWRnZSAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtdGVzdC1iYWRnZScpO1xuICBjb25zdCBzdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtdGVzdC1zdGF0dXMnKTtcbiAgY29uc3QgYnRuICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLXRlc3QtYnRuJyk7XG5cbiAgY29uc3QgU1BJTiA9ICdcdTIzRjMnO1xuICBjb25zdCBPSyAgID0gJ1x1MjcwNSc7XG4gIGNvbnN0IEZBSUwgPSAnXHUyNzRDJztcblxuICBjb25zdCBzZXRSdW5uaW5nID0gKCkgPT4ge1xuICAgIGlmIChiYWRnZSkgIHsgYmFkZ2UudGV4dENvbnRlbnQgID0gU1BJTjsgYmFkZ2Uuc3R5bGUuZGlzcGxheSAgPSAnJzsgYmFkZ2UudGl0bGUgID0gJ1Rlc3RpbmdcdTIwMjYnOyB9XG4gICAgaWYgKHN0YXR1cykgeyBzdGF0dXMuaW5uZXJIVE1MICAgPSBgJHtTUElOfSBUZXN0aW5nIGNvbm5lY3Rpb25cdTIwMjZgOyBzdGF0dXMuc3R5bGUuZGlzcGxheSA9ICcnOyB9XG4gICAgaWYgKGJ0bikgICAgeyBidG4uZGlzYWJsZWQgPSB0cnVlOyBidG4udGV4dENvbnRlbnQgPSAnXHUyM0YzIFRlc3RpbmdcdTIwMjYnOyB9XG4gICAgX3VwZGF0ZUxsbVN0YXR1c1BpbGwoJ2Nvbm5lY3RpbmcnLCAnQ29ubmVjdGluZ1x1MjAyNicsICdcdTI5RDcnKTtcbiAgfTtcblxuICBjb25zdCBzZXRPayA9IChsYXRlbmN5TXMpID0+IHtcbiAgICBjb25zdCB0aXAgPSBgQ29ubmVjdGVkIFx1MjAxNCAke2xhdGVuY3lNc31tc2A7XG4gICAgaWYgKGJhZGdlKSAgeyBiYWRnZS50ZXh0Q29udGVudCAgPSBPSzsgIGJhZGdlLnN0eWxlLmRpc3BsYXkgID0gJyc7IGJhZGdlLnRpdGxlICA9IHRpcDsgfVxuICAgIGlmIChzdGF0dXMpIHsgc3RhdHVzLmlubmVySFRNTCAgID0gYCR7T0t9ICR7dGlwfWA7IHN0YXR1cy5zdHlsZS5jb2xvciA9ICcjMTZhMzRhJzsgc3RhdHVzLnN0eWxlLmRpc3BsYXkgPSAnJzsgfVxuICAgIGlmIChidG4pICAgIHsgYnRuLmRpc2FibGVkID0gZmFsc2U7IGJ0bi5pbm5lckhUTUwgPSAnJiMxMDAwMzsgVGVzdCBjb25uZWN0aW9uJzsgfVxuICAgIF91cGRhdGVMbG1TdGF0dXNQaWxsKCdjb25uZWN0ZWQnLCBgSGVhbHRoeSAoJHtsYXRlbmN5TXN9bXMpYCwgJ1x1MjcxMycpO1xuICAgIGNvbnN0IHN1Y2Nlc3NTdW1tYXJ5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLXN1Y2Nlc3Mtc3VtbWFyeScpO1xuICAgIGlmIChzdWNjZXNzU3VtbWFyeSkge1xuICAgICAgc3VjY2Vzc1N1bW1hcnkudGV4dENvbnRlbnQgPSBgQ29ubmVjdGlvbiB2ZXJpZmllZCBpbiAke2xhdGVuY3lNc31tcy4gWW91IGNhbiBjbG9zZSB0aGUgd2l6YXJkIGFuZCBjb250aW51ZS5gO1xuICAgIH1cbiAgICBfc2V0TW9kZWxXaXphcmRTdGVwKDQpO1xuICB9O1xuXG4gIGNvbnN0IHNldEZhaWwgPSAoZXJyTXNnKSA9PiB7XG4gICAgaWYgKGJhZGdlKSAgeyBiYWRnZS50ZXh0Q29udGVudCAgPSBGQUlMOyBiYWRnZS5zdHlsZS5kaXNwbGF5ICA9ICcnOyBiYWRnZS50aXRsZSAgPSBlcnJNc2c7IH1cbiAgICBpZiAoc3RhdHVzKSB7XG4gICAgICBzdGF0dXMuaW5uZXJIVE1MICAgPSBgJHtGQUlMfSA8c3BhbiB0aXRsZT1cIiR7ZXJyTXNnLnJlcGxhY2UoL1wiL2csICcmcXVvdDsnKX1cIiBzdHlsZT1cImN1cnNvcjpoZWxwOyB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lIGRvdHRlZDtcIj5Db25uZWN0aW9uIGZhaWxlZDwvc3Bhbj5gO1xuICAgICAgc3RhdHVzLnN0eWxlLmNvbG9yID0gJyNkYzI2MjYnO1xuICAgICAgc3RhdHVzLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICB9XG4gICAgaWYgKGJ0bikgICAgeyBidG4uZGlzYWJsZWQgPSBmYWxzZTsgYnRuLmlubmVySFRNTCA9ICcmIzEwMDAzOyBUZXN0IGNvbm5lY3Rpb24nOyB9XG4gICAgX3VwZGF0ZUxsbVN0YXR1c1BpbGwoJ2Vycm9yJywgJ0Nvbm5lY3Rpb24gZmFpbGVkJywgJ1x1MjZBMCcsIGVyck1zZyk7XG4gICAgaWYgKF9tb2RlbFdpemFyZFN0ZXAgPT09IDMpIHtcbiAgICAgIF9zZXRNb2RlbFdpemFyZFN0ZXAoMik7XG4gICAgfVxuICB9O1xuXG4gIHNldFJ1bm5pbmcoKTtcbiAgX3Nob3dNb2RlbFdpemFyZEJ1c3koJ1Rlc3RpbmcgbW9kZWwgY29ubmVjdGlvbi4uLicpO1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFwaUNhbGwoJ1BPU1QnLCAnL2FwaS9tb2RlbC90ZXN0Jyk7XG4gICAgaWYgKHJlc3VsdC5vaykge1xuICAgICAgc2V0T2socmVzdWx0LmxhdGVuY3lfbXMpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHNldEZhaWwocmVzdWx0LmVycm9yIHx8ICdVbmtub3duIGVycm9yJyk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGNhdGNoIChlKSB7XG4gICAgc2V0RmFpbChlLm1lc3NhZ2UgfHwgU3RyaW5nKGUpKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZmluYWxseSB7XG4gICAgX2hpZGVNb2RlbFdpemFyZEJ1c3koKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfdXBkYXRlUHJpY2luZ0Zvb3RlcigpIHtcbiAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJpY2luZy11cGRhdGVkLWxhYmVsJyk7XG4gIGlmICghZWwgfHwgIV9tb2RlbERhdGEpIHJldHVybjtcbiAgY29uc3QgdHMgICAgID0gX21vZGVsRGF0YS5wcmljaW5nX3VwZGF0ZWRfYXQ7XG4gIGNvbnN0IHNvdXJjZSA9IF9tb2RlbERhdGEucHJpY2luZ19zb3VyY2U7XG5cbiAgY29uc3Qgc291cmNlTGFiZWwgPSAoc291cmNlID09PSAnb3BlbnJvdXRlcicpXG4gICAgPyAnPGEgaHJlZj1cImh0dHBzOi8vb3BlbnJvdXRlci5haVwiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyXCIgJyArXG4gICAgICAnc3R5bGU9XCJjb2xvcjppbmhlcml0OyB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lIGRvdHRlZDtcIj5PcGVuUm91dGVyPC9hPidcbiAgICA6ICdzdGF0aWMgYmFzZWxpbmUgKE1hcmNoIDIwMjYpJztcblxuICBpZiAoIXRzKSB7IGVsLmlubmVySFRNTCA9IGBQcmljZXM6ICR7c291cmNlTGFiZWx9YDsgcmV0dXJuOyB9XG4gIHRyeSB7XG4gICAgY29uc3QgZCAgID0gbmV3IERhdGUodHMpO1xuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgY29uc3QgaCAgID0gTWF0aC5yb3VuZCgobm93IC0gZCkgLyAzXzYwMF8wMDApO1xuICAgIGNvbnN0IGFnZSA9IGggPCAxID8gJ2p1c3Qgbm93JyA6IGggPCAyNCA/IGAke2h9aCBhZ29gIDogYCR7TWF0aC5yb3VuZChoIC8gMjQpfWQgYWdvYDtcbiAgICBlbC5pbm5lckhUTUwgPSBgUHJpY2VzIHZpYSAke3NvdXJjZUxhYmVsfSAmbWlkZG90OyB1cGRhdGVkICR7YWdlfWA7XG4gIH0gY2F0Y2ggeyBlbC5pbm5lckhUTUwgPSBgUHJpY2VzOiAke3NvdXJjZUxhYmVsfWA7IH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVmcmVzaE1vZGVsUHJpY2luZygpIHtcbiAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ByaWNpbmctcmVmcmVzaC1idG4nKTtcbiAgY29uc3QgbGJsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ByaWNpbmctdXBkYXRlZC1sYWJlbCcpO1xuICBpZiAoYnRuKSB7IGJ0bi5kaXNhYmxlZCA9IHRydWU7IGJ0bi50ZXh0Q29udGVudCA9ICdSZWZyZXNoaW5nXHUyMDI2JzsgfVxuICBfc2hvd01vZGVsV2l6YXJkQnVzeSgnUmVmcmVzaGluZyBtb2RlbCBwcmljaW5nLi4uJyk7XG4gIHRyeSB7XG4gICAgYXdhaXQgYXBpQ2FsbCgnUE9TVCcsICcvYXBpL21vZGVsLXByaWNpbmcvcmVmcmVzaCcpO1xuICAgIC8vIFJlLWZldGNoIG1vZGVsIGRhdGEgc28gdGhlIHRhYmxlIGdldHMgZnJlc2ggcHJpY2VzXG4gICAgX21vZGVsRGF0YSA9IGF3YWl0IGFwaUNhbGwoJ0dFVCcsICcvYXBpL21vZGVsJyk7XG4gICAgX2J1aWxkTW9kZWxUYWJsZSgpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKGxibCkgbGJsLnRleHRDb250ZW50ID0gJ1JlZnJlc2ggZmFpbGVkJztcbiAgICBsb2cuZXJyb3IoJ1ByaWNpbmcgcmVmcmVzaCBmYWlsZWQ6JywgZSk7XG4gIH0gZmluYWxseSB7XG4gICAgX2hpZGVNb2RlbFdpemFyZEJ1c3koKTtcbiAgICBpZiAoYnRuKSB7IGJ0bi5kaXNhYmxlZCA9IGZhbHNlOyBidG4udGV4dENvbnRlbnQgPSAnXHUyMUJCIFJlZnJlc2ggcHJpY2VzJzsgfVxuICB9XG59XG5cblxuLy8gSGVscGVyOiB1cGRhdGUgd29ya2Zsb3cgc3RlcCBiYXIgY2xpY2thYmxlIHN0YXRlXG5mdW5jdGlvbiB1cGRhdGVXb3JrZmxvd1N0ZXBzQ2xpY2thYmxlKGN1cnJlbnRQaGFzZSkge1xuICAvLyBTZXF1ZW50aWFsIHByZS1sYXlvdXQgc3RlcHMgdW5sb2NrIG9uZS1ieS1vbmUgYXMgdGhlIHVzZXIgcHJvZ3Jlc3Nlcy5cbiAgY29uc3Qgc2VxdWVudGlhbFN0ZXBzID0gW1xuICAgICdzdGVwLWpvYicsXG4gICAgJ3N0ZXAtYW5hbHlzaXMnLFxuICAgICdzdGVwLWN1c3RvbWl6YXRpb25zJyxcbiAgICAnc3RlcC1yZXdyaXRlJyxcbiAgICAnc3RlcC1zcGVsbCcsXG4gICAgJ3N0ZXAtbGF5b3V0JyxcbiAgXTtcbiAgLy8gUG9zdC1sYXlvdXQgc3RlcHMgYWxsIHVubG9jayBzaW11bHRhbmVvdXNseSBvbmNlIGxheW91dCBpcyBjb25maXJtZWQuXG4gIGNvbnN0IHBvc3RMYXlvdXRTdGVwcyA9IFtcbiAgICAnc3RlcC1kb3dubG9hZCcsXG4gICAgJ3N0ZXAtY292ZXJfbGV0dGVyJyxcbiAgICAnc3RlcC1zY3JlZW5pbmcnLFxuICAgICdzdGVwLWludGVydmlld19wcmVwJyxcbiAgICAnc3RlcC10aGFua195b3UnLFxuICAgICdzdGVwLWhhcnZlc3QnLFxuICBdO1xuICAvLyBNYXAgYmFja2VuZCBwaGFzZSBzdHJpbmdzIHRvIGhvdyBtYW55IHNlcXVlbnRpYWwgc3RlcHMgYXJlIHVubG9ja2VkICgwLWJhc2VkIGluZGV4KS5cbiAgY29uc3QgcGhhc2VUb0luZGV4ID0ge1xuICAgICdpbml0JzogICAgICAgICAgICAgMCxcbiAgICAnam9iX2FuYWx5c2lzJzogICAgIDEsXG4gICAgJ2N1c3RvbWl6YXRpb24nOiAgICAyLFxuICAgICdyZXdyaXRlX3Jldmlldyc6ICAgMyxcbiAgICAnc3BlbGxfY2hlY2snOiAgICAgIDQsXG4gICAgJ2dlbmVyYXRpb24nOiAgICAgICA1LFxuICAgICdsYXlvdXRfcmV2aWV3JzogICAgNSxcbiAgICAnZmluYWxfZ2VuZXJhdGlvbic6IDUsXG4gICAgJ3JlZmluZW1lbnQnOiAgICAgICA1LFxuICAgIC8vIExlZ2FjeSBmYWxsYmFja3MgKHN0ZXAgbmFtZXMgc29tZXRpbWVzIHBhc3NlZCBvbiBET01Db250ZW50TG9hZGVkKVxuICAgICdqb2InOiAgICAgICAgICAgICAgMCxcbiAgICAnbGF5b3V0JzogICAgICAgICAgIDUsXG4gICAgJ2ZpbmFsaXNlJzogICAgICAgICA1LFxuICB9O1xuICBjb25zdCBwb3N0TGF5b3V0VW5sb2NrZWQgPSBbJ2ZpbmFsX2dlbmVyYXRpb24nLCAncmVmaW5lbWVudCddLmluY2x1ZGVzKGN1cnJlbnRQaGFzZSk7XG4gIGNvbnN0IGN1cnJlbnRJZHggPSBwaGFzZVRvSW5kZXhbY3VycmVudFBoYXNlXSA/PyAwO1xuXG4gIGZ1bmN0aW9uIF9tYWtlU3RlcENsaWNrYWJsZShlbCkge1xuICAgIGlmICghZWwgfHwgZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdjbGlja2FibGUnKSkgcmV0dXJuO1xuICAgIGVsLmNsYXNzTGlzdC5hZGQoJ2NsaWNrYWJsZScpO1xuICAgIGVsLnNldEF0dHJpYnV0ZSgncm9sZScsICdidXR0b24nKTtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTtcbiAgICBpZiAoIWVsLl9zdGVwS2V5SGFuZGxlcikge1xuICAgICAgZWwuX3N0ZXBLZXlIYW5kbGVyID0gKGUpID0+IHtcbiAgICAgICAgaWYgKGUua2V5ID09PSAnRW50ZXInIHx8IGUua2V5ID09PSAnICcpIHtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgZWwuY2xpY2soKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBlbC5fc3RlcEtleUhhbmRsZXIpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIF9tYWtlU3RlcEluZXJ0KGVsKSB7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoJ2NsaWNrYWJsZScpO1xuICAgIGVsLnJlbW92ZUF0dHJpYnV0ZSgncm9sZScpO1xuICAgIGVsLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnLTEnKTtcbiAgICBpZiAoZWwuX3N0ZXBLZXlIYW5kbGVyKSB7XG4gICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZWwuX3N0ZXBLZXlIYW5kbGVyKTtcbiAgICAgIGRlbGV0ZSBlbC5fc3RlcEtleUhhbmRsZXI7XG4gICAgfVxuICB9XG5cbiAgc2VxdWVudGlhbFN0ZXBzLmZvckVhY2goKGlkLCBpZHgpID0+IHtcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICBpZiAoIWVsKSByZXR1cm47XG4gICAgaWYgKGlkeCA8PSBjdXJyZW50SWR4IHx8IHBvc3RMYXlvdXRVbmxvY2tlZCkge1xuICAgICAgX21ha2VTdGVwQ2xpY2thYmxlKGVsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgX21ha2VTdGVwSW5lcnQoZWwpO1xuICAgIH1cbiAgfSk7XG5cbiAgcG9zdExheW91dFN0ZXBzLmZvckVhY2goaWQgPT4ge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgIGlmICghZWwpIHJldHVybjtcbiAgICBpZiAocG9zdExheW91dFVubG9ja2VkKSB7XG4gICAgICBfbWFrZVN0ZXBDbGlja2FibGUoZWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICBfbWFrZVN0ZXBJbmVydChlbCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBNYXJrIHRoZSBjdXJyZW50bHkgYWN0aXZlIHN0ZXAgZm9yIHNjcmVlbiByZWFkZXJzLlxuICBjb25zdCBhbGxTdGVwSWRzID0gWy4uLnNlcXVlbnRpYWxTdGVwcywgLi4ucG9zdExheW91dFN0ZXBzXTtcbiAgYWxsU3RlcElkcy5mb3JFYWNoKGlkID0+IHtcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICBpZiAoZWwpIGVsLnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1jdXJyZW50Jyk7XG4gIH0pO1xuICAvLyBGb3IgcG9zdC1sYXlvdXQgcGhhc2VzLCBtYXJrIHN0ZXAtZG93bmxvYWQgYXMgdGhlIGFjdGl2ZSBzdGVwIHNvIHNjcmVlbiByZWFkZXJzXG4gIC8vIGhhdmUgYSBwcm9ncmFtbWF0aWMgY3VycmVudC1wb3NpdGlvbiBpbmRpY2F0b3IuXG4gIGNvbnN0IGFjdGl2ZVN0ZXBJZCA9IHBvc3RMYXlvdXRVbmxvY2tlZCA/ICdzdGVwLWRvd25sb2FkJyA6IHNlcXVlbnRpYWxTdGVwc1tjdXJyZW50SWR4XTtcbiAgaWYgKGFjdGl2ZVN0ZXBJZCkge1xuICAgIGNvbnN0IGFjdGl2ZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYWN0aXZlU3RlcElkKTtcbiAgICBpZiAoYWN0aXZlRWwpIGFjdGl2ZUVsLnNldEF0dHJpYnV0ZSgnYXJpYS1jdXJyZW50JywgJ3N0ZXAnKTtcbiAgfVxufVxuXG4vLyBJbml0aWFsaXplIG9uIHBhZ2UgbG9hZCBcdTIwMTQgZGVsZWdhdGVzIHRvIGFwcC5qcyBpbml0KCkgd2hpY2ggaXMgbG9hZGVkIGFmdGVyIHRoaXMgZmlsZVxuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsICgpID0+IHtcbiAgbG9hZE1vZGVsU2VsZWN0b3IoKTtcblxuICAvLyBXaXJlIHVwIHRhYiBzY3JvbGwgYXJyb3cgYnV0dG9uc1xuICBjb25zdCB0YWJCYXIgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWItYmFyJyk7XG4gIGNvbnN0IGxlZnRCdG4gID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYi1zY3JvbGwtbGVmdCcpO1xuICBjb25zdCByaWdodEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWItc2Nyb2xsLXJpZ2h0Jyk7XG4gIGlmICh0YWJCYXIgJiYgbGVmdEJ0biAmJiByaWdodEJ0bikge1xuICAgIGxlZnRCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAgKCkgPT4geyB0YWJCYXIuc2Nyb2xsQnkoeyBsZWZ0OiAtMTYwLCBiZWhhdmlvcjogJ3Ntb290aCcgfSk7IH0pO1xuICAgIHJpZ2h0QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4geyB0YWJCYXIuc2Nyb2xsQnkoeyBsZWZ0OiAgMTYwLCBiZWhhdmlvcjogJ3Ntb290aCcgfSk7IH0pO1xuICAgIHRhYkJhci5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB1cGRhdGVUYWJTY3JvbGxCdXR0b25zKTtcbiAgICBuZXcgUmVzaXplT2JzZXJ2ZXIodXBkYXRlVGFiU2Nyb2xsQnV0dG9ucykub2JzZXJ2ZSh0YWJCYXIpO1xuICB9XG5cbiAgLy8gU2hvdyBvbmx5IHRoZSBKb2IgdGFiIHVudGlsIGZldGNoU3RhdHVzIHJlc29sdmVzIHRoZSBhY3R1YWwgc3RhZ2VcbiAgdXBkYXRlVGFiQmFyRm9yU3RhZ2UoJ2pvYicpO1xuICB1cGRhdGVXb3JrZmxvd1N0ZXBzQ2xpY2thYmxlKCdqb2InKTtcblxuICAvLyBMaXN0ZW4gZm9yIHBoYXNlIGNoYW5nZXMgdG8gdXBkYXRlIGNsaWNrYWJsZSBzdGVwc1xuICBpZiAodHlwZW9mIHN0YXRlTWFuYWdlcj8ub25QaGFzZUNoYW5nZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHN0YXRlTWFuYWdlci5vblBoYXNlQ2hhbmdlKChwaGFzZSkgPT4ge1xuICAgICAgdXBkYXRlV29ya2Zsb3dTdGVwc0NsaWNrYWJsZShwaGFzZSk7XG4gICAgfSk7XG4gIH1cblxufSk7XG5cbi8vIFx1MjUwMFx1MjUwMCBFUyBtb2R1bGUgZXhwb3J0cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmV4cG9ydCB7XG4gIC8vIEZvY3VzIC8gYWNjZXNzaWJpbGl0eVxuICBzZXRJbml0aWFsRm9jdXMsIHRyYXBGb2N1cywgcmVzdG9yZUZvY3VzLCBwdXNoRm9jdXNTdGFjayxcbiAgLy8gRGlhbG9ncyAmIG1vZGFsc1xuICBjb25maXJtRGlhbG9nLCBvcGVuTW9kYWwsIGNsb3NlTW9kYWwsIGNsb3NlQWxsTW9kYWxzLFxuICAvLyBUYWIgJiBzdGFnZSBtYW5hZ2VtZW50XG4gIHNldHVwRXZlbnRMaXN0ZW5lcnMsIGdldFN0YWdlRm9yVGFiLCBnZXRWaXNpYmxlU3RhZ2UsIHVwZGF0ZVRhYkJhckZvclN0YWdlLFxuICAvLyBDaGF0XG4gIHRvZ2dsZUNoYXQsXG4gIC8vIE1vZGVsIHNlbGVjdG9yXG4gIGxvYWRNb2RlbFNlbGVjdG9yLCBvcGVuTW9kZWxNb2RhbCwgY2xvc2VNb2RlbE1vZGFsLCBzZXRNb2RlbCwgdGVzdEN1cnJlbnRNb2RlbCwgcmVmcmVzaE1vZGVsUHJpY2luZyxcbiAgdG9nZ2xlTW9kZWxDYXRhbG9nVmlzaWJpbGl0eSwgc3RhcnRDb3BpbG90QXV0aEZyb21XaXphcmQsIGxvZ291dENvcGlsb3RBdXRoRnJvbVdpemFyZCxcbiAgbmV4dFdpemFyZFN0ZXAsIHByZXZpb3VzV2l6YXJkU3RlcCxcbiAgc2F2ZVByb3ZpZGVyQXBpS2V5LCB0b2dnbGVBcGlLZXlWaXNpYmlsaXR5LFxuICBfdXBkYXRlTGxtU3RhdHVzUGlsbCxcbiAgLy8gU2V0dGluZ3MgbW9kYWxcbiAgb3BlblNldHRpbmdzTW9kYWwsIGNsb3NlU2V0dGluZ3NNb2RhbCwgc2F2ZVNldHRpbmdzTW9kYWwsIHJlbG9hZFNldHRpbmdzTW9kYWwsXG59O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiBsYXlvdXQtaW5zdHJ1Y3Rpb24uanNcbiAqIEZyb250ZW5kIFVJIGZvciBuYXR1cmFsLWxhbmd1YWdlIGxheW91dCBpbnN0cnVjdGlvbiB3b3JrZmxvdy5cbiAqIEhhbmRsZXMgaW5zdHJ1Y3Rpb24gc3VibWlzc2lvbiwgcHJldmlldyB1cGRhdGVzLCBhbmQgaW5zdHJ1Y3Rpb24gaGlzdG9yeS5cbiAqL1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5jb25zdCBsb2cgPSBnZXRMb2dnZXIoJ2xheW91dC1pbnN0cnVjdGlvbicpO1xuXG5pbXBvcnQgeyBhcGlDYWxsIH0gZnJvbSAnLi9hcGktY2xpZW50LmpzJztcbmltcG9ydCB7IHNjaGVkdWxlQXRzUmVmcmVzaCB9IGZyb20gJy4vYXRzLXJlZmluZW1lbnQuanMnO1xuaW1wb3J0IHsgYXBwZW5kTWVzc2FnZSwgYXBwZW5kTWVzc2FnZUh0bWwgfSBmcm9tICcuL21lc3NhZ2UtcXVldWUuanMnO1xuaW1wb3J0IHsgc3dpdGNoVGFiIH0gZnJvbSAnLi9yZXZpZXctdGFibGUtYmFzZS5qcyc7XG5pbXBvcnQgeyBzdGF0ZU1hbmFnZXIsIEdFTkVSQVRJT05fU1RBVEVfRVZFTlQsIEdFTkVSQVRJT05fUEhBU0VTIH0gZnJvbSAnLi9zdGF0ZS1tYW5hZ2VyLmpzJztcbmltcG9ydCB7IGVzY2FwZUh0bWwgfSBmcm9tICcuL3V0aWxzLmpzJztcbmltcG9ydCB7IGNvbmZpcm1SZVJ1blBoYXNlIH0gZnJvbSAnLi93b3JrZmxvdy1zdGVwcy5qcyc7XG5cbmxldCBkaXNtaXNzZWRTdGFsZUNhbGxvdXRSZXZpc2lvbiA9IG51bGw7XG5cbi8qKlxuICogQ29udmVydCBhIENTUyBwaXhlbCB2YWx1ZSB0byBpdHMgdHlwb2dyYXBoaWMgcG9pbnQgZXF1aXZhbGVudC5cbiAqIEFzc3VtZXMgdGhlIHN0YW5kYXJkIHNjcmVlbiByZXNvbHV0aW9uIGNvbnZlbnRpb246IDk2IHB4L2luLCA3MiBwdC9pbixcbiAqIHNvIDFweCA9IDAuNzUgcHQuXG4gKiBAcGFyYW0ge251bWJlcn0gcHhcbiAqIEByZXR1cm5zIHtudW1iZXJ9IHB0IHZhbHVlIHJvdW5kZWQgdG8gb25lIGRlY2ltYWwgcGxhY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHB4VG9QdChweCkge1xuICByZXR1cm4gTWF0aC5yb3VuZChweCAqIDAuNzUgKiAxMCkgLyAxMDtcbn1cblxuZnVuY3Rpb24gY29lcmNlQm9vbGVhbih2YWx1ZSwgZGVmYXVsdFZhbHVlID0gZmFsc2UpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSByZXR1cm4gdmFsdWU7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IHZhbHVlLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChbJzEnLCAndHJ1ZScsICd5ZXMnLCAnb24nXS5pbmNsdWRlcyhub3JtYWxpemVkKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKFsnMCcsICdmYWxzZScsICdubycsICdvZmYnXS5pbmNsdWRlcyhub3JtYWxpemVkKSkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICByZXR1cm4gQm9vbGVhbih2YWx1ZSk7XG59XG5cbi8vIFVuZG8gc3RhY2sgXHUyMDE0IGVhY2ggZW50cnkgaXMgeyBodG1sLCBpbnN0cnVjdGlvbnMgfSBzbmFwc2hvdHRlZCBiZWZvcmUgYVxuLy8gbGF5b3V0IGluc3RydWN0aW9uIGlzIGFwcGxpZWQuICBDYXAgYXQgMjAgZW50cmllcyB0byBib3VuZCBtZW1vcnkuXG5jb25zdCBfbGF5b3V0VW5kb1N0YWNrID0gW107XG5jb25zdCBfVU5ET19TVEFDS19NQVggPSAyMDtcblxuZnVuY3Rpb24gZ2V0Q3ZBcnRpZmFjdHMoKSB7XG4gIHJldHVybiBzdGF0ZU1hbmFnZXIuZ2V0VGFiRGF0YSgnY3YnKSB8fCB7fTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlQ3ZBcnRpZmFjdHMobmV4dEN2QXJ0aWZhY3RzKSB7XG4gIHN0YXRlTWFuYWdlci5zZXRUYWJEYXRhKCdjdicsIG5leHRDdkFydGlmYWN0cyk7XG59XG5cbmZ1bmN0aW9uIHNldFByZXZpZXdIdG1sKGh0bWwpIHtcbiAgdXBkYXRlQ3ZBcnRpZmFjdHMoeyAuLi5nZXRDdkFydGlmYWN0cygpLCAnKi5odG1sJzogaHRtbCB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0UHJldmlld091dHB1dHMoKSB7XG4gIHJldHVybiBzdGF0ZU1hbmFnZXI/LmdldEdlbmVyYXRpb25TdGF0ZT8uKCk/LnByZXZpZXdPdXRwdXRzIHx8IG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldFByZXZpZXdPdXRwdXRVcmwocmVuZGVyZXIpIHtcbiAgY29uc3Qgc2Vzc2lvbklkID0gc3RhdGVNYW5hZ2VyPy5nZXRTZXNzaW9uSWQ/LigpO1xuICBjb25zdCBzdWZmaXggPSBzZXNzaW9uSWRcbiAgICA/IGA/c2Vzc2lvbl9pZD0ke2VuY29kZVVSSUNvbXBvbmVudChzZXNzaW9uSWQpfWBcbiAgICA6ICcnO1xuICByZXR1cm4gYC9hcGkvY3YvcHJldmlldy1vdXRwdXQvJHtlbmNvZGVVUklDb21wb25lbnQocmVuZGVyZXIpfSR7c3VmZml4fWA7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclByZXZpZXdPdXRwdXRTdGF0dXMocHJldmlld091dHB1dHMgPSBudWxsKSB7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcmV2aWV3LW91dHB1dC1zdGF0dXMnKTtcbiAgaWYgKCFjb250YWluZXIpIHJldHVybjtcblxuICBjb25zdCBwZGZzID0gcHJldmlld091dHB1dHM/LnBkZnMgfHwge307XG4gIGNvbnN0IHJlbmRlcmVyT3JkZXIgPSBbJ2Nocm9tZScsICd3ZWFzeXByaW50J107XG4gIGNvbnN0IGF2YWlsYWJsZVJlbmRlcmVycyA9IHJlbmRlcmVyT3JkZXIuZmlsdGVyKChyZW5kZXJlcktleSkgPT4gcmVuZGVyZXJLZXkgaW4gcGRmcyk7XG5cbiAgaWYgKGF2YWlsYWJsZVJlbmRlcmVycy5sZW5ndGggPT09IDApIHtcbiAgICBjb250YWluZXIuaW5uZXJIVE1MID0gYFxuICAgICAgPGRpdiBjbGFzcz1cInByZXZpZXctb3V0cHV0LWVtcHR5XCI+XG4gICAgICAgIFByZXZpZXcgUERGcyB3aWxsIGFwcGVhciBoZXJlIGFmdGVyIHRoZSBjdXJyZW50IGxheW91dCBpcyByZW5kZXJlZC5cbiAgICAgIDwvZGl2PlxuICAgIGA7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcmVuZGVyZXJMYWJlbHMgPSB7XG4gICAgY2hyb21lOiAnQ2hyb21lJyxcbiAgICB3ZWFzeXByaW50OiAnV2Vhc3lQcmludCcsXG4gIH07XG5cbiAgY29udGFpbmVyLmlubmVySFRNTCA9IGF2YWlsYWJsZVJlbmRlcmVycy5tYXAoKHJlbmRlcmVyS2V5KSA9PiB7XG4gICAgY29uc3QgcmVuZGVyZXIgPSBwZGZzW3JlbmRlcmVyS2V5XSB8fCB7fTtcbiAgICBjb25zdCBvayA9IEJvb2xlYW4ocmVuZGVyZXIub2spO1xuICAgIGNvbnN0IGRldGFpbCA9IHJlbmRlcmVyLnJlbmRlcmVyX2RldGFpbCB8fCByZW5kZXJlci5lcnJvciB8fCAnTm8gZGV0YWlsIGF2YWlsYWJsZSc7XG4gICAgY29uc3QgcmVuZGVyZXJMYWJlbCA9IHJlbmRlcmVyTGFiZWxzW3JlbmRlcmVyS2V5XSB8fCByZW5kZXJlcktleTtcbiAgICBjb25zdCBiYWRnZU1hcmt1cCA9IG9rXG4gICAgICA/IGA8YSBjbGFzcz1cInByZXZpZXctb3V0cHV0LWJhZGdlIHByZXZpZXctb3V0cHV0LWJhZGdlLWxpbmsgaXMtcmVhZHlcIiBocmVmPVwiJHtnZXRQcmV2aWV3T3V0cHV0VXJsKHJlbmRlcmVyS2V5KX1cIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lclwiPiR7cmVuZGVyZXJMYWJlbH0gUmVhZHk8L2E+YFxuICAgICAgOiBgPHNwYW4gY2xhc3M9XCJwcmV2aWV3LW91dHB1dC1iYWRnZSBpcy1mYWlsZWRcIj4ke3JlbmRlcmVyTGFiZWx9IEZhaWxlZDwvc3Bhbj5gO1xuXG4gICAgcmV0dXJuIGBcbiAgICAgIDxkaXYgY2xhc3M9XCJwcmV2aWV3LW91dHB1dC1yb3cgJHtvayA/ICdpcy1yZWFkeScgOiAnaXMtZmFpbGVkJ31cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInByZXZpZXctb3V0cHV0LWNvcHlcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJldmlldy1vdXRwdXQtdGl0bGUtcm93XCI+XG4gICAgICAgICAgICAke2JhZGdlTWFya3VwfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcmV2aWV3LW91dHB1dC1kZXRhaWxcIj4ke2VzY2FwZUh0bWwoZGV0YWlsKX08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICBgO1xuICB9KS5qb2luKCcnKTtcbn1cblxuZnVuY3Rpb24gYXBwZW5kTGF5b3V0U2FmZXR5QWxlcnQoc2FmZXR5QWxlcnQpIHtcbiAgaWYgKCFzYWZldHlBbGVydD8uZmxhZ2dlZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGlzc3VlcyA9IChzYWZldHlBbGVydC5pc3N1ZXMgfHwgW10pXG4gICAgLm1hcChpc3N1ZSA9PiB7XG4gICAgICBjb25zdCB0ZXh0ID0gdHlwZW9mIGlzc3VlID09PSAnc3RyaW5nJ1xuICAgICAgICA/IGlzc3VlXG4gICAgICAgIDogKGlzc3VlPy5kZXRhaWwgfHwgaXNzdWU/Lmlzc3VlIHx8IEpTT04uc3RyaW5naWZ5KGlzc3VlKSk7XG4gICAgICByZXR1cm4gYDxsaT4ke2VzY2FwZUh0bWwodGV4dCl9PC9saT5gO1xuICAgIH0pXG4gICAgLmpvaW4oJycpO1xuXG4gIGFwcGVuZE1lc3NhZ2VIdG1sKFxuICAgICdzeXN0ZW0nLFxuICAgIGA8c3Ryb25nPlx1MjZBMFx1RkUwRiBMYXlvdXQgc2FmZXR5IHNhbml0aXphdGlvbiBhcHBsaWVkLjwvc3Ryb25nPjxicj4ke2VzY2FwZUh0bWwoc2FmZXR5QWxlcnQubWVzc2FnZSB8fCAnUG90ZW50aWFsIHByb21wdCBwYXlsb2FkcyBvciB1bnNhZmUgSFRNTCB3ZXJlIHJlbW92ZWQgYmVmb3JlIGFwcGx5aW5nIHRoZSBjaGFuZ2UuJyl9PGJyPjx1bCBzdHlsZT1cIm1hcmdpbjo2cHggMCAwIDE4cHhcIj4ke2lzc3Vlc308L3VsPmAsXG4gICk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUxheW91dEluc3RydWN0aW9uKGluc3RydWN0aW9uID0ge30pIHtcbiAgcmV0dXJuIHtcbiAgICB0aW1lc3RhbXA6IGluc3RydWN0aW9uLnRpbWVzdGFtcCB8fCAnJyxcbiAgICBpbnN0cnVjdGlvbl90ZXh0OiBpbnN0cnVjdGlvbi5pbnN0cnVjdGlvbl90ZXh0IHx8IGluc3RydWN0aW9uLmluc3RydWN0aW9uIHx8ICcnLFxuICAgIGNoYW5nZV9zdW1tYXJ5OiBpbnN0cnVjdGlvbi5jaGFuZ2Vfc3VtbWFyeSB8fCBpbnN0cnVjdGlvbi5zdW1tYXJ5IHx8ICcnLFxuICAgIGNvbmZpcm1hdGlvbjogaW5zdHJ1Y3Rpb24uY29uZmlybWF0aW9uICE9PSBmYWxzZSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0Q3VycmVudENvbnRlbnRSZXZpc2lvbigpIHtcbiAgcmV0dXJuIHN0YXRlTWFuYWdlci5nZXRHZW5lcmF0aW9uU3RhdGUoKS5jb250ZW50UmV2aXNpb24gPz8gMDtcbn1cblxuZnVuY3Rpb24gZm9ybWF0R2VuZXJhdGlvblRpbWVzdGFtcCh0aW1lc3RhbXApIHtcbiAgaWYgKCF0aW1lc3RhbXApIHJldHVybiAnJztcbiAgY29uc3QgcGFyc2VkID0gbmV3IERhdGUodGltZXN0YW1wKTtcbiAgaWYgKE51bWJlci5pc05hTihwYXJzZWQuZ2V0VGltZSgpKSkgcmV0dXJuICcnO1xuICByZXR1cm4gcGFyc2VkLnRvTG9jYWxlU3RyaW5nKFtdLCB7IG1vbnRoOiAnc2hvcnQnLCBkYXk6ICdudW1lcmljJywgaG91cjogJ251bWVyaWMnLCBtaW51dGU6ICcyLWRpZ2l0JyB9KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRMYXlvdXRGcmVzaG5lc3NDaGlwTWFya3VwKGZyZXNobmVzcykge1xuICBpZiAoIWZyZXNobmVzcz8uc2hvd0NoaXApIHJldHVybiAnJztcbiAgY29uc3QgaWNvbiA9IGZyZXNobmVzcy5pc0NyaXRpY2FsID8gJ1x1MjFCQicgOiAoZnJlc2huZXNzLmlzU3RhbGUgPyAnIScgOiAnXHUyNzEzJyk7XG4gIHJldHVybiBgPHNwYW4gY2xhc3M9XCJsYXlvdXQtZnJlc2huZXNzLWNoaXAgJHtmcmVzaG5lc3MudG9uZX0gbGF5b3V0LXBhbmUtZnJlc2huZXNzLWNoaXBcIlxuICAgIGFyaWEtbGFiZWw9XCIke2VzY2FwZUh0bWwoZnJlc2huZXNzLmFyaWFMYWJlbCB8fCAnJyl9XCI+XG4gICAgPHNwYW4gY2xhc3M9XCJsYXlvdXQtZnJlc2huZXNzLWljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj4ke2ljb259PC9zcGFuPlxuICAgIDxzcGFuIGNsYXNzPVwibGF5b3V0LWZyZXNobmVzcy1sYWJlbFwiPiR7ZXNjYXBlSHRtbChmcmVzaG5lc3MubGFiZWwgfHwgJycpfTwvc3Bhbj5cbiAgPC9zcGFuPmA7XG59XG5cbmZ1bmN0aW9uIHJlbmRlckxheW91dFByZXZpZXdTdGF0dXMoKSB7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYXlvdXQtcHJldmlldy1zdGF0dXMnKTtcbiAgaWYgKCFjb250YWluZXIpIHJldHVybjtcbiAgY29uc3QgZnJlc2huZXNzID0gc3RhdGVNYW5hZ2VyLmdldExheW91dEZyZXNobmVzcygpO1xuICBjb25zdCBnZW5lcmF0aW9uU3RhdGUgPSBzdGF0ZU1hbmFnZXIuZ2V0R2VuZXJhdGlvblN0YXRlKCk7XG4gIGlmICghZ2VuZXJhdGlvblN0YXRlLnByZXZpZXdBdmFpbGFibGUpIHtcbiAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG4gICAgY29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGxhc3RQcmV2aWV3UmV2aXNpb24gPSBOdW1iZXIuaXNGaW5pdGUoZ2VuZXJhdGlvblN0YXRlLmxhc3RQcmV2aWV3Q29udGVudFJldmlzaW9uKVxuICAgID8gZ2VuZXJhdGlvblN0YXRlLmxhc3RQcmV2aWV3Q29udGVudFJldmlzaW9uIDogbnVsbDtcbiAgY29uc3QgY3VycmVudFJldmlzaW9uID0gTnVtYmVyLmlzRmluaXRlKGdlbmVyYXRpb25TdGF0ZS5jb250ZW50UmV2aXNpb24pXG4gICAgPyBnZW5lcmF0aW9uU3RhdGUuY29udGVudFJldmlzaW9uIDogbnVsbDtcbiAgY29uc3QgcGVuZGluZ1JldmlzaW9uQ291bnQgPSBsYXN0UHJldmlld1JldmlzaW9uICE9PSBudWxsICYmIGN1cnJlbnRSZXZpc2lvbiAhPT0gbnVsbFxuICAgID8gTWF0aC5tYXgoMCwgY3VycmVudFJldmlzaW9uIC0gbGFzdFByZXZpZXdSZXZpc2lvbikgOiAwO1xuICBjb25zdCB0aW1lc3RhbXBMYWJlbCA9IGZvcm1hdEdlbmVyYXRpb25UaW1lc3RhbXAoZ2VuZXJhdGlvblN0YXRlLnByZXZpZXdHZW5lcmF0ZWRBdCk7XG4gIGNvbnN0IGRldGFpbExpbmVzID0gW107XG4gIGlmICh0aW1lc3RhbXBMYWJlbCkgZGV0YWlsTGluZXMucHVzaChgUHJldmlldyBnZW5lcmF0ZWQgJHt0aW1lc3RhbXBMYWJlbH1gKTtcbiAgaWYgKGdlbmVyYXRpb25TdGF0ZS5sYXlvdXRDb25maXJtZWQgJiYgZ2VuZXJhdGlvblN0YXRlLmNvbmZpcm1lZEF0KSB7XG4gICAgY29uc3QgY29uZmlybWVkTGFiZWwgPSBmb3JtYXRHZW5lcmF0aW9uVGltZXN0YW1wKGdlbmVyYXRpb25TdGF0ZS5jb25maXJtZWRBdCk7XG4gICAgaWYgKGNvbmZpcm1lZExhYmVsKSBkZXRhaWxMaW5lcy5wdXNoKGBMYXlvdXQgY29uZmlybWVkICR7Y29uZmlybWVkTGFiZWx9YCk7XG4gIH1cbiAgaWYgKGZyZXNobmVzcy5pc1N0YWxlKSB7XG4gICAgaWYgKHBlbmRpbmdSZXZpc2lvbkNvdW50ID4gMCkge1xuICAgICAgZGV0YWlsTGluZXMucHVzaChgJHtwZW5kaW5nUmV2aXNpb25Db3VudH0gY29udGVudCBjaGFuZ2Uke3BlbmRpbmdSZXZpc2lvbkNvdW50ID09PSAxID8gJycgOiAncyd9IHNpbmNlIHRoaXMgcHJldmlld2ApO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXRhaWxMaW5lcy5wdXNoKCdDb250ZW50IGNoYW5nZWQgYWZ0ZXIgdGhpcyBwcmV2aWV3IHdhcyBnZW5lcmF0ZWQnKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoZ2VuZXJhdGlvblN0YXRlLmxheW91dENvbmZpcm1lZCB8fCBnZW5lcmF0aW9uU3RhdGUucGhhc2UgPT09ICdjb25maXJtZWQnKSB7XG4gICAgZGV0YWlsTGluZXMucHVzaCgnQ29uZmlybWVkIHByZXZpZXcgbWF0Y2hlcyB0aGUgbGF0ZXN0IGFwcHJvdmVkIGNvbnRlbnQnKTtcbiAgfSBlbHNlIHtcbiAgICBkZXRhaWxMaW5lcy5wdXNoKCdQcmV2aWV3IG1hdGNoZXMgdGhlIGxhdGVzdCBhcHByb3ZlZCBjb250ZW50Jyk7XG4gIH1cbiAgY29uc3Qgc3RhZ2VMYWJlbCA9IGdlbmVyYXRpb25TdGF0ZS5sYXlvdXRDb25maXJtZWQgfHwgZ2VuZXJhdGlvblN0YXRlLnBoYXNlID09PSAnY29uZmlybWVkJ1xuICAgID8gJ1JlYWR5IGZvciBmaW5hbCBmaWxlcycgOiAnUmVhZHkgZm9yIGxheW91dCByZXZpZXcnO1xuICAvLyBQYWdlIGNvdW50IGJhZGdlOiBzaG93biB3aGVuIGEgcGFnZSBjb3VudCBpcyBhdmFpbGFibGUgZnJvbSB0aGUgcHJldmlld1xuICBjb25zdCBwYyA9IGdlbmVyYXRpb25TdGF0ZS5wYWdlQ291bnRFeGFjdCA/PyBnZW5lcmF0aW9uU3RhdGUucGFnZUNvdW50RXN0aW1hdGU7XG4gIGxldCBwYWdlQ291bnRCYWRnZSA9ICcnO1xuICBpZiAocGMgIT09IG51bGwgJiYgcGMgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IHBjTGFiZWwgID0gZ2VuZXJhdGlvblN0YXRlLnBhZ2VDb3VudEV4YWN0ICE9PSBudWxsID8gYCR7cGN9IHBhZ2Uke3BjICE9PSAxID8gJ3MnIDogJyd9YCA6IGB+JHtwY30gcGFnZSR7cGMgIT09IDEgPyAncycgOiAnJ31gO1xuICAgIGNvbnN0IHBjV2FybiAgID0gZ2VuZXJhdGlvblN0YXRlLnBhZ2VXYXJuaW5nO1xuICAgIHBhZ2VDb3VudEJhZGdlID0gYDxzcGFuIGNsYXNzPVwibGF5b3V0LXBhZ2UtY291bnQtYmFkZ2Uke3BjV2FybiA/ICcgd2FybicgOiAnJ31cIiB0aXRsZT1cIiR7cGNXYXJuID8gJ1BhZ2UgY291bnQgb3V0c2lkZSByZWNvbW1lbmRlZCByYW5nZScgOiAnUGFnZSBjb3VudCB3aXRoaW4gcmFuZ2UnfVwiPiR7cGNXYXJuID8gJ1x1MjZBMCAnIDogJ1x1RDgzRFx1RENDNCAnfSR7ZXNjYXBlSHRtbChwY0xhYmVsKX08L3NwYW4+YDtcbiAgfVxuICBjb250YWluZXIuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgY2xhc3M9XCJsYXlvdXQtcHJldmlldy1zdGF0dXMtY2FyZCAke2ZyZXNobmVzcy50b25lfVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImxheW91dC1wcmV2aWV3LXN0YXR1cy1oZWFkZXJcIj5cbiAgICAgICAgJHtidWlsZExheW91dEZyZXNobmVzc0NoaXBNYXJrdXAoZnJlc2huZXNzKX1cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJsYXlvdXQtcHJldmlldy1zdGF0dXMtc3RhZ2VcIj4ke2VzY2FwZUh0bWwoc3RhZ2VMYWJlbCl9PC9zcGFuPlxuICAgICAgICAke3BhZ2VDb3VudEJhZGdlfVxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwibGF5b3V0LXByZXZpZXctc3RhdHVzLWRldGFpbHNcIj5cbiAgICAgICAgJHtkZXRhaWxMaW5lcy5tYXAoKGxpbmUpID0+IGA8ZGl2PiR7ZXNjYXBlSHRtbChsaW5lKX08L2Rpdj5gKS5qb2luKCcnKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PmA7XG4gIGNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbn1cblxuZnVuY3Rpb24gcmVuZGVyTGF5b3V0U3RhbGVDYWxsb3V0KCkge1xuICBjb25zdCBjYWxsb3V0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xheW91dC1zdGFsZS1jYWxsb3V0Jyk7XG4gIGlmICghY2FsbG91dCkgcmV0dXJuO1xuXG4gIGNvbnN0IGZyZXNobmVzcyA9IHN0YXRlTWFuYWdlci5nZXRMYXlvdXRGcmVzaG5lc3MoKTtcbiAgY29uc3QgY29udGVudFJldmlzaW9uID0gZ2V0Q3VycmVudENvbnRlbnRSZXZpc2lvbigpO1xuICBjb25zdCBpc0Rpc21pc3NlZCA9IGRpc21pc3NlZFN0YWxlQ2FsbG91dFJldmlzaW9uID09PSBjb250ZW50UmV2aXNpb247XG5cbiAgaWYgKCFmcmVzaG5lc3MuaXNTdGFsZSB8fCBpc0Rpc21pc3NlZCkge1xuICAgIGlmICghZnJlc2huZXNzLmlzU3RhbGUpIGRpc21pc3NlZFN0YWxlQ2FsbG91dFJldmlzaW9uID0gbnVsbDtcbiAgICBjYWxsb3V0LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY2FsbG91dC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbn1cblxuZnVuY3Rpb24gcmVmcmVzaExheW91dFJldmlld1N0YXRlKCkge1xuICBjb25zdCBmcmVzaG5lc3MgPSBzdGF0ZU1hbmFnZXIuZ2V0TGF5b3V0RnJlc2huZXNzKCk7XG4gIGNvbnN0IGdlbmVyYXRpb25TdGF0ZSA9IHN0YXRlTWFuYWdlci5nZXRHZW5lcmF0aW9uU3RhdGUoKTtcbiAgY29uc3QgY29uZmlybUJ0biAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29uZmlybS1sYXlvdXQtYnRuJyk7XG4gIGNvbnN0IGZpbmFsQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Byb2NlZWQtdG8tZmluYWxpc2UtYnRuJyk7XG5cbiAgcmVuZGVyTGF5b3V0UHJldmlld1N0YXR1cygpO1xuICByZW5kZXJMYXlvdXRTdGFsZUNhbGxvdXQoKTtcbiAgcmVuZGVyRGlydHlQaGFzZXNDYWxsb3V0KCk7XG5cbiAgY29uc3QgZGlydHlQaGFzZXMgPSBzdGF0ZU1hbmFnZXIuZ2V0RGlydHlQaGFzZXMoKTtcbiAgY29uc3QgaGFzRGlydHkgPSBkaXJ0eVBoYXNlcy5sZW5ndGggPiAwO1xuXG4gIGNvbnN0IHNob3dDb25maXJtID0gZ2VuZXJhdGlvblN0YXRlLnByZXZpZXdBdmFpbGFibGUgJiYgIWZyZXNobmVzcy5pc1N0YWxlICYmICFnZW5lcmF0aW9uU3RhdGUubGF5b3V0Q29uZmlybWVkICYmICFoYXNEaXJ0eVxuICAgID8gJ2Jsb2NrJ1xuICAgIDogJ25vbmUnO1xuXG4gIGlmIChjb25maXJtQnRuKSAgY29uZmlybUJ0bi5zdHlsZS5kaXNwbGF5ICA9IHNob3dDb25maXJtO1xuICBjb25zdCBoaW50RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGF5b3V0LXR3by1zdGVwLWhpbnQnKTtcbiAgaWYgKGhpbnRFbCkgaGludEVsLnN0eWxlLmRpc3BsYXkgPSBzaG93Q29uZmlybTtcblxuICBpZiAoZmluYWxCdG4pIHtcbiAgICBmaW5hbEJ0bi5zdHlsZS5kaXNwbGF5ID0gZ2VuZXJhdGlvblN0YXRlLnByZXZpZXdBdmFpbGFibGVcbiAgICAgICYmICFmcmVzaG5lc3MuaXNTdGFsZVxuICAgICAgJiYgIWhhc0RpcnR5XG4gICAgICAmJiAoZ2VuZXJhdGlvblN0YXRlLmxheW91dENvbmZpcm1lZCB8fCBnZW5lcmF0aW9uU3RhdGUucGhhc2UgPT09ICdjb25maXJtZWQnKVxuICAgICAgPyAnYmxvY2snXG4gICAgICA6ICdub25lJztcbiAgfVxufVxuXG4vKipcbiAqIEluaXRpYWxpemUgbGF5b3V0IGluc3RydWN0aW9uIFVJIGFuZCBldmVudCBoYW5kbGVycy5cbiAqIENhbGxlZCB3aGVuIGxheW91dCB0YWIgaXMgYWN0aXZhdGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBpbml0aWF0ZUxheW91dEluc3RydWN0aW9ucygpIHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25UYWIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9jdW1lbnQtY29udGVudCcpO1xuICBpZiAoIWluc3RydWN0aW9uVGFiKSByZXR1cm47XG5cbiAgLy8gQ3JlYXRlIHR3by1jb2x1bW4gbGF5b3V0IGlmIGl0IGRvZXNuJ3QgZXhpc3RcbiAgaWYgKCFpbnN0cnVjdGlvblRhYi5xdWVyeVNlbGVjdG9yKCcubGF5b3V0LWluc3RydWN0aW9uLXBhbmVsJykpIHtcbiAgICBpbnN0cnVjdGlvblRhYi5pbm5lckhUTUwgPSBgXG4gICAgICA8ZGl2IGNsYXNzPVwibGF5b3V0LWluc3RydWN0aW9uLXBhbmVsXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsYXlvdXQtcHJldmlldy1wYW5lXCI+XG4gICAgICAgICAgPGgzPkN1cnJlbnQgTGF5b3V0IFByZXZpZXc8L2gzPlxuICAgICAgICAgIDxkaXYgaWQ9XCJsYXlvdXQtcHJldmlldy1zdGF0dXNcIiBjbGFzcz1cImxheW91dC1wcmV2aWV3LXN0YXR1c1wiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPjwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcmV2aWV3LWlmcmFtZS1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJwcmV2aWV3LWxvYWRpbmctb3ZlcmxheVwiIGNsYXNzPVwicHJldmlldy1sb2FkaW5nLW92ZXJsYXlcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNwaW5uZXJcIj48L2Rpdj5cbiAgICAgICAgICAgICAgPHAgY2xhc3M9XCJwcmV2aWV3LWxvYWRpbmctbGFiZWxcIj5SZW5kZXJpbmcgcHJldmlld1x1MjAyNjwvcD5cbiAgICAgICAgICAgICAgPHAgaWQ9XCJwcmV2aWV3LWxvYWRpbmctbG9nXCIgY2xhc3M9XCJwcmV2aWV3LWxvYWRpbmctbG9nXCI+PC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8aWZyYW1lIGlkPVwibGF5b3V0LXByZXZpZXdcIiBjbGFzcz1cImxheW91dC1wcmV2aWV3LWlmcmFtZVwiIHRpdGxlPVwiQ1YgTGF5b3V0IFByZXZpZXdcIiBzYW5kYm94PVwiYWxsb3ctc2FtZS1vcmlnaW5cIiByZWZlcnJlcnBvbGljeT1cIm5vLXJlZmVycmVyXCI+PC9pZnJhbWU+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJsYXlvdXQtaW5wdXQtcGFuZVwiPlxuICAgICAgICAgIDxoMz5MYXlvdXQgUmV2aWV3PC9oMz5cbiAgICAgICAgICA8cCBjbGFzcz1cImxheW91dC1zY29wZS1sYWJlbFwiPlx1RDgzRFx1RENBMSBEZXNjcmliZSBhIGxheW91dCBjaGFuZ2UgKHNwYWNpbmcsIG1hcmdpbnMsIGNvbHVtbiB3aWR0aHMsIHNlY3Rpb24gb3JkZXIpLiBUZXh0IGNvbnRlbnQgaXMgZmluYWxpc2VkIFx1MjAxNCBjb250ZW50IGVkaXRzIGFyZSBub3QgYXBwbGllZCBoZXJlLjwvcD5cbiAgICAgICAgICA8ZGl2IGlkPVwibGF5b3V0LXBhZ2UtZXN0aW1hdGVcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTttYXJnaW4tYm90dG9tOjEwcHg7XCI+PC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGlkPVwibGF5b3V0LXN0YWxlLWNhbGxvdXRcIiBjbGFzcz1cImxheW91dC1zdGFsZS1jYWxsb3V0XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+XG4gICAgICAgICAgICA8aDQ+TGF5b3V0IHByZXZpZXcgaXMgb3V0IG9mIGRhdGU8L2g0PlxuICAgICAgICAgICAgPHA+WW91IGNoYW5nZWQgQ1YgY29udGVudCBhZnRlciB0aGUgY3VycmVudCBwcmV2aWV3IHdhcyBnZW5lcmF0ZWQuIFJlZ2VuZXJhdGUgdGhlIHByZXZpZXcgYmVmb3JlIHRydXN0aW5nIHBhZ2UgY291bnQsIGxheW91dCBmZWVkYmFjaywgb3IgZmluYWwgZmlsZXMuPC9wPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxheW91dC1zdGFsZS1jYWxsb3V0LWFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInJlZ2VuZXJhdGUtbGF5b3V0LXByZXZpZXctYnRuXCIgY2xhc3M9XCJidG4td2FybmluZyBsYXlvdXQtYWN0aW9uLWJ0blwiPlJlZ2VuZXJhdGUgcHJldmlldzwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uIGlkPVwiZGlzbWlzcy1sYXlvdXQtc3RhbGUtYnRuXCIgY2xhc3M9XCJidG4tc2Vjb25kYXJ5IGxheW91dC1hY3Rpb24tYnRuXCI+S2VlcCByZXZpZXdpbmcgY3VycmVudCBwcmV2aWV3PC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcmV2aWV3LW91dHB1dC1jYXJkXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJldmlldy1vdXRwdXQtY2FyZC1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgPGg0PlByZXZpZXcgUERGczwvaDQ+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicHJldmlldy1vdXRwdXQtY2FyZC1ub3RlXCI+Q2hyb21lIGFuZCBXZWFzeVByaW50IHJlbmRlciBpbiBwYXJhbGxlbDwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBpZD1cInByZXZpZXctb3V0cHV0LXN0YXR1c1wiIGNsYXNzPVwicHJldmlldy1vdXRwdXQtc3RhdHVzXCI+PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibGF5b3V0LXNldHRpbmdzLXJvd1wiIHN0eWxlPVwiZGlzcGxheTpmbGV4OyBmbGV4LXdyYXA6d3JhcDsgYWxpZ24taXRlbXM6Y2VudGVyOyBnYXA6MTBweDsgbWFyZ2luLWJvdHRvbToxNHB4OyBwYWRkaW5nOjhweCAxMHB4OyBiYWNrZ3JvdW5kOiNmOGZhZmM7IGJvcmRlcjoxcHggc29saWQgI2UyZThmMDsgYm9yZGVyLXJhZGl1czo2cHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwiYmFzZS1mb250LXNpemUtaW5wdXRcIiBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07IGZvbnQtd2VpZ2h0OjYwMDsgY29sb3I6IzQ3NTU2OTsgd2hpdGUtc3BhY2U6bm93cmFwO1wiPkJhc2UgZm9udCBzaXplOjwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgaWQ9XCJiYXNlLWZvbnQtc2l6ZS1pbnB1dFwiXG4gICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICBtaW49XCI2XCIgbWF4PVwiMTZcIiBzdGVwPVwiMC41XCJcbiAgICAgICAgICAgICAgdmFsdWU9XCIxM1wiXG4gICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6NjBweDsgcGFkZGluZzozcHggNnB4OyBib3JkZXI6MXB4IHNvbGlkICNjYmQ1ZTE7IGJvcmRlci1yYWRpdXM6NHB4OyBmb250LXNpemU6MC45ZW07XCJcbiAgICAgICAgICAgICAgdGl0bGU9XCJDb250cm9scyB0aGUgcm9vdCBmb250IHNpemUgZm9yIHRoZSBDVi4gQWxsIHJlbS1iYXNlZCBzaXplcyBzY2FsZSB3aXRoIHRoaXMgdmFsdWUuXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8c3BhbiBpZD1cImZvbnQtc2l6ZS1wdC1kaXNwbGF5XCIgc3R5bGU9XCJmb250LXNpemU6MC44MmVtOyBjb2xvcjojNjQ3NDhiOyB3aGl0ZS1zcGFjZTpub3dyYXA7XCI+cHgmbmJzcDsoOS44Jm5ic3A7cHQpPC9zcGFuPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBhZ2UtbWFyZ2luLWlucHV0XCIgc3R5bGU9XCJmb250LXNpemU6MC44NWVtOyBmb250LXdlaWdodDo2MDA7IGNvbG9yOiM0NzU1Njk7IHdoaXRlLXNwYWNlOm5vd3JhcDsgbWFyZ2luLWxlZnQ6OHB4O1wiPlBhZ2UgbWFyZ2luIChpbik6PC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBpZD1cInBhZ2UtbWFyZ2luLWlucHV0XCJcbiAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgIG1pbj1cIjAuNVwiIG1heD1cIjEuNVwiIHN0ZXA9XCIwLjA1XCJcbiAgICAgICAgICAgICAgdmFsdWU9XCIwLjVcIlxuICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOjcycHg7IHBhZGRpbmc6M3B4IDZweDsgYm9yZGVyOjFweCBzb2xpZCAjY2JkNWUxOyBib3JkZXItcmFkaXVzOjRweDsgZm9udC1zaXplOjAuOWVtO1wiXG4gICAgICAgICAgICAgIHRpdGxlPVwiQ29udHJvbHMgdGhlIHByaW50IHBhZ2UgbWFyZ2lucyBmb3IgYWxsIFBERiBwYWdlcy5cIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwdWJsaWNhdGlvbnMtc3RhcnQtbmV3LXBhZ2UtaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6aW5saW5lLWZsZXg7IGFsaWduLWl0ZW1zOmNlbnRlcjsgZ2FwOjZweDsgZm9udC1zaXplOjAuODNlbTsgY29sb3I6IzMzNDE1NTsgbWFyZ2luLWxlZnQ6OHB4O1wiPlxuICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJwdWJsaWNhdGlvbnMtc3RhcnQtbmV3LXBhZ2UtaW5wdXRcIiB0eXBlPVwiY2hlY2tib3hcIiAvPlxuICAgICAgICAgICAgICBTdGFydCBQdWJsaWNhdGlvbnMgb24gbmV3IHBhZ2VcbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwic2tpbGxzLXNob3ctZXhwZXJpZW5jZS1zZWxlY3RcIiBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07IGZvbnQtd2VpZ2h0OjYwMDsgY29sb3I6IzQ3NTU2OTsgd2hpdGUtc3BhY2U6bm93cmFwOyBtYXJnaW4tbGVmdDo4cHg7XCI+U2tpbGwgZXhwZXJpZW5jZSBsZXZlbDo8L2xhYmVsPlxuICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICBpZD1cInNraWxscy1zaG93LWV4cGVyaWVuY2Utc2VsZWN0XCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJwYWRkaW5nOjNweCA2cHg7IGJvcmRlcjoxcHggc29saWQgI2NiZDVlMTsgYm9yZGVyLXJhZGl1czo0cHg7IGZvbnQtc2l6ZTowLjllbTtcIlxuICAgICAgICAgICAgICB0aXRsZT1cIkNvbnRyb2xzIHdoZXRoZXIgeWVhcnMgb2YgZXhwZXJpZW5jZSBhcmUgc2hvd24gbmV4dCB0byBlYWNoIHNraWxsLlwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJpbmRpdmlkdWFsXCI+SW5kaXZpZHVhbCBzZXR0aW5nPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJhbHdheXNcIj5BbHdheXM8L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIm5ldmVyXCI+TmV2ZXI8L29wdGlvbj5cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImFwcGx5LWxheW91dC1zZXR0aW5ncy1idG5cIiBjbGFzcz1cImJ0bi1zZWNvbmRhcnlcIiBzdHlsZT1cInBhZGRpbmc6M3B4IDEwcHg7IGZvbnQtc2l6ZTowLjg1ZW07XCI+QXBwbHk8L2J1dHRvbj5cbiAgICAgICAgICAgIDxzcGFuIGlkPVwibGF5b3V0LXNldHRpbmdzLXN0YXR1c1wiIHN0eWxlPVwiZm9udC1zaXplOjAuOGVtOyBjb2xvcjojNjQ3NDhiO1wiPjwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgICAgaWQ9XCJpbnN0cnVjdGlvbi1pbnB1dFwiXG4gICAgICAgICAgICBjbGFzcz1cImxheW91dC1pbnN0cnVjdGlvbi10ZXh0YXJlYVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4sIE1vdmUgUHVibGljYXRpb25zIHNlY3Rpb24gYWZ0ZXIgU2tpbGxzJiMxMDtvcjogU2hvcnRlbiB0aGUgc2Vjb25kIGJ1bGxldCB1bmRlciBHZW5lbnRlY2ggdG8gZm9jdXMgb24gaW1wYWN0JiMxMDtvcjogS2VlcCB0aGUgR2VuZW50ZWNoIGVudHJ5IG9uIG9uZSBwYWdlXCJcbiAgICAgICAgICAgIHJvd3M9XCI2XCI+PC90ZXh0YXJlYT5cblxuICAgICAgICAgIDxidXR0b24gaWQ9XCJhcHBseS1pbnN0cnVjdGlvbi1idG5cIiBjbGFzcz1cImJ0bi1wcmltYXJ5IGxheW91dC1hY3Rpb24tYnRuXCI+XG4gICAgICAgICAgICBBcHBseVxuICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImNvbmZpcm0tbGF5b3V0LWJ0blwiIGNsYXNzPVwiY29udGludWUtYnRuIGxheW91dC1hY3Rpb24tYnRuXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+XG4gICAgICAgICAgICBDb25maXJtIExheW91dFxuICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgPHAgaWQ9XCJsYXlvdXQtdHdvLXN0ZXAtaGludFwiIHN0eWxlPVwiZGlzcGxheTpub25lO2ZvbnQtc2l6ZTowLjgyZW07Y29sb3I6IzZiNzI4MDttYXJnaW46NnB4IDAgMnB4O1wiPlxuICAgICAgICAgICAgT25jZSB0aGUgcHJldmlldyBsb29rcyByaWdodCwgY29uZmlybSB0aGUgbGF5b3V0IFx1MjAxNCB0aGVuIGdlbmVyYXRlIHlvdXIgZmluYWwgc3VibWlzc2lvbiBmaWxlcy5cbiAgICAgICAgICA8L3A+XG5cbiAgICAgICAgICA8ZGl2IGlkPVwicHJvY2Vzc2luZy1pbmRpY2F0b3JcIiBjbGFzcz1cInByb2Nlc3NpbmctaW5kaWNhdG9yXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNwaW5uZXJcIj48L2Rpdj5cbiAgICAgICAgICAgIDxwPkFwcGx5aW5nIGluc3RydWN0aW9uLi4uPC9wPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBpZD1cImNvbmZpcm1hdGlvbi1tZXNzYWdlXCIgY2xhc3M9XCJjb25maXJtYXRpb24tbWVzc2FnZVwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj48L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYXlvdXQtaGlzdG9yeS1zZWN0aW9uXCI+XG4gICAgICAgICAgICA8aDQ+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGlzdG9yeS10b2dnbGVcIj5cdTI1QkM8L3NwYW4+XG4gICAgICAgICAgICAgIEluc3RydWN0aW9uIEhpc3RvcnkgKDxzcGFuIGlkPVwiaW5zdHJ1Y3Rpb24tY291bnRcIj4wPC9zcGFuPilcbiAgICAgICAgICAgIDwvaDQ+XG4gICAgICAgICAgICA8ZGl2IGlkPVwiaW5zdHJ1Y3Rpb24taGlzdG9yeVwiIGNsYXNzPVwiaW5zdHJ1Y3Rpb24taGlzdG9yeS1saXN0XCI+PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwicHJvY2VlZC10by1maW5hbGlzZS1idG5cIiBjbGFzcz1cImNvbnRpbnVlLWJ0biBsYXlvdXQtYWN0aW9uLWJ0blwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cbiAgICAgICAgICAgIEdlbmVyYXRlIEZpbmFsIEZpbGVzXG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8ZGl2IGlkPVwiY29udGVudC1wcm9wb3NhbC1wcm9jZXNzaW5nXCIgY2xhc3M9XCJwcm9jZXNzaW5nLWluZGljYXRvclwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNwaW5uZXJcIj48L2Rpdj5cbiAgICAgICAgICAgIDxwPkdlbmVyYXRpbmcgY29udGVudCBwcm9wb3NhbHNcdTIwMjY8L3A+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBpZD1cImNvbnRlbnQtcHJvcG9zYWxzLXBhbmVsXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+PC9kaXY+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImFwcGx5LWNvbnRlbnQtY2hhbmdlcy1idG5cIiBjbGFzcz1cImJ0bi13YXJuaW5nIGxheW91dC1hY3Rpb24tYnRuXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+XG4gICAgICAgICAgICBBcHBseSBBcHByb3ZlZCBDaGFuZ2VzXG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8ZGl2IGlkPVwiZGlydHktcGhhc2VzLWNhbGxvdXRcIiBjbGFzcz1cImRpcnR5LXBoYXNlcy1jYWxsb3V0XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+XG4gICAgICAgICAgICA8aDQ+XHUyNkEwIENvbnRlbnQgQ2hhbmdlZCBcdTIwMTQgUmUtcnVuIFJlcXVpcmVkPC9oND5cbiAgICAgICAgICAgIDxwPlRleHQgZWRpdHMgaGF2ZSBiZWVuIHN0YWdlZC4gVGhlIGN1cnJlbnQgcHJldmlldyBubyBsb25nZXIgcmVmbGVjdHMgdGhlIHVwZGF0ZWQgY29udGVudC48L3A+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGF5b3V0LXN0YWxlLWNhbGxvdXQtYWN0aW9uc1wiPlxuICAgICAgICAgICAgICA8YnV0dG9uIGlkPVwicmV0dXJuLXRvLWVhcmxpZXN0LWRpcnR5LWJ0blwiIGNsYXNzPVwiYnRuLXdhcm5pbmcgbGF5b3V0LWFjdGlvbi1idG5cIj5cdTIxQkIgUmV0dXJuIHRvIEdlbmVyYXRlIENWPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICBgO1xuXG4gICAgLy8gV2lyZSB1cCBldmVudCBsaXN0ZW5lcnNcbiAgICBzZXR1cExheW91dEluc3RydWN0aW9uTGlzdGVuZXJzKCk7XG4gIH1cblxuICAvLyBSZXN0b3JlIHNhdmVkIGZvbnQgc2l6ZSBmcm9tIHNlc3Npb24gc3RhdGUgaWYgYXZhaWxhYmxlXG4gIGNvbnN0IHNhdmVkRm9udFNpemUgPSBzdGF0ZU1hbmFnZXI/LmdldFNlc3Npb25TdGF0ZT8uKCk/LmJhc2VfZm9udF9zaXplO1xuICBpZiAoc2F2ZWRGb250U2l6ZSkge1xuICAgIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Jhc2UtZm9udC1zaXplLWlucHV0Jyk7XG4gICAgaWYgKGlucHV0KSB7XG4gICAgICBjb25zdCBweCA9IHBhcnNlRmxvYXQoc2F2ZWRGb250U2l6ZSkgfHwgMTM7XG4gICAgICBpbnB1dC52YWx1ZSA9IHB4O1xuICAgICAgY29uc3QgcHREaXNwbGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZvbnQtc2l6ZS1wdC1kaXNwbGF5Jyk7XG4gICAgICBpZiAocHREaXNwbGF5KSBwdERpc3BsYXkudGV4dENvbnRlbnQgPSBgcHhcXHUwMGEwKCR7cHhUb1B0KHB4KX1cXHUwMGEwcHQpYDtcbiAgICB9XG4gIH1cbiAgY29uc3Qgc2F2ZWRQYWdlTWFyZ2luID0gc3RhdGVNYW5hZ2VyPy5nZXRTZXNzaW9uU3RhdGU/LigpPy5wYWdlX21hcmdpbjtcbiAgaWYgKHNhdmVkUGFnZU1hcmdpbikge1xuICAgIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BhZ2UtbWFyZ2luLWlucHV0Jyk7XG4gICAgaWYgKGlucHV0KSBpbnB1dC52YWx1ZSA9IHBhcnNlRmxvYXQoc2F2ZWRQYWdlTWFyZ2luKSB8fCAwLjU7XG4gIH1cbiAgY29uc3QgcHVibGljYXRpb25zU3RhcnRJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWJsaWNhdGlvbnMtc3RhcnQtbmV3LXBhZ2UtaW5wdXQnKTtcbiAgaWYgKHB1YmxpY2F0aW9uc1N0YXJ0SW5wdXQpIHtcbiAgICBjb25zdCBzZXNzaW9uU3RhdGUgPSBzdGF0ZU1hbmFnZXI/LmdldFNlc3Npb25TdGF0ZT8uKCkgfHwge307XG4gICAgY29uc3QgY3VzdG9taXphdGlvblN0YXRlID0gc3RhdGVNYW5hZ2VyPy5nZXRUYWJEYXRhPy4oJ2N1c3RvbWl6YXRpb25zJykgfHwge307XG4gICAgY29uc3Qgc2F2ZWRQdWJsaWNhdGlvbnNTdGFydCA9XG4gICAgICBzZXNzaW9uU3RhdGUucHVibGljYXRpb25zX3N0YXJ0X25ld19wYWdlXG4gICAgICA/PyBzZXNzaW9uU3RhdGU/LmN1c3RvbWl6YXRpb25zPy5wdWJsaWNhdGlvbnNfc3RhcnRfbmV3X3BhZ2VcbiAgICAgID8/IGN1c3RvbWl6YXRpb25TdGF0ZS5wdWJsaWNhdGlvbnNfc3RhcnRfbmV3X3BhZ2VcbiAgICAgID8/IGN1c3RvbWl6YXRpb25TdGF0ZS5wdWJsaWNhdGlvbnNfcGFnZV9icmVha1xuICAgICAgPz8gY3VzdG9taXphdGlvblN0YXRlLnN0YXJ0X3B1YmxpY2F0aW9uc19vbl9uZXdfcGFnZVxuICAgICAgPz8gZmFsc2U7XG4gICAgcHVibGljYXRpb25zU3RhcnRJbnB1dC5jaGVja2VkID0gY29lcmNlQm9vbGVhbihzYXZlZFB1YmxpY2F0aW9uc1N0YXJ0LCBmYWxzZSk7XG4gIH1cbiAgY29uc3Qgc2tpbGxzU2hvd0V4cGVyaWVuY2VTZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGxzLXNob3ctZXhwZXJpZW5jZS1zZWxlY3QnKTtcbiAgaWYgKHNraWxsc1Nob3dFeHBlcmllbmNlU2VsZWN0KSB7XG4gICAgY29uc3Qgc2Vzc2lvblN0YXRlID0gc3RhdGVNYW5hZ2VyPy5nZXRTZXNzaW9uU3RhdGU/LigpIHx8IHt9O1xuICAgIGNvbnN0IGN1c3RvbWl6YXRpb25TdGF0ZSA9IHN0YXRlTWFuYWdlcj8uZ2V0VGFiRGF0YT8uKCdjdXN0b21pemF0aW9ucycpIHx8IHt9O1xuICAgIGNvbnN0IHNhdmVkU2tpbGxzRXhwID1cbiAgICAgIHNlc3Npb25TdGF0ZS5za2lsbHNfc2hvd19leHBlcmllbmNlXG4gICAgICA/PyBzZXNzaW9uU3RhdGU/LmN1c3RvbWl6YXRpb25zPy5za2lsbHNfc2hvd19leHBlcmllbmNlXG4gICAgICA/PyBjdXN0b21pemF0aW9uU3RhdGUuc2tpbGxzX3Nob3dfZXhwZXJpZW5jZVxuICAgICAgPz8gJ2luZGl2aWR1YWwnO1xuICAgIGNvbnN0IHZhbGlkID0gWydhbHdheXMnLCAnbmV2ZXInLCAnaW5kaXZpZHVhbCddO1xuICAgIHNraWxsc1Nob3dFeHBlcmllbmNlU2VsZWN0LnZhbHVlID0gdmFsaWQuaW5jbHVkZXMoc2F2ZWRTa2lsbHNFeHApID8gc2F2ZWRTa2lsbHNFeHAgOiAnaW5kaXZpZHVhbCc7XG4gIH1cblxuICByZW5kZXJQcmV2aWV3T3V0cHV0U3RhdHVzKGdldFByZXZpZXdPdXRwdXRzKCkpO1xuXG4gIC8vIExvYWQgYW5kIGRpc3BsYXkgY3VycmVudCBIVE1MIHByZXZpZXcgdmlhIHRoZSBzdGFnZWQgZ2VuZXJhdGlvbiBjb250cmFjdC5cbiAgLy8gL2FwaS9jdi9nZW5lcmF0ZS1wcmV2aWV3IGdlbmVyYXRlcyBmcmVzaCBIVE1MIGFuZCBzdG9yZXMgaXQgaW4gc2Vzc2lvbiBzdGF0ZS5cbiAgLy8gRmFsbCBiYWNrIHRvIHRoZSBsZWdhY3kgL2FwaS9sYXlvdXQtaHRtbCBlbmRwb2ludCBpZiB0aGUgc2Vzc2lvbiBoYXMgbm9cbiAgLy8gY3VzdG9taXphdGlvbiBkYXRhIHlldCAoZS5nLiBzZXNzaW9uIHJlc3RvcmVkIGFmdGVyIGZ1bGwgZ2VuZXJhdGlvbikuXG4gIGNvbnN0IGNhY2hlZEh0bWwgPSBnZXRDdkFydGlmYWN0cygpWycqLmh0bWwnXSB8fCAnJztcbiAgaWYgKGNhY2hlZEh0bWwpIHtcbiAgICBkaXNwbGF5TGF5b3V0UHJldmlldyhjYWNoZWRIdG1sKTtcbiAgfSBlbHNlIHtcbiAgICBfZmV0Y2hBbmREaXNwbGF5TGF5b3V0UHJldmlldygpO1xuICB9XG5cbiAgLy8gUmVzdG9yZSBhbnkgcHJpb3IgaW5zdHJ1Y3Rpb25zIGZyb20gc2Vzc2lvblxuICBhd2FpdCByZXN0b3JlSW5zdHJ1Y3Rpb25IaXN0b3J5KCk7XG4gIHJlZnJlc2hMYXlvdXRSZXZpZXdTdGF0ZSgpO1xuXG4gIC8vIFNob3cgYSBwcm9hY3RpdmUgcGFnZS1sZW5ndGggZXN0aW1hdGUgc28gdXNlcnMgY2FuIGFkanVzdCBjb250ZW50IGJlZm9yZSBnZW5lcmF0aW5nXG4gIF9mZXRjaFBhZ2VFc3RpbWF0ZSgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBfZmV0Y2hQYWdlRXN0aW1hdGUoKSB7XG4gIGNvbnN0IGJhbm5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYXlvdXQtcGFnZS1lc3RpbWF0ZScpO1xuICBpZiAoIWJhbm5lcikgcmV0dXJuO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL2VzdGltYXRlLXBhZ2VzJyk7XG4gICAgaWYgKCFyZXMub2spIHJldHVybjtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoIWRhdGEub2sgfHwgIWRhdGEuZXN0aW1hdGVkX3BhZ2VzKSByZXR1cm47XG4gICAgY29uc3QgcGFnZXMgPSBkYXRhLmVzdGltYXRlZF9wYWdlcztcbiAgICBjb25zdCBpc092ZXIgPSBwYWdlcyA+IDM7XG4gICAgY29uc3QgY29sb3IgPSBpc092ZXIgPyAnIzkyNDAwZScgOiAnIzE2NjUzNCc7XG4gICAgY29uc3QgYmcgICAgPSBpc092ZXIgPyAnI2ZlZjNjNycgOiAnI2YwZmRmNCc7XG4gICAgY29uc3QgYm9yZGVyID0gaXNPdmVyID8gJyNmY2QzNGQnIDogJyNiYmY3ZDAnO1xuICAgIGNvbnN0IG1zZyAgID0gaXNPdmVyXG4gICAgICA/IGBcdTI2QTAgRXN0aW1hdGVkIH4ke3BhZ2VzfSBwYWdlcyBcdTIwMTQgc2VuaW9yIGNhbmRpZGF0ZSB0YXJnZXQgaXMgMlx1MjAxMzMgcGFnZXMuIENvbnNpZGVyIHJlZHVjaW5nIHNlbGVjdGVkIGJ1bGxldCBwb2ludHMgYmVmb3JlIGdlbmVyYXRpbmcuYFxuICAgICAgOiBgXHUyNzEzIEVzdGltYXRlZCB+JHtwYWdlc30gcGFnZXMgXHUyMDE0IHdpdGhpbiB0aGUgMlx1MjAxMzMgcGFnZSB0YXJnZXQgZm9yIHNlbmlvciBjYW5kaWRhdGVzLmA7XG4gICAgYmFubmVyLnN0eWxlLmNzc1RleHQgPSBgZGlzcGxheTpibG9jaztwYWRkaW5nOjhweCAxMnB4O2JvcmRlci1yYWRpdXM6NnB4O2JvcmRlcjoxcHggc29saWQgJHtib3JkZXJ9O2JhY2tncm91bmQ6JHtiZ307Y29sb3I6JHtjb2xvcn07Zm9udC1zaXplOjAuODdlbTtgO1xuICAgIGJhbm5lci50ZXh0Q29udGVudCA9IG1zZztcbiAgfSBjYXRjaCAoXykgeyAvKiBzaWxlbnQgXHUyMDE0IG5vbi1jcml0aWNhbCAqLyB9XG59XG5cbi8qKlxuICogU2V0IHVwIGV2ZW50IGxpc3RlbmVycyBmb3IgbGF5b3V0IGluc3RydWN0aW9uIFVJLlxuICovXG5mdW5jdGlvbiBzZXR1cExheW91dEluc3RydWN0aW9uTGlzdGVuZXJzKCkge1xuICBjb25zdCBhcHBseUJ0biAgICAgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHBseS1pbnN0cnVjdGlvbi1idG4nKTtcbiAgY29uc3QgY29uZmlybUJ0biAgICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29uZmlybS1sYXlvdXQtYnRuJyk7XG4gIGNvbnN0IHByb2NlZWRCdG4gICAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Byb2NlZWQtdG8tZmluYWxpc2UtYnRuJyk7XG4gIGNvbnN0IHJlZ2VuZXJhdGVCdG4gICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlZ2VuZXJhdGUtbGF5b3V0LXByZXZpZXctYnRuJyk7XG4gIGNvbnN0IGRpc21pc3NDYWxsb3V0QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpc21pc3MtbGF5b3V0LXN0YWxlLWJ0bicpO1xuICBjb25zdCBpbnN0cnVjdGlvbklucHV0ICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnN0cnVjdGlvbi1pbnB1dCcpO1xuICBjb25zdCBoaXN0b3J5VG9nZ2xlICAgICA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5oaXN0b3J5LXRvZ2dsZScpO1xuICBjb25zdCBhcHBseVNldHRpbmdzQnRuICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHBseS1sYXlvdXQtc2V0dGluZ3MtYnRuJyk7XG4gIGNvbnN0IGZvbnRTaXplSW5wdXQgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Jhc2UtZm9udC1zaXplLWlucHV0Jyk7XG4gIGNvbnN0IHBhZ2VNYXJnaW5JbnB1dCAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BhZ2UtbWFyZ2luLWlucHV0Jyk7XG4gIGNvbnN0IHB1YmxpY2F0aW9uc1N0YXJ0SW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHVibGljYXRpb25zLXN0YXJ0LW5ldy1wYWdlLWlucHV0Jyk7XG4gIGNvbnN0IHNraWxsc1Nob3dFeHBlcmllbmNlU2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NraWxscy1zaG93LWV4cGVyaWVuY2Utc2VsZWN0Jyk7XG5cbiAgaWYgKGFwcGx5U2V0dGluZ3NCdG4gJiYgZm9udFNpemVJbnB1dCAmJiBwYWdlTWFyZ2luSW5wdXQgJiYgcHVibGljYXRpb25zU3RhcnRJbnB1dCkge1xuICAgIGFwcGx5U2V0dGluZ3NCdG4uYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICdjbGljaycsXG4gICAgICAoKSA9PiBhcHBseUxheW91dFNldHRpbmdzKFxuICAgICAgICBmb250U2l6ZUlucHV0LnZhbHVlLFxuICAgICAgICBwYWdlTWFyZ2luSW5wdXQudmFsdWUsXG4gICAgICAgIHB1YmxpY2F0aW9uc1N0YXJ0SW5wdXQuY2hlY2tlZCxcbiAgICAgICAgc2tpbGxzU2hvd0V4cGVyaWVuY2VTZWxlY3Q/LnZhbHVlIHx8ICdpbmRpdmlkdWFsJyxcbiAgICAgICksXG4gICAgKTtcbiAgICBmb250U2l6ZUlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xuICAgICAgY29uc3QgcHREaXNwbGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZvbnQtc2l6ZS1wdC1kaXNwbGF5Jyk7XG4gICAgICBpZiAocHREaXNwbGF5KSB7XG4gICAgICAgIGNvbnN0IHB4ID0gcGFyc2VGbG9hdChmb250U2l6ZUlucHV0LnZhbHVlKTtcbiAgICAgICAgcHREaXNwbGF5LnRleHRDb250ZW50ID0gaXNOYU4ocHgpID8gJ3B4JyA6IGBweFxcdTAwYTAoJHtweFRvUHQocHgpfVxcdTAwYTBwdClgO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGZvbnRTaXplSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5cHJlc3MnLCAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSAnRW50ZXInKSB7XG4gICAgICAgIGFwcGx5TGF5b3V0U2V0dGluZ3MoXG4gICAgICAgICAgZm9udFNpemVJbnB1dC52YWx1ZSxcbiAgICAgICAgICBwYWdlTWFyZ2luSW5wdXQudmFsdWUsXG4gICAgICAgICAgcHVibGljYXRpb25zU3RhcnRJbnB1dC5jaGVja2VkLFxuICAgICAgICAgIHNraWxsc1Nob3dFeHBlcmllbmNlU2VsZWN0Py52YWx1ZSB8fCAnaW5kaXZpZHVhbCcsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcGFnZU1hcmdpbklucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXByZXNzJywgKGUpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJykge1xuICAgICAgICBhcHBseUxheW91dFNldHRpbmdzKFxuICAgICAgICAgIGZvbnRTaXplSW5wdXQudmFsdWUsXG4gICAgICAgICAgcGFnZU1hcmdpbklucHV0LnZhbHVlLFxuICAgICAgICAgIHB1YmxpY2F0aW9uc1N0YXJ0SW5wdXQuY2hlY2tlZCxcbiAgICAgICAgICBza2lsbHNTaG93RXhwZXJpZW5jZVNlbGVjdD8udmFsdWUgfHwgJ2luZGl2aWR1YWwnLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgaWYgKGFwcGx5QnRuKSB7XG4gICAgYXBwbHlCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uSW5wdXQudmFsdWUudHJpbSgpO1xuICAgICAgaWYgKCFpbnN0cnVjdGlvbikge1xuICAgICAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnXHUyNkEwXHVGRTBGIFBsZWFzZSBlbnRlciBhbiBpbnN0cnVjdGlvbiBiZWZvcmUgc3VibWl0dGluZy4nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgc3VibWl0U21hcnRJbnN0cnVjdGlvbihpbnN0cnVjdGlvbik7XG4gICAgfSk7XG4gIH1cblxuICBpZiAoY29uZmlybUJ0bikge1xuICAgIGNvbmZpcm1CdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjb25maXJtTGF5b3V0UmV2aWV3KTtcbiAgfVxuXG4gIGlmIChwcm9jZWVkQnRuKSB7XG4gICAgcHJvY2VlZEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGdlbmVyYXRlRmluYWxPdXRwdXRzKTtcbiAgfVxuXG4gIGlmIChyZWdlbmVyYXRlQnRuKSB7XG4gICAgcmVnZW5lcmF0ZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZVJlZ2VuZXJhdGVQcmV2aWV3QWN0aW9uKTtcbiAgfVxuXG4gIGlmIChkaXNtaXNzQ2FsbG91dEJ0bikge1xuICAgIGRpc21pc3NDYWxsb3V0QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgZGlzbWlzc2VkU3RhbGVDYWxsb3V0UmV2aXNpb24gPSBnZXRDdXJyZW50Q29udGVudFJldmlzaW9uKCk7XG4gICAgICByZW5kZXJMYXlvdXRTdGFsZUNhbGxvdXQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChoaXN0b3J5VG9nZ2xlKSB7XG4gICAgaGlzdG9yeVRvZ2dsZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICBlLnRhcmdldC50ZXh0Q29udGVudCA9IGUudGFyZ2V0LnRleHRDb250ZW50ID09PSAnXHUyNUJDJyA/ICdcdTI1QjYnIDogJ1x1MjVCQyc7XG4gICAgICBjb25zdCBoaXN0b3J5TGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnN0cnVjdGlvbi1oaXN0b3J5Jyk7XG4gICAgICBpZiAoaGlzdG9yeUxpc3QpIHtcbiAgICAgICAgaGlzdG9yeUxpc3QuY2xhc3NMaXN0LnRvZ2dsZSgnY29sbGFwc2VkJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBBbGxvdyBFbnRlciBrZXkgdG8gc3VibWl0IGluIHRleHRhcmVhIChTaGlmdCtFbnRlciBmb3IgbmV3IGxpbmUpXG4gIGlmIChpbnN0cnVjdGlvbklucHV0KSB7XG4gICAgaW5zdHJ1Y3Rpb25JbnB1dC5hZGRFdmVudExpc3RlbmVyKCdrZXlwcmVzcycsIChlKSA9PiB7XG4gICAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicgJiYgIWUuc2hpZnRLZXkpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBhcHBseUJ0bj8uY2xpY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIENvbnRlbnQgcHJvcG9zYWwgYW5kIGRpcnR5LXBoYXNlIGJ1dHRvbnNcbiAgY29uc3QgYXBwbHlDb250ZW50Q2hhbmdlc0J0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHBseS1jb250ZW50LWNoYW5nZXMtYnRuJyk7XG4gIGNvbnN0IHJldHVyblRvRGlydHlCdG4gICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmV0dXJuLXRvLWVhcmxpZXN0LWRpcnR5LWJ0bicpO1xuXG4gIGlmIChhcHBseUNvbnRlbnRDaGFuZ2VzQnRuKSB7XG4gICAgYXBwbHlDb250ZW50Q2hhbmdlc0J0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFwcGx5QWNjZXB0ZWRQcm9wb3NhbHMpO1xuICB9XG5cbiAgaWYgKHJldHVyblRvRGlydHlCdG4pIHtcbiAgICByZXR1cm5Ub0RpcnR5QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgY29uc3Qgc3RlcCA9IHN0YXRlTWFuYWdlci5nZXRFYXJsaWVzdERpcnR5U3RlcCgpIHx8ICdnZW5lcmF0ZSc7XG4gICAgICBjb25maXJtUmVSdW5QaGFzZShzdGVwKTtcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFNhdmUgbGF5b3V0IGRpc3BsYXkgc2V0dGluZ3MgdG8gc2Vzc2lvbiBzdGF0ZSwgdGhlbiByZS1yZW5kZXIgdGhlIHByZXZpZXcuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGFwcGx5TGF5b3V0U2V0dGluZ3MoZm9udFNpemVWYWx1ZSwgcGFnZU1hcmdpblZhbHVlLCBwdWJsaWNhdGlvbnNTdGFydE5ld1BhZ2UgPSBmYWxzZSwgc2tpbGxzU2hvd0V4cGVyaWVuY2UgPSAnaW5kaXZpZHVhbCcpIHtcbiAgY29uc3Qgc3RhdHVzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGF5b3V0LXNldHRpbmdzLXN0YXR1cycpO1xuICBjb25zdCBwYXJzZWRGb250U2l6ZSA9IHBhcnNlRmxvYXQoZm9udFNpemVWYWx1ZSk7XG4gIGNvbnN0IHBhcnNlZFBhZ2VNYXJnaW4gPSBwYXJzZUZsb2F0KHBhZ2VNYXJnaW5WYWx1ZSk7XG4gIGlmIChpc05hTihwYXJzZWRGb250U2l6ZSkgfHwgcGFyc2VkRm9udFNpemUgPCA2IHx8IHBhcnNlZEZvbnRTaXplID4gMTYpIHtcbiAgICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJ1x1MjZBMFx1RkUwRiBGb250IG11c3QgYmUgNlx1MjAxMzE2JztcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGlzTmFOKHBhcnNlZFBhZ2VNYXJnaW4pIHx8IHBhcnNlZFBhZ2VNYXJnaW4gPCAwLjUgfHwgcGFyc2VkUGFnZU1hcmdpbiA+IDEuNSkge1xuICAgIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnXHUyNkEwXHVGRTBGIE1hcmdpbiBtdXN0IGJlIDAuNVx1MjAxMzEuNSc7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRyeSB7XG4gICAgaWYgKHN0YXR1c0VsKSBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICdTYXZpbmdcdTIwMjYnO1xuICAgIGNvbnN0IHNhdmVSZXMgPSBhd2FpdCBhcGlDYWxsKCdQT1NUJywgJy9hcGkvbGF5b3V0LXNldHRpbmdzJywge1xuICAgICAgYmFzZV9mb250X3NpemU6IGAke3BhcnNlZEZvbnRTaXplfXB4YCxcbiAgICAgIHBhZ2VfbWFyZ2luOiBgJHtwYXJzZWRQYWdlTWFyZ2lufWluYCxcbiAgICAgIHB1YmxpY2F0aW9uc19zdGFydF9uZXdfcGFnZTogQm9vbGVhbihwdWJsaWNhdGlvbnNTdGFydE5ld1BhZ2UpLFxuICAgICAgc2tpbGxzX3Nob3dfZXhwZXJpZW5jZTogc2tpbGxzU2hvd0V4cGVyaWVuY2UsXG4gICAgfSk7XG4gICAgaWYgKCFzYXZlUmVzLm9rKSB0aHJvdyBuZXcgRXJyb3Ioc2F2ZVJlcy5lcnJvciB8fCAnc2F2ZSBmYWlsZWQnKTtcblxuICAgIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnUmUtcmVuZGVyaW5nXHUyMDI2JztcbiAgICBjb25zdCBwcmV2aWV3UmVzID0gYXdhaXQgYXBpQ2FsbCgnUE9TVCcsICcvYXBpL2N2L2dlbmVyYXRlLXByZXZpZXcnLCB7IGNvbnRlbnRfcmV2aXNpb246IGdldEN1cnJlbnRDb250ZW50UmV2aXNpb24oKSB9KTtcbiAgICBpZiAocHJldmlld1Jlcy5vayAmJiBwcmV2aWV3UmVzLmh0bWwpIHtcbiAgICAgIGRpc3BsYXlMYXlvdXRQcmV2aWV3KHByZXZpZXdSZXMuaHRtbCk7XG4gICAgICBzZXRQcmV2aWV3SHRtbChwcmV2aWV3UmVzLmh0bWwpO1xuICAgICAgZGlzbWlzc2VkU3RhbGVDYWxsb3V0UmV2aXNpb24gPSBudWxsO1xuICAgICAgc3RhdGVNYW5hZ2VyPy5tYXJrUHJldmlld0dlbmVyYXRlZD8uKHtcbiAgICAgICAgcHJldmlld0F2YWlsYWJsZTogdHJ1ZSxcbiAgICAgICAgcHJldmlld091dHB1dHM6IHByZXZpZXdSZXMucHJldmlld19vdXRwdXRzIHx8IG51bGwsXG4gICAgICAgIHBhZ2VDb3VudEVzdGltYXRlOiBwcmV2aWV3UmVzLnBhZ2VfY291bnRfZXN0aW1hdGUgPz8gbnVsbCxcbiAgICAgICAgcGFnZUNvdW50RXhhY3Q6IHByZXZpZXdSZXMucGFnZV9jb3VudF9leGFjdCA/PyBudWxsLFxuICAgICAgICBwYWdlQ291bnRDb25maWRlbmNlOiBwcmV2aWV3UmVzLnBhZ2VfY291bnRfY29uZmlkZW5jZSA/PyBudWxsLFxuICAgICAgICBwYWdlQ291bnRTb3VyY2U6IHByZXZpZXdSZXMucGFnZV9jb3VudF9zb3VyY2UgfHwgbnVsbCxcbiAgICAgICAgcGFnZVdhcm5pbmc6IEJvb2xlYW4ocHJldmlld1Jlcy5wYWdlX2xlbmd0aF93YXJuaW5nKSxcbiAgICAgICAgcHJldmlld0dlbmVyYXRlZEF0OiBwcmV2aWV3UmVzLnByZXZpZXdfZ2VuZXJhdGVkX2F0IHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgcHJldmlld1JlcXVlc3RJZDogcHJldmlld1Jlcy5wcmV2aWV3X3JlcXVlc3RfaWQgfHwgbnVsbCxcbiAgICAgIH0pO1xuICAgICAgcmVuZGVyUHJldmlld091dHB1dFN0YXR1cyhwcmV2aWV3UmVzLnByZXZpZXdfb3V0cHV0cyB8fCBudWxsKTtcbiAgICAgIHJlZnJlc2hMYXlvdXRSZXZpZXdTdGF0ZSgpO1xuICAgICAgKHByZXZpZXdSZXMuY29udGVudF93YXJuaW5ncyB8fCBbXSkuZm9yRWFjaCh3ID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHNob3dUb2FzdCh3Lm1lc3NhZ2UsICd3YXJuaW5nJywgODAwMCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHN0YXR1c0VsKSB7IHN0YXR1c0VsLnRleHRDb250ZW50ID0gJ1x1MjcwNSBBcHBsaWVkJzsgc2V0VGltZW91dCgoKSA9PiB7IHN0YXR1c0VsLnRleHRDb250ZW50ID0gJyc7IH0sIDIwMDApOyB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSBgXHUyNzRDIEZhaWxlZCB0byBhcHBseSBcdTIwMTQgdHJ5IGFnYWluIG9yIHJlZnJlc2guYDtcbiAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCBgXHUyNzRDIENvdWxkIG5vdCBhcHBseSB0aGUgaW5zdHJ1Y3Rpb24uIFRyeSByZXBocmFzaW5nIGl0IG9yIHJlZnJlc2ggdGhlIHBhZ2UgaWYgdGhlIHByb2JsZW0gcGVyc2lzdHMuYCk7XG4gIH1cbn1cblxuLyoqXG4gKiBTdWJtaXQgYW4gaW5zdHJ1Y3Rpb24gdGhyb3VnaCB0aGUgdW5pZmllZCBzbWFydC1pbnN0cnVjdGlvbiBlbmRwb2ludC5cbiAqIFRoZSBiYWNrZW5kIGNsYXNzaWZpZXMgdGhlIGluc3RydWN0aW9uIGFzIGxheW91dCBvciBjb250ZW50IGFuZCBkZWxlZ2F0ZXNcbiAqIHRvIHRoZSBhcHByb3ByaWF0ZSBoYW5kbGVyLiBUaGUgcmVzcG9uc2UgaXMgcm91dGVkIGFjY29yZGluZ2x5IGhlcmUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN1Ym1pdFNtYXJ0SW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb25UZXh0KSB7XG4gIGNvbnN0IGN1cnJlbnRIdG1sID0gZ2V0Q3ZBcnRpZmFjdHMoKVsnKi5odG1sJ10gfHwgJyc7XG4gIC8vIFNuYXBzaG90IHN0YXRlIGZvciB1bmRvIGJlZm9yZSBhcHBseWluZy5cbiAgX2xheW91dFVuZG9TdGFjay5wdXNoKHtcbiAgICBodG1sOiBjdXJyZW50SHRtbCxcbiAgICBpbnN0cnVjdGlvbnM6ICh3aW5kb3cubGF5b3V0SW5zdHJ1Y3Rpb25zIHx8IFtdKS5tYXAoaSA9PiAoeyAuLi5pIH0pKSxcbiAgfSk7XG4gIGlmIChfbGF5b3V0VW5kb1N0YWNrLmxlbmd0aCA+IF9VTkRPX1NUQUNLX01BWCkge1xuICAgIF9sYXlvdXRVbmRvU3RhY2suc2hpZnQoKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgc2hvd1Byb2Nlc3NpbmcodHJ1ZSk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBhcGlDYWxsKCdQT1NUJywgJy9hcGkvY3Yvc21hcnQtaW5zdHJ1Y3Rpb24nLCB7IGluc3RydWN0aW9uOiBpbnN0cnVjdGlvblRleHQgfSk7XG5cbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICBpZiAocmVzcG9uc2UuZXJyb3IgPT09ICdjbGFyaWZ5Jykge1xuICAgICAgICBzaG93Q2xhcmlmaWNhdGlvbkRpYWxvZyhyZXNwb25zZS5xdWVzdGlvbiwgaW5zdHJ1Y3Rpb25UZXh0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFwcGVuZExheW91dFNhZmV0eUFsZXJ0KHJlc3BvbnNlLnNhZmV0eV9hbGVydCk7XG4gICAgICAgIGxldCBlcnJvckh0bWwgPSBgXHUyNkEwXHVGRTBGIEVycm9yOiAke2VzY2FwZUh0bWwocmVzcG9uc2UuZXJyb3IpfSBcdTIwMTQgJHtlc2NhcGVIdG1sKHJlc3BvbnNlLmRldGFpbHMgfHwgJycpfWA7XG4gICAgICAgIGlmIChyZXNwb25zZS5yYXdfcmVzcG9uc2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGVycm9ySHRtbCArPSBgPGJyPjxkZXRhaWxzIHN0eWxlPVwibWFyZ2luLXRvcDo2cHhcIj48c3VtbWFyeSBzdHlsZT1cImN1cnNvcjpwb2ludGVyO2ZvbnQtc2l6ZTowLjg1ZW07Y29sb3I6IzY0NzQ4YlwiPlJhdyBMTE0gcmVzcG9uc2U8L3N1bW1hcnk+PHByZSBzdHlsZT1cImZvbnQtc2l6ZTowLjc1ZW07d2hpdGUtc3BhY2U6cHJlLXdyYXA7d29yZC1icmVhazpicmVhay1hbGw7bWF4LWhlaWdodDoyMDBweDtvdmVyZmxvdy15OmF1dG87YmFja2dyb3VuZDojZjhmYWZjO2JvcmRlcjoxcHggc29saWQgI2UyZThmMDtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjhweDttYXJnaW4tdG9wOjRweFwiPiR7ZXNjYXBlSHRtbChyZXNwb25zZS5yYXdfcmVzcG9uc2UgfHwgJyhlbXB0eSknKX08L3ByZT48L2RldGFpbHM+YDtcbiAgICAgICAgfVxuICAgICAgICBhcHBlbmRNZXNzYWdlSHRtbCgnc3lzdGVtJywgZXJyb3JIdG1sKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpbnN0cnVjdGlvblR5cGUgPSByZXNwb25zZS5pbnN0cnVjdGlvbl90eXBlIHx8ICdsYXlvdXQnO1xuXG4gICAgaWYgKGluc3RydWN0aW9uVHlwZSA9PT0gJ2NvbnRlbnQnKSB7XG4gICAgICAvLyBDb250ZW50IHBhdGg6IHJlbmRlciBwcm9wb3NhbHMgZm9yIHJldmlld1xuICAgICAgY29uc3QgcHJvcG9zYWxzID0gcmVzcG9uc2UucHJvcG9zYWxzIHx8IFtdO1xuICAgICAgaWYgKHByb3Bvc2Fscy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgJ1x1MjZBMFx1RkUwRiBObyBjb250ZW50IHByb3Bvc2FscyB3ZXJlIGdlbmVyYXRlZC4gVHJ5IHJlcGhyYXNpbmcgeW91ciBpbnN0cnVjdGlvbi4nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlbmRlckNvbnRlbnRQcm9wb3NhbHMocHJvcG9zYWxzKTtcbiAgICAgICAgY29uc3QgcGFuZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGVudC1wcm9wb3NhbHMtcGFuZWwnKTtcbiAgICAgICAgaWYgKHBhbmVsKSBwYW5lbC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgIH1cbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnN0cnVjdGlvbi1pbnB1dCcpLnZhbHVlID0gJyc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gTGF5b3V0IHBhdGg6IHVwZGF0ZSBwcmV2aWV3XG4gICAgY29uc3QgbmV3SHRtbCA9IHJlc3BvbnNlLmh0bWw7XG4gICAgZGlzcGxheUxheW91dFByZXZpZXcobmV3SHRtbCk7XG4gICAgYXBwZW5kTGF5b3V0U2FmZXR5QWxlcnQocmVzcG9uc2Uuc2FmZXR5X2FsZXJ0KTtcbiAgICBzZXRQcmV2aWV3SHRtbChuZXdIdG1sKTtcbiAgICBkaXNtaXNzZWRTdGFsZUNhbGxvdXRSZXZpc2lvbiA9IG51bGw7XG4gICAgc3RhdGVNYW5hZ2VyPy5tYXJrUHJldmlld0dlbmVyYXRlZD8uKHtcbiAgICAgIHByZXZpZXdBdmFpbGFibGU6IHRydWUsXG4gICAgICBwcmV2aWV3T3V0cHV0czogcmVzcG9uc2UucHJldmlld19vdXRwdXRzIHx8IG51bGwsXG4gICAgICBsYXlvdXRDb25maXJtZWQ6IGZhbHNlLFxuICAgICAgcGFnZUNvdW50RXN0aW1hdGU6IHJlc3BvbnNlLnBhZ2VfY291bnRfZXN0aW1hdGUgPz8gbnVsbCxcbiAgICAgIHBhZ2VDb3VudEV4YWN0OiByZXNwb25zZS5wYWdlX2NvdW50X2V4YWN0ID8/IG51bGwsXG4gICAgICBwYWdlQ291bnRDb25maWRlbmNlOiByZXNwb25zZS5wYWdlX2NvdW50X2NvbmZpZGVuY2UgPz8gbnVsbCxcbiAgICAgIHBhZ2VDb3VudFNvdXJjZTogcmVzcG9uc2UucGFnZV9jb3VudF9zb3VyY2UgfHwgbnVsbCxcbiAgICAgIHBhZ2VXYXJuaW5nOiBCb29sZWFuKHJlc3BvbnNlLnBhZ2VfbGVuZ3RoX3dhcm5pbmcpLFxuICAgICAgcHJldmlld0dlbmVyYXRlZEF0OiByZXNwb25zZS5wcmV2aWV3X2dlbmVyYXRlZF9hdCB8fCBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICBwcmV2aWV3UmVxdWVzdElkOiByZXNwb25zZS5wcmV2aWV3X3JlcXVlc3RfaWQgfHwgbnVsbCxcbiAgICB9KTtcbiAgICByZW5kZXJQcmV2aWV3T3V0cHV0U3RhdHVzKHJlc3BvbnNlLnByZXZpZXdfb3V0cHV0cyB8fCBudWxsKTtcblxuICAgIGNvbnN0IGluc3RydWN0aW9uID0ge1xuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvTG9jYWxlVGltZVN0cmluZygpLFxuICAgICAgaW5zdHJ1Y3Rpb25fdGV4dDogaW5zdHJ1Y3Rpb25UZXh0LFxuICAgICAgY2hhbmdlX3N1bW1hcnk6IHJlc3BvbnNlLnN1bW1hcnksXG4gICAgICBjb25maXJtYXRpb246IHRydWUsXG4gICAgfTtcbiAgICBhZGRUb0luc3RydWN0aW9uSGlzdG9yeShpbnN0cnVjdGlvbik7XG4gICAgc2hvd0NvbmZpcm1hdGlvbk1lc3NhZ2UoYCR7cmVzcG9uc2Uuc2FmZXR5X2FsZXJ0Py5mbGFnZ2VkID8gJ1x1MjZBMFx1RkUwRiAnIDogJ1x1MjcwNSAnfSR7cmVzcG9uc2Uuc3VtbWFyeX1gKTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5zdHJ1Y3Rpb24taW5wdXQnKS52YWx1ZSA9ICcnO1xuICAgIHJlZnJlc2hMYXlvdXRSZXZpZXdTdGF0ZSgpO1xuXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgYFx1Mjc0QyBDb3VsZCBub3QgYXBwbHkgdGhlIGluc3RydWN0aW9uLiBUcnkgcmVwaHJhc2luZyBpdCwgb3IgY2xpY2sgXCJSZWdlbmVyYXRlIFByZXZpZXdcIiB0byByZXNldCB0aGUgcHJldmlldyBhbmQgdHJ5IGFnYWluLmApO1xuICB9IGZpbmFsbHkge1xuICAgIHNob3dQcm9jZXNzaW5nKGZhbHNlKTtcbiAgfVxufVxuXG4vKipcbiAqIFN1Ym1pdCBsYXlvdXQgaW5zdHJ1Y3Rpb24gdG8gYmFja2VuZCBmb3IgcHJvY2Vzc2luZy5cbiAqXG4gKiBVc2VzIFBPU1QgL2FwaS9jdi9sYXlvdXQtcmVmaW5lIChzdGFnZWQgZ2VuZXJhdGlvbiBjb250cmFjdCkgd2hlbiBhXG4gKiBzZXNzaW9uLXN0b3JlZCBwcmV2aWV3IGlzIGF2YWlsYWJsZS4gIEZhbGxzIGJhY2sgdG8gdGhlIGxlZ2FjeVxuICogUE9TVCAvYXBpL2xheW91dC1pbnN0cnVjdGlvbiBlbmRwb2ludCAod2hpY2ggcmVxdWlyZXMgdGhlIEhUTUwgaW4gdGhlXG4gKiByZXF1ZXN0IGJvZHkpIHdoZW4gbm8gc2Vzc2lvbiBwcmV2aWV3IGV4aXN0cy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3VibWl0TGF5b3V0SW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb25UZXh0KSB7XG4gIC8qIGR1Y2tmbG93OlxuICAgKiAgIGlkOiBsYXlvdXRfdWlfcmVmaW5lX2xpdmVcbiAgICogICBraW5kOiB1aVxuICAgKiAgIHRpbWVzdGFtcDogJzIwMjYtMDMtMjZUMDA6MjQ6MDBaJ1xuICAgKiAgIHN0YXR1czogbGl2ZVxuICAgKiAgIGhhbmRsZXM6XG4gICAqICAgLSB1aTpsYXlvdXQuc3VibWl0LWluc3RydWN0aW9uXG4gICAqICAgY2FsbHM6XG4gICAqICAgLSBQT1NUIC9hcGkvY3YvbGF5b3V0LXJlZmluZVxuICAgKiAgIC0gUE9TVCAvYXBpL2xheW91dC1pbnN0cnVjdGlvblxuICAgKiAgIHJlYWRzOlxuICAgKiAgIC0gZG9tOiNpbnN0cnVjdGlvbi1pbnB1dC52YWx1ZVxuICAgKiAgIC0gc3RhdGU6Z2VuZXJhdGlvbl9zdGF0ZS5wcmV2aWV3QXZhaWxhYmxlXG4gICAqICAgLSBzdGF0ZTpnZW5lcmF0aW9uX3N0YXRlLnBoYXNlXG4gICAqICAgLSB3aW5kb3c6bGF5b3V0SW5zdHJ1Y3Rpb25zXG4gICAqICAgd3JpdGVzOlxuICAgKiAgIC0gcmVxdWVzdDpQT1NUIC9hcGkvY3YvbGF5b3V0LXJlZmluZS5pbnN0cnVjdGlvblxuICAgKiAgIC0gZG9tOiNsYXlvdXQtcHJldmlld1xuICAgKiAgIC0gd2luZG93OmxheW91dEluc3RydWN0aW9uc1xuICAgKiAgIC0gc3RhdGU6Z2VuZXJhdGlvbl9zdGF0ZS5wcmV2aWV3X291dHB1dHNcbiAgICogICBub3RlczogU3VibWl0cyBhIG5hdHVyYWwtbGFuZ3VhZ2UgbGF5b3V0IGluc3RydWN0aW9uIGFnYWluc3QgdGhlIHN0YWdlZCBwcmV2aWV3IHdoZW4gYXZhaWxhYmxlLCB0aGVuIHJlZnJlc2hlcyB0aGUgcHJldmlldyBhbmQgbG9jYWwgaW5zdHJ1Y3Rpb24gaGlzdG9yeSBmcm9tIHRoZSByZXR1cm5lZCBIVE1MLlxuICAgKi9cbiAgY29uc3QgY3VycmVudEh0bWwgPSBnZXRDdkFydGlmYWN0cygpWycqLmh0bWwnXSB8fCAnJztcbiAgY29uc3QgcHJpb3JJbnN0cnVjdGlvbnMgPSB3aW5kb3cubGF5b3V0SW5zdHJ1Y3Rpb25zIHx8IFtdO1xuXG4gIC8vIFNuYXBzaG90IHN0YXRlIGJlZm9yZSBhcHBseWluZyBzbyBVbmRvIGNhbiByZXN0b3JlIGl0LlxuICBfbGF5b3V0VW5kb1N0YWNrLnB1c2goe1xuICAgIGh0bWw6IGN1cnJlbnRIdG1sLFxuICAgIGluc3RydWN0aW9uczogKHdpbmRvdy5sYXlvdXRJbnN0cnVjdGlvbnMgfHwgW10pLm1hcChpID0+ICh7IC4uLmkgfSkpLFxuICB9KTtcbiAgaWYgKF9sYXlvdXRVbmRvU3RhY2subGVuZ3RoID4gX1VORE9fU1RBQ0tfTUFYKSB7XG4gICAgX2xheW91dFVuZG9TdGFjay5zaGlmdCgpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBzaG93UHJvY2Vzc2luZyh0cnVlKTtcblxuICAgIC8vIFByZWZlciB0aGUgc2Vzc2lvbi1iYWNrZWQgZW5kcG9pbnQ7IGl0IG1hbmFnZXMgSFRNTCBzZXJ2ZXItc2lkZS5cbiAgICBsZXQgcmVzcG9uc2U7XG4gICAgY29uc3QgZ2VuU3RhdGUgPSBzdGF0ZU1hbmFnZXI/LmdldEdlbmVyYXRpb25TdGF0ZT8uKCkgfHwge307XG4gICAgY29uc3QgdXNlU2Vzc2lvbkVuZHBvaW50ID0gZ2VuU3RhdGUucHJldmlld0F2YWlsYWJsZSB8fCBnZW5TdGF0ZS5waGFzZSA9PT0gJ2xheW91dF9yZXZpZXcnO1xuXG4gICAgaWYgKHVzZVNlc3Npb25FbmRwb2ludCkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCBhcGlDYWxsKCdQT1NUJywgJy9hcGkvY3YvbGF5b3V0LXJlZmluZScsIHtcbiAgICAgICAgaW5zdHJ1Y3Rpb246IGluc3RydWN0aW9uVGV4dCxcbiAgICAgICAgY29udGVudF9yZXZpc2lvbjogZ2V0Q3VycmVudENvbnRlbnRSZXZpc2lvbigpLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgYXBpQ2FsbCgnUE9TVCcsICcvYXBpL2xheW91dC1pbnN0cnVjdGlvbicsIHtcbiAgICAgICAgaW5zdHJ1Y3Rpb246IGluc3RydWN0aW9uVGV4dCxcbiAgICAgICAgY3VycmVudF9odG1sOiBjdXJyZW50SHRtbCxcbiAgICAgICAgcHJpb3JfaW5zdHJ1Y3Rpb25zOiBwcmlvckluc3RydWN0aW9ucyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIGlmIChyZXNwb25zZS5lcnJvciA9PT0gJ2NsYXJpZnknKSB7XG4gICAgICAgIHNob3dDbGFyaWZpY2F0aW9uRGlhbG9nKHJlc3BvbnNlLnF1ZXN0aW9uLCBpbnN0cnVjdGlvblRleHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXBwZW5kTGF5b3V0U2FmZXR5QWxlcnQocmVzcG9uc2Uuc2FmZXR5X2FsZXJ0KTtcbiAgICAgICAgbGV0IGVycm9ySHRtbCA9IGBcdTI2QTBcdUZFMEYgRXJyb3I6ICR7ZXNjYXBlSHRtbChyZXNwb25zZS5lcnJvcil9IFx1MjAxNCAke2VzY2FwZUh0bWwocmVzcG9uc2UuZGV0YWlscyB8fCAnJyl9YDtcbiAgICAgICAgaWYgKHJlc3BvbnNlLnJhd19yZXNwb25zZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZXJyb3JIdG1sICs9IGA8YnI+PGRldGFpbHMgc3R5bGU9XCJtYXJnaW4tdG9wOjZweFwiPjxzdW1tYXJ5IHN0eWxlPVwiY3Vyc29yOnBvaW50ZXI7Zm9udC1zaXplOjAuODVlbTtjb2xvcjojNjQ3NDhiXCI+UmF3IExMTSByZXNwb25zZTwvc3VtbWFyeT48cHJlIHN0eWxlPVwiZm9udC1zaXplOjAuNzVlbTt3aGl0ZS1zcGFjZTpwcmUtd3JhcDt3b3JkLWJyZWFrOmJyZWFrLWFsbDttYXgtaGVpZ2h0OjIwMHB4O292ZXJmbG93LXk6YXV0bztiYWNrZ3JvdW5kOiNmOGZhZmM7Ym9yZGVyOjFweCBzb2xpZCAjZTJlOGYwO2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6OHB4O21hcmdpbi10b3A6NHB4XCI+JHtlc2NhcGVIdG1sKHJlc3BvbnNlLnJhd19yZXNwb25zZSB8fCAnKGVtcHR5KScpfTwvcHJlPjwvZGV0YWlscz5gO1xuICAgICAgICB9XG4gICAgICAgIGFwcGVuZE1lc3NhZ2VIdG1sKCdzeXN0ZW0nLCBlcnJvckh0bWwpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBwcmV2aWV3IHdpdGggbmV3IEhUTUxcbiAgICBjb25zdCBuZXdIdG1sID0gcmVzcG9uc2UuaHRtbDtcbiAgICBkaXNwbGF5TGF5b3V0UHJldmlldyhuZXdIdG1sKTtcblxuICAgIGFwcGVuZExheW91dFNhZmV0eUFsZXJ0KHJlc3BvbnNlLnNhZmV0eV9hbGVydCk7XG5cbiAgICAvLyBVcGRhdGUgc3RhdGVcbiAgICBzZXRQcmV2aWV3SHRtbChuZXdIdG1sKTtcbiAgICBkaXNtaXNzZWRTdGFsZUNhbGxvdXRSZXZpc2lvbiA9IG51bGw7XG4gICAgc3RhdGVNYW5hZ2VyPy5tYXJrUHJldmlld0dlbmVyYXRlZD8uKHtcbiAgICAgIHByZXZpZXdBdmFpbGFibGU6IHRydWUsXG4gICAgICBwcmV2aWV3T3V0cHV0czogcmVzcG9uc2UucHJldmlld19vdXRwdXRzIHx8IG51bGwsXG4gICAgICBsYXlvdXRDb25maXJtZWQ6IGZhbHNlLFxuICAgICAgcGFnZUNvdW50RXN0aW1hdGU6IHJlc3BvbnNlLnBhZ2VfY291bnRfZXN0aW1hdGUgPz8gbnVsbCxcbiAgICAgIHBhZ2VDb3VudEV4YWN0OiByZXNwb25zZS5wYWdlX2NvdW50X2V4YWN0ID8/IG51bGwsXG4gICAgICBwYWdlQ291bnRDb25maWRlbmNlOiByZXNwb25zZS5wYWdlX2NvdW50X2NvbmZpZGVuY2UgPz8gbnVsbCxcbiAgICAgIHBhZ2VDb3VudFNvdXJjZTogcmVzcG9uc2UucGFnZV9jb3VudF9zb3VyY2UgfHwgbnVsbCxcbiAgICAgIHBhZ2VXYXJuaW5nOiBCb29sZWFuKHJlc3BvbnNlLnBhZ2VfbGVuZ3RoX3dhcm5pbmcpLFxuICAgICAgcHJldmlld0dlbmVyYXRlZEF0OiByZXNwb25zZS5wcmV2aWV3X2dlbmVyYXRlZF9hdCB8fCBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICBwcmV2aWV3UmVxdWVzdElkOiByZXNwb25zZS5wcmV2aWV3X3JlcXVlc3RfaWQgfHwgbnVsbCxcbiAgICB9KTtcbiAgICByZW5kZXJQcmV2aWV3T3V0cHV0U3RhdHVzKHJlc3BvbnNlLnByZXZpZXdfb3V0cHV0cyB8fCBudWxsKTtcblxuICAgIC8vIEFkZCB0byBpbnN0cnVjdGlvbiBoaXN0b3J5XG4gICAgY29uc3QgaW5zdHJ1Y3Rpb24gPSB7XG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9Mb2NhbGVUaW1lU3RyaW5nKCksXG4gICAgICBpbnN0cnVjdGlvbl90ZXh0OiBpbnN0cnVjdGlvblRleHQsXG4gICAgICBjaGFuZ2Vfc3VtbWFyeTogcmVzcG9uc2Uuc3VtbWFyeSxcbiAgICAgIGNvbmZpcm1hdGlvbjogdHJ1ZVxuICAgIH07XG4gICAgYWRkVG9JbnN0cnVjdGlvbkhpc3RvcnkoaW5zdHJ1Y3Rpb24pO1xuXG4gICAgLy8gU2hvdyBjb25maXJtYXRpb25cbiAgICBzaG93Q29uZmlybWF0aW9uTWVzc2FnZShgJHtyZXNwb25zZS5zYWZldHlfYWxlcnQ/LmZsYWdnZWQgPyAnXHUyNkEwXHVGRTBGICcgOiAnXHUyNzA1ICd9JHtyZXNwb25zZS5zdW1tYXJ5fWApO1xuXG4gICAgLy8gQ2xlYXIgaW5wdXQgYW5kIHJlZnJlc2ggdGhlIHN0YWdlZCBjb250cm9scy5cbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5zdHJ1Y3Rpb24taW5wdXQnKS52YWx1ZSA9ICcnO1xuICAgIHJlZnJlc2hMYXlvdXRSZXZpZXdTdGF0ZSgpO1xuXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgYFx1Mjc0QyBDb3VsZCBub3QgYXBwbHkgdGhlIGxheW91dCBpbnN0cnVjdGlvbi4gVHJ5IHJlcGhyYXNpbmcgaXQsIG9yIGNsaWNrIFwiUmVnZW5lcmF0ZSBQcmV2aWV3XCIgdG8gcmVzZXQgYW5kIHRyeSBhZ2Fpbi5gKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBzaG93UHJvY2Vzc2luZyhmYWxzZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgbWFya1ByZXZpZXdHZW5lcmF0ZWQgcGF5bG9hZCBmcm9tIGEgL2FwaS9jdi9nZW5lcmF0ZS1wcmV2aWV3IHJlc3BvbnNlLlxuICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBSZXNwb25zZSBmcm9tIHRoZSBnZW5lcmF0ZS1wcmV2aWV3IGVuZHBvaW50LlxuICogQHJldHVybnMge09iamVjdH0gUGF5bG9hZCBzdWl0YWJsZSBmb3Igc3RhdGVNYW5hZ2VyLm1hcmtQcmV2aWV3R2VuZXJhdGVkKCkuXG4gKi9cbmZ1bmN0aW9uIF9idWlsZFByZXZpZXdQYXlsb2FkKGRhdGEpIHtcbiAgcmV0dXJuIHtcbiAgICBwcmV2aWV3QXZhaWxhYmxlOiAgICB0cnVlLFxuICAgIHByZXZpZXdPdXRwdXRzOiAgICAgIGRhdGEucHJldmlld19vdXRwdXRzICAgICAgfHwgbnVsbCxcbiAgICBwYWdlQ291bnRFc3RpbWF0ZTogICBkYXRhLnBhZ2VfY291bnRfZXN0aW1hdGUgID8/IG51bGwsXG4gICAgcGFnZUNvdW50RXhhY3Q6ICAgICAgZGF0YS5wYWdlX2NvdW50X2V4YWN0ICAgICAgPz8gbnVsbCxcbiAgICBwYWdlQ291bnRDb25maWRlbmNlOiBkYXRhLnBhZ2VfY291bnRfY29uZmlkZW5jZSA/PyBudWxsLFxuICAgIHBhZ2VDb3VudFNvdXJjZTogICAgIGRhdGEucGFnZV9jb3VudF9zb3VyY2UgICAgIHx8IG51bGwsXG4gICAgcGFnZVdhcm5pbmc6ICAgICAgICAgQm9vbGVhbihkYXRhLnBhZ2VfbGVuZ3RoX3dhcm5pbmcpLFxuICAgIHByZXZpZXdHZW5lcmF0ZWRBdDogIGRhdGEucHJldmlld19nZW5lcmF0ZWRfYXQgIHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICBwcmV2aWV3UmVxdWVzdElkOiAgICBkYXRhLnByZXZpZXdfcmVxdWVzdF9pZCAgICB8fCBudWxsLFxuICB9O1xufVxuXG4vKipcbiAqIEZldGNoIHRoZSBDViBIVE1MIHByZXZpZXcgdmlhIHRoZSBzdGFnZWQgZ2VuZXJhdGlvbiBjb250cmFjdC5cbiAqXG4gKiBTdHJhdGVneSBkZXBlbmRzIG9uIHRoZSBjdXJyZW50IGdlbmVyYXRpb24gc3RhdGU6XG4gKlxuICogLSBwaGFzZSBpcyBub3QgY29uZmlybWVkL2ZpbmFsX2NvbXBsZXRlOlxuICogICBBbHdheXMgY2FsbHMgUE9TVCAvYXBpL2N2L2dlbmVyYXRlLXByZXZpZXcsIHdoaWNoIHN0b3JlcyBwcmV2aWV3X2h0bWwgaW5cbiAqICAgZ2VuZXJhdGlvbl9zdGF0ZSAocmVxdWlyZWQgZm9yIGNvbmZpcm0tbGF5b3V0KSBhbmQgY2FsbHMgbWFya1ByZXZpZXdHZW5lcmF0ZWQuXG4gKiAgIFRoaXMgYm9vdHN0cmFwcyB0aGUgc3RhZ2VkIHN0YXRlIGV2ZW4gYWZ0ZXIgbGVnYWN5IGdlbmVyYXRlX2N2IGFjdGlvbnMgdGhhdFxuICogICB3cml0ZSBmaWxlcyB0byBkaXNrIHdpdGhvdXQgcG9wdWxhdGluZyBnZW5lcmF0aW9uX3N0YXRlLnByZXZpZXdfaHRtbC5cbiAqICAgRmFsbHMgYmFjayB0byBHRVQgL2FwaS9sYXlvdXQtaHRtbCAocGFzc2l2ZSwgbm8gc3RhdGUgY2hhbmdlKSB3aGVuXG4gKiAgIGdlbmVyYXRlLXByZXZpZXcgaXMgdW5hdmFpbGFibGUgKGUuZy4gc2Vzc2lvbiBoYXMgbm8gam9iX2FuYWx5c2lzIHlldCkuXG4gKlxuICogLSBwaGFzZSBpcyBjb25maXJtZWQvZmluYWxfY29tcGxldGUgKHBhc3NpdmUgcmVzdG9yZSk6XG4gKiAgIFJlYWRzIEhUTUwgZnJvbSBkaXNrIHZpYSBHRVQgL2FwaS9sYXlvdXQtaHRtbCB3aXRob3V0IHRvdWNoaW5nIHNlc3Npb24gc3RhdGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIF9mZXRjaEFuZERpc3BsYXlMYXlvdXRQcmV2aWV3KCkge1xuICBjb25zdCBnZW5TdGF0ZSAgICA9IHN0YXRlTWFuYWdlcj8uZ2V0R2VuZXJhdGlvblN0YXRlPy4oKSB8fCB7fTtcbiAgY29uc3QgaXNDb25maXJtZWQgPSBnZW5TdGF0ZS5waGFzZSA9PT0gR0VORVJBVElPTl9QSEFTRVMuQ09ORklSTUVEXG4gICAgICAgICAgICAgICAgICAgfHwgZ2VuU3RhdGUucGhhc2UgPT09IEdFTkVSQVRJT05fUEhBU0VTLkZJTkFMX0NPTVBMRVRFO1xuXG4gIHNob3dQcmV2aWV3TG9hZGluZyh0cnVlLCBpc0NvbmZpcm1lZCA/ICdMb2FkaW5nIHNhdmVkIGxheW91dFx1MjAyNicgOiAnR2VuZXJhdGluZyBwcmV2aWV3XHUyMDI2Jyk7XG4gIHRyeSB7XG4gICAgLy8gRnJlc2gtcmVuZGVyIHBhdGg6IGFsd2F5cyBwb3B1bGF0ZSBnZW5lcmF0aW9uX3N0YXRlLnByZXZpZXdfaHRtbCBvbiB0aGUgYmFja2VuZFxuICAgIC8vIHNvIHRoYXQgY29uZmlybS1sYXlvdXQgc3VjY2VlZHMuIENvdmVycyBib3RoIHRoZSBub3JtYWwgc3RhZ2VkIHBhdGggYW5kIHRoZVxuICAgIC8vIGxlZ2FjeSBnZW5lcmF0ZV9jdiBwYXRoIHRoYXQgZG9lcyBub3QgY2FsbCBnZW5lcmF0ZS1wcmV2aWV3IGl0c2VsZi5cbiAgICBpZiAoIWlzQ29uZmlybWVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgYXBpQ2FsbCgnUE9TVCcsICcvYXBpL2N2L2dlbmVyYXRlLXByZXZpZXcnLCB7fSk7XG4gICAgICAgIGlmIChkYXRhLm9rICYmIGRhdGEuaHRtbCkge1xuICAgICAgICAgIGRpc3BsYXlMYXlvdXRQcmV2aWV3KGRhdGEuaHRtbCk7XG4gICAgICAgICAgc2V0UHJldmlld0h0bWwoZGF0YS5odG1sKTtcbiAgICAgICAgICBkaXNtaXNzZWRTdGFsZUNhbGxvdXRSZXZpc2lvbiA9IG51bGw7XG4gICAgICAgICAgc3RhdGVNYW5hZ2VyPy5tYXJrUHJldmlld0dlbmVyYXRlZD8uKF9idWlsZFByZXZpZXdQYXlsb2FkKGRhdGEpKTtcbiAgICAgICAgICByZW5kZXJQcmV2aWV3T3V0cHV0U3RhdHVzKGRhdGEucHJldmlld19vdXRwdXRzIHx8IG51bGwpO1xuICAgICAgICAgIHJlZnJlc2hMYXlvdXRSZXZpZXdTdGF0ZSgpO1xuICAgICAgICAgIChkYXRhLmNvbnRlbnRfd2FybmluZ3MgfHwgW10pLmZvckVhY2godyA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHNob3dUb2FzdCA9PT0gJ2Z1bmN0aW9uJykgc2hvd1RvYXN0KHcubWVzc2FnZSwgJ3dhcm5pbmcnLCA4MDAwKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKF9lKSB7XG4gICAgICAgIC8vIGZhbGwgdGhyb3VnaCB0byBsZWdhY3kgZGlzayByZWFkXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUGFzc2l2ZSByZXN0b3JlIHBhdGg6IGxvYWQgc3RvcmVkIEhUTUwgZnJvbSBkaXNrIHdpdGhvdXQgdG91Y2hpbmcgZ2VuZXJhdGlvbiBzdGF0ZS5cbiAgICAvLyBVc2VkIGZvciBjb25maXJtZWQvZmluYWxfY29tcGxldGUgbGF5b3V0cywgb3IgYXMgZmFsbGJhY2sgd2hlbiBnZW5lcmF0ZS1wcmV2aWV3XG4gICAgLy8gaXMgdW5hdmFpbGFibGUgKGUuZy4gc2Vzc2lvbiBoYXMgbm8gam9iX2FuYWx5c2lzIHlldCkuXG4gICAgdHJ5IHtcbiAgICAgIHNob3dQcmV2aWV3TG9hZGluZyh0cnVlLCAnTG9hZGluZyBzdG9yZWQgbGF5b3V0XHUyMDI2Jyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgYXBpQ2FsbCgnR0VUJywgJy9hcGkvbGF5b3V0LWh0bWwnKTtcbiAgICAgIGlmIChkYXRhLm9rICYmIGRhdGEuaHRtbCkge1xuICAgICAgICBkaXNwbGF5TGF5b3V0UHJldmlldyhkYXRhLmh0bWwpO1xuICAgICAgICBzZXRQcmV2aWV3SHRtbChkYXRhLmh0bWwpO1xuICAgICAgICByZWZyZXNoTGF5b3V0UmV2aWV3U3RhdGUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbG9nLndhcm4oJ0xheW91dCBwcmV2aWV3IG5vdCBhdmFpbGFibGU6JywgZGF0YS5lcnJvciB8fCAnbm8gSFRNTCByZXR1cm5lZCcpO1xuICAgIH0gY2F0Y2ggKF9lKSB7XG4gICAgICAvLyBubyBwcmV2aWV3IGF2YWlsYWJsZVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBzaG93UHJldmlld0xvYWRpbmcoZmFsc2UpO1xuICB9XG59XG5cbi8qKlxuICogRGlzcGxheSBIVE1MIHByZXZpZXcgaW4gaWZyYW1lLlxuICovXG5mdW5jdGlvbiBkaXNwbGF5TGF5b3V0UHJldmlldyhodG1sKSB7XG4gIGNvbnN0IHByZXZpZXcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGF5b3V0LXByZXZpZXcnKTtcbiAgaWYgKCFwcmV2aWV3KSByZXR1cm47XG5cbiAgc2hvd1ByZXZpZXdMb2FkaW5nKGZhbHNlKTtcbiAgcHJldmlldy5vbmxvYWQgPSAoKSA9PiBmaXRMYXlvdXRQcmV2aWV3VG9QYW5lKHByZXZpZXcpO1xuICBwcmV2aWV3LnNldEF0dHJpYnV0ZSgnc2FuZGJveCcsICdhbGxvdy1zYW1lLW9yaWdpbicpO1xuICBwcmV2aWV3LnNldEF0dHJpYnV0ZSgncmVmZXJyZXJwb2xpY3knLCAnbm8tcmVmZXJyZXInKTtcbiAgcHJldmlldy5zcmNkb2MgPSBodG1sO1xuXG4gIGNvbnN0IGRvYyA9IHByZXZpZXcuY29udGVudERvY3VtZW50IHx8IHByZXZpZXcuY29udGVudFdpbmRvdz8uZG9jdW1lbnQ7XG4gIGlmIChkb2M/LnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScpIHtcbiAgICBmaXRMYXlvdXRQcmV2aWV3VG9QYW5lKHByZXZpZXcpO1xuICB9XG59XG5cbi8qKlxuICogU2NhbGUgdGhlIHByZXZpZXcgc28gYW4gZW50aXJlIENWIHBhZ2Ugd2lkdGggZml0cyB3aXRoaW4gdGhlIHByZXZpZXcgcGFuZS5cbiAqL1xuZnVuY3Rpb24gZml0TGF5b3V0UHJldmlld1RvUGFuZShwcmV2aWV3KSB7XG4gIGNvbnN0IGRvYyA9IHByZXZpZXc/LmNvbnRlbnREb2N1bWVudCB8fCBwcmV2aWV3Py5jb250ZW50V2luZG93Py5kb2N1bWVudDtcbiAgY29uc3QgY29udGFpbmVyID0gcHJldmlldz8uY2xvc2VzdCgnLnByZXZpZXctaWZyYW1lLWNvbnRhaW5lcicpO1xuICBpZiAoIWRvYyB8fCAhY29udGFpbmVyKSByZXR1cm47XG5cbiAgY29uc3QgcGFnZUNvbnRhaW5lciA9IGRvYy5xdWVyeVNlbGVjdG9yKCcucGFnZS1jb250YWluZXInKSB8fCBkb2MuYm9keTtcbiAgaWYgKCFwYWdlQ29udGFpbmVyKSByZXR1cm47XG5cbiAgY29uc3QgY29udGFpbmVyV2lkdGggPSBNYXRoLm1heChjb250YWluZXIuY2xpZW50V2lkdGggLSAyNCwgMSk7XG4gIGNvbnN0IGNvbnRlbnRXaWR0aCA9IE1hdGgubWF4KFxuICAgIE1hdGguY2VpbChwYWdlQ29udGFpbmVyLnNjcm9sbFdpZHRoIHx8IDApLFxuICAgIE1hdGguY2VpbChwYWdlQ29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoIHx8IDApLFxuICAgIDFcbiAgKTtcbiAgY29uc3Qgc2NhbGUgPSBNYXRoLm1pbigxLCBjb250YWluZXJXaWR0aCAvIGNvbnRlbnRXaWR0aCk7XG5cbiAgZG9jLmRvY3VtZW50RWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kID0gJyNmOGZhZmMnO1xuICBkb2MuYm9keS5zdHlsZS5tYXJnaW4gPSAnMCc7XG4gIGRvYy5ib2R5LnN0eWxlLnBhZGRpbmcgPSAnMCc7XG4gIGRvYy5ib2R5LnN0eWxlLmJhY2tncm91bmQgPSAnI2Y4ZmFmYyc7XG4gIGRvYy5ib2R5LnN0eWxlLm92ZXJmbG93WCA9ICdhdXRvJztcblxuICBwYWdlQ29udGFpbmVyLnN0eWxlLnpvb20gPSBgJHtzY2FsZX1gO1xuICBwYWdlQ29udGFpbmVyLnN0eWxlLnRyYW5zZm9ybSA9ICcnO1xuICBwYWdlQ29udGFpbmVyLnN0eWxlLnRyYW5zZm9ybU9yaWdpbiA9ICcnO1xuICBwYWdlQ29udGFpbmVyLnN0eWxlLm1hcmdpbiA9ICcxMnB4JztcbiAgcHJldmlldy5zdHlsZS5taW5XaWR0aCA9ICcnO1xufVxuXG4vKipcbiAqIEFkZCBpbnN0cnVjdGlvbiB0byBoaXN0b3J5IHBhbmVsLlxuICovXG5mdW5jdGlvbiBhZGRUb0luc3RydWN0aW9uSGlzdG9yeShpbnN0cnVjdGlvbikge1xuICAvLyBJbml0aWFsaXplIGdsb2JhbCBpbnN0cnVjdGlvbiBsaXN0IGlmIG5lZWRlZFxuICBpZiAoIXdpbmRvdy5sYXlvdXRJbnN0cnVjdGlvbnMpIHtcbiAgICB3aW5kb3cubGF5b3V0SW5zdHJ1Y3Rpb25zID0gW107XG4gIH1cblxuICB3aW5kb3cubGF5b3V0SW5zdHJ1Y3Rpb25zLnB1c2gobm9ybWFsaXplTGF5b3V0SW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb24pKTtcbiAgcmVuZGVySW5zdHJ1Y3Rpb25IaXN0b3J5KCk7XG59XG5cbi8qKlxuICogUmVuZGVyIGluc3RydWN0aW9uIGhpc3RvcnkgZnJvbSBjdXJyZW50IHN0YXRlIHdpdGhvdXQgbXV0YXRpbmcgaXQuXG4gKi9cbmZ1bmN0aW9uIHJlbmRlckluc3RydWN0aW9uSGlzdG9yeSgpIHtcbiAgY29uc3QgaGlzdG9yeUxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5zdHJ1Y3Rpb24taGlzdG9yeScpO1xuICBpZiAoIWhpc3RvcnlMaXN0KSByZXR1cm47XG5cbiAgY29uc3QgaW5zdHJ1Y3Rpb25zID0gd2luZG93LmxheW91dEluc3RydWN0aW9ucyB8fCBbXTtcbiAgaGlzdG9yeUxpc3QuaW5uZXJIVE1MID0gJyc7XG4gIGNvbnN0IGxhc3RJZHggPSBpbnN0cnVjdGlvbnMubGVuZ3RoIC0gMTtcbiAgaW5zdHJ1Y3Rpb25zLmZvckVhY2goKGluc3RydWN0aW9uLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IGVudHJ5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZW50cnkuY2xhc3NOYW1lID0gJ2luc3RydWN0aW9uLWhpc3RvcnktZW50cnknO1xuICAgIGNvbnN0IGlzTGFzdCA9IGluZGV4ID09PSBsYXN0SWR4O1xuICAgIGNvbnN0IHVuZG9IdG1sID0gaXNMYXN0XG4gICAgICA/IGA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0bi1zbVwiIG9uY2xpY2s9XCJ1bmRvSW5zdHJ1Y3Rpb24oJHtpbmRleH0pXCI+XHUyMUE5IFVuZG88L2J1dHRvbj5gXG4gICAgICA6IGA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0bi1zbVwiIGRpc2FibGVkIHRpdGxlPVwiVW5kbyBpcyBzZXF1ZW50aWFsIFx1MjAxNCB1bmRvIHRoZSBtb3N0IHJlY2VudCBpbnN0cnVjdGlvbiBmaXJzdFwiXG4gICAgICAgICAgIHN0eWxlPVwib3BhY2l0eTowLjM7Y3Vyc29yOm5vdC1hbGxvd2VkO1wiPlx1MjFBOSBVbmRvPC9idXR0b24+YDtcbiAgICBlbnRyeS5pbm5lckhUTUwgPSBgXG4gICAgICA8ZGl2IGNsYXNzPVwiaW5zdHJ1Y3Rpb24tdGltZVwiPiR7aW5zdHJ1Y3Rpb24udGltZXN0YW1wIHx8ICcnfTwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImluc3RydWN0aW9uLXRleHRcIj4ke2VzY2FwZUh0bWwoaW5zdHJ1Y3Rpb24uaW5zdHJ1Y3Rpb25fdGV4dCB8fCAnJyl9PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiaW5zdHJ1Y3Rpb24tc3VtbWFyeVwiPjxlbT4ke2VzY2FwZUh0bWwoaW5zdHJ1Y3Rpb24uY2hhbmdlX3N1bW1hcnkgfHwgJycpfTwvZW0+PC9kaXY+XG4gICAgICAke3VuZG9IdG1sfVxuICAgIGA7XG4gICAgaGlzdG9yeUxpc3QuYXBwZW5kQ2hpbGQoZW50cnkpO1xuICB9KTtcblxuICAvLyBVcGRhdGUgY291bnRcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2luc3RydWN0aW9uLWNvdW50JykudGV4dENvbnRlbnQgPSAod2luZG93LmxheW91dEluc3RydWN0aW9ucyB8fCBbXSkubGVuZ3RoO1xufVxuXG4vKipcbiAqIFJlc3RvcmUgaW5zdHJ1Y3Rpb24gaGlzdG9yeSBmcm9tIHNlc3Npb24gc3RhdGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxvYWRMYXlvdXRJbnN0cnVjdGlvbkhpc3RvcnkoKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBhcGlDYWxsKCdHRVQnLCAnL2FwaS9sYXlvdXQtaGlzdG9yeScpO1xuICAgIGlmICghcmVzcG9uc2U/Lmluc3RydWN0aW9ucyB8fCAhQXJyYXkuaXNBcnJheShyZXNwb25zZS5pbnN0cnVjdGlvbnMpKSB7XG4gICAgICByZXR1cm4gd2luZG93LmxheW91dEluc3RydWN0aW9ucyB8fCBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzcG9uc2UuaW5zdHJ1Y3Rpb25zLm1hcCgoaW5zdHJ1Y3Rpb24pID0+IG5vcm1hbGl6ZUxheW91dEluc3RydWN0aW9uKGluc3RydWN0aW9uKSk7XG4gIH0gY2F0Y2ggKF9lcnJvcikge1xuICAgIHJldHVybiB3aW5kb3cubGF5b3V0SW5zdHJ1Y3Rpb25zIHx8IFtdO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc3RvcmVJbnN0cnVjdGlvbkhpc3RvcnkoKSB7XG4gIHdpbmRvdy5sYXlvdXRJbnN0cnVjdGlvbnMgPSBhd2FpdCBsb2FkTGF5b3V0SW5zdHJ1Y3Rpb25IaXN0b3J5KCk7XG4gIHJlbmRlckluc3RydWN0aW9uSGlzdG9yeSgpO1xuICByZWZyZXNoTGF5b3V0UmV2aWV3U3RhdGUoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaGFuZGxlUmVnZW5lcmF0ZVByZXZpZXdBY3Rpb24oKSB7XG4gIHRyeSB7XG4gICAgc2hvd1Byb2Nlc3NpbmcodHJ1ZSk7XG4gICAgYXdhaXQgX2ZldGNoQW5kRGlzcGxheUxheW91dFByZXZpZXcoKTtcbiAgICBzaG93Q29uZmlybWF0aW9uTWVzc2FnZSgnXHUyNzA1IFByZXZpZXcgcmVnZW5lcmF0ZWQgZnJvbSB0aGUgbGF0ZXN0IGNvbnRlbnQuJyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgYFx1Mjc0QyBDb3VsZCBub3QgcmVnZW5lcmF0ZSB0aGUgcHJldmlldy4gQ2hlY2sgdGhhdCB5b3VyIHNlc3Npb24gaXMgYWN0aXZlIGFuZCB0cnkgYWdhaW4uIElmIHRoZSBwcm9ibGVtIHBlcnNpc3RzLCByZWxvYWQgdGhlIHBhZ2UuYCk7XG4gICAgc2hvd1ByZXZpZXdMb2FkaW5nKGZhbHNlKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBzaG93UHJvY2Vzc2luZyhmYWxzZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBTaG93IHByb2Nlc3Npbmcgc3Bpbm5lciAocmlnaHQtcGFuZSBpbmRpY2F0b3IgZm9yIGxheW91dC1pbnN0cnVjdGlvbiBhcHBseSkuXG4gKi9cbmZ1bmN0aW9uIHNob3dQcm9jZXNzaW5nKHNob3cpIHtcbiAgY29uc3QgaW5kaWNhdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Byb2Nlc3NpbmctaW5kaWNhdG9yJyk7XG4gIGlmIChpbmRpY2F0b3IpIHtcbiAgICBpbmRpY2F0b3Iuc3R5bGUuZGlzcGxheSA9IHNob3cgPyAnYmxvY2snIDogJ25vbmUnO1xuICB9XG59XG5cbi8qKlxuICogU2hvdyBvciBoaWRlIHRoZSBwcmV2aWV3LWFyZWEgbG9hZGluZyBvdmVybGF5LlxuICogQHBhcmFtIHtib29sZWFufSBzaG93XG4gKiBAcGFyYW0ge3N0cmluZ30gW2xvZ1RleHRdIE9wdGlvbmFsIHN0YXR1cyBsaW5lIHNob3duIGJlbG93IHRoZSBzcGlubmVyLlxuICovXG5mdW5jdGlvbiBzaG93UHJldmlld0xvYWRpbmcoc2hvdywgbG9nVGV4dCA9ICcnKSB7XG4gIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJldmlldy1sb2FkaW5nLW92ZXJsYXknKTtcbiAgaWYgKCFvdmVybGF5KSByZXR1cm47XG4gIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9IHNob3cgPyAnZmxleCcgOiAnbm9uZSc7XG4gIGNvbnN0IGxvZ0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ByZXZpZXctbG9hZGluZy1sb2cnKTtcbiAgaWYgKGxvZ0VsKSBsb2dFbC50ZXh0Q29udGVudCA9IGxvZ1RleHQ7XG59XG5cbi8qKlxuICogU2hvdyBjb25maXJtYXRpb24gbWVzc2FnZS5cbiAqL1xuZnVuY3Rpb24gc2hvd0NvbmZpcm1hdGlvbk1lc3NhZ2UobWVzc2FnZSkge1xuICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbmZpcm1hdGlvbi1tZXNzYWdlJyk7XG4gIGlmICghZWxlbWVudCkgcmV0dXJuO1xuXG4gIGVsZW1lbnQudGV4dENvbnRlbnQgPSBtZXNzYWdlO1xuICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuXG4gIC8vIEF1dG8taGlkZSBhZnRlciAzIHNlY29uZHNcbiAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICB9LCAzMDAwKTtcbn1cblxuLyoqXG4gKiBTaG93IGlubGluZSBjbGFyaWZpY2F0aW9uIHBhbmVsIHdoZW4gTExNIG5lZWRzIG1vcmUgaW5mby5cbiAqIFJlcGxhY2VzIHdpbmRvdy5wcm9tcHQoKSB3aXRoIGFuIGFjY2Vzc2libGUgaW5saW5lIGZvcm0uXG4gKi9cbmZ1bmN0aW9uIHNob3dDbGFyaWZpY2F0aW9uRGlhbG9nKHF1ZXN0aW9uLCBvcmlnaW5hbEluc3RydWN0aW9uKSB7XG4gIGNvbnN0IGlucHV0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5zdHJ1Y3Rpb24taW5wdXQnKTtcbiAgY29uc3QgY29udGFpbmVyID0gaW5wdXRFbCA/IGlucHV0RWwuY2xvc2VzdCgnZGl2JykgfHwgaW5wdXRFbC5wYXJlbnROb2RlIDogbnVsbDtcbiAgaWYgKCFjb250YWluZXIpIHJldHVybjtcblxuICBjb25zdCBleGlzdGluZ1BhbmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xheW91dC1jbGFyaWZpY2F0aW9uLXBhbmVsJyk7XG4gIGlmIChleGlzdGluZ1BhbmVsKSBleGlzdGluZ1BhbmVsLnJlbW92ZSgpO1xuXG4gIGNvbnN0IHBhbmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHBhbmVsLmlkID0gJ2xheW91dC1jbGFyaWZpY2F0aW9uLXBhbmVsJztcbiAgcGFuZWwuc2V0QXR0cmlidXRlKCdyb2xlJywgJ2FsZXJ0Jyk7XG4gIHBhbmVsLnN0eWxlLmNzc1RleHQgPSAnYmFja2dyb3VuZDojZmVmOWMzO2JvcmRlcjoxcHggc29saWQgI2ZkZTA0Nztib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjE0cHg7bWFyZ2luLXRvcDoxMHB4Oyc7XG4gIHBhbmVsLmlubmVySFRNTCA9IGBcbiAgICA8cCBzdHlsZT1cIm1hcmdpbjowIDAgOHB4O2ZvbnQtc2l6ZTowLjllbTtjb2xvcjojOTI0MDBlO2ZvbnQtd2VpZ2h0OjYwMDtcIj5cbiAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlx1Mjc1Mzwvc3Bhbj4gQ2xhcmlmaWNhdGlvbiBuZWVkZWRcbiAgICA8L3A+XG4gICAgPHAgc3R5bGU9XCJtYXJnaW46MCAwIDEwcHg7Zm9udC1zaXplOjAuODhlbTtjb2xvcjojNzgzNTBmO1wiPiR7ZXNjYXBlSHRtbChxdWVzdGlvbil9PC9wPlxuICAgIDxsYWJlbCBmb3I9XCJsYXlvdXQtY2xhcmlmaWNhdGlvbi1pbnB1dFwiIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtmb250LXdlaWdodDo2MDA7Y29sb3I6IzM3NDE1MTtkaXNwbGF5OmJsb2NrO21hcmdpbi1ib3R0b206NHB4O1wiPlxuICAgICAgWW91ciBjbGFyaWZpY2F0aW9uOlxuICAgIDwvbGFiZWw+XG4gICAgPHRleHRhcmVhIGlkPVwibGF5b3V0LWNsYXJpZmljYXRpb24taW5wdXRcIiByb3dzPVwiMlwiXG4gICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Ym94LXNpemluZzpib3JkZXItYm94O3BhZGRpbmc6OHB4O2JvcmRlcjoxcHggc29saWQgI2ZkZTA0Nztib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6MC44OGVtO3Jlc2l6ZTp2ZXJ0aWNhbDtcIlxuICAgICAgYXJpYS1sYWJlbD1cIkNsYXJpZmljYXRpb24gZm9yIGxheW91dCBpbnN0cnVjdGlvblwiPiR7ZXNjYXBlSHRtbChvcmlnaW5hbEluc3RydWN0aW9uKX08L3RleHRhcmVhPlxuICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjhweDttYXJnaW4tdG9wOjhweDtcIj5cbiAgICAgIDxidXR0b24gaWQ9XCJsYXlvdXQtY2xhcmlmaWNhdGlvbi1zdWJtaXRcIlxuICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6I2Q5NzcwNjtjb2xvcjojZmZmO2JvcmRlcjpub25lO2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6NnB4IDE0cHg7Zm9udC1zaXplOjAuODVlbTtjdXJzb3I6cG9pbnRlcjtmb250LXdlaWdodDo2MDA7XCI+XG4gICAgICAgIFN1Ym1pdCBjbGFyaWZpY2F0aW9uXG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gaWQ9XCJsYXlvdXQtY2xhcmlmaWNhdGlvbi1jYW5jZWxcIlxuICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6bm9uZTtib3JkZXI6MXB4IHNvbGlkICNkOTc3MDY7Y29sb3I6IzkyNDAwZTtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjZweCAxNHB4O2ZvbnQtc2l6ZTowLjg1ZW07Y3Vyc29yOnBvaW50ZXI7XCI+XG4gICAgICAgIENhbmNlbFxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+YDtcblxuICBjb250YWluZXIuYXBwZW5kQ2hpbGQocGFuZWwpO1xuXG4gIGNvbnN0IGNsYXJJbnB1dCAgPSBwYW5lbC5xdWVyeVNlbGVjdG9yKCcjbGF5b3V0LWNsYXJpZmljYXRpb24taW5wdXQnKTtcbiAgY29uc3Qgc3VibWl0QnRuICA9IHBhbmVsLnF1ZXJ5U2VsZWN0b3IoJyNsYXlvdXQtY2xhcmlmaWNhdGlvbi1zdWJtaXQnKTtcbiAgY29uc3QgY2FuY2VsQnRuICA9IHBhbmVsLnF1ZXJ5U2VsZWN0b3IoJyNsYXlvdXQtY2xhcmlmaWNhdGlvbi1jYW5jZWwnKTtcblxuICBjbGFySW5wdXQuZm9jdXMoKTtcbiAgY2xhcklucHV0LnNldFNlbGVjdGlvblJhbmdlKGNsYXJJbnB1dC52YWx1ZS5sZW5ndGgsIGNsYXJJbnB1dC52YWx1ZS5sZW5ndGgpO1xuXG4gIHN1Ym1pdEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBjb25zdCBjbGFyaWZpZWQgPSBjbGFySW5wdXQudmFsdWUudHJpbSgpO1xuICAgIHBhbmVsLnJlbW92ZSgpO1xuICAgIGlmIChjbGFyaWZpZWQgJiYgY2xhcmlmaWVkICE9PSBvcmlnaW5hbEluc3RydWN0aW9uKSB7XG4gICAgICBzdWJtaXRMYXlvdXRJbnN0cnVjdGlvbihjbGFyaWZpZWQpO1xuICAgIH1cbiAgfSk7XG4gIGNhbmNlbEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHBhbmVsLnJlbW92ZSgpKTtcbiAgY2xhcklucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBlID0+IHtcbiAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicgJiYgIWUuc2hpZnRLZXkpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyBzdWJtaXRCdG4uY2xpY2soKTsgfVxuICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIGNhbmNlbEJ0bi5jbGljaygpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBVbmRvIHRoZSBsYXN0IGxheW91dCBpbnN0cnVjdGlvbiBieSByZXN0b3JpbmcgdGhlIHByZXZpb3VzIHNuYXBzaG90LlxuICogVGhlIGluZGV4IHBhcmFtZXRlciBpcyBhY2NlcHRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBidXQgaXMgaWdub3JlZCBcdTIwMTRcbiAqIHRoZSB1bmRvIHN0YWNrIGFsd2F5cyByZXN0b3JlcyB0aGUgbW9zdCByZWNlbnQgcHJlLWluc3RydWN0aW9uIHN0YXRlLlxuICovXG5mdW5jdGlvbiB1bmRvSW5zdHJ1Y3Rpb24oX2luZGV4KSB7XG4gIGlmIChfbGF5b3V0VW5kb1N0YWNrLmxlbmd0aCA9PT0gMCkge1xuICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsICdcdTIxMzlcdUZFMEYgTm90aGluZyB0byB1bmRvLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHNuYXBzaG90ID0gX2xheW91dFVuZG9TdGFjay5wb3AoKTtcbiAgd2luZG93LmxheW91dEluc3RydWN0aW9ucyA9IHNuYXBzaG90Lmluc3RydWN0aW9ucztcblxuICBkaXNwbGF5TGF5b3V0UHJldmlldyhzbmFwc2hvdC5odG1sKTtcbiAgc2V0UHJldmlld0h0bWwoc25hcHNob3QuaHRtbCk7XG4gIHJlbmRlckluc3RydWN0aW9uSGlzdG9yeSgpO1xuICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnXHUyMUE5XHVGRTBGIExhc3QgbGF5b3V0IGluc3RydWN0aW9uIHVuZG9uZS4nKTtcbn1cblxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsICgpID0+IHtcbiAgY29uc3QgcHJldmlldyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYXlvdXQtcHJldmlldycpO1xuICBpZiAocHJldmlldykge1xuICAgIGZpdExheW91dFByZXZpZXdUb1BhbmUocHJldmlldyk7XG4gIH1cbn0pO1xuXG5hc3luYyBmdW5jdGlvbiBjb25maXJtTGF5b3V0UmV2aWV3KCkge1xuICB0cnkge1xuICAgIHNob3dQcm9jZXNzaW5nKHRydWUpO1xuXG4gICAgY29uc3QgZnJlc2huZXNzID0gc3RhdGVNYW5hZ2VyLmdldExheW91dEZyZXNobmVzcygpO1xuICAgIGlmIChmcmVzaG5lc3MuaXNTdGFsZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQcmV2aWV3IGlzIG91dGRhdGVkLiBSZWdlbmVyYXRlIHRoZSBwcmV2aWV3IGJlZm9yZSBjb25maXJtaW5nIGxheW91dC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb25maXJtUmVzID0gYXdhaXQgYXBpQ2FsbCgnUE9TVCcsICcvYXBpL2N2L2NvbmZpcm0tbGF5b3V0JywgeyBjb250ZW50X3JldmlzaW9uOiBnZXRDdXJyZW50Q29udGVudFJldmlzaW9uKCkgfSk7XG4gICAgaWYgKCFjb25maXJtUmVzPy5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGNvbmZpcm1SZXM/LmVycm9yIHx8ICdGYWlsZWQgdG8gY29uZmlybSBsYXlvdXQuJyk7XG4gICAgfVxuXG4gICAgc3RhdGVNYW5hZ2VyLm1hcmtMYXlvdXRDb25maXJtZWQoe1xuICAgICAgY29uZmlybWVkQXQ6IGNvbmZpcm1SZXMuY29uZmlybWVkX2F0IHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICB9KTtcbiAgICBzaG93Q29uZmlybWF0aW9uTWVzc2FnZSgnXHUyNzA1IExheW91dCBjb25maXJtZWQuIEdlbmVyYXRlIGZpbmFsIGZpbGVzIHdoZW4geW91IGFyZSByZWFkeS4nKTtcbiAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCAnXHUyNzA1IExheW91dCBjb25maXJtZWQuIFJldmlldyB0aGUgcHJldmlldyBpZiBuZWVkZWQsIHRoZW4gZ2VuZXJhdGUgdGhlIGZpbmFsIGZpbGVzLicpO1xuICAgIHJlZnJlc2hMYXlvdXRSZXZpZXdTdGF0ZSgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsIGBcdTI3NEMgQ291bGQgbm90IGNvbmZpcm0gdGhlIGxheW91dC4gVHJ5IGNsaWNraW5nIENvbmZpcm0gYWdhaW4uIElmIHRoZSBwcm9ibGVtIHBlcnNpc3RzLCByZWxvYWQgdGhlIHBhZ2UuYCk7XG4gIH0gZmluYWxseSB7XG4gICAgc2hvd1Byb2Nlc3NpbmcoZmFsc2UpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRmluYWxPdXRwdXRzKCkge1xuICAvKiBkdWNrZmxvdzpcbiAgICogICBpZDogbGF5b3V0X3VpX2dlbmVyYXRlX2ZpbmFsX2xpdmVcbiAgICogICBraW5kOiB1aVxuICAgKiAgIHRpbWVzdGFtcDogJzIwMjYtMDMtMjZUMDA6MjQ6MDBaJ1xuICAgKiAgIHN0YXR1czogbGl2ZVxuICAgKiAgIGhhbmRsZXM6XG4gICAqICAgLSB1aTpsYXlvdXQuZ2VuZXJhdGUtZmluYWxcbiAgICogICBjYWxsczpcbiAgICogICAtIFBPU1QgL2FwaS9jdi9nZW5lcmF0ZS1maW5hbFxuICAgKiAgIC0gUE9TVCAvYXBpL2xheW91dC1jb21wbGV0ZVxuICAgKiAgIHJlYWRzOlxuICAgKiAgIC0gc3RhdGU6Z2VuZXJhdGlvbl9zdGF0ZS5sYXlvdXRDb25maXJtZWRcbiAgICogICAtIHN0YXRlOmdlbmVyYXRpb25fc3RhdGUucGhhc2VcbiAgICogICAtIHN0YXRlOmxheW91dF9mcmVzaG5lc3NcbiAgICogICB3cml0ZXM6XG4gICAqICAgLSB0YWI6Y3ZBcnRpZmFjdHNcbiAgICogICAtIHN0YXRlOmdlbmVyYXRpb25fc3RhdGUuZmluYWxfZ2VuZXJhdGVkX2F0XG4gICAqICAgLSB1aTp3b3JrZmxvdy5yZWZpbmVtZW50XG4gICAqICAgbm90ZXM6IEdlbmVyYXRlcyB0aGUgZmluYWwgaHVtYW4tcmVhZGFibGUgb3V0cHV0cyBmcm9tIHRoZSBjb25maXJtZWQgcHJldmlldyBhbmQgYWR2YW5jZXMgdGhlIFVJIGludG8gZmlsZSByZXZpZXcvZmluYWxpc2Ugd2l0aCB0aGUgbmV3IGFydGlmYWN0IHNldC5cbiAgICovXG4gIHRyeSB7XG4gICAgc2hvd1Byb2Nlc3NpbmcodHJ1ZSk7XG5cbiAgICBjb25zdCBmcmVzaG5lc3MgPSBzdGF0ZU1hbmFnZXIuZ2V0TGF5b3V0RnJlc2huZXNzKCk7XG4gICAgY29uc3QgZ2VuZXJhdGlvblN0YXRlID0gc3RhdGVNYW5hZ2VyLmdldEdlbmVyYXRpb25TdGF0ZSgpO1xuICAgIGlmIChmcmVzaG5lc3MuaXNTdGFsZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQcmV2aWV3IGlzIG91dGRhdGVkLiBSZWdlbmVyYXRlIHRoZSBwcmV2aWV3IGJlZm9yZSBnZW5lcmF0aW5nIGZpbmFsIGZpbGVzLicpO1xuICAgIH1cbiAgICBpZiAoIWdlbmVyYXRpb25TdGF0ZS5sYXlvdXRDb25maXJtZWQgJiYgZ2VuZXJhdGlvblN0YXRlLnBoYXNlICE9PSAnY29uZmlybWVkJykge1xuICAgICAgY29uc3QgaGFzSW5zdHJ1Y3Rpb25zID0gKHdpbmRvdy5sYXlvdXRJbnN0cnVjdGlvbnMgfHwgW10pLmxlbmd0aCA+IDA7XG4gICAgICBpZiAoaGFzSW5zdHJ1Y3Rpb25zKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ29uZmlybSBsYXlvdXQgYmVmb3JlIGdlbmVyYXRpbmcgZmluYWwgZmlsZXMuJyk7XG4gICAgICB9XG4gICAgICAvLyBObyBpbnN0cnVjdGlvbnMgYWRkZWQgXHUyMDE0IGF1dG8tY29uZmlybSBzbyB1c2VycyBhcmVuJ3QgYmxvY2tlZCBieSBhIHJlZHVuZGFudCBjbGljay5cbiAgICAgIGNvbnN0IGNvbmZpcm1SZXMgPSBhd2FpdCBhcGlDYWxsKCdQT1NUJywgJy9hcGkvY3YvY29uZmlybS1sYXlvdXQnLCB7IGNvbnRlbnRfcmV2aXNpb246IGdldEN1cnJlbnRDb250ZW50UmV2aXNpb24oKSB9KTtcbiAgICAgIGlmICghY29uZmlybVJlcz8ub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGNvbmZpcm1SZXM/LmVycm9yIHx8ICdGYWlsZWQgdG8gYXV0by1jb25maXJtIGxheW91dC4nKTtcbiAgICAgIH1cbiAgICAgIHN0YXRlTWFuYWdlci5tYXJrTGF5b3V0Q29uZmlybWVkKHsgY29uZmlybWVkQXQ6IGNvbmZpcm1SZXMuY29uZmlybWVkX2F0IHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBmaW5hbFJlcyA9IGF3YWl0IGFwaUNhbGwoJ1BPU1QnLCAnL2FwaS9jdi9nZW5lcmF0ZS1maW5hbCcsIHt9KTtcbiAgICBpZiAoIWZpbmFsUmVzPy5vayB8fCAhZmluYWxSZXMub3V0cHV0cykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGZpbmFsUmVzPy5lcnJvciB8fCAnRmFpbGVkIHRvIGdlbmVyYXRlIGZpbmFsIENWIG91dHB1dC4nKTtcbiAgICB9XG5cbiAgICB1cGRhdGVDdkFydGlmYWN0cyhmaW5hbFJlcy5vdXRwdXRzKTtcbiAgICBzdGF0ZU1hbmFnZXIubWFya0ZpbmFsR2VuZXJhdGVkKGZpbmFsUmVzLmdlbmVyYXRlZF9hdCB8fCBudWxsLCB7XG4gICAgICBwYWdlQ291bnRFc3RpbWF0ZTogZmluYWxSZXMucGFnZV9jb3VudF9lc3RpbWF0ZSA/PyBudWxsLFxuICAgICAgcGFnZUNvdW50RXhhY3Q6IGZpbmFsUmVzLnBhZ2VfY291bnRfZXhhY3QgPz8gbnVsbCxcbiAgICB9KTtcblxuICAgIHNjaGVkdWxlQXRzUmVmcmVzaCgncG9zdF9nZW5lcmF0aW9uJyk7XG5cbiAgICBzdGF0ZU1hbmFnZXIuc2V0UGhhc2UoJ2ZpbmFsX2dlbmVyYXRpb24nKTtcbiAgICBzd2l0Y2hUYWIoJ2ZpbmFsX2dlbmVyYXRlJyk7XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ1x1MjcwNSBGaW5hbCBmaWxlcyBnZW5lcmF0ZWQgZnJvbSB0aGUgY29uZmlybWVkIGxheW91dC4nKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCBgXHUyNzRDIENvdWxkIG5vdCBnZW5lcmF0ZSBmaW5hbCBmaWxlczogJHtlcnJvci5tZXNzYWdlfSBUcnkgY2xpY2tpbmcgR2VuZXJhdGUgYWdhaW4uIElmIGxheW91dCBjb25maXJtYXRpb24gaXMgbmVlZGVkIGZpcnN0LCBjbGljayBDb25maXJtIExheW91dCwgdGhlbiB0cnkgYWdhaW4uYCk7XG4gIH0gZmluYWxseSB7XG4gICAgc2hvd1Byb2Nlc3NpbmcoZmFsc2UpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZUxheW91dFByaW1hcnlBY3Rpb24oKSB7XG4gIGNvbnN0IGZyZXNobmVzcyA9IHN0YXRlTWFuYWdlci5nZXRMYXlvdXRGcmVzaG5lc3MoKTtcbiAgY29uc3QgZ2VuZXJhdGlvblN0YXRlID0gc3RhdGVNYW5hZ2VyLmdldEdlbmVyYXRpb25TdGF0ZSgpO1xuICBpZiAoZnJlc2huZXNzLmlzU3RhbGUpIHJldHVybiBoYW5kbGVSZWdlbmVyYXRlUHJldmlld0FjdGlvbigpO1xuICBpZiAoZ2VuZXJhdGlvblN0YXRlLmxheW91dENvbmZpcm1lZCB8fCBnZW5lcmF0aW9uU3RhdGUucGhhc2UgPT09ICdjb25maXJtZWQnKSB7XG4gICAgcmV0dXJuIGdlbmVyYXRlRmluYWxPdXRwdXRzKCk7XG4gIH1cbiAgcmV0dXJuIGNvbmZpcm1MYXlvdXRSZXZpZXcoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29tcGxldGVMYXlvdXRSZXZpZXcoKSB7XG4gIHJldHVybiBoYW5kbGVMYXlvdXRQcmltYXJ5QWN0aW9uKCk7XG59XG5cbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihHRU5FUkFUSU9OX1NUQVRFX0VWRU5ULCByZWZyZXNoTGF5b3V0UmV2aWV3U3RhdGUpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgQ29udGVudCBwcm9wb3NhbCBmdW5jdGlvbnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8qKlxuICogU3VibWl0IGEgbmF0dXJhbC1sYW5ndWFnZSBjb250ZW50IGVkaXQgcmVxdWVzdCB0byB0aGUgYmFja2VuZCBhbmQgcmVuZGVyIHByb3Bvc2Fscy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3VibWl0Q29udGVudFByb3Bvc2FsKCkge1xuICBjb25zdCBpbnB1dCAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2luc3RydWN0aW9uLWlucHV0Jyk7XG4gIGNvbnN0IHByb2Nlc3NpbmcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGVudC1wcm9wb3NhbC1wcm9jZXNzaW5nJyk7XG4gIGNvbnN0IHBhbmVsICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGVudC1wcm9wb3NhbHMtcGFuZWwnKTtcblxuICBjb25zdCBpbnN0cnVjdGlvbiA9IGlucHV0Py52YWx1ZS50cmltKCk7XG4gIGlmICghaW5zdHJ1Y3Rpb24pIHtcbiAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnXHUyNkEwXHVGRTBGIFBsZWFzZSBkZXNjcmliZSB0aGUgY29udGVudCBjaGFuZ2UgeW91IHdhbnQgYmVmb3JlIHN1Ym1pdHRpbmcuJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHByb2Nlc3NpbmcpIHByb2Nlc3Npbmcuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgaWYgKHBhbmVsKSAgICAgICBwYW5lbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpQ2FsbCgnUE9TVCcsICcvYXBpL2N2L3Byb3Bvc2UtY29udGVudC1jaGFuZ2UnLCB7IGluc3RydWN0aW9uIH0pO1xuICAgIGlmICghcmVzPy5vaykge1xuICAgICAgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgYFx1Mjc0QyBDb3VsZCBub3QgZ2VuZXJhdGUgY29udGVudCBwcm9wb3NhbHMuIFRyeSByZXBocmFzaW5nIHlvdXIgaW5zdHJ1Y3Rpb24gb3IgY2hlY2sgdGhlIHNlc3Npb24gaXMgc3RpbGwgYWN0aXZlLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwcm9wb3NhbHMgPSByZXMucHJvcG9zYWxzIHx8IFtdO1xuICAgIGlmIChwcm9wb3NhbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnXHUyNkEwXHVGRTBGIE5vIHByb3Bvc2FscyB3ZXJlIGdlbmVyYXRlZC4gVHJ5IHJlcGhyYXNpbmcgeW91ciBpbnN0cnVjdGlvbi4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmVuZGVyQ29udGVudFByb3Bvc2Fscyhwcm9wb3NhbHMpO1xuICAgIGlmIChwYW5lbCkgcGFuZWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsIGBcdTI3NEMgQ291bGQgbm90IHN1Ym1pdCB0aGUgY29udGVudCBwcm9wb3NhbC4gQ2hlY2sgeW91ciBjb25uZWN0aW9uIGFuZCB0cnkgYWdhaW4uYCk7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKHByb2Nlc3NpbmcpIHByb2Nlc3Npbmcuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgfVxufVxuXG4vKipcbiAqIFJlbmRlciBhIGxpc3Qgb2YgY29udGVudCBwcm9wb3NhbHMgYXMgcmV2aWV3YWJsZSBjYXJkcyBpbnNpZGUgI2NvbnRlbnQtcHJvcG9zYWxzLXBhbmVsLlxuICogQHBhcmFtIHtBcnJheTx7aWQsIHR5cGUsIGxvY2F0aW9uLCBvcmlnaW5hbCwgcHJvcG9zZWQsIHJlYXNvbn0+fSBwcm9wb3NhbHNcbiAqL1xuZnVuY3Rpb24gcmVuZGVyQ29udGVudFByb3Bvc2Fscyhwcm9wb3NhbHMpIHtcbiAgY29uc3QgcGFuZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGVudC1wcm9wb3NhbHMtcGFuZWwnKTtcbiAgaWYgKCFwYW5lbCkgcmV0dXJuO1xuXG4gIGNvbnN0IGFwcGx5QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FwcGx5LWNvbnRlbnQtY2hhbmdlcy1idG4nKTtcblxuICBwYW5lbC5pbm5lckhUTUwgPSBgXG4gICAgPHAgY2xhc3M9XCJjb250ZW50LXByb3Bvc2Fscy1oZWFkaW5nXCI+JHtwcm9wb3NhbHMubGVuZ3RofSBwcm9wb3NhbCR7cHJvcG9zYWxzLmxlbmd0aCAhPT0gMSA/ICdzJyA6ICcnfSBcdTIwMTQgYXBwcm92ZSB0aGUgY2hhbmdlcyB5b3Ugd2FudCB0byBhcHBseTo8L3A+XG4gICAgJHtwcm9wb3NhbHMubWFwKChwLCBpKSA9PiBgXG4gICAgICA8ZGl2IGNsYXNzPVwiY29udGVudC1wcm9wb3NhbC1jYXJkXCIgZGF0YS1wcm9wb3NhbC1pZD1cIiR7ZXNjYXBlSHRtbChwLmlkKX1cIiBkYXRhLXByb3Bvc2FsLWluZGV4PVwiJHtpfVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHJvcG9zYWwtbWV0YVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwicHJvcG9zYWwtdHlwZS1iYWRnZVwiPiR7cC50eXBlID09PSAnc3VtbWFyeScgPyAnU3VtbWFyeScgOiAnQnVsbGV0J308L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJwcm9wb3NhbC1sb2NhdGlvblwiPiR7ZXNjYXBlSHRtbChwLmxvY2F0aW9uKX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHJvcG9zYWwtZGlmZlwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9wb3NhbC1vcmlnaW5hbFwiPjxzdHJvbmc+QmVmb3JlOjwvc3Ryb25nPiAke2VzY2FwZUh0bWwocC5vcmlnaW5hbCl9PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInByb3Bvc2FsLXByb3Bvc2VkXCI+PHN0cm9uZz5BZnRlcjo8L3N0cm9uZz4gJHtlc2NhcGVIdG1sKHAucHJvcG9zZWQpfTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgJHtwLnJlYXNvbiA/IGA8ZGl2IGNsYXNzPVwicHJvcG9zYWwtcmVhc29uXCI+PGVtPiR7ZXNjYXBlSHRtbChwLnJlYXNvbil9PC9lbT48L2Rpdj5gIDogJyd9XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwcm9wb3NhbC1hY3Rpb25zXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwicHJvcG9zYWwtYXBwcm92ZS1sYWJlbFwiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwicHJvcG9zYWwtYXBwcm92ZS1jaGVja2JveFwiIGNoZWNrZWQ+XG4gICAgICAgICAgICBBcHByb3ZlIHRoaXMgY2hhbmdlXG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5gKS5qb2luKCcnKX1cbiAgYDtcblxuICAvLyBTdG9yZSBwcm9wb3NhbHMgZm9yIGxhdGVyIHJldHJpZXZhbFxuICBwYW5lbC5kYXRhc2V0LnByb3Bvc2FscyA9IEpTT04uc3RyaW5naWZ5KHByb3Bvc2Fscyk7XG5cbiAgaWYgKGFwcGx5QnRuKSBhcHBseUJ0bi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbn1cblxuLyoqXG4gKiBDb2xsZWN0IGFwcHJvdmVkIHByb3Bvc2FscyBhbmQgUE9TVCB0aGVtIHRvIC9hcGkvY3YvYXBwbHktY29udGVudC1jaGFuZ2VzLlxuICogVXBkYXRlcyBkaXJ0eS1waGFzZSBzdGF0ZSBhbmQgc2hvd3MgdGhlIHJldHVybiBjYWxsb3V0LlxuICovXG5hc3luYyBmdW5jdGlvbiBhcHBseUFjY2VwdGVkUHJvcG9zYWxzKCkge1xuICBjb25zdCBwYW5lbCAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb250ZW50LXByb3Bvc2Fscy1wYW5lbCcpO1xuICBjb25zdCBhcHBseUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHBseS1jb250ZW50LWNoYW5nZXMtYnRuJyk7XG5cbiAgY29uc3QgYWxsUHJvcG9zYWxzID0gSlNPTi5wYXJzZShwYW5lbD8uZGF0YXNldC5wcm9wb3NhbHMgfHwgJ1tdJyk7XG4gIGNvbnN0IGNoZWNrYm94ZXMgICA9IHBhbmVsPy5xdWVyeVNlbGVjdG9yQWxsKCcucHJvcG9zYWwtYXBwcm92ZS1jaGVja2JveCcpIHx8IFtdO1xuXG4gIGNvbnN0IGFjY2VwdGVkID0gYWxsUHJvcG9zYWxzLmZpbHRlcigoXywgaSkgPT4gY2hlY2tib3hlc1tpXT8uY2hlY2tlZCk7XG4gIGlmIChhY2NlcHRlZC5sZW5ndGggPT09IDApIHtcbiAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnXHUyNkEwXHVGRTBGIE5vIHByb3Bvc2FscyBhcHByb3ZlZC4gVGljayBhdCBsZWFzdCBvbmUgY2hhbmdlIHRvIGFwcGx5LicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChhcHBseUJ0bikgYXBwbHlCdG4uZGlzYWJsZWQgPSB0cnVlO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpQ2FsbCgnUE9TVCcsICcvYXBpL2N2L2FwcGx5LWNvbnRlbnQtY2hhbmdlcycsIHsgYWNjZXB0ZWQgfSk7XG4gICAgaWYgKCFyZXM/Lm9rKSB7XG4gICAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCBgXHUyNzRDIEZhaWxlZCB0byBhcHBseSBjb250ZW50IGNoYW5nZXM6ICR7cmVzPy5lcnJvciB8fCAnVW5rbm93biBlcnJvcid9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3RhdGVNYW5hZ2VyLnNldERpcnR5UGhhc2VzKFxuICAgICAgcmVzLmRpcnR5X3BoYXNlcyB8fCBbJ2dlbmVyYXRlJywgJ2xheW91dCddLFxuICAgICAgcmVzLmVhcmxpZXN0X2RpcnR5X3N0ZXAgfHwgJ2dlbmVyYXRlJyxcbiAgICApO1xuXG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgYFx1MjcwNSAke3Jlcy5hcHBsaWVkX2NvdW50fSBjb250ZW50IGNoYW5nZSR7cmVzLmFwcGxpZWRfY291bnQgIT09IDEgPyAncycgOiAnJ30gc3RhZ2VkLiBSZXR1cm4gdG8gR2VuZXJhdGUgQ1YgdG8gYXBwbHkgdGhlbS5gKTtcblxuICAgIC8vIENsZWFyIHRoZSBwcm9wb3NhbCBwYW5lbFxuICAgIGlmIChwYW5lbCkgeyBwYW5lbC5pbm5lckhUTUwgPSAnJzsgcGFuZWwuc3R5bGUuZGlzcGxheSA9ICdub25lJzsgcGFuZWwuZGF0YXNldC5wcm9wb3NhbHMgPSAnW10nOyB9XG4gICAgaWYgKGFwcGx5QnRuKSBhcHBseUJ0bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgcmVmcmVzaExheW91dFJldmlld1N0YXRlKCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsIGBcdTI3NEMgQ291bGQgbm90IGFwcGx5IGNvbnRlbnQgY2hhbmdlcy4gQ2hlY2sgeW91ciBjb25uZWN0aW9uIGFuZCB0cnkgYWdhaW4uYCk7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKGFwcGx5QnRuKSBhcHBseUJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogU2hvdyBvciBoaWRlIHRoZSBkaXJ0eS1waGFzZXMgY2FsbG91dCBiYXNlZCBvbiBzdGF0ZU1hbmFnZXIuZ2V0RGlydHlQaGFzZXMoKS5cbiAqL1xuZnVuY3Rpb24gcmVuZGVyRGlydHlQaGFzZXNDYWxsb3V0KCkge1xuICBjb25zdCBjYWxsb3V0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RpcnR5LXBoYXNlcy1jYWxsb3V0Jyk7XG4gIGlmICghY2FsbG91dCkgcmV0dXJuO1xuICBjb25zdCBkaXJ0eSA9IHN0YXRlTWFuYWdlci5nZXREaXJ0eVBoYXNlcygpO1xuICBjYWxsb3V0LnN0eWxlLmRpc3BsYXkgPSBkaXJ0eS5sZW5ndGggPiAwID8gJ2Jsb2NrJyA6ICdub25lJztcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEVTIG1vZHVsZSBleHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuZXhwb3J0IHtcbiAgaW5pdGlhdGVMYXlvdXRJbnN0cnVjdGlvbnMsXG4gIGNvbXBsZXRlTGF5b3V0UmV2aWV3LFxuICBjb25maXJtTGF5b3V0UmV2aWV3LFxuICBnZW5lcmF0ZUZpbmFsT3V0cHV0cyxcbiAgaGFuZGxlTGF5b3V0UHJpbWFyeUFjdGlvbixcbiAgbG9hZExheW91dEluc3RydWN0aW9uSGlzdG9yeSxcbiAgcmVuZGVyUHJldmlld091dHB1dFN0YXR1cyxcbiAgcmVuZGVyTGF5b3V0UHJldmlld1N0YXR1cyxcbiAgZGlzcGxheUxheW91dFByZXZpZXcsXG4gIHN1Ym1pdExheW91dEluc3RydWN0aW9uLFxuICBzdWJtaXRTbWFydEluc3RydWN0aW9uLFxuICAvLyBoZWxwZXJzIGV4cG9ydGVkIGZvciB1bml0IHRlc3RzXG4gIHNob3dQcm9jZXNzaW5nLFxuICBzaG93Q29uZmlybWF0aW9uTWVzc2FnZSxcbiAgcmVuZGVySW5zdHJ1Y3Rpb25IaXN0b3J5LFxuICBhZGRUb0luc3RydWN0aW9uSGlzdG9yeSxcbiAgdW5kb0luc3RydWN0aW9uLFxuICAvLyBjb250ZW50IHByb3Bvc2FsXG4gIHN1Ym1pdENvbnRlbnRQcm9wb3NhbCxcbiAgcmVuZGVyQ29udGVudFByb3Bvc2FscyxcbiAgYXBwbHlBY2NlcHRlZFByb3Bvc2FscyxcbiAgcmVuZGVyRGlydHlQaGFzZXNDYWxsb3V0LFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL2F0cy1yZWZpbmVtZW50LmpzXG4gKiBBVFMgc2NvcmUgYmFkZ2UgZGlzcGxheSBhbmQgZGVib3VuY2VkIHJlZnJlc2ggc2NoZWR1bGluZy5cbiAqXG4gKiBERVBFTkRFTkNJRVM6XG4gKiAgIC0gZ2xvYmFsVGhpcy5zdGF0ZU1hbmFnZXIgZnJvbSBzdGF0ZS1tYW5hZ2VyLmpzIChhY2Nlc3NlZCB2aWEgZ2xvYmFsVGhpcyB0aHJvdWdob3V0KVxuICovXG5cbmZ1bmN0aW9uIF9kaXNwYXRjaEF0c1Njb3JlVXBkYXRlZCgpIHtcbiAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2F0cy1zY29yZS11cGRhdGVkJykpO1xufVxuXG5mdW5jdGlvbiBfc2FmZVRleHQodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZS50cmltKCkgOiAnJztcbn1cblxuZnVuY3Rpb24gX2NvZXJjZU9iamVjdCh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyA/IHZhbHVlIDoge307XG59XG5cbmZ1bmN0aW9uIF9mb3JtYXREYXRlTGFiZWwodmFsdWUpIHtcbiAgY29uc3QgdGV4dCA9IF9zYWZlVGV4dCh2YWx1ZSk7XG4gIGlmICghdGV4dCkgcmV0dXJuICcnO1xuXG4gIGlmICgvXlxcZHs0fS1cXGR7Mn0tXFxkezJ9JC8udGVzdCh0ZXh0KSkge1xuICAgIGNvbnN0IFt5ZWFyLCBtb250aCwgZGF5XSA9IHRleHQuc3BsaXQoJy0nKTtcbiAgICByZXR1cm4gYCR7bW9udGh9LyR7ZGF5fS8ke3llYXJ9YDtcbiAgfVxuXG4gIGNvbnN0IHBhcnNlZCA9IG5ldyBEYXRlKHRleHQpO1xuICBpZiAoIU51bWJlci5pc05hTihwYXJzZWQuZ2V0VGltZSgpKSkge1xuICAgIHJldHVybiBwYXJzZWQudG9JU09TdHJpbmcoKS5zbGljZSgwLCAxMCk7XG4gIH1cbiAgcmV0dXJuIHRleHQ7XG59XG5cbmZ1bmN0aW9uIF9nZXRQYWdlTGVuZ3RoTGFiZWwoKSB7XG4gIGNvbnN0IGdlbmVyYXRpb25TdGF0ZSA9IF9jb2VyY2VPYmplY3QoZ2xvYmFsVGhpcy5zdGF0ZU1hbmFnZXI/LmdldEdlbmVyYXRpb25TdGF0ZT8uKCkpO1xuICBjb25zdCBleGFjdCA9IE51bWJlcihnZW5lcmF0aW9uU3RhdGUucGFnZUNvdW50RXhhY3QpO1xuICBpZiAoTnVtYmVyLmlzRmluaXRlKGV4YWN0KSAmJiBleGFjdCA+IDApIHtcbiAgICByZXR1cm4gYExlbmd0aCAke2V4YWN0fSBwYWdlJHtleGFjdCA9PT0gMSA/ICcnIDogJ3MnfWA7XG4gIH1cblxuICBjb25zdCBlc3RpbWF0ZSA9IE51bWJlcihnZW5lcmF0aW9uU3RhdGUucGFnZUNvdW50RXN0aW1hdGUpO1xuICBpZiAoTnVtYmVyLmlzRmluaXRlKGVzdGltYXRlKSAmJiBlc3RpbWF0ZSA+IDApIHtcbiAgICByZXR1cm4gYExlbmd0aCAke2VzdGltYXRlLnRvRml4ZWQoMSl9IHBhZ2VzIGVzdGA7XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIF9nZXRKb2JTdW1tYXJ5TGFiZWwoKSB7XG4gIGNvbnN0IGludGFrZSA9IF9jb2VyY2VPYmplY3Qod2luZG93Ll9zdGF0dXNJbnRha2UpO1xuICBjb25zdCBhbmFseXNpcyA9IF9jb2VyY2VPYmplY3QoZ2xvYmFsVGhpcy5zdGF0ZU1hbmFnZXI/LmdldFRhYkRhdGE/LignYW5hbHlzaXMnKSk7XG4gIGNvbnN0IHBvc2l0aW9uRmFsbGJhY2sgPSBfc2FmZVRleHQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Bvc2l0aW9uLXRpdGxlJyk/LnRleHRDb250ZW50IHx8ICcnKTtcblxuICBjb25zdCByb2xlID0gX3NhZmVUZXh0KFxuICAgIGludGFrZS5yb2xlXG4gICAgICB8fCBhbmFseXNpcy5qb2JfdGl0bGVcbiAgICAgIHx8IGFuYWx5c2lzLnRpdGxlXG4gICAgICB8fCBhbmFseXNpcy5wb3NpdGlvbl9uYW1lXG4gICAgICB8fCAnJ1xuICApO1xuICBjb25zdCBjb21wYW55ID0gX3NhZmVUZXh0KGludGFrZS5jb21wYW55IHx8IGFuYWx5c2lzLmNvbXBhbnlfbmFtZSB8fCBhbmFseXNpcy5jb21wYW55IHx8ICcnKTtcbiAgY29uc3QgZGF0ZUFwcGxpZWQgPSBfZm9ybWF0RGF0ZUxhYmVsKFxuICAgIGludGFrZS5kYXRlX2FwcGxpZWRcbiAgICAgIHx8IGFuYWx5c2lzLmRhdGVfYXBwbGllZFxuICAgICAgfHwgYW5hbHlzaXMuYXBwbGljYXRpb25fZGF0ZVxuICAgICAgfHwgJydcbiAgKTtcblxuICBjb25zdCBwcmltYXJ5ID0gcm9sZSAmJiBjb21wYW55XG4gICAgPyBgJHtyb2xlfSBAICR7Y29tcGFueX1gXG4gICAgOiAocm9sZSB8fCBjb21wYW55IHx8IHBvc2l0aW9uRmFsbGJhY2spO1xuICBpZiAoIXByaW1hcnkpIHJldHVybiAnJztcbiAgaWYgKCFkYXRlQXBwbGllZCkgcmV0dXJuIHByaW1hcnk7XG4gIHJldHVybiBgJHtwcmltYXJ5fSAoJHtkYXRlQXBwbGllZH0pYDtcbn1cblxuZnVuY3Rpb24gX2tleXdvcmRDb3VudChrZXl3b3JkcywgdHlwZSwgc3RhdHVzZXMgPSBbJ21hdGNoZWQnLCAncGFydGlhbCddKSB7XG4gIHJldHVybiBrZXl3b3Jkcy5maWx0ZXIoa2V5d29yZCA9PiBrZXl3b3JkLnR5cGUgPT09IHR5cGUgJiYgc3RhdHVzZXMuaW5jbHVkZXMoa2V5d29yZC5zdGF0dXMpKS5sZW5ndGg7XG59XG5cbmZ1bmN0aW9uIF9idWlsZFN1bW1hcnlEZXRhaWwoc2NvcmUsIGtleXdvcmRzKSB7XG4gIGNvbnN0IG1pc3NpbmdIYXJkID0ga2V5d29yZHNcbiAgICAuZmlsdGVyKGtleXdvcmQgPT4ga2V5d29yZC50eXBlID09PSAnaGFyZCcgJiYga2V5d29yZC5zdGF0dXMgPT09ICdtaXNzaW5nJylcbiAgICAubWFwKGtleXdvcmQgPT4ga2V5d29yZC5rZXl3b3JkKVxuICAgIC5maWx0ZXIoQm9vbGVhbik7XG5cbiAgaWYgKG1pc3NpbmdIYXJkLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBwcmV2aWV3ID0gbWlzc2luZ0hhcmQuc2xpY2UoMCwgMikuam9pbignLCAnKTtcbiAgICBjb25zdCBzdWZmaXggPSBtaXNzaW5nSGFyZC5sZW5ndGggPiAyID8gYCArJHttaXNzaW5nSGFyZC5sZW5ndGggLSAyfSBtb3JlYCA6ICcnO1xuICAgIHJldHVybiBgTWlzc2luZyBoYXJkOiAke3ByZXZpZXd9JHtzdWZmaXh9YDtcbiAgfVxuXG4gIGNvbnN0IGV4YWN0ID0ga2V5d29yZHMuZmlsdGVyKGtleXdvcmQgPT4ga2V5d29yZC5tYXRjaF90eXBlID09PSAnZXhhY3QnIHx8IGtleXdvcmQubWF0Y2hfdHlwZSA9PT0gJ3N5bm9ueW0nKS5sZW5ndGg7XG4gIGNvbnN0IHBhcnRpYWwgPSBrZXl3b3Jkcy5maWx0ZXIoa2V5d29yZCA9PiBrZXl3b3JkLm1hdGNoX3R5cGUgPT09ICdwYXJ0aWFsJykubGVuZ3RoO1xuICBjb25zdCB0b3BTZWN0aW9ucyA9IE9iamVjdC5lbnRyaWVzKHNjb3JlLnNlY3Rpb25fc2NvcmVzIHx8IHt9KVxuICAgIC5maWx0ZXIoKFssIHZhbHVlXSkgPT4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiB2YWx1ZSA+IDApXG4gICAgLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiByaWdodFsxXSAtIGxlZnRbMV0pXG4gICAgLnNsaWNlKDAsIDIpXG4gICAgLm1hcCgoW3NlY3Rpb24sIHZhbHVlXSkgPT4gYCR7c2VjdGlvbn0gJHtNYXRoLnJvdW5kKHZhbHVlKX0lYCk7XG5cbiAgaWYgKHRvcFNlY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gYFRvcCBzZWN0aW9uczogJHt0b3BTZWN0aW9ucy5qb2luKCcgXHUyMDIyICcpfWA7XG4gIH1cblxuICBpZiAoZXhhY3QgPiAwIHx8IHBhcnRpYWwgPiAwKSB7XG4gICAgcmV0dXJuIGBNYXRjaCBxdWFsaXR5OiAke2V4YWN0fSBleGFjdCBcdTIwMjIgJHtwYXJ0aWFsfSBwYXJ0aWFsYDtcbiAgfVxuXG4gIHJldHVybiBgQmFzaXM6ICR7c2NvcmUuYmFzaXMgfHwgJ3Jldmlldyd9YDtcbn1cblxuZnVuY3Rpb24gZm9ybWF0QXRzU2NvcmVTdW1tYXJ5KHNjb3JlKSB7XG4gIGNvbnN0IGtleXdvcmRzID0gQXJyYXkuaXNBcnJheShzY29yZT8ua2V5d29yZF9zdGF0dXMpID8gc2NvcmUua2V5d29yZF9zdGF0dXMgOiBbXTtcbiAgY29uc3Qgb3ZlcmFsbCA9IHR5cGVvZiBzY29yZT8ub3ZlcmFsbCA9PT0gJ251bWJlcicgPyBNYXRoLnJvdW5kKHNjb3JlLm92ZXJhbGwpIDogbnVsbDtcblxuICBpZiAob3ZlcmFsbCA9PT0gbnVsbCkge1xuICAgIHJldHVybiB7IG92ZXJhbGw6IG51bGwsIGxpbmU6ICcnLCBkZXRhaWw6ICcnLCBrZXl3b3JkcyB9O1xuICB9XG5cbiAgaWYgKGtleXdvcmRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB7XG4gICAgICBvdmVyYWxsLFxuICAgICAgbGluZTogYE92ZXJhbGwgJHtvdmVyYWxsfSVgLFxuICAgICAgZGV0YWlsOiBgQmFzaXM6ICR7c2NvcmUuYmFzaXMgfHwgJ3Jldmlldyd9YCxcbiAgICAgIGtleXdvcmRzLFxuICAgIH07XG4gIH1cblxuICBjb25zdCBoYXJkVG90YWwgPSBrZXl3b3Jkcy5maWx0ZXIoa2V5d29yZCA9PiBrZXl3b3JkLnR5cGUgPT09ICdoYXJkJykubGVuZ3RoO1xuICBjb25zdCBzb2Z0VG90YWwgPSBrZXl3b3Jkcy5maWx0ZXIoa2V5d29yZCA9PiBrZXl3b3JkLnR5cGUgPT09ICdzb2Z0JykubGVuZ3RoO1xuICBjb25zdCBib251c1RvdGFsID0ga2V5d29yZHMuZmlsdGVyKGtleXdvcmQgPT4ga2V5d29yZC50eXBlID09PSAnYm9udXMnKS5sZW5ndGg7XG4gIGNvbnN0IHN1bW1hcnlQYXJ0cyA9IFtdO1xuXG4gIGlmIChoYXJkVG90YWwgPiAwKSB7XG4gICAgc3VtbWFyeVBhcnRzLnB1c2goYEhhcmQgJHtfa2V5d29yZENvdW50KGtleXdvcmRzLCAnaGFyZCcpfS8ke2hhcmRUb3RhbH1gKTtcbiAgfVxuICBpZiAoc29mdFRvdGFsID4gMCkge1xuICAgIHN1bW1hcnlQYXJ0cy5wdXNoKGBTb2Z0ICR7X2tleXdvcmRDb3VudChrZXl3b3JkcywgJ3NvZnQnKX0vJHtzb2Z0VG90YWx9YCk7XG4gIH1cbiAgaWYgKGJvbnVzVG90YWwgPiAwKSB7XG4gICAgc3VtbWFyeVBhcnRzLnB1c2goYEJvbnVzICR7X2tleXdvcmRDb3VudChrZXl3b3JkcywgJ2JvbnVzJyl9LyR7Ym9udXNUb3RhbH1gKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgb3ZlcmFsbCxcbiAgICBsaW5lOiBzdW1tYXJ5UGFydHMuam9pbignIFx1MjAyMiAnKSB8fCBgT3ZlcmFsbCAke292ZXJhbGx9JWAsXG4gICAgZGV0YWlsOiBfYnVpbGRTdW1tYXJ5RGV0YWlsKHNjb3JlLCBrZXl3b3JkcyksXG4gICAga2V5d29yZHMsXG4gIH07XG59XG5cbmZ1bmN0aW9uIF91cGRhdGVBdHNTdW1tYXJ5KHNjb3JlKSB7XG4gIGNvbnN0IGhlYWRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdHMtc2NvcmUtaGVhZGVyJyk7XG4gIGNvbnN0IHN1bW1hcnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXRzLXNjb3JlLXN1bW1hcnknKTtcbiAgY29uc3Qgc3VtbWFyeUxpbmUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXRzLXNjb3JlLXN1bW1hcnktbGluZScpO1xuICBjb25zdCBzdW1tYXJ5RGV0YWlsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F0cy1zY29yZS1zdW1tYXJ5LWRldGFpbCcpO1xuXG4gIGlmICghaGVhZGVyIHx8ICFzdW1tYXJ5IHx8ICFzdW1tYXJ5TGluZSB8fCAhc3VtbWFyeURldGFpbCkgcmV0dXJuO1xuXG4gIGNvbnN0IGtleXdvcmRzID0gQXJyYXkuaXNBcnJheShzY29yZT8ua2V5d29yZF9zdGF0dXMpID8gc2NvcmUua2V5d29yZF9zdGF0dXMgOiBbXTtcbiAgY29uc3QgaGFzU2NvcmUgPSBzY29yZSAmJiB0eXBlb2Ygc2NvcmUub3ZlcmFsbCA9PT0gJ251bWJlcic7XG4gIGNvbnN0IHBhZ2VMZW5ndGhMYWJlbCA9IF9nZXRQYWdlTGVuZ3RoTGFiZWwoKTtcbiAgY29uc3Qgam9iU3VtbWFyeUxhYmVsID0gX2dldEpvYlN1bW1hcnlMYWJlbCgpO1xuXG4gIGlmICghaGFzU2NvcmUpIHtcbiAgICBoZWFkZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBzdW1tYXJ5LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgc3VtbWFyeUxpbmUudGV4dENvbnRlbnQgPSAnJztcbiAgICBzdW1tYXJ5RGV0YWlsLnRleHRDb250ZW50ID0gJyc7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaGVhZGVyLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG5cbiAgY29uc3Qgc3VtbWFyeUNvbnRlbnQgPSBmb3JtYXRBdHNTY29yZVN1bW1hcnkoc2NvcmUpO1xuICBjb25zdCBsaW5lUGFydHMgPSBbc3VtbWFyeUNvbnRlbnQubGluZSwgcGFnZUxlbmd0aExhYmVsXS5maWx0ZXIoQm9vbGVhbik7XG4gIGNvbnN0IGRldGFpbFBhcnRzID0gW2pvYlN1bW1hcnlMYWJlbCwgc3VtbWFyeUNvbnRlbnQuZGV0YWlsXS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgaWYgKGxpbmVQYXJ0cy5sZW5ndGggPT09IDAgJiYgZGV0YWlsUGFydHMubGVuZ3RoID09PSAwICYmIGtleXdvcmRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHN1bW1hcnkuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBzdW1tYXJ5TGluZS50ZXh0Q29udGVudCA9ICcnO1xuICAgIHN1bW1hcnlEZXRhaWwudGV4dENvbnRlbnQgPSAnJztcbiAgICByZXR1cm47XG4gIH1cblxuICBzdW1tYXJ5TGluZS50ZXh0Q29udGVudCA9IGxpbmVQYXJ0cy5qb2luKCcgXHUyMDIyICcpO1xuICBzdW1tYXJ5RGV0YWlsLnRleHRDb250ZW50ID0gZGV0YWlsUGFydHMuam9pbignIFx1MjAyMiAnKTtcbiAgc3VtbWFyeS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVBdHNCYWRnZShzY29yZSkge1xuICBfdXBkYXRlQXRzU3VtbWFyeShzY29yZSk7XG5cbiAgY29uc3QgYmFkZ2UgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdHMtc2NvcmUtYmFkZ2UnKTtcbiAgY29uc3QgdmFsdWVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdHMtc2NvcmUtdmFsdWUnKTtcbiAgaWYgKCFiYWRnZSB8fCAhdmFsdWVFbCkge1xuICAgIF9kaXNwYXRjaEF0c1Njb3JlVXBkYXRlZCgpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICghc2NvcmUgfHwgdHlwZW9mIHNjb3JlLm92ZXJhbGwgIT09ICdudW1iZXInKSB7XG4gICAgYmFkZ2Uuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBfZGlzcGF0Y2hBdHNTY29yZVVwZGF0ZWQoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBvdmVyYWxsID0gTWF0aC5yb3VuZChzY29yZS5vdmVyYWxsKTtcbiAgdmFsdWVFbC50ZXh0Q29udGVudCA9IGAke292ZXJhbGx9JWA7XG4gIGJhZGdlLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG5cbiAgYmFkZ2UuY2xhc3NMaXN0LnJlbW92ZSgnc2NvcmUtaGlnaCcsICdzY29yZS1tZWRpdW0nLCAnc2NvcmUtbG93Jyk7XG4gIGlmIChvdmVyYWxsID49IDc1KSB7XG4gICAgYmFkZ2UuY2xhc3NMaXN0LmFkZCgnc2NvcmUtaGlnaCcpO1xuICB9IGVsc2UgaWYgKG92ZXJhbGwgPj0gNTApIHtcbiAgICBiYWRnZS5jbGFzc0xpc3QuYWRkKCdzY29yZS1tZWRpdW0nKTtcbiAgfSBlbHNlIHtcbiAgICBiYWRnZS5jbGFzc0xpc3QuYWRkKCdzY29yZS1sb3cnKTtcbiAgfVxuXG4gIGJhZGdlLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIGBBVFMgbWF0Y2ggc2NvcmU6ICR7b3ZlcmFsbH0lICgke3Njb3JlLmJhc2lzIHx8ICdyZXZpZXcnfSlgKTtcbiAgX2Rpc3BhdGNoQXRzU2NvcmVVcGRhdGVkKCk7XG59XG5cbi8qKlxuICogRmV0Y2ggQVRTIHNjb3JlIGZyb20gYmFja2VuZCBhbmQgdXBkYXRlIGJhZGdlICsgc3RhdGVNYW5hZ2VyLlxuICogU2FmZSB0byBjYWxsIGF0IGFueSBwaGFzZSBcdTIwMTQgZG9lcyBub3RoaW5nIHdoZW4gbm8gc2Vzc2lvbi9hbmFseXNpcyBhdmFpbGFibGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFtiYXNpc10gIFwiYW5hbHlzaXNcIiB8IFwicmV2aWV3X2NoZWNrcG9pbnRcIiB8IFwicG9zdF9nZW5lcmF0aW9uXCJcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVmcmVzaEF0c1Njb3JlKGJhc2lzID0gJ3Jldmlld19jaGVja3BvaW50Jykge1xuICBjb25zdCBzZXNzaW9uSWQgPSBnbG9iYWxUaGlzLnN0YXRlTWFuYWdlcj8uZ2V0U2Vzc2lvbklkPy4oKTtcbiAgaWYgKCFzZXNzaW9uSWQpIHJldHVybjtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9jdi9hdHMtc2NvcmUnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBzZXNzaW9uX2lkOiBzZXNzaW9uSWQsIGJhc2lzIH0pLFxuICAgIH0pO1xuICAgIGlmICghcmVzLm9rKSByZXR1cm47XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEub2sgJiYgZGF0YS5hdHNfc2NvcmUpIHtcbiAgICAgIGdsb2JhbFRoaXMuc3RhdGVNYW5hZ2VyPy5zZXRBdHNTY29yZT8uKGRhdGEuYXRzX3Njb3JlKTtcbiAgICAgIHVwZGF0ZUF0c0JhZGdlKGRhdGEuYXRzX3Njb3JlKTtcbiAgICB9XG4gIH0gY2F0Y2ggKF9lKSB7XG4gICAgLy8gTm9uLWZhdGFsIFx1MjAxNCBiYWRnZSBzdGF5cyBoaWRkZW4gb3Igc2hvd3Mgc3RhbGUgdmFsdWVcbiAgfVxufVxuXG4vKiogRGVib3VuY2VkOiBkZWZlcnMgcmVmcmVzaCA2MDBtcyBhZnRlciB0aGUgbGFzdCBjYWxsLiAqL1xubGV0IF9hdHNSZWZyZXNoVGltZXIgPSBudWxsO1xuZnVuY3Rpb24gc2NoZWR1bGVBdHNSZWZyZXNoKGJhc2lzID0gJ3Jldmlld19jaGVja3BvaW50Jykge1xuICBjbGVhclRpbWVvdXQoX2F0c1JlZnJlc2hUaW1lcik7XG4gIF9hdHNSZWZyZXNoVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHJlZnJlc2hBdHNTY29yZShiYXNpcyksIDYwMCk7XG59XG5cbmZ1bmN0aW9uIF9yZWZyZXNoU3VtbWFyeUZyb21TdGF0ZSgpIHtcbiAgY29uc3Qgc2NvcmUgPSBnbG9iYWxUaGlzLnN0YXRlTWFuYWdlcj8uZ2V0QXRzU2NvcmU/LigpO1xuICBpZiAoc2NvcmUgJiYgdHlwZW9mIHNjb3JlLm92ZXJhbGwgPT09ICdudW1iZXInKSB7XG4gICAgX3VwZGF0ZUF0c1N1bW1hcnkoc2NvcmUpO1xuICB9XG59XG5cbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignY3ZidWlsZGVyOmdlbmVyYXRpb24tc3RhdGUtY2hhbmdlZCcsICgpID0+IHtcbiAgICBfcmVmcmVzaFN1bW1hcnlGcm9tU3RhdGUoKTtcbiAgfSk7XG59XG5cbmlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gIGNvbnN0IHBvc2l0aW9uVGl0bGVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwb3NpdGlvbi10aXRsZScpO1xuICBpZiAocG9zaXRpb25UaXRsZUVsICYmIHR5cGVvZiBNdXRhdGlvbk9ic2VydmVyICE9PSAndW5kZWZpbmVkJykge1xuICAgIGNvbnN0IHRpdGxlT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7XG4gICAgICBfcmVmcmVzaFN1bW1hcnlGcm9tU3RhdGUoKTtcbiAgICB9KTtcbiAgICB0aXRsZU9ic2VydmVyLm9ic2VydmUocG9zaXRpb25UaXRsZUVsLCB7XG4gICAgICBjaGlsZExpc3Q6IHRydWUsXG4gICAgICBjaGFyYWN0ZXJEYXRhOiB0cnVlLFxuICAgICAgc3VidHJlZTogdHJ1ZSxcbiAgICB9KTtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgRVMgbW9kdWxlIGV4cG9ydHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5leHBvcnQgeyB1cGRhdGVBdHNCYWRnZSwgcmVmcmVzaEF0c1Njb3JlLCBzY2hlZHVsZUF0c1JlZnJlc2gsIGZvcm1hdEF0c1Njb3JlU3VtbWFyeSB9O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvbWVzc2FnZS1xdWV1ZS5qc1xuICogQ29udmVyc2F0aW9uIG1lc3NhZ2UgYXBwZW5kaW5nLCBsb2FkaW5nIG1lc3NhZ2VzLCBhbmQgdGhlIHByZS1ET00gYnVmZmVyXG4gKiBxdWV1ZSB0aGF0IGhvbGRzIG1lc3NhZ2VzIGVtaXR0ZWQgYmVmb3JlICNjb252ZXJzYXRpb24gZXhpc3RzLlxuICpcbiAqIERFUEVOREVOQ0lFUzpcbiAqICAgLSBjbGVhbkpzb25SZXNwb25zZSwgZXNjYXBlSHRtbCBmcm9tIHV0aWxzLmpzXG4gKiAgIC0gc2VuZE1lc3NhZ2UgZnJvbSBtZXNzYWdlLWRpc3BhdGNoLmpzIChvbiBnbG9iYWxUaGlzLCBmb3IgaW5saW5lIGJ1dHRvbnMpXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgY2xlYW5Kc29uUmVzcG9uc2UsIGVzY2FwZUh0bWwgfSBmcm9tICcuL3V0aWxzLmpzJztcbmNvbnN0IGxvZyA9IGdldExvZ2dlcignbWVzc2FnZS1xdWV1ZScpO1xuXG4vLyBCdWZmZXIgZm9yIG1lc3NhZ2VzIGVtaXR0ZWQgYmVmb3JlIHRoZSAjY29udmVyc2F0aW9uIGRpdiBleGlzdHMuXG4vLyBGbHVzaGVkIGF0IHRoZSBzdGFydCBvZiBpbml0KCkgb25jZSB0aGUgRE9NIGlzIGZ1bGx5IHJlYWR5LlxuY29uc3QgX21lc3NhZ2VRdWV1ZSA9IFtdO1xuXG5mdW5jdGlvbiBfZmx1c2hNZXNzYWdlUXVldWUoKSB7XG4gIHdoaWxlIChfbWVzc2FnZVF1ZXVlLmxlbmd0aCkge1xuICAgIGNvbnN0IHsgdHlwZSwgdGV4dCB9ID0gX21lc3NhZ2VRdWV1ZS5zaGlmdCgpO1xuICAgIGFwcGVuZE1lc3NhZ2UodHlwZSwgdGV4dCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYXBwZW5kTG9hZGluZ01lc3NhZ2UodGV4dCkge1xuICBjb25zdCBjb252ZXJzYXRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udmVyc2F0aW9uJyk7XG4gIGNvbnN0IG1lc3NhZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgbWVzc2FnZS5jbGFzc05hbWUgPSAnbWVzc2FnZSBzeXN0ZW0nO1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGNvbnRlbnQuY2xhc3NOYW1lID0gJ2NvbnRlbnQgbG9hZGluZy1tZXNzYWdlJztcbiAgY29udGVudC5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz1cImxvYWRpbmctc3Bpbm5lclwiPjwvZGl2PjxzcGFuPiR7dGV4dH08L3NwYW4+YDtcbiAgbWVzc2FnZS5hcHBlbmRDaGlsZChjb250ZW50KTtcbiAgY29udmVyc2F0aW9uLmFwcGVuZENoaWxkKG1lc3NhZ2UpO1xuICBjb252ZXJzYXRpb24uc2Nyb2xsVG9wID0gY29udmVyc2F0aW9uLnNjcm9sbEhlaWdodDtcbiAgcmV0dXJuIG1lc3NhZ2U7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUxvYWRpbmdNZXNzYWdlKG1lc3NhZ2VFbGVtZW50KSB7XG4gIGlmIChtZXNzYWdlRWxlbWVudCAmJiBtZXNzYWdlRWxlbWVudC5wYXJlbnROb2RlKSB7XG4gICAgbWVzc2FnZUVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChtZXNzYWdlRWxlbWVudCk7XG4gIH1cbn1cblxuLyoqIFJlc3RvcmVzIGEgcHJldmlvdXNseS1zYXZlZCBtZXNzYWdlIHdob3NlIGNvbnRlbnQgaXMgYWxyZWFkeSBIVE1MIChzYXZlZCB2aWEgaW5uZXJIVE1MKS4gKi9cbmZ1bmN0aW9uIGFwcGVuZE1lc3NhZ2VIdG1sKHR5cGUsIGh0bWwpIHtcbiAgY29uc3QgY29udmVyc2F0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbnZlcnNhdGlvbicpO1xuICBjb25zdCBtZXNzYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIG1lc3NhZ2UuY2xhc3NOYW1lID0gYG1lc3NhZ2UgJHt0eXBlfWA7XG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgY29udGVudC5jbGFzc05hbWUgPSAnY29udGVudCc7XG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gaHRtbDtcbiAgbWVzc2FnZS5hcHBlbmRDaGlsZChjb250ZW50KTtcbiAgY29udmVyc2F0aW9uLmFwcGVuZENoaWxkKG1lc3NhZ2UpO1xuICBjb252ZXJzYXRpb24uc2Nyb2xsVG9wID0gY29udmVyc2F0aW9uLnNjcm9sbEhlaWdodDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDb2xsYXBzaWJsZSBsb25nLWNvbnRlbnQgaGVscGVyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY29uc3QgQ09MTEFQU0VfTElORV9USFJFU0hPTEQgPSA4OyAgLy8gbGluZXMgYmVmb3JlIGNvbGxhcHNpbmdcbmNvbnN0IENPTExBUFNFX0NIQVJfVEhSRVNIT0xEID0gNDgwOyAvLyBjaGFycyBiZWZvcmUgY29sbGFwc2luZ1xuXG4vKipcbiAqIFdyYXAgcmVuZGVyZWQgSFRNTCBpbiBhIGNvbGxhcHNpYmxlIGNvbnRhaW5lciB3aGVuIHRoZSBjb250ZW50IGV4Y2VlZHMgdGhlXG4gKiB0aHJlc2hvbGQsIHNob3dpbmcgdGhlIGZpcnN0IGZldyBsaW5lcyB3aXRoIGEgdG9nZ2xlIGJ1dHRvbi5cbiAqL1xuZnVuY3Rpb24gX21ha2VDb2xsYXBzaWJsZUNvbnRlbnQoaHRtbCwgdGV4dFN0cikge1xuICBjb25zdCBsaW5lcyA9IHRleHRTdHIuc3BsaXQoJ1xcbicpO1xuICBpZiAobGluZXMubGVuZ3RoIDw9IENPTExBUFNFX0xJTkVfVEhSRVNIT0xEICYmIHRleHRTdHIubGVuZ3RoIDw9IENPTExBUFNFX0NIQVJfVEhSRVNIT0xEKSB7XG4gICAgcmV0dXJuIHsgaHRtbCwgY29sbGFwc2libGU6IGZhbHNlIH07XG4gIH1cblxuICAvLyBCdWlsZCBwcmV2aWV3OiBmaXJzdCBDT0xMQVBTRV9MSU5FX1RIUkVTSE9MRCBsaW5lcyB3b3J0aCBvZiBlc2NhcGVkIHRleHRcbiAgY29uc3QgcHJldmlld0xpbmVzID0gbGluZXMuc2xpY2UoMCwgQ09MTEFQU0VfTElORV9USFJFU0hPTEQpO1xuICBjb25zdCBwcmV2aWV3SHRtbCA9IGVzY2FwZUh0bWwocHJldmlld0xpbmVzLmpvaW4oJ1xcbicpKVxuICAgIC5yZXBsYWNlKC9cXCpcXCooLis/KVxcKlxcKi9nLCAnPHN0cm9uZz4kMTwvc3Ryb25nPicpXG4gICAgLnJlcGxhY2UoL1xcKiguKz8pXFwqL2csICc8ZW0+JDE8L2VtPicpXG4gICAgLnJlcGxhY2UoL2AoW15gXSspYC9nLCAnPGNvZGU+JDE8L2NvZGU+JylcbiAgICAucmVwbGFjZSgvXFxuL2csICc8YnI+Jyk7XG5cbiAgY29uc3Qgb3ZlcmZsb3cgPSBsaW5lcy5sZW5ndGggLSBDT0xMQVBTRV9MSU5FX1RIUkVTSE9MRDtcbiAgY29uc3QgaWQgPSBgY29sbGFwc2libGUtJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDcpfWA7XG5cbiAgY29uc3Qgd3JhcHBlZCA9IGBcbiAgICA8ZGl2IGNsYXNzPVwibXNnLXByZXZpZXdcIiBpZD1cIiR7aWR9LXByZXZpZXdcIj4ke3ByZXZpZXdIdG1sfTwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJtc2ctZnVsbFwiIGlkPVwiJHtpZH0tZnVsbFwiIHN0eWxlPVwiZGlzcGxheTpub25lXCI+JHtodG1sfTwvZGl2PlxuICAgIDxidXR0b24gY2xhc3M9XCJtc2ctdG9nZ2xlLWJ0blwiIG9uY2xpY2s9XCIoZnVuY3Rpb24oYnRuKXtcbiAgICAgIHZhciBwPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCcke2lkfS1wcmV2aWV3JyksXG4gICAgICAgICAgZj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnJHtpZH0tZnVsbCcpO1xuICAgICAgaWYoZi5zdHlsZS5kaXNwbGF5PT09J25vbmUnKXtcbiAgICAgICAgcC5zdHlsZS5kaXNwbGF5PSdub25lJzsgZi5zdHlsZS5kaXNwbGF5PSdibG9jayc7IGJ0bi50ZXh0Q29udGVudD0nU2hvdyBsZXNzJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHAuc3R5bGUuZGlzcGxheT0nJzsgZi5zdHlsZS5kaXNwbGF5PSdub25lJzsgYnRuLnRleHRDb250ZW50PSdTaG93ICR7b3ZlcmZsb3d9IG1vcmUgbGluZSR7b3ZlcmZsb3cgPT09IDEgPyAnJyA6ICdzJ31cdTIwMjYnO1xuICAgICAgfVxuICAgIH0pKHRoaXMpXCIgdHlwZT1cImJ1dHRvblwiPlNob3cgJHtvdmVyZmxvd30gbW9yZSBsaW5lJHtvdmVyZmxvdyA9PT0gMSA/ICcnIDogJ3MnfVx1MjAyNjwvYnV0dG9uPmA7XG5cbiAgcmV0dXJuIHsgaHRtbDogd3JhcHBlZCwgY29sbGFwc2libGU6IHRydWUgfTtcbn1cblxuZnVuY3Rpb24gYXBwZW5kTWVzc2FnZSh0eXBlLCB0ZXh0KSB7XG4gIGNvbnN0IGNvbnZlcnNhdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb252ZXJzYXRpb24nKTtcbiAgaWYgKCFjb252ZXJzYXRpb24pIHtcbiAgICAvLyBET00gbm90IHJlYWR5IHlldCBcdTIwMTQgYnVmZmVyIHVudGlsIF9mbHVzaE1lc3NhZ2VRdWV1ZSgpIGlzIGNhbGxlZCBmcm9tIGluaXQoKVxuICAgIF9tZXNzYWdlUXVldWUucHVzaCh7IHR5cGUsIHRleHQgfSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgbWVzc2FnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBtZXNzYWdlLmNsYXNzTmFtZSA9IGBtZXNzYWdlICR7dHlwZX1gO1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGNvbnRlbnQuY2xhc3NOYW1lID0gJ2NvbnRlbnQnO1xuXG4gIC8vIFNpbXBsZSBtYXJrZG93biByZW5kZXJpbmc6IGNvbnZlcnQgKip0ZXh0KiogdG8gPHN0cm9uZz4gYW5kIHByZXNlcnZlIG5ld2xpbmVzXG4gIGNvbnN0IHRleHRTdHIgPSB0eXBlb2YgdGV4dCA9PT0gJ3N0cmluZycgPyB0ZXh0IDogSlNPTi5zdHJpbmdpZnkodGV4dCwgbnVsbCwgMik7XG4gIGNvbnN0IHJlbmRlcmVkSHRtbCA9IGVzY2FwZUh0bWwodGV4dFN0cilcbiAgICAucmVwbGFjZSgvXFwqXFwqKC4rPylcXCpcXCovZywgJzxzdHJvbmc+JDE8L3N0cm9uZz4nKVxuICAgIC5yZXBsYWNlKC9cXCooLis/KVxcKi9nLCAnPGVtPiQxPC9lbT4nKVxuICAgIC5yZXBsYWNlKC9gKFteYF0rKWAvZywgJzxjb2RlPiQxPC9jb2RlPicpXG4gICAgLnJlcGxhY2UoL1xcbi9nLCAnPGJyPicpO1xuXG4gIC8vIEFwcGx5IGNvbGxhcHNpYmxlIHdyYXBwZXIgZm9yIGxvbmcgdXNlci9hc3Npc3RhbnQgbWVzc2FnZXNcbiAgaWYgKHR5cGUgPT09ICd1c2VyJyB8fCB0eXBlID09PSAnYXNzaXN0YW50Jykge1xuICAgIGNvbnN0IHsgaHRtbCwgY29sbGFwc2libGUgfSA9IF9tYWtlQ29sbGFwc2libGVDb250ZW50KHJlbmRlcmVkSHRtbCwgdGV4dFN0cik7XG4gICAgY29udGVudC5pbm5lckhUTUwgPSBodG1sO1xuICAgIGlmIChjb2xsYXBzaWJsZSkgY29udGVudC5jbGFzc0xpc3QuYWRkKCdjb2xsYXBzaWJsZS1tc2cnKTtcbiAgfSBlbHNlIHtcbiAgICBjb250ZW50LmlubmVySFRNTCA9IHJlbmRlcmVkSHRtbDtcbiAgfVxuICBtZXNzYWdlLmFwcGVuZENoaWxkKGNvbnRlbnQpO1xuXG4gIC8vIENoZWNrIGlmIG1lc3NhZ2UgZW5kcyB3aXRoIHJlc3BvbnNlIG9wdGlvbnMgbGlrZSAoeWVzL25vL21heWJlKVxuICBjb25zdCBvcHRpb25zTWF0Y2ggPSB0ZXh0U3RyLm1hdGNoKC9cXCgoW14pXStcXC9bXildKylcXClcXHMqJC8pO1xuICBpZiAob3B0aW9uc01hdGNoICYmIHR5cGUgPT09ICdhc3Npc3RhbnQnKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IG9wdGlvbnNNYXRjaFsxXS5zcGxpdCgnLycpLm1hcChvcHQgPT4gb3B0LnRyaW0oKSk7XG4gICAgY29uc3QgYnV0dG9uQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgYnV0dG9uQ29udGFpbmVyLnN0eWxlLmNzc1RleHQgPSAnbWFyZ2luLXRvcDogMTJweDsgZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IGZsZXgtd3JhcDogd3JhcDsnO1xuICAgIG9wdGlvbnMuZm9yRWFjaChvcHRpb24gPT4ge1xuICAgICAgY29uc3QgYnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgICBidG4udGV4dENvbnRlbnQgPSBvcHRpb247XG4gICAgICBidG4uY2xhc3NOYW1lID0gJ2FjdGlvbi1idG4nO1xuICAgICAgYnRuLnN0eWxlLmNzc1RleHQgPSAncGFkZGluZzogOHB4IDE2cHg7IGJhY2tncm91bmQ6ICMzYjgyZjY7IGNvbG9yOiB3aGl0ZTsgYm9yZGVyOiBub25lOyBib3JkZXItcmFkaXVzOiA2cHg7IGN1cnNvcjogcG9pbnRlcjsnO1xuICAgICAgYnRuLm9uY2xpY2sgPSAoKSA9PiB7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZXNzYWdlLWlucHV0JykudmFsdWUgPSBvcHRpb247XG4gICAgICAgIGlmICh0eXBlb2Ygc2VuZE1lc3NhZ2UgPT09ICdmdW5jdGlvbicpIHNlbmRNZXNzYWdlKCk7XG4gICAgICB9O1xuICAgICAgYnV0dG9uQ29udGFpbmVyLmFwcGVuZENoaWxkKGJ0bik7XG4gICAgfSk7XG4gICAgbWVzc2FnZS5hcHBlbmRDaGlsZChidXR0b25Db250YWluZXIpO1xuICB9XG5cbiAgY29udmVyc2F0aW9uLmFwcGVuZENoaWxkKG1lc3NhZ2UpO1xuICBjb252ZXJzYXRpb24uc2Nyb2xsVG9wID0gY29udmVyc2F0aW9uLnNjcm9sbEhlaWdodDtcbiAgcmV0dXJuIG1lc3NhZ2U7XG59XG5cbi8qKlxuICogQXBwZW5kcyBhIHN5c3RlbSBlcnJvciBtZXNzYWdlIHdpdGggYW4gb3B0aW9uYWwgUmV0cnkgYnV0dG9uLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgdGV4dCAgICAgICAtIEVycm9yIG1lc3NhZ2UgdGV4dCAoc3VwcG9ydHMgKipib2xkKiogbWFya2Rvd24pXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcmV0cnlGbl0gIC0gQ2FsbGVkIHdoZW4gUmV0cnkgaXMgY2xpY2tlZDsgb21pdCBmb3Igbm9uLXJldHJ5YWJsZSBlcnJvcnNcbiAqIEBwYXJhbSB7c3RyaW5nfSAgIFtyZXRyeUxhYmVsXSAtIFJldHJ5IGJ1dHRvbiBsYWJlbCAoZGVmYXVsdCAnUmV0cnknKVxuICovXG5mdW5jdGlvbiBhcHBlbmRSZXRyeU1lc3NhZ2UodGV4dCwgcmV0cnlGbiwgcmV0cnlMYWJlbCA9ICdSZXRyeScsIGNhbmNlbEZuID0gbnVsbCkge1xuICBjb25zdCBjb252ZXJzYXRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udmVyc2F0aW9uJyk7XG4gIGNvbnN0IG1lc3NhZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgbWVzc2FnZS5jbGFzc05hbWUgPSAnbWVzc2FnZSBzeXN0ZW0nO1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGNvbnRlbnQuY2xhc3NOYW1lID0gJ2NvbnRlbnQnO1xuICBjb25zdCBlc2NhcGVkID0gZXNjYXBlSHRtbCh0ZXh0KTtcbiAgY29udGVudC5pbm5lckhUTUwgPSBlc2NhcGVkXG4gICAgLnJlcGxhY2UoL1xcKlxcKiguKz8pXFwqXFwqL2csICc8c3Ryb25nPiQxPC9zdHJvbmc+JylcbiAgICAucmVwbGFjZSgvXFxuL2csICc8YnI+Jyk7XG4gIG1lc3NhZ2UuYXBwZW5kQ2hpbGQoY29udGVudCk7XG4gIGlmICh0eXBlb2YgcmV0cnlGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgIGJ0bi50ZXh0Q29udGVudCA9IHJldHJ5TGFiZWw7XG4gICAgYnRuLnN0eWxlLmNzc1RleHQgPSAnbWFyZ2luLXRvcDo4cHg7cGFkZGluZzo2cHggMTRweDtiYWNrZ3JvdW5kOiMzYjgyZjY7Y29sb3I6I2ZmZjtib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjZweDtjdXJzb3I6cG9pbnRlcjtmb250LXNpemU6MC44NXJlbTtkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW4tcmlnaHQ6OHB4Oyc7XG4gICAgYnRuLm9uY2xpY2sgPSAoKSA9PiB7IG1lc3NhZ2UucmVtb3ZlKCk7IHJldHJ5Rm4oKTsgfTtcbiAgICBtZXNzYWdlLmFwcGVuZENoaWxkKGJ0bik7XG4gIH1cbiAgaWYgKHR5cGVvZiBjYW5jZWxGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnN0IGNhbmNlbEJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgIGNhbmNlbEJ0bi50ZXh0Q29udGVudCA9ICdTdG9wIHJldHJpZXMnO1xuICAgIGNhbmNlbEJ0bi5zdHlsZS5jc3NUZXh0ID0gJ21hcmdpbi10b3A6OHB4O3BhZGRpbmc6NnB4IDE0cHg7YmFja2dyb3VuZDojNmI3MjgwO2NvbG9yOiNmZmY7Ym9yZGVyOm5vbmU7Ym9yZGVyLXJhZGl1czo2cHg7Y3Vyc29yOnBvaW50ZXI7Zm9udC1zaXplOjAuODVyZW07ZGlzcGxheTppbmxpbmUtYmxvY2s7JztcbiAgICBjYW5jZWxCdG4ub25jbGljayA9ICgpID0+IHsgbWVzc2FnZS5yZW1vdmUoKTsgY2FuY2VsRm4oKTsgfTtcbiAgICBtZXNzYWdlLmFwcGVuZENoaWxkKGNhbmNlbEJ0bik7XG4gIH1cbiAgY29udmVyc2F0aW9uLmFwcGVuZENoaWxkKG1lc3NhZ2UpO1xuICBjb252ZXJzYXRpb24uc2Nyb2xsVG9wID0gY29udmVyc2F0aW9uLnNjcm9sbEhlaWdodDtcbiAgcmV0dXJuIG1lc3NhZ2U7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZEZvcm1hdHRlZEFuYWx5c2lzKHJlc3VsdCkge1xuICB0cnkge1xuICAgIGNvbnN0IGNsZWFuUmVzdWx0ID0gY2xlYW5Kc29uUmVzcG9uc2UocmVzdWx0KTtcbiAgICBjb25zdCBkYXRhID0gdHlwZW9mIGNsZWFuUmVzdWx0ID09PSAnc3RyaW5nJyA/IEpTT04ucGFyc2UoY2xlYW5SZXN1bHQpIDogY2xlYW5SZXN1bHQ7XG5cbiAgICBpZiAoZGF0YSAmJiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiYgKGRhdGEudGl0bGUgfHwgZGF0YS5yZXF1aXJlZF9za2lsbHMpKSB7XG4gICAgICBjb25zdCBjb252ZXJzYXRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udmVyc2F0aW9uJyk7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBtZXNzYWdlLmNsYXNzTmFtZSA9ICdtZXNzYWdlIGFzc2lzdGFudCc7XG4gICAgICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBjb250ZW50LmNsYXNzTmFtZSA9ICdjb250ZW50IGpvYi1hbmFseXNpcyc7XG5cbiAgICAgIGxldCBodG1sID0gJzxoMz5cdUQ4M0RcdURDQ0IgSm9iIEFuYWx5c2lzIENvbXBsZXRlPC9oMz4nO1xuICAgICAgaWYgKGRhdGEudGl0bGUpICBodG1sICs9IGA8cD48c3Ryb25nPlBvc2l0aW9uOjwvc3Ryb25nPiAke2RhdGEudGl0bGV9IGF0ICR7ZGF0YS5jb21wYW55IHx8ICdDb21wYW55J308L3A+YDtcbiAgICAgIGlmIChkYXRhLmRvbWFpbikgaHRtbCArPSBgPHA+PHN0cm9uZz5Eb21haW46PC9zdHJvbmc+ICR7ZGF0YS5kb21haW59PC9wPmA7XG5cbiAgICAgIGlmIChkYXRhLnJlcXVpcmVkX3NraWxscz8ubGVuZ3RoKSB7XG4gICAgICAgIGh0bWwgKz0gJzxoND5cdUQ4M0NcdURGQUYgUmVxdWlyZWQgU2tpbGxzOjwvaDQ+PHVsPic7XG4gICAgICAgIGRhdGEucmVxdWlyZWRfc2tpbGxzLmZvckVhY2gocyA9PiB7IGh0bWwgKz0gYDxsaT4ke3N9PC9saT5gOyB9KTtcbiAgICAgICAgaHRtbCArPSAnPC91bD4nO1xuICAgICAgfVxuICAgICAgaWYgKGRhdGEucHJlZmVycmVkX3NraWxscz8ubGVuZ3RoKSB7XG4gICAgICAgIGh0bWwgKz0gJzxoND5cdTJCNTAgUHJlZmVycmVkIFNraWxsczo8L2g0Pjx1bD4nO1xuICAgICAgICBkYXRhLnByZWZlcnJlZF9za2lsbHMuZm9yRWFjaChzID0+IHsgaHRtbCArPSBgPGxpPiR7c308L2xpPmA7IH0pO1xuICAgICAgICBodG1sICs9ICc8L3VsPic7XG4gICAgICB9XG4gICAgICBpZiAoZGF0YS5uaWNlX3RvX2hhdmVfcmVxdWlyZW1lbnRzPy5sZW5ndGgpIHtcbiAgICAgICAgaHRtbCArPSAnPGg0Plx1MjcyOCBOaWNlIHRvIEhhdmU6PC9oND48dWw+JztcbiAgICAgICAgZGF0YS5uaWNlX3RvX2hhdmVfcmVxdWlyZW1lbnRzLmZvckVhY2gociA9PiB7IGh0bWwgKz0gYDxsaT4ke3J9PC9saT5gOyB9KTtcbiAgICAgICAgaHRtbCArPSAnPC91bD4nO1xuICAgICAgfVxuICAgICAgaWYgKGRhdGEuYXRzX2tleXdvcmRzPy5sZW5ndGgpIHtcbiAgICAgICAgaHRtbCArPSAnPGg0Plx1RDgzRFx1REQxMSBBVFMgS2V5d29yZHM6PC9oND48cCBzdHlsZT1cImxpbmUtaGVpZ2h0OiAyO1wiPic7XG4gICAgICAgIGRhdGEuYXRzX2tleXdvcmRzLmZvckVhY2goa3cgPT4ge1xuICAgICAgICAgIGh0bWwgKz0gYDxzcGFuIHN0eWxlPVwiZGlzcGxheTppbmxpbmUtYmxvY2s7YmFja2dyb3VuZDojZGJlYWZlO2NvbG9yOiMxZTQwYWY7Ym9yZGVyLXJhZGl1czo0cHg7cGFkZGluZzoycHggOHB4O21hcmdpbjoycHg7Zm9udC1zaXplOjAuODVlbTtcIj4ke2t3fTwvc3Bhbj5gO1xuICAgICAgICB9KTtcbiAgICAgICAgaHRtbCArPSAnPC9wPic7XG4gICAgICB9XG5cbiAgICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgIG1lc3NhZ2UuYXBwZW5kQ2hpbGQoY29udGVudCk7XG4gICAgICBjb252ZXJzYXRpb24uYXBwZW5kQ2hpbGQobWVzc2FnZSk7XG4gICAgICBjb252ZXJzYXRpb24uc2Nyb2xsVG9wID0gY29udmVyc2F0aW9uLnNjcm9sbEhlaWdodDtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgcmVzdWx0KTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2cuZXJyb3IoJ0FuYWx5c2lzIGRpc3BsYXkgZXJyb3I6JywgZSk7XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgcmVzdWx0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhcHBlbmRGb3JtYXR0ZWRSZXNwb25zZShyZXNwb25zZSkge1xuICB0cnkge1xuICAgIGNvbnN0IGRhdGEgPSB0eXBlb2YgcmVzcG9uc2UgPT09ICdzdHJpbmcnID8gSlNPTi5wYXJzZShyZXNwb25zZSkgOiByZXNwb25zZTtcbiAgICBpZiAoZGF0YSAmJiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiYgKGRhdGEudGl0bGUgfHwgZGF0YS5yZXF1aXJlZF9za2lsbHMpKSB7XG4gICAgICBhcHBlbmRGb3JtYXR0ZWRBbmFseXNpcyhyZXNwb25zZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIHJlc3BvbnNlKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCByZXNwb25zZSk7XG4gIH1cbn1cblxuLy8gYXBwZW5kUmF3SHRtbCBpcyBuZWVkZWQgYnkgbWVzc2FnZS1kaXNwYXRjaDsgZGVmaW5lZCBoZXJlIHNpbmNlIGl0IHVzZXMgdGhlXG4vLyBjb252ZXJzYXRpb24gZWxlbWVudCBwYXR0ZXJuLlxuZnVuY3Rpb24gYXBwZW5kUmF3SHRtbChodG1sKSB7XG4gIGNvbnN0IGNvbnZlcnNhdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb252ZXJzYXRpb24nKTtcbiAgaWYgKCFjb252ZXJzYXRpb24pIHJldHVybjtcbiAgY29udmVyc2F0aW9uLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJywgaHRtbCk7XG4gIGNvbnZlcnNhdGlvbi5zY3JvbGxUb3AgPSBjb252ZXJzYXRpb24uc2Nyb2xsSGVpZ2h0O1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgRVMgbW9kdWxlIGV4cG9ydHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5leHBvcnQge1xuICBfbWVzc2FnZVF1ZXVlLCBfZmx1c2hNZXNzYWdlUXVldWUsXG4gIGFwcGVuZExvYWRpbmdNZXNzYWdlLCByZW1vdmVMb2FkaW5nTWVzc2FnZSxcbiAgYXBwZW5kTWVzc2FnZUh0bWwsIGFwcGVuZE1lc3NhZ2UsXG4gIGFwcGVuZFJldHJ5TWVzc2FnZSxcbiAgYXBwZW5kRm9ybWF0dGVkQW5hbHlzaXMsIGFwcGVuZEZvcm1hdHRlZFJlc3BvbnNlLFxuICBhcHBlbmRSYXdIdG1sLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL3Jldmlldy10YWJsZS1iYXNlLmpzXG4gKiBUYWIgc3dpdGNoaW5nLCBhbmFseXNpcyB0YWIsIGN1c3RvbWl6YXRpb24gcmVzcG9uc2UgaGFuZGxlciwgcmV2aWV3LXBhbmVcbiAqIGNvb3JkaW5hdGlvbiwgYW5kIHRoZSBwYWdlLWVzdGltYXRlIHdpZGdldC5cbiAqXG4gKiBEZXBlbmRlbmNpZXMgKGFsbCByZXNvbHZlZCB0aHJvdWdoIGdsb2JhbFRoaXMgYXQgcnVudGltZSk6XG4gKiAgIGFwcGVuZE1lc3NhZ2UsIHNhdmVUYWJEYXRhLCBjbGVhbkpzb25SZXNwb25zZSwgZXNjYXBlSHRtbCxcbiAqICAgZ2V0U3RhZ2VGb3JUYWIsIHVwZGF0ZVRhYkJhckZvclN0YWdlLCB1cGRhdGVBY3Rpb25CdXR0b25zLFxuICogICBwb3B1bGF0ZUpvYlRhYiwgcG9wdWxhdGVRdWVzdGlvbnNUYWIsIGJ1aWxkQWNoaWV2ZW1lbnRzRWRpdG9yLFxuICogICByZW5kZXJSZXdyaXRlUGFuZWwsIHBvcHVsYXRlQ1ZFZGl0b3JUYWIsXG4gKiAgIHBvcHVsYXRlRG93bmxvYWRUYWIsIHBvcHVsYXRlU3BlbGxDaGVja1RhYiwgaW5pdGlhdGVMYXlvdXRJbnN0cnVjdGlvbnMsXG4gKiAgIHBvcHVsYXRlRmluYWxpc2VUYWIsIHBvcHVsYXRlTWFzdGVyVGFiLCBwb3B1bGF0ZUNvdmVyTGV0dGVyVGFiLFxuICogICBwb3B1bGF0ZVNjcmVlbmluZ1RhYiwgZXh0cmFjdEZpcnN0SnNvbk9iamVjdCxcbiAqICAgZmV0Y2hTdGF0dXMsIGFwaUNhbGwsXG4gKiAgIGJ1aWxkRXhwZXJpZW5jZVJldmlld1RhYmxlLCBidWlsZFNraWxsc1Jldmlld1RhYmxlLFxuICogICBidWlsZEFjaGlldmVtZW50c1Jldmlld1RhYmxlLCBidWlsZFN1bW1hcnlGb2N1c1NlY3Rpb24sXG4gKiAgIGJ1aWxkUHVibGljYXRpb25zUmV2aWV3VGFibGUsIGdldEV4cGVyaWVuY2VEZXRhaWxzLFxuICogICBnZXRFeHBlcmllbmNlUmVjb21tZW5kYXRpb24sIGFjaGlldmVtZW50RGVjaXNpb25zXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdyZXZpZXctdGFibGUtYmFzZScpO1xuXG5pbXBvcnQgeyBzdGF0ZU1hbmFnZXIgfSBmcm9tICcuL3N0YXRlLW1hbmFnZXIuanMnO1xuXG4vLyBcdTI1MDBcdTI1MDAgTW9kdWxlLWxldmVsIHN0YXRlIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5sZXQgdXNlclNlbGVjdGlvbnMgPSB7XG4gIGV4cGVyaWVuY2VzOiB7fSwgIC8vIGV4cF9pZCAtPiAnZW1waGFzaXplJ3wnaW5jbHVkZSd8J2RlLWVtcGhhc2l6ZSd8J2V4Y2x1ZGUnXG4gIHNraWxsczoge30gICAgICAgIC8vIHNraWxsX25hbWUgLT4gJ2VtcGhhc2l6ZSd8J2luY2x1ZGUnfCdkZS1lbXBoYXNpemUnfCdleGNsdWRlJ1xufTtcbmxldCBwYWdlRXN0aW1hdGVUaW1lciA9IG51bGw7XG5sZXQgcGFnZUVzdGltYXRlUmVxdWVzdElkID0gMDtcblxuLy8gRHJhZnQgaW5wdXQgY2FjaGUgXHUyMDEzIHByZXNlcnZlcyB1c2VyLXR5cGVkIHZhbHVlcyBhY3Jvc3MgdGFiIHN3aXRjaGVzXG5jb25zdCBfZHJhZnRJbnB1dHMgPSB7fTtcblxuZnVuY3Rpb24gX3NhdmVEcmFmdElucHV0c0ZvclRhYih0YWJOYW1lKSB7XG4gIGlmICghdGFiTmFtZSkgcmV0dXJuO1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgaWYgKCFjb250ZW50KSByZXR1cm47XG4gIGNvbnN0IHNhdmVkID0ge307XG4gIGNvbnRlbnQucXVlcnlTZWxlY3RvckFsbCgndGV4dGFyZWEsIGlucHV0LCBzZWxlY3QnKS5mb3JFYWNoKGVsID0+IHtcbiAgICBpZiAoIWVsLmlkIHx8IGVsLnR5cGUgPT09ICdmaWxlJykgcmV0dXJuO1xuICAgIHNhdmVkW2VsLmlkXSA9IChlbC50eXBlID09PSAnY2hlY2tib3gnIHx8IGVsLnR5cGUgPT09ICdyYWRpbycpID8gZWwuY2hlY2tlZCA6IGVsLnZhbHVlO1xuICB9KTtcbiAgaWYgKE9iamVjdC5rZXlzKHNhdmVkKS5sZW5ndGggPiAwKSB7XG4gICAgX2RyYWZ0SW5wdXRzW3RhYk5hbWVdID0gc2F2ZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gX3Jlc3RvcmVEcmFmdElucHV0c0ZvclRhYih0YWJOYW1lKSB7XG4gIGNvbnN0IGNhY2hlZCA9IF9kcmFmdElucHV0c1t0YWJOYW1lXTtcbiAgaWYgKCFjYWNoZWQpIHJldHVybjtcbiAgT2JqZWN0LmVudHJpZXMoY2FjaGVkKS5mb3JFYWNoKChbaWQsIHZhbHVlXSkgPT4ge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgIGlmICghZWwgfHwgZWwucmVhZE9ubHkgfHwgZWwuZGlzYWJsZWQgfHwgZWwudHlwZSA9PT0gJ2ZpbGUnKSByZXR1cm47XG4gICAgaWYgKGVsLnR5cGUgPT09ICdjaGVja2JveCcgfHwgZWwudHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgZWwuY2hlY2tlZCA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbC52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGVuc3VyZVRhYkRhdGFTdGF0ZSgpIHtcbiAgcmV0dXJuIHN0YXRlTWFuYWdlci5nZXRBbGxUYWJEYXRhKCk7XG59XG5cbmZ1bmN0aW9uIGlzUmVjb25uZWN0SW5Qcm9ncmVzcygpIHtcbiAgcmV0dXJuIHN0YXRlTWFuYWdlci5pc1JlY29ubmVjdGluZygpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgSW5jbHVzaW9uIGNvdW50cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gdXBkYXRlSW5jbHVzaW9uQ291bnRzKCkge1xuICB0cnkge1xuICAgIGNvbnN0IGV4cERlY3MgPSAod2luZG93Ll9zYXZlZERlY2lzaW9ucyAmJiB3aW5kb3cuX3NhdmVkRGVjaXNpb25zLmV4cGVyaWVuY2VfZGVjaXNpb25zKSB8fCB1c2VyU2VsZWN0aW9ucy5leHBlcmllbmNlcyB8fCB7fTtcbiAgICBjb25zdCBza2lsbERlY3MgPSAod2luZG93Ll9zYXZlZERlY2lzaW9ucyAmJiB3aW5kb3cuX3NhdmVkRGVjaXNpb25zLnNraWxsX2RlY2lzaW9ucykgfHwgdXNlclNlbGVjdGlvbnMuc2tpbGxzIHx8IHt9O1xuICAgIGNvbnN0IGFjaERlY3MgPSAod2luZG93Ll9zYXZlZERlY2lzaW9ucyAmJiB3aW5kb3cuX3NhdmVkRGVjaXNpb25zLmFjaGlldmVtZW50X2RlY2lzaW9ucykgfHwgd2luZG93LmFjaGlldmVtZW50RGVjaXNpb25zIHx8IHt9O1xuXG4gICAgY29uc3QgZXhwSW5jbHVkZWQgPSBPYmplY3QudmFsdWVzKGV4cERlY3MpLmZpbHRlcih2ID0+IHYgIT09ICdleGNsdWRlJykubGVuZ3RoO1xuICAgIGNvbnN0IHNraWxsSW5jbHVkZWQgPSBPYmplY3QudmFsdWVzKHNraWxsRGVjcykuZmlsdGVyKHYgPT4gdiAhPT0gJ2V4Y2x1ZGUnKS5sZW5ndGg7XG4gICAgY29uc3QgYWNoSW5jbHVkZWQgPSBPYmplY3QudmFsdWVzKGFjaERlY3MpLmZpbHRlcih2ID0+IHYgIT09ICdleGNsdWRlJykubGVuZ3RoO1xuXG4gICAgY29uc3QgZXhwVGFiID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYi1leHAtcmV2aWV3Jyk7XG4gICAgY29uc3Qgc2tpbGxUYWIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFiLXNraWxscy1yZXZpZXcnKTtcbiAgICBjb25zdCBhY2hUYWIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFiLWFjaGlldmVtZW50cy1yZXZpZXcnKTtcblxuICAgIGlmIChleHBUYWIpIGV4cFRhYi50ZXh0Q29udGVudCA9IGBcdUQ4M0RcdURDQ0EgRXhwZXJpZW5jZXMke2V4cEluY2x1ZGVkID8gJyAoJyArIGV4cEluY2x1ZGVkICsgJyknIDogJyd9YDtcbiAgICBpZiAoc2tpbGxUYWIpIHNraWxsVGFiLnRleHRDb250ZW50ID0gYFx1RDgzRFx1REVFMFx1RkUwRiBTa2lsbHMke3NraWxsSW5jbHVkZWQgPyAnICgnICsgc2tpbGxJbmNsdWRlZCArICcpJyA6ICcnfWA7XG4gICAgaWYgKGFjaFRhYikgYWNoVGFiLnRleHRDb250ZW50ID0gYFx1RDgzQ1x1REZDNiBBY2hpZXZlbWVudHMke2FjaEluY2x1ZGVkID8gJyAoJyArIGFjaEluY2x1ZGVkICsgJyknIDogJyd9YDtcbiAgfSBjYXRjaCAoZSkgeyBsb2cud2FybignRmFpbGVkIHRvIHVwZGF0ZSBpbmNsdXNpb24gY291bnRzOicsIGUpOyB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBHZW5lcmF0ZSBDViB0YWIgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIF9wb3B1bGF0ZUdlbmVyYXRlVGFiKGN2RGF0YSwgY29udGVudCkge1xuICBpZiAoIWN2RGF0YSB8fCAhY3ZEYXRhLmZpbGVzIHx8ICFjdkRhdGEuZmlsZXMubGVuZ3RoKSB7XG4gICAgY29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImVtcHR5LXN0YXRlXCI+PGRpdiBjbGFzcz1cImljb25cIj5cdUQ4M0RcdURDQzQ8L2Rpdj48aDM+R2VuZXJhdGVkIENWPC9oMz48cD5HZW5lcmF0ZSBDViB0byBzZWUgcHJldmlldzwvcD48L2Rpdj4nO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG1ldGEgICAgID0gY3ZEYXRhLm1ldGFkYXRhIHx8IHt9O1xuICBjb25zdCByb2xlICAgICA9IG1ldGEucm9sZSAgICAgfHwgbWV0YS5wb3NpdGlvbiB8fCAnJztcbiAgY29uc3QgY29tcGFueSAgPSBtZXRhLmNvbXBhbnkgIHx8ICcnO1xuICBjb25zdCBzdWJ0aXRsZSA9IHJvbGUgJiYgY29tcGFueSA/IGAke3JvbGV9IFx1MjAxNCAke2NvbXBhbnl9YCA6IHJvbGUgfHwgY29tcGFueSB8fCAnQ1YgZ2VuZXJhdGVkJztcblxuICBjb25zdCBJQ09OUyA9IHsgJy5wZGYnOiAnXHVEODNEXHVEQ0M0JywgJy5kb2N4JzogJ1x1RDgzRFx1RENERCcsICcuaHRtbCc6ICdcdUQ4M0NcdURGMTAnIH07XG4gIGNvbnN0IExBQkVMUyA9IHtcbiAgICAnLnBkZic6ICBmID0+IGYuaW5jbHVkZXMoJ0FUUycpID8gJ0FUUyBQREYnICA6ICdIdW1hbiBQREYnLFxuICAgICcuZG9jeCc6IGYgPT4gZi5pbmNsdWRlcygnQVRTJykgPyAnQVRTIERPQ1gnIDogZi5zdGFydHNXaXRoKCdDb3ZlckxldHRlcl8nKSA/ICdDb3ZlciBMZXR0ZXInIDogJ0h1bWFuIERPQ1gnLFxuICAgICcuaHRtbCc6ICgpID0+ICdIVE1MJyxcbiAgfTtcblxuICBjb25zdCBkb3dubG9hZGFibGVFeHRzID0gbmV3IFNldChbJy5wZGYnLCAnLmRvY3gnLCAnLmh0bWwnXSk7XG4gIGNvbnN0IGZpbGVzID0gKGN2RGF0YS5maWxlcyB8fCBbXSkuZmlsdGVyKGYgPT4ge1xuICAgIGNvbnN0IGV4dCA9IGYuc2xpY2UoZi5sYXN0SW5kZXhPZignLicpKS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiBkb3dubG9hZGFibGVFeHRzLmhhcyhleHQpICYmIGYgIT09ICdqb2JfZGVzY3JpcHRpb24udHh0JztcbiAgfSk7XG5cbiAgY29uc3Qgc2lkID0gdHlwZW9mIGdldFNlc3Npb25JZEZyb21VUkwgPT09ICdmdW5jdGlvbicgPyBnZXRTZXNzaW9uSWRGcm9tVVJMKCkgOiBudWxsO1xuICBjb25zdCBzZXNzaW9uUGFyYW0gPSBzaWQgPyBgP3Nlc3Npb25faWQ9JHtlbmNvZGVVUklDb21wb25lbnQoc2lkKX1gIDogJyc7XG5cbiAgbGV0IGZpbGVSb3dzID0gJyc7XG4gIGZvciAoY29uc3QgZiBvZiBmaWxlcykge1xuICAgIGNvbnN0IGV4dCAgID0gZi5zbGljZShmLmxhc3RJbmRleE9mKCcuJykpLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgaWNvbiAgPSBJQ09OU1tleHRdICB8fCAnXHVEODNEXHVEQ0MxJztcbiAgICBjb25zdCBsYWJlbCA9IExBQkVMU1tleHRdID8gTEFCRUxTW2V4dF0oZikgOiBmO1xuICAgIGZpbGVSb3dzICs9IGBcbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDoxMnB4O3BhZGRpbmc6MTBweCAwO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNmMWY1Zjk7XCI+XG4gICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjEuNGVtO1wiPiR7aWNvbn08L3NwYW4+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJmbGV4OjE7bWluLXdpZHRoOjA7XCI+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOiMzNzQxNTE7XCI+JHtsYWJlbH08L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuNzhlbTtjb2xvcjojOWNhM2FmO3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztcIj4ke2VzY2FwZUh0bWwoZil9PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8YSBocmVmPVwiL2FwaS9kb3dubG9hZC8ke2VuY29kZVVSSUNvbXBvbmVudChmKX0ke3Nlc3Npb25QYXJhbX1cIiBkb3dubG9hZD1cIiR7ZXNjYXBlSHRtbChmKX1cIlxuICAgICAgICAgICBjbGFzcz1cImJ0bi1zZWNvbmRhcnlcIiBzdHlsZT1cInBhZGRpbmc6NnB4IDE0cHg7Zm9udC1zaXplOjAuODVlbTt0ZXh0LWRlY29yYXRpb246bm9uZTtkaXNwbGF5OmlubGluZS1ibG9jaztcIj5Eb3dubG9hZDwvYT5cbiAgICAgIDwvZGl2PmA7XG4gIH1cblxuICBjb250ZW50LmlubmVySFRNTCA9IGBcbiAgICA8ZGl2IHN0eWxlPVwibWF4LXdpZHRoOjY0MHB4O21hcmdpbjowIGF1dG87cGFkZGluZzoyNHB4IDA7XCI+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTJweDttYXJnaW4tYm90dG9tOjI0cHg7XCI+XG4gICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjJlbTtcIj5cdTI3MDU8L3NwYW4+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGgyIHN0eWxlPVwibWFyZ2luOjA7Zm9udC1zaXplOjEuMmVtO2NvbG9yOiMxMTE4Mjc7XCI+Q1YgR2VuZXJhdGVkPC9oMj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuOWVtO2NvbG9yOiM2YjcyODA7XCI+JHtlc2NhcGVIdG1sKHN1YnRpdGxlKX08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZmY7Ym9yZGVyOjFweCBzb2xpZCAjZTJlOGYwO2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MCAxNnB4O21hcmdpbi1ib3R0b206MjRweDtcIj5cbiAgICAgICAgJHtmaWxlUm93c31cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cIm5hdi1idXR0b25zIG5hdi1lbmRcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbnRpbnVlLWJ0blwiIG9uY2xpY2s9XCJzd2l0Y2hUYWIoJ2xheW91dCcpXCI+T3BlbiBMYXlvdXQgUmV2aWV3IFx1MjE5MjwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+YDtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFRhYiBzd2l0Y2hpbmcgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8vIFRyYWNrcyB3aGljaCBjdXN0b21pc2Utc3RhZ2Ugc3ViLXRhYnMgaGF2ZSBiZWVuIHZpZXdlZCB0aGlzIHNlc3Npb24gKEdBUC0yNjkpLlxuY29uc3QgX3Zpc2l0ZWRDdXN0b21pc2VUYWJzID0gbmV3IFNldCgpO1xuY29uc3QgX0NVU1RPTUlTRV9UQUJTID0gbmV3IFNldChbJ2dvYWxzJywgJ3F1ZXN0aW9ucycsICdleHAtcmV2aWV3JywgJ2FjaC1lZGl0b3InLCAnc2tpbGxzLXJldmlldycsICdhY2hpZXZlbWVudHMtcmV2aWV3JywgJ3RhZ2xpbmUtcmV2aWV3JywgJ3N1bW1hcnktcmV2aWV3JywgJ3B1YmxpY2F0aW9ucy1yZXZpZXcnLCAnYXRzLXNjb3JlJ10pO1xuXG5mdW5jdGlvbiBfdXBkYXRlVmlzaXRlZFRhYkluZGljYXRvcnMoKSB7XG4gIF92aXNpdGVkQ3VzdG9taXNlVGFicy5mb3JFYWNoKG5hbWUgPT4ge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHRhYi0ke25hbWV9YCk7XG4gICAgaWYgKGVsKSBlbC5jbGFzc0xpc3QuYWRkKCd0YWItLXZpc2l0ZWQnKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHN3aXRjaFRhYih0YWIpIHtcbiAgLy8gQ2xlYXIga2V5Ym9hcmQtZm9jdXNlZCBjYXJkIHN0YXRlIHdoZW4gbGVhdmluZyBhIHJldmlldyB0YWJcbiAgaWYgKHR5cGVvZiByZXNldENhcmRGb2N1cyA9PT0gJ2Z1bmN0aW9uJykgcmVzZXRDYXJkRm9jdXMoKTtcblxuICAvLyBTYXZlIHVuc2F2ZWQgdXNlciBpbnB1dCBmcm9tIHRoZSB0YWIgd2UgYXJlIGxlYXZpbmdcbiAgX3NhdmVEcmFmdElucHV0c0ZvclRhYihzdGF0ZU1hbmFnZXIuZ2V0Q3VycmVudFRhYigpKTtcblxuICAvLyBTeW5jIHNlY29uZC1iYXIgdmlzaWJpbGl0eSB0byB0aGlzIHRhYidzIHN0YWdlXG4gIGlmICh0eXBlb2YgZ2V0U3RhZ2VGb3JUYWIgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHVwZGF0ZVRhYkJhckZvclN0YWdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY29uc3QgdGFiU3RhZ2UgPSBnZXRTdGFnZUZvclRhYih0YWIpO1xuICAgIGlmICh0YWJTdGFnZSkge1xuICAgICAgdXBkYXRlVGFiQmFyRm9yU3RhZ2UodGFiU3RhZ2UpO1xuICAgICAgdXBkYXRlQWN0aW9uQnV0dG9ucyh0YWJTdGFnZSk7XG4gICAgfVxuICB9XG4gIC8vIEFsd2F5cyB1cGRhdGUgd29ya2Zsb3cgY2xpY2thYmxlIHN0YXRlIHVzaW5nIGN1cnJlbnQgcGhhc2VcbiAgaWYgKHR5cGVvZiBzdGF0ZU1hbmFnZXI/LmdldFBoYXNlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB1cGRhdGVXb3JrZmxvd1N0ZXBzQ2xpY2thYmxlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdXBkYXRlV29ya2Zsb3dTdGVwc0NsaWNrYWJsZShzdGF0ZU1hbmFnZXIuZ2V0UGhhc2UoKSk7XG4gIH1cblxuICAvLyBVcGRhdGUgYWN0aXZlIHRhYiwgQVJJQSBzdGF0ZSwgYW5kIHJvdmluZyB0YWJpbmRleCAoV0NBRyAyLjEgdGFibGlzdCBwYXR0ZXJuKVxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudGFiJykuZm9yRWFjaCh0ID0+IHtcbiAgICB0LmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgIHQuc2V0QXR0cmlidXRlKCdhcmlhLXNlbGVjdGVkJywgJ2ZhbHNlJyk7XG4gICAgdC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJy0xJyk7XG4gIH0pO1xuICBjb25zdCBhY3RpdmVUYWIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgdGFiLSR7dGFifWApO1xuICBpZiAoYWN0aXZlVGFiKSB7XG4gICAgYWN0aXZlVGFiLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgIGFjdGl2ZVRhYi5zZXRBdHRyaWJ1dGUoJ2FyaWEtc2VsZWN0ZWQnLCAndHJ1ZScpO1xuICAgIGFjdGl2ZVRhYi5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTtcbiAgICBjb25zdCB0YWJwYW5lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gICAgaWYgKHRhYnBhbmVsKSB0YWJwYW5lbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWxsZWRieScsIGB0YWItJHt0YWJ9YCk7XG4gIH1cbiAgc3RhdGVNYW5hZ2VyLnNldEN1cnJlbnRUYWIodGFiKTtcblxuICAvLyBNYXJrIHRoaXMgdGFiIGFzIHZpc2l0ZWQgYW5kIHJlZnJlc2ggdGhlIHZpc2l0ZWQgaW5kaWNhdG9ycyAoR0FQLTI2OSlcbiAgaWYgKF9DVVNUT01JU0VfVEFCUy5oYXModGFiKSkge1xuICAgIF92aXNpdGVkQ3VzdG9taXNlVGFicy5hZGQodGFiKTtcbiAgICBfdXBkYXRlVmlzaXRlZFRhYkluZGljYXRvcnMoKTtcbiAgfVxuXG4gIC8vIEFubm91bmNlIHRoZSB0YWIgY2hhbmdlIHRvIHNjcmVlbiByZWFkZXJzIChHQVAtNzMpXG4gIGNvbnN0IGFubm91bmNlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd3b3JrZmxvdy1zdGFnZS1hbm5vdW5jZXInKTtcbiAgaWYgKGFubm91bmNlciAmJiBhY3RpdmVUYWIpIHtcbiAgICBhbm5vdW5jZXIudGV4dENvbnRlbnQgPSAnJztcbiAgICBzZXRUaW1lb3V0KCgpID0+IHsgYW5ub3VuY2VyLnRleHRDb250ZW50ID0gYE5vdyB2aWV3aW5nOiAke2FjdGl2ZVRhYi50ZXh0Q29udGVudC50cmltKCl9YDsgfSwgNTApO1xuICB9XG5cbiAgLy8gU3luYyB2aWV3LWN1cnNvciByaW5nIHRvIHRoZSBuZXdseSB2aXNpYmxlIHRhYlxuICBpZiAodHlwZW9mIF91cGRhdGVWaWV3aW5nSW5kaWNhdG9yID09PSAnZnVuY3Rpb24nKSBfdXBkYXRlVmlld2luZ0luZGljYXRvcih0YWIpO1xuXG4gIC8vIEFsbCB0YWJzIGV4Y2VwdCAnY3YnIHVzZSBmdWxsLXdpZHRoIGxheW91dCAobm8gcGFwZXItc2l6ZWQgY2VudGVyaW5nKVxuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgY29udGVudC5jbGFzc0xpc3QudG9nZ2xlKCdmdWxsLXdpZHRoJywgdGFiICE9PSAnZ2VuZXJhdGUnKTtcblxuICAvLyBMb2FkIGNvbnRlbnQgZm9yIHRhYlxuICBsb2FkVGFiQ29udGVudCh0YWIpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBsb2FkVGFiQ29udGVudCh0YWIpIHtcbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIGNvbnN0IHRhYkRhdGEgPSBlbnN1cmVUYWJEYXRhU3RhdGUoKTtcblxuICB0cnkge1xuICBzd2l0Y2ggKHRhYikge1xuICAgIGNhc2UgJ2pvYic6XG4gICAgICBhd2FpdCBwb3B1bGF0ZUpvYlRhYigpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZ29hbHMnOlxuICAgICAgaWYgKHR5cGVvZiBwb3B1bGF0ZUdvYWxzVGFiID09PSAnZnVuY3Rpb24nKSBhd2FpdCBwb3B1bGF0ZUdvYWxzVGFiKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdhbmFseXNpcyc6XG4gICAgICBpZiAodGFiRGF0YS5hbmFseXNpcykge1xuICAgICAgICBwb3B1bGF0ZUFuYWx5c2lzVGFiKHRhYkRhdGEuYW5hbHlzaXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImVtcHR5LXN0YXRlXCI+PGRpdiBjbGFzcz1cImljb25cIj5cdUQ4M0RcdUREMEQ8L2Rpdj48aDM+Sm9iIEFuYWx5c2lzPC9oMz48cD5DbGljayBcIkFuYWx5emUgSm9iXCIgdG8gZ2VuZXJhdGUgYW5hbHlzaXM8L3A+PC9kaXY+JztcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3F1ZXN0aW9ucyc6XG4gICAgICBwb3B1bGF0ZVF1ZXN0aW9uc1RhYigpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnY3VzdG9taXphdGlvbnMnOlxuICAgICAgc3dpdGNoVGFiKCdleHAtcmV2aWV3Jyk7XG4gICAgICByZXR1cm47XG4gICAgY2FzZSAnZXhwLXJldmlldyc6XG4gICAgICBhd2FpdCBwb3B1bGF0ZVJldmlld1RhYignZXhwZXJpZW5jZXMnKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2FjaC1lZGl0b3InOlxuICAgICAgYXdhaXQgYnVpbGRBY2hpZXZlbWVudHNFZGl0b3IoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3NraWxscy1yZXZpZXcnOlxuICAgICAgYXdhaXQgcG9wdWxhdGVSZXZpZXdUYWIoJ3NraWxscycpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYWNoaWV2ZW1lbnRzLXJldmlldyc6XG4gICAgICBhd2FpdCBwb3B1bGF0ZVJldmlld1RhYignYWNoaWV2ZW1lbnRzJyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd0YWdsaW5lLXJldmlldyc6XG4gICAgICBhd2FpdCBwb3B1bGF0ZVRhZ2xpbmVSZXZpZXdUYWIoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3N1bW1hcnktcmV2aWV3JzpcbiAgICAgIGF3YWl0IHBvcHVsYXRlUmV2aWV3VGFiKCdzdW1tYXJ5Jyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdwdWJsaWNhdGlvbnMtcmV2aWV3JzpcbiAgICAgIGF3YWl0IHBvcHVsYXRlUmV2aWV3VGFiKCdwdWJsaWNhdGlvbnMnKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2F0cy1zY29yZSc6XG4gICAgICBpZiAodHlwZW9mIHBvcHVsYXRlQXRzU2NvcmVUYWIgPT09ICdmdW5jdGlvbicpIGF3YWl0IHBvcHVsYXRlQXRzU2NvcmVUYWIoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3Jld3JpdGUnOlxuICAgICAgaWYgKHdpbmRvdy5fcmV3cml0ZVBhbmVsQ2FjaGUpIHtcbiAgICAgICAgcmVuZGVyUmV3cml0ZVBhbmVsKFxuICAgICAgICAgIHdpbmRvdy5fcmV3cml0ZVBhbmVsQ2FjaGUucmV3cml0ZXMsXG4gICAgICAgICAgd2luZG93Ll9yZXdyaXRlUGFuZWxDYWNoZS53YXJuaW5ncyxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJlbXB0eS1zdGF0ZVwiPjxkaXYgY2xhc3M9XCJpY29uXCI+XHUyNzBGXHVGRTBGPC9kaXY+PGgzPlJld3JpdGVzPC9oMz48cD5Mb2FkaW5nIHJld3JpdGVzXHUyMDI2PC9wPjwvZGl2Pic7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGFwaUNhbGwoJ0dFVCcsICcvYXBpL3Jld3JpdGVzJyk7XG4gICAgICAgICAgaWYgKGRhdGEucmV3cml0ZXMpIHtcbiAgICAgICAgICAgIHJlbmRlclJld3JpdGVQYW5lbChkYXRhLnJld3JpdGVzLCBkYXRhLnBlcnN1YXNpb25fd2FybmluZ3MgfHwgW10pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb250ZW50LmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwiZW1wdHktc3RhdGVcIj48ZGl2IGNsYXNzPVwiaWNvblwiPlx1MjcwRlx1RkUwRjwvZGl2PjxoMz5SZXdyaXRlczwvaDM+PHA+Q29tcGxldGUgY3VzdG9taXphdGlvbnMgdG8gcmVhY2ggdGhpcyBzdGVwPC9wPjwvZGl2Pic7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImVtcHR5LXN0YXRlXCI+PGRpdiBjbGFzcz1cImljb25cIj5cdTI3MEZcdUZFMEY8L2Rpdj48aDM+UmV3cml0ZXM8L2gzPjxwPkNvbXBsZXRlIGN1c3RvbWl6YXRpb25zIHRvIHJlYWNoIHRoaXMgc3RlcDwvcD48L2Rpdj4nO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdlZGl0b3InOlxuICAgICAgYXdhaXQgcG9wdWxhdGVDVkVkaXRvclRhYigpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZ2VuZXJhdGUnOlxuICAgICAgX3BvcHVsYXRlR2VuZXJhdGVUYWIodGFiRGF0YS5jdiwgY29udGVudCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdkb3dubG9hZCc6XG4gICAgICBpZiAodGFiRGF0YS5jdiAmJiBPYmplY3Qua2V5cyh0YWJEYXRhLmN2KS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGF3YWl0IHBvcHVsYXRlRG93bmxvYWRUYWIodGFiRGF0YS5jdik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250ZW50LmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwiZW1wdHktc3RhdGVcIj48ZGl2IGNsYXNzPVwiaWNvblwiPlx1MkIwN1x1RkUwRjwvZGl2PjxoMz5Eb3dubG9hZDwvaDM+PHA+R2VuZXJhdGUgQ1YgdG8gZW5hYmxlIGRvd25sb2FkczwvcD48L2Rpdj4nO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc3BlbGwnOlxuICAgICAgYXdhaXQgcG9wdWxhdGVTcGVsbENoZWNrVGFiKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdsYXlvdXQnOlxuICAgICAgaW5pdGlhdGVMYXlvdXRJbnN0cnVjdGlvbnMoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2ZpbmFsaXNlJzpcbiAgICAgIGF3YWl0IHBvcHVsYXRlRmluYWxpc2VUYWIoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2hhcnZlc3QnOlxuICAgICAgaWYgKHR5cGVvZiBwb3B1bGF0ZUhhcnZlc3RUYWIgPT09ICdmdW5jdGlvbicpIGF3YWl0IHBvcHVsYXRlSGFydmVzdFRhYigpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnaW50ZXJ2aWV3LXByZXAnOlxuICAgICAgaWYgKHR5cGVvZiBwb3B1bGF0ZUludGVydmlld1ByZXBUYWIgPT09ICdmdW5jdGlvbicpIGF3YWl0IHBvcHVsYXRlSW50ZXJ2aWV3UHJlcFRhYigpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndGhhbmsteW91JzpcbiAgICAgIGlmICh0eXBlb2YgcG9wdWxhdGVUaGFua1lvdVRhYiA9PT0gJ2Z1bmN0aW9uJykgYXdhaXQgcG9wdWxhdGVUaGFua1lvdVRhYigpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnbWFzdGVyJzpcbiAgICAgIGF3YWl0IHBvcHVsYXRlTWFzdGVyVGFiKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdjb3Zlci1sZXR0ZXInOlxuICAgICAgYXdhaXQgcG9wdWxhdGVDb3ZlckxldHRlclRhYigpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc2NyZWVuaW5nJzpcbiAgICAgIGF3YWl0IHBvcHVsYXRlU2NyZWVuaW5nVGFiKCk7XG4gICAgICBicmVhaztcbiAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy5lcnJvcihgRXJyb3IgbG9hZGluZyB0YWIgJHt0YWJ9OmAsIGVycm9yKTtcbiAgICAvLyB0ZXh0Q29udGVudCwgbm90IGlubmVySFRNTCBcdTIwMTQgYSB0aHJvd24gZXJyb3IgbWVzc2FnZSBtdXN0IG5ldmVyIGJlXG4gICAgLy8gaW50ZXJwcmV0ZWQgYXMgSFRNTCAoZS5nLiBhbiBlcnJvciBzdHJpbmcgY29udGFpbmluZyBhIHN0cmF5IDxpbWc+KS5cbiAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7XG4gICAgZXJyb3JNZXNzYWdlLnN0eWxlLmNzc1RleHQgPSAncGFkZGluZzogMjBweDsgY29sb3I6ICNjNDFlM2E7JztcbiAgICBlcnJvck1lc3NhZ2UudGV4dENvbnRlbnQgPSBgRXJyb3IgbG9hZGluZyBjb250ZW50OiAke2Vycm9yLm1lc3NhZ2V9YDtcbiAgICBjb250ZW50LmFwcGVuZENoaWxkKGVycm9yTWVzc2FnZSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gUmVzdG9yZSB1bnNhdmVkIHVzZXIgaW5wdXQgZm9yIHRoZSBuZXdseSBsb2FkZWQgdGFiXG4gIF9yZXN0b3JlRHJhZnRJbnB1dHNGb3JUYWIodGFiKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFJldmlldyB0YWIgKGZsYXQsIG9uZSBwYW5lIHBlciB0b3AtbGV2ZWwgdGFiKSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gc2hvd1RhYmxlQmFzZWRSZXZpZXcoKSB7XG4gIGlmICghd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnMpIHtcbiAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCAnTm8gcmVjb21tZW5kYXRpb25zIHRvIHJldmlldy4gUGxlYXNlIGdlbmVyYXRlIGN1c3RvbWl6YXRpb25zIGZpcnN0LicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHN3aXRjaFRhYignZXhwLXJldmlldycpO1xuICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCAnXHUyNzA1IEN1c3RvbWl6YXRpb25zIGdlbmVyYXRlZCEgUGxlYXNlIHJldmlldyBlYWNoIHNlY3Rpb24gaW4gdGhlICoqQ3VzdG9taXphdGlvbnMqKiB0YWIgXHUyMDE0IEV4cGVyaWVuY2VzLCBBY2hpZXZlbWVudHMsIFNraWxscywgU3VtbWFyeSwgYW5kIFB1YmxpY2F0aW9ucy4gU2VsZWN0IHlvdXIgcHJlZmVyZW5jZXMgdXNpbmcgdGhlIGFjdGlvbiBidXR0b25zLCB0aGVuIHN1Ym1pdCB5b3VyIGRlY2lzaW9ucy4nKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEFuYWx5c2lzIHRhYiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLy8gQ2FjaGVkIHN5bm9ueW0gbWFwOiBhbGlhcyAobG93ZXIpIFx1MjE5MiBjYW5vbmljYWwsIGFuZCBjYW5vbmljYWwgKGxvd2VyKSBcdTIxOTIgW2FsaWFzZXNdXG5sZXQgX3N5bm9ueW1NYXBDYWNoZSA9IG51bGw7XG5hc3luYyBmdW5jdGlvbiBfbG9hZFN5bm9ueW1NYXAoKSB7XG4gIGlmIChfc3lub255bU1hcENhY2hlKSByZXR1cm4gX3N5bm9ueW1NYXBDYWNoZTtcbiAgdHJ5IHtcbiAgICBjb25zdCBzZXNzaW9uSWQgPSBzdGF0ZU1hbmFnZXIuZ2V0U2Vzc2lvbklkICYmIHN0YXRlTWFuYWdlci5nZXRTZXNzaW9uSWQoKTtcbiAgICBjb25zdCB1cmwgPSBzZXNzaW9uSWQgPyBgL2FwaS9zeW5vbnltLW1hcD9zZXNzaW9uX2lkPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHNlc3Npb25JZCl9YCA6ICcvYXBpL3N5bm9ueW0tbWFwJztcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICBpZiAoIXJlcy5vaykgcmV0dXJuIChfc3lub255bU1hcENhY2hlID0ge30pO1xuICAgIGNvbnN0IHJhdyAgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGNvbnN0IGFsaWFzVG9DYW5vbiA9IHt9O1xuICAgIGNvbnN0IGNhbm9uVG9BbGlhc2VzID0ge307XG4gICAgT2JqZWN0LmVudHJpZXMocmF3KS5mb3JFYWNoKChbYWxpYXMsIGNhbm9uXSkgPT4ge1xuICAgICAgYWxpYXNUb0Nhbm9uW2FsaWFzLnRvTG93ZXJDYXNlKCldID0gY2Fub247XG4gICAgICBjb25zdCBjbCA9IGNhbm9uLnRvTG93ZXJDYXNlKCk7XG4gICAgICAoY2Fub25Ub0FsaWFzZXNbY2xdID0gY2Fub25Ub0FsaWFzZXNbY2xdIHx8IFtdKS5wdXNoKGFsaWFzKTtcbiAgICB9KTtcbiAgICBfc3lub255bU1hcENhY2hlID0geyBhbGlhc1RvQ2Fub24sIGNhbm9uVG9BbGlhc2VzIH07XG4gIH0gY2F0Y2ggKF8pIHsgX3N5bm9ueW1NYXBDYWNoZSA9IHt9OyB9XG4gIHJldHVybiBfc3lub255bU1hcENhY2hlO1xufVxuXG5mdW5jdGlvbiBfa3dTeW5vbnltQW5ub3RhdGlvbihrdywgc3luTWFwKSB7XG4gIGlmICghc3luTWFwIHx8ICghc3luTWFwLmFsaWFzVG9DYW5vbiAmJiAhc3luTWFwLmNhbm9uVG9BbGlhc2VzKSkgcmV0dXJuICcnO1xuICBjb25zdCBrbCA9IGt3LnRvTG93ZXJDYXNlKCk7XG4gIC8vIElzIGt3IGFuIGFsaWFzPyBTaG93IGNhbm9uaWNhbCBmb3JtLlxuICBpZiAoc3luTWFwLmFsaWFzVG9DYW5vbltrbF0pIHJldHVybiBgID0gJHtzeW5NYXAuYWxpYXNUb0Nhbm9uW2tsXX1gO1xuICAvLyBJcyBrdyBhIGNhbm9uaWNhbCBmb3JtPyBTaG93IGFsaWFzZXMuXG4gIGNvbnN0IGFsaWFzZXMgPSBzeW5NYXAuY2Fub25Ub0FsaWFzZXMgJiYgc3luTWFwLmNhbm9uVG9BbGlhc2VzW2tsXTtcbiAgaWYgKGFsaWFzZXMgJiYgYWxpYXNlcy5sZW5ndGgpIHJldHVybiBgICgke2FsaWFzZXMuam9pbignLCAnKX0pYDtcbiAgcmV0dXJuICcnO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwb3B1bGF0ZUFuYWx5c2lzVGFiKHJlc3VsdCkge1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgdHJ5IHtcbiAgICAvLyByZXN1bHQgbWF5IGFscmVhZHkgYmUgYSBwYXJzZWQgb2JqZWN0IChlLmcuIGNvbWluZyBmcm9tIHN0YXRlTWFuYWdlcikgb3IgYVxuICAgIC8vIHJhdyBKU09OIHN0cmluZy4gIGNsZWFuSnNvblJlc3BvbnNlIG9ubHkgaGFuZGxlcyBzdHJpbmdzLCBzbyBza2lwIGl0IHdoZW5cbiAgICAvLyB0aGUgdmFsdWUgaXMgYWxyZWFkeSBhbiBvYmplY3QgdG8gYXZvaWQgXCJjbGVhbmVkLnJlcGxhY2UgaXMgbm90IGEgZnVuY3Rpb25cIi5cbiAgICBsZXQgZGF0YTtcbiAgICBpZiAocmVzdWx0ICE9PSBudWxsICYmIHR5cGVvZiByZXN1bHQgPT09ICdvYmplY3QnKSB7XG4gICAgICBkYXRhID0gcmVzdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjbGVhblJlc3VsdCA9IGNsZWFuSnNvblJlc3BvbnNlKHJlc3VsdCk7XG4gICAgICBkYXRhID0gdHlwZW9mIGNsZWFuUmVzdWx0ID09PSAnc3RyaW5nJyA/IEpTT04ucGFyc2UoY2xlYW5SZXN1bHQpIDogY2xlYW5SZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8gUGVyc2lzdCBvbmx5IGFmdGVyIHRoZSBhbmFseXNpcyBwYXlsb2FkIGhhcyBiZWVuIHZhbGlkYXRlZC5cbiAgICBzdGF0ZU1hbmFnZXIuc2V0VGFiRGF0YSgnYW5hbHlzaXMnLCByZXN1bHQpO1xuICAgIHNhdmVUYWJEYXRhKCk7XG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgU2VjdGlvbiAxOiBSb2xlICYgRG9tYWluIGNhcmQgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgbGV0IGh0bWwgPSAnPGRpdiBjbGFzcz1cImFuYWx5c2lzLXBhZ2VcIj4nO1xuICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJhbmFseXNpcy1yb2xlLWNhcmRcIj4nO1xuICAgIGh0bWwgKz0gYDxoMT4ke2RhdGEudGl0bGUgfHwgJ1JvbGUnfTwvaDE+YDtcbiAgICBpZiAoZGF0YS5jb21wYW55KSBodG1sICs9IGA8cCBjbGFzcz1cImNvbXBhbnlcIj5cdUQ4M0NcdURGRTIgJHtkYXRhLmNvbXBhbnl9PC9wPmA7XG4gICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cIm1ldGFcIj4nO1xuICAgIGlmIChkYXRhLmRvbWFpbikge1xuICAgICAgY29uc3QgY29uZiA9IGRhdGEuZG9tYWluX2NvbmZpZGVuY2U7XG4gICAgICBsZXQgY29uZkxhYmVsID0gJyc7XG4gICAgICBsZXQgY29uZlRpdGxlID0gJyc7XG4gICAgICBpZiAodHlwZW9mIGNvbmYgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGlmIChjb25mID49IDAuOCkgeyBjb25mTGFiZWwgPSAnJzsgY29uZlRpdGxlID0gYERvbWFpbiBjb25maWRlbmNlOiBIaWdoICgke01hdGgucm91bmQoY29uZiAqIDEwMCl9JSlgOyB9XG4gICAgICAgIGVsc2UgaWYgKGNvbmYgPj0gMC42KSB7IGNvbmZMYWJlbCA9ICcgXHUyNkEwJzsgY29uZlRpdGxlID0gYERvbWFpbiBjb25maWRlbmNlOiBNZWRpdW0gKCR7TWF0aC5yb3VuZChjb25mICogMTAwKX0lKSBcdTIwMTQgdmVyaWZ5IHRoaXMgaXMgY29ycmVjdGA7IH1cbiAgICAgICAgZWxzZSB7IGNvbmZMYWJlbCA9ICcgXHUyNkEwJzsgY29uZlRpdGxlID0gYERvbWFpbiBjb25maWRlbmNlOiBMb3cgKCR7TWF0aC5yb3VuZChjb25mICogMTAwKX0lKSBcdTIwMTQgdGhlIEpEIHNwYW5zIG11bHRpcGxlIGRvbWFpbnM7IGNvbnNpZGVyIG92ZXJyaWRpbmdgOyB9XG4gICAgICB9XG4gICAgICBodG1sICs9IGA8c3BhbiBjbGFzcz1cIm1ldGEtY2hpcFwiIHRpdGxlPVwiJHtlc2NhcGVIdG1sKGNvbmZUaXRsZSB8fCAnSW5mZXJyZWQgdGVjaG5pY2FsIGRvbWFpbicpfVwiPlx1RDgzRFx1REQyQyAke2VzY2FwZUh0bWwoZGF0YS5kb21haW4pfSR7Y29uZkxhYmVsfTwvc3Bhbj5gO1xuICAgIH1cbiAgICBpZiAoZGF0YS5yb2xlX2xldmVsKSBodG1sICs9IGA8c3BhbiBjbGFzcz1cIm1ldGEtY2hpcFwiPlx1RDgzRFx1RENDQSAke2RhdGEucm9sZV9sZXZlbH08L3NwYW4+YDtcbiAgICBpZiAoZGF0YS5zdWdnZXN0ZWRfc3VtbWFyeSkgaHRtbCArPSBgPHNwYW4gY2xhc3M9XCJtZXRhLWNoaXBcIj5cdUQ4M0RcdURDQUMgJHtkYXRhLnN1Z2dlc3RlZF9zdW1tYXJ5fTwvc3Bhbj5gO1xuICAgIGh0bWwgKz0gJzwvZGl2PjwvZGl2Pic7XG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgTWlzbWF0Y2ggY2FsbG91dCAoY29tcHV0ZWQgZnJvbSBtYXN0ZXIgc2tpbGxzKSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICBjb25zdCByZXF1aXJlZFNraWxscyA9IEFycmF5LmlzQXJyYXkoZGF0YS5yZXF1aXJlZF9za2lsbHMpID8gZGF0YS5yZXF1aXJlZF9za2lsbHMgOiBbXTtcbiAgICBjb25zdCBtYXN0ZXJTa2lsbHMgPSB3aW5kb3cuX21hc3RlclNraWxscyB8fCBbXTtcbiAgICBpZiAocmVxdWlyZWRTa2lsbHMubGVuZ3RoID4gMCAmJiBtYXN0ZXJTa2lsbHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbWlzc2luZyA9IHJlcXVpcmVkU2tpbGxzLmZpbHRlcihza2lsbCA9PlxuICAgICAgICAhbWFzdGVyU2tpbGxzLnNvbWUobXMgPT4gbXMuaW5jbHVkZXMoc2tpbGwudG9Mb3dlckNhc2UoKSkgfHwgc2tpbGwudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhtcykpXG4gICAgICApO1xuICAgICAgaWYgKG1pc3NpbmcubGVuZ3RoID4gMCkge1xuICAgICAgICBodG1sICs9IGA8ZGl2IGNsYXNzPVwibWlzbWF0Y2gtY2FsbG91dFwiPlx1MjZBMCA8c3Ryb25nPiR7bWlzc2luZy5sZW5ndGh9IHJlcXVpcmVkIHNraWxsJHttaXNzaW5nLmxlbmd0aCA+IDEgPyAncycgOiAnJ30gbm90IGZvdW5kIGluIHlvdXIgbWFzdGVyIENWOjwvc3Ryb25nPiAke21pc3Npbmcuam9pbignLCAnKX08L2Rpdj5gO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFx1MjUwMFx1MjUwMCBTZWN0aW9uIDI6IFJlcXVpcmVkIFNraWxscyBncmlkIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIGlmIChyZXF1aXJlZFNraWxscy5sZW5ndGggPiAwKSB7XG4gICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwiYW5hbHlzaXMtc2VjdGlvblwiPjxoMj5cdUQ4M0NcdURGQUYgUmVxdWlyZWQgU2tpbGxzPC9oMj48ZGl2IGNsYXNzPVwic2tpbGwtZ3JpZFwiPic7XG4gICAgICByZXF1aXJlZFNraWxscy5mb3JFYWNoKHNraWxsID0+IHtcbiAgICAgICAgY29uc3QgaXNNaXNzaW5nID0gbWFzdGVyU2tpbGxzLmxlbmd0aCA+IDAgJiYgIW1hc3RlclNraWxscy5zb21lKFxuICAgICAgICAgIG1zID0+IG1zLmluY2x1ZGVzKHNraWxsLnRvTG93ZXJDYXNlKCkpIHx8IHNraWxsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobXMpXG4gICAgICAgICk7XG4gICAgICAgIGh0bWwgKz0gYDxzcGFuIGNsYXNzPVwic2tpbGwtYmFkZ2Uke2lzTWlzc2luZyA/ICcgbWlzc2luZycgOiAnJ31cIiB0aXRsZT1cIiR7aXNNaXNzaW5nID8gJ05vdCBpbiBtYXN0ZXIgQ1YnIDogJ0ZvdW5kIGluIG1hc3RlciBDVid9XCI+JHtza2lsbH0ke2lzTWlzc2luZyA/ICc8c3BhbiBjbGFzcz1cInNyLW9ubHlcIj4gKG5vdCBpbiBtYXN0ZXIgQ1YpPC9zcGFuPicgOiAnJ308L3NwYW4+YDtcbiAgICAgIH0pO1xuICAgICAgaHRtbCArPSAnPC9kaXY+PC9kaXY+JztcbiAgICB9XG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgU2VjdGlvbiAzOiBQcmVmZXJyZWQgLyBOaWNlLXRvLUhhdmUgbGlzdCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICBjb25zdCBwcmVmZXJyZWQgPSBbXG4gICAgICAuLi4oQXJyYXkuaXNBcnJheShkYXRhLnByZWZlcnJlZF9za2lsbHMpID8gZGF0YS5wcmVmZXJyZWRfc2tpbGxzIDogW10pLFxuICAgICAgLi4uKEFycmF5LmlzQXJyYXkoZGF0YS5uaWNlX3RvX2hhdmVfcmVxdWlyZW1lbnRzKSA/IGRhdGEubmljZV90b19oYXZlX3JlcXVpcmVtZW50cyA6IFtdKSxcbiAgICBdO1xuICAgIGlmIChwcmVmZXJyZWQubGVuZ3RoID4gMCkge1xuICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cImFuYWx5c2lzLXNlY3Rpb25cIj48aDI+XHUyQjUwIFByZWZlcnJlZCAvIE5pY2UtdG8tSGF2ZTwvaDI+PHVsIGNsYXNzPVwicHJlZmVycmVkLWxpc3RcIj4nO1xuICAgICAgcHJlZmVycmVkLmZvckVhY2goaXRlbSA9PiB7IGh0bWwgKz0gYDxsaT4ke2l0ZW19PC9saT5gOyB9KTtcbiAgICAgIGh0bWwgKz0gJzwvdWw+PC9kaXY+JztcbiAgICB9XG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgU2VjdGlvbiA0OiBBVFMgS2V5d29yZHMgd2l0aCByYW5rIGJhZGdlcyBhbmQgc3lub255bSBhbm5vdGF0aW9ucyBcdTI1MDBcdTI1MDBcbiAgICBjb25zdCBhdHNLd3MgPSBBcnJheS5pc0FycmF5KGRhdGEuYXRzX2tleXdvcmRzKSA/IGRhdGEuYXRzX2tleXdvcmRzIDogW107XG4gICAgaWYgKGF0c0t3cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBzeW5NYXAgPSBhd2FpdCBfbG9hZFN5bm9ueW1NYXAoKTtcbiAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJhbmFseXNpcy1zZWN0aW9uXCI+PGgyPlx1RDgzRFx1REQxMSBBVFMgS2V5d29yZHMgPHNtYWxsIHN0eWxlPVwiZm9udC13ZWlnaHQ6NDAwO2NvbG9yOiM2NDc0OGI7Zm9udC1zaXplOjEycHg7XCI+KGhpZ2hlciByYW5rID0gaGlnaGVyIHByaW9yaXR5KTwvc21hbGw+PC9oMj48ZGl2IGNsYXNzPVwia3ctYmFkZ2VzXCI+JztcbiAgICAgIGF0c0t3cy5mb3JFYWNoKChrdywgaWR4KSA9PiB7XG4gICAgICAgIGNvbnN0IGFubm90YXRpb24gPSBfa3dTeW5vbnltQW5ub3RhdGlvbihrdywgc3luTWFwKTtcbiAgICAgICAgY29uc3QgdGl0bGVBdHRyICA9IGFubm90YXRpb24gPyBgIHRpdGxlPVwiU3lub255bTogJHtlc2NhcGVIdG1sKGt3ICsgYW5ub3RhdGlvbil9XCJgIDogJyc7XG4gICAgICAgIGNvbnN0IGFubm90SHRtbCAgPSBhbm5vdGF0aW9uID8gYDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjEwcHg7Y29sb3I6IzY0NzQ4YjttYXJnaW4tbGVmdDozcHg7XCI+JHtlc2NhcGVIdG1sKGFubm90YXRpb24pfTwvc3Bhbj5gIDogJyc7XG4gICAgICAgIGh0bWwgKz0gYDxzcGFuIGNsYXNzPVwia3ctYmFkZ2VcIiR7dGl0bGVBdHRyfT48c3BhbiBjbGFzcz1cImt3LXJhbmtcIj4jJHtpZHggKyAxfTwvc3Bhbj4ke2VzY2FwZUh0bWwoa3cpfSR7YW5ub3RIdG1sfTwvc3Bhbj5gO1xuICAgICAgfSk7XG4gICAgICBodG1sICs9ICc8L2Rpdj48L2Rpdj4nO1xuICAgIH1cblxuICAgIC8vIFx1MjUwMFx1MjUwMCBDdWx0dXJlIGluZGljYXRvcnMgKG9wdGlvbmFsKSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICBjb25zdCBjdWx0dXJlID0gQXJyYXkuaXNBcnJheShkYXRhLmN1bHR1cmVfaW5kaWNhdG9ycykgPyBkYXRhLmN1bHR1cmVfaW5kaWNhdG9ycyA6IFtdO1xuICAgIGlmIChjdWx0dXJlLmxlbmd0aCA+IDApIHtcbiAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJhbmFseXNpcy1zZWN0aW9uXCI+PGgyPlx1RDgzQ1x1REZFMiBDdWx0dXJlIEluZGljYXRvcnM8L2gyPjx1bCBjbGFzcz1cInByZWZlcnJlZC1saXN0XCI+JztcbiAgICAgIGN1bHR1cmUuZm9yRWFjaChjID0+IHsgaHRtbCArPSBgPGxpPiR7Y308L2xpPmA7IH0pO1xuICAgICAgaHRtbCArPSAnPC91bD48L2Rpdj4nO1xuICAgIH1cblxuICAgIC8vIFx1MjUwMFx1MjUwMCBNdXN0LWhhdmUgcmVxdWlyZW1lbnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIGNvbnN0IG11c3RIYXZlID0gQXJyYXkuaXNBcnJheShkYXRhLm11c3RfaGF2ZV9yZXF1aXJlbWVudHMpID8gZGF0YS5tdXN0X2hhdmVfcmVxdWlyZW1lbnRzIDogW107XG4gICAgaWYgKG11c3RIYXZlLmxlbmd0aCA+IDApIHtcbiAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJhbmFseXNpcy1zZWN0aW9uXCI+PGgyPlx1MjcwNSBNdXN0LUhhdmUgUmVxdWlyZW1lbnRzPC9oMj48dWwgY2xhc3M9XCJwcmVmZXJyZWQtbGlzdFwiPic7XG4gICAgICBtdXN0SGF2ZS5mb3JFYWNoKHIgPT4geyBodG1sICs9IGA8bGk+JHtyfTwvbGk+YDsgfSk7XG4gICAgICBodG1sICs9ICc8L3VsPjwvZGl2Pic7XG4gICAgfVxuXG4gICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cIm5hdi1idXR0b25zIG5hdi1lbmRcIj48YnV0dG9uIGNsYXNzPVwiY29udGludWUtYnRuXCIgb25jbGljaz1cInNlbmRBY3Rpb24oXFx1MDAyN3JlY29tbWVuZF9jdXN0b21pemF0aW9uc1xcdTAwMjcpXCI+Q29udGludWUgdG8gQ3VzdG9taXphdGlvbnMgXHUyMTkyPC9idXR0b24+PC9kaXY+JztcbiAgICBodG1sICs9ICc8L2Rpdj4nOyAvLyAuYW5hbHlzaXMtcGFnZVxuICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gaHRtbDtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZy5lcnJvcignQW5hbHlzaXMgcGFyc2luZyBlcnJvcjonLCBlLCAnT3JpZ2luYWwgcmVzdWx0OicsIHJlc3VsdCk7XG4gICAgY29udGVudC5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz1cImVtcHR5LXN0YXRlXCI+PGRpdiBjbGFzcz1cImljb25cIj5cdTI3NEM8L2Rpdj48aDM+QW5hbHlzaXMgRXJyb3I8L2gzPjxwPkNvdWxkIG5vdCBwYXJzZSBhbmFseXNpcyByZXN1bHRzOiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX08L3A+PGRldGFpbHM+PHN1bW1hcnk+RGVidWcgSW5mbzwvc3VtbWFyeT48cHJlPiR7ZXNjYXBlSHRtbChKU09OLnN0cmluZ2lmeShyZXN1bHQsIG51bGwsIDIpKX08L3ByZT48L2RldGFpbHM+PC9kaXY+YDtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgQ3VzdG9taXphdGlvbiByZXNwb25zZSBoYW5kbGVyIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVDdXN0b21pemF0aW9uUmVzcG9uc2UocmVzcG9uc2UpIHtcbiAgdHJ5IHtcbiAgICAvLyBBY2NlcHQgYSBwcmUtcGFyc2VkIG9iamVjdCBvciBhIHJhdyBzdHJpbmcgKHBhcnNlIGF0IGJvdW5kYXJ5KS5cbiAgICBjb25zdCBkYXRhID0gKHJlc3BvbnNlICE9PSBudWxsICYmIHR5cGVvZiByZXNwb25zZSA9PT0gJ29iamVjdCcpXG4gICAgICA/IHJlc3BvbnNlXG4gICAgICA6IGV4dHJhY3RGaXJzdEpzb25PYmplY3QocmVzcG9uc2UpO1xuICAgIGlmICghZGF0YSkge1xuICAgICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgdHlwZW9mIHJlc3BvbnNlID09PSAnc3RyaW5nJyA/IHJlc3BvbnNlIDogJycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChkYXRhICYmIChkYXRhLnJlY29tbWVuZGVkX2V4cGVyaWVuY2VzIHx8IGRhdGEucmVjb21tZW5kZWRfc2tpbGxzKSkge1xuICAgICAgc3RhdGVNYW5hZ2VyLnNldFRhYkRhdGEoJ2N1c3RvbWl6YXRpb25zJywgZGF0YSk7XG4gICAgICB3aW5kb3cucGVuZGluZ1JlY29tbWVuZGF0aW9ucyA9IGRhdGE7XG4gICAgICBzYXZlVGFiRGF0YSgpO1xuXG4gICAgICBpZiAoIWlzUmVjb25uZWN0SW5Qcm9ncmVzcygpKSB7XG4gICAgICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsICdcdTI3MDUgQ3VzdG9taXphdGlvbnMgZ2VuZXJhdGVkISBQbGVhc2UgcmV2aWV3IGVhY2ggc2VjdGlvbiBpbiB0aGUgKipDdXN0b21pemF0aW9ucyoqIHRhYiBcdTIwMTQgRXhwZXJpZW5jZXMsIEFjaGlldmVtZW50cywgU2tpbGxzLCBTdW1tYXJ5LCBhbmQgUHVibGljYXRpb25zLiBTZWxlY3QgeW91ciBwcmVmZXJlbmNlcyB1c2luZyB0aGUgYWN0aW9uIGJ1dHRvbnMsIHRoZW4gc3VibWl0IHlvdXIgZGVjaXNpb25zLicpO1xuICAgICAgICBzd2l0Y2hUYWIoJ2V4cC1yZXZpZXcnKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFpc1JlY29ubmVjdEluUHJvZ3Jlc3MoKSkge1xuICAgICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgcmVzcG9uc2UpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZy5lcnJvcignQ3VzdG9taXphdGlvbiByZXNwb25zZSBlcnJvcjonLCBlKTtcbiAgICBpZiAoIWlzUmVjb25uZWN0SW5Qcm9ncmVzcygpKSB7XG4gICAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCByZXNwb25zZSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogU3luYyB0aGUgc2tpbGxzLXRpdGxlIHNlbGVjdC9jdXN0b20taW5wdXQgY29udHJvbHMgdG8gYSBnaXZlbiB0aXRsZSB2YWx1ZSxcbiAqIGFuZCBhdHRhY2ggY2hhbmdlIGxpc3RlbmVycyBzbyB1cGRhdGVzIGFyZSBzYXZlZCB2aWEgdGhlIEFQSS5cbiAqIGR1Y2tmbG93OlxuICogICBpZDogZ2VuZXJhdGlvbl9zZXR0aW5ncy53ZWJfcmV2aWV3X3RhYmxlX2Jhc2UuTDMzMFxuICogICBraW5kOiB1aVxuICogICB0aW1lc3RhbXA6ICcyMDI2LTAzLTI3VDAxOjIzOjI4WidcbiAqICAgc3RhdHVzOiBsaXZlXG4gKiAgIGhhbmRsZXM6XG4gKiAgIC0gdWk6Z2VuZXJhdGlvbi1zZXR0aW5ncy5zeW5jLXNraWxscy10aXRsZVxuICogICBjYWxsczpcbiAqICAgLSBQT1NUIC9hcGkvZ2VuZXJhdGlvbi1zZXR0aW5nc1xuICogICByZWFkczpcbiAqICAgLSByZXNwb25zZTpHRVQgL2FwaS9zdGF0dXMuc2tpbGxzX3NlY3Rpb25fdGl0bGVcbiAqICAgd3JpdGVzOlxuICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL2dlbmVyYXRpb24tc2V0dGluZ3Muc2tpbGxzX3NlY3Rpb25fdGl0bGVcbiAqICAgbm90ZXM6IEtlZXBzIHRoZSBVSSBza2lsbHMtdGl0bGUgY29udHJvbHMgaW4gc3luYyB3aXRoIHN0YXR1cyBkYXRhIGFuZCBwZXJzaXN0cyB0aXRsZSBjaGFuZ2VzIGJhY2sgdG8gdGhlIHNlc3Npb24gc2V0dGluZ3Mgcm91dGUuXG4gKi9cbmZ1bmN0aW9uIF9zeW5jU2tpbGxzVGl0bGVDb250cm9scyhjdXJyZW50VGl0bGUpIHtcbiAgY29uc3Qga25vd25PcHRpb25zID0gWydTa2lsbHMnLCAnVGVjaG5pY2FsIFNraWxscycsICdLZXkgU2tpbGxzJywgJ0NvcmUgU2tpbGxzJ107XG4gIGNvbnN0IHNlbCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGxzLXRpdGxlLXNlbGVjdCcpO1xuICBjb25zdCBjdXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NraWxscy10aXRsZS1jdXN0b20nKTtcbiAgaWYgKCFzZWwpIHJldHVybjtcblxuICBjb25zdCBpc0tub3duID0ga25vd25PcHRpb25zLmluY2x1ZGVzKGN1cnJlbnRUaXRsZSk7XG4gIGlmIChpc0tub3duKSB7XG4gICAgc2VsLnZhbHVlID0gY3VycmVudFRpdGxlO1xuICAgIGlmIChjdXN0KSBjdXN0LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIH0gZWxzZSB7XG4gICAgc2VsLnZhbHVlID0gJ19fY3VzdG9tX18nO1xuICAgIGlmIChjdXN0KSB7XG4gICAgICBjdXN0LnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIGN1c3QudmFsdWUgPSBjdXJyZW50VGl0bGU7XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc2F2ZVRpdGxlID0gYXN5bmMgKHRpdGxlKSA9PiB7XG4gICAgdHJ5IHsgYXdhaXQgYXBpQ2FsbCgnUE9TVCcsICcvYXBpL2dlbmVyYXRpb24tc2V0dGluZ3MnLCB7IHNraWxsc19zZWN0aW9uX3RpdGxlOiB0aXRsZSB9KTsgfVxuICAgIGNhdGNoIChlKSB7IGxvZy53YXJuKCdGYWlsZWQgdG8gc2F2ZSBza2lsbHNfc2VjdGlvbl90aXRsZSBzZXR0aW5nOicsIGUpOyB9XG4gIH07XG5cbiAgc2VsLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHtcbiAgICBpZiAoc2VsLnZhbHVlID09PSAnX19jdXN0b21fXycpIHtcbiAgICAgIGlmIChjdXN0KSB7IGN1c3Quc3R5bGUuZGlzcGxheSA9ICcnOyBjdXN0LmZvY3VzKCk7IH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGN1c3QpIGN1c3Quc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIHNhdmVUaXRsZShzZWwudmFsdWUpO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKGN1c3QpIHtcbiAgICBjdXN0LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHYgPSBjdXN0LnZhbHVlLnRyaW0oKTtcbiAgICAgIGlmICh2KSBzYXZlVGl0bGUodik7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZW5kZXJzIG9uZSBvZiB0aGUgNSByZXZpZXcgcGFuZXMgYXMgYSB0b3AtbGV2ZWwgdGFiLlxuICogUmVwbGFjZXMgdGhlIG9sZCBzdWItdGFiIGFwcHJvYWNoIHdpdGggYSBmbGF0IHNpbmdsZS1sZXZlbCB0YWIgc3RydWN0dXJlLlxuICovXG5hc3luYyBmdW5jdGlvbiBwb3B1bGF0ZVJldmlld1RhYihwYW5lKSB7XG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9jdW1lbnQtY29udGVudCcpO1xuICBjb25zdCBjdXN0b21pemF0aW9ucyA9IHN0YXRlTWFuYWdlci5nZXRUYWJEYXRhKCdjdXN0b21pemF0aW9ucycpO1xuXG4gIGlmICghd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnMgfHwgIWN1c3RvbWl6YXRpb25zKSB7XG4gICAgY29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImVtcHR5LXN0YXRlXCI+PGRpdiBjbGFzcz1cImljb25cIj5cdTI2OTlcdUZFMEY8L2Rpdj48aDM+UmV2aWV3IEN1c3RvbWl6YXRpb25zPC9oMz48cD5DbGljayBcIlJlY29tbWVuZCBDdXN0b21pemF0aW9uc1wiIHRvIGdlbmVyYXRlIHJlY29tbWVuZGF0aW9ucy48L3A+PC9kaXY+JztcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwYW5lQ29uZmlnID0ge1xuICAgIGV4cGVyaWVuY2VzOiAgIHsgdGl0bGU6ICcnLCBkZXNjOiAnU29ydGVkIGJ5IGRhdGUgKG1vc3QgcmVjZW50IGZpcnN0KS4gQ2xpY2sgYWN0aW9uIGJ1dHRvbnMgdG8gb3ZlcnJpZGUgcmVjb21tZW5kYXRpb25zLicsICAgICAgICAgY29udGFpbmVyOiAnZXhwZXJpZW5jZS10YWJsZS1jb250YWluZXInICAgfSxcbiAgICBza2lsbHM6ICAgICAgICB7IHRpdGxlOiAnXHVEODNEXHVERUUwXHVGRTBGIFNraWxscycsICAgICAgICAgICBkZXNjOiAnU29ydGVkIGJ5IHJlbGV2YW5jZS4gU2VsZWN0IGhvdyB0byBmZWF0dXJlIGVhY2ggc2tpbGwuJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcjogJ3NraWxscy10YWJsZS1jb250YWluZXInICAgICAgIH0sXG4gICAgYWNoaWV2ZW1lbnRzOiAgeyB0aXRsZTogJ1x1RDgzQ1x1REZDNiBBY2hpZXZlbWVudHMnLCAgICAgIGRlc2M6ICdTZWxlY3QgaG93IHRvIGZlYXR1cmUgZWFjaCBrZXkgYWNoaWV2ZW1lbnQuIEFJIHJlY29tbWVuZGF0aW9ucyBhcmUgcHJlLXNlbGVjdGVkLicsICBjb250YWluZXI6ICdhY2hpZXZlbWVudHMtdGFibGUtY29udGFpbmVyJyAgfSxcbiAgICBzdW1tYXJ5OiAgICAgICB7IHRpdGxlOiAnXHVEODNEXHVEQ0REIFByb2Zlc3Npb25hbCBTdW1tYXJ5JywgZGVzYzogJ1NlbGVjdCB3aGljaCBwcm9mZXNzaW9uYWwgc3VtbWFyeSB0byB1c2UuIFRoZSBBSVxcJ3MgcmVjb21tZW5kYXRpb24gaXMgcHJlLXNlbGVjdGVkLicsIGNvbnRhaW5lcjogJ3N1bW1hcnktZm9jdXMtY29udGFpbmVyJyAgICB9LFxuICAgIHB1YmxpY2F0aW9uczogIHsgdGl0bGU6ICdcdUQ4M0RcdURDQzQgUHVibGljYXRpb25zJywgICAgICBkZXNjOiAnQWxsIHB1YmxpY2F0aW9ucyByYW5rZWQgYnkgcmVsZXZhbmNlLiBBY2NlcHQgb3IgcmVqZWN0IGVhY2ggZm9yIHlvdXIgQ1YuJywgICAgICAgICAgY29udGFpbmVyOiAncHVibGljYXRpb25zLXRhYmxlLWNvbnRhaW5lcicgfSxcbiAgfTtcbiAgY29uc3QgY2ZnID0gcGFuZUNvbmZpZ1twYW5lXSB8fCB7fTtcblxuICBjb25zdCBoZWFkZXJIdG1sID0gcGFuZSA9PT0gJ2V4cGVyaWVuY2VzJyA/IGBcbiAgICA8aDE+XHUyNjk5XHVGRTBGIFJldmlldyBDdXN0b21pemF0aW9uIFJlY29tbWVuZGF0aW9uczwvaDE+XG4gICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO21hcmdpbi1ib3R0b206MTZweDtcIj5SZXZpZXcgdGhlIEFJJ3MgcmVjb21tZW5kYXRpb25zLiBVc2UgdGhlIGFjdGlvbiBidXR0b25zIHRvIGFkanVzdCBlYWNoIGl0ZW0sIHRoZW4gc2F2ZSB5b3VyIGRlY2lzaW9ucyBiZWZvcmUgZ2VuZXJhdGluZyB0aGUgQ1YuPC9wPlxuICAgIDxkaXYgaWQ9XCJwYWdlLWVzdGltYXRlLXdpZGdldFwiIGNsYXNzPVwicGFnZS1lc3RpbWF0ZSBva1wiPlxuICAgICAgPHNwYW4gaWQ9XCJwZS1pY29uXCI+XHVEODNEXHVEQ0M0PC9zcGFuPlxuICAgICAgPHNwYW4gaWQ9XCJwZS1sYWJlbFwiPkVzdGltYXRlZCBsZW5ndGg6IGNhbGN1bGF0aW5nXHUyMDI2PC9zcGFuPlxuICAgICAgPGRpdiBjbGFzcz1cInBlLWJhclwiPjxkaXYgY2xhc3M9XCJwZS1maWxsXCIgaWQ9XCJwZS1maWxsXCIgc3R5bGU9XCJ3aWR0aDowJTtiYWNrZ3JvdW5kOiM4NmVmYWM7XCI+PC9kaXY+PC9kaXY+XG4gICAgPC9kaXY+XG4gIGAgOiAoY2ZnLnRpdGxlID8gYDxoMiBzdHlsZT1cIm1hcmdpbjowIDAgMTJweDtcIj4ke2NmZy50aXRsZX08L2gyPmAgOiAnJyk7XG5cbiAgY29uc3QgbmF2QmFjayA9IHtcbiAgICBza2lsbHM6ICAgICAgIGA8YnV0dG9uIGNsYXNzPVwiYmFjay1idG5cIiBvbmNsaWNrPVwic3dpdGNoVGFiKCdhY2gtZWRpdG9yJylcIj5cdTIxOTAgQmFjayB0byBFeHBlcmllbmNlIEJ1bGxldHM8L2J1dHRvbj5gLFxuICAgIGFjaGlldmVtZW50czogYDxidXR0b24gY2xhc3M9XCJiYWNrLWJ0blwiIG9uY2xpY2s9XCJzd2l0Y2hUYWIoJ3NraWxscy1yZXZpZXcnKVwiPlx1MjE5MCBCYWNrIHRvIFNraWxsczwvYnV0dG9uPmAsXG4gICAgcHVibGljYXRpb25zOiBgPGJ1dHRvbiBjbGFzcz1cImJhY2stYnRuXCIgb25jbGljaz1cInN3aXRjaFRhYignc3VtbWFyeS1yZXZpZXcnKVwiPlx1MjE5MCBCYWNrIHRvIFN1bW1hcnk8L2J1dHRvbj5gLFxuICB9O1xuICBjb25zdCBuYXZDb250aW51ZSA9IHtcbiAgICBleHBlcmllbmNlczogIGA8YnV0dG9uIGNsYXNzPVwiY29udGludWUtYnRuXCIgb25jbGljaz1cInN1Ym1pdEV4cGVyaWVuY2VEZWNpc2lvbnMoKVwiPkNvbnRpbnVlIHRvIEV4cGVyaWVuY2UgQnVsbGV0cyBcdTIxOTI8L2J1dHRvbj5gLFxuICAgIHNraWxsczogICAgICAgYDxidXR0b24gY2xhc3M9XCJjb250aW51ZS1idG5cIiBvbmNsaWNrPVwic3VibWl0U2tpbGxEZWNpc2lvbnMoKVwiPkNvbnRpbnVlIHRvIEFjaGlldmVtZW50cyBcdTIxOTI8L2J1dHRvbj5gLFxuICAgIGFjaGlldmVtZW50czogYDxidXR0b24gY2xhc3M9XCJjb250aW51ZS1idG5cIiBvbmNsaWNrPVwic3VibWl0QWNoaWV2ZW1lbnREZWNpc2lvbnMoKVwiPkNvbnRpbnVlIHRvIFRhZ2xpbmUgXHUyMTkyPC9idXR0b24+YCxcbiAgICBwdWJsaWNhdGlvbnM6IGA8YnV0dG9uIGNsYXNzPVwiY29udGludWUtYnRuXCIgb25jbGljaz1cInN1Ym1pdFB1YmxpY2F0aW9uRGVjaXNpb25zKClcIj5Db250aW51ZSB0byBSZXdyaXRlIFx1MjE5MjwvYnV0dG9uPmAsXG4gIH07XG4gIGNvbnN0IG5hdkh0bWwgPSBwYW5lID09PSAnc3VtbWFyeScgPyAnJyA6IGBcbiAgICA8ZGl2IGNsYXNzPVwibmF2LWJ1dHRvbnMke3BhbmUgPT09ICdleHBlcmllbmNlcycgPyAnIG5hdi1lbmQnIDogJyd9XCIgc3R5bGU9XCJtYXJnaW46MTZweCAwO1wiPlxuICAgICAgJHtuYXZCYWNrW3BhbmVdIHx8ICcnfVxuICAgICAgJHtuYXZDb250aW51ZVtwYW5lXSB8fCAnJ31cbiAgICA8L2Rpdj5gO1xuXG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgICR7aGVhZGVySHRtbH1cbiAgICAke2NmZy5kZXNjID8gYDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtmb250LXNpemU6MC45NWVtO21hcmdpbi1ib3R0b206MTZweDtcIj4ke2VzY2FwZUh0bWwoY2ZnLmRlc2MpfTwvcD5gIDogJyd9XG4gICAgPGRpdiBpZD1cIiR7Y2ZnLmNvbnRhaW5lcn1cIj48L2Rpdj5cbiAgICAke25hdkh0bWx9XG4gIGA7XG5cbiAgd2luZG93Ll9hY3RpdmVSZXZpZXdQYW5lID0gcGFuZTtcbiAgc3dpdGNoIChwYW5lKSB7XG4gICAgY2FzZSAnZXhwZXJpZW5jZXMnOlxuICAgICAgYXdhaXQgYnVpbGRFeHBlcmllbmNlUmV2aWV3VGFibGUoKTtcbiAgICAgIF91cGRhdGVQYWdlRXN0aW1hdGUoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3NraWxscyc6XG4gICAgICBhd2FpdCBidWlsZFNraWxsc1Jldmlld1RhYmxlKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdhY2hpZXZlbWVudHMnOlxuICAgICAgYXdhaXQgYnVpbGRBY2hpZXZlbWVudHNSZXZpZXdUYWJsZSgpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc3VtbWFyeSc6XG4gICAgICBhd2FpdCBidWlsZFN1bW1hcnlGb2N1c1NlY3Rpb24oKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3B1YmxpY2F0aW9ucyc6XG4gICAgICBhd2FpdCBidWlsZFB1YmxpY2F0aW9uc1Jldmlld1RhYmxlKCk7XG4gICAgICBicmVhaztcbiAgfVxufVxuXG4vLyBUcmFjayB3aGljaCBwYW5lIGlzIGN1cnJlbnRseSBhY3RpdmVcbndpbmRvdy5fYWN0aXZlUmV2aWV3UGFuZSA9ICdleHBlcmllbmNlcyc7XG5cbmFzeW5jIGZ1bmN0aW9uIHN3aXRjaFJldmlld1N1YnRhYihwYW5lKSB7XG4gIC8vIFVwZGF0ZSBidXR0b24gc3RhdGVzXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5yZXZpZXctc3VidGFiJykuZm9yRWFjaChidG4gPT4ge1xuICAgIGJ0bi5jbGFzc0xpc3QudG9nZ2xlKCdhY3RpdmUnLCBidG4uZGF0YXNldC5wYW5lID09PSBwYW5lKTtcbiAgfSk7XG5cbiAgLy8gSGlkZSBhbGwgcGFuZXMsIHNob3cgdGhlIHNlbGVjdGVkIG9uZVxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucmV2aWV3LXBhbmUnKS5mb3JFYWNoKHAgPT4gcC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnKTtcbiAgY29uc3QgdGFyZ2V0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHJldmlldy1wYW5lLSR7cGFuZX1gKTtcbiAgaWYgKHRhcmdldCkgdGFyZ2V0LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuXG4gIHdpbmRvdy5fYWN0aXZlUmV2aWV3UGFuZSA9IHBhbmU7XG5cbiAgLy8gTGF6eS1sb2FkIHBhbmUgY29udGVudCBvbiBmaXJzdCB2aXNpdFxuICBpZiAoIXdpbmRvdy5fcmV2aWV3UGFuZUxvYWRlZCB8fCAhd2luZG93Ll9yZXZpZXdQYW5lTG9hZGVkW3BhbmVdKSB7XG4gICAgYXdhaXQgX2xvYWRSZXZpZXdQYW5lKHBhbmUpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9sb2FkUmV2aWV3UGFuZShwYW5lKSB7XG4gIGlmICghd2luZG93Ll9yZXZpZXdQYW5lTG9hZGVkKSB3aW5kb3cuX3Jldmlld1BhbmVMb2FkZWQgPSB7fTtcbiAgdHJ5IHtcbiAgICBzd2l0Y2ggKHBhbmUpIHtcbiAgICAgIGNhc2UgJ2V4cGVyaWVuY2VzJzogICBhd2FpdCBidWlsZEV4cGVyaWVuY2VSZXZpZXdUYWJsZSgpOyAgYnJlYWs7XG4gICAgICBjYXNlICdza2lsbHMnOiAgICAgICAgYXdhaXQgYnVpbGRTa2lsbHNSZXZpZXdUYWJsZSgpOyAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2FjaGlldmVtZW50cyc6ICBhd2FpdCBidWlsZEFjaGlldmVtZW50c1Jldmlld1RhYmxlKCk7IGJyZWFrO1xuICAgICAgY2FzZSAnc3VtbWFyeSc6ICAgICAgIGF3YWl0IGJ1aWxkU3VtbWFyeUZvY3VzU2VjdGlvbigpOyAgICAgYnJlYWs7XG4gICAgICBjYXNlICdwdWJsaWNhdGlvbnMnOiAgYXdhaXQgYnVpbGRQdWJsaWNhdGlvbnNSZXZpZXdUYWJsZSgpOyBicmVhaztcbiAgICAgIGRlZmF1bHQ6IHJldHVybjtcbiAgICB9XG4gICAgd2luZG93Ll9yZXZpZXdQYW5lTG9hZGVkW3BhbmVdID0gdHJ1ZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBkZWxldGUgd2luZG93Ll9yZXZpZXdQYW5lTG9hZGVkW3BhbmVdO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBQYWdlLWVzdGltYXRlIHdpZGdldCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gX3VwZGF0ZVBhZ2VFc3RpbWF0ZSgpIHtcbiAgY29uc3Qgd2lkZ2V0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BhZ2UtZXN0aW1hdGUtd2lkZ2V0Jyk7XG4gIGlmICghd2lkZ2V0KSByZXR1cm47XG5cbiAgY29uc3QgbGFiZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGUtbGFiZWwnKTtcbiAgY29uc3QgZmlsbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwZS1maWxsJyk7XG4gIGNvbnN0IGljb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGUtaWNvbicpO1xuXG4gIGlmIChsYWJlbCkgbGFiZWwudGV4dENvbnRlbnQgPSAnVXBkYXRpbmcgc2VydmVyIGxheW91dCBlc3RpbWF0ZVx1MjAyNic7XG4gIGlmIChmaWxsKSBmaWxsLnN0eWxlLndpZHRoID0gJzAlJztcbiAgaWYgKGljb24pIGljb24udGV4dENvbnRlbnQgPSAnXHUyM0YzJztcblxuICBjb25zdCBwYXlsb2FkID0ge1xuICAgIGV4cGVyaWVuY2VfZGVjaXNpb25zOiB7XG4gICAgICAuLi4oKHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMgJiYgd2luZG93Ll9zYXZlZERlY2lzaW9ucy5leHBlcmllbmNlX2RlY2lzaW9ucykgfHwge30pLFxuICAgICAgLi4uKHVzZXJTZWxlY3Rpb25zLmV4cGVyaWVuY2VzIHx8IHt9KSxcbiAgICB9LFxuICAgIHNraWxsX2RlY2lzaW9uczoge1xuICAgICAgLi4uKCh3aW5kb3cuX3NhdmVkRGVjaXNpb25zICYmIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMuc2tpbGxfZGVjaXNpb25zKSB8fCB7fSksXG4gICAgICAuLi4odXNlclNlbGVjdGlvbnMuc2tpbGxzIHx8IHt9KSxcbiAgICB9LFxuICAgIGFjaGlldmVtZW50X2RlY2lzaW9uczogKFxuICAgICAgKHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMgJiYgd2luZG93Ll9zYXZlZERlY2lzaW9ucy5hY2hpZXZlbWVudF9kZWNpc2lvbnMpXG4gICAgICB8fCB3aW5kb3cuYWNoaWV2ZW1lbnREZWNpc2lvbnNcbiAgICAgIHx8IHt9XG4gICAgKSxcbiAgICBwdWJsaWNhdGlvbl9kZWNpc2lvbnM6IChcbiAgICAgICh3aW5kb3cuX3NhdmVkRGVjaXNpb25zICYmIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMucHVibGljYXRpb25fZGVjaXNpb25zKVxuICAgICAgfHwgd2luZG93LnB1YmxpY2F0aW9uRGVjaXNpb25zXG4gICAgICB8fCB7fVxuICAgICksXG4gICAgc3VtbWFyeV9mb2N1c19vdmVycmlkZTogd2luZG93LnNlbGVjdGVkU3VtbWFyeUtleSB8fCBudWxsLFxuICB9O1xuXG4gIGNvbnN0IHJlcXVlc3RJZCA9ICsrcGFnZUVzdGltYXRlUmVxdWVzdElkO1xuICBjbGVhclRpbWVvdXQocGFnZUVzdGltYXRlVGltZXIpO1xuICBwYWdlRXN0aW1hdGVUaW1lciA9IHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGFwaUNhbGwoJ1BPU1QnLCAnL2FwaS9jdi9sYXlvdXQtZXN0aW1hdGUnLCBwYXlsb2FkKTtcbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHRocm93IG5ldyBFcnJvcihyZXNwb25zZS5lcnJvciB8fCAnZXN0aW1hdGUgZmFpbGVkJyk7XG4gICAgICBpZiAocmVxdWVzdElkICE9PSBwYWdlRXN0aW1hdGVSZXF1ZXN0SWQpIHJldHVybjtcblxuICAgICAgY29uc3QgcGFnZXMgPSBOdW1iZXIocmVzcG9uc2UucGFnZV9jb3VudF9lc3RpbWF0ZSB8fCAwKTtcbiAgICAgIGNvbnN0IHBjdCA9IE1hdGgubWluKDEwMCwgKHBhZ2VzIC8gMykgKiAxMDApO1xuICAgICAgY29uc3QgY29uZmlkZW5jZSA9IE51bWJlcihyZXNwb25zZS5wYWdlX2NvdW50X2NvbmZpZGVuY2UgfHwgMCk7XG5cbiAgICAgIGxldCBjbHMgPSAnb2snO1xuICAgICAgbGV0IGNvbG91ciA9ICcjMjJjNTVlJztcbiAgICAgIGxldCBpY29uVGV4dCA9IHJlc3BvbnNlLnBhZ2VfY291bnRfZXhhY3QgIT0gbnVsbCA/ICdcdTI3MDUnIDogJ1x1RDgzRFx1RENDNCc7XG4gICAgICBpZiAocmVzcG9uc2UucGFnZV9sZW5ndGhfd2FybmluZykge1xuICAgICAgICBjbHMgPSBwYWdlcyA+IDMgPyAnb3ZlcicgOiAnd2Fybic7XG4gICAgICAgIGNvbG91ciA9IHBhZ2VzID4gMyA/ICcjZWY0NDQ0JyA6ICcjZjU5ZTBiJztcbiAgICAgICAgaWNvblRleHQgPSBwYWdlcyA+IDMgPyAnXHVEODNEXHVERUE4JyA6ICdcdTI2QTBcdUZFMEYnO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzb3VyY2VMYWJlbCA9IHJlc3BvbnNlLnBhZ2VfY291bnRfZXhhY3QgIT0gbnVsbFxuICAgICAgICA/IGBFeGFjdDogJHtyZXNwb25zZS5wYWdlX2NvdW50X2V4YWN0fSBwYWdlJHtyZXNwb25zZS5wYWdlX2NvdW50X2V4YWN0ID09PSAxID8gJycgOiAncyd9YFxuICAgICAgICA6IGBFc3RpbWF0ZWQ6ICR7cGFnZXMudG9GaXhlZCgxKX0gcGFnZXNgO1xuICAgICAgY29uc3QgY29uZmlkZW5jZUxhYmVsID0gcmVzcG9uc2UucGFnZV9jb3VudF9leGFjdCAhPSBudWxsXG4gICAgICAgID8gJydcbiAgICAgICAgOiBgICgke01hdGgucm91bmQoY29uZmlkZW5jZSAqIDEwMCl9JSBjb25maWRlbmNlKWA7XG4gICAgICBjb25zdCBjb250cmlidXRvclRleHQgPSBBcnJheS5pc0FycmF5KHJlc3BvbnNlLmNvbnRyaWJ1dG9ycykgJiYgcmVzcG9uc2UuY29udHJpYnV0b3JzLmxlbmd0aCA+IDBcbiAgICAgICAgPyBgICR7cmVzcG9uc2UuY29udHJpYnV0b3JzWzBdfS5gXG4gICAgICAgIDogJyc7XG4gICAgICBjb25zdCByZWNoZWNrVGV4dCA9IHJlc3BvbnNlLnBhZ2VfY291bnRfbmVlZHNfZXhhY3RfcmVjaGVjayAmJiByZXNwb25zZS5wYWdlX2NvdW50X2V4YWN0ID09IG51bGxcbiAgICAgICAgPyAnIEV4YWN0IHJlY2hlY2sgcmVjb21tZW5kZWQuJ1xuICAgICAgICA6ICcnO1xuXG4gICAgICB3aWRnZXQuY2xhc3NOYW1lID0gYHBhZ2UtZXN0aW1hdGUgJHtjbHN9YDtcbiAgICAgIGlmIChsYWJlbCkge1xuICAgICAgICBsYWJlbC50ZXh0Q29udGVudCA9IGAke3NvdXJjZUxhYmVsfSR7Y29uZmlkZW5jZUxhYmVsfS4ke2NvbnRyaWJ1dG9yVGV4dH0ke3JlY2hlY2tUZXh0fWAudHJpbSgpO1xuICAgICAgfVxuICAgICAgaWYgKGZpbGwpIHtcbiAgICAgICAgZmlsbC5zdHlsZS53aWR0aCA9IGAke3BjdH0lYDtcbiAgICAgICAgZmlsbC5zdHlsZS5iYWNrZ3JvdW5kID0gY29sb3VyO1xuICAgICAgfVxuICAgICAgaWYgKGljb24pIGljb24udGV4dENvbnRlbnQgPSBpY29uVGV4dDtcblxuICAgICAgc3RhdGVNYW5hZ2VyLnNldEdlbmVyYXRpb25TdGF0ZSh7XG4gICAgICAgIHBhZ2VDb3VudEVzdGltYXRlOiByZXNwb25zZS5wYWdlX2NvdW50X2VzdGltYXRlID8/IG51bGwsXG4gICAgICAgIHBhZ2VDb3VudEV4YWN0OiByZXNwb25zZS5wYWdlX2NvdW50X2V4YWN0ID8/IG51bGwsXG4gICAgICAgIHBhZ2VDb3VudENvbmZpZGVuY2U6IHJlc3BvbnNlLnBhZ2VfY291bnRfY29uZmlkZW5jZSA/PyBudWxsLFxuICAgICAgICBwYWdlQ291bnRTb3VyY2U6IHJlc3BvbnNlLnBhZ2VfY291bnRfc291cmNlIHx8IG51bGwsXG4gICAgICAgIHBhZ2VOZWVkc0V4YWN0UmVjaGVjazogQm9vbGVhbihyZXNwb25zZS5wYWdlX2NvdW50X25lZWRzX2V4YWN0X3JlY2hlY2spLFxuICAgICAgICBwYWdlV2FybmluZzogQm9vbGVhbihyZXNwb25zZS5wYWdlX2xlbmd0aF93YXJuaW5nKSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAocmVxdWVzdElkICE9PSBwYWdlRXN0aW1hdGVSZXF1ZXN0SWQpIHJldHVybjtcbiAgICAgIHdpZGdldC5jbGFzc05hbWUgPSAncGFnZS1lc3RpbWF0ZSB3YXJuJztcbiAgICAgIGlmIChsYWJlbCkgbGFiZWwudGV4dENvbnRlbnQgPSBgTGF5b3V0IGVzdGltYXRlIHVuYXZhaWxhYmxlOiAke2Vycm9yLm1lc3NhZ2V9YDtcbiAgICAgIGlmIChmaWxsKSB7XG4gICAgICAgIGZpbGwuc3R5bGUud2lkdGggPSAnMCUnO1xuICAgICAgICBmaWxsLnN0eWxlLmJhY2tncm91bmQgPSAnI2Y1OWUwYic7XG4gICAgICB9XG4gICAgICBpZiAoaWNvbikgaWNvbi50ZXh0Q29udGVudCA9ICdcdTI2QTBcdUZFMEYnO1xuICAgIH1cbiAgfSwgMjUwKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFNoYXJlZCBhY3Rpb24gY2xpY2sgaGFuZGxlcnMgKGV4cGVyaWVuY2UgKyBza2lsbHMgdGFibGVzKSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gaGFuZGxlQWN0aW9uQ2xpY2soaXRlbUlkLCBhY3Rpb24sIHR5cGUpIHtcbiAgLy8gUmVtb3ZlIGFjdGl2ZSBjbGFzcyBmcm9tIGFsbCBidXR0b25zIGluIHRoaXMgcm93XG4gIGNvbnN0IHJvdyA9IHR5cGUgPT09ICdleHBlcmllbmNlJ1xuICAgID8gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgdHJbZGF0YS1leHAtaWQ9XCIke2l0ZW1JZH1cIl1gKVxuICAgIDogZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgdHJbZGF0YS1za2lsbD1cIiR7aXRlbUlkfVwiXWApO1xuXG4gIGNvbnN0IGJ1dHRvbnMgPSByb3cucXVlcnlTZWxlY3RvckFsbCgnLmljb24tYnRuJyk7XG4gIGJ1dHRvbnMuZm9yRWFjaChidG4gPT4ge1xuICAgIGJ0bi5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICBpZiAoYnRuLmhhc0F0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJykpIGJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsICdmYWxzZScpO1xuICB9KTtcblxuICAvLyBBZGQgYWN0aXZlIGNsYXNzIHRvIGNsaWNrZWQgYnV0dG9uXG4gIGNvbnN0IGNsaWNrZWRCdG4gPSByb3cucXVlcnlTZWxlY3RvcihgW2RhdGEtYWN0aW9uPVwiJHthY3Rpb259XCJdYCk7XG4gIGNsaWNrZWRCdG4uY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gIGlmIChjbGlja2VkQnRuLmhhc0F0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJykpIGNsaWNrZWRCdG4uc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCAndHJ1ZScpO1xuXG4gIC8vIFN0b3JlIHNlbGVjdGlvbiBhbmQgcmVjb3JkIGV4cGxpY2l0IHJldmlld1xuICBpZiAodHlwZSA9PT0gJ2V4cGVyaWVuY2UnKSB7XG4gICAgdXNlclNlbGVjdGlvbnMuZXhwZXJpZW5jZXNbaXRlbUlkXSA9IGFjdGlvbjtcbiAgICB3aW5kb3cuX2V4cGxpY2l0bHlSZXZpZXdlZCA9IHdpbmRvdy5fZXhwbGljaXRseVJldmlld2VkIHx8IHsgZXhwZXJpZW5jZXM6IG5ldyBTZXQoKSwgc2tpbGxzOiBuZXcgU2V0KCkgfTtcbiAgICB3aW5kb3cuX2V4cGxpY2l0bHlSZXZpZXdlZC5leHBlcmllbmNlcy5hZGQoaXRlbUlkKTtcbiAgfSBlbHNlIHtcbiAgICB1c2VyU2VsZWN0aW9ucy5za2lsbHNbaXRlbUlkXSA9IGFjdGlvbjtcbiAgICB3aW5kb3cuX2V4cGxpY2l0bHlSZXZpZXdlZCA9IHdpbmRvdy5fZXhwbGljaXRseVJldmlld2VkIHx8IHsgZXhwZXJpZW5jZXM6IG5ldyBTZXQoKSwgc2tpbGxzOiBuZXcgU2V0KCkgfTtcbiAgICB3aW5kb3cuX2V4cGxpY2l0bHlSZXZpZXdlZC5za2lsbHMuYWRkKGl0ZW1JZCk7XG4gIH1cbiAgX3VwZGF0ZVBhZ2VFc3RpbWF0ZSgpO1xufVxuXG4vKipcbiAqIEFwcGx5IGEgYnVsayBhY3Rpb24gdG8gYWxsIHZpc2libGUgKERhdGFUYWJsZS1maWx0ZXJlZCkgcm93cyBpbiBvbmUgdGFibGUuXG4gKiBhY3Rpb246ICdlbXBoYXNpemUnIHwgJ2luY2x1ZGUnIHwgJ2RlLWVtcGhhc2l6ZScgfCAnZXhjbHVkZScgfCAncmVjb21tZW5kZWQnXG4gKiB0eXBlOiAgICdleHBlcmllbmNlJyB8ICdza2lsbCdcbiAqL1xuZnVuY3Rpb24gYnVsa0FjdGlvbihhY3Rpb24sIHR5cGUpIHtcbiAgY29uc3QgdGFibGVJZCAgPSB0eXBlID09PSAnZXhwZXJpZW5jZScgPyAnI2V4cGVyaWVuY2UtcmV2aWV3LXRhYmxlJyA6ICcjc2tpbGxzLXJldmlldy10YWJsZSc7XG4gIGNvbnN0IGRhdGEgICAgID0gd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnMgfHwge307XG4gIGNvbnN0IGR0ICAgICAgID0gJC5mbi5EYXRhVGFibGUuaXNEYXRhVGFibGUodGFibGVJZCkgPyAkKHRhYmxlSWQpLkRhdGFUYWJsZSgpIDogbnVsbDtcblxuICAvLyBJdGVyYXRlIG9ubHkgdGhlIHJvd3MgdGhhdCBEYXRhVGFibGUgY3VycmVudGx5IHNob3dzIChyZXNwZWN0cyBzZWFyY2ggZmlsdGVyKVxuICBjb25zdCByb3dzID0gZHRcbiAgICA/IGR0LnJvd3MoeyBzZWFyY2g6ICdhcHBsaWVkJyB9KS5ub2RlcygpLnRvQXJyYXkoKVxuICAgIDogQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGAke3RhYmxlSWR9IHRib2R5IHRyYCkpO1xuXG4gIHJvd3MuZm9yRWFjaChyb3cgPT4ge1xuICAgIGNvbnN0IGV4cElkICAgID0gcm93LmRhdGFzZXQuZXhwSWQ7XG4gICAgY29uc3Qgc2tpbGxJZCAgPSByb3cuZGF0YXNldC5za2lsbDtcbiAgICBjb25zdCBpdGVtSWQgICA9IGV4cElkIHx8IHNraWxsSWQ7XG4gICAgaWYgKCFpdGVtSWQpIHJldHVybjtcblxuICAgIGxldCByZXNvbHZlZEFjdGlvbiA9IGFjdGlvbjtcbiAgICBpZiAoYWN0aW9uID09PSAncmVjb21tZW5kZWQnKSB7XG4gICAgICByZXNvbHZlZEFjdGlvbiA9IHR5cGUgPT09ICdleHBlcmllbmNlJ1xuICAgICAgICA/IF9yZXNvbHZlZEV4cEFjdGlvbihpdGVtSWQsIGRhdGEpXG4gICAgICAgIDogX3Jlc29sdmVkU2tpbGxBY3Rpb24oaXRlbUlkLCBkYXRhKTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgYnV0dG9uIHN0YXRlc1xuICAgIHJvdy5xdWVyeVNlbGVjdG9yQWxsKCcuaWNvbi1idG4nKS5mb3JFYWNoKGJ0biA9PiB7XG4gICAgICBidG4uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gICAgICBpZiAoYnRuLmhhc0F0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJykpIGJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsICdmYWxzZScpO1xuICAgIH0pO1xuICAgIGNvbnN0IHRhcmdldCA9IHJvdy5xdWVyeVNlbGVjdG9yKGBbZGF0YS1hY3Rpb249XCIke3Jlc29sdmVkQWN0aW9ufVwiXWApO1xuICAgIGlmICh0YXJnZXQpIHtcbiAgICAgIHRhcmdldC5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICAgIGlmICh0YXJnZXQuaGFzQXR0cmlidXRlKCdhcmlhLXByZXNzZWQnKSkgdGFyZ2V0LnNldEF0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJywgJ3RydWUnKTtcbiAgICB9XG5cbiAgICAvLyBTdG9yZSBzZWxlY3Rpb25cbiAgICBpZiAodHlwZSA9PT0gJ2V4cGVyaWVuY2UnKSB7XG4gICAgICB1c2VyU2VsZWN0aW9ucy5leHBlcmllbmNlc1tpdGVtSWRdID0gcmVzb2x2ZWRBY3Rpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIHVzZXJTZWxlY3Rpb25zLnNraWxsc1tpdGVtSWRdID0gcmVzb2x2ZWRBY3Rpb247XG4gICAgfVxuICB9KTtcbiAgX3VwZGF0ZVBhZ2VFc3RpbWF0ZSgpO1xufVxuXG5mdW5jdGlvbiBfcmVzb2x2ZWRFeHBBY3Rpb24oZXhwSWQsIGRhdGEpIHtcbiAgY29uc3QgcmVjID0gZ2V0RXhwZXJpZW5jZVJlY29tbWVuZGF0aW9uKGV4cElkLCBkYXRhKTtcbiAgaWYgKHJlYyA9PT0gJ0VtcGhhc2l6ZScpICAgIHJldHVybiAnZW1waGFzaXplJztcbiAgaWYgKHJlYyA9PT0gJ0luY2x1ZGUnKSAgICAgIHJldHVybiAnaW5jbHVkZSc7XG4gIGlmIChyZWMgPT09ICdEZS1lbXBoYXNpemUnKSByZXR1cm4gJ2RlLWVtcGhhc2l6ZSc7XG4gIHJldHVybiAnZXhjbHVkZSc7XG59XG5cbmZ1bmN0aW9uIF9yZXNvbHZlZFNraWxsQWN0aW9uKHNraWxsTmFtZSwgZGF0YSkge1xuICBjb25zdCByZWMgPSBnZXRTa2lsbFJlY29tbWVuZGF0aW9uKHNraWxsTmFtZSwgZGF0YSk7XG4gIGlmIChyZWMgPT09ICdFbXBoYXNpemUnKSAgICByZXR1cm4gJ2VtcGhhc2l6ZSc7XG4gIGlmIChyZWMgPT09ICdJbmNsdWRlJykgICAgICByZXR1cm4gJ2luY2x1ZGUnO1xuICBpZiAocmVjID09PSAnRGUtZW1waGFzaXplJykgcmV0dXJuICdkZS1lbXBoYXNpemUnO1xuICByZXR1cm4gJ2V4Y2x1ZGUnO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgVGFnbGluZSByZXZpZXcgdGFiIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBwb3B1bGF0ZVRhZ2xpbmVSZXZpZXdUYWIoKSB7XG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9jdW1lbnQtY29udGVudCcpO1xuICBpZiAoIWNvbnRlbnQpIHJldHVybjtcbiAgY29udGVudC5pbm5lckhUTUwgPSBgXG4gICAgPGgyIHN0eWxlPVwibWFyZ2luOjAgMCAxNnB4O1wiPlx1RDgzQ1x1REZGN1x1RkUwRiBBcHBsaWNhbnQgVGFnbGluZTwvaDI+XG4gICAgPGRpdiBpZD1cInRhZ2xpbmUtcmV2aWV3LWNvbnRhaW5lclwiPjwvZGl2PlxuICBgO1xuICBpZiAodHlwZW9mIGJ1aWxkVGFnbGluZVJldmlld1NlY3Rpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICBhd2FpdCBidWlsZFRhZ2xpbmVSZXZpZXdTZWN0aW9uKCk7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIEV4cG9ydHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmV4cG9ydCB7XG4gIHVzZXJTZWxlY3Rpb25zLFxuICB1cGRhdGVJbmNsdXNpb25Db3VudHMsXG4gIHN3aXRjaFRhYixcbiAgbG9hZFRhYkNvbnRlbnQsXG4gIHBvcHVsYXRlQW5hbHlzaXNUYWIsXG4gIGhhbmRsZUN1c3RvbWl6YXRpb25SZXNwb25zZSxcbiAgc2hvd1RhYmxlQmFzZWRSZXZpZXcsXG4gIHBvcHVsYXRlUmV2aWV3VGFiLFxuICBwb3B1bGF0ZVRhZ2xpbmVSZXZpZXdUYWIsXG4gIHN3aXRjaFJldmlld1N1YnRhYixcbiAgX2xvYWRSZXZpZXdQYW5lLFxuICBfdXBkYXRlUGFnZUVzdGltYXRlLFxuICBoYW5kbGVBY3Rpb25DbGljayxcbiAgYnVsa0FjdGlvbixcbiAgX3Jlc29sdmVkRXhwQWN0aW9uLFxuICBfcmVzb2x2ZWRTa2lsbEFjdGlvbixcbn07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi93b3JrZmxvdy1zdGVwcy5qc1xuICogV29ya2Zsb3cgcHJvZ3Jlc3MgYmFyLCBwaGFzZSByZS1ydW4vYmFjay1uYXYsIGFuZCBidWxsZXQgcmVvcmRlciBtb2RhbC5cbiAqXG4gKiBEZXBlbmRlbmNpZXMgKHJlc29sdmVkIHRocm91Z2ggZ2xvYmFsVGhpcyBhdCBydW50aW1lKTpcbiAqICAgUEhBU0VTLCBlc2NhcGVIdG1sLFxuICogICBhcHBlbmRMb2FkaW5nTWVzc2FnZSwgcmVtb3ZlTG9hZGluZ01lc3NhZ2UsIGFwcGVuZFJldHJ5TWVzc2FnZSwgYXBwZW5kTWVzc2FnZSxcbiAqICAgc2V0TG9hZGluZywgZmV0Y2hTdGF0dXMsIHN3aXRjaFRhYiwgc2VuZEFjdGlvbixcbiAqICAgc2hvd0xvYWRKb2JQYW5lbCwgdXBkYXRlQWN0aW9uQnV0dG9ucywgdXBkYXRlVGFiQmFyRm9yU3RhZ2UsXG4gKiAgIHRyYXBGb2N1cywgcmVzdG9yZUZvY3VzLCBfZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCxcbiAqICAgcG9zdEFuYWx5c2lzUXVlc3Rpb25zLCBxdWVzdGlvbkFuc3dlcnMsIENTU1xuICovXG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmNvbnN0IGxvZyA9IGdldExvZ2dlcignd29ya2Zsb3ctc3RlcHMnKTtcblxuaW1wb3J0IHsgc3RhdGVNYW5hZ2VyLCBHRU5FUkFUSU9OX1NUQVRFX0VWRU5UIH0gZnJvbSAnLi9zdGF0ZS1tYW5hZ2VyLmpzJztcblxuZnVuY3Rpb24gX2ZpbmRFeHBlcmllbmNlUmVjb21tZW5kYXRpb25SZWNvcmQoZXhwSWQpIHtcbiAgY29uc3QgZGF0YSA9IGdsb2JhbFRoaXMud2luZG93Py5wZW5kaW5nUmVjb21tZW5kYXRpb25zO1xuICBpZiAoIWRhdGEgfHwgIUFycmF5LmlzQXJyYXkoZGF0YS5leHBlcmllbmNlX3JlY29tbWVuZGF0aW9ucykpIHJldHVybiBudWxsO1xuICByZXR1cm4gZGF0YS5leHBlcmllbmNlX3JlY29tbWVuZGF0aW9ucy5maW5kKChyZWMpID0+IFN0cmluZyhyZWM/LmlkIHx8IHJlYz8uZXhwZXJpZW5jZV9pZCB8fCAnJykgPT09IFN0cmluZyhleHBJZCkpIHx8IG51bGw7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBTdGVwLW9yZGVyIGNvbnN0YW50cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuY29uc3QgX1NURVBfT1JERVIgPSBbXG4gICdqb2InLCAnYW5hbHlzaXMnLCAnY3VzdG9taXphdGlvbnMnLCAncmV3cml0ZScsICdzcGVsbCcsICdsYXlvdXQnLFxuICAnZG93bmxvYWQnLCAnY292ZXJfbGV0dGVyJywgJ3NjcmVlbmluZycsICdpbnRlcnZpZXdfcHJlcCcsICd0aGFua195b3UnLCAnaGFydmVzdCcsXG5dO1xuY29uc3QgX1NURVBfRElTUExBWSA9IHtcbiAgam9iOiAgICAgICAgICAgICdKb2IgSW5wdXQnLFxuICBhbmFseXNpczogICAgICAgJ0pvYiBBbmFseXNpcycsXG4gIGN1c3RvbWl6YXRpb25zOiAnQ3VzdG9taXNhdGlvbnMnLFxuICByZXdyaXRlOiAgICAgICAgJ1Jld3JpdGUgUmV2aWV3JyxcbiAgc3BlbGw6ICAgICAgICAgICdTcGVsbCBDaGVjaycsXG4gIGxheW91dDogICAgICAgICAnTGF5b3V0IFJldmlldycsXG4gIGRvd25sb2FkOiAgICAgICAnRmlsZSBSZXZpZXcnLFxuICBjb3Zlcl9sZXR0ZXI6ICAgJ0NvdmVyIExldHRlcicsXG4gIHNjcmVlbmluZzogICAgICAnU2NyZWVuaW5nJyxcbiAgaW50ZXJ2aWV3X3ByZXA6ICdJbnRlcnZpZXcgUHJlcCcsXG4gIHRoYW5rX3lvdTogICAgICAnVGhhbmsgWW91JyxcbiAgaGFydmVzdDogICAgICAgICdIYXJ2ZXN0Jyxcbn07XG5jb25zdCBfQUNUSU9OX0xBQkVMUyA9IHtcbiAgcmVjb21tZW5kX2N1c3RvbWl6YXRpb25zOiAnU2VsZWN0aW5nIGV4cGVyaWVuY2VzICYgc2tpbGxzXHUyMDI2JyxcbiAgZ2VuZXJhdGVfY3Y6ICdHZW5lcmF0aW5nIENWXHUyMDI2Jyxcbn07XG5cbmNvbnN0IF9OQVZfVEFCX0xBQkVMUyA9IHtcbiAgZG93bmxvYWQ6ICdcdTJCMDdcdUZFMEYgRmlsZSBSZXZpZXcnLFxufTtcblxuZnVuY3Rpb24gYXBwbHlMYXlvdXRGcmVzaG5lc3NOYXZpZ2F0aW9uU3RhdGUoKSB7XG4gIGNvbnN0IGZyZXNobmVzcyA9IHN0YXRlTWFuYWdlci5nZXRMYXlvdXRGcmVzaG5lc3MoKTtcbiAgY29uc3QgZ2VuZXJhdGlvblN0YXRlID0gc3RhdGVNYW5hZ2VyLmdldEdlbmVyYXRpb25TdGF0ZSgpO1xuICBjb25zdCBsYXlvdXRTdGVwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0ZXAtbGF5b3V0Jyk7XG5cbiAgaWYgKGxheW91dFN0ZXApIHtcbiAgICBsYXlvdXRTdGVwLmNsYXNzTGlzdC5yZW1vdmUoJ3N0YWxlJywgJ3N0YWxlLWNyaXRpY2FsJyk7XG4gICAgY29uc3QgcmVydW4gPSBsYXlvdXRTdGVwLnF1ZXJ5U2VsZWN0b3IoJy5zdGVwLXJlcnVuJyk/Lm91dGVySFRNTCB8fCAnJztcbiAgICBjb25zdCByZWZpbmVCYWRnZSA9IGxheW91dFN0ZXAucXVlcnlTZWxlY3RvcignLnN0ZXAtaW5saW5lLWJhZGdlJyk/Lm91dGVySFRNTCB8fCAnJztcbiAgICBjb25zdCBzdGFsZUJhZGdlID0gZnJlc2huZXNzLmlzU3RhbGVcbiAgICAgID8gJyA8c3BhbiBjbGFzcz1cInN0ZXAtaW5saW5lLWJhZGdlIHN0ZXAtc3RhbGUtYmFkZ2VcIj5PdXRkYXRlZDwvc3Bhbj4nXG4gICAgICA6ICcnO1xuICAgIGlmIChmcmVzaG5lc3MuaXNTdGFsZSkge1xuICAgICAgbGF5b3V0U3RlcC5jbGFzc0xpc3QuYWRkKCdzdGFsZScpO1xuICAgICAgaWYgKGZyZXNobmVzcy5pc0NyaXRpY2FsKSBsYXlvdXRTdGVwLmNsYXNzTGlzdC5hZGQoJ3N0YWxlLWNyaXRpY2FsJyk7XG4gICAgfVxuICAgIGxheW91dFN0ZXAuaW5uZXJIVE1MID0gYFx1RDgzQ1x1REZBOCBMYXlvdXQgUmV2aWV3JHtzdGFsZUJhZGdlfSR7cmVmaW5lQmFkZ2UgPyBgICR7cmVmaW5lQmFkZ2V9YCA6ICcnfSR7cmVydW4gPyBgICR7cmVydW59YCA6ICcnfWA7XG4gIH1cblxuICBjb25zdCBzaG93RG93bnN0cmVhbUJhZGdlID0gZnJlc2huZXNzLmlzU3RhbGUgJiYgQm9vbGVhbihcbiAgICBnZW5lcmF0aW9uU3RhdGUuZmluYWxHZW5lcmF0ZWRBdCB8fCBnZW5lcmF0aW9uU3RhdGUucGhhc2UgPT09ICdmaW5hbF9jb21wbGV0ZSdcbiAgKTtcbiAgT2JqZWN0LmVudHJpZXMoX05BVl9UQUJfTEFCRUxTKS5mb3JFYWNoKChbdGFiLCBsYWJlbF0pID0+IHtcbiAgICBjb25zdCB0YWJFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGB0YWItJHt0YWJ9YCk7XG4gICAgaWYgKCF0YWJFbCkgcmV0dXJuO1xuICAgIHRhYkVsLmNsYXNzTGlzdC5yZW1vdmUoJ3RhYi1zdGFsZScsICd0YWItc3RhbGUtY3JpdGljYWwnKTtcbiAgICBpZiAoc2hvd0Rvd25zdHJlYW1CYWRnZSkge1xuICAgICAgdGFiRWwuY2xhc3NMaXN0LmFkZCgndGFiLXN0YWxlJyk7XG4gICAgICBpZiAoZnJlc2huZXNzLmlzQ3JpdGljYWwpIHRhYkVsLmNsYXNzTGlzdC5hZGQoJ3RhYi1zdGFsZS1jcml0aWNhbCcpO1xuICAgICAgdGFiRWwuaW5uZXJIVE1MID0gYCR7bGFiZWx9IDxzcGFuIGNsYXNzPVwidGFiLXN0YWxlLWJhZGdlXCI+T3V0ZGF0ZWQ8L3NwYW4+YDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGFiRWwudGV4dENvbnRlbnQgPSBsYWJlbDtcbiAgICB9XG4gIH0pO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgQmFjayB0byBwaGFzZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gYmFja1RvUGhhc2Uoc3RlcCwgZmVlZGJhY2spIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBib2R5ID0gZmVlZGJhY2sgPyB7cGhhc2U6IHN0ZXAsIGZlZWRiYWNrfSA6IHtwaGFzZTogc3RlcH07XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL2JhY2stdG8tcGhhc2UnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmICghcmVzLm9rIHx8ICFkYXRhLm9rKSB7XG4gICAgICBhcHBlbmRSZXRyeU1lc3NhZ2UoJ1x1MjZBMCBDb3VsZCBub3QgbmF2aWdhdGUgYmFjazogJyArIChkYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yJyksICgpID0+IGJhY2tUb1BoYXNlKHN0ZXAsIGZlZWRiYWNrKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIGBcdTIxQkIgTmF2aWdhdGluZyBiYWNrIHRvICR7c3RlcH0uIFByaW9yIGRlY2lzaW9ucyBhbmQgYXBwcm92YWxzIGFyZSBwcmVzZXJ2ZWQuYCk7XG4gICAgaWYgKGZlZWRiYWNrKSBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCBgUmVmaW5lbWVudCBmZWVkYmFjayBxdWV1ZWQ6IFwiJHtmZWVkYmFja31cImApO1xuICAgIGF3YWl0IGZldGNoU3RhdHVzKCk7XG5cbiAgICAvLyBTd2l0Y2ggdG8gdGhlIGFwcHJvcHJpYXRlIHZpZXdlciB0YWJcbiAgICBjb25zdCB0YWJNYXAgPSB7XG4gICAgICBqb2I6ICAgICAgICAgICAgbnVsbCxcbiAgICAgIGFuYWx5c2lzOiAgICAgICAnYW5hbHlzaXMnLFxuICAgICAgY3VzdG9taXphdGlvbnM6ICdnb2FscycsXG4gICAgICByZXdyaXRlOiAgICAgICAgJ3Jld3JpdGUnLFxuICAgICAgc3BlbGw6ICAgICAgICAgICdzcGVsbCcsXG4gICAgfTtcbiAgICBjb25zdCByZXNvbHZlZFRhYiA9IHRhYk1hcFtzdGVwXSB8fCB0YWJNYXBbZGF0YS5waGFzZV0gfHwgbnVsbDtcbiAgICBpZiAocmVzb2x2ZWRUYWIpIHN3aXRjaFRhYihyZXNvbHZlZFRhYik7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGFwcGVuZFJldHJ5TWVzc2FnZSgnXHUyNkEwIE5ldHdvcmsgZXJyb3IgaW4gYmFja1RvUGhhc2U6ICcgKyBlcnIubWVzc2FnZSwgKCkgPT4gYmFja1RvUGhhc2Uoc3RlcCkpO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBSZS1ydW4gY29uZmlybSBtb2RhbCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLyoqXG4gKiBTaG93IGEgZG93bnN0cmVhbS1hd2FyZSBjb25maXJtYXRpb24gbW9kYWwgYmVmb3JlIHJlLXJ1bm5pbmcgb3IgYmFjay1uYXZpZ2F0aW5nLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgc3RlcCAgICAgIC0gVGhlIHRhcmdldCBzdGVwIGtleVxuICogQHBhcmFtIHsncmVydW4nfCdiYWNrLW5hdid9IG1vZGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IG9uQ29uZmlybSAtIENhbGxlZCBpZiB0aGUgdXNlciBjbGlja3MgUHJvY2VlZFxuICovXG5mdW5jdGlvbiBfc2hvd1JlUnVuQ29uZmlybU1vZGFsKHN0ZXAsIG1vZGUsIG9uQ29uZmlybSkge1xuICBjb25zdCBzdGVwSWR4ICAgID0gX1NURVBfT1JERVIuaW5kZXhPZihzdGVwKTtcbiAgLy8gT25seSBzaG93IGRvd25zdHJlYW0gc3RhZ2VzIHRoYXQgaGF2ZSBhY3R1YWxseSBiZWVuIGNvbXBsZXRlZFxuICBjb25zdCBkb3duc3RyZWFtID0gX1NURVBfT1JERVIuc2xpY2Uoc3RlcElkeCArIDEpLmZpbHRlcihzID0+IHtcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzdGVwLSR7c31gKTtcbiAgICByZXR1cm4gZWwgJiYgZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdjb21wbGV0ZWQnKTtcbiAgfSk7XG4gIGNvbnN0IHN0ZXBMYWJlbCAgPSBfU1RFUF9ESVNQTEFZW3N0ZXBdIHx8IHN0ZXA7XG5cbiAgY29uc3QgdGl0bGUgPSBtb2RlID09PSAncmVydW4nXG4gICAgPyBgXHUyMUJCIFJlLXJ1biAke3N0ZXBMYWJlbH0/YFxuICAgIDogYFx1MjE5MCBOYXZpZ2F0ZSBiYWNrIHRvICR7c3RlcExhYmVsfT9gO1xuICBjb25zdCBib2R5VGV4dCA9IG1vZGUgPT09ICdyZXJ1bidcbiAgICA/ICdUaGUgZm9sbG93aW5nIHN0YWdlcyB3aWxsIHNlZSB1cGRhdGVkIGlucHV0cyBhbmQgbWF5IHNob3cgY2hhbmdlZCByZWNvbW1lbmRhdGlvbnM6J1xuICAgIDogJ1lvdSBhcmUgbmF2aWdhdGluZyBiYWNrIHBhc3QgdGhlIGZvbGxvd2luZyBjb21wbGV0ZWQgc3RhZ2VzOic7XG4gIGNvbnN0IG5vdGUgPSAnQWxsIGV4aXN0aW5nIGFwcHJvdmFscyBhbmQgcmV3cml0ZXMgYXJlIHByZXNlcnZlZCBhcyBjb250ZXh0Lic7XG5cbiAgY29uc3QgbGlzdEh0bWwgPSBkb3duc3RyZWFtXG4gICAgLm1hcChzID0+IGA8bGkgc3R5bGU9XCJwYWRkaW5nOjJweCAwO1wiPiR7X1NURVBfRElTUExBWVtzXSB8fCBzfTwvbGk+YClcbiAgICAuam9pbignJyk7XG5cbiAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBvdmVybGF5LmlkID0gJ3JlcnVuLWNvbmZpcm0tb3ZlcmxheSc7XG4gIG92ZXJsYXkuc3R5bGUuY3NzVGV4dCA9IGBwb3NpdGlvbjpmaXhlZDtpbnNldDowO2JhY2tncm91bmQ6cmdiYSgwLDAsMCwwLjUpO1xuICAgIHotaW5kZXg6MTAwMDA7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2A7XG4gIG92ZXJsYXkuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgcm9sZT1cImRpYWxvZ1wiIGFyaWEtbW9kYWw9XCJ0cnVlXCIgYXJpYS1sYWJlbGxlZGJ5PVwicmVydW4tY29uZmlybS10aXRsZVwiXG4gICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6I2ZmZjtib3JkZXItcmFkaXVzOjEwcHg7cGFkZGluZzoyNHB4IDI4cHg7bWF4LXdpZHRoOjQ0MHB4O1xuICAgICAgICAgICAgICAgIHdpZHRoOjkyJTtib3gtc2hhZG93OjAgMjBweCA2MHB4IHJnYmEoMCwwLDAsMC4zKTtcIj5cbiAgICAgIDxoMyBpZD1cInJlcnVuLWNvbmZpcm0tdGl0bGVcIiBzdHlsZT1cIm1hcmdpbjowIDAgMTBweDtmb250LXNpemU6MS4xZW07Y29sb3I6IzFlMjkzYjtcIj5cbiAgICAgICAgJHtlc2NhcGVIdG1sKHRpdGxlKX08L2gzPlxuICAgICAgPHAgc3R5bGU9XCJtYXJnaW46MCAwIDhweDtmb250LXNpemU6MC45ZW07Y29sb3I6IzQ3NTU2OTtcIj4ke2VzY2FwZUh0bWwoYm9keVRleHQpfTwvcD5cbiAgICAgIDx1bCBzdHlsZT1cIm1hcmdpbjowIDAgMTJweDtwYWRkaW5nLWxlZnQ6MjBweDtmb250LXNpemU6MC45ZW07Y29sb3I6IzM3NDE1MTtcIj4ke2xpc3RIdG1sfTwvdWw+XG4gICAgICA8cCBzdHlsZT1cIm1hcmdpbjowIDAgMThweDtmb250LXNpemU6MC44NWVtO2NvbG9yOiM2YjcyODA7XCI+JHtlc2NhcGVIdG1sKG5vdGUpfTwvcD5cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjEwcHg7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kO1wiPlxuICAgICAgICA8YnV0dG9uIGlkPVwicmVydW4tY2FuY2VsLWJ0blwiIGNsYXNzPVwiYnRuLXNlY29uZGFyeVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwicmVydW4tcHJvY2VlZC1idG5cIiBjbGFzcz1cImJ0bi1wcmltYXJ5XCI+UHJvY2VlZDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+YDtcblxuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG92ZXJsYXkpO1xuICBfZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIGlmICh0eXBlb2YgdHJhcEZvY3VzID09PSAnZnVuY3Rpb24nKSB0cmFwRm9jdXMoJ3JlcnVuLWNvbmZpcm0tb3ZlcmxheScpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVydW4tcHJvY2VlZC1idG4nKS5mb2N1cygpO1xuXG4gIGNvbnN0IGNsb3NlID0gKCkgPT4geyBvdmVybGF5LnJlbW92ZSgpOyByZXN0b3JlRm9jdXMoKTsgfTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlcnVuLWNhbmNlbC1idG4nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNsb3NlKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlcnVuLXByb2NlZWQtYnRuJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7IGNsb3NlKCk7IG9uQ29uZmlybSgpOyB9KTtcbiAgb3ZlcmxheS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGUgPT4geyBpZiAoZS50YXJnZXQgPT09IG92ZXJsYXkpIGNsb3NlKCk7IH0pO1xuICBvdmVybGF5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBlID0+IHsgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgY2xvc2UoKTsgfSk7XG59XG5cbmZ1bmN0aW9uIGNvbmZpcm1SZVJ1blBoYXNlKHN0ZXApIHtcbiAgX3Nob3dSZVJ1bkNvbmZpcm1Nb2RhbChzdGVwLCAncmVydW4nLCAoKSA9PiBiYWNrVG9QaGFzZShzdGVwKSk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBWaWV3LWN1cnNvciBpbmRpY2F0b3IgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8qKlxuICogUmV0dXJuIGEgdG9vbHRpcCBzdHJpbmcgZm9yIGEgc3RlcCBwaWxsIGJhc2VkIG9uIGl0cyBjb21iaW5lZCBzdGF0ZS5cbiAqL1xuZnVuY3Rpb24gX2dldFN0ZXBUb29sdGlwKHN0ZXAsIGlzQWN0aXZlLCBpc1ZpZXdpbmcsIGlzQnJvd3NpbmdBd2F5LCBpc0NvbXBsZXRlZCwgaXNTdGFsZSwgaXNTdGFsZUNyaXRpY2FsKSB7XG4gIGlmIChpc1N0YWxlQ3JpdGljYWwpIHJldHVybiBpc1ZpZXdpbmcgPyAnQ3JpdGljYWwgY2hhbmdlcyBcdTIwMTQgcmV2aWV3IHJlcXVpcmVkLiBDbGljayBcdTIxQkIgdG8gcmVydW4uJyA6ICdDcml0aWNhbCBjaGFuZ2VzIFx1MjAxNCByZXZpZXcgcmVxdWlyZWQuJztcbiAgaWYgKGlzU3RhbGUpICAgICAgICAgcmV0dXJuIGlzVmlld2luZyA/ICdSZXN1bHRzIG1heSBiZSBvdXRkYXRlZC4gQ2xpY2sgXHUyMUJCIHRvIHJlcnVuLicgICAgICAgICAgIDogJ1Jlc3VsdHMgbWF5IGJlIG91dGRhdGVkLic7XG4gIGlmIChpc0Jyb3dzaW5nQXdheSkgIHJldHVybiAnQWN0aXZlIHN0ZXAgXHUyMDE0IGNsaWNrIHRvIHJldHVybic7XG4gIGlmIChpc0FjdGl2ZSAmJiBpc1ZpZXdpbmcpICAgIHJldHVybiAnQ3VycmVudCBzdGVwJztcbiAgaWYgKGlzQ29tcGxldGVkICYmIGlzVmlld2luZykgcmV0dXJuICdDbGljayBcdTIxQkIgdG8gcmVydW4gZnJvbSBoZXJlJztcbiAgaWYgKGlzQ29tcGxldGVkKSAgICAgICAgICAgICAgcmV0dXJuICdDbGljayB0byB2aWV3JztcbiAgcmV0dXJuICcnO1xufVxuXG4vKipcbiAqIFN5bmMgdGhlIGJsdWUgcmluZyAodmlldyBjdXJzb3IpIGFuZCBhbWJlciBwdWxzaW5nIHJpbmcgKGJyb3dzaW5nLWF3YXkpXG4gKiB0byB0aGUgY3VycmVudGx5IHZpc2libGUgdGFiLiBDYWxsZWQgYWZ0ZXIgZXZlcnkgdGFiIHN3aXRjaCBhbmQgc3RhdHVzIHVwZGF0ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWJOYW1lIC0gVGhlIGN1cnJlbnRseSB2aXNpYmxlIHRhYiBpZCAoZS5nLiAnYW5hbHlzaXMnLCAnZXhwLXJldmlldycpXG4gKi9cbmZ1bmN0aW9uIF91cGRhdGVWaWV3aW5nSW5kaWNhdG9yKHRhYk5hbWUpIHtcbiAgY29uc3QgdGFiVG9TdGVwID0ge1xuICAgICdqb2InOiAgICAgICAgICAgJ2pvYicsXG4gICAgJ2FuYWx5c2lzJzogICAgICAnYW5hbHlzaXMnLFxuICAgICdxdWVzdGlvbnMnOiAgICAgJ2FuYWx5c2lzJyxcbiAgICAnZXhwLXJldmlldyc6ICAgICdjdXN0b21pemF0aW9ucycsXG4gICAgJ3Jld3JpdGUnOiAgICAgICAncmV3cml0ZScsXG4gICAgJ3NwZWxsJzogICAgICAgICAnc3BlbGwnLFxuICAgICdsYXlvdXQnOiAgICAgICAgJ2xheW91dCcsXG4gICAgJ2ZpbmFsX2dlbmVyYXRlJzonZG93bmxvYWQnLFxuICAgICdkb3dubG9hZCc6ICAgICAgJ2Rvd25sb2FkJyxcbiAgICAnY292ZXItbGV0dGVyJzogICdjb3Zlcl9sZXR0ZXInLFxuICAgICdzY3JlZW5pbmcnOiAgICAgJ3NjcmVlbmluZycsXG4gICAgJ2ludGVydmlldy1wcmVwJzonaW50ZXJ2aWV3X3ByZXAnLFxuICAgICd0aGFuay15b3UnOiAgICAgJ3RoYW5rX3lvdScsXG4gICAgJ2hhcnZlc3QnOiAgICAgICAnaGFydmVzdCcsXG4gIH07XG4gIGNvbnN0IHZpZXdlZFN0ZXAgPSB0YWJUb1N0ZXBbdGFiTmFtZV0gfHwgbnVsbDtcblxuICBsZXQgYWN0aXZlU3RlcCA9IG51bGw7XG4gIF9TVEVQX09SREVSLmZvckVhY2goc3RlcCA9PiB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc3RlcC0ke3N0ZXB9YCk7XG4gICAgaWYgKGVsICYmIGVsLmNsYXNzTGlzdC5jb250YWlucygnYWN0aXZlJykpIGFjdGl2ZVN0ZXAgPSBzdGVwO1xuICB9KTtcblxuICBfU1RFUF9PUkRFUi5mb3JFYWNoKHN0ZXAgPT4ge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHN0ZXAtJHtzdGVwfWApO1xuICAgIGlmICghZWwpIHJldHVybjtcblxuICAgIGNvbnN0IGlzVmlld2luZyAgICAgID0gc3RlcCA9PT0gdmlld2VkU3RlcDtcbiAgICBjb25zdCBpc0FjdGl2ZSAgICAgICA9IHN0ZXAgPT09IGFjdGl2ZVN0ZXA7XG4gICAgY29uc3QgaXNCcm93c2luZ0F3YXkgPSBpc0FjdGl2ZSAmJiAhIXZpZXdlZFN0ZXAgJiYgdmlld2VkU3RlcCAhPT0gYWN0aXZlU3RlcDtcbiAgICBjb25zdCBpc0NvbXBsZXRlZCAgICA9IGVsLmNsYXNzTGlzdC5jb250YWlucygnY29tcGxldGVkJyk7XG4gICAgY29uc3QgaXNTdGFsZSAgICAgICAgPSBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ3N0YWxlJyk7XG4gICAgY29uc3QgaXNTdGFsZUNyaXRpY2FsID0gZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdzdGFsZS1jcml0aWNhbCcpO1xuXG4gICAgZWwuY2xhc3NMaXN0LnRvZ2dsZSgndmlld2luZycsICAgICAgIGlzVmlld2luZyk7XG4gICAgZWwuY2xhc3NMaXN0LnRvZ2dsZSgnYnJvd3NpbmctYXdheScsIGlzQnJvd3NpbmdBd2F5KTtcblxuICAgIGNvbnN0IHRvb2x0aXBUZXh0ID0gX2dldFN0ZXBUb29sdGlwKHN0ZXAsIGlzQWN0aXZlLCBpc1ZpZXdpbmcsIGlzQnJvd3NpbmdBd2F5LCBpc0NvbXBsZXRlZCwgaXNTdGFsZSwgaXNTdGFsZUNyaXRpY2FsKTtcbiAgICBpZiAodG9vbHRpcFRleHQpIHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZSgnZGF0YS1icy10b2dnbGUnLCAgICAndG9vbHRpcCcpO1xuICAgICAgZWwuc2V0QXR0cmlidXRlKCdkYXRhLWJzLXBsYWNlbWVudCcsICdib3R0b20nKTtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZSgnZGF0YS1icy10aXRsZScsICAgICB0b29sdGlwVGV4dCk7XG4gICAgICBpZiAodHlwZW9mIGJvb3RzdHJhcCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY29uc3QgdGlwID0gYm9vdHN0cmFwLlRvb2x0aXAuZ2V0SW5zdGFuY2UoZWwpO1xuICAgICAgICBpZiAodGlwKSB0aXAuc2V0Q29udGVudCh7ICcudG9vbHRpcC1pbm5lcic6IHRvb2x0aXBUZXh0IH0pO1xuICAgICAgICBlbHNlICAgICBuZXcgYm9vdHN0cmFwLlRvb2x0aXAoZWwpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtYnMtdG9nZ2xlJyk7XG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtYnMtdGl0bGUnKTtcbiAgICAgIGlmICh0eXBlb2YgYm9vdHN0cmFwICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBjb25zdCB0aXAgPSBib290c3RyYXAuVG9vbHRpcC5nZXRJbnN0YW5jZShlbCk7XG4gICAgICAgIGlmICh0aXApIHRpcC5kaXNwb3NlKCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFJlLXJ1biBwaGFzZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLyoqXG4gKiBTaG93IGFuIGFtZW5kLWNsYXJpZmljYXRpb25zIG1vZGFsIGJlZm9yZSByZS1ydW5uaW5nIHRoZSBhbmFseXNpcyBwaGFzZS5cbiAqIENhbGxzIG9uUHJvY2VlZCgpIGlmIHRoZSB1c2VyIGNvbmZpcm1zICh3aXRoIG9yIHdpdGhvdXQgdXBkYXRpbmcgYW5zd2VycykuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIF9zaG93QW5hbHlzaXNDbGFyaWZpY2F0aW9uQW1lbmRNb2RhbChvblByb2NlZWQpIHtcbiAgY29uc3QgcXVlc3Rpb25zID0gd2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucyB8fCBbXTtcbiAgY29uc3QgYW5zd2VycyAgID0gd2luZG93LnF1ZXN0aW9uQW5zd2VycyB8fCB7fTtcblxuICAvLyBObyBwcmlvciBxdWVzdGlvbnMgXHUyMDE0IHNraXAgdGhlIG1vZGFsIGFuZCBwcm9jZWVkIGRpcmVjdGx5LlxuICBpZiAoIXF1ZXN0aW9ucy5sZW5ndGgpIHsgYXdhaXQgb25Qcm9jZWVkKCk7IHJldHVybjsgfVxuXG4gIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgb3ZlcmxheS5pZCA9ICdjbGFyLWFtZW5kLW92ZXJsYXknO1xuICBvdmVybGF5LnN0eWxlLmNzc1RleHQgPSAncG9zaXRpb246Zml4ZWQ7aW5zZXQ6MDtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsMC41KTt6LWluZGV4OjEwMDAwO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjtvdmVyZmxvdy15OmF1dG87JztcblxuICBjb25zdCBmb3JtUm93cyA9IHF1ZXN0aW9ucy5tYXAoKHEsIGkpID0+IHtcbiAgICBjb25zdCBxdHlwZSAgPSBxLnR5cGUgfHwgYGNsYXJpZmljYXRpb25fJHtpICsgMX1gO1xuICAgIGNvbnN0IHF0ZXh0ICA9IGVzY2FwZUh0bWwocS5xdWVzdGlvbiB8fCAnJyk7XG4gICAgY29uc3QgY3VyQW5zID0gZXNjYXBlSHRtbChhbnN3ZXJzW3F0eXBlXSB8fCAnJyk7XG4gICAgY29uc3QgY2hvaWNlcyA9IEFycmF5LmlzQXJyYXkocS5jaG9pY2VzKSA/IHEuY2hvaWNlcyA6IFtdO1xuXG4gICAgaWYgKGNob2ljZXMubGVuZ3RoKSB7XG4gICAgICBjb25zdCByYWRpb3MgPSBjaG9pY2VzLm1hcChjID0+IGBcbiAgICAgICAgPGxhYmVsIHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6NnB4O21hcmdpbi1ib3R0b206NHB4O2N1cnNvcjpwb2ludGVyO1wiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwiY2xhci0ke2VzY2FwZUh0bWwocXR5cGUpfVwiIHZhbHVlPVwiJHtlc2NhcGVIdG1sKGMpfVwiXG4gICAgICAgICAgICAke2Fuc3dlcnNbcXR5cGVdID09PSBjID8gJ2NoZWNrZWQnIDogJyd9IHN0eWxlPVwiZmxleC1zaHJpbms6MDtcIj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjllbTtcIj4ke2VzY2FwZUh0bWwoYyl9PC9zcGFuPlxuICAgICAgICA8L2xhYmVsPmApLmpvaW4oJycpO1xuICAgICAgcmV0dXJuIGBcbiAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTRweDtcIj5cbiAgICAgICAgICA8bGFiZWwgc3R5bGU9XCJmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjAuOWVtO2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWJvdHRvbTo2cHg7XCI+JHtxdGV4dH08L2xhYmVsPlxuICAgICAgICAgICR7cmFkaW9zfVxuICAgICAgICA8L2Rpdj5gO1xuICAgIH1cbiAgICByZXR1cm4gYFxuICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTRweDtcIj5cbiAgICAgICAgPGxhYmVsIGZvcj1cImNsYXItYW5zLSR7ZXNjYXBlSHRtbChxdHlwZSl9XCIgc3R5bGU9XCJmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjAuOWVtO2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWJvdHRvbTo0cHg7XCI+JHtxdGV4dH08L2xhYmVsPlxuICAgICAgICA8dGV4dGFyZWEgaWQ9XCJjbGFyLWFucy0ke2VzY2FwZUh0bWwocXR5cGUpfVwiIG5hbWU9XCJjbGFyLSR7ZXNjYXBlSHRtbChxdHlwZSl9XCIgcm93cz1cIjJcIlxuICAgICAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTtib3gtc2l6aW5nOmJvcmRlci1ib3g7cGFkZGluZzo2cHggOHB4O2JvcmRlcjoxcHggc29saWQgI2QxZDVkYjtib3JkZXItcmFkaXVzOjZweDtmb250LXNpemU6MC45ZW07cmVzaXplOnZlcnRpY2FsO1wiXG4gICAgICAgID4ke2N1ckFuc308L3RleHRhcmVhPlxuICAgICAgPC9kaXY+YDtcbiAgfSkuam9pbignJyk7XG5cbiAgb3ZlcmxheS5pbm5lckhUTUwgPSBgXG4gICAgPGRpdiByb2xlPVwiZGlhbG9nXCIgYXJpYS1tb2RhbD1cInRydWVcIiBhcmlhLWxhYmVsbGVkYnk9XCJjbGFyLWFtZW5kLXRpdGxlXCJcbiAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDojZmZmO2JvcmRlci1yYWRpdXM6MTBweDtwYWRkaW5nOjI0cHggMjhweDttYXgtd2lkdGg6NTAwcHg7d2lkdGg6OTQlO1xuICAgICAgICAgICAgICAgIGJveC1zaGFkb3c6MCAyMHB4IDYwcHggcmdiYSgwLDAsMCwwLjMpO21hcmdpbjoyMHB4IGF1dG87XCI+XG4gICAgICA8aDMgaWQ9XCJjbGFyLWFtZW5kLXRpdGxlXCIgc3R5bGU9XCJtYXJnaW46MCAwIDZweDtmb250LXNpemU6MS4xZW07Y29sb3I6IzFlMjkzYjtcIj5cdTIxQkIgQW1lbmQgQ2xhcmlmaWNhdGlvbiBBbnN3ZXJzPC9oMz5cbiAgICAgIDxwIHN0eWxlPVwibWFyZ2luOjAgMCAxNnB4O2ZvbnQtc2l6ZTowLjg1ZW07Y29sb3I6IzZiNzI4MDtcIj5cbiAgICAgICAgVXBkYXRlIHlvdXIgYW5zd2VycyBiZWZvcmUgcmVydW5uaW5nIGFuYWx5c2lzLCBvciBrZWVwIHRoZW0gYXMtaXMuXG4gICAgICA8L3A+XG4gICAgICA8Zm9ybSBpZD1cImNsYXItYW1lbmQtZm9ybVwiIG9uc3VibWl0PVwicmV0dXJuIGZhbHNlO1wiPlxuICAgICAgICAke2Zvcm1Sb3dzfVxuICAgICAgPC9mb3JtPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6MTBweDtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmQ7bWFyZ2luLXRvcDo4cHg7ZmxleC13cmFwOndyYXA7XCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJjbGFyLWFtZW5kLWNhbmNlbFwiIGNsYXNzPVwiYnRuLXNlY29uZGFyeVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwiY2xhci1hbWVuZC1rZWVwXCIgICBjbGFzcz1cImJ0bi1zZWNvbmRhcnlcIj5LZWVwIEV4aXN0aW5nIEFuc3dlcnM8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImNsYXItYW1lbmQtc2F2ZVwiICAgY2xhc3M9XCJidG4tcHJpbWFyeVwiPlVwZGF0ZSAmYW1wOyBSZXJ1bjwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+YDtcblxuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG92ZXJsYXkpO1xuICBpZiAodHlwZW9mIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsICE9PSAndW5kZWZpbmVkJykgd2luZG93Ll9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgaWYgKHR5cGVvZiB0cmFwRm9jdXMgPT09ICdmdW5jdGlvbicpIHRyYXBGb2N1cygnY2xhci1hbWVuZC1vdmVybGF5Jyk7XG4gIG92ZXJsYXkucXVlcnlTZWxlY3RvcignI2NsYXItYW1lbmQtc2F2ZScpLmZvY3VzKCk7XG5cbiAgZnVuY3Rpb24gY2xvc2VNb2RhbCgpIHtcbiAgICBvdmVybGF5LnJlbW92ZSgpO1xuICAgIGlmICh0eXBlb2YgcmVzdG9yZUZvY3VzID09PSAnZnVuY3Rpb24nKSByZXN0b3JlRm9jdXMoKTtcbiAgfVxuXG4gIG92ZXJsYXkucXVlcnlTZWxlY3RvcignI2NsYXItYW1lbmQtY2FuY2VsJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjbG9zZU1vZGFsKTtcbiAgb3ZlcmxheS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGUgPT4geyBpZiAoZS50YXJnZXQgPT09IG92ZXJsYXkpIGNsb3NlTW9kYWwoKTsgfSk7XG4gIG92ZXJsYXkuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGUgPT4geyBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSBjbG9zZU1vZGFsKCk7IH0pO1xuXG4gIG92ZXJsYXkucXVlcnlTZWxlY3RvcignI2NsYXItYW1lbmQta2VlcCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGNsb3NlTW9kYWwoKTtcbiAgICBvblByb2NlZWQoKTtcbiAgfSk7XG5cbiAgb3ZlcmxheS5xdWVyeVNlbGVjdG9yKCcjY2xhci1hbWVuZC1zYXZlJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZm9ybSAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbGFyLWFtZW5kLWZvcm0nKTtcbiAgICBjb25zdCB1cGRhdGVkID0ge307XG4gICAgcXVlc3Rpb25zLmZvckVhY2goKHEsIGkpID0+IHtcbiAgICAgIGNvbnN0IHF0eXBlID0gcS50eXBlIHx8IGBjbGFyaWZpY2F0aW9uXyR7aSArIDF9YDtcbiAgICAgIGNvbnN0IGVsICAgID0gZm9ybS5xdWVyeVNlbGVjdG9yKGBbbmFtZT1cImNsYXItJHtxdHlwZX1cIl1gKTtcbiAgICAgIGlmICghZWwpIHJldHVybjtcbiAgICAgIGlmIChlbC50eXBlID09PSAncmFkaW8nKSB7XG4gICAgICAgIGNvbnN0IGNoZWNrZWQgPSBmb3JtLnF1ZXJ5U2VsZWN0b3IoYFtuYW1lPVwiY2xhci0ke3F0eXBlfVwiXTpjaGVja2VkYCk7XG4gICAgICAgIGlmIChjaGVja2VkKSB1cGRhdGVkW3F0eXBlXSA9IGNoZWNrZWQudmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB2YWwgPSBlbC52YWx1ZS50cmltKCk7XG4gICAgICAgIGlmICh2YWwpIHVwZGF0ZWRbcXR5cGVdID0gdmFsO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY2xvc2VNb2RhbCgpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmZXRjaCgnL2FwaS9wb3N0LWFuYWx5c2lzLXJlc3BvbnNlcycsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHF1ZXN0aW9ucywgYW5zd2VyczogdXBkYXRlZCB9KSxcbiAgICAgIH0pO1xuICAgICAgd2luZG93LnF1ZXN0aW9uQW5zd2VycyA9IHVwZGF0ZWQ7XG4gICAgfSBjYXRjaCAoX2UpIHsgLyogc2lsZW50IFx1MjAxNCBwcm9jZWVkIHdpdGggd2hhdGV2ZXIgdGhlIGJhY2tlbmQgYWxyZWFkeSBoYXMgKi8gfVxuICAgIGF3YWl0IG9uUHJvY2VlZCgpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVSdW5QaGFzZShzdGVwKSB7XG4gIC8vIEludGVyY2VwdCBhbmFseXNpcyByZXJ1bnMgdG8gbGV0IHRoZSB1c2VyIGFtZW5kIHByaW9yIGNsYXJpZmljYXRpb24gYW5zd2Vycy5cbiAgaWYgKHN0ZXAgPT09ICdhbmFseXNpcycpIHtcbiAgICBhd2FpdCBfc2hvd0FuYWx5c2lzQ2xhcmlmaWNhdGlvbkFtZW5kTW9kYWwoKCkgPT4gX2V4ZWN1dGVSZVJ1blBoYXNlKCdhbmFseXNpcycpKTtcbiAgICByZXR1cm47XG4gIH1cbiAgYXdhaXQgX2V4ZWN1dGVSZVJ1blBoYXNlKHN0ZXApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBfZXhlY3V0ZVJlUnVuUGhhc2Uoc3RlcCkge1xuICBjb25zdCBsb2FkaW5nTXNnID0gYXBwZW5kTG9hZGluZ01lc3NhZ2UoYFx1MjFCQiBSZS1ydW5uaW5nICR7c3RlcH1cdTIwMjZgKTtcbiAgc2V0TG9hZGluZyh0cnVlLCBgUmUtcnVubmluZyAke3N0ZXB9XHUyMDI2YCk7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL3JlLXJ1bi1waGFzZScsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeydDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbid9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe3BoYXNlOiBzdGVwfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgcmVtb3ZlTG9hZGluZ01lc3NhZ2UobG9hZGluZ01zZyk7XG4gICAgc2V0TG9hZGluZyhmYWxzZSk7XG5cbiAgICBpZiAoIXJlcy5vayB8fCAhZGF0YS5vaykge1xuICAgICAgYXBwZW5kUmV0cnlNZXNzYWdlKCdcdTI2QTAgUmUtcnVuIGZhaWxlZDogJyArIChkYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yJyksICgpID0+IHJlUnVuUGhhc2Uoc3RlcCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIGBcdTI3MDUgJHtzdGVwfSByZS1ydW4gY29tcGxldGUuIFJldmlldyB0aGUgdXBkYXRlZCByZXN1bHRzIFx1MjAxNCBjaGFuZ2VkIGl0ZW1zIGFyZSBoaWdobGlnaHRlZC5gKTtcbiAgICBhd2FpdCBmZXRjaFN0YXR1cygpO1xuXG4gICAgLy8gQ2xlYXIgcGVyLXBoYXNlIGNhY2hlcyBzbyBiYWNrLW5hdmlnYXRpb24gZmV0Y2hlcyBmcmVzaCByZXN1bHRzXG4gICAgaWYgKHN0ZXAgPT09ICdzcGVsbCcpICAgd2luZG93Ll9zcGVsbENoZWNrQ2FjaGUgID0gbnVsbDtcbiAgICBpZiAoc3RlcCA9PT0gJ3Jld3JpdGUnKSB3aW5kb3cuX3Jld3JpdGVQYW5lbENhY2hlID0gbnVsbDtcblxuICAgIC8vIE5hdmlnYXRlIHRvIHRoZSBzdGVwJ3Mgdmlld2VyIHRhYlxuICAgIGNvbnN0IHRhYk1hcCA9IHtcbiAgICAgIGFuYWx5c2lzOiAgICAgICAnYW5hbHlzaXMnLFxuICAgICAgY3VzdG9taXphdGlvbnM6ICdnb2FscycsXG4gICAgICByZXdyaXRlOiAgICAgICAgJ3Jld3JpdGUnLFxuICAgICAgc3BlbGw6ICAgICAgICAgICdzcGVsbCcsXG4gICAgfTtcbiAgICBpZiAodGFiTWFwW3N0ZXBdKSBzd2l0Y2hUYWIodGFiTWFwW3N0ZXBdKTtcblxuICAgIC8vIENvbXB1dGUgY2hhbmdlZC1pdGVtIElEcyBmcm9tIHByaW9yIHZzIG5ldyBvdXRwdXQgYW5kIGhpZ2hsaWdodCB0aGVtLlxuICAgIGlmIChkYXRhLnByaW9yX291dHB1dCAmJiBkYXRhLm5ld19vdXRwdXQpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gX2hpZ2hsaWdodENoYW5nZWRJdGVtcyhzdGVwLCBkYXRhLnByaW9yX291dHB1dCwgZGF0YS5uZXdfb3V0cHV0KSwgMzAwKTtcbiAgICB9XG5cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmVtb3ZlTG9hZGluZ01lc3NhZ2UobG9hZGluZ01zZyk7XG4gICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgYXBwZW5kUmV0cnlNZXNzYWdlKCdcdTI2QTAgTmV0d29yayBlcnJvciBpbiByZVJ1blBoYXNlOiAnICsgZXJyLm1lc3NhZ2UsICgpID0+IHJlUnVuUGhhc2Uoc3RlcCkpO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBIaWdobGlnaHQgY2hhbmdlZCBpdGVtcyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLyoqXG4gKiBDb21wYXJlIHByaW9yIGFuZCBuZXcgcmUtcnVuIG91dHB1dHM7IG1hcmsgRE9NIGVsZW1lbnRzIGZvciBjaGFuZ2VkIGVudGl0aWVzLlxuICpcbiAqIFN0cmF0ZWdpZXMgYnkgc3RlcDpcbiAqICAgcmV3cml0ZSAgICAgICAgXHUyMDE0IGNvbXBhcmUgcmV3cml0ZSBJRHM7IG1hcmsgcnctY2FyZC08aWQ+XG4gKiAgIGN1c3RvbWl6YXRpb25zIFx1MjAxNCBjb21wYXJlIGV4cGVyaWVuY2UgSURzOyBtYXJrIHRyW2RhdGEtZXhwLWlkXSBhbmQgdHJbZGF0YS1za2lsbF1cbiAqICAgYW5hbHlzaXMgICAgICAgXHUyMDE0IG5vIHBlci1lbnRpdHkgRE9NIHRhcmdldGluZzsgc2tpcFxuICovXG5mdW5jdGlvbiBfaGlnaGxpZ2h0Q2hhbmdlZEl0ZW1zKHN0ZXAsIHByaW9yT3V0cHV0LCBuZXdPdXRwdXQpIHtcbiAgaWYgKHN0ZXAgPT09ICdyZXdyaXRlJykge1xuICAgIGNvbnN0IHByaW9ySWRzID0gbmV3IFNldCgocHJpb3JPdXRwdXQucGVuZGluZ19yZXdyaXRlcyB8fCBbXSkubWFwKHIgPT4gU3RyaW5nKHIuaWQpKSk7XG4gICAgY29uc3QgbmV3SXRlbXMgID0gbmV3T3V0cHV0LnBlbmRpbmdfcmV3cml0ZXMgIHx8IFtdO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBuZXdJdGVtcykge1xuICAgICAgY29uc3QgaWQgICAgICA9IFN0cmluZyhpdGVtLmlkIHx8ICcnKTtcbiAgICAgIGNvbnN0IGNhcmRJZCAgPSBpZC5yZXBsYWNlKC9bXmEtekEtWjAtOV8tXS9nLCAnXycpO1xuICAgICAgY29uc3QgZWwgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBydy1jYXJkLSR7Y2FyZElkfWApO1xuICAgICAgaWYgKCFlbCkgY29udGludWU7XG4gICAgICBjb25zdCBpc05ldyAgICAgPSAhcHJpb3JJZHMuaGFzKGlkKTtcbiAgICAgIGNvbnN0IHByaW9ySXRlbSA9IChwcmlvck91dHB1dC5wZW5kaW5nX3Jld3JpdGVzIHx8IFtdKS5maW5kKHIgPT4gU3RyaW5nKHIuaWQpID09PSBpZCk7XG4gICAgICBjb25zdCBjaGFuZ2VkICAgPSBpc05ldyB8fCAocHJpb3JJdGVtICYmIHByaW9ySXRlbS5wcm9wb3NlZCAhPT0gaXRlbS5wcm9wb3NlZCk7XG4gICAgICBpZiAoY2hhbmdlZCkgX21hcmtDaGFuZ2VkKGVsKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHN0ZXAgPT09ICdjdXN0b21pemF0aW9ucycpIHtcbiAgICBjb25zdCBwcmlvckV4cElkcyA9IG5ldyBTZXQoXG4gICAgICAocHJpb3JPdXRwdXQuY3VzdG9taXphdGlvbnM/LmV4cGVyaWVuY2VfcmVjb21tZW5kYXRpb25zIHx8IFtdKS5tYXAociA9PiBTdHJpbmcoci5pZCkpXG4gICAgKTtcbiAgICBjb25zdCBuZXdFeHBSZWNzICA9IG5ld091dHB1dC5jdXN0b21pemF0aW9ucz8uZXhwZXJpZW5jZV9yZWNvbW1lbmRhdGlvbnMgfHwgW107XG4gICAgZm9yIChjb25zdCByZWMgb2YgbmV3RXhwUmVjcykge1xuICAgICAgY29uc3QgaWQgICA9IFN0cmluZyhyZWMuaWQgfHwgJycpO1xuICAgICAgY29uc3QgZWwgICA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYHRyW2RhdGEtZXhwLWlkPVwiJHtDU1MuZXNjYXBlKGlkKX1cIl1gKTtcbiAgICAgIGlmICghZWwpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgcHJpb3IgPSAocHJpb3JPdXRwdXQuY3VzdG9taXphdGlvbnM/LmV4cGVyaWVuY2VfcmVjb21tZW5kYXRpb25zIHx8IFtdKS5maW5kKHIgPT4gU3RyaW5nKHIuaWQpID09PSBpZCk7XG4gICAgICBpZiAoIXByaW9yRXhwSWRzLmhhcyhpZCkgfHwgKHByaW9yICYmIHByaW9yLnJlY29tbWVuZGF0aW9uICE9PSByZWMucmVjb21tZW5kYXRpb24pKSB7XG4gICAgICAgIF9tYXJrQ2hhbmdlZChlbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcHJpb3JTa2lsbHMgPSBuZXcgU2V0KFxuICAgICAgKHByaW9yT3V0cHV0LmN1c3RvbWl6YXRpb25zPy5za2lsbF9yZWNvbW1lbmRhdGlvbnMgfHwgW10pLm1hcChyID0+IChyLnNraWxsIHx8ICcnKS50b0xvd2VyQ2FzZSgpKVxuICAgICk7XG4gICAgY29uc3QgbmV3U2tpbGxSZWNzID0gbmV3T3V0cHV0LmN1c3RvbWl6YXRpb25zPy5za2lsbF9yZWNvbW1lbmRhdGlvbnMgfHwgW107XG4gICAgZm9yIChjb25zdCByZWMgb2YgbmV3U2tpbGxSZWNzKSB7XG4gICAgICBjb25zdCBuYW1lID0gKHJlYy5za2lsbCB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IGVsICAgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGB0cltkYXRhLXNraWxsPVwiJHtDU1MuZXNjYXBlKG5hbWUpfVwiXWApO1xuICAgICAgaWYgKCFlbCkgY29udGludWU7XG4gICAgICBjb25zdCBwcmlvciA9IChwcmlvck91dHB1dC5jdXN0b21pemF0aW9ucz8uc2tpbGxfcmVjb21tZW5kYXRpb25zIHx8IFtdKS5maW5kKFxuICAgICAgICByID0+IChyLnNraWxsIHx8ICcnKS50b0xvd2VyQ2FzZSgpID09PSBuYW1lXG4gICAgICApO1xuICAgICAgaWYgKCFwcmlvclNraWxscy5oYXMobmFtZSkgfHwgKHByaW9yICYmIHByaW9yLnJlY29tbWVuZGF0aW9uICE9PSByZWMucmVjb21tZW5kYXRpb24pKSB7XG4gICAgICAgIF9tYXJrQ2hhbmdlZChlbCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxufVxuXG4vKiogQXBwbHkgZGF0YS1jaGFuZ2VkIGF0dHJpYnV0ZSBhbmQgdHJpZ2dlciBoaWdobGlnaHQgYW5pbWF0aW9uIG9uIGFuIGVsZW1lbnQuICovXG5mdW5jdGlvbiBfbWFya0NoYW5nZWQoZWwpIHtcbiAgZWwuc2V0QXR0cmlidXRlKCdkYXRhLWNoYW5nZWQnLCAndHJ1ZScpO1xuICAvLyBSZW1vdmUgdGhlIGF0dHJpYnV0ZSBhZnRlciB0aGUgYW5pbWF0aW9uIGNvbXBsZXRlcyBzbyBpdCBjYW4gYmUgcmUtdHJpZ2dlcmVkIG9uIGEgc2Vjb25kIHJlcnVuLlxuICBzZXRUaW1lb3V0KCgpID0+IGVsLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1jaGFuZ2VkJyksIDI1MDApO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgQnVsbGV0IHJlb3JkZXIgbW9kYWwgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIHNob3dCdWxsZXRSZW9yZGVyKGV4cElkLCBleHBUaXRsZSkge1xuICAvLyBGZXRjaCBhY2hpZXZlbWVudHMgKHJlcXVpcmVkKSBhbmQgc3VnZ2VzdGVkIG9yZGVyIChiZXN0LWVmZm9ydCkuXG4gIGxldCBhY2hpZXZlbWVudHMgPSBbXTtcbiAgbGV0IHByb3Bvc2VkT3JkZXIgPSBudWxsO1xuICBsZXQgaGFzSm9iQW5hbHlzaXMgPSBmYWxzZTtcbiAgbGV0IHByb3Bvc2VkUmVhc29uaW5nID0gJyc7XG4gIGxldCBwcm9wb3NlZEF0c0ltcGFjdCA9ICcnO1xuICBsZXQgcHJvcG9zZWRQYWdlSW1wYWN0ID0gJyc7XG4gIHRyeSB7XG4gICAgY29uc3QgZGV0YWlsc1JlcyA9IGF3YWl0IGZldGNoKCcvYXBpL2V4cGVyaWVuY2UtZGV0YWlscycsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7J0NvbnRlbnQtVHlwZSc6J2FwcGxpY2F0aW9uL2pzb24nfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtleHBlcmllbmNlX2lkOiBleHBJZH0pLFxuICAgIH0pO1xuICAgIGlmICghZGV0YWlsc1Jlcy5vaykge1xuICAgICAgbGV0IGRldGFpbHNFcnIgPSBgSFRUUCAke2RldGFpbHNSZXMuc3RhdHVzfWA7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXlsb2FkID0gYXdhaXQgZGV0YWlsc1Jlcy5qc29uKCk7XG4gICAgICAgIGRldGFpbHNFcnIgPSBwYXlsb2FkLmVycm9yIHx8IHBheWxvYWQubWVzc2FnZSB8fCBkZXRhaWxzRXJyO1xuICAgICAgfSBjYXRjaCAoXykgeyAvKiBrZWVwIHN0YXR1cy1iYXNlZCBlcnJvciAqLyB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZGV0YWlsc0Vycik7XG4gICAgfVxuXG4gICAgY29uc3QgZGV0YWlsc0RhdGEgPSBhd2FpdCBkZXRhaWxzUmVzLmpzb24oKTtcbiAgICBhY2hpZXZlbWVudHMgID0gKGRldGFpbHNEYXRhLmV4cGVyaWVuY2UgJiYgZGV0YWlsc0RhdGEuZXhwZXJpZW5jZS5hY2hpZXZlbWVudHMpIHx8IFtdO1xuXG4gICAgY29uc3QgcmVjUmVjb3JkID0gX2ZpbmRFeHBlcmllbmNlUmVjb21tZW5kYXRpb25SZWNvcmQoZXhwSWQpO1xuICAgIGNvbnN0IGxsbUJ1bGxldE9yZGVyID0gcmVjUmVjb3JkICYmIHR5cGVvZiByZWNSZWNvcmQuYnVsbGV0X29yZGVyID09PSAnb2JqZWN0J1xuICAgICAgPyByZWNSZWNvcmQuYnVsbGV0X29yZGVyXG4gICAgICA6IG51bGw7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkobGxtQnVsbGV0T3JkZXI/Lm9yZGVyKSAmJiBsbG1CdWxsZXRPcmRlci5vcmRlci5sZW5ndGggPiAxKSB7XG4gICAgICBwcm9wb3NlZE9yZGVyID0gbGxtQnVsbGV0T3JkZXIub3JkZXI7XG4gICAgICBoYXNKb2JBbmFseXNpcyA9IHRydWU7XG4gICAgICBwcm9wb3NlZFJlYXNvbmluZyA9IFN0cmluZyhsbG1CdWxsZXRPcmRlci5yZWFzb25pbmcgfHwgJycpLnRyaW0oKTtcbiAgICAgIHByb3Bvc2VkQXRzSW1wYWN0ID0gU3RyaW5nKGxsbUJ1bGxldE9yZGVyLmF0c19pbXBhY3QgfHwgJycpLnRyaW0oKTtcbiAgICAgIHByb3Bvc2VkUGFnZUltcGFjdCA9IFN0cmluZyhsbG1CdWxsZXRPcmRlci5wYWdlX2xlbmd0aF9pbXBhY3QgfHwgJycpLnRyaW0oKTtcbiAgICB9XG5cbiAgICAvLyBTdWdnZXN0ZWQgb3JkZXIgaXMgb3B0aW9uYWw7IGZhaWx1cmVzIHNob3VsZCBub3QgYmxvY2sgb3BlbmluZyB0aGUgbW9kYWwuXG4gICAgaWYgKCFwcm9wb3NlZE9yZGVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwcm9wb3NlZFJlcyA9IGF3YWl0IGZldGNoKGAvYXBpL3Byb3Bvc2VkLWJ1bGxldC1vcmRlcj9leHBlcmllbmNlX2lkPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGV4cElkKX1gKTtcbiAgICAgICAgaWYgKHByb3Bvc2VkUmVzLm9rKSB7XG4gICAgICAgICAgY29uc3QgcHJvcG9zZWREYXRhID0gYXdhaXQgcHJvcG9zZWRSZXMuanNvbigpO1xuICAgICAgICAgIHByb3Bvc2VkT3JkZXIgPSBwcm9wb3NlZERhdGEucHJvcG9zZWRfb3JkZXIgfHwgbnVsbDtcbiAgICAgICAgICBoYXNKb2JBbmFseXNpcyA9IHByb3Bvc2VkRGF0YS5oYXNfam9iX2FuYWx5c2lzIHx8IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvZy53YXJuKCdDb3VsZCBub3QgbG9hZCBzdWdnZXN0ZWQgYnVsbGV0IG9yZGVyOicsIHByb3Bvc2VkUmVzLnN0YXR1cyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nLndhcm4oJ0NvdWxkIG5vdCBsb2FkIHN1Z2dlc3RlZCBidWxsZXQgb3JkZXI6JywgZSk7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc3QgZXJyb3JUZXh0ID0gZS5tZXNzYWdlID09PSAnRmFpbGVkIHRvIGZldGNoJ1xuICAgICAgPyAnRmFpbGVkIHRvIGZldGNoIChzZXJ2ZXIgdW5hdmFpbGFibGUpLidcbiAgICAgIDogZS5tZXNzYWdlO1xuICAgIGFwcGVuZFJldHJ5TWVzc2FnZSgnXHUyNkEwIENvdWxkIG5vdCBsb2FkIGJ1bGxldHM6ICcgKyBlcnJvclRleHQsICgpID0+IHNob3dCdWxsZXRSZW9yZGVyKGV4cElkLCBleHBUaXRsZSkpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIWFjaGlldmVtZW50cy5sZW5ndGgpIHtcbiAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnTm8gYnVsbGV0IHBvaW50cyBmb3VuZCBmb3IgdGhpcyBleHBlcmllbmNlLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFNhdmUgZm9jdXMgb3JpZ2luIGZvciByZXN0b3JhdGlvbiBvbiBjbG9zZSAoR0FQLTE3NilcbiAgaWYgKHR5cGVvZiBfZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBfZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIH1cblxuICAvLyBCdWlsZCBtb2RhbCBjb250ZW50XG4gIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIG1vZGFsLmlkID0gJ2J1bGxldC1yZW9yZGVyLW1vZGFsJztcbiAgbW9kYWwuc2V0QXR0cmlidXRlKCdyb2xlJywgJ2RpYWxvZycpO1xuICBtb2RhbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbW9kYWwnLCAndHJ1ZScpO1xuICBtb2RhbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWxsZWRieScsICdidWxsZXQtcmVvcmRlci10aXRsZScpO1xuICBtb2RhbC5zdHlsZS5jc3NUZXh0ID0gYFxuICAgIHBvc2l0aW9uOmZpeGVkO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JhY2tncm91bmQ6cmdiYSgwLDAsMCwwLjUpO1xuICAgIHotaW5kZXg6OTk5OTtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7YDtcblxuICBjb25zdCBzdWdnZXN0ZWRCdG4gPSBoYXNKb2JBbmFseXNpc1xuICAgID8gYDxidXR0b24gY2xhc3M9XCJidG4tc2Vjb25kYXJ5XCIgaWQ9XCJ1c2UtbGxtLW9yZGVyLWJ0blwiIHRpdGxlPVwiQXBwbHkgam9iLXJlbGV2YW5jZSByYW5raW5nIGZyb20geW91ciBqb2IgYW5hbHlzaXNcIlxuICAgICAgICAgc3R5bGU9XCJjb2xvcjojNjM2NmYxO2JvcmRlci1jb2xvcjojNjM2NmYxO1wiPlx1MjcyOCBVc2UgU3VnZ2VzdGVkIE9yZGVyPC9idXR0b24+YFxuICAgIDogJyc7XG4gIGNvbnN0IHN1Z2dlc3Rpb25NZXRhID0gcHJvcG9zZWRSZWFzb25pbmcgfHwgcHJvcG9zZWRBdHNJbXBhY3QgfHwgcHJvcG9zZWRQYWdlSW1wYWN0XG4gICAgPyBgPGRpdiBpZD1cImJ1bGxldC1vcmRlci1haS1ub3RlXCIgc3R5bGU9XCJmb250LXNpemU6MC44MmVtO2NvbG9yOiM0MzM4Y2E7YmFja2dyb3VuZDojZWVmMmZmO2JvcmRlcjoxcHggc29saWQgI2M3ZDJmZTtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjEwcHggMTJweDttYXJnaW4tYm90dG9tOjEycHg7XCI+XG4gICAgICAgICR7cHJvcG9zZWRSZWFzb25pbmcgPyBgPGRpdj48c3Ryb25nPkFJIHJhdGlvbmFsZTo8L3N0cm9uZz4gJHtlc2NhcGVIdG1sKHByb3Bvc2VkUmVhc29uaW5nKX08L2Rpdj5gIDogJyd9XG4gICAgICAgICR7cHJvcG9zZWRBdHNJbXBhY3QgPyBgPGRpdj48c3Ryb25nPkFUUyBpbXBhY3Q6PC9zdHJvbmc+ICR7ZXNjYXBlSHRtbChwcm9wb3NlZEF0c0ltcGFjdCl9PC9kaXY+YCA6ICcnfVxuICAgICAgICAke3Byb3Bvc2VkUGFnZUltcGFjdCA/IGA8ZGl2PjxzdHJvbmc+UGFnZSBsZW5ndGggaW1wYWN0Ojwvc3Ryb25nPiAke2VzY2FwZUh0bWwocHJvcG9zZWRQYWdlSW1wYWN0KX08L2Rpdj5gIDogJyd9XG4gICAgICA8L2Rpdj5gXG4gICAgOiAnJztcblxuICBtb2RhbC5pbm5lckhUTUwgPSBgXG4gICAgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2ZmZjtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjI0cHg7bWF4LXdpZHRoOjY0MHB4O3dpZHRoOjkyJTtcbiAgICAgICAgICAgICAgICBtYXgtaGVpZ2h0Ojgwdmg7b3ZlcmZsb3cteTphdXRvO2JveC1zaGFkb3c6MCAyMHB4IDYwcHggcmdiYSgwLDAsMCwwLjMpO1wiPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjthbGlnbi1pdGVtczpmbGV4LXN0YXJ0O21hcmdpbi1ib3R0b206MTZweDtcIj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8aDMgaWQ9XCJidWxsZXQtcmVvcmRlci10aXRsZVwiIHN0eWxlPVwibWFyZ2luOjA7Y29sb3I6IzFmMjkzNztcIj5cdTIxOTUgUmVvcmRlciBCdWxsZXRzPC9oMz5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiY29sb3I6IzZiNzI4MDtmb250LXNpemU6MC45ZW07bWFyZ2luLXRvcDo0cHg7XCI+JHtleHBUaXRsZX08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxidXR0b24gYXJpYS1sYWJlbD1cIkNsb3NlIHJlb3JkZXIgZGlhbG9nXCJcbiAgICAgICAgICBvbmNsaWNrPVwicmVzdG9yZUZvY3VzKCk7ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J1bGxldC1yZW9yZGVyLW1vZGFsJykucmVtb3ZlKClcIlxuICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDpub25lO2JvcmRlcjpub25lO2ZvbnQtc2l6ZToxLjRlbTtjdXJzb3I6cG9pbnRlcjtjb2xvcjojNmI3MjgwO1wiPlx1MjcxNTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtjb2xvcjojNmI3MjgwO21hcmdpbi1ib3R0b206MTJweDtcIj5cbiAgICAgICAgVXNlIFx1MjE5MSBcdTIxOTMgdG8gcmVvcmRlci4gQnVsbGV0cyBoaWdoZXIgaW4gdGhlIGxpc3QgYXBwZWFyIGZpcnN0IG9uIHlvdXIgQ1YuXG4gICAgICAgIFRoZSBtb3N0IHJlbGV2YW50IGJ1bGxldCB3aWxsIGJlIGF1dG8tcmFua2VkIGhpZ2hlc3QgaWYgeW91IHJlc2V0LlxuICAgICAgPC9kaXY+XG4gICAgICAke3N1Z2dlc3Rpb25NZXRhfVxuICAgICAgPG9sIGlkPVwiYnVsbGV0LXJlb3JkZXItbGlzdFwiIHN0eWxlPVwicGFkZGluZzowO21hcmdpbjowO2xpc3Qtc3R5bGU6bm9uZTtcIj5cbiAgICAgIDwvb2w+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDoxMHB4O21hcmdpbi10b3A6MThweDtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmQ7XCI+XG4gICAgICAgICR7c3VnZ2VzdGVkQnRufVxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLXNlY29uZGFyeVwiIG9uY2xpY2s9XCJyZXNldEJ1bGxldE9yZGVyKCcke2V4cElkfScpXCI+XHUyMUJBIFJlc2V0IHRvIEF1dG88L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1wcmltYXJ5XCIgICBvbmNsaWNrPVwic2F2ZUJ1bGxldE9yZGVyKCcke2V4cElkfScpO3Jlc3RvcmVGb2N1cygpXCI+U2F2ZSBPcmRlcjwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+YDtcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChtb2RhbCk7XG4gIGlmICh0eXBlb2YgdHJhcEZvY3VzID09PSAnZnVuY3Rpb24nKSB0cmFwRm9jdXMoJ2J1bGxldC1yZW9yZGVyLW1vZGFsJyk7XG4gIGlmICh0eXBlb2Ygc2V0SW5pdGlhbEZvY3VzID09PSAnZnVuY3Rpb24nKSBzZXRJbml0aWFsRm9jdXMoJ2J1bGxldC1yZW9yZGVyLW1vZGFsJyk7XG5cbiAgLy8gQ2xvc2Ugb24gRXNjYXBlXG4gIGNvbnN0IGVzY0hhbmRsZXIgPSAoZSkgPT4ge1xuICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHJlc3RvcmVGb2N1cygpO1xuICAgICAgbW9kYWwucmVtb3ZlKCk7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZXNjSGFuZGxlcik7XG4gICAgfVxuICB9O1xuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZXNjSGFuZGxlcik7XG5cbiAgLy8gUG9wdWxhdGUgbGlzdCBpdGVtc1xuICBjb25zdCBsaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J1bGxldC1yZW9yZGVyLWxpc3QnKTtcbiAgYWNoaWV2ZW1lbnRzLmZvckVhY2goKGFjaCwgaWR4KSA9PiB7XG4gICAgY29uc3QgdGV4dCA9ICh0eXBlb2YgYWNoID09PSAnb2JqZWN0JyA/IChhY2gudGV4dCB8fCAnJykgOiBTdHJpbmcoYWNoKSk7XG4gICAgY29uc3QgbGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpO1xuICAgIGxpLmRhdGFzZXQub3JpZ0luZGV4ID0gaWR4O1xuICAgIGxpLnN0eWxlLmNzc1RleHQgPSBgZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmZsZXgtc3RhcnQ7Z2FwOjhweDtwYWRkaW5nOjhweDttYXJnaW4tYm90dG9tOjZweDtcbiAgICAgIGJhY2tncm91bmQ6I2Y4ZmFmYztib3JkZXI6MXB4IHNvbGlkICNlMmU4ZjA7Ym9yZGVyLXJhZGl1czo2cHg7YDtcbiAgICBsaS5pbm5lckhUTUwgPSBgXG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtnYXA6MnB4O2ZsZXgtc2hyaW5rOjA7XCI+XG4gICAgICAgIDxidXR0b24gdGl0bGU9XCJNb3ZlIHVwXCIgYXJpYS1sYWJlbD1cIk1vdmUgYnVsbGV0IHVwXCJcbiAgICAgICAgICBvbmNsaWNrPVwibW92ZUJ1bGxldCh0aGlzLC0xKVwiXG4gICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOjFweCBzb2xpZCAjZDFkNWRiO2JvcmRlci1yYWRpdXM6M3B4O1xuICAgICAgICAgICAgICAgICBjdXJzb3I6cG9pbnRlcjtwYWRkaW5nOjFweCA1cHg7bGluZS1oZWlnaHQ6MS4yO2ZvbnQtc2l6ZTowLjllbTtcIj5cdTIxOTE8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiB0aXRsZT1cIk1vdmUgZG93blwiIGFyaWEtbGFiZWw9XCJNb3ZlIGJ1bGxldCBkb3duXCJcbiAgICAgICAgICBvbmNsaWNrPVwibW92ZUJ1bGxldCh0aGlzLCsxKVwiXG4gICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOjFweCBzb2xpZCAjZDFkNWRiO2JvcmRlci1yYWRpdXM6M3B4O1xuICAgICAgICAgICAgICAgICBjdXJzb3I6cG9pbnRlcjtwYWRkaW5nOjFweCA1cHg7bGluZS1oZWlnaHQ6MS4yO2ZvbnQtc2l6ZTowLjllbTtcIj5cdTIxOTM8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPHNwYW4gc3R5bGU9XCJmbGV4OjE7Zm9udC1zaXplOjAuOWVtO1wiPiR7dGV4dH08L3NwYW4+YDtcbiAgICBsaXN0LmFwcGVuZENoaWxkKGxpKTtcbiAgfSk7XG4gIF91cGRhdGVCdWxsZXRBcnJvd3MoKTtcblxuICAvLyBXaXJlIHVwIFwiVXNlIFN1Z2dlc3RlZCBPcmRlclwiIGJ1dHRvbiBpZiBqb2IgYW5hbHlzaXMgaXMgYXZhaWxhYmxlXG4gIGlmIChoYXNKb2JBbmFseXNpcyAmJiBwcm9wb3NlZE9yZGVyKSB7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VzZS1sbG0tb3JkZXItYnRuJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgX2FwcGx5QnVsbGV0T3JkZXIocHJvcG9zZWRPcmRlcik7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2FwcGx5QnVsbGV0T3JkZXIob3JkZXIpIHtcbiAgY29uc3QgbGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidWxsZXQtcmVvcmRlci1saXN0Jyk7XG4gIGlmICghbGlzdCkgcmV0dXJuO1xuICBjb25zdCBpdGVtcyA9IEFycmF5LmZyb20obGlzdC5xdWVyeVNlbGVjdG9yQWxsKCdsaScpKTtcbiAgLy8gQnVpbGQgYSBtYXAgZnJvbSBvcmlnSW5kZXggXHUyMTkyIGxpIGVsZW1lbnRcbiAgY29uc3QgYnlPcmlnID0ge307XG4gIGl0ZW1zLmZvckVhY2gobGkgPT4geyBieU9yaWdbcGFyc2VJbnQobGkuZGF0YXNldC5vcmlnSW5kZXgsIDEwKV0gPSBsaTsgfSk7XG4gIC8vIFJlLWFwcGVuZCBpbiBwcm9wb3NlZCBvcmRlciwgdGhlbiBhbnkgbm90IGxpc3RlZFxuICBjb25zdCBsaXN0ZWQgPSBuZXcgU2V0KG9yZGVyLm1hcChOdW1iZXIpKTtcbiAgb3JkZXIuZm9yRWFjaChpZHggPT4geyBpZiAoYnlPcmlnW2lkeF0pIGxpc3QuYXBwZW5kQ2hpbGQoYnlPcmlnW2lkeF0pOyB9KTtcbiAgaXRlbXMuZm9yRWFjaChsaSA9PiB7XG4gICAgaWYgKCFsaXN0ZWQuaGFzKHBhcnNlSW50KGxpLmRhdGFzZXQub3JpZ0luZGV4LCAxMCkpKSBsaXN0LmFwcGVuZENoaWxkKGxpKTtcbiAgfSk7XG4gIF91cGRhdGVCdWxsZXRBcnJvd3MoKTtcbn1cblxuZnVuY3Rpb24gbW92ZUJ1bGxldChidG4sIGRpcmVjdGlvbikge1xuICBjb25zdCBsaSAgID0gYnRuLmNsb3Nlc3QoJ2xpJyk7XG4gIGNvbnN0IGxpc3QgPSBsaS5wYXJlbnROb2RlO1xuICBpZiAoZGlyZWN0aW9uID09PSAtMSAmJiBsaS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nKSB7XG4gICAgbGlzdC5pbnNlcnRCZWZvcmUobGksIGxpLnByZXZpb3VzRWxlbWVudFNpYmxpbmcpO1xuICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gKzEgJiYgbGkubmV4dEVsZW1lbnRTaWJsaW5nKSB7XG4gICAgbGlzdC5pbnNlcnRCZWZvcmUobGkubmV4dEVsZW1lbnRTaWJsaW5nLCBsaSk7XG4gIH1cbiAgX3VwZGF0ZUJ1bGxldEFycm93cygpO1xufVxuXG5mdW5jdGlvbiBfdXBkYXRlQnVsbGV0QXJyb3dzKCkge1xuICBjb25zdCBsaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J1bGxldC1yZW9yZGVyLWxpc3QnKTtcbiAgaWYgKCFsaXN0KSByZXR1cm47XG4gIGNvbnN0IGl0ZW1zID0gbGlzdC5xdWVyeVNlbGVjdG9yQWxsKCdsaScpO1xuICBpdGVtcy5mb3JFYWNoKChsaSwgaWR4KSA9PiB7XG4gICAgY29uc3QgW3VwQnRuLCBkb3duQnRuXSA9IGxpLnF1ZXJ5U2VsZWN0b3JBbGwoJ2J1dHRvbicpO1xuICAgIHVwQnRuLmRpc2FibGVkICAgPSBpZHggPT09IDA7XG4gICAgZG93bkJ0bi5kaXNhYmxlZCA9IGlkeCA9PT0gaXRlbXMubGVuZ3RoIC0gMTtcbiAgICB1cEJ0bi5zdHlsZS5vcGFjaXR5ICAgPSB1cEJ0bi5kaXNhYmxlZCAgID8gJzAuMycgOiAnMSc7XG4gICAgZG93bkJ0bi5zdHlsZS5vcGFjaXR5ID0gZG93bkJ0bi5kaXNhYmxlZCA/ICcwLjMnIDogJzEnO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZUJ1bGxldE9yZGVyKGV4cElkKSB7XG4gIGNvbnN0IGxpc3QgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J1bGxldC1yZW9yZGVyLWxpc3QnKTtcbiAgY29uc3QgaXRlbXMgPSBsaXN0ID8gbGlzdC5xdWVyeVNlbGVjdG9yQWxsKCdsaScpIDogW107XG4gIGNvbnN0IG9yZGVyID0gQXJyYXkuZnJvbShpdGVtcykubWFwKGxpID0+IHBhcnNlSW50KGxpLmRhdGFzZXQub3JpZ0luZGV4LCAxMCkpO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9yZW9yZGVyLWJ1bGxldHMnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeydDb250ZW50LVR5cGUnOidhcHBsaWNhdGlvbi9qc29uJ30sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7ZXhwZXJpZW5jZV9pZDogZXhwSWQsIG9yZGVyfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKCFyZXMub2sgfHwgIWRhdGEub2spIHtcbiAgICAgIGFwcGVuZFJldHJ5TWVzc2FnZSgnXHUyNkEwIENvdWxkIG5vdCBzYXZlIGJ1bGxldCBvcmRlcjogJyArIChkYXRhLmVycm9yfHwnVW5rbm93bicpLCAoKSA9PiBzYXZlQnVsbGV0T3JkZXIoZXhwSWQpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ1x1MjE5NSBCdWxsZXQgb3JkZXIgc2F2ZWQuIEl0IHdpbGwgYXBwbHkgd2hlbiB5b3UgZ2VuZXJhdGUgdGhlIENWLicpO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidWxsZXQtcmVvcmRlci1tb2RhbCcpPy5yZW1vdmUoKTtcbiAgfSBjYXRjaChlKSB7XG4gICAgYXBwZW5kUmV0cnlNZXNzYWdlKCdcdTI2QTAgTmV0d29yayBlcnJvciBzYXZpbmcgYnVsbGV0IG9yZGVyOiAnICsgZS5tZXNzYWdlLCAoKSA9PiBzYXZlQnVsbGV0T3JkZXIoZXhwSWQpKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZXNldEJ1bGxldE9yZGVyKGV4cElkKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL3Jlb3JkZXItYnVsbGV0cycsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7J0NvbnRlbnQtVHlwZSc6J2FwcGxpY2F0aW9uL2pzb24nfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtleHBlcmllbmNlX2lkOiBleHBJZCwgb3JkZXI6IFtdfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKCFyZXMub2sgfHwgIWRhdGEub2spIHtcbiAgICAgIGFwcGVuZFJldHJ5TWVzc2FnZSgnXHUyNkEwIENvdWxkIG5vdCByZXNldCBidWxsZXQgb3JkZXI6ICcgKyAoZGF0YS5lcnJvcnx8J1Vua25vd24nKSwgKCkgPT4gcmVzZXRCdWxsZXRPcmRlcihleHBJZCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCAnXHUyMUJBIEJ1bGxldCBvcmRlciByZXNldC4gUmVsZXZhbmNlLWJhc2VkIG9yZGVyaW5nIHdpbGwgYXBwbHkuJyk7XG4gICAgcmVzdG9yZUZvY3VzKCk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J1bGxldC1yZW9yZGVyLW1vZGFsJyk/LnJlbW92ZSgpO1xuICB9IGNhdGNoKGUpIHtcbiAgICBhcHBlbmRSZXRyeU1lc3NhZ2UoJ1x1MjZBMCBOZXR3b3JrIGVycm9yIHJlc2V0dGluZyBidWxsZXQgb3JkZXI6ICcgKyBlLm1lc3NhZ2UsICgpID0+IHJlc2V0QnVsbGV0T3JkZXIoZXhwSWQpKTtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgRm9yd2FyZC1za2lwIHBoYXNlIHdhdGVybWFyayAoR0FQLTEwMSkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8vIEJhY2tlbmQgcGhhc2Ugb3JkZXJpbmcgKG1hdGNoZXMgY29udmVyc2F0aW9uX21hbmFnZXIucHkgX1BIQVNFX09SREVSKS5cbmNvbnN0IF9QSEFTRV9QUk9HUkVTU0lPTiA9IFtcbiAgJ2luaXQnLCAnam9iX2FuYWx5c2lzJywgJ2N1c3RvbWl6YXRpb24nLCAncmV3cml0ZV9yZXZpZXcnLFxuICAnc3BlbGxfY2hlY2snLCAnZ2VuZXJhdGlvbicsICdsYXlvdXRfcmV2aWV3JywgJ2ZpbmFsX2dlbmVyYXRpb24nLCAncmVmaW5lbWVudCcsXG5dO1xuXG4vLyBNaW5pbXVtIGhpZ2hlc3RQaGFzZSBpbmRleCByZXF1aXJlZCBmb3IgZWFjaCBzdGVwIHRvIGJlIGZvcndhcmQtc2tpcHBhYmxlLlxuY29uc3QgX1NURVBfRldEX1BIQVNFX01JTiA9IHtcbiAgYW5hbHlzaXM6ICAgICAgIDEsICAgLy8gam9iX2FuYWx5c2lzXG4gIGN1c3RvbWl6YXRpb25zOiAyLCAgIC8vIGN1c3RvbWl6YXRpb25cbiAgcmV3cml0ZTogICAgICAgIDMsICAgLy8gcmV3cml0ZV9yZXZpZXdcbiAgc3BlbGw6ICAgICAgICAgIDQsICAgLy8gc3BlbGxfY2hlY2tcbiAgbGF5b3V0OiAgICAgICAgIDUsICAgLy8gZ2VuZXJhdGlvblxuICBkb3dubG9hZDogICAgICAgNywgICAvLyBmaW5hbF9nZW5lcmF0aW9uXG4gIGNvdmVyX2xldHRlcjogICA3LFxuICBzY3JlZW5pbmc6ICAgICAgNyxcbiAgaW50ZXJ2aWV3X3ByZXA6IDcsXG4gIHRoYW5rX3lvdTogICAgICA3LFxuICBoYXJ2ZXN0OiAgICAgICAgNyxcbn07XG5cbi8vIFx1MjUwMFx1MjUwMCBXb3JrZmxvdyBzdGVwIGJhciBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gdXBkYXRlV29ya2Zsb3dTdGVwcyhzdGF0dXMpIHtcbiAgLy8gMTItc3RlcCB3b3JrZmxvdyBiYXI6IEpvYiBJbnB1dCBcdTIxOTIgQW5hbHlzaXMgXHUyMTkyIEN1c3RvbWlzZSBcdTIxOTIgUmV3cml0ZXMgXHUyMTkyXG4gIC8vICAgU3BlbGwgQ2hlY2sgXHUyMTkyIExheW91dCBSZXZpZXcgXHUyMTkyIERvd25sb2FkIFx1MjE5MiBDb3ZlciBMZXR0ZXIgXHUyMTkyIFNjcmVlbmluZyBcdTIxOTJcbiAgLy8gICBJbnRlcnZpZXcgUHJlcCBcdTIxOTIgVGhhbmsgWW91IFx1MjE5MiBIYXJ2ZXN0XG4gIC8vXG4gIGNvbnN0IFVQQ09NSU5HID0gbmV3IFNldCgpO1xuXG4gIC8vIFN0ZXBzIHRoYXQgc3VwcG9ydCBMTE0gcmUtZXhlY3V0aW9uIHZpYSAvYXBpL3JlLXJ1bi1waGFzZVxuICBjb25zdCBSRV9SVU5fU1RFUFMgPSBuZXcgU2V0KFsnYW5hbHlzaXMnLCAnY3VzdG9taXphdGlvbnMnLCAncmV3cml0ZScsICdzcGVsbCcsICdsYXlvdXQnXSk7XG5cbiAgLy8gQmFzZSBsYWJlbCBmb3IgZWFjaCBzdGVwICh1c2VkIHdoZW4gaW5qZWN0aW5nIFx1MjFCQiBidXR0b24pXG4gIGNvbnN0IFNURVBfTEFCRUxTID0ge1xuICAgIGpvYjogICAgICAgICAgICAnXHVEODNEXHVEQ0U1IEpvYiBJbnB1dCcsXG4gICAgYW5hbHlzaXM6ICAgICAgICdcdUQ4M0RcdUREMEQgQW5hbHlzaXMnLFxuICAgIGN1c3RvbWl6YXRpb25zOiAnXHUyNjk5XHVGRTBGIEN1c3RvbWlzZScsXG4gICAgcmV3cml0ZTogICAgICAgICdcdTI3MEZcdUZFMEYgUmV3cml0ZXMnLFxuICAgIHNwZWxsOiAgICAgICAgICAnXHVEODNEXHVERDI0IFNwZWxsIENoZWNrJyxcbiAgICBsYXlvdXQ6ICAgICAgICAgJ1x1RDgzQ1x1REZBOCBMYXlvdXQgUmV2aWV3JyxcbiAgICBkb3dubG9hZDogICAgICAgJ1x1MkIwN1x1RkUwRiBEb3dubG9hZCBGaWxlcycsXG4gICAgY292ZXJfbGV0dGVyOiAgICdcdUQ4M0RcdURDRTkgQ292ZXIgTGV0dGVyJyxcbiAgICBzY3JlZW5pbmc6ICAgICAgJ1x1RDgzRFx1RENDQiBTY3JlZW5pbmcnLFxuICAgIGludGVydmlld19wcmVwOiAnXHVEODNDXHVERkE0IEludGVydmlldyBQcmVwJyxcbiAgICB0aGFua195b3U6ICAgICAgJ1x1RDgzRFx1REU0RiBUaGFuayBZb3UnLFxuICAgIGhhcnZlc3Q6ICAgICAgICAnXHVEODNDXHVERjNFIEhhcnZlc3QnLFxuICB9O1xuXG4gIC8vIERldGVybWluZSB3aGljaCBzdGVwcyBhcmUgZG9uZSBiYXNlZCBvbiBzZXNzaW9uIHN0YXRlIGZpZWxkcy5cbiAgY29uc3QgcGhhc2UgPSBzdGF0dXMucGhhc2UgfHwgJyc7XG4gIC8vIEFsbCBwb3N0LWxheW91dCBwaGFzZXMgdW5sb2NrIHNpbXVsdGFuZW91c2x5IG9uY2UgbGF5b3V0IGlzIGNvbmZpcm1lZC5cbiAgY29uc3QgcG9zdExheW91dCA9IHBoYXNlID09PSBQSEFTRVMuRklOQUxfR0VORVJBVElPTiB8fCBwaGFzZSA9PT0gUEhBU0VTLlJFRklORU1FTlQ7XG4gIGNvbnN0IGRvbmUgPSB7XG4gICAgam9iOiAgICAgICAgICAgICEhc3RhdHVzLmpvYl9kZXNjcmlwdGlvbixcbiAgICBhbmFseXNpczogICAgICAgISFzdGF0dXMuam9iX2FuYWx5c2lzLFxuICAgIGN1c3RvbWl6YXRpb25zOiAhIXN0YXR1cy5jdXN0b21pemF0aW9ucyxcbiAgICByZXdyaXRlOiAgICAgICAgcGhhc2UgIT09IFBIQVNFUy5SRVdSSVRFX1JFVklFVyAmJiAoISFzdGF0dXMuY3VzdG9taXphdGlvbnMpLFxuICAgIHNwZWxsOiAgICAgICAgICBwaGFzZSA9PT0gUEhBU0VTLkdFTkVSQVRJT04gfHwgcGhhc2UgPT09IFBIQVNFUy5MQVlPVVRfUkVWSUVXIHx8XG4gICAgICAgICAgICAgICAgICAgIHBoYXNlID09PSBQSEFTRVMuRklOQUxfR0VORVJBVElPTiB8fCBwaGFzZSA9PT0gUEhBU0VTLlJFRklORU1FTlQsXG4gICAgbGF5b3V0OiAgICAgICAgIHBvc3RMYXlvdXQsXG4gICAgZG93bmxvYWQ6ICAgICAgIHBvc3RMYXlvdXQsXG4gICAgY292ZXJfbGV0dGVyOiAgIHBvc3RMYXlvdXQsXG4gICAgc2NyZWVuaW5nOiAgICAgIHBvc3RMYXlvdXQsXG4gICAgaW50ZXJ2aWV3X3ByZXA6IHBvc3RMYXlvdXQsXG4gICAgdGhhbmtfeW91OiAgICAgIHBvc3RMYXlvdXQsXG4gICAgaGFydmVzdDogICAgICAgIHBvc3RMYXlvdXQsXG4gIH07XG5cbiAgLy8gRm9yd2FyZC1za2lwIHdhdGVybWFyayAoR0FQLTEwMSk6IHN0ZXBzIHByZXZpb3VzbHkgcmVhY2hlZCBidXQgbm90IGN1cnJlbnRseVxuICAvLyBcImRvbmVcIiBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgcGhhc2UgYXJlIHN0aWxsIG5hdmlnYWJsZSB3aXRoIGEgY29uZmlybWF0aW9uLlxuICBjb25zdCBoaWdoZXN0UGhhc2VJZHggPSBfUEhBU0VfUFJPR1JFU1NJT04uaW5kZXhPZihzdGF0dXMuaGlnaGVzdF9waGFzZSB8fCAnJyk7XG4gIGNvbnN0IGN1cnJlbnRQaGFzZUlkeCA9IF9QSEFTRV9QUk9HUkVTU0lPTi5pbmRleE9mKHBoYXNlKTtcblxuICAvLyBEZXRlcm1pbmUgdGhlIGFjdGl2ZSBzdGVwIGZyb20gdGhlIGJhY2tlbmQgcGhhc2Ugc3RyaW5nLlxuICBjb25zdCBwaGFzZVRvU3RlcCA9IHtcbiAgICAnaW5pdCc6ICAgICAgICAgICAgICdqb2InLFxuICAgICdqb2JfYW5hbHlzaXMnOiAgICAgJ2FuYWx5c2lzJyxcbiAgICAnY3VzdG9taXphdGlvbic6ICAgICdjdXN0b21pemF0aW9ucycsXG4gICAgJ3Jld3JpdGVfcmV2aWV3JzogICAncmV3cml0ZScsXG4gICAgJ3NwZWxsX2NoZWNrJzogICAgICAnc3BlbGwnLFxuICAgICdnZW5lcmF0aW9uJzogICAgICAgJ2xheW91dCcsXG4gICAgJ2xheW91dF9yZXZpZXcnOiAgICAnbGF5b3V0JyxcbiAgICAnZmluYWxfZ2VuZXJhdGlvbic6ICdkb3dubG9hZCcsXG4gICAgJ3JlZmluZW1lbnQnOiAgICAgICAnZG93bmxvYWQnLFxuICB9O1xuICBjb25zdCBhY3RpdmVTdGVwID0gcGhhc2VUb1N0ZXBbcGhhc2VdIHx8ICdqb2InO1xuXG4gIC8vIFJlc29sdmUgdGhlIHJlZW50cnkgc3RlcCBmb3IgdGhlIFwiUmVmaW5pbmdcIiBiYWRnZVxuICBjb25zdCBfcGhhc2VUb1N0ZXAyID0gT2JqZWN0LmFzc2lnbih7J2luaXQnOiAnam9iJ30sIHBoYXNlVG9TdGVwKTtcbiAgY29uc3QgcmVlbnRyeVN0ZXAgPSBzdGF0dXMuaXRlcmF0aW5nXG4gICAgPyAoX3BoYXNlVG9TdGVwMltzdGF0dXMucmVlbnRyeV9waGFzZV0gfHwgc3RhdHVzLnJlZW50cnlfcGhhc2UgfHwgbnVsbClcbiAgICA6IG51bGw7XG5cbiAgY29uc3Qgc3RlcElkcyA9IFtcbiAgICAnam9iJywgJ2FuYWx5c2lzJywgJ2N1c3RvbWl6YXRpb25zJywgJ3Jld3JpdGUnLCAnc3BlbGwnLCAnbGF5b3V0JyxcbiAgICAnZG93bmxvYWQnLCAnY292ZXJfbGV0dGVyJywgJ3NjcmVlbmluZycsICdpbnRlcnZpZXdfcHJlcCcsICd0aGFua195b3UnLCAnaGFydmVzdCcsXG4gIF07XG4gIGNvbnN0IHN0YWxlU3RlcHMgPSBuZXcgU2V0KHN0YXR1cy5zdGFsZV9zdGVwcyB8fCBbXSk7XG4gIHN0ZXBJZHMuZm9yRWFjaChzdGVwID0+IHtcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzdGVwLSR7c3RlcH1gKTtcbiAgICBpZiAoIWVsKSByZXR1cm47XG4gICAgLy8gVXBjb21pbmcgc3RlcHMgYXJlIGZpeGVkIFx1MjAxNCBuZXZlciBjaGFuZ2UgdGhlaXIgY2xhc3MuXG4gICAgaWYgKFVQQ09NSU5HLmhhcyhzdGVwKSkgcmV0dXJuO1xuICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScsICdjb21wbGV0ZWQnLCAnY2xpY2thYmxlJywgJ3VwY29taW5nJywgJ3N0YWxlJywgJ2ZvcndhcmQtc2tpcCcpO1xuXG4gICAgbGV0IGxhYmVsID0gU1RFUF9MQUJFTFNbc3RlcF0gfHwgc3RlcDtcblxuICAgIGlmIChzdGVwID09PSBhY3RpdmVTdGVwKSB7XG4gICAgICBlbC5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICAgIC8vIFwiXHUyMUJCIFJlZmluaW5nXCIgYmFkZ2Ugc2hvd24gb24gdGhlIGFjdGl2ZSBzdGVwIHdoZW4gaXRlcmF0aW5nXG4gICAgICBpZiAoc3RhdHVzLml0ZXJhdGluZyAmJiByZWVudHJ5U3RlcCA9PT0gc3RlcCkge1xuICAgICAgICBsYWJlbCArPSAnIDxzcGFuIGNsYXNzPVwic3RlcC1pbmxpbmUtYmFkZ2VcIj5cdTIxQkIgUmVmaW5pbmc8L3NwYW4+JztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGRvbmVbc3RlcF0pIHtcbiAgICAgIGVsLmNsYXNzTGlzdC5hZGQoJ2NvbXBsZXRlZCcpO1xuICAgICAgLy8gQ29tcGxldGVkIHN0ZXBzIGFyZSBjbGlja2FibGUgZm9yIGJhY2stbmF2aWdhdGlvbi5cbiAgICAgIGVsLmNsYXNzTGlzdC5hZGQoJ2NsaWNrYWJsZScpO1xuICAgICAgLy8gQWRkIFx1MjFCQiByZS1ydW4gYnV0dG9uIGZvciBzdGVwcyB0aGF0IHN1cHBvcnQgTExNIHJlLWV4ZWN1dGlvblxuICAgICAgaWYgKFJFX1JVTl9TVEVQUy5oYXMoc3RlcCkpIHtcbiAgICAgICAgY29uc3QgcmVydW5MYWJlbCA9IF9TVEVQX0RJU1BMQVlbc3RlcF0gfHwgc3RlcDtcbiAgICAgICAgbGFiZWwgKz0gYCA8YnV0dG9uIGNsYXNzPVwic3RlcC1yZXJ1blwiIGFyaWEtbGFiZWw9XCJSZS1ydW4gJHtyZXJ1bkxhYmVsfVwiXG4gICAgICAgICAgdGl0bGU9XCJSZS1ydW4gJHtzdGVwfSB3aXRoIHVwZGF0ZWQgaW5wdXRzXCJcbiAgICAgICAgICBvbmNsaWNrPVwiZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7Y29uZmlybVJlUnVuUGhhc2UoJyR7c3RlcH0nKVwiXG4gICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6MC44ZW07b3BhY2l0eTowLjM1O3RyYW5zaXRpb246b3BhY2l0eSAwLjE1czttYXJnaW4tbGVmdDoycHg7Y3Vyc29yOnBvaW50ZXI7YmFja2dyb3VuZDpub25lO2JvcmRlcjpub25lO3BhZGRpbmc6MDtjb2xvcjppbmhlcml0O2xpbmUtaGVpZ2h0OjE7XCI+XHUyMUJCPC9idXR0b24+YDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGhpZ2hlc3RQaGFzZUlkeCA+PSAwICYmIChfU1RFUF9GV0RfUEhBU0VfTUlOW3N0ZXBdID8/IEluZmluaXR5KSA8PSBoaWdoZXN0UGhhc2VJZHhcbiAgICAgICAgICAgICAgICYmIGhpZ2hlc3RQaGFzZUlkeCA+IGN1cnJlbnRQaGFzZUlkeCkge1xuICAgICAgLy8gRm9yd2FyZC1za2lwOiBzdGVwIHdhcyBjb21wbGV0ZWQgaW4gYSBwcmlvciBpdGVyYXRpb24gYnV0IGlzIGFoZWFkIG9mIGN1cnJlbnQgcGhhc2UuXG4gICAgICBlbC5jbGFzc0xpc3QuYWRkKCdmb3J3YXJkLXNraXAnLCAnY2xpY2thYmxlJyk7XG4gICAgICBsYWJlbCArPSAnIDxzcGFuIGNsYXNzPVwic3RlcC1pbmxpbmUtYmFkZ2Ugc3RlcC1md2QtYmFkZ2VcIiB0aXRsZT1cIlByZXZpb3VzbHkgY29tcGxldGVkIFx1MjAxNCBjbGljayB0byBqdW1wIGFoZWFkXCI+XHUyM0U5PC9zcGFuPic7XG4gICAgfVxuXG4gICAgLy8gQXBwbHkgc3RhbGUgY2xhc3MgZm9yIHN0ZXBzIGRvd25zdHJlYW0gb2YgYSByZS1ydW5cbiAgICBpZiAoc3RhbGVTdGVwcy5oYXMoc3RlcCkpIGVsLmNsYXNzTGlzdC5hZGQoJ3N0YWxlJyk7XG5cbiAgICAvLyBBcHBlbmQgc3Itb25seSBzdGF0ZSBkZXNjcmlwdGlvbiBmb3Igc2NyZWVuIHJlYWRlciB1c2Vyc1xuICAgIGNvbnN0IGlzU3RhbGUgICAgICAgICA9IHN0YWxlU3RlcHMuaGFzKHN0ZXApO1xuICAgIGNvbnN0IGlzU3RhbGVDcml0aWNhbCA9IGVsLmNsYXNzTGlzdC5jb250YWlucygnc3RhbGUtY3JpdGljYWwnKTtcbiAgICBjb25zdCBpc0FjdGl2ZSAgICAgICAgPSBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2FjdGl2ZScpO1xuICAgIGNvbnN0IGlzQ29tcGxldGVkICAgICA9IGVsLmNsYXNzTGlzdC5jb250YWlucygnY29tcGxldGVkJyk7XG4gICAgY29uc3QgaXNGd2RTa2lwICAgICAgID0gZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdmb3J3YXJkLXNraXAnKTtcbiAgICBjb25zdCBzclN0YXRlID0gaXNTdGFsZUNyaXRpY2FsID8gJyAoY3JpdGljYWwgXHUyMDE0IHJldmlldyByZXF1aXJlZCknXG4gICAgICA6IGlzU3RhbGUgICAgID8gJyAoc3RhbGUgXHUyMDE0IHJlc3VsdHMgbWF5IGJlIG91dGRhdGVkKSdcbiAgICAgIDogaXNBY3RpdmUgICAgPyAnIChjdXJyZW50IHN0ZXApJ1xuICAgICAgOiBpc0NvbXBsZXRlZCA/ICcgKGNvbXBsZXRlZCknXG4gICAgICA6IGlzRndkU2tpcCAgID8gJyAocHJldmlvdXNseSBjb21wbGV0ZWQgXHUyMDE0IGNsaWNrIHRvIGp1bXAgYWhlYWQpJ1xuICAgICAgOiAnJztcbiAgICBpZiAoc3JTdGF0ZSkgbGFiZWwgKz0gYDxzcGFuIGNsYXNzPVwic3Itb25seVwiPiR7c3JTdGF0ZX08L3NwYW4+YDtcblxuICAgIGVsLmlubmVySFRNTCA9IGxhYmVsO1xuICB9KTtcblxuICBhcHBseUxheW91dEZyZXNobmVzc05hdmlnYXRpb25TdGF0ZSgpO1xuXG4gIC8vIFNob3cgXHUyMUJCIGljb25zIHZpYSBDU1MgOmhvdmVyIG9uIHRoZSBwYXJlbnQgLmNvbXBsZXRlZCBzdGVwXG4gIC8vIChpbmplY3QgYSA8c3R5bGU+IG9ubHkgb25jZSlcbiAgaWYgKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RlcC1yZXJ1bi1zdHlsZScpKSB7XG4gICAgY29uc3QgcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgcy5pZCA9ICdzdGVwLXJlcnVuLXN0eWxlJztcbiAgICBzLnRleHRDb250ZW50ID0gJy5zdGVwLmNvbXBsZXRlZDpob3ZlciAuc3RlcC1yZXJ1biwgLnN0ZXAuY29tcGxldGVkOmZvY3VzLXdpdGhpbiAuc3RlcC1yZXJ1biB7IG9wYWNpdHk6IDEgIWltcG9ydGFudDsgfSAuc3RlcC1yZXJ1bjpmb2N1cy12aXNpYmxlIHsgb3V0bGluZTogMnB4IHNvbGlkICMzYjgyZjY7IG91dGxpbmUtb2Zmc2V0OiAycHg7IG9wYWNpdHk6IDEgIWltcG9ydGFudDsgfSc7XG4gICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzKTtcbiAgfVxuXG4gIC8vIFN5bmMgc2Vjb25kLWJhciB0YWIgdmlzaWJpbGl0eSBhbmQgYWN0aW9uIGJ1dHRvbnMgdG8gdGhlIGFjdGl2ZSB3b3JrZmxvdyBzdGVwXG4gIGlmICh0eXBlb2YgdXBkYXRlVGFiQmFyRm9yU3RhZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICB1cGRhdGVUYWJCYXJGb3JTdGFnZShhY3RpdmVTdGVwKTtcbiAgfVxuICB1cGRhdGVBY3Rpb25CdXR0b25zKGFjdGl2ZVN0ZXApO1xuXG4gIC8vIFN5bmMgdmlldy1jdXJzb3IgcmluZyB0byB0aGUgY3VycmVudGx5IHZpc2libGUgdGFiXG4gIF91cGRhdGVWaWV3aW5nSW5kaWNhdG9yKHN0YXRlTWFuYWdlci5nZXRDdXJyZW50VGFiKCkpO1xufVxuXG5pZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoR0VORVJBVElPTl9TVEFURV9FVkVOVCwgYXBwbHlMYXlvdXRGcmVzaG5lc3NOYXZpZ2F0aW9uU3RhdGUpO1xuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihHRU5FUkFUSU9OX1NUQVRFX0VWRU5ULCBhcHBseURpcnR5UGhhc2VOYXZpZ2F0aW9uU3RhdGUpO1xufVxuXG4vKipcbiAqIE1hcmsgb3IgdW5tYXJrIHdvcmtmbG93IHN0ZXAgcGlsbHMgYXMgc3RhbGUgYmFzZWQgb24gZGlydHkgcGhhc2VzIHNldCBieVxuICogbGF5b3V0LXBoYXNlIGNvbnRlbnQgZWRpdHMgKFBPU1QgL2FwaS9jdi9hcHBseS1jb250ZW50LWNoYW5nZXMpLlxuICpcbiAqIE9ubHkgYWZmZWN0cyBzdGVwcyBsaXN0ZWQgaW4gc3RhdGVNYW5hZ2VyLmdldERpcnR5UGhhc2VzKCkgdGhhdCBhcmUgTk9UXG4gKiBhbHJlYWR5IGhhbmRsZWQgYnkgYXBwbHlMYXlvdXRGcmVzaG5lc3NOYXZpZ2F0aW9uU3RhdGUgKGkuZS4gbm90ICdsYXlvdXQnKS5cbiAqL1xuZnVuY3Rpb24gYXBwbHlEaXJ0eVBoYXNlTmF2aWdhdGlvblN0YXRlKCkge1xuICBjb25zdCBkaXJ0eVBoYXNlcyA9IHN0YXRlTWFuYWdlci5nZXREaXJ0eVBoYXNlcygpO1xuICBjb25zdCBzdGVwc1RvQ2xlYXIgPSBbXTsgICAgLy8gc3RlcHMgd2UgbWFuYWdlIGhlcmUgKG5vdCAnbGF5b3V0JylcblxuICBzdGVwc1RvQ2xlYXIuZm9yRWFjaChzdGVwID0+IHtcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzdGVwLSR7c3RlcH1gKTtcbiAgICBpZiAoIWVsKSByZXR1cm47XG5cbiAgICBjb25zdCBpc0RpcnR5ID0gZGlydHlQaGFzZXMuaW5jbHVkZXMoc3RlcCk7XG4gICAgZWwuY2xhc3NMaXN0LnRvZ2dsZSgnc3RhbGUnLCBpc0RpcnR5KTtcblxuICAgIC8vIFByZXNlcnZlIGV4aXN0aW5nIHJlcnVuIGJ1dHRvbiBtYXJrdXAsIHVwZGF0ZSB0ZXh0ICsgYmFkZ2VcbiAgICBjb25zdCByZXJ1bkh0bWwgPSBlbC5xdWVyeVNlbGVjdG9yKCcuc3RlcC1yZXJ1bicpPy5vdXRlckhUTUwgfHwgJyc7XG4gICAgY29uc3QgbGFiZWwgICAgID0gX1NURVBfRElTUExBWVtzdGVwXSB8fCBzdGVwO1xuICAgIGNvbnN0IGJhZGdlICAgICA9IGlzRGlydHlcbiAgICAgID8gJyA8c3BhbiBjbGFzcz1cInN0ZXAtaW5saW5lLWJhZGdlIHN0ZXAtc3RhbGUtYmFkZ2VcIj5Db250ZW50IGNoYW5nZWQ8L3NwYW4+J1xuICAgICAgOiAnJztcbiAgICBlbC5pbm5lckhUTUwgPSBgJHtsYWJlbH0ke2JhZGdlfSR7cmVydW5IdG1sID8gYCAke3JlcnVuSHRtbH1gIDogJyd9YDtcbiAgfSk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBTdGVwIG5hdmlnYXRpb24gaGVscGVyIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBfZG9TdGVwTmF2aWdhdGUoc3RlcCkge1xuICBjb25zdCBzdGVwVG9UYWIgPSB7XG4gICAgYW5hbHlzaXM6ICAgICAgICdhbmFseXNpcycsXG4gICAgY3VzdG9taXphdGlvbnM6ICdnb2FscycsXG4gICAgcmV3cml0ZTogICAgICAgICdyZXdyaXRlJyxcbiAgICBzcGVsbDogICAgICAgICAgJ3NwZWxsJyxcbiAgICBsYXlvdXQ6ICAgICAgICAgJ2xheW91dCcsXG4gICAgZG93bmxvYWQ6ICAgICAgICdmaW5hbF9nZW5lcmF0ZScsXG4gICAgY292ZXJfbGV0dGVyOiAgICdjb3Zlci1sZXR0ZXInLFxuICAgIHNjcmVlbmluZzogICAgICAnc2NyZWVuaW5nJyxcbiAgICBpbnRlcnZpZXdfcHJlcDogJ2ludGVydmlldy1wcmVwJyxcbiAgICB0aGFua195b3U6ICAgICAgJ3RoYW5rLXlvdScsXG4gICAgaGFydmVzdDogICAgICAgICdoYXJ2ZXN0JyxcbiAgfTtcbiAgY29uc3QgdGFiTmFtZSA9IHN0ZXBUb1RhYltzdGVwXTtcbiAgaWYgKCF0YWJOYW1lKSByZXR1cm47XG4gIGlmICh0eXBlb2YgdXBkYXRlVGFiQmFyRm9yU3RhZ2UgPT09ICdmdW5jdGlvbicpIHVwZGF0ZVRhYkJhckZvclN0YWdlKHN0ZXApO1xuICBzd2l0Y2hUYWIodGFiTmFtZSk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBTdGVwIGNsaWNrIChiYWNrLW5hdikgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8vIEJhY2stbmF2aWdhdGlvbjogY2xpY2tpbmcgYSBjb21wbGV0ZWQgd29ya2Zsb3cgc3RlcCBuYXZpZ2F0ZXMgdG8gaXRzIHZpZXdlciB0YWIuXG4vLyBDbGlja2luZyB0aGUgam9iIHN0ZXAgYWx3YXlzIG9wZW5zIHRoZSBsb2FkLWpvYiBwYW5lbC5cbmZ1bmN0aW9uIGhhbmRsZVN0ZXBDbGljayhzdGVwKSB7XG4gIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHN0ZXAtJHtzdGVwfWApO1xuICBpZiAoIWVsKSByZXR1cm47XG5cbiAgLy8gSm9iIHN0ZXA6IHNob3cgam9iIGNvbnRlbnQgaWYgYSBqb2IgaXMgbG9hZGVkLCBvdGhlcndpc2Ugb3BlbiB0aGUgbG9hZCBwYW5lbC5cbiAgaWYgKHN0ZXAgPT09ICdqb2InKSB7XG4gICAgaWYgKGVsLmNsYXNzTGlzdC5jb250YWlucygnY29tcGxldGVkJykgfHwgZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdhY3RpdmUnKSkge1xuICAgICAgc3dpdGNoVGFiKCdqb2InKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2hvd0xvYWRKb2JQYW5lbCgpO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBGb3J3YXJkLXNraXA6IHByZXZpb3VzbHkgcmVhY2hlZCBzdGFnZSB0aGF0IGlzIGFoZWFkIG9mIGN1cnJlbnQgcGhhc2UuXG4gIGlmIChlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2ZvcndhcmQtc2tpcCcpKSB7XG4gICAgY29uc3QgbGFiZWwgPSBfU1RFUF9ESVNQTEFZW3N0ZXBdIHx8IHN0ZXA7XG4gICAgaWYgKHR5cGVvZiBjb25maXJtRGlhbG9nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25maXJtRGlhbG9nKFxuICAgICAgICBgSnVtcCBhaGVhZCB0byAke2xhYmVsfT9cXG5cXG5JbnRlcm1lZGlhdGUgc3RhZ2VzIG1heSBuZWVkIHJlLXJ1bm5pbmcgaWYgeW91IG1ha2UgY2hhbmdlcyBoZXJlLmAsXG4gICAgICAgIHsgY29uZmlybUxhYmVsOiAnSnVtcCBhaGVhZCcsIGNhbmNlbExhYmVsOiAnU3RheSBoZXJlJyB9XG4gICAgICApLnRoZW4oY29uZmlybWVkID0+IHsgaWYgKGNvbmZpcm1lZCkgX2RvU3RlcE5hdmlnYXRlKHN0ZXApOyB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgX2RvU3RlcE5hdmlnYXRlKHN0ZXApO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBPbmx5IG5hdmlnYXRlIGlmIHRoZSBzdGVwIGlzIGNvbXBsZXRlZCAoYmFjay1uYXYpIG9yIGFjdGl2ZS5cbiAgaWYgKCFlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2NvbXBsZXRlZCcpICYmICFlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2FjdGl2ZScpKSByZXR1cm47XG5cbiAgY29uc3QgaGFzVW5hbnN3ZXJlZFBvc3RBbmFseXNpc1F1ZXN0aW9ucyA9ICgpID0+IHtcbiAgICBjb25zdCBxcyA9IEFycmF5LmlzQXJyYXkod2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucykgPyB3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zIDogW107XG4gICAgaWYgKHFzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGFuc3dlcnMgPSAod2luZG93LnF1ZXN0aW9uQW5zd2VycyAmJiB0eXBlb2Ygd2luZG93LnF1ZXN0aW9uQW5zd2VycyA9PT0gJ29iamVjdCcpXG4gICAgICA/IHdpbmRvdy5xdWVzdGlvbkFuc3dlcnNcbiAgICAgIDoge307XG4gICAgcmV0dXJuIHFzLnNvbWUocSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGFuc3dlcnNbcS50eXBlXTtcbiAgICAgIHJldHVybiAhdmFsdWUgfHwgIVN0cmluZyh2YWx1ZSkudHJpbSgpO1xuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IHN0ZXBUb1RhYiA9IHtcbiAgICBhbmFseXNpczogICAgICAgaGFzVW5hbnN3ZXJlZFBvc3RBbmFseXNpc1F1ZXN0aW9ucygpID8gJ3F1ZXN0aW9ucycgOiAnYW5hbHlzaXMnLFxuICAgIGN1c3RvbWl6YXRpb25zOiAnZ29hbHMnLFxuICAgIHJld3JpdGU6ICAgICAgICAncmV3cml0ZScsXG4gICAgc3BlbGw6ICAgICAgICAgICdzcGVsbCcsXG4gICAgbGF5b3V0OiAgICAgICAgICdsYXlvdXQnLFxuICAgIGRvd25sb2FkOiAgICAgICAnZmluYWxfZ2VuZXJhdGUnLFxuICAgIGNvdmVyX2xldHRlcjogICAnY292ZXItbGV0dGVyJyxcbiAgICBzY3JlZW5pbmc6ICAgICAgJ3NjcmVlbmluZycsXG4gICAgaW50ZXJ2aWV3X3ByZXA6ICdpbnRlcnZpZXctcHJlcCcsXG4gICAgdGhhbmtfeW91OiAgICAgICd0aGFuay15b3UnLFxuICAgIGhhcnZlc3Q6ICAgICAgICAnaGFydmVzdCcsXG4gIH07XG4gIGNvbnN0IHRhYk5hbWUgPSBzdGVwVG9UYWJbc3RlcF07XG4gIGlmICghdGFiTmFtZSkgcmV0dXJuO1xuXG4gIGNvbnN0IGRvTmF2aWdhdGUgPSAoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB1cGRhdGVUYWJCYXJGb3JTdGFnZSA9PT0gJ2Z1bmN0aW9uJykgdXBkYXRlVGFiQmFyRm9yU3RhZ2Uoc3RlcCk7XG4gICAgc3dpdGNoVGFiKHRhYk5hbWUpO1xuICB9O1xuXG4gIC8vIFNob3cgYSBkb3duc3RyZWFtLWF3YXJlbmVzcyBkaWFsb2cgd2hlbiBiYWNrLW5hdmlnYXRpbmcgdG8gYSBjb21wbGV0ZWQgc3RlcFxuICAvLyB0aGF0IGhhcyBkb3duc3RyZWFtIGNvbXBsZXRlZCBzdGVwcyAobm90IHdoZW4gdGhlIHN0ZXAgaXMgYWN0aXZlKS5cbiAgaWYgKGVsLmNsYXNzTGlzdC5jb250YWlucygnY29tcGxldGVkJykgJiYgIWVsLmNsYXNzTGlzdC5jb250YWlucygnYWN0aXZlJykpIHtcbiAgICBjb25zdCBzdGVwSWR4ID0gX1NURVBfT1JERVIuaW5kZXhPZihzdGVwKTtcbiAgICBjb25zdCBoYXNEb3duc3RyZWFtQ29tcGxldGVkID0gX1NURVBfT1JERVIuc2xpY2Uoc3RlcElkeCArIDEpLnNvbWUocyA9PiB7XG4gICAgICBjb25zdCBkb3duc3RyZWFtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHN0ZXAtJHtzfWApO1xuICAgICAgcmV0dXJuIGRvd25zdHJlYW0gJiYgZG93bnN0cmVhbS5jbGFzc0xpc3QuY29udGFpbnMoJ2NvbXBsZXRlZCcpO1xuICAgIH0pO1xuICAgIGlmIChoYXNEb3duc3RyZWFtQ29tcGxldGVkKSB7XG4gICAgICBfc2hvd1JlUnVuQ29uZmlybU1vZGFsKHN0ZXAsICdiYWNrLW5hdicsIGRvTmF2aWdhdGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGRvTmF2aWdhdGUoKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEV4cG9ydHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmV4cG9ydCB7XG4gIF9TVEVQX09SREVSLFxuICBfU1RFUF9ESVNQTEFZLFxuICBiYWNrVG9QaGFzZSxcbiAgX3Nob3dSZVJ1bkNvbmZpcm1Nb2RhbCxcbiAgX3Nob3dBbmFseXNpc0NsYXJpZmljYXRpb25BbWVuZE1vZGFsLFxuICBjb25maXJtUmVSdW5QaGFzZSxcbiAgcmVSdW5QaGFzZSxcbiAgX2V4ZWN1dGVSZVJ1blBoYXNlLFxuICBfZ2V0U3RlcFRvb2x0aXAsXG4gIF91cGRhdGVWaWV3aW5nSW5kaWNhdG9yLFxuICBfaGlnaGxpZ2h0Q2hhbmdlZEl0ZW1zLFxuICBfbWFya0NoYW5nZWQsXG4gIGFwcGx5TGF5b3V0RnJlc2huZXNzTmF2aWdhdGlvblN0YXRlLFxuICBhcHBseURpcnR5UGhhc2VOYXZpZ2F0aW9uU3RhdGUsXG4gIHNob3dCdWxsZXRSZW9yZGVyLFxuICBfYXBwbHlCdWxsZXRPcmRlcixcbiAgbW92ZUJ1bGxldCxcbiAgX3VwZGF0ZUJ1bGxldEFycm93cyxcbiAgc2F2ZUJ1bGxldE9yZGVyLFxuICByZXNldEJ1bGxldE9yZGVyLFxuICB1cGRhdGVXb3JrZmxvd1N0ZXBzLFxuICBoYW5kbGVTdGVwQ2xpY2ssXG4gIF9BQ1RJT05fTEFCRUxTLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL3ZhbGlkYXRvcnMuanNcbiAqIEFQSSByZXNwb25zZSB2YWxpZGF0b3JzIFx1MjAxNCBEVE8gbWlycm9ycyBvZiBQeXRob24gZGF0YWNsYXNzZXMgaW4gd2ViX2FwcC5weS5cbiAqXG4gKiBFYWNoIGZ1bmN0aW9uIGNoZWNrcyB0aGF0IHJlcXVpcmVkIGZpZWxkcyBhcmUgcHJlc2VudCBpbiBhbiBBUEkgcmVzcG9uc2UgYW5kXG4gKiBsb2dzIGEgY29uc29sZS53YXJuIGlmIGFueSBhcmUgbWlzc2luZyBvciBoYXZlIGFuIHVuZXhwZWN0ZWQgdHlwZS4gIFZhbGlkYXRvcnNcbiAqIHJldHVybiB0aGUgb3JpZ2luYWwgZGF0YSBvYmplY3QgdW5jaGFuZ2VkIHNvIHRoZXkgY2FuIGJlIHVzZWQgaW5saW5lLlxuICpcbiAqIFVwZGF0ZSBib3RoIHRoaXMgZmlsZSBhbmQgdGhlIFB5dGhvbiBkYXRhY2xhc3NlcyBpbiB3ZWJfYXBwLnB5IHRvZ2V0aGVyXG4gKiB3aGVuZXZlciBhZGRpbmcgb3IgcmVtb3ZpbmcgcmVzcG9uc2UgZmllbGRzLlxuICpcbiAqIERFUEVOREVOQ0lFUzogbm9uZVxuICovXG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmNvbnN0IGxvZyA9IGdldExvZ2dlcigndmFsaWRhdG9ycycpO1xuXG4vKiogVmFsaWRhdGUgR0VUIC9hcGkvc3RhdHVzIHJlc3BvbnNlLiAqL1xuZnVuY3Rpb24gcGFyc2VTdGF0dXNSZXNwb25zZShkYXRhKSB7XG4gIGNvbnN0IHJlcXVpcmVkID0gW1xuICAgICdwaGFzZScsICdsbG1fcHJvdmlkZXInLCAnam9iX2Rlc2NyaXB0aW9uJyxcbiAgICAncG9zdF9hbmFseXNpc19xdWVzdGlvbnMnLCAncG9zdF9hbmFseXNpc19hbnN3ZXJzJyxcbiAgICAnYWxsX2V4cGVyaWVuY2VfaWRzJywgJ2FsbF9leHBlcmllbmNlcycsICdhbGxfc2tpbGxzJywgJ2FsbF9hY2hpZXZlbWVudHMnLFxuICAgICdwcm9mZXNzaW9uYWxfc3VtbWFyaWVzJywgJ2NvcGlsb3RfYXV0aCcsICdpdGVyYXRpbmcnLFxuICAgICdleHBlcmllbmNlX2RlY2lzaW9ucycsICdza2lsbF9kZWNpc2lvbnMnLFxuICAgICdhY2hpZXZlbWVudF9kZWNpc2lvbnMnLCAncHVibGljYXRpb25fZGVjaXNpb25zJyxcbiAgICAnZXh0cmFfc2tpbGxzJywgJ2V4dHJhX3NraWxsX21hdGNoZXMnLCAnc2Vzc2lvbl9maWxlJyxcbiAgXTtcbiAgY29uc3QgbWlzc2luZyA9IHJlcXVpcmVkLmZpbHRlcihrID0+ICEoayBpbiBkYXRhKSk7XG4gIGlmIChtaXNzaW5nLmxlbmd0aCkge1xuICAgIGxvZy53YXJuKCdbcGFyc2VTdGF0dXNSZXNwb25zZV0gTWlzc2luZyBmaWVsZHM6JywgbWlzc2luZywgZGF0YSk7XG4gIH1cbiAgaWYgKCdwb3N0X2FuYWx5c2lzX3F1ZXN0aW9ucycgaW4gZGF0YSAmJiAhQXJyYXkuaXNBcnJheShkYXRhLnBvc3RfYW5hbHlzaXNfcXVlc3Rpb25zKSkge1xuICAgIGxvZy53YXJuKCdbcGFyc2VTdGF0dXNSZXNwb25zZV0gcG9zdF9hbmFseXNpc19xdWVzdGlvbnMgc2hvdWxkIGJlIGFuIGFycmF5OicsIGRhdGEucG9zdF9hbmFseXNpc19xdWVzdGlvbnMpO1xuICB9XG4gIGlmICgnYWxsX2V4cGVyaWVuY2VfaWRzJyBpbiBkYXRhICYmICFBcnJheS5pc0FycmF5KGRhdGEuYWxsX2V4cGVyaWVuY2VfaWRzKSkge1xuICAgIGxvZy53YXJuKCdbcGFyc2VTdGF0dXNSZXNwb25zZV0gYWxsX2V4cGVyaWVuY2VfaWRzIHNob3VsZCBiZSBhbiBhcnJheTonLCBkYXRhLmFsbF9leHBlcmllbmNlX2lkcyk7XG4gIH1cbiAgcmV0dXJuIGRhdGE7XG59XG5cbi8qKiBWYWxpZGF0ZSBHRVQgL2FwaS9zZXNzaW9ucyByZXNwb25zZS4gKi9cbmZ1bmN0aW9uIHBhcnNlU2Vzc2lvbkxpc3RSZXNwb25zZShkYXRhKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShkYXRhLnNlc3Npb25zKSkge1xuICAgIGxvZy53YXJuKCdbcGFyc2VTZXNzaW9uTGlzdFJlc3BvbnNlXSBzZXNzaW9ucyBzaG91bGQgYmUgYW4gYXJyYXk6JywgZGF0YSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgaXRlbVJlcXVpcmVkID0gWydwYXRoJywgJ3Bvc2l0aW9uX25hbWUnLCAndGltZXN0YW1wJywgJ3BoYXNlJywgJ2hhc19qb2InLCAnaGFzX2FuYWx5c2lzJywgJ2hhc19jdXN0b21pemF0aW9ucyddO1xuICAgIGRhdGEuc2Vzc2lvbnMuZm9yRWFjaCgocywgaSkgPT4ge1xuICAgICAgY29uc3QgbWlzc2luZyA9IGl0ZW1SZXF1aXJlZC5maWx0ZXIoayA9PiAhKGsgaW4gcykpO1xuICAgICAgaWYgKG1pc3NpbmcubGVuZ3RoKSBsb2cud2FybihgW3BhcnNlU2Vzc2lvbkxpc3RSZXNwb25zZV0gc2Vzc2lvbnNbJHtpfV0gbWlzc2luZyBmaWVsZHM6YCwgbWlzc2luZywgcyk7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGRhdGE7XG59XG5cbi8qKiBWYWxpZGF0ZSBHRVQgL2FwaS9yZXdyaXRlcyByZXNwb25zZS4gKi9cbmZ1bmN0aW9uIHBhcnNlUmV3cml0ZXNSZXNwb25zZShkYXRhKSB7XG4gIGNvbnN0IHJlcXVpcmVkID0gWydvaycsICdyZXdyaXRlcycsICdwZXJzdWFzaW9uX3dhcm5pbmdzJywgJ3BoYXNlJ107XG4gIGNvbnN0IG1pc3NpbmcgPSByZXF1aXJlZC5maWx0ZXIoayA9PiAhKGsgaW4gZGF0YSkpO1xuICBpZiAobWlzc2luZy5sZW5ndGgpIGxvZy53YXJuKCdbcGFyc2VSZXdyaXRlc1Jlc3BvbnNlXSBNaXNzaW5nIGZpZWxkczonLCBtaXNzaW5nLCBkYXRhKTtcbiAgaWYgKCdyZXdyaXRlcycgaW4gZGF0YSAmJiAhQXJyYXkuaXNBcnJheShkYXRhLnJld3JpdGVzKSkge1xuICAgIGxvZy53YXJuKCdbcGFyc2VSZXdyaXRlc1Jlc3BvbnNlXSByZXdyaXRlcyBzaG91bGQgYmUgYW4gYXJyYXk6JywgZGF0YS5yZXdyaXRlcyk7XG4gIH1cbiAgcmV0dXJuIGRhdGE7XG59XG5cbi8qKiBWYWxpZGF0ZSBQT1NUIC9hcGkvbWVzc2FnZSBhbmQgUE9TVCAvYXBpL2FjdGlvbiByZXNwb25zZXMuICovXG5mdW5jdGlvbiBwYXJzZU1lc3NhZ2VSZXNwb25zZShkYXRhKSB7XG4gIGlmICghZGF0YS5vayAmJiAhZGF0YS5lcnJvcikge1xuICAgIGxvZy53YXJuKCdbcGFyc2VNZXNzYWdlUmVzcG9uc2VdIFJlc3BvbnNlIGhhcyBuZWl0aGVyIG9rIG5vciBlcnJvcjonLCBkYXRhKTtcbiAgfVxuICByZXR1cm4gZGF0YTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEVTIG1vZHVsZSBleHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuZXhwb3J0IHtcbiAgcGFyc2VTdGF0dXNSZXNwb25zZSxcbiAgcGFyc2VTZXNzaW9uTGlzdFJlc3BvbnNlLFxuICBwYXJzZVJld3JpdGVzUmVzcG9uc2UsXG4gIHBhcnNlTWVzc2FnZVJlc3BvbnNlLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL3JlY29tbWVuZGF0aW9uLWhlbHBlcnMuanNcbiAqIFB1cmUgaGVscGVyIGZ1bmN0aW9ucyBmb3IgbG9va2luZyB1cCBMTE0gcmVjb21tZW5kYXRpb24gZGF0YSBmcm9tIHRoZVxuICogL2FwaS9zdGF0dXMgcmVzcG9uc2Ugb2JqZWN0LiAgU3VwcG9ydHMgZXhwZXJpZW5jZSwgc2tpbGwsIGFuZCBhY2hpZXZlbWVudFxuICogcmVjb21tZW5kYXRpb25zIHdpdGggYmFja3dhcmRzLWNvbXBhdGlibGUgZmxhdC1saXN0IGZhbGxiYWNrcyBmb3Igb2xkXG4gKiBzZXNzaW9uIGRhdGEuXG4gKlxuICogREVQRU5ERU5DSUVTOiBub25lXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdyZWNvbW1lbmRhdGlvbi1oZWxwZXJzJyk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gSW50ZXJuYWwgbG9va3VwIGhlbHBlcnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogTG9vayB1cCBhIHNpbmdsZSBleHBlcmllbmNlIGVudHJ5IGluIGV4cGVyaWVuY2VfcmVjb21tZW5kYXRpb25zLiAqL1xuZnVuY3Rpb24gX2ZpbmRFeHBSZWMoZXhwSWQsIGRhdGEpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEuZXhwZXJpZW5jZV9yZWNvbW1lbmRhdGlvbnMpKSB7XG4gICAgbG9nLndhcm4oJ1tyZWNvbW1lbmRhdGlvbl0gZXhwZXJpZW5jZV9yZWNvbW1lbmRhdGlvbnMgbWlzc2luZzsgdXNpbmcgZmxhdC1saXN0IGZhbGxiYWNrIGZvcicsIGV4cElkKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gZGF0YS5leHBlcmllbmNlX3JlY29tbWVuZGF0aW9ucy5maW5kKHIgPT4gci5pZCA9PT0gZXhwSWQgfHwgci5leHBlcmllbmNlX2lkID09PSBleHBJZCkgfHwgbnVsbDtcbn1cblxuLyoqIExvb2sgdXAgYSBzaW5nbGUgc2tpbGwgZW50cnkgaW4gc2tpbGxfcmVjb21tZW5kYXRpb25zLiAqL1xuZnVuY3Rpb24gX2ZpbmRTa2lsbFJlYyhza2lsbCwgZGF0YSkge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YS5za2lsbF9yZWNvbW1lbmRhdGlvbnMpKSB7XG4gICAgbG9nLndhcm4oJ1tyZWNvbW1lbmRhdGlvbl0gc2tpbGxfcmVjb21tZW5kYXRpb25zIG1pc3Npbmc7IHVzaW5nIGZsYXQtbGlzdCBmYWxsYmFjayBmb3InLCBza2lsbCk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIGRhdGEuc2tpbGxfcmVjb21tZW5kYXRpb25zLmZpbmQociA9PiByLnNraWxsID09PSBza2lsbCB8fCByLm5hbWUgPT09IHNraWxsKSB8fCBudWxsO1xufVxuXG4vKiogUGFyc2UgYSByYXcgY29uZmlkZW5jZSBzdHJpbmcgdG8gYSB7bGV2ZWwsIHRleHR9IG9iamVjdCwgb3IgbnVsbCBpZiB1bnJlY29nbmlzZWQuICovXG5mdW5jdGlvbiBfcGFyc2VDb25maWRlbmNlKGNvbmYpIHtcbiAgY29uc3QgYyA9IChjb25mIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICBpZiAoYy5pbmNsdWRlcygndmVyeSBoaWdoJykpIHJldHVybiB7IGxldmVsOiAndmVyeS1oaWdoJywgdGV4dDogJ1ZlcnkgSGlnaCBDb25maWRlbmNlJyB9O1xuICBpZiAoYy5pbmNsdWRlcygndmVyeSBsb3cnKSkgIHJldHVybiB7IGxldmVsOiAndmVyeS1sb3cnLCAgdGV4dDogJ1ZlcnkgTG93IENvbmZpZGVuY2UnICB9O1xuICBpZiAoYy5pbmNsdWRlcygnaGlnaCcpKSAgICAgIHJldHVybiB7IGxldmVsOiAnaGlnaCcsICAgICAgdGV4dDogJ0hpZ2ggQ29uZmlkZW5jZScgICAgICB9O1xuICBpZiAoYy5pbmNsdWRlcygnbWVkaXVtJykpICAgIHJldHVybiB7IGxldmVsOiAnbWVkaXVtJywgICAgdGV4dDogJ01lZGl1bSBDb25maWRlbmNlJyAgICB9O1xuICBpZiAoYy5pbmNsdWRlcygnbG93JykpICAgICAgIHJldHVybiB7IGxldmVsOiAnbG93JywgICAgICAgdGV4dDogJ0xvdyBDb25maWRlbmNlJyAgICAgICB9O1xuICByZXR1cm4gbnVsbDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBFeHBlcmllbmNlIHJlY29tbWVuZGF0aW9uc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIGdldEV4cGVyaWVuY2VSZWNvbW1lbmRhdGlvbihleHBJZCwgZGF0YSkge1xuICBjb25zdCByZWMgPSBfZmluZEV4cFJlYyhleHBJZCwgZGF0YSk7XG4gIGlmIChyZWMgJiYgcmVjLnJlY29tbWVuZGF0aW9uKSByZXR1cm4gcmVjLnJlY29tbWVuZGF0aW9uO1xuICAvLyBCYWNrd2FyZHMtY29tcGF0IGZsYXQtbGlzdCBmYWxsYmFja1xuICBpZiAoZGF0YS5vbWl0dGVkX2V4cGVyaWVuY2VzICAgICAmJiBkYXRhLm9taXR0ZWRfZXhwZXJpZW5jZXMuaW5jbHVkZXMoZXhwSWQpKSAgICAgcmV0dXJuICdPbWl0JztcbiAgaWYgKGRhdGEucmVjb21tZW5kZWRfZXhwZXJpZW5jZXMgJiYgZGF0YS5yZWNvbW1lbmRlZF9leHBlcmllbmNlcy5pbmNsdWRlcyhleHBJZCkpIHJldHVybiAnRW1waGFzaXplJztcbiAgcmV0dXJuICdJbmNsdWRlJztcbn1cblxuZnVuY3Rpb24gZ2V0Q29uZmlkZW5jZUxldmVsKGV4cElkLCBkYXRhKSB7XG4gIGNvbnN0IHJlYyA9IF9maW5kRXhwUmVjKGV4cElkLCBkYXRhKTtcbiAgcmV0dXJuIChyZWMgJiYgX3BhcnNlQ29uZmlkZW5jZShyZWMuY29uZmlkZW5jZSkpIHx8IHsgbGV2ZWw6ICdtZWRpdW0nLCB0ZXh0OiAnTWVkaXVtIENvbmZpZGVuY2UnIH07XG59XG5cbmZ1bmN0aW9uIGdldEV4cGVyaWVuY2VSZWFzb25pbmcoZXhwSWQsIGRhdGEpIHtcbiAgY29uc3QgcmVjID0gX2ZpbmRFeHBSZWMoZXhwSWQsIGRhdGEpO1xuICByZXR1cm4gKHJlYyAmJiByZWMucmVhc29uaW5nKSB8fCAnVGhpcyBleHBlcmllbmNlIHdhcyBzZWxlY3RlZCBiYXNlZCBvbiBpdHMgcmVsZXZhbmNlIHRvIHRoZSBwb3NpdGlvbiByZXF1aXJlbWVudHMuJztcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTa2lsbCByZWNvbW1lbmRhdGlvbnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiBnZXRTa2lsbFJlY29tbWVuZGF0aW9uKHNraWxsLCBkYXRhKSB7XG4gIGNvbnN0IHJlYyA9IF9maW5kU2tpbGxSZWMoc2tpbGwsIGRhdGEpO1xuICBpZiAocmVjICYmIHJlYy5yZWNvbW1lbmRhdGlvbikgcmV0dXJuIHJlYy5yZWNvbW1lbmRhdGlvbjtcbiAgaWYgKGRhdGEucmVjb21tZW5kZWRfc2tpbGxzICYmIGRhdGEucmVjb21tZW5kZWRfc2tpbGxzLmluY2x1ZGVzKHNraWxsKSkgcmV0dXJuICdJbmNsdWRlJztcbiAgcmV0dXJuICdPbWl0Jztcbn1cblxuZnVuY3Rpb24gZ2V0U2tpbGxDb25maWRlbmNlKHNraWxsLCBkYXRhKSB7XG4gIGNvbnN0IHJlYyA9IF9maW5kU2tpbGxSZWMoc2tpbGwsIGRhdGEpO1xuICBpZiAocmVjKSB7XG4gICAgY29uc3QgcGFyc2VkID0gX3BhcnNlQ29uZmlkZW5jZShyZWMuY29uZmlkZW5jZSk7XG4gICAgaWYgKHBhcnNlZCkgcmV0dXJuIHBhcnNlZDtcbiAgfVxuICBpZiAoZGF0YS5yZWNvbW1lbmRlZF9za2lsbHMgJiYgZGF0YS5yZWNvbW1lbmRlZF9za2lsbHMuaW5jbHVkZXMoc2tpbGwpKSB7XG4gICAgcmV0dXJuIHsgbGV2ZWw6ICdtZWRpdW0nLCB0ZXh0OiAnTWVkaXVtIENvbmZpZGVuY2UnIH07XG4gIH1cbiAgcmV0dXJuIHsgbGV2ZWw6ICdsb3cnLCB0ZXh0OiAnTG93IENvbmZpZGVuY2UnIH07XG59XG5cbmZ1bmN0aW9uIGdldFNraWxsUmVhc29uaW5nKHNraWxsLCBkYXRhKSB7XG4gIGNvbnN0IHJlYyA9IF9maW5kU2tpbGxSZWMoc2tpbGwsIGRhdGEpO1xuICBpZiAocmVjICYmIHJlYy5yZWFzb25pbmcpIHJldHVybiByZWMucmVhc29uaW5nO1xuICBpZiAoZGF0YS5yZWNvbW1lbmRlZF9za2lsbHMgJiYgZGF0YS5yZWNvbW1lbmRlZF9za2lsbHMuaW5jbHVkZXMoc2tpbGwpKSB7XG4gICAgcmV0dXJuICdUaGlzIHNraWxsIHdhcyBpZGVudGlmaWVkIGFzIHJlbGV2YW50IHRvIHRoZSBwb3NpdGlvbiByZXF1aXJlbWVudHMuJztcbiAgfVxuICByZXR1cm4gJ1RoaXMgc2tpbGwgd2FzIG5vdCBzcGVjaWZpY2FsbHkgbWVudGlvbmVkIGluIHRoZSBqb2IgcmVxdWlyZW1lbnRzLic7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQWNoaWV2ZW1lbnQgcmVjb21tZW5kYXRpb25zXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gZ2V0QWNoaWV2ZW1lbnRSZWNvbW1lbmRhdGlvbihhY2hJZCwgZGF0YSkge1xuICBpZiAoZGF0YS5hY2hpZXZlbWVudF9yZWNvbW1lbmRhdGlvbnMgJiYgQXJyYXkuaXNBcnJheShkYXRhLmFjaGlldmVtZW50X3JlY29tbWVuZGF0aW9ucykpIHtcbiAgICBjb25zdCByZWMgPSBkYXRhLmFjaGlldmVtZW50X3JlY29tbWVuZGF0aW9ucy5maW5kKHIgPT4gci5pZCA9PT0gYWNoSWQpO1xuICAgIGlmIChyZWMgJiYgcmVjLnJlY29tbWVuZGF0aW9uKSByZXR1cm4gcmVjLnJlY29tbWVuZGF0aW9uO1xuICB9XG4gIGlmIChkYXRhLnJlY29tbWVuZGVkX2FjaGlldmVtZW50cyAmJiBkYXRhLnJlY29tbWVuZGVkX2FjaGlldmVtZW50cy5pbmNsdWRlcyhhY2hJZCkpIHtcbiAgICByZXR1cm4gJ0luY2x1ZGUnO1xuICB9XG4gIHJldHVybiAnRGUtZW1waGFzaXplJztcbn1cblxuZnVuY3Rpb24gZ2V0QWNoaWV2ZW1lbnRDb25maWRlbmNlKGFjaElkLCBkYXRhLCBhY2hJbXBvcnRhbmNlKSB7XG4gIGlmIChkYXRhLmFjaGlldmVtZW50X3JlY29tbWVuZGF0aW9ucyAmJiBBcnJheS5pc0FycmF5KGRhdGEuYWNoaWV2ZW1lbnRfcmVjb21tZW5kYXRpb25zKSkge1xuICAgIGNvbnN0IHJlYyA9IGRhdGEuYWNoaWV2ZW1lbnRfcmVjb21tZW5kYXRpb25zLmZpbmQociA9PiByLmlkID09PSBhY2hJZCk7XG4gICAgaWYgKHJlYyAmJiByZWMuY29uZmlkZW5jZSkge1xuICAgICAgY29uc3QgY29uZiA9IHJlYy5jb25maWRlbmNlLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAoY29uZi5pbmNsdWRlcygndmVyeSBoaWdoJykpIHJldHVybiB7IGxldmVsOiAndmVyeS1oaWdoJywgdGV4dDogJ1ZlcnkgSGlnaCcgfTtcbiAgICAgIGlmIChjb25mLmluY2x1ZGVzKCdoaWdoJykpICAgICAgcmV0dXJuIHsgbGV2ZWw6ICdoaWdoJywgICAgICB0ZXh0OiAnSGlnaCcgICAgICB9O1xuICAgICAgaWYgKGNvbmYuaW5jbHVkZXMoJ21lZGl1bScpKSAgICByZXR1cm4geyBsZXZlbDogJ21lZGl1bScsICAgIHRleHQ6ICdNZWRpdW0nICAgIH07XG4gICAgICBpZiAoY29uZi5pbmNsdWRlcygndmVyeSBsb3cnKSkgIHJldHVybiB7IGxldmVsOiAndmVyeS1sb3cnLCAgdGV4dDogJ1ZlcnkgTG93JyAgfTtcbiAgICAgIGlmIChjb25mLmluY2x1ZGVzKCdsb3cnKSkgICAgICAgcmV0dXJuIHsgbGV2ZWw6ICdsb3cnLCAgICAgICB0ZXh0OiAnTG93JyAgICAgICB9O1xuICAgIH1cbiAgfVxuICBjb25zdCBpbXAgPSBhY2hJbXBvcnRhbmNlIHx8IDU7XG4gIGlmIChpbXAgPj0gOSkgcmV0dXJuIHsgbGV2ZWw6ICd2ZXJ5LWhpZ2gnLCB0ZXh0OiAnVmVyeSBIaWdoJyB9O1xuICBpZiAoaW1wID49IDcpIHJldHVybiB7IGxldmVsOiAnaGlnaCcsICAgICAgdGV4dDogJ0hpZ2gnICAgICAgfTtcbiAgaWYgKGltcCA+PSA1KSByZXR1cm4geyBsZXZlbDogJ21lZGl1bScsICAgIHRleHQ6ICdNZWRpdW0nICAgIH07XG4gIGlmIChpbXAgPj0gMykgcmV0dXJuIHsgbGV2ZWw6ICdsb3cnLCAgICAgICB0ZXh0OiAnTG93JyAgICAgICB9O1xuICByZXR1cm4geyBsZXZlbDogJ3ZlcnktbG93JywgdGV4dDogJ1ZlcnkgTG93JyB9O1xufVxuXG5mdW5jdGlvbiBnZXRBY2hpZXZlbWVudFJlYXNvbmluZyhhY2hJZCwgZGF0YSwgYWNoKSB7XG4gIGlmIChkYXRhLmFjaGlldmVtZW50X3JlY29tbWVuZGF0aW9ucyAmJiBBcnJheS5pc0FycmF5KGRhdGEuYWNoaWV2ZW1lbnRfcmVjb21tZW5kYXRpb25zKSkge1xuICAgIGNvbnN0IHJlYyA9IGRhdGEuYWNoaWV2ZW1lbnRfcmVjb21tZW5kYXRpb25zLmZpbmQociA9PiByLmlkID09PSBhY2hJZCk7XG4gICAgaWYgKHJlYyAmJiByZWMucmVhc29uaW5nKSByZXR1cm4gcmVjLnJlYXNvbmluZztcbiAgfVxuICBjb25zdCByZWxldmFudEZvciA9IChhY2gucmVsZXZhbnRfZm9yIHx8IFtdKS5qb2luKCcsICcpO1xuICBpZiAoZGF0YS5yZWNvbW1lbmRlZF9hY2hpZXZlbWVudHMgJiYgZGF0YS5yZWNvbW1lbmRlZF9hY2hpZXZlbWVudHMuaW5jbHVkZXMoYWNoSWQpKSB7XG4gICAgcmV0dXJuIHJlbGV2YW50Rm9yXG4gICAgICA/IGBSZWNvbW1lbmRlZCBmb3IgdGhpcyByb2xlLiBSZWxldmFudCBmb3I6ICR7cmVsZXZhbnRGb3J9LmBcbiAgICAgIDogJ1JlY29tbWVuZGVkIGJ5IEFJIGFzIHJlbGV2YW50IHRvIHRoaXMgcm9sZS4nO1xuICB9XG4gIHJldHVybiByZWxldmFudEZvclxuICAgID8gYFJlbGV2YW50IGZvcjogJHtyZWxldmFudEZvcn0uIE5vdCBzcGVjaWZpY2FsbHkgaGlnaGxpZ2h0ZWQgZm9yIHRoaXMgcm9sZS5gXG4gICAgOiAnTm90IHNwZWNpZmljYWxseSBoaWdobGlnaHRlZCBmb3IgdGhpcyByb2xlIGJhc2VkIG9uIGpvYiByZXF1aXJlbWVudHMuJztcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBGYWxsYmFjayBxdWVzdGlvbiBnZW5lcmF0aW9uXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gYnVpbGRGYWxsYmFja1Bvc3RBbmFseXNpc1F1ZXN0aW9ucyhkYXRhKSB7XG4gIGNvbnN0IHF1ZXN0aW9ucyA9IFtdO1xuXG4gIGlmIChkYXRhLnJvbGVfbGV2ZWwpIHtcbiAgICBxdWVzdGlvbnMucHVzaCh7XG4gICAgICBxdWVzdGlvbjogYFRoaXMgcm9sZSBhcHBlYXJzIHRvIGJlIGF0ICR7ZGF0YS5yb2xlX2xldmVsfSBsZXZlbC4gU2hvdWxkIEkgZW1waGFzaXplIHlvdXIgbW9zdCBzZW5pb3IgZXhwZXJpZW5jZXMgb3IgaW5jbHVkZSBhIGJyb2FkZXIgcmFuZ2UgdG8gc2hvdyBjYXJlZXIgcHJvZ3Jlc3Npb24/YCxcbiAgICAgIHR5cGU6ICdleHBlcmllbmNlX2xldmVsJyxcbiAgICAgIGNob2ljZXM6IFsnRW1waGFzaXplIG1vc3Qgc2VuaW9yJywgJ0Jyb2FkZXIgY2FyZWVyIHByb2dyZXNzaW9uJywgJ0xldCB5b3UgZGVjaWRlIGJhc2VkIG9uIGFuYWx5c2lzJ10sXG4gICAgfSk7XG4gIH1cblxuICBpZiAoZGF0YS5yZXF1aXJlZF9za2lsbHMgJiYgZGF0YS5yZXF1aXJlZF9za2lsbHMuc29tZShza2lsbCA9PlxuICAgICAgc2tpbGwudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnbGVhZGVyc2hpcCcpIHx8XG4gICAgICBza2lsbC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdtYW5hZ2VtZW50JykgfHxcbiAgICAgIHNraWxsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ3RlYW0nKSkpIHtcbiAgICBxdWVzdGlvbnMucHVzaCh7XG4gICAgICBxdWVzdGlvbjogJ1RoaXMgcm9sZSBoYXMgbGVhZGVyc2hpcCBjb21wb25lbnRzLiBXb3VsZCB5b3UgcHJlZmVyIG1lIHRvIGVtcGhhc2l6ZSB5b3VyIG1hbmFnZW1lbnQgZXhwZXJpZW5jZSBvciBmb2N1cyBtb3JlIG9uIHlvdXIgdGVjaG5pY2FsIGNvbnRyaWJ1dGlvbnM/JyxcbiAgICAgIHR5cGU6ICdsZWFkZXJzaGlwX2ZvY3VzJyxcbiAgICAgIGNob2ljZXM6IFsnRW1waGFzaXplIG1hbmFnZW1lbnQnLCAnRm9jdXMgb24gdGVjaG5pY2FsJywgJ0JhbGFuY2UgYm90aCBlcXVhbGx5J10sXG4gICAgfSk7XG4gIH1cblxuICBpZiAoZGF0YS5kb21haW4pIHtcbiAgICBxdWVzdGlvbnMucHVzaCh7XG4gICAgICBxdWVzdGlvbjogYFRoZSByb2xlIGlzIGluICR7ZGF0YS5kb21haW59LiBEbyB5b3UgaGF2ZSBwYXJ0aWN1bGFyIHByb2plY3RzIG9yIGFjaGlldmVtZW50cyBpbiB0aGlzIGRvbWFpbiB0aGF0IHlvdSdkIGxpa2UgbWUgdG8gaGlnaGxpZ2h0P2AsXG4gICAgICB0eXBlOiAnZG9tYWluX2V4cGVydGlzZScsXG4gICAgICBjaG9pY2VzOiBbJ0hpZ2hsaWdodCBkb21haW4tc3BlY2lmaWMgYWNoaWV2ZW1lbnRzJywgJ1VzZSBhbGwgYXZhaWxhYmxlIGV4cGVyaWVuY2UnLCAnUHJpb3JpdGl6ZSBtb3N0IHJlY2VudCB3b3JrJ10sXG4gICAgfSk7XG4gIH1cblxuICBpZiAoZGF0YS5jb21wYW55KSB7XG4gICAgcXVlc3Rpb25zLnB1c2goe1xuICAgICAgcXVlc3Rpb246IGBGb3IgJHtkYXRhLmNvbXBhbnl9LCB3b3VsZCB5b3UgbGlrZSBtZSB0byB0YWlsb3IgZW1waGFzaXMgdG93YXJkIHRoZWlyIGN1bHR1cmUgYW5kIHZhbHVlcz8gSWYgc28sIHdoYXQgc2hvdWxkIEkgcHJpb3JpdGl6ZT9gLFxuICAgICAgdHlwZTogJ2NvbXBhbnlfY3VsdHVyZScsXG4gICAgICBjaG9pY2VzOiBbJ1Jlc2VhcmNoLWRyaXZlbiAvIGFjYWRlbWljJywgJ0luZHVzdHJ5IC8gY29tbWVyY2lhbCBpbXBhY3QnLCAnSW5ub3ZhdGlvbiAvIHN0YXJ0dXAnLCAnVXNlIGN1bHR1cmFsIGluZGljYXRvcnMgZnJvbSBqb2IgZGVzY3JpcHRpb24nXSxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBxdWVzdGlvbnM7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFUyBtb2R1bGUgZXhwb3J0cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmV4cG9ydCB7XG4gIGdldEV4cGVyaWVuY2VSZWNvbW1lbmRhdGlvbiwgZ2V0Q29uZmlkZW5jZUxldmVsLCBnZXRFeHBlcmllbmNlUmVhc29uaW5nLFxuICBnZXRTa2lsbFJlY29tbWVuZGF0aW9uLCBnZXRTa2lsbENvbmZpZGVuY2UsIGdldFNraWxsUmVhc29uaW5nLFxuICBnZXRBY2hpZXZlbWVudFJlY29tbWVuZGF0aW9uLCBnZXRBY2hpZXZlbWVudENvbmZpZGVuY2UsIGdldEFjaGlldmVtZW50UmVhc29uaW5nLFxuICBidWlsZEZhbGxiYWNrUG9zdEFuYWx5c2lzUXVlc3Rpb25zLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL3VpLWhlbHBlcnMuanNcbiAqIExpZ2h0d2VpZ2h0IERPTSBoZWxwZXJzOiB0b2FzdHMsIGFsZXJ0L2NvbmZpcm0gbW9kYWxzLCBjaGF0IHRvZ2dsZSwgYW5kXG4gKiB3b3JrZmxvdy1zdGFnZSBhY3Rpb24tYnV0dG9uIG1hbmFnZW1lbnQuXG4gKlxuICogREVQRU5ERU5DSUVTOiB1aS1jb3JlLmpzIGV4cG9ydHMgKHRyYXBGb2N1cywgcmVzdG9yZUZvY3VzLCBzZXRJbml0aWFsRm9jdXMsXG4gKiAgICAgICAgICAgICAgIHB1c2hGb2N1c1N0YWNrKSBhdmFpbGFibGUgb24gZ2xvYmFsVGhpcyBhdCBydW50aW1lLlxuICovXG5cbmltcG9ydCB7IHN0YXRlTWFuYWdlciwgR0VORVJBVElPTl9TVEFURV9FVkVOVCB9IGZyb20gJy4vc3RhdGUtbWFuYWdlci5qcyc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQWxlcnQgbW9kYWwgKGluZm9ybWF0aW9uYWwgXHUyMDE0IHNpbmdsZSBPSyBidXR0b24pXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gX3NldE1vZGFsVGV4dChlbCwgbWVzc2FnZSkge1xuICBlbC50ZXh0Q29udGVudCA9ICcnO1xuICBjb25zdCBwYXJ0cyA9IFN0cmluZyhtZXNzYWdlIHx8ICcnKS5zcGxpdCgnXFxuJyk7XG4gIHBhcnRzLmZvckVhY2goKHBhcnQsIGkpID0+IHtcbiAgICBlbC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShwYXJ0KSk7XG4gICAgaWYgKGkgPCBwYXJ0cy5sZW5ndGggLSAxKSBlbC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdicicpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHNob3dBbGVydE1vZGFsKHRpdGxlLCBtZXNzYWdlKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhbGVydC1tb2RhbC10aXRsZScpLnRleHRDb250ZW50ID0gdGl0bGU7XG4gIF9zZXRNb2RhbFRleHQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FsZXJ0LW1vZGFsLW1lc3NhZ2UnKSwgbWVzc2FnZSk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhbGVydC1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gIC8vIHB1c2hGb2N1c1N0YWNrIChHQVAtMTk3KSBwYWlycyB3aXRoIHRyYXBGb2N1cy9yZXN0b3JlRm9jdXMgYmVsb3cgXHUyMDE0IHVzaW5nXG4gIC8vIHRoZSBzaGFyZWQgZm9jdXMtc3RhY2sgbWVjaGFuaXNtLCBub3QgYSBsb2NhbCB2YXJpYWJsZSwgc28gY2xvc2VBbGVydE1vZGFsXG4gIC8vIGFsc28gcG9wcyB0aGUga2V5ZG93biBsaXN0ZW5lciB0cmFwRm9jdXMgcmVnaXN0ZXJzIG9uIGRvY3VtZW50LiBBIHByaW9yXG4gIC8vIHZlcnNpb24gdHJhY2tlZCBpdHMgb3duIGBfYWxlcnRQcmV2aW91c0ZvY3VzYCBhbmQgbmV2ZXIgY2FsbGVkXG4gIC8vIHJlc3RvcmVGb2N1cygpLCB3aGljaCBsZWZ0IHRoYXQgdHJhcEZvY3VzIGxpc3RlbmVyIHBlcm1hbmVudGx5IGF0dGFjaGVkXG4gIC8vIGFmdGVyIGV2ZXJ5IGFsZXJ0IG1vZGFsIGNsb3NlLlxuICBpZiAodHlwZW9mIHB1c2hGb2N1c1N0YWNrID09PSAnZnVuY3Rpb24nKSBwdXNoRm9jdXNTdGFjayhkb2N1bWVudC5hY3RpdmVFbGVtZW50KTtcbiAgaWYgKHR5cGVvZiBzZXRJbml0aWFsRm9jdXMgPT09ICdmdW5jdGlvbicpIHNldEluaXRpYWxGb2N1cygnYWxlcnQtbW9kYWwtb3ZlcmxheScpO1xuICBpZiAodHlwZW9mIHRyYXBGb2N1cyA9PT0gJ2Z1bmN0aW9uJykgdHJhcEZvY3VzKCdhbGVydC1tb2RhbC1vdmVybGF5Jyk7XG59XG5cbmZ1bmN0aW9uIGNsb3NlQWxlcnRNb2RhbCgpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FsZXJ0LW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBpZiAodHlwZW9mIHJlc3RvcmVGb2N1cyA9PT0gJ2Z1bmN0aW9uJykgcmVzdG9yZUZvY3VzKCk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ29uZmlybSBtb2RhbCAocmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0cnVlL2ZhbHNlKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmxldCBfY29uZmlybVJlc29sdmUgPSBudWxsO1xubGV0IF9jb25maXJtUHJldmlvdXNGb2N1cyA9IG51bGw7XG5cbmZ1bmN0aW9uIHNob3dDb25maXJtTW9kYWwodGl0bGUsIG1lc3NhZ2UsIG9rTGFiZWwgPSAnT0snKSB7XG4gIF9jb25maXJtUHJldmlvdXNGb2N1cyA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb25maXJtLW1vZGFsLXRpdGxlJykudGV4dENvbnRlbnQgPSB0aXRsZTtcbiAgX3NldE1vZGFsVGV4dChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29uZmlybS1tb2RhbC1tZXNzYWdlJyksIG1lc3NhZ2UpO1xuICBjb25zdCBva0J0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb25maXJtLW1vZGFsLW9rJyk7XG4gIGlmIChva0J0bikgb2tCdG4udGV4dENvbnRlbnQgPSBva0xhYmVsO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29uZmlybS1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gIGlmIChva0J0bikgb2tCdG4uZm9jdXMoKTtcbiAgaWYgKHR5cGVvZiB0cmFwRm9jdXMgPT09ICdmdW5jdGlvbicpIHRyYXBGb2N1cygnY29uZmlybS1tb2RhbC1vdmVybGF5Jyk7XG4gIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHsgX2NvbmZpcm1SZXNvbHZlID0gcmVzb2x2ZTsgfSk7XG59XG5cbmZ1bmN0aW9uIGNsb3NlQ29uZmlybU1vZGFsKHJlc3VsdCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29uZmlybS1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgaWYgKHR5cGVvZiByZXN0b3JlRm9jdXMgPT09ICdmdW5jdGlvbicpIHJlc3RvcmVGb2N1cygpO1xuICBpZiAoX2NvbmZpcm1SZXNvbHZlKSB7IF9jb25maXJtUmVzb2x2ZShyZXN1bHQpOyBfY29uZmlybVJlc29sdmUgPSBudWxsOyB9XG4gIGlmIChfY29uZmlybVByZXZpb3VzRm9jdXMgJiYgdHlwZW9mIF9jb25maXJtUHJldmlvdXNGb2N1cy5mb2N1cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIF9jb25maXJtUHJldmlvdXNGb2N1cy5mb2N1cygpO1xuICB9XG4gIF9jb25maXJtUHJldmlvdXNGb2N1cyA9IG51bGw7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVG9hc3Qgbm90aWZpY2F0aW9uc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIHNob3dUb2FzdChtZXNzYWdlLCB0eXBlID0gJ3N1Y2Nlc3MnLCBkdXJhdGlvbiA9IDMwMDApIHtcbiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvYXN0LWNvbnRhaW5lcicpO1xuICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuO1xuICBjb25zdCB0b2FzdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICB0b2FzdC5jbGFzc05hbWUgPSBgdG9hc3QgdG9hc3QtJHt0eXBlfWA7XG4gIHRvYXN0LnRleHRDb250ZW50ID0gbWVzc2FnZTtcbiAgY29udGFpbmVyLmFwcGVuZENoaWxkKHRvYXN0KTtcbiAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHsgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHsgdG9hc3QuY2xhc3NMaXN0LmFkZCgndG9hc3Qtc2hvdycpOyB9KTsgfSk7XG4gIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIHRvYXN0LmNsYXNzTGlzdC5yZW1vdmUoJ3RvYXN0LXNob3cnKTtcbiAgICB0b2FzdC5hZGRFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgKCkgPT4gdG9hc3QucmVtb3ZlKCksIHsgb25jZTogdHJ1ZSB9KTtcbiAgfSwgZHVyYXRpb24pO1xufVxuXG5mdW5jdGlvbiByZWZyZXNoTGF5b3V0U3RhdHVzVUkoKSB7XG4gIGNvbnN0IGxheW91dENoaXAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGF5b3V0LWZyZXNobmVzcy1jaGlwJyk7XG4gIGNvbnN0IGxheW91dEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYXlvdXQtYnRuJyk7XG4gIGNvbnN0IGZyZXNobmVzcyA9IHN0YXRlTWFuYWdlci5nZXRMYXlvdXRGcmVzaG5lc3MoKTtcbiAgY29uc3QgZ2VuZXJhdGlvblN0YXRlID0gc3RhdGVNYW5hZ2VyLmdldEdlbmVyYXRpb25TdGF0ZSgpO1xuXG4gIGlmIChsYXlvdXRDaGlwKSB7XG4gICAgbGF5b3V0Q2hpcC5zdHlsZS5kaXNwbGF5ID0gZnJlc2huZXNzLnNob3dDaGlwID8gJycgOiAnbm9uZSc7XG4gICAgbGF5b3V0Q2hpcC5jbGFzc05hbWUgPSBgbGF5b3V0LWZyZXNobmVzcy1jaGlwICR7ZnJlc2huZXNzLnRvbmV9YDtcbiAgICBsYXlvdXRDaGlwLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIGZyZXNobmVzcy5hcmlhTGFiZWwgfHwgJycpO1xuICAgIGxheW91dENoaXAuaW5uZXJIVE1MID0gZnJlc2huZXNzLnNob3dDaGlwXG4gICAgICA/IGA8c3BhbiBjbGFzcz1cImxheW91dC1mcmVzaG5lc3MtaWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiR7ZnJlc2huZXNzLmlzQ3JpdGljYWwgPyAnXHUyMUJCJyA6IChmcmVzaG5lc3MuaXNTdGFsZSA/ICchJyA6ICdcdTI3MTMnKX08L3NwYW4+PHNwYW4gY2xhc3M9XCJsYXlvdXQtZnJlc2huZXNzLWxhYmVsXCI+JHtmcmVzaG5lc3MubGFiZWx9PC9zcGFuPmBcbiAgICAgIDogJyc7XG4gIH1cblxuICBpZiAobGF5b3V0QnRuKSB7XG4gICAgaWYgKGZyZXNobmVzcy5pc1N0YWxlKSB7XG4gICAgICBsYXlvdXRCdG4udGV4dENvbnRlbnQgPSAnXHUyMUJCIFJlZ2VuZXJhdGUgUHJldmlldyc7XG4gICAgICBsYXlvdXRCdG4udGl0bGUgPSAnUHJldmlldyBpcyBvdXQgb2YgZGF0ZSBcdTIwMTQgcmVnZW5lcmF0ZSBiZWZvcmUgY29uZmlybWluZyBsYXlvdXQnO1xuICAgIH0gZWxzZSBpZiAoZ2VuZXJhdGlvblN0YXRlLmxheW91dENvbmZpcm1lZCB8fCBnZW5lcmF0aW9uU3RhdGUucGhhc2UgPT09ICdjb25maXJtZWQnKSB7XG4gICAgICBsYXlvdXRCdG4udGV4dENvbnRlbnQgPSAnXHUyQjA3XHVGRTBGIEdlbmVyYXRlIEZpbmFsIEZpbGVzJztcbiAgICAgIGxheW91dEJ0bi50aXRsZSA9ICdMYXlvdXQgY29uZmlybWVkIFx1MjAxNCBwcm9kdWNlIGZpbmFsIHN1Ym1pc3Npb24tcmVhZHkgRE9DWCBhbmQgUERGIGZpbGVzJztcbiAgICB9IGVsc2Uge1xuICAgICAgbGF5b3V0QnRuLnRleHRDb250ZW50ID0gJ1x1MjcwNSBDb25maXJtIExheW91dCc7XG4gICAgICBsYXlvdXRCdG4udGl0bGUgPSAnU3RlcCAyIG9mIDM6IENvbmZpcm0gdGhlIGxheW91dCBsb29rcyByaWdodCBiZWZvcmUgZ2VuZXJhdGluZyBmaW5hbCBmaWxlcyc7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGhhbmRsZUxheW91dEZyZXNobmVzc0NoaXBDbGljaygpIHtcbiAgaWYgKHR5cGVvZiB1cGRhdGVUYWJCYXJGb3JTdGFnZSA9PT0gJ2Z1bmN0aW9uJykgdXBkYXRlVGFiQmFyRm9yU3RhZ2UoJ2xheW91dCcpO1xuICBpZiAodHlwZW9mIHVwZGF0ZUFjdGlvbkJ1dHRvbnMgPT09ICdmdW5jdGlvbicpIHVwZGF0ZUFjdGlvbkJ1dHRvbnMoJ2xheW91dCcpO1xuICBpZiAodHlwZW9mIHN3aXRjaFRhYiA9PT0gJ2Z1bmN0aW9uJykgc3dpdGNoVGFiKCdsYXlvdXQnKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBXb3JrZmxvdy1zdGFnZSBwcmltYXJ5IGFjdGlvbiBidXR0b25zXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIEFsbCBzdGFnZS1zcGVjaWZpYyBwcmltYXJ5IGFjdGlvbiBidXR0b24gSURzIChleGNsdWRlcyByZXNldCB3aGljaCBpcyBhbHdheXMgdmlzaWJsZSkuICovXG5jb25zdCBfU1RBR0VfQlVUVE9OUyA9IFtcbiAgJ2FuYWx5emUtYnRuJywgJ3JlY29tbWVuZC1idG4nLCAnZ2VuZXJhdGUtYnRuJyxcbiAgJ3Jld3JpdGUtYnRuJywgJ3NwZWxsLWJ0bicsICdnZW5lcmF0ZS1wcm9jZWVkLWJ0bicsXG4gICdsYXlvdXQtYnRuJywgJ2ZpbmFsLWdlbmVyYXRlLXByb2NlZWQtYnRuJywgJ2ZpbmFsaXNlLWFjdGlvbi1idG4nLFxuXTtcblxuLyoqIE1hcHMgZWFjaCB3b3JrZmxvdyBzdGFnZSB0byBpdHMgb25lIHByaW1hcnkgYWN0aW9uIGJ1dHRvbi4gKi9cbmNvbnN0IF9TVEFHRV9CVVRUT05fTUFQID0ge1xuICBqb2I6ICAgICAgICAgICAgJ2FuYWx5emUtYnRuJyxcbiAgYW5hbHlzaXM6ICAgICAgICdyZWNvbW1lbmQtYnRuJyxcbiAgY3VzdG9taXphdGlvbnM6ICdnZW5lcmF0ZS1idG4nLFxuICByZXdyaXRlOiAgICAgICAgJ3Jld3JpdGUtYnRuJyxcbiAgc3BlbGw6ICAgICAgICAgICdzcGVsbC1idG4nLFxuICBnZW5lcmF0ZTogICAgICAgJ2dlbmVyYXRlLXByb2NlZWQtYnRuJyxcbiAgbGF5b3V0OiAgICAgICAgICdsYXlvdXQtYnRuJyxcbiAgZmluYWxfZ2VuZXJhdGU6ICdmaW5hbC1nZW5lcmF0ZS1wcm9jZWVkLWJ0bicsXG4gIGZpbmFsaXNlOiAgICAgICAnZmluYWxpc2UtYWN0aW9uLWJ0bicsXG59O1xuXG4vKipcbiAqIFNob3cgb25seSB0aGUgcHJpbWFyeSBhY3Rpb24gYnV0dG9uIGZvciB0aGUgZ2l2ZW4gd29ya2Zsb3cgc3RhZ2UuXG4gKiBSZXNldCBpcyBhbHdheXMgdmlzaWJsZS4gIEFsbCBvdGhlciBzdGFnZSBidXR0b25zIGFyZSBoaWRkZW4uXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZUFjdGlvbkJ1dHRvbnMoc3RhZ2UpIHtcbiAgY29uc3QgYWN0aXZlSWQgPSBfU1RBR0VfQlVUVE9OX01BUFtzdGFnZV0gfHwgbnVsbDtcbiAgX1NUQUdFX0JVVFRPTlMuZm9yRWFjaChpZCA9PiB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgaWYgKGVsKSBlbC5zdHlsZS5kaXNwbGF5ID0gKGlkID09PSBhY3RpdmVJZCkgPyAnJyA6ICdub25lJztcbiAgfSk7XG4gIHJlZnJlc2hMYXlvdXRTdGF0dXNVSSgpO1xufVxuXG5pZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoR0VORVJBVElPTl9TVEFURV9FVkVOVCwgcmVmcmVzaExheW91dFN0YXR1c1VJKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEVTIG1vZHVsZSBleHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuZXhwb3J0IHtcbiAgc2hvd0FsZXJ0TW9kYWwsIGNsb3NlQWxlcnRNb2RhbCxcbiAgc2hvd0NvbmZpcm1Nb2RhbCwgY2xvc2VDb25maXJtTW9kYWwsXG4gIHNob3dUb2FzdCxcbiAgcmVmcmVzaExheW91dFN0YXR1c1VJLFxuICBoYW5kbGVMYXlvdXRGcmVzaG5lc3NDaGlwQ2xpY2ssXG4gIHVwZGF0ZUFjdGlvbkJ1dHRvbnMsXG59O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiBTaGFyZWQgcHJvcG9zYWwtcmV2aWV3IHJvdyByZW5kZXJlciwgZXh0cmFjdGVkIGZyb20gd2ViL2hhcnZlc3QuanMgc28gdGhlXG4gKiBHQVAtMDEgXCJVcGRhdGUgdmlhIEFJXCIgcGFuZWwgKHdlYi9tYXN0ZXItZGF0YS1haS11cGRhdGUuanMpIGRvZXNuJ3RcbiAqIGR1cGxpY2F0ZSBvciBmb3JrIHRoZSBzYW1lIGJlZm9yZS9hZnRlciBkaWZmLXJvdyBVSSBhIHRoaXJkIHRpbWUuXG4gKlxuICogUm93IG1hcmt1cCB1c2VzIGBkYXRhLXRvZ2dsZS1yZWFzb25pbmc9XCJJRFwiYCBhdHRyaWJ1dGVzIGluc3RlYWQgb2YgaW5saW5lXG4gKiBgb25jbGljaz1cIi4uLlwiYCBoYW5kbGVycyBcdTIwMTQgdGhlIGNhbGxlciBhdHRhY2hlcyBPTkUgZGVsZWdhdGVkIGNsaWNrXG4gKiBsaXN0ZW5lciAoYXR0YWNoUHJvcG9zYWxSb3dMaXN0ZW5lcnMpIHJhdGhlciB0aGFuIGVhY2ggcm93IHdpcmluZyBpdHMgb3duXG4gKiBpbmxpbmUgaGFuZGxlci4gVGhpcyBtYXR0ZXJzIGJlY2F1c2UgaGFydmVzdC5qcydzIG9yaWdpbmFsIGlubGluZS1vbmNsaWNrXG4gKiB2ZXJzaW9uIGNhbGxlZCBoYXJ2ZXN0LmpzLXNwZWNpZmljIGdsb2JhbCBmdW5jdGlvbnMgZGlyZWN0bHk7IGEgcm93XG4gKiByZW5kZXJlZCBieSBhIGRpZmZlcmVudCBtb2R1bGUgKG1hc3Rlci1kYXRhLWFpLXVwZGF0ZS5qcykgbXVzdCBub3RcbiAqIHNpbGVudGx5IHJlZmVyZW5jZSBmdW5jdGlvbnMgdGhhdCBkb24ndCBleGlzdCB0aGVyZS5cbiAqXG4gKiBgaWRQcmVmaXhgIGtlZXBzIGVhY2ggY2FsbGVyJ3MgZXhpc3RpbmcgRE9NLWlkIGNvbnZlbnRpb24gaW50YWN0IChlLmcuXG4gKiBoYXJ2ZXN0LmpzJ3MgYGhhcnZlc3Qtcm93LSpgL2BoYXJ2ZXN0LWNoay0qYCwgcmVmZXJlbmNlZCBlbHNld2hlcmUgaW4gdGhhdFxuICogZmlsZSwgbm90YWJseSBhcHBseUhhcnZlc3RTZWxlY3Rpb25zKSByYXRoZXIgdGhhbiBmb3JjaW5nIGEgcmVuYW1lLlxuICpcbiAqIFB1YmxpYyBleHBvcnRzOlxuICogICBlc2Moc3RyKVxuICogICByZW5kZXJQcm9wb3NhbFJvdyhpdGVtLCBvcHRzKVxuICogICBhdHRhY2hQcm9wb3NhbFJvd0xpc3RlbmVycyhjb250YWluZXJFbCwgaWRQcmVmaXgsIGhhbmRsZXJzKVxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBlc2Moc3RyKSB7XG4gIHJldHVybiBTdHJpbmcoc3RyID8/ICcnKVxuICAgIC5yZXBsYWNlKC8mL2csICcmYW1wOycpXG4gICAgLnJlcGxhY2UoLzwvZywgJyZsdDsnKVxuICAgIC5yZXBsYWNlKC8+L2csICcmZ3Q7JylcbiAgICAucmVwbGFjZSgvXCIvZywgJyZxdW90OycpO1xufVxuXG4vKipcbiAqIFJlbmRlciBvbmUgcHJvcG9zYWwtcmV2aWV3IHJvdyAoY2hlY2tib3ggKyBiZWZvcmUvYWZ0ZXIgKyBvcHRpb25hbFxuICogY29sbGFwc2libGUgZGV0YWlsICsgb3B0aW9uYWwgYmFkZ2VzL2ZsYWcgYmFubmVyKS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gaXRlbVxuICogQHBhcmFtIHtzdHJpbmd9IGl0ZW0uaWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBpdGVtLnR5cGVMYWJlbCAgICAgLSBzbWFsbCBjYXBzIGxhYmVsIGFib3ZlIHRoZSByb3cgKGUuZy4gc2VjdGlvbiBuYW1lKVxuICogQHBhcmFtIHtzdHJpbmd9IFtpdGVtLnNvdXJjZUJhZGdlSHRtbF1cbiAqIEBwYXJhbSB7c3RyaW5nfSBpdGVtLmxhYmVsICAgICAgICAgLSBzZWNvbmRhcnkgc3VtbWFyeSBsaW5lXG4gKiBAcGFyYW0ge3N0cmluZ30gW2l0ZW0ub3JpZ2luYWxdICAgIC0gXCJCZWZvcmVcIiBibG9jayB0ZXh0IChvbWl0IGZvciBhZGQtb25seSBwcm9wb3NhbHMpXG4gKiBAcGFyYW0ge3N0cmluZ30gW2l0ZW0ucHJvcG9zZWRdICAgIC0gXCJBZnRlclwiIGJsb2NrIHRleHQgKGFscmVhZHkgZGlzcGxheS1yZWFkeSwgbm90IGEgcmF3IG9iamVjdClcbiAqIEBwYXJhbSB7c3RyaW5nfSBbaXRlbS5kZXRhaWxUZXh0XSAgLSBjb2xsYXBzaWJsZSBkZXRhaWwgKGhhcnZlc3Q6IHJlYXNvbmluZzsgR0FQLTAxOiByYXRpb25hbGUpXG4gKiBAcGFyYW0ge3N0cmluZ30gW2l0ZW0uYmFkZ2VzSHRtbF0gIC0gcHJlLXJlbmRlcmVkIHJpZ2h0LXNpZGUgYmFkZ2UgSFRNTCAoY2FsbGVyLXNwZWNpZmljKVxuICogQHBhcmFtIHtzdHJpbmd9IFtpdGVtLmZsYWdIdG1sXSAgICAtIHByZS1yZW5kZXJlZCBhZHZpc29yeS93YXJuaW5nIGJhbm5lciAoZS5nLiBwb3NzaWJsZS1kdXBsaWNhdGUsIHN0YWxlKVxuICogQHBhcmFtIHtib29sZWFufSBbaXRlbS5jaGVja2VkXVxuICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLmlkUHJlZml4ICAgICAgICAgIC0gc2hhcmVkIHByZWZpeCBmb3Igcm93L3JlYXNvbi9jaGVja2JveCBpZHMsIGUuZy4gJ2hhcnZlc3QnIG9yICdtZHUnXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuY2hlY2tib3hEYXRhQXR0cl0gLSBrZWJhYi1jYXNlIGRhdGEtYXR0cmlidXRlIHN1ZmZpeCwgZS5nLiAnaGFydmVzdC1pZCcgb3IgJ21kdS1pZCdcbiAqICAgKE5PVCBjYW1lbENhc2UgXHUyMDE0IHRoaXMgaXMgaW50ZXJwb2xhdGVkIHZlcmJhdGltIGludG8gYGRhdGEtJHtjaGVja2JveERhdGFBdHRyfWAgaW4gdGhlIEhUTUwgc3RyaW5nO1xuICogICBhIGNhbWVsQ2FzZSB2YWx1ZSBsaWtlICdoYXJ2ZXN0SWQnIHByb2R1Y2VzIHRoZSBsaXRlcmFsIGF0dHJpYnV0ZSBgZGF0YS1oYXJ2ZXN0SWRgLCB3aGljaCB0aGUgSFRNTFxuICogICBwYXJzZXIgbG93ZXJjYXNlcyB0byBgZGF0YS1oYXJ2ZXN0aWRgIG9uIGluc2VydGlvbiwgc2lsZW50bHkgYnJlYWtpbmcgYC5kYXRhc2V0LmhhcnZlc3RJZGAgL1xuICogICBgW2RhdGEtaGFydmVzdC1pZF1gIGxvb2t1cHMgZWxzZXdoZXJlLiBUaGlzIGJpdCBtYXN0ZXItZGF0YS1haS11cGRhdGUuanMncyBvd24gZmlyc3QgZHJhZnQuKVxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmFyaWFMYWJlbFN1ZmZpeF0gIC0gYXBwZW5kZWQgdG8gdGhlIGNoZWNrYm94J3MgYXJpYS1sYWJlbCBhZnRlciBgbGFiZWxgIChlLmcuIGR1cGxpY2F0ZS9mbGFnIHRleHQpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJQcm9wb3NhbFJvdyhpdGVtLCBvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGlkUHJlZml4ID0gJ3Byb3Bvc2FsJyxcbiAgICBjaGVja2JveERhdGFBdHRyID0gJ3Byb3Bvc2FsLWlkJyxcbiAgICBhcmlhTGFiZWxTdWZmaXggPSAnJyxcbiAgfSA9IG9wdHM7XG5cbiAgY29uc3QgY2hlY2tlZCA9IGl0ZW0uY2hlY2tlZCA/ICcgY2hlY2tlZCcgOiAnJztcbiAgY29uc3Qgcm93SWQgPSBgJHtpZFByZWZpeH0tcm93LSR7ZXNjKGl0ZW0uaWQpfWA7XG4gIGNvbnN0IHJlYXNvbklkID0gYCR7aWRQcmVmaXh9LXJlYXNvbi0ke2VzYyhpdGVtLmlkKX1gO1xuICBjb25zdCBjaGVja2JveElkID0gYCR7aWRQcmVmaXh9LWNoay0ke2VzYyhpdGVtLmlkKX1gO1xuICBjb25zdCBhcmlhTGFiZWwgPSBlc2MoYCR7aXRlbS5sYWJlbCB8fCAnJ30ke2FyaWFMYWJlbFN1ZmZpeH1gKTtcblxuICBjb25zdCBoYXNEZXRhaWwgPSBCb29sZWFuKGl0ZW0uZGV0YWlsVGV4dCk7XG4gIGNvbnN0IGRldGFpbFRvZ2dsZSA9IGhhc0RldGFpbFxuICAgID8gYDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGRhdGEtdG9nZ2xlLXJlYXNvbmluZz1cIiR7ZXNjKGl0ZW0uaWQpfVwiIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiIGFyaWEtY29udHJvbHM9XCIke3JlYXNvbklkfVwiIHN0eWxlPVwiZm9udC1zaXplOjAuNzVlbTtiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOm5vbmU7Y29sb3I6dmFyKC0tY3YtZ3JheS01MDApO2N1cnNvcjpwb2ludGVyO3BhZGRpbmc6MCA0cHg7dmVydGljYWwtYWxpZ246bWlkZGxlO1wiIHRpdGxlPVwiVG9nZ2xlIGRldGFpbHNcIj5cdUQ4M0RcdURDQUM8L2J1dHRvbj5gXG4gICAgOiAnJztcbiAgY29uc3QgZGV0YWlsQmxvY2sgPSBoYXNEZXRhaWxcbiAgICA/IGA8ZGl2IGlkPVwiJHtyZWFzb25JZH1cIiBzdHlsZT1cImRpc3BsYXk6bm9uZTttYXJnaW4tdG9wOjZweDtwYWRkaW5nOjhweCAxMHB4O2JhY2tncm91bmQ6dmFyKC0tY3YtYmctbGlnaHQpO2JvcmRlci1sZWZ0OjNweCBzb2xpZCB2YXIoLS1jdi1zbGF0ZS00MDApO2JvcmRlci1yYWRpdXM6NHB4O2ZvbnQtc2l6ZTowLjgyZW07Y29sb3I6dmFyKC0tY3YtdGV4dC1tdXRlZCk7bGluZS1oZWlnaHQ6MS41O1wiPiR7ZXNjKGl0ZW0uZGV0YWlsVGV4dCl9PC9kaXY+YFxuICAgIDogJyc7XG5cbiAgcmV0dXJuIGBcbiAgICA8dHIgaWQ9XCIke3Jvd0lkfVwiIHN0eWxlPVwiYm9yZGVyLWJvdHRvbToxcHggc29saWQgdmFyKC0tY3YtYmctc3VidGxlKTtcIj5cbiAgICAgIDx0ZCBzdHlsZT1cInBhZGRpbmc6MTBweCAxMnB4O3dpZHRoOjM2cHg7dmVydGljYWwtYWxpZ246dG9wO1wiPlxuICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCIke2NoZWNrYm94SWR9XCIgZGF0YS0ke2NoZWNrYm94RGF0YUF0dHJ9PVwiJHtlc2MoaXRlbS5pZCl9XCIke2NoZWNrZWR9XG4gICAgICAgICAgYXJpYS1sYWJlbD1cIiR7YXJpYUxhYmVsfVwiXG4gICAgICAgICAgc3R5bGU9XCJ3aWR0aDoxNnB4O2hlaWdodDoxNnB4O2N1cnNvcjpwb2ludGVyO21hcmdpbi10b3A6MnB4O1wiPlxuICAgICAgPC90ZD5cbiAgICAgIDx0ZCBzdHlsZT1cInBhZGRpbmc6MTBweCAxMnB4O1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmZsZXgtc3RhcnQ7Z2FwOjhweDtmbGV4LXdyYXA6d3JhcDtcIj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDoxO21pbi13aWR0aDoyMDBweDtcIj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC43OGVtO2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjp2YXIoLS1jdi10ZXh0LXNlY29uZGFyeSk7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO2xldHRlci1zcGFjaW5nOjAuMDRlbTttYXJnaW4tYm90dG9tOjRweDtcIj5cbiAgICAgICAgICAgICAgJHtlc2MoaXRlbS50eXBlTGFiZWwgfHwgJycpfSR7aXRlbS5zb3VyY2VCYWRnZUh0bWwgfHwgJyd9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC44N2VtO2NvbG9yOnZhcigtLWN2LXNsYXRlLTQwMCk7bWFyZ2luLWJvdHRvbTo2cHg7XCI+JHtlc2MoaXRlbS5sYWJlbCB8fCAnJyl9PC9kaXY+XG4gICAgICAgICAgICAke2l0ZW0uZmxhZ0h0bWwgfHwgJyd9XG4gICAgICAgICAgICAke2l0ZW0ub3JpZ2luYWwgPyBgXG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTo2cHg7XCI+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC43MmVtO2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjp2YXIoLS1jdi1ncmF5LTUwMCk7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO2xldHRlci1zcGFjaW5nOjAuMDNlbTttYXJnaW4tYm90dG9tOjJweDtcIj5CZWZvcmU8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07Y29sb3I6dmFyKC0tY3YtZ3JheS01MDApO2JhY2tncm91bmQ6dmFyKC0tY3YtYmctbGlnaHQpO2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6NnB4IDhweDtib3JkZXItbGVmdDozcHggc29saWQgdmFyKC0tY3YtZ3JheS0zMDApO2xpbmUtaGVpZ2h0OjEuNTtcIj4ke2VzYyhpdGVtLm9yaWdpbmFsKX08L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PmAgOiAnJ31cbiAgICAgICAgICAgICR7aXRlbS5wcm9wb3NlZCA/IGBcbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjRweDtcIj5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjcyZW07Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOnZhcigtLWN2LWdyYXktNTAwKTt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7bGV0dGVyLXNwYWNpbmc6MC4wM2VtO21hcmdpbi1ib3R0b206MnB4O1wiPkFmdGVyPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2NvbG9yOnZhcigtLWN2LXRleHQtcHJpbWFyeSk7YmFja2dyb3VuZDp2YXIoLS1jdi1zdWNjZXNzLWJnKTtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjZweCA4cHg7Ym9yZGVyLWxlZnQ6M3B4IHNvbGlkIHZhcigtLWN2LXN1Y2Nlc3MtYm9yZGVyKTtsaW5lLWhlaWdodDoxLjU7XCI+JHtlc2MoaXRlbS5wcm9wb3NlZCl9PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5gIDogJyd9XG4gICAgICAgICAgICAke2RldGFpbEJsb2NrfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2dhcDo0cHg7YWxpZ24taXRlbXM6ZmxleC1lbmQ7ZmxleC1zaHJpbms6MDtcIj5cbiAgICAgICAgICAgICR7aXRlbS5iYWRnZXNIdG1sIHx8ICcnfVxuICAgICAgICAgICAgJHtkZXRhaWxUb2dnbGV9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC90ZD5cbiAgICA8L3RyPmA7XG59XG5cbi8qKlxuICogQXR0YWNoIG9uZSBkZWxlZ2F0ZWQgY2xpY2sgbGlzdGVuZXIgdG8gYGNvbnRhaW5lckVsYCBjb3ZlcmluZyBldmVyeVxuICogYFtkYXRhLXRvZ2dsZS1yZWFzb25pbmddYCBlbGVtZW50IHJlbmRlcmVkIGJ5IHJlbmRlclByb3Bvc2FsUm93IHdpdGggdGhlXG4gKiBtYXRjaGluZyBgaWRQcmVmaXhgLiBHdWFyZHMgYWdhaW5zdCBkb3VibGUtYXR0YWNoaW5nIGFjcm9zcyByZXBlYXRlZFxuICogY2FsbHMgKGUuZy4gYSB0YWIgYmVpbmcgcmUtcG9wdWxhdGVkKSB2aWEgYSBtYXJrZXIgb24gYGNvbnRhaW5lckVsYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF0dGFjaFByb3Bvc2FsUm93TGlzdGVuZXJzKGNvbnRhaW5lckVsLCBpZFByZWZpeCwgaGFuZGxlcnMgPSB7fSkge1xuICBpZiAoIWNvbnRhaW5lckVsKSByZXR1cm47XG4gIGNvbnN0IGd1YXJkS2V5ID0gYHByb3Bvc2FsTGlzdGVuZXJzQXR0YWNoZWRfJHtpZFByZWZpeH1gO1xuICBpZiAoY29udGFpbmVyRWwuZGF0YXNldFtndWFyZEtleV0pIHJldHVybjtcbiAgY29udGFpbmVyRWwuZGF0YXNldFtndWFyZEtleV0gPSAnMSc7XG5cbiAgY29udGFpbmVyRWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQpID0+IHtcbiAgICBjb25zdCB0b2dnbGUgPSBldmVudC50YXJnZXQuY2xvc2VzdCgnW2RhdGEtdG9nZ2xlLXJlYXNvbmluZ10nKTtcbiAgICBpZiAoIXRvZ2dsZSkgcmV0dXJuO1xuICAgIGNvbnN0IGlkID0gdG9nZ2xlLmRhdGFzZXQudG9nZ2xlUmVhc29uaW5nO1xuICAgIGNvbnN0IHJlYXNvbkVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7aWRQcmVmaXh9LXJlYXNvbi0ke2lkfWApO1xuICAgIGlmIChyZWFzb25FbCkge1xuICAgICAgY29uc3Qgbm93VmlzaWJsZSA9IHJlYXNvbkVsLnN0eWxlLmRpc3BsYXkgPT09ICdub25lJztcbiAgICAgIHJlYXNvbkVsLnN0eWxlLmRpc3BsYXkgPSBub3dWaXNpYmxlID8gJ2Jsb2NrJyA6ICdub25lJztcbiAgICAgIHRvZ2dsZS5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCBTdHJpbmcobm93VmlzaWJsZSkpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGhhbmRsZXJzLm9uVG9nZ2xlUmVhc29uaW5nID09PSAnZnVuY3Rpb24nKSBoYW5kbGVycy5vblRvZ2dsZVJlYXNvbmluZyhpZCk7XG4gIH0pO1xufVxuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvbGxtLWxvZy5qc1xuICogRmV0Y2hlcyByYXcgTExNIGludGVyYWN0aW9uIGxvZyBlbnRyaWVzIGZyb20gL2FwaS9sbG0tbG9nIGFuZCBkaXNwbGF5c1xuICogdGhlbSBpbiB0aGUgQ29udmVyc2F0aW9uIHBhbmVsIGFzIGNvbGxhcHNpYmxlIHRyYW5zY3JpcHQgZW50cmllcy5cbiAqXG4gKiBFYWNoIExMTSBjYWxsIHNob3dzOlxuICogICAtIEhlYWRlcjogdGltZXN0YW1wIGFuZCBtZXNzYWdlLWNvdW50IHN1bW1hcnlcbiAqICAgLSBQcm9tcHQgc2VjdGlvbjogYWxsIG1lc3NhZ2VzIHNlbnQgKHJvbGUtcHJlZml4ZWQpLCBjb2xsYXBzaWJsZSB3aGVuIGxvbmdcbiAqICAgLSBSZXNwb25zZSBzZWN0aW9uOiByYXcgTExNIHJlc3BvbnNlLCBjb2xsYXBzaWJsZSB3aGVuIGxvbmdcbiAqXG4gKiBERVBFTkRFTkNJRVMgKGdsb2JhbFRoaXMpOlxuICogICAtIGFwcGVuZE1lc3NhZ2VIdG1sICAobWVzc2FnZS1xdWV1ZS5qcylcbiAqICAgLSBnZXRTZXNzaW9uSWRGcm9tVVJMIChhcGktY2xpZW50LmpzKVxuICovXG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IGVzY2FwZUh0bWwgfSBmcm9tICcuL3V0aWxzLmpzJztcbmltcG9ydCB7IGdldFNlc3Npb25JZEZyb21VUkwgfSBmcm9tICcuL2FwaS1jbGllbnQuanMnO1xuXG5jb25zdCBsb2cgPSBnZXRMb2dnZXIoJ2xsbS1sb2cnKTtcblxuLy8gQ3Vyc29yIHRyYWNrcyB0aGUgbmV4dCBpbmRleCB0byBmZXRjaCBmcm9tIC9hcGkvbGxtLWxvZy5cbi8vIEluY3JlbWVudCBhZnRlciBlYWNoIHN1Y2Nlc3NmdWwgZmV0Y2ggYnkgYHRvdGFsYCByZXR1cm5lZCBmcm9tIHRoZSBzZXJ2ZXIuXG5sZXQgX2xsbUxvZ0N1cnNvciA9IDA7XG5cbi8qKiBSZXNldCB0aGUgY3Vyc29yIHRvIDAgKGNhbGwgd2hlbiBhIG5ldyBzZXNzaW9uIGlzIGxvYWRlZCkuICovXG5mdW5jdGlvbiByZXNldExsbUxvZ0N1cnNvcigpIHtcbiAgX2xsbUxvZ0N1cnNvciA9IDA7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ29sbGFwc2libGUgSFRNTCBidWlsZGVyIChtaXJyb3JzIF9tYWtlQ29sbGFwc2libGVDb250ZW50IGluIG1lc3NhZ2UtcXVldWUuanMpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY29uc3QgX0xPR19DT0xMQVBTRV9MSU5FUyA9IDg7XG5jb25zdCBfTE9HX0NPTExBUFNFX0NIQVJTID0gNDgwO1xuXG4vKipcbiAqIFdyYXAgYHRleHRgIGluIGEgY29sbGFwc2libGUgPHByZT4gYmxvY2sgd2hlbiBpdCBleGNlZWRzIHRoZSB0aHJlc2hvbGQuXG4gKiBSZXR1cm5zIGFuIEhUTUwgc3RyaW5nIHJlYWR5IGZvciBpbnNlcnRpb24gdmlhIGlubmVySFRNTC5cbiAqL1xuZnVuY3Rpb24gX2NvbGxhcHNpYmxlUHJlKHRleHQpIHtcbiAgY29uc3QgZXNjYXBlZCA9IGVzY2FwZUh0bWwodGV4dCk7XG4gIGNvbnN0IGxpbmVzICAgPSB0ZXh0LnNwbGl0KCdcXG4nKTtcblxuICBpZiAobGluZXMubGVuZ3RoIDw9IF9MT0dfQ09MTEFQU0VfTElORVMgJiYgdGV4dC5sZW5ndGggPD0gX0xPR19DT0xMQVBTRV9DSEFSUykge1xuICAgIHJldHVybiBgPHByZSBjbGFzcz1cImxsbS1sb2ctdGV4dFwiPiR7ZXNjYXBlZH08L3ByZT5gO1xuICB9XG5cbiAgY29uc3QgcHJldmlld1RleHQgPSBsaW5lcy5zbGljZSgwLCBfTE9HX0NPTExBUFNFX0xJTkVTKS5qb2luKCdcXG4nKTtcbiAgY29uc3Qgb3ZlcmZsb3cgICAgPSBsaW5lcy5sZW5ndGggLSBfTE9HX0NPTExBUFNFX0xJTkVTO1xuICBjb25zdCBpZCAgICAgICAgICA9IGBsbG1sb2ctJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDcpfWA7XG4gIGNvbnN0IGxhYmVsICAgICAgID0gYFNob3cgJHtvdmVyZmxvd30gbW9yZSBsaW5lJHtvdmVyZmxvdyA9PT0gMSA/ICcnIDogJ3MnfVx1MjAyNmA7XG5cbiAgcmV0dXJuIGBcbiAgICA8cHJlIGNsYXNzPVwibGxtLWxvZy10ZXh0IG1zZy1wcmV2aWV3XCIgaWQ9XCIke2lkfS1wcmV2aWV3XCI+JHtlc2NhcGVIdG1sKHByZXZpZXdUZXh0KX1cdTIwMjY8L3ByZT5cbiAgICA8cHJlIGNsYXNzPVwibGxtLWxvZy10ZXh0IG1zZy1mdWxsXCIgICAgaWQ9XCIke2lkfS1mdWxsXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmVcIj4ke2VzY2FwZWR9PC9wcmU+XG4gICAgPGJ1dHRvbiBjbGFzcz1cIm1zZy10b2dnbGUtYnRuXCIgdHlwZT1cImJ1dHRvblwiXG4gICAgICBvbmNsaWNrPVwiKGZ1bmN0aW9uKGJ0bil7XG4gICAgICAgIHZhciBwPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCcke2lkfS1wcmV2aWV3JyksXG4gICAgICAgICAgICBmPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCcke2lkfS1mdWxsJyk7XG4gICAgICAgIGlmKGYuc3R5bGUuZGlzcGxheT09PSdub25lJyl7XG4gICAgICAgICAgcC5zdHlsZS5kaXNwbGF5PSdub25lJzsgZi5zdHlsZS5kaXNwbGF5PSdibG9jayc7IGJ0bi50ZXh0Q29udGVudD0nU2hvdyBsZXNzJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwLnN0eWxlLmRpc3BsYXk9Jyc7IGYuc3R5bGUuZGlzcGxheT0nbm9uZSc7IGJ0bi50ZXh0Q29udGVudD0nJHtsYWJlbH0nO1xuICAgICAgICB9XG4gICAgICB9KSh0aGlzKVwiPiR7bGFiZWx9PC9idXR0b24+YDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBSZW5kZXIgb25lIGludGVyYWN0aW9uIGludG8gdGhlIGNvbnZlcnNhdGlvbiBwYW5lbFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIF9yZW5kZXJJbnRlcmFjdGlvbihpeCkge1xuICBjb25zdCBjb252ZXJzYXRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udmVyc2F0aW9uJyk7XG4gIGlmICghY29udmVyc2F0aW9uKSByZXR1cm47XG5cbiAgY29uc3QgdHMgPSBpeC50aW1lc3RhbXBcbiAgICA/IG5ldyBEYXRlKGl4LnRpbWVzdGFtcCkudG9Mb2NhbGVUaW1lU3RyaW5nKFtdLCB7IGhvdXI6ICcyLWRpZ2l0JywgbWludXRlOiAnMi1kaWdpdCcsIHNlY29uZDogJzItZGlnaXQnIH0pXG4gICAgOiAnJztcblxuICBjb25zdCBtc2dzICAgICA9IEFycmF5LmlzQXJyYXkoaXgubWVzc2FnZXMpID8gaXgubWVzc2FnZXMgOiBbXTtcbiAgY29uc3QgbXNnQ291bnQgPSBtc2dzLmxlbmd0aDtcblxuICAvLyBCdWlsZCBmb3JtYXR0ZWQgcHJvbXB0IHRleHQ6IGVhY2ggbWVzc2FnZSBvbiBpdHMgb3duIGxhYmVsbGVkIGJsb2NrXG4gIGNvbnN0IHByb21wdFRleHQgPSBtc2dzXG4gICAgLm1hcChtID0+IGBbJHsobS5yb2xlIHx8ICd1bmtub3duJykudG9VcHBlckNhc2UoKX1dXFxuJHttLmNvbnRlbnQgfHwgJyd9YClcbiAgICAuam9pbignXFxuXFxuXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXFxuXFxuJyk7XG5cbiAgY29uc3QgcmVzcG9uc2VUZXh0ID0gdHlwZW9mIGl4LnJlc3BvbnNlID09PSAnc3RyaW5nJyA/IGl4LnJlc3BvbnNlIDogJyc7XG5cbiAgY29uc3QgaHRtbCA9IGBcbiAgICA8ZGl2IGNsYXNzPVwibGxtLWxvZy1oZWFkZXJcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwibGxtLWxvZy1pY29uXCI+XHVEODNFXHVERDE2PC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJsbG0tbG9nLWxhYmVsXCI+TExNIEludGVyYWN0aW9uPC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJsbG0tbG9nLW1ldGFcIj4ke21zZ0NvdW50fSBtZXNzYWdlJHttc2dDb3VudCA9PT0gMSA/ICcnIDogJ3MnfTwvc3Bhbj5cbiAgICAgICR7dHMgPyBgPHNwYW4gY2xhc3M9XCJsbG0tbG9nLXRzXCI+JHtlc2NhcGVIdG1sKHRzKX08L3NwYW4+YCA6ICcnfVxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJsbG0tbG9nLXNlY3Rpb25cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJsbG0tbG9nLXNlY3Rpb24tbGFiZWxcIj5Qcm9tcHQ8L2Rpdj5cbiAgICAgICR7X2NvbGxhcHNpYmxlUHJlKHByb21wdFRleHQpfVxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJsbG0tbG9nLXNlY3Rpb25cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJsbG0tbG9nLXNlY3Rpb24tbGFiZWxcIj5SZXNwb25zZTwvZGl2PlxuICAgICAgJHtfY29sbGFwc2libGVQcmUocmVzcG9uc2VUZXh0KX1cbiAgICA8L2Rpdj5gO1xuXG4gIGNvbnN0IG1lc3NhZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgbWVzc2FnZS5jbGFzc05hbWUgPSAnbWVzc2FnZSBsbG0tcmF3JztcbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBjb250ZW50LmNsYXNzTmFtZSA9ICdjb250ZW50JztcbiAgY29udGVudC5pbm5lckhUTUwgPSBodG1sO1xuICBtZXNzYWdlLmFwcGVuZENoaWxkKGNvbnRlbnQpO1xuICBjb252ZXJzYXRpb24uYXBwZW5kQ2hpbGQobWVzc2FnZSk7XG4gIGNvbnZlcnNhdGlvbi5zY3JvbGxUb3AgPSBjb252ZXJzYXRpb24uc2Nyb2xsSGVpZ2h0O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFB1YmxpYyBBUElcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIEZldGNoIExMTSBpbnRlcmFjdGlvbiBsb2cgZW50cmllcyBhZGRlZCBzaW5jZSB0aGUgbGFzdCBjYWxsIGFuZCBkaXNwbGF5XG4gKiBlYWNoIG9uZSBpbiB0aGUgQ29udmVyc2F0aW9uIHBhbmVsLiAgU2FmZSB0byBjYWxsIGFmdGVyIGV2ZXJ5IGJhY2tlbmRcbiAqIG9wZXJhdGlvbiB0aGF0IG1heSB0cmlnZ2VyIExMTSBjYWxscy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZmV0Y2hBbmREaXNwbGF5TGxtTG9nKCkge1xuICBjb25zdCBzZXNzaW9uSWQgPSBnZXRTZXNzaW9uSWRGcm9tVVJMKCk7XG4gIGlmICghc2Vzc2lvbklkKSByZXR1cm47XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChcbiAgICAgIGAvYXBpL2xsbS1sb2c/c2Vzc2lvbl9pZD0ke2VuY29kZVVSSUNvbXBvbmVudChzZXNzaW9uSWQpfSZzaW5jZT0ke19sbG1Mb2dDdXJzb3J9YCxcbiAgICApO1xuICAgIGlmICghcmVzLm9rKSB7XG4gICAgICBsb2cud2FybignbGxtLWxvZyBmZXRjaCBmYWlsZWQnLCByZXMuc3RhdHVzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZGF0YSAgICAgICAgID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBjb25zdCBpbnRlcmFjdGlvbnMgPSBBcnJheS5pc0FycmF5KGRhdGEuaW50ZXJhY3Rpb25zKSA/IGRhdGEuaW50ZXJhY3Rpb25zIDogW107XG5cbiAgICBmb3IgKGNvbnN0IGl4IG9mIGludGVyYWN0aW9ucykge1xuICAgICAgX3JlbmRlckludGVyYWN0aW9uKGl4KTtcbiAgICB9XG5cbiAgICAvLyBBZHZhbmNlIGN1cnNvciB0byB0aGUgbmV3IHRvdGFsIHNvIHRoZSBuZXh0IGNhbGwgZmV0Y2hlcyBvbmx5IG5ldyBlbnRyaWVzLlxuICAgIGlmICh0eXBlb2YgZGF0YS50b3RhbCA9PT0gJ251bWJlcicpIHtcbiAgICAgIF9sbG1Mb2dDdXJzb3IgPSBkYXRhLnRvdGFsO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLmVycm9yKCdmZXRjaEFuZERpc3BsYXlMbG1Mb2cgZXJyb3I6JywgZXJyKTtcbiAgfVxufVxuXG5leHBvcnQgeyBmZXRjaEFuZERpc3BsYXlMbG1Mb2csIHJlc2V0TGxtTG9nQ3Vyc29yIH07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9hdXRoLXByb3ZpZGVyLmpzXG4gKiBDb3BpbG90IC8gR2l0SHViIE9BdXRoIGF1dGggZmxvdywgYmFkZ2UgdXBkYXRlcywgYW5kIHByb3ZpZGVyIGxhYmVsIGZvcm1hdHRpbmcuXG4gKlxuICogREVQRU5ERU5DSUVTOlxuICogICAtIGNvbmZpcm1EaWFsb2cgZnJvbSB1aS1jb3JlLmpzIChvbiBnbG9iYWxUaGlzKVxuICogICAtIHNldEluaXRpYWxGb2N1cywgdHJhcEZvY3VzLCByZXN0b3JlRm9jdXMgZnJvbSB1aS1jb3JlLmpzIChvbiBnbG9iYWxUaGlzKVxuICogICAtIHVwZGF0ZUF1dGhCYWRnZSAoc2VsZi1yZWZlcmVuY2U7IGV4cG9ydGVkIHRvIGdsb2JhbFRoaXMpXG4gKiAgIC0gZ2V0UHJvdmlkZXJJbmZvIGZyb20gcHJvdmlkZXItaW5mby5qcyAoaW1wb3J0ZWQgZGlyZWN0bHkpXG4gKi9cblxuaW1wb3J0IHsgZ2V0UHJvdmlkZXJJbmZvIH0gZnJvbSAnLi9wcm92aWRlci1pbmZvLmpzJztcblxubGV0IF9hdXRoUG9sbFRpbWVyID0gbnVsbDtcblxuZnVuY3Rpb24gZm9ybWF0UHJvdmlkZXJMYWJlbChwcm92aWRlcikge1xuICBpZiAoIXByb3ZpZGVyIHx8IHR5cGVvZiBwcm92aWRlciAhPT0gJ3N0cmluZycpIHJldHVybiAnUHJvdmlkZXInO1xuICBjb25zdCBhbGlhc2VzID0ge1xuICAgIG9wZW5haTogJ09wZW5BSScsXG4gICAgJ2NvcGlsb3Qtb2F1dGgnOiAnQ29waWxvdCBPQXV0aCAoZGVwcmVjYXRlZCknLFxuICAgIGNvcGlsb3Q6ICdDb3BpbG90IChkZXByZWNhdGVkKScsXG4gICAgZ2l0aHViOiAnR2l0SHViIE1vZGVscyAoZGVwcmVjYXRlZCknLFxuICAgICdjb3BpbG90LXNkayc6ICdDb3BpbG90IFNESyAocmVjb21tZW5kZWQpJyxcbiAgfTtcbiAgaWYgKGFsaWFzZXNbcHJvdmlkZXJdKSByZXR1cm4gYWxpYXNlc1twcm92aWRlcl07XG4gIHJldHVybiBwcm92aWRlclxuICAgIC5zcGxpdCgvWy1fXFxzXSsvKVxuICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAubWFwKHBhcnQgPT4gcGFydC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHBhcnQuc2xpY2UoMSkudG9Mb3dlckNhc2UoKSlcbiAgICAuam9pbignICcpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVBdXRoQmFkZ2UoYXV0aFN0YXR1cywgcHJvdmlkZXIgPSBudWxsKSB7XG4gIGNvbnN0IGxlZ2FjeUJhZGdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvcGlsb3QtYXV0aC1iYWRnZScpO1xuICBjb25zdCBsZWdhY3lJY29uICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdXRoLWJhZGdlLWljb24nKTtcbiAgY29uc3QgbGVnYWN5TGFiZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXV0aC1iYWRnZS1sYWJlbCcpO1xuXG4gIGNvbnN0IHBpbGwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtLXN0YXR1cy1waWxsJyk7XG4gIGNvbnN0IHBpbGxJY29uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbS1zdGF0dXMtaWNvbicpO1xuICBjb25zdCBwaWxsTGFiZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtLXN0YXR1cy1sYWJlbCcpO1xuXG4gIGNvbnN0IGFwcGx5U3RhdGUgPSAoa2luZCwgdGV4dCwgaWNvblRleHQpID0+IHtcbiAgICBpZiAobGVnYWN5QmFkZ2UgJiYgbGVnYWN5SWNvbiAmJiBsZWdhY3lMYWJlbCkge1xuICAgICAgbGVnYWN5QmFkZ2UuY2xhc3NMaXN0LnJlbW92ZSgnYXV0aGVudGljYXRlZCcsICd1bmF1dGhlbnRpY2F0ZWQnLCAncG9sbGluZycpO1xuICAgICAgbGVnYWN5QmFkZ2UuY2xhc3NMaXN0LmFkZChraW5kKTtcbiAgICAgIGlmIChraW5kID09PSAnY29ubmVjdGVkJyB8fCBraW5kID09PSAnY29uZmlndXJlZCcpIGxlZ2FjeUJhZGdlLmNsYXNzTGlzdC5hZGQoJ2F1dGhlbnRpY2F0ZWQnKTtcbiAgICAgIGlmIChraW5kID09PSAnY29ubmVjdGluZycpIGxlZ2FjeUJhZGdlLmNsYXNzTGlzdC5hZGQoJ3BvbGxpbmcnKTtcbiAgICAgIGlmIChraW5kID09PSAndW5jb25maWd1cmVkJyB8fCBraW5kID09PSAnYXV0aC1yZXF1aXJlZCcgfHwga2luZCA9PT0gJ3JhdGUtbGltaXRlZCcgfHwga2luZCA9PT0gJ3VuYXZhaWxhYmxlJyB8fCBraW5kID09PSAnZXJyb3InKSBsZWdhY3lCYWRnZS5jbGFzc0xpc3QuYWRkKCd1bmF1dGhlbnRpY2F0ZWQnKTtcbiAgICAgIGxlZ2FjeUljb24udGV4dENvbnRlbnQgPSBpY29uVGV4dDtcbiAgICAgIGxlZ2FjeUxhYmVsLnRleHRDb250ZW50ID0gdGV4dDtcbiAgICB9XG4gICAgaWYgKHBpbGwgJiYgcGlsbEljb24gJiYgcGlsbExhYmVsKSB7XG4gICAgICBwaWxsLmNsYXNzTGlzdC5yZW1vdmUoJ2F1dGhlbnRpY2F0ZWQnLCAndW5hdXRoZW50aWNhdGVkJywgJ3BvbGxpbmcnLCAndW5jb25maWd1cmVkJywgJ2NvbmZpZ3VyZWQnLCAnY29ubmVjdGluZycsICdjb25uZWN0ZWQnLCAnYXV0aC1yZXF1aXJlZCcsICdyYXRlLWxpbWl0ZWQnLCAndW5hdmFpbGFibGUnLCAnZXJyb3InKTtcbiAgICAgIHBpbGwuY2xhc3NMaXN0LmFkZChraW5kKTtcbiAgICAgIGlmIChraW5kID09PSAnY29ubmVjdGVkJyB8fCBraW5kID09PSAnY29uZmlndXJlZCcpIHBpbGwuY2xhc3NMaXN0LmFkZCgnYXV0aGVudGljYXRlZCcpO1xuICAgICAgaWYgKGtpbmQgPT09ICdjb25uZWN0aW5nJykgcGlsbC5jbGFzc0xpc3QuYWRkKCdwb2xsaW5nJyk7XG4gICAgICBpZiAoa2luZCA9PT0gJ3VuY29uZmlndXJlZCcgfHwga2luZCA9PT0gJ2F1dGgtcmVxdWlyZWQnIHx8IGtpbmQgPT09ICdyYXRlLWxpbWl0ZWQnIHx8IGtpbmQgPT09ICd1bmF2YWlsYWJsZScgfHwga2luZCA9PT0gJ2Vycm9yJykgcGlsbC5jbGFzc0xpc3QuYWRkKCd1bmF1dGhlbnRpY2F0ZWQnKTtcbiAgICAgIHBpbGxJY29uLnRleHRDb250ZW50ID0gaWNvblRleHQ7XG4gICAgICBwaWxsTGFiZWwudGV4dENvbnRlbnQgPSB0ZXh0O1xuICAgICAgY29uc3QgdG9vbHRpcE1hcCA9IHtcbiAgICAgICAgdW5jb25maWd1cmVkOiAnTm8gcHJvdmlkZXIvbW9kZWwgaXMgY29uZmlndXJlZCB5ZXQuJyxcbiAgICAgICAgY29uZmlndXJlZDogJ1Byb3ZpZGVyL21vZGVsIGlzIGNvbmZpZ3VyZWQuIENvbm5lY3Rpdml0eSBub3QgeWV0IHZlcmlmaWVkLicsXG4gICAgICAgIGNvbm5lY3Rpbmc6ICdUZXN0aW5nIG9yIGNvbm5lY3RpbmcgdG8gdGhlIHNlbGVjdGVkIHByb3ZpZGVyLicsXG4gICAgICAgIGNvbm5lY3RlZDogJ1Byb3ZpZGVyIHJlc3BvbmRlZCBzdWNjZXNzZnVsbHkgdG8gYSBsaXZlIHJlcXVlc3QuJyxcbiAgICAgICAgJ2F1dGgtcmVxdWlyZWQnOiAnQXV0aGVudGljYXRpb24gaXMgcmVxdWlyZWQuIENoZWNrIEFQSSBrZXkgb3Igc2lnbiBpbi4nLFxuICAgICAgICAncmF0ZS1saW1pdGVkJzogJ1JhdGUgbGltaXQgcmVhY2hlZC4gV2FpdCBiZWZvcmUgcmV0cnlpbmcgcmVxdWVzdHMuJyxcbiAgICAgICAgdW5hdmFpbGFibGU6ICdQcm92aWRlciBpcyB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZSBvciB1bnJlYWNoYWJsZS4nLFxuICAgICAgICBlcnJvcjogJ0Nvbm5lY3Rpb24gZmFpbGVkLiBPcGVuIG1vZGVsIHNldHRpbmdzIGZvciBkZXRhaWxzLicsXG4gICAgICB9O1xuICAgICAgY29uc3QgdGlwID0gdG9vbHRpcE1hcFtraW5kXSB8fCAnJztcbiAgICAgIHBpbGwudGl0bGUgPSB0aXA7XG4gICAgICBwaWxsSWNvbi50aXRsZSA9IHRpcDtcbiAgICAgIHBpbGxMYWJlbC50aXRsZSA9IHRpcDtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgYWN0aXZlUHJvdmlkZXIgPSBwcm92aWRlciB8fCB3aW5kb3cuY3VycmVudFByb3ZpZGVyIHx8IG51bGw7XG4gIGNvbnN0IGlzQ29waWxvdE9BdXRoID0gYWN0aXZlUHJvdmlkZXIgPT09ICdjb3BpbG90LW9hdXRoJztcblxuICAvLyBOb24tY29uZmlkZW50aWFsIGJhZGdlOiBzaG93IHVubGVzcyB0aGUgcHJvdmlkZXIgZXhwbGljaXRseSBtYXJrcyBjb25maWRlbnRpYWw6dHJ1ZS5cbiAgLy8gRGVmYXVsdCBpcyBub24tY29uZmlkZW50aWFsIChmYWlsLXNhZmUgXHUyMDE0IG1vc3QgcHJvdmlkZXJzIHJldGFpbi9yZXZpZXcgQVBJIGRhdGEpLlxuICBjb25zdCBuY0JhZGdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbS1ub24tY29uZmlkZW50aWFsLWJhZGdlJyk7XG4gIGlmIChuY0JhZGdlICYmIGFjdGl2ZVByb3ZpZGVyKSB7XG4gICAgY29uc3QgaW5mbyA9IGdldFByb3ZpZGVySW5mbyhhY3RpdmVQcm92aWRlcik7XG4gICAgbmNCYWRnZS5zdHlsZS5kaXNwbGF5ID0gKGluZm8gJiYgaW5mby5jb25maWRlbnRpYWwgIT09IHRydWUpID8gJycgOiAnbm9uZSc7XG4gIH1cblxuICBpZiAoYWN0aXZlUHJvdmlkZXIgJiYgIWlzQ29waWxvdE9BdXRoKSB7XG4gICAgYXBwbHlTdGF0ZSgnY29uZmlndXJlZCcsIGAke2Zvcm1hdFByb3ZpZGVyTGFiZWwoYWN0aXZlUHJvdmlkZXIpfSBjb25maWd1cmVkYCwgJ1x1MjVENCcpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChhdXRoU3RhdHVzLmF1dGhlbnRpY2F0ZWQpIHtcbiAgICBhcHBseVN0YXRlKCdjb25uZWN0ZWQnLCAnQ29waWxvdCByZWFkeScsICdcdTI3MTMnKTtcbiAgfSBlbHNlIGlmIChhdXRoU3RhdHVzLnBvbGxpbmcpIHtcbiAgICBhcHBseVN0YXRlKCdjb25uZWN0aW5nJywgJ1dhaXRpbmcgZm9yIGFwcHJvdmFsXHUyMDI2JywgJ1x1MjlENycpO1xuICB9IGVsc2Uge1xuICAgIGFwcGx5U3RhdGUoJ2F1dGgtcmVxdWlyZWQnLCAnTm90IGF1dGhlbnRpY2F0ZWQnLCAnXHVEODNEXHVERDExJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2xvc2VDb3BpbG90QXV0aE1vZGFsKCkge1xuICBpZiAoX2F1dGhQb2xsVGltZXIpIHsgY2xlYXJJbnRlcnZhbChfYXV0aFBvbGxUaW1lcik7IF9hdXRoUG9sbFRpbWVyID0gbnVsbDsgfVxuICBpZiAodHlwZW9mIGNsb3NlTW9kZWxNb2RhbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNsb3NlTW9kZWxNb2RhbCgpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBsZWdhY3lPdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F1dGgtbW9kYWwtb3ZlcmxheScpO1xuICBpZiAobGVnYWN5T3ZlcmxheSkgbGVnYWN5T3ZlcmxheS5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJyk7XG4gIGlmICh0eXBlb2YgcmVzdG9yZUZvY3VzID09PSAnZnVuY3Rpb24nKSByZXN0b3JlRm9jdXMoKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEVTIG1vZHVsZSBleHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuZXhwb3J0IHtcbiAgZm9ybWF0UHJvdmlkZXJMYWJlbCwgdXBkYXRlQXV0aEJhZGdlLFxuICBjbG9zZUNvcGlsb3RBdXRoTW9kYWwsXG59O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiBhdHMtbW9kYWxzLmpzXG4gKiBBVFMgUmVwb3J0IGFuZCBKb2IgQW5hbHlzaXMgbW9kYWwgZGlhbG9ncyArIEFUUyBTY29yZSB0YWIgcmVuZGVyZXIuXG4gKlxuICogREVQRU5ERU5DSUVTOlxuICogLSBzdGF0ZS1tYW5hZ2VyLmpzIGZvciBwZXJzaXN0ZWQgQVRTIHNjb3JlICsgYW5hbHlzaXMgZGF0YVxuICogLSB1dGlscy5qcyBmb3IgSFRNTCBlc2NhcGluZ1xuICogLSBhdHMtcmVmaW5lbWVudC5qcyBmb3IgQVRTIGZldGNoL2JhZGdlIHVwZGF0ZXNcbiAqIC0gaW5kZXguaHRtbCBtb2RhbCBvdmVybGF5czogI2F0cy1yZXBvcnQtbW9kYWwtb3ZlcmxheSwgI2pvYi1hbmFseXNpcy1tb2RhbC1vdmVybGF5XG4gKi9cblxuaW1wb3J0IHsgcmVmcmVzaEF0c1Njb3JlLCB1cGRhdGVBdHNCYWRnZSB9IGZyb20gJy4vYXRzLXJlZmluZW1lbnQuanMnO1xuaW1wb3J0IHsgc3RhdGVNYW5hZ2VyIH0gZnJvbSAnLi9zdGF0ZS1tYW5hZ2VyLmpzJztcbmltcG9ydCB7IGVzY2FwZUh0bWwgfSBmcm9tICcuL3V0aWxzLmpzJztcbmltcG9ydCB7IHRyYXBGb2N1cywgcmVzdG9yZUZvY3VzLCBwdXNoRm9jdXNTdGFjayB9IGZyb20gJy4vdWktY29yZS5qcyc7XG5cbmxldCBfYXRzU3lub255bU1hcENhY2hlID0gbnVsbDtcblxuYXN5bmMgZnVuY3Rpb24gX2xvYWRBdHNTeW5vbnltTWFwKCkge1xuICBpZiAoX2F0c1N5bm9ueW1NYXBDYWNoZSkgcmV0dXJuIF9hdHNTeW5vbnltTWFwQ2FjaGU7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2Vzc2lvbklkID0gc3RhdGVNYW5hZ2VyPy5nZXRTZXNzaW9uSWQ/LigpO1xuICAgIGNvbnN0IHVybCA9IHNlc3Npb25JZCA/IGAvYXBpL3N5bm9ueW0tbWFwP3Nlc3Npb25faWQ9JHtlbmNvZGVVUklDb21wb25lbnQoc2Vzc2lvbklkKX1gIDogJy9hcGkvc3lub255bS1tYXAnO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgaWYgKCFyZXMub2spIHJldHVybiAoX2F0c1N5bm9ueW1NYXBDYWNoZSA9IHt9KTtcbiAgICBjb25zdCByYXcgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGNvbnN0IGFsaWFzVG9DYW5vbiA9IHt9O1xuICAgIGNvbnN0IGNhbm9uVG9BbGlhc2VzID0ge307XG4gICAgT2JqZWN0LmVudHJpZXMocmF3KS5mb3JFYWNoKChbYWxpYXMsIGNhbm9uXSkgPT4ge1xuICAgICAgYWxpYXNUb0Nhbm9uW2FsaWFzLnRvTG93ZXJDYXNlKCldID0gY2Fub247XG4gICAgICBjb25zdCBjbCA9IGNhbm9uLnRvTG93ZXJDYXNlKCk7XG4gICAgICAoY2Fub25Ub0FsaWFzZXNbY2xdID0gY2Fub25Ub0FsaWFzZXNbY2xdIHx8IFtdKS5wdXNoKGFsaWFzKTtcbiAgICB9KTtcbiAgICBfYXRzU3lub255bU1hcENhY2hlID0geyBhbGlhc1RvQ2Fub24sIGNhbm9uVG9BbGlhc2VzIH07XG4gIH0gY2F0Y2ggKF8pIHsgX2F0c1N5bm9ueW1NYXBDYWNoZSA9IHt9OyB9XG4gIHJldHVybiBfYXRzU3lub255bU1hcENhY2hlO1xufVxuXG5mdW5jdGlvbiBfa3dTeW5Bbm5vdGF0aW9uKGt3LCBzeW5NYXApIHtcbiAgaWYgKCFzeW5NYXAgfHwgKCFzeW5NYXAuYWxpYXNUb0Nhbm9uICYmICFzeW5NYXAuY2Fub25Ub0FsaWFzZXMpKSByZXR1cm4gJyc7XG4gIGNvbnN0IGtsID0gKGt3IHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICBpZiAoc3luTWFwLmFsaWFzVG9DYW5vbiAmJiBzeW5NYXAuYWxpYXNUb0Nhbm9uW2tsXSkgcmV0dXJuIGA9ICR7c3luTWFwLmFsaWFzVG9DYW5vbltrbF19YDtcbiAgY29uc3QgYWxpYXNlcyA9IHN5bk1hcC5jYW5vblRvQWxpYXNlcyAmJiBzeW5NYXAuY2Fub25Ub0FsaWFzZXNba2xdO1xuICBpZiAoYWxpYXNlcyAmJiBhbGlhc2VzLmxlbmd0aCkgcmV0dXJuIGBhbHNvOiAke2FsaWFzZXMuam9pbignLCAnKX1gO1xuICByZXR1cm4gJyc7XG59XG5cbmNvbnN0IEFUU19HUk9VUFMgPSBbXG4gIFsnaGFyZCcsICdIYXJkIFJlcXVpcmVtZW50cyddLFxuICBbJ3NvZnQnLCAnUHJlZmVycmVkIFNraWxscyddLFxuICBbJ2JvbnVzJywgJ1x1MjYwNSBCb251cyBLZXl3b3JkcyddLFxuXTtcblxuZnVuY3Rpb24gX2tleXdvcmRTdGF0dXMoa2V5d29yZCkge1xuICByZXR1cm4ga2V5d29yZD8uc3RhdHVzIHx8IChrZXl3b3JkPy5mb3VuZCA/ICdtYXRjaGVkJyA6ICdtaXNzaW5nJyk7XG59XG5cbmZ1bmN0aW9uIF9rZXl3b3JkVHlwZShrZXl3b3JkKSB7XG4gIHJldHVybiBrZXl3b3JkPy50eXBlIHx8ICdvdGhlcic7XG59XG5cbmZ1bmN0aW9uIF9pc0V4YWN0TWF0Y2goa2V5d29yZCkge1xuICByZXR1cm4gX2tleXdvcmRTdGF0dXMoa2V5d29yZCkgPT09ICdtYXRjaGVkJyAmJiBrZXl3b3JkPy5tYXRjaF90eXBlICE9PSAncGFydGlhbCc7XG59XG5cbmZ1bmN0aW9uIF9pc1BhcnRpYWxNYXRjaChrZXl3b3JkKSB7XG4gIHJldHVybiBfa2V5d29yZFN0YXR1cyhrZXl3b3JkKSA9PT0gJ3BhcnRpYWwnIHx8IGtleXdvcmQ/Lm1hdGNoX3R5cGUgPT09ICdwYXJ0aWFsJztcbn1cblxuZnVuY3Rpb24gX2tleXdvcmRTb3J0VmFsdWUoa2V5d29yZCkge1xuICBpZiAoX2tleXdvcmRTdGF0dXMoa2V5d29yZCkgPT09ICdtaXNzaW5nJykgcmV0dXJuIDA7XG4gIGlmIChfaXNQYXJ0aWFsTWF0Y2goa2V5d29yZCkpIHJldHVybiAxO1xuICByZXR1cm4gMjtcbn1cblxuZnVuY3Rpb24gX2tleXdvcmRTdGF0dXNCYWRnZShrZXl3b3JkKSB7XG4gIGlmIChfa2V5d29yZFN0YXR1cyhrZXl3b3JkKSA9PT0gJ21pc3NpbmcnKSB7XG4gICAgcmV0dXJuICc8c3BhbiBzdHlsZT1cImRpc3BsYXk6aW5saW5lLWJsb2NrO3BhZGRpbmc6MnB4IDhweDtib3JkZXItcmFkaXVzOjk5OXB4O2JhY2tncm91bmQ6I2ZlZTJlMjtjb2xvcjojOTkxYjFiO2ZvbnQtc2l6ZTowLjhlbTtmb250LXdlaWdodDo2MDA7XCI+XHUyNzRDIE1pc3Npbmc8L3NwYW4+JztcbiAgfVxuICBpZiAoX2lzUGFydGlhbE1hdGNoKGtleXdvcmQpKSB7XG4gICAgcmV0dXJuICc8c3BhbiBzdHlsZT1cImRpc3BsYXk6aW5saW5lLWJsb2NrO3BhZGRpbmc6MnB4IDhweDtib3JkZXItcmFkaXVzOjk5OXB4O2JhY2tncm91bmQ6I2ZlZjNjNztjb2xvcjojOTI0MDBlO2ZvbnQtc2l6ZTowLjhlbTtmb250LXdlaWdodDo2MDA7XCI+XHUyNkEwIFBhcnRpYWw8L3NwYW4+JztcbiAgfVxuICByZXR1cm4gJzxzcGFuIHN0eWxlPVwiZGlzcGxheTppbmxpbmUtYmxvY2s7cGFkZGluZzoycHggOHB4O2JvcmRlci1yYWRpdXM6OTk5cHg7YmFja2dyb3VuZDojZGNmY2U3O2NvbG9yOiMxNjY1MzQ7Zm9udC1zaXplOjAuOGVtO2ZvbnQtd2VpZ2h0OjYwMDtcIj5cdTI3MDUgTWF0Y2hlZDwvc3Bhbj4nO1xufVxuXG5mdW5jdGlvbiBfcmVuZGVyS2V5d29yZEdyb3VwKHRpdGxlLCBrZXl3b3Jkcywgc3luTWFwKSB7XG4gIGlmIChrZXl3b3Jkcy5sZW5ndGggPT09IDApIHJldHVybiAnJztcblxuICBjb25zdCBleGFjdENvdW50ID0ga2V5d29yZHMuZmlsdGVyKF9pc0V4YWN0TWF0Y2gpLmxlbmd0aDtcbiAgY29uc3QgcGFydGlhbENvdW50ID0ga2V5d29yZHMuZmlsdGVyKF9pc1BhcnRpYWxNYXRjaCkubGVuZ3RoO1xuICBjb25zdCBtaXNzaW5nQ291bnQgPSBrZXl3b3Jkcy5maWx0ZXIoa2V5d29yZCA9PiBfa2V5d29yZFN0YXR1cyhrZXl3b3JkKSA9PT0gJ21pc3NpbmcnKS5sZW5ndGg7XG4gIGNvbnN0IHNvcnRlZCA9IFsuLi5rZXl3b3Jkc10uc29ydCgobGVmdCwgcmlnaHQpID0+IHtcbiAgICBjb25zdCBwcmlvcml0eSA9IF9rZXl3b3JkU29ydFZhbHVlKGxlZnQpIC0gX2tleXdvcmRTb3J0VmFsdWUocmlnaHQpO1xuICAgIGlmIChwcmlvcml0eSAhPT0gMCkgcmV0dXJuIHByaW9yaXR5O1xuICAgIHJldHVybiBTdHJpbmcobGVmdC5rZXl3b3JkIHx8IGxlZnQudGVybSB8fCAnJykubG9jYWxlQ29tcGFyZShTdHJpbmcocmlnaHQua2V5d29yZCB8fCByaWdodC50ZXJtIHx8ICcnKSk7XG4gIH0pO1xuXG4gIHJldHVybiBgXG4gICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6MTZweDtcIj5cbiAgICAgIDxoNCBzdHlsZT1cIm1hcmdpbjowIDAgOHB4O2ZvbnQtc2l6ZToxcmVtO2NvbG9yOiMzMzQxNTU7XCI+JHtlc2NhcGVIdG1sKHRpdGxlKX08L2g0PlxuICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjgyZW07Y29sb3I6IzY0NzQ4YjttYXJnaW4tYm90dG9tOjhweDtcIj4ke2V4YWN0Q291bnR9IGV4YWN0IFx1MjAyMiAke3BhcnRpYWxDb3VudH0gcGFydGlhbCBcdTIwMjIgJHttaXNzaW5nQ291bnR9IG1pc3Npbmc8L2Rpdj5cbiAgICAgIDx0YWJsZSBzdHlsZT1cIndpZHRoOjEwMCU7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlO2ZvbnQtc2l6ZTowLjllbTtcIj5cbiAgICAgICAgPHRoZWFkPlxuICAgICAgICAgIDx0ciBzdHlsZT1cInRleHQtYWxpZ246bGVmdDtjb2xvcjojNjQ3NDhiO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNlMmU4ZjA7XCI+XG4gICAgICAgICAgICA8dGggc3R5bGU9XCJwYWRkaW5nOjZweCA4cHg7XCI+S2V5d29yZDwvdGg+XG4gICAgICAgICAgICA8dGggc3R5bGU9XCJwYWRkaW5nOjZweCA4cHg7XCI+Q292ZXJhZ2U8L3RoPlxuICAgICAgICAgICAgPHRoIHN0eWxlPVwicGFkZGluZzo2cHggOHB4O1wiPlNlY3Rpb25zPC90aD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICA8L3RoZWFkPlxuICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgJHtzb3J0ZWQubWFwKGtleXdvcmQgPT4ge1xuICAgICAgICAgICAgY29uc3Qga3cgPSBrZXl3b3JkLmtleXdvcmQgfHwga2V5d29yZC50ZXJtIHx8ICcnO1xuICAgICAgICAgICAgY29uc3Qgc2VjdGlvbnMgPSBBcnJheS5pc0FycmF5KGtleXdvcmQubWF0Y2hlZF9pbl9zZWN0aW9ucykgJiYga2V5d29yZC5tYXRjaGVkX2luX3NlY3Rpb25zLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgPyBrZXl3b3JkLm1hdGNoZWRfaW5fc2VjdGlvbnMuam9pbignLCAnKVxuICAgICAgICAgICAgICA6ICdOb3QgZm91bmQnO1xuICAgICAgICAgICAgY29uc3Qgc3luQW5ub3QgPSBfa3dTeW5Bbm5vdGF0aW9uKGt3LCBzeW5NYXApO1xuICAgICAgICAgICAgY29uc3Qgc3luSHRtbCA9IHN5bkFubm90XG4gICAgICAgICAgICAgID8gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC43OGVtO2NvbG9yOiM2NDc0OGI7bWFyZ2luLXRvcDoycHg7XCIgdGl0bGU9XCJTeW5vbnltIGdyb3VwaW5nXCI+JHtlc2NhcGVIdG1sKHN5bkFubm90KX08L2Rpdj5gXG4gICAgICAgICAgICAgIDogJyc7XG4gICAgICAgICAgICByZXR1cm4gYFxuICAgICAgICAgICAgICA8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZjFmNWY5O3ZlcnRpY2FsLWFsaWduOnRvcDtcIj5cbiAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOjhweDtcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDo2MDA7Y29sb3I6IzFlMjkzYjtcIj4ke2VzY2FwZUh0bWwoa3cpfTwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjhlbTtjb2xvcjojOTRhM2I4O3RleHQtdHJhbnNmb3JtOmNhcGl0YWxpemU7XCI+JHtlc2NhcGVIdG1sKF9rZXl3b3JkVHlwZShrZXl3b3JkKSl9PC9kaXY+XG4gICAgICAgICAgICAgICAgICAke3N5bkh0bWx9XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOjhweDtcIj4ke19rZXl3b3JkU3RhdHVzQmFkZ2Uoa2V5d29yZCl9PC90ZD5cbiAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOjhweDtjb2xvcjojNDc1NTY5O1wiPiR7ZXNjYXBlSHRtbChzZWN0aW9ucyl9PC90ZD5cbiAgICAgICAgICAgICAgPC90cj5gO1xuICAgICAgICAgIH0pLmpvaW4oJycpfVxuICAgICAgICA8L3Rib2R5PlxuICAgICAgPC90YWJsZT5cbiAgICA8L2Rpdj5gO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEFUUyBSZXBvcnQgTW9kYWxcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIE9wZW4gdGhlIEFUUyBSZXBvcnQgbW9kYWwuIFJlbmRlcnMgdGhlIGNhY2hlZCBBVFMgc2NvcmUgZnJvbSBzdGF0ZSwgb3JcbiAqIGZldGNoZXMgYSBmcmVzaCBzY29yZSBpZiBub25lIGlzIGNhY2hlZC5cbiAqL1xuZnVuY3Rpb24gX2F0c0VzY2FwZUhhbmRsZXIoZSkge1xuICBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSBjbG9zZUF0c1JlcG9ydE1vZGFsKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG9wZW5BdHNSZXBvcnRNb2RhbCgpIHtcbiAgcHVzaEZvY3VzU3RhY2soZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7XG4gIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXRzLXJlcG9ydC1tb2RhbC1vdmVybGF5Jyk7XG4gIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIF9hdHNFc2NhcGVIYW5kbGVyKTtcbiAgLy8gTW92ZSBmb2N1cyB0byB0aGUgQ2xvc2UgYnV0dG9uIGluIHRoZSBtb2RhbCBmb290ZXJcbiAgY29uc3QgY2xvc2VCdG4gPSBvdmVybGF5LnF1ZXJ5U2VsZWN0b3IoJy5tb2RhbC1mb290ZXIgLmFjdGlvbi1idG4nKTtcbiAgaWYgKGNsb3NlQnRuKSBjbG9zZUJ0bi5mb2N1cygpO1xuICB0cmFwRm9jdXMoJ2F0cy1yZXBvcnQtbW9kYWwtb3ZlcmxheScpO1xuICBjb25zdCBib2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F0cy1yZXBvcnQtbW9kYWwtYm9keScpO1xuXG4gIC8vIEEgY2FjaGVkIHNjb3JlIHJlbmRlcnMgaW1tZWRpYXRlbHkgdXNpbmcgd2hhdGV2ZXIgc3lub255bSBtYXAgaXMgYWxyZWFkeVxuICAvLyBjYWNoZWQgKG9yIG5vbmUpIHJhdGhlciB0aGFuIGJsb2NraW5nIG9uIGEgbmV0d29yayByb3VuZC10cmlwIGZvciBpdCBcdTIwMTRcbiAgLy8gdGhlIGFubm90YXRpb25zIGFyZSBhbiBlbnJpY2htZW50LCBub3QgcmVxdWlyZWQgZm9yIF9yZW5kZXJBdHNSZXBvcnQgdG9cbiAgLy8gd29yaywgYW5kIGEgY2FjaGVkLXNjb3JlIG9wZW4gc2hvdWxkIGJlIGluc3RhbnQuXG4gIGNvbnN0IGNhY2hlZCA9IHN0YXRlTWFuYWdlcj8uZ2V0QXRzU2NvcmU/LigpO1xuICBpZiAoY2FjaGVkKSB7XG4gICAgYm9keS5pbm5lckhUTUwgPSBfcmVuZGVyQXRzUmVwb3J0KGNhY2hlZCwgX2F0c1N5bm9ueW1NYXBDYWNoZSB8fCB7fSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYm9keS5pbm5lckhUTUwgPSAnPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjEycHg7cGFkZGluZzoyNHB4O2NvbG9yOiM2YjcyODA7XCI+PGRpdiBjbGFzcz1cImxvYWRpbmctc3Bpbm5lclwiIHN0eWxlPVwid2lkdGg6MjBweDtoZWlnaHQ6MjBweDtib3JkZXItd2lkdGg6MnB4O2ZsZXgtc2hyaW5rOjA7XCI+PC9kaXY+PHNwYW4+RmV0Y2hpbmcgQVRTIHNjb3JlXHUyMDI2PC9zcGFuPjwvZGl2Pic7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2Vzc2lvbklkID0gc3RhdGVNYW5hZ2VyPy5nZXRTZXNzaW9uSWQ/LigpO1xuICAgIGNvbnN0IFtzeW5NYXAsIHJlc10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBfbG9hZEF0c1N5bm9ueW1NYXAoKSxcbiAgICAgIGZldGNoKCcvYXBpL2N2L2F0cy1zY29yZScsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHNlc3Npb25faWQ6IHNlc3Npb25JZCwgYmFzaXM6ICdyZXZpZXdfY2hlY2twb2ludCcgfSksXG4gICAgICB9KSxcbiAgICBdKTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vayAmJiBkYXRhLmF0c19zY29yZSkge1xuICAgICAgc3RhdGVNYW5hZ2VyPy5zZXRBdHNTY29yZT8uKGRhdGEuYXRzX3Njb3JlKTtcbiAgICAgIHVwZGF0ZUF0c0JhZGdlKGRhdGEuYXRzX3Njb3JlKTtcbiAgICAgIGJvZHkuaW5uZXJIVE1MID0gX3JlbmRlckF0c1JlcG9ydChkYXRhLmF0c19zY29yZSwgc3luTWFwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYm9keS5pbm5lckhUTUwgPSBgPHAgc3R5bGU9XCJwYWRkaW5nOjI0cHg7Y29sb3I6I2VmNDQ0NDtcIj5Db3VsZCBub3QgbG9hZCBBVFMgcmVwb3J0OiAke2VzY2FwZUh0bWwoZGF0YS5lcnJvciB8fCAndW5rbm93biBlcnJvcicpfTwvcD5gO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGJvZHkuaW5uZXJIVE1MID0gYDxwIHN0eWxlPVwicGFkZGluZzoyNHB4O2NvbG9yOiNlZjQ0NDQ7XCI+RXJyb3I6ICR7ZXNjYXBlSHRtbChlLm1lc3NhZ2UpfTwvcD5gO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNsb3NlQXRzUmVwb3J0TW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdHMtcmVwb3J0LW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgX2F0c0VzY2FwZUhhbmRsZXIpO1xuICByZXN0b3JlRm9jdXMoKTtcbn1cblxuLyoqXG4gKiBSZW5kZXIgYW4gQVRTIHNjb3JlIG9iamVjdCBpbnRvIEhUTUwgZm9yIHRoZSBtb2RhbCBib2R5LlxuICovXG5mdW5jdGlvbiBfcmVuZGVyQXRzUmVwb3J0KHNjb3JlLCBzeW5NYXApIHtcbiAgY29uc3Qgb3ZlcmFsbCA9IE1hdGgucm91bmQoc2NvcmUub3ZlcmFsbCA/PyAwKTtcbiAgY29uc3QgaGFyZCA9IE1hdGgucm91bmQoc2NvcmUuaGFyZF9yZXF1aXJlbWVudF9zY29yZSA/PyAwKTtcbiAgY29uc3Qgc29mdCA9IE1hdGgucm91bmQoc2NvcmUuc29mdF9yZXF1aXJlbWVudF9zY29yZSA/PyAwKTtcblxuICBjb25zdCBzY29yZUNvbG9yID0gb3ZlcmFsbCA+PSA3NSA/ICcjMTBiOTgxJyA6IG92ZXJhbGwgPj0gNTAgPyAnI2Y1OWUwYicgOiAnI2VmNDQ0NCc7XG5cbiAgY29uc3Qga2V5d29yZHMgPSBzY29yZS5rZXl3b3JkX3N0YXR1cyB8fCBbXTtcbiAgY29uc3QgbWlzc2luZ0t3ID0ga2V5d29yZHMuZmlsdGVyKGtleXdvcmQgPT4gX2tleXdvcmRTdGF0dXMoa2V5d29yZCkgPT09ICdtaXNzaW5nJyk7XG4gIGNvbnN0IG1pc3NpbmdIYXJkID0gbWlzc2luZ0t3LmZpbHRlcihrZXl3b3JkID0+IF9rZXl3b3JkVHlwZShrZXl3b3JkKSA9PT0gJ2hhcmQnKTtcbiAgY29uc3Qga2V5d29yZEdyb3VwcyA9IEFUU19HUk9VUFNcbiAgICAubWFwKChbdHlwZSwgdGl0bGVdKSA9PiBfcmVuZGVyS2V5d29yZEdyb3VwKHRpdGxlLCBrZXl3b3Jkcy5maWx0ZXIoa2V5d29yZCA9PiBfa2V5d29yZFR5cGUoa2V5d29yZCkgPT09IHR5cGUpLCBzeW5NYXApKVxuICAgIC5qb2luKCcnKTtcblxuICBjb25zdCBzZWN0aW9uU2NvcmVzID0gc2NvcmUuc2VjdGlvbl9zY29yZXMgfHwge307XG4gIGNvbnN0IHNlY3RIdG1sID0gT2JqZWN0LmtleXMoc2VjdGlvblNjb3JlcykubGVuZ3RoID09PSAwID8gJycgOiBgXG4gICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6MTZweDtcIj5cbiAgICAgIDxoNCBzdHlsZT1cIm1hcmdpbjowIDAgOHB4O2ZvbnQtc2l6ZToxcmVtO2NvbG9yOiMzMzQxNTU7XCI+U2VjdGlvbiBTY29yZXM8L2g0PlxuICAgICAgPHRhYmxlIHN0eWxlPVwid2lkdGg6MTAwJTtib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7Zm9udC1zaXplOjAuOWVtO1wiPlxuICAgICAgICAke09iamVjdC5lbnRyaWVzKHNlY3Rpb25TY29yZXMpLm1hcCgoW3NlYywgdmFsXSkgPT4gYFxuICAgICAgICAgIDx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206MXB4IHNvbGlkICNmMWY1Zjk7XCI+XG4gICAgICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOjRweCA4cHg7dGV4dC10cmFuc2Zvcm06Y2FwaXRhbGl6ZTtjb2xvcjojNDc1NTY5O1wiPiR7ZXNjYXBlSHRtbChzZWMpfTwvdGQ+XG4gICAgICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOjRweCA4cHg7Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOiMxZTI5M2I7XCI+JHtNYXRoLnJvdW5kKHZhbCl9JTwvdGQ+XG4gICAgICAgICAgPC90cj5gKS5qb2luKCcnKX1cbiAgICAgIDwvdGFibGU+XG4gICAgPC9kaXY+YDtcblxuICByZXR1cm4gYFxuICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nOjIwcHg7XCI+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MjRweDttYXJnaW4tYm90dG9tOjIwcHg7XCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6Mi40ZW07Zm9udC13ZWlnaHQ6NzAwO2NvbG9yOiR7c2NvcmVDb2xvcn07XCI+JHtvdmVyYWxsfSU8L2Rpdj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuOWVtO2NvbG9yOiM0NzU1Njk7XCI+SGFyZCByZXF1aXJlbWVudHM6IDxzdHJvbmc+JHtoYXJkfSU8L3N0cm9uZz48L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuOWVtO2NvbG9yOiM0NzU1Njk7XCI+UHJlZmVycmVkIHNraWxsczogPHN0cm9uZz4ke3NvZnR9JTwvc3Ryb25nPjwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC43NWVtO2NvbG9yOiM5NGEzYjg7bWFyZ2luLXRvcDoycHg7XCI+QmFzaXM6ICR7ZXNjYXBlSHRtbChzY29yZS5iYXNpcyB8fCAncmV2aWV3Jyl9PC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjc1ZW07Y29sb3I6Izk0YTNiODttYXJnaW4tdG9wOjRweDtcIiB0aXRsZT1cIlNjb3JlIHRocmVzaG9sZHNcIj5cbiAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIHN0eWxlPVwiY29sb3I6IzEwYjk4MTtcIj5cdTI1Q0Y8L3NwYW4+IFx1MjI2NTc1JSBTdHJvbmcgbWF0Y2ggJm5ic3A7XG4gICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIiBzdHlsZT1cImNvbG9yOiNmNTllMGI7XCI+XHUyNUNGPC9zcGFuPiA1MFx1MjAxMzc0JSBQYXJ0aWFsIG1hdGNoICZuYnNwO1xuICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCIgc3R5bGU9XCJjb2xvcjojZWY0NDQ0O1wiPlx1MjVDRjwvc3Bhbj4gJmx0OzUwJSBMb3cgbWF0Y2hcbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgICR7a2V5d29yZEdyb3Vwc31cbiAgICAgICR7c2VjdEh0bWx9XG4gICAgICAke21pc3NpbmdIYXJkLmxlbmd0aCA+IDAgPyBgXG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOjE2cHg7cGFkZGluZzoxMnB4O2JhY2tncm91bmQ6I2ZmZjdlZDtib3JkZXI6MXB4IHNvbGlkICNmZWQ3YWE7Ym9yZGVyLXJhZGl1czo2cHg7XCI+XG4gICAgICAgICAgPHN0cm9uZyBzdHlsZT1cImNvbG9yOiM5YTM0MTI7XCI+TWlzc2luZyBoYXJkIHJlcXVpcmVtZW50cyAoJHttaXNzaW5nSGFyZC5sZW5ndGh9KTo8L3N0cm9uZz5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiM3YzJkMTI7Zm9udC1zaXplOjAuOWVtO1wiPiAke21pc3NpbmdIYXJkLm1hcChrZXl3b3JkID0+IGVzY2FwZUh0bWwoa2V5d29yZC5rZXl3b3JkIHx8IGtleXdvcmQudGVybSB8fCAnJykpLmpvaW4oJywgJyl9PC9zcGFuPlxuICAgICAgICA8L2Rpdj5gIDogJyd9XG4gICAgICAke21pc3NpbmdLdy5sZW5ndGggPiBtaXNzaW5nSGFyZC5sZW5ndGggPyBgXG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOjE2cHg7cGFkZGluZzoxMnB4O2JhY2tncm91bmQ6I2ZmZjdlZDtib3JkZXI6MXB4IHNvbGlkICNmZWQ3YWE7Ym9yZGVyLXJhZGl1czo2cHg7XCI+XG4gICAgICAgICAgPHN0cm9uZyBzdHlsZT1cImNvbG9yOiM5YTM0MTI7XCI+UmVtYWluaW5nIGtleXdvcmQgZ2FwcyAoJHttaXNzaW5nS3cubGVuZ3RoIC0gbWlzc2luZ0hhcmQubGVuZ3RofSk6PC9zdHJvbmc+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjojN2MyZDEyO2ZvbnQtc2l6ZTowLjllbTtcIj4gJHttaXNzaW5nS3cuZmlsdGVyKGtleXdvcmQgPT4gX2tleXdvcmRUeXBlKGtleXdvcmQpICE9PSAnaGFyZCcpLm1hcChrZXl3b3JkID0+IGVzY2FwZUh0bWwoa2V5d29yZC5rZXl3b3JkIHx8IGtleXdvcmQudGVybSB8fCAnJykpLmpvaW4oJywgJyl9PC9zcGFuPlxuICAgICAgICA8L2Rpdj5gIDogJyd9XG4gICAgPC9kaXY+YDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBKb2IgQW5hbHlzaXMgTW9kYWxcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIE9wZW4gdGhlIEpvYiBBbmFseXNpcyBtb2RhbC4gUmV1c2VzIHRhYkRhdGEuYW5hbHlzaXMgaWYgYXZhaWxhYmxlLlxuICovXG5mdW5jdGlvbiBfam9iQW5hbHlzaXNFc2NhcGVIYW5kbGVyKGUpIHtcbiAgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgY2xvc2VKb2JBbmFseXNpc01vZGFsKCk7XG59XG5cbmZ1bmN0aW9uIG9wZW5Kb2JBbmFseXNpc01vZGFsKCkge1xuICBwdXNoRm9jdXNTdGFjayhkb2N1bWVudC5hY3RpdmVFbGVtZW50KTtcbiAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqb2ItYW5hbHlzaXMtbW9kYWwtb3ZlcmxheScpO1xuICBvdmVybGF5LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBfam9iQW5hbHlzaXNFc2NhcGVIYW5kbGVyKTtcbiAgY29uc3QgY2xvc2VCdG4gPSBvdmVybGF5LnF1ZXJ5U2VsZWN0b3IoJy5tb2RhbC1mb290ZXIgLmFjdGlvbi1idG4nKTtcbiAgaWYgKGNsb3NlQnRuKSBjbG9zZUJ0bi5mb2N1cygpO1xuICB0cmFwRm9jdXMoJ2pvYi1hbmFseXNpcy1tb2RhbC1vdmVybGF5Jyk7XG4gIGNvbnN0IGJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnam9iLWFuYWx5c2lzLW1vZGFsLWJvZHknKTtcblxuICBjb25zdCBhbmFseXNpcyA9IHN0YXRlTWFuYWdlci5nZXRUYWJEYXRhKCdhbmFseXNpcycpO1xuICBpZiAoYW5hbHlzaXMpIHtcbiAgICAvLyBSZW5kZXIgaW50byBhIHRlbXAgZGl2IHVzaW5nIHBvcHVsYXRlQW5hbHlzaXNUYWIncyBvdXRwdXQgcGF0dGVyblxuICAgIGNvbnN0IHRtcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRtcC5zdHlsZS5wYWRkaW5nID0gJzIwcHgnO1xuICAgIGJvZHkuaW5uZXJIVE1MID0gJyc7XG4gICAgYm9keS5hcHBlbmRDaGlsZCh0bXApO1xuICAgIC8vIHBvcHVsYXRlQW5hbHlzaXNUYWIgd3JpdGVzIHRvICNkb2N1bWVudC1jb250ZW50OyB1c2UgYSBzaGltXG4gICAgX3JlbmRlckFuYWx5c2lzSW50b0VsKHRtcCwgYW5hbHlzaXMpO1xuICB9IGVsc2Uge1xuICAgIGJvZHkuaW5uZXJIVE1MID0gJzxwIHN0eWxlPVwicGFkZGluZzoyNHB4O3RleHQtYWxpZ246Y2VudGVyO2NvbG9yOiM2YjcyODA7XCI+Tm8gam9iIGFuYWx5c2lzIGF2YWlsYWJsZS4gUnVuIGpvYiBhbmFseXNpcyBmaXJzdC48L3A+JztcbiAgfVxufVxuXG5mdW5jdGlvbiBjbG9zZUpvYkFuYWx5c2lzTW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqb2ItYW5hbHlzaXMtbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBfam9iQW5hbHlzaXNFc2NhcGVIYW5kbGVyKTtcbiAgcmVzdG9yZUZvY3VzKCk7XG59XG5cbi8qKlxuICogUmVuZGVyIGpvYiBhbmFseXNpcyBkYXRhIGludG8gYW4gYXJiaXRyYXJ5IGNvbnRhaW5lciBlbGVtZW50LlxuICogTWlycm9ycyB0aGUgc3RydWN0dXJlIGZyb20gcG9wdWxhdGVBbmFseXNpc1RhYiBpbiBhcHAuanMuXG4gKi9cbmZ1bmN0aW9uIF9yZW5kZXJBbmFseXNpc0ludG9FbChlbCwgcmVzdWx0KSB7XG4gIGlmICghcmVzdWx0KSB7XG4gICAgZWwuaW5uZXJIVE1MID0gJzxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtcIj5ObyBhbmFseXNpcyBkYXRhLjwvcD4nO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIERlZHVwbGljYXRlIGxpc3RzOiBjYXNlLWluc2Vuc2l0aXZlLCBrZWVwIGZpcnN0IG9jY3VycmVuY2Ugb2YgZWFjaCBub3JtYWxpc2VkIGZvcm0uXG4gIGNvbnN0IF9kZWR1cCA9IChhcnIpID0+IHtcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldCgpO1xuICAgIHJldHVybiAoYXJyIHx8IFtdKS5maWx0ZXIoaXRlbSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBTdHJpbmcodHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnID8gaXRlbSA6IGl0ZW0ua2V5d29yZCB8fCBpdGVtLnRlcm0gfHwgJycpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKCFrZXkgfHwgc2Vlbi5oYXMoa2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgc2Vlbi5hZGQoa2V5KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICB9O1xuICBjb25zdCByZXEgPSBfZGVkdXAocmVzdWx0LnJlcXVpcmVkX3NraWxscyk7XG4gIGNvbnN0IHByZWYgPSBfZGVkdXAocmVzdWx0LnByZWZlcnJlZF9za2lsbHMgfHwgcmVzdWx0Lm5pY2VfdG9faGF2ZSk7XG4gIGNvbnN0IGtleXdvcmRzID0gX2RlZHVwKHJlc3VsdC5hdHNfa2V5d29yZHMpO1xuICBjb25zdCBjdWx0dXJlID0gcmVzdWx0LmN1bHR1cmVfaW5kaWNhdG9ycyB8fCBbXTtcbiAgY29uc3QgbXVzdEhhdmUgPSByZXN1bHQubXVzdF9oYXZlX3JlcXVpcmVtZW50cyB8fCBbXTtcbiAgY29uc3QgbWlzc2luZyA9IHJlc3VsdC5taXNzaW5nX3JlcXVpcmVkIHx8IFtdO1xuXG4gIGVsLmlubmVySFRNTCA9IGBcbiAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuOTVlbTtsaW5lLWhlaWdodDoxLjY7XCI+XG4gICAgICA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZjhmYWZjO2JvcmRlcjoxcHggc29saWQgI2UyZThmMDtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjE0cHggMTZweDttYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MS4xZW07Zm9udC13ZWlnaHQ6NzAwO2NvbG9yOiMxZTI5M2I7XCI+JHtlc2NhcGVIdG1sKHJlc3VsdC5qb2JfdGl0bGUgfHwgcmVzdWx0LnRpdGxlIHx8ICdSb2xlJyl9PC9kaXY+XG4gICAgICAgICR7cmVzdWx0LmNvbXBhbnkgPyBgPGRpdiBzdHlsZT1cImNvbG9yOiM0NzU1Njk7XCI+JHtlc2NhcGVIdG1sKHJlc3VsdC5jb21wYW55KX08L2Rpdj5gIDogJyd9XG4gICAgICAgICR7cmVzdWx0LmRvbWFpbiA/IGA8c3BhbiBzdHlsZT1cImRpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbi10b3A6NnB4O3BhZGRpbmc6MnB4IDhweDtiYWNrZ3JvdW5kOiNkYmVhZmU7Y29sb3I6IzFlNDBhZjtib3JkZXItcmFkaXVzOjEwcHg7Zm9udC1zaXplOjAuOGVtO1wiPiR7ZXNjYXBlSHRtbChyZXN1bHQuZG9tYWluKX08L3NwYW4+YCA6ICcnfVxuICAgICAgPC9kaXY+XG5cbiAgICAgICR7bWlzc2luZy5sZW5ndGggPiAwID8gYFxuICAgICAgICA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZmZmN2VkO2JvcmRlcjoxcHggc29saWQgI2ZlZDdhYTtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjEwcHggMTRweDttYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgICAgPHN0cm9uZyBzdHlsZT1cImNvbG9yOiM5YTM0MTI7XCI+XHUyNkEwIE1pc3NpbmcgcmVxdWlyZWQgc2tpbGxzOjwvc3Ryb25nPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJjb2xvcjojN2MyZDEyO21hcmdpbi10b3A6NHB4O1wiPiR7bWlzc2luZy5tYXAocyA9PiBlc2NhcGVIdG1sKHMpKS5qb2luKCcgXHUwMEI3ICcpfTwvZGl2PlxuICAgICAgICA8L2Rpdj5gIDogJyd9XG5cbiAgICAgICR7cmVxLmxlbmd0aCA+IDAgPyBgXG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgICAgPGg0IHN0eWxlPVwibWFyZ2luOjAgMCA4cHg7Zm9udC1zaXplOjAuOTVlbTt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7bGV0dGVyLXNwYWNpbmc6LjVweDtjb2xvcjojMzM0MTU1O1wiPlJlcXVpcmVkIFNraWxsczwvaDQ+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtmbGV4LXdyYXA6d3JhcDtnYXA6NnB4O1wiPlxuICAgICAgICAgICAgJHtyZXEubWFwKHMgPT4gYDxzcGFuIHN0eWxlPVwicGFkZGluZzoycHggMTBweDtib3JkZXItcmFkaXVzOjEycHg7YmFja2dyb3VuZDoke21pc3NpbmcuaW5jbHVkZXMocyk/JyNmZWUyZTInOicjZGNmY2U3J307Y29sb3I6JHttaXNzaW5nLmluY2x1ZGVzKHMpPycjOTkxYjFiJzonIzE2NjUzNCd9O2ZvbnQtc2l6ZTowLjg1ZW07XCI+JHtlc2NhcGVIdG1sKHMpfTwvc3Bhbj5gKS5qb2luKCcnKX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+YCA6ICcnfVxuXG4gICAgICAke3ByZWYubGVuZ3RoID4gMCA/IGBcbiAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTRweDtcIj5cbiAgICAgICAgICA8aDQgc3R5bGU9XCJtYXJnaW46MCAwIDhweDtmb250LXNpemU6MC45NWVtO3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTtsZXR0ZXItc3BhY2luZzouNXB4O2NvbG9yOiMzMzQxNTU7XCI+UHJlZmVycmVkIC8gTmljZS10by1oYXZlPC9oND5cbiAgICAgICAgICA8dWwgc3R5bGU9XCJtYXJnaW46MDtwYWRkaW5nLWxlZnQ6MThweDtjb2xvcjojNDc1NTY5O1wiPiR7cHJlZi5tYXAocyA9PiBgPGxpPiR7ZXNjYXBlSHRtbChzKX08L2xpPmApLmpvaW4oJycpfTwvdWw+XG4gICAgICAgIDwvZGl2PmAgOiAnJ31cblxuICAgICAgJHtrZXl3b3Jkcy5sZW5ndGggPiAwID8gYFxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgIDxoNCBzdHlsZT1cIm1hcmdpbjowIDAgOHB4O2ZvbnQtc2l6ZTowLjk1ZW07dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO2xldHRlci1zcGFjaW5nOi41cHg7Y29sb3I6IzMzNDE1NTtcIj5BVFMgS2V5d29yZHM8L2g0PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7ZmxleC13cmFwOndyYXA7Z2FwOjZweDtcIj5cbiAgICAgICAgICAgICR7a2V5d29yZHMubWFwKChrLCBpKSA9PiBgPHNwYW4gc3R5bGU9XCJwYWRkaW5nOjJweCA4cHg7Ym9yZGVyLXJhZGl1czoxMnB4O2JhY2tncm91bmQ6I2YwZjlmZjtib3JkZXI6MXB4IHNvbGlkICNiYWU2ZmQ7Y29sb3I6IzAzNjlhMTtmb250LXNpemU6MC44MmVtO1wiPiR7aSA8IDUgPyBgPHN0cm9uZz4jJHtpKzF9PC9zdHJvbmc+IGAgOiAnJ30ke2VzY2FwZUh0bWwodHlwZW9mIGsgPT09ICdzdHJpbmcnID8gayA6IGsua2V5d29yZCB8fCBrLnRlcm0gfHwgJycpfTwvc3Bhbj5gKS5qb2luKCcnKX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+YCA6ICcnfVxuXG4gICAgICAke211c3RIYXZlLmxlbmd0aCA+IDAgPyBgXG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgICAgPGg0IHN0eWxlPVwibWFyZ2luOjAgMCA4cHg7Zm9udC1zaXplOjAuOTVlbTt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7bGV0dGVyLXNwYWNpbmc6LjVweDtjb2xvcjojMzM0MTU1O1wiPk11c3QtaGF2ZSBSZXF1aXJlbWVudHM8L2g0PlxuICAgICAgICAgIDx1bCBzdHlsZT1cIm1hcmdpbjowO3BhZGRpbmctbGVmdDoxOHB4O2NvbG9yOiM0NzU1Njk7XCI+JHttdXN0SGF2ZS5tYXAocyA9PiBgPGxpPiR7ZXNjYXBlSHRtbChzKX08L2xpPmApLmpvaW4oJycpfTwvdWw+XG4gICAgICAgIDwvZGl2PmAgOiAnJ31cblxuICAgICAgJHtjdWx0dXJlLmxlbmd0aCA+IDAgPyBgXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGg0IHN0eWxlPVwibWFyZ2luOjAgMCA4cHg7Zm9udC1zaXplOjAuOTVlbTt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7bGV0dGVyLXNwYWNpbmc6LjVweDtjb2xvcjojMzM0MTU1O1wiPkN1bHR1cmUgSW5kaWNhdG9yczwvaDQ+XG4gICAgICAgICAgPHVsIHN0eWxlPVwibWFyZ2luOjA7cGFkZGluZy1sZWZ0OjE4cHg7Y29sb3I6IzQ3NTU2OTtcIj4ke2N1bHR1cmUubWFwKHMgPT4gYDxsaT4ke2VzY2FwZUh0bWwocyl9PC9saT5gKS5qb2luKCcnKX08L3VsPlxuICAgICAgICA8L2Rpdj5gIDogJyd9XG4gICAgPC9kaXY+YDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBBVFMgU2NvcmUgVGFiIChpbiBjdXN0b21pemUgcGhhc2UpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBQb3B1bGF0ZSB0aGUgQVRTIFNjb3JlIHRhYiBjb250ZW50IGFyZWEuXG4gKiBDYWxsZWQgYnkgYXBwLmpzIHN3aXRjaFRhYiB3aGVuIGNhc2UgJ2F0cy1zY29yZScgaXMgc2VsZWN0ZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBvcHVsYXRlQXRzU2NvcmVUYWIoKSB7XG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9jdW1lbnQtY29udGVudCcpO1xuICBpZiAoIWNvbnRlbnQpIHJldHVybjtcblxuICBjb25zdCBjYWNoZWQgPSBzdGF0ZU1hbmFnZXI/LmdldEF0c1Njb3JlPy4oKTtcbiAgaWYgKGNhY2hlZCkge1xuICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gYDxkaXYgc3R5bGU9XCJtYXgtd2lkdGg6NjgwcHg7bWFyZ2luOjAgYXV0bztcIj4ke19yZW5kZXJBdHNSZXBvcnQoY2FjaGVkKX08L2Rpdj5gO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJlbXB0eS1zdGF0ZVwiPjxkaXYgY2xhc3M9XCJpY29uXCI+XHVEODNEXHVEQ0NBPC9kaXY+PGgzPkFUUyBTY29yZTwvaDM+PHA+Q29tcGxldGUgam9iIGFuYWx5c2lzIGFuZCBza2lsbHMgcmV2aWV3IHRvIHNlZSB5b3VyIEFUUyBzY29yZTwvcD48YnV0dG9uIGNsYXNzPVwiYnRuLXByaW1hcnlcIiBvbmNsaWNrPVwicmVmcmVzaEF0c1Njb3JlKFxcJ3Jldmlld19jaGVja3BvaW50XFwnKS50aGVuKCgpPT5wb3B1bGF0ZUF0c1Njb3JlVGFiKCkpXCI+Q29tcHV0ZSBBVFMgU2NvcmU8L2J1dHRvbj48L2Rpdj4nO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNob3cvaGlkZSB0aGUgbW9kYWwgc2hvcnRjdXQgYnV0dG9ucyB3aGVuIEFUUyBiYWRnZSBiZWNvbWVzIHZpc2libGVcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFNob3cgb3IgaGlkZSB0aGUgQVRTIFJlcG9ydCBhbmQgSm9iIEFuYWx5c2lzIHNob3J0Y3V0IGJ1dHRvbnMuXG4gKiBEcml2ZW4gYnkgdGhlICdhdHMtc2NvcmUtdXBkYXRlZCcgY3VzdG9tIGV2ZW50IGRpc3BhdGNoZWQgYnkgYXBwLmpzXG4gKiB3aGVuZXZlciB1cGRhdGVBdHNCYWRnZSgpIHJ1bnMuIE5vIG1vbmtleS1wYXRjaGluZyByZXF1aXJlZC5cbiAqL1xuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignYXRzLXNjb3JlLXVwZGF0ZWQnLCAoKSA9PiB7XG4gIGNvbnN0IGJhZGdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F0cy1zY29yZS1iYWRnZScpO1xuICBjb25zdCB2aXNpYmxlID0gYmFkZ2UgJiYgYmFkZ2Uuc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnO1xuICBjb25zdCByZXBvcnRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXRzLXJlcG9ydC1idG4nKTtcbiAgY29uc3QgYW5hbHlzaXNCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnam9iLWFuYWx5c2lzLWJ0bicpO1xuICBpZiAocmVwb3J0QnRuKSByZXBvcnRCdG4uc3R5bGUuZGlzcGxheSA9IHZpc2libGUgPyAnaW5saW5lLWJsb2NrJyA6ICdub25lJztcbiAgaWYgKGFuYWx5c2lzQnRuKSBhbmFseXNpc0J0bi5zdHlsZS5kaXNwbGF5ID0gdmlzaWJsZSA/ICdpbmxpbmUtYmxvY2snIDogJ25vbmUnO1xufSk7XG5cbmV4cG9ydCB7XG4gIG9wZW5BdHNSZXBvcnRNb2RhbCxcbiAgY2xvc2VBdHNSZXBvcnRNb2RhbCxcbiAgX3JlbmRlckF0c1JlcG9ydCxcbiAgb3BlbkpvYkFuYWx5c2lzTW9kYWwsXG4gIGNsb3NlSm9iQW5hbHlzaXNNb2RhbCxcbiAgX3JlbmRlckFuYWx5c2lzSW50b0VsLFxuICBwb3B1bGF0ZUF0c1Njb3JlVGFiLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL3Nlc3Npb24tYWN0aW9ucy5qc1xuICogU2Vzc2lvbi1sZXZlbCBkaXNwYXRjaCAoc2VuZEFjdGlvbiksIHNhdmUsIGFuZCBwb3NpdGlvbiB0aXRsZSB1cGRhdGVzLlxuICpcbiAqIERFUEVOREVOQ0lFUyAoYWxsIG9uIGdsb2JhbFRoaXMgYXQgcnVudGltZSk6XG4gKiAgIC0gc3RhdGVNYW5hZ2VyIChzdGF0ZS1tYW5hZ2VyLmpzIFx1MjAxNCBpc0xvYWRpbmcoKS9zZXRUYWJEYXRhKCkpXG4gKiAgIC0gdXNlclNlbGVjdGlvbnMgKHdpbmRvdyBnbG9iYWwgZnJvbSBhcHApXG4gKiAgIC0gYXBwZW5kTG9hZGluZ01lc3NhZ2UsIHJlbW92ZUxvYWRpbmdNZXNzYWdlLCBhcHBlbmRNZXNzYWdlLCBhcHBlbmRSZXRyeU1lc3NhZ2VcbiAqICAgLSBzZXRMb2FkaW5nLCBsbG1GZXRjaCAoZmV0Y2gtdXRpbHMuanMpXG4gKiAgIC0gcGFyc2VNZXNzYWdlUmVzcG9uc2UsIHBhcnNlU3RhdHVzUmVzcG9uc2UgKHZhbGlkYXRvcnMuanMpXG4gKiAgIC0gaGFuZGxlQ3VzdG9taXphdGlvblJlc3BvbnNlIChyZXZpZXctdGFibGUtYmFzZS5qcywgVGllciA0KVxuICogICAtIHJlZnJlc2hBdHNTY29yZSwgc3dpdGNoVGFiLCBmZXRjaFN0YXR1cyAoZ2xvYmFsVGhpcylcbiAqICAgLSBjbGVhclN0YXRlLCBTdG9yYWdlS2V5cyAoc3RhdGUtbWFuYWdlci5qcyAvIGFwaS1jbGllbnQuanMpXG4gKiAgIC0gc2hvd0xvYWRKb2JQYW5lbCwgY2xlYXJKb2JJbnB1dCwgY2xlYXJVUkxJbnB1dCwgX2NsZWFyRmllbGRFcnJvcixcbiAqICAgICBfdXBkYXRlUGFzdGVDaGFyQ291bnQgKGpvYi1pbnB1dC5qcywgVGllciAzKVxuICogICAtIG5vcm1hbGl6ZVBvc2l0aW9uTGFiZWwsIGV4dHJhY3RUaXRsZUFuZENvbXBhbnlGcm9tSm9iVGV4dCxcbiAqICAgICBjbGVhbkpzb25SZXNwb25zZSAodXRpbHMuanMpXG4gKiAgIC0gX3VwZGF0ZVNlc3Npb25Td2l0Y2hlckhlYWRlciAoc2Vzc2lvbi1zd2l0Y2hlci11aS5qcywgVGllciA3KVxuICovXG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmNvbnN0IGxvZyA9IGdldExvZ2dlcignc2Vzc2lvbi1hY3Rpb25zJyk7XG5cbmltcG9ydCB7IFN0b3JhZ2VLZXlzIH0gZnJvbSAnLi9hcGktY2xpZW50LmpzJztcbmltcG9ydCB7IHN0YXRlTWFuYWdlciB9IGZyb20gJy4vc3RhdGUtbWFuYWdlci5qcyc7XG5cbi8qKiBNYXBzIGFjdGlvbiBpZGVudGlmaWVycyB0byBodW1hbi1yZWFkYWJsZSBMTE0gc3RhdHVzIGJhciBsYWJlbHMuICovXG5jb25zdCBfQUNUSU9OX0xBQkVMUyA9IHtcbiAgYW5hbHl6ZV9qb2I6ICAgICAgICAgICAgICAnQW5hbHlzaW5nIGpvYiBkZXNjcmlwdGlvblx1MjAyNicsXG4gIHJlY29tbWVuZF9jdXN0b21pemF0aW9uczogJ0dlbmVyYXRpbmcgY3VzdG9taXNhdGlvbiByZWNvbW1lbmRhdGlvbnNcdTIwMjYnLFxuICBnZW5lcmF0ZV9jdjogICAgICAgICAgICAgICdHZW5lcmF0aW5nIENWIGZpbGVzXHUyMDI2Jyxcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIHNlbmRBY3Rpb24oYWN0aW9uKSB7XG4gIGlmIChzdGF0ZU1hbmFnZXIuaXNMb2FkaW5nKCkpIHJldHVybjtcblxuICBjb25zdCBsb2FkaW5nTXNnID0gYXBwZW5kTG9hZGluZ01lc3NhZ2UoYEV4ZWN1dGluZyAke2FjdGlvbn0uLi5gKTtcbiAgc2V0TG9hZGluZyh0cnVlLCBfQUNUSU9OX0xBQkVMU1thY3Rpb25dIHx8IGAke2FjdGlvbi5yZXBsYWNlKC9fL2csICcgJyl9XHUyMDI2YCk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwYXlsb2FkID0geyBhY3Rpb24gfTtcbiAgICBpZiAoYWN0aW9uID09PSAncmVjb21tZW5kX2N1c3RvbWl6YXRpb25zJyAmJiB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzKSB7XG4gICAgICBwYXlsb2FkLnVzZXJfcHJlZmVyZW5jZXMgPSB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGxsbUZldGNoKCcvYXBpL2FjdGlvbicsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShwYXlsb2FkKSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gcGFyc2VNZXNzYWdlUmVzcG9uc2UoYXdhaXQgcmVzLmpzb24oKSk7XG5cbiAgICByZW1vdmVMb2FkaW5nTWVzc2FnZShsb2FkaW5nTXNnKTtcblxuICAgIGlmIChkYXRhLmVycm9yKSB7XG4gICAgICBhcHBlbmRSZXRyeU1lc3NhZ2UoJ1x1Mjc0QyBFcnJvcjogJyArIGRhdGEuZXJyb3IsICgpID0+IHNlbmRBY3Rpb24oYWN0aW9uKSk7XG4gICAgfSBlbHNlIGlmIChhY3Rpb24gPT09ICdyZWNvbW1lbmRfY3VzdG9taXphdGlvbnMnKSB7XG4gICAgICBjb25zdCBjdXN0b21pemF0aW9uRGF0YSA9IGRhdGEucmVzdWx0Py5jb250ZXh0X2RhdGE/LmN1c3RvbWl6YXRpb25zID8/IGRhdGEucmVzdWx0O1xuICAgICAgYXdhaXQgaGFuZGxlQ3VzdG9taXphdGlvblJlc3BvbnNlKGN1c3RvbWl6YXRpb25EYXRhKTtcbiAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PT0gJ2dlbmVyYXRlX2N2Jykge1xuICAgICAgY29uc3QgZ2VuZXJhdGlvbk1zZyA9IGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsICdcdTIzRjMgR2VuZXJhdGluZyBDViBmaWxlcyAoQVRTIERPQ1ggXHUyMTkyIEhUTUwgXHUyMTkyIEh1bWFuIERPQ1gpLi4uJyk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEyMDsgaSsrKSB7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCA1MDApKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBzdGF0dXNSZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvc3RhdHVzJyk7XG4gICAgICAgICAgY29uc3Qgc3RhdHVzRGF0YSA9IHBhcnNlU3RhdHVzUmVzcG9uc2UoYXdhaXQgc3RhdHVzUmVzLmpzb24oKSk7XG4gICAgICAgICAgY29uc3QgcHJvZ3Jlc3MgICA9IHN0YXR1c0RhdGEuZ2VuZXJhdGlvbl9wcm9ncmVzcyB8fCBbXTtcbiAgICAgICAgICBpZiAocHJvZ3Jlc3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgdG90YWwgPSBwcm9ncmVzcy5sZW5ndGg7XG4gICAgICAgICAgICBjb25zdCBkb25lQ291bnQgPSBwcm9ncmVzcy5maWx0ZXIocCA9PiBwLnN0YXR1cyA9PT0gJ2NvbXBsZXRlJykubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgYWN0aXZlID0gcHJvZ3Jlc3MuZmluZChwID0+IHAuc3RhdHVzICE9PSAnY29tcGxldGUnKTtcbiAgICAgICAgICAgIGNvbnN0IHN0ZXBMYWJlbCA9IGFjdGl2ZVxuICAgICAgICAgICAgICA/IGAke2FjdGl2ZS5zdGVwLnJlcGxhY2UoL18vZywgJyAnKX0gKCR7ZG9uZUNvdW50ICsgMX0gb2YgJHt0b3RhbH0pYFxuICAgICAgICAgICAgICA6IGAke3RvdGFsfSBvZiAke3RvdGFsfSBjb21wbGV0ZWA7XG4gICAgICAgICAgICBpZiAodHlwZW9mIF91cGRhdGVMTE1TdGF0dXNCYXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgX3VwZGF0ZUxMTVN0YXR1c0Jhcih0cnVlLCBgR2VuZXJhdGluZyBDVjogJHtzdGVwTGFiZWx9XHUyMDI2YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzdGVwcyA9IHByb2dyZXNzLm1hcChwID0+XG4gICAgICAgICAgICAgIGAke3Auc3RhdHVzID09PSAnY29tcGxldGUnID8gJ1x1MjcxMycgOiAnXHUyM0YzJ30gJHtwLnN0ZXAucmVwbGFjZSgvXy9nLCAnICcpfSAke3AuZWxhcHNlZF9tcyA/IGAoJHtwLmVsYXBzZWRfbXN9bXMpYCA6ICcnfWBcbiAgICAgICAgICAgICkuam9pbignIFx1MjAyMiAnKTtcbiAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uTXNnKSBnZW5lcmF0aW9uTXNnLnF1ZXJ5U2VsZWN0b3IoJy5jb250ZW50JykudGV4dENvbnRlbnQgPSBgR2VuZXJhdGluZyBDVjogJHtzdGVwc31gO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocHJvZ3Jlc3MuZXZlcnkocCA9PiBwLnN0YXR1cyA9PT0gJ2NvbXBsZXRlJykgJiYgcHJvZ3Jlc3MubGVuZ3RoID4gMCkgYnJlYWs7XG4gICAgICAgIH0gY2F0Y2ggKF9lKSB7IC8qIHBvbGxpbmcgZXJyb3IgXHUyMDE0IGNvbnRpbnVlICovIH1cbiAgICAgIH1cbiAgICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsICdDViBnZW5lcmF0ZWQgc3VjY2Vzc2Z1bGx5ISBSZXZpZXcgeW91ciBsYXlvdXQgYmVsb3cuJyk7XG4gICAgICBzdGF0ZU1hbmFnZXIuc2V0VGFiRGF0YSgnY3YnLCBkYXRhLnJlc3VsdCk7XG4gICAgICByZWZyZXNoQXRzU2NvcmUoJ3Bvc3RfZ2VuZXJhdGlvbicpO1xuICAgICAgc3dpdGNoVGFiKCdsYXlvdXQnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgZGF0YS5yZXN1bHQpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cuZXJyb3IoJz09PSBTRU5EIEFDVElPTiBFUlJPUiA9PT0nLCBhY3Rpb24sIGVycm9yKTtcbiAgICByZW1vdmVMb2FkaW5nTWVzc2FnZShsb2FkaW5nTXNnKTtcbiAgICBpZiAoZXJyb3IubmFtZSAhPT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICBhcHBlbmRSZXRyeU1lc3NhZ2UoJ1x1Mjc0QyBFcnJvcjogJyArIGVycm9yLm1lc3NhZ2UsICgpID0+IHNlbmRBY3Rpb24oYWN0aW9uKSk7XG4gICAgfVxuICB9XG5cbiAgc2V0TG9hZGluZyhmYWxzZSk7XG4gIGF3YWl0IGZldGNoU3RhdHVzKCk7XG4gIGlmICh0eXBlb2YgZmV0Y2hBbmREaXNwbGF5TGxtTG9nID09PSAnZnVuY3Rpb24nKSBmZXRjaEFuZERpc3BsYXlMbG1Mb2coKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZVNlc3Npb24oKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL3NhdmUnLCB7IG1ldGhvZDogJ1BPU1QnIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBpZiAoZGF0YS5zZXNzaW9uX2ZpbGUpIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFN0b3JhZ2VLZXlzLlNFU1NJT05fUEFUSCwgZGF0YS5zZXNzaW9uX2ZpbGUpO1xuICAgICAgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgJ1Nlc3Npb24gc2F2ZWQgc3VjY2Vzc2Z1bGx5LicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcHBlbmRSZXRyeU1lc3NhZ2UoJ1x1Mjc0QyBFcnJvciBzYXZpbmcgc2Vzc2lvbjogJyArIGRhdGEuZXJyb3IsIHNhdmVTZXNzaW9uKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nLmVycm9yKCc9PT0gU0FWRSBTRVNTSU9OIEVSUk9SID09PScsIGVycm9yKTtcbiAgICBhcHBlbmRSZXRyeU1lc3NhZ2UoJ1x1Mjc0QyBFcnJvcjogJyArIGVycm9yLm1lc3NhZ2UsIHNhdmVTZXNzaW9uKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfZm9ybWF0QmFyRGF0ZSh2YWx1ZSkge1xuICBjb25zdCB0ZXh0ID0gU3RyaW5nKHZhbHVlIHx8ICcnKS50cmltKCk7XG4gIGlmICghdGV4dCkgcmV0dXJuICcnO1xuICBpZiAoL15cXGR7NH0tXFxkezJ9LVxcZHsyfSQvLnRlc3QodGV4dCkpIHtcbiAgICBjb25zdCBbeWVhciwgbW9udGgsIGRheV0gPSB0ZXh0LnNwbGl0KCctJyk7XG4gICAgcmV0dXJuIGAke21vbnRofS8ke2RheX0vJHt5ZWFyfWA7XG4gIH1cbiAgY29uc3QgcGFyc2VkID0gbmV3IERhdGUodGV4dCk7XG4gIGlmICghTnVtYmVyLmlzTmFOKHBhcnNlZC5nZXRUaW1lKCkpKSB7XG4gICAgcmV0dXJuIHBhcnNlZC50b0lTT1N0cmluZygpLnNsaWNlKDAsIDEwKTtcbiAgfVxuICByZXR1cm4gdGV4dDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlUG9zaXRpb25UaXRsZShzdGF0dXMgPSB7fSkge1xuICBjb25zdCBwb3NpdGlvbkVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Bvc2l0aW9uLXRpdGxlJyk7XG4gIGlmICghcG9zaXRpb25FbCkgcmV0dXJuO1xuXG4gIGNvbnN0IGZhbGxiYWNrQnJvd3NlclRpdGxlID0gJ0NWIEJ1aWxkZXIgXHUyMDE0IFByb2Zlc3Npb25hbCBXZWIgVUknO1xuICBsZXQgbGFiZWwgPSAoc3RhdHVzLnBvc2l0aW9uX25hbWUgfHwgJycpLnRvU3RyaW5nKCkudHJpbSgpO1xuICBsZXQgY29tcGFueSA9ICcnO1xuICBsZXQgZGF0ZUFwcGxpZWQgPSAnJztcblxuICBpZiAoIWxhYmVsICYmIHN0YXR1cy5qb2JfYW5hbHlzaXMpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYW5hbHlzaXMgPSB0eXBlb2Ygc3RhdHVzLmpvYl9hbmFseXNpcyA9PT0gJ3N0cmluZydcbiAgICAgICAgPyBKU09OLnBhcnNlKGNsZWFuSnNvblJlc3BvbnNlKHN0YXR1cy5qb2JfYW5hbHlzaXMpKVxuICAgICAgICA6IHN0YXR1cy5qb2JfYW5hbHlzaXM7XG4gICAgICBjb25zdCB0aXRsZSA9IGFuYWx5c2lzPy5qb2JfdGl0bGUgfHwgYW5hbHlzaXM/LnRpdGxlIHx8IGFuYWx5c2lzPy5wb3NpdGlvbl9uYW1lIHx8ICcnO1xuICAgICAgbGFiZWwgPSBub3JtYWxpemVQb3NpdGlvbkxhYmVsKHRpdGxlLCBhbmFseXNpcz8uY29tcGFueSk7XG4gICAgICBjb21wYW55ID0gKGFuYWx5c2lzPy5jb21wYW55X25hbWUgfHwgYW5hbHlzaXM/LmNvbXBhbnkgfHwgJycpLnRyaW0oKTtcbiAgICAgIGRhdGVBcHBsaWVkID0gX2Zvcm1hdEJhckRhdGUoYW5hbHlzaXM/LmRhdGVfYXBwbGllZCB8fCBhbmFseXNpcz8uYXBwbGljYXRpb25fZGF0ZSB8fCAnJyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZy53YXJuKCdGYWlsZWQgdG8gcGFyc2Ugam9iX2FuYWx5c2lzIGZvciB0aXRsZTonLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFsYWJlbCAmJiBzdGF0dXMuam9iX2Rlc2NyaXB0aW9uX3RleHQpIHtcbiAgICBjb25zdCBwYXJzZWQgPSBleHRyYWN0VGl0bGVBbmRDb21wYW55RnJvbUpvYlRleHQoc3RhdHVzLmpvYl9kZXNjcmlwdGlvbl90ZXh0KTtcbiAgICBsYWJlbCA9IG5vcm1hbGl6ZVBvc2l0aW9uTGFiZWwocGFyc2VkLnRpdGxlLCBwYXJzZWQuY29tcGFueSk7XG4gICAgaWYgKCFjb21wYW55KSBjb21wYW55ID0gKHBhcnNlZC5jb21wYW55IHx8ICcnKS50cmltKCk7XG4gIH1cblxuICBwb3NpdGlvbkVsLnRleHRDb250ZW50ID0gbGFiZWw7XG4gIGRvY3VtZW50LnRpdGxlID0gbGFiZWwgPyBgJHtsYWJlbH0gXHUyMDE0IENWIEJ1aWxkZXJgIDogZmFsbGJhY2tCcm93c2VyVGl0bGU7XG5cbiAgY29uc3QgcG9zaXRpb25Db21wYW55RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncG9zaXRpb24tY29tcGFueScpO1xuICBpZiAocG9zaXRpb25Db21wYW55RWwpIHtcbiAgICBjb25zdCBpbnRha2UgPSB3aW5kb3cuX3N0YXR1c0ludGFrZSB8fCB7fTtcbiAgICBjb25zdCBmaW5hbENvbXBhbnkgPSAoaW50YWtlLmNvbXBhbnkgfHwgJycpLnRyaW0oKSB8fCBjb21wYW55O1xuICAgIGNvbnN0IGZpbmFsRGF0ZSA9IGRhdGVBcHBsaWVkIHx8IF9mb3JtYXRCYXJEYXRlKGludGFrZS5kYXRlX2FwcGxpZWQgfHwgJycpO1xuICAgIGNvbnN0IHN1YnRpdGxlID0gW2ZpbmFsQ29tcGFueSwgZmluYWxEYXRlXS5maWx0ZXIoQm9vbGVhbikuam9pbignICBcdTAwQjcgICcpO1xuICAgIHBvc2l0aW9uQ29tcGFueUVsLnRleHRDb250ZW50ID0gc3VidGl0bGU7XG4gICAgcG9zaXRpb25Db21wYW55RWwuc3R5bGUuZGlzcGxheSA9IHN1YnRpdGxlID8gJycgOiAnbm9uZSc7XG4gIH1cblxuICBjb25zdCByZW5hbWVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVuYW1lLXNlc3Npb24tYnRuJyk7XG4gIGlmIChyZW5hbWVCdG4pIHJlbmFtZUJ0bi5zdHlsZS5kaXNwbGF5ID0gbGFiZWwgPyAnJyA6ICdub25lJztcbiAgaWYgKHR5cGVvZiBfdXBkYXRlU2Vzc2lvblN3aXRjaGVySGVhZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgX3VwZGF0ZVNlc3Npb25Td2l0Y2hlckhlYWRlcih7IHBvc2l0aW9uX25hbWU6IGxhYmVsLCBwaGFzZTogc3RhdHVzLnBoYXNlIHx8IG51bGwgfSk7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIEVTIG1vZHVsZSBleHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuZXhwb3J0IHsgc2VuZEFjdGlvbiwgc2F2ZVNlc3Npb24sIHVwZGF0ZVBvc2l0aW9uVGl0bGUsIF9BQ1RJT05fTEFCRUxTIH07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9qb2ItYW5hbHlzaXMuanNcbiAqIEpvYiBhbmFseXNpcyBvcmNoZXN0cmF0aW9uOiBmaXJlcyBhbmFseXplX2pvYiBhY3Rpb24sIG1lcmdlcyBwb3N0LWFuYWx5c2lzXG4gKiBxdWVzdGlvbnMsIGFuZCB0cmFuc2l0aW9ucyB0aGUgVUkgdG8gdGhlIGFuYWx5c2lzIHRhYi5cbiAqXG4gKiBERVBFTkRFTkNJRVMgKGFsbCBvbiBnbG9iYWxUaGlzIGF0IHJ1bnRpbWUpOlxuICogICAtIHN0YXRlTWFuYWdlciAoc3RhdGUtbWFuYWdlci5qcyBcdTIwMTQgaXNMb2FkaW5nKCkvc2V0VGFiRGF0YSgpKVxuICogICAtIGxsbUZldGNoLCBzZXRMb2FkaW5nIChmZXRjaC11dGlscy5qcylcbiAqICAgLSBhcHBlbmRMb2FkaW5nTWVzc2FnZSwgcmVtb3ZlTG9hZGluZ01lc3NhZ2UsIGFwcGVuZE1lc3NhZ2UsXG4gKiAgICAgYXBwZW5kUmV0cnlNZXNzYWdlLCBhcHBlbmRGb3JtYXR0ZWRBbmFseXNpcyAobWVzc2FnZS1xdWV1ZS5qcylcbiAqICAgLSBwYXJzZU1lc3NhZ2VSZXNwb25zZSAodmFsaWRhdG9ycy5qcylcbiAqICAgLSBhc2tQb3N0QW5hbHlzaXNRdWVzdGlvbnMgKHF1ZXN0aW9ucy1wYW5lbC5qcylcbiAqICAgLSByZWZyZXNoQXRzU2NvcmUgKGF0cy1yZWZpbmVtZW50LmpzKVxuICogICAtIHN3aXRjaFRhYiAocmV2aWV3LXRhYmxlLWJhc2UuanMsIFRpZXIgNClcbiAqICAgLSBmZXRjaFN0YXR1cyAoYXBwLmpzIG9yY2hlc3RyYXRvciwgVGllciA4KVxuICogICAtIF9zaG93SW50YWtlQ29uZmlybUNhcmQsIF9wcm9jZWVkQWZ0ZXJJbnRha2UgKG1lc3NhZ2UtZGlzcGF0Y2guanMsIFRpZXIgMylcbiAqL1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5jb25zdCBsb2cgPSBnZXRMb2dnZXIoJ2pvYi1hbmFseXNpcycpO1xuXG5pbXBvcnQgeyBTdG9yYWdlS2V5cyB9IGZyb20gJy4vYXBpLWNsaWVudC5qcyc7XG5pbXBvcnQgeyBzdGF0ZU1hbmFnZXIgfSBmcm9tICcuL3N0YXRlLW1hbmFnZXIuanMnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFBvc3QtYW5hbHlzaXMgcXVlc3Rpb24gaGVscGVyc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBOb3JtYWxpc2UgYSByYXcgcXVlc3Rpb25zIGFycmF5IHRvIFt7cXVlc3Rpb24sIHR5cGUsIGNob2ljZXN9XS4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBvc3RBbmFseXNpc1F1ZXN0aW9ucyhyYXdRdWVzdGlvbnMpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHJhd1F1ZXN0aW9ucykpIHJldHVybiBbXTtcbiAgcmV0dXJuIHJhd1F1ZXN0aW9uc1xuICAgIC5maWx0ZXIocSA9PiBxICYmIHR5cGVvZiBxLnF1ZXN0aW9uID09PSAnc3RyaW5nJyAmJiBxLnF1ZXN0aW9uLnRyaW0oKSlcbiAgICAubWFwKChxLCBpZHgpID0+ICh7XG4gICAgICBxdWVzdGlvbjogcS5xdWVzdGlvbi50cmltKCksXG4gICAgICB0eXBlOiAgICAgKHEudHlwZSB8fCBgY2xhcmlmaWNhdGlvbl8ke2lkeCArIDF9YCkudG9TdHJpbmcoKSxcbiAgICAgIGNob2ljZXM6ICBBcnJheS5pc0FycmF5KHEuY2hvaWNlcykgPyBxLmNob2ljZXMgOiBbXSxcbiAgICB9KSk7XG59XG5cbi8qKlxuICogRXh0cmFjdCBudW1iZXJlZC1saXN0IHF1ZXN0aW9ucyBmcm9tIHVuc3RydWN0dXJlZCBhc3Npc3RhbnQgdGV4dC5cbiAqIFJldHVybnMgYXQgbW9zdCA0IHF1ZXN0aW9ucy5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdFN0cnVjdHVyZWRRdWVzdGlvbnNGcm9tQXNzaXN0YW50VGV4dCh0ZXh0KSB7XG4gIGlmICh0eXBlb2YgdGV4dCAhPT0gJ3N0cmluZycgfHwgIXRleHQudHJpbSgpKSByZXR1cm4gW107XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSB0ZXh0LnJlcGxhY2UoL1xcclxcbi9nLCAnXFxuJyk7XG4gIGNvbnN0IGJsb2NrcyA9IG5vcm1hbGl6ZWQuc3BsaXQoL15cXHMqXFxkK1xcLlxccysvbSk7XG4gIGlmIChibG9ja3MubGVuZ3RoIDw9IDEpIHJldHVybiBbXTtcbiAgcmV0dXJuIGJsb2Nrc1xuICAgIC5zbGljZSgxKVxuICAgIC5tYXAoKGJsb2NrLCBpZHgpID0+IHtcbiAgICAgIGNvbnN0IHF1ZXN0aW9uID0gYmxvY2sudHJpbSgpO1xuICAgICAgaWYgKCFxdWVzdGlvbikgcmV0dXJuIG51bGw7XG4gICAgICByZXR1cm4geyBxdWVzdGlvbjogcXVlc3Rpb24uc2xpY2UoMCwgNDAwMCksIHR5cGU6IGBjbGFyaWZpY2F0aW9uXyR7aWR4ICsgMX1gLCBjaG9pY2VzOiBbXSB9O1xuICAgIH0pXG4gICAgLmZpbHRlcihCb29sZWFuKVxuICAgIC5zbGljZSgwLCA0KTtcbn1cblxuLyoqXG4gKiBNZXJnZSBzZXJ2ZXItcHJvdmlkZWQgcXVlc3Rpb25zIHdpdGggdGhvc2UgZXh0cmFjdGVkIGZyb20gdGhlIGFzc2lzdGFudCB0ZXh0LFxuICogZGUtZHVwbGljYXRpbmcgYnkgcXVlc3Rpb24gdGV4dCBhbmQgdHlwZS5cbiAqL1xuZnVuY3Rpb24gbWVyZ2VQb3N0QW5hbHlzaXNRdWVzdGlvbnMoZXhpc3RpbmdRdWVzdGlvbnMsIGluY29taW5nUXVlc3Rpb25zKSB7XG4gIGNvbnN0IGV4aXN0aW5nID0gbm9ybWFsaXplUG9zdEFuYWx5c2lzUXVlc3Rpb25zKGV4aXN0aW5nUXVlc3Rpb25zKTtcbiAgY29uc3QgaW5jb21pbmcgPSBub3JtYWxpemVQb3N0QW5hbHlzaXNRdWVzdGlvbnMoaW5jb21pbmdRdWVzdGlvbnMpO1xuXG4gIGNvbnN0IG1lcmdlZCAgICAgICAgPSBbLi4uZXhpc3RpbmddO1xuICBjb25zdCBzZWVuQnlRdWVzdGlvbiA9IG5ldyBTZXQoZXhpc3RpbmcubWFwKHEgPT4gcS5xdWVzdGlvbi50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xccysvZywgJyAnKS50cmltKCkpKTtcbiAgY29uc3QgdXNlZFR5cGVzICAgICAgPSBuZXcgU2V0KGV4aXN0aW5nLm1hcChxID0+IHEudHlwZSkpO1xuXG4gIGluY29taW5nLmZvckVhY2goKHEsIGlkeCkgPT4ge1xuICAgIGNvbnN0IGtleSA9IHEucXVlc3Rpb24udG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXHMrL2csICcgJykudHJpbSgpO1xuICAgIGlmICgha2V5IHx8IHNlZW5CeVF1ZXN0aW9uLmhhcyhrZXkpKSByZXR1cm47XG4gICAgbGV0IHR5cGUgPSBxLnR5cGUgfHwgYGNsYXJpZmljYXRpb25fJHttZXJnZWQubGVuZ3RoICsgaWR4ICsgMX1gO1xuICAgIGlmICh1c2VkVHlwZXMuaGFzKHR5cGUpKSB0eXBlID0gYCR7dHlwZX1fJHttZXJnZWQubGVuZ3RoICsgaWR4ICsgMX1gO1xuICAgIG1lcmdlZC5wdXNoKHsgcXVlc3Rpb246IHEucXVlc3Rpb24sIHR5cGUsIGNob2ljZXM6IEFycmF5LmlzQXJyYXkocS5jaG9pY2VzKSA/IHEuY2hvaWNlcyA6IFtdIH0pO1xuICAgIHNlZW5CeVF1ZXN0aW9uLmFkZChrZXkpO1xuICAgIHVzZWRUeXBlcy5hZGQodHlwZSk7XG4gIH0pO1xuXG4gIHJldHVybiBtZXJnZWQ7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gYW5hbHl6ZUpvYlxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmFzeW5jIGZ1bmN0aW9uIGFuYWx5emVKb2IoKSB7XG4gIGlmIChzdGF0ZU1hbmFnZXIuaXNMb2FkaW5nKCkpIHJldHVybjtcblxuICBpZiAoIWxvY2FsU3RvcmFnZS5nZXRJdGVtKFN0b3JhZ2VLZXlzLkxMTV9ESVNDTE9TVVJFX1NIT1dOKSkge1xuICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsICdcdTIxMzlcdUZFMEYgQ29udGVudCB5b3Ugc3VibWl0IGlzIHNlbnQgdG8gdGhlIGNvbmZpZ3VyZWQgTExNIHByb3ZpZGVyIGZvciBhbmFseXNpcy4gUmV2aWV3IHlvdXIgcHJvdmlkZXJcXCdzIGRhdGEgcG9saWN5IGZvciBkZXRhaWxzLicpO1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFN0b3JhZ2VLZXlzLkxMTV9ESVNDTE9TVVJFX1NIT1dOLCAnMScpO1xuICB9XG5cbiAgY29uc3QgbG9hZGluZ01zZyA9IGFwcGVuZExvYWRpbmdNZXNzYWdlKCdBbmFseXppbmcgam9iIGRlc2NyaXB0aW9uLi4uJyk7XG4gIHNldExvYWRpbmcodHJ1ZSwgJ0FuYWx5c2luZyBqb2IgZGVzY3JpcHRpb25cdTIwMjYnKTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBsbG1GZXRjaCgnL2FwaS9hY3Rpb24nLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBhY3Rpb246ICdhbmFseXplX2pvYicgfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IHBhcnNlTWVzc2FnZVJlc3BvbnNlKGF3YWl0IHJlcy5qc29uKCkpO1xuXG4gICAgcmVtb3ZlTG9hZGluZ01lc3NhZ2UobG9hZGluZ01zZyk7XG5cbiAgICBpZiAoZGF0YS5lcnJvcikge1xuICAgICAgYXBwZW5kUmV0cnlNZXNzYWdlKCdcdTI3NEMgRXJyb3I6ICcgKyBkYXRhLmVycm9yLCBhbmFseXplSm9iKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcmVzdWx0ICAgICAgID0gZGF0YS5yZXN1bHQ7XG4gICAgICBjb25zdCBhbmFseXNpc1RleHQgPSB0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJyA/IHJlc3VsdCA6IChyZXN1bHQ/LnRleHQpIHx8IG51bGw7XG4gICAgICBjb25zdCBhbmFseXNpc0RhdGEgPSB0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0JyAmJiByZXN1bHQgIT09IG51bGxcbiAgICAgICAgPyAocmVzdWx0LmNvbnRleHRfZGF0YT8uam9iX2FuYWx5c2lzID8/IHJlc3VsdClcbiAgICAgICAgOiByZXN1bHQ7XG4gICAgICBjb25zdCBjb250ZXh0UXVlc3Rpb25zID0gKHR5cGVvZiByZXN1bHQgPT09ICdvYmplY3QnICYmIHJlc3VsdCAhPT0gbnVsbClcbiAgICAgICAgPyByZXN1bHQuY29udGV4dF9kYXRhPy5wb3N0X2FuYWx5c2lzX3F1ZXN0aW9uc1xuICAgICAgICA6IG51bGw7XG4gICAgICBjb25zdCBzdHJ1Y3R1cmVkUXVlc3Rpb25zID0gbWVyZ2VQb3N0QW5hbHlzaXNRdWVzdGlvbnMoXG4gICAgICAgIGNvbnRleHRRdWVzdGlvbnMsXG4gICAgICAgIChjb250ZXh0UXVlc3Rpb25zICYmIGNvbnRleHRRdWVzdGlvbnMubGVuZ3RoID4gMClcbiAgICAgICAgICA/IFtdXG4gICAgICAgICAgOiBleHRyYWN0U3RydWN0dXJlZFF1ZXN0aW9uc0Zyb21Bc3Npc3RhbnRUZXh0KGFuYWx5c2lzVGV4dCksXG4gICAgICApO1xuXG4gICAgICBpZiAoYW5hbHlzaXNUZXh0KSBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCBhbmFseXNpc1RleHQpO1xuICAgICAgYXBwZW5kRm9ybWF0dGVkQW5hbHlzaXMoYW5hbHlzaXNEYXRhKTtcbiAgICAgIHN0YXRlTWFuYWdlci5zZXRUYWJEYXRhKCdhbmFseXNpcycsIGFuYWx5c2lzRGF0YSk7XG4gICAgICByZWZyZXNoQXRzU2NvcmUoJ2FuYWx5c2lzJyk7XG4gICAgICBzd2l0Y2hUYWIoJ2FuYWx5c2lzJyk7XG5cbiAgICAgIGNvbnN0IGNvbnRpbnVlQWZ0ZXJJbnRha2UgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGFza1Bvc3RBbmFseXNpc1F1ZXN0aW9ucyhhbmFseXNpc0RhdGEsIHN0cnVjdHVyZWRRdWVzdGlvbnMpO1xuICAgICAgfTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaW50YWtlUmVzICA9IGF3YWl0IGxsbUZldGNoKCcvYXBpL2ludGFrZS1tZXRhZGF0YScpO1xuICAgICAgICBjb25zdCBpbnRha2VEYXRhID0gYXdhaXQgaW50YWtlUmVzLmpzb24oKTtcbiAgICAgICAgaWYgKGludGFrZURhdGEuY29uZmlybWVkKSB7XG4gICAgICAgICAgYXdhaXQgX3Byb2NlZWRBZnRlckludGFrZShjb250aW51ZUFmdGVySW50YWtlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhd2FpdCBfc2hvd0ludGFrZUNvbmZpcm1DYXJkKGNvbnRpbnVlQWZ0ZXJJbnRha2UpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChfZSkge1xuICAgICAgICBhd2FpdCBjb250aW51ZUFmdGVySW50YWtlKCk7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy5lcnJvcignPT09IEFOQUxZWkUgSk9CIEVSUk9SID09PScsIGVycm9yKTtcbiAgICByZW1vdmVMb2FkaW5nTWVzc2FnZShsb2FkaW5nTXNnKTtcbiAgICBpZiAoZXJyb3IubmFtZSAhPT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICBhcHBlbmRSZXRyeU1lc3NhZ2UoJ1x1Mjc0QyBFcnJvcjogJyArIGVycm9yLm1lc3NhZ2UsIGFuYWx5emVKb2IpO1xuICAgIH1cbiAgfVxuXG4gIHNldExvYWRpbmcoZmFsc2UpO1xuICAvLyBVcGRhdGUgdGhlIHBvc2l0aW9uLXRpdGxlIGJhciB3aXRoIHRoZSBsYXRlc3Qgc2Vzc2lvbiBuYW1lIGFmdGVyIGFuYWx5c2lzLlxuICB0cnkge1xuICAgIGNvbnN0IGxhdGVzdFN0YXR1cyA9IGF3YWl0IGZldGNoU3RhdHVzKCk7XG4gICAgaWYgKGxhdGVzdFN0YXR1cyAmJiB0eXBlb2YgdXBkYXRlUG9zaXRpb25UaXRsZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdXBkYXRlUG9zaXRpb25UaXRsZShsYXRlc3RTdGF0dXMpO1xuICAgIH1cbiAgfSBjYXRjaCAoX2UpIHsgLyogbm9uLWZhdGFsICovIH1cbiAgaWYgKHR5cGVvZiBmZXRjaEFuZERpc3BsYXlMbG1Mb2cgPT09ICdmdW5jdGlvbicpIGZldGNoQW5kRGlzcGxheUxsbUxvZygpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgRVMgbW9kdWxlIGV4cG9ydHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5leHBvcnQge1xuICBub3JtYWxpemVQb3N0QW5hbHlzaXNRdWVzdGlvbnMsXG4gIGV4dHJhY3RTdHJ1Y3R1cmVkUXVlc3Rpb25zRnJvbUFzc2lzdGFudFRleHQsXG4gIG1lcmdlUG9zdEFuYWx5c2lzUXVlc3Rpb25zLFxuICBhbmFseXplSm9iLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL2dvYWxzLmpzIFx1MjAxNCBHZW5lcmF0aW9uIEdvYWxzIGNvbmZpZ3VyYXRpb24gdGFiLlxuICpcbiAqIEFsbG93cyB0aGUgdXNlciB0byBzZXQgZG9jdW1lbnQtbGVuZ3RoIGFuZCBjaGFyYWN0ZXItY291bnQgY29uc3RyYWludHMgdGhhdFxuICogYXJlIGluamVjdGVkIGludG8gZXZlcnkgTExNIHByb21wdCBhbmQgdXNlZCB0byBjb250cm9sIHRoZSBmaW5hbCBQREYgbGVuZ3RoLlxuICpcbiAqIEZpZWxkczpcbiAqICAgcGRmX3BhZ2VzX2VuYWJsZWQgICAgXHUyMDE0IHdoZXRoZXIgdGhlIFBERiBwYWdlIGdvYWwgaXMgYWN0aXZlXG4gKiAgIG1heF9wZGZfcGFnZXNfbW9kZSAgIFx1MjAxNCAnY29tYmluZWQnIHwgJ3NwbGl0J1xuICogICBtYXhfcGRmX3BhZ2VzICAgICAgICBcdTIwMTQgY29tYmluZWQgdG90YWwgUERGIHBhZ2UgZ29hbCAobW9kZT1jb21iaW5lZClcbiAqICAgbWF4X3BkZl9yZXN1bWVfcGFnZXMgXHUyMDE0IHJlc3VtZS1wb3J0aW9uIHBhZ2UgZ29hbCAobW9kZT1zcGxpdClcbiAqICAgbWF4X3BkZl9jdl9wYWdlcyAgICAgXHUyMDE0IENWL3B1YmxpY2F0aW9ucyBwb3J0aW9uIHBhZ2UgZ29hbCAobW9kZT1zcGxpdClcbiAqICAgYXRzX3BhZ2VzX2VuYWJsZWQgICAgXHUyMDE0IHdoZXRoZXIgdGhlIEFUUyBwYWdlIGdvYWwgaXMgYWN0aXZlXG4gKiAgIG1heF9hdHNfcGFnZXMgICAgICAgIFx1MjAxNCB0YXJnZXQgcGFnZSBjb3VudCBmb3IgQVRTIHBsYWluLXRleHQgb3V0cHV0XG4gKiAgIGF0c19jaGFyc19lbmFibGVkICAgIFx1MjAxNCB3aGV0aGVyIHRoZSBBVFMgY2hhcmFjdGVyIGxpbWl0IGlzIGFjdGl2ZSAoZGVmYXVsdCBmYWxzZSlcbiAqICAgbWF4X2F0c19jaGFycyAgICAgICAgXHUyMDE0IG1heGltdW0gY2hhcmFjdGVycyAoaW5jbHVkaW5nIHNwYWNlcykgZm9yIEFUUyB0ZXh0XG4gKlxuICogRWFjaCBnb2FsIGhhcyBhIGNoZWNrYm94IHRvIGVuYWJsZSBvciBkaXNhYmxlIGl0OyBkaXNhYmxlZCBnb2FscyBhcmUgbm90XG4gKiBzZW50IHRvIHRoZSBiYWNrZW5kIGFuZCBhcmUgbm90IGluamVjdGVkIGludG8gcHJvbXB0cy5cbiAqXG4gKiBERVBFTkRFTkNJRVMgKGF2YWlsYWJsZSBvbiBnbG9iYWxUaGlzIHZpYSBtYWluLmpzKTpcbiAqICAgYXBpQ2FsbCAoYXBpLWNsaWVudC5qcylcbiAqL1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5cbmNvbnN0IGxvZyA9IGdldExvZ2dlcignZ29hbHMnKTtcblxuY29uc3QgR09BTFNfREVGQVVMVFMgPSB7XG4gIHBkZl9wYWdlc19lbmFibGVkOiAgICB0cnVlLFxuICBtYXhfcGRmX3BhZ2VzX21vZGU6ICAgJ2NvbWJpbmVkJyxcbiAgbWF4X3BkZl9wYWdlczogICAgICAgIDIsXG4gIG1heF9wZGZfcmVzdW1lX3BhZ2VzOiAyLFxuICBtYXhfcGRmX2N2X3BhZ2VzOiAgICAgMSxcbiAgYXRzX3BhZ2VzX2VuYWJsZWQ6ICAgIHRydWUsXG4gIG1heF9hdHNfcGFnZXM6ICAgICAgICAxLFxuICBhdHNfY2hhcnNfZW5hYmxlZDogICAgZmFsc2UsXG4gIG1heF9hdHNfY2hhcnM6ICAgICAgICA1MDAwLFxufTtcblxuLyoqIFNoYXJlZCBpbmxpbmUgc3R5bGVzICovXG5jb25zdCBTID0ge1xuICBzZWN0aW9uOiAgICAnbWFyZ2luLWJvdHRvbToyMHB4O2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyLCNlMGUwZTApO2JvcmRlci1yYWRpdXM6NnB4O3BhZGRpbmc6MTZweCcsXG4gIGhlYWRlcjogICAgICdkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDoxMHB4O21hcmdpbi1ib3R0b206MTJweCcsXG4gIGNoZWNrYm94OiAgICd3aWR0aDoxNnB4O2hlaWdodDoxNnB4O2N1cnNvcjpwb2ludGVyO2ZsZXgtc2hyaW5rOjAnLFxuICBsYWJlbDogICAgICAnZm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxcmVtO2N1cnNvcjpwb2ludGVyO21hcmdpbjowJyxcbiAgaGludDogICAgICAgJ2ZvbnQtc2l6ZTowLjg3NXJlbTtjb2xvcjp2YXIoLS10ZXh0LXNlY29uZGFyeSwjNTU1KTttYXJnaW46MCAwIDhweCcsXG4gIG51bUlucHV0OiAgICdwYWRkaW5nOjZweCAxMHB4O2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyLCNjY2MpO2JvcmRlci1yYWRpdXM6NHB4O2ZvbnQtc2l6ZToxcmVtJyxcbiAgcm93OiAgICAgICAgJ2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweCcsXG4gIG11dGVkOiAgICAgICdjb2xvcjp2YXIoLS10ZXh0LXNlY29uZGFyeSwjNTU1KScsXG4gIHJhZGlvTGFiZWw6ICdkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6ZmxleC1zdGFydDtnYXA6OHB4O2N1cnNvcjpwb2ludGVyJyxcbiAgcmFkaW9JbnB1dDogJ21hcmdpbi10b3A6M3B4Jyxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwb3B1bGF0ZUdvYWxzVGFiKCkge1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgaWYgKCFjb250ZW50KSByZXR1cm47XG5cbiAgY29udGVudC5pbm5lckhUTUwgPSBgXG4gICAgPGRpdiBjbGFzcz1cImdvYWxzLXBhbmVsXCIgc3R5bGU9XCJtYXgtd2lkdGg6NjQwcHg7bWFyZ2luOjAgYXV0bztwYWRkaW5nOjI4cHggMjRweFwiPlxuICAgICAgPGgyIHN0eWxlPVwibWFyZ2luLXRvcDowO21hcmdpbi1ib3R0b206OHB4XCI+XHVEODNDXHVERkFGIEdlbmVyYXRpb24gR29hbHM8L2gyPlxuICAgICAgPHAgc3R5bGU9XCIke1MubXV0ZWR9O21hcmdpbi1ib3R0b206MjRweDtsaW5lLWhlaWdodDoxLjVcIj5cbiAgICAgICAgU2V0IG9wdGlvbmFsIGxlbmd0aCBjb25zdHJhaW50cyBmb3IgdGhlIGdlbmVyYXRlZCBDVi5cbiAgICAgICAgQ2hlY2sgZWFjaCBnb2FsIHlvdSB3YW50IHRvIGVuZm9yY2U7IHVuY2hlY2tlZCBnb2FscyBhcmUgaWdub3JlZC5cbiAgICAgICAgVGhlc2UgZ3VpZGUgdGhlIEFJIGF0IGV2ZXJ5IGVkaXRpbmcgc3RhZ2UgYW5kIGNvbnRyb2wgdGhlIGZpbmFsIGRvY3VtZW50IGxlbmd0aC5cbiAgICAgIDwvcD5cblxuICAgICAgPCEtLSBcdTI1MDBcdTI1MDAgUERGIFBhZ2UgTGVuZ3RoIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMCAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJnb2Fscy1zZWN0aW9uXCIgc3R5bGU9XCIke1Muc2VjdGlvbn1cIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cIiR7Uy5oZWFkZXJ9XCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiZ29hbHMtcGRmLWVuYWJsZWRcIlxuICAgICAgICAgICAgICAgICBvbmNoYW5nZT1cImdvYWxzVG9nZ2xlU2VjdGlvbigncGRmJylcIlxuICAgICAgICAgICAgICAgICBjaGVja2VkIHN0eWxlPVwiJHtTLmNoZWNrYm94fVwiPlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJnb2Fscy1wZGYtZW5hYmxlZFwiIHN0eWxlPVwiJHtTLmxhYmVsfVwiPlBERiBQYWdlIExlbmd0aDwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwiZ29hbHMtcGRmLWJvZHlcIj5cbiAgICAgICAgICA8cCBzdHlsZT1cIiR7Uy5oaW50fVwiPlxuICAgICAgICAgICAgVGFyZ2V0IHBhZ2UgY291bnQgZm9yIHRoZSBodW1hbi1yZWFkYWJsZSBQREYgKGUuZy4gMVx1MjAxMzMpLlxuICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtnYXA6MTJweFwiPlxuXG4gICAgICAgICAgICA8IS0tIFx1MjUwMFx1MjUwMCBTaW5nbGUgdG90YWwgb3B0aW9uIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMCAtLT5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBzdHlsZT1cIiR7Uy5yYWRpb0xhYmVsfVwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwiZ29hbHMtcGRmLW1vZGVcIiB2YWx1ZT1cImNvbWJpbmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJnb2Fscy1wZGYtbW9kZS1jb21iaW5lZFwiXG4gICAgICAgICAgICAgICAgICAgICAgIG9uY2hhbmdlPVwiZ29hbHNVcGRhdGVQZGZNb2RlKClcIiBjaGVja2VkXG4gICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiJHtTLnJhZGlvSW5wdXR9XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgICAgICA8c3Ryb25nPlNpbmdsZSB0b3RhbDwvc3Ryb25nPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtc2l6ZTowLjg3NXJlbTske1MubXV0ZWR9O21hcmdpbi10b3A6MnB4XCI+XG4gICAgICAgICAgICAgICAgICAgIE9uZSBwYWdlIGdvYWwgY292ZXJpbmcgdGhlIGVudGlyZSBkb2N1bWVudCwgaW5jbHVkaW5nXG4gICAgICAgICAgICAgICAgICAgIHB1YmxpY2F0aW9ucyBhbmQgY2l0YXRpb25zLlxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGRpdiBpZD1cImdvYWxzLXBkZi1jb21iaW5lZFwiXG4gICAgICAgICAgICAgICAgICAgc3R5bGU9XCJwYWRkaW5nLWxlZnQ6MjRweDttYXJnaW4tdG9wOjhweDske1Mucm93fVwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJnb2Fscy1tYXgtcGRmLXBhZ2VzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgbWluPVwiMVwiIG1heD1cIjEwXCIgc3RlcD1cIjFcIlxuICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT1cIiR7R09BTFNfREVGQVVMVFMubWF4X3BkZl9wYWdlc31cIlxuICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOjkwcHg7JHtTLm51bUlucHV0fVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiJHtTLm11dGVkfVwiPnBhZ2VzIHRvdGFsPC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIFx1MjUwMFx1MjUwMCBTcGxpdCBwb3J0aW9ucyBvcHRpb24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwIC0tPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIHN0eWxlPVwiJHtTLnJhZGlvTGFiZWx9XCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJnb2Fscy1wZGYtbW9kZVwiIHZhbHVlPVwic3BsaXRcIlxuICAgICAgICAgICAgICAgICAgICAgICBpZD1cImdvYWxzLXBkZi1tb2RlLXNwbGl0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgb25jaGFuZ2U9XCJnb2Fsc1VwZGF0ZVBkZk1vZGUoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiJHtTLnJhZGlvSW5wdXR9XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgICAgICA8c3Ryb25nPlNwbGl0IHBvcnRpb25zPC9zdHJvbmc+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC1zaXplOjAuODc1cmVtOyR7Uy5tdXRlZH07bWFyZ2luLXRvcDoycHhcIj5cbiAgICAgICAgICAgICAgICAgICAgU2VwYXJhdGUgcGFnZSBnb2FscyBmb3IgdGhlIHJlc3VtZSBwb3J0aW9uIChleHBlcmllbmNlLCBza2lsbHMpXG4gICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgQ1YvcHVibGljYXRpb25zIHBvcnRpb24gKGNpdGF0aW9ucywgcHVibGljYXRpb25zKS5cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxkaXYgaWQ9XCJnb2Fscy1wZGYtc3BsaXRcIlxuICAgICAgICAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZy1sZWZ0OjI0cHg7bWFyZ2luLXRvcDo4cHg7ZGlzcGxheTpub25lO2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtnYXA6OHB4XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cIiR7Uy5yb3d9XCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWwgc3R5bGU9XCJtaW4td2lkdGg6MTg1cHg7Zm9udC1zaXplOjAuOXJlbVwiPlJlc3VtZSBwb3J0aW9uOjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiZ29hbHMtbWF4LXBkZi1yZXN1bWUtcGFnZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIG1pbj1cIjFcIiBtYXg9XCIxMFwiIHN0ZXA9XCIxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT1cIiR7R09BTFNfREVGQVVMVFMubWF4X3BkZl9yZXN1bWVfcGFnZXN9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOjkwcHg7JHtTLm51bUlucHV0fVwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCIke1MubXV0ZWR9XCI+cGFnZXM8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cIiR7Uy5yb3d9XCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWwgc3R5bGU9XCJtaW4td2lkdGg6MTg1cHg7Zm9udC1zaXplOjAuOXJlbVwiPkNWIC8gUHVibGljYXRpb25zIHBvcnRpb246PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJnb2Fscy1tYXgtcGRmLWN2LXBhZ2VzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICBtaW49XCIxXCIgbWF4PVwiMTBcIiBzdGVwPVwiMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCIke0dPQUxTX0RFRkFVTFRTLm1heF9wZGZfY3ZfcGFnZXN9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOjkwcHg7JHtTLm51bUlucHV0fVwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCIke1MubXV0ZWR9XCI+cGFnZXM8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8L2Rpdj48IS0tIGVuZCBtb2RlIG9wdGlvbnMgY29sdW1uIC0tPlxuICAgICAgICA8L2Rpdj48IS0tIGVuZCBnb2Fscy1wZGYtYm9keSAtLT5cbiAgICAgIDwvZGl2PjwhLS0gZW5kIFBERiBzZWN0aW9uIC0tPlxuXG4gICAgICA8IS0tIFx1MjUwMFx1MjUwMCBBVFMgUGxhaW4tVGV4dCBQYWdlIExlbmd0aCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDAgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiZ29hbHMtc2VjdGlvblwiIHN0eWxlPVwiJHtTLnNlY3Rpb259XCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCIke1MuaGVhZGVyfVwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImdvYWxzLWF0cy1wYWdlcy1lbmFibGVkXCJcbiAgICAgICAgICAgICAgICAgb25jaGFuZ2U9XCJnb2Fsc1RvZ2dsZVNlY3Rpb24oJ2F0cy1wYWdlcycpXCJcbiAgICAgICAgICAgICAgICAgY2hlY2tlZCBzdHlsZT1cIiR7Uy5jaGVja2JveH1cIj5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwiZ29hbHMtYXRzLXBhZ2VzLWVuYWJsZWRcIiBzdHlsZT1cIiR7Uy5sYWJlbH1cIj5BVFMgUGxhaW4tVGV4dCBQYWdlIExlbmd0aDwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwiZ29hbHMtYXRzLXBhZ2VzLWJvZHlcIj5cbiAgICAgICAgICA8cCBzdHlsZT1cIiR7Uy5oaW50fVwiPlxuICAgICAgICAgICAgVGFyZ2V0IG51bWJlciBvZiBwYWdlcyBmb3IgdGhlIEFUUy1vcHRpbWlzZWQgcGxhaW4tdGV4dCBvdXRwdXQgKHR5cGljYWxseSAxXHUyMDEzMikuXG4gICAgICAgICAgPC9wPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCIke1Mucm93fVwiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cImdvYWxzLW1heC1hdHMtcGFnZXNcIlxuICAgICAgICAgICAgICAgICAgIG1pbj1cIjFcIiBtYXg9XCI1XCIgc3RlcD1cIjFcIlxuICAgICAgICAgICAgICAgICAgIHZhbHVlPVwiJHtHT0FMU19ERUZBVUxUUy5tYXhfYXRzX3BhZ2VzfVwiXG4gICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDo5MHB4OyR7Uy5udW1JbnB1dH1cIj5cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiJHtTLm11dGVkfVwiPnBhZ2VzPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFx1MjUwMFx1MjUwMCBBVFMgQ2hhcmFjdGVyIENvdW50IChkaXNhYmxlZCBieSBkZWZhdWx0KSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDAgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiZ29hbHMtc2VjdGlvblwiIHN0eWxlPVwiJHtTLnNlY3Rpb259O21hcmdpbi1ib3R0b206MjhweFwiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiJHtTLmhlYWRlcn1cIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJnb2Fscy1hdHMtY2hhcnMtZW5hYmxlZFwiXG4gICAgICAgICAgICAgICAgIG9uY2hhbmdlPVwiZ29hbHNUb2dnbGVTZWN0aW9uKCdhdHMtY2hhcnMnKVwiXG4gICAgICAgICAgICAgICAgIHN0eWxlPVwiJHtTLmNoZWNrYm94fVwiPlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJnb2Fscy1hdHMtY2hhcnMtZW5hYmxlZFwiIHN0eWxlPVwiJHtTLmxhYmVsfVwiPkFUUyBDaGFyYWN0ZXIgQ291bnQgTGltaXQ8L2xhYmVsPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjAuOHJlbTske1MubXV0ZWR9O2ZvbnQtc3R5bGU6aXRhbGljXCI+KG9wdGlvbmFsIFx1MjAxNCB1bmNvbW1vbik8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwiZ29hbHMtYXRzLWNoYXJzLWJvZHlcIiBzdHlsZT1cIm9wYWNpdHk6MC40O3BvaW50ZXItZXZlbnRzOm5vbmVcIj5cbiAgICAgICAgICA8cCBzdHlsZT1cIiR7Uy5oaW50fVwiPlxuICAgICAgICAgICAgTWF4aW11bSBjaGFyYWN0ZXJzIChpbmNsdWRpbmcgc3BhY2VzKSBpbiB0aGUgQVRTIHBsYWluLXRleHQgb3V0cHV0LlxuICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiJHtTLnJvd31cIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJnb2Fscy1tYXgtYXRzLWNoYXJzXCJcbiAgICAgICAgICAgICAgICAgICBtaW49XCI1MDBcIiBtYXg9XCIyMDAwMFwiIHN0ZXA9XCIxMDBcIlxuICAgICAgICAgICAgICAgICAgIHZhbHVlPVwiJHtHT0FMU19ERUZBVUxUUy5tYXhfYXRzX2NoYXJzfVwiXG4gICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDoxMTBweDske1MubnVtSW5wdXR9XCI+XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cIiR7Uy5tdXRlZH1cIj5jaGFyYWN0ZXJzPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFx1MjUwMFx1MjUwMCBHZW5lcmF0aW9uIFNldHRpbmdzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMCAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJnb2Fscy1zZWN0aW9uXCIgc3R5bGU9XCIke1Muc2VjdGlvbn07bWFyZ2luLWJvdHRvbToyOHB4XCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCIke1MuaGVhZGVyfVwiPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjEuMXJlbVwiPlx1MjY5OVx1RkUwRjwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cIiR7Uy5sYWJlbH1cIj5HZW5lcmF0aW9uIFNldHRpbmdzPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHAgc3R5bGU9XCIke1MuaGludH1cIj5cbiAgICAgICAgICBDb250cm9scyB0aGUgc2hhcGUgb2YgdGhlIGdlbmVyYXRlZCBDViBcdTIwMTQgYXBwbGllZCBkdXJpbmcgY3VzdG9taXphdGlvbiBhbmQgcmV3cml0ZSBzdGVwcy5cbiAgICAgICAgPC9wPlxuXG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2dhcDoxNHB4XCI+XG4gICAgICAgICAgPCEtLSBNYXggc2tpbGxzIC0tPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDoxMnB4O2ZsZXgtd3JhcDp3cmFwXCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwiZ29hbHMtbWF4LXNraWxscy1pbnB1dFwiIHN0eWxlPVwiZm9udC1zaXplOjAuOXJlbTtjb2xvcjojNGI1NTYzO3doaXRlLXNwYWNlOm5vd3JhcDttaW4td2lkdGg6MTYwcHhcIj5cbiAgICAgICAgICAgICAgTWF4IHNraWxscyBpbiBDVjpcbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhbmdlXCIgaWQ9XCJnb2Fscy1tYXgtc2tpbGxzLWlucHV0XCIgbWluPVwiMVwiIG1heD1cIjYwXCIgc3RlcD1cIjFcIiB2YWx1ZT1cIjIwXCJcbiAgICAgICAgICAgICAgICAgICBvbmlucHV0PVwiZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLW1heC1za2lsbHMtdmFsdWUnKS50ZXh0Q29udGVudD10aGlzLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICBvbmNoYW5nZT1cImdvYWxzQXV0b1NhdmVTZXR0aW5ncygpXCJcbiAgICAgICAgICAgICAgICAgICBzdHlsZT1cImZsZXg6MTttaW4td2lkdGg6MTIwcHg7YWNjZW50LWNvbG9yOiMzYjgyZjZcIj5cbiAgICAgICAgICAgIDxzcGFuIGlkPVwiZ29hbHMtbWF4LXNraWxscy12YWx1ZVwiIHN0eWxlPVwiZm9udC13ZWlnaHQ6NjAwO2NvbG9yOiMxZTI5M2I7bWluLXdpZHRoOjJlbTt0ZXh0LWFsaWduOnJpZ2h0XCI+MjA8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjgyZW07JHtTLm11dGVkfVwiPihkZWZhdWx0OiAyMCk8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIFNraWxscyBzZWN0aW9uIHRpdGxlIC0tPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDoxMnB4O2ZsZXgtd3JhcDp3cmFwXCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwiZ29hbHMtc2tpbGxzLXRpdGxlLXNlbGVjdFwiIHN0eWxlPVwiZm9udC1zaXplOjAuOXJlbTtjb2xvcjojNGI1NTYzO3doaXRlLXNwYWNlOm5vd3JhcDttaW4td2lkdGg6MTYwcHhcIj5cbiAgICAgICAgICAgICAgU2tpbGxzIHNlY3Rpb24gdGl0bGU6XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPHNlbGVjdCBpZD1cImdvYWxzLXNraWxscy10aXRsZS1zZWxlY3RcIlxuICAgICAgICAgICAgICAgICAgICBvbmNoYW5nZT1cImdvYWxzT25Ta2lsbHNUaXRsZVNlbGVjdCgpXCJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6MC45ZW07Ym9yZGVyOjFweCBzb2xpZCAjZDFkNWRiO2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMWUyOTNiXCI+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJTa2lsbHNcIj5Ta2lsbHM8L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlRlY2huaWNhbCBTa2lsbHNcIj5UZWNobmljYWwgU2tpbGxzPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJLZXkgU2tpbGxzXCI+S2V5IFNraWxsczwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiQ29yZSBTa2lsbHNcIj5Db3JlIFNraWxsczwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiX19jdXN0b21fX1wiPkN1c3RvbVx1MjAyNjwvb3B0aW9uPlxuICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImdvYWxzLXNraWxscy10aXRsZS1jdXN0b21cIiBwbGFjZWhvbGRlcj1cIkVudGVyIGN1c3RvbSB0aXRsZVwiXG4gICAgICAgICAgICAgICAgICAgb25jaGFuZ2U9XCJnb2Fsc0F1dG9TYXZlU2V0dGluZ3MoKVwiXG4gICAgICAgICAgICAgICAgICAgc3R5bGU9XCJkaXNwbGF5Om5vbmU7Zm9udC1zaXplOjAuOWVtO2JvcmRlcjoxcHggc29saWQgI2QxZDVkYjtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjRweCA4cHg7Y29sb3I6IzFlMjkzYjttaW4td2lkdGg6MTYwcHhcIj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxzcGFuIGlkPVwiZ29hbHMtc2V0dGluZ3Mtc3RhdHVzXCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO21hcmdpbi10b3A6OHB4O2ZvbnQtc2l6ZTowLjgycmVtO3RyYW5zaXRpb246Y29sb3IgMC4yc1wiPjwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IHN0eWxlPVwiJHtTLnJvd307Z2FwOjE0cHhcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInNhdmUtZ29hbHMtYnRuXCJcbiAgICAgICAgICAgICAgICBvbmNsaWNrPVwic2F2ZUdlbmVyYXRpb25Hb2FscygpXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1wcmltYXJ5XCJcbiAgICAgICAgICAgICAgICBzdHlsZT1cInBhZGRpbmc6OHB4IDIycHg7Zm9udC1zaXplOjAuOTVyZW1cIj5cbiAgICAgICAgICBTYXZlIEdvYWxzXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8c3BhbiBpZD1cImdvYWxzLXN0YXR1c1wiXG4gICAgICAgICAgICAgIHN0eWxlPVwiZm9udC1zaXplOjAuODc1cmVtO3RyYW5zaXRpb246Y29sb3IgMC4yc1wiPjwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgO1xuXG4gIC8vIFJlc3RvcmUgc2F2ZWQgZ29hbHMgZnJvbSB0aGUgYmFja2VuZCBzZXNzaW9uIHN0YXRlLlxuICBhd2FpdCBfbG9hZEdvYWxzRnJvbVN0YXR1cygpO1xufVxuXG4vKipcbiAqIFRvZ2dsZSB0aGUgZW5hYmxlZC9kaXNhYmxlZCBhcHBlYXJhbmNlIG9mIGEgZ29hbCBzZWN0aW9uLlxuICogRXhwb3J0ZWQgc28gdGhlIGlubGluZSBvbmNoYW5nZT1cImdvYWxzVG9nZ2xlU2VjdGlvbiguLi4pXCIgaGFuZGxlcnMgd29yay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdvYWxzVG9nZ2xlU2VjdGlvbihzZWN0aW9uKSB7XG4gIGNvbnN0IE1BUCA9IHtcbiAgICAncGRmJzogICAgICAgeyBjYjogJ2dvYWxzLXBkZi1lbmFibGVkJywgICAgICAgYm9keTogJ2dvYWxzLXBkZi1ib2R5JyAgICAgICB9LFxuICAgICdhdHMtcGFnZXMnOiB7IGNiOiAnZ29hbHMtYXRzLXBhZ2VzLWVuYWJsZWQnLCBib2R5OiAnZ29hbHMtYXRzLXBhZ2VzLWJvZHknIH0sXG4gICAgJ2F0cy1jaGFycyc6IHsgY2I6ICdnb2Fscy1hdHMtY2hhcnMtZW5hYmxlZCcsIGJvZHk6ICdnb2Fscy1hdHMtY2hhcnMtYm9keScgfSxcbiAgfTtcbiAgY29uc3Qgc2VsID0gTUFQW3NlY3Rpb25dO1xuICBpZiAoIXNlbCkgcmV0dXJuO1xuICBjb25zdCBjYiAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc2VsLmNiKTtcbiAgY29uc3QgYm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHNlbC5ib2R5KTtcbiAgaWYgKCFjYiB8fCAhYm9keSkgcmV0dXJuO1xuICBib2R5LnN0eWxlLm9wYWNpdHkgICAgICAgPSBjYi5jaGVja2VkID8gJzEnICAgIDogJzAuNCc7XG4gIGJvZHkuc3R5bGUucG9pbnRlckV2ZW50cyA9IGNiLmNoZWNrZWQgPyAnYXV0bycgOiAnbm9uZSc7XG59XG5cbi8qKlxuICogU2hvdy9oaWRlIGNvbWJpbmVkIHZzIHNwbGl0IFBERiBwYWdlIGlucHV0cyB3aGVuIHRoZSBtb2RlIHJhZGlvIGNoYW5nZXMuXG4gKiBFeHBvcnRlZCBzbyB0aGUgaW5saW5lIG9uY2hhbmdlPVwiZ29hbHNVcGRhdGVQZGZNb2RlKClcIiBoYW5kbGVyIHdvcmtzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ29hbHNVcGRhdGVQZGZNb2RlKCkge1xuICBjb25zdCBjb21iaW5lZFJhZGlvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLXBkZi1tb2RlLWNvbWJpbmVkJyk7XG4gIGNvbnN0IGlzQ29tYmluZWQgICAgPSBjb21iaW5lZFJhZGlvPy5jaGVja2VkID8/IHRydWU7XG4gIGNvbnN0IGNvbWJpbmVkRGl2ICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtcGRmLWNvbWJpbmVkJyk7XG4gIGNvbnN0IHNwbGl0RGl2ICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtcGRmLXNwbGl0Jyk7XG4gIGlmIChjb21iaW5lZERpdikgY29tYmluZWREaXYuc3R5bGUuZGlzcGxheSA9IGlzQ29tYmluZWQgPyAnZmxleCcgICA6ICdub25lJztcbiAgaWYgKHNwbGl0RGl2KSAgICBzcGxpdERpdi5zdHlsZS5kaXNwbGF5ICAgID0gaXNDb21iaW5lZCA/ICdub25lJyAgIDogJ2ZsZXgnO1xufVxuXG4vKipcbiAqIEZldGNoIGN1cnJlbnQgZ2VuZXJhdGlvbiBnb2FscyBmcm9tIHRoZSBzZXNzaW9uIGFuZCBwb3B1bGF0ZSB0aGUgZm9ybSBpbnB1dHMuXG4gKiBAcHJpdmF0ZVxuICovXG5hc3luYyBmdW5jdGlvbiBfbG9hZEdvYWxzRnJvbVN0YXR1cygpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBkYXRhICA9IGF3YWl0IGFwaUNhbGwoJ0dFVCcsICcvYXBpL3N0YXR1cycpO1xuICAgIGNvbnN0IGdvYWxzID0gZGF0YT8uZ2VuZXJhdGlvbl9nb2FscztcbiAgICBpZiAoIWdvYWxzKSByZXR1cm47XG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgRW5hYmxlZCBjaGVja2JveGVzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIGNvbnN0IHBkZkVuYWJsZWRDYiAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLXBkZi1lbmFibGVkJyk7XG4gICAgY29uc3QgYXRzUGFnZUVuYWJsZWRDYiAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtYXRzLXBhZ2VzLWVuYWJsZWQnKTtcbiAgICBjb25zdCBhdHNDaGFyc0VuYWJsZWRDYiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb2Fscy1hdHMtY2hhcnMtZW5hYmxlZCcpO1xuXG4gICAgaWYgKHBkZkVuYWJsZWRDYiAgICAgICYmIGdvYWxzLnBkZl9wYWdlc19lbmFibGVkICAhPSBudWxsKSBwZGZFbmFibGVkQ2IuY2hlY2tlZCAgICAgID0gZ29hbHMucGRmX3BhZ2VzX2VuYWJsZWQ7XG4gICAgaWYgKGF0c1BhZ2VFbmFibGVkQ2IgICYmIGdvYWxzLmF0c19wYWdlc19lbmFibGVkICAhPSBudWxsKSBhdHNQYWdlRW5hYmxlZENiLmNoZWNrZWQgID0gZ29hbHMuYXRzX3BhZ2VzX2VuYWJsZWQ7XG4gICAgaWYgKGF0c0NoYXJzRW5hYmxlZENiICYmIGdvYWxzLmF0c19jaGFyc19lbmFibGVkICAhPSBudWxsKSBhdHNDaGFyc0VuYWJsZWRDYi5jaGVja2VkID0gZ29hbHMuYXRzX2NoYXJzX2VuYWJsZWQ7XG5cbiAgICBnb2Fsc1RvZ2dsZVNlY3Rpb24oJ3BkZicpO1xuICAgIGdvYWxzVG9nZ2xlU2VjdGlvbignYXRzLXBhZ2VzJyk7XG4gICAgZ29hbHNUb2dnbGVTZWN0aW9uKCdhdHMtY2hhcnMnKTtcblxuICAgIC8vIFx1MjUwMFx1MjUwMCBQREYgbW9kZSByYWRpbyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICBpZiAoZ29hbHMubWF4X3BkZl9wYWdlc19tb2RlKSB7XG4gICAgICBjb25zdCByYWRpbyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgIGBpbnB1dFtuYW1lPVwiZ29hbHMtcGRmLW1vZGVcIl1bdmFsdWU9XCIke2dvYWxzLm1heF9wZGZfcGFnZXNfbW9kZX1cIl1gKTtcbiAgICAgIGlmIChyYWRpbykgcmFkaW8uY2hlY2tlZCA9IHRydWU7XG4gICAgICBnb2Fsc1VwZGF0ZVBkZk1vZGUoKTtcbiAgICB9XG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgTnVtZXJpYyB2YWx1ZXMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgY29uc3QgcGRmSW5wdXQgICAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLW1heC1wZGYtcGFnZXMnKTtcbiAgICBjb25zdCBwZGZSZXN1bWVJbnB1dCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtbWF4LXBkZi1yZXN1bWUtcGFnZXMnKTtcbiAgICBjb25zdCBwZGZDdklucHV0ICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtbWF4LXBkZi1jdi1wYWdlcycpO1xuICAgIGNvbnN0IGF0c1BhZ2VJbnB1dCAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb2Fscy1tYXgtYXRzLXBhZ2VzJyk7XG4gICAgY29uc3QgYXRzQ2hhcklucHV0ICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLW1heC1hdHMtY2hhcnMnKTtcblxuICAgIGlmIChwZGZJbnB1dCAgICAgICAmJiBnb2Fscy5tYXhfcGRmX3BhZ2VzICAgICAgICAgIT0gbnVsbCkgcGRmSW5wdXQudmFsdWUgICAgICAgPSBnb2Fscy5tYXhfcGRmX3BhZ2VzO1xuICAgIGlmIChwZGZSZXN1bWVJbnB1dCAmJiBnb2Fscy5tYXhfcGRmX3Jlc3VtZV9wYWdlcyAgIT0gbnVsbCkgcGRmUmVzdW1lSW5wdXQudmFsdWUgPSBnb2Fscy5tYXhfcGRmX3Jlc3VtZV9wYWdlcztcbiAgICBpZiAocGRmQ3ZJbnB1dCAgICAgJiYgZ29hbHMubWF4X3BkZl9jdl9wYWdlcyAgICAgICE9IG51bGwpIHBkZkN2SW5wdXQudmFsdWUgICAgID0gZ29hbHMubWF4X3BkZl9jdl9wYWdlcztcbiAgICBpZiAoYXRzUGFnZUlucHV0ICAgJiYgZ29hbHMubWF4X2F0c19wYWdlcyAgICAgICAgICE9IG51bGwpIGF0c1BhZ2VJbnB1dC52YWx1ZSAgID0gZ29hbHMubWF4X2F0c19wYWdlcztcbiAgICBpZiAoYXRzQ2hhcklucHV0ICAgJiYgZ29hbHMubWF4X2F0c19jaGFycyAgICAgICAgICE9IG51bGwpIGF0c0NoYXJJbnB1dC52YWx1ZSAgID0gZ29hbHMubWF4X2F0c19jaGFycztcblxuICAgIC8vIFx1MjUwMFx1MjUwMCBHZW5lcmF0aW9uIFNldHRpbmdzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIGNvbnN0IG1heFNraWxsc1NsaWRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb2Fscy1tYXgtc2tpbGxzLWlucHV0Jyk7XG4gICAgY29uc3QgbWF4U2tpbGxzTGFiZWwgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLW1heC1za2lsbHMtdmFsdWUnKTtcbiAgICBpZiAobWF4U2tpbGxzU2xpZGVyICYmIGRhdGEubWF4X3NraWxscyAhPSBudWxsKSB7XG4gICAgICBtYXhTa2lsbHNTbGlkZXIudmFsdWUgPSBkYXRhLm1heF9za2lsbHM7XG4gICAgICBpZiAobWF4U2tpbGxzTGFiZWwpIG1heFNraWxsc0xhYmVsLnRleHRDb250ZW50ID0gZGF0YS5tYXhfc2tpbGxzO1xuICAgIH1cbiAgICBjb25zdCBrbm93blRpdGxlcyA9IFsnU2tpbGxzJywgJ1RlY2huaWNhbCBTa2lsbHMnLCAnS2V5IFNraWxscycsICdDb3JlIFNraWxscyddO1xuICAgIGNvbnN0IGN1cnJlbnRUaXRsZSA9IGRhdGEuc2tpbGxzX3NlY3Rpb25fdGl0bGUgfHwgJ1NraWxscyc7XG4gICAgY29uc3QgdGl0bGVTZWxlY3QgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLXNraWxscy10aXRsZS1zZWxlY3QnKTtcbiAgICBjb25zdCB0aXRsZUN1c3RvbSAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtc2tpbGxzLXRpdGxlLWN1c3RvbScpO1xuICAgIGlmICh0aXRsZVNlbGVjdCkge1xuICAgICAgY29uc3QgaXNLbm93biA9IGtub3duVGl0bGVzLmluY2x1ZGVzKGN1cnJlbnRUaXRsZSk7XG4gICAgICB0aXRsZVNlbGVjdC52YWx1ZSA9IGlzS25vd24gPyBjdXJyZW50VGl0bGUgOiAnX19jdXN0b21fXyc7XG4gICAgICBpZiAodGl0bGVDdXN0b20pIHtcbiAgICAgICAgdGl0bGVDdXN0b20uc3R5bGUuZGlzcGxheSA9IGlzS25vd24gPyAnbm9uZScgOiAnJztcbiAgICAgICAgaWYgKCFpc0tub3duKSB0aXRsZUN1c3RvbS52YWx1ZSA9IGN1cnJlbnRUaXRsZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy53YXJuKCdGYWlsZWQgdG8gbG9hZCBnZW5lcmF0aW9uIGdvYWxzIGZyb20gYmFja2VuZDonLCBlcnIpO1xuICB9XG59XG5cbi8qKlxuICogUmVhZCB0aGUgZm9ybSBpbnB1dHMsIHZhbGlkYXRlLCBhbmQgUE9TVCB0byAvYXBpL2dlbmVyYXRpb24tZ29hbHMuXG4gKiBFeHBvc2VkIG9uIGdsb2JhbFRoaXMgc28gdGhlIGlubGluZSBvbmNsaWNrPVwic2F2ZUdlbmVyYXRpb25Hb2FscygpXCIgd29ya3MuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzYXZlR2VuZXJhdGlvbkdvYWxzKCkge1xuICBjb25zdCBzdGF0dXNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb2Fscy1zdGF0dXMnKTtcblxuICAvLyBcdTI1MDBcdTI1MDAgUmVhZCBlbmFibGVkIGZsYWdzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICBjb25zdCBwZGZFbmFibGVkICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtcGRmLWVuYWJsZWQnKT8uY2hlY2tlZCAgICAgID8/IHRydWU7XG4gIGNvbnN0IGF0c1BhZ2VFbmFibGVkICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb2Fscy1hdHMtcGFnZXMtZW5hYmxlZCcpPy5jaGVja2VkID8/IHRydWU7XG4gIGNvbnN0IGF0c0NoYXJzRW5hYmxlZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb2Fscy1hdHMtY2hhcnMtZW5hYmxlZCcpPy5jaGVja2VkID8/IGZhbHNlO1xuXG4gIC8vIFx1MjUwMFx1MjUwMCBSZWFkIFBERiBtb2RlIGFuZCB2YWx1ZXMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIGNvbnN0IHBkZk1vZGUgICAgICAgID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXRbbmFtZT1cImdvYWxzLXBkZi1tb2RlXCJdOmNoZWNrZWQnKT8udmFsdWUgPz8gJ2NvbWJpbmVkJztcbiAgY29uc3QgcGRmUGFnZXMgICAgICAgPSBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtbWF4LXBkZi1wYWdlcycpPy52YWx1ZSwgICAgICAgIDEwKTtcbiAgY29uc3QgcGRmUmVzdW1lUGFnZXMgPSBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtbWF4LXBkZi1yZXN1bWUtcGFnZXMnKT8udmFsdWUsIDEwKTtcbiAgY29uc3QgcGRmQ3ZQYWdlcyAgICAgPSBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtbWF4LXBkZi1jdi1wYWdlcycpPy52YWx1ZSwgICAgIDEwKTtcbiAgY29uc3QgYXRzUGFnZXMgICAgICAgPSBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtbWF4LWF0cy1wYWdlcycpPy52YWx1ZSwgICAgICAgIDEwKTtcbiAgY29uc3QgYXRzQ2hhcnMgICAgICAgPSBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtbWF4LWF0cy1jaGFycycpPy52YWx1ZSwgICAgICAgIDEwKTtcblxuICAvLyBcdTI1MDBcdTI1MDAgVmFsaWRhdGUgb25seSBlbmFibGVkIGZpZWxkcyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgaWYgKHBkZkVuYWJsZWQpIHtcbiAgICBpZiAocGRmTW9kZSA9PT0gJ2NvbWJpbmVkJykge1xuICAgICAgaWYgKCFwZGZQYWdlcyB8fCBwZGZQYWdlcyA8IDEgfHwgcGRmUGFnZXMgPiAxMCkge1xuICAgICAgICBfc2V0U3RhdHVzKHN0YXR1c0VsLCAnXHUyNkEwXHVGRTBGIFBERiBwYWdlcyBtdXN0IGJlIDFcdTIwMTMxMC4nLCAnd2FybicpOyByZXR1cm47XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghcGRmUmVzdW1lUGFnZXMgfHwgcGRmUmVzdW1lUGFnZXMgPCAxIHx8IHBkZlJlc3VtZVBhZ2VzID4gMTApIHtcbiAgICAgICAgX3NldFN0YXR1cyhzdGF0dXNFbCwgJ1x1MjZBMFx1RkUwRiBSZXN1bWUgcG9ydGlvbiBwYWdlcyBtdXN0IGJlIDFcdTIwMTMxMC4nLCAnd2FybicpOyByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoIXBkZkN2UGFnZXMgfHwgcGRmQ3ZQYWdlcyA8IDEgfHwgcGRmQ3ZQYWdlcyA+IDEwKSB7XG4gICAgICAgIF9zZXRTdGF0dXMoc3RhdHVzRWwsICdcdTI2QTBcdUZFMEYgQ1YgLyBQdWJsaWNhdGlvbnMgcG9ydGlvbiBwYWdlcyBtdXN0IGJlIDFcdTIwMTMxMC4nLCAnd2FybicpOyByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChhdHNQYWdlRW5hYmxlZCAgJiYgKCFhdHNQYWdlcyAgfHwgYXRzUGFnZXMgIDwgMSAgfHwgYXRzUGFnZXMgID4gNSkpICAgICB7IF9zZXRTdGF0dXMoc3RhdHVzRWwsICdcdTI2QTBcdUZFMEYgQVRTIHBhZ2VzIG11c3QgYmUgMVx1MjAxMzUuJywgICAgICAgICAgJ3dhcm4nKTsgcmV0dXJuOyB9XG4gIGlmIChhdHNDaGFyc0VuYWJsZWQgJiYgKCFhdHNDaGFycyAgfHwgYXRzQ2hhcnMgIDwgNTAwIHx8IGF0c0NoYXJzID4gMjAwMDApKSB7IF9zZXRTdGF0dXMoc3RhdHVzRWwsICdcdTI2QTBcdUZFMEYgQ2hhcmFjdGVycyBtdXN0IGJlIDUwMFx1MjAxMzIwIDAwMC4nLCAnd2FybicpOyByZXR1cm47IH1cblxuICAvLyBcdTI1MDBcdTI1MDAgQnVpbGQgcGF5bG9hZCAoaW5jbHVkZSBlbmFibGVkIGZsYWdzICsgYWN0aXZlIHZhbHVlcyBvbmx5KSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICBwZGZfcGFnZXNfZW5hYmxlZDogIHBkZkVuYWJsZWQsXG4gICAgYXRzX3BhZ2VzX2VuYWJsZWQ6ICBhdHNQYWdlRW5hYmxlZCxcbiAgICBhdHNfY2hhcnNfZW5hYmxlZDogIGF0c0NoYXJzRW5hYmxlZCxcbiAgICBtYXhfcGRmX3BhZ2VzX21vZGU6IHBkZk1vZGUsXG4gIH07XG5cbiAgaWYgKHBkZkVuYWJsZWQpIHtcbiAgICBpZiAocGRmTW9kZSA9PT0gJ2NvbWJpbmVkJykge1xuICAgICAgcGF5bG9hZC5tYXhfcGRmX3BhZ2VzID0gcGRmUGFnZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBheWxvYWQubWF4X3BkZl9yZXN1bWVfcGFnZXMgPSBwZGZSZXN1bWVQYWdlcztcbiAgICAgIHBheWxvYWQubWF4X3BkZl9jdl9wYWdlcyAgICAgPSBwZGZDdlBhZ2VzO1xuICAgIH1cbiAgfVxuICBpZiAoYXRzUGFnZUVuYWJsZWQpICBwYXlsb2FkLm1heF9hdHNfcGFnZXMgPSBhdHNQYWdlcztcbiAgaWYgKGF0c0NoYXJzRW5hYmxlZCkgcGF5bG9hZC5tYXhfYXRzX2NoYXJzID0gYXRzQ2hhcnM7XG5cbiAgX3NldFN0YXR1cyhzdGF0dXNFbCwgJ1NhdmluZ1x1MjAyNicsICdpbmZvJyk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBhcGlDYWxsKCdQT1NUJywgJy9hcGkvZ2VuZXJhdGlvbi1nb2FscycsIHBheWxvYWQpO1xuICAgIF9zZXRTdGF0dXMoc3RhdHVzRWwsICdcdTI3MTMgU2F2ZWQnLCAnb2snKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHsgaWYgKHN0YXR1c0VsKSBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICcnOyB9LCAzMDAwKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLmVycm9yKCdGYWlsZWQgdG8gc2F2ZSBnZW5lcmF0aW9uIGdvYWxzOicsIGVycik7XG4gICAgX3NldFN0YXR1cyhzdGF0dXNFbCwgJ1NhdmUgZmFpbGVkLiBQbGVhc2UgdHJ5IGFnYWluLicsICdlcnJvcicpO1xuICB9XG59XG5cbi8qKlxuICogU2hvdy9oaWRlIHRoZSBjdXN0b20tdGl0bGUgaW5wdXQgd2hlbiB0aGUgc2tpbGxzLXRpdGxlIHNlbGVjdCBjaGFuZ2VzLlxuICogRXhwb3J0ZWQgc28gdGhlIGlubGluZSBvbmNoYW5nZT1cImdvYWxzT25Ta2lsbHNUaXRsZVNlbGVjdCgpXCIgaGFuZGxlciB3b3Jrcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdvYWxzT25Ta2lsbHNUaXRsZVNlbGVjdCgpIHtcbiAgY29uc3Qgc2VsICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLXNraWxscy10aXRsZS1zZWxlY3QnKTtcbiAgY29uc3QgY3VzdG9tID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLXNraWxscy10aXRsZS1jdXN0b20nKTtcbiAgaWYgKCFzZWwpIHJldHVybjtcbiAgaWYgKHNlbC52YWx1ZSA9PT0gJ19fY3VzdG9tX18nKSB7XG4gICAgaWYgKGN1c3RvbSkgeyBjdXN0b20uc3R5bGUuZGlzcGxheSA9ICcnOyBjdXN0b20uZm9jdXMoKTsgfVxuICB9IGVsc2Uge1xuICAgIGlmIChjdXN0b20pIGN1c3RvbS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGdvYWxzQXV0b1NhdmVTZXR0aW5ncygpO1xuICB9XG59XG5cbi8qKlxuICogQXV0by1zYXZlIHRoZSBnZW5lcmF0aW9uIHNldHRpbmdzIChtYXhfc2tpbGxzICsgc2tpbGxzX3NlY3Rpb25fdGl0bGUpXG4gKiB2aWEgUE9TVCAvYXBpL2dlbmVyYXRpb24tc2V0dGluZ3Mgd2l0aG91dCBibG9ja2luZy5cbiAqIEV4cG9ydGVkIHNvIGlubGluZSBvbmNoYW5nZT1cImdvYWxzQXV0b1NhdmVTZXR0aW5ncygpXCIgaGFuZGxlcnMgd29yay5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdvYWxzQXV0b1NhdmVTZXR0aW5ncygpIHtcbiAgY29uc3Qgc3RhdHVzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtc2V0dGluZ3Mtc3RhdHVzJyk7XG4gIGNvbnN0IHNsaWRlciAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLW1heC1za2lsbHMtaW5wdXQnKTtcbiAgY29uc3Qgc2VsICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtc2tpbGxzLXRpdGxlLXNlbGVjdCcpO1xuICBjb25zdCBjdXN0b20gICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb2Fscy1za2lsbHMtdGl0bGUtY3VzdG9tJyk7XG5cbiAgY29uc3QgbWF4U2tpbGxzID0gc2xpZGVyID8gcGFyc2VJbnQoc2xpZGVyLnZhbHVlLCAxMCkgOiBudWxsO1xuICBjb25zdCB0aXRsZSAgICAgPSBzZWw/LnZhbHVlID09PSAnX19jdXN0b21fXydcbiAgICA/IChjdXN0b20/LnZhbHVlPy50cmltKCkgfHwgbnVsbClcbiAgICA6IChzZWw/LnZhbHVlIHx8IG51bGwpO1xuXG4gIGlmICghbWF4U2tpbGxzICYmICF0aXRsZSkgcmV0dXJuO1xuXG4gIGNvbnN0IHBheWxvYWQgPSB7fTtcbiAgaWYgKG1heFNraWxscyAmJiBtYXhTa2lsbHMgPj0gMSkgcGF5bG9hZC5tYXhfc2tpbGxzICAgICAgICAgID0gbWF4U2tpbGxzO1xuICBpZiAodGl0bGUpICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLnNraWxsc19zZWN0aW9uX3RpdGxlID0gdGl0bGU7XG5cbiAgX3NldFN0YXR1cyhzdGF0dXNFbCwgJ1NhdmluZ1x1MjAyNicsICdpbmZvJyk7XG4gIHRyeSB7XG4gICAgYXdhaXQgYXBpQ2FsbCgnUE9TVCcsICcvYXBpL2dlbmVyYXRpb24tc2V0dGluZ3MnLCBwYXlsb2FkKTtcbiAgICBfc2V0U3RhdHVzKHN0YXR1c0VsLCAnXHUyNzEzIFNhdmVkJywgJ29rJyk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7IGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnJzsgfSwgMjAwMCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy53YXJuKCdGYWlsZWQgdG8gc2F2ZSBnZW5lcmF0aW9uIHNldHRpbmdzOicsIGVycik7XG4gICAgX3NldFN0YXR1cyhzdGF0dXNFbCwgJ1NhdmUgZmFpbGVkJywgJ2Vycm9yJyk7XG4gIH1cbn1cblxuLyoqIEBwcml2YXRlICovXG5mdW5jdGlvbiBfc2V0U3RhdHVzKGVsLCBtZXNzYWdlLCBsZXZlbCkge1xuICBpZiAoIWVsKSByZXR1cm47XG4gIGNvbnN0IGNvbG91cnMgPSB7XG4gICAgb2s6ICAgICd2YXIoLS1zdWNjZXNzLCMyZTdkMzIpJyxcbiAgICBlcnJvcjogJ3ZhcigtLWRhbmdlciwjYzYyODI4KScsXG4gICAgd2FybjogICd2YXIoLS13YXJuaW5nLCNlNjUxMDApJyxcbiAgICBpbmZvOiAgJ3ZhcigtLXRleHQtc2Vjb25kYXJ5LCM1NTUpJyxcbiAgfTtcbiAgZWwuc3R5bGUuY29sb3IgID0gY29sb3Vyc1tsZXZlbF0gfHwgY29sb3Vycy5pbmZvO1xuICBlbC50ZXh0Q29udGVudCAgPSBtZXNzYWdlO1xufVxuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvc2Vzc2lvbi1tYW5hZ2VyLmpzXG4gKiBTZXNzaW9uIGxpZmVjeWNsZTogY3JlYXRlLCBjbGFpbSwgcmVzdG9yZSwgc2F2ZSwgbG9hZC5cbiAqIEFsc28gb3ducyBmb3JtYXRTZXNzaW9uUGhhc2VMYWJlbCBhbmQgcmVsYXRlZCBzZXNzaW9uLWxhYmVsIGhlbHBlcnMuXG4gKlxuICogREVQRU5ERU5DSUVTIChhbGwgb24gZ2xvYmFsVGhpcyBhdCBydW50aW1lKTpcbiAqICAgLSBjcmVhdGVTZXNzaW9uLCBmZXRjaFN0YXR1cyAoYXBpLWNsaWVudC5qcylcbiAqICAgLSBnZXRTZXNzaW9uSWRGcm9tVVJMLCBnZXRPd25lclRva2VuLCBTdG9yYWdlS2V5cywgZ2V0U2NvcGVkVGFiRGF0YVN0b3JhZ2VLZXkgKHN0YXRlLW1hbmFnZXIuanMpXG4gKiAgIC0gYXBwZW5kTWVzc2FnZSwgYXBwZW5kUmV0cnlNZXNzYWdlIChtZXNzYWdlLXF1ZXVlLmpzKVxuICogICAtIHBhcnNlU3RhdHVzUmVzcG9uc2UsIHBhcnNlUmV3cml0ZXNSZXNwb25zZSAodmFsaWRhdG9ycy5qcylcbiAqICAgLSByZWZyZXNoQXRzU2NvcmUgKGF0cy1yZWZpbmVtZW50LmpzKVxuICogICAtIHVwZGF0ZUluY2x1c2lvbkNvdW50cyAocmV2aWV3LXRhYmxlLWJhc2UuanMsIFRpZXIgNClcbiAqICAgLSBzd2l0Y2hUYWIgKHJldmlldy10YWJsZS1iYXNlLmpzLCBUaWVyIDQpXG4gKiAgIC0gcmVuZGVyUmV3cml0ZVBhbmVsIChyZXdyaXRlLXJldmlldy5qcywgVGllciA2KVxuICogICAtIHNob3dPd25lcnNoaXBDb25mbGljdERpYWxvZywgb3BlblNlc3Npb25zTW9kYWwgKHNlc3Npb24tc3dpdGNoZXItdWkuanMsIFRpZXIgNylcbiAqICAgLSB1cGRhdGVBY3Rpb25CdXR0b25zICh1aS1oZWxwZXJzLmpzKVxuICogICAtIHVwZGF0ZVBvc2l0aW9uVGl0bGUgKHNlc3Npb24tYWN0aW9ucy5qcylcbiAqICAgLSBlc2NhcGVIdG1sLCBTRVNTSU9OX1BIQVNFX0xBQkVMU19TSE9SVCAodXRpbHMuanMpXG4gKiAgIC0gc3RhdGVNYW5hZ2VyIChzdGF0ZS1tYW5hZ2VyLmpzIFx1MjAxNCBnZXRBbGxUYWJEYXRhKCkvZ2V0Q3VycmVudFRhYigpL3NldFRhYkRhdGEoKS9zZXRDdXJyZW50VGFiKCkpXG4gKiAgIC0gc2Vzc2lvbklkLCBpc1JlY29ubmVjdGluZywgbGFzdEtub3duUGhhc2UsIGludGVyYWN0aXZlU3RhdGUsXG4gKiAgICAgcmV3cml0ZURlY2lzaW9ucywgUEhBU0VTICh3aW5kb3cgZ2xvYmFscylcbiAqL1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5jb25zdCBsb2cgPSBnZXRMb2dnZXIoJ3Nlc3Npb24tbWFuYWdlcicpO1xuXG5pbXBvcnQgeyBTRVNTSU9OX1BIQVNFX0xBQkVMU19TSE9SVCwgU0VTU0lPTl9QSEFTRV9MQUJFTFMgfSBmcm9tICcuL3V0aWxzLmpzJztcbmltcG9ydCB7IFBIQVNFUywgc3RhdGVNYW5hZ2VyIH0gZnJvbSAnLi9zdGF0ZS1tYW5hZ2VyLmpzJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTZXNzaW9uIHBoYXNlIGxhYmVscyAoYWJicmV2aWF0ZWQgZm9ybSBcdTIwMTQgZm9yIGNvbXBhY3Qgc2Vzc2lvbi1zd2l0Y2hlciBVSSlcbi8vIEZ1bGwtbGVuZ3RoIGxhYmVscyBsaXZlIGluIHV0aWxzLmpzIFNFU1NJT05fUEhBU0VfTEFCRUxTLlxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIGZvcm1hdFNlc3Npb25QaGFzZUxhYmVsKHBoYXNlKSB7XG4gIGlmICghcGhhc2UpIHJldHVybiAnaW5pdCc7XG4gIHJldHVybiBTRVNTSU9OX1BIQVNFX0xBQkVMU19TSE9SVFtwaGFzZV0gfHwgU3RyaW5nKHBoYXNlKS5yZXBsYWNlKC9fL2csICcgJyk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ3VycmVudCBzZXNzaW9uIGlkZW50aXR5IGhlbHBlcnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiBfZ2V0Q3VycmVudFNlc3Npb25JZFZhbHVlKCkge1xuICBpZiAodHlwZW9mIGdldFNlc3Npb25JZEZyb21VUkwgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZ2V0U2Vzc2lvbklkRnJvbVVSTCgpO1xuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCkuZ2V0KCdzZXNzaW9uJyk7XG4gIH0gY2F0Y2ggKF8pIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBfZ2V0Q3VycmVudE93bmVyVG9rZW5WYWx1ZSgpIHtcbiAgaWYgKHR5cGVvZiBnZXRPd25lclRva2VuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGdldE93bmVyVG9rZW4oKTtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdjdi1idWlsZGVyLW93bmVyLXRva2VuJyk7XG4gIH0gY2F0Y2ggKF8pIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZFNlc3Npb25Td2l0Y2hlckxhYmVsKHN0YXR1cyA9IHt9KSB7XG4gIGNvbnN0IHBvc2l0aW9uTmFtZSA9IChzdGF0dXMucG9zaXRpb25fbmFtZSB8fCAnJykudG9TdHJpbmcoKS50cmltKCk7XG4gIGNvbnN0IHBoYXNlID0gZm9ybWF0U2Vzc2lvblBoYXNlTGFiZWwoc3RhdHVzLnBoYXNlKTtcbiAgaWYgKHBvc2l0aW9uTmFtZSkge1xuICAgIHJldHVybiBgJHtwb3NpdGlvbk5hbWV9IFx1MDBCNyAke3BoYXNlfWA7XG4gIH1cbiAgcmV0dXJuIF9nZXRDdXJyZW50U2Vzc2lvbklkVmFsdWUoKSA/IGBTZXNzaW9uIFx1MDBCNyAke3BoYXNlfWAgOiAnXHVEODNEXHVEQ0MyIFNlc3Npb25zJztcbn1cblxuZnVuY3Rpb24gZ2V0QWN0aXZlU2Vzc2lvbk93bmVyc2hpcE1ldGEoc2Vzc2lvbiwge1xuICBjdXJyZW50U2Vzc2lvbklkID0gX2dldEN1cnJlbnRTZXNzaW9uSWRWYWx1ZSgpLFxufSA9IHt9KSB7XG4gIGlmICghc2Vzc2lvbiB8fCB0eXBlb2Ygc2Vzc2lvbiAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4geyBsYWJlbDogJ1Vua25vd24nLCBjbGFzc05hbWU6ICdzZXNzaW9uLXN0YXR1cy11bmNsYWltZWQnLCBpc0N1cnJlbnQ6IGZhbHNlIH07XG4gIH1cblxuICBjb25zdCBpc0N1cnJlbnRTZXNzaW9uID0gQm9vbGVhbihjdXJyZW50U2Vzc2lvbklkKSAmJiBzZXNzaW9uLnNlc3Npb25faWQgPT09IGN1cnJlbnRTZXNzaW9uSWQ7XG4gIGNvbnN0IHNhbWVPd25lciA9IEJvb2xlYW4oc2Vzc2lvbi5vd25lZF9ieV9yZXF1ZXN0ZXIpO1xuXG4gIGlmIChpc0N1cnJlbnRTZXNzaW9uKSB7XG4gICAgcmV0dXJuIHsgbGFiZWw6ICdDdXJyZW50IHRhYicsIGNsYXNzTmFtZTogJ3Nlc3Npb24tc3RhdHVzLWN1cnJlbnQnLCBpc0N1cnJlbnQ6IHRydWUgfTtcbiAgfVxuICBpZiAoc2FtZU93bmVyKSB7XG4gICAgcmV0dXJuIHsgbGFiZWw6ICdPd25lZCBieSB0aGlzIHRhYicsIGNsYXNzTmFtZTogJ3Nlc3Npb24tc3RhdHVzLWN1cnJlbnQnLCBpc0N1cnJlbnQ6IGZhbHNlIH07XG4gIH1cbiAgaWYgKHNlc3Npb24uY2xhaW1lZCkge1xuICAgIHJldHVybiB7IGxhYmVsOiAnT3duZWQgYnkgYW5vdGhlciB0YWInLCBjbGFzc05hbWU6ICdzZXNzaW9uLXN0YXR1cy1vd25lZCcsIGlzQ3VycmVudDogZmFsc2UgfTtcbiAgfVxuICByZXR1cm4geyBsYWJlbDogJ1VuY2xhaW1lZCcsIGNsYXNzTmFtZTogJ3Nlc3Npb24tc3RhdHVzLXVuY2xhaW1lZCcsIGlzQ3VycmVudDogZmFsc2UgfTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0U2Vzc2lvblRpbWVzdGFtcCh0aW1lc3RhbXAsIHsgaW5jbHVkZVRpbWUgPSB0cnVlIH0gPSB7fSkge1xuICBpZiAoIXRpbWVzdGFtcCkgcmV0dXJuICdcdTIwMTQnO1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgRGF0ZSh0aW1lc3RhbXApLnRvTG9jYWxlU3RyaW5nKCdlbi1VUycsIHtcbiAgICAgIG1vbnRoOiAnc2hvcnQnLCBkYXk6ICdudW1lcmljJywgeWVhcjogJ251bWVyaWMnLFxuICAgICAgLi4uKGluY2x1ZGVUaW1lID8geyBob3VyOiAnbnVtZXJpYycsIG1pbnV0ZTogJzItZGlnaXQnIH0gOiB7fSksXG4gICAgfSk7XG4gIH0gY2F0Y2ggKF8pIHtcbiAgICByZXR1cm4gU3RyaW5nKHRpbWVzdGFtcCkucmVwbGFjZSgnVCcsICcgJykuc2xpY2UoMCwgaW5jbHVkZVRpbWUgPyAxNiA6IDEwKTtcbiAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFdlbGNvbWUgLyBvbmJvYXJkaW5nIG1vZGFsIChHQVAtMzYgLyBHQVAtMzcpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY29uc3QgX1dFTENPTUVfRElTTUlTU0VEX0tFWSA9ICdjdi1idWlsZGVyLXdlbGNvbWUtZGlzbWlzc2VkJztcblxuLyoqXG4gKiBTd2l0Y2ggd2hpY2ggY29udGVudCBzZWN0aW9uIGlzIHZpc2libGUgaW5zaWRlIHRoZSB3ZWxjb21lIG1vZGFsLlxuICogQHBhcmFtIHsncHJlc2VudCd8J21pc3NpbmcnfSBzZWN0aW9uXG4gKi9cbmZ1bmN0aW9uIF9zZXRXZWxjb21lU2VjdGlvbihzZWN0aW9uKSB7XG4gIGNvbnN0IHNQcmVzZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3dlbGNvbWUtc2VjdGlvbi1wcmVzZW50Jyk7XG4gIGNvbnN0IHNFbXB0eSAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3dlbGNvbWUtc2VjdGlvbi1lbXB0eScpO1xuICBjb25zdCBzTWlzc2luZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd3ZWxjb21lLXNlY3Rpb24tbWlzc2luZycpO1xuICBjb25zdCBmUHJlc2VudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd3ZWxjb21lLWZvb3Rlci1wcmVzZW50Jyk7XG4gIGNvbnN0IGZNaXNzaW5nID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3dlbGNvbWUtZm9vdGVyLW1pc3NpbmcnKTtcbiAgaWYgKHNQcmVzZW50KSBzUHJlc2VudC5zdHlsZS5kaXNwbGF5ID0gc2VjdGlvbiA9PT0gJ3ByZXNlbnQnID8gJycgOiAnbm9uZSc7XG4gIGlmIChzRW1wdHkpICAgc0VtcHR5LnN0eWxlLmRpc3BsYXkgICA9IHNlY3Rpb24gPT09ICdlbXB0eScgICA/ICcnIDogJ25vbmUnO1xuICBpZiAoc01pc3NpbmcpIHNNaXNzaW5nLnN0eWxlLmRpc3BsYXkgPSBzZWN0aW9uID09PSAnbWlzc2luZycgPyAnJyA6ICdub25lJztcbiAgLy8gRW1wdHkgc2tlbGV0b246IHNob3cgXCJwcmVzZW50XCIgZm9vdGVyIChDbG9zZS9kaXNtaXNzKSBub3QgXCJtaXNzaW5nXCIgZm9vdGVyIChDcmVhdGUvUmVsb2FkKVxuICBpZiAoZlByZXNlbnQpIGZQcmVzZW50LnN0eWxlLmRpc3BsYXkgPSAoc2VjdGlvbiA9PT0gJ3ByZXNlbnQnIHx8IHNlY3Rpb24gPT09ICdlbXB0eScpID8gJ2ZsZXgnIDogJ25vbmUnO1xuICBpZiAoZk1pc3NpbmcpIGZNaXNzaW5nLnN0eWxlLmRpc3BsYXkgPSBzZWN0aW9uID09PSAnbWlzc2luZycgPyAnZmxleCcgOiAnbm9uZSc7XG4gIC8vIEZvciBlbXB0eSBzdGF0ZTogY2hhbmdlIENUQSB0byBuYXZpZ2F0ZSB0byBNYXN0ZXIgQ1YgaW5zdGVhZCBvZiBqdXN0IGNsb3NpbmdcbiAgY29uc3QgZ2V0U3RhcnRlZEJ0biA9IGZQcmVzZW50ID8gZlByZXNlbnQucXVlcnlTZWxlY3RvcignYnV0dG9uLnByaW1hcnknKSA6IG51bGw7XG4gIGlmIChnZXRTdGFydGVkQnRuKSB7XG4gICAgaWYgKHNlY3Rpb24gPT09ICdlbXB0eScpIHtcbiAgICAgIGdldFN0YXJ0ZWRCdG4udGV4dENvbnRlbnQgPSAnT3BlbiBNYXN0ZXIgQ1YnO1xuICAgICAgZ2V0U3RhcnRlZEJ0bi5vbmNsaWNrID0gKCkgPT4geyBjbG9zZVdlbGNvbWVNb2RhbCgpOyBpZiAodHlwZW9mIG9wZW5NYXN0ZXJDdk1vZGFsID09PSAnZnVuY3Rpb24nKSBvcGVuTWFzdGVyQ3ZNb2RhbCgpOyB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBnZXRTdGFydGVkQnRuLnRleHRDb250ZW50ID0gJ0dldCBTdGFydGVkJztcbiAgICAgIGdldFN0YXJ0ZWRCdG4ub25jbGljayA9ICgpID0+IHtcbiAgICAgICAgY2xvc2VXZWxjb21lTW9kYWwoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBzd2l0Y2hUYWIgPT09ICdmdW5jdGlvbicpIHN3aXRjaFRhYignam9iJyk7XG4gICAgICB9O1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFNob3cgdGhlIG9uYm9hcmRpbmcgbW9kYWwgaW4gdGhlIFwibWlzc2luZyBtYXN0ZXIgQ1ZcIiBzdGF0ZS5cbiAqIENhbGxlZCBmcm9tIGNyZWF0ZU5ld1Nlc3Npb25BbmROYXZpZ2F0ZSgpIHdoZW4gdGhlIGJhY2tlbmQgcmV0dXJucyBtYXN0ZXJfY3ZfbWlzc2luZy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtYXN0ZXJDdlBhdGggLSBTZXJ2ZXItcmVwb3J0ZWQgZXhwZWN0ZWQgZmlsZSBwYXRoLlxuICovXG5mdW5jdGlvbiBzaG93T25ib2FyZGluZ01vZGFsKG1hc3RlckN2UGF0aCkge1xuICBjb25zdCBvdmVybGF5ICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvbmJvYXJkaW5nLW1vZGFsLW92ZXJsYXknKTtcbiAgY29uc3QgcGF0aEVsICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb25ib2FyZGluZy1tYXN0ZXItY3YtcGF0aCcpO1xuICBjb25zdCBzdGF0dXNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvbmJvYXJkaW5nLW1vZGFsLXN0YXR1cycpO1xuICBpZiAocGF0aEVsKSAgIHBhdGhFbC50ZXh0Q29udGVudCAgID0gbWFzdGVyQ3ZQYXRoIHx8ICcodW5rbm93biknO1xuICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJyc7XG4gIF9zZXRXZWxjb21lU2VjdGlvbignbWlzc2luZycpO1xuICBpZiAob3ZlcmxheSkge1xuICAgIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICBfb3Blbk9uYm9hcmRpbmdGb2N1c1RyYXAob3ZlcmxheSk7XG4gIH1cbn1cblxuLyoqXG4gKiBTaG93IHRoZSB3ZWxjb21lIG1vZGFsIHVubGVzcyB0aGUgdXNlciBoYXMgZGlzbWlzc2VkIGl0LlxuICogQ2FsbHMgL2FwaS9zZXR1cC9tYXN0ZXItY3Ytc3RhdHVzIHRvIGNob29zZSB3aGljaCBzZWN0aW9uIHRvIGRpc3BsYXkuXG4gKiBTYWZlIHRvIGNhbGwgb24gZXZlcnkgc3RhcnR1cCBcdTIwMTQgbm8tb3BzIGltbWVkaWF0ZWx5IGlmIGRpc21pc3NlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbWF5YmVTaG93V2VsY29tZU1vZGFsKCkge1xuICB0cnkge1xuICAgIGlmIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbShfV0VMQ09NRV9ESVNNSVNTRURfS0VZKSkgcmV0dXJuO1xuICB9IGNhdGNoIChfKSB7fVxuICBsZXQgc2VjdGlvbiA9ICdwcmVzZW50JztcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9zZXR1cC9tYXN0ZXItY3Ytc3RhdHVzJyk7XG4gICAgaWYgKHJlcy5vaykge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSk7XG4gICAgICBpZiAoIWRhdGEuZXhpc3RzKSB7XG4gICAgICAgIGNvbnN0IHBhdGhFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvbmJvYXJkaW5nLW1hc3Rlci1jdi1wYXRoJyk7XG4gICAgICAgIGlmIChwYXRoRWwpIHBhdGhFbC50ZXh0Q29udGVudCA9IGRhdGEucGF0aCB8fCAnKHVua25vd24pJztcbiAgICAgICAgc2VjdGlvbiA9ICdtaXNzaW5nJztcbiAgICAgIH0gZWxzZSBpZiAoZGF0YS5pc19lbXB0eSkge1xuICAgICAgICBzZWN0aW9uID0gJ2VtcHR5JztcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKF8pIHt9XG4gIGNvbnN0IHN0YXR1c0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ29uYm9hcmRpbmctbW9kYWwtc3RhdHVzJyk7XG4gIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnJztcbiAgX3NldFdlbGNvbWVTZWN0aW9uKHNlY3Rpb24pO1xuICBjb25zdCBvdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ29uYm9hcmRpbmctbW9kYWwtb3ZlcmxheScpO1xuICBpZiAob3ZlcmxheSkge1xuICAgIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICBfb3Blbk9uYm9hcmRpbmdGb2N1c1RyYXAob3ZlcmxheSk7XG4gIH1cbn1cblxuLyoqIFdpcmUgZm9jdXMgdHJhcCBhbmQgRXNjYXBlIGhhbmRsZXIgZm9yIHRoZSBvbmJvYXJkaW5nIG92ZXJsYXkgKFdDQUcgMi4xLjIpLiAqL1xuZnVuY3Rpb24gX29wZW5PbmJvYXJkaW5nRm9jdXNUcmFwKG92ZXJsYXkpIHtcbiAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzLnNldEluaXRpYWxGb2N1cyA9PT0gJ2Z1bmN0aW9uJykgZ2xvYmFsVGhpcy5zZXRJbml0aWFsRm9jdXMoJ29uYm9hcmRpbmctbW9kYWwtb3ZlcmxheScpO1xuICBpZiAodHlwZW9mIGdsb2JhbFRoaXMudHJhcEZvY3VzID09PSAnZnVuY3Rpb24nKSAgICAgICBnbG9iYWxUaGlzLnRyYXBGb2N1cygnb25ib2FyZGluZy1tb2RhbC1vdmVybGF5Jyk7XG4gIGlmICghb3ZlcmxheS5fb25ib2FyZGluZ0VzY0hhbmRsZXIpIHtcbiAgICBvdmVybGF5Ll9vbmJvYXJkaW5nRXNjSGFuZGxlciA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSBjbG9zZVdlbGNvbWVNb2RhbCgpO1xuICAgIH07XG4gICAgb3ZlcmxheS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb3ZlcmxheS5fb25ib2FyZGluZ0VzY0hhbmRsZXIpO1xuICB9XG59XG5cbi8qKlxuICogU2hvdyB0aGUgd2VsY29tZSBtb2RhbCB1bmNvbmRpdGlvbmFsbHkgKGlnbm9yZXMgdGhlIFwiZG9uJ3Qgc2hvdyBhZ2FpblwiIGZsYWcpLlxuICogVXNlZCBieSB0aGUgSGVscCBidXR0b24gc28gdXNlcnMgY2FuIGFsd2F5cyByZW9wZW4gb25ib2FyZGluZyBtaWQtc2Vzc2lvbi5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2hvd1dlbGNvbWVNb2RhbCgpIHtcbiAgbGV0IHNlY3Rpb24gPSAncHJlc2VudCc7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvc2V0dXAvbWFzdGVyLWN2LXN0YXR1cycpO1xuICAgIGlmIChyZXMub2spIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpLmNhdGNoKCgpID0+ICh7fSkpO1xuICAgICAgaWYgKCFkYXRhLmV4aXN0cykge1xuICAgICAgICBjb25zdCBwYXRoRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb25ib2FyZGluZy1tYXN0ZXItY3YtcGF0aCcpO1xuICAgICAgICBpZiAocGF0aEVsKSBwYXRoRWwudGV4dENvbnRlbnQgPSBkYXRhLnBhdGggfHwgJyh1bmtub3duKSc7XG4gICAgICAgIHNlY3Rpb24gPSAnbWlzc2luZyc7XG4gICAgICB9IGVsc2UgaWYgKGRhdGEuaXNfZW1wdHkpIHtcbiAgICAgICAgc2VjdGlvbiA9ICdlbXB0eSc7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChfKSB7fVxuICBjb25zdCBzdGF0dXNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvbmJvYXJkaW5nLW1vZGFsLXN0YXR1cycpO1xuICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJyc7XG4gIF9zZXRXZWxjb21lU2VjdGlvbihzZWN0aW9uKTtcbiAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvbmJvYXJkaW5nLW1vZGFsLW92ZXJsYXknKTtcbiAgaWYgKG92ZXJsYXkpIHtcbiAgICBvdmVybGF5LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgX29wZW5PbmJvYXJkaW5nRm9jdXNUcmFwKG92ZXJsYXkpO1xuICB9XG59XG5cbi8qKlxuICogQ2xvc2UgdGhlIHdlbGNvbWUgbW9kYWwuXG4gKiBJZiBcIkRvbid0IHNob3cgYWdhaW5cIiBpcyBjaGVja2VkLCBwZXJzaXN0cyB0aGUgZGlzbWlzc2FsIGluIGxvY2FsU3RvcmFnZS5cbiAqL1xuZnVuY3Rpb24gY2xvc2VXZWxjb21lTW9kYWwoKSB7XG4gIGNvbnN0IG92ZXJsYXkgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ29uYm9hcmRpbmctbW9kYWwtb3ZlcmxheScpO1xuICBjb25zdCBjaGVja2JveCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd3ZWxjb21lLWRvbnQtc2hvdy1hZ2FpbicpO1xuICBpZiAob3ZlcmxheSkge1xuICAgIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBpZiAob3ZlcmxheS5fb25ib2FyZGluZ0VzY0hhbmRsZXIpIHtcbiAgICAgIG92ZXJsYXkucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIG92ZXJsYXkuX29uYm9hcmRpbmdFc2NIYW5kbGVyKTtcbiAgICAgIGRlbGV0ZSBvdmVybGF5Ll9vbmJvYXJkaW5nRXNjSGFuZGxlcjtcbiAgICB9XG4gIH1cbiAgaWYgKGNoZWNrYm94ICYmIGNoZWNrYm94LmNoZWNrZWQpIHtcbiAgICB0cnkgeyBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShfV0VMQ09NRV9ESVNNSVNTRURfS0VZLCAnMScpOyB9IGNhdGNoIChfKSB7fVxuICB9XG4gIGlmICh0eXBlb2YgZ2xvYmFsVGhpcy5yZXN0b3JlRm9jdXMgPT09ICdmdW5jdGlvbicpIGdsb2JhbFRoaXMucmVzdG9yZUZvY3VzKCk7XG59XG5cbi8qKlxuICogQ2FsbGVkIGJ5IHRoZSBvbmJvYXJkaW5nIG1vZGFsIFwiQ3JlYXRlIGVtcHR5IHByb2ZpbGVcIiBidXR0b24uXG4gKiBQT1NUcyB0byAvYXBpL3NldHVwL2NyZWF0ZS1tYXN0ZXItY3YsIHRoZW4gbmF2aWdhdGVzIHRvIGEgbmV3IHNlc3Npb24uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG9uYm9hcmRpbmdDcmVhdGVFbXB0eVByb2ZpbGUoKSB7XG4gIGNvbnN0IGJ0biAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ29uYm9hcmRpbmctY3JlYXRlLWJ0bicpO1xuICBjb25zdCBzdGF0dXNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvbmJvYXJkaW5nLW1vZGFsLXN0YXR1cycpO1xuICBpZiAoYnRuKSBidG4uZGlzYWJsZWQgPSB0cnVlO1xuICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJ0NyZWF0aW5nIHByb2ZpbGVcdTIwMjYnO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9zZXR1cC9jcmVhdGUtbWFzdGVyLWN2JywgeyBtZXRob2Q6ICdQT1NUJyB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKTtcbiAgICBpZiAoIXJlcy5vaykge1xuICAgICAgY29uc3QgbXNnID0gZGF0YS5lcnJvciA9PT0gJ2FscmVhZHlfZXhpc3RzJ1xuICAgICAgICA/ICdGaWxlIGFscmVhZHkgZXhpc3RzIFx1MjAxNCBwbGVhc2UgcmVsb2FkIHRoZSBwYWdlLidcbiAgICAgICAgOiAoZGF0YS5lcnJvciB8fCBgU2VydmVyIGVycm9yICR7cmVzLnN0YXR1c31gKTtcbiAgICAgIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSBtc2c7XG4gICAgICBpZiAoYnRuKSBidG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gRmlsZSBjcmVhdGVkIFx1MjAxNCBub3cgbmF2aWdhdGUgdG8gYSBuZXcgc2Vzc2lvblxuICAgIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnUHJvZmlsZSBjcmVhdGVkISBTdGFydGluZyBzZXNzaW9uXHUyMDI2JztcbiAgICBhd2FpdCBjcmVhdGVOZXdTZXNzaW9uQW5kTmF2aWdhdGUoKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKHN0YXR1c0VsKSBzdGF0dXNFbC50ZXh0Q29udGVudCA9IGBFcnJvcjogJHtlcnIubWVzc2FnZX1gO1xuICAgIGlmIChidG4pIGJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU2Vzc2lvbiBjcmVhdGlvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZU5ld1Nlc3Npb25BbmROYXZpZ2F0ZSgpIHtcbiAgY29uc3QgZGF0YSA9IGF3YWl0IGNyZWF0ZVNlc3Npb24oKTtcbiAgaWYgKGRhdGEuZXJyb3IgPT09ICdtYXN0ZXJfY3ZfbWlzc2luZycpIHtcbiAgICBzaG93T25ib2FyZGluZ01vZGFsKGRhdGEubWFzdGVyX2N2X3BhdGggfHwgJycpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIWRhdGEuc2Vzc2lvbl9pZCkgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gY3JlYXRlIHNlc3Npb24nKTtcbiAgLy8gQ2xlYXIgYW55IHN0YWxlIHNlc3Npb24gcGF0aCBcdTIwMTQgdGhlIG5ldyBzZXNzaW9uIGhhcyBubyBzYXZlZCBmaWxlIHlldC5cbiAgLy8gSWYgU0VTU0lPTl9QQVRIIHdlcmUgbGVmdCBwb2ludGluZyBhdCBhIHByZXZpb3VzIHNlc3Npb24ncyBmaWxlLCB0aGVcbiAgLy8gZGlzay1yZXN0b3JlIGd1YXJkIGluIHJlc3RvcmVCYWNrZW5kU3RhdGUgY291bGQgbG9hZCB0aGUgd3Jvbmcgc2Vzc2lvblxuICAvLyBvbiB0aGUgbmV4dCB2aXNpdCBvbmNlIFNFU1NJT05fSUQgaXMgdXBkYXRlZCBieSB0aGUgYmVmb3JldW5sb2FkIGhhbmRsZXIuXG4gIHRyeSB7IGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdjdi1idWlsZGVyLXNlc3Npb24tcGF0aCcpOyB9IGNhdGNoIChfKSB7fVxuICB3aW5kb3cubG9jYXRpb24uYXNzaWduKGRhdGEucmVkaXJlY3RfdXJsIHx8IGAvP3Nlc3Npb249JHtkYXRhLnNlc3Npb25faWR9YCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZU5ld1Nlc3Npb25Jbk5ld1RhYigpIHtcbiAgY29uc3QgZGF0YSA9IGF3YWl0IGNyZWF0ZVNlc3Npb24oKTtcbiAgaWYgKGRhdGEuZXJyb3IgPT09ICdtYXN0ZXJfY3ZfbWlzc2luZycpIHtcbiAgICBzaG93T25ib2FyZGluZ01vZGFsKGRhdGEubWFzdGVyX2N2X3BhdGggfHwgJycpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIWRhdGEuc2Vzc2lvbl9pZCkgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gY3JlYXRlIHNlc3Npb24nKTtcbiAgd2luZG93Lm9wZW4oZGF0YS5yZWRpcmVjdF91cmwgfHwgYC8/c2Vzc2lvbj0ke2RhdGEuc2Vzc2lvbl9pZH1gLCAnX2JsYW5rJywgJ25vb3BlbmVyJyk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU2Vzc2lvbiBjbGFpbSAvIG93bmVyc2hpcFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmFzeW5jIGZ1bmN0aW9uIF9jbGFpbUN1cnJlbnRTZXNzaW9uKHNlc3Npb25JZFRvQ2xhaW0pIHtcbiAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvc2Vzc2lvbnMvY2xhaW0nLCB7XG4gICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgc2Vzc2lvbl9pZDogc2Vzc2lvbklkVG9DbGFpbSxcbiAgICAgIG93bmVyX3Rva2VuOiBnZXRPd25lclRva2VuKCksXG4gICAgfSksXG4gIH0pO1xuXG4gIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpLmNhdGNoKCgpID0+ICh7fSkpO1xuICBpZiAocmVzLm9rICYmIGRhdGEub2sgIT09IGZhbHNlKSByZXR1cm4gdHJ1ZTtcblxuICBpZiAocmVzLnN0YXR1cyA9PT0gNDA5ICYmIGRhdGEuZXJyb3IgPT09ICdzZXNzaW9uX293bmVkJykge1xuICAgIGNvbnN0IGFjdGlvbiA9IGF3YWl0IHNob3dPd25lcnNoaXBDb25mbGljdERpYWxvZyhcbiAgICAgICdUaGlzIHNlc3Npb24gaXMgY3VycmVudGx5IGNsYWltZWQgYnkgYW5vdGhlciBicm93c2VyIHRhYi4gWW91IGNhbiB0YWtlIGl0IG92ZXIsIHN0YXJ0IGEgbmV3IHNlc3Npb24sIG9yIGxvYWQgYSBkaWZmZXJlbnQgb25lLidcbiAgICApO1xuICAgIGlmIChhY3Rpb24gPT09ICduZXcnKSB7XG4gICAgICBhd2FpdCBjcmVhdGVOZXdTZXNzaW9uQW5kTmF2aWdhdGUoKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGFjdGlvbiAhPT0gJ3Rha2VvdmVyJykge1xuICAgICAgc2hvd1Nlc3Npb25zTGFuZGluZ1BhbmVsKCdTZWxlY3QgYSBkaWZmZXJlbnQgc2Vzc2lvbiBvciBjcmVhdGUgYSBuZXcgb25lLicpO1xuICAgICAgb3BlblNlc3Npb25zTW9kYWwoeyByZXF1aXJlZDogdHJ1ZSB9KTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCB0YWtlb3ZlclJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3Nlc3Npb25zL3Rha2VvdmVyJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgc2Vzc2lvbl9pZDogc2Vzc2lvbklkVG9DbGFpbSxcbiAgICAgICAgb3duZXJfdG9rZW46IGdldE93bmVyVG9rZW4oKSxcbiAgICAgIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IHRha2VvdmVyRGF0YSA9IGF3YWl0IHRha2VvdmVyUmVzLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKTtcbiAgICBpZiAoIXRha2VvdmVyUmVzLm9rKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IodGFrZW92ZXJEYXRhLmVycm9yIHx8ICdGYWlsZWQgdG8gdGFrZSBvdmVyIHNlc3Npb24nKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAocmVzLnN0YXR1cyA9PT0gNDA0IHx8IGRhdGEuZXJyb3IgPT09ICdzZXNzaW9uX25vdF9mb3VuZCcpIHtcbiAgICBzaG93U2Vzc2lvbnNMYW5kaW5nUGFuZWwoJ1RoYXQgc2Vzc2lvbiBpcyBubyBsb25nZXIgYWN0aXZlLiBMb2FkIGl0IGZyb20gZGlzayBvciBjcmVhdGUgYSBuZXcgb25lLicpO1xuICAgIG9wZW5TZXNzaW9uc01vZGFsKHsgcmVxdWlyZWQ6IHRydWUgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGRhdGEuZXJyb3IgfHwgYEZhaWxlZCB0byBjbGFpbSBzZXNzaW9uICgke3Jlcy5zdGF0dXN9KWApO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNlc3Npb24gbmF2aWdhdGlvbiBmcm9tIGxhbmRpbmcgcGFnZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIHNob3dTZXNzaW9uc0xhbmRpbmdQYW5lbChtZXNzYWdlID0gJycpIHtcbiAgc3RhdGVNYW5hZ2VyLnNldEN1cnJlbnRUYWIoJ2pvYicpO1xuICBzdGF0ZU1hbmFnZXIuc2V0UGhhc2UoUEhBU0VTLklOSVQpO1xuICB1cGRhdGVBY3Rpb25CdXR0b25zKCdqb2InKTtcbiAgdXBkYXRlUG9zaXRpb25UaXRsZSh7fSk7XG5cbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIGlmICghY29udGVudCkgcmV0dXJuO1xuXG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLWxhbmRpbmctc2hlbGxcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLWxhbmRpbmctaGVhZGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLWxhbmRpbmctY29weVwiPlxuICAgICAgICAgIDxoMj5TZWxlY3QgYSBTZXNzaW9uPC9oMj5cbiAgICAgICAgICA8cD5FYWNoIGJyb3dzZXIgdGFiIG5vdyB3b3JrcyBhZ2FpbnN0IGl0cyBvd24gVVJMLXNjb3BlZCBzZXNzaW9uLjwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLWxhbmRpbmctYWN0aW9uc1wiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgb25jbGljaz1cImNyZWF0ZU5ld1Nlc3Npb25Jbk5ld1RhYigpXCI+XHVGRjBCIE5ldyBTZXNzaW9uIGluIE5ldyBUYWI8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgICR7bWVzc2FnZSA/IGA8cCBzdHlsZT1cIm1hcmdpbi1ib3R0b206MjBweDtjb2xvcjojYjQ1MzA5O2ZvbnQtd2VpZ2h0OjYwMDtcIj4ke2VzY2FwZUh0bWwobWVzc2FnZSl9PC9wPmAgOiAnJ31cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjEycHg7bWFyZ2luLWJvdHRvbToyNHB4O2ZsZXgtd3JhcDp3cmFwO1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBwcmltYXJ5XCIgb25jbGljaz1cImNyZWF0ZU5ld1Nlc3Npb25BbmROYXZpZ2F0ZSgpXCI+KyBOZXcgU2Vzc2lvbjwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGA7XG59XG5cbmZ1bmN0aW9uIF9yZXN0b3JlVGFiRm9yUGhhc2Uoc2Vzc2lvblBoYXNlKSB7XG4gIGNvbnN0IHBoYXNlVGFiTWFwID0ge1xuICAgIFtQSEFTRVMuSU5JVF06ICAgICAgICAgICAgICdqb2InLFxuICAgIFtQSEFTRVMuSk9CX0FOQUxZU0lTXTogICAgICdhbmFseXNpcycsXG4gICAgW1BIQVNFUy5DVVNUT01JWkFUSU9OXTogICAgJ2V4cC1yZXZpZXcnLFxuICAgIFtQSEFTRVMuUkVXUklURV9SRVZJRVddOiAgICdyZXdyaXRlJyxcbiAgICBbUEhBU0VTLlNQRUxMX0NIRUNLXTogICAgICAnc3BlbGwnLFxuICAgIFtQSEFTRVMuR0VORVJBVElPTl06ICAgICAgICdsYXlvdXQnLFxuICAgIFtQSEFTRVMuTEFZT1VUX1JFVklFV106ICAgICdsYXlvdXQnLFxuICAgIFtQSEFTRVMuRklOQUxfR0VORVJBVElPTl06ICdmaW5hbF9nZW5lcmF0ZScsXG4gICAgW1BIQVNFUy5SRUZJTkVNRU5UXTogICAgICAgJ2Rvd25sb2FkJyxcbiAgfTtcbiAgY29uc3QgdGFyZ2V0VGFiID0gcGhhc2VUYWJNYXBbc2Vzc2lvblBoYXNlXSB8fCAnam9iJztcblxuICBpZiAodHlwZW9mIHN3aXRjaFRhYiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHN3aXRjaFRhYih0YXJnZXRUYWIpO1xuICB9IGVsc2Uge1xuICAgIHN0YXRlTWFuYWdlci5zZXRDdXJyZW50VGFiKHRhcmdldFRhYik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX3Jlc29sdmVSZXN0b3JlZFBoYXNlKHN0YXR1c0RhdGEpIHtcbiAgY29uc3QgcGhhc2UgPSBzdGF0dXNEYXRhPy5waGFzZSB8fCBQSEFTRVMuSU5JVDtcblxuICAvLyBHdWFyZDogbm8gam9iX2FuYWx5c2lzIG1lYW5zIHdlIGNhbm5vdCBiZSBwYXN0IHRoZSBpbml0aWFsIGlucHV0IHN0ZXAuXG4gIGlmICghc3RhdHVzRGF0YT8uam9iX2FuYWx5c2lzKSB7XG4gICAgcmV0dXJuIFBIQVNFUy5JTklUO1xuICB9XG5cbiAgLy8gR3VhcmQ6IHBoYXNlIGNsYWltcyBjdXN0b21pemF0aW9ucyB3ZXJlIHJldmlld2VkLCBidXQgdGhleSB3ZXJlIG5ldmVyXG4gIC8vIGdlbmVyYXRlZCAoZS5nLiBiYWNrZW5kIHJlc3RhcnRlZCBhZnRlciBhbmFseXplX2pvYiBidXQgYmVmb3JlXG4gIC8vIHJlY29tbWVuZF9jdXN0b21pemF0aW9ucyByYW4sIG9yIGxlZ2FjeSBzZXNzaW9ucyBzYXZlZCB3aXRoIHRoZSBvbGRcbiAgLy8gcHJlbWF0dXJlLUNVU1RPTUlaQVRJT04gYnVnKS4gRmFsbCBiYWNrIHNvIHRoZSB1c2VyIHNlZXMgdGhlIEFuYWx5c2lzXG4gIC8vIHN0ZXAgYW5kIGNhbiBydW4gUmVjb21tZW5kIEN1c3RvbWl6YXRpb25zIGZyb20gdGhlcmUuXG4gIGlmIChcbiAgICAocGhhc2UgPT09IFBIQVNFUy5DVVNUT01JWkFUSU9OIHx8IHBoYXNlID09PSBQSEFTRVMuUkVXUklURV9SRVZJRVcpXG4gICAgJiYgIXN0YXR1c0RhdGE/LmN1c3RvbWl6YXRpb25zXG4gICkge1xuICAgIHJldHVybiBQSEFTRVMuSk9CX0FOQUxZU0lTO1xuICB9XG5cbiAgcmV0dXJuIHBoYXNlO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNlc3Npb24gY29udGV4dCAvIHJlc3RvcmVcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5hc3luYyBmdW5jdGlvbiBlbnN1cmVTZXNzaW9uQ29udGV4dCgpIHtcbiAgY29uc3QgdXJsU2Vzc2lvbklkID0gZ2V0U2Vzc2lvbklkRnJvbVVSTCgpO1xuICBpZiAoIXVybFNlc3Npb25JZCkge1xuICAgIHNob3dTZXNzaW9uc0xhbmRpbmdQYW5lbCgpO1xuICAgIG9wZW5TZXNzaW9uc01vZGFsKHsgcmVxdWlyZWQ6IHRydWUgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgc3RhdGVNYW5hZ2VyLnNldFNlc3Npb25JZCh1cmxTZXNzaW9uSWQpO1xuICByZXR1cm4gX2NsYWltQ3VycmVudFNlc3Npb24odXJsU2Vzc2lvbklkKTtcbn1cblxuZnVuY3Rpb24gX2FwcGVuZFJlc3RvcmVkRGVjaXNpb25zU3VtbWFyeSgpIHtcbiAgY29uc3QgcGhhc2UgPSBzdGF0ZU1hbmFnZXIuZ2V0UGhhc2UoKTtcbiAgY29uc3QgY3VzdG9taXphdGlvbnMgPSBzdGF0ZU1hbmFnZXIuZ2V0VGFiRGF0YSgnY3VzdG9taXphdGlvbnMnKSB8fCB3aW5kb3cucGVuZGluZ1JlY29tbWVuZGF0aW9ucztcbiAgY29uc3QgcGFydHMgPSBbXTtcblxuICBpZiAoY3VzdG9taXphdGlvbnMpIHtcbiAgICBjb25zdCBleHBDb3VudCA9IChjdXN0b21pemF0aW9ucy5yZWNvbW1lbmRlZF9leHBlcmllbmNlcyB8fCBbXSkubGVuZ3RoO1xuICAgIGlmIChleHBDb3VudCA+IDApIHBhcnRzLnB1c2goYCR7ZXhwQ291bnR9IGV4cGVyaWVuY2Uke2V4cENvdW50ICE9PSAxID8gJ3MnIDogJyd9IHJlY29tbWVuZGVkYCk7XG4gICAgY29uc3Qgc2tpbGxDb3VudCA9IChjdXN0b21pemF0aW9ucy5yZWNvbW1lbmRlZF9za2lsbHMgfHwgW10pLmxlbmd0aDtcbiAgICBpZiAoc2tpbGxDb3VudCA+IDApIHBhcnRzLnB1c2goYCR7c2tpbGxDb3VudH0gc2tpbGwke3NraWxsQ291bnQgIT09IDEgPyAncycgOiAnJ30gcmVjb21tZW5kZWRgKTtcbiAgfVxuXG4gIGNvbnN0IGRlY2lzaW9ucyA9IHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMgfHwge307XG4gIGNvbnN0IGFwcHJvdmVkUmV3cml0ZXMgPSBBcnJheS5pc0FycmF5KHdpbmRvdy5hcHByb3ZlZFJld3JpdGVzKSA/IHdpbmRvdy5hcHByb3ZlZFJld3JpdGVzLmxlbmd0aFxuICAgIDogT2JqZWN0LmtleXMoZGVjaXNpb25zLmV4cGVyaWVuY2VfZGVjaXNpb25zIHx8IHt9KS5sZW5ndGg7XG4gIGlmIChhcHByb3ZlZFJld3JpdGVzID4gMCkgcGFydHMucHVzaChgJHthcHByb3ZlZFJld3JpdGVzfSByZXdyaXRlJHthcHByb3ZlZFJld3JpdGVzICE9PSAxID8gJ3MnIDogJyd9IGFwcHJvdmVkYCk7XG5cbiAgY29uc3QgYXRzID0gc3RhdGVNYW5hZ2VyLmdldEF0c1Njb3JlKCk7XG4gIGlmIChhdHMgJiYgdHlwZW9mIGF0cy5vdmVyYWxsID09PSAnbnVtYmVyJykge1xuICAgIHBhcnRzLnB1c2goYEFUUyBzY29yZSAke01hdGgucm91bmQoYXRzLm92ZXJhbGwpfSVgKTtcbiAgfVxuXG4gIGlmIChwYXJ0cy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgcGhhc2VMYWJlbCA9IFNFU1NJT05fUEhBU0VfTEFCRUxTX1NIT1JUW3BoYXNlXSB8fCBTdHJpbmcocGhhc2UpLnJlcGxhY2UoL18vZywgJyAnKTtcbiAgICBjb25zdCBwb3NpdGlvbkN0eCA9IHdpbmRvdy5fcmVzdG9yZWRQb3NpdGlvbk5hbWUgPyBgIGZvciAke3dpbmRvdy5fcmVzdG9yZWRQb3NpdGlvbk5hbWV9YCA6ICcnO1xuICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsIGBcdUQ4M0RcdURDQ0IgUmVzdG9yZWQke3Bvc2l0aW9uQ3R4fSBhdCBzdGFnZTogJHtwaGFzZUxhYmVsfSBcdTIwMTQgJHtwYXJ0cy5qb2luKCcsICcpfS5gKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZXN0b3JlU2Vzc2lvbigpIHtcbiAgdHJ5IHtcbiAgICBzdGF0ZU1hbmFnZXIuc2V0SXNSZWNvbm5lY3RpbmcodHJ1ZSk7XG5cbiAgICBjb25zdCBzdG9yZWRTZXNzaW9uSWQgPSBnZXRTZXNzaW9uSWRGcm9tVVJMKCkgfHwgbG9jYWxTdG9yYWdlLmdldEl0ZW0oU3RvcmFnZUtleXMuU0VTU0lPTl9JRCk7XG4gICAgaWYgKCFzdG9yZWRTZXNzaW9uSWQpIHtcbiAgICAgIHN0YXRlTWFuYWdlci5zZXRJc1JlY29ubmVjdGluZyhmYWxzZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN0YXRlTWFuYWdlci5zZXRTZXNzaW9uSWQoc3RvcmVkU2Vzc2lvbklkKTtcblxuICAgIC8vIFRyeSB0byByZXN0b3JlIGNvbnZlcnNhdGlvbiBoaXN0b3J5IGZyb20gYmFja2VuZFxuICAgIGNvbnN0IGhpc3RvcnlSZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9oaXN0b3J5Jyk7XG4gICAgaWYgKGhpc3RvcnlSZXMub2spIHtcbiAgICAgIGNvbnN0IGhpc3RvcnlEYXRhID0gYXdhaXQgaGlzdG9yeVJlcy5qc29uKCk7XG5cbiAgICAgIC8vIEFsd2F5cyBjbGVhciBwbGFjZWhvbGRlciBIVE1MIGNvbnRlbnQgbm93IHRoYXQgd2UgaGF2ZSBhIGxpdmUgc2Vzc2lvbiByZXNwb25zZS5cbiAgICAgIGNvbnN0IGNvbnZlcnNhdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb252ZXJzYXRpb24nKTtcbiAgICAgIGNvbnZlcnNhdGlvbi5pbm5lckhUTUwgPSAnJztcblxuICAgICAgLy8gQWx3YXlzIHJlc3RvcmUgZnJvbSB0aGUgc2VydmVyIHNlc3Npb24gZmlsZSAoYXV0aG9yaXRhdGl2ZSBoaXN0b3J5IHNvdXJjZSkuXG4gICAgICBpZiAoaGlzdG9yeURhdGEuaGlzdG9yeSAmJiBoaXN0b3J5RGF0YS5oaXN0b3J5Lmxlbmd0aCA+IDApIHtcblxuICAgICAgICBoaXN0b3J5RGF0YS5oaXN0b3J5LmZvckVhY2gobXNnID0+IHtcbiAgICAgICAgICBpZiAobXNnLnJvbGUgPT09ICd1c2VyJykge1xuICAgICAgICAgICAgYXBwZW5kTWVzc2FnZSgndXNlcicsIG1zZy5jb250ZW50KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKG1zZy5yb2xlID09PSAnYXNzaXN0YW50Jykge1xuICAgICAgICAgICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgbXNnLmNvbnRlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgJ1x1RDgzRFx1REQwNCBTZXNzaW9uIHJlc3RvcmVkIGZyb20gc2VydmVyLicpO1xuICAgICAgICBsb2cuaW5mbyhgUmVzdG9yZWQgJHtoaXN0b3J5RGF0YS5oaXN0b3J5Lmxlbmd0aH0gbWVzc2FnZXMgZnJvbSBiYWNrZW5kYCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSBwaGFzZVxuICAgICAgaWYgKGhpc3RvcnlEYXRhLnBoYXNlKSB7XG4gICAgICAgIHN0YXRlTWFuYWdlci5zZXRQaGFzZShoaXN0b3J5RGF0YS5waGFzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVHJ5IHRvIHJlc3RvcmUgYmFja2VuZCBzdGF0ZS5cbiAgICAvLyBSZXR1cm5zIHRydWUgd2hlbiBzZXJ2ZXIgaGFkIGxpdmUgc2Vzc2lvbiBkYXRhIChpbiBtZW1vcnkgb3IgbG9hZGVkIGZyb20gZGlzaykuXG4gICAgY29uc3Qgc2VydmVySGFzRGF0YSA9IGF3YWl0IHJlc3RvcmVCYWNrZW5kU3RhdGUoKTtcblxuICAgIC8vIFJlc3RvcmUgVUktb25seSBwcmVmcyAoYWN0aXZlUmV2aWV3UGFuZSkgZnJvbSBsb2NhbFN0b3JhZ2UuXG4gICAgcmVzdG9yZVRhYkRhdGEoeyB1aVByZWZzT25seTogc2VydmVySGFzRGF0YSB9KTtcblxuICAgIC8vIFNob3cgYSByZXN0b3JlZC1kZWNpc2lvbnMgc3VtbWFyeSB3aGVuIHRoZSBiYWNrZW5kIGhhZCBsaXZlIHNlc3Npb24gZGF0YS5cbiAgICBpZiAoc2VydmVySGFzRGF0YSkge1xuICAgICAgX2FwcGVuZFJlc3RvcmVkRGVjaXNpb25zU3VtbWFyeSgpO1xuICAgIH1cblxuICAgIHN0YXRlTWFuYWdlci5zZXRJc1JlY29ubmVjdGluZyhmYWxzZSk7XG5cbiAgICAvLyBSdW4gYSBiYWNrZ3JvdW5kIGhlYWx0aCBjaGVjayBzbyB0aGUgc3RhdHVzIHBpbGwgcmVmbGVjdHMgbGl2ZSBjb25uZWN0aXZpdHkuXG4gICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzLnRlc3RDdXJyZW50TW9kZWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGdsb2JhbFRoaXMudGVzdEN1cnJlbnRNb2RlbCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICB9XG5cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cud2FybignU2Vzc2lvbiByZXN0b3JhdGlvbiBmYWlsZWQ6JywgZXJyb3IpO1xuICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsIGBcdTI2QTBcdUZFMEYgQ291bGQgbm90IHJlc3RvcmUgcHJldmlvdXMgc2Vzc2lvbi4gU3RhcnRpbmcgZnJlc2guICgke2Vycm9yLm1lc3NhZ2V9KWApO1xuICAgIHN0YXRlTWFuYWdlci5zZXRJc1JlY29ubmVjdGluZyhmYWxzZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2h5ZHJhdGVTdGF0dXNEZXJpdmVkU3RhdGUoc3RhdHVzRGF0YSkge1xuICB3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0cyA9IHt9O1xuICB0cnkge1xuICAgIGlmIChzdGF0dXNEYXRhLmFjaGlldmVtZW50X2VkaXRzICYmIE9iamVjdC5rZXlzKHN0YXR1c0RhdGEuYWNoaWV2ZW1lbnRfZWRpdHMpLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHN0YXR1c0RhdGEuYWNoaWV2ZW1lbnRfZWRpdHMpKSB7XG4gICAgICAgIGNvbnN0IGlkeCA9IHBhcnNlSW50KGssIDEwKTtcbiAgICAgICAgY29uc3QgcmF3SXRlbXMgPSBBcnJheS5pc0FycmF5KHYpID8gdiA6IFt2XTtcbiAgICAgICAgd2luZG93LmFjaGlldmVtZW50RWRpdHNbaWR4XSA9IHJhd0l0ZW1zLm1hcChpdGVtID0+IHtcbiAgICAgICAgICBpZiAoaXRlbSAmJiB0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoaXRlbSkpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHRleHQ6IFN0cmluZyhpdGVtLnRleHQgPz8gaXRlbS5kZXNjcmlwdGlvbiA/PyBpdGVtLmNvbnRlbnQgPz8gJycpLFxuICAgICAgICAgICAgICBoaWRkZW46IEJvb2xlYW4oaXRlbS5oaWRkZW4pLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRleHQ6IFN0cmluZyhpdGVtID8/ICcnKSxcbiAgICAgICAgICAgIGhpZGRlbjogZmFsc2UsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChfZSkgeyAvKiBub24tZmF0YWwgKi8gfVxuXG4gIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMgPSB7XG4gICAgZXhwZXJpZW5jZV9kZWNpc2lvbnM6IHN0YXR1c0RhdGEuZXhwZXJpZW5jZV9kZWNpc2lvbnMgfHwge30sXG4gICAgc2tpbGxfZGVjaXNpb25zOiAgICAgIHN0YXR1c0RhdGEuc2tpbGxfZGVjaXNpb25zICAgICAgfHwge30sXG4gICAgYWNoaWV2ZW1lbnRfZGVjaXNpb25zOnN0YXR1c0RhdGEuYWNoaWV2ZW1lbnRfZGVjaXNpb25zIHx8IHt9LFxuICAgIHB1YmxpY2F0aW9uX2RlY2lzaW9uczpzdGF0dXNEYXRhLnB1YmxpY2F0aW9uX2RlY2lzaW9ucyB8fCB7fSxcbiAgICBzdW1tYXJ5X2ZvY3VzX292ZXJyaWRlOiBzdGF0dXNEYXRhLnN1bW1hcnlfZm9jdXNfb3ZlcnJpZGUgfHwgbnVsbCxcbiAgICBleHRyYV9za2lsbHM6ICAgICAgICAgICBzdGF0dXNEYXRhLmV4dHJhX3NraWxscyB8fCBbXSxcbiAgICBleHRyYV9za2lsbF9tYXRjaGVzOiAgICBzdGF0dXNEYXRhLmV4dHJhX3NraWxsX21hdGNoZXMgfHwge30sXG4gIH07XG4gIHdpbmRvdy5fYWxsRXhwZXJpZW5jZXMgPSBzdGF0dXNEYXRhLmFsbF9leHBlcmllbmNlcyB8fCBbXTtcbiAgd2luZG93LnNlbGVjdGVkU3VtbWFyeUtleSA9IHN0YXR1c0RhdGEuc3VtbWFyeV9mb2N1c19vdmVycmlkZSB8fCBzdGF0dXNEYXRhLnNlbGVjdGVkX3N1bW1hcnlfa2V5IHx8IG51bGw7XG4gIHdpbmRvdy5fbmV3U2tpbGxzRnJvbUxMTSA9IHN0YXR1c0RhdGEubmV3X3NraWxsc19mcm9tX2xsbSB8fCBbXTtcbiAgd2luZG93Ll9zdGF0dXNJbnRha2UgPSBzdGF0dXNEYXRhLmludGFrZSAmJiB0eXBlb2Ygc3RhdHVzRGF0YS5pbnRha2UgPT09ICdvYmplY3QnXG4gICAgPyBzdGF0dXNEYXRhLmludGFrZVxuICAgIDoge307XG4gIHdpbmRvdy5wb3N0QW5hbHlzaXNRdWVzdGlvbnMgPSBBcnJheS5pc0FycmF5KHN0YXR1c0RhdGEucG9zdF9hbmFseXNpc19xdWVzdGlvbnMpXG4gICAgPyBzdGF0dXNEYXRhLnBvc3RfYW5hbHlzaXNfcXVlc3Rpb25zXG4gICAgOiBbXTtcbiAgd2luZG93LnF1ZXN0aW9uQW5zd2VycyA9IChzdGF0dXNEYXRhLnBvc3RfYW5hbHlzaXNfYW5zd2VycyAmJiB0eXBlb2Ygc3RhdHVzRGF0YS5wb3N0X2FuYWx5c2lzX2Fuc3dlcnMgPT09ICdvYmplY3QnKVxuICAgID8gc3RhdHVzRGF0YS5wb3N0X2FuYWx5c2lzX2Fuc3dlcnNcbiAgICA6IHt9O1xuICB3aW5kb3cuX3Jlc3RvcmVkUG9zaXRpb25OYW1lID0gc3RhdHVzRGF0YS5wb3NpdGlvbl9uYW1lIHx8IG51bGw7XG59XG5cbmZ1bmN0aW9uIF9oeWRyYXRlU3RhdHVzVGFiU3RhdGUoc3RhdHVzRGF0YSkge1xuICBjb25zdCBoYXNBbmFseXNpcyA9IHN0YXR1c0RhdGEuam9iX2FuYWx5c2lzICE9PSB1bmRlZmluZWQgJiYgc3RhdHVzRGF0YS5qb2JfYW5hbHlzaXMgIT09IG51bGw7XG4gIGNvbnN0IGhhc0N1c3RvbWl6YXRpb25zID0gc3RhdHVzRGF0YS5jdXN0b21pemF0aW9ucyAhPT0gdW5kZWZpbmVkICYmIHN0YXR1c0RhdGEuY3VzdG9taXphdGlvbnMgIT09IG51bGw7XG4gIGNvbnN0IGhhc0dlbmVyYXRlZEZpbGVzID0gc3RhdHVzRGF0YS5nZW5lcmF0ZWRfZmlsZXMgIT09IHVuZGVmaW5lZCAmJiBzdGF0dXNEYXRhLmdlbmVyYXRlZF9maWxlcyAhPT0gbnVsbDtcblxuICBzdGF0ZU1hbmFnZXIuc2V0VGFiRGF0YSgnYW5hbHlzaXMnLCBoYXNBbmFseXNpcyA/IHN0YXR1c0RhdGEuam9iX2FuYWx5c2lzIDogbnVsbCk7XG4gIHN0YXRlTWFuYWdlci5zZXRUYWJEYXRhKCdjdXN0b21pemF0aW9ucycsIGhhc0N1c3RvbWl6YXRpb25zID8gc3RhdHVzRGF0YS5jdXN0b21pemF0aW9ucyA6IG51bGwpO1xuICBzdGF0ZU1hbmFnZXIuc2V0VGFiRGF0YSgnY3YnLCBoYXNHZW5lcmF0ZWRGaWxlcyA/IHN0YXR1c0RhdGEuZ2VuZXJhdGVkX2ZpbGVzIDogbnVsbCk7XG4gIHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zID0gaGFzQ3VzdG9taXphdGlvbnMgPyBzdGF0dXNEYXRhLmN1c3RvbWl6YXRpb25zIDogbnVsbDtcblxuICBpZiAoaGFzQW5hbHlzaXMpIHtcbiAgICByZWZyZXNoQXRzU2NvcmUoJ2FuYWx5c2lzJyk7XG4gIH1cblxuICByZXR1cm4gaGFzQW5hbHlzaXMgfHwgaGFzQ3VzdG9taXphdGlvbnMgfHwgaGFzR2VuZXJhdGVkRmlsZXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc3RvcmVCYWNrZW5kU3RhdGUoKSB7XG4gIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2VydmVyIGhhZCBhbnkgbGl2ZSBzZXNzaW9uIGRhdGEuXG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdHVzUmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvc3RhdHVzJyk7XG4gICAgaWYgKCFzdGF0dXNSZXMub2spIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBzdGF0dXNEYXRhID0gcGFyc2VTdGF0dXNSZXNwb25zZShhd2FpdCBzdGF0dXNSZXMuanNvbigpKTtcblxuICAgIGlmICh0eXBlb2YgdXBkYXRlQXV0aEJhZGdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB1cGRhdGVBdXRoQmFkZ2Uoc3RhdHVzRGF0YS5jb3BpbG90X2F1dGggfHwge30sIHN0YXR1c0RhdGEubGxtX3Byb3ZpZGVyIHx8IG51bGwpO1xuICAgIH1cblxuICAgIF9oeWRyYXRlU3RhdHVzRGVyaXZlZFN0YXRlKHN0YXR1c0RhdGEpO1xuXG4gICAgbGV0IHNlcnZlckhhc0RhdGEgPSBfaHlkcmF0ZVN0YXR1c1RhYlN0YXRlKHN0YXR1c0RhdGEpO1xuXG4gICAgaWYgKHN0YXR1c0RhdGEuam9iX2FuYWx5c2lzICE9PSB1bmRlZmluZWQgJiYgc3RhdHVzRGF0YS5qb2JfYW5hbHlzaXMgIT09IG51bGwpIHtcbiAgICAgIGxvZy5pbmZvKCdSZXN0b3JlZCBhbmFseXNpcyBkYXRhIGZyb20gYmFja2VuZCBtZW1vcnknKTtcbiAgICB9XG4gICAgaWYgKHN0YXR1c0RhdGEuY3VzdG9taXphdGlvbnMgIT09IHVuZGVmaW5lZCAmJiBzdGF0dXNEYXRhLmN1c3RvbWl6YXRpb25zICE9PSBudWxsKSB7XG4gICAgICBsb2cuaW5mbygnUmVzdG9yZWQgY3VzdG9taXphdGlvbnMgZGF0YSBmcm9tIGJhY2tlbmQgbWVtb3J5Jyk7XG4gICAgfVxuICAgIGlmIChzdGF0dXNEYXRhLmdlbmVyYXRlZF9maWxlcyAhPT0gdW5kZWZpbmVkICYmIHN0YXR1c0RhdGEuZ2VuZXJhdGVkX2ZpbGVzICE9PSBudWxsKSB7XG4gICAgICBsb2cuaW5mbygnUmVzdG9yZWQgQ1YgZGF0YSBmcm9tIGJhY2tlbmQgbWVtb3J5Jyk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGdlbmVyYXRpb25SZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9jdi9nZW5lcmF0aW9uLXN0YXRlJyk7XG4gICAgICBpZiAoZ2VuZXJhdGlvblJlcy5vaykge1xuICAgICAgICBjb25zdCBnZW5lcmF0aW9uRGF0YSA9IGF3YWl0IGdlbmVyYXRpb25SZXMuanNvbigpO1xuICAgICAgICBpZiAoZ2VuZXJhdGlvbkRhdGE/Lm9rKSB7XG4gICAgICAgICAgY29uc3QgaGFzQ2FjaGVkQXRzU2NvcmUgPSBCb29sZWFuKGdlbmVyYXRpb25EYXRhLmF0c19zY29yZSk7XG4gICAgICAgICAgY29uc3QgaGFzUGVyc2lzdGVkR2VuZXJhdGlvbkRhdGEgPSBCb29sZWFuKFxuICAgICAgICAgICAgZ2VuZXJhdGlvbkRhdGEucHJldmlld19hdmFpbGFibGVcbiAgICAgICAgICAgICAgfHwgZ2VuZXJhdGlvbkRhdGEuZmluYWxfZ2VuZXJhdGVkX2F0XG4gICAgICAgICAgICAgIHx8IGhhc0NhY2hlZEF0c1Njb3JlXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHN0YXRlTWFuYWdlci5zZXRHZW5lcmF0aW9uU3RhdGUoe1xuICAgICAgICAgICAgcGhhc2U6IGdlbmVyYXRpb25EYXRhLnBoYXNlIHx8ICdpZGxlJyxcbiAgICAgICAgICAgIHByZXZpZXdBdmFpbGFibGU6IEJvb2xlYW4oZ2VuZXJhdGlvbkRhdGEucHJldmlld19hdmFpbGFibGUpLFxuICAgICAgICAgICAgcHJldmlld091dHB1dHM6IGdlbmVyYXRpb25EYXRhLnByZXZpZXdfb3V0cHV0cyB8fCBudWxsLFxuICAgICAgICAgICAgbGF5b3V0Q29uZmlybWVkOiBCb29sZWFuKGdlbmVyYXRpb25EYXRhLmxheW91dF9jb25maXJtZWQpLFxuICAgICAgICAgICAgcGFnZUNvdW50RXN0aW1hdGU6IGdlbmVyYXRpb25EYXRhLnBhZ2VfY291bnRfZXN0aW1hdGUgPz8gbnVsbCxcbiAgICAgICAgICAgIHBhZ2VDb3VudEV4YWN0OiBnZW5lcmF0aW9uRGF0YS5wYWdlX2NvdW50X2V4YWN0ID8/IG51bGwsXG4gICAgICAgICAgICBwYWdlQ291bnRDb25maWRlbmNlOiBnZW5lcmF0aW9uRGF0YS5wYWdlX2NvdW50X2NvbmZpZGVuY2UgPz8gbnVsbCxcbiAgICAgICAgICAgIHBhZ2VDb3VudFNvdXJjZTogZ2VuZXJhdGlvbkRhdGEucGFnZV9jb3VudF9zb3VyY2UgfHwgbnVsbCxcbiAgICAgICAgICAgIHBhZ2VOZWVkc0V4YWN0UmVjaGVjazogQm9vbGVhbihcbiAgICAgICAgICAgICAgZ2VuZXJhdGlvbkRhdGEucGFnZV9jb3VudF9uZWVkc19leGFjdF9yZWNoZWNrLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHBhZ2VXYXJuaW5nOiBCb29sZWFuKGdlbmVyYXRpb25EYXRhLnBhZ2VfbGVuZ3RoX3dhcm5pbmcpLFxuICAgICAgICAgICAgbGF5b3V0SW5zdHJ1Y3Rpb25zQ291bnQ6IGdlbmVyYXRpb25EYXRhLmxheW91dF9pbnN0cnVjdGlvbnNfY291bnQgfHwgMCxcbiAgICAgICAgICAgIGZpbmFsR2VuZXJhdGVkQXQ6IGdlbmVyYXRpb25EYXRhLmZpbmFsX2dlbmVyYXRlZF9hdCB8fCBudWxsLFxuICAgICAgICAgICAgcHJldmlld0dlbmVyYXRlZEF0OiBnZW5lcmF0aW9uRGF0YS5wcmV2aWV3X2dlbmVyYXRlZF9hdCB8fCBudWxsLFxuICAgICAgICAgICAgcHJldmlld1JlcXVlc3RJZDogZ2VuZXJhdGlvbkRhdGEucHJldmlld19yZXF1ZXN0X2lkIHx8IG51bGwsXG4gICAgICAgICAgICBjb25maXJtZWRBdDogZ2VuZXJhdGlvbkRhdGEuY29uZmlybWVkX2F0IHx8IG51bGwsXG4gICAgICAgICAgICAvLyBPcHRpb25hbCBzZXJ2ZXItcHJvdmlkZWQgcmV2aXNpb24gbWV0YWRhdGEgKGlmIGJhY2tlbmQgZXhwb3NlcyB0aGVtKVxuICAgICAgICAgICAgY29udGVudFJldmlzaW9uOiAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHYgPSBnZW5lcmF0aW9uRGF0YS5jb250ZW50X3JldmlzaW9uID8/IGdlbmVyYXRpb25EYXRhLmNvbnRlbnRSZXZpc2lvbjtcbiAgICAgICAgICAgICAgcmV0dXJuICh2ID09PSB1bmRlZmluZWQgfHwgdiA9PT0gbnVsbCkgPyAwIDogKE51bWJlci5pc0Zpbml0ZShOdW1iZXIodikpID8gTnVtYmVyKHYpIDogMCk7XG4gICAgICAgICAgICB9KSgpLFxuICAgICAgICAgICAgbGFzdFByZXZpZXdDb250ZW50UmV2aXNpb246IGdlbmVyYXRpb25EYXRhLmxhc3RfcHJldmlld19jb250ZW50X3JldmlzaW9uID8/IGdlbmVyYXRpb25EYXRhLmxhc3RQcmV2aWV3Q29udGVudFJldmlzaW9uID8/IG51bGwsXG4gICAgICAgICAgICBsYXN0RmluYWxDb250ZW50UmV2aXNpb246IGdlbmVyYXRpb25EYXRhLmxhc3RfZmluYWxfY29udGVudF9yZXZpc2lvbiA/PyBnZW5lcmF0aW9uRGF0YS5sYXN0RmluYWxDb250ZW50UmV2aXNpb24gPz8gbnVsbCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmIChoYXNDYWNoZWRBdHNTY29yZSkge1xuICAgICAgICAgICAgc3RhdGVNYW5hZ2VyLnNldEF0c1Njb3JlKGdlbmVyYXRpb25EYXRhLmF0c19zY29yZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXRlTWFuYWdlci5jbGVhckF0c1Njb3JlKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGhhc1BlcnNpc3RlZEdlbmVyYXRpb25EYXRhKSB7XG4gICAgICAgICAgICBzZXJ2ZXJIYXNEYXRhID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChfZSkgeyAvKiBub24tZmF0YWwgKi8gfVxuXG4gICAgY29uc3QgcmVzdG9yZWRQaGFzZSA9IF9yZXNvbHZlUmVzdG9yZWRQaGFzZShzdGF0dXNEYXRhKTtcbiAgICBzdGF0ZU1hbmFnZXIuc2V0UGhhc2UocmVzdG9yZWRQaGFzZSk7XG4gICAgX3Jlc3RvcmVUYWJGb3JQaGFzZShyZXN0b3JlZFBoYXNlKTtcblxuICAgIC8vIEtlZXAgdGhlIHBvc2l0aW9uLXRpdGxlIGVsZW1lbnQgaW4gc3luYyB3aGVuZXZlciB3ZSByZXN0b3JlIHN0YXR1cyBkYXRhLlxuICAgIGlmICh0eXBlb2YgdXBkYXRlUG9zaXRpb25UaXRsZSA9PT0gJ2Z1bmN0aW9uJykgdXBkYXRlUG9zaXRpb25UaXRsZShzdGF0dXNEYXRhKTtcblxuICAgIGlmICh0eXBlb2YgdXBkYXRlSW5jbHVzaW9uQ291bnRzID09PSAnZnVuY3Rpb24nKSB1cGRhdGVJbmNsdXNpb25Db3VudHMoKTtcblxuICAgIGlmICghc3RhdHVzRGF0YS5wb3NpdGlvbl9uYW1lICYmICFzdGF0dXNEYXRhLmpvYl9hbmFseXNpcykge1xuICAgICAgY29uc3Qgc3RvcmVkUGF0aCAgICA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFN0b3JhZ2VLZXlzLlNFU1NJT05fUEFUSCk7XG4gICAgICBjb25zdCBzdG9yZWRTZXNzaW9uID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oU3RvcmFnZUtleXMuU0VTU0lPTl9JRCk7XG4gICAgICBjb25zdCBjdXJyZW50U2Vzc2lvbiA9IGdldFNlc3Npb25JZEZyb21VUkwgPyBnZXRTZXNzaW9uSWRGcm9tVVJMKCkgOiBudWxsO1xuICAgICAgLy8gT25seSBhdXRvLXJlc3RvcmUgZnJvbSBkaXNrIHdoZW4gcmVjb25uZWN0aW5nIHRvIHRoZSBTQU1FIHNlc3Npb25cbiAgICAgIC8vIChzdG9yZWRTZXNzaW9uIG1hdGNoZXMgdGhlIGN1cnJlbnQgVVJMIHNlc3Npb25faWQpLiAgQSBmcmVzaCBuZXcgc2Vzc2lvblxuICAgICAgLy8gd2lsbCBoYXZlIGEgZGlmZmVyZW50IElELCBzbyB0aGlzIGd1YXJkIHByZXZlbnRzIHRoZSBuZXcgc2Vzc2lvbiBmcm9tXG4gICAgICAvLyBzaWxlbnRseSBsb2FkaW5nIHRoZSBwcmV2aW91cyBzZXNzaW9uJ3MgZGF0YSBvZmYgZGlzay5cbiAgICAgIGlmIChzdG9yZWRQYXRoICYmIHN0b3JlZFNlc3Npb24gJiYgc3RvcmVkU2Vzc2lvbiA9PT0gY3VycmVudFNlc3Npb24pIHtcbiAgICAgICAgLy8gUGFzcyByZWRpcmVjdE9uTWlzbWF0Y2g6ZmFsc2Ugc28gdGhhdCBpZiB0aGUgZmlsZSBvbiBkaXNrIGJlbG9uZ3MgdG8gYVxuICAgICAgICAvLyBkaWZmZXJlbnQgc2Vzc2lvbiAoZS5nLiBTRVNTSU9OX1BBVEggd2FzIG5ldmVyIHVwZGF0ZWQgYWZ0ZXIgYSBuZXdcbiAgICAgICAgLy8gc2Vzc2lvbiB3YXMgY3JlYXRlZCksIHdlIHNpbGVudGx5IHNraXAgdGhlIHJlc3RvcmUgcmF0aGVyIHRoYW5cbiAgICAgICAgLy8gbmF2aWdhdGluZyB0aGUgYnJvd3NlciB0byBhIHNlc3Npb24gdGhlIHVzZXIgZGlkbid0IGFzayBmb3IuXG4gICAgICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IGxvYWRTZXNzaW9uRmlsZShzdG9yZWRQYXRoLCB7IHJlZGlyZWN0T25NaXNtYXRjaDogZmFsc2UgfSk7XG4gICAgICAgIGlmIChsb2FkZWQpIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzZXJ2ZXJIYXNEYXRhO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy53YXJuKCdGYWlsZWQgdG8gcmVzdG9yZSBiYWNrZW5kIHN0YXRlOicsIGVycm9yKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9hZFNlc3Npb25GaWxlKHBhdGgsIHsgcmVkaXJlY3RPbk1pc21hdGNoID0gdHJ1ZSB9ID0ge30pIHtcbiAgdHJ5IHtcbiAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnXHVEODNEXHVERDA0IFJlc3RvcmluZyBzZXNzaW9uIGZyb20gZmlsZS4uLicpO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL2xvYWQtc2Vzc2lvbicsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHBhdGggfSlcbiAgICB9KTtcbiAgICBpZiAoIXJlcy5vaykge1xuICAgICAgY29uc3QgZXJyID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsIGBcdTI3NEMgRmFpbGVkIHRvIHJlc3RvcmUgc2Vzc2lvbjogJHtlcnIuZXJyb3J9YCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuXG4gICAgaWYgKGRhdGEucmVkaXJlY3RfdXJsICYmIGdldFNlc3Npb25JZEZyb21VUkwoKSAhPT0gZGF0YS5zZXNzaW9uX2lkKSB7XG4gICAgICBpZiAoIXJlZGlyZWN0T25NaXNtYXRjaCkge1xuICAgICAgICAvLyBUaGUgZmlsZSBvbiBkaXNrIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgc2Vzc2lvbiB0aGFuIHRoZSBvbmUgaW4gdGhlXG4gICAgICAgIC8vIFVSTC4gIFNpbGVudGx5IGFib3J0IHJhdGhlciB0aGFuIHJlZGlyZWN0aW5nIHRoZSBicm93c2VyIFx1MjAxNCB0aGUgY2FsbGVyXG4gICAgICAgIC8vIChyZXN0b3JlQmFja2VuZFN0YXRlKSBvbmx5IHdhbnRzIHRvIHJlc3RvcmUgVEhJUyBzZXNzaW9uLCBub3QgbG9hZCBhXG4gICAgICAgIC8vIGRpZmZlcmVudCBvbmUuXG4gICAgICAgIGxvZy53YXJuKFxuICAgICAgICAgICdsb2FkU2Vzc2lvbkZpbGU6IHNlc3Npb25faWQgbWlzbWF0Y2ggKHVybD0lcywgZmlsZT0lcyk7IHNraXBwaW5nIHJlc3RvcmUnLFxuICAgICAgICAgIGdldFNlc3Npb25JZEZyb21VUkwoKSwgZGF0YS5zZXNzaW9uX2lkLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKGRhdGEucmVkaXJlY3RfdXJsKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFN0b3JhZ2VLZXlzLlNFU1NJT05fUEFUSCwgZGF0YS5zZXNzaW9uX2ZpbGUgfHwgcGF0aCk7XG5cbiAgICAvLyBSZXNldCBzZXNzaW9uLXNjb3BlZCBzdWdnZXN0aW9uIHN0YXRlXG4gICAgd2luZG93Ll9zdWdnZXN0ZWRBY2hzT3JkZXJlZCA9IG51bGw7XG5cbiAgICAvLyBSZWxvYWQgY29udmVyc2F0aW9uIGhpc3RvcnkgZnJvbSB0aGUgZnJlc2hseS1sb2FkZWQgYmFja2VuZFxuICAgIGNvbnN0IGhpc3RvcnlSZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9oaXN0b3J5Jyk7XG4gICAgaWYgKGhpc3RvcnlSZXMub2spIHtcbiAgICAgIGNvbnN0IGhpc3RvcnlEYXRhID0gYXdhaXQgaGlzdG9yeVJlcy5qc29uKCk7XG4gICAgICBjb25zdCBjb252ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbnZlcnNhdGlvbicpO1xuICAgICAgY29udi5pbm5lckhUTUwgPSAnJztcbiAgICAgIChoaXN0b3J5RGF0YS5oaXN0b3J5IHx8IFtdKS5mb3JFYWNoKG1zZyA9PiB7XG4gICAgICAgIGlmIChtc2cucm9sZSAhPT0gJ3N5c3RlbScpIGFwcGVuZE1lc3NhZ2UobXNnLnJvbGUsIG1zZy5jb250ZW50KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnXHUyNkEwIENvdWxkIG5vdCByZXN0b3JlIGNvbnZlcnNhdGlvbiBoaXN0b3J5LicpO1xuICAgIH1cblxuICAgIGF3YWl0IGZldGNoU3RhdHVzKCk7XG5cbiAgICAvLyBSdW4gYSBiYWNrZ3JvdW5kIGhlYWx0aCBjaGVjayBzbyB0aGUgc3RhdHVzIHBpbGwgcmVmbGVjdHMgbGl2ZSBjb25uZWN0aXZpdHkuXG4gICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzLnRlc3RDdXJyZW50TW9kZWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGdsb2JhbFRoaXMudGVzdEN1cnJlbnRNb2RlbCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICB9XG5cbiAgICAvLyBSZWh5ZHJhdGUgdGFiRGF0YSBhbmQgc3dpdGNoIHRvIHRoZSBjb3JyZWN0IHRhYiBmb3IgdGhlIHJlc3RvcmVkIHBoYXNlXG4gICAgY29uc3Qgc2Vzc2lvblBoYXNlID0gZGF0YS5waGFzZSB8fCBQSEFTRVMuSU5JVDtcbiAgICBjb25zdCBwaGFzZVRhYk1hcCA9IHtcbiAgICAgIFtQSEFTRVMuSU5JVF06ICAgICAgICAgICAgICdqb2InLFxuICAgICAgW1BIQVNFUy5KT0JfQU5BTFlTSVNdOiAgICAgJ2FuYWx5c2lzJyxcbiAgICAgIFtQSEFTRVMuQ1VTVE9NSVpBVElPTl06ICAgICdleHAtcmV2aWV3JyxcbiAgICAgIFtQSEFTRVMuUkVXUklURV9SRVZJRVddOiAgICdyZXdyaXRlJyxcbiAgICAgIFtQSEFTRVMuU1BFTExfQ0hFQ0tdOiAgICAgICdzcGVsbCcsXG4gICAgICBbUEhBU0VTLkdFTkVSQVRJT05dOiAgICAgICAnbGF5b3V0JyxcbiAgICAgIFtQSEFTRVMuTEFZT1VUX1JFVklFV106ICAgICdsYXlvdXQnLFxuICAgICAgW1BIQVNFUy5GSU5BTF9HRU5FUkFUSU9OXTogJ2ZpbmFsX2dlbmVyYXRlJyxcbiAgICAgIFtQSEFTRVMuUkVGSU5FTUVOVF06ICAgICAgICdkb3dubG9hZCcsXG4gICAgfTtcbiAgICBjb25zdCB0YXJnZXRUYWIgPSBwaGFzZVRhYk1hcFtzZXNzaW9uUGhhc2VdIHx8ICdqb2InO1xuXG4gICAgY29uc3QgY3VzdG9taXphdGlvblBoYXNlcyA9IFtcbiAgICAgIFBIQVNFUy5DVVNUT01JWkFUSU9OLCBQSEFTRVMuUkVXUklURV9SRVZJRVcsIFBIQVNFUy5TUEVMTF9DSEVDSyxcbiAgICAgIFBIQVNFUy5HRU5FUkFUSU9OLCBQSEFTRVMuTEFZT1VUX1JFVklFVywgUEhBU0VTLkZJTkFMX0dFTkVSQVRJT04sIFBIQVNFUy5SRUZJTkVNRU5ULFxuICAgIF07XG4gICAgaWYgKGN1c3RvbWl6YXRpb25QaGFzZXMuaW5jbHVkZXMoc2Vzc2lvblBoYXNlKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgczIgPSBhd2FpdCBmZXRjaCgnL2FwaS9zdGF0dXMnKTtcbiAgICAgICAgY29uc3Qgc2QgPSBwYXJzZVN0YXR1c1Jlc3BvbnNlKGF3YWl0IHMyLmpzb24oKSk7XG4gICAgICAgIF9oeWRyYXRlU3RhdHVzRGVyaXZlZFN0YXRlKHNkKTtcbiAgICAgICAgX2h5ZHJhdGVTdGF0dXNUYWJTdGF0ZShzZCk7XG4gICAgICB9IGNhdGNoIChfKSB7IC8qIG5vbi1mYXRhbCAqLyB9XG4gICAgfVxuXG4gICAgLy8gRm9yIHJld3JpdGVfcmV2aWV3IHBoYXNlLCBwcmUtcG9wdWxhdGUgdGhlIHJld3JpdGUgcGFuZWwgY2FjaGVcbiAgICBpZiAoc2Vzc2lvblBoYXNlID09PSBQSEFTRVMuUkVXUklURV9SRVZJRVcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJyID0gYXdhaXQgZmV0Y2goJy9hcGkvcmV3cml0ZXMnKTtcbiAgICAgICAgaWYgKHJyLm9rKSB7XG4gICAgICAgICAgY29uc3QgcmQgPSBwYXJzZVJld3JpdGVzUmVzcG9uc2UoYXdhaXQgcnIuanNvbigpKTtcbiAgICAgICAgICBjb25zdCByZXdyaXRlcyA9IHJkLnJld3JpdGVzIHx8IFtdO1xuICAgICAgICAgIGNvbnN0IHdhcm5pbmdzID0gcmQucGVyc3Vhc2lvbl93YXJuaW5ncyB8fCBbXTtcbiAgICAgICAgICByZXdyaXRlRGVjaXNpb25zID0ge307XG4gICAgICAgICAgcmVuZGVyUmV3cml0ZVBhbmVsKHJld3JpdGVzLCB3YXJuaW5ncyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKF8pIHsgLyogbm9uLWZhdGFsICovIH1cbiAgICB9XG5cbiAgICBzd2l0Y2hUYWIodGFyZ2V0VGFiKTtcbiAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCBgXHUyNzA1IFNlc3Npb24gcmVzdG9yZWQ6ICR7ZGF0YS5wb3NpdGlvbl9uYW1lIHx8ICdVbm5hbWVkJ30gKCR7U0VTU0lPTl9QSEFTRV9MQUJFTFNbZGF0YS5waGFzZV0gfHwgU3RyaW5nKGRhdGEucGhhc2UgfHwgUEhBU0VTLklOSVQpLnJlcGxhY2UoL18vZywgJyAnKX0pYCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsIGBcdTI3NEMgRXJyb3IgcmVzdG9yaW5nIHNlc3Npb246ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUmVuYW1lIC8gdGFiIGRhdGEgcGVyc2lzdGVuY2Vcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5hc3luYyBmdW5jdGlvbiBwcm9tcHRSZW5hbWVDdXJyZW50U2Vzc2lvbigpIHtcbiAgY29uc3QgdGl0bGVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwb3NpdGlvbi10aXRsZScpO1xuICBjb25zdCByZW5hbWVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVuYW1lLXNlc3Npb24tYnRuJyk7XG4gIGNvbnN0IGN1cnJlbnQgPSAodGl0bGVFbD8udGV4dENvbnRlbnQgfHwgJycpLnRyaW0oKTtcblxuICAvLyBCdWlsZCBpbmxpbmUgaW5wdXQgd2lkZ2V0IHNvIHdlIG5ldmVyIGNhbGwgd2luZG93LnByb21wdCgpXG4gIGNvbnN0IHdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gIHdyYXBwZXIuc3R5bGUuY3NzVGV4dCA9ICdkaXNwbGF5OmlubGluZS1mbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6NHB4Oyc7XG4gIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgaW5wdXQudHlwZSA9ICd0ZXh0JztcbiAgaW5wdXQudmFsdWUgPSBjdXJyZW50O1xuICBpbnB1dC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnTmV3IHNlc3Npb24gbmFtZScpO1xuICBpbnB1dC5zdHlsZS5jc3NUZXh0ID0gJ2ZvbnQtc2l6ZTppbmhlcml0O3BhZGRpbmc6MXB4IDRweDtib3JkZXI6MXB4IHNvbGlkICM5NGEzYjg7Ym9yZGVyLXJhZGl1czozcHg7d2lkdGg6MjIwcHg7JztcbiAgY29uc3Qgb2tCdG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgb2tCdG4udGV4dENvbnRlbnQgPSAnXHUyNzEzJztcbiAgb2tCdG4udGl0bGUgPSAnU2F2ZSByZW5hbWUnO1xuICBva0J0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnU2F2ZSByZW5hbWUnKTtcbiAgb2tCdG4uc3R5bGUuY3NzVGV4dCA9ICdiYWNrZ3JvdW5kOiMxMGI5ODE7Y29sb3I6I2ZmZjtib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjNweDtjdXJzb3I6cG9pbnRlcjtwYWRkaW5nOjFweCA2cHg7Zm9udC1zaXplOjFlbTsnO1xuICBjb25zdCBjYW5jZWxCdG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgY2FuY2VsQnRuLnRleHRDb250ZW50ID0gJ1x1MjcxNSc7XG4gIGNhbmNlbEJ0bi50aXRsZSA9ICdDYW5jZWwgcmVuYW1lJztcbiAgY2FuY2VsQnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsICdDYW5jZWwgcmVuYW1lJyk7XG4gIGNhbmNlbEJ0bi5zdHlsZS5jc3NUZXh0ID0gJ2JhY2tncm91bmQ6IzZiNzI4MDtjb2xvcjojZmZmO2JvcmRlcjpub25lO2JvcmRlci1yYWRpdXM6M3B4O2N1cnNvcjpwb2ludGVyO3BhZGRpbmc6MXB4IDZweDtmb250LXNpemU6MWVtOyc7XG4gIHdyYXBwZXIuYXBwZW5kKGlucHV0LCBva0J0biwgY2FuY2VsQnRuKTtcblxuICBpZiAodGl0bGVFbCkgdGl0bGVFbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBpZiAocmVuYW1lQnRuKSByZW5hbWVCdG4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgdGl0bGVFbD8ucGFyZW50RWxlbWVudD8uaW5zZXJ0QmVmb3JlKHdyYXBwZXIsIHRpdGxlRWwpO1xuICBpbnB1dC5mb2N1cygpO1xuICBpbnB1dC5zZWxlY3QoKTtcblxuICBhc3luYyBmdW5jdGlvbiBkb1JlbmFtZSgpIHtcbiAgICBjb25zdCBuZXdOYW1lID0gaW5wdXQudmFsdWUudHJpbSgpO1xuICAgIGNsZWFudXAoKTtcbiAgICBpZiAoIW5ld05hbWUgfHwgbmV3TmFtZSA9PT0gY3VycmVudCkgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvcmVuYW1lLWN1cnJlbnQtc2Vzc2lvbicsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IG5ld19uYW1lOiBuZXdOYW1lIH0pLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLm9rKSBhd2FpdCBmZXRjaFN0YXR1cygpO1xuICAgICAgZWxzZSBpZiAodHlwZW9mIHNob3dUb2FzdCA9PT0gJ2Z1bmN0aW9uJykgc2hvd1RvYXN0KGBSZW5hbWUgZmFpbGVkOiAke2RhdGEuZXJyb3J9YCwgJ2Vycm9yJyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHNob3dUb2FzdChgUmVuYW1lIGVycm9yOiAke2UubWVzc2FnZX1gLCAnZXJyb3InKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgIHdyYXBwZXIucmVtb3ZlKCk7XG4gICAgaWYgKHRpdGxlRWwpIHRpdGxlRWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgIGlmIChyZW5hbWVCdG4pIHJlbmFtZUJ0bi5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gIH1cblxuICBva0J0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGRvUmVuYW1lKTtcbiAgY2FuY2VsQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xlYW51cCk7XG4gIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBlID0+IHtcbiAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicpIGRvUmVuYW1lKCk7XG4gICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgY2xlYW51cCgpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gc2F2ZVRhYkRhdGEoKSB7XG4gIHRyeSB7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oZ2V0U2NvcGVkVGFiRGF0YVN0b3JhZ2VLZXkoc3RhdGVNYW5hZ2VyLmdldFNlc3Npb25JZCgpKSwgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgdGFiRGF0YTogc3RhdGVNYW5hZ2VyLmdldEFsbFRhYkRhdGEoKSxcbiAgICAgIGN1cnJlbnRUYWI6IHN0YXRlTWFuYWdlci5nZXRDdXJyZW50VGFiKCksXG4gICAgICBwZW5kaW5nUmVjb21tZW5kYXRpb25zOiB3aW5kb3cucGVuZGluZ1JlY29tbWVuZGF0aW9ucyB8fCBudWxsLFxuICAgICAgaW50ZXJhY3RpdmVTdGF0ZTogc3RhdGVNYW5hZ2VyLmdldEludGVyYWN0aXZlU3RhdGUoKSxcbiAgICAgIGFjdGl2ZVJldmlld1BhbmU6IHdpbmRvdy5fYWN0aXZlUmV2aWV3UGFuZSB8fCAnZXhwZXJpZW5jZXMnLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpXG4gICAgfSkpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy53YXJuKCdGYWlsZWQgdG8gc2F2ZSB0YWIgZGF0YTonLCBlcnJvcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzdG9yZVRhYkRhdGEoeyB1aVByZWZzT25seSA9IGZhbHNlIH0gPSB7fSkge1xuICB0cnkge1xuICAgIGNvbnN0IHNhdmVkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oZ2V0U2NvcGVkVGFiRGF0YVN0b3JhZ2VLZXkoc3RhdGVNYW5hZ2VyLmdldFNlc3Npb25JZCgpKSk7XG4gICAgaWYgKHNhdmVkKSB7XG4gICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShzYXZlZCk7XG5cbiAgICAgIGNvbnN0IGFnZSA9IERhdGUubm93KCkgLSAoZGF0YS50aW1lc3RhbXAgfHwgMCk7XG4gICAgICBpZiAoYWdlIDwgMjQgKiA2MCAqIDYwICogMTAwMCkge1xuICAgICAgICBpZiAoIXVpUHJlZnNPbmx5KSB7XG4gICAgICAgICAgaWYgKGRhdGEudGFiRGF0YSkge1xuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoZGF0YS50YWJEYXRhKS5mb3JFYWNoKChbdGFiLCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgICAgc3RhdGVNYW5hZ2VyLnNldFRhYkRhdGEodGFiLCB2YWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGRhdGEucGVuZGluZ1JlY29tbWVuZGF0aW9ucykge1xuICAgICAgICAgICAgd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnMgPSBkYXRhLnBlbmRpbmdSZWNvbW1lbmRhdGlvbnM7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChkYXRhLmludGVyYWN0aXZlU3RhdGUpIHtcbiAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zZXRJbnRlcmFjdGl2ZVN0YXRlKGRhdGEuaW50ZXJhY3RpdmVTdGF0ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhLmFjdGl2ZVJldmlld1BhbmUpIHtcbiAgICAgICAgICB3aW5kb3cuX2FjdGl2ZVJldmlld1BhbmUgPSBkYXRhLmFjdGl2ZVJldmlld1BhbmU7XG4gICAgICAgIH1cblxuICAgICAgICBsb2cuaW5mbyhgUmVzdG9yZWQgdGFiIGRhdGEgZnJvbSBsb2NhbFN0b3JhZ2UgKHVpUHJlZnNPbmx5PSR7dWlQcmVmc09ubHl9KWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oZ2V0U2NvcGVkVGFiRGF0YVN0b3JhZ2VLZXkoc3RhdGVNYW5hZ2VyLmdldFNlc3Npb25JZCgpKSk7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy53YXJuKCdGYWlsZWQgdG8gcmVzdG9yZSB0YWIgZGF0YTonLCBlcnJvcik7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIEVTIG1vZHVsZSBleHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuZXhwb3J0IHtcbiAgZm9ybWF0U2Vzc2lvblBoYXNlTGFiZWwsXG4gIF9nZXRDdXJyZW50U2Vzc2lvbklkVmFsdWUsXG4gIF9nZXRDdXJyZW50T3duZXJUb2tlblZhbHVlLFxuICBidWlsZFNlc3Npb25Td2l0Y2hlckxhYmVsLFxuICBnZXRBY3RpdmVTZXNzaW9uT3duZXJzaGlwTWV0YSxcbiAgZm9ybWF0U2Vzc2lvblRpbWVzdGFtcCxcbiAgY3JlYXRlTmV3U2Vzc2lvbkFuZE5hdmlnYXRlLFxuICBjcmVhdGVOZXdTZXNzaW9uSW5OZXdUYWIsXG4gIG9uYm9hcmRpbmdDcmVhdGVFbXB0eVByb2ZpbGUsXG4gIHNob3dPbmJvYXJkaW5nTW9kYWwsXG4gIG1heWJlU2hvd1dlbGNvbWVNb2RhbCxcbiAgc2hvd1dlbGNvbWVNb2RhbCxcbiAgY2xvc2VXZWxjb21lTW9kYWwsXG4gIF9jbGFpbUN1cnJlbnRTZXNzaW9uLFxuICBfcmVzb2x2ZVJlc3RvcmVkUGhhc2UsXG4gIHNob3dTZXNzaW9uc0xhbmRpbmdQYW5lbCxcbiAgZW5zdXJlU2Vzc2lvbkNvbnRleHQsXG4gIHJlc3RvcmVTZXNzaW9uLFxuICByZXN0b3JlQmFja2VuZFN0YXRlLFxuICBsb2FkU2Vzc2lvbkZpbGUsXG4gIHByb21wdFJlbmFtZUN1cnJlbnRTZXNzaW9uLFxuICBzYXZlVGFiRGF0YSxcbiAgcmVzdG9yZVRhYkRhdGEsXG59O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvam9iLWlucHV0LmpzXG4gKiBKb2IgZGVzY3JpcHRpb24gaW5wdXQgcGFuZWw6IHBhc3RlLCBVUkwgZmV0Y2gsIGZpbGUgdXBsb2FkLCBsb2FkLWl0ZW1zIHRhYmxlLlxuICpcbiAqIERFUEVOREVOQ0lFUyAoYWxsIG9uIGdsb2JhbFRoaXMgYXQgcnVudGltZSk6XG4gKiAgIC0gbWFya2VkLCBkb21wdXJpZnkgKG5wbSBcdTIwMTQgYnVuZGxlZDsgdXNlZCBpbnRlcm5hbGx5IGZvciBzYWZlIG1hcmtkb3duIHJlbmRlcmluZylcbiAqICAgLSBlc2NhcGVIdG1sICh1dGlscy5qcylcbiAqICAgLSBhcHBlbmRNZXNzYWdlLCBhcHBlbmRSZXRyeU1lc3NhZ2UgKG1lc3NhZ2UtcXVldWUuanMpXG4gKiAgIC0gc2V0TG9hZGluZyAoZmV0Y2gtdXRpbHMuanMpXG4gKiAgIC0gc2F2ZVRhYkRhdGEgKHNlc3Npb24tbWFuYWdlci5qcylcbiAqICAgLSBzd2l0Y2hUYWIgKHJldmlldy10YWJsZS1iYXNlLmpzLCBUaWVyIDQpXG4gKiAgIC0gYW5hbHl6ZUpvYiAoam9iLWFuYWx5c2lzLmpzKVxuICogICAtIGZldGNoU3RhdHVzIChhcGktY2xpZW50LmpzKVxuICogICAtIHNob3dBbGVydE1vZGFsICh1aS1oZWxwZXJzLmpzKVxuICogICAtIHN0YXRlTWFuYWdlciAoc3RhdGUtbWFuYWdlci5qcyBcdTIwMTQgZ2V0Q3VycmVudFRhYigpL3NldFRhYkRhdGEoKSlcbiAqICAgLSBQSEFTRVMgKHdpbmRvdyBnbG9iYWwpXG4gKlxuICogR0FQLTIzIGludGFrZSBjb25maXJtYXRpb246XG4gKiAgIEFsbCBqb2ItdGV4dCBzdWJtaXNzaW9ucyAocGFzdGUsIFVSTCwgZmlsZSkgcm91dGUgZGlyZWN0bHkgdG8gYW5hbHl6ZUpvYigpXG4gKiAgIHNvIGV2ZXJ5IHNvdXJjZSBmb2xsb3dzIHRoZSBzYW1lIHBvc3QtYW5hbHlzaXMgaW50YWtlIHBhdGguXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdqb2ItaW5wdXQnKTtcblxuaW1wb3J0IHsgUEhBU0VTLCBzdGF0ZU1hbmFnZXIgfSBmcm9tICcuL3N0YXRlLW1hbmFnZXIuanMnO1xuaW1wb3J0IHsgbWFya2VkIH0gZnJvbSAnbWFya2VkJztcbmltcG9ydCBET01QdXJpZnkgZnJvbSAnZG9tcHVyaWZ5JztcblxuLy8gUmVuZGVyIGpvYiBkZXNjcmlwdGlvbiB0ZXh0IHNhZmVseTogbWFya2VkIHBhcnNlcyBHRk0gKGluY2x1ZGluZyBlbWJlZGRlZCBIVE1MXG4vLyBhbmQgYXV0b2xpbmtzKSwgRE9NUHVyaWZ5IHNhbml0aXplcyB0aGUgb3V0cHV0IGJlZm9yZSB3cml0aW5nIHRvIGlubmVySFRNTC5cbi8vIEZPUkJJRF9BVFRSOiBbJ3N0eWxlJ10gc3RyaXBzIGlubGluZSBDU1MgZnJvbSBIVE1MIGVtYmVkZGVkIGluIHRoZSBqb2IgdGV4dFxuLy8gKGUuZy4gV29yZC1zdHlsZSBmb250LXNpemUvZm9udC1mYW1pbHkgZnJvbSBKU09OLUxEIGRlc2NyaXB0aW9uIGZpZWxkcyksXG4vLyBzbyB0aGUgcGFnZSdzIG93biBzdHlsZXNoZWV0IGNvbnRyb2xzIGZvbnQgcmVuZGVyaW5nIGNvbnNpc3RlbnRseS5cbmZ1bmN0aW9uIF9yZW5kZXJKb2JUZXh0KHRleHQpIHtcbiAgY29uc3QgcmF3ID0gbWFya2VkLnBhcnNlKHRleHQsIHsgZ2ZtOiB0cnVlLCBicmVha3M6IHRydWUgfSk7XG4gIHJldHVybiBET01QdXJpZnkuc2FuaXRpemUocmF3LCB7IEZPUkJJRF9BVFRSOiBbJ3N0eWxlJ10gfSk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gSm9iIHRhYiBkaXNwbGF5XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuYXN5bmMgZnVuY3Rpb24gcG9wdWxhdGVKb2JUYWIoKSB7XG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9jdW1lbnQtY29udGVudCcpO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3N0YXR1cycpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuXG4gICAgaWYgKGRhdGEuam9iX2Rlc2NyaXB0aW9uX3RleHQpIHtcbiAgICAgIGNvbnN0IGpvYlRleHQgPSBkYXRhLmpvYl9kZXNjcmlwdGlvbl90ZXh0O1xuICAgICAgY29uc3QgcG9zaXRpb25OYW1lID0gZGF0YS5wb3NpdGlvbl9uYW1lIHx8IG51bGw7XG4gICAgICBjb25zdCBqb2JVcmwgPSBkYXRhLmpvYl91cmwgfHwgbnVsbDtcbiAgICAgIGNvbnN0IHRpdGxlVGV4dCA9IHBvc2l0aW9uTmFtZVxuICAgICAgICA/IGVzY2FwZUh0bWwocG9zaXRpb25OYW1lKVxuICAgICAgICA6ICc8ZW0gc3R5bGU9XCJjb2xvcjojOWNhM2FmO1wiPlBvc2l0aW9uIHRpdGxlIG5vdCB5ZXQgZXh0cmFjdGVkXHUyMDI2PC9lbT4nO1xuICAgICAgY29uc3QgdGl0bGVDb250ZW50ID0gKHBvc2l0aW9uTmFtZSAmJiBqb2JVcmwpXG4gICAgICAgID8gYDxhIGhyZWY9XCIke2VzY2FwZUh0bWwoam9iVXJsKX1cIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCIgc3R5bGU9XCJjb2xvcjppbmhlcml0O3RleHQtZGVjb3JhdGlvbjpub25lO1wiPiR7dGl0bGVUZXh0fTwvYT5gXG4gICAgICAgIDogdGl0bGVUZXh0O1xuICAgICAgbGV0IGh0bWwgPSAnPGgxPicgKyB0aXRsZUNvbnRlbnQgKyAnPC9oMT4nO1xuICAgICAgaWYgKGpvYlVybCkge1xuICAgICAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwibWF4LXdpZHRoOjEwMCU7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7d2hpdGUtc3BhY2U6bm93cmFwO2NvbG9yOiM2NDc0OGI7Zm9udC1zaXplOjAuODVlbTttYXJnaW46LThweCAwIDhweCAwO1wiIHRpdGxlPVwiJHtlc2NhcGVIdG1sKGpvYlVybCl9XCI+PGEgaHJlZj1cIiR7ZXNjYXBlSHRtbChqb2JVcmwpfVwiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIiBzdHlsZT1cImNvbG9yOiMzYjgyZjY7dGV4dC1kZWNvcmF0aW9uOm5vbmU7XCI+JHtlc2NhcGVIdG1sKGpvYlVybCl9PC9hPjwvZGl2PmA7XG4gICAgICB9XG5cbiAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJsaW5lLWhlaWdodDogMS42OyBiYWNrZ3JvdW5kOiAjZjhmOWZhOyBwYWRkaW5nOiAyMHB4OyBib3JkZXItcmFkaXVzOiA4cHg7IG1hcmdpbjogMjBweCAwO1wiPicgKyBfcmVuZGVySm9iVGV4dChqb2JUZXh0KSArICc8L2Rpdj4nO1xuXG4gICAgICBjb25zdCBhbmFseXplQnRuID0gZGF0YS5waGFzZSA9PT0gUEhBU0VTLklOSVRcbiAgICAgICAgPyAnPGJ1dHRvbiBvbmNsaWNrPVwiYW5hbHl6ZUpvYigpXCIgY2xhc3M9XCJidG4tcHJpbWFyeVwiIHN0eWxlPVwibWFyZ2luLXJpZ2h0OjhweDtcIj5cdUQ4M0RcdUREMEQgQW5hbHlzZSBKb2I8L2J1dHRvbj4nXG4gICAgICAgIDogJyc7XG4gICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDoyMHB4O1wiPicgKyBhbmFseXplQnRuICsgJzxidXR0b24gb25jbGljaz1cInNob3dMb2FkSm9iUGFuZWwoKVwiIGNsYXNzPVwiYnRuLXNlY29uZGFyeVwiPlx1RDgzRFx1RENFNSBMb2FkIERpZmZlcmVudCBKb2I8L2J1dHRvbj48L2Rpdj4nO1xuICAgICAgY29udGVudC5pbm5lckhUTUwgPSBodG1sO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBzaG93TG9hZEpvYlBhbmVsKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy5lcnJvcignRXJyb3IgbG9hZGluZyBqb2IgZGVzY3JpcHRpb246JywgZXJyb3IpO1xuICAgIGF3YWl0IHNob3dMb2FkSm9iUGFuZWwoKTtcbiAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIExvYWQtam9iIHBhbmVsIChzZXNzaW9ucyArIHNlcnZlciBmaWxlcyB0YWJsZSArIGlucHV0IG1ldGhvZHMpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuYXN5bmMgZnVuY3Rpb24gc2hvd0xvYWRKb2JQYW5lbCgpIHtcbiAgaWYgKHN0YXRlTWFuYWdlci5nZXRDdXJyZW50VGFiKCkgIT09ICdqb2InKSB7XG4gICAgc3dpdGNoVGFiKCdqb2InKTtcbiAgfVxuXG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9jdW1lbnQtY29udGVudCcpO1xuICBjb250ZW50LmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwiZW1wdHktc3RhdGVcIj48ZGl2IGNsYXNzPVwibG9hZGluZy1zcGlubmVyXCI+PC9kaXY+PHAgc3R5bGU9XCJtYXJnaW4tdG9wOjEycHg7Y29sb3I6IzY0NzQ4YjtcIj5Mb2FkaW5nXHUyMDI2PC9wPjwvZGl2Pic7XG5cbiAgY29udGVudC5pbm5lckhUTUwgPSBgXG4gICAgPGRpdiBzdHlsZT1cIm1heC13aWR0aDo4MjBweDttYXJnaW46MCBhdXRvO3BhZGRpbmc6MjRweDtcIj5cbiAgICAgIDxoMSBzdHlsZT1cImZvbnQtc2l6ZToyMnB4O2ZvbnQtd2VpZ2h0OjcwMDtjb2xvcjojMWUyOTNiO21hcmdpbi1ib3R0b206NnB4O1wiPlx1RDgzRFx1RENFNSBBZGQgSm9iIERlc2NyaXB0aW9uPC9oMT5cblxuICAgICAgPGRpdiBzdHlsZT1cImJvcmRlcjoxcHggc29saWQgI2UyZThmMDtib3JkZXItcmFkaXVzOjhweDtvdmVyZmxvdzp2aXNpYmxlO1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZjhmYWZjO3BhZGRpbmc6MTBweCAxNnB4O2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNlMmU4ZjA7Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxM3B4O2NvbG9yOiM0NzU1Njk7XCI+QWRkIE5ldyBKb2IgRGVzY3JpcHRpb248L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6MjBweDtcIj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1tZXRob2QtdGFic1wiIHN0eWxlPVwibWFyZ2luLXRvcDowO1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImlucHV0LXRhYiBhY3RpdmVcIiBvbmNsaWNrPVwic3dpdGNoSW5wdXRNZXRob2QoJ3Bhc3RlJylcIj5cdUQ4M0RcdURDREQgUGFzdGUgVGV4dDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImlucHV0LXRhYlwiIG9uY2xpY2s9XCJzd2l0Y2hJbnB1dE1ldGhvZCgndXJsJylcIj5cdUQ4M0RcdUREMTcgRnJvbSBVUkw8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpbnB1dC10YWJcIiBvbmNsaWNrPVwic3dpdGNoSW5wdXRNZXRob2QoJ2ZpbGUnKVwiPlx1RDgzRFx1RENDMSBVcGxvYWQgRmlsZTwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LW1ldGhvZCBhY3RpdmVcIiBpZD1cInBhc3RlLW1ldGhvZFwiPlxuICAgICAgICAgICAgPHRleHRhcmVhIGlkPVwiam9iLXRleHQtaW5wdXRcIiBwbGFjZWhvbGRlcj1cIlBhc3RlIHRoZSBqb2IgZGVzY3JpcHRpb24gaGVyZVx1MjAyNlwiIHJvd3M9XCIxMlwiXG4gICAgICAgICAgICAgIGFyaWEtcmVxdWlyZWQ9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgYXJpYS1kZXNjcmliZWRieT1cInBhc3RlLWNoYXItY291bnQgcGFzdGUtZXJyb3JcIlxuICAgICAgICAgICAgICBvbmJsdXI9XCJfdmFsaWRhdGVQYXN0ZUZpZWxkKClcIiBvbmlucHV0PVwiX3VwZGF0ZVBhc3RlQ2hhckNvdW50KClcIlxuICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXNpemU6MTRweDtwYWRkaW5nOjEycHg7Ym9yZGVyOjFweCBzb2xpZCAjZDFkNWRiO2JvcmRlci1yYWRpdXM6NnB4O3Jlc2l6ZTp2ZXJ0aWNhbDttYXJnaW4tdG9wOjhweDtcIj48L3RleHRhcmVhPlxuICAgICAgICAgICAgPGRpdiBpZD1cInBhc3RlLWNoYXItY291bnRcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIlxuICAgICAgICAgICAgICBzdHlsZT1cImZvbnQtc2l6ZToxMnB4O2NvbG9yOiM5NGEzYjg7bWFyZ2luLXRvcDo0cHg7bWluLWhlaWdodDoxOHB4O1wiPjwvZGl2PlxuICAgICAgICAgICAgPHNwYW4gaWQ9XCJwYXN0ZS1lcnJvclwiIGNsYXNzPVwiZmllbGQtZXJyb3JcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIj48L3NwYW4+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDoxMHB4O2Rpc3BsYXk6ZmxleDtnYXA6MTJweDtcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPVwic3VibWl0Sm9iVGV4dCgpXCIgY2xhc3M9XCJidG4tcHJpbWFyeVwiPlN1Ym1pdCBKb2IgRGVzY3JpcHRpb248L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPVwiY2xlYXJKb2JJbnB1dCgpXCIgY2xhc3M9XCJidG4tc2Vjb25kYXJ5XCI+Q2xlYXI8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LW1ldGhvZFwiIGlkPVwidXJsLW1ldGhvZFwiPlxuICAgICAgICAgICAgPHAgc3R5bGU9XCJtYXJnaW46OHB4IDAgMTBweDtcIj5FbnRlciBhIFVSTCB0byBhdXRvbWF0aWNhbGx5IGV4dHJhY3QgdGhlIGpvYiBkZXNjcmlwdGlvbjo8L3A+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInVybFwiIGlkPVwiam9iLXVybC1pbnB1dFwiIHBsYWNlaG9sZGVyPVwiaHR0cHM6Ly9jb21wYW55LmNvbS9qb2ItcG9zdGluZ1wiXG4gICAgICAgICAgICAgIGFyaWEtcmVxdWlyZWQ9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgYXJpYS1kZXNjcmliZWRieT1cInVybC1lcnJvclwiXG4gICAgICAgICAgICAgIG9uYmx1cj1cIl92YWxpZGF0ZVVSTEZpZWxkKClcIlxuICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7cGFkZGluZzoxMnB4O2JvcmRlcjoxcHggc29saWQgI2QxZDVkYjtib3JkZXItcmFkaXVzOjZweDtcIiAvPlxuICAgICAgICAgICAgPHNwYW4gaWQ9XCJ1cmwtZXJyb3JcIiBjbGFzcz1cImZpZWxkLWVycm9yXCIgYXJpYS1saXZlPVwicG9saXRlXCI+PC9zcGFuPlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6MTBweDtkaXNwbGF5OmZsZXg7Z2FwOjEycHg7XCI+XG4gICAgICAgICAgICAgIDxidXR0b24gb25jbGljaz1cImZldGNoSm9iRnJvbVVSTCgpXCIgY2xhc3M9XCJidG4tcHJpbWFyeVwiPkZldGNoIEpvYiBEZXNjcmlwdGlvbjwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uIG9uY2xpY2s9XCJjbGVhclVSTElucHV0KClcIiBjbGFzcz1cImJ0bi1zZWNvbmRhcnlcIj5DbGVhcjwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDoxNHB4O2Rpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6MWZyIDFmcjtnYXA6MTBweDtmb250LXNpemU6MTNweDtcIj5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2YwZjlmZjtib3JkZXI6MXB4IHNvbGlkICMwZWE1ZTk7Ym9yZGVyLXJhZGl1czo2cHg7cGFkZGluZzoxMHB4O1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDo2MDA7Y29sb3I6IzAzNjlhMTttYXJnaW4tYm90dG9tOjRweDtcIj5cdTI3MDUgV29ya3Mgd2VsbCB3aXRoOjwvZGl2PlxuICAgICAgICAgICAgICAgIDx1bCBzdHlsZT1cIm1hcmdpbjowO3BhZGRpbmctbGVmdDoxNnB4O2NvbG9yOiMwMzY5YTE7bGluZS1oZWlnaHQ6MS43O1wiPjxsaT5Db21wYW55IGNhcmVlciBwYWdlczwvbGk+PGxpPkFuZ2VsTGlzdCwgUmVtb3RlT0s8L2xpPjxsaT5Hb3Zlcm5tZW50ICZhbXA7IHVuaXZlcnNpdHkgc2l0ZXM8L2xpPjwvdWw+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZmVmM2M3O2JvcmRlcjoxcHggc29saWQgI2Y1OWUwYjtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjEwcHg7XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtd2VpZ2h0OjYwMDtjb2xvcjojOTI0MDBlO21hcmdpbi1ib3R0b206NHB4O1wiPlx1MjZBMFx1RkUwRiBDb3B5IG1hbnVhbGx5IGZyb206PC9kaXY+XG4gICAgICAgICAgICAgICAgPHVsIHN0eWxlPVwibWFyZ2luOjA7cGFkZGluZy1sZWZ0OjE2cHg7Y29sb3I6IzkyNDAwZTtsaW5lLWhlaWdodDoxLjc7XCI+PGxpPjxzdHJvbmc+TGlua2VkSW48L3N0cm9uZz4gKGxvZ2luIHJlcXVpcmVkKTwvbGk+PGxpPjxzdHJvbmc+SW5kZWVkPC9zdHJvbmc+IChhbnRpLWJvdCk8L2xpPjxsaT48c3Ryb25nPkdsYXNzZG9vcjwvc3Ryb25nPiAoYXV0aCByZXF1aXJlZCk8L2xpPjwvdWw+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtbWV0aG9kXCIgaWQ9XCJmaWxlLW1ldGhvZFwiPlxuICAgICAgICAgICAgPGRpdiBpZD1cImZpbGUtZHJvcC16b25lXCJcbiAgICAgICAgICAgICAgICAgb25kcmFnb3Zlcj1cImV2ZW50LnByZXZlbnREZWZhdWx0KCk7IHRoaXMuY2xhc3NMaXN0LmFkZCgnZHJhZy1vdmVyJylcIlxuICAgICAgICAgICAgICAgICBvbmRyYWdsZWF2ZT1cInRoaXMuY2xhc3NMaXN0LnJlbW92ZSgnZHJhZy1vdmVyJylcIlxuICAgICAgICAgICAgICAgICBvbmRyb3A9XCJoYW5kbGVGaWxlRHJvcChldmVudClcIlxuICAgICAgICAgICAgICAgICBvbmNsaWNrPVwiZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pvYi1maWxlLWlucHV0JykuY2xpY2soKVwiXG4gICAgICAgICAgICAgICAgIHN0eWxlPVwiYm9yZGVyOjJweCBkYXNoZWQgI2QxZDVkYjtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjMycHggMTZweDt0ZXh0LWFsaWduOmNlbnRlcjtjdXJzb3I6cG9pbnRlcjt0cmFuc2l0aW9uOmJhY2tncm91bmQgMC4ycyxib3JkZXItY29sb3IgMC4yczttYXJnaW46OHB4IDA7XCI+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MnJlbTttYXJnaW4tYm90dG9tOjhweDtcIj5cdUQ4M0RcdURDQzQ8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5Ecm9wIGEgZmlsZSBoZXJlLCBvciBjbGljayB0byBicm93c2U8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjg1cmVtO2NvbG9yOiM2NDc0OGI7XCI+LnR4dCAmbmJzcDtcdTAwQjcmbmJzcDsgLm1kICZuYnNwO1x1MDBCNyZuYnNwOyAuaHRtbCAmbmJzcDtcdTAwQjcmbmJzcDsgLnBkZiAmbmJzcDtcdTAwQjcmbmJzcDsgLmRvY3ggJm5ic3A7XHUwMEI3Jm5ic3A7IC5ydGY8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgaWQ9XCJqb2ItZmlsZS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpub25lXCJcbiAgICAgICAgICAgICAgICAgICBhY2NlcHQ9XCIudHh0LC5tZCwucnN0LC50ZXh0LC5odG1sLC5odG0sLnBkZiwuZG9jeCwuZG9jLC5ydGZcIlxuICAgICAgICAgICAgICAgICAgIGFyaWEtZGVzY3JpYmVkYnk9XCJmaWxlLXVwbG9hZC1lcnJvclwiXG4gICAgICAgICAgICAgICAgICAgb25jaGFuZ2U9XCJoYW5kbGVGaWxlU2VsZWN0ZWQodGhpcy5maWxlc1swXSlcIj5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJmaWxlLXNlbGVjdGVkLWluZm9cIiBzdHlsZT1cImRpc3BsYXk6bm9uZTttYXJnaW46OHB4IDA7XCI+XG4gICAgICAgICAgICAgIDxzcGFuIGlkPVwiZmlsZS1zZWxlY3RlZC1uYW1lXCIgc3R5bGU9XCJmb250LXdlaWdodDo2MDA7XCI+PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBpZD1cImZpbGUtc2VsZWN0ZWQtc2l6ZVwiIHN0eWxlPVwiY29sb3I6IzY0NzQ4YjttYXJnaW4tbGVmdDo4cHg7XCI+PC9zcGFuPlxuICAgICAgICAgICAgICA8YnV0dG9uIG9uY2xpY2s9XCJjbGVhclNlbGVjdGVkRmlsZSgpXCIgc3R5bGU9XCJtYXJnaW4tbGVmdDo4cHg7YmFja2dyb3VuZDpub25lO2JvcmRlcjpub25lO2N1cnNvcjpwb2ludGVyO2NvbG9yOiM2NDc0OGI7XCI+XHUyNzE1PC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJmaWxlLXVwbG9hZC1lcnJvclwiIHN0eWxlPVwiZGlzcGxheTpub25lO2NvbG9yOiNjMDM5MmI7bWFyZ2luOjhweCAwO2ZvbnQtc2l6ZTowLjg1cmVtO1wiPjwvZGl2PlxuICAgICAgICAgICAgPGRpdiBpZD1cImZpbGUtc2l6ZS13YXJuaW5nXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7Y29sb3I6IzkyNDAwZTtiYWNrZ3JvdW5kOiNmZWYzYzc7Ym9yZGVyOjFweCBzb2xpZCAjZmNkMzRkO2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6NHB4IDhweDttYXJnaW46NHB4IDA7Zm9udC1zaXplOjAuODVyZW07XCI+PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDo4cHg7bWFyZ2luLXRvcDo0cHg7YWxpZ24taXRlbXM6Y2VudGVyO1wiPlxuICAgICAgICAgICAgICA8YnV0dG9uIGlkPVwiZmlsZS11cGxvYWQtYnRuXCIgb25jbGljaz1cInVwbG9hZEpvYkZpbGUoKVwiIGNsYXNzPVwiYnRuLXByaW1hcnlcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj5cdUQ4M0RcdURDRTQgVXNlIFRoaXMgRmlsZTwvYnV0dG9uPlxuICAgICAgICAgICAgICA8ZGl2IGlkPVwiZmlsZS11cGxvYWQtc3Bpbm5lclwiIHN0eWxlPVwiZGlzcGxheTpub25lO2ZvbnQtc2l6ZTowLjg1cmVtO2NvbG9yOiM2NDc0OGI7XCI+XHUyM0YzIFBhcnNpbmdcdTIwMjY8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGA7XG4gIC8vIFNob3cgbWluaW11bS1sZW5ndGggaGludCBpbW1lZGlhdGVseSBvbiBmaXJzdCByZW5kZXIgKEdBUC0yODgpLlxuICBfdXBkYXRlUGFzdGVDaGFyQ291bnQoKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBJbnB1dCBtZXRob2Qgc3dpdGNoaW5nXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gc3dpdGNoSW5wdXRNZXRob2QobWV0aG9kKSB7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5pbnB1dC10YWInKS5mb3JFYWNoKHRhYiA9PiB0YWIuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJykpO1xuICBldmVudC50YXJnZXQuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmlucHV0LW1ldGhvZCcpLmZvckVhY2gocGFuZWwgPT4gcGFuZWwuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJykpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChtZXRob2QgKyAnLW1ldGhvZCcpLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEZpbGUgdXBsb2FkXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxubGV0IF9wZW5kaW5nVXBsb2FkRmlsZSA9IG51bGw7XG5cbmZ1bmN0aW9uIGhhbmRsZUZpbGVEcm9wKGV2ZW50KSB7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlLWRyb3Atem9uZScpLmNsYXNzTGlzdC5yZW1vdmUoJ2RyYWctb3ZlcicpO1xuICBjb25zdCBmaWxlID0gZXZlbnQuZGF0YVRyYW5zZmVyLmZpbGVzWzBdO1xuICBpZiAoZmlsZSkgaGFuZGxlRmlsZVNlbGVjdGVkKGZpbGUpO1xufVxuXG5mdW5jdGlvbiBoYW5kbGVGaWxlU2VsZWN0ZWQoZmlsZSkge1xuICBpZiAoIWZpbGUpIHJldHVybjtcblxuICBjb25zdCBzaXplTWIgID0gKGZpbGUuc2l6ZSAvICgxMDI0ICogMTAyNCkpLnRvRml4ZWQoMSk7XG4gIGNvbnN0IHNpemVTdHIgPSBmaWxlLnNpemUgPiAxMDI0ICogMTAyNCA/IGAke3NpemVNYn0gTUJgIDogYCR7KGZpbGUuc2l6ZSAvIDEwMjQpLnRvRml4ZWQoMSl9IEtCYDtcbiAgY29uc3QgZXJyRWwgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlLXVwbG9hZC1lcnJvcicpO1xuICBjb25zdCB3YXJuRWwgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGUtc2l6ZS13YXJuaW5nJyk7XG5cbiAgY29uc3QgYWxsb3dlZE1pbWVzID0gWydhcHBsaWNhdGlvbi9wZGYnLCAnYXBwbGljYXRpb24vbXN3b3JkJyxcbiAgICAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LndvcmRwcm9jZXNzaW5nbWwuZG9jdW1lbnQnLFxuICAgICd0ZXh0L3BsYWluJywgJ3RleHQvaHRtbCddO1xuICBjb25zdCBhbGxvd2VkRXh0cyAgPSBbJy5wZGYnLCAnLmRvYycsICcuZG9jeCcsICcudHh0JywgJy5odG1sJywgJy5odG0nXTtcbiAgY29uc3QgZXh0ID0gJy4nICsgKGZpbGUubmFtZS5zcGxpdCgnLicpLnBvcCgpIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBtaW1lT2sgPSBhbGxvd2VkTWltZXMuc29tZShtID0+IGZpbGUudHlwZS5zdGFydHNXaXRoKG0pKSB8fCBmaWxlLnR5cGUgPT09ICcnO1xuICBjb25zdCBleHRPayAgPSBhbGxvd2VkRXh0cy5pbmNsdWRlcyhleHQpO1xuICBpZiAoIW1pbWVPayAmJiAhZXh0T2spIHtcbiAgICBlcnJFbC50ZXh0Q29udGVudCAgID0gYFVuc3VwcG9ydGVkIGZpbGUgdHlwZSBcIiR7ZXh0IHx8IGZpbGUudHlwZX1cIi4gU3VwcG9ydGVkIGZvcm1hdHM6IFBERiwgV29yZCAoLmRvYy8uZG9jeCksIHBsYWluIHRleHQsIEhUTUwuYDtcbiAgICBlcnJFbC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICBpZiAod2FybkVsKSB3YXJuRWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmlsZS11cGxvYWQtYnRuJykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoZmlsZS5zaXplID4gMjAgKiAxMDI0ICogMTAyNCkge1xuICAgIGVyckVsLnRleHRDb250ZW50ICAgPSBgRmlsZSBpcyB0b28gbGFyZ2UgKCR7c2l6ZU1ifSBNQikuIE1heGltdW0gYWxsb3dlZCBzaXplIGlzIDIwIE1CLmA7XG4gICAgZXJyRWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgaWYgKHdhcm5FbCkgd2FybkVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGUtdXBsb2FkLWJ0bicpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgX3BlbmRpbmdVcGxvYWRGaWxlID0gZmlsZTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGUtc2VsZWN0ZWQtbmFtZScpLnRleHRDb250ZW50ICA9IGZpbGUubmFtZTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGUtc2VsZWN0ZWQtc2l6ZScpLnRleHRDb250ZW50ICA9IGAoJHtzaXplU3RyfSlgO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmlsZS1zZWxlY3RlZC1pbmZvJykuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlLXVwbG9hZC1idG4nKS5zdHlsZS5kaXNwbGF5ICAgID0gJ2lubGluZS1ibG9jayc7XG4gIGVyckVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgaWYgKHdhcm5FbCkge1xuICAgIGlmIChmaWxlLnNpemUgPiA1ICogMTAyNCAqIDEwMjQpIHtcbiAgICAgIHdhcm5FbC50ZXh0Q29udGVudCAgID0gYFx1MjZBMCBMYXJnZSBmaWxlICgke3NpemVNYn0gTUIpIFx1MjAxNCBwYXJzaW5nIG1heSB0YWtlIGEgbW9tZW50LmA7XG4gICAgICB3YXJuRWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdhcm5FbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjbGVhclNlbGVjdGVkRmlsZSgpIHtcbiAgX3BlbmRpbmdVcGxvYWRGaWxlID0gbnVsbDtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pvYi1maWxlLWlucHV0JykudmFsdWUgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGUtc2VsZWN0ZWQtaW5mbycpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlLXVwbG9hZC1idG4nKS5zdHlsZS5kaXNwbGF5ICAgPSAnbm9uZSc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlLXVwbG9hZC1lcnJvcicpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIGNvbnN0IHdhcm4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmlsZS1zaXplLXdhcm5pbmcnKTtcbiAgaWYgKHdhcm4pIHdhcm4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBsb2FkSm9iRmlsZSgpIHtcbiAgaWYgKCFfcGVuZGluZ1VwbG9hZEZpbGUpIHJldHVybjtcblxuICBjb25zdCBlcnJFbCAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGUtdXBsb2FkLWVycm9yJyk7XG4gIGNvbnN0IHNwaW5uZXIgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmlsZS11cGxvYWQtc3Bpbm5lcicpO1xuICBjb25zdCB1cGxvYWRCdG4gID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGUtdXBsb2FkLWJ0bicpO1xuXG4gIGVyckVsLnN0eWxlLmRpc3BsYXkgICAgPSAnbm9uZSc7XG4gIHNwaW5uZXIuc3R5bGUuZGlzcGxheSAgPSAnaW5saW5lJztcbiAgdXBsb2FkQnRuLmRpc2FibGVkICAgICA9IHRydWU7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZScsIF9wZW5kaW5nVXBsb2FkRmlsZSk7XG5cbiAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2goJy9hcGkvdXBsb2FkLWZpbGUnLCB7IG1ldGhvZDogJ1BPU1QnLCBib2R5OiBmb3JtRGF0YSB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcC5qc29uKCk7XG5cbiAgICBpZiAoIXJlc3Aub2sgfHwgZGF0YS5lcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGRhdGEubWVzc2FnZSB8fCBkYXRhLmVycm9yIHx8IGBTZXJ2ZXIgZXJyb3IgJHtyZXNwLnN0YXR1c31gKTtcbiAgICB9XG5cbiAgICBjb25zdCBqb2JSZXNwID0gYXdhaXQgZmV0Y2goJy9hcGkvam9iJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgam9iX3RleHQ6IGRhdGEudGV4dCB9KVxuICAgIH0pO1xuICAgIGNvbnN0IGpvYkRhdGEgPSBhd2FpdCBqb2JSZXNwLmpzb24oKTtcbiAgICBpZiAoIWpvYlJlc3Aub2spIHRocm93IG5ldyBFcnJvcihqb2JEYXRhLmVycm9yIHx8ICdGYWlsZWQgdG8gcHJvY2VzcyBqb2IgZGVzY3JpcHRpb24nKTtcblxuICAgIGlmIChqb2JEYXRhLmVycm9yKSB7XG4gICAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnRXJyb3I6ICcgKyBqb2JEYXRhLmVycm9yKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGVNYW5hZ2VyLnNldFRhYkRhdGEoJ2pvYicsIGRhdGEudGV4dCk7XG4gICAgICBzYXZlVGFiRGF0YSgpO1xuICAgICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgYFx1MjcwNSBKb2IgZGVzY3JpcHRpb24gbG9hZGVkIGZyb20gXCIke2RhdGEuZmlsZW5hbWV9XCIgKCR7ZGF0YS5jb250ZW50X2xlbmd0aC50b0xvY2FsZVN0cmluZygpfSBjaGFycykuYCk7XG4gICAgICBhd2FpdCBhbmFseXplSm9iKCk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBlcnJFbC50ZXh0Q29udGVudCAgID0gZXJyLm1lc3NhZ2U7XG4gICAgZXJyRWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gIH0gZmluYWxseSB7XG4gICAgc3Bpbm5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIHVwbG9hZEJ0bi5kaXNhYmxlZCAgICA9IGZhbHNlO1xuICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUGFzdGUgdGV4dCBzdWJtaXNzaW9uXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY29uc3QgUEFTVEVfTUlOX0NIQVJTID0gMjAwO1xuXG5mdW5jdGlvbiBfdXBkYXRlUGFzdGVDaGFyQ291bnQoKSB7XG4gIGNvbnN0IHZhbCA9IChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnam9iLXRleHQtaW5wdXQnKT8udmFsdWUgfHwgJycpLnRyaW0oKTtcbiAgY29uc3QgY291bnRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYXN0ZS1jaGFyLWNvdW50Jyk7XG4gIGlmICghY291bnRFbCkgcmV0dXJuO1xuICBjb25zdCBuID0gdmFsLmxlbmd0aDtcbiAgaWYgKG4gPT09IDApIHtcbiAgICBjb3VudEVsLnN0eWxlLmNvbG9yID0gJyM5NGEzYjgnO1xuICAgIGNvdW50RWwudGV4dENvbnRlbnQgPSBgUGFzdGUgdGhlIGZ1bGwgam9iIGRlc2NyaXB0aW9uIChtaW5pbXVtICR7UEFTVEVfTUlOX0NIQVJTfSBjaGFyYWN0ZXJzIGZvciBiZXN0IHJlc3VsdHMpYDtcbiAgfSBlbHNlIGlmIChuIDwgUEFTVEVfTUlOX0NIQVJTKSB7XG4gICAgY291bnRFbC5zdHlsZS5jb2xvciA9ICcjZWY0NDQ0JztcbiAgICBjb3VudEVsLnRleHRDb250ZW50ID0gYCR7bn0gLyAke1BBU1RFX01JTl9DSEFSU30gbWluaW11bSBcdTIwMTQgVG9vIHNob3J0LCBhaW0gZm9yIGF0IGxlYXN0ICR7UEFTVEVfTUlOX0NIQVJTfSBjaGFyYWN0ZXJzYDtcbiAgfSBlbHNlIHtcbiAgICBjb3VudEVsLnN0eWxlLmNvbG9yID0gJyMxNmEzNGEnO1xuICAgIGNvdW50RWwudGV4dENvbnRlbnQgPSBgJHtufSAvICR7UEFTVEVfTUlOX0NIQVJTfSBtaW5pbXVtIFx1MjcxM2A7XG4gIH1cbn1cblxuZnVuY3Rpb24gX3ZhbGlkYXRlUGFzdGVGaWVsZCgpIHtcbiAgY29uc3QgdmFsID0gKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqb2ItdGV4dC1pbnB1dCcpPy52YWx1ZSB8fCAnJykudHJpbSgpO1xuICBfdXBkYXRlUGFzdGVDaGFyQ291bnQoKTtcbiAgaWYgKHZhbC5sZW5ndGggPiAwICYmIHZhbC5sZW5ndGggPCBQQVNURV9NSU5fQ0hBUlMpIHtcbiAgICBfc2hvd0ZpZWxkRXJyb3IoJ2pvYi10ZXh0LWlucHV0JywgJ3Bhc3RlLWVycm9yJywgYEpvYiBkZXNjcmlwdGlvbiBpcyB0b28gc2hvcnQgXHUyMDE0IHBsZWFzZSBwYXN0ZSBhdCBsZWFzdCAke1BBU1RFX01JTl9DSEFSU30gY2hhcmFjdGVycy5gKTtcbiAgfSBlbHNlIHtcbiAgICBfY2xlYXJGaWVsZEVycm9yKCdqb2ItdGV4dC1pbnB1dCcsICdwYXN0ZS1lcnJvcicpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN1Ym1pdEpvYlRleHQoKSB7XG4gIC8qIGR1Y2tmbG93OlxuICAgKiAgIGlkOiBqb2JfdWlfc3VibWl0X2xpdmVcbiAgICogICBraW5kOiB1aVxuICAgKiAgIHRpbWVzdGFtcDogJzIwMjYtMDMtMzFUMTI6NDk6NDdaJ1xuICAgKiAgIHN0YXR1czogbGl2ZVxuICAgKiAgIGhhbmRsZXM6XG4gICAqICAgLSB1aTpqb2ItaW5wdXQuc3VibWl0LXRleHRcbiAgICogICBjYWxsczpcbiAgICogICAtIFBPU1QgL2FwaS9qb2JcbiAgICogICAtIGFuYWx5emVKb2JcbiAgICogICByZWFkczpcbiAgICogICAtIGRvbTojam9iLXRleHQtaW5wdXQudmFsdWVcbiAgICogICB3cml0ZXM6XG4gICAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9qb2Iuam9iX3RleHRcbiAgICogICAtIHRhYjpqb2JcbiAgICogICAtIHVpOndvcmtmbG93LmpvYlxuICAgKiAgIG5vdGVzOiBTdWJtaXRzIHBhc3RlZCBqb2IgdGV4dCB0byB0aGUgYmFja2VuZCwgY2FjaGVzIHRoZSBzYW1lIHRleHQgaW4gdGFiIHN0YXRlLCB0aGVuIHJ1bnMgYW5hbHl6ZUpvYigpIHNvIGFsbCBqb2Igc291cmNlcyBzaGFyZSB0aGUgc2FtZSBhbmFseXNpcyBhbmQgaW50YWtlIGZsb3cuXG4gICAqL1xuICBjb25zdCB0ZXh0SW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnam9iLXRleHQtaW5wdXQnKTtcbiAgY29uc3Qgam9iVGV4dCA9IHRleHRJbnB1dC52YWx1ZS50cmltKCk7XG5cbiAgaWYgKCFqb2JUZXh0KSB7XG4gICAgX3Nob3dGaWVsZEVycm9yKCdqb2ItdGV4dC1pbnB1dCcsICdwYXN0ZS1lcnJvcicsICdQbGVhc2UgZW50ZXIgYSBqb2IgZGVzY3JpcHRpb24gYmVmb3JlIHN1Ym1pdHRpbmcuJyk7XG4gICAgdGV4dElucHV0LmZvY3VzKCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChqb2JUZXh0Lmxlbmd0aCA8IFBBU1RFX01JTl9DSEFSUykge1xuICAgIF9zaG93RmllbGRFcnJvcignam9iLXRleHQtaW5wdXQnLCAncGFzdGUtZXJyb3InLCBgSm9iIGRlc2NyaXB0aW9uIGlzIHRvbyBzaG9ydCBcdTIwMTQgcGxlYXNlIHBhc3RlIGF0IGxlYXN0ICR7UEFTVEVfTUlOX0NIQVJTfSBjaGFyYWN0ZXJzLmApO1xuICAgIHRleHRJbnB1dC5mb2N1cygpO1xuICAgIHJldHVybjtcbiAgfVxuICBfY2xlYXJGaWVsZEVycm9yKCdqb2ItdGV4dC1pbnB1dCcsICdwYXN0ZS1lcnJvcicpO1xuXG4gIHNldExvYWRpbmcodHJ1ZSwgJ0FuYWx5c2luZyBqb2IgZGVzY3JpcHRpb25cdTIwMjYnKTtcbiAgYXBwZW5kTWVzc2FnZSgndXNlcicsICdTdWJtaXR0aW5nIGpvYiBkZXNjcmlwdGlvbi4uLicpO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9qb2InLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBqb2JfdGV4dDogam9iVGV4dCB9KVxuICAgIH0pO1xuXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAgIGlmIChkYXRhLmVycm9yKSB7XG4gICAgICBfc2hvd0ZpZWxkRXJyb3IoJ2pvYi10ZXh0LWlucHV0JywgJ3Bhc3RlLWVycm9yJywgZGF0YS5lcnJvcik7XG4gICAgICBhcHBlbmRSZXRyeU1lc3NhZ2UoJ1x1Mjc0QyBFcnJvcjogJyArIGRhdGEuZXJyb3IsIHN1Ym1pdEpvYlRleHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBfY2xlYXJGaWVsZEVycm9yKCdqb2ItdGV4dC1pbnB1dCcsICdwYXN0ZS1lcnJvcicpO1xuICAgICAgc3RhdGVNYW5hZ2VyLnNldFRhYkRhdGEoJ2pvYicsIGpvYlRleHQpO1xuICAgICAgc2F2ZVRhYkRhdGEoKTtcbiAgICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsICdcdTI3MDUgSm9iIGRlc2NyaXB0aW9uIHN1Ym1pdHRlZCBzdWNjZXNzZnVsbHkuJyk7XG5cbiAgICAgIGlmICh0eXBlb2YgdXBkYXRlVGFiQmFyRm9yU3RhZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdXBkYXRlVGFiQmFyRm9yU3RhZ2UoJ2pvYicpO1xuICAgICAgfVxuICAgICAgc3dpdGNoVGFiKCdqb2InKTtcbiAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgICAgYXdhaXQgYW5hbHl6ZUpvYigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cuZXJyb3IoJ0Vycm9yIHN1Ym1pdHRpbmcgam9iOicsIGVycm9yKTtcbiAgICBhcHBlbmRSZXRyeU1lc3NhZ2UoJ1x1Mjc0QyBFcnJvciBzdWJtaXR0aW5nIGpvYiBkZXNjcmlwdGlvbjogJyArIGVycm9yLm1lc3NhZ2UsIHN1Ym1pdEpvYlRleHQpO1xuICB9XG5cbiAgc2V0TG9hZGluZyhmYWxzZSk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVVJMIGZldGNoXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gX3ZhbGlkYXRlVVJMRmllbGQoKSB7XG4gIGNvbnN0IHZhbCA9IChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnam9iLXVybC1pbnB1dCcpPy52YWx1ZSB8fCAnJykudHJpbSgpO1xuICBpZiAoIXZhbCkgeyBfY2xlYXJGaWVsZEVycm9yKCdqb2ItdXJsLWlucHV0JywgJ3VybC1lcnJvcicpOyByZXR1cm47IH1cbiAgdHJ5IHtcbiAgICBjb25zdCB1ID0gbmV3IFVSTCh2YWwpO1xuICAgIGlmICghWydodHRwOicsICdodHRwczonXS5pbmNsdWRlcyh1LnByb3RvY29sKSkgdGhyb3cgbmV3IEVycm9yKCdQcm90b2NvbCBub3QgaHR0cC9odHRwcycpO1xuICAgIF9jbGVhckZpZWxkRXJyb3IoJ2pvYi11cmwtaW5wdXQnLCAndXJsLWVycm9yJyk7XG4gIH0gY2F0Y2gge1xuICAgIF9zaG93RmllbGRFcnJvcignam9iLXVybC1pbnB1dCcsICd1cmwtZXJyb3InLCAnUGxlYXNlIGVudGVyIGEgdmFsaWQgVVJMIHN0YXJ0aW5nIHdpdGggaHR0cHM6Ly8gb3IgaHR0cDovLycpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoSm9iRnJvbVVSTCgpIHtcbiAgY29uc3QgdXJsSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnam9iLXVybC1pbnB1dCcpO1xuICBjb25zdCB1cmwgPSB1cmxJbnB1dC52YWx1ZS50cmltKCk7XG5cbiAgaWYgKCF1cmwpIHtcbiAgICBfc2hvd0ZpZWxkRXJyb3IoJ2pvYi11cmwtaW5wdXQnLCAndXJsLWVycm9yJywgJ1BsZWFzZSBlbnRlciBhIFVSTCBiZWZvcmUgZmV0Y2hpbmcuJyk7XG4gICAgdXJsSW5wdXQuZm9jdXMoKTtcbiAgICByZXR1cm47XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCB1ID0gbmV3IFVSTCh1cmwpO1xuICAgIGlmICghWydodHRwOicsICdodHRwczonXS5pbmNsdWRlcyh1LnByb3RvY29sKSkgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgX2NsZWFyRmllbGRFcnJvcignam9iLXVybC1pbnB1dCcsICd1cmwtZXJyb3InKTtcbiAgfSBjYXRjaCB7XG4gICAgX3Nob3dGaWVsZEVycm9yKCdqb2ItdXJsLWlucHV0JywgJ3VybC1lcnJvcicsICdQbGVhc2UgZW50ZXIgYSB2YWxpZCBVUkwgc3RhcnRpbmcgd2l0aCBodHRwczovLyBvciBodHRwOi8vJyk7XG4gICAgdXJsSW5wdXQuZm9jdXMoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBzZXRMb2FkaW5nKHRydWUsICdGZXRjaGluZyBqb2IgZnJvbSBVUkxcdTIwMjYnKTtcbiAgYXBwZW5kTWVzc2FnZSgndXNlcicsIGBGZXRjaGluZyBqb2IgZGVzY3JpcHRpb24gZnJvbSBVUkw6ICR7dXJsfWApO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9mZXRjaC1qb2ItdXJsJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgdXJsOiB1cmwgfSlcbiAgICB9KTtcblxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICBpZiAoZGF0YS5lcnJvcikge1xuICAgICAgbGV0IGVycm9yTWVzc2FnZSA9IGRhdGEuZXJyb3I7XG4gICAgICBsZXQgaGVscE1lc3NhZ2UgPSBkYXRhLm1lc3NhZ2UgfHwgJyc7XG5cbiAgICAgIGlmIChkYXRhLnByb3RlY3RlZF9zaXRlKSB7XG4gICAgICAgIGVycm9yTWVzc2FnZSA9IGAke2RhdGEuc2l0ZV9uYW1lfSBQcm90ZWN0aW9uIERldGVjdGVkYDtcbiAgICAgICAgaGVscE1lc3NhZ2UgPSBkYXRhLm1lc3NhZ2U7XG5cbiAgICAgICAgaWYgKGRhdGEuaW5zdHJ1Y3Rpb25zICYmIGRhdGEuaW5zdHJ1Y3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBoZWxwTWVzc2FnZSArPSAnXFxuXFxuSG93IHRvIHByb2NlZWQ6XFxuJyArIGRhdGEuaW5zdHJ1Y3Rpb25zLm1hcCgoaW5zdCwgaSkgPT4gYCR7aSArIDF9LiAke2luc3R9YCkuam9pbignXFxuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBzaG93UHJvdGVjdGVkU2l0ZU1vZGFsKGRhdGEuc2l0ZV9uYW1lLCBkYXRhLm1lc3NhZ2UsIGRhdGEuaW5zdHJ1Y3Rpb25zKTtcbiAgICAgIH0gZWxzZSBpZiAoZGF0YS5pbnN0cnVjdGlvbnMpIHtcbiAgICAgICAgaGVscE1lc3NhZ2UgKz0gJ1xcblxcblN1Z2dlc3RlZCBzb2x1dGlvbnM6XFxuJyArIGRhdGEuaW5zdHJ1Y3Rpb25zLm1hcCgoaW5zdCwgaSkgPT4gYCR7aSArIDF9LiAke2luc3R9YCkuam9pbignXFxuJyk7XG4gICAgICAgIHNob3dBbGVydE1vZGFsKCdVUkwgRmV0Y2ggRXJyb3InLCBgJHtlcnJvck1lc3NhZ2V9XFxuXFxuJHtoZWxwTWVzc2FnZX1gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF9zaG93RmllbGRFcnJvcignam9iLXVybC1pbnB1dCcsICd1cmwtZXJyb3InLCBlcnJvck1lc3NhZ2UpO1xuICAgICAgICBzaG93QWxlcnRNb2RhbCgnRXJyb3InLCBgJHtlcnJvck1lc3NhZ2V9JHtoZWxwTWVzc2FnZSA/ICdcXG5cXG4nICsgaGVscE1lc3NhZ2UgOiAnJ31gKTtcbiAgICAgIH1cblxuICAgICAgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgYFx1Mjc0QyAke2Vycm9yTWVzc2FnZX06ICR7ZGF0YS5tZXNzYWdlIHx8ICdQbGVhc2UgdHJ5IG1hbnVhbCBpbnB1dC4nfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZU1hbmFnZXIuc2V0VGFiRGF0YSgnam9iJywgZGF0YS5qb2JfdGV4dCk7XG4gICAgICBzYXZlVGFiRGF0YSgpO1xuICAgICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgYFx1MjcwNSAke2RhdGEubWVzc2FnZX0hIEZldGNoZWQgJHtkYXRhLmNvbnRlbnRfbGVuZ3RoIHx8ICdjb250ZW50J30gY2hhcmFjdGVycy4gUmV2aWV3IHRoZSBqb2IgZGVzY3JpcHRpb24gYmVsb3csIHRoZW4gY2xpY2sgXCJcdUQ4M0RcdUREMEQgQW5hbHlzZSBKb2JcIiB0byBjb250aW51ZS5gKTtcbiAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgICAgc3dpdGNoVGFiKCdqb2InKTtcbiAgICAgIGF3YWl0IHBvcHVsYXRlSm9iVGFiKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy5lcnJvcignRXJyb3IgZmV0Y2hpbmcgVVJMOicsIGVycm9yKTtcbiAgICBfc2hvd0ZpZWxkRXJyb3IoJ2pvYi11cmwtaW5wdXQnLCAndXJsLWVycm9yJywgYE5ldHdvcmsgZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICBhcHBlbmRSZXRyeU1lc3NhZ2UoYE5ldHdvcmsgZXJyb3Igb2NjdXJyZWQ6ICR7ZXJyb3IubWVzc2FnZX0uIFBsZWFzZSBjaGVjayB5b3VyIGNvbm5lY3Rpb24gb3IgdHJ5IG1hbnVhbCBpbnB1dC5gLCBmZXRjaEpvYkZyb21VUkwpO1xuICAgIHNob3dBbGVydE1vZGFsKCdOZXR3b3JrIEVycm9yJywgJ1VuYWJsZSB0byBjb25uZWN0IHRvIHRoZSBzZXJ2ZXIuIFBsZWFzZSB0cnkgYWdhaW4gb3IgdXNlIHRoZSBcIlBhc3RlIFRleHRcIiBvcHRpb24gdG8gaW5wdXQgdGhlIGpvYiBkZXNjcmlwdGlvbiBtYW51YWxseS4nKTtcbiAgfVxuXG4gIHNldExvYWRpbmcoZmFsc2UpO1xufVxuXG5mdW5jdGlvbiBzaG93UHJvdGVjdGVkU2l0ZU1vZGFsKHNpdGVOYW1lLCBtZXNzYWdlLCBpbnN0cnVjdGlvbnMpIHtcbiAgbGV0IGluc3RydWN0aW9uc0xpc3QgPSAnJztcbiAgaWYgKGluc3RydWN0aW9ucyAmJiBpbnN0cnVjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgIGluc3RydWN0aW9uc0xpc3QgPSAnPG9sIHN0eWxlPVwibWFyZ2luOiAxNnB4IDA7IHBhZGRpbmctbGVmdDogMjBweDtcIj4nICtcbiAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbnMubWFwKGluc3QgPT4gYDxsaSBzdHlsZT1cIm1hcmdpbjogOHB4IDA7XCI+JHtpbnN0fTwvbGk+YCkuam9pbignJykgK1xuICAgICAgICAgICAgICAgICAgICAgICc8L29sPic7XG4gIH1cblxuICBjb25zdCBzYWZlTmFtZSA9IGVzY2FwZUh0bWwoc2l0ZU5hbWUpO1xuICBjb25zdCBzYWZlTWVzc2FnZSA9IGVzY2FwZUh0bWwobWVzc2FnZSk7XG4gIGNvbnN0IG1vZGFsQ29udGVudCA9IGBcbiAgICA8ZGl2IHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyOyBtYXJnaW4tYm90dG9tOiAxNnB4O1wiPlxuICAgICAgXHVEODNEXHVERDEyIDxzdHJvbmc+JHtzYWZlTmFtZX0gcmVxdWlyZXMgbWFudWFsIGlucHV0PC9zdHJvbmc+XG4gICAgPC9kaXY+XG4gICAgPHA+JHtzYWZlTWVzc2FnZX08L3A+XG4gICAgJHtpbnN0cnVjdGlvbnNMaXN0fVxuICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAyMHB4OyBwYWRkaW5nOiAxMnB4OyBiYWNrZ3JvdW5kOiAjZjBmOWZmOyBib3JkZXI6IDFweCBzb2xpZCAjMGVhNWU5OyBib3JkZXItcmFkaXVzOiA2cHg7XCI+XG4gICAgICA8c3Ryb25nPlx1RDgzRFx1RENBMSBUaXA6PC9zdHJvbmc+IEFmdGVyIGNvcHlpbmcgdGhlIGpvYiBkZXNjcmlwdGlvbiwgY2xpY2sgdGhlIFwiUGFzdGUgVGV4dFwiIHRhYiBhYm92ZSB0byBzdWJtaXQgaXQgZGlyZWN0bHkuXG4gICAgPC9kaXY+XG4gIGA7XG5cbiAgc2hvd0FsZXJ0TW9kYWwoYCR7c2FmZU5hbWV9IElucHV0IFJlcXVpcmVkYCwgbW9kYWxDb250ZW50KTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDbGVhciBoZWxwZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gY2xlYXJKb2JJbnB1dCgpIHtcbiAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnam9iLXRleHQtaW5wdXQnKTtcbiAgaWYgKGVsKSBlbC52YWx1ZSA9ICcnO1xufVxuXG5mdW5jdGlvbiBjbGVhclVSTElucHV0KCkge1xuICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqb2ItdXJsLWlucHV0Jyk7XG4gIGlmIChlbCkgZWwudmFsdWUgPSAnJztcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBGaWVsZCBlcnJvciBoZWxwZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gX3Nob3dGaWVsZEVycm9yKGlucHV0SWQsIGVycm9ySWQsIG1zZykge1xuICBjb25zdCBpbnAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaW5wdXRJZCk7XG4gIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlcnJvcklkKTtcbiAgaWYgKHNwYW4pICB7IHNwYW4udGV4dENvbnRlbnQgPSBtc2c7IHNwYW4uY2xhc3NMaXN0LmFkZCgndmlzaWJsZScpOyB9XG4gIGlmIChpbnApICAge1xuICAgIGlucC5jbGFzc0xpc3QuYWRkKCdmaWVsZC1pbnZhbGlkJyk7XG4gICAgaW5wLnNldEF0dHJpYnV0ZSgnYXJpYS1pbnZhbGlkJywgJ3RydWUnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfY2xlYXJGaWVsZEVycm9yKGlucHV0SWQsIGVycm9ySWQpIHtcbiAgY29uc3QgaW5wICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlucHV0SWQpO1xuICBjb25zdCBzcGFuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZXJyb3JJZCk7XG4gIGlmIChzcGFuKSAgeyBzcGFuLnRleHRDb250ZW50ID0gJyc7IHNwYW4uY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZScpOyB9XG4gIGlmIChpbnApICAge1xuICAgIGlucC5jbGFzc0xpc3QucmVtb3ZlKCdmaWVsZC1pbnZhbGlkJyk7XG4gICAgaW5wLnNldEF0dHJpYnV0ZSgnYXJpYS1pbnZhbGlkJywgJ2ZhbHNlJyk7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIEVTIG1vZHVsZSBleHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuZXhwb3J0IHtcbiAgcG9wdWxhdGVKb2JUYWIsXG4gIHNob3dMb2FkSm9iUGFuZWwsXG4gIHN3aXRjaElucHV0TWV0aG9kLFxuICBfcGVuZGluZ1VwbG9hZEZpbGUsXG4gIGhhbmRsZUZpbGVEcm9wLFxuICBoYW5kbGVGaWxlU2VsZWN0ZWQsXG4gIGNsZWFyU2VsZWN0ZWRGaWxlLFxuICB1cGxvYWRKb2JGaWxlLFxuICBQQVNURV9NSU5fQ0hBUlMsXG4gIF91cGRhdGVQYXN0ZUNoYXJDb3VudCxcbiAgX3ZhbGlkYXRlUGFzdGVGaWVsZCxcbiAgc3VibWl0Sm9iVGV4dCxcbiAgX3ZhbGlkYXRlVVJMRmllbGQsXG4gIGZldGNoSm9iRnJvbVVSTCxcbiAgc2hvd1Byb3RlY3RlZFNpdGVNb2RhbCxcbiAgY2xlYXJKb2JJbnB1dCxcbiAgY2xlYXJVUkxJbnB1dCxcbiAgX3Nob3dGaWVsZEVycm9yLFxuICBfY2xlYXJGaWVsZEVycm9yLFxufTtcbiIsICJpbXBvcnQgdHlwZSB7IE1hcmtlZE9wdGlvbnMgfSBmcm9tICcuL01hcmtlZE9wdGlvbnMudHMnO1xuXG4vKipcbiAqIEdldHMgdGhlIG9yaWdpbmFsIG1hcmtlZCBkZWZhdWx0IG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfZ2V0RGVmYXVsdHM8UGFyc2VyT3V0cHV0ID0gc3RyaW5nLCBSZW5kZXJlck91dHB1dCA9IHN0cmluZz4oKTogTWFya2VkT3B0aW9uczxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0PiB7XG4gIHJldHVybiB7XG4gICAgYXN5bmM6IGZhbHNlLFxuICAgIGJyZWFrczogZmFsc2UsXG4gICAgZXh0ZW5zaW9uczogbnVsbCxcbiAgICBnZm06IHRydWUsXG4gICAgaG9va3M6IG51bGwsXG4gICAgcGVkYW50aWM6IGZhbHNlLFxuICAgIHJlbmRlcmVyOiBudWxsLFxuICAgIHNpbGVudDogZmFsc2UsXG4gICAgdG9rZW5pemVyOiBudWxsLFxuICAgIHdhbGtUb2tlbnM6IG51bGwsXG4gIH07XG59XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGxldCBfZGVmYXVsdHM6IE1hcmtlZE9wdGlvbnM8YW55LCBhbnk+ID0gX2dldERlZmF1bHRzKCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGFuZ2VEZWZhdWx0czxQYXJzZXJPdXRwdXQgPSBzdHJpbmcsIFJlbmRlcmVyT3V0cHV0ID0gc3RyaW5nPihuZXdEZWZhdWx0czogTWFya2VkT3B0aW9uczxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0Pikge1xuICBfZGVmYXVsdHMgPSBuZXdEZWZhdWx0cztcbn1cbiIsICJjb25zdCBub29wVGVzdCA9IHsgZXhlYzogKCkgPT4gbnVsbCB9IGFzIHVua25vd24gYXMgUmVnRXhwO1xuXG5mdW5jdGlvbiBlZGl0KHJlZ2V4OiBzdHJpbmcgfCBSZWdFeHAsIG9wdCA9ICcnKSB7XG4gIGxldCBzb3VyY2UgPSB0eXBlb2YgcmVnZXggPT09ICdzdHJpbmcnID8gcmVnZXggOiByZWdleC5zb3VyY2U7XG4gIGNvbnN0IG9iaiA9IHtcbiAgICByZXBsYWNlOiAobmFtZTogc3RyaW5nIHwgUmVnRXhwLCB2YWw6IHN0cmluZyB8IFJlZ0V4cCkgPT4ge1xuICAgICAgbGV0IHZhbFNvdXJjZSA9IHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnID8gdmFsIDogdmFsLnNvdXJjZTtcbiAgICAgIHZhbFNvdXJjZSA9IHZhbFNvdXJjZS5yZXBsYWNlKG90aGVyLmNhcmV0LCAnJDEnKTtcbiAgICAgIHNvdXJjZSA9IHNvdXJjZS5yZXBsYWNlKG5hbWUsIHZhbFNvdXJjZSk7XG4gICAgICByZXR1cm4gb2JqO1xuICAgIH0sXG4gICAgZ2V0UmVnZXg6ICgpID0+IHtcbiAgICAgIHJldHVybiBuZXcgUmVnRXhwKHNvdXJjZSwgb3B0KTtcbiAgICB9LFxuICB9O1xuICByZXR1cm4gb2JqO1xufVxuXG5jb25zdCBzdXBwb3J0c0xvb2tiZWhpbmQgPSAoKCkgPT4ge1xudHJ5IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1yZWdleC1saXRlcmFsc1xuICByZXR1cm4gISFuZXcgUmVnRXhwKCcoPzw9MSkoPzwhMSknKTtcbn0gY2F0Y2gge1xuICAvLyBTZWUgYnJvd3NlciBzdXBwb3J0IGhlcmU6XG4gIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL1JlZ3VsYXJfZXhwcmVzc2lvbnMvTG9va2JlaGluZF9hc3NlcnRpb25cbiAgcmV0dXJuIGZhbHNlO1xufVxufSkoKTtcblxuZXhwb3J0IGNvbnN0IG90aGVyID0ge1xuICBjb2RlUmVtb3ZlSW5kZW50OiAvXig/OiB7MSw0fXwgezAsM31cXHQpL2dtLFxuICBvdXRwdXRMaW5rUmVwbGFjZTogL1xcXFwoW1xcW1xcXV0pL2csXG4gIGluZGVudENvZGVDb21wZW5zYXRpb246IC9eKFxccyspKD86YGBgKS8sXG4gIGJlZ2lubmluZ1NwYWNlOiAvXlxccysvLFxuICBlbmRpbmdIYXNoOiAvIyQvLFxuICBzdGFydGluZ1NwYWNlQ2hhcjogL14gLyxcbiAgZW5kaW5nU3BhY2VDaGFyOiAvICQvLFxuICBub25TcGFjZUNoYXI6IC9bXiBdLyxcbiAgbmV3TGluZUNoYXJHbG9iYWw6IC9cXG4vZyxcbiAgdGFiQ2hhckdsb2JhbDogL1xcdC9nLFxuICBtdWx0aXBsZVNwYWNlR2xvYmFsOiAvXFxzKy9nLFxuICBibGFua0xpbmU6IC9eWyBcXHRdKiQvLFxuICBkb3VibGVCbGFua0xpbmU6IC9cXG5bIFxcdF0qXFxuWyBcXHRdKiQvLFxuICBibG9ja3F1b3RlU3RhcnQ6IC9eIHswLDN9Pi8sXG4gIGJsb2NrcXVvdGVTZXRleHRSZXBsYWNlOiAvXFxuIHswLDN9KCg/Oj0rfC0rKSAqKSg/PVxcbnwkKS9nLFxuICBibG9ja3F1b3RlU2V0ZXh0UmVwbGFjZTI6IC9eIHswLDN9PlsgXFx0XT8vZ20sXG4gIGxpc3RSZXBsYWNlTmVzdGluZzogL14gezEsNH0oPz0oIHs0fSkqW14gXSkvZyxcbiAgbGlzdElzVGFzazogL15cXFtbIHhYXVxcXSArXFxTLyxcbiAgbGlzdFJlcGxhY2VUYXNrOiAvXlxcW1sgeFhdXFxdICsvLFxuICBsaXN0VGFza0NoZWNrYm94OiAvXFxbWyB4WF1cXF0vLFxuICBhbnlMaW5lOiAvXFxuLipcXG4vLFxuICBocmVmQnJhY2tldHM6IC9ePCguKik+JC8sXG4gIHRhYmxlRGVsaW1pdGVyOiAvWzp8XS8sXG4gIHRhYmxlQWxpZ25DaGFyczogL15cXHx8XFx8ICokL2csXG4gIHRhYmxlUm93QmxhbmtMaW5lOiAvXFxuWyBcXHRdKiQvLFxuICB0YWJsZUFsaWduUmlnaHQ6IC9eICotKzogKiQvLFxuICB0YWJsZUFsaWduQ2VudGVyOiAvXiAqOi0rOiAqJC8sXG4gIHRhYmxlQWxpZ25MZWZ0OiAvXiAqOi0rICokLyxcbiAgc3RhcnRBVGFnOiAvXjxhIC9pLFxuICBlbmRBVGFnOiAvXjxcXC9hPi9pLFxuICBzdGFydFByZVNjcmlwdFRhZzogL148KHByZXxjb2RlfGtiZHxzY3JpcHQpKFxcc3w+KS9pLFxuICBlbmRQcmVTY3JpcHRUYWc6IC9ePFxcLyhwcmV8Y29kZXxrYmR8c2NyaXB0KShcXHN8PikvaSxcbiAgc3RhcnRBbmdsZUJyYWNrZXQ6IC9ePC8sXG4gIGVuZEFuZ2xlQnJhY2tldDogLz4kLyxcbiAgcGVkYW50aWNIcmVmVGl0bGU6IC9eKFteJ1wiXSpbXlxcc10pXFxzKyhbJ1wiXSkoLiopXFwyLyxcbiAgdW5pY29kZUFscGhhTnVtZXJpYzogL1tcXHB7TH1cXHB7Tn1dL3UsXG4gIGVzY2FwZVRlc3Q6IC9bJjw+XCInXS8sXG4gIGVzY2FwZVJlcGxhY2U6IC9bJjw+XCInXS9nLFxuICBlc2NhcGVUZXN0Tm9FbmNvZGU6IC9bPD5cIiddfCYoPyEoI1xcZHsxLDd9fCNbWHhdW2EtZkEtRjAtOV17MSw2fXxcXHcrKTspLyxcbiAgZXNjYXBlUmVwbGFjZU5vRW5jb2RlOiAvWzw+XCInXXwmKD8hKCNcXGR7MSw3fXwjW1h4XVthLWZBLUYwLTldezEsNn18XFx3Kyk7KS9nLFxuICBjYXJldDogLyhefFteXFxbXSlcXF4vZyxcbiAgcGVyY2VudERlY29kZTogLyUyNS9nLFxuICBmaW5kUGlwZTogL1xcfC9nLFxuICBzcGxpdFBpcGU6IC8gXFx8LyxcbiAgc2xhc2hQaXBlOiAvXFxcXFxcfC9nLFxuICBjYXJyaWFnZVJldHVybjogL1xcclxcbnxcXHIvZyxcbiAgc3BhY2VMaW5lOiAvXiArJC9nbSxcbiAgbm90U3BhY2VTdGFydDogL15cXFMqLyxcbiAgZW5kaW5nTmV3bGluZTogL1xcbiQvLFxuICBsaXN0SXRlbVJlZ2V4OiAoYnVsbDogc3RyaW5nKSA9PiBuZXcgUmVnRXhwKGBeKCB7MCwzfSR7YnVsbH0pKCg/OltcXHQgXVteXFxcXG5dKik/KD86XFxcXG58JCkpYCksXG4gIG5leHRCdWxsZXRSZWdleDogKGluZGVudDogbnVtYmVyKSA9PiBuZXcgUmVnRXhwKGBeIHswLCR7TWF0aC5taW4oMywgaW5kZW50IC0gMSl9fSg/OlsqKy1dfFxcXFxkezEsOX1bLildKSgoPzpbIFxcdF1bXlxcXFxuXSopPyg/OlxcXFxufCQpKWApLFxuICBoclJlZ2V4OiAoaW5kZW50OiBudW1iZXIpID0+IG5ldyBSZWdFeHAoYF4gezAsJHtNYXRoLm1pbigzLCBpbmRlbnQgLSAxKX19KCg/Oi0gKil7Myx9fCg/Ol8gKil7Myx9fCg/OlxcXFwqICopezMsfSkoPzpcXFxcbit8JClgKSxcbiAgZmVuY2VzQmVnaW5SZWdleDogKGluZGVudDogbnVtYmVyKSA9PiBuZXcgUmVnRXhwKGBeIHswLCR7TWF0aC5taW4oMywgaW5kZW50IC0gMSl9fSg/OlxcYFxcYFxcYHx+fn4pYCksXG4gIGhlYWRpbmdCZWdpblJlZ2V4OiAoaW5kZW50OiBudW1iZXIpID0+IG5ldyBSZWdFeHAoYF4gezAsJHtNYXRoLm1pbigzLCBpbmRlbnQgLSAxKX19I2ApLFxuICBodG1sQmVnaW5SZWdleDogKGluZGVudDogbnVtYmVyKSA9PiBuZXcgUmVnRXhwKGBeIHswLCR7TWF0aC5taW4oMywgaW5kZW50IC0gMSl9fTwoPzpbYS16XS4qPnwhLS0pYCwgJ2knKSxcbiAgYmxvY2txdW90ZUJlZ2luUmVnZXg6IChpbmRlbnQ6IG51bWJlcikgPT4gbmV3IFJlZ0V4cChgXiB7MCwke01hdGgubWluKDMsIGluZGVudCAtIDEpfX0+YCksXG59O1xuXG4vKipcbiAqIEJsb2NrLUxldmVsIEdyYW1tYXJcbiAqL1xuXG5jb25zdCBuZXdsaW5lID0gL14oPzpbIFxcdF0qKD86XFxufCQpKSsvO1xuY29uc3QgYmxvY2tDb2RlID0gL14oKD86IHs0fXwgezAsM31cXHQpW15cXG5dKyg/Olxcbig/OlsgXFx0XSooPzpcXG58JCkpKik/KSsvO1xuY29uc3QgZmVuY2VzID0gL14gezAsM30oYHszLH0oPz1bXmBcXG5dKig/OlxcbnwkKSl8fnszLH0pKFteXFxuXSopKD86XFxufCQpKD86fChbXFxzXFxTXSo/KSg/OlxcbnwkKSkoPzogezAsM31cXDFbfmBdKiAqKD89XFxufCQpfCQpLztcbmNvbnN0IGhyID0gL14gezAsM30oKD86LVtcXHQgXSopezMsfXwoPzpfWyBcXHRdKil7Myx9fCg/OlxcKlsgXFx0XSopezMsfSkoPzpcXG4rfCQpLztcbmNvbnN0IGhlYWRpbmcgPSAvXiB7MCwzfSgjezEsNn0pKD89XFxzfCQpKC4qKSg/Olxcbit8JCkvO1xuY29uc3QgYnVsbGV0ID0gLyB7MCwzfSg/OlsqKy1dfFxcZHsxLDl9Wy4pXSkvO1xuY29uc3QgbGhlYWRpbmdDb3JlID0gL14oPyFidWxsIHxibG9ja0NvZGV8ZmVuY2VzfGJsb2NrcXVvdGV8aGVhZGluZ3xodG1sfHRhYmxlKSgoPzoufFxcbig/IVxccyo/XFxufGJ1bGwgfGJsb2NrQ29kZXxmZW5jZXN8YmxvY2txdW90ZXxoZWFkaW5nfGh0bWx8dGFibGUpKSs/KVxcbiB7MCwzfSg9K3wtKykgKig/Olxcbit8JCkvO1xuY29uc3QgbGhlYWRpbmcgPSBlZGl0KGxoZWFkaW5nQ29yZSlcbiAgLnJlcGxhY2UoL2J1bGwvZywgYnVsbGV0KSAvLyBsaXN0cyBjYW4gaW50ZXJydXB0XG4gIC5yZXBsYWNlKC9ibG9ja0NvZGUvZywgLyg/OiB7NH18IHswLDN9XFx0KS8pIC8vIGluZGVudGVkIGNvZGUgYmxvY2tzIGNhbiBpbnRlcnJ1cHRcbiAgLnJlcGxhY2UoL2ZlbmNlcy9nLCAvIHswLDN9KD86YHszLH18fnszLH0pLykgLy8gZmVuY2VkIGNvZGUgYmxvY2tzIGNhbiBpbnRlcnJ1cHRcbiAgLnJlcGxhY2UoL2Jsb2NrcXVvdGUvZywgLyB7MCwzfT4vKSAvLyBibG9ja3F1b3RlIGNhbiBpbnRlcnJ1cHRcbiAgLnJlcGxhY2UoL2hlYWRpbmcvZywgLyB7MCwzfSN7MSw2fS8pIC8vIEFUWCBoZWFkaW5nIGNhbiBpbnRlcnJ1cHRcbiAgLnJlcGxhY2UoL2h0bWwvZywgLyB7MCwzfTxbXlxcbj5dKz5cXG4vKSAvLyBibG9jayBodG1sIGNhbiBpbnRlcnJ1cHRcbiAgLnJlcGxhY2UoL1xcfHRhYmxlL2csICcnKSAvLyB0YWJsZSBub3QgaW4gY29tbW9ubWFya1xuICAuZ2V0UmVnZXgoKTtcbmNvbnN0IGxoZWFkaW5nR2ZtID0gZWRpdChsaGVhZGluZ0NvcmUpXG4gIC5yZXBsYWNlKC9idWxsL2csIGJ1bGxldCkgLy8gbGlzdHMgY2FuIGludGVycnVwdFxuICAucmVwbGFjZSgvYmxvY2tDb2RlL2csIC8oPzogezR9fCB7MCwzfVxcdCkvKSAvLyBpbmRlbnRlZCBjb2RlIGJsb2NrcyBjYW4gaW50ZXJydXB0XG4gIC5yZXBsYWNlKC9mZW5jZXMvZywgLyB7MCwzfSg/OmB7Myx9fH57Myx9KS8pIC8vIGZlbmNlZCBjb2RlIGJsb2NrcyBjYW4gaW50ZXJydXB0XG4gIC5yZXBsYWNlKC9ibG9ja3F1b3RlL2csIC8gezAsM30+LykgLy8gYmxvY2txdW90ZSBjYW4gaW50ZXJydXB0XG4gIC5yZXBsYWNlKC9oZWFkaW5nL2csIC8gezAsM30jezEsNn0vKSAvLyBBVFggaGVhZGluZyBjYW4gaW50ZXJydXB0XG4gIC5yZXBsYWNlKC9odG1sL2csIC8gezAsM308W15cXG4+XSs+XFxuLykgLy8gYmxvY2sgaHRtbCBjYW4gaW50ZXJydXB0XG4gIC5yZXBsYWNlKC90YWJsZS9nLCAvIHswLDN9XFx8Pyg/Ols6XFwtIF0qXFx8KStbXFw6XFwtIF0qXFxuLykgLy8gdGFibGUgY2FuIGludGVycnVwdFxuICAuZ2V0UmVnZXgoKTtcbmNvbnN0IF9wYXJhZ3JhcGggPSAvXihbXlxcbl0rKD86XFxuKD8haHJ8aGVhZGluZ3xsaGVhZGluZ3xibG9ja3F1b3RlfGZlbmNlc3xsaXN0fGh0bWx8dGFibGV8ICtcXG4pW15cXG5dKykqKS87XG5jb25zdCBibG9ja1RleHQgPSAvXlteXFxuXSsvO1xuY29uc3QgX2Jsb2NrTGFiZWwgPSAvKD8hXFxzKlxcXSkoPzpcXFxcW1xcc1xcU118W15cXFtcXF1cXFxcXSkrLztcbmNvbnN0IGRlZiA9IGVkaXQoL14gezAsM31cXFsobGFiZWwpXFxdOiAqKD86XFxuWyBcXHRdKik/KFtePFxcc11bXlxcc10qfDwuKj8+KSg/Oig/OiArKD86XFxuWyBcXHRdKik/fCAqXFxuWyBcXHRdKikodGl0bGUpKT8gKig/Olxcbit8JCkvKVxuICAucmVwbGFjZSgnbGFiZWwnLCBfYmxvY2tMYWJlbClcbiAgLnJlcGxhY2UoJ3RpdGxlJywgLyg/OlwiKD86XFxcXFwiP3xbXlwiXFxcXF0pKlwifCdbXidcXG5dKig/OlxcblteJ1xcbl0rKSpcXG4/J3xcXChbXigpXSpcXCkpLylcbiAgLmdldFJlZ2V4KCk7XG5cbmNvbnN0IGxpc3QgPSBlZGl0KC9eKGJ1bGwpKFsgXFx0XVteXFxuXSs/KT8oPzpcXG58JCkvKVxuICAucmVwbGFjZSgvYnVsbC9nLCBidWxsZXQpXG4gIC5nZXRSZWdleCgpO1xuXG5jb25zdCBfdGFnID0gJ2FkZHJlc3N8YXJ0aWNsZXxhc2lkZXxiYXNlfGJhc2Vmb250fGJsb2NrcXVvdGV8Ym9keXxjYXB0aW9uJ1xuICArICd8Y2VudGVyfGNvbHxjb2xncm91cHxkZHxkZXRhaWxzfGRpYWxvZ3xkaXJ8ZGl2fGRsfGR0fGZpZWxkc2V0fGZpZ2NhcHRpb24nXG4gICsgJ3xmaWd1cmV8Zm9vdGVyfGZvcm18ZnJhbWV8ZnJhbWVzZXR8aFsxLTZdfGhlYWR8aGVhZGVyfGhyfGh0bWx8aWZyYW1lJ1xuICArICd8bGVnZW5kfGxpfGxpbmt8bWFpbnxtZW51fG1lbnVpdGVtfG1ldGF8bmF2fG5vZnJhbWVzfG9sfG9wdGdyb3VwfG9wdGlvbidcbiAgKyAnfHB8cGFyYW18c2VhcmNofHNlY3Rpb258c3VtbWFyeXx0YWJsZXx0Ym9keXx0ZHx0Zm9vdHx0aHx0aGVhZHx0aXRsZSdcbiAgKyAnfHRyfHRyYWNrfHVsJztcbmNvbnN0IF9jb21tZW50ID0gLzwhLS0oPzotPz58W1xcc1xcU10qPyg/Oi0tPnwkKSkvO1xuY29uc3QgaHRtbCA9IGVkaXQoXG4gICdeIHswLDN9KD86JyAvLyBvcHRpb25hbCBpbmRlbnRhdGlvblxuKyAnPChzY3JpcHR8cHJlfHN0eWxlfHRleHRhcmVhKVtcXFxccz5dW1xcXFxzXFxcXFNdKj8oPzo8L1xcXFwxPlteXFxcXG5dKlxcXFxuK3wkKScgLy8gKDEpXG4rICd8Y29tbWVudFteXFxcXG5dKihcXFxcbit8JCknIC8vICgyKVxuKyAnfDxcXFxcP1tcXFxcc1xcXFxTXSo/KD86XFxcXD8+XFxcXG4qfCQpJyAvLyAoMylcbisgJ3w8IVtBLVpdW1xcXFxzXFxcXFNdKj8oPzo+XFxcXG4qfCQpJyAvLyAoNClcbisgJ3w8IVxcXFxbQ0RBVEFcXFxcW1tcXFxcc1xcXFxTXSo/KD86XFxcXF1cXFxcXT5cXFxcbip8JCknIC8vICg1KVxuKyAnfDwvPyh0YWcpKD86ICt8XFxcXG58Lz8+KVtcXFxcc1xcXFxTXSo/KD86KD86XFxcXG5bIFxcdF0qKStcXFxcbnwkKScgLy8gKDYpXG4rICd8PCg/IXNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWEpKFthLXpdW1xcXFx3LV0qKSg/OmF0dHJpYnV0ZSkqPyAqLz8+KD89WyBcXFxcdF0qKD86XFxcXG58JCkpW1xcXFxzXFxcXFNdKj8oPzooPzpcXFxcblsgXFx0XSopK1xcXFxufCQpJyAvLyAoNykgb3BlbiB0YWdcbisgJ3w8Lyg/IXNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWEpW2Etel1bXFxcXHctXSpcXFxccyo+KD89WyBcXFxcdF0qKD86XFxcXG58JCkpW1xcXFxzXFxcXFNdKj8oPzooPzpcXFxcblsgXFx0XSopK1xcXFxufCQpJyAvLyAoNykgY2xvc2luZyB0YWdcbisgJyknLCAnaScpXG4gIC5yZXBsYWNlKCdjb21tZW50JywgX2NvbW1lbnQpXG4gIC5yZXBsYWNlKCd0YWcnLCBfdGFnKVxuICAucmVwbGFjZSgnYXR0cmlidXRlJywgLyArW2EtekEtWjpfXVtcXHcuOi1dKig/OiAqPSAqXCJbXlwiXFxuXSpcInwgKj0gKidbXidcXG5dKid8ICo9ICpbXlxcc1wiJz08PmBdKyk/LylcbiAgLmdldFJlZ2V4KCk7XG5cbmNvbnN0IHBhcmFncmFwaCA9IGVkaXQoX3BhcmFncmFwaClcbiAgLnJlcGxhY2UoJ2hyJywgaHIpXG4gIC5yZXBsYWNlKCdoZWFkaW5nJywgJyB7MCwzfSN7MSw2fSg/OlxcXFxzfCQpJylcbiAgLnJlcGxhY2UoJ3xsaGVhZGluZycsICcnKSAvLyBzZXRleHQgaGVhZGluZ3MgZG9uJ3QgaW50ZXJydXB0IGNvbW1vbm1hcmsgcGFyYWdyYXBoc1xuICAucmVwbGFjZSgnfHRhYmxlJywgJycpXG4gIC5yZXBsYWNlKCdibG9ja3F1b3RlJywgJyB7MCwzfT4nKVxuICAucmVwbGFjZSgnZmVuY2VzJywgJyB7MCwzfSg/OmB7Myx9KD89W15gXFxcXG5dKlxcXFxuKXx+ezMsfSlbXlxcXFxuXSpcXFxcbicpXG4gIC5yZXBsYWNlKCdsaXN0JywgJyB7MCwzfSg/OlsqKy1dfDFbLildKVsgXFxcXHRdJykgLy8gb25seSBsaXN0cyBzdGFydGluZyBmcm9tIDEgY2FuIGludGVycnVwdFxuICAucmVwbGFjZSgnaHRtbCcsICc8Lz8oPzp0YWcpKD86ICt8XFxcXG58Lz8+KXw8KD86c2NyaXB0fHByZXxzdHlsZXx0ZXh0YXJlYXwhLS0pJylcbiAgLnJlcGxhY2UoJ3RhZycsIF90YWcpIC8vIHBhcnMgY2FuIGJlIGludGVycnVwdGVkIGJ5IHR5cGUgKDYpIGh0bWwgYmxvY2tzXG4gIC5nZXRSZWdleCgpO1xuXG5jb25zdCBibG9ja3F1b3RlID0gZWRpdCgvXiggezAsM30+ID8ocGFyYWdyYXBofFteXFxuXSopKD86XFxufCQpKSsvKVxuICAucmVwbGFjZSgncGFyYWdyYXBoJywgcGFyYWdyYXBoKVxuICAuZ2V0UmVnZXgoKTtcblxuLyoqXG4gKiBOb3JtYWwgQmxvY2sgR3JhbW1hclxuICovXG5cbmNvbnN0IGJsb2NrTm9ybWFsID0ge1xuICBibG9ja3F1b3RlLFxuICBjb2RlOiBibG9ja0NvZGUsXG4gIGRlZixcbiAgZmVuY2VzLFxuICBoZWFkaW5nLFxuICBocixcbiAgaHRtbCxcbiAgbGhlYWRpbmcsXG4gIGxpc3QsXG4gIG5ld2xpbmUsXG4gIHBhcmFncmFwaCxcbiAgdGFibGU6IG5vb3BUZXN0LFxuICB0ZXh0OiBibG9ja1RleHQsXG59O1xuXG50eXBlIEJsb2NrS2V5cyA9IGtleW9mIHR5cGVvZiBibG9ja05vcm1hbDtcblxuLyoqXG4gKiBHRk0gQmxvY2sgR3JhbW1hclxuICovXG5cbmNvbnN0IGdmbVRhYmxlID0gZWRpdChcbiAgJ14gKihbXlxcXFxuIF0uKilcXFxcbicgLy8gSGVhZGVyXG4rICcgezAsM30oKD86XFxcXHwgKik/Oj8tKzo/ICooPzpcXFxcfCAqOj8tKzo/ICopKig/OlxcXFx8ICopPyknIC8vIEFsaWduXG4rICcoPzpcXFxcbigoPzooPyEgKlxcXFxufGhyfGhlYWRpbmd8YmxvY2txdW90ZXxjb2RlfGZlbmNlc3xsaXN0fGh0bWwpLiooPzpcXFxcbnwkKSkqKVxcXFxuKnwkKScpIC8vIENlbGxzXG4gIC5yZXBsYWNlKCdocicsIGhyKVxuICAucmVwbGFjZSgnaGVhZGluZycsICcgezAsM30jezEsNn0oPzpcXFxcc3wkKScpXG4gIC5yZXBsYWNlKCdibG9ja3F1b3RlJywgJyB7MCwzfT4nKVxuICAucmVwbGFjZSgnY29kZScsICcoPzogezR9fCB7MCwzfVxcdClbXlxcXFxuXScpXG4gIC5yZXBsYWNlKCdmZW5jZXMnLCAnIHswLDN9KD86YHszLH0oPz1bXmBcXFxcbl0qXFxcXG4pfH57Myx9KVteXFxcXG5dKlxcXFxuJylcbiAgLnJlcGxhY2UoJ2xpc3QnLCAnIHswLDN9KD86WyorLV18MVsuKV0pWyBcXFxcdF0nKSAvLyBvbmx5IGxpc3RzIHN0YXJ0aW5nIGZyb20gMSBjYW4gaW50ZXJydXB0XG4gIC5yZXBsYWNlKCdodG1sJywgJzwvPyg/OnRhZykoPzogK3xcXFxcbnwvPz4pfDwoPzpzY3JpcHR8cHJlfHN0eWxlfHRleHRhcmVhfCEtLSknKVxuICAucmVwbGFjZSgndGFnJywgX3RhZykgLy8gdGFibGVzIGNhbiBiZSBpbnRlcnJ1cHRlZCBieSB0eXBlICg2KSBodG1sIGJsb2Nrc1xuICAuZ2V0UmVnZXgoKTtcblxuY29uc3QgYmxvY2tHZm06IFJlY29yZDxCbG9ja0tleXMsIFJlZ0V4cD4gPSB7XG4gIC4uLmJsb2NrTm9ybWFsLFxuICBsaGVhZGluZzogbGhlYWRpbmdHZm0sXG4gIHRhYmxlOiBnZm1UYWJsZSxcbiAgcGFyYWdyYXBoOiBlZGl0KF9wYXJhZ3JhcGgpXG4gICAgLnJlcGxhY2UoJ2hyJywgaHIpXG4gICAgLnJlcGxhY2UoJ2hlYWRpbmcnLCAnIHswLDN9I3sxLDZ9KD86XFxcXHN8JCknKVxuICAgIC5yZXBsYWNlKCd8bGhlYWRpbmcnLCAnJykgLy8gc2V0ZXh0IGhlYWRpbmdzIGRvbid0IGludGVycnVwdCBjb21tb25tYXJrIHBhcmFncmFwaHNcbiAgICAucmVwbGFjZSgndGFibGUnLCBnZm1UYWJsZSkgLy8gaW50ZXJydXB0IHBhcmFncmFwaHMgd2l0aCB0YWJsZVxuICAgIC5yZXBsYWNlKCdibG9ja3F1b3RlJywgJyB7MCwzfT4nKVxuICAgIC5yZXBsYWNlKCdmZW5jZXMnLCAnIHswLDN9KD86YHszLH0oPz1bXmBcXFxcbl0qXFxcXG4pfH57Myx9KVteXFxcXG5dKlxcXFxuJylcbiAgICAucmVwbGFjZSgnbGlzdCcsICcgezAsM30oPzpbKistXXwxWy4pXSlbIFxcXFx0XScpIC8vIG9ubHkgbGlzdHMgc3RhcnRpbmcgZnJvbSAxIGNhbiBpbnRlcnJ1cHRcbiAgICAucmVwbGFjZSgnaHRtbCcsICc8Lz8oPzp0YWcpKD86ICt8XFxcXG58Lz8+KXw8KD86c2NyaXB0fHByZXxzdHlsZXx0ZXh0YXJlYXwhLS0pJylcbiAgICAucmVwbGFjZSgndGFnJywgX3RhZykgLy8gcGFycyBjYW4gYmUgaW50ZXJydXB0ZWQgYnkgdHlwZSAoNikgaHRtbCBibG9ja3NcbiAgICAuZ2V0UmVnZXgoKSxcbn07XG5cbi8qKlxuICogUGVkYW50aWMgZ3JhbW1hciAob3JpZ2luYWwgSm9obiBHcnViZXIncyBsb29zZSBtYXJrZG93biBzcGVjaWZpY2F0aW9uKVxuICovXG5cbmNvbnN0IGJsb2NrUGVkYW50aWM6IFJlY29yZDxCbG9ja0tleXMsIFJlZ0V4cD4gPSB7XG4gIC4uLmJsb2NrTm9ybWFsLFxuICBodG1sOiBlZGl0KFxuICAgICdeICooPzpjb21tZW50ICooPzpcXFxcbnxcXFxccyokKSdcbiAgICArICd8PCh0YWcpW1xcXFxzXFxcXFNdKz88L1xcXFwxPiAqKD86XFxcXG57Mix9fFxcXFxzKiQpJyAvLyBjbG9zZWQgdGFnXG4gICAgKyAnfDx0YWcoPzpcIlteXCJdKlwifFxcJ1teXFwnXSpcXCd8XFxcXHNbXlxcJ1wiLz5cXFxcc10qKSo/Lz8+ICooPzpcXFxcbnsyLH18XFxcXHMqJCkpJylcbiAgICAucmVwbGFjZSgnY29tbWVudCcsIF9jb21tZW50KVxuICAgIC5yZXBsYWNlKC90YWcvZywgJyg/ISg/OidcbiAgICAgICsgJ2F8ZW18c3Ryb25nfHNtYWxsfHN8Y2l0ZXxxfGRmbnxhYmJyfGRhdGF8dGltZXxjb2RlfHZhcnxzYW1wfGtiZHxzdWInXG4gICAgICArICd8c3VwfGl8Ynx1fG1hcmt8cnVieXxydHxycHxiZGl8YmRvfHNwYW58YnJ8d2JyfGluc3xkZWx8aW1nKSdcbiAgICAgICsgJ1xcXFxiKVxcXFx3Kyg/ITp8W15cXFxcd1xcXFxzQF0qQClcXFxcYicpXG4gICAgLmdldFJlZ2V4KCksXG4gIGRlZjogL14gKlxcWyhbXlxcXV0rKVxcXTogKjw/KFteXFxzPl0rKT4/KD86ICsoW1wiKF1bXlxcbl0rW1wiKV0pKT8gKig/Olxcbit8JCkvLFxuICBoZWFkaW5nOiAvXigjezEsNn0pKC4qKSg/Olxcbit8JCkvLFxuICBmZW5jZXM6IG5vb3BUZXN0LCAvLyBmZW5jZXMgbm90IHN1cHBvcnRlZFxuICBsaGVhZGluZzogL14oLis/KVxcbiB7MCwzfSg9K3wtKykgKig/Olxcbit8JCkvLFxuICBwYXJhZ3JhcGg6IGVkaXQoX3BhcmFncmFwaClcbiAgICAucmVwbGFjZSgnaHInLCBocilcbiAgICAucmVwbGFjZSgnaGVhZGluZycsICcgKiN7MSw2fSAqW15cXG5dJylcbiAgICAucmVwbGFjZSgnbGhlYWRpbmcnLCBsaGVhZGluZylcbiAgICAucmVwbGFjZSgnfHRhYmxlJywgJycpXG4gICAgLnJlcGxhY2UoJ2Jsb2NrcXVvdGUnLCAnIHswLDN9PicpXG4gICAgLnJlcGxhY2UoJ3xmZW5jZXMnLCAnJylcbiAgICAucmVwbGFjZSgnfGxpc3QnLCAnJylcbiAgICAucmVwbGFjZSgnfGh0bWwnLCAnJylcbiAgICAucmVwbGFjZSgnfHRhZycsICcnKVxuICAgIC5nZXRSZWdleCgpLFxufTtcblxuLyoqXG4gKiBJbmxpbmUtTGV2ZWwgR3JhbW1hclxuICovXG5cbmNvbnN0IGVzY2FwZSA9IC9eXFxcXChbIVwiIyQlJicoKSorLFxcLS4vOjs8PT4/QFxcW1xcXVxcXFxeX2B7fH1+XSkvO1xuY29uc3QgaW5saW5lQ29kZSA9IC9eKGArKShbXmBdfFteYF1bXFxzXFxTXSo/W15gXSlcXDEoPyFgKS87XG5jb25zdCBiciA9IC9eKCB7Mix9fFxcXFwpXFxuKD8hXFxzKiQpLztcbmNvbnN0IGlubGluZVRleHQgPSAvXihgK3xbXmBdKSg/Oig/PSB7Mix9XFxuKXxbXFxzXFxTXSo/KD86KD89W1xcXFw8IVxcW2AqX118XFxiX3wkKXxbXiBdKD89IHsyLH1cXG4pKSkvO1xuXG4vLyBsaXN0IG9mIHVuaWNvZGUgcHVuY3R1YXRpb24gbWFya3MsIHBsdXMgYW55IG1pc3NpbmcgY2hhcmFjdGVycyBmcm9tIENvbW1vbk1hcmsgc3BlY1xuY29uc3QgX3B1bmN0dWF0aW9uID0gL1tcXHB7UH1cXHB7U31dL3U7XG5jb25zdCBfcHVuY3R1YXRpb25PclNwYWNlID0gL1tcXHNcXHB7UH1cXHB7U31dL3U7XG5jb25zdCBfbm90UHVuY3R1YXRpb25PclNwYWNlID0gL1teXFxzXFxwe1B9XFxwe1N9XS91O1xuY29uc3QgcHVuY3R1YXRpb24gPSBlZGl0KC9eKCg/IVsqX10pcHVuY3RTcGFjZSkvLCAndScpXG4gIC5yZXBsYWNlKC9wdW5jdFNwYWNlL2csIF9wdW5jdHVhdGlvbk9yU3BhY2UpLmdldFJlZ2V4KCk7XG5cbi8vIEdGTSBhbGxvd3MgfiBpbnNpZGUgc3Ryb25nIGFuZCBlbSBmb3Igc3RyaWtldGhyb3VnaFxuY29uc3QgX3B1bmN0dWF0aW9uR2ZtU3Ryb25nRW0gPSAvKD8hfilbXFxwe1B9XFxwe1N9XS91O1xuY29uc3QgX3B1bmN0dWF0aW9uT3JTcGFjZUdmbVN0cm9uZ0VtID0gLyg/IX4pW1xcc1xccHtQfVxccHtTfV0vdTtcbmNvbnN0IF9ub3RQdW5jdHVhdGlvbk9yU3BhY2VHZm1TdHJvbmdFbSA9IC8oPzpbXlxcc1xccHtQfVxccHtTfV18fikvdTtcblxuLy8gc2VxdWVuY2VzIGVtIHNob3VsZCBza2lwIG92ZXIgW3RpdGxlXShsaW5rKSwgYGNvZGVgLCA8aHRtbD5cbmNvbnN0IGJsb2NrU2tpcCA9IGVkaXQoL2xpbmt8cHJlY29kZS1jb2RlfGh0bWwvLCAnZycpXG4gIC5yZXBsYWNlKCdsaW5rJywgL1xcWyg/OlteXFxbXFxdYF18KD88YT5gKylbXmBdK1xcazxhPig/IWApKSo/XFxdXFwoKD86XFxcXFtcXHNcXFNdfFteXFxcXFxcKFxcKV18XFwoKD86XFxcXFtcXHNcXFNdfFteXFxcXFxcKFxcKV0pKlxcKSkqXFwpLylcbiAgLnJlcGxhY2UoJ3ByZWNvZGUtJywgc3VwcG9ydHNMb29rYmVoaW5kID8gJyg/PCFgKSgpJyA6ICcoXl58W15gXSknKVxuICAucmVwbGFjZSgnY29kZScsIC8oPzxiPmArKVteYF0rXFxrPGI+KD8hYCkvKVxuICAucmVwbGFjZSgnaHRtbCcsIC88KD8hIClbXjw+XSo/Pi8pXG4gIC5nZXRSZWdleCgpO1xuXG5jb25zdCBlbVN0cm9uZ0xEZWxpbUNvcmUgPSAvXig/OlxcKisoPzooKD8hXFwqKXB1bmN0KXwoW15cXHMqXSkpPyl8Xl8rKD86KCg/IV8pcHVuY3QpfChbXlxcc19dKSk/LztcblxuY29uc3QgZW1TdHJvbmdMRGVsaW0gPSBlZGl0KGVtU3Ryb25nTERlbGltQ29yZSwgJ3UnKVxuICAucmVwbGFjZSgvcHVuY3QvZywgX3B1bmN0dWF0aW9uKVxuICAuZ2V0UmVnZXgoKTtcblxuY29uc3QgZW1TdHJvbmdMRGVsaW1HZm0gPSBlZGl0KGVtU3Ryb25nTERlbGltQ29yZSwgJ3UnKVxuICAucmVwbGFjZSgvcHVuY3QvZywgX3B1bmN0dWF0aW9uR2ZtU3Ryb25nRW0pXG4gIC5nZXRSZWdleCgpO1xuXG5jb25zdCBlbVN0cm9uZ1JEZWxpbUFzdENvcmUgPVxuICAnXlteXypdKj9fX1teXypdKj9cXFxcKlteXypdKj8oPz1fXyknIC8vIFNraXAgb3JwaGFuIGluc2lkZSBzdHJvbmdcbisgJ3xbXipdKyg/PVteKl0pJyAvLyBDb25zdW1lIHRvIGRlbGltXG4rICd8KD8hXFxcXCopcHVuY3QoXFxcXCorKSg/PVtcXFxcc118JCknIC8vICgxKSAjKioqIGNhbiBvbmx5IGJlIGEgUmlnaHQgRGVsaW1pdGVyXG4rICd8bm90UHVuY3RTcGFjZShcXFxcKispKD8hXFxcXCopKD89cHVuY3RTcGFjZXwkKScgLy8gKDIpIGEqKiojLCBhKioqIGNhbiBvbmx5IGJlIGEgUmlnaHQgRGVsaW1pdGVyXG4rICd8KD8hXFxcXCopcHVuY3RTcGFjZShcXFxcKispKD89bm90UHVuY3RTcGFjZSknIC8vICgzKSAjKioqYSwgKioqYSBjYW4gb25seSBiZSBMZWZ0IERlbGltaXRlclxuKyAnfFtcXFxcc10oXFxcXCorKSg/IVxcXFwqKSg/PXB1bmN0KScgLy8gKDQpICoqKiMgY2FuIG9ubHkgYmUgTGVmdCBEZWxpbWl0ZXJcbisgJ3woPyFcXFxcKilwdW5jdChcXFxcKispKD8hXFxcXCopKD89cHVuY3QpJyAvLyAoNSkgIyoqKiMgY2FuIGJlIGVpdGhlciBMZWZ0IG9yIFJpZ2h0IERlbGltaXRlclxuKyAnfG5vdFB1bmN0U3BhY2UoXFxcXCorKSg/PW5vdFB1bmN0U3BhY2UpJzsgLy8gKDYpIGEqKiphIGNhbiBiZSBlaXRoZXIgTGVmdCBvciBSaWdodCBEZWxpbWl0ZXJcblxuY29uc3QgZW1TdHJvbmdSRGVsaW1Bc3QgPSBlZGl0KGVtU3Ryb25nUkRlbGltQXN0Q29yZSwgJ2d1JylcbiAgLnJlcGxhY2UoL25vdFB1bmN0U3BhY2UvZywgX25vdFB1bmN0dWF0aW9uT3JTcGFjZSlcbiAgLnJlcGxhY2UoL3B1bmN0U3BhY2UvZywgX3B1bmN0dWF0aW9uT3JTcGFjZSlcbiAgLnJlcGxhY2UoL3B1bmN0L2csIF9wdW5jdHVhdGlvbilcbiAgLmdldFJlZ2V4KCk7XG5cbmNvbnN0IGVtU3Ryb25nUkRlbGltQXN0R2ZtID0gZWRpdChlbVN0cm9uZ1JEZWxpbUFzdENvcmUsICdndScpXG4gIC5yZXBsYWNlKC9ub3RQdW5jdFNwYWNlL2csIF9ub3RQdW5jdHVhdGlvbk9yU3BhY2VHZm1TdHJvbmdFbSlcbiAgLnJlcGxhY2UoL3B1bmN0U3BhY2UvZywgX3B1bmN0dWF0aW9uT3JTcGFjZUdmbVN0cm9uZ0VtKVxuICAucmVwbGFjZSgvcHVuY3QvZywgX3B1bmN0dWF0aW9uR2ZtU3Ryb25nRW0pXG4gIC5nZXRSZWdleCgpO1xuXG4vLyAoNikgTm90IGFsbG93ZWQgZm9yIF9cbmNvbnN0IGVtU3Ryb25nUkRlbGltVW5kID0gZWRpdChcbiAgJ15bXl8qXSo/XFxcXCpcXFxcKlteXypdKj9fW15fKl0qPyg/PVxcXFwqXFxcXCopJyAvLyBTa2lwIG9ycGhhbiBpbnNpZGUgc3Ryb25nXG4rICd8W15fXSsoPz1bXl9dKScgLy8gQ29uc3VtZSB0byBkZWxpbVxuKyAnfCg/IV8pcHVuY3QoXyspKD89W1xcXFxzXXwkKScgLy8gKDEpICNfX18gY2FuIG9ubHkgYmUgYSBSaWdodCBEZWxpbWl0ZXJcbisgJ3xub3RQdW5jdFNwYWNlKF8rKSg/IV8pKD89cHVuY3RTcGFjZXwkKScgLy8gKDIpIGFfX18jLCBhX19fIGNhbiBvbmx5IGJlIGEgUmlnaHQgRGVsaW1pdGVyXG4rICd8KD8hXylwdW5jdFNwYWNlKF8rKSg/PW5vdFB1bmN0U3BhY2UpJyAvLyAoMykgI19fX2EsIF9fX2EgY2FuIG9ubHkgYmUgTGVmdCBEZWxpbWl0ZXJcbisgJ3xbXFxcXHNdKF8rKSg/IV8pKD89cHVuY3QpJyAvLyAoNCkgX19fIyBjYW4gb25seSBiZSBMZWZ0IERlbGltaXRlclxuKyAnfCg/IV8pcHVuY3QoXyspKD8hXykoPz1wdW5jdCknLCAnZ3UnKSAvLyAoNSkgI19fXyMgY2FuIGJlIGVpdGhlciBMZWZ0IG9yIFJpZ2h0IERlbGltaXRlclxuICAucmVwbGFjZSgvbm90UHVuY3RTcGFjZS9nLCBfbm90UHVuY3R1YXRpb25PclNwYWNlKVxuICAucmVwbGFjZSgvcHVuY3RTcGFjZS9nLCBfcHVuY3R1YXRpb25PclNwYWNlKVxuICAucmVwbGFjZSgvcHVuY3QvZywgX3B1bmN0dWF0aW9uKVxuICAuZ2V0UmVnZXgoKTtcblxuLy8gVGlsZGUgbGVmdCBkZWxpbWl0ZXIgZm9yIHN0cmlrZXRocm91Z2ggKHNpbWlsYXIgdG8gZW1TdHJvbmdMRGVsaW0gZm9yIGFzdGVyaXNrKVxuY29uc3QgZGVsTERlbGltID0gZWRpdCgvXn5+Pyg/OigoPyF+KXB1bmN0KXxbXlxcc35dKS8sICd1JylcbiAgLnJlcGxhY2UoL3B1bmN0L2csIF9wdW5jdHVhdGlvbilcbiAgLmdldFJlZ2V4KCk7XG5cbi8vIFRpbGRlIGRlbGltaXRlciBwYXR0ZXJucyBmb3Igc3RyaWtldGhyb3VnaCAoc2ltaWxhciB0byBhc3RlcmlzaylcbmNvbnN0IGRlbFJEZWxpbUNvcmUgPVxuICAnXltefl0rKD89W15+XSknIC8vIENvbnN1bWUgdG8gZGVsaW1cbisgJ3woPyF+KXB1bmN0KH5+PykoPz1bXFxcXHNdfCQpJyAvLyAoMSkgI35+IGNhbiBvbmx5IGJlIGEgUmlnaHQgRGVsaW1pdGVyXG4rICd8bm90UHVuY3RTcGFjZSh+fj8pKD8hfikoPz1wdW5jdFNwYWNlfCQpJyAvLyAoMikgYX5+IywgYX5+IGNhbiBvbmx5IGJlIGEgUmlnaHQgRGVsaW1pdGVyXG4rICd8KD8hfilwdW5jdFNwYWNlKH5+PykoPz1ub3RQdW5jdFNwYWNlKScgLy8gKDMpICN+fmEsIH5+YSBjYW4gb25seSBiZSBMZWZ0IERlbGltaXRlclxuKyAnfFtcXFxcc10ofn4/KSg/IX4pKD89cHVuY3QpJyAvLyAoNCkgfn4jIGNhbiBvbmx5IGJlIExlZnQgRGVsaW1pdGVyXG4rICd8KD8hfilwdW5jdCh+fj8pKD8hfikoPz1wdW5jdCknIC8vICg1KSAjfn4jIGNhbiBiZSBlaXRoZXIgTGVmdCBvciBSaWdodCBEZWxpbWl0ZXJcbisgJ3xub3RQdW5jdFNwYWNlKH5+PykoPz1ub3RQdW5jdFNwYWNlKSc7IC8vICg2KSBhfn5hIGNhbiBiZSBlaXRoZXIgTGVmdCBvciBSaWdodCBEZWxpbWl0ZXJcblxuY29uc3QgZGVsUkRlbGltID0gZWRpdChkZWxSRGVsaW1Db3JlLCAnZ3UnKVxuICAucmVwbGFjZSgvbm90UHVuY3RTcGFjZS9nLCBfbm90UHVuY3R1YXRpb25PclNwYWNlKVxuICAucmVwbGFjZSgvcHVuY3RTcGFjZS9nLCBfcHVuY3R1YXRpb25PclNwYWNlKVxuICAucmVwbGFjZSgvcHVuY3QvZywgX3B1bmN0dWF0aW9uKVxuICAuZ2V0UmVnZXgoKTtcblxuY29uc3QgYW55UHVuY3R1YXRpb24gPSBlZGl0KC9cXFxcKHB1bmN0KS8sICdndScpXG4gIC5yZXBsYWNlKC9wdW5jdC9nLCBfcHVuY3R1YXRpb24pXG4gIC5nZXRSZWdleCgpO1xuXG5jb25zdCBhdXRvbGluayA9IGVkaXQoL148KHNjaGVtZTpbXlxcc1xceDAwLVxceDFmPD5dKnxlbWFpbCk+LylcbiAgLnJlcGxhY2UoJ3NjaGVtZScsIC9bYS16QS1aXVthLXpBLVowLTkrLi1dezEsMzF9LylcbiAgLnJlcGxhY2UoJ2VtYWlsJywgL1thLXpBLVowLTkuISMkJSYnKisvPT9eX2B7fH1+LV0rKEApW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSk/KD86XFwuW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSk/KSsoPyFbLV9dKS8pXG4gIC5nZXRSZWdleCgpO1xuXG5jb25zdCBfaW5saW5lQ29tbWVudCA9IGVkaXQoX2NvbW1lbnQpLnJlcGxhY2UoJyg/Oi0tPnwkKScsICctLT4nKS5nZXRSZWdleCgpO1xuY29uc3QgdGFnID0gZWRpdChcbiAgJ15jb21tZW50J1xuICAgICsgJ3xePC9bYS16QS1aXVtcXFxcdzotXSpcXFxccyo+JyAvLyBzZWxmLWNsb3NpbmcgdGFnXG4gICAgKyAnfF48W2EtekEtWl1bXFxcXHctXSooPzphdHRyaWJ1dGUpKj9cXFxccyovPz4nIC8vIG9wZW4gdGFnXG4gICAgKyAnfF48XFxcXD9bXFxcXHNcXFxcU10qP1xcXFw/PicgLy8gcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiwgZS5nLiA8P3BocCA/PlxuICAgICsgJ3xePCFbYS16QS1aXStcXFxcc1tcXFxcc1xcXFxTXSo/PicgLy8gZGVjbGFyYXRpb24sIGUuZy4gPCFET0NUWVBFIGh0bWw+XG4gICAgKyAnfF48IVxcXFxbQ0RBVEFcXFxcW1tcXFxcc1xcXFxTXSo/XFxcXF1cXFxcXT4nKSAvLyBDREFUQSBzZWN0aW9uXG4gIC5yZXBsYWNlKCdjb21tZW50JywgX2lubGluZUNvbW1lbnQpXG4gIC5yZXBsYWNlKCdhdHRyaWJ1dGUnLCAvXFxzK1thLXpBLVo6X11bXFx3LjotXSooPzpcXHMqPVxccypcIlteXCJdKlwifFxccyo9XFxzKidbXiddKid8XFxzKj1cXHMqW15cXHNcIic9PD5gXSspPy8pXG4gIC5nZXRSZWdleCgpO1xuXG5jb25zdCBfaW5saW5lTGFiZWwgPSAvKD86XFxbKD86XFxcXFtcXHNcXFNdfFteXFxbXFxdXFxcXF0pKlxcXXxcXFxcW1xcc1xcU118YCsoPyFgKVteYF0qP2ArKD8hYCl8YGArKD89XFxdKXxbXlxcW1xcXVxcXFxgXSkqPy87XG5cbmNvbnN0IGxpbmsgPSBlZGl0KC9eIT9cXFsobGFiZWwpXFxdXFwoXFxzKihocmVmKSg/Oig/OlsgXFx0XSsoPzpcXG5bIFxcdF0qKT98XFxuWyBcXHRdKikodGl0bGUpKT9cXHMqXFwpLylcbiAgLnJlcGxhY2UoJ2xhYmVsJywgX2lubGluZUxhYmVsKVxuICAucmVwbGFjZSgnaHJlZicsIC88KD86XFxcXC58W15cXG48PlxcXFxdKSs+fFteIFxcdFxcblxceDAwLVxceDFmXSovKVxuICAucmVwbGFjZSgndGl0bGUnLCAvXCIoPzpcXFxcXCI/fFteXCJcXFxcXSkqXCJ8Jyg/OlxcXFwnP3xbXidcXFxcXSkqJ3xcXCgoPzpcXFxcXFwpP3xbXilcXFxcXSkqXFwpLylcbiAgLmdldFJlZ2V4KCk7XG5cbmNvbnN0IHJlZmxpbmsgPSBlZGl0KC9eIT9cXFsobGFiZWwpXFxdXFxbKHJlZilcXF0vKVxuICAucmVwbGFjZSgnbGFiZWwnLCBfaW5saW5lTGFiZWwpXG4gIC5yZXBsYWNlKCdyZWYnLCBfYmxvY2tMYWJlbClcbiAgLmdldFJlZ2V4KCk7XG5cbmNvbnN0IG5vbGluayA9IGVkaXQoL14hP1xcWyhyZWYpXFxdKD86XFxbXFxdKT8vKVxuICAucmVwbGFjZSgncmVmJywgX2Jsb2NrTGFiZWwpXG4gIC5nZXRSZWdleCgpO1xuXG5jb25zdCByZWZsaW5rU2VhcmNoID0gZWRpdCgncmVmbGlua3xub2xpbmsoPyFcXFxcKCknLCAnZycpXG4gIC5yZXBsYWNlKCdyZWZsaW5rJywgcmVmbGluaylcbiAgLnJlcGxhY2UoJ25vbGluaycsIG5vbGluaylcbiAgLmdldFJlZ2V4KCk7XG5cbmNvbnN0IF9jYXNlSW5zZW5zaXRpdmVQcm90b2NvbCA9IC9baEhdW3RUXVt0VF1bcFBdW3NTXT98W2ZGXVt0VF1bcFBdLztcblxuLyoqXG4gKiBOb3JtYWwgSW5saW5lIEdyYW1tYXJcbiAqL1xuXG5jb25zdCBpbmxpbmVOb3JtYWwgPSB7XG4gIF9iYWNrcGVkYWw6IG5vb3BUZXN0LCAvLyBvbmx5IHVzZWQgZm9yIEdGTSB1cmxcbiAgYW55UHVuY3R1YXRpb24sXG4gIGF1dG9saW5rLFxuICBibG9ja1NraXAsXG4gIGJyLFxuICBjb2RlOiBpbmxpbmVDb2RlLFxuICBkZWw6IG5vb3BUZXN0LFxuICBkZWxMRGVsaW06IG5vb3BUZXN0LFxuICBkZWxSRGVsaW06IG5vb3BUZXN0LFxuICBlbVN0cm9uZ0xEZWxpbSxcbiAgZW1TdHJvbmdSRGVsaW1Bc3QsXG4gIGVtU3Ryb25nUkRlbGltVW5kLFxuICBlc2NhcGUsXG4gIGxpbmssXG4gIG5vbGluayxcbiAgcHVuY3R1YXRpb24sXG4gIHJlZmxpbmssXG4gIHJlZmxpbmtTZWFyY2gsXG4gIHRhZyxcbiAgdGV4dDogaW5saW5lVGV4dCxcbiAgdXJsOiBub29wVGVzdCxcbn07XG5cbnR5cGUgSW5saW5lS2V5cyA9IGtleW9mIHR5cGVvZiBpbmxpbmVOb3JtYWw7XG5cbi8qKlxuICogUGVkYW50aWMgSW5saW5lIEdyYW1tYXJcbiAqL1xuXG5jb25zdCBpbmxpbmVQZWRhbnRpYzogUmVjb3JkPElubGluZUtleXMsIFJlZ0V4cD4gPSB7XG4gIC4uLmlubGluZU5vcm1hbCxcbiAgbGluazogZWRpdCgvXiE/XFxbKGxhYmVsKVxcXVxcKCguKj8pXFwpLylcbiAgICAucmVwbGFjZSgnbGFiZWwnLCBfaW5saW5lTGFiZWwpXG4gICAgLmdldFJlZ2V4KCksXG4gIHJlZmxpbms6IGVkaXQoL14hP1xcWyhsYWJlbClcXF1cXHMqXFxbKFteXFxdXSopXFxdLylcbiAgICAucmVwbGFjZSgnbGFiZWwnLCBfaW5saW5lTGFiZWwpXG4gICAgLmdldFJlZ2V4KCksXG59O1xuXG4vKipcbiAqIEdGTSBJbmxpbmUgR3JhbW1hclxuICovXG5cbmNvbnN0IGlubGluZUdmbTogUmVjb3JkPElubGluZUtleXMsIFJlZ0V4cD4gPSB7XG4gIC4uLmlubGluZU5vcm1hbCxcbiAgZW1TdHJvbmdSRGVsaW1Bc3Q6IGVtU3Ryb25nUkRlbGltQXN0R2ZtLFxuICBlbVN0cm9uZ0xEZWxpbTogZW1TdHJvbmdMRGVsaW1HZm0sXG4gIGRlbExEZWxpbSxcbiAgZGVsUkRlbGltLFxuICB1cmw6IGVkaXQoL14oKD86cHJvdG9jb2wpOlxcL1xcL3x3d3dcXC4pKD86W2EtekEtWjAtOVxcLV0rXFwuPykrW15cXHM8XSp8XmVtYWlsLylcbiAgICAucmVwbGFjZSgncHJvdG9jb2wnLCBfY2FzZUluc2Vuc2l0aXZlUHJvdG9jb2wpXG4gICAgLnJlcGxhY2UoJ2VtYWlsJywgL1tBLVphLXowLTkuXystXSsoQClbYS16QS1aMC05LV9dKyg/OlxcLlthLXpBLVowLTktX10qW2EtekEtWjAtOV0pKyg/IVstX10pLylcbiAgICAuZ2V0UmVnZXgoKSxcbiAgX2JhY2twZWRhbDogLyg/OltePyEuLDo7Kl8nXCJ+KCkmXSt8XFwoW14pXSpcXCl8Jig/IVthLXpBLVowLTldKzskKXxbPyEuLDo7Kl8nXCJ+KV0rKD8hJCkpKy8sXG4gIGRlbDogL14ofn4/KSg/PVteXFxzfl0pKCg/OlxcXFxbXFxzXFxTXXxbXlxcXFxdKSo/KD86XFxcXFtcXHNcXFNdfFteXFxzflxcXFxdKSlcXDEoPz1bXn5dfCQpLyxcbiAgdGV4dDogZWRpdCgvXihbYH5dK3xbXmB+XSkoPzooPz0gezIsfVxcbil8KD89W2EtekEtWjAtOS4hIyQlJicqK1xcLz0/X2B7XFx8fX4tXStAKXxbXFxzXFxTXSo/KD86KD89W1xcXFw8IVxcW2Aqfl9dfFxcYl98cHJvdG9jb2w6XFwvXFwvfHd3d1xcLnwkKXxbXiBdKD89IHsyLH1cXG4pfFteYS16QS1aMC05LiEjJCUmJyorXFwvPT9fYHtcXHx9fi1dKD89W2EtekEtWjAtOS4hIyQlJicqK1xcLz0/X2B7XFx8fX4tXStAKSkpLylcbiAgICAucmVwbGFjZSgncHJvdG9jb2wnLCBfY2FzZUluc2Vuc2l0aXZlUHJvdG9jb2wpXG4gICAgLmdldFJlZ2V4KCksXG59O1xuXG4vKipcbiAqIEdGTSArIExpbmUgQnJlYWtzIElubGluZSBHcmFtbWFyXG4gKi9cblxuY29uc3QgaW5saW5lQnJlYWtzOiBSZWNvcmQ8SW5saW5lS2V5cywgUmVnRXhwPiA9IHtcbiAgLi4uaW5saW5lR2ZtLFxuICBicjogZWRpdChicikucmVwbGFjZSgnezIsfScsICcqJykuZ2V0UmVnZXgoKSxcbiAgdGV4dDogZWRpdChpbmxpbmVHZm0udGV4dClcbiAgICAucmVwbGFjZSgnXFxcXGJfJywgJ1xcXFxiX3wgezIsfVxcXFxuJylcbiAgICAucmVwbGFjZSgvXFx7MixcXH0vZywgJyonKVxuICAgIC5nZXRSZWdleCgpLFxufTtcblxuLyoqXG4gKiBleHBvcnRzXG4gKi9cblxuZXhwb3J0IGNvbnN0IGJsb2NrID0ge1xuICBub3JtYWw6IGJsb2NrTm9ybWFsLFxuICBnZm06IGJsb2NrR2ZtLFxuICBwZWRhbnRpYzogYmxvY2tQZWRhbnRpYyxcbn07XG5cbmV4cG9ydCBjb25zdCBpbmxpbmUgPSB7XG4gIG5vcm1hbDogaW5saW5lTm9ybWFsLFxuICBnZm06IGlubGluZUdmbSxcbiAgYnJlYWtzOiBpbmxpbmVCcmVha3MsXG4gIHBlZGFudGljOiBpbmxpbmVQZWRhbnRpYyxcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVsZXMge1xuICBvdGhlcjogdHlwZW9mIG90aGVyXG4gIGJsb2NrOiBSZWNvcmQ8QmxvY2tLZXlzLCBSZWdFeHA+XG4gIGlubGluZTogUmVjb3JkPElubGluZUtleXMsIFJlZ0V4cD5cbn1cbiIsICJpbXBvcnQgeyBvdGhlciB9IGZyb20gJy4vcnVsZXMudHMnO1xuXG4vKipcbiAqIEhlbHBlcnNcbiAqL1xuY29uc3QgZXNjYXBlUmVwbGFjZW1lbnRzOiB7IFtpbmRleDogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICcmJzogJyZhbXA7JyxcbiAgJzwnOiAnJmx0OycsXG4gICc+JzogJyZndDsnLFxuICAnXCInOiAnJnF1b3Q7JyxcbiAgXCInXCI6ICcmIzM5OycsXG59O1xuY29uc3QgZ2V0RXNjYXBlUmVwbGFjZW1lbnQgPSAoY2g6IHN0cmluZykgPT4gZXNjYXBlUmVwbGFjZW1lbnRzW2NoXTtcblxuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZUh0bWxFbnRpdGllcyhodG1sOiBzdHJpbmcsIGVuY29kZT86IGJvb2xlYW4pIHtcbiAgaWYgKGVuY29kZSkge1xuICAgIGlmIChvdGhlci5lc2NhcGVUZXN0LnRlc3QoaHRtbCkpIHtcbiAgICAgIHJldHVybiBodG1sLnJlcGxhY2Uob3RoZXIuZXNjYXBlUmVwbGFjZSwgZ2V0RXNjYXBlUmVwbGFjZW1lbnQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAob3RoZXIuZXNjYXBlVGVzdE5vRW5jb2RlLnRlc3QoaHRtbCkpIHtcbiAgICAgIHJldHVybiBodG1sLnJlcGxhY2Uob3RoZXIuZXNjYXBlUmVwbGFjZU5vRW5jb2RlLCBnZXRFc2NhcGVSZXBsYWNlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGh0bWw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhblVybChocmVmOiBzdHJpbmcpIHtcbiAgdHJ5IHtcbiAgICBocmVmID0gZW5jb2RlVVJJKGhyZWYpLnJlcGxhY2Uob3RoZXIucGVyY2VudERlY29kZSwgJyUnKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIGhyZWY7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdENlbGxzKHRhYmxlUm93OiBzdHJpbmcsIGNvdW50PzogbnVtYmVyKSB7XG4gIC8vIGVuc3VyZSB0aGF0IGV2ZXJ5IGNlbGwtZGVsaW1pdGluZyBwaXBlIGhhcyBhIHNwYWNlXG4gIC8vIGJlZm9yZSBpdCB0byBkaXN0aW5ndWlzaCBpdCBmcm9tIGFuIGVzY2FwZWQgcGlwZVxuICBjb25zdCByb3cgPSB0YWJsZVJvdy5yZXBsYWNlKG90aGVyLmZpbmRQaXBlLCAobWF0Y2gsIG9mZnNldCwgc3RyKSA9PiB7XG4gICAgICBsZXQgZXNjYXBlZCA9IGZhbHNlO1xuICAgICAgbGV0IGN1cnIgPSBvZmZzZXQ7XG4gICAgICB3aGlsZSAoLS1jdXJyID49IDAgJiYgc3RyW2N1cnJdID09PSAnXFxcXCcpIGVzY2FwZWQgPSAhZXNjYXBlZDtcbiAgICAgIGlmIChlc2NhcGVkKSB7XG4gICAgICAgIC8vIG9kZCBudW1iZXIgb2Ygc2xhc2hlcyBtZWFucyB8IGlzIGVzY2FwZWRcbiAgICAgICAgLy8gc28gd2UgbGVhdmUgaXQgYWxvbmVcbiAgICAgICAgcmV0dXJuICd8JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGFkZCBzcGFjZSBiZWZvcmUgdW5lc2NhcGVkIHxcbiAgICAgICAgcmV0dXJuICcgfCc7XG4gICAgICB9XG4gICAgfSksXG4gICAgY2VsbHMgPSByb3cuc3BsaXQob3RoZXIuc3BsaXRQaXBlKTtcbiAgbGV0IGkgPSAwO1xuXG4gIC8vIEZpcnN0L2xhc3QgY2VsbCBpbiBhIHJvdyBjYW5ub3QgYmUgZW1wdHkgaWYgaXQgaGFzIG5vIGxlYWRpbmcvdHJhaWxpbmcgcGlwZVxuICBpZiAoIWNlbGxzWzBdLnRyaW0oKSkge1xuICAgIGNlbGxzLnNoaWZ0KCk7XG4gIH1cbiAgaWYgKGNlbGxzLmxlbmd0aCA+IDAgJiYgIWNlbGxzLmF0KC0xKT8udHJpbSgpKSB7XG4gICAgY2VsbHMucG9wKCk7XG4gIH1cblxuICBpZiAoY291bnQpIHtcbiAgICBpZiAoY2VsbHMubGVuZ3RoID4gY291bnQpIHtcbiAgICAgIGNlbGxzLnNwbGljZShjb3VudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdoaWxlIChjZWxscy5sZW5ndGggPCBjb3VudCkgY2VsbHMucHVzaCgnJyk7XG4gICAgfVxuICB9XG5cbiAgZm9yICg7IGkgPCBjZWxscy5sZW5ndGg7IGkrKykge1xuICAgIC8vIGxlYWRpbmcgb3IgdHJhaWxpbmcgd2hpdGVzcGFjZSBpcyBpZ25vcmVkIHBlciB0aGUgZ2ZtIHNwZWNcbiAgICBjZWxsc1tpXSA9IGNlbGxzW2ldLnRyaW0oKS5yZXBsYWNlKG90aGVyLnNsYXNoUGlwZSwgJ3wnKTtcbiAgfVxuICByZXR1cm4gY2VsbHM7XG59XG5cbi8qKlxuICogUmVtb3ZlIHRyYWlsaW5nICdjJ3MuIEVxdWl2YWxlbnQgdG8gc3RyLnJlcGxhY2UoL2MqJC8sICcnKS5cbiAqIC9jKiQvIGlzIHZ1bG5lcmFibGUgdG8gUkVET1MuXG4gKlxuICogQHBhcmFtIHN0clxuICogQHBhcmFtIGNcbiAqIEBwYXJhbSBpbnZlcnQgUmVtb3ZlIHN1ZmZpeCBvZiBub24tYyBjaGFycyBpbnN0ZWFkLiBEZWZhdWx0IGZhbHNleS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ0cmltKHN0cjogc3RyaW5nLCBjOiBzdHJpbmcsIGludmVydD86IGJvb2xlYW4pIHtcbiAgY29uc3QgbCA9IHN0ci5sZW5ndGg7XG4gIGlmIChsID09PSAwKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgLy8gTGVuZ3RoIG9mIHN1ZmZpeCBtYXRjaGluZyB0aGUgaW52ZXJ0IGNvbmRpdGlvbi5cbiAgbGV0IHN1ZmZMZW4gPSAwO1xuXG4gIC8vIFN0ZXAgbGVmdCB1bnRpbCB3ZSBmYWlsIHRvIG1hdGNoIHRoZSBpbnZlcnQgY29uZGl0aW9uLlxuICB3aGlsZSAoc3VmZkxlbiA8IGwpIHtcbiAgICBjb25zdCBjdXJyQ2hhciA9IHN0ci5jaGFyQXQobCAtIHN1ZmZMZW4gLSAxKTtcbiAgICBpZiAoY3VyckNoYXIgPT09IGMgJiYgIWludmVydCkge1xuICAgICAgc3VmZkxlbisrO1xuICAgIH0gZWxzZSBpZiAoY3VyckNoYXIgIT09IGMgJiYgaW52ZXJ0KSB7XG4gICAgICBzdWZmTGVuKys7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdHIuc2xpY2UoMCwgbCAtIHN1ZmZMZW4pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZENsb3NpbmdCcmFja2V0KHN0cjogc3RyaW5nLCBiOiBzdHJpbmcpIHtcbiAgaWYgKHN0ci5pbmRleE9mKGJbMV0pID09PSAtMSkge1xuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIGxldCBsZXZlbCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHN0cltpXSA9PT0gJ1xcXFwnKSB7XG4gICAgICBpKys7XG4gICAgfSBlbHNlIGlmIChzdHJbaV0gPT09IGJbMF0pIHtcbiAgICAgIGxldmVsKys7XG4gICAgfSBlbHNlIGlmIChzdHJbaV0gPT09IGJbMV0pIHtcbiAgICAgIGxldmVsLS07XG4gICAgICBpZiAobGV2ZWwgPCAwKSB7XG4gICAgICAgIHJldHVybiBpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAobGV2ZWwgPiAwKSB7XG4gICAgcmV0dXJuIC0yO1xuICB9XG5cbiAgcmV0dXJuIC0xO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhwYW5kVGFicyhsaW5lOiBzdHJpbmcsIGluZGVudCA9IDApIHtcbiAgbGV0IGNvbCA9IGluZGVudDtcbiAgbGV0IGV4cGFuZGVkID0gJyc7XG4gIGZvciAoY29uc3QgY2hhciBvZiBsaW5lKSB7XG4gICAgaWYgKGNoYXIgPT09ICdcXHQnKSB7XG4gICAgICBjb25zdCBhZGRlZCA9IDQgLSAoY29sICUgNCk7XG4gICAgICBleHBhbmRlZCArPSAnICcucmVwZWF0KGFkZGVkKTtcbiAgICAgIGNvbCArPSBhZGRlZDtcbiAgICB9IGVsc2Uge1xuICAgICAgZXhwYW5kZWQgKz0gY2hhcjtcbiAgICAgIGNvbCsrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBleHBhbmRlZDtcbn1cbiIsICJpbXBvcnQgeyBfZGVmYXVsdHMgfSBmcm9tICcuL2RlZmF1bHRzLnRzJztcbmltcG9ydCB7XG4gIHJ0cmltLFxuICBzcGxpdENlbGxzLFxuICBmaW5kQ2xvc2luZ0JyYWNrZXQsXG4gIGV4cGFuZFRhYnMsXG59IGZyb20gJy4vaGVscGVycy50cyc7XG5pbXBvcnQgdHlwZSB7IFJ1bGVzIH0gZnJvbSAnLi9ydWxlcy50cyc7XG5pbXBvcnQgdHlwZSB7IF9MZXhlciB9IGZyb20gJy4vTGV4ZXIudHMnO1xuaW1wb3J0IHR5cGUgeyBMaW5rcywgVG9rZW5zLCBUb2tlbiB9IGZyb20gJy4vVG9rZW5zLnRzJztcbmltcG9ydCB0eXBlIHsgTWFya2VkT3B0aW9ucyB9IGZyb20gJy4vTWFya2VkT3B0aW9ucy50cyc7XG5cbmZ1bmN0aW9uIG91dHB1dExpbmsoY2FwOiBzdHJpbmdbXSwgbGluazogUGljazxUb2tlbnMuTGluaywgJ2hyZWYnIHwgJ3RpdGxlJz4sIHJhdzogc3RyaW5nLCBsZXhlcjogX0xleGVyLCBydWxlczogUnVsZXMpOiBUb2tlbnMuTGluayB8IFRva2Vucy5JbWFnZSB7XG4gIGNvbnN0IGhyZWYgPSBsaW5rLmhyZWY7XG4gIGNvbnN0IHRpdGxlID0gbGluay50aXRsZSB8fCBudWxsO1xuICBjb25zdCB0ZXh0ID0gY2FwWzFdLnJlcGxhY2UocnVsZXMub3RoZXIub3V0cHV0TGlua1JlcGxhY2UsICckMScpO1xuXG4gIGxleGVyLnN0YXRlLmluTGluayA9IHRydWU7XG4gIGNvbnN0IHRva2VuOiBUb2tlbnMuTGluayB8IFRva2Vucy5JbWFnZSA9IHtcbiAgICB0eXBlOiBjYXBbMF0uY2hhckF0KDApID09PSAnIScgPyAnaW1hZ2UnIDogJ2xpbmsnLFxuICAgIHJhdyxcbiAgICBocmVmLFxuICAgIHRpdGxlLFxuICAgIHRleHQsXG4gICAgdG9rZW5zOiBsZXhlci5pbmxpbmVUb2tlbnModGV4dCksXG4gIH07XG4gIGxleGVyLnN0YXRlLmluTGluayA9IGZhbHNlO1xuICByZXR1cm4gdG9rZW47XG59XG5cbmZ1bmN0aW9uIGluZGVudENvZGVDb21wZW5zYXRpb24ocmF3OiBzdHJpbmcsIHRleHQ6IHN0cmluZywgcnVsZXM6IFJ1bGVzKSB7XG4gIGNvbnN0IG1hdGNoSW5kZW50VG9Db2RlID0gcmF3Lm1hdGNoKHJ1bGVzLm90aGVyLmluZGVudENvZGVDb21wZW5zYXRpb24pO1xuXG4gIGlmIChtYXRjaEluZGVudFRvQ29kZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiB0ZXh0O1xuICB9XG5cbiAgY29uc3QgaW5kZW50VG9Db2RlID0gbWF0Y2hJbmRlbnRUb0NvZGVbMV07XG5cbiAgcmV0dXJuIHRleHRcbiAgICAuc3BsaXQoJ1xcbicpXG4gICAgLm1hcChub2RlID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoSW5kZW50SW5Ob2RlID0gbm9kZS5tYXRjaChydWxlcy5vdGhlci5iZWdpbm5pbmdTcGFjZSk7XG4gICAgICBpZiAobWF0Y2hJbmRlbnRJbk5vZGUgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IFtpbmRlbnRJbk5vZGVdID0gbWF0Y2hJbmRlbnRJbk5vZGU7XG5cbiAgICAgIGlmIChpbmRlbnRJbk5vZGUubGVuZ3RoID49IGluZGVudFRvQ29kZS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUuc2xpY2UoaW5kZW50VG9Db2RlLmxlbmd0aCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBub2RlO1xuICAgIH0pXG4gICAgLmpvaW4oJ1xcbicpO1xufVxuXG4vKipcbiAqIFRva2VuaXplclxuICovXG5leHBvcnQgY2xhc3MgX1Rva2VuaXplcjxQYXJzZXJPdXRwdXQgPSBzdHJpbmcsIFJlbmRlcmVyT3V0cHV0ID0gc3RyaW5nPiB7XG4gIG9wdGlvbnM6IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD47XG4gIHJ1bGVzITogUnVsZXM7IC8vIHNldCBieSB0aGUgbGV4ZXJcbiAgbGV4ZXIhOiBfTGV4ZXI8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD47IC8vIHNldCBieSB0aGUgbGV4ZXJcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zPzogTWFya2VkT3B0aW9uczxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0Pikge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwgX2RlZmF1bHRzO1xuICB9XG5cbiAgc3BhY2Uoc3JjOiBzdHJpbmcpOiBUb2tlbnMuU3BhY2UgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuYmxvY2submV3bGluZS5leGVjKHNyYyk7XG4gICAgaWYgKGNhcCAmJiBjYXBbMF0ubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ3NwYWNlJyxcbiAgICAgICAgcmF3OiBjYXBbMF0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGNvZGUoc3JjOiBzdHJpbmcpOiBUb2tlbnMuQ29kZSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5ibG9jay5jb2RlLmV4ZWMoc3JjKTtcbiAgICBpZiAoY2FwKSB7XG4gICAgICBjb25zdCB0ZXh0ID0gY2FwWzBdLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5jb2RlUmVtb3ZlSW5kZW50LCAnJyk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAnY29kZScsXG4gICAgICAgIHJhdzogY2FwWzBdLFxuICAgICAgICBjb2RlQmxvY2tTdHlsZTogJ2luZGVudGVkJyxcbiAgICAgICAgdGV4dDogIXRoaXMub3B0aW9ucy5wZWRhbnRpY1xuICAgICAgICAgID8gcnRyaW0odGV4dCwgJ1xcbicpXG4gICAgICAgICAgOiB0ZXh0LFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBmZW5jZXMoc3JjOiBzdHJpbmcpOiBUb2tlbnMuQ29kZSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5ibG9jay5mZW5jZXMuZXhlYyhzcmMpO1xuICAgIGlmIChjYXApIHtcbiAgICAgIGNvbnN0IHJhdyA9IGNhcFswXTtcbiAgICAgIGNvbnN0IHRleHQgPSBpbmRlbnRDb2RlQ29tcGVuc2F0aW9uKHJhdywgY2FwWzNdIHx8ICcnLCB0aGlzLnJ1bGVzKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ2NvZGUnLFxuICAgICAgICByYXcsXG4gICAgICAgIGxhbmc6IGNhcFsyXSA/IGNhcFsyXS50cmltKCkucmVwbGFjZSh0aGlzLnJ1bGVzLmlubGluZS5hbnlQdW5jdHVhdGlvbiwgJyQxJykgOiBjYXBbMl0sXG4gICAgICAgIHRleHQsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGhlYWRpbmcoc3JjOiBzdHJpbmcpOiBUb2tlbnMuSGVhZGluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5ibG9jay5oZWFkaW5nLmV4ZWMoc3JjKTtcbiAgICBpZiAoY2FwKSB7XG4gICAgICBsZXQgdGV4dCA9IGNhcFsyXS50cmltKCk7XG5cbiAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyAjc1xuICAgICAgaWYgKHRoaXMucnVsZXMub3RoZXIuZW5kaW5nSGFzaC50ZXN0KHRleHQpKSB7XG4gICAgICAgIGNvbnN0IHRyaW1tZWQgPSBydHJpbSh0ZXh0LCAnIycpO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnBlZGFudGljKSB7XG4gICAgICAgICAgdGV4dCA9IHRyaW1tZWQudHJpbSgpO1xuICAgICAgICB9IGVsc2UgaWYgKCF0cmltbWVkIHx8IHRoaXMucnVsZXMub3RoZXIuZW5kaW5nU3BhY2VDaGFyLnRlc3QodHJpbW1lZCkpIHtcbiAgICAgICAgICAvLyBDb21tb25NYXJrIHJlcXVpcmVzIHNwYWNlIGJlZm9yZSB0cmFpbGluZyAjc1xuICAgICAgICAgIHRleHQgPSB0cmltbWVkLnRyaW0oKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAnaGVhZGluZycsXG4gICAgICAgIHJhdzogY2FwWzBdLFxuICAgICAgICBkZXB0aDogY2FwWzFdLmxlbmd0aCxcbiAgICAgICAgdGV4dCxcbiAgICAgICAgdG9rZW5zOiB0aGlzLmxleGVyLmlubGluZSh0ZXh0KSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgaHIoc3JjOiBzdHJpbmcpOiBUb2tlbnMuSHIgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuYmxvY2suaHIuZXhlYyhzcmMpO1xuICAgIGlmIChjYXApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdocicsXG4gICAgICAgIHJhdzogcnRyaW0oY2FwWzBdLCAnXFxuJyksXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGJsb2NrcXVvdGUoc3JjOiBzdHJpbmcpOiBUb2tlbnMuQmxvY2txdW90ZSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5ibG9jay5ibG9ja3F1b3RlLmV4ZWMoc3JjKTtcbiAgICBpZiAoY2FwKSB7XG4gICAgICBsZXQgbGluZXMgPSBydHJpbShjYXBbMF0sICdcXG4nKS5zcGxpdCgnXFxuJyk7XG4gICAgICBsZXQgcmF3ID0gJyc7XG4gICAgICBsZXQgdGV4dCA9ICcnO1xuICAgICAgY29uc3QgdG9rZW5zOiBUb2tlbltdID0gW107XG5cbiAgICAgIHdoaWxlIChsaW5lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxldCBpbkJsb2NrcXVvdGUgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgY3VycmVudExpbmVzID0gW107XG5cbiAgICAgICAgbGV0IGk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIC8vIGdldCBsaW5lcyB1cCB0byBhIGNvbnRpbnVhdGlvblxuICAgICAgICAgIGlmICh0aGlzLnJ1bGVzLm90aGVyLmJsb2NrcXVvdGVTdGFydC50ZXN0KGxpbmVzW2ldKSkge1xuICAgICAgICAgICAgY3VycmVudExpbmVzLnB1c2gobGluZXNbaV0pO1xuICAgICAgICAgICAgaW5CbG9ja3F1b3RlID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCFpbkJsb2NrcXVvdGUpIHtcbiAgICAgICAgICAgIGN1cnJlbnRMaW5lcy5wdXNoKGxpbmVzW2ldKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxpbmVzID0gbGluZXMuc2xpY2UoaSk7XG5cbiAgICAgICAgY29uc3QgY3VycmVudFJhdyA9IGN1cnJlbnRMaW5lcy5qb2luKCdcXG4nKTtcbiAgICAgICAgY29uc3QgY3VycmVudFRleHQgPSBjdXJyZW50UmF3XG4gICAgICAgICAgLy8gcHJlY2VkZSBzZXRleHQgY29udGludWF0aW9uIHdpdGggNCBzcGFjZXMgc28gaXQgaXNuJ3QgYSBzZXRleHRcbiAgICAgICAgICAucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLmJsb2NrcXVvdGVTZXRleHRSZXBsYWNlLCAnXFxuICAgICQxJylcbiAgICAgICAgICAucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLmJsb2NrcXVvdGVTZXRleHRSZXBsYWNlMiwgJycpO1xuICAgICAgICByYXcgPSByYXcgPyBgJHtyYXd9XFxuJHtjdXJyZW50UmF3fWAgOiBjdXJyZW50UmF3O1xuICAgICAgICB0ZXh0ID0gdGV4dCA/IGAke3RleHR9XFxuJHtjdXJyZW50VGV4dH1gIDogY3VycmVudFRleHQ7XG5cbiAgICAgICAgLy8gcGFyc2UgYmxvY2txdW90ZSBsaW5lcyBhcyB0b3AgbGV2ZWwgdG9rZW5zXG4gICAgICAgIC8vIG1lcmdlIHBhcmFncmFwaHMgaWYgdGhpcyBpcyBhIGNvbnRpbnVhdGlvblxuICAgICAgICBjb25zdCB0b3AgPSB0aGlzLmxleGVyLnN0YXRlLnRvcDtcbiAgICAgICAgdGhpcy5sZXhlci5zdGF0ZS50b3AgPSB0cnVlO1xuICAgICAgICB0aGlzLmxleGVyLmJsb2NrVG9rZW5zKGN1cnJlbnRUZXh0LCB0b2tlbnMsIHRydWUpO1xuICAgICAgICB0aGlzLmxleGVyLnN0YXRlLnRvcCA9IHRvcDtcblxuICAgICAgICAvLyBpZiB0aGVyZSBpcyBubyBjb250aW51YXRpb24gdGhlbiB3ZSBhcmUgZG9uZVxuICAgICAgICBpZiAobGluZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsYXN0VG9rZW4gPSB0b2tlbnMuYXQoLTEpO1xuXG4gICAgICAgIGlmIChsYXN0VG9rZW4/LnR5cGUgPT09ICdjb2RlJykge1xuICAgICAgICAgIC8vIGJsb2NrcXVvdGUgY29udGludWF0aW9uIGNhbm5vdCBiZSBwcmVjZWRlZCBieSBhIGNvZGUgYmxvY2tcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBlbHNlIGlmIChsYXN0VG9rZW4/LnR5cGUgPT09ICdibG9ja3F1b3RlJykge1xuICAgICAgICAgIC8vIGluY2x1ZGUgY29udGludWF0aW9uIGluIG5lc3RlZCBibG9ja3F1b3RlXG4gICAgICAgICAgY29uc3Qgb2xkVG9rZW4gPSBsYXN0VG9rZW4gYXMgVG9rZW5zLkJsb2NrcXVvdGU7XG4gICAgICAgICAgY29uc3QgbmV3VGV4dCA9IG9sZFRva2VuLnJhdyArICdcXG4nICsgbGluZXMuam9pbignXFxuJyk7XG4gICAgICAgICAgY29uc3QgbmV3VG9rZW4gPSB0aGlzLmJsb2NrcXVvdGUobmV3VGV4dCkhO1xuICAgICAgICAgIHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV0gPSBuZXdUb2tlbjtcblxuICAgICAgICAgIHJhdyA9IHJhdy5zdWJzdHJpbmcoMCwgcmF3Lmxlbmd0aCAtIG9sZFRva2VuLnJhdy5sZW5ndGgpICsgbmV3VG9rZW4ucmF3O1xuICAgICAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cmluZygwLCB0ZXh0Lmxlbmd0aCAtIG9sZFRva2VuLnRleHQubGVuZ3RoKSArIG5ld1Rva2VuLnRleHQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSBpZiAobGFzdFRva2VuPy50eXBlID09PSAnbGlzdCcpIHtcbiAgICAgICAgICAvLyBpbmNsdWRlIGNvbnRpbnVhdGlvbiBpbiBuZXN0ZWQgbGlzdFxuICAgICAgICAgIGNvbnN0IG9sZFRva2VuID0gbGFzdFRva2VuIGFzIFRva2Vucy5MaXN0O1xuICAgICAgICAgIGNvbnN0IG5ld1RleHQgPSBvbGRUb2tlbi5yYXcgKyAnXFxuJyArIGxpbmVzLmpvaW4oJ1xcbicpO1xuICAgICAgICAgIGNvbnN0IG5ld1Rva2VuID0gdGhpcy5saXN0KG5ld1RleHQpITtcbiAgICAgICAgICB0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdID0gbmV3VG9rZW47XG5cbiAgICAgICAgICByYXcgPSByYXcuc3Vic3RyaW5nKDAsIHJhdy5sZW5ndGggLSBsYXN0VG9rZW4ucmF3Lmxlbmd0aCkgKyBuZXdUb2tlbi5yYXc7XG4gICAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIHRleHQubGVuZ3RoIC0gb2xkVG9rZW4ucmF3Lmxlbmd0aCkgKyBuZXdUb2tlbi5yYXc7XG4gICAgICAgICAgbGluZXMgPSBuZXdUZXh0LnN1YnN0cmluZyh0b2tlbnMuYXQoLTEpIS5yYXcubGVuZ3RoKS5zcGxpdCgnXFxuJyk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ2Jsb2NrcXVvdGUnLFxuICAgICAgICByYXcsXG4gICAgICAgIHRva2VucyxcbiAgICAgICAgdGV4dCxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgbGlzdChzcmM6IHN0cmluZyk6IFRva2Vucy5MaXN0IHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgY2FwID0gdGhpcy5ydWxlcy5ibG9jay5saXN0LmV4ZWMoc3JjKTtcbiAgICBpZiAoY2FwKSB7XG4gICAgICBsZXQgYnVsbCA9IGNhcFsxXS50cmltKCk7XG4gICAgICBjb25zdCBpc29yZGVyZWQgPSBidWxsLmxlbmd0aCA+IDE7XG5cbiAgICAgIGNvbnN0IGxpc3Q6IFRva2Vucy5MaXN0ID0ge1xuICAgICAgICB0eXBlOiAnbGlzdCcsXG4gICAgICAgIHJhdzogJycsXG4gICAgICAgIG9yZGVyZWQ6IGlzb3JkZXJlZCxcbiAgICAgICAgc3RhcnQ6IGlzb3JkZXJlZCA/ICtidWxsLnNsaWNlKDAsIC0xKSA6ICcnLFxuICAgICAgICBsb29zZTogZmFsc2UsXG4gICAgICAgIGl0ZW1zOiBbXSxcbiAgICAgIH07XG5cbiAgICAgIGJ1bGwgPSBpc29yZGVyZWQgPyBgXFxcXGR7MSw5fVxcXFwke2J1bGwuc2xpY2UoLTEpfWAgOiBgXFxcXCR7YnVsbH1gO1xuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLnBlZGFudGljKSB7XG4gICAgICAgIGJ1bGwgPSBpc29yZGVyZWQgPyBidWxsIDogJ1sqKy1dJztcbiAgICAgIH1cblxuICAgICAgLy8gR2V0IG5leHQgbGlzdCBpdGVtXG4gICAgICBjb25zdCBpdGVtUmVnZXggPSB0aGlzLnJ1bGVzLm90aGVyLmxpc3RJdGVtUmVnZXgoYnVsbCk7XG4gICAgICBsZXQgZW5kc1dpdGhCbGFua0xpbmUgPSBmYWxzZTtcbiAgICAgIC8vIENoZWNrIGlmIGN1cnJlbnQgYnVsbGV0IHBvaW50IGNhbiBzdGFydCBhIG5ldyBMaXN0IEl0ZW1cbiAgICAgIHdoaWxlIChzcmMpIHtcbiAgICAgICAgbGV0IGVuZEVhcmx5ID0gZmFsc2U7XG4gICAgICAgIGxldCByYXcgPSAnJztcbiAgICAgICAgbGV0IGl0ZW1Db250ZW50cyA9ICcnO1xuICAgICAgICBpZiAoIShjYXAgPSBpdGVtUmVnZXguZXhlYyhzcmMpKSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucnVsZXMuYmxvY2suaHIudGVzdChzcmMpKSB7IC8vIEVuZCBsaXN0IGlmIGJ1bGxldCB3YXMgYWN0dWFsbHkgSFIgKHBvc3NpYmx5IG1vdmUgaW50byBpdGVtUmVnZXg/KVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmF3ID0gY2FwWzBdO1xuICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHJhdy5sZW5ndGgpO1xuXG4gICAgICAgIGxldCBsaW5lID0gZXhwYW5kVGFicyhjYXBbMl0uc3BsaXQoJ1xcbicsIDEpWzBdLCBjYXBbMV0ubGVuZ3RoKTtcbiAgICAgICAgbGV0IG5leHRMaW5lID0gc3JjLnNwbGl0KCdcXG4nLCAxKVswXTtcbiAgICAgICAgbGV0IGJsYW5rTGluZSA9ICFsaW5lLnRyaW0oKTtcblxuICAgICAgICBsZXQgaW5kZW50ID0gMDtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5wZWRhbnRpYykge1xuICAgICAgICAgIGluZGVudCA9IDI7XG4gICAgICAgICAgaXRlbUNvbnRlbnRzID0gbGluZS50cmltU3RhcnQoKTtcbiAgICAgICAgfSBlbHNlIGlmIChibGFua0xpbmUpIHtcbiAgICAgICAgICBpbmRlbnQgPSBjYXBbMV0ubGVuZ3RoICsgMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpbmRlbnQgPSBsaW5lLnNlYXJjaCh0aGlzLnJ1bGVzLm90aGVyLm5vblNwYWNlQ2hhcik7IC8vIEZpbmQgZmlyc3Qgbm9uLXNwYWNlIGNoYXJcbiAgICAgICAgICBpbmRlbnQgPSBpbmRlbnQgPiA0ID8gMSA6IGluZGVudDsgLy8gVHJlYXQgaW5kZW50ZWQgY29kZSBibG9ja3MgKD4gNCBzcGFjZXMpIGFzIGhhdmluZyBvbmx5IDEgaW5kZW50XG4gICAgICAgICAgaXRlbUNvbnRlbnRzID0gbGluZS5zbGljZShpbmRlbnQpO1xuICAgICAgICAgIGluZGVudCArPSBjYXBbMV0ubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJsYW5rTGluZSAmJiB0aGlzLnJ1bGVzLm90aGVyLmJsYW5rTGluZS50ZXN0KG5leHRMaW5lKSkgeyAvLyBJdGVtcyBiZWdpbiB3aXRoIGF0IG1vc3Qgb25lIGJsYW5rIGxpbmVcbiAgICAgICAgICByYXcgKz0gbmV4dExpbmUgKyAnXFxuJztcbiAgICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKG5leHRMaW5lLmxlbmd0aCArIDEpO1xuICAgICAgICAgIGVuZEVhcmx5ID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZW5kRWFybHkpIHtcbiAgICAgICAgICBjb25zdCBuZXh0QnVsbGV0UmVnZXggPSB0aGlzLnJ1bGVzLm90aGVyLm5leHRCdWxsZXRSZWdleChpbmRlbnQpO1xuICAgICAgICAgIGNvbnN0IGhyUmVnZXggPSB0aGlzLnJ1bGVzLm90aGVyLmhyUmVnZXgoaW5kZW50KTtcbiAgICAgICAgICBjb25zdCBmZW5jZXNCZWdpblJlZ2V4ID0gdGhpcy5ydWxlcy5vdGhlci5mZW5jZXNCZWdpblJlZ2V4KGluZGVudCk7XG4gICAgICAgICAgY29uc3QgaGVhZGluZ0JlZ2luUmVnZXggPSB0aGlzLnJ1bGVzLm90aGVyLmhlYWRpbmdCZWdpblJlZ2V4KGluZGVudCk7XG4gICAgICAgICAgY29uc3QgaHRtbEJlZ2luUmVnZXggPSB0aGlzLnJ1bGVzLm90aGVyLmh0bWxCZWdpblJlZ2V4KGluZGVudCk7XG4gICAgICAgICAgY29uc3QgYmxvY2txdW90ZUJlZ2luUmVnZXggPSB0aGlzLnJ1bGVzLm90aGVyLmJsb2NrcXVvdGVCZWdpblJlZ2V4KGluZGVudCk7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiBmb2xsb3dpbmcgbGluZXMgc2hvdWxkIGJlIGluY2x1ZGVkIGluIExpc3QgSXRlbVxuICAgICAgICAgIHdoaWxlIChzcmMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJhd0xpbmUgPSBzcmMuc3BsaXQoJ1xcbicsIDEpWzBdO1xuICAgICAgICAgICAgbGV0IG5leHRMaW5lV2l0aG91dFRhYnM7XG4gICAgICAgICAgICBuZXh0TGluZSA9IHJhd0xpbmU7XG5cbiAgICAgICAgICAgIC8vIFJlLWFsaWduIHRvIGZvbGxvdyBjb21tb25tYXJrIG5lc3RpbmcgcnVsZXNcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucGVkYW50aWMpIHtcbiAgICAgICAgICAgICAgbmV4dExpbmUgPSBuZXh0TGluZS5yZXBsYWNlKHRoaXMucnVsZXMub3RoZXIubGlzdFJlcGxhY2VOZXN0aW5nLCAnICAnKTtcbiAgICAgICAgICAgICAgbmV4dExpbmVXaXRob3V0VGFicyA9IG5leHRMaW5lO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbmV4dExpbmVXaXRob3V0VGFicyA9IG5leHRMaW5lLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci50YWJDaGFyR2xvYmFsLCAnICAgICcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBFbmQgbGlzdCBpdGVtIGlmIGZvdW5kIGNvZGUgZmVuY2VzXG4gICAgICAgICAgICBpZiAoZmVuY2VzQmVnaW5SZWdleC50ZXN0KG5leHRMaW5lKSkge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRW5kIGxpc3QgaXRlbSBpZiBmb3VuZCBzdGFydCBvZiBuZXcgaGVhZGluZ1xuICAgICAgICAgICAgaWYgKGhlYWRpbmdCZWdpblJlZ2V4LnRlc3QobmV4dExpbmUpKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBFbmQgbGlzdCBpdGVtIGlmIGZvdW5kIHN0YXJ0IG9mIGh0bWwgYmxvY2tcbiAgICAgICAgICAgIGlmIChodG1sQmVnaW5SZWdleC50ZXN0KG5leHRMaW5lKSkge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRW5kIGxpc3QgaXRlbSBpZiBmb3VuZCBzdGFydCBvZiBibG9ja3F1b3RlXG4gICAgICAgICAgICBpZiAoYmxvY2txdW90ZUJlZ2luUmVnZXgudGVzdChuZXh0TGluZSkpIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEVuZCBsaXN0IGl0ZW0gaWYgZm91bmQgc3RhcnQgb2YgbmV3IGJ1bGxldFxuICAgICAgICAgICAgaWYgKG5leHRCdWxsZXRSZWdleC50ZXN0KG5leHRMaW5lKSkge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSG9yaXpvbnRhbCBydWxlIGZvdW5kXG4gICAgICAgICAgICBpZiAoaHJSZWdleC50ZXN0KG5leHRMaW5lKSkge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG5leHRMaW5lV2l0aG91dFRhYnMuc2VhcmNoKHRoaXMucnVsZXMub3RoZXIubm9uU3BhY2VDaGFyKSA+PSBpbmRlbnQgfHwgIW5leHRMaW5lLnRyaW0oKSkgeyAvLyBEZWRlbnQgaWYgcG9zc2libGVcbiAgICAgICAgICAgICAgaXRlbUNvbnRlbnRzICs9ICdcXG4nICsgbmV4dExpbmVXaXRob3V0VGFicy5zbGljZShpbmRlbnQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gbm90IGVub3VnaCBpbmRlbnRhdGlvblxuICAgICAgICAgICAgICBpZiAoYmxhbmtMaW5lKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBwYXJhZ3JhcGggY29udGludWF0aW9uIHVubGVzcyBsYXN0IGxpbmUgd2FzIGEgZGlmZmVyZW50IGJsb2NrIGxldmVsIGVsZW1lbnRcbiAgICAgICAgICAgICAgaWYgKGxpbmUucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLnRhYkNoYXJHbG9iYWwsICcgICAgJykuc2VhcmNoKHRoaXMucnVsZXMub3RoZXIubm9uU3BhY2VDaGFyKSA+PSA0KSB7IC8vIGluZGVudGVkIGNvZGUgYmxvY2tcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoZmVuY2VzQmVnaW5SZWdleC50ZXN0KGxpbmUpKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGhlYWRpbmdCZWdpblJlZ2V4LnRlc3QobGluZSkpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoaHJSZWdleC50ZXN0KGxpbmUpKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpdGVtQ29udGVudHMgKz0gJ1xcbicgKyBuZXh0TGluZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYmxhbmtMaW5lID0gIW5leHRMaW5lLnRyaW0oKTtcblxuICAgICAgICAgICAgcmF3ICs9IHJhd0xpbmUgKyAnXFxuJztcbiAgICAgICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcocmF3TGluZS5sZW5ndGggKyAxKTtcbiAgICAgICAgICAgIGxpbmUgPSBuZXh0TGluZVdpdGhvdXRUYWJzLnNsaWNlKGluZGVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFsaXN0Lmxvb3NlKSB7XG4gICAgICAgICAgLy8gSWYgdGhlIHByZXZpb3VzIGl0ZW0gZW5kZWQgd2l0aCBhIGJsYW5rIGxpbmUsIHRoZSBsaXN0IGlzIGxvb3NlXG4gICAgICAgICAgaWYgKGVuZHNXaXRoQmxhbmtMaW5lKSB7XG4gICAgICAgICAgICBsaXN0Lmxvb3NlID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucnVsZXMub3RoZXIuZG91YmxlQmxhbmtMaW5lLnRlc3QocmF3KSkge1xuICAgICAgICAgICAgZW5kc1dpdGhCbGFua0xpbmUgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxpc3QuaXRlbXMucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ2xpc3RfaXRlbScsXG4gICAgICAgICAgcmF3LFxuICAgICAgICAgIHRhc2s6ICEhdGhpcy5vcHRpb25zLmdmbSAmJiB0aGlzLnJ1bGVzLm90aGVyLmxpc3RJc1Rhc2sudGVzdChpdGVtQ29udGVudHMpLFxuICAgICAgICAgIGxvb3NlOiBmYWxzZSxcbiAgICAgICAgICB0ZXh0OiBpdGVtQ29udGVudHMsXG4gICAgICAgICAgdG9rZW5zOiBbXSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgbGlzdC5yYXcgKz0gcmF3O1xuICAgICAgfVxuXG4gICAgICAvLyBEbyBub3QgY29uc3VtZSBuZXdsaW5lcyBhdCBlbmQgb2YgZmluYWwgaXRlbS4gQWx0ZXJuYXRpdmVseSwgbWFrZSBpdGVtUmVnZXggKnN0YXJ0KiB3aXRoIGFueSBuZXdsaW5lcyB0byBzaW1wbGlmeS9zcGVlZCB1cCBlbmRzV2l0aEJsYW5rTGluZSBsb2dpY1xuICAgICAgY29uc3QgbGFzdEl0ZW0gPSBsaXN0Lml0ZW1zLmF0KC0xKTtcbiAgICAgIGlmIChsYXN0SXRlbSkge1xuICAgICAgICBsYXN0SXRlbS5yYXcgPSBsYXN0SXRlbS5yYXcudHJpbUVuZCgpO1xuICAgICAgICBsYXN0SXRlbS50ZXh0ID0gbGFzdEl0ZW0udGV4dC50cmltRW5kKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBub3QgYSBsaXN0IHNpbmNlIHRoZXJlIHdlcmUgbm8gaXRlbXNcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbGlzdC5yYXcgPSBsaXN0LnJhdy50cmltRW5kKCk7XG5cbiAgICAgIC8vIEl0ZW0gY2hpbGQgdG9rZW5zIGhhbmRsZWQgaGVyZSBhdCBlbmQgYmVjYXVzZSB3ZSBuZWVkZWQgdG8gaGF2ZSB0aGUgZmluYWwgaXRlbSB0byB0cmltIGl0IGZpcnN0XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbGlzdC5pdGVtcykge1xuICAgICAgICB0aGlzLmxleGVyLnN0YXRlLnRvcCA9IGZhbHNlO1xuICAgICAgICBpdGVtLnRva2VucyA9IHRoaXMubGV4ZXIuYmxvY2tUb2tlbnMoaXRlbS50ZXh0LCBbXSk7XG4gICAgICAgIGlmIChpdGVtLnRhc2spIHtcbiAgICAgICAgICAvLyBSZW1vdmUgY2hlY2tib3ggbWFya2Rvd24gZnJvbSBpdGVtIHRva2Vuc1xuICAgICAgICAgIGl0ZW0udGV4dCA9IGl0ZW0udGV4dC5yZXBsYWNlKHRoaXMucnVsZXMub3RoZXIubGlzdFJlcGxhY2VUYXNrLCAnJyk7XG4gICAgICAgICAgaWYgKGl0ZW0udG9rZW5zWzBdPy50eXBlID09PSAndGV4dCcgfHwgaXRlbS50b2tlbnNbMF0/LnR5cGUgPT09ICdwYXJhZ3JhcGgnKSB7XG4gICAgICAgICAgICBpdGVtLnRva2Vuc1swXS5yYXcgPSBpdGVtLnRva2Vuc1swXS5yYXcucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLmxpc3RSZXBsYWNlVGFzaywgJycpO1xuICAgICAgICAgICAgaXRlbS50b2tlbnNbMF0udGV4dCA9IGl0ZW0udG9rZW5zWzBdLnRleHQucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLmxpc3RSZXBsYWNlVGFzaywgJycpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMubGV4ZXIuaW5saW5lUXVldWUubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMucnVsZXMub3RoZXIubGlzdElzVGFzay50ZXN0KHRoaXMubGV4ZXIuaW5saW5lUXVldWVbaV0uc3JjKSkge1xuICAgICAgICAgICAgICAgIHRoaXMubGV4ZXIuaW5saW5lUXVldWVbaV0uc3JjID0gdGhpcy5sZXhlci5pbmxpbmVRdWV1ZVtpXS5zcmMucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLmxpc3RSZXBsYWNlVGFzaywgJycpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgdGFza1JhdyA9IHRoaXMucnVsZXMub3RoZXIubGlzdFRhc2tDaGVja2JveC5leGVjKGl0ZW0ucmF3KTtcbiAgICAgICAgICBpZiAodGFza1Jhdykge1xuICAgICAgICAgICAgY29uc3QgY2hlY2tib3hUb2tlbjogVG9rZW5zLkNoZWNrYm94ID0ge1xuICAgICAgICAgICAgICB0eXBlOiAnY2hlY2tib3gnLFxuICAgICAgICAgICAgICByYXc6IHRhc2tSYXdbMF0gKyAnICcsXG4gICAgICAgICAgICAgIGNoZWNrZWQ6IHRhc2tSYXdbMF0gIT09ICdbIF0nLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGl0ZW0uY2hlY2tlZCA9IGNoZWNrYm94VG9rZW4uY2hlY2tlZDtcbiAgICAgICAgICAgIGlmIChsaXN0Lmxvb3NlKSB7XG4gICAgICAgICAgICAgIGlmIChpdGVtLnRva2Vuc1swXSAmJiBbJ3BhcmFncmFwaCcsICd0ZXh0J10uaW5jbHVkZXMoaXRlbS50b2tlbnNbMF0udHlwZSkgJiYgJ3Rva2VucycgaW4gaXRlbS50b2tlbnNbMF0gJiYgaXRlbS50b2tlbnNbMF0udG9rZW5zKSB7XG4gICAgICAgICAgICAgICAgaXRlbS50b2tlbnNbMF0ucmF3ID0gY2hlY2tib3hUb2tlbi5yYXcgKyBpdGVtLnRva2Vuc1swXS5yYXc7XG4gICAgICAgICAgICAgICAgaXRlbS50b2tlbnNbMF0udGV4dCA9IGNoZWNrYm94VG9rZW4ucmF3ICsgaXRlbS50b2tlbnNbMF0udGV4dDtcbiAgICAgICAgICAgICAgICBpdGVtLnRva2Vuc1swXS50b2tlbnMudW5zaGlmdChjaGVja2JveFRva2VuKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpdGVtLnRva2Vucy51bnNoaWZ0KHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6ICdwYXJhZ3JhcGgnLFxuICAgICAgICAgICAgICAgICAgcmF3OiBjaGVja2JveFRva2VuLnJhdyxcbiAgICAgICAgICAgICAgICAgIHRleHQ6IGNoZWNrYm94VG9rZW4ucmF3LFxuICAgICAgICAgICAgICAgICAgdG9rZW5zOiBbY2hlY2tib3hUb2tlbl0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGl0ZW0udG9rZW5zLnVuc2hpZnQoY2hlY2tib3hUb2tlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFsaXN0Lmxvb3NlKSB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgbGlzdCBzaG91bGQgYmUgbG9vc2VcbiAgICAgICAgICBjb25zdCBzcGFjZXJzID0gaXRlbS50b2tlbnMuZmlsdGVyKHQgPT4gdC50eXBlID09PSAnc3BhY2UnKTtcbiAgICAgICAgICBjb25zdCBoYXNNdWx0aXBsZUxpbmVCcmVha3MgPSBzcGFjZXJzLmxlbmd0aCA+IDAgJiYgc3BhY2Vycy5zb21lKHQgPT4gdGhpcy5ydWxlcy5vdGhlci5hbnlMaW5lLnRlc3QodC5yYXcpKTtcblxuICAgICAgICAgIGxpc3QubG9vc2UgPSBoYXNNdWx0aXBsZUxpbmVCcmVha3M7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU2V0IGFsbCBpdGVtcyB0byBsb29zZSBpZiBsaXN0IGlzIGxvb3NlXG4gICAgICBpZiAobGlzdC5sb29zZSkge1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbGlzdC5pdGVtcykge1xuICAgICAgICAgIGl0ZW0ubG9vc2UgPSB0cnVlO1xuICAgICAgICAgIGZvciAoY29uc3QgdG9rZW4gb2YgaXRlbS50b2tlbnMpIHtcbiAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgICAgICAgdG9rZW4udHlwZSA9ICdwYXJhZ3JhcGgnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbGlzdDtcbiAgICB9XG4gIH1cblxuICBodG1sKHNyYzogc3RyaW5nKTogVG9rZW5zLkhUTUwgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuYmxvY2suaHRtbC5leGVjKHNyYyk7XG4gICAgaWYgKGNhcCkge1xuICAgICAgY29uc3QgdG9rZW46IFRva2Vucy5IVE1MID0ge1xuICAgICAgICB0eXBlOiAnaHRtbCcsXG4gICAgICAgIGJsb2NrOiB0cnVlLFxuICAgICAgICByYXc6IGNhcFswXSxcbiAgICAgICAgcHJlOiBjYXBbMV0gPT09ICdwcmUnIHx8IGNhcFsxXSA9PT0gJ3NjcmlwdCcgfHwgY2FwWzFdID09PSAnc3R5bGUnLFxuICAgICAgICB0ZXh0OiBjYXBbMF0sXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHRva2VuO1xuICAgIH1cbiAgfVxuXG4gIGRlZihzcmM6IHN0cmluZyk6IFRva2Vucy5EZWYgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuYmxvY2suZGVmLmV4ZWMoc3JjKTtcbiAgICBpZiAoY2FwKSB7XG4gICAgICBjb25zdCB0YWcgPSBjYXBbMV0udG9Mb3dlckNhc2UoKS5yZXBsYWNlKHRoaXMucnVsZXMub3RoZXIubXVsdGlwbGVTcGFjZUdsb2JhbCwgJyAnKTtcbiAgICAgIGNvbnN0IGhyZWYgPSBjYXBbMl0gPyBjYXBbMl0ucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLmhyZWZCcmFja2V0cywgJyQxJykucmVwbGFjZSh0aGlzLnJ1bGVzLmlubGluZS5hbnlQdW5jdHVhdGlvbiwgJyQxJykgOiAnJztcbiAgICAgIGNvbnN0IHRpdGxlID0gY2FwWzNdID8gY2FwWzNdLnN1YnN0cmluZygxLCBjYXBbM10ubGVuZ3RoIC0gMSkucmVwbGFjZSh0aGlzLnJ1bGVzLmlubGluZS5hbnlQdW5jdHVhdGlvbiwgJyQxJykgOiBjYXBbM107XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAnZGVmJyxcbiAgICAgICAgdGFnLFxuICAgICAgICByYXc6IGNhcFswXSxcbiAgICAgICAgaHJlZixcbiAgICAgICAgdGl0bGUsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHRhYmxlKHNyYzogc3RyaW5nKTogVG9rZW5zLlRhYmxlIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjYXAgPSB0aGlzLnJ1bGVzLmJsb2NrLnRhYmxlLmV4ZWMoc3JjKTtcbiAgICBpZiAoIWNhcCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5ydWxlcy5vdGhlci50YWJsZURlbGltaXRlci50ZXN0KGNhcFsyXSkpIHtcbiAgICAgIC8vIGRlbGltaXRlciByb3cgbXVzdCBoYXZlIGEgcGlwZSAofCkgb3IgY29sb24gKDopIG90aGVyd2lzZSBpdCBpcyBhIHNldGV4dCBoZWFkaW5nXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaGVhZGVycyA9IHNwbGl0Q2VsbHMoY2FwWzFdKTtcbiAgICBjb25zdCBhbGlnbnMgPSBjYXBbMl0ucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLnRhYmxlQWxpZ25DaGFycywgJycpLnNwbGl0KCd8Jyk7XG4gICAgY29uc3Qgcm93cyA9IGNhcFszXT8udHJpbSgpID8gY2FwWzNdLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci50YWJsZVJvd0JsYW5rTGluZSwgJycpLnNwbGl0KCdcXG4nKSA6IFtdO1xuXG4gICAgY29uc3QgaXRlbTogVG9rZW5zLlRhYmxlID0ge1xuICAgICAgdHlwZTogJ3RhYmxlJyxcbiAgICAgIHJhdzogY2FwWzBdLFxuICAgICAgaGVhZGVyOiBbXSxcbiAgICAgIGFsaWduOiBbXSxcbiAgICAgIHJvd3M6IFtdLFxuICAgIH07XG5cbiAgICBpZiAoaGVhZGVycy5sZW5ndGggIT09IGFsaWducy5sZW5ndGgpIHtcbiAgICAgIC8vIGhlYWRlciBhbmQgYWxpZ24gY29sdW1ucyBtdXN0IGJlIGVxdWFsLCByb3dzIGNhbiBiZSBkaWZmZXJlbnQuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBhbGlnbiBvZiBhbGlnbnMpIHtcbiAgICAgIGlmICh0aGlzLnJ1bGVzLm90aGVyLnRhYmxlQWxpZ25SaWdodC50ZXN0KGFsaWduKSkge1xuICAgICAgICBpdGVtLmFsaWduLnB1c2goJ3JpZ2h0Jyk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMucnVsZXMub3RoZXIudGFibGVBbGlnbkNlbnRlci50ZXN0KGFsaWduKSkge1xuICAgICAgICBpdGVtLmFsaWduLnB1c2goJ2NlbnRlcicpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnJ1bGVzLm90aGVyLnRhYmxlQWxpZ25MZWZ0LnRlc3QoYWxpZ24pKSB7XG4gICAgICAgIGl0ZW0uYWxpZ24ucHVzaCgnbGVmdCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXRlbS5hbGlnbi5wdXNoKG51bGwpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVhZGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgaXRlbS5oZWFkZXIucHVzaCh7XG4gICAgICAgIHRleHQ6IGhlYWRlcnNbaV0sXG4gICAgICAgIHRva2VuczogdGhpcy5sZXhlci5pbmxpbmUoaGVhZGVyc1tpXSksXG4gICAgICAgIGhlYWRlcjogdHJ1ZSxcbiAgICAgICAgYWxpZ246IGl0ZW0uYWxpZ25baV0sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICBpdGVtLnJvd3MucHVzaChzcGxpdENlbGxzKHJvdywgaXRlbS5oZWFkZXIubGVuZ3RoKS5tYXAoKGNlbGwsIGkpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0ZXh0OiBjZWxsLFxuICAgICAgICAgIHRva2VuczogdGhpcy5sZXhlci5pbmxpbmUoY2VsbCksXG4gICAgICAgICAgaGVhZGVyOiBmYWxzZSxcbiAgICAgICAgICBhbGlnbjogaXRlbS5hbGlnbltpXSxcbiAgICAgICAgfTtcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXRlbTtcbiAgfVxuXG4gIGxoZWFkaW5nKHNyYzogc3RyaW5nKTogVG9rZW5zLkhlYWRpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuYmxvY2subGhlYWRpbmcuZXhlYyhzcmMpO1xuICAgIGlmIChjYXApIHtcbiAgICAgIGNvbnN0IHRleHQgPSBjYXBbMV0udHJpbSgpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ2hlYWRpbmcnLFxuICAgICAgICByYXc6IGNhcFswXSxcbiAgICAgICAgZGVwdGg6IGNhcFsyXS5jaGFyQXQoMCkgPT09ICc9JyA/IDEgOiAyLFxuICAgICAgICB0ZXh0LFxuICAgICAgICB0b2tlbnM6IHRoaXMubGV4ZXIuaW5saW5lKHRleHQpLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBwYXJhZ3JhcGgoc3JjOiBzdHJpbmcpOiBUb2tlbnMuUGFyYWdyYXBoIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjYXAgPSB0aGlzLnJ1bGVzLmJsb2NrLnBhcmFncmFwaC5leGVjKHNyYyk7XG4gICAgaWYgKGNhcCkge1xuICAgICAgY29uc3QgdGV4dCA9IGNhcFsxXS5jaGFyQXQoY2FwWzFdLmxlbmd0aCAtIDEpID09PSAnXFxuJ1xuICAgICAgICA/IGNhcFsxXS5zbGljZSgwLCAtMSlcbiAgICAgICAgOiBjYXBbMV07XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAncGFyYWdyYXBoJyxcbiAgICAgICAgcmF3OiBjYXBbMF0sXG4gICAgICAgIHRleHQsXG4gICAgICAgIHRva2VuczogdGhpcy5sZXhlci5pbmxpbmUodGV4dCksXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHRleHQoc3JjOiBzdHJpbmcpOiBUb2tlbnMuVGV4dCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5ibG9jay50ZXh0LmV4ZWMoc3JjKTtcbiAgICBpZiAoY2FwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgIHJhdzogY2FwWzBdLFxuICAgICAgICB0ZXh0OiBjYXBbMF0sXG4gICAgICAgIHRva2VuczogdGhpcy5sZXhlci5pbmxpbmUoY2FwWzBdKSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgZXNjYXBlKHNyYzogc3RyaW5nKTogVG9rZW5zLkVzY2FwZSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5pbmxpbmUuZXNjYXBlLmV4ZWMoc3JjKTtcbiAgICBpZiAoY2FwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAnZXNjYXBlJyxcbiAgICAgICAgcmF3OiBjYXBbMF0sXG4gICAgICAgIHRleHQ6IGNhcFsxXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgdGFnKHNyYzogc3RyaW5nKTogVG9rZW5zLlRhZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5pbmxpbmUudGFnLmV4ZWMoc3JjKTtcbiAgICBpZiAoY2FwKSB7XG4gICAgICBpZiAoIXRoaXMubGV4ZXIuc3RhdGUuaW5MaW5rICYmIHRoaXMucnVsZXMub3RoZXIuc3RhcnRBVGFnLnRlc3QoY2FwWzBdKSkge1xuICAgICAgICB0aGlzLmxleGVyLnN0YXRlLmluTGluayA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMubGV4ZXIuc3RhdGUuaW5MaW5rICYmIHRoaXMucnVsZXMub3RoZXIuZW5kQVRhZy50ZXN0KGNhcFswXSkpIHtcbiAgICAgICAgdGhpcy5sZXhlci5zdGF0ZS5pbkxpbmsgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5sZXhlci5zdGF0ZS5pblJhd0Jsb2NrICYmIHRoaXMucnVsZXMub3RoZXIuc3RhcnRQcmVTY3JpcHRUYWcudGVzdChjYXBbMF0pKSB7XG4gICAgICAgIHRoaXMubGV4ZXIuc3RhdGUuaW5SYXdCbG9jayA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMubGV4ZXIuc3RhdGUuaW5SYXdCbG9jayAmJiB0aGlzLnJ1bGVzLm90aGVyLmVuZFByZVNjcmlwdFRhZy50ZXN0KGNhcFswXSkpIHtcbiAgICAgICAgdGhpcy5sZXhlci5zdGF0ZS5pblJhd0Jsb2NrID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdodG1sJyxcbiAgICAgICAgcmF3OiBjYXBbMF0sXG4gICAgICAgIGluTGluazogdGhpcy5sZXhlci5zdGF0ZS5pbkxpbmssXG4gICAgICAgIGluUmF3QmxvY2s6IHRoaXMubGV4ZXIuc3RhdGUuaW5SYXdCbG9jayxcbiAgICAgICAgYmxvY2s6IGZhbHNlLFxuICAgICAgICB0ZXh0OiBjYXBbMF0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGxpbmsoc3JjOiBzdHJpbmcpOiBUb2tlbnMuTGluayB8IFRva2Vucy5JbWFnZSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5pbmxpbmUubGluay5leGVjKHNyYyk7XG4gICAgaWYgKGNhcCkge1xuICAgICAgY29uc3QgdHJpbW1lZFVybCA9IGNhcFsyXS50cmltKCk7XG4gICAgICBpZiAoIXRoaXMub3B0aW9ucy5wZWRhbnRpYyAmJiB0aGlzLnJ1bGVzLm90aGVyLnN0YXJ0QW5nbGVCcmFja2V0LnRlc3QodHJpbW1lZFVybCkpIHtcbiAgICAgICAgLy8gY29tbW9ubWFyayByZXF1aXJlcyBtYXRjaGluZyBhbmdsZSBicmFja2V0c1xuICAgICAgICBpZiAoISh0aGlzLnJ1bGVzLm90aGVyLmVuZEFuZ2xlQnJhY2tldC50ZXN0KHRyaW1tZWRVcmwpKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVuZGluZyBhbmdsZSBicmFja2V0IGNhbm5vdCBiZSBlc2NhcGVkXG4gICAgICAgIGNvbnN0IHJ0cmltU2xhc2ggPSBydHJpbSh0cmltbWVkVXJsLnNsaWNlKDAsIC0xKSwgJ1xcXFwnKTtcbiAgICAgICAgaWYgKCh0cmltbWVkVXJsLmxlbmd0aCAtIHJ0cmltU2xhc2gubGVuZ3RoKSAlIDIgPT09IDApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGZpbmQgY2xvc2luZyBwYXJlbnRoZXNpc1xuICAgICAgICBjb25zdCBsYXN0UGFyZW5JbmRleCA9IGZpbmRDbG9zaW5nQnJhY2tldChjYXBbMl0sICcoKScpO1xuICAgICAgICBpZiAobGFzdFBhcmVuSW5kZXggPT09IC0yKSB7XG4gICAgICAgICAgLy8gbW9yZSBvcGVuIHBhcmVucyB0aGFuIGNsb3NlZFxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsYXN0UGFyZW5JbmRleCA+IC0xKSB7XG4gICAgICAgICAgY29uc3Qgc3RhcnQgPSBjYXBbMF0uaW5kZXhPZignIScpID09PSAwID8gNSA6IDQ7XG4gICAgICAgICAgY29uc3QgbGlua0xlbiA9IHN0YXJ0ICsgY2FwWzFdLmxlbmd0aCArIGxhc3RQYXJlbkluZGV4O1xuICAgICAgICAgIGNhcFsyXSA9IGNhcFsyXS5zdWJzdHJpbmcoMCwgbGFzdFBhcmVuSW5kZXgpO1xuICAgICAgICAgIGNhcFswXSA9IGNhcFswXS5zdWJzdHJpbmcoMCwgbGlua0xlbikudHJpbSgpO1xuICAgICAgICAgIGNhcFszXSA9ICcnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsZXQgaHJlZiA9IGNhcFsyXTtcbiAgICAgIGxldCB0aXRsZSA9ICcnO1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5wZWRhbnRpYykge1xuICAgICAgICAvLyBzcGxpdCBwZWRhbnRpYyBocmVmIGFuZCB0aXRsZVxuICAgICAgICBjb25zdCBsaW5rID0gdGhpcy5ydWxlcy5vdGhlci5wZWRhbnRpY0hyZWZUaXRsZS5leGVjKGhyZWYpO1xuXG4gICAgICAgIGlmIChsaW5rKSB7XG4gICAgICAgICAgaHJlZiA9IGxpbmtbMV07XG4gICAgICAgICAgdGl0bGUgPSBsaW5rWzNdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aXRsZSA9IGNhcFszXSA/IGNhcFszXS5zbGljZSgxLCAtMSkgOiAnJztcbiAgICAgIH1cblxuICAgICAgaHJlZiA9IGhyZWYudHJpbSgpO1xuICAgICAgaWYgKHRoaXMucnVsZXMub3RoZXIuc3RhcnRBbmdsZUJyYWNrZXQudGVzdChocmVmKSkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnBlZGFudGljICYmICEodGhpcy5ydWxlcy5vdGhlci5lbmRBbmdsZUJyYWNrZXQudGVzdCh0cmltbWVkVXJsKSkpIHtcbiAgICAgICAgICAvLyBwZWRhbnRpYyBhbGxvd3Mgc3RhcnRpbmcgYW5nbGUgYnJhY2tldCB3aXRob3V0IGVuZGluZyBhbmdsZSBicmFja2V0XG4gICAgICAgICAgaHJlZiA9IGhyZWYuc2xpY2UoMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaHJlZiA9IGhyZWYuc2xpY2UoMSwgLTEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gb3V0cHV0TGluayhjYXAsIHtcbiAgICAgICAgaHJlZjogaHJlZiA/IGhyZWYucmVwbGFjZSh0aGlzLnJ1bGVzLmlubGluZS5hbnlQdW5jdHVhdGlvbiwgJyQxJykgOiBocmVmLFxuICAgICAgICB0aXRsZTogdGl0bGUgPyB0aXRsZS5yZXBsYWNlKHRoaXMucnVsZXMuaW5saW5lLmFueVB1bmN0dWF0aW9uLCAnJDEnKSA6IHRpdGxlLFxuICAgICAgfSwgY2FwWzBdLCB0aGlzLmxleGVyLCB0aGlzLnJ1bGVzKTtcbiAgICB9XG4gIH1cblxuICByZWZsaW5rKHNyYzogc3RyaW5nLCBsaW5rczogTGlua3MpOiBUb2tlbnMuTGluayB8IFRva2Vucy5JbWFnZSB8IFRva2Vucy5UZXh0IHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgY2FwO1xuICAgIGlmICgoY2FwID0gdGhpcy5ydWxlcy5pbmxpbmUucmVmbGluay5leGVjKHNyYykpXG4gICAgICB8fCAoY2FwID0gdGhpcy5ydWxlcy5pbmxpbmUubm9saW5rLmV4ZWMoc3JjKSkpIHtcbiAgICAgIGNvbnN0IGxpbmtTdHJpbmcgPSAoY2FwWzJdIHx8IGNhcFsxXSkucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLm11bHRpcGxlU3BhY2VHbG9iYWwsICcgJyk7XG4gICAgICBjb25zdCBsaW5rID0gbGlua3NbbGlua1N0cmluZy50b0xvd2VyQ2FzZSgpXTtcbiAgICAgIGlmICghbGluaykge1xuICAgICAgICBjb25zdCB0ZXh0ID0gY2FwWzBdLmNoYXJBdCgwKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgcmF3OiB0ZXh0LFxuICAgICAgICAgIHRleHQsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gb3V0cHV0TGluayhjYXAsIGxpbmssIGNhcFswXSwgdGhpcy5sZXhlciwgdGhpcy5ydWxlcyk7XG4gICAgfVxuICB9XG5cbiAgZW1TdHJvbmcoc3JjOiBzdHJpbmcsIG1hc2tlZFNyYzogc3RyaW5nLCBwcmV2Q2hhciA9ICcnKTogVG9rZW5zLkVtIHwgVG9rZW5zLlN0cm9uZyB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IG1hdGNoID0gdGhpcy5ydWxlcy5pbmxpbmUuZW1TdHJvbmdMRGVsaW0uZXhlYyhzcmMpO1xuICAgIGlmICghbWF0Y2gpIHJldHVybjtcbiAgICBpZiAoIW1hdGNoWzFdICYmICFtYXRjaFsyXSAmJiAhbWF0Y2hbM10gJiYgIW1hdGNoWzRdKSByZXR1cm47XG5cbiAgICAvLyBfIGNhbid0IGJlIGJldHdlZW4gdHdvIGFscGhhbnVtZXJpY3MuIFxccHtMfVxccHtOfSBpbmNsdWRlcyBub24tZW5nbGlzaCBhbHBoYWJldC9udW1iZXJzIGFzIHdlbGxcbiAgICBpZiAobWF0Y2hbNF0gJiYgcHJldkNoYXIubWF0Y2godGhpcy5ydWxlcy5vdGhlci51bmljb2RlQWxwaGFOdW1lcmljKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgbmV4dENoYXIgPSBtYXRjaFsxXSB8fCBtYXRjaFszXSB8fCAnJztcblxuICAgIGlmICghbmV4dENoYXIgfHwgIXByZXZDaGFyIHx8IHRoaXMucnVsZXMuaW5saW5lLnB1bmN0dWF0aW9uLmV4ZWMocHJldkNoYXIpKSB7XG4gICAgICAvLyB1bmljb2RlIFJlZ2V4IGNvdW50cyBlbW9qaSBhcyAxIGNoYXI7IHNwcmVhZCBpbnRvIGFycmF5IGZvciBwcm9wZXIgY291bnQgKHVzZWQgbXVsdGlwbGUgdGltZXMgYmVsb3cpXG4gICAgICBjb25zdCBsTGVuZ3RoID0gWy4uLm1hdGNoWzBdXS5sZW5ndGggLSAxO1xuICAgICAgbGV0IHJEZWxpbSwgckxlbmd0aCwgZGVsaW1Ub3RhbCA9IGxMZW5ndGgsIG1pZERlbGltVG90YWwgPSAwO1xuXG4gICAgICBjb25zdCBlbmRSZWcgPSBtYXRjaFswXVswXSA9PT0gJyonID8gdGhpcy5ydWxlcy5pbmxpbmUuZW1TdHJvbmdSRGVsaW1Bc3QgOiB0aGlzLnJ1bGVzLmlubGluZS5lbVN0cm9uZ1JEZWxpbVVuZDtcbiAgICAgIGVuZFJlZy5sYXN0SW5kZXggPSAwO1xuXG4gICAgICAvLyBDbGlwIG1hc2tlZFNyYyB0byBzYW1lIHNlY3Rpb24gb2Ygc3RyaW5nIGFzIHNyYyAobW92ZSB0byBsZXhlcj8pXG4gICAgICBtYXNrZWRTcmMgPSBtYXNrZWRTcmMuc2xpY2UoLTEgKiBzcmMubGVuZ3RoICsgbExlbmd0aCk7XG5cbiAgICAgIHdoaWxlICgobWF0Y2ggPSBlbmRSZWcuZXhlYyhtYXNrZWRTcmMpKSAhPSBudWxsKSB7XG4gICAgICAgIHJEZWxpbSA9IG1hdGNoWzFdIHx8IG1hdGNoWzJdIHx8IG1hdGNoWzNdIHx8IG1hdGNoWzRdIHx8IG1hdGNoWzVdIHx8IG1hdGNoWzZdO1xuXG4gICAgICAgIGlmICghckRlbGltKSBjb250aW51ZTsgLy8gc2tpcCBzaW5nbGUgKiBpbiBfX2FiYyphYmNfX1xuXG4gICAgICAgIHJMZW5ndGggPSBbLi4uckRlbGltXS5sZW5ndGg7XG5cbiAgICAgICAgaWYgKG1hdGNoWzNdIHx8IG1hdGNoWzRdKSB7IC8vIGZvdW5kIGFub3RoZXIgTGVmdCBEZWxpbVxuICAgICAgICAgIGRlbGltVG90YWwgKz0gckxlbmd0aDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBlbHNlIGlmIChtYXRjaFs1XSB8fCBtYXRjaFs2XSkgeyAvLyBlaXRoZXIgTGVmdCBvciBSaWdodCBEZWxpbVxuICAgICAgICAgIGlmIChsTGVuZ3RoICUgMyAmJiAhKChsTGVuZ3RoICsgckxlbmd0aCkgJSAzKSkge1xuICAgICAgICAgICAgbWlkRGVsaW1Ub3RhbCArPSByTGVuZ3RoO1xuICAgICAgICAgICAgY29udGludWU7IC8vIENvbW1vbk1hcmsgRW1waGFzaXMgUnVsZXMgOS0xMFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGRlbGltVG90YWwgLT0gckxlbmd0aDtcblxuICAgICAgICBpZiAoZGVsaW1Ub3RhbCA+IDApIGNvbnRpbnVlOyAvLyBIYXZlbid0IGZvdW5kIGVub3VnaCBjbG9zaW5nIGRlbGltaXRlcnNcblxuICAgICAgICAvLyBSZW1vdmUgZXh0cmEgY2hhcmFjdGVycy4gKmEqKiogLT4gKmEqXG4gICAgICAgIHJMZW5ndGggPSBNYXRoLm1pbihyTGVuZ3RoLCByTGVuZ3RoICsgZGVsaW1Ub3RhbCArIG1pZERlbGltVG90YWwpO1xuICAgICAgICAvLyBjaGFyIGxlbmd0aCBjYW4gYmUgPjEgZm9yIHVuaWNvZGUgY2hhcmFjdGVycztcbiAgICAgICAgY29uc3QgbGFzdENoYXJMZW5ndGggPSBbLi4ubWF0Y2hbMF1dWzBdLmxlbmd0aDtcbiAgICAgICAgY29uc3QgcmF3ID0gc3JjLnNsaWNlKDAsIGxMZW5ndGggKyBtYXRjaC5pbmRleCArIGxhc3RDaGFyTGVuZ3RoICsgckxlbmd0aCk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGBlbWAgaWYgc21hbGxlc3QgZGVsaW1pdGVyIGhhcyBvZGQgY2hhciBjb3VudC4gKmEqKipcbiAgICAgICAgaWYgKE1hdGgubWluKGxMZW5ndGgsIHJMZW5ndGgpICUgMikge1xuICAgICAgICAgIGNvbnN0IHRleHQgPSByYXcuc2xpY2UoMSwgLTEpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnZW0nLFxuICAgICAgICAgICAgcmF3LFxuICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgIHRva2VuczogdGhpcy5sZXhlci5pbmxpbmVUb2tlbnModGV4dCksXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENyZWF0ZSAnc3Ryb25nJyBpZiBzbWFsbGVzdCBkZWxpbWl0ZXIgaGFzIGV2ZW4gY2hhciBjb3VudC4gKiphKioqXG4gICAgICAgIGNvbnN0IHRleHQgPSByYXcuc2xpY2UoMiwgLTIpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6ICdzdHJvbmcnLFxuICAgICAgICAgIHJhdyxcbiAgICAgICAgICB0ZXh0LFxuICAgICAgICAgIHRva2VuczogdGhpcy5sZXhlci5pbmxpbmVUb2tlbnModGV4dCksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29kZXNwYW4oc3JjOiBzdHJpbmcpOiBUb2tlbnMuQ29kZXNwYW4gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuaW5saW5lLmNvZGUuZXhlYyhzcmMpO1xuICAgIGlmIChjYXApIHtcbiAgICAgIGxldCB0ZXh0ID0gY2FwWzJdLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5uZXdMaW5lQ2hhckdsb2JhbCwgJyAnKTtcbiAgICAgIGNvbnN0IGhhc05vblNwYWNlQ2hhcnMgPSB0aGlzLnJ1bGVzLm90aGVyLm5vblNwYWNlQ2hhci50ZXN0KHRleHQpO1xuICAgICAgY29uc3QgaGFzU3BhY2VDaGFyc09uQm90aEVuZHMgPSB0aGlzLnJ1bGVzLm90aGVyLnN0YXJ0aW5nU3BhY2VDaGFyLnRlc3QodGV4dCkgJiYgdGhpcy5ydWxlcy5vdGhlci5lbmRpbmdTcGFjZUNoYXIudGVzdCh0ZXh0KTtcbiAgICAgIGlmIChoYXNOb25TcGFjZUNoYXJzICYmIGhhc1NwYWNlQ2hhcnNPbkJvdGhFbmRzKSB7XG4gICAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cmluZygxLCB0ZXh0Lmxlbmd0aCAtIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ2NvZGVzcGFuJyxcbiAgICAgICAgcmF3OiBjYXBbMF0sXG4gICAgICAgIHRleHQsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGJyKHNyYzogc3RyaW5nKTogVG9rZW5zLkJyIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjYXAgPSB0aGlzLnJ1bGVzLmlubGluZS5ici5leGVjKHNyYyk7XG4gICAgaWYgKGNhcCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ2JyJyxcbiAgICAgICAgcmF3OiBjYXBbMF0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGRlbChzcmM6IHN0cmluZywgbWFza2VkU3JjOiBzdHJpbmcsIHByZXZDaGFyID0gJycpOiBUb2tlbnMuRGVsIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgbWF0Y2ggPSB0aGlzLnJ1bGVzLmlubGluZS5kZWxMRGVsaW0uZXhlYyhzcmMpO1xuICAgIGlmICghbWF0Y2gpIHJldHVybjtcblxuICAgIGNvbnN0IG5leHRDaGFyID0gbWF0Y2hbMV0gfHwgJyc7XG5cbiAgICBpZiAoIW5leHRDaGFyIHx8ICFwcmV2Q2hhciB8fCB0aGlzLnJ1bGVzLmlubGluZS5wdW5jdHVhdGlvbi5leGVjKHByZXZDaGFyKSkge1xuICAgICAgLy8gdW5pY29kZSBSZWdleCBjb3VudHMgZW1vamkgYXMgMSBjaGFyOyBzcHJlYWQgaW50byBhcnJheSBmb3IgcHJvcGVyIGNvdW50XG4gICAgICBjb25zdCBsTGVuZ3RoID0gWy4uLm1hdGNoWzBdXS5sZW5ndGggLSAxO1xuICAgICAgbGV0IHJEZWxpbSwgckxlbmd0aCwgZGVsaW1Ub3RhbCA9IGxMZW5ndGg7XG5cbiAgICAgIGNvbnN0IGVuZFJlZyA9IHRoaXMucnVsZXMuaW5saW5lLmRlbFJEZWxpbTtcbiAgICAgIGVuZFJlZy5sYXN0SW5kZXggPSAwO1xuXG4gICAgICAvLyBDbGlwIG1hc2tlZFNyYyB0byBzYW1lIHNlY3Rpb24gb2Ygc3RyaW5nIGFzIHNyY1xuICAgICAgbWFza2VkU3JjID0gbWFza2VkU3JjLnNsaWNlKC0xICogc3JjLmxlbmd0aCArIGxMZW5ndGgpO1xuXG4gICAgICB3aGlsZSAoKG1hdGNoID0gZW5kUmVnLmV4ZWMobWFza2VkU3JjKSkgIT0gbnVsbCkge1xuICAgICAgICByRGVsaW0gPSBtYXRjaFsxXSB8fCBtYXRjaFsyXSB8fCBtYXRjaFszXSB8fCBtYXRjaFs0XSB8fCBtYXRjaFs1XSB8fCBtYXRjaFs2XTtcblxuICAgICAgICBpZiAoIXJEZWxpbSkgY29udGludWU7XG5cbiAgICAgICAgckxlbmd0aCA9IFsuLi5yRGVsaW1dLmxlbmd0aDtcblxuICAgICAgICBpZiAockxlbmd0aCAhPT0gbExlbmd0aCkgY29udGludWU7XG5cbiAgICAgICAgaWYgKG1hdGNoWzNdIHx8IG1hdGNoWzRdKSB7IC8vIGZvdW5kIGFub3RoZXIgTGVmdCBEZWxpbVxuICAgICAgICAgIGRlbGltVG90YWwgKz0gckxlbmd0aDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlbGltVG90YWwgLT0gckxlbmd0aDtcblxuICAgICAgICBpZiAoZGVsaW1Ub3RhbCA+IDApIGNvbnRpbnVlOyAvLyBIYXZlbid0IGZvdW5kIGVub3VnaCBjbG9zaW5nIGRlbGltaXRlcnNcblxuICAgICAgICAvLyBSZW1vdmUgZXh0cmEgY2hhcmFjdGVyc1xuICAgICAgICByTGVuZ3RoID0gTWF0aC5taW4ockxlbmd0aCwgckxlbmd0aCArIGRlbGltVG90YWwpO1xuICAgICAgICAvLyBjaGFyIGxlbmd0aCBjYW4gYmUgPjEgZm9yIHVuaWNvZGUgY2hhcmFjdGVyc1xuICAgICAgICBjb25zdCBsYXN0Q2hhckxlbmd0aCA9IFsuLi5tYXRjaFswXV1bMF0ubGVuZ3RoO1xuICAgICAgICBjb25zdCByYXcgPSBzcmMuc2xpY2UoMCwgbExlbmd0aCArIG1hdGNoLmluZGV4ICsgbGFzdENoYXJMZW5ndGggKyByTGVuZ3RoKTtcblxuICAgICAgICAvLyBDcmVhdGUgZGVsIHRva2VuIC0gb25seSBzaW5nbGUgfiBvciBkb3VibGUgfn4gc3VwcG9ydGVkXG4gICAgICAgIGNvbnN0IHRleHQgPSByYXcuc2xpY2UobExlbmd0aCwgLWxMZW5ndGgpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6ICdkZWwnLFxuICAgICAgICAgIHJhdyxcbiAgICAgICAgICB0ZXh0LFxuICAgICAgICAgIHRva2VuczogdGhpcy5sZXhlci5pbmxpbmVUb2tlbnModGV4dCksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXV0b2xpbmsoc3JjOiBzdHJpbmcpOiBUb2tlbnMuTGluayB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5pbmxpbmUuYXV0b2xpbmsuZXhlYyhzcmMpO1xuICAgIGlmIChjYXApIHtcbiAgICAgIGxldCB0ZXh0LCBocmVmO1xuICAgICAgaWYgKGNhcFsyXSA9PT0gJ0AnKSB7XG4gICAgICAgIHRleHQgPSBjYXBbMV07XG4gICAgICAgIGhyZWYgPSAnbWFpbHRvOicgKyB0ZXh0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGV4dCA9IGNhcFsxXTtcbiAgICAgICAgaHJlZiA9IHRleHQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdsaW5rJyxcbiAgICAgICAgcmF3OiBjYXBbMF0sXG4gICAgICAgIHRleHQsXG4gICAgICAgIGhyZWYsXG4gICAgICAgIHRva2VuczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgIHJhdzogdGV4dCxcbiAgICAgICAgICAgIHRleHQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgdXJsKHNyYzogc3RyaW5nKTogVG9rZW5zLkxpbmsgfCB1bmRlZmluZWQge1xuICAgIGxldCBjYXA7XG4gICAgaWYgKGNhcCA9IHRoaXMucnVsZXMuaW5saW5lLnVybC5leGVjKHNyYykpIHtcbiAgICAgIGxldCB0ZXh0LCBocmVmO1xuICAgICAgaWYgKGNhcFsyXSA9PT0gJ0AnKSB7XG4gICAgICAgIHRleHQgPSBjYXBbMF07XG4gICAgICAgIGhyZWYgPSAnbWFpbHRvOicgKyB0ZXh0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZG8gZXh0ZW5kZWQgYXV0b2xpbmsgcGF0aCB2YWxpZGF0aW9uXG4gICAgICAgIGxldCBwcmV2Q2FwWmVybztcbiAgICAgICAgZG8ge1xuICAgICAgICAgIHByZXZDYXBaZXJvID0gY2FwWzBdO1xuICAgICAgICAgIGNhcFswXSA9IHRoaXMucnVsZXMuaW5saW5lLl9iYWNrcGVkYWwuZXhlYyhjYXBbMF0pPy5bMF0gPz8gJyc7XG4gICAgICAgIH0gd2hpbGUgKHByZXZDYXBaZXJvICE9PSBjYXBbMF0pO1xuICAgICAgICB0ZXh0ID0gY2FwWzBdO1xuICAgICAgICBpZiAoY2FwWzFdID09PSAnd3d3LicpIHtcbiAgICAgICAgICBocmVmID0gJ2h0dHA6Ly8nICsgY2FwWzBdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGhyZWYgPSBjYXBbMF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdsaW5rJyxcbiAgICAgICAgcmF3OiBjYXBbMF0sXG4gICAgICAgIHRleHQsXG4gICAgICAgIGhyZWYsXG4gICAgICAgIHRva2VuczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgIHJhdzogdGV4dCxcbiAgICAgICAgICAgIHRleHQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgaW5saW5lVGV4dChzcmM6IHN0cmluZyk6IFRva2Vucy5UZXh0IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjYXAgPSB0aGlzLnJ1bGVzLmlubGluZS50ZXh0LmV4ZWMoc3JjKTtcbiAgICBpZiAoY2FwKSB7XG4gICAgICBjb25zdCBlc2NhcGVkID0gdGhpcy5sZXhlci5zdGF0ZS5pblJhd0Jsb2NrO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICByYXc6IGNhcFswXSxcbiAgICAgICAgdGV4dDogY2FwWzBdLFxuICAgICAgICBlc2NhcGVkLFxuICAgICAgfTtcbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBfVG9rZW5pemVyIH0gZnJvbSAnLi9Ub2tlbml6ZXIudHMnO1xuaW1wb3J0IHsgX2RlZmF1bHRzIH0gZnJvbSAnLi9kZWZhdWx0cy50cyc7XG5pbXBvcnQgeyBvdGhlciwgYmxvY2ssIGlubGluZSB9IGZyb20gJy4vcnVsZXMudHMnO1xuaW1wb3J0IHR5cGUgeyBUb2tlbiwgVG9rZW5zTGlzdCwgVG9rZW5zIH0gZnJvbSAnLi9Ub2tlbnMudHMnO1xuaW1wb3J0IHR5cGUgeyBNYXJrZWRPcHRpb25zIH0gZnJvbSAnLi9NYXJrZWRPcHRpb25zLnRzJztcblxuLyoqXG4gKiBCbG9jayBMZXhlclxuICovXG5leHBvcnQgY2xhc3MgX0xleGVyPFBhcnNlck91dHB1dCA9IHN0cmluZywgUmVuZGVyZXJPdXRwdXQgPSBzdHJpbmc+IHtcbiAgdG9rZW5zOiBUb2tlbnNMaXN0O1xuICBvcHRpb25zOiBNYXJrZWRPcHRpb25zPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+O1xuICBzdGF0ZToge1xuICAgIGluTGluazogYm9vbGVhbjtcbiAgICBpblJhd0Jsb2NrOiBib29sZWFuO1xuICAgIHRvcDogYm9vbGVhbjtcbiAgfTtcblxuICBwdWJsaWMgaW5saW5lUXVldWU6IHsgc3JjOiBzdHJpbmcsIHRva2VuczogVG9rZW5bXSB9W107XG5cbiAgcHJpdmF0ZSB0b2tlbml6ZXI6IF9Ub2tlbml6ZXI8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD47XG5cbiAgY29uc3RydWN0b3Iob3B0aW9ucz86IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4pIHtcbiAgICAvLyBUb2tlbkxpc3QgY2Fubm90IGJlIGNyZWF0ZWQgaW4gb25lIGdvXG4gICAgdGhpcy50b2tlbnMgPSBbXSBhcyB1bmtub3duIGFzIFRva2Vuc0xpc3Q7XG4gICAgdGhpcy50b2tlbnMubGlua3MgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwgX2RlZmF1bHRzO1xuICAgIHRoaXMub3B0aW9ucy50b2tlbml6ZXIgPSB0aGlzLm9wdGlvbnMudG9rZW5pemVyIHx8IG5ldyBfVG9rZW5pemVyPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+KCk7XG4gICAgdGhpcy50b2tlbml6ZXIgPSB0aGlzLm9wdGlvbnMudG9rZW5pemVyO1xuICAgIHRoaXMudG9rZW5pemVyLm9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgdGhpcy50b2tlbml6ZXIubGV4ZXIgPSB0aGlzO1xuICAgIHRoaXMuaW5saW5lUXVldWUgPSBbXTtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgaW5MaW5rOiBmYWxzZSxcbiAgICAgIGluUmF3QmxvY2s6IGZhbHNlLFxuICAgICAgdG9wOiB0cnVlLFxuICAgIH07XG5cbiAgICBjb25zdCBydWxlcyA9IHtcbiAgICAgIG90aGVyLFxuICAgICAgYmxvY2s6IGJsb2NrLm5vcm1hbCxcbiAgICAgIGlubGluZTogaW5saW5lLm5vcm1hbCxcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5wZWRhbnRpYykge1xuICAgICAgcnVsZXMuYmxvY2sgPSBibG9jay5wZWRhbnRpYztcbiAgICAgIHJ1bGVzLmlubGluZSA9IGlubGluZS5wZWRhbnRpYztcbiAgICB9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy5nZm0pIHtcbiAgICAgIHJ1bGVzLmJsb2NrID0gYmxvY2suZ2ZtO1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5icmVha3MpIHtcbiAgICAgICAgcnVsZXMuaW5saW5lID0gaW5saW5lLmJyZWFrcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJ1bGVzLmlubGluZSA9IGlubGluZS5nZm07XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMudG9rZW5pemVyLnJ1bGVzID0gcnVsZXM7XG4gIH1cblxuICAvKipcbiAgICogRXhwb3NlIFJ1bGVzXG4gICAqL1xuICBzdGF0aWMgZ2V0IHJ1bGVzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBibG9jayxcbiAgICAgIGlubGluZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXRpYyBMZXggTWV0aG9kXG4gICAqL1xuICBzdGF0aWMgbGV4PFBhcnNlck91dHB1dCA9IHN0cmluZywgUmVuZGVyZXJPdXRwdXQgPSBzdHJpbmc+KHNyYzogc3RyaW5nLCBvcHRpb25zPzogTWFya2VkT3B0aW9uczxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0Pikge1xuICAgIGNvbnN0IGxleGVyID0gbmV3IF9MZXhlcjxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0PihvcHRpb25zKTtcbiAgICByZXR1cm4gbGV4ZXIubGV4KHNyYyk7XG4gIH1cblxuICAvKipcbiAgICogU3RhdGljIExleCBJbmxpbmUgTWV0aG9kXG4gICAqL1xuICBzdGF0aWMgbGV4SW5saW5lPFBhcnNlck91dHB1dCA9IHN0cmluZywgUmVuZGVyZXJPdXRwdXQgPSBzdHJpbmc+KHNyYzogc3RyaW5nLCBvcHRpb25zPzogTWFya2VkT3B0aW9uczxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0Pikge1xuICAgIGNvbnN0IGxleGVyID0gbmV3IF9MZXhlcjxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0PihvcHRpb25zKTtcbiAgICByZXR1cm4gbGV4ZXIuaW5saW5lVG9rZW5zKHNyYyk7XG4gIH1cblxuICAvKipcbiAgICogUHJlcHJvY2Vzc2luZ1xuICAgKi9cbiAgbGV4KHNyYzogc3RyaW5nKSB7XG4gICAgc3JjID0gc3JjLnJlcGxhY2Uob3RoZXIuY2FycmlhZ2VSZXR1cm4sICdcXG4nKTtcblxuICAgIHRoaXMuYmxvY2tUb2tlbnMoc3JjLCB0aGlzLnRva2Vucyk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuaW5saW5lUXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5leHQgPSB0aGlzLmlubGluZVF1ZXVlW2ldO1xuICAgICAgdGhpcy5pbmxpbmVUb2tlbnMobmV4dC5zcmMsIG5leHQudG9rZW5zKTtcbiAgICB9XG4gICAgdGhpcy5pbmxpbmVRdWV1ZSA9IFtdO1xuXG4gICAgcmV0dXJuIHRoaXMudG9rZW5zO1xuICB9XG5cbiAgLyoqXG4gICAqIExleGluZ1xuICAgKi9cbiAgYmxvY2tUb2tlbnMoc3JjOiBzdHJpbmcsIHRva2Vucz86IFRva2VuW10sIGxhc3RQYXJhZ3JhcGhDbGlwcGVkPzogYm9vbGVhbik6IFRva2VuW107XG4gIGJsb2NrVG9rZW5zKHNyYzogc3RyaW5nLCB0b2tlbnM/OiBUb2tlbnNMaXN0LCBsYXN0UGFyYWdyYXBoQ2xpcHBlZD86IGJvb2xlYW4pOiBUb2tlbnNMaXN0O1xuICBibG9ja1Rva2VucyhzcmM6IHN0cmluZywgdG9rZW5zOiBUb2tlbltdID0gW10sIGxhc3RQYXJhZ3JhcGhDbGlwcGVkID0gZmFsc2UpIHtcbiAgICB0aGlzLnRva2VuaXplci5sZXhlciA9IHRoaXM7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5wZWRhbnRpYykge1xuICAgICAgc3JjID0gc3JjLnJlcGxhY2Uob3RoZXIudGFiQ2hhckdsb2JhbCwgJyAgICAnKS5yZXBsYWNlKG90aGVyLnNwYWNlTGluZSwgJycpO1xuICAgIH1cblxuICAgIHdoaWxlIChzcmMpIHtcbiAgICAgIGxldCB0b2tlbjogVG9rZW5zLkdlbmVyaWMgfCB1bmRlZmluZWQ7XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucz8uYmxvY2s/LnNvbWUoKGV4dFRva2VuaXplcikgPT4ge1xuICAgICAgICBpZiAodG9rZW4gPSBleHRUb2tlbml6ZXIuY2FsbCh7IGxleGVyOiB0aGlzIH0sIHNyYywgdG9rZW5zKSkge1xuICAgICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0pKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBuZXdsaW5lXG4gICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5zcGFjZShzcmMpKSB7XG4gICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IGxhc3RUb2tlbiA9IHRva2Vucy5hdCgtMSk7XG4gICAgICAgIGlmICh0b2tlbi5yYXcubGVuZ3RoID09PSAxICYmIGxhc3RUb2tlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gaWYgdGhlcmUncyBhIHNpbmdsZSBcXG4gYXMgYSBzcGFjZXIsIGl0J3MgdGVybWluYXRpbmcgdGhlIGxhc3QgbGluZSxcbiAgICAgICAgICAvLyBzbyBtb3ZlIGl0IHRoZXJlIHNvIHRoYXQgd2UgZG9uJ3QgZ2V0IHVubmVjZXNzYXJ5IHBhcmFncmFwaCB0YWdzXG4gICAgICAgICAgbGFzdFRva2VuLnJhdyArPSAnXFxuJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGNvZGVcbiAgICAgIGlmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLmNvZGUoc3JjKSkge1xuICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICBjb25zdCBsYXN0VG9rZW4gPSB0b2tlbnMuYXQoLTEpO1xuICAgICAgICAvLyBBbiBpbmRlbnRlZCBjb2RlIGJsb2NrIGNhbm5vdCBpbnRlcnJ1cHQgYSBwYXJhZ3JhcGguXG4gICAgICAgIGlmIChsYXN0VG9rZW4/LnR5cGUgPT09ICdwYXJhZ3JhcGgnIHx8IGxhc3RUb2tlbj8udHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICAgICAgbGFzdFRva2VuLnJhdyArPSAobGFzdFRva2VuLnJhdy5lbmRzV2l0aCgnXFxuJykgPyAnJyA6ICdcXG4nKSArIHRva2VuLnJhdztcbiAgICAgICAgICBsYXN0VG9rZW4udGV4dCArPSAnXFxuJyArIHRva2VuLnRleHQ7XG4gICAgICAgICAgdGhpcy5pbmxpbmVRdWV1ZS5hdCgtMSkhLnNyYyA9IGxhc3RUb2tlbi50ZXh0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gZmVuY2VzXG4gICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5mZW5jZXMoc3JjKSkge1xuICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBoZWFkaW5nXG4gICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5oZWFkaW5nKHNyYykpIHtcbiAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gaHJcbiAgICAgIGlmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLmhyKHNyYykpIHtcbiAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gYmxvY2txdW90ZVxuICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIuYmxvY2txdW90ZShzcmMpKSB7XG4gICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGxpc3RcbiAgICAgIGlmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLmxpc3Qoc3JjKSkge1xuICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBodG1sXG4gICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5odG1sKHNyYykpIHtcbiAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gZGVmXG4gICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5kZWYoc3JjKSkge1xuICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICBjb25zdCBsYXN0VG9rZW4gPSB0b2tlbnMuYXQoLTEpO1xuICAgICAgICBpZiAobGFzdFRva2VuPy50eXBlID09PSAncGFyYWdyYXBoJyB8fCBsYXN0VG9rZW4/LnR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgICAgIGxhc3RUb2tlbi5yYXcgKz0gKGxhc3RUb2tlbi5yYXcuZW5kc1dpdGgoJ1xcbicpID8gJycgOiAnXFxuJykgKyB0b2tlbi5yYXc7XG4gICAgICAgICAgbGFzdFRva2VuLnRleHQgKz0gJ1xcbicgKyB0b2tlbi5yYXc7XG4gICAgICAgICAgdGhpcy5pbmxpbmVRdWV1ZS5hdCgtMSkhLnNyYyA9IGxhc3RUb2tlbi50ZXh0O1xuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLnRva2Vucy5saW5rc1t0b2tlbi50YWddKSB7XG4gICAgICAgICAgdGhpcy50b2tlbnMubGlua3NbdG9rZW4udGFnXSA9IHtcbiAgICAgICAgICAgIGhyZWY6IHRva2VuLmhyZWYsXG4gICAgICAgICAgICB0aXRsZTogdG9rZW4udGl0bGUsXG4gICAgICAgICAgfTtcbiAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIHRhYmxlIChnZm0pXG4gICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci50YWJsZShzcmMpKSB7XG4gICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGxoZWFkaW5nXG4gICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5saGVhZGluZyhzcmMpKSB7XG4gICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIHRvcC1sZXZlbCBwYXJhZ3JhcGhcbiAgICAgIC8vIHByZXZlbnQgcGFyYWdyYXBoIGNvbnN1bWluZyBleHRlbnNpb25zIGJ5IGNsaXBwaW5nICdzcmMnIHRvIGV4dGVuc2lvbiBzdGFydFxuICAgICAgbGV0IGN1dFNyYyA9IHNyYztcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucz8uc3RhcnRCbG9jaykge1xuICAgICAgICBsZXQgc3RhcnRJbmRleCA9IEluZmluaXR5O1xuICAgICAgICBjb25zdCB0ZW1wU3JjID0gc3JjLnNsaWNlKDEpO1xuICAgICAgICBsZXQgdGVtcFN0YXJ0O1xuICAgICAgICB0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5zdGFydEJsb2NrLmZvckVhY2goKGdldFN0YXJ0SW5kZXgpID0+IHtcbiAgICAgICAgICB0ZW1wU3RhcnQgPSBnZXRTdGFydEluZGV4LmNhbGwoeyBsZXhlcjogdGhpcyB9LCB0ZW1wU3JjKTtcbiAgICAgICAgICBpZiAodHlwZW9mIHRlbXBTdGFydCA9PT0gJ251bWJlcicgJiYgdGVtcFN0YXJ0ID49IDApIHtcbiAgICAgICAgICAgIHN0YXJ0SW5kZXggPSBNYXRoLm1pbihzdGFydEluZGV4LCB0ZW1wU3RhcnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChzdGFydEluZGV4IDwgSW5maW5pdHkgJiYgc3RhcnRJbmRleCA+PSAwKSB7XG4gICAgICAgICAgY3V0U3JjID0gc3JjLnN1YnN0cmluZygwLCBzdGFydEluZGV4ICsgMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnN0YXRlLnRvcCAmJiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5wYXJhZ3JhcGgoY3V0U3JjKSkpIHtcbiAgICAgICAgY29uc3QgbGFzdFRva2VuID0gdG9rZW5zLmF0KC0xKTtcbiAgICAgICAgaWYgKGxhc3RQYXJhZ3JhcGhDbGlwcGVkICYmIGxhc3RUb2tlbj8udHlwZSA9PT0gJ3BhcmFncmFwaCcpIHtcbiAgICAgICAgICBsYXN0VG9rZW4ucmF3ICs9IChsYXN0VG9rZW4ucmF3LmVuZHNXaXRoKCdcXG4nKSA/ICcnIDogJ1xcbicpICsgdG9rZW4ucmF3O1xuICAgICAgICAgIGxhc3RUb2tlbi50ZXh0ICs9ICdcXG4nICsgdG9rZW4udGV4dDtcbiAgICAgICAgICB0aGlzLmlubGluZVF1ZXVlLnBvcCgpO1xuICAgICAgICAgIHRoaXMuaW5saW5lUXVldWUuYXQoLTEpIS5zcmMgPSBsYXN0VG9rZW4udGV4dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdFBhcmFncmFwaENsaXBwZWQgPSBjdXRTcmMubGVuZ3RoICE9PSBzcmMubGVuZ3RoO1xuICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gdGV4dFxuICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIudGV4dChzcmMpKSB7XG4gICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IGxhc3RUb2tlbiA9IHRva2Vucy5hdCgtMSk7XG4gICAgICAgIGlmIChsYXN0VG9rZW4/LnR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgICAgIGxhc3RUb2tlbi5yYXcgKz0gKGxhc3RUb2tlbi5yYXcuZW5kc1dpdGgoJ1xcbicpID8gJycgOiAnXFxuJykgKyB0b2tlbi5yYXc7XG4gICAgICAgICAgbGFzdFRva2VuLnRleHQgKz0gJ1xcbicgKyB0b2tlbi50ZXh0O1xuICAgICAgICAgIHRoaXMuaW5saW5lUXVldWUucG9wKCk7XG4gICAgICAgICAgdGhpcy5pbmxpbmVRdWV1ZS5hdCgtMSkhLnNyYyA9IGxhc3RUb2tlbi50ZXh0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNyYykge1xuICAgICAgICBjb25zdCBlcnJNc2cgPSAnSW5maW5pdGUgbG9vcCBvbiBieXRlOiAnICsgc3JjLmNoYXJDb2RlQXQoMCk7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJNc2cpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJNc2cpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zdGF0ZS50b3AgPSB0cnVlO1xuICAgIHJldHVybiB0b2tlbnM7XG4gIH1cblxuICBpbmxpbmUoc3JjOiBzdHJpbmcsIHRva2VuczogVG9rZW5bXSA9IFtdKSB7XG4gICAgdGhpcy5pbmxpbmVRdWV1ZS5wdXNoKHsgc3JjLCB0b2tlbnMgfSk7XG4gICAgcmV0dXJuIHRva2VucztcbiAgfVxuXG4gIC8qKlxuICAgKiBMZXhpbmcvQ29tcGlsaW5nXG4gICAqL1xuICBpbmxpbmVUb2tlbnMoc3JjOiBzdHJpbmcsIHRva2VuczogVG9rZW5bXSA9IFtdKTogVG9rZW5bXSB7XG4gICAgdGhpcy50b2tlbml6ZXIubGV4ZXIgPSB0aGlzO1xuICAgIC8vIFN0cmluZyB3aXRoIGxpbmtzIG1hc2tlZCB0byBhdm9pZCBpbnRlcmZlcmVuY2Ugd2l0aCBlbSBhbmQgc3Ryb25nXG4gICAgbGV0IG1hc2tlZFNyYyA9IHNyYztcbiAgICBsZXQgbWF0Y2g6IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGwgPSBudWxsO1xuXG4gICAgLy8gTWFzayBvdXQgcmVmbGlua3NcbiAgICBpZiAodGhpcy50b2tlbnMubGlua3MpIHtcbiAgICAgIGNvbnN0IGxpbmtzID0gT2JqZWN0LmtleXModGhpcy50b2tlbnMubGlua3MpO1xuICAgICAgaWYgKGxpbmtzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgd2hpbGUgKChtYXRjaCA9IHRoaXMudG9rZW5pemVyLnJ1bGVzLmlubGluZS5yZWZsaW5rU2VhcmNoLmV4ZWMobWFza2VkU3JjKSkgIT0gbnVsbCkge1xuICAgICAgICAgIGlmIChsaW5rcy5pbmNsdWRlcyhtYXRjaFswXS5zbGljZShtYXRjaFswXS5sYXN0SW5kZXhPZignWycpICsgMSwgLTEpKSkge1xuICAgICAgICAgICAgbWFza2VkU3JjID0gbWFza2VkU3JjLnNsaWNlKDAsIG1hdGNoLmluZGV4KVxuICAgICAgICAgICAgICArICdbJyArICdhJy5yZXBlYXQobWF0Y2hbMF0ubGVuZ3RoIC0gMikgKyAnXSdcbiAgICAgICAgICAgICAgKyBtYXNrZWRTcmMuc2xpY2UodGhpcy50b2tlbml6ZXIucnVsZXMuaW5saW5lLnJlZmxpbmtTZWFyY2gubGFzdEluZGV4KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBNYXNrIG91dCBlc2NhcGVkIGNoYXJhY3RlcnNcbiAgICB3aGlsZSAoKG1hdGNoID0gdGhpcy50b2tlbml6ZXIucnVsZXMuaW5saW5lLmFueVB1bmN0dWF0aW9uLmV4ZWMobWFza2VkU3JjKSkgIT0gbnVsbCkge1xuICAgICAgbWFza2VkU3JjID0gbWFza2VkU3JjLnNsaWNlKDAsIG1hdGNoLmluZGV4KSArICcrKycgKyBtYXNrZWRTcmMuc2xpY2UodGhpcy50b2tlbml6ZXIucnVsZXMuaW5saW5lLmFueVB1bmN0dWF0aW9uLmxhc3RJbmRleCk7XG4gICAgfVxuXG4gICAgLy8gTWFzayBvdXQgb3RoZXIgYmxvY2tzXG4gICAgbGV0IG9mZnNldDtcbiAgICB3aGlsZSAoKG1hdGNoID0gdGhpcy50b2tlbml6ZXIucnVsZXMuaW5saW5lLmJsb2NrU2tpcC5leGVjKG1hc2tlZFNyYykpICE9IG51bGwpIHtcbiAgICAgIG9mZnNldCA9IG1hdGNoWzJdID8gbWF0Y2hbMl0ubGVuZ3RoIDogMDtcbiAgICAgIG1hc2tlZFNyYyA9IG1hc2tlZFNyYy5zbGljZSgwLCBtYXRjaC5pbmRleCArIG9mZnNldCkgKyAnWycgKyAnYScucmVwZWF0KG1hdGNoWzBdLmxlbmd0aCAtIG9mZnNldCAtIDIpICsgJ10nICsgbWFza2VkU3JjLnNsaWNlKHRoaXMudG9rZW5pemVyLnJ1bGVzLmlubGluZS5ibG9ja1NraXAubGFzdEluZGV4KTtcbiAgICB9XG5cbiAgICAvLyBNYXNrIG91dCBibG9ja3MgZnJvbSBleHRlbnNpb25zXG4gICAgbWFza2VkU3JjID0gdGhpcy5vcHRpb25zLmhvb2tzPy5lbVN0cm9uZ01hc2s/LmNhbGwoeyBsZXhlcjogdGhpcyB9LCBtYXNrZWRTcmMpID8/IG1hc2tlZFNyYztcblxuICAgIGxldCBrZWVwUHJldkNoYXIgPSBmYWxzZTtcbiAgICBsZXQgcHJldkNoYXIgPSAnJztcbiAgICB3aGlsZSAoc3JjKSB7XG4gICAgICBpZiAoIWtlZXBQcmV2Q2hhcikge1xuICAgICAgICBwcmV2Q2hhciA9ICcnO1xuICAgICAgfVxuICAgICAga2VlcFByZXZDaGFyID0gZmFsc2U7XG5cbiAgICAgIGxldCB0b2tlbjogVG9rZW5zLkdlbmVyaWMgfCB1bmRlZmluZWQ7XG5cbiAgICAgIC8vIGV4dGVuc2lvbnNcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucz8uaW5saW5lPy5zb21lKChleHRUb2tlbml6ZXIpID0+IHtcbiAgICAgICAgaWYgKHRva2VuID0gZXh0VG9rZW5pemVyLmNhbGwoeyBsZXhlcjogdGhpcyB9LCBzcmMsIHRva2VucykpIHtcbiAgICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gZXNjYXBlXG4gICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5lc2NhcGUoc3JjKSkge1xuICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyB0YWdcbiAgICAgIGlmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLnRhZyhzcmMpKSB7XG4gICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGxpbmtcbiAgICAgIGlmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLmxpbmsoc3JjKSkge1xuICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyByZWZsaW5rLCBub2xpbmtcbiAgICAgIGlmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLnJlZmxpbmsoc3JjLCB0aGlzLnRva2Vucy5saW5rcykpIHtcbiAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgbGFzdFRva2VuID0gdG9rZW5zLmF0KC0xKTtcbiAgICAgICAgaWYgKHRva2VuLnR5cGUgPT09ICd0ZXh0JyAmJiBsYXN0VG9rZW4/LnR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgICAgIGxhc3RUb2tlbi5yYXcgKz0gdG9rZW4ucmF3O1xuICAgICAgICAgIGxhc3RUb2tlbi50ZXh0ICs9IHRva2VuLnRleHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBlbSAmIHN0cm9uZ1xuICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIuZW1TdHJvbmcoc3JjLCBtYXNrZWRTcmMsIHByZXZDaGFyKSkge1xuICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBjb2RlXG4gICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5jb2Rlc3BhbihzcmMpKSB7XG4gICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGJyXG4gICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5icihzcmMpKSB7XG4gICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGRlbCAoZ2ZtKVxuICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIuZGVsKHNyYywgbWFza2VkU3JjLCBwcmV2Q2hhcikpIHtcbiAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gYXV0b2xpbmtcbiAgICAgIGlmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLmF1dG9saW5rKHNyYykpIHtcbiAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gdXJsIChnZm0pXG4gICAgICBpZiAoIXRoaXMuc3RhdGUuaW5MaW5rICYmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLnVybChzcmMpKSkge1xuICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyB0ZXh0XG4gICAgICAvLyBwcmV2ZW50IGlubGluZVRleHQgY29uc3VtaW5nIGV4dGVuc2lvbnMgYnkgY2xpcHBpbmcgJ3NyYycgdG8gZXh0ZW5zaW9uIHN0YXJ0XG4gICAgICBsZXQgY3V0U3JjID0gc3JjO1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5leHRlbnNpb25zPy5zdGFydElubGluZSkge1xuICAgICAgICBsZXQgc3RhcnRJbmRleCA9IEluZmluaXR5O1xuICAgICAgICBjb25zdCB0ZW1wU3JjID0gc3JjLnNsaWNlKDEpO1xuICAgICAgICBsZXQgdGVtcFN0YXJ0O1xuICAgICAgICB0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5zdGFydElubGluZS5mb3JFYWNoKChnZXRTdGFydEluZGV4KSA9PiB7XG4gICAgICAgICAgdGVtcFN0YXJ0ID0gZ2V0U3RhcnRJbmRleC5jYWxsKHsgbGV4ZXI6IHRoaXMgfSwgdGVtcFNyYyk7XG4gICAgICAgICAgaWYgKHR5cGVvZiB0ZW1wU3RhcnQgPT09ICdudW1iZXInICYmIHRlbXBTdGFydCA+PSAwKSB7XG4gICAgICAgICAgICBzdGFydEluZGV4ID0gTWF0aC5taW4oc3RhcnRJbmRleCwgdGVtcFN0YXJ0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoc3RhcnRJbmRleCA8IEluZmluaXR5ICYmIHN0YXJ0SW5kZXggPj0gMCkge1xuICAgICAgICAgIGN1dFNyYyA9IHNyYy5zdWJzdHJpbmcoMCwgc3RhcnRJbmRleCArIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5pbmxpbmVUZXh0KGN1dFNyYykpIHtcbiAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgaWYgKHRva2VuLnJhdy5zbGljZSgtMSkgIT09ICdfJykgeyAvLyBUcmFjayBwcmV2Q2hhciBiZWZvcmUgc3RyaW5nIG9mIF9fX18gc3RhcnRlZFxuICAgICAgICAgIHByZXZDaGFyID0gdG9rZW4ucmF3LnNsaWNlKC0xKTtcbiAgICAgICAgfVxuICAgICAgICBrZWVwUHJldkNoYXIgPSB0cnVlO1xuICAgICAgICBjb25zdCBsYXN0VG9rZW4gPSB0b2tlbnMuYXQoLTEpO1xuICAgICAgICBpZiAobGFzdFRva2VuPy50eXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgICBsYXN0VG9rZW4ucmF3ICs9IHRva2VuLnJhdztcbiAgICAgICAgICBsYXN0VG9rZW4udGV4dCArPSB0b2tlbi50ZXh0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNyYykge1xuICAgICAgICBjb25zdCBlcnJNc2cgPSAnSW5maW5pdGUgbG9vcCBvbiBieXRlOiAnICsgc3JjLmNoYXJDb2RlQXQoMCk7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJNc2cpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJNc2cpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRva2VucztcbiAgfVxufVxuIiwgImltcG9ydCB7IF9kZWZhdWx0cyB9IGZyb20gJy4vZGVmYXVsdHMudHMnO1xuaW1wb3J0IHtcbiAgY2xlYW5VcmwsXG4gIGVzY2FwZUh0bWxFbnRpdGllcyxcbn0gZnJvbSAnLi9oZWxwZXJzLnRzJztcbmltcG9ydCB7IG90aGVyIH0gZnJvbSAnLi9ydWxlcy50cyc7XG5pbXBvcnQgdHlwZSB7IE1hcmtlZE9wdGlvbnMgfSBmcm9tICcuL01hcmtlZE9wdGlvbnMudHMnO1xuaW1wb3J0IHR5cGUgeyBUb2tlbnMgfSBmcm9tICcuL1Rva2Vucy50cyc7XG5pbXBvcnQgdHlwZSB7IF9QYXJzZXIgfSBmcm9tICcuL1BhcnNlci50cyc7XG5cbi8qKlxuICogUmVuZGVyZXJcbiAqL1xuZXhwb3J0IGNsYXNzIF9SZW5kZXJlcjxQYXJzZXJPdXRwdXQgPSBzdHJpbmcsIFJlbmRlcmVyT3V0cHV0ID0gc3RyaW5nPiB7XG4gIG9wdGlvbnM6IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD47XG4gIHBhcnNlciE6IF9QYXJzZXI8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD47IC8vIHNldCBieSB0aGUgcGFyc2VyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBNYXJrZWRPcHRpb25zPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+KSB7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCBfZGVmYXVsdHM7XG4gIH1cblxuICBzcGFjZSh0b2tlbjogVG9rZW5zLlNwYWNlKTogUmVuZGVyZXJPdXRwdXQge1xuICAgIHJldHVybiAnJyBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIGNvZGUoeyB0ZXh0LCBsYW5nLCBlc2NhcGVkIH06IFRva2Vucy5Db2RlKTogUmVuZGVyZXJPdXRwdXQge1xuICAgIGNvbnN0IGxhbmdTdHJpbmcgPSAobGFuZyB8fCAnJykubWF0Y2gob3RoZXIubm90U3BhY2VTdGFydCk/LlswXTtcblxuICAgIGNvbnN0IGNvZGUgPSB0ZXh0LnJlcGxhY2Uob3RoZXIuZW5kaW5nTmV3bGluZSwgJycpICsgJ1xcbic7XG5cbiAgICBpZiAoIWxhbmdTdHJpbmcpIHtcbiAgICAgIHJldHVybiAnPHByZT48Y29kZT4nXG4gICAgICAgICsgKGVzY2FwZWQgPyBjb2RlIDogZXNjYXBlSHRtbEVudGl0aWVzKGNvZGUsIHRydWUpKVxuICAgICAgICArICc8L2NvZGU+PC9wcmU+XFxuJyBhcyBSZW5kZXJlck91dHB1dDtcbiAgICB9XG5cbiAgICByZXR1cm4gJzxwcmU+PGNvZGUgY2xhc3M9XCJsYW5ndWFnZS0nXG4gICAgICArIGVzY2FwZUh0bWxFbnRpdGllcyhsYW5nU3RyaW5nKVxuICAgICAgKyAnXCI+J1xuICAgICAgKyAoZXNjYXBlZCA/IGNvZGUgOiBlc2NhcGVIdG1sRW50aXRpZXMoY29kZSwgdHJ1ZSkpXG4gICAgICArICc8L2NvZGU+PC9wcmU+XFxuJyBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIGJsb2NrcXVvdGUoeyB0b2tlbnMgfTogVG9rZW5zLkJsb2NrcXVvdGUpOiBSZW5kZXJlck91dHB1dCB7XG4gICAgY29uc3QgYm9keSA9IHRoaXMucGFyc2VyLnBhcnNlKHRva2Vucyk7XG4gICAgcmV0dXJuIGA8YmxvY2txdW90ZT5cXG4ke2JvZHl9PC9ibG9ja3F1b3RlPlxcbmAgYXMgUmVuZGVyZXJPdXRwdXQ7XG4gIH1cblxuICBodG1sKHsgdGV4dCB9OiBUb2tlbnMuSFRNTCB8IFRva2Vucy5UYWcpOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuIHRleHQgYXMgUmVuZGVyZXJPdXRwdXQ7XG4gIH1cblxuICBkZWYodG9rZW46IFRva2Vucy5EZWYpOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuICcnIGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgaGVhZGluZyh7IHRva2VucywgZGVwdGggfTogVG9rZW5zLkhlYWRpbmcpOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuIGA8aCR7ZGVwdGh9PiR7dGhpcy5wYXJzZXIucGFyc2VJbmxpbmUodG9rZW5zKX08L2gke2RlcHRofT5cXG5gIGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgaHIodG9rZW46IFRva2Vucy5Icik6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICByZXR1cm4gJzxocj5cXG4nIGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgbGlzdCh0b2tlbjogVG9rZW5zLkxpc3QpOiBSZW5kZXJlck91dHB1dCB7XG4gICAgY29uc3Qgb3JkZXJlZCA9IHRva2VuLm9yZGVyZWQ7XG4gICAgY29uc3Qgc3RhcnQgPSB0b2tlbi5zdGFydDtcblxuICAgIGxldCBib2R5ID0gJyc7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCB0b2tlbi5pdGVtcy5sZW5ndGg7IGorKykge1xuICAgICAgY29uc3QgaXRlbSA9IHRva2VuLml0ZW1zW2pdO1xuICAgICAgYm9keSArPSB0aGlzLmxpc3RpdGVtKGl0ZW0pO1xuICAgIH1cblxuICAgIGNvbnN0IHR5cGUgPSBvcmRlcmVkID8gJ29sJyA6ICd1bCc7XG4gICAgY29uc3Qgc3RhcnRBdHRyID0gKG9yZGVyZWQgJiYgc3RhcnQgIT09IDEpID8gKCcgc3RhcnQ9XCInICsgc3RhcnQgKyAnXCInKSA6ICcnO1xuICAgIHJldHVybiAnPCcgKyB0eXBlICsgc3RhcnRBdHRyICsgJz5cXG4nICsgYm9keSArICc8LycgKyB0eXBlICsgJz5cXG4nIGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgbGlzdGl0ZW0oaXRlbTogVG9rZW5zLkxpc3RJdGVtKTogUmVuZGVyZXJPdXRwdXQge1xuICAgIHJldHVybiBgPGxpPiR7dGhpcy5wYXJzZXIucGFyc2UoaXRlbS50b2tlbnMpfTwvbGk+XFxuYCBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIGNoZWNrYm94KHsgY2hlY2tlZCB9OiBUb2tlbnMuQ2hlY2tib3gpOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuICc8aW5wdXQgJ1xuICAgICAgKyAoY2hlY2tlZCA/ICdjaGVja2VkPVwiXCIgJyA6ICcnKVxuICAgICAgKyAnZGlzYWJsZWQ9XCJcIiB0eXBlPVwiY2hlY2tib3hcIj4gJyBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIHBhcmFncmFwaCh7IHRva2VucyB9OiBUb2tlbnMuUGFyYWdyYXBoKTogUmVuZGVyZXJPdXRwdXQge1xuICAgIHJldHVybiBgPHA+JHt0aGlzLnBhcnNlci5wYXJzZUlubGluZSh0b2tlbnMpfTwvcD5cXG5gIGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgdGFibGUodG9rZW46IFRva2Vucy5UYWJsZSk6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICBsZXQgaGVhZGVyID0gJyc7XG5cbiAgICAvLyBoZWFkZXJcbiAgICBsZXQgY2VsbCA9ICcnO1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgdG9rZW4uaGVhZGVyLmxlbmd0aDsgaisrKSB7XG4gICAgICBjZWxsICs9IHRoaXMudGFibGVjZWxsKHRva2VuLmhlYWRlcltqXSk7XG4gICAgfVxuICAgIGhlYWRlciArPSB0aGlzLnRhYmxlcm93KHsgdGV4dDogY2VsbCBhcyBQYXJzZXJPdXRwdXQgfSk7XG5cbiAgICBsZXQgYm9keSA9ICcnO1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgdG9rZW4ucm93cy5sZW5ndGg7IGorKykge1xuICAgICAgY29uc3Qgcm93ID0gdG9rZW4ucm93c1tqXTtcblxuICAgICAgY2VsbCA9ICcnO1xuICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCByb3cubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgY2VsbCArPSB0aGlzLnRhYmxlY2VsbChyb3dba10pO1xuICAgICAgfVxuXG4gICAgICBib2R5ICs9IHRoaXMudGFibGVyb3coeyB0ZXh0OiBjZWxsIGFzIFBhcnNlck91dHB1dCB9KTtcbiAgICB9XG4gICAgaWYgKGJvZHkpIGJvZHkgPSBgPHRib2R5PiR7Ym9keX08L3Rib2R5PmA7XG5cbiAgICByZXR1cm4gJzx0YWJsZT5cXG4nXG4gICAgICArICc8dGhlYWQ+XFxuJ1xuICAgICAgKyBoZWFkZXJcbiAgICAgICsgJzwvdGhlYWQ+XFxuJ1xuICAgICAgKyBib2R5XG4gICAgICArICc8L3RhYmxlPlxcbicgYXMgUmVuZGVyZXJPdXRwdXQ7XG4gIH1cblxuICB0YWJsZXJvdyh7IHRleHQgfTogVG9rZW5zLlRhYmxlUm93PFBhcnNlck91dHB1dD4pOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuIGA8dHI+XFxuJHt0ZXh0fTwvdHI+XFxuYCBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIHRhYmxlY2VsbCh0b2tlbjogVG9rZW5zLlRhYmxlQ2VsbCk6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICBjb25zdCBjb250ZW50ID0gdGhpcy5wYXJzZXIucGFyc2VJbmxpbmUodG9rZW4udG9rZW5zKTtcbiAgICBjb25zdCB0eXBlID0gdG9rZW4uaGVhZGVyID8gJ3RoJyA6ICd0ZCc7XG4gICAgY29uc3QgdGFnID0gdG9rZW4uYWxpZ25cbiAgICAgID8gYDwke3R5cGV9IGFsaWduPVwiJHt0b2tlbi5hbGlnbn1cIj5gXG4gICAgICA6IGA8JHt0eXBlfT5gO1xuICAgIHJldHVybiB0YWcgKyBjb250ZW50ICsgYDwvJHt0eXBlfT5cXG5gIGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgLyoqXG4gICAqIHNwYW4gbGV2ZWwgcmVuZGVyZXJcbiAgICovXG4gIHN0cm9uZyh7IHRva2VucyB9OiBUb2tlbnMuU3Ryb25nKTogUmVuZGVyZXJPdXRwdXQge1xuICAgIHJldHVybiBgPHN0cm9uZz4ke3RoaXMucGFyc2VyLnBhcnNlSW5saW5lKHRva2Vucyl9PC9zdHJvbmc+YCBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIGVtKHsgdG9rZW5zIH06IFRva2Vucy5FbSk6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICByZXR1cm4gYDxlbT4ke3RoaXMucGFyc2VyLnBhcnNlSW5saW5lKHRva2Vucyl9PC9lbT5gIGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgY29kZXNwYW4oeyB0ZXh0IH06IFRva2Vucy5Db2Rlc3Bhbik6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICByZXR1cm4gYDxjb2RlPiR7ZXNjYXBlSHRtbEVudGl0aWVzKHRleHQsIHRydWUpfTwvY29kZT5gIGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgYnIodG9rZW46IFRva2Vucy5Ccik6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICByZXR1cm4gJzxicj4nIGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgZGVsKHsgdG9rZW5zIH06IFRva2Vucy5EZWwpOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuIGA8ZGVsPiR7dGhpcy5wYXJzZXIucGFyc2VJbmxpbmUodG9rZW5zKX08L2RlbD5gIGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgbGluayh7IGhyZWYsIHRpdGxlLCB0b2tlbnMgfTogVG9rZW5zLkxpbmspOiBSZW5kZXJlck91dHB1dCB7XG4gICAgY29uc3QgdGV4dCA9IHRoaXMucGFyc2VyLnBhcnNlSW5saW5lKHRva2VucykgYXMgc3RyaW5nO1xuICAgIGNvbnN0IGNsZWFuSHJlZiA9IGNsZWFuVXJsKGhyZWYpO1xuICAgIGlmIChjbGVhbkhyZWYgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiB0ZXh0IGFzIFJlbmRlcmVyT3V0cHV0O1xuICAgIH1cbiAgICBocmVmID0gY2xlYW5IcmVmO1xuICAgIGxldCBvdXQgPSAnPGEgaHJlZj1cIicgKyBocmVmICsgJ1wiJztcbiAgICBpZiAodGl0bGUpIHtcbiAgICAgIG91dCArPSAnIHRpdGxlPVwiJyArIChlc2NhcGVIdG1sRW50aXRpZXModGl0bGUpKSArICdcIic7XG4gICAgfVxuICAgIG91dCArPSAnPicgKyB0ZXh0ICsgJzwvYT4nO1xuICAgIHJldHVybiBvdXQgYXMgUmVuZGVyZXJPdXRwdXQ7XG4gIH1cblxuICBpbWFnZSh7IGhyZWYsIHRpdGxlLCB0ZXh0LCB0b2tlbnMgfTogVG9rZW5zLkltYWdlKTogUmVuZGVyZXJPdXRwdXQge1xuICAgIGlmICh0b2tlbnMpIHtcbiAgICAgIHRleHQgPSB0aGlzLnBhcnNlci5wYXJzZUlubGluZSh0b2tlbnMsIHRoaXMucGFyc2VyLnRleHRSZW5kZXJlcikgYXMgc3RyaW5nO1xuICAgIH1cbiAgICBjb25zdCBjbGVhbkhyZWYgPSBjbGVhblVybChocmVmKTtcbiAgICBpZiAoY2xlYW5IcmVmID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gZXNjYXBlSHRtbEVudGl0aWVzKHRleHQpIGFzIFJlbmRlcmVyT3V0cHV0O1xuICAgIH1cbiAgICBocmVmID0gY2xlYW5IcmVmO1xuXG4gICAgbGV0IG91dCA9IGA8aW1nIHNyYz1cIiR7aHJlZn1cIiBhbHQ9XCIke2VzY2FwZUh0bWxFbnRpdGllcyh0ZXh0KX1cImA7XG4gICAgaWYgKHRpdGxlKSB7XG4gICAgICBvdXQgKz0gYCB0aXRsZT1cIiR7ZXNjYXBlSHRtbEVudGl0aWVzKHRpdGxlKX1cImA7XG4gICAgfVxuICAgIG91dCArPSAnPic7XG4gICAgcmV0dXJuIG91dCBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIHRleHQodG9rZW46IFRva2Vucy5UZXh0IHwgVG9rZW5zLkVzY2FwZSk6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICByZXR1cm4gJ3Rva2VucycgaW4gdG9rZW4gJiYgdG9rZW4udG9rZW5zXG4gICAgICA/IHRoaXMucGFyc2VyLnBhcnNlSW5saW5lKHRva2VuLnRva2VucykgYXMgdW5rbm93biBhcyBSZW5kZXJlck91dHB1dFxuICAgICAgOiAoJ2VzY2FwZWQnIGluIHRva2VuICYmIHRva2VuLmVzY2FwZWQgPyB0b2tlbi50ZXh0IGFzIFJlbmRlcmVyT3V0cHV0IDogZXNjYXBlSHRtbEVudGl0aWVzKHRva2VuLnRleHQpIGFzIFJlbmRlcmVyT3V0cHV0KTtcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgVG9rZW5zIH0gZnJvbSAnLi9Ub2tlbnMudHMnO1xuXG4vKipcbiAqIFRleHRSZW5kZXJlclxuICogcmV0dXJucyBvbmx5IHRoZSB0ZXh0dWFsIHBhcnQgb2YgdGhlIHRva2VuXG4gKi9cbmV4cG9ydCBjbGFzcyBfVGV4dFJlbmRlcmVyPFJlbmRlcmVyT3V0cHV0ID0gc3RyaW5nPiB7XG4gIC8vIG5vIG5lZWQgZm9yIGJsb2NrIGxldmVsIHJlbmRlcmVyc1xuICBzdHJvbmcoeyB0ZXh0IH06IFRva2Vucy5TdHJvbmcpOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuIHRleHQgYXMgUmVuZGVyZXJPdXRwdXQ7XG4gIH1cblxuICBlbSh7IHRleHQgfTogVG9rZW5zLkVtKTogUmVuZGVyZXJPdXRwdXQge1xuICAgIHJldHVybiB0ZXh0IGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgY29kZXNwYW4oeyB0ZXh0IH06IFRva2Vucy5Db2Rlc3Bhbik6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICByZXR1cm4gdGV4dCBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIGRlbCh7IHRleHQgfTogVG9rZW5zLkRlbCk6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICByZXR1cm4gdGV4dCBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIGh0bWwoeyB0ZXh0IH06IFRva2Vucy5IVE1MIHwgVG9rZW5zLlRhZyk6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICByZXR1cm4gdGV4dCBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIHRleHQoeyB0ZXh0IH06IFRva2Vucy5UZXh0IHwgVG9rZW5zLkVzY2FwZSB8IFRva2Vucy5UYWcpOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuIHRleHQgYXMgUmVuZGVyZXJPdXRwdXQ7XG4gIH1cblxuICBsaW5rKHsgdGV4dCB9OiBUb2tlbnMuTGluayk6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICByZXR1cm4gJycgKyB0ZXh0IGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgaW1hZ2UoeyB0ZXh0IH06IFRva2Vucy5JbWFnZSk6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICByZXR1cm4gJycgKyB0ZXh0IGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgYnIoKTogUmVuZGVyZXJPdXRwdXQge1xuICAgIHJldHVybiAnJyBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIGNoZWNrYm94KHsgcmF3IH06IFRva2Vucy5DaGVja2JveCk6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICByZXR1cm4gcmF3IGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgX1JlbmRlcmVyIH0gZnJvbSAnLi9SZW5kZXJlci50cyc7XG5pbXBvcnQgeyBfVGV4dFJlbmRlcmVyIH0gZnJvbSAnLi9UZXh0UmVuZGVyZXIudHMnO1xuaW1wb3J0IHsgX2RlZmF1bHRzIH0gZnJvbSAnLi9kZWZhdWx0cy50cyc7XG5pbXBvcnQgdHlwZSB7IE1hcmtlZFRva2VuLCBUb2tlbiwgVG9rZW5zIH0gZnJvbSAnLi9Ub2tlbnMudHMnO1xuaW1wb3J0IHR5cGUgeyBNYXJrZWRPcHRpb25zIH0gZnJvbSAnLi9NYXJrZWRPcHRpb25zLnRzJztcblxuLyoqXG4gKiBQYXJzaW5nICYgQ29tcGlsaW5nXG4gKi9cbmV4cG9ydCBjbGFzcyBfUGFyc2VyPFBhcnNlck91dHB1dCA9IHN0cmluZywgUmVuZGVyZXJPdXRwdXQgPSBzdHJpbmc+IHtcbiAgb3B0aW9uczogTWFya2VkT3B0aW9uczxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0PjtcbiAgcmVuZGVyZXI6IF9SZW5kZXJlcjxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0PjtcbiAgdGV4dFJlbmRlcmVyOiBfVGV4dFJlbmRlcmVyPFJlbmRlcmVyT3V0cHV0PjtcbiAgY29uc3RydWN0b3Iob3B0aW9ucz86IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4pIHtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IF9kZWZhdWx0cztcbiAgICB0aGlzLm9wdGlvbnMucmVuZGVyZXIgPSB0aGlzLm9wdGlvbnMucmVuZGVyZXIgfHwgbmV3IF9SZW5kZXJlcjxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0PigpO1xuICAgIHRoaXMucmVuZGVyZXIgPSB0aGlzLm9wdGlvbnMucmVuZGVyZXI7XG4gICAgdGhpcy5yZW5kZXJlci5vcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgIHRoaXMucmVuZGVyZXIucGFyc2VyID0gdGhpcztcbiAgICB0aGlzLnRleHRSZW5kZXJlciA9IG5ldyBfVGV4dFJlbmRlcmVyPFJlbmRlcmVyT3V0cHV0PigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXRpYyBQYXJzZSBNZXRob2RcbiAgICovXG4gIHN0YXRpYyBwYXJzZTxQYXJzZXJPdXRwdXQgPSBzdHJpbmcsIFJlbmRlcmVyT3V0cHV0ID0gc3RyaW5nPih0b2tlbnM6IFRva2VuW10sIG9wdGlvbnM/OiBNYXJrZWRPcHRpb25zPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+KSB7XG4gICAgY29uc3QgcGFyc2VyID0gbmV3IF9QYXJzZXI8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4ob3B0aW9ucyk7XG4gICAgcmV0dXJuIHBhcnNlci5wYXJzZSh0b2tlbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXRpYyBQYXJzZSBJbmxpbmUgTWV0aG9kXG4gICAqL1xuICBzdGF0aWMgcGFyc2VJbmxpbmU8UGFyc2VyT3V0cHV0ID0gc3RyaW5nLCBSZW5kZXJlck91dHB1dCA9IHN0cmluZz4odG9rZW5zOiBUb2tlbltdLCBvcHRpb25zPzogTWFya2VkT3B0aW9uczxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0Pikge1xuICAgIGNvbnN0IHBhcnNlciA9IG5ldyBfUGFyc2VyPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+KG9wdGlvbnMpO1xuICAgIHJldHVybiBwYXJzZXIucGFyc2VJbmxpbmUodG9rZW5zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBMb29wXG4gICAqL1xuICBwYXJzZSh0b2tlbnM6IFRva2VuW10pOiBQYXJzZXJPdXRwdXQge1xuICAgIHRoaXMucmVuZGVyZXIucGFyc2VyID0gdGhpcztcbiAgICBsZXQgb3V0ID0gJyc7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgYW55VG9rZW4gPSB0b2tlbnNbaV07XG5cbiAgICAgIC8vIFJ1biBhbnkgcmVuZGVyZXIgZXh0ZW5zaW9uc1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5leHRlbnNpb25zPy5yZW5kZXJlcnM/LlthbnlUb2tlbi50eXBlXSkge1xuICAgICAgICBjb25zdCBnZW5lcmljVG9rZW4gPSBhbnlUb2tlbiBhcyBUb2tlbnMuR2VuZXJpYztcbiAgICAgICAgY29uc3QgcmV0ID0gdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMucmVuZGVyZXJzW2dlbmVyaWNUb2tlbi50eXBlXS5jYWxsKHsgcGFyc2VyOiB0aGlzIH0sIGdlbmVyaWNUb2tlbik7XG4gICAgICAgIGlmIChyZXQgIT09IGZhbHNlIHx8ICFbJ3NwYWNlJywgJ2hyJywgJ2hlYWRpbmcnLCAnY29kZScsICd0YWJsZScsICdibG9ja3F1b3RlJywgJ2xpc3QnLCAnaHRtbCcsICdkZWYnLCAncGFyYWdyYXBoJywgJ3RleHQnXS5pbmNsdWRlcyhnZW5lcmljVG9rZW4udHlwZSkpIHtcbiAgICAgICAgICBvdXQgKz0gcmV0IHx8ICcnO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRva2VuID0gYW55VG9rZW4gYXMgTWFya2VkVG9rZW47XG5cbiAgICAgIHN3aXRjaCAodG9rZW4udHlwZSkge1xuICAgICAgICBjYXNlICdzcGFjZSc6IHtcbiAgICAgICAgICBvdXQgKz0gdGhpcy5yZW5kZXJlci5zcGFjZSh0b2tlbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnaHInOiB7XG4gICAgICAgICAgb3V0ICs9IHRoaXMucmVuZGVyZXIuaHIodG9rZW4pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2hlYWRpbmcnOiB7XG4gICAgICAgICAgb3V0ICs9IHRoaXMucmVuZGVyZXIuaGVhZGluZyh0b2tlbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnY29kZSc6IHtcbiAgICAgICAgICBvdXQgKz0gdGhpcy5yZW5kZXJlci5jb2RlKHRva2VuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0YWJsZSc6IHtcbiAgICAgICAgICBvdXQgKz0gdGhpcy5yZW5kZXJlci50YWJsZSh0b2tlbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnYmxvY2txdW90ZSc6IHtcbiAgICAgICAgICBvdXQgKz0gdGhpcy5yZW5kZXJlci5ibG9ja3F1b3RlKHRva2VuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdsaXN0Jzoge1xuICAgICAgICAgIG91dCArPSB0aGlzLnJlbmRlcmVyLmxpc3QodG9rZW4pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2NoZWNrYm94Jzoge1xuICAgICAgICAgIG91dCArPSB0aGlzLnJlbmRlcmVyLmNoZWNrYm94KHRva2VuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdodG1sJzoge1xuICAgICAgICAgIG91dCArPSB0aGlzLnJlbmRlcmVyLmh0bWwodG9rZW4pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RlZic6IHtcbiAgICAgICAgICBvdXQgKz0gdGhpcy5yZW5kZXJlci5kZWYodG9rZW4pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3BhcmFncmFwaCc6IHtcbiAgICAgICAgICBvdXQgKz0gdGhpcy5yZW5kZXJlci5wYXJhZ3JhcGgodG9rZW4pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3RleHQnOiB7XG4gICAgICAgICAgb3V0ICs9IHRoaXMucmVuZGVyZXIudGV4dCh0b2tlbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgY29uc3QgZXJyTXNnID0gJ1Rva2VuIHdpdGggXCInICsgdG9rZW4udHlwZSArICdcIiB0eXBlIHdhcyBub3QgZm91bmQuJztcbiAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNpbGVudCkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJNc2cpO1xuICAgICAgICAgICAgcmV0dXJuICcnIGFzIFBhcnNlck91dHB1dDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVyck1zZyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dCBhcyBQYXJzZXJPdXRwdXQ7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgSW5saW5lIFRva2Vuc1xuICAgKi9cbiAgcGFyc2VJbmxpbmUodG9rZW5zOiBUb2tlbltdLCByZW5kZXJlcjogX1JlbmRlcmVyPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+IHwgX1RleHRSZW5kZXJlcjxSZW5kZXJlck91dHB1dD4gPSB0aGlzLnJlbmRlcmVyKTogUGFyc2VyT3V0cHV0IHtcbiAgICB0aGlzLnJlbmRlcmVyLnBhcnNlciA9IHRoaXM7XG4gICAgbGV0IG91dCA9ICcnO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGFueVRva2VuID0gdG9rZW5zW2ldO1xuXG4gICAgICAvLyBSdW4gYW55IHJlbmRlcmVyIGV4dGVuc2lvbnNcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucz8ucmVuZGVyZXJzPy5bYW55VG9rZW4udHlwZV0pIHtcbiAgICAgICAgY29uc3QgcmV0ID0gdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMucmVuZGVyZXJzW2FueVRva2VuLnR5cGVdLmNhbGwoeyBwYXJzZXI6IHRoaXMgfSwgYW55VG9rZW4pO1xuICAgICAgICBpZiAocmV0ICE9PSBmYWxzZSB8fCAhWydlc2NhcGUnLCAnaHRtbCcsICdsaW5rJywgJ2ltYWdlJywgJ3N0cm9uZycsICdlbScsICdjb2Rlc3BhbicsICdicicsICdkZWwnLCAndGV4dCddLmluY2x1ZGVzKGFueVRva2VuLnR5cGUpKSB7XG4gICAgICAgICAgb3V0ICs9IHJldCB8fCAnJztcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCB0b2tlbiA9IGFueVRva2VuIGFzIE1hcmtlZFRva2VuO1xuXG4gICAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnZXNjYXBlJzoge1xuICAgICAgICAgIG91dCArPSByZW5kZXJlci50ZXh0KHRva2VuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdodG1sJzoge1xuICAgICAgICAgIG91dCArPSByZW5kZXJlci5odG1sKHRva2VuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdsaW5rJzoge1xuICAgICAgICAgIG91dCArPSByZW5kZXJlci5saW5rKHRva2VuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdpbWFnZSc6IHtcbiAgICAgICAgICBvdXQgKz0gcmVuZGVyZXIuaW1hZ2UodG9rZW4pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2NoZWNrYm94Jzoge1xuICAgICAgICAgIG91dCArPSByZW5kZXJlci5jaGVja2JveCh0b2tlbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc3Ryb25nJzoge1xuICAgICAgICAgIG91dCArPSByZW5kZXJlci5zdHJvbmcodG9rZW4pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2VtJzoge1xuICAgICAgICAgIG91dCArPSByZW5kZXJlci5lbSh0b2tlbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnY29kZXNwYW4nOiB7XG4gICAgICAgICAgb3V0ICs9IHJlbmRlcmVyLmNvZGVzcGFuKHRva2VuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdicic6IHtcbiAgICAgICAgICBvdXQgKz0gcmVuZGVyZXIuYnIodG9rZW4pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RlbCc6IHtcbiAgICAgICAgICBvdXQgKz0gcmVuZGVyZXIuZGVsKHRva2VuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0ZXh0Jzoge1xuICAgICAgICAgIG91dCArPSByZW5kZXJlci50ZXh0KHRva2VuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgY29uc3QgZXJyTXNnID0gJ1Rva2VuIHdpdGggXCInICsgdG9rZW4udHlwZSArICdcIiB0eXBlIHdhcyBub3QgZm91bmQuJztcbiAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNpbGVudCkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJNc2cpO1xuICAgICAgICAgICAgcmV0dXJuICcnIGFzIFBhcnNlck91dHB1dDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVyck1zZyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXQgYXMgUGFyc2VyT3V0cHV0O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgX2RlZmF1bHRzIH0gZnJvbSAnLi9kZWZhdWx0cy50cyc7XG5pbXBvcnQgeyBfTGV4ZXIgfSBmcm9tICcuL0xleGVyLnRzJztcbmltcG9ydCB7IF9QYXJzZXIgfSBmcm9tICcuL1BhcnNlci50cyc7XG5pbXBvcnQgdHlwZSB7IE1hcmtlZE9wdGlvbnMgfSBmcm9tICcuL01hcmtlZE9wdGlvbnMudHMnO1xuaW1wb3J0IHR5cGUgeyBUb2tlbiwgVG9rZW5zTGlzdCB9IGZyb20gJy4vVG9rZW5zLnRzJztcblxuZXhwb3J0IGNsYXNzIF9Ib29rczxQYXJzZXJPdXRwdXQgPSBzdHJpbmcsIFJlbmRlcmVyT3V0cHV0ID0gc3RyaW5nPiB7XG4gIG9wdGlvbnM6IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD47XG4gIGJsb2NrPzogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zPzogTWFya2VkT3B0aW9uczxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0Pikge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwgX2RlZmF1bHRzO1xuICB9XG5cbiAgc3RhdGljIHBhc3NUaHJvdWdoSG9va3MgPSBuZXcgU2V0KFtcbiAgICAncHJlcHJvY2VzcycsXG4gICAgJ3Bvc3Rwcm9jZXNzJyxcbiAgICAncHJvY2Vzc0FsbFRva2VucycsXG4gICAgJ2VtU3Ryb25nTWFzaycsXG4gIF0pO1xuXG4gIHN0YXRpYyBwYXNzVGhyb3VnaEhvb2tzUmVzcGVjdEFzeW5jID0gbmV3IFNldChbXG4gICAgJ3ByZXByb2Nlc3MnLFxuICAgICdwb3N0cHJvY2VzcycsXG4gICAgJ3Byb2Nlc3NBbGxUb2tlbnMnLFxuICBdKTtcblxuICAvKipcbiAgICogUHJvY2VzcyBtYXJrZG93biBiZWZvcmUgbWFya2VkXG4gICAqL1xuICBwcmVwcm9jZXNzKG1hcmtkb3duOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gbWFya2Rvd247XG4gIH1cblxuICAvKipcbiAgICogUHJvY2VzcyBIVE1MIGFmdGVyIG1hcmtlZCBpcyBmaW5pc2hlZFxuICAgKi9cbiAgcG9zdHByb2Nlc3MoaHRtbDogUGFyc2VyT3V0cHV0KSB7XG4gICAgcmV0dXJuIGh0bWw7XG4gIH1cblxuICAvKipcbiAgICogUHJvY2VzcyBhbGwgdG9rZW5zIGJlZm9yZSB3YWxrIHRva2Vuc1xuICAgKi9cbiAgcHJvY2Vzc0FsbFRva2Vucyh0b2tlbnM6IFRva2VuW10gfCBUb2tlbnNMaXN0KSB7XG4gICAgcmV0dXJuIHRva2VucztcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXNrIGNvbnRlbnRzIHRoYXQgc2hvdWxkIG5vdCBiZSBpbnRlcnByZXRlZCBhcyBlbS9zdHJvbmcgZGVsaW1pdGVyc1xuICAgKi9cbiAgZW1TdHJvbmdNYXNrKHNyYzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHNyYztcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm92aWRlIGZ1bmN0aW9uIHRvIHRva2VuaXplIG1hcmtkb3duXG4gICAqL1xuICBwcm92aWRlTGV4ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuYmxvY2sgPyBfTGV4ZXIubGV4IDogX0xleGVyLmxleElubGluZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm92aWRlIGZ1bmN0aW9uIHRvIHBhcnNlIHRva2Vuc1xuICAgKi9cbiAgcHJvdmlkZVBhcnNlcigpIHtcbiAgICByZXR1cm4gdGhpcy5ibG9jayA/IF9QYXJzZXIucGFyc2U8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4gOiBfUGFyc2VyLnBhcnNlSW5saW5lPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgX2dldERlZmF1bHRzIH0gZnJvbSAnLi9kZWZhdWx0cy50cyc7XG5pbXBvcnQgeyBfTGV4ZXIgfSBmcm9tICcuL0xleGVyLnRzJztcbmltcG9ydCB7IF9QYXJzZXIgfSBmcm9tICcuL1BhcnNlci50cyc7XG5pbXBvcnQgeyBfSG9va3MgfSBmcm9tICcuL0hvb2tzLnRzJztcbmltcG9ydCB7IF9SZW5kZXJlciB9IGZyb20gJy4vUmVuZGVyZXIudHMnO1xuaW1wb3J0IHsgX1Rva2VuaXplciB9IGZyb20gJy4vVG9rZW5pemVyLnRzJztcbmltcG9ydCB7IF9UZXh0UmVuZGVyZXIgfSBmcm9tICcuL1RleHRSZW5kZXJlci50cyc7XG5pbXBvcnQgeyBlc2NhcGVIdG1sRW50aXRpZXMgfSBmcm9tICcuL2hlbHBlcnMudHMnO1xuaW1wb3J0IHR5cGUgeyBNYXJrZWRFeHRlbnNpb24sIE1hcmtlZE9wdGlvbnMgfSBmcm9tICcuL01hcmtlZE9wdGlvbnMudHMnO1xuaW1wb3J0IHR5cGUgeyBUb2tlbiwgVG9rZW5zLCBUb2tlbnNMaXN0IH0gZnJvbSAnLi9Ub2tlbnMudHMnO1xuXG5leHBvcnQgdHlwZSBNYXliZVByb21pc2UgPSB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcblxudHlwZSBVbmtub3duRnVuY3Rpb24gPSAoLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duO1xudHlwZSBHZW5lcmljUmVuZGVyZXJGdW5jdGlvbiA9ICguLi5hcmdzOiB1bmtub3duW10pID0+IHN0cmluZyB8IGZhbHNlO1xuXG5leHBvcnQgY2xhc3MgTWFya2VkPFBhcnNlck91dHB1dCA9IHN0cmluZywgUmVuZGVyZXJPdXRwdXQgPSBzdHJpbmc+IHtcbiAgZGVmYXVsdHMgPSBfZ2V0RGVmYXVsdHM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4oKTtcbiAgb3B0aW9ucyA9IHRoaXMuc2V0T3B0aW9ucztcblxuICBwYXJzZSA9IHRoaXMucGFyc2VNYXJrZG93bih0cnVlKTtcbiAgcGFyc2VJbmxpbmUgPSB0aGlzLnBhcnNlTWFya2Rvd24oZmFsc2UpO1xuXG4gIFBhcnNlciA9IF9QYXJzZXI8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD47XG4gIFJlbmRlcmVyID0gX1JlbmRlcmVyPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+O1xuICBUZXh0UmVuZGVyZXIgPSBfVGV4dFJlbmRlcmVyPFJlbmRlcmVyT3V0cHV0PjtcbiAgTGV4ZXIgPSBfTGV4ZXI7XG4gIFRva2VuaXplciA9IF9Ub2tlbml6ZXI8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD47XG4gIEhvb2tzID0gX0hvb2tzPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+O1xuXG4gIGNvbnN0cnVjdG9yKC4uLmFyZ3M6IE1hcmtlZEV4dGVuc2lvbjxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0PltdKSB7XG4gICAgdGhpcy51c2UoLi4uYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogUnVuIGNhbGxiYWNrIGZvciBldmVyeSB0b2tlblxuICAgKi9cbiAgd2Fsa1Rva2Vucyh0b2tlbnM6IFRva2VuW10gfCBUb2tlbnNMaXN0LCBjYWxsYmFjazogKHRva2VuOiBUb2tlbikgPT4gTWF5YmVQcm9taXNlIHwgTWF5YmVQcm9taXNlW10pIHtcbiAgICBsZXQgdmFsdWVzOiBNYXliZVByb21pc2VbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdG9rZW5zKSB7XG4gICAgICB2YWx1ZXMgPSB2YWx1ZXMuY29uY2F0KGNhbGxiYWNrLmNhbGwodGhpcywgdG9rZW4pKTtcbiAgICAgIHN3aXRjaCAodG9rZW4udHlwZSkge1xuICAgICAgICBjYXNlICd0YWJsZSc6IHtcbiAgICAgICAgICBjb25zdCB0YWJsZVRva2VuID0gdG9rZW4gYXMgVG9rZW5zLlRhYmxlO1xuICAgICAgICAgIGZvciAoY29uc3QgY2VsbCBvZiB0YWJsZVRva2VuLmhlYWRlcikge1xuICAgICAgICAgICAgdmFsdWVzID0gdmFsdWVzLmNvbmNhdCh0aGlzLndhbGtUb2tlbnMoY2VsbC50b2tlbnMsIGNhbGxiYWNrKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvciAoY29uc3Qgcm93IG9mIHRhYmxlVG9rZW4ucm93cykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBjZWxsIG9mIHJvdykge1xuICAgICAgICAgICAgICB2YWx1ZXMgPSB2YWx1ZXMuY29uY2F0KHRoaXMud2Fsa1Rva2VucyhjZWxsLnRva2VucywgY2FsbGJhY2spKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnbGlzdCc6IHtcbiAgICAgICAgICBjb25zdCBsaXN0VG9rZW4gPSB0b2tlbiBhcyBUb2tlbnMuTGlzdDtcbiAgICAgICAgICB2YWx1ZXMgPSB2YWx1ZXMuY29uY2F0KHRoaXMud2Fsa1Rva2VucyhsaXN0VG9rZW4uaXRlbXMsIGNhbGxiYWNrKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIGNvbnN0IGdlbmVyaWNUb2tlbiA9IHRva2VuIGFzIFRva2Vucy5HZW5lcmljO1xuICAgICAgICAgIGlmICh0aGlzLmRlZmF1bHRzLmV4dGVuc2lvbnM/LmNoaWxkVG9rZW5zPy5bZ2VuZXJpY1Rva2VuLnR5cGVdKSB7XG4gICAgICAgICAgICB0aGlzLmRlZmF1bHRzLmV4dGVuc2lvbnMuY2hpbGRUb2tlbnNbZ2VuZXJpY1Rva2VuLnR5cGVdLmZvckVhY2goKGNoaWxkVG9rZW5zKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHRva2VucyA9IGdlbmVyaWNUb2tlbltjaGlsZFRva2Vuc10uZmxhdChJbmZpbml0eSkgYXMgVG9rZW5bXSB8IFRva2Vuc0xpc3Q7XG4gICAgICAgICAgICAgIHZhbHVlcyA9IHZhbHVlcy5jb25jYXQodGhpcy53YWxrVG9rZW5zKHRva2VucywgY2FsbGJhY2spKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZ2VuZXJpY1Rva2VuLnRva2Vucykge1xuICAgICAgICAgICAgdmFsdWVzID0gdmFsdWVzLmNvbmNhdCh0aGlzLndhbGtUb2tlbnMoZ2VuZXJpY1Rva2VuLnRva2VucywgY2FsbGJhY2spKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfVxuXG4gIHVzZSguLi5hcmdzOiBNYXJrZWRFeHRlbnNpb248UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD5bXSkge1xuICAgIGNvbnN0IGV4dGVuc2lvbnM6IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD5bJ2V4dGVuc2lvbnMnXSA9IHRoaXMuZGVmYXVsdHMuZXh0ZW5zaW9ucyB8fCB7IHJlbmRlcmVyczoge30sIGNoaWxkVG9rZW5zOiB7fSB9O1xuXG4gICAgYXJncy5mb3JFYWNoKChwYWNrKSA9PiB7XG4gICAgICAvLyBjb3B5IG9wdGlvbnMgdG8gbmV3IG9iamVjdFxuICAgICAgY29uc3Qgb3B0cyA9IHsgLi4ucGFjayB9IGFzIE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD47XG5cbiAgICAgIC8vIHNldCBhc3luYyB0byB0cnVlIGlmIGl0IHdhcyBzZXQgdG8gdHJ1ZSBiZWZvcmVcbiAgICAgIG9wdHMuYXN5bmMgPSB0aGlzLmRlZmF1bHRzLmFzeW5jIHx8IG9wdHMuYXN5bmMgfHwgZmFsc2U7XG5cbiAgICAgIC8vID09LS0gUGFyc2UgXCJhZGRvblwiIGV4dGVuc2lvbnMgLS09PSAvL1xuICAgICAgaWYgKHBhY2suZXh0ZW5zaW9ucykge1xuICAgICAgICBwYWNrLmV4dGVuc2lvbnMuZm9yRWFjaCgoZXh0KSA9PiB7XG4gICAgICAgICAgaWYgKCFleHQubmFtZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHRlbnNpb24gbmFtZSByZXF1aXJlZCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoJ3JlbmRlcmVyJyBpbiBleHQpIHsgLy8gUmVuZGVyZXIgZXh0ZW5zaW9uc1xuICAgICAgICAgICAgY29uc3QgcHJldlJlbmRlcmVyID0gZXh0ZW5zaW9ucy5yZW5kZXJlcnNbZXh0Lm5hbWVdO1xuICAgICAgICAgICAgaWYgKHByZXZSZW5kZXJlcikge1xuICAgICAgICAgICAgICAvLyBSZXBsYWNlIGV4dGVuc2lvbiB3aXRoIGZ1bmMgdG8gcnVuIG5ldyBleHRlbnNpb24gYnV0IGZhbGwgYmFjayBpZiBmYWxzZVxuICAgICAgICAgICAgICBleHRlbnNpb25zLnJlbmRlcmVyc1tleHQubmFtZV0gPSBmdW5jdGlvbiguLi5hcmdzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJldCA9IGV4dC5yZW5kZXJlci5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgICAgICAgICBpZiAocmV0ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgcmV0ID0gcHJldlJlbmRlcmVyLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZXh0ZW5zaW9ucy5yZW5kZXJlcnNbZXh0Lm5hbWVdID0gZXh0LnJlbmRlcmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoJ3Rva2VuaXplcicgaW4gZXh0KSB7IC8vIFRva2VuaXplciBFeHRlbnNpb25zXG4gICAgICAgICAgICBpZiAoIWV4dC5sZXZlbCB8fCAoZXh0LmxldmVsICE9PSAnYmxvY2snICYmIGV4dC5sZXZlbCAhPT0gJ2lubGluZScpKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImV4dGVuc2lvbiBsZXZlbCBtdXN0IGJlICdibG9jaycgb3IgJ2lubGluZSdcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBleHRMZXZlbCA9IGV4dGVuc2lvbnNbZXh0LmxldmVsXTtcbiAgICAgICAgICAgIGlmIChleHRMZXZlbCkge1xuICAgICAgICAgICAgICBleHRMZXZlbC51bnNoaWZ0KGV4dC50b2tlbml6ZXIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZXh0ZW5zaW9uc1tleHQubGV2ZWxdID0gW2V4dC50b2tlbml6ZXJdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV4dC5zdGFydCkgeyAvLyBGdW5jdGlvbiB0byBjaGVjayBmb3Igc3RhcnQgb2YgdG9rZW5cbiAgICAgICAgICAgICAgaWYgKGV4dC5sZXZlbCA9PT0gJ2Jsb2NrJykge1xuICAgICAgICAgICAgICAgIGlmIChleHRlbnNpb25zLnN0YXJ0QmxvY2spIHtcbiAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMuc3RhcnRCbG9jay5wdXNoKGV4dC5zdGFydCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMuc3RhcnRCbG9jayA9IFtleHQuc3RhcnRdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChleHQubGV2ZWwgPT09ICdpbmxpbmUnKSB7XG4gICAgICAgICAgICAgICAgaWYgKGV4dGVuc2lvbnMuc3RhcnRJbmxpbmUpIHtcbiAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMuc3RhcnRJbmxpbmUucHVzaChleHQuc3RhcnQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBleHRlbnNpb25zLnN0YXJ0SW5saW5lID0gW2V4dC5zdGFydF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICgnY2hpbGRUb2tlbnMnIGluIGV4dCAmJiBleHQuY2hpbGRUb2tlbnMpIHsgLy8gQ2hpbGQgdG9rZW5zIHRvIGJlIHZpc2l0ZWQgYnkgd2Fsa1Rva2Vuc1xuICAgICAgICAgICAgZXh0ZW5zaW9ucy5jaGlsZFRva2Vuc1tleHQubmFtZV0gPSBleHQuY2hpbGRUb2tlbnM7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgb3B0cy5leHRlbnNpb25zID0gZXh0ZW5zaW9ucztcbiAgICAgIH1cblxuICAgICAgLy8gPT0tLSBQYXJzZSBcIm92ZXJ3cml0ZVwiIGV4dGVuc2lvbnMgLS09PSAvL1xuICAgICAgaWYgKHBhY2sucmVuZGVyZXIpIHtcbiAgICAgICAgY29uc3QgcmVuZGVyZXIgPSB0aGlzLmRlZmF1bHRzLnJlbmRlcmVyIHx8IG5ldyBfUmVuZGVyZXI8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4odGhpcy5kZWZhdWx0cyk7XG4gICAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBwYWNrLnJlbmRlcmVyKSB7XG4gICAgICAgICAgaWYgKCEocHJvcCBpbiByZW5kZXJlcikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgcmVuZGVyZXIgJyR7cHJvcH0nIGRvZXMgbm90IGV4aXN0YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChbJ29wdGlvbnMnLCAncGFyc2VyJ10uaW5jbHVkZXMocHJvcCkpIHtcbiAgICAgICAgICAgIC8vIGlnbm9yZSBvcHRpb25zIHByb3BlcnR5XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcmVuZGVyZXJQcm9wID0gcHJvcCBhcyBFeGNsdWRlPGtleW9mIF9SZW5kZXJlcjxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0PiwgJ29wdGlvbnMnIHwgJ3BhcnNlcic+O1xuICAgICAgICAgIGNvbnN0IHJlbmRlcmVyRnVuYyA9IHBhY2sucmVuZGVyZXJbcmVuZGVyZXJQcm9wXSBhcyBHZW5lcmljUmVuZGVyZXJGdW5jdGlvbjtcbiAgICAgICAgICBjb25zdCBwcmV2UmVuZGVyZXIgPSByZW5kZXJlcltyZW5kZXJlclByb3BdIGFzIEdlbmVyaWNSZW5kZXJlckZ1bmN0aW9uO1xuICAgICAgICAgIC8vIFJlcGxhY2UgcmVuZGVyZXIgd2l0aCBmdW5jIHRvIHJ1biBleHRlbnNpb24sIGJ1dCBmYWxsIGJhY2sgaWYgZmFsc2VcbiAgICAgICAgICByZW5kZXJlcltyZW5kZXJlclByb3BdID0gKC4uLmFyZ3M6IHVua25vd25bXSkgPT4ge1xuICAgICAgICAgICAgbGV0IHJldCA9IHJlbmRlcmVyRnVuYy5hcHBseShyZW5kZXJlciwgYXJncyk7XG4gICAgICAgICAgICBpZiAocmV0ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICByZXQgPSBwcmV2UmVuZGVyZXIuYXBwbHkocmVuZGVyZXIsIGFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIChyZXQgfHwgJycpIGFzIFJlbmRlcmVyT3V0cHV0O1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgb3B0cy5yZW5kZXJlciA9IHJlbmRlcmVyO1xuICAgICAgfVxuICAgICAgaWYgKHBhY2sudG9rZW5pemVyKSB7XG4gICAgICAgIGNvbnN0IHRva2VuaXplciA9IHRoaXMuZGVmYXVsdHMudG9rZW5pemVyIHx8IG5ldyBfVG9rZW5pemVyPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+KHRoaXMuZGVmYXVsdHMpO1xuICAgICAgICBmb3IgKGNvbnN0IHByb3AgaW4gcGFjay50b2tlbml6ZXIpIHtcbiAgICAgICAgICBpZiAoIShwcm9wIGluIHRva2VuaXplcikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdG9rZW5pemVyICcke3Byb3B9JyBkb2VzIG5vdCBleGlzdGApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoWydvcHRpb25zJywgJ3J1bGVzJywgJ2xleGVyJ10uaW5jbHVkZXMocHJvcCkpIHtcbiAgICAgICAgICAgIC8vIGlnbm9yZSBvcHRpb25zLCBydWxlcywgYW5kIGxleGVyIHByb3BlcnRpZXNcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB0b2tlbml6ZXJQcm9wID0gcHJvcCBhcyBFeGNsdWRlPGtleW9mIF9Ub2tlbml6ZXI8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4sICdvcHRpb25zJyB8ICdydWxlcycgfCAnbGV4ZXInPjtcbiAgICAgICAgICBjb25zdCB0b2tlbml6ZXJGdW5jID0gcGFjay50b2tlbml6ZXJbdG9rZW5pemVyUHJvcF0gYXMgVW5rbm93bkZ1bmN0aW9uO1xuICAgICAgICAgIGNvbnN0IHByZXZUb2tlbml6ZXIgPSB0b2tlbml6ZXJbdG9rZW5pemVyUHJvcF0gYXMgVW5rbm93bkZ1bmN0aW9uO1xuICAgICAgICAgIC8vIFJlcGxhY2UgdG9rZW5pemVyIHdpdGggZnVuYyB0byBydW4gZXh0ZW5zaW9uLCBidXQgZmFsbCBiYWNrIGlmIGZhbHNlXG4gICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBjYW5ub3QgdHlwZSB0b2tlbml6ZXIgZnVuY3Rpb24gZHluYW1pY2FsbHlcbiAgICAgICAgICB0b2tlbml6ZXJbdG9rZW5pemVyUHJvcF0gPSAoLi4uYXJnczogdW5rbm93bltdKSA9PiB7XG4gICAgICAgICAgICBsZXQgcmV0ID0gdG9rZW5pemVyRnVuYy5hcHBseSh0b2tlbml6ZXIsIGFyZ3MpO1xuICAgICAgICAgICAgaWYgKHJldCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgcmV0ID0gcHJldlRva2VuaXplci5hcHBseSh0b2tlbml6ZXIsIGFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIG9wdHMudG9rZW5pemVyID0gdG9rZW5pemVyO1xuICAgICAgfVxuXG4gICAgICAvLyA9PS0tIFBhcnNlIEhvb2tzIGV4dGVuc2lvbnMgLS09PSAvL1xuICAgICAgaWYgKHBhY2suaG9va3MpIHtcbiAgICAgICAgY29uc3QgaG9va3MgPSB0aGlzLmRlZmF1bHRzLmhvb2tzIHx8IG5ldyBfSG9va3M8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4oKTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wIGluIHBhY2suaG9va3MpIHtcbiAgICAgICAgICBpZiAoIShwcm9wIGluIGhvb2tzKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBob29rICcke3Byb3B9JyBkb2VzIG5vdCBleGlzdGApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoWydvcHRpb25zJywgJ2Jsb2NrJ10uaW5jbHVkZXMocHJvcCkpIHtcbiAgICAgICAgICAgIC8vIGlnbm9yZSBvcHRpb25zIGFuZCBibG9jayBwcm9wZXJ0aWVzXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgaG9va3NQcm9wID0gcHJvcCBhcyBFeGNsdWRlPGtleW9mIF9Ib29rczxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0PiwgJ29wdGlvbnMnIHwgJ2Jsb2NrJz47XG4gICAgICAgICAgY29uc3QgaG9va3NGdW5jID0gcGFjay5ob29rc1tob29rc1Byb3BdIGFzIFVua25vd25GdW5jdGlvbjtcbiAgICAgICAgICBjb25zdCBwcmV2SG9vayA9IGhvb2tzW2hvb2tzUHJvcF0gYXMgVW5rbm93bkZ1bmN0aW9uO1xuICAgICAgICAgIGlmIChfSG9va3MucGFzc1Rocm91Z2hIb29rcy5oYXMocHJvcCkpIHtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgY2Fubm90IHR5cGUgaG9vayBmdW5jdGlvbiBkeW5hbWljYWxseVxuICAgICAgICAgICAgaG9va3NbaG9va3NQcm9wXSA9IChhcmc6IHVua25vd24pID0+IHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuZGVmYXVsdHMuYXN5bmMgJiYgX0hvb2tzLnBhc3NUaHJvdWdoSG9va3NSZXNwZWN0QXN5bmMuaGFzKHByb3ApKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChhc3luYygpID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJldCA9IGF3YWl0IGhvb2tzRnVuYy5jYWxsKGhvb2tzLCBhcmcpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHByZXZIb29rLmNhbGwoaG9va3MsIHJldCk7XG4gICAgICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNvbnN0IHJldCA9IGhvb2tzRnVuYy5jYWxsKGhvb2tzLCBhcmcpO1xuICAgICAgICAgICAgICByZXR1cm4gcHJldkhvb2suY2FsbChob29rcywgcmV0KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgY2Fubm90IHR5cGUgaG9vayBmdW5jdGlvbiBkeW5hbWljYWxseVxuICAgICAgICAgICAgaG9va3NbaG9va3NQcm9wXSA9ICguLi5hcmdzOiB1bmtub3duW10pID0+IHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuZGVmYXVsdHMuYXN5bmMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKGFzeW5jKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgbGV0IHJldCA9IGF3YWl0IGhvb2tzRnVuYy5hcHBseShob29rcywgYXJncyk7XG4gICAgICAgICAgICAgICAgICBpZiAocmV0ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICByZXQgPSBhd2FpdCBwcmV2SG9vay5hcHBseShob29rcywgYXJncyk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICAgICAgICAgIH0pKCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBsZXQgcmV0ID0gaG9va3NGdW5jLmFwcGx5KGhvb2tzLCBhcmdzKTtcbiAgICAgICAgICAgICAgaWYgKHJldCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXQgPSBwcmV2SG9vay5hcHBseShob29rcywgYXJncyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG9wdHMuaG9va3MgPSBob29rcztcbiAgICAgIH1cblxuICAgICAgLy8gPT0tLSBQYXJzZSBXYWxrVG9rZW5zIGV4dGVuc2lvbnMgLS09PSAvL1xuICAgICAgaWYgKHBhY2sud2Fsa1Rva2Vucykge1xuICAgICAgICBjb25zdCB3YWxrVG9rZW5zID0gdGhpcy5kZWZhdWx0cy53YWxrVG9rZW5zO1xuICAgICAgICBjb25zdCBwYWNrV2Fsa3Rva2VucyA9IHBhY2sud2Fsa1Rva2VucztcbiAgICAgICAgb3B0cy53YWxrVG9rZW5zID0gZnVuY3Rpb24odG9rZW4pIHtcbiAgICAgICAgICBsZXQgdmFsdWVzOiBNYXliZVByb21pc2VbXSA9IFtdO1xuICAgICAgICAgIHZhbHVlcy5wdXNoKHBhY2tXYWxrdG9rZW5zLmNhbGwodGhpcywgdG9rZW4pKTtcbiAgICAgICAgICBpZiAod2Fsa1Rva2Vucykge1xuICAgICAgICAgICAgdmFsdWVzID0gdmFsdWVzLmNvbmNhdCh3YWxrVG9rZW5zLmNhbGwodGhpcywgdG9rZW4pKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHZhbHVlcztcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5kZWZhdWx0cyA9IHsgLi4udGhpcy5kZWZhdWx0cywgLi4ub3B0cyB9O1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRPcHRpb25zKG9wdDogTWFya2VkT3B0aW9uczxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0Pikge1xuICAgIHRoaXMuZGVmYXVsdHMgPSB7IC4uLnRoaXMuZGVmYXVsdHMsIC4uLm9wdCB9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgbGV4ZXIoc3JjOiBzdHJpbmcsIG9wdGlvbnM/OiBNYXJrZWRPcHRpb25zPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+KSB7XG4gICAgcmV0dXJuIF9MZXhlci5sZXgoc3JjLCBvcHRpb25zID8/IHRoaXMuZGVmYXVsdHMpO1xuICB9XG5cbiAgcGFyc2VyKHRva2VuczogVG9rZW5bXSwgb3B0aW9ucz86IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4pIHtcbiAgICByZXR1cm4gX1BhcnNlci5wYXJzZTxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0Pih0b2tlbnMsIG9wdGlvbnMgPz8gdGhpcy5kZWZhdWx0cyk7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlTWFya2Rvd24oYmxvY2tUeXBlOiBib29sZWFuKSB7XG4gICAgdHlwZSBvdmVybG9hZGVkUGFyc2UgPSB7XG4gICAgICAoc3JjOiBzdHJpbmcsIG9wdGlvbnM6IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4gJiB7IGFzeW5jOiB0cnVlIH0pOiBQcm9taXNlPFBhcnNlck91dHB1dD47XG4gICAgICAoc3JjOiBzdHJpbmcsIG9wdGlvbnM6IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4gJiB7IGFzeW5jOiBmYWxzZSB9KTogUGFyc2VyT3V0cHV0O1xuICAgICAgKHNyYzogc3RyaW5nLCBvcHRpb25zPzogTWFya2VkT3B0aW9uczxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0PiB8IG51bGwpOiBQYXJzZXJPdXRwdXQgfCBQcm9taXNlPFBhcnNlck91dHB1dD47XG4gICAgfTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgY29uc3QgcGFyc2U6IG92ZXJsb2FkZWRQYXJzZSA9IChzcmM6IHN0cmluZywgb3B0aW9ucz86IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4gfCBudWxsKTogYW55ID0+IHtcbiAgICAgIGNvbnN0IG9yaWdPcHQgPSB7IC4uLm9wdGlvbnMgfTtcbiAgICAgIGNvbnN0IG9wdCA9IHsgLi4udGhpcy5kZWZhdWx0cywgLi4ub3JpZ09wdCB9O1xuXG4gICAgICBjb25zdCB0aHJvd0Vycm9yID0gdGhpcy5vbkVycm9yKCEhb3B0LnNpbGVudCwgISFvcHQuYXN5bmMpO1xuXG4gICAgICAvLyB0aHJvdyBlcnJvciBpZiBhbiBleHRlbnNpb24gc2V0IGFzeW5jIHRvIHRydWUgYnV0IHBhcnNlIHdhcyBjYWxsZWQgd2l0aCBhc3luYzogZmFsc2VcbiAgICAgIGlmICh0aGlzLmRlZmF1bHRzLmFzeW5jID09PSB0cnVlICYmIG9yaWdPcHQuYXN5bmMgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKG5ldyBFcnJvcignbWFya2VkKCk6IFRoZSBhc3luYyBvcHRpb24gd2FzIHNldCB0byB0cnVlIGJ5IGFuIGV4dGVuc2lvbi4gUmVtb3ZlIGFzeW5jOiBmYWxzZSBmcm9tIHRoZSBwYXJzZSBvcHRpb25zIG9iamVjdCB0byByZXR1cm4gYSBQcm9taXNlLicpKTtcbiAgICAgIH1cblxuICAgICAgLy8gdGhyb3cgZXJyb3IgaW4gY2FzZSBvZiBub24gc3RyaW5nIGlucHV0XG4gICAgICBpZiAodHlwZW9mIHNyYyA9PT0gJ3VuZGVmaW5lZCcgfHwgc3JjID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKG5ldyBFcnJvcignbWFya2VkKCk6IGlucHV0IHBhcmFtZXRlciBpcyB1bmRlZmluZWQgb3IgbnVsbCcpKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2Ygc3JjICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihuZXcgRXJyb3IoJ21hcmtlZCgpOiBpbnB1dCBwYXJhbWV0ZXIgaXMgb2YgdHlwZSAnXG4gICAgICAgICAgKyBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoc3JjKSArICcsIHN0cmluZyBleHBlY3RlZCcpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdC5ob29rcykge1xuICAgICAgICBvcHQuaG9va3Mub3B0aW9ucyA9IG9wdDtcbiAgICAgICAgb3B0Lmhvb2tzLmJsb2NrID0gYmxvY2tUeXBlO1xuICAgICAgfVxuXG4gICAgICBpZiAob3B0LmFzeW5jKSB7XG4gICAgICAgIHJldHVybiAoYXN5bmMoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcHJvY2Vzc2VkU3JjID0gb3B0Lmhvb2tzID8gYXdhaXQgb3B0Lmhvb2tzLnByZXByb2Nlc3Moc3JjKSA6IHNyYztcbiAgICAgICAgICBjb25zdCBsZXhlciA9IG9wdC5ob29rcyA/IGF3YWl0IG9wdC5ob29rcy5wcm92aWRlTGV4ZXIoKSA6IChibG9ja1R5cGUgPyBfTGV4ZXIubGV4IDogX0xleGVyLmxleElubGluZSk7XG4gICAgICAgICAgY29uc3QgdG9rZW5zID0gYXdhaXQgbGV4ZXIocHJvY2Vzc2VkU3JjLCBvcHQpO1xuICAgICAgICAgIGNvbnN0IHByb2Nlc3NlZFRva2VucyA9IG9wdC5ob29rcyA/IGF3YWl0IG9wdC5ob29rcy5wcm9jZXNzQWxsVG9rZW5zKHRva2VucykgOiB0b2tlbnM7XG4gICAgICAgICAgaWYgKG9wdC53YWxrVG9rZW5zKSB7XG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLndhbGtUb2tlbnMocHJvY2Vzc2VkVG9rZW5zLCBvcHQud2Fsa1Rva2VucykpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBwYXJzZXIgPSBvcHQuaG9va3MgPyBhd2FpdCBvcHQuaG9va3MucHJvdmlkZVBhcnNlcigpIDogKGJsb2NrVHlwZSA/IF9QYXJzZXIucGFyc2UgOiBfUGFyc2VyLnBhcnNlSW5saW5lKTtcbiAgICAgICAgICBjb25zdCBodG1sID0gYXdhaXQgcGFyc2VyKHByb2Nlc3NlZFRva2Vucywgb3B0KTtcbiAgICAgICAgICByZXR1cm4gb3B0Lmhvb2tzID8gYXdhaXQgb3B0Lmhvb2tzLnBvc3Rwcm9jZXNzKGh0bWwpIDogaHRtbDtcbiAgICAgICAgfSkoKS5jYXRjaCh0aHJvd0Vycm9yKTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKG9wdC5ob29rcykge1xuICAgICAgICAgIHNyYyA9IG9wdC5ob29rcy5wcmVwcm9jZXNzKHNyYykgYXMgc3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxleGVyID0gb3B0Lmhvb2tzID8gb3B0Lmhvb2tzLnByb3ZpZGVMZXhlcigpIDogKGJsb2NrVHlwZSA/IF9MZXhlci5sZXggOiBfTGV4ZXIubGV4SW5saW5lKTtcbiAgICAgICAgbGV0IHRva2VucyA9IGxleGVyKHNyYywgb3B0KTtcbiAgICAgICAgaWYgKG9wdC5ob29rcykge1xuICAgICAgICAgIHRva2VucyA9IG9wdC5ob29rcy5wcm9jZXNzQWxsVG9rZW5zKHRva2Vucyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdC53YWxrVG9rZW5zKSB7XG4gICAgICAgICAgdGhpcy53YWxrVG9rZW5zKHRva2Vucywgb3B0LndhbGtUb2tlbnMpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcnNlciA9IG9wdC5ob29rcyA/IG9wdC5ob29rcy5wcm92aWRlUGFyc2VyKCkgOiAoYmxvY2tUeXBlID8gX1BhcnNlci5wYXJzZSA6IF9QYXJzZXIucGFyc2VJbmxpbmUpO1xuICAgICAgICBsZXQgaHRtbCA9IHBhcnNlcih0b2tlbnMsIG9wdCk7XG4gICAgICAgIGlmIChvcHQuaG9va3MpIHtcbiAgICAgICAgICBodG1sID0gb3B0Lmhvb2tzLnBvc3Rwcm9jZXNzKGh0bWwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBodG1sO1xuICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGUgYXMgRXJyb3IpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gcGFyc2U7XG4gIH1cblxuICBwcml2YXRlIG9uRXJyb3Ioc2lsZW50OiBib29sZWFuLCBhc3luYzogYm9vbGVhbikge1xuICAgIHJldHVybiAoZTogRXJyb3IpOiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz4gPT4ge1xuICAgICAgZS5tZXNzYWdlICs9ICdcXG5QbGVhc2UgcmVwb3J0IHRoaXMgdG8gaHR0cHM6Ly9naXRodWIuY29tL21hcmtlZGpzL21hcmtlZC4nO1xuXG4gICAgICBpZiAoc2lsZW50KSB7XG4gICAgICAgIGNvbnN0IG1zZyA9ICc8cD5BbiBlcnJvciBvY2N1cnJlZDo8L3A+PHByZT4nXG4gICAgICAgICAgKyBlc2NhcGVIdG1sRW50aXRpZXMoZS5tZXNzYWdlICsgJycsIHRydWUpXG4gICAgICAgICAgKyAnPC9wcmU+JztcbiAgICAgICAgaWYgKGFzeW5jKSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtc2cpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtc2c7XG4gICAgICB9XG5cbiAgICAgIGlmIChhc3luYykge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlO1xuICAgIH07XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBfTGV4ZXIgfSBmcm9tICcuL0xleGVyLnRzJztcbmltcG9ydCB7IF9QYXJzZXIgfSBmcm9tICcuL1BhcnNlci50cyc7XG5pbXBvcnQgeyBfVG9rZW5pemVyIH0gZnJvbSAnLi9Ub2tlbml6ZXIudHMnO1xuaW1wb3J0IHsgX1JlbmRlcmVyIH0gZnJvbSAnLi9SZW5kZXJlci50cyc7XG5pbXBvcnQgeyBfVGV4dFJlbmRlcmVyIH0gZnJvbSAnLi9UZXh0UmVuZGVyZXIudHMnO1xuaW1wb3J0IHsgX0hvb2tzIH0gZnJvbSAnLi9Ib29rcy50cyc7XG5pbXBvcnQgeyBNYXJrZWQgfSBmcm9tICcuL0luc3RhbmNlLnRzJztcbmltcG9ydCB7XG4gIF9nZXREZWZhdWx0cyxcbiAgY2hhbmdlRGVmYXVsdHMsXG4gIF9kZWZhdWx0cyxcbn0gZnJvbSAnLi9kZWZhdWx0cy50cyc7XG5pbXBvcnQgdHlwZSB7IE1hcmtlZEV4dGVuc2lvbiwgTWFya2VkT3B0aW9ucyB9IGZyb20gJy4vTWFya2VkT3B0aW9ucy50cyc7XG5pbXBvcnQgdHlwZSB7IFRva2VuLCBUb2tlbnNMaXN0IH0gZnJvbSAnLi9Ub2tlbnMudHMnO1xuaW1wb3J0IHR5cGUgeyBNYXliZVByb21pc2UgfSBmcm9tICcuL0luc3RhbmNlLnRzJztcblxuY29uc3QgbWFya2VkSW5zdGFuY2UgPSBuZXcgTWFya2VkKCk7XG5cbi8qKlxuICogQ29tcGlsZXMgbWFya2Rvd24gdG8gSFRNTCBhc3luY2hyb25vdXNseS5cbiAqXG4gKiBAcGFyYW0gc3JjIFN0cmluZyBvZiBtYXJrZG93biBzb3VyY2UgdG8gYmUgY29tcGlsZWRcbiAqIEBwYXJhbSBvcHRpb25zIEhhc2ggb2Ygb3B0aW9ucywgaGF2aW5nIGFzeW5jOiB0cnVlXG4gKiBAcmV0dXJuIFByb21pc2Ugb2Ygc3RyaW5nIG9mIGNvbXBpbGVkIEhUTUxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcmtlZChzcmM6IHN0cmluZywgb3B0aW9uczogTWFya2VkT3B0aW9ucyAmIHsgYXN5bmM6IHRydWUgfSk6IFByb21pc2U8c3RyaW5nPjtcblxuLyoqXG4gKiBDb21waWxlcyBtYXJrZG93biB0byBIVE1MLlxuICpcbiAqIEBwYXJhbSBzcmMgU3RyaW5nIG9mIG1hcmtkb3duIHNvdXJjZSB0byBiZSBjb21waWxlZFxuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9uYWwgaGFzaCBvZiBvcHRpb25zXG4gKiBAcmV0dXJuIFN0cmluZyBvZiBjb21waWxlZCBIVE1MLiBXaWxsIGJlIGEgUHJvbWlzZSBvZiBzdHJpbmcgaWYgYXN5bmMgaXMgc2V0IHRvIHRydWUgYnkgYW55IGV4dGVuc2lvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXJrZWQoc3JjOiBzdHJpbmcsIG9wdGlvbnM6IE1hcmtlZE9wdGlvbnMgJiB7IGFzeW5jOiBmYWxzZSB9KTogc3RyaW5nO1xuZXhwb3J0IGZ1bmN0aW9uIG1hcmtlZChzcmM6IHN0cmluZywgb3B0aW9uczogTWFya2VkT3B0aW9ucyAmIHsgYXN5bmM6IHRydWUgfSk6IFByb21pc2U8c3RyaW5nPjtcbmV4cG9ydCBmdW5jdGlvbiBtYXJrZWQoc3JjOiBzdHJpbmcsIG9wdGlvbnM/OiBNYXJrZWRPcHRpb25zIHwgbnVsbCk6IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPjtcbmV4cG9ydCBmdW5jdGlvbiBtYXJrZWQoc3JjOiBzdHJpbmcsIG9wdD86IE1hcmtlZE9wdGlvbnMgfCBudWxsKTogc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+IHtcbiAgcmV0dXJuIG1hcmtlZEluc3RhbmNlLnBhcnNlKHNyYywgb3B0KTtcbn1cblxuLyoqXG4gKiBTZXRzIHRoZSBkZWZhdWx0IG9wdGlvbnMuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgSGFzaCBvZiBvcHRpb25zXG4gKi9cbm1hcmtlZC5vcHRpb25zID1cbiAgbWFya2VkLnNldE9wdGlvbnMgPSBmdW5jdGlvbihvcHRpb25zOiBNYXJrZWRPcHRpb25zKSB7XG4gICAgbWFya2VkSW5zdGFuY2Uuc2V0T3B0aW9ucyhvcHRpb25zKTtcbiAgICBtYXJrZWQuZGVmYXVsdHMgPSBtYXJrZWRJbnN0YW5jZS5kZWZhdWx0cztcbiAgICBjaGFuZ2VEZWZhdWx0cyhtYXJrZWQuZGVmYXVsdHMpO1xuICAgIHJldHVybiBtYXJrZWQ7XG4gIH07XG5cbi8qKlxuICogR2V0cyB0aGUgb3JpZ2luYWwgbWFya2VkIGRlZmF1bHQgb3B0aW9ucy5cbiAqL1xubWFya2VkLmdldERlZmF1bHRzID0gX2dldERlZmF1bHRzO1xuXG5tYXJrZWQuZGVmYXVsdHMgPSBfZGVmYXVsdHM7XG5cbi8qKlxuICogVXNlIEV4dGVuc2lvblxuICovXG5cbm1hcmtlZC51c2UgPSBmdW5jdGlvbiguLi5hcmdzOiBNYXJrZWRFeHRlbnNpb25bXSkge1xuICBtYXJrZWRJbnN0YW5jZS51c2UoLi4uYXJncyk7XG4gIG1hcmtlZC5kZWZhdWx0cyA9IG1hcmtlZEluc3RhbmNlLmRlZmF1bHRzO1xuICBjaGFuZ2VEZWZhdWx0cyhtYXJrZWQuZGVmYXVsdHMpO1xuICByZXR1cm4gbWFya2VkO1xufTtcblxuLyoqXG4gKiBSdW4gY2FsbGJhY2sgZm9yIGV2ZXJ5IHRva2VuXG4gKi9cblxubWFya2VkLndhbGtUb2tlbnMgPSBmdW5jdGlvbih0b2tlbnM6IFRva2VuW10gfCBUb2tlbnNMaXN0LCBjYWxsYmFjazogKHRva2VuOiBUb2tlbikgPT4gTWF5YmVQcm9taXNlIHwgTWF5YmVQcm9taXNlW10pIHtcbiAgcmV0dXJuIG1hcmtlZEluc3RhbmNlLndhbGtUb2tlbnModG9rZW5zLCBjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIENvbXBpbGVzIG1hcmtkb3duIHRvIEhUTUwgd2l0aG91dCBlbmNsb3NpbmcgYHBgIHRhZy5cbiAqXG4gKiBAcGFyYW0gc3JjIFN0cmluZyBvZiBtYXJrZG93biBzb3VyY2UgdG8gYmUgY29tcGlsZWRcbiAqIEBwYXJhbSBvcHRpb25zIEhhc2ggb2Ygb3B0aW9uc1xuICogQHJldHVybiBTdHJpbmcgb2YgY29tcGlsZWQgSFRNTFxuICovXG5tYXJrZWQucGFyc2VJbmxpbmUgPSBtYXJrZWRJbnN0YW5jZS5wYXJzZUlubGluZTtcblxuLyoqXG4gKiBFeHBvc2VcbiAqL1xubWFya2VkLlBhcnNlciA9IF9QYXJzZXI7XG5tYXJrZWQucGFyc2VyID0gX1BhcnNlci5wYXJzZTtcbm1hcmtlZC5SZW5kZXJlciA9IF9SZW5kZXJlcjtcbm1hcmtlZC5UZXh0UmVuZGVyZXIgPSBfVGV4dFJlbmRlcmVyO1xubWFya2VkLkxleGVyID0gX0xleGVyO1xubWFya2VkLmxleGVyID0gX0xleGVyLmxleDtcbm1hcmtlZC5Ub2tlbml6ZXIgPSBfVG9rZW5pemVyO1xubWFya2VkLkhvb2tzID0gX0hvb2tzO1xubWFya2VkLnBhcnNlID0gbWFya2VkO1xuXG5leHBvcnQgY29uc3Qgb3B0aW9ucyA9IG1hcmtlZC5vcHRpb25zO1xuZXhwb3J0IGNvbnN0IHNldE9wdGlvbnMgPSBtYXJrZWQuc2V0T3B0aW9ucztcbmV4cG9ydCBjb25zdCB1c2UgPSBtYXJrZWQudXNlO1xuZXhwb3J0IGNvbnN0IHdhbGtUb2tlbnMgPSBtYXJrZWQud2Fsa1Rva2VucztcbmV4cG9ydCBjb25zdCBwYXJzZUlubGluZSA9IG1hcmtlZC5wYXJzZUlubGluZTtcbmV4cG9ydCBjb25zdCBwYXJzZSA9IG1hcmtlZDtcbmV4cG9ydCBjb25zdCBwYXJzZXIgPSBfUGFyc2VyLnBhcnNlO1xuZXhwb3J0IGNvbnN0IGxleGVyID0gX0xleGVyLmxleDtcbmV4cG9ydCB7IF9kZWZhdWx0cyBhcyBkZWZhdWx0cywgX2dldERlZmF1bHRzIGFzIGdldERlZmF1bHRzIH0gZnJvbSAnLi9kZWZhdWx0cy50cyc7XG5leHBvcnQgeyBfTGV4ZXIgYXMgTGV4ZXIgfSBmcm9tICcuL0xleGVyLnRzJztcbmV4cG9ydCB7IF9QYXJzZXIgYXMgUGFyc2VyIH0gZnJvbSAnLi9QYXJzZXIudHMnO1xuZXhwb3J0IHsgX1Rva2VuaXplciBhcyBUb2tlbml6ZXIgfSBmcm9tICcuL1Rva2VuaXplci50cyc7XG5leHBvcnQgeyBfUmVuZGVyZXIgYXMgUmVuZGVyZXIgfSBmcm9tICcuL1JlbmRlcmVyLnRzJztcbmV4cG9ydCB7IF9UZXh0UmVuZGVyZXIgYXMgVGV4dFJlbmRlcmVyIH0gZnJvbSAnLi9UZXh0UmVuZGVyZXIudHMnO1xuZXhwb3J0IHsgX0hvb2tzIGFzIEhvb2tzIH0gZnJvbSAnLi9Ib29rcy50cyc7XG5leHBvcnQgeyBNYXJrZWQgfSBmcm9tICcuL0luc3RhbmNlLnRzJztcbmV4cG9ydCB0eXBlICogZnJvbSAnLi9NYXJrZWRPcHRpb25zLnRzJztcbmV4cG9ydCB0eXBlICogZnJvbSAnLi9Ub2tlbnMudHMnO1xuIiwgImNvbnN0IHtcbiAgZW50cmllcyxcbiAgc2V0UHJvdG90eXBlT2YsXG4gIGlzRnJvemVuLFxuICBnZXRQcm90b3R5cGVPZixcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxufSA9IE9iamVjdDtcblxubGV0IHsgZnJlZXplLCBzZWFsLCBjcmVhdGUgfSA9IE9iamVjdDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBpbXBvcnQvbm8tbXV0YWJsZS1leHBvcnRzXG5sZXQgeyBhcHBseSwgY29uc3RydWN0IH0gPSB0eXBlb2YgUmVmbGVjdCAhPT0gJ3VuZGVmaW5lZCcgJiYgUmVmbGVjdDtcblxuaWYgKCFmcmVlemUpIHtcbiAgZnJlZXplID0gZnVuY3Rpb24gPFQ+KHg6IFQpOiBUIHtcbiAgICByZXR1cm4geDtcbiAgfTtcbn1cblxuaWYgKCFzZWFsKSB7XG4gIHNlYWwgPSBmdW5jdGlvbiA8VD4oeDogVCk6IFQge1xuICAgIHJldHVybiB4O1xuICB9O1xufVxuXG5pZiAoIWFwcGx5KSB7XG4gIGFwcGx5ID0gZnVuY3Rpb24gPFQ+KFxuICAgIGZ1bmM6ICh0aGlzQXJnOiBhbnksIC4uLmFyZ3M6IGFueVtdKSA9PiBULFxuICAgIHRoaXNBcmc6IGFueSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBUIHtcbiAgICByZXR1cm4gZnVuYy5hcHBseSh0aGlzQXJnLCBhcmdzKTtcbiAgfTtcbn1cblxuaWYgKCFjb25zdHJ1Y3QpIHtcbiAgY29uc3RydWN0ID0gZnVuY3Rpb24gPFQ+KEZ1bmM6IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQsIC4uLmFyZ3M6IGFueVtdKTogVCB7XG4gICAgcmV0dXJuIG5ldyBGdW5jKC4uLmFyZ3MpO1xuICB9O1xufVxuXG5jb25zdCBhcnJheUZvckVhY2ggPSB1bmFwcGx5KEFycmF5LnByb3RvdHlwZS5mb3JFYWNoKTtcbmNvbnN0IGFycmF5SW5kZXhPZiA9IHVuYXBwbHkoQXJyYXkucHJvdG90eXBlLmluZGV4T2YpO1xuY29uc3QgYXJyYXlMYXN0SW5kZXhPZiA9IHVuYXBwbHkoQXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mKTtcbmNvbnN0IGFycmF5UG9wID0gdW5hcHBseShBcnJheS5wcm90b3R5cGUucG9wKTtcbmNvbnN0IGFycmF5UHVzaCA9IHVuYXBwbHkoQXJyYXkucHJvdG90eXBlLnB1c2gpO1xuY29uc3QgYXJyYXlTbGljZSA9IHVuYXBwbHkoQXJyYXkucHJvdG90eXBlLnNsaWNlKTtcbmNvbnN0IGFycmF5U3BsaWNlID0gdW5hcHBseShBcnJheS5wcm90b3R5cGUuc3BsaWNlKTtcblxuY29uc3Qgc3RyaW5nVG9Mb3dlckNhc2UgPSB1bmFwcGx5KFN0cmluZy5wcm90b3R5cGUudG9Mb3dlckNhc2UpO1xuY29uc3Qgc3RyaW5nVG9TdHJpbmcgPSB1bmFwcGx5KFN0cmluZy5wcm90b3R5cGUudG9TdHJpbmcpO1xuY29uc3Qgc3RyaW5nTWF0Y2ggPSB1bmFwcGx5KFN0cmluZy5wcm90b3R5cGUubWF0Y2gpO1xuY29uc3Qgc3RyaW5nUmVwbGFjZSA9IHVuYXBwbHkoU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlKTtcbmNvbnN0IHN0cmluZ0luZGV4T2YgPSB1bmFwcGx5KFN0cmluZy5wcm90b3R5cGUuaW5kZXhPZik7XG5jb25zdCBzdHJpbmdUcmltID0gdW5hcHBseShTdHJpbmcucHJvdG90eXBlLnRyaW0pO1xuXG5jb25zdCBvYmplY3RIYXNPd25Qcm9wZXJ0eSA9IHVuYXBwbHkoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSk7XG5cbmNvbnN0IHJlZ0V4cFRlc3QgPSB1bmFwcGx5KFJlZ0V4cC5wcm90b3R5cGUudGVzdCk7XG5cbmNvbnN0IHR5cGVFcnJvckNyZWF0ZSA9IHVuY29uc3RydWN0KFR5cGVFcnJvcik7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBmdW5jdGlvbiB0aGF0IGNhbGxzIHRoZSBnaXZlbiBmdW5jdGlvbiB3aXRoIGEgc3BlY2lmaWVkIHRoaXNBcmcgYW5kIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gZnVuYyAtIFRoZSBmdW5jdGlvbiB0byBiZSB3cmFwcGVkIGFuZCBjYWxsZWQuXG4gKiBAcmV0dXJucyBBIG5ldyBmdW5jdGlvbiB0aGF0IGNhbGxzIHRoZSBnaXZlbiBmdW5jdGlvbiB3aXRoIGEgc3BlY2lmaWVkIHRoaXNBcmcgYW5kIGFyZ3VtZW50cy5cbiAqL1xuZnVuY3Rpb24gdW5hcHBseTxUPihcbiAgZnVuYzogKHRoaXNBcmc6IGFueSwgLi4uYXJnczogYW55W10pID0+IFRcbik6ICh0aGlzQXJnOiBhbnksIC4uLmFyZ3M6IGFueVtdKSA9PiBUIHtcbiAgcmV0dXJuICh0aGlzQXJnOiBhbnksIC4uLmFyZ3M6IGFueVtdKTogVCA9PiB7XG4gICAgaWYgKHRoaXNBcmcgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgIHRoaXNBcmcubGFzdEluZGV4ID0gMDtcbiAgICB9XG5cbiAgICByZXR1cm4gYXBwbHkoZnVuYywgdGhpc0FyZywgYXJncyk7XG4gIH07XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBmdW5jdGlvbiB0aGF0IGNvbnN0cnVjdHMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdpdmVuIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIHdpdGggdGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gZnVuYyAtIFRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbiB0byBiZSB3cmFwcGVkIGFuZCBjYWxsZWQuXG4gKiBAcmV0dXJucyBBIG5ldyBmdW5jdGlvbiB0aGF0IGNvbnN0cnVjdHMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdpdmVuIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIHdpdGggdGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAqL1xuZnVuY3Rpb24gdW5jb25zdHJ1Y3Q8VD4oXG4gIEZ1bmM6IG5ldyAoLi4uYXJnczogYW55W10pID0+IFRcbik6ICguLi5hcmdzOiBhbnlbXSkgPT4gVCB7XG4gIHJldHVybiAoLi4uYXJnczogYW55W10pOiBUID0+IGNvbnN0cnVjdChGdW5jLCBhcmdzKTtcbn1cblxuLyoqXG4gKiBBZGQgcHJvcGVydGllcyB0byBhIGxvb2t1cCB0YWJsZVxuICpcbiAqIEBwYXJhbSBzZXQgLSBUaGUgc2V0IHRvIHdoaWNoIGVsZW1lbnRzIHdpbGwgYmUgYWRkZWQuXG4gKiBAcGFyYW0gYXJyYXkgLSBUaGUgYXJyYXkgY29udGFpbmluZyBlbGVtZW50cyB0byBiZSBhZGRlZCB0byB0aGUgc2V0LlxuICogQHBhcmFtIHRyYW5zZm9ybUNhc2VGdW5jIC0gQW4gb3B0aW9uYWwgZnVuY3Rpb24gdG8gdHJhbnNmb3JtIHRoZSBjYXNlIG9mIGVhY2ggZWxlbWVudCBiZWZvcmUgYWRkaW5nIHRvIHRoZSBzZXQuXG4gKiBAcmV0dXJucyBUaGUgbW9kaWZpZWQgc2V0IHdpdGggYWRkZWQgZWxlbWVudHMuXG4gKi9cbmZ1bmN0aW9uIGFkZFRvU2V0KFxuICBzZXQ6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIGFycmF5OiByZWFkb25seSBhbnlbXSxcbiAgdHJhbnNmb3JtQ2FzZUZ1bmM6IFJldHVyblR5cGU8dHlwZW9mIHVuYXBwbHk8c3RyaW5nPj4gPSBzdHJpbmdUb0xvd2VyQ2FzZVxuKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gIGlmIChzZXRQcm90b3R5cGVPZikge1xuICAgIC8vIE1ha2UgJ2luJyBhbmQgdHJ1dGh5IGNoZWNrcyBsaWtlIEJvb2xlYW4oc2V0LmNvbnN0cnVjdG9yKVxuICAgIC8vIGluZGVwZW5kZW50IG9mIGFueSBwcm9wZXJ0aWVzIGRlZmluZWQgb24gT2JqZWN0LnByb3RvdHlwZS5cbiAgICAvLyBQcmV2ZW50IHByb3RvdHlwZSBzZXR0ZXJzIGZyb20gaW50ZXJjZXB0aW5nIHNldCBhcyBhIHRoaXMgdmFsdWUuXG4gICAgc2V0UHJvdG90eXBlT2Yoc2V0LCBudWxsKTtcbiAgfVxuXG4gIGxldCBsID0gYXJyYXkubGVuZ3RoO1xuICB3aGlsZSAobC0tKSB7XG4gICAgbGV0IGVsZW1lbnQgPSBhcnJheVtsXTtcbiAgICBpZiAodHlwZW9mIGVsZW1lbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zdCBsY0VsZW1lbnQgPSB0cmFuc2Zvcm1DYXNlRnVuYyhlbGVtZW50KTtcbiAgICAgIGlmIChsY0VsZW1lbnQgIT09IGVsZW1lbnQpIHtcbiAgICAgICAgLy8gQ29uZmlnIHByZXNldHMgKGUuZy4gdGFncy5qcywgYXR0cnMuanMpIGFyZSBpbW11dGFibGUuXG4gICAgICAgIGlmICghaXNGcm96ZW4oYXJyYXkpKSB7XG4gICAgICAgICAgKGFycmF5IGFzIGFueVtdKVtsXSA9IGxjRWxlbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIGVsZW1lbnQgPSBsY0VsZW1lbnQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2V0W2VsZW1lbnRdID0gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBzZXQ7XG59XG5cbi8qKlxuICogQ2xlYW4gdXAgYW4gYXJyYXkgdG8gaGFyZGVuIGFnYWluc3QgQ1NQUFxuICpcbiAqIEBwYXJhbSBhcnJheSAtIFRoZSBhcnJheSB0byBiZSBjbGVhbmVkLlxuICogQHJldHVybnMgVGhlIGNsZWFuZWQgdmVyc2lvbiBvZiB0aGUgYXJyYXlcbiAqL1xuZnVuY3Rpb24gY2xlYW5BcnJheTxUPihhcnJheTogVFtdKTogQXJyYXk8VCB8IG51bGw+IHtcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGFycmF5Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IGlzUHJvcGVydHlFeGlzdCA9IG9iamVjdEhhc093blByb3BlcnR5KGFycmF5LCBpbmRleCk7XG5cbiAgICBpZiAoIWlzUHJvcGVydHlFeGlzdCkge1xuICAgICAgYXJyYXlbaW5kZXhdID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYXJyYXk7XG59XG5cbi8qKlxuICogU2hhbGxvdyBjbG9uZSBhbiBvYmplY3RcbiAqXG4gKiBAcGFyYW0gb2JqZWN0IC0gVGhlIG9iamVjdCB0byBiZSBjbG9uZWQuXG4gKiBAcmV0dXJucyBBIG5ldyBvYmplY3QgdGhhdCBjb3BpZXMgdGhlIG9yaWdpbmFsLlxuICovXG5mdW5jdGlvbiBjbG9uZTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4ob2JqZWN0OiBUKTogVCB7XG4gIGNvbnN0IG5ld09iamVjdCA9IGNyZWF0ZShudWxsKTtcblxuICBmb3IgKGNvbnN0IFtwcm9wZXJ0eSwgdmFsdWVdIG9mIGVudHJpZXMob2JqZWN0KSkge1xuICAgIGNvbnN0IGlzUHJvcGVydHlFeGlzdCA9IG9iamVjdEhhc093blByb3BlcnR5KG9iamVjdCwgcHJvcGVydHkpO1xuXG4gICAgaWYgKGlzUHJvcGVydHlFeGlzdCkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIG5ld09iamVjdFtwcm9wZXJ0eV0gPSBjbGVhbkFycmF5KHZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHZhbHVlICYmXG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgdmFsdWUuY29uc3RydWN0b3IgPT09IE9iamVjdFxuICAgICAgKSB7XG4gICAgICAgIG5ld09iamVjdFtwcm9wZXJ0eV0gPSBjbG9uZSh2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXdPYmplY3RbcHJvcGVydHldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ld09iamVjdDtcbn1cblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBhdXRvbWF0aWNhbGx5IGNoZWNrcyBpZiB0aGUgcHJvcCBpcyBmdW5jdGlvbiBvciBnZXR0ZXIgYW5kIGJlaGF2ZXMgYWNjb3JkaW5nbHkuXG4gKlxuICogQHBhcmFtIG9iamVjdCAtIFRoZSBvYmplY3QgdG8gbG9vayB1cCB0aGUgZ2V0dGVyIGZ1bmN0aW9uIGluIGl0cyBwcm90b3R5cGUgY2hhaW4uXG4gKiBAcGFyYW0gcHJvcCAtIFRoZSBwcm9wZXJ0eSBuYW1lIGZvciB3aGljaCB0byBmaW5kIHRoZSBnZXR0ZXIgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBUaGUgZ2V0dGVyIGZ1bmN0aW9uIGZvdW5kIGluIHRoZSBwcm90b3R5cGUgY2hhaW4gb3IgYSBmYWxsYmFjayBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gbG9va3VwR2V0dGVyPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PihcbiAgb2JqZWN0OiBULFxuICBwcm9wOiBzdHJpbmdcbik6IFJldHVyblR5cGU8dHlwZW9mIHVuYXBwbHk8YW55Pj4gfCAoKCkgPT4gbnVsbCkge1xuICB3aGlsZSAob2JqZWN0ICE9PSBudWxsKSB7XG4gICAgY29uc3QgZGVzYyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3ApO1xuXG4gICAgaWYgKGRlc2MpIHtcbiAgICAgIGlmIChkZXNjLmdldCkge1xuICAgICAgICByZXR1cm4gdW5hcHBseShkZXNjLmdldCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgZGVzYy52YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gdW5hcHBseShkZXNjLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBvYmplY3QgPSBnZXRQcm90b3R5cGVPZihvYmplY3QpO1xuICB9XG5cbiAgZnVuY3Rpb24gZmFsbGJhY2tWYWx1ZSgpOiBudWxsIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBmYWxsYmFja1ZhbHVlO1xufVxuXG5leHBvcnQge1xuICAvLyBBcnJheVxuICBhcnJheUZvckVhY2gsXG4gIGFycmF5SW5kZXhPZixcbiAgYXJyYXlMYXN0SW5kZXhPZixcbiAgYXJyYXlQb3AsXG4gIGFycmF5UHVzaCxcbiAgYXJyYXlTbGljZSxcbiAgYXJyYXlTcGxpY2UsXG4gIC8vIE9iamVjdFxuICBlbnRyaWVzLFxuICBmcmVlemUsXG4gIGdldFByb3RvdHlwZU9mLFxuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsXG4gIGlzRnJvemVuLFxuICBzZXRQcm90b3R5cGVPZixcbiAgc2VhbCxcbiAgY2xvbmUsXG4gIGNyZWF0ZSxcbiAgb2JqZWN0SGFzT3duUHJvcGVydHksXG4gIC8vIFJlZ0V4cFxuICByZWdFeHBUZXN0LFxuICAvLyBTdHJpbmdcbiAgc3RyaW5nSW5kZXhPZixcbiAgc3RyaW5nTWF0Y2gsXG4gIHN0cmluZ1JlcGxhY2UsXG4gIHN0cmluZ1RvTG93ZXJDYXNlLFxuICBzdHJpbmdUb1N0cmluZyxcbiAgc3RyaW5nVHJpbSxcbiAgLy8gRXJyb3JzXG4gIHR5cGVFcnJvckNyZWF0ZSxcbiAgLy8gT3RoZXJcbiAgbG9va3VwR2V0dGVyLFxuICBhZGRUb1NldCxcbiAgLy8gUmVmbGVjdFxuICB1bmFwcGx5LFxuICB1bmNvbnN0cnVjdCxcbn07XG4iLCAiaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi91dGlscy5qcyc7XG5cbmV4cG9ydCBjb25zdCBodG1sID0gZnJlZXplKFtcbiAgJ2EnLFxuICAnYWJicicsXG4gICdhY3JvbnltJyxcbiAgJ2FkZHJlc3MnLFxuICAnYXJlYScsXG4gICdhcnRpY2xlJyxcbiAgJ2FzaWRlJyxcbiAgJ2F1ZGlvJyxcbiAgJ2InLFxuICAnYmRpJyxcbiAgJ2JkbycsXG4gICdiaWcnLFxuICAnYmxpbmsnLFxuICAnYmxvY2txdW90ZScsXG4gICdib2R5JyxcbiAgJ2JyJyxcbiAgJ2J1dHRvbicsXG4gICdjYW52YXMnLFxuICAnY2FwdGlvbicsXG4gICdjZW50ZXInLFxuICAnY2l0ZScsXG4gICdjb2RlJyxcbiAgJ2NvbCcsXG4gICdjb2xncm91cCcsXG4gICdjb250ZW50JyxcbiAgJ2RhdGEnLFxuICAnZGF0YWxpc3QnLFxuICAnZGQnLFxuICAnZGVjb3JhdG9yJyxcbiAgJ2RlbCcsXG4gICdkZXRhaWxzJyxcbiAgJ2RmbicsXG4gICdkaWFsb2cnLFxuICAnZGlyJyxcbiAgJ2RpdicsXG4gICdkbCcsXG4gICdkdCcsXG4gICdlbGVtZW50JyxcbiAgJ2VtJyxcbiAgJ2ZpZWxkc2V0JyxcbiAgJ2ZpZ2NhcHRpb24nLFxuICAnZmlndXJlJyxcbiAgJ2ZvbnQnLFxuICAnZm9vdGVyJyxcbiAgJ2Zvcm0nLFxuICAnaDEnLFxuICAnaDInLFxuICAnaDMnLFxuICAnaDQnLFxuICAnaDUnLFxuICAnaDYnLFxuICAnaGVhZCcsXG4gICdoZWFkZXInLFxuICAnaGdyb3VwJyxcbiAgJ2hyJyxcbiAgJ2h0bWwnLFxuICAnaScsXG4gICdpbWcnLFxuICAnaW5wdXQnLFxuICAnaW5zJyxcbiAgJ2tiZCcsXG4gICdsYWJlbCcsXG4gICdsZWdlbmQnLFxuICAnbGknLFxuICAnbWFpbicsXG4gICdtYXAnLFxuICAnbWFyaycsXG4gICdtYXJxdWVlJyxcbiAgJ21lbnUnLFxuICAnbWVudWl0ZW0nLFxuICAnbWV0ZXInLFxuICAnbmF2JyxcbiAgJ25vYnInLFxuICAnb2wnLFxuICAnb3B0Z3JvdXAnLFxuICAnb3B0aW9uJyxcbiAgJ291dHB1dCcsXG4gICdwJyxcbiAgJ3BpY3R1cmUnLFxuICAncHJlJyxcbiAgJ3Byb2dyZXNzJyxcbiAgJ3EnLFxuICAncnAnLFxuICAncnQnLFxuICAncnVieScsXG4gICdzJyxcbiAgJ3NhbXAnLFxuICAnc2VhcmNoJyxcbiAgJ3NlY3Rpb24nLFxuICAnc2VsZWN0JyxcbiAgJ3NoYWRvdycsXG4gICdzbG90JyxcbiAgJ3NtYWxsJyxcbiAgJ3NvdXJjZScsXG4gICdzcGFjZXInLFxuICAnc3BhbicsXG4gICdzdHJpa2UnLFxuICAnc3Ryb25nJyxcbiAgJ3N0eWxlJyxcbiAgJ3N1YicsXG4gICdzdW1tYXJ5JyxcbiAgJ3N1cCcsXG4gICd0YWJsZScsXG4gICd0Ym9keScsXG4gICd0ZCcsXG4gICd0ZW1wbGF0ZScsXG4gICd0ZXh0YXJlYScsXG4gICd0Zm9vdCcsXG4gICd0aCcsXG4gICd0aGVhZCcsXG4gICd0aW1lJyxcbiAgJ3RyJyxcbiAgJ3RyYWNrJyxcbiAgJ3R0JyxcbiAgJ3UnLFxuICAndWwnLFxuICAndmFyJyxcbiAgJ3ZpZGVvJyxcbiAgJ3dicicsXG5dIGFzIGNvbnN0KTtcblxuZXhwb3J0IGNvbnN0IHN2ZyA9IGZyZWV6ZShbXG4gICdzdmcnLFxuICAnYScsXG4gICdhbHRnbHlwaCcsXG4gICdhbHRnbHlwaGRlZicsXG4gICdhbHRnbHlwaGl0ZW0nLFxuICAnYW5pbWF0ZWNvbG9yJyxcbiAgJ2FuaW1hdGVtb3Rpb24nLFxuICAnYW5pbWF0ZXRyYW5zZm9ybScsXG4gICdjaXJjbGUnLFxuICAnY2xpcHBhdGgnLFxuICAnZGVmcycsXG4gICdkZXNjJyxcbiAgJ2VsbGlwc2UnLFxuICAnZW50ZXJrZXloaW50JyxcbiAgJ2V4cG9ydHBhcnRzJyxcbiAgJ2ZpbHRlcicsXG4gICdmb250JyxcbiAgJ2cnLFxuICAnZ2x5cGgnLFxuICAnZ2x5cGhyZWYnLFxuICAnaGtlcm4nLFxuICAnaW1hZ2UnLFxuICAnaW5wdXRtb2RlJyxcbiAgJ2xpbmUnLFxuICAnbGluZWFyZ3JhZGllbnQnLFxuICAnbWFya2VyJyxcbiAgJ21hc2snLFxuICAnbWV0YWRhdGEnLFxuICAnbXBhdGgnLFxuICAncGFydCcsXG4gICdwYXRoJyxcbiAgJ3BhdHRlcm4nLFxuICAncG9seWdvbicsXG4gICdwb2x5bGluZScsXG4gICdyYWRpYWxncmFkaWVudCcsXG4gICdyZWN0JyxcbiAgJ3N0b3AnLFxuICAnc3R5bGUnLFxuICAnc3dpdGNoJyxcbiAgJ3N5bWJvbCcsXG4gICd0ZXh0JyxcbiAgJ3RleHRwYXRoJyxcbiAgJ3RpdGxlJyxcbiAgJ3RyZWYnLFxuICAndHNwYW4nLFxuICAndmlldycsXG4gICd2a2VybicsXG5dIGFzIGNvbnN0KTtcblxuZXhwb3J0IGNvbnN0IHN2Z0ZpbHRlcnMgPSBmcmVlemUoW1xuICAnZmVCbGVuZCcsXG4gICdmZUNvbG9yTWF0cml4JyxcbiAgJ2ZlQ29tcG9uZW50VHJhbnNmZXInLFxuICAnZmVDb21wb3NpdGUnLFxuICAnZmVDb252b2x2ZU1hdHJpeCcsXG4gICdmZURpZmZ1c2VMaWdodGluZycsXG4gICdmZURpc3BsYWNlbWVudE1hcCcsXG4gICdmZURpc3RhbnRMaWdodCcsXG4gICdmZURyb3BTaGFkb3cnLFxuICAnZmVGbG9vZCcsXG4gICdmZUZ1bmNBJyxcbiAgJ2ZlRnVuY0InLFxuICAnZmVGdW5jRycsXG4gICdmZUZ1bmNSJyxcbiAgJ2ZlR2F1c3NpYW5CbHVyJyxcbiAgJ2ZlSW1hZ2UnLFxuICAnZmVNZXJnZScsXG4gICdmZU1lcmdlTm9kZScsXG4gICdmZU1vcnBob2xvZ3knLFxuICAnZmVPZmZzZXQnLFxuICAnZmVQb2ludExpZ2h0JyxcbiAgJ2ZlU3BlY3VsYXJMaWdodGluZycsXG4gICdmZVNwb3RMaWdodCcsXG4gICdmZVRpbGUnLFxuICAnZmVUdXJidWxlbmNlJyxcbl0gYXMgY29uc3QpO1xuXG4vLyBMaXN0IG9mIFNWRyBlbGVtZW50cyB0aGF0IGFyZSBkaXNhbGxvd2VkIGJ5IGRlZmF1bHQuXG4vLyBXZSBzdGlsbCBuZWVkIHRvIGtub3cgdGhlbSBzbyB0aGF0IHdlIGNhbiBkbyBuYW1lc3BhY2Vcbi8vIGNoZWNrcyBwcm9wZXJseSBpbiBjYXNlIG9uZSB3YW50cyB0byBhZGQgdGhlbSB0b1xuLy8gYWxsb3ctbGlzdC5cbmV4cG9ydCBjb25zdCBzdmdEaXNhbGxvd2VkID0gZnJlZXplKFtcbiAgJ2FuaW1hdGUnLFxuICAnY29sb3ItcHJvZmlsZScsXG4gICdjdXJzb3InLFxuICAnZGlzY2FyZCcsXG4gICdmb250LWZhY2UnLFxuICAnZm9udC1mYWNlLWZvcm1hdCcsXG4gICdmb250LWZhY2UtbmFtZScsXG4gICdmb250LWZhY2Utc3JjJyxcbiAgJ2ZvbnQtZmFjZS11cmknLFxuICAnZm9yZWlnbm9iamVjdCcsXG4gICdoYXRjaCcsXG4gICdoYXRjaHBhdGgnLFxuICAnbWVzaCcsXG4gICdtZXNoZ3JhZGllbnQnLFxuICAnbWVzaHBhdGNoJyxcbiAgJ21lc2hyb3cnLFxuICAnbWlzc2luZy1nbHlwaCcsXG4gICdzY3JpcHQnLFxuICAnc2V0JyxcbiAgJ3NvbGlkY29sb3InLFxuICAndW5rbm93bicsXG4gICd1c2UnLFxuXSBhcyBjb25zdCk7XG5cbmV4cG9ydCBjb25zdCBtYXRoTWwgPSBmcmVlemUoW1xuICAnbWF0aCcsXG4gICdtZW5jbG9zZScsXG4gICdtZXJyb3InLFxuICAnbWZlbmNlZCcsXG4gICdtZnJhYycsXG4gICdtZ2x5cGgnLFxuICAnbWknLFxuICAnbWxhYmVsZWR0cicsXG4gICdtbXVsdGlzY3JpcHRzJyxcbiAgJ21uJyxcbiAgJ21vJyxcbiAgJ21vdmVyJyxcbiAgJ21wYWRkZWQnLFxuICAnbXBoYW50b20nLFxuICAnbXJvb3QnLFxuICAnbXJvdycsXG4gICdtcycsXG4gICdtc3BhY2UnLFxuICAnbXNxcnQnLFxuICAnbXN0eWxlJyxcbiAgJ21zdWInLFxuICAnbXN1cCcsXG4gICdtc3Vic3VwJyxcbiAgJ210YWJsZScsXG4gICdtdGQnLFxuICAnbXRleHQnLFxuICAnbXRyJyxcbiAgJ211bmRlcicsXG4gICdtdW5kZXJvdmVyJyxcbiAgJ21wcmVzY3JpcHRzJyxcbl0gYXMgY29uc3QpO1xuXG4vLyBTaW1pbGFybHkgdG8gU1ZHLCB3ZSB3YW50IHRvIGtub3cgYWxsIE1hdGhNTCBlbGVtZW50cyxcbi8vIGV2ZW4gdGhvc2UgdGhhdCB3ZSBkaXNhbGxvdyBieSBkZWZhdWx0LlxuZXhwb3J0IGNvbnN0IG1hdGhNbERpc2FsbG93ZWQgPSBmcmVlemUoW1xuICAnbWFjdGlvbicsXG4gICdtYWxpZ25ncm91cCcsXG4gICdtYWxpZ25tYXJrJyxcbiAgJ21sb25nZGl2JyxcbiAgJ21zY2FycmllcycsXG4gICdtc2NhcnJ5JyxcbiAgJ21zZ3JvdXAnLFxuICAnbXN0YWNrJyxcbiAgJ21zbGluZScsXG4gICdtc3JvdycsXG4gICdzZW1hbnRpY3MnLFxuICAnYW5ub3RhdGlvbicsXG4gICdhbm5vdGF0aW9uLXhtbCcsXG4gICdtcHJlc2NyaXB0cycsXG4gICdub25lJyxcbl0gYXMgY29uc3QpO1xuXG5leHBvcnQgY29uc3QgdGV4dCA9IGZyZWV6ZShbJyN0ZXh0J10gYXMgY29uc3QpO1xuIiwgImltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4vdXRpbHMuanMnO1xuXG5leHBvcnQgY29uc3QgaHRtbCA9IGZyZWV6ZShbXG4gICdhY2NlcHQnLFxuICAnYWN0aW9uJyxcbiAgJ2FsaWduJyxcbiAgJ2FsdCcsXG4gICdhdXRvY2FwaXRhbGl6ZScsXG4gICdhdXRvY29tcGxldGUnLFxuICAnYXV0b3BpY3R1cmVpbnBpY3R1cmUnLFxuICAnYXV0b3BsYXknLFxuICAnYmFja2dyb3VuZCcsXG4gICdiZ2NvbG9yJyxcbiAgJ2JvcmRlcicsXG4gICdjYXB0dXJlJyxcbiAgJ2NlbGxwYWRkaW5nJyxcbiAgJ2NlbGxzcGFjaW5nJyxcbiAgJ2NoZWNrZWQnLFxuICAnY2l0ZScsXG4gICdjbGFzcycsXG4gICdjbGVhcicsXG4gICdjb2xvcicsXG4gICdjb2xzJyxcbiAgJ2NvbHNwYW4nLFxuICAnY29udHJvbHMnLFxuICAnY29udHJvbHNsaXN0JyxcbiAgJ2Nvb3JkcycsXG4gICdjcm9zc29yaWdpbicsXG4gICdkYXRldGltZScsXG4gICdkZWNvZGluZycsXG4gICdkZWZhdWx0JyxcbiAgJ2RpcicsXG4gICdkaXNhYmxlZCcsXG4gICdkaXNhYmxlcGljdHVyZWlucGljdHVyZScsXG4gICdkaXNhYmxlcmVtb3RlcGxheWJhY2snLFxuICAnZG93bmxvYWQnLFxuICAnZHJhZ2dhYmxlJyxcbiAgJ2VuY3R5cGUnLFxuICAnZW50ZXJrZXloaW50JyxcbiAgJ2V4cG9ydHBhcnRzJyxcbiAgJ2ZhY2UnLFxuICAnZm9yJyxcbiAgJ2hlYWRlcnMnLFxuICAnaGVpZ2h0JyxcbiAgJ2hpZGRlbicsXG4gICdoaWdoJyxcbiAgJ2hyZWYnLFxuICAnaHJlZmxhbmcnLFxuICAnaWQnLFxuICAnaW5lcnQnLFxuICAnaW5wdXRtb2RlJyxcbiAgJ2ludGVncml0eScsXG4gICdpc21hcCcsXG4gICdraW5kJyxcbiAgJ2xhYmVsJyxcbiAgJ2xhbmcnLFxuICAnbGlzdCcsXG4gICdsb2FkaW5nJyxcbiAgJ2xvb3AnLFxuICAnbG93JyxcbiAgJ21heCcsXG4gICdtYXhsZW5ndGgnLFxuICAnbWVkaWEnLFxuICAnbWV0aG9kJyxcbiAgJ21pbicsXG4gICdtaW5sZW5ndGgnLFxuICAnbXVsdGlwbGUnLFxuICAnbXV0ZWQnLFxuICAnbmFtZScsXG4gICdub25jZScsXG4gICdub3NoYWRlJyxcbiAgJ25vdmFsaWRhdGUnLFxuICAnbm93cmFwJyxcbiAgJ29wZW4nLFxuICAnb3B0aW11bScsXG4gICdwYXJ0JyxcbiAgJ3BhdHRlcm4nLFxuICAncGxhY2Vob2xkZXInLFxuICAncGxheXNpbmxpbmUnLFxuICAncG9wb3ZlcicsXG4gICdwb3BvdmVydGFyZ2V0JyxcbiAgJ3BvcG92ZXJ0YXJnZXRhY3Rpb24nLFxuICAncG9zdGVyJyxcbiAgJ3ByZWxvYWQnLFxuICAncHViZGF0ZScsXG4gICdyYWRpb2dyb3VwJyxcbiAgJ3JlYWRvbmx5JyxcbiAgJ3JlbCcsXG4gICdyZXF1aXJlZCcsXG4gICdyZXYnLFxuICAncmV2ZXJzZWQnLFxuICAncm9sZScsXG4gICdyb3dzJyxcbiAgJ3Jvd3NwYW4nLFxuICAnc3BlbGxjaGVjaycsXG4gICdzY29wZScsXG4gICdzZWxlY3RlZCcsXG4gICdzaGFwZScsXG4gICdzaXplJyxcbiAgJ3NpemVzJyxcbiAgJ3Nsb3QnLFxuICAnc3BhbicsXG4gICdzcmNsYW5nJyxcbiAgJ3N0YXJ0JyxcbiAgJ3NyYycsXG4gICdzcmNzZXQnLFxuICAnc3RlcCcsXG4gICdzdHlsZScsXG4gICdzdW1tYXJ5JyxcbiAgJ3RhYmluZGV4JyxcbiAgJ3RpdGxlJyxcbiAgJ3RyYW5zbGF0ZScsXG4gICd0eXBlJyxcbiAgJ3VzZW1hcCcsXG4gICd2YWxpZ24nLFxuICAndmFsdWUnLFxuICAnd2lkdGgnLFxuICAnd3JhcCcsXG4gICd4bWxucycsXG4gICdzbG90Jyxcbl0gYXMgY29uc3QpO1xuXG5leHBvcnQgY29uc3Qgc3ZnID0gZnJlZXplKFtcbiAgJ2FjY2VudC1oZWlnaHQnLFxuICAnYWNjdW11bGF0ZScsXG4gICdhZGRpdGl2ZScsXG4gICdhbGlnbm1lbnQtYmFzZWxpbmUnLFxuICAnYW1wbGl0dWRlJyxcbiAgJ2FzY2VudCcsXG4gICdhdHRyaWJ1dGVuYW1lJyxcbiAgJ2F0dHJpYnV0ZXR5cGUnLFxuICAnYXppbXV0aCcsXG4gICdiYXNlZnJlcXVlbmN5JyxcbiAgJ2Jhc2VsaW5lLXNoaWZ0JyxcbiAgJ2JlZ2luJyxcbiAgJ2JpYXMnLFxuICAnYnknLFxuICAnY2xhc3MnLFxuICAnY2xpcCcsXG4gICdjbGlwcGF0aHVuaXRzJyxcbiAgJ2NsaXAtcGF0aCcsXG4gICdjbGlwLXJ1bGUnLFxuICAnY29sb3InLFxuICAnY29sb3ItaW50ZXJwb2xhdGlvbicsXG4gICdjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnMnLFxuICAnY29sb3ItcHJvZmlsZScsXG4gICdjb2xvci1yZW5kZXJpbmcnLFxuICAnY3gnLFxuICAnY3knLFxuICAnZCcsXG4gICdkeCcsXG4gICdkeScsXG4gICdkaWZmdXNlY29uc3RhbnQnLFxuICAnZGlyZWN0aW9uJyxcbiAgJ2Rpc3BsYXknLFxuICAnZGl2aXNvcicsXG4gICdkdXInLFxuICAnZWRnZW1vZGUnLFxuICAnZWxldmF0aW9uJyxcbiAgJ2VuZCcsXG4gICdleHBvbmVudCcsXG4gICdmaWxsJyxcbiAgJ2ZpbGwtb3BhY2l0eScsXG4gICdmaWxsLXJ1bGUnLFxuICAnZmlsdGVyJyxcbiAgJ2ZpbHRlcnVuaXRzJyxcbiAgJ2Zsb29kLWNvbG9yJyxcbiAgJ2Zsb29kLW9wYWNpdHknLFxuICAnZm9udC1mYW1pbHknLFxuICAnZm9udC1zaXplJyxcbiAgJ2ZvbnQtc2l6ZS1hZGp1c3QnLFxuICAnZm9udC1zdHJldGNoJyxcbiAgJ2ZvbnQtc3R5bGUnLFxuICAnZm9udC12YXJpYW50JyxcbiAgJ2ZvbnQtd2VpZ2h0JyxcbiAgJ2Z4JyxcbiAgJ2Z5JyxcbiAgJ2cxJyxcbiAgJ2cyJyxcbiAgJ2dseXBoLW5hbWUnLFxuICAnZ2x5cGhyZWYnLFxuICAnZ3JhZGllbnR1bml0cycsXG4gICdncmFkaWVudHRyYW5zZm9ybScsXG4gICdoZWlnaHQnLFxuICAnaHJlZicsXG4gICdpZCcsXG4gICdpbWFnZS1yZW5kZXJpbmcnLFxuICAnaW4nLFxuICAnaW4yJyxcbiAgJ2ludGVyY2VwdCcsXG4gICdrJyxcbiAgJ2sxJyxcbiAgJ2syJyxcbiAgJ2szJyxcbiAgJ2s0JyxcbiAgJ2tlcm5pbmcnLFxuICAna2V5cG9pbnRzJyxcbiAgJ2tleXNwbGluZXMnLFxuICAna2V5dGltZXMnLFxuICAnbGFuZycsXG4gICdsZW5ndGhhZGp1c3QnLFxuICAnbGV0dGVyLXNwYWNpbmcnLFxuICAna2VybmVsbWF0cml4JyxcbiAgJ2tlcm5lbHVuaXRsZW5ndGgnLFxuICAnbGlnaHRpbmctY29sb3InLFxuICAnbG9jYWwnLFxuICAnbWFya2VyLWVuZCcsXG4gICdtYXJrZXItbWlkJyxcbiAgJ21hcmtlci1zdGFydCcsXG4gICdtYXJrZXJoZWlnaHQnLFxuICAnbWFya2VydW5pdHMnLFxuICAnbWFya2Vyd2lkdGgnLFxuICAnbWFza2NvbnRlbnR1bml0cycsXG4gICdtYXNrdW5pdHMnLFxuICAnbWF4JyxcbiAgJ21hc2snLFxuICAnbWFzay10eXBlJyxcbiAgJ21lZGlhJyxcbiAgJ21ldGhvZCcsXG4gICdtb2RlJyxcbiAgJ21pbicsXG4gICduYW1lJyxcbiAgJ251bW9jdGF2ZXMnLFxuICAnb2Zmc2V0JyxcbiAgJ29wZXJhdG9yJyxcbiAgJ29wYWNpdHknLFxuICAnb3JkZXInLFxuICAnb3JpZW50JyxcbiAgJ29yaWVudGF0aW9uJyxcbiAgJ29yaWdpbicsXG4gICdvdmVyZmxvdycsXG4gICdwYWludC1vcmRlcicsXG4gICdwYXRoJyxcbiAgJ3BhdGhsZW5ndGgnLFxuICAncGF0dGVybmNvbnRlbnR1bml0cycsXG4gICdwYXR0ZXJudHJhbnNmb3JtJyxcbiAgJ3BhdHRlcm51bml0cycsXG4gICdwb2ludHMnLFxuICAncHJlc2VydmVhbHBoYScsXG4gICdwcmVzZXJ2ZWFzcGVjdHJhdGlvJyxcbiAgJ3ByaW1pdGl2ZXVuaXRzJyxcbiAgJ3InLFxuICAncngnLFxuICAncnknLFxuICAncmFkaXVzJyxcbiAgJ3JlZngnLFxuICAncmVmeScsXG4gICdyZXBlYXRjb3VudCcsXG4gICdyZXBlYXRkdXInLFxuICAncmVzdGFydCcsXG4gICdyZXN1bHQnLFxuICAncm90YXRlJyxcbiAgJ3NjYWxlJyxcbiAgJ3NlZWQnLFxuICAnc2hhcGUtcmVuZGVyaW5nJyxcbiAgJ3Nsb3BlJyxcbiAgJ3NwZWN1bGFyY29uc3RhbnQnLFxuICAnc3BlY3VsYXJleHBvbmVudCcsXG4gICdzcHJlYWRtZXRob2QnLFxuICAnc3RhcnRvZmZzZXQnLFxuICAnc3RkZGV2aWF0aW9uJyxcbiAgJ3N0aXRjaHRpbGVzJyxcbiAgJ3N0b3AtY29sb3InLFxuICAnc3RvcC1vcGFjaXR5JyxcbiAgJ3N0cm9rZS1kYXNoYXJyYXknLFxuICAnc3Ryb2tlLWRhc2hvZmZzZXQnLFxuICAnc3Ryb2tlLWxpbmVjYXAnLFxuICAnc3Ryb2tlLWxpbmVqb2luJyxcbiAgJ3N0cm9rZS1taXRlcmxpbWl0JyxcbiAgJ3N0cm9rZS1vcGFjaXR5JyxcbiAgJ3N0cm9rZScsXG4gICdzdHJva2Utd2lkdGgnLFxuICAnc3R5bGUnLFxuICAnc3VyZmFjZXNjYWxlJyxcbiAgJ3N5c3RlbWxhbmd1YWdlJyxcbiAgJ3RhYmluZGV4JyxcbiAgJ3RhYmxldmFsdWVzJyxcbiAgJ3RhcmdldHgnLFxuICAndGFyZ2V0eScsXG4gICd0cmFuc2Zvcm0nLFxuICAndHJhbnNmb3JtLW9yaWdpbicsXG4gICd0ZXh0LWFuY2hvcicsXG4gICd0ZXh0LWRlY29yYXRpb24nLFxuICAndGV4dC1yZW5kZXJpbmcnLFxuICAndGV4dGxlbmd0aCcsXG4gICd0eXBlJyxcbiAgJ3UxJyxcbiAgJ3UyJyxcbiAgJ3VuaWNvZGUnLFxuICAndmFsdWVzJyxcbiAgJ3ZpZXdib3gnLFxuICAndmlzaWJpbGl0eScsXG4gICd2ZXJzaW9uJyxcbiAgJ3ZlcnQtYWR2LXknLFxuICAndmVydC1vcmlnaW4teCcsXG4gICd2ZXJ0LW9yaWdpbi15JyxcbiAgJ3dpZHRoJyxcbiAgJ3dvcmQtc3BhY2luZycsXG4gICd3cmFwJyxcbiAgJ3dyaXRpbmctbW9kZScsXG4gICd4Y2hhbm5lbHNlbGVjdG9yJyxcbiAgJ3ljaGFubmVsc2VsZWN0b3InLFxuICAneCcsXG4gICd4MScsXG4gICd4MicsXG4gICd4bWxucycsXG4gICd5JyxcbiAgJ3kxJyxcbiAgJ3kyJyxcbiAgJ3onLFxuICAnem9vbWFuZHBhbicsXG5dIGFzIGNvbnN0KTtcblxuZXhwb3J0IGNvbnN0IG1hdGhNbCA9IGZyZWV6ZShbXG4gICdhY2NlbnQnLFxuICAnYWNjZW50dW5kZXInLFxuICAnYWxpZ24nLFxuICAnYmV2ZWxsZWQnLFxuICAnY2xvc2UnLFxuICAnY29sdW1uc2FsaWduJyxcbiAgJ2NvbHVtbmxpbmVzJyxcbiAgJ2NvbHVtbnNwYW4nLFxuICAnZGVub21hbGlnbicsXG4gICdkZXB0aCcsXG4gICdkaXInLFxuICAnZGlzcGxheScsXG4gICdkaXNwbGF5c3R5bGUnLFxuICAnZW5jb2RpbmcnLFxuICAnZmVuY2UnLFxuICAnZnJhbWUnLFxuICAnaGVpZ2h0JyxcbiAgJ2hyZWYnLFxuICAnaWQnLFxuICAnbGFyZ2VvcCcsXG4gICdsZW5ndGgnLFxuICAnbGluZXRoaWNrbmVzcycsXG4gICdsc3BhY2UnLFxuICAnbHF1b3RlJyxcbiAgJ21hdGhiYWNrZ3JvdW5kJyxcbiAgJ21hdGhjb2xvcicsXG4gICdtYXRoc2l6ZScsXG4gICdtYXRodmFyaWFudCcsXG4gICdtYXhzaXplJyxcbiAgJ21pbnNpemUnLFxuICAnbW92YWJsZWxpbWl0cycsXG4gICdub3RhdGlvbicsXG4gICdudW1hbGlnbicsXG4gICdvcGVuJyxcbiAgJ3Jvd2FsaWduJyxcbiAgJ3Jvd2xpbmVzJyxcbiAgJ3Jvd3NwYWNpbmcnLFxuICAncm93c3BhbicsXG4gICdyc3BhY2UnLFxuICAncnF1b3RlJyxcbiAgJ3NjcmlwdGxldmVsJyxcbiAgJ3NjcmlwdG1pbnNpemUnLFxuICAnc2NyaXB0c2l6ZW11bHRpcGxpZXInLFxuICAnc2VsZWN0aW9uJyxcbiAgJ3NlcGFyYXRvcicsXG4gICdzZXBhcmF0b3JzJyxcbiAgJ3N0cmV0Y2h5JyxcbiAgJ3N1YnNjcmlwdHNoaWZ0JyxcbiAgJ3N1cHNjcmlwdHNoaWZ0JyxcbiAgJ3N5bW1ldHJpYycsXG4gICd2b2Zmc2V0JyxcbiAgJ3dpZHRoJyxcbiAgJ3htbG5zJyxcbl0pO1xuXG5leHBvcnQgY29uc3QgeG1sID0gZnJlZXplKFtcbiAgJ3hsaW5rOmhyZWYnLFxuICAneG1sOmlkJyxcbiAgJ3hsaW5rOnRpdGxlJyxcbiAgJ3htbDpzcGFjZScsXG4gICd4bWxuczp4bGluaycsXG5dIGFzIGNvbnN0KTtcbiIsICJpbXBvcnQgeyBzZWFsIH0gZnJvbSAnLi91dGlscy5qcyc7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL2JldHRlci1yZWdleFxuZXhwb3J0IGNvbnN0IE1VU1RBQ0hFX0VYUFIgPSBzZWFsKC9cXHtcXHtbXFx3XFxXXSp8W1xcd1xcV10qXFx9XFx9L2dtKTsgLy8gU3BlY2lmeSB0ZW1wbGF0ZSBkZXRlY3Rpb24gcmVnZXggZm9yIFNBRkVfRk9SX1RFTVBMQVRFUyBtb2RlXG5leHBvcnQgY29uc3QgRVJCX0VYUFIgPSBzZWFsKC88JVtcXHdcXFddKnxbXFx3XFxXXSolPi9nbSk7XG5leHBvcnQgY29uc3QgVE1QTElUX0VYUFIgPSBzZWFsKC9cXCRcXHtbXFx3XFxXXSovZ20pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHVuaWNvcm4vYmV0dGVyLXJlZ2V4XG5leHBvcnQgY29uc3QgREFUQV9BVFRSID0gc2VhbCgvXmRhdGEtW1xcLVxcdy5cXHUwMEI3LVxcdUZGRkZdKyQvKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2VsZXNzLWVzY2FwZVxuZXhwb3J0IGNvbnN0IEFSSUFfQVRUUiA9IHNlYWwoL15hcmlhLVtcXC1cXHddKyQvKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2VsZXNzLWVzY2FwZVxuZXhwb3J0IGNvbnN0IElTX0FMTE9XRURfVVJJID0gc2VhbChcbiAgL14oPzooPzooPzpmfGh0KXRwcz98bWFpbHRvfHRlbHxjYWxsdG98c21zfGNpZHx4bXBwfG1hdHJpeCk6fFteYS16XXxbYS16Ky5cXC1dKyg/OlteYS16Ky5cXC06XXwkKSkvaSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZWxlc3MtZXNjYXBlXG4pO1xuZXhwb3J0IGNvbnN0IElTX1NDUklQVF9PUl9EQVRBID0gc2VhbCgvXig/OlxcdytzY3JpcHR8ZGF0YSk6L2kpO1xuZXhwb3J0IGNvbnN0IEFUVFJfV0hJVEVTUEFDRSA9IHNlYWwoXG4gIC9bXFx1MDAwMC1cXHUwMDIwXFx1MDBBMFxcdTE2ODBcXHUxODBFXFx1MjAwMC1cXHUyMDI5XFx1MjA1RlxcdTMwMDBdL2cgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb250cm9sLXJlZ2V4XG4pO1xuZXhwb3J0IGNvbnN0IERPQ1RZUEVfTkFNRSA9IHNlYWwoL15odG1sJC9pKTtcbmV4cG9ydCBjb25zdCBDVVNUT01fRUxFTUVOVCA9IHNlYWwoL15bYS16XVsuXFx3XSooLVsuXFx3XSspKyQvaSk7XG4iLCAiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L2luZGVudCAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIFRydXN0ZWRIVE1MLFxuICBUcnVzdGVkVHlwZXNXaW5kb3csXG59IGZyb20gJ3RydXN0ZWQtdHlwZXMvbGliL2luZGV4LmpzJztcbmltcG9ydCB0eXBlIHsgQ29uZmlnLCBVc2VQcm9maWxlc0NvbmZpZyB9IGZyb20gJy4vY29uZmlnJztcbmltcG9ydCAqIGFzIFRBR1MgZnJvbSAnLi90YWdzLmpzJztcbmltcG9ydCAqIGFzIEFUVFJTIGZyb20gJy4vYXR0cnMuanMnO1xuaW1wb3J0ICogYXMgRVhQUkVTU0lPTlMgZnJvbSAnLi9yZWdleHAuanMnO1xuaW1wb3J0IHtcbiAgYWRkVG9TZXQsXG4gIGNsb25lLFxuICBlbnRyaWVzLFxuICBmcmVlemUsXG4gIGFycmF5Rm9yRWFjaCxcbiAgYXJyYXlMYXN0SW5kZXhPZixcbiAgYXJyYXlQb3AsXG4gIGFycmF5UHVzaCxcbiAgYXJyYXlTcGxpY2UsXG4gIHN0cmluZ01hdGNoLFxuICBzdHJpbmdSZXBsYWNlLFxuICBzdHJpbmdUb0xvd2VyQ2FzZSxcbiAgc3RyaW5nVG9TdHJpbmcsXG4gIHN0cmluZ0luZGV4T2YsXG4gIHN0cmluZ1RyaW0sXG4gIHJlZ0V4cFRlc3QsXG4gIHR5cGVFcnJvckNyZWF0ZSxcbiAgbG9va3VwR2V0dGVyLFxuICBjcmVhdGUsXG4gIG9iamVjdEhhc093blByb3BlcnR5LFxufSBmcm9tICcuL3V0aWxzLmpzJztcblxuZXhwb3J0IHR5cGUgeyBDb25maWcgfSBmcm9tICcuL2NvbmZpZyc7XG5cbmRlY2xhcmUgY29uc3QgVkVSU0lPTjogc3RyaW5nO1xuXG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvTm9kZS9ub2RlVHlwZVxuY29uc3QgTk9ERV9UWVBFID0ge1xuICBlbGVtZW50OiAxLFxuICBhdHRyaWJ1dGU6IDIsXG4gIHRleHQ6IDMsXG4gIGNkYXRhU2VjdGlvbjogNCxcbiAgZW50aXR5UmVmZXJlbmNlOiA1LCAvLyBEZXByZWNhdGVkXG4gIGVudGl0eU5vZGU6IDYsIC8vIERlcHJlY2F0ZWRcbiAgcHJvZ3Jlc3NpbmdJbnN0cnVjdGlvbjogNyxcbiAgY29tbWVudDogOCxcbiAgZG9jdW1lbnQ6IDksXG4gIGRvY3VtZW50VHlwZTogMTAsXG4gIGRvY3VtZW50RnJhZ21lbnQ6IDExLFxuICBub3RhdGlvbjogMTIsIC8vIERlcHJlY2F0ZWRcbn07XG5cbmNvbnN0IGdldEdsb2JhbCA9IGZ1bmN0aW9uICgpOiBXaW5kb3dMaWtlIHtcbiAgcmV0dXJuIHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnID8gbnVsbCA6IHdpbmRvdztcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5vLW9wIHBvbGljeSBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuXG4gKiBEb24ndCBleHBvcnQgdGhpcyBmdW5jdGlvbiBvdXRzaWRlIHRoaXMgbW9kdWxlIVxuICogQHBhcmFtIHRydXN0ZWRUeXBlcyBUaGUgcG9saWN5IGZhY3RvcnkuXG4gKiBAcGFyYW0gcHVyaWZ5SG9zdEVsZW1lbnQgVGhlIFNjcmlwdCBlbGVtZW50IHVzZWQgdG8gbG9hZCBET01QdXJpZnkgKHRvIGRldGVybWluZSBwb2xpY3kgbmFtZSBzdWZmaXgpLlxuICogQHJldHVybiBUaGUgcG9saWN5IGNyZWF0ZWQgKG9yIG51bGwsIGlmIFRydXN0ZWQgVHlwZXNcbiAqIGFyZSBub3Qgc3VwcG9ydGVkIG9yIGNyZWF0aW5nIHRoZSBwb2xpY3kgZmFpbGVkKS5cbiAqL1xuY29uc3QgX2NyZWF0ZVRydXN0ZWRUeXBlc1BvbGljeSA9IGZ1bmN0aW9uIChcbiAgdHJ1c3RlZFR5cGVzOiBUcnVzdGVkVHlwZVBvbGljeUZhY3RvcnksXG4gIHB1cmlmeUhvc3RFbGVtZW50OiBIVE1MU2NyaXB0RWxlbWVudFxuKSB7XG4gIGlmIChcbiAgICB0eXBlb2YgdHJ1c3RlZFR5cGVzICE9PSAnb2JqZWN0JyB8fFxuICAgIHR5cGVvZiB0cnVzdGVkVHlwZXMuY3JlYXRlUG9saWN5ICE9PSAnZnVuY3Rpb24nXG4gICkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gQWxsb3cgdGhlIGNhbGxlcnMgdG8gY29udHJvbCB0aGUgdW5pcXVlIHBvbGljeSBuYW1lXG4gIC8vIGJ5IGFkZGluZyBhIGRhdGEtdHQtcG9saWN5LXN1ZmZpeCB0byB0aGUgc2NyaXB0IGVsZW1lbnQgd2l0aCB0aGUgRE9NUHVyaWZ5LlxuICAvLyBQb2xpY3kgY3JlYXRpb24gd2l0aCBkdXBsaWNhdGUgbmFtZXMgdGhyb3dzIGluIFRydXN0ZWQgVHlwZXMuXG4gIGxldCBzdWZmaXggPSBudWxsO1xuICBjb25zdCBBVFRSX05BTUUgPSAnZGF0YS10dC1wb2xpY3ktc3VmZml4JztcbiAgaWYgKHB1cmlmeUhvc3RFbGVtZW50ICYmIHB1cmlmeUhvc3RFbGVtZW50Lmhhc0F0dHJpYnV0ZShBVFRSX05BTUUpKSB7XG4gICAgc3VmZml4ID0gcHVyaWZ5SG9zdEVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJfTkFNRSk7XG4gIH1cblxuICBjb25zdCBwb2xpY3lOYW1lID0gJ2RvbXB1cmlmeScgKyAoc3VmZml4ID8gJyMnICsgc3VmZml4IDogJycpO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIHRydXN0ZWRUeXBlcy5jcmVhdGVQb2xpY3kocG9saWN5TmFtZSwge1xuICAgICAgY3JlYXRlSFRNTChodG1sKSB7XG4gICAgICAgIHJldHVybiBodG1sO1xuICAgICAgfSxcbiAgICAgIGNyZWF0ZVNjcmlwdFVSTChzY3JpcHRVcmwpIHtcbiAgICAgICAgcmV0dXJuIHNjcmlwdFVybDtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0gY2F0Y2ggKF8pIHtcbiAgICAvLyBQb2xpY3kgY3JlYXRpb24gZmFpbGVkIChtb3N0IGxpa2VseSBhbm90aGVyIERPTVB1cmlmeSBzY3JpcHQgaGFzXG4gICAgLy8gYWxyZWFkeSBydW4pLiBTa2lwIGNyZWF0aW5nIHRoZSBwb2xpY3ksIGFzIHRoaXMgd2lsbCBvbmx5IGNhdXNlIGVycm9yc1xuICAgIC8vIGlmIFRUIGFyZSBlbmZvcmNlZC5cbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAnVHJ1c3RlZFR5cGVzIHBvbGljeSAnICsgcG9saWN5TmFtZSArICcgY291bGQgbm90IGJlIGNyZWF0ZWQuJ1xuICAgICk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn07XG5cbmNvbnN0IF9jcmVhdGVIb29rc01hcCA9IGZ1bmN0aW9uICgpOiBIb29rc01hcCB7XG4gIHJldHVybiB7XG4gICAgYWZ0ZXJTYW5pdGl6ZUF0dHJpYnV0ZXM6IFtdLFxuICAgIGFmdGVyU2FuaXRpemVFbGVtZW50czogW10sXG4gICAgYWZ0ZXJTYW5pdGl6ZVNoYWRvd0RPTTogW10sXG4gICAgYmVmb3JlU2FuaXRpemVBdHRyaWJ1dGVzOiBbXSxcbiAgICBiZWZvcmVTYW5pdGl6ZUVsZW1lbnRzOiBbXSxcbiAgICBiZWZvcmVTYW5pdGl6ZVNoYWRvd0RPTTogW10sXG4gICAgdXBvblNhbml0aXplQXR0cmlidXRlOiBbXSxcbiAgICB1cG9uU2FuaXRpemVFbGVtZW50OiBbXSxcbiAgICB1cG9uU2FuaXRpemVTaGFkb3dOb2RlOiBbXSxcbiAgfTtcbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZURPTVB1cmlmeSh3aW5kb3c6IFdpbmRvd0xpa2UgPSBnZXRHbG9iYWwoKSk6IERPTVB1cmlmeSB7XG4gIGNvbnN0IERPTVB1cmlmeTogRE9NUHVyaWZ5ID0gKHJvb3Q6IFdpbmRvd0xpa2UpID0+IGNyZWF0ZURPTVB1cmlmeShyb290KTtcblxuICBET01QdXJpZnkudmVyc2lvbiA9IFZFUlNJT047XG5cbiAgRE9NUHVyaWZ5LnJlbW92ZWQgPSBbXTtcblxuICBpZiAoXG4gICAgIXdpbmRvdyB8fFxuICAgICF3aW5kb3cuZG9jdW1lbnQgfHxcbiAgICB3aW5kb3cuZG9jdW1lbnQubm9kZVR5cGUgIT09IE5PREVfVFlQRS5kb2N1bWVudCB8fFxuICAgICF3aW5kb3cuRWxlbWVudFxuICApIHtcbiAgICAvLyBOb3QgcnVubmluZyBpbiBhIGJyb3dzZXIsIHByb3ZpZGUgYSBmYWN0b3J5IGZ1bmN0aW9uXG4gICAgLy8gc28gdGhhdCB5b3UgY2FuIHBhc3MgeW91ciBvd24gV2luZG93XG4gICAgRE9NUHVyaWZ5LmlzU3VwcG9ydGVkID0gZmFsc2U7XG5cbiAgICByZXR1cm4gRE9NUHVyaWZ5O1xuICB9XG5cbiAgbGV0IHsgZG9jdW1lbnQgfSA9IHdpbmRvdztcblxuICBjb25zdCBvcmlnaW5hbERvY3VtZW50ID0gZG9jdW1lbnQ7XG4gIGNvbnN0IGN1cnJlbnRTY3JpcHQ6IEhUTUxTY3JpcHRFbGVtZW50ID1cbiAgICBvcmlnaW5hbERvY3VtZW50LmN1cnJlbnRTY3JpcHQgYXMgSFRNTFNjcmlwdEVsZW1lbnQ7XG4gIGNvbnN0IHtcbiAgICBEb2N1bWVudEZyYWdtZW50LFxuICAgIEhUTUxUZW1wbGF0ZUVsZW1lbnQsXG4gICAgTm9kZSxcbiAgICBFbGVtZW50LFxuICAgIE5vZGVGaWx0ZXIsXG4gICAgTmFtZWROb2RlTWFwID0gd2luZG93Lk5hbWVkTm9kZU1hcCB8fCAod2luZG93IGFzIGFueSkuTW96TmFtZWRBdHRyTWFwLFxuICAgIEhUTUxGb3JtRWxlbWVudCxcbiAgICBET01QYXJzZXIsXG4gICAgdHJ1c3RlZFR5cGVzLFxuICB9ID0gd2luZG93O1xuXG4gIGNvbnN0IEVsZW1lbnRQcm90b3R5cGUgPSBFbGVtZW50LnByb3RvdHlwZTtcblxuICBjb25zdCBjbG9uZU5vZGUgPSBsb29rdXBHZXR0ZXIoRWxlbWVudFByb3RvdHlwZSwgJ2Nsb25lTm9kZScpO1xuICBjb25zdCByZW1vdmUgPSBsb29rdXBHZXR0ZXIoRWxlbWVudFByb3RvdHlwZSwgJ3JlbW92ZScpO1xuICBjb25zdCBnZXROZXh0U2libGluZyA9IGxvb2t1cEdldHRlcihFbGVtZW50UHJvdG90eXBlLCAnbmV4dFNpYmxpbmcnKTtcbiAgY29uc3QgZ2V0Q2hpbGROb2RlcyA9IGxvb2t1cEdldHRlcihFbGVtZW50UHJvdG90eXBlLCAnY2hpbGROb2RlcycpO1xuICBjb25zdCBnZXRQYXJlbnROb2RlID0gbG9va3VwR2V0dGVyKEVsZW1lbnRQcm90b3R5cGUsICdwYXJlbnROb2RlJyk7XG5cbiAgLy8gQXMgcGVyIGlzc3VlICM0NywgdGhlIHdlYi1jb21wb25lbnRzIHJlZ2lzdHJ5IGlzIGluaGVyaXRlZCBieSBhXG4gIC8vIG5ldyBkb2N1bWVudCBjcmVhdGVkIHZpYSBjcmVhdGVIVE1MRG9jdW1lbnQuIEFzIHBlciB0aGUgc3BlY1xuICAvLyAoaHR0cDovL3czYy5naXRodWIuaW8vd2ViY29tcG9uZW50cy9zcGVjL2N1c3RvbS8jY3JlYXRpbmctYW5kLXBhc3NpbmctcmVnaXN0cmllcylcbiAgLy8gYSBuZXcgZW1wdHkgcmVnaXN0cnkgaXMgdXNlZCB3aGVuIGNyZWF0aW5nIGEgdGVtcGxhdGUgY29udGVudHMgb3duZXJcbiAgLy8gZG9jdW1lbnQsIHNvIHdlIHVzZSB0aGF0IGFzIG91ciBwYXJlbnQgZG9jdW1lbnQgdG8gZW5zdXJlIG5vdGhpbmdcbiAgLy8gaXMgaW5oZXJpdGVkLlxuICBpZiAodHlwZW9mIEhUTUxUZW1wbGF0ZUVsZW1lbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7XG4gICAgaWYgKHRlbXBsYXRlLmNvbnRlbnQgJiYgdGVtcGxhdGUuY29udGVudC5vd25lckRvY3VtZW50KSB7XG4gICAgICBkb2N1bWVudCA9IHRlbXBsYXRlLmNvbnRlbnQub3duZXJEb2N1bWVudDtcbiAgICB9XG4gIH1cblxuICBsZXQgdHJ1c3RlZFR5cGVzUG9saWN5O1xuICBsZXQgZW1wdHlIVE1MID0gJyc7XG5cbiAgY29uc3Qge1xuICAgIGltcGxlbWVudGF0aW9uLFxuICAgIGNyZWF0ZU5vZGVJdGVyYXRvcixcbiAgICBjcmVhdGVEb2N1bWVudEZyYWdtZW50LFxuICAgIGdldEVsZW1lbnRzQnlUYWdOYW1lLFxuICB9ID0gZG9jdW1lbnQ7XG4gIGNvbnN0IHsgaW1wb3J0Tm9kZSB9ID0gb3JpZ2luYWxEb2N1bWVudDtcblxuICBsZXQgaG9va3MgPSBfY3JlYXRlSG9va3NNYXAoKTtcblxuICAvKipcbiAgICogRXhwb3NlIHdoZXRoZXIgdGhpcyBicm93c2VyIHN1cHBvcnRzIHJ1bm5pbmcgdGhlIGZ1bGwgRE9NUHVyaWZ5LlxuICAgKi9cbiAgRE9NUHVyaWZ5LmlzU3VwcG9ydGVkID1cbiAgICB0eXBlb2YgZW50cmllcyA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIHR5cGVvZiBnZXRQYXJlbnROb2RlID09PSAnZnVuY3Rpb24nICYmXG4gICAgaW1wbGVtZW50YXRpb24gJiZcbiAgICBpbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQgIT09IHVuZGVmaW5lZDtcblxuICBjb25zdCB7XG4gICAgTVVTVEFDSEVfRVhQUixcbiAgICBFUkJfRVhQUixcbiAgICBUTVBMSVRfRVhQUixcbiAgICBEQVRBX0FUVFIsXG4gICAgQVJJQV9BVFRSLFxuICAgIElTX1NDUklQVF9PUl9EQVRBLFxuICAgIEFUVFJfV0hJVEVTUEFDRSxcbiAgICBDVVNUT01fRUxFTUVOVCxcbiAgfSA9IEVYUFJFU1NJT05TO1xuXG4gIGxldCB7IElTX0FMTE9XRURfVVJJIH0gPSBFWFBSRVNTSU9OUztcblxuICAvKipcbiAgICogV2UgY29uc2lkZXIgdGhlIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGJlbG93IHRvIGJlIHNhZmUuIElkZWFsbHlcbiAgICogZG9uJ3QgYWRkIGFueSBuZXcgb25lcyBidXQgZmVlbCBmcmVlIHRvIHJlbW92ZSB1bndhbnRlZCBvbmVzLlxuICAgKi9cblxuICAvKiBhbGxvd2VkIGVsZW1lbnQgbmFtZXMgKi9cbiAgbGV0IEFMTE9XRURfVEFHUyA9IG51bGw7XG4gIGNvbnN0IERFRkFVTFRfQUxMT1dFRF9UQUdTID0gYWRkVG9TZXQoe30sIFtcbiAgICAuLi5UQUdTLmh0bWwsXG4gICAgLi4uVEFHUy5zdmcsXG4gICAgLi4uVEFHUy5zdmdGaWx0ZXJzLFxuICAgIC4uLlRBR1MubWF0aE1sLFxuICAgIC4uLlRBR1MudGV4dCxcbiAgXSk7XG5cbiAgLyogQWxsb3dlZCBhdHRyaWJ1dGUgbmFtZXMgKi9cbiAgbGV0IEFMTE9XRURfQVRUUiA9IG51bGw7XG4gIGNvbnN0IERFRkFVTFRfQUxMT1dFRF9BVFRSID0gYWRkVG9TZXQoe30sIFtcbiAgICAuLi5BVFRSUy5odG1sLFxuICAgIC4uLkFUVFJTLnN2ZyxcbiAgICAuLi5BVFRSUy5tYXRoTWwsXG4gICAgLi4uQVRUUlMueG1sLFxuICBdKTtcblxuICAvKlxuICAgKiBDb25maWd1cmUgaG93IERPTVB1cmlmeSBzaG91bGQgaGFuZGxlIGN1c3RvbSBlbGVtZW50cyBhbmQgdGhlaXIgYXR0cmlidXRlcyBhcyB3ZWxsIGFzIGN1c3RvbWl6ZWQgYnVpbHQtaW4gZWxlbWVudHMuXG4gICAqIEBwcm9wZXJ0eSB7UmVnRXhwfEZ1bmN0aW9ufG51bGx9IHRhZ05hbWVDaGVjayBvbmUgb2YgW251bGwsIHJlZ2V4UGF0dGVybiwgcHJlZGljYXRlXS4gRGVmYXVsdDogYG51bGxgIChkaXNhbGxvdyBhbnkgY3VzdG9tIGVsZW1lbnRzKVxuICAgKiBAcHJvcGVydHkge1JlZ0V4cHxGdW5jdGlvbnxudWxsfSBhdHRyaWJ1dGVOYW1lQ2hlY2sgb25lIG9mIFtudWxsLCByZWdleFBhdHRlcm4sIHByZWRpY2F0ZV0uIERlZmF1bHQ6IGBudWxsYCAoZGlzYWxsb3cgYW55IGF0dHJpYnV0ZXMgbm90IG9uIHRoZSBhbGxvdyBsaXN0KVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IGFsbG93Q3VzdG9taXplZEJ1aWx0SW5FbGVtZW50cyBhbGxvdyBjdXN0b20gZWxlbWVudHMgZGVyaXZlZCBmcm9tIGJ1aWx0LWlucyBpZiB0aGV5IHBhc3MgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrLiBEZWZhdWx0OiBgZmFsc2VgLlxuICAgKi9cbiAgbGV0IENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HID0gT2JqZWN0LnNlYWwoXG4gICAgY3JlYXRlKG51bGwsIHtcbiAgICAgIHRhZ05hbWVDaGVjazoge1xuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IG51bGwsXG4gICAgICB9LFxuICAgICAgYXR0cmlidXRlTmFtZUNoZWNrOiB7XG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogbnVsbCxcbiAgICAgIH0sXG4gICAgICBhbGxvd0N1c3RvbWl6ZWRCdWlsdEluRWxlbWVudHM6IHtcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgfSlcbiAgKTtcblxuICAvKiBFeHBsaWNpdGx5IGZvcmJpZGRlbiB0YWdzIChvdmVycmlkZXMgQUxMT1dFRF9UQUdTL0FERF9UQUdTKSAqL1xuICBsZXQgRk9SQklEX1RBR1MgPSBudWxsO1xuXG4gIC8qIEV4cGxpY2l0bHkgZm9yYmlkZGVuIGF0dHJpYnV0ZXMgKG92ZXJyaWRlcyBBTExPV0VEX0FUVFIvQUREX0FUVFIpICovXG4gIGxldCBGT1JCSURfQVRUUiA9IG51bGw7XG5cbiAgLyogQ29uZmlnIG9iamVjdCB0byBzdG9yZSBBRERfVEFHUy9BRERfQVRUUiBmdW5jdGlvbnMgKHdoZW4gdXNlZCBhcyBmdW5jdGlvbnMpICovXG4gIGNvbnN0IEVYVFJBX0VMRU1FTlRfSEFORExJTkcgPSBPYmplY3Quc2VhbChcbiAgICBjcmVhdGUobnVsbCwge1xuICAgICAgdGFnQ2hlY2s6IHtcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgfSxcbiAgICAgIGF0dHJpYnV0ZUNoZWNrOiB7XG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogbnVsbCxcbiAgICAgIH0sXG4gICAgfSlcbiAgKTtcblxuICAvKiBEZWNpZGUgaWYgQVJJQSBhdHRyaWJ1dGVzIGFyZSBva2F5ICovXG4gIGxldCBBTExPV19BUklBX0FUVFIgPSB0cnVlO1xuXG4gIC8qIERlY2lkZSBpZiBjdXN0b20gZGF0YSBhdHRyaWJ1dGVzIGFyZSBva2F5ICovXG4gIGxldCBBTExPV19EQVRBX0FUVFIgPSB0cnVlO1xuXG4gIC8qIERlY2lkZSBpZiB1bmtub3duIHByb3RvY29scyBhcmUgb2theSAqL1xuICBsZXQgQUxMT1dfVU5LTk9XTl9QUk9UT0NPTFMgPSBmYWxzZTtcblxuICAvKiBEZWNpZGUgaWYgc2VsZi1jbG9zaW5nIHRhZ3MgaW4gYXR0cmlidXRlcyBhcmUgYWxsb3dlZC5cbiAgICogVXN1YWxseSByZW1vdmVkIGR1ZSB0byBhIG1YU1MgaXNzdWUgaW4galF1ZXJ5IDMuMCAqL1xuICBsZXQgQUxMT1dfU0VMRl9DTE9TRV9JTl9BVFRSID0gdHJ1ZTtcblxuICAvKiBPdXRwdXQgc2hvdWxkIGJlIHNhZmUgZm9yIGNvbW1vbiB0ZW1wbGF0ZSBlbmdpbmVzLlxuICAgKiBUaGlzIG1lYW5zLCBET01QdXJpZnkgcmVtb3ZlcyBkYXRhIGF0dHJpYnV0ZXMsIG11c3RhY2hlcyBhbmQgRVJCXG4gICAqL1xuICBsZXQgU0FGRV9GT1JfVEVNUExBVEVTID0gZmFsc2U7XG5cbiAgLyogT3V0cHV0IHNob3VsZCBiZSBzYWZlIGV2ZW4gZm9yIFhNTCB1c2VkIHdpdGhpbiBIVE1MIGFuZCBhbGlrZS5cbiAgICogVGhpcyBtZWFucywgRE9NUHVyaWZ5IHJlbW92ZXMgY29tbWVudHMgd2hlbiBjb250YWluaW5nIHJpc2t5IGNvbnRlbnQuXG4gICAqL1xuICBsZXQgU0FGRV9GT1JfWE1MID0gdHJ1ZTtcblxuICAvKiBEZWNpZGUgaWYgZG9jdW1lbnQgd2l0aCA8aHRtbD4uLi4gc2hvdWxkIGJlIHJldHVybmVkICovXG4gIGxldCBXSE9MRV9ET0NVTUVOVCA9IGZhbHNlO1xuXG4gIC8qIFRyYWNrIHdoZXRoZXIgY29uZmlnIGlzIGFscmVhZHkgc2V0IG9uIHRoaXMgaW5zdGFuY2Ugb2YgRE9NUHVyaWZ5LiAqL1xuICBsZXQgU0VUX0NPTkZJRyA9IGZhbHNlO1xuXG4gIC8qIERlY2lkZSBpZiBhbGwgZWxlbWVudHMgKGUuZy4gc3R5bGUsIHNjcmlwdCkgbXVzdCBiZSBjaGlsZHJlbiBvZlxuICAgKiBkb2N1bWVudC5ib2R5LiBCeSBkZWZhdWx0LCBicm93c2VycyBtaWdodCBtb3ZlIHRoZW0gdG8gZG9jdW1lbnQuaGVhZCAqL1xuICBsZXQgRk9SQ0VfQk9EWSA9IGZhbHNlO1xuXG4gIC8qIERlY2lkZSBpZiBhIERPTSBgSFRNTEJvZHlFbGVtZW50YCBzaG91bGQgYmUgcmV0dXJuZWQsIGluc3RlYWQgb2YgYSBodG1sXG4gICAqIHN0cmluZyAob3IgYSBUcnVzdGVkSFRNTCBvYmplY3QgaWYgVHJ1c3RlZCBUeXBlcyBhcmUgc3VwcG9ydGVkKS5cbiAgICogSWYgYFdIT0xFX0RPQ1VNRU5UYCBpcyBlbmFibGVkIGEgYEhUTUxIdG1sRWxlbWVudGAgd2lsbCBiZSByZXR1cm5lZCBpbnN0ZWFkXG4gICAqL1xuICBsZXQgUkVUVVJOX0RPTSA9IGZhbHNlO1xuXG4gIC8qIERlY2lkZSBpZiBhIERPTSBgRG9jdW1lbnRGcmFnbWVudGAgc2hvdWxkIGJlIHJldHVybmVkLCBpbnN0ZWFkIG9mIGEgaHRtbFxuICAgKiBzdHJpbmcgIChvciBhIFRydXN0ZWRIVE1MIG9iamVjdCBpZiBUcnVzdGVkIFR5cGVzIGFyZSBzdXBwb3J0ZWQpICovXG4gIGxldCBSRVRVUk5fRE9NX0ZSQUdNRU5UID0gZmFsc2U7XG5cbiAgLyogVHJ5IHRvIHJldHVybiBhIFRydXN0ZWQgVHlwZSBvYmplY3QgaW5zdGVhZCBvZiBhIHN0cmluZywgcmV0dXJuIGEgc3RyaW5nIGluXG4gICAqIGNhc2UgVHJ1c3RlZCBUeXBlcyBhcmUgbm90IHN1cHBvcnRlZCAgKi9cbiAgbGV0IFJFVFVSTl9UUlVTVEVEX1RZUEUgPSBmYWxzZTtcblxuICAvKiBPdXRwdXQgc2hvdWxkIGJlIGZyZWUgZnJvbSBET00gY2xvYmJlcmluZyBhdHRhY2tzP1xuICAgKiBUaGlzIHNhbml0aXplcyBtYXJrdXBzIG5hbWVkIHdpdGggY29sbGlkaW5nLCBjbG9iYmVyYWJsZSBidWlsdC1pbiBET00gQVBJcy5cbiAgICovXG4gIGxldCBTQU5JVElaRV9ET00gPSB0cnVlO1xuXG4gIC8qIEFjaGlldmUgZnVsbCBET00gQ2xvYmJlcmluZyBwcm90ZWN0aW9uIGJ5IGlzb2xhdGluZyB0aGUgbmFtZXNwYWNlIG9mIG5hbWVkXG4gICAqIHByb3BlcnRpZXMgYW5kIEpTIHZhcmlhYmxlcywgbWl0aWdhdGluZyBhdHRhY2tzIHRoYXQgYWJ1c2UgdGhlIEhUTUwvRE9NIHNwZWMgcnVsZXMuXG4gICAqXG4gICAqIEhUTUwvRE9NIHNwZWMgcnVsZXMgdGhhdCBlbmFibGUgRE9NIENsb2JiZXJpbmc6XG4gICAqICAgLSBOYW1lZCBBY2Nlc3Mgb24gV2luZG93ICjCpzcuMy4zKVxuICAgKiAgIC0gRE9NIFRyZWUgQWNjZXNzb3JzICjCpzMuMS41KVxuICAgKiAgIC0gRm9ybSBFbGVtZW50IFBhcmVudC1DaGlsZCBSZWxhdGlvbnMgKMKnNC4xMC4zKVxuICAgKiAgIC0gSWZyYW1lIHNyY2RvYyAvIE5lc3RlZCBXaW5kb3dQcm94aWVzICjCpzQuOC41KVxuICAgKiAgIC0gSFRNTENvbGxlY3Rpb24gKMKnNC4yLjEwLjIpXG4gICAqXG4gICAqIE5hbWVzcGFjZSBpc29sYXRpb24gaXMgaW1wbGVtZW50ZWQgYnkgcHJlZml4aW5nIGBpZGAgYW5kIGBuYW1lYCBhdHRyaWJ1dGVzXG4gICAqIHdpdGggYSBjb25zdGFudCBzdHJpbmcsIGkuZS4sIGB1c2VyLWNvbnRlbnQtYFxuICAgKi9cbiAgbGV0IFNBTklUSVpFX05BTUVEX1BST1BTID0gZmFsc2U7XG4gIGNvbnN0IFNBTklUSVpFX05BTUVEX1BST1BTX1BSRUZJWCA9ICd1c2VyLWNvbnRlbnQtJztcblxuICAvKiBLZWVwIGVsZW1lbnQgY29udGVudCB3aGVuIHJlbW92aW5nIGVsZW1lbnQ/ICovXG4gIGxldCBLRUVQX0NPTlRFTlQgPSB0cnVlO1xuXG4gIC8qIElmIGEgYE5vZGVgIGlzIHBhc3NlZCB0byBzYW5pdGl6ZSgpLCB0aGVuIHBlcmZvcm1zIHNhbml0aXphdGlvbiBpbi1wbGFjZSBpbnN0ZWFkXG4gICAqIG9mIGltcG9ydGluZyBpdCBpbnRvIGEgbmV3IERvY3VtZW50IGFuZCByZXR1cm5pbmcgYSBzYW5pdGl6ZWQgY29weSAqL1xuICBsZXQgSU5fUExBQ0UgPSBmYWxzZTtcblxuICAvKiBBbGxvdyB1c2FnZSBvZiBwcm9maWxlcyBsaWtlIGh0bWwsIHN2ZyBhbmQgbWF0aE1sICovXG4gIGxldCBVU0VfUFJPRklMRVM6IFVzZVByb2ZpbGVzQ29uZmlnIHwgZmFsc2UgPSB7fTtcblxuICAvKiBUYWdzIHRvIGlnbm9yZSBjb250ZW50IG9mIHdoZW4gS0VFUF9DT05URU5UIGlzIHRydWUgKi9cbiAgbGV0IEZPUkJJRF9DT05URU5UUyA9IG51bGw7XG4gIGNvbnN0IERFRkFVTFRfRk9SQklEX0NPTlRFTlRTID0gYWRkVG9TZXQoe30sIFtcbiAgICAnYW5ub3RhdGlvbi14bWwnLFxuICAgICdhdWRpbycsXG4gICAgJ2NvbGdyb3VwJyxcbiAgICAnZGVzYycsXG4gICAgJ2ZvcmVpZ25vYmplY3QnLFxuICAgICdoZWFkJyxcbiAgICAnaWZyYW1lJyxcbiAgICAnbWF0aCcsXG4gICAgJ21pJyxcbiAgICAnbW4nLFxuICAgICdtbycsXG4gICAgJ21zJyxcbiAgICAnbXRleHQnLFxuICAgICdub2VtYmVkJyxcbiAgICAnbm9mcmFtZXMnLFxuICAgICdub3NjcmlwdCcsXG4gICAgJ3BsYWludGV4dCcsXG4gICAgJ3NjcmlwdCcsXG4gICAgJ3N0eWxlJyxcbiAgICAnc3ZnJyxcbiAgICAndGVtcGxhdGUnLFxuICAgICd0aGVhZCcsXG4gICAgJ3RpdGxlJyxcbiAgICAndmlkZW8nLFxuICAgICd4bXAnLFxuICBdKTtcblxuICAvKiBUYWdzIHRoYXQgYXJlIHNhZmUgZm9yIGRhdGE6IFVSSXMgKi9cbiAgbGV0IERBVEFfVVJJX1RBR1MgPSBudWxsO1xuICBjb25zdCBERUZBVUxUX0RBVEFfVVJJX1RBR1MgPSBhZGRUb1NldCh7fSwgW1xuICAgICdhdWRpbycsXG4gICAgJ3ZpZGVvJyxcbiAgICAnaW1nJyxcbiAgICAnc291cmNlJyxcbiAgICAnaW1hZ2UnLFxuICAgICd0cmFjaycsXG4gIF0pO1xuXG4gIC8qIEF0dHJpYnV0ZXMgc2FmZSBmb3IgdmFsdWVzIGxpa2UgXCJqYXZhc2NyaXB0OlwiICovXG4gIGxldCBVUklfU0FGRV9BVFRSSUJVVEVTID0gbnVsbDtcbiAgY29uc3QgREVGQVVMVF9VUklfU0FGRV9BVFRSSUJVVEVTID0gYWRkVG9TZXQoe30sIFtcbiAgICAnYWx0JyxcbiAgICAnY2xhc3MnLFxuICAgICdmb3InLFxuICAgICdpZCcsXG4gICAgJ2xhYmVsJyxcbiAgICAnbmFtZScsXG4gICAgJ3BhdHRlcm4nLFxuICAgICdwbGFjZWhvbGRlcicsXG4gICAgJ3JvbGUnLFxuICAgICdzdW1tYXJ5JyxcbiAgICAndGl0bGUnLFxuICAgICd2YWx1ZScsXG4gICAgJ3N0eWxlJyxcbiAgICAneG1sbnMnLFxuICBdKTtcblxuICBjb25zdCBNQVRITUxfTkFNRVNQQUNFID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwnO1xuICBjb25zdCBTVkdfTkFNRVNQQUNFID0gJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJztcbiAgY29uc3QgSFRNTF9OQU1FU1BBQ0UgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCc7XG4gIC8qIERvY3VtZW50IG5hbWVzcGFjZSAqL1xuICBsZXQgTkFNRVNQQUNFID0gSFRNTF9OQU1FU1BBQ0U7XG4gIGxldCBJU19FTVBUWV9JTlBVVCA9IGZhbHNlO1xuXG4gIC8qIEFsbG93ZWQgWEhUTUwrWE1MIG5hbWVzcGFjZXMgKi9cbiAgbGV0IEFMTE9XRURfTkFNRVNQQUNFUyA9IG51bGw7XG4gIGNvbnN0IERFRkFVTFRfQUxMT1dFRF9OQU1FU1BBQ0VTID0gYWRkVG9TZXQoXG4gICAge30sXG4gICAgW01BVEhNTF9OQU1FU1BBQ0UsIFNWR19OQU1FU1BBQ0UsIEhUTUxfTkFNRVNQQUNFXSxcbiAgICBzdHJpbmdUb1N0cmluZ1xuICApO1xuXG4gIGxldCBNQVRITUxfVEVYVF9JTlRFR1JBVElPTl9QT0lOVFMgPSBhZGRUb1NldCh7fSwgW1xuICAgICdtaScsXG4gICAgJ21vJyxcbiAgICAnbW4nLFxuICAgICdtcycsXG4gICAgJ210ZXh0JyxcbiAgXSk7XG5cbiAgbGV0IEhUTUxfSU5URUdSQVRJT05fUE9JTlRTID0gYWRkVG9TZXQoe30sIFsnYW5ub3RhdGlvbi14bWwnXSk7XG5cbiAgLy8gQ2VydGFpbiBlbGVtZW50cyBhcmUgYWxsb3dlZCBpbiBib3RoIFNWRyBhbmQgSFRNTFxuICAvLyBuYW1lc3BhY2UuIFdlIG5lZWQgdG8gc3BlY2lmeSB0aGVtIGV4cGxpY2l0bHlcbiAgLy8gc28gdGhhdCB0aGV5IGRvbid0IGdldCBlcnJvbmVvdXNseSBkZWxldGVkIGZyb21cbiAgLy8gSFRNTCBuYW1lc3BhY2UuXG4gIGNvbnN0IENPTU1PTl9TVkdfQU5EX0hUTUxfRUxFTUVOVFMgPSBhZGRUb1NldCh7fSwgW1xuICAgICd0aXRsZScsXG4gICAgJ3N0eWxlJyxcbiAgICAnZm9udCcsXG4gICAgJ2EnLFxuICAgICdzY3JpcHQnLFxuICBdKTtcblxuICAvKiBQYXJzaW5nIG9mIHN0cmljdCBYSFRNTCBkb2N1bWVudHMgKi9cbiAgbGV0IFBBUlNFUl9NRURJQV9UWVBFOiBudWxsIHwgRE9NUGFyc2VyU3VwcG9ydGVkVHlwZSA9IG51bGw7XG4gIGNvbnN0IFNVUFBPUlRFRF9QQVJTRVJfTUVESUFfVFlQRVMgPSBbJ2FwcGxpY2F0aW9uL3hodG1sK3htbCcsICd0ZXh0L2h0bWwnXTtcbiAgY29uc3QgREVGQVVMVF9QQVJTRVJfTUVESUFfVFlQRSA9ICd0ZXh0L2h0bWwnO1xuICBsZXQgdHJhbnNmb3JtQ2FzZUZ1bmM6IG51bGwgfCBQYXJhbWV0ZXJzPHR5cGVvZiBhZGRUb1NldD5bMl0gPSBudWxsO1xuXG4gIC8qIEtlZXAgYSByZWZlcmVuY2UgdG8gY29uZmlnIHRvIHBhc3MgdG8gaG9va3MgKi9cbiAgbGV0IENPTkZJRzogQ29uZmlnIHwgbnVsbCA9IG51bGw7XG5cbiAgLyogSWRlYWxseSwgZG8gbm90IHRvdWNoIGFueXRoaW5nIGJlbG93IHRoaXMgbGluZSAqL1xuICAvKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICovXG5cbiAgY29uc3QgZm9ybUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdmb3JtJyk7XG5cbiAgY29uc3QgaXNSZWdleE9yRnVuY3Rpb24gPSBmdW5jdGlvbiAoXG4gICAgdGVzdFZhbHVlOiB1bmtub3duXG4gICk6IHRlc3RWYWx1ZSBpcyBGdW5jdGlvbiB8IFJlZ0V4cCB7XG4gICAgcmV0dXJuIHRlc3RWYWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCB8fCB0ZXN0VmFsdWUgaW5zdGFuY2VvZiBGdW5jdGlvbjtcbiAgfTtcblxuICAvKipcbiAgICogX3BhcnNlQ29uZmlnXG4gICAqXG4gICAqIEBwYXJhbSBjZmcgb3B0aW9uYWwgY29uZmlnIGxpdGVyYWxcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG4gIGNvbnN0IF9wYXJzZUNvbmZpZyA9IGZ1bmN0aW9uIChjZmc6IENvbmZpZyA9IHt9KTogdm9pZCB7XG4gICAgaWYgKENPTkZJRyAmJiBDT05GSUcgPT09IGNmZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8qIFNoaWVsZCBjb25maWd1cmF0aW9uIG9iamVjdCBmcm9tIHRhbXBlcmluZyAqL1xuICAgIGlmICghY2ZnIHx8IHR5cGVvZiBjZmcgIT09ICdvYmplY3QnKSB7XG4gICAgICBjZmcgPSB7fTtcbiAgICB9XG5cbiAgICAvKiBTaGllbGQgY29uZmlndXJhdGlvbiBvYmplY3QgZnJvbSBwcm90b3R5cGUgcG9sbHV0aW9uICovXG4gICAgY2ZnID0gY2xvbmUoY2ZnKTtcblxuICAgIFBBUlNFUl9NRURJQV9UWVBFID1cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL3ByZWZlci1pbmNsdWRlc1xuICAgICAgU1VQUE9SVEVEX1BBUlNFUl9NRURJQV9UWVBFUy5pbmRleE9mKGNmZy5QQVJTRVJfTUVESUFfVFlQRSkgPT09IC0xXG4gICAgICAgID8gREVGQVVMVF9QQVJTRVJfTUVESUFfVFlQRVxuICAgICAgICA6IGNmZy5QQVJTRVJfTUVESUFfVFlQRTtcblxuICAgIC8vIEhUTUwgdGFncyBhbmQgYXR0cmlidXRlcyBhcmUgbm90IGNhc2Utc2Vuc2l0aXZlLCBjb252ZXJ0aW5nIHRvIGxvd2VyY2FzZS4gS2VlcGluZyBYSFRNTCBhcyBpcy5cbiAgICB0cmFuc2Zvcm1DYXNlRnVuYyA9XG4gICAgICBQQVJTRVJfTUVESUFfVFlQRSA9PT0gJ2FwcGxpY2F0aW9uL3hodG1sK3htbCdcbiAgICAgICAgPyBzdHJpbmdUb1N0cmluZ1xuICAgICAgICA6IHN0cmluZ1RvTG93ZXJDYXNlO1xuXG4gICAgLyogU2V0IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyAqL1xuICAgIEFMTE9XRURfVEFHUyA9IG9iamVjdEhhc093blByb3BlcnR5KGNmZywgJ0FMTE9XRURfVEFHUycpXG4gICAgICA/IGFkZFRvU2V0KHt9LCBjZmcuQUxMT1dFRF9UQUdTLCB0cmFuc2Zvcm1DYXNlRnVuYylcbiAgICAgIDogREVGQVVMVF9BTExPV0VEX1RBR1M7XG4gICAgQUxMT1dFRF9BVFRSID0gb2JqZWN0SGFzT3duUHJvcGVydHkoY2ZnLCAnQUxMT1dFRF9BVFRSJylcbiAgICAgID8gYWRkVG9TZXQoe30sIGNmZy5BTExPV0VEX0FUVFIsIHRyYW5zZm9ybUNhc2VGdW5jKVxuICAgICAgOiBERUZBVUxUX0FMTE9XRURfQVRUUjtcbiAgICBBTExPV0VEX05BTUVTUEFDRVMgPSBvYmplY3RIYXNPd25Qcm9wZXJ0eShjZmcsICdBTExPV0VEX05BTUVTUEFDRVMnKVxuICAgICAgPyBhZGRUb1NldCh7fSwgY2ZnLkFMTE9XRURfTkFNRVNQQUNFUywgc3RyaW5nVG9TdHJpbmcpXG4gICAgICA6IERFRkFVTFRfQUxMT1dFRF9OQU1FU1BBQ0VTO1xuICAgIFVSSV9TQUZFX0FUVFJJQlVURVMgPSBvYmplY3RIYXNPd25Qcm9wZXJ0eShjZmcsICdBRERfVVJJX1NBRkVfQVRUUicpXG4gICAgICA/IGFkZFRvU2V0KFxuICAgICAgICAgIGNsb25lKERFRkFVTFRfVVJJX1NBRkVfQVRUUklCVVRFUyksXG4gICAgICAgICAgY2ZnLkFERF9VUklfU0FGRV9BVFRSLFxuICAgICAgICAgIHRyYW5zZm9ybUNhc2VGdW5jXG4gICAgICAgIClcbiAgICAgIDogREVGQVVMVF9VUklfU0FGRV9BVFRSSUJVVEVTO1xuICAgIERBVEFfVVJJX1RBR1MgPSBvYmplY3RIYXNPd25Qcm9wZXJ0eShjZmcsICdBRERfREFUQV9VUklfVEFHUycpXG4gICAgICA/IGFkZFRvU2V0KFxuICAgICAgICAgIGNsb25lKERFRkFVTFRfREFUQV9VUklfVEFHUyksXG4gICAgICAgICAgY2ZnLkFERF9EQVRBX1VSSV9UQUdTLFxuICAgICAgICAgIHRyYW5zZm9ybUNhc2VGdW5jXG4gICAgICAgIClcbiAgICAgIDogREVGQVVMVF9EQVRBX1VSSV9UQUdTO1xuICAgIEZPUkJJRF9DT05URU5UUyA9IG9iamVjdEhhc093blByb3BlcnR5KGNmZywgJ0ZPUkJJRF9DT05URU5UUycpXG4gICAgICA/IGFkZFRvU2V0KHt9LCBjZmcuRk9SQklEX0NPTlRFTlRTLCB0cmFuc2Zvcm1DYXNlRnVuYylcbiAgICAgIDogREVGQVVMVF9GT1JCSURfQ09OVEVOVFM7XG4gICAgRk9SQklEX1RBR1MgPSBvYmplY3RIYXNPd25Qcm9wZXJ0eShjZmcsICdGT1JCSURfVEFHUycpXG4gICAgICA/IGFkZFRvU2V0KHt9LCBjZmcuRk9SQklEX1RBR1MsIHRyYW5zZm9ybUNhc2VGdW5jKVxuICAgICAgOiBjbG9uZSh7fSk7XG4gICAgRk9SQklEX0FUVFIgPSBvYmplY3RIYXNPd25Qcm9wZXJ0eShjZmcsICdGT1JCSURfQVRUUicpXG4gICAgICA/IGFkZFRvU2V0KHt9LCBjZmcuRk9SQklEX0FUVFIsIHRyYW5zZm9ybUNhc2VGdW5jKVxuICAgICAgOiBjbG9uZSh7fSk7XG4gICAgVVNFX1BST0ZJTEVTID0gb2JqZWN0SGFzT3duUHJvcGVydHkoY2ZnLCAnVVNFX1BST0ZJTEVTJylcbiAgICAgID8gY2ZnLlVTRV9QUk9GSUxFU1xuICAgICAgOiBmYWxzZTtcbiAgICBBTExPV19BUklBX0FUVFIgPSBjZmcuQUxMT1dfQVJJQV9BVFRSICE9PSBmYWxzZTsgLy8gRGVmYXVsdCB0cnVlXG4gICAgQUxMT1dfREFUQV9BVFRSID0gY2ZnLkFMTE9XX0RBVEFfQVRUUiAhPT0gZmFsc2U7IC8vIERlZmF1bHQgdHJ1ZVxuICAgIEFMTE9XX1VOS05PV05fUFJPVE9DT0xTID0gY2ZnLkFMTE9XX1VOS05PV05fUFJPVE9DT0xTIHx8IGZhbHNlOyAvLyBEZWZhdWx0IGZhbHNlXG4gICAgQUxMT1dfU0VMRl9DTE9TRV9JTl9BVFRSID0gY2ZnLkFMTE9XX1NFTEZfQ0xPU0VfSU5fQVRUUiAhPT0gZmFsc2U7IC8vIERlZmF1bHQgdHJ1ZVxuICAgIFNBRkVfRk9SX1RFTVBMQVRFUyA9IGNmZy5TQUZFX0ZPUl9URU1QTEFURVMgfHwgZmFsc2U7IC8vIERlZmF1bHQgZmFsc2VcbiAgICBTQUZFX0ZPUl9YTUwgPSBjZmcuU0FGRV9GT1JfWE1MICE9PSBmYWxzZTsgLy8gRGVmYXVsdCB0cnVlXG4gICAgV0hPTEVfRE9DVU1FTlQgPSBjZmcuV0hPTEVfRE9DVU1FTlQgfHwgZmFsc2U7IC8vIERlZmF1bHQgZmFsc2VcbiAgICBSRVRVUk5fRE9NID0gY2ZnLlJFVFVSTl9ET00gfHwgZmFsc2U7IC8vIERlZmF1bHQgZmFsc2VcbiAgICBSRVRVUk5fRE9NX0ZSQUdNRU5UID0gY2ZnLlJFVFVSTl9ET01fRlJBR01FTlQgfHwgZmFsc2U7IC8vIERlZmF1bHQgZmFsc2VcbiAgICBSRVRVUk5fVFJVU1RFRF9UWVBFID0gY2ZnLlJFVFVSTl9UUlVTVEVEX1RZUEUgfHwgZmFsc2U7IC8vIERlZmF1bHQgZmFsc2VcbiAgICBGT1JDRV9CT0RZID0gY2ZnLkZPUkNFX0JPRFkgfHwgZmFsc2U7IC8vIERlZmF1bHQgZmFsc2VcbiAgICBTQU5JVElaRV9ET00gPSBjZmcuU0FOSVRJWkVfRE9NICE9PSBmYWxzZTsgLy8gRGVmYXVsdCB0cnVlXG4gICAgU0FOSVRJWkVfTkFNRURfUFJPUFMgPSBjZmcuU0FOSVRJWkVfTkFNRURfUFJPUFMgfHwgZmFsc2U7IC8vIERlZmF1bHQgZmFsc2VcbiAgICBLRUVQX0NPTlRFTlQgPSBjZmcuS0VFUF9DT05URU5UICE9PSBmYWxzZTsgLy8gRGVmYXVsdCB0cnVlXG4gICAgSU5fUExBQ0UgPSBjZmcuSU5fUExBQ0UgfHwgZmFsc2U7IC8vIERlZmF1bHQgZmFsc2VcbiAgICBJU19BTExPV0VEX1VSSSA9IGNmZy5BTExPV0VEX1VSSV9SRUdFWFAgfHwgRVhQUkVTU0lPTlMuSVNfQUxMT1dFRF9VUkk7XG4gICAgTkFNRVNQQUNFID0gY2ZnLk5BTUVTUEFDRSB8fCBIVE1MX05BTUVTUEFDRTtcbiAgICBNQVRITUxfVEVYVF9JTlRFR1JBVElPTl9QT0lOVFMgPVxuICAgICAgY2ZnLk1BVEhNTF9URVhUX0lOVEVHUkFUSU9OX1BPSU5UUyB8fCBNQVRITUxfVEVYVF9JTlRFR1JBVElPTl9QT0lOVFM7XG4gICAgSFRNTF9JTlRFR1JBVElPTl9QT0lOVFMgPVxuICAgICAgY2ZnLkhUTUxfSU5URUdSQVRJT05fUE9JTlRTIHx8IEhUTUxfSU5URUdSQVRJT05fUE9JTlRTO1xuXG4gICAgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcgPSBjZmcuQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcgfHwge307XG4gICAgaWYgKFxuICAgICAgY2ZnLkNVU1RPTV9FTEVNRU5UX0hBTkRMSU5HICYmXG4gICAgICBpc1JlZ2V4T3JGdW5jdGlvbihjZmcuQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrKVxuICAgICkge1xuICAgICAgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrID1cbiAgICAgICAgY2ZnLkNVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVjaztcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBjZmcuQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcgJiZcbiAgICAgIGlzUmVnZXhPckZ1bmN0aW9uKGNmZy5DVVNUT01fRUxFTUVOVF9IQU5ETElORy5hdHRyaWJ1dGVOYW1lQ2hlY2spXG4gICAgKSB7XG4gICAgICBDVVNUT01fRUxFTUVOVF9IQU5ETElORy5hdHRyaWJ1dGVOYW1lQ2hlY2sgPVxuICAgICAgICBjZmcuQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcuYXR0cmlidXRlTmFtZUNoZWNrO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGNmZy5DVVNUT01fRUxFTUVOVF9IQU5ETElORyAmJlxuICAgICAgdHlwZW9mIGNmZy5DVVNUT01fRUxFTUVOVF9IQU5ETElORy5hbGxvd0N1c3RvbWl6ZWRCdWlsdEluRWxlbWVudHMgPT09XG4gICAgICAgICdib29sZWFuJ1xuICAgICkge1xuICAgICAgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcuYWxsb3dDdXN0b21pemVkQnVpbHRJbkVsZW1lbnRzID1cbiAgICAgICAgY2ZnLkNVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLmFsbG93Q3VzdG9taXplZEJ1aWx0SW5FbGVtZW50cztcbiAgICB9XG5cbiAgICBpZiAoU0FGRV9GT1JfVEVNUExBVEVTKSB7XG4gICAgICBBTExPV19EQVRBX0FUVFIgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoUkVUVVJOX0RPTV9GUkFHTUVOVCkge1xuICAgICAgUkVUVVJOX0RPTSA9IHRydWU7XG4gICAgfVxuXG4gICAgLyogUGFyc2UgcHJvZmlsZSBpbmZvICovXG4gICAgaWYgKFVTRV9QUk9GSUxFUykge1xuICAgICAgQUxMT1dFRF9UQUdTID0gYWRkVG9TZXQoe30sIFRBR1MudGV4dCk7XG4gICAgICBBTExPV0VEX0FUVFIgPSBjcmVhdGUobnVsbCk7XG4gICAgICBpZiAoVVNFX1BST0ZJTEVTLmh0bWwgPT09IHRydWUpIHtcbiAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9UQUdTLCBUQUdTLmh0bWwpO1xuICAgICAgICBhZGRUb1NldChBTExPV0VEX0FUVFIsIEFUVFJTLmh0bWwpO1xuICAgICAgfVxuXG4gICAgICBpZiAoVVNFX1BST0ZJTEVTLnN2ZyA9PT0gdHJ1ZSkge1xuICAgICAgICBhZGRUb1NldChBTExPV0VEX1RBR1MsIFRBR1Muc3ZnKTtcbiAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9BVFRSLCBBVFRSUy5zdmcpO1xuICAgICAgICBhZGRUb1NldChBTExPV0VEX0FUVFIsIEFUVFJTLnhtbCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChVU0VfUFJPRklMRVMuc3ZnRmlsdGVycyA9PT0gdHJ1ZSkge1xuICAgICAgICBhZGRUb1NldChBTExPV0VEX1RBR1MsIFRBR1Muc3ZnRmlsdGVycyk7XG4gICAgICAgIGFkZFRvU2V0KEFMTE9XRURfQVRUUiwgQVRUUlMuc3ZnKTtcbiAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9BVFRSLCBBVFRSUy54bWwpO1xuICAgICAgfVxuXG4gICAgICBpZiAoVVNFX1BST0ZJTEVTLm1hdGhNbCA9PT0gdHJ1ZSkge1xuICAgICAgICBhZGRUb1NldChBTExPV0VEX1RBR1MsIFRBR1MubWF0aE1sKTtcbiAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9BVFRSLCBBVFRSUy5tYXRoTWwpO1xuICAgICAgICBhZGRUb1NldChBTExPV0VEX0FUVFIsIEFUVFJTLnhtbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogUHJldmVudCBmdW5jdGlvbi1iYXNlZCBBRERfQVRUUiAvIEFERF9UQUdTIGZyb20gbGVha2luZyBhY3Jvc3MgY2FsbHMgKi9cbiAgICBpZiAoIW9iamVjdEhhc093blByb3BlcnR5KGNmZywgJ0FERF9UQUdTJykpIHtcbiAgICAgIEVYVFJBX0VMRU1FTlRfSEFORExJTkcudGFnQ2hlY2sgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICghb2JqZWN0SGFzT3duUHJvcGVydHkoY2ZnLCAnQUREX0FUVFInKSkge1xuICAgICAgRVhUUkFfRUxFTUVOVF9IQU5ETElORy5hdHRyaWJ1dGVDaGVjayA9IG51bGw7XG4gICAgfVxuXG4gICAgLyogTWVyZ2UgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzICovXG4gICAgaWYgKGNmZy5BRERfVEFHUykge1xuICAgICAgaWYgKHR5cGVvZiBjZmcuQUREX1RBR1MgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgRVhUUkFfRUxFTUVOVF9IQU5ETElORy50YWdDaGVjayA9IGNmZy5BRERfVEFHUztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChBTExPV0VEX1RBR1MgPT09IERFRkFVTFRfQUxMT1dFRF9UQUdTKSB7XG4gICAgICAgICAgQUxMT1dFRF9UQUdTID0gY2xvbmUoQUxMT1dFRF9UQUdTKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFkZFRvU2V0KEFMTE9XRURfVEFHUywgY2ZnLkFERF9UQUdTLCB0cmFuc2Zvcm1DYXNlRnVuYyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNmZy5BRERfQVRUUikge1xuICAgICAgaWYgKHR5cGVvZiBjZmcuQUREX0FUVFIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgRVhUUkFfRUxFTUVOVF9IQU5ETElORy5hdHRyaWJ1dGVDaGVjayA9IGNmZy5BRERfQVRUUjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChBTExPV0VEX0FUVFIgPT09IERFRkFVTFRfQUxMT1dFRF9BVFRSKSB7XG4gICAgICAgICAgQUxMT1dFRF9BVFRSID0gY2xvbmUoQUxMT1dFRF9BVFRSKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFkZFRvU2V0KEFMTE9XRURfQVRUUiwgY2ZnLkFERF9BVFRSLCB0cmFuc2Zvcm1DYXNlRnVuYyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNmZy5BRERfVVJJX1NBRkVfQVRUUikge1xuICAgICAgYWRkVG9TZXQoVVJJX1NBRkVfQVRUUklCVVRFUywgY2ZnLkFERF9VUklfU0FGRV9BVFRSLCB0cmFuc2Zvcm1DYXNlRnVuYyk7XG4gICAgfVxuXG4gICAgaWYgKGNmZy5GT1JCSURfQ09OVEVOVFMpIHtcbiAgICAgIGlmIChGT1JCSURfQ09OVEVOVFMgPT09IERFRkFVTFRfRk9SQklEX0NPTlRFTlRTKSB7XG4gICAgICAgIEZPUkJJRF9DT05URU5UUyA9IGNsb25lKEZPUkJJRF9DT05URU5UUyk7XG4gICAgICB9XG5cbiAgICAgIGFkZFRvU2V0KEZPUkJJRF9DT05URU5UUywgY2ZnLkZPUkJJRF9DT05URU5UUywgdHJhbnNmb3JtQ2FzZUZ1bmMpO1xuICAgIH1cblxuICAgIGlmIChjZmcuQUREX0ZPUkJJRF9DT05URU5UUykge1xuICAgICAgaWYgKEZPUkJJRF9DT05URU5UUyA9PT0gREVGQVVMVF9GT1JCSURfQ09OVEVOVFMpIHtcbiAgICAgICAgRk9SQklEX0NPTlRFTlRTID0gY2xvbmUoRk9SQklEX0NPTlRFTlRTKTtcbiAgICAgIH1cblxuICAgICAgYWRkVG9TZXQoRk9SQklEX0NPTlRFTlRTLCBjZmcuQUREX0ZPUkJJRF9DT05URU5UUywgdHJhbnNmb3JtQ2FzZUZ1bmMpO1xuICAgIH1cblxuICAgIC8qIEFkZCAjdGV4dCBpbiBjYXNlIEtFRVBfQ09OVEVOVCBpcyBzZXQgdG8gdHJ1ZSAqL1xuICAgIGlmIChLRUVQX0NPTlRFTlQpIHtcbiAgICAgIEFMTE9XRURfVEFHU1snI3RleHQnXSA9IHRydWU7XG4gICAgfVxuXG4gICAgLyogQWRkIGh0bWwsIGhlYWQgYW5kIGJvZHkgdG8gQUxMT1dFRF9UQUdTIGluIGNhc2UgV0hPTEVfRE9DVU1FTlQgaXMgdHJ1ZSAqL1xuICAgIGlmIChXSE9MRV9ET0NVTUVOVCkge1xuICAgICAgYWRkVG9TZXQoQUxMT1dFRF9UQUdTLCBbJ2h0bWwnLCAnaGVhZCcsICdib2R5J10pO1xuICAgIH1cblxuICAgIC8qIEFkZCB0Ym9keSB0byBBTExPV0VEX1RBR1MgaW4gY2FzZSB0YWJsZXMgYXJlIHBlcm1pdHRlZCwgc2VlICMyODYsICMzNjUgKi9cbiAgICBpZiAoQUxMT1dFRF9UQUdTLnRhYmxlKSB7XG4gICAgICBhZGRUb1NldChBTExPV0VEX1RBR1MsIFsndGJvZHknXSk7XG4gICAgICBkZWxldGUgRk9SQklEX1RBR1MudGJvZHk7XG4gICAgfVxuXG4gICAgaWYgKGNmZy5UUlVTVEVEX1RZUEVTX1BPTElDWSkge1xuICAgICAgaWYgKHR5cGVvZiBjZmcuVFJVU1RFRF9UWVBFU19QT0xJQ1kuY3JlYXRlSFRNTCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyB0eXBlRXJyb3JDcmVhdGUoXG4gICAgICAgICAgJ1RSVVNURURfVFlQRVNfUE9MSUNZIGNvbmZpZ3VyYXRpb24gb3B0aW9uIG11c3QgcHJvdmlkZSBhIFwiY3JlYXRlSFRNTFwiIGhvb2suJ1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGNmZy5UUlVTVEVEX1RZUEVTX1BPTElDWS5jcmVhdGVTY3JpcHRVUkwgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgdHlwZUVycm9yQ3JlYXRlKFxuICAgICAgICAgICdUUlVTVEVEX1RZUEVTX1BPTElDWSBjb25maWd1cmF0aW9uIG9wdGlvbiBtdXN0IHByb3ZpZGUgYSBcImNyZWF0ZVNjcmlwdFVSTFwiIGhvb2suJ1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBPdmVyd3JpdGUgZXhpc3RpbmcgVHJ1c3RlZFR5cGVzIHBvbGljeS5cbiAgICAgIHRydXN0ZWRUeXBlc1BvbGljeSA9IGNmZy5UUlVTVEVEX1RZUEVTX1BPTElDWTtcblxuICAgICAgLy8gU2lnbiBsb2NhbCB2YXJpYWJsZXMgcmVxdWlyZWQgYnkgYHNhbml0aXplYC5cbiAgICAgIGVtcHR5SFRNTCA9IHRydXN0ZWRUeXBlc1BvbGljeS5jcmVhdGVIVE1MKCcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVW5pbml0aWFsaXplZCBwb2xpY3ksIGF0dGVtcHQgdG8gaW5pdGlhbGl6ZSB0aGUgaW50ZXJuYWwgZG9tcHVyaWZ5IHBvbGljeS5cbiAgICAgIGlmICh0cnVzdGVkVHlwZXNQb2xpY3kgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0cnVzdGVkVHlwZXNQb2xpY3kgPSBfY3JlYXRlVHJ1c3RlZFR5cGVzUG9saWN5KFxuICAgICAgICAgIHRydXN0ZWRUeXBlcyxcbiAgICAgICAgICBjdXJyZW50U2NyaXB0XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIGNyZWF0aW5nIHRoZSBpbnRlcm5hbCBwb2xpY3kgc3VjY2VlZGVkIHNpZ24gaW50ZXJuYWwgdmFyaWFibGVzLlxuICAgICAgaWYgKHRydXN0ZWRUeXBlc1BvbGljeSAhPT0gbnVsbCAmJiB0eXBlb2YgZW1wdHlIVE1MID09PSAnc3RyaW5nJykge1xuICAgICAgICBlbXB0eUhUTUwgPSB0cnVzdGVkVHlwZXNQb2xpY3kuY3JlYXRlSFRNTCgnJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUHJldmVudCBmdXJ0aGVyIG1hbmlwdWxhdGlvbiBvZiBjb25maWd1cmF0aW9uLlxuICAgIC8vIE5vdCBhdmFpbGFibGUgaW4gSUU4LCBTYWZhcmkgNSwgZXRjLlxuICAgIGlmIChmcmVlemUpIHtcbiAgICAgIGZyZWV6ZShjZmcpO1xuICAgIH1cblxuICAgIENPTkZJRyA9IGNmZztcbiAgfTtcblxuICAvKiBLZWVwIHRyYWNrIG9mIGFsbCBwb3NzaWJsZSBTVkcgYW5kIE1hdGhNTCB0YWdzXG4gICAqIHNvIHRoYXQgd2UgY2FuIHBlcmZvcm0gdGhlIG5hbWVzcGFjZSBjaGVja3NcbiAgICogY29ycmVjdGx5LiAqL1xuICBjb25zdCBBTExfU1ZHX1RBR1MgPSBhZGRUb1NldCh7fSwgW1xuICAgIC4uLlRBR1Muc3ZnLFxuICAgIC4uLlRBR1Muc3ZnRmlsdGVycyxcbiAgICAuLi5UQUdTLnN2Z0Rpc2FsbG93ZWQsXG4gIF0pO1xuICBjb25zdCBBTExfTUFUSE1MX1RBR1MgPSBhZGRUb1NldCh7fSwgW1xuICAgIC4uLlRBR1MubWF0aE1sLFxuICAgIC4uLlRBR1MubWF0aE1sRGlzYWxsb3dlZCxcbiAgXSk7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBlbGVtZW50IGEgRE9NIGVsZW1lbnQgd2hvc2UgbmFtZXNwYWNlIGlzIGJlaW5nIGNoZWNrZWRcbiAgICogQHJldHVybnMgUmV0dXJuIGZhbHNlIGlmIHRoZSBlbGVtZW50IGhhcyBhXG4gICAqICBuYW1lc3BhY2UgdGhhdCBhIHNwZWMtY29tcGxpYW50IHBhcnNlciB3b3VsZCBuZXZlclxuICAgKiAgcmV0dXJuLiBSZXR1cm4gdHJ1ZSBvdGhlcndpc2UuXG4gICAqL1xuICBjb25zdCBfY2hlY2tWYWxpZE5hbWVzcGFjZSA9IGZ1bmN0aW9uIChlbGVtZW50OiBFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgbGV0IHBhcmVudCA9IGdldFBhcmVudE5vZGUoZWxlbWVudCk7XG5cbiAgICAvLyBJbiBKU0RPTSwgaWYgd2UncmUgaW5zaWRlIHNoYWRvdyBET00sIHRoZW4gcGFyZW50Tm9kZVxuICAgIC8vIGNhbiBiZSBudWxsLiBXZSBqdXN0IHNpbXVsYXRlIHBhcmVudCBpbiB0aGlzIGNhc2UuXG4gICAgaWYgKCFwYXJlbnQgfHwgIXBhcmVudC50YWdOYW1lKSB7XG4gICAgICBwYXJlbnQgPSB7XG4gICAgICAgIG5hbWVzcGFjZVVSSTogTkFNRVNQQUNFLFxuICAgICAgICB0YWdOYW1lOiAndGVtcGxhdGUnLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCB0YWdOYW1lID0gc3RyaW5nVG9Mb3dlckNhc2UoZWxlbWVudC50YWdOYW1lKTtcbiAgICBjb25zdCBwYXJlbnRUYWdOYW1lID0gc3RyaW5nVG9Mb3dlckNhc2UocGFyZW50LnRhZ05hbWUpO1xuXG4gICAgaWYgKCFBTExPV0VEX05BTUVTUEFDRVNbZWxlbWVudC5uYW1lc3BhY2VVUkldKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnQubmFtZXNwYWNlVVJJID09PSBTVkdfTkFNRVNQQUNFKSB7XG4gICAgICAvLyBUaGUgb25seSB3YXkgdG8gc3dpdGNoIGZyb20gSFRNTCBuYW1lc3BhY2UgdG8gU1ZHXG4gICAgICAvLyBpcyB2aWEgPHN2Zz4uIElmIGl0IGhhcHBlbnMgdmlhIGFueSBvdGhlciB0YWcsIHRoZW5cbiAgICAgIC8vIGl0IHNob3VsZCBiZSBraWxsZWQuXG4gICAgICBpZiAocGFyZW50Lm5hbWVzcGFjZVVSSSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICAgICAgcmV0dXJuIHRhZ05hbWUgPT09ICdzdmcnO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGUgb25seSB3YXkgdG8gc3dpdGNoIGZyb20gTWF0aE1MIHRvIFNWRyBpcyB2aWFgXG4gICAgICAvLyBzdmcgaWYgcGFyZW50IGlzIGVpdGhlciA8YW5ub3RhdGlvbi14bWw+IG9yIE1hdGhNTFxuICAgICAgLy8gdGV4dCBpbnRlZ3JhdGlvbiBwb2ludHMuXG4gICAgICBpZiAocGFyZW50Lm5hbWVzcGFjZVVSSSA9PT0gTUFUSE1MX05BTUVTUEFDRSkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIHRhZ05hbWUgPT09ICdzdmcnICYmXG4gICAgICAgICAgKHBhcmVudFRhZ05hbWUgPT09ICdhbm5vdGF0aW9uLXhtbCcgfHxcbiAgICAgICAgICAgIE1BVEhNTF9URVhUX0lOVEVHUkFUSU9OX1BPSU5UU1twYXJlbnRUYWdOYW1lXSlcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gV2Ugb25seSBhbGxvdyBlbGVtZW50cyB0aGF0IGFyZSBkZWZpbmVkIGluIFNWR1xuICAgICAgLy8gc3BlYy4gQWxsIG90aGVycyBhcmUgZGlzYWxsb3dlZCBpbiBTVkcgbmFtZXNwYWNlLlxuICAgICAgcmV0dXJuIEJvb2xlYW4oQUxMX1NWR19UQUdTW3RhZ05hbWVdKTtcbiAgICB9XG5cbiAgICBpZiAoZWxlbWVudC5uYW1lc3BhY2VVUkkgPT09IE1BVEhNTF9OQU1FU1BBQ0UpIHtcbiAgICAgIC8vIFRoZSBvbmx5IHdheSB0byBzd2l0Y2ggZnJvbSBIVE1MIG5hbWVzcGFjZSB0byBNYXRoTUxcbiAgICAgIC8vIGlzIHZpYSA8bWF0aD4uIElmIGl0IGhhcHBlbnMgdmlhIGFueSBvdGhlciB0YWcsIHRoZW5cbiAgICAgIC8vIGl0IHNob3VsZCBiZSBraWxsZWQuXG4gICAgICBpZiAocGFyZW50Lm5hbWVzcGFjZVVSSSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICAgICAgcmV0dXJuIHRhZ05hbWUgPT09ICdtYXRoJztcbiAgICAgIH1cblxuICAgICAgLy8gVGhlIG9ubHkgd2F5IHRvIHN3aXRjaCBmcm9tIFNWRyB0byBNYXRoTUwgaXMgdmlhXG4gICAgICAvLyA8bWF0aD4gYW5kIEhUTUwgaW50ZWdyYXRpb24gcG9pbnRzXG4gICAgICBpZiAocGFyZW50Lm5hbWVzcGFjZVVSSSA9PT0gU1ZHX05BTUVTUEFDRSkge1xuICAgICAgICByZXR1cm4gdGFnTmFtZSA9PT0gJ21hdGgnICYmIEhUTUxfSU5URUdSQVRJT05fUE9JTlRTW3BhcmVudFRhZ05hbWVdO1xuICAgICAgfVxuXG4gICAgICAvLyBXZSBvbmx5IGFsbG93IGVsZW1lbnRzIHRoYXQgYXJlIGRlZmluZWQgaW4gTWF0aE1MXG4gICAgICAvLyBzcGVjLiBBbGwgb3RoZXJzIGFyZSBkaXNhbGxvd2VkIGluIE1hdGhNTCBuYW1lc3BhY2UuXG4gICAgICByZXR1cm4gQm9vbGVhbihBTExfTUFUSE1MX1RBR1NbdGFnTmFtZV0pO1xuICAgIH1cblxuICAgIGlmIChlbGVtZW50Lm5hbWVzcGFjZVVSSSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICAgIC8vIFRoZSBvbmx5IHdheSB0byBzd2l0Y2ggZnJvbSBTVkcgdG8gSFRNTCBpcyB2aWFcbiAgICAgIC8vIEhUTUwgaW50ZWdyYXRpb24gcG9pbnRzLCBhbmQgZnJvbSBNYXRoTUwgdG8gSFRNTFxuICAgICAgLy8gaXMgdmlhIE1hdGhNTCB0ZXh0IGludGVncmF0aW9uIHBvaW50c1xuICAgICAgaWYgKFxuICAgICAgICBwYXJlbnQubmFtZXNwYWNlVVJJID09PSBTVkdfTkFNRVNQQUNFICYmXG4gICAgICAgICFIVE1MX0lOVEVHUkFUSU9OX1BPSU5UU1twYXJlbnRUYWdOYW1lXVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBwYXJlbnQubmFtZXNwYWNlVVJJID09PSBNQVRITUxfTkFNRVNQQUNFICYmXG4gICAgICAgICFNQVRITUxfVEVYVF9JTlRFR1JBVElPTl9QT0lOVFNbcGFyZW50VGFnTmFtZV1cbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIFdlIGRpc2FsbG93IHRhZ3MgdGhhdCBhcmUgc3BlY2lmaWMgZm9yIE1hdGhNTFxuICAgICAgLy8gb3IgU1ZHIGFuZCBzaG91bGQgbmV2ZXIgYXBwZWFyIGluIEhUTUwgbmFtZXNwYWNlXG4gICAgICByZXR1cm4gKFxuICAgICAgICAhQUxMX01BVEhNTF9UQUdTW3RhZ05hbWVdICYmXG4gICAgICAgIChDT01NT05fU1ZHX0FORF9IVE1MX0VMRU1FTlRTW3RhZ05hbWVdIHx8ICFBTExfU1ZHX1RBR1NbdGFnTmFtZV0pXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEZvciBYSFRNTCBhbmQgWE1MIGRvY3VtZW50cyB0aGF0IHN1cHBvcnQgY3VzdG9tIG5hbWVzcGFjZXNcbiAgICBpZiAoXG4gICAgICBQQVJTRVJfTUVESUFfVFlQRSA9PT0gJ2FwcGxpY2F0aW9uL3hodG1sK3htbCcgJiZcbiAgICAgIEFMTE9XRURfTkFNRVNQQUNFU1tlbGVtZW50Lm5hbWVzcGFjZVVSSV1cbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIFRoZSBjb2RlIHNob3VsZCBuZXZlciByZWFjaCB0aGlzIHBsYWNlICh0aGlzIG1lYW5zXG4gICAgLy8gdGhhdCB0aGUgZWxlbWVudCBzb21laG93IGdvdCBuYW1lc3BhY2UgdGhhdCBpcyBub3RcbiAgICAvLyBIVE1MLCBTVkcsIE1hdGhNTCBvciBhbGxvd2VkIHZpYSBBTExPV0VEX05BTUVTUEFDRVMpLlxuICAgIC8vIFJldHVybiBmYWxzZSBqdXN0IGluIGNhc2UuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBfZm9yY2VSZW1vdmVcbiAgICpcbiAgICogQHBhcmFtIG5vZGUgYSBET00gbm9kZVxuICAgKi9cbiAgY29uc3QgX2ZvcmNlUmVtb3ZlID0gZnVuY3Rpb24gKG5vZGU6IE5vZGUpOiB2b2lkIHtcbiAgICBhcnJheVB1c2goRE9NUHVyaWZ5LnJlbW92ZWQsIHsgZWxlbWVudDogbm9kZSB9KTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9wcmVmZXItZG9tLW5vZGUtcmVtb3ZlXG4gICAgICBnZXRQYXJlbnROb2RlKG5vZGUpLnJlbW92ZUNoaWxkKG5vZGUpO1xuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIHJlbW92ZShub2RlKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIF9yZW1vdmVBdHRyaWJ1dGVcbiAgICpcbiAgICogQHBhcmFtIG5hbWUgYW4gQXR0cmlidXRlIG5hbWVcbiAgICogQHBhcmFtIGVsZW1lbnQgYSBET00gbm9kZVxuICAgKi9cbiAgY29uc3QgX3JlbW92ZUF0dHJpYnV0ZSA9IGZ1bmN0aW9uIChuYW1lOiBzdHJpbmcsIGVsZW1lbnQ6IEVsZW1lbnQpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgYXJyYXlQdXNoKERPTVB1cmlmeS5yZW1vdmVkLCB7XG4gICAgICAgIGF0dHJpYnV0ZTogZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKG5hbWUpLFxuICAgICAgICBmcm9tOiBlbGVtZW50LFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgYXJyYXlQdXNoKERPTVB1cmlmeS5yZW1vdmVkLCB7XG4gICAgICAgIGF0dHJpYnV0ZTogbnVsbCxcbiAgICAgICAgZnJvbTogZWxlbWVudCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuXG4gICAgLy8gV2Ugdm9pZCBhdHRyaWJ1dGUgdmFsdWVzIGZvciB1bnJlbW92YWJsZSBcImlzXCIgYXR0cmlidXRlc1xuICAgIGlmIChuYW1lID09PSAnaXMnKSB7XG4gICAgICBpZiAoUkVUVVJOX0RPTSB8fCBSRVRVUk5fRE9NX0ZSQUdNRU5UKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgX2ZvcmNlUmVtb3ZlKGVsZW1lbnQpO1xuICAgICAgICB9IGNhdGNoIChfKSB7fVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShuYW1lLCAnJyk7XG4gICAgICAgIH0gY2F0Y2ggKF8pIHt9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBfaW5pdERvY3VtZW50XG4gICAqXG4gICAqIEBwYXJhbSBkaXJ0eSAtIGEgc3RyaW5nIG9mIGRpcnR5IG1hcmt1cFxuICAgKiBAcmV0dXJuIGEgRE9NLCBmaWxsZWQgd2l0aCB0aGUgZGlydHkgbWFya3VwXG4gICAqL1xuICBjb25zdCBfaW5pdERvY3VtZW50ID0gZnVuY3Rpb24gKGRpcnR5OiBzdHJpbmcpOiBEb2N1bWVudCB7XG4gICAgLyogQ3JlYXRlIGEgSFRNTCBkb2N1bWVudCAqL1xuICAgIGxldCBkb2MgPSBudWxsO1xuICAgIGxldCBsZWFkaW5nV2hpdGVzcGFjZSA9IG51bGw7XG5cbiAgICBpZiAoRk9SQ0VfQk9EWSkge1xuICAgICAgZGlydHkgPSAnPHJlbW92ZT48L3JlbW92ZT4nICsgZGlydHk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIElmIEZPUkNFX0JPRFkgaXNuJ3QgdXNlZCwgbGVhZGluZyB3aGl0ZXNwYWNlIG5lZWRzIHRvIGJlIHByZXNlcnZlZCBtYW51YWxseSAqL1xuICAgICAgY29uc3QgbWF0Y2hlcyA9IHN0cmluZ01hdGNoKGRpcnR5LCAvXltcXHJcXG5cXHQgXSsvKTtcbiAgICAgIGxlYWRpbmdXaGl0ZXNwYWNlID0gbWF0Y2hlcyAmJiBtYXRjaGVzWzBdO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIFBBUlNFUl9NRURJQV9UWVBFID09PSAnYXBwbGljYXRpb24veGh0bWwreG1sJyAmJlxuICAgICAgTkFNRVNQQUNFID09PSBIVE1MX05BTUVTUEFDRVxuICAgICkge1xuICAgICAgLy8gUm9vdCBvZiBYSFRNTCBkb2MgbXVzdCBjb250YWluIHhtbG5zIGRlY2xhcmF0aW9uIChzZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL3hodG1sMS9ub3JtYXRpdmUuaHRtbCNzdHJpY3QpXG4gICAgICBkaXJ0eSA9XG4gICAgICAgICc8aHRtbCB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIj48aGVhZD48L2hlYWQ+PGJvZHk+JyArXG4gICAgICAgIGRpcnR5ICtcbiAgICAgICAgJzwvYm9keT48L2h0bWw+JztcbiAgICB9XG5cbiAgICBjb25zdCBkaXJ0eVBheWxvYWQgPSB0cnVzdGVkVHlwZXNQb2xpY3lcbiAgICAgID8gdHJ1c3RlZFR5cGVzUG9saWN5LmNyZWF0ZUhUTUwoZGlydHkpXG4gICAgICA6IGRpcnR5O1xuICAgIC8qXG4gICAgICogVXNlIHRoZSBET01QYXJzZXIgQVBJIGJ5IGRlZmF1bHQsIGZhbGxiYWNrIGxhdGVyIGlmIG5lZWRzIGJlXG4gICAgICogRE9NUGFyc2VyIG5vdCB3b3JrIGZvciBzdmcgd2hlbiBoYXMgbXVsdGlwbGUgcm9vdCBlbGVtZW50LlxuICAgICAqL1xuICAgIGlmIChOQU1FU1BBQ0UgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgICB0cnkge1xuICAgICAgICBkb2MgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKGRpcnR5UGF5bG9hZCwgUEFSU0VSX01FRElBX1RZUEUpO1xuICAgICAgfSBjYXRjaCAoXykge31cbiAgICB9XG5cbiAgICAvKiBVc2UgY3JlYXRlSFRNTERvY3VtZW50IGluIGNhc2UgRE9NUGFyc2VyIGlzIG5vdCBhdmFpbGFibGUgKi9cbiAgICBpZiAoIWRvYyB8fCAhZG9jLmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgZG9jID0gaW1wbGVtZW50YXRpb24uY3JlYXRlRG9jdW1lbnQoTkFNRVNQQUNFLCAndGVtcGxhdGUnLCBudWxsKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGRvYy5kb2N1bWVudEVsZW1lbnQuaW5uZXJIVE1MID0gSVNfRU1QVFlfSU5QVVRcbiAgICAgICAgICA/IGVtcHR5SFRNTFxuICAgICAgICAgIDogZGlydHlQYXlsb2FkO1xuICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAvLyBTeW50YXggZXJyb3IgaWYgZGlydHlQYXlsb2FkIGlzIGludmFsaWQgeG1sXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYm9keSA9IGRvYy5ib2R5IHx8IGRvYy5kb2N1bWVudEVsZW1lbnQ7XG5cbiAgICBpZiAoZGlydHkgJiYgbGVhZGluZ1doaXRlc3BhY2UpIHtcbiAgICAgIGJvZHkuaW5zZXJ0QmVmb3JlKFxuICAgICAgICBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShsZWFkaW5nV2hpdGVzcGFjZSksXG4gICAgICAgIGJvZHkuY2hpbGROb2Rlc1swXSB8fCBudWxsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8qIFdvcmsgb24gd2hvbGUgZG9jdW1lbnQgb3IganVzdCBpdHMgYm9keSAqL1xuICAgIGlmIChOQU1FU1BBQ0UgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgICByZXR1cm4gZ2V0RWxlbWVudHNCeVRhZ05hbWUuY2FsbChcbiAgICAgICAgZG9jLFxuICAgICAgICBXSE9MRV9ET0NVTUVOVCA/ICdodG1sJyA6ICdib2R5J1xuICAgICAgKVswXTtcbiAgICB9XG5cbiAgICByZXR1cm4gV0hPTEVfRE9DVU1FTlQgPyBkb2MuZG9jdW1lbnRFbGVtZW50IDogYm9keTtcbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIE5vZGVJdGVyYXRvciBvYmplY3QgdGhhdCB5b3UgY2FuIHVzZSB0byB0cmF2ZXJzZSBmaWx0ZXJlZCBsaXN0cyBvZiBub2RlcyBvciBlbGVtZW50cyBpbiBhIGRvY3VtZW50LlxuICAgKlxuICAgKiBAcGFyYW0gcm9vdCBUaGUgcm9vdCBlbGVtZW50IG9yIG5vZGUgdG8gc3RhcnQgdHJhdmVyc2luZyBvbi5cbiAgICogQHJldHVybiBUaGUgY3JlYXRlZCBOb2RlSXRlcmF0b3JcbiAgICovXG4gIGNvbnN0IF9jcmVhdGVOb2RlSXRlcmF0b3IgPSBmdW5jdGlvbiAocm9vdDogTm9kZSk6IE5vZGVJdGVyYXRvciB7XG4gICAgcmV0dXJuIGNyZWF0ZU5vZGVJdGVyYXRvci5jYWxsKFxuICAgICAgcm9vdC5vd25lckRvY3VtZW50IHx8IHJvb3QsXG4gICAgICByb290LFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2VcbiAgICAgIE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5UIHxcbiAgICAgICAgTm9kZUZpbHRlci5TSE9XX0NPTU1FTlQgfFxuICAgICAgICBOb2RlRmlsdGVyLlNIT1dfVEVYVCB8XG4gICAgICAgIE5vZGVGaWx0ZXIuU0hPV19QUk9DRVNTSU5HX0lOU1RSVUNUSU9OIHxcbiAgICAgICAgTm9kZUZpbHRlci5TSE9XX0NEQVRBX1NFQ1RJT04sXG4gICAgICBudWxsXG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAgICogX2lzQ2xvYmJlcmVkXG4gICAqXG4gICAqIEBwYXJhbSBlbGVtZW50IGVsZW1lbnQgdG8gY2hlY2sgZm9yIGNsb2JiZXJpbmcgYXR0YWNrc1xuICAgKiBAcmV0dXJuIHRydWUgaWYgY2xvYmJlcmVkLCBmYWxzZSBpZiBzYWZlXG4gICAqL1xuICBjb25zdCBfaXNDbG9iYmVyZWQgPSBmdW5jdGlvbiAoZWxlbWVudDogRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBlbGVtZW50IGluc3RhbmNlb2YgSFRNTEZvcm1FbGVtZW50ICYmXG4gICAgICAodHlwZW9mIGVsZW1lbnQubm9kZU5hbWUgIT09ICdzdHJpbmcnIHx8XG4gICAgICAgIHR5cGVvZiBlbGVtZW50LnRleHRDb250ZW50ICE9PSAnc3RyaW5nJyB8fFxuICAgICAgICB0eXBlb2YgZWxlbWVudC5yZW1vdmVDaGlsZCAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICAhKGVsZW1lbnQuYXR0cmlidXRlcyBpbnN0YW5jZW9mIE5hbWVkTm9kZU1hcCkgfHxcbiAgICAgICAgdHlwZW9mIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlICE9PSAnZnVuY3Rpb24nIHx8XG4gICAgICAgIHR5cGVvZiBlbGVtZW50LnNldEF0dHJpYnV0ZSAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICB0eXBlb2YgZWxlbWVudC5uYW1lc3BhY2VVUkkgIT09ICdzdHJpbmcnIHx8XG4gICAgICAgIHR5cGVvZiBlbGVtZW50Lmluc2VydEJlZm9yZSAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICB0eXBlb2YgZWxlbWVudC5oYXNDaGlsZE5vZGVzICE9PSAnZnVuY3Rpb24nKVxuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBvYmplY3QgaXMgYSBET00gbm9kZS5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIG9iamVjdCB0byBjaGVjayB3aGV0aGVyIGl0J3MgYSBET00gbm9kZVxuICAgKiBAcmV0dXJuIHRydWUgaXMgb2JqZWN0IGlzIGEgRE9NIG5vZGVcbiAgICovXG4gIGNvbnN0IF9pc05vZGUgPSBmdW5jdGlvbiAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBOb2RlIHtcbiAgICByZXR1cm4gdHlwZW9mIE5vZGUgPT09ICdmdW5jdGlvbicgJiYgdmFsdWUgaW5zdGFuY2VvZiBOb2RlO1xuICB9O1xuXG4gIGZ1bmN0aW9uIF9leGVjdXRlSG9va3M8VCBleHRlbmRzIEhvb2tGdW5jdGlvbj4oXG4gICAgaG9va3M6IEhvb2tGdW5jdGlvbltdLFxuICAgIGN1cnJlbnROb2RlOiBQYXJhbWV0ZXJzPFQ+WzBdLFxuICAgIGRhdGE6IFBhcmFtZXRlcnM8VD5bMV1cbiAgKTogdm9pZCB7XG4gICAgYXJyYXlGb3JFYWNoKGhvb2tzLCAoaG9vazogVCkgPT4ge1xuICAgICAgaG9vay5jYWxsKERPTVB1cmlmeSwgY3VycmVudE5vZGUsIGRhdGEsIENPTkZJRyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogX3Nhbml0aXplRWxlbWVudHNcbiAgICpcbiAgICogQHByb3RlY3Qgbm9kZU5hbWVcbiAgICogQHByb3RlY3QgdGV4dENvbnRlbnRcbiAgICogQHByb3RlY3QgcmVtb3ZlQ2hpbGRcbiAgICogQHBhcmFtIGN1cnJlbnROb2RlIHRvIGNoZWNrIGZvciBwZXJtaXNzaW9uIHRvIGV4aXN0XG4gICAqIEByZXR1cm4gdHJ1ZSBpZiBub2RlIHdhcyBraWxsZWQsIGZhbHNlIGlmIGxlZnQgYWxpdmVcbiAgICovXG4gIGNvbnN0IF9zYW5pdGl6ZUVsZW1lbnRzID0gZnVuY3Rpb24gKGN1cnJlbnROb2RlOiBhbnkpOiBib29sZWFuIHtcbiAgICBsZXQgY29udGVudCA9IG51bGw7XG5cbiAgICAvKiBFeGVjdXRlIGEgaG9vayBpZiBwcmVzZW50ICovXG4gICAgX2V4ZWN1dGVIb29rcyhob29rcy5iZWZvcmVTYW5pdGl6ZUVsZW1lbnRzLCBjdXJyZW50Tm9kZSwgbnVsbCk7XG5cbiAgICAvKiBDaGVjayBpZiBlbGVtZW50IGlzIGNsb2JiZXJlZCBvciBjYW4gY2xvYmJlciAqL1xuICAgIGlmIChfaXNDbG9iYmVyZWQoY3VycmVudE5vZGUpKSB7XG4gICAgICBfZm9yY2VSZW1vdmUoY3VycmVudE5vZGUpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyogTm93IGxldCdzIGNoZWNrIHRoZSBlbGVtZW50J3MgdHlwZSBhbmQgbmFtZSAqL1xuICAgIGNvbnN0IHRhZ05hbWUgPSB0cmFuc2Zvcm1DYXNlRnVuYyhjdXJyZW50Tm9kZS5ub2RlTmFtZSk7XG5cbiAgICAvKiBFeGVjdXRlIGEgaG9vayBpZiBwcmVzZW50ICovXG4gICAgX2V4ZWN1dGVIb29rcyhob29rcy51cG9uU2FuaXRpemVFbGVtZW50LCBjdXJyZW50Tm9kZSwge1xuICAgICAgdGFnTmFtZSxcbiAgICAgIGFsbG93ZWRUYWdzOiBBTExPV0VEX1RBR1MsXG4gICAgfSk7XG5cbiAgICAvKiBEZXRlY3QgbVhTUyBhdHRlbXB0cyBhYnVzaW5nIG5hbWVzcGFjZSBjb25mdXNpb24gKi9cbiAgICBpZiAoXG4gICAgICBTQUZFX0ZPUl9YTUwgJiZcbiAgICAgIGN1cnJlbnROb2RlLmhhc0NoaWxkTm9kZXMoKSAmJlxuICAgICAgIV9pc05vZGUoY3VycmVudE5vZGUuZmlyc3RFbGVtZW50Q2hpbGQpICYmXG4gICAgICByZWdFeHBUZXN0KC88Wy9cXHchXS9nLCBjdXJyZW50Tm9kZS5pbm5lckhUTUwpICYmXG4gICAgICByZWdFeHBUZXN0KC88Wy9cXHchXS9nLCBjdXJyZW50Tm9kZS50ZXh0Q29udGVudClcbiAgICApIHtcbiAgICAgIF9mb3JjZVJlbW92ZShjdXJyZW50Tm9kZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKiBSZW1vdmUgYW55IG9jY3VycmVuY2Ugb2YgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMgKi9cbiAgICBpZiAoY3VycmVudE5vZGUubm9kZVR5cGUgPT09IE5PREVfVFlQRS5wcm9ncmVzc2luZ0luc3RydWN0aW9uKSB7XG4gICAgICBfZm9yY2VSZW1vdmUoY3VycmVudE5vZGUpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyogUmVtb3ZlIGFueSBraW5kIG9mIHBvc3NpYmx5IGhhcm1mdWwgY29tbWVudHMgKi9cbiAgICBpZiAoXG4gICAgICBTQUZFX0ZPUl9YTUwgJiZcbiAgICAgIGN1cnJlbnROb2RlLm5vZGVUeXBlID09PSBOT0RFX1RZUEUuY29tbWVudCAmJlxuICAgICAgcmVnRXhwVGVzdCgvPFsvXFx3XS9nLCBjdXJyZW50Tm9kZS5kYXRhKVxuICAgICkge1xuICAgICAgX2ZvcmNlUmVtb3ZlKGN1cnJlbnROb2RlKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qIFJlbW92ZSBlbGVtZW50IGlmIGFueXRoaW5nIGZvcmJpZHMgaXRzIHByZXNlbmNlICovXG4gICAgaWYgKFxuICAgICAgIShcbiAgICAgICAgRVhUUkFfRUxFTUVOVF9IQU5ETElORy50YWdDaGVjayBpbnN0YW5jZW9mIEZ1bmN0aW9uICYmXG4gICAgICAgIEVYVFJBX0VMRU1FTlRfSEFORExJTkcudGFnQ2hlY2sodGFnTmFtZSlcbiAgICAgICkgJiZcbiAgICAgICghQUxMT1dFRF9UQUdTW3RhZ05hbWVdIHx8IEZPUkJJRF9UQUdTW3RhZ05hbWVdKVxuICAgICkge1xuICAgICAgLyogQ2hlY2sgaWYgd2UgaGF2ZSBhIGN1c3RvbSBlbGVtZW50IHRvIGhhbmRsZSAqL1xuICAgICAgaWYgKCFGT1JCSURfVEFHU1t0YWdOYW1lXSAmJiBfaXNCYXNpY0N1c3RvbUVsZW1lbnQodGFnTmFtZSkpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVjayBpbnN0YW5jZW9mIFJlZ0V4cCAmJlxuICAgICAgICAgIHJlZ0V4cFRlc3QoQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrLCB0YWdOYW1lKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrIGluc3RhbmNlb2YgRnVuY3Rpb24gJiZcbiAgICAgICAgICBDVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2sodGFnTmFtZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8qIEtlZXAgY29udGVudCBleGNlcHQgZm9yIGJhZC1saXN0ZWQgZWxlbWVudHMgKi9cbiAgICAgIGlmIChLRUVQX0NPTlRFTlQgJiYgIUZPUkJJRF9DT05URU5UU1t0YWdOYW1lXSkge1xuICAgICAgICBjb25zdCBwYXJlbnROb2RlID0gZ2V0UGFyZW50Tm9kZShjdXJyZW50Tm9kZSkgfHwgY3VycmVudE5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgY29uc3QgY2hpbGROb2RlcyA9IGdldENoaWxkTm9kZXMoY3VycmVudE5vZGUpIHx8IGN1cnJlbnROb2RlLmNoaWxkTm9kZXM7XG5cbiAgICAgICAgaWYgKGNoaWxkTm9kZXMgJiYgcGFyZW50Tm9kZSkge1xuICAgICAgICAgIGNvbnN0IGNoaWxkQ291bnQgPSBjaGlsZE5vZGVzLmxlbmd0aDtcblxuICAgICAgICAgIGZvciAobGV0IGkgPSBjaGlsZENvdW50IC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkQ2xvbmUgPSBjbG9uZU5vZGUoY2hpbGROb2Rlc1tpXSwgdHJ1ZSk7XG4gICAgICAgICAgICBjaGlsZENsb25lLl9fcmVtb3ZhbENvdW50ID0gKGN1cnJlbnROb2RlLl9fcmVtb3ZhbENvdW50IHx8IDApICsgMTtcbiAgICAgICAgICAgIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNoaWxkQ2xvbmUsIGdldE5leHRTaWJsaW5nKGN1cnJlbnROb2RlKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIF9mb3JjZVJlbW92ZShjdXJyZW50Tm9kZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKiBDaGVjayB3aGV0aGVyIGVsZW1lbnQgaGFzIGEgdmFsaWQgbmFtZXNwYWNlICovXG4gICAgaWYgKGN1cnJlbnROb2RlIGluc3RhbmNlb2YgRWxlbWVudCAmJiAhX2NoZWNrVmFsaWROYW1lc3BhY2UoY3VycmVudE5vZGUpKSB7XG4gICAgICBfZm9yY2VSZW1vdmUoY3VycmVudE5vZGUpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyogTWFrZSBzdXJlIHRoYXQgb2xkZXIgYnJvd3NlcnMgZG9uJ3QgZ2V0IGZhbGxiYWNrLXRhZyBtWFNTICovXG4gICAgaWYgKFxuICAgICAgKHRhZ05hbWUgPT09ICdub3NjcmlwdCcgfHxcbiAgICAgICAgdGFnTmFtZSA9PT0gJ25vZW1iZWQnIHx8XG4gICAgICAgIHRhZ05hbWUgPT09ICdub2ZyYW1lcycpICYmXG4gICAgICByZWdFeHBUZXN0KC88XFwvbm8oc2NyaXB0fGVtYmVkfGZyYW1lcykvaSwgY3VycmVudE5vZGUuaW5uZXJIVE1MKVxuICAgICkge1xuICAgICAgX2ZvcmNlUmVtb3ZlKGN1cnJlbnROb2RlKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qIFNhbml0aXplIGVsZW1lbnQgY29udGVudCB0byBiZSB0ZW1wbGF0ZS1zYWZlICovXG4gICAgaWYgKFNBRkVfRk9SX1RFTVBMQVRFUyAmJiBjdXJyZW50Tm9kZS5ub2RlVHlwZSA9PT0gTk9ERV9UWVBFLnRleHQpIHtcbiAgICAgIC8qIEdldCB0aGUgZWxlbWVudCdzIHRleHQgY29udGVudCAqL1xuICAgICAgY29udGVudCA9IGN1cnJlbnROb2RlLnRleHRDb250ZW50O1xuXG4gICAgICBhcnJheUZvckVhY2goW01VU1RBQ0hFX0VYUFIsIEVSQl9FWFBSLCBUTVBMSVRfRVhQUl0sIChleHByOiBSZWdFeHApID0+IHtcbiAgICAgICAgY29udGVudCA9IHN0cmluZ1JlcGxhY2UoY29udGVudCwgZXhwciwgJyAnKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoY3VycmVudE5vZGUudGV4dENvbnRlbnQgIT09IGNvbnRlbnQpIHtcbiAgICAgICAgYXJyYXlQdXNoKERPTVB1cmlmeS5yZW1vdmVkLCB7IGVsZW1lbnQ6IGN1cnJlbnROb2RlLmNsb25lTm9kZSgpIH0pO1xuICAgICAgICBjdXJyZW50Tm9kZS50ZXh0Q29udGVudCA9IGNvbnRlbnQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogRXhlY3V0ZSBhIGhvb2sgaWYgcHJlc2VudCAqL1xuICAgIF9leGVjdXRlSG9va3MoaG9va3MuYWZ0ZXJTYW5pdGl6ZUVsZW1lbnRzLCBjdXJyZW50Tm9kZSwgbnVsbCk7XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgLyoqXG4gICAqIF9pc1ZhbGlkQXR0cmlidXRlXG4gICAqXG4gICAqIEBwYXJhbSBsY1RhZyBMb3dlcmNhc2UgdGFnIG5hbWUgb2YgY29udGFpbmluZyBlbGVtZW50LlxuICAgKiBAcGFyYW0gbGNOYW1lIExvd2VyY2FzZSBhdHRyaWJ1dGUgbmFtZS5cbiAgICogQHBhcmFtIHZhbHVlIEF0dHJpYnV0ZSB2YWx1ZS5cbiAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgYHZhbHVlYCBpcyB2YWxpZCwgb3RoZXJ3aXNlIGZhbHNlLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbiAgY29uc3QgX2lzVmFsaWRBdHRyaWJ1dGUgPSBmdW5jdGlvbiAoXG4gICAgbGNUYWc6IHN0cmluZyxcbiAgICBsY05hbWU6IHN0cmluZyxcbiAgICB2YWx1ZTogc3RyaW5nXG4gICk6IGJvb2xlYW4ge1xuICAgIC8qIEZPUkJJRF9BVFRSIG11c3QgYWx3YXlzIHdpbiwgZXZlbiBpZiBBRERfQVRUUiBwcmVkaWNhdGUgd291bGQgYWxsb3cgaXQgKi9cbiAgICBpZiAoRk9SQklEX0FUVFJbbGNOYW1lXSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qIE1ha2Ugc3VyZSBhdHRyaWJ1dGUgY2Fubm90IGNsb2JiZXIgKi9cbiAgICBpZiAoXG4gICAgICBTQU5JVElaRV9ET00gJiZcbiAgICAgIChsY05hbWUgPT09ICdpZCcgfHwgbGNOYW1lID09PSAnbmFtZScpICYmXG4gICAgICAodmFsdWUgaW4gZG9jdW1lbnQgfHwgdmFsdWUgaW4gZm9ybUVsZW1lbnQpXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyogQWxsb3cgdmFsaWQgZGF0YS0qIGF0dHJpYnV0ZXM6IEF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIgYWZ0ZXIgXCItXCJcbiAgICAgICAgKGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2RvbS5odG1sI2VtYmVkZGluZy1jdXN0b20tbm9uLXZpc2libGUtZGF0YS13aXRoLXRoZS1kYXRhLSotYXR0cmlidXRlcylcbiAgICAgICAgWE1MLWNvbXBhdGlibGUgKGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2luZnJhc3RydWN0dXJlLmh0bWwjeG1sLWNvbXBhdGlibGUgYW5kIGh0dHA6Ly93d3cudzMub3JnL1RSL3htbC8jZDBlODA0KVxuICAgICAgICBXZSBkb24ndCBuZWVkIHRvIGNoZWNrIHRoZSB2YWx1ZTsgaXQncyBhbHdheXMgVVJJIHNhZmUuICovXG4gICAgaWYgKFxuICAgICAgQUxMT1dfREFUQV9BVFRSICYmXG4gICAgICAhRk9SQklEX0FUVFJbbGNOYW1lXSAmJlxuICAgICAgcmVnRXhwVGVzdChEQVRBX0FUVFIsIGxjTmFtZSlcbiAgICApIHtcbiAgICAgIC8vIFRoaXMgYXR0cmlidXRlIGlzIHNhZmVcbiAgICB9IGVsc2UgaWYgKEFMTE9XX0FSSUFfQVRUUiAmJiByZWdFeHBUZXN0KEFSSUFfQVRUUiwgbGNOYW1lKSkge1xuICAgICAgLy8gVGhpcyBhdHRyaWJ1dGUgaXMgc2FmZVxuICAgICAgLyogQ2hlY2sgaWYgQUREX0FUVFIgZnVuY3Rpb24gYWxsb3dzIHRoaXMgYXR0cmlidXRlICovXG4gICAgfSBlbHNlIGlmIChcbiAgICAgIEVYVFJBX0VMRU1FTlRfSEFORExJTkcuYXR0cmlidXRlQ2hlY2sgaW5zdGFuY2VvZiBGdW5jdGlvbiAmJlxuICAgICAgRVhUUkFfRUxFTUVOVF9IQU5ETElORy5hdHRyaWJ1dGVDaGVjayhsY05hbWUsIGxjVGFnKVxuICAgICkge1xuICAgICAgLy8gVGhpcyBhdHRyaWJ1dGUgaXMgc2FmZVxuICAgICAgLyogT3RoZXJ3aXNlLCBjaGVjayB0aGUgbmFtZSBpcyBwZXJtaXR0ZWQgKi9cbiAgICB9IGVsc2UgaWYgKCFBTExPV0VEX0FUVFJbbGNOYW1lXSB8fCBGT1JCSURfQVRUUltsY05hbWVdKSB7XG4gICAgICBpZiAoXG4gICAgICAgIC8vIEZpcnN0IGNvbmRpdGlvbiBkb2VzIGEgdmVyeSBiYXNpYyBjaGVjayBpZiBhKSBpdCdzIGJhc2ljYWxseSBhIHZhbGlkIGN1c3RvbSBlbGVtZW50IHRhZ25hbWUgQU5EXG4gICAgICAgIC8vIGIpIGlmIHRoZSB0YWdOYW1lIHBhc3NlcyB3aGF0ZXZlciB0aGUgdXNlciBoYXMgY29uZmlndXJlZCBmb3IgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrXG4gICAgICAgIC8vIGFuZCBjKSBpZiB0aGUgYXR0cmlidXRlIG5hbWUgcGFzc2VzIHdoYXRldmVyIHRoZSB1c2VyIGhhcyBjb25maWd1cmVkIGZvciBDVVNUT01fRUxFTUVOVF9IQU5ETElORy5hdHRyaWJ1dGVOYW1lQ2hlY2tcbiAgICAgICAgKF9pc0Jhc2ljQ3VzdG9tRWxlbWVudChsY1RhZykgJiZcbiAgICAgICAgICAoKENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVjayBpbnN0YW5jZW9mIFJlZ0V4cCAmJlxuICAgICAgICAgICAgcmVnRXhwVGVzdChDVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2ssIGxjVGFnKSkgfHxcbiAgICAgICAgICAgIChDVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2sgaW5zdGFuY2VvZiBGdW5jdGlvbiAmJlxuICAgICAgICAgICAgICBDVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2sobGNUYWcpKSkgJiZcbiAgICAgICAgICAoKENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLmF0dHJpYnV0ZU5hbWVDaGVjayBpbnN0YW5jZW9mIFJlZ0V4cCAmJlxuICAgICAgICAgICAgcmVnRXhwVGVzdChDVVNUT01fRUxFTUVOVF9IQU5ETElORy5hdHRyaWJ1dGVOYW1lQ2hlY2ssIGxjTmFtZSkpIHx8XG4gICAgICAgICAgICAoQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcuYXR0cmlidXRlTmFtZUNoZWNrIGluc3RhbmNlb2YgRnVuY3Rpb24gJiZcbiAgICAgICAgICAgICAgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcuYXR0cmlidXRlTmFtZUNoZWNrKGxjTmFtZSwgbGNUYWcpKSkpIHx8XG4gICAgICAgIC8vIEFsdGVybmF0aXZlLCBzZWNvbmQgY29uZGl0aW9uIGNoZWNrcyBpZiBpdCdzIGFuIGBpc2AtYXR0cmlidXRlLCBBTkRcbiAgICAgICAgLy8gdGhlIHZhbHVlIHBhc3NlcyB3aGF0ZXZlciB0aGUgdXNlciBoYXMgY29uZmlndXJlZCBmb3IgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrXG4gICAgICAgIChsY05hbWUgPT09ICdpcycgJiZcbiAgICAgICAgICBDVVNUT01fRUxFTUVOVF9IQU5ETElORy5hbGxvd0N1c3RvbWl6ZWRCdWlsdEluRWxlbWVudHMgJiZcbiAgICAgICAgICAoKENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVjayBpbnN0YW5jZW9mIFJlZ0V4cCAmJlxuICAgICAgICAgICAgcmVnRXhwVGVzdChDVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2ssIHZhbHVlKSkgfHxcbiAgICAgICAgICAgIChDVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2sgaW5zdGFuY2VvZiBGdW5jdGlvbiAmJlxuICAgICAgICAgICAgICBDVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2sodmFsdWUpKSkpXG4gICAgICApIHtcbiAgICAgICAgLy8gSWYgdXNlciBoYXMgc3VwcGxpZWQgYSByZWdleHAgb3IgZnVuY3Rpb24gaW4gQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrLCB3ZSBuZWVkIHRvIGFsc28gYWxsb3cgZGVyaXZlZCBjdXN0b20gZWxlbWVudHMgdXNpbmcgdGhlIHNhbWUgdGFnTmFtZSB0ZXN0LlxuICAgICAgICAvLyBBZGRpdGlvbmFsbHksIHdlIG5lZWQgdG8gYWxsb3cgYXR0cmlidXRlcyBwYXNzaW5nIHRoZSBDVVNUT01fRUxFTUVOVF9IQU5ETElORy5hdHRyaWJ1dGVOYW1lQ2hlY2sgdXNlciBoYXMgY29uZmlndXJlZCwgYXMgY3VzdG9tIGVsZW1lbnRzIGNhbiBkZWZpbmUgdGhlc2UgYXQgdGhlaXIgb3duIGRpc2NyZXRpb24uXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICAvKiBDaGVjayB2YWx1ZSBpcyBzYWZlLiBGaXJzdCwgaXMgYXR0ciBpbmVydD8gSWYgc28sIGlzIHNhZmUgKi9cbiAgICB9IGVsc2UgaWYgKFVSSV9TQUZFX0FUVFJJQlVURVNbbGNOYW1lXSkge1xuICAgICAgLy8gVGhpcyBhdHRyaWJ1dGUgaXMgc2FmZVxuICAgICAgLyogQ2hlY2sgbm8gc2NyaXB0LCBkYXRhIG9yIHVua25vd24gcG9zc2libHkgdW5zYWZlIFVSSVxuICAgICAgICB1bmxlc3Mgd2Uga25vdyBVUkkgdmFsdWVzIGFyZSBzYWZlIGZvciB0aGF0IGF0dHJpYnV0ZSAqL1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICByZWdFeHBUZXN0KElTX0FMTE9XRURfVVJJLCBzdHJpbmdSZXBsYWNlKHZhbHVlLCBBVFRSX1dISVRFU1BBQ0UsICcnKSlcbiAgICApIHtcbiAgICAgIC8vIFRoaXMgYXR0cmlidXRlIGlzIHNhZmVcbiAgICAgIC8qIEtlZXAgaW1hZ2UgZGF0YSBVUklzIGFsaXZlIGlmIHNyYy94bGluazpocmVmIGlzIGFsbG93ZWQgKi9cbiAgICAgIC8qIEZ1cnRoZXIgcHJldmVudCBnYWRnZXQgWFNTIGZvciBkeW5hbWljYWxseSBidWlsdCBzY3JpcHQgdGFncyAqL1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAobGNOYW1lID09PSAnc3JjJyB8fCBsY05hbWUgPT09ICd4bGluazpocmVmJyB8fCBsY05hbWUgPT09ICdocmVmJykgJiZcbiAgICAgIGxjVGFnICE9PSAnc2NyaXB0JyAmJlxuICAgICAgc3RyaW5nSW5kZXhPZih2YWx1ZSwgJ2RhdGE6JykgPT09IDAgJiZcbiAgICAgIERBVEFfVVJJX1RBR1NbbGNUYWddXG4gICAgKSB7XG4gICAgICAvLyBUaGlzIGF0dHJpYnV0ZSBpcyBzYWZlXG4gICAgICAvKiBBbGxvdyB1bmtub3duIHByb3RvY29sczogVGhpcyBwcm92aWRlcyBzdXBwb3J0IGZvciBsaW5rcyB0aGF0XG4gICAgICAgIGFyZSBoYW5kbGVkIGJ5IHByb3RvY29sIGhhbmRsZXJzIHdoaWNoIG1heSBiZSB1bmtub3duIGFoZWFkIG9mXG4gICAgICAgIHRpbWUsIGUuZy4gZmI6LCBzcG90aWZ5OiAqL1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBBTExPV19VTktOT1dOX1BST1RPQ09MUyAmJlxuICAgICAgIXJlZ0V4cFRlc3QoSVNfU0NSSVBUX09SX0RBVEEsIHN0cmluZ1JlcGxhY2UodmFsdWUsIEFUVFJfV0hJVEVTUEFDRSwgJycpKVxuICAgICkge1xuICAgICAgLy8gVGhpcyBhdHRyaWJ1dGUgaXMgc2FmZVxuICAgICAgLyogQ2hlY2sgZm9yIGJpbmFyeSBhdHRyaWJ1dGVzICovXG4gICAgfSBlbHNlIGlmICh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBCaW5hcnkgYXR0cmlidXRlcyBhcmUgc2FmZSBhdCB0aGlzIHBvaW50XG4gICAgICAvKiBBbnl0aGluZyBlbHNlLCBwcmVzdW1lIHVuc2FmZSwgZG8gbm90IGFkZCBpdCBiYWNrICovXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgLyoqXG4gICAqIF9pc0Jhc2ljQ3VzdG9tRWxlbWVudFxuICAgKiBjaGVja3MgaWYgYXQgbGVhc3Qgb25lIGRhc2ggaXMgaW5jbHVkZWQgaW4gdGFnTmFtZSwgYW5kIGl0J3Mgbm90IHRoZSBmaXJzdCBjaGFyXG4gICAqIGZvciBtb3JlIHNvcGhpc3RpY2F0ZWQgY2hlY2tpbmcgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMvdmFsaWRhdGUtZWxlbWVudC1uYW1lXG4gICAqXG4gICAqIEBwYXJhbSB0YWdOYW1lIG5hbWUgb2YgdGhlIHRhZyBvZiB0aGUgbm9kZSB0byBzYW5pdGl6ZVxuICAgKiBAcmV0dXJucyBSZXR1cm5zIHRydWUgaWYgdGhlIHRhZyBuYW1lIG1lZXRzIHRoZSBiYXNpYyBjcml0ZXJpYSBmb3IgYSBjdXN0b20gZWxlbWVudCwgb3RoZXJ3aXNlIGZhbHNlLlxuICAgKi9cbiAgY29uc3QgX2lzQmFzaWNDdXN0b21FbGVtZW50ID0gZnVuY3Rpb24gKHRhZ05hbWU6IHN0cmluZyk6IFJlZ0V4cE1hdGNoQXJyYXkge1xuICAgIHJldHVybiB0YWdOYW1lICE9PSAnYW5ub3RhdGlvbi14bWwnICYmIHN0cmluZ01hdGNoKHRhZ05hbWUsIENVU1RPTV9FTEVNRU5UKTtcbiAgfTtcblxuICAvKipcbiAgICogX3Nhbml0aXplQXR0cmlidXRlc1xuICAgKlxuICAgKiBAcHJvdGVjdCBhdHRyaWJ1dGVzXG4gICAqIEBwcm90ZWN0IG5vZGVOYW1lXG4gICAqIEBwcm90ZWN0IHJlbW92ZUF0dHJpYnV0ZVxuICAgKiBAcHJvdGVjdCBzZXRBdHRyaWJ1dGVcbiAgICpcbiAgICogQHBhcmFtIGN1cnJlbnROb2RlIHRvIHNhbml0aXplXG4gICAqL1xuICBjb25zdCBfc2FuaXRpemVBdHRyaWJ1dGVzID0gZnVuY3Rpb24gKGN1cnJlbnROb2RlOiBFbGVtZW50KTogdm9pZCB7XG4gICAgLyogRXhlY3V0ZSBhIGhvb2sgaWYgcHJlc2VudCAqL1xuICAgIF9leGVjdXRlSG9va3MoaG9va3MuYmVmb3JlU2FuaXRpemVBdHRyaWJ1dGVzLCBjdXJyZW50Tm9kZSwgbnVsbCk7XG5cbiAgICBjb25zdCB7IGF0dHJpYnV0ZXMgfSA9IGN1cnJlbnROb2RlO1xuXG4gICAgLyogQ2hlY2sgaWYgd2UgaGF2ZSBhdHRyaWJ1dGVzOyBpZiBub3Qgd2UgbWlnaHQgaGF2ZSBhIHRleHQgbm9kZSAqL1xuICAgIGlmICghYXR0cmlidXRlcyB8fCBfaXNDbG9iYmVyZWQoY3VycmVudE5vZGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaG9va0V2ZW50ID0ge1xuICAgICAgYXR0ck5hbWU6ICcnLFxuICAgICAgYXR0clZhbHVlOiAnJyxcbiAgICAgIGtlZXBBdHRyOiB0cnVlLFxuICAgICAgYWxsb3dlZEF0dHJpYnV0ZXM6IEFMTE9XRURfQVRUUixcbiAgICAgIGZvcmNlS2VlcEF0dHI6IHVuZGVmaW5lZCxcbiAgICB9O1xuICAgIGxldCBsID0gYXR0cmlidXRlcy5sZW5ndGg7XG5cbiAgICAvKiBHbyBiYWNrd2FyZHMgb3ZlciBhbGwgYXR0cmlidXRlczsgc2FmZWx5IHJlbW92ZSBiYWQgb25lcyAqL1xuICAgIHdoaWxlIChsLS0pIHtcbiAgICAgIGNvbnN0IGF0dHIgPSBhdHRyaWJ1dGVzW2xdO1xuICAgICAgY29uc3QgeyBuYW1lLCBuYW1lc3BhY2VVUkksIHZhbHVlOiBhdHRyVmFsdWUgfSA9IGF0dHI7XG4gICAgICBjb25zdCBsY05hbWUgPSB0cmFuc2Zvcm1DYXNlRnVuYyhuYW1lKTtcblxuICAgICAgY29uc3QgaW5pdFZhbHVlID0gYXR0clZhbHVlO1xuICAgICAgbGV0IHZhbHVlID0gbmFtZSA9PT0gJ3ZhbHVlJyA/IGluaXRWYWx1ZSA6IHN0cmluZ1RyaW0oaW5pdFZhbHVlKTtcblxuICAgICAgLyogRXhlY3V0ZSBhIGhvb2sgaWYgcHJlc2VudCAqL1xuICAgICAgaG9va0V2ZW50LmF0dHJOYW1lID0gbGNOYW1lO1xuICAgICAgaG9va0V2ZW50LmF0dHJWYWx1ZSA9IHZhbHVlO1xuICAgICAgaG9va0V2ZW50LmtlZXBBdHRyID0gdHJ1ZTtcbiAgICAgIGhvb2tFdmVudC5mb3JjZUtlZXBBdHRyID0gdW5kZWZpbmVkOyAvLyBBbGxvd3MgZGV2ZWxvcGVycyB0byBzZWUgdGhpcyBpcyBhIHByb3BlcnR5IHRoZXkgY2FuIHNldFxuICAgICAgX2V4ZWN1dGVIb29rcyhob29rcy51cG9uU2FuaXRpemVBdHRyaWJ1dGUsIGN1cnJlbnROb2RlLCBob29rRXZlbnQpO1xuICAgICAgdmFsdWUgPSBob29rRXZlbnQuYXR0clZhbHVlO1xuXG4gICAgICAvKiBGdWxsIERPTSBDbG9iYmVyaW5nIHByb3RlY3Rpb24gdmlhIG5hbWVzcGFjZSBpc29sYXRpb24sXG4gICAgICAgKiBQcmVmaXggaWQgYW5kIG5hbWUgYXR0cmlidXRlcyB3aXRoIGB1c2VyLWNvbnRlbnQtYFxuICAgICAgICovXG4gICAgICBpZiAoU0FOSVRJWkVfTkFNRURfUFJPUFMgJiYgKGxjTmFtZSA9PT0gJ2lkJyB8fCBsY05hbWUgPT09ICduYW1lJykpIHtcbiAgICAgICAgLy8gUmVtb3ZlIHRoZSBhdHRyaWJ1dGUgd2l0aCB0aGlzIHZhbHVlXG4gICAgICAgIF9yZW1vdmVBdHRyaWJ1dGUobmFtZSwgY3VycmVudE5vZGUpO1xuXG4gICAgICAgIC8vIFByZWZpeCB0aGUgdmFsdWUgYW5kIGxhdGVyIHJlLWNyZWF0ZSB0aGUgYXR0cmlidXRlIHdpdGggdGhlIHNhbml0aXplZCB2YWx1ZVxuICAgICAgICB2YWx1ZSA9IFNBTklUSVpFX05BTUVEX1BST1BTX1BSRUZJWCArIHZhbHVlO1xuICAgICAgfVxuXG4gICAgICAvKiBXb3JrIGFyb3VuZCBhIHNlY3VyaXR5IGlzc3VlIHdpdGggY29tbWVudHMgaW5zaWRlIGF0dHJpYnV0ZXMgKi9cbiAgICAgIGlmIChcbiAgICAgICAgU0FGRV9GT1JfWE1MICYmXG4gICAgICAgIHJlZ0V4cFRlc3QoXG4gICAgICAgICAgLygoLS0hP3xdKT4pfDxcXC8oc3R5bGV8c2NyaXB0fHRpdGxlfHhtcHx0ZXh0YXJlYXxub3NjcmlwdHxpZnJhbWV8bm9lbWJlZHxub2ZyYW1lcykvaSxcbiAgICAgICAgICB2YWx1ZVxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgX3JlbW92ZUF0dHJpYnV0ZShuYW1lLCBjdXJyZW50Tm9kZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvKiBNYWtlIHN1cmUgd2UgY2Fubm90IGVhc2lseSB1c2UgYW5pbWF0ZWQgaHJlZnMsIGV2ZW4gaWYgYW5pbWF0aW9ucyBhcmUgYWxsb3dlZCAqL1xuICAgICAgaWYgKGxjTmFtZSA9PT0gJ2F0dHJpYnV0ZW5hbWUnICYmIHN0cmluZ01hdGNoKHZhbHVlLCAnaHJlZicpKSB7XG4gICAgICAgIF9yZW1vdmVBdHRyaWJ1dGUobmFtZSwgY3VycmVudE5vZGUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLyogRGlkIHRoZSBob29rcyBhcHByb3ZlIG9mIHRoZSBhdHRyaWJ1dGU/ICovXG4gICAgICBpZiAoaG9va0V2ZW50LmZvcmNlS2VlcEF0dHIpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8qIERpZCB0aGUgaG9va3MgYXBwcm92ZSBvZiB0aGUgYXR0cmlidXRlPyAqL1xuICAgICAgaWYgKCFob29rRXZlbnQua2VlcEF0dHIpIHtcbiAgICAgICAgX3JlbW92ZUF0dHJpYnV0ZShuYW1lLCBjdXJyZW50Tm9kZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvKiBXb3JrIGFyb3VuZCBhIHNlY3VyaXR5IGlzc3VlIGluIGpRdWVyeSAzLjAgKi9cbiAgICAgIGlmICghQUxMT1dfU0VMRl9DTE9TRV9JTl9BVFRSICYmIHJlZ0V4cFRlc3QoL1xcLz4vaSwgdmFsdWUpKSB7XG4gICAgICAgIF9yZW1vdmVBdHRyaWJ1dGUobmFtZSwgY3VycmVudE5vZGUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLyogU2FuaXRpemUgYXR0cmlidXRlIGNvbnRlbnQgdG8gYmUgdGVtcGxhdGUtc2FmZSAqL1xuICAgICAgaWYgKFNBRkVfRk9SX1RFTVBMQVRFUykge1xuICAgICAgICBhcnJheUZvckVhY2goW01VU1RBQ0hFX0VYUFIsIEVSQl9FWFBSLCBUTVBMSVRfRVhQUl0sIChleHByOiBSZWdFeHApID0+IHtcbiAgICAgICAgICB2YWx1ZSA9IHN0cmluZ1JlcGxhY2UodmFsdWUsIGV4cHIsICcgJyk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvKiBJcyBgdmFsdWVgIHZhbGlkIGZvciB0aGlzIGF0dHJpYnV0ZT8gKi9cbiAgICAgIGNvbnN0IGxjVGFnID0gdHJhbnNmb3JtQ2FzZUZ1bmMoY3VycmVudE5vZGUubm9kZU5hbWUpO1xuICAgICAgaWYgKCFfaXNWYWxpZEF0dHJpYnV0ZShsY1RhZywgbGNOYW1lLCB2YWx1ZSkpIHtcbiAgICAgICAgX3JlbW92ZUF0dHJpYnV0ZShuYW1lLCBjdXJyZW50Tm9kZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvKiBIYW5kbGUgYXR0cmlidXRlcyB0aGF0IHJlcXVpcmUgVHJ1c3RlZCBUeXBlcyAqL1xuICAgICAgaWYgKFxuICAgICAgICB0cnVzdGVkVHlwZXNQb2xpY3kgJiZcbiAgICAgICAgdHlwZW9mIHRydXN0ZWRUeXBlcyA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgdHlwZW9mIHRydXN0ZWRUeXBlcy5nZXRBdHRyaWJ1dGVUeXBlID09PSAnZnVuY3Rpb24nXG4gICAgICApIHtcbiAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSkge1xuICAgICAgICAgIC8qIE5hbWVzcGFjZXMgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkLCBzZWUgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MTMwNTI5MyAqL1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN3aXRjaCAodHJ1c3RlZFR5cGVzLmdldEF0dHJpYnV0ZVR5cGUobGNUYWcsIGxjTmFtZSkpIHtcbiAgICAgICAgICAgIGNhc2UgJ1RydXN0ZWRIVE1MJzoge1xuICAgICAgICAgICAgICB2YWx1ZSA9IHRydXN0ZWRUeXBlc1BvbGljeS5jcmVhdGVIVE1MKHZhbHVlKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgJ1RydXN0ZWRTY3JpcHRVUkwnOiB7XG4gICAgICAgICAgICAgIHZhbHVlID0gdHJ1c3RlZFR5cGVzUG9saWN5LmNyZWF0ZVNjcmlwdFVSTCh2YWx1ZSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvKiBIYW5kbGUgaW52YWxpZCBkYXRhLSogYXR0cmlidXRlIHNldCBieSB0cnktY2F0Y2hpbmcgaXQgKi9cbiAgICAgIGlmICh2YWx1ZSAhPT0gaW5pdFZhbHVlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSkge1xuICAgICAgICAgICAgY3VycmVudE5vZGUuc2V0QXR0cmlidXRlTlMobmFtZXNwYWNlVVJJLCBuYW1lLCB2YWx1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8qIEZhbGxiYWNrIHRvIHNldEF0dHJpYnV0ZSgpIGZvciBicm93c2VyLXVucmVjb2duaXplZCBuYW1lc3BhY2VzIGUuZy4gXCJ4LXNjaGVtYVwiLiAqL1xuICAgICAgICAgICAgY3VycmVudE5vZGUuc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoX2lzQ2xvYmJlcmVkKGN1cnJlbnROb2RlKSkge1xuICAgICAgICAgICAgX2ZvcmNlUmVtb3ZlKGN1cnJlbnROb2RlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXJyYXlQb3AoRE9NUHVyaWZ5LnJlbW92ZWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAgIF9yZW1vdmVBdHRyaWJ1dGUobmFtZSwgY3VycmVudE5vZGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogRXhlY3V0ZSBhIGhvb2sgaWYgcHJlc2VudCAqL1xuICAgIF9leGVjdXRlSG9va3MoaG9va3MuYWZ0ZXJTYW5pdGl6ZUF0dHJpYnV0ZXMsIGN1cnJlbnROb2RlLCBudWxsKTtcbiAgfTtcblxuICAvKipcbiAgICogX3Nhbml0aXplU2hhZG93RE9NXG4gICAqXG4gICAqIEBwYXJhbSBmcmFnbWVudCB0byBpdGVyYXRlIG92ZXIgcmVjdXJzaXZlbHlcbiAgICovXG4gIGNvbnN0IF9zYW5pdGl6ZVNoYWRvd0RPTSA9IGZ1bmN0aW9uIChmcmFnbWVudDogRG9jdW1lbnRGcmFnbWVudCk6IHZvaWQge1xuICAgIGxldCBzaGFkb3dOb2RlID0gbnVsbDtcbiAgICBjb25zdCBzaGFkb3dJdGVyYXRvciA9IF9jcmVhdGVOb2RlSXRlcmF0b3IoZnJhZ21lbnQpO1xuXG4gICAgLyogRXhlY3V0ZSBhIGhvb2sgaWYgcHJlc2VudCAqL1xuICAgIF9leGVjdXRlSG9va3MoaG9va3MuYmVmb3JlU2FuaXRpemVTaGFkb3dET00sIGZyYWdtZW50LCBudWxsKTtcblxuICAgIHdoaWxlICgoc2hhZG93Tm9kZSA9IHNoYWRvd0l0ZXJhdG9yLm5leHROb2RlKCkpKSB7XG4gICAgICAvKiBFeGVjdXRlIGEgaG9vayBpZiBwcmVzZW50ICovXG4gICAgICBfZXhlY3V0ZUhvb2tzKGhvb2tzLnVwb25TYW5pdGl6ZVNoYWRvd05vZGUsIHNoYWRvd05vZGUsIG51bGwpO1xuXG4gICAgICAvKiBTYW5pdGl6ZSB0YWdzIGFuZCBlbGVtZW50cyAqL1xuICAgICAgX3Nhbml0aXplRWxlbWVudHMoc2hhZG93Tm9kZSk7XG5cbiAgICAgIC8qIENoZWNrIGF0dHJpYnV0ZXMgbmV4dCAqL1xuICAgICAgX3Nhbml0aXplQXR0cmlidXRlcyhzaGFkb3dOb2RlKTtcblxuICAgICAgLyogRGVlcCBzaGFkb3cgRE9NIGRldGVjdGVkICovXG4gICAgICBpZiAoc2hhZG93Tm9kZS5jb250ZW50IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCkge1xuICAgICAgICBfc2FuaXRpemVTaGFkb3dET00oc2hhZG93Tm9kZS5jb250ZW50KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBFeGVjdXRlIGEgaG9vayBpZiBwcmVzZW50ICovXG4gICAgX2V4ZWN1dGVIb29rcyhob29rcy5hZnRlclNhbml0aXplU2hhZG93RE9NLCBmcmFnbWVudCwgbnVsbCk7XG4gIH07XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbiAgRE9NUHVyaWZ5LnNhbml0aXplID0gZnVuY3Rpb24gKGRpcnR5LCBjZmcgPSB7fSkge1xuICAgIGxldCBib2R5ID0gbnVsbDtcbiAgICBsZXQgaW1wb3J0ZWROb2RlID0gbnVsbDtcbiAgICBsZXQgY3VycmVudE5vZGUgPSBudWxsO1xuICAgIGxldCByZXR1cm5Ob2RlID0gbnVsbDtcbiAgICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhIHN0cmluZyB0byBzYW5pdGl6ZS5cbiAgICAgIERPIE5PVCByZXR1cm4gZWFybHksIGFzIHRoaXMgd2lsbCByZXR1cm4gdGhlIHdyb25nIHR5cGUgaWZcbiAgICAgIHRoZSB1c2VyIGhhcyByZXF1ZXN0ZWQgYSBET00gb2JqZWN0IHJhdGhlciB0aGFuIGEgc3RyaW5nICovXG4gICAgSVNfRU1QVFlfSU5QVVQgPSAhZGlydHk7XG4gICAgaWYgKElTX0VNUFRZX0lOUFVUKSB7XG4gICAgICBkaXJ0eSA9ICc8IS0tPic7XG4gICAgfVxuXG4gICAgLyogU3RyaW5naWZ5LCBpbiBjYXNlIGRpcnR5IGlzIGFuIG9iamVjdCAqL1xuICAgIGlmICh0eXBlb2YgZGlydHkgIT09ICdzdHJpbmcnICYmICFfaXNOb2RlKGRpcnR5KSkge1xuICAgICAgaWYgKHR5cGVvZiBkaXJ0eS50b1N0cmluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBkaXJ0eSA9IGRpcnR5LnRvU3RyaW5nKCk7XG4gICAgICAgIGlmICh0eXBlb2YgZGlydHkgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgdHlwZUVycm9yQ3JlYXRlKCdkaXJ0eSBpcyBub3QgYSBzdHJpbmcsIGFib3J0aW5nJyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IHR5cGVFcnJvckNyZWF0ZSgndG9TdHJpbmcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBSZXR1cm4gZGlydHkgSFRNTCBpZiBET01QdXJpZnkgY2Fubm90IHJ1biAqL1xuICAgIGlmICghRE9NUHVyaWZ5LmlzU3VwcG9ydGVkKSB7XG4gICAgICByZXR1cm4gZGlydHk7XG4gICAgfVxuXG4gICAgLyogQXNzaWduIGNvbmZpZyB2YXJzICovXG4gICAgaWYgKCFTRVRfQ09ORklHKSB7XG4gICAgICBfcGFyc2VDb25maWcoY2ZnKTtcbiAgICB9XG5cbiAgICAvKiBDbGVhbiB1cCByZW1vdmVkIGVsZW1lbnRzICovXG4gICAgRE9NUHVyaWZ5LnJlbW92ZWQgPSBbXTtcblxuICAgIC8qIENoZWNrIGlmIGRpcnR5IGlzIGNvcnJlY3RseSB0eXBlZCBmb3IgSU5fUExBQ0UgKi9cbiAgICBpZiAodHlwZW9mIGRpcnR5ID09PSAnc3RyaW5nJykge1xuICAgICAgSU5fUExBQ0UgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoSU5fUExBQ0UpIHtcbiAgICAgIC8qIERvIHNvbWUgZWFybHkgcHJlLXNhbml0aXphdGlvbiB0byBhdm9pZCB1bnNhZmUgcm9vdCBub2RlcyAqL1xuICAgICAgaWYgKChkaXJ0eSBhcyBOb2RlKS5ub2RlTmFtZSkge1xuICAgICAgICBjb25zdCB0YWdOYW1lID0gdHJhbnNmb3JtQ2FzZUZ1bmMoKGRpcnR5IGFzIE5vZGUpLm5vZGVOYW1lKTtcbiAgICAgICAgaWYgKCFBTExPV0VEX1RBR1NbdGFnTmFtZV0gfHwgRk9SQklEX1RBR1NbdGFnTmFtZV0pIHtcbiAgICAgICAgICB0aHJvdyB0eXBlRXJyb3JDcmVhdGUoXG4gICAgICAgICAgICAncm9vdCBub2RlIGlzIGZvcmJpZGRlbiBhbmQgY2Fubm90IGJlIHNhbml0aXplZCBpbi1wbGFjZSdcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChkaXJ0eSBpbnN0YW5jZW9mIE5vZGUpIHtcbiAgICAgIC8qIElmIGRpcnR5IGlzIGEgRE9NIGVsZW1lbnQsIGFwcGVuZCB0byBhbiBlbXB0eSBkb2N1bWVudCB0byBhdm9pZFxuICAgICAgICAgZWxlbWVudHMgYmVpbmcgc3RyaXBwZWQgYnkgdGhlIHBhcnNlciAqL1xuICAgICAgYm9keSA9IF9pbml0RG9jdW1lbnQoJzwhLS0tLT4nKTtcbiAgICAgIGltcG9ydGVkTm9kZSA9IGJvZHkub3duZXJEb2N1bWVudC5pbXBvcnROb2RlKGRpcnR5LCB0cnVlKTtcbiAgICAgIGlmIChcbiAgICAgICAgaW1wb3J0ZWROb2RlLm5vZGVUeXBlID09PSBOT0RFX1RZUEUuZWxlbWVudCAmJlxuICAgICAgICBpbXBvcnRlZE5vZGUubm9kZU5hbWUgPT09ICdCT0RZJ1xuICAgICAgKSB7XG4gICAgICAgIC8qIE5vZGUgaXMgYWxyZWFkeSBhIGJvZHksIHVzZSBhcyBpcyAqL1xuICAgICAgICBib2R5ID0gaW1wb3J0ZWROb2RlO1xuICAgICAgfSBlbHNlIGlmIChpbXBvcnRlZE5vZGUubm9kZU5hbWUgPT09ICdIVE1MJykge1xuICAgICAgICBib2R5ID0gaW1wb3J0ZWROb2RlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vcHJlZmVyLWRvbS1ub2RlLWFwcGVuZFxuICAgICAgICBib2R5LmFwcGVuZENoaWxkKGltcG9ydGVkTm9kZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIEV4aXQgZGlyZWN0bHkgaWYgd2UgaGF2ZSBub3RoaW5nIHRvIGRvICovXG4gICAgICBpZiAoXG4gICAgICAgICFSRVRVUk5fRE9NICYmXG4gICAgICAgICFTQUZFX0ZPUl9URU1QTEFURVMgJiZcbiAgICAgICAgIVdIT0xFX0RPQ1VNRU5UICYmXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL3ByZWZlci1pbmNsdWRlc1xuICAgICAgICBkaXJ0eS5pbmRleE9mKCc8JykgPT09IC0xXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRydXN0ZWRUeXBlc1BvbGljeSAmJiBSRVRVUk5fVFJVU1RFRF9UWVBFXG4gICAgICAgICAgPyB0cnVzdGVkVHlwZXNQb2xpY3kuY3JlYXRlSFRNTChkaXJ0eSlcbiAgICAgICAgICA6IGRpcnR5O1xuICAgICAgfVxuXG4gICAgICAvKiBJbml0aWFsaXplIHRoZSBkb2N1bWVudCB0byB3b3JrIG9uICovXG4gICAgICBib2R5ID0gX2luaXREb2N1bWVudChkaXJ0eSk7XG5cbiAgICAgIC8qIENoZWNrIHdlIGhhdmUgYSBET00gbm9kZSBmcm9tIHRoZSBkYXRhICovXG4gICAgICBpZiAoIWJvZHkpIHtcbiAgICAgICAgcmV0dXJuIFJFVFVSTl9ET00gPyBudWxsIDogUkVUVVJOX1RSVVNURURfVFlQRSA/IGVtcHR5SFRNTCA6ICcnO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qIFJlbW92ZSBmaXJzdCBlbGVtZW50IG5vZGUgKG91cnMpIGlmIEZPUkNFX0JPRFkgaXMgc2V0ICovXG4gICAgaWYgKGJvZHkgJiYgRk9SQ0VfQk9EWSkge1xuICAgICAgX2ZvcmNlUmVtb3ZlKGJvZHkuZmlyc3RDaGlsZCk7XG4gICAgfVxuXG4gICAgLyogR2V0IG5vZGUgaXRlcmF0b3IgKi9cbiAgICBjb25zdCBub2RlSXRlcmF0b3IgPSBfY3JlYXRlTm9kZUl0ZXJhdG9yKElOX1BMQUNFID8gZGlydHkgOiBib2R5KTtcblxuICAgIC8qIE5vdyBzdGFydCBpdGVyYXRpbmcgb3ZlciB0aGUgY3JlYXRlZCBkb2N1bWVudCAqL1xuICAgIHdoaWxlICgoY3VycmVudE5vZGUgPSBub2RlSXRlcmF0b3IubmV4dE5vZGUoKSkpIHtcbiAgICAgIC8qIFNhbml0aXplIHRhZ3MgYW5kIGVsZW1lbnRzICovXG4gICAgICBfc2FuaXRpemVFbGVtZW50cyhjdXJyZW50Tm9kZSk7XG5cbiAgICAgIC8qIENoZWNrIGF0dHJpYnV0ZXMgbmV4dCAqL1xuICAgICAgX3Nhbml0aXplQXR0cmlidXRlcyhjdXJyZW50Tm9kZSk7XG5cbiAgICAgIC8qIFNoYWRvdyBET00gZGV0ZWN0ZWQsIHNhbml0aXplIGl0ICovXG4gICAgICBpZiAoY3VycmVudE5vZGUuY29udGVudCBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpIHtcbiAgICAgICAgX3Nhbml0aXplU2hhZG93RE9NKGN1cnJlbnROb2RlLmNvbnRlbnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qIElmIHdlIHNhbml0aXplZCBgZGlydHlgIGluLXBsYWNlLCByZXR1cm4gaXQuICovXG4gICAgaWYgKElOX1BMQUNFKSB7XG4gICAgICByZXR1cm4gZGlydHk7XG4gICAgfVxuXG4gICAgLyogUmV0dXJuIHNhbml0aXplZCBzdHJpbmcgb3IgRE9NICovXG4gICAgaWYgKFJFVFVSTl9ET00pIHtcbiAgICAgIGlmIChSRVRVUk5fRE9NX0ZSQUdNRU5UKSB7XG4gICAgICAgIHJldHVybk5vZGUgPSBjcmVhdGVEb2N1bWVudEZyYWdtZW50LmNhbGwoYm9keS5vd25lckRvY3VtZW50KTtcblxuICAgICAgICB3aGlsZSAoYm9keS5maXJzdENoaWxkKSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vcHJlZmVyLWRvbS1ub2RlLWFwcGVuZFxuICAgICAgICAgIHJldHVybk5vZGUuYXBwZW5kQ2hpbGQoYm9keS5maXJzdENoaWxkKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuTm9kZSA9IGJvZHk7XG4gICAgICB9XG5cbiAgICAgIGlmIChBTExPV0VEX0FUVFIuc2hhZG93cm9vdCB8fCBBTExPV0VEX0FUVFIuc2hhZG93cm9vdG1vZGUpIHtcbiAgICAgICAgLypcbiAgICAgICAgICBBZG9wdE5vZGUoKSBpcyBub3QgdXNlZCBiZWNhdXNlIGludGVybmFsIHN0YXRlIGlzIG5vdCByZXNldFxuICAgICAgICAgIChlLmcuIHRoZSBwYXN0IG5hbWVzIG1hcCBvZiBhIEhUTUxGb3JtRWxlbWVudCksIHRoaXMgaXMgc2FmZVxuICAgICAgICAgIGluIHRoZW9yeSBidXQgd2Ugd291bGQgcmF0aGVyIG5vdCByaXNrIGFub3RoZXIgYXR0YWNrIHZlY3Rvci5cbiAgICAgICAgICBUaGUgc3RhdGUgdGhhdCBpcyBjbG9uZWQgYnkgaW1wb3J0Tm9kZSgpIGlzIGV4cGxpY2l0bHkgZGVmaW5lZFxuICAgICAgICAgIGJ5IHRoZSBzcGVjcy5cbiAgICAgICAgKi9cbiAgICAgICAgcmV0dXJuTm9kZSA9IGltcG9ydE5vZGUuY2FsbChvcmlnaW5hbERvY3VtZW50LCByZXR1cm5Ob2RlLCB0cnVlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJldHVybk5vZGU7XG4gICAgfVxuXG4gICAgbGV0IHNlcmlhbGl6ZWRIVE1MID0gV0hPTEVfRE9DVU1FTlQgPyBib2R5Lm91dGVySFRNTCA6IGJvZHkuaW5uZXJIVE1MO1xuXG4gICAgLyogU2VyaWFsaXplIGRvY3R5cGUgaWYgYWxsb3dlZCAqL1xuICAgIGlmIChcbiAgICAgIFdIT0xFX0RPQ1VNRU5UICYmXG4gICAgICBBTExPV0VEX1RBR1NbJyFkb2N0eXBlJ10gJiZcbiAgICAgIGJvZHkub3duZXJEb2N1bWVudCAmJlxuICAgICAgYm9keS5vd25lckRvY3VtZW50LmRvY3R5cGUgJiZcbiAgICAgIGJvZHkub3duZXJEb2N1bWVudC5kb2N0eXBlLm5hbWUgJiZcbiAgICAgIHJlZ0V4cFRlc3QoRVhQUkVTU0lPTlMuRE9DVFlQRV9OQU1FLCBib2R5Lm93bmVyRG9jdW1lbnQuZG9jdHlwZS5uYW1lKVxuICAgICkge1xuICAgICAgc2VyaWFsaXplZEhUTUwgPVxuICAgICAgICAnPCFET0NUWVBFICcgKyBib2R5Lm93bmVyRG9jdW1lbnQuZG9jdHlwZS5uYW1lICsgJz5cXG4nICsgc2VyaWFsaXplZEhUTUw7XG4gICAgfVxuXG4gICAgLyogU2FuaXRpemUgZmluYWwgc3RyaW5nIHRlbXBsYXRlLXNhZmUgKi9cbiAgICBpZiAoU0FGRV9GT1JfVEVNUExBVEVTKSB7XG4gICAgICBhcnJheUZvckVhY2goW01VU1RBQ0hFX0VYUFIsIEVSQl9FWFBSLCBUTVBMSVRfRVhQUl0sIChleHByOiBSZWdFeHApID0+IHtcbiAgICAgICAgc2VyaWFsaXplZEhUTUwgPSBzdHJpbmdSZXBsYWNlKHNlcmlhbGl6ZWRIVE1MLCBleHByLCAnICcpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydXN0ZWRUeXBlc1BvbGljeSAmJiBSRVRVUk5fVFJVU1RFRF9UWVBFXG4gICAgICA/IHRydXN0ZWRUeXBlc1BvbGljeS5jcmVhdGVIVE1MKHNlcmlhbGl6ZWRIVE1MKVxuICAgICAgOiBzZXJpYWxpemVkSFRNTDtcbiAgfTtcblxuICBET01QdXJpZnkuc2V0Q29uZmlnID0gZnVuY3Rpb24gKGNmZyA9IHt9KSB7XG4gICAgX3BhcnNlQ29uZmlnKGNmZyk7XG4gICAgU0VUX0NPTkZJRyA9IHRydWU7XG4gIH07XG5cbiAgRE9NUHVyaWZ5LmNsZWFyQ29uZmlnID0gZnVuY3Rpb24gKCkge1xuICAgIENPTkZJRyA9IG51bGw7XG4gICAgU0VUX0NPTkZJRyA9IGZhbHNlO1xuICB9O1xuXG4gIERPTVB1cmlmeS5pc1ZhbGlkQXR0cmlidXRlID0gZnVuY3Rpb24gKHRhZywgYXR0ciwgdmFsdWUpIHtcbiAgICAvKiBJbml0aWFsaXplIHNoYXJlZCBjb25maWcgdmFycyBpZiBuZWNlc3NhcnkuICovXG4gICAgaWYgKCFDT05GSUcpIHtcbiAgICAgIF9wYXJzZUNvbmZpZyh7fSk7XG4gICAgfVxuXG4gICAgY29uc3QgbGNUYWcgPSB0cmFuc2Zvcm1DYXNlRnVuYyh0YWcpO1xuICAgIGNvbnN0IGxjTmFtZSA9IHRyYW5zZm9ybUNhc2VGdW5jKGF0dHIpO1xuICAgIHJldHVybiBfaXNWYWxpZEF0dHJpYnV0ZShsY1RhZywgbGNOYW1lLCB2YWx1ZSk7XG4gIH07XG5cbiAgRE9NUHVyaWZ5LmFkZEhvb2sgPSBmdW5jdGlvbiAoXG4gICAgZW50cnlQb2ludDoga2V5b2YgSG9va3NNYXAsXG4gICAgaG9va0Z1bmN0aW9uOiBIb29rRnVuY3Rpb25cbiAgKSB7XG4gICAgaWYgKHR5cGVvZiBob29rRnVuY3Rpb24gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhcnJheVB1c2goaG9va3NbZW50cnlQb2ludF0sIGhvb2tGdW5jdGlvbik7XG4gIH07XG5cbiAgRE9NUHVyaWZ5LnJlbW92ZUhvb2sgPSBmdW5jdGlvbiAoXG4gICAgZW50cnlQb2ludDoga2V5b2YgSG9va3NNYXAsXG4gICAgaG9va0Z1bmN0aW9uOiBIb29rRnVuY3Rpb25cbiAgKSB7XG4gICAgaWYgKGhvb2tGdW5jdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBpbmRleCA9IGFycmF5TGFzdEluZGV4T2YoaG9va3NbZW50cnlQb2ludF0sIGhvb2tGdW5jdGlvbik7XG5cbiAgICAgIHJldHVybiBpbmRleCA9PT0gLTFcbiAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgOiBhcnJheVNwbGljZShob29rc1tlbnRyeVBvaW50XSwgaW5kZXgsIDEpWzBdO1xuICAgIH1cblxuICAgIHJldHVybiBhcnJheVBvcChob29rc1tlbnRyeVBvaW50XSk7XG4gIH07XG5cbiAgRE9NUHVyaWZ5LnJlbW92ZUhvb2tzID0gZnVuY3Rpb24gKGVudHJ5UG9pbnQ6IGtleW9mIEhvb2tzTWFwKSB7XG4gICAgaG9va3NbZW50cnlQb2ludF0gPSBbXTtcbiAgfTtcblxuICBET01QdXJpZnkucmVtb3ZlQWxsSG9va3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgaG9va3MgPSBfY3JlYXRlSG9va3NNYXAoKTtcbiAgfTtcblxuICByZXR1cm4gRE9NUHVyaWZ5O1xufVxuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVET01QdXJpZnkoKTtcblxuZXhwb3J0IGludGVyZmFjZSBET01QdXJpZnkge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIERPTVB1cmlmeSBpbnN0YW5jZSB1c2luZyB0aGUgZ2l2ZW4gd2luZG93LWxpa2Ugb2JqZWN0LiBEZWZhdWx0cyB0byBgd2luZG93YC5cbiAgICovXG4gIChyb290PzogV2luZG93TGlrZSk6IERPTVB1cmlmeTtcblxuICAvKipcbiAgICogVmVyc2lvbiBsYWJlbCwgZXhwb3NlZCBmb3IgZWFzaWVyIGNoZWNrc1xuICAgKiBpZiBET01QdXJpZnkgaXMgdXAgdG8gZGF0ZSBvciBub3RcbiAgICovXG4gIHZlcnNpb246IHN0cmluZztcblxuICAvKipcbiAgICogQXJyYXkgb2YgZWxlbWVudHMgdGhhdCBET01QdXJpZnkgcmVtb3ZlZCBkdXJpbmcgc2FuaXRhdGlvbi5cbiAgICogRW1wdHkgaWYgbm90aGluZyB3YXMgcmVtb3ZlZC5cbiAgICovXG4gIHJlbW92ZWQ6IEFycmF5PFJlbW92ZWRFbGVtZW50IHwgUmVtb3ZlZEF0dHJpYnV0ZT47XG5cbiAgLyoqXG4gICAqIEV4cG9zZSB3aGV0aGVyIHRoaXMgYnJvd3NlciBzdXBwb3J0cyBydW5uaW5nIHRoZSBmdWxsIERPTVB1cmlmeS5cbiAgICovXG4gIGlzU3VwcG9ydGVkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGNvbmZpZ3VyYXRpb24gb25jZS5cbiAgICpcbiAgICogQHBhcmFtIGNmZyBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgKi9cbiAgc2V0Q29uZmlnKGNmZz86IENvbmZpZyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgdGhlIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBjbGVhckNvbmZpZygpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBQcm92aWRlcyBjb3JlIHNhbml0YXRpb24gZnVuY3Rpb25hbGl0eS5cbiAgICpcbiAgICogQHBhcmFtIGRpcnR5IHN0cmluZyBvciBET00gbm9kZVxuICAgKiBAcGFyYW0gY2ZnIG9iamVjdFxuICAgKiBAcmV0dXJucyBTYW5pdGl6ZWQgVHJ1c3RlZEhUTUwuXG4gICAqL1xuICBzYW5pdGl6ZShcbiAgICBkaXJ0eTogc3RyaW5nIHwgTm9kZSxcbiAgICBjZmc6IENvbmZpZyAmIHsgUkVUVVJOX1RSVVNURURfVFlQRTogdHJ1ZSB9XG4gICk6IFRydXN0ZWRIVE1MO1xuXG4gIC8qKlxuICAgKiBQcm92aWRlcyBjb3JlIHNhbml0YXRpb24gZnVuY3Rpb25hbGl0eS5cbiAgICpcbiAgICogQHBhcmFtIGRpcnR5IERPTSBub2RlXG4gICAqIEBwYXJhbSBjZmcgb2JqZWN0XG4gICAqIEByZXR1cm5zIFNhbml0aXplZCBET00gbm9kZS5cbiAgICovXG4gIHNhbml0aXplKGRpcnR5OiBOb2RlLCBjZmc6IENvbmZpZyAmIHsgSU5fUExBQ0U6IHRydWUgfSk6IE5vZGU7XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVzIGNvcmUgc2FuaXRhdGlvbiBmdW5jdGlvbmFsaXR5LlxuICAgKlxuICAgKiBAcGFyYW0gZGlydHkgc3RyaW5nIG9yIERPTSBub2RlXG4gICAqIEBwYXJhbSBjZmcgb2JqZWN0XG4gICAqIEByZXR1cm5zIFNhbml0aXplZCBET00gbm9kZS5cbiAgICovXG4gIHNhbml0aXplKGRpcnR5OiBzdHJpbmcgfCBOb2RlLCBjZmc6IENvbmZpZyAmIHsgUkVUVVJOX0RPTTogdHJ1ZSB9KTogTm9kZTtcblxuICAvKipcbiAgICogUHJvdmlkZXMgY29yZSBzYW5pdGF0aW9uIGZ1bmN0aW9uYWxpdHkuXG4gICAqXG4gICAqIEBwYXJhbSBkaXJ0eSBzdHJpbmcgb3IgRE9NIG5vZGVcbiAgICogQHBhcmFtIGNmZyBvYmplY3RcbiAgICogQHJldHVybnMgU2FuaXRpemVkIGRvY3VtZW50IGZyYWdtZW50LlxuICAgKi9cbiAgc2FuaXRpemUoXG4gICAgZGlydHk6IHN0cmluZyB8IE5vZGUsXG4gICAgY2ZnOiBDb25maWcgJiB7IFJFVFVSTl9ET01fRlJBR01FTlQ6IHRydWUgfVxuICApOiBEb2N1bWVudEZyYWdtZW50O1xuXG4gIC8qKlxuICAgKiBQcm92aWRlcyBjb3JlIHNhbml0YXRpb24gZnVuY3Rpb25hbGl0eS5cbiAgICpcbiAgICogQHBhcmFtIGRpcnR5IHN0cmluZyBvciBET00gbm9kZVxuICAgKiBAcGFyYW0gY2ZnIG9iamVjdFxuICAgKiBAcmV0dXJucyBTYW5pdGl6ZWQgc3RyaW5nLlxuICAgKi9cbiAgc2FuaXRpemUoZGlydHk6IHN0cmluZyB8IE5vZGUsIGNmZz86IENvbmZpZyk6IHN0cmluZztcblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGFuIGF0dHJpYnV0ZSB2YWx1ZSBpcyB2YWxpZC5cbiAgICogVXNlcyBsYXN0IHNldCBjb25maWcsIGlmIGFueS4gT3RoZXJ3aXNlLCB1c2VzIGNvbmZpZyBkZWZhdWx0cy5cbiAgICpcbiAgICogQHBhcmFtIHRhZyBUYWcgbmFtZSBvZiBjb250YWluaW5nIGVsZW1lbnQuXG4gICAqIEBwYXJhbSBhdHRyIEF0dHJpYnV0ZSBuYW1lLlxuICAgKiBAcGFyYW0gdmFsdWUgQXR0cmlidXRlIHZhbHVlLlxuICAgKiBAcmV0dXJucyBSZXR1cm5zIHRydWUgaWYgYHZhbHVlYCBpcyB2YWxpZC4gT3RoZXJ3aXNlLCByZXR1cm5zIGZhbHNlLlxuICAgKi9cbiAgaXNWYWxpZEF0dHJpYnV0ZSh0YWc6IHN0cmluZywgYXR0cjogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQWRkcyBhIERPTVB1cmlmeSBob29rLlxuICAgKlxuICAgKiBAcGFyYW0gZW50cnlQb2ludCBlbnRyeSBwb2ludCBmb3IgdGhlIGhvb2sgdG8gYWRkXG4gICAqIEBwYXJhbSBob29rRnVuY3Rpb24gZnVuY3Rpb24gdG8gZXhlY3V0ZVxuICAgKi9cbiAgYWRkSG9vayhlbnRyeVBvaW50OiBCYXNpY0hvb2tOYW1lLCBob29rRnVuY3Rpb246IE5vZGVIb29rKTogdm9pZDtcblxuICAvKipcbiAgICogQWRkcyBhIERPTVB1cmlmeSBob29rLlxuICAgKlxuICAgKiBAcGFyYW0gZW50cnlQb2ludCBlbnRyeSBwb2ludCBmb3IgdGhlIGhvb2sgdG8gYWRkXG4gICAqIEBwYXJhbSBob29rRnVuY3Rpb24gZnVuY3Rpb24gdG8gZXhlY3V0ZVxuICAgKi9cbiAgYWRkSG9vayhlbnRyeVBvaW50OiBFbGVtZW50SG9va05hbWUsIGhvb2tGdW5jdGlvbjogRWxlbWVudEhvb2spOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBBZGRzIGEgRE9NUHVyaWZ5IGhvb2suXG4gICAqXG4gICAqIEBwYXJhbSBlbnRyeVBvaW50IGVudHJ5IHBvaW50IGZvciB0aGUgaG9vayB0byBhZGRcbiAgICogQHBhcmFtIGhvb2tGdW5jdGlvbiBmdW5jdGlvbiB0byBleGVjdXRlXG4gICAqL1xuICBhZGRIb29rKFxuICAgIGVudHJ5UG9pbnQ6IERvY3VtZW50RnJhZ21lbnRIb29rTmFtZSxcbiAgICBob29rRnVuY3Rpb246IERvY3VtZW50RnJhZ21lbnRIb29rXG4gICk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBET01QdXJpZnkgaG9vay5cbiAgICpcbiAgICogQHBhcmFtIGVudHJ5UG9pbnQgZW50cnkgcG9pbnQgZm9yIHRoZSBob29rIHRvIGFkZFxuICAgKiBAcGFyYW0gaG9va0Z1bmN0aW9uIGZ1bmN0aW9uIHRvIGV4ZWN1dGVcbiAgICovXG4gIGFkZEhvb2soXG4gICAgZW50cnlQb2ludDogJ3Vwb25TYW5pdGl6ZUVsZW1lbnQnLFxuICAgIGhvb2tGdW5jdGlvbjogVXBvblNhbml0aXplRWxlbWVudEhvb2tcbiAgKTogdm9pZDtcblxuICAvKipcbiAgICogQWRkcyBhIERPTVB1cmlmeSBob29rLlxuICAgKlxuICAgKiBAcGFyYW0gZW50cnlQb2ludCBlbnRyeSBwb2ludCBmb3IgdGhlIGhvb2sgdG8gYWRkXG4gICAqIEBwYXJhbSBob29rRnVuY3Rpb24gZnVuY3Rpb24gdG8gZXhlY3V0ZVxuICAgKi9cbiAgYWRkSG9vayhcbiAgICBlbnRyeVBvaW50OiAndXBvblNhbml0aXplQXR0cmlidXRlJyxcbiAgICBob29rRnVuY3Rpb246IFVwb25TYW5pdGl6ZUF0dHJpYnV0ZUhvb2tcbiAgKTogdm9pZDtcblxuICAvKipcbiAgICogUmVtb3ZlIGEgRE9NUHVyaWZ5IGhvb2sgYXQgYSBnaXZlbiBlbnRyeVBvaW50XG4gICAqIChwb3BzIGl0IGZyb20gdGhlIHN0YWNrIG9mIGhvb2tzIGlmIGhvb2sgbm90IHNwZWNpZmllZClcbiAgICpcbiAgICogQHBhcmFtIGVudHJ5UG9pbnQgZW50cnkgcG9pbnQgZm9yIHRoZSBob29rIHRvIHJlbW92ZVxuICAgKiBAcGFyYW0gaG9va0Z1bmN0aW9uIG9wdGlvbmFsIHNwZWNpZmljIGhvb2sgdG8gcmVtb3ZlXG4gICAqIEByZXR1cm5zIHJlbW92ZWQgaG9va1xuICAgKi9cbiAgcmVtb3ZlSG9vayhcbiAgICBlbnRyeVBvaW50OiBCYXNpY0hvb2tOYW1lLFxuICAgIGhvb2tGdW5jdGlvbj86IE5vZGVIb29rXG4gICk6IE5vZGVIb29rIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBET01QdXJpZnkgaG9vayBhdCBhIGdpdmVuIGVudHJ5UG9pbnRcbiAgICogKHBvcHMgaXQgZnJvbSB0aGUgc3RhY2sgb2YgaG9va3MgaWYgaG9vayBub3Qgc3BlY2lmaWVkKVxuICAgKlxuICAgKiBAcGFyYW0gZW50cnlQb2ludCBlbnRyeSBwb2ludCBmb3IgdGhlIGhvb2sgdG8gcmVtb3ZlXG4gICAqIEBwYXJhbSBob29rRnVuY3Rpb24gb3B0aW9uYWwgc3BlY2lmaWMgaG9vayB0byByZW1vdmVcbiAgICogQHJldHVybnMgcmVtb3ZlZCBob29rXG4gICAqL1xuICByZW1vdmVIb29rKFxuICAgIGVudHJ5UG9pbnQ6IEVsZW1lbnRIb29rTmFtZSxcbiAgICBob29rRnVuY3Rpb24/OiBFbGVtZW50SG9va1xuICApOiBFbGVtZW50SG9vayB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogUmVtb3ZlIGEgRE9NUHVyaWZ5IGhvb2sgYXQgYSBnaXZlbiBlbnRyeVBvaW50XG4gICAqIChwb3BzIGl0IGZyb20gdGhlIHN0YWNrIG9mIGhvb2tzIGlmIGhvb2sgbm90IHNwZWNpZmllZClcbiAgICpcbiAgICogQHBhcmFtIGVudHJ5UG9pbnQgZW50cnkgcG9pbnQgZm9yIHRoZSBob29rIHRvIHJlbW92ZVxuICAgKiBAcGFyYW0gaG9va0Z1bmN0aW9uIG9wdGlvbmFsIHNwZWNpZmljIGhvb2sgdG8gcmVtb3ZlXG4gICAqIEByZXR1cm5zIHJlbW92ZWQgaG9va1xuICAgKi9cbiAgcmVtb3ZlSG9vayhcbiAgICBlbnRyeVBvaW50OiBEb2N1bWVudEZyYWdtZW50SG9va05hbWUsXG4gICAgaG9va0Z1bmN0aW9uPzogRG9jdW1lbnRGcmFnbWVudEhvb2tcbiAgKTogRG9jdW1lbnRGcmFnbWVudEhvb2sgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIERPTVB1cmlmeSBob29rIGF0IGEgZ2l2ZW4gZW50cnlQb2ludFxuICAgKiAocG9wcyBpdCBmcm9tIHRoZSBzdGFjayBvZiBob29rcyBpZiBob29rIG5vdCBzcGVjaWZpZWQpXG4gICAqXG4gICAqIEBwYXJhbSBlbnRyeVBvaW50IGVudHJ5IHBvaW50IGZvciB0aGUgaG9vayB0byByZW1vdmVcbiAgICogQHBhcmFtIGhvb2tGdW5jdGlvbiBvcHRpb25hbCBzcGVjaWZpYyBob29rIHRvIHJlbW92ZVxuICAgKiBAcmV0dXJucyByZW1vdmVkIGhvb2tcbiAgICovXG4gIHJlbW92ZUhvb2soXG4gICAgZW50cnlQb2ludDogJ3Vwb25TYW5pdGl6ZUVsZW1lbnQnLFxuICAgIGhvb2tGdW5jdGlvbj86IFVwb25TYW5pdGl6ZUVsZW1lbnRIb29rXG4gICk6IFVwb25TYW5pdGl6ZUVsZW1lbnRIb29rIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBET01QdXJpZnkgaG9vayBhdCBhIGdpdmVuIGVudHJ5UG9pbnRcbiAgICogKHBvcHMgaXQgZnJvbSB0aGUgc3RhY2sgb2YgaG9va3MgaWYgaG9vayBub3Qgc3BlY2lmaWVkKVxuICAgKlxuICAgKiBAcGFyYW0gZW50cnlQb2ludCBlbnRyeSBwb2ludCBmb3IgdGhlIGhvb2sgdG8gcmVtb3ZlXG4gICAqIEBwYXJhbSBob29rRnVuY3Rpb24gb3B0aW9uYWwgc3BlY2lmaWMgaG9vayB0byByZW1vdmVcbiAgICogQHJldHVybnMgcmVtb3ZlZCBob29rXG4gICAqL1xuICByZW1vdmVIb29rKFxuICAgIGVudHJ5UG9pbnQ6ICd1cG9uU2FuaXRpemVBdHRyaWJ1dGUnLFxuICAgIGhvb2tGdW5jdGlvbj86IFVwb25TYW5pdGl6ZUF0dHJpYnV0ZUhvb2tcbiAgKTogVXBvblNhbml0aXplQXR0cmlidXRlSG9vayB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogUmVtb3ZlcyBhbGwgRE9NUHVyaWZ5IGhvb2tzIGF0IGEgZ2l2ZW4gZW50cnlQb2ludFxuICAgKlxuICAgKiBAcGFyYW0gZW50cnlQb2ludCBlbnRyeSBwb2ludCBmb3IgdGhlIGhvb2tzIHRvIHJlbW92ZVxuICAgKi9cbiAgcmVtb3ZlSG9va3MoZW50cnlQb2ludDogSG9va05hbWUpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFsbCBET01QdXJpZnkgaG9va3MuXG4gICAqL1xuICByZW1vdmVBbGxIb29rcygpOiB2b2lkO1xufVxuXG4vKipcbiAqIEFuIGVsZW1lbnQgcmVtb3ZlZCBieSBET01QdXJpZnkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVtb3ZlZEVsZW1lbnQge1xuICAvKipcbiAgICogVGhlIGVsZW1lbnQgdGhhdCB3YXMgcmVtb3ZlZC5cbiAgICovXG4gIGVsZW1lbnQ6IE5vZGU7XG59XG5cbi8qKlxuICogQW4gZWxlbWVudCByZW1vdmVkIGJ5IERPTVB1cmlmeS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZW1vdmVkQXR0cmlidXRlIHtcbiAgLyoqXG4gICAqIFRoZSBhdHRyaWJ1dGUgdGhhdCB3YXMgcmVtb3ZlZC5cbiAgICovXG4gIGF0dHJpYnV0ZTogQXR0ciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBlbGVtZW50IHRoYXQgdGhlIGF0dHJpYnV0ZSB3YXMgcmVtb3ZlZC5cbiAgICovXG4gIGZyb206IE5vZGU7XG59XG5cbnR5cGUgQmFzaWNIb29rTmFtZSA9XG4gIHwgJ2JlZm9yZVNhbml0aXplRWxlbWVudHMnXG4gIHwgJ2FmdGVyU2FuaXRpemVFbGVtZW50cydcbiAgfCAndXBvblNhbml0aXplU2hhZG93Tm9kZSc7XG50eXBlIEVsZW1lbnRIb29rTmFtZSA9ICdiZWZvcmVTYW5pdGl6ZUF0dHJpYnV0ZXMnIHwgJ2FmdGVyU2FuaXRpemVBdHRyaWJ1dGVzJztcbnR5cGUgRG9jdW1lbnRGcmFnbWVudEhvb2tOYW1lID1cbiAgfCAnYmVmb3JlU2FuaXRpemVTaGFkb3dET00nXG4gIHwgJ2FmdGVyU2FuaXRpemVTaGFkb3dET00nO1xudHlwZSBVcG9uU2FuaXRpemVFbGVtZW50SG9va05hbWUgPSAndXBvblNhbml0aXplRWxlbWVudCc7XG50eXBlIFVwb25TYW5pdGl6ZUF0dHJpYnV0ZUhvb2tOYW1lID0gJ3Vwb25TYW5pdGl6ZUF0dHJpYnV0ZSc7XG5cbmludGVyZmFjZSBIb29rc01hcCB7XG4gIGJlZm9yZVNhbml0aXplRWxlbWVudHM6IE5vZGVIb29rW107XG4gIGFmdGVyU2FuaXRpemVFbGVtZW50czogTm9kZUhvb2tbXTtcbiAgYmVmb3JlU2FuaXRpemVTaGFkb3dET006IERvY3VtZW50RnJhZ21lbnRIb29rW107XG4gIHVwb25TYW5pdGl6ZVNoYWRvd05vZGU6IE5vZGVIb29rW107XG4gIGFmdGVyU2FuaXRpemVTaGFkb3dET006IERvY3VtZW50RnJhZ21lbnRIb29rW107XG4gIGJlZm9yZVNhbml0aXplQXR0cmlidXRlczogRWxlbWVudEhvb2tbXTtcbiAgYWZ0ZXJTYW5pdGl6ZUF0dHJpYnV0ZXM6IEVsZW1lbnRIb29rW107XG4gIHVwb25TYW5pdGl6ZUVsZW1lbnQ6IFVwb25TYW5pdGl6ZUVsZW1lbnRIb29rW107XG4gIHVwb25TYW5pdGl6ZUF0dHJpYnV0ZTogVXBvblNhbml0aXplQXR0cmlidXRlSG9va1tdO1xufVxuXG50eXBlIEFycmF5RWxlbWVudDxUPiA9IFQgZXh0ZW5kcyBBcnJheTxpbmZlciBVPiA/IFUgOiBuZXZlcjtcblxudHlwZSBIb29rRnVuY3Rpb24gPSBBcnJheUVsZW1lbnQ8SG9va3NNYXBba2V5b2YgSG9va3NNYXBdPjtcblxuZXhwb3J0IHR5cGUgSG9va05hbWUgPVxuICB8IEJhc2ljSG9va05hbWVcbiAgfCBFbGVtZW50SG9va05hbWVcbiAgfCBEb2N1bWVudEZyYWdtZW50SG9va05hbWVcbiAgfCBVcG9uU2FuaXRpemVFbGVtZW50SG9va05hbWVcbiAgfCBVcG9uU2FuaXRpemVBdHRyaWJ1dGVIb29rTmFtZTtcblxuZXhwb3J0IHR5cGUgTm9kZUhvb2sgPSAoXG4gIHRoaXM6IERPTVB1cmlmeSxcbiAgY3VycmVudE5vZGU6IE5vZGUsXG4gIGhvb2tFdmVudDogbnVsbCxcbiAgY29uZmlnOiBDb25maWdcbikgPT4gdm9pZDtcblxuZXhwb3J0IHR5cGUgRWxlbWVudEhvb2sgPSAoXG4gIHRoaXM6IERPTVB1cmlmeSxcbiAgY3VycmVudE5vZGU6IEVsZW1lbnQsXG4gIGhvb2tFdmVudDogbnVsbCxcbiAgY29uZmlnOiBDb25maWdcbikgPT4gdm9pZDtcblxuZXhwb3J0IHR5cGUgRG9jdW1lbnRGcmFnbWVudEhvb2sgPSAoXG4gIHRoaXM6IERPTVB1cmlmeSxcbiAgY3VycmVudE5vZGU6IERvY3VtZW50RnJhZ21lbnQsXG4gIGhvb2tFdmVudDogbnVsbCxcbiAgY29uZmlnOiBDb25maWdcbikgPT4gdm9pZDtcblxuZXhwb3J0IHR5cGUgVXBvblNhbml0aXplRWxlbWVudEhvb2sgPSAoXG4gIHRoaXM6IERPTVB1cmlmeSxcbiAgY3VycmVudE5vZGU6IE5vZGUsXG4gIGhvb2tFdmVudDogVXBvblNhbml0aXplRWxlbWVudEhvb2tFdmVudCxcbiAgY29uZmlnOiBDb25maWdcbikgPT4gdm9pZDtcblxuZXhwb3J0IHR5cGUgVXBvblNhbml0aXplQXR0cmlidXRlSG9vayA9IChcbiAgdGhpczogRE9NUHVyaWZ5LFxuICBjdXJyZW50Tm9kZTogRWxlbWVudCxcbiAgaG9va0V2ZW50OiBVcG9uU2FuaXRpemVBdHRyaWJ1dGVIb29rRXZlbnQsXG4gIGNvbmZpZzogQ29uZmlnXG4pID0+IHZvaWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXBvblNhbml0aXplRWxlbWVudEhvb2tFdmVudCB7XG4gIHRhZ05hbWU6IHN0cmluZztcbiAgYWxsb3dlZFRhZ3M6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVwb25TYW5pdGl6ZUF0dHJpYnV0ZUhvb2tFdmVudCB7XG4gIGF0dHJOYW1lOiBzdHJpbmc7XG4gIGF0dHJWYWx1ZTogc3RyaW5nO1xuICBrZWVwQXR0cjogYm9vbGVhbjtcbiAgYWxsb3dlZEF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+O1xuICBmb3JjZUtlZXBBdHRyOiBib29sZWFuIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEEgYFdpbmRvd2AtbGlrZSBvYmplY3QgY29udGFpbmluZyB0aGUgcHJvcGVydGllcyBhbmQgdHlwZXMgdGhhdCBET01QdXJpZnkgcmVxdWlyZXMuXG4gKi9cbmV4cG9ydCB0eXBlIFdpbmRvd0xpa2UgPSBQaWNrPFxuICB0eXBlb2YgZ2xvYmFsVGhpcyxcbiAgfCAnRG9jdW1lbnRGcmFnbWVudCdcbiAgfCAnSFRNTFRlbXBsYXRlRWxlbWVudCdcbiAgfCAnTm9kZSdcbiAgfCAnRWxlbWVudCdcbiAgfCAnTm9kZUZpbHRlcidcbiAgfCAnTmFtZWROb2RlTWFwJ1xuICB8ICdIVE1MRm9ybUVsZW1lbnQnXG4gIHwgJ0RPTVBhcnNlcidcbj4gJiB7XG4gIGRvY3VtZW50PzogRG9jdW1lbnQ7XG4gIE1vek5hbWVkQXR0ck1hcD86IHR5cGVvZiB3aW5kb3cuTmFtZWROb2RlTWFwO1xufSAmIFBpY2s8VHJ1c3RlZFR5cGVzV2luZG93LCAndHJ1c3RlZFR5cGVzJz47XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9tZXNzYWdlLWRpc3BhdGNoLmpzXG4gKiBDaGF0IG1lc3NhZ2UgZGlzcGF0Y2g6IHNlbmRNZXNzYWdlLCBpbnRha2UgY29uZmlybWF0aW9uIGNhcmQsXG4gKiBwcmlvci1jbGFyaWZpY2F0aW9uIHByZWxvYWQuXG4gKlxuICogREVQRU5ERU5DSUVTIChhbGwgb24gZ2xvYmFsVGhpcyBhdCBydW50aW1lKTpcbiAqICAgLSBwYXJzZU1lc3NhZ2VSZXNwb25zZSAodmFsaWRhdG9ycy5qcylcbiAqICAgLSBzZXRMb2FkaW5nLCBsbG1GZXRjaCAoZmV0Y2gtdXRpbHMuanMpXG4gKiAgIC0gYXBwZW5kTWVzc2FnZSwgYXBwZW5kUmV0cnlNZXNzYWdlLCBhcHBlbmRSYXdIdG1sIChtZXNzYWdlLXF1ZXVlLmpzKVxuICogICAtIG5vcm1hbGl6ZVRleHQsIGVzY2FwZUh0bWwgKHV0aWxzLmpzKVxuICogICAtIGZldGNoU3RhdHVzIChhcGktY2xpZW50LmpzKVxuICogICAtIGFuYWx5emVKb2IgKGpvYi1hbmFseXNpcy5qcylcbiAqICAgLSBzZW5kQWN0aW9uIChzZXNzaW9uLWFjdGlvbnMuanMpXG4gKiAgIC0gc2hvd1RhYmxlQmFzZWRSZXZpZXcgKHJldmlldy10YWJsZS1iYXNlLmpzLCBUaWVyIDQpXG4gKiAgIC0gaGFuZGxlRXhwZXJpZW5jZVJlc3BvbnNlIChleHBlcmllbmNlLXJldmlldy5qcywgVGllciA1KVxuICogICAtIGhhbmRsZVNraWxsc1Jlc3BvbnNlIChza2lsbHMtcmV2aWV3LmpzLCBUaWVyIDUpXG4gKiAgIC0gaGFuZGxlUXVlc3Rpb25SZXNwb25zZSAocXVlc3Rpb25zLXBhbmVsLmpzKVxuICogICAtIGV4dHJhY3RGaXJzdEpzb25PYmplY3QsIGhhbmRsZUN1c3RvbWl6YXRpb25SZXNwb25zZSAoYXBwLmpzIG9yY2hlc3RyYXRvcilcbiAqICAgLSBzdGF0ZU1hbmFnZXIgKHN0YXRlLW1hbmFnZXIuanMgXHUyMDE0IGlzTG9hZGluZygpKVxuICogICAtIHF1ZXN0aW9uQW5zd2VycywgcGVuZGluZ1JlY29tbWVuZGF0aW9ucyAod2luZG93IGdsb2JhbHMpXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdtZXNzYWdlLWRpc3BhdGNoJyk7XG5cbmltcG9ydCB7IHN0YXRlTWFuYWdlciB9IGZyb20gJy4vc3RhdGUtbWFuYWdlci5qcyc7XG5pbXBvcnQgeyBnZXRTZXNzaW9uSWRGcm9tVVJMIH0gZnJvbSAnLi9hcGktY2xpZW50LmpzJztcblxubGV0IF9wZW5kaW5nUG9zdEludGFrZUNvbnRpbnVhdGlvbiA9IG51bGw7XG5jb25zdCBSRVRSWV9QT0xJQ1lfU1RPUkFHRV9LRVkgPSAnY3YtYnVpbGRlci1yZXRyeS1wb2xpY3knO1xubGV0IF9yZXRyeUF0dGVtcHRDb3VudCA9IDA7XG5sZXQgX3JldHJ5VGltZXIgPSBudWxsO1xubGV0IF9yZXRyeUludGVydmFsID0gbnVsbDtcblxuZnVuY3Rpb24gX2NsZWFyUmV0cnlUaW1lcnMoKSB7XG4gIGlmIChfcmV0cnlUaW1lcikge1xuICAgIGNsZWFyVGltZW91dChfcmV0cnlUaW1lcik7XG4gICAgX3JldHJ5VGltZXIgPSBudWxsO1xuICB9XG4gIGlmIChfcmV0cnlJbnRlcnZhbCkge1xuICAgIGNsZWFySW50ZXJ2YWwoX3JldHJ5SW50ZXJ2YWwpO1xuICAgIF9yZXRyeUludGVydmFsID0gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBfZ2V0UmV0cnlQb2xpY3koKSB7XG4gIGNvbnN0IGRlZmF1bHRzID0ge1xuICAgIGJhc2VNczogMTUwMCxcbiAgICBjYXBNczogNjAwMDAsXG4gICAgbWF4QXR0ZW1wdHM6IDYsXG4gICAgYXV0b1JldHJ5OiB0cnVlLFxuICB9O1xuICB0cnkge1xuICAgIGNvbnN0IHJhdyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFJFVFJZX1BPTElDWV9TVE9SQUdFX0tFWSk7XG4gICAgaWYgKCFyYXcpIHJldHVybiBkZWZhdWx0cztcbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHJhdyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGJhc2VNczogTWF0aC5tYXgoMjAwLCBOdW1iZXIocGFyc2VkLmJhc2VNcyB8fCBkZWZhdWx0cy5iYXNlTXMpKSxcbiAgICAgIGNhcE1zOiBNYXRoLm1heCgxMDAwLCBOdW1iZXIocGFyc2VkLmNhcE1zIHx8IGRlZmF1bHRzLmNhcE1zKSksXG4gICAgICBtYXhBdHRlbXB0czogTWF0aC5tYXgoMSwgTnVtYmVyKHBhcnNlZC5tYXhBdHRlbXB0cyB8fCBkZWZhdWx0cy5tYXhBdHRlbXB0cykpLFxuICAgICAgYXV0b1JldHJ5OiBwYXJzZWQuYXV0b1JldHJ5ICE9PSBmYWxzZSxcbiAgICB9O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZGVmYXVsdHM7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2NhbGN1bGF0ZVJldHJ5RGVsYXlNcyhraW5kLCBlcnJvcikge1xuICBjb25zdCBwb2xpY3kgPSBfZ2V0UmV0cnlQb2xpY3koKTtcbiAgY29uc3QgZXhwID0gTWF0aC5taW4ocG9saWN5LmNhcE1zLCBwb2xpY3kuYmFzZU1zICogKDIgKiogX3JldHJ5QXR0ZW1wdENvdW50KSk7XG4gIGNvbnN0IGppdHRlciA9IE1hdGgucm91bmQoZXhwICogKDAuMSArIE1hdGgucmFuZG9tKCkgKiAwLjE1KSk7XG4gIGxldCBkZWxheU1zID0gTWF0aC5taW4ocG9saWN5LmNhcE1zLCBleHAgKyBqaXR0ZXIpO1xuXG4gIGlmIChraW5kID09PSAncmF0ZS1saW1pdGVkJykge1xuICAgIGNvbnN0IHJldHJ5QWZ0ZXJTZWMgPSBOdW1iZXIoZXJyb3I/LnJldHJ5QWZ0ZXJTZWMgfHwgMCk7XG4gICAgaWYgKHJldHJ5QWZ0ZXJTZWMgPiAwKSB7XG4gICAgICBkZWxheU1zID0gTWF0aC5tYXgoZGVsYXlNcywgcmV0cnlBZnRlclNlYyAqIDEwMDApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGVsYXlNcztcbn1cblxuZnVuY3Rpb24gX3NjaGVkdWxlUmV0cnkodGV4dCwgZGVyaXZlZCwgZXJyb3IpIHtcbiAgX2NsZWFyUmV0cnlUaW1lcnMoKTtcbiAgY29uc3QgcG9saWN5ID0gX2dldFJldHJ5UG9saWN5KCk7XG5cbiAgLy8gQ2xpZW50IGVycm9ycyAoNHh4KSBhbmQgYXV0aCBmYWlsdXJlcyBhcmUgbm90IHRyYW5zaWVudDsgZG8gbm90IGF1dG8tcmV0cnkuXG4gIGNvbnN0IE5PTl9SRVRSWUFCTEUgPSBuZXcgU2V0KFsnY2xpZW50LWVycm9yJywgJ2F1dGgtcmVxdWlyZWQnXSk7XG4gIGNvbnN0IGNhbkF1dG9SZXRyeSA9IHBvbGljeS5hdXRvUmV0cnlcbiAgICAmJiBfcmV0cnlBdHRlbXB0Q291bnQgPCBwb2xpY3kubWF4QXR0ZW1wdHNcbiAgICAmJiAhTk9OX1JFVFJZQUJMRS5oYXMoZGVyaXZlZC5raW5kKTtcblxuICBjb25zdCBkZWxheU1zID0gX2NhbGN1bGF0ZVJldHJ5RGVsYXlNcyhkZXJpdmVkLmtpbmQsIGVycm9yKTtcbiAgY29uc3QgdG90YWxTZWNvbmRzID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKGRlbGF5TXMgLyAxMDAwKSk7XG5cbiAgY29uc3QgcmV0cnlBY3Rpb24gPSAoKSA9PiB7XG4gICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWVzc2FnZS1pbnB1dCcpO1xuICAgIGlmIChpbnB1dCkgaW5wdXQudmFsdWUgPSB0ZXh0O1xuICAgIHNlbmRNZXNzYWdlKCk7XG4gIH07XG5cbiAgbGV0IHJldHJ5TWVzc2FnZTtcbiAgY29uc3QgY2FuY2VsRm4gPSBjYW5BdXRvUmV0cnkgPyAoKSA9PiB7XG4gICAgX2NsZWFyUmV0cnlUaW1lcnMoKTtcbiAgICBpZiAocmV0cnlNZXNzYWdlKSByZXRyeU1lc3NhZ2UucmVtb3ZlKCk7XG4gIH0gOiBudWxsO1xuXG4gIHJldHJ5TWVzc2FnZSA9IGFwcGVuZFJldHJ5TWVzc2FnZShcbiAgICBgXHUyNkEwXHVGRTBGICR7ZXJyb3IubWVzc2FnZX1gLFxuICAgICgpID0+IHtcbiAgICAgIF9jbGVhclJldHJ5VGltZXJzKCk7XG4gICAgICBfcmV0cnlBdHRlbXB0Q291bnQgKz0gMTtcbiAgICAgIHJldHJ5QWN0aW9uKCk7XG4gICAgfSxcbiAgICBjYW5BdXRvUmV0cnkgPyBgUmV0cnkgaW4gJHt0b3RhbFNlY29uZHN9c2AgOiAnUmV0cnknLFxuICAgIGNhbmNlbEZuLFxuICApO1xuXG4gIGlmICghY2FuQXV0b1JldHJ5KSByZXR1cm47XG5cbiAgY29uc3QgcmV0cnlCdG4gPSByZXRyeU1lc3NhZ2U/LnF1ZXJ5U2VsZWN0b3IoJ2J1dHRvbicpO1xuICBsZXQgcmVtYWluaW5nID0gdG90YWxTZWNvbmRzO1xuICBpZiAocmV0cnlCdG4pIHtcbiAgICByZXRyeUJ0bi50ZXh0Q29udGVudCA9IGBSZXRyeSBpbiAke3JlbWFpbmluZ31zYDtcbiAgICBpZiAoZGVyaXZlZC5raW5kID09PSAncmF0ZS1saW1pdGVkJykge1xuICAgICAgcmV0cnlCdG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgcmV0cnlCdG4uc3R5bGUub3BhY2l0eSA9ICcwLjcnO1xuICAgICAgcmV0cnlCdG4uc3R5bGUuY3Vyc29yID0gJ25vdC1hbGxvd2VkJztcbiAgICB9XG4gIH1cblxuICBfcmV0cnlJbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICByZW1haW5pbmcgLT0gMTtcbiAgICBpZiAocmV0cnlCdG4gJiYgcmVtYWluaW5nID4gMCkge1xuICAgICAgcmV0cnlCdG4udGV4dENvbnRlbnQgPSBgUmV0cnkgaW4gJHtyZW1haW5pbmd9c2A7XG4gICAgfVxuICAgIGlmIChyZW1haW5pbmcgPD0gMCkge1xuICAgICAgaWYgKHJldHJ5QnRuKSB7XG4gICAgICAgIHJldHJ5QnRuLnRleHRDb250ZW50ID0gJ1JldHJ5IE5vdyc7XG4gICAgICAgIHJldHJ5QnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgIHJldHJ5QnRuLnN0eWxlLm9wYWNpdHkgPSAnJztcbiAgICAgICAgcmV0cnlCdG4uc3R5bGUuY3Vyc29yID0gJyc7XG4gICAgICB9XG4gICAgICBjbGVhckludGVydmFsKF9yZXRyeUludGVydmFsKTtcbiAgICAgIF9yZXRyeUludGVydmFsID0gbnVsbDtcbiAgICB9XG4gIH0sIDEwMDApO1xuXG4gIF9yZXRyeVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgX3JldHJ5VGltZXIgPSBudWxsO1xuICAgIF9yZXRyeUF0dGVtcHRDb3VudCArPSAxO1xuICAgIHJldHJ5TWVzc2FnZT8ucmVtb3ZlKCk7XG4gICAgcmV0cnlBY3Rpb24oKTtcbiAgfSwgZGVsYXlNcyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9wYXJzZUFwaUpzb25SZXNwb25zZShyZXNwb25zZSwgZW5kcG9pbnQpIHtcbiAgY29uc3Qgc3RhdHVzID0gTnVtYmVyKHJlc3BvbnNlPy5zdGF0dXMgfHwgMCk7XG4gIGNvbnN0IHN0YXR1c1RleHQgPSByZXNwb25zZT8uc3RhdHVzVGV4dCB8fCAnVW5rbm93biBTdGF0dXMnO1xuICBjb25zdCBjb250ZW50VHlwZSA9IChyZXNwb25zZT8uaGVhZGVycz8uZ2V0KCdjb250ZW50LXR5cGUnKSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgcmF3ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICBsZXQgZGV0YWlsID0gc3RhdHVzVGV4dDtcbiAgICBpZiAoY29udGVudFR5cGUuaW5jbHVkZXMoJ2FwcGxpY2F0aW9uL2pzb24nKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IEpTT04ucGFyc2UocmF3IHx8ICd7fScpO1xuICAgICAgICBkZXRhaWwgPSBwYXlsb2FkPy5lcnJvciB8fCBwYXlsb2FkPy5tZXNzYWdlIHx8IGRldGFpbDtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBLZWVwIGZhbGxiYWNrIGRldGFpbCBpZiBtYWxmb3JtZWQgSlNPTiBlcnJvciBwYXlsb2FkLlxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoKHJhdyB8fCAnJykudHJpbSgpLnN0YXJ0c1dpdGgoJzwnKSkge1xuICAgICAgZGV0YWlsID0gJ3NlcnZlciByZXR1cm5lZCBIVE1MIGluc3RlYWQgb2YgSlNPTiAocG9zc2libGUgc2Vzc2lvbiByZWRpcmVjdCBvciBiYWNrZW5kIGVycm9yKSc7XG4gICAgfSBlbHNlIGlmICgocmF3IHx8ICcnKS50cmltKCkpIHtcbiAgICAgIGRldGFpbCA9IHJhdy50cmltKCkuc2xpY2UoMCwgMjIwKTtcbiAgICB9XG4gICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoYCR7c3RhdHVzfTogJHtkZXRhaWx9YCk7XG4gICAgZXJyb3Iuc3RhdHVzID0gc3RhdHVzO1xuICAgIGVycm9yLnJldHJ5QWZ0ZXJTZWMgPSBOdW1iZXIocmVzcG9uc2U/LmhlYWRlcnM/LmdldCgncmV0cnktYWZ0ZXInKSB8fCAwKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxuXG4gIGlmICghY29udGVudFR5cGUuaW5jbHVkZXMoJ2FwcGxpY2F0aW9uL2pzb24nKSkge1xuICAgIGNvbnN0IHNuaXBwZXQgPSAocmF3IHx8ICcnKS50cmltKCkuc2xpY2UoMCwgODApO1xuICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihcbiAgICAgIGBFeHBlY3RlZCBKU09OIGZyb20gJHtlbmRwb2ludH0sIGdvdCAke2NvbnRlbnRUeXBlIHx8ICd1bmtub3duIGNvbnRlbnQgdHlwZSd9JHtzbmlwcGV0ID8gYDogJHtzbmlwcGV0fWAgOiAnJ31gLFxuICAgICk7XG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBwYXJzZU1lc3NhZ2VSZXNwb25zZShKU09OLnBhcnNlKHJhdyB8fCAne30nKSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBJbnZhbGlkIEpTT04gZnJvbSAke2VuZHBvaW50fTogJHtlcnJvci5tZXNzYWdlfWApO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9zZXRMaXZlTGxtU3RhdGUoa2luZCwgdGV4dCwgaWNvbiA9ICcnLCB0b29sdGlwID0gJycpIHtcbiAgaWYgKHR5cGVvZiBfdXBkYXRlTGxtU3RhdHVzUGlsbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIF91cGRhdGVMbG1TdGF0dXNQaWxsKGtpbmQsIHRleHQsIGljb24sIHRvb2x0aXApO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9kZXJpdmVFcnJvclN0YXRlKGVycm9yKSB7XG4gIGNvbnN0IG1lc3NhZ2UgPSBTdHJpbmcoZXJyb3I/Lm1lc3NhZ2UgfHwgZXJyb3IgfHwgJ1Vua25vd24gZXJyb3InKTtcbiAgY29uc3QgbG93ZXIgPSBtZXNzYWdlLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IHN0YXR1cyA9IE51bWJlcihlcnJvcj8uc3RhdHVzIHx8IDApO1xuXG4gIGlmIChzdGF0dXMgPT09IDQwMSB8fCBzdGF0dXMgPT09IDQwMyB8fCBtZXNzYWdlLnN0YXJ0c1dpdGgoJzQwMTonKSB8fCBtZXNzYWdlLnN0YXJ0c1dpdGgoJzQwMzonKSB8fCBsb3dlci5pbmNsdWRlcygnYXV0aCcpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtpbmQ6ICdhdXRoLXJlcXVpcmVkJyxcbiAgICAgIHRleHQ6ICdBdXRoZW50aWNhdGlvbiByZXF1aXJlZCcsXG4gICAgICBpY29uOiAnXHVEODNEXHVERDExJyxcbiAgICAgIHRvb2x0aXA6ICdBdXRoZW50aWNhdGlvbiBmYWlsZWQuIENoZWNrIEFQSSBrZXkvdG9rZW4gb3Igc2lnbiBpbiBhZ2Fpbi4nLFxuICAgIH07XG4gIH1cblxuICBpZiAoc3RhdHVzID09PSA0MjkgfHwgbWVzc2FnZS5zdGFydHNXaXRoKCc0Mjk6JykgfHwgbG93ZXIuaW5jbHVkZXMoJ3JhdGUgbGltaXQnKSkge1xuICAgIHJldHVybiB7XG4gICAgICBraW5kOiAncmF0ZS1saW1pdGVkJyxcbiAgICAgIHRleHQ6ICdSYXRlIGxpbWl0ZWQnLFxuICAgICAgaWNvbjogJ1x1MjNGMycsXG4gICAgICB0b29sdGlwOiAnUHJvdmlkZXIgcmF0ZSBsaW1pdCByZWFjaGVkLiBXYWl0IGJyaWVmbHkgYW5kIHJldHJ5LicsXG4gICAgfTtcbiAgfVxuXG4gIGlmIChcbiAgICBzdGF0dXMgPT09IDUwMiB8fFxuICAgIHN0YXR1cyA9PT0gNTAzIHx8XG4gICAgc3RhdHVzID09PSA1MDQgfHxcbiAgICBtZXNzYWdlLnN0YXJ0c1dpdGgoJzUwMjonKSB8fFxuICAgIG1lc3NhZ2Uuc3RhcnRzV2l0aCgnNTAzOicpIHx8XG4gICAgbWVzc2FnZS5zdGFydHNXaXRoKCc1MDQ6JykgfHxcbiAgICBsb3dlci5pbmNsdWRlcygndGltZW91dCcpIHx8XG4gICAgbG93ZXIuaW5jbHVkZXMoJ3VuYXZhaWxhYmxlJykgfHxcbiAgICBsb3dlci5pbmNsdWRlcygnY2Fubm90IHJlYWNoJylcbiAgKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtpbmQ6ICd1bmF2YWlsYWJsZScsXG4gICAgICB0ZXh0OiAnUHJvdmlkZXIgdW5hdmFpbGFibGUnLFxuICAgICAgaWNvbjogJ1x1MjYwMScsXG4gICAgICB0b29sdGlwOiAnUHJvdmlkZXIgaXMgY3VycmVudGx5IHVuYXZhaWxhYmxlIG9yIHVucmVhY2hhYmxlLiBSZXRyeSBzb29uLicsXG4gICAgfTtcbiAgfVxuXG4gIC8vIDR4eCBjbGllbnQgZXJyb3JzIGFyZSBub3QgdHJhbnNpZW50IFx1MjAxNCByZXRyeWluZyB3aWxsIG5vdCBmaXggdGhlbS5cbiAgaWYgKHN0YXR1cyA+PSA0MDAgJiYgc3RhdHVzIDwgNTAwKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtpbmQ6ICdjbGllbnQtZXJyb3InLFxuICAgICAgdGV4dDogJ1JlcXVlc3QgZXJyb3InLFxuICAgICAgaWNvbjogJ1x1MjZBMCcsXG4gICAgICB0b29sdGlwOiBtZXNzYWdlLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGtpbmQ6ICdlcnJvcicsXG4gICAgdGV4dDogJ0Nvbm5lY3Rpb24gZmFpbGVkJyxcbiAgICBpY29uOiAnXHUyNkEwJyxcbiAgICB0b29sdGlwOiBtZXNzYWdlLFxuICB9O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIERlZmF1bHQgTExNIG1lc3NhZ2UgaGFuZGxlclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmFzeW5jIGZ1bmN0aW9uIF9oYW5kbGVMTE1NZXNzYWdlKHRleHQpIHtcbiAgX2NsZWFyUmV0cnlUaW1lcnMoKTtcbiAgc2V0TG9hZGluZyh0cnVlLCAnVGhpbmtpbmdcdTIwMjYnKTtcbiAgX3NldExpdmVMbG1TdGF0ZSgnY29ubmVjdGluZycsICdDb25uZWN0aW5nXHUyMDI2JywgJ1x1MjlENycsICdTZW5kaW5nIHJlcXVlc3QgdG8gcHJvdmlkZXIuJyk7XG4gIGxldCB0ZXJtaW5hbFN0YXRlID0gbnVsbDtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBsbG1GZXRjaCgnL2FwaS9tZXNzYWdlJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgbWVzc2FnZTogdGV4dCB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgX3BhcnNlQXBpSnNvblJlc3BvbnNlKHJlcywgJy9hcGkvbWVzc2FnZScpO1xuXG4gICAgaWYgKGRhdGEuZXJyb3IpIHtcbiAgICAgIGNvbnN0IGVycm9yTXNnID0gZGF0YS5lcnJvci50b1N0cmluZygpO1xuICAgICAgY29uc3QgZGVyaXZlZCA9IF9kZXJpdmVFcnJvclN0YXRlKG5ldyBFcnJvcihlcnJvck1zZykpO1xuICAgICAgX3NldExpdmVMbG1TdGF0ZShkZXJpdmVkLmtpbmQsIGRlcml2ZWQudGV4dCwgZGVyaXZlZC5pY29uLCBkZXJpdmVkLnRvb2x0aXApO1xuICAgICAgX3NjaGVkdWxlUmV0cnkodGV4dCwgZGVyaXZlZCwgbmV3IEVycm9yKGVycm9yTXNnKSk7XG4gICAgICB0ZXJtaW5hbFN0YXRlID0gZGVyaXZlZDtcbiAgICAgIGxvZy5lcnJvcignU2VydmVyIGVycm9yOicsIGRhdGEuZXJyb3IpO1xuICAgIH0gZWxzZSBpZiAoZGF0YS5yZXNwb25zZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY2xlYW5SZXNwb25zZSA9IGRhdGEucmVzcG9uc2U7XG4gICAgICAgIGNvbnN0IHBhcnNlZEN1c3RvbWl6YXRpb24gPSBleHRyYWN0Rmlyc3RKc29uT2JqZWN0KGNsZWFuUmVzcG9uc2UpO1xuICAgICAgICBpZiAocGFyc2VkQ3VzdG9taXphdGlvbiAmJiAocGFyc2VkQ3VzdG9taXphdGlvbi5yZWNvbW1lbmRlZF9leHBlcmllbmNlcyB8fCBwYXJzZWRDdXN0b21pemF0aW9uLnJlY29tbWVuZGVkX3NraWxscykpIHtcbiAgICAgICAgICBjb25zdCBqc29uU3RhcnQgPSBjbGVhblJlc3BvbnNlLmluZGV4T2YoJ3snKTtcbiAgICAgICAgICBjb25zdCB0ZXh0QmVmb3JlSnNvbiA9IGpzb25TdGFydCA+IDAgPyBjbGVhblJlc3BvbnNlLnN1YnN0cmluZygwLCBqc29uU3RhcnQpLnRyaW0oKSA6ICcnO1xuICAgICAgICAgIGlmICh0ZXh0QmVmb3JlSnNvbiAmJiAhdGV4dEJlZm9yZUpzb24uaW5jbHVkZXMoJ3tcImFjdGlvblwiOicpKSB7XG4gICAgICAgICAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCB0ZXh0QmVmb3JlSnNvbik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGF3YWl0IGhhbmRsZUN1c3RvbWl6YXRpb25SZXNwb25zZShwYXJzZWRDdXN0b21pemF0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoY2xlYW5SZXNwb25zZS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgY2xlYW5SZXNwb25zZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nLmVycm9yKCdFcnJvciBwcm9jZXNzaW5nIG1lc3NhZ2UgcmVzcG9uc2U6JywgZXJyLCBkYXRhLnJlc3BvbnNlKTtcbiAgICAgICAgY29uc3QgZGVyaXZlZCA9IF9kZXJpdmVFcnJvclN0YXRlKGVycik7XG4gICAgICAgIF9zZXRMaXZlTGxtU3RhdGUoZGVyaXZlZC5raW5kLCBkZXJpdmVkLnRleHQsIGRlcml2ZWQuaWNvbiwgZGVyaXZlZC50b29sdGlwKTtcbiAgICAgICAgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgYFx1MjZBMFx1RkUwRiBJIGVuY291bnRlcmVkIGFuIGlzc3VlIHByb2Nlc3NpbmcgdGhhdCByZXNwb25zZTogJHtlcnIubWVzc2FnZX0uIFRoZSBjb252ZXJzYXRpb24gaGFzIGJlZW4gc2F2ZWQuYCk7XG4gICAgICAgIHRlcm1pbmFsU3RhdGUgPSBkZXJpdmVkO1xuICAgICAgfVxuICAgICAgY29uc3QgY29ubmVjdGVkU3RhdGUgPSB7IGtpbmQ6ICdjb25uZWN0ZWQnLCB0ZXh0OiAnQ29ubmVjdGVkJywgaWNvbjogJ1x1MjcxMycsIHRvb2x0aXA6ICdQcm92aWRlciByZXNwb25kZWQgc3VjY2Vzc2Z1bGx5IHRvIGEgbGl2ZSByZXF1ZXN0LicgfTtcbiAgICAgIF9zZXRMaXZlTGxtU3RhdGUoY29ubmVjdGVkU3RhdGUua2luZCwgY29ubmVjdGVkU3RhdGUudGV4dCwgY29ubmVjdGVkU3RhdGUuaWNvbiwgY29ubmVjdGVkU3RhdGUudG9vbHRpcCk7XG4gICAgICB0ZXJtaW5hbFN0YXRlID0gY29ubmVjdGVkU3RhdGU7XG4gICAgICBfcmV0cnlBdHRlbXB0Q291bnQgPSAwO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cuZXJyb3IoJz09PSBNRVNTQUdFIEVSUk9SID09PScsIGVycm9yLm5hbWUsIGVycm9yLm1lc3NhZ2UsIGVycm9yLnN0YWNrKTtcbiAgICBpZiAoZXJyb3IubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICAvLyBVc2VyIGNsaWNrZWQgU3RvcCBcdTIwMTQgbWVzc2FnZSBhbHJlYWR5IHNob3duIGJ5IGFib3J0Q3VycmVudFJlcXVlc3QoKS5cbiAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkZXJpdmVkID0gX2Rlcml2ZUVycm9yU3RhdGUoZXJyb3IpO1xuICAgIF9zZXRMaXZlTGxtU3RhdGUoZGVyaXZlZC5raW5kLCBkZXJpdmVkLnRleHQsIGRlcml2ZWQuaWNvbiwgZGVyaXZlZC50b29sdGlwKTtcbiAgICBfc2NoZWR1bGVSZXRyeSh0ZXh0LCBkZXJpdmVkLCBlcnJvcik7XG4gICAgdGVybWluYWxTdGF0ZSA9IGRlcml2ZWQ7XG4gIH1cbiAgc2V0TG9hZGluZyhmYWxzZSk7XG4gIGF3YWl0IGZldGNoU3RhdHVzKCk7XG4gIGlmICh0ZXJtaW5hbFN0YXRlKSB7XG4gICAgX3NldExpdmVMbG1TdGF0ZSh0ZXJtaW5hbFN0YXRlLmtpbmQsIHRlcm1pbmFsU3RhdGUudGV4dCwgdGVybWluYWxTdGF0ZS5pY29uLCB0ZXJtaW5hbFN0YXRlLnRvb2x0aXApO1xuICB9XG4gIGlmICh0eXBlb2YgZmV0Y2hBbmREaXNwbGF5TGxtTG9nID09PSAnZnVuY3Rpb24nKSBmZXRjaEFuZERpc3BsYXlMbG1Mb2coKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBNZXNzYWdlIGRpc3BhdGNoIHRhYmxlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gSGFuZGxlcnMgY2hlY2tlZCBpbiBvcmRlcjsgZmlyc3QgbWF0Y2hpbmcgdGVzdCgpIHdpbnMuXG5jb25zdCBfbWVzc2FnZUhhbmRsZXJzID0gW1xuICB7XG4gICAgdGVzdDogdCA9PiB0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ3JldmlldyByZWNvbW1lbmRhdGlvbnMnKSB8fCB0LnRvTG93ZXJDYXNlKCkgPT09ICdyZXZpZXcnLFxuICAgIGhhbmRsZTogYXN5bmMgKCkgPT4gc2hvd1RhYmxlQmFzZWRSZXZpZXcoKSxcbiAgfSxcbiAge1xuICAgIHRlc3Q6ICgpID0+IHdpbmRvdy53YWl0aW5nRm9yRXhwZXJpZW5jZVJlc3BvbnNlLFxuICAgIGhhbmRsZTogYXN5bmMgdCA9PiBoYW5kbGVFeHBlcmllbmNlUmVzcG9uc2UodCksXG4gIH0sXG4gIHtcbiAgICB0ZXN0OiAoKSA9PiB3aW5kb3cud2FpdGluZ0ZvclNraWxsc1Jlc3BvbnNlLFxuICAgIGhhbmRsZTogYXN5bmMgdCA9PiBoYW5kbGVTa2lsbHNSZXNwb25zZSh0KSxcbiAgfSxcbiAge1xuICAgIC8vIFBvc3QtYW5hbHlzaXMgcXVlc3Rpb24gcmVzcG9uc2UgXHUyMDE0IGxvY2FsIGhhbmRsZXIgKyBiYWNrZW5kIHNhdmUuXG4gICAgdGVzdDogKCkgPT4gd2luZG93LndhaXRpbmdGb3JRdWVzdGlvblJlc3BvbnNlLFxuICAgIGhhbmRsZTogYXN5bmMgdCA9PiB7XG4gICAgICBjb25zdCBxdWVzdGlvbkhhbmRsZWQgPSBoYW5kbGVRdWVzdGlvblJlc3BvbnNlKHQpO1xuICAgICAgc2V0TG9hZGluZyh0cnVlLCAnVGhpbmtpbmdcdTIwMjYnKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGxsbUZldGNoKCcvYXBpL21lc3NhZ2UnLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBtZXNzYWdlOiB0IH0pLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IF9wYXJzZUFwaUpzb25SZXNwb25zZShyZXMsICcvYXBpL21lc3NhZ2UnKTtcbiAgICAgICAgaWYgKGRhdGEuZXJyb3IpIHtcbiAgICAgICAgICBsb2cuZXJyb3IoJ0JhY2tlbmQgZXJyb3Igc2F2aW5nIHF1ZXN0aW9uIHJlc3BvbnNlOicsIGRhdGEuZXJyb3IpO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGEucmVzcG9uc2UgJiYgIXF1ZXN0aW9uSGFuZGxlZCkge1xuICAgICAgICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIGRhdGEucmVzcG9uc2UpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGVyci5uYW1lICE9PSAnQWJvcnRFcnJvcicpIGxvZy5lcnJvcignPT09IFFVRVNUSU9OIFJFU1BPTlNFIFNBVkUgRVJST1IgPT09JywgZXJyKTtcbiAgICAgIH1cbiAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgICAgaWYgKCFxdWVzdGlvbkhhbmRsZWQpIGF3YWl0IF9oYW5kbGVMTE1NZXNzYWdlKHQpO1xuICAgIH0sXG4gIH0sXG4gIHtcbiAgICB0ZXN0OiB0ID0+IHQudG9Mb3dlckNhc2UoKSA9PT0gJ3Byb2NlZWQnLFxuICAgIGhhbmRsZTogYXN5bmMgKCkgPT4gd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnNcbiAgICAgID8gc2hvd1RhYmxlQmFzZWRSZXZpZXcoKVxuICAgICAgOiBzZW5kQWN0aW9uKCdyZWNvbW1lbmRfY3VzdG9taXphdGlvbnMnKSxcbiAgfSxcbiAge1xuICAgIHRlc3Q6ICgpID0+IHRydWUsXG4gICAgaGFuZGxlOiBfaGFuZGxlTExNTWVzc2FnZSxcbiAgfSxcbl07XG5cbmFzeW5jIGZ1bmN0aW9uIHNlbmRNZXNzYWdlKCkge1xuICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZXNzYWdlLWlucHV0Jyk7XG4gIGNvbnN0IHRleHQgPSBub3JtYWxpemVUZXh0KGlucHV0LnZhbHVlKTtcbiAgaWYgKCF0ZXh0IHx8IHN0YXRlTWFuYWdlci5pc0xvYWRpbmcoKSkgcmV0dXJuO1xuXG4gIGlmICghZ2V0U2Vzc2lvbklkRnJvbVVSTCgpKSB7XG4gICAgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgJ1x1MjZBMFx1RkUwRiBObyBhY3RpdmUgc2Vzc2lvbi4gQ3JlYXRlIG9yIGxvYWQgYSBzZXNzaW9uIGJlZm9yZSBzZW5kaW5nIG1lc3NhZ2VzLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGFwcGVuZE1lc3NhZ2UoJ3VzZXInLCB0ZXh0KTtcbiAgaW5wdXQudmFsdWUgPSAnJztcblxuICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgX21lc3NhZ2VIYW5kbGVycykge1xuICAgIGlmIChoYW5kbGVyLnRlc3QodGV4dCkpIHtcbiAgICAgIGF3YWl0IGhhbmRsZXIuaGFuZGxlKHRleHQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEludGFrZSBjb25maXJtYXRpb24gY2FyZCAoR0FQLTIzKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmFzeW5jIGZ1bmN0aW9uIF9zaG93SW50YWtlQ29uZmlybUNhcmQoY29udGludWF0aW9uID0gbnVsbCkge1xuICBpZiAodHlwZW9mIGNvbnRpbnVhdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIF9wZW5kaW5nUG9zdEludGFrZUNvbnRpbnVhdGlvbiA9IGNvbnRpbnVhdGlvbjtcbiAgfVxuXG4gIGxldCBleHRyYWN0ZWQgPSB7cm9sZTogJycsIGNvbXBhbnk6ICcnLCBkYXRlX2FwcGxpZWQ6ICcnfTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgbGxtRmV0Y2goJy9hcGkvaW50YWtlLW1ldGFkYXRhJyk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEuY29uZmlybWVkKSB7XG4gICAgICBhd2FpdCBfcHJvY2VlZEFmdGVySW50YWtlKGNvbnRpbnVhdGlvbik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGV4dHJhY3RlZCA9IGRhdGE7XG4gIH0gY2F0Y2ggKF9lKSB7IC8qIGZhbGwgdGhyb3VnaCB3aXRoIGVtcHR5IGRlZmF1bHRzICovIH1cblxuICBjb25zdCB0b2RheSA9IGV4dHJhY3RlZC5kYXRlX2FwcGxpZWQgfHwgbmV3IERhdGUoKS50b0lTT1N0cmluZygpLnNsaWNlKDAsIDEwKTtcbiAgY29uc3QgY2FyZEh0bWwgPSBgXG4gICAgPGRpdiBjbGFzcz1cImludGFrZS1jb25maXJtLWNhcmRcIiBpZD1cImludGFrZS1jb25maXJtLWNhcmRcIiByb2xlPVwiZm9ybVwiIGFyaWEtbGFiZWw9XCJDb25maXJtIGpvYiBkZXRhaWxzXCI+XG4gICAgICA8aDM+XHVEODNEXHVEQ0NCIENvbmZpcm0gam9iIGRldGFpbHM8L2gzPlxuICAgICAgPHA+UmV2aWV3IHRoZSBleHRyYWN0ZWQgZGV0YWlscyBiZWZvcmUgYW5hbHlzaXMgYmVnaW5zLiBFZGl0IGFueSBmaWVsZCBpZiBuZWVkZWQuPC9wPlxuICAgICAgPGRpdiBjbGFzcz1cImludGFrZS1maWVsZC1yb3dcIj5cbiAgICAgICAgPGxhYmVsIGZvcj1cImludGFrZS1yb2xlLWlucHV0XCI+Um9sZSAvIEpvYiBUaXRsZTwvbGFiZWw+XG4gICAgICAgIDxpbnB1dCBpZD1cImludGFrZS1yb2xlLWlucHV0XCIgdHlwZT1cInRleHRcIiB2YWx1ZT1cIiR7ZXNjYXBlSHRtbChleHRyYWN0ZWQucm9sZSB8fCAnJyl9XCJcbiAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBTZW5pb3IgU29mdHdhcmUgRW5naW5lZXJcIiBhdXRvY29tcGxldGU9XCJvZmZcIj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImludGFrZS1maWVsZC1yb3dcIj5cbiAgICAgICAgPGxhYmVsIGZvcj1cImludGFrZS1jb21wYW55LWlucHV0XCI+Q29tcGFueTwvbGFiZWw+XG4gICAgICAgIDxpbnB1dCBpZD1cImludGFrZS1jb21wYW55LWlucHV0XCIgdHlwZT1cInRleHRcIiB2YWx1ZT1cIiR7ZXNjYXBlSHRtbChleHRyYWN0ZWQuY29tcGFueSB8fCAnJyl9XCJcbiAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBBY21lIENvcnBcIiBhdXRvY29tcGxldGU9XCJvZmZcIj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImludGFrZS1maWVsZC1yb3dcIj5cbiAgICAgICAgPGxhYmVsIGZvcj1cImludGFrZS1kYXRlLWlucHV0XCI+RGF0ZSBBcHBsaWVkPC9sYWJlbD5cbiAgICAgICAgPGlucHV0IGlkPVwiaW50YWtlLWRhdGUtaW5wdXRcIiB0eXBlPVwiZGF0ZVwiIHZhbHVlPVwiJHtlc2NhcGVIdG1sKHRvZGF5KX1cIj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImludGFrZS1hY3Rpb25zXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4tc2Vjb25kYXJ5XCIgb25jbGljaz1cIl9za2lwSW50YWtlQ2FyZCgpXCIgdHlwZT1cImJ1dHRvblwiPlNraXA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1wcmltYXJ5XCIgICBvbmNsaWNrPVwiX3N1Ym1pdEludGFrZUNhcmQoKVwiIHR5cGU9XCJidXR0b25cIiBpZD1cImludGFrZS1jb25maXJtLWJ0blwiPkNvbmZpcm0gJmFtcDsgQ29udGludWU8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PmA7XG4gIGFwcGVuZFJhd0h0bWwoY2FyZEh0bWwpO1xuXG4gIGNvbnN0IHJvbGVJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnRha2Utcm9sZS1pbnB1dCcpO1xuICBpZiAocm9sZUlucHV0ICYmICFyb2xlSW5wdXQudmFsdWUudHJpbSgpKSByb2xlSW5wdXQuZm9jdXMoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gX3N1Ym1pdEludGFrZUNhcmQoY29udGludWF0aW9uID0gbnVsbCkge1xuICBjb25zdCByb2xlICAgICAgICAgPSAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ludGFrZS1yb2xlLWlucHV0Jyk/LnZhbHVlICAgIHx8ICcnKS50cmltKCk7XG4gIGNvbnN0IGNvbXBhbnkgICAgICA9IChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW50YWtlLWNvbXBhbnktaW5wdXQnKT8udmFsdWUgfHwgJycpLnRyaW0oKTtcbiAgY29uc3QgZGF0ZV9hcHBsaWVkID0gKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnRha2UtZGF0ZS1pbnB1dCcpPy52YWx1ZSAgICB8fCAnJykudHJpbSgpO1xuXG4gIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnRha2UtY29uZmlybS1idG4nKTtcbiAgaWYgKGJ0bikgYnRuLmRpc2FibGVkID0gdHJ1ZTtcblxuICB0cnkge1xuICAgIGF3YWl0IGxsbUZldGNoKCcvYXBpL2NvbmZpcm0taW50YWtlJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7J0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ30sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7cm9sZSwgY29tcGFueSwgZGF0ZV9hcHBsaWVkfSksXG4gICAgfSk7XG4gIH0gY2F0Y2ggKF9lKSB7IC8qIG5vbi1mYXRhbCAqLyB9XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ludGFrZS1jb25maXJtLWNhcmQnKT8ucmVtb3ZlKCk7XG4gIGF3YWl0IF9wcm9jZWVkQWZ0ZXJJbnRha2UoY29udGludWF0aW9uKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gX3NraXBJbnRha2VDYXJkKGNvbnRpbnVhdGlvbiA9IG51bGwpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ludGFrZS1jb25maXJtLWNhcmQnKT8ucmVtb3ZlKCk7XG4gIGF3YWl0IF9wcm9jZWVkQWZ0ZXJJbnRha2UoY29udGludWF0aW9uKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gX3Byb2NlZWRBZnRlckludGFrZShjb250aW51YXRpb24gPSBudWxsKSB7XG4gIGNvbnN0IGVmZmVjdGl2ZUNvbnRpbnVhdGlvbiA9XG4gICAgKHR5cGVvZiBjb250aW51YXRpb24gPT09ICdmdW5jdGlvbicgJiYgY29udGludWF0aW9uKVxuICAgIHx8IF9wZW5kaW5nUG9zdEludGFrZUNvbnRpbnVhdGlvblxuICAgIHx8IChhc3luYyAoKSA9PiBhbmFseXplSm9iKCkpO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGxsbUZldGNoKCcvYXBpL3ByaW9yLWNsYXJpZmljYXRpb25zJyk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEuZm91bmQgJiYgZGF0YS5tYXRjaGVzICYmIGRhdGEubWF0Y2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBiZXN0ID0gZGF0YS5tYXRjaGVzWzBdO1xuICAgICAgX3BlbmRpbmdQb3N0SW50YWtlQ29udGludWF0aW9uID0gZWZmZWN0aXZlQ29udGludWF0aW9uO1xuICAgICAgYXdhaXQgX29mZmVyUHJpb3JDbGFyaWZpY2F0aW9ucyhiZXN0KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH0gY2F0Y2ggKF9lKSB7IC8qIGZhbGwgdGhyb3VnaCAqLyB9XG5cbiAgX3BlbmRpbmdQb3N0SW50YWtlQ29udGludWF0aW9uID0gbnVsbDtcbiAgYXdhaXQgZWZmZWN0aXZlQ29udGludWF0aW9uKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9vZmZlclByaW9yQ2xhcmlmaWNhdGlvbnMobWF0Y2gpIHtcbiAgY29uc3Qgcm9sZU5hbWUgPSBlc2NhcGVIdG1sKG1hdGNoLnJvbGUgfHwgbWF0Y2gucG9zaXRpb25fbmFtZSB8fCAnYSBzaW1pbGFyIHJvbGUnKTtcbiAgY29uc3QgYmFubmVySHRtbCA9IGBcbiAgICA8ZGl2IGNsYXNzPVwicHJpb3ItY2xhcmlmaWNhdGlvbnMtYmFubmVyXCIgaWQ9XCJwcmlvci1jbGFyLWJhbm5lclwiIHJvbGU9XCJzdGF0dXNcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwY2ItdGV4dFwiPlxuICAgICAgICBcdUQ4M0RcdURDQTEgRm91bmQgcHJpb3IgYW5zd2VycyBmcm9tIDxzcGFuIGNsYXNzPVwicGNiLXJvbGVcIj4ke3JvbGVOYW1lfTwvc3Bhbj4uXG4gICAgICAgIExvYWQgdGhlbSBhcyBkZWZhdWx0cyBmb3IgdGhlIGNsYXJpZmljYXRpb24gcXVlc3Rpb25zP1xuICAgICAgPC9kaXY+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLXNlY29uZGFyeVwiIG9uY2xpY2s9XCJfZGlzbWlzc1ByaW9yQ2xhcmlmaWNhdGlvbnMoKVwiIHR5cGU9XCJidXR0b25cIj5ObyB0aGFua3M8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJidG4tcHJpbWFyeVwiICAgb25jbGljaz1cIl9sb2FkUHJpb3JDbGFyaWZpY2F0aW9ucygpXCIgdHlwZT1cImJ1dHRvblwiIGlkPVwicGNiLWxvYWQtYnRuXCI+TG9hZCBkZWZhdWx0czwvYnV0dG9uPlxuICAgIDwvZGl2PmA7XG4gIGFwcGVuZFJhd0h0bWwoYmFubmVySHRtbCk7XG5cbiAgd2luZG93Ll9wZW5kaW5nUHJpb3JBbnN3ZXJzID0gbWF0Y2guYW5zd2VycyB8fCB7fTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gX2Rpc21pc3NQcmlvckNsYXJpZmljYXRpb25zKCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJpb3ItY2xhci1iYW5uZXInKT8ucmVtb3ZlKCk7XG4gIGRlbGV0ZSB3aW5kb3cuX3BlbmRpbmdQcmlvckFuc3dlcnM7XG4gIGNvbnN0IGNvbnRpbnVhdGlvbiA9IF9wZW5kaW5nUG9zdEludGFrZUNvbnRpbnVhdGlvbiB8fCAoYXN5bmMgKCkgPT4gYW5hbHl6ZUpvYigpKTtcbiAgX3BlbmRpbmdQb3N0SW50YWtlQ29udGludWF0aW9uID0gbnVsbDtcbiAgYXdhaXQgY29udGludWF0aW9uKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9sb2FkUHJpb3JDbGFyaWZpY2F0aW9ucygpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ByaW9yLWNsYXItYmFubmVyJyk/LnJlbW92ZSgpO1xuICBjb25zdCBhbnN3ZXJzID0gd2luZG93Ll9wZW5kaW5nUHJpb3JBbnN3ZXJzIHx8IHt9O1xuICBkZWxldGUgd2luZG93Ll9wZW5kaW5nUHJpb3JBbnN3ZXJzO1xuICBpZiAodHlwZW9mIHF1ZXN0aW9uQW5zd2VycyA9PT0gJ29iamVjdCcgJiYgcXVlc3Rpb25BbnN3ZXJzICE9PSBudWxsKSB7XG4gICAgT2JqZWN0LmFzc2lnbihxdWVzdGlvbkFuc3dlcnMsIGFuc3dlcnMpO1xuICB9IGVsc2Uge1xuICAgIHdpbmRvdy5xdWVzdGlvbkFuc3dlcnMgPSBPYmplY3QuYXNzaWduKHt9LCBhbnN3ZXJzKTtcbiAgfVxuICBjb25zdCBjb250aW51YXRpb24gPSBfcGVuZGluZ1Bvc3RJbnRha2VDb250aW51YXRpb24gfHwgKGFzeW5jICgpID0+IGFuYWx5emVKb2IoKSk7XG4gIF9wZW5kaW5nUG9zdEludGFrZUNvbnRpbnVhdGlvbiA9IG51bGw7XG4gIGF3YWl0IGNvbnRpbnVhdGlvbigpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgRVMgbW9kdWxlIGV4cG9ydHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5leHBvcnQge1xuICBfaGFuZGxlTExNTWVzc2FnZSxcbiAgX21lc3NhZ2VIYW5kbGVycyxcbiAgc2VuZE1lc3NhZ2UsXG4gIF9zaG93SW50YWtlQ29uZmlybUNhcmQsXG4gIF9zdWJtaXRJbnRha2VDYXJkLFxuICBfc2tpcEludGFrZUNhcmQsXG4gIF9wcm9jZWVkQWZ0ZXJJbnRha2UsXG4gIF9vZmZlclByaW9yQ2xhcmlmaWNhdGlvbnMsXG4gIF9kaXNtaXNzUHJpb3JDbGFyaWZpY2F0aW9ucyxcbiAgX2xvYWRQcmlvckNsYXJpZmljYXRpb25zLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL3F1ZXN0aW9ucy1wYW5lbC5qc1xuICogUG9zdC1hbmFseXNpcyBjbGFyaWZ5aW5nIHF1ZXN0aW9ucyBwYW5lbDogcmVuZGVyLCBkcmFmdCwgc3VibWl0LlxuICpcbiAqIERFUEVOREVOQ0lFUyAoYWxsIG9uIGdsb2JhbFRoaXMgYXQgcnVudGltZSk6XG4gKiAgIC0gY2xlYW5Kc29uUmVzcG9uc2UgKHV0aWxzLmpzKVxuICogICAtIG1lcmdlUG9zdEFuYWx5c2lzUXVlc3Rpb25zLCBub3JtYWxpemVQb3N0QW5hbHlzaXNRdWVzdGlvbnMgKGpvYi1hbmFseXNpcy5qcylcbiAqICAgLSBidWlsZEZhbGxiYWNrUG9zdEFuYWx5c2lzUXVlc3Rpb25zIChyZWNvbW1lbmRhdGlvbi1oZWxwZXJzLmpzKVxuICogICAtIGFwcGVuZE1lc3NhZ2UgKG1lc3NhZ2UtcXVldWUuanMpXG4gKiAgIC0gc2VuZEFjdGlvbiAoc2Vzc2lvbi1hY3Rpb25zLmpzKVxuICogICAtIGVzY2FwZUh0bWwgKHV0aWxzLmpzKVxuICogICAtIHN3aXRjaFRhYiAocmV2aWV3LXRhYmxlLWJhc2UuanMsIFRpZXIgNClcbiAqICAgLSBzdGF0ZU1hbmFnZXIgKHN0YXRlLW1hbmFnZXIuanMgXHUyMDE0IGdldFRhYkRhdGEoKSlcbiAqICAgLSBwb3N0QW5hbHlzaXNRdWVzdGlvbnMsIHF1ZXN0aW9uQW5zd2VycyAod2luZG93IGdsb2JhbHMpXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdxdWVzdGlvbnMtcGFuZWwnKTtcblxuaW1wb3J0IHsgc3RhdGVNYW5hZ2VyIH0gZnJvbSAnLi9zdGF0ZS1tYW5hZ2VyLmpzJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTdGF0ZSBwZXJzaXN0ZW5jZSBoZWxwZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuYXN5bmMgZnVuY3Rpb24gcGVyc2lzdFBvc3RBbmFseXNpc1N0YXRlKCkge1xuICB0cnkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zKSkge1xuICAgICAgd2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucyA9IFtdO1xuICAgIH1cbiAgICBpZiAoIXdpbmRvdy5xdWVzdGlvbkFuc3dlcnMgfHwgdHlwZW9mIHdpbmRvdy5xdWVzdGlvbkFuc3dlcnMgIT09ICdvYmplY3QnKSB7XG4gICAgICB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzID0ge307XG4gICAgfVxuXG4gICAgYXdhaXQgZmV0Y2goJy9hcGkvcG9zdC1hbmFseXNpcy1yZXNwb25zZXMnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBxdWVzdGlvbnM6IHdpbmRvdy5wb3N0QW5hbHlzaXNRdWVzdGlvbnMsXG4gICAgICAgIGFuc3dlcnM6IHdpbmRvdy5xdWVzdGlvbkFuc3dlcnNcbiAgICAgIH0pXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nLndhcm4oJ0ZhaWxlZCB0byBwZXJzaXN0IHBvc3QtYW5hbHlzaXMgc3RhdGU6JywgZXJyb3IpO1xuICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gTWFya2Rvd24gcmVuZGVyZXIgZm9yIHF1ZXN0aW9uIHRleHRcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiByZW5kZXJRdWVzdGlvbk1hcmtkb3duKG1hcmtkb3duVGV4dCkge1xuICBjb25zdCBzYWZlID0gZXNjYXBlSHRtbChtYXJrZG93blRleHQgfHwgJycpO1xuICByZXR1cm4gc2FmZVxuICAgIC5yZXBsYWNlKC9cXCpcXCooLis/KVxcKlxcKi9nLCAnPHN0cm9uZz4kMTwvc3Ryb25nPicpXG4gICAgLnJlcGxhY2UoL1xcKiguKz8pXFwqL2csICc8ZW0+JDE8L2VtPicpXG4gICAgLnJlcGxhY2UoL2AoW15gXSspYC9nLCAnPGNvZGU+JDE8L2NvZGU+JylcbiAgICAucmVwbGFjZSgvXFxuL2csICc8YnI+Jyk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQVBJIGZldGNoIGZvciBxdWVzdGlvbnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaFBvc3RBbmFseXNpc1F1ZXN0aW9uc0Zyb21BcGkoYW5hbHlzaXNEYXRhKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvcG9zdC1hbmFseXNpcy1xdWVzdGlvbnMnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBhbmFseXNpczogYW5hbHlzaXNEYXRhIH0pXG4gICAgfSk7XG4gICAgaWYgKCFyZXMub2spIHJldHVybiBbXTtcbiAgICBjb25zdCBwYXlsb2FkID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICByZXR1cm4gbm9ybWFsaXplUG9zdEFuYWx5c2lzUXVlc3Rpb25zKHBheWxvYWQucXVlc3Rpb25zKTtcbiAgfSBjYXRjaCAoYXBpRXJyb3IpIHtcbiAgICBsb2cud2FybignRmFpbGVkIHRvIGZldGNoIHBvc3QtYW5hbHlzaXMgcXVlc3Rpb25zOicsIGFwaUVycm9yKTtcbiAgICByZXR1cm4gW107XG4gIH1cbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBNYWluIG9yY2hlc3RyYXRvcjogY2FsbGVkIGFmdGVyIGFuYWx5emVKb2IgY29tcGxldGVzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuYXN5bmMgZnVuY3Rpb24gYXNrUG9zdEFuYWx5c2lzUXVlc3Rpb25zKGFuYWx5c2lzUmVzdWx0LCBwcmVmZXJyZWRRdWVzdGlvbnMgPSBudWxsKSB7XG4gIHRyeSB7XG4gICAgbGV0IGRhdGE7XG4gICAgaWYgKGFuYWx5c2lzUmVzdWx0ICE9PSBudWxsICYmIHR5cGVvZiBhbmFseXNpc1Jlc3VsdCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGRhdGEgPSBhbmFseXNpc1Jlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY2xlYW5SZXN1bHQgPSBjbGVhbkpzb25SZXNwb25zZShhbmFseXNpc1Jlc3VsdCk7XG4gICAgICBkYXRhID0gdHlwZW9mIGNsZWFuUmVzdWx0ID09PSAnc3RyaW5nJyA/IEpTT04ucGFyc2UoY2xlYW5SZXN1bHQpIDogY2xlYW5SZXN1bHQ7XG4gICAgfVxuXG4gICAgd2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucyA9IG1lcmdlUG9zdEFuYWx5c2lzUXVlc3Rpb25zKFtdLCBwcmVmZXJyZWRRdWVzdGlvbnMpO1xuXG4gICAgaWYgKHdpbmRvdy5wb3N0QW5hbHlzaXNRdWVzdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zID0gYXdhaXQgZmV0Y2hQb3N0QW5hbHlzaXNRdWVzdGlvbnNGcm9tQXBpKGRhdGEpO1xuICAgIH1cblxuICAgIGlmICh3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgd2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucyA9IGJ1aWxkRmFsbGJhY2tQb3N0QW5hbHlzaXNRdWVzdGlvbnMoZGF0YSk7XG4gICAgfVxuXG4gICAgaWYgKCF3aW5kb3cucXVlc3Rpb25BbnN3ZXJzIHx8IHR5cGVvZiB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzICE9PSAnb2JqZWN0Jykge1xuICAgICAgd2luZG93LnF1ZXN0aW9uQW5zd2VycyA9IHt9O1xuICAgIH1cbiAgICBhd2FpdCBwZXJzaXN0UG9zdEFuYWx5c2lzU3RhdGUoKTtcblxuICAgIGlmICh3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHJlbmRlclF1ZXN0aW9uc1BhbmVsKCk7XG4gICAgICBzd2l0Y2hUYWIoJ3F1ZXN0aW9ucycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCAnQW5hbHlzaXMgY29tcGxldGUhIE5vIGNsYXJpZnlpbmcgcXVlc3Rpb25zIG5lZWRlZC4gR2VuZXJhdGluZyBjdXN0b21pemF0aW9uIHJlY29tbWVuZGF0aW9uc1x1MjAyNicpO1xuICAgICAgYXdhaXQgc2VuZEFjdGlvbigncmVjb21tZW5kX2N1c3RvbWl6YXRpb25zJyk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nLmVycm9yKCdFcnJvciBwYXJzaW5nIGFuYWx5c2lzIGZvciBxdWVzdGlvbnM6JywgZSk7XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ0FuYWx5c2lzIGNvbXBsZXRlISBDbGljayBcIlJlY29tbWVuZCBDdXN0b21pemF0aW9uc1wiIHdoZW4gcmVhZHkuJyk7XG4gIH1cbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBUYWIgcG9wdWxhdGlvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIHBvcHVsYXRlUXVlc3Rpb25zVGFiKCkge1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgaWYgKCFjb250ZW50KSByZXR1cm47XG5cbiAgaWYgKCFzdGF0ZU1hbmFnZXIuZ2V0VGFiRGF0YSgnYW5hbHlzaXMnKSkge1xuICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJlbXB0eS1zdGF0ZVwiPjxkaXYgY2xhc3M9XCJpY29uXCI+XHVEODNEXHVEQ0FDPC9kaXY+PGgzPk5vIFF1ZXN0aW9ucyBZZXQ8L2gzPjxwPlJ1biBcIkFuYWx5c2UgSm9iXCIgZmlyc3QgdG8gZ2VuZXJhdGUgY2xhcmlmeWluZyBxdWVzdGlvbnMuPC9wPjwvZGl2Pic7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgaGFzUXVlc3Rpb25zID0gQXJyYXkuaXNBcnJheSh3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zKSAmJiB3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zLmxlbmd0aCA+IDA7XG4gIGlmICghaGFzUXVlc3Rpb25zKSB7XG4gICAgY29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImVtcHR5LXN0YXRlXCI+PGRpdiBjbGFzcz1cImljb25cIj5cdTI3MDU8L2Rpdj48aDM+UXVlc3Rpb25zIENvbXBsZXRlPC9oMz48cD5ObyBwZW5kaW5nIGNsYXJpZnlpbmcgcXVlc3Rpb25zIFx1MjAxNCBjdXN0b21pemF0aW9uIHJlY29tbWVuZGF0aW9ucyB3aWxsIGJlIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LjwvcD48L2Rpdj4nO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIF9jdXJyZW50R3JvdXAgPSAwO1xuICBjb250ZW50LmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwiYW5hbHlzaXMtcGFnZVwiPjxkaXYgY2xhc3M9XCJhbmFseXNpcy1zZWN0aW9uXCI+PGgyPlx1RDgzRFx1RENBQyBDbGFyaWZ5aW5nIFF1ZXN0aW9uczwvaDI+PHAgc3R5bGU9XCJjb2xvcjojNjQ3NDhiOyBtYXJnaW46IDA7XCI+UGxlYXNlIGFuc3dlciBlYWNoIHF1ZXN0aW9uIHRvIGltcHJvdmUgcmVjb21tZW5kYXRpb24gcXVhbGl0eS48L3A+PC9kaXY+PC9kaXY+JztcbiAgcmVuZGVyUXVlc3Rpb25zUGFuZWwoKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBQYW5lbCByZW5kZXJlclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIHJlbmRlclF1ZXN0aW9uc1BhbmVsKCkge1xuICBjb25zdCBxcyA9IHdpbmRvdy5wb3N0QW5hbHlzaXNRdWVzdGlvbnMgfHwgW107XG4gIGlmIChxcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgaWYgKCFjb250ZW50KSByZXR1cm47XG5cbiAgY29uc3QgZXhpc3RpbmcgPSBjb250ZW50LnF1ZXJ5U2VsZWN0b3IoJy5xdWVzdGlvbnMtcGFuZWwnKTtcbiAgaWYgKGV4aXN0aW5nKSBleGlzdGluZy5yZW1vdmUoKTtcblxuICBjb25zdCB0b3RhbCAgICAgID0gcXMubGVuZ3RoO1xuICBjb25zdCBudW1Hcm91cHMgID0gTWF0aC5jZWlsKHRvdGFsIC8gR1JPVVBfU0laRSk7XG4gIC8vIENsYW1wIGdyb3VwIGluZGV4IGluIGNhc2UgcXMgc2hyYW5rIHNpbmNlIGxhc3QgcmVuZGVyLlxuICBfY3VycmVudEdyb3VwICAgID0gTWF0aC5taW4oX2N1cnJlbnRHcm91cCwgbnVtR3JvdXBzIC0gMSk7XG4gIGNvbnN0IGdyb3VwU3RhcnQgPSBfY3VycmVudEdyb3VwICogR1JPVVBfU0laRTtcbiAgY29uc3QgZ3JvdXBFbmQgICA9IE1hdGgubWluKGdyb3VwU3RhcnQgKyBHUk9VUF9TSVpFLCB0b3RhbCk7XG4gIGNvbnN0IGdyb3VwUXMgICAgPSBxcy5zbGljZShncm91cFN0YXJ0LCBncm91cEVuZCk7XG4gIGNvbnN0IGlzTGFzdEdyb3VwID0gX2N1cnJlbnRHcm91cCA9PT0gbnVtR3JvdXBzIC0gMTtcblxuICBjb25zdCBleGlzdGluZ0Fuc3dlcnMgPSAod2luZG93LnF1ZXN0aW9uQW5zd2VycyAmJiB0eXBlb2Ygd2luZG93LnF1ZXN0aW9uQW5zd2VycyA9PT0gJ29iamVjdCcpXG4gICAgPyB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzIDoge307XG5cbiAgY29uc3QgZ3JvdXBMYWJlbCA9IG51bUdyb3VwcyA+IDFcbiAgICA/IGBHcm91cCAke19jdXJyZW50R3JvdXAgKyAxfSBvZiAke251bUdyb3Vwc31gXG4gICAgOiBgJHt0b3RhbH0gcXVlc3Rpb24ke3RvdGFsID4gMSA/ICdzJyA6ICcnfWA7XG5cbiAgY29uc3QgZ3JvdXBOYXZIdG1sID0gbnVtR3JvdXBzID4gMSA/IHJlbmRlclFHcm91cE5hdihudW1Hcm91cHMsIHFzLCBleGlzdGluZ0Fuc3dlcnMpIDogJyc7XG5cbiAgbGV0IHBhbmVsSHRtbCA9IGA8ZGl2IGNsYXNzPVwicXVlc3Rpb25zLXBhbmVsXCIgaWQ9XCJxdWVzdGlvbnMtcGFuZWxcIj5cbiAgICA8aDI+XHVEODNEXHVEQ0FDIEEgZmV3IHF1aWNrIHF1ZXN0aW9uczwvaDI+XG4gICAgPHAgY2xhc3M9XCJxLXByb2dyZXNzXCIgaWQ9XCJxLXByb2dyZXNzXCI+JHtncm91cExhYmVsfSBcdTIwMTQgYW5zd2VyIGVhY2ggdG8gY29udGludWUuPC9wPlxuICAgICR7Z3JvdXBOYXZIdG1sfWA7XG5cbiAgZ3JvdXBRcy5mb3JFYWNoKChxLCBsb2NhbElkeCkgPT4ge1xuICAgIGNvbnN0IGlkeCA9IGdyb3VwU3RhcnQgKyBsb2NhbElkeDtcbiAgICBjb25zdCBzYXZlZEFuc3dlciA9IChleGlzdGluZ0Fuc3dlcnNbcS50eXBlXSB8fCAnJykudG9TdHJpbmcoKTtcbiAgICBjb25zdCBpc0Fuc3dlcmVkICA9IHNhdmVkQW5zd2VyLnRyaW0oKS5sZW5ndGggPiAwO1xuICAgIGNvbnN0IHJlbmRlcmVkUXVlc3Rpb24gPSByZW5kZXJRdWVzdGlvbk1hcmtkb3duKHEucXVlc3Rpb24pO1xuICAgIGNvbnN0IGNoaXBzID0gKHEuY2hvaWNlcyB8fCBbXSkubWFwKChjLCBjaSkgPT5cbiAgICAgIGA8YnV0dG9uIGNsYXNzPVwicS1jaGlwXCIgZGF0YS1xaWR4PVwiJHtpZHh9XCIgZGF0YS1jaWR4PVwiJHtjaX1cIiBvbmNsaWNrPVwic2VsZWN0UUNoaXAodGhpcywgJHtpZHh9KVwiPiR7ZXNjYXBlSHRtbChjKX08L2J1dHRvbj5gXG4gICAgKS5qb2luKCcnKTtcbiAgICBwYW5lbEh0bWwgKz0gYFxuICAgICAgPGRpdiBjbGFzcz1cInF1ZXN0aW9uLWl0ZW0ke2lzQW5zd2VyZWQgPyAnIGFuc3dlcmVkJyA6ICcnfVwiIGlkPVwicS1pdGVtLSR7aWR4fVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicS1oZWFkZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicS10ZXh0XCI+JHtpZHggKyAxfS4gJHtyZW5kZXJlZFF1ZXN0aW9ufTwvZGl2PlxuICAgICAgICAgICR7aXNBbnN3ZXJlZCA/ICc8c3BhbiBjbGFzcz1cInEtYW5zd2VyZWQtYmFkZ2VcIj5cdTI3MTMgQW5zd2VyZWQ8L3NwYW4+JyA6ICcnfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgJHtjaGlwcyA/IGA8ZGl2IGNsYXNzPVwicS1jaGlwc1wiPiR7Y2hpcHN9PC9kaXY+YCA6ICcnfVxuICAgICAgICA8ZGl2IGNsYXNzPVwicS1hbnN3ZXItcm93XCI+XG4gICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwicS1pbnB1dFwiIGlkPVwicS1pbnB1dC0ke2lkeH1cIiBwbGFjZWhvbGRlcj1cIllvdXIgYW5zd2VyXHUyMDI2XCIgb25pbnB1dD1cIm9uUUlucHV0Q2hhbmdlKCR7aWR4fSlcIj4ke2VzY2FwZUh0bWwoc2F2ZWRBbnN3ZXIpfTwvdGV4dGFyZWE+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInEtZHJhZnQtYnRuXCIgaWQ9XCJxLWRyYWZ0LWJ0bi0ke2lkeH1cIiBvbmNsaWNrPVwiZHJhZnRRdWVzdGlvblJlc3BvbnNlKCR7aWR4fSlcIiB0aXRsZT1cIkdlbmVyYXRlIGEgZHJhZnQgYW5zd2VyIHVzaW5nIEFJXCI+XHUyNzI4IERyYWZ0PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+YDtcbiAgfSk7XG5cbiAgaWYgKGlzTGFzdEdyb3VwKSB7XG4gICAgcGFuZWxIdG1sICs9IGA8YnV0dG9uIGNsYXNzPVwicXVlc3Rpb25zLXN1Ym1pdC1idG5cIiBpZD1cInEtc3VibWl0LWJ0blwiIG9uY2xpY2s9XCJzdWJtaXRBbGxBbnN3ZXJzKClcIiBkaXNhYmxlZD5TdWJtaXQgQW5zd2VyczwvYnV0dG9uPmA7XG4gIH0gZWxzZSB7XG4gICAgcGFuZWxIdG1sICs9IGA8YnV0dG9uIGNsYXNzPVwicXVlc3Rpb25zLXN1Ym1pdC1idG5cIiBpZD1cInEtc3VibWl0LWJ0blwiIG9uY2xpY2s9XCJhZHZhbmNlUUdyb3VwKClcIiBkaXNhYmxlZD5Db250aW51ZSBcdTIxOTIgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC44ZW07Zm9udC13ZWlnaHQ6NDAwO1wiPigke2dyb3VwRW5kfSBvZiAke3RvdGFsfSBhbnN3ZXJlZCk8L3NwYW4+PC9idXR0b24+YDtcbiAgfVxuICBwYW5lbEh0bWwgKz0gJzwvZGl2Pic7XG5cbiAgY29udGVudC5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsIHBhbmVsSHRtbCk7XG5cbiAgLy8gUmVzdG9yZSBjaGlwIHNlbGVjdGlvbiBmb3IgYW55IHF1ZXN0aW9uIHdob3NlIHNhdmVkIGFuc3dlciBtYXRjaGVzIGEgY2hpcCBsYWJlbC5cbiAgZ3JvdXBRcy5mb3JFYWNoKChxLCBsb2NhbElkeCkgPT4ge1xuICAgIGNvbnN0IGlkeCA9IGdyb3VwU3RhcnQgKyBsb2NhbElkeDtcbiAgICBjb25zdCBzYXZlZCA9IChleGlzdGluZ0Fuc3dlcnNbcS50eXBlXSB8fCAnJykudG9TdHJpbmcoKS50cmltKCk7XG4gICAgaWYgKCFzYXZlZCkgcmV0dXJuO1xuICAgIGNvbnN0IGl0ZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcS1pdGVtLSR7aWR4fWApO1xuICAgIGlmICghaXRlbSkgcmV0dXJuO1xuICAgIGl0ZW0ucXVlcnlTZWxlY3RvckFsbCgnLnEtY2hpcCcpLmZvckVhY2goY2hpcCA9PiB7XG4gICAgICBpZiAoKGNoaXAudGV4dENvbnRlbnQgfHwgJycpLnRyaW0oKSA9PT0gc2F2ZWQpIGNoaXAuY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgdXBkYXRlUVByb2dyZXNzKCk7XG59XG5cbi8vIEdyb3VwLW5hdmlnYXRpb24gc3RyaXAgKEdBUC0xNiBQYXJ0IEQpOiBsZXRzIHRoZSB1c2VyIGp1bXAgYmFjayB0byBhblxuLy8gZWFybGllciBncm91cCB0byByZXZpZXcvZWRpdCBpdCB3aXRob3V0IGxvc2luZyBmb3J3YXJkIHByb2dyZXNzLiBUaGVzZVxuLy8gYXJlIHBsYWluIGJ1dHRvbnMsIG5vdCBhbiBBUklBIHRhYmxpc3QgXHUyMDE0IG5vIGFycm93LWtleSByb3ZpbmcgaXMgaW1wbGVtZW50ZWQsXG4vLyBzbyBhIHRhYi90YWJsaXN0IHJvbGUgd291bGQgc2V0IGEgZmFsc2UgZXhwZWN0YXRpb24gZm9yIHNjcmVlbiByZWFkZXJzLlxuZnVuY3Rpb24gX2lzR3JvdXBGdWxseUFuc3dlcmVkKGdyb3VwSWR4LCBxcywgZXhpc3RpbmdBbnN3ZXJzKSB7XG4gIGNvbnN0IGdyb3VwU3RhcnQgPSBncm91cElkeCAqIEdST1VQX1NJWkU7XG4gIGNvbnN0IGdyb3VwRW5kICAgID0gTWF0aC5taW4oZ3JvdXBTdGFydCArIEdST1VQX1NJWkUsIHFzLmxlbmd0aCk7XG4gIGZvciAobGV0IGlkeCA9IGdyb3VwU3RhcnQ7IGlkeCA8IGdyb3VwRW5kOyBpZHgrKykge1xuICAgIGNvbnN0IHEgPSBxc1tpZHhdO1xuICAgIGlmICghcSkgY29udGludWU7XG4gICAgaWYgKCEoZXhpc3RpbmdBbnN3ZXJzW3EudHlwZV0gfHwgJycpLnRvU3RyaW5nKCkudHJpbSgpKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclFHcm91cE5hdihudW1Hcm91cHMsIHFzLCBleGlzdGluZ0Fuc3dlcnMpIHtcbiAgY29uc3QgZG90cyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUdyb3VwczsgaSsrKSB7XG4gICAgY29uc3QgaXNBY3RpdmUgPSBpID09PSBfY3VycmVudEdyb3VwO1xuICAgIGNvbnN0IGlzRG9uZSAgID0gIWlzQWN0aXZlICYmIF9pc0dyb3VwRnVsbHlBbnN3ZXJlZChpLCBxcywgZXhpc3RpbmdBbnN3ZXJzKTtcbiAgICBjb25zdCBjbHMgPSBbJ3EtZ3JvdXAtZG90J107XG4gICAgaWYgKGlzQWN0aXZlKSBjbHMucHVzaCgnYWN0aXZlJyk7XG4gICAgaWYgKGlzRG9uZSkgY2xzLnB1c2goJ2RvbmUnKTtcbiAgICBjb25zdCBzdGF0ZUxhYmVsID0gaXNBY3RpdmUgPyAnY3VycmVudCcgOiBpc0RvbmUgPyAnY29tcGxldGVkJyA6ICdub3QgeWV0IGFuc3dlcmVkJztcbiAgICBjb25zdCBhcmlhTGFiZWwgPSBgUmV2aWV3IGFuc3dlcnMgZm9yIEdyb3VwICR7aSArIDF9LCAke3N0YXRlTGFiZWx9IFx1MjAxNCBubyByZXN1Ym1pc3Npb25gO1xuICAgIGRvdHMucHVzaChcbiAgICAgIGA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIiR7Y2xzLmpvaW4oJyAnKX1cIiBkYXRhLWdyb3VwPVwiJHtpfVwiYCArXG4gICAgICBgJHtpc0FjdGl2ZSA/ICcgYXJpYS1jdXJyZW50PVwic3RlcFwiJyA6ICcnfSBhcmlhLWxhYmVsPVwiJHtlc2NhcGVIdG1sKGFyaWFMYWJlbCl9XCJgICtcbiAgICAgIGAgb25jbGljaz1cImp1bXBUb1FHcm91cCgke2l9KVwiPiR7aXNEb25lID8gJ1x1MjcxMycgOiBpICsgMX08L2J1dHRvbj5gXG4gICAgKTtcbiAgfVxuICByZXR1cm4gYDxkaXYgY2xhc3M9XCJxLWdyb3VwLW5hdlwiIGFyaWEtbGFiZWw9XCJRdWVzdGlvbiBncm91cHNcIj4ke2RvdHMuam9pbignJyl9PC9kaXY+YDtcbn1cblxuLy8gRmx1c2ggdGhlIGN1cnJlbnQgZ3JvdXAncyB0ZXh0YXJlYSB2YWx1ZXMgaW50byB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzLlxuLy8gU2hhcmVkIGJ5IGFkdmFuY2VRR3JvdXAoKSAoZm9yd2FyZCBwcm9ncmVzc2lvbikgYW5kIGp1bXBUb1FHcm91cCgpXG4vLyAoYmFja3dhcmQgbmF2aWdhdGlvbikgc28gYm90aCBwZXJzaXN0IGluLXByb2dyZXNzIGVkaXRzIHRoZSBzYW1lIHdheS5cbmZ1bmN0aW9uIF9mbHVzaEN1cnJlbnRHcm91cEFuc3dlcnMoKSB7XG4gIGNvbnN0IHFzID0gd2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucyB8fCBbXTtcbiAgY29uc3QgZ3JvdXBTdGFydCA9IF9jdXJyZW50R3JvdXAgKiBHUk9VUF9TSVpFO1xuICBjb25zdCBncm91cEVuZCAgID0gTWF0aC5taW4oZ3JvdXBTdGFydCArIEdST1VQX1NJWkUsIHFzLmxlbmd0aCk7XG4gIGZvciAobGV0IGlkeCA9IGdyb3VwU3RhcnQ7IGlkeCA8IGdyb3VwRW5kOyBpZHgrKykge1xuICAgIGNvbnN0IHEgID0gcXNbaWR4XTtcbiAgICBjb25zdCB0YSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBxLWlucHV0LSR7aWR4fWApO1xuICAgIGlmIChxICYmIHRhICYmIHRhLnZhbHVlLnRyaW0oKSkge1xuICAgICAgaWYgKCF3aW5kb3cucXVlc3Rpb25BbnN3ZXJzKSB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzID0ge307XG4gICAgICB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzW3EudHlwZV0gPSB0YS52YWx1ZS50cmltKCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFkdmFuY2VRR3JvdXAoKSB7XG4gIF9mbHVzaEN1cnJlbnRHcm91cEFuc3dlcnMoKTtcbiAgcGVyc2lzdFBvc3RBbmFseXNpc1N0YXRlKCk7XG4gIF9jdXJyZW50R3JvdXArKztcbiAgcmVuZGVyUXVlc3Rpb25zUGFuZWwoKTtcbn1cblxuLy8gSnVtcCBiYWNrIChvciBmb3J3YXJkKSB0byBhIHNwZWNpZmljIGdyb3VwIHdpdGhvdXQgcmVxdWlyaW5nIHRoZSBjdXJyZW50XG4vLyBncm91cCB0byBiZSBjb21wbGV0ZS4gRmx1c2hlcyBpbi1wcm9ncmVzcyBhbnN3ZXJzIGZpcnN0IHNvIG5vdGhpbmcgdHlwZWRcbi8vIHNvIGZhciBpcyBsb3N0LCBidXQgXHUyMDE0IHVubGlrZSBhZHZhbmNlUUdyb3VwKCkgXHUyMDE0IGRvZXMgbm90IGdhdGUgb24gY29tcGxldGVuZXNzXG4vLyBhbmQgZG9lcyBub3QgcmVzdWJtaXQgYW55dGhpbmcuXG5mdW5jdGlvbiBqdW1wVG9RR3JvdXAodGFyZ2V0R3JvdXApIHtcbiAgX2ZsdXNoQ3VycmVudEdyb3VwQW5zd2VycygpO1xuICBwZXJzaXN0UG9zdEFuYWx5c2lzU3RhdGUoKTtcbiAgX2N1cnJlbnRHcm91cCA9IHRhcmdldEdyb3VwO1xuICByZW5kZXJRdWVzdGlvbnNQYW5lbCgpO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEludGVyYWN0aW9uIGhhbmRsZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuYXN5bmMgZnVuY3Rpb24gZHJhZnRRdWVzdGlvblJlc3BvbnNlKGlkeCkge1xuICBjb25zdCBxcyA9IHdpbmRvdy5wb3N0QW5hbHlzaXNRdWVzdGlvbnMgfHwgW107XG4gIGNvbnN0IHEgID0gcXNbaWR4XTtcbiAgaWYgKCFxKSByZXR1cm47XG5cbiAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHEtZHJhZnQtYnRuLSR7aWR4fWApO1xuICBjb25zdCB0YSAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcS1pbnB1dC0ke2lkeH1gKTtcbiAgaWYgKCFidG4gfHwgIXRhKSByZXR1cm47XG5cbiAgYnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgYnRuLmlubmVySFRNTCA9ICc8c3BhbiBjbGFzcz1cInNwaW5uZXJcIiBzdHlsZT1cImRpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjExcHg7aGVpZ2h0OjExcHg7Ym9yZGVyOjJweCBzb2xpZCBjdXJyZW50Q29sb3I7Ym9yZGVyLXRvcC1jb2xvcjp0cmFuc3BhcmVudDtib3JkZXItcmFkaXVzOjUwJTthbmltYXRpb246c3BpbiAwLjdzIGxpbmVhciBpbmZpbml0ZTt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7XCI+PC9zcGFuPic7XG5cbiAgdHJ5IHtcbiAgICBsZXQgYW5hbHlzaXNQYXlsb2FkID0gbnVsbDtcbiAgICBjb25zdCBhbmFseXNpc1N0YXRlID0gc3RhdGVNYW5hZ2VyLmdldFRhYkRhdGEoJ2FuYWx5c2lzJyk7XG4gICAgaWYgKGFuYWx5c2lzU3RhdGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNsZWFuZWQgPSBjbGVhbkpzb25SZXNwb25zZShhbmFseXNpc1N0YXRlKTtcbiAgICAgICAgYW5hbHlzaXNQYXlsb2FkID0gdHlwZW9mIGNsZWFuZWQgPT09ICdzdHJpbmcnID8gSlNPTi5wYXJzZShjbGVhbmVkKSA6IGNsZWFuZWQ7XG4gICAgICB9IGNhdGNoIChfKSB7IC8qIHVzZSBudWxsICovIH1cbiAgICB9XG5cbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9wb3N0LWFuYWx5c2lzLWRyYWZ0LXJlc3BvbnNlJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcXVlc3Rpb246IHEucXVlc3Rpb24sIHF1ZXN0aW9uX3R5cGU6IHEudHlwZSwgYW5hbHlzaXM6IGFuYWx5c2lzUGF5bG9hZCB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vayAmJiBkYXRhLnRleHQpIHtcbiAgICAgIHRhLnZhbHVlID0gZGF0YS50ZXh0O1xuICAgICAgdXBkYXRlUVByb2dyZXNzKCk7XG4gICAgICBjb25zdCBpdGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHEtaXRlbS0ke2lkeH1gKTtcbiAgICAgIGlmIChpdGVtKSBpdGVtLnF1ZXJ5U2VsZWN0b3JBbGwoJy5xLWNoaXAnKS5mb3JFYWNoKGMgPT4gYy5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpKTtcbiAgICAgIHNob3dEcmFmdEVycm9yKGlkeCwgbnVsbCk7XG4gICAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCBgXHUyNzI4IERyYWZ0IGFuc3dlciBmb3IgUSR7aWR4ICsgMX06XFxuXFxuJHtkYXRhLnRleHR9XFxuXFxuUmV2aWV3IGFuZCBlZGl0IGluIHRoZSBmaWVsZCBiZWxvdyBiZWZvcmUgc3VibWl0dGluZy5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLndhcm4oJ0RyYWZ0IGdlbmVyYXRpb24gZmFpbGVkOicsIGRhdGEuZXJyb3IpO1xuICAgICAgc2hvd0RyYWZ0RXJyb3IoaWR4LCBkYXRhLmVycm9yIHx8ICdEcmFmdCBmYWlsZWQgXHUyMDE0IHBsZWFzZSB0cnkgYWdhaW4uJyk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cuZXJyb3IoJ0RyYWZ0IGZldGNoIGVycm9yOicsIGVycik7XG4gICAgc2hvd0RyYWZ0RXJyb3IoaWR4LCAnTmV0d29yayBlcnJvciBcdTIwMTQgcGxlYXNlIHRyeSBhZ2Fpbi4nKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBidG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICBidG4uaW5uZXJIVE1MID0gJ1x1MjcyOCBEcmFmdCc7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2VsZWN0UUNoaXAoYnRuLCBxSWR4KSB7XG4gIGNvbnN0IHBhbmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHEtaXRlbS0ke3FJZHh9YCk7XG4gIGlmIChwYW5lbCkge1xuICAgIHBhbmVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5xLWNoaXAnKS5mb3JFYWNoKGMgPT4gYy5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpKTtcbiAgfVxuICBidG4uY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTtcbiAgY29uc3QgdGV4dGFyZWEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcS1pbnB1dC0ke3FJZHh9YCk7XG4gIGlmICh0ZXh0YXJlYSkge1xuICAgIHRleHRhcmVhLnZhbHVlID0gYnRuLnRleHRDb250ZW50O1xuICAgIHVwZGF0ZVFQcm9ncmVzcygpO1xuICB9XG4gIC8vIFBlcnNpc3QgdGhlIGNoaXAgYW5zd2VyIGltbWVkaWF0ZWx5IHNvIGl0IHN1cnZpdmVzIHRhYiBuYXZpZ2F0aW9uLlxuICBjb25zdCBxID0gKHdpbmRvdy5wb3N0QW5hbHlzaXNRdWVzdGlvbnMgfHwgW10pW3FJZHhdO1xuICBpZiAocSkge1xuICAgIGlmICghd2luZG93LnF1ZXN0aW9uQW5zd2VycyB8fCB0eXBlb2Ygd2luZG93LnF1ZXN0aW9uQW5zd2VycyAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHdpbmRvdy5xdWVzdGlvbkFuc3dlcnMgPSB7fTtcbiAgICB9XG4gICAgd2luZG93LnF1ZXN0aW9uQW5zd2Vyc1txLnR5cGVdID0gYnRuLnRleHRDb250ZW50O1xuICAgIHBlcnNpc3RQb3N0QW5hbHlzaXNTdGF0ZSgpO1xuICB9XG59XG5cbi8vIEN1cnJlbnQgcXVlc3Rpb24tZ3JvdXAgaW5kZXggKFx1MjI2NDMtcGVyLWdyb3VwIGZsb3csIEdBUC0yMDEpLlxubGV0IF9jdXJyZW50R3JvdXAgPSAwO1xuY29uc3QgR1JPVVBfU0laRSA9IDM7XG5cbi8vIERlYm91bmNlIHRpbWVyIGZvciBwZXJzaXN0aW5nIGFuc3dlcnMgd2hpbGUgdGhlIHVzZXIgdHlwZXMuXG5sZXQgX3BlcnNpc3REZWJvdW5jZVRpbWVyID0gbnVsbDtcblxuZnVuY3Rpb24gb25RSW5wdXRDaGFuZ2UoaWR4KSB7XG4gIHVwZGF0ZVFQcm9ncmVzcygpO1xuICBjb25zdCBxID0gKHdpbmRvdy5wb3N0QW5hbHlzaXNRdWVzdGlvbnMgfHwgW10pW2lkeF07XG4gIGlmICghcSkgcmV0dXJuO1xuICBjb25zdCB0YSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBxLWlucHV0LSR7aWR4fWApO1xuICBpZiAoIXRhKSByZXR1cm47XG4gIGlmICghd2luZG93LnF1ZXN0aW9uQW5zd2VycyB8fCB0eXBlb2Ygd2luZG93LnF1ZXN0aW9uQW5zd2VycyAhPT0gJ29iamVjdCcpIHtcbiAgICB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzID0ge307XG4gIH1cbiAgd2luZG93LnF1ZXN0aW9uQW5zd2Vyc1txLnR5cGVdID0gdGEudmFsdWU7XG5cbiAgLy8gRGVib3VuY2UtcGVyc2lzdCBzbyBhbnN3ZXJzIHN1cnZpdmUgdGFiIG5hdmlnYXRpb24gYW5kIHN0YXR1cyBwb2xsaW5nLlxuICBjbGVhclRpbWVvdXQoX3BlcnNpc3REZWJvdW5jZVRpbWVyKTtcbiAgX3BlcnNpc3REZWJvdW5jZVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiBwZXJzaXN0UG9zdEFuYWx5c2lzU3RhdGUoKSwgNTAwKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlUVByb2dyZXNzKCkge1xuICBjb25zdCBxcyA9IHdpbmRvdy5wb3N0QW5hbHlzaXNRdWVzdGlvbnMgfHwgW107XG4gIGNvbnN0IHN0b3JlZEFuc3dlcnMgPSB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzIHx8IHt9O1xuICBjb25zdCBncm91cFN0YXJ0ID0gX2N1cnJlbnRHcm91cCAqIEdST1VQX1NJWkU7XG4gIGNvbnN0IGdyb3VwRW5kICAgPSBNYXRoLm1pbihncm91cFN0YXJ0ICsgR1JPVVBfU0laRSwgcXMubGVuZ3RoKTtcblxuICAvLyBDb3VudCBhbnN3ZXJzOiB1c2UgRE9NIHZhbHVlcyBmb3IgdGhlIGN1cnJlbnQgZ3JvdXAgKGxpdmUpLCBzdG9yZWQgZm9yIG90aGVycy5cbiAgY29uc3QgYW5zd2VyZWQgPSBxcy5maWx0ZXIoKHEsIGlkeCkgPT4ge1xuICAgIGlmIChpZHggPj0gZ3JvdXBTdGFydCAmJiBpZHggPCBncm91cEVuZCkge1xuICAgICAgY29uc3QgdGEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcS1pbnB1dC0ke2lkeH1gKTtcbiAgICAgIHJldHVybiB0YSA/IHRhLnZhbHVlLnRyaW0oKS5sZW5ndGggPiAwIDogISEoc3RvcmVkQW5zd2Vyc1txLnR5cGVdIHx8ICcnKS50cmltKCk7XG4gICAgfVxuICAgIHJldHVybiAhIShzdG9yZWRBbnN3ZXJzW3EudHlwZV0gfHwgJycpLnRyaW0oKTtcbiAgfSkubGVuZ3RoO1xuXG4gIGNvbnN0IGdyb3VwQW5zd2VyZWQgPSBxcy5zbGljZShncm91cFN0YXJ0LCBncm91cEVuZCkuZmlsdGVyKChxLCBsaSkgPT4ge1xuICAgIGNvbnN0IHRhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHEtaW5wdXQtJHtncm91cFN0YXJ0ICsgbGl9YCk7XG4gICAgcmV0dXJuIHRhID8gdGEudmFsdWUudHJpbSgpLmxlbmd0aCA+IDAgOiAhIShzdG9yZWRBbnN3ZXJzW3EudHlwZV0gfHwgJycpLnRyaW0oKTtcbiAgfSkubGVuZ3RoO1xuXG4gIGNvbnN0IG51bUdyb3VwcyAgPSBNYXRoLmNlaWwocXMubGVuZ3RoIC8gR1JPVVBfU0laRSk7XG4gIGNvbnN0IGdyb3VwTGFiZWwgPSBudW1Hcm91cHMgPiAxXG4gICAgPyBgR3JvdXAgJHtfY3VycmVudEdyb3VwICsgMX0gb2YgJHtudW1Hcm91cHN9YFxuICAgIDogYCR7cXMubGVuZ3RofSBxdWVzdGlvbiR7cXMubGVuZ3RoID4gMSA/ICdzJyA6ICcnfWA7XG5cbiAgY29uc3QgcHJvZ3Jlc3NFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdxLXByb2dyZXNzJyk7XG4gIGlmIChwcm9ncmVzc0VsKSB7XG4gICAgcHJvZ3Jlc3NFbC50ZXh0Q29udGVudCA9IGAke2dyb3VwTGFiZWx9IFx1MjAxNCAke2Fuc3dlcmVkfSBvZiAke3FzLmxlbmd0aH0gYW5zd2VyZWRgO1xuICB9XG4gIGNvbnN0IHN1Ym1pdEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdxLXN1Ym1pdC1idG4nKTtcbiAgaWYgKHN1Ym1pdEJ0bikge1xuICAgIGNvbnN0IGN1cnJlbnRHcm91cFNpemUgPSBncm91cEVuZCAtIGdyb3VwU3RhcnQ7XG4gICAgc3VibWl0QnRuLmRpc2FibGVkID0gZ3JvdXBBbnN3ZXJlZCA8IGN1cnJlbnRHcm91cFNpemU7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gc3VibWl0QWxsQW5zd2VycygpIHtcbiAgLyogZHVja2Zsb3c6XG4gICAqICAgaWQ6IHF1ZXN0aW9uc191aV9zdWJtaXRfbGl2ZVxuICAgKiAgIGtpbmQ6IHVpXG4gICAqICAgdGltZXN0YW1wOiAnMjAyNi0wMy0yNVQyMTozOTo0OFonXG4gICAqICAgc3RhdHVzOiBsaXZlXG4gICAqICAgaGFuZGxlczpcbiAgICogICAtIHVpOnF1ZXN0aW9ucy5zdWJtaXQtYWxsXG4gICAqICAgY2FsbHM6XG4gICAqICAgLSBQT1NUIC9hcGkvcG9zdC1hbmFseXNpcy1yZXNwb25zZXNcbiAgICogICAtIFBPU1QgL2FwaS9hY3Rpb25cbiAgICogICByZWFkczpcbiAgICogICAtIHdpbmRvdzpwb3N0QW5hbHlzaXNRdWVzdGlvbnNcbiAgICogICAtIGRvbTpxLWlucHV0LSoudmFsdWVcbiAgICogICB3cml0ZXM6XG4gICAqICAgLSB3aW5kb3c6cXVlc3Rpb25BbnN3ZXJzXG4gICAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9wb3N0LWFuYWx5c2lzLXJlc3BvbnNlcy5hbnN3ZXJzXG4gICAqICAgbm90ZXM6IENvbGxlY3RzIHRoZSBjbGFyaWZ5aW5nLXF1ZXN0aW9uIGFuc3dlcnMgZnJvbSB0aGUgVUksIHBlcnNpc3RzIHRoZW0gdG8gc2Vzc2lvbiBzdGF0ZSwgYW5kIHRoZW4gYWR2YW5jZXMgaW50byBjdXN0b21pemF0aW9uIHJlY29tbWVuZGF0aW9uIGdlbmVyYXRpb24uXG4gICAqL1xuICBjb25zdCBxcyA9IHdpbmRvdy5wb3N0QW5hbHlzaXNRdWVzdGlvbnMgfHwgW107XG4gIHFzLmZvckVhY2goKHEsIGlkeCkgPT4ge1xuICAgIGNvbnN0IHRhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHEtaW5wdXQtJHtpZHh9YCk7XG4gICAgaWYgKHRhICYmIHRhLnZhbHVlLnRyaW0oKSkge1xuICAgICAgd2luZG93LnF1ZXN0aW9uQW5zd2Vyc1txLnR5cGVdID0gdGEudmFsdWUudHJpbSgpO1xuICAgIH1cbiAgfSk7XG4gIGF3YWl0IHBlcnNpc3RQb3N0QW5hbHlzaXNTdGF0ZSgpO1xuXG4gIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdxLXN1Ym1pdC1idG4nKTtcbiAgaWYgKGJ0bikge1xuICAgIGJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgYnRuLmlubmVySFRNTCA9ICc8c3BhbiBjbGFzcz1cInNwaW5uZXJcIiBzdHlsZT1cImRpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjE0cHg7aGVpZ2h0OjE0cHg7Ym9yZGVyOjJweCBzb2xpZCAjZmZmO2JvcmRlci10b3AtY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyLXJhZGl1czo1MCU7YW5pbWF0aW9uOnNwaW4gMC43cyBsaW5lYXIgaW5maW5pdGU7dmVydGljYWwtYWxpZ246bWlkZGxlO21hcmdpbi1yaWdodDo2cHg7XCI+PC9zcGFuPlByb2Nlc3NpbmdcdTIwMjYnO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCBgXHUyNzEzIFRoYW5rIHlvdSEgJHtxcy5sZW5ndGh9IGFuc3dlciR7cXMubGVuZ3RoID4gMSA/ICdzJyA6ICcnfSBzYXZlZC4gR2VuZXJhdGluZyBjdXN0b21pemF0aW9uIHJlY29tbWVuZGF0aW9uc1x1MjAyNmApO1xuICAgIGF3YWl0IHNlbmRBY3Rpb24oJ3JlY29tbWVuZF9jdXN0b21pemF0aW9ucycpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChidG4pIHtcbiAgICAgIGJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgYnRuLmlubmVySFRNTCA9ICdTdWJtaXQgQW5zd2Vycyc7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNob3dEcmFmdEVycm9yKGlkeCwgbWVzc2FnZSkge1xuICBjb25zdCByb3cgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjcS1pdGVtLSR7aWR4fSAucS1hbnN3ZXItcm93YCk7XG4gIGlmICghcm93KSByZXR1cm47XG4gIGxldCBlcnJFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBxLWRyYWZ0LWVyci0ke2lkeH1gKTtcbiAgaWYgKCFtZXNzYWdlKSB7XG4gICAgaWYgKGVyckVsKSBlcnJFbC5yZW1vdmUoKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCFlcnJFbCkge1xuICAgIGVyckVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZXJyRWwuaWQgPSBgcS1kcmFmdC1lcnItJHtpZHh9YDtcbiAgICBlcnJFbC5jbGFzc05hbWUgPSAncS1kcmFmdC1lcnJvcic7XG4gICAgcm93Lmluc2VydEFkamFjZW50RWxlbWVudCgnYWZ0ZXJlbmQnLCBlcnJFbCk7XG4gIH1cbiAgZXJyRWwudGV4dENvbnRlbnQgPSBgXHUyNkEwICR7bWVzc2FnZX1gO1xufVxuXG4vLyBMZWdhY3kgY29tcGF0aWJpbGl0eSBzaGltXG5mdW5jdGlvbiBzaG93TmV4dFF1ZXN0aW9uKCkgeyByZW5kZXJRdWVzdGlvbnNQYW5lbCgpOyB9XG5cbmZ1bmN0aW9uIGhhbmRsZVF1ZXN0aW9uUmVzcG9uc2UobWVzc2FnZSkge1xuICBpZiAoIXdpbmRvdy5wb3N0QW5hbHlzaXNRdWVzdGlvbnMgfHwgd2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcbiAgaWYgKCF3aW5kb3cud2FpdGluZ0ZvclF1ZXN0aW9uUmVzcG9uc2UpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgaWR4ID0gd2luZG93LmN1cnJlbnRRdWVzdGlvbkluZGV4IHx8IDA7XG4gIGNvbnN0IHEgPSB3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zW2lkeF07XG4gIGlmICghcSkgcmV0dXJuIGZhbHNlO1xuICB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzW3EudHlwZV0gPSBtZXNzYWdlO1xuICB3aW5kb3cud2FpdGluZ0ZvclF1ZXN0aW9uUmVzcG9uc2UgPSBmYWxzZTtcbiAgd2luZG93LmN1cnJlbnRRdWVzdGlvbkluZGV4ID0gaWR4ICsgMTtcbiAgcGVyc2lzdFBvc3RBbmFseXNpc1N0YXRlKCk7XG4gIHJlbmRlclF1ZXN0aW9uc1BhbmVsKCk7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBmaW5pc2hQb3N0QW5hbHlzaXNRdWVzdGlvbnMoKSB7XG4gIHdpbmRvdy53YWl0aW5nRm9yUXVlc3Rpb25SZXNwb25zZSA9IGZhbHNlO1xuICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCAnVGhhbmsgeW91IGZvciB0aG9zZSBpbnNpZ2h0cyEgQ2xpY2sgXCJSZWNvbW1lbmQgQ3VzdG9taXphdGlvbnNcIiB3aGVuIHlvdVxcJ3JlIHJlYWR5LicpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgRVMgbW9kdWxlIGV4cG9ydHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5leHBvcnQge1xuICBwZXJzaXN0UG9zdEFuYWx5c2lzU3RhdGUsXG4gIHJlbmRlclF1ZXN0aW9uTWFya2Rvd24sXG4gIGZldGNoUG9zdEFuYWx5c2lzUXVlc3Rpb25zRnJvbUFwaSxcbiAgYXNrUG9zdEFuYWx5c2lzUXVlc3Rpb25zLFxuICBwb3B1bGF0ZVF1ZXN0aW9uc1RhYixcbiAgcmVuZGVyUXVlc3Rpb25zUGFuZWwsXG4gIGRyYWZ0UXVlc3Rpb25SZXNwb25zZSxcbiAgc2VsZWN0UUNoaXAsXG4gIG9uUUlucHV0Q2hhbmdlLFxuICB1cGRhdGVRUHJvZ3Jlc3MsXG4gIHN1Ym1pdEFsbEFuc3dlcnMsXG4gIHNob3dEcmFmdEVycm9yLFxuICBzaG93TmV4dFF1ZXN0aW9uLFxuICBoYW5kbGVRdWVzdGlvblJlc3BvbnNlLFxuICBmaW5pc2hQb3N0QW5hbHlzaXNRdWVzdGlvbnMsXG4gIGFkdmFuY2VRR3JvdXAsXG4gIGp1bXBUb1FHcm91cCxcbn07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG5mdW5jdGlvbiBleWVTbGFzaEljb24oKSB7XG4gIHJldHVybiBgXG4gICAgPHN2ZyBjbGFzcz1cImljb24tZ2x5cGhcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgZm9jdXNhYmxlPVwiZmFsc2VcIj5cbiAgICAgIDxwYXRoIGQ9XCJNMyAzbDE4IDE4XCI+PC9wYXRoPlxuICAgICAgPHBhdGggZD1cIk0xMC41OCAxMC41OGEyIDIgMCAwIDAgMi44MyAyLjgzXCI+PC9wYXRoPlxuICAgICAgPHBhdGggZD1cIk05Ljg4IDUuMDlBMTAuOTQgMTAuOTQgMCAwIDEgMTIgNWM1IDAgOS4yNyAzLjExIDExIDctMS4wNCAyLjM1LTIuNzggNC4zMi00Ljk2IDUuNDVcIj48L3BhdGg+XG4gICAgICA8cGF0aCBkPVwiTTYuNjEgNi42MUM0LjYyIDcuOSAzLjAzIDkuNzkgMiAxMmMxLjczIDMuODkgNiA3IDEwIDcgMS41MiAwIDIuOTgtLjM2IDQuMjktMVwiPjwvcGF0aD5cbiAgICA8L3N2Zz5cbiAgYDtcbn1cblxuZXhwb3J0IHsgZXllU2xhc2hJY29uIH07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9leHBlcmllbmNlLXJldmlldy5qc1xuICogRXhwZXJpZW5jZS1yZXZpZXcgdGFibGU6IGZldGNoLCByZW5kZXIsIHJvdy1yZW9yZGVyLCBhbmQgc3VibWl0IGRlY2lzaW9ucy5cbiAqXG4gKiBEZXBlbmRlbmNpZXMgKHJlc29sdmVkIHRocm91Z2ggZ2xvYmFsVGhpcyBhdCBydW50aW1lKTpcbiAqICAgdXNlclNlbGVjdGlvbnMsIHBlbmRpbmdSZWNvbW1lbmRhdGlvbnMsIF9zYXZlZERlY2lzaW9ucywgX2V4cGVyaWVuY2VzT3JkZXJlZCxcbiAqICAgcGFyc2VTdGF0dXNSZXNwb25zZSwgZ2V0RXhwZXJpZW5jZVJlY29tbWVuZGF0aW9uLCBnZXRDb25maWRlbmNlTGV2ZWwsXG4gKiAgIGdldEV4cGVyaWVuY2VSZWFzb25pbmcsIGVzY2FwZUh0bWwsIHNob3dCdWxsZXRSZW9yZGVyLFxuICogICBoYW5kbGVBY3Rpb25DbGljaywgYnVsa0FjdGlvbiwgX3VwZGF0ZVBhZ2VFc3RpbWF0ZSxcbiAqICAgdXBkYXRlSW5jbHVzaW9uQ291bnRzLCBzd2l0Y2hUYWIsXG4gKiAgIHNob3dBbGVydE1vZGFsLCBzaG93VG9hc3QsIHNjaGVkdWxlQXRzUmVmcmVzaCxcbiAqICAgJCwgJC5mbi5EYXRhVGFibGUgKGpRdWVyeSArIERhdGFUYWJsZXMpXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdleHBlcmllbmNlLXJldmlldycpO1xuXG5pbXBvcnQgeyBzdGF0ZU1hbmFnZXIgfSBmcm9tICcuL3N0YXRlLW1hbmFnZXIuanMnO1xuaW1wb3J0IHsgZXllU2xhc2hJY29uIH0gZnJvbSAnLi9yZXZpZXctaWNvbnMuanMnO1xuXG5mdW5jdGlvbiBfZmluZEV4cGVyaWVuY2VSZWNvbW1lbmRhdGlvblJlY29yZChleHBJZCwgZGF0YSkge1xuICBpZiAoIWRhdGEgfHwgIUFycmF5LmlzQXJyYXkoZGF0YS5leHBlcmllbmNlX3JlY29tbWVuZGF0aW9ucykpIHJldHVybiBudWxsO1xuICByZXR1cm4gZGF0YS5leHBlcmllbmNlX3JlY29tbWVuZGF0aW9ucy5maW5kKChyZWMpID0+IFN0cmluZyhyZWM/LmlkIHx8IHJlYz8uZXhwZXJpZW5jZV9pZCB8fCAnJykgPT09IFN0cmluZyhleHBJZCkpIHx8IG51bGw7XG59XG5cbmZ1bmN0aW9uIF9mb3JtYXRTdWdnZXN0ZWRPcmRlclN1bW1hcnkob3JkZXIpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KG9yZGVyKSB8fCBvcmRlci5sZW5ndGggPCAyKSByZXR1cm4gJyc7XG4gIHJldHVybiBvcmRlci5tYXAoKGlkeCkgPT4gU3RyaW5nKE51bWJlcihpZHgpICsgMSkpLmpvaW4oJyAtPiAnKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEV4cGVyaWVuY2UgZGV0YWlscyBmZXRjaCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gZ2V0RXhwZXJpZW5jZURldGFpbHMoZXhwSWQpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9leHBlcmllbmNlLWRldGFpbHMnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBleHBlcmllbmNlX2lkOiBleHBJZCB9KVxuICAgIH0pO1xuXG4gICAgaWYgKHJlcy5vaykge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICByZXR1cm4gZGF0YS5leHBlcmllbmNlIHx8IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZy53YXJuKCdDb3VsZCBub3QgZmV0Y2ggZXhwZXJpZW5jZSBkZXRhaWxzIGZvcicsIGV4cElkKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cud2FybignRXJyb3IgZmV0Y2hpbmcgZXhwZXJpZW5jZSBkZXRhaWxzOicsIGVycm9yKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgUmVydW4gc25hcHNob3QgKGNoYW5nZSBiYWRnZSBmb3IgZXhwZXJpZW5jZXMpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuZnVuY3Rpb24gX2V4cFNuYXBzaG90S2V5KCkge1xuICB0cnkge1xuICAgIGNvbnN0IHNpZCA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCkuZ2V0KCdzZXNzaW9uJyk7XG4gICAgcmV0dXJuIHNpZCA/IGBleHBfc25hcF8ke3NpZH1gIDogbnVsbDtcbiAgfSBjYXRjaCAoXykgeyByZXR1cm4gbnVsbDsgfVxufVxuZnVuY3Rpb24gX3NhdmVFeHBTbmFwc2hvdChyZWNvbW1lbmRlZElkcykge1xuICBjb25zdCBrZXkgPSBfZXhwU25hcHNob3RLZXkoKTtcbiAgaWYgKCFrZXkpIHJldHVybjtcbiAgdHJ5IHsgbG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCBKU09OLnN0cmluZ2lmeShbLi4ucmVjb21tZW5kZWRJZHNdKSk7IH0gY2F0Y2ggKF8pIHt9XG59XG5mdW5jdGlvbiBfZ2V0RXhwU25hcHNob3QoKSB7XG4gIGNvbnN0IGtleSA9IF9leHBTbmFwc2hvdEtleSgpO1xuICBpZiAoIWtleSkgcmV0dXJuIG51bGw7XG4gIHRyeSB7XG4gICAgY29uc3QgcmF3ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KTtcbiAgICByZXR1cm4gcmF3ID8gbmV3IFNldChKU09OLnBhcnNlKHJhdykpIDogbnVsbDtcbiAgfSBjYXRjaCAoXykgeyByZXR1cm4gbnVsbDsgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgQnVpbGQgcmV2aWV3IHRhYmxlIChmZXRjaCArIGluaXRpYWxpc2UpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBidWlsZEV4cGVyaWVuY2VSZXZpZXdUYWJsZSgpIHtcbiAgY29uc3QgZGF0YSA9IHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zO1xuICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwZXJpZW5jZS10YWJsZS1jb250YWluZXInKTtcbiAgaWYgKCFjb250YWluZXIpIHJldHVybjtcblxuICBjb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJlbXB0eS1zdGF0ZVwiPjxkaXYgY2xhc3M9XCJsb2FkaW5nLXNwaW5uZXJcIj48L2Rpdj48cCBzdHlsZT1cIm1hcmdpbi10b3A6MTJweDtjb2xvcjojNjQ3NDhiO1wiPkxvYWRpbmcgZXhwZXJpZW5jZSByZWNvbW1lbmRhdGlvbnNcdTIwMjY8L3A+PC9kaXY+JztcblxuICBsZXQgYWxsRXhwZXJpZW5jZUlkcyA9IFtdO1xuICBsZXQgc2F2ZWRSb3dPcmRlciA9IFtdO1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXR1c1JlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3N0YXR1cycpO1xuICAgIGNvbnN0IHN0YXR1c0RhdGEgPSBwYXJzZVN0YXR1c1Jlc3BvbnNlKGF3YWl0IHN0YXR1c1Jlcy5qc29uKCkpO1xuICAgIGFsbEV4cGVyaWVuY2VJZHMgPSBzdGF0dXNEYXRhLmFsbF9leHBlcmllbmNlX2lkcyB8fCBkYXRhLnJlY29tbWVuZGVkX2V4cGVyaWVuY2VzIHx8IFtdO1xuICAgIHNhdmVkUm93T3JkZXIgICAgPSBBcnJheS5pc0FycmF5KHN0YXR1c0RhdGEuZXhwZXJpZW5jZV9yb3dfb3JkZXIpID8gc3RhdHVzRGF0YS5leHBlcmllbmNlX3Jvd19vcmRlciA6IFtdO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGFsbEV4cGVyaWVuY2VJZHMgPSBkYXRhLnJlY29tbWVuZGVkX2V4cGVyaWVuY2VzIHx8IFtdO1xuICB9XG5cbiAgY29uc3QgcmVjb21tZW5kZWRTZXQgPSBuZXcgU2V0KGRhdGEucmVjb21tZW5kZWRfZXhwZXJpZW5jZXMgfHwgW10pO1xuXG4gIC8vIEZldGNoIGFsbCBleHBlcmllbmNlIGRldGFpbHNcbiAgY29uc3QgZXhwZXJpZW5jZXNXaXRoRGV0YWlscyA9IFtdO1xuICBmb3IgKGNvbnN0IGV4cElkIG9mIGFsbEV4cGVyaWVuY2VJZHMpIHtcbiAgICBjb25zdCBkZXRhaWxzID0gYXdhaXQgZ2V0RXhwZXJpZW5jZURldGFpbHMoZXhwSWQpO1xuICAgIGV4cGVyaWVuY2VzV2l0aERldGFpbHMucHVzaCh7IGlkOiBleHBJZCwgZGV0YWlscyB9KTtcbiAgfVxuXG4gIC8vIE9uIGZpcnN0IGxvYWQ6IHJlc3RvcmUgdXNlcidzIHNhdmVkIG9yZGVyIGlmIHByZXNlbnQ7IG90aGVyd2lzZSBkZWZhdWx0LXNvcnRcbiAgLy8gd2l0aCBwcmVzZW50L2N1cnJlbnQgcG9zaXRpb25zIGZpcnN0LCB0aGVuIHJldmVyc2UtY2hyb25vbG9naWNhbCBieSBlbmQgZGF0ZS5cbiAgLy8gT24gcmUtcmVuZGVyLCBwcmVzZXJ2ZSB0aGUgaW4tbWVtb3J5IHVzZXIgb3JkZXIuXG4gIGlmICghd2luZG93Ll9leHBlcmllbmNlc09yZGVyZWQpIHtcbiAgICBpZiAoc2F2ZWRSb3dPcmRlci5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBSZXN0b3JlIHVzZXIncyBleHBsaWNpdGx5IHNhdmVkIG9yZGVyaW5nIGZyb20gdGhlIHNlc3Npb25cbiAgICAgIGNvbnN0IG9yZGVyTWFwID0gT2JqZWN0LmZyb21FbnRyaWVzKHNhdmVkUm93T3JkZXIubWFwKChpZCwgaSkgPT4gW2lkLCBpXSkpO1xuICAgICAgZXhwZXJpZW5jZXNXaXRoRGV0YWlscy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIGNvbnN0IGFpID0gb3JkZXJNYXBbYS5pZF0gPz8gc2F2ZWRSb3dPcmRlci5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGJpID0gb3JkZXJNYXBbYi5pZF0gPz8gc2F2ZWRSb3dPcmRlci5sZW5ndGg7XG4gICAgICAgIHJldHVybiBhaSAtIGJpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIERlZmF1bHQ6IHNvcnQgYnkgTExNIHJlY29tbWVuZGF0aW9uIHN0cmVuZ3RoIGZpcnN0LCB0aGVuIHJldmVyc2UtY2hyb25vbG9naWNhbFxuICAgICAgY29uc3QgX0FDVElPTl9SQU5LID0geyBlbXBoYXNpemU6IDAsIGluY2x1ZGU6IDEsICdkZS1lbXBoYXNpemUnOiAyLCBleGNsdWRlOiAzIH07XG4gICAgICBjb25zdCBfcGFyc2VFbmRLZXkgPSAoZXhwKSA9PiB7XG4gICAgICAgIGNvbnN0IHJhdyA9IChleHAuZGV0YWlscz8uZW5kX2RhdGUgfHwgZXhwLmRldGFpbHM/LmVuZCB8fCAnJykudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICghcmF3IHx8IFsncHJlc2VudCcsICdjdXJyZW50JywgJ25vdycsICdvbmdvaW5nJ10uaW5jbHVkZXMocmF3KSkgcmV0dXJuICc5OTk5LTEyJztcbiAgICAgICAgaWYgKC9eXFxkezR9JC8udGVzdChyYXcpKSByZXR1cm4gcmF3ICsgJy0xMic7XG4gICAgICAgIHJldHVybiByYXc7XG4gICAgICB9O1xuICAgICAgY29uc3QgX2dldEFjdGlvblJhbmsgPSAoZXhwKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlYyA9IGdldEV4cGVyaWVuY2VSZWNvbW1lbmRhdGlvbihleHAuaWQsIGRhdGEpO1xuICAgICAgICBpZiAoIXJlYykgcmV0dXJuIDE7IC8vIGRlZmF1bHQgdG8gJ2luY2x1ZGUnIHJhbmsgd2hlbiBubyByZWNvbW1lbmRhdGlvblxuICAgICAgICBpZiAocmVjID09PSAnRW1waGFzaXplJykgICAgcmV0dXJuIDA7XG4gICAgICAgIGlmIChyZWMgPT09ICdJbmNsdWRlJykgICAgICByZXR1cm4gMTtcbiAgICAgICAgaWYgKHJlYyA9PT0gJ0RlLWVtcGhhc2l6ZScpIHJldHVybiAyO1xuICAgICAgICBpZiAocmVjID09PSAnT21pdCcpICAgICAgICAgcmV0dXJuIDM7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfTtcbiAgICAgIGV4cGVyaWVuY2VzV2l0aERldGFpbHMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICBjb25zdCByYW5rRGlmZiA9IF9nZXRBY3Rpb25SYW5rKGEpIC0gX2dldEFjdGlvblJhbmsoYik7XG4gICAgICAgIGlmIChyYW5rRGlmZiAhPT0gMCkgcmV0dXJuIHJhbmtEaWZmO1xuICAgICAgICByZXR1cm4gX3BhcnNlRW5kS2V5KGIpLmxvY2FsZUNvbXBhcmUoX3BhcnNlRW5kS2V5KGEpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB3aW5kb3cuX2V4cGVyaWVuY2VzT3JkZXJlZCA9IGV4cGVyaWVuY2VzV2l0aERldGFpbHM7XG4gIH0gZWxzZSB7XG4gICAgLy8gTWVyZ2UgYW55IG5ld2x5IGRpc2NvdmVyZWQgZXhwZXJpZW5jZXMgaW50byB0aGUgY2FjaGVkIG9yZGVyXG4gICAgY29uc3Qga25vd25JZHMgPSBuZXcgU2V0KHdpbmRvdy5fZXhwZXJpZW5jZXNPcmRlcmVkLm1hcChlID0+IGUuaWQpKTtcbiAgICBmb3IgKGNvbnN0IGV4cCBvZiBleHBlcmllbmNlc1dpdGhEZXRhaWxzKSB7XG4gICAgICBpZiAoIWtub3duSWRzLmhhcyhleHAuaWQpKSB3aW5kb3cuX2V4cGVyaWVuY2VzT3JkZXJlZC5wdXNoKGV4cCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQ29tcHV0ZSB3aGljaCByZWNvbW1lbmRhdGlvbnMgYXJlIG5ldyBzaW5jZSBsYXN0IHJlbmRlciAocmVydW4gY2hhbmdlIGJhZGdlcylcbiAgY29uc3QgcHJldkV4cFNuYXAgPSBfZ2V0RXhwU25hcHNob3QoKTtcbiAgY29uc3QgbmV3UmVjb21tZW5kZWRFeHBzID0gcHJldkV4cFNuYXBcbiAgICA/IG5ldyBTZXQoWy4uLnJlY29tbWVuZGVkU2V0XS5maWx0ZXIoaWQgPT4gIXByZXZFeHBTbmFwLmhhcyhpZCkpKVxuICAgIDogbmV3IFNldCgpO1xuICBfc2F2ZUV4cFNuYXBzaG90KHJlY29tbWVuZGVkU2V0KTtcblxuICAvLyBJbml0aWFsaXNlIHNhdmVkIGRlY2lzaW9uc1xuICBjb25zdCBzYXZlZEV4cERlY3MgPSB3aW5kb3cuX3NhdmVkRGVjaXNpb25zPy5leHBlcmllbmNlX2RlY2lzaW9ucyB8fCB7fTtcbiAgZm9yIChjb25zdCB7IGlkOiBleHBJZCB9IG9mIHdpbmRvdy5fZXhwZXJpZW5jZXNPcmRlcmVkKSB7XG4gICAgY29uc3QgcmVjb21tZW5kYXRpb24gPSBnZXRFeHBlcmllbmNlUmVjb21tZW5kYXRpb24oZXhwSWQsIGRhdGEpO1xuICAgIGNvbnN0IGlzUmVjb21tZW5kZWQgID0gcmVjb21tZW5kZWRTZXQuaGFzKGV4cElkKTtcbiAgICBsZXQgZGVmYXVsdEFjdGlvbiA9ICdleGNsdWRlJztcbiAgICBpZiAgICAgIChyZWNvbW1lbmRhdGlvbiA9PT0gJ0VtcGhhc2l6ZScpICAgIGRlZmF1bHRBY3Rpb24gPSAnZW1waGFzaXplJztcbiAgICBlbHNlIGlmIChyZWNvbW1lbmRhdGlvbiA9PT0gJ0luY2x1ZGUnKSAgICAgIGRlZmF1bHRBY3Rpb24gPSAnaW5jbHVkZSc7XG4gICAgZWxzZSBpZiAocmVjb21tZW5kYXRpb24gPT09ICdEZS1lbXBoYXNpemUnKSBkZWZhdWx0QWN0aW9uID0gJ2RlLWVtcGhhc2l6ZSc7XG4gICAgZWxzZSBpZiAocmVjb21tZW5kYXRpb24gPT09ICdPbWl0JykgICAgICAgICBkZWZhdWx0QWN0aW9uID0gJ2V4Y2x1ZGUnO1xuICAgIGVsc2UgaWYgKGlzUmVjb21tZW5kZWQpICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEFjdGlvbiA9ICdpbmNsdWRlJztcbiAgICB1c2VyU2VsZWN0aW9ucy5leHBlcmllbmNlc1tleHBJZF0gPSBzYXZlZEV4cERlY3NbZXhwSWRdIHx8IGRlZmF1bHRBY3Rpb247XG4gIH1cblxuICBfcmVuZGVyRXhwZXJpZW5jZVRhYmxlKGNvbnRhaW5lciwgcmVjb21tZW5kZWRTZXQsIGRhdGEsIG5ld1JlY29tbWVuZGVkRXhwcyk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBSZW5kZXIgdGFibGUgSFRNTCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gX3JlbmRlckV4cGVyaWVuY2VUYWJsZShjb250YWluZXIsIHJlY29tbWVuZGVkU2V0LCBkYXRhLCBuZXdSZWNvbW1lbmRlZEV4cHMgPSBuZXcgU2V0KCkpIHtcbiAgaWYgKCFjb250YWluZXIpIGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHBlcmllbmNlLXRhYmxlLWNvbnRhaW5lcicpO1xuICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuO1xuICBpZiAoIXJlY29tbWVuZGVkU2V0KSByZWNvbW1lbmRlZFNldCA9IG5ldyBTZXQoKHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zPy5yZWNvbW1lbmRlZF9leHBlcmllbmNlcykgfHwgW10pO1xuICBpZiAoIWRhdGEpIGRhdGEgPSB3aW5kb3cucGVuZGluZ1JlY29tbWVuZGF0aW9ucztcblxuICAvLyBEZXN0cm95IGFueSBleGlzdGluZyBEYXRhVGFibGUgYmVmb3JlIHJlYnVpbGRpbmdcbiAgaWYgKCQuZm4uRGF0YVRhYmxlLmlzRGF0YVRhYmxlKCcjZXhwZXJpZW5jZS1yZXZpZXctdGFibGUnKSkge1xuICAgICQoJyNleHBlcmllbmNlLXJldmlldy10YWJsZScpLkRhdGFUYWJsZSgpLmRlc3Ryb3koKTtcbiAgfVxuXG4gIGNvbnN0IGV4cHMgPSB3aW5kb3cuX2V4cGVyaWVuY2VzT3JkZXJlZCB8fCBbXTtcbiAgbGV0IHRhYmxlSFRNTCA9IGBcbiAgICA8dGFibGUgaWQ9XCJleHBlcmllbmNlLXJldmlldy10YWJsZVwiIGNsYXNzPVwicmV2aWV3LXRhYmxlXCI+XG4gICAgICA8dGhlYWQ+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8dGg+RXhwZXJpZW5jZTwvdGg+XG4gICAgICAgICAgPHRoPkRhdGVzPC90aD5cbiAgICAgICAgICA8dGg+UmVjb21tZW5kYXRpb248L3RoPlxuICAgICAgICAgIDx0aD5Db25maWRlbmNlPC90aD5cbiAgICAgICAgICA8dGg+UmVhc29uaW5nPC90aD5cbiAgICAgICAgICA8dGg+WW91ciBTZWxlY3Rpb248L3RoPlxuICAgICAgICA8L3RyPlxuICAgICAgPC90aGVhZD5cbiAgICAgIDx0Ym9keT5cbiAgYDtcblxuICBleHBzLmZvckVhY2goKHsgaWQ6IGV4cElkLCBkZXRhaWxzIH0sIHJvd0lkeCkgPT4ge1xuICAgIGNvbnN0IHJlY29tbWVuZGF0aW9uICAgID0gZ2V0RXhwZXJpZW5jZVJlY29tbWVuZGF0aW9uKGV4cElkLCBkYXRhKTtcbiAgICBjb25zdCBjb25maWRlbmNlICAgICAgICA9IGdldENvbmZpZGVuY2VMZXZlbChleHBJZCwgZGF0YSk7XG4gICAgY29uc3QgcmVhc29uaW5nICAgICAgICAgPSBnZXRFeHBlcmllbmNlUmVhc29uaW5nKGV4cElkLCBkYXRhKTtcbiAgICBjb25zdCByZWNSZWNvcmQgICAgICAgICA9IF9maW5kRXhwZXJpZW5jZVJlY29tbWVuZGF0aW9uUmVjb3JkKGV4cElkLCBkYXRhKTtcbiAgICBjb25zdCBidWxsZXRPcmRlciAgICAgICA9IHJlY1JlY29yZCAmJiB0eXBlb2YgcmVjUmVjb3JkLmJ1bGxldF9vcmRlciA9PT0gJ29iamVjdCcgPyByZWNSZWNvcmQuYnVsbGV0X29yZGVyIDogbnVsbDtcbiAgICBjb25zdCBidWxsZXRPcmRlclN1bW1hcnkgPSBfZm9ybWF0U3VnZ2VzdGVkT3JkZXJTdW1tYXJ5KGJ1bGxldE9yZGVyPy5vcmRlcik7XG4gICAgY29uc3QgdGl0bGUgICAgICAgICAgICAgPSBkZXRhaWxzID8gZGV0YWlscy50aXRsZSAgIDogZXhwSWQ7XG4gICAgY29uc3QgY29tcGFueSAgICAgICAgICAgPSBkZXRhaWxzID8gZGV0YWlscy5jb21wYW55IDogJyc7XG4gICAgY29uc3Qgc3RhcnREYXRlICAgICAgICAgPSBkZXRhaWxzPy5zdGFydF9kYXRlIHx8ICcnO1xuICAgIGNvbnN0IGVuZERhdGUgICAgICAgICAgID0gZGV0YWlscz8uZW5kX2RhdGUgICB8fCAncHJlc2VudCc7XG4gICAgY29uc3QgZHVyYXRpb24gICAgICAgICAgPSBzdGFydERhdGUgPyBgJHtzdGFydERhdGV9IC0gJHtlbmREYXRlfWAgOiAoZGV0YWlscz8uZHVyYXRpb24gfHwgJycpO1xuICAgIGNvbnN0IGRlZmF1bHRBY3Rpb24gICAgID0gdXNlclNlbGVjdGlvbnMuZXhwZXJpZW5jZXNbZXhwSWRdIHx8ICdpbmNsdWRlJztcbiAgICBjb25zdCByZWNvbW1lbmRhdGlvblRleHQgPSByZWNvbW1lbmRhdGlvbiB8fCAnSW5jbHVkZSc7XG4gICAgY29uc3QgY29uZmlkZW5jZUJhZGdlICAgPSBgPHNwYW4gY2xhc3M9XCJjb25maWRlbmNlLWJhZGdlIGNvbmZpZGVuY2UtJHtjb25maWRlbmNlLmxldmVsfVwiPiR7Y29uZmlkZW5jZS50ZXh0fTwvc3Bhbj5gO1xuICAgIGNvbnN0IHJlYXNvbmluZ1NlZ21lbnRzID0gW3JlYXNvbmluZyB8fCAnVGhpcyBleHBlcmllbmNlIHdhcyBzZWxlY3RlZCBiYXNlZCBvbiBpdHMgcmVsZXZhbmNlIHRvIHRoZSBwb3NpdGlvbiByZXF1aXJlbWVudHMuJ107XG4gICAgaWYgKGJ1bGxldE9yZGVyU3VtbWFyeSkgcmVhc29uaW5nU2VnbWVudHMucHVzaChgU3VnZ2VzdGVkIGJ1bGxldCBvcmRlcjogJHtidWxsZXRPcmRlclN1bW1hcnl9LmApO1xuICAgIGlmIChidWxsZXRPcmRlcj8ucmVhc29uaW5nKSByZWFzb25pbmdTZWdtZW50cy5wdXNoKFN0cmluZyhidWxsZXRPcmRlci5yZWFzb25pbmcpKTtcbiAgICBpZiAoYnVsbGV0T3JkZXI/LmF0c19pbXBhY3QpIHJlYXNvbmluZ1NlZ21lbnRzLnB1c2goYEFUUyBpbXBhY3Q6ICR7YnVsbGV0T3JkZXIuYXRzX2ltcGFjdH1gKTtcbiAgICBpZiAoYnVsbGV0T3JkZXI/LnBhZ2VfbGVuZ3RoX2ltcGFjdCkgcmVhc29uaW5nU2VnbWVudHMucHVzaChgUGFnZSBsZW5ndGggaW1wYWN0OiAke2J1bGxldE9yZGVyLnBhZ2VfbGVuZ3RoX2ltcGFjdH1gKTtcbiAgICBjb25zdCByZWFzb25pbmdUZXh0ICAgICA9IHJlYXNvbmluZ1NlZ21lbnRzLmpvaW4oJyAnKTtcbiAgICBjb25zdCBpc0ZpcnN0ICAgICAgICAgICA9IHJvd0lkeCA9PT0gMDtcbiAgICBjb25zdCBpc0xhc3QgICAgICAgICAgICA9IHJvd0lkeCA9PT0gZXhwcy5sZW5ndGggLSAxO1xuICAgIGNvbnN0IHRpdGxlRXNjICAgICAgICAgID0gZXNjYXBlSHRtbCh0aXRsZSk7XG4gICAgY29uc3QgcmVydW5OZXdCYWRnZSA9IG5ld1JlY29tbWVuZGVkRXhwcy5oYXMoZXhwSWQpXG4gICAgICA/ICc8c3BhbiBjbGFzcz1cInJ3LWNoYW5nZS1iYWRnZSBydy1jaGFuZ2UtbmV3XCIgYXJpYS1sYWJlbD1cIk5ldyByZWNvbW1lbmRhdGlvbiBzaW5jZSBwcmV2aW91cyBydW5cIj5cdUQ4M0NcdUREOTUgTmV3PC9zcGFuPidcbiAgICAgIDogJyc7XG5cbiAgICB0YWJsZUhUTUwgKz0gYFxuICAgICAgPHRyIGRhdGEtZXhwLWlkPVwiJHtleHBJZH1cIiBkYXRhLXN0YXJ0LWRhdGU9XCIke3N0YXJ0RGF0ZX1cIj5cbiAgICAgICAgPHRkPlxuICAgICAgICAgIDxzdHJvbmc+JHt0aXRsZUVzY308L3N0cm9uZz4ke3JlcnVuTmV3QmFkZ2V9PGJyPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtcIj4ke2VzY2FwZUh0bWwoY29tcGFueSl9PC9zcGFuPlxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJ3aGl0ZS1zcGFjZTpub3dyYXA7XCI+JHtlc2NhcGVIdG1sKGR1cmF0aW9uKX08L3RkPlxuICAgICAgICA8dGQ+PHN0cm9uZz4ke2VzY2FwZUh0bWwocmVjb21tZW5kYXRpb25UZXh0KX08L3N0cm9uZz48L3RkPlxuICAgICAgICA8dGQ+JHtjb25maWRlbmNlQmFkZ2V9PC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwibWF4LXdpZHRoOjMwMHB4O1wiPjxzbWFsbD4ke2VzY2FwZUh0bWwocmVhc29uaW5nVGV4dCl9PC9zbWFsbD48L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJhY3Rpb24tYnRuc1wiIHN0eWxlPVwid2hpdGUtc3BhY2U6bm93cmFwO1wiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0biAke2RlZmF1bHRBY3Rpb24gPT09ICdlbXBoYXNpemUnICAgID8gJ2FjdGl2ZScgOiAnJ31cIiBkYXRhLWFjdGlvbj1cImVtcGhhc2l6ZVwiICAgIGFyaWEtbGFiZWw9XCJFbXBoYXNpemUgJHt0aXRsZUVzY31cIiAgICAgICBhcmlhLXByZXNzZWQ9XCIke2RlZmF1bHRBY3Rpb24gPT09ICdlbXBoYXNpemUnfVwiICAgIHRpdGxlPVwiRW1waGFzaXplIFx1MjAxNCBmZWF0dXJlIHByb21pbmVudGx5XCIgc3R5bGU9XCJjb2xvcjojMTBiOTgxO1wiPlx1Mjc5NTwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0biAke2RlZmF1bHRBY3Rpb24gPT09ICdpbmNsdWRlJyAgICAgID8gJ2FjdGl2ZScgOiAnJ31cIiBkYXRhLWFjdGlvbj1cImluY2x1ZGVcIiAgICAgIGFyaWEtbGFiZWw9XCJJbmNsdWRlICR7dGl0bGVFc2N9XCIgICAgICAgICBhcmlhLXByZXNzZWQ9XCIke2RlZmF1bHRBY3Rpb24gPT09ICdpbmNsdWRlJ31cIiAgICAgIHRpdGxlPVwiSW5jbHVkZSBcdTIwMTQgc3RhbmRhcmQgdHJlYXRtZW50XCI+XHUyNzEzPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuICR7ZGVmYXVsdEFjdGlvbiA9PT0gJ2RlLWVtcGhhc2l6ZScgPyAnYWN0aXZlJyA6ICcnfVwiIGRhdGEtYWN0aW9uPVwiZGUtZW1waGFzaXplXCIgYXJpYS1sYWJlbD1cIkRlLWVtcGhhc2l6ZSAke3RpdGxlRXNjfVwiICAgIGFyaWEtcHJlc3NlZD1cIiR7ZGVmYXVsdEFjdGlvbiA9PT0gJ2RlLWVtcGhhc2l6ZSd9XCIgdGl0bGU9XCJEZS1lbXBoYXNpemUgXHUyMDE0IGJyaWVmIG1lbnRpb25cIiAgICBzdHlsZT1cImNvbG9yOiNmNTllMGI7XCI+XHUyNzk2PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuICR7ZGVmYXVsdEFjdGlvbiA9PT0gJ2V4Y2x1ZGUnICAgICAgPyAnYWN0aXZlJyA6ICcnfVwiIGRhdGEtYWN0aW9uPVwiZXhjbHVkZVwiICAgICAgYXJpYS1sYWJlbD1cIkV4Y2x1ZGUgJHt0aXRsZUVzY31cIiAgICAgICAgIGFyaWEtcHJlc3NlZD1cIiR7ZGVmYXVsdEFjdGlvbiA9PT0gJ2V4Y2x1ZGUnfVwiICAgICAgdGl0bGU9XCJFeGNsdWRlIFx1MjAxNCBvbWl0IGZyb20gQ1ZcIiAgICAgICAgICBzdHlsZT1cImNvbG9yOiNlZjQ0NDQ7XCI+JHtleWVTbGFzaEljb24oKX08L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBkYXRhLWFjdGlvbj1cInJlb3JkZXJcIiBhcmlhLWxhYmVsPVwiUmVvcmRlciBidWxsZXRzIGZvciAke3RpdGxlRXNjfVwiIHRpdGxlPVwiJHtidWxsZXRPcmRlclN1bW1hcnkgPyBgUmVvcmRlciBidWxsZXQgcG9pbnRzIChBSSBzdWdnZXN0ZWQgb3JkZXIgJHtidWxsZXRPcmRlclN1bW1hcnl9KWAgOiAnUmVvcmRlciBidWxsZXQgcG9pbnRzJ31cIiBzdHlsZT1cImNvbG9yOiM2MzY2ZjE7XCI+XHUyMTk1PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgZGF0YS1hY3Rpb249XCJyb3ctdXBcIiAgIGFyaWEtbGFiZWw9XCJNb3ZlICR7dGl0bGVFc2N9IGVhcmxpZXIgaW4gQ1ZcIiB0aXRsZT1cIk1vdmUgdXAgaW4gQ1ZcIiAgICR7aXNGaXJzdCA/ICdkaXNhYmxlZCcgOiAnJ30+XHUyMTkxPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgZGF0YS1hY3Rpb249XCJyb3ctZG93blwiIGFyaWEtbGFiZWw9XCJNb3ZlICR7dGl0bGVFc2N9IGxhdGVyIGluIENWXCIgICB0aXRsZT1cIk1vdmUgZG93biBpbiBDVlwiICR7aXNMYXN0ICA/ICdkaXNhYmxlZCcgOiAnJ30+XHUyMTkzPC9idXR0b24+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L3RyPlxuICAgIGA7XG4gIH0pO1xuXG4gIHRhYmxlSFRNTCArPSAnPC90Ym9keT48L3RhYmxlPic7XG4gIGNvbnRhaW5lci5pbm5lckhUTUwgPSB0YWJsZUhUTUw7XG5cbiAgLy8gRGVsZWdhdGVkIGNsaWNrIGhhbmRsZXJcbiAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJyNleHBlcmllbmNlLXJldmlldy10YWJsZSB0Ym9keScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGUgPT4ge1xuICAgIGNvbnN0IGJ0biA9IGUudGFyZ2V0LmNsb3Nlc3QoJy5pY29uLWJ0bicpO1xuICAgIGlmICghYnRuKSByZXR1cm47XG4gICAgY29uc3QgdHIgPSBidG4uY2xvc2VzdCgndHJbZGF0YS1leHAtaWRdJyk7XG4gICAgaWYgKCF0cikgcmV0dXJuO1xuICAgIGNvbnN0IGV4cElkICA9IHRyLmRhdGFzZXQuZXhwSWQ7XG4gICAgY29uc3QgYWN0aW9uID0gYnRuLmRhdGFzZXQuYWN0aW9uO1xuICAgIGlmIChhY3Rpb24gPT09ICdyZW9yZGVyJykge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGNvbnN0IHRpdGxlRWwgPSB0ci5xdWVyeVNlbGVjdG9yKCdzdHJvbmcnKTtcbiAgICAgIHNob3dCdWxsZXRSZW9yZGVyKGV4cElkLCB0aXRsZUVsID8gdGl0bGVFbC50ZXh0Q29udGVudCA6ICcnKTtcbiAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PT0gJ3Jvdy11cCcpIHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBtb3ZlRXhwZXJpZW5jZVJvdyhleHBJZCwgLTEpO1xuICAgIH0gZWxzZSBpZiAoYWN0aW9uID09PSAncm93LWRvd24nKSB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgbW92ZUV4cGVyaWVuY2VSb3coZXhwSWQsICsxKTtcbiAgICB9IGVsc2UgaWYgKGFjdGlvbikge1xuICAgICAgaGFuZGxlQWN0aW9uQ2xpY2soZXhwSWQsIGFjdGlvbiwgJ2V4cGVyaWVuY2UnKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIEJ1bGsgdG9vbGJhclxuICBjb25zdCBleHBUb29sYmFyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGV4cFRvb2xiYXIuY2xhc3NOYW1lID0gJ2J1bGstdG9vbGJhcic7XG4gIGV4cFRvb2xiYXIuaW5uZXJIVE1MID0gYFxuICAgIDxzcGFuPkJ1bGs6PC9zcGFuPlxuICAgIDxidXR0b24gY2xhc3M9XCJidWxrLWJ0biBidWxrLXJlY29tbWVuZGVkXCIgb25jbGljaz1cImJ1bGtBY3Rpb24oJ3JlY29tbWVuZGVkJywnZXhwZXJpZW5jZScpXCIgdGl0bGU9XCJTZXQgYWxsIHRvIHRoZSBMTE0gcmVjb21tZW5kYXRpb25cIj5cdTI3MjggQWNjZXB0IEFsbCBSZWNvbW1lbmRlZDwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJidWxrLWJ0biBidWxrLWVtcGhhc2l6ZVwiICAgb25jbGljaz1cImJ1bGtBY3Rpb24oJ2VtcGhhc2l6ZScsJ2V4cGVyaWVuY2UnKVwiPlx1Mjc5NSBFbXBoYXNpemUgQWxsPC9idXR0b24+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImJ1bGstYnRuIGJ1bGstaW5jbHVkZVwiICAgICBvbmNsaWNrPVwiYnVsa0FjdGlvbignaW5jbHVkZScsJ2V4cGVyaWVuY2UnKVwiPlx1MjcxMyBJbmNsdWRlIEFsbDwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJidWxrLWJ0biBidWxrLWV4Y2x1ZGVcIiAgICAgb25jbGljaz1cImJ1bGtBY3Rpb24oJ2V4Y2x1ZGUnLCdleHBlcmllbmNlJylcIj4ke2V5ZVNsYXNoSWNvbigpfSBFeGNsdWRlIEFsbDwvYnV0dG9uPlxuICBgO1xuICBjb250YWluZXIuaW5zZXJ0QmVmb3JlKGV4cFRvb2xiYXIsIGNvbnRhaW5lci5maXJzdENoaWxkKTtcblxuICAvLyBJbml0aWFsaXplIERhdGFUYWJsZSB3aXRoIG5vIGF1dG8tc29ydCAocm93cyBzdGF5IGluIHVzZXItc3BlY2lmaWVkIG9yZGVyKVxuICAkKCcjZXhwZXJpZW5jZS1yZXZpZXctdGFibGUnKS5EYXRhVGFibGUoe1xuICAgIHBhZ2luZzogZmFsc2UsXG4gICAgb3JkZXI6IFtdLFxuICAgIGxhbmd1YWdlOiB7IHNlYXJjaDogJ0ZpbHRlciBleHBlcmllbmNlczonIH1cbiAgfSk7XG4gIF91cGRhdGVQYWdlRXN0aW1hdGUoKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFJvdyByZW9yZGVyIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBtb3ZlRXhwZXJpZW5jZVJvdyhleHBJZCwgZGlyZWN0aW9uKSB7XG4gIGNvbnN0IGFyciA9IHdpbmRvdy5fZXhwZXJpZW5jZXNPcmRlcmVkO1xuICBpZiAoIWFycikgcmV0dXJuO1xuICBjb25zdCBpZHggPSBhcnIuZmluZEluZGV4KGUgPT4gZS5pZCA9PT0gZXhwSWQpO1xuICBpZiAoaWR4IDwgMCkgcmV0dXJuO1xuICBjb25zdCBuZXdJZHggPSBpZHggKyBkaXJlY3Rpb247XG4gIGlmIChuZXdJZHggPCAwIHx8IG5ld0lkeCA+PSBhcnIubGVuZ3RoKSByZXR1cm47XG4gIFthcnJbaWR4XSwgYXJyW25ld0lkeF1dID0gW2FycltuZXdJZHhdLCBhcnJbaWR4XV07XG4gIHdpbmRvdy5fZXhwZXJpZW5jZXNPcmRlcmVkID0gYXJyO1xuICBfcmVuZGVyRXhwZXJpZW5jZVRhYmxlKG51bGwsIG51bGwsIG51bGwpO1xuICAvLyBQZXJzaXN0IHRoZSBuZXcgb3JkZXIgdG8gdGhlIGJhY2tlbmQgKGZpcmUtYW5kLWZvcmdldDsgbm8gVUkgYmxvY2spXG4gIGZldGNoKCcvYXBpL3Jlb3JkZXItcm93cycsIHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHR5cGU6ICdleHBlcmllbmNlJywgb3JkZXJlZF9pZHM6IGFyci5tYXAoZSA9PiBlLmlkKSB9KVxuICB9KS5jYXRjaCgoKSA9PiB7fSk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBMZWdhY3kgaW50ZXJhY3RpdmUtbW9kZSByZXNwb25zZSBoYW5kbGVyIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVFeHBlcmllbmNlUmVzcG9uc2UobWVzc2FnZSkge1xuICB3aW5kb3cud2FpdGluZ0ZvckV4cGVyaWVuY2VSZXNwb25zZSA9IGZhbHNlO1xuICBjb25zdCByZXNwb25zZSA9IG1lc3NhZ2UudG9Mb3dlckNhc2UoKTtcblxuICBpZiAocmVzcG9uc2UuaW5jbHVkZXMoJ3llcycpKSB7XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ0dyZWF0ISBJXFwnbGwgaW5jbHVkZSB0aGlzIGV4cGVyaWVuY2UgcHJvbWluZW50bHkuJyk7XG4gIH0gZWxzZSBpZiAocmVzcG9uc2UuaW5jbHVkZXMoJ25vJykpIHtcbiAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCAnVW5kZXJzdG9vZC4gSVxcJ2xsIGV4Y2x1ZGUgdGhpcyBleHBlcmllbmNlIGZyb20gdGhlIGZpbmFsIENWLicpO1xuICB9IGVsc2UgaWYgKHJlc3BvbnNlLmluY2x1ZGVzKCdtYXliZScpKSB7XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ0lcXCdsbCBpbmNsdWRlIGl0IGJ1dCB3aXRoIGxlc3MgZW1waGFzaXMuJyk7XG4gIH0gZWxzZSB7XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ0lcXCdsbCBub3RlIHlvdXIgZmVlZGJhY2sgb24gdGhpcyBleHBlcmllbmNlLicpO1xuICB9XG5cbiAgLy8gTW92ZSB0byBuZXh0IGV4cGVyaWVuY2UgKGN1cnJlbnRJbmRleCBhbHJlYWR5IGluY3JlbWVudGVkIGluIHNob3dOZXh0RXhwZXJpZW5jZSlcbiAgc2V0VGltZW91dCgoKSA9PiBzaG93TmV4dEV4cGVyaWVuY2UoKSwgODAwKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFN1Ym1pdCBkZWNpc2lvbnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIHN1Ym1pdEV4cGVyaWVuY2VEZWNpc2lvbnMoKSB7XG4gIC8qIGR1Y2tmbG93OlxuICAgKiAgIGlkOiBleHBlcmllbmNlX3VpX3N1Ym1pdF9saXZlXG4gICAqICAga2luZDogdWlcbiAgICogICB0aW1lc3RhbXA6ICcyMDI2LTAzLTI1VDIxOjM5OjQ4WidcbiAgICogICBzdGF0dXM6IGxpdmVcbiAgICogICBoYW5kbGVzOlxuICAgKiAgIC0gdWk6ZXhwZXJpZW5jZS1yZXZpZXcuc3VibWl0XG4gICAqICAgY2FsbHM6XG4gICAqICAgLSBQT1NUIC9hcGkvcmV2aWV3LWRlY2lzaW9uc1xuICAgKiAgIC0gUE9TVCAvYXBpL2N2L2xheW91dC1lc3RpbWF0ZVxuICAgKiAgIHJlYWRzOlxuICAgKiAgIC0gd2luZG93OnVzZXJTZWxlY3Rpb25zLmV4cGVyaWVuY2VzXG4gICAqICAgd3JpdGVzOlxuICAgKiAgIC0gcmVxdWVzdDpQT1NUIC9hcGkvcmV2aWV3LWRlY2lzaW9ucy5kZWNpc2lvbnNcbiAgICogICAtIHdpbmRvdzpfc2F2ZWREZWNpc2lvbnMuZXhwZXJpZW5jZV9kZWNpc2lvbnNcbiAgICogICBub3RlczogUGVyc2lzdHMgcGVyLWV4cGVyaWVuY2UgaW5jbHVzaW9uIGRlY2lzaW9ucyBhbmQgdHJpZ2dlcnMgZG93bnN0cmVhbSBBVFMvbGF5b3V0IHJlZnJlc2hlcyB0aGF0IGRlcGVuZCBvbiB0aGUgc2FtZSByZXZpZXcgY2hvaWNlcy5cbiAgICovXG4gIGNvbnN0IGRlY2lzaW9ucyA9IHVzZXJTZWxlY3Rpb25zLmV4cGVyaWVuY2VzO1xuICBjb25zdCBjb3VudCA9IE9iamVjdC5rZXlzKGRlY2lzaW9ucykubGVuZ3RoO1xuXG4gIGlmIChjb3VudCA9PT0gMCkge1xuICAgIHNob3dBbGVydE1vZGFsKCdObyBTZWxlY3Rpb25zJywgJ1BsZWFzZSBzZWxlY3QgYWN0aW9ucyBmb3IgYXQgbGVhc3Qgb25lIGV4cGVyaWVuY2UgYmVmb3JlIHN1Ym1pdHRpbmcuJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3Jldmlldy1kZWNpc2lvbnMnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICB0eXBlOiAnZXhwZXJpZW5jZXMnLFxuICAgICAgICBkZWNpc2lvbnM6IGRlY2lzaW9uc1xuICAgICAgfSlcbiAgICB9KTtcblxuICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgc3RhdGVNYW5hZ2VyLm1hcmtDb250ZW50Q2hhbmdlZCgpO1xuICAgICAgc2hvd1RvYXN0KGBFeHBlcmllbmNlIGRlY2lzaW9ucyBzYXZlZCAoJHtjb3VudH0gaXRlbXMpYCk7XG4gICAgICBzY2hlZHVsZUF0c1JlZnJlc2goKTtcbiAgICAgIC8vIFBlcnNpc3Qgc2F2ZWQgZGVjaXNpb25zIGxvY2FsbHkgc28gdGhlIFVJIHJlZmxlY3RzIHRoZW0gaW1tZWRpYXRlbHlcbiAgICAgIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMgPSB3aW5kb3cuX3NhdmVkRGVjaXNpb25zIHx8IHt9O1xuICAgICAgd2luZG93Ll9zYXZlZERlY2lzaW9ucy5leHBlcmllbmNlX2RlY2lzaW9ucyA9IGRlY2lzaW9ucztcbiAgICAgIHVzZXJTZWxlY3Rpb25zLmV4cGVyaWVuY2VzID0geyAuLi5kZWNpc2lvbnMgfTtcbiAgICAgIGlmICh0eXBlb2YgdXBkYXRlSW5jbHVzaW9uQ291bnRzID09PSAnZnVuY3Rpb24nKSB1cGRhdGVJbmNsdXNpb25Db3VudHMoKTtcbiAgICAgIHN3aXRjaFRhYignYWNoLWVkaXRvcicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBlcnJvciA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIHNob3dUb2FzdChgRXJyb3I6ICR7ZXJyb3IuZXJyb3IgfHwgJ0ZhaWxlZCB0byBzYXZlIGRlY2lzaW9ucyd9YCwgJ2Vycm9yJyk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy5lcnJvcignRXJyb3Igc3VibWl0dGluZyBleHBlcmllbmNlIGRlY2lzaW9uczonLCBlcnJvcik7XG4gICAgc2hvd1RvYXN0KCdGYWlsZWQgdG8gc2F2ZSBkZWNpc2lvbnMuIFBsZWFzZSB0cnkgYWdhaW4uJywgJ2Vycm9yJyk7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIEV4cG9ydHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmV4cG9ydCB7XG4gIGdldEV4cGVyaWVuY2VEZXRhaWxzLFxuICBidWlsZEV4cGVyaWVuY2VSZXZpZXdUYWJsZSxcbiAgX3JlbmRlckV4cGVyaWVuY2VUYWJsZSxcbiAgbW92ZUV4cGVyaWVuY2VSb3csXG4gIGhhbmRsZUV4cGVyaWVuY2VSZXNwb25zZSxcbiAgc3VibWl0RXhwZXJpZW5jZURlY2lzaW9ucyxcbn07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9za2lsbHMtcmV2aWV3LmpzXG4gKiBTa2lsbHMtcmV2aWV3IHRhYmxlOiBmZXRjaCwgcmVuZGVyLCByb3ctcmVvcmRlciwgYW5kIHN1Ym1pdCBkZWNpc2lvbnMuXG4gKlxuICogRGVwZW5kZW5jaWVzIChyZXNvbHZlZCB0aHJvdWdoIGdsb2JhbFRoaXMgYXQgcnVudGltZSk6XG4gKiAgIHVzZXJTZWxlY3Rpb25zLCBwZW5kaW5nUmVjb21tZW5kYXRpb25zLCBfc2F2ZWREZWNpc2lvbnMsIF9za2lsbHNPcmRlcmVkLFxuICogICBfbmV3U2tpbGxzRnJvbUxMTSwgdGFiRGF0YSwgcGFyc2VTdGF0dXNSZXNwb25zZSxcbiAqICAgZ2V0U2tpbGxSZWNvbW1lbmRhdGlvbiwgZ2V0U2tpbGxDb25maWRlbmNlLCBnZXRTa2lsbFJlYXNvbmluZyxcbiAqICAgZXNjYXBlSHRtbCwgaGFuZGxlQWN0aW9uQ2xpY2ssIGJ1bGtBY3Rpb24sIF91cGRhdGVQYWdlRXN0aW1hdGUsXG4gKiAgIHVwZGF0ZUluY2x1c2lvbkNvdW50cywgc3dpdGNoVGFiLFxuICogICBzaG93QWxlcnRNb2RhbCwgc2hvd1RvYXN0LCBzY2hlZHVsZUF0c1JlZnJlc2gsXG4gKiAgICQsICQuZm4uRGF0YVRhYmxlIChqUXVlcnkgKyBEYXRhVGFibGVzKVxuICovXG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmNvbnN0IGxvZyA9IGdldExvZ2dlcignc2tpbGxzLXJldmlldycpO1xuXG5pbXBvcnQgeyBzdGF0ZU1hbmFnZXIgfSBmcm9tICcuL3N0YXRlLW1hbmFnZXIuanMnO1xuaW1wb3J0IHsgZXllU2xhc2hJY29uIH0gZnJvbSAnLi9yZXZpZXctaWNvbnMuanMnO1xuXG4vLyBcdTI1MDBcdTI1MDAgWWVhcnMtZnJvbS1leHBlcmllbmNlIGhlbHBlcnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIF9wYXJzZVllYXJGcm9tU3RyKHN0cikge1xuICBpZiAoIXN0cikgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHMgPSBTdHJpbmcoc3RyKS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgaWYgKFsnY3VycmVudCcsICdwcmVzZW50JywgJ25vdycsICdvbmdvaW5nJ10uaW5jbHVkZXMocykpIHJldHVybiBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCk7XG4gIGNvbnN0IG0gPSBzLm1hdGNoKC9cXGIoMTl8MjApXFxkezJ9XFxiLyk7XG4gIHJldHVybiBtID8gcGFyc2VJbnQobVswXSwgMTApIDogbnVsbDtcbn1cblxuLyoqXG4gKiBHaXZlbiBhIGxpc3Qgb2YgZXhwZXJpZW5jZSBJRHMgYW5kIHRoZSBmdWxsIGV4cGVyaWVuY2VzIGFycmF5LCByZXR1cm5cbiAqIHRoZSB0b3RhbCB5ZWFycyBvZiBleHBlcmllbmNlIChzdW0gb2YgZHVyYXRpb24gb2YgbWF0Y2hlZCBlbnRyaWVzKS5cbiAqIFJldHVybnMgbnVsbCBpZiBubyBtYXRjaGluZyBlbnRyaWVzIGZvdW5kLlxuICovXG5mdW5jdGlvbiBfY29tcHV0ZVllYXJzRnJvbUlkcyhpZHMsIGFsbEV4cGVyaWVuY2VzKSB7XG4gIGNvbnN0IGlkU2V0ID0gbmV3IFNldCgoaWRzIHx8IFtdKS5tYXAoeCA9PiBTdHJpbmcoeCkudHJpbSgpKS5maWx0ZXIoQm9vbGVhbikpO1xuICBpZiAoaWRTZXQuc2l6ZSA9PT0gMCkgcmV0dXJuIG51bGw7XG4gIGxldCB0b3RhbCA9IDA7XG4gIGNvbnN0IGN1cnJlbnRZZWFyID0gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpO1xuICBmb3IgKGNvbnN0IGV4cCBvZiAoYWxsRXhwZXJpZW5jZXMgfHwgW10pKSB7XG4gICAgaWYgKCFleHAgfHwgdHlwZW9mIGV4cCAhPT0gJ29iamVjdCcpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGV4cElkID0gU3RyaW5nKGV4cC5pZCB8fCAnJykudHJpbSgpO1xuICAgIGlmICghaWRTZXQuaGFzKGV4cElkKSkgY29udGludWU7XG4gICAgY29uc3Qgc3RhcnRZZWFyID0gX3BhcnNlWWVhckZyb21TdHIoZXhwLnN0YXJ0X2RhdGUgfHwgZXhwLnN0YXJ0KTtcbiAgICBjb25zdCBlbmRZZWFyICAgPSBfcGFyc2VZZWFyRnJvbVN0cihleHAuZW5kX2RhdGUgICB8fCBleHAuZW5kKSA/PyBjdXJyZW50WWVhcjtcbiAgICB0b3RhbCArPSBzdGFydFllYXIgPT0gbnVsbCA/IDEgOiBNYXRoLm1heCgxLCBlbmRZZWFyIC0gc3RhcnRZZWFyICsgMSk7XG4gIH1cbiAgcmV0dXJuIHRvdGFsID4gMCA/IHRvdGFsIDogbnVsbDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZVNraWxsR3JvdXBPdmVycmlkZShza2lsbE5hbWUsIGdyb3VwTmFtZSkge1xuICBjb25zdCBub3JtYWxpemVkR3JvdXAgPSBncm91cE5hbWUgPT0gbnVsbCA/IG51bGwgOiBTdHJpbmcoZ3JvdXBOYW1lKS50cmltKCkgfHwgbnVsbDtcbiAgY29uc3Qgc2sgPSAod2luZG93Ll9za2lsbHNPcmRlcmVkIHx8IFtdKS5maW5kKHMgPT4gKHR5cGVvZiBzID09PSAnc3RyaW5nJyA/IHMgOiBzLm5hbWUgfHwgcykgPT09IHNraWxsTmFtZSk7XG4gIGlmIChzayAmJiB0eXBlb2Ygc2sgPT09ICdvYmplY3QnKSBzay5ncm91cCA9IG5vcm1hbGl6ZWRHcm91cCB8fCAnJztcblxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3Jldmlldy1za2lsbC1ncm91cCcsIHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHNraWxsOiBza2lsbE5hbWUsIGdyb3VwOiBub3JtYWxpemVkR3JvdXAgfSksXG4gIH0pO1xuXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICBjb25zdCBlcnJvciA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3IuZXJyb3IgfHwgJ0ZhaWxlZCB0byBzYXZlIHNraWxsIGdyb3VwJyk7XG4gIH1cblxuICByZXR1cm4gcmVzcG9uc2U7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNhdmVTa2lsbENhdGVnb3J5T3ZlcnJpZGUoc2tpbGxOYW1lLCBjYXRlZ29yeU5hbWUpIHtcbiAgY29uc3Qgbm9ybWFsaXplZENhdGVnb3J5ID0gY2F0ZWdvcnlOYW1lID09IG51bGwgPyBudWxsIDogU3RyaW5nKGNhdGVnb3J5TmFtZSkudHJpbSgpIHx8IG51bGw7XG4gIGNvbnN0IHNrID0gKHdpbmRvdy5fc2tpbGxzT3JkZXJlZCB8fCBbXSkuZmluZChzID0+ICh0eXBlb2YgcyA9PT0gJ3N0cmluZycgPyBzIDogcy5uYW1lIHx8IHMpID09PSBza2lsbE5hbWUpO1xuICBpZiAoc2sgJiYgdHlwZW9mIHNrID09PSAnb2JqZWN0Jykge1xuICAgIGlmIChub3JtYWxpemVkQ2F0ZWdvcnkpIHNrLmNhdGVnb3J5ID0gbm9ybWFsaXplZENhdGVnb3J5O1xuICAgIGVsc2UgZGVsZXRlIHNrLmNhdGVnb3J5O1xuICB9XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9yZXZpZXctc2tpbGwtY2F0ZWdvcnknLCB7XG4gICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBza2lsbDogc2tpbGxOYW1lLCBjYXRlZ29yeTogbm9ybWFsaXplZENhdGVnb3J5IH0pLFxuICB9KTtcblxuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgY29uc3QgZXJyb3IgPSBhd2FpdCByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGVycm9yLmVycm9yIHx8ICdGYWlsZWQgdG8gc2F2ZSBza2lsbCBjYXRlZ29yeScpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3BvbnNlO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW5hbWVTa2lsbENhdGVnb3J5KG9sZENhdGVnb3J5LCBuZXdDYXRlZ29yeSkge1xuICBjb25zdCBub3JtYWxpemVkT2xkID0gU3RyaW5nKG9sZENhdGVnb3J5IHx8ICcnKS50cmltKCk7XG4gIGNvbnN0IG5vcm1hbGl6ZWROZXcgPSBTdHJpbmcobmV3Q2F0ZWdvcnkgfHwgJycpLnRyaW0oKTtcblxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3Jldmlldy1za2lsbC1jYXRlZ29yaWVzJywge1xuICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGFjdGlvbjogJ3JlbmFtZScsXG4gICAgICBvbGRfY2F0ZWdvcnk6IG5vcm1hbGl6ZWRPbGQsXG4gICAgICBuZXdfY2F0ZWdvcnk6IG5vcm1hbGl6ZWROZXcsXG4gICAgfSksXG4gIH0pO1xuXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICBjb25zdCBlcnJvciA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3IuZXJyb3IgfHwgJ0ZhaWxlZCB0byByZW5hbWUgc2tpbGwgY2F0ZWdvcnknKTtcbiAgfVxuXG4gIHJldHVybiByZXNwb25zZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZVNraWxsQ2F0ZWdvcnlPcmRlcihvcmRlcmVkQ2F0ZWdvcmllcykge1xuICBjb25zdCBub3JtYWxpemVkT3JkZXIgPSBBcnJheS5mcm9tKG5ldyBTZXQoXG4gICAgKG9yZGVyZWRDYXRlZ29yaWVzIHx8IFtdKVxuICAgICAgLm1hcChjYXRlZ29yeSA9PiBTdHJpbmcoY2F0ZWdvcnkgfHwgJycpLnRyaW0oKSlcbiAgICAgIC5maWx0ZXIoQm9vbGVhbiksXG4gICkpO1xuXG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvcmV2aWV3LXNraWxsLWNhdGVnb3JpZXMnLCB7XG4gICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgYWN0aW9uOiAncmVvcmRlcicsXG4gICAgICBvcmRlcmVkX2NhdGVnb3JpZXM6IG5vcm1hbGl6ZWRPcmRlcixcbiAgICB9KSxcbiAgfSk7XG5cbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIGNvbnN0IGVycm9yID0gYXdhaXQgcmVzcG9uc2UuanNvbigpLmNhdGNoKCgpID0+ICh7fSkpO1xuICAgIHRocm93IG5ldyBFcnJvcihlcnJvci5lcnJvciB8fCAnRmFpbGVkIHRvIHNhdmUgc2tpbGwgY2F0ZWdvcnkgb3JkZXInKTtcbiAgfVxuXG4gIHJldHVybiByZXNwb25zZTtcbn1cblxuZnVuY3Rpb24gX25vcm1hbGl6ZVNraWxsU3Vic2tpbGxzKHZhbHVlKSB7XG4gIGNvbnN0IHJhd1ZhbHVlcyA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBTdHJpbmcodmFsdWUgfHwgJycpLnNwbGl0KCcsJyk7XG4gIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQoXG4gICAgcmF3VmFsdWVzXG4gICAgICAubWFwKGl0ZW0gPT4gU3RyaW5nKGl0ZW0gfHwgJycpLnRyaW0oKSlcbiAgICAgIC5maWx0ZXIoQm9vbGVhbiksXG4gICkpO1xufVxuXG5mdW5jdGlvbiBfc2tpbGxOYW1lKHNraWxsKSB7XG4gIHJldHVybiB0eXBlb2Ygc2tpbGwgPT09ICdzdHJpbmcnID8gc2tpbGwgOiBTdHJpbmcoc2tpbGw/Lm5hbWUgfHwgc2tpbGwgfHwgJycpLnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gX25vcm1hbGl6ZUV4dHJhU2tpbGxFbnRyeShyYXdTa2lsbCwgeyB1c2VyQ3JlYXRlZCA9IGZhbHNlIH0gPSB7fSkge1xuICBpZiAodHlwZW9mIHJhd1NraWxsID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IG5hbWUgPSByYXdTa2lsbC50cmltKCk7XG4gICAgcmV0dXJuIG5hbWUgPyB7IG5hbWUsIF9pc05ldzogdHJ1ZSB9IDogbnVsbDtcbiAgfVxuICBpZiAoIXJhd1NraWxsIHx8IHR5cGVvZiByYXdTa2lsbCAhPT0gJ29iamVjdCcpIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IG5hbWUgPSBTdHJpbmcocmF3U2tpbGwubmFtZSB8fCAnJykudHJpbSgpO1xuICBpZiAoIW5hbWUpIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSB7XG4gICAgLi4ucmF3U2tpbGwsXG4gICAgbmFtZSxcbiAgICBfaXNOZXc6IHRydWUsXG4gIH07XG4gIGNvbnN0IHN1YnNraWxscyA9IF9ub3JtYWxpemVTa2lsbFN1YnNraWxscyhyYXdTa2lsbC5zdWJza2lsbHMgfHwgcmF3U2tpbGwuc3ViX3NraWxscyB8fCBbXSk7XG4gIGlmIChzdWJza2lsbHMubGVuZ3RoID4gMCkgbm9ybWFsaXplZC5zdWJza2lsbHMgPSBzdWJza2lsbHM7XG4gIGVsc2UgZGVsZXRlIG5vcm1hbGl6ZWQuc3Vic2tpbGxzO1xuXG4gIGlmICh1c2VyQ3JlYXRlZCB8fCByYXdTa2lsbC51c2VyX2NyZWF0ZWQgfHwgcmF3U2tpbGwuX2lzVXNlckNyZWF0ZWQpIHtcbiAgICBub3JtYWxpemVkLnVzZXJfY3JlYXRlZCA9IHRydWU7XG4gICAgbm9ybWFsaXplZC5faXNVc2VyQ3JlYXRlZCA9IHRydWU7XG4gIH1cblxuICByZXR1cm4gbm9ybWFsaXplZDtcbn1cblxuZnVuY3Rpb24gX3NraWxsSW5saW5lTGFiZWwoc2tpbGwpIHtcbiAgaWYgKCFza2lsbCB8fCB0eXBlb2Ygc2tpbGwgPT09ICdzdHJpbmcnKSByZXR1cm4gX3NraWxsTmFtZShza2lsbCk7XG4gIGNvbnN0IG5hbWUgPSBfc2tpbGxOYW1lKHNraWxsKTtcbiAgY29uc3QgcGFyZW50aGV0aWNhbCA9IFN0cmluZyhza2lsbC5wYXJlbnRoZXRpY2FsIHx8ICcnKS50cmltKCk7XG4gIGlmIChwYXJlbnRoZXRpY2FsKSByZXR1cm4gYCR7bmFtZX0gKCR7cGFyZW50aGV0aWNhbH0pYDtcblxuICBjb25zdCBxdWFsaWZpZXJQYXJ0cyA9IFtdO1xuICBjb25zdCBwcm9maWNpZW5jeSA9IFN0cmluZyhza2lsbC5wcm9maWNpZW5jeSB8fCAnJykudHJpbSgpO1xuICBpZiAocHJvZmljaWVuY3kpIHF1YWxpZmllclBhcnRzLnB1c2gocHJvZmljaWVuY3kuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBwcm9maWNpZW5jeS5zbGljZSgxKSk7XG4gIF9ub3JtYWxpemVTa2lsbFN1YnNraWxscyhza2lsbC5zdWJza2lsbHMgfHwgc2tpbGwuc3ViX3NraWxscyB8fCBbXSkuZm9yRWFjaChpdGVtID0+IHF1YWxpZmllclBhcnRzLnB1c2goaXRlbSkpO1xuICBpZiAocXVhbGlmaWVyUGFydHMubGVuZ3RoID4gMCkgcmV0dXJuIGAke25hbWV9ICgke3F1YWxpZmllclBhcnRzLmpvaW4oJywgJyl9KWA7XG4gIHJldHVybiBuYW1lO1xufVxuXG5mdW5jdGlvbiBfZmluZFNraWxsUmVjb21tZW5kYXRpb25SZWNvcmQoc2tpbGxOYW1lLCBkYXRhKSB7XG4gIGlmICghZGF0YSB8fCAhQXJyYXkuaXNBcnJheShkYXRhLnNraWxsX3JlY29tbWVuZGF0aW9ucykpIHJldHVybiBudWxsO1xuICByZXR1cm4gZGF0YS5za2lsbF9yZWNvbW1lbmRhdGlvbnMuZmluZCgocmVjKSA9PiB7XG4gICAgY29uc3QgcmVjTmFtZSA9IFN0cmluZyhyZWM/LnNraWxsIHx8IHJlYz8ubmFtZSB8fCAnJykudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIHJlY05hbWUgPT09IFN0cmluZyhza2lsbE5hbWUgfHwgJycpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICB9KSB8fCBudWxsO1xufVxuXG5mdW5jdGlvbiBfYnVpbGRTa2lsbEdyb3VwaW5nU3VnZ2VzdGlvbihyZWMsIHNraWxsKSB7XG4gIGNvbnN0IGdyb3VwaW5nID0gcmVjICYmIHR5cGVvZiByZWMuZ3JvdXBpbmcgPT09ICdvYmplY3QnID8gcmVjLmdyb3VwaW5nIDogbnVsbDtcbiAgaWYgKCFncm91cGluZykgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgY3VycmVudENhdGVnb3J5ID0gdHlwZW9mIHNraWxsID09PSAnb2JqZWN0JyA/IFN0cmluZyhza2lsbC5jYXRlZ29yeSB8fCAnJykudHJpbSgpIDogJyc7XG4gIGNvbnN0IGN1cnJlbnRHcm91cCA9IHR5cGVvZiBza2lsbCA9PT0gJ29iamVjdCcgPyBTdHJpbmcoc2tpbGwuZ3JvdXAgfHwgJycpLnRyaW0oKSA6ICcnO1xuICBjb25zdCBzdWdnZXN0ZWRDYXRlZ29yeSA9IFN0cmluZyhncm91cGluZy5jYXRlZ29yeSB8fCAnJykudHJpbSgpO1xuICBjb25zdCBzdWdnZXN0ZWRHcm91cCA9IFN0cmluZyhncm91cGluZy5ncm91cCB8fCAnJykudHJpbSgpO1xuICBjb25zdCBjYXRlZ29yeUNoYW5nZWQgPSBCb29sZWFuKHN1Z2dlc3RlZENhdGVnb3J5ICYmIHN1Z2dlc3RlZENhdGVnb3J5ICE9PSBjdXJyZW50Q2F0ZWdvcnkpO1xuICBjb25zdCBncm91cENoYW5nZWQgPSBCb29sZWFuKHN1Z2dlc3RlZEdyb3VwICYmIHN1Z2dlc3RlZEdyb3VwICE9PSBjdXJyZW50R3JvdXApO1xuXG4gIGlmICghY2F0ZWdvcnlDaGFuZ2VkICYmICFncm91cENoYW5nZWQpIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IGNoYW5nZVBhcnRzID0gW107XG4gIGlmIChjYXRlZ29yeUNoYW5nZWQpIHtcbiAgICBjaGFuZ2VQYXJ0cy5wdXNoKGBDYXRlZ29yeTogJHtjdXJyZW50Q2F0ZWdvcnkgfHwgJ1VuY2F0ZWdvcml6ZWQnfSAtPiAke3N1Z2dlc3RlZENhdGVnb3J5fWApO1xuICB9XG4gIGlmIChncm91cENoYW5nZWQpIHtcbiAgICBjaGFuZ2VQYXJ0cy5wdXNoKGBHcm91cDogJHtjdXJyZW50R3JvdXAgfHwgJ05vbmUnfSAtPiAke3N1Z2dlc3RlZEdyb3VwfWApO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBjYXRlZ29yeTogc3VnZ2VzdGVkQ2F0ZWdvcnksXG4gICAgZ3JvdXA6IHN1Z2dlc3RlZEdyb3VwLFxuICAgIGNhdGVnb3J5Q2hhbmdlZCxcbiAgICBncm91cENoYW5nZWQsXG4gICAgY2hhbmdlVGV4dDogY2hhbmdlUGFydHMuam9pbignIHwgJyksXG4gICAgcmVhc29uaW5nOiBTdHJpbmcoZ3JvdXBpbmcucmVhc29uaW5nIHx8ICcnKS50cmltKCksXG4gICAgYXRzSW1wYWN0OiBTdHJpbmcoZ3JvdXBpbmcuYXRzX2ltcGFjdCB8fCAnJykudHJpbSgpLFxuICAgIHBhZ2VMZW5ndGhJbXBhY3Q6IFN0cmluZyhncm91cGluZy5wYWdlX2xlbmd0aF9pbXBhY3QgfHwgJycpLnRyaW0oKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gX2Nzc0VzY2FwZSh2YWx1ZSkge1xuICBpZiAoZ2xvYmFsVGhpcy5DU1MgJiYgdHlwZW9mIGdsb2JhbFRoaXMuQ1NTLmVzY2FwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBnbG9iYWxUaGlzLkNTUy5lc2NhcGUoU3RyaW5nKHZhbHVlKSk7XG4gIH1cbiAgcmV0dXJuIFN0cmluZyh2YWx1ZSkucmVwbGFjZSgvXFxcXC9nLCAnXFxcXFxcXFwnKS5yZXBsYWNlKC9cIi9nLCAnXFxcXFwiJyk7XG59XG5cbmZ1bmN0aW9uIF9idWlsZEdyb3VwV2FybmluZ3Moc2tpbGxzKSB7XG4gIGNvbnN0IHdhcm5pbmdNYXAgPSBuZXcgTWFwKCk7XG4gIGNvbnN0IGdyb3VwcyA9IG5ldyBNYXAoKTtcbiAgZm9yIChjb25zdCBza2lsbCBvZiBza2lsbHMgfHwgW10pIHtcbiAgICBpZiAoIXNraWxsIHx8IHR5cGVvZiBza2lsbCAhPT0gJ29iamVjdCcpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHNraWxsTmFtZSA9IF9za2lsbE5hbWUoc2tpbGwpO1xuICAgIGNvbnN0IGdyb3VwTmFtZSA9IFN0cmluZyhza2lsbC5ncm91cCB8fCAnJykudHJpbSgpO1xuICAgIGlmICghc2tpbGxOYW1lIHx8ICFncm91cE5hbWUpIGNvbnRpbnVlO1xuICAgIGlmICghZ3JvdXBzLmhhcyhncm91cE5hbWUpKSBncm91cHMuc2V0KGdyb3VwTmFtZSwgW10pO1xuICAgIGdyb3Vwcy5nZXQoZ3JvdXBOYW1lKS5wdXNoKF9za2lsbElubGluZUxhYmVsKHNraWxsKSk7XG4gIH1cblxuICBncm91cHMuZm9yRWFjaCgobGFiZWxzLCBncm91cE5hbWUpID0+IHtcbiAgICBjb25zdCBwcmV2aWV3ID0gbGFiZWxzLmpvaW4oJywgJyk7XG4gICAgY29uc3QgY3Jvd2RlZCA9IHByZXZpZXcubGVuZ3RoID49IDkwIHx8IGxhYmVscy5sZW5ndGggPj0gNTtcbiAgICBpZiAoIWNyb3dkZWQpIHJldHVybjtcbiAgICB3YXJuaW5nTWFwLnNldChncm91cE5hbWUsIHtcbiAgICAgIHByZXZpZXcsXG4gICAgICBtZW1iZXJDb3VudDogbGFiZWxzLmxlbmd0aCxcbiAgICAgIG1lc3NhZ2U6IGBJbmxpbmUgYnVsbGV0IG1heSBiZSBoYXJkIHRvIHNjYW4gKCR7bGFiZWxzLmxlbmd0aH0gc2tpbGxzLCAke3ByZXZpZXcubGVuZ3RofSBjaGFycykuYCxcbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHdhcm5pbmdNYXA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNhdmVTa2lsbFF1YWxpZmllck92ZXJyaWRlKHNraWxsTmFtZSwgcXVhbGlmaWVycykge1xuICBjb25zdCBub3JtYWxpemVkU2tpbGwgPSBTdHJpbmcoc2tpbGxOYW1lIHx8ICcnKS50cmltKCk7XG4gIGlmICghbm9ybWFsaXplZFNraWxsKSB0aHJvdyBuZXcgRXJyb3IoJ1NraWxsIG5hbWUgaXMgcmVxdWlyZWQnKTtcblxuICBjb25zdCBub3JtYWxpemVkUHJvZmljaWVuY3kgPSBTdHJpbmcocXVhbGlmaWVycz8ucHJvZmljaWVuY3kgfHwgJycpLnRyaW0oKTtcbiAgY29uc3Qgbm9ybWFsaXplZFN1YnNraWxscyA9IF9ub3JtYWxpemVTa2lsbFN1YnNraWxscyhxdWFsaWZpZXJzPy5zdWJza2lsbHMpO1xuICBjb25zdCBub3JtYWxpemVkUGFyZW50aGV0aWNhbCA9IFN0cmluZyhxdWFsaWZpZXJzPy5wYXJlbnRoZXRpY2FsIHx8ICcnKS50cmltKCk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRTa2lsbFR5cGUgPSBTdHJpbmcocXVhbGlmaWVycz8uc2tpbGxfdHlwZSB8fCAnJykudHJpbSgpLnRvTG93ZXJDYXNlKCkgfHwgbnVsbDtcblxuICBjb25zdCBzayA9ICh3aW5kb3cuX3NraWxsc09yZGVyZWQgfHwgW10pLmZpbmQocyA9PiAodHlwZW9mIHMgPT09ICdzdHJpbmcnID8gcyA6IHMubmFtZSB8fCBzKSA9PT0gbm9ybWFsaXplZFNraWxsKTtcbiAgaWYgKHNrICYmIHR5cGVvZiBzayA9PT0gJ29iamVjdCcpIHtcbiAgICBpZiAobm9ybWFsaXplZFByb2ZpY2llbmN5KSBzay5wcm9maWNpZW5jeSA9IG5vcm1hbGl6ZWRQcm9maWNpZW5jeTtcbiAgICBlbHNlIGRlbGV0ZSBzay5wcm9maWNpZW5jeTtcblxuICAgIGlmIChub3JtYWxpemVkU3Vic2tpbGxzLmxlbmd0aCA+IDApIHNrLnN1YnNraWxscyA9IG5vcm1hbGl6ZWRTdWJza2lsbHM7XG4gICAgZWxzZSBkZWxldGUgc2suc3Vic2tpbGxzO1xuXG4gICAgaWYgKG5vcm1hbGl6ZWRQYXJlbnRoZXRpY2FsKSBzay5wYXJlbnRoZXRpY2FsID0gbm9ybWFsaXplZFBhcmVudGhldGljYWw7XG4gICAgZWxzZSBkZWxldGUgc2sucGFyZW50aGV0aWNhbDtcbiAgfVxuXG4gIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgc2tpbGw6IG5vcm1hbGl6ZWRTa2lsbCxcbiAgICBwcm9maWNpZW5jeTogbm9ybWFsaXplZFByb2ZpY2llbmN5LFxuICAgIHN1YnNraWxsczogbm9ybWFsaXplZFN1YnNraWxscyxcbiAgICBwYXJlbnRoZXRpY2FsOiBub3JtYWxpemVkUGFyZW50aGV0aWNhbCxcbiAgfTtcbiAgaWYgKCdza2lsbF90eXBlJyBpbiAocXVhbGlmaWVycyB8fCB7fSkpIHtcbiAgICBwYXlsb2FkLnNraWxsX3R5cGUgPSBub3JtYWxpemVkU2tpbGxUeXBlO1xuICB9XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9yZXZpZXctc2tpbGwtcXVhbGlmaWVycycsIHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeShwYXlsb2FkKSxcbiAgfSk7XG5cbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIGNvbnN0IGVycm9yID0gYXdhaXQgcmVzcG9uc2UuanNvbigpLmNhdGNoKCgpID0+ICh7fSkpO1xuICAgIHRocm93IG5ldyBFcnJvcihlcnJvci5lcnJvciB8fCAnRmFpbGVkIHRvIHNhdmUgc2tpbGwgcXVhbGlmaWVycycpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3BvbnNlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzYXZlVXNlckNyZWF0ZWRTa2lsbChza2lsbCkge1xuICBjb25zdCBwYXlsb2FkID0ge1xuICAgIG5hbWU6IFN0cmluZyhza2lsbD8ubmFtZSB8fCAnJykudHJpbSgpLFxuICAgIGNhdGVnb3J5OiBTdHJpbmcoc2tpbGw/LmNhdGVnb3J5IHx8ICcnKS50cmltKCksXG4gICAgZ3JvdXA6IFN0cmluZyhza2lsbD8uZ3JvdXAgfHwgJycpLnRyaW0oKSxcbiAgICBwcm9maWNpZW5jeTogU3RyaW5nKHNraWxsPy5wcm9maWNpZW5jeSB8fCAnJykudHJpbSgpLFxuICAgIHN1YnNraWxsczogX25vcm1hbGl6ZVNraWxsU3Vic2tpbGxzKHNraWxsPy5zdWJza2lsbHMpLFxuICAgIHBhcmVudGhldGljYWw6IFN0cmluZyhza2lsbD8ucGFyZW50aGV0aWNhbCB8fCAnJykudHJpbSgpLFxuICB9O1xuICBpZiAoIXBheWxvYWQubmFtZSkgdGhyb3cgbmV3IEVycm9yKCdTa2lsbCBuYW1lIGlzIHJlcXVpcmVkJyk7XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9yZXZpZXctc2tpbGwtYWRkJywge1xuICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpLFxuICB9KTtcblxuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgY29uc3QgZXJyb3IgPSBhd2FpdCByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGVycm9yLmVycm9yIHx8ICdGYWlsZWQgdG8gYWRkIHNraWxsJyk7XG4gIH1cblxuICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBfbm9ybWFsaXplRXh0cmFTa2lsbEVudHJ5KHJlc3VsdC5za2lsbCwgeyB1c2VyQ3JlYXRlZDogdHJ1ZSB9KTtcbiAgaWYgKCFub3JtYWxpemVkKSB0aHJvdyBuZXcgRXJyb3IoJ1NlcnZlciBkaWQgbm90IHJldHVybiBhIHNraWxsJyk7XG5cbiAgY29uc3QgY3VycmVudCA9IEFycmF5LmlzQXJyYXkod2luZG93Ll9za2lsbHNPcmRlcmVkKSA/IHdpbmRvdy5fc2tpbGxzT3JkZXJlZCA6IFtdO1xuICB3aW5kb3cuX3NraWxsc09yZGVyZWQgPSBbbm9ybWFsaXplZCwgLi4uY3VycmVudC5maWx0ZXIoc2tpbGwgPT4gX3NraWxsTmFtZShza2lsbCkgIT09IG5vcm1hbGl6ZWQubmFtZSldO1xuXG4gIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMgPSB3aW5kb3cuX3NhdmVkRGVjaXNpb25zIHx8IHt9O1xuICBjb25zdCBleGlzdGluZ0V4dHJhcyA9IEFycmF5LmlzQXJyYXkod2luZG93Ll9zYXZlZERlY2lzaW9ucy5leHRyYV9za2lsbHMpXG4gICAgPyB3aW5kb3cuX3NhdmVkRGVjaXNpb25zLmV4dHJhX3NraWxsc1xuICAgIDogW107XG4gIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMuZXh0cmFfc2tpbGxzID0gW1xuICAgIG5vcm1hbGl6ZWQsXG4gICAgLi4uZXhpc3RpbmdFeHRyYXMuZmlsdGVyKHNraWxsID0+IF9za2lsbE5hbWUoc2tpbGwpICE9PSBub3JtYWxpemVkLm5hbWUpLFxuICBdO1xuXG4gIHVzZXJTZWxlY3Rpb25zLnNraWxsc1tub3JtYWxpemVkLm5hbWVdID0gdXNlclNlbGVjdGlvbnMuc2tpbGxzW25vcm1hbGl6ZWQubmFtZV0gfHwgJ2luY2x1ZGUnO1xuICByZXR1cm4gbm9ybWFsaXplZDtcbn1cblxuZnVuY3Rpb24gX2VmZmVjdGl2ZVNraWxsQ2F0ZWdvcnkoc2tpbGwpIHtcbiAgaWYgKCFza2lsbCB8fCB0eXBlb2Ygc2tpbGwgPT09ICdzdHJpbmcnKSByZXR1cm4gJyc7XG4gIHJldHVybiBTdHJpbmcoc2tpbGwuY2F0ZWdvcnkgfHwgJycpLnRyaW0oKSB8fCAnR2VuZXJhbCc7XG59XG5cbmZ1bmN0aW9uIF9zeW5jU2tpbGxDYXRlZ29yeU9yZGVyKCkge1xuICBjb25zdCBza2lsbHMgPSBBcnJheS5pc0FycmF5KHdpbmRvdy5fc2tpbGxzT3JkZXJlZCkgPyB3aW5kb3cuX3NraWxsc09yZGVyZWQgOiBbXTtcbiAgY29uc3Qgb3JkZXJlZCA9IFtdO1xuICBmb3IgKGNvbnN0IHNraWxsIG9mIHNraWxscykge1xuICAgIGNvbnN0IGNhdGVnb3J5ID0gX2VmZmVjdGl2ZVNraWxsQ2F0ZWdvcnkoc2tpbGwpO1xuICAgIGlmIChjYXRlZ29yeSAmJiAhb3JkZXJlZC5pbmNsdWRlcyhjYXRlZ29yeSkpIG9yZGVyZWQucHVzaChjYXRlZ29yeSk7XG4gIH1cbiAgd2luZG93Ll9za2lsbENhdGVnb3J5T3JkZXIgPSBvcmRlcmVkO1xuICByZXR1cm4gb3JkZXJlZDtcbn1cblxuZnVuY3Rpb24gX3JlbmFtZVNraWxsQ2F0ZWdvcnlMb2NhbGx5KG9sZENhdGVnb3J5LCBuZXdDYXRlZ29yeSkge1xuICBjb25zdCBub3JtYWxpemVkT2xkID0gU3RyaW5nKG9sZENhdGVnb3J5IHx8ICcnKS50cmltKCk7XG4gIGNvbnN0IG5vcm1hbGl6ZWROZXcgPSBTdHJpbmcobmV3Q2F0ZWdvcnkgfHwgJycpLnRyaW0oKTtcbiAgaWYgKCFub3JtYWxpemVkT2xkIHx8ICFub3JtYWxpemVkTmV3KSByZXR1cm47XG5cbiAgZm9yIChjb25zdCBza2lsbCBvZiAod2luZG93Ll9za2lsbHNPcmRlcmVkIHx8IFtdKSkge1xuICAgIGlmICghc2tpbGwgfHwgdHlwZW9mIHNraWxsICE9PSAnb2JqZWN0JykgY29udGludWU7XG4gICAgaWYgKF9lZmZlY3RpdmVTa2lsbENhdGVnb3J5KHNraWxsKSA9PT0gbm9ybWFsaXplZE9sZCkge1xuICAgICAgc2tpbGwuY2F0ZWdvcnkgPSBub3JtYWxpemVkTmV3O1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGN1cnJlbnRPcmRlciA9IEFycmF5LmlzQXJyYXkod2luZG93Ll9za2lsbENhdGVnb3J5T3JkZXIpXG4gICAgPyB3aW5kb3cuX3NraWxsQ2F0ZWdvcnlPcmRlclxuICAgIDogX3N5bmNTa2lsbENhdGVnb3J5T3JkZXIoKTtcbiAgd2luZG93Ll9za2lsbENhdGVnb3J5T3JkZXIgPSBjdXJyZW50T3JkZXIubWFwKGNhdGVnb3J5ID0+IChcbiAgICBjYXRlZ29yeSA9PT0gbm9ybWFsaXplZE9sZCA/IG5vcm1hbGl6ZWROZXcgOiBjYXRlZ29yeVxuICApKS5maWx0ZXIoKGNhdGVnb3J5LCBpbmRleCwgYXJyKSA9PiBjYXRlZ29yeSAmJiBhcnIuaW5kZXhPZihjYXRlZ29yeSkgPT09IGluZGV4KTtcbn1cblxuZnVuY3Rpb24gX21vdmVTa2lsbENhdGVnb3J5TG9jYWxseShjYXRlZ29yeU5hbWUsIGRpcmVjdGlvbikge1xuICBjb25zdCBub3JtYWxpemVkQ2F0ZWdvcnkgPSBTdHJpbmcoY2F0ZWdvcnlOYW1lIHx8ICcnKS50cmltKCk7XG4gIGNvbnN0IG9yZGVyID0gQXJyYXkuaXNBcnJheSh3aW5kb3cuX3NraWxsQ2F0ZWdvcnlPcmRlcilcbiAgICA/IFsuLi53aW5kb3cuX3NraWxsQ2F0ZWdvcnlPcmRlcl1cbiAgICA6IF9zeW5jU2tpbGxDYXRlZ29yeU9yZGVyKCk7XG4gIGNvbnN0IGluZGV4ID0gb3JkZXIuaW5kZXhPZihub3JtYWxpemVkQ2F0ZWdvcnkpO1xuICBpZiAoaW5kZXggPCAwKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgbmV4dEluZGV4ID0gaW5kZXggKyBkaXJlY3Rpb247XG4gIGlmIChuZXh0SW5kZXggPCAwIHx8IG5leHRJbmRleCA+PSBvcmRlci5sZW5ndGgpIHJldHVybiBudWxsO1xuICBbb3JkZXJbaW5kZXhdLCBvcmRlcltuZXh0SW5kZXhdXSA9IFtvcmRlcltuZXh0SW5kZXhdLCBvcmRlcltpbmRleF1dO1xuICB3aW5kb3cuX3NraWxsQ2F0ZWdvcnlPcmRlciA9IG9yZGVyO1xuICByZXR1cm4gb3JkZXI7XG59XG5cbmZ1bmN0aW9uIF9idWlsZFNraWxsQ2F0ZWdvcnlNYW5hZ2VySHRtbCgpIHtcbiAgY29uc3QgY2F0ZWdvcmllcyA9IEFycmF5LmlzQXJyYXkod2luZG93Ll9za2lsbENhdGVnb3J5T3JkZXIpXG4gICAgPyB3aW5kb3cuX3NraWxsQ2F0ZWdvcnlPcmRlclxuICAgIDogX3N5bmNTa2lsbENhdGVnb3J5T3JkZXIoKTtcbiAgaWYgKGNhdGVnb3JpZXMubGVuZ3RoID09PSAwKSByZXR1cm4gJyc7XG5cbiAgcmV0dXJuIGBcbiAgICA8ZGl2IGNsYXNzPVwic2tpbGwtY2F0ZWdvcnktbWFuYWdlclwiIHN0eWxlPVwibWFyZ2luOjAgMCAxMnB4O3BhZGRpbmc6MTJweDtib3JkZXI6MXB4IHNvbGlkICNlNWU3ZWI7Ym9yZGVyLXJhZGl1czoxMHB4O2JhY2tncm91bmQ6I2Y4ZmFmYztcIj5cbiAgICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo4cHg7XCI+Q2F0ZWdvcnkgTGF5b3V0PC9kaXY+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtnYXA6OHB4O1wiPlxuICAgICAgICAke2NhdGVnb3JpZXMubWFwKChjYXRlZ29yeSwgaW5kZXgpID0+IGBcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2tpbGwtY2F0ZWdvcnktbWFuYWdlci1yb3dcIiBkYXRhLWNhdGVnb3J5PVwiJHtlc2NhcGVIdG1sKGNhdGVnb3J5KX1cIiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6OHB4O2FsaWduLWl0ZW1zOmNlbnRlcjtcIj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwic2tpbGwtY2F0ZWdvcnktbWFuYWdlci1pbnB1dFwiXG4gICAgICAgICAgICAgIHZhbHVlPVwiJHtlc2NhcGVIdG1sKGNhdGVnb3J5KX1cIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiUmVuYW1lIHNraWxsIGNhdGVnb3J5ICR7ZXNjYXBlSHRtbChjYXRlZ29yeSl9XCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJmbGV4OjE7bWluLXdpZHRoOjA7cGFkZGluZzo2cHggOHB4O2JvcmRlcjoxcHggc29saWQgI2QxZDVkYjtib3JkZXItcmFkaXVzOjZweDtcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIGRhdGEtYWN0aW9uPVwiY2F0ZWdvcnktdXBcIiBkYXRhLWNhdGVnb3J5PVwiJHtlc2NhcGVIdG1sKGNhdGVnb3J5KX1cIiBhcmlhLWxhYmVsPVwiTW92ZSAke2VzY2FwZUh0bWwoY2F0ZWdvcnkpfSBjYXRlZ29yeSB1cFwiIHRpdGxlPVwiTW92ZSBjYXRlZ29yeSB1cFwiICR7aW5kZXggPT09IDAgPyAnZGlzYWJsZWQnIDogJyd9Plx1MjE5MTwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgZGF0YS1hY3Rpb249XCJjYXRlZ29yeS1kb3duXCIgZGF0YS1jYXRlZ29yeT1cIiR7ZXNjYXBlSHRtbChjYXRlZ29yeSl9XCIgYXJpYS1sYWJlbD1cIk1vdmUgJHtlc2NhcGVIdG1sKGNhdGVnb3J5KX0gY2F0ZWdvcnkgZG93blwiIHRpdGxlPVwiTW92ZSBjYXRlZ29yeSBkb3duXCIgJHtpbmRleCA9PT0gY2F0ZWdvcmllcy5sZW5ndGggLSAxID8gJ2Rpc2FibGVkJyA6ICcnfT5cdTIxOTM8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgYCkuam9pbignJyl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYDtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFJlcnVuIHNuYXBzaG90IChjaGFuZ2UgYmFkZ2UgZm9yIHNraWxscykgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5mdW5jdGlvbiBfc2tpbGxTbmFwc2hvdEtleSgpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzaWQgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpLmdldCgnc2Vzc2lvbicpO1xuICAgIHJldHVybiBzaWQgPyBgc2tpbGxfc25hcF8ke3NpZH1gIDogbnVsbDtcbiAgfSBjYXRjaCAoXykgeyByZXR1cm4gbnVsbDsgfVxufVxuZnVuY3Rpb24gX3NhdmVTa2lsbFNuYXBzaG90KHJlY29tbWVuZGVkTmFtZXMpIHtcbiAgY29uc3Qga2V5ID0gX3NraWxsU25hcHNob3RLZXkoKTtcbiAgaWYgKCFrZXkpIHJldHVybjtcbiAgdHJ5IHsgbG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCBKU09OLnN0cmluZ2lmeShbLi4ucmVjb21tZW5kZWROYW1lc10pKTsgfSBjYXRjaCAoXykge31cbn1cbmZ1bmN0aW9uIF9nZXRTa2lsbFNuYXBzaG90KCkge1xuICBjb25zdCBrZXkgPSBfc2tpbGxTbmFwc2hvdEtleSgpO1xuICBpZiAoIWtleSkgcmV0dXJuIG51bGw7XG4gIHRyeSB7XG4gICAgY29uc3QgcmF3ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KTtcbiAgICByZXR1cm4gcmF3ID8gbmV3IFNldChKU09OLnBhcnNlKHJhdykpIDogbnVsbDtcbiAgfSBjYXRjaCAoXykgeyByZXR1cm4gbnVsbDsgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgQnVpbGQgcmV2aWV3IHRhYmxlIChmZXRjaCArIGluaXRpYWxpc2UpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBidWlsZFNraWxsc1Jldmlld1RhYmxlKCkge1xuICBjb25zdCBkYXRhID0gd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnM7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbHMtdGFibGUtY29udGFpbmVyJyk7XG5cbiAgLy8gQnVpbGQgc2tpbGwtdHlwZSBsb29rdXAgZnJvbSBqb2IgYW5hbHlzaXMgKGF2YWlsYWJsZSBpbiB0YWJEYXRhLmFuYWx5c2lzKVxuICBjb25zdCBqb2JBbmFseXNpcyA9IHN0YXRlTWFuYWdlci5nZXRUYWJEYXRhKCdhbmFseXNpcycpIHx8IHt9O1xuICBjb25zdCBoYXJkU2tpbGxTZXQgPSBuZXcgU2V0KChqb2JBbmFseXNpcy5yZXF1aXJlZF9za2lsbHMgICAgfHwgW10pLm1hcChzID0+IHMudG9Mb3dlckNhc2UoKSkpO1xuICBjb25zdCBzb2Z0U2tpbGxTZXQgPSBuZXcgU2V0KChqb2JBbmFseXNpcy5uaWNlX3RvX2hhdmVfc2tpbGxzIHx8IFtdKS5tYXAocyA9PiBzLnRvTG93ZXJDYXNlKCkpKTtcblxuICAvLyBHZXQgYWxsIHNraWxscyBmcm9tIHRoZSBBUEkgc3RhdHVzXG4gIGxldCBhbGxTa2lsbHMgPSBbXTtcbiAgbGV0IHBlcnNpc3RlZEV4dHJhU2tpbGxzID0gW107XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdHVzUmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvc3RhdHVzJyk7XG4gICAgY29uc3Qgc3RhdHVzRGF0YSA9IHBhcnNlU3RhdHVzUmVzcG9uc2UoYXdhaXQgc3RhdHVzUmVzLmpzb24oKSk7XG4gICAgYWxsU2tpbGxzID0gc3RhdHVzRGF0YS5hbGxfc2tpbGxzIHx8IFtdO1xuICAgIHBlcnNpc3RlZEV4dHJhU2tpbGxzID0gc3RhdHVzRGF0YS5leHRyYV9za2lsbHMgfHwgW107XG4gICAgd2luZG93Ll9hbGxFeHBlcmllbmNlcyA9IHN0YXR1c0RhdGEuYWxsX2V4cGVyaWVuY2VzIHx8IFtdO1xuICAgIGNvbnN0IHF1YWxPdmVycmlkZXMgPSBzdGF0dXNEYXRhLnNraWxsX3F1YWxpZmllcl9vdmVycmlkZXMgfHwge307XG4gICAgd2luZG93Ll9za2lsbFR5cGVPdmVycmlkZXMgPSB3aW5kb3cuX3NraWxsVHlwZU92ZXJyaWRlcyB8fCB7fTtcbiAgICBmb3IgKGNvbnN0IFtza2lsbE5hbWUsIG92ZXJyaWRlc10gb2YgT2JqZWN0LmVudHJpZXMocXVhbE92ZXJyaWRlcykpIHtcbiAgICAgIGlmIChvdmVycmlkZXMgJiYgb3ZlcnJpZGVzLnNraWxsX3R5cGUpIHtcbiAgICAgICAgd2luZG93Ll9za2lsbFR5cGVPdmVycmlkZXNbc2tpbGxOYW1lLnRvTG93ZXJDYXNlKCldID0gb3ZlcnJpZGVzLnNraWxsX3R5cGU7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy5lcnJvcignRXJyb3IgZmV0Y2hpbmcgYWxsIHNraWxsczonLCBlcnJvcik7XG4gICAgLy8gRmFsbGJhY2sgdG8ganVzdCByZWNvbW1lbmRlZCBza2lsbHNcbiAgICBhbGxTa2lsbHMgPSBkYXRhLnJlY29tbWVuZGVkX3NraWxscyB8fCBbXTtcbiAgICB3aW5kb3cuX2FsbEV4cGVyaWVuY2VzID0gW107XG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkUGVyc2lzdGVkRXh0cmFTa2lsbHMgPSAocGVyc2lzdGVkRXh0cmFTa2lsbHMgfHwgW10pXG4gICAgLm1hcChza2lsbCA9PiBfbm9ybWFsaXplRXh0cmFTa2lsbEVudHJ5KHNraWxsLCB7XG4gICAgICB1c2VyQ3JlYXRlZDogdHlwZW9mIHNraWxsID09PSAnb2JqZWN0JyAmJiAhIXNraWxsPy51c2VyX2NyZWF0ZWQsXG4gICAgfSkpXG4gICAgLmZpbHRlcihCb29sZWFuKTtcbiAgaWYgKG5vcm1hbGl6ZWRQZXJzaXN0ZWRFeHRyYVNraWxscy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgbWVyZ2VkU2tpbGxzID0gW107XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQoKTtcbiAgICBub3JtYWxpemVkUGVyc2lzdGVkRXh0cmFTa2lsbHMuZm9yRWFjaChza2lsbCA9PiB7XG4gICAgICBpZiAoc2Vlbi5oYXMoc2tpbGwubmFtZSkpIHJldHVybjtcbiAgICAgIG1lcmdlZFNraWxscy5wdXNoKHNraWxsKTtcbiAgICAgIHNlZW4uYWRkKHNraWxsLm5hbWUpO1xuICAgIH0pO1xuICAgIGFsbFNraWxscy5mb3JFYWNoKHNraWxsID0+IHtcbiAgICAgIGNvbnN0IHNraWxsTmFtZSA9IF9za2lsbE5hbWUoc2tpbGwpO1xuICAgICAgaWYgKCFza2lsbE5hbWUgfHwgc2Vlbi5oYXMoc2tpbGxOYW1lKSkgcmV0dXJuO1xuICAgICAgbWVyZ2VkU2tpbGxzLnB1c2goc2tpbGwpO1xuICAgICAgc2Vlbi5hZGQoc2tpbGxOYW1lKTtcbiAgICB9KTtcbiAgICBhbGxTa2lsbHMgPSBtZXJnZWRTa2lsbHM7XG4gIH1cblxuICAvLyBEZXRlY3Qgc2tpbGxzIHJlY29tbWVuZGVkIGJ5IExMTSB0aGF0IGFyZW4ndCBpbiBtYXN0ZXIgQ1YgYW5kIHByZXBlbmQgdGhlbVxuICBjb25zdCBtYXN0ZXJTa2lsbE5hbWVzID0gbmV3IFNldChhbGxTa2lsbHMubWFwKHNraWxsID0+IF9za2lsbE5hbWUoc2tpbGwpKSk7XG4gIGNvbnN0IG5ld1NraWxscyA9IChkYXRhLnJlY29tbWVuZGVkX3NraWxscyB8fCBbXSkuZmlsdGVyKHMgPT4gIW1hc3RlclNraWxsTmFtZXMuaGFzKHMpKTtcbiAgd2luZG93Ll9uZXdTa2lsbHNGcm9tTExNID0gbmV3U2tpbGxzO1xuICBpZiAobmV3U2tpbGxzLmxlbmd0aCA+IDApIHtcbiAgICBhbGxTa2lsbHMgPSBbLi4ubmV3U2tpbGxzLm1hcChzID0+ICh7IG5hbWU6IHMsIF9pc05ldzogdHJ1ZSB9KSksIC4uLmFsbFNraWxsc107XG4gIH1cblxuICBpZiAoYWxsU2tpbGxzLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnPHAgc3R5bGU9XCJwYWRkaW5nOjIwcHg7dGV4dC1hbGlnbjpjZW50ZXI7Y29sb3I6IzZiNzI4MDtcIj5ObyBza2lsbHMgZm91bmQgaW4gbWFzdGVyIENWIGRhdGEuPC9wPic7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gT24gZmlyc3QgbG9hZDogc29ydCBieSByZWNvbW1lbmRhdGlvbjsgcHJlc2VydmUgdXNlciBvcmRlciBvbiByZS1yZW5kZXJcbiAgaWYgKCF3aW5kb3cuX3NraWxsc09yZGVyZWQpIHtcbiAgICBjb25zdCByZWNvbW1lbmRhdGlvbk9yZGVyID0geyAnRW1waGFzaXplJzogMCwgJ0luY2x1ZGUnOiAxLCAnRGUtZW1waGFzaXplJzogMiwgJ09taXQnOiAzIH07XG4gICAgY29uc3QgbWFzdGVyU2tpbGxzICA9IGFsbFNraWxscy5maWx0ZXIocyA9PiAhcy5faXNOZXcpO1xuXG4gICAgLy8gUm9sZS1hd2FyZSBjYXRlZ29yeSBzY29yaW5nOiBjYXRlZ29yaWVzIHdpdGggbW9yZSByZXF1aXJlZC9uaWNlLXRvLWhhdmUgam9iIHNraWxscyByYW5rIGhpZ2hlclxuICAgIGNvbnN0IGNhdGVnb3J5U2NvcmVzID0ge307XG4gICAgZm9yIChjb25zdCBza2lsbCBvZiBtYXN0ZXJTa2lsbHMpIHtcbiAgICAgIGNvbnN0IGNhdCAgPSB0eXBlb2Ygc2tpbGwgPT09ICdvYmplY3QnID8gKHNraWxsLmNhdGVnb3J5IHx8ICcnKSA6ICcnO1xuICAgICAgY29uc3QgbmFtZSA9ICh0eXBlb2Ygc2tpbGwgPT09ICdzdHJpbmcnID8gc2tpbGwgOiBza2lsbC5uYW1lIHx8IHNraWxsKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKGNhdCkge1xuICAgICAgICBjYXRlZ29yeVNjb3Jlc1tjYXRdID0gKGNhdGVnb3J5U2NvcmVzW2NhdF0gfHwgMClcbiAgICAgICAgICArIChoYXJkU2tpbGxTZXQuaGFzKG5hbWUpID8gMiA6IHNvZnRTa2lsbFNldC5oYXMobmFtZSkgPyAxIDogMCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc29ydGVkTWFzdGVyICA9IG1hc3RlclNraWxscy5zbGljZSgpLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGNvbnN0IGFOYW1lICA9IHR5cGVvZiBhID09PSAnc3RyaW5nJyA/IGEgOiBhLm5hbWUgfHwgYTtcbiAgICAgIGNvbnN0IGJOYW1lICA9IHR5cGVvZiBiID09PSAnc3RyaW5nJyA/IGIgOiBiLm5hbWUgfHwgYjtcbiAgICAgIGNvbnN0IGFSZWMgICA9IHJlY29tbWVuZGF0aW9uT3JkZXJbZ2V0U2tpbGxSZWNvbW1lbmRhdGlvbihhTmFtZSwgZGF0YSldID8/IDM7XG4gICAgICBjb25zdCBiUmVjICAgPSByZWNvbW1lbmRhdGlvbk9yZGVyW2dldFNraWxsUmVjb21tZW5kYXRpb24oYk5hbWUsIGRhdGEpXSA/PyAzO1xuICAgICAgaWYgKGFSZWMgIT09IGJSZWMpIHJldHVybiBhUmVjIC0gYlJlYztcbiAgICAgIC8vIFdpdGhpbiB0aGUgc2FtZSByZWNvbW1lbmRhdGlvbiB0aWVyLCBzdXJmYWNlIHJvbGUtcmVsZXZhbnQgY2F0ZWdvcmllcyBmaXJzdFxuICAgICAgY29uc3QgYUNhdCAgID0gdHlwZW9mIGEgPT09ICdvYmplY3QnID8gKGEuY2F0ZWdvcnkgfHwgJycpIDogJyc7XG4gICAgICBjb25zdCBiQ2F0ICAgPSB0eXBlb2YgYiA9PT0gJ29iamVjdCcgPyAoYi5jYXRlZ29yeSB8fCAnJykgOiAnJztcbiAgICAgIHJldHVybiAoY2F0ZWdvcnlTY29yZXNbYkNhdF0gfHwgMCkgLSAoY2F0ZWdvcnlTY29yZXNbYUNhdF0gfHwgMCk7XG4gICAgfSk7XG4gICAgd2luZG93Ll9za2lsbHNPcmRlcmVkID0gWy4uLmFsbFNraWxscy5maWx0ZXIocyA9PiBzLl9pc05ldyksIC4uLnNvcnRlZE1hc3Rlcl07XG5cbiAgICAvLyBBcHBseSBqb2ItYW5hbHlzaXMtZGVyaXZlZCBjYXRlZ29yeSBvcmRlciBmcm9tIGJhY2tlbmQgKEdBUC04NilcbiAgICBjb25zdCBiYWNrZW5kT3JkZXIgPSAoc3RhdGVNYW5hZ2VyLmdldFRhYkRhdGEoJ2N1c3RvbWl6YXRpb25zJykgfHwge30pLnNraWxsX2NhdGVnb3J5X29yZGVyO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGJhY2tlbmRPcmRlcikgJiYgYmFja2VuZE9yZGVyLmxlbmd0aCA+IDApIHtcbiAgICAgIHdpbmRvdy5fc2tpbGxDYXRlZ29yeU9yZGVyID0gYmFja2VuZE9yZGVyO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zdCBrbm93bk5hbWVzID0gbmV3IFNldCh3aW5kb3cuX3NraWxsc09yZGVyZWQubWFwKHMgPT4gKHR5cGVvZiBzID09PSAnc3RyaW5nJyA/IHMgOiBzLm5hbWUgfHwgcykpKTtcbiAgICBmb3IgKGNvbnN0IHNrIG9mIGFsbFNraWxscykge1xuICAgICAgY29uc3Qgbm0gPSB0eXBlb2Ygc2sgPT09ICdzdHJpbmcnID8gc2sgOiBzay5uYW1lIHx8IHNrO1xuICAgICAgaWYgKCFrbm93bk5hbWVzLmhhcyhubSkpIHdpbmRvdy5fc2tpbGxzT3JkZXJlZC5wdXNoKHNrKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCByZWNvbW1lbmRlZFNldCA9IG5ldyBTZXQoZGF0YS5yZWNvbW1lbmRlZF9za2lsbHMgfHwgW10pO1xuXG4gIC8vIENvbXB1dGUgd2hpY2ggcmVjb21tZW5kYXRpb25zIGFyZSBuZXcgc2luY2UgbGFzdCByZW5kZXIgKHJlcnVuIGNoYW5nZSBiYWRnZXMpXG4gIGNvbnN0IHByZXZTa2lsbFNuYXAgPSBfZ2V0U2tpbGxTbmFwc2hvdCgpO1xuICBjb25zdCBuZXdSZWNvbW1lbmRlZFNraWxscyA9IHByZXZTa2lsbFNuYXBcbiAgICA/IG5ldyBTZXQoWy4uLnJlY29tbWVuZGVkU2V0XS5maWx0ZXIobmFtZSA9PiAhcHJldlNraWxsU25hcC5oYXMobmFtZSkpKVxuICAgIDogbmV3IFNldCgpO1xuICBfc2F2ZVNraWxsU25hcHNob3QocmVjb21tZW5kZWRTZXQpO1xuXG4gIC8vIEluaXRpYWxpc2Ugc2F2ZWQgZGVjaXNpb25zXG4gIGNvbnN0IHNhdmVkU2tpbGxEZWNzID0gd2luZG93Ll9zYXZlZERlY2lzaW9ucz8uc2tpbGxfZGVjaXNpb25zIHx8IHt9O1xuICBmb3IgKGNvbnN0IHNraWxsIG9mIHdpbmRvdy5fc2tpbGxzT3JkZXJlZCkge1xuICAgIGNvbnN0IHNraWxsTmFtZSAgICAgPSB0eXBlb2Ygc2tpbGwgPT09ICdzdHJpbmcnID8gc2tpbGwgOiBza2lsbC5uYW1lIHx8IHNraWxsO1xuICAgIGNvbnN0IGlzTmV3ICAgICAgICAgPSAoc2tpbGwuX2lzTmV3ID09PSB0cnVlKTtcbiAgICBjb25zdCBpc1JlY29tbWVuZGVkID0gcmVjb21tZW5kZWRTZXQuaGFzKHNraWxsTmFtZSk7XG4gICAgY29uc3QgcmVjb21tZW5kYXRpb24gPSBnZXRTa2lsbFJlY29tbWVuZGF0aW9uKHNraWxsTmFtZSwgZGF0YSk7XG4gICAgbGV0IGRlZmF1bHRBY3Rpb24gPSAnZXhjbHVkZSc7XG4gICAgaWYgICAgICAocmVjb21tZW5kYXRpb24gPT09ICdFbXBoYXNpemUnKSAgICBkZWZhdWx0QWN0aW9uID0gJ2VtcGhhc2l6ZSc7XG4gICAgZWxzZSBpZiAocmVjb21tZW5kYXRpb24gPT09ICdJbmNsdWRlJykgICAgICBkZWZhdWx0QWN0aW9uID0gJ2luY2x1ZGUnO1xuICAgIGVsc2UgaWYgKHJlY29tbWVuZGF0aW9uID09PSAnRGUtZW1waGFzaXplJykgZGVmYXVsdEFjdGlvbiA9ICdkZS1lbXBoYXNpemUnO1xuICAgIGVsc2UgaWYgKHJlY29tbWVuZGF0aW9uID09PSAnT21pdCcpICAgICAgICAgZGVmYXVsdEFjdGlvbiA9ICdleGNsdWRlJztcbiAgICBlbHNlIGlmIChpc1JlY29tbWVuZGVkIHx8IGlzTmV3KSAgICAgICAgICAgIGRlZmF1bHRBY3Rpb24gPSAnaW5jbHVkZSc7XG4gICAgdXNlclNlbGVjdGlvbnMuc2tpbGxzW3NraWxsTmFtZV0gPSBzYXZlZFNraWxsRGVjc1tza2lsbE5hbWVdIHx8IGRlZmF1bHRBY3Rpb247XG4gIH1cblxuICBfcmVuZGVyU2tpbGxzVGFibGUoY29udGFpbmVyLCByZWNvbW1lbmRlZFNldCwgZGF0YSwgaGFyZFNraWxsU2V0LCBzb2Z0U2tpbGxTZXQsIG5ld1JlY29tbWVuZGVkU2tpbGxzKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFJlbmRlciB0YWJsZSBIVE1MIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBfcmVuZGVyU2tpbGxzVGFibGUoY29udGFpbmVyLCByZWNvbW1lbmRlZFNldCwgZGF0YSwgaGFyZFNraWxsU2V0LCBzb2Z0U2tpbGxTZXQsIG5ld1JlY29tbWVuZGVkU2tpbGxzID0gbmV3IFNldCgpKSB7XG4gIGlmICghY29udGFpbmVyKSBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGxzLXRhYmxlLWNvbnRhaW5lcicpO1xuICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuO1xuICBpZiAoIXJlY29tbWVuZGVkU2V0KSByZWNvbW1lbmRlZFNldCA9IG5ldyBTZXQoKHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zPy5yZWNvbW1lbmRlZF9za2lsbHMpIHx8IFtdKTtcbiAgaWYgKCFkYXRhKSBkYXRhID0gd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnM7XG4gIGlmICghaGFyZFNraWxsU2V0KSB7XG4gICAgY29uc3QgamEgPSBzdGF0ZU1hbmFnZXIuZ2V0VGFiRGF0YSgnYW5hbHlzaXMnKSB8fCB7fTtcbiAgICBoYXJkU2tpbGxTZXQgPSBuZXcgU2V0KChqYS5yZXF1aXJlZF9za2lsbHMgICAgIHx8IFtdKS5tYXAocyA9PiBzLnRvTG93ZXJDYXNlKCkpKTtcbiAgICBzb2Z0U2tpbGxTZXQgPSBuZXcgU2V0KChqYS5uaWNlX3RvX2hhdmVfc2tpbGxzIHx8IFtdKS5tYXAocyA9PiBzLnRvTG93ZXJDYXNlKCkpKTtcbiAgfVxuXG4gIGlmICgkLmZuLkRhdGFUYWJsZS5pc0RhdGFUYWJsZSgnI3NraWxscy1yZXZpZXctdGFibGUnKSkge1xuICAgICQoJyNza2lsbHMtcmV2aWV3LXRhYmxlJykuRGF0YVRhYmxlKCkuZGVzdHJveSgpO1xuICB9XG5cbiAgY29uc3Qgc2tpbGxzID0gd2luZG93Ll9za2lsbHNPcmRlcmVkIHx8IFtdO1xuICBjb25zdCBncm91cFdhcm5pbmdzID0gX2J1aWxkR3JvdXBXYXJuaW5ncyhza2lsbHMpO1xuICBjb25zdCBjYXRlZ29yeVN1Z2dlc3Rpb25zID0gQXJyYXkuZnJvbShuZXcgU2V0KFxuICAgIHNraWxsc1xuICAgICAgLm1hcChza2lsbCA9PiAodHlwZW9mIHNraWxsID09PSAnb2JqZWN0JyAmJiBza2lsbC5jYXRlZ29yeSA/IFN0cmluZyhza2lsbC5jYXRlZ29yeSkudHJpbSgpIDogJycpKVxuICAgICAgLmZpbHRlcihCb29sZWFuKSxcbiAgKSkuc29ydCgobGVmdCwgcmlnaHQpID0+IGxlZnQubG9jYWxlQ29tcGFyZShyaWdodCkpO1xuICBfc3luY1NraWxsQ2F0ZWdvcnlPcmRlcigpO1xuICBjb25zdCBjYXRlZ29yeUxpc3RJZCA9ICdza2lsbC1jYXRlZ29yeS1zdWdnZXN0aW9ucyc7XG4gIGxldCB0YWJsZUhUTUwgPSBgXG4gICAgPGRpdiBjbGFzcz1cInNraWxsLWFkZC1wYW5lbFwiIHN0eWxlPVwibWFyZ2luOjAgMCAxMnB4O3BhZGRpbmc6MTJweDtib3JkZXI6MXB4IHNvbGlkICNkYmVhZmU7Ym9yZGVyLXJhZGl1czoxMHB4O2JhY2tncm91bmQ6I2VmZjZmZjtcIj5cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47YWxpZ24taXRlbXM6Y2VudGVyO2dhcDoxMnB4O2ZsZXgtd3JhcDp3cmFwO1wiPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDo2MDA7XCI+U2Vzc2lvbi1Pbmx5IFNraWxsczwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2NvbG9yOiM0NzU1Njk7XCI+QWRkIGEgc2tpbGwgZm9yIHRoaXMgQ1Ygd2l0aG91dCBjaGFuZ2luZyB0aGUgbWFzdGVyIHByb2ZpbGUuPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ1bGstYnRuXCIgaWQ9XCJ0b2dnbGUtYWRkLXNraWxsLWZvcm1cIj4rIEFkZCBTa2lsbDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8Zm9ybSBpZD1cImFkZC1za2lsbC1mb3JtXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7bWFyZ2luLXRvcDoxMnB4O1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpncmlkO2dyaWQtdGVtcGxhdGUtY29sdW1uczpyZXBlYXQoYXV0by1maXQsbWlubWF4KDE4MHB4LDFmcikpO2dhcDo4cHg7XCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cIm5hbWVcIiBwbGFjZWhvbGRlcj1cIlNraWxsIG5hbWVcIiBhcmlhLWxhYmVsPVwiTmV3IHNraWxsIG5hbWVcIiBzdHlsZT1cInBhZGRpbmc6NnB4IDhweDtib3JkZXI6MXB4IHNvbGlkICNiZmRiZmU7Ym9yZGVyLXJhZGl1czo2cHg7XCIgLz5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBuYW1lPVwiY2F0ZWdvcnlcIiBwbGFjZWhvbGRlcj1cIkNhdGVnb3J5XCIgYXJpYS1sYWJlbD1cIk5ldyBza2lsbCBjYXRlZ29yeVwiIGxpc3Q9XCIke2NhdGVnb3J5TGlzdElkfVwiIHN0eWxlPVwicGFkZGluZzo2cHggOHB4O2JvcmRlcjoxcHggc29saWQgI2JmZGJmZTtib3JkZXItcmFkaXVzOjZweDtcIiAvPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG5hbWU9XCJncm91cFwiIHBsYWNlaG9sZGVyPVwiR3JvdXAga2V5XCIgYXJpYS1sYWJlbD1cIk5ldyBza2lsbCBncm91cFwiIHN0eWxlPVwicGFkZGluZzo2cHggOHB4O2JvcmRlcjoxcHggc29saWQgI2JmZGJmZTtib3JkZXItcmFkaXVzOjZweDtcIiAvPlxuICAgICAgICAgIDxzZWxlY3QgbmFtZT1cInByb2ZpY2llbmN5XCIgYXJpYS1sYWJlbD1cIk5ldyBza2lsbCBwcm9maWNpZW5jeVwiIHN0eWxlPVwicGFkZGluZzo2cHggOHB4O2JvcmRlcjoxcHggc29saWQgI2JmZGJmZTtib3JkZXItcmFkaXVzOjZweDtcIj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj5ObyBwcm9maWNpZW5jeSBsYWJlbDwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImJlZ2lubmVyXCI+QmVnaW5uZXI8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJmYW1pbGlhclwiPkZhbWlsaWFyPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiaW50ZXJtZWRpYXRlXCI+SW50ZXJtZWRpYXRlPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiYWR2YW5jZWRcIj5BZHZhbmNlZDwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImV4cGVydFwiPkV4cGVydDwvb3B0aW9uPlxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG5hbWU9XCJzdWJza2lsbHNcIiBwbGFjZWhvbGRlcj1cIlN1Yi1za2lsbHNcIiBhcmlhLWxhYmVsPVwiTmV3IHNraWxsIHN1Yi1za2lsbHNcIiBzdHlsZT1cInBhZGRpbmc6NnB4IDhweDtib3JkZXI6MXB4IHNvbGlkICNiZmRiZmU7Ym9yZGVyLXJhZGl1czo2cHg7XCIgLz5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBuYW1lPVwicGFyZW50aGV0aWNhbFwiIHBsYWNlaG9sZGVyPVwiUGFyZW50aGV0aWNhbCBub3RlXCIgYXJpYS1sYWJlbD1cIk5ldyBza2lsbCBwYXJlbnRoZXRpY2FsXCIgc3R5bGU9XCJwYWRkaW5nOjZweCA4cHg7Ym9yZGVyOjFweCBzb2xpZCAjYmZkYmZlO2JvcmRlci1yYWRpdXM6NnB4O1wiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDo4cHg7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kO21hcmdpbi10b3A6MTBweDtcIj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ1bGstYnRuIGJ1bGstZXhjbHVkZVwiIGlkPVwiY2FuY2VsLWFkZC1za2lsbFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIGNsYXNzPVwiYnVsay1idG4gYnVsay1pbmNsdWRlXCI+U2F2ZSBTa2lsbDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZm9ybT5cbiAgICA8L2Rpdj5cbiAgICAke19idWlsZFNraWxsQ2F0ZWdvcnlNYW5hZ2VySHRtbCgpfVxuICAgIDxkYXRhbGlzdCBpZD1cIiR7Y2F0ZWdvcnlMaXN0SWR9XCI+XG4gICAgICAke2NhdGVnb3J5U3VnZ2VzdGlvbnMubWFwKGNhdGVnb3J5ID0+IGA8b3B0aW9uIHZhbHVlPVwiJHtlc2NhcGVIdG1sKGNhdGVnb3J5KX1cIj48L29wdGlvbj5gKS5qb2luKCcnKX1cbiAgICA8L2RhdGFsaXN0PlxuICAgIDx0YWJsZSBpZD1cInNraWxscy1yZXZpZXctdGFibGVcIiBjbGFzcz1cInJldmlldy10YWJsZVwiPlxuICAgICAgPHRoZWFkPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRoPlNraWxsPC90aD5cbiAgICAgICAgICA8dGg+Q2F0ZWdvcnk8L3RoPlxuICAgICAgICAgIDx0aD5Hcm91cDwvdGg+XG4gICAgICAgICAgPHRoPlByb2ZpY2llbmN5PC90aD5cbiAgICAgICAgICA8dGg+U3ViLXNraWxsczwvdGg+XG4gICAgICAgICAgPHRoPlBhcmVudGhldGljYWw8L3RoPlxuICAgICAgICAgIDx0aD5SZWNvbW1lbmRhdGlvbjwvdGg+XG4gICAgICAgICAgPHRoPkNvbmZpZGVuY2U8L3RoPlxuICAgICAgICAgIDx0aD5SZWFzb25pbmc8L3RoPlxuICAgICAgICAgIDx0aD5NYXRjaGVkIEV4cGVyaWVuY2VzPC90aD5cbiAgICAgICAgICA8dGg+WW91ciBTZWxlY3Rpb248L3RoPlxuICAgICAgICA8L3RyPlxuICAgICAgPC90aGVhZD5cbiAgICAgIDx0Ym9keT5cbiAgYDtcblxuICBjb25zdCBhbGxFeHBlcmllbmNlcyA9IEFycmF5LmlzQXJyYXkod2luZG93Ll9hbGxFeHBlcmllbmNlcykgPyB3aW5kb3cuX2FsbEV4cGVyaWVuY2VzIDogW107XG4gIGNvbnN0IHNhdmVkTWF0Y2hlcyA9ICh3aW5kb3cuX3NhdmVkRGVjaXNpb25zICYmIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMuZXh0cmFfc2tpbGxfbWF0Y2hlcykgfHwge307XG5cbiAgY29uc3QgZGVyaXZlTWF0Y2hlcyA9IChza2lsbE5hbWUpID0+IHtcbiAgICBjb25zdCBuZWVkbGUgPSBza2lsbE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBpZHMgPSBbXTtcbiAgICBhbGxFeHBlcmllbmNlcy5mb3JFYWNoKChleHApID0+IHtcbiAgICAgIGlmICghZXhwIHx8IHR5cGVvZiBleHAgIT09ICdvYmplY3QnKSByZXR1cm47XG4gICAgICBjb25zdCBhY2ggPSBBcnJheS5pc0FycmF5KGV4cC5hY2hpZXZlbWVudHMpID8gZXhwLmFjaGlldmVtZW50cy5qb2luKCcgJykgOiAnJztcbiAgICAgIGNvbnN0IGhheXN0YWNrID0gW2V4cC50aXRsZSB8fCAnJywgZXhwLmNvbXBhbnkgfHwgJycsIGFjaF0uam9pbignICcpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAoaGF5c3RhY2suaW5jbHVkZXMobmVlZGxlKSAmJiBleHAuaWQpIGlkcy5wdXNoKGV4cC5pZCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGlkcztcbiAgfTtcblxuICBza2lsbHMuZm9yRWFjaCgoc2tpbGwsIHJvd0lkeCkgPT4ge1xuICAgIGNvbnN0IHNraWxsTmFtZSAgICAgICAgICAgID0gdHlwZW9mIHNraWxsID09PSAnc3RyaW5nJyA/IHNraWxsIDogc2tpbGwubmFtZSB8fCBza2lsbDtcbiAgICBjb25zdCBpc05ldyAgICAgICAgICAgICAgICA9IChza2lsbC5faXNOZXcgPT09IHRydWUpO1xuICAgIGNvbnN0IGlzQ2FuZGlkYXRlVG9Db25maXJtID0gdHlwZW9mIHNraWxsID09PSAnb2JqZWN0JyAmJiBza2lsbC5jYW5kaWRhdGVfdG9fY29uZmlybSA9PT0gdHJ1ZTtcbiAgICBjb25zdCBpc1JlY29tbWVuZGVkICAgICAgICA9IHJlY29tbWVuZGVkU2V0Lmhhcyhza2lsbE5hbWUpO1xuICAgIGNvbnN0IHJlY29tbWVuZGF0aW9uID0gZ2V0U2tpbGxSZWNvbW1lbmRhdGlvbihza2lsbE5hbWUsIGRhdGEpO1xuICAgIGNvbnN0IGNvbmZpZGVuY2UgICAgID0gZ2V0U2tpbGxDb25maWRlbmNlKHNraWxsTmFtZSwgZGF0YSk7XG4gICAgY29uc3QgcmVhc29uaW5nICAgICAgPSBnZXRTa2lsbFJlYXNvbmluZyhza2lsbE5hbWUsIGRhdGEpO1xuICAgIGNvbnN0IHNraWxsUmVjICAgICAgID0gX2ZpbmRTa2lsbFJlY29tbWVuZGF0aW9uUmVjb3JkKHNraWxsTmFtZSwgZGF0YSk7XG4gICAgY29uc3QgZ3JvdXBpbmdTdWdnZXN0aW9uID0gX2J1aWxkU2tpbGxHcm91cGluZ1N1Z2dlc3Rpb24oc2tpbGxSZWMsIHNraWxsKTtcbiAgICBjb25zdCBkZWZhdWx0QWN0aW9uICA9IHVzZXJTZWxlY3Rpb25zLnNraWxsc1tza2lsbE5hbWVdIHx8ICdpbmNsdWRlJztcbiAgICBjb25zdCBpc0ZpcnN0ICAgICAgICA9IHJvd0lkeCA9PT0gMDtcbiAgICBjb25zdCBpc0xhc3QgICAgICAgICA9IHJvd0lkeCA9PT0gc2tpbGxzLmxlbmd0aCAtIDE7XG4gICAgY29uc3Qgc2tpbGxOYW1lRXNjICAgPSBlc2NhcGVIdG1sKHNraWxsTmFtZSk7XG5cbiAgICBjb25zdCBncm91cEtleSA9IHR5cGVvZiBza2lsbCA9PT0gJ29iamVjdCcgPyAoc2tpbGwuZ3JvdXAgfHwgJycpIDogJyc7XG4gICAgY29uc3QgZ3JvdXBXYXJuaW5nID0gZ3JvdXBXYXJuaW5ncy5nZXQoZ3JvdXBLZXkpO1xuICAgIGNvbnN0IGNhdGVnb3J5S2V5ID0gdHlwZW9mIHNraWxsID09PSAnb2JqZWN0JyA/IChza2lsbC5jYXRlZ29yeSB8fCAnJykgOiAnJztcbiAgICBjb25zdCBwcm9maWNpZW5jeUtleSA9IHR5cGVvZiBza2lsbCA9PT0gJ29iamVjdCcgPyBTdHJpbmcoc2tpbGwucHJvZmljaWVuY3kgfHwgJycpLnRyaW0oKSA6ICcnO1xuICAgIGNvbnN0IHN1YnNraWxscyA9IHR5cGVvZiBza2lsbCA9PT0gJ29iamVjdCdcbiAgICAgID8gQXJyYXkuaXNBcnJheShza2lsbC5zdWJza2lsbHMpXG4gICAgICAgID8gc2tpbGwuc3Vic2tpbGxzXG4gICAgICAgIDogQXJyYXkuaXNBcnJheShza2lsbC5zdWJfc2tpbGxzKVxuICAgICAgICAgID8gc2tpbGwuc3ViX3NraWxsc1xuICAgICAgICAgIDogW11cbiAgICAgIDogW107XG4gICAgY29uc3QgcGFyZW50aGV0aWNhbEtleSA9IHR5cGVvZiBza2lsbCA9PT0gJ29iamVjdCcgPyBTdHJpbmcoc2tpbGwucGFyZW50aGV0aWNhbCB8fCAnJykudHJpbSgpIDogJyc7XG5cbiAgICBjb25zdCBuZXdCYWRnZSA9IGlzTmV3XG4gICAgICA/IChza2lsbC5faXNVc2VyQ3JlYXRlZFxuICAgICAgICA/ICc8c3BhbiB0aXRsZT1cIkFkZGVkIGZvciB0aGlzIHNlc3Npb24gb25seVwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6NnB4O2ZvbnQtc2l6ZToxMHB4O2NvbG9yOiMwZjc2NmU7Ym9yZGVyOjFweCBzb2xpZCAjMGY3NjZlO2JvcmRlci1yYWRpdXM6M3B4O3BhZGRpbmc6MXB4IDVweDtjdXJzb3I6aGVscDtcIj5TZXNzaW9uIG9ubHk8L3NwYW4+J1xuICAgICAgICA6ICc8c3BhbiB0aXRsZT1cIkFJIHN1Z2dlc3RlZCBcdTIwMTQgbm90IHlldCBpbiBDViBwcm9maWxlXCIgc3R5bGU9XCJtYXJnaW4tbGVmdDo2cHg7Zm9udC1zaXplOjEwcHg7Y29sb3I6I2RjNzkwMDtib3JkZXI6MXB4IHNvbGlkICNkYzc5MDA7Ym9yZGVyLXJhZGl1czozcHg7cGFkZGluZzoxcHggNXB4O2N1cnNvcjpoZWxwO1wiPlx1MjZBMCBOb3QgaW4gQ1YgcHJvZmlsZTwvc3Bhbj4nKVxuICAgICAgOiAnJztcbiAgICBjb25zdCBfZXZpZGVuY2VUZXh0ID0gaXNDYW5kaWRhdGVUb0NvbmZpcm0gJiYgdHlwZW9mIHNraWxsID09PSAnb2JqZWN0JyA/IFN0cmluZyhza2lsbC5ldmlkZW5jZSB8fCAnJykudHJpbSgpIDogJyc7XG4gICAgY29uc3QgX2V2aWRlbmNlRmFsbGJhY2sgPSAnQ29uZmlybSB0aGlzIHNraWxsIGlzIGdlbnVpbmVseSBkZW1vbnN0cmF0ZWQgaW4geW91ciBleHBlcmllbmNlIGJlZm9yZSBpbmNsdWRpbmcgaXQuJztcbiAgICBjb25zdCBfZXZpZGVuY2VUaXAgPSBfZXZpZGVuY2VUZXh0ID8gYFdlYWsgZXZpZGVuY2UgXHUyMDE0ICR7X2V2aWRlbmNlVGV4dH1gIDogYFdlYWsgZXZpZGVuY2UgXHUyMDE0ICR7X2V2aWRlbmNlRmFsbGJhY2t9YDtcbiAgICBjb25zdCBjYW5kaWRhdGVCYWRnZSA9IGlzQ2FuZGlkYXRlVG9Db25maXJtXG4gICAgICA/IGA8c3BhbiB0aXRsZT1cIiR7ZXNjYXBlSHRtbChfZXZpZGVuY2VUaXApfVwiIGFyaWEtbGFiZWw9XCIke2VzY2FwZUh0bWwoX2V2aWRlbmNlVGlwKX1cIiBzdHlsZT1cIm1hcmdpbi1sZWZ0OjZweDtmb250LXNpemU6MTBweDtjb2xvcjojOWYxMjM5O2JvcmRlcjoxcHggc29saWQgIzlmMTIzOTtib3JkZXItcmFkaXVzOjNweDtwYWRkaW5nOjFweCA1cHg7Y3Vyc29yOmhlbHA7XCI+XHUyNkEwICR7X2V2aWRlbmNlVGV4dCA/ICdXZWFrIGV2aWRlbmNlJyA6ICdWZXJpZnkgZXZpZGVuY2UnfTwvc3Bhbj5gXG4gICAgICA6ICcnO1xuICAgIGNvbnN0IGV2aWRlbmNlTm90ZSA9IGlzQ2FuZGlkYXRlVG9Db25maXJtICYmIF9ldmlkZW5jZVRleHRcbiAgICAgID8gYDxzbWFsbCBzdHlsZT1cImRpc3BsYXk6YmxvY2s7bWFyZ2luLXRvcDozcHg7Zm9udC1zaXplOjAuNzhlbTtjb2xvcjojOWYxMjM5O1wiPiR7ZXNjYXBlSHRtbChfZXZpZGVuY2VUZXh0KX08L3NtYWxsPmBcbiAgICAgIDogJyc7XG4gICAgY29uc3QgcmVydW5OZXdCYWRnZSA9IG5ld1JlY29tbWVuZGVkU2tpbGxzLmhhcyhza2lsbE5hbWUpXG4gICAgICA/ICc8c3BhbiBjbGFzcz1cInJ3LWNoYW5nZS1iYWRnZSBydy1jaGFuZ2UtbmV3XCIgYXJpYS1sYWJlbD1cIk5ldyByZWNvbW1lbmRhdGlvbiBzaW5jZSBwcmV2aW91cyBydW5cIj5cdUQ4M0NcdUREOTUgTmV3PC9zcGFuPidcbiAgICAgIDogJyc7XG4gICAgY29uc3Qgc2tpbGxOYW1lTG93ZXIgID0gc2tpbGxOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgX3R5cGVPdmVycmlkZSAgID0gKHdpbmRvdy5fc2tpbGxUeXBlT3ZlcnJpZGVzIHx8IHt9KVtza2lsbE5hbWVMb3dlcl07XG4gICAgY29uc3QgX2Jhc2VUeXBlICAgICAgID0gaGFyZFNraWxsU2V0Lmhhcyhza2lsbE5hbWVMb3dlcikgPyAnaGFyZCdcbiAgICAgIDogc29mdFNraWxsU2V0Py5oYXMoc2tpbGxOYW1lTG93ZXIpID8gJ3NvZnQnIDogbnVsbDtcbiAgICBjb25zdCBfZWZmZWN0aXZlVHlwZSAgPSBfdHlwZU92ZXJyaWRlIHx8IF9iYXNlVHlwZTtcbiAgICBjb25zdCBfaXNPdmVycmlkZGVuICAgPSAhIV90eXBlT3ZlcnJpZGUgJiYgX3R5cGVPdmVycmlkZSAhPT0gX2Jhc2VUeXBlO1xuICAgIGNvbnN0IF90b2dnbGVUYXJnZXQgICA9IF9lZmZlY3RpdmVUeXBlID09PSAnaGFyZCcgPyAnc29mdCdcbiAgICAgIDogX2VmZmVjdGl2ZVR5cGUgPT09ICdzb2Z0JyA/IG51bGwgOiAnaGFyZCc7XG4gICAgY29uc3QgX2JhZGdlVGl0bGUgICAgID0gX2lzT3ZlcnJpZGRlblxuICAgICAgPyBgVXNlciBvdmVycmlkZTogJHtfZWZmZWN0aXZlVHlwZX0gKG9yaWdpbmFsOiAke19iYXNlVHlwZSB8fCAnbm9uZSd9KSBcdTIwMTQgY2xpY2sgdG8gY3ljbGVgXG4gICAgICA6IF9lZmZlY3RpdmVUeXBlXG4gICAgICAgID8gYCR7X2VmZmVjdGl2ZVR5cGUgPT09ICdoYXJkJyA/ICdSZXF1aXJlZCcgOiAnTmljZS10by1oYXZlJ30gcGVyIGpvYiBkZXNjcmlwdGlvbiBcdTIwMTQgY2xpY2sgdG8gb3ZlcnJpZGVgXG4gICAgICAgIDogJ05vdCBjbGFzc2lmaWVkIFx1MjAxNCBjbGljayB0byBtYXJrIGFzIEhhcmQnO1xuICAgIGNvbnN0IF9iYWRnZVN0eWxlICAgICA9IF9lZmZlY3RpdmVUeXBlID09PSAnaGFyZCdcbiAgICAgID8gYG1hcmdpbi1sZWZ0OjVweDtmb250LXNpemU6MTBweDtmb250LXdlaWdodDo2MDA7Y29sb3I6IzFkNGVkODtiYWNrZ3JvdW5kOiNkYmVhZmU7Ym9yZGVyLXJhZGl1czozcHg7cGFkZGluZzoxcHggNXB4O2N1cnNvcjpwb2ludGVyOyR7X2lzT3ZlcnJpZGRlbiA/ICdvdXRsaW5lOjJweCBzb2xpZCAjMWQ0ZWQ4O291dGxpbmUtb2Zmc2V0OjFweDsnIDogJyd9YFxuICAgICAgOiBfZWZmZWN0aXZlVHlwZSA9PT0gJ3NvZnQnXG4gICAgICAgID8gYG1hcmdpbi1sZWZ0OjVweDtmb250LXNpemU6MTBweDtmb250LXdlaWdodDo2MDA7Y29sb3I6IzZiMjFhODtiYWNrZ3JvdW5kOiNmM2U4ZmY7Ym9yZGVyLXJhZGl1czozcHg7cGFkZGluZzoxcHggNXB4O2N1cnNvcjpwb2ludGVyOyR7X2lzT3ZlcnJpZGRlbiA/ICdvdXRsaW5lOjJweCBzb2xpZCAjNmIyMWE4O291dGxpbmUtb2Zmc2V0OjFweDsnIDogJyd9YFxuICAgICAgICA6ICdtYXJnaW4tbGVmdDo1cHg7Zm9udC1zaXplOjEwcHg7Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOiM2YjcyODA7YmFja2dyb3VuZDojZjNmNGY2O2JvcmRlci1yYWRpdXM6M3B4O3BhZGRpbmc6MXB4IDVweDtjdXJzb3I6cG9pbnRlcjtib3JkZXI6MXB4IGRhc2hlZCAjOWNhM2FmOyc7XG4gICAgY29uc3QgX2JhZGdlTGFiZWwgICAgID0gX2VmZmVjdGl2ZVR5cGUgPyAoX2VmZmVjdGl2ZVR5cGUgPT09ICdoYXJkJyA/ICdIYXJkJyA6ICdTb2Z0JykgOiAnKyBUeXBlJztcbiAgICBjb25zdCBza2lsbFR5cGVCYWRnZSAgPSBgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJza2lsbC10eXBlLXRvZ2dsZVwiIGRhdGEtc2tpbGw9XCIke3NraWxsTmFtZUVzY31cIiBkYXRhLXRvZ2dsZS10bz1cIiR7X3RvZ2dsZVRhcmdldCB8fCAnJ31cIiB0aXRsZT1cIiR7X2JhZGdlVGl0bGV9XCIgc3R5bGU9XCIke19iYWRnZVN0eWxlfVwiIGFyaWEtbGFiZWw9XCJTa2lsbCB0eXBlOiAke19lZmZlY3RpdmVUeXBlIHx8ICd1bmNsYXNzaWZpZWQnfSwgY2xpY2sgdG8gdG9nZ2xlXCI+JHtfYmFkZ2VMYWJlbH08L2J1dHRvbj5gO1xuICAgIGNvbnN0IHJlY29tbWVuZGF0aW9uVGV4dCA9IHJlY29tbWVuZGF0aW9uIHx8IChza2lsbC5faXNVc2VyQ3JlYXRlZCA/ICdJbmNsdWRlIChzZXNzaW9uLWFkZGVkKScgOiAoaXNOZXcgPyAnSW5jbHVkZSAoQUkgc3VnZ2VzdGVkKScgOiAnT21pdCcpKTtcbiAgICBjb25zdCBjb25maWRlbmNlQmFkZ2UgICAgPSBgPHNwYW4gY2xhc3M9XCJjb25maWRlbmNlLWJhZGdlIGNvbmZpZGVuY2UtJHtjb25maWRlbmNlLmxldmVsfVwiPiR7Y29uZmlkZW5jZS50ZXh0fTwvc3Bhbj5gO1xuICAgIGNvbnN0IHJlYXNvbmluZ1RleHQgICAgICA9IHJlYXNvbmluZyB8fCAoc2tpbGwuX2lzVXNlckNyZWF0ZWRcbiAgICAgID8gJ1lvdSBhZGRlZCB0aGlzIHNraWxsIGZvciB0aGUgY3VycmVudCBDViBzZXNzaW9uIG9ubHkuJ1xuICAgICAgOiAoaXNOZXdcbiAgICAgICAgPyAnUmVjb21tZW5kZWQgYnkgQUkgYmFzZWQgb24gam9iIHJlcXVpcmVtZW50cyBidXQgbm90IGN1cnJlbnRseSBpbiB5b3VyIG1hc3RlciBDVi4nXG4gICAgICAgIDogJ1RoaXMgc2tpbGwgd2FzIG5vdCBzcGVjaWZpY2FsbHkgbWVudGlvbmVkIGluIHRoZSBqb2IgcmVxdWlyZW1lbnRzLicpKTtcbiAgICBjb25zdCBncm91cGluZ0NoYW5nZVRleHQgPSBncm91cGluZ1N1Z2dlc3Rpb24/LmNoYW5nZVRleHQgfHwgJyc7XG4gICAgY29uc3QgZ3JvdXBpbmdSZWFzb25UZXh0ID0gZ3JvdXBpbmdTdWdnZXN0aW9uPy5yZWFzb25pbmcgfHwgJyc7XG4gICAgY29uc3QgZ3JvdXBpbmdBdHNJbXBhY3QgPSBncm91cGluZ1N1Z2dlc3Rpb24/LmF0c0ltcGFjdCB8fCAnJztcbiAgICBjb25zdCBncm91cGluZ1BhZ2VJbXBhY3QgPSBncm91cGluZ1N1Z2dlc3Rpb24/LnBhZ2VMZW5ndGhJbXBhY3QgfHwgJyc7XG4gICAgY29uc3QgcmVhc29uaW5nU2VnbWVudHMgPSBbcmVhc29uaW5nVGV4dF07XG4gICAgaWYgKGdyb3VwaW5nQ2hhbmdlVGV4dCkgcmVhc29uaW5nU2VnbWVudHMucHVzaChgQ2hhbmdlOiAke2dyb3VwaW5nQ2hhbmdlVGV4dH1gKTtcbiAgICBpZiAoZ3JvdXBpbmdSZWFzb25UZXh0KSByZWFzb25pbmdTZWdtZW50cy5wdXNoKGdyb3VwaW5nUmVhc29uVGV4dCk7XG4gICAgaWYgKGdyb3VwaW5nQXRzSW1wYWN0KSByZWFzb25pbmdTZWdtZW50cy5wdXNoKGBBVFMgaW1wYWN0OiAke2dyb3VwaW5nQXRzSW1wYWN0fWApO1xuICAgIGlmIChncm91cGluZ1BhZ2VJbXBhY3QpIHJlYXNvbmluZ1NlZ21lbnRzLnB1c2goYFBhZ2UgbGVuZ3RoIGltcGFjdDogJHtncm91cGluZ1BhZ2VJbXBhY3R9YCk7XG4gICAgY29uc3QgZnVsbFJlYXNvbmluZ1RleHQgPSByZWFzb25pbmdTZWdtZW50cy5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuICAgIGNvbnN0IHJvd1N0eWxlICAgICAgICAgICA9IGlzTmV3ID8gJ2JhY2tncm91bmQ6I2ZmZmJlYjsnIDogJyc7XG4gICAgY29uc3QgZGVmYXVsdE1hdGNoZXMgPSBpc05ldyA/IChzYXZlZE1hdGNoZXNbc2tpbGxOYW1lXSB8fCBkZXJpdmVNYXRjaGVzKHNraWxsTmFtZSkpIDogW107XG4gICAgY29uc3QgbWF0Y2hWYWx1ZSA9IGRlZmF1bHRNYXRjaGVzLmpvaW4oJywgJyk7XG4gICAgY29uc3QgbWF0Y2hIZWxwID0gaXNOZXdcbiAgICAgID8gJ0NvbW1hLXNlcGFyYXRlZCBleHBlcmllbmNlIElEcy4gQXV0by1kZXJpdmVkOyB5b3UgY2FuIGVkaXQgYmVmb3JlIHN1Ym1pdC4nXG4gICAgICA6ICdPbmx5IHVzZWQgZm9yIEFJLXN1Z2dlc3RlZCBza2lsbHMuJztcbiAgICBjb25zdCBkZXJpdmVkWWVhcnMgPSBpc05ldyA/IF9jb21wdXRlWWVhcnNGcm9tSWRzKGRlZmF1bHRNYXRjaGVzLCBhbGxFeHBlcmllbmNlcykgOiBudWxsO1xuICAgIGNvbnN0IHllYXJzSGludCA9IGRlcml2ZWRZZWFycyAhPSBudWxsXG4gICAgICA/IGB+JHtkZXJpdmVkWWVhcnN9IHlyJHtkZXJpdmVkWWVhcnMgPT09IDEgPyAnJyA6ICdzJ31gXG4gICAgICA6IChpc05ldyA/ICdubyBtYXRjaCcgOiAnJyk7XG5cbiAgICB0YWJsZUhUTUwgKz0gYFxuICAgICAgPHRyIGRhdGEtc2tpbGw9XCIke3NraWxsTmFtZUVzY31cIiBzdHlsZT1cIiR7cm93U3R5bGV9XCI+XG4gICAgICAgIDx0ZD48c3Ryb25nPiR7c2tpbGxOYW1lRXNjfTwvc3Ryb25nPiR7c2tpbGxUeXBlQmFkZ2V9JHtyZXJ1bk5ld0JhZGdlfSR7bmV3QmFkZ2V9JHtjYW5kaWRhdGVCYWRnZX0ke2V2aWRlbmNlTm90ZX08L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJtaW4td2lkdGg6MTQwcHg7XCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJza2lsbC1jYXRlZ29yeS1pbnB1dFwiIGRhdGEtc2tpbGw9XCIke3NraWxsTmFtZUVzY31cIlxuICAgICAgICAgICAgdmFsdWU9XCIke2VzY2FwZUh0bWwoY2F0ZWdvcnlLZXkpfVwiXG4gICAgICAgICAgICBsaXN0PVwiJHtjYXRlZ29yeUxpc3RJZH1cIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIFByb2dyYW1taW5nXCJcbiAgICAgICAgICAgIHRpdGxlPVwiU2Vzc2lvbi1vbmx5IGNhdGVnb3J5IGxhYmVsIHVzZWQgd2hlbiBncm91cGluZyBza2lsbHMgaW4gdGhlIGdlbmVyYXRlZCBDVlwiXG4gICAgICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Zm9udC1zaXplOjAuOGVtO3BhZGRpbmc6NHB4IDZweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo0cHg7XCIvPlxuICAgICAgICAgICR7Z3JvdXBpbmdTdWdnZXN0aW9uPy5jYXRlZ29yeUNoYW5nZWQgPyBgPGRpdiBjbGFzcz1cInNraWxsLWFpLWhpbnRcIiBzdHlsZT1cIm1hcmdpbi10b3A6NHB4O2ZvbnQtc2l6ZTowLjc1ZW07Y29sb3I6IzQzMzhjYTtcIj5cbiAgICAgICAgICAgIEFJIHN1Z2dlc3Rpb246ICR7ZXNjYXBlSHRtbChncm91cGluZ1N1Z2dlc3Rpb24uY2F0ZWdvcnkpfVxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNraWxsLWFwcGx5LWFpXCIgZGF0YS1za2lsbD1cIiR7c2tpbGxOYW1lRXNjfVwiIGRhdGEtYWktZmllbGQ9XCJjYXRlZ29yeVwiIGRhdGEtYWktdmFsdWU9XCIke2VzY2FwZUh0bWwoZ3JvdXBpbmdTdWdnZXN0aW9uLmNhdGVnb3J5KX1cIiBzdHlsZT1cIm1hcmdpbi1sZWZ0OjZweDtib3JkZXI6MXB4IHNvbGlkICNjN2QyZmU7YmFja2dyb3VuZDojZWVmMmZmO2NvbG9yOiM0MzM4Y2E7Ym9yZGVyLXJhZGl1czo0cHg7cGFkZGluZzoxcHggNnB4O2N1cnNvcjpwb2ludGVyO1wiPkFwcGx5PC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+YCA6ICcnfVxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJtaW4td2lkdGg6MTAwcHg7XCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJza2lsbC1ncm91cC1pbnB1dFwiIGRhdGEtc2tpbGw9XCIke3NraWxsTmFtZUVzY31cIlxuICAgICAgICAgICAgdmFsdWU9XCIke2VzY2FwZUh0bWwoZ3JvdXBLZXkpfVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gY19mYW1pbHlcIlxuICAgICAgICAgICAgdGl0bGU9XCJTa2lsbHMgd2l0aCB0aGUgc2FtZSBncm91cCBrZXkgcmVuZGVyIGFzIG9uZSBjb21tYS1zZXBhcmF0ZWQgYnVsbGV0XCJcbiAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTtmb250LXNpemU6MC44ZW07cGFkZGluZzo0cHggNnB4O2JvcmRlcjoxcHggc29saWQgI2QxZDVkYjtib3JkZXItcmFkaXVzOjRweDtcIi8+XG4gICAgICAgICAgJHtncm91cGluZ1N1Z2dlc3Rpb24/Lmdyb3VwQ2hhbmdlZCA/IGA8ZGl2IGNsYXNzPVwic2tpbGwtYWktaGludFwiIHN0eWxlPVwibWFyZ2luLXRvcDo0cHg7Zm9udC1zaXplOjAuNzVlbTtjb2xvcjojNDMzOGNhO1wiPlxuICAgICAgICAgICAgQUkgc3VnZ2VzdGlvbjogJHtlc2NhcGVIdG1sKGdyb3VwaW5nU3VnZ2VzdGlvbi5ncm91cCl9XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2tpbGwtYXBwbHktYWlcIiBkYXRhLXNraWxsPVwiJHtza2lsbE5hbWVFc2N9XCIgZGF0YS1haS1maWVsZD1cImdyb3VwXCIgZGF0YS1haS12YWx1ZT1cIiR7ZXNjYXBlSHRtbChncm91cGluZ1N1Z2dlc3Rpb24uZ3JvdXApfVwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6NnB4O2JvcmRlcjoxcHggc29saWQgI2M3ZDJmZTtiYWNrZ3JvdW5kOiNlZWYyZmY7Y29sb3I6IzQzMzhjYTtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjFweCA2cHg7Y3Vyc29yOnBvaW50ZXI7XCI+QXBwbHk8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5gIDogJyd9XG4gICAgICAgICAgJHtncm91cFdhcm5pbmcgPyBgPGRpdiBjbGFzcz1cInNraWxsLWdyb3VwLXdhcm5pbmdcIiB0aXRsZT1cIiR7ZXNjYXBlSHRtbChncm91cFdhcm5pbmcucHJldmlldyl9XCIgc3R5bGU9XCJtYXJnaW4tdG9wOjRweDtmb250LXNpemU6MC43NWVtO2NvbG9yOiNiNDUzMDk7XCI+XHUyNkEwICR7ZXNjYXBlSHRtbChncm91cFdhcm5pbmcubWVzc2FnZSl9PC9kaXY+YCA6ICcnfVxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJtaW4td2lkdGg6MTIwcHg7XCI+XG4gICAgICAgICAgPHNlbGVjdCBjbGFzcz1cInNraWxsLXByb2ZpY2llbmN5LWlucHV0XCIgZGF0YS1za2lsbD1cIiR7c2tpbGxOYW1lRXNjfVwiXG4gICAgICAgICAgICB0aXRsZT1cIlNlc3Npb24tb25seSBwcm9maWNpZW5jeSBsYWJlbCB1c2VkIHdoZW4gcmVuZGVyaW5nIGlubGluZSBza2lsbCBidWxsZXRzXCJcbiAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTtmb250LXNpemU6MC44ZW07cGFkZGluZzo0cHggNnB4O2JvcmRlcjoxcHggc29saWQgI2QxZDVkYjtib3JkZXItcmFkaXVzOjRweDtcIj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIiAkeyFwcm9maWNpZW5jeUtleSA/ICdzZWxlY3RlZCcgOiAnJ30+Tm9uZTwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImJlZ2lubmVyXCIgJHtwcm9maWNpZW5jeUtleSA9PT0gJ2JlZ2lubmVyJyA/ICdzZWxlY3RlZCcgOiAnJ30+QmVnaW5uZXI8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJmYW1pbGlhclwiICR7cHJvZmljaWVuY3lLZXkgPT09ICdmYW1pbGlhcicgPyAnc2VsZWN0ZWQnIDogJyd9PkZhbWlsaWFyPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiaW50ZXJtZWRpYXRlXCIgJHtwcm9maWNpZW5jeUtleSA9PT0gJ2ludGVybWVkaWF0ZScgPyAnc2VsZWN0ZWQnIDogJyd9PkludGVybWVkaWF0ZTwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImFkdmFuY2VkXCIgJHtwcm9maWNpZW5jeUtleSA9PT0gJ2FkdmFuY2VkJyA/ICdzZWxlY3RlZCcgOiAnJ30+QWR2YW5jZWQ8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJleHBlcnRcIiAke3Byb2ZpY2llbmN5S2V5ID09PSAnZXhwZXJ0JyA/ICdzZWxlY3RlZCcgOiAnJ30+RXhwZXJ0PC9vcHRpb24+XG4gICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cIm1pbi13aWR0aDoxODBweDtcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cInNraWxsLXN1YnNraWxscy1pbnB1dFwiIGRhdGEtc2tpbGw9XCIke3NraWxsTmFtZUVzY31cIlxuICAgICAgICAgICAgdmFsdWU9XCIke2VzY2FwZUh0bWwoc3Vic2tpbGxzLmpvaW4oJywgJykpfVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gUGFuZGFzLCBOdW1QeVwiXG4gICAgICAgICAgICB0aXRsZT1cIkNvbW1hLXNlcGFyYXRlZCBzdWItc2tpbGxzIHVzZWQgaW4gaW5saW5lIHNraWxsIGJ1bGxldHNcIlxuICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDoxMDAlO2ZvbnQtc2l6ZTowLjhlbTtwYWRkaW5nOjRweCA2cHg7Ym9yZGVyOjFweCBzb2xpZCAjZDFkNWRiO2JvcmRlci1yYWRpdXM6NHB4O1wiLz5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwibWluLXdpZHRoOjE4MHB4O1wiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwic2tpbGwtcGFyZW50aGV0aWNhbC1pbnB1dFwiIGRhdGEtc2tpbGw9XCIke3NraWxsTmFtZUVzY31cIlxuICAgICAgICAgICAgdmFsdWU9XCIke2VzY2FwZUh0bWwocGFyZW50aGV0aWNhbEtleSl9XCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiT3B0aW9uYWwgaW5saW5lIG5vdGVcIlxuICAgICAgICAgICAgdGl0bGU9XCJGcmVlLWZvcm0gcGFyZW50aGV0aWNhbCBvdmVycmlkZSBmb3IgdGhlIHJlbmRlcmVkIGlubGluZSBza2lsbCBsYWJlbFwiXG4gICAgICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Zm9udC1zaXplOjAuOGVtO3BhZGRpbmc6NHB4IDZweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo0cHg7XCIvPlxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQ+PHN0cm9uZz4ke2VzY2FwZUh0bWwocmVjb21tZW5kYXRpb25UZXh0KX08L3N0cm9uZz48L3RkPlxuICAgICAgICA8dGQ+JHtjb25maWRlbmNlQmFkZ2V9PC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwibWF4LXdpZHRoOjMwMHB4O1wiPjxzbWFsbD4ke2VzY2FwZUh0bWwoZnVsbFJlYXNvbmluZ1RleHQpfTwvc21hbGw+PC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwibWluLXdpZHRoOjI2MHB4O1wiPlxuICAgICAgICAgICR7aXNOZXcgPyBgPGlucHV0XG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICBjbGFzcz1cInNraWxsLW1hdGNoLWlucHV0XCJcbiAgICAgICAgICAgIGRhdGEtc2tpbGw9XCIke3NraWxsTmFtZUVzY31cIlxuICAgICAgICAgICAgdmFsdWU9XCIke2VzY2FwZUh0bWwobWF0Y2hWYWx1ZSl9XCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZXhwXzEsIGV4cF8yXCJcbiAgICAgICAgICAgIHRpdGxlPVwiJHtlc2NhcGVIdG1sKG1hdGNoSGVscCl9XCJcbiAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTtmb250LXNpemU6MC44NWVtO3BhZGRpbmc6NnB4IDhweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo2cHg7XCJcbiAgICAgICAgICAvPjxzcGFuIGNsYXNzPVwiZGVyaXZlZC15ZWFycy1oaW50XCIgZGF0YS1za2lsbD1cIiR7c2tpbGxOYW1lRXNjfVwiIHRpdGxlPVwiRXN0aW1hdGVkIHllYXJzIGRlcml2ZWQgZnJvbSBtYXRjaGVkIGV4cGVyaWVuY2UgZW50cmllc1wiIHN0eWxlPVwiZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luLXRvcDo0cHg7Zm9udC1zaXplOjAuOGVtO2NvbG9yOiM2YjcyODA7XCI+JHtlc2NhcGVIdG1sKHllYXJzSGludCl9PC9zcGFuPmAgOiAnPHNwYW4gc3R5bGU9XCJjb2xvcjojOWNhM2FmO1wiPlx1MjAxNDwvc3Bhbj4nfVxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJhY3Rpb24tYnRuc1wiIHN0eWxlPVwid2hpdGUtc3BhY2U6bm93cmFwO1wiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0biAke2RlZmF1bHRBY3Rpb24gPT09ICdlbXBoYXNpemUnICAgID8gJ2FjdGl2ZScgOiAnJ31cIiBkYXRhLWFjdGlvbj1cImVtcGhhc2l6ZVwiICAgIGFyaWEtbGFiZWw9XCJFbXBoYXNpemUgJHtza2lsbE5hbWVFc2N9XCIgICAgYXJpYS1wcmVzc2VkPVwiJHtkZWZhdWx0QWN0aW9uID09PSAnZW1waGFzaXplJ31cIiAgICB0aXRsZT1cIkVtcGhhc2l6ZSBcdTIwMTQgZmVhdHVyZSBwcm9taW5lbnRseVwiIHN0eWxlPVwiY29sb3I6IzEwYjk4MTtcIj5cdTI3OTU8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG4gJHtkZWZhdWx0QWN0aW9uID09PSAnaW5jbHVkZScgICAgICA/ICdhY3RpdmUnIDogJyd9XCIgZGF0YS1hY3Rpb249XCJpbmNsdWRlXCIgICAgICBhcmlhLWxhYmVsPVwiSW5jbHVkZSAke3NraWxsTmFtZUVzY31cIiAgICAgIGFyaWEtcHJlc3NlZD1cIiR7ZGVmYXVsdEFjdGlvbiA9PT0gJ2luY2x1ZGUnfVwiICAgICAgdGl0bGU9XCJJbmNsdWRlIFx1MjAxNCBzdGFuZGFyZCBsaXN0aW5nXCI+XHUyNzEzPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuICR7ZGVmYXVsdEFjdGlvbiA9PT0gJ2RlLWVtcGhhc2l6ZScgPyAnYWN0aXZlJyA6ICcnfVwiIGRhdGEtYWN0aW9uPVwiZGUtZW1waGFzaXplXCIgYXJpYS1sYWJlbD1cIkRlLWVtcGhhc2l6ZSAke3NraWxsTmFtZUVzY31cIiBhcmlhLXByZXNzZWQ9XCIke2RlZmF1bHRBY3Rpb24gPT09ICdkZS1lbXBoYXNpemUnfVwiIHRpdGxlPVwiRGUtZW1waGFzaXplIFx1MjAxNCBicmllZiBtZW50aW9uXCIgICAgc3R5bGU9XCJjb2xvcjojZjU5ZTBiO1wiPlx1Mjc5NjwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0biAke2RlZmF1bHRBY3Rpb24gPT09ICdleGNsdWRlJyAgICAgID8gJ2FjdGl2ZScgOiAnJ31cIiBkYXRhLWFjdGlvbj1cImV4Y2x1ZGVcIiAgICAgIGFyaWEtbGFiZWw9XCJFeGNsdWRlICR7c2tpbGxOYW1lRXNjfVwiICAgICAgYXJpYS1wcmVzc2VkPVwiJHtkZWZhdWx0QWN0aW9uID09PSAnZXhjbHVkZSd9XCIgICAgICB0aXRsZT1cIkV4Y2x1ZGUgXHUyMDE0IG9taXQgZnJvbSBDVlwiICAgICAgICAgIHN0eWxlPVwiY29sb3I6I2VmNDQ0NDtcIj4ke2V5ZVNsYXNoSWNvbigpfTwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIGRhdGEtYWN0aW9uPVwicm93LXVwXCIgICBhcmlhLWxhYmVsPVwiTW92ZSAke3NraWxsTmFtZUVzY30gZWFybGllclwiIHRpdGxlPVwiTW92ZSB1cFwiICAgJHtpc0ZpcnN0ID8gJ2Rpc2FibGVkJyA6ICcnfT5cdTIxOTE8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBkYXRhLWFjdGlvbj1cInJvdy1kb3duXCIgYXJpYS1sYWJlbD1cIk1vdmUgJHtza2lsbE5hbWVFc2N9IGxhdGVyXCIgICB0aXRsZT1cIk1vdmUgZG93blwiICR7aXNMYXN0ICA/ICdkaXNhYmxlZCcgOiAnJ30+XHUyMTkzPC9idXR0b24+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L3RyPlxuICAgIGA7XG4gIH0pO1xuXG4gIHRhYmxlSFRNTCArPSAnPC90Ym9keT48L3RhYmxlPic7XG4gIGNvbnRhaW5lci5pbm5lckhUTUwgPSB0YWJsZUhUTUw7XG5cbiAgLy8gU2F2ZSBncm91cCBrZXkgZm9yIHRoaXMgc2Vzc2lvbiB3aGVuIHVzZXIgZmluaXNoZXMgZWRpdGluZ1xuICBjb250YWluZXIucXVlcnlTZWxlY3RvcignLnNraWxsLWNhdGVnb3J5LW1hbmFnZXInKT8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZSA9PiB7XG4gICAgY29uc3QgY2F0ZWdvcnlNYW5hZ2VySW5wdXQgPSBlLnRhcmdldC5jbG9zZXN0KCcuc2tpbGwtY2F0ZWdvcnktbWFuYWdlci1pbnB1dCcpO1xuICAgIGlmIChjYXRlZ29yeU1hbmFnZXJJbnB1dCkge1xuICAgICAgY29uc3QgbWFuYWdlclJvdyA9IGNhdGVnb3J5TWFuYWdlcklucHV0LmNsb3Nlc3QoJy5za2lsbC1jYXRlZ29yeS1tYW5hZ2VyLXJvdycpO1xuICAgICAgY29uc3Qgb2xkQ2F0ZWdvcnkgPSBtYW5hZ2VyUm93Py5kYXRhc2V0LmNhdGVnb3J5IHx8ICcnO1xuICAgICAgY29uc3QgbmV3Q2F0ZWdvcnkgPSBjYXRlZ29yeU1hbmFnZXJJbnB1dC52YWx1ZS50cmltKCk7XG4gICAgICBpZiAoIW9sZENhdGVnb3J5IHx8ICFuZXdDYXRlZ29yeSB8fCBvbGRDYXRlZ29yeSA9PT0gbmV3Q2F0ZWdvcnkpIHtcbiAgICAgICAgaWYgKG1hbmFnZXJSb3cpIGNhdGVnb3J5TWFuYWdlcklucHV0LnZhbHVlID0gb2xkQ2F0ZWdvcnk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIF9yZW5hbWVTa2lsbENhdGVnb3J5TG9jYWxseShvbGRDYXRlZ29yeSwgbmV3Q2F0ZWdvcnkpO1xuICAgICAgcmVuYW1lU2tpbGxDYXRlZ29yeShvbGRDYXRlZ29yeSwgbmV3Q2F0ZWdvcnkpXG4gICAgICAgIC50aGVuKCgpID0+IF9yZW5kZXJTa2lsbHNUYWJsZShjb250YWluZXIsIHJlY29tbWVuZGVkU2V0LCBkYXRhLCBoYXJkU2tpbGxTZXQsIHNvZnRTa2lsbFNldCkpXG4gICAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgX3JlbmFtZVNraWxsQ2F0ZWdvcnlMb2NhbGx5KG5ld0NhdGVnb3J5LCBvbGRDYXRlZ29yeSk7XG4gICAgICAgICAgaWYgKG1hbmFnZXJSb3cpIGNhdGVnb3J5TWFuYWdlcklucHV0LnZhbHVlID0gb2xkQ2F0ZWdvcnk7XG4gICAgICAgICAgc2hvd1RvYXN0KCdGYWlsZWQgdG8gcmVuYW1lIHNraWxsIGNhdGVnb3J5LicsICdlcnJvcicpO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcjc2tpbGxzLXJldmlldy10YWJsZSB0Ym9keScpPy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBlID0+IHtcbiAgICBjb25zdCBjYXRlZ29yeUlucHV0ID0gZS50YXJnZXQuY2xvc2VzdCgnLnNraWxsLWNhdGVnb3J5LWlucHV0Jyk7XG5cbiAgY29uc3QgYWRkU2tpbGxGb3JtID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJyNhZGQtc2tpbGwtZm9ybScpO1xuICBjb25zdCB0b2dnbGVBZGRTa2lsbEZvcm0gPSAoKSA9PiB7XG4gICAgaWYgKCFhZGRTa2lsbEZvcm0pIHJldHVybjtcbiAgICBhZGRTa2lsbEZvcm0uc3R5bGUuZGlzcGxheSA9IGFkZFNraWxsRm9ybS5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScgPyAnYmxvY2snIDogJ25vbmUnO1xuICB9O1xuICBjb250YWluZXIucXVlcnlTZWxlY3RvcignI3RvZ2dsZS1hZGQtc2tpbGwtZm9ybScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRvZ2dsZUFkZFNraWxsRm9ybSk7XG4gIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcjY2FuY2VsLWFkZC1za2lsbCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBpZiAoIWFkZFNraWxsRm9ybSkgcmV0dXJuO1xuICAgIGFkZFNraWxsRm9ybS5yZXNldCgpO1xuICAgIGFkZFNraWxsRm9ybS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICB9KTtcbiAgYWRkU2tpbGxGb3JtPy5hZGRFdmVudExpc3RlbmVyKCdzdWJtaXQnLCBhc3luYyBlID0+IHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoYWRkU2tpbGxGb3JtKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgc2F2ZVVzZXJDcmVhdGVkU2tpbGwoe1xuICAgICAgICBuYW1lOiBmb3JtRGF0YS5nZXQoJ25hbWUnKSxcbiAgICAgICAgY2F0ZWdvcnk6IGZvcm1EYXRhLmdldCgnY2F0ZWdvcnknKSxcbiAgICAgICAgZ3JvdXA6IGZvcm1EYXRhLmdldCgnZ3JvdXAnKSxcbiAgICAgICAgcHJvZmljaWVuY3k6IGZvcm1EYXRhLmdldCgncHJvZmljaWVuY3knKSxcbiAgICAgICAgc3Vic2tpbGxzOiBmb3JtRGF0YS5nZXQoJ3N1YnNraWxscycpLFxuICAgICAgICBwYXJlbnRoZXRpY2FsOiBmb3JtRGF0YS5nZXQoJ3BhcmVudGhldGljYWwnKSxcbiAgICAgIH0pO1xuICAgICAgc2hvd1RvYXN0KCdTZXNzaW9uLW9ubHkgc2tpbGwgYWRkZWQuJyk7XG4gICAgICBhZGRTa2lsbEZvcm0ucmVzZXQoKTtcbiAgICAgIGFkZFNraWxsRm9ybS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgX3JlbmRlclNraWxsc1RhYmxlKGNvbnRhaW5lciwgcmVjb21tZW5kZWRTZXQsIGRhdGEsIGhhcmRTa2lsbFNldCwgc29mdFNraWxsU2V0KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgc2hvd1RvYXN0KGVycm9yLm1lc3NhZ2UgfHwgJ0ZhaWxlZCB0byBhZGQgc2tpbGwuJywgJ2Vycm9yJyk7XG4gICAgfVxuICB9KTtcbiAgICBpZiAoY2F0ZWdvcnlJbnB1dCkge1xuICAgICAgY29uc3Qgc2tpbGxOYW1lID0gY2F0ZWdvcnlJbnB1dC5kYXRhc2V0LnNraWxsO1xuICAgICAgY29uc3QgbmV3Q2F0ZWdvcnkgPSBjYXRlZ29yeUlucHV0LnZhbHVlLnRyaW0oKTtcbiAgICAgIHNhdmVTa2lsbENhdGVnb3J5T3ZlcnJpZGUoc2tpbGxOYW1lLCBuZXdDYXRlZ29yeSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICBzaG93VG9hc3QoJ0ZhaWxlZCB0byBzYXZlIHNraWxsIGNhdGVnb3J5LicsICdlcnJvcicpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaW5wdXQgPSBlLnRhcmdldC5jbG9zZXN0KCcuc2tpbGwtZ3JvdXAtaW5wdXQnKTtcbiAgICBpZiAoaW5wdXQpIHtcbiAgICAgIGNvbnN0IHNraWxsTmFtZSA9IGlucHV0LmRhdGFzZXQuc2tpbGw7XG4gICAgICBjb25zdCBuZXdHcm91cCA9IGlucHV0LnZhbHVlLnRyaW0oKTtcbiAgICAgIHNhdmVTa2lsbEdyb3VwT3ZlcnJpZGUoc2tpbGxOYW1lLCBuZXdHcm91cCkuY2F0Y2goKCkgPT4ge1xuICAgICAgICBzaG93VG9hc3QoJ0ZhaWxlZCB0byBzYXZlIHNraWxsIGdyb3VwLicsICdlcnJvcicpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcXVhbGlmaWVySW5wdXQgPSBlLnRhcmdldC5jbG9zZXN0KCcuc2tpbGwtcHJvZmljaWVuY3ktaW5wdXQsIC5za2lsbC1zdWJza2lsbHMtaW5wdXQsIC5za2lsbC1wYXJlbnRoZXRpY2FsLWlucHV0Jyk7XG4gICAgaWYgKCFxdWFsaWZpZXJJbnB1dCkgcmV0dXJuO1xuICAgIGNvbnN0IHNraWxsTmFtZSA9IHF1YWxpZmllcklucHV0LmRhdGFzZXQuc2tpbGw7XG4gICAgY29uc3Qgcm93ID0gcXVhbGlmaWVySW5wdXQuY2xvc2VzdCgndHJbZGF0YS1za2lsbF0nKTtcbiAgICBpZiAoIXNraWxsTmFtZSB8fCAhcm93KSByZXR1cm47XG4gICAgY29uc3QgcHJvZmljaWVuY3kgPSByb3cucXVlcnlTZWxlY3RvcignLnNraWxsLXByb2ZpY2llbmN5LWlucHV0Jyk/LnZhbHVlIHx8ICcnO1xuICAgIGNvbnN0IHN1YnNraWxsc1ZhbHVlID0gcm93LnF1ZXJ5U2VsZWN0b3IoJy5za2lsbC1zdWJza2lsbHMtaW5wdXQnKT8udmFsdWUgfHwgJyc7XG4gICAgY29uc3QgcGFyZW50aGV0aWNhbCA9IHJvdy5xdWVyeVNlbGVjdG9yKCcuc2tpbGwtcGFyZW50aGV0aWNhbC1pbnB1dCcpPy52YWx1ZSB8fCAnJztcbiAgICBzYXZlU2tpbGxRdWFsaWZpZXJPdmVycmlkZShza2lsbE5hbWUsIHtcbiAgICAgIHByb2ZpY2llbmN5LFxuICAgICAgc3Vic2tpbGxzOiBzdWJza2lsbHNWYWx1ZSxcbiAgICAgIHBhcmVudGhldGljYWwsXG4gICAgfSkuY2F0Y2goKCkgPT4ge1xuICAgICAgc2hvd1RvYXN0KCdGYWlsZWQgdG8gc2F2ZSBza2lsbCBxdWFsaWZpZXJzLicsICdlcnJvcicpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBVcGRhdGUgZGVyaXZlZC15ZWFycyBoaW50IGxpdmUgYXMgdXNlciBlZGl0cyB0aGUgZXhwZXJpZW5jZSBtYXRjaCBpbnB1dFxuICBjb250YWluZXIucXVlcnlTZWxlY3RvcignI3NraWxscy1yZXZpZXctdGFibGUgdGJvZHknKT8uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBlID0+IHtcbiAgICBjb25zdCBpbnB1dCA9IGUudGFyZ2V0LmNsb3Nlc3QoJy5za2lsbC1tYXRjaC1pbnB1dCcpO1xuICAgIGlmICghaW5wdXQpIHJldHVybjtcbiAgICBjb25zdCBza2lsbE5hbWUgPSBpbnB1dC5kYXRhc2V0LnNraWxsO1xuICAgIGNvbnN0IGlkcyA9IGlucHV0LnZhbHVlLnNwbGl0KCcsJykubWFwKHggPT4geC50cmltKCkpLmZpbHRlcihCb29sZWFuKTtcbiAgICBjb25zdCB5ZWFycyA9IF9jb21wdXRlWWVhcnNGcm9tSWRzKGlkcywgYWxsRXhwZXJpZW5jZXMpO1xuICAgIGNvbnN0IGhpbnQgPSB5ZWFycyAhPSBudWxsID8gYH4ke3llYXJzfSB5ciR7eWVhcnMgPT09IDEgPyAnJyA6ICdzJ31gIDogJ25vIG1hdGNoJztcbiAgICBjb25zdCBzcGFuID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoYC5kZXJpdmVkLXllYXJzLWhpbnRbZGF0YS1za2lsbD1cIiR7Q1NTLmVzY2FwZShza2lsbE5hbWUpfVwiXWApO1xuICAgIGlmIChzcGFuKSBzcGFuLnRleHRDb250ZW50ID0gaGludDtcbiAgfSk7XG5cbiAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJyNza2lsbHMtcmV2aWV3LXRhYmxlIHRib2R5Jyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZSA9PiB7XG4gICAgY29uc3QgdHlwZVRvZ2dsZSA9IGUudGFyZ2V0LmNsb3Nlc3QoJy5za2lsbC10eXBlLXRvZ2dsZScpO1xuICAgIGlmICh0eXBlVG9nZ2xlKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgY29uc3Qgc2tpbGxOYW1lID0gdHlwZVRvZ2dsZS5kYXRhc2V0LnNraWxsO1xuICAgICAgY29uc3QgdG9nZ2xlVG8gPSB0eXBlVG9nZ2xlLmRhdGFzZXQudG9nZ2xlVG8gfHwgbnVsbDtcbiAgICAgIHdpbmRvdy5fc2tpbGxUeXBlT3ZlcnJpZGVzID0gd2luZG93Ll9za2lsbFR5cGVPdmVycmlkZXMgfHwge307XG4gICAgICBpZiAodG9nZ2xlVG8pIHtcbiAgICAgICAgd2luZG93Ll9za2lsbFR5cGVPdmVycmlkZXNbc2tpbGxOYW1lLnRvTG93ZXJDYXNlKCldID0gdG9nZ2xlVG87XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgd2luZG93Ll9za2lsbFR5cGVPdmVycmlkZXNbc2tpbGxOYW1lLnRvTG93ZXJDYXNlKCldO1xuICAgICAgfVxuICAgICAgc2F2ZVNraWxsUXVhbGlmaWVyT3ZlcnJpZGUoc2tpbGxOYW1lLCB7XG4gICAgICAgIHByb2ZpY2llbmN5OiBjb250YWluZXIucXVlcnlTZWxlY3RvcihgLnNraWxsLXByb2ZpY2llbmN5LWlucHV0W2RhdGEtc2tpbGw9XCIke19jc3NFc2NhcGUoc2tpbGxOYW1lKX1cIl1gKT8udmFsdWUgfHwgJycsXG4gICAgICAgIHN1YnNraWxsczogY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoYC5za2lsbC1zdWJza2lsbHMtaW5wdXRbZGF0YS1za2lsbD1cIiR7X2Nzc0VzY2FwZShza2lsbE5hbWUpfVwiXWApPy52YWx1ZSB8fCAnJyxcbiAgICAgICAgcGFyZW50aGV0aWNhbDogY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoYC5za2lsbC1wYXJlbnRoZXRpY2FsLWlucHV0W2RhdGEtc2tpbGw9XCIke19jc3NFc2NhcGUoc2tpbGxOYW1lKX1cIl1gKT8udmFsdWUgfHwgJycsXG4gICAgICAgIHNraWxsX3R5cGU6IHRvZ2dsZVRvIHx8ICcnLFxuICAgICAgfSkudGhlbigoKSA9PiBfcmVuZGVyU2tpbGxzVGFibGUoY29udGFpbmVyLCByZWNvbW1lbmRlZFNldCwgZGF0YSwgaGFyZFNraWxsU2V0LCBzb2Z0U2tpbGxTZXQpKVxuICAgICAgICAuY2F0Y2goKCkgPT4gc2hvd1RvYXN0KCdGYWlsZWQgdG8gc2F2ZSBza2lsbCB0eXBlIG92ZXJyaWRlLicsICdlcnJvcicpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBhaUJ0biA9IGUudGFyZ2V0LmNsb3Nlc3QoJy5za2lsbC1hcHBseS1haScpO1xuICAgIGlmIChhaUJ0bikge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGNvbnN0IHNraWxsTmFtZSA9IGFpQnRuLmRhdGFzZXQuc2tpbGw7XG4gICAgICBjb25zdCBmaWVsZCA9IGFpQnRuLmRhdGFzZXQuYWlGaWVsZDtcbiAgICAgIGNvbnN0IHZhbHVlID0gYWlCdG4uZGF0YXNldC5haVZhbHVlIHx8ICcnO1xuICAgICAgaWYgKGZpZWxkID09PSAnY2F0ZWdvcnknKSB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoYC5za2lsbC1jYXRlZ29yeS1pbnB1dFtkYXRhLXNraWxsPVwiJHtfY3NzRXNjYXBlKHNraWxsTmFtZSl9XCJdYCk7XG4gICAgICAgIGlmIChpbnB1dCkgaW5wdXQudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgc2F2ZVNraWxsQ2F0ZWdvcnlPdmVycmlkZShza2lsbE5hbWUsIHZhbHVlKVxuICAgICAgICAgIC50aGVuKCgpID0+IF9yZW5kZXJTa2lsbHNUYWJsZShjb250YWluZXIsIHJlY29tbWVuZGVkU2V0LCBkYXRhLCBoYXJkU2tpbGxTZXQsIHNvZnRTa2lsbFNldCkpXG4gICAgICAgICAgLmNhdGNoKCgpID0+IHNob3dUb2FzdCgnRmFpbGVkIHRvIGFwcGx5IEFJIGNhdGVnb3J5IHN1Z2dlc3Rpb24uJywgJ2Vycm9yJykpO1xuICAgICAgfSBlbHNlIGlmIChmaWVsZCA9PT0gJ2dyb3VwJykge1xuICAgICAgICBjb25zdCBpbnB1dCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKGAuc2tpbGwtZ3JvdXAtaW5wdXRbZGF0YS1za2lsbD1cIiR7X2Nzc0VzY2FwZShza2lsbE5hbWUpfVwiXWApO1xuICAgICAgICBpZiAoaW5wdXQpIGlucHV0LnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHNhdmVTa2lsbEdyb3VwT3ZlcnJpZGUoc2tpbGxOYW1lLCB2YWx1ZSlcbiAgICAgICAgICAudGhlbigoKSA9PiBfcmVuZGVyU2tpbGxzVGFibGUoY29udGFpbmVyLCByZWNvbW1lbmRlZFNldCwgZGF0YSwgaGFyZFNraWxsU2V0LCBzb2Z0U2tpbGxTZXQpKVxuICAgICAgICAgIC5jYXRjaCgoKSA9PiBzaG93VG9hc3QoJ0ZhaWxlZCB0byBhcHBseSBBSSBncm91cCBzdWdnZXN0aW9uLicsICdlcnJvcicpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgYnRuID0gZS50YXJnZXQuY2xvc2VzdCgnLmljb24tYnRuJyk7XG4gICAgaWYgKCFidG4pIHJldHVybjtcbiAgICBjb25zdCB0ciA9IGJ0bi5jbG9zZXN0KCd0cltkYXRhLXNraWxsXScpO1xuICAgIGlmICghdHIpIHJldHVybjtcbiAgICBjb25zdCBza2lsbE5hbWUgPSB0ci5kYXRhc2V0LnNraWxsO1xuICAgIGNvbnN0IGFjdGlvbiAgICA9IGJ0bi5kYXRhc2V0LmFjdGlvbjtcbiAgICBpZiAoYWN0aW9uID09PSAncm93LXVwJykge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIG1vdmVTa2lsbFJvdyhza2lsbE5hbWUsIC0xKTtcbiAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PT0gJ3Jvdy1kb3duJykge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIG1vdmVTa2lsbFJvdyhza2lsbE5hbWUsICsxKTtcbiAgICB9IGVsc2UgaWYgKGFjdGlvbikge1xuICAgICAgaGFuZGxlQWN0aW9uQ2xpY2soc2tpbGxOYW1lLCBhY3Rpb24sICdza2lsbCcpO1xuICAgIH1cbiAgfSk7XG5cbiAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5za2lsbC1jYXRlZ29yeS1tYW5hZ2VyJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZSA9PiB7XG4gICAgY29uc3QgYnRuID0gZS50YXJnZXQuY2xvc2VzdCgnLmljb24tYnRuW2RhdGEtYWN0aW9uXj1cImNhdGVnb3J5LVwiXScpO1xuICAgIGlmICghYnRuKSByZXR1cm47XG4gICAgY29uc3QgY2F0ZWdvcnlOYW1lID0gYnRuLmRhdGFzZXQuY2F0ZWdvcnkgfHwgJyc7XG4gICAgY29uc3QgZGlyZWN0aW9uID0gYnRuLmRhdGFzZXQuYWN0aW9uID09PSAnY2F0ZWdvcnktdXAnID8gLTEgOiAxO1xuICAgIGNvbnN0IHVwZGF0ZWRPcmRlciA9IF9tb3ZlU2tpbGxDYXRlZ29yeUxvY2FsbHkoY2F0ZWdvcnlOYW1lLCBkaXJlY3Rpb24pO1xuICAgIGlmICghdXBkYXRlZE9yZGVyKSByZXR1cm47XG4gICAgc2F2ZVNraWxsQ2F0ZWdvcnlPcmRlcih1cGRhdGVkT3JkZXIpXG4gICAgICAudGhlbigoKSA9PiBfcmVuZGVyU2tpbGxzVGFibGUoY29udGFpbmVyLCByZWNvbW1lbmRlZFNldCwgZGF0YSwgaGFyZFNraWxsU2V0LCBzb2Z0U2tpbGxTZXQpKVxuICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgX21vdmVTa2lsbENhdGVnb3J5TG9jYWxseShjYXRlZ29yeU5hbWUsIC1kaXJlY3Rpb24pO1xuICAgICAgICBzaG93VG9hc3QoJ0ZhaWxlZCB0byBzYXZlIHNraWxsIGNhdGVnb3J5IG9yZGVyLicsICdlcnJvcicpO1xuICAgICAgfSk7XG4gIH0pO1xuXG4gIGNvbnN0IHNraWxsVG9vbGJhciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBza2lsbFRvb2xiYXIuY2xhc3NOYW1lID0gJ2J1bGstdG9vbGJhcic7XG4gIHNraWxsVG9vbGJhci5pbm5lckhUTUwgPSBgXG4gICAgPHNwYW4+QnVsazo8L3NwYW4+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImJ1bGstYnRuIGJ1bGstcmVjb21tZW5kZWRcIiBvbmNsaWNrPVwiYnVsa0FjdGlvbigncmVjb21tZW5kZWQnLCdza2lsbCcpXCIgdGl0bGU9XCJTZXQgYWxsIHRvIHRoZSBMTE0gcmVjb21tZW5kYXRpb25cIj5cdTI3MjggQWNjZXB0IEFsbCBSZWNvbW1lbmRlZDwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJidWxrLWJ0biBidWxrLWVtcGhhc2l6ZVwiICAgb25jbGljaz1cImJ1bGtBY3Rpb24oJ2VtcGhhc2l6ZScsJ3NraWxsJylcIj5cdTI3OTUgRW1waGFzaXplIEFsbDwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJidWxrLWJ0biBidWxrLWluY2x1ZGVcIiAgICAgb25jbGljaz1cImJ1bGtBY3Rpb24oJ2luY2x1ZGUnLCdza2lsbCcpXCI+XHUyNzEzIEluY2x1ZGUgQWxsPC9idXR0b24+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImJ1bGstYnRuIGJ1bGstZXhjbHVkZVwiICAgICBvbmNsaWNrPVwiYnVsa0FjdGlvbignZXhjbHVkZScsJ3NraWxsJylcIj4ke2V5ZVNsYXNoSWNvbigpfSBFeGNsdWRlIEFsbDwvYnV0dG9uPlxuICBgO1xuICBjb250YWluZXIuaW5zZXJ0QmVmb3JlKHNraWxsVG9vbGJhciwgY29udGFpbmVyLmZpcnN0Q2hpbGQpO1xuXG4gICQoJyNza2lsbHMtcmV2aWV3LXRhYmxlJykuRGF0YVRhYmxlKHtcbiAgICBwYWdpbmc6IGZhbHNlLFxuICAgIG9yZGVyOiBbXSxcbiAgICBsYW5ndWFnZTogeyBzZWFyY2g6ICdGaWx0ZXIgc2tpbGxzOicgfVxuICB9KTtcbiAgX3VwZGF0ZVBhZ2VFc3RpbWF0ZSgpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgUm93IHJlb3JkZXIgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIG1vdmVTa2lsbFJvdyhza2lsbE5hbWUsIGRpcmVjdGlvbikge1xuICBjb25zdCBhcnIgPSB3aW5kb3cuX3NraWxsc09yZGVyZWQ7XG4gIGlmICghYXJyKSByZXR1cm47XG4gIGNvbnN0IGlkeCA9IGFyci5maW5kSW5kZXgocyA9PiAodHlwZW9mIHMgPT09ICdzdHJpbmcnID8gcyA6IHMubmFtZSB8fCBzKSA9PT0gc2tpbGxOYW1lKTtcbiAgaWYgKGlkeCA8IDApIHJldHVybjtcbiAgY29uc3QgbmV3SWR4ID0gaWR4ICsgZGlyZWN0aW9uO1xuICBpZiAobmV3SWR4IDwgMCB8fCBuZXdJZHggPj0gYXJyLmxlbmd0aCkgcmV0dXJuO1xuICBbYXJyW2lkeF0sIGFycltuZXdJZHhdXSA9IFthcnJbbmV3SWR4XSwgYXJyW2lkeF1dO1xuICB3aW5kb3cuX3NraWxsc09yZGVyZWQgPSBhcnI7XG4gIF9yZW5kZXJTa2lsbHNUYWJsZShudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTtcbiAgZmV0Y2goJy9hcGkvcmVvcmRlci1yb3dzJywge1xuICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgdHlwZTogJ3NraWxsJywgb3JkZXJlZF9pZHM6IGFyci5tYXAocyA9PiAodHlwZW9mIHMgPT09ICdzdHJpbmcnID8gcyA6IHMubmFtZSB8fCBzKSkgfSlcbiAgfSkuY2F0Y2goKCkgPT4ge30pO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgTGVnYWN5IGludGVyYWN0aXZlLW1vZGUgcmVzcG9uc2UgaGFuZGxlciBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gaGFuZGxlU2tpbGxzUmVzcG9uc2UobWVzc2FnZSkge1xuICB3aW5kb3cud2FpdGluZ0ZvclNraWxsc1Jlc3BvbnNlID0gZmFsc2U7XG4gIGNvbnN0IHJlc3BvbnNlID0gbWVzc2FnZS50b0xvd2VyQ2FzZSgpO1xuXG4gIGlmIChyZXNwb25zZS5pbmNsdWRlcygneWVzJykpIHtcbiAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCAnRXhjZWxsZW50ISBJXFwnbGwgdXNlIHRoaXMgc2tpbGxzIHN0cmF0ZWd5IGluIHlvdXIgQ1YuJyk7XG4gIH0gZWxzZSBpZiAocmVzcG9uc2UuaW5jbHVkZXMoJ25vJykgfHwgcmVzcG9uc2UuaW5jbHVkZXMoJ21vZGlmeScpKSB7XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ0kgdW5kZXJzdGFuZC4gV2hhdCBjaGFuZ2VzIHdvdWxkIHlvdSBsaWtlIG1lIHRvIG1ha2UgdG8gdGhlIHNraWxscyBlbXBoYXNpcz8nKTtcbiAgfSBlbHNlIHtcbiAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCAnSVxcJ2xsIG5vdGUgeW91ciBmZWVkYmFjayBvbiB0aGUgc2tpbGxzIHN0cmF0ZWd5LicpO1xuICB9XG5cbiAgZmluaXNoSW50ZXJhY3RpdmVSZXZpZXcoKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFN1Ym1pdCBkZWNpc2lvbnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIHN1Ym1pdFNraWxsRGVjaXNpb25zKCkge1xuICAvKiBkdWNrZmxvdzpcbiAgICogICBpZDogc2tpbGxzX3VpX3N1Ym1pdF9saXZlXG4gICAqICAga2luZDogdWlcbiAgICogICB0aW1lc3RhbXA6ICcyMDI2LTAzLTI1VDIxOjM5OjQ4WidcbiAgICogICBzdGF0dXM6IGxpdmVcbiAgICogICBoYW5kbGVzOlxuICAgKiAgIC0gdWk6c2tpbGxzLXJldmlldy5zdWJtaXRcbiAgICogICBjYWxsczpcbiAgICogICAtIFBPU1QgL2FwaS9yZXZpZXctZGVjaXNpb25zXG4gICAqICAgLSBQT1NUIC9hcGkvY3YvbGF5b3V0LWVzdGltYXRlXG4gICAqICAgcmVhZHM6XG4gICAqICAgLSB3aW5kb3c6dXNlclNlbGVjdGlvbnMuc2tpbGxzXG4gICAqICAgLSB3aW5kb3c6X3NraWxsc09yZGVyZWRcbiAgICogICAtIGRvbTouc2tpbGwtbWF0Y2gtaW5wdXQudmFsdWVcbiAgICogICB3cml0ZXM6XG4gICAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9yZXZpZXctZGVjaXNpb25zLmRlY2lzaW9uc1xuICAgKiAgIC0gcmVxdWVzdDpQT1NUIC9hcGkvcmV2aWV3LWRlY2lzaW9ucy5leHRyYV9za2lsbHNcbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL3Jldmlldy1kZWNpc2lvbnMuZXh0cmFfc2tpbGxfbWF0Y2hlc1xuICAgKiAgIC0gd2luZG93Ol9zYXZlZERlY2lzaW9ucy5za2lsbF9kZWNpc2lvbnNcbiAgICogICAtIHdpbmRvdzpfc2F2ZWREZWNpc2lvbnMuZXh0cmFfc2tpbGxzXG4gICAqICAgLSB3aW5kb3c6X3NhdmVkRGVjaXNpb25zLmV4dHJhX3NraWxsX21hdGNoZXNcbiAgICogICBub3RlczogU3VibWl0cyBza2lsbCBpbmNsdXNpb24gZGVjaXNpb25zIHRvZ2V0aGVyIHdpdGggc2Vzc2lvbi1vbmx5IGV4dHJhIHNraWxscyBhbmQgZXhwZXJpZW5jZS1tYXRjaCBldmlkZW5jZSBzbyBiYWNrZW5kIGdlbmVyYXRpb24gY2FuIG1hdGVyaWFsaXplIHRoZSBzYW1lIG92ZXJsYXkgc3RhdGUuXG4gICAqL1xuICBjb25zdCBkZWNpc2lvbnMgPSB1c2VyU2VsZWN0aW9ucy5za2lsbHM7XG4gIGNvbnN0IGNvdW50ID0gT2JqZWN0LmtleXMoZGVjaXNpb25zKS5sZW5ndGg7XG5cbiAgaWYgKGNvdW50ID09PSAwKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ05vIFNlbGVjdGlvbnMnLCAnUGxlYXNlIHNlbGVjdCBhY3Rpb25zIGZvciBhdCBsZWFzdCBvbmUgc2tpbGwgYmVmb3JlIHN1Ym1pdHRpbmcuJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBleHRyYVNraWxscyA9ICh3aW5kb3cuX3NraWxsc09yZGVyZWQgfHwgW10pXG4gICAgICAuZmlsdGVyKHNraWxsID0+IHNraWxsICYmIHR5cGVvZiBza2lsbCA9PT0gJ29iamVjdCcgJiYgc2tpbGwuX2lzTmV3KVxuICAgICAgLmZpbHRlcihza2lsbCA9PiB7XG4gICAgICAgIGNvbnN0IGFjdGlvbiA9IGRlY2lzaW9uc1tfc2tpbGxOYW1lKHNraWxsKV07XG4gICAgICAgIHJldHVybiBhY3Rpb24gPT09ICdpbmNsdWRlJyB8fCBhY3Rpb24gPT09ICdlbXBoYXNpemUnIHx8IGFjdGlvbiA9PT0gJ2RlLWVtcGhhc2l6ZSc7XG4gICAgICB9KVxuICAgICAgLm1hcChza2lsbCA9PiB7XG4gICAgICAgIGlmIChza2lsbC5faXNVc2VyQ3JlYXRlZCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiBfc2tpbGxOYW1lKHNraWxsKSxcbiAgICAgICAgICAgIGNhdGVnb3J5OiBTdHJpbmcoc2tpbGwuY2F0ZWdvcnkgfHwgJycpLnRyaW0oKSxcbiAgICAgICAgICAgIGdyb3VwOiBTdHJpbmcoc2tpbGwuZ3JvdXAgfHwgJycpLnRyaW0oKSxcbiAgICAgICAgICAgIHByb2ZpY2llbmN5OiBTdHJpbmcoc2tpbGwucHJvZmljaWVuY3kgfHwgJycpLnRyaW0oKSxcbiAgICAgICAgICAgIHN1YnNraWxsczogX25vcm1hbGl6ZVNraWxsU3Vic2tpbGxzKHNraWxsLnN1YnNraWxscyB8fCBza2lsbC5zdWJfc2tpbGxzIHx8IFtdKSxcbiAgICAgICAgICAgIHBhcmVudGhldGljYWw6IFN0cmluZyhza2lsbC5wYXJlbnRoZXRpY2FsIHx8ICcnKS50cmltKCksXG4gICAgICAgICAgICB1c2VyX2NyZWF0ZWQ6IHRydWUsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX3NraWxsTmFtZShza2lsbCk7XG4gICAgICB9KTtcbiAgICBjb25zdCBleHRyYVNraWxsTmFtZXMgPSBleHRyYVNraWxscy5tYXAoc2tpbGwgPT4gdHlwZW9mIHNraWxsID09PSAnc3RyaW5nJyA/IHNraWxsIDogc2tpbGwubmFtZSk7XG5cbiAgICBjb25zdCBtYXRjaElucHV0cyA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnNraWxsLW1hdGNoLWlucHV0JykpO1xuICAgIGNvbnN0IGFsbG93ZWQgPSBuZXcgU2V0KCh3aW5kb3cuX2FsbEV4cGVyaWVuY2VzIHx8IFtdKS5tYXAoZSA9PiBlLmlkKS5maWx0ZXIoQm9vbGVhbikpO1xuICAgIGNvbnN0IGV4dHJhU2tpbGxNYXRjaGVzID0ge307XG4gICAgZm9yIChjb25zdCBpbnB1dCBvZiBtYXRjaElucHV0cykge1xuICAgICAgY29uc3Qgc2tpbGxOYW1lID0gaW5wdXQuZGF0YXNldC5za2lsbDtcbiAgICAgIGlmICghc2tpbGxOYW1lIHx8ICFleHRyYVNraWxsTmFtZXMuaW5jbHVkZXMoc2tpbGxOYW1lKSkgY29udGludWU7XG4gICAgICBjb25zdCBpZHMgPSBTdHJpbmcoaW5wdXQudmFsdWUgfHwgJycpXG4gICAgICAgIC5zcGxpdCgnLCcpXG4gICAgICAgIC5tYXAoKHgpID0+IHgudHJpbSgpKVxuICAgICAgICAuZmlsdGVyKCh4KSA9PiB4ICYmIGFsbG93ZWQuaGFzKHgpKTtcbiAgICAgIGlmIChpZHMubGVuZ3RoID4gMCkgZXh0cmFTa2lsbE1hdGNoZXNbc2tpbGxOYW1lXSA9IGlkcztcbiAgICB9XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3Jldmlldy1kZWNpc2lvbnMnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICB0eXBlOiAnc2tpbGxzJyxcbiAgICAgICAgZGVjaXNpb25zOiBkZWNpc2lvbnMsXG4gICAgICAgIGV4dHJhX3NraWxsczogZXh0cmFTa2lsbHMsXG4gICAgICAgIGV4dHJhX3NraWxsX21hdGNoZXM6IGV4dHJhU2tpbGxNYXRjaGVzLFxuICAgICAgfSlcbiAgICB9KTtcblxuICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgc3RhdGVNYW5hZ2VyLm1hcmtDb250ZW50Q2hhbmdlZCgpO1xuICAgICAgY29uc3QgZXh0cmFOb3RlID0gZXh0cmFTa2lsbHMubGVuZ3RoID4gMFxuICAgICAgICA/IGAgKCR7ZXh0cmFTa2lsbHMubGVuZ3RofSBuZXcgc2tpbGwocykgYWRkZWQgXHUyMDE0IGF2YWlsYWJsZSBmb3Igd3JpdGUtYmFjayB0byBtYXN0ZXIgQ1YgaW4gdGhlIEhhcnZlc3QgdGFiKWBcbiAgICAgICAgOiAnJztcbiAgICAgIHNob3dUb2FzdChgU2tpbGwgZGVjaXNpb25zIHNhdmVkICgke2NvdW50fSBpdGVtcykke2V4dHJhTm90ZX1gKTtcbiAgICAgIHNjaGVkdWxlQXRzUmVmcmVzaCgpO1xuICAgICAgLy8gUGVyc2lzdCBzYXZlZCBkZWNpc2lvbnMgbG9jYWxseSBzbyB0aGUgVUkgcmVmbGVjdHMgdGhlbSBpbW1lZGlhdGVseVxuICAgICAgd2luZG93Ll9zYXZlZERlY2lzaW9ucyA9IHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMgfHwge307XG4gICAgICB3aW5kb3cuX3NhdmVkRGVjaXNpb25zLnNraWxsX2RlY2lzaW9ucyA9IGRlY2lzaW9ucztcbiAgICAgIGlmICghd2luZG93Ll9zYXZlZERlY2lzaW9ucy5leHRyYV9za2lsbHMpIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMuZXh0cmFfc2tpbGxzID0gW107XG4gICAgICBpZiAoZXh0cmFTa2lsbHMubGVuZ3RoID4gMCkgd2luZG93Ll9zYXZlZERlY2lzaW9ucy5leHRyYV9za2lsbHMgPSBleHRyYVNraWxscztcbiAgICAgIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMuZXh0cmFfc2tpbGxfbWF0Y2hlcyA9IGV4dHJhU2tpbGxNYXRjaGVzO1xuICAgICAgdXNlclNlbGVjdGlvbnMuc2tpbGxzID0geyAuLi5kZWNpc2lvbnMgfTtcbiAgICAgIGlmICh0eXBlb2YgdXBkYXRlSW5jbHVzaW9uQ291bnRzID09PSAnZnVuY3Rpb24nKSB1cGRhdGVJbmNsdXNpb25Db3VudHMoKTtcbiAgICAgIHN3aXRjaFRhYignYWNoaWV2ZW1lbnRzLXJldmlldycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBlcnJvciA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIHNob3dUb2FzdChgRXJyb3I6ICR7ZXJyb3IuZXJyb3IgfHwgJ0ZhaWxlZCB0byBzYXZlIGRlY2lzaW9ucyd9YCwgJ2Vycm9yJyk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy5lcnJvcignRXJyb3Igc3VibWl0dGluZyBza2lsbCBkZWNpc2lvbnM6JywgZXJyb3IpO1xuICAgIHNob3dUb2FzdCgnRmFpbGVkIHRvIHNhdmUgZGVjaXNpb25zLiBQbGVhc2UgdHJ5IGFnYWluLicsICdlcnJvcicpO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFeHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5leHBvcnQge1xuICBfcGFyc2VZZWFyRnJvbVN0cixcbiAgX2NvbXB1dGVZZWFyc0Zyb21JZHMsXG4gIHNhdmVTa2lsbEdyb3VwT3ZlcnJpZGUsXG4gIHNhdmVTa2lsbENhdGVnb3J5T3ZlcnJpZGUsXG4gIHJlbmFtZVNraWxsQ2F0ZWdvcnksXG4gIHNhdmVTa2lsbENhdGVnb3J5T3JkZXIsXG4gIHNhdmVTa2lsbFF1YWxpZmllck92ZXJyaWRlLFxuICBzYXZlVXNlckNyZWF0ZWRTa2lsbCxcbiAgYnVpbGRTa2lsbHNSZXZpZXdUYWJsZSxcbiAgX3JlbmRlclNraWxsc1RhYmxlLFxuICBtb3ZlU2tpbGxSb3csXG4gIGhhbmRsZVNraWxsc1Jlc3BvbnNlLFxuICBzdWJtaXRTa2lsbERlY2lzaW9ucyxcbn07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIGFjaGlldmVtZW50cy1yZXZpZXcuanNcbiAqIEVTIG1vZHVsZSBcdTIwMTQgQWNoaWV2ZW1lbnRzIHJldmlldyB0YWJsZSwgYWNoaWV2ZW1lbnRzIGVkaXRvciwgYW5kIEFJIHJld3JpdGUgbW9kYWwuXG4gKlxuICogRGVwZW5kZW5jaWVzIHJlc29sdmVkIHRocm91Z2ggZ2xvYmFsVGhpcyBhdCBydW50aW1lOlxuICogICAtIHBlbmRpbmdSZWNvbW1lbmRhdGlvbnMgICAgICAgICh3aW5kb3cpXG4gKiAgIC0gYWNoaWV2ZW1lbnREZWNpc2lvbnMgICAgICAgICAgKHdpbmRvdyBcdTIwMTQgYWxzbyBpbml0aWFsaXNlZCBoZXJlKVxuICogICAtIF9hY2hpZXZlbWVudHNPcmRlcmVkICAgICAgICAgICh3aW5kb3cgXHUyMDE0IGFsc28gaW5pdGlhbGlzZWQgaGVyZSlcbiAqICAgLSBfc3VnZ2VzdGVkQWNoc09yZGVyZWQgICAgICAgICAod2luZG93KVxuICogICAtIF9zYXZlZERlY2lzaW9ucyAgICAgICAgICAgICAgICh3aW5kb3cpXG4gKiAgIC0gYWNoaWV2ZW1lbnRFZGl0cyAgICAgICAgICAgICAgKHdpbmRvdylcbiAqICAgLSB1c2VyU2VsZWN0aW9ucyAgICAgICAgICAgICAgICAod2luZG93KVxuICogICAtIGdldEFjaGlldmVtZW50UmVjb21tZW5kYXRpb24gIChnbG9iYWxUaGlzIGZ1bmN0aW9uKVxuICogICAtIGdldEFjaGlldmVtZW50Q29uZmlkZW5jZSAgICAgIChnbG9iYWxUaGlzIGZ1bmN0aW9uKVxuICogICAtIGdldEFjaGlldmVtZW50UmVhc29uaW5nICAgICAgIChnbG9iYWxUaGlzIGZ1bmN0aW9uKVxuICogICAtIGVzY2FwZUh0bWwgICAgICAgICAgICAgICAgICAgIChnbG9iYWxUaGlzIGZ1bmN0aW9uKVxuICogICAtIGhhbmRsZUFjaGlldmVtZW50QWN0aW9uICAgICAgIChnbG9iYWxUaGlzIC8gdGhpcyBtb2R1bGUpXG4gKiAgIC0gYnVsa0FjaGlldmVtZW50QWN0aW9uICAgICAgICAgKGdsb2JhbFRoaXMgLyB0aGlzIG1vZHVsZSlcbiAqICAgLSBtb3ZlQWNoaWV2ZW1lbnRSb3cgICAgICAgICAgICAoZ2xvYmFsVGhpcyAvIHRoaXMgbW9kdWxlKVxuICogICAtIG1vdmVTdWdnZXN0ZWRBY2hpZXZlbWVudFJvdyAgIChnbG9iYWxUaGlzIC8gdGhpcyBtb2R1bGUpXG4gKiAgIC0gc2F2ZVRvcExldmVsQWNoaWV2ZW1lbnRGaWVsZCAgKGdsb2JhbFRoaXMgLyB0aGlzIG1vZHVsZSlcbiAqICAgLSBzYXZlU3VnZ2VzdGVkQWNoaWV2ZW1lbnRGaWVsZCAoZ2xvYmFsVGhpcyAvIHRoaXMgbW9kdWxlKVxuICogICAtIGFpUmV3cml0ZVRvcExldmVsQWNoaWV2ZW1lbnQgIChnbG9iYWxUaGlzIC8gdGhpcyBtb2R1bGUpXG4gKiAgIC0gYWlSZXdyaXRlU3VnZ2VzdGVkQWNoaWV2ZW1lbnQgKGdsb2JhbFRoaXMgLyB0aGlzIG1vZHVsZSlcbiAqICAgLSBkZWxldGVUb3BMZXZlbEFjaGlldmVtZW50ICAgICAoZ2xvYmFsVGhpcyAvIHRoaXMgbW9kdWxlKVxuICogICAtIGRlbGV0ZVN1Z2dlc3RlZEFjaGlldmVtZW50ICAgIChnbG9iYWxUaGlzIC8gdGhpcyBtb2R1bGUpXG4gKiAgIC0gc2hvd1RvYXN0ICAgICAgICAgICAgICAgICAgICAgKGdsb2JhbFRoaXMgZnVuY3Rpb24pXG4gKiAgIC0gc2NoZWR1bGVBdHNSZWZyZXNoICAgICAgICAgICAgKGdsb2JhbFRoaXMgZnVuY3Rpb24pXG4gKiAgIC0gdXBkYXRlSW5jbHVzaW9uQ291bnRzICAgICAgICAgKGdsb2JhbFRoaXMgZnVuY3Rpb24pXG4gKiAgIC0gc3dpdGNoVGFiICAgICAgICAgICAgICAgICAgICAgKGdsb2JhbFRoaXMgZnVuY3Rpb24pXG4gKiAgIC0gY29uZmlybURpYWxvZyAgICAgICAgICAgICAgICAgKGdsb2JhbFRoaXMgZnVuY3Rpb24pXG4gKiAgIC0gY2xvc2VBbGVydE1vZGFsICAgICAgICAgICAgICAgKGdsb2JhbFRoaXMgZnVuY3Rpb24pXG4gKiAgIC0gc2V0SW5pdGlhbEZvY3VzICAgICAgICAgICAgICAgKGdsb2JhbFRoaXMgZnVuY3Rpb24pXG4gKiAgIC0gdHJhcEZvY3VzICAgICAgICAgICAgICAgICAgICAgKGdsb2JhbFRoaXMgZnVuY3Rpb24pXG4gKiAgIC0gX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgICAgKGdsb2JhbFRoaXMpXG4gKiAgIC0gQ1NTLmVzY2FwZSAgICAgICAgICAgICAgICAgICAgKGJyb3dzZXIgYnVpbHQtaW4pXG4gKi9cblxuaW1wb3J0IHsgc3RhdGVNYW5hZ2VyIH0gZnJvbSAnLi9zdGF0ZS1tYW5hZ2VyLmpzJztcbmltcG9ydCB7IGV5ZVNsYXNoSWNvbiB9IGZyb20gJy4vcmV2aWV3LWljb25zLmpzJztcblxuLy8gTW9kdWxlLWxldmVsIHN0YXRlXG5sZXQgX3Jld3JpdGVTdWdnZXN0aW9uSGlzdG9yeSA9IFtdO1xubGV0IF9sYXN0UmV3cml0ZUxvZ0lkID0gbnVsbDtcbi8vIENhbGxiYWNrcyBmb3IgdGhlIGFjdGl2ZSByZXdyaXRlIG1vZGFsOiB7IGV4cGVyaWVuY2VJbmRleCwgb25BY2NlcHQgfVxubGV0IF9yZXdyaXRlQ2FsbGJhY2tzID0gbnVsbDtcbi8vIFRyYWNrcyBhY2hpZXZlbWVudHMgdGhhdCBhcmUgbmV3bHkgcmVjb21tZW5kZWQgc2luY2UgdGhlIHByZXZpb3VzIHJlbmRlciAoZm9yIFx1RDgzQ1x1REQ5NSBiYWRnZXMpXG5sZXQgX25ld1JlY29tbWVuZGVkQWNocyA9IG5ldyBTZXQoKTtcblxuZnVuY3Rpb24gX25vcm1hbGl6ZUFjaGlldmVtZW50RWRpdEVudHJ5KGVudHJ5KSB7XG4gIGlmIChlbnRyeSAmJiB0eXBlb2YgZW50cnkgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGVudHJ5KSkge1xuICAgIHJldHVybiB7XG4gICAgICB0ZXh0OiBTdHJpbmcoZW50cnkudGV4dCA/PyBlbnRyeS5kZXNjcmlwdGlvbiA/PyBlbnRyeS5jb250ZW50ID8/ICcnKSxcbiAgICAgIGhpZGRlbjogQm9vbGVhbihlbnRyeS5oaWRkZW4pLFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB0ZXh0OiBTdHJpbmcoZW50cnkgPz8gJycpLFxuICAgIGhpZGRlbjogZmFsc2UsXG4gIH07XG59XG5cbmZ1bmN0aW9uIF9ub3JtYWxpemVBY2hpZXZlbWVudEVkaXRMaXN0KGVudHJpZXMpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGVudHJpZXMpKSByZXR1cm4gW107XG4gIHJldHVybiBlbnRyaWVzLm1hcChfbm9ybWFsaXplQWNoaWV2ZW1lbnRFZGl0RW50cnkpO1xufVxuXG5mdW5jdGlvbiBfYWNoaWV2ZW1lbnRFbnRyeVRleHQoZW50cnkpIHtcbiAgcmV0dXJuIF9ub3JtYWxpemVBY2hpZXZlbWVudEVkaXRFbnRyeShlbnRyeSkudGV4dDtcbn1cblxuZnVuY3Rpb24gX2FjaGlldmVtZW50RW50cnlIaWRkZW4oZW50cnkpIHtcbiAgcmV0dXJuIF9ub3JtYWxpemVBY2hpZXZlbWVudEVkaXRFbnRyeShlbnRyeSkuaGlkZGVuO1xufVxuXG53aW5kb3cuYWNoaWV2ZW1lbnREZWNpc2lvbnMgPSB7fTtcbndpbmRvdy5fYWNoaWV2ZW1lbnRzT3JkZXJlZCA9IG51bGw7XG5cbi8vIFNtYWxsIGZldGNoIGhlbHBlciB3aXRoIHRpbWVvdXQgdG8gYXZvaWQgbGVhdmluZyBsb2FkZXJzIHZpc2libGUgb24gaGFuZ2luZyByZXF1ZXN0c1xuYXN5bmMgZnVuY3Rpb24gZmV0Y2hKc29uV2l0aFRpbWVvdXQodXJsLCBvcHRzID0ge30sIHRpbWVvdXQgPSA3MDAwKSB7XG4gIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIGNvbnN0IHNpZ25hbCA9IGNvbnRyb2xsZXIuc2lnbmFsO1xuICBjb25zdCBpZCA9IHNldFRpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydCgpLCB0aW1lb3V0KTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwsIE9iamVjdC5hc3NpZ24oe30sIG9wdHMsIHsgc2lnbmFsIH0pKTtcbiAgICBjbGVhclRpbWVvdXQoaWQpO1xuICAgIHJldHVybiByZXM7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNsZWFyVGltZW91dChpZCk7XG4gICAgdGhyb3cgZXJyO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9hY2hTbmFwc2hvdEtleSgpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzaWQgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpLmdldCgnc2Vzc2lvbicpO1xuICAgIHJldHVybiBzaWQgPyBgYWNoX3NuYXBfJHtzaWR9YCA6IG51bGw7XG4gIH0gY2F0Y2ggKF8pIHsgcmV0dXJuIG51bGw7IH1cbn1cbmZ1bmN0aW9uIF9zYXZlQWNoU25hcHNob3QocmVjb21tZW5kZWRJZHMpIHtcbiAgY29uc3Qga2V5ID0gX2FjaFNuYXBzaG90S2V5KCk7XG4gIGlmICgha2V5KSByZXR1cm47XG4gIHRyeSB7IGxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgSlNPTi5zdHJpbmdpZnkoWy4uLnJlY29tbWVuZGVkSWRzXSkpOyB9IGNhdGNoIChfKSB7fVxufVxuZnVuY3Rpb24gX2dldEFjaFNuYXBzaG90KCkge1xuICBjb25zdCBrZXkgPSBfYWNoU25hcHNob3RLZXkoKTtcbiAgaWYgKCFrZXkpIHJldHVybiBudWxsO1xuICB0cnkge1xuICAgIGNvbnN0IHJhdyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7XG4gICAgcmV0dXJuIHJhdyA/IG5ldyBTZXQoSlNPTi5wYXJzZShyYXcpKSA6IG51bGw7XG4gIH0gY2F0Y2ggKF8pIHsgcmV0dXJuIG51bGw7IH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gYnVpbGRBY2hpZXZlbWVudHNSZXZpZXdUYWJsZSgpIHtcbiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaGlldmVtZW50cy10YWJsZS1jb250YWluZXInKTtcbiAgaWYgKCFjb250YWluZXIpIHJldHVybjtcblxuICBjb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDoxMnB4O3BhZGRpbmc6MjBweDtjb2xvcjojNmI3MjgwO1wiPjxkaXYgY2xhc3M9XCJsb2FkaW5nLXNwaW5uZXJcIiBzdHlsZT1cIndpZHRoOjIwcHg7aGVpZ2h0OjIwcHg7Ym9yZGVyLXdpZHRoOjJweDtmbGV4LXNocmluazowO1wiPjwvZGl2PjxzcGFuPkxvYWRpbmcgYWNoaWV2ZW1lbnRzXHUyMDI2PC9zcGFuPjwvZGl2Pic7XG5cbiAgLy8gUHJlZmVyIHNlc3Npb24tYXdhcmUgc3RhdHVzIGRhdGEgc28gcmV2aWV3LXRpbWUgb3ZlcmxheXMgYXJlIHJlZmxlY3RlZC5cbiAgbGV0IGFsbEFjaGlldmVtZW50cyA9IFtdO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoSnNvbldpdGhUaW1lb3V0KCcvYXBpL3N0YXR1cycsIHt9LCA3MDAwKTtcbiAgICBpZiAoIXJlcy5vaykgdGhyb3cgbmV3IEVycm9yKCdzdGF0dXMgbm90IG9rJyk7XG4gICAgY29uc3Qgc3RhdHVzRGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgYWxsQWNoaWV2ZW1lbnRzID0gc3RhdHVzRGF0YS5hbGxfYWNoaWV2ZW1lbnRzIHx8IFtdO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBTZWNvbmRhcnkgZmFsbGJhY2s6IHJhdyBtYXN0ZXIgZmllbGRzLlxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMyID0gYXdhaXQgZmV0Y2hKc29uV2l0aFRpbWVvdXQoJy9hcGkvbWFzdGVyLWZpZWxkcycsIHt9LCA3MDAwKTtcbiAgICAgIGlmICghcmVzMi5vaykgdGhyb3cgbmV3IEVycm9yKCdtYXN0ZXItZmllbGRzIG5vdCBvaycpO1xuICAgICAgY29uc3QgbWFzdGVyRGF0YSA9IGF3YWl0IHJlczIuanNvbigpO1xuICAgICAgYWxsQWNoaWV2ZW1lbnRzID0gbWFzdGVyRGF0YS5zZWxlY3RlZF9hY2hpZXZlbWVudHMgfHwgW107XG4gICAgfSBjYXRjaCAoZXJyMikge1xuICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICc8cCBzdHlsZT1cImNvbG9yOiNlZjQ0NDQ7cGFkZGluZzoyMHB4O1wiPkZhaWxlZCB0byBsb2FkIGFjaGlldmVtZW50cy48L3A+JztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBpZiAoYWxsQWNoaWV2ZW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnPHAgc3R5bGU9XCJwYWRkaW5nOjIwcHg7Y29sb3I6IzZiNzI4MDtcIj5ObyBrZXkgYWNoaWV2ZW1lbnRzIGZvdW5kIGluIG1hc3RlciBDViBkYXRhLjwvcD4nO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFdyYXAgaW5pdGlhbGlzYXRpb24gKyByZW5kZXIgc28gYW4gdW5leHBlY3RlZCBleGNlcHRpb24gcmVwbGFjZXMgdGhlXG4gIC8vIHNwaW5uZXIgaW5zdGVhZCBvZiBsZWF2aW5nIGl0IGZyb3plbiBpbmRlZmluaXRlbHkuXG4gIHRyeSB7XG4gICAgY29uc3QgZGF0YSA9IHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zIHx8IHt9O1xuICAgIGNvbnN0IHJlY29tbWVuZGVkU2V0ID0gbmV3IFNldChkYXRhLnJlY29tbWVuZGVkX2FjaGlldmVtZW50cyB8fCBbXSk7XG5cbiAgICAvLyBTb3J0OiByZWNvbW1lbmRlZCBmaXJzdCwgdGhlbiBieSBpbXBvcnRhbmNlIGRlc2NlbmRpbmcgKG9ubHkgb24gZmlyc3QgbG9hZClcbiAgICBpZiAoIXdpbmRvdy5fYWNoaWV2ZW1lbnRzT3JkZXJlZCkge1xuICAgICAgYWxsQWNoaWV2ZW1lbnRzID0gWy4uLmFsbEFjaGlldmVtZW50c10uc29ydCgoYSwgYikgPT4ge1xuICAgICAgICBjb25zdCBhUmVjID0gcmVjb21tZW5kZWRTZXQuaGFzKGEuaWQpID8gMSA6IDA7XG4gICAgICAgIGNvbnN0IGJSZWMgPSByZWNvbW1lbmRlZFNldC5oYXMoYi5pZCkgPyAxIDogMDtcbiAgICAgICAgaWYgKGJSZWMgIT09IGFSZWMpIHJldHVybiBiUmVjIC0gYVJlYztcbiAgICAgICAgcmV0dXJuIChiLmltcG9ydGFuY2UgfHwgMCkgLSAoYS5pbXBvcnRhbmNlIHx8IDApO1xuICAgICAgfSk7XG4gICAgICB3aW5kb3cuX2FjaGlldmVtZW50c09yZGVyZWQgPSBhbGxBY2hpZXZlbWVudHM7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGlzZSBkZWNpc2lvbnNcbiAgICB3aW5kb3cuYWNoaWV2ZW1lbnREZWNpc2lvbnMgPSB7fTtcbiAgICB3aW5kb3cuX2FjaGlldmVtZW50c09yZGVyZWQuZm9yRWFjaChhY2ggPT4ge1xuICAgICAgY29uc3QgcmVjID0gZ2V0QWNoaWV2ZW1lbnRSZWNvbW1lbmRhdGlvbihhY2guaWQsIGRhdGEpO1xuICAgICAgbGV0IGRlZmF1bHRBY3Rpb24gPSAnaW5jbHVkZSc7XG4gICAgICBpZiAocmVjID09PSAnRW1waGFzaXplJykgICAgICAgICBkZWZhdWx0QWN0aW9uID0gJ2VtcGhhc2l6ZSc7XG4gICAgICBlbHNlIGlmIChyZWMgPT09ICdJbmNsdWRlJykgICAgICBkZWZhdWx0QWN0aW9uID0gJ2luY2x1ZGUnO1xuICAgICAgZWxzZSBpZiAocmVjID09PSAnRGUtZW1waGFzaXplJykgZGVmYXVsdEFjdGlvbiA9ICdkZS1lbXBoYXNpemUnO1xuICAgICAgZWxzZSBpZiAocmVjID09PSAnT21pdCcpICAgICAgICAgZGVmYXVsdEFjdGlvbiA9ICdleGNsdWRlJztcbiAgICAgIHdpbmRvdy5hY2hpZXZlbWVudERlY2lzaW9uc1thY2guaWRdID0gZGVmYXVsdEFjdGlvbjtcbiAgICB9KTtcbiAgICAvLyBBcHBseSBhbnkgcHJldmlvdXNseSBzYXZlZCB1c2VyIGRlY2lzaW9ucyBvdmVyIHRoZSBMTE0gZGVmYXVsdHNcbiAgICBjb25zdCBzYXZlZEFjaERlY3MgPSB3aW5kb3cuX3NhdmVkRGVjaXNpb25zPy5hY2hpZXZlbWVudF9kZWNpc2lvbnMgfHwge307XG4gICAgaWYgKE9iamVjdC5rZXlzKHNhdmVkQWNoRGVjcykubGVuZ3RoID4gMCkgT2JqZWN0LmFzc2lnbih3aW5kb3cuYWNoaWV2ZW1lbnREZWNpc2lvbnMsIHNhdmVkQWNoRGVjcyk7XG5cbiAgICAvLyBBbHNvIGhhbmRsZSBBSS1zdWdnZXN0ZWQgYWNoaWV2ZW1lbnRzIFx1MjAxNCBhc3NpZ24gc3RhYmxlIElEcyBvbmNlIG9uIGZpcnN0IGxvYWRcbiAgICAvLyBzbyB0aGF0IHJlb3JkZXIgLyBkZWxldGUgb3BlcmF0aW9ucyBuZXZlciBuZWVkIHRvIHJlbWFwIGRlY2lzaW9uIGtleXMuXG4gICAgaWYgKCF3aW5kb3cuX3N1Z2dlc3RlZEFjaHNPcmRlcmVkKSB7XG4gICAgICBsZXQgY291bnRlciA9IDA7XG4gICAgICB3aW5kb3cuX3N1Z2dlc3RlZEFjaHNPcmRlcmVkID0gKGRhdGEuc3VnZ2VzdGVkX2FjaGlldmVtZW50cyB8fCBbXSkubWFwKHMgPT4ge1xuICAgICAgICBjb25zdCBpdGVtID0gT2JqZWN0LmFzc2lnbih7fSwgcyk7XG4gICAgICAgIGl0ZW0uX3N1Z2dJZCA9IGBzdWdnOjoke2NvdW50ZXIrK31gO1xuICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB3aW5kb3cuX3N1Z2dlc3RlZEFjaHNPcmRlcmVkLmZvckVhY2gocyA9PiB7XG4gICAgICBpZiAoIShzLl9zdWdnSWQgaW4gd2luZG93LmFjaGlldmVtZW50RGVjaXNpb25zKSkgd2luZG93LmFjaGlldmVtZW50RGVjaXNpb25zW3MuX3N1Z2dJZF0gPSAnaW5jbHVkZSc7XG4gICAgfSk7XG5cbiAgICBjb25zdCBwcmV2QWNoU25hcCA9IF9nZXRBY2hTbmFwc2hvdCgpO1xuICAgIF9uZXdSZWNvbW1lbmRlZEFjaHMgPSBwcmV2QWNoU25hcFxuICAgICAgPyBuZXcgU2V0KFsuLi5yZWNvbW1lbmRlZFNldF0uZmlsdGVyKGlkID0+ICFwcmV2QWNoU25hcC5oYXMoaWQpKSlcbiAgICAgIDogbmV3IFNldCgpO1xuICAgIF9zYXZlQWNoU25hcHNob3QocmVjb21tZW5kZWRTZXQpO1xuXG4gICAgX3JlbmRlckFjaGlldmVtZW50c1Jldmlld1RhYmxlKGNvbnRhaW5lcik7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlICovXG4gICAgY29uc29sZS5lcnJvcignYnVpbGRBY2hpZXZlbWVudHNSZXZpZXdUYWJsZTogcmVuZGVyIGVycm9yOicsIGVycik7XG4gICAgY29udGFpbmVyLmlubmVySFRNTCA9ICc8cCBzdHlsZT1cImNvbG9yOiNlZjQ0NDQ7cGFkZGluZzoyMHB4O1wiPkVycm9yIHJlbmRlcmluZyBhY2hpZXZlbWVudHMgdGFibGUuIFBsZWFzZSByZWxvYWQgYW5kIHRyeSBhZ2Fpbi48L3A+JztcbiAgfVxufVxuXG5mdW5jdGlvbiBfcmVuZGVyQWNoaWV2ZW1lbnRzUmV2aWV3VGFibGUoY29udGFpbmVyKSB7XG4gIGlmICghY29udGFpbmVyKSBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoaWV2ZW1lbnRzLXRhYmxlLWNvbnRhaW5lcicpO1xuICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuO1xuXG4gIGNvbnN0IGRhdGEgPSB3aW5kb3cucGVuZGluZ1JlY29tbWVuZGF0aW9ucyB8fCB7fTtcbiAgY29uc3Qgb3JkZXJlZEFjaHMgID0gd2luZG93Ll9hY2hpZXZlbWVudHNPcmRlcmVkIHx8IFtdO1xuICBjb25zdCBzdWdnZXN0ZWRBY2hzID0gd2luZG93Ll9zdWdnZXN0ZWRBY2hzT3JkZXJlZCB8fCBbXTtcblxuICAvLyBCdWlsZCBmaWx0ZXIgKyB0YWJsZSBIVE1MXG4gIGxldCBodG1sID0gYFxuICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjEycHg7YWxpZ24taXRlbXM6Y2VudGVyO21hcmdpbi1ib3R0b206MTJweDtcIj5cbiAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiYWNoLXJldmlldy1maWx0ZXJcIlxuICAgICAgICBwbGFjZWhvbGRlcj1cIkZpbHRlciBhY2hpZXZlbWVudHNcdTIwMjZcIlxuICAgICAgICBvbmlucHV0PVwiX2ZpbHRlckFjaGlldmVtZW50c1RhYmxlKHRoaXMudmFsdWUpXCJcbiAgICAgICAgc3R5bGU9XCJmbGV4OjE7cGFkZGluZzo2cHggMTBweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo2cHg7Zm9udC1zaXplOjAuOWVtO1wiPlxuICAgICAgPHNwYW4gaWQ9XCJhY2gtcmV2aWV3LWNvdW50XCIgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2NvbG9yOiM2YjcyODA7d2hpdGUtc3BhY2U6bm93cmFwO1wiPiR7b3JkZXJlZEFjaHMubGVuZ3RoICsgc3VnZ2VzdGVkQWNocy5sZW5ndGh9IGFjaGlldmVtZW50czwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8dGFibGUgaWQ9XCJhY2hpZXZlbWVudHMtcmV2aWV3LXRhYmxlXCIgY2xhc3M9XCJyZXZpZXctdGFibGVcIiBzdHlsZT1cIndpZHRoOjEwMCU7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlO1wiPlxuICAgICAgPHRoZWFkPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRoPkFjaGlldmVtZW50PC90aD5cbiAgICAgICAgICA8dGg+UmVjb21tZW5kYXRpb248L3RoPlxuICAgICAgICAgIDx0aD5Db25maWRlbmNlPC90aD5cbiAgICAgICAgICA8dGg+UmVhc29uaW5nPC90aD5cbiAgICAgICAgICA8dGg+U2VsZWN0aW9uPC90aD5cbiAgICAgICAgPC90cj5cbiAgICAgIDwvdGhlYWQ+XG4gICAgICA8dGJvZHk+XG4gIGA7XG5cbiAgb3JkZXJlZEFjaHMuZm9yRWFjaCgoYWNoLCByb3dJZHgpID0+IHtcbiAgICBjb25zdCBpZCAgICAgICAgICAgICA9IGFjaC5pZCB8fCBhY2gudGl0bGUgfHwgJyc7XG4gICAgY29uc3QgdGl0bGUgICAgICAgICAgPSBhY2gudGl0bGUgfHwgaWQ7XG4gICAgY29uc3QgZGVzYyAgICAgICAgICAgPSBhY2guZGVzY3JpcHRpb24gfHwgJyc7XG4gICAgY29uc3QgcmVjb21tZW5kYXRpb24gPSBnZXRBY2hpZXZlbWVudFJlY29tbWVuZGF0aW9uKGlkLCBkYXRhKTtcbiAgICBjb25zdCBjb25maWRlbmNlICAgICA9IGdldEFjaGlldmVtZW50Q29uZmlkZW5jZShpZCwgZGF0YSwgYWNoLmltcG9ydGFuY2UpO1xuICAgIGNvbnN0IHJlYXNvbmluZyAgICAgID0gZ2V0QWNoaWV2ZW1lbnRSZWFzb25pbmcoaWQsIGRhdGEsIGFjaCk7XG4gICAgY29uc3QgZGVmYXVsdEFjdGlvbiAgPSB3aW5kb3cuYWNoaWV2ZW1lbnREZWNpc2lvbnNbaWRdIHx8ICdpbmNsdWRlJztcbiAgICBjb25zdCBjb25maWRlbmNlQmFkZ2UgPSBgPHNwYW4gY2xhc3M9XCJjb25maWRlbmNlLWJhZGdlIGNvbmZpZGVuY2UtJHtjb25maWRlbmNlLmxldmVsfVwiPiR7Y29uZmlkZW5jZS50ZXh0fTwvc3Bhbj5gO1xuICAgIGNvbnN0IHJlcnVuTmV3QmFkZ2UgPSBfbmV3UmVjb21tZW5kZWRBY2hzLmhhcyhpZClcbiAgICAgID8gJzxzcGFuIGNsYXNzPVwicnctY2hhbmdlLWJhZGdlIHJ3LWNoYW5nZS1uZXdcIiBhcmlhLWxhYmVsPVwiTmV3IHJlY29tbWVuZGF0aW9uIHNpbmNlIHByZXZpb3VzIHJ1blwiPlx1RDgzQ1x1REQ5NSBOZXc8L3NwYW4+J1xuICAgICAgOiAnJztcbiAgICBjb25zdCBpc0ZpcnN0ID0gcm93SWR4ID09PSAwO1xuICAgIGNvbnN0IGlzTGFzdCAgPSByb3dJZHggPT09IG9yZGVyZWRBY2hzLmxlbmd0aCAtIDE7XG5cbiAgICBodG1sICs9IGBcbiAgICAgIDx0ciBkYXRhLWFjaC1pZD1cIiR7ZXNjYXBlSHRtbChpZCl9XCI+XG4gICAgICAgIDx0ZCBzdHlsZT1cIm1pbi13aWR0aDoyMjBweDtcIj5cbiAgICAgICAgICA8aW5wdXQgaWQ9XCJhY2gtdGl0bGUtJHtlc2NhcGVIdG1sKGlkKX1cIlxuICAgICAgICAgICAgdHlwZT1cInRleHRcIiB2YWx1ZT1cIiR7ZXNjYXBlSHRtbCh0aXRsZSl9XCJcbiAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTtmb250LXdlaWdodDo2MDA7cGFkZGluZzozcHggNnB4O2JvcmRlcjoxcHggc29saWQgI2QxZDVkYjtib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6MC45ZW07Ym94LXNpemluZzpib3JkZXItYm94O1wiXG4gICAgICAgICAgICBvbmJsdXI9XCJzYXZlVG9wTGV2ZWxBY2hpZXZlbWVudEZpZWxkKCcke2VzY2FwZUh0bWwoaWQpfScsICd0aXRsZScsIHRoaXMudmFsdWUpXCJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJBY2hpZXZlbWVudCB0aXRsZVwiPiR7cmVydW5OZXdCYWRnZX1cbiAgICAgICAgICA8dGV4dGFyZWEgaWQ9XCJhY2gtZGVzYy0ke2VzY2FwZUh0bWwoaWQpfVwiXG4gICAgICAgICAgICByb3dzPVwiMlwiXG4gICAgICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7bWFyZ2luLXRvcDo0cHg7cGFkZGluZzozcHggNnB4O2JvcmRlcjoxcHggc29saWQgI2QxZDVkYjtib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6MC44NWVtO3Jlc2l6ZTp2ZXJ0aWNhbDtib3gtc2l6aW5nOmJvcmRlci1ib3g7XCJcbiAgICAgICAgICAgIG9uYmx1cj1cInNhdmVUb3BMZXZlbEFjaGlldmVtZW50RmllbGQoJyR7ZXNjYXBlSHRtbChpZCl9JywgJ2Rlc2NyaXB0aW9uJywgdGhpcy52YWx1ZSlcIlxuICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkFjaGlldmVtZW50IGRlc2NyaXB0aW9uXCJcbiAgICAgICAgICA+JHtlc2NhcGVIdG1sKGRlc2MpfTwvdGV4dGFyZWE+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZD48c3Ryb25nPiR7ZXNjYXBlSHRtbChyZWNvbW1lbmRhdGlvbil9PC9zdHJvbmc+PC90ZD5cbiAgICAgICAgPHRkPiR7Y29uZmlkZW5jZUJhZGdlfTwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cIm1heC13aWR0aDoyMDBweDtcIj48c21hbGw+JHtlc2NhcGVIdG1sKHJlYXNvbmluZyl9PC9zbWFsbD48L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJhY3Rpb24tYnRuc1wiIHN0eWxlPVwid2hpdGUtc3BhY2U6bm93cmFwO1wiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0biAke2RlZmF1bHRBY3Rpb24gPT09ICdlbXBoYXNpemUnICAgID8gJ2FjdGl2ZScgOiAnJ31cIiBkYXRhLWFjdGlvbj1cImVtcGhhc2l6ZVwiICAgIGFyaWEtbGFiZWw9XCJFbXBoYXNpemUgJHtlc2NhcGVIdG1sKHRpdGxlKX1cIiAgICB0aXRsZT1cIkVtcGhhc2l6ZSBcdTIwMTQgZmVhdHVyZSBwcm9taW5lbnRseVwiICBzdHlsZT1cImNvbG9yOiMxMGI5ODE7XCI+XHUyNzk1PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuICR7ZGVmYXVsdEFjdGlvbiA9PT0gJ2luY2x1ZGUnICAgICAgPyAnYWN0aXZlJyA6ICcnfVwiIGRhdGEtYWN0aW9uPVwiaW5jbHVkZVwiICAgICAgYXJpYS1sYWJlbD1cIkluY2x1ZGUgJHtlc2NhcGVIdG1sKHRpdGxlKX1cIiAgICAgIHRpdGxlPVwiSW5jbHVkZSBcdTIwMTQgc3RhbmRhcmQgdHJlYXRtZW50XCI+XHUyNzEzPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuICR7ZGVmYXVsdEFjdGlvbiA9PT0gJ2RlLWVtcGhhc2l6ZScgPyAnYWN0aXZlJyA6ICcnfVwiIGRhdGEtYWN0aW9uPVwiZGUtZW1waGFzaXplXCIgYXJpYS1sYWJlbD1cIkRlLWVtcGhhc2l6ZSAke2VzY2FwZUh0bWwodGl0bGUpfVwiIHRpdGxlPVwiRGUtZW1waGFzaXplIFx1MjAxNCBicmllZiBtZW50aW9uIG9ubHlcIiAgc3R5bGU9XCJjb2xvcjojZjU5ZTBiO1wiPlx1Mjc5NjwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0biAke2RlZmF1bHRBY3Rpb24gPT09ICdleGNsdWRlJyAgICAgID8gJ2FjdGl2ZScgOiAnJ31cIiBkYXRhLWFjdGlvbj1cImV4Y2x1ZGVcIiAgICAgIGFyaWEtbGFiZWw9XCJFeGNsdWRlICR7ZXNjYXBlSHRtbCh0aXRsZSl9XCIgICAgICB0aXRsZT1cIkV4Y2x1ZGUgXHUyMDE0IG9taXQgZnJvbSBDVlwiICAgICAgICAgICAgc3R5bGU9XCJjb2xvcjojZWY0NDQ0O1wiPiR7ZXllU2xhc2hJY29uKCl9PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgYXJpYS1sYWJlbD1cIkFJIHJld3JpdGUgJHtlc2NhcGVIdG1sKHRpdGxlKX1cIiB0aXRsZT1cIkFJIHJld3JpdGUgZGVzY3JpcHRpb25cIiBvbmNsaWNrPVwiYWlSZXdyaXRlVG9wTGV2ZWxBY2hpZXZlbWVudCgnJHtlc2NhcGVIdG1sKGlkKX0nKVwiPlx1MjcyODwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIGFyaWEtbGFiZWw9XCJNb3ZlICR7ZXNjYXBlSHRtbCh0aXRsZSl9IGVhcmxpZXJcIiB0aXRsZT1cIk1vdmUgdXBcIiAgICR7aXNGaXJzdCA/ICdkaXNhYmxlZCcgOiAnJ30gb25jbGljaz1cIm1vdmVBY2hpZXZlbWVudFJvdygnJHtlc2NhcGVIdG1sKGlkKX0nLC0xKVwiPlx1MjE5MTwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIGFyaWEtbGFiZWw9XCJNb3ZlICR7ZXNjYXBlSHRtbCh0aXRsZSl9IGxhdGVyXCIgICB0aXRsZT1cIk1vdmUgZG93blwiICR7aXNMYXN0ICA/ICdkaXNhYmxlZCcgOiAnJ30gb25jbGljaz1cIm1vdmVBY2hpZXZlbWVudFJvdygnJHtlc2NhcGVIdG1sKGlkKX0nLCsxKVwiPlx1MjE5MzwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIGFyaWEtbGFiZWw9XCJEZWxldGUgJHtlc2NhcGVIdG1sKHRpdGxlKX1cIiB0aXRsZT1cIkRlbGV0ZSBhY2hpZXZlbWVudFwiIG9uY2xpY2s9XCJkZWxldGVUb3BMZXZlbEFjaGlldmVtZW50KCcke2VzY2FwZUh0bWwoaWQpfScpXCIgc3R5bGU9XCJjb2xvcjojZWY0NDQ0O1wiPlx1RDgzRFx1REREMTwvYnV0dG9uPlxuICAgICAgICA8L3RkPlxuICAgICAgPC90cj5cbiAgICBgO1xuICB9KTtcblxuICAvLyBBSS1zdWdnZXN0ZWQgYWNoaWV2ZW1lbnRzIFx1MjAxNCBmdWxsIGVkaXRpbmcvY29udHJvbCBwYXJpdHkgd2l0aCB1c2VyIGFjaGlldmVtZW50c1xuICBzdWdnZXN0ZWRBY2hzLmZvckVhY2goKHN1Z2csIHJvd0lkeCkgPT4ge1xuICAgIGNvbnN0IHN1Z2dJZCAgICAgID0gc3VnZy5fc3VnZ0lkO1xuICAgIGNvbnN0IGNvbmZSYXcgICAgID0gKHN1Z2cuY29uZmlkZW5jZSB8fCAnTWVkaXVtJykudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBjb25mTGV2ZWwgICA9IGNvbmZSYXcuaW5jbHVkZXMoJ2hpZ2gnKSA/ICdoaWdoJyA6IGNvbmZSYXcuaW5jbHVkZXMoJ2xvdycpID8gJ2xvdycgOiAnbWVkaXVtJztcbiAgICBjb25zdCBjb25mVGV4dCAgICA9IHN1Z2cuY29uZmlkZW5jZSB8fCAnTWVkaXVtJztcbiAgICBjb25zdCBkZWZhdWx0QWN0aW9uID0gd2luZG93LmFjaGlldmVtZW50RGVjaXNpb25zW3N1Z2dJZF0gfHwgJ2luY2x1ZGUnO1xuICAgIGNvbnN0IGlzRmlyc3QgICAgID0gcm93SWR4ID09PSAwO1xuICAgIGNvbnN0IGlzTGFzdCAgICAgID0gcm93SWR4ID09PSBzdWdnZXN0ZWRBY2hzLmxlbmd0aCAtIDE7XG5cbiAgICBodG1sICs9IGBcbiAgICAgIDx0ciBkYXRhLWFjaC1pZD1cIiR7ZXNjYXBlSHRtbChzdWdnSWQpfVwiIHN0eWxlPVwiYmFja2dyb3VuZDojZmVmY2U4O1wiPlxuICAgICAgICA8dGQgc3R5bGU9XCJtaW4td2lkdGg6MjIwcHg7XCI+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJkaXNwbGF5OmlubGluZS1ibG9jaztiYWNrZ3JvdW5kOiNmNTllMGI7Y29sb3I6I2ZmZjtmb250LXNpemU6MC43ZW07Zm9udC13ZWlnaHQ6NzAwO3BhZGRpbmc6MXB4IDZweDtib3JkZXItcmFkaXVzOjEwcHg7bWFyZ2luLWJvdHRvbTo0cHg7dmVydGljYWwtYWxpZ246bWlkZGxlO1wiPlx1MkI1MCBBSSBTdWdnZXN0ZWQ8L3NwYW4+XG4gICAgICAgICAgPGlucHV0IGlkPVwiYWNoLXRpdGxlLSR7ZXNjYXBlSHRtbChzdWdnSWQpfVwiXG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiIHZhbHVlPVwiJHtlc2NhcGVIdG1sKHN1Z2cudGl0bGUgfHwgJycpfVwiXG4gICAgICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Zm9udC13ZWlnaHQ6NjAwO3BhZGRpbmc6M3B4IDZweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo0cHg7Zm9udC1zaXplOjAuOWVtO2JveC1zaXppbmc6Ym9yZGVyLWJveDtcIlxuICAgICAgICAgICAgb25ibHVyPVwic2F2ZVN1Z2dlc3RlZEFjaGlldmVtZW50RmllbGQoJyR7ZXNjYXBlSHRtbChzdWdnSWQpfScsICd0aXRsZScsIHRoaXMudmFsdWUpXCJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJBY2hpZXZlbWVudCB0aXRsZVwiPlxuICAgICAgICAgIDx0ZXh0YXJlYSBpZD1cImFjaC1kZXNjLSR7ZXNjYXBlSHRtbChzdWdnSWQpfVwiXG4gICAgICAgICAgICByb3dzPVwiMlwiXG4gICAgICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7bWFyZ2luLXRvcDo0cHg7cGFkZGluZzozcHggNnB4O2JvcmRlcjoxcHggc29saWQgI2QxZDVkYjtib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6MC44NWVtO3Jlc2l6ZTp2ZXJ0aWNhbDtib3gtc2l6aW5nOmJvcmRlci1ib3g7XCJcbiAgICAgICAgICAgIG9uYmx1cj1cInNhdmVTdWdnZXN0ZWRBY2hpZXZlbWVudEZpZWxkKCcke2VzY2FwZUh0bWwoc3VnZ0lkKX0nLCAnZGVzY3JpcHRpb24nLCB0aGlzLnZhbHVlKVwiXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiQWNoaWV2ZW1lbnQgZGVzY3JpcHRpb25cIlxuICAgICAgICAgID4ke2VzY2FwZUh0bWwoc3VnZy5kZXNjcmlwdGlvbiB8fCAnJyl9PC90ZXh0YXJlYT5cbiAgICAgICAgICAke3N1Z2cuZXhwZXJpZW5jZV9pZCA/IGA8c21hbGwgc3R5bGU9XCJjb2xvcjojOWNhM2FmO1wiPkV4cGVyaWVuY2U6ICR7ZXNjYXBlSHRtbChzdWdnLmV4cGVyaWVuY2VfaWQpfTwvc21hbGw+YCA6ICcnfVxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQ+PHN0cm9uZz5BZGQgTmV3PC9zdHJvbmc+PC90ZD5cbiAgICAgICAgPHRkPjxzcGFuIGNsYXNzPVwiY29uZmlkZW5jZS1iYWRnZSBjb25maWRlbmNlLSR7Y29uZkxldmVsfVwiPiR7ZXNjYXBlSHRtbChjb25mVGV4dCl9PC9zcGFuPjwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cIm1heC13aWR0aDoyMDBweDtcIj48c21hbGw+JHtlc2NhcGVIdG1sKHN1Z2cucmF0aW9uYWxlIHx8ICcnKX08L3NtYWxsPjwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cImFjdGlvbi1idG5zXCIgc3R5bGU9XCJ3aGl0ZS1zcGFjZTpub3dyYXA7XCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuICR7ZGVmYXVsdEFjdGlvbiA9PT0gJ2VtcGhhc2l6ZScgICAgPyAnYWN0aXZlJyA6ICcnfVwiIGRhdGEtYWN0aW9uPVwiZW1waGFzaXplXCIgICAgYXJpYS1sYWJlbD1cIkVtcGhhc2l6ZVwiICAgIHRpdGxlPVwiRW1waGFzaXplIFx1MjAxNCBmZWF0dXJlIHByb21pbmVudGx5XCIgIHN0eWxlPVwiY29sb3I6IzEwYjk4MTtcIj5cdTI3OTU8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG4gJHtkZWZhdWx0QWN0aW9uID09PSAnaW5jbHVkZScgICAgICA/ICdhY3RpdmUnIDogJyd9XCIgZGF0YS1hY3Rpb249XCJpbmNsdWRlXCIgICAgICBhcmlhLWxhYmVsPVwiSW5jbHVkZVwiICAgICAgdGl0bGU9XCJJbmNsdWRlIFx1MjAxNCBhZGQgdG8gQ1ZcIj5cdTI3MTM8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG4gJHtkZWZhdWx0QWN0aW9uID09PSAnZGUtZW1waGFzaXplJyA/ICdhY3RpdmUnIDogJyd9XCIgZGF0YS1hY3Rpb249XCJkZS1lbXBoYXNpemVcIiBhcmlhLWxhYmVsPVwiRGUtZW1waGFzaXplXCIgdGl0bGU9XCJEZS1lbXBoYXNpemUgXHUyMDE0IGJyaWVmIG1lbnRpb24gb25seVwiICBzdHlsZT1cImNvbG9yOiNmNTllMGI7XCI+XHUyNzk2PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuICR7ZGVmYXVsdEFjdGlvbiA9PT0gJ2V4Y2x1ZGUnICAgICAgPyAnYWN0aXZlJyA6ICcnfVwiIGRhdGEtYWN0aW9uPVwiZXhjbHVkZVwiICAgICAgYXJpYS1sYWJlbD1cIkV4Y2x1ZGVcIiAgICAgIHRpdGxlPVwiU2tpcCBcdTIwMTQgZG8gbm90IGFkZFwiICAgICAgICAgICAgICAgICBzdHlsZT1cImNvbG9yOiNlZjQ0NDQ7XCI+JHtleWVTbGFzaEljb24oKX08L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBhcmlhLWxhYmVsPVwiQUkgcmV3cml0ZVwiIHRpdGxlPVwiQUkgcmV3cml0ZSBkZXNjcmlwdGlvblwiIG9uY2xpY2s9XCJhaVJld3JpdGVTdWdnZXN0ZWRBY2hpZXZlbWVudCgnJHtlc2NhcGVIdG1sKHN1Z2dJZCl9JylcIj5cdTI3Mjg8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBhcmlhLWxhYmVsPVwiTW92ZSBlYXJsaWVyXCIgdGl0bGU9XCJNb3ZlIHVwXCIgICAke2lzRmlyc3QgPyAnZGlzYWJsZWQnIDogJyd9IG9uY2xpY2s9XCJtb3ZlU3VnZ2VzdGVkQWNoaWV2ZW1lbnRSb3coJyR7ZXNjYXBlSHRtbChzdWdnSWQpfScsLTEpXCI+XHUyMTkxPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgYXJpYS1sYWJlbD1cIk1vdmUgbGF0ZXJcIiAgIHRpdGxlPVwiTW92ZSBkb3duXCIgJHtpc0xhc3QgID8gJ2Rpc2FibGVkJyA6ICcnfSBvbmNsaWNrPVwibW92ZVN1Z2dlc3RlZEFjaGlldmVtZW50Um93KCcke2VzY2FwZUh0bWwoc3VnZ0lkKX0nLCsxKVwiPlx1MjE5MzwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIGFyaWEtbGFiZWw9XCJSZW1vdmUgc3VnZ2VzdGlvblwiIHRpdGxlPVwiUmVtb3ZlIHN1Z2dlc3Rpb25cIiBvbmNsaWNrPVwiZGVsZXRlU3VnZ2VzdGVkQWNoaWV2ZW1lbnQoJyR7ZXNjYXBlSHRtbChzdWdnSWQpfScpXCIgc3R5bGU9XCJjb2xvcjojZWY0NDQ0O1wiPlx1RDgzRFx1REREMTwvYnV0dG9uPlxuICAgICAgICA8L3RkPlxuICAgICAgPC90cj5cbiAgICBgO1xuICB9KTtcblxuICBodG1sICs9ICc8L3Rib2R5PjwvdGFibGU+JztcbiAgY29udGFpbmVyLmlubmVySFRNTCA9IGh0bWw7XG5cbiAgLy8gQnVsayB0b29sYmFyIGFib3ZlIHRoZSBmaWx0ZXIgcm93XG4gIGNvbnN0IGFjaFRvb2xiYXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgYWNoVG9vbGJhci5jbGFzc05hbWUgPSAnYnVsay10b29sYmFyJztcbiAgYWNoVG9vbGJhci5pbm5lckhUTUwgPSBgXG4gICAgPHNwYW4+QnVsazo8L3NwYW4+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImJ1bGstYnRuIGJ1bGstcmVjb21tZW5kZWRcIiBvbmNsaWNrPVwiYnVsa0FjaGlldmVtZW50QWN0aW9uKCdyZWNvbW1lbmRlZCcpXCIgdGl0bGU9XCJTZXQgYWxsIHRvIHRoZSBMTE0gcmVjb21tZW5kYXRpb25cIj5cdTI3MjggQWNjZXB0IEFsbCBSZWNvbW1lbmRlZDwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJidWxrLWJ0biBidWxrLWVtcGhhc2l6ZVwiICAgb25jbGljaz1cImJ1bGtBY2hpZXZlbWVudEFjdGlvbignZW1waGFzaXplJylcIj5cdTI3OTUgRW1waGFzaXplIEFsbDwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJidWxrLWJ0biBidWxrLWluY2x1ZGVcIiAgICAgb25jbGljaz1cImJ1bGtBY2hpZXZlbWVudEFjdGlvbignaW5jbHVkZScpXCI+XHUyNzEzIEluY2x1ZGUgQWxsPC9idXR0b24+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImJ1bGstYnRuIGJ1bGstZXhjbHVkZVwiICAgICBvbmNsaWNrPVwiYnVsa0FjaGlldmVtZW50QWN0aW9uKCdleGNsdWRlJylcIj4ke2V5ZVNsYXNoSWNvbigpfSBFeGNsdWRlIEFsbDwvYnV0dG9uPlxuICBgO1xuICBjb250YWluZXIuaW5zZXJ0QmVmb3JlKGFjaFRvb2xiYXIsIGNvbnRhaW5lci5maXJzdENoaWxkKTtcblxuICAvLyBEZWxlZ2F0ZWQgY2xpY2sgaGFuZGxlciBmb3IgZGVjaXNpb24gYnV0dG9uc1xuICBjb250YWluZXIucXVlcnlTZWxlY3RvcigndGJvZHknKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBlID0+IHtcbiAgICBjb25zdCBidG4gPSBlLnRhcmdldC5jbG9zZXN0KCcuaWNvbi1idG5bZGF0YS1hY3Rpb25dJyk7XG4gICAgaWYgKCFidG4pIHJldHVybjtcbiAgICBjb25zdCB0ciA9IGJ0bi5jbG9zZXN0KCd0cltkYXRhLWFjaC1pZF0nKTtcbiAgICBpZiAoIXRyKSByZXR1cm47XG4gICAgY29uc3QgYWN0aW9uID0gYnRuLmRhdGFzZXQuYWN0aW9uO1xuICAgIGlmIChhY3Rpb24pIGhhbmRsZUFjaGlldmVtZW50QWN0aW9uKHRyLmRhdGFzZXQuYWNoSWQsIGFjdGlvbik7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBidWxrQWNoaWV2ZW1lbnRBY3Rpb24oYWN0aW9uKSB7XG4gIGNvbnN0IGRhdGEgPSB3aW5kb3cucGVuZGluZ1JlY29tbWVuZGF0aW9ucyB8fCB7fTtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2FjaGlldmVtZW50cy1yZXZpZXctdGFibGUgdGJvZHkgdHJbZGF0YS1hY2gtaWRdJykuZm9yRWFjaChyb3cgPT4ge1xuICAgIGlmIChyb3cuc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnKSByZXR1cm47ICAgLy8gcmVzcGVjdCBmaWx0ZXJcbiAgICBjb25zdCBhY2hJZCA9IHJvdy5kYXRhc2V0LmFjaElkO1xuICAgIGlmICghYWNoSWQpIHJldHVybjtcbiAgICBsZXQgcmVzb2x2ZWRBY3Rpb24gPSBhY3Rpb247XG4gICAgaWYgKGFjdGlvbiA9PT0gJ3JlY29tbWVuZGVkJykge1xuICAgICAgaWYgKGFjaElkLnN0YXJ0c1dpdGgoJ3N1Z2c6OicpKSB7XG4gICAgICAgIHJlc29sdmVkQWN0aW9uID0gJ2luY2x1ZGUnOyAvLyBBSS1zdWdnZXN0ZWQgaXRlbXMgZGVmYXVsdCB0byBpbmNsdWRlIHdoZW4gYWNjZXB0aW5nIGFsbFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVjID0gZ2V0QWNoaWV2ZW1lbnRSZWNvbW1lbmRhdGlvbihhY2hJZCwgZGF0YSk7XG4gICAgICAgIGlmIChyZWMgPT09ICdFbXBoYXNpemUnKSAgICAgICAgIHJlc29sdmVkQWN0aW9uID0gJ2VtcGhhc2l6ZSc7XG4gICAgICAgIGVsc2UgaWYgKHJlYyA9PT0gJ0luY2x1ZGUnKSAgICAgIHJlc29sdmVkQWN0aW9uID0gJ2luY2x1ZGUnO1xuICAgICAgICBlbHNlIGlmIChyZWMgPT09ICdEZS1lbXBoYXNpemUnKSByZXNvbHZlZEFjdGlvbiA9ICdkZS1lbXBoYXNpemUnO1xuICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlZEFjdGlvbiA9ICdleGNsdWRlJztcbiAgICAgIH1cbiAgICB9XG4gICAgaGFuZGxlQWNoaWV2ZW1lbnRBY3Rpb24oYWNoSWQsIHJlc29sdmVkQWN0aW9uKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZUFjaGlldmVtZW50QWN0aW9uKGFjaElkLCBhY3Rpb24pIHtcbiAgd2luZG93LmFjaGlldmVtZW50RGVjaXNpb25zW2FjaElkXSA9IGFjdGlvbjtcbiAgY29uc3Qgcm93ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgdHJbZGF0YS1hY2gtaWQ9XCIke0NTUy5lc2NhcGUoYWNoSWQpfVwiXWApO1xuICBpZiAoIXJvdykgcmV0dXJuO1xuICByb3cucXVlcnlTZWxlY3RvckFsbCgnLmljb24tYnRuJykuZm9yRWFjaChidG4gPT4gYnRuLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpKTtcbiAgY29uc3QgYWN0aXZlQnRuID0gcm93LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWFjdGlvbj1cIiR7YWN0aW9ufVwiXWApO1xuICBpZiAoYWN0aXZlQnRuKSBhY3RpdmVCdG4uY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN1Ym1pdEFjaGlldmVtZW50RGVjaXNpb25zKCkge1xuICAvKiBkdWNrZmxvdzpcbiAgICogICBpZDogYWNoaWV2ZW1lbnRzX3VpX3N1Ym1pdF9saXZlXG4gICAqICAga2luZDogdWlcbiAgICogICB0aW1lc3RhbXA6ICcyMDI2LTAzLTI1VDIxOjM5OjQ4WidcbiAgICogICBzdGF0dXM6IGxpdmVcbiAgICogICBoYW5kbGVzOlxuICAgKiAgIC0gdWk6YWNoaWV2ZW1lbnRzLXJldmlldy5zdWJtaXRcbiAgICogICBjYWxsczpcbiAgICogICAtIFBPU1QgL2FwaS9yZXZpZXctZGVjaXNpb25zXG4gICAqICAgLSBQT1NUIC9hcGkvY3YvbGF5b3V0LWVzdGltYXRlXG4gICAqICAgcmVhZHM6XG4gICAqICAgLSB3aW5kb3c6YWNoaWV2ZW1lbnREZWNpc2lvbnNcbiAgICogICAtIHdpbmRvdzpfc3VnZ2VzdGVkQWNoc09yZGVyZWRcbiAgICogICB3cml0ZXM6XG4gICAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9yZXZpZXctZGVjaXNpb25zLmRlY2lzaW9uc1xuICAgKiAgIC0gcmVxdWVzdDpQT1NUIC9hcGkvcmV2aWV3LWRlY2lzaW9ucy5hY2NlcHRlZF9zdWdnZXN0aW9uc1xuICAgKiAgIC0gd2luZG93Ol9zYXZlZERlY2lzaW9ucy5hY2hpZXZlbWVudF9kZWNpc2lvbnNcbiAgICogICAtIHdpbmRvdzpfc2F2ZWREZWNpc2lvbnMuYWNjZXB0ZWRfc3VnZ2VzdGVkX2FjaGlldmVtZW50c1xuICAgKiAgIG5vdGVzOiBQZXJzaXN0cyBhY2hpZXZlbWVudCBpbmNsdXNpb24gZGVjaXNpb25zIGFuZCB0aGUgYWNjZXB0ZWQgQUktc3VnZ2VzdGVkIGFjaGlldmVtZW50cyB0aGF0IHNob3VsZCByZW1haW4gc2Vzc2lvbi1vbmx5IHVudGlsIGFuIGV4cGxpY2l0IGhhcnZlc3Qgc3RlcC5cbiAgICovXG4gIGNvbnN0IGFsbERlY2lzaW9ucyA9IHdpbmRvdy5hY2hpZXZlbWVudERlY2lzaW9ucyB8fCB7fTtcbiAgLy8gU2VwYXJhdGUgZXhpc3RpbmcgYWNoaWV2ZW1lbnRzIGZyb20gQUktc3VnZ2VzdGVkIG9uZXNcbiAgY29uc3QgZGVjaXNpb25zID0ge307XG4gIGNvbnN0IHN1Z2dlc3RlZERlY2lzaW9ucyA9IHt9O1xuICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhhbGxEZWNpc2lvbnMpKSB7XG4gICAgaWYgKGsuc3RhcnRzV2l0aCgnc3VnZzo6JykpIHN1Z2dlc3RlZERlY2lzaW9uc1trXSA9IHY7XG4gICAgZWxzZSBkZWNpc2lvbnNba10gPSB2O1xuICB9XG4gIGNvbnN0IGNvdW50ID0gT2JqZWN0LmtleXMoYWxsRGVjaXNpb25zKS5sZW5ndGg7XG4gIGlmIChjb3VudCA9PT0gMCkgcmV0dXJuO1xuICAvLyBSZXNvbHZlIHN1Z2dlc3RlZCBhY2hpZXZlbWVudCBvYmplY3RzIHRoYXQgd2VyZSBhY2NlcHRlZFxuICBjb25zdCBzdWdnZXN0ZWRBY2hzID0gd2luZG93Ll9zdWdnZXN0ZWRBY2hzT3JkZXJlZCB8fCBbXTtcbiAgY29uc3QgYWNjZXB0ZWRTdWdnZXN0aW9ucyA9IHN1Z2dlc3RlZEFjaHNcbiAgICAuZmlsdGVyKHMgPT4ge1xuICAgICAgY29uc3QgYWN0aW9uID0gc3VnZ2VzdGVkRGVjaXNpb25zW3MuX3N1Z2dJZF07XG4gICAgICByZXR1cm4gYWN0aW9uID09PSAnaW5jbHVkZScgfHwgYWN0aW9uID09PSAnZW1waGFzaXplJztcbiAgICB9KVxuICAgIC5tYXAocyA9PiAoeyB0aXRsZTogcy50aXRsZSwgZGVzY3JpcHRpb246IHMuZGVzY3JpcHRpb24sIGV4cGVyaWVuY2VfaWQ6IHMuZXhwZXJpZW5jZV9pZCwgcmF0aW9uYWxlOiBzLnJhdGlvbmFsZSB9KSk7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9yZXZpZXctZGVjaXNpb25zJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgdHlwZTogJ2FjaGlldmVtZW50cycsIGRlY2lzaW9ucywgYWNjZXB0ZWRfc3VnZ2VzdGlvbnM6IGFjY2VwdGVkU3VnZ2VzdGlvbnMgfSlcbiAgICB9KTtcbiAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgIHN0YXRlTWFuYWdlci5tYXJrQ29udGVudENoYW5nZWQoKTtcbiAgICAgIHNob3dUb2FzdChgQWNoaWV2ZW1lbnQgc2VsZWN0aW9ucyBzYXZlZCAoJHtjb3VudH0gaXRlbXMpYCk7XG4gICAgICBzY2hlZHVsZUF0c1JlZnJlc2goKTtcbiAgICAgIC8vIFBlcnNpc3QgbG9jYWxseSBzbyB0aGUgcmV2aWV3IFVJIGltbWVkaWF0ZWx5IHJlZmxlY3RzIHNhdmVkIGNob2ljZXNcbiAgICAgIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMgPSB3aW5kb3cuX3NhdmVkRGVjaXNpb25zIHx8IHt9O1xuICAgICAgd2luZG93Ll9zYXZlZERlY2lzaW9ucy5hY2hpZXZlbWVudF9kZWNpc2lvbnMgPSBkZWNpc2lvbnM7XG4gICAgICBpZiAoYWNjZXB0ZWRTdWdnZXN0aW9ucyAmJiBhY2NlcHRlZFN1Z2dlc3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgd2luZG93Ll9zYXZlZERlY2lzaW9ucy5hY2NlcHRlZF9zdWdnZXN0ZWRfYWNoaWV2ZW1lbnRzID0gYWNjZXB0ZWRTdWdnZXN0aW9ucztcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgdXBkYXRlSW5jbHVzaW9uQ291bnRzID09PSAnZnVuY3Rpb24nKSB1cGRhdGVJbmNsdXNpb25Db3VudHMoKTtcbiAgICAgIHN3aXRjaFRhYigndGFnbGluZS1yZXZpZXcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZXJyID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgc2hvd1RvYXN0KGBFcnJvcjogJHtlcnIuZXJyb3IgfHwgJ0ZhaWxlZCB0byBzYXZlIHNlbGVjdGlvbnMnfWAsICdlcnJvcicpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dUb2FzdCgnRmFpbGVkIHRvIHNhdmUgYWNoaWV2ZW1lbnQgc2VsZWN0aW9ucy4gUGxlYXNlIHRyeSBhZ2Fpbi4nLCAnZXJyb3InKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3ZlQWNoaWV2ZW1lbnRSb3coYWNoSWQsIGRpcmVjdGlvbikge1xuICBjb25zdCBhcnIgPSB3aW5kb3cuX2FjaGlldmVtZW50c09yZGVyZWQ7XG4gIGlmICghYXJyKSByZXR1cm47XG4gIGNvbnN0IGlkeCA9IGFyci5maW5kSW5kZXgoYSA9PiBhLmlkID09PSBhY2hJZCk7XG4gIGlmIChpZHggPCAwKSByZXR1cm47XG4gIGNvbnN0IG5ld0lkeCA9IGlkeCArIGRpcmVjdGlvbjtcbiAgaWYgKG5ld0lkeCA8IDAgfHwgbmV3SWR4ID49IGFyci5sZW5ndGgpIHJldHVybjtcbiAgW2FycltpZHhdLCBhcnJbbmV3SWR4XV0gPSBbYXJyW25ld0lkeF0sIGFycltpZHhdXTtcbiAgd2luZG93Ll9hY2hpZXZlbWVudHNPcmRlcmVkID0gYXJyO1xuICBfcmVuZGVyQWNoaWV2ZW1lbnRzUmV2aWV3VGFibGUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaGlldmVtZW50cy10YWJsZS1jb250YWluZXInKSk7XG59XG5cbi8vID09PT0gQWNoaWV2ZW1lbnRzIEVkaXRvciBUYWIgPT09PVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBwZXItZXhwZXJpZW5jZSBhY2hpZXZlbWVudHMgZWRpdG9yIHRhYi5cbiAqIEVhY2ggZXhwZXJpZW5jZSBnZXRzIGEgY29sbGFwc2libGUgY2FyZCB3aXRoIGl0cyBhY2hpZXZlbWVudHMgbGlzdGVkLlxuICogRWFjaCBhY2hpZXZlbWVudCBzdXBwb3J0czogaW5saW5lIGVkaXQsIHJlb3JkZXIgKFx1MjE5MVx1MjE5MyksIGRlbGV0ZSwgYW5kIExMTSByZXdyaXRlLlxuICovXG5hc3luYyBmdW5jdGlvbiBidWlsZEFjaGlldmVtZW50c0VkaXRvcigpIHtcbiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgaWYgKCFjb250YWluZXIpIHJldHVybjtcblxuICBjb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDoxMnB4O3BhZGRpbmc6MjBweDtjb2xvcjojNmI3MjgwO1wiPjxkaXYgY2xhc3M9XCJsb2FkaW5nLXNwaW5uZXJcIiBzdHlsZT1cIndpZHRoOjIwcHg7aGVpZ2h0OjIwcHg7Ym9yZGVyLXdpZHRoOjJweDtmbGV4LXNocmluazowO1wiPjwvZGl2PjxzcGFuPkxvYWRpbmcgZXhwZXJpZW5jZSBidWxsZXRzIGVkaXRvclx1MjAyNjwvc3Bhbj48L2Rpdj4nO1xuXG4gIC8vIEZldGNoIGV4cGVyaWVuY2VzICsgdGhlaXIgYWNoaWV2ZW1lbnRzIGZyb20gbWFzdGVyIGZpZWxkc1xuICBsZXQgZXhwZXJpZW5jZXMgPSBbXTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZmllbGRzJyk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgZXhwZXJpZW5jZXMgPSBkYXRhLmV4cGVyaWVuY2VzIHx8IFtdO1xuICB9IGNhdGNoIChfKSB7fVxuXG4gIGlmIChleHBlcmllbmNlcy5sZW5ndGggPT09IDApIHtcbiAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJzxwIHN0eWxlPVwicGFkZGluZzoyMHB4O2NvbG9yOiM2YjcyODA7XCI+Tm8gZXhwZXJpZW5jZXMgZm91bmQgaW4gbWFzdGVyIENWLjwvcD4nO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEluaXRpYWxpc2UgZWRpdHMgc3RvcmUgXHUyMDE0IGtleWVkIGJ5IGV4cGVyaWVuY2UgaW5kZXgsIHZhbHVlIGlzIGFycmF5IG9mIHsgdGV4dCwgaGlkZGVuIH1cbiAgd2luZG93LmFjaGlldmVtZW50RWRpdHMgPSB3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0cyB8fCB7fTtcbiAgZXhwZXJpZW5jZXMuZm9yRWFjaCgoZXhwLCBleHBJZHgpID0+IHtcbiAgICBpZiAoIXdpbmRvdy5hY2hpZXZlbWVudEVkaXRzW2V4cElkeF0pIHtcbiAgICAgIHdpbmRvdy5hY2hpZXZlbWVudEVkaXRzW2V4cElkeF0gPSAoZXhwLmtleV9hY2hpZXZlbWVudHMgfHwgZXhwLmFjaGlldmVtZW50cyB8fCBbXSkubWFwKGEgPT5cbiAgICAgICAgX25vcm1hbGl6ZUFjaGlldmVtZW50RWRpdEVudHJ5KFxuICAgICAgICAgIHR5cGVvZiBhID09PSAnc3RyaW5nJyA/IGEgOiAoYSAmJiAoYS50ZXh0IHx8IGEuZGVzY3JpcHRpb24gfHwgYS5jb250ZW50IHx8ICcnKSkgfHwgJydcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2luZG93LmFjaGlldmVtZW50RWRpdHNbZXhwSWR4XSA9IF9ub3JtYWxpemVBY2hpZXZlbWVudEVkaXRMaXN0KHdpbmRvdy5hY2hpZXZlbWVudEVkaXRzW2V4cElkeF0pO1xuICAgIH1cbiAgfSk7XG5cbiAgbGV0IGh0bWwgPSBgXG4gICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6MTZweDtcIj5cbiAgICAgIDxoMiBzdHlsZT1cIm1hcmdpbjowIDAgNHB4O1wiPlx1MjcwRlx1RkUwRiBFeHBlcmllbmNlIEJ1bGxldHM8L2gyPlxuICAgICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO21hcmdpbjowIDAgMTZweDtmb250LXNpemU6MC45ZW07XCI+XG4gICAgICAgIEVkaXQsIHJlb3JkZXIsIGRlbGV0ZSwgb3IgQUktcmV3cml0ZSBpbmRpdmlkdWFsIGV4cGVyaWVuY2UgYnVsbGV0cyBwZXIgcm9sZS5cbiAgICAgICAgQ2hhbmdlcyBhcmUgc2F2ZWQgYXV0b21hdGljYWxseSBhbmQgdXNlZCBkdXJpbmcgQ1YgZ2VuZXJhdGlvbi5cbiAgICAgIDwvcD5cbiAgYDtcblxuICAvLyBGaWx0ZXIgb3V0IGV4cGVyaWVuY2VzIHRoYXQgdXNlciBtYXJrZWQgYXMgZXhjbHVkZWQgKHBlcnNpc3RlZCBkZWNpc2lvbnMpXG4gIGNvbnN0IGV4cERlY2lzaW9ucyA9ICh3aW5kb3cuX3NhdmVkRGVjaXNpb25zICYmIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMuZXhwZXJpZW5jZV9kZWNpc2lvbnMpIHx8IHVzZXJTZWxlY3Rpb25zLmV4cGVyaWVuY2VzIHx8IHt9O1xuICBleHBlcmllbmNlcy5mb3JFYWNoKChleHAsIGV4cElkeCkgPT4ge1xuICAgIGNvbnN0IGV4cElkID0gZXhwLmlkIHx8IGV4cC5leHBlcmllbmNlX2lkIHx8IGBleHA6OiR7ZXhwSWR4fWA7XG4gICAgY29uc3QgZGVjaXNpb24gPSBleHBEZWNpc2lvbnNbZXhwSWRdO1xuICAgIGlmIChkZWNpc2lvbiA9PT0gJ2V4Y2x1ZGUnKSByZXR1cm47IC8vIG9taXQgZXhjbHVkZWQgZXhwZXJpZW5jZXMgZnJvbSBlZGl0b3JcbiAgICBjb25zdCB0aXRsZSAgICA9IGVzY2FwZUh0bWwoZXhwLnRpdGxlIHx8IGV4cC5wb3NpdGlvbiB8fCBgRXhwZXJpZW5jZSAke2V4cElkeCArIDF9YCk7XG4gICAgY29uc3QgY29tcGFueSAgPSBlc2NhcGVIdG1sKGV4cC5jb21wYW55IHx8IGV4cC5vcmdhbml6YXRpb24gfHwgJycpO1xuICAgIGNvbnN0IGFjaENvdW50ID0gd2luZG93LmFjaGlldmVtZW50RWRpdHNbZXhwSWR4XS5sZW5ndGg7XG5cbiAgICBodG1sICs9IGBcbiAgICAgIDxkZXRhaWxzIG9wZW4gc3R5bGU9XCJtYXJnaW4tYm90dG9tOjEycHg7Ym9yZGVyOjFweCBzb2xpZCAjZTVlN2ViO2JvcmRlci1yYWRpdXM6OHB4O292ZXJmbG93OmhpZGRlbjtcIj5cbiAgICAgICAgPHN1bW1hcnkgc3R5bGU9XCJwYWRkaW5nOjEycHggMTZweDtiYWNrZ3JvdW5kOiNmOWZhZmI7Y3Vyc29yOnBvaW50ZXI7Zm9udC13ZWlnaHQ6NjAwO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDtcIj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZsZXg6MTtcIj4ke3RpdGxlfSR7Y29tcGFueSA/IGAgPHNwYW4gc3R5bGU9XCJmb250LXdlaWdodDo0MDA7Y29sb3I6IzZiNzI4MDtcIj5AICR7Y29tcGFueX08L3NwYW4+YCA6ICcnfTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjhlbTtjb2xvcjojOWNhM2FmO1wiPiR7YWNoQ291bnR9IGJ1bGxldCR7YWNoQ291bnQgIT09IDEgPyAncycgOiAnJ308L3NwYW4+XG4gICAgICAgIDwvc3VtbWFyeT5cbiAgICAgICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6MTJweCAxNnB4O1wiIGlkPVwiYWNoLWVkaXRvci1leHAtJHtleHBJZHh9XCI+XG4gICAgICAgICAgPGRpdiBpZD1cImFjaC1saXN0LSR7ZXhwSWR4fVwiPjwvZGl2PlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4tc2Vjb25kYXJ5XCIgc3R5bGU9XCJtYXJnaW4tdG9wOjhweDtmb250LXNpemU6MC44NWVtO1wiXG4gICAgICAgICAgICBvbmNsaWNrPVwiYWRkQWNoaWV2ZW1lbnRSb3coJHtleHBJZHh9KVwiPisgQWRkIEJ1bGxldDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGV0YWlscz5cbiAgICBgO1xuICB9KTtcblxuICBodG1sICs9IGBcbiAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDoyMHB4O2Rpc3BsYXk6ZmxleDtnYXA6MTJweDthbGlnbi1pdGVtczpjZW50ZXI7XCI+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYmFjay1idG5cIiBvbmNsaWNrPVwic3dpdGNoVGFiKCdleHAtcmV2aWV3JylcIj5cdTIxOTAgQmFjayB0byBFeHBlcmllbmNlczwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbnRpbnVlLWJ0blwiIG9uY2xpY2s9XCJzYXZlQWNoaWV2ZW1lbnRFZGl0c0FuZENvbnRpbnVlKClcIj5TYXZlICZhbXA7IENvbnRpbnVlIHRvIFNraWxscyBcdTIxOTI8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYDtcblxuICBjb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDtcblxuICAvLyBSZW5kZXIgYWNoaWV2ZW1lbnQgcm93cyBmb3IgZWFjaCBleHBlcmllbmNlXG4gIGV4cGVyaWVuY2VzLmZvckVhY2goKF8sIGV4cElkeCkgPT4gcmVuZGVyQWNoaWV2ZW1lbnRFZGl0b3JSb3dzKGV4cElkeCkpO1xufVxuXG4vLyBWZXJicyB0aGF0IGdlbmVyYXRlIGEgd2Vhay12ZXJiIHdhcm5pbmcgYmFkZ2UgaW4gdGhlIGJ1bGxldCBlZGl0b3IuXG5jb25zdCBfQUNIX1BBU1NJVkVfU1RBUlRTID0gbmV3IFNldChbJ3dhcycsJ3dlcmUnLCdpcycsJ2FyZScsJ2JlZW4nXSk7XG5jb25zdCBfQUNIX1dFQUtfVkVSQlMgPSBuZXcgU2V0KFtcbiAgJ2Fzc2lzdGVkJywnY29udHJpYnV0ZWQnLCdoZWxwZWQnLCdwYXJ0aWNpcGF0ZWQnLCdzdXBwb3J0ZWQnLFxuICAnc3VwZXJ2aXNlZCcsJ3dvcmtlZCcsJ2NvbGxhYm9yYXRlZCcsJ2Nvb3BlcmF0ZWQnLFxuXSk7XG5jb25zdCBfQUNIX1NUUk9OR19WRVJCUyA9IG5ldyBTZXQoW1xuICAnYWNjZWxlcmF0ZWQnLCdhY2hpZXZlZCcsJ2FyY2hpdGVjdGVkJywnYXV0b21hdGVkJywnYnVpbHQnLFxuICAnY2hhbXBpb25lZCcsJ2NvaW5lZCcsJ2NvbmNlaXZlZCcsJ2NvbmR1Y3RlZCcsJ2NvbnNvbGlkYXRlZCcsXG4gICdjcmVhdGVkJywnY3V0JywnZGVsaXZlcmVkJywnZGVtb25zdHJhdGVkJywnZGVwbG95ZWQnLFxuICAnZGVzaWduZWQnLCdkZXZlbG9wZWQnLCdkaXJlY3RlZCcsJ2RvdWJsZWQnLCdkcm92ZScsXG4gICdlbmFibGVkJywnZXN0YWJsaXNoZWQnLCdleHBhbmRlZCcsJ2ZvdW5kZWQnLCdnZW5lcmF0ZWQnLFxuICAnZ3JldycsJ2ltcGxlbWVudGVkJywnaW1wcm92ZWQnLCdpbmNyZWFzZWQnLCdpbnRlZ3JhdGVkJyxcbiAgJ2ludmVudGVkJywnbGF1bmNoZWQnLCdsZWQnLCdtYW5hZ2VkJywnb3B0aW1pemVkJywncGlvbmVlcmVkJyxcbiAgJ3Byb3ZpZGVkJywncHVibGlzaGVkJywncmFpc2VkJywncmVkdWNlZCcsJ3JlZmFjdG9yZWQnLCdzY2FsZWQnLFxuICAnc2VjdXJlZCcsJ3NoaXBwZWQnLCdzcGVhcmhlYWRlZCcsJ3N0cmVhbWxpbmVkJywndGF1Z2h0JyxcbiAgJ3RyYW5zZm9ybWVkJywndHJhbnNsYXRlZCcsJ3RyaXBsZWQnLFxuXSk7XG5cbmZ1bmN0aW9uIF9hY2hWZXJiV2FybmluZyh0ZXh0KSB7XG4gIGNvbnN0IGZpcnN0V29yZCA9ICh0ZXh0IHx8ICcnKS50cmltKCkuc3BsaXQoL1tcXHMsLjo7XS8pWzBdLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvW15hLXpdL2csICcnKTtcbiAgaWYgKCFmaXJzdFdvcmQpIHJldHVybiBudWxsO1xuICBpZiAoX0FDSF9QQVNTSVZFX1NUQVJUUy5oYXMoZmlyc3RXb3JkKSkgcmV0dXJuIHsgbGV2ZWw6ICdwYXNzaXZlJywgd29yZDogZmlyc3RXb3JkIH07XG4gIGlmIChfQUNIX1dFQUtfVkVSQlMuaGFzKGZpcnN0V29yZCkpIHJldHVybiB7IGxldmVsOiAnd2VhaycsICAgIHdvcmQ6IGZpcnN0V29yZCB9O1xuICBpZiAoIV9BQ0hfU1RST05HX1ZFUkJTLmhhcyhmaXJzdFdvcmQpKSByZXR1cm4geyBsZXZlbDogJ25ldXRyYWwnLCB3b3JkOiBmaXJzdFdvcmQgfTtcbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogUmVuZGVyIHRoZSBlZGl0YWJsZSBhY2hpZXZlbWVudCByb3dzIGZvciBvbmUgZXhwZXJpZW5jZS5cbiAqL1xuZnVuY3Rpb24gcmVuZGVyQWNoaWV2ZW1lbnRFZGl0b3JSb3dzKGV4cElkeCkge1xuICBjb25zdCBsaXN0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgYWNoLWxpc3QtJHtleHBJZHh9YCk7XG4gIGlmICghbGlzdEVsKSByZXR1cm47XG4gIGNvbnN0IGFjaHMgPSBfbm9ybWFsaXplQWNoaWV2ZW1lbnRFZGl0TGlzdCh3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0c1tleHBJZHhdIHx8IFtdKTtcbiAgd2luZG93LmFjaGlldmVtZW50RWRpdHNbZXhwSWR4XSA9IGFjaHM7XG5cbiAgaWYgKGFjaHMubGVuZ3RoID09PSAwKSB7XG4gICAgbGlzdEVsLmlubmVySFRNTCA9ICc8cCBzdHlsZT1cImNvbG9yOiM5Y2EzYWY7Zm9udC1zaXplOjAuODVlbTtwYWRkaW5nOjRweCAwO1wiPk5vIGV4cGVyaWVuY2UgYnVsbGV0cyB5ZXQuPC9wPic7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGlzdEVsLmlubmVySFRNTCA9IGFjaHMubWFwKChlbnRyeSwgYWNoSWR4KSA9PiB7XG4gICAgY29uc3QgdGV4dCA9IF9hY2hpZXZlbWVudEVudHJ5VGV4dChlbnRyeSk7XG4gICAgY29uc3QgaGlkZGVuID0gX2FjaGlldmVtZW50RW50cnlIaWRkZW4oZW50cnkpO1xuICAgIGNvbnN0IHZlcmJXYXJuID0gX2FjaFZlcmJXYXJuaW5nKHRleHQpO1xuICAgIGNvbnN0IHZlcmJCYWRnZSA9IHZlcmJXYXJuXG4gICAgICA/ICh2ZXJiV2Fybi5sZXZlbCA9PT0gJ3Bhc3NpdmUnXG4gICAgICAgICAgPyBgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjc4ZW07Y29sb3I6IzlmMTIzOTtiYWNrZ3JvdW5kOiNmZmYxZjI7Ym9yZGVyOjFweCBzb2xpZCAjZmVjZGQzO2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6MnB4IDZweDttYXJnaW4tdG9wOjNweDtcIiB0aXRsZT1cIkJ1bGxldCBvcGVucyB3aXRoIHBhc3NpdmUgdm9pY2UgKCcke3ZlcmJXYXJuLndvcmR9JykgXHUyMDE0IHJld3JpdGUgd2l0aCBhbiBhY3RpdmUgb3BlbmluZyB2ZXJiXCI+XHUyNkEwIFBhc3NpdmUgdm9pY2UgXHUyMDE0IHJld3JpdGUgd2l0aCBhbiBhY3RpdmUgb3BlbmluZyB2ZXJiPC9kaXY+YFxuICAgICAgICAgIDogdmVyYldhcm4ubGV2ZWwgPT09ICd3ZWFrJ1xuICAgICAgICAgID8gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC43OGVtO2NvbG9yOiNiNDUzMDk7YmFja2dyb3VuZDojZmZmYmViO2JvcmRlcjoxcHggc29saWQgI2ZkZTY4YTtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjJweCA2cHg7bWFyZ2luLXRvcDozcHg7XCIgdGl0bGU9XCJPcGVuaW5nIHZlcmIgJyR7dmVyYldhcm4ud29yZH0nIGlzIHdlYWsgXHUyMDE0IGNvbnNpZGVyIExlZCwgQnVpbHQsIERyb3ZlLCBldGMuXCI+XHUyNkEwIFdlYWsgb3BlbmluZyB2ZXJiIFx1MjAxNCB1c2UgYSBzdHJvbmdlciBhY3Rpb24gdmVyYjwvZGl2PmBcbiAgICAgICAgICA6IGA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuNzhlbTtjb2xvcjojNmI3MjgwO2JhY2tncm91bmQ6I2Y5ZmFmYjtib3JkZXI6MXB4IHNvbGlkICNlNWU3ZWI7Ym9yZGVyLXJhZGl1czo0cHg7cGFkZGluZzoycHggNnB4O21hcmdpbi10b3A6M3B4O1wiIHRpdGxlPVwiJyR7dmVyYldhcm4ud29yZH0nIGlzIG5vdCBpbiB0aGUgc3Ryb25nLXZlcmIgbGlzdCBcdTIwMTQgdmVyaWZ5IGl0IG1ha2VzIGFuIGltcGFjdCBzdGF0ZW1lbnRcIj5cdTIxMzkgT3BlbmluZyB2ZXJiIG5vdCBpbiBzdHJvbmctdmVyYiBsaXN0PC9kaXY+YFxuICAgICAgICApXG4gICAgICA6ICcnO1xuICAgIHJldHVybiBgXG4gICAgPGRpdiBpZD1cImFjaC1yb3ctJHtleHBJZHh9LSR7YWNoSWR4fVwiIGNsYXNzPVwiJHtoaWRkZW4gPyAnYWNoaWV2ZW1lbnQtcm93LWhpZGRlbicgOiAnJ31cIiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6OHB4O2FsaWduLWl0ZW1zOmZsZXgtc3RhcnQ7bWFyZ2luLWJvdHRvbTo4cHg7XCI+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtnYXA6MnB4O3BhZGRpbmctdG9wOjRweDtcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgdGl0bGU9XCJNb3ZlIHVwXCIgICBhcmlhLWxhYmVsPVwiTW92ZSBidWxsZXQgdXBcIiAgIG9uY2xpY2s9XCJtb3ZlQWNoaWV2ZW1lbnQoJHtleHBJZHh9LCR7YWNoSWR4fSwtMSlcIj5cdTI1QjI8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgdGl0bGU9XCJNb3ZlIGRvd25cIiBhcmlhLWxhYmVsPVwiTW92ZSBidWxsZXQgZG93blwiIG9uY2xpY2s9XCJtb3ZlQWNoaWV2ZW1lbnQoJHtleHBJZHh9LCR7YWNoSWR4fSwrMSlcIj5cdTI1QkM8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBzdHlsZT1cImZsZXg6MTtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO1wiPlxuICAgICAgPHRleHRhcmVhIGlkPVwiYWNoLXRleHQtJHtleHBJZHh9LSR7YWNoSWR4fVwiXG4gICAgICAgIHJvd3M9XCIyXCJcbiAgICAgICAgc3R5bGU9XCJ3aWR0aDoxMDAlO3BhZGRpbmc6NnB4IDhweDtib3JkZXI6MXB4IHNvbGlkICR7aGlkZGVuID8gJyNmNTllMGInIDogdmVyYldhcm4/LmxldmVsID09PSAncGFzc2l2ZScgPyAnI2ZlY2RkMycgOiB2ZXJiV2Fybj8ubGV2ZWwgPT09ICd3ZWFrJyA/ICcjZmRlNjhhJyA6ICcjZDFkNWRiJ307Ym9yZGVyLXJhZGl1czo2cHg7Zm9udC1zaXplOjAuOWVtO3Jlc2l6ZTp2ZXJ0aWNhbDtib3gtc2l6aW5nOmJvcmRlci1ib3g7JHtoaWRkZW4gPyAnYmFja2dyb3VuZDojZmZmYmViO2NvbG9yOiM5MjQwMGU7JyA6ICcnfVwiXG4gICAgICAgIG9uY2hhbmdlPVwidXBkYXRlQWNoaWV2ZW1lbnRUZXh0KCR7ZXhwSWR4fSwke2FjaElkeH0sdGhpcy52YWx1ZSlcIlxuICAgICAgICBvbmJsdXI9XCJ1cGRhdGVBY2hpZXZlbWVudFRleHQoJHtleHBJZHh9LCR7YWNoSWR4fSx0aGlzLnZhbHVlKVwiXG4gICAgICA+JHtlc2NhcGVIdG1sKHRleHQpfTwvdGV4dGFyZWE+XG4gICAgICAke3ZlcmJCYWRnZX1cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Z2FwOjRweDtwYWRkaW5nLXRvcDoycHg7XCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0biAke2hpZGRlbiA/ICdhY3RpdmUnIDogJyd9XCIgdGl0bGU9XCIke2hpZGRlbiA/ICdTaG93IGJ1bGxldCBpbiBnZW5lcmF0ZWQgQ1YnIDogJ0hpZGUgYnVsbGV0IGZyb20gZ2VuZXJhdGVkIENWJ31cIlxuICAgICAgICAgIGFyaWEtbGFiZWw9XCIke2hpZGRlbiA/ICdTaG93IGJ1bGxldCBpbiBnZW5lcmF0ZWQgQ1YnIDogJ0hpZGUgYnVsbGV0IGZyb20gZ2VuZXJhdGVkIENWJ31cIiBhcmlhLXByZXNzZWQ9XCIke2hpZGRlbn1cIlxuICAgICAgICAgIG9uY2xpY2s9XCJ0b2dnbGVBY2hpZXZlbWVudEhpZGRlbigke2V4cElkeH0sJHthY2hJZHh9KVwiXG4gICAgICAgICAgc3R5bGU9XCJjb2xvcjoke2hpZGRlbiA/ICcjYjQ1MzA5JyA6ICcjNjQ3NDhiJ307XCI+JHtleWVTbGFzaEljb24oKX08L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgdGl0bGU9XCJBc2sgQUkgdG8gcmV3cml0ZVwiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIkFzayBBSSB0byByZXdyaXRlIHRoaXMgYnVsbGV0XCJcbiAgICAgICAgICBvbmNsaWNrPVwicmV3cml0ZUFjaGlldmVtZW50V2l0aExMTSgke2V4cElkeH0sJHthY2hJZHh9KVwiXG4gICAgICAgICAgPlx1MjcyODwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiB0aXRsZT1cIkRlbGV0ZVwiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIkRlbGV0ZSB0aGlzIGJ1bGxldFwiXG4gICAgICAgICAgb25jbGljaz1cImRlbGV0ZUFjaGlldmVtZW50KCR7ZXhwSWR4fSwke2FjaElkeH0pXCJcbiAgICAgICAgICBzdHlsZT1cImNvbG9yOiNlZjQ0NDQ7XCI+XHVEODNEXHVEREQxPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYDtcbiAgfSkuam9pbignJyk7XG59XG5cbi8vIERlYm91bmNlIHRpbWVyIGZvciBhdXRvLXBlcnNpc3RpbmcgYWNoaWV2ZW1lbnQgdGV4dCBlZGl0cy5cbmxldCBfYWNoUGVyc2lzdFRpbWVyID0gbnVsbDtcblxuZnVuY3Rpb24gdXBkYXRlQWNoaWV2ZW1lbnRUZXh0KGV4cElkeCwgYWNoSWR4LCB2YWx1ZSkge1xuICBpZiAoIXdpbmRvdy5hY2hpZXZlbWVudEVkaXRzW2V4cElkeF0pIHJldHVybjtcbiAgY29uc3QgZXhpc3RpbmcgPSBfbm9ybWFsaXplQWNoaWV2ZW1lbnRFZGl0RW50cnkod2luZG93LmFjaGlldmVtZW50RWRpdHNbZXhwSWR4XVthY2hJZHhdKTtcbiAgZXhpc3RpbmcudGV4dCA9IHZhbHVlO1xuICB3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0c1tleHBJZHhdW2FjaElkeF0gPSBleGlzdGluZztcblxuICAvLyBEZWJvdW5jZS1wZXJzaXN0IHNvIGVkaXRzIHN1cnZpdmUgdGFiIG5hdmlnYXRpb24gYW5kIHN0YXR1cyBwb2xsaW5nLlxuICBjbGVhclRpbWVvdXQoX2FjaFBlcnNpc3RUaW1lcik7XG4gIF9hY2hQZXJzaXN0VGltZXIgPSBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZmV0Y2goJy9hcGkvc2F2ZS1hY2hpZXZlbWVudC1lZGl0cycsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGVkaXRzOiB3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0cyB9KSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKF9lKSB7IC8qIHNpbGVudCBcdTIwMTQgdXNlciBzdGlsbCBoYXMgaW4tbWVtb3J5IHN0YXRlICovIH1cbiAgfSwgNTAwKTtcbn1cblxuZnVuY3Rpb24gdG9nZ2xlQWNoaWV2ZW1lbnRIaWRkZW4oZXhwSWR4LCBhY2hJZHgpIHtcbiAgaWYgKCF3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0c1tleHBJZHhdKSByZXR1cm47XG4gIGNvbnN0IGV4aXN0aW5nID0gX25vcm1hbGl6ZUFjaGlldmVtZW50RWRpdEVudHJ5KHdpbmRvdy5hY2hpZXZlbWVudEVkaXRzW2V4cElkeF1bYWNoSWR4XSk7XG4gIGV4aXN0aW5nLmhpZGRlbiA9ICFleGlzdGluZy5oaWRkZW47XG4gIHdpbmRvdy5hY2hpZXZlbWVudEVkaXRzW2V4cElkeF1bYWNoSWR4XSA9IGV4aXN0aW5nO1xuICByZW5kZXJBY2hpZXZlbWVudEVkaXRvclJvd3MoZXhwSWR4KTtcbn1cblxuZnVuY3Rpb24gbW92ZUFjaGlldmVtZW50KGV4cElkeCwgYWNoSWR4LCBkaXIpIHtcbiAgY29uc3QgYWNocyA9IHdpbmRvdy5hY2hpZXZlbWVudEVkaXRzW2V4cElkeF07XG4gIGlmICghYWNocykgcmV0dXJuO1xuICBjb25zdCBuZXdJZHggPSBhY2hJZHggKyBkaXI7XG4gIGlmIChuZXdJZHggPCAwIHx8IG5ld0lkeCA+PSBhY2hzLmxlbmd0aCkgcmV0dXJuO1xuICAvLyBGbHVzaCBjdXJyZW50IHRleHRhcmVhIHZhbHVlIGJlZm9yZSBtb3ZpbmdcbiAgY29uc3QgdGEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgYWNoLXRleHQtJHtleHBJZHh9LSR7YWNoSWR4fWApO1xuICBpZiAodGEpIHVwZGF0ZUFjaGlldmVtZW50VGV4dChleHBJZHgsIGFjaElkeCwgdGEudmFsdWUpO1xuICBbYWNoc1thY2hJZHhdLCBhY2hzW25ld0lkeF1dID0gW2FjaHNbbmV3SWR4XSwgYWNoc1thY2hJZHhdXTtcbiAgcmVuZGVyQWNoaWV2ZW1lbnRFZGl0b3JSb3dzKGV4cElkeCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUFjaGlldmVtZW50KGV4cElkeCwgYWNoSWR4KSB7XG4gIGNvbnN0IGFjaHMgPSB3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0c1tleHBJZHhdO1xuICBpZiAoIWFjaHMpIHJldHVybjtcbiAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgY29uZmlybURpYWxvZyhcbiAgICAnRGVsZXRlIHRoaXMgYnVsbGV0IGZyb20gdGhpcyBzZXNzaW9uPyBIaWRkZW4gYnVsbGV0cyByZW1haW4gYXZhaWxhYmxlIGZvciBsYXRlciBoYXJ2ZXN0LCBidXQgZGVsZXRlIHJlbW92ZXMgdGhlIGVkaXRlZCByb3cgZW50aXJlbHkuJyxcbiAgICB7IGNvbmZpcm1MYWJlbDogJ0RlbGV0ZScsIGNhbmNlbExhYmVsOiAnQ2FuY2VsJywgZGFuZ2VyOiB0cnVlIH0sXG4gICk7XG4gIGlmICghY29uZmlybWVkKSByZXR1cm47XG4gIGFjaHMuc3BsaWNlKGFjaElkeCwgMSk7XG4gIHJlbmRlckFjaGlldmVtZW50RWRpdG9yUm93cyhleHBJZHgpO1xufVxuXG5mdW5jdGlvbiBhZGRBY2hpZXZlbWVudFJvdyhleHBJZHgpIHtcbiAgaWYgKCF3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0c1tleHBJZHhdKSB3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0c1tleHBJZHhdID0gW107XG4gIHdpbmRvdy5hY2hpZXZlbWVudEVkaXRzW2V4cElkeF0ucHVzaCh7IHRleHQ6ICcnLCBoaWRkZW46IGZhbHNlIH0pO1xuICByZW5kZXJBY2hpZXZlbWVudEVkaXRvclJvd3MoZXhwSWR4KTtcbiAgLy8gRm9jdXMgdGhlIG5ldyB0ZXh0YXJlYVxuICBjb25zdCBuZXdJZHggPSB3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0c1tleHBJZHhdLmxlbmd0aCAtIDE7XG4gIGNvbnN0IHRhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYGFjaC10ZXh0LSR7ZXhwSWR4fS0ke25ld0lkeH1gKTtcbiAgaWYgKHRhKSB0YS5mb2N1cygpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXdyaXRlQWNoaWV2ZW1lbnRXaXRoTExNKGV4cElkeCwgYWNoSWR4KSB7XG4gIGNvbnN0IHRhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYGFjaC10ZXh0LSR7ZXhwSWR4fS0ke2FjaElkeH1gKTtcbiAgaWYgKCF0YSkgcmV0dXJuO1xuICBjb25zdCBvcmlnaW5hbFRleHQgPSB0YS52YWx1ZS50cmltKCk7XG4gIGlmICghb3JpZ2luYWxUZXh0KSB7IHNob3dUb2FzdCgnUGxlYXNlIGVudGVyIGEgYnVsbGV0IGZpcnN0LicsICdlcnJvcicpOyByZXR1cm47IH1cblxuICBfcmV3cml0ZVN1Z2dlc3Rpb25IaXN0b3J5ID0gW107XG4gIF9sYXN0UmV3cml0ZUxvZ0lkID0gbnVsbDtcbiAgX29wZW5SZXdyaXRlTW9kYWwob3JpZ2luYWxUZXh0LCAnJywgbnVsbCwge1xuICAgIGV4cGVyaWVuY2VJbmRleDogZXhwSWR4LFxuICAgIGFjaGlldmVtZW50SW5kZXg6IGFjaElkeCxcbiAgICBvbkFjY2VwdDogYXN5bmMgKHN1Z2dlc3Rpb24pID0+IHtcbiAgICAgIHVwZGF0ZUFjaGlldmVtZW50VGV4dChleHBJZHgsIGFjaElkeCwgc3VnZ2VzdGlvbik7XG4gICAgICBpZiAodGEpIHRhLnZhbHVlID0gc3VnZ2VzdGlvbjtcbiAgICAgIF9yZWNvcmRSZXdyaXRlT3V0Y29tZSgnYWNjZXB0ZWQnLCBzdWdnZXN0aW9uKTtcbiAgICAgIHNob3dUb2FzdCgnQnVsbGV0IHVwZGF0ZWQuJyk7XG4gICAgfSxcbiAgfSk7XG4gIGF3YWl0IF9ydW5SZXdyaXRlKG9yaWdpbmFsVGV4dCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGFpUmV3cml0ZVRvcExldmVsQWNoaWV2ZW1lbnQoYWNoSWQpIHtcbiAgY29uc3QgYWNoID0gKHdpbmRvdy5fYWNoaWV2ZW1lbnRzT3JkZXJlZCB8fCBbXSkuZmluZChhID0+IGEuaWQgPT09IGFjaElkKTtcbiAgaWYgKCFhY2gpIHJldHVybjtcbiAgY29uc3Qgb3JpZ2luYWxUZXh0ID0gYWNoLmRlc2NyaXB0aW9uIHx8ICcnO1xuICBpZiAoIW9yaWdpbmFsVGV4dCkgeyBzaG93VG9hc3QoJ1BsZWFzZSBlbnRlciBhIGRlc2NyaXB0aW9uIGZpcnN0LicsICdlcnJvcicpOyByZXR1cm47IH1cblxuICBfcmV3cml0ZVN1Z2dlc3Rpb25IaXN0b3J5ID0gW107XG4gIF9sYXN0UmV3cml0ZUxvZ0lkID0gbnVsbDtcbiAgX29wZW5SZXdyaXRlTW9kYWwob3JpZ2luYWxUZXh0LCAnJywgbnVsbCwge1xuICAgIGV4cGVyaWVuY2VJbmRleDogbnVsbCxcbiAgICBvbkFjY2VwdDogYXN5bmMgKHN1Z2dlc3Rpb24pID0+IHtcbiAgICAgIGF3YWl0IHNhdmVUb3BMZXZlbEFjaGlldmVtZW50RmllbGQoYWNoSWQsICdkZXNjcmlwdGlvbicsIHN1Z2dlc3Rpb24pO1xuICAgICAgY29uc3QgZGVzY0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYGFjaC1kZXNjLSR7Q1NTLmVzY2FwZShhY2hJZCl9YCk7XG4gICAgICBpZiAoZGVzY0VsKSBkZXNjRWwudmFsdWUgPSBzdWdnZXN0aW9uO1xuICAgICAgX3JlY29yZFJld3JpdGVPdXRjb21lKCdhY2NlcHRlZCcsIHN1Z2dlc3Rpb24pO1xuICAgICAgc2hvd1RvYXN0KCdBY2hpZXZlbWVudCB1cGRhdGVkLicpO1xuICAgIH0sXG4gIH0pO1xuICBhd2FpdCBfcnVuUmV3cml0ZShvcmlnaW5hbFRleHQpO1xufVxuXG5mdW5jdGlvbiBfb3BlblJld3JpdGVNb2RhbChvcmlnaW5hbFRleHQsIGN1cnJlbnRJbnN0cnVjdGlvbnMsIGN1cnJlbnRTdWdnZXN0aW9uLCBjYWxsYmFja3MpIHtcbiAgX3Jld3JpdGVDYWxsYmFja3MgPSBjYWxsYmFja3M7XG5cbiAgY29uc3Qgc3VnZ2VzdGVkSHRtbCA9IGN1cnJlbnRTdWdnZXN0aW9uICE9IG51bGxcbiAgICA/IGA8cCBpZD1cImFjaC1yZXdyaXRlLXN1Z2dlc3Rpb25cIiBzdHlsZT1cIm1hcmdpbjo0cHggMCAwO21pbi1oZWlnaHQ6Mi40ZW07XCI+JHtlc2NhcGVIdG1sKGN1cnJlbnRTdWdnZXN0aW9uKX08L3A+YFxuICAgIDogYDxwIGlkPVwiYWNoLXJld3JpdGUtc3VnZ2VzdGlvblwiIHN0eWxlPVwibWFyZ2luOjRweCAwIDA7bWluLWhlaWdodDoyLjRlbTtjb2xvcjojOWNhM2FmO2ZvbnQtc3R5bGU6aXRhbGljO1wiPlx1MjNGMyBHZW5lcmF0aW5nXHUyMDI2PC9wPmA7XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FsZXJ0LW1vZGFsLXRpdGxlJykudGV4dENvbnRlbnQgPSAnXHUyNzI4IEFJIFJld3JpdGUnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWxlcnQtbW9kYWwtbWVzc2FnZScpLmlubmVySFRNTCA9IGBcbiAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxMHB4O1wiPlxuICAgICAgPHN0cm9uZz5PcmlnaW5hbDo8L3N0cm9uZz5cbiAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDttYXJnaW46NHB4IDAgMDtmb250LXN0eWxlOml0YWxpYztmb250LXNpemU6MC45MmVtO1wiPiR7ZXNjYXBlSHRtbChvcmlnaW5hbFRleHQpfTwvcD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxMnB4O1wiPlxuICAgICAgPHN0cm9uZz5TdWdnZXN0ZWQ6PC9zdHJvbmc+XG4gICAgICAke3N1Z2dlc3RlZEh0bWx9XG4gICAgPC9kaXY+XG4gICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTZweDtcIj5cbiAgICAgIDxsYWJlbCBmb3I9XCJhY2gtcmV3cml0ZS1pbnN0cnVjdGlvbnNcIiBzdHlsZT1cImZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MC45MmVtO2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWJvdHRvbTo0cHg7XCI+SW5zdHJ1Y3Rpb25zIDxzcGFuIHN0eWxlPVwiZm9udC13ZWlnaHQ6NDAwO2NvbG9yOiM2YjcyODA7XCI+KG9wdGlvbmFsKTwvc3Bhbj48L2xhYmVsPlxuICAgICAgPHRleHRhcmVhIGlkPVwiYWNoLXJld3JpdGUtaW5zdHJ1Y3Rpb25zXCJcbiAgICAgICAgcm93cz1cIjJcIlxuICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gbWFrZSBpdCBtb3JlIGNvbmNpc2UsIGVtcGhhc2lzZSBsZWFkZXJzaGlwLCBhZGQgYSBtZXRyaWNcIlxuICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Ym94LXNpemluZzpib3JkZXItYm94O3BhZGRpbmc6NnB4IDhweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo2cHg7Zm9udC1zaXplOjAuOWVtO3Jlc2l6ZTp2ZXJ0aWNhbDtcIlxuICAgICAgPiR7ZXNjYXBlSHRtbChjdXJyZW50SW5zdHJ1Y3Rpb25zKX08L3RleHRhcmVhPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjhweDtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmQ7XCI+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLXNlY29uZGFyeVwiIGlkPVwiYWNoLXJld3JpdGUtcmVqZWN0LWJ0blwiIG9uY2xpY2s9XCJfcmVjb3JkUmV3cml0ZU91dGNvbWUoJ3JlamVjdGVkJyk7IGNsb3NlQWxlcnRNb2RhbCgpXCI+UmVqZWN0PC9idXR0b24+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLXNlY29uZGFyeVwiIGlkPVwiYWNoLXJld3JpdGUtZ2VuZXJhdGUtYnRuXCI+R2VuZXJhdGU8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJjb250aW51ZS1idG5cIiAgaWQ9XCJhY2gtcmV3cml0ZS1hY2NlcHQtYnRuXCI+QWNjZXB0PC9idXR0b24+XG4gICAgPC9kaXY+YDtcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWxlcnQtbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICBfZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIHNldEluaXRpYWxGb2N1cygnYWxlcnQtbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ2FsZXJ0LW1vZGFsLW92ZXJsYXknKTtcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLXJld3JpdGUtZ2VuZXJhdGUtYnRuJykub25jbGljayA9ICgpID0+IF9ydW5SZXdyaXRlKG9yaWdpbmFsVGV4dCk7XG5cbiAgX3VwZGF0ZVJld3JpdGVBY2NlcHRCdG4oY3VycmVudFN1Z2dlc3Rpb24pO1xufVxuXG5mdW5jdGlvbiBfdXBkYXRlUmV3cml0ZUFjY2VwdEJ0bihzdWdnZXN0aW9uKSB7XG4gIGNvbnN0IGFjY2VwdEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhY2gtcmV3cml0ZS1hY2NlcHQtYnRuJyk7XG4gIGlmICghYWNjZXB0QnRuKSByZXR1cm47XG4gIGFjY2VwdEJ0bi5kaXNhYmxlZCA9IHN1Z2dlc3Rpb24gPT0gbnVsbDtcbiAgYWNjZXB0QnRuLm9uY2xpY2sgPSBzdWdnZXN0aW9uID09IG51bGwgPyBudWxsIDogYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IF9yZXdyaXRlQ2FsbGJhY2tzLm9uQWNjZXB0KHN1Z2dlc3Rpb24pO1xuICAgIGNsb3NlQWxlcnRNb2RhbCgpO1xuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBfcmVjb3JkUmV3cml0ZU91dGNvbWUob3V0Y29tZSwgYWNjZXB0ZWRUZXh0KSB7XG4gIGlmICghX2xhc3RSZXdyaXRlTG9nSWQpIHJldHVybjtcbiAgY29uc3QgbG9nSWQgPSBfbGFzdFJld3JpdGVMb2dJZDtcbiAgX2xhc3RSZXdyaXRlTG9nSWQgPSBudWxsO1xuICBjb25zdCBib2R5ID0geyBsb2dfaWQ6IGxvZ0lkLCBvdXRjb21lIH07XG4gIGlmIChhY2NlcHRlZFRleHQgIT0gbnVsbCkgYm9keS5hY2NlcHRlZF90ZXh0ID0gYWNjZXB0ZWRUZXh0O1xuICB0cnkge1xuICAgIGF3YWl0IGZldGNoKCcvYXBpL3Jld3JpdGUtYWNoaWV2ZW1lbnQtb3V0Y29tZScsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSxcbiAgICB9KTtcbiAgfSBjYXRjaCAoXykgeyAvKiBmaXJlLWFuZC1mb3JnZXQgXHUyMDE0IGRvbid0IGRpc3J1cHQgdGhlIFVJICovIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gX3J1blJld3JpdGUob3JpZ2luYWxUZXh0KSB7XG4gIGNvbnN0IGluc3RydWN0aW9uc0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaC1yZXdyaXRlLWluc3RydWN0aW9ucycpO1xuICBjb25zdCB1c2VySW5zdHJ1Y3Rpb25zID0gaW5zdHJ1Y3Rpb25zRWwgPyBpbnN0cnVjdGlvbnNFbC52YWx1ZS50cmltKCkgOiAnJztcblxuICBjb25zdCBnZW5lcmF0ZUJ0biAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLXJld3JpdGUtZ2VuZXJhdGUtYnRuJyk7XG4gIGNvbnN0IGFjY2VwdEJ0biAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhY2gtcmV3cml0ZS1hY2NlcHQtYnRuJyk7XG4gIGNvbnN0IHJlamVjdEJ0biAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhY2gtcmV3cml0ZS1yZWplY3QtYnRuJyk7XG4gIGNvbnN0IHN1Z2dlc3Rpb25FbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhY2gtcmV3cml0ZS1zdWdnZXN0aW9uJyk7XG5cbiAgLy8gQ2FwdHVyZSB0aGUgY3VycmVudCBzdWdnZXN0aW9uIGFzIGEgcHJpb3IgYXR0ZW1wdCBiZWZvcmUgb3ZlcndyaXRpbmdcbiAgaWYgKHN1Z2dlc3Rpb25FbCkge1xuICAgIGNvbnN0IHByZXYgPSBzdWdnZXN0aW9uRWwudGV4dENvbnRlbnQudHJpbSgpO1xuICAgIGlmIChwcmV2ICYmIHByZXYgIT09ICdHZW5lcmF0aW5nXHUyMDI2JyAmJiAhcHJldi5zdGFydHNXaXRoKCdFcnJvcjonKSAmJiAhX3Jld3JpdGVTdWdnZXN0aW9uSGlzdG9yeS5pbmNsdWRlcyhwcmV2KSkge1xuICAgICAgX3Jld3JpdGVTdWdnZXN0aW9uSGlzdG9yeS5wdXNoKHByZXYpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChnZW5lcmF0ZUJ0bikgeyBnZW5lcmF0ZUJ0bi5kaXNhYmxlZCA9IHRydWU7IGdlbmVyYXRlQnRuLmlubmVySFRNTCA9ICc8c3BhbiBjbGFzcz1cImJ0bi1zcGlubmVyXCI+PC9zcGFuPkdlbmVyYXRpbmdcXHUyMDI2JzsgfVxuICBpZiAoYWNjZXB0QnRuKSAgIHsgYWNjZXB0QnRuLmRpc2FibGVkID0gdHJ1ZTsgfVxuICBpZiAoc3VnZ2VzdGlvbkVsKSB7IHN1Z2dlc3Rpb25FbC5zdHlsZS5jb2xvciA9ICcjOWNhM2FmJzsgc3VnZ2VzdGlvbkVsLnN0eWxlLmZvbnRTdHlsZSA9ICdpdGFsaWMnOyBzdWdnZXN0aW9uRWwudGV4dENvbnRlbnQgPSAnR2VuZXJhdGluZ1x1MjAyNic7IH1cblxuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3Jld3JpdGUtYWNoaWV2ZW1lbnQnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBhY2hpZXZlbWVudF90ZXh0OiAgICAgb3JpZ2luYWxUZXh0LFxuICAgICAgICBleHBlcmllbmNlX2luZGV4OiAgICAgX3Jld3JpdGVDYWxsYmFja3M/LmV4cGVyaWVuY2VJbmRleCA/PyBudWxsLFxuICAgICAgICBhY2hpZXZlbWVudF9pbmRleDogICAgX3Jld3JpdGVDYWxsYmFja3M/LmFjaGlldmVtZW50SW5kZXggPz8gbnVsbCxcbiAgICAgICAgdXNlcl9pbnN0cnVjdGlvbnM6ICAgIHVzZXJJbnN0cnVjdGlvbnMsXG4gICAgICAgIHByZXZpb3VzX3N1Z2dlc3Rpb25zOiBfcmV3cml0ZVN1Z2dlc3Rpb25IaXN0b3J5LFxuICAgICAgfSlcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoIXJlcy5vaykgdGhyb3cgbmV3IEVycm9yKGRhdGEuZXJyb3IgfHwgJ1Jld3JpdGUgZmFpbGVkJyk7XG5cbiAgICBjb25zdCByZXdyaXR0ZW4gPSBkYXRhLnJld3JpdHRlbiB8fCAnJztcbiAgICBfbGFzdFJld3JpdGVMb2dJZCA9IGRhdGEubG9nX2lkIHx8IG51bGw7XG4gICAgaWYgKHN1Z2dlc3Rpb25FbCkge1xuICAgICAgc3VnZ2VzdGlvbkVsLnN0eWxlLmNvbG9yID0gJyc7XG4gICAgICBzdWdnZXN0aW9uRWwuc3R5bGUuZm9udFN0eWxlID0gJyc7XG4gICAgICBzdWdnZXN0aW9uRWwudGV4dENvbnRlbnQgPSByZXdyaXR0ZW47XG4gICAgfVxuICAgIF91cGRhdGVSZXdyaXRlQWNjZXB0QnRuKHJld3JpdHRlbik7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChzdWdnZXN0aW9uRWwpIHsgc3VnZ2VzdGlvbkVsLnN0eWxlLmNvbG9yID0gJyNlZjQ0NDQnOyBzdWdnZXN0aW9uRWwuc3R5bGUuZm9udFN0eWxlID0gJyc7IHN1Z2dlc3Rpb25FbC50ZXh0Q29udGVudCA9IGBFcnJvcjogJHtlcnIubWVzc2FnZX1gOyB9XG4gICAgc2hvd1RvYXN0KGBBSSByZXdyaXRlIGZhaWxlZDogJHtlcnIubWVzc2FnZX1gLCAnZXJyb3InKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoZ2VuZXJhdGVCdG4pIHsgZ2VuZXJhdGVCdG4uZGlzYWJsZWQgPSBmYWxzZTsgZ2VuZXJhdGVCdG4udGV4dENvbnRlbnQgPSAnR2VuZXJhdGUnOyB9XG4gICAgaWYgKHJlamVjdEJ0bikgICB7IHJlamVjdEJ0bi5kaXNhYmxlZCA9IGZhbHNlOyB9XG4gIH1cbn1cblxuLyoqXG4gKiBTYXZlIGEgc2luZ2xlIGZpZWxkIG9mIGEgdG9wLWxldmVsIGFjaGlldmVtZW50IGluIHNlc3Npb24gc3RhdGUgYW5kIHVwZGF0ZSB0aGUgbG9jYWwgY2FjaGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNhdmVUb3BMZXZlbEFjaGlldmVtZW50RmllbGQoYWNoSWQsIGZpZWxkLCB2YWx1ZSkge1xuICBjb25zdCBhY2ggPSAod2luZG93Ll9hY2hpZXZlbWVudHNPcmRlcmVkIHx8IFtdKS5maW5kKGEgPT4gYS5pZCA9PT0gYWNoSWQpO1xuICBjb25zdCBwcmV2aW91cyA9IGFjaCA/IGFjaFtmaWVsZF0gOiB1bmRlZmluZWQ7XG4gIGlmIChhY2gpIGFjaFtmaWVsZF0gPSB2YWx1ZTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9yZXZpZXctYWNoaWV2ZW1lbnQnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBpZDogYWNoSWQsIGZpZWxkLCB2YWx1ZSB9KSxcbiAgICB9KTtcbiAgICBpZiAoIXJlcy5vaykgdGhyb3cgbmV3IEVycm9yKChhd2FpdCByZXMuanNvbigpKS5lcnJvciB8fCAnU2F2ZSBmYWlsZWQnKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gUm9sbCBiYWNrIHRoZSBvcHRpbWlzdGljIHVwZGF0ZVxuICAgIGlmIChhY2ggJiYgcHJldmlvdXMgIT09IHVuZGVmaW5lZCkgYWNoW2ZpZWxkXSA9IHByZXZpb3VzO1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZmllbGQgPT09ICd0aXRsZScgPyBgYWNoLXRpdGxlLSR7Q1NTLmVzY2FwZShhY2hJZCl9YCA6IGBhY2gtZGVzYy0ke0NTUy5lc2NhcGUoYWNoSWQpfWApO1xuICAgIGlmIChlbCkgZWwudmFsdWUgPSBwcmV2aW91cyA/PyAnJztcbiAgICBzaG93VG9hc3QoYEZhaWxlZCB0byBzYXZlIGFjaGlldmVtZW50OiAke2Vyci5tZXNzYWdlfWAsICdlcnJvcicpO1xuICB9XG59XG5cbi8qKlxuICogSGlkZSBhIHRvcC1sZXZlbCBhY2hpZXZlbWVudCBmb3IgdGhpcyBzZXNzaW9uIGFmdGVyIGNvbmZpcm1hdGlvbi5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGVsZXRlVG9wTGV2ZWxBY2hpZXZlbWVudChhY2hJZCkge1xuICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCBjb25maXJtRGlhbG9nKFxuICAgICdIaWRlIHRoaXMgYWNoaWV2ZW1lbnQgZm9yIHRoaXMgQ1Ygb25seT8gWW91IGNhbiByZXN0b3JlIGl0IGJ5IHN0YXJ0aW5nIG92ZXIgb3IgY2hhbmdpbmcgdGhlIHNlc3Npb24gc2VsZWN0aW9ucy4nLFxuICAgIHsgY29uZmlybUxhYmVsOiAnSGlkZScsIGNhbmNlbExhYmVsOiAnQ2FuY2VsJywgZGFuZ2VyOiB0cnVlIH0sXG4gICk7XG4gIGlmICghY29uZmlybWVkKSByZXR1cm47XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvcmV2aWV3LWFjaGlldmVtZW50Jywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgaWQ6IGFjaElkLCBhY3Rpb246ICdkZWxldGUnIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICB3aW5kb3cuX2FjaGlldmVtZW50c09yZGVyZWQgPSAod2luZG93Ll9hY2hpZXZlbWVudHNPcmRlcmVkIHx8IFtdKS5maWx0ZXIoYSA9PiBhLmlkICE9PSBhY2hJZCk7XG4gICAgICBkZWxldGUgd2luZG93LmFjaGlldmVtZW50RGVjaXNpb25zW2FjaElkXTtcbiAgICAgIF9yZW5kZXJBY2hpZXZlbWVudHNSZXZpZXdUYWJsZSgpO1xuICAgICAgc2hvd1RvYXN0KCdBY2hpZXZlbWVudCBoaWRkZW4gZm9yIHRoaXMgc2Vzc2lvbi4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2hvd1RvYXN0KGRhdGEuZXJyb3IgfHwgJ0RlbGV0ZSBmYWlsZWQuJywgJ2Vycm9yJyk7XG4gICAgfVxuICB9IGNhdGNoIChfKSB7XG4gICAgc2hvd1RvYXN0KCdGYWlsZWQgdG8gZGVsZXRlIGFjaGlldmVtZW50LicsICdlcnJvcicpO1xuICB9XG59XG5cbi8qKlxuICogU2F2ZSBhbiBlZGl0ZWQgZmllbGQgb24gYW4gQUktc3VnZ2VzdGVkIGFjaGlldmVtZW50IChpbi1tZW1vcnkgb25seTtcbiAqIHN1Z2dlc3Rpb25zIGFyZSBub3QgcGVyc2lzdGVkIHRvIHRoZSBzZXJ2ZXIgdW50aWwgYWNjZXB0ZWQpLlxuICovXG5mdW5jdGlvbiBzYXZlU3VnZ2VzdGVkQWNoaWV2ZW1lbnRGaWVsZChzdWdnSWQsIGZpZWxkLCB2YWx1ZSkge1xuICBjb25zdCBzdWdnID0gKHdpbmRvdy5fc3VnZ2VzdGVkQWNoc09yZGVyZWQgfHwgW10pLmZpbmQocyA9PiBzLl9zdWdnSWQgPT09IHN1Z2dJZCk7XG4gIGlmIChzdWdnKSBzdWdnW2ZpZWxkXSA9IHZhbHVlO1xufVxuXG4vKipcbiAqIE9wZW4gdGhlIEFJIHJld3JpdGUgbW9kYWwgZm9yIGEgc3VnZ2VzdGVkIGFjaGlldmVtZW50IGRlc2NyaXB0aW9uLlxuICovXG5hc3luYyBmdW5jdGlvbiBhaVJld3JpdGVTdWdnZXN0ZWRBY2hpZXZlbWVudChzdWdnSWQpIHtcbiAgY29uc3Qgc3VnZyA9ICh3aW5kb3cuX3N1Z2dlc3RlZEFjaHNPcmRlcmVkIHx8IFtdKS5maW5kKHMgPT4gcy5fc3VnZ0lkID09PSBzdWdnSWQpO1xuICBpZiAoIXN1Z2cpIHJldHVybjtcbiAgY29uc3Qgb3JpZ2luYWxUZXh0ID0gc3VnZy5kZXNjcmlwdGlvbiB8fCAnJztcbiAgaWYgKCFvcmlnaW5hbFRleHQpIHsgc2hvd1RvYXN0KCdQbGVhc2UgZW50ZXIgYSBkZXNjcmlwdGlvbiBmaXJzdC4nLCAnZXJyb3InKTsgcmV0dXJuOyB9XG5cbiAgX3Jld3JpdGVTdWdnZXN0aW9uSGlzdG9yeSA9IFtdO1xuICBfbGFzdFJld3JpdGVMb2dJZCA9IG51bGw7XG4gIF9vcGVuUmV3cml0ZU1vZGFsKG9yaWdpbmFsVGV4dCwgJycsIG51bGwsIHtcbiAgICBleHBlcmllbmNlSW5kZXg6IG51bGwsXG4gICAgb25BY2NlcHQ6IGFzeW5jIChzdWdnZXN0aW9uKSA9PiB7XG4gICAgICBzYXZlU3VnZ2VzdGVkQWNoaWV2ZW1lbnRGaWVsZChzdWdnSWQsICdkZXNjcmlwdGlvbicsIHN1Z2dlc3Rpb24pO1xuICAgICAgY29uc3QgZGVzY0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYGFjaC1kZXNjLSR7c3VnZ0lkfWApO1xuICAgICAgaWYgKGRlc2NFbCkgZGVzY0VsLnZhbHVlID0gc3VnZ2VzdGlvbjtcbiAgICAgIF9yZWNvcmRSZXdyaXRlT3V0Y29tZSgnYWNjZXB0ZWQnLCBzdWdnZXN0aW9uKTtcbiAgICAgIHNob3dUb2FzdCgnQWNoaWV2ZW1lbnQgdXBkYXRlZC4nKTtcbiAgICB9LFxuICB9KTtcbiAgYXdhaXQgX3J1blJld3JpdGUob3JpZ2luYWxUZXh0KTtcbn1cblxuLyoqXG4gKiBNb3ZlIGEgc3VnZ2VzdGVkIGFjaGlldmVtZW50IHVwIG9yIGRvd24gd2l0aGluIHRoZSBkaXNwbGF5IG9yZGVyLlxuICogU3RhYmxlIElEcyBtZWFuIG5vIGRlY2lzaW9uIHJlbWFwcGluZyBpcyBuZWVkZWQuXG4gKi9cbmZ1bmN0aW9uIG1vdmVTdWdnZXN0ZWRBY2hpZXZlbWVudFJvdyhzdWdnSWQsIGRpcmVjdGlvbikge1xuICBjb25zdCBhcnIgPSB3aW5kb3cuX3N1Z2dlc3RlZEFjaHNPcmRlcmVkO1xuICBpZiAoIWFycikgcmV0dXJuO1xuICBjb25zdCBpZHggPSBhcnIuZmluZEluZGV4KHMgPT4gcy5fc3VnZ0lkID09PSBzdWdnSWQpO1xuICBpZiAoaWR4IDwgMCkgcmV0dXJuO1xuICBjb25zdCBuZXdJZHggPSBpZHggKyBkaXJlY3Rpb247XG4gIGlmIChuZXdJZHggPCAwIHx8IG5ld0lkeCA+PSBhcnIubGVuZ3RoKSByZXR1cm47XG4gIFthcnJbaWR4XSwgYXJyW25ld0lkeF1dID0gW2FycltuZXdJZHhdLCBhcnJbaWR4XV07XG4gIF9yZW5kZXJBY2hpZXZlbWVudHNSZXZpZXdUYWJsZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoaWV2ZW1lbnRzLXRhYmxlLWNvbnRhaW5lcicpKTtcbn1cblxuLyoqXG4gKiBSZW1vdmUgYSBzdWdnZXN0ZWQgYWNoaWV2ZW1lbnQgZnJvbSB0aGUgbGlzdCBhZnRlciBjb25maXJtYXRpb24uXG4gKiBTdGFibGUgSURzIG1lYW4gbm8gb3RoZXIgZGVjaXNpb24ga2V5cyBuZWVkIHJlbWFwcGluZy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGVsZXRlU3VnZ2VzdGVkQWNoaWV2ZW1lbnQoc3VnZ0lkKSB7XG4gIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IGNvbmZpcm1EaWFsb2coJ1JlbW92ZSB0aGlzIEFJIHN1Z2dlc3Rpb24/JywgeyBjb25maXJtTGFiZWw6ICdSZW1vdmUnLCBkYW5nZXI6IHRydWUgfSk7XG4gIGlmICghY29uZmlybWVkKSByZXR1cm47XG4gIHdpbmRvdy5fc3VnZ2VzdGVkQWNoc09yZGVyZWQgPSAod2luZG93Ll9zdWdnZXN0ZWRBY2hzT3JkZXJlZCB8fCBbXSkuZmlsdGVyKHMgPT4gcy5fc3VnZ0lkICE9PSBzdWdnSWQpO1xuICBkZWxldGUgd2luZG93LmFjaGlldmVtZW50RGVjaXNpb25zW3N1Z2dJZF07XG4gIF9yZW5kZXJBY2hpZXZlbWVudHNSZXZpZXdUYWJsZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoaWV2ZW1lbnRzLXRhYmxlLWNvbnRhaW5lcicpKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZUFjaGlldmVtZW50RWRpdHNBbmRDb250aW51ZSgpIHtcbiAgdHJ5IHtcbiAgICAvLyBGbHVzaCBhbnkgY3VycmVudGx5LWZvY3VzZWQgdGV4dGFyZWFzXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2lkXj1cImFjaC10ZXh0LVwiXScpLmZvckVhY2godGEgPT4ge1xuICAgICAgY29uc3QgcGFydHMgPSB0YS5pZC5zcGxpdCgnLScpO1xuICAgICAgaWYgKHBhcnRzLmxlbmd0aCA+PSA0KSB7XG4gICAgICAgIGNvbnN0IGV4cElkeCA9IHBhcnNlSW50KHBhcnRzWzJdKTtcbiAgICAgICAgY29uc3QgYWNoSWR4ID0gcGFyc2VJbnQocGFydHNbM10pO1xuICAgICAgICBpZiAoIWlzTmFOKGV4cElkeCkgJiYgIWlzTmFOKGFjaElkeCkgJiYgd2luZG93LmFjaGlldmVtZW50RWRpdHNbZXhwSWR4XSkge1xuICAgICAgICAgIHVwZGF0ZUFjaGlldmVtZW50VGV4dChleHBJZHgsIGFjaElkeCwgdGEudmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9zYXZlLWFjaGlldmVtZW50LWVkaXRzJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgZWRpdHM6IHdpbmRvdy5hY2hpZXZlbWVudEVkaXRzIH0pXG4gICAgfSk7XG4gICAgaWYgKCFyZXMub2spIHtcbiAgICAgIGNvbnN0IGVyciA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBzaG93VG9hc3QoYEVycm9yIHNhdmluZzogJHtlcnIuZXJyb3IgfHwgJ1Vua25vd24gZXJyb3InfWAsICdlcnJvcicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzdGF0ZU1hbmFnZXIubWFya0NvbnRlbnRDaGFuZ2VkKCk7XG4gICAgc2hvd1RvYXN0KCdBY2hpZXZlbWVudCBlZGl0cyBzYXZlZC4nKTtcbiAgICBzd2l0Y2hUYWIoJ3NraWxscy1yZXZpZXcnKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dUb2FzdCgnRmFpbGVkIHRvIHNhdmUgYWNoaWV2ZW1lbnQgZWRpdHMuJywgJ2Vycm9yJyk7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgZmV0Y2hKc29uV2l0aFRpbWVvdXQsXG4gIF9hY2hWZXJiV2FybmluZyxcbiAgX2FjaFNuYXBzaG90S2V5LFxuICBfc2F2ZUFjaFNuYXBzaG90LFxuICBfZ2V0QWNoU25hcHNob3QsXG4gIGJ1aWxkQWNoaWV2ZW1lbnRzUmV2aWV3VGFibGUsXG4gIF9yZW5kZXJBY2hpZXZlbWVudHNSZXZpZXdUYWJsZSxcbiAgYnVsa0FjaGlldmVtZW50QWN0aW9uLFxuICBoYW5kbGVBY2hpZXZlbWVudEFjdGlvbixcbiAgc3VibWl0QWNoaWV2ZW1lbnREZWNpc2lvbnMsXG4gIG1vdmVBY2hpZXZlbWVudFJvdyxcbiAgYnVpbGRBY2hpZXZlbWVudHNFZGl0b3IsXG4gIHJlbmRlckFjaGlldmVtZW50RWRpdG9yUm93cyxcbiAgdXBkYXRlQWNoaWV2ZW1lbnRUZXh0LFxuICB0b2dnbGVBY2hpZXZlbWVudEhpZGRlbixcbiAgbW92ZUFjaGlldmVtZW50LFxuICBkZWxldGVBY2hpZXZlbWVudCxcbiAgYWRkQWNoaWV2ZW1lbnRSb3csXG4gIHJld3JpdGVBY2hpZXZlbWVudFdpdGhMTE0sXG4gIGFpUmV3cml0ZVRvcExldmVsQWNoaWV2ZW1lbnQsXG4gIF9vcGVuUmV3cml0ZU1vZGFsLFxuICBfdXBkYXRlUmV3cml0ZUFjY2VwdEJ0bixcbiAgX3JlY29yZFJld3JpdGVPdXRjb21lLFxuICBfcnVuUmV3cml0ZSxcbiAgc2F2ZVRvcExldmVsQWNoaWV2ZW1lbnRGaWVsZCxcbiAgZGVsZXRlVG9wTGV2ZWxBY2hpZXZlbWVudCxcbiAgc2F2ZVN1Z2dlc3RlZEFjaGlldmVtZW50RmllbGQsXG4gIGFpUmV3cml0ZVN1Z2dlc3RlZEFjaGlldmVtZW50LFxuICBtb3ZlU3VnZ2VzdGVkQWNoaWV2ZW1lbnRSb3csXG4gIGRlbGV0ZVN1Z2dlc3RlZEFjaGlldmVtZW50LFxuICBzYXZlQWNoaWV2ZW1lbnRFZGl0c0FuZENvbnRpbnVlLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL3RhZ2xpbmUtcmV2aWV3LmpzXG4gKiBBcHBsaWNhbnQgdGFnbGluZSAoaGVhZGxpbmUpIHJldmlldzogZGlzcGxheSBBSS1wcm9wb3NlZCB0YWdsaW5lLFxuICogYWxsb3cgZWRpdGluZywgcmVxdWlyZSBleHBsaWNpdCB1c2VyIGNvbmZpcm1hdGlvbiBiZWZvcmUgY29udGludWluZy5cbiAqXG4gKiBUaGUgdGFnbGluZSBpcyB0aGUgb25lLWxpbmUgcHJvZmVzc2lvbmFsIGlkZW50aXR5IHNob3duIHVuZGVyIHRoZVxuICogYXBwbGljYW50J3MgbmFtZSBvbiB0aGUgQ1YuICBJdCBpcyBOT1QgdGhlIHNhbWUgYXMgdGhlIGpvYiB0aXRsZSBcdTIwMTRcbiAqIGl0IGRlc2NyaWJlcyB0aGUgYXBwbGljYW50IChlLmcuIFwiU2VuaW9yIERhdGEgU2NpZW50aXN0IHNwZWNpYWxpc2luZ1xuICogaW4gYmlvc3RhdGlzdGljcyBhbmQgTUxcIiksIG5vdCB0aGUgcm9sZSBiZWluZyBhcHBsaWVkIGZvci5cbiAqXG4gKiBVc2VyIE1VU1QgY2xpY2sgXCJDb25maXJtIFRhZ2xpbmVcIiBiZWZvcmUgZ2VuZXJhdGlvbiBpcyBhbGxvd2VkLlxuICogVGhlIGNvbmZpcm1lZCB0ZXh0IGlzIHN0b3JlZCB2aWEgUE9TVCAvYXBpL3Jldmlldy1kZWNpc2lvbnMgKHR5cGU6ICd0YWdsaW5lJykuXG4gKlxuICogRGVwZW5kZW5jaWVzIChyZXNvbHZlZCB0aHJvdWdoIGdsb2JhbFRoaXMgYXQgcnVudGltZSk6XG4gKiAgIGVzY2FwZUh0bWwsIHNob3dUb2FzdCwgc3dpdGNoVGFiLCBzdGF0ZU1hbmFnZXJcbiAqL1xuXG5pbXBvcnQgeyBzdGF0ZU1hbmFnZXIgfSBmcm9tICcuL3N0YXRlLW1hbmFnZXIuanMnO1xuXG4vLyBcdTI1MDBcdTI1MDAgQnVpbGQgdGFnbGluZS1yZXZpZXcgc2VjdGlvbiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLyoqXG4gKiBkdWNrZmxvdzpcbiAqICAgaWQ6IHRhZ2xpbmVfdWlfYnVpbGRcbiAqICAga2luZDogdWlcbiAqICAgdGltZXN0YW1wOiBcIjIwMjYtMDUtMjhUMDA6MDA6MDBaXCJcbiAqICAgc3RhdHVzOiBsaXZlXG4gKiAgIGhhbmRsZXM6IFtcInVpOnRhZ2xpbmUtcmV2aWV3LmJ1aWxkXCJdXG4gKiAgIHJlYWRzOlxuICogICAgIC0gXCJ3aW5kb3c6cGVuZGluZ1JlY29tbWVuZGF0aW9uc1wiXG4gKiAgICAgLSBcInJlc3BvbnNlOkdFVCAvYXBpL3N0YXR1cy50YWdsaW5lX292ZXJyaWRlXCJcbiAqICAgICAtIFwicmVzcG9uc2U6R0VUIC9hcGkvc3RhdHVzLmRlY2lzaW9uc19jb25maXJtZWRcIlxuICogICB3cml0ZXM6IFtcImRvbTojdGFnbGluZS1yZXZpZXctY29udGFpbmVyXCJdXG4gKiAgIG5vdGVzOiBcIlJlbmRlcnMgcHJvcG9zZWQgdGFnbGluZSAoZnJvbSBMTE0gY3VzdG9taXphdGlvbnMpIHdpdGggYW4gZWRpdGFibGUgaW5wdXQgYW5kIGNvbmZpcm0gYnV0dG9uLlwiXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkVGFnbGluZVJldmlld1NlY3Rpb24oKSB7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWdsaW5lLXJldmlldy1jb250YWluZXInKTtcbiAgaWYgKCFjb250YWluZXIpIHJldHVybjtcblxuICAvLyBGZXRjaCBjdXJyZW50IHN0YXR1cyB0byBnZXQgdGFnbGluZV9vdmVycmlkZSArIHByb3Bvc2VkIHRhZ2xpbmVcbiAgbGV0IHByb3Bvc2VkVGFnbGluZSAgPSAnJztcbiAgbGV0IGNvbmZpcm1lZFRhZ2xpbmUgPSAnJztcbiAgbGV0IGFscmVhZHlDb25maXJtZWQgPSBmYWxzZTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgICA9IGF3YWl0IGZldGNoKCcvYXBpL3N0YXR1cycpO1xuICAgIGNvbnN0IHN0YXR1cyA9IHJlcy5vayA/IGF3YWl0IHJlcy5qc29uKCkgOiB7fTtcblxuICAgIC8vIHRhZ2xpbmVfb3ZlcnJpZGUgaXMgdGhlIHVzZXItY29uZmlybWVkIHZhbHVlIChtYXkgYmUgbnVsbClcbiAgICBjb25maXJtZWRUYWdsaW5lID0gc3RhdHVzLnRhZ2xpbmVfb3ZlcnJpZGUgfHwgJyc7XG4gICAgYWxyZWFkeUNvbmZpcm1lZCA9ICEhKHN0YXR1cy5kZWNpc2lvbnNfY29uZmlybWVkICYmIHN0YXR1cy5kZWNpc2lvbnNfY29uZmlybWVkLnRhZ2xpbmUpO1xuXG4gICAgLy8gUHJvcG9zZWQgdGFnbGluZSBmcm9tIHRoZSBMTE0gcmVjb21tZW5kYXRpb25zXG4gICAgY29uc3QgY3VzdG9taXphdGlvbnMgPSBzdGF0dXMuY3VzdG9taXphdGlvbnMgfHwge307XG4gICAgcHJvcG9zZWRUYWdsaW5lID0gY3VzdG9taXphdGlvbnMuYXBwbGljYW50X3RhZ2xpbmUgfHwgJyc7XG4gIH0gY2F0Y2ggKF9lKSB7XG4gICAgLy8gTmV0d29yayBmYWlsdXJlIFx1MjAxNCBsZWF2ZSBmaWVsZHMgZW1wdHksIHVzZXIgY2FuIHN0aWxsIHR5cGUgbWFudWFsbHlcbiAgfVxuXG4gIGNvbnN0IGluaXRpYWwgICA9IGNvbmZpcm1lZFRhZ2xpbmUgfHwgcHJvcG9zZWRUYWdsaW5lO1xuICBjb25zdCBzdGF0dXNNc2cgPSBhbHJlYWR5Q29uZmlybWVkXG4gICAgPyAnPHNwYW4gc3R5bGU9XCJjb2xvcjojMDY1ZjQ2O2ZvbnQtd2VpZ2h0OjYwMDtcIj5cdTI3MTMgQ29uZmlybWVkPC9zcGFuPidcbiAgICA6ICc8c3BhbiBzdHlsZT1cImNvbG9yOiM5MjQwMGU7XCI+UmVxdWlyZXMgeW91ciBjb25maXJtYXRpb24gYmVmb3JlIGdlbmVyYXRpbmc8L3NwYW4+JztcblxuICBjb250YWluZXIuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE2cHg7XCI+XG4gICAgICA8cCBzdHlsZT1cImNvbG9yOiMzNzQxNTE7Zm9udC1zaXplOjAuOTVlbTtsaW5lLWhlaWdodDoxLjY7bWFyZ2luOjAgMCA4cHg7XCI+XG4gICAgICAgIFRoZSA8c3Ryb25nPnRhZ2xpbmU8L3N0cm9uZz4gYXBwZWFycyBkaXJlY3RseSB1bmRlciB5b3VyIG5hbWUgb24gdGhlIENWLlxuICAgICAgICBJdCBzaG91bGQgZGVzY3JpYmUgPGVtPndobyB5b3UgYXJlPC9lbT4gYXMgYSBwcm9mZXNzaW9uYWwgXHUyMDE0IG5vdCB0aGUgam9iIHRpdGxlIHlvdSBhcmUgYXBwbHlpbmcgZm9yLlxuICAgICAgPC9wPlxuICAgICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO2ZvbnQtc2l6ZTowLjg1ZW07bWFyZ2luOjA7XCI+XG4gICAgICAgIEV4YW1wbGU6IDxlbT5cIlNlbmlvciBEYXRhIFNjaWVudGlzdCBzcGVjaWFsaXNpbmcgaW4gYmlvc3RhdGlzdGljcyBhbmQgbWFjaGluZSBsZWFybmluZ1wiPC9lbT5cbiAgICAgIDwvcD5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgc3R5bGU9XCJib3JkZXI6MXB4IHNvbGlkICNkMWZhZTU7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzoxNnB4O21hcmdpbi1ib3R0b206MjBweDtiYWNrZ3JvdW5kOiNmMGZkZjQ7XCI+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6OHB4O21hcmdpbi1ib3R0b206MTBweDtcIj5cbiAgICAgICAgPHN0cm9uZyBzdHlsZT1cImNvbG9yOiMwNjVmNDY7XCI+QXBwbGljYW50IFRhZ2xpbmU8L3N0cm9uZz5cbiAgICAgICAgPHNwYW4gaWQ9XCJ0YWdsaW5lLWNvbmZpcm0tc3RhdHVzXCIgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO1wiPiR7c3RhdHVzTXNnfTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8bGFiZWwgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjojMzc0MTUxO2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWJvdHRvbTo0cHg7XCJcbiAgICAgICAgICAgICBmb3I9XCJ0YWdsaW5lLWlucHV0XCI+XG4gICAgICAgIEVkaXQgdGFnbGluZSAocmVxdWlyZWQpOlxuICAgICAgPC9sYWJlbD5cbiAgICAgIDxpbnB1dCBpZD1cInRhZ2xpbmUtaW5wdXRcIiB0eXBlPVwidGV4dFwiXG4gICAgICAgIHZhbHVlPVwiJHtlc2NhcGVIdG1sKGluaXRpYWwpfVwiXG4gICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBTZW5pb3IgRGF0YSBTY2llbnRpc3Qgc3BlY2lhbGlzaW5nIGluIGJpb3N0YXRpc3RpY3MgYW5kIE1MXCJcbiAgICAgICAgc3R5bGU9XCJ3aWR0aDoxMDAlO2JveC1zaXppbmc6Ym9yZGVyLWJveDtwYWRkaW5nOjhweCAxMHB4O2JvcmRlcjoxcHggc29saWQgI2QxZDVkYjtib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6MC45NWVtO1wiXG4gICAgICAgIG9uaW5wdXQ9XCJvblRhZ2xpbmVJbnB1dENoYW5nZSgpXCIgLz5cblxuICAgICAgJHtwcm9wb3NlZFRhZ2xpbmUgJiYgcHJvcG9zZWRUYWdsaW5lICE9PSBjb25maXJtZWRUYWdsaW5lID8gYFxuICAgICAgPHAgc3R5bGU9XCJtYXJnaW46NnB4IDAgMDtmb250LXNpemU6MC44ZW07Y29sb3I6IzZiNzI4MDtcIj5cbiAgICAgICAgQUkgcHJvcG9zZWQ6IDxlbT4ke2VzY2FwZUh0bWwocHJvcG9zZWRUYWdsaW5lKX08L2VtPlxuICAgICAgICA8YnV0dG9uIG9uY2xpY2s9XCJyZXNldFRhZ2xpbmVUb1Byb3Bvc2VkKClcIiBzdHlsZT1cImJhY2tncm91bmQ6bm9uZTtib3JkZXI6bm9uZTtjdXJzb3I6cG9pbnRlcjtjb2xvcjojMjU2M2ViO2ZvbnQtc2l6ZTowLjhlbTtwYWRkaW5nOjAgNHB4O3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7XCI+VXNlIHRoaXM8L2J1dHRvbj5cbiAgICAgIDwvcD5gIDogJyd9XG5cbiAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOjEycHg7XCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJ0YWdsaW5lLWNvbmZpcm0tYnRuXCIgY2xhc3M9XCJzdWJtaXQtYnRuXCIgc3R5bGU9XCJmb250LXNpemU6MC45ZW07cGFkZGluZzo4cHggMjBweDtiYWNrZ3JvdW5kOiMxMGI5ODE7XCJcbiAgICAgICAgICBvbmNsaWNrPVwiY29uZmlybVRhZ2xpbmUoKVwiPlxuICAgICAgICAgIFx1MjcxMyBDb25maXJtIFRhZ2xpbmVcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgICR7YWxyZWFkeUNvbmZpcm1lZCA/ICc8c3BhbiBpZD1cInRhZ2xpbmUtY29uZmlybWVkLWJhZGdlXCIgc3R5bGU9XCJtYXJnaW4tbGVmdDoxMHB4O2ZvbnQtc2l6ZTowLjg1ZW07Y29sb3I6IzA2NWY0NjtcIj5TYXZlZCBcdTI3MTM8L3NwYW4+JyA6ICc8c3BhbiBpZD1cInRhZ2xpbmUtY29uZmlybWVkLWJhZGdlXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7bWFyZ2luLWxlZnQ6MTBweDtmb250LXNpemU6MC44NWVtO2NvbG9yOiMwNjVmNDY7XCI+U2F2ZWQgXHUyNzEzPC9zcGFuPid9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJuYXYtYnV0dG9uc1wiIHN0eWxlPVwibWFyZ2luLXRvcDoxNnB4O1wiPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImJhY2stYnRuXCIgb25jbGljaz1cInN3aXRjaFRhYignYWNoaWV2ZW1lbnRzLXJldmlldycpXCI+XHUyMTkwIEJhY2sgdG8gQWNoaWV2ZW1lbnRzPC9idXR0b24+XG4gICAgICA8YnV0dG9uIGlkPVwidGFnbGluZS1jb250aW51ZS1idG5cIiBjbGFzcz1cImNvbnRpbnVlLWJ0blwiXG4gICAgICAgIHN0eWxlPVwiJHthbHJlYWR5Q29uZmlybWVkID8gJycgOiAnb3BhY2l0eTowLjU7Y3Vyc29yOm5vdC1hbGxvd2VkOyd9XCJcbiAgICAgICAgb25jbGljaz1cInRhZ2xpbmVDb250aW51ZSgpXCJcbiAgICAgICAgJHthbHJlYWR5Q29uZmlybWVkID8gJycgOiAndGl0bGU9XCJQbGVhc2UgY29uZmlybSB0aGUgdGFnbGluZSBiZWZvcmUgY29udGludWluZ1wiJ30+XG4gICAgICAgIENvbnRpbnVlIHRvIFN1bW1hcnkgXHUyMTkyXG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5gO1xuXG4gIC8vIEV4cG9zZSBwcm9wb3NlZCB0YWdsaW5lIGZvciB0aGUgcmVzZXQgYnV0dG9uXG4gIHdpbmRvdy5fcHJvcG9zZWRUYWdsaW5lID0gcHJvcG9zZWRUYWdsaW5lO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgSW5wdXQgY2hhbmdlIGhhbmRsZXIgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIG9uVGFnbGluZUlucHV0Q2hhbmdlKCkge1xuICAvLyBXaGVuIHVzZXIgZWRpdHMgdGhlIHRleHQsIHVuLWNvbmZpcm0gdGhlIHByZXZpb3VzIHNhdmUgc28gdGhleSBtdXN0IHJlLWNvbmZpcm1cbiAgY29uc3QgYmFkZ2UgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWdsaW5lLWNvbmZpcm1lZC1iYWRnZScpO1xuICBjb25zdCBzdGF0dXNTcGFuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhZ2xpbmUtY29uZmlybS1zdGF0dXMnKTtcbiAgaWYgKGJhZGdlKSAgICAgIGJhZGdlLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIGlmIChzdGF0dXNTcGFuKSBzdGF0dXNTcGFuLmlubmVySFRNTCA9ICc8c3BhbiBzdHlsZT1cImNvbG9yOiM5MjQwMGU7XCI+UmVxdWlyZXMgeW91ciBjb25maXJtYXRpb24gYmVmb3JlIGdlbmVyYXRpbmc8L3NwYW4+JztcbiAgY29uc3QgY29udGludWVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFnbGluZS1jb250aW51ZS1idG4nKTtcbiAgaWYgKGNvbnRpbnVlQnRuKSB7XG4gICAgY29udGludWVCdG4uc3R5bGUub3BhY2l0eSAgICAgICA9ICcwLjUnO1xuICAgIGNvbnRpbnVlQnRuLnN0eWxlLmN1cnNvciAgICAgICAgPSAnbm90LWFsbG93ZWQnO1xuICAgIGNvbnRpbnVlQnRuLnRpdGxlICAgICAgICAgICAgICAgPSAnUGxlYXNlIGNvbmZpcm0gdGhlIHRhZ2xpbmUgYmVmb3JlIGNvbnRpbnVpbmcnO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBSZXNldCB0byBBSS1wcm9wb3NlZCB0YWdsaW5lIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiByZXNldFRhZ2xpbmVUb1Byb3Bvc2VkKCkge1xuICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWdsaW5lLWlucHV0Jyk7XG4gIGlmIChpbnB1dCAmJiB3aW5kb3cuX3Byb3Bvc2VkVGFnbGluZSkge1xuICAgIGlucHV0LnZhbHVlID0gd2luZG93Ll9wcm9wb3NlZFRhZ2xpbmU7XG4gICAgb25UYWdsaW5lSW5wdXRDaGFuZ2UoKTtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgQ29uZmlybSBhbmQgcGVyc2lzdCB0YWdsaW5lIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4vKipcbiAqIGR1Y2tmbG93OlxuICogICBpZDogdGFnbGluZV91aV9jb25maXJtXG4gKiAgIGtpbmQ6IHVpXG4gKiAgIHRpbWVzdGFtcDogXCIyMDI2LTA1LTI4VDAwOjAwOjAwWlwiXG4gKiAgIHN0YXR1czogbGl2ZVxuICogICBoYW5kbGVzOiBbXCJ1aTp0YWdsaW5lLXJldmlldy5jb25maXJtXCJdXG4gKiAgIGNhbGxzOiBbXCJQT1NUIC9hcGkvcmV2aWV3LWRlY2lzaW9uc1wiXVxuICogICByZWFkczogW1wiZG9tOiN0YWdsaW5lLWlucHV0XCJdXG4gKiAgIHdyaXRlczpcbiAqICAgICAtIFwicmVxdWVzdDpQT1NUIC9hcGkvcmV2aWV3LWRlY2lzaW9ucy50eXBlPXRhZ2xpbmVcIlxuICogICAgIC0gXCJyZXF1ZXN0OlBPU1QgL2FwaS9yZXZpZXctZGVjaXNpb25zLmRlY2lzaW9uc1wiXG4gKiAgIG5vdGVzOiBcIlBPU1RzIHRoZSBjb25maXJtZWQgdGFnbGluZSB0ZXh0OyBlbmFibGVzIHRoZSBjb250aW51ZSBidXR0b24gb24gc3VjY2Vzcy5cIlxuICovXG5hc3luYyBmdW5jdGlvbiBjb25maXJtVGFnbGluZSgpIHtcbiAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFnbGluZS1pbnB1dCcpO1xuICBpZiAoIWlucHV0KSByZXR1cm47XG5cbiAgY29uc3QgdGFnbGluZVRleHQgPSBpbnB1dC52YWx1ZS50cmltKCk7XG4gIGlmICghdGFnbGluZVRleHQpIHtcbiAgICBzaG93VG9hc3QoJ1BsZWFzZSBlbnRlciBhIHRhZ2xpbmUgYmVmb3JlIGNvbmZpcm1pbmcuJywgJ2Vycm9yJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhZ2xpbmUtY29uZmlybS1idG4nKTtcbiAgaWYgKGJ0bikgYnRuLmRpc2FibGVkID0gdHJ1ZTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvcmV2aWV3LWRlY2lzaW9ucycsIHtcbiAgICAgIG1ldGhvZDogICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogICAgSlNPTi5zdHJpbmdpZnkoeyB0eXBlOiAndGFnbGluZScsIGRlY2lzaW9uczogdGFnbGluZVRleHQgfSksXG4gICAgfSk7XG5cbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICBjb25zdCBlcnIgPSBhd2FpdCByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSk7XG4gICAgICBzaG93VG9hc3QoYEZhaWxlZCB0byBzYXZlIHRhZ2xpbmU6ICR7ZXJyLmVycm9yIHx8IHJlc3BvbnNlLnN0YXR1c1RleHR9YCwgJ2Vycm9yJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIFVJIHRvIHNob3cgY29uZmlybWVkIHN0YXRlXG4gICAgY29uc3QgYmFkZ2UgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWdsaW5lLWNvbmZpcm1lZC1iYWRnZScpO1xuICAgIGNvbnN0IHN0YXR1c1NwYW4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFnbGluZS1jb25maXJtLXN0YXR1cycpO1xuICAgIGlmIChiYWRnZSkgICAgICB7IGJhZGdlLnN0eWxlLmRpc3BsYXkgPSAnJzsgfVxuICAgIGlmIChzdGF0dXNTcGFuKSB7IHN0YXR1c1NwYW4uaW5uZXJIVE1MID0gJzxzcGFuIHN0eWxlPVwiY29sb3I6IzA2NWY0Njtmb250LXdlaWdodDo2MDA7XCI+XHUyNzEzIENvbmZpcm1lZDwvc3Bhbj4nOyB9XG5cbiAgICBjb25zdCBjb250aW51ZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWdsaW5lLWNvbnRpbnVlLWJ0bicpO1xuICAgIGlmIChjb250aW51ZUJ0bikge1xuICAgICAgY29udGludWVCdG4uc3R5bGUub3BhY2l0eSA9ICcnO1xuICAgICAgY29udGludWVCdG4uc3R5bGUuY3Vyc29yICA9ICcnO1xuICAgICAgY29udGludWVCdG4udGl0bGUgICAgICAgICA9ICcnO1xuICAgIH1cblxuICAgIHN0YXRlTWFuYWdlci5tYXJrQ29udGVudENoYW5nZWQoKTtcbiAgICBzaG93VG9hc3QoJ1RhZ2xpbmUgY29uZmlybWVkLicpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgc2hvd1RvYXN0KCdOZXR3b3JrIGVycm9yIHNhdmluZyB0YWdsaW5lLicsICdlcnJvcicpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChidG4pIGJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBDb250aW51ZSBuYXZpZ2F0aW9uIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiB0YWdsaW5lQ29udGludWUoKSB7XG4gIC8vIEd1YXJkOiBtdXN0IGJlIGNvbmZpcm1lZCBiZWZvcmUgcHJvY2VlZGluZ1xuICBjb25zdCBjb250aW51ZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWdsaW5lLWNvbnRpbnVlLWJ0bicpO1xuICBpZiAoY29udGludWVCdG4gJiYgY29udGludWVCdG4uc3R5bGUuY3Vyc29yID09PSAnbm90LWFsbG93ZWQnKSB7XG4gICAgc2hvd1RvYXN0KCdQbGVhc2UgY29uZmlybSB0aGUgdGFnbGluZSBiZWZvcmUgY29udGludWluZy4nLCAnZXJyb3InKTtcbiAgICByZXR1cm47XG4gIH1cbiAgc3dpdGNoVGFiKCdzdW1tYXJ5LXJldmlldycpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgRXhwb3J0cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZXhwb3J0IHtcbiAgYnVpbGRUYWdsaW5lUmV2aWV3U2VjdGlvbixcbiAgb25UYWdsaW5lSW5wdXRDaGFuZ2UsXG4gIHJlc2V0VGFnbGluZVRvUHJvcG9zZWQsXG4gIGNvbmZpcm1UYWdsaW5lLFxuICB0YWdsaW5lQ29udGludWUsXG59O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvc3VtbWFyeS1yZXZpZXcuanNcbiAqIFN1bW1hcnktZm9jdXMgc2VsZWN0aW9uOiBBSSBnZW5lcmF0aW9uLCBzdG9yZWQgdmFyaWFudHMsIHN1Ym1pdCBkZWNpc2lvbi5cbiAqXG4gKiBEZXBlbmRlbmNpZXMgKHJlc29sdmVkIHRocm91Z2ggZ2xvYmFsVGhpcyBhdCBydW50aW1lKTpcbiAqICAgcGVuZGluZ1JlY29tbWVuZGF0aW9ucywgc2VsZWN0ZWRTdW1tYXJ5S2V5LCBfYWlHZW5lcmF0ZWRTdW1tYXJ5LFxuICogICBlc2NhcGVIdG1sLCBzaG93VG9hc3QsIHN3aXRjaFRhYiwgc2V0TG9hZGluZywgc2NoZWR1bGVBdHNSZWZyZXNoXG4gKi9cblxuaW1wb3J0IHsgc3RhdGVNYW5hZ2VyIH0gZnJvbSAnLi9zdGF0ZS1tYW5hZ2VyLmpzJztcblxuLy8gXHUyNTAwXHUyNTAwIEJ1aWxkIHN1bW1hcnktZm9jdXMgc2VjdGlvbiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLyoqXG4gKiBkdWNrZmxvdzpcbiAqICAgaWQ6IHN1bW1hcnlfdWlfYnVpbGRcbiAqICAga2luZDogdWlcbiAqICAgdGltZXN0YW1wOiBcIjIwMjYtMDMtMjdUMDE6MjM6MjhaXCJcbiAqICAgc3RhdHVzOiBzaGFyZWRcbiAqICAgaGFuZGxlczogW1widWk6c3VtbWFyeS1yZXZpZXcuYnVpbGRcIl1cbiAqICAgY2FsbHM6IFtcIkdFVCAvYXBpL21hc3Rlci1maWVsZHNcIiwgXCJHRVQgL2FwaS9zdGF0dXNcIiwgXCJ1aTpzdW1tYXJ5LXJldmlldy5nZW5lcmF0ZVwiXVxuICogICByZWFkczpcbiAqICAgICAtIFwid2luZG93OnBlbmRpbmdSZWNvbW1lbmRhdGlvbnNcIlxuICogICAgIC0gXCJyZXNwb25zZTpHRVQgL2FwaS9tYXN0ZXItZmllbGRzLnByb2Zlc3Npb25hbF9zdW1tYXJpZXNcIlxuICogICAgIC0gXCJyZXNwb25zZTpHRVQgL2FwaS9zdGF0dXMucHJvZmVzc2lvbmFsX3N1bW1hcmllc1wiXG4gKiAgICAgLSBcInN0YXRlOnNlc3Npb25fc3VtbWFyaWVzLmFpX2dlbmVyYXRlZFwiXG4gKiAgIHdyaXRlczogW1wiZG9tOiNzdW1tYXJ5LWZvY3VzLWNvbnRhaW5lclwiLCBcIndpbmRvdzpzZWxlY3RlZFN1bW1hcnlLZXlcIl1cbiAqICAgbm90ZXM6IFwiQnVpbGRzIHRoZSBzdW1tYXJ5IHJldmlldyBVSSBmcm9tIG1hc3RlciB2YXJpYW50cyBwbHVzIHNlc3Npb24gb3ZlcnJpZGVzIGFuZCBzZWVkcyB0aGUgc2VsZWN0ZWQga2V5LlwiXG4gKi9cblxuYXN5bmMgZnVuY3Rpb24gYnVpbGRTdW1tYXJ5Rm9jdXNTZWN0aW9uKCkge1xuICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3VtbWFyeS1mb2N1cy1jb250YWluZXInKTtcbiAgaWYgKCFjb250YWluZXIpIHJldHVybjtcblxuICBjb25zdCBkYXRhID0gd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnM7XG5cbiAgLy8gXHUyNTAwXHUyNTAwIExvYWQgYWxsIGtub3duIHN1bW1hcmllcyAobWFzdGVyIGJhc2UgKyBzZXNzaW9uIG92ZXJyaWRlcykgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIC8vIEZldGNoIG1hc3RlciBmaWVsZHMgYW5kIHN0YXR1cyBpbiBwYXJhbGxlbDsgc2Vzc2lvbiBzdW1tYXJpZXMgb3ZlcndyaXRlIG1hc3RlciB2YXJpYW50cy5cbiAgbGV0IHByb2Zlc3Npb25hbFN1bW1hcmllcyA9IHt9O1xuICBjb25zdCBbbWZSZXN1bHQsIHN0YXR1c1Jlc3VsdF0gPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoW1xuICAgIGZldGNoKCcvYXBpL21hc3Rlci1maWVsZHMnKS50aGVuKHIgPT4gci5qc29uKCkpLFxuICAgIGZldGNoKCcvYXBpL3N0YXR1cycpLnRoZW4ociA9PiByLmpzb24oKSksXG4gIF0pO1xuICBpZiAobWZSZXN1bHQuc3RhdHVzID09PSAnZnVsZmlsbGVkJyAmJiBtZlJlc3VsdC52YWx1ZSAmJiBtZlJlc3VsdC52YWx1ZS5vaykge1xuICAgIE9iamVjdC5hc3NpZ24ocHJvZmVzc2lvbmFsU3VtbWFyaWVzLCBtZlJlc3VsdC52YWx1ZS5wcm9mZXNzaW9uYWxfc3VtbWFyaWVzIHx8IHt9KTtcbiAgfVxuICBpZiAoc3RhdHVzUmVzdWx0LnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcgJiYgc3RhdHVzUmVzdWx0LnZhbHVlKSB7XG4gICAgLy8gU2Vzc2lvbiBzdW1tYXJpZXMgKGUuZy4gYWlfZ2VuZXJhdGVkKSBvdmVyd3JpdGUgbWFzdGVyIHZhcmlhbnRzXG4gICAgT2JqZWN0LmFzc2lnbihwcm9mZXNzaW9uYWxTdW1tYXJpZXMsIHN0YXR1c1Jlc3VsdC52YWx1ZS5wcm9mZXNzaW9uYWxfc3VtbWFyaWVzIHx8IHt9KTtcbiAgfVxuXG4gIC8vIFx1MjUwMFx1MjUwMCBTdWdnZXN0ZWQgY29udGVudCByZW9yZGVyaW5nIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICBjb25zdCByZW9yZGVyaW5nVGV4dCA9IChkYXRhICYmIGRhdGEuc3VnZ2VzdGVkX2NvbnRlbnRfcmVvcmRlcmluZykgfHwgJyc7XG4gIGNvbnN0IHJlb3JkZXJpbmdIVE1MID0gcmVvcmRlcmluZ1RleHRcbiAgICA/IGA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZWZmNmZmO2JvcmRlcjoxcHggc29saWQgI2JmZGJmZTtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjEycHg7bWFyZ2luLWJvdHRvbToxNnB4O1wiPlxuICAgICAgICA8c3Ryb25nIHN0eWxlPVwiY29sb3I6IzFlNDBhZjtcIj5cdUQ4M0RcdURDQ0IgU3VnZ2VzdGVkIENvbnRlbnQgT3JkZXI6PC9zdHJvbmc+XG4gICAgICAgIDxwIHN0eWxlPVwibWFyZ2luOjZweCAwIDA7Y29sb3I6IzFlM2E4YTtmb250LXNpemU6MC45ZW07d2hpdGUtc3BhY2U6cHJlLWxpbmU7XCI+JHtlc2NhcGVIdG1sKHJlb3JkZXJpbmdUZXh0KX08L3A+XG4gICAgICAgPC9kaXY+YFxuICAgIDogJyc7XG5cbiAgLy8gXHUyNTAwXHUyNTAwIFJlbmRlciBza2VsZXRvbiB3aGlsZSB3ZSBnZW5lcmF0ZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgY29udGFpbmVyLmlubmVySFRNTCA9IGBcbiAgICAke3Jlb3JkZXJpbmdIVE1MfVxuICAgIDxkaXYgaWQ9XCJhaS1zdW1tYXJ5LXBhbmVsXCIgc3R5bGU9XCJib3JkZXI6MXB4IHNvbGlkICNkMWZhZTU7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzoxNnB4O21hcmdpbi1ib3R0b206MjBweDtiYWNrZ3JvdW5kOiNmMGZkZjQ7XCI+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6OHB4O21hcmdpbi1ib3R0b206MTBweDtcIj5cbiAgICAgICAgPHN0cm9uZyBzdHlsZT1cImNvbG9yOiMwNjVmNDY7XCI+XHVEODNFXHVERDE2IEFJLVByb3Bvc2VkIFN1bW1hcnk8L3N0cm9uZz5cbiAgICAgICAgPHNwYW4gaWQ9XCJhaS1zdW1tYXJ5LXN0YXR1c1wiIHN0eWxlPVwiZm9udC1zaXplOjAuOGVtO2NvbG9yOiM2YjcyODA7XCI+R2VuZXJhdGluZ1x1MjAyNjwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBpZD1cImFpLXN1bW1hcnktbG9hZGluZ1wiIHN0eWxlPVwiZm9udC1zaXplOjAuOWVtO2NvbG9yOiM5Y2EzYWY7bWluLWhlaWdodDo0MHB4O1wiPjxlbT5HZW5lcmF0aW5nIGEgdGFpbG9yZWQgc3VtbWFyeSBmb3IgdGhpcyBhcHBsaWNhdGlvblx1MjAyNjwvZW0+PC9kaXY+XG4gICAgICA8dGV4dGFyZWEgaWQ9XCJhaS1zdW1tYXJ5LXRleHRcIiByb3dzPVwiN1wiIG9uaW5wdXQ9XCJvblN1bW1hcnlUZXh0Q2hhbmdlKClcIlxuICAgICAgICBwbGFjZWhvbGRlcj1cIkdlbmVyYXRpbmdcdTIwMjZcIlxuICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Ym94LXNpemluZzpib3JkZXItYm94O3BhZGRpbmc6OHB4O2JvcmRlcjoxcHggc29saWQgI2QxZDVkYjtib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6MC45ZW07bGluZS1oZWlnaHQ6MS42O3Jlc2l6ZTp2ZXJ0aWNhbDtkaXNwbGF5Om5vbmU7XCI+PC90ZXh0YXJlYT5cbiAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOjEycHg7XCI+XG4gICAgICAgIDxsYWJlbCBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOiMzNzQxNTE7ZGlzcGxheTpibG9jazttYXJnaW4tYm90dG9tOjRweDtcIj5SZXF1ZXN0IGNoYW5nZXMgKG9wdGlvbmFsKTo8L2xhYmVsPlxuICAgICAgICA8dGV4dGFyZWEgaWQ9XCJzdW1tYXJ5LXJlZmluZW1lbnQtaW5wdXRcIiByb3dzPVwiMlwiXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuICdNYWtlIGl0IG1vcmUgY29uY2lzZScsICdFbXBoYXNpc2UgbXkgbGVhZGVyc2hpcCBleHBlcmllbmNlJywgJ1VzZSBhIG1vcmUgZm9ybWFsIHRvbmUnXHUyMDI2XCJcbiAgICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Ym94LXNpemluZzpib3JkZXItYm94O3BhZGRpbmc6OHB4O2JvcmRlcjoxcHggc29saWQgI2QxZDVkYjtib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6MC44NWVtO3Jlc2l6ZTp2ZXJ0aWNhbDtcIj48L3RleHRhcmVhPlxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDo4cHg7ZGlzcGxheTpmbGV4O2dhcDo4cHg7ZmxleC13cmFwOndyYXA7XCI+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImFpLXJlZ2VuZXJhdGUtYnRuXCIgY2xhc3M9XCJzdWJtaXQtYnRuXCIgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO3BhZGRpbmc6NnB4IDE0cHg7XCJcbiAgICAgICAgICAgIG9uY2xpY2s9XCJyZWdlbmVyYXRlQUlTdW1tYXJ5KClcIj5SZWdlbmVyYXRlPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInN1Ym1pdC1idG5cIiBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07cGFkZGluZzo2cHggMTRweDtiYWNrZ3JvdW5kOiMxMGI5ODE7XCJcbiAgICAgICAgICAgIG9uY2xpY2s9XCJ1c2VBSVN1bW1hcnkoKVwiPlVzZSBUaGlzIFN1bW1hcnk8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGlkPVwic3VtbWFyeS1zdG9yZWQtc2VjdGlvblwiPlxuICAgICAgPGRldGFpbHMgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjhweDtcIj5cbiAgICAgICAgPHN1bW1hcnkgc3R5bGU9XCJjdXJzb3I6cG9pbnRlcjtmb250LXNpemU6MC44NWVtO2NvbG9yOiM2YjcyODA7dXNlci1zZWxlY3Q6bm9uZTtcIj5cbiAgICAgICAgICBVc2UgYSBzdG9yZWQgc3VtbWFyeSB2YXJpYW50IGluc3RlYWRcbiAgICAgICAgPC9zdW1tYXJ5PlxuICAgICAgICA8ZGl2IGlkPVwic3VtbWFyeS1yYWRpb3NcIiBzdHlsZT1cIm1hcmdpbi10b3A6MTBweDtcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6OHB4O1wiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzdWJtaXQtYnRuXCIgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO3BhZGRpbmc6NnB4IDE0cHg7XCJcbiAgICAgICAgICAgIG9uY2xpY2s9XCJzdWJtaXRTdW1tYXJ5Rm9jdXNEZWNpc2lvbigpXCI+VXNlIFNlbGVjdGVkIFN0b3JlZCBTdW1tYXJ5PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kZXRhaWxzPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJuYXYtYnV0dG9uc1wiIHN0eWxlPVwibWFyZ2luLXRvcDoxNnB4O1wiPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImJhY2stYnRuXCIgb25jbGljaz1cInN3aXRjaFRhYigndGFnbGluZS1yZXZpZXcnKVwiPlx1MjE5MCBCYWNrIHRvIFRhZ2xpbmU8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJjb250aW51ZS1idG5cIiBvbmNsaWNrPVwic3VibWl0U3VtbWFyeUZvY3VzRGVjaXNpb24oKVwiPkNvbnRpbnVlIHRvIFB1YmxpY2F0aW9ucyBcdTIxOTI8L2J1dHRvbj5cbiAgICA8L2Rpdj5gO1xuXG4gIC8vIFJlbmRlciBzdG9yZWQgc3VtbWFyaWVzIGluIHRoZSBjb2xsYXBzaWJsZSBzZWN0aW9uXG4gIF9yZW5kZXJTdG9yZWRTdW1tYXJ5UmFkaW9zKHByb2Zlc3Npb25hbFN1bW1hcmllcyk7XG5cbiAgLy8gXHUyNTAwXHUyNTAwIEF1dG8tZ2VuZXJhdGUgb3IgbG9hZCBjYWNoZWQgQUkgc3VtbWFyeSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgY29uc3QgY2FjaGVkU3VtbWFyeSA9IHByb2Zlc3Npb25hbFN1bW1hcmllc1snYWlfZ2VuZXJhdGVkJ10gfHwgJyc7XG4gIGlmIChjYWNoZWRTdW1tYXJ5KSB7XG4gICAgX3Nob3dBSVN1bW1hcnkoY2FjaGVkU3VtbWFyeSwgJyhjYWNoZWQgXHUyMDE0IGNsaWNrIFJlZ2VuZXJhdGUgdG8gcmVmcmVzaCknKTtcbiAgICB3aW5kb3cuc2VsZWN0ZWRTdW1tYXJ5S2V5ID0gJ2FpX2dlbmVyYXRlZCc7XG4gICAgYXdhaXQgc2F2ZVN1bW1hcnlGb2N1c1RvQmFja2VuZCgnYWlfZ2VuZXJhdGVkJyk7XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgX2NhbGxHZW5lcmF0ZVN1bW1hcnkobnVsbCwgbnVsbCk7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIFJlbmRlciBzdG9yZWQgc3VtbWFyeSByYWRpbyBidXR0b25zIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBfcmVuZGVyU3RvcmVkU3VtbWFyeVJhZGlvcyhwcm9mZXNzaW9uYWxTdW1tYXJpZXMpIHtcbiAgY29uc3QgcmFkaW9zQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1bW1hcnktcmFkaW9zJyk7XG4gIGlmICghcmFkaW9zQ29udGFpbmVyKSByZXR1cm47XG4gIGNvbnN0IG1hc3RlcktleXMgPSBPYmplY3Qua2V5cyhwcm9mZXNzaW9uYWxTdW1tYXJpZXMpLmZpbHRlcihrID0+IGsgIT09ICdhaV9nZW5lcmF0ZWQnKTtcbiAgaWYgKG1hc3RlcktleXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmFkaW9zQ29udGFpbmVyLmlubmVySFRNTCA9ICc8cCBzdHlsZT1cImNvbG9yOiM5Y2EzYWY7Zm9udC1zaXplOjAuODVlbTtcIj5ObyBzdG9yZWQgc3VtbWFyaWVzIGF2YWlsYWJsZS48L3A+JztcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgY3VycmVudEtleSA9IHdpbmRvdy5zZWxlY3RlZFN1bW1hcnlLZXkgfHwgJyc7XG4gIHJhZGlvc0NvbnRhaW5lci5pbm5lckhUTUwgPSBtYXN0ZXJLZXlzLm1hcChrZXkgPT4ge1xuICAgIGNvbnN0IHByZXZpZXcgPSAocHJvZmVzc2lvbmFsU3VtbWFyaWVzW2tleV0gfHwgJycpLnNsaWNlKDAsIDIwMCk7XG4gICAgY29uc3QgbGFiZWwgPSBrZXkucmVwbGFjZSgvXy9nLCAnICcpLnJlcGxhY2UoL1xcYlxcdy9nLCBjID0+IGMudG9VcHBlckNhc2UoKSk7XG4gICAgY29uc3QgY2hlY2tlZCA9IGtleSA9PT0gY3VycmVudEtleSA/ICdjaGVja2VkJyA6ICcnO1xuICAgIHJldHVybiBgXG4gICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2JvcmRlcjoxcHggc29saWQgI2U1ZTdlYjtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjEycHg7bWFyZ2luLWJvdHRvbTo4cHg7Y3Vyc29yOnBvaW50ZXI7JHtjaGVja2VkID8gJ2JvcmRlci1jb2xvcjojMTBiOTgxO2JhY2tncm91bmQ6I2YwZmRmNDsnIDogJyd9XCI+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwic3VtbWFyeV9rZXlcIiB2YWx1ZT1cIiR7ZXNjYXBlSHRtbChrZXkpfVwiICR7Y2hlY2tlZH1cbiAgICAgICAgICBvbmNoYW5nZT1cInNlbGVjdFN1bW1hcnlLZXkoJyR7ZXNjYXBlSHRtbChrZXkpfScpXCIgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6OHB4O1wiPlxuICAgICAgICA8c3Ryb25nPiR7ZXNjYXBlSHRtbChsYWJlbCl9PC9zdHJvbmc+IDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjAuNzVlbTtwYWRkaW5nOjFweCA2cHg7Ym9yZGVyLXJhZGl1czo5OTlweDtiYWNrZ3JvdW5kOiNlZmY2ZmY7Y29sb3I6IzFkNGVkODtib3JkZXI6MXB4IHNvbGlkICNiZmRiZmU7Zm9udC13ZWlnaHQ6NjAwO1wiPlx1RDgzRFx1RENDNCBGcm9tIHlvdXIgTWFzdGVyIENWPC9zcGFuPlxuICAgICAgICA8cCBzdHlsZT1cIm1hcmdpbjo2cHggMCAwO2ZvbnQtc2l6ZTowLjg1ZW07Y29sb3I6IzZiNzI4MDtcIj4ke2VzY2FwZUh0bWwocHJldmlldyl9JHtwcmV2aWV3Lmxlbmd0aCA9PT0gMjAwID8gJ1x1MjAyNicgOiAnJ308L3A+XG4gICAgICA8L2xhYmVsPmA7XG4gIH0pLmpvaW4oJycpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgU2hvdyBBSS1nZW5lcmF0ZWQgc3VtbWFyeSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gX3Nob3dBSVN1bW1hcnkodGV4dCwgc3RhdHVzTGFiZWwpIHtcbiAgY29uc3QgdGV4dEVsICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FpLXN1bW1hcnktdGV4dCcpO1xuICBjb25zdCBsb2FkaW5nRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWktc3VtbWFyeS1sb2FkaW5nJyk7XG4gIGNvbnN0IHN0YXR1c0VsICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhaS1zdW1tYXJ5LXN0YXR1cycpO1xuICBpZiAodGV4dEVsKSB7XG4gICAgdGV4dEVsLnZhbHVlID0gdGV4dDtcbiAgICB0ZXh0RWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuICB9XG4gIGlmIChsb2FkaW5nRWwpIGxvYWRpbmdFbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBpZiAoc3RhdHVzRWwpICBzdGF0dXNFbC50ZXh0Q29udGVudCA9IHN0YXR1c0xhYmVsIHx8ICcnO1xuICB3aW5kb3cuX2FpR2VuZXJhdGVkU3VtbWFyeSA9IHRleHQ7XG4gIF91cGRhdGVTdW1tYXJ5U3BlY2lmaWNpdHlCYWRnZSh0ZXh0KTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFN1bW1hcnkgc3BlY2lmaWNpdHkgdmFsaWRhdG9yIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBfY2hlY2tTdW1tYXJ5U3BlY2lmaWNpdHkodGV4dCkge1xuICBpZiAoIXRleHQgfHwgIXRleHQudHJpbSgpKSByZXR1cm4gW107XG4gIGNvbnN0IHdhcm5pbmdzID0gW107XG4gIC8vIENoZWNrIDE6IHF1YW50aWZpZWQgY2xhaW0gKG51bWJlciwgcGVyY2VudGFnZSwgb3IgeWVhciByYW5nZSlcbiAgY29uc3QgaGFzUXVhbnRpZmllZCA9IC9cXGJcXGRbXFxkLF0qXFxzKiglfHBlcmNlbnR8eXJzP3x5ZWFycz98bW9udGhzP3x4XFxifFxcK3xrXFxifG1cXGJ8XFwuXFxkKS9pLnRlc3QodGV4dCkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIC9cXGJcXGQrXFwrXFxzKih5ZWFycz98eXJzP3xtb250aHM/KS9pLnRlc3QodGV4dCk7XG4gIGlmICghaGFzUXVhbnRpZmllZCkge1xuICAgIHdhcm5pbmdzLnB1c2goJ05vIHF1YW50aWZpZWQgY2xhaW0gZGV0ZWN0ZWQgKGUuZy4gXCI1KyB5ZWFyc1wiLCBcIjMwJSByZWR1Y3Rpb25cIiwgXCIkMk1cIikuIEFkZGluZyBhIG51bWJlciBzdHJlbmd0aGVucyBjcmVkaWJpbGl0eS4nKTtcbiAgfVxuICAvLyBDaGVjayAyOiB0YXJnZXQgcm9sZSBrZXl3b3JkIHByZXNlbnRcbiAgY29uc3QgYW5hbHlzaXMgPSB3aW5kb3cuX2xhc3RBbmFseXNpc0RhdGEgfHxcbiAgICAod2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnMgJiYgd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnMuam9iX2FuYWx5c2lzKSB8fCB7fTtcbiAgY29uc3Qgcm9sZVRpdGxlID0gKGFuYWx5c2lzLnRpdGxlIHx8IGFuYWx5c2lzLmpvYl90aXRsZSB8fCAnJykudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gIGlmIChyb2xlVGl0bGUgJiYgcm9sZVRpdGxlLmxlbmd0aCA+IDMpIHtcbiAgICBjb25zdCByb2xlUGFydHMgPSByb2xlVGl0bGUuc3BsaXQoL1tcXHMvLF0rLykuZmlsdGVyKHcgPT4gdy5sZW5ndGggPiAzKTtcbiAgICBjb25zdCBpblRleHQgPSByb2xlUGFydHMuc29tZShwYXJ0ID0+IHRleHQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhwYXJ0KSk7XG4gICAgaWYgKCFpblRleHQpIHtcbiAgICAgIHdhcm5pbmdzLnB1c2goYFRhcmdldCByb2xlIChcIiR7ZXNjYXBlSHRtbChyb2xlVGl0bGUpfVwiKSBub3QgbWVudGlvbmVkIFx1MjAxNCBjb25zaWRlciBlY2hvaW5nIHRoZSByb2xlIG9yIGEgc3lub255bS5gKTtcbiAgICB9XG4gIH1cbiAgLy8gQ2hlY2sgMzogZmFsbGJhY2sgZ2VuZXJpYyBwbGFjZWhvbGRlclxuICBjb25zdCBnZW5lcmljUGhyYXNlcyA9IFsnZXhwZXJpZW5jZWQgcHJvZmVzc2lvbmFsJywgJ3RyYWNrIHJlY29yZCBvZiBzdWNjZXNzJywgJ3NlZWtpbmcgYSBjaGFsbGVuZ2luZyddO1xuICBmb3IgKGNvbnN0IHBocmFzZSBvZiBnZW5lcmljUGhyYXNlcykge1xuICAgIGlmICh0ZXh0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocGhyYXNlKSkge1xuICAgICAgd2FybmluZ3MucHVzaChgR2VuZXJpYyBwbGFjZWhvbGRlciBwaHJhc2UgZGV0ZWN0ZWQgKFwiJHtwaHJhc2V9XCIpIFx1MjAxNCByZXBsYWNlIHdpdGggc3BlY2lmaWMgYWNoaWV2ZW1lbnRzLmApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gd2FybmluZ3M7XG59XG5cbmZ1bmN0aW9uIF91cGRhdGVTdW1tYXJ5U3BlY2lmaWNpdHlCYWRnZSh0ZXh0KSB7XG4gIGxldCBiYWRnZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdW1tYXJ5LXNwZWNpZmljaXR5LWJhZGdlJyk7XG4gIGlmICghYmFkZ2UpIHtcbiAgICBjb25zdCB0ZXh0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWktc3VtbWFyeS10ZXh0Jyk7XG4gICAgaWYgKCF0ZXh0RWwgfHwgIXRleHRFbC5wYXJlbnROb2RlKSByZXR1cm47XG4gICAgYmFkZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBiYWRnZS5pZCA9ICdzdW1tYXJ5LXNwZWNpZmljaXR5LWJhZGdlJztcbiAgICBiYWRnZS5zdHlsZS5jc3NUZXh0ID0gJ21hcmdpbi10b3A6NnB4O2ZvbnQtc2l6ZTowLjgyZW07JztcbiAgICB0ZXh0RWwucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYmFkZ2UsIHRleHRFbC5uZXh0U2libGluZyk7XG4gIH1cbiAgY29uc3Qgd2FybmluZ3MgPSBfY2hlY2tTdW1tYXJ5U3BlY2lmaWNpdHkodGV4dCk7XG4gIGlmICh3YXJuaW5ncy5sZW5ndGggPT09IDApIHtcbiAgICBiYWRnZS5pbm5lckhUTUwgPSAnPHNwYW4gc3R5bGU9XCJjb2xvcjojMTBiOTgxO1wiPlx1MjcxMyBTdW1tYXJ5IGhhcyBzcGVjaWZpYywgcXVhbnRpZmllZCBjb250ZW50Ljwvc3Bhbj4nO1xuICB9IGVsc2Uge1xuICAgIGJhZGdlLmlubmVySFRNTCA9IHdhcm5pbmdzLm1hcCh3ID0+XG4gICAgICBgPGRpdiBzdHlsZT1cImNvbG9yOiNiNDUzMDk7bWFyZ2luLXRvcDoycHg7XCI+XHUyNkEwICR7d308L2Rpdj5gXG4gICAgKS5qb2luKCcnKTtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgQ2FsbCBnZW5lcmF0ZS1zdW1tYXJ5IEFQSSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLyoqXG4gKiBkdWNrZmxvdzpcbiAqICAgaWQ6IHN1bW1hcnlfdWlfZ2VuZXJhdGVcbiAqICAga2luZDogdWlcbiAqICAgdGltZXN0YW1wOiBcIjIwMjYtMDMtMjdUMDE6MjM6MjhaXCJcbiAqICAgc3RhdHVzOiBzaGFyZWRcbiAqICAgaGFuZGxlczogW1widWk6c3VtbWFyeS1yZXZpZXcuZ2VuZXJhdGVcIl1cbiAqICAgY2FsbHM6IFtcIlBPU1QgL2FwaS9nZW5lcmF0ZS1zdW1tYXJ5XCIsIFwidWk6c3VtbWFyeS1yZXZpZXcucGVyc2lzdFwiXVxuICogICByZWFkczogW1wicmVzcG9uc2U6UE9TVCAvYXBpL2dlbmVyYXRlLXN1bW1hcnkuc3VtbWFyeVwiLCBcIndpbmRvdzpfYWlHZW5lcmF0ZWRTdW1tYXJ5XCJdXG4gKiAgIHdyaXRlczogW1wiZG9tOiNhaS1zdW1tYXJ5LXRleHRcIiwgXCJkb206I2FpLXN1bW1hcnktc3RhdHVzXCIsIFwid2luZG93Ol9haUdlbmVyYXRlZFN1bW1hcnlcIiwgXCJ3aW5kb3c6c2VsZWN0ZWRTdW1tYXJ5S2V5XCJdXG4gKiAgIG5vdGVzOiBcIlJlcXVlc3RzIGEgZ2VuZXJhdGVkIG9yIHJlZmluZWQgc3VtbWFyeSwgdXBkYXRlcyB0aGUgbG9jYWwgVUksIGFuZCBwZXJzaXN0cyB0aGUgc2VsZWN0ZWQgc3VtbWFyeSBrZXkuXCJcbiAqL1xuXG5hc3luYyBmdW5jdGlvbiBfY2FsbEdlbmVyYXRlU3VtbWFyeShyZWZpbmVtZW50UHJvbXB0LCBwcmV2aW91c1N1bW1hcnkpIHtcbiAgY29uc3QgYnRuICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWktcmVnZW5lcmF0ZS1idG4nKTtcbiAgY29uc3Qgc3RhdHVzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWktc3VtbWFyeS1zdGF0dXMnKTtcbiAgY29uc3QgdGV4dEVsICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWktc3VtbWFyeS10ZXh0Jyk7XG4gIGNvbnN0IGxvYWRpbmdFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhaS1zdW1tYXJ5LWxvYWRpbmcnKTtcbiAgaWYgKGJ0bikgICAgICBidG4uZGlzYWJsZWQgPSB0cnVlO1xuICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJ0dlbmVyYXRpbmdcdTIwMjYnO1xuICAvLyBTaG93IGxvYWRpbmcgaW5kaWNhdG9yOyBoaWRlIHRoZSB0ZXh0YXJlYSB3aGlsZSBnZW5lcmF0aW5nLlxuICBpZiAobG9hZGluZ0VsKSB7IGxvYWRpbmdFbC5pbm5lckhUTUwgPSAnPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjEwcHg7Y29sb3I6IzZiNzI4MDtwYWRkaW5nOjhweCAwO1wiPjxkaXYgY2xhc3M9XCJsb2FkaW5nLXNwaW5uZXJcIiBzdHlsZT1cIndpZHRoOjIwcHg7aGVpZ2h0OjIwcHg7Ym9yZGVyLXdpZHRoOjJweDtcIj48L2Rpdj48ZW0+R2VuZXJhdGluZyBhIHRhaWxvcmVkIHN1bW1hcnlcdTIwMjY8L2VtPjwvZGl2Pic7IGxvYWRpbmdFbC5zdHlsZS5kaXNwbGF5ID0gJyc7IH1cbiAgaWYgKHRleHRFbCkgICB0ZXh0RWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAvLyBVc2UgdGhlIGdsb2JhbCBMTE0gc3RhdHVzIGJhciBmb3IgdmlzaWJpbGl0eVxuICBzZXRMb2FkaW5nKHRydWUsICdHZW5lcmF0aW5nIHN1bW1hcnlcdTIwMjYnKTtcblxuICB0cnkge1xuICAgIGNvbnN0IGJvZHkgPSB7fTtcbiAgICBpZiAocmVmaW5lbWVudFByb21wdCkgYm9keS5yZWZpbmVtZW50X3Byb21wdCA9IHJlZmluZW1lbnRQcm9tcHQ7XG4gICAgaWYgKHByZXZpb3VzU3VtbWFyeSkgIGJvZHkucHJldmlvdXNfc3VtbWFyeSAgPSBwcmV2aW91c1N1bW1hcnk7XG5cbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvZ2VuZXJhdGUtc3VtbWFyeScsIHtcbiAgICAgIG1ldGhvZDogICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogICAgSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG5cbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgX3Nob3dBSVN1bW1hcnkoZGF0YS5zdW1tYXJ5LCAnXHUyNzEzIGdlbmVyYXRlZCcpO1xuICAgICAgd2luZG93LnNlbGVjdGVkU3VtbWFyeUtleSA9ICdhaV9nZW5lcmF0ZWQnO1xuICAgICAgYXdhaXQgc2F2ZVN1bW1hcnlGb2N1c1RvQmFja2VuZCgnYWlfZ2VuZXJhdGVkJyk7XG4gICAgICBzY2hlZHVsZUF0c1JlZnJlc2goJ3Jldmlld19jaGVja3BvaW50Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnXHUyNkEwIGVycm9yJztcbiAgICAgIGlmICh0ZXh0RWwpICAgdGV4dEVsLmlubmVySFRNTCA9IGA8c3BhbiBzdHlsZT1cImNvbG9yOiNlZjQ0NDQ7XCI+JHtlc2NhcGVIdG1sKGRhdGEuZXJyb3IgfHwgJ0dlbmVyYXRpb24gZmFpbGVkLicpfTwvc3Bhbj5gO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKHN0YXR1c0VsKSBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICdcdTI2QTAgbmV0d29yayBlcnJvcic7XG4gICAgaWYgKHRleHRFbCkgICB0ZXh0RWwuaW5uZXJIVE1MID0gJzxzcGFuIHN0eWxlPVwiY29sb3I6I2VmNDQ0NDtcIj5OZXR3b3JrIGVycm9yIFx1MjAxNCBwbGVhc2UgdHJ5IGFnYWluLjwvc3Bhbj4nO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChidG4pIGJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBSZWdlbmVyYXRlIC8gdXNlIEFJIHN1bW1hcnkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIHJlZ2VuZXJhdGVBSVN1bW1hcnkoKSB7XG4gIGNvbnN0IGlucHV0ICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3VtbWFyeS1yZWZpbmVtZW50LWlucHV0Jyk7XG4gIGNvbnN0IHByb21wdCAgPSBpbnB1dCA/IGlucHV0LnZhbHVlLnRyaW0oKSA6ICcnO1xuICBjb25zdCBjdXJyZW50ID0gd2luZG93Ll9haUdlbmVyYXRlZFN1bW1hcnkgfHwgJyc7XG4gIGF3YWl0IF9jYWxsR2VuZXJhdGVTdW1tYXJ5KHByb21wdCB8fCBudWxsLCBjdXJyZW50IHx8IG51bGwpO1xufVxuXG5hc3luYyBmdW5jdGlvbiB1c2VBSVN1bW1hcnkoKSB7XG4gIHdpbmRvdy5zZWxlY3RlZFN1bW1hcnlLZXkgPSAnYWlfZ2VuZXJhdGVkJztcbiAgY29uc3QgdGV4dEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FpLXN1bW1hcnktdGV4dCcpO1xuICBjb25zdCBjdXJyZW50VGV4dCA9IHRleHRFbCA/IHRleHRFbC52YWx1ZS50cmltKCkgOiAod2luZG93Ll9haUdlbmVyYXRlZFN1bW1hcnkgfHwgJycpO1xuICBhd2FpdCBzYXZlU3VtbWFyeUZvY3VzVG9CYWNrZW5kKCdhaV9nZW5lcmF0ZWQnLCBjdXJyZW50VGV4dCk7XG4gIHNjaGVkdWxlQXRzUmVmcmVzaCgncmV2aWV3X2NoZWNrcG9pbnQnKTtcbiAgc2hvd1RvYXN0KCdBSS1nZW5lcmF0ZWQgc3VtbWFyeSBzZWxlY3RlZCBmb3IgeW91ciBDVicpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgU2VsZWN0IHN0b3JlZCBzdW1tYXJ5IGtleSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gc2VsZWN0U3VtbWFyeUtleShrZXkpIHtcbiAgd2luZG93LnNlbGVjdGVkU3VtbWFyeUtleSA9IGtleTtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI3N1bW1hcnktcmFkaW9zIGxhYmVsJykuZm9yRWFjaChsYWJlbCA9PiB7XG4gICAgY29uc3QgcmFkaW8gPSBsYWJlbC5xdWVyeVNlbGVjdG9yKCdpbnB1dFt0eXBlPXJhZGlvXScpO1xuICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSByYWRpbyAmJiByYWRpby52YWx1ZSA9PT0ga2V5O1xuICAgIGxhYmVsLnN0eWxlLmJvcmRlckNvbG9yID0gaXNTZWxlY3RlZCA/ICcjMTBiOTgxJyA6ICcjZTVlN2ViJztcbiAgICBsYWJlbC5zdHlsZS5iYWNrZ3JvdW5kICA9IGlzU2VsZWN0ZWQgPyAnI2YwZmRmNCcgOiAnJztcbiAgfSk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBTYXZlIC8gc3VibWl0IFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4vKipcbiAqIGR1Y2tmbG93OlxuICogICBpZDogc3VtbWFyeV91aV9wZXJzaXN0XG4gKiAgIGtpbmQ6IHVpXG4gKiAgIHRpbWVzdGFtcDogXCIyMDI2LTAzLTI3VDAxOjIzOjI4WlwiXG4gKiAgIHN0YXR1czogc2hhcmVkXG4gKiAgIGhhbmRsZXM6IFtcInVpOnN1bW1hcnktcmV2aWV3LnBlcnNpc3RcIl1cbiAqICAgY2FsbHM6IFtcIlBPU1QgL2FwaS9yZXZpZXctZGVjaXNpb25zXCJdXG4gKiAgIHJlYWRzOiBbXCJ3aW5kb3c6c2VsZWN0ZWRTdW1tYXJ5S2V5XCJdXG4gKiAgIHdyaXRlczogW1wicmVxdWVzdDpQT1NUIC9hcGkvcmV2aWV3LWRlY2lzaW9ucy5zdW1tYXJ5X2ZvY3VzXCJdXG4gKiAgIG5vdGVzOiBcIlBlcnNpc3RzIG9ubHkgdGhlIHNlbGVjdGVkIHN1bW1hcnkga2V5IHNvIGJhY2tlbmQgc3RhdGUgY2FuIHJlc29sdmUgdGhlIGFjdGl2ZSBzdW1tYXJ5IHZhcmlhbnQgbGF0ZXIuXCJcbiAqL1xuXG4vLyBEZWJvdW5jZSB0aW1lciBmb3IgYXV0by1wZXJzaXN0aW5nIGVkaXRzIHRvIHRoZSBzdW1tYXJ5IHRleHQuXG5sZXQgX3N1bW1hcnlQZXJzaXN0VGltZXIgPSBudWxsO1xuXG5mdW5jdGlvbiBvblN1bW1hcnlUZXh0Q2hhbmdlKCkge1xuICBjb25zdCB0ZXh0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWktc3VtbWFyeS10ZXh0Jyk7XG4gIGlmICghdGV4dEVsKSByZXR1cm47XG4gIHdpbmRvdy5fYWlHZW5lcmF0ZWRTdW1tYXJ5ID0gdGV4dEVsLnZhbHVlO1xuICBfdXBkYXRlU3VtbWFyeVNwZWNpZmljaXR5QmFkZ2UodGV4dEVsLnZhbHVlKTtcbiAgY2xlYXJUaW1lb3V0KF9zdW1tYXJ5UGVyc2lzdFRpbWVyKTtcbiAgX3N1bW1hcnlQZXJzaXN0VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICBzYXZlU3VtbWFyeUZvY3VzVG9CYWNrZW5kKCdhaV9nZW5lcmF0ZWQnLCB0ZXh0RWwudmFsdWUudHJpbSgpKTtcbiAgfSwgNTAwKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZVN1bW1hcnlGb2N1c1RvQmFja2VuZChrZXksIHRleHQpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXlsb2FkID0geyB0eXBlOiAnc3VtbWFyeV9mb2N1cycsIGRlY2lzaW9uczoga2V5IH07XG4gICAgaWYgKHRleHQgIT09IHVuZGVmaW5lZCAmJiB0ZXh0ICE9PSBudWxsKSBwYXlsb2FkLnN1bW1hcnlfdGV4dCA9IHRleHQ7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9yZXZpZXctZGVjaXNpb25zJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLm9rO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN1Ym1pdFN1bW1hcnlGb2N1c0RlY2lzaW9uKCkge1xuICBjb25zdCBrZXkgPSB3aW5kb3cuc2VsZWN0ZWRTdW1tYXJ5S2V5O1xuICBpZiAoIWtleSkgcmV0dXJuO1xuICBjb25zdCBzYXZlZCA9IGF3YWl0IHNhdmVTdW1tYXJ5Rm9jdXNUb0JhY2tlbmQoa2V5KTtcbiAgaWYgKCFzYXZlZCkge1xuICAgIHNob3dUb2FzdCgnRmFpbGVkIHRvIHNhdmUgc3VtbWFyeSBzZWxlY3Rpb24uJywgJ2Vycm9yJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHN0YXRlTWFuYWdlci5tYXJrQ29udGVudENoYW5nZWQoKTtcbiAgc2NoZWR1bGVBdHNSZWZyZXNoKCdyZXZpZXdfY2hlY2twb2ludCcpO1xuICBzaG93VG9hc3QoYFN1bW1hcnkgc2VsZWN0aW9uIHNhdmVkOiBcIiR7a2V5LnJlcGxhY2UoL18vZywgJyAnKX1cImApO1xuICBzd2l0Y2hUYWIoJ3B1YmxpY2F0aW9ucy1yZXZpZXcnKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEV4cG9ydHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmV4cG9ydCB7XG4gIGJ1aWxkU3VtbWFyeUZvY3VzU2VjdGlvbixcbiAgX3JlbmRlclN0b3JlZFN1bW1hcnlSYWRpb3MsXG4gIF9zaG93QUlTdW1tYXJ5LFxuICBfY2FsbEdlbmVyYXRlU3VtbWFyeSxcbiAgcmVnZW5lcmF0ZUFJU3VtbWFyeSxcbiAgdXNlQUlTdW1tYXJ5LFxuICBvblN1bW1hcnlUZXh0Q2hhbmdlLFxuICBzZWxlY3RTdW1tYXJ5S2V5LFxuICBzYXZlU3VtbWFyeUZvY3VzVG9CYWNrZW5kLFxuICBfY2hlY2tTdW1tYXJ5U3BlY2lmaWNpdHksXG4gIF91cGRhdGVTdW1tYXJ5U3BlY2lmaWNpdHlCYWRnZSxcbiAgc3VibWl0U3VtbWFyeUZvY3VzRGVjaXNpb24sXG59O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvcHVibGljYXRpb25zLXJldmlldy5qc1xuICogUHVibGljYXRpb25zIHJldmlldyB0YWJsZTogZmV0Y2gsIHJlbmRlciwgdG9nZ2xlIGFjY2VwdC9yZWplY3QsIHN1Ym1pdCBkZWNpc2lvbnMuXG4gKlxuICogRGVwZW5kZW5jaWVzIChyZXNvbHZlZCB0aHJvdWdoIGdsb2JhbFRoaXMgYXQgcnVudGltZSk6XG4gKiAgIHB1YmxpY2F0aW9uRGVjaXNpb25zLCBfc2F2ZWREZWNpc2lvbnMsXG4gKiAgIGVzY2FwZUh0bWwsIHNob3dUb2FzdCwgZmV0Y2hBbmRSZXZpZXdSZXdyaXRlcywgQ1NTXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdwdWJsaWNhdGlvbnMtcmV2aWV3Jyk7XG5cbmltcG9ydCB7IHN0YXRlTWFuYWdlciB9IGZyb20gJy4vc3RhdGUtbWFuYWdlci5qcyc7XG5pbXBvcnQgeyBleWVTbGFzaEljb24gfSBmcm9tICcuL3Jldmlldy1pY29ucy5qcyc7XG5cbi8vIFRyYWNrIHB1YmxpY2F0aW9uIGFjY2VwdC9yZWplY3QgZGVjaXNpb25zOiBjaXRlX2tleSBcdTIxOTIgdHJ1ZSAoYWNjZXB0KSB8IGZhbHNlIChyZWplY3QpXG53aW5kb3cucHVibGljYXRpb25EZWNpc2lvbnMgPSB7fTtcbi8vIE9yZGVyZWQgbGlzdCBvZiBwdWJsaWNhdGlvbiBvYmplY3RzOyBtdXRhdGVkIGJ5IG1vdmVQdWJSb3coKVxud2luZG93Ll9wdWJsaWNhdGlvbnNPcmRlcmVkID0gW107XG5cbi8vIFx1MjUwMFx1MjUwMCBCdWlsZCBwdWJsaWNhdGlvbnMgcmV2aWV3IHRhYmxlIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBidWlsZFB1YmxpY2F0aW9uc1Jldmlld1RhYmxlKCkge1xuICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHVibGljYXRpb25zLXRhYmxlLWNvbnRhaW5lcicpO1xuICAvLyBJbiB0aGUgbmV3IHN1Yi10YWIgbGF5b3V0LCB3ZSB1c2UgdGhlIHBhbmUgd3JhcHBlciBpbnN0ZWFkIG9mIHRoZSBvbGQgc2VjdGlvblxuICBjb25zdCBzZWN0aW9uICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHVibGljYXRpb25zLXJldmlldy1zZWN0aW9uJykgfHxcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jldmlldy1wYW5lLXB1YmxpY2F0aW9ucycpO1xuICBjb25zdCBwdWJUYWJCdG4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucmV2aWV3LXN1YnRhYltkYXRhLXBhbmU9XCJwdWJsaWNhdGlvbnNcIl0nKTtcbiAgaWYgKCFjb250YWluZXIpIHJldHVybjtcblxuICBjb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDoxMnB4O3BhZGRpbmc6MjBweDtjb2xvcjojNmI3MjgwO1wiPjxkaXYgY2xhc3M9XCJsb2FkaW5nLXNwaW5uZXJcIiBzdHlsZT1cIndpZHRoOjIwcHg7aGVpZ2h0OjIwcHg7Ym9yZGVyLXdpZHRoOjJweDtmbGV4LXNocmluazowO1wiPjwvZGl2PjxzcGFuPkxvYWRpbmcgcHVibGljYXRpb24gcmVjb21tZW5kYXRpb25zXFx1MjAyNjwvc3Bhbj48L2Rpdj4nO1xuXG4gIGxldCByZWNvbW1lbmRhdGlvbnMgPSBbXTtcbiAgbGV0IHRvdGFsQ291bnQgPSAwO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9wdWJsaWNhdGlvbi1yZWNvbW1lbmRhdGlvbnMnKTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoIWRhdGEub2spIHsgY29udGFpbmVyLmlubmVySFRNTCA9IGA8cCBjbGFzcz1cImVycm9yLW1lc3NhZ2VcIj4ke2VzY2FwZUh0bWwoZGF0YS5lcnJvciB8fCAnRmFpbGVkIHRvIGxvYWQgcHVibGljYXRpb25zLicpfTwvcD5gOyByZXR1cm47IH1cbiAgICByZWNvbW1lbmRhdGlvbnMgPSBkYXRhLnJlY29tbWVuZGF0aW9ucyB8fCBbXTtcbiAgICB0b3RhbENvdW50ID0gZGF0YS50b3RhbF9jb3VudCB8fCByZWNvbW1lbmRhdGlvbnMubGVuZ3RoO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cuZXJyb3IoJ0Vycm9yIGZldGNoaW5nIHB1YmxpY2F0aW9uIHJlY29tbWVuZGF0aW9uczonLCBlcnIpO1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnPHAgc3R5bGU9XCJjb2xvcjogI2VmNDQ0NDsgcGFkZGluZzogMjBweDtcIj5GYWlsZWQgdG8gbG9hZCBwdWJsaWNhdGlvbiByZWNvbW1lbmRhdGlvbnMuPC9wPic7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHJlY29tbWVuZGF0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAvLyBObyBwdWJsaWNhdGlvbnMgXHUyMDE0IGhpZGUgdGhlIHBhbmUgYW5kIGRpc2FibGUgdGhlIHRhYiBidXR0b25cbiAgICBpZiAoc2VjdGlvbikgc2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGlmIChwdWJUYWJCdG4pIHB1YlRhYkJ0bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnPHAgc3R5bGU9XCJwYWRkaW5nOjIwcHg7Y29sb3I6IzZiNzI4MDtcIj5ObyBwdWJsaWNhdGlvbnMgZm91bmQuPC9wPic7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gU2hvdyBzZWN0aW9uIGFuZCB0YWIgYnV0dG9uXG4gIGlmIChwdWJUYWJCdG4pIHB1YlRhYkJ0bi5zdHlsZS5kaXNwbGF5ID0gJyc7XG5cbiAgLy8gVXBkYXRlIGhlYWRpbmcgY291bnQgKGhhbmRsZSBib3RoIHBhbmUgYXBwcm9hY2ggYW5kIGxlZ2FjeSBzZWN0aW9uIGFwcHJvYWNoKVxuICBjb25zdCBoZWFkaW5nID0gc2VjdGlvbiA/IHNlY3Rpb24ucXVlcnlTZWxlY3RvcignaDInKSA6IG51bGw7XG4gIGlmIChoZWFkaW5nKSB7XG4gICAgaGVhZGluZy50ZXh0Q29udGVudCA9IGBcdUQ4M0RcdURDQzQgU2VsZWN0ZWQgUHVibGljYXRpb25zYDtcbiAgfVxuXG4gIC8vIENvdW50IHJlY29tbWVuZGVkIHZzIHRvdGFsXG4gIGNvbnN0IHJlY29tbWVuZGVkQ291bnQgPSByZWNvbW1lbmRhdGlvbnMuZmlsdGVyKHAgPT4gcC5pc19yZWNvbW1lbmRlZCAhPT0gZmFsc2UpLmxlbmd0aDtcbiAgY29uc3QgY29udGV4dE5vdGUgPSBgPHN0cm9uZz4ke3JlY29tbWVuZGVkQ291bnR9PC9zdHJvbmc+IG9mIDxzdHJvbmc+JHt0b3RhbENvdW50fTwvc3Ryb25nPiBwdWJsaWNhdGlvbnMgcmVjb21tZW5kZWQgZm9yIHRoaXMgcm9sZS4gYCArXG4gICAgYFJlY29tbWVuZGVkIHB1YmxpY2F0aW9ucyAodG9wKSBhcmUgcHJlLXNlbGVjdGVkIGZvciBpbmNsdXNpb247IG90aGVycyAoYmVsb3cgdGhlIGRpdmlkZXIpIGFyZSBwcmUtZXhjbHVkZWQuIEFkanVzdCB1c2luZyB0aGUgdG9nZ2xlcy5gO1xuXG4gIC8vIEluaXRpYWxpc2UgZGVjaXNpb25zIFx1MjAxNCByZWNvbW1lbmRlZD1hY2NlcHQsIG5vdC1yZWNvbW1lbmRlZD1yZWplY3QgYnkgZGVmYXVsdFxuICB3aW5kb3cucHVibGljYXRpb25EZWNpc2lvbnMgPSB7fTtcbiAgcmVjb21tZW5kYXRpb25zLmZvckVhY2gocHViID0+IHtcbiAgICB3aW5kb3cucHVibGljYXRpb25EZWNpc2lvbnNbcHViLmNpdGVfa2V5XSA9IHB1Yi5pc19yZWNvbW1lbmRlZCAhPT0gZmFsc2U7XG4gIH0pO1xuICAvLyBBcHBseSBhbnkgcHJldmlvdXNseSBzYXZlZCB1c2VyIGRlY2lzaW9ucyBvdmVyIHRoZSBBUEkgZGVmYXVsdHNcbiAgY29uc3Qgc2F2ZWRQdWJEZWNzID0gd2luZG93Ll9zYXZlZERlY2lzaW9ucz8ucHVibGljYXRpb25fZGVjaXNpb25zIHx8IHt9O1xuICBpZiAoT2JqZWN0LmtleXMoc2F2ZWRQdWJEZWNzKS5sZW5ndGggPiAwKSBPYmplY3QuYXNzaWduKHdpbmRvdy5wdWJsaWNhdGlvbkRlY2lzaW9ucywgc2F2ZWRQdWJEZWNzKTtcblxuICAvLyBTZWVkIHRoZSBvcmRlcmVkIGxpc3QgZm9yIHJlb3JkZXIgY29udHJvbHNcbiAgd2luZG93Ll9wdWJsaWNhdGlvbnNPcmRlcmVkID0gWy4uLnJlY29tbWVuZGF0aW9uc107XG5cbiAgbGV0IHRhYmxlSFRNTCA9IGBcbiAgICA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7Zm9udC1zaXplOjAuOWVtO21hcmdpbi1ib3R0b206MTJweDtcIj4ke2NvbnRleHROb3RlfTwvcD5cbiAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTJweDtmbGV4LXdyYXA6d3JhcDttYXJnaW4tYm90dG9tOjEwcHg7XCI+XG4gICAgICA8bGFiZWwgc3R5bGU9XCJmb250LXNpemU6MC45ZW07Y29sb3I6IzM3NDE1MTtcIj5GaWx0ZXIgcHVibGljYXRpb25zOlxuICAgICAgICA8aW5wdXQgdHlwZT1cInNlYXJjaFwiIGlkPVwicHViLWZpbHRlci1pbnB1dFwiIHBsYWNlaG9sZGVyPVwiVHlwZSB0byBmaWx0ZXJcdTIwMjZcIlxuICAgICAgICAgIHN0eWxlPVwibWFyZ2luLWxlZnQ6OHB4O3BhZGRpbmc6NHB4IDhweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo0cHg7Zm9udC1zaXplOjAuOWVtO1wiXG4gICAgICAgICAgb25pbnB1dD1cImZpbHRlclB1YmxpY2F0aW9uc1RhYmxlKHRoaXMudmFsdWUpXCI+XG4gICAgICA8L2xhYmVsPlxuICAgICAgPHNwYW4gc3R5bGU9XCJtYXJnaW4tbGVmdDphdXRvO2Rpc3BsYXk6ZmxleDtnYXA6OHB4O2FsaWduLWl0ZW1zOmNlbnRlcjtcIj5cbiAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC44MmVtO2NvbG9yOiM2YjcyODA7XCI+QnVsazo8L3NwYW4+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHNlY29uZGFyeVwiIHN0eWxlPVwiZm9udC1zaXplOjAuOGVtO3BhZGRpbmc6NHB4IDEwcHg7XCJcbiAgICAgICAgICBvbmNsaWNrPVwiYnVsa1B1YkFjdGlvbigncmVjb21tZW5kZWQnKVwiIHRpdGxlPVwiQWNjZXB0IGFsbCByZWNvbW1lbmRlZCBhbmQgcmVqZWN0IHRoZSByZXN0XCI+QWNjZXB0IFJlY29tbWVuZGVkPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHNlY29uZGFyeVwiIHN0eWxlPVwiZm9udC1zaXplOjAuOGVtO3BhZGRpbmc6NHB4IDEwcHg7XCJcbiAgICAgICAgICBvbmNsaWNrPVwiYnVsa1B1YkFjdGlvbignYWNjZXB0LWFsbCcpXCIgdGl0bGU9XCJBY2NlcHQgYWxsIHB1YmxpY2F0aW9uc1wiPkFjY2VwdCBBbGw8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG4gc2Vjb25kYXJ5XCIgc3R5bGU9XCJmb250LXNpemU6MC44ZW07cGFkZGluZzo0cHggMTBweDtcIlxuICAgICAgICAgIG9uY2xpY2s9XCJidWxrUHViQWN0aW9uKCdyZWplY3QtYWxsJylcIiB0aXRsZT1cIlJlamVjdCBhbGwgcHVibGljYXRpb25zXCI+UmVqZWN0IEFsbDwvYnV0dG9uPlxuICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuICAgIDx0YWJsZSBpZD1cInB1YmxpY2F0aW9ucy1yZXZpZXctdGFibGVcIiBjbGFzcz1cInJldmlldy10YWJsZVwiPlxuICAgICAgPHRoZWFkPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6NDBweDtcIj5SYW5rPC90aD5cbiAgICAgICAgICA8dGg+Q2l0YXRpb248L3RoPlxuICAgICAgICAgIDx0aD5ZZWFyPC90aD5cbiAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDozNnB4O3RleHQtYWxpZ246Y2VudGVyO1wiIHRpdGxlPVwiRmlyc3QgYXV0aG9yXCI+MXN0XHUyNjA1PC90aD5cbiAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDo1MHB4O1wiPlNjb3JlPC90aD5cbiAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDo4MHB4O1wiPkNvbmZpZGVuY2U8L3RoPlxuICAgICAgICAgIDx0aD5SZWFzb25pbmc8L3RoPlxuICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOjgwcHg7XCI+SW5jbHVkZT88L3RoPlxuICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOjU2cHg7dGV4dC1hbGlnbjpjZW50ZXI7XCI+T3JkZXI8L3RoPlxuICAgICAgICA8L3RyPlxuICAgICAgPC90aGVhZD5cbiAgICAgIDx0Ym9keT5cbiAgYDtcblxuICBsZXQgZGl2aWRlckluc2VydGVkID0gZmFsc2U7XG4gIHJlY29tbWVuZGF0aW9ucy5mb3JFYWNoKChwdWIsIGlkeCkgPT4ge1xuICAgIC8vIEluc2VydCBhIHNlY3Rpb24gZGl2aWRlciBiZWZvcmUgdGhlIGZpcnN0IG5vbi1yZWNvbW1lbmRlZCBwdWJsaWNhdGlvblxuICAgIGlmICghZGl2aWRlckluc2VydGVkICYmIHB1Yi5pc19yZWNvbW1lbmRlZCA9PT0gZmFsc2UpIHtcbiAgICAgIGRpdmlkZXJJbnNlcnRlZCA9IHRydWU7XG4gICAgICBjb25zdCBkaXZpZGVyU3R5bGUgPSAnYmFja2dyb3VuZDojZjNmNGY2O2JvcmRlci10b3A6MnB4IHNvbGlkICNkMWQ1ZGI7cGFkZGluZzowOyc7XG4gICAgICB0YWJsZUhUTUwgKz0gYFxuICAgICAgICA8dHIgY2xhc3M9XCJwdWItZGl2aWRlci1yb3dcIj5cbiAgICAgICAgICA8dGQgc3R5bGU9XCIke2RpdmlkZXJTdHlsZX1cIj48L3RkPlxuICAgICAgICAgIDx0ZCBzdHlsZT1cIiR7ZGl2aWRlclN0eWxlfWNvbG9yOiM2YjcyODA7Zm9udC1zaXplOjAuODJlbTtmb250LXN0eWxlOml0YWxpYztwYWRkaW5nOjZweCAxMnB4O3RleHQtYWxpZ246Y2VudGVyO1wiPlxuICAgICAgICAgICAgXHUyMDE0IFB1YmxpY2F0aW9ucyBiZWxvdyB3ZXJlIG5vdCByZWNvbW1lbmRlZCBmb3IgdGhpcyByb2xlIChwcmUtZXhjbHVkZWQpIFx1MjAxNFxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPHRkIHN0eWxlPVwiJHtkaXZpZGVyU3R5bGV9XCI+PC90ZD5cbiAgICAgICAgICA8dGQgc3R5bGU9XCIke2RpdmlkZXJTdHlsZX1cIj48L3RkPlxuICAgICAgICAgIDx0ZCBzdHlsZT1cIiR7ZGl2aWRlclN0eWxlfVwiPjwvdGQ+XG4gICAgICAgICAgPHRkIHN0eWxlPVwiJHtkaXZpZGVyU3R5bGV9XCI+PC90ZD5cbiAgICAgICAgICA8dGQgc3R5bGU9XCIke2RpdmlkZXJTdHlsZX1cIj48L3RkPlxuICAgICAgICAgIDx0ZCBzdHlsZT1cIiR7ZGl2aWRlclN0eWxlfVwiPjwvdGQ+XG4gICAgICAgICAgPHRkIHN0eWxlPVwiJHtkaXZpZGVyU3R5bGV9XCI+PC90ZD5cbiAgICAgICAgPC90cj5cbiAgICAgIGA7XG4gICAgfVxuXG4gICAgY29uc3QgcmFuayAgICAgICA9IGlkeCArIDE7XG4gICAgY29uc3QgY2l0YXRpb24gICA9IHB1Yi5mb3JtYXR0ZWRfY2l0YXRpb24gfHwgW3B1Yi50aXRsZSwgcHViLnZlbnVlLCBwdWIueWVhcl0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJy4gJyk7XG4gICAgY29uc3QgeWVhciAgICAgICA9IHB1Yi55ZWFyIHx8ICdcdTIwMTQnO1xuICAgIGNvbnN0IGZpcnN0QXV0aCAgPSBwdWIuaXNfZmlyc3RfYXV0aG9yID8gJzxzcGFuIHN0eWxlPVwiY29sb3I6IzEwYjk4MTtmb250LXdlaWdodDo3MDA7XCIgdGl0bGU9XCJGaXJzdCBhdXRob3JcIj5cdTI2MDU8L3NwYW4+JyA6ICc8c3BhbiBzdHlsZT1cImNvbG9yOiNkMWQ1ZGI7XCI+XHUyNjA2PC9zcGFuPic7XG4gICAgY29uc3Qgc2NvcmUgICAgICA9IHB1Yi5yZWxldmFuY2Vfc2NvcmUgPyBwdWIucmVsZXZhbmNlX3Njb3JlIDogJ1x1MjAxNCc7XG4gICAgY29uc3QgY29uZmlkZW5jZSA9IHB1Yi5jb25maWRlbmNlIHx8ICcnO1xuICAgIGNvbnN0IGNvbmZDb2xvciAgPSBjb25maWRlbmNlID09PSAnSGlnaCcgPyAnIzEwYjk4MScgOiBjb25maWRlbmNlID09PSAnTG93JyA/ICcjZWY0NDQ0JyA6ICcjZjU5ZTBiJztcbiAgICBjb25zdCBjb25mQmFkZ2UgID0gY29uZmlkZW5jZSA/IGA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZToxMXB4O2NvbG9yOiR7Y29uZkNvbG9yfTtmb250LXdlaWdodDo2MDA7XCI+JHtlc2NhcGVIdG1sKGNvbmZpZGVuY2UpfTwvc3Bhbj5gIDogJyc7XG4gICAgY29uc3QgcmVhc29uaW5nICA9IHB1Yi5yYXRpb25hbGUgPyBgPHNtYWxsPiR7ZXNjYXBlSHRtbChwdWIucmF0aW9uYWxlKX08L3NtYWxsPmAgOiAnJztcbiAgICBjb25zdCB2ZW51ZVdhcm4gID0gcHViLnZlbnVlX3dhcm5pbmcgPyBgIDxzcGFuIHRpdGxlPVwiJHtlc2NhcGVIdG1sKHB1Yi52ZW51ZV93YXJuaW5nKX1cIiBzdHlsZT1cImNvbG9yOiNkYzc5MDA7Y3Vyc29yOmhlbHA7XCI+XHUyNkEwPC9zcGFuPmAgOiAnJztcbiAgICBjb25zdCBjaXRlS2V5ICAgID0gcHViLmNpdGVfa2V5IHx8ICcnO1xuICAgIGNvbnN0IGlzQWNjZXB0ZWQgPSB3aW5kb3cucHVibGljYXRpb25EZWNpc2lvbnNbY2l0ZUtleV0gIT09IGZhbHNlO1xuICAgIGNvbnN0IHJvd1N0eWxlICAgPSBwdWIuaXNfcmVjb21tZW5kZWQgPT09IGZhbHNlID8gJ29wYWNpdHk6MC43OycgOiAnJztcblxuICAgIGNvbnN0IGlzRmlyc3QgPSBpZHggPT09IDA7XG4gICAgY29uc3QgaXNMYXN0ICA9IGlkeCA9PT0gcmVjb21tZW5kYXRpb25zLmxlbmd0aCAtIDE7XG4gICAgdGFibGVIVE1MICs9IGBcbiAgICAgIDx0ciBkYXRhLWNpdGUta2V5PVwiJHtlc2NhcGVIdG1sKGNpdGVLZXkpfVwiIHN0eWxlPVwiJHtyb3dTdHlsZX1cIj5cbiAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7Zm9udC13ZWlnaHQ6NzAwO1wiPiR7cmFua308L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJmb250LXNpemU6MC44N2VtO1wiPiR7ZXNjYXBlSHRtbChjaXRhdGlvbil9JHt2ZW51ZVdhcm59PC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7XCI+JHt5ZWFyfTwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO1wiPiR7Zmlyc3RBdXRofTwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO1wiPiR7c2NvcmUgIT09ICdcdTIwMTQnID8gYDxzdHJvbmc+JHtzY29yZX08L3N0cm9uZz4vMTBgIDogJ1x1MjAxNCd9PC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7XCI+JHtjb25mQmFkZ2V9PC90ZD5cbiAgICAgICAgPHRkPiR7cmVhc29uaW5nfTwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cImFjdGlvbi1idG5zXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG4ke2lzQWNjZXB0ZWQgPyAnIGFjdGl2ZScgOiAnJ31cIiBkYXRhLWFjdGlvbj1cImFjY2VwdFwiIGFyaWEtbGFiZWw9XCJJbmNsdWRlIHB1YmxpY2F0aW9uICR7ZXNjYXBlSHRtbChjaXRlS2V5KX1cIiB0aXRsZT1cIkluY2x1ZGUgaW4gQ1ZcIlxuICAgICAgICAgICAgICBzdHlsZT1cImNvbG9yOiMxMGI5ODE7XCIgaWQ9XCJwdWItYWNjZXB0LSR7cmFua31cIj5cdTI3MTM8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0biR7IWlzQWNjZXB0ZWQgPyAnIGFjdGl2ZScgOiAnJ31cIiBkYXRhLWFjdGlvbj1cInJlamVjdFwiIGFyaWEtbGFiZWw9XCJFeGNsdWRlIHB1YmxpY2F0aW9uICR7ZXNjYXBlSHRtbChjaXRlS2V5KX1cIiB0aXRsZT1cIkV4Y2x1ZGUgZnJvbSBDVlwiXG4gICAgICAgICAgICAgIHN0eWxlPVwiY29sb3I6I2VmNDQ0NDtcIiBpZD1cInB1Yi1yZWplY3QtJHtyYW5rfVwiPiR7ZXllU2xhc2hJY29uKCl9PC9idXR0b24+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO3doaXRlLXNwYWNlOm5vd3JhcDtcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBkYXRhLWFjdGlvbj1cInB1Yi11cFwiIGRhdGEtY2l0ZS1rZXk9XCIke2VzY2FwZUh0bWwoY2l0ZUtleSl9XCJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJNb3ZlIHB1YmxpY2F0aW9uIHVwXCIgdGl0bGU9XCJNb3ZlIHVwXCIgJHtpc0ZpcnN0ID8gJ2Rpc2FibGVkIHN0eWxlPVwib3BhY2l0eTowLjM7XCInIDogJyd9Plx1MjE5MTwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIGRhdGEtYWN0aW9uPVwicHViLWRvd25cIiBkYXRhLWNpdGUta2V5PVwiJHtlc2NhcGVIdG1sKGNpdGVLZXkpfVwiXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiTW92ZSBwdWJsaWNhdGlvbiBkb3duXCIgdGl0bGU9XCJNb3ZlIGRvd25cIiAke2lzTGFzdCA/ICdkaXNhYmxlZCBzdHlsZT1cIm9wYWNpdHk6MC4zO1wiJyA6ICcnfT5cdTIxOTM8L2J1dHRvbj5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvdHI+XG4gICAgYDtcbiAgfSk7XG5cbiAgdGFibGVIVE1MICs9ICc8L3Rib2R5PjwvdGFibGU+JztcbiAgY29udGFpbmVyLmlubmVySFRNTCA9IHRhYmxlSFRNTDtcbiAgLy8gRGVsZWdhdGVkIGNsaWNrIGhhbmRsZXIgZm9yIHB1YmxpY2F0aW9uIGFjdGlvbiBidXR0b25zIChkYXRhLWNpdGUta2V5IG9uIDx0cj4gYXZvaWRzIG9uY2xpY2sgaW5qZWN0aW9uKVxuICBjb250YWluZXIucXVlcnlTZWxlY3RvcignI3B1YmxpY2F0aW9ucy1yZXZpZXctdGFibGUgdGJvZHknKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBlID0+IHtcbiAgICBjb25zdCBidG4gPSBlLnRhcmdldC5jbG9zZXN0KCcuaWNvbi1idG4nKTtcbiAgICBpZiAoIWJ0biB8fCBidG4uZGlzYWJsZWQpIHJldHVybjtcbiAgICBjb25zdCB0ciA9IGJ0bi5jbG9zZXN0KCd0cltkYXRhLWNpdGUta2V5XScpO1xuICAgIGlmICghdHIpIHJldHVybjtcbiAgICBjb25zdCBhY3Rpb24gPSBidG4uZGF0YXNldC5hY3Rpb247XG4gICAgaWYgICAgICAoYWN0aW9uID09PSAnYWNjZXB0JykgICBoYW5kbGVQdWJBY3Rpb24odHIuZGF0YXNldC5jaXRlS2V5LCB0cnVlKTtcbiAgICBlbHNlIGlmIChhY3Rpb24gPT09ICdyZWplY3QnKSAgIGhhbmRsZVB1YkFjdGlvbih0ci5kYXRhc2V0LmNpdGVLZXksIGZhbHNlKTtcbiAgICBlbHNlIGlmIChhY3Rpb24gPT09ICdwdWItdXAnKSAgIG1vdmVQdWJSb3coYnRuLmRhdGFzZXQuY2l0ZUtleSwgLTEpO1xuICAgIGVsc2UgaWYgKGFjdGlvbiA9PT0gJ3B1Yi1kb3duJykgbW92ZVB1YlJvdyhidG4uZGF0YXNldC5jaXRlS2V5LCArMSk7XG4gIH0pO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgRmlsdGVyIHRhYmxlIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBmaWx0ZXJQdWJsaWNhdGlvbnNUYWJsZShxdWVyeSkge1xuICBjb25zdCBxID0gcXVlcnkudG9Mb3dlckNhc2UoKTtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI3B1YmxpY2F0aW9ucy1yZXZpZXctdGFibGUgdGJvZHkgdHI6bm90KC5wdWItZGl2aWRlci1yb3cpJykuZm9yRWFjaChyb3cgPT4ge1xuICAgIHJvdy5zdHlsZS5kaXNwbGF5ID0gcSA9PT0gJycgfHwgcm93LnRleHRDb250ZW50LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkgPyAnJyA6ICdub25lJztcbiAgfSk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBSZW9yZGVyIHJvd3MgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIG1vdmVQdWJSb3coY2l0ZUtleSwgZGlyZWN0aW9uKSB7XG4gIGNvbnN0IGFyciA9IHdpbmRvdy5fcHVibGljYXRpb25zT3JkZXJlZDtcbiAgaWYgKCFhcnIgfHwgIWFyci5sZW5ndGgpIHJldHVybjtcbiAgY29uc3QgaWR4ID0gYXJyLmZpbmRJbmRleChwID0+IHAuY2l0ZV9rZXkgPT09IGNpdGVLZXkpO1xuICBpZiAoaWR4IDwgMCkgcmV0dXJuO1xuICBjb25zdCBuZXdJZHggPSBpZHggKyBkaXJlY3Rpb247XG4gIGlmIChuZXdJZHggPCAwIHx8IG5ld0lkeCA+PSBhcnIubGVuZ3RoKSByZXR1cm47XG4gIFthcnJbaWR4XSwgYXJyW25ld0lkeF1dID0gW2FycltuZXdJZHhdLCBhcnJbaWR4XV07XG4gIF9yZWJ1aWxkUHViVGFibGVCb2R5KGFycik7XG4gIC8vIFBlcnNpc3Qgb3JkZXIgdG8gYmFja2VuZCAoZmlyZS1hbmQtZm9yZ2V0KVxuICBmZXRjaCgnL2FwaS9yZW9yZGVyLXJvd3MnLCB7XG4gICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyB0eXBlOiAncHVibGljYXRpb24nLCBvcmRlcmVkX2lkczogYXJyLm1hcChwID0+IHAuY2l0ZV9rZXkpIH0pLFxuICB9KS5jYXRjaCgoKSA9PiB7fSk7XG59XG5cbmZ1bmN0aW9uIF9yZWJ1aWxkUHViVGFibGVCb2R5KHJlY29tbWVuZGF0aW9ucykge1xuICBjb25zdCB0Ym9keSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNwdWJsaWNhdGlvbnMtcmV2aWV3LXRhYmxlIHRib2R5Jyk7XG4gIGlmICghdGJvZHkpIHJldHVybjtcbiAgbGV0IGh0bWwgPSAnJztcbiAgbGV0IGRpdmlkZXJJbnNlcnRlZCA9IGZhbHNlO1xuICByZWNvbW1lbmRhdGlvbnMuZm9yRWFjaCgocHViLCBpZHgpID0+IHtcbiAgICBpZiAoIWRpdmlkZXJJbnNlcnRlZCAmJiBwdWIuaXNfcmVjb21tZW5kZWQgPT09IGZhbHNlKSB7XG4gICAgICBkaXZpZGVySW5zZXJ0ZWQgPSB0cnVlO1xuICAgICAgY29uc3QgZHMgPSAnYmFja2dyb3VuZDojZjNmNGY2O2JvcmRlci10b3A6MnB4IHNvbGlkICNkMWQ1ZGI7cGFkZGluZzowOyc7XG4gICAgICBodG1sICs9IGA8dHIgY2xhc3M9XCJwdWItZGl2aWRlci1yb3dcIj48dGQgc3R5bGU9XCIke2RzfVwiPjwvdGQ+PHRkIHN0eWxlPVwiJHtkc31jb2xvcjojNmI3MjgwO2ZvbnQtc2l6ZTowLjgyZW07Zm9udC1zdHlsZTppdGFsaWM7cGFkZGluZzo2cHggMTJweDt0ZXh0LWFsaWduOmNlbnRlcjtcIj5cdTIwMTQgUHVibGljYXRpb25zIGJlbG93IHdlcmUgbm90IHJlY29tbWVuZGVkIGZvciB0aGlzIHJvbGUgKHByZS1leGNsdWRlZCkgXHUyMDE0PC90ZD48dGQgc3R5bGU9XCIke2RzfVwiPjwvdGQ+PHRkIHN0eWxlPVwiJHtkc31cIj48L3RkPjx0ZCBzdHlsZT1cIiR7ZHN9XCI+PC90ZD48dGQgc3R5bGU9XCIke2RzfVwiPjwvdGQ+PHRkIHN0eWxlPVwiJHtkc31cIj48L3RkPjx0ZCBzdHlsZT1cIiR7ZHN9XCI+PC90ZD48dGQgc3R5bGU9XCIke2RzfVwiPjwvdGQ+PC90cj5gO1xuICAgIH1cbiAgICBjb25zdCByYW5rICAgICAgID0gaWR4ICsgMTtcbiAgICBjb25zdCBjaXRlS2V5ICAgID0gcHViLmNpdGVfa2V5IHx8ICcnO1xuICAgIGNvbnN0IGNpdGF0aW9uICAgPSBwdWIuZm9ybWF0dGVkX2NpdGF0aW9uIHx8IFtwdWIudGl0bGUsIHB1Yi52ZW51ZSwgcHViLnllYXJdLmZpbHRlcihCb29sZWFuKS5qb2luKCcuICcpO1xuICAgIGNvbnN0IHllYXIgICAgICAgPSBwdWIueWVhciB8fCAnXHUyMDE0JztcbiAgICBjb25zdCBmaXJzdEF1dGggID0gcHViLmlzX2ZpcnN0X2F1dGhvciA/ICc8c3BhbiBzdHlsZT1cImNvbG9yOiMxMGI5ODE7Zm9udC13ZWlnaHQ6NzAwO1wiIHRpdGxlPVwiRmlyc3QgYXV0aG9yXCI+XHUyNjA1PC9zcGFuPicgOiAnPHNwYW4gc3R5bGU9XCJjb2xvcjojZDFkNWRiO1wiPlx1MjYwNjwvc3Bhbj4nO1xuICAgIGNvbnN0IHNjb3JlICAgICAgPSBwdWIucmVsZXZhbmNlX3Njb3JlID8gcHViLnJlbGV2YW5jZV9zY29yZSA6ICdcdTIwMTQnO1xuICAgIGNvbnN0IGNvbmZpZGVuY2UgPSBwdWIuY29uZmlkZW5jZSB8fCAnJztcbiAgICBjb25zdCBjb25mQ29sb3IgID0gY29uZmlkZW5jZSA9PT0gJ0hpZ2gnID8gJyMxMGI5ODEnIDogY29uZmlkZW5jZSA9PT0gJ0xvdycgPyAnI2VmNDQ0NCcgOiAnI2Y1OWUwYic7XG4gICAgY29uc3QgY29uZkJhZGdlICA9IGNvbmZpZGVuY2UgPyBgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MTFweDtjb2xvcjoke2NvbmZDb2xvcn07Zm9udC13ZWlnaHQ6NjAwO1wiPiR7ZXNjYXBlSHRtbChjb25maWRlbmNlKX08L3NwYW4+YCA6ICcnO1xuICAgIGNvbnN0IHJlYXNvbmluZyAgPSBwdWIucmF0aW9uYWxlID8gYDxzbWFsbD4ke2VzY2FwZUh0bWwocHViLnJhdGlvbmFsZSl9PC9zbWFsbD5gIDogJyc7XG4gICAgY29uc3QgdmVudWVXYXJuICA9IHB1Yi52ZW51ZV93YXJuaW5nID8gYCA8c3BhbiB0aXRsZT1cIiR7ZXNjYXBlSHRtbChwdWIudmVudWVfd2FybmluZyl9XCIgc3R5bGU9XCJjb2xvcjojZGM3OTAwO2N1cnNvcjpoZWxwO1wiPlx1MjZBMDwvc3Bhbj5gIDogJyc7XG4gICAgY29uc3QgaXNBY2NlcHRlZCA9IHdpbmRvdy5wdWJsaWNhdGlvbkRlY2lzaW9uc1tjaXRlS2V5XSAhPT0gZmFsc2U7XG4gICAgY29uc3Qgcm93U3R5bGUgICA9IHB1Yi5pc19yZWNvbW1lbmRlZCA9PT0gZmFsc2UgPyAnb3BhY2l0eTowLjc7JyA6ICcnO1xuICAgIGNvbnN0IGlzRmlyc3QgICAgPSBpZHggPT09IDA7XG4gICAgY29uc3QgaXNMYXN0ICAgICA9IGlkeCA9PT0gcmVjb21tZW5kYXRpb25zLmxlbmd0aCAtIDE7XG4gICAgaHRtbCArPSBgPHRyIGRhdGEtY2l0ZS1rZXk9XCIke2VzY2FwZUh0bWwoY2l0ZUtleSl9XCIgc3R5bGU9XCIke3Jvd1N0eWxlfVwiPlxuICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7Zm9udC13ZWlnaHQ6NzAwO1wiPiR7cmFua308L3RkPlxuICAgICAgPHRkIHN0eWxlPVwiZm9udC1zaXplOjAuODdlbTtcIj4ke2VzY2FwZUh0bWwoY2l0YXRpb24pfSR7dmVudWVXYXJufTwvdGQ+XG4gICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjtcIj4ke3llYXJ9PC90ZD5cbiAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO1wiPiR7Zmlyc3RBdXRofTwvdGQ+XG4gICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjtcIj4ke3Njb3JlICE9PSAnXHUyMDE0JyA/IGA8c3Ryb25nPiR7c2NvcmV9PC9zdHJvbmc+LzEwYCA6ICdcdTIwMTQnfTwvdGQ+XG4gICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjtcIj4ke2NvbmZCYWRnZX08L3RkPlxuICAgICAgPHRkPiR7cmVhc29uaW5nfTwvdGQ+XG4gICAgICA8dGQgY2xhc3M9XCJhY3Rpb24tYnRuc1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG4ke2lzQWNjZXB0ZWQgPyAnIGFjdGl2ZScgOiAnJ31cIiBkYXRhLWFjdGlvbj1cImFjY2VwdFwiIGFyaWEtbGFiZWw9XCJJbmNsdWRlIHB1YmxpY2F0aW9uICR7ZXNjYXBlSHRtbChjaXRlS2V5KX1cIiB0aXRsZT1cIkluY2x1ZGUgaW4gQ1ZcIiBzdHlsZT1cImNvbG9yOiMxMGI5ODE7XCIgaWQ9XCJwdWItYWNjZXB0LSR7cmFua31cIj5cdTI3MTM8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuJHshaXNBY2NlcHRlZCA/ICcgYWN0aXZlJyA6ICcnfVwiIGRhdGEtYWN0aW9uPVwicmVqZWN0XCIgYXJpYS1sYWJlbD1cIkV4Y2x1ZGUgcHVibGljYXRpb24gJHtlc2NhcGVIdG1sKGNpdGVLZXkpfVwiIHRpdGxlPVwiRXhjbHVkZSBmcm9tIENWXCIgc3R5bGU9XCJjb2xvcjojZWY0NDQ0O1wiIGlkPVwicHViLXJlamVjdC0ke3Jhbmt9XCI+JHtleWVTbGFzaEljb24oKX08L2J1dHRvbj5cbiAgICAgIDwvdGQ+XG4gICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjt3aGl0ZS1zcGFjZTpub3dyYXA7XCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIGRhdGEtYWN0aW9uPVwicHViLXVwXCIgZGF0YS1jaXRlLWtleT1cIiR7ZXNjYXBlSHRtbChjaXRlS2V5KX1cIiBhcmlhLWxhYmVsPVwiTW92ZSBwdWJsaWNhdGlvbiB1cFwiIHRpdGxlPVwiTW92ZSB1cFwiICR7aXNGaXJzdCA/ICdkaXNhYmxlZCBzdHlsZT1cIm9wYWNpdHk6MC4zO1wiJyA6ICcnfT5cdTIxOTE8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgZGF0YS1hY3Rpb249XCJwdWItZG93blwiIGRhdGEtY2l0ZS1rZXk9XCIke2VzY2FwZUh0bWwoY2l0ZUtleSl9XCIgYXJpYS1sYWJlbD1cIk1vdmUgcHVibGljYXRpb24gZG93blwiIHRpdGxlPVwiTW92ZSBkb3duXCIgJHtpc0xhc3QgPyAnZGlzYWJsZWQgc3R5bGU9XCJvcGFjaXR5OjAuMztcIicgOiAnJ30+XHUyMTkzPC9idXR0b24+XG4gICAgICA8L3RkPlxuICAgIDwvdHI+YDtcbiAgfSk7XG4gIHRib2R5LmlubmVySFRNTCA9IGh0bWw7XG4gIC8vIFJlLWFwcGx5IGFueSBhY3RpdmUgZmlsdGVyXG4gIGNvbnN0IGZpbHRlclZhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWItZmlsdGVyLWlucHV0Jyk/LnZhbHVlIHx8ICcnO1xuICBpZiAoZmlsdGVyVmFsKSBmaWx0ZXJQdWJsaWNhdGlvbnNUYWJsZShmaWx0ZXJWYWwpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgVG9nZ2xlIGFjY2VwdCAvIHJlamVjdCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gaGFuZGxlUHViQWN0aW9uKGNpdGVLZXksIGFjY2VwdCkge1xuICB3aW5kb3cucHVibGljYXRpb25EZWNpc2lvbnNbY2l0ZUtleV0gPSBhY2NlcHQ7XG4gIC8vIHVwZGF0ZSBidXR0b24gYWN0aXZlIHN0YXRlcyBpbiB0aGUgcm93XG4gIGNvbnN0IHJvdyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYHRyW2RhdGEtY2l0ZS1rZXk9XCIke0NTUy5lc2NhcGUoY2l0ZUtleSl9XCJdYCk7XG4gIGlmICghcm93KSByZXR1cm47XG4gIHJvdy5xdWVyeVNlbGVjdG9yQWxsKCcuaWNvbi1idG4nKS5mb3JFYWNoKGJ0biA9PiBidG4uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJykpO1xuICBjb25zdCBhY3Rpb24gPSBhY2NlcHQgPyAnYWNjZXB0JyA6ICdyZWplY3QnO1xuICBjb25zdCBidG4gPSByb3cucXVlcnlTZWxlY3RvcihgW2RhdGEtYWN0aW9uPVwiJHthY3Rpb259XCJdYCk7XG4gIGlmIChidG4pIGJ0bi5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEJ1bGsgYWN0aW9ucyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gYnVsa1B1YkFjdGlvbihtb2RlKSB7XG4gIGNvbnN0IHB1YnMgPSB3aW5kb3cuX3B1YmxpY2F0aW9uc09yZGVyZWQgfHwgW107XG4gIGlmICghcHVicy5sZW5ndGgpIHJldHVybjtcblxuICBwdWJzLmZvckVhY2gocHViID0+IHtcbiAgICBjb25zdCBjaXRlS2V5ID0gcHViLmNpdGVfa2V5O1xuICAgIGxldCBhY2NlcHQ7XG4gICAgaWYgKG1vZGUgPT09ICdyZWNvbW1lbmRlZCcpIHtcbiAgICAgIGFjY2VwdCA9IHB1Yi5pc19yZWNvbW1lbmRlZCAhPT0gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChtb2RlID09PSAnYWNjZXB0LWFsbCcpIHtcbiAgICAgIGFjY2VwdCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFjY2VwdCA9IGZhbHNlO1xuICAgIH1cbiAgICB3aW5kb3cucHVibGljYXRpb25EZWNpc2lvbnNbY2l0ZUtleV0gPSBhY2NlcHQ7XG4gICAgLy8gVXBkYXRlIGJ1dHRvbiBzdGF0ZXMgaW4gdGhlIERPTVxuICAgIGNvbnN0IHJvdyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYHRyW2RhdGEtY2l0ZS1rZXk9XCIke0NTUy5lc2NhcGUoY2l0ZUtleSl9XCJdYCk7XG4gICAgaWYgKCFyb3cpIHJldHVybjtcbiAgICByb3cucXVlcnlTZWxlY3RvckFsbCgnLmljb24tYnRuW2RhdGEtYWN0aW9uPVwiYWNjZXB0XCJdLFtkYXRhLWFjdGlvbj1cInJlamVjdFwiXScpLmZvckVhY2goYnRuID0+IGJ0bi5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKSk7XG4gICAgY29uc3QgdGFyZ2V0ID0gcm93LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWFjdGlvbj1cIiR7YWNjZXB0ID8gJ2FjY2VwdCcgOiAncmVqZWN0J31cIl1gKTtcbiAgICBpZiAodGFyZ2V0KSB0YXJnZXQuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gIH0pO1xuXG4gIGNvbnN0IGFjY2VwdGVkID0gT2JqZWN0LnZhbHVlcyh3aW5kb3cucHVibGljYXRpb25EZWNpc2lvbnMpLmZpbHRlcihCb29sZWFuKS5sZW5ndGg7XG4gIHNob3dUb2FzdChgQnVsayBhY3Rpb24gYXBwbGllZDogJHthY2NlcHRlZH0gYWNjZXB0ZWQsICR7cHVicy5sZW5ndGggLSBhY2NlcHRlZH0gZXhjbHVkZWRgKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFN1Ym1pdCBkZWNpc2lvbnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIHN1Ym1pdFB1YmxpY2F0aW9uRGVjaXNpb25zKCkge1xuICAvKiBkdWNrZmxvdzpcbiAgICogICBpZDogcHVibGljYXRpb25zX3VpX3N1Ym1pdF9saXZlXG4gICAqICAga2luZDogdWlcbiAgICogICB0aW1lc3RhbXA6ICcyMDI2LTAzLTI1VDIxOjM5OjQ4WidcbiAgICogICBzdGF0dXM6IGxpdmVcbiAgICogICBoYW5kbGVzOlxuICAgKiAgIC0gdWk6cHVibGljYXRpb25zLXJldmlldy5zdWJtaXRcbiAgICogICBjYWxsczpcbiAgICogICAtIFBPU1QgL2FwaS9yZXZpZXctZGVjaXNpb25zXG4gICAqICAgLSBHRVQgL2FwaS9yZXdyaXRlc1xuICAgKiAgIHJlYWRzOlxuICAgKiAgIC0gd2luZG93OnB1YmxpY2F0aW9uRGVjaXNpb25zXG4gICAqICAgd3JpdGVzOlxuICAgKiAgIC0gcmVxdWVzdDpQT1NUIC9hcGkvcmV2aWV3LWRlY2lzaW9ucy5kZWNpc2lvbnNcbiAgICogICBub3RlczogUGVyc2lzdHMgcHVibGljYXRpb24gaW5jbHVkZS9leGNsdWRlIGRlY2lzaW9ucyBiZWZvcmUgdGhlIHJld3JpdGUgc3RhZ2UgZGVyaXZlcyBkb3duc3RyZWFtIGNvbnRlbnQgcHJvcG9zYWxzIGZyb20gdGhlIGFjY2VwdGVkIHB1YmxpY2F0aW9uIHNldC5cbiAgICovXG4gIGNvbnN0IGRlY2lzaW9ucyA9IHdpbmRvdy5wdWJsaWNhdGlvbkRlY2lzaW9ucyB8fCB7fTtcbiAgY29uc3QgY291bnQgPSBPYmplY3Qua2V5cyhkZWNpc2lvbnMpLmxlbmd0aDtcbiAgaWYgKGNvdW50ID09PSAwKSB7XG4gICAgc2hvd1RvYXN0KCdObyBwdWJsaWNhdGlvbiBkZWNpc2lvbnMgdG8gc2F2ZS4nLCAnZXJyb3InKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBQZXJzaXN0IGFzIGEgc3RydWN0dXJlZCBhbnN3ZXIgaW4gc2Vzc2lvbiBzdGF0ZVxuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvcmV2aWV3LWRlY2lzaW9ucycsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHR5cGU6ICdwdWJsaWNhdGlvbnMnLCBkZWNpc2lvbnM6IHdpbmRvdy5wdWJsaWNhdGlvbkRlY2lzaW9ucyB9KVxuICAgIH0pO1xuXG4gICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICBzdGF0ZU1hbmFnZXIubWFya0NvbnRlbnRDaGFuZ2VkKCk7XG4gICAgICBjb25zdCBhY2NlcHRlZCA9IE9iamVjdC52YWx1ZXMod2luZG93LnB1YmxpY2F0aW9uRGVjaXNpb25zKS5maWx0ZXIoQm9vbGVhbikubGVuZ3RoO1xuICAgICAgY29uc3QgcmVqZWN0ZWQgPSBjb3VudCAtIGFjY2VwdGVkO1xuICAgICAgc2hvd1RvYXN0KGBQdWJsaWNhdGlvbiBzZWxlY3Rpb25zIHNhdmVkOiAke2FjY2VwdGVkfSBrZXB0LCAke3JlamVjdGVkfSBleGNsdWRlZGApO1xuICAgICAgYXdhaXQgZmV0Y2hBbmRSZXZpZXdSZXdyaXRlcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBlcnIgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICBzaG93VG9hc3QoYEVycm9yOiAke2Vyci5lcnJvciB8fCAnRmFpbGVkIHRvIHNhdmUgcHVibGljYXRpb24gc2VsZWN0aW9ucyd9YCwgJ2Vycm9yJyk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cuZXJyb3IoJ0Vycm9yIHNhdmluZyBwdWJsaWNhdGlvbiBkZWNpc2lvbnM6JywgZXJyKTtcbiAgICBzaG93VG9hc3QoJ0ZhaWxlZCB0byBzYXZlIHB1YmxpY2F0aW9uIHNlbGVjdGlvbnMuIFBsZWFzZSB0cnkgYWdhaW4uJywgJ2Vycm9yJyk7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIEV4cG9ydHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmV4cG9ydCB7XG4gIGJ1aWxkUHVibGljYXRpb25zUmV2aWV3VGFibGUsXG4gIGJ1bGtQdWJBY3Rpb24sXG4gIGZpbHRlclB1YmxpY2F0aW9uc1RhYmxlLFxuICBoYW5kbGVQdWJBY3Rpb24sXG4gIHN1Ym1pdFB1YmxpY2F0aW9uRGVjaXNpb25zLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL3Jld3JpdGUtcmV2aWV3LmpzXG4gKiBSZXdyaXRlIHJldmlldyBwYW5lbDogZmV0Y2ggcmV3cml0ZXMsIHJlbmRlciBjYXJkcyB3aXRoIHdvcmQtZGlmZixcbiAqIGFjY2VwdC9lZGl0L3JlamVjdCBkZWNpc2lvbnMsIHN1Ym1pdC5cbiAqXG4gKiBEZXBlbmRlbmNpZXMgKHJlc29sdmVkIHRocm91Z2ggZ2xvYmFsVGhpcyBhdCBydW50aW1lKTpcbiAqICAgYXBwZW5kTG9hZGluZ01lc3NhZ2UsIHJlbW92ZUxvYWRpbmdNZXNzYWdlLCBhcHBlbmRSZXRyeU1lc3NhZ2UsIGFwcGVuZE1lc3NhZ2UsXG4gKiAgIHNldExvYWRpbmcsIHNlbmRBY3Rpb24sIHN3aXRjaFRhYiwgc2NoZWR1bGVBdHNSZWZyZXNoLFxuICogICBlc2NhcGVIdG1sLCBwYXJzZVJld3JpdGVzUmVzcG9uc2UsIFBIQVNFU1xuICovXG5cbmltcG9ydCB7IHN0YXRlTWFuYWdlciB9IGZyb20gJy4vc3RhdGUtbWFuYWdlci5qcyc7XG5cbi8vIE1vZHVsZS1sZXZlbCBzdGF0ZVxubGV0IHJld3JpdGVEZWNpc2lvbnMgPSB7fTtcbmxldCBfcmV3cml0ZVBhbmVsQ2FjaGUgPSBudWxsO1xubGV0IHBlcnN1YXNpb25XYXJuaW5nc0Fja25vd2xlZGdlZCA9IGZhbHNlO1xubGV0IF93YXJuaW5nc0J5UmV3cml0ZUlkID0ge307ICAvLyBNYXAgZnJvbSByZXdyaXRlIGlkIFx1MjE5MiB3YXJuaW5nIGxpc3QgKFBhdGggMSlcbmxldCBfcmVzdG9yZVRvYXN0U2hvd24gPSBmYWxzZTtcblxuZnVuY3Rpb24gc3luY1Jld3JpdGVHbG9iYWxzKCkge1xuICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgd2luZG93LnJld3JpdGVEZWNpc2lvbnMgPSByZXdyaXRlRGVjaXNpb25zO1xuICB3aW5kb3cuX3Jld3JpdGVQYW5lbENhY2hlID0gX3Jld3JpdGVQYW5lbENhY2hlO1xuICB3aW5kb3cuYWNjZXB0QWxsUmV3cml0ZXMgPSBhY2NlcHRBbGxSZXdyaXRlcztcbiAgd2luZG93LnJlamVjdEFsbFJld3JpdGVzID0gcmVqZWN0QWxsUmV3cml0ZXM7XG4gIHdpbmRvdy50b2dnbGVSZXdyaXRlQ29tcGFjdE1vZGUgPSB0b2dnbGVSZXdyaXRlQ29tcGFjdE1vZGU7XG59XG5cbmZ1bmN0aW9uIF9kZWNpc2lvbnNLZXkoKSB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2lkID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKS5nZXQoJ3Nlc3Npb24nKTtcbiAgICByZXR1cm4gc2lkID8gYHJ3X2RlY2lzaW9uc18ke3NpZH1gIDogbnVsbDtcbiAgfSBjYXRjaCAoXykgeyByZXR1cm4gbnVsbDsgfVxufVxuXG5mdW5jdGlvbiBfcGVyc2lzdERlY2lzaW9ucygpIHtcbiAgY29uc3Qga2V5ID0gX2RlY2lzaW9uc0tleSgpO1xuICBpZiAoIWtleSkgcmV0dXJuO1xuICB0cnkgeyBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIEpTT04uc3RyaW5naWZ5KHJld3JpdGVEZWNpc2lvbnMpKTsgfSBjYXRjaCAoXykge31cbn1cblxuLy8gRmFsbGJhY2sgYXVkaXQgZnJvbSB0aGUgbGFzdCAvYXBpL3Jld3JpdGVzIHJlc3BvbnNlIFx1MjAxNCB1c2VkIGZvciBjb2xkLXJlc3RvcmUgKEdBUC0xODYpLlxubGV0IF9iYWNrZW5kUmV3cml0ZUF1ZGl0ID0gW107XG5cbmZ1bmN0aW9uIF9yZXN0b3JlRGVjaXNpb25zKCkge1xuICBjb25zdCBrZXkgPSBfZGVjaXNpb25zS2V5KCk7XG4gIGlmICgha2V5KSByZXR1cm47XG4gIGNvbnN0IGhhZERlY2lzaW9ucyA9IE9iamVjdC5rZXlzKHJld3JpdGVEZWNpc2lvbnMpLmxlbmd0aCA+IDA7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2F2ZWQgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSkgfHwgJ251bGwnKTtcbiAgICBpZiAoc2F2ZWQgJiYgdHlwZW9mIHNhdmVkID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShzYXZlZCkpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24ocmV3cml0ZURlY2lzaW9ucywgc2F2ZWQpO1xuICAgICAgc3luY1Jld3JpdGVHbG9iYWxzKCk7XG4gICAgICBpZiAoIWhhZERlY2lzaW9ucyAmJiAhX3Jlc3RvcmVUb2FzdFNob3duICYmIE9iamVjdC5rZXlzKHJld3JpdGVEZWNpc2lvbnMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgX3Jlc3RvcmVUb2FzdFNob3duID0gdHJ1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBzaG93VG9hc3QoJ1lvdXIgcHJldmlvdXMgcmV3cml0ZSBkZWNpc2lvbnMgaGF2ZSBiZWVuIHJlc3RvcmVkIFx1MjAxNCB5b3UgY2FuIHN0aWxsIGNoYW5nZSB0aGVtLicsICd3YXJuaW5nJywgNjAwMCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH0gY2F0Y2ggKF8pIHt9XG5cbiAgLy8gQ29sZC1yZXN0b3JlIGZhbGxiYWNrOiBzZWVkIGRlY2lzaW9ucyBmcm9tIGJhY2tlbmQgcmV3cml0ZV9hdWRpdCB3aGVuXG4gIC8vIGxvY2FsU3RvcmFnZSBoYXMgbm90aGluZyAoZGlmZmVyZW50IGRldmljZSwgaW5jb2duaXRvLCBjbGVhcmVkIHN0b3JhZ2UpLlxuICBpZiAoX2JhY2tlbmRSZXdyaXRlQXVkaXQubGVuZ3RoID4gMCkge1xuICAgIGZvciAoY29uc3QgZW50cnkgb2YgX2JhY2tlbmRSZXdyaXRlQXVkaXQpIHtcbiAgICAgIGNvbnN0IGlkID0gZW50cnkuaWQ7XG4gICAgICBpZiAoIWlkIHx8ICFlbnRyeS5vdXRjb21lKSBjb250aW51ZTtcbiAgICAgIHJld3JpdGVEZWNpc2lvbnNbaWRdID0ge1xuICAgICAgICBvdXRjb21lOiBlbnRyeS5vdXRjb21lLFxuICAgICAgICBmaW5hbF90ZXh0OiBlbnRyeS5vdXRjb21lID09PSAnZWRpdCcgPyAoZW50cnkuZmluYWwgPz8gbnVsbCkgOiBudWxsLFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKE9iamVjdC5rZXlzKHJld3JpdGVEZWNpc2lvbnMpLmxlbmd0aCA+IDApIHtcbiAgICAgIHN5bmNSZXdyaXRlR2xvYmFscygpO1xuICAgICAgX3BlcnNpc3REZWNpc2lvbnMoKTtcbiAgICAgIGlmICghaGFkRGVjaXNpb25zICYmICFfcmVzdG9yZVRvYXN0U2hvd24pIHtcbiAgICAgICAgX3Jlc3RvcmVUb2FzdFNob3duID0gdHJ1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBzaG93VG9hc3QoJ1lvdXIgcHJldmlvdXMgcmV3cml0ZSBkZWNpc2lvbnMgaGF2ZSBiZWVuIHJlc3RvcmVkIFx1MjAxNCB5b3UgY2FuIHN0aWxsIGNoYW5nZSB0aGVtLicsICd3YXJuaW5nJywgNjAwMCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gX2NsZWFyUGVyc2lzdGVkRGVjaXNpb25zKCkge1xuICBjb25zdCBrZXkgPSBfZGVjaXNpb25zS2V5KCk7XG4gIGlmICgha2V5KSByZXR1cm47XG4gIHRyeSB7IGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7IH0gY2F0Y2ggKF8pIHt9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBSZXdyaXRlIHNuYXBzaG90IChjaGFuZ2VkLWl0ZW0gaGlnaGxpZ2h0aW5nKSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmZ1bmN0aW9uIF9zbmFwc2hvdEtleSgpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzaWQgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpLmdldCgnc2Vzc2lvbicpO1xuICAgIHJldHVybiBzaWQgPyBgcndfc25hcHNob3RfJHtzaWR9YCA6IG51bGw7XG4gIH0gY2F0Y2ggKF8pIHsgcmV0dXJuIG51bGw7IH1cbn1cblxuZnVuY3Rpb24gX3NhdmVSZXdyaXRlU25hcHNob3QocmV3cml0ZXMpIHtcbiAgY29uc3Qga2V5ID0gX3NuYXBzaG90S2V5KCk7XG4gIGlmICgha2V5KSByZXR1cm47XG4gIGNvbnN0IG1hcCA9IHt9O1xuICBmb3IgKGNvbnN0IHIgb2YgcmV3cml0ZXMpIHtcbiAgICBjb25zdCBjYXJkSWQgPSBTdHJpbmcoci5pZCkucmVwbGFjZSgvW15hLXpBLVowLTlfLV0vZywgJ18nKTtcbiAgICBtYXBbY2FyZElkXSA9IHIucHJvcG9zZWQgfHwgJyc7XG4gIH1cbiAgdHJ5IHsgbG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCBKU09OLnN0cmluZ2lmeShtYXApKTsgfSBjYXRjaCAoXykge31cbn1cblxuZnVuY3Rpb24gX2dldFJld3JpdGVTbmFwc2hvdCgpIHtcbiAgY29uc3Qga2V5ID0gX3NuYXBzaG90S2V5KCk7XG4gIGlmICgha2V5KSByZXR1cm4gbnVsbDtcbiAgdHJ5IHsgcmV0dXJuIEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KSB8fCAnbnVsbCcpOyB9IGNhdGNoIChfKSB7IHJldHVybiBudWxsOyB9XG59XG5cbmZ1bmN0aW9uIF9jbGVhclJld3JpdGVTbmFwc2hvdCgpIHtcbiAgY29uc3Qga2V5ID0gX3NuYXBzaG90S2V5KCk7XG4gIGlmICgha2V5KSByZXR1cm47XG4gIHRyeSB7IGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7IH0gY2F0Y2ggKF8pIHt9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoQW5kUmV2aWV3UmV3cml0ZXMoKSB7XG4gIGNvbnN0IGxvYWRpbmdNc2cgPSBhcHBlbmRMb2FkaW5nTWVzc2FnZSgnQ2hlY2tpbmcgZm9yIHRleHQgaW1wcm92ZW1lbnRzLi4uJyk7XG4gIHNldExvYWRpbmcodHJ1ZSwgJ1Jldmlld2luZyByZXdyaXRlc1x1MjAyNicpO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3Jld3JpdGVzJyk7XG4gICAgY29uc3QgZGF0YSA9IHBhcnNlUmV3cml0ZXNSZXNwb25zZShhd2FpdCByZXMuanNvbigpKTtcbiAgICByZW1vdmVMb2FkaW5nTWVzc2FnZShsb2FkaW5nTXNnKTtcbiAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICBpZiAoIXJlcy5vaykge1xuICAgICAgYXBwZW5kUmV0cnlNZXNzYWdlKCdcdTI3NEMgRXJyb3IgY2hlY2tpbmcgcmV3cml0ZXM6ICcgKyAoZGF0YS5lcnJvciB8fCAnVW5rbm93biBlcnJvcicpLCBmZXRjaEFuZFJldmlld1Jld3JpdGVzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmV3cml0ZXMgPSBkYXRhLnJld3JpdGVzIHx8IFtdO1xuICAgIGNvbnN0IHdhcm5pbmdzID0gZGF0YS5wZXJzdWFzaW9uX3dhcm5pbmdzIHx8IFtdOyAgLy8gUGhhc2UgMTBcbiAgICBfYmFja2VuZFJld3JpdGVBdWRpdCA9IGRhdGEucmV3cml0ZV9hdWRpdCB8fCBbXTtcblxuICAgIC8vIFNob3cgcGVyc3Vhc2lvbiB3YXJuaW5ncyBmaXJzdCAoUGhhc2UgMTApXG4gICAgcGVyc3Vhc2lvbldhcm5pbmdzQWNrbm93bGVkZ2VkID0gd2FybmluZ3MubGVuZ3RoID09PSAwOyAgLy8gTWFyayBhY2tub3dsZWRnZWQgaWYgbm8gd2FybmluZ3NcbiAgICBpZiAod2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbXNnID0gYFx1MjZBMFx1RkUwRiAqKiR7d2FybmluZ3MubGVuZ3RofSoqIHBlcnN1YXNpb24gY2hlY2ske3dhcm5pbmdzLmxlbmd0aCA+IDEgPyAncycgOiAnJ30gZmxhZ2dlZC4gUmV2aWV3IHRoZXNlIGJlZm9yZSBzdWJtaXR0aW5nLmA7XG4gICAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCBtc2cpO1xuICAgIH1cblxuICAgIC8vIFNob3cgcmV3cml0ZSByZXZpZXcgcGFuZWxcbiAgICByZXdyaXRlRGVjaXNpb25zID0ge307XG4gICAgc3luY1Jld3JpdGVHbG9iYWxzKCk7XG4gICAgcmVuZGVyUmV3cml0ZVBhbmVsKHJld3JpdGVzLCB3YXJuaW5ncyk7ICAvLyBQYXNzIHdhcm5pbmdzIHRvIHBhbmVsXG4gICAgc3dpdGNoVGFiKCdyZXdyaXRlJyk7XG4gICAgY29uc3QgbiA9IHJld3JpdGVzLmxlbmd0aDtcbiAgICBpZiAobiA9PT0gMCkge1xuICAgICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ1x1MjcwRlx1RkUwRiBObyByZXdyaXRlIHN1Z2dlc3Rpb25zIHdlcmUgbmVlZGVkIFx1MjAxNCB5b3VyIHNlbGVjdGVkIGNvbnRlbnQgYWxyZWFkeSB1c2VzIHRoZSBqb2JcXCdzIHRlcm1pbm9sb2d5IHdlbGwuIFRoZSAqKlJld3JpdGVzKiogdGFiIGlzIHN0aWxsIGF2YWlsYWJsZSBzbyB5b3UgY2FuIGNvbmZpcm0gYW5kIGNvbnRpbnVlIHRvICoqU3BlbGwgQ2hlY2sqKiB3aGVuIHJlYWR5LicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCBgXHUyNzBGXHVGRTBGIFlvdSd2ZSBjb25maXJtZWQgeW91ciBleHBlcmllbmNlLCBza2lsbCwgYW5kIGFjaGlldmVtZW50IHNlbGVjdGlvbnMuIEhlcmUgYXJlIHRoZSBBSSdzICoqJHtufSoqIHRleHQgaW1wcm92ZW1lbnQgc3VnZ2VzdGlvbiR7biA+IDEgPyAncycgOiAnJ30gZm9yIHRoZSBpbmNsdWRlZCBidWxsZXRzIFx1MjAxNCBlYWNoIG9uZSBpbnRyb2R1Y2VzIGpvYi1yZWxldmFudCBrZXl3b3JkcyB3aGlsZSBwcmVzZXJ2aW5nIHlvdXIgZmFjdHMuIFJldmlldyBlYWNoIHN1Z2dlc3Rpb24gaW4gdGhlICoqUmV3cml0ZXMqKiB0YWIsIHRoZW4gYWNjZXB0LCBlZGl0LCBvciByZWplY3QgYmVmb3JlIGNvbnRpbnVpbmcgdG8gc3BlbGwgY2hlY2suYCk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZW1vdmVMb2FkaW5nTWVzc2FnZShsb2FkaW5nTXNnKTtcbiAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICBhcHBlbmRSZXRyeU1lc3NhZ2UoJ1x1Mjc0QyBFcnJvcjogJyArIGVyci5tZXNzYWdlLCBmZXRjaEFuZFJldmlld1Jld3JpdGVzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfcmVuZGVyUmV3cml0ZUF1ZGl0TG9nKCkge1xuICBpZiAoIV9iYWNrZW5kUmV3cml0ZUF1ZGl0IHx8IF9iYWNrZW5kUmV3cml0ZUF1ZGl0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuICcnO1xuXG4gIGNvbnN0IE9VVENPTUVfSUNPTiA9IHsgYWNjZXB0OiAnXHUyNzA1JywgcmVqZWN0OiAnXHUyNzRDJywgZWRpdDogJ1x1MjcwRlx1RkUwRicgfTtcbiAgY29uc3QgT1VUQ09NRV9MQUJFTCA9IHsgYWNjZXB0OiAnQWNjZXB0ZWQnLCByZWplY3Q6ICdSZWplY3RlZCcsIGVkaXQ6ICdFZGl0ZWQnIH07XG5cbiAgY29uc3Qgcm93cyA9IF9iYWNrZW5kUmV3cml0ZUF1ZGl0Lm1hcChlbnRyeSA9PiB7XG4gICAgY29uc3QgaWNvbiAgPSBPVVRDT01FX0lDT05bZW50cnkub3V0Y29tZV0gfHwgJ1x1Mjc1Myc7XG4gICAgY29uc3QgbGFiZWwgPSBPVVRDT01FX0xBQkVMW2VudHJ5Lm91dGNvbWVdIHx8IGVudHJ5Lm91dGNvbWU7XG4gICAgY29uc3QgbG9jICAgPSBlc2NhcGVIdG1sKGVudHJ5LmxvY2F0aW9uIHx8IGVudHJ5LmZpZWxkIHx8ICcnKTtcbiAgICBjb25zdCBvcmlnICA9IGVzY2FwZUh0bWwoZW50cnkub3JpZ2luYWwgfHwgJycpO1xuICAgIGNvbnN0IHByb3AgID0gZXNjYXBlSHRtbChlbnRyeS5wcm9wb3NlZCB8fCAnJyk7XG4gICAgY29uc3QgZmluICAgPSBlbnRyeS5vdXRjb21lID09PSAnZWRpdCcgJiYgZW50cnkuZmluYWxcbiAgICAgID8gYDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOjRweDtjb2xvcjojMWQ0ZWQ4O2ZvbnQtc2l6ZTowLjg1ZW07XCI+RmluYWw6ICR7ZXNjYXBlSHRtbChlbnRyeS5maW5hbCl9PC9kaXY+YFxuICAgICAgOiAnJztcbiAgICByZXR1cm4gYFxuICAgICAgPGRpdiBzdHlsZT1cImJvcmRlci1ib3R0b206MXB4IHNvbGlkICNlMmU4ZjA7cGFkZGluZzo4cHggMDtmb250LXNpemU6MC44OGVtO1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6NnB4O21hcmdpbi1ib3R0b206NHB4O1wiPlxuICAgICAgICAgIDxzcGFuIHRpdGxlPVwiJHtsYWJlbH1cIj4ke2ljb259PC9zcGFuPlxuICAgICAgICAgIDxzdHJvbmcgc3R5bGU9XCJjb2xvcjojMzc0MTUxO1wiPiR7bGFiZWx9PC9zdHJvbmc+XG4gICAgICAgICAgJHtsb2MgPyBgPHNwYW4gc3R5bGU9XCJjb2xvcjojOWNhM2FmO2ZvbnQtc2l6ZTowLjg1ZW07XCI+XHUyMDE0ICR7bG9jfTwvc3Bhbj5gIDogJyd9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IHN0eWxlPVwiY29sb3I6IzZiNzI4MDt0ZXh0LWRlY29yYXRpb246bGluZS10aHJvdWdoO2ZvbnQtc2l6ZTowLjg1ZW07XCI+JHtvcmlnfTwvZGl2PlxuICAgICAgICA8ZGl2IHN0eWxlPVwiY29sb3I6IzM3NDE1MTtmb250LXNpemU6MC44NWVtO1wiPiR7cHJvcH08L2Rpdj5cbiAgICAgICAgJHtmaW59XG4gICAgICA8L2Rpdj5gO1xuICB9KS5qb2luKCcnKTtcblxuICByZXR1cm4gYFxuICAgIDxkZXRhaWxzIHN0eWxlPVwibWFyZ2luLXRvcDoyNHB4O2JvcmRlcjoxcHggc29saWQgI2UyZThmMDtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjEycHggMTZweDtcIj5cbiAgICAgIDxzdW1tYXJ5IHN0eWxlPVwiY3Vyc29yOnBvaW50ZXI7Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOiMzNzQxNTE7bGlzdC1zdHlsZTpub25lO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDtcIj5cbiAgICAgICAgPHNwYW4+XHVEODNEXHVEQ0NCPC9zcGFuPlxuICAgICAgICA8c3Bhbj5SZXdyaXRlIEF1ZGl0IExvZyAoJHtfYmFja2VuZFJld3JpdGVBdWRpdC5sZW5ndGh9IGRlY2lzaW9uJHtfYmFja2VuZFJld3JpdGVBdWRpdC5sZW5ndGggPT09IDEgPyAnJyA6ICdzJ30pPC9zcGFuPlxuICAgICAgICA8c3BhbiBzdHlsZT1cIm1hcmdpbi1sZWZ0OmF1dG87Y29sb3I6IzljYTNhZjtmb250LXNpemU6MC44NWVtO1wiPlx1MjVCQyBzaG93PC9zcGFuPlxuICAgICAgPC9zdW1tYXJ5PlxuICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6MTJweDtcIj4ke3Jvd3N9PC9kaXY+XG4gICAgPC9kZXRhaWxzPmA7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclJld3JpdGVQYW5lbChyZXdyaXRlcywgd2FybmluZ3MgPSBbXSkge1xuICBfcmV3cml0ZVBhbmVsQ2FjaGUgPSB7IHJld3JpdGVzLCB3YXJuaW5ncyB9O1xuICAvLyBCdWlsZCBwZXItY2FyZCB3YXJuaW5nIGluZGV4IGZvciBQYXRoIDEgYmFkZ2VzXG4gIF93YXJuaW5nc0J5UmV3cml0ZUlkID0ge307XG4gIGZvciAoY29uc3QgdyBvZiB3YXJuaW5ncykge1xuICAgIGlmICghX3dhcm5pbmdzQnlSZXdyaXRlSWRbdy5pZF0pIF93YXJuaW5nc0J5UmV3cml0ZUlkW3cuaWRdID0gW107XG4gICAgX3dhcm5pbmdzQnlSZXdyaXRlSWRbdy5pZF0ucHVzaCh3KTtcbiAgfVxuICBzeW5jUmV3cml0ZUdsb2JhbHMoKTtcbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIGNvbnN0IGhhc1Jld3JpdGVzID0gcmV3cml0ZXMubGVuZ3RoID4gMDtcblxuICAvLyBCdWlsZCBwZXJzdWFzaW9uIHdhcm5pbmdzIHNlY3Rpb24gKFBoYXNlIDEwKVxuICBsZXQgd2FybmluZ3NIdG1sID0gJyc7XG4gIGlmICh3YXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3Qgd2FybmluZ3NCeVR5cGUgPSB7fTtcbiAgICB3YXJuaW5ncy5mb3JFYWNoKHcgPT4ge1xuICAgICAgaWYgKCF3YXJuaW5nc0J5VHlwZVt3LmZsYWdfdHlwZV0pIHdhcm5pbmdzQnlUeXBlW3cuZmxhZ190eXBlXSA9IDA7XG4gICAgICB3YXJuaW5nc0J5VHlwZVt3LmZsYWdfdHlwZV0rKztcbiAgICB9KTtcbiAgICBjb25zdCB3YXJuaW5nQ291bnRzID0gT2JqZWN0LmVudHJpZXMod2FybmluZ3NCeVR5cGUpXG4gICAgICAubWFwKChbdHlwZSwgY291bnRdKSA9PiBgJHtjb3VudH0gJHt0eXBlLnJlcGxhY2UoL18vZywgJyAnKX1gKVxuICAgICAgLmpvaW4oJywgJyk7XG5cbiAgICB3YXJuaW5nc0h0bWwgPSBgXG4gICAgICA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZmVmMmYyO2JvcmRlcjoxcHggc29saWQgI2ZlY2FjYTtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjE0cHg7bWFyZ2luLWJvdHRvbToyMHB4O1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTBweDttYXJnaW4tYm90dG9tOjEwcHg7Y3Vyc29yOnBvaW50ZXI7XCIgb25jbGljaz1cInRoaXMucGFyZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yKCcjd2FybmluZ3MtZGV0YWlsJykuc3R5bGUuZGlzcGxheSA9IHRoaXMucGFyZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yKCcjd2FybmluZ3MtZGV0YWlsJykuc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnID8gJ2Jsb2NrJyA6ICdub25lJztcIj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZToyMHB4O1wiPlx1MjZBMFx1RkUwRjwvc3Bhbj5cbiAgICAgICAgICA8c3Ryb25nIHN0eWxlPVwiY29sb3I6Izk5MWIxYjtcIj5QZXJzdWFzaW9uIGNoZWNrczogJHt3YXJuaW5nQ291bnRzfTwvc3Ryb25nPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwibWFyZ2luLWxlZnQ6YXV0bztjb2xvcjojN2YxZDFkO1wiPlx1MjVCQzwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJ3YXJuaW5ncy1kZXRhaWxcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTttYXJnaW4tdG9wOjEwcHg7cGFkZGluZy10b3A6MTBweDtib3JkZXItdG9wOjFweCBzb2xpZCAjZmVjYWNhO1wiPlxuICAgICAgICAgICR7d2FybmluZ3MubWFwKHcgPT4gYFxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6OHB4O21hcmdpbi1ib3R0b206OHB4O2JhY2tncm91bmQ6I2ZmZjdlZDtib3JkZXItbGVmdDozcHggc29saWQgI2Y5NzMxNjtib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6MC45ZW07XCI+XG4gICAgICAgICAgICAgIDxzdHJvbmc+JHt3LmZsYWdfdHlwZS5yZXBsYWNlKC9fL2csICcgJyl9PC9zdHJvbmc+IGF0ICR7dy5sb2NhdGlvbn08YnI+XG4gICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6IzdjMmQxMjtcIj4ke3cuZGV0YWlsc308L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBgKS5qb2luKCcnKX1cbiAgICAgICAgICA8YnV0dG9uIHN0eWxlPVwibWFyZ2luLXRvcDoxMHB4O3BhZGRpbmc6OHB4IDEycHg7YmFja2dyb3VuZDojOTkxYjFiO2NvbG9yOndoaXRlO2JvcmRlcjpub25lO2JvcmRlci1yYWRpdXM6NHB4O2N1cnNvcjpwb2ludGVyO1wiIG9uY2xpY2s9XCJzZXRQZXJzdWFzaW9uV2FybmluZ3NBY2tub3dsZWRnZWQodHJ1ZSk7IHRoaXMucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMC42JzsgdXBkYXRlUmV3cml0ZVRhbGx5KCk7XCI+XG4gICAgICAgICAgICBcdTI3MTMgQWNrbm93bGVkZ2VkXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxuXG4gIC8vIENvbXB1dGUgcGVyLWNhcmQgY2hhbmdlIHN0YXR1cyByZWxhdGl2ZSB0byBwcmV2aW91cyByZW5kZXIncyBzbmFwc2hvdC5cbiAgY29uc3QgcHJldlNuYXBzaG90ID0gX2dldFJld3JpdGVTbmFwc2hvdCgpO1xuICBjb25zdCBjaGFuZ2VTdGF0dXNNYXAgPSB7fTtcbiAgaWYgKHByZXZTbmFwc2hvdCkge1xuICAgIGZvciAoY29uc3QgciBvZiByZXdyaXRlcykge1xuICAgICAgY29uc3QgY2FyZElkID0gU3RyaW5nKHIuaWQpLnJlcGxhY2UoL1teYS16QS1aMC05Xy1dL2csICdfJyk7XG4gICAgICBpZiAoIShjYXJkSWQgaW4gcHJldlNuYXBzaG90KSkge1xuICAgICAgICBjaGFuZ2VTdGF0dXNNYXBbY2FyZElkXSA9ICduZXcnO1xuICAgICAgfSBlbHNlIGlmIChwcmV2U25hcHNob3RbY2FyZElkXSAhPT0gKHIucHJvcG9zZWQgfHwgJycpKSB7XG4gICAgICAgIGNoYW5nZVN0YXR1c01hcFtjYXJkSWRdID0gJ3VwZGF0ZWQnO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvLyBTYXZlIGN1cnJlbnQgcmV3cml0ZXMgYXMgc25hcHNob3QgZm9yIG5leHQgcmVuZGVyIGNvbXBhcmlzb24uXG4gIF9zYXZlUmV3cml0ZVNuYXBzaG90KHJld3JpdGVzKTtcblxuICBjb250ZW50LmlubmVySFRNTCA9IHdhcm5pbmdzSHRtbCArIGBcbiAgICA8ZGl2IGlkPVwicmV3cml0ZS1wYW5lbFwiPlxuICAgICAgPGgxPlx1MjcwRlx1RkUwRiBSZXZpZXcgVGV4dCBJbXByb3ZlbWVudHM8L2gxPlxuICAgICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO21hcmdpbi1ib3R0b206MjBweDtcIj5cbiAgICAgICAgJHtoYXNSZXdyaXRlc1xuICAgID8gJ1JldmlldyBlYWNoIHN1Z2dlc3RlZCB0ZXh0IGltcHJvdmVtZW50LiBBY2NlcHQsIGVkaXQsIG9yIHJlamVjdCBhbGwgc3VnZ2VzdGlvbnMgYmVmb3JlIHByb2NlZWRpbmcgdG8gc3BlbGwgY2hlY2suJ1xuICAgIDogJ05vIHRleHQgaW1wcm92ZW1lbnRzIHdlcmUgc3VnZ2VzdGVkIGZvciB0aGlzIENWLiBDb250aW51ZSB3aGVuIHlvdSBhcmUgcmVhZHkgdG8gbW92ZSB0byBzcGVsbCBjaGVjay4nfVxuICAgICAgPC9wPlxuICAgICAgPGRpdiBjbGFzcz1cInJld3JpdGUtdGFsbHktYmFyXCIgaWQ9XCJyZXdyaXRlLXRhbGx5XCIgJHtoYXNSZXdyaXRlcyA/ICcnIDogJ3N0eWxlPVwiZGlzcGxheTpub25lXCInfT5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0YWxseS1hY2NlcHRlZFwiPlx1MjcxMyBBY2NlcHRlZDogPHN0cm9uZyBpZD1cInRhbGx5LWFjY2VwdGVkXCI+MDwvc3Ryb25nPjwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0YWxseS1yZWplY3RlZFwiPlx1MjcxNyBSZWplY3RlZDogPHN0cm9uZyBpZD1cInRhbGx5LXJlamVjdGVkXCI+MDwvc3Ryb25nPjwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0YWxseS1wZW5kaW5nXCI+XHUyM0YzIFBlbmRpbmc6IDxzdHJvbmcgaWQ9XCJ0YWxseS1wZW5kaW5nXCI+JHtyZXdyaXRlcy5sZW5ndGh9PC9zdHJvbmc+PC9zcGFuPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwicnctYnVsay1idG5cIiBvbmNsaWNrPVwiYWNjZXB0QWxsUmV3cml0ZXMoKVwiIHRpdGxlPVwiQWNjZXB0IGFsbCBwZW5kaW5nIHN1Z2dlc3Rpb25zXCI+XHUyNzEzIEFjY2VwdCBBbGw8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInJ3LWJ1bGstYnRuIHJ3LWJ1bGstcmVqZWN0XCIgb25jbGljaz1cInJlamVjdEFsbFJld3JpdGVzKClcIiB0aXRsZT1cIlJlamVjdCBhbGwgcGVuZGluZyBzdWdnZXN0aW9uc1wiPlx1MjcxNyBSZWplY3QgQWxsPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJydy1jb21wYWN0LXRvZ2dsZVwiIGlkPVwicnctY29tcGFjdC1idG5cIiBvbmNsaWNrPVwidG9nZ2xlUmV3cml0ZUNvbXBhY3RNb2RlKClcIiB0aXRsZT1cIlN3aXRjaCB0byBjb21wYWN0IHNpbmdsZS1saW5lIHZpZXcgZm9yIHJhcGlkIHJldmlld1wiPlx1MjI5RSBDb21wYWN0PC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJzdWJtaXQtcmV3cml0ZXMtYnRuXCIgaWQ9XCJzdWJtaXQtcmV3cml0ZXMtYnRuXCIgZGlzYWJsZWRcbiAgICAgICAgICAgICAgICBvbmNsaWNrPVwic3VibWl0UmV3cml0ZURlY2lzaW9ucygpXCI+U3VibWl0IEFsbCBEZWNpc2lvbnM8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBpZD1cInJld3JpdGUtY2FyZHNcIj5cbiAgICAgICAgJHtoYXNSZXdyaXRlc1xuICAgID8gcmV3cml0ZXMubWFwKHIgPT4ge1xuICAgICAgICBjb25zdCBjYXJkSWQgPSBTdHJpbmcoci5pZCkucmVwbGFjZSgvW15hLXpBLVowLTlfLV0vZywgJ18nKTtcbiAgICAgICAgcmV0dXJuIHJlbmRlclJld3JpdGVDYXJkKHIsIF93YXJuaW5nc0J5UmV3cml0ZUlkW3IuaWRdIHx8IFtdLCBjaGFuZ2VTdGF0dXNNYXBbY2FyZElkXSB8fCBudWxsKTtcbiAgICAgIH0pLmpvaW4oJycpXG4gICAgOiBgXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImVtcHR5LXN0YXRlXCIgc3R5bGU9XCJtYXJnaW4tdG9wOjI0cHg7XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWNvblwiPlx1MjcwRlx1RkUwRjwvZGl2PlxuICAgICAgICAgICAgPGgzPk5vIFJld3JpdGUgU3VnZ2VzdGlvbnM8L2gzPlxuICAgICAgICAgICAgPHA+VGhpcyBkcmFmdCBhbHJlYWR5IHBhc3NlcyB0aGUgcmV3cml0ZSBzdGFnZSB3aXRob3V0IHN1Z2dlc3RlZCB3b3JkaW5nIGNoYW5nZXMuPC9wPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInN1Ym1pdC1idG5cIiBpZD1cInN1Ym1pdC1yZXdyaXRlcy1idG5cIiBvbmNsaWNrPVwic3VibWl0UmV3cml0ZURlY2lzaW9ucygpXCI+Q29udGludWUgdG8gU3BlbGwgQ2hlY2s8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgYH1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgICR7X3JlbmRlclJld3JpdGVBdWRpdExvZygpfVxuICBgO1xuXG4gIC8vIFJlc3RvcmUgZGVjaXNpb25zIHBlcnNpc3RlZCBmcm9tIGEgcHJldmlvdXMgcGFnZSBsb2FkIChHQVAtMTY2KS5cbiAgX3Jlc3RvcmVEZWNpc2lvbnMoKTtcbiAgLy8gUmUtYXBwbHkgYW55IGRlY2lzaW9ucyBtYWRlIGJlZm9yZSB0aGUgbGFzdCB0YWIgbmF2aWdhdGlvbi5cbiAgaWYgKE9iamVjdC5rZXlzKHJld3JpdGVEZWNpc2lvbnMpLmxlbmd0aCA+IDApIHtcbiAgICBmb3IgKGNvbnN0IFtpZCwgZGVjXSBvZiBPYmplY3QuZW50cmllcyhyZXdyaXRlRGVjaXNpb25zKSkge1xuICAgICAgaWYgKCFkZWMgfHwgIWRlYy5vdXRjb21lKSBjb250aW51ZTtcbiAgICAgIGlmIChkZWMub3V0Y29tZSA9PT0gJ2VkaXQnICYmIGRlYy5maW5hbF90ZXh0ICE9IG51bGwpIHtcbiAgICAgICAgLy8gRW50ZXIgZWRpdCBtb2RlLCBpbmplY3QgdGhlIHNhdmVkIHRleHQsIHRoZW4gc2F2ZSBzbyB0aGUgY2FyZFxuICAgICAgICAvLyBzaG93cyBhcyBhY2NlcHRlZCB3aXRoIHRoZSBjb3JyZWN0IGRpZmYgcmVuZGVyZWQuXG4gICAgICAgIGFwcGx5UmV3cml0ZUFjdGlvbihpZCwgJ2VkaXQnKTtcbiAgICAgICAgY29uc3QgdGEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcnctdGV4dGFyZWEtJHtpZH1gKTtcbiAgICAgICAgaWYgKHRhKSB7XG4gICAgICAgICAgdGEudmFsdWUgPSBkZWMuZmluYWxfdGV4dDtcbiAgICAgICAgICBzYXZlUmV3cml0ZUVkaXQoaWQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhcHBseVJld3JpdGVBY3Rpb24oaWQsIGRlYy5vdXRjb21lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdXBkYXRlUmV3cml0ZVRhbGx5KCk7XG4gIH1cbn1cblxuLyoqXG4gKiBjb21wdXRlV29yZERpZmYob3JpZ2luYWwsIHByb3Bvc2VkKSBcdTIwMTQgTENTIHdvcmQtbGV2ZWwgZGlmZi5cbiAqXG4gKiBUb2tlbmlzZXMgYm90aCBzdHJpbmdzIGJ5IHNwbGl0dGluZyBvbiB3aGl0ZXNwYWNlIGJvdW5kYXJpZXMgd2hpbGVcbiAqIHByZXNlcnZpbmcgdGhlIHdoaXRlc3BhY2UgdG9rZW5zIHNvIHRoZSByZW5kZXJlZCBkaWZmIGhhcyB0aGUgc2FtZVxuICogc3BhY2luZyBhcyB0aGUgc291cmNlIHRleHQuICBSZXR1cm5zIGFuIGFycmF5IG9mXG4gKiB7dG9rZW46IHN0cmluZywgdHlwZTogJ3VuY2hhbmdlZCd8J3JlbW92ZWQnfCdhZGRlZCd9LlxuICovXG5mdW5jdGlvbiBjb21wdXRlV29yZERpZmYob3JpZ2luYWwsIHByb3Bvc2VkKSB7XG4gIC8vIFNwbGl0IG9uIHdoaXRlc3BhY2UgYnV0IGtlZXAgdGhlIHNlcGFyYXRvcnMgYXMgdG9rZW5zLlxuICBmdW5jdGlvbiB0b2tlbml6ZShzdHIpIHsgcmV0dXJuIChzdHIgfHwgJycpLnNwbGl0KC8oXFxzKykvKTsgfVxuXG4gIGNvbnN0IGEgPSB0b2tlbml6ZShvcmlnaW5hbCk7XG4gIGNvbnN0IGIgPSB0b2tlbml6ZShwcm9wb3NlZCk7XG4gIGNvbnN0IG0gPSBhLmxlbmd0aDtcbiAgY29uc3QgbiA9IGIubGVuZ3RoO1xuXG4gIC8vIEJ1aWxkIExDUyBEUCB0YWJsZSAoTyhtKm4pIFx1MjAxNCBhY2NlcHRhYmxlIGZvciBDViBidWxsZXQgbGVuZ3RocykuXG4gIGNvbnN0IGRwID0gQXJyYXkuZnJvbSh7bGVuZ3RoOiBtICsgMX0sICgpID0+IG5ldyBBcnJheShuICsgMSkuZmlsbCgwKSk7XG4gIGZvciAobGV0IGkgPSAxOyBpIDw9IG07IGkrKykge1xuICAgIGZvciAobGV0IGogPSAxOyBqIDw9IG47IGorKykge1xuICAgICAgZHBbaV1bal0gPSBhW2kgLSAxXSA9PT0gYltqIC0gMV1cbiAgICAgICAgPyBkcFtpIC0gMV1baiAtIDFdICsgMVxuICAgICAgICA6IE1hdGgubWF4KGRwW2kgLSAxXVtqXSwgZHBbaV1baiAtIDFdKTtcbiAgICB9XG4gIH1cblxuICAvLyBCYWNrdHJhY2sgdG8gcHJvZHVjZSB0aGUgZGlmZiBzZXF1ZW5jZS5cbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGxldCBpID0gbSwgaiA9IG47XG4gIHdoaWxlIChpID4gMCB8fCBqID4gMCkge1xuICAgIGlmIChpID4gMCAmJiBqID4gMCAmJiBhW2kgLSAxXSA9PT0gYltqIC0gMV0pIHtcbiAgICAgIHJlc3VsdC51bnNoaWZ0KHt0b2tlbjogYVtpIC0gMV0sIHR5cGU6ICd1bmNoYW5nZWQnfSk7XG4gICAgICBpLS07IGotLTtcbiAgICB9IGVsc2UgaWYgKGogPiAwICYmIChpID09PSAwIHx8IGRwW2ldW2ogLSAxXSA+PSBkcFtpIC0gMV1bal0pKSB7XG4gICAgICByZXN1bHQudW5zaGlmdCh7dG9rZW46IGJbaiAtIDFdLCB0eXBlOiAnYWRkZWQnfSk7XG4gICAgICBqLS07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC51bnNoaWZ0KHt0b2tlbjogYVtpIC0gMV0sIHR5cGU6ICdyZW1vdmVkJ30pO1xuICAgICAgaS0tO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKiogUmVuZGVyIGEge3Rva2VuLCB0eXBlfSBkaWZmIGFycmF5IGludG8gYW4gSFRNTCBzdHJpbmcuICovXG5mdW5jdGlvbiByZW5kZXJEaWZmSHRtbCh0b2tlbnMpIHtcbiAgcmV0dXJuIHRva2Vucy5tYXAodCA9PiB7XG4gICAgaWYgKHQudHlwZSA9PT0gJ3JlbW92ZWQnKSByZXR1cm4gYDxkZWwgY2xhc3M9XCJkaWZmLXJlbW92ZWRcIj4ke2VzY2FwZUh0bWwodC50b2tlbil9PC9kZWw+YDtcbiAgICBpZiAodC50eXBlID09PSAnYWRkZWQnKSAgIHJldHVybiBgPGlucyBjbGFzcz1cImRpZmYtYWRkZWRcIj4ke2VzY2FwZUh0bWwodC50b2tlbil9PC9pbnM+YDtcbiAgICByZXR1cm4gZXNjYXBlSHRtbCh0LnRva2VuKTtcbiAgfSkuam9pbignJyk7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclJld3JpdGVDYXJkKHIsIGNhcmRXYXJuaW5ncyA9IFtdLCBjaGFuZ2VTdGF0dXMgPSBudWxsKSB7XG4gIGNvbnN0IGlzV2Vha1NraWxsQWRkID0gci50eXBlID09PSAnc2tpbGxfYWRkJyAmJiByLmV2aWRlbmNlX3N0cmVuZ3RoID09PSAnd2Vhayc7XG4gIGNvbnN0IHdlYWtCYWRnZSAgICAgPSBpc1dlYWtTa2lsbEFkZFxuICAgID8gYDxzcGFuIGNsYXNzPVwid2Vhay1iYWRnZVwiPlx1MjZBMCBDYW5kaWRhdGUgdG8gY29uZmlybTwvc3Bhbj5gXG4gICAgOiAnJztcbiAgY29uc3QgY2hhbmdlQmFkZ2UgICA9IGNoYW5nZVN0YXR1cyA9PT0gJ25ldydcbiAgICA/IGA8c3BhbiBjbGFzcz1cInJ3LWNoYW5nZS1iYWRnZSBydy1jaGFuZ2UtbmV3XCIgYXJpYS1sYWJlbD1cIk5ldyBzdWdnZXN0aW9uIG5vdCBpbiBwcmV2aW91cyBydW5cIj5cdUQ4M0NcdUREOTUgTmV3PC9zcGFuPmBcbiAgICA6IGNoYW5nZVN0YXR1cyA9PT0gJ3VwZGF0ZWQnXG4gICAgICA/IGA8c3BhbiBjbGFzcz1cInJ3LWNoYW5nZS1iYWRnZSBydy1jaGFuZ2UtdXBkYXRlZFwiIGFyaWEtbGFiZWw9XCJTdWdnZXN0aW9uIGNoYW5nZWQgc2luY2UgcHJldmlvdXMgcnVuXCI+XHUyMUJCIFVwZGF0ZWQ8L3NwYW4+YFxuICAgICAgOiAnJztcbiAgLy8gS2V5d29yZCBwaWxscyB3aXRoIHBvc2l0aW9uLWJhc2VkIHJhbmsgYmFkZ2UgKCMxLCAjMiwgXHUyMDI2KVxuICBjb25zdCBrZXl3b3JkUGlsbHMgID0gKHIua2V5d29yZHNfaW50cm9kdWNlZCB8fCBbXSlcbiAgICAubWFwKChrLCBpZHgpID0+IGA8c3BhbiBjbGFzcz1cInJld3JpdGUta2V5d29yZFwiPjxzcGFuIGNsYXNzPVwia3ctcmFua1wiPiMke2lkeCArIDF9PC9zcGFuPiR7ZXNjYXBlSHRtbChrKX08L3NwYW4+YClcbiAgICAuam9pbignJyk7XG4gIGNvbnN0IHR5cGVMYWJlbCA9IChyLnR5cGUgfHwgJ3Jld3JpdGUnKS5yZXBsYWNlKC9fL2csICcgJyk7XG4gIC8vIFNhbml0aXplIElEOiBrZWVwIG9ubHkgYWxwaGFudW1lcmljLCB1bmRlcnNjb3JlLCBhbmQgaHlwaGVuIHNvIGl0IGlzXG4gIC8vIHNhZmUgYXMgYm90aCBhbiBIVE1MIGF0dHJpYnV0ZSB2YWx1ZSBhbmQgYSBKUyBzdHJpbmcgbGl0ZXJhbCBpbiBvbmNsaWNrLlxuICBjb25zdCBjYXJkSWQgICAgPSBTdHJpbmcoci5pZCkucmVwbGFjZSgvW15hLXpBLVowLTlfLV0vZywgJ18nKTtcblxuICAvLyBDb21wdXRlIHdvcmQtbGV2ZWwgZGlmZiBmb3IgdGhlIGlubGluZSBkaXNwbGF5LlxuICBjb25zdCBkaWZmVG9rZW5zID0gY29tcHV0ZVdvcmREaWZmKHIub3JpZ2luYWwgfHwgJycsIHIucHJvcG9zZWQgfHwgJycpO1xuICBjb25zdCBkaWZmSHRtbCAgID0gcmVuZGVyRGlmZkh0bWwoZGlmZlRva2Vucyk7XG5cbiAgcmV0dXJuIGBcbiAgICA8ZGl2IGNsYXNzPVwicmV3cml0ZS1jYXJkXCIgaWQ9XCJydy1jYXJkLSR7Y2FyZElkfVwiPlxuICAgICAgPGRpdiBjbGFzcz1cInJld3JpdGUtY2FyZC1oZWFkZXJcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXdyaXRlLWNhcmQtdHlwZVwiPiR7ZXNjYXBlSHRtbCh0eXBlTGFiZWwpfTwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXdyaXRlLWNhcmQtdGl0bGVcIj4ke2VzY2FwZUh0bWwoci5sb2NhdGlvbiB8fCByLmlkKX08L3NwYW4+XG4gICAgICAgICR7d2Vha0JhZGdlfSR7Y2hhbmdlQmFkZ2V9XG4gICAgICAgIDxzcGFuIGlkPVwicnctZGVjaXNpb24tYmFkZ2UtJHtjYXJkSWR9XCIgYXJpYS1saXZlPVwicG9saXRlXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7Zm9udC1zaXplOjAuNzhlbTtmb250LXdlaWdodDo2MDA7cGFkZGluZzoxcHggN3B4O2JvcmRlci1yYWRpdXM6OXB4O21hcmdpbi1sZWZ0OmF1dG87XCI+PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwicmV3cml0ZS1jYXJkLWJvZHlcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJld3JpdGUtaW5saW5lLWRpZmZcIiBpZD1cInJ3LWRpZmYtJHtjYXJkSWR9XCJcbiAgICAgICAgICAgICBkYXRhLW9yaWdpbmFsPVwiJHtlc2NhcGVIdG1sKHIub3JpZ2luYWwgfHwgJycpfVwiPiR7ZGlmZkh0bWx9PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyZXdyaXRlLWFmdGVyXCIgaWQ9XCJydy1hZnRlci0ke2NhcmRJZH1cIiBzdHlsZT1cImRpc3BsYXk6bm9uZVwiPlxuICAgICAgICAgIDxzcGFuIGlkPVwicnctYWZ0ZXItdGV4dC0ke2NhcmRJZH1cIj4ke2VzY2FwZUh0bWwoci5wcm9wb3NlZCB8fCAnJyl9PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgJHtrZXl3b3JkUGlsbHMgPyBgPGRpdiBjbGFzcz1cInJld3JpdGUta2V5d29yZHNcIj4ke2tleXdvcmRQaWxsc308L2Rpdj5gIDogJyd9XG4gICAgICAgICR7ci5yYXRpb25hbGUgPyBgXG4gICAgICAgIDxkZXRhaWxzIGNsYXNzPVwicmV3cml0ZS1yYXRpb25hbGVcIj5cbiAgICAgICAgICA8c3VtbWFyeT5SYXRpb25hbGUgJmFtcDsgRXZpZGVuY2U8L3N1bW1hcnk+XG4gICAgICAgICAgPHAgc3R5bGU9XCJtYXJnaW46NnB4IDAgMDtcIj4ke2VzY2FwZUh0bWwoci5yYXRpb25hbGUpfTwvcD5cbiAgICAgICAgICAke3IuZXZpZGVuY2UgPyBgPHAgc3R5bGU9XCJjb2xvcjojOWNhM2FmO2ZvbnQtc2l6ZTowLjg1ZW07bWFyZ2luOjRweCAwIDA7XCI+JHtlc2NhcGVIdG1sKHIuZXZpZGVuY2UpfTwvcD5gIDogJyd9XG4gICAgICAgIDwvZGV0YWlscz5gIDogJyd9XG4gICAgICAgICR7Y2FyZFdhcm5pbmdzLmxlbmd0aCA+IDAgPyBgXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyZXdyaXRlLXBlcnN1YXNpb24tYmFkZ2VzXCI+XG4gICAgICAgICAgJHtjYXJkV2FybmluZ3MubWFwKHcgPT4gYDxzcGFuIGNsYXNzPVwicGVyc3Vhc2lvbi1iYWRnZSBwZXJzdWFzaW9uLWJhZGdlLS0ke3cuc2V2ZXJpdHl9XCIgdGl0bGU9XCIke2VzY2FwZUh0bWwody5kZXRhaWxzKX1cIj5cdTI2QTAgJHtlc2NhcGVIdG1sKHcuZmxhZ190eXBlLnJlcGxhY2UoL18vZywgJyAnKSl9PC9zcGFuPmApLmpvaW4oJycpfVxuICAgICAgICA8L2Rpdj5gIDogJyd9XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyZXdyaXRlLWFjdGlvbnNcIj5cbiAgICAgICAgICA8YSBjbGFzcz1cInJ3LWJhY2stbGlua1wiIGhyZWY9XCIjXCIgb25jbGljaz1cImV2ZW50LnByZXZlbnREZWZhdWx0KCk7IHN3aXRjaFRhYignY3VzdG9taXphdGlvbnMnKVwiIHRpdGxlPVwiR28gYmFjayB0byBDdXN0b21pc2UgdG8gcmVjb25zaWRlciB3aGV0aGVyIHRvIGluY2x1ZGUgdGhpcyBjb250ZW50XCI+XHUyMUE5IFJlY29uc2lkZXIgaW5jbHVzaW9uPC9hPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJydy1idG4gYWNjZXB0XCIgaWQ9XCJydy1hY2NlcHQtJHtjYXJkSWR9XCIgYXJpYS1wcmVzc2VkPVwiZmFsc2VcIiBvbmNsaWNrPVwiYXBwbHlSZXdyaXRlQWN0aW9uKCcke2NhcmRJZH0nLCAnYWNjZXB0JylcIj5cdTI3MTMgQWNjZXB0PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInJ3LWJ0biBlZGl0XCIgICBpZD1cInJ3LWVkaXQtJHtjYXJkSWR9XCIgICBhcmlhLXByZXNzZWQ9XCJmYWxzZVwiIG9uY2xpY2s9XCJhcHBseVJld3JpdGVBY3Rpb24oJyR7Y2FyZElkfScsICdlZGl0JylcIj5cdTI3MEUgRWRpdDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJydy1idG4gcmVqZWN0XCIgaWQ9XCJydy1yZWplY3QtJHtjYXJkSWR9XCIgYXJpYS1wcmVzc2VkPVwiZmFsc2VcIiBvbmNsaWNrPVwiYXBwbHlSZXdyaXRlQWN0aW9uKCcke2NhcmRJZH0nLCAncmVqZWN0JylcIj5cdTI3MTcgUmVqZWN0PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+YDtcbn1cblxuZnVuY3Rpb24gYXBwbHlSZXdyaXRlQWN0aW9uKGlkLCBvdXRjb21lKSB7XG4gIGNvbnN0IGNhcmQgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcnctY2FyZC0ke2lkfWApO1xuICBjb25zdCBhZnRlckVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHJ3LWFmdGVyLSR7aWR9YCk7XG4gIGNvbnN0IGRpZmZFbCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcnctZGlmZi0ke2lkfWApO1xuICBpZiAoIWNhcmQgfHwgIWFmdGVyRWwpIHJldHVybjtcblxuICAvLyBDbGVhciBhbnkgcHJldmlvdXMgb3V0Y29tZSBzdHlsaW5nXG4gIGNhcmQuY2xhc3NMaXN0LnJlbW92ZSgnYWNjZXB0ZWQnLCAncmVqZWN0ZWQnKTtcbiAgWydhY2NlcHQnLCAnZWRpdCcsICdyZWplY3QnXS5mb3JFYWNoKGEgPT4ge1xuICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBydy0ke2F9LSR7aWR9YCk7XG4gICAgYnRuPy5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICBpZiAoYnRuKSBidG4uc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCAnZmFsc2UnKTtcbiAgfSk7XG4gIGNvbnN0IF9kZWNpc2lvbkJhZGdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHJ3LWRlY2lzaW9uLWJhZGdlLSR7aWR9YCk7XG4gIGlmIChfZGVjaXNpb25CYWRnZSkgX2RlY2lzaW9uQmFkZ2Uuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICBpZiAob3V0Y29tZSA9PT0gJ2VkaXQnKSB7XG4gICAgLy8gS2VlcCB0aGUgaW5saW5lIGRpZmYgdmlzaWJsZSBhcyBhIHJlZmVyZW5jZTsgc2hvdyB0aGUgZWRpdGFibGUgdGV4dGFyZWEgYmVsb3cgaXQuXG4gICAgY29uc3QgY3VycmVudFRleHQgPSBhZnRlckVsLnF1ZXJ5U2VsZWN0b3IoYCNydy1hZnRlci10ZXh0LSR7aWR9YCk/LnRleHRDb250ZW50XG4gICAgICAgICAgICAgICAgICAgICA/PyByZXdyaXRlRGVjaXNpb25zW2lkXT8uZmluYWxfdGV4dFxuICAgICAgICAgICAgICAgICAgICAgPz8gJyc7XG4gICAgaWYgKGRpZmZFbCkge1xuICAgICAgZGlmZkVsLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIGRpZmZFbC5zdHlsZS5vcGFjaXR5ID0gJzAuNTUnO1xuICAgICAgZGlmZkVsLnN0eWxlLmJvcmRlckxlZnQgPSAnM3B4IHNvbGlkICM5M2M1ZmQnO1xuICAgIH1cbiAgICBhZnRlckVsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgIGFmdGVyRWwuaW5uZXJIVE1MID0gYFxuICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjc4ZW07Y29sb3I6IzZiNzI4MDttYXJnaW4tYm90dG9tOjRweDtcIj5cdTI3MEUgWW91ciBlZGl0IChBSSBzdWdnZXN0aW9uIHNob3duIGFib3ZlIGZvciByZWZlcmVuY2UpOjwvZGl2PlxuICAgICAgPHRleHRhcmVhIGlkPVwicnctdGV4dGFyZWEtJHtpZH1cIj4ke2VzY2FwZUh0bWwoY3VycmVudFRleHQpfTwvdGV4dGFyZWE+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwicnctc2F2ZS1lZGl0LWJ0blwiIHN0eWxlPVwibWFyZ2luLXRvcDo2cHhcIlxuICAgICAgICAgICAgICBvbmNsaWNrPVwic2F2ZVJld3JpdGVFZGl0KCcke2lkfScpXCI+U2F2ZTwvYnV0dG9uPlxuICAgIGA7XG4gICAgY29uc3QgZWRpdEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBydy1lZGl0LSR7aWR9YCk7XG4gICAgZWRpdEJ0bj8uY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgaWYgKGVkaXRCdG4pIGVkaXRCdG4uc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCAndHJ1ZScpO1xuICAgIC8vIERlY2lzaW9uIGlzIHJlY29yZGVkIG9ubHkgd2hlbiB0aGUgdXNlciBjbGlja3MgU2F2ZVxuICB9IGVsc2Uge1xuICAgIC8vIFJlc3RvcmUgdGhlIGFmdGVyLXRleHQgc3BhbiBpZiB3ZSBwcmV2aW91c2x5IGVudGVyZWQgZWRpdCBtb2RlXG4gICAgY29uc3QgdGV4dGFyZWEgPSBhZnRlckVsLnF1ZXJ5U2VsZWN0b3IoJ3RleHRhcmVhJyk7XG4gICAgaWYgKHRleHRhcmVhKSB7XG4gICAgICBjb25zdCB0eHQgPSB0ZXh0YXJlYS52YWx1ZTtcbiAgICAgIGFmdGVyRWwuaW5uZXJIVE1MID0gYDxzcGFuIGlkPVwicnctYWZ0ZXItdGV4dC0ke2lkfVwiPiR7ZXNjYXBlSHRtbCh0eHQpfTwvc3Bhbj5gO1xuICAgIH1cbiAgICAvLyBSZS1zaG93IHRoZSBpbmxpbmUgZGlmZiBwYW5lbCBhdCBmdWxsIG9wYWNpdHk7IGhpZGUgdGhlIGVkaXQgYXJlYS5cbiAgICBpZiAoZGlmZkVsKSB7IGRpZmZFbC5zdHlsZS5kaXNwbGF5ID0gJyc7IGRpZmZFbC5zdHlsZS5vcGFjaXR5ID0gJyc7IGRpZmZFbC5zdHlsZS5ib3JkZXJMZWZ0ID0gJyc7IH1cbiAgICBhZnRlckVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICByZXdyaXRlRGVjaXNpb25zW2lkXSA9IHsgb3V0Y29tZSwgZmluYWxfdGV4dDogbnVsbCB9O1xuICAgIF9wZXJzaXN0RGVjaXNpb25zKCk7XG4gICAgY2FyZC5jbGFzc0xpc3QuYWRkKG91dGNvbWUgPT09ICdhY2NlcHQnID8gJ2FjY2VwdGVkJyA6ICdyZWplY3RlZCcpO1xuICAgIGNvbnN0IGFjdGl2ZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBydy0ke291dGNvbWV9LSR7aWR9YCk7XG4gICAgYWN0aXZlQnRuPy5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICBpZiAoYWN0aXZlQnRuKSBhY3RpdmVCdG4uc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCAndHJ1ZScpO1xuICAgIGNvbnN0IGRlY0JhZGdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHJ3LWRlY2lzaW9uLWJhZGdlLSR7aWR9YCk7XG4gICAgaWYgKGRlY0JhZGdlKSB7XG4gICAgICBkZWNCYWRnZS50ZXh0Q29udGVudCA9IG91dGNvbWUgPT09ICdhY2NlcHQnID8gJ1x1MjcxMyBBY2NlcHRlZCcgOiAnXHUyNzE3IFJlamVjdGVkJztcbiAgICAgIGRlY0JhZGdlLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIGRlY0JhZGdlLnN0eWxlLmJhY2tncm91bmQgPSBvdXRjb21lID09PSAnYWNjZXB0JyA/ICcjYmJmN2QwJyA6ICcjZmVjYWNhJztcbiAgICAgIGRlY0JhZGdlLnN0eWxlLmNvbG9yICAgICAgPSBvdXRjb21lID09PSAnYWNjZXB0JyA/ICcjMDY1ZjQ2JyA6ICcjOTkxYjFiJztcbiAgICB9XG4gICAgc3luY1Jld3JpdGVHbG9iYWxzKCk7XG4gICAgdXBkYXRlUmV3cml0ZVRhbGx5KCk7XG4gICAgX3Njcm9sbFRvTmV4dFBlbmRpbmdSZXdyaXRlKGlkKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfc2Nyb2xsVG9OZXh0UGVuZGluZ1Jld3JpdGUoYWZ0ZXJJZCkge1xuICBjb25zdCBhbGxDYXJkcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tpZF49XCJydy1jYXJkLVwiXScpO1xuICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBjYXJkIG9mIGFsbENhcmRzKSB7XG4gICAgY29uc3QgaWQgPSBjYXJkLmlkLnJlcGxhY2UoJ3J3LWNhcmQtJywgJycpO1xuICAgIGlmIChpZCA9PT0gYWZ0ZXJJZCkgeyBmb3VuZCA9IHRydWU7IGNvbnRpbnVlOyB9XG4gICAgaWYgKCFmb3VuZCkgY29udGludWU7XG4gICAgaWYgKCFyZXdyaXRlRGVjaXNpb25zW2lkXSkge1xuICAgICAgY2FyZC5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJywgYmxvY2s6ICdjZW50ZXInIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzYXZlUmV3cml0ZUVkaXQoaWQpIHtcbiAgY29uc3QgdGV4dGFyZWEgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBydy10ZXh0YXJlYS0ke2lkfWApO1xuICBjb25zdCBlZGl0ZWRUZXh0ID0gdGV4dGFyZWEgPyB0ZXh0YXJlYS52YWx1ZSA6ICcnO1xuICBjb25zdCBhZnRlckVsICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHJ3LWFmdGVyLSR7aWR9YCk7XG4gIGNvbnN0IGRpZmZFbCAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcnctZGlmZi0ke2lkfWApO1xuICBjb25zdCBjYXJkICAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHJ3LWNhcmQtJHtpZH1gKTtcbiAgaWYgKCFhZnRlckVsIHx8ICFjYXJkKSByZXR1cm47XG5cbiAgLy8gUmVwbGFjZSB0ZXh0YXJlYSB3aXRoIGZpbmFsIHNwYW4gKGhpZGRlbiBcdTIwMTQgcHJlc2VydmVzIHRleHQgZm9yIGZ1dHVyZSBlZGl0cykuXG4gIGFmdGVyRWwuaW5uZXJIVE1MID0gYDxzcGFuIGlkPVwicnctYWZ0ZXItdGV4dC0ke2lkfVwiPiR7ZXNjYXBlSHRtbChlZGl0ZWRUZXh0KX08L3NwYW4+YDtcbiAgYWZ0ZXJFbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gIC8vIFJlZ2VuZXJhdGUgdGhlIGlubGluZSBkaWZmIGFnYWluc3QgdGhlIG9yaWdpbmFsIHRleHQgYW5kIHJlLXNob3cgaXQgKGZ1bGwgb3BhY2l0eSkuXG4gIGlmIChkaWZmRWwpIHtcbiAgICBjb25zdCBvcmlnaW5hbCA9IGRpZmZFbC5kYXRhc2V0Lm9yaWdpbmFsIHx8ICcnO1xuICAgIGRpZmZFbC5pbm5lckhUTUwgPSByZW5kZXJEaWZmSHRtbChjb21wdXRlV29yZERpZmYob3JpZ2luYWwsIGVkaXRlZFRleHQpKTtcbiAgICBkaWZmRWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgIGRpZmZFbC5zdHlsZS5vcGFjaXR5ID0gJyc7XG4gICAgZGlmZkVsLnN0eWxlLmJvcmRlckxlZnQgPSAnJztcbiAgfVxuXG4gIHJld3JpdGVEZWNpc2lvbnNbaWRdID0geyBvdXRjb21lOiAnZWRpdCcsIGZpbmFsX3RleHQ6IGVkaXRlZFRleHQgfTtcbiAgX3BlcnNpc3REZWNpc2lvbnMoKTtcbiAgY2FyZC5jbGFzc0xpc3QucmVtb3ZlKCdyZWplY3RlZCcpO1xuICBjYXJkLmNsYXNzTGlzdC5hZGQoJ2FjY2VwdGVkJyk7XG4gIFsnYWNjZXB0JywgJ3JlamVjdCddLmZvckVhY2goYSA9PiB7XG4gICAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHJ3LSR7YX0tJHtpZH1gKTtcbiAgICBidG4/LmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgIGlmIChidG4pIGJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsICdmYWxzZScpO1xuICB9KTtcbiAgY29uc3Qgc2F2ZUVkaXRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcnctZWRpdC0ke2lkfWApO1xuICBzYXZlRWRpdEJ0bj8uY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gIGlmIChzYXZlRWRpdEJ0bikgc2F2ZUVkaXRCdG4uc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCAndHJ1ZScpO1xuICBjb25zdCBlZGl0RGVjQmFkZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcnctZGVjaXNpb24tYmFkZ2UtJHtpZH1gKTtcbiAgaWYgKGVkaXREZWNCYWRnZSkge1xuICAgIGVkaXREZWNCYWRnZS50ZXh0Q29udGVudCA9ICdcdTI3MTMgQWNjZXB0ZWQgKGVkaXRlZCknO1xuICAgIGVkaXREZWNCYWRnZS5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgZWRpdERlY0JhZGdlLnN0eWxlLmJhY2tncm91bmQgPSAnI2JiZjdkMCc7XG4gICAgZWRpdERlY0JhZGdlLnN0eWxlLmNvbG9yICAgICAgPSAnIzA2NWY0Nic7XG4gIH1cbiAgc3luY1Jld3JpdGVHbG9iYWxzKCk7XG4gIHVwZGF0ZVJld3JpdGVUYWxseSgpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVSZXdyaXRlVGFsbHkoKSB7XG4gIGNvbnN0IGNhcmRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnJld3JpdGUtY2FyZCcpO1xuICBsZXQgYWNjZXB0ZWQgPSAwLCByZWplY3RlZCA9IDAsIHBlbmRpbmcgPSAwO1xuICBjYXJkcy5mb3JFYWNoKGNhcmQgPT4ge1xuICAgIGNvbnN0IGlkICA9IGNhcmQuaWQucmVwbGFjZSgncnctY2FyZC0nLCAnJyk7XG4gICAgY29uc3QgZGVjID0gcmV3cml0ZURlY2lzaW9uc1tpZF07XG4gICAgaWYgICAgICAoIWRlYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZysrO1xuICAgIGVsc2UgaWYgKGRlYy5vdXRjb21lID09PSAnYWNjZXB0JyB8fCBkZWMub3V0Y29tZSA9PT0gJ2VkaXQnKSBhY2NlcHRlZCsrO1xuICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdGVkKys7XG4gIH0pO1xuXG4gIGNvbnN0IGFjY2VwdGVkRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFsbHktYWNjZXB0ZWQnKTtcbiAgY29uc3QgcmVqZWN0ZWRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWxseS1yZWplY3RlZCcpO1xuICBjb25zdCBwZW5kaW5nRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFsbHktcGVuZGluZycpO1xuXG4gIGlmIChhY2NlcHRlZEVsKSBhY2NlcHRlZEVsLnRleHRDb250ZW50ID0gYWNjZXB0ZWQ7XG4gIGlmIChyZWplY3RlZEVsKSByZWplY3RlZEVsLnRleHRDb250ZW50ID0gcmVqZWN0ZWQ7XG4gIGlmIChwZW5kaW5nRWwpIHBlbmRpbmdFbC50ZXh0Q29udGVudCAgPSBwZW5kaW5nO1xuXG4gIGNvbnN0IHN1Ym1pdEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdWJtaXQtcmV3cml0ZXMtYnRuJyk7XG4gIGlmIChzdWJtaXRCdG4pIHtcbiAgICBjb25zdCBuZWVkc0FjayA9ICFwZXJzdWFzaW9uV2FybmluZ3NBY2tub3dsZWRnZWQ7XG4gICAgc3VibWl0QnRuLmRpc2FibGVkID0gKHBlbmRpbmcgPiAwKSB8fCBuZWVkc0FjaztcbiAgICBzdWJtaXRCdG4udGl0bGUgPSBuZWVkc0Fja1xuICAgICAgPyAnQWNrbm93bGVkZ2UgdGhlIHBlcnN1YXNpb24gd2FybmluZ3MgYWJvdmUgYmVmb3JlIHN1Ym1pdHRpbmcnXG4gICAgICA6ICcnO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN1Ym1pdFJld3JpdGVEZWNpc2lvbnMoKSB7XG4gIGlmICghcGVyc3Vhc2lvbldhcm5pbmdzQWNrbm93bGVkZ2VkKSB7XG4gICAgY29uc3QgcHJvY2VlZCA9IGF3YWl0IHNob3dDb25maXJtTW9kYWwoXG4gICAgICAnXHUyNkEwXHVGRTBGIFBlcnN1YXNpb24gQ2hlY2tzJyxcbiAgICAgICdUaGVyZSBhcmUgdW5hY2tub3dsZWRnZWQgcGVyc3Vhc2lvbiB3YXJuaW5ncy4gSXQgaXMgcmVjb21tZW5kZWQgeW91IHJldmlldyBhbmQgYWNrbm93bGVkZ2UgdGhlbSBmaXJzdC5cXG5cXG5Qcm9jZWVkIGFueXdheT8nLFxuICAgICAgJ1N1Ym1pdCBBbnl3YXknXG4gICAgKTtcbiAgICBpZiAoIXByb2NlZWQpIHJldHVybjtcbiAgfVxuICAvKiBkdWNrZmxvdzpcbiAgICogICBpZDogcmV3cml0ZV91aV9zdWJtaXRfbGl2ZVxuICAgKiAgIGtpbmQ6IHVpXG4gICAqICAgdGltZXN0YW1wOiAnMjAyNi0wMy0yNVQyMTozOTo0OFonXG4gICAqICAgc3RhdHVzOiBsaXZlXG4gICAqICAgaGFuZGxlczpcbiAgICogICAtIHVpOnJld3JpdGUtcmV2aWV3LnN1Ym1pdFxuICAgKiAgIGNhbGxzOlxuICAgKiAgIC0gUE9TVCAvYXBpL3Jld3JpdGVzL2FwcHJvdmVcbiAgICogICAtIFBPU1QgL2FwaS9jdi9sYXlvdXQtZXN0aW1hdGVcbiAgICogICByZWFkczpcbiAgICogICAtIHdpbmRvdzpyZXdyaXRlRGVjaXNpb25zXG4gICAqICAgd3JpdGVzOlxuICAgKiAgIC0gcmVxdWVzdDpQT1NUIC9hcGkvcmV3cml0ZXMvYXBwcm92ZS5kZWNpc2lvbnNcbiAgICogICBub3RlczogU3VibWl0cyB0aGUgZmluYWwgcGVyLXJld3JpdGUgb3V0Y29tZXMgYW5kIGVkaXRlZCB0ZXh0IHNvIGJhY2tlbmQgc3RhdGUgY2FuIHBlcnNpc3QgYXBwcm92ZWQgcmV3cml0ZXMgYW5kIHRoZSBmdWxsIHJld3JpdGUgYXVkaXQgYmVmb3JlIHNwZWxsLWNoZWNrLlxuICAgKi9cbiAgY29uc3QgZGVjaXNpb25zID0gT2JqZWN0LmVudHJpZXMocmV3cml0ZURlY2lzaW9ucykubWFwKChbaWQsIGRlY10pID0+ICh7XG4gICAgaWQsXG4gICAgb3V0Y29tZTogICAgZGVjLm91dGNvbWUsXG4gICAgZmluYWxfdGV4dDogZGVjLmZpbmFsX3RleHQgPz8gbnVsbFxuICB9KSk7XG5cbiAgY29uc3QgbG9hZGluZ01zZyA9IGFwcGVuZExvYWRpbmdNZXNzYWdlKCdTdWJtaXR0aW5nIHJld3JpdGUgZGVjaXNpb25zLi4uJyk7XG4gIHNldExvYWRpbmcodHJ1ZSwgJ1N1Ym1pdHRpbmcgcmV3cml0ZSBkZWNpc2lvbnNcdTIwMjYnKTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9yZXdyaXRlcy9hcHByb3ZlJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgZGVjaXNpb25zIH0pXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgcmVtb3ZlTG9hZGluZ01lc3NhZ2UobG9hZGluZ01zZyk7XG4gICAgc2V0TG9hZGluZyhmYWxzZSk7XG5cbiAgICBpZiAoIXJlcy5vaykge1xuICAgICAgYXBwZW5kUmV0cnlNZXNzYWdlKCdcdTI3NEMgRXJyb3I6ICcgKyAoZGF0YS5lcnJvciB8fCAnRmFpbGVkIHRvIHN1Ym1pdCByZXdyaXRlIGRlY2lzaW9ucycpLCBzdWJtaXRSZXdyaXRlRGVjaXNpb25zKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBhY2NlcHRlZCA9IGRhdGEuYXBwcm92ZWRfY291bnQgfHwgMDtcbiAgICBjb25zdCByZWplY3RlZCA9IGRhdGEucmVqZWN0ZWRfY291bnQgfHwgMDtcbiAgICBzdGF0ZU1hbmFnZXIubWFya0NvbnRlbnRDaGFuZ2VkKCk7XG4gICAgX2NsZWFyUGVyc2lzdGVkRGVjaXNpb25zKCk7XG4gICAgX2NsZWFyUmV3cml0ZVNuYXBzaG90KCk7XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgYFx1MjcwNSBSZXdyaXRlIGRlY2lzaW9ucyByZWNvcmRlZDogJHthY2NlcHRlZH0gYWNjZXB0ZWQsICR7cmVqZWN0ZWR9IHJlamVjdGVkLiBTdGFydGluZyBzcGVsbCBjaGVja1x1MjAyNmApO1xuICAgIHNjaGVkdWxlQXRzUmVmcmVzaCgncmV2aWV3X2NoZWNrcG9pbnQnKTtcbiAgICBzd2l0Y2hUYWIoJ3NwZWxsJyk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJlbW92ZUxvYWRpbmdNZXNzYWdlKGxvYWRpbmdNc2cpO1xuICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgIGFwcGVuZFJldHJ5TWVzc2FnZSgnXHUyNzRDIEVycm9yOiAnICsgZXJyLm1lc3NhZ2UsIHN1Ym1pdFJld3JpdGVEZWNpc2lvbnMpO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFeHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuZnVuY3Rpb24gc2V0UGVyc3Vhc2lvbldhcm5pbmdzQWNrbm93bGVkZ2VkKHZhbHVlKSB7XG4gIHBlcnN1YXNpb25XYXJuaW5nc0Fja25vd2xlZGdlZCA9IHZhbHVlO1xufVxuXG4vKiogQnVsay1hY2NlcHQgYWxsIHBlbmRpbmcgcmV3cml0ZSBjYXJkcy4gKi9cbmZ1bmN0aW9uIGFjY2VwdEFsbFJld3JpdGVzKCkge1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucmV3cml0ZS1jYXJkJykuZm9yRWFjaChjYXJkID0+IHtcbiAgICBjb25zdCBpZCA9IGNhcmQuaWQucmVwbGFjZSgncnctY2FyZC0nLCAnJyk7XG4gICAgaWYgKCFyZXdyaXRlRGVjaXNpb25zW2lkXSkgYXBwbHlSZXdyaXRlQWN0aW9uKGlkLCAnYWNjZXB0Jyk7XG4gIH0pO1xuICB1cGRhdGVSZXdyaXRlVGFsbHkoKTtcbn1cblxuLyoqIEJ1bGstcmVqZWN0IGFsbCBwZW5kaW5nIHJld3JpdGUgY2FyZHMuICovXG5mdW5jdGlvbiByZWplY3RBbGxSZXdyaXRlcygpIHtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnJld3JpdGUtY2FyZCcpLmZvckVhY2goY2FyZCA9PiB7XG4gICAgY29uc3QgaWQgPSBjYXJkLmlkLnJlcGxhY2UoJ3J3LWNhcmQtJywgJycpO1xuICAgIGlmICghcmV3cml0ZURlY2lzaW9uc1tpZF0pIGFwcGx5UmV3cml0ZUFjdGlvbihpZCwgJ3JlamVjdCcpO1xuICB9KTtcbiAgdXBkYXRlUmV3cml0ZVRhbGx5KCk7XG59XG5cbi8qKiBUb2dnbGUgY29tcGFjdCAoc2luZ2xlLWxpbmUpIGNhcmQgZGlzcGxheSBmb3IgcmFwaWQgcmV2aWV3LiAqL1xuZnVuY3Rpb24gdG9nZ2xlUmV3cml0ZUNvbXBhY3RNb2RlKCkge1xuICBjb25zdCBjYXJkcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXdyaXRlLWNhcmRzJyk7XG4gIGNvbnN0IGJ0biAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3J3LWNvbXBhY3QtYnRuJyk7XG4gIGlmICghY2FyZHMpIHJldHVybjtcbiAgY29uc3QgaXNDb21wYWN0ID0gY2FyZHMuY2xhc3NMaXN0LnRvZ2dsZSgnY29tcGFjdC1tb2RlJyk7XG4gIGlmIChidG4pIHtcbiAgICBidG4uY2xhc3NMaXN0LnRvZ2dsZSgnYWN0aXZlJywgaXNDb21wYWN0KTtcbiAgICBidG4udGV4dENvbnRlbnQgPSBpc0NvbXBhY3QgPyAnXHUyMjlGIEZ1bGwgVmlldycgOiAnXHUyMjlFIENvbXBhY3QnO1xuICAgIGJ0bi50aXRsZSA9IGlzQ29tcGFjdCA/ICdTd2l0Y2ggdG8gZnVsbCBjYXJkIHZpZXcnIDogJ1N3aXRjaCB0byBjb21wYWN0IHNpbmdsZS1saW5lIHZpZXcgZm9yIHJhcGlkIHJldmlldyc7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgcmV3cml0ZURlY2lzaW9ucyxcbiAgX3Jld3JpdGVQYW5lbENhY2hlLFxuICBwZXJzdWFzaW9uV2FybmluZ3NBY2tub3dsZWRnZWQsXG4gIHNldFBlcnN1YXNpb25XYXJuaW5nc0Fja25vd2xlZGdlZCxcbiAgZmV0Y2hBbmRSZXZpZXdSZXdyaXRlcyxcbiAgcmVuZGVyUmV3cml0ZVBhbmVsLFxuICBjb21wdXRlV29yZERpZmYsXG4gIHJlbmRlckRpZmZIdG1sLFxuICByZW5kZXJSZXdyaXRlQ2FyZCxcbiAgYXBwbHlSZXdyaXRlQWN0aW9uLFxuICBzYXZlUmV3cml0ZUVkaXQsXG4gIHVwZGF0ZVJld3JpdGVUYWxseSxcbiAgc3VibWl0UmV3cml0ZURlY2lzaW9ucyxcbiAgYWNjZXB0QWxsUmV3cml0ZXMsXG4gIHJlamVjdEFsbFJld3JpdGVzLFxuICB0b2dnbGVSZXdyaXRlQ29tcGFjdE1vZGUsXG59O1xuXG5zeW5jUmV3cml0ZUdsb2JhbHMoKTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL3NwZWxsLWNoZWNrLmpzXG4gKiBTcGVsbCAmIGdyYW1tYXIgY2hlY2sgdGFiOiBmZXRjaCBzZWN0aW9ucywgcmVuZGVyIHN1Z2dlc3Rpb25zLFxuICogYXBwbHkvZGlzbWlzcyBjb3JyZWN0aW9ucywgc3VibWl0IGF1ZGl0LlxuICpcbiAqIERlcGVuZGVuY2llcyAocmVzb2x2ZWQgdGhyb3VnaCBnbG9iYWxUaGlzIGF0IHJ1bnRpbWUpOlxuICogICBlc2NhcGVIdG1sLCBhcHBlbmRMb2FkaW5nTWVzc2FnZSwgcmVtb3ZlTG9hZGluZ01lc3NhZ2UsIGFwcGVuZE1lc3NhZ2UsXG4gKiAgIHNob3dBbGVydE1vZGFsLCBzaG93Q29uZmlybU1vZGFsLCBzZXRMb2FkaW5nLCBmZXRjaFN0YXR1cywgc2VuZEFjdGlvbixcbiAqICAgc2NoZWR1bGVBdHNSZWZyZXNoLCBDU1NcbiAqL1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5jb25zdCBsb2cgPSBnZXRMb2dnZXIoJ3NwZWxsLWNoZWNrJyk7XG5cbmltcG9ydCB7IHN0YXRlTWFuYWdlciB9IGZyb20gJy4vc3RhdGUtbWFuYWdlci5qcyc7XG5cbi8vIE1vZHVsZS1sZXZlbCBzdGF0ZVxubGV0IHNwZWxsQXVkaXQgPSBbXTtcbmxldCBfc3BlbGxDaGVja0NhY2hlID0gbnVsbDtcblxuLy8gXHUyNTAwXHUyNTAwIFBvcHVsYXRlIHNwZWxsLWNoZWNrIHRhYiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gcG9wdWxhdGVTcGVsbENoZWNrVGFiKCkge1xuICAvLyBJZiB3ZSBoYXZlIGNhY2hlZCByZXN1bHRzIGZyb20gYSBwcmV2aW91cyBydW4sIHJlLXJlbmRlciBmcm9tIGNhY2hlXG4gIC8vIGluc3RlYWQgb2YgcmUtcnVubmluZyBMYW5ndWFnZVRvb2wgb24gZXZlcnkgYmFjay1uYXZpZ2F0aW9uLlxuICBpZiAod2luZG93Ll9zcGVsbENoZWNrQ2FjaGUpIHtcbiAgICBjb25zdCBjID0gd2luZG93Ll9zcGVsbENoZWNrQ2FjaGU7XG4gICAgaWYgKGMudHlwZSA9PT0gJ3plcm8nKSB7XG4gICAgICByZW5kZXJTcGVsbENoZWNrWmVyb1N0YXRlKGMubWVzc2FnZSwgYy5zdGF0c0xpbmUsIGMuY3VzdG9tRGljdFNpemUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgICAgICA8aDE+XHVEODNEXHVERDI0IFNwZWxsICZhbXA7IEdyYW1tYXIgQ2hlY2s8L2gxPlxuICAgICAgICA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7bWFyZ2luLWJvdHRvbToyNHB4O1wiPlJldmlldyBzcGVsbGluZyBhbmQgZ3JhbW1hciBzdWdnZXN0aW9ucy48L3A+XG4gICAgICAgIDxkaXYgaWQ9XCJzcGVsbC1yZXN1bHRzXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+PC9kaXY+XG4gICAgICBgO1xuICAgICAgcmVuZGVyU3BlbGxTdWdnZXN0aW9ucyhjLmZsYWdnZWRTZWN0aW9ucywgYy50b3RhbFNlY3Rpb25zLCBjLnN0YXRzLCBjLmN1c3RvbURpY3RTaXplKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgIDxoMT5cdUQ4M0RcdUREMjQgU3BlbGwgJmFtcDsgR3JhbW1hciBDaGVjazwvaDE+XG4gICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO21hcmdpbi1ib3R0b206MjRweDtcIj5DaGVja2luZyBDViBzZWN0aW9ucyBmb3Igc3BlbGxpbmcgYW5kIGdyYW1tYXIgaXNzdWVzXHUyMDI2PC9wPlxuICAgIDxkaXYgaWQ9XCJzcGVsbC1sb2FkaW5nXCIgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjtwYWRkaW5nOjQwcHg7XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibG9hZGluZy1zcGlubmVyXCI+PC9kaXY+XG4gICAgICA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7bWFyZ2luLXRvcDoxMnB4O1wiPlJ1bm5pbmcgTGFuZ3VhZ2VUb29sIGNoZWNrc1x1MjAyNjwvcD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGlkPVwic3BlbGwtcmVzdWx0c1wiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPjwvZGl2PlxuICBgO1xuICBzcGVsbEF1ZGl0ID0gW107XG4gIHdpbmRvdy5fc3BlbGxTdWdNYXAgPSB7fTtcblxuICB0cnkge1xuICAgIC8vIEZldGNoIHNlY3Rpb25zIHRvIGNoZWNrXG4gICAgY29uc3Qgc2VjdGlvbnNSZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9zcGVsbC1jaGVjay1zZWN0aW9ucycpO1xuICAgIGNvbnN0IHNlY3Rpb25zRGF0YSA9IGF3YWl0IHNlY3Rpb25zUmVzLmpzb24oKTtcbiAgICBpZiAoIXNlY3Rpb25zRGF0YS5vaykge1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NwZWxsLWxvYWRpbmcnKS5pbm5lckhUTUwgPSBgPHAgY2xhc3M9XCJlcnJvci1tZXNzYWdlXCI+RmFpbGVkIHRvIGxvYWQgc2VjdGlvbnM6ICR7c2VjdGlvbnNEYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yJ308L3A+YDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZWN0aW9ucyA9IHNlY3Rpb25zRGF0YS5zZWN0aW9ucyB8fCBbXTtcbiAgICBpZiAoc2VjdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZW5kZXJTcGVsbENoZWNrWmVyb1N0YXRlKCdObyBDViBzZWN0aW9ucyBhcmUgYXZhaWxhYmxlIHRvIGNoZWNrLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGVhY2ggc2VjdGlvblxuICAgIGNvbnN0IGZsYWdnZWRTZWN0aW9ucyA9IFtdO1xuICAgIGNvbnN0IGFnZ3JlZ2F0ZVN0YXRzID0gc2VjdGlvbnNEYXRhLmFnZ3JlZ2F0ZV9zdGF0cyB8fCB7fTtcbiAgICBsZXQgaW5jb3JyZWN0V29yZHMgPSAwO1xuICAgIGxldCBncmFtbWFySXNzdWVzID0gMDtcbiAgICBsZXQgY3VzdG9tRGljdFNpemUgPSBzZWN0aW9uc0RhdGEuY3VzdG9tX2RpY3Rfc2l6ZSB8fCAwO1xuICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBzZWN0aW9ucykge1xuICAgICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL3NwZWxsLWNoZWNrJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgdGV4dDogc2VjdGlvbi50ZXh0LCBjb250ZXh0OiBzZWN0aW9uLmNvbnRleHQgfSlcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5zdGF0cykge1xuICAgICAgICBpZiAoZGF0YS5jdXN0b21fZGljdF9zaXplKSBjdXN0b21EaWN0U2l6ZSA9IGRhdGEuY3VzdG9tX2RpY3Rfc2l6ZTtcbiAgICAgICAgaW5jb3JyZWN0V29yZHMgKz0gZGF0YS5zdGF0cy51bmtub3duX3dvcmRfY291bnQgfHwgMDtcbiAgICAgICAgZ3JhbW1hcklzc3VlcyArPSBkYXRhLnN0YXRzLmdyYW1tYXJfaXNzdWVfY291bnQgfHwgMDtcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhLm9rICYmIGRhdGEuc3VnZ2VzdGlvbnMgJiYgZGF0YS5zdWdnZXN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZsYWdnZWRTZWN0aW9ucy5wdXNoKHsgc2VjdGlvbiwgc3VnZ2VzdGlvbnM6IGRhdGEuc3VnZ2VzdGlvbnMgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NwZWxsLWxvYWRpbmcnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgaWYgKGZsYWdnZWRTZWN0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJlbmRlclNwZWxsQ2hlY2taZXJvU3RhdGUoXG4gICAgICAgICdTcGVsbCBjaGVjayBwYXNzZWQgXHUyMDE0IG5vIGlzc3VlcyBmb3VuZC4nLFxuICAgICAgICBidWlsZFNwZWxsU3RhdHNTdW1tYXJ5KHtcbiAgICAgICAgICB0b3RhbF9zZWN0aW9uczogc2VjdGlvbnMubGVuZ3RoLFxuICAgICAgICAgIHRvdGFsX3dvcmRzOiBhZ2dyZWdhdGVTdGF0cy53b3JkX2NvdW50IHx8IDAsXG4gICAgICAgICAgdW5pcXVlX3dvcmRzOiBhZ2dyZWdhdGVTdGF0cy51bmlxdWVfd29yZHMgfHwgMCxcbiAgICAgICAgICBjdXN0b21fZGljdF93b3JkczogYWdncmVnYXRlU3RhdHMuY3VzdG9tX2RpY3Rfd29yZHMgfHwgMCxcbiAgICAgICAgICBpbmNvcnJlY3Rfd29yZHM6IGluY29ycmVjdFdvcmRzLFxuICAgICAgICAgIGdyYW1tYXJfaXNzdWVzOiBncmFtbWFySXNzdWVzLFxuICAgICAgICB9KSxcbiAgICAgICAgY3VzdG9tRGljdFNpemUsXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFJlbmRlciBzdWdnZXN0aW9ucyBwYW5lbFxuICAgIHJlbmRlclNwZWxsU3VnZ2VzdGlvbnMoZmxhZ2dlZFNlY3Rpb25zLCBzZWN0aW9ucy5sZW5ndGgsIHtcbiAgICAgIHRvdGFsX3NlY3Rpb25zOiBzZWN0aW9ucy5sZW5ndGgsXG4gICAgICB0b3RhbF93b3JkczogYWdncmVnYXRlU3RhdHMud29yZF9jb3VudCB8fCAwLFxuICAgICAgdW5pcXVlX3dvcmRzOiBhZ2dyZWdhdGVTdGF0cy51bmlxdWVfd29yZHMgfHwgMCxcbiAgICAgIGN1c3RvbV9kaWN0X3dvcmRzOiBhZ2dyZWdhdGVTdGF0cy5jdXN0b21fZGljdF93b3JkcyB8fCAwLFxuICAgICAgaW5jb3JyZWN0X3dvcmRzOiBpbmNvcnJlY3RXb3JkcyxcbiAgICAgIGdyYW1tYXJfaXNzdWVzOiBncmFtbWFySXNzdWVzLFxuICAgIH0sIGN1c3RvbURpY3RTaXplKTtcblxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cuZXJyb3IoJ1NwZWxsIGNoZWNrIGVycm9yOicsIGVycik7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NwZWxsLWxvYWRpbmcnKS5pbm5lckhUTUwgPSBgPHAgc3R5bGU9XCJjb2xvcjojZWY0NDQ0O3BhZGRpbmc6MjBweDtcIj5TcGVsbCBjaGVjayBmYWlsZWQ6ICR7ZXJyLm1lc3NhZ2V9PC9wPmA7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIFplcm8tc3RhdGUgc3BlbGwgc3RhZ2UgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIHJlbmRlclNwZWxsQ2hlY2taZXJvU3RhdGUobWVzc2FnZSwgc3RhdHNMaW5lID0gJycsIGN1c3RvbURpY3RTaXplID0gMCkge1xuICB3aW5kb3cuX3NwZWxsQ2hlY2tDYWNoZSA9IHsgdHlwZTogJ3plcm8nLCBtZXNzYWdlLCBzdGF0c0xpbmUsIGN1c3RvbURpY3RTaXplIH07XG4gIF9zcGVsbENoZWNrQ2FjaGUgPSB3aW5kb3cuX3NwZWxsQ2hlY2tDYWNoZTtcbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIGNvbnN0IHN0YXRzUGFydHMgPSBbXTtcbiAgaWYgKHN0YXRzTGluZSkgc3RhdHNQYXJ0cy5wdXNoKGA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7Zm9udC1zaXplOjAuOTVlbTttYXJnaW46OHB4IDAgMDtcIj4ke2VzY2FwZUh0bWwoc3RhdHNMaW5lKX08L3A+YCk7XG4gIGlmIChjdXN0b21EaWN0U2l6ZSA+IDApIHN0YXRzUGFydHMucHVzaChgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO2ZvbnQtc2l6ZTowLjllbTttYXJnaW46NHB4IDAgMDtcIj5DdXN0b20gZGljdGlvbmFyeTogJHtjdXN0b21EaWN0U2l6ZS50b0xvY2FsZVN0cmluZygpfSB3b3JkJHtjdXN0b21EaWN0U2l6ZSAhPT0gMSA/ICdzJyA6ICcnfTwvcD5gKTtcbiAgY29udGVudC5pbm5lckhUTUwgPSBgXG4gICAgPGRpdiBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO3BhZGRpbmc6NjBweCAyMHB4O1wiPlxuICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTozZW07bWFyZ2luLWJvdHRvbToxNnB4O1wiPlx1MjcwNTwvZGl2PlxuICAgICAgPGgyIHN0eWxlPVwiY29sb3I6IzE2NjUzNDtcIj4ke2VzY2FwZUh0bWwobWVzc2FnZSl9PC9oMj5cbiAgICAgICR7c3RhdHNQYXJ0cy5qb2luKCdcXG4nKX1cbiAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDttYXJnaW46MTZweCAwIDI0cHg7XCI+Q29udGludWUgd2hlbiB5b3UgYXJlIHJlYWR5IHRvIGdlbmVyYXRlIHlvdXIgQ1YuPC9wPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cInN1Ym1pdC1idG5cIiBvbmNsaWNrPVwic3VibWl0RW1wdHlTcGVsbENoZWNrKClcIiB0aXRsZT1cIkdlbmVyYXRlIGFuIEhUTUwgcHJldmlldyBvZiB5b3VyIENWIFx1MjAxNCB5b3Ugd2lsbCByZXZpZXcgdGhlIGxheW91dCBiZWZvcmUgZmluYWwgRE9DWC9QREYgZmlsZXMgYXJlIHByb2R1Y2VkXCI+R2VuZXJhdGUgUHJldmlldyBcdTIxOTI8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgYDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc3VibWl0RW1wdHlTcGVsbENoZWNrKCkge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9zcGVsbC1jaGVjay1jb21wbGV0ZScsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHNwZWxsX2F1ZGl0OiBbXSB9KVxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmICghcmVzLm9rKSB7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgYEZhaWxlZCB0byBzYXZlIHNwZWxsIGNoZWNrOiAke2RhdGEuZXJyb3IgfHwgJ1Vua25vd24gZXJyb3InfWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwcm9jZWVkID0gYXdhaXQgX2NvbmZpcm1Qcm9jZWVkVG9HZW5lcmF0ZSgpO1xuICAgIGlmICghcHJvY2VlZCkgcmV0dXJuO1xuICAgIHN0YXRlTWFuYWdlci5tYXJrQ29udGVudENoYW5nZWQoKTtcbiAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCAnXHUyNzA1IFNwZWxsIGNoZWNrIGNvbXBsZXRlIFx1MjAxNCBubyBpc3N1ZXMgcmVxdWlyZWQgY2hhbmdlcy4gR2VuZXJhdGluZyB5b3VyIENWXHUyMDI2Jyk7XG4gICAgc2NoZWR1bGVBdHNSZWZyZXNoKCdyZXZpZXdfY2hlY2twb2ludCcpO1xuICAgIGF3YWl0IGZldGNoU3RhdHVzKCk7XG4gICAgYXdhaXQgc2VuZEFjdGlvbignZ2VuZXJhdGVfY3YnKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsIGBTcGVsbCBjaGVjayBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgU3RhdHMgc3VtbWFyeSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gYnVpbGRTcGVsbFN0YXRzU3VtbWFyeShzdGF0cyA9IHt9KSB7XG4gIHJldHVybiBbXG4gICAgYCR7KHN0YXRzLnRvdGFsX3NlY3Rpb25zIHx8IDApLnRvTG9jYWxlU3RyaW5nKCl9IHNlY3Rpb24ke3N0YXRzLnRvdGFsX3NlY3Rpb25zID09PSAxID8gJycgOiAncyd9IGNoZWNrZWRgLFxuICAgIGAkeyhzdGF0cy50b3RhbF93b3JkcyB8fCAwKS50b0xvY2FsZVN0cmluZygpfSB3b3Jkc2AsXG4gICAgYCR7KHN0YXRzLnVuaXF1ZV93b3JkcyB8fCAwKS50b0xvY2FsZVN0cmluZygpfSB1bmlxdWVgLFxuICAgIGAkeyhzdGF0cy5jdXN0b21fZGljdF93b3JkcyB8fCAwKS50b0xvY2FsZVN0cmluZygpfSBjdXN0b20gZGljdGlvbmFyeSBtYXRjaCR7c3RhdHMuY3VzdG9tX2RpY3Rfd29yZHMgPT09IDEgPyAnJyA6ICdlcyd9YCxcbiAgICBgJHsoc3RhdHMuaW5jb3JyZWN0X3dvcmRzIHx8IDApLnRvTG9jYWxlU3RyaW5nKCl9IHVua25vd24vaW5jb3JyZWN0YCxcbiAgICBgJHsoc3RhdHMuZ3JhbW1hcl9pc3N1ZXMgfHwgMCkudG9Mb2NhbGVTdHJpbmcoKX0gZ3JhbW1hciBpc3N1ZSR7c3RhdHMuZ3JhbW1hcl9pc3N1ZXMgPT09IDEgPyAnJyA6ICdzJ31gLFxuICBdLmpvaW4oJyBcdTAwQjcgJyk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBSZW5kZXIgc3VnZ2VzdGlvbnMgcGFuZWwgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIHJlbmRlclNwZWxsU3VnZ2VzdGlvbnMoZmxhZ2dlZFNlY3Rpb25zLCB0b3RhbFNlY3Rpb25zLCBzdGF0cyA9IHt9LCBjdXN0b21EaWN0U2l6ZSA9IDApIHtcbiAgd2luZG93Ll9zcGVsbENoZWNrQ2FjaGUgPSB7IHR5cGU6ICdzdWdnZXN0aW9ucycsIGZsYWdnZWRTZWN0aW9ucywgdG90YWxTZWN0aW9ucywgc3RhdHMsIGN1c3RvbURpY3RTaXplIH07XG4gIF9zcGVsbENoZWNrQ2FjaGUgPSB3aW5kb3cuX3NwZWxsQ2hlY2tDYWNoZTtcbiAgY29uc3QgcmVzdWx0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzcGVsbC1yZXN1bHRzJyk7XG4gIHJlc3VsdHMuc3R5bGUuZGlzcGxheSA9ICcnO1xuICBjb25zdCBzdGF0c0xpbmUgPSBidWlsZFNwZWxsU3RhdHNTdW1tYXJ5KHN0YXRzKTtcblxuICBsZXQgaHRtbCA9IGBcbiAgICA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZmVmOWMzO2JvcmRlcjoxcHggc29saWQgI2ZkZTA0Nztib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjEycHggMTZweDttYXJnaW4tYm90dG9tOjI0cHg7XCI+XG4gICAgICA8c3Ryb25nPlx1MjZBMCAke2ZsYWdnZWRTZWN0aW9ucy5yZWR1Y2UoKHQsIGYpID0+IHQgKyBmLnN1Z2dlc3Rpb25zLmxlbmd0aCwgMCl9IGlzc3VlJHtmbGFnZ2VkU2VjdGlvbnMucmVkdWNlKCh0LCBmKSA9PiB0ICsgZi5zdWdnZXN0aW9ucy5sZW5ndGgsIDApICE9PSAxID8gJ3MnIDogJyd9PC9zdHJvbmc+IGZvdW5kXG4gICAgICBhY3Jvc3MgJHtmbGFnZ2VkU2VjdGlvbnMubGVuZ3RofSBvZiAke3RvdGFsU2VjdGlvbnN9IHNlY3Rpb24ke3RvdGFsU2VjdGlvbnMgIT09IDEgPyAncycgOiAnJ30uXG4gICAgICBSZXZpZXcgZWFjaCBzdWdnZXN0aW9uIGJlbG93LCB0aGVuIGNsaWNrIDxzdHJvbmc+RG9uZTwvc3Ryb25nPi5cbiAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOjhweDtmb250LXNpemU6MC45MmVtO2NvbG9yOiM2YjcyODA7XCI+JHtlc2NhcGVIdG1sKHN0YXRzTGluZSl9PC9kaXY+XG4gICAgICAke2N1c3RvbURpY3RTaXplID4gMCA/IGA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDo0cHg7Zm9udC1zaXplOjAuODhlbTtjb2xvcjojNmI3MjgwO1wiPkN1c3RvbSBkaWN0aW9uYXJ5IHNpemU6ICR7Y3VzdG9tRGljdFNpemUudG9Mb2NhbGVTdHJpbmcoKX0gd29yZCR7Y3VzdG9tRGljdFNpemUgIT09IDEgPyAncycgOiAnJ308L2Rpdj5gIDogJyd9XG4gICAgPC9kaXY+XG4gIGA7XG5cbiAgY29uc3QgX3N1Z1NldmVyaXR5ID0gKHN1ZykgPT4ge1xuICAgIGNvbnN0IHJpZCA9IChzdWcucnVsZV9pZCB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBjYXQgPSAoc3VnLmNhdGVnb3J5IHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmICgvc3BlbGx8dHlwb3xtaXNzcGVsbC8udGVzdChyaWQpIHx8IC90eXBvLy50ZXN0KGNhdCkpIHJldHVybiAwO1xuICAgIGlmICgvZ3JhbW1hcnxhZ3JlZW1lbnR8dmVyYnx0ZW5zZXxhcnRpY2xlLy50ZXN0KHJpZCkgfHwgL2dyYW1tYXIvLnRlc3QoY2F0KSkgcmV0dXJuIDE7XG4gICAgaWYgKC9zdHlsZXxyZWR1bmRhbnx3b3JkeS8udGVzdChyaWQpIHx8IC9zdHlsZS8udGVzdChjYXQpKSByZXR1cm4gMjtcbiAgICByZXR1cm4gMztcbiAgfTtcblxuICBmbGFnZ2VkU2VjdGlvbnMuZm9yRWFjaCgoeyBzZWN0aW9uLCBzdWdnZXN0aW9uczogcmF3U3VnZ2VzdGlvbnMgfSkgPT4ge1xuICAgIGNvbnN0IHN1Z2dlc3Rpb25zID0gWy4uLnJhd1N1Z2dlc3Rpb25zXS5zb3J0KChhLCBiKSA9PiBfc3VnU2V2ZXJpdHkoYSkgLSBfc3VnU2V2ZXJpdHkoYikpO1xuICAgIGh0bWwgKz0gYDxkaXYgY2xhc3M9XCJyZXZpZXctc2VjdGlvblwiIHN0eWxlPVwibWFyZ2luLWJvdHRvbToyNHB4O1wiPlxuICAgICAgPGgzIHN0eWxlPVwiZm9udC1zaXplOjFlbTtmb250LXdlaWdodDo3MDA7Y29sb3I6IzM3NDE1MTttYXJnaW4tYm90dG9tOjEycHg7XCI+JHtlc2NhcGVIdG1sKHNlY3Rpb24ubGFiZWwpfTwvaDM+XG4gICAgICA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZjhmYWZjO2JvcmRlcjoxcHggc29saWQgI2UyZThmMDtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjEwcHggMTRweDttYXJnaW4tYm90dG9tOjEwcHg7Zm9udC1zaXplOjAuOWVtO3doaXRlLXNwYWNlOnByZS13cmFwO1wiPiR7ZXNjYXBlSHRtbChzZWN0aW9uLnRleHQpfTwvZGl2PlxuICAgIGA7XG4gICAgc3VnZ2VzdGlvbnMuZm9yRWFjaCgoc3VnLCBpZHgpID0+IHtcbiAgICAgIGNvbnN0IHN1Z0lkID0gYHN1Z18ke3NlY3Rpb24uaWR9XyR7aWR4fWA7XG4gICAgICBjb25zdCByZXBzID0gc3VnLnJlcGxhY2VtZW50cyB8fCBbXTtcbiAgICAgIGh0bWwgKz0gYFxuICAgICAgICA8ZGl2IGNsYXNzPVwic3BlbGwtc3VnZ2VzdGlvblwiIGlkPVwiJHtzdWdJZH1cIiBkYXRhLXNlY3Rpb24taWQ9XCIke2VzY2FwZUh0bWwoc2VjdGlvbi5pZCl9XCIgZGF0YS1pZHg9XCIke2lkeH1cIlxuICAgICAgICAgICAgIHN0eWxlPVwiYm9yZGVyOjFweCBzb2xpZCAjZTJlOGYwO2JvcmRlci1yYWRpdXM6NnB4O3BhZGRpbmc6MTBweCAxNHB4O21hcmdpbi1ib3R0b206OHB4O2JhY2tncm91bmQ6I2ZmZjtcIj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmZsZXgtc3RhcnQ7Z2FwOjEwcHg7XCI+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDoxO1wiPlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuODhlbTtjb2xvcjojNmI3MjgwO21hcmdpbi1ib3R0b206NHB4O1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiYmFja2dyb3VuZDojZmVlMmUyO2NvbG9yOiNkYzI2MjY7Ym9yZGVyLXJhZGl1czo0cHg7cGFkZGluZzoxcHggNnB4O2ZvbnQtd2VpZ2h0OjYwMDtcIj4ke2VzY2FwZUh0bWwoc3VnLmZsYWdnZWQpfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cIm1hcmdpbi1sZWZ0OjhweDtcIj4ke2VzY2FwZUh0bWwoc3VnLm1lc3NhZ2UpfTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXN0eWxlOml0YWxpYztmb250LXNpemU6MC44NWVtO2NvbG9yOiMzNzQxNTE7bWFyZ2luLWJvdHRvbTo4cHg7XCI+JHtlc2NhcGVIdG1sKHN1Zy5zbmlwcGV0KX08L2Rpdj5cbiAgICAgICAgICAgICAgJHtyZXBzLmxlbmd0aCA+IDAgPyBgXG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7ZmxleC13cmFwOndyYXA7Z2FwOjZweDttYXJnaW4tYm90dG9tOjhweDtcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjgyZW07Y29sb3I6IzZiNzI4MDthbGlnbi1zZWxmOmNlbnRlcjtcIj5TdWdnZXN0aW9uczo8L3NwYW4+XG4gICAgICAgICAgICAgICAgJHtyZXBzLm1hcCgociwgcmkpID0+IGA8YnV0dG9uIGNsYXNzPVwicmV3cml0ZS1rZXl3b3JkXCIgb25jbGljaz1cImFwcGx5U3BlbGxSZXBsYWNlbWVudCgnJHtlc2NhcGVIdG1sKHNlY3Rpb24uaWQpfScsICR7aWR4fSwgJHtyaX0pXCJcbiAgICAgICAgICAgICAgICAgIHN0eWxlPVwiY3Vyc29yOnBvaW50ZXI7Ym9yZGVyOjFweCBzb2xpZCAjM2I4MmY2O2JhY2tncm91bmQ6I2RiZWFmZTtcIj4ke2VzY2FwZUh0bWwocil9PC9idXR0b24+YCkuam9pbignJyl9XG4gICAgICAgICAgICAgIDwvZGl2PmAgOiAnJ31cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjZweDttYXJnaW4tYm90dG9tOjhweDtcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImVkaXRfJHtzdWdJZH1cIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJUeXBlIGN1c3RvbSBjb3JyZWN0aW9uXHUyMDI2XCJcbiAgICAgICAgICAgICAgICAgIHZhbHVlPVwiJHtlc2NhcGVIdG1sKHJlcHNbMF0gfHwgJycpfVwiXG4gICAgICAgICAgICAgICAgICBzdHlsZT1cImZsZXg6MTtmb250LXNpemU6MC44OGVtO3BhZGRpbmc6NHB4IDhweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo0cHg7XCJcbiAgICAgICAgICAgICAgICAgIG9ua2V5ZG93bj1cImlmKGV2ZW50LmtleT09PSdFbnRlcicpe2V2ZW50LnByZXZlbnREZWZhdWx0KCk7YXBwbHlDdXN0b21TcGVsbENvcnJlY3Rpb24oJyR7ZXNjYXBlSHRtbChzZWN0aW9uLmlkKX0nLCR7aWR4fSk7fVwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIG9uY2xpY2s9XCJhcHBseUN1c3RvbVNwZWxsQ29ycmVjdGlvbignJHtlc2NhcGVIdG1sKHNlY3Rpb24uaWQpfScsJHtpZHh9KVwiIHRpdGxlPVwiQXBwbHkgY3VzdG9tIGNvcnJlY3Rpb25cIiBhcmlhLWxhYmVsPVwiQXBwbHkgY3VzdG9tIGNvcnJlY3Rpb25cIj5BcHBseTwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6OHB4O2ZsZXgtd3JhcDp3cmFwO1wiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIG9uY2xpY2s9XCJkaXNtaXNzU3BlbGxTdWdnZXN0aW9uKCcke2VzY2FwZUh0bWwoc3VnSWQpfScsICcke2VzY2FwZUh0bWwoc2VjdGlvbi5pZCl9JywgJHtpZHh9LCAnJHtlc2NhcGVIdG1sKHN1Zy5mbGFnZ2VkKX0nKVwiXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiSWdub3JlIHRoaXMgc3VnZ2VzdGlvblwiIGFyaWEtbGFiZWw9XCJJZ25vcmUgdGhpcyBzdWdnZXN0aW9uXCI+SWdub3JlPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgb25jbGljaz1cImFkZFNwZWxsV29yZCgnJHtlc2NhcGVIdG1sKHN1Zy5mbGFnZ2VkKX0nLCAnJHtlc2NhcGVIdG1sKHN1Z0lkKX0nKVwiXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiQWRkIHRvIGN1c3RvbSBkaWN0aW9uYXJ5XCIgYXJpYS1sYWJlbD1cIkFkZCB0byBjdXN0b20gZGljdGlvbmFyeVwiPkFkZCB0byBEaWN0aW9uYXJ5PC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgYDtcbiAgICAgIC8vIFJlZ2lzdGVyIGluIGF1ZGl0IGFzIHBlbmRpbmdcbiAgICAgIGlmICghd2luZG93Ll9zcGVsbFN1Z01hcCkgd2luZG93Ll9zcGVsbFN1Z01hcCA9IHt9O1xuICAgICAgd2luZG93Ll9zcGVsbFN1Z01hcFtgJHtzZWN0aW9uLmlkfV8ke2lkeH1gXSA9IHtcbiAgICAgICAgc2VjdGlvbl9pZDogICAgc2VjdGlvbi5pZCxcbiAgICAgICAgY29udGV4dF90eXBlOiBzZWN0aW9uLmNvbnRleHQsXG4gICAgICAgIGxvY2F0aW9uOiAgICAgc2VjdGlvbi5sYWJlbCxcbiAgICAgICAgb3JpZ2luYWw6ICAgICBzdWcuZmxhZ2dlZCxcbiAgICAgICAgc3VnZ2VzdGlvbjogICAocmVwc1swXSB8fCAnJyksXG4gICAgICAgIG9mZnNldDogICAgICAgc3VnLm9mZnNldCxcbiAgICAgICAgbGVuZ3RoOiAgICAgICBzdWcubGVuZ3RoLFxuICAgICAgICBydWxlOiAgICAgICAgIHN1Zy5ydWxlX2lkIHx8ICcnLFxuICAgICAgICBvdXRjb21lOiAgICAgICdwZW5kaW5nJyxcbiAgICAgICAgZmluYWw6ICAgICAgICBzdWcuZmxhZ2dlZCxcbiAgICAgIH07XG4gICAgfSk7XG4gICAgaHRtbCArPSAnPC9kaXY+JztcbiAgfSk7XG5cbiAgaHRtbCArPSBgXG4gICAgPGRpdiBjbGFzcz1cIm5hdi1idXR0b25zXCIgc3R5bGU9XCJtYXJnaW46MjRweCAwO1wiPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cInN1Ym1pdC1idG5cIiBvbmNsaWNrPVwic3VibWl0U3BlbGxDaGVja0RlY2lzaW9ucygpXCI+R2VuZXJhdGUgUHJldmlldyBcdTIxOTI8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgYDtcbiAgcmVzdWx0cy5pbm5lckhUTUwgPSBodG1sO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgQXBwbHkgLyBkaXNtaXNzIGNvcnJlY3Rpb25zIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBhcHBseUN1c3RvbVNwZWxsQ29ycmVjdGlvbihzZWN0aW9uSWQsIGlkeCkge1xuICBjb25zdCBrZXkgICAgPSBgJHtzZWN0aW9uSWR9XyR7aWR4fWA7XG4gIGNvbnN0IGVudHJ5ICA9ICh3aW5kb3cuX3NwZWxsU3VnTWFwIHx8IHt9KVtrZXldO1xuICBpZiAoIWVudHJ5KSByZXR1cm47XG4gIGNvbnN0IGlucHV0ICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBlZGl0X3N1Z18ke3NlY3Rpb25JZH1fJHtpZHh9YCk7XG4gIGNvbnN0IGN1c3RvbSA9IGlucHV0ID8gaW5wdXQudmFsdWUudHJpbSgpIDogJyc7XG4gIGlmICghY3VzdG9tKSByZXR1cm47XG4gIGVudHJ5Lm91dGNvbWUgPSAnYWNjZXB0JztcbiAgZW50cnkuZmluYWwgICA9IGN1c3RvbTtcbiAgY29uc3Qgc3VnRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuc3BlbGwtc3VnZ2VzdGlvbltkYXRhLXNlY3Rpb24taWQ9XCIke0NTUy5lc2NhcGUoc2VjdGlvbklkKX1cIl1bZGF0YS1pZHg9XCIke2lkeH1cIl1gKTtcbiAgaWYgKCFzdWdFbCkgcmV0dXJuO1xuICBjb25zdCBmbGFnZ2VkU3BhbiA9IHN1Z0VsLnF1ZXJ5U2VsZWN0b3IoJ3NwYW5bc3R5bGUqPVwiYmFja2dyb3VuZDojZmVlMmUyXCJdJyk7XG4gIGlmIChmbGFnZ2VkU3Bhbikge1xuICAgIGZsYWdnZWRTcGFuLm91dGVySFRNTCA9IGA8ZGVsIHN0eWxlPVwiY29sb3I6I2RjMjYyNjtcIj4ke2VzY2FwZUh0bWwoZW50cnkub3JpZ2luYWwpfTwvZGVsPiBcdTIxOTIgPGlucyBzdHlsZT1cImNvbG9yOiMxNjY1MzQ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7XCI+JHtlc2NhcGVIdG1sKGN1c3RvbSl9PC9pbnM+YDtcbiAgfVxuICBzdWdFbC5zdHlsZS5vcGFjaXR5ID0gJzAuNSc7XG59XG5cbmZ1bmN0aW9uIGFwcGx5U3BlbGxSZXBsYWNlbWVudChzZWN0aW9uSWQsIGlkeCwgcmVwSWR4KSB7XG4gIGNvbnN0IGtleSAgPSBgJHtzZWN0aW9uSWR9XyR7aWR4fWA7XG4gIGNvbnN0IGVudHJ5ID0gKHdpbmRvdy5fc3BlbGxTdWdNYXAgfHwge30pW2tleV07XG4gIGlmICghZW50cnkpIHJldHVybjtcbiAgLy8gVGhlIHJlcGxhY2VtZW50cyBsaXN0IGlzIG5vdCBkaXJlY3RseSBhY2Nlc3NpYmxlIGhlcmUgXHUyMDE0IHJlYWQgZnJvbSBET00gc3VnZ2VzdGlvblxuICBjb25zdCBzdWdFbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC5zcGVsbC1zdWdnZXN0aW9uW2RhdGEtc2VjdGlvbi1pZD1cIiR7Q1NTLmVzY2FwZShzZWN0aW9uSWQpfVwiXVtkYXRhLWlkeD1cIiR7aWR4fVwiXWApO1xuICBpZiAoIXN1Z0VsKSByZXR1cm47XG4gIGNvbnN0IGJ1dHRvbnMgPSBzdWdFbC5xdWVyeVNlbGVjdG9yQWxsKCcucmV3cml0ZS1rZXl3b3JkJyk7XG4gIGNvbnN0IHJlcCA9IGJ1dHRvbnNbcmVwSWR4XSA/IGJ1dHRvbnNbcmVwSWR4XS50ZXh0Q29udGVudC50cmltKCkgOiAnJztcbiAgZW50cnkub3V0Y29tZSA9ICdhY2NlcHQnO1xuICBlbnRyeS5maW5hbCAgID0gcmVwO1xuICAvLyBWaXN1YWwgZmVlZGJhY2s6IHN0cmlrZSB0aGUgZmxhZ2dlZCB3b3JkLCBzaG93IHJlcGxhY2VtZW50XG4gIGNvbnN0IGZsYWdnZWRTcGFuID0gc3VnRWwucXVlcnlTZWxlY3Rvcignc3BhbltzdHlsZSo9XCJiYWNrZ3JvdW5kOiNmZWUyZTJcIl0nKTtcbiAgaWYgKGZsYWdnZWRTcGFuKSB7XG4gICAgZmxhZ2dlZFNwYW4ub3V0ZXJIVE1MID0gYDxkZWwgc3R5bGU9XCJjb2xvcjojZGMyNjI2O1wiPiR7ZXNjYXBlSHRtbChlbnRyeS5vcmlnaW5hbCl9PC9kZWw+IFx1MjE5MiA8aW5zIHN0eWxlPVwiY29sb3I6IzE2NjUzNDt0ZXh0LWRlY29yYXRpb246bm9uZTtcIj4ke2VzY2FwZUh0bWwocmVwKX08L2lucz5gO1xuICB9XG4gIHN1Z0VsLnN0eWxlLm9wYWNpdHkgPSAnMC41Jztcbn1cblxuZnVuY3Rpb24gZGlzbWlzc1NwZWxsU3VnZ2VzdGlvbihzdWdJZCwgc2VjdGlvbklkLCBpZHgsIHdvcmQpIHtcbiAgY29uc3Qga2V5ICAgPSBgJHtzZWN0aW9uSWR9XyR7aWR4fWA7XG4gIGNvbnN0IGVudHJ5ID0gKHdpbmRvdy5fc3BlbGxTdWdNYXAgfHwge30pW2tleV07XG4gIGlmIChlbnRyeSkgeyBlbnRyeS5vdXRjb21lID0gJ3JlamVjdCc7IGVudHJ5LmZpbmFsID0gd29yZDsgfVxuICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHN1Z0lkKTtcbiAgaWYgKGVsKSBlbC5zdHlsZS5vcGFjaXR5ID0gJzAuNCc7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGFkZFNwZWxsV29yZCh3b3JkLCBzdWdJZCkge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL2N1c3RvbS1kaWN0aW9uYXJ5Jywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgd29yZCB9KVxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHN1Z0lkKTtcbiAgICAgIGlmIChlbCkge1xuICAgICAgICBlbC5zdHlsZS5vcGFjaXR5ID0gJzAuNCc7XG4gICAgICAgIGNvbnN0IG1zZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBtc2cuc3R5bGUuY3NzVGV4dCA9ICdjb2xvcjojMTY2NTM0O2ZvbnQtc2l6ZTowLjg1ZW07bWFyZ2luLXRvcDo0cHg7JztcbiAgICAgICAgbXNnLnRleHRDb250ZW50ID0gYFwiJHt3b3JkfVwiIGFkZGVkIHRvIGRpY3Rpb25hcnkuYDtcbiAgICAgICAgZWwuYXBwZW5kQ2hpbGQobXNnKTtcbiAgICAgIH1cbiAgICAgIC8vIEFsc28gcmVjb3JkIGluIGF1ZGl0XG4gICAgICBjb25zdCBwYXJ0cyA9IHN1Z0lkLnJlcGxhY2UoL15zdWdfLywgJycpLnNwbGl0KCdfJyk7XG4gICAgICBjb25zdCBpZHggPSBwYXJzZUludChwYXJ0cy5wb3AoKSwgMTApO1xuICAgICAgY29uc3Qgc2VjdGlvbklkID0gcGFydHMuam9pbignXycpO1xuICAgICAgY29uc3Qga2V5ID0gYCR7c2VjdGlvbklkfV8ke2lkeH1gO1xuICAgICAgY29uc3QgZW50cnkgPSAod2luZG93Ll9zcGVsbFN1Z01hcCB8fCB7fSlba2V5XTtcbiAgICAgIGlmIChlbnRyeSkgeyBlbnRyeS5vdXRjb21lID0gJ2FkZF9kaWN0JzsgZW50cnkuZmluYWwgPSB3b3JkOyB9XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cuZXJyb3IoJ0Vycm9yIGFkZGluZyB0byBkaWN0aW9uYXJ5OicsIGVycik7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIFByZS1nZW5lcmF0aW9uIGNvbmZpcm1hdGlvbiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gX2NvbmZpcm1Qcm9jZWVkVG9HZW5lcmF0ZSgpIHtcbiAgLy8gR2F0ZTogdGFnbGluZSBtdXN0IGJlIGV4cGxpY2l0bHkgY29uZmlybWVkIGJlZm9yZSBnZW5lcmF0aW5nXG4gIGNvbnN0IHN0YXR1cyA9IGF3YWl0IGZldGNoU3RhdHVzKCkuY2F0Y2goKCkgPT4gKHt9KSk7XG4gIGlmICghc3RhdHVzPy5kZWNpc2lvbnNfY29uZmlybWVkPy50YWdsaW5lKSB7XG4gICAgYXdhaXQgc2hvd0FsZXJ0TW9kYWwoXG4gICAgICAnXHUyNkEwIFRhZ2xpbmUgTm90IENvbmZpcm1lZCcsXG4gICAgICAnWW91IG11c3QgY29uZmlybSB5b3VyIGFwcGxpY2FudCB0YWdsaW5lIGJlZm9yZSBnZW5lcmF0aW5nLlxcblxcbkdvIHRvIHRoZSBcdUQ4M0NcdURGRjdcdUZFMEYgVGFnbGluZSB0YWIgaW4gQ3VzdG9taXphdGlvbnMgdG8gY29uZmlybSBpdC4nXG4gICAgKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgYXRzU2NvcmUgPSBzdGF0ZU1hbmFnZXIuZ2V0QXRzU2NvcmUoKTtcbiAgY29uc3QgZnJlc2huZXNzID0gc3RhdGVNYW5hZ2VyLmdldExheW91dEZyZXNobmVzcygpO1xuICBjb25zdCBnZW5TdGF0ZSA9IHN0YXRlTWFuYWdlci5nZXRHZW5lcmF0aW9uU3RhdGUoKTtcbiAgY29uc3QgZGVjaXNpb25zQ29uZmlybWVkID0gc3RhdHVzPy5kZWNpc2lvbnNfY29uZmlybWVkIHx8IHt9O1xuICBjb25zdCBsaW5lcyA9IFsnWW91ciBDViBpcyByZWFkeSB0byBnZW5lcmF0ZS4nXTtcbiAgaWYgKGF0c1Njb3JlICE9PSBudWxsICYmIGF0c1Njb3JlICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGF0c1Njb3JlLm92ZXJhbGwgPT09ICdudW1iZXInKSB7XG4gICAgbGluZXMucHVzaChgQ3VycmVudCBBVFMgc2NvcmU6ICR7TWF0aC5yb3VuZChhdHNTY29yZS5vdmVyYWxsKX0lYCk7XG4gIH1cbiAgaWYgKGdlblN0YXRlLnBhZ2VXYXJuaW5nKSB7XG4gICAgY29uc3QgcGMgPSBnZW5TdGF0ZS5wYWdlQ291bnRFeGFjdCA/PyBnZW5TdGF0ZS5wYWdlQ291bnRFc3RpbWF0ZTtcbiAgICBjb25zdCBwY0xhYmVsID0gcGMgIT09IG51bGwgPyAoZ2VuU3RhdGUucGFnZUNvdW50RXhhY3QgIT09IG51bGwgPyBgJHtwY31gIDogYH4ke3BjfWApIDogbnVsbDtcbiAgICBjb25zdCBva1BhZ2UgPSBhd2FpdCBzaG93Q29uZmlybU1vZGFsKFxuICAgICAgJ1x1MjZBMCBQYWdlIENvdW50IE91dCBvZiBSYW5nZScsXG4gICAgICBgVGhlIENWIGlzIGVzdGltYXRlZCBhdCAke3BjTGFiZWwgPyBgJHtwY0xhYmVsfSBwYWdlJHtwYyAhPT0gMSA/ICdzJyA6ICcnfWAgOiAnYW4gdW51c3VhbCBwYWdlIGNvdW50J30sIHdoaWNoIGlzIG91dHNpZGUgdGhlIHJlY29tbWVuZGVkIHJhbmdlIGZvciBhIHNlbmlvciBjYW5kaWRhdGUgKDJcdTIwMTMzIHBhZ2VzKS5cXG5cXG5Db25zaWRlciBhZGp1c3RpbmcgeW91ciBsYXlvdXQgaW5zdHJ1Y3Rpb25zIGJlZm9yZSBnZW5lcmF0aW5nLlxcblxcblByb2NlZWQgYW55d2F5P2AsXG4gICAgICAnR2VuZXJhdGUgQW55d2F5J1xuICAgICk7XG4gICAgaWYgKCFva1BhZ2UpIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoZnJlc2huZXNzLmlzU3RhbGUpIHtcbiAgICBsaW5lcy5wdXNoKGBcdTI2QTAgJHtmcmVzaG5lc3MuYXJpYUxhYmVsfWApO1xuICB9XG4gIGNvbnN0IHJldmlld2VkU2VjdGlvbnMgPSBbJ2V4cGVyaWVuY2VzJywgJ3NraWxscycsICdhY2hpZXZlbWVudHMnXS5maWx0ZXIoayA9PiBkZWNpc2lvbnNDb25maXJtZWRba10pO1xuICBpZiAocmV2aWV3ZWRTZWN0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICBsaW5lcy5wdXNoKCdcdTI2QTAgTm8gY3VzdG9taXNhdGlvbiBzZWN0aW9ucyByZXZpZXdlZCBcdTIwMTQgZXhwZXJpZW5jZSwgc2tpbGwsIGFuZCBhY2hpZXZlbWVudCBzZWxlY3Rpb25zIGFyZSBhbGwgTExNIGRlZmF1bHRzLicpO1xuICB9XG4gIGxldCB3ZWFrQnVsbGV0Q291bnQgPSAwLCBwYXNzaXZlQnVsbGV0Q291bnQgPSAwO1xuICBPYmplY3QudmFsdWVzKHdpbmRvdy5hY2hpZXZlbWVudEVkaXRzIHx8IHt9KS5mb3JFYWNoKGxpc3QgPT4ge1xuICAgIChsaXN0IHx8IFtdKS5mb3JFYWNoKGUgPT4ge1xuICAgICAgY29uc3QgdHh0ID0gdHlwZW9mIGUgPT09ICdzdHJpbmcnID8gZSA6ICgoZSAmJiBlLnRleHQpIHx8ICcnKTtcbiAgICAgIGlmICghdHh0LnRyaW0oKSB8fCAoZSAmJiBlLmhpZGRlbikpIHJldHVybjtcbiAgICAgIGNvbnN0IHdhcm4gPSB0eXBlb2YgX2FjaFZlcmJXYXJuaW5nID09PSAnZnVuY3Rpb24nID8gX2FjaFZlcmJXYXJuaW5nKHR4dCkgOiBudWxsO1xuICAgICAgaWYgKHdhcm4/LmxldmVsID09PSAncGFzc2l2ZScpIHBhc3NpdmVCdWxsZXRDb3VudCsrO1xuICAgICAgZWxzZSBpZiAod2Fybj8ubGV2ZWwgPT09ICd3ZWFrJykgd2Vha0J1bGxldENvdW50Kys7XG4gICAgfSk7XG4gIH0pO1xuICBpZiAod2Vha0J1bGxldENvdW50ID4gMCB8fCBwYXNzaXZlQnVsbGV0Q291bnQgPiAwKSB7XG4gICAgY29uc3QgcGFydHMgPSBbXTtcbiAgICBpZiAocGFzc2l2ZUJ1bGxldENvdW50ID4gMCkgcGFydHMucHVzaChgJHtwYXNzaXZlQnVsbGV0Q291bnR9IHdpdGggcGFzc2l2ZSB2b2ljZWApO1xuICAgIGlmICh3ZWFrQnVsbGV0Q291bnQgPiAwKSBwYXJ0cy5wdXNoKGAke3dlYWtCdWxsZXRDb3VudH0gd2l0aCB3ZWFrIG9wZW5pbmcgdmVyYiR7d2Vha0J1bGxldENvdW50ICE9PSAxID8gJ3MnIDogJyd9YCk7XG4gICAgbGluZXMucHVzaChgXHUyNkEwICR7cGFydHMuam9pbignLCAnKX0gaW4gZXhwZXJpZW5jZSBidWxsZXRzIFx1MjAxNCBjb25zaWRlciBBSSByZXdyaXRlcyBpbiB0aGUgRXhwZXJpZW5jZSBCdWxsZXRzIGVkaXRvci5gKTtcbiAgfVxuICBsaW5lcy5wdXNoKCdcXG5Qcm9jZWVkPycpO1xuICByZXR1cm4gc2hvd0NvbmZpcm1Nb2RhbCgnXHVEODNEXHVEQ0M0IFByb2NlZWQgdG8gR2VuZXJhdGU/JywgbGluZXMuam9pbignXFxuJyksICdHZW5lcmF0ZSBOb3cnKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFN1Ym1pdCBhdWRpdCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gc3VibWl0U3BlbGxDaGVja0RlY2lzaW9ucygpIHtcbiAgLyogZHVja2Zsb3c6XG4gICAqICAgaWQ6IHNwZWxsX3VpX3N1Ym1pdF9saXZlXG4gICAqICAga2luZDogdWlcbiAgICogICB0aW1lc3RhbXA6ICcyMDI2LTA0LTIxVDE4OjAwOjAwWidcbiAgICogICBzdGF0dXM6IGxpdmVcbiAgICogICBoYW5kbGVzOlxuICAgKiAgIC0gdWk6c3BlbGwtY2hlY2suc3VibWl0XG4gICAqICAgY2FsbHM6XG4gICAqICAgLSBQT1NUIC9hcGkvc3BlbGwtY2hlY2stY29tcGxldGVcbiAgICogICAtIFBPU1QgL2FwaS9hY3Rpb25cbiAgICogICByZWFkczpcbiAgICogICAtIHdpbmRvdzpfc3BlbGxTdWdNYXBcbiAgICogICB3cml0ZXM6XG4gICAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9zcGVsbC1jaGVjay1jb21wbGV0ZS5zcGVsbF9hdWRpdFxuICAgKiAgIC0gd2luZG93OnNwZWxsQXVkaXRcbiAgICogICBub3RlczogQ29sbGFwc2VzIHJldmlld2VkIHNwZWxsIHN1Z2dlc3Rpb25zIGludG8gdGhlIGNhbm9uaWNhbCBzcGVsbCBhdWRpdCwgcGVyc2lzdHMgdGhhdCBhdWRpdCBpbiBzZXNzaW9uIHN0YXRlLCBzaG93cyBhIHByZS1nZW5lcmF0aW9uIGNvbmZpcm1hdGlvbiBtb2RhbCwgYW5kIHRoZW4gdHJpZ2dlcnMgZ2VuZXJhdGlvbiB1c2luZyB0aGUgY29ycmVjdGVkIGNvbnRlbnQuXG4gICAqL1xuICAvLyBDb3VudCBpdGVtcyBzdGlsbCBtYXJrZWQgJ3BlbmRpbmcnIChub3QgZXhwbGljaXRseSByZXZpZXdlZClcbiAgY29uc3QgcGVuZGluZ0VudHJpZXMgPSBPYmplY3QudmFsdWVzKHdpbmRvdy5fc3BlbGxTdWdNYXAgfHwge30pLmZpbHRlcihlID0+IGUub3V0Y29tZSA9PT0gJ3BlbmRpbmcnKTtcbiAgaWYgKHBlbmRpbmdFbnRyaWVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBuID0gcGVuZGluZ0VudHJpZXMubGVuZ3RoO1xuICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IHNob3dDb25maXJtTW9kYWwoXG4gICAgICAnXHUyNkEwIFVucmV2aWV3ZWQgSXNzdWVzJyxcbiAgICAgIGAke259IGlzc3VlJHtuICE9PSAxID8gJ3MgaGF2ZScgOiAnIGhhcyd9IG5vdCBiZWVuIHJldmlld2VkIGFuZCB3aWxsIGJlIGlnbm9yZWQuXFxuUHJvY2VlZCBhbnl3YXk/YCxcbiAgICAgICdQcm9jZWVkJ1xuICAgICk7XG4gICAgaWYgKCFjb25maXJtZWQpIHJldHVybjtcbiAgfVxuXG4gIC8vIENvbGxlY3QgYXVkaXQgZnJvbSBfc3BlbGxTdWdNYXBcbiAgY29uc3QgYXVkaXQgPSBPYmplY3QudmFsdWVzKHdpbmRvdy5fc3BlbGxTdWdNYXAgfHwge30pLmZpbHRlcihlID0+IGUub3V0Y29tZSAhPT0gJ3BlbmRpbmcnKTtcbiAgLy8gUmVtYWluaW5nICdwZW5kaW5nJyBpdGVtcyBhcmUgZXhwbGljaXRseSBhdXRvLWlnbm9yZWQgYWZ0ZXIgY29uZmlybWF0aW9uIGFib3ZlXG4gIE9iamVjdC52YWx1ZXMod2luZG93Ll9zcGVsbFN1Z01hcCB8fCB7fSkuZm9yRWFjaChlID0+IHtcbiAgICBpZiAoZS5vdXRjb21lID09PSAncGVuZGluZycpIHsgZS5vdXRjb21lID0gJ2lnbm9yZSc7IGF1ZGl0LnB1c2goZSk7IH1cbiAgfSk7XG4gIHNwZWxsQXVkaXQgPSBhdWRpdDtcblxuICBjb25zdCBsb2FkaW5nTXNnID0gYXBwZW5kTG9hZGluZ01lc3NhZ2UoJ1NhdmluZyBzcGVsbCBjaGVjayBkZWNpc2lvbnNcdTIwMjYnKTtcbiAgc2V0TG9hZGluZyh0cnVlLCAnU2F2aW5nIHNwZWxsLWNoZWNrIGRlY2lzaW9uc1x1MjAyNicpO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9zcGVsbC1jaGVjay1jb21wbGV0ZScsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHNwZWxsX2F1ZGl0OiBzcGVsbEF1ZGl0IH0pXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgcmVtb3ZlTG9hZGluZ01lc3NhZ2UobG9hZGluZ01zZyk7XG4gICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgaWYgKCFyZXMub2spIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCBgRmFpbGVkIHRvIHNhdmUgc3BlbGwgY2hlY2s6ICR7ZGF0YS5lcnJvciB8fCAnVW5rbm93biBlcnJvcid9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN0YXRlTWFuYWdlci5tYXJrQ29udGVudENoYW5nZWQoKTtcbiAgICBjb25zdCBwcm9jZWVkID0gYXdhaXQgX2NvbmZpcm1Qcm9jZWVkVG9HZW5lcmF0ZSgpO1xuICAgIGlmICghcHJvY2VlZCkgcmV0dXJuO1xuICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIGBcdTI3MDUgU3BlbGwgY2hlY2sgY29tcGxldGUgXHUyMDE0ICR7c3BlbGxBdWRpdC5sZW5ndGh9IGl0ZW0ke3NwZWxsQXVkaXQubGVuZ3RoICE9PSAxID8gJ3MnIDogJyd9IHJldmlld2VkLiBHZW5lcmF0aW5nIHlvdXIgQ1ZcdTIwMjZgKTtcbiAgICBzY2hlZHVsZUF0c1JlZnJlc2goJ3Jldmlld19jaGVja3BvaW50Jyk7XG4gICAgYXdhaXQgZmV0Y2hTdGF0dXMoKTtcbiAgICBhd2FpdCBzZW5kQWN0aW9uKCdnZW5lcmF0ZV9jdicpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZW1vdmVMb2FkaW5nTWVzc2FnZShsb2FkaW5nTXNnKTtcbiAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgYFNwZWxsIGNoZWNrIGVycm9yOiAke2Vyci5tZXNzYWdlfWApO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFeHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5leHBvcnQge1xuICBzcGVsbEF1ZGl0LFxuICBwb3B1bGF0ZVNwZWxsQ2hlY2tUYWIsXG4gIHJlbmRlclNwZWxsQ2hlY2taZXJvU3RhdGUsXG4gIHN1Ym1pdEVtcHR5U3BlbGxDaGVjayxcbiAgYnVpbGRTcGVsbFN0YXRzU3VtbWFyeSxcbiAgcmVuZGVyU3BlbGxTdWdnZXN0aW9ucyxcbiAgYXBwbHlDdXN0b21TcGVsbENvcnJlY3Rpb24sXG4gIGFwcGx5U3BlbGxSZXBsYWNlbWVudCxcbiAgZGlzbWlzc1NwZWxsU3VnZ2VzdGlvbixcbiAgYWRkU3BlbGxXb3JkLFxuICBzdWJtaXRTcGVsbENoZWNrRGVjaXNpb25zLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL2Rvd25sb2FkLXRhYi5qc1xuICogRmlsZSBSZXZpZXcgdGFiOiBBVFMgdmFsaWRhdGlvbiwgZ2VuZXJhdGVkLWZpbGUgZG93bmxvYWRzLCBwZXJzdWFzaW9uIGNoZWNrLFxuICogYW5kIHJlZmluZW1lbnQgc2hvcnRjdXRzLlxuICpcbiAqIERlcGVuZGVuY2llcyAocmVzb2x2ZWQgdGhyb3VnaCBnbG9iYWxUaGlzIGF0IHJ1bnRpbWUpOlxuICogICBlc2NhcGVIdG1sLCBiYWNrVG9QaGFzZVxuICovXG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmNvbnN0IGxvZyA9IGdldExvZ2dlcignZG93bmxvYWQtdGFiJyk7XG5cbmltcG9ydCB7IHN0YXRlTWFuYWdlciB9IGZyb20gJy4vc3RhdGUtbWFuYWdlci5qcyc7XG5cbmZ1bmN0aW9uIF9jb2xsZWN0RG93bmxvYWRhYmxlRmlsZXMoY3ZEYXRhID0ge30pIHtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQoKTtcbiAgY29uc3QgZmlsZXMgPSBbXTtcbiAgY29uc3QgcmF3RmlsZXMgPSBBcnJheS5pc0FycmF5KGN2RGF0YS5maWxlcykgPyBjdkRhdGEuZmlsZXMgOiBbXTtcbiAgY29uc3QgY2FuZGlkYXRlRmlsZXMgPSBbXG4gICAgLi4ucmF3RmlsZXMsXG4gICAgY3ZEYXRhLmZpbmFsX2h0bWwsXG4gICAgY3ZEYXRhLmZpbmFsX3BkZixcbiAgICBjdkRhdGEuaHRtbCxcbiAgICBjdkRhdGEucGRmLFxuICAgIGN2RGF0YS5kb2N4LFxuICAgIGN2RGF0YS5hdHNfZG9jeCxcbiAgXS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiBjYW5kaWRhdGVGaWxlcykge1xuICAgIGlmIChzZWVuLmhhcyhmaWxlbmFtZSkpIGNvbnRpbnVlO1xuICAgIHNlZW4uYWRkKGZpbGVuYW1lKTtcblxuICAgIGxldCBpY29uID0gJ1x1RDgzRFx1RENDMSc7XG4gICAgbGV0IGRlc2NyaXB0aW9uID0gJ0dlbmVyYXRlZCBmaWxlJztcbiAgICBsZXQgZm9ybWF0ID0gJ290aGVyJztcblxuICAgIGlmIChmaWxlbmFtZS5lbmRzV2l0aCgnLnBkZicpKSB7XG4gICAgICBpY29uID0gZmlsZW5hbWUuaW5jbHVkZXMoJ0FUUycpID8gJ1x1RDgzRVx1REQxNicgOiAnXHVEODNEXHVEQ0M0JztcbiAgICAgIGRlc2NyaXB0aW9uID0gZmlsZW5hbWUuaW5jbHVkZXMoJ0FUUycpXG4gICAgICAgID8gJ0FUUy1vcHRpbWlzZWQgUERGIFx1MjAxNCBtYWNoaW5lLXJlYWRhYmxlIGZvciBhdXRvbWF0ZWQgc2NyZWVuaW5nJ1xuICAgICAgICA6ICdIdW1hbi1yZWFkYWJsZSBQREYgXHUyMDE0IGZvciBodW1hbiByZXZpZXdlcnMgYW5kIHByaW50aW5nJztcbiAgICAgIGZvcm1hdCA9ICdwZGYnO1xuICAgIH0gZWxzZSBpZiAoZmlsZW5hbWUuZW5kc1dpdGgoJy5kb2N4JykpIHtcbiAgICAgIGljb24gPSAnXHVEODNEXHVEQ0REJztcbiAgICAgIGlmIChmaWxlbmFtZS5zdGFydHNXaXRoKCdDb3ZlckxldHRlcl8nKSkge1xuICAgICAgICBkZXNjcmlwdGlvbiA9ICdDb3ZlciBsZXR0ZXIgXHUyMDE0IFdvcmQgZG9jdW1lbnQgZm9yIHRoZSBhcHBsaWNhdGlvbic7XG4gICAgICB9IGVsc2UgaWYgKGZpbGVuYW1lLnN0YXJ0c1dpdGgoJ1NjcmVlbmluZ18nKSkge1xuICAgICAgICBkZXNjcmlwdGlvbiA9ICdTY3JlZW5pbmcgcXVlc3Rpb24gcmVzcG9uc2VzIFx1MjAxNCBXb3JkIGRvY3VtZW50JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlc2NyaXB0aW9uID0gZmlsZW5hbWUuaW5jbHVkZXMoJ0FUUycpXG4gICAgICAgICAgPyAnQVRTLW9wdGltaXNlZCBXb3JkIGRvY3VtZW50IFx1MjAxNCBrZXl3b3JkLW9wdGltaXNlZCBmb3Igam9iIGFwcGxpY2F0aW9ucydcbiAgICAgICAgICA6ICdIdW1hbi1yZWFkYWJsZSBXb3JkIGRvY3VtZW50IFx1MjAxNCBlZGl0YWJsZSBmb3JtYXQnO1xuICAgICAgfVxuICAgICAgZm9ybWF0ID0gJ2RvY3gnO1xuICAgIH0gZWxzZSBpZiAoZmlsZW5hbWUuZW5kc1dpdGgoJy5odG1sJykpIHtcbiAgICAgIGljb24gPSAnXHVEODNDXHVERjEwJztcbiAgICAgIGNvbnN0IGlzUHJldmlldyA9IC9wcmV2aWV3L2kudGVzdChmaWxlbmFtZSk7XG4gICAgICBkZXNjcmlwdGlvbiA9IGlzUHJldmlld1xuICAgICAgICA/ICdMYXlvdXQgcHJldmlldyBcdTIwMTQgaW50ZXJtZWRpYXRlIHdvcmtpbmcgZmlsZSwgbm90IGZvciBzdWJtaXNzaW9uJ1xuICAgICAgICA6ICdIVE1MIGZvcm1hdCB3aXRoIGVtYmVkZGVkIEpTT04tTEQgc3RydWN0dXJlZCBkYXRhJztcbiAgICAgIGZvcm1hdCA9IGlzUHJldmlldyA/ICdwcmV2aWV3JyA6ICdodG1sJztcbiAgICB9IGVsc2UgaWYgKGZpbGVuYW1lID09PSAnam9iX2Rlc2NyaXB0aW9uLnR4dCcpIHtcbiAgICAgIGljb24gPSAnXHVEODNEXHVEQ0NCJztcbiAgICAgIGRlc2NyaXB0aW9uID0gJ09yaWdpbmFsIGpvYiBkZXNjcmlwdGlvbiByZWZlcmVuY2UnO1xuICAgIH1cblxuICAgIGZpbGVzLnB1c2goeyBmaWxlbmFtZSwgZGVzY3JpcHRpb24sIGljb24sIGZvcm1hdCB9KTtcbiAgfVxuXG4gIHJldHVybiBmaWxlcztcbn1cblxuZnVuY3Rpb24gX3JlbmRlclZhbGlkYXRpb25TdW1tYXJ5KGNoZWNrcywgc3VtbWFyeSwgcGFnZUNvdW50LCBhdHNFcnJvcikge1xuICBsZXQgaHRtbCA9ICcnO1xuXG4gIGlmIChwYWdlQ291bnQgIT09IG51bGwpIHtcbiAgICBjb25zdCBwYWdlV2FybmluZyA9IHBhZ2VDb3VudCA8IDEuNSB8fCBwYWdlQ291bnQgPiAzO1xuICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJkaXNwbGF5OmlubGluZS1mbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6OHB4O1xuICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiR7cGFnZVdhcm5pbmcgPyAnI2ZlZjljMycgOiAnI2YwZmRmNCd9O1xuICAgICAgICAgICAgICBib3JkZXI6MXB4IHNvbGlkICR7cGFnZVdhcm5pbmcgPyAnI2ZkZTA0NycgOiAnI2JiZjdkMCd9O1xuICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjhweCAxNHB4O21hcmdpbi1ib3R0b206MTZweDtcIj5cbiAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjEuM2VtO1wiPlx1RDgzRFx1RENDNDwvc3Bhbj5cbiAgICAgIDxzdHJvbmc+JHtwYWdlQ291bnR9IHBhZ2Uke3BhZ2VDb3VudCAhPT0gMSA/ICdzJyA6ICcnfTwvc3Ryb25nPlxuICAgICAgJHtwYWdlV2FybmluZ1xuICAgICAgICA/ICc8c3BhbiBzdHlsZT1cImNvbG9yOiNkOTc3MDY7Zm9udC1zaXplOjAuODhlbTtcIj5cdTI2QTAgU2VuaW9yIGNhbmRpZGF0ZSB0YXJnZXQgaXMgMlx1MjAxMzMgcGFnZXM8L3NwYW4+J1xuICAgICAgICA6ICc8c3BhbiBzdHlsZT1cImNvbG9yOiMxNjY1MzQ7Zm9udC1zaXplOjAuODhlbTtcIj5cdTI3MTMgR29vZCBsZW5ndGg8L3NwYW4+J31cbiAgICA8L2Rpdj5gO1xuICB9XG5cbiAgaWYgKGF0c0Vycm9yKSB7XG4gICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2ZlZTJlMjtib3JkZXI6MXB4IHNvbGlkICNmY2E1YTU7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzoxMnB4IDE2cHg7bWFyZ2luLWJvdHRvbToyMHB4O1wiPlxuICAgICAgPHN0cm9uZz5cdTI2QTAgQVRTIHZhbGlkYXRpb24gZXJyb3I6PC9zdHJvbmc+ICR7ZXNjYXBlSHRtbChhdHNFcnJvcil9XG4gICAgPC9kaXY+YDtcbiAgICByZXR1cm4gaHRtbDtcbiAgfVxuXG4gIGlmICghY2hlY2tzLmxlbmd0aCkge1xuICAgIHJldHVybiBodG1sO1xuICB9XG5cbiAgY29uc3Qga2V5d29yZEZhaWwgPSBjaGVja3Muc29tZSgoY2hlY2spID0+IGNoZWNrLm5hbWUgPT09ICdhdHNfa2V5d29yZF9wcmVzZW5jZScgJiYgY2hlY2suc3RhdHVzID09PSAnZmFpbCcpO1xuICBjb25zdCBzdGF0dXNDb2xvdXIgPSBzdW1tYXJ5LmZhaWwgPiAwID8gJyNkYzI2MjYnIDogc3VtbWFyeS53YXJuID4gMCA/ICcjZDk3NzA2JyA6ICcjMTY2NTM0JztcbiAgY29uc3Qgc3RhdHVzSWNvbiA9IHN1bW1hcnkuZmFpbCA+IDAgPyAnXHUyNzRDJyA6IHN1bW1hcnkud2FybiA+IDAgPyAnXHUyNkEwJyA6ICdcdTI3MDUnO1xuXG4gIGh0bWwgKz0gYFxuICAgIDxkZXRhaWxzIG9wZW4gc3R5bGU9XCJtYXJnaW4tYm90dG9tOjIwcHg7XCI+XG4gICAgICA8c3VtbWFyeSBzdHlsZT1cImN1cnNvcjpwb2ludGVyO2ZvbnQtd2VpZ2h0OjcwMDtmb250LXNpemU6MWVtO3BhZGRpbmc6OHB4IDA7Y29sb3I6JHtzdGF0dXNDb2xvdXJ9O1wiPlxuICAgICAgICAke3N0YXR1c0ljb259IEFUUyBSZXBvcnQgXHUyMDE0ICR7c3VtbWFyeS5wYXNzfSBwYXNzLCAke3N1bW1hcnkud2Fybn0gd2FybiwgJHtzdW1tYXJ5LmZhaWx9IGZhaWxcbiAgICAgIDwvc3VtbWFyeT5cbiAgICAgIDx0YWJsZSBjbGFzcz1cInJldmlldy10YWJsZVwiIHN0eWxlPVwibWFyZ2luLXRvcDoxMHB4O2ZvbnQtc2l6ZTowLjg3ZW07XCI+XG4gICAgICAgIDx0aGVhZD48dHI+PHRoPkNoZWNrPC90aD48dGg+Rm9ybWF0PC90aD48dGg+U3RhdHVzPC90aD48dGg+RGV0YWlsPC90aD48L3RyPjwvdGhlYWQ+XG4gICAgICAgIDx0Ym9keT5gO1xuXG4gIGZvciAoY29uc3QgY2hlY2sgb2YgY2hlY2tzKSB7XG4gICAgY29uc3QgYmFja2dyb3VuZCA9IGNoZWNrLnN0YXR1cyA9PT0gJ3Bhc3MnID8gJyNmMGZkZjQnIDogY2hlY2suc3RhdHVzID09PSAnd2FybicgPyAnI2ZlZjljMycgOiAnI2ZlZTJlMic7XG4gICAgY29uc3QgaWNvbiA9IGNoZWNrLnN0YXR1cyA9PT0gJ3Bhc3MnID8gJ1x1MjcwNScgOiBjaGVjay5zdGF0dXMgPT09ICd3YXJuJyA/ICdcdTI2QTAnIDogJ1x1Mjc0Qyc7XG4gICAgY29uc3QgZm9ybWF0QmFkZ2UgPSBgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MTFweDtiYWNrZ3JvdW5kOiNlMGU3ZmY7Y29sb3I6IzM3MzBhMztib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjFweCA1cHg7XCI+JHtlc2NhcGVIdG1sKGNoZWNrLmZvcm1hdCl9PC9zcGFuPmA7XG5cbiAgICBodG1sICs9IGA8dHIgc3R5bGU9XCJiYWNrZ3JvdW5kOiR7YmFja2dyb3VuZH07XCI+XG4gICAgICA8dGQgc3R5bGU9XCJmb250LXdlaWdodDo2MDA7XCI+JHtlc2NhcGVIdG1sKGNoZWNrLmxhYmVsKX08L3RkPlxuICAgICAgPHRkPiR7Zm9ybWF0QmFkZ2V9PC90ZD5cbiAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO1wiPiR7aWNvbn08L3RkPlxuICAgICAgPHRkPjxzbWFsbD4ke2VzY2FwZUh0bWwoY2hlY2suZGV0YWlsKX08L3NtYWxsPjwvdGQ+XG4gICAgPC90cj5gO1xuICB9XG5cbiAgaHRtbCArPSAnPC90Ym9keT48L3RhYmxlPjwvZGV0YWlscz4nO1xuXG4gIGlmIChzdW1tYXJ5LmZhaWwgPiAwKSB7XG4gICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2ZlZTJlMjtib3JkZXI6MXB4IHNvbGlkICNmY2E1YTU7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzoxMHB4IDE2cHg7bWFyZ2luLWJvdHRvbToyMHB4O1wiPlxuICAgICAgPHN0cm9uZz5cdTI3NEMgRml4IHJlcXVpcmVkOjwvc3Ryb25nPiBTb21lIGNoZWNrcyBmYWlsZWQuIEJsb2NrZWQgZm9ybWF0cyBhcmUgZ3JleWVkIG91dCBiZWxvdy5cbiAgICAgICR7a2V5d29yZEZhaWxcbiAgICAgICAgPyAnPGJyPjxzdHJvbmc+QVRTIGtleXdvcmQgZmFpbHVyZSBibG9ja3MgYWxsIGRvd25sb2Fkczwvc3Ryb25nPiBcdTIwMTQgcmUtcnVuIGN1c3RvbWlzYXRpb25zIHRvIGltcHJvdmUga2V5d29yZCBjb3ZlcmFnZS4nXG4gICAgICAgIDogJyd9XG4gICAgPC9kaXY+YDtcbiAgfVxuXG4gIHJldHVybiBodG1sO1xufVxuXG4vLyBDaGVja3MgdGhhdCBhcmUgYWR2aXNvcnkgb25seSBcdTIwMTQgdGhleSB3YXJuIGJ1dCBuZXZlciBibG9jayB0aGUgZG93bmxvYWQgYnV0dG9uLlxuLy8gT25seSBnZW51aW5lbHkgY3JpdGljYWwgZmFpbHVyZXMgKGZpbGUgbm90IGZvdW5kLCBQREYgdW5yZWFkYWJsZSwgYnJva2VuIG91dHB1dClcbi8vIHNob3VsZCBwcmV2ZW50IGEgdXNlciBmcm9tIGRvd25sb2FkaW5nLlxuY29uc3QgX05PTl9CTE9DS0lOR19DSEVDS1MgPSBuZXcgU2V0KFtcbiAgJ2N2X3BhZ2VfY291bnQnLCAgICAgICAgICAgICAgIC8vIGFkdmlzb3J5OiBwYWdlIGxlbmd0aCBvdXRzaWRlIGlkZWFsIHJhbmdlXG4gICdwZGZfdXNfbGV0dGVyJywgICAgICAgICAgICAgICAvLyBhZHZpc29yeTogcGFnZSBzaXplXG4gICdkb2N4X3plcm9fc2hhcGVzJywgICAgICAgICAgICAvLyBhZHZpc29yeTogQVRTIGZvcm1hdHRpbmcgaGludFxuICAnZG9jeF9zdGFuZGFyZF9oZWFkaW5ncycsICAgICAgLy8gYWR2aXNvcnk6IEFUUyBoZWFkaW5nIHRleHRcbiAgJ2RvY3hfaGVhZGluZzFfcHJlc2VudCcsICAgICAgIC8vIGFkdmlzb3J5OiBBVFMgaGVhZGluZyBzdHlsZVxuICAnZG9jeF9kYXRlX2Zvcm1hdF9jb25zaXN0ZW50JywgLy8gYWR2aXNvcnk6IGRhdGUgZm9ybWF0IGNvbnNpc3RlbmN5XG4gICdkb2N4X3B1YmxpY2F0aW9uc19oZWFkaW5nJywgICAvLyBhZHZpc29yeTogcHVibGljYXRpb25zIGhlYWRpbmcgdGV4dFxuICAnaHRtbF9qc29ubGRfdmFsaWRfcGVyc29uJywgICAgLy8gYWR2aXNvcnk6IEpTT04tTEQgc2NoZW1hIHR5cGVcbiAgJ2h0bWxfanNvbmxkX2tub3dzX2Fib3V0JywgICAgIC8vIGFkdmlzb3J5OiBKU09OLUxEIHNraWxscyBwb3B1bGF0aW9uXG5dKTtcblxuZnVuY3Rpb24gX3JlbmRlckRvd25sb2FkR3JpZChmaWxlcywgY2hlY2tzLCBzdW1tYXJ5LCBnZW5lcmF0ZWRBdCA9IG51bGwsIGdlbmVyYXRpb25SdW4gPSBudWxsKSB7XG4gIGNvbnN0IGtleXdvcmRGYWlsID0gY2hlY2tzLnNvbWUoKGNoZWNrKSA9PiBjaGVjay5uYW1lID09PSAnYXRzX2tleXdvcmRfcHJlc2VuY2UnICYmIGNoZWNrLnN0YXR1cyA9PT0gJ2ZhaWwnKTtcbiAgY29uc3QgaXNDcml0aWNhbEZhaWwgPSAoY2hlY2spID0+IGNoZWNrLnN0YXR1cyA9PT0gJ2ZhaWwnICYmICFfTk9OX0JMT0NLSU5HX0NIRUNLUy5oYXMoY2hlY2submFtZSk7XG4gIGNvbnN0IGJsb2NrRG9jeCA9IGtleXdvcmRGYWlsIHx8IGNoZWNrcy5zb21lKChjaGVjaykgPT4gY2hlY2suZm9ybWF0ID09PSAnZG9jeCcgJiYgaXNDcml0aWNhbEZhaWwoY2hlY2spKTtcbiAgY29uc3QgYmxvY2tIdG1sID0ga2V5d29yZEZhaWwgfHwgY2hlY2tzLnNvbWUoKGNoZWNrKSA9PiBjaGVjay5mb3JtYXQgPT09ICdodG1sJyAmJiBpc0NyaXRpY2FsRmFpbChjaGVjaykpO1xuICBjb25zdCBibG9ja1BkZiAgPSBrZXl3b3JkRmFpbCB8fCBjaGVja3Muc29tZSgoY2hlY2spID0+IGNoZWNrLmZvcm1hdCA9PT0gJ3BkZicgICYmIGlzQ3JpdGljYWxGYWlsKGNoZWNrKSk7XG5cbiAgbGV0IGdlbmVyYXRlZExhYmVsID0gJyc7XG4gIGlmIChnZW5lcmF0ZWRBdCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkID0gbmV3IERhdGUoZ2VuZXJhdGVkQXQpO1xuICAgICAgY29uc3QgZGF0ZVN0ciA9IGQudG9Mb2NhbGVTdHJpbmcoJ2VuLVVTJywge1xuICAgICAgICBtb250aDogJ3Nob3J0JywgZGF5OiAnbnVtZXJpYycsIHllYXI6ICdudW1lcmljJyxcbiAgICAgICAgaG91cjogJ251bWVyaWMnLCBtaW51dGU6ICcyLWRpZ2l0JyxcbiAgICAgIH0pO1xuICAgICAgZ2VuZXJhdGVkTGFiZWwgPSAoZ2VuZXJhdGlvblJ1biAmJiBnZW5lcmF0aW9uUnVuID4gMSlcbiAgICAgICAgPyBgUnVuICMke2dlbmVyYXRpb25SdW59IFx1MjAxNCAke2RhdGVTdHJ9YFxuICAgICAgICA6IGRhdGVTdHI7XG4gICAgfSBjYXRjaCAoXykgeyAvKiBpZ25vcmUgKi8gfVxuICB9XG5cbiAgbGV0IGh0bWwgPSAnPGRpdiBjbGFzcz1cImRvd25sb2FkLXNlY3Rpb25cIj48ZGl2IGNsYXNzPVwiZG93bmxvYWQtZ3JpZFwiPic7XG4gIGlmICghZmlsZXMubGVuZ3RoKSB7XG4gICAgaHRtbCArPSAnPHA+Tm8gZG93bmxvYWRhYmxlIGZpbGVzIGZvdW5kLiBQbGVhc2UgdHJ5IGdlbmVyYXRpbmcgeW91ciBDViBhZ2Fpbi48L3A+JztcbiAgICBodG1sICs9ICc8L2Rpdj48L2Rpdj4nO1xuICAgIHJldHVybiBodG1sO1xuICB9XG5cbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgY29uc3QgYmxvY2tlZCA9IChmaWxlLmZvcm1hdCA9PT0gJ2RvY3gnICYmIGJsb2NrRG9jeClcbiAgICAgIHx8IChmaWxlLmZvcm1hdCA9PT0gJ2h0bWwnICYmIGJsb2NrSHRtbClcbiAgICAgIHx8IChmaWxlLmZvcm1hdCA9PT0gJ3BkZicgJiYgYmxvY2tQZGYpO1xuICAgIGNvbnN0IGJsb2NrZWRTdHlsZSA9IGJsb2NrZWRcbiAgICAgID8gJ2N1cnNvcjpub3QtYWxsb3dlZDtvcGFjaXR5OjAuNDtiYWNrZ3JvdW5kOiM5Y2EzYWY7Ym9yZGVyLWNvbG9yOiM5Y2EzYWY7J1xuICAgICAgOiAnJztcbiAgICBjb25zdCBibG9ja2VkTWVzc2FnZSA9IGJsb2NrZWRcbiAgICAgID8gJzxkaXYgc3R5bGU9XCJmb250LXNpemU6MC43OGVtO2NvbG9yOiNkYzI2MjY7bWFyZ2luLXRvcDo0cHg7XCI+XHUyNkQ0IEJsb2NrZWQgXHUyMDE0IG91dHB1dCBmaWxlIGNvdWxkIG5vdCBiZSBnZW5lcmF0ZWQ8L2Rpdj4nXG4gICAgICA6ICcnO1xuICAgIGNvbnN0IHRpbWVzdGFtcExpbmUgPSBnZW5lcmF0ZWRMYWJlbFxuICAgICAgPyBgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjc1ZW07Y29sb3I6IzljYTNhZjttYXJnaW4tdG9wOjNweDtcIj5HZW5lcmF0ZWQgJHtnZW5lcmF0ZWRMYWJlbH08L2Rpdj5gXG4gICAgICA6ICc8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuNzVlbTtjb2xvcjojYzBjNGNjO21hcmdpbi10b3A6M3B4O1wiPk5vdCB5ZXQgZ2VuZXJhdGVkPC9kaXY+JztcblxuICAgIGNvbnN0IHByZXZpZXdCYWRnZSA9IGZpbGUuZm9ybWF0ID09PSAncHJldmlldydcbiAgICAgID8gJzxzcGFuIHN0eWxlPVwiZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luLWxlZnQ6NnB4O2ZvbnQtc2l6ZTowLjc1ZW07Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOiM5MjQwMGU7YmFja2dyb3VuZDojZmVmM2M3O2JvcmRlcjoxcHggc29saWQgI2ZjZDM0ZDtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjFweCA1cHg7dmVydGljYWwtYWxpZ246bWlkZGxlO1wiPldvcmtpbmcgZmlsZSBcdTIwMTQgbm90IGZvciBzdWJtaXNzaW9uPC9zcGFuPidcbiAgICAgIDogJyc7XG5cbiAgICBodG1sICs9IGBcbiAgICAgIDxkaXYgY2xhc3M9XCJkb3dubG9hZC1pdGVtXCIgc3R5bGU9XCIke2Jsb2NrZWQgPyAnb3BhY2l0eTowLjc1OycgOiAnJ30ke2ZpbGUuZm9ybWF0ID09PSAncHJldmlldycgPyAnYm9yZGVyLXN0eWxlOmRhc2hlZDsnIDogJyd9XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkb3dubG9hZC1pY29uXCI+JHtmaWxlLmljb259PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkb3dubG9hZC1pbmZvXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRvd25sb2FkLW5hbWVcIj4ke2VzY2FwZUh0bWwoZmlsZS5maWxlbmFtZSl9JHtwcmV2aWV3QmFkZ2V9PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRvd25sb2FkLWRlc2NyaXB0aW9uXCI+JHtlc2NhcGVIdG1sKGZpbGUuZGVzY3JpcHRpb24pfTwvZGl2PlxuICAgICAgICAgICR7dGltZXN0YW1wTGluZX1cbiAgICAgICAgICAke2Jsb2NrZWRNZXNzYWdlfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgJHtibG9ja2VkXG4gICAgICAgICAgPyBgPGJ1dHRvbiBjbGFzcz1cImJ0bi1kb3dubG9hZFwiIGRpc2FibGVkIHN0eWxlPVwiJHtibG9ja2VkU3R5bGV9XCI+QmxvY2tlZDwvYnV0dG9uPmBcbiAgICAgICAgICA6ICgoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IF9zaWQgPSB0eXBlb2YgZ2V0U2Vzc2lvbklkRnJvbVVSTCA9PT0gJ2Z1bmN0aW9uJyA/IGdldFNlc3Npb25JZEZyb21VUkwoKSA6IG51bGw7XG4gICAgICAgICAgICAgIGNvbnN0IF9zcCAgPSBfc2lkID8gYD9zZXNzaW9uX2lkPSR7ZW5jb2RlVVJJQ29tcG9uZW50KF9zaWQpfWAgOiAnJztcbiAgICAgICAgICAgICAgcmV0dXJuIGA8YSBocmVmPVwiL2FwaS9kb3dubG9hZC8ke2VuY29kZVVSSUNvbXBvbmVudChmaWxlLmZpbGVuYW1lKX0ke19zcH1cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuLWRvd25sb2FkIGRvd25sb2FkLWxpbmtcIiBkb3dubG9hZD1cIiR7ZXNjYXBlSHRtbChmaWxlLmZpbGVuYW1lKX1cIlxuICAgICAgICAgICAgICAgIHN0eWxlPVwidGV4dC1kZWNvcmF0aW9uOm5vbmU7ZGlzcGxheTppbmxpbmUtZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjtcIj5Eb3dubG9hZDwvYT5gO1xuICAgICAgICAgICAgfSkoKX1cbiAgICAgIDwvZGl2PmA7XG4gIH1cblxuICBodG1sICs9ICc8L2Rpdj48L2Rpdj4nO1xuICBpZiAoc3VtbWFyeS5mYWlsID4gMCAmJiBmaWxlcy5sZW5ndGgpIHtcbiAgICBodG1sICs9ICc8cCBzdHlsZT1cIm1hcmdpbi10b3A6MTJweDtjb2xvcjojNmI3MjgwO2ZvbnQtc2l6ZTowLjg4ZW07XCI+QmxvY2tlZCBmb3JtYXRzIHJlZmxlY3QgQVRTIHZhbGlkYXRpb24gZmFpbHVyZXMgZm9yIHRoZSBjb3JyZXNwb25kaW5nIG91dHB1dCB0eXBlcy48L3A+JztcbiAgfVxuICByZXR1cm4gaHRtbDtcbn1cblxuZnVuY3Rpb24gX3JlbmRlclJlZmluZW1lbnRQYW5lbCgpIHtcbiAgcmV0dXJuIGA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDoyNHB4O3BhZGRpbmc6MTZweDtiYWNrZ3JvdW5kOiNmOGZhZmM7Ym9yZGVyOjFweCBzb2xpZCAjZTJlOGYwO1xuICAgICAgICAgICAgYm9yZGVyLXJhZGl1czo4cHg7XCI+XG4gICAgPGRpdiBzdHlsZT1cImZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjEwcHg7Y29sb3I6IzM3NDE1MTtcIj5cdTIxQkIgSXRlcmF0aXZlIFJlZmluZW1lbnQ8L2Rpdj5cbiAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuOWVtO2NvbG9yOiM2YjcyODA7bWFyZ2luLWJvdHRvbToxMnB4O1wiPlxuICAgICAgR28gYmFjayB0byByZWZpbmUgYW4gZWFybGllciBzdGVwIFx1MjAxNCBhbGwgcHJpb3IgZGVjaXNpb25zIGFuZCBhcHByb3ZhbHMgYXJlIHByZXNlcnZlZC5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDoxMHB4O2ZsZXgtd3JhcDp3cmFwO1wiPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1zZWNvbmRhcnlcIiBvbmNsaWNrPVwiYmFja1RvUGhhc2UoJ2N1c3RvbWl6YXRpb25zJylcIiB0aXRsZT1cIlJldHVybiB0byBDdXN0b21pc2F0aW9ucyBzdGVwXCI+XG4gICAgICAgIFx1MjFCQiBSZWZpbmUgQ3VzdG9taXNhdGlvbnNcbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1zZWNvbmRhcnlcIiBvbmNsaWNrPVwiYmFja1RvUGhhc2UoJ3Jld3JpdGUnKVwiIHRpdGxlPVwiUmV0dXJuIHRvIFJld3JpdGUgUmV2aWV3IHN0ZXBcIj5cbiAgICAgICAgXHUyMUJCIFJlZmluZSBSZXdyaXRlc1xuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLXNlY29uZGFyeVwiIG9uY2xpY2s9XCJiYWNrVG9QaGFzZSgnYW5hbHlzaXMnKVwiIHRpdGxlPVwiUmV0dXJuIHRvIEFuYWx5c2lzIHN0ZXBcIj5cbiAgICAgICAgXHUyMUJCIFJlLWFuYWx5c2UgSm9iXG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gX2ZldGNoUGVyc3Vhc2lvbkh0bWwoKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9wZXJzdWFzaW9uLWNoZWNrJyk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICBpZiAoIXJlc3BvbnNlLm9rIHx8ICFkYXRhLm9rKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgY29uc3Qgc3VtbWFyeSA9IGRhdGEuc3VtbWFyeSB8fCB7IGZsYWdnZWQ6IDAsIHN0cm9uZ19jb3VudDogMCwgdG90YWxfYnVsbGV0czogMCB9O1xuICAgIGNvbnN0IGZpbmRpbmdzID0gQXJyYXkuaXNBcnJheShkYXRhLmZpbmRpbmdzKSA/IGRhdGEuZmluZGluZ3MgOiBbXTtcbiAgICBjb25zdCBzY29yZUNvbG9yID0gc3VtbWFyeS5mbGFnZ2VkID09PSAwID8gJyMxMGI5ODEnIDogc3VtbWFyeS5mbGFnZ2VkIDw9IDMgPyAnI2Y1OWUwYicgOiAnI2VmNDQ0NCc7XG4gICAgY29uc3Qgc2NvcmVMYWJlbCA9IHN1bW1hcnkuZmxhZ2dlZCA9PT0gMFxuICAgICAgPyAnRXhjZWxsZW50J1xuICAgICAgOiBzdW1tYXJ5LmZsYWdnZWQgPD0gM1xuICAgICAgICA/ICdHb29kIFx1MjAxNCBtaW5vciBpbXByb3ZlbWVudHMgcG9zc2libGUnXG4gICAgICAgIDogJ05lZWRzIGF0dGVudGlvbic7XG5cbiAgICBsZXQgaHRtbCA9IGA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDoyMHB4O2JvcmRlcjoxcHggc29saWQgI2UyZThmMDtib3JkZXItcmFkaXVzOjhweDtvdmVyZmxvdzpoaWRkZW47XCI+XG4gICAgICA8ZGl2IHN0eWxlPVwicGFkZGluZzoxNHB4IDE2cHg7YmFja2dyb3VuZDojZjhmYWZjO2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjthbGlnbi1pdGVtczpjZW50ZXI7Y3Vyc29yOnBvaW50ZXI7XCJcbiAgICAgICAgICAgb25jbGljaz1cInRoaXMubmV4dEVsZW1lbnRTaWJsaW5nLnN0eWxlLmRpc3BsYXk9dGhpcy5uZXh0RWxlbWVudFNpYmxpbmcuc3R5bGUuZGlzcGxheT09PSdub25lJz8nYmxvY2snOidub25lJ1wiPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC13ZWlnaHQ6NjAwO2NvbG9yOiMxZjI5Mzc7XCI+XHVEODNEXHVEQ0FBIEJ1bGxldCBQZXJzdWFzaXZlbmVzczwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cIm1hcmdpbi1sZWZ0OjEycHg7YmFja2dyb3VuZDoke3Njb3JlQ29sb3J9O2NvbG9yOiNmZmY7Ym9yZGVyLXJhZGl1czo0cHg7cGFkZGluZzoycHggOHB4O2ZvbnQtc2l6ZTowLjhlbTtcIj4ke3Njb3JlTGFiZWx9PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07Y29sb3I6IzZiNzI4MDtcIj5cbiAgICAgICAgICAke3N1bW1hcnkuc3Ryb25nX2NvdW50fS8ke3N1bW1hcnkudG90YWxfYnVsbGV0c30gc3Ryb25nIFx1MDBCNyAke3N1bW1hcnkuZmxhZ2dlZH0gZmxhZ2dlZCBcdTAwQjcgY2xpY2sgdG8gJHtzdW1tYXJ5LmZsYWdnZWQgPiAwID8gJ2V4cGFuZCcgOiAnY29sbGFwc2UnfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PmA7XG5cbiAgICBpZiAoZmluZGluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cInBhZGRpbmc6MTJweCAxNnB4O2Rpc3BsYXk6JHtzdW1tYXJ5LmZsYWdnZWQgPD0gMyA/ICdibG9jaycgOiAnbm9uZSd9O1wiPmA7XG4gICAgICBmb3IgKGNvbnN0IGZpbmRpbmcgb2YgZmluZGluZ3MpIHtcbiAgICAgICAgY29uc3Qgc2V2ZXJpdHkgPSBmaW5kaW5nLnNldmVyaXR5ID09PSAnd2FybmluZydcbiAgICAgICAgICA/IHsgYmFja2dyb3VuZDogJyNmZmY3ZWQnLCBib3JkZXI6ICcjZjU5ZTBiJywgbGFiZWw6ICdcdTI2QTAgV2FybmluZycgfVxuICAgICAgICAgIDogeyBiYWNrZ3JvdW5kOiAnI2YwZjlmZicsIGJvcmRlcjogJyMzYjgyZjYnLCBsYWJlbDogJ1x1MjEzOSBJbmZvJyB9O1xuICAgICAgICBjb25zdCB0cnVuY2F0ZWRUZXh0ID0gZmluZGluZy50ZXh0ICYmIGZpbmRpbmcudGV4dC5sZW5ndGggPiAxMjBcbiAgICAgICAgICA/IGAke2ZpbmRpbmcudGV4dC5zbGljZSgwLCAxMjApfVx1MjAyNmBcbiAgICAgICAgICA6IGZpbmRpbmcudGV4dCB8fCAnJztcbiAgICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTJweDtwYWRkaW5nOjEwcHggMTJweDtiYWNrZ3JvdW5kOiR7c2V2ZXJpdHkuYmFja2dyb3VuZH07Ym9yZGVyLWxlZnQ6M3B4IHNvbGlkICR7c2V2ZXJpdHkuYm9yZGVyfTtib3JkZXItcmFkaXVzOjAgNnB4IDZweCAwO1wiPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC44ZW07Y29sb3I6IzZiNzI4MDttYXJnaW4tYm90dG9tOjRweDtcIj5cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiYmFja2dyb3VuZDoke3NldmVyaXR5LmJvcmRlcn07Y29sb3I6I2ZmZjtib3JkZXItcmFkaXVzOjNweDtwYWRkaW5nOjFweCA2cHg7Zm9udC1zaXplOjAuOWVtO1wiPiR7c2V2ZXJpdHkubGFiZWx9PC9zcGFuPlxuICAgICAgICAgICAgQnVsbGV0ICR7KGZpbmRpbmcuYnVsbGV0X2luZGV4ID8/IDApICsgMX0ke2ZpbmRpbmcuZXhwX2lkID8gYCBcdTAwQjcgJHtlc2NhcGVIdG1sKGZpbmRpbmcuZXhwX2lkKX1gIDogJyd9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjllbTtjb2xvcjojMzc0MTUxO21hcmdpbi1ib3R0b206NnB4O1wiPlwiJHtlc2NhcGVIdG1sKHRydW5jYXRlZFRleHQpfVwiPC9kaXY+XG4gICAgICAgICAgPHVsIHN0eWxlPVwibWFyZ2luOjA7cGFkZGluZy1sZWZ0OjE4cHg7XCI+YDtcbiAgICAgICAgZm9yIChjb25zdCBpc3N1ZSBvZiBmaW5kaW5nLmlzc3VlcyB8fCBbXSkge1xuICAgICAgICAgIGh0bWwgKz0gYDxsaSBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07Y29sb3I6IzZiNzI4MDttYXJnaW4tYm90dG9tOjJweDtcIj4ke2VzY2FwZUh0bWwoaXNzdWUuc3VnZ2VzdGlvbil9PC9saT5gO1xuICAgICAgICB9XG4gICAgICAgIGh0bWwgKz0gJzwvdWw+PC9kaXY+JztcbiAgICAgIH1cbiAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgfSBlbHNlIHtcbiAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJwYWRkaW5nOjEycHggMTZweDtjb2xvcjojMTBiOTgxO2ZvbnQtc2l6ZTowLjllbTtcIj5BbGwgYnVsbGV0cyBtZWV0IHBlcnN1YXNpdmVuZXNzIGNyaXRlcmlhLjwvZGl2Pic7XG4gICAgfVxuXG4gICAgLy8gTmFycmF0aXZlLXRocmVhZCBhZHZpc29yeSAoR0FQLTI4MSlcbiAgICBjb25zdCBudGEgPSBzdW1tYXJ5Lm5hcnJhdGl2ZV90aHJlYWRfYWR2aXNvcnk7XG4gICAgaWYgKG50YSkge1xuICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cInBhZGRpbmc6MTBweCAxNnB4O2JhY2tncm91bmQ6I2ZlZjljMztib3JkZXItdG9wOjFweCBzb2xpZCAjZmRlNjhhO1wiPlxuICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtd2VpZ2h0OjYwMDtjb2xvcjojOTI0MDBlO1wiPlx1RDgzRVx1RERGNSBOYXJyYXRpdmUgZm9jdXMgYWR2aXNvcnk6PC9zcGFuPlxuICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjllbTtjb2xvcjojNzgzNTBmO21hcmdpbi1sZWZ0OjZweDtcIj4ke2VzY2FwZUh0bWwobnRhLmRldGFpbCl9PC9zcGFuPlxuICAgICAgPC9kaXY+YDtcbiAgICB9XG5cbiAgICAvLyBOYXJyYXRpdmUtYXJjIGFkdmlzb3J5IChHQVAtMTcpOiByZWNlbnQgcm9sZSBzaG91bGQgc2hvdyBzdHJvbmdlc3QgdmVyYnNcbiAgICBjb25zdCBuYWEgPSBzdW1tYXJ5Lm5hcnJhdGl2ZV9hcmNfYWR2aXNvcnk7XG4gICAgaWYgKG5hYSkge1xuICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cInBhZGRpbmc6MTBweCAxNnB4O2JhY2tncm91bmQ6I2ZmZjdlZDtib3JkZXItdG9wOjFweCBzb2xpZCAjZmVkN2FhO1wiPlxuICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtd2VpZ2h0OjYwMDtjb2xvcjojOWEzNDEyO1wiPlx1RDgzRFx1RENDOCBOYXJyYXRpdmUgYXJjIGFkdmlzb3J5Ojwvc3Bhbj5cbiAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC45ZW07Y29sb3I6IzdjMmQxMjttYXJnaW4tbGVmdDo2cHg7XCI+JHtlc2NhcGVIdG1sKG5hYS5kZXRhaWwpfTwvc3Bhbj5cbiAgICAgIDwvZGl2PmA7XG4gICAgfVxuXG4gICAgaHRtbCArPSAnPC9kaXY+JztcbiAgICByZXR1cm4gaHRtbDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cud2FybignUGVyc3Vhc2lvbiBjaGVjayBmYWlsZWQ6JywgZXJyb3IpO1xuICAgIHJldHVybiAnJztcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBwb3B1bGF0ZURvd25sb2FkVGFiKGN2RGF0YSkge1xuICBzdGF0ZU1hbmFnZXIuc2V0VGFiRGF0YSgnY3YnLCBjdkRhdGEpO1xuXG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9jdW1lbnQtY29udGVudCcpO1xuICBpZiAoIWNvbnRlbnQpIHJldHVybjtcblxuICBpZiAoIWN2RGF0YSB8fCAodHlwZW9mIGN2RGF0YSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMoY3ZEYXRhKS5sZW5ndGggPT09IDApKSB7XG4gICAgY29udGVudC5pbm5lckhUTUwgPSAnPGgxPlx1MkIwN1x1RkUwRiBEb3dubG9hZCBHZW5lcmF0ZWQgRmlsZXM8L2gxPjxkaXYgY2xhc3M9XCJlbXB0eS1zdGF0ZVwiPjxkaXYgY2xhc3M9XCJpY29uXCI+XHUyQjA3XHVGRTBGPC9kaXY+PGgzPk5vIEZpbGVzIEF2YWlsYWJsZTwvaDM+PHA+R2VuZXJhdGUgYSBDViBmaXJzdCB0byBzZWUgZG93bmxvYWQgb3B0aW9ucy48L3A+PC9kaXY+JztcbiAgICByZXR1cm47XG4gIH1cblxuICBjb250ZW50LmlubmVySFRNTCA9ICc8aDE+XHUyQjA3XHVGRTBGIERvd25sb2FkIEdlbmVyYXRlZCBGaWxlczwvaDE+PHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO21hcmdpbi1ib3R0b206MTZweDtcIj5SdW5uaW5nIEFUUyB2YWxpZGF0aW9uXHUyMDI2PC9wPic7XG5cbiAgbGV0IGNoZWNrcyA9IFtdO1xuICBsZXQgcGFnZUNvdW50ID0gbnVsbDtcbiAgbGV0IHN1bW1hcnkgPSB7IHBhc3M6IDAsIHdhcm46IDAsIGZhaWw6IDAgfTtcbiAgbGV0IGF0c0Vycm9yID0gbnVsbDtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL2F0cy12YWxpZGF0ZScpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgaWYgKGRhdGEub2spIHtcbiAgICAgIGNoZWNrcyA9IGRhdGEuY2hlY2tzIHx8IFtdO1xuICAgICAgcGFnZUNvdW50ID0gZGF0YS5wYWdlX2NvdW50ID8/IG51bGw7XG4gICAgICBzdW1tYXJ5ID0gZGF0YS5zdW1tYXJ5IHx8IHN1bW1hcnk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF0c0Vycm9yID0gZGF0YS5lcnJvciB8fCAnVmFsaWRhdGlvbiBmYWlsZWQnO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBhdHNFcnJvciA9IGBOZXR3b3JrIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YDtcbiAgfVxuXG4gIGNvbnN0IGZpbGVzID0gX2NvbGxlY3REb3dubG9hZGFibGVGaWxlcyhjdkRhdGEpO1xuICBsZXQgaHRtbCA9ICc8aDE+XHUyQjA3XHVGRTBGIEZpbGUgUmV2aWV3PC9oMT4nO1xuICBodG1sICs9ICc8cCBzdHlsZT1cImZvbnQtc2l6ZTowLjgzZW07Y29sb3I6Izk0YTNiODttYXJnaW4tYm90dG9tOjE2cHg7cGFkZGluZzo4cHggMTJweDtiYWNrZ3JvdW5kOiNmOGZhZmM7Ym9yZGVyLXJhZGl1czo2cHg7Ym9yZGVyLWxlZnQ6M3B4IHNvbGlkICNlMmU4ZjA7XCI+XHUyNzA1IDxlbT5UaGlzIGlzIHRoZSA8c3Ryb25nPmNvbXBsZXRlbmVzcyBjaGVjazwvc3Ryb25nPiBzdGVwIFx1MjAxNCBBVFMgdmFsaWRhdGlvbiBydW5zIGhlcmUgYW5kIHlvdSBjYW4gYXJjaGl2ZSB0aGUgYXBwbGljYXRpb24uIFRvIGRvd25sb2FkIGZpbGVzIGltbWVkaWF0ZWx5IGFmdGVyIGdlbmVyYXRpb24sIHVzZSB0aGUgPHN0cm9uZz5HZW5lcmF0ZWQgRmlsZXM8L3N0cm9uZz4gdGFiLjwvZW0+PC9wPic7XG4gIGh0bWwgKz0gX3JlbmRlclZhbGlkYXRpb25TdW1tYXJ5KGNoZWNrcywgc3VtbWFyeSwgcGFnZUNvdW50LCBhdHNFcnJvcik7XG5cbiAgY29uc3Qgc3VtbWFyeVdhcm5pbmdzID0gKGN2RGF0YS5tZXRhZGF0YT8uc3VtbWFyeV93YXJuaW5ncyB8fCBbXSk7XG4gIGlmIChzdW1tYXJ5V2FybmluZ3MubGVuZ3RoKSB7XG4gICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2ZlZjljMztib3JkZXI6MXB4IHNvbGlkICNmY2QzNGQ7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzoxMnB4IDE2cHg7bWFyZ2luLWJvdHRvbToxNnB4O1wiPlxuICAgICAgPHN0cm9uZz5cdTI2QTAgUHJvZmVzc2lvbmFsIFN1bW1hcnkgcXVhbGl0eSBub3RpY2VzICgke3N1bW1hcnlXYXJuaW5ncy5sZW5ndGh9KTo8L3N0cm9uZz5cbiAgICAgIDx1bCBzdHlsZT1cIm1hcmdpbjo4cHggMCAwIDA7cGFkZGluZy1sZWZ0OjE4cHg7XCI+XG4gICAgICAgICR7c3VtbWFyeVdhcm5pbmdzLm1hcCh3ID0+IGA8bGkgc3R5bGU9XCJmb250LXNpemU6MC45ZW07XCI+JHtlc2NhcGVIdG1sKHcpfTwvbGk+YCkuam9pbignJyl9XG4gICAgICA8L3VsPlxuICAgICAgPHAgc3R5bGU9XCJtYXJnaW46OHB4IDAgMDtmb250LXNpemU6MC44N2VtO2NvbG9yOiM3ODM1MGY7XCI+VGhlc2UgYXJlIGFkdmlzb3J5IHdhcm5pbmdzIFx1MjAxNCByZXZpZXcgdGhlIFN1bW1hcnkgdGFiIGlmIHlvdSB3aXNoIHRvIHVwZGF0ZSB0aGUgc3VtbWFyeSBiZWZvcmUgc3VibWl0dGluZy48L3A+XG4gICAgPC9kaXY+YDtcbiAgfVxuXG4gIGNvbnN0IHB1YmxpY2F0aW9uV2FybmluZ3MgPSAoY3ZEYXRhLm1ldGFkYXRhPy5wdWJsaWNhdGlvbl93YXJuaW5ncyB8fCBbXSk7XG4gIGlmIChwdWJsaWNhdGlvbldhcm5pbmdzLmxlbmd0aCkge1xuICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZWY5YzM7Ym9yZGVyOjFweCBzb2xpZCAjZmNkMzRkO2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MTJweCAxNnB4O21hcmdpbi1ib3R0b206MTZweDtcIj5cbiAgICAgIDxzdHJvbmc+XHUyNkEwIFB1YmxpY2F0aW9uIHZlbnVlIGluZm9ybWF0aW9uIGluY29tcGxldGUgKCR7cHVibGljYXRpb25XYXJuaW5ncy5sZW5ndGh9KTo8L3N0cm9uZz5cbiAgICAgIDx1bCBzdHlsZT1cIm1hcmdpbjo4cHggMCAwIDA7cGFkZGluZy1sZWZ0OjE4cHg7XCI+XG4gICAgICAgICR7cHVibGljYXRpb25XYXJuaW5ncy5tYXAodyA9PiBgPGxpIHN0eWxlPVwiZm9udC1zaXplOjAuOWVtO1wiPiR7ZXNjYXBlSHRtbCh3KX08L2xpPmApLmpvaW4oJycpfVxuICAgICAgPC91bD5cbiAgICAgIDxwIHN0eWxlPVwibWFyZ2luOjhweCAwIDA7Zm9udC1zaXplOjAuODdlbTtjb2xvcjojNzgzNTBmO1wiPkFkZCBtaXNzaW5nIGpvdXJuYWwgb3IgY29uZmVyZW5jZSBuYW1lcyB0byB5b3VyIE1hc3RlciBDViBiZWZvcmUgc3VibWl0dGluZyBcdTIwMTQgaW5jb21wbGV0ZSB2ZW51ZSBkZXRhaWxzIHdlYWtlbiBjcmVkaWJpbGl0eS48L3A+XG4gICAgPC9kaXY+YDtcbiAgfVxuXG4gIGNvbnN0IGxvbmdCdWxsZXRXYXJuaW5ncyA9IChjdkRhdGEubWV0YWRhdGE/LmxvbmdfYnVsbGV0X3dhcm5pbmdzIHx8IFtdKTtcbiAgaWYgKGxvbmdCdWxsZXRXYXJuaW5ncy5sZW5ndGgpIHtcbiAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZmVmOWMzO2JvcmRlcjoxcHggc29saWQgI2ZjZDM0ZDtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjEycHggMTZweDttYXJnaW4tYm90dG9tOjE2cHg7XCI+XG4gICAgICA8c3Ryb25nPlx1MjZBMCBMb25nIGJ1bGxldCBwb2ludHMgZGV0ZWN0ZWQgKCR7bG9uZ0J1bGxldFdhcm5pbmdzLmxlbmd0aH0pIFx1MjAxNCBtYXkgZXhjZWVkIDIgbGluZXM6PC9zdHJvbmc+XG4gICAgICA8dWwgc3R5bGU9XCJtYXJnaW46OHB4IDAgMCAwO3BhZGRpbmctbGVmdDoxOHB4O2xpc3Qtc3R5bGU6bm9uZTtcIj5cbiAgICAgICAgJHtsb25nQnVsbGV0V2FybmluZ3MubWFwKHcgPT4gYDxsaSBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07bWFyZ2luLWJvdHRvbTo0cHg7XCI+PHN0cm9uZz4ke2VzY2FwZUh0bWwody5jb21wYW55KX0gXHUwMEI3ICR7ZXNjYXBlSHRtbCh3LnRpdGxlKX08L3N0cm9uZz4gKCR7dy5jaGFyX2NvdW50fSBjaGFycyk8YnI+PHNwYW4gc3R5bGU9XCJjb2xvcjojNmI3MjgwO1wiPlwiJHtlc2NhcGVIdG1sKHcuYnVsbGV0X3RleHQpfVwiPC9zcGFuPjwvbGk+YCkuam9pbignJyl9XG4gICAgICA8L3VsPlxuICAgICAgPHAgc3R5bGU9XCJtYXJnaW46OHB4IDAgMDtmb250LXNpemU6MC44N2VtO2NvbG9yOiM3ODM1MGY7XCI+Q29uc2lkZXIgc2hvcnRlbmluZyB0aGVzZSBidWxsZXRzIFx1MjAxNCBhaW0gZm9yIFx1MjI2NDIwMCBjaGFyYWN0ZXJzIGVhY2ggZm9yIGNsZWFuIDItbGluZSByZW5kZXJpbmcgaW4gdGhlIERPQ1guPC9wPlxuICAgIDwvZGl2PmA7XG4gIH1cblxuICBjb25zdCBzcGFyc2VFeHBXYXJuaW5ncyA9IChjdkRhdGEubWV0YWRhdGE/LnNwYXJzZV9leHBlcmllbmNlX3dhcm5pbmdzIHx8IFtdKTtcbiAgaWYgKHNwYXJzZUV4cFdhcm5pbmdzLmxlbmd0aCkge1xuICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZWY5YzM7Ym9yZGVyOjFweCBzb2xpZCAjZmNkMzRkO2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MTJweCAxNnB4O21hcmdpbi1ib3R0b206MTZweDtcIj5cbiAgICAgIDxzdHJvbmc+XHUyNkEwIFNwYXJzZSBleHBlcmllbmNlIGVudHJpZXMgKCR7c3BhcnNlRXhwV2FybmluZ3MubGVuZ3RofSkgXHUyMDE0IGZld2VyIHRoYW4gMiBidWxsZXRzOjwvc3Ryb25nPlxuICAgICAgPHVsIHN0eWxlPVwibWFyZ2luOjhweCAwIDAgMDtwYWRkaW5nLWxlZnQ6MThweDtsaXN0LXN0eWxlOm5vbmU7XCI+XG4gICAgICAgICR7c3BhcnNlRXhwV2FybmluZ3MubWFwKHcgPT4gYDxsaSBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07bWFyZ2luLWJvdHRvbToycHg7XCI+PHN0cm9uZz4ke2VzY2FwZUh0bWwody5jb21wYW55KX0gXHUwMEI3ICR7ZXNjYXBlSHRtbCh3LnRpdGxlKX08L3N0cm9uZz4gXHUyMDE0ICR7dy5idWxsZXRfY291bnQgPT09IDAgPyAnbm8gYnVsbGV0cyBzZWxlY3RlZCcgOiAnMSBidWxsZXQgc2VsZWN0ZWQnfTwvbGk+YCkuam9pbignJyl9XG4gICAgICA8L3VsPlxuICAgICAgPHAgc3R5bGU9XCJtYXJnaW46OHB4IDAgMDtmb250LXNpemU6MC44N2VtO2NvbG9yOiM3ODM1MGY7XCI+SW5jbHVkZSBhdCBsZWFzdCAyIGJ1bGxldHMgcGVyIHJvbGUgdG8gZGVtb25zdHJhdGUgaW1wYWN0LiBSZXR1cm4gdG8gdGhlIEV4cGVyaWVuY2UgdGFiIHRvIGFkZCBtb3JlLjwvcD5cbiAgICA8L2Rpdj5gO1xuICB9XG5cbiAgY29uc3QgeWVhck9ubHlEYXRlV2FybmluZ3MgPSAoY3ZEYXRhLm1ldGFkYXRhPy55ZWFyX29ubHlfZGF0ZV93YXJuaW5ncyB8fCBbXSk7XG4gIGlmICh5ZWFyT25seURhdGVXYXJuaW5ncy5sZW5ndGgpIHtcbiAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZmVmOWMzO2JvcmRlcjoxcHggc29saWQgI2ZjZDM0ZDtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjEycHggMTZweDttYXJnaW4tYm90dG9tOjE2cHg7XCI+XG4gICAgICA8c3Ryb25nPlx1MjZBMCBZZWFyLW9ubHkgZGF0ZXMgZGV0ZWN0ZWQgKCR7eWVhck9ubHlEYXRlV2FybmluZ3MubGVuZ3RofSkgXHUyMDE0IG1vbnRoL3llYXIgZm9ybWF0IHJlY29tbWVuZGVkOjwvc3Ryb25nPlxuICAgICAgPHVsIHN0eWxlPVwibWFyZ2luOjhweCAwIDAgMDtwYWRkaW5nLWxlZnQ6MThweDtsaXN0LXN0eWxlOm5vbmU7XCI+XG4gICAgICAgICR7eWVhck9ubHlEYXRlV2FybmluZ3MubWFwKHcgPT4gYDxsaSBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07bWFyZ2luLWJvdHRvbToycHg7XCI+PHN0cm9uZz4ke2VzY2FwZUh0bWwody5jb21wYW55KX0gXHUwMEI3ICR7ZXNjYXBlSHRtbCh3LnRpdGxlKX08L3N0cm9uZz4gXHUyMDE0ICR7dy5maWVsZCA9PT0gJ3N0YXJ0X2RhdGUnID8gJ3N0YXJ0JyA6ICdlbmQnfSBkYXRlIGlzIFwiJHtlc2NhcGVIdG1sKHcuZGF0ZV92YWx1ZSl9XCI8L2xpPmApLmpvaW4oJycpfVxuICAgICAgPC91bD5cbiAgICAgIDxwIHN0eWxlPVwibWFyZ2luOjhweCAwIDA7Zm9udC1zaXplOjAuODdlbTtjb2xvcjojNzgzNTBmO1wiPlllYXItb25seSBkYXRlcyByZWR1Y2UgY2hyb25vbG9naWNhbCBwcmVjaXNpb24uIFVwZGF0ZSB0byBNb250aCBZWVlZIGZvcm1hdCAoZS5nLiBcIkphbiAyMDIwXCIpIGluIHRoZSBNYXN0ZXIgQ1YgZm9yIGJlc3QgQVRTIGNvbXBhdGliaWxpdHkuPC9wPlxuICAgIDwvZGl2PmA7XG4gIH1cblxuICBjb25zdCByZXdyaXRlQXVkaXRNaXNtYXRjaGVzID0gKGN2RGF0YS5tZXRhZGF0YT8ucmV3cml0ZV9hdWRpdF9taXNtYXRjaGVzIHx8IFtdKTtcbiAgaWYgKHJld3JpdGVBdWRpdE1pc21hdGNoZXMubGVuZ3RoKSB7XG4gICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2ZlZjJmMjtib3JkZXI6MXB4IHNvbGlkICNmY2E1YTU7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzoxMnB4IDE2cHg7bWFyZ2luLWJvdHRvbToxNnB4O1wiPlxuICAgICAgPHN0cm9uZz5cdTI2QTAgUmV3cml0ZSBjb250ZW50IG1pc21hdGNoICgke3Jld3JpdGVBdWRpdE1pc21hdGNoZXMubGVuZ3RofSkgXHUyMDE0IGFjY2VwdGVkIHJld3JpdGVzIG5vdCBmb3VuZCBpbiBnZW5lcmF0ZWQgdGV4dDo8L3N0cm9uZz5cbiAgICAgIDx1bCBzdHlsZT1cIm1hcmdpbjo4cHggMCAwIDA7cGFkZGluZy1sZWZ0OjE4cHg7bGlzdC1zdHlsZTpub25lO1wiPlxuICAgICAgICAke3Jld3JpdGVBdWRpdE1pc21hdGNoZXMubWFwKG0gPT4gYDxsaSBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07bWFyZ2luLWJvdHRvbTo2cHg7XCI+PHN0cm9uZz4ke2VzY2FwZUh0bWwobS5sb2NhdGlvbiB8fCBtLnR5cGUpfTwvc3Ryb25nPjxicj48c3BhbiBzdHlsZT1cImNvbG9yOiMzNzQxNTE7XCI+RXhwZWN0ZWQ6IDxlbT5cIiR7ZXNjYXBlSHRtbCgobS5leHBlY3RlZCB8fCAnJykuc2xpY2UoMCwgMTIwKSl9JHsobS5leHBlY3RlZCB8fCAnJykubGVuZ3RoID4gMTIwID8gJ1x1MjAyNicgOiAnJ31cIjwvZW0+PC9zcGFuPjxicj48c3BhbiBzdHlsZT1cImNvbG9yOiM5Y2EzYWY7XCI+QWN0dWFsOiA8ZW0+XCIke2VzY2FwZUh0bWwoKG0uYWN0dWFsIHx8ICcnKS5zbGljZSgwLCAxMjApKX0keyhtLmFjdHVhbCB8fCAnJykubGVuZ3RoID4gMTIwID8gJ1x1MjAyNicgOiAnJ31cIjwvZW0+PC9zcGFuPjwvbGk+YCkuam9pbignJyl9XG4gICAgICA8L3VsPlxuICAgICAgPHAgc3R5bGU9XCJtYXJnaW46OHB4IDAgMDtmb250LXNpemU6MC44N2VtO2NvbG9yOiM3ZjFkMWQ7XCI+VGhlc2UgYWNjZXB0ZWQgcmV3cml0ZXMgbWF5IG5vdCBoYXZlIGJlZW4gYXBwbGllZC4gUmUtZ2VuZXJhdGUgdGhlIENWIG9yIGNoZWNrIHRoZSByZXdyaXRlIHJldmlldyBzdGVwLjwvcD5cbiAgICA8L2Rpdj5gO1xuICB9XG5cbiAgY29uc3Qgb3ZlcmxhcFdhcm5pbmdzID0gKGN2RGF0YS5kYXRlX292ZXJsYXBfd2FybmluZ3MgfHwgW10pO1xuICBpZiAob3ZlcmxhcFdhcm5pbmdzLmxlbmd0aCkge1xuICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZWY5YzM7Ym9yZGVyOjFweCBzb2xpZCAjZmRlMDQ3O2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MTJweCAxNnB4O21hcmdpbi1ib3R0b206MTZweDtcIj5cbiAgICAgIDxzdHJvbmc+XHUyNkEwIEVtcGxveW1lbnQgZGF0ZSBvdmVybGFwcyBkZXRlY3RlZCAoJHtvdmVybGFwV2FybmluZ3MubGVuZ3RofSk6PC9zdHJvbmc+XG4gICAgICA8dWwgc3R5bGU9XCJtYXJnaW46OHB4IDAgMCAwO3BhZGRpbmctbGVmdDoxOHB4O1wiPlxuICAgICAgICAke292ZXJsYXBXYXJuaW5ncy5tYXAodyA9PiBgPGxpPjxzdHJvbmc+JHtlc2NhcGVIdG1sKHcuZW50cnlfYSl9PC9zdHJvbmc+IG92ZXJsYXBzIHdpdGggPHN0cm9uZz4ke2VzY2FwZUh0bWwody5lbnRyeV9iKX08L3N0cm9uZz48YnI+PHNtYWxsIHN0eWxlPVwiY29sb3I6IzkyNDAwZTtcIj4ke2VzY2FwZUh0bWwody5vdmVybGFwX2Rlc2NyaXB0aW9uKX08L3NtYWxsPjwvbGk+YCkuam9pbignJyl9XG4gICAgICA8L3VsPlxuICAgICAgPHAgc3R5bGU9XCJtYXJnaW46OHB4IDAgMDtmb250LXNpemU6MC44N2VtO2NvbG9yOiM3ODM1MGY7XCI+UmV2aWV3IHRoZXNlIGVudHJpZXMgaW4gdGhlIEV4cGVyaWVuY2UgdGFiIGJlZm9yZSBzdWJtaXR0aW5nIHlvdXIgYXBwbGljYXRpb24uPC9wPlxuICAgIDwvZGl2PmA7XG4gIH1cblxuICBjb25zdCBnZW5lcmF0ZWRBdCA9IGN2RGF0YS5tZXRhZGF0YT8uZ2VuZXJhdGlvbl9kYXRlID8/IG51bGw7XG4gIGNvbnN0IGdlbmVyYXRpb25SdW4gPSBjdkRhdGEubWV0YWRhdGE/LmdlbmVyYXRpb25fcnVuID8/IG51bGw7XG4gIGh0bWwgKz0gX3JlbmRlckRvd25sb2FkR3JpZChmaWxlcywgY2hlY2tzLCBzdW1tYXJ5LCBnZW5lcmF0ZWRBdCwgZ2VuZXJhdGlvblJ1bik7XG5cbiAgaWYgKGN2RGF0YS5vdXRwdXRfZGlyKSB7XG4gICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6MjBweDtwYWRkaW5nOjEycHg7YmFja2dyb3VuZDojZjFmNWY5O2JvcmRlci1yYWRpdXM6NnB4O2ZvbnQtc2l6ZToxNHB4O2NvbG9yOiM2NDc0OGI7XCI+XG4gICAgICA8c3Ryb25nPk91dHB1dCBEaXJlY3Rvcnk6PC9zdHJvbmc+ICR7ZXNjYXBlSHRtbChjdkRhdGEub3V0cHV0X2Rpcil9XG4gICAgPC9kaXY+YDtcbiAgfVxuXG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gYCR7aHRtbH08cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7bWFyZ2luLXRvcDoxNnB4O2ZvbnQtc2l6ZTowLjllbTtcIj5BbmFseXNpbmcgYnVsbGV0IHBlcnN1YXNpdmVuZXNzXHUyMDI2PC9wPmA7XG4gIGh0bWwgKz0gYXdhaXQgX2ZldGNoUGVyc3Vhc2lvbkh0bWwoKTtcbiAgaHRtbCArPSBfcmVuZGVyUmVmaW5lbWVudFBhbmVsKCk7XG4gIGh0bWwgKz0gYDxkaXYgY2xhc3M9XCJuYXYtYnV0dG9ucyBuYXYtZW5kXCIgc3R5bGU9XCJtYXJnaW4tdG9wOjE2cHg7XCI+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImNvbnRpbnVlLWJ0blwiIG9uY2xpY2s9XCJoYW5kbGVTdGVwQ2xpY2soJ2NvdmVyX2xldHRlcicpXCI+XG4gICAgICBcdUQ4M0RcdURDRTkgUHJvY2VlZCB0byBDb3ZlciBMZXR0ZXIgXHUyMTkyXG4gICAgPC9idXR0b24+XG4gIDwvZGl2PmA7XG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gaHRtbDtcbn1cblxuZXhwb3J0IHsgcG9wdWxhdGVEb3dubG9hZFRhYiB9OyIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL2ZpbmFsLWdlbmVyYXRlLmpzXG4gKiBGaW5hbCBnZW5lcmF0aW9uIHN0ZXA6IHNob3dzIGRvd25sb2FkIGxpbmtzIGZvciB0aGUgZ2VuZXJhdGVkIGZpbGVzXG4gKiAoUERGLCBBVFMgRE9DWCwgaHVtYW4gRE9DWCkgYW5kIGEgXCJQcm9jZWVkIHRvIERvd25sb2FkIFJldmlldyBcdTIxOTJcIiBidXR0b25cbiAqIHRoYXQgYWR2YW5jZXMgdGhlIHdvcmtmbG93IHRvIHRoZSBkb3dubG9hZCBzdGVwLlxuICpcbiAqIERlcGVuZGVuY2llcyAocmVzb2x2ZWQgdGhyb3VnaCBnbG9iYWxUaGlzIGF0IHJ1bnRpbWUpOlxuICogICBhcGlDYWxsLCBhcHBlbmRNZXNzYWdlLCBlc2NhcGVIdG1sLCBzdGF0ZU1hbmFnZXIsIHN3aXRjaFRhYlxuICovXG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmNvbnN0IGxvZyA9IGdldExvZ2dlcignZmluYWwtZ2VuZXJhdGUnKTtcblxuaW1wb3J0IHsgc3RhdGVNYW5hZ2VyIH0gZnJvbSAnLi9zdGF0ZS1tYW5hZ2VyLmpzJztcblxuLy8gXHUyNTAwXHUyNTAwIFByZXZpZXcgc3RhdGUgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmxldCBfcHJldmlld09wZW4gPSB0cnVlO1xuXG4vLyBcdTI1MDBcdTI1MDAgRmlsZSB0eXBlIGhlbHBlcnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIF9maWxlTGFiZWwoZmlsZW5hbWUpIHtcbiAgaWYgKCFmaWxlbmFtZSkgcmV0dXJuICcnO1xuICBjb25zdCBiYXNlID0gZmlsZW5hbWUuc3BsaXQoJy8nKS5wb3AoKTtcbiAgaWYgKGJhc2UuZW5kc1dpdGgoJy5wZGYnKSAmJiBiYXNlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2F0cycpKVxuICAgIHJldHVybiAnQVRTIFBERic7XG4gIGlmIChiYXNlLmVuZHNXaXRoKCcucGRmJykpXG4gICAgcmV0dXJuICdIdW1hbiBQREYnO1xuICBpZiAoYmFzZS5lbmRzV2l0aCgnLmRvY3gnKSAmJiBiYXNlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2F0cycpKVxuICAgIHJldHVybiAnQVRTIFdvcmQnO1xuICBpZiAoYmFzZS5lbmRzV2l0aCgnLmRvY3gnKSlcbiAgICByZXR1cm4gJ0h1bWFuIFdvcmQnO1xuICBpZiAoYmFzZS5lbmRzV2l0aCgnLmh0bWwnKSlcbiAgICByZXR1cm4gJ0hUTUwnO1xuICByZXR1cm4gYmFzZTtcbn1cblxuZnVuY3Rpb24gX2ZpbGVJY29uKGZpbGVuYW1lKSB7XG4gIGlmICghZmlsZW5hbWUpIHJldHVybiAnXHVEODNEXHVEQ0MxJztcbiAgY29uc3QgZiA9IGZpbGVuYW1lLnRvTG93ZXJDYXNlKCk7XG4gIGlmIChmLmVuZHNXaXRoKCcucGRmJykpICByZXR1cm4gZi5pbmNsdWRlcygnYXRzJykgPyAnXHVEODNFXHVERDE2JyA6ICdcdUQ4M0RcdURDQzQnO1xuICBpZiAoZi5lbmRzV2l0aCgnLmRvY3gnKSkgcmV0dXJuICdcdUQ4M0RcdURDREQnO1xuICBpZiAoZi5lbmRzV2l0aCgnLmh0bWwnKSkgcmV0dXJuICdcdUQ4M0NcdURGMTAnO1xuICByZXR1cm4gJ1x1RDgzRFx1RENDMSc7XG59XG5cbmZ1bmN0aW9uIF9maWxlRGVzY3JpcHRpb24oZmlsZW5hbWUpIHtcbiAgaWYgKCFmaWxlbmFtZSkgcmV0dXJuICcnO1xuICBjb25zdCBmID0gZmlsZW5hbWUudG9Mb3dlckNhc2UoKTtcbiAgaWYgKGYuZW5kc1dpdGgoJy5wZGYnKSAmJiBmLmluY2x1ZGVzKCdhdHMnKSlcbiAgICByZXR1cm4gJ0FUUy1vcHRpbWlzZWQgUERGIFx1MjAxNCBtYWNoaW5lLXJlYWRhYmxlIGZvciBhdXRvbWF0ZWQgc2NyZWVuaW5nJztcbiAgaWYgKGYuZW5kc1dpdGgoJy5wZGYnKSlcbiAgICByZXR1cm4gJ0h1bWFuLXJlYWRhYmxlIFBERiBcdTIwMTQgZm9yIGh1bWFuIHJldmlld2VycyBhbmQgcHJpbnRpbmcnO1xuICBpZiAoZi5lbmRzV2l0aCgnLmRvY3gnKSAmJiBmLmluY2x1ZGVzKCdhdHMnKSlcbiAgICByZXR1cm4gJ0FUUyBXb3JkIGRvY3VtZW50IFx1MjAxNCBrZXl3b3JkLW9wdGltaXNlZCBmb3Igam9iIGFwcGxpY2F0aW9ucyc7XG4gIGlmIChmLmVuZHNXaXRoKCcuZG9jeCcpKVxuICAgIHJldHVybiAnSHVtYW4tcmVhZGFibGUgV29yZCBkb2N1bWVudCBcdTIwMTQgZWRpdGFibGUgZm9ybWF0JztcbiAgaWYgKGYuZW5kc1dpdGgoJy5odG1sJykpXG4gICAgcmV0dXJuICdIVE1MIGZvcm1hdCB3aXRoIGVtYmVkZGVkIEpTT04tTEQgc3RydWN0dXJlZCBkYXRhJztcbiAgcmV0dXJuICdHZW5lcmF0ZWQgZmlsZSc7XG59XG5cbmZ1bmN0aW9uIF9odG1sUHJldmlld0ZpbGUoZmlsZXMpIHtcbiAgLy8gUHJlZmVyIGh1bWFuLXJlYWRhYmxlIEhUTUwgKENWXyouaHRtbCwgbm90IEFUUylcbiAgY29uc3QgaHVtYW4gPSBmaWxlcy5maW5kKGYgPT4gZi5lbmRzV2l0aCgnLmh0bWwnKSAmJiAhZi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdhdHMnKSk7XG4gIHJldHVybiBodW1hbiB8fCBmaWxlcy5maW5kKGYgPT4gZi5lbmRzV2l0aCgnLmh0bWwnKSkgfHwgbnVsbDtcbn1cblxuZnVuY3Rpb24gX3JlbmRlclByZXZpZXdQYW5lKGh0bWxGaWxlKSB7XG4gIGlmICghaHRtbEZpbGUpIHJldHVybiAnJztcbiAgY29uc3QgYmFzZSA9IGh0bWxGaWxlLnNwbGl0KCcvJykucG9wKCk7XG4gIGNvbnN0IHNyYyA9IGAvYXBpL2Rvd25sb2FkLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGJhc2UpfWA7XG4gIHJldHVybiBgXG4gICAgPGRpdiBpZD1cImZpbmFsLXByZXZpZXctcGFuZVwiIHN0eWxlPVwibWFyZ2luLWJvdHRvbToyNHB4O2JvcmRlcjoxcHggc29saWQgI2UyZThmMDtib3JkZXItcmFkaXVzOjEwcHg7b3ZlcmZsb3c6aGlkZGVuOyR7X3ByZXZpZXdPcGVuID8gJycgOiAnZGlzcGxheTpub25lOyd9XCI+XG4gICAgICA8ZGl2IHN0eWxlPVwicGFkZGluZzoxMHB4IDE2cHg7YmFja2dyb3VuZDojZjFmNWY5O2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjEwcHg7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2UyZThmMDtcIj5cbiAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC45ZW07Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOiMxZTI5M2I7XCI+XHVEODNDXHVERjEwIEhUTUwgUHJldmlldzwvc3Bhbj5cbiAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC44ZW07Y29sb3I6IzY0NzQ4YjtmbGV4OjE7XCI+JHtlc2NhcGVIdG1sKGJhc2UpfTwvc3Bhbj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWQ9XCJmaW5hbC1wcmV2aWV3LWNsb3NlLWJ0blwiXG4gICAgICAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6MC44ZW07cGFkZGluZzozcHggMTBweDtib3JkZXI6MXB4IHNvbGlkICNjYmQ1ZTE7Ym9yZGVyLXJhZGl1czo1cHg7YmFja2dyb3VuZDojZmZmO2N1cnNvcjpwb2ludGVyO2NvbG9yOiM0NzU1Njk7XCJcbiAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiSGlkZSBwcmV2aWV3XCI+SGlkZTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IHN0eWxlPVwicG9zaXRpb246cmVsYXRpdmU7d2lkdGg6MTAwJTtwYWRkaW5nLXRvcDo1Ni4yNSU7YmFja2dyb3VuZDojZjhmYWZjO1wiPlxuICAgICAgICA8aWZyYW1lIGlkPVwiZmluYWwtY3YtcHJldmlld1wiXG4gICAgICAgICAgICAgICAgc3JjPVwiJHtzcmN9XCJcbiAgICAgICAgICAgICAgICB0aXRsZT1cIkZpbmFsIENWIEhUTUwgUHJldmlld1wiXG4gICAgICAgICAgICAgICAgc2FuZGJveD1cImFsbG93LXNhbWUtb3JpZ2luXCJcbiAgICAgICAgICAgICAgICByZWZlcnJlcnBvbGljeT1cIm5vLXJlZmVycmVyXCJcbiAgICAgICAgICAgICAgICBzdHlsZT1cInBvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JvcmRlcjpub25lO1wiXG4gICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkZpbmFsIGdlbmVyYXRlZCBDViBwcmV2aWV3XCI+PC9pZnJhbWU+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgVGFiIHJlbmRlcmVyIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4vKipcbiAqIFBvcHVsYXRlIHRoZSBcIkdlbmVyYXRlXCIgKGZpbmFsX2dlbmVyYXRlKSB0YWIgY29udGVudC5cbiAqIFNob3dzIGRvd25sb2FkIGxpbmtzIGZvciBhbGwgZmluYWwtZ2VuZXJhdGVkIGZpbGVzIGFuZCBhIFwiUHJvY2VlZCB0byBGaW5hbGlzZVwiIGJ1dHRvbi5cbiAqIEBwYXJhbSB7T2JqZWN0fSBjdkRhdGEgLSBDViBkYXRhIG9iamVjdCBmcm9tIHN0YXRlTWFuYWdlci5nZXRUYWJEYXRhKCdjdicpXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBvcHVsYXRlRmluYWxHZW5lcmF0ZVRhYihjdkRhdGEgPSB7fSkge1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgaWYgKCFjb250ZW50KSByZXR1cm47XG5cbiAgLy8gQ29sbGVjdCBjYW5kaWRhdGUgZmlsZXMsIGRlZHVwbGljYXRlXG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0KCk7XG4gIGNvbnN0IGNhbmRpZGF0ZXMgPSBbXG4gICAgY3ZEYXRhLmZpbmFsX2h0bWwsXG4gICAgY3ZEYXRhLmZpbmFsX3BkZixcbiAgICBjdkRhdGEuaHRtbCxcbiAgICBjdkRhdGEucGRmLFxuICAgIGN2RGF0YS5kb2N4LFxuICAgIGN2RGF0YS5hdHNfZG9jeCxcbiAgICBjdkRhdGEuaHVtYW5fZG9jeCxcbiAgICAuLi4oQXJyYXkuaXNBcnJheShjdkRhdGEuZmlsZXMpID8gY3ZEYXRhLmZpbGVzIDogW10pLFxuICBdLmZpbHRlcihCb29sZWFuKTtcblxuICBjb25zdCBmaWxlcyA9IFtdO1xuICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICBpZiAoc2Vlbi5oYXMoZmlsZW5hbWUpKSBjb250aW51ZTtcbiAgICBzZWVuLmFkZChmaWxlbmFtZSk7XG4gICAgaWYgKGZpbGVuYW1lLmVuZHNXaXRoKCcudHh0JykgfHwgZmlsZW5hbWUgPT09ICdqb2JfZGVzY3JpcHRpb24udHh0JykgY29udGludWU7XG4gICAgZmlsZXMucHVzaChmaWxlbmFtZSk7XG4gIH1cblxuICBjb25zdCBodG1sUHJldmlld0ZpbGUgPSBfaHRtbFByZXZpZXdGaWxlKGZpbGVzKTtcblxuICBsZXQgaHRtbCA9ICc8aDE+XHVEODNEXHVEQ0M0IEdlbmVyYXRlZCBGaWxlczwvaDE+JztcbiAgaHRtbCArPSAnPHAgc3R5bGU9XCJjb2xvcjojNDc1NTY5O21hcmdpbi1ib3R0b206OHB4O1wiPllvdXIgQ1YgZmlsZXMgYXJlIHJlYWR5IHRvIGRvd25sb2FkLiBQcmV2aWV3IHRoZSBIVE1MIHZlcnNpb24gYmVsb3csIHRoZW4gY2xpY2sgPHN0cm9uZz5Qcm9jZWVkIHRvIERvd25sb2FkIFJldmlldzwvc3Ryb25nPiB0byBydW4gQVRTIHZhbGlkYXRpb24gYW5kIGFyY2hpdmUgeW91ciBhcHBsaWNhdGlvbi48L3A+JztcbiAgaHRtbCArPSAnPHAgc3R5bGU9XCJmb250LXNpemU6MC44M2VtO2NvbG9yOiM5NGEzYjg7bWFyZ2luLWJvdHRvbToyMHB4O3BhZGRpbmc6OHB4IDEycHg7YmFja2dyb3VuZDojZjhmYWZjO2JvcmRlci1yYWRpdXM6NnB4O2JvcmRlci1sZWZ0OjNweCBzb2xpZCAjZTJlOGYwO1wiPlx1RDgzRFx1RENBMSA8ZW0+VGhpcyB0YWIgbGV0cyB5b3UgZG93bmxvYWQgZmlsZXMgaW1tZWRpYXRlbHkuIFRoZSA8c3Ryb25nPkZpbGUgUmV2aWV3PC9zdHJvbmc+IHN1Yi10YWIgaW4gRmluYWxpc2UgcnVucyBBVFMgY2hlY2tzLCBjb25maXJtcyB0aGUgcGFja2FnZSBpcyBjb21wbGV0ZSwgYW5kIGxldHMgeW91IGFyY2hpdmUgdGhlIGFwcGxpY2F0aW9uLjwvZW0+PC9wPic7XG5cbiAgaWYgKGh0bWxQcmV2aWV3RmlsZSkge1xuICAgIGNvbnN0IHNob3dIaWRlID0gX3ByZXZpZXdPcGVuID8gJ0hpZGUgcHJldmlldycgOiAnU2hvdyBwcmV2aWV3JztcbiAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxMnB4O2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDtcIj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlkPVwiZmluYWwtcHJldmlldy10b2dnbGUtYnRuXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO3BhZGRpbmc6NXB4IDE0cHg7Ym9yZGVyOjFweCBzb2xpZCAjM2I4MmY2O2JvcmRlci1yYWRpdXM6NnB4O2JhY2tncm91bmQ6JHtfcHJldmlld09wZW4gPyAnI2VmZjZmZicgOiAnI2ZmZid9O2NvbG9yOiMzYjgyZjY7Y3Vyc29yOnBvaW50ZXI7Zm9udC13ZWlnaHQ6NjAwO1wiXG4gICAgICAgICAgICAgIGFyaWEtZXhwYW5kZWQ9XCIke19wcmV2aWV3T3Blbn1cIlxuICAgICAgICAgICAgICBhcmlhLWNvbnRyb2xzPVwiZmluYWwtcHJldmlldy1wYW5lXCI+XG4gICAgICAgIFx1RDgzQ1x1REYxMCAke3Nob3dIaWRlfVxuICAgICAgPC9idXR0b24+XG4gICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjhlbTtjb2xvcjojOTRhM2I4O1wiPkluLWJyb3dzZXIgSFRNTCBwcmV2aWV3PC9zcGFuPlxuICAgIDwvZGl2PmA7XG4gICAgaHRtbCArPSBfcmVuZGVyUHJldmlld1BhbmUoaHRtbFByZXZpZXdGaWxlKTtcbiAgfVxuXG4gIGlmIChmaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICBodG1sICs9ICc8cCBzdHlsZT1cImNvbG9yOiM5Y2EzYWY7cGFkZGluZzoxNnB4O1wiPk5vIGZpbGVzIGdlbmVyYXRlZCB5ZXQuPC9wPic7XG4gIH0gZWxzZSB7XG4gICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cImRpc3BsYXk6Z3JpZDtnYXA6MTJweDttYXJnaW4tYm90dG9tOjI4cHg7XCI+JztcbiAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIGZpbGVzKSB7XG4gICAgICBjb25zdCBiYXNlICAgPSBmaWxlbmFtZS5zcGxpdCgnLycpLnBvcCgpO1xuICAgICAgY29uc3QgaWNvbiAgID0gX2ZpbGVJY29uKGZpbGVuYW1lKTtcbiAgICAgIGNvbnN0IGxhYmVsICA9IF9maWxlTGFiZWwoZmlsZW5hbWUpO1xuICAgICAgY29uc3QgZGVzYyAgID0gX2ZpbGVEZXNjcmlwdGlvbihmaWxlbmFtZSk7XG4gICAgICBodG1sICs9IGBcbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjE0cHg7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6I2Y4ZmFmYztib3JkZXI6MXB4IHNvbGlkICNlMmU4ZjA7XG4gICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MTRweCAxOHB4O1wiPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjEuOGVtO1wiPiR7aWNvbn08L3NwYW4+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImZsZXg6MTttaW4td2lkdGg6MDtcIj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjAuOTVlbTtjb2xvcjojMWUyOTNiO1wiPiR7ZXNjYXBlSHRtbChsYWJlbCl9PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuODNlbTtjb2xvcjojNjQ3NDhiO21hcmdpbi10b3A6MnB4O1wiPiR7ZXNjYXBlSHRtbChkZXNjKX08L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8YSBocmVmPVwiL2FwaS9kb3dubG9hZC8ke2VuY29kZVVSSUNvbXBvbmVudChiYXNlKX1cIlxuICAgICAgICAgICAgIGRvd25sb2FkPVwiJHtlc2NhcGVIdG1sKGJhc2UpfVwiXG4gICAgICAgICAgICAgc3R5bGU9XCJkaXNwbGF5OmlubGluZS1mbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6NnB4O1xuICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiMzYjgyZjY7Y29sb3I6I2ZmZjtcbiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzo3cHggMTZweDtib3JkZXItcmFkaXVzOjZweDtcbiAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOjAuODhlbTtmb250LXdlaWdodDo2MDA7dGV4dC1kZWNvcmF0aW9uOm5vbmU7XG4gICAgICAgICAgICAgICAgICAgIHdoaXRlLXNwYWNlOm5vd3JhcDtcIj5cbiAgICAgICAgICAgIFx1MkIwN1x1RkUwRiBEb3dubG9hZFxuICAgICAgICAgIDwvYT5cbiAgICAgICAgPC9kaXY+YDtcbiAgICB9XG4gICAgaHRtbCArPSAnPC9kaXY+JztcbiAgfVxuXG4gIGlmIChjdkRhdGEub3V0cHV0X2Rpcikge1xuICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjI0cHg7cGFkZGluZzoxMHB4IDE0cHg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6I2YxZjVmOTtib3JkZXItcmFkaXVzOjZweDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOjEzcHg7Y29sb3I6IzY0NzQ4YjtcIj5cbiAgICAgIDxzdHJvbmc+T3V0cHV0IGRpcmVjdG9yeTo8L3N0cm9uZz4gJHtlc2NhcGVIdG1sKGN2RGF0YS5vdXRwdXRfZGlyKX1cbiAgICA8L2Rpdj5gO1xuICB9XG5cbiAgaHRtbCArPSBgXG4gICAgPGRpdiBjbGFzcz1cIm5hdi1idXR0b25zIG5hdi1lbmRcIiBzdHlsZT1cIm1hcmdpbi10b3A6MjRweDtcIj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJjb250aW51ZS1idG5cIiBpZD1cImZpbmFsLWdlbmVyYXRlLWNvbnRpbnVlLWJ0blwiXG4gICAgICAgICAgICAgIG9uY2xpY2s9XCJmaW5hbEdlbmVyYXRpb25Db21wbGV0ZSgpXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6MWVtO3BhZGRpbmc6MTBweCAyNHB4O1wiPlxuICAgICAgICBcdTI3MDUgUHJvY2VlZCB0byBEb3dubG9hZCBSZXZpZXcgXHUyMTkyXG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5gO1xuXG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gaHRtbDtcblxuICAvLyBXaXJlIHVwIHByZXZpZXcgdG9nZ2xlXG4gIGlmIChodG1sUHJldmlld0ZpbGUpIHtcbiAgICBjb25zdCB0b2dnbGVCdG4gID0gY29udGVudC5xdWVyeVNlbGVjdG9yKCcjZmluYWwtcHJldmlldy10b2dnbGUtYnRuJyk7XG4gICAgY29uc3QgY2xvc2VCdG4gICA9IGNvbnRlbnQucXVlcnlTZWxlY3RvcignI2ZpbmFsLXByZXZpZXctY2xvc2UtYnRuJyk7XG4gICAgY29uc3QgcHJldmlld1BhbmUgPSBjb250ZW50LnF1ZXJ5U2VsZWN0b3IoJyNmaW5hbC1wcmV2aWV3LXBhbmUnKTtcblxuICAgIGNvbnN0IHNldFByZXZpZXdPcGVuID0gKG9wZW4pID0+IHtcbiAgICAgIF9wcmV2aWV3T3BlbiA9IG9wZW47XG4gICAgICBpZiAocHJldmlld1BhbmUpIHByZXZpZXdQYW5lLnN0eWxlLmRpc3BsYXkgPSBvcGVuID8gJycgOiAnbm9uZSc7XG4gICAgICBpZiAodG9nZ2xlQnRuKSB7XG4gICAgICAgIHRvZ2dsZUJ0bi50ZXh0Q29udGVudCA9IG9wZW4gPyAnXHVEODNDXHVERjEwIEhpZGUgcHJldmlldycgOiAnXHVEODNDXHVERjEwIFNob3cgcHJldmlldyc7XG4gICAgICAgIHRvZ2dsZUJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCBTdHJpbmcob3BlbikpO1xuICAgICAgICB0b2dnbGVCdG4uc3R5bGUuYmFja2dyb3VuZCA9IG9wZW4gPyAnI2VmZjZmZicgOiAnI2ZmZic7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRvZ2dsZUJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBzZXRQcmV2aWV3T3BlbighX3ByZXZpZXdPcGVuKSk7XG4gICAgY2xvc2VCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgICgpID0+IHNldFByZXZpZXdPcGVuKGZhbHNlKSk7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIFBoYXNlIHRyYW5zaXRpb24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8qKlxuICogQWR2YW5jZSB3b3JrZmxvdyBmcm9tIGZpbmFsX2dlbmVyYXRpb24gXHUyMTkyIHJlZmluZW1lbnQuXG4gKiBDYWxscyBQT1NUIC9hcGkvZmluYWwtZ2VuZXJhdGlvbi1jb21wbGV0ZSwgdXBkYXRlcyBmcm9udGVuZCBwaGFzZSwgYW5kXG4gKiBzd2l0Y2hlcyB0byB0aGUgZG93bmxvYWQgdGFiLlxuICovXG5hc3luYyBmdW5jdGlvbiBmaW5hbEdlbmVyYXRpb25Db21wbGV0ZSgpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGlDYWxsKCdQT1NUJywgJy9hcGkvZmluYWwtZ2VuZXJhdGlvbi1jb21wbGV0ZScsIHt9KTtcbiAgICBpZiAoIXJlcz8ub2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihyZXM/LmVycm9yIHx8ICdGYWlsZWQgdG8gYWR2YW5jZSB0byBGaWxlIFJldmlldyBzdGVwLicpO1xuICAgIH1cbiAgICBzdGF0ZU1hbmFnZXIuc2V0UGhhc2UoJ3JlZmluZW1lbnQnKTtcbiAgICBzd2l0Y2hUYWIoJ2Rvd25sb2FkJyk7XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ1x1MjcwNSBGaWxlcyBnZW5lcmF0ZWQuIFlvdSBjYW4gbm93IGZpbmFsaXNlIHlvdXIgYXBwbGljYXRpb24uJyk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy5lcnJvcignZmluYWxHZW5lcmF0aW9uQ29tcGxldGUgZXJyb3I6JywgZXJyKTtcbiAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCBgXHUyNzRDICR7ZXJyLm1lc3NhZ2V9YCk7XG4gIH1cbn1cblxuZXhwb3J0IHsgcG9wdWxhdGVGaW5hbEdlbmVyYXRlVGFiLCBmaW5hbEdlbmVyYXRpb25Db21wbGV0ZSB9O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiBcIlVwZGF0ZSB2aWEgQUlcIiBwYW5lbCAoR0FQLTAxKTogbmF0dXJhbC1sYW5ndWFnZSBpbnN0cnVjdGlvbiBvclxuICogZG9jdW1lbnQtaW5nZXN0aW9uIHVwZGF0ZXMgdG8gTWFzdGVyX0NWX0RhdGEuanNvbiwgcHJvcG9zZWQgYnkgYW4gTExNLFxuICogcmV2aWV3ZWQgYXMgYSBkaWZmLCBhbmQgd3JpdHRlbiBvbmx5IG9uIGV4cGxpY2l0IGNvbmZpcm1hdGlvbi5cbiAqXG4gKiBSZW5kZXJlZCBpbnNpZGUgdGhlIE1hc3RlciBDViB0YWIgKHNlZSB3ZWIvbWFzdGVyLWN2LmpzKSwgY29sbGFwc2VkIGJ5XG4gKiBkZWZhdWx0LiBSZXVzZXMgd2ViL3Byb3Bvc2FsLXJldmlldy5qcydzIHJvdyByZW5kZXJlciBmb3IgdGhlIGRpZmYgcmV2aWV3XG4gKiBsaXN0IHJhdGhlciB0aGFuIGZvcmtpbmcgYSB0aGlyZCBjb3B5IG9mIHRoYXQgVUkgKGhhcnZlc3QuanMgYW5kXG4gKiBsYXlvdXQtaW5zdHJ1Y3Rpb24uanMncyByZW5kZXJDb250ZW50UHJvcG9zYWxzIGFscmVhZHkgZXhpc3QpLlxuICpcbiAqIFB1YmxpYyBleHBvcnRzIChhc3NpZ25lZCB0byB3aW5kb3cgYnkgd2ViL3NyYy9tYWluLmpzJ3MgYnVuZGxlKTpcbiAqICAgcmVuZGVyTWFzdGVyRGF0YUFpVXBkYXRlUGFuZWwoKVxuICogICB0b2dnbGVNYXN0ZXJEYXRhQWlQYW5lbCgpXG4gKiAgIHNldE1hc3RlckRhdGFBaU1vZGUobW9kZSlcbiAqICAgaGFuZGxlTWFzdGVyRGF0YUFpRmlsZVVwbG9hZChldmVudClcbiAqICAgc3VibWl0TWFzdGVyRGF0YUFpUHJvcG9zZSgpXG4gKiAgIGRpc2NhcmRNYXN0ZXJEYXRhQWlQcm9wb3NhbCgpXG4gKiAgIGNvbmZpcm1NYXN0ZXJEYXRhQWlVcGRhdGUoKVxuICpcbiAqIEtleWJvYXJkOiBDdHJsL0NtZCtFbnRlciBvbiBlaXRoZXIgaW5wdXQgdGV4dGFyZWEgc3VibWl0cyBcIlByb3Bvc2UgVXBkYXRlXCJcbiAqICh3aXJlZCBsb2NhbGx5IHZpYSBvbmtleWRvd24sIG5vdCBrZXlib2FyZC1zaG9ydGN1dHMuanMncyBnbG9iYWxcbiAqIF9UQUJfQUNUSU9OX0JUTiBtYXAgXHUyMDE0IHRoZSBNYXN0ZXIgQ1YgdGFiIGhhcyBzZXZlcmFsIGluZGVwZW5kZW50IGZvcm1zIHdpdGhcbiAqIG5vIHNpbmdsZSBwcmltYXJ5IGFjdGlvbiwgc28gY2xhaW1pbmcgdGhpcyBwYW5lbCBhcyAqdGhlKiB0YWItd2lkZVxuICogQ3RybCtFbnRlciB0YXJnZXQgd291bGQgYmUgbWlzbGVhZGluZy9yZWdyZXNzIHRoZSB0YWIncyBvdGhlciBzYXZlXG4gKiBhY3Rpb25zOyBhIGxvY2FsLCBzY29wZWQgc2hvcnRjdXQgaXMgdGhlIGNvcnJlY3QgZml0IGhlcmUgaW5zdGVhZCkuXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZXNjLCByZW5kZXJQcm9wb3NhbFJvdywgYXR0YWNoUHJvcG9zYWxSb3dMaXN0ZW5lcnMgfSBmcm9tICcuL3Byb3Bvc2FsLXJldmlldy5qcyc7XG5cbmNvbnN0IGxvZyA9IGdldExvZ2dlcignbWFzdGVyLWRhdGEtYWktdXBkYXRlJyk7XG5cbi8vIFx1MjUwMFx1MjUwMCBTdGF0ZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbi8vIENsb3N1cmUtc2NvcGVkLCBjb25zaXN0ZW50IHdpdGggaG93IGhhcnZlc3QuanMgbWFuYWdlcyBpdHMgb3duIGxvY2FsIHN0YXRlIFx1MjAxNFxuLy8gdGhpcyBwYW5lbCBkb2Vzbid0IG5lZWQgdG8gcGFydGljaXBhdGUgaW4gc3RhdGUtbWFuYWdlci5qcydzIGdsb2JhbHMuXG5cbmxldCBfbWR1TW9kZSA9ICdubF9pbnN0cnVjdGlvbic7ICAgICAgICAgICAvLyAnbmxfaW5zdHJ1Y3Rpb24nIHwgJ2RvY3VtZW50X2luZ2VzdGlvbidcbmxldCBfbWR1UGVuZGluZ1Byb3Bvc2FsID0gbnVsbDsgICAgICAgICAgICAvLyB7IHByb3Bvc2FsSWQsIHNvdXJjZSwgY2hhbmdlcyB9XG5sZXQgX21kdVByaW9yQ2xhcmlmaWNhdGlvbnMgPSBbXTsgICAgICAgICAgLy8gW3txdWVzdGlvbiwgYW5zd2VyfSwgLi4uXVxuXG5mdW5jdGlvbiBfbWR1UmVzZXRTdGF0ZSgpIHtcbiAgX21kdU1vZGUgPSAnbmxfaW5zdHJ1Y3Rpb24nO1xuICBfbWR1UGVuZGluZ1Byb3Bvc2FsID0gbnVsbDtcbiAgX21kdVByaW9yQ2xhcmlmaWNhdGlvbnMgPSBbXTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFBhbmVsIHNoZWxsIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiByZW5kZXJNYXN0ZXJEYXRhQWlVcGRhdGVQYW5lbCgpIHtcbiAgLy8gUmVzZXQgbW9kdWxlIHN0YXRlIG9uIGV2ZXJ5IGZyZXNoIHJlbmRlciAobm90IGp1c3QgcGFnZSBsb2FkKSBcdTIwMTQgdGhlIERPTVxuICAvLyB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYWx3YXlzIGRlcGljdHMgdGhlIG5sX2luc3RydWN0aW9uL25vLXByb3Bvc2FsXG4gIC8vIGRlZmF1bHQsIHNvIGFueSBjYXJyaWVkLW92ZXIgc3RhdGUgZnJvbSBhIHByaW9yIHJlbmRlciAoZS5nLiB0aGUgdXNlclxuICAvLyBzd2l0Y2hlZCB0YWJzIG1pZC1wcm9wb3NhbCBhbmQgcG9wdWxhdGVNYXN0ZXJUYWIoKSByZS1yZW5kZXJlZCB0aGlzXG4gIC8vIHBhbmVsKSBtdXN0IGJlIGRpc2NhcmRlZCB0byBhdm9pZCB0aGUgdHdvIGdvaW5nIG91dCBvZiBzeW5jLlxuICBfbWR1UmVzZXRTdGF0ZSgpO1xuICByZXR1cm4gYFxuICAgIDxkaXYgaWQ9XCJtZHUtcGFuZWxcIiBzdHlsZT1cIm1hcmdpbjoxNnB4IDA7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1jdi1ib3JkZXIpO2JvcmRlci1yYWRpdXM6OHB4O292ZXJmbG93OmhpZGRlbjtcIj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlkPVwibWR1LXRvZ2dsZS1idG5cIiBvbmNsaWNrPVwidG9nZ2xlTWFzdGVyRGF0YUFpUGFuZWwoKVwiXG4gICAgICAgIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiIGFyaWEtY29udHJvbHM9XCJtZHUtcGFuZWwtYm9keVwiXG4gICAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTt0ZXh0LWFsaWduOmxlZnQ7YmFja2dyb3VuZDp2YXIoLS1jdi1iZy1saWdodCk7Ym9yZGVyOm5vbmU7cGFkZGluZzoxMnB4IDE2cHg7Zm9udC1zaXplOjAuOTVlbTtmb250LXdlaWdodDo3MDA7Y29sb3I6dmFyKC0tY3YtdGV4dC1wcmltYXJ5KTtjdXJzb3I6cG9pbnRlcjtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDo4cHg7XCI+XG4gICAgICAgIDxzcGFuIGlkPVwibWR1LXRvZ2dsZS1pY29uXCI+XHUyNUI4PC9zcGFuPiBcdUQ4M0VcdUREMTYgVXBkYXRlIHZpYSBBSVxuICAgICAgPC9idXR0b24+XG4gICAgICA8ZGl2IGlkPVwibWR1LXBhbmVsLWJvZHlcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtwYWRkaW5nOjE2cHg7XCI+XG4gICAgICAgIDxwIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtjb2xvcjp2YXIoLS1jdi10ZXh0LXNlY29uZGFyeSk7bWFyZ2luOjAgMCAxNHB4O1wiPlxuICAgICAgICAgIFByZWZlciBwbGFpbiBFbmdsaXNoLCBvciBoYXZlIGFuIG9sZCBDViBvciBMaW5rZWRJbiBleHBvcnQ/IERlc2NyaWJlIGEgY2hhbmdlIG9yIHBhc3RlL3VwbG9hZCBhXG4gICAgICAgICAgZG9jdW1lbnQgYW5kIEFJIHdpbGwgZHJhZnQgaXQgZm9yIHlvdSB0byByZXZpZXcgXHUyMDE0IG5vdGhpbmcgaXMgc2F2ZWQgdW50aWwgeW91IGNvbmZpcm0uXG4gICAgICAgIDwvcD5cblxuICAgICAgICA8ZGl2IHJvbGU9XCJ0YWJsaXN0XCIgYXJpYS1sYWJlbD1cIlVwZGF0ZSBtZXRob2RcIiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6NnB4O21hcmdpbi1ib3R0b206MTJweDtcIj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBpZD1cIm1kdS1tb2RlLW5sX2luc3RydWN0aW9uLWJ0blwiIHJvbGU9XCJ0YWJcIiBhcmlhLXNlbGVjdGVkPVwidHJ1ZVwiXG4gICAgICAgICAgICBvbmNsaWNrPVwic2V0TWFzdGVyRGF0YUFpTW9kZSgnbmxfaW5zdHJ1Y3Rpb24nKVwiXG4gICAgICAgICAgICBzdHlsZT1cInBhZGRpbmc6NnB4IDE0cHg7Zm9udC1zaXplOjAuODVlbTtib3JkZXItcmFkaXVzOjZweCA2cHggMCAwO2JvcmRlcjoxcHggc29saWQgdmFyKC0tY3YtYm9yZGVyKTtib3JkZXItYm90dG9tOm5vbmU7YmFja2dyb3VuZDp2YXIoLS1jdi13aGl0ZSk7Y29sb3I6dmFyKC0tY3YtdGV4dC1wcmltYXJ5KTtmb250LXdlaWdodDo2MDA7Y3Vyc29yOnBvaW50ZXI7XCI+XG4gICAgICAgICAgICBEZXNjcmliZSBhIGNoYW5nZVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlkPVwibWR1LW1vZGUtZG9jdW1lbnRfaW5nZXN0aW9uLWJ0blwiIHJvbGU9XCJ0YWJcIiBhcmlhLXNlbGVjdGVkPVwiZmFsc2VcIlxuICAgICAgICAgICAgb25jbGljaz1cInNldE1hc3RlckRhdGFBaU1vZGUoJ2RvY3VtZW50X2luZ2VzdGlvbicpXCJcbiAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZzo2cHggMTRweDtmb250LXNpemU6MC44NWVtO2JvcmRlci1yYWRpdXM6NnB4IDZweCAwIDA7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1jdi1ib3JkZXIpO2JvcmRlci1ib3R0b206bm9uZTtiYWNrZ3JvdW5kOnZhcigtLWN2LWJnLXN1YnRsZSk7Y29sb3I6dmFyKC0tY3YtdGV4dC1zZWNvbmRhcnkpO2N1cnNvcjpwb2ludGVyO1wiPlxuICAgICAgICAgICAgUGFzdGUgb3IgdXBsb2FkIGEgZG9jdW1lbnRcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBpZD1cIm1kdS1ubF9pbnN0cnVjdGlvbi1pbnB1dC1hcmVhXCI+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cIm1kdS1ubC10ZXh0YXJlYVwiIHN0eWxlPVwiZm9udC1zaXplOjAuODJlbTtmb250LXdlaWdodDo2MDA7Y29sb3I6dmFyKC0tY3YtdGV4dC1tdXRlZCk7ZGlzcGxheTpibG9jazttYXJnaW4tYm90dG9tOjRweDtcIj5cbiAgICAgICAgICAgIERlc2NyaWJlIHRoZSBjaGFuZ2VcbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDx0ZXh0YXJlYSBpZD1cIm1kdS1ubC10ZXh0YXJlYVwiIHJvd3M9XCIzXCIgbWF4bGVuZ3RoPVwiNDAwMFwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gJnF1b3Q7SSBqdXN0IGZpbmlzaGVkIGEgcHJvamVjdCBhdCBBY21lIHVzaW5nIEt1YmVybmV0ZXMgXHUyMDE0IGFkZCBpdCB0byB0aGF0IHJvbGUncyBhY2hpZXZlbWVudHMuJnF1b3Q7XCJcbiAgICAgICAgICAgIG9ua2V5ZG93bj1cImlmKChldmVudC5jdHJsS2V5fHxldmVudC5tZXRhS2V5KSYmZXZlbnQua2V5PT09J0VudGVyJyl7ZXZlbnQucHJldmVudERlZmF1bHQoKTtzdWJtaXRNYXN0ZXJEYXRhQWlQcm9wb3NlKCk7fVwiXG4gICAgICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Ym94LXNpemluZzpib3JkZXItYm94O3BhZGRpbmc6OHB4O2JvcmRlcjoxcHggc29saWQgdmFyKC0tY3YtYm9yZGVyKTtib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6MC44OGVtO3Jlc2l6ZTp2ZXJ0aWNhbDtcIj48L3RleHRhcmVhPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGlkPVwibWR1LWRvY3VtZW50X2luZ2VzdGlvbi1pbnB1dC1hcmVhXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cIm1kdS1kb2MtdGV4dGFyZWFcIiBzdHlsZT1cImZvbnQtc2l6ZTowLjgyZW07Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOnZhcigtLWN2LXRleHQtbXV0ZWQpO2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWJvdHRvbTo0cHg7XCI+XG4gICAgICAgICAgICBQYXN0ZSBkb2N1bWVudCB0ZXh0LCBvciB1cGxvYWQgYSBmaWxlXG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8dGV4dGFyZWEgaWQ9XCJtZHUtZG9jLXRleHRhcmVhXCIgcm93cz1cIjRcIiBtYXhsZW5ndGg9XCI2MDAwMFwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlBhc3RlIGFuIG9sZCBDViBvciBMaW5rZWRJbiBleHBvcnQuLi5cIlxuICAgICAgICAgICAgb25rZXlkb3duPVwiaWYoKGV2ZW50LmN0cmxLZXl8fGV2ZW50Lm1ldGFLZXkpJiZldmVudC5rZXk9PT0nRW50ZXInKXtldmVudC5wcmV2ZW50RGVmYXVsdCgpO3N1Ym1pdE1hc3RlckRhdGFBaVByb3Bvc2UoKTt9XCJcbiAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTtib3gtc2l6aW5nOmJvcmRlci1ib3g7cGFkZGluZzo4cHg7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1jdi1ib3JkZXIpO2JvcmRlci1yYWRpdXM6NHB4O2ZvbnQtc2l6ZTowLjg4ZW07cmVzaXplOnZlcnRpY2FsO21hcmdpbi1ib3R0b206OHB4O1wiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgaWQ9XCJtZHUtZG9jLWZpbGUtaW5wdXRcIiBhY2NlcHQ9XCIudHh0LC5tZCwucnN0LC5odG1sLC5odG0sLnBkZiwuZG9jeCwucnRmXCJcbiAgICAgICAgICAgIG9uY2hhbmdlPVwiaGFuZGxlTWFzdGVyRGF0YUFpRmlsZVVwbG9hZChldmVudClcIiBhcmlhLWRlc2NyaWJlZGJ5PVwibWR1LXVwbG9hZC1kaXNjbG9zdXJlXCJcbiAgICAgICAgICAgIHN0eWxlPVwiZm9udC1zaXplOjAuODJlbTtcIj5cbiAgICAgICAgICA8cCBpZD1cIm1kdS11cGxvYWQtZGlzY2xvc3VyZVwiIHN0eWxlPVwiZm9udC1zaXplOjAuNzhlbTtjb2xvcjp2YXIoLS1jdi10ZXh0LXNlY29uZGFyeSk7bWFyZ2luOjZweCAwIDA7XCI+XG4gICAgICAgICAgICBUaGlzIGRvY3VtZW50IHdpbGwgYmUgc2VudCB0byB5b3VyIGNvbmZpZ3VyZWQgQUkgcHJvdmlkZXIgXHUyMDE0IHNlZSB0aGUgZGF0YSBoYW5kbGluZyBiYWRnZSBhYm92ZS5cbiAgICAgICAgICAgIEFuIG9sZCBDViBvciBMaW5rZWRJbiBleHBvcnQgY2FuIGNhcnJ5IG1vcmUgcGVyc29uYWwgaW5mb3JtYXRpb24gdGhhbiBhIGpvYiBkZXNjcmlwdGlvbi5cbiAgICAgICAgICA8L3A+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjhweDthbGlnbi1pdGVtczpjZW50ZXI7bWFyZ2luLXRvcDoxMnB4O1wiPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlkPVwibWR1LXByb3Bvc2UtYnRuXCIgb25jbGljaz1cInN1Ym1pdE1hc3RlckRhdGFBaVByb3Bvc2UoKVwiXG4gICAgICAgICAgICBzdHlsZT1cInBhZGRpbmc6OHB4IDE4cHg7Zm9udC1zaXplOjAuODhlbTtmb250LXdlaWdodDo2MDA7Y3Vyc29yOnBvaW50ZXI7YmFja2dyb3VuZDp2YXIoLS1jdi1hY2NlbnQpO2NvbG9yOnZhcigtLWN2LXdoaXRlKTtib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjZweDtcIj5cbiAgICAgICAgICAgIFByb3Bvc2UgVXBkYXRlXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWQ9XCJtZHUtZGlzY2FyZC1idG5cIiBvbmNsaWNrPVwiZGlzY2FyZE1hc3RlckRhdGFBaVByb3Bvc2FsKClcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtwYWRkaW5nOjhweCAxNHB4O2ZvbnQtc2l6ZTowLjg1ZW07Y3Vyc29yOnBvaW50ZXI7YmFja2dyb3VuZDp2YXIoLS1jdi13aGl0ZSk7Y29sb3I6dmFyKC0tY3YtdGV4dC1zZWNvbmRhcnkpO2JvcmRlcjoxcHggc29saWQgdmFyKC0tY3YtYm9yZGVyKTtib3JkZXItcmFkaXVzOjZweDtcIj5cbiAgICAgICAgICAgIERpc2NhcmRcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBpZD1cIm1kdS1zdGF0dXNcIiByb2xlPVwic3RhdHVzXCIgYXJpYS1saXZlPVwicG9saXRlXCIgc3R5bGU9XCJtYXJnaW4tdG9wOjEwcHg7Zm9udC1zaXplOjAuODVlbTtjb2xvcjp2YXIoLS1jdi10ZXh0LXNlY29uZGFyeSk7XCI+PC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJtZHUtY2xhcmlmaWNhdGlvbi1jb250YWluZXJcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cIm1kdS1yZXZpZXctYXJlYVwiIHN0eWxlPVwibWFyZ2luLXRvcDoxMnB4O1wiPjwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwibWR1LXJlc3VsdFwiIHN0eWxlPVwibWFyZ2luLXRvcDoxMnB4O1wiPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+YDtcbn1cblxuZnVuY3Rpb24gcmVuZGVyTWFzdGVyRGF0YUFpVXBkYXRlRGlzYWJsZWROb3RlKCkge1xuICByZXR1cm4gYFxuICAgIDxkaXYgc3R5bGU9XCJtYXJnaW46MTZweCAwO3BhZGRpbmc6MTBweCAxNHB4O2JhY2tncm91bmQ6dmFyKC0tY3YtYmctc3VidGxlKTtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWN2LWJvcmRlcik7Ym9yZGVyLXJhZGl1czo2cHg7Zm9udC1zaXplOjAuODVlbTtjb2xvcjp2YXIoLS1jdi10ZXh0LXNlY29uZGFyeSk7XCI+XG4gICAgICBcdUQ4M0VcdUREMTYgVXBkYXRlIHZpYSBBSSBpcyBhdmFpbGFibGUgYmVmb3JlIGFuYWx5c2lzIHN0YXJ0cyBvciBkdXJpbmcgcmVmaW5lbWVudC5cbiAgICA8L2Rpdj5gO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgUGFuZWwgZXhwYW5kL2NvbGxhcHNlICsgbW9kZSB0b2dnbGUgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIHRvZ2dsZU1hc3RlckRhdGFBaVBhbmVsKCkge1xuICBjb25zdCBib2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1wYW5lbC1ib2R5Jyk7XG4gIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtdG9nZ2xlLWJ0bicpO1xuICBjb25zdCBpY29uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS10b2dnbGUtaWNvbicpO1xuICBpZiAoIWJvZHkgfHwgIWJ0bikgcmV0dXJuO1xuICBjb25zdCBleHBhbmRlZCA9IGJvZHkuc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnO1xuICBib2R5LnN0eWxlLmRpc3BsYXkgPSBleHBhbmRlZCA/ICdub25lJyA6ICdibG9jayc7XG4gIGJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCBTdHJpbmcoIWV4cGFuZGVkKSk7XG4gIGlmIChpY29uKSBpY29uLnRleHRDb250ZW50ID0gZXhwYW5kZWQgPyAnXHUyNUI4JyA6ICdcdTI1QkUnO1xufVxuXG5mdW5jdGlvbiBzZXRNYXN0ZXJEYXRhQWlNb2RlKG1vZGUpIHtcbiAgX21kdU1vZGUgPSBtb2RlO1xuICBmb3IgKGNvbnN0IG0gb2YgWydubF9pbnN0cnVjdGlvbicsICdkb2N1bWVudF9pbmdlc3Rpb24nXSkge1xuICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBtZHUtbW9kZS0ke219LWJ0bmApO1xuICAgIGNvbnN0IGFyZWEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgbWR1LSR7bX0taW5wdXQtYXJlYWApO1xuICAgIGNvbnN0IGFjdGl2ZSA9IG0gPT09IG1vZGU7XG4gICAgaWYgKGJ0bikge1xuICAgICAgYnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1zZWxlY3RlZCcsIFN0cmluZyhhY3RpdmUpKTtcbiAgICAgIGJ0bi5zdHlsZS5iYWNrZ3JvdW5kID0gYWN0aXZlID8gJ3ZhcigtLWN2LXdoaXRlKScgOiAndmFyKC0tY3YtYmctc3VidGxlKSc7XG4gICAgICBidG4uc3R5bGUuY29sb3IgPSBhY3RpdmUgPyAndmFyKC0tY3YtdGV4dC1wcmltYXJ5KScgOiAndmFyKC0tY3YtdGV4dC1zZWNvbmRhcnkpJztcbiAgICAgIGJ0bi5zdHlsZS5mb250V2VpZ2h0ID0gYWN0aXZlID8gJzYwMCcgOiAnNDAwJztcbiAgICB9XG4gICAgaWYgKGFyZWEpIGFyZWEuc3R5bGUuZGlzcGxheSA9IGFjdGl2ZSA/ICdibG9jaycgOiAnbm9uZSc7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIERvY3VtZW50IHVwbG9hZCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gaGFuZGxlTWFzdGVyRGF0YUFpRmlsZVVwbG9hZChldmVudCkge1xuICBjb25zdCBmaWxlID0gZXZlbnQudGFyZ2V0LmZpbGVzICYmIGV2ZW50LnRhcmdldC5maWxlc1swXTtcbiAgaWYgKCFmaWxlKSByZXR1cm47XG4gIGNvbnN0IHN0YXR1c0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1zdGF0dXMnKTtcbiAgaWYgKHN0YXR1c0VsKSBzdGF0dXNFbC50ZXh0Q29udGVudCA9IGBSZWFkaW5nICR7ZmlsZS5uYW1lfVx1MjAyNmA7XG4gIHRyeSB7XG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ2ZpbGUnLCBmaWxlKTtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2goJy9hcGkvdXBsb2FkLWZpbGUnLCB7IG1ldGhvZDogJ1BPU1QnLCBib2R5OiBmb3JtRGF0YSB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcC5qc29uKCk7XG4gICAgaWYgKCFyZXNwLm9rIHx8IGRhdGEuZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihkYXRhLm1lc3NhZ2UgfHwgZGF0YS5lcnJvciB8fCBgU2VydmVyIGVycm9yICR7cmVzcC5zdGF0dXN9YCk7XG4gICAgfVxuICAgIGNvbnN0IHRleHRhcmVhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1kb2MtdGV4dGFyZWEnKTtcbiAgICBpZiAodGV4dGFyZWEpIHRleHRhcmVhLnZhbHVlID0gZGF0YS50ZXh0O1xuICAgIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSBgTG9hZGVkICR7ZGF0YS5jb250ZW50X2xlbmd0aC50b0xvY2FsZVN0cmluZygpfSBjaGFyYWN0ZXJzIGZyb20gXCIke2RhdGEuZmlsZW5hbWV9XCIuYDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLmVycm9yKCdoYW5kbGVNYXN0ZXJEYXRhQWlGaWxlVXBsb2FkOiBmYWlsZWQnLCBlcnIpO1xuICAgIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSBgRXJyb3IgcmVhZGluZyBmaWxlOiAke2Vyci5tZXNzYWdlfWA7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIFByb3Bvc2UgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIF9tZHVFbmRwb2ludEZvck1vZGUobW9kZSkge1xuICByZXR1cm4gbW9kZSA9PT0gJ25sX2luc3RydWN0aW9uJyA/ICcvYXBpL21hc3Rlci1kYXRhL25sLXVwZGF0ZS9wcm9wb3NlJyA6ICcvYXBpL21hc3Rlci1kYXRhL2luZ2VzdC1kb2N1bWVudC9wcm9wb3NlJztcbn1cblxuZnVuY3Rpb24gX21kdUlucHV0Rm9yTW9kZShtb2RlKSB7XG4gIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobW9kZSA9PT0gJ25sX2luc3RydWN0aW9uJyA/ICdtZHUtbmwtdGV4dGFyZWEnIDogJ21kdS1kb2MtdGV4dGFyZWEnKTtcbiAgcmV0dXJuIGVsID8gZWwudmFsdWUudHJpbSgpIDogJyc7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN1Ym1pdE1hc3RlckRhdGFBaVByb3Bvc2UoKSB7XG4gIGNvbnN0IGlucHV0ID0gX21kdUlucHV0Rm9yTW9kZShfbWR1TW9kZSk7XG4gIGNvbnN0IHN0YXR1c0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1zdGF0dXMnKTtcbiAgY29uc3QgcmV2aWV3QXJlYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtcmV2aWV3LWFyZWEnKTtcbiAgY29uc3QgcmVzdWx0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWR1LXJlc3VsdCcpO1xuICBjb25zdCBwcm9wb3NlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1wcm9wb3NlLWJ0bicpO1xuXG4gIGlmICghaW5wdXQpIHtcbiAgICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gX21kdU1vZGUgPT09ICdubF9pbnN0cnVjdGlvbidcbiAgICAgID8gJ1BsZWFzZSBkZXNjcmliZSB0aGUgY2hhbmdlIGZpcnN0LidcbiAgICAgIDogJ1BsZWFzZSBwYXN0ZSBvciB1cGxvYWQgZG9jdW1lbnQgdGV4dCBmaXJzdC4nO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChyZXZpZXdBcmVhKSByZXZpZXdBcmVhLmlubmVySFRNTCA9ICcnO1xuICBpZiAocmVzdWx0RWwpIHJlc3VsdEVsLmlubmVySFRNTCA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWR1LWNsYXJpZmljYXRpb24tY29udGFpbmVyJykuaW5uZXJIVE1MID0gJyc7XG4gIGlmIChwcm9wb3NlQnRuKSB7IHByb3Bvc2VCdG4uZGlzYWJsZWQgPSB0cnVlOyBwcm9wb3NlQnRuLnRleHRDb250ZW50ID0gJ0FuYWx5emluZ1x1MjAyNic7IH1cbiAgaWYgKHN0YXR1c0VsKSBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICdBbmFseXppbmdcdTIwMjYnO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgYm9keSA9IHsgcHJpb3JfY2xhcmlmaWNhdGlvbnM6IF9tZHVQcmlvckNsYXJpZmljYXRpb25zIH07XG4gICAgYm9keVtfbWR1TW9kZSA9PT0gJ25sX2luc3RydWN0aW9uJyA/ICdpbnN0cnVjdGlvbicgOiAndGV4dCddID0gaW5wdXQ7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKF9tZHVFbmRwb2ludEZvck1vZGUoX21kdU1vZGUpLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3AuanNvbigpO1xuXG4gICAgaWYgKCFyZXNwLm9rIHx8IGRhdGEub2sgPT09IGZhbHNlKSB7XG4gICAgICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gYEVycm9yOiAke2VzYyhkYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yJyl9YDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZGF0YS5yZXF1aXJlc19jbGFyaWZpY2F0aW9uKSB7XG4gICAgICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJyc7XG4gICAgICBfbWR1U2hvd0NsYXJpZmljYXRpb25EaWFsb2coZGF0YS5jbGFyaWZpY2F0aW9uX3F1ZXN0aW9uLCBpbnB1dCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgX21kdVByaW9yQ2xhcmlmaWNhdGlvbnMgPSBbXTtcbiAgICBjb25zdCBjaGFuZ2VzID0gZGF0YS5jaGFuZ2VzIHx8IFtdO1xuICAgIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnJztcblxuICAgIGlmIChjaGFuZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaWYgKHJldmlld0FyZWEpIHJldmlld0FyZWEuaW5uZXJIVE1MID0gYDxwIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtjb2xvcjp2YXIoLS1jdi10ZXh0LXNlY29uZGFyeSk7XCI+Tm8gY2hhbmdlcyBjb3VsZCBiZSBwcm9wb3NlZCBmcm9tIHRoYXQgXHUyMDE0IHRyeSBhZGRpbmcgbW9yZSBkZXRhaWwuPC9wPmA7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgX21kdVBlbmRpbmdQcm9wb3NhbCA9IHsgcHJvcG9zYWxJZDogZGF0YS5wcm9wb3NhbF9pZCwgc291cmNlOiBfbWR1TW9kZSwgY2hhbmdlcyB9O1xuICAgIF9tZHVSZW5kZXJSZXZpZXdBcmVhKCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy5lcnJvcignc3VibWl0TWFzdGVyRGF0YUFpUHJvcG9zZTogZmFpbGVkJywgZXJyKTtcbiAgICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gYE5ldHdvcmsgZXJyb3I6ICR7ZXNjKGVyci5tZXNzYWdlKX1gO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChwcm9wb3NlQnRuKSB7IHByb3Bvc2VCdG4uZGlzYWJsZWQgPSBmYWxzZTsgcHJvcG9zZUJ0bi50ZXh0Q29udGVudCA9ICdQcm9wb3NlIFVwZGF0ZSc7IH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkaXNjYXJkTWFzdGVyRGF0YUFpUHJvcG9zYWwoKSB7XG4gIF9tZHVQZW5kaW5nUHJvcG9zYWwgPSBudWxsO1xuICBfbWR1UHJpb3JDbGFyaWZpY2F0aW9ucyA9IFtdO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWR1LXJldmlldy1hcmVhJykuaW5uZXJIVE1MID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtcmVzdWx0JykuaW5uZXJIVE1MID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtZGlzY2FyZC1idG4nKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBjb25zdCBzdGF0dXNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtc3RhdHVzJyk7XG4gIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnRGlzY2FyZGVkLic7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBDbGFyaWZpY2F0aW9uIGRpYWxvZyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbi8vIE1vZGVsZWQgb24gc2hvd0NsYXJpZmljYXRpb25EaWFsb2coKSBpbiB3ZWIvbGF5b3V0LWluc3RydWN0aW9uLmpzLCBub3QgYVxuLy8gbGl0ZXJhbCBjb3B5LXBhc3RlIHBvcnQ6IHRoYXQgdmVyc2lvbiBoYXJkLWNvZGVzIGl0cyBtb3VudCBwb2ludCBhbmQgdXNlc1xuLy8gbm9uLW5hbWVzcGFjZWQgZWxlbWVudCBpZHMgKGxheW91dC1jbGFyaWZpY2F0aW9uLSopLCB3aGljaCB3b3VsZCBjb2xsaWRlXG4vLyB3aXRoIHRoaXMgcGFuZWwncyBvd24gaWRzIGlmIGJvdGggdGFicyBhcmUgcHJlc2VudCBpbiB0aGUgRE9NIGF0IG9uY2Vcbi8vIChDU1MtaGlkZGVuIHRhYnMgYXJlbid0IHVubW91bnRlZCkuIFRoaXMgdmVyc2lvbiBtb3VudHMgaW50byB0aGUgcGFuZWwnc1xuLy8gb3duICNtZHUtY2xhcmlmaWNhdGlvbi1jb250YWluZXIgYW5kIHVzZXMgYW4gbWR1LSogaWQgbmFtZXNwYWNlIHRocm91Z2hvdXQuXG5cbmZ1bmN0aW9uIF9tZHVTaG93Q2xhcmlmaWNhdGlvbkRpYWxvZyhxdWVzdGlvbiwgb3JpZ2luYWxJbnN0cnVjdGlvbikge1xuICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWR1LWNsYXJpZmljYXRpb24tY29udGFpbmVyJyk7XG4gIGlmICghY29udGFpbmVyKSB7XG4gICAgbG9nLndhcm4oJ19tZHVTaG93Q2xhcmlmaWNhdGlvbkRpYWxvZzogI21kdS1jbGFyaWZpY2F0aW9uLWNvbnRhaW5lciBub3QgZm91bmQnKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBvcmlnaW5hdGluZ0J0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtcHJvcG9zZS1idG4nKTtcblxuICBjb25zdCBwYW5lbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBwYW5lbC5pZCA9ICdtZHUtY2xhcmlmaWNhdGlvbi1wYW5lbCc7XG4gIHBhbmVsLnNldEF0dHJpYnV0ZSgncm9sZScsICdhbGVydCcpO1xuICBwYW5lbC5zdHlsZS5jc3NUZXh0ID0gJ2JhY2tncm91bmQ6dmFyKC0tY3Ytd2Fybi1iZyk7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1jdi13YXJuLWxpZ2h0KTtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjE0cHg7bWFyZ2luLXRvcDoxMHB4Oyc7XG4gIHBhbmVsLmlubmVySFRNTCA9IGBcbiAgICA8cCBzdHlsZT1cIm1hcmdpbjowIDAgNnB4O2ZvbnQtc2l6ZTowLjg1ZW07Y29sb3I6dmFyKC0tY3Ytd2Fybi10ZXh0KTtmb250LXdlaWdodDo2MDA7XCI+XG4gICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj5cdTI3NTM8L3NwYW4+IEFsbW9zdCB0aGVyZSBcdTIwMTQgYSBiaXQgbW9yZSBkZXRhaWwgd291bGQgaGVscDpcbiAgICA8L3A+XG4gICAgPHAgc3R5bGU9XCJtYXJnaW46MCAwIDEwcHg7Zm9udC1zaXplOjAuODhlbTtjb2xvcjp2YXIoLS1jdi13YXJuLXRleHQpO1wiPiR7ZXNjKHF1ZXN0aW9uKX08L3A+XG4gICAgPGxhYmVsIGZvcj1cIm1kdS1jbGFyaWZpY2F0aW9uLWlucHV0XCIgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjp2YXIoLS1jdi10ZXh0LW11dGVkKTtkaXNwbGF5OmJsb2NrO21hcmdpbi1ib3R0b206NHB4O1wiPlxuICAgICAgWW91ciBjbGFyaWZpY2F0aW9uOlxuICAgIDwvbGFiZWw+XG4gICAgPHRleHRhcmVhIGlkPVwibWR1LWNsYXJpZmljYXRpb24taW5wdXRcIiByb3dzPVwiMlwiXG4gICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Ym94LXNpemluZzpib3JkZXItYm94O3BhZGRpbmc6OHB4O2JvcmRlcjoxcHggc29saWQgdmFyKC0tY3Ytd2Fybi1saWdodCk7Ym9yZGVyLXJhZGl1czo0cHg7Zm9udC1zaXplOjAuODhlbTtyZXNpemU6dmVydGljYWw7XCJcbiAgICAgIGFyaWEtbGFiZWw9XCJDbGFyaWZpY2F0aW9uIGZvciBtYXN0ZXIgZGF0YSB1cGRhdGVcIj4ke2VzYyhvcmlnaW5hbEluc3RydWN0aW9uKX08L3RleHRhcmVhPlxuICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjhweDttYXJnaW4tdG9wOjhweDtcIj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlkPVwibWR1LWNsYXJpZmljYXRpb24tc3VibWl0XCJcbiAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOnZhcigtLWN2LXdhcm4pO2NvbG9yOnZhcigtLWN2LXdoaXRlKTtib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjZweCAxNHB4O2ZvbnQtc2l6ZTowLjg1ZW07Y3Vyc29yOnBvaW50ZXI7Zm9udC13ZWlnaHQ6NjAwO1wiPlxuICAgICAgICBTdWJtaXQgY2xhcmlmaWNhdGlvblxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBpZD1cIm1kdS1jbGFyaWZpY2F0aW9uLWNhbmNlbFwiXG4gICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDpub25lO2JvcmRlcjoxcHggc29saWQgdmFyKC0tY3Ytd2Fybik7Y29sb3I6dmFyKC0tY3Ytd2Fybi10ZXh0KTtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjZweCAxNHB4O2ZvbnQtc2l6ZTowLjg1ZW07Y3Vyc29yOnBvaW50ZXI7XCI+XG4gICAgICAgIENhbmNlbFxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+YDtcblxuICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG4gIGNvbnRhaW5lci5hcHBlbmRDaGlsZChwYW5lbCk7XG5cbiAgY29uc3QgY2xhcklucHV0ID0gcGFuZWwucXVlcnlTZWxlY3RvcignI21kdS1jbGFyaWZpY2F0aW9uLWlucHV0Jyk7XG4gIGNvbnN0IHN1Ym1pdEJ0biA9IHBhbmVsLnF1ZXJ5U2VsZWN0b3IoJyNtZHUtY2xhcmlmaWNhdGlvbi1zdWJtaXQnKTtcbiAgY29uc3QgY2FuY2VsQnRuID0gcGFuZWwucXVlcnlTZWxlY3RvcignI21kdS1jbGFyaWZpY2F0aW9uLWNhbmNlbCcpO1xuXG4gIGNsYXJJbnB1dC5mb2N1cygpO1xuICBjbGFySW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2UoY2xhcklucHV0LnZhbHVlLmxlbmd0aCwgY2xhcklucHV0LnZhbHVlLmxlbmd0aCk7XG5cbiAgY29uc3QgY2xvc2VBbmRSZXN0b3JlRm9jdXMgPSAoKSA9PiB7XG4gICAgcGFuZWwucmVtb3ZlKCk7XG4gICAgaWYgKG9yaWdpbmF0aW5nQnRuKSBvcmlnaW5hdGluZ0J0bi5mb2N1cygpO1xuICB9O1xuXG4gIHN1Ym1pdEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBjb25zdCByZWZpbmVkID0gY2xhcklucHV0LnZhbHVlLnRyaW0oKTtcbiAgICBpZiAocmVmaW5lZCkge1xuICAgICAgX21kdVByaW9yQ2xhcmlmaWNhdGlvbnMgPSBbLi4uX21kdVByaW9yQ2xhcmlmaWNhdGlvbnMsIHsgcXVlc3Rpb24sIGFuc3dlcjogcmVmaW5lZCB9XTtcbiAgICAgIGNvbnN0IGlucHV0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChfbWR1TW9kZSA9PT0gJ25sX2luc3RydWN0aW9uJyA/ICdtZHUtbmwtdGV4dGFyZWEnIDogJ21kdS1kb2MtdGV4dGFyZWEnKTtcbiAgICAgIGlmIChpbnB1dEVsKSBpbnB1dEVsLnZhbHVlID0gcmVmaW5lZDtcbiAgICB9XG4gICAgY2xvc2VBbmRSZXN0b3JlRm9jdXMoKTtcbiAgICBpZiAocmVmaW5lZCkgc3VibWl0TWFzdGVyRGF0YUFpUHJvcG9zZSgpO1xuICB9KTtcbiAgY2FuY2VsQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xvc2VBbmRSZXN0b3JlRm9jdXMpO1xuICBjbGFySW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChlKSA9PiB7XG4gICAgaWYgKGUua2V5ID09PSAnRW50ZXInICYmICFlLnNoaWZ0S2V5KSB7IGUucHJldmVudERlZmF1bHQoKTsgc3VibWl0QnRuLmNsaWNrKCk7IH1cbiAgICBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSBjYW5jZWxCdG4uY2xpY2soKTtcbiAgfSk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBSZXZpZXcgYXJlYSAocHJvcG9zYWwgcm93cykgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIF9tZHVDaGFuZ2VEaXNwbGF5VGV4dChjaGFuZ2UpIHtcbiAgY29uc3QgcHJvcG9zZWQgPSBjaGFuZ2UucHJvcG9zZWQ7XG4gIGlmICh0eXBlb2YgcHJvcG9zZWQgPT09ICdzdHJpbmcnKSByZXR1cm4gcHJvcG9zZWQ7XG4gIGlmIChwcm9wb3NlZCAmJiB0eXBlb2YgcHJvcG9zZWQgPT09ICdvYmplY3QnKSB7XG4gICAgaWYgKCd0ZXh0JyBpbiBwcm9wb3NlZCkgcmV0dXJuIHByb3Bvc2VkLnRleHQ7XG4gICAgaWYgKCduYW1lJyBpbiBwcm9wb3NlZCkgcmV0dXJuIHByb3Bvc2VkLm5hbWU7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHByb3Bvc2VkKTtcbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIF9tZHVGbGFnSHRtbChjaGFuZ2UpIHtcbiAgaWYgKGNoYW5nZS5wb3NzaWJsZV9kdXBsaWNhdGVfb2YpIHtcbiAgICByZXR1cm4gYDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjZweDtwYWRkaW5nOjZweCA4cHg7YmFja2dyb3VuZDp2YXIoLS1jdi13YXJuLWJnKTtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWN2LXdhcm4tYm9yZGVyKTtib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6MC44ZW07Y29sb3I6dmFyKC0tY3Ytd2Fybi10ZXh0KTtcIj5cbiAgICAgIFx1MjZBMCBwb3NzaWJsZSBkdXBsaWNhdGUgb2YgJHtlc2MoY2hhbmdlLnBvc3NpYmxlX2R1cGxpY2F0ZV9vZil9XG4gICAgPC9kaXY+YDtcbiAgfVxuICBpZiAoY2hhbmdlLnBlcnN1YXNpb25fZmxhZ3MgJiYgY2hhbmdlLnBlcnN1YXNpb25fZmxhZ3MubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTo2cHg7cGFkZGluZzo2cHggOHB4O2JhY2tncm91bmQ6dmFyKC0tY3Ytd2Fybi1iZyk7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1jdi13YXJuLWJvcmRlcik7Ym9yZGVyLXJhZGl1czo0cHg7Zm9udC1zaXplOjAuOGVtO2NvbG9yOnZhcigtLWN2LXdhcm4tdGV4dCk7XCI+XG4gICAgICBcdTI2QTAgcXVhbGl0eSBhZHZpc29yeTogJHtlc2MoY2hhbmdlLnBlcnN1YXNpb25fZmxhZ3Muam9pbignLCAnKSl9XG4gICAgPC9kaXY+YDtcbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIF9tZHVBcmlhU3VmZml4KGNoYW5nZSkge1xuICBjb25zdCBwYXJ0cyA9IFtdO1xuICBpZiAoY2hhbmdlLnBvc3NpYmxlX2R1cGxpY2F0ZV9vZikgcGFydHMucHVzaChgcG9zc2libGUgZHVwbGljYXRlIG9mICR7Y2hhbmdlLnBvc3NpYmxlX2R1cGxpY2F0ZV9vZn1gKTtcbiAgaWYgKGNoYW5nZS5wZXJzdWFzaW9uX2ZsYWdzICYmIGNoYW5nZS5wZXJzdWFzaW9uX2ZsYWdzLmxlbmd0aCkgcGFydHMucHVzaChgcXVhbGl0eSBhZHZpc29yeTogJHtjaGFuZ2UucGVyc3Vhc2lvbl9mbGFncy5qb2luKCcsICcpfWApO1xuICByZXR1cm4gcGFydHMubGVuZ3RoID8gYCwgJHtwYXJ0cy5qb2luKCcsICcpfWAgOiAnJztcbn1cblxuZnVuY3Rpb24gX21kdVJlbmRlclJldmlld0FyZWEoKSB7XG4gIGNvbnN0IHJldmlld0FyZWEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWR1LXJldmlldy1hcmVhJyk7XG4gIGNvbnN0IGRpc2NhcmRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWR1LWRpc2NhcmQtYnRuJyk7XG4gIGlmICghcmV2aWV3QXJlYSB8fCAhX21kdVBlbmRpbmdQcm9wb3NhbCkgcmV0dXJuO1xuXG4gIGNvbnN0IGNoYW5nZXMgPSBfbWR1UGVuZGluZ1Byb3Bvc2FsLmNoYW5nZXM7XG4gIGNvbnN0IHJvd3NIdG1sID0gY2hhbmdlcy5tYXAoKGMpID0+IHJlbmRlclByb3Bvc2FsUm93KHtcbiAgICBpZDogYy5pZCxcbiAgICB0eXBlTGFiZWw6IGMuc2VjdGlvbixcbiAgICBsYWJlbDogYy5sYWJlbCxcbiAgICBwcm9wb3NlZDogX21kdUNoYW5nZURpc3BsYXlUZXh0KGMpLFxuICAgIGRldGFpbFRleHQ6IGMucmF0aW9uYWxlLFxuICAgIGZsYWdIdG1sOiBfbWR1RmxhZ0h0bWwoYyksXG4gICAgY2hlY2tlZDogZmFsc2UsXG4gIH0sIHtcbiAgICBpZFByZWZpeDogJ21kdScsXG4gICAgY2hlY2tib3hEYXRhQXR0cjogJ21kdS1pZCcsXG4gICAgYXJpYUxhYmVsU3VmZml4OiBfbWR1QXJpYVN1ZmZpeChjKSxcbiAgfSkpLmpvaW4oJycpO1xuXG4gIGNvbnN0IGZsYWdnZWRDb3VudCA9IGNoYW5nZXMuZmlsdGVyKGMgPT4gYy5wb3NzaWJsZV9kdXBsaWNhdGVfb2YgfHwgKGMucGVyc3Vhc2lvbl9mbGFncyAmJiBjLnBlcnN1YXNpb25fZmxhZ3MubGVuZ3RoKSkubGVuZ3RoO1xuXG4gIHJldmlld0FyZWEuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgcm9sZT1cImdyb3VwXCIgYXJpYS1sYWJlbD1cIlByb3Bvc2VkIGNoYW5nZXMsICR7Y2hhbmdlcy5sZW5ndGh9IGl0ZW1zLCAwIHNlbGVjdGVkXCIgaWQ9XCJtZHUtcm93LWdyb3VwXCI+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2FsaWduLWl0ZW1zOmNlbnRlcjttYXJnaW4tYm90dG9tOjhweDtcIj5cbiAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2NvbG9yOnZhcigtLWN2LXRleHQtc2Vjb25kYXJ5KTtcIj4ke2NoYW5nZXMubGVuZ3RofSBwcm9wb3NlZCBjaGFuZ2Uke2NoYW5nZXMubGVuZ3RoID09PSAxID8gJycgOiAncyd9PC9zcGFuPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBvbmNsaWNrPVwic2VsZWN0TWFzdGVyRGF0YUFpTm9uRmxhZ2dlZCgpXCIgc3R5bGU9XCJmb250LXNpemU6MC44ZW07cGFkZGluZzo0cHggMTBweDtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWN2LWJvcmRlcik7Ym9yZGVyLXJhZGl1czo0cHg7YmFja2dyb3VuZDp2YXIoLS1jdi13aGl0ZSk7Y29sb3I6dmFyKC0tY3YtdGV4dC1wcmltYXJ5KTtjdXJzb3I6cG9pbnRlcjtcIj5cbiAgICAgICAgICBTZWxlY3QgYWxsIG5vbi1mbGFnZ2VkXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8dGFibGUgc3R5bGU9XCJ3aWR0aDoxMDAlO2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTtcIj4ke3Jvd3NIdG1sfTwvdGFibGU+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBpZD1cIm1kdS1zZWxlY3Rpb24tbGl2ZVwiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiIGNsYXNzPVwic3Itb25seVwiIHN0eWxlPVwicG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O2hlaWdodDoxcHg7b3ZlcmZsb3c6aGlkZGVuO1wiPjwvZGl2PlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlkPVwibWR1LWNvbmZpcm0tYnRuXCIgb25jbGljaz1cImNvbmZpcm1NYXN0ZXJEYXRhQWlVcGRhdGUoKVwiIGRpc2FibGVkXG4gICAgICBzdHlsZT1cIm1hcmdpbi10b3A6MTBweDtwYWRkaW5nOjlweCAyMHB4O2ZvbnQtc2l6ZTowLjllbTtmb250LXdlaWdodDo2MDA7Y3Vyc29yOm5vdC1hbGxvd2VkO2JhY2tncm91bmQ6dmFyKC0tY3Ytc2xhdGUtMzAwKTtjb2xvcjp2YXIoLS1jdi13aGl0ZSk7Ym9yZGVyOm5vbmU7Ym9yZGVyLXJhZGl1czo2cHg7XCI+XG4gICAgICBDb25maXJtIGFuZCBXcml0ZVxuICAgIDwvYnV0dG9uPlxuICAgICR7ZmxhZ2dlZENvdW50ID8gYDxwIHN0eWxlPVwiZm9udC1zaXplOjAuNzhlbTtjb2xvcjp2YXIoLS1jdi13YXJuLXRleHQpO21hcmdpbi10b3A6NnB4O1wiPiR7ZmxhZ2dlZENvdW50fSBpdGVtJHtmbGFnZ2VkQ291bnQgPT09IDEgPyAnJyA6ICdzJ30gZmxhZ2dlZCBmb3IgcmV2aWV3IGFib3ZlLjwvcD5gIDogJyd9YDtcblxuICBpZiAoZGlzY2FyZEJ0bikgZGlzY2FyZEJ0bi5zdHlsZS5kaXNwbGF5ID0gJ2lubGluZS1ibG9jayc7XG5cbiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1yZXZpZXctYXJlYScpO1xuICBhdHRhY2hQcm9wb3NhbFJvd0xpc3RlbmVycyhjb250YWluZXIsICdtZHUnKTtcbiAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W2RhdGEtbWR1LWlkXScpLmZvckVhY2goKGNiKSA9PiB7XG4gICAgY2IuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgX21kdVVwZGF0ZUNvbmZpcm1CdXR0b25TdGF0ZSk7XG4gIH0pO1xuICBfbWR1VXBkYXRlQ29uZmlybUJ1dHRvblN0YXRlKCk7XG59XG5cbmZ1bmN0aW9uIF9tZHVVcGRhdGVDb25maXJtQnV0dG9uU3RhdGUoKSB7XG4gIGNvbnN0IGNoZWNrZWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtkYXRhLW1kdS1pZF06Y2hlY2tlZCcpO1xuICBjb25zdCBjb25maXJtQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1jb25maXJtLWJ0bicpO1xuICBjb25zdCBncm91cCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtcm93LWdyb3VwJyk7XG4gIGNvbnN0IGxpdmVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtc2VsZWN0aW9uLWxpdmUnKTtcbiAgY29uc3QgdG90YWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtkYXRhLW1kdS1pZF0nKS5sZW5ndGg7XG4gIGlmIChjb25maXJtQnRuKSB7XG4gICAgY29uZmlybUJ0bi5kaXNhYmxlZCA9IGNoZWNrZWQubGVuZ3RoID09PSAwO1xuICAgIGNvbmZpcm1CdG4uc3R5bGUuY3Vyc29yID0gY2hlY2tlZC5sZW5ndGggPT09IDAgPyAnbm90LWFsbG93ZWQnIDogJ3BvaW50ZXInO1xuICAgIGNvbmZpcm1CdG4uc3R5bGUuYmFja2dyb3VuZCA9IGNoZWNrZWQubGVuZ3RoID09PSAwID8gJ3ZhcigtLWN2LXNsYXRlLTMwMCknIDogJ3ZhcigtLWN2LXN1Y2Nlc3MtbWQpJztcbiAgfVxuICBpZiAoZ3JvdXApIGdyb3VwLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIGBQcm9wb3NlZCBjaGFuZ2VzLCAke3RvdGFsfSBpdGVtcywgJHtjaGVja2VkLmxlbmd0aH0gc2VsZWN0ZWRgKTtcbiAgaWYgKGxpdmVFbCkgbGl2ZUVsLnRleHRDb250ZW50ID0gYCR7Y2hlY2tlZC5sZW5ndGh9IG9mICR7dG90YWx9IHNlbGVjdGVkYDtcbn1cblxuZnVuY3Rpb24gc2VsZWN0TWFzdGVyRGF0YUFpTm9uRmxhZ2dlZCgpIHtcbiAgaWYgKCFfbWR1UGVuZGluZ1Byb3Bvc2FsKSByZXR1cm47XG4gIGNvbnN0IGZsYWdnZWRJZHMgPSBuZXcgU2V0KFxuICAgIF9tZHVQZW5kaW5nUHJvcG9zYWwuY2hhbmdlc1xuICAgICAgLmZpbHRlcihjID0+IGMucG9zc2libGVfZHVwbGljYXRlX29mIHx8IChjLnBlcnN1YXNpb25fZmxhZ3MgJiYgYy5wZXJzdWFzaW9uX2ZsYWdzLmxlbmd0aCkpXG4gICAgICAubWFwKGMgPT4gYy5pZCksXG4gICk7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W2RhdGEtbWR1LWlkXScpLmZvckVhY2goKGNiKSA9PiB7XG4gICAgaWYgKCFmbGFnZ2VkSWRzLmhhcyhjYi5kYXRhc2V0Lm1kdUlkKSkgY2IuY2hlY2tlZCA9IHRydWU7XG4gIH0pO1xuICBfbWR1VXBkYXRlQ29uZmlybUJ1dHRvblN0YXRlKCk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBDb25maXJtIGFuZCB3cml0ZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gY29uZmlybU1hc3RlckRhdGFBaVVwZGF0ZSgpIHtcbiAgaWYgKCFfbWR1UGVuZGluZ1Byb3Bvc2FsKSByZXR1cm47XG4gIGNvbnN0IHNlbGVjdGVkSWRzID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtkYXRhLW1kdS1pZF06Y2hlY2tlZCcpKS5tYXAoY2IgPT4gY2IuZGF0YXNldC5tZHVJZCk7XG4gIGlmIChzZWxlY3RlZElkcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBjb25zdCBzb3VyY2VMYWJlbCA9IF9tZHVQZW5kaW5nUHJvcG9zYWwuc291cmNlID09PSAnbmxfaW5zdHJ1Y3Rpb24nID8gJ3lvdXIgaW5zdHJ1Y3Rpb24nIDogJ3RoZSB1cGxvYWRlZCBkb2N1bWVudCc7XG4gIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0ICh0eXBlb2Ygc2hvd0NvbmZpcm1Nb2RhbCA9PT0gJ2Z1bmN0aW9uJ1xuICAgID8gc2hvd0NvbmZpcm1Nb2RhbChcbiAgICAgICAgYFdyaXRlICR7c2VsZWN0ZWRJZHMubGVuZ3RofSBjaGFuZ2Uke3NlbGVjdGVkSWRzLmxlbmd0aCA9PT0gMSA/ICcnIDogJ3MnfSB0byBNYXN0ZXIgQ1Y/YCxcbiAgICAgICAgYFRoZXNlICR7c2VsZWN0ZWRJZHMubGVuZ3RofSBjaGFuZ2Uke3NlbGVjdGVkSWRzLmxlbmd0aCA9PT0gMSA/ICcnIDogJ3MnfSB3ZXJlIHByb3Bvc2VkIGJ5IEFJIGZyb20gJHtzb3VyY2VMYWJlbH0gYW5kIGhhdmUgbm90IGJlZW4gcHJldmlvdXNseSByZXZpZXdlZC4gYCArXG4gICAgICAgIGBDb25maXJtaW5nIHdpbGwgcGVybWFuZW50bHkgd3JpdGUgdGhlbSB0byBNYXN0ZXJfQ1ZfRGF0YS5qc29uLiBBIGJhY2t1cCB3aWxsIGJlIGNyZWF0ZWQgZmlyc3QgXHUyMDE0IHNlZSBcdUQ4M0RcdURENTAgQmFja3VwcyBhYm92ZSB0byByZXN0b3JlIGl0IGlmIG5lZWRlZC5gLFxuICAgICAgKVxuICAgIDogUHJvbWlzZS5yZXNvbHZlKHdpbmRvdy5jb25maXJtKGBXcml0ZSAke3NlbGVjdGVkSWRzLmxlbmd0aH0gY2hhbmdlKHMpIHRvIE1hc3RlciBDVj8gVGhpcyB3aWxsIHBlcm1hbmVudGx5IHdyaXRlIGNoYW5nZXMgdG8gTWFzdGVyX0NWX0RhdGEuanNvbi5gKSkpO1xuXG4gIGlmICghY29uZmlybWVkKSByZXR1cm47XG5cbiAgY29uc3QgY29uZmlybUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtY29uZmlybS1idG4nKTtcbiAgY29uc3QgcmVzdWx0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWR1LXJlc3VsdCcpO1xuICBpZiAoY29uZmlybUJ0bikgeyBjb25maXJtQnRuLmRpc2FibGVkID0gdHJ1ZTsgY29uZmlybUJ0bi50ZXh0Q29udGVudCA9ICdXcml0aW5nXHUyMDI2JzsgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL2NvbmZpcm0tdXBkYXRlJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcHJvcG9zYWxfaWQ6IF9tZHVQZW5kaW5nUHJvcG9zYWwucHJvcG9zYWxJZCwgc2VsZWN0ZWRfaWRzOiBzZWxlY3RlZElkcyB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcC5qc29uKCk7XG5cbiAgICBpZiAoZGF0YS5vayA9PT0gZmFsc2UgJiYgZGF0YS5zdGFsZV9jaGFuZ2VzKSB7XG4gICAgICBfbWR1SGFuZGxlU3RhbGVDaGFuZ2VzKGRhdGEuc3RhbGVfY2hhbmdlcywgZGF0YS5hcHBsaWNhYmxlX2NoYW5nZXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWRhdGEub2spIHtcbiAgICAgIGlmIChyZXN1bHRFbCkgcmVzdWx0RWwuaW5uZXJIVE1MID0gYDxwIGNsYXNzPVwiZXJyb3ItbWVzc2FnZVwiPkNvbmZpcm0gZmFpbGVkOiAke2VzYyhkYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yJyl9PC9wPmA7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY2hhbmdlc0J5SWQgPSBPYmplY3QuZnJvbUVudHJpZXMoX21kdVBlbmRpbmdQcm9wb3NhbC5jaGFuZ2VzLm1hcChjID0+IFtjLmlkLCBjXSkpO1xuICAgIGNvbnN0IHdyaXR0ZW5MaW5lcyA9IChkYXRhLmRpZmZfc3VtbWFyeSB8fCBbXSlcbiAgICAgIC5maWx0ZXIoZCA9PiBkLmFwcGxpZWQpXG4gICAgICAubWFwKGQgPT4gYDxsaT4ke2VzYyhkLmxhYmVsIHx8IGQuaWQpfSR7Y2hhbmdlc0J5SWRbZC5pZF0/LnJhdGlvbmFsZSA/IGAgXHUyMDE0ICR7ZXNjKGNoYW5nZXNCeUlkW2QuaWRdLnJhdGlvbmFsZSl9YCA6ICcnfTwvbGk+YClcbiAgICAgIC5qb2luKCcnKTtcblxuICAgIGNvbnN0IGNvbW1pdEluZm8gPSBkYXRhLmNvbW1pdF9oYXNoID8gYCAoY29tbWl0ICR7ZXNjKGRhdGEuY29tbWl0X2hhc2gpfSlgIDogJyc7XG4gICAgY29uc3QgZ2l0V2FybmluZyA9IGRhdGEuZ2l0X2Vycm9yXG4gICAgICA/IGA8cCBzdHlsZT1cImNvbG9yOnZhcigtLWN2LXdhcm4tdGV4dCk7Zm9udC1zaXplOjAuODdlbTtcIj5cdTI2QTBcdUZFMEYgR2l0IGNvbW1pdCBza2lwcGVkOiAke2VzYyhkYXRhLmdpdF9lcnJvcj8ubWVzc2FnZSB8fCBkYXRhLmdpdF9lcnJvcil9PC9wPmBcbiAgICAgIDogJyc7XG4gICAgY29uc3QgcHVzaFdhcm5pbmcgPSBkYXRhLnB1c2hfZXJyb3JcbiAgICAgID8gYDxwIHN0eWxlPVwiY29sb3I6dmFyKC0tY3Ytd2Fybi10ZXh0KTtmb250LXNpemU6MC44N2VtO1wiPlx1MjZBMFx1RkUwRiBHaXQgcHVzaCBza2lwcGVkOiAke2VzYyhkYXRhLnB1c2hfZXJyb3IpfTwvcD5gXG4gICAgICA6ICcnO1xuXG4gICAgaWYgKHJlc3VsdEVsKSB7XG4gICAgICByZXN1bHRFbC5pbm5lckhUTUwgPSBgXG4gICAgICAgIDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOnZhcigtLWN2LXN1Y2Nlc3MtYmcpO2JvcmRlcjoxcHggc29saWQgdmFyKC0tY3Ytc3VjY2Vzcy1ib3JkZXIpO2JvcmRlci1yYWRpdXM6NnB4O3BhZGRpbmc6MTJweCAxNnB4O1wiPlxuICAgICAgICAgIDxwIHN0eWxlPVwiY29sb3I6dmFyKC0tY3Ytc3VjY2Vzcy10ZXh0KTtmb250LXdlaWdodDo2MDA7bWFyZ2luOjAgMCA2cHg7XCI+XG4gICAgICAgICAgICBcdTI3MDUgJHtkYXRhLndyaXR0ZW5fY291bnR9IGl0ZW0ke2RhdGEud3JpdHRlbl9jb3VudCA9PT0gMSA/ICcnIDogJ3MnfSB3cml0dGVuIHRvIG1hc3RlciBDViR7Y29tbWl0SW5mb30uXG4gICAgICAgICAgPC9wPlxuICAgICAgICAgICR7d3JpdHRlbkxpbmVzID8gYDx1bCBzdHlsZT1cImZvbnQtc2l6ZTowLjgyZW07Y29sb3I6dmFyKC0tY3YtdGV4dC1tdXRlZCk7bWFyZ2luOjRweCAwIDA7cGFkZGluZy1sZWZ0OjE4cHg7XCI+JHt3cml0dGVuTGluZXN9PC91bD5gIDogJyd9XG4gICAgICAgICAgJHtnaXRXYXJuaW5nfSR7cHVzaFdhcm5pbmd9XG4gICAgICAgIDwvZGl2PmA7XG4gICAgfVxuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1yZXZpZXctYXJlYScpLmlubmVySFRNTCA9ICcnO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtZGlzY2FyZC1idG4nKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIF9tZHVQZW5kaW5nUHJvcG9zYWwgPSBudWxsO1xuICAgIF9tZHVQcmlvckNsYXJpZmljYXRpb25zID0gW107XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy5lcnJvcignY29uZmlybU1hc3RlckRhdGFBaVVwZGF0ZTogZmFpbGVkJywgZXJyKTtcbiAgICBpZiAocmVzdWx0RWwpIHJlc3VsdEVsLmlubmVySFRNTCA9IGA8cCBjbGFzcz1cImVycm9yLW1lc3NhZ2VcIj5OZXR3b3JrIGVycm9yOiAke2VzYyhlcnIubWVzc2FnZSl9PC9wPmA7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKGNvbmZpcm1CdG4pIHsgY29uZmlybUJ0bi5kaXNhYmxlZCA9IGZhbHNlOyBjb25maXJtQnRuLnRleHRDb250ZW50ID0gJ0NvbmZpcm0gYW5kIFdyaXRlJzsgfVxuICB9XG59XG5cbmZ1bmN0aW9uIF9tZHVIYW5kbGVTdGFsZUNoYW5nZXMoc3RhbGVDaGFuZ2VzLCBhcHBsaWNhYmxlQ2hhbmdlcykge1xuICBjb25zdCByZXN1bHRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtcmVzdWx0Jyk7XG4gIGNvbnN0IHN0YWxlSWRzID0gbmV3IFNldChzdGFsZUNoYW5nZXMubWFwKHMgPT4gcy5pZCkpO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W2RhdGEtbWR1LWlkXScpLmZvckVhY2goKGNiKSA9PiB7XG4gICAgaWYgKHN0YWxlSWRzLmhhcyhjYi5kYXRhc2V0Lm1kdUlkKSkge1xuICAgICAgY2IuY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgY2IuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgY29uc3Qgcm93ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYG1kdS1yb3ctJHtjYi5kYXRhc2V0Lm1kdUlkfWApO1xuICAgICAgaWYgKHJvdykgcm93LnN0eWxlLm9wYWNpdHkgPSAnMC41JztcbiAgICB9XG4gIH0pO1xuICBfbWR1VXBkYXRlQ29uZmlybUJ1dHRvblN0YXRlKCk7XG5cbiAgY29uc3QgbGl2ZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1zZWxlY3Rpb24tbGl2ZScpO1xuICBjb25zdCBzdW1tYXJ5ID0gYCR7c3RhbGVDaGFuZ2VzLmxlbmd0aH0gaXRlbSR7c3RhbGVDaGFuZ2VzLmxlbmd0aCA9PT0gMSA/ICcgaXMnIDogJ3MgYXJlJ30gbm8gbG9uZ2VyIHZhbGlkIGFuZCAke3N0YWxlQ2hhbmdlcy5sZW5ndGggPT09IDEgPyAnd2FzJyA6ICd3ZXJlJ30gZGVzZWxlY3RlZDsgcmV2aWV3IGFuZCBjb25maXJtIGFnYWluLmA7XG4gIGlmIChsaXZlRWwpIGxpdmVFbC50ZXh0Q29udGVudCA9IHN1bW1hcnk7XG5cbiAgY29uc3Qgc3RhbGVMaXN0ID0gc3RhbGVDaGFuZ2VzLm1hcChzID0+IGA8bGk+JHtlc2Mocy5sYWJlbCB8fCBzLmlkKX0gXHUyMDE0ICR7ZXNjKHMucmVhc29uKX08L2xpPmApLmpvaW4oJycpO1xuICBpZiAocmVzdWx0RWwpIHtcbiAgICByZXN1bHRFbC5pbm5lckhUTUwgPSBgXG4gICAgICA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDp2YXIoLS1jdi1iZy1zdWJ0bGUpO2JvcmRlcjoxcHggc29saWQgdmFyKC0tY3Ytc2xhdGUtMzAwKTtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjEycHggMTZweDtcIj5cbiAgICAgICAgPHAgc3R5bGU9XCJjb2xvcjp2YXIoLS1jdi10ZXh0LW11dGVkKTtmb250LXdlaWdodDo2MDA7bWFyZ2luOjAgMCA2cHg7XCI+Tm90aGluZyB3YXMgd3JpdHRlbiBcdTIwMTQgJHtzdW1tYXJ5fTwvcD5cbiAgICAgICAgPHVsIHN0eWxlPVwiZm9udC1zaXplOjAuODJlbTtjb2xvcjp2YXIoLS1jdi10ZXh0LW11dGVkKTttYXJnaW46NHB4IDAgMDtwYWRkaW5nLWxlZnQ6MThweDtcIj4ke3N0YWxlTGlzdH08L3VsPlxuICAgICAgICA8cCBzdHlsZT1cImZvbnQtc2l6ZTowLjgyZW07Y29sb3I6dmFyKC0tY3YtdGV4dC1zZWNvbmRhcnkpO21hcmdpbi10b3A6OHB4O1wiPiR7YXBwbGljYWJsZUNoYW5nZXMubGVuZ3RofSBpdGVtJHthcHBsaWNhYmxlQ2hhbmdlcy5sZW5ndGggPT09IDEgPyAnJyA6ICdzJ30gJHthcHBsaWNhYmxlQ2hhbmdlcy5sZW5ndGggPT09IDEgPyAnaXMnIDogJ2FyZSd9IHN0aWxsIHZhbGlkIFx1MjAxNCBjbGljayBcIkNvbmZpcm0gYW5kIFdyaXRlXCIgYWdhaW4gdG8gYXBwbHkganVzdCB0aG9zZS48L3A+XG4gICAgICA8L2Rpdj5gO1xuICB9XG59XG5cbi8vIE5vdGU6IG5vIGNsaWVudC1zaWRlIFwicmVzdW1lIGFuIGluLXByb2dyZXNzIHByb3Bvc2FsXCIgYWZmb3JkYW5jZSBcdTIwMTQgdGhlXG4vLyBwYW5lbCByZXNldHMgaXRzIHN0YXRlIG9uIGV2ZXJ5IHJlbmRlciAoc2VlIF9tZHVSZXNldFN0YXRlLCBjYWxsZWQgZnJvbVxuLy8gcmVuZGVyTWFzdGVyRGF0YUFpVXBkYXRlUGFuZWwpLCBhbmQgcGVuZGluZyBwcm9wb3NhbHMgbGl2ZSBzZXJ2ZXItc2lkZVxuLy8ga2V5ZWQgYnkgcHJvcG9zYWxfaWQgd2l0aCB0aGVpciBvd24gVFRMIChzZWUgbWFzdGVyX2RhdGFfcm91dGVzLnB5KS5cbi8vIFJlc3VtaW5nIHdvdWxkIHJlcXVpcmUgYSBzZXNzaW9uLXN0YXR1cy1kcml2ZW4gY2hlY2sgZm9yIGFuIGV4aXN0aW5nXG4vLyBwZW5kaW5nIHByb3Bvc2FsIGJlZm9yZSB0aGUgcGFuZWwgZmlyc3QgcmVuZGVyczsgdHJhY2tlZCBhcyBhIGtub3duIHYxXG4vLyBsaW1pdGF0aW9uLCBub3Qgc2lsZW50bHkgYWJzZW50LlxuXG5leHBvcnQge1xuICByZW5kZXJNYXN0ZXJEYXRhQWlVcGRhdGVQYW5lbCxcbiAgcmVuZGVyTWFzdGVyRGF0YUFpVXBkYXRlRGlzYWJsZWROb3RlLFxuICB0b2dnbGVNYXN0ZXJEYXRhQWlQYW5lbCxcbiAgc2V0TWFzdGVyRGF0YUFpTW9kZSxcbiAgaGFuZGxlTWFzdGVyRGF0YUFpRmlsZVVwbG9hZCxcbiAgc3VibWl0TWFzdGVyRGF0YUFpUHJvcG9zZSxcbiAgZGlzY2FyZE1hc3RlckRhdGFBaVByb3Bvc2FsLFxuICBzZWxlY3RNYXN0ZXJEYXRhQWlOb25GbGFnZ2VkLFxuICBjb25maXJtTWFzdGVyRGF0YUFpVXBkYXRlLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL21hc3Rlci1jdi5qc1xuICogTWFzdGVyIENWIG1hbmFnZW1lbnQgdGFiOiBmZXRjaCwgcmVuZGVyLCBhbmQgQ1JVRCBmb3IgcGVyc29uYWwgaW5mbyxcbiAqIGV4cGVyaWVuY2VzLCBza2lsbHMsIGVkdWNhdGlvbiwgYXdhcmRzLCBhY2hpZXZlbWVudHMsIHN1bW1hcmllcy5cbiAqXG4gKiBEZXBlbmRlbmNpZXMgKHJlc29sdmVkIHRocm91Z2ggZ2xvYmFsVGhpcyBhdCBydW50aW1lKTpcbiAqICAgZXNjYXBlSHRtbCwgc2hvd1RvYXN0LCBzaG93QWxlcnRNb2RhbCwgY29uZmlybURpYWxvZyxcbiAqICAgYXBwZW5kTG9hZGluZ01lc3NhZ2UsIHJlbW92ZUxvYWRpbmdNZXNzYWdlLFxuICogICBzZXRMb2FkaW5nLCBzd2l0Y2hUYWIsIGFwcGVuZE1lc3NhZ2UsXG4gKiAgIHJlbmRlck1hc3RlckRhdGFBaVVwZGF0ZVBhbmVsLCByZW5kZXJNYXN0ZXJEYXRhQWlVcGRhdGVEaXNhYmxlZE5vdGVcbiAqICAgICAoZnJvbSB3ZWIvbWFzdGVyLWRhdGEtYWktdXBkYXRlLmpzLCBHQVAtMDEpXG4gKi9cblxubGV0IF9tYXN0ZXJDaGFuZ2VOb3RpY2UgPSAnJztcblxuLy8gVHJhY2tzIHRoZSBhY3RpdmUgcmVuZGVyIHRhcmdldDogbW9kYWwgYm9keSBkaXYgd2hlbiBvcGVuZWQgZnJvbSBoZWFkZXIsXG4vLyBudWxsIHdoZW4gcmVuZGVyZWQgaW50byB0aGUgbm9ybWFsIHRhYiB2aWV3ZXIuXG5sZXQgX21hc3RlckN2QWN0aXZlQ29udGFpbmVyID0gbnVsbDtcblxuLy8gRmlsZW5hbWUgb2YgdGhlIHNhZmV0eSBiYWNrdXAgY3JlYXRlZCBieSB0aGUgbW9zdCByZWNlbnQgdW5kbywgcmVzdG9yYWJsZVxuLy8gdmlhIHJlZG8uIFNpbmdsZS1sZXZlbCBieSBkZXNpZ24gKEdBUC0xOSAxNi43IHYxIHNjb3BlKSBcdTIwMTQgZnVydGhlci1iYWNrXG4vLyByZWNvdmVyeSByZW1haW5zIGF2YWlsYWJsZSB2aWEgdGhlIGZ1bGwgXCJcdUQ4M0RcdURENTAgQmFja3Vwc1wiIGhpc3RvcnkgbW9kYWwuXG4vLyBSZXNldCB0byBudWxsIGF0IHRoZSB0b3Agb2YgZXZlcnkgcG9wdWxhdGVNYXN0ZXJUYWIoKSByZS1yZW5kZXIgc28gYW55XG4vLyBvdGhlciBzYXZlIGFjdGlvbiAoc3RydWN0dXJlZCBlZGl0LCBBSS11cGRhdGUgY29uZmlybSwgaGFydmVzdCBhcHBseSlcbi8vIGludmFsaWRhdGVzIGEgc3RhbGUgcmVkbyB0YXJnZXQuIHVuZG9NYXN0ZXJEYXRhQ2hhbmdlKCkgc2V0c1xuLy8gX21hc3RlckN2U3VwcHJlc3NSZWRvUmVzZXQgYmVmb3JlIGl0cyBvd24gcG9wdWxhdGVNYXN0ZXJUYWIoKSBjYWxsIHNvIGl0c1xuLy8gZnJlc2hseS1zZXQgcmVkbyB0YXJnZXQgc3Vydml2ZXMgdGhhdCBvbmUgcmVuZGVyLlxubGV0IF9tYXN0ZXJDdlJlZG9CYWNrdXAgPSBudWxsO1xubGV0IF9tYXN0ZXJDdlN1cHByZXNzUmVkb1Jlc2V0ID0gZmFsc2U7XG5cbmZ1bmN0aW9uIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2Uoc2VjdGlvbiwgYWN0aW9uKSB7XG4gIGNvbnN0IGNsZWFuU2VjdGlvbiA9IFN0cmluZyhzZWN0aW9uIHx8ICdNYXN0ZXIgQ1YnKS50cmltKCk7XG4gIGNvbnN0IGNsZWFuQWN0aW9uID0gU3RyaW5nKGFjdGlvbiB8fCAndXBkYXRlZCcpLnRyaW0oKTtcbiAgX21hc3RlckNoYW5nZU5vdGljZSA9IGAke2NsZWFuU2VjdGlvbn0gJHtjbGVhbkFjdGlvbn0uYDtcbn1cblxuZnVuY3Rpb24gX3JlbmRlck1hc3RlckNoYW5nZU5vdGljZSgpIHtcbiAgaWYgKCFfbWFzdGVyQ2hhbmdlTm90aWNlKSByZXR1cm4gJyc7XG4gIHJldHVybiBgXG4gICAgPGRpdiBzdHlsZT1cIm1hcmdpbjoxMnB4IDAgMThweDtwYWRkaW5nOjEwcHggMTJweDtib3JkZXI6MXB4IHNvbGlkICNiYmY3ZDA7YmFja2dyb3VuZDojZjBmZGY0O2JvcmRlci1yYWRpdXM6OHB4O2NvbG9yOiMxNDUzMmQ7XCI+XG4gICAgICA8c3Ryb25nPkxhc3Qgc2F2ZWQgY2hhbmdlOjwvc3Ryb25nPiAke2VzY2FwZUh0bWwoX21hc3RlckNoYW5nZU5vdGljZSl9XG4gICAgPC9kaXY+XG4gIGA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHBvcHVsYXRlTWFzdGVyVGFiKGNvbnRhaW5lciA9IG51bGwpIHtcbiAgaWYgKGNvbnRhaW5lciAhPT0gbnVsbCkgX21hc3RlckN2QWN0aXZlQ29udGFpbmVyID0gY29udGFpbmVyO1xuICBpZiAoX21hc3RlckN2U3VwcHJlc3NSZWRvUmVzZXQpIHtcbiAgICBfbWFzdGVyQ3ZTdXBwcmVzc1JlZG9SZXNldCA9IGZhbHNlO1xuICB9IGVsc2Uge1xuICAgIF9tYXN0ZXJDdlJlZG9CYWNrdXAgPSBudWxsO1xuICB9XG4gIGNvbnN0IGNvbnRlbnQgPSBfbWFzdGVyQ3ZBY3RpdmVDb250YWluZXIgfHwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgY29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImVtcHR5LXN0YXRlXCI+PGRpdiBjbGFzcz1cImxvYWRpbmctc3Bpbm5lclwiPjwvZGl2PjxwIHN0eWxlPVwibWFyZ2luLXRvcDoxMnB4O2NvbG9yOiM2NDc0OGI7XCI+TG9hZGluZyBtYXN0ZXIgQ1YgZGF0YVx1MjAyNjwvcD48L2Rpdj4nO1xuXG4gIGxldCBvdmVydmlldyA9IHt9O1xuICBsZXQgZnVsbERhdGEgID0ge307XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBbb3ZSZXMsIGZkUmVzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL292ZXJ2aWV3JyksXG4gICAgICBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS9mdWxsJyksXG4gICAgXSk7XG4gICAgb3ZlcnZpZXcgPSAoYXdhaXQgb3ZSZXMuanNvbigpKSB8fCB7fTtcbiAgICBmdWxsRGF0YSAgPSAoYXdhaXQgZmRSZXMuanNvbigpKSB8fCB7fTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY29udGVudC5pbm5lckhUTUwgPSAnPHAgc3R5bGU9XCJjb2xvcjojZWY0NDQ0O3BhZGRpbmc6MjBweDtcIj5GYWlsZWQgdG8gbG9hZCBtYXN0ZXIgQ1YgZGF0YS48L3A+JztcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwZXJzb25hbEluZm8gPSBmdWxsRGF0YS5wZXJzb25hbF9pbmZvIHx8IHt9O1xuICBjb25zdCBleHBlcmllbmNlcyAgICAgPSBmdWxsRGF0YS5leHBlcmllbmNlIHx8IFtdO1xuICB3aW5kb3cuX21hc3RlckV4cGVyaWVuY2VPcHRpb25zID0gZXhwZXJpZW5jZXNcbiAgICAubWFwKChleHApID0+ICh7XG4gICAgICBpZDogZXhwLmlkIHx8ICcnLFxuICAgICAgbGFiZWw6IGAke2V4cC50aXRsZSB8fCAnUm9sZSd9IEAgJHtleHAuY29tcGFueSB8fCAnQ29tcGFueSd9YCxcbiAgICB9KSlcbiAgICAuZmlsdGVyKCh4KSA9PiB4LmlkKTtcbiAgLy8gRnVsbCBleHBlcmllbmNlIG9iamVjdHMgKGluY2x1ZGluZyBhY2hpZXZlbWVudHMpLCBrZXllZCBieSBpZCwgc29cbiAgLy8gZWRpdE1hc3RlckV4cGVyaWVuY2UoKSBjYW4gbG9vayB1cCBuZXN0ZWQgYWNoaWV2ZW1lbnRzIHdpdGhvdXRcbiAgLy8gZW1iZWRkaW5nIGFyYml0cmFyeSBhY2hpZXZlbWVudCB0ZXh0IGluc2lkZSBhbiBpbmxpbmUgb25jbGljayBhdHRyaWJ1dGUuXG4gIHdpbmRvdy5fbWFzdGVyRXhwZXJpZW5jZUZ1bGxEYXRhID0gZXhwZXJpZW5jZXM7XG4gIGNvbnN0IHNraWxscyAgICAgICAgICA9IGZ1bGxEYXRhLnNraWxscyB8fCBbXTtcbiAgY29uc3QgZWR1Y2F0aW9uICAgICAgID0gZnVsbERhdGEuZWR1Y2F0aW9uIHx8IFtdO1xuICBjb25zdCBhd2FyZHMgICAgICAgICAgPSBmdWxsRGF0YS5hd2FyZHMgfHwgW107XG4gIGNvbnN0IGNlcnRpZmljYXRpb25zICA9IGZ1bGxEYXRhLmNlcnRpZmljYXRpb25zIHx8IFtdO1xuICBjb25zdCBhY2hpZXZlbWVudHMgICAgPSBmdWxsRGF0YS5zZWxlY3RlZF9hY2hpZXZlbWVudHMgfHwgW107XG4gIGNvbnN0IHN1bW1hcmllcyAgICAgICA9IGZ1bGxEYXRhLnByb2Zlc3Npb25hbF9zdW1tYXJpZXMgfHwge307XG5cbiAgY29uc3QgY3VycmVudFBoYXNlID0gKHR5cGVvZiBzdGF0ZU1hbmFnZXIgIT09ICd1bmRlZmluZWQnICYmIHN0YXRlTWFuYWdlci5nZXRQaGFzZSlcbiAgICA/IHN0YXRlTWFuYWdlci5nZXRQaGFzZSgpXG4gICAgOiBudWxsO1xuICBjb25zdCBFRElUQUJMRV9QSEFTRVMgPSBuZXcgU2V0KFsnaW5pdCcsICdyZWZpbmVtZW50JywgbnVsbCwgdW5kZWZpbmVkLCAnJ10pO1xuICBjb25zdCBpc0VkaXRhYmxlID0gRURJVEFCTEVfUEhBU0VTLmhhcyhjdXJyZW50UGhhc2UpO1xuXG4gIGNvbnN0IHBoYXNlTG9ja0Jhbm5lciA9IGlzRWRpdGFibGUgPyAnJyA6IGBcbiAgICA8ZGl2IHJvbGU9XCJzdGF0dXNcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIlxuICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZWYyZjI7Ym9yZGVyOjFweCBzb2xpZCAjZmNhNWE1O2JvcmRlci1yYWRpdXM6NnB4O1xuICAgICAgICAgICAgICAgIHBhZGRpbmc6MTBweCAxNHB4O21hcmdpbi1ib3R0b206MTZweDtmb250LXNpemU6MC44OGVtO2NvbG9yOiM5OTFiMWI7XCI+XG4gICAgICA8c3Ryb25nPlx1RDgzRFx1REQxMiBSZWFkLW9ubHkgXHUyMDE0IGVkaXRpbmcgbG9ja2VkPC9zdHJvbmc+PGJyPlxuICAgICAgTWFzdGVyIENWIGVkaXRpbmcgaXMgb25seSBhdmFpbGFibGUgYmVmb3JlIGpvYiBhbmFseXNpcyBiZWdpbnMgb3IgZHVyaW5nIHRoZVxuICAgICAgUmVmaW5lbWVudCBzdGFnZS4gVGhlIGN1cnJlbnQgc3RhZ2UgaXMgPHN0cm9uZz4ke2VzY2FwZUh0bWwoY3VycmVudFBoYXNlIHx8ICd1bmtub3duJyl9PC9zdHJvbmc+LlxuICAgICAgU2F2ZSBvciBjb21wbGV0ZSB0aGUgY3VycmVudCBzdGFnZSB0byByZS1lbmFibGUgZWRpdGluZy5cbiAgICA8L2Rpdj5gO1xuXG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2ZsZXgtd3JhcDp3cmFwO2dhcDo4cHg7bWFyZ2luLWJvdHRvbTo0cHg7XCI+XG4gICAgICA8aDEgc3R5bGU9XCJtYXJnaW46MDtcIj5cdUQ4M0RcdURDREEgTWFzdGVyIENWIFByb2ZpbGU8L2gxPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6OHB4O2ZsZXgtd3JhcDp3cmFwO1wiPlxuICAgICAgICA8YnV0dG9uIGlkPVwibWFzdGVyLWN2LXVuZG8tYnRuXCIgY2xhc3M9XCJhY3Rpb24tYnRuIHNlY29uZGFyeVwiIG9uY2xpY2s9XCJ1bmRvTWFzdGVyRGF0YUNoYW5nZSgpXCJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJVbmRvIHRoZSBtb3N0IHJlY2VudCBNYXN0ZXIgQ1YgY2hhbmdlXCIgdGl0bGU9XCJVbmRvIChDdHJsK1opXCI+XG4gICAgICAgICAgXHUyMUE5IFVuZG9cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gaWQ9XCJtYXN0ZXItY3YtcmVkby1idG5cIiBjbGFzcz1cImFjdGlvbi1idG4gc2Vjb25kYXJ5XCIgb25jbGljaz1cInJlZG9NYXN0ZXJEYXRhQ2hhbmdlKClcIlxuICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlJlZG8gdGhlIHByZXZpb3VzbHkgdW5kb25lIE1hc3RlciBDViBjaGFuZ2VcIiB0aXRsZT1cIlJlZG8gKEN0cmwrU2hpZnQrWilcIiR7IV9tYXN0ZXJDdlJlZG9CYWNrdXAgPyAnIGRpc2FibGVkJyA6ICcnfT5cbiAgICAgICAgICBcdTIxQUEgUmVkb1xuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG4gc2Vjb25kYXJ5XCIgb25jbGljaz1cIm9wZW5CYWNrdXBIaXN0b3J5TW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJWaWV3IGJhY2t1cCBoaXN0b3J5XCI+XG4gICAgICAgICAgXHVEODNEXHVERDUwIEJhY2t1cHNcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHNlY29uZGFyeVwiIG9uY2xpY2s9XCJvcGVuRnVsbERhdGFQcmV2aWV3TW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJQcmV2aWV3IGZ1bGwgbWFzdGVyIENWIGRhdGFcIj5cbiAgICAgICAgICBcdUQ4M0RcdURDNDEgUHJldmlldyBGdWxsIERhdGFcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHNlY29uZGFyeVwiIG9uY2xpY2s9XCJleHBvcnRNYXN0ZXJDVigpXCIgYXJpYS1sYWJlbD1cIkRvd25sb2FkIE1hc3Rlcl9DVl9EYXRhLmpzb25cIj5cbiAgICAgICAgICBcdTJCMDdcdUZFMEYgRXhwb3J0IEpTT05cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHNlY29uZGFyeVwiIG9uY2xpY2s9XCJ0cmlnZ2VyTWFzdGVyQ3ZJbXBvcnQoKVwiIGFyaWEtbGFiZWw9XCJJbXBvcnQgYSBmdWxsIE1hc3Rlcl9DVl9EYXRhLmpzb24gZmlsZVwiJHtpc0VkaXRhYmxlID8gJycgOiAnIGRpc2FibGVkJ30+XG4gICAgICAgICAgXHUyQjA2XHVGRTBGIEltcG9ydCBKU09OXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiBpZD1cIm1hc3Rlci1jdi1pbXBvcnQtZmlsZS1pbnB1dFwiIGFjY2VwdD1cImFwcGxpY2F0aW9uL2pzb24sLmpzb25cIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIlxuICAgICAgICAgICAgb25jaGFuZ2U9XCJoYW5kbGVNYXN0ZXJDdkltcG9ydEZpbGUoZXZlbnQpXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDttYXJnaW4tYm90dG9tOjEycHg7XCI+XG4gICAgICBUaGlzIGlzIHlvdXIgcGVyc2lzdGVudCBtYXN0ZXIgQ1YgcHJvZmlsZS4gQ2hhbmdlcyBoZXJlIHVwZGF0ZVxuICAgICAgPGNvZGU+TWFzdGVyX0NWX0RhdGEuanNvbjwvY29kZT4gZGlyZWN0bHkgYW5kIHBlcnNpc3QgYWNyb3NzIGFsbCBzZXNzaW9ucy5cbiAgICA8L3A+XG5cbiAgICAke3BoYXNlTG9ja0Jhbm5lcn1cblxuICAgIDwhLS0gR292ZXJuYW5jZSBiYW5uZXIgLS0+XG4gICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1nb3Zlcm5hbmNlLW5vdGVcIiBzdHlsZT1cImJhY2tncm91bmQ6I2ZmZmJlYjtib3JkZXI6MXB4IHNvbGlkICNmY2QzNGQ7Ym9yZGVyLXJhZGl1czo2cHg7cGFkZGluZzoxMHB4IDE0cHg7bWFyZ2luLWJvdHRvbToxNnB4O2ZvbnQtc2l6ZTowLjg4ZW07Y29sb3I6Izc4MzUwZjtcIj5cbiAgICAgIDxzdHJvbmc+XHUyNkEwXHVGRTBGIFBlcnNpc3RlbnQgc3RvcmFnZSBcdTIwMTQgdGhpcyB0YWIgb25seTo8L3N0cm9uZz4gRWRpdHMgbWFkZSBoZXJlICh0aGUgc3RydWN0dXJlZFxuICAgICAgZWRpdG9ycyBiZWxvdywgYW5kIFwiVXBkYXRlIHZpYSBBSVwiKSB3cml0ZSBkaXJlY3RseSB0byA8Y29kZT5NYXN0ZXJfQ1ZfRGF0YS5qc29uPC9jb2RlPlxuICAgICAgaW1tZWRpYXRlbHkgYW5kIHBlcnNpc3QgYWNyb3NzIGV2ZXJ5IGZ1dHVyZSBqb2IgYXBwbGljYXRpb24uXG4gICAgICBKb2Itc3BlY2lmaWMgY2hvaWNlcyB5b3UgbWFrZSBlbHNld2hlcmUgaW4gdGhlIGFwcCBcdTIwMTQgd2hpY2ggc2tpbGxzL2V4cGVyaWVuY2VzIHRvIGZlYXR1cmUsXG4gICAgICByZXdyaXR0ZW4gYnVsbGV0IHRleHQsIGNvdmVyLWxldHRlciB0b25lIFx1MjAxNCBsaXZlIG9ubHkgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbiBhbmQgYXJlXG4gICAgICA8ZW0+bmV2ZXI8L2VtPiB3cml0dGVuIGhlcmUgYXV0b21hdGljYWxseS4gVG8gY2FycnkgYSBzZXNzaW9uJ3MgaW1wcm92ZW1lbnRzIGludG8geW91clxuICAgICAgcGVybWFuZW50IHByb2ZpbGUsIHVzZSBcIlx1RDgzRFx1RENFNSBVcGRhdGUgTWFzdGVyIENWIERhdGFcIiBvbiB0aGUgRmluYWxpc2Ugc3RlcC5cbiAgICA8L2Rpdj5cblxuICAgICR7aXNFZGl0YWJsZSA/IHJlbmRlck1hc3RlckRhdGFBaVVwZGF0ZVBhbmVsKCkgOiByZW5kZXJNYXN0ZXJEYXRhQWlVcGRhdGVEaXNhYmxlZE5vdGUoKX1cblxuICAgICR7X3JlbmRlck1hc3RlckNoYW5nZU5vdGljZSgpfVxuXG4gICAgPCEtLSBQcm9maWxlIG92ZXJ2aWV3IGNhcmQgLS0+XG4gICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1wcm9maWxlLWNhcmRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItcHJvZmlsZS1uYW1lXCI+JHtlc2NhcGVIdG1sKG92ZXJ2aWV3Lm5hbWUgfHwgJ1lvdXIgUHJvZmlsZScpfTwvZGl2PlxuICAgICAgJHtvdmVydmlldy5oZWFkbGluZSA/IGA8ZGl2IGNsYXNzPVwibWFzdGVyLXByb2ZpbGUtaGVhZGxpbmVcIj4ke2VzY2FwZUh0bWwob3ZlcnZpZXcuaGVhZGxpbmUpfTwvZGl2PmAgOiAnJ31cbiAgICAgICR7b3ZlcnZpZXcuZW1haWwgICAgPyBgPGRpdiBjbGFzcz1cIm1hc3Rlci1wcm9maWxlLWVtYWlsXCI+XHUyNzA5XHVGRTBGICR7ZXNjYXBlSHRtbChvdmVydmlldy5lbWFpbCl9PC9kaXY+YCA6ICcnfVxuICAgICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1zdGF0c1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXN0YXRcIj48c3BhbiBjbGFzcz1cIm1hc3Rlci1zdGF0LXZhbHVlXCI+JHtvdmVydmlldy5leHBlcmllbmNlX2NvdW50ID8/ICdcdTIwMTQnfTwvc3Bhbj48c3BhbiBjbGFzcz1cIm1hc3Rlci1zdGF0LWxhYmVsXCI+RXhwZXJpZW5jZXM8L3NwYW4+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc3RhdFwiPjxzcGFuIGNsYXNzPVwibWFzdGVyLXN0YXQtdmFsdWVcIj4ke292ZXJ2aWV3LnNraWxsX2NvdW50ID8/ICdcdTIwMTQnfTwvc3Bhbj48c3BhbiBjbGFzcz1cIm1hc3Rlci1zdGF0LWxhYmVsXCI+U2tpbGxzPC9zcGFuPjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXN0YXRcIj48c3BhbiBjbGFzcz1cIm1hc3Rlci1zdGF0LXZhbHVlXCI+JHtvdmVydmlldy5hY2hpZXZlbWVudF9jb3VudCA/PyAnXHUyMDE0J308L3NwYW4+PHNwYW4gY2xhc3M9XCJtYXN0ZXItc3RhdC1sYWJlbFwiPkFjaGlldmVtZW50czwvc3Bhbj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1zdGF0XCI+PHNwYW4gY2xhc3M9XCJtYXN0ZXItc3RhdC12YWx1ZVwiPiR7b3ZlcnZpZXcuc3VtbWFyeV9jb3VudCA/PyAnXHUyMDE0J308L3NwYW4+PHNwYW4gY2xhc3M9XCJtYXN0ZXItc3RhdC1sYWJlbFwiPlN1bW1hcmllczwvc3Bhbj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1zdGF0XCI+PHNwYW4gY2xhc3M9XCJtYXN0ZXItc3RhdC12YWx1ZVwiPiR7b3ZlcnZpZXcuZWR1Y2F0aW9uX2NvdW50ID8/ICdcdTIwMTQnfTwvc3Bhbj48c3BhbiBjbGFzcz1cIm1hc3Rlci1zdGF0LWxhYmVsXCI+RWR1Y2F0aW9uPC9zcGFuPjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXN0YXRcIj48c3BhbiBjbGFzcz1cIm1hc3Rlci1zdGF0LXZhbHVlXCI+JHtvdmVydmlldy5wdWJsaWNhdGlvbl9jb3VudCA/PyAnXHUyMDE0J308L3NwYW4+PHNwYW4gY2xhc3M9XCJtYXN0ZXItc3RhdC1sYWJlbFwiPlB1YmxpY2F0aW9uczwvc3Bhbj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBQZXJzb25hbCBJbmZvIHNlY3Rpb24gLS0+XG4gICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1zZWN0aW9uXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXNlY3Rpb24taGVhZGVyXCI+XG4gICAgICAgIDxoMj5cdUQ4M0RcdURDNjQgUGVyc29uYWwgSW5mb3JtYXRpb248L2gyPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0blwiIG9uY2xpY2s9XCJzaG93RWRpdFBlcnNvbmFsSW5mb01vZGFsKClcIiBhcmlhLWxhYmVsPVwiRWRpdCBwZXJzb25hbCBpbmZvcm1hdGlvblwiPlxuICAgICAgICAgIFx1MjcwRlx1RkUwRiBFZGl0XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGlkPVwibWFzdGVyLXBlcnNvbmFsLWluZm8tY29udGFpbmVyXCI+XG4gICAgICAgICR7X3JlbmRlclBlcnNvbmFsSW5mb0NhcmQocGVyc29uYWxJbmZvKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBFeHBlcmllbmNlcyBzZWN0aW9uIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc2VjdGlvblwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1zZWN0aW9uLWhlYWRlclwiPlxuICAgICAgICA8aDI+XHVEODNEXHVEQ0JDIFdvcmsgRXhwZXJpZW5jZTwvaDI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgb25jbGljaz1cInNob3dBZGRFeHBlcmllbmNlTW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJBZGQgbmV3IHdvcmsgZXhwZXJpZW5jZVwiPlxuICAgICAgICAgICsgQWRkIEV4cGVyaWVuY2VcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgaWQ9XCJtYXN0ZXItZXhwZXJpZW5jZXMtY29udGFpbmVyXCI+XG4gICAgICAgICR7X3JlbmRlckV4cGVyaWVuY2VzTGlzdChleHBlcmllbmNlcyl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gU2tpbGxzIHNlY3Rpb24gLS0+XG4gICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1zZWN0aW9uXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXNlY3Rpb24taGVhZGVyXCI+XG4gICAgICAgIDxoMj5cdUQ4M0RcdURFRTBcdUZFMEYgU2tpbGxzPC9oMj5cbiAgICAgICAgJHtBcnJheS5pc0FycmF5KHNraWxscykgPyBgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwic2hvd0FkZFNraWxsTW9kYWwoJycsIHRydWUpXCIgYXJpYS1sYWJlbD1cIkFkZCBuZXcgc2tpbGxcIj4rIEFkZCBTa2lsbDwvYnV0dG9uPmAgOiAnJ31cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBpZD1cIm1hc3Rlci1za2lsbHMtY29udGFpbmVyXCI+XG4gICAgICAgICR7X3JlbmRlclNraWxsc1NlY3Rpb24oc2tpbGxzKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBFZHVjYXRpb24gc2VjdGlvbiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXNlY3Rpb25cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc2VjdGlvbi1oZWFkZXJcIj5cbiAgICAgICAgPGgyPlx1RDgzQ1x1REY5MyBFZHVjYXRpb248L2gyPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0blwiIG9uY2xpY2s9XCJzaG93QWRkRWR1Y2F0aW9uTW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJBZGQgZWR1Y2F0aW9uIGVudHJ5XCI+XG4gICAgICAgICAgKyBBZGQgRWR1Y2F0aW9uXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGlkPVwibWFzdGVyLWVkdWNhdGlvbi1jb250YWluZXJcIj5cbiAgICAgICAgJHtfcmVuZGVyRWR1Y2F0aW9uTGlzdChlZHVjYXRpb24pfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFB1YmxpY2F0aW9ucyBzZWN0aW9uIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc2VjdGlvblwiIGlkPVwibWFzdGVyLXB1YmxpY2F0aW9ucy1zZWN0aW9uXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXNlY3Rpb24taGVhZGVyXCI+XG4gICAgICAgIDxoMj5cdUQ4M0RcdURDRDYgUHVibGljYXRpb25zPC9oMj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDtcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBzZWNvbmRhcnlcIiBpZD1cIm1hc3Rlci1wdWItaW1wb3J0LWJ0blwiXG4gICAgICAgICAgICAgIG9uY2xpY2s9XCJzaG93SW1wb3J0UHVibGljYXRpb25zTW9kYWwoKVwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJJbXBvcnQgQmliVGVYIHB1YmxpY2F0aW9uc1wiPlxuICAgICAgICAgICAgXHUyQjA2XHVGRTBGIEltcG9ydCBCaWJUZVhcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBzZWNvbmRhcnlcIiBpZD1cIm1hc3Rlci1wdWItY29udmVydC1idG5cIlxuICAgICAgICAgICAgICBvbmNsaWNrPVwic2hvd0NvbnZlcnRQdWJsaWNhdGlvbnNNb2RhbCgpXCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkNvbnZlcnQgY2l0YXRpb24gdGV4dCB0byBCaWJUZVhcIj5cbiAgICAgICAgICAgIFx1RDgzRVx1REU4NCBDb252ZXJ0IFRleHRcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBzZWNvbmRhcnlcIiBpZD1cIm1hc3Rlci1wdWItdG9nZ2xlLWJ0blwiXG4gICAgICAgICAgICAgIG9uY2xpY2s9XCJ0b2dnbGVQdWJsaWNhdGlvbnNWaWV3KClcIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiVG9nZ2xlIGJldHdlZW4gc3RydWN0dXJlZCBDUlVEIHZpZXcgYW5kIHJhdyBCaWJUZVggZWRpdG9yXCI+XG4gICAgICAgICAgICBcdTI3MEZcdUZFMEYgUmF3IEJpYlRlWFxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgaWQ9XCJtYXN0ZXItcHViLWFkZC1idG5cIlxuICAgICAgICAgICAgICBvbmNsaWNrPVwic2hvd0FkZFB1YmxpY2F0aW9uTW9kYWwoKVwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJBZGQgcHVibGljYXRpb25cIj5cbiAgICAgICAgICAgICsgQWRkIFB1YmxpY2F0aW9uXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8IS0tIENSVUQgc3RydWN0dXJlZCB2aWV3IChkZWZhdWx0KSAtLT5cbiAgICAgIDxkaXYgaWQ9XCJtYXN0ZXItcHViLWNydWQtdmlld1wiPlxuICAgICAgICA8ZGl2IGlkPVwibWFzdGVyLXB1Yi1jcnVkLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtwYWRkaW5nOjEycHggMDtcIj5Mb2FkaW5nIHB1YmxpY2F0aW9uc1x1MjAyNjwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDwhLS0gUmF3IEJpYlRlWCBlZGl0b3IgKGhpZGRlbiBieSBkZWZhdWx0KSAtLT5cbiAgICAgIDxkaXYgaWQ9XCJtYXN0ZXItcHViLXJhdy12aWV3XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+XG4gICAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtmb250LXNpemU6MC45ZW07bWFyZ2luLWJvdHRvbToxMHB4O1wiPlxuICAgICAgICAgIEVkaXQgeW91ciBCaWJUZVggYmlibGlvZ3JhcGh5IGZpbGUgZGlyZWN0bHkuIENoYW5nZXMgYXJlIHNhdmVkIHRvXG4gICAgICAgICAgPGNvZGU+cHVibGljYXRpb25zLmJpYjwvY29kZT4gYW5kIGEgdGltZXN0YW1wZWQgYmFja3VwIGlzIGNyZWF0ZWRcbiAgICAgICAgICBhdXRvbWF0aWNhbGx5LiBDb250ZW50IGlzIHZhbGlkYXRlZCBiZWZvcmUgd3JpdGluZy5cbiAgICAgICAgPC9wPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6OHB4O21hcmdpbi1ib3R0b206OHB4O1wiPlxuICAgICAgICAgIDxzcGFuIGlkPVwibWFzdGVyLXB1Yi1jb3VudFwiIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtmb250LXNpemU6MC45ZW07XCI+PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZmxleDoxO1wiPjwvc3Bhbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBzZWNvbmRhcnlcIiBvbmNsaWNrPVwidmFsaWRhdGVQdWJsaWNhdGlvbnNCaWIoKVwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJWYWxpZGF0ZSBCaWJUZVggd2l0aG91dCBzYXZpbmdcIj5cdUQ4M0RcdUREMEQgVmFsaWRhdGU8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBzZWNvbmRhcnlcIiBvbmNsaWNrPVwibG9hZFB1YmxpY2F0aW9uc0JpYigpXCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlJlbG9hZCBwdWJsaWNhdGlvbnMuYmliIGZyb20gZGlza1wiPlx1RDgzRFx1REQwNCBSZWxvYWQ8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBwcmltYXJ5XCIgaWQ9XCJtYXN0ZXItcHViLXNhdmUtYnRuXCJcbiAgICAgICAgICAgICAgb25jbGljaz1cInNhdmVQdWJsaWNhdGlvbnNCaWIoKVwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJTYXZlIEJpYlRlWCB0byBkaXNrXCI+XHVEODNEXHVEQ0JFIFNhdmU8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDx0ZXh0YXJlYSBpZD1cIm1hc3Rlci1wdWItdGV4dGFyZWFcIlxuICAgICAgICAgIGNsYXNzPVwiZWRpdC1pbnB1dFwiXG4gICAgICAgICAgcm93cz1cIjIwXCJcbiAgICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Zm9udC1mYW1pbHk6bW9ub3NwYWNlO2ZvbnQtc2l6ZTowLjg1ZW07cmVzaXplOnZlcnRpY2FsO1wiXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJMb2FkaW5nXHUyMDI2XCJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiQmliVGVYIGJpYmxpb2dyYXBoeSBjb250ZW50XCJcbiAgICAgICAgICBzcGVsbGNoZWNrPVwiZmFsc2VcIlxuICAgICAgICA+PC90ZXh0YXJlYT5cbiAgICAgICAgPGRpdiBpZD1cIm1hc3Rlci1wdWItc3RhdHVzXCJcbiAgICAgICAgICAgIHN0eWxlPVwibWFyZ2luLXRvcDo2cHg7Zm9udC1zaXplOjAuODVlbTtjb2xvcjojNmI3MjgwO1wiXG4gICAgICAgICAgICBhcmlhLWxpdmU9XCJwb2xpdGVcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBBd2FyZHMgc2VjdGlvbiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXNlY3Rpb25cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc2VjdGlvbi1oZWFkZXJcIj5cbiAgICAgICAgPGgyPlx1RDgzQ1x1REZDNSBBd2FyZHMgJmFtcDsgSG9ub3VyczwvaDI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgb25jbGljaz1cInNob3dBZGRBd2FyZE1vZGFsKClcIiBhcmlhLWxhYmVsPVwiQWRkIGF3YXJkXCI+XG4gICAgICAgICAgKyBBZGQgQXdhcmRcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgaWQ9XCJtYXN0ZXItYXdhcmRzLWNvbnRhaW5lclwiPlxuICAgICAgICAke19yZW5kZXJBd2FyZHNMaXN0KGF3YXJkcyl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gQ2VydGlmaWNhdGlvbnMgc2VjdGlvbiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXNlY3Rpb25cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc2VjdGlvbi1oZWFkZXJcIj5cbiAgICAgICAgPGgyPlx1RDgzQ1x1REY5MyBDZXJ0aWZpY2F0aW9uczwvaDI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgb25jbGljaz1cInNob3dBZGRDZXJ0aWZpY2F0aW9uTW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJBZGQgY2VydGlmaWNhdGlvblwiPlxuICAgICAgICAgICsgQWRkIENlcnRpZmljYXRpb25cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgaWQ9XCJtYXN0ZXItY2VydGlmaWNhdGlvbnMtY29udGFpbmVyXCI+XG4gICAgICAgICR7X3JlbmRlckNlcnRpZmljYXRpb25zTGlzdChjZXJ0aWZpY2F0aW9ucyl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gU2VsZWN0ZWQgQWNoaWV2ZW1lbnRzIHNlY3Rpb24gLS0+XG4gICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1zZWN0aW9uXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXNlY3Rpb24taGVhZGVyXCI+XG4gICAgICAgIDxoMj5cdUQ4M0NcdURGQzYgU2VsZWN0ZWQgQWNoaWV2ZW1lbnRzPC9oMj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwic2hvd0FkZEFjaGlldmVtZW50TW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJBZGQgbmV3IGFjaGlldmVtZW50IHRvIG1hc3RlciBDVlwiPlxuICAgICAgICAgICsgQWRkIEFjaGlldmVtZW50XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7Zm9udC1zaXplOjAuOWVtO21hcmdpbi1ib3R0b206MTJweDtcIj5cbiAgICAgICAgVGhlc2UgYXJlIGNyb3NzLXJvbGUgaGlnaGxpZ2h0cyBzaG93biBpbiB0aGUgQWNoaWV2ZW1lbnRzIHJldmlldyBkdXJpbmcgY3VzdG9taXNhdGlvbi5cbiAgICAgICAgVGhlIEhhcnZlc3QgZmVhdHVyZSAoSGFydmVzdCB0YWIpIGNhbiBhZGQgbmV3IG9uZXMgZnJvbSB5b3VyIGN1cnJlbnQgc2Vzc2lvbi5cbiAgICAgIDwvcD5cbiAgICAgIDxkaXYgaWQ9XCJtYXN0ZXItYWNoaWV2ZW1lbnRzLWNvbnRhaW5lclwiPlxuICAgICAgICAke19yZW5kZXJNYXN0ZXJBY2hpZXZlbWVudHNUYWJsZShhY2hpZXZlbWVudHMpfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFByb2Zlc3Npb25hbCBTdW1tYXJpZXMgc2VjdGlvbiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXNlY3Rpb25cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc2VjdGlvbi1oZWFkZXJcIj5cbiAgICAgICAgPGgyPlx1RDgzRFx1RENERCBQcm9mZXNzaW9uYWwgU3VtbWFyaWVzPC9oMj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwic2hvd0FkZFN1bW1hcnlNb2RhbCgpXCIgYXJpYS1sYWJlbD1cIkFkZCBuZXcgcHJvZmVzc2lvbmFsIHN1bW1hcnkgdmFyaWFudFwiPlxuICAgICAgICAgICsgQWRkIFN1bW1hcnlcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtmb250LXNpemU6MC45ZW07bWFyZ2luLWJvdHRvbToxMnB4O1wiPlxuICAgICAgICBOYW1lZCBzdW1tYXJ5IHZhcmlhbnRzIGxldCB5b3UgdGFpbG9yIHlvdXIgcHJvZmVzc2lvbmFsIHN0YXRlbWVudCBmb3IgZGlmZmVyZW50IHJvbGUgdHlwZXNcbiAgICAgICAgd2l0aG91dCByZWdlbmVyYXRpbmcgZnJvbSBzY3JhdGNoLiBUaGUgQUkgd2lsbCByZWNvbW1lbmQgdGhlIG1vc3QgcmVsZXZhbnQgdmFyaWFudFxuICAgICAgICBkdXJpbmcgdGhlIFN1bW1hcnkgRm9jdXMgc3RlcC5cbiAgICAgIDwvcD5cbiAgICAgIDxkaXYgaWQ9XCJtYXN0ZXItc3VtbWFyaWVzLWNvbnRhaW5lclwiPlxuICAgICAgICAke19yZW5kZXJTdW1tYXJpZXNMaXN0KHN1bW1hcmllcyl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gUHVibGljYXRpb24gYWRkL2VkaXQgbW9kYWwgLS0+XG4gICAgPGRpdiBpZD1cIm1hc3Rlci1wdWItbW9kYWwtb3ZlcmxheVwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLW1vZGFsPVwidHJ1ZVwiXG4gICAgICAgIGFyaWEtbGFiZWxsZWRieT1cIm1hc3Rlci1wdWItbW9kYWwtdGl0bGVcIiBjbGFzcz1cIm1vZGFsLW92ZXJsYXlcIlxuICAgICAgICBvbmNsaWNrPVwiaWYoZXZlbnQudGFyZ2V0PT09dGhpcyljbG9zZVB1YmxpY2F0aW9uTW9kYWwoKVwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsXCIgc3R5bGU9XCJtYXgtd2lkdGg6NTgwcHg7XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cbiAgICAgICAgICA8aDIgaWQ9XCJtYXN0ZXItcHViLW1vZGFsLXRpdGxlLWhlYWRpbmdcIiBpZD1cInB1Yi1tb2RhbC10aXRsZS1oZWFkaW5nXCI+QWRkIFB1YmxpY2F0aW9uPC9oMj5cbiAgICAgICAgICA8YnV0dG9uIG9uY2xpY2s9XCJjbG9zZVB1YmxpY2F0aW9uTW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJDbG9zZSBwdWJsaWNhdGlvbiBlZGl0b3JcIlxuICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6bm9uZTtib3JkZXI6bm9uZTtmb250LXNpemU6MS40ZW07Y3Vyc29yOnBvaW50ZXI7Y29sb3I6IzY0NzQ4YjtcIj4mdGltZXM7PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiIHN0eWxlPVwicGFkZGluZzoyMHB4O1wiPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjEycHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwicHViLW1vZGFsLWtleVwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+Q2l0ZSBLZXkgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+Kjwvc3Bhbj48L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJwdWItbW9kYWwta2V5XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiIGFyaWEtcmVxdWlyZWQ9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gc21pdGgyMDI0bWxcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjEycHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwicHViLW1vZGFsLXR5cGVcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkVudHJ5IFR5cGUgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+Kjwvc3Bhbj48L2xhYmVsPlxuICAgICAgICAgICAgPHNlbGVjdCBpZD1cInB1Yi1tb2RhbC10eXBlXCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiYXJ0aWNsZVwiPmFydGljbGU8L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImlucHJvY2VlZGluZ3NcIj5pbnByb2NlZWRpbmdzPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJib29rXCI+Ym9vazwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiaW5jb2xsZWN0aW9uXCI+aW5jb2xsZWN0aW9uPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ0ZWNocmVwb3J0XCI+dGVjaHJlcG9ydDwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicGhkdGhlc2lzXCI+cGhkdGhlc2lzPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJtYXN0ZXJzdGhlc2lzXCI+bWFzdGVyc3RoZXNpczwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwibWlzY1wiPm1pc2M8L29wdGlvbj5cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjEycHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgaWQ9XCJwdWItbW9kYWwtYXV0aG9yLWxhYmVsXCIgZm9yPVwicHViLW1vZGFsLWF1dGhvclwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+QXV0aG9yKHMpIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPio8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwicHViLW1vZGFsLWF1dGhvclwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiTGFzdCwgRmlyc3QgYW5kIExhc3QyLCBGaXJzdDJcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjEycHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwicHViLW1vZGFsLXRpdGxlXCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5UaXRsZSA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4qPC9zcGFuPjwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInB1Yi1tb2RhbC10aXRsZVwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIiBhcmlhLXJlcXVpcmVkPVwidHJ1ZVwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6MTJweDttYXJnaW4tYm90dG9tOjEycHg7XCI+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDowIDAgMTAwcHg7XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwdWItbW9kYWwteWVhclwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+WWVhciA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4qPC9zcGFuPjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJwdWItbW9kYWwteWVhclwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwcHg7XCJcbiAgICAgICAgICAgICAgICAgIG1pbj1cIjE5MDBcIiBtYXg9XCIyMTAwXCIgYXJpYS1yZXF1aXJlZD1cInRydWVcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDoxO1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicHViLW1vZGFsLWpvdXJuYWxcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkpvdXJuYWwgLyBCb29rdGl0bGU8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInB1Yi1tb2RhbC1qb3VybmFsXCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxMnB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cInB1Yi1tb2RhbC1kb2lcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkRPSSAvIFVSTDwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInB1Yi1tb2RhbC1kb2lcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIjEwLnh4eHgveHh4eHhcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjRweDtcIj5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwdWItbW9kYWwtZXh0cmFcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkV4dHJhIGZpZWxkcyA8c3BhbiBzdHlsZT1cImZvbnQtd2VpZ2h0OjQwMDtjb2xvcjojNmI3MjgwO1wiPihrZXk9dmFsdWUsIG9uZSBwZXIgbGluZSk8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD1cInB1Yi1tb2RhbC1leHRyYVwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHJvd3M9XCIzXCIgc3R5bGU9XCJ3aWR0aDoxMDAlO3Jlc2l6ZTp2ZXJ0aWNhbDtmb250LWZhbWlseTptb25vc3BhY2U7Zm9udC1zaXplOjAuODVlbTtcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwidm9sdW1lPTEyJiMxMDtwYWdlcz0xLS0yMFwiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCIgc3R5bGU9XCJkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kO2dhcDo4cHg7cGFkZGluZzoxNnB4IDIwcHg7XCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwiY2xvc2VQdWJsaWNhdGlvbk1vZGFsKClcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBwcmltYXJ5XCIgb25jbGljaz1cInNhdmVNYXN0ZXJQdWJsaWNhdGlvbigpXCI+U2F2ZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBpZD1cIm1hc3Rlci1wdWItaW1wb3J0LW1vZGFsLW92ZXJsYXlcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1tb2RhbD1cInRydWVcIlxuICAgICAgICBhcmlhLWxhYmVsbGVkYnk9XCJtYXN0ZXItcHViLWltcG9ydC1tb2RhbC10aXRsZVwiIGNsYXNzPVwibW9kYWwtb3ZlcmxheVwiXG4gICAgICAgIG9uY2xpY2s9XCJpZihldmVudC50YXJnZXQ9PT10aGlzKWNsb3NlSW1wb3J0UHVibGljYXRpb25zTW9kYWwoKVwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsXCIgc3R5bGU9XCJtYXgtd2lkdGg6NjgwcHg7XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cbiAgICAgICAgICA8aDIgaWQ9XCJtYXN0ZXItcHViLWltcG9ydC1tb2RhbC10aXRsZVwiPkltcG9ydCBCaWJUZVggUHVibGljYXRpb25zPC9oMj5cbiAgICAgICAgICA8YnV0dG9uIG9uY2xpY2s9XCJjbG9zZUltcG9ydFB1YmxpY2F0aW9uc01vZGFsKClcIiBhcmlhLWxhYmVsPVwiQ2xvc2UgQmliVGVYIGltcG9ydCBkaWFsb2dcIlxuICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6bm9uZTtib3JkZXI6bm9uZTtmb250LXNpemU6MS40ZW07Y3Vyc29yOnBvaW50ZXI7Y29sb3I6IzY0NzQ4YjtcIj4mdGltZXM7PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiIHN0eWxlPVwicGFkZGluZzoyMHB4O1wiPlxuICAgICAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtmb250LXNpemU6MC45ZW07bWFyZ2luOjAgMCAxMnB4O1wiPlxuICAgICAgICAgICAgUGFzdGUgb25lIG9yIG1vcmUgQmliVGVYIGVudHJpZXMgdG8gbWVyZ2UgdGhlbSBpbnRvIDxjb2RlPnB1YmxpY2F0aW9ucy5iaWI8L2NvZGU+LlxuICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8dGV4dGFyZWEgaWQ9XCJtYXN0ZXItcHViLWltcG9ydC10ZXh0YXJlYVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZWRpdC1pbnB1dFwiXG4gICAgICAgICAgICAgIHJvd3M9XCIxMlwiXG4gICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTtmb250LWZhbWlseTptb25vc3BhY2U7Zm9udC1zaXplOjAuODVlbTtyZXNpemU6dmVydGljYWw7XCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJAYXJ0aWNsZXtzbWl0aDIwMjUsLi4ufVwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJCaWJUZVggaW1wb3J0IGNvbnRlbnRcIlxuICAgICAgICAgICAgICBzcGVsbGNoZWNrPVwiZmFsc2VcIj48L3RleHRhcmVhPlxuICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDttYXJnaW4tdG9wOjEycHg7Y29sb3I6IzMzNDE1NTtcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cIm1hc3Rlci1wdWItaW1wb3J0LW92ZXJ3cml0ZVwiIC8+XG4gICAgICAgICAgICBPdmVyd3JpdGUgZXhpc3RpbmcgZW50cmllcyB3aGVuIGNpdGUga2V5cyBhbHJlYWR5IGV4aXN0XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8ZGl2IGlkPVwibWFzdGVyLXB1Yi1pbXBvcnQtc3RhdHVzXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJtYXJnaW4tdG9wOjEwcHg7Zm9udC1zaXplOjAuODVlbTtjb2xvcjojNmI3MjgwO1wiXG4gICAgICAgICAgICAgIGFyaWEtbGl2ZT1cInBvbGl0ZVwiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiIHN0eWxlPVwiZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpmbGV4LWVuZDtnYXA6OHB4O3BhZGRpbmc6MTZweCAyMHB4O1wiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgb25jbGljaz1cImNsb3NlSW1wb3J0UHVibGljYXRpb25zTW9kYWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHByaW1hcnlcIiBpZD1cIm1hc3Rlci1wdWItaW1wb3J0LXN1Ym1pdC1idG5cIlxuICAgICAgICAgICAgICBvbmNsaWNrPVwiaW1wb3J0UHVibGljYXRpb25zQmliKClcIj5JbXBvcnQ8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgaWQ9XCJtYXN0ZXItcHViLWNvbnZlcnQtbW9kYWwtb3ZlcmxheVwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLW1vZGFsPVwidHJ1ZVwiXG4gICAgICAgIGFyaWEtbGFiZWxsZWRieT1cIm1hc3Rlci1wdWItY29udmVydC1tb2RhbC10aXRsZVwiIGNsYXNzPVwibW9kYWwtb3ZlcmxheVwiXG4gICAgICAgIG9uY2xpY2s9XCJpZihldmVudC50YXJnZXQ9PT10aGlzKWNsb3NlQ29udmVydFB1YmxpY2F0aW9uc01vZGFsKClcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbFwiIHN0eWxlPVwibWF4LXdpZHRoOjc2MHB4O1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XG4gICAgICAgICAgPGgyIGlkPVwibWFzdGVyLXB1Yi1jb252ZXJ0LW1vZGFsLXRpdGxlXCI+Q29udmVydCBDaXRhdGlvbiBUZXh0IHRvIEJpYlRlWDwvaDI+XG4gICAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPVwiY2xvc2VDb252ZXJ0UHVibGljYXRpb25zTW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJDbG9zZSBjaXRhdGlvbiBjb252ZXJzaW9uIGRpYWxvZ1wiXG4gICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDpub25lO2JvcmRlcjpub25lO2ZvbnQtc2l6ZToxLjRlbTtjdXJzb3I6cG9pbnRlcjtjb2xvcjojNjQ3NDhiO1wiPiZ0aW1lczs8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCIgc3R5bGU9XCJwYWRkaW5nOjIwcHg7XCI+XG4gICAgICAgICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO2ZvbnQtc2l6ZTowLjllbTttYXJnaW46MCAwIDEycHg7XCI+XG4gICAgICAgICAgICBQYXN0ZSBmcmVlLWZvcm0gY2l0YXRpb24gdGV4dCwgcmV2aWV3IHRoZSBnZW5lcmF0ZWQgQmliVGVYLCB0aGVuIGltcG9ydCBpdCB3aGVuIGl0IGxvb2tzIGNvcnJlY3QuXG4gICAgICAgICAgPC9wPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmdyaWQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmcjtnYXA6MTRweDtcIj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJtYXN0ZXItcHViLWNvbnZlcnQtaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkNpdGF0aW9uIFRleHQ8L2xhYmVsPlxuICAgICAgICAgICAgICA8dGV4dGFyZWEgaWQ9XCJtYXN0ZXItcHViLWNvbnZlcnQtaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJlZGl0LWlucHV0XCJcbiAgICAgICAgICAgICAgICAgIHJvd3M9XCI3XCJcbiAgICAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTtyZXNpemU6dmVydGljYWw7XCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRG9lLCBKLiAoMjAyNSkuIEFydGljbGUgdGl0bGUuIEpvdXJuYWwgTmFtZSwgMTIoMyksIDEtMTAuXCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJDaXRhdGlvbiB0ZXh0IHRvIGNvbnZlcnRcIj48L3RleHRhcmVhPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwibWFzdGVyLXB1Yi1jb252ZXJ0LW91dHB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+R2VuZXJhdGVkIEJpYlRlWCBQcmV2aWV3PC9sYWJlbD5cbiAgICAgICAgICAgICAgPHRleHRhcmVhIGlkPVwibWFzdGVyLXB1Yi1jb252ZXJ0LW91dHB1dFwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImVkaXQtaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgcm93cz1cIjEwXCJcbiAgICAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTtmb250LWZhbWlseTptb25vc3BhY2U7Zm9udC1zaXplOjAuODVlbTtyZXNpemU6dmVydGljYWw7XCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQ29udmVydGVkIEJpYlRlWCB3aWxsIGFwcGVhciBoZXJlXCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJHZW5lcmF0ZWQgQmliVGVYIHByZXZpZXdcIlxuICAgICAgICAgICAgICAgICAgc3BlbGxjaGVjaz1cImZhbHNlXCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDttYXJnaW4tdG9wOjEycHg7Y29sb3I6IzMzNDE1NTtcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cIm1hc3Rlci1wdWItY29udmVydC1vdmVyd3JpdGVcIiAvPlxuICAgICAgICAgICAgT3ZlcndyaXRlIGV4aXN0aW5nIGVudHJpZXMgd2hlbiBpbXBvcnRpbmcgdGhlIGdlbmVyYXRlZCBCaWJUZVhcbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxkaXYgaWQ9XCJtYXN0ZXItcHViLWNvbnZlcnQtc3RhdHVzXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJtYXJnaW4tdG9wOjEwcHg7Zm9udC1zaXplOjAuODVlbTtjb2xvcjojNmI3MjgwO1wiXG4gICAgICAgICAgICAgIGFyaWEtbGl2ZT1cInBvbGl0ZVwiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiIHN0eWxlPVwiZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpmbGV4LWVuZDtnYXA6OHB4O3BhZGRpbmc6MTZweCAyMHB4O1wiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgb25jbGljaz1cImNsb3NlQ29udmVydFB1YmxpY2F0aW9uc01vZGFsKClcIj5DbG9zZTwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHNlY29uZGFyeVwiIGlkPVwibWFzdGVyLXB1Yi1jb252ZXJ0LXN1Ym1pdC1idG5cIlxuICAgICAgICAgICAgICBvbmNsaWNrPVwiY29udmVydFB1YmxpY2F0aW9uVGV4dCgpXCI+R2VuZXJhdGUgQmliVGVYPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG4gcHJpbWFyeVwiIGlkPVwibWFzdGVyLXB1Yi1jb252ZXJ0LWltcG9ydC1idG5cIlxuICAgICAgICAgICAgICBvbmNsaWNrPVwiaW1wb3J0Q29udmVydGVkUHVibGljYXRpb25UZXh0KClcIj5JbXBvcnQgUHJldmlldzwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBQZXJzb25hbCBJbmZvIG1vZGFsIC0tPlxuICAgIDxkaXYgaWQ9XCJtYXN0ZXItcGktbW9kYWwtb3ZlcmxheVwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLW1vZGFsPVwidHJ1ZVwiXG4gICAgICAgIGFyaWEtbGFiZWxsZWRieT1cIm1hc3Rlci1waS1tb2RhbC10aXRsZVwiIGNsYXNzPVwibW9kYWwtb3ZlcmxheVwiXG4gICAgICAgIG9uY2xpY2s9XCJpZihldmVudC50YXJnZXQ9PT10aGlzKWNsb3NlUGVyc29uYWxJbmZvTW9kYWwoKVwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsXCIgc3R5bGU9XCJtYXgtd2lkdGg6NjIwcHg7XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cbiAgICAgICAgICA8aDIgaWQ9XCJtYXN0ZXItcGktbW9kYWwtdGl0bGVcIj5FZGl0IFBlcnNvbmFsIEluZm9ybWF0aW9uPC9oMj5cbiAgICAgICAgICA8YnV0dG9uIG9uY2xpY2s9XCJjbG9zZVBlcnNvbmFsSW5mb01vZGFsKClcIiBhcmlhLWxhYmVsPVwiQ2xvc2UgcGVyc29uYWwgaW5mbyBlZGl0b3JcIlxuICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6bm9uZTtib3JkZXI6bm9uZTtmb250LXNpemU6MS40ZW07Y3Vyc29yOnBvaW50ZXI7Y29sb3I6IzY0NzQ4YjtcIj4mdGltZXM7PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiIHN0eWxlPVwicGFkZGluZzoyMHB4O1wiPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmdyaWQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmciAxZnI7Z2FwOjE0cHg7XCI+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZ3JpZC1jb2x1bW46MS8tMTtcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBpLW5hbWUtaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkZ1bGwgTmFtZTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwicGktbmFtZS1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIiBwbGFjZWhvbGRlcj1cImUuZy4gSmFuZSBTbWl0aCwgUGguRC5cIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZ3JpZC1jb2x1bW46MS8tMTtcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBpLXRpdGxlLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5Qcm9mZXNzaW9uYWwgVGl0bGUgLyBIZWFkbGluZTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwicGktdGl0bGUtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgcGxhY2Vob2xkZXI9XCJlLmcuIFNlbmlvciBEYXRhIFNjaWVudGlzdFwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwaS1lbWFpbC1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+RW1haWw8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImVtYWlsXCIgaWQ9XCJwaS1lbWFpbC1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIiBwbGFjZWhvbGRlcj1cInlvdUBleGFtcGxlLmNvbVwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwaS1waG9uZS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+UGhvbmU8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRlbFwiIGlkPVwicGktcGhvbmUtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgcGxhY2Vob2xkZXI9XCI1NTUtMTIzLTQ1NjdcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicGktbGlua2VkaW4taW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkxpbmtlZEluIFVSTDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidXJsXCIgaWQ9XCJwaS1saW5rZWRpbi1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIiBwbGFjZWhvbGRlcj1cImh0dHBzOi8vbGlua2VkaW4uY29tL2luL3lvdVwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwaS13ZWJzaXRlLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5XZWJzaXRlPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ1cmxcIiBpZD1cInBpLXdlYnNpdGUtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgcGxhY2Vob2xkZXI9XCJodHRwczovL3lvdXJzaXRlLmNvbVwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwaS1jaXR5LWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5DaXR5PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJwaS1jaXR5LWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiIHBsYWNlaG9sZGVyPVwiUm9jaGVzdGVyXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBpLXN0YXRlLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5TdGF0ZSAvIFJlZ2lvbjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwicGktc3RhdGUtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgcGxhY2Vob2xkZXI9XCJOWVwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0blwiIG9uY2xpY2s9XCJjbG9zZVBlcnNvbmFsSW5mb01vZGFsKClcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBwcmltYXJ5XCIgb25jbGljaz1cInNhdmVQZXJzb25hbEluZm8oKVwiPlNhdmU8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gRXhwZXJpZW5jZSBtb2RhbCAtLT5cbiAgICA8ZGl2IGlkPVwibWFzdGVyLWV4cC1tb2RhbC1vdmVybGF5XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCIgcm9sZT1cImRpYWxvZ1wiIGFyaWEtbW9kYWw9XCJ0cnVlXCJcbiAgICAgICAgYXJpYS1sYWJlbGxlZGJ5PVwibWFzdGVyLWV4cC1tb2RhbC10aXRsZVwiIGNsYXNzPVwibW9kYWwtb3ZlcmxheVwiXG4gICAgICAgIG9uY2xpY2s9XCJpZihldmVudC50YXJnZXQ9PT10aGlzKWNsb3NlRXhwZXJpZW5jZU1vZGFsKClcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbFwiIHN0eWxlPVwibWF4LXdpZHRoOjY0MHB4O1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XG4gICAgICAgICAgPGgyIGlkPVwibWFzdGVyLWV4cC1tb2RhbC10aXRsZVwiPldvcmsgRXhwZXJpZW5jZTwvaDI+XG4gICAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPVwiY2xvc2VFeHBlcmllbmNlTW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJDbG9zZSBleHBlcmllbmNlIGVkaXRvclwiXG4gICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDpub25lO2JvcmRlcjpub25lO2ZvbnQtc2l6ZToxLjRlbTtjdXJzb3I6cG9pbnRlcjtjb2xvcjojNjQ3NDhiO1wiPiZ0aW1lczs8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCIgc3R5bGU9XCJwYWRkaW5nOjIwcHg7XCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBpZD1cImV4cC1tb2RhbC1pZFwiIC8+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6MWZyIDFmcjtnYXA6MTRweDtcIj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJncmlkLWNvbHVtbjoxLy0xO1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZXhwLXRpdGxlLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5Kb2IgVGl0bGUgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+Kjwvc3Bhbj48L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImV4cC10aXRsZS1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIiBhcmlhLXJlcXVpcmVkPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gU2VuaW9yIERhdGEgU2NpZW50aXN0XCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImdyaWQtY29sdW1uOjEvLTE7XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJleHAtY29tcGFueS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+Q29tcGFueSA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4qPC9zcGFuPjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZXhwLWNvbXBhbnktaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgYXJpYS1yZXF1aXJlZD1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIEFjbWUgQ29ycFwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJleHAtY2l0eS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+Q2l0eTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZXhwLWNpdHktaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgcGxhY2Vob2xkZXI9XCJCb3N0b25cIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZXhwLXN0YXRlLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5TdGF0ZSAvIFJlZ2lvbjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZXhwLXN0YXRlLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiIHBsYWNlaG9sZGVyPVwiTUFcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZXhwLXN0YXJ0LWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5TdGFydCBEYXRlPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJleHAtc3RhcnQtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgcGxhY2Vob2xkZXI9XCIyMDIwLTAxXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImV4cC1lbmQtaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkVuZCBEYXRlIChibGFuayA9IHByZXNlbnQpPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJleHAtZW5kLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiIHBsYWNlaG9sZGVyPVwiMjAyNC0wNiBvciBsZWF2ZSBibGFua1wiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJleHAtdHlwZS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+RW1wbG95bWVudCBUeXBlPC9sYWJlbD5cbiAgICAgICAgICAgICAgPHNlbGVjdCBpZD1cImV4cC10eXBlLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiPlxuICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJmdWxsX3RpbWVcIj5GdWxsLXRpbWU8L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicGFydF90aW1lXCI+UGFydC10aW1lPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImNvbnRyYWN0XCI+Q29udHJhY3Q8L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiY29uc3VsdGluZ1wiPkNvbnN1bHRpbmc8L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiaW50ZXJuc2hpcFwiPkludGVybnNoaXA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwic2VsZl9lbXBsb3llZFwiPlNlbGYtZW1wbG95ZWQ8L29wdGlvbj5cbiAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJleHAtaW1wb3J0YW5jZS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+SW1wb3J0YW5jZSAoMVx1MjAxMzEwKTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJleHAtaW1wb3J0YW5jZS1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6ODBweDtcIlxuICAgICAgICAgICAgICAgICAgbWluPVwiMVwiIG1heD1cIjEwXCIgdmFsdWU9XCI1XCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImdyaWQtY29sdW1uOjEvLTE7XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJleHAtdGFncy1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+VGFncyAoY29tbWEtc2VwYXJhdGVkKTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZXhwLXRhZ3MtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBtbCwgbGVhZGVyc2hpcCwgcHl0aG9uXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImdyaWQtY29sdW1uOjEvLTE7Ym9yZGVyLXRvcDoxcHggc29saWQgdmFyKC0tY3YtYm9yZGVyKTtwYWRkaW5nLXRvcDoxNHB4O21hcmdpbi10b3A6NHB4O1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjZweDtcIj5BY2hpZXZlbWVudHM8L2xhYmVsPlxuICAgICAgICAgICAgICA8ZGl2IGlkPVwiZXhwLWFjaGlldmVtZW50cy1lZGl0b3ItbGlzdFwiPjwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDo2cHg7bWFyZ2luLXRvcDo2cHg7XCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJleHAtYWNoLW5ldy1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwiZmxleDoxO1wiXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQWRkIGFuIGFjaGlldmVtZW50IG9yIGJ1bGxldFx1MjAyNlwiXG4gICAgICAgICAgICAgICAgICAgIG9ua2V5ZG93bj1cImlmKGV2ZW50LmtleT09PSdFbnRlcicpe2V2ZW50LnByZXZlbnREZWZhdWx0KCk7X2FkZEV4cEFjaGlldmVtZW50KCk7fVwiIC8+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhY3Rpb24tYnRuIHNlY29uZGFyeVwiIG9uY2xpY2s9XCJfYWRkRXhwQWNoaWV2ZW1lbnQoKVwiPisgQWRkPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwiY2xvc2VFeHBlcmllbmNlTW9kYWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHByaW1hcnlcIiBvbmNsaWNrPVwic2F2ZU1hc3RlckV4cGVyaWVuY2UoKVwiPlNhdmU8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gU2tpbGwgYWRkIG1vZGFsIC0tPlxuICAgIDxkaXYgaWQ9XCJtYXN0ZXItc2tpbGwtbW9kYWwtb3ZlcmxheVwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLW1vZGFsPVwidHJ1ZVwiXG4gICAgICAgIGFyaWEtbGFiZWxsZWRieT1cIm1hc3Rlci1za2lsbC1tb2RhbC10aXRsZVwiIGNsYXNzPVwibW9kYWwtb3ZlcmxheVwiXG4gICAgICAgIG9uY2xpY2s9XCJpZihldmVudC50YXJnZXQ9PT10aGlzKWNsb3NlU2tpbGxNb2RhbCgpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWxcIiBzdHlsZT1cIm1heC13aWR0aDo0ODBweDtcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuICAgICAgICAgIDxoMiBpZD1cIm1hc3Rlci1za2lsbC1tb2RhbC10aXRsZVwiPkFkZCBTa2lsbDwvaDI+XG4gICAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPVwiY2xvc2VTa2lsbE1vZGFsKClcIiBhcmlhLWxhYmVsPVwiQ2xvc2Ugc2tpbGwgZWRpdG9yXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOm5vbmU7Zm9udC1zaXplOjEuNGVtO2N1cnNvcjpwb2ludGVyO2NvbG9yOiM2NDc0OGI7XCI+JnRpbWVzOzwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIiBzdHlsZT1cInBhZGRpbmc6MjBweDtcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImhpZGRlblwiIGlkPVwic2tpbGwtbW9kYWwtY2F0ZWdvcnlcIiAvPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJza2lsbC1tb2RhbC1pcy1mbGF0XCIgLz5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImhpZGRlblwiIGlkPVwic2tpbGwtbW9kYWwtb3JpZ2luYWwtbmFtZVwiIC8+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTRweDtcIiBpZD1cInNraWxsLWNhdGVnb3J5LXJvd1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cInNraWxsLWNhdGVnb3J5LWRpc3BsYXlcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkNhdGVnb3J5PC9sYWJlbD5cbiAgICAgICAgICAgIDxzcGFuIGlkPVwic2tpbGwtY2F0ZWdvcnktZGlzcGxheVwiIHN0eWxlPVwiZm9udC13ZWlnaHQ6NTAwO2NvbG9yOiMzMzQxNTU7XCI+PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwic2tpbGwtbmFtZS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+U2tpbGwgTmFtZSA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4qPC9zcGFuPjwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInNraWxsLW5hbWUtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgYXJpYS1yZXF1aXJlZD1cInRydWVcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBQeXRob25cIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwic2tpbGwtZXhwZXJpZW5jZXMtaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkFzc29jaWF0ZWQgRXhwZXJpZW5jZSBJRHMgKG9wdGlvbmFsKTwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInNraWxsLWV4cGVyaWVuY2VzLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIGV4cF8xMjMsIGV4cF80NTZcIiAvPlxuICAgICAgICAgICAgPHNtYWxsIHN0eWxlPVwiZGlzcGxheTpibG9jazttYXJnaW4tdG9wOjRweDtjb2xvcjojNjQ3NDhiO1wiPkNvbW1hLXNlcGFyYXRlZCBJRHMuIEEgc2tpbGwgY2FuIGJlIGxpbmtlZCB0byBtdWx0aXBsZSBleHBlcmllbmNlcy48L3NtYWxsPlxuICAgICAgICAgICAgPGRpdiBpZD1cInNraWxsLWV4cGVyaWVuY2UtaGludHNcIiBzdHlsZT1cIm1hcmdpbi10b3A6NnB4O2ZvbnQtc2l6ZTowLjhlbTtjb2xvcjojOTRhM2I4O1wiPjwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwic2tpbGwtYWxpYXNlcy1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+QWxpYXNlcyAoY29tbWEtc2VwYXJhdGVkLCBvcHRpb25hbCk8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJza2lsbC1hbGlhc2VzLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIEpTLCBFQ01BU2NyaXB0XCIgLz5cbiAgICAgICAgICAgIDxzbWFsbCBzdHlsZT1cImRpc3BsYXk6YmxvY2s7bWFyZ2luLXRvcDo0cHg7Y29sb3I6IzY0NzQ4YjtcIj5BbHRlcm5hdGUgbmFtZXMgYW4gQVRTIG9yIHJldmlld2VyIG1pZ2h0IHNlYXJjaCBmb3IuPC9zbWFsbD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cInNraWxsLXllYXJzLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5ZZWFycyBvZiBFeHBlcmllbmNlIChvcHRpb25hbCk8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cInNraWxsLXllYXJzLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMjBweDtcIiBtaW49XCIwXCIgc3RlcD1cIjAuNVwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwiY2xvc2VTa2lsbE1vZGFsKClcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBwcmltYXJ5XCIgaWQ9XCJtYXN0ZXItc2tpbGwtc2F2ZS1idG5cIiBvbmNsaWNrPVwic2F2ZU1hc3RlclNraWxsKClcIj5BZGQgU2tpbGw8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gRWR1Y2F0aW9uIG1vZGFsIC0tPlxuICAgIDxkaXYgaWQ9XCJtYXN0ZXItZWR1LW1vZGFsLW92ZXJsYXlcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1tb2RhbD1cInRydWVcIlxuICAgICAgICBhcmlhLWxhYmVsbGVkYnk9XCJtYXN0ZXItZWR1LW1vZGFsLXRpdGxlXCIgY2xhc3M9XCJtb2RhbC1vdmVybGF5XCJcbiAgICAgICAgb25jbGljaz1cImlmKGV2ZW50LnRhcmdldD09PXRoaXMpY2xvc2VFZHVjYXRpb25Nb2RhbCgpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWxcIiBzdHlsZT1cIm1heC13aWR0aDo1ODBweDtcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuICAgICAgICAgIDxoMiBpZD1cIm1hc3Rlci1lZHUtbW9kYWwtdGl0bGVcIj5FZHVjYXRpb248L2gyPlxuICAgICAgICAgIDxidXR0b24gb25jbGljaz1cImNsb3NlRWR1Y2F0aW9uTW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJDbG9zZSBlZHVjYXRpb24gZWRpdG9yXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOm5vbmU7Zm9udC1zaXplOjEuNGVtO2N1cnNvcjpwb2ludGVyO2NvbG9yOiM2NDc0OGI7XCI+JnRpbWVzOzwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIiBzdHlsZT1cInBhZGRpbmc6MjBweDtcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImhpZGRlblwiIGlkPVwiZWR1LW1vZGFsLWlkeFwiIHZhbHVlPVwiLTFcIiAvPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmdyaWQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmciAxZnI7Z2FwOjE0cHg7XCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZWR1LWRlZ3JlZS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+RGVncmVlIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPio8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJlZHUtZGVncmVlLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiIGFyaWEtcmVxdWlyZWQ9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBQaC5ELlwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJlZHUtZmllbGQtaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkZpZWxkIG9mIFN0dWR5PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJlZHUtZmllbGQtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBCaW9zdGF0aXN0aWNzXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImdyaWQtY29sdW1uOjEvLTE7XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJlZHUtaW5zdGl0dXRpb24taW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkluc3RpdHV0aW9uIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPio8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJlZHUtaW5zdGl0dXRpb24taW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgYXJpYS1yZXF1aXJlZD1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIFVuaXZlcnNpdHkgb2YgV2FzaGluZ3RvblwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJlZHUtY2l0eS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+Q2l0eTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZWR1LWNpdHktaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgcGxhY2Vob2xkZXI9XCJTZWF0dGxlXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImVkdS1zdGF0ZS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+U3RhdGU8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImVkdS1zdGF0ZS1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIiBwbGFjZWhvbGRlcj1cIldBXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImVkdS1zdGFydC15ZWFyLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5TdGFydCBZZWFyPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cImVkdS1zdGFydC15ZWFyLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiXG4gICAgICAgICAgICAgICAgICBtaW49XCIxOTUwXCIgbWF4PVwiMjA5OVwiIHBsYWNlaG9sZGVyPVwiMTk5NVwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJlZHUtZW5kLXllYXItaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkVuZCBZZWFyPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cImVkdS1lbmQteWVhci1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIlxuICAgICAgICAgICAgICAgICAgbWluPVwiMTk1MFwiIG1heD1cIjIwOTlcIiBwbGFjZWhvbGRlcj1cIjIwMDBcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwiY2xvc2VFZHVjYXRpb25Nb2RhbCgpXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG4gcHJpbWFyeVwiIG9uY2xpY2s9XCJzYXZlTWFzdGVyRWR1Y2F0aW9uKClcIj5TYXZlPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEF3YXJkIG1vZGFsIC0tPlxuICAgIDxkaXYgaWQ9XCJtYXN0ZXItYXdhcmQtbW9kYWwtb3ZlcmxheVwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLW1vZGFsPVwidHJ1ZVwiXG4gICAgICAgIGFyaWEtbGFiZWxsZWRieT1cIm1hc3Rlci1hd2FyZC1tb2RhbC10aXRsZVwiIGNsYXNzPVwibW9kYWwtb3ZlcmxheVwiXG4gICAgICAgIG9uY2xpY2s9XCJpZihldmVudC50YXJnZXQ9PT10aGlzKWNsb3NlQXdhcmRNb2RhbCgpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWxcIiBzdHlsZT1cIm1heC13aWR0aDo1ODBweDtcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuICAgICAgICAgIDxoMiBpZD1cIm1hc3Rlci1hd2FyZC1tb2RhbC10aXRsZVwiPkF3YXJkIC8gSG9ub3VyPC9oMj5cbiAgICAgICAgICA8YnV0dG9uIG9uY2xpY2s9XCJjbG9zZUF3YXJkTW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJDbG9zZSBhd2FyZCBlZGl0b3JcIlxuICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6bm9uZTtib3JkZXI6bm9uZTtmb250LXNpemU6MS40ZW07Y3Vyc29yOnBvaW50ZXI7Y29sb3I6IzY0NzQ4YjtcIj4mdGltZXM7PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiIHN0eWxlPVwicGFkZGluZzoyMHB4O1wiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJhd2FyZC1tb2RhbC1pZHhcIiB2YWx1ZT1cIi0xXCIgLz5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cImF3YXJkLXRpdGxlLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5UaXRsZSA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4qPC9zcGFuPjwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImF3YXJkLXRpdGxlLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiIGFyaWEtcmVxdWlyZWQ9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gRW1wbG95ZWUgb2YgdGhlIFllYXJcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwiYXdhcmQteWVhci1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+WWVhcjwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiYXdhcmQteWVhci1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwcHg7XCJcbiAgICAgICAgICAgICAgICBtaW49XCIxOTUwXCIgbWF4PVwiMjA5OVwiIHBsYWNlaG9sZGVyPVwiMjAyMlwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTRweDtcIj5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJhd2FyZC1kZXNjLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5EZXNjcmlwdGlvbjwvbGFiZWw+XG4gICAgICAgICAgICA8dGV4dGFyZWEgaWQ9XCJhd2FyZC1kZXNjLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgcm93cz1cIjNcIiBzdHlsZT1cIndpZHRoOjEwMCU7cmVzaXplOnZlcnRpY2FsO1wiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJCcmllZiBjb250ZXh0IG9yIGFjaGlldmVtZW50IGRlc2NyaXB0aW9uXCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cImF3YXJkLXJlbGV2YW50LWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5SZWxldmFudCBmb3IgKGNvbW1hLXNlcGFyYXRlZCk8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJhd2FyZC1yZWxldmFudC1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBsZWFkZXJzaGlwLCBwaGFybWFcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgb25jbGljaz1cImNsb3NlQXdhcmRNb2RhbCgpXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG4gcHJpbWFyeVwiIG9uY2xpY2s9XCJzYXZlTWFzdGVyQXdhcmQoKVwiPlNhdmU8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gQ2VydGlmaWNhdGlvbiBtb2RhbCAtLT5cbiAgICA8ZGl2IGlkPVwibWFzdGVyLWNlcnQtbW9kYWwtb3ZlcmxheVwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLW1vZGFsPVwidHJ1ZVwiXG4gICAgICAgIGFyaWEtbGFiZWxsZWRieT1cIm1hc3Rlci1jZXJ0LW1vZGFsLXRpdGxlXCIgY2xhc3M9XCJtb2RhbC1vdmVybGF5XCJcbiAgICAgICAgb25jbGljaz1cImlmKGV2ZW50LnRhcmdldD09PXRoaXMpY2xvc2VDZXJ0aWZpY2F0aW9uTW9kYWwoKVwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsXCIgc3R5bGU9XCJtYXgtd2lkdGg6NTAwcHg7XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cbiAgICAgICAgICA8aDIgaWQ9XCJtYXN0ZXItY2VydC1tb2RhbC10aXRsZVwiPkNlcnRpZmljYXRpb248L2gyPlxuICAgICAgICAgIDxidXR0b24gb25jbGljaz1cImNsb3NlQ2VydGlmaWNhdGlvbk1vZGFsKClcIiBhcmlhLWxhYmVsPVwiQ2xvc2UgY2VydGlmaWNhdGlvbiBlZGl0b3JcIlxuICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6bm9uZTtib3JkZXI6bm9uZTtmb250LXNpemU6MS40ZW07Y3Vyc29yOnBvaW50ZXI7Y29sb3I6IzY0NzQ4YjtcIj4mdGltZXM7PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiIHN0eWxlPVwicGFkZGluZzoyMHB4O1wiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJjZXJ0LW1vZGFsLWlkeFwiIHZhbHVlPVwiLTFcIiAvPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwiY2VydC1uYW1lLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5OYW1lIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPio8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiY2VydC1uYW1lLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiIGFyaWEtcmVxdWlyZWQ9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gQVdTIENlcnRpZmllZCBTb2x1dGlvbnMgQXJjaGl0ZWN0XCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNlcnQtaXNzdWVyLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5Jc3N1ZXI8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJjZXJ0LWlzc3Vlci1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBBbWF6b24gV2ViIFNlcnZpY2VzXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNlcnQteWVhci1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+WWVhcjwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiY2VydC15ZWFyLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDBweDtcIlxuICAgICAgICAgICAgICAgIG1pbj1cIjE5NTBcIiBtYXg9XCIyMDk5XCIgcGxhY2Vob2xkZXI9XCIyMDIzXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0blwiIG9uY2xpY2s9XCJjbG9zZUNlcnRpZmljYXRpb25Nb2RhbCgpXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG4gcHJpbWFyeVwiIG9uY2xpY2s9XCJzYXZlTWFzdGVyQ2VydGlmaWNhdGlvbigpXCI+U2F2ZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBBY2hpZXZlbWVudCBlZGl0IG1vZGFsIC0tPlxuICAgIDxkaXYgaWQ9XCJtYXN0ZXItYWNoLW1vZGFsLW92ZXJsYXlcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1tb2RhbD1cInRydWVcIlxuICAgICAgICBhcmlhLWxhYmVsbGVkYnk9XCJtYXN0ZXItYWNoLW1vZGFsLXRpdGxlXCIgY2xhc3M9XCJtb2RhbC1vdmVybGF5XCJcbiAgICAgICAgb25jbGljaz1cImlmKGV2ZW50LnRhcmdldD09PXRoaXMpY2xvc2VNYXN0ZXJBY2hNb2RhbCgpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWxcIiBzdHlsZT1cIm1heC13aWR0aDo2MDBweDtcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuICAgICAgICAgIDxoMiBpZD1cIm1hc3Rlci1hY2gtbW9kYWwtdGl0bGVcIj5BY2hpZXZlbWVudDwvaDI+XG4gICAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPVwiY2xvc2VNYXN0ZXJBY2hNb2RhbCgpXCIgYXJpYS1sYWJlbD1cIkNsb3NlIGFjaGlldmVtZW50IGVkaXRvclwiXG4gICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDpub25lO2JvcmRlcjpub25lO2ZvbnQtc2l6ZToxLjRlbTtjdXJzb3I6cG9pbnRlcjtjb2xvcjojNjQ3NDhiO1wiPiZ0aW1lczs8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCIgc3R5bGU9XCJwYWRkaW5nOjIwcHg7XCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBpZD1cImFjaC1tb2RhbC1pZFwiIC8+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTRweDtcIj5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJhY2gtbW9kYWwtdGl0bGUtaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPlRpdGxlIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPio8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiYWNoLW1vZGFsLXRpdGxlLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiIGFyaWEtcmVxdWlyZWQ9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gTGVkIDNcdTAwRDcgcmV2ZW51ZSBncm93dGggaW5pdGlhdGl2ZVwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTRweDtcIj5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJhY2gtbW9kYWwtZGVzYy1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+RGVzY3JpcHRpb248L2xhYmVsPlxuICAgICAgICAgICAgPHRleHRhcmVhIGlkPVwiYWNoLW1vZGFsLWRlc2MtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiByb3dzPVwiM1wiIHN0eWxlPVwid2lkdGg6MTAwJTtyZXNpemU6dmVydGljYWw7XCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIk9wdGlvbmFsIGRldGFpbCBvciBtZXRyaWNcIj48L3RleHRhcmVhPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwiYWNoLW1vZGFsLXJlbGV2YW50LWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5SZWxldmFudCBmb3IgKGNvbW1hLXNlcGFyYXRlZCByb2xlcy9kb21haW5zKTwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImFjaC1tb2RhbC1yZWxldmFudC1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBsZWFkZXJzaGlwLCBNTCBlbmdpbmVlcmluZywgZGF0YSBzY2llbmNlXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cImFjaC1tb2RhbC1pbXBvcnRhbmNlLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5JbXBvcnRhbmNlICgxXHUyMDEzMTApPC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJhY2gtbW9kYWwtaW1wb3J0YW5jZS1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6ODBweDtcIlxuICAgICAgICAgICAgICAgIG1pbj1cIjFcIiBtYXg9XCIxMFwiIHZhbHVlPVwiN1wiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwiY2xvc2VNYXN0ZXJBY2hNb2RhbCgpXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG4gcHJpbWFyeVwiIG9uY2xpY2s9XCJzYXZlTWFzdGVyQWNoaWV2ZW1lbnQoKVwiPlNhdmU8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gU3VtbWFyeSBlZGl0IG1vZGFsIC0tPlxuICAgIDxkaXYgaWQ9XCJtYXN0ZXItc3VtLW1vZGFsLW92ZXJsYXlcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1tb2RhbD1cInRydWVcIlxuICAgICAgICBhcmlhLWxhYmVsbGVkYnk9XCJtYXN0ZXItc3VtLW1vZGFsLXRpdGxlXCIgY2xhc3M9XCJtb2RhbC1vdmVybGF5XCJcbiAgICAgICAgb25jbGljaz1cImlmKGV2ZW50LnRhcmdldD09PXRoaXMpY2xvc2VNYXN0ZXJTdW1Nb2RhbCgpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWxcIiBzdHlsZT1cIm1heC13aWR0aDo2MDBweDtcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuICAgICAgICAgIDxoMiBpZD1cIm1hc3Rlci1zdW0tbW9kYWwtdGl0bGVcIj5Qcm9mZXNzaW9uYWwgU3VtbWFyeTwvaDI+XG4gICAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPVwiY2xvc2VNYXN0ZXJTdW1Nb2RhbCgpXCIgYXJpYS1sYWJlbD1cIkNsb3NlIHN1bW1hcnkgZWRpdG9yXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOm5vbmU7Zm9udC1zaXplOjEuNGVtO2N1cnNvcjpwb2ludGVyO2NvbG9yOiM2NDc0OGI7XCI+JnRpbWVzOzwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIiBzdHlsZT1cInBhZGRpbmc6MjBweDtcIj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cInN1bS1tb2RhbC1rZXktaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPktleS9uYW1lIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPio8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwic3VtLW1vZGFsLWtleS1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIiBhcmlhLXJlcXVpcmVkPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIG1sX2VuZ2luZWVyaW5nIG9yIGxlYWRlcnNoaXBcIiAvPlxuICAgICAgICAgICAgPHAgc3R5bGU9XCJmb250LXNpemU6MC44MmVtO2NvbG9yOiM2YjcyODA7bWFyZ2luOjRweCAwIDA7XCI+VXNlIGxvd2VyY2FzZV91bmRlcnNjb3JlIFx1MjAxNCB0aGlzIGlzIHRoZSBrZXkgdXNlZCBpbnRlcm5hbGx5IGFuZCBzaG93biBpbiB0aGUgU3VtbWFyeSBGb2N1cyBzdGVwLjwvcD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cInN1bS1tb2RhbC10ZXh0LWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5TdW1tYXJ5IHRleHQgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+Kjwvc3Bhbj48L2xhYmVsPlxuICAgICAgICAgICAgPHRleHRhcmVhIGlkPVwic3VtLW1vZGFsLXRleHQtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiByb3dzPVwiNVwiIHN0eWxlPVwid2lkdGg6MTAwJTtyZXNpemU6dmVydGljYWw7XCIgYXJpYS1yZXF1aXJlZD1cInRydWVcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiV3JpdGUgeW91ciBwcm9mZXNzaW9uYWwgc3VtbWFyeSB2YXJpYW50IGhlcmVcdTIwMjZcIj48L3RleHRhcmVhPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgb25jbGljaz1cImNsb3NlTWFzdGVyU3VtTW9kYWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHByaW1hcnlcIiBvbmNsaWNrPVwic2F2ZU1hc3RlclN1bW1hcnkoKVwiPlNhdmU8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYDtcbiAgLy8gRGlzYWJsZSB3cml0ZSBjb250cm9scyB3aGVuIHRoZSB3b3JrZmxvdyBwaGFzZSBkb2VzIG5vdCBwZXJtaXQgTWFzdGVyIENWIGVkaXRzLlxuICBpZiAoIWlzRWRpdGFibGUpIHtcbiAgICBjb25zdCBTQUZFX09OQ0xJQ0sgPSAvXihleHBvcnRNYXN0ZXJDVnx2YWxpZGF0ZVB1YmxpY2F0aW9uc0JpYnxvcGVuQmFja3VwSGlzdG9yeU1vZGFsfHJlc3RvcmVCYWNrdXB8b3BlbkZ1bGxEYXRhUHJldmlld01vZGFsKVxcKC87XG4gICAgY29udGVudC5xdWVyeVNlbGVjdG9yQWxsKCdidXR0b24nKS5mb3JFYWNoKGJ0biA9PiB7XG4gICAgICBjb25zdCBvbmNsaWNrID0gKGJ0bi5nZXRBdHRyaWJ1dGUoJ29uY2xpY2snKSB8fCAnJykudHJpbSgpO1xuICAgICAgaWYgKFNBRkVfT05DTElDSy50ZXN0KG9uY2xpY2spKSByZXR1cm47XG4gICAgICBidG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgYnRuLnN0eWxlLm9wYWNpdHkgPSAnMC40NSc7XG4gICAgICBidG4uc3R5bGUuY3Vyc29yID0gJ25vdC1hbGxvd2VkJztcbiAgICAgIGJ0bi5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgJ0VkaXRpbmcgbG9ja2VkIFx1MjAxNCBjb21wbGV0ZSB0aGUgY3VycmVudCBzdGFnZSB0byByZS1lbmFibGUnKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIExvYWQgcHVibGljYXRpb25zIGFzeW5jaHJvbm91c2x5IGFmdGVyIHRoZSBET00gaXMgcmVhZHkuXG4gIGxvYWRQdWJsaWNhdGlvbnMoKTtcbn1cblxuZnVuY3Rpb24gX3JlbmRlclBlcnNvbmFsSW5mb0NhcmQocGkpIHtcbiAgY29uc3QgY29udGFjdCA9IHBpLmNvbnRhY3QgfHwge307XG4gIGNvbnN0IGFkZHJlc3MgPSBjb250YWN0LmFkZHJlc3MgfHwge307XG4gIGNvbnN0IHJvd3MgPSBbXG4gICAgWydOYW1lJywgICAgICBwaS5uYW1lIHx8ICcnXSxcbiAgICBbJ1RpdGxlJywgICAgIHBpLnRpdGxlIHx8IHBpLmhlYWRsaW5lIHx8ICcnXSxcbiAgICBbJ0VtYWlsJywgICAgIGNvbnRhY3QuZW1haWwgfHwgcGkuZW1haWwgfHwgJyddLFxuICAgIFsnUGhvbmUnLCAgICAgY29udGFjdC5waG9uZSB8fCAnJ10sXG4gICAgWydMaW5rZWRJbicsICBjb250YWN0LmxpbmtlZGluIHx8ICcnXSxcbiAgICBbJ1dlYnNpdGUnLCAgIGNvbnRhY3Qud2Vic2l0ZSB8fCAnJ10sXG4gICAgWydMb2NhdGlvbicsICBbYWRkcmVzcy5jaXR5LCBhZGRyZXNzLnN0YXRlXS5maWx0ZXIoQm9vbGVhbikuam9pbignLCAnKV0sXG4gIF0uZmlsdGVyKChbLCB2XSkgPT4gdik7XG4gIGlmICghcm93cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gJzxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtwYWRkaW5nOjEycHggMDtcIj5ObyBwZXJzb25hbCBpbmZvcm1hdGlvbiBvbiBmaWxlLiBDbGljayBcIlx1MjcwRlx1RkUwRiBFZGl0XCIgYWJvdmUgdG8gYWRkIHlvdXIgZGV0YWlscy48L3A+JztcbiAgfVxuICByZXR1cm4gYDxkbCBjbGFzcz1cIm1hc3Rlci1pbmZvLWdyaWRcIj4ke3Jvd3MubWFwKChbbGFiZWwsIHZhbHVlXSkgPT5cbiAgICBgPGRpdiBjbGFzcz1cIm1hc3Rlci1pbmZvLXJvd1wiPjxkdD4ke2VzY2FwZUh0bWwobGFiZWwpfTwvZHQ+PGRkPiR7ZXNjYXBlSHRtbCh2YWx1ZSl9PC9kZD48L2Rpdj5gXG4gICkuam9pbignJyl9PC9kbD5gO1xufVxuXG5mdW5jdGlvbiBfcmVuZGVyRXhwZXJpZW5jZXNMaXN0KGV4cGVyaWVuY2VzKSB7XG4gIGlmICghZXhwZXJpZW5jZXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuICc8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7cGFkZGluZzoxMnB4IDA7XCI+Tm8gZXhwZXJpZW5jZSBlbnRyaWVzIHlldC4gQ2xpY2sgXCIrIEFkZCBFeHBlcmllbmNlXCIgYWJvdmUuPC9wPic7XG4gIH1cbiAgY29uc3Qgcm93cyA9IGV4cGVyaWVuY2VzLm1hcCgoZXhwLCBpZHgpID0+IHtcbiAgICBjb25zdCB0aXRsZSAgID0gZXNjYXBlSHRtbChleHAudGl0bGUgfHwgJycpO1xuICAgIGNvbnN0IGNvbXBhbnkgPSBlc2NhcGVIdG1sKGV4cC5jb21wYW55IHx8ICcnKTtcbiAgICBjb25zdCBsb2MgICAgID0gZXhwLmxvY2F0aW9uIHx8IHt9O1xuICAgIGNvbnN0IGxvY2F0aW9uID0gZXNjYXBlSHRtbChbbG9jLmNpdHksIGxvYy5zdGF0ZV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJywgJykpO1xuICAgIGNvbnN0IGRhdGVzICAgPSBlc2NhcGVIdG1sKFtleHAuc3RhcnRfZGF0ZSwgZXhwLmVuZF9kYXRlIHx8ICdQcmVzZW50J10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyBcdTIwMTMgJykpO1xuICAgIGNvbnN0IGFjaENvdW50ID0gKGV4cC5hY2hpZXZlbWVudHMgfHwgW10pLmxlbmd0aDtcbiAgICBjb25zdCBleHBJZCA9IGVzY2FwZUh0bWwoZXhwLmlkIHx8ICcnKTtcbiAgICByZXR1cm4gYFxuICAgICAgPHRyPlxuICAgICAgICA8dGQ+XG4gICAgICAgICAgPHN0cm9uZz4ke3RpdGxlfTwvc3Ryb25nPjxicj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiM0NzU1Njk7XCI+JHtjb21wYW55fTwvc3Bhbj5cbiAgICAgICAgICAke2xvY2F0aW9uID8gYDxzcGFuIHN0eWxlPVwiY29sb3I6Izk0YTNiODtmb250LXNpemU6MC44NWVtO1wiPiBcdTAwQjcgJHtsb2NhdGlvbn08L3NwYW4+YCA6ICcnfVxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2NvbG9yOiM0NzU1Njk7d2hpdGUtc3BhY2U6bm93cmFwO1wiPiR7ZGF0ZXN9PC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7Y29sb3I6Izk0YTNiODtmb250LXNpemU6MC44NWVtO1wiPiR7YWNoQ291bnR9PC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwiYWN0aW9uLWJ0bnNcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBvbmNsaWNrPVwiZWRpdE1hc3RlckV4cGVyaWVuY2UoJyR7ZXhwSWR9JylcIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiRWRpdCBleHBlcmllbmNlOiAke3RpdGxlfVwiIHRpdGxlPVwiRWRpdFwiPlx1MjcwRlx1RkUwRjwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIG9uY2xpY2s9XCJkZWxldGVNYXN0ZXJFeHBlcmllbmNlKCcke2VzY2FwZUh0bWwoZXhwLmlkIHx8ICcnKX0nLCAnJHt0aXRsZX0nKVwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJEZWxldGUgZXhwZXJpZW5jZTogJHt0aXRsZX1cIiB0aXRsZT1cIkRlbGV0ZVwiPlx1RDgzRFx1REREMVx1RkUwRjwvYnV0dG9uPlxuICAgICAgICA8L3RkPlxuICAgICAgPC90cj5gO1xuICB9KS5qb2luKCcnKTtcbiAgcmV0dXJuIGBcbiAgICA8dGFibGUgY2xhc3M9XCJyZXZpZXctdGFibGVcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCI+XG4gICAgICA8dGhlYWQ+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8dGg+Um9sZSAvIENvbXBhbnk8L3RoPlxuICAgICAgICAgIDx0aD5EYXRlczwvdGg+XG4gICAgICAgICAgPHRoIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7d2lkdGg6NjBweDtcIj5CdWxsZXRzPC90aD5cbiAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDo4MHB4O1wiPkFjdGlvbnM8L3RoPlxuICAgICAgICA8L3RyPlxuICAgICAgPC90aGVhZD5cbiAgICAgIDx0Ym9keT4ke3Jvd3N9PC90Ym9keT5cbiAgICA8L3RhYmxlPmA7XG59XG5cbmZ1bmN0aW9uIF9yZW5kZXJTa2lsbHNTZWN0aW9uKHNraWxscykge1xuICBjb25zdCBub3JtYWxpemVTa2lsbCA9IChzKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBzID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHsgbmFtZTogcywgZXhwZXJpZW5jZXM6IFtdIH07XG4gICAgfVxuICAgIGlmIChzICYmIHR5cGVvZiBzID09PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogcy5uYW1lIHx8ICcnLFxuICAgICAgICBleHBlcmllbmNlczogQXJyYXkuaXNBcnJheShzLmV4cGVyaWVuY2VzKSA/IHMuZXhwZXJpZW5jZXMgOiBbXSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7IG5hbWU6IFN0cmluZyhzIHx8ICcnKSwgZXhwZXJpZW5jZXM6IFtdIH07XG4gIH07XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoc2tpbGxzKSkge1xuICAgIGlmICghc2tpbGxzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuICc8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7cGFkZGluZzoxMnB4IDA7XCI+Tm8gc2tpbGxzIG9uIGZpbGUuIENsaWNrIFwiKyBBZGQgU2tpbGxcIiBhYm92ZS48L3A+JztcbiAgICB9XG4gICAgY29uc3QgY2hpcHMgPSBza2lsbHMubWFwKHMgPT4ge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZVNraWxsKHMpO1xuICAgICAgY29uc3QgbmFtZSA9IGVzY2FwZUh0bWwobm9ybWFsaXplZC5uYW1lKTtcbiAgICAgIGNvbnN0IHJhdyA9IGVzY2FwZUh0bWwobm9ybWFsaXplZC5uYW1lKTtcbiAgICAgIGNvbnN0IGJhZGdlID0gbm9ybWFsaXplZC5leHBlcmllbmNlcy5sZW5ndGhcbiAgICAgICAgPyBgPHNtYWxsIHN0eWxlPVwiY29sb3I6IzY0NzQ4YjttYXJnaW4tbGVmdDo2cHg7XCI+KCR7bm9ybWFsaXplZC5leHBlcmllbmNlcy5sZW5ndGh9IGV4cCk8L3NtYWxsPmBcbiAgICAgICAgOiAnJztcbiAgICAgIGNvbnN0IHNraWxsSnNvbiA9IGVzY2FwZUh0bWwoSlNPTi5zdHJpbmdpZnkoeyBuYW1lOiBub3JtYWxpemVkLm5hbWUsIGV4cGVyaWVuY2VzOiBub3JtYWxpemVkLmV4cGVyaWVuY2VzIH0pKTtcbiAgICAgIHJldHVybiBgPHNwYW4gY2xhc3M9XCJza2lsbC1jaGlwXCI+JHtuYW1lfSR7YmFkZ2V9PGJ1dHRvbiBjbGFzcz1cInNraWxsLWNoaXAtZGVsXCIgb25jbGljaz1cImVkaXRNYXN0ZXJTa2lsbCgke3NraWxsSnNvbn0sICcnLCB0cnVlKVwiIGFyaWEtbGFiZWw9XCJFZGl0IHNraWxsICR7bmFtZX1cIiB0aXRsZT1cIkVkaXRcIj5cdTI3MEZcdUZFMEY8L2J1dHRvbj48YnV0dG9uIGNsYXNzPVwic2tpbGwtY2hpcC1kZWxcIiBvbmNsaWNrPVwiZGVsZXRlTWFzdGVyU2tpbGwoJyR7cmF3fScsICcnLCB0cnVlKVwiIGFyaWEtbGFiZWw9XCJSZW1vdmUgc2tpbGwgJHtuYW1lfVwiIHRpdGxlPVwiUmVtb3ZlXCI+XHUwMEQ3PC9idXR0b24+PC9zcGFuPmA7XG4gICAgfSkuam9pbignJyk7XG4gICAgcmV0dXJuIGA8ZGl2IGNsYXNzPVwic2tpbGwtY2hpcHMtY29udGFpbmVyXCI+JHtjaGlwc308L2Rpdj5gO1xuICB9XG4gIGlmICh0eXBlb2Ygc2tpbGxzID09PSAnb2JqZWN0JyAmJiBza2lsbHMgIT09IG51bGwpIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoc2tpbGxzKTtcbiAgICBpZiAoIWtleXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gJzxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtwYWRkaW5nOjEycHggMDtcIj5ObyBza2lsbCBjYXRlZ29yaWVzIG9uIGZpbGUuPC9wPic7XG4gICAgfVxuICAgIHJldHVybiBrZXlzLm1hcChjYXRLZXkgPT4ge1xuICAgICAgY29uc3QgY2F0VmFsICA9IHNraWxsc1tjYXRLZXldO1xuICAgICAgY29uc3QgY2F0TmFtZSAgPSB0eXBlb2YgY2F0VmFsID09PSAnb2JqZWN0JyAmJiBjYXRWYWwuY2F0ZWdvcnkgPyBjYXRWYWwuY2F0ZWdvcnkgOiBjYXRLZXk7XG4gICAgICBjb25zdCBjYXRMaXN0ICA9IEFycmF5LmlzQXJyYXkoY2F0VmFsKSA/IGNhdFZhbFxuICAgICAgICAgICAgICAgICAgICAgOiBBcnJheS5pc0FycmF5KGNhdFZhbD8uc2tpbGxzKSA/IGNhdFZhbC5za2lsbHMgOiBbXTtcbiAgICAgIGNvbnN0IGNoaXBzICAgPSBjYXRMaXN0Lm1hcChzID0+IHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZVNraWxsKHMpO1xuICAgICAgICBjb25zdCBuYW1lID0gZXNjYXBlSHRtbChub3JtYWxpemVkLm5hbWUpO1xuICAgICAgICBjb25zdCBiYWRnZSA9IG5vcm1hbGl6ZWQuZXhwZXJpZW5jZXMubGVuZ3RoXG4gICAgICAgICAgPyBgPHNtYWxsIHN0eWxlPVwiY29sb3I6IzY0NzQ4YjttYXJnaW4tbGVmdDo2cHg7XCI+KCR7bm9ybWFsaXplZC5leHBlcmllbmNlcy5sZW5ndGh9IGV4cCk8L3NtYWxsPmBcbiAgICAgICAgICA6ICcnO1xuICAgICAgICBjb25zdCBza2lsbEpzb24gPSBlc2NhcGVIdG1sKEpTT04uc3RyaW5naWZ5KHsgbmFtZTogbm9ybWFsaXplZC5uYW1lLCBleHBlcmllbmNlczogbm9ybWFsaXplZC5leHBlcmllbmNlcyB9KSk7XG4gICAgICAgIHJldHVybiBgPHNwYW4gY2xhc3M9XCJza2lsbC1jaGlwXCI+JHtuYW1lfSR7YmFkZ2V9PGJ1dHRvbiBjbGFzcz1cInNraWxsLWNoaXAtZGVsXCIgb25jbGljaz1cImVkaXRNYXN0ZXJTa2lsbCgke3NraWxsSnNvbn0sICcke2VzY2FwZUh0bWwoY2F0S2V5KX0nLCBmYWxzZSlcIiBhcmlhLWxhYmVsPVwiRWRpdCAke25hbWV9XCIgdGl0bGU9XCJFZGl0XCI+XHUyNzBGXHVGRTBGPC9idXR0b24+PGJ1dHRvbiBjbGFzcz1cInNraWxsLWNoaXAtZGVsXCIgb25jbGljaz1cImRlbGV0ZU1hc3RlclNraWxsKCcke25hbWV9JywgJyR7ZXNjYXBlSHRtbChjYXRLZXkpfScsIGZhbHNlKVwiIGFyaWEtbGFiZWw9XCJSZW1vdmUgJHtuYW1lfVwiIHRpdGxlPVwiUmVtb3ZlXCI+XHUwMEQ3PC9idXR0b24+PC9zcGFuPmA7XG4gICAgICB9KS5qb2luKCcnKTtcbiAgICAgIGNvbnN0IGNhdEtleUVzYyAgPSBlc2NhcGVIdG1sKGNhdEtleSk7XG4gICAgICBjb25zdCBjYXROYW1lRXNjID0gZXNjYXBlSHRtbChjYXROYW1lKTtcbiAgICAgIHJldHVybiBgXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc2tpbGwtY2F0ZWdvcnlcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXNraWxsLWNhdC1oZWFkZXJcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWFzdGVyLXNraWxsLWNhdC1uYW1lXCI+JHtjYXROYW1lRXNjfTwvc3Bhbj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuLXNtXCIgb25jbGljaz1cInNob3dBZGRTa2lsbE1vZGFsKCcke2NhdEtleUVzY30nLCBmYWxzZSlcIlxuICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJBZGQgc2tpbGwgdG8gJHtjYXROYW1lRXNjfVwiPisgQWRkPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNraWxsLWNoaXBzLWNvbnRhaW5lclwiPiR7Y2hpcHMgfHwgJzxzcGFuIHN0eWxlPVwiY29sb3I6Izk0YTNiODtmb250LXNpemU6MC44NWVtO1wiPk5vIHNraWxscyBpbiB0aGlzIGNhdGVnb3J5PC9zcGFuPid9PC9kaXY+XG4gICAgICAgIDwvZGl2PmA7XG4gICAgfSkuam9pbignJyk7XG4gIH1cbiAgcmV0dXJuICc8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7XCI+U2tpbGxzIGRhdGEgZm9ybWF0IG5vdCByZWNvZ25pc2VkLjwvcD4nO1xufVxuXG5mdW5jdGlvbiBfcmVuZGVyRWR1Y2F0aW9uTGlzdChlZHVjYXRpb24pIHtcbiAgaWYgKCFlZHVjYXRpb24ubGVuZ3RoKSB7XG4gICAgcmV0dXJuICc8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7cGFkZGluZzoxMnB4IDA7XCI+Tm8gZWR1Y2F0aW9uIGVudHJpZXMgeWV0LiBDbGljayBcIisgQWRkIEVkdWNhdGlvblwiIGFib3ZlLjwvcD4nO1xuICB9XG4gIGNvbnN0IHJvd3MgPSBlZHVjYXRpb24ubWFwKChlZHUsIGlkeCkgPT4ge1xuICAgIGNvbnN0IGRlZ3JlZSAgICAgID0gZXNjYXBlSHRtbChlZHUuZGVncmVlIHx8ICcnKTtcbiAgICBjb25zdCBmaWVsZCAgICAgICA9IGVzY2FwZUh0bWwoZWR1LmZpZWxkIHx8ICcnKTtcbiAgICBjb25zdCBpbnN0aXR1dGlvbiA9IGVzY2FwZUh0bWwoZWR1Lmluc3RpdHV0aW9uIHx8ICcnKTtcbiAgICBjb25zdCBsb2MgICAgICAgICA9IGVkdS5sb2NhdGlvbiB8fCB7fTtcbiAgICBjb25zdCBsb2NhdGlvbiAgICA9IGVzY2FwZUh0bWwoW2xvYy5jaXR5LCBsb2Muc3RhdGVdLmZpbHRlcihCb29sZWFuKS5qb2luKCcsICcpKTtcbiAgICBjb25zdCB5ZWFycyAgICAgICA9IFtlZHUuc3RhcnRfeWVhciwgZWR1LmVuZF95ZWFyXS5maWx0ZXIoQm9vbGVhbikuam9pbignXHUyMDEzJyk7XG4gICAgY29uc3QgZWR1SnNvbiA9IGVzY2FwZUh0bWwoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZGVncmVlOiBlZHUuZGVncmVlIHx8ICcnLCBmaWVsZDogZWR1LmZpZWxkIHx8ICcnLCBpbnN0aXR1dGlvbjogZWR1Lmluc3RpdHV0aW9uIHx8ICcnLFxuICAgICAgY2l0eTogbG9jLmNpdHkgfHwgJycsIHN0YXRlOiBsb2Muc3RhdGUgfHwgJycsXG4gICAgICBzdGFydF95ZWFyOiBlZHUuc3RhcnRfeWVhciB8fCAnJywgZW5kX3llYXI6IGVkdS5lbmRfeWVhciB8fCAnJyxcbiAgICB9KSk7XG4gICAgcmV0dXJuIGBcbiAgICAgIDx0cj5cbiAgICAgICAgPHRkPlxuICAgICAgICAgIDxzdHJvbmc+JHtkZWdyZWV9JHtmaWVsZCA/IGAsICR7ZmllbGR9YCA6ICcnfTwvc3Ryb25nPjxicj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiM0NzU1Njk7XCI+JHtpbnN0aXR1dGlvbn08L3NwYW4+XG4gICAgICAgICAgJHtsb2NhdGlvbiA/IGA8c3BhbiBzdHlsZT1cImNvbG9yOiM5NGEzYjg7Zm9udC1zaXplOjAuODVlbTtcIj4gXHUwMEI3ICR7bG9jYXRpb259PC9zcGFuPmAgOiAnJ31cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtjb2xvcjojNDc1NTY5O3doaXRlLXNwYWNlOm5vd3JhcDtcIj4ke3llYXJzIHx8ICdcdTIwMTQnfTwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cImFjdGlvbi1idG5zXCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgb25jbGljaz1cImVkaXRNYXN0ZXJFZHVjYXRpb24oJHtlZHVKc29ufSwgJHtpZHh9KVwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJFZGl0IGVkdWNhdGlvbjogJHtpbnN0aXR1dGlvbn1cIiB0aXRsZT1cIkVkaXRcIj5cdTI3MEZcdUZFMEY8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBvbmNsaWNrPVwiZGVsZXRlTWFzdGVyRWR1Y2F0aW9uKCR7aWR4fSwgJyR7aW5zdGl0dXRpb259JylcIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiRGVsZXRlIGVkdWNhdGlvbjogJHtpbnN0aXR1dGlvbn1cIiB0aXRsZT1cIkRlbGV0ZVwiPlx1RDgzRFx1REREMVx1RkUwRjwvYnV0dG9uPlxuICAgICAgICA8L3RkPlxuICAgICAgPC90cj5gO1xuICB9KS5qb2luKCcnKTtcbiAgcmV0dXJuIGBcbiAgICA8dGFibGUgY2xhc3M9XCJyZXZpZXctdGFibGVcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCI+XG4gICAgICA8dGhlYWQ+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8dGg+RGVncmVlIC8gSW5zdGl0dXRpb248L3RoPlxuICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOjEwMHB4O1wiPlllYXJzPC90aD5cbiAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDo4MHB4O1wiPkFjdGlvbnM8L3RoPlxuICAgICAgICA8L3RyPlxuICAgICAgPC90aGVhZD5cbiAgICAgIDx0Ym9keT4ke3Jvd3N9PC90Ym9keT5cbiAgICA8L3RhYmxlPmA7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUHVibGljYXRpb25zIFx1MjAxNCBDUlVEICsgcmF3IEJpYlRlWCB0b2dnbGVcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogQ3VycmVudCB2aWV3IG1vZGU6ICdjcnVkJyB8ICdyYXcnICovXG5sZXQgX3B1YlZpZXdNb2RlID0gJ2NydWQnO1xubGV0IF9wdWJTb3J0TW9kZSA9ICd5ZWFyX2Rlc2MnO1xubGV0IF9wdWJHcm91cE1vZGUgPSAnbm9uZSc7XG4vKiogVHJ1ZSB3aGVuIHRoZSBlbnRyeSBiZWluZyBlZGl0ZWQgaGFkIGFuIGBlZGl0b3JgIGZpZWxkIGJ1dCBubyBgYXV0aG9yYC4gKi9cbmxldCBfcHViTW9kYWxVc2VzRWRpdG9yRmllbGQgPSBmYWxzZTtcblxuZnVuY3Rpb24gdG9nZ2xlUHVibGljYXRpb25zVmlldygpIHtcbiAgX3B1YlZpZXdNb2RlID0gX3B1YlZpZXdNb2RlID09PSAnY3J1ZCcgPyAncmF3JyA6ICdjcnVkJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItY3J1ZC12aWV3Jykuc3R5bGUuZGlzcGxheSA9IF9wdWJWaWV3TW9kZSA9PT0gJ2NydWQnID8gJycgOiAnbm9uZSc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLXJhdy12aWV3Jykuc3R5bGUuZGlzcGxheSAgPSBfcHViVmlld01vZGUgPT09ICdyYXcnICA/ICcnIDogJ25vbmUnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1hZGQtYnRuJykuc3R5bGUuZGlzcGxheSAgID0gX3B1YlZpZXdNb2RlID09PSAnY3J1ZCcgPyAnJyA6ICdub25lJztcbiAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItdG9nZ2xlLWJ0bicpO1xuICBpZiAoYnRuKSBidG4udGV4dENvbnRlbnQgPSBfcHViVmlld01vZGUgPT09ICdjcnVkJyA/ICdcdTI3MEZcdUZFMEYgUmF3IEJpYlRlWCcgOiAnXHVEODNEXHVEQ0NCIFN0cnVjdHVyZWQgVmlldyc7XG4gIGlmIChfcHViVmlld01vZGUgPT09ICdyYXcnKSBsb2FkUHVibGljYXRpb25zQmliKCk7XG59XG5cbi8qKiBMb2FkIGJvdGggc3RydWN0dXJlZCBsaXN0IGFuZCByYXcgY29udGVudCBmcm9tIGEgc2luZ2xlIEFQSSBjYWxsLiAqL1xuYXN5bmMgZnVuY3Rpb24gbG9hZFB1YmxpY2F0aW9ucygpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvcHVibGljYXRpb25zJyk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEub2spIHtcbiAgICAgIF9yZW5kZXJQdWJsaWNhdGlvbnNDcnVkTGlzdChkYXRhLnB1YmxpY2F0aW9ucyB8fCBbXSk7XG4gICAgICBjb25zdCB0YSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLXRleHRhcmVhJyk7XG4gICAgICBpZiAodGEpIHRhLnZhbHVlID0gZGF0YS5jb250ZW50IHx8ICcnO1xuICAgICAgX3VwZGF0ZVB1YkNvdW50KGRhdGEuY291bnQgPz8gMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNydWQtY29udGFpbmVyJykuaW5uZXJIVE1MID1cbiAgICAgICAgYDxwIHN0eWxlPVwiY29sb3I6I2VmNDQ0NDtwYWRkaW5nOjEycHggMDtcIj5cdTI2QTBcdUZFMEYgJHtlc2NhcGVIdG1sKGRhdGEuZXJyb3IgfHwgJ0ZhaWxlZCB0byBsb2FkJyl9PC9wPmA7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1jcnVkLWNvbnRhaW5lcicpLmlubmVySFRNTCA9XG4gICAgICBgPHAgc3R5bGU9XCJjb2xvcjojZWY0NDQ0O3BhZGRpbmc6MTJweCAwO1wiPlx1MjZBMFx1RkUwRiBGYWlsZWQgdG8gbG9hZDogJHtlc2NhcGVIdG1sKGVyci5tZXNzYWdlKX08L3A+YDtcbiAgfVxufVxuXG4vKiogUmVsb2FkIG9ubHkgdGhlIHJhdyB0ZXh0YXJlYSBjb250ZW50IChjYWxsZWQgd2hlbiBzd2l0Y2hpbmcgdG8gcmF3IHZpZXcpLiAqL1xuYXN5bmMgZnVuY3Rpb24gbG9hZFB1YmxpY2F0aW9uc0JpYigpIHtcbiAgY29uc3QgdGEgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItdGV4dGFyZWEnKTtcbiAgY29uc3Qgc3RhdHVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItc3RhdHVzJyk7XG4gIGlmICghdGEpIHJldHVybjtcbiAgdGEuZGlzYWJsZWQgICAgPSB0cnVlO1xuICB0YS5wbGFjZWhvbGRlciA9ICdMb2FkaW5nXHUyMDI2JztcbiAgaWYgKHN0YXR1cykgc3RhdHVzLnRleHRDb250ZW50ID0gJyc7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL3B1YmxpY2F0aW9ucycpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICB0YS52YWx1ZSA9IGRhdGEuY29udGVudCB8fCAnJztcbiAgICAgIF91cGRhdGVQdWJDb3VudChkYXRhLmNvdW50ID8/IDApO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc3RhdHVzKSBzdGF0dXMudGV4dENvbnRlbnQgPSAnXHUyNkEwXHVGRTBGICcgKyAoZGF0YS5lcnJvciB8fCAnRmFpbGVkIHRvIGxvYWQnKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChzdGF0dXMpIHN0YXR1cy50ZXh0Q29udGVudCA9ICdcdTI2QTBcdUZFMEYgRmFpbGVkIHRvIGxvYWQ6ICcgKyBlcnIubWVzc2FnZTtcbiAgfSBmaW5hbGx5IHtcbiAgICB0YS5kaXNhYmxlZCAgICA9IGZhbHNlO1xuICAgIHRhLnBsYWNlaG9sZGVyID0gJyc7XG4gIH1cbn1cblxuZnVuY3Rpb24gX3VwZGF0ZVB1YkNvdW50KG4pIHtcbiAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1jb3VudCcpO1xuICBpZiAoZWwpIGVsLnRleHRDb250ZW50ID0gYCR7bn0gcHVibGljYXRpb24ke24gIT09IDEgPyAncycgOiAnJ30gb24gZmlsZWA7XG59XG5cbmZ1bmN0aW9uIF9zZXRQdWJsaWNhdGlvblN0YXR1cyhlbGVtZW50SWQsIHRleHQsIGNvbG9yID0gJyM2YjcyODAnKSB7XG4gIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbWVudElkKTtcbiAgaWYgKCFlbCkgcmV0dXJuO1xuICBlbC50ZXh0Q29udGVudCA9IHRleHQ7XG4gIGVsLnN0eWxlLmNvbG9yID0gY29sb3I7XG59XG5cbmZ1bmN0aW9uIHNldFB1YmxpY2F0aW9uU29ydE1vZGUobW9kZSkge1xuICBfcHViU29ydE1vZGUgPSBtb2RlIHx8ICd5ZWFyX2Rlc2MnO1xuICB2b2lkIGxvYWRQdWJsaWNhdGlvbnMoKTtcbn1cblxuZnVuY3Rpb24gc2V0UHVibGljYXRpb25Hcm91cE1vZGUobW9kZSkge1xuICBfcHViR3JvdXBNb2RlID0gbW9kZSB8fCAnbm9uZSc7XG4gIHZvaWQgbG9hZFB1YmxpY2F0aW9ucygpO1xufVxuXG5mdW5jdGlvbiBfZ2V0UHVibGljYXRpb25ZZWFyKHB1Yikge1xuICBjb25zdCByYXdZZWFyID0gcHViPy5maWVsZHM/LnllYXIgPz8gcHViPy55ZWFyID8/ICcnO1xuICBjb25zdCBtYXRjaCA9IFN0cmluZyhyYXdZZWFyKS5tYXRjaCgvXFxkezR9Lyk7XG4gIHJldHVybiBtYXRjaCA/IE51bWJlcihtYXRjaFswXSkgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBfY29tcGFyZVB1YmxpY2F0aW9ucyhsZWZ0LCByaWdodCkge1xuICBjb25zdCBsZWZ0WWVhciA9IF9nZXRQdWJsaWNhdGlvblllYXIobGVmdCkgPz8gLUluZmluaXR5O1xuICBjb25zdCByaWdodFllYXIgPSBfZ2V0UHVibGljYXRpb25ZZWFyKHJpZ2h0KSA/PyAtSW5maW5pdHk7XG4gIGNvbnN0IGxlZnRUeXBlID0gU3RyaW5nKGxlZnQ/LnR5cGUgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IHJpZ2h0VHlwZSA9IFN0cmluZyhyaWdodD8udHlwZSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgbGVmdEtleSA9IFN0cmluZyhsZWZ0Py5rZXkgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IHJpZ2h0S2V5ID0gU3RyaW5nKHJpZ2h0Py5rZXkgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG5cbiAgc3dpdGNoIChfcHViU29ydE1vZGUpIHtcbiAgICBjYXNlICd5ZWFyX2FzYyc6XG4gICAgICByZXR1cm4gKGxlZnRZZWFyIC0gcmlnaHRZZWFyKSB8fCBsZWZ0VHlwZS5sb2NhbGVDb21wYXJlKHJpZ2h0VHlwZSkgfHwgbGVmdEtleS5sb2NhbGVDb21wYXJlKHJpZ2h0S2V5KTtcbiAgICBjYXNlICd0eXBlX2FzYyc6XG4gICAgICByZXR1cm4gbGVmdFR5cGUubG9jYWxlQ29tcGFyZShyaWdodFR5cGUpIHx8IChyaWdodFllYXIgLSBsZWZ0WWVhcikgfHwgbGVmdEtleS5sb2NhbGVDb21wYXJlKHJpZ2h0S2V5KTtcbiAgICBjYXNlICd0eXBlX2Rlc2MnOlxuICAgICAgcmV0dXJuIHJpZ2h0VHlwZS5sb2NhbGVDb21wYXJlKGxlZnRUeXBlKSB8fCAocmlnaHRZZWFyIC0gbGVmdFllYXIpIHx8IGxlZnRLZXkubG9jYWxlQ29tcGFyZShyaWdodEtleSk7XG4gICAgY2FzZSAneWVhcl9kZXNjJzpcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIChyaWdodFllYXIgLSBsZWZ0WWVhcikgfHwgbGVmdFR5cGUubG9jYWxlQ29tcGFyZShyaWdodFR5cGUpIHx8IGxlZnRLZXkubG9jYWxlQ29tcGFyZShyaWdodEtleSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2dyb3VwUHVibGljYXRpb25MYWJlbChwdWIpIHtcbiAgaWYgKF9wdWJHcm91cE1vZGUgPT09ICd5ZWFyJykge1xuICAgIHJldHVybiBTdHJpbmcoX2dldFB1YmxpY2F0aW9uWWVhcihwdWIpID8/ICdVbmtub3duIHllYXInKTtcbiAgfVxuICBpZiAoX3B1Ykdyb3VwTW9kZSA9PT0gJ3R5cGUnKSB7XG4gICAgcmV0dXJuIHB1Yj8udHlwZSA/IFN0cmluZyhwdWIudHlwZSkgOiAnVW5rbm93biB0eXBlJztcbiAgfVxuICByZXR1cm4gJ1B1YmxpY2F0aW9ucyc7XG59XG5cbmZ1bmN0aW9uIF9yZW5kZXJQdWJsaWNhdGlvbnNDcnVkTGlzdChwdWJzKSB7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNydWQtY29udGFpbmVyJyk7XG4gIGlmICghY29udGFpbmVyKSByZXR1cm47XG4gIGNvbnN0IGNvbnRyb2xzSHRtbCA9IGBcbiAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2ZsZXgtd3JhcDp3cmFwO2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTJweDttYXJnaW4tYm90dG9tOjEycHg7XCI+XG4gICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDo2cHg7Y29sb3I6IzQ3NTU2OTtmb250LXNpemU6MC45ZW07XCI+XG4gICAgICAgIFNvcnRcbiAgICAgICAgPHNlbGVjdCBpZD1cIm1hc3Rlci1wdWItc29ydC1zZWxlY3RcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOmF1dG87bWluLXdpZHRoOjE1MHB4O1wiIG9uY2hhbmdlPVwic2V0UHVibGljYXRpb25Tb3J0TW9kZSh0aGlzLnZhbHVlKVwiPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ5ZWFyX2Rlc2NcIiAke19wdWJTb3J0TW9kZSA9PT0gJ3llYXJfZGVzYycgPyAnc2VsZWN0ZWQnIDogJyd9PlllYXIgbmV3ZXN0IGZpcnN0PC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInllYXJfYXNjXCIgJHtfcHViU29ydE1vZGUgPT09ICd5ZWFyX2FzYycgPyAnc2VsZWN0ZWQnIDogJyd9PlllYXIgb2xkZXN0IGZpcnN0PC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInR5cGVfYXNjXCIgJHtfcHViU29ydE1vZGUgPT09ICd0eXBlX2FzYycgPyAnc2VsZWN0ZWQnIDogJyd9PlR5cGUgQVx1MjAxM1o8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwidHlwZV9kZXNjXCIgJHtfcHViU29ydE1vZGUgPT09ICd0eXBlX2Rlc2MnID8gJ3NlbGVjdGVkJyA6ICcnfT5UeXBlIFpcdTIwMTNBPC9vcHRpb24+XG4gICAgICAgIDwvc2VsZWN0PlxuICAgICAgPC9sYWJlbD5cbiAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjZweDtjb2xvcjojNDc1NTY5O2ZvbnQtc2l6ZTowLjllbTtcIj5cbiAgICAgICAgR3JvdXBcbiAgICAgICAgPHNlbGVjdCBpZD1cIm1hc3Rlci1wdWItZ3JvdXAtc2VsZWN0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDphdXRvO21pbi13aWR0aDoxNDBweDtcIiBvbmNoYW5nZT1cInNldFB1YmxpY2F0aW9uR3JvdXBNb2RlKHRoaXMudmFsdWUpXCI+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIm5vbmVcIiAke19wdWJHcm91cE1vZGUgPT09ICdub25lJyA/ICdzZWxlY3RlZCcgOiAnJ30+Tm8gZ3JvdXBpbmc8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwieWVhclwiICR7X3B1Ykdyb3VwTW9kZSA9PT0gJ3llYXInID8gJ3NlbGVjdGVkJyA6ICcnfT5CeSB5ZWFyPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInR5cGVcIiAke19wdWJHcm91cE1vZGUgPT09ICd0eXBlJyA/ICdzZWxlY3RlZCcgOiAnJ30+QnkgdHlwZTwvb3B0aW9uPlxuICAgICAgICA8L3NlbGVjdD5cbiAgICAgIDwvbGFiZWw+XG4gICAgPC9kaXY+YDtcbiAgaWYgKCFwdWJzLmxlbmd0aCkge1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBgJHtjb250cm9sc0h0bWx9PHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO3BhZGRpbmc6MTJweCAwO1wiPk5vIHB1YmxpY2F0aW9ucyBvbiBmaWxlLiBDbGljayBcIisgQWRkIFB1YmxpY2F0aW9uXCIgYWJvdmUsIG9yIHN3aXRjaCB0byBSYXcgQmliVGVYIHRvIHBhc3RlL2ltcG9ydCBlbnRyaWVzLjwvcD5gO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBzb3J0ZWQgPSBbLi4ucHVic10uc29ydChfY29tcGFyZVB1YmxpY2F0aW9ucyk7XG4gIGNvbnN0IGdyb3VwcyA9IFtdO1xuICBmb3IgKGNvbnN0IHB1YiBvZiBzb3J0ZWQpIHtcbiAgICBjb25zdCBsYWJlbCA9IF9ncm91cFB1YmxpY2F0aW9uTGFiZWwocHViKTtcbiAgICBsZXQgZ3JvdXAgPSBncm91cHMuZmluZCgoZW50cnkpID0+IGVudHJ5LmxhYmVsID09PSBsYWJlbCk7XG4gICAgaWYgKCFncm91cCkge1xuICAgICAgZ3JvdXAgPSB7IGxhYmVsLCBpdGVtczogW10gfTtcbiAgICAgIGdyb3Vwcy5wdXNoKGdyb3VwKTtcbiAgICB9XG4gICAgZ3JvdXAuaXRlbXMucHVzaChwdWIpO1xuICB9XG4gIGNvbnN0IHNlY3Rpb25IdG1sID0gZ3JvdXBzLm1hcCgoeyBsYWJlbCwgaXRlbXMgfSkgPT4ge1xuICAgIGNvbnN0IGhlYWRpbmdIdG1sID0gX3B1Ykdyb3VwTW9kZSA9PT0gJ25vbmUnXG4gICAgICA/ICcnXG4gICAgICA6IGA8ZGl2IHN0eWxlPVwibWFyZ2luOjE2cHggMCA4cHg7Zm9udC1zaXplOjAuOWVtO2ZvbnQtd2VpZ2h0OjcwMDtjb2xvcjojMzM0MTU1O1wiPiR7ZXNjYXBlSHRtbChsYWJlbCl9PC9kaXY+YDtcbiAgICBjb25zdCByb3dzID0gaXRlbXMubWFwKHB1YiA9PiB7XG4gICAgY29uc3Qga2V5ICAgICAgPSBlc2NhcGVIdG1sKHB1Yi5rZXkgfHwgJycpO1xuICAgIGNvbnN0IHR5cGUgICAgID0gZXNjYXBlSHRtbChwdWIudHlwZSB8fCAnJyk7XG4gICAgY29uc3QgY2l0YXRpb24gPSBlc2NhcGVIdG1sKChwdWIuZm9ybWF0dGVkX2NpdGF0aW9uIHx8ICcnKS5zbGljZSgwLCAxNjApKTtcbiAgICBjb25zdCBmdWxsICAgICA9IHB1Yi5mb3JtYXR0ZWRfY2l0YXRpb24gfHwgJyc7XG4gICAgY29uc3QgcHViSnNvbiAgPSBlc2NhcGVIdG1sKEpTT04uc3RyaW5naWZ5KHB1YikpO1xuICAgIHJldHVybiBgXG4gICAgICA8dHI+XG4gICAgICAgIDx0ZD5cbiAgICAgICAgICA8Y29kZSBzdHlsZT1cImZvbnQtc2l6ZTowLjhlbTtjb2xvcjojNDc1NTY5O1wiPiR7a2V5fTwvY29kZT5cbiAgICAgICAgICAke2NpdGF0aW9uID8gYDxicj48c21hbGwgc3R5bGU9XCJjb2xvcjojNmI3MjgwO1wiPiR7Y2l0YXRpb259JHtmdWxsLmxlbmd0aCA+IDE2MCA/ICdcdTIwMjYnIDogJyd9PC9zbWFsbD5gIDogJyd9XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO2NvbG9yOiM0NzU1Njk7Zm9udC1zaXplOjAuODVlbTtcIj4ke3R5cGV9PC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwiYWN0aW9uLWJ0bnNcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBvbmNsaWNrPVwiZWRpdE1hc3RlclB1YmxpY2F0aW9uKCR7cHViSnNvbn0pXCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkVkaXQgcHVibGljYXRpb246ICR7a2V5fVwiIHRpdGxlPVwiRWRpdFwiPlx1MjcwRlx1RkUwRjwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIG9uY2xpY2s9XCJkZWxldGVNYXN0ZXJQdWJsaWNhdGlvbignJHtrZXl9JylcIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiRGVsZXRlIHB1YmxpY2F0aW9uOiAke2tleX1cIiB0aXRsZT1cIkRlbGV0ZVwiPlx1RDgzRFx1REREMVx1RkUwRjwvYnV0dG9uPlxuICAgICAgICA8L3RkPlxuICAgICAgPC90cj5gO1xuICAgIH0pLmpvaW4oJycpO1xuICAgIHJldHVybiBgJHtoZWFkaW5nSHRtbH1cbiAgICA8dGFibGUgY2xhc3M9XCJyZXZpZXctdGFibGVcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCI+XG4gICAgICA8dGhlYWQ+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8dGg+UHVibGljYXRpb248L3RoPlxuICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOjExMHB4O3RleHQtYWxpZ246Y2VudGVyO1wiPlR5cGU8L3RoPlxuICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOjgwcHg7XCI+QWN0aW9uczwvdGg+XG4gICAgICAgIDwvdHI+XG4gICAgICA8L3RoZWFkPlxuICAgICAgPHRib2R5PiR7cm93c308L3Rib2R5PlxuICAgIDwvdGFibGU+YDtcbiAgfSkuam9pbignJyk7XG4gIGNvbnRhaW5lci5pbm5lckhUTUwgPSBgJHtjb250cm9sc0h0bWx9JHtzZWN0aW9uSHRtbH1gO1xufVxuXG4vKiogVmFsaWRhdGUgQmliVGVYIGluIHRoZSB0ZXh0YXJlYSB3aXRob3V0IHNhdmluZy4gKi9cbmFzeW5jIGZ1bmN0aW9uIHZhbGlkYXRlUHVibGljYXRpb25zQmliKCkge1xuICBjb25zdCB0YSAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi10ZXh0YXJlYScpO1xuICBjb25zdCBzdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1zdGF0dXMnKTtcbiAgaWYgKCF0YSB8fCAhc3RhdHVzKSByZXR1cm47XG4gIGNvbnN0IHRleHQgPSB0YS52YWx1ZTtcbiAgaWYgKCF0ZXh0LnRyaW0oKSkge1xuICAgIHN0YXR1cy50ZXh0Q29udGVudCA9ICdcdTIxMzlcdUZFMEYgRW1wdHkgXHUyMDE0IG5vdGhpbmcgdG8gdmFsaWRhdGUuJztcbiAgICBzdGF0dXMuc3R5bGUuY29sb3IgPSAnIzZiNzI4MCc7XG4gICAgcmV0dXJuO1xuICB9XG4gIHN0YXR1cy50ZXh0Q29udGVudCA9ICdcdUQ4M0RcdUREMEQgVmFsaWRhdGluZ1x1MjAyNic7XG4gIHN0YXR1cy5zdHlsZS5jb2xvciA9ICcjNmI3MjgwJztcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvcHVibGljYXRpb25zL3ZhbGlkYXRlJywge1xuICAgICAgbWV0aG9kOiAgJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiAgICBKU09OLnN0cmluZ2lmeSh7IGJpYnRleF90ZXh0OiB0ZXh0IH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBjb25zdCBuID0gZGF0YS5jb3VudCA/PyAwO1xuICAgICAgc3RhdHVzLnRleHRDb250ZW50ID0gYFx1MjcwNSBWYWxpZCBcdTIwMTQgJHtufSBlbnRyJHtuICE9PSAxID8gJ2llcycgOiAneSd9IGZvdW5kLmA7XG4gICAgICBzdGF0dXMuc3R5bGUuY29sb3IgPSAnIzE1ODAzZCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXR1cy50ZXh0Q29udGVudCA9ICdcdTI3NEMgJyArIChkYXRhLmVycm9yIHx8ICdWYWxpZGF0aW9uIGZhaWxlZCcpO1xuICAgICAgc3RhdHVzLnN0eWxlLmNvbG9yID0gJyNkYzI2MjYnO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgc3RhdHVzLnRleHRDb250ZW50ID0gJ1x1Mjc0QyAnICsgZXJyLm1lc3NhZ2U7XG4gICAgc3RhdHVzLnN0eWxlLmNvbG9yID0gJyNkYzI2MjYnO1xuICB9XG59XG5cbi8qKiBTYXZlIHJhdyBCaWJUZVggKHZhbGlkYXRlcyBzZXJ2ZXItc2lkZSBiZWZvcmUgd3JpdGluZykuICovXG5hc3luYyBmdW5jdGlvbiBzYXZlUHVibGljYXRpb25zQmliKCkge1xuICBjb25zdCB0YSAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi10ZXh0YXJlYScpO1xuICBjb25zdCBzdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1zdGF0dXMnKTtcbiAgY29uc3QgYnRuICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItc2F2ZS1idG4nKTtcbiAgaWYgKCF0YSkgcmV0dXJuO1xuICBjb25zdCBjb250ZW50ID0gdGEudmFsdWU7XG4gIGlmIChidG4pIHsgYnRuLmRpc2FibGVkID0gdHJ1ZTsgYnRuLnRleHRDb250ZW50ID0gJ1x1MjNGMyBTYXZpbmdcdTIwMjYnOyB9XG4gIGlmIChzdGF0dXMpIHsgc3RhdHVzLnRleHRDb250ZW50ID0gJyc7IHN0YXR1cy5zdHlsZS5jb2xvciA9ICcjNmI3MjgwJzsgfVxuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS9wdWJsaWNhdGlvbnMnLCB7XG4gICAgICBtZXRob2Q6ICAnUFVUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogICAgSlNPTi5zdHJpbmdpZnkoeyBjb250ZW50IH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBjb25zdCBuID0gZGF0YS5jb3VudCA/PyAwO1xuICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICBzdGF0dXMudGV4dENvbnRlbnQgPSBgXHUyNzA1IFNhdmVkIFx1MjAxNCAke259IGVudHIke24gIT09IDEgPyAnaWVzJyA6ICd5J30gcGFyc2VkLmA7XG4gICAgICAgIHN0YXR1cy5zdHlsZS5jb2xvciA9ICcjMTU4MDNkJztcbiAgICAgIH1cbiAgICAgIF91cGRhdGVQdWJDb3VudChuKTtcbiAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ1B1YmxpY2F0aW9ucycsICd1cGRhdGVkJyk7XG4gICAgICAvLyBSZWZyZXNoIENSVUQgbGlzdCB0byBzdGF5IGluIHN5bmNcbiAgICAgIGF3YWl0IGxvYWRQdWJsaWNhdGlvbnMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICBzdGF0dXMudGV4dENvbnRlbnQgPSAnXHUyNzRDICcgKyAoZGF0YS5lcnJvciB8fCAnU2F2ZSBmYWlsZWQnKTtcbiAgICAgICAgc3RhdHVzLnN0eWxlLmNvbG9yID0gJyNkYzI2MjYnO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKHN0YXR1cykge1xuICAgICAgc3RhdHVzLnRleHRDb250ZW50ID0gJ1x1Mjc0QyAnICsgZXJyLm1lc3NhZ2U7XG4gICAgICBzdGF0dXMuc3R5bGUuY29sb3IgPSAnI2RjMjYyNic7XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIGlmIChidG4pIHsgYnRuLmRpc2FibGVkID0gZmFsc2U7IGJ0bi50ZXh0Q29udGVudCA9ICdcdUQ4M0RcdURDQkUgU2F2ZSc7IH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzaG93SW1wb3J0UHVibGljYXRpb25zTW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWltcG9ydC10ZXh0YXJlYScpLnZhbHVlID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWltcG9ydC1vdmVyd3JpdGUnKS5jaGVja2VkID0gZmFsc2U7XG4gIF9zZXRQdWJsaWNhdGlvblN0YXR1cygnbWFzdGVyLXB1Yi1pbXBvcnQtc3RhdHVzJywgJycpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1pbXBvcnQtbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgc2V0SW5pdGlhbEZvY3VzKCdtYXN0ZXItcHViLWltcG9ydC1tb2RhbC1vdmVybGF5Jyk7XG4gIHRyYXBGb2N1cygnbWFzdGVyLXB1Yi1pbXBvcnQtbW9kYWwtb3ZlcmxheScpO1xufVxuXG5mdW5jdGlvbiBjbG9zZUltcG9ydFB1YmxpY2F0aW9uc01vZGFsKCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1pbXBvcnQtbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHJlc3RvcmVGb2N1cygpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBpbXBvcnRQdWJsaWNhdGlvbnNCaWIoKSB7XG4gIGNvbnN0IHRleHRhcmVhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItaW1wb3J0LXRleHRhcmVhJyk7XG4gIGNvbnN0IG92ZXJ3cml0ZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWltcG9ydC1vdmVyd3JpdGUnKTtcbiAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItaW1wb3J0LXN1Ym1pdC1idG4nKTtcbiAgaWYgKCF0ZXh0YXJlYSkgcmV0dXJuO1xuICBjb25zdCBiaWJ0ZXhUZXh0ID0gdGV4dGFyZWEudmFsdWUudHJpbSgpO1xuICBpZiAoIWJpYnRleFRleHQpIHtcbiAgICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItaW1wb3J0LXN0YXR1cycsICdcdTI2QTBcdUZFMEYgUGFzdGUgQmliVGVYIGVudHJpZXMgdG8gaW1wb3J0LicsICcjZGMyNjI2Jyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChidXR0b24pIHtcbiAgICBidXR0b24uZGlzYWJsZWQgPSB0cnVlO1xuICAgIGJ1dHRvbi50ZXh0Q29udGVudCA9ICdcdTIzRjMgSW1wb3J0aW5nXHUyMDI2JztcbiAgfVxuICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItaW1wb3J0LXN0YXR1cycsICdJbXBvcnRpbmcgQmliVGVYXHUyMDI2Jyk7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvcHVibGljYXRpb25zL2ltcG9ydCcsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGJpYnRleF90ZXh0OiBiaWJ0ZXhUZXh0LFxuICAgICAgICBvdmVyd3JpdGU6IEJvb2xlYW4ob3ZlcndyaXRlPy5jaGVja2VkKSxcbiAgICAgIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBjb25zdCBwYXJ0cyA9IFtcbiAgICAgICAgYCR7ZGF0YS5hZGRlZCB8fCAwfSBhZGRlZGAsXG4gICAgICAgIGAke2RhdGEudXBkYXRlZCB8fCAwfSB1cGRhdGVkYCxcbiAgICAgICAgYCR7ZGF0YS5za2lwcGVkIHx8IDB9IHNraXBwZWRgLFxuICAgICAgXTtcbiAgICAgIGlmIChkYXRhLmludmFsaWQpIHBhcnRzLnB1c2goYCR7ZGF0YS5pbnZhbGlkfSByZWplY3RlZCAobWlzc2luZyByZXF1aXJlZCBmaWVsZHMpYCk7XG4gICAgICBjb25zdCBza2lwcGVkRGV0YWlsID0gKGRhdGEuc2tpcHBlZF9rZXlzPy5sZW5ndGgpXG4gICAgICAgID8gYFxcblxcblNraXBwZWQgKGFscmVhZHkgZXhpc3QgXHUyMDE0IGVuYWJsZSBcIk92ZXJ3cml0ZVwiIHRvIHVwZGF0ZSk6XFxuXHUyMDIyICR7ZGF0YS5za2lwcGVkX2tleXMuam9pbignXFxuXHUyMDIyICcpfWBcbiAgICAgICAgOiAnJztcbiAgICAgIGNvbnN0IGludmFsaWREZXRhaWwgPSAoZGF0YS5pbnZhbGlkX2tleXM/Lmxlbmd0aClcbiAgICAgICAgPyBgXFxuXFxuUmVqZWN0ZWQgKG1pc3NpbmcgdGl0bGUsIHllYXIsIG9yIGF1dGhvcik6XFxuXHUyMDIyICR7ZGF0YS5pbnZhbGlkX2tleXMuam9pbignXFxuXHUyMDIyICcpfWBcbiAgICAgICAgOiAnJztcbiAgICAgIF9zZXRQdWJsaWNhdGlvblN0YXR1cygnbWFzdGVyLXB1Yi1pbXBvcnQtc3RhdHVzJywgYFx1MjcwNSBJbXBvcnRlZDogJHtwYXJ0cy5qb2luKCcsICcpfS5gLCAnIzE1ODAzZCcpO1xuICAgICAgX3NldE1hc3RlckNoYW5nZU5vdGljZSgnUHVibGljYXRpb25zJywgJ2ltcG9ydGVkJyk7XG4gICAgICBhd2FpdCBsb2FkUHVibGljYXRpb25zKCk7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzA1IEltcG9ydGVkJywgYEltcG9ydGVkIEJpYlRlWCBlbnRyaWVzOiAke3BhcnRzLmpvaW4oJywgJyl9LiR7c2tpcHBlZERldGFpbH0ke2ludmFsaWREZXRhaWx9YCk7XG4gICAgICBjbG9zZUltcG9ydFB1YmxpY2F0aW9uc01vZGFsKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIF9zZXRQdWJsaWNhdGlvblN0YXR1cygnbWFzdGVyLXB1Yi1pbXBvcnQtc3RhdHVzJywgYFx1Mjc0QyAke2RhdGEuZXJyb3IgfHwgJ0ltcG9ydCBmYWlsZWQnfWAsICcjZGMyNjI2Jyk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItaW1wb3J0LXN0YXR1cycsIGBcdTI3NEMgJHtlcnIubWVzc2FnZX1gLCAnI2RjMjYyNicpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChidXR0b24pIHtcbiAgICAgIGJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgYnV0dG9uLnRleHRDb250ZW50ID0gJ0ltcG9ydCc7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNob3dDb252ZXJ0UHVibGljYXRpb25zTW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNvbnZlcnQtaW5wdXQnKS52YWx1ZSA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1jb252ZXJ0LW91dHB1dCcpLnZhbHVlID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNvbnZlcnQtb3ZlcndyaXRlJykuY2hlY2tlZCA9IGZhbHNlO1xuICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItY29udmVydC1zdGF0dXMnLCAnJyk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNvbnZlcnQtbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgc2V0SW5pdGlhbEZvY3VzKCdtYXN0ZXItcHViLWNvbnZlcnQtbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ21hc3Rlci1wdWItY29udmVydC1tb2RhbC1vdmVybGF5Jyk7XG59XG5cbmZ1bmN0aW9uIGNsb3NlQ29udmVydFB1YmxpY2F0aW9uc01vZGFsKCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1jb252ZXJ0LW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICByZXN0b3JlRm9jdXMoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29udmVydFB1YmxpY2F0aW9uVGV4dCgpIHtcbiAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1jb252ZXJ0LWlucHV0Jyk7XG4gIGNvbnN0IG91dHB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNvbnZlcnQtb3V0cHV0Jyk7XG4gIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNvbnZlcnQtc3VibWl0LWJ0bicpO1xuICBpZiAoIWlucHV0IHx8ICFvdXRwdXQpIHJldHVybjtcbiAgY29uc3QgdGV4dCA9IGlucHV0LnZhbHVlLnRyaW0oKTtcbiAgaWYgKCF0ZXh0KSB7XG4gICAgX3NldFB1YmxpY2F0aW9uU3RhdHVzKCdtYXN0ZXItcHViLWNvbnZlcnQtc3RhdHVzJywgJ1x1MjZBMFx1RkUwRiBQYXN0ZSBjaXRhdGlvbiB0ZXh0IHRvIGNvbnZlcnQuJywgJyNkYzI2MjYnKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGJ1dHRvbikge1xuICAgIGJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7XG4gICAgYnV0dG9uLnRleHRDb250ZW50ID0gJ1x1MjNGMyBHZW5lcmF0aW5nXHUyMDI2JztcbiAgfVxuICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItY29udmVydC1zdGF0dXMnLCAnR2VuZXJhdGluZyBCaWJUZVggcHJldmlld1x1MjAyNicpO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL3B1YmxpY2F0aW9ucy9jb252ZXJ0Jywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgdGV4dCB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgb3V0cHV0LnZhbHVlID0gZGF0YS5iaWJ0ZXggfHwgJyc7XG4gICAgICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItY29udmVydC1zdGF0dXMnLCAnXHUyNzA1IFJldmlldyB0aGUgZ2VuZXJhdGVkIEJpYlRlWCwgdGhlbiBpbXBvcnQgaXQgaWYgaXQgbG9va3MgY29ycmVjdC4nLCAnIzE1ODAzZCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItY29udmVydC1zdGF0dXMnLCBgXHUyNzRDICR7ZGF0YS5lcnJvciB8fCAnQ29udmVyc2lvbiBmYWlsZWQnfWAsICcjZGMyNjI2Jyk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItY29udmVydC1zdGF0dXMnLCBgXHUyNzRDICR7ZXJyLm1lc3NhZ2V9YCwgJyNkYzI2MjYnKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoYnV0dG9uKSB7XG4gICAgICBidXR0b24uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIGJ1dHRvbi50ZXh0Q29udGVudCA9ICdHZW5lcmF0ZSBCaWJUZVgnO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBpbXBvcnRDb252ZXJ0ZWRQdWJsaWNhdGlvblRleHQoKSB7XG4gIGNvbnN0IG91dHB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNvbnZlcnQtb3V0cHV0Jyk7XG4gIGNvbnN0IG92ZXJ3cml0ZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNvbnZlcnQtb3ZlcndyaXRlJyk7XG4gIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNvbnZlcnQtaW1wb3J0LWJ0bicpO1xuICBpZiAoIW91dHB1dCkgcmV0dXJuO1xuICBjb25zdCBiaWJ0ZXhUZXh0ID0gb3V0cHV0LnZhbHVlLnRyaW0oKTtcbiAgaWYgKCFiaWJ0ZXhUZXh0KSB7XG4gICAgX3NldFB1YmxpY2F0aW9uU3RhdHVzKCdtYXN0ZXItcHViLWNvbnZlcnQtc3RhdHVzJywgJ1x1MjZBMFx1RkUwRiBHZW5lcmF0ZSBvciBlZGl0IEJpYlRlWCBiZWZvcmUgaW1wb3J0aW5nLicsICcjZGMyNjI2Jyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChidXR0b24pIHtcbiAgICBidXR0b24uZGlzYWJsZWQgPSB0cnVlO1xuICAgIGJ1dHRvbi50ZXh0Q29udGVudCA9ICdcdTIzRjMgSW1wb3J0aW5nXHUyMDI2JztcbiAgfVxuICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItY29udmVydC1zdGF0dXMnLCAnSW1wb3J0aW5nIHJldmlld2VkIEJpYlRlWFx1MjAyNicpO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL3B1YmxpY2F0aW9ucy9pbXBvcnQnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBiaWJ0ZXhfdGV4dDogYmlidGV4VGV4dCxcbiAgICAgICAgb3ZlcndyaXRlOiBCb29sZWFuKG92ZXJ3cml0ZT8uY2hlY2tlZCksXG4gICAgICB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgY29uc3QgcGFydHMgPSBbXG4gICAgICAgIGAke2RhdGEuYWRkZWQgfHwgMH0gYWRkZWRgLFxuICAgICAgICBgJHtkYXRhLnVwZGF0ZWQgfHwgMH0gdXBkYXRlZGAsXG4gICAgICAgIGAke2RhdGEuc2tpcHBlZCB8fCAwfSBza2lwcGVkYCxcbiAgICAgIF07XG4gICAgICBpZiAoZGF0YS5pbnZhbGlkKSBwYXJ0cy5wdXNoKGAke2RhdGEuaW52YWxpZH0gcmVqZWN0ZWQgKG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzKWApO1xuICAgICAgY29uc3Qgc2tpcHBlZERldGFpbCA9IChkYXRhLnNraXBwZWRfa2V5cz8ubGVuZ3RoKVxuICAgICAgICA/IGBcXG5cXG5Ta2lwcGVkIChhbHJlYWR5IGV4aXN0IFx1MjAxNCBlbmFibGUgXCJPdmVyd3JpdGVcIiB0byB1cGRhdGUpOlxcblx1MjAyMiAke2RhdGEuc2tpcHBlZF9rZXlzLmpvaW4oJ1xcblx1MjAyMiAnKX1gXG4gICAgICAgIDogJyc7XG4gICAgICBjb25zdCBpbnZhbGlkRGV0YWlsID0gKGRhdGEuaW52YWxpZF9rZXlzPy5sZW5ndGgpXG4gICAgICAgID8gYFxcblxcblJlamVjdGVkIChtaXNzaW5nIHRpdGxlLCB5ZWFyLCBvciBhdXRob3IpOlxcblx1MjAyMiAke2RhdGEuaW52YWxpZF9rZXlzLmpvaW4oJ1xcblx1MjAyMiAnKX1gXG4gICAgICAgIDogJyc7XG4gICAgICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItY29udmVydC1zdGF0dXMnLCBgXHUyNzA1IEltcG9ydGVkIHByZXZpZXc6ICR7cGFydHMuam9pbignLCAnKX0uYCwgJyMxNTgwM2QnKTtcbiAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ1B1YmxpY2F0aW9ucycsICdpbXBvcnRlZCcpO1xuICAgICAgYXdhaXQgbG9hZFB1YmxpY2F0aW9ucygpO1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjcwNSBJbXBvcnRlZCcsIGBJbXBvcnRlZCBnZW5lcmF0ZWQgQmliVGVYOiAke3BhcnRzLmpvaW4oJywgJyl9LiR7c2tpcHBlZERldGFpbH0ke2ludmFsaWREZXRhaWx9YCk7XG4gICAgICBjbG9zZUNvbnZlcnRQdWJsaWNhdGlvbnNNb2RhbCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItY29udmVydC1zdGF0dXMnLCBgXHUyNzRDICR7ZGF0YS5lcnJvciB8fCAnSW1wb3J0IGZhaWxlZCd9YCwgJyNkYzI2MjYnKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIF9zZXRQdWJsaWNhdGlvblN0YXR1cygnbWFzdGVyLXB1Yi1jb252ZXJ0LXN0YXR1cycsIGBcdTI3NEMgJHtlcnIubWVzc2FnZX1gLCAnI2RjMjYyNicpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChidXR0b24pIHtcbiAgICAgIGJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgYnV0dG9uLnRleHRDb250ZW50ID0gJ0ltcG9ydCBQcmV2aWV3JztcbiAgICB9XG4gIH1cbn1cblxuLy8gLS0tLSBQdWJsaWNhdGlvbiBhZGQvZWRpdCBtb2RhbCAtLS0tXG5cbmZ1bmN0aW9uIHNob3dBZGRQdWJsaWNhdGlvbk1vZGFsKCkge1xuICBfcHViTW9kYWxVc2VzRWRpdG9yRmllbGQgPSBmYWxzZTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1rZXknKS52YWx1ZSAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLW1vZGFsLXR5cGUnKS52YWx1ZSAgID0gJ2FydGljbGUnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLW1vZGFsLWF1dGhvcicpLnZhbHVlID0gJyc7XG4gIGNvbnN0IGF1dGhvckxhYmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1hdXRob3ItbGFiZWwnKTtcbiAgaWYgKGF1dGhvckxhYmVsKSBhdXRob3JMYWJlbC50ZXh0Q29udGVudCA9ICdBdXRob3IocyknO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLW1vZGFsLXRpdGxlJykudmFsdWUgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWItbW9kYWwteWVhcicpLnZhbHVlICAgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1qb3VybmFsJykudmFsdWUgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1kb2knKS52YWx1ZSAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLW1vZGFsLWV4dHJhJykudmFsdWUgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWItbW9kYWwta2V5JykuZGlzYWJsZWQgPSBmYWxzZTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC10aXRsZS1oZWFkaW5nJykudGV4dENvbnRlbnQgPSAnQWRkIFB1YmxpY2F0aW9uJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgc2V0SW5pdGlhbEZvY3VzKCdtYXN0ZXItcHViLW1vZGFsLW92ZXJsYXknKTtcbiAgdHJhcEZvY3VzKCdtYXN0ZXItcHViLW1vZGFsLW92ZXJsYXknKTtcbn1cblxuZnVuY3Rpb24gZWRpdE1hc3RlclB1YmxpY2F0aW9uKHB1Yikge1xuICBjb25zdCBmaWVsZHMgPSBwdWIuZmllbGRzIHx8IHt9O1xuICAvLyBUcmFjayB3aGV0aGVyIHRoaXMgZW50cnkgdXNlcyBgZWRpdG9yYCBzbyB3ZSBwcmVzZXJ2ZSBpdCBvbiBzYXZlXG4gIF9wdWJNb2RhbFVzZXNFZGl0b3JGaWVsZCA9ICFmaWVsZHMuYXV0aG9yICYmICEhZmllbGRzLmVkaXRvcjtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1rZXknKS52YWx1ZSAgICAgPSBwdWIua2V5IHx8ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLW1vZGFsLXR5cGUnKS52YWx1ZSAgICA9IHB1Yi50eXBlIHx8ICdhcnRpY2xlJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1hdXRob3InKS52YWx1ZSAgPSBmaWVsZHMuYXV0aG9yIHx8IGZpZWxkcy5lZGl0b3IgfHwgJyc7XG4gIC8vIFVwZGF0ZSB0aGUgQXV0aG9yL0VkaXRvciBsYWJlbCBzbyB0aGUgdXNlciBrbm93cyB3aGljaCBmaWVsZCBpcyBiZWluZyBlZGl0ZWRcbiAgY29uc3QgYXV0aG9yTGFiZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLW1vZGFsLWF1dGhvci1sYWJlbCcpO1xuICBpZiAoYXV0aG9yTGFiZWwpIGF1dGhvckxhYmVsLnRleHRDb250ZW50ID0gX3B1Yk1vZGFsVXNlc0VkaXRvckZpZWxkID8gJ0VkaXRvcihzKScgOiAnQXV0aG9yKHMpJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC10aXRsZScpLnZhbHVlICAgPSBmaWVsZHMudGl0bGUgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWItbW9kYWwteWVhcicpLnZhbHVlICAgID0gZmllbGRzLnllYXIgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWItbW9kYWwtam91cm5hbCcpLnZhbHVlID0gZmllbGRzLmpvdXJuYWwgfHwgZmllbGRzLmJvb2t0aXRsZSB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1kb2knKS52YWx1ZSAgICAgPSBmaWVsZHMuZG9pIHx8ICcnO1xuICAvLyBFeHRyYTogcmVtYWluaW5nIG5vbi1zdGFuZGFyZCBmaWVsZHMgYXMga2V5PXZhbHVlIGxpbmVzXG4gIGNvbnN0IGtub3duID0gbmV3IFNldChbJ2F1dGhvcicsJ2VkaXRvcicsJ3RpdGxlJywneWVhcicsJ2pvdXJuYWwnLCdib29rdGl0bGUnLCdkb2knXSk7XG4gIGNvbnN0IGV4dHJhID0gT2JqZWN0LmVudHJpZXMoZmllbGRzKVxuICAgIC5maWx0ZXIoKFtrXSkgPT4gIWtub3duLmhhcyhrKSlcbiAgICAubWFwKChbaywgdl0pID0+IGAke2t9PSR7dn1gKVxuICAgIC5qb2luKCdcXG4nKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1leHRyYScpLnZhbHVlICAgPSBleHRyYTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1rZXknKS5kaXNhYmxlZCAgPSB0cnVlOyAgLy8ga2V5IGlzIGltbXV0YWJsZSBvbiBlZGl0XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWItbW9kYWwtdGl0bGUtaGVhZGluZycpLnRleHRDb250ZW50ID0gJ0VkaXQgUHVibGljYXRpb24nO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBzZXRJbml0aWFsRm9jdXMoJ21hc3Rlci1wdWItbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ21hc3Rlci1wdWItbW9kYWwtb3ZlcmxheScpO1xufVxuXG5mdW5jdGlvbiBjbG9zZVB1YmxpY2F0aW9uTW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICByZXN0b3JlRm9jdXMoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZU1hc3RlclB1YmxpY2F0aW9uKCkge1xuICBjb25zdCBrZXlFbCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLW1vZGFsLWtleScpO1xuICBjb25zdCBrZXkgICAgPSBrZXlFbC52YWx1ZS50cmltKCk7XG4gIGNvbnN0IGFjdGlvbiA9IGtleUVsLmRpc2FibGVkID8gJ3VwZGF0ZScgOiAnYWRkJztcbiAgaWYgKCFrZXkpIHsgc2hvd0FsZXJ0TW9kYWwoJ1x1MjZBMFx1RkUwRiBWYWxpZGF0aW9uJywgJ0NpdGUga2V5IGlzIHJlcXVpcmVkLicpOyByZXR1cm47IH1cbiAgY29uc3QgdHlwZSAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC10eXBlJykudmFsdWUudHJpbSgpIHx8ICdhcnRpY2xlJztcbiAgY29uc3QgYXV0aG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1hdXRob3InKS52YWx1ZS50cmltKCk7XG4gIGNvbnN0IHRpdGxlICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWItbW9kYWwtdGl0bGUnKS52YWx1ZS50cmltKCk7XG4gIGNvbnN0IHllYXIgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWItbW9kYWwteWVhcicpLnZhbHVlLnRyaW0oKTtcbiAgaWYgKCF0aXRsZSkgIHsgc2hvd0FsZXJ0TW9kYWwoJ1x1MjZBMFx1RkUwRiBWYWxpZGF0aW9uJywgJ1RpdGxlIGlzIHJlcXVpcmVkLicpOyByZXR1cm47IH1cbiAgaWYgKCF5ZWFyKSAgIHsgc2hvd0FsZXJ0TW9kYWwoJ1x1MjZBMFx1RkUwRiBWYWxpZGF0aW9uJywgJ1llYXIgaXMgcmVxdWlyZWQuJyk7IHJldHVybjsgfVxuICBpZiAoIWF1dGhvcikgeyBzaG93QWxlcnRNb2RhbCgnXHUyNkEwXHVGRTBGIFZhbGlkYXRpb24nLCAnQXV0aG9yIG9yIGVkaXRvciBpcyByZXF1aXJlZC4nKTsgcmV0dXJuOyB9XG4gIC8vIFByZXNlcnZlIHRoZSBvcmlnaW5hbCBmaWVsZCBuYW1lOiBlZGl0b3IgZW50cmllcyBtdXN0IG5vdCBiZSBzYXZlZCBhcyBhdXRob3JcbiAgY29uc3QgZmllbGRzID0gX3B1Yk1vZGFsVXNlc0VkaXRvckZpZWxkID8geyBlZGl0b3I6IGF1dGhvciwgdGl0bGUsIHllYXIgfSA6IHsgYXV0aG9yLCB0aXRsZSwgeWVhciB9O1xuICBjb25zdCBqb3VybmFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1qb3VybmFsJykudmFsdWUudHJpbSgpO1xuICBpZiAoam91cm5hbCkge1xuICAgIGZpZWxkc1t0eXBlID09PSAnaW5wcm9jZWVkaW5ncycgPyAnYm9va3RpdGxlJyA6ICdqb3VybmFsJ10gPSBqb3VybmFsO1xuICB9XG4gIGNvbnN0IGRvaSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWItbW9kYWwtZG9pJykudmFsdWUudHJpbSgpO1xuICBpZiAoZG9pKSBmaWVsZHMuZG9pID0gZG9pO1xuICAvLyBQYXJzZSBleHRyYSBmaWVsZHMgKGtleT12YWx1ZSBwZXIgbGluZSlcbiAgY29uc3QgZXh0cmEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLW1vZGFsLWV4dHJhJykudmFsdWU7XG4gIGZvciAoY29uc3QgbGluZSBvZiBleHRyYS5zcGxpdCgnXFxuJykpIHtcbiAgICBjb25zdCBlcSA9IGxpbmUuaW5kZXhPZignPScpO1xuICAgIGlmIChlcSA+IDApIHtcbiAgICAgIGNvbnN0IGsgPSBsaW5lLnNsaWNlKDAsIGVxKS50cmltKCk7XG4gICAgICBjb25zdCB2ID0gbGluZS5zbGljZShlcSArIDEpLnRyaW0oKTtcbiAgICAgIGlmIChrICYmIHYpIGZpZWxkc1trXSA9IHY7XG4gICAgfVxuICB9XG4gIGNvbnN0IGJvZHkgPSB7IGFjdGlvbiwga2V5LCB0eXBlLCBmaWVsZHMgfTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvcHVibGljYXRpb24nLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBjbG9zZVB1YmxpY2F0aW9uTW9kYWwoKTtcbiAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ1B1YmxpY2F0aW9ucycsIGRhdGEuYWN0aW9uIHx8ICd1cGRhdGVkJyk7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzA1IFNhdmVkJywgYFB1YmxpY2F0aW9uIFwiJHtrZXl9XCIgJHtkYXRhLmFjdGlvbn0uYCk7XG4gICAgICBhd2FpdCBsb2FkUHVibGljYXRpb25zKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCBkYXRhLmVycm9yIHx8ICdTYXZlIGZhaWxlZCcpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIHNhdmUgcHVibGljYXRpb24nKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVNYXN0ZXJQdWJsaWNhdGlvbihrZXkpIHtcbiAgc2hvd0NvbmZpcm1Nb2RhbChcbiAgICAnXHVEODNEXHVEREQxXHVGRTBGIERlbGV0ZSBQdWJsaWNhdGlvbicsXG4gICAgYERlbGV0ZSBcIiR7a2V5fVwiPyBUaGlzIGNhbm5vdCBiZSB1bmRvbmUuYCxcbiAgICBhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvcHVibGljYXRpb24nLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgYWN0aW9uOiAnZGVsZXRlJywga2V5IH0pLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICAgICAgX3NldE1hc3RlckNoYW5nZU5vdGljZSgnUHVibGljYXRpb25zJywgJ2RlbGV0ZWQnKTtcbiAgICAgICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzA1IERlbGV0ZWQnLCBgUHVibGljYXRpb24gXCIke2tleX1cIiByZW1vdmVkLmApO1xuICAgICAgICAgIGF3YWl0IGxvYWRQdWJsaWNhdGlvbnMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgZGF0YS5lcnJvciB8fCAnRGVsZXRlIGZhaWxlZCcpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIGRlbGV0ZSBwdWJsaWNhdGlvbicpO1xuICAgICAgfVxuICAgIH1cbiAgKTtcbn1cblxuZnVuY3Rpb24gX3JlbmRlckF3YXJkc0xpc3QoYXdhcmRzKSB7XG4gIGlmICghYXdhcmRzLmxlbmd0aCkge1xuICAgIHJldHVybiAnPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO3BhZGRpbmc6MTJweCAwO1wiPk5vIGF3YXJkcyBvbiBmaWxlLiBDbGljayBcIisgQWRkIEF3YXJkXCIgYWJvdmUuPC9wPic7XG4gIH1cbiAgY29uc3Qgcm93cyA9IGF3YXJkcy5tYXAoKGF3YXJkLCBpZHgpID0+IHtcbiAgICBjb25zdCB0aXRsZSA9IGVzY2FwZUh0bWwoYXdhcmQudGl0bGUgfHwgJycpO1xuICAgIGNvbnN0IHllYXIgID0gYXdhcmQueWVhciA/IFN0cmluZyhhd2FyZC55ZWFyKSA6ICdcdTIwMTQnO1xuICAgIGNvbnN0IGRlc2MgID0gZXNjYXBlSHRtbCgoYXdhcmQuZGVzY3JpcHRpb24gfHwgJycpLnNsaWNlKDAsIDEwMCkpO1xuICAgIGNvbnN0IGF3YXJkSnNvbiA9IGVzY2FwZUh0bWwoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgdGl0bGU6IGF3YXJkLnRpdGxlIHx8ICcnLCB5ZWFyOiBhd2FyZC55ZWFyIHx8ICcnLFxuICAgICAgZGVzY3JpcHRpb246IGF3YXJkLmRlc2NyaXB0aW9uIHx8ICcnLFxuICAgICAgcmVsZXZhbnRfZm9yOiAoYXdhcmQucmVsZXZhbnRfZm9yIHx8IFtdKS5qb2luKCcsICcpLFxuICAgIH0pKTtcbiAgICByZXR1cm4gYFxuICAgICAgPHRyPlxuICAgICAgICA8dGQ+XG4gICAgICAgICAgPHN0cm9uZz4ke3RpdGxlfTwvc3Ryb25nPlxuICAgICAgICAgICR7ZGVzYyA/IGA8YnI+PHNtYWxsIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtcIj4ke2Rlc2N9JHsoYXdhcmQuZGVzY3JpcHRpb258fCcnKS5sZW5ndGggPiAxMDAgPyAnXHUyMDI2JyA6ICcnfTwvc21hbGw+YCA6ICcnfVxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjtjb2xvcjojNDc1NTY5O1wiPiR7eWVhcn08L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJhY3Rpb24tYnRuc1wiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIG9uY2xpY2s9XCJlZGl0TWFzdGVyQXdhcmQoJHthd2FyZEpzb259LCAke2lkeH0pXCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkVkaXQgYXdhcmQ6ICR7dGl0bGV9XCIgdGl0bGU9XCJFZGl0XCI+XHUyNzBGXHVGRTBGPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgb25jbGljaz1cImRlbGV0ZU1hc3RlckF3YXJkKCR7aWR4fSwgJyR7dGl0bGV9JylcIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiRGVsZXRlIGF3YXJkOiAke3RpdGxlfVwiIHRpdGxlPVwiRGVsZXRlXCI+XHVEODNEXHVEREQxXHVGRTBGPC9idXR0b24+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L3RyPmA7XG4gIH0pLmpvaW4oJycpO1xuICByZXR1cm4gYFxuICAgIDx0YWJsZSBjbGFzcz1cInJldmlldy10YWJsZVwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIj5cbiAgICAgIDx0aGVhZD5cbiAgICAgICAgPHRyPlxuICAgICAgICAgIDx0aD5Bd2FyZDwvdGg+XG4gICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6NzBweDt0ZXh0LWFsaWduOmNlbnRlcjtcIj5ZZWFyPC90aD5cbiAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDo4MHB4O1wiPkFjdGlvbnM8L3RoPlxuICAgICAgICA8L3RyPlxuICAgICAgPC90aGVhZD5cbiAgICAgIDx0Ym9keT4ke3Jvd3N9PC90Ym9keT5cbiAgICA8L3RhYmxlPmA7XG59XG5cblxuZnVuY3Rpb24gX3JlbmRlckNlcnRpZmljYXRpb25zTGlzdChjZXJ0cykge1xuICBpZiAoIWNlcnRzLmxlbmd0aCkge1xuICAgIHJldHVybiAnPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO3BhZGRpbmc6MTJweCAwO1wiPk5vIGNlcnRpZmljYXRpb25zIG9uIGZpbGUuIENsaWNrIFwiKyBBZGQgQ2VydGlmaWNhdGlvblwiIGFib3ZlLjwvcD4nO1xuICB9XG4gIGNvbnN0IHJvd3MgPSBjZXJ0cy5tYXAoKGNlcnQsIGlkeCkgPT4ge1xuICAgIGNvbnN0IG5hbWUgICA9IGVzY2FwZUh0bWwoY2VydC5uYW1lIHx8ICcnKTtcbiAgICBjb25zdCBpc3N1ZXIgPSBlc2NhcGVIdG1sKGNlcnQuaXNzdWVyIHx8ICdcdTIwMTQnKTtcbiAgICBjb25zdCB5ZWFyICAgPSBjZXJ0LnllYXIgPyBTdHJpbmcoY2VydC55ZWFyKSA6ICdcdTIwMTQnO1xuICAgIGNvbnN0IGNlcnRKc29uID0gZXNjYXBlSHRtbChKU09OLnN0cmluZ2lmeSh7XG4gICAgICBuYW1lOiBjZXJ0Lm5hbWUgfHwgJycsIGlzc3VlcjogY2VydC5pc3N1ZXIgfHwgJycsIHllYXI6IGNlcnQueWVhciB8fCAnJyxcbiAgICB9KSk7XG4gICAgcmV0dXJuIGBcbiAgICAgIDx0cj5cbiAgICAgICAgPHRkPjxzdHJvbmc+JHtuYW1lfTwvc3Ryb25nPjwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cImNvbG9yOiM0NzU1Njk7XCI+JHtpc3N1ZXJ9PC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7Y29sb3I6IzQ3NTU2OTtcIj4ke3llYXJ9PC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwiYWN0aW9uLWJ0bnNcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBvbmNsaWNrPVwiZWRpdE1hc3RlckNlcnRpZmljYXRpb24oJHtjZXJ0SnNvbn0sICR7aWR4fSlcIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiRWRpdCBjZXJ0aWZpY2F0aW9uOiAke25hbWV9XCIgdGl0bGU9XCJFZGl0XCI+XHUyNzBGXHVGRTBGPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgb25jbGljaz1cImRlbGV0ZU1hc3RlckNlcnRpZmljYXRpb24oJHtpZHh9LCAnJHtuYW1lfScpXCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkRlbGV0ZSBjZXJ0aWZpY2F0aW9uOiAke25hbWV9XCIgdGl0bGU9XCJEZWxldGVcIj5cdUQ4M0RcdURERDFcdUZFMEY8L2J1dHRvbj5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvdHI+YDtcbiAgfSkuam9pbignJyk7XG4gIHJldHVybiBgXG4gICAgPHRhYmxlIGNsYXNzPVwicmV2aWV3LXRhYmxlXCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiPlxuICAgICAgPHRoZWFkPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRoPk5hbWU8L3RoPlxuICAgICAgICAgIDx0aD5Jc3N1ZXI8L3RoPlxuICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOjcwcHg7dGV4dC1hbGlnbjpjZW50ZXI7XCI+WWVhcjwvdGg+XG4gICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6ODBweDtcIj5BY3Rpb25zPC90aD5cbiAgICAgICAgPC90cj5cbiAgICAgIDwvdGhlYWQ+XG4gICAgICA8dGJvZHk+JHtyb3dzfTwvdGJvZHk+XG4gICAgPC90YWJsZT5gO1xufVxuXG5cbmZ1bmN0aW9uIF9yZW5kZXJNYXN0ZXJBY2hpZXZlbWVudHNUYWJsZShhY2hpZXZlbWVudHMpIHtcbiAgaWYgKCFhY2hpZXZlbWVudHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuICc8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7cGFkZGluZzoxMnB4IDA7XCI+Tm8gc2VsZWN0ZWQgYWNoaWV2ZW1lbnRzIHlldC4gVXNlIHRoZSBIYXJ2ZXN0IGZlYXR1cmUgdG8gYWRkIGFjaGlldmVtZW50cyBmcm9tIGEgY29tcGxldGVkIHNlc3Npb24sIG9yIGNsaWNrIFwiKyBBZGQgQWNoaWV2ZW1lbnRcIiBhYm92ZS48L3A+JztcbiAgfVxuICBsZXQgcm93cyA9IGFjaGlldmVtZW50cy5tYXAoYWNoID0+IHtcbiAgICBjb25zdCBpZCAgICAgID0gZXNjYXBlSHRtbChhY2guaWQgfHwgJycpO1xuICAgIGNvbnN0IHRpdGxlICAgPSBlc2NhcGVIdG1sKGFjaC50aXRsZSB8fCAnJyk7XG4gICAgY29uc3QgZGVzYyAgICA9IGVzY2FwZUh0bWwoKGFjaC5kZXNjcmlwdGlvbiB8fCAnJykuc2xpY2UoMCwgMTAwKSk7XG4gICAgY29uc3QgaW1wICAgICA9IGFjaC5pbXBvcnRhbmNlID8/ICdcdTIwMTQnO1xuICAgIGNvbnN0IHJlbEZvciAgPSBlc2NhcGVIdG1sKChhY2gucmVsZXZhbnRfZm9yIHx8IFtdKS5qb2luKCcsICcpKTtcbiAgICByZXR1cm4gYFxuICAgICAgPHRyPlxuICAgICAgICA8dGQ+PHN0cm9uZz4ke3RpdGxlfTwvc3Ryb25nPiR7ZGVzYyA/IGA8YnI+PHNtYWxsIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtcIj4ke2Rlc2N9JHsoYWNoLmRlc2NyaXB0aW9ufHwnJykubGVuZ3RoID4gMTAwID8gJ1x1MjAyNicgOiAnJ308L3NtYWxsPmAgOiAnJ308L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjtcIj4ke2ltcH08L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2NvbG9yOiM0NzU1Njk7XCI+JHtyZWxGb3IgfHwgJ1x1MjAxNCd9PC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwiYWN0aW9uLWJ0bnNcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBvbmNsaWNrPVwiZWRpdE1hc3RlckFjaGlldmVtZW50KCR7ZXNjYXBlSHRtbChKU09OLnN0cmluZ2lmeSh7aWQ6IGFjaC5pZHx8JycsIHRpdGxlOiBhY2gudGl0bGV8fCcnLCBkZXNjcmlwdGlvbjogYWNoLmRlc2NyaXB0aW9ufHwnJywgcmVsZXZhbnRfZm9yOiBhY2gucmVsZXZhbnRfZm9yfHxbXSwgaW1wb3J0YW5jZTogYWNoLmltcG9ydGFuY2V8fDd9KSl9KVwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJFZGl0IGFjaGlldmVtZW50OiAke3RpdGxlfVwiIHRpdGxlPVwiRWRpdFwiPlx1MjcwRlx1RkUwRjwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIG9uY2xpY2s9XCJkZWxldGVNYXN0ZXJBY2hpZXZlbWVudCgnJHtpZH0nLCAnJHt0aXRsZX0nKVwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJEZWxldGUgYWNoaWV2ZW1lbnQ6ICR7dGl0bGV9XCIgdGl0bGU9XCJEZWxldGVcIj5cdUQ4M0RcdURERDFcdUZFMEY8L2J1dHRvbj5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvdHI+YDtcbiAgfSkuam9pbignJyk7XG4gIHJldHVybiBgXG4gICAgPHRhYmxlIGNsYXNzPVwicmV2aWV3LXRhYmxlXCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiPlxuICAgICAgPHRoZWFkPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRoPkFjaGlldmVtZW50PC90aD5cbiAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDo2MHB4O3RleHQtYWxpZ246Y2VudGVyO1wiPkltcG9ydGFuY2U8L3RoPlxuICAgICAgICAgIDx0aD5SZWxldmFudCBmb3I8L3RoPlxuICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOjgwcHg7XCI+QWN0aW9uczwvdGg+XG4gICAgICAgIDwvdHI+XG4gICAgICA8L3RoZWFkPlxuICAgICAgPHRib2R5PiR7cm93c308L3Rib2R5PlxuICAgIDwvdGFibGU+YDtcbn1cblxuZnVuY3Rpb24gX3JlbmRlclN1bW1hcmllc0xpc3Qoc3VtbWFyaWVzKSB7XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhzdW1tYXJpZXMpO1xuICBpZiAoIWtleXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuICc8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7cGFkZGluZzoxMnB4IDA7XCI+Tm8gcHJvZmVzc2lvbmFsIHN1bW1hcnkgdmFyaWFudHMgeWV0LiBDbGljayBcIisgQWRkIFN1bW1hcnlcIiBhYm92ZSB0byBjcmVhdGUgeW91ciBmaXJzdCBvbmUuPC9wPic7XG4gIH1cbiAgcmV0dXJuIGtleXMubWFwKGtleSA9PiB7XG4gICAgY29uc3QgdGV4dCAgICA9IHR5cGVvZiBzdW1tYXJpZXNba2V5XSA9PT0gJ3N0cmluZycgPyBzdW1tYXJpZXNba2V5XSA6IEpTT04uc3RyaW5naWZ5KHN1bW1hcmllc1trZXldKTtcbiAgICBjb25zdCBwcmV2aWV3ID0gZXNjYXBlSHRtbCh0ZXh0LnNsaWNlKDAsIDIwMCkpO1xuICAgIGNvbnN0IGtleUVzYyAgPSBlc2NhcGVIdG1sKGtleSk7XG4gICAgcmV0dXJuIGBcbiAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc3VtbWFyeS1jYXJkXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc3VtbWFyeS1oZWFkZXJcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hc3Rlci1zdW1tYXJ5LWtleVwiPiR7a2V5RXNjfTwvc3Bhbj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWJ0bnNcIiBzdHlsZT1cImdhcDo0cHg7XCI+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBvbmNsaWNrPVwiZWRpdE1hc3RlclN1bW1hcnkoJHtlc2NhcGVIdG1sKEpTT04uc3RyaW5naWZ5KHtrZXksIHRleHR9KSl9KVwiXG4gICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkVkaXQgc3VtbWFyeTogJHtrZXlFc2N9XCIgdGl0bGU9XCJFZGl0XCI+XHUyNzBGXHVGRTBGPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBvbmNsaWNrPVwiZGVsZXRlTWFzdGVyU3VtbWFyeSgnJHtrZXlFc2N9JylcIlxuICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJEZWxldGUgc3VtbWFyeTogJHtrZXlFc2N9XCIgdGl0bGU9XCJEZWxldGVcIj5cdUQ4M0RcdURERDFcdUZFMEY8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc3VtbWFyeS1wcmV2aWV3XCI+JHtwcmV2aWV3fSR7dGV4dC5sZW5ndGggPiAyMDAgPyAnXHUyMDI2JyA6ICcnfTwvZGl2PlxuICAgICAgPC9kaXY+YDtcbiAgfSkuam9pbignJyk7XG59XG5cbmZ1bmN0aW9uIHNob3dBZGRBY2hpZXZlbWVudE1vZGFsKCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLW1vZGFsLWlkJykudmFsdWUgICAgICAgICAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLW1vZGFsLXRpdGxlLWlucHV0JykudmFsdWUgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLW1vZGFsLWRlc2MtaW5wdXQnKS52YWx1ZSAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLW1vZGFsLXJlbGV2YW50LWlucHV0JykudmFsdWUgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaC1tb2RhbC1pbXBvcnRhbmNlLWlucHV0JykudmFsdWUgPSAnNyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItYWNoLW1vZGFsLXRpdGxlJykudGV4dENvbnRlbnQgPSAnQWRkIEFjaGlldmVtZW50JztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1hY2gtbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgc2V0SW5pdGlhbEZvY3VzKCdtYXN0ZXItYWNoLW1vZGFsLW92ZXJsYXknKTtcbiAgdHJhcEZvY3VzKCdtYXN0ZXItYWNoLW1vZGFsLW92ZXJsYXknKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaC1tb2RhbC10aXRsZS1pbnB1dCcpLmZvY3VzKCk7XG59XG5cbmZ1bmN0aW9uIGVkaXRNYXN0ZXJBY2hpZXZlbWVudChhY2gpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaC1tb2RhbC1pZCcpLnZhbHVlICAgICAgICAgICAgICA9IGFjaC5pZCB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaC1tb2RhbC10aXRsZS1pbnB1dCcpLnZhbHVlICAgICA9IGFjaC50aXRsZSB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaC1tb2RhbC1kZXNjLWlucHV0JykudmFsdWUgICAgICA9IGFjaC5kZXNjcmlwdGlvbiB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaC1tb2RhbC1yZWxldmFudC1pbnB1dCcpLnZhbHVlICA9IChhY2gucmVsZXZhbnRfZm9yIHx8IFtdKS5qb2luKCcsICcpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLW1vZGFsLWltcG9ydGFuY2UtaW5wdXQnKS52YWx1ZSA9IGFjaC5pbXBvcnRhbmNlIHx8IDc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItYWNoLW1vZGFsLXRpdGxlJykudGV4dENvbnRlbnQgPSAnRWRpdCBBY2hpZXZlbWVudCc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItYWNoLW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICBfZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIHNldEluaXRpYWxGb2N1cygnbWFzdGVyLWFjaC1tb2RhbC1vdmVybGF5Jyk7XG4gIHRyYXBGb2N1cygnbWFzdGVyLWFjaC1tb2RhbC1vdmVybGF5Jyk7XG59XG5cbmZ1bmN0aW9uIGNsb3NlTWFzdGVyQWNoTW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItYWNoLW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICByZXN0b3JlRm9jdXMoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZU1hc3RlckFjaGlldmVtZW50KCkge1xuICBjb25zdCBpZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhY2gtbW9kYWwtaWQnKS52YWx1ZS50cmltKCkgfHxcbiAgICAgICAgICAgICAnc2FfJyArIERhdGUubm93KCk7XG4gIGNvbnN0IHRpdGxlICAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaC1tb2RhbC10aXRsZS1pbnB1dCcpLnZhbHVlLnRyaW0oKTtcbiAgY29uc3QgZGVzY3JpcHRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLW1vZGFsLWRlc2MtaW5wdXQnKS52YWx1ZS50cmltKCk7XG4gIGNvbnN0IHJlbGV2YW50UmF3ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaC1tb2RhbC1yZWxldmFudC1pbnB1dCcpLnZhbHVlO1xuICBjb25zdCBpbXBvcnRhbmNlICA9IHBhcnNlSW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhY2gtbW9kYWwtaW1wb3J0YW5jZS1pbnB1dCcpLnZhbHVlLCAxMCkgfHwgNztcblxuICBpZiAoIXRpdGxlKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjZBMFx1RkUwRiBWYWxpZGF0aW9uJywgJ1RpdGxlIGlzIHJlcXVpcmVkLicpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCByZWxldmFudF9mb3IgPSByZWxldmFudFJhdy5zcGxpdCgnLCcpLm1hcChzID0+IHMudHJpbSgpKS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS91cGRhdGUtYWNoaWV2ZW1lbnQnLCB7XG4gICAgICBtZXRob2Q6ICAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6ICAgIEpTT04uc3RyaW5naWZ5KHsgaWQsIHRpdGxlLCBkZXNjcmlwdGlvbiwgcmVsZXZhbnRfZm9yLCBpbXBvcnRhbmNlIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBjbG9zZU1hc3RlckFjaE1vZGFsKCk7XG4gICAgICBfc2V0TWFzdGVyQ2hhbmdlTm90aWNlKCdTZWxlY3RlZCBBY2hpZXZlbWVudHMnLCBkYXRhLmFjdGlvbiB8fCAndXBkYXRlZCcpO1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjcwNSBTYXZlZCcsIGBBY2hpZXZlbWVudCBcIiR7dGl0bGV9XCIgJHtkYXRhLmFjdGlvbn0uYCk7XG4gICAgICBhd2FpdCBwb3B1bGF0ZU1hc3RlclRhYigpOyAgLy8gcmVmcmVzaFxuICAgIH0gZWxzZSB7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgZGF0YS5lcnJvciB8fCAnU2F2ZSBmYWlsZWQnKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgJ0ZhaWxlZCB0byBzYXZlIGFjaGlldmVtZW50Jyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvd0FkZFN1bW1hcnlNb2RhbCgpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1bS1tb2RhbC1rZXktaW5wdXQnKS52YWx1ZSAgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1bS1tb2RhbC10ZXh0LWlucHV0JykudmFsdWUgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1zdW0tbW9kYWwtdGl0bGUnKS50ZXh0Q29udGVudCA9ICdBZGQgUHJvZmVzc2lvbmFsIFN1bW1hcnknO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXN1bS1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBzZXRJbml0aWFsRm9jdXMoJ21hc3Rlci1zdW0tbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ21hc3Rlci1zdW0tbW9kYWwtb3ZlcmxheScpO1xufVxuXG5mdW5jdGlvbiBlZGl0TWFzdGVyU3VtbWFyeShvYmopIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1bS1tb2RhbC1rZXktaW5wdXQnKS52YWx1ZSAgPSBvYmoua2V5ICB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1bS1tb2RhbC10ZXh0LWlucHV0JykudmFsdWUgPSBvYmoudGV4dCB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1zdW0tbW9kYWwtdGl0bGUnKS50ZXh0Q29udGVudCA9ICdFZGl0IFByb2Zlc3Npb25hbCBTdW1tYXJ5JztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1zdW0tbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgc2V0SW5pdGlhbEZvY3VzKCdtYXN0ZXItc3VtLW1vZGFsLW92ZXJsYXknKTtcbiAgdHJhcEZvY3VzKCdtYXN0ZXItc3VtLW1vZGFsLW92ZXJsYXknKTtcbn1cblxuZnVuY3Rpb24gY2xvc2VNYXN0ZXJTdW1Nb2RhbCgpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1zdW0tbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHJlc3RvcmVGb2N1cygpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzYXZlTWFzdGVyU3VtbWFyeSgpIHtcbiAgY29uc3Qga2V5ICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdW0tbW9kYWwta2V5LWlucHV0JykudmFsdWUudHJpbSgpO1xuICBjb25zdCB0ZXh0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1bS1tb2RhbC10ZXh0LWlucHV0JykudmFsdWUudHJpbSgpO1xuICBpZiAoIWtleSB8fCAhdGV4dCkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI2QTBcdUZFMEYgVmFsaWRhdGlvbicsICdCb3RoIEtleSBhbmQgU3VtbWFyeSB0ZXh0IGFyZSByZXF1aXJlZC4nKTtcbiAgICByZXR1cm47XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS91cGRhdGUtc3VtbWFyeScsIHtcbiAgICAgIG1ldGhvZDogICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogICAgSlNPTi5zdHJpbmdpZnkoeyBrZXksIHRleHQgfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEub2spIHtcbiAgICAgIGNsb3NlTWFzdGVyU3VtTW9kYWwoKTtcbiAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ1Byb2Zlc3Npb25hbCBTdW1tYXJpZXMnLCBkYXRhLmFjdGlvbiB8fCAndXBkYXRlZCcpO1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjcwNSBTYXZlZCcsIGBTdW1tYXJ5IFwiJHtrZXl9XCIgJHtkYXRhLmFjdGlvbn0uYCk7XG4gICAgICBhd2FpdCBwb3B1bGF0ZU1hc3RlclRhYigpOyAgLy8gcmVmcmVzaFxuICAgIH0gZWxzZSB7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgZGF0YS5lcnJvciB8fCAnU2F2ZSBmYWlsZWQnKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgJ0ZhaWxlZCB0byBzYXZlIHN1bW1hcnknKTtcbiAgfVxufVxuXG4vLyAtLS0tIFBlcnNvbmFsIEluZm8gbW9kYWwgaGFuZGxlcnMgLS0tLVxuXG5mdW5jdGlvbiBzaG93RWRpdFBlcnNvbmFsSW5mb01vZGFsKCkge1xuICBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS9mdWxsJylcbiAgICAudGhlbihyID0+IHIuanNvbigpKVxuICAgIC50aGVuKGRhdGEgPT4ge1xuICAgICAgY29uc3QgcGkgICAgICA9IGRhdGEucGVyc29uYWxfaW5mbyB8fCB7fTtcbiAgICAgIGNvbnN0IGNvbnRhY3QgPSBwaS5jb250YWN0IHx8IHt9O1xuICAgICAgY29uc3QgYWRkcmVzcyA9IGNvbnRhY3QuYWRkcmVzcyB8fCB7fTtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwaS1uYW1lLWlucHV0JykudmFsdWUgICAgPSBwaS5uYW1lIHx8ICcnO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BpLXRpdGxlLWlucHV0JykudmFsdWUgICA9IHBpLnRpdGxlIHx8IHBpLmhlYWRsaW5lIHx8ICcnO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BpLWVtYWlsLWlucHV0JykudmFsdWUgICA9IGNvbnRhY3QuZW1haWwgfHwgcGkuZW1haWwgfHwgJyc7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGktcGhvbmUtaW5wdXQnKS52YWx1ZSAgID0gY29udGFjdC5waG9uZSB8fCAnJztcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwaS1saW5rZWRpbi1pbnB1dCcpLnZhbHVlID0gY29udGFjdC5saW5rZWRpbiB8fCAnJztcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwaS13ZWJzaXRlLWlucHV0JykudmFsdWUgID0gY29udGFjdC53ZWJzaXRlIHx8ICcnO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BpLWNpdHktaW5wdXQnKS52YWx1ZSAgICA9IGFkZHJlc3MuY2l0eSB8fCAnJztcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwaS1zdGF0ZS1pbnB1dCcpLnZhbHVlICAgPSBhZGRyZXNzLnN0YXRlIHx8ICcnO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1waS1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICAgIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICAgIHNldEluaXRpYWxGb2N1cygnbWFzdGVyLXBpLW1vZGFsLW92ZXJsYXknKTtcbiAgICAgIHRyYXBGb2N1cygnbWFzdGVyLXBpLW1vZGFsLW92ZXJsYXknKTtcbiAgICB9KVxuICAgIC5jYXRjaCgoKSA9PiBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgJ0NvdWxkIG5vdCBsb2FkIHBlcnNvbmFsIGluZm8nKSk7XG59XG5cbmZ1bmN0aW9uIGNsb3NlUGVyc29uYWxJbmZvTW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcGktbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHJlc3RvcmVGb2N1cygpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzYXZlUGVyc29uYWxJbmZvKCkge1xuICBjb25zdCBib2R5ID0ge1xuICAgIG5hbWU6ICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGktbmFtZS1pbnB1dCcpLnZhbHVlLnRyaW0oKSxcbiAgICB0aXRsZTogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BpLXRpdGxlLWlucHV0JykudmFsdWUudHJpbSgpLFxuICAgIGVtYWlsOiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGktZW1haWwtaW5wdXQnKS52YWx1ZS50cmltKCksXG4gICAgcGhvbmU6ICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwaS1waG9uZS1pbnB1dCcpLnZhbHVlLnRyaW0oKSxcbiAgICBsaW5rZWRpbjogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BpLWxpbmtlZGluLWlucHV0JykudmFsdWUudHJpbSgpLFxuICAgIHdlYnNpdGU6ICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGktd2Vic2l0ZS1pbnB1dCcpLnZhbHVlLnRyaW0oKSxcbiAgICBjaXR5OiAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BpLWNpdHktaW5wdXQnKS52YWx1ZS50cmltKCksXG4gICAgc3RhdGU6ICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwaS1zdGF0ZS1pbnB1dCcpLnZhbHVlLnRyaW0oKSxcbiAgfTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvcGVyc29uYWwtaW5mbycsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSwgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEub2spIHtcbiAgICAgIGNsb3NlUGVyc29uYWxJbmZvTW9kYWwoKTtcbiAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ1BlcnNvbmFsIEluZm9ybWF0aW9uJywgJ3VwZGF0ZWQnKTtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3MDUgU2F2ZWQnLCAnUGVyc29uYWwgaW5mb3JtYXRpb24gdXBkYXRlZC4nKTtcbiAgICAgIGF3YWl0IHBvcHVsYXRlTWFzdGVyVGFiKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCBkYXRhLmVycm9yIHx8ICdTYXZlIGZhaWxlZCcpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIHNhdmUgcGVyc29uYWwgaW5mbycpO1xuICB9XG59XG5cbi8vIC0tLS0gRXhwZXJpZW5jZSBtb2RhbCBoYW5kbGVycyAtLS0tXG5cbmZ1bmN0aW9uIHNob3dBZGRFeHBlcmllbmNlTW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtbW9kYWwtaWQnKS52YWx1ZSAgICAgICAgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC10aXRsZS1pbnB1dCcpLnZhbHVlICAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLWNvbXBhbnktaW5wdXQnKS52YWx1ZSAgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtY2l0eS1pbnB1dCcpLnZhbHVlICAgICAgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC1zdGF0ZS1pbnB1dCcpLnZhbHVlICAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLXN0YXJ0LWlucHV0JykudmFsdWUgICAgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtZW5kLWlucHV0JykudmFsdWUgICAgICAgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC10eXBlLWlucHV0JykudmFsdWUgICAgICA9ICdmdWxsX3RpbWUnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLWltcG9ydGFuY2UtaW5wdXQnKS52YWx1ZSA9ICc1JztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC10YWdzLWlucHV0JykudmFsdWUgICAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWV4cC1tb2RhbC10aXRsZScpLnRleHRDb250ZW50ID0gJ0FkZCBXb3JrIEV4cGVyaWVuY2UnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWV4cC1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgX21hc3RlckV4cE1vZGFsQWNoaWV2ZW1lbnRzID0gW107XG4gIF9yZW5kZXJFeHBBY2hpZXZlbWVudHNFZGl0b3IoKTtcbiAgX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBzZXRJbml0aWFsRm9jdXMoJ21hc3Rlci1leHAtbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ21hc3Rlci1leHAtbW9kYWwtb3ZlcmxheScpO1xufVxuXG4vLyBXb3JraW5nIGNvcHkgb2YgdGhlIGN1cnJlbnRseS1lZGl0ZWQgZXhwZXJpZW5jZSdzIGFjaGlldmVtZW50cyB3aGlsZSB0aGVcbi8vIG1vZGFsIGlzIG9wZW4gKEdBUC0xOSAxNi4xMSkuIGVkaXRNYXN0ZXJFeHBlcmllbmNlKCkgdGFrZXMgYW4gaWQgKG5vdCB0aGVcbi8vIGZ1bGwgb2JqZWN0KSBhbmQgbG9va3MgaXQgdXAgZnJvbSB3aW5kb3cuX21hc3RlckV4cGVyaWVuY2VGdWxsRGF0YSBcdTIwMTRcbi8vIGFjaGlldmVtZW50IHRleHQgY2FuIGNvbnRhaW4gcXVvdGVzL3VuaWNvZGUgdGhhdCB3b3VsZCBiZSBmcmFnaWxlIHRvXG4vLyBlbWJlZCBkaXJlY3RseSBpbnNpZGUgYW4gaW5saW5lIG9uY2xpY2sgYXR0cmlidXRlLlxubGV0IF9tYXN0ZXJFeHBNb2RhbEFjaGlldmVtZW50cyA9IFtdO1xuXG5mdW5jdGlvbiBfYWNoaWV2ZW1lbnRUZXh0KGEpIHtcbiAgcmV0dXJuIHR5cGVvZiBhID09PSAnc3RyaW5nJyA/IGEgOiAoYSAmJiBhLnRleHQpIHx8ICcnO1xufVxuXG5mdW5jdGlvbiBfcmVuZGVyRXhwQWNoaWV2ZW1lbnRzRWRpdG9yKCkge1xuICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLWFjaGlldmVtZW50cy1lZGl0b3ItbGlzdCcpO1xuICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuO1xuICBjb25zdCBsYXN0SWR4ID0gX21hc3RlckV4cE1vZGFsQWNoaWV2ZW1lbnRzLmxlbmd0aCAtIDE7XG4gIGNvbnRhaW5lci5pbm5lckhUTUwgPSBfbWFzdGVyRXhwTW9kYWxBY2hpZXZlbWVudHMubWFwKChhY2gsIGlkeCkgPT4gYFxuICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjZweDthbGlnbi1pdGVtczpjZW50ZXI7bWFyZ2luLWJvdHRvbTo2cHg7XCI+XG4gICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImVkaXQtaW5wdXQgZXhwLWFjaC10ZXh0LWlucHV0XCIgZGF0YS1pZHg9XCIke2lkeH1cIiBzdHlsZT1cImZsZXg6MTtcIlxuICAgICAgICAgIHZhbHVlPVwiJHtlc2NhcGVIdG1sKF9hY2hpZXZlbWVudFRleHQoYWNoKSl9XCIgYXJpYS1sYWJlbD1cIkFjaGlldmVtZW50ICR7aWR4ICsgMX0gdGV4dFwiIC8+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImljb24tYnRuXCIgb25jbGljaz1cIl9tb3ZlRXhwQWNoaWV2ZW1lbnQoJHtpZHh9LCAtMSlcIlxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJNb3ZlIGFjaGlldmVtZW50ICR7aWR4ICsgMX0gdXBcIiB0aXRsZT1cIk1vdmUgdXBcIiAke2lkeCA9PT0gMCA/ICdkaXNhYmxlZCcgOiAnJ30+XHUyMTkxPC9idXR0b24+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImljb24tYnRuXCIgb25jbGljaz1cIl9tb3ZlRXhwQWNoaWV2ZW1lbnQoJHtpZHh9LCAxKVwiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIk1vdmUgYWNoaWV2ZW1lbnQgJHtpZHggKyAxfSBkb3duXCIgdGl0bGU9XCJNb3ZlIGRvd25cIiAke2lkeCA9PT0gbGFzdElkeCA/ICdkaXNhYmxlZCcgOiAnJ30+XHUyMTkzPC9idXR0b24+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImljb24tYnRuXCIgb25jbGljaz1cIl9kZWxldGVFeHBBY2hpZXZlbWVudCgke2lkeH0pXCJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiRGVsZXRlIGFjaGlldmVtZW50ICR7aWR4ICsgMX1cIiB0aXRsZT1cIkRlbGV0ZVwiPlx1RDgzRFx1REREMVx1RkUwRjwvYnV0dG9uPlxuICAgIDwvZGl2PmApLmpvaW4oJycpIHx8ICc8cCBzdHlsZT1cImNvbG9yOiM5NGEzYjg7Zm9udC1zaXplOjAuODVlbTttYXJnaW46MCAwIDZweDtcIj5ObyBhY2hpZXZlbWVudHMgeWV0LjwvcD4nO1xufVxuXG4vLyBSZWFkIGFueSBpbi1wcm9ncmVzcyBlZGl0cyBvdXQgb2YgdGhlIGFjaGlldmVtZW50IHRleHQgaW5wdXRzIGJlZm9yZSBhXG4vLyByZW9yZGVyL2RlbGV0ZS9zYXZlIHJlYnVpbGRzIHRoZSBsaXN0IGZyb20gX21hc3RlckV4cE1vZGFsQWNoaWV2ZW1lbnRzIFx1MjAxNFxuLy8gb3RoZXJ3aXNlIGFuIHVuLXN1Ym1pdHRlZCB0ZXh0IGVkaXQgd291bGQgYmUgc2lsZW50bHkgbG9zdCBvbiByZS1yZW5kZXIuXG5mdW5jdGlvbiBfc3luY0V4cEFjaGlldmVtZW50c0Zyb21JbnB1dHMoKSB7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5leHAtYWNoLXRleHQtaW5wdXQnKS5mb3JFYWNoKChpbnB1dCkgPT4ge1xuICAgIGNvbnN0IGlkeCA9IHBhcnNlSW50KGlucHV0LmRhdGFzZXQuaWR4LCAxMCk7XG4gICAgY29uc3QgYWNoID0gX21hc3RlckV4cE1vZGFsQWNoaWV2ZW1lbnRzW2lkeF07XG4gICAgaWYgKHR5cGVvZiBhY2ggPT09ICdzdHJpbmcnIHx8IGFjaCA9PSBudWxsKSB7XG4gICAgICBfbWFzdGVyRXhwTW9kYWxBY2hpZXZlbWVudHNbaWR4XSA9IGlucHV0LnZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBhY2gudGV4dCA9IGlucHV0LnZhbHVlO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIF9hZGRFeHBBY2hpZXZlbWVudCgpIHtcbiAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLWFjaC1uZXctaW5wdXQnKTtcbiAgY29uc3QgdGV4dCA9IChpbnB1dC52YWx1ZSB8fCAnJykudHJpbSgpO1xuICBpZiAoIXRleHQpIHJldHVybjtcbiAgX3N5bmNFeHBBY2hpZXZlbWVudHNGcm9tSW5wdXRzKCk7XG4gIF9tYXN0ZXJFeHBNb2RhbEFjaGlldmVtZW50cy5wdXNoKHRleHQpO1xuICBpbnB1dC52YWx1ZSA9ICcnO1xuICBfcmVuZGVyRXhwQWNoaWV2ZW1lbnRzRWRpdG9yKCk7XG59XG5cbmZ1bmN0aW9uIF9tb3ZlRXhwQWNoaWV2ZW1lbnQoaWR4LCBkZWx0YSkge1xuICBfc3luY0V4cEFjaGlldmVtZW50c0Zyb21JbnB1dHMoKTtcbiAgY29uc3QgdGFyZ2V0ID0gaWR4ICsgZGVsdGE7XG4gIGlmICh0YXJnZXQgPCAwIHx8IHRhcmdldCA+PSBfbWFzdGVyRXhwTW9kYWxBY2hpZXZlbWVudHMubGVuZ3RoKSByZXR1cm47XG4gIGNvbnN0IFtpdGVtXSA9IF9tYXN0ZXJFeHBNb2RhbEFjaGlldmVtZW50cy5zcGxpY2UoaWR4LCAxKTtcbiAgX21hc3RlckV4cE1vZGFsQWNoaWV2ZW1lbnRzLnNwbGljZSh0YXJnZXQsIDAsIGl0ZW0pO1xuICBfcmVuZGVyRXhwQWNoaWV2ZW1lbnRzRWRpdG9yKCk7XG59XG5cbmZ1bmN0aW9uIF9kZWxldGVFeHBBY2hpZXZlbWVudChpZHgpIHtcbiAgX3N5bmNFeHBBY2hpZXZlbWVudHNGcm9tSW5wdXRzKCk7XG4gIF9tYXN0ZXJFeHBNb2RhbEFjaGlldmVtZW50cy5zcGxpY2UoaWR4LCAxKTtcbiAgX3JlbmRlckV4cEFjaGlldmVtZW50c0VkaXRvcigpO1xufVxuXG5mdW5jdGlvbiBlZGl0TWFzdGVyRXhwZXJpZW5jZShpZCkge1xuICBjb25zdCBleHAgPSAod2luZG93Ll9tYXN0ZXJFeHBlcmllbmNlRnVsbERhdGEgfHwgW10pLmZpbmQoKGUpID0+IGUuaWQgPT09IGlkKTtcbiAgaWYgKCFleHApIHtcbiAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgJ0NvdWxkIG5vdCBmaW5kIHRoYXQgZXhwZXJpZW5jZSBlbnRyeSBcdTIwMTQgdHJ5IHJlZnJlc2hpbmcgdGhlIHRhYi4nKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgbG9jID0gZXhwLmxvY2F0aW9uIHx8IHt9O1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLW1vZGFsLWlkJykudmFsdWUgICAgICAgICA9IGV4cC5pZCB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC10aXRsZS1pbnB1dCcpLnZhbHVlICAgICAgPSBleHAudGl0bGUgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtY29tcGFueS1pbnB1dCcpLnZhbHVlICAgID0gZXhwLmNvbXBhbnkgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtY2l0eS1pbnB1dCcpLnZhbHVlICAgICAgID0gbG9jLmNpdHkgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtc3RhdGUtaW5wdXQnKS52YWx1ZSAgICAgID0gbG9jLnN0YXRlIHx8ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLXN0YXJ0LWlucHV0JykudmFsdWUgICAgICA9IGV4cC5zdGFydF9kYXRlIHx8ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLWVuZC1pbnB1dCcpLnZhbHVlICAgICAgICA9IGV4cC5lbmRfZGF0ZSB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC10eXBlLWlucHV0JykudmFsdWUgICAgICAgPSBleHAuZW1wbG95bWVudF90eXBlIHx8ICdmdWxsX3RpbWUnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLWltcG9ydGFuY2UtaW5wdXQnKS52YWx1ZSAgPSBleHAuaW1wb3J0YW5jZSB8fCA1O1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLXRhZ3MtaW5wdXQnKS52YWx1ZSAgICAgICA9IHR5cGVvZiBleHAudGFncyA9PT0gJ3N0cmluZycgPyBleHAudGFnc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoZXhwLnRhZ3MgfHwgW10pLmpvaW4oJywgJyk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItZXhwLW1vZGFsLXRpdGxlJykudGV4dENvbnRlbnQgPSAnRWRpdCBXb3JrIEV4cGVyaWVuY2UnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWV4cC1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgX21hc3RlckV4cE1vZGFsQWNoaWV2ZW1lbnRzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShleHAuYWNoaWV2ZW1lbnRzIHx8IFtdKSk7XG4gIF9yZW5kZXJFeHBBY2hpZXZlbWVudHNFZGl0b3IoKTtcbiAgX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBzZXRJbml0aWFsRm9jdXMoJ21hc3Rlci1leHAtbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ21hc3Rlci1leHAtbW9kYWwtb3ZlcmxheScpO1xufVxuXG5mdW5jdGlvbiBjbG9zZUV4cGVyaWVuY2VNb2RhbCgpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1leHAtbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHJlc3RvcmVGb2N1cygpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzYXZlTWFzdGVyRXhwZXJpZW5jZSgpIHtcbiAgY29uc3QgaWQgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC1tb2RhbC1pZCcpLnZhbHVlLnRyaW0oKTtcbiAgY29uc3QgdGl0bGUgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC10aXRsZS1pbnB1dCcpLnZhbHVlLnRyaW0oKTtcbiAgY29uc3QgY29tcGFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtY29tcGFueS1pbnB1dCcpLnZhbHVlLnRyaW0oKTtcbiAgaWYgKCF0aXRsZSB8fCAhY29tcGFueSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI2QTBcdUZFMEYgVmFsaWRhdGlvbicsICdKb2IgdGl0bGUgYW5kIGNvbXBhbnkgYXJlIHJlcXVpcmVkLicpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB0YWdzUmF3ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC10YWdzLWlucHV0JykudmFsdWU7XG4gIF9zeW5jRXhwQWNoaWV2ZW1lbnRzRnJvbUlucHV0cygpO1xuICBjb25zdCBleHBEYXRhID0ge1xuICAgIHRpdGxlLCBjb21wYW55LFxuICAgIGNpdHk6ICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC1jaXR5LWlucHV0JykudmFsdWUudHJpbSgpLFxuICAgIHN0YXRlOiAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC1zdGF0ZS1pbnB1dCcpLnZhbHVlLnRyaW0oKSxcbiAgICBzdGFydF9kYXRlOiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtc3RhcnQtaW5wdXQnKS52YWx1ZS50cmltKCksXG4gICAgZW5kX2RhdGU6ICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLWVuZC1pbnB1dCcpLnZhbHVlLnRyaW0oKSxcbiAgICBlbXBsb3ltZW50X3R5cGU6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtdHlwZS1pbnB1dCcpLnZhbHVlLFxuICAgIGltcG9ydGFuY2U6ICAgICAgcGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC1pbXBvcnRhbmNlLWlucHV0JykudmFsdWUsIDEwKSB8fCA1LFxuICAgIHRhZ3M6ICAgICAgICAgICAgdGFnc1Jhdy5zcGxpdCgnLCcpLm1hcChzID0+IHMudHJpbSgpKS5maWx0ZXIoQm9vbGVhbiksXG4gICAgYWNoaWV2ZW1lbnRzOiAgICBfbWFzdGVyRXhwTW9kYWxBY2hpZXZlbWVudHMsXG4gIH07XG4gIGNvbnN0IGFjdGlvbiA9IGlkID8gJ3VwZGF0ZScgOiAnYWRkJztcbiAgY29uc3QgYm9keSAgID0gYWN0aW9uID09PSAndXBkYXRlJyA/IHsgYWN0aW9uLCBpZCwgZXhwZXJpZW5jZTogZXhwRGF0YSB9IDogeyBhY3Rpb24sIGV4cGVyaWVuY2U6IGV4cERhdGEgfTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvZXhwZXJpZW5jZScsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSwgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEub2spIHtcbiAgICAgIGNsb3NlRXhwZXJpZW5jZU1vZGFsKCk7XG4gICAgICBfc2V0TWFzdGVyQ2hhbmdlTm90aWNlKCdXb3JrIEV4cGVyaWVuY2UnLCBkYXRhLmFjdGlvbiB8fCAndXBkYXRlZCcpO1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjcwNSBTYXZlZCcsIGBFeHBlcmllbmNlIFwiJHt0aXRsZX1cIiAke2RhdGEuYWN0aW9ufS5gKTtcbiAgICAgIGF3YWl0IHBvcHVsYXRlTWFzdGVyVGFiKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCBkYXRhLmVycm9yIHx8ICdTYXZlIGZhaWxlZCcpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIHNhdmUgZXhwZXJpZW5jZScpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZU1hc3RlckV4cGVyaWVuY2UoaWQsIHRpdGxlKSB7XG4gIHNob3dDb25maXJtTW9kYWwoXG4gICAgJ1x1RDgzRFx1REREMVx1RkUwRiBEZWxldGUgRXhwZXJpZW5jZScsXG4gICAgYERlbGV0ZSBcIiR7dGl0bGV9XCI/IFRoaXMgY2Fubm90IGJlIHVuZG9uZS5gLFxuICAgIGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS9leHBlcmllbmNlJywge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGFjdGlvbjogJ2RlbGV0ZScsIGlkIH0pLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICAgICAgX3NldE1hc3RlckNoYW5nZU5vdGljZSgnV29yayBFeHBlcmllbmNlJywgZGF0YS5hY3Rpb24gfHwgJ2RlbGV0ZWQnKTtcbiAgICAgICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzA1IERlbGV0ZWQnLCBgRXhwZXJpZW5jZSBcIiR7dGl0bGV9XCIgcmVtb3ZlZC5gKTtcbiAgICAgICAgICBhd2FpdCBwb3B1bGF0ZU1hc3RlclRhYigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCBkYXRhLmVycm9yIHx8ICdEZWxldGUgZmFpbGVkJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsICdGYWlsZWQgdG8gZGVsZXRlIGV4cGVyaWVuY2UnKTtcbiAgICAgIH1cbiAgICB9XG4gICk7XG59XG5cbi8vIC0tLS0gU2tpbGwgbW9kYWwgaGFuZGxlcnMgLS0tLVxuXG5mdW5jdGlvbiBzaG93QWRkU2tpbGxNb2RhbChjYXRlZ29yeUtleSwgaXNGbGF0KSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1tb2RhbC1jYXRlZ29yeScpLnZhbHVlID0gY2F0ZWdvcnlLZXkgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1tb2RhbC1pcy1mbGF0JykudmFsdWUgID0gaXNGbGF0ID8gJzEnIDogJzAnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtbW9kYWwtb3JpZ2luYWwtbmFtZScpLnZhbHVlID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1uYW1lLWlucHV0JykudmFsdWUgICAgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1leHBlcmllbmNlcy1pbnB1dCcpLnZhbHVlID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1hbGlhc2VzLWlucHV0JykudmFsdWUgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC15ZWFycy1pbnB1dCcpLnZhbHVlICAgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItc2tpbGwtbW9kYWwtdGl0bGUnKS50ZXh0Q29udGVudCA9ICdBZGQgU2tpbGwnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXNraWxsLXNhdmUtYnRuJykudGV4dENvbnRlbnQgPSAnQWRkIFNraWxsJztcbiAgY29uc3QgaGludHMgPSAod2luZG93Ll9tYXN0ZXJFeHBlcmllbmNlT3B0aW9ucyB8fCBbXSlcbiAgICAuc2xpY2UoMCwgOClcbiAgICAubWFwKCh4KSA9PiBgJHt4LmlkfSAoJHt4LmxhYmVsfSlgKVxuICAgIC5qb2luKCcgXHUwMEI3ICcpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtZXhwZXJpZW5jZS1oaW50cycpLnRleHRDb250ZW50ID0gaGludHMgPyBgQXZhaWxhYmxlOiAke2hpbnRzfWAgOiAnJztcbiAgY29uc3QgY2F0Um93ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NraWxsLWNhdGVnb3J5LXJvdycpO1xuICBpZiAoY2F0ZWdvcnlLZXkpIHtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtY2F0ZWdvcnktZGlzcGxheScpLnRleHRDb250ZW50ID0gY2F0ZWdvcnlLZXk7XG4gICAgY2F0Um93LnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgfSBlbHNlIHtcbiAgICBjYXRSb3cuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgfVxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXNraWxsLW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICBfZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIHNldEluaXRpYWxGb2N1cygnbWFzdGVyLXNraWxsLW1vZGFsLW92ZXJsYXknKTtcbiAgdHJhcEZvY3VzKCdtYXN0ZXItc2tpbGwtbW9kYWwtb3ZlcmxheScpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtbmFtZS1pbnB1dCcpLmZvY3VzKCk7XG59XG5cbmZ1bmN0aW9uIGVkaXRNYXN0ZXJTa2lsbChza2lsbE9iaiwgY2F0ZWdvcnlLZXksIGlzRmxhdCkge1xuICBjb25zdCBuYW1lID0gdHlwZW9mIHNraWxsT2JqID09PSAnc3RyaW5nJyA/IHNraWxsT2JqIDogKHNraWxsT2JqPy5uYW1lIHx8ICcnKTtcbiAgY29uc3QgZXhwZXJpZW5jZXMgPSBBcnJheS5pc0FycmF5KHNraWxsT2JqPy5leHBlcmllbmNlcykgPyBza2lsbE9iai5leHBlcmllbmNlcyA6IFtdO1xuICBjb25zdCBhbGlhc2VzID0gQXJyYXkuaXNBcnJheShza2lsbE9iaj8uYWxpYXNlcykgPyBza2lsbE9iai5hbGlhc2VzIDogW107XG4gIGNvbnN0IHllYXJzID0gKHR5cGVvZiBza2lsbE9iaiA9PT0gJ29iamVjdCcgJiYgc2tpbGxPYmo/LnllYXJzICE9IG51bGwpID8gc2tpbGxPYmoueWVhcnMgOiAnJztcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtbW9kYWwtY2F0ZWdvcnknKS52YWx1ZSA9IGNhdGVnb3J5S2V5IHx8ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtbW9kYWwtaXMtZmxhdCcpLnZhbHVlICA9IGlzRmxhdCA/ICcxJyA6ICcwJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NraWxsLW1vZGFsLW9yaWdpbmFsLW5hbWUnKS52YWx1ZSA9IG5hbWU7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1uYW1lLWlucHV0JykudmFsdWUgPSBuYW1lO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtZXhwZXJpZW5jZXMtaW5wdXQnKS52YWx1ZSA9IGV4cGVyaWVuY2VzLmpvaW4oJywgJyk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1hbGlhc2VzLWlucHV0JykudmFsdWUgPSBhbGlhc2VzLmpvaW4oJywgJyk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC15ZWFycy1pbnB1dCcpLnZhbHVlID0geWVhcnM7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItc2tpbGwtbW9kYWwtdGl0bGUnKS50ZXh0Q29udGVudCA9ICdFZGl0IFNraWxsJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1za2lsbC1zYXZlLWJ0bicpLnRleHRDb250ZW50ID0gJ1NhdmUgU2tpbGwnO1xuXG4gIGNvbnN0IGhpbnRzID0gKHdpbmRvdy5fbWFzdGVyRXhwZXJpZW5jZU9wdGlvbnMgfHwgW10pXG4gICAgLnNsaWNlKDAsIDgpXG4gICAgLm1hcCgoeCkgPT4gYCR7eC5pZH0gKCR7eC5sYWJlbH0pYClcbiAgICAuam9pbignIFx1MDBCNyAnKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NraWxsLWV4cGVyaWVuY2UtaGludHMnKS50ZXh0Q29udGVudCA9IGhpbnRzID8gYEF2YWlsYWJsZTogJHtoaW50c31gIDogJyc7XG5cbiAgY29uc3QgY2F0Um93ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NraWxsLWNhdGVnb3J5LXJvdycpO1xuICBpZiAoY2F0ZWdvcnlLZXkpIHtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtY2F0ZWdvcnktZGlzcGxheScpLnRleHRDb250ZW50ID0gY2F0ZWdvcnlLZXk7XG4gICAgY2F0Um93LnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgfSBlbHNlIHtcbiAgICBjYXRSb3cuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgfVxuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItc2tpbGwtbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgc2V0SW5pdGlhbEZvY3VzKCdtYXN0ZXItc2tpbGwtbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ21hc3Rlci1za2lsbC1tb2RhbC1vdmVybGF5Jyk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1uYW1lLWlucHV0JykuZm9jdXMoKTtcbn1cblxuZnVuY3Rpb24gY2xvc2VTa2lsbE1vZGFsKCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXNraWxsLW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICByZXN0b3JlRm9jdXMoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZU1hc3RlclNraWxsKCkge1xuICBjb25zdCBza2lsbCAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1uYW1lLWlucHV0JykudmFsdWUudHJpbSgpO1xuICBjb25zdCBjYXRlZ29yeSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1tb2RhbC1jYXRlZ29yeScpLnZhbHVlLnRyaW0oKTtcbiAgY29uc3QgaXNGbGF0ICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtbW9kYWwtaXMtZmxhdCcpLnZhbHVlID09PSAnMSc7XG4gIGNvbnN0IG9yaWdpbmFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NraWxsLW1vZGFsLW9yaWdpbmFsLW5hbWUnKS52YWx1ZS50cmltKCk7XG4gIGNvbnN0IGV4cGVyaWVuY2VzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NraWxsLWV4cGVyaWVuY2VzLWlucHV0JykudmFsdWVcbiAgICAuc3BsaXQoJywnKVxuICAgIC5tYXAoKHMpID0+IHMudHJpbSgpKVxuICAgIC5maWx0ZXIoQm9vbGVhbik7XG4gIGNvbnN0IGFsaWFzZXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtYWxpYXNlcy1pbnB1dCcpLnZhbHVlXG4gICAgLnNwbGl0KCcsJylcbiAgICAubWFwKChzKSA9PiBzLnRyaW0oKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pO1xuICBjb25zdCB5ZWFyc1JhdyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC15ZWFycy1pbnB1dCcpLnZhbHVlLnRyaW0oKTtcbiAgY29uc3QgeWVhcnMgPSB5ZWFyc1JhdyA9PT0gJycgPyBudWxsIDogcGFyc2VGbG9hdCh5ZWFyc1Jhdyk7XG4gIGlmICghc2tpbGwpIHtcbiAgICBzaG93QWxlcnRNb2RhbCgnXHUyNkEwXHVGRTBGIFZhbGlkYXRpb24nLCAnU2tpbGwgbmFtZSBpcyByZXF1aXJlZC4nKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHllYXJzICE9PSBudWxsICYmICFOdW1iZXIuaXNGaW5pdGUoeWVhcnMpKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjZBMFx1RkUwRiBWYWxpZGF0aW9uJywgJ1llYXJzIG9mIGV4cGVyaWVuY2UgbXVzdCBiZSBhIGZpbml0ZSBudW1iZXIuJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGlzVXBkYXRlID0gQm9vbGVhbihvcmlnaW5hbCk7XG4gIGNvbnN0IGJhc2VCb2R5ID0ge1xuICAgIGFjdGlvbjogaXNVcGRhdGUgPyAndXBkYXRlJyA6ICdhZGQnLFxuICAgIHNraWxsOiBpc1VwZGF0ZSA/IG9yaWdpbmFsIDogc2tpbGwsXG4gICAgLi4uKGlzVXBkYXRlID8geyBza2lsbF9uZXc6IHNraWxsIH0gOiB7fSksXG4gICAgZXhwZXJpZW5jZXMsXG4gICAgYWxpYXNlcyxcbiAgICB5ZWFycyxcbiAgfTtcbiAgY29uc3QgYm9keSA9IGlzRmxhdCA/IGJhc2VCb2R5IDogeyAuLi5iYXNlQm9keSwgY2F0ZWdvcnkgfTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvc2tpbGwnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBjbG9zZVNraWxsTW9kYWwoKTtcbiAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ1NraWxscycsIGRhdGEuYWN0aW9uIHx8ICd1cGRhdGVkJyk7XG4gICAgICBhd2FpdCBwb3B1bGF0ZU1hc3RlclRhYigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgZGF0YS5lcnJvciB8fCAnQ291bGQgbm90IGFkZCBza2lsbCcpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIGFkZCBza2lsbCcpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZU1hc3RlclNraWxsKHNraWxsLCBjYXRlZ29yeSwgaXNGbGF0KSB7XG4gIGNvbnN0IGJvZHkgPSBpc0ZsYXQgPyB7IGFjdGlvbjogJ2RlbGV0ZScsIHNraWxsIH0gOiB7IGFjdGlvbjogJ2RlbGV0ZScsIHNraWxsLCBjYXRlZ29yeSB9O1xuICBjb25zdCBzY29wZSA9IGlzRmxhdCA/ICdTa2lsbHMnIDogYFNraWxscyBcdTIxOTIgJHtjYXRlZ29yeX1gO1xuICBzaG93Q29uZmlybU1vZGFsKFxuICAgICdcdUQ4M0RcdURERDFcdUZFMEYgRGVsZXRlIFNraWxsJyxcbiAgICBgRGVsZXRlIHNraWxsIFwiJHtza2lsbH1cIiBmcm9tICR7c2NvcGV9PyBUaGlzIGNhbm5vdCBiZSB1bmRvbmUuYCxcbiAgICBhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvc2tpbGwnLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LCBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICBpZiAoZGF0YS5vaykge1xuICAgICAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ1NraWxscycsIGRhdGEuYWN0aW9uIHx8ICd1cGRhdGVkJyk7XG4gICAgICAgICAgYXdhaXQgcG9wdWxhdGVNYXN0ZXJUYWIoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgZGF0YS5lcnJvciB8fCAnQ291bGQgbm90IHJlbW92ZSBza2lsbCcpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIHJlbW92ZSBza2lsbCcpO1xuICAgICAgfVxuICAgIH1cbiAgKTtcbn1cblxuLy8gLS0tLSBFZHVjYXRpb24gbW9kYWwgaGFuZGxlcnMgLS0tLVxuXG5mdW5jdGlvbiBzaG93QWRkRWR1Y2F0aW9uTW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtbW9kYWwtaWR4JykudmFsdWUgICAgICAgICAgICA9ICctMSc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtZGVncmVlLWlucHV0JykudmFsdWUgICAgICAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LWZpZWxkLWlucHV0JykudmFsdWUgICAgICAgICAgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkdS1pbnN0aXR1dGlvbi1pbnB1dCcpLnZhbHVlICAgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtY2l0eS1pbnB1dCcpLnZhbHVlICAgICAgICAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LXN0YXRlLWlucHV0JykudmFsdWUgICAgICAgICAgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkdS1zdGFydC15ZWFyLWlucHV0JykudmFsdWUgICAgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtZW5kLXllYXItaW5wdXQnKS52YWx1ZSAgICAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWVkdS1tb2RhbC10aXRsZScpLnRleHRDb250ZW50ID0gJ0FkZCBFZHVjYXRpb24nO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWVkdS1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBzZXRJbml0aWFsRm9jdXMoJ21hc3Rlci1lZHUtbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ21hc3Rlci1lZHUtbW9kYWwtb3ZlcmxheScpO1xufVxuXG5mdW5jdGlvbiBlZGl0TWFzdGVyRWR1Y2F0aW9uKGVkdSwgaWR4KSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtbW9kYWwtaWR4JykudmFsdWUgICAgICAgICA9IGlkeDtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkdS1kZWdyZWUtaW5wdXQnKS52YWx1ZSAgICAgID0gZWR1LmRlZ3JlZSB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkdS1maWVsZC1pbnB1dCcpLnZhbHVlICAgICAgID0gZWR1LmZpZWxkIHx8ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LWluc3RpdHV0aW9uLWlucHV0JykudmFsdWUgPSBlZHUuaW5zdGl0dXRpb24gfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtY2l0eS1pbnB1dCcpLnZhbHVlICAgICAgICA9IGVkdS5jaXR5IHx8ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LXN0YXRlLWlucHV0JykudmFsdWUgICAgICAgPSBlZHUuc3RhdGUgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtc3RhcnQteWVhci1pbnB1dCcpLnZhbHVlICA9IGVkdS5zdGFydF95ZWFyIHx8ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LWVuZC15ZWFyLWlucHV0JykudmFsdWUgICAgPSBlZHUuZW5kX3llYXIgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItZWR1LW1vZGFsLXRpdGxlJykudGV4dENvbnRlbnQgPSAnRWRpdCBFZHVjYXRpb24nO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWVkdS1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBzZXRJbml0aWFsRm9jdXMoJ21hc3Rlci1lZHUtbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ21hc3Rlci1lZHUtbW9kYWwtb3ZlcmxheScpO1xufVxuXG5mdW5jdGlvbiBjbG9zZUVkdWNhdGlvbk1vZGFsKCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWVkdS1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgcmVzdG9yZUZvY3VzKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNhdmVNYXN0ZXJFZHVjYXRpb24oKSB7XG4gIGNvbnN0IGlkeCAgICAgPSBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LW1vZGFsLWlkeCcpLnZhbHVlLCAxMCk7XG4gIGNvbnN0IGRlZ3JlZSAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LWRlZ3JlZS1pbnB1dCcpLnZhbHVlLnRyaW0oKTtcbiAgY29uc3QgaW5zdGl0dXRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LWluc3RpdHV0aW9uLWlucHV0JykudmFsdWUudHJpbSgpO1xuICBpZiAoIWRlZ3JlZSB8fCAhaW5zdGl0dXRpb24pIHtcbiAgICBzaG93QWxlcnRNb2RhbCgnXHUyNkEwXHVGRTBGIFZhbGlkYXRpb24nLCAnRGVncmVlIGFuZCBpbnN0aXR1dGlvbiBhcmUgcmVxdWlyZWQuJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGFjdGlvbiA9IGlkeCA+PSAwID8gJ3VwZGF0ZScgOiAnYWRkJztcbiAgY29uc3QgYm9keSA9IHtcbiAgICBhY3Rpb24sXG4gICAgZGVncmVlLFxuICAgIGZpZWxkOiAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LWZpZWxkLWlucHV0JykudmFsdWUudHJpbSgpLFxuICAgIGluc3RpdHV0aW9uLFxuICAgIGNpdHk6ICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LWNpdHktaW5wdXQnKS52YWx1ZS50cmltKCksXG4gICAgc3RhdGU6ICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtc3RhdGUtaW5wdXQnKS52YWx1ZS50cmltKCksXG4gICAgc3RhcnRfeWVhcjogIHBhcnNlSW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtc3RhcnQteWVhci1pbnB1dCcpLnZhbHVlLCAxMCkgfHwgbnVsbCxcbiAgICBlbmRfeWVhcjogICAgcGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkdS1lbmQteWVhci1pbnB1dCcpLnZhbHVlLCAxMCkgfHwgbnVsbCxcbiAgICAuLi4oYWN0aW9uID09PSAndXBkYXRlJyA/IHsgaWR4IH0gOiB7fSksXG4gIH07XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL2VkdWNhdGlvbicsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSwgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEub2spIHtcbiAgICAgIGNsb3NlRWR1Y2F0aW9uTW9kYWwoKTtcbiAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ0VkdWNhdGlvbicsIGRhdGEuYWN0aW9uIHx8ICd1cGRhdGVkJyk7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzA1IFNhdmVkJywgYEVkdWNhdGlvbiBcIiR7ZGVncmVlfSBcdTIwMTMgJHtpbnN0aXR1dGlvbn1cIiAke2RhdGEuYWN0aW9ufS5gKTtcbiAgICAgIGF3YWl0IHBvcHVsYXRlTWFzdGVyVGFiKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCBkYXRhLmVycm9yIHx8ICdTYXZlIGZhaWxlZCcpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIHNhdmUgZWR1Y2F0aW9uJyk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlTWFzdGVyRWR1Y2F0aW9uKGlkeCwgaW5zdGl0dXRpb24pIHtcbiAgc2hvd0NvbmZpcm1Nb2RhbChcbiAgICAnXHVEODNEXHVEREQxXHVGRTBGIERlbGV0ZSBFZHVjYXRpb24nLFxuICAgIGBEZWxldGUgXCIke2luc3RpdHV0aW9ufVwiPyBUaGlzIGNhbm5vdCBiZSB1bmRvbmUuYCxcbiAgICBhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvZWR1Y2F0aW9uJywge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGFjdGlvbjogJ2RlbGV0ZScsIGlkeCB9KSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICBpZiAoZGF0YS5vaykge1xuICAgICAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ0VkdWNhdGlvbicsIGRhdGEuYWN0aW9uIHx8ICdkZWxldGVkJyk7XG4gICAgICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjcwNSBEZWxldGVkJywgYEVkdWNhdGlvbiBlbnRyeSByZW1vdmVkLmApO1xuICAgICAgICAgIGF3YWl0IHBvcHVsYXRlTWFzdGVyVGFiKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsIGRhdGEuZXJyb3IgfHwgJ0RlbGV0ZSBmYWlsZWQnKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgJ0ZhaWxlZCB0byBkZWxldGUgZWR1Y2F0aW9uIGVudHJ5Jyk7XG4gICAgICB9XG4gICAgfVxuICApO1xufVxuXG4vLyAtLS0tIEF3YXJkIG1vZGFsIGhhbmRsZXJzIC0tLS1cblxuZnVuY3Rpb24gc2hvd0FkZEF3YXJkTW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhd2FyZC1tb2RhbC1pZHgnKS52YWx1ZSAgICA9ICctMSc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhd2FyZC10aXRsZS1pbnB1dCcpLnZhbHVlICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXdhcmQteWVhci1pbnB1dCcpLnZhbHVlICAgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F3YXJkLWRlc2MtaW5wdXQnKS52YWx1ZSAgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhd2FyZC1yZWxldmFudC1pbnB1dCcpLnZhbHVlID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItYXdhcmQtbW9kYWwtdGl0bGUnKS50ZXh0Q29udGVudCA9ICdBZGQgQXdhcmQgLyBIb25vdXInO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWF3YXJkLW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICBfZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIHNldEluaXRpYWxGb2N1cygnbWFzdGVyLWF3YXJkLW1vZGFsLW92ZXJsYXknKTtcbiAgdHJhcEZvY3VzKCdtYXN0ZXItYXdhcmQtbW9kYWwtb3ZlcmxheScpO1xufVxuXG5mdW5jdGlvbiBlZGl0TWFzdGVyQXdhcmQoYXdhcmQsIGlkeCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXdhcmQtbW9kYWwtaWR4JykudmFsdWUgICAgID0gaWR4O1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXdhcmQtdGl0bGUtaW5wdXQnKS52YWx1ZSAgID0gYXdhcmQudGl0bGUgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhd2FyZC15ZWFyLWlucHV0JykudmFsdWUgICAgPSBhd2FyZC55ZWFyIHx8ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXdhcmQtZGVzYy1pbnB1dCcpLnZhbHVlICAgID0gYXdhcmQuZGVzY3JpcHRpb24gfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhd2FyZC1yZWxldmFudC1pbnB1dCcpLnZhbHVlID0gdHlwZW9mIGF3YXJkLnJlbGV2YW50X2ZvciA9PT0gJ3N0cmluZydcbiAgICA/IGF3YXJkLnJlbGV2YW50X2ZvciA6IChhd2FyZC5yZWxldmFudF9mb3IgfHwgW10pLmpvaW4oJywgJyk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItYXdhcmQtbW9kYWwtdGl0bGUnKS50ZXh0Q29udGVudCA9ICdFZGl0IEF3YXJkIC8gSG9ub3VyJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1hd2FyZC1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBzZXRJbml0aWFsRm9jdXMoJ21hc3Rlci1hd2FyZC1tb2RhbC1vdmVybGF5Jyk7XG4gIHRyYXBGb2N1cygnbWFzdGVyLWF3YXJkLW1vZGFsLW92ZXJsYXknKTtcbn1cblxuZnVuY3Rpb24gY2xvc2VBd2FyZE1vZGFsKCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWF3YXJkLW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICByZXN0b3JlRm9jdXMoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZU1hc3RlckF3YXJkKCkge1xuICBjb25zdCBpZHggICA9IHBhcnNlSW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhd2FyZC1tb2RhbC1pZHgnKS52YWx1ZSwgMTApO1xuICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhd2FyZC10aXRsZS1pbnB1dCcpLnZhbHVlLnRyaW0oKTtcbiAgaWYgKCF0aXRsZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI2QTBcdUZFMEYgVmFsaWRhdGlvbicsICdBd2FyZCB0aXRsZSBpcyByZXF1aXJlZC4nKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgYWN0aW9uID0gaWR4ID49IDAgPyAndXBkYXRlJyA6ICdhZGQnO1xuICBjb25zdCByZWxldmFudFJhdyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhd2FyZC1yZWxldmFudC1pbnB1dCcpLnZhbHVlO1xuICBjb25zdCBib2R5ID0ge1xuICAgIGFjdGlvbiwgdGl0bGUsXG4gICAgeWVhcjogICAgICAgICBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXdhcmQteWVhci1pbnB1dCcpLnZhbHVlLCAxMCkgfHwgbnVsbCxcbiAgICBkZXNjcmlwdGlvbjogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhd2FyZC1kZXNjLWlucHV0JykudmFsdWUudHJpbSgpLFxuICAgIHJlbGV2YW50X2ZvcjogcmVsZXZhbnRSYXcuc3BsaXQoJywnKS5tYXAocyA9PiBzLnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pLFxuICAgIC4uLihhY3Rpb24gPT09ICd1cGRhdGUnID8geyBpZHggfSA6IHt9KSxcbiAgfTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvYXdhcmQnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBjbG9zZUF3YXJkTW9kYWwoKTtcbiAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ0F3YXJkcyAmIEhvbm91cnMnLCBkYXRhLmFjdGlvbiB8fCAndXBkYXRlZCcpO1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjcwNSBTYXZlZCcsIGBBd2FyZCBcIiR7dGl0bGV9XCIgJHtkYXRhLmFjdGlvbn0uYCk7XG4gICAgICBhd2FpdCBwb3B1bGF0ZU1hc3RlclRhYigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgZGF0YS5lcnJvciB8fCAnU2F2ZSBmYWlsZWQnKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgJ0ZhaWxlZCB0byBzYXZlIGF3YXJkJyk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlTWFzdGVyQXdhcmQoaWR4LCB0aXRsZSkge1xuICBzaG93Q29uZmlybU1vZGFsKFxuICAgICdcdUQ4M0RcdURERDFcdUZFMEYgRGVsZXRlIEF3YXJkJyxcbiAgICBgRGVsZXRlIFwiJHt0aXRsZX1cIj8gVGhpcyBjYW5ub3QgYmUgdW5kb25lLmAsXG4gICAgYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL2F3YXJkJywge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGFjdGlvbjogJ2RlbGV0ZScsIGlkeCB9KSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICBpZiAoZGF0YS5vaykge1xuICAgICAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ0F3YXJkcyAmIEhvbm91cnMnLCBkYXRhLmFjdGlvbiB8fCAnZGVsZXRlZCcpO1xuICAgICAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3MDUgRGVsZXRlZCcsIGBBd2FyZCByZW1vdmVkLmApO1xuICAgICAgICAgIGF3YWl0IHBvcHVsYXRlTWFzdGVyVGFiKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsIGRhdGEuZXJyb3IgfHwgJ0RlbGV0ZSBmYWlsZWQnKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgJ0ZhaWxlZCB0byBkZWxldGUgYXdhcmQnKTtcbiAgICAgIH1cbiAgICB9XG4gICk7XG59XG5cbi8vIC0tLS0gQ2VydGlmaWNhdGlvbiBDUlVEIGhhbmRsZXJzIC0tLS1cblxuZnVuY3Rpb24gc2hvd0FkZENlcnRpZmljYXRpb25Nb2RhbCgpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NlcnQtbW9kYWwtaWR4JykudmFsdWUgICAgPSAnLTEnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2VydC1uYW1lLWlucHV0JykudmFsdWUgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2VydC1pc3N1ZXItaW5wdXQnKS52YWx1ZSA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2VydC15ZWFyLWlucHV0JykudmFsdWUgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWNlcnQtbW9kYWwtdGl0bGUnKS50ZXh0Q29udGVudCA9ICdBZGQgQ2VydGlmaWNhdGlvbic7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItY2VydC1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBzZXRJbml0aWFsRm9jdXMoJ21hc3Rlci1jZXJ0LW1vZGFsLW92ZXJsYXknKTtcbiAgdHJhcEZvY3VzKCdtYXN0ZXItY2VydC1tb2RhbC1vdmVybGF5Jyk7XG59XG5cbmZ1bmN0aW9uIGVkaXRNYXN0ZXJDZXJ0aWZpY2F0aW9uKGNlcnQsIGlkeCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2VydC1tb2RhbC1pZHgnKS52YWx1ZSAgICA9IGlkeDtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NlcnQtbmFtZS1pbnB1dCcpLnZhbHVlICAgPSBjZXJ0Lm5hbWUgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjZXJ0LWlzc3Vlci1pbnB1dCcpLnZhbHVlID0gY2VydC5pc3N1ZXIgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjZXJ0LXllYXItaW5wdXQnKS52YWx1ZSAgID0gY2VydC55ZWFyIHx8ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWNlcnQtbW9kYWwtdGl0bGUnKS50ZXh0Q29udGVudCA9ICdFZGl0IENlcnRpZmljYXRpb24nO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWNlcnQtbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgc2V0SW5pdGlhbEZvY3VzKCdtYXN0ZXItY2VydC1tb2RhbC1vdmVybGF5Jyk7XG4gIHRyYXBGb2N1cygnbWFzdGVyLWNlcnQtbW9kYWwtb3ZlcmxheScpO1xufVxuXG5mdW5jdGlvbiBjbG9zZUNlcnRpZmljYXRpb25Nb2RhbCgpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1jZXJ0LW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICByZXN0b3JlRm9jdXMoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZU1hc3RlckNlcnRpZmljYXRpb24oKSB7XG4gIGNvbnN0IGlkeCAgPSBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2VydC1tb2RhbC1pZHgnKS52YWx1ZSwgMTApO1xuICBjb25zdCBuYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NlcnQtbmFtZS1pbnB1dCcpLnZhbHVlLnRyaW0oKTtcbiAgaWYgKCFuYW1lKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjZBMFx1RkUwRiBWYWxpZGF0aW9uJywgJ0NlcnRpZmljYXRpb24gbmFtZSBpcyByZXF1aXJlZC4nKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgYWN0aW9uID0gaWR4ID49IDAgPyAndXBkYXRlJyA6ICdhZGQnO1xuICBjb25zdCBib2R5ID0ge1xuICAgIGFjdGlvbiwgbmFtZSxcbiAgICBpc3N1ZXI6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjZXJ0LWlzc3Vlci1pbnB1dCcpLnZhbHVlLnRyaW0oKSxcbiAgICB5ZWFyOiAgIHBhcnNlSW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjZXJ0LXllYXItaW5wdXQnKS52YWx1ZSwgMTApIHx8IG51bGwsXG4gICAgLi4uKGFjdGlvbiA9PT0gJ3VwZGF0ZScgPyB7IGlkeCB9IDoge30pLFxuICB9O1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS9jZXJ0aWZpY2F0aW9uJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LCBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgY2xvc2VDZXJ0aWZpY2F0aW9uTW9kYWwoKTtcbiAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ0NlcnRpZmljYXRpb25zJywgZGF0YS5hY3Rpb24gfHwgJ3VwZGF0ZWQnKTtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3MDUgU2F2ZWQnLCBgQ2VydGlmaWNhdGlvbiBcIiR7bmFtZX1cIiAke2RhdGEuYWN0aW9ufS5gKTtcbiAgICAgIGF3YWl0IHBvcHVsYXRlTWFzdGVyVGFiKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCBkYXRhLmVycm9yIHx8ICdTYXZlIGZhaWxlZCcpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIHNhdmUgY2VydGlmaWNhdGlvbicpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZU1hc3RlckNlcnRpZmljYXRpb24oaWR4LCBuYW1lKSB7XG4gIHNob3dDb25maXJtTW9kYWwoXG4gICAgJ1x1RDgzRFx1REREMVx1RkUwRiBEZWxldGUgQ2VydGlmaWNhdGlvbicsXG4gICAgYERlbGV0ZSBcIiR7bmFtZX1cIj8gVGhpcyBjYW5ub3QgYmUgdW5kb25lLmAsXG4gICAgYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL2NlcnRpZmljYXRpb24nLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgYWN0aW9uOiAnZGVsZXRlJywgaWR4IH0pLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICAgICAgX3NldE1hc3RlckNoYW5nZU5vdGljZSgnQ2VydGlmaWNhdGlvbnMnLCBkYXRhLmFjdGlvbiB8fCAnZGVsZXRlZCcpO1xuICAgICAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3MDUgRGVsZXRlZCcsIGBDZXJ0aWZpY2F0aW9uIHJlbW92ZWQuYCk7XG4gICAgICAgICAgYXdhaXQgcG9wdWxhdGVNYXN0ZXJUYWIoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgZGF0YS5lcnJvciB8fCAnRGVsZXRlIGZhaWxlZCcpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIGRlbGV0ZSBjZXJ0aWZpY2F0aW9uJyk7XG4gICAgICB9XG4gICAgfVxuICApO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgQmFja3VwIEhpc3RvcnkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIG9wZW5CYWNrdXBIaXN0b3J5TW9kYWwoKSB7XG4gIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgb3ZlcmxheS5pZCA9ICdiYWNrdXAtaGlzdG9yeS1vdmVybGF5JztcbiAgb3ZlcmxheS5zdHlsZS5jc3NUZXh0ID0gJ3Bvc2l0aW9uOmZpeGVkO2luc2V0OjA7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLDAuNSk7ei1pbmRleDoxMDAwMDtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7JztcbiAgb3ZlcmxheS5pbm5lckhUTUwgPSBgXG4gICAgPGRpdiByb2xlPVwiZGlhbG9nXCIgYXJpYS1tb2RhbD1cInRydWVcIiBhcmlhLWxhYmVsbGVkYnk9XCJiYWNrdXAtbW9kYWwtdGl0bGVcIlxuICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZmY7Ym9yZGVyLXJhZGl1czoxMHB4O3BhZGRpbmc6MjRweCAyOHB4O21heC13aWR0aDo1NjBweDt3aWR0aDo5NCU7XG4gICAgICAgICAgICAgICAgbWF4LWhlaWdodDo4MHZoO292ZXJmbG93LXk6YXV0bztib3gtc2hhZG93OjAgMjBweCA2MHB4IHJnYmEoMCwwLDAsMC4zKTtcIj5cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO21hcmdpbi1ib3R0b206MTZweDtcIj5cbiAgICAgICAgPGgzIGlkPVwiYmFja3VwLW1vZGFsLXRpdGxlXCIgc3R5bGU9XCJtYXJnaW46MDtmb250LXNpemU6MS4xZW07Y29sb3I6IzFlMjkzYjtcIj5cdUQ4M0RcdURENTAgQmFja3VwIEhpc3Rvcnk8L2gzPlxuICAgICAgICA8YnV0dG9uIGlkPVwiYmFja3VwLW1vZGFsLWNsb3NlXCIgc3R5bGU9XCJiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOm5vbmU7Zm9udC1zaXplOjEuM2VtO2N1cnNvcjpwb2ludGVyO2NvbG9yOiM2NDc0OGI7XCIgYXJpYS1sYWJlbD1cIkNsb3NlXCI+XHUyNzE1PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxwIHN0eWxlPVwiZm9udC1zaXplOjAuODhlbTtjb2xvcjojNjQ3NDhiO21hcmdpbi1ib3R0b206MTZweDtcIj5cbiAgICAgICAgQSBiYWNrdXAgaXMgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IGJlZm9yZSBldmVyeSBzYXZlLiBSZXN0b3Jpbmcgd2lsbCBwcmVzZXJ2ZSB0aGUgY3VycmVudCB2ZXJzaW9uIGFzIGEgbmV3IGJhY2t1cCBmaXJzdC5cbiAgICAgIDwvcD5cbiAgICAgIDxkaXYgaWQ9XCJiYWNrdXAtbGlzdC1ib2R5XCIgc3R5bGU9XCJmb250LXNpemU6MC45ZW07XCI+TG9hZGluZ1x1MjAyNjwvZGl2PlxuICAgIDwvZGl2PmA7XG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQob3ZlcmxheSk7XG4gIGlmICh0eXBlb2YgdHJhcEZvY3VzID09PSAnZnVuY3Rpb24nKSB0cmFwRm9jdXMoJ2JhY2t1cC1oaXN0b3J5LW92ZXJsYXknKTtcbiAgY29uc3QgY2xvc2UgPSAoKSA9PiB7IG92ZXJsYXkucmVtb3ZlKCk7IGlmICh0eXBlb2YgcmVzdG9yZUZvY3VzID09PSAnZnVuY3Rpb24nKSByZXN0b3JlRm9jdXMoKTsgfTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhY2t1cC1tb2RhbC1jbG9zZScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xvc2UpO1xuICBvdmVybGF5LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZSA9PiB7IGlmIChlLnRhcmdldCA9PT0gb3ZlcmxheSkgY2xvc2UoKTsgfSk7XG4gIG92ZXJsYXkuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGUgPT4geyBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSBjbG9zZSgpOyB9KTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL2hpc3RvcnknKTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBjb25zdCBib2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhY2t1cC1saXN0LWJvZHknKTtcbiAgICBpZiAoIWJvZHkpIHJldHVybjtcbiAgICBpZiAoIWRhdGEub2sgfHwgIWRhdGEuc25hcHNob3RzPy5sZW5ndGgpIHtcbiAgICAgIGJvZHkudGV4dENvbnRlbnQgPSAnTm8gYmFja3VwcyBmb3VuZC4nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByb3dzID0gZGF0YS5zbmFwc2hvdHMubWFwKHMgPT4ge1xuICAgICAgY29uc3QgZHQgPSBuZXcgRGF0ZShzLm10aW1lICogMTAwMCkudG9Mb2NhbGVTdHJpbmcoKTtcbiAgICAgIGNvbnN0IGtiID0gKHMuc2l6ZSAvIDEwMjQpLnRvRml4ZWQoMSk7XG4gICAgICByZXR1cm4gYDx0cj5cbiAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzo2cHggOHB4O2NvbG9yOiMxZTI5M2I7XCI+JHtlc2NhcGVIdG1sKGR0KX08L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOjZweCA4cHg7Y29sb3I6IzY0NzQ4Yjt3aGl0ZS1zcGFjZTpub3dyYXA7XCI+JHtrYn0gS0I8L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOjZweCA4cHg7XCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG4gc2Vjb25kYXJ5XCIgc3R5bGU9XCJwYWRkaW5nOjNweCAxMHB4O2ZvbnQtc2l6ZTowLjgyZW07XCJcbiAgICAgICAgICAgIG9uY2xpY2s9XCJyZXN0b3JlQmFja3VwKCR7SlNPTi5zdHJpbmdpZnkocy5maWxlbmFtZSl9KVwiPlJlc3RvcmU8L2J1dHRvbj5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvdHI+YDtcbiAgICB9KS5qb2luKCcnKTtcbiAgICBib2R5LmlubmVySFRNTCA9IGA8dGFibGUgc3R5bGU9XCJ3aWR0aDoxMDAlO2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTtcIj5cbiAgICAgIDx0aGVhZD48dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZTJlOGYwO1wiPlxuICAgICAgICA8dGggc3R5bGU9XCJwYWRkaW5nOjRweCA4cHg7dGV4dC1hbGlnbjpsZWZ0O2NvbG9yOiM0NzU1Njk7Zm9udC13ZWlnaHQ6NjAwO1wiPlNhdmVkPC90aD5cbiAgICAgICAgPHRoIHN0eWxlPVwicGFkZGluZzo0cHggOHB4O3RleHQtYWxpZ246bGVmdDtjb2xvcjojNDc1NTY5O2ZvbnQtd2VpZ2h0OjYwMDtcIj5TaXplPC90aD5cbiAgICAgICAgPHRoPjwvdGg+XG4gICAgICA8L3RyPjwvdGhlYWQ+XG4gICAgICA8dGJvZHk+JHtyb3dzfTwvdGJvZHk+XG4gICAgPC90YWJsZT5gO1xuICB9IGNhdGNoIChfKSB7XG4gICAgY29uc3QgYm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYWNrdXAtbGlzdC1ib2R5Jyk7XG4gICAgaWYgKGJvZHkpIGJvZHkudGV4dENvbnRlbnQgPSAnRmFpbGVkIHRvIGxvYWQgYmFja3VwIGhpc3RvcnkuJztcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZXN0b3JlQmFja3VwKGZpbGVuYW1lKSB7XG4gIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0ICh0eXBlb2YgY29uZmlybURpYWxvZyA9PT0gJ2Z1bmN0aW9uJ1xuICAgID8gY29uZmlybURpYWxvZygnUmVzdG9yZSB0aGlzIGJhY2t1cD8gVGhlIGN1cnJlbnQgdmVyc2lvbiB3aWxsIGJlIHNhdmVkIGFzIGEgbmV3IGJhY2t1cCBmaXJzdC4nKVxuICAgIDogUHJvbWlzZS5yZXNvbHZlKHdpbmRvdy5jb25maXJtKCdSZXN0b3JlIHRoaXMgYmFja3VwPyBUaGUgY3VycmVudCB2ZXJzaW9uIHdpbGwgYmUgc2F2ZWQgYXMgYSBuZXcgYmFja3VwIGZpcnN0LicpKSk7XG4gIGlmICghY29uZmlybWVkKSByZXR1cm47XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvcmVzdG9yZScsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGZpbGVuYW1lIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja3VwLWhpc3Rvcnktb3ZlcmxheScpPy5yZW1vdmUoKTtcbiAgICAgIGlmICh0eXBlb2YgcmVzdG9yZUZvY3VzID09PSAnZnVuY3Rpb24nKSByZXN0b3JlRm9jdXMoKTtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3MDUgUmVzdG9yZWQnLCAnTWFzdGVyIENWIHJlc3RvcmVkIGZyb20gYmFja3VwLiBSZWxvYWQgdGhlIHRhYiB0byBzZWUgdGhlIHVwZGF0ZWQgZGF0YS4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsIGRhdGEuZXJyb3IgfHwgJ1Jlc3RvcmUgZmFpbGVkLicpO1xuICAgIH1cbiAgfSBjYXRjaCAoXykge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIHJlc3RvcmUgYmFja3VwLicpO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBVbmRvIC8gUmVkbyAoR0FQLTE5IDE2LjcpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuLy8gU2luZ2xlLWxldmVsOiBVbmRvIHJlc3RvcmVzIHRoZSBtb3N0IHJlY2VudCBiYWNrdXAgc25hcHNob3QgKGkuZS4gdGhlXG4vLyBzdGF0ZSBiZWZvcmUgdGhlIGxhc3Qgc2F2ZSk7IFJlZG8gcmVzdG9yZXMgdGhlIHNhZmV0eSBiYWNrdXAgdGhlIHJlc3RvcmVcbi8vIGVuZHBvaW50IHRvb2sgb2YgdGhlIHByZS11bmRvIHN0YXRlLiBCb3RoIHJldXNlIHRoZSBleGlzdGluZ1xuLy8gL2FwaS9tYXN0ZXItZGF0YS9oaXN0b3J5ICsgL2FwaS9tYXN0ZXItZGF0YS9yZXN0b3JlIGVuZHBvaW50cyByYXRoZXIgdGhhblxuLy8gYWRkaW5nIG5ldyBiYWNrZW5kIHN1cmZhY2UgXHUyMDE0IHNlZSBfbWFzdGVyQ3ZSZWRvQmFja3VwIGFib3ZlIGZvciB0aGUgcmVzZXRcbi8vIGNvbnRyYWN0IHdpdGggcG9wdWxhdGVNYXN0ZXJUYWIoKS5cblxuYXN5bmMgZnVuY3Rpb24gdW5kb01hc3RlckRhdGFDaGFuZ2UoKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvaGlzdG9yeScpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmICghZGF0YS5vayB8fCAhZGF0YS5zbmFwc2hvdHM/Lmxlbmd0aCkge1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjEzOVx1RkUwRiBOb3RoaW5nIHRvIHVuZG8nLCAnTm8gYmFja3VwIHNuYXBzaG90cyBhcmUgYXZhaWxhYmxlIHlldC4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbW9zdFJlY2VudCA9IGRhdGEuc25hcHNob3RzWzBdOyAvLyBoaXN0b3J5IHJvdXRlIHJldHVybnMgbmV3ZXN0LWZpcnN0XG4gICAgY29uc3Qgd2hlbiA9IG5ldyBEYXRlKG1vc3RSZWNlbnQubXRpbWUgKiAxMDAwKS50b0xvY2FsZVN0cmluZygpO1xuICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0ICh0eXBlb2YgY29uZmlybURpYWxvZyA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgPyBjb25maXJtRGlhbG9nKGBVbmRvIHRoZSBtb3N0IHJlY2VudCBjaGFuZ2U/IFRoaXMgcmVzdG9yZXMgdGhlIHZlcnNpb24gc2F2ZWQgJHt3aGVufS4gVGhlIGN1cnJlbnQgdmVyc2lvbiB3aWxsIGJlIHNhdmVkIGFzIGEgbmV3IGJhY2t1cCBmaXJzdC5gKVxuICAgICAgOiBQcm9taXNlLnJlc29sdmUod2luZG93LmNvbmZpcm0oYFVuZG8gdGhlIG1vc3QgcmVjZW50IGNoYW5nZT8gVGhpcyByZXN0b3JlcyB0aGUgdmVyc2lvbiBzYXZlZCAke3doZW59LmApKSk7XG4gICAgaWYgKCFjb25maXJtZWQpIHJldHVybjtcblxuICAgIGNvbnN0IHJlc3RvcmVSZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS9yZXN0b3JlJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgZmlsZW5hbWU6IG1vc3RSZWNlbnQuZmlsZW5hbWUgfSksXG4gICAgfSk7XG4gICAgY29uc3QgcmVzdG9yZURhdGEgPSBhd2FpdCByZXN0b3JlUmVzLmpzb24oKTtcbiAgICBpZiAocmVzdG9yZURhdGEub2spIHtcbiAgICAgIC8vIE11c3QgYmUgc2V0ICpiZWZvcmUqIHBvcHVsYXRlTWFzdGVyVGFiKCkgcmVuZGVycyB0aGUgUmVkbyBidXR0b24sXG4gICAgICAvLyBub3QgYWZ0ZXIgXHUyMDE0IHRoZSBidXR0b24ncyBkaXNhYmxlZCBzdGF0ZSBpcyBiYWtlZCBpbnRvIHRoYXQgcmVuZGVyLlxuICAgICAgX21hc3RlckN2UmVkb0JhY2t1cCA9IHJlc3RvcmVEYXRhLnNhZmV0eV9iYWNrdXAgfHwgbnVsbDtcbiAgICAgIF9tYXN0ZXJDdlN1cHByZXNzUmVkb1Jlc2V0ID0gdHJ1ZTtcbiAgICAgIGF3YWl0IHBvcHVsYXRlTWFzdGVyVGFiKCk7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzA1IFVuZG9uZScsICdNYXN0ZXIgQ1YgcmV2ZXJ0ZWQgdG8gdGhlIHByZXZpb3VzIHNhdmVkIHZlcnNpb24uJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCByZXN0b3JlRGF0YS5lcnJvciB8fCAnVW5kbyBmYWlsZWQuJyk7XG4gICAgfVxuICB9IGNhdGNoIChfKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsICdGYWlsZWQgdG8gdW5kby4nKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZWRvTWFzdGVyRGF0YUNoYW5nZSgpIHtcbiAgaWYgKCFfbWFzdGVyQ3ZSZWRvQmFja3VwKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjEzOVx1RkUwRiBOb3RoaW5nIHRvIHJlZG8nLCAnVGhlcmUgaXMgbm8gdW5kb25lIGNoYW5nZSB0byByZXN0b3JlLicpO1xuICAgIHJldHVybjtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL3Jlc3RvcmUnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBmaWxlbmFtZTogX21hc3RlckN2UmVkb0JhY2t1cCB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgLy8gRGVsaWJlcmF0ZWx5IGRvIG5vdCByZS1hcm0gcmVkbyBcdTIwMTQgdGhpcyByZXN0b3JlIGNvbnN1bWVzIHRoZSByZWRvXG4gICAgICAvLyB0YXJnZXQsIGFuZCBwb3B1bGF0ZU1hc3RlclRhYigpJ3MgZGVmYXVsdCByZXNldCBjbGVhcnMgaXQuXG4gICAgICBhd2FpdCBwb3B1bGF0ZU1hc3RlclRhYigpO1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjcwNSBSZWRvbmUnLCAnTWFzdGVyIENWIHJlc3RvcmVkIHRvIHRoZSB2ZXJzaW9uIGJlZm9yZSB0aGUgdW5kby4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsIGRhdGEuZXJyb3IgfHwgJ1JlZG8gZmFpbGVkLicpO1xuICAgIH1cbiAgfSBjYXRjaCAoXykge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIHJlZG8uJyk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZXhwb3J0TWFzdGVyQ1YoKSB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2Vzc2lvbklkID0gd2luZG93Ll9jdXJyZW50U2Vzc2lvbklkO1xuICAgIGNvbnN0IHVybCA9IGAvYXBpL21hc3Rlci1kYXRhL2V4cG9ydCR7c2Vzc2lvbklkID8gYD9zZXNzaW9uX2lkPSR7c2Vzc2lvbklkfWAgOiAnJ31gO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgaWYgKCFyZXMub2spIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRXhwb3J0IGZhaWxlZCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBibG9iID0gYXdhaXQgcmVzLmJsb2IoKTtcbiAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgIGEuaHJlZiA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgYS5kb3dubG9hZCA9ICdNYXN0ZXJfQ1ZfRGF0YS5qc29uJztcbiAgICBhLmNsaWNrKCk7XG4gICAgVVJMLnJldm9rZU9iamVjdFVSTChhLmhyZWYpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsICdGYWlsZWQgdG8gZXhwb3J0IG1hc3RlciBDVicpO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBGdWxsIGRhdGEgcHJldmlldyAoR0FQLTE5IDE2LjE1KSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gb3BlbkZ1bGxEYXRhUHJldmlld01vZGFsKCkge1xuICBjb25zdCBvdmVybGF5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIG92ZXJsYXkuaWQgPSAnbWFzdGVyLWN2LXByZXZpZXctb3ZlcmxheSc7XG4gIG92ZXJsYXkuc3R5bGUuY3NzVGV4dCA9ICdwb3NpdGlvbjpmaXhlZDtpbnNldDowO2JhY2tncm91bmQ6cmdiYSgwLDAsMCwwLjUpO3otaW5kZXg6MTAwMDA7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyOyc7XG4gIG92ZXJsYXkuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgcm9sZT1cImRpYWxvZ1wiIGFyaWEtbW9kYWw9XCJ0cnVlXCIgYXJpYS1sYWJlbGxlZGJ5PVwibWFzdGVyLWN2LXByZXZpZXctdGl0bGVcIlxuICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZmY7Ym9yZGVyLXJhZGl1czoxMHB4O3BhZGRpbmc6MjRweCAyOHB4O21heC13aWR0aDo3NjBweDt3aWR0aDo5NCU7XG4gICAgICAgICAgICAgICAgbWF4LWhlaWdodDo4NXZoO292ZXJmbG93LXk6YXV0bztib3gtc2hhZG93OjAgMjBweCA2MHB4IHJnYmEoMCwwLDAsMC4zKTtcIj5cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO21hcmdpbi1ib3R0b206MTZweDtcIj5cbiAgICAgICAgPGgzIGlkPVwibWFzdGVyLWN2LXByZXZpZXctdGl0bGVcIiBzdHlsZT1cIm1hcmdpbjowO2ZvbnQtc2l6ZToxLjFlbTtjb2xvcjojMWUyOTNiO1wiPlx1RDgzRFx1REM0MSBGdWxsIE1hc3RlciBDViBEYXRhIChyZWFkLW9ubHkpPC9oMz5cbiAgICAgICAgPGJ1dHRvbiBpZD1cIm1hc3Rlci1jdi1wcmV2aWV3LWNsb3NlXCIgc3R5bGU9XCJiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOm5vbmU7Zm9udC1zaXplOjEuM2VtO2N1cnNvcjpwb2ludGVyO2NvbG9yOiM2NDc0OGI7XCIgYXJpYS1sYWJlbD1cIkNsb3NlXCI+XHUyNzE1PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxwIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtjb2xvcjojNjQ3NDhiO21hcmdpbi1ib3R0b206MTJweDtcIj5cbiAgICAgICAgVGhlIGNvbXBsZXRlLCB1bmZpbHRlcmVkIGNvbnRlbnRzIG9mIDxjb2RlPk1hc3Rlcl9DVl9EYXRhLmpzb248L2NvZGU+IFx1MjAxNCBpbmNsdWRpbmcgYW55IGZpZWxkcyB0aGUgc3RydWN0dXJlZCBlZGl0b3JzIGFib3ZlIGRvbid0IHN1cmZhY2UuXG4gICAgICA8L3A+XG4gICAgICA8cHJlIGlkPVwibWFzdGVyLWN2LXByZXZpZXctYm9keVwiIHN0eWxlPVwiYmFja2dyb3VuZDojZjhmYWZjO2JvcmRlcjoxcHggc29saWQgI2UyZThmMDtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjEycHg7Zm9udC1zaXplOjAuOGVtO2xpbmUtaGVpZ2h0OjEuNTt3aGl0ZS1zcGFjZTpwcmUtd3JhcDt3b3JkLWJyZWFrOmJyZWFrLXdvcmQ7XCI+TG9hZGluZ1x1MjAyNjwvcHJlPlxuICAgIDwvZGl2PmA7XG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQob3ZlcmxheSk7XG4gIGlmICh0eXBlb2YgdHJhcEZvY3VzID09PSAnZnVuY3Rpb24nKSB0cmFwRm9jdXMoJ21hc3Rlci1jdi1wcmV2aWV3LW92ZXJsYXknKTtcbiAgY29uc3QgY2xvc2UgPSAoKSA9PiB7IG92ZXJsYXkucmVtb3ZlKCk7IGlmICh0eXBlb2YgcmVzdG9yZUZvY3VzID09PSAnZnVuY3Rpb24nKSByZXN0b3JlRm9jdXMoKTsgfTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1jdi1wcmV2aWV3LWNsb3NlJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjbG9zZSk7XG4gIG92ZXJsYXkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4geyBpZiAoZS50YXJnZXQgPT09IG92ZXJsYXkpIGNsb3NlKCk7IH0pO1xuICBvdmVybGF5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4geyBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSBjbG9zZSgpOyB9KTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL2Z1bGwnKTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBjb25zdCBib2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1jdi1wcmV2aWV3LWJvZHknKTtcbiAgICBpZiAoYm9keSkgYm9keS50ZXh0Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsIDIpO1xuICB9IGNhdGNoIChfKSB7XG4gICAgY29uc3QgYm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItY3YtcHJldmlldy1ib2R5Jyk7XG4gICAgaWYgKGJvZHkpIGJvZHkudGV4dENvbnRlbnQgPSAnRmFpbGVkIHRvIGxvYWQgbWFzdGVyIENWIGRhdGEuJztcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgRnVsbC1maWxlIEpTT04gaW1wb3J0IHdpdGggZGlmZiByZXZpZXcgKEdBUC0xOSAxNi4xNikgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4vL1xuLy8gTm90IGEgbWVyZ2U6IGltcG9ydC1jb25maXJtIHJlcGxhY2VzIHRoZSBlbnRpcmUgZmlsZS4gVGhlIGltcG9ydC1wcmV2aWV3XG4vLyBzdGVwJ3Mgc2VjdGlvbi1sZXZlbCBjaGFuZ2VkL2NvdW50IHN1bW1hcnkgaXMgdGhlIHVzZXIncyBjaGFuY2UgdG8gY2F0Y2hcbi8vIGFuIHVuaW50ZW5kZWQgb3ZlcndyaXRlIGJlZm9yZSBjb25maXJtaW5nIFx1MjAxNCBmdWxsIGZpZWxkLWxldmVsIGRpZmZpbmdcbi8vIHdpdGhpbiBhIGNoYW5nZWQgc2VjdGlvbiBpcyBhIGtub3duIHYxIGxpbWl0YXRpb24gKHRoZSBzYW1lIHBvc3R1cmVcbi8vIGFscmVhZHkgYWNjZXB0ZWQgZm9yIG90aGVyIGFkdmlzb3J5LW9ubHkgcmV2aWV3IHN1cmZhY2VzIGluIHRoaXMgdGFiKS5cblxubGV0IF9tYXN0ZXJDdkltcG9ydERhdGEgPSBudWxsO1xuXG5mdW5jdGlvbiB0cmlnZ2VyTWFzdGVyQ3ZJbXBvcnQoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItY3YtaW1wb3J0LWZpbGUtaW5wdXQnKT8uY2xpY2soKTtcbn1cblxuZnVuY3Rpb24gaGFuZGxlTWFzdGVyQ3ZJbXBvcnRGaWxlKGV2ZW50KSB7XG4gIGNvbnN0IGZpbGUgPSBldmVudC50YXJnZXQ/LmZpbGVzPy5bMF07XG4gIGV2ZW50LnRhcmdldC52YWx1ZSA9ICcnOyAvLyBhbGxvdyByZS1zZWxlY3RpbmcgdGhlIHNhbWUgZmlsZW5hbWUgbGF0ZXJcbiAgaWYgKCFmaWxlKSByZXR1cm47XG4gIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gIHJlYWRlci5vbmxvYWQgPSBhc3luYyAoKSA9PiB7XG4gICAgbGV0IHBhcnNlZDtcbiAgICB0cnkge1xuICAgICAgcGFyc2VkID0gSlNPTi5wYXJzZShTdHJpbmcocmVhZGVyLnJlc3VsdCkpO1xuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnVGhhdCBmaWxlIGlzIG5vdCB2YWxpZCBKU09OLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXBhcnNlZCB8fCB0eXBlb2YgcGFyc2VkICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHBhcnNlZCkpIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRXhwZWN0ZWQgYSBKU09OIG9iamVjdCAoTWFzdGVyX0NWX0RhdGEuanNvbiBzaGFwZSksIG5vdCBhbiBhcnJheSBvciBzY2FsYXIuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IF9zdWJtaXRNYXN0ZXJDdkltcG9ydFByZXZpZXcocGFyc2VkKTtcbiAgfTtcbiAgcmVhZGVyLm9uZXJyb3IgPSAoKSA9PiBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgJ0ZhaWxlZCB0byByZWFkIHRoZSBzZWxlY3RlZCBmaWxlLicpO1xuICByZWFkZXIucmVhZEFzVGV4dChmaWxlKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gX3N1Ym1pdE1hc3RlckN2SW1wb3J0UHJldmlldyhwYXJzZWQpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS9pbXBvcnQtcHJldmlldycsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgZGF0YTogcGFyc2VkIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmICghZGF0YS5vaykge1xuICAgICAgY29uc3QgZGV0YWlsID0gKGRhdGEudmFsaWRhdGlvbl9lcnJvcnMgfHwgW10pLmpvaW4oJzsgJyk7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgZGV0YWlsID8gYCR7ZGF0YS5lcnJvcn06ICR7ZGV0YWlsfWAgOiAoZGF0YS5lcnJvciB8fCAnSW1wb3J0IHByZXZpZXcgZmFpbGVkLicpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgX21hc3RlckN2SW1wb3J0RGF0YSA9IHBhcnNlZDtcbiAgICBfc2hvd01hc3RlckN2SW1wb3J0UHJldmlld01vZGFsKGRhdGEuc2VjdGlvbnMgfHwgW10pO1xuICB9IGNhdGNoIChfKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsICdGYWlsZWQgdG8gcHJldmlldyB0aGUgaW1wb3J0LicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9zaG93TWFzdGVyQ3ZJbXBvcnRQcmV2aWV3TW9kYWwoc2VjdGlvbnMpIHtcbiAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBvdmVybGF5LmlkID0gJ21hc3Rlci1jdi1pbXBvcnQtb3ZlcmxheSc7XG4gIG92ZXJsYXkuc3R5bGUuY3NzVGV4dCA9ICdwb3NpdGlvbjpmaXhlZDtpbnNldDowO2JhY2tncm91bmQ6cmdiYSgwLDAsMCwwLjUpO3otaW5kZXg6MTAwMDA7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyOyc7XG4gIGNvbnN0IGNoYW5nZWRTZWN0aW9ucyA9IHNlY3Rpb25zLmZpbHRlcigocykgPT4gcy5jaGFuZ2VkKTtcbiAgY29uc3Qgcm93cyA9IHNlY3Rpb25zLm1hcCgocykgPT4gYFxuICAgIDx0ciBzdHlsZT1cIiR7cy5jaGFuZ2VkID8gJ2JhY2tncm91bmQ6dmFyKC0tY3Ytd2FybmluZy1iZywgI2ZmZmJlYik7JyA6ICcnfVwiPlxuICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzo2cHggOHB4O2NvbG9yOiMxZTI5M2I7XCI+JHtlc2NhcGVIdG1sKHMuc2VjdGlvbil9PC90ZD5cbiAgICAgIDx0ZCBzdHlsZT1cInBhZGRpbmc6NnB4IDhweDt0ZXh0LWFsaWduOmNlbnRlcjtjb2xvcjojNjQ3NDhiO1wiPiR7cy5jdXJyZW50X2NvdW50fTwvdGQ+XG4gICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOjZweCA4cHg7dGV4dC1hbGlnbjpjZW50ZXI7Y29sb3I6IzY0NzQ4YjtcIj4ke3MubmV3X2NvdW50fTwvdGQ+XG4gICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOjZweCA4cHg7XCI+JHtzLmNoYW5nZWQgPyAnXHUyNkEwIGNoYW5nZWQnIDogJ1x1MjAxNCd9PC90ZD5cbiAgICA8L3RyPmApLmpvaW4oJycpO1xuICBvdmVybGF5LmlubmVySFRNTCA9IGBcbiAgICA8ZGl2IHJvbGU9XCJkaWFsb2dcIiBhcmlhLW1vZGFsPVwidHJ1ZVwiIGFyaWEtbGFiZWxsZWRieT1cIm1hc3Rlci1jdi1pbXBvcnQtdGl0bGVcIlxuICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZmY7Ym9yZGVyLXJhZGl1czoxMHB4O3BhZGRpbmc6MjRweCAyOHB4O21heC13aWR0aDo2NDBweDt3aWR0aDo5NCU7XG4gICAgICAgICAgICAgICAgbWF4LWhlaWdodDo4NXZoO292ZXJmbG93LXk6YXV0bztib3gtc2hhZG93OjAgMjBweCA2MHB4IHJnYmEoMCwwLDAsMC4zKTtcIj5cbiAgICAgIDxoMyBpZD1cIm1hc3Rlci1jdi1pbXBvcnQtdGl0bGVcIiBzdHlsZT1cIm1hcmdpbjowIDAgMTJweDtmb250LXNpemU6MS4xZW07Y29sb3I6IzFlMjkzYjtcIj5cdTJCMDZcdUZFMEYgSW1wb3J0IE1hc3RlciBDViBEYXRhIFx1MjAxNCBSZXZpZXc8L2gzPlxuICAgICAgPGRpdiByb2xlPVwiYWxlcnRcIiBzdHlsZT1cImJhY2tncm91bmQ6I2ZlZjJmMjtib3JkZXI6MXB4IHNvbGlkICNmY2E1YTU7Ym9yZGVyLXJhZGl1czo2cHg7cGFkZGluZzoxMHB4IDE0cHg7bWFyZ2luLWJvdHRvbToxNHB4O2ZvbnQtc2l6ZTowLjg2ZW07Y29sb3I6Izk5MWIxYjtcIj5cbiAgICAgICAgPHN0cm9uZz5UaGlzIHJlcGxhY2VzIHRoZSBlbnRpcmUgZmlsZTwvc3Ryb25nPiwgbm90IGp1c3QgdGhlIGNoYW5nZWQgc2VjdGlvbnMuIEEgYmFja3VwIGlzIGNyZWF0ZWRcbiAgICAgICAgYXV0b21hdGljYWxseSBiZWZvcmUgdGhlIHdyaXRlIFx1MjAxNCBzZWUgXHVEODNEXHVERDUwIEJhY2t1cHMgYWJvdmUgdG8gcmVzdG9yZSBpdCBpZiBuZWVkZWQuXG4gICAgICA8L2Rpdj5cbiAgICAgIDxwIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtjb2xvcjojNjQ3NDhiO21hcmdpbi1ib3R0b206OHB4O1wiPlxuICAgICAgICAke2NoYW5nZWRTZWN0aW9ucy5sZW5ndGggPyBgJHtjaGFuZ2VkU2VjdGlvbnMubGVuZ3RofSBzZWN0aW9uKHMpIHdvdWxkIGNoYW5nZTpgIDogJ05vIHNlY3Rpb25zIHdvdWxkIGNoYW5nZSBcdTIwMTQgdGhlIHVwbG9hZGVkIGZpbGUgbWF0Y2hlcyB0aGUgY3VycmVudCBkYXRhLid9XG4gICAgICA8L3A+XG4gICAgICA8dGFibGUgc3R5bGU9XCJ3aWR0aDoxMDAlO2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTtmb250LXNpemU6MC44NWVtO21hcmdpbi1ib3R0b206MTZweDtcIj5cbiAgICAgICAgPHRoZWFkPjx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206MXB4IHNvbGlkICNlMmU4ZjA7XCI+XG4gICAgICAgICAgPHRoIHN0eWxlPVwicGFkZGluZzo0cHggOHB4O3RleHQtYWxpZ246bGVmdDtjb2xvcjojNDc1NTY5O1wiPlNlY3Rpb248L3RoPlxuICAgICAgICAgIDx0aCBzdHlsZT1cInBhZGRpbmc6NHB4IDhweDtjb2xvcjojNDc1NTY5O1wiPkN1cnJlbnQ8L3RoPlxuICAgICAgICAgIDx0aCBzdHlsZT1cInBhZGRpbmc6NHB4IDhweDtjb2xvcjojNDc1NTY5O1wiPk5ldzwvdGg+XG4gICAgICAgICAgPHRoIHN0eWxlPVwicGFkZGluZzo0cHggOHB4O3RleHQtYWxpZ246bGVmdDtjb2xvcjojNDc1NTY5O1wiPjwvdGg+XG4gICAgICAgIDwvdHI+PC90aGVhZD5cbiAgICAgICAgPHRib2R5PiR7cm93c308L3Rib2R5PlxuICAgICAgPC90YWJsZT5cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kO2dhcDo4cHg7XCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgaWQ9XCJtYXN0ZXItY3YtaW1wb3J0LWNhbmNlbFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBwcmltYXJ5XCIgaWQ9XCJtYXN0ZXItY3YtaW1wb3J0LWNvbmZpcm1cIiR7Y2hhbmdlZFNlY3Rpb25zLmxlbmd0aCA/ICcnIDogJyBkaXNhYmxlZCd9PkNvbmZpcm0gSW1wb3J0PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG92ZXJsYXkpO1xuICBpZiAodHlwZW9mIHRyYXBGb2N1cyA9PT0gJ2Z1bmN0aW9uJykgdHJhcEZvY3VzKCdtYXN0ZXItY3YtaW1wb3J0LW92ZXJsYXknKTtcbiAgY29uc3QgY2xvc2UgPSAoKSA9PiB7IG92ZXJsYXkucmVtb3ZlKCk7IF9tYXN0ZXJDdkltcG9ydERhdGEgPSBudWxsOyBpZiAodHlwZW9mIHJlc3RvcmVGb2N1cyA9PT0gJ2Z1bmN0aW9uJykgcmVzdG9yZUZvY3VzKCk7IH07XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItY3YtaW1wb3J0LWNhbmNlbCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xvc2UpO1xuICBvdmVybGF5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4geyBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSBjbG9zZSgpOyB9KTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1jdi1pbXBvcnQtY29uZmlybScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gY29uZmlybU1hc3RlckN2SW1wb3J0KCkpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb25maXJtTWFzdGVyQ3ZJbXBvcnQoKSB7XG4gIGlmICghX21hc3RlckN2SW1wb3J0RGF0YSkgcmV0dXJuO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL2ltcG9ydC1jb25maXJtJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBkYXRhOiBfbWFzdGVyQ3ZJbXBvcnREYXRhIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItY3YtaW1wb3J0LW92ZXJsYXknKT8ucmVtb3ZlKCk7XG4gICAgX21hc3RlckN2SW1wb3J0RGF0YSA9IG51bGw7XG4gICAgaWYgKHR5cGVvZiByZXN0b3JlRm9jdXMgPT09ICdmdW5jdGlvbicpIHJlc3RvcmVGb2N1cygpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBfc2V0TWFzdGVyQ2hhbmdlTm90aWNlKCdNYXN0ZXIgQ1YgRGF0YScsICdpbXBvcnRlZCcpO1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoXG4gICAgICAgICdcdTI3MDUgSW1wb3J0ZWQnLFxuICAgICAgICBgTWFzdGVyIENWIGRhdGEgcmVwbGFjZWQuJHtkYXRhLmNvbW1pdF9oYXNoID8gYCBDb21taXQ6ICR7ZGF0YS5jb21taXRfaGFzaC5zbGljZSgwLCAxMCl9LmAgOiAnJ30ke2RhdGEuZ2l0X2Vycm9yID8gYCAoZ2l0IHdhcm5pbmc6ICR7ZGF0YS5naXRfZXJyb3J9KWAgOiAnJ31gXG4gICAgICApO1xuICAgICAgYXdhaXQgcG9wdWxhdGVNYXN0ZXJUYWIoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZGV0YWlsID0gKGRhdGEudmFsaWRhdGlvbl9lcnJvcnMgfHwgW10pLmpvaW4oJzsgJyk7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgZGV0YWlsID8gYCR7ZGF0YS5lcnJvcn06ICR7ZGV0YWlsfWAgOiAoZGF0YS5lcnJvciB8fCAnSW1wb3J0IGZhaWxlZC4nKSk7XG4gICAgfVxuICB9IGNhdGNoIChfKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsICdGYWlsZWQgdG8gaW1wb3J0IG1hc3RlciBDViBkYXRhLicpO1xuICB9XG59XG5cbi8vIC0tLS0gQWNoaWV2ZW1lbnQvU3VtbWFyeSBkZWxldGUgaGFuZGxlcnMgLS0tLVxuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVNYXN0ZXJBY2hpZXZlbWVudChpZCwgdGl0bGUpIHtcbiAgc2hvd0NvbmZpcm1Nb2RhbChcbiAgICAnXHVEODNEXHVEREQxXHVGRTBGIERlbGV0ZSBBY2hpZXZlbWVudCcsXG4gICAgYERlbGV0ZSBcIiR7dGl0bGV9XCI/IFRoaXMgY2Fubm90IGJlIHVuZG9uZS5gLFxuICAgIGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS91cGRhdGUtYWNoaWV2ZW1lbnQnLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgYWN0aW9uOiAnZGVsZXRlJywgaWQgfSksXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgaWYgKGRhdGEub2spIHtcbiAgICAgICAgICBfc2V0TWFzdGVyQ2hhbmdlTm90aWNlKCdTZWxlY3RlZCBBY2hpZXZlbWVudHMnLCBkYXRhLmFjdGlvbiB8fCAnZGVsZXRlZCcpO1xuICAgICAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3MDUgRGVsZXRlZCcsIGBBY2hpZXZlbWVudCByZW1vdmVkLmApO1xuICAgICAgICAgIGF3YWl0IHBvcHVsYXRlTWFzdGVyVGFiKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsIGRhdGEuZXJyb3IgfHwgJ0RlbGV0ZSBmYWlsZWQnKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgJ0ZhaWxlZCB0byBkZWxldGUgYWNoaWV2ZW1lbnQnKTtcbiAgICAgIH1cbiAgICB9XG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZU1hc3RlclN1bW1hcnkoa2V5KSB7XG4gIHNob3dDb25maXJtTW9kYWwoXG4gICAgJ1x1RDgzRFx1REREMVx1RkUwRiBEZWxldGUgU3VtbWFyeScsXG4gICAgYERlbGV0ZSBzdW1tYXJ5IHZhcmlhbnQgXCIke2tleX1cIj8gVGhpcyBjYW5ub3QgYmUgdW5kb25lLmAsXG4gICAgYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL3VwZGF0ZS1zdW1tYXJ5Jywge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGFjdGlvbjogJ2RlbGV0ZScsIGtleSB9KSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICBpZiAoZGF0YS5vaykge1xuICAgICAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ1Byb2Zlc3Npb25hbCBTdW1tYXJpZXMnLCBkYXRhLmFjdGlvbiB8fCAnZGVsZXRlZCcpO1xuICAgICAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3MDUgRGVsZXRlZCcsIGBTdW1tYXJ5IFwiJHtrZXl9XCIgcmVtb3ZlZC5gKTtcbiAgICAgICAgICBhd2FpdCBwb3B1bGF0ZU1hc3RlclRhYigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCBkYXRhLmVycm9yIHx8ICdEZWxldGUgZmFpbGVkJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsICdGYWlsZWQgdG8gZGVsZXRlIHN1bW1hcnknKTtcbiAgICAgIH1cbiAgICB9XG4gICk7XG59XG5cbmZ1bmN0aW9uIG9wZW5NYXN0ZXJDdk1vZGFsKCkge1xuICBjb25zdCBvdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1jdi1tb2RhbC1vdmVybGF5Jyk7XG4gIGlmICghb3ZlcmxheSkgcmV0dXJuO1xuICBfZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWN2LW1vZGFsLWJvZHknKTtcbiAgcG9wdWxhdGVNYXN0ZXJUYWIoY29udGFpbmVyKTtcbiAgc2V0SW5pdGlhbEZvY3VzKCdtYXN0ZXItY3YtbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ21hc3Rlci1jdi1tb2RhbC1vdmVybGF5Jyk7XG59XG5cbmZ1bmN0aW9uIGNsb3NlTWFzdGVyQ3ZNb2RhbCgpIHtcbiAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItY3YtbW9kYWwtb3ZlcmxheScpO1xuICBpZiAob3ZlcmxheSkgb3ZlcmxheS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBfbWFzdGVyQ3ZBY3RpdmVDb250YWluZXIgPSBudWxsO1xuICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJyc7XG4gIHJlc3RvcmVGb2N1cygpO1xufVxuXG5leHBvcnQge1xuICBwb3B1bGF0ZU1hc3RlclRhYixcbiAgb3Blbk1hc3RlckN2TW9kYWwsXG4gIGNsb3NlTWFzdGVyQ3ZNb2RhbCxcbiAgX3JlbmRlclBlcnNvbmFsSW5mb0NhcmQsXG4gIF9yZW5kZXJFeHBlcmllbmNlc0xpc3QsXG4gIF9yZW5kZXJTa2lsbHNTZWN0aW9uLFxuICBfcmVuZGVyRWR1Y2F0aW9uTGlzdCxcbiAgX3JlbmRlckF3YXJkc0xpc3QsXG4gIF9yZW5kZXJDZXJ0aWZpY2F0aW9uc0xpc3QsXG4gIF9yZW5kZXJNYXN0ZXJBY2hpZXZlbWVudHNUYWJsZSxcbiAgX3JlbmRlclN1bW1hcmllc0xpc3QsXG4gIHNob3dBZGRBY2hpZXZlbWVudE1vZGFsLFxuICBlZGl0TWFzdGVyQWNoaWV2ZW1lbnQsXG4gIGNsb3NlTWFzdGVyQWNoTW9kYWwsXG4gIHNhdmVNYXN0ZXJBY2hpZXZlbWVudCxcbiAgc2hvd0FkZFN1bW1hcnlNb2RhbCxcbiAgZWRpdE1hc3RlclN1bW1hcnksXG4gIGNsb3NlTWFzdGVyU3VtTW9kYWwsXG4gIHNhdmVNYXN0ZXJTdW1tYXJ5LFxuICBzaG93RWRpdFBlcnNvbmFsSW5mb01vZGFsLFxuICBjbG9zZVBlcnNvbmFsSW5mb01vZGFsLFxuICBzYXZlUGVyc29uYWxJbmZvLFxuICBzaG93QWRkRXhwZXJpZW5jZU1vZGFsLFxuICBlZGl0TWFzdGVyRXhwZXJpZW5jZSxcbiAgY2xvc2VFeHBlcmllbmNlTW9kYWwsXG4gIHNhdmVNYXN0ZXJFeHBlcmllbmNlLFxuICBkZWxldGVNYXN0ZXJFeHBlcmllbmNlLFxuICBfYWRkRXhwQWNoaWV2ZW1lbnQsXG4gIF9tb3ZlRXhwQWNoaWV2ZW1lbnQsXG4gIF9kZWxldGVFeHBBY2hpZXZlbWVudCxcbiAgc2hvd0FkZFNraWxsTW9kYWwsXG4gIGVkaXRNYXN0ZXJTa2lsbCxcbiAgY2xvc2VTa2lsbE1vZGFsLFxuICBzYXZlTWFzdGVyU2tpbGwsXG4gIGRlbGV0ZU1hc3RlclNraWxsLFxuICBzaG93QWRkRWR1Y2F0aW9uTW9kYWwsXG4gIGVkaXRNYXN0ZXJFZHVjYXRpb24sXG4gIGNsb3NlRWR1Y2F0aW9uTW9kYWwsXG4gIHNhdmVNYXN0ZXJFZHVjYXRpb24sXG4gIGRlbGV0ZU1hc3RlckVkdWNhdGlvbixcbiAgc2hvd0FkZEF3YXJkTW9kYWwsXG4gIGVkaXRNYXN0ZXJBd2FyZCxcbiAgY2xvc2VBd2FyZE1vZGFsLFxuICBzYXZlTWFzdGVyQXdhcmQsXG4gIGRlbGV0ZU1hc3RlckF3YXJkLFxuICBzaG93QWRkQ2VydGlmaWNhdGlvbk1vZGFsLFxuICBlZGl0TWFzdGVyQ2VydGlmaWNhdGlvbixcbiAgY2xvc2VDZXJ0aWZpY2F0aW9uTW9kYWwsXG4gIHNhdmVNYXN0ZXJDZXJ0aWZpY2F0aW9uLFxuICBkZWxldGVNYXN0ZXJDZXJ0aWZpY2F0aW9uLFxuICBleHBvcnRNYXN0ZXJDVixcbiAgb3BlbkJhY2t1cEhpc3RvcnlNb2RhbCxcbiAgcmVzdG9yZUJhY2t1cCxcbiAgdW5kb01hc3RlckRhdGFDaGFuZ2UsXG4gIHJlZG9NYXN0ZXJEYXRhQ2hhbmdlLFxuICBvcGVuRnVsbERhdGFQcmV2aWV3TW9kYWwsXG4gIHRyaWdnZXJNYXN0ZXJDdkltcG9ydCxcbiAgaGFuZGxlTWFzdGVyQ3ZJbXBvcnRGaWxlLFxuICBjb25maXJtTWFzdGVyQ3ZJbXBvcnQsXG4gIGRlbGV0ZU1hc3RlckFjaGlldmVtZW50LFxuICBkZWxldGVNYXN0ZXJTdW1tYXJ5LFxuICBsb2FkUHVibGljYXRpb25zLFxuICBsb2FkUHVibGljYXRpb25zQmliLFxuICB0b2dnbGVQdWJsaWNhdGlvbnNWaWV3LFxuICBzZXRQdWJsaWNhdGlvblNvcnRNb2RlLFxuICBzZXRQdWJsaWNhdGlvbkdyb3VwTW9kZSxcbiAgdmFsaWRhdGVQdWJsaWNhdGlvbnNCaWIsXG4gIHNhdmVQdWJsaWNhdGlvbnNCaWIsXG4gIHNob3dJbXBvcnRQdWJsaWNhdGlvbnNNb2RhbCxcbiAgY2xvc2VJbXBvcnRQdWJsaWNhdGlvbnNNb2RhbCxcbiAgaW1wb3J0UHVibGljYXRpb25zQmliLFxuICBzaG93Q29udmVydFB1YmxpY2F0aW9uc01vZGFsLFxuICBjbG9zZUNvbnZlcnRQdWJsaWNhdGlvbnNNb2RhbCxcbiAgY29udmVydFB1YmxpY2F0aW9uVGV4dCxcbiAgaW1wb3J0Q29udmVydGVkUHVibGljYXRpb25UZXh0LFxuICBzaG93QWRkUHVibGljYXRpb25Nb2RhbCxcbiAgZWRpdE1hc3RlclB1YmxpY2F0aW9uLFxuICBjbG9zZVB1YmxpY2F0aW9uTW9kYWwsXG4gIHNhdmVNYXN0ZXJQdWJsaWNhdGlvbixcbiAgZGVsZXRlTWFzdGVyUHVibGljYXRpb24sXG59O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvY292ZXItbGV0dGVyLmpzXG4gKiBDb3ZlciBsZXR0ZXIgdGFiOiBnZW5lcmF0ZSwgc2F2ZSwgdmFsaWRhdGUsIGNvbnNpc3RlbmN5IHJlcG9ydC5cbiAqXG4gKiBEZXBlbmRlbmNpZXMgKHJlc29sdmVkIHRocm91Z2ggZ2xvYmFsVGhpcyBhdCBydW50aW1lKTpcbiAqICAgZXNjYXBlSHRtbCwgc2hvd0FsZXJ0TW9kYWwsIHRhYkRhdGEsIHBlbmRpbmdSZWNvbW1lbmRhdGlvbnMsIENTU1xuICovXG5cbmltcG9ydCB7IHN0YXRlTWFuYWdlciB9IGZyb20gJy4vc3RhdGUtbWFuYWdlci5qcyc7XG5cbi8vIFx1MjUwMFx1MjUwMCBNb2R1bGUtbGV2ZWwgc3RhdGUgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmNvbnN0IENPVkVSX0xFVFRFUl9UT05FUyA9IFtcbiAgeyB2YWx1ZTogJ3N0YXJ0dXAvdGVjaCcsICAgbGFiZWw6ICdTdGFydHVwIC8gVGVjaCcgICAgfSxcbiAgeyB2YWx1ZTogJ3BoYXJtYS9iaW90ZWNoJywgbGFiZWw6ICdQaGFybWEgLyBCaW90ZWNoJyAgfSxcbiAgeyB2YWx1ZTogJ2FjYWRlbWlhJywgICAgICAgbGFiZWw6ICdBY2FkZW1pYScgICAgICAgICAgIH0sXG4gIHsgdmFsdWU6ICdmaW5hbmNpYWwnLCAgICAgIGxhYmVsOiAnRmluYW5jaWFsIFNlcnZpY2VzJyB9LFxuICB7IHZhbHVlOiAnbGVhZGVyc2hpcCcsICAgICBsYWJlbDogJ0xlYWRlcnNoaXAgLyBFeGVjJyAgfSxcbl07XG5cbmNvbnN0IENPVkVSX0xFVFRFUl9PUEVOSU5HUyA9IFtcbiAgeyB2YWx1ZTogJ2Zvcm1hbCcsICAgIGxhYmVsOiAnRm9ybWFsIHNhbHV0YXRpb24gXHUyMDE0IFx1MjAxQ0RlYXIgW25hbWVdLFx1MjAxRCcgfSxcbiAgeyB2YWx1ZTogJ2hvb2snLCAgICAgIGxhYmVsOiAnQXR0ZW50aW9uIGhvb2sgXHUyMDE0IGJvbGQgY2xhaW0gb3IgYWNoaWV2ZW1lbnQnIH0sXG4gIHsgdmFsdWU6ICduYXJyYXRpdmUnLCBsYWJlbDogJ05hcnJhdGl2ZSBvcGVuZXIgXHUyMDE0IHZpdmlkIHNjZW5lIG9yIHN0b3J5JyB9LFxuXTtcblxubGV0IF9jb3ZlckxldHRlclByaW9yU2Vzc2lvbnMgPSBbXTtcblxuLyoqIFN1cnZpdmVzIHRhYiBuYXZpZ2F0aW9uOiBmb3JtIGlucHV0cyBhbmQgdGhlIGdlbmVyYXRlZCBsZXR0ZXIgYm9keS4gKi9cbmxldCBfY292ZXJMZXR0ZXJGb3JtU3RhdGUgPSB7XG4gIHRvbmU6ICAgICAgICAgICAnJyxcbiAgb3BlbmluZ1N0eWxlOiAgICcnLFxuICBoaXJpbmdNYW5hZ2VyOiAgJycsXG4gIGNvbXBhbnlBZGRyZXNzOiAnJyxcbiAgaGlnaGxpZ2h0OiAgICAgICcnLFxuICBjb21wYW55Q29udGV4dDogJycsXG4gIGxldHRlclRleHQ6ICAgICAnJyxcbiAgbGV0dGVyVmlzaWJsZTogIGZhbHNlLFxufTtcblxuLy8gXHUyNTAwXHUyNTAwIFBvcHVsYXRlIGNvdmVyIGxldHRlciB0YWIgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIHBvcHVsYXRlQ292ZXJMZXR0ZXJUYWIoKSB7XG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9jdW1lbnQtY29udGVudCcpO1xuICBjb250ZW50LmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwiZW1wdHktc3RhdGVcIj48ZGl2IGNsYXNzPVwibG9hZGluZy1zcGlubmVyXCI+PC9kaXY+PHAgc3R5bGU9XCJtYXJnaW4tdG9wOjEycHg7Y29sb3I6IzY0NzQ4YjtcIj5Mb2FkaW5nIGNvdmVyIGxldHRlclx1MjAyNjwvcD48L2Rpdj4nO1xuXG4gIC8vIEZldGNoIHByaW9yIHNlc3Npb25zIHdpdGggY292ZXIgbGV0dGVyc1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9jb3Zlci1sZXR0ZXIvcHJpb3InKTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBfY292ZXJMZXR0ZXJQcmlvclNlc3Npb25zID0gKGRhdGEuc2Vzc2lvbnMgfHwgW10pO1xuICB9IGNhdGNoIChfKSB7XG4gICAgX2NvdmVyTGV0dGVyUHJpb3JTZXNzaW9ucyA9IFtdO1xuICB9XG5cbiAgY29uc3QgdG9uZU9wdGlvbnMgPSBDT1ZFUl9MRVRURVJfVE9ORVMubWFwKHQgPT5cbiAgICBgPG9wdGlvbiB2YWx1ZT1cIiR7dC52YWx1ZX1cIj4ke2VzY2FwZUh0bWwodC5sYWJlbCl9PC9vcHRpb24+YFxuICApLmpvaW4oJycpO1xuXG4gIGNvbnN0IG9wZW5pbmdPcHRpb25zID0gQ09WRVJfTEVUVEVSX09QRU5JTkdTLm1hcChvID0+XG4gICAgYDxvcHRpb24gdmFsdWU9XCIke28udmFsdWV9XCI+JHtlc2NhcGVIdG1sKG8ubGFiZWwpfTwvb3B0aW9uPmBcbiAgKS5qb2luKCcnKTtcblxuICBjb25zdCBwcmlvclNlY3Rpb24gPSBfY292ZXJMZXR0ZXJQcmlvclNlc3Npb25zLmxlbmd0aCA/IGBcbiAgICA8ZGl2IGNsYXNzPVwiY2wtcHJpb3Itc2VjdGlvblwiPlxuICAgICAgPGgzPlx1RDgzRFx1RENDQiBQcmlvciBDb3ZlciBMZXR0ZXJzPC9oMz5cbiAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtmb250LXNpemU6MC44NWVtO21hcmdpbi1ib3R0b206MTBweDtcIj5cbiAgICAgICAgU2VsZWN0IGEgcHJpb3IgbGV0dGVyIHRvIHVzZSBhcyBhIHN0YXJ0aW5nIHBvaW50LlxuICAgICAgPC9wPlxuICAgICAgPGRpdiBpZD1cImNsLXByaW9yLWxpc3RcIj5cbiAgICAgICAgJHtfY292ZXJMZXR0ZXJQcmlvclNlc3Npb25zLm1hcCgocywgaSkgPT4gYFxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbC1wcmlvci1jYXJkXCIgaWQ9XCJjbC1wcmlvci0ke2l9XCI+XG4gICAgICAgICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjEwcHg7YWxpZ24taXRlbXM6ZmxleC1zdGFydDtjdXJzb3I6cG9pbnRlcjtcIj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJjbC1wcmlvclwiIHZhbHVlPVwiJHtpfVwiIHN0eWxlPVwibWFyZ2luLXRvcDozcHg7XCIgLz5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8c3Ryb25nPiR7ZXNjYXBlSHRtbChzLnJvbGUgfHwgJ1JvbGUnKX0gYXQgJHtlc2NhcGVIdG1sKHMuY29tcGFueSB8fCAnQ29tcGFueScpfTwvc3Ryb25nPlxuICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6Izk0YTNiODtmb250LXNpemU6MC44MmVtO21hcmdpbi1sZWZ0OjZweDtcIj4ke2VzY2FwZUh0bWwocy5kYXRlIHx8ICcnKX08L3NwYW4+XG4gICAgICAgICAgICAgICAgJHtzLnRvbmUgPyBgPHNwYW4gY2xhc3M9XCJjbC10b25lLWJhZGdlXCI+JHtlc2NhcGVIdG1sKHMudG9uZSl9PC9zcGFuPmAgOiAnJ31cbiAgICAgICAgICAgICAgICA8cCBzdHlsZT1cImNvbG9yOiM2NDc0OGI7Zm9udC1zaXplOjAuODVlbTttYXJnaW46NHB4IDAgMDtcIj4ke2VzY2FwZUh0bWwoKHMucHJldmlldyB8fCAnJykuc2xpY2UoMCwgMTIwKSl9XHUyMDI2PC9wPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPC9kaXY+YCkuam9pbignJyl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gIDogJyc7XG5cbiAgY29udGVudC5pbm5lckhUTUwgPSBgXG4gICAgPGgxPlx1RDgzRFx1RENFOSBDb3ZlciBMZXR0ZXI8L2gxPlxuICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDttYXJnaW4tYm90dG9tOjIwcHg7XCI+XG4gICAgICBHZW5lcmF0ZSBhIHRhaWxvcmVkIGNvdmVyIGxldHRlciBmb3IgdGhpcyBhcHBsaWNhdGlvbiB1c2luZyB5b3VyIENWIGNvbnRlbnRcbiAgICAgIGFuZCBqb2IgYW5hbHlzaXMgYXMgY29udGV4dC5cbiAgICA8L3A+XG5cbiAgICAke3ByaW9yU2VjdGlvbn1cblxuICAgIDxkaXYgY2xhc3M9XCJjbC1mb3JtLXNlY3Rpb25cIj5cbiAgICAgIDxoMz5HZW5lcmF0aW9uIE9wdGlvbnM8L2gzPlxuICAgICAgPGRpdiBjbGFzcz1cImNsLWZvcm0tZ3JpZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2wtZm9ybS1maWVsZFwiPlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJjbC10b25lLXNlbGVjdFwiPlRvbmUgLyBJbmR1c3RyeTwvbGFiZWw+XG4gICAgICAgICAgPHNlbGVjdCBpZD1cImNsLXRvbmUtc2VsZWN0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCI+JHt0b25lT3B0aW9uc308L3NlbGVjdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjbC1mb3JtLWZpZWxkXCI+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cImNsLW9wZW5pbmctc3R5bGVcIj5PcGVuaW5nIFN0eWxlPC9sYWJlbD5cbiAgICAgICAgICA8c2VsZWN0IGlkPVwiY2wtb3BlbmluZy1zdHlsZVwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiPiR7b3BlbmluZ09wdGlvbnN9PC9zZWxlY3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2wtZm9ybS1maWVsZFwiPlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJjbC1oaXJpbmctbWFuYWdlclwiPkhpcmluZyBNYW5hZ2VyIE5hbWUvVGl0bGUgPHNwYW4gc3R5bGU9XCJjb2xvcjojOTRhM2I4O2ZvbnQtd2VpZ2h0OjQwMDtcIj4ob3B0aW9uYWwpPC9zcGFuPjwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJjbC1oaXJpbmctbWFuYWdlclwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBEci4gSmFuZSBTbWl0aCwgSGVhZCBvZiBEYXRhIFNjaWVuY2VcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNsLWZvcm0tZmllbGRcIiBzdHlsZT1cIm1hcmdpbi10b3A6MTJweDtcIj5cbiAgICAgICAgPGxhYmVsIGZvcj1cImNsLWNvbXBhbnktYWRkcmVzc1wiPkNvbXBhbnkgQWRkcmVzcyA8c3BhbiBzdHlsZT1cImNvbG9yOiM5NGEzYjg7Zm9udC13ZWlnaHQ6NDAwO1wiPihvcHRpb25hbCk8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgPHRleHRhcmVhIGlkPVwiY2wtY29tcGFueS1hZGRyZXNzXCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgcm93cz1cIjJcIlxuICAgICAgICAgICAgc3R5bGU9XCJyZXNpemU6dmVydGljYWw7XCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBBY21lIENvcnAsIDEyMyBNYWluIFN0LCBCb3N0b24gTUEgMDIxMzRcIj48L3RleHRhcmVhPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2wtZm9ybS1maWVsZFwiIHN0eWxlPVwibWFyZ2luLXRvcDoxMnB4O1wiPlxuICAgICAgICA8bGFiZWwgZm9yPVwiY2wtaGlnaGxpZ2h0XCI+U3BlY2lmaWMgYWNoaWV2ZW1lbnQgb3IgcHJvamVjdCB0byBoaWdobGlnaHQgPHNwYW4gc3R5bGU9XCJjb2xvcjojOTRhM2I4O2ZvbnQtd2VpZ2h0OjQwMDtcIj4ob3B0aW9uYWwpPC9zcGFuPjwvbGFiZWw+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiY2wtaGlnaGxpZ2h0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBMZWQgdGhlIG1pZ3JhdGlvbiB0byBLdWJlcm5ldGVzIHNhdmluZyAzMCUgaW5mcmEgY29zdFwiIC8+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjbC1mb3JtLWZpZWxkXCIgc3R5bGU9XCJtYXJnaW4tdG9wOjEycHg7XCI+XG4gICAgICAgIDxsYWJlbCBmb3I9XCJjbC1jb21wYW55LWNvbnRleHRcIj5Db21wYW55IGNvbnRleHQgPHNwYW4gc3R5bGU9XCJjb2xvcjojOTRhM2I4O2ZvbnQtd2VpZ2h0OjQwMDtcIj4ob3B0aW9uYWwgXHUyMDE0IHBhc3RlIHNwZWNpZmljIGluaXRpYXRpdmVzLCBwcm9kdWN0cywgdmFsdWVzLCBvciByZWNlbnQgbmV3cyk8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgPHRleHRhcmVhIGlkPVwiY2wtY29tcGFueS1jb250ZXh0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgcm93cz1cIjNcIlxuICAgICAgICAgICAgc3R5bGU9XCJyZXNpemU6dmVydGljYWw7XCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBUaGV5IGp1c3QgbGF1bmNoZWQgYSBuZXcgQUkgcGxhdGZvcm0gZm9yIGhlYWx0aGNhcmU7IHRoZWlyIENUTyB3cm90ZSBhYm91dCBwcmlvcml0aXNpbmcgcmVsaWFiaWxpdHkgb3ZlciBzcGVlZFx1MjAyNlwiPjwvdGV4dGFyZWE+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOjE2cHg7XCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHByaW1hcnlcIiBpZD1cImNsLWdlbmVyYXRlLWJ0blwiIG9uY2xpY2s9XCJnZW5lcmF0ZUNvdmVyTGV0dGVyKClcIj5cbiAgICAgICAgICBcdTI3MjggR2VuZXJhdGUgQ292ZXIgTGV0dGVyXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGlkPVwiY2wtcmVzdWx0LXNlY3Rpb25cIiBzdHlsZT1cImRpc3BsYXk6bm9uZTttYXJnaW4tdG9wOjI0cHg7XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2wtcmVzdWx0LWhlYWRlclwiPlxuICAgICAgICA8aDM+R2VuZXJhdGVkIENvdmVyIExldHRlcjwvaDM+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjhweDtmbGV4LXdyYXA6d3JhcDtcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0blwiIG9uY2xpY2s9XCJnZW5lcmF0ZUNvdmVyTGV0dGVyKClcIiB0aXRsZT1cIlJlZ2VuZXJhdGVcIj5cdUQ4M0RcdUREMDQgUmVnZW5lcmF0ZTwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHByaW1hcnlcIiBvbmNsaWNrPVwic2F2ZUNvdmVyTGV0dGVyKClcIiBpZD1cImNsLXNhdmUtYnRuXCI+XHVEODNEXHVEQ0JFIFNhdmUgQ292ZXIgTGV0dGVyPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7Zm9udC1zaXplOjAuODVlbTttYXJnaW4tYm90dG9tOjhweDtcIj5cbiAgICAgICAgRWRpdCB0aGUgdGV4dCBiZWxvdyBiZWZvcmUgc2F2aW5nLlxuICAgICAgPC9wPlxuICAgICAgPHRleHRhcmVhIGlkPVwiY2wtbGV0dGVyLXRleHRhcmVhXCIgY2xhc3M9XCJjbC1sZXR0ZXItdGV4dGFyZWFcIiByb3dzPVwiMjJcIlxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJDb3ZlciBsZXR0ZXIgdGV4dCBcdTIwMTQgZWRpdCBhcyBuZWVkZWRcIlxuICAgICAgICAgIG9uaW5wdXQ9XCJfZGVib3VuY2VkVmFsaWRhdGVDTCgpOyBfY292ZXJMZXR0ZXJGb3JtU3RhdGUubGV0dGVyVGV4dCA9IHRoaXMudmFsdWU7XCI+PC90ZXh0YXJlYT5cbiAgICAgIDxkaXYgaWQ9XCJjbC12YWxpZGF0aW9uLXBhbmVsXCIgY2xhc3M9XCJjbC12YWxpZGF0aW9uLXBhbmVsXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+XG4gICAgICAgIDxoND5cdUQ4M0RcdURDQ0EgUXVhbGl0eSBDaGVja3M8L2g0PlxuICAgICAgICA8ZGl2IGlkPVwiY2wtY2hlY2tzLWNvbnRhaW5lclwiPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwibmF2LWJ1dHRvbnMgbmF2LWVuZFwiIHN0eWxlPVwibWFyZ2luLXRvcDoyNHB4O1wiPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbnRpbnVlLWJ0blwiIG9uY2xpY2s9XCJoYW5kbGVTdGVwQ2xpY2soJ3NjcmVlbmluZycpXCI+XHVEODNEXHVEQ0NCIFByb2NlZWQgdG8gU2NyZWVuaW5nIFx1MjE5MjwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICBgO1xuXG4gIC8vIFJlc3RvcmUgc2F2ZWQgZm9ybSBzdGF0ZSBhbmQgd2lyZSB1cCBzYXZlLW9uLWNoYW5nZSBsaXN0ZW5lcnMuXG4gIF9yZXN0b3JlQ292ZXJMZXR0ZXJGb3JtU3RhdGUoKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIENvdmVyIGxldHRlciBmb3JtIHN0YXRlIGhlbHBlcnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIF9yZXN0b3JlQ292ZXJMZXR0ZXJGb3JtU3RhdGUoKSB7XG4gIGNvbnN0IHRvbmVFbCAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC10b25lLXNlbGVjdCcpO1xuICBjb25zdCBvcGVuaW5nRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtb3BlbmluZy1zdHlsZScpO1xuICBjb25zdCBobUVsICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtaGlyaW5nLW1hbmFnZXInKTtcbiAgY29uc3QgYWRkckVsICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWNvbXBhbnktYWRkcmVzcycpO1xuICBjb25zdCBobEVsICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtaGlnaGxpZ2h0Jyk7XG4gIGNvbnN0IGN0eEVsICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1jb21wYW55LWNvbnRleHQnKTtcbiAgY29uc3QgcmVzdWx0RWwgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLXJlc3VsdC1zZWN0aW9uJyk7XG4gIGNvbnN0IGxldHRlckVsICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1sZXR0ZXItdGV4dGFyZWEnKTtcblxuICBpZiAodG9uZUVsICYmIF9jb3ZlckxldHRlckZvcm1TdGF0ZS50b25lKVxuICAgIHRvbmVFbC52YWx1ZSA9IF9jb3ZlckxldHRlckZvcm1TdGF0ZS50b25lO1xuICBpZiAob3BlbmluZ0VsICYmIF9jb3ZlckxldHRlckZvcm1TdGF0ZS5vcGVuaW5nU3R5bGUpXG4gICAgb3BlbmluZ0VsLnZhbHVlID0gX2NvdmVyTGV0dGVyRm9ybVN0YXRlLm9wZW5pbmdTdHlsZTtcbiAgaWYgKGhtRWwgJiYgX2NvdmVyTGV0dGVyRm9ybVN0YXRlLmhpcmluZ01hbmFnZXIpXG4gICAgaG1FbC52YWx1ZSA9IF9jb3ZlckxldHRlckZvcm1TdGF0ZS5oaXJpbmdNYW5hZ2VyO1xuICBpZiAoYWRkckVsICYmIF9jb3ZlckxldHRlckZvcm1TdGF0ZS5jb21wYW55QWRkcmVzcylcbiAgICBhZGRyRWwudmFsdWUgPSBfY292ZXJMZXR0ZXJGb3JtU3RhdGUuY29tcGFueUFkZHJlc3M7XG4gIGlmIChobEVsICYmIF9jb3ZlckxldHRlckZvcm1TdGF0ZS5oaWdobGlnaHQpXG4gICAgaGxFbC52YWx1ZSA9IF9jb3ZlckxldHRlckZvcm1TdGF0ZS5oaWdobGlnaHQ7XG4gIGlmIChjdHhFbCAmJiBfY292ZXJMZXR0ZXJGb3JtU3RhdGUuY29tcGFueUNvbnRleHQpXG4gICAgY3R4RWwudmFsdWUgPSBfY292ZXJMZXR0ZXJGb3JtU3RhdGUuY29tcGFueUNvbnRleHQ7XG5cbiAgaWYgKF9jb3ZlckxldHRlckZvcm1TdGF0ZS5sZXR0ZXJWaXNpYmxlICYmIF9jb3ZlckxldHRlckZvcm1TdGF0ZS5sZXR0ZXJUZXh0KSB7XG4gICAgaWYgKHJlc3VsdEVsKSByZXN1bHRFbC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICBpZiAobGV0dGVyRWwpIHtcbiAgICAgIGxldHRlckVsLnZhbHVlID0gX2NvdmVyTGV0dGVyRm9ybVN0YXRlLmxldHRlclRleHQ7XG4gICAgICBfdmFsaWRhdGVDb3ZlckxldHRlcihsZXR0ZXJFbC52YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gV2lyZSB1cCBzYXZlLW9uLWNoYW5nZSBsaXN0ZW5lcnMgKGlubGluZSBvbmlucHV0IGFscmVhZHkgaGFuZGxlcyBsZXR0ZXJUZXh0KS5cbiAgaWYgKHRvbmVFbCkgICAgdG9uZUVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICAgKCkgPT4geyBfY292ZXJMZXR0ZXJGb3JtU3RhdGUudG9uZSA9IHRvbmVFbC52YWx1ZTsgfSk7XG4gIGlmIChvcGVuaW5nRWwpIG9wZW5pbmdFbC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7IF9jb3ZlckxldHRlckZvcm1TdGF0ZS5vcGVuaW5nU3R5bGUgPSBvcGVuaW5nRWwudmFsdWU7IH0pO1xuICBpZiAoaG1FbCkgICAgICBobUVsLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgICAgICAoKSA9PiB7IF9jb3ZlckxldHRlckZvcm1TdGF0ZS5oaXJpbmdNYW5hZ2VyID0gaG1FbC52YWx1ZTsgfSk7XG4gIGlmIChhZGRyRWwpICAgIGFkZHJFbC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICAgICgpID0+IHsgX2NvdmVyTGV0dGVyRm9ybVN0YXRlLmNvbXBhbnlBZGRyZXNzID0gYWRkckVsLnZhbHVlOyB9KTtcbiAgaWYgKGhsRWwpICAgICAgaGxFbC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICAgICAgKCkgPT4geyBfY292ZXJMZXR0ZXJGb3JtU3RhdGUuaGlnaGxpZ2h0ID0gaGxFbC52YWx1ZTsgfSk7XG4gIGlmIChjdHhFbCkgICAgIGN0eEVsLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgICAgICgpID0+IHsgX2NvdmVyTGV0dGVyRm9ybVN0YXRlLmNvbXBhbnlDb250ZXh0ID0gY3R4RWwudmFsdWU7IH0pO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgR2VuZXJhdGUgY292ZXIgbGV0dGVyIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUNvdmVyTGV0dGVyKCkge1xuICAvKiBkdWNrZmxvdzpcbiAgICogICBpZDogY292ZXJfbGV0dGVyX3VpX2dlbmVyYXRlX2xpdmVcbiAgICogICBraW5kOiB1aVxuICAgKiAgIHRpbWVzdGFtcDogJzIwMjYtMDQtMjFUMTg6MDA6MDBaJ1xuICAgKiAgIHN0YXR1czogbGl2ZVxuICAgKiAgIGhhbmRsZXM6XG4gICAqICAgLSB1aTpjb3Zlci1sZXR0ZXIuZ2VuZXJhdGVcbiAgICogICBjYWxsczpcbiAgICogICAtIFBPU1QgL2FwaS9jb3Zlci1sZXR0ZXIvZ2VuZXJhdGVcbiAgICogICByZWFkczpcbiAgICogICAtIGRvbTojY2wtdG9uZS1zZWxlY3QudmFsdWVcbiAgICogICAtIGRvbTojY2wtb3BlbmluZy1zdHlsZS52YWx1ZVxuICAgKiAgIC0gZG9tOiNjbC1oaXJpbmctbWFuYWdlci52YWx1ZVxuICAgKiAgIC0gZG9tOiNjbC1jb21wYW55LWFkZHJlc3MudmFsdWVcbiAgICogICAtIGRvbTojY2wtaGlnaGxpZ2h0LnZhbHVlXG4gICAqICAgLSBkb206aW5wdXRbbmFtZT1jbC1wcmlvcl0uY2hlY2tlZFxuICAgKiAgIHdyaXRlczpcbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL2NvdmVyLWxldHRlci9nZW5lcmF0ZS50b25lXG4gICAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9jb3Zlci1sZXR0ZXIvZ2VuZXJhdGUub3BlbmluZ19zdHlsZVxuICAgKiAgIC0gcmVxdWVzdDpQT1NUIC9hcGkvY292ZXItbGV0dGVyL2dlbmVyYXRlLmhpcmluZ19tYW5hZ2VyXG4gICAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9jb3Zlci1sZXR0ZXIvZ2VuZXJhdGUuY29tcGFueV9hZGRyZXNzXG4gICAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9jb3Zlci1sZXR0ZXIvZ2VuZXJhdGUuaGlnaGxpZ2h0XG4gICAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9jb3Zlci1sZXR0ZXIvZ2VuZXJhdGUucmV1c2VfYm9keVxuICAgKiAgIC0gZG9tOiNjbC1sZXR0ZXItdGV4dGFyZWEudmFsdWVcbiAgICogICBub3RlczogU3VibWl0cyBjb3Zlci1sZXR0ZXIgcHJvbXB0IGlucHV0cyAoaW5jbHVkaW5nIGNvbmZpZ3VyYWJsZSBvcGVuaW5nIHN0eWxlKSBhbmQgb3B0aW9uYWwgcmV1c2UgdGV4dCwgdGhlbiB3cml0ZXMgdGhlIGdlbmVyYXRlZCBib2R5IGludG8gdGhlIGVkaXRhYmxlIGNvdmVyLWxldHRlciB0ZXh0YXJlYS5cbiAgICovXG4gIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1nZW5lcmF0ZS1idG4nKTtcbiAgYnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgYnRuLnRleHRDb250ZW50ID0gJ1x1MjNGMyBHZW5lcmF0aW5nXHUyMDI2JztcblxuICBjb25zdCB0b25lICAgICAgICAgICAgPSAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLXRvbmUtc2VsZWN0JykgICAgICB8fCB7fSkudmFsdWUgfHwgJ3N0YXJ0dXAvdGVjaCc7XG4gIGNvbnN0IG9wZW5pbmdfc3R5bGUgICA9IChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtb3BlbmluZy1zdHlsZScpICAgIHx8IHt9KS52YWx1ZSB8fCAnZm9ybWFsJztcbiAgY29uc3QgaGlyaW5nX21hbmFnZXIgID0gKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1oaXJpbmctbWFuYWdlcicpICAgfHwge30pLnZhbHVlIHx8ICcnO1xuICBjb25zdCBjb21wYW55X2FkZHJlc3MgPSAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWNvbXBhbnktYWRkcmVzcycpICB8fCB7fSkudmFsdWUgfHwgJyc7XG4gIGNvbnN0IGhpZ2hsaWdodCAgICAgICA9IChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtaGlnaGxpZ2h0JykgICAgICAgICB8fCB7fSkudmFsdWUgfHwgJyc7XG4gIGNvbnN0IGNvbXBhbnlfY29udGV4dCA9IChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtY29tcGFueS1jb250ZXh0JykgIHx8IHt9KS52YWx1ZSB8fCAnJztcblxuICAvLyBDaGVjayBmb3IgcHJpb3IgbGV0dGVyIHNlbGVjdGlvblxuICBsZXQgcmV1c2VfYm9keSA9ICcnO1xuICBjb25zdCBjaGVja2VkUHJpb3IgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFtuYW1lPVwiY2wtcHJpb3JcIl06Y2hlY2tlZCcpO1xuICBpZiAoY2hlY2tlZFByaW9yKSB7XG4gICAgY29uc3QgaWR4ID0gcGFyc2VJbnQoY2hlY2tlZFByaW9yLnZhbHVlLCAxMCk7XG4gICAgcmV1c2VfYm9keSA9IChfY292ZXJMZXR0ZXJQcmlvclNlc3Npb25zW2lkeF0gfHwge30pLmZ1bGxfdGV4dCB8fCAnJztcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL2NvdmVyLWxldHRlci9nZW5lcmF0ZScsIHtcbiAgICAgIG1ldGhvZDogICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogICAgSlNPTi5zdHJpbmdpZnkoeyB0b25lLCBvcGVuaW5nX3N0eWxlLCBoaXJpbmdfbWFuYWdlciwgY29tcGFueV9hZGRyZXNzLCBoaWdobGlnaHQsIGNvbXBhbnlfY29udGV4dCwgcmV1c2VfYm9keSB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcblxuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBjb25zdCByZXN1bHRTZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLXJlc3VsdC1zZWN0aW9uJyk7XG4gICAgICBjb25zdCB0ZXh0YXJlYSAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWxldHRlci10ZXh0YXJlYScpO1xuICAgICAgaWYgKHJlc3VsdFNlY3Rpb24pIHJlc3VsdFNlY3Rpb24uc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICBpZiAodGV4dGFyZWEpIHtcbiAgICAgICAgdGV4dGFyZWEudmFsdWUgPSBkYXRhLnRleHQ7XG4gICAgICAgIF92YWxpZGF0ZUNvdmVyTGV0dGVyKHRleHRhcmVhLnZhbHVlKTtcbiAgICAgIH1cbiAgICAgIF9jb3ZlckxldHRlckZvcm1TdGF0ZS5sZXR0ZXJUZXh0ICAgID0gZGF0YS50ZXh0O1xuICAgICAgX2NvdmVyTGV0dGVyRm9ybVN0YXRlLmxldHRlclZpc2libGUgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEdlbmVyYXRpb24gRmFpbGVkJywgZGF0YS5lcnJvciB8fCAnTExNIGRpZCBub3QgcmV0dXJuIGEgY292ZXIgbGV0dGVyLicpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIGNvbnRhY3Qgc2VydmVyLicpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChidG4pIHtcbiAgICAgIGJ0bi5kaXNhYmxlZCAgICA9IGZhbHNlO1xuICAgICAgYnRuLnRleHRDb250ZW50ID0gJ1x1MjcyOCBHZW5lcmF0ZSBDb3ZlciBMZXR0ZXInO1xuICAgIH1cbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgU2F2ZSBjb3ZlciBsZXR0ZXIgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIHNhdmVDb3ZlckxldHRlcigpIHtcbiAgLyogZHVja2Zsb3c6XG4gICAqICAgaWQ6IGNvdmVyX2xldHRlcl91aV9zYXZlX2xpdmVcbiAgICogICBraW5kOiB1aVxuICAgKiAgIHRpbWVzdGFtcDogJzIwMjYtMDMtMjVUMjE6Mzk6NDhaJ1xuICAgKiAgIHN0YXR1czogbGl2ZVxuICAgKiAgIGhhbmRsZXM6XG4gICAqICAgLSB1aTpjb3Zlci1sZXR0ZXIuc2F2ZVxuICAgKiAgIGNhbGxzOlxuICAgKiAgIC0gUE9TVCAvYXBpL2NvdmVyLWxldHRlci9zYXZlXG4gICAqICAgcmVhZHM6XG4gICAqICAgLSBkb206I2NsLWxldHRlci10ZXh0YXJlYS52YWx1ZVxuICAgKiAgIHdyaXRlczpcbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL2NvdmVyLWxldHRlci9zYXZlLnRleHRcbiAgICogICBub3RlczogU3VibWl0cyB0aGUgdXNlci1lZGl0ZWQgY292ZXItbGV0dGVyIGJvZHkgZm9yIHNlc3Npb24gcGVyc2lzdGVuY2UsIG1ldGFkYXRhIHdyaXRlLXRocm91Z2gsIGFuZCBhcmNoaXZlIGFydGlmYWN0IGdlbmVyYXRpb24uXG4gICAqL1xuICBjb25zdCB0ZXh0YXJlYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1sZXR0ZXItdGV4dGFyZWEnKTtcbiAgaWYgKCF0ZXh0YXJlYSkgcmV0dXJuO1xuICBjb25zdCB0ZXh0ID0gdGV4dGFyZWEudmFsdWUudHJpbSgpO1xuICBpZiAoIXRleHQpIHtcbiAgICBzaG93QWxlcnRNb2RhbCgnXHUyNkEwXHVGRTBGIEVtcHR5IExldHRlcicsICdQbGVhc2UgZ2VuZXJhdGUgb3IgdHlwZSBhIGNvdmVyIGxldHRlciBiZWZvcmUgc2F2aW5nLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1zYXZlLWJ0bicpO1xuICBpZiAoYnRuKSB7IGJ0bi5kaXNhYmxlZCA9IHRydWU7IGJ0bi50ZXh0Q29udGVudCA9ICdcdTIzRjMgU2F2aW5nXHUyMDI2JzsgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL2NvdmVyLWxldHRlci9zYXZlJywge1xuICAgICAgbWV0aG9kOiAgJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiAgICBKU09OLnN0cmluZ2lmeSh7IHRleHQgfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG5cbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjcwNSBTYXZlZCcsIGBDb3ZlciBsZXR0ZXIgc2F2ZWQgYXMgPHN0cm9uZz4ke2VzY2FwZUh0bWwoZGF0YS5maWxlbmFtZSl9PC9zdHJvbmc+IGluIHlvdXIgYXBwbGljYXRpb24gZm9sZGVyLmApO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIFNhdmUgRmFpbGVkJywgZGF0YS5lcnJvciB8fCAnQ291bGQgbm90IHNhdmUgY292ZXIgbGV0dGVyLicpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIGNvbnRhY3Qgc2VydmVyLicpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChidG4pIHsgYnRuLmRpc2FibGVkID0gZmFsc2U7IGJ0bi50ZXh0Q29udGVudCA9ICdcdUQ4M0RcdURDQkUgU2F2ZSBDb3ZlciBMZXR0ZXInOyB9XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIENyb3NzLWRvY3VtZW50IGNvbnNpc3RlbmN5IHJlcG9ydCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLyoqXG4gKiBCdWlsZCBhbmQgcmVuZGVyIHRoZSBjcm9zcy1kb2N1bWVudCBjb25zaXN0ZW5jeSByZXBvcnQgaW4gdGhlIEZpbmFsaXNlIHRhYi5cbiAqIENoZWNrcyBjb21wYW55IG5hbWUsIGpvYiB0aXRsZSwgQVRTIGtleXdvcmRzLCBhbmQgZGF0ZSBmb3JtYXR0aW5nIGFjcm9zc1xuICogdGhlIENWICh0YWJEYXRhLmN2KSBhbmQgY292ZXIgbGV0dGVyICgjY2wtbGV0dGVyLXRleHRhcmVhKS5cbiAqL1xuZnVuY3Rpb24gX3JlbmRlckNvbnNpc3RlbmN5UmVwb3J0KHN0YXR1c0RhdGEpIHtcbiAgY29uc3QgcGFuZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29uc2lzdGVuY3ktcmVwb3J0Jyk7XG4gIGlmICghcGFuZWwpIHJldHVybjtcblxuICBjb25zdCBhbmFseXNpcyAgICA9IHN0YXR1c0RhdGEuam9iX2FuYWx5c2lzIHx8IHt9O1xuICBjb25zdCBjb21wYW55ICAgICA9IChhbmFseXNpcy5jb21wYW55ICB8fCAnJykudHJpbSgpO1xuICBjb25zdCBqb2JUaXRsZSAgICA9IChhbmFseXNpcy50aXRsZSAgICB8fCAnJykudHJpbSgpO1xuICBjb25zdCBhdHNLZXl3b3JkcyA9IChhbmFseXNpcy5hdHNfa2V5d29yZHMgfHwgW10pLmZpbHRlcihCb29sZWFuKS5zbGljZSgwLCA4KTtcblxuICAvLyBTdHJpcCBIVE1MIHRhZ3MgZnJvbSBDViBjb250ZW50IGZvciB0ZXh0IHNlYXJjaFxuICBjb25zdCBjdlN0YXRlID0gc3RhdGVNYW5hZ2VyLmdldFRhYkRhdGEoJ2N2JykgfHwgJyc7XG4gIGNvbnN0IGN2SHRtbCA9IHR5cGVvZiBjdlN0YXRlID09PSAnc3RyaW5nJyA/IGN2U3RhdGUgOiAoY3ZTdGF0ZT8uWycqLmh0bWwnXSB8fCAnJyk7XG4gIGNvbnN0IGN2VGV4dCA9IGN2SHRtbC5yZXBsYWNlKC88W14+XSs+L2csICcgJykucmVwbGFjZSgvXFxzKy9nLCAnICcpLnRvTG93ZXJDYXNlKCk7XG5cbiAgLy8gR2V0IGNvdmVyIGxldHRlciB0ZXh0IGlmIHByZXNlbnRcbiAgY29uc3QgY2xFbCAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWxldHRlci10ZXh0YXJlYScpO1xuICBjb25zdCBjbFJhdyAgPSBjbEVsID8gY2xFbC52YWx1ZSA6ICcnO1xuICBjb25zdCBjbFRleHQgPSBjbFJhdy50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBoYXNDTCAgPSBjbFJhdy50cmltKCkubGVuZ3RoID4gNTA7XG5cbiAgaWYgKCFjb21wYW55ICYmICFqb2JUaXRsZSAmJiAhYXRzS2V5d29yZHMubGVuZ3RoKSB7XG4gICAgcGFuZWwuaW5uZXJIVE1MID0gJyc7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY2hlY2tzID0gW107XG5cbiAgLy8gXHUyNTAwXHUyNTAwIDEuIENvbXBhbnkgbmFtZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgaWYgKGNvbXBhbnkpIHtcbiAgICBjb25zdCBjb21wTGMgPSBjb21wYW55LnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgaW5DViAgID0gY3ZUZXh0LmluY2x1ZGVzKGNvbXBMYyk7XG4gICAgY29uc3QgaW5DTCAgID0gaGFzQ0wgJiYgY2xUZXh0LmluY2x1ZGVzKGNvbXBMYyk7XG4gICAgY29uc3QgbWlzc2luZyA9IFtdO1xuICAgIGlmICghaW5DVikgICAgICAgICAgbWlzc2luZy5wdXNoKCdDVicpO1xuICAgIGlmIChoYXNDTCAmJiAhaW5DTCkgbWlzc2luZy5wdXNoKCdjb3ZlciBsZXR0ZXInKTtcbiAgICBjb25zdCBzdGF0dXMgPSBtaXNzaW5nLmxlbmd0aCA9PT0gMCA/ICdwYXNzJyA6IG1pc3NpbmcubGVuZ3RoIDwgMiAmJiBoYXNDTCA/ICd3YXJuJyA6ICdmYWlsJztcbiAgICBjaGVja3MucHVzaCh7XG4gICAgICBzdGF0dXMsXG4gICAgICBsYWJlbDogICdDb21wYW55IG5hbWUnLFxuICAgICAgZGV0YWlsOiBzdGF0dXMgPT09ICdwYXNzJ1xuICAgICAgICA/IGBcXHUyMDFjJHtlc2NhcGVIdG1sKGNvbXBhbnkpfVxcdTIwMWQgZm91bmQgaW4gYWxsIGRvY3VtZW50cy5gXG4gICAgICAgIDogYFxcdTIwMWMke2VzY2FwZUh0bWwoY29tcGFueSl9XFx1MjAxZCBtaXNzaW5nIGZyb206ICR7bWlzc2luZy5qb2luKCcsICcpfS5gLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gXHUyNTAwXHUyNTAwIDIuIEpvYiB0aXRsZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgaWYgKGpvYlRpdGxlKSB7XG4gICAgY29uc3QgdGl0bGVMYyAgID0gam9iVGl0bGUudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCB0aXRsZUNvcmUgPSB0aXRsZUxjLnJlcGxhY2UoL14oc2VuaW9yfGp1bmlvcnxsZWFkfHByaW5jaXBhbHxzdGFmZnxhc3NvY2lhdGUpXFxzKy8sICcnKTtcbiAgICBjb25zdCBpbkNWICAgICAgPSBjdlRleHQuaW5jbHVkZXModGl0bGVMYykgfHwgY3ZUZXh0LmluY2x1ZGVzKHRpdGxlQ29yZSk7XG4gICAgY29uc3QgaW5DTCAgICAgID0gaGFzQ0wgJiYgKGNsVGV4dC5pbmNsdWRlcyh0aXRsZUxjKSB8fCBjbFRleHQuaW5jbHVkZXModGl0bGVDb3JlKSk7XG4gICAgY29uc3QgbWlzc2luZyAgID0gW107XG4gICAgaWYgKCFpbkNWKSAgICAgICAgICBtaXNzaW5nLnB1c2goJ0NWJyk7XG4gICAgaWYgKGhhc0NMICYmICFpbkNMKSBtaXNzaW5nLnB1c2goJ2NvdmVyIGxldHRlcicpO1xuICAgIGNvbnN0IHN0YXR1cyA9IG1pc3NpbmcubGVuZ3RoID09PSAwID8gJ3Bhc3MnIDogbWlzc2luZy5sZW5ndGggPCAyICYmIGhhc0NMID8gJ3dhcm4nIDogJ2ZhaWwnO1xuICAgIGNoZWNrcy5wdXNoKHtcbiAgICAgIHN0YXR1cyxcbiAgICAgIGxhYmVsOiAgJ0pvYiB0aXRsZScsXG4gICAgICBkZXRhaWw6IHN0YXR1cyA9PT0gJ3Bhc3MnXG4gICAgICAgID8gYFxcdTIwMWMke2VzY2FwZUh0bWwoam9iVGl0bGUpfVxcdTIwMWQgZm91bmQgaW4gYWxsIGRvY3VtZW50cy5gXG4gICAgICAgIDogYFxcdTIwMWMke2VzY2FwZUh0bWwoam9iVGl0bGUpfVxcdTIwMWQgbWlzc2luZyBmcm9tOiAke21pc3Npbmcuam9pbignLCAnKX0uYCxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFx1MjUwMFx1MjUwMCAzLiBBVFMga2V5d29yZHMgKHRvcCA4KSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgaWYgKGF0c0tleXdvcmRzLmxlbmd0aCkge1xuICAgIGNvbnN0IG1pc3NpbmdDViA9IGF0c0tleXdvcmRzLmZpbHRlcihrdyA9PiAhY3ZUZXh0LmluY2x1ZGVzKGt3LnRvTG93ZXJDYXNlKCkpKTtcbiAgICBjb25zdCBtaXNzaW5nQ0wgPSBoYXNDTCA/IGF0c0tleXdvcmRzLmZpbHRlcihrdyA9PiAhY2xUZXh0LmluY2x1ZGVzKGt3LnRvTG93ZXJDYXNlKCkpKSA6IFtdO1xuICAgIGNvbnN0IHRvdGFsTWlzc2luZyA9IG5ldyBTZXQoWy4uLm1pc3NpbmdDViwgLi4ubWlzc2luZ0NMXSkuc2l6ZTtcbiAgICBjb25zdCBzdGF0dXMgPSB0b3RhbE1pc3NpbmcgPT09IDAgPyAncGFzcycgOiB0b3RhbE1pc3NpbmcgPD0gMyA/ICd3YXJuJyA6ICdmYWlsJztcbiAgICBjb25zdCBwYXJ0cyAgPSBbXTtcbiAgICBpZiAobWlzc2luZ0NWLmxlbmd0aCkgcGFydHMucHVzaChgTWlzc2luZyBmcm9tIENWOiAke21pc3NpbmdDVi5tYXAoayA9PiBgPGVtPiR7ZXNjYXBlSHRtbChrKX08L2VtPmApLmpvaW4oJywgJyl9YCk7XG4gICAgaWYgKG1pc3NpbmdDTC5sZW5ndGgpIHBhcnRzLnB1c2goYE1pc3NpbmcgZnJvbSBjb3ZlciBsZXR0ZXI6ICR7bWlzc2luZ0NMLm1hcChrID0+IGA8ZW0+JHtlc2NhcGVIdG1sKGspfTwvZW0+YCkuam9pbignLCAnKX1gKTtcbiAgICBjaGVja3MucHVzaCh7XG4gICAgICBzdGF0dXMsXG4gICAgICBsYWJlbDogIGBBVFMga2V5d29yZHMgKCR7YXRzS2V5d29yZHMubGVuZ3RofSBjaGVja2VkKWAsXG4gICAgICBkZXRhaWw6IHBhcnRzLmxlbmd0aCA/IHBhcnRzLmpvaW4oJy4gJykgKyAnLicgOiBgQWxsICR7YXRzS2V5d29yZHMubGVuZ3RofSBrZXl3b3JkcyBwcmVzZW50IGluIGRvY3VtZW50cy5gLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gXHUyNTAwXHUyNTAwIDQuIERhdGUgZm9ybWF0IGNvbnNpc3RlbmN5IChDVikgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIGlmIChjdlRleHQpIHtcbiAgICBjb25zdCBoYXNXcml0dGVuID0gL1xcYihqYW58ZmVifG1hcnxhcHJ8bWF5fGp1bnxqdWx8YXVnfHNlcHxvY3R8bm92fGRlYylcXHcqXFxzK1xcZHs0fVxcYi9pLnRlc3QoY3ZUZXh0KTtcbiAgICBjb25zdCBoYXNJU08gICAgID0gL1xcYlxcZHs0fS1cXGR7Mn1cXGIvLnRlc3QoY3ZUZXh0KTtcbiAgICBjb25zdCBoYXNTbGFzaCAgID0gL1xcYlxcZHsxLDJ9XFwvXFxkezR9XFxiLy50ZXN0KGN2VGV4dCk7XG4gICAgY29uc3QgZm9ybWF0Q291bnQgPSBbaGFzV3JpdHRlbiwgaGFzSVNPLCBoYXNTbGFzaF0uZmlsdGVyKEJvb2xlYW4pLmxlbmd0aDtcbiAgICBjaGVja3MucHVzaCh7XG4gICAgICBzdGF0dXM6IGZvcm1hdENvdW50IDw9IDEgPyAncGFzcycgOiAnd2FybicsXG4gICAgICBsYWJlbDogICdEYXRlIGZvcm1hdHMgKENWKScsXG4gICAgICBkZXRhaWw6IGZvcm1hdENvdW50IDw9IDFcbiAgICAgICAgPyAnQ29uc2lzdGVudCBkYXRlIGZvcm1hdCB0aHJvdWdob3V0IENWLidcbiAgICAgICAgOiAnTWl4ZWQgZGF0ZSBmb3JtYXRzIGRldGVjdGVkIChlLmcuIFxcdTIwMWNKYW4gMjAyMFxcdTIwMWQgYW5kIFxcdTIwMWMyMDIwLTAxXFx1MjAxZCkgXFx1MjAxNCBzdGFuZGFyZGlzZSBmb3IgYSBwb2xpc2hlZCBsb29rLicsXG4gICAgfSk7XG4gIH1cblxuICAvLyBcXHUyNTAwXFx1MjUwMCA1LiBDcm9zcy1kb2N1bWVudCB0ZXJtaW5vbG9neSBjb25zaXN0ZW5jeSBcXHUyNTAwXFx1MjUwMFxcdTI1MDBcXHUyNTAwXFx1MjUwMFxcdTI1MDBcXHUyNTAwXFx1MjUwMFxcdTI1MDBcXHUyNTAwXFx1MjUwMFxcdTI1MDBcXHUyNTAwXFx1MjUwMFxcdTI1MDBcXHUyNTAwXFx1MjUwMFxcdTI1MDBcXHUyNTAwXFx1MjUwMFxcdTI1MDBcbiAgY29uc3Qgc3FUZXh0cyA9IFsuLi5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCd0ZXh0YXJlYVtpZF49XCJzYy10ZXh0LVwiXScpXVxuICAgIC5tYXAoZWwgPT4gZWwudmFsdWUudG9Mb3dlckNhc2UoKSkuZmlsdGVyKEJvb2xlYW4pO1xuICBjb25zdCBhbGxEb2NUZXh0ID0gW2N2VGV4dCwgY2xUZXh0LCAuLi5zcVRleHRzXTtcblxuICBjb25zdCBfVEVSTV9QQUlSUyA9IFtcbiAgICBbJ21hY2hpbmUgbGVhcm5pbmcnLCAnbWwnXSwgWydhcnRpZmljaWFsIGludGVsbGlnZW5jZScsICdhaSddLFxuICAgIFsnbmF0dXJhbCBsYW5ndWFnZSBwcm9jZXNzaW5nJywgJ25scCddLCBbJ2RlZXAgbGVhcm5pbmcnLCAnZGwnXSxcbiAgICBbJ2xhcmdlIGxhbmd1YWdlIG1vZGVsJywgJ2xsbSddLCBbJ3VzZXIgaW50ZXJmYWNlJywgJ3VpJ10sXG4gICAgWyd1c2VyIGV4cGVyaWVuY2UnLCAndXgnXSwgWydhcHBsaWNhdGlvbiBwcm9ncmFtbWluZyBpbnRlcmZhY2UnLCAnYXBpJ10sXG4gICAgWydrdWJlcm5ldGVzJywgJ2s4cyddLCBbJ2NvbnRpbnVvdXMgaW50ZWdyYXRpb24nLCAnY2kvY2QnXSxcbiAgXTtcbiAgY29uc3QgdGVybU1pc21hdGNoZXMgPSBbXTtcbiAgZm9yIChjb25zdCBbbG9uZywgc2hvcnRdIG9mIF9URVJNX1BBSVJTKSB7XG4gICAgY29uc3QgcmUgPSBuZXcgUmVnRXhwKGBcXFxcYiR7c2hvcnQucmVwbGFjZSgnLycsICdcXFxcLycpfVxcXFxiYCk7XG4gICAgaWYgKGFsbERvY1RleHQuc29tZSh0ID0+IHQuaW5jbHVkZXMobG9uZykpICYmIGFsbERvY1RleHQuc29tZSh0ID0+IHJlLnRlc3QodCkpKSB7XG4gICAgICB0ZXJtTWlzbWF0Y2hlcy5wdXNoKGBcXHUyMDFjJHtsb25nfVxcdTIwMWQgLyBcXHUyMDFjJHtzaG9ydC50b1VwcGVyQ2FzZSgpfVxcdTIwMWRgKTtcbiAgICB9XG4gIH1cbiAgaWYgKHRlcm1NaXNtYXRjaGVzLmxlbmd0aCA+IDApIHtcbiAgICBjaGVja3MucHVzaCh7XG4gICAgICBzdGF0dXM6ICd3YXJuJyxcbiAgICAgIGxhYmVsOiAgJ1Rlcm1pbm9sb2d5IGNvbnNpc3RlbmN5JyxcbiAgICAgIGRldGFpbDogYE1peGVkIGZvcm1zIGRldGVjdGVkIGFjcm9zcyBkb2N1bWVudHM6ICR7dGVybU1pc21hdGNoZXMuam9pbignOyAnKX0uIFN0YW5kYXJkaXNlIHRvIG9uZSBmb3JtIHBlciBjb25jZXB0LmAsXG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoYWxsRG9jVGV4dC5zb21lKHQgPT4gdC5sZW5ndGggPiA1MCkpIHtcbiAgICBjaGVja3MucHVzaCh7XG4gICAgICBzdGF0dXM6ICdwYXNzJyxcbiAgICAgIGxhYmVsOiAgJ1Rlcm1pbm9sb2d5IGNvbnNpc3RlbmN5JyxcbiAgICAgIGRldGFpbDogJ05vIG1peGVkIGFiYnJldmlhdGlvbi9leHBhbnNpb24gcGFpcnMgZGV0ZWN0ZWQgYWNyb3NzIENWLCBjb3ZlciBsZXR0ZXIsIGFuZCBzY3JlZW5pbmcgYW5zd2Vycy4nLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gXHUyNTAwXHUyNTAwIFJlbmRlciBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgY29uc3QgaWNvbnMgPSB7IHBhc3M6ICdcXHUyNzA1Jywgd2FybjogJ1xcdTI2YTBcXHVmZTBmJywgZmFpbDogJ1xcdTI3NGMnIH07XG4gIGNvbnN0IG92ZXJhbGxGYWlsICAgPSBjaGVja3Muc29tZShjID0+IGMuc3RhdHVzID09PSAnZmFpbCcpO1xuICBjb25zdCBvdmVyYWxsV2FybiAgID0gY2hlY2tzLnNvbWUoYyA9PiBjLnN0YXR1cyA9PT0gJ3dhcm4nKTtcbiAgY29uc3Qgb3ZlcmFsbFN0YXR1cyA9IG92ZXJhbGxGYWlsID8gJ2ZhaWwnIDogb3ZlcmFsbFdhcm4gPyAnd2FybicgOiAncGFzcyc7XG4gIGNvbnN0IG92ZXJhbGxNc2cgICAgPSBvdmVyYWxsRmFpbFxuICAgID8gJ0lzc3VlcyBmb3VuZCBcXHUyMDE0IHJldmlldyBiZWZvcmUgc2VuZGluZydcbiAgICA6IG92ZXJhbGxXYXJuID8gJ01pbm9yIGluY29uc2lzdGVuY2llcyBkZXRlY3RlZCcgOiAnQWxsIGNoZWNrcyBwYXNzZWQnO1xuXG4gIHBhbmVsLmlubmVySFRNTCA9IGBcbiAgICA8ZGl2IGNsYXNzPVwiY29uc2lzdGVuY3ktcmVwb3J0XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3ItaGVhZGVyXCI+XG4gICAgICAgIDxoMyBzdHlsZT1cIm1hcmdpbjowO2ZvbnQtc2l6ZToxZW07XCI+JHtpY29uc1tvdmVyYWxsU3RhdHVzXX0gQ3Jvc3MtRG9jdW1lbnQgQ29uc2lzdGVuY3k8L2gzPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImNyLWJhZGdlIGNyLSR7b3ZlcmFsbFN0YXR1c31cIj4ke2VzY2FwZUh0bWwob3ZlcmFsbE1zZyl9PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7Zm9udC1zaXplOjAuODNlbTttYXJnaW46MCAwIDEycHg7XCI+XG4gICAgICAgIENoZWNrcyBjb21wYW55IG5hbWUsIGpvYiB0aXRsZSwgQVRTIGtleXdvcmRzLCBkYXRlIGZvcm1hdHRpbmcsIGFuZCB0ZXJtaW5vbG9neSBjb25zaXN0ZW5jeSBhY3Jvc3MgQ1YsIGNvdmVyIGxldHRlciwgYW5kIHNjcmVlbmluZyBhbnN3ZXJzLlxuICAgICAgPC9wPlxuICAgICAgPGRpdiBjbGFzcz1cImNyLWNoZWNrc1wiPlxuICAgICAgICAke2NoZWNrcy5tYXAoYyA9PiBgXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNyLWNoZWNrIGNyLSR7Yy5zdGF0dXN9XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNyLWljb25cIj4ke2ljb25zW2Muc3RhdHVzXX08L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNyLWxhYmVsXCI+JHtlc2NhcGVIdG1sKGMubGFiZWwpfTwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3ItZGV0YWlsXCI+JHtjLmRldGFpbH08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+YCkuam9pbignJyl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgRGVib3VuY2VkIHZhbGlkYXRpb24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmxldCBfY2xWYWxpZGF0ZVRpbWVyID0gbnVsbDtcbmZ1bmN0aW9uIF9kZWJvdW5jZWRWYWxpZGF0ZUNMKCkge1xuICBjbGVhclRpbWVvdXQoX2NsVmFsaWRhdGVUaW1lcik7XG4gIF9jbFZhbGlkYXRlVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICBjb25zdCB0YSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1sZXR0ZXItdGV4dGFyZWEnKTtcbiAgICBpZiAodGEpIF92YWxpZGF0ZUNvdmVyTGV0dGVyKHRhLnZhbHVlKTtcbiAgfSwgNjAwKTtcbn1cblxuLyoqXG4gKiBDbGllbnQtc2lkZSBjb3ZlciBsZXR0ZXIgcXVhbGl0eSBjaGVja3MuXG4gKiA1IHJ1bGVzOiBvcGVuaW5nLCBJLWZpcnN0IGdhdGUsIGNvbXBhbnkgbmFtZSwgd29yZCBjb3VudCAocm9sZS1kaWZmZXJlbnRpYXRlZCksIGNhbGwtdG8tYWN0aW9uLlxuICovXG5mdW5jdGlvbiBfdmFsaWRhdGVDb3ZlckxldHRlcih0ZXh0KSB7XG4gIGNvbnN0IHBhbmVsICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC12YWxpZGF0aW9uLXBhbmVsJyk7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1jaGVja3MtY29udGFpbmVyJyk7XG4gIGlmICghcGFuZWwgfHwgIWNvbnRhaW5lciB8fCAhdGV4dC50cmltKCkpIHJldHVybjtcblxuICAvLyBcdTI1MDBcdTI1MDAgUnVsZSAxOiBPcGVuaW5nIHBhdHRlcm4gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIGNvbnN0IGZpcnN0TGluZSA9ICh0ZXh0LnNwbGl0KCdcXG4nKS5maW5kKGwgPT4gbC50cmltKCkpIHx8ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgZ2VuZXJpY09wZW5pbmdzID0gW1xuICAgIC9eZGVhciBoaXJpbmcgbWFuYWdlci8sXG4gICAgL15kZWFyIHNpciBvciBtYWRhbS8sXG4gICAgL150byB3aG9tIGl0IG1heSBjb25jZXJuLyxcbiAgICAvXmRlYXIgcmVjcnVpdGVyLyxcbiAgICAvXmRlYXIgaHVtYW4gcmVzb3VyY2VzLyxcbiAgICAvXmRlYXIgaHIvLFxuICBdO1xuICBjb25zdCBnZW5lcmljT3BlbmluZyA9IGdlbmVyaWNPcGVuaW5ncy5zb21lKHJlID0+IHJlLnRlc3QoZmlyc3RMaW5lKSk7XG4gIGNvbnN0IG9wZW5pbmdDaGVjayA9IHtcbiAgICBwYXNzOiAhZ2VuZXJpY09wZW5pbmcsXG4gICAgbGFiZWw6ICdPcGVuaW5nIHNhbHV0YXRpb24nLFxuICAgIGRldGFpbDogZ2VuZXJpY09wZW5pbmdcbiAgICAgID8gJ1VzZXMgYSBnZW5lcmljIG9wZW5lciAoXCJEZWFyIEhpcmluZyBNYW5hZ2VyXCIgZXRjLikgXHUyMDE0IHBlcnNvbmFsaXNlIHdpdGggYSBuYW1lIG9yIHJvbGUuJ1xuICAgICAgOiAnUGVyc29uYWxpc2VkIG9wZW5lciBcdTIwMTQgZ29vZC4nLFxuICB9O1xuXG4gIC8vIFx1MjUwMFx1MjUwMCBSdWxlIDFiOiBCb2R5IG11c3Qgbm90IG9wZW4gd2l0aCBcIklcIiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgY29uc3QgYWxsTGluZXMgPSB0ZXh0LnNwbGl0KCdcXG4nKS5tYXAobCA9PiBsLnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pO1xuICBjb25zdCBzYWx1dGF0aW9uSWR4ID0gYWxsTGluZXMuZmluZEluZGV4KFxuICAgIGwgPT4gbC50b0xvd2VyQ2FzZSgpID09PSBmaXJzdExpbmUudG9Mb3dlckNhc2UoKVxuICApO1xuICBjb25zdCBib2R5TGluZXMgPSBhbGxMaW5lcy5zbGljZShNYXRoLm1heCgwLCBzYWx1dGF0aW9uSWR4ICsgMSkpO1xuICBjb25zdCBmaXJzdEJvZHlXb3JkID0gKGJvZHlMaW5lcy5maW5kKGwgPT4gbC50cmltKCkpIHx8ICcnKS5zcGxpdCgvXFxzKy8pWzBdIHx8ICcnO1xuICAvLyBTcGxpdCBvbiBub24tYWxwaGEgc28gXCJJJ21cIiBcdTIxOTIgdG9rZW4gXCJJXCIsIFwiSW5cIiBcdTIxOTIgdG9rZW4gXCJJblwiXG4gIGNvbnN0IGZpcnN0Qm9keVRva2VuID0gZmlyc3RCb2R5V29yZC5zcGxpdCgvW15hLXpBLVpdLylbMF0gfHwgJyc7XG4gIGNvbnN0IGJvZHlTdGFydHNXaXRoSSA9IGZpcnN0Qm9keVRva2VuLnRvTG93ZXJDYXNlKCkgPT09ICdpJztcbiAgY29uc3QgaUZpcnN0Q2hlY2sgPSB7XG4gICAgcGFzczogIWJvZHlTdGFydHNXaXRoSSxcbiAgICBsYWJlbDogJ09wZW5pbmcgd29yZCcsXG4gICAgZGV0YWlsOiBib2R5U3RhcnRzV2l0aElcbiAgICAgID8gJ0JvZHkgb3BlbnMgd2l0aCBcIklcIiBcdTIwMTQgbGVhZCB3aXRoIHlvdXIgdmFsdWUsIHRoZSByb2xlLCBvciB0aGUgY29tcGFueSBpbnN0ZWFkLidcbiAgICAgIDogJ0JvZHkgZG9lcyBub3Qgb3BlbiB3aXRoIFwiSVwiIFx1MjAxNCBnb29kLicsXG4gIH07XG5cbiAgLy8gXHUyNTAwXHUyNTAwIFJ1bGUgMjogQ29tcGFueS1zcGVjaWZpYyByZWZlcmVuY2UgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIGNvbnN0IGNvbXBhbnlOYW1lID0gX2dldENvbXBhbnlOYW1lRm9yQ0woKTtcbiAgbGV0IGNvbXBhbnlDaGVjaztcbiAgaWYgKCFjb21wYW55TmFtZSkge1xuICAgIGNvbXBhbnlDaGVjayA9IHsgd2FybjogdHJ1ZSwgbGFiZWw6ICdDb21wYW55IHJlZmVyZW5jZScsIGRldGFpbDogJ0NvbXBhbnkgbmFtZSBub3QgZGV0ZWN0ZWQgZnJvbSBqb2IgZGVzY3JpcHRpb24gXHUyMDE0IHZlcmlmeSBtYW51YWxseS4nIH07XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgbWVudGlvbnMgPSAodGV4dC50b0xvd2VyQ2FzZSgpLm1hdGNoKG5ldyBSZWdFeHAoY29tcGFueU5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgJ1xcXFwkJicpLCAnZycpKSB8fCBbXSkubGVuZ3RoO1xuICAgIGNvbXBhbnlDaGVjayA9IHtcbiAgICAgIHBhc3M6IG1lbnRpb25zID49IDIsXG4gICAgICB3YXJuOiBtZW50aW9ucyA9PT0gMSxcbiAgICAgIGxhYmVsOiAnQ29tcGFueSByZWZlcmVuY2UnLFxuICAgICAgZGV0YWlsOiBtZW50aW9ucyA9PT0gMFxuICAgICAgICA/IGBcIiR7ZXNjYXBlSHRtbChjb21wYW55TmFtZSl9XCIgbm90IG1lbnRpb25lZCBcdTIwMTQgYWRkIHNwZWNpZmljIHJlZmVyZW5jZXMuYFxuICAgICAgICA6IG1lbnRpb25zID09PSAxXG4gICAgICAgICAgPyBgXCIke2VzY2FwZUh0bWwoY29tcGFueU5hbWUpfVwiIG1lbnRpb25lZCBvbmNlIFx1MjAxNCBhIHNlY29uZCBzcGVjaWZpYyByZWZlcmVuY2Ugc3RyZW5ndGhlbnMgdGhlIGxldHRlci5gXG4gICAgICAgICAgOiBgXCIke2VzY2FwZUh0bWwoY29tcGFueU5hbWUpfVwiIG1lbnRpb25lZCAke21lbnRpb25zfSB0aW1lcyBcdTIwMTQgZ29vZCBzcGVjaWZpY2l0eS5gLFxuICAgIH07XG4gIH1cblxuICAvLyBcdTI1MDBcdTI1MDAgUnVsZSAzOiBXb3JkIGNvdW50IChyb2xlLWRpZmZlcmVudGlhdGVkIHRhcmdldCkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIGNvbnN0IF9yb2xlQW5hbHlzaXMgPSB3aW5kb3cuX2xhc3RBbmFseXNpc0RhdGEgfHxcbiAgICAod2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnMgJiYgd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnMuam9iX2FuYWx5c2lzKSB8fCB7fTtcbiAgY29uc3QgX3JvbGVMZXZlbCAgPSAoX3JvbGVBbmFseXNpcy5yb2xlX2xldmVsIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBfcm9sZURvbWFpbiA9IChfcm9sZUFuYWx5c2lzLmRvbWFpbiB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgaXNFeGVjICAgICAgPSAvZXhlY3x2cHxjLXN1aXRlfGNoaWVmfGRpcmVjdG9yfHByZXNpZGVudHxwYXJ0bmVyLy50ZXN0KF9yb2xlTGV2ZWwpO1xuICBjb25zdCBpc0FjYWRlbWljICA9IC9hY2FkZW1pY3xyZXNlYXJjaHxmYWN1bHR5fHByb2Zlc3Nvcnxwb3N0ZG9jLy50ZXN0KF9yb2xlRG9tYWluICsgJyAnICsgX3JvbGVMZXZlbCk7XG4gIGNvbnN0IHdjVGFyZ2V0ICAgID0gaXNBY2FkZW1pYyA/IHsgbG86IDUwMCwgaGk6IDYwMCwgd2FybkxvOiA0MDAsIHdhcm5IaTogNjUwIH1cbiAgICAgICAgICAgICAgICAgICAgOiBpc0V4ZWMgICAgID8geyBsbzogNDAwLCBoaTogNTAwLCB3YXJuTG86IDMwMCwgd2FybkhpOiA1NTAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7IGxvOiAyNTAsIGhpOiAzMDAsIHdhcm5MbzogMjAwLCB3YXJuSGk6IDQwMCB9O1xuICBjb25zdCB3Y0xhYmVsICAgICA9IGlzQWNhZGVtaWMgPyBgJHt3Y1RhcmdldC5sb31cdTIwMTMke3djVGFyZ2V0LmhpfSAoYWNhZGVtaWMvcmVzZWFyY2gpYFxuICAgICAgICAgICAgICAgICAgICA6IGlzRXhlYyAgICAgPyBgJHt3Y1RhcmdldC5sb31cdTIwMTMke3djVGFyZ2V0LmhpfSAoZXhlY3V0aXZlKWBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYFx1MjI2NCR7d2NUYXJnZXQuaGl9IChzdGFuZGFyZClgO1xuXG4gIGNvbnN0IHdvcmRzICAgID0gdGV4dC50cmltKCkuc3BsaXQoL1xccysvKS5maWx0ZXIoQm9vbGVhbikubGVuZ3RoO1xuICBjb25zdCB3Y1BjdCAgICA9IE1hdGgubWluKDEwMCwgKHdvcmRzIC8gd2NUYXJnZXQuaGkpICogMTAwKTtcbiAgY29uc3Qgd2NDb2xvdXIgPSB3b3JkcyA8IHdjVGFyZ2V0Lndhcm5MbyA/ICcjZWY0NDQ0J1xuICAgICAgICAgICAgICAgICA6IHdvcmRzIDwgd2NUYXJnZXQubG8gICAgICA/ICcjZjU5ZTBiJ1xuICAgICAgICAgICAgICAgICA6IHdvcmRzIDw9IHdjVGFyZ2V0LmhpICAgICA/ICcjMjJjNTVlJ1xuICAgICAgICAgICAgICAgICA6IHdvcmRzIDw9IHdjVGFyZ2V0Lndhcm5IaSA/ICcjZjU5ZTBiJ1xuICAgICAgICAgICAgICAgICA6ICcjZWY0NDQ0JztcbiAgY29uc3Qgd2NTdGF0dXMgPSB3b3JkcyA+PSB3Y1RhcmdldC5sbyAmJiB3b3JkcyA8PSB3Y1RhcmdldC5oaSA/ICdwYXNzJ1xuICAgICAgICAgICAgICAgICA6IHdvcmRzID49IHdjVGFyZ2V0Lndhcm5MbyAmJiB3b3JkcyA8PSB3Y1RhcmdldC53YXJuSGkgPyAnd2FybidcbiAgICAgICAgICAgICAgICAgOiAnZmFpbCc7XG4gIGNvbnN0IHdjQmFyICAgID0gYDxzcGFuIGNsYXNzPVwiY2wtd2MtYmFyXCI+PHNwYW4gY2xhc3M9XCJjbC13Yy1maWxsXCIgc3R5bGU9XCJ3aWR0aDoke3djUGN0fSU7YmFja2dyb3VuZDoke3djQ29sb3VyfTtcIj48L3NwYW4+PC9zcGFuPmA7XG4gIGNvbnN0IHdvcmRDb3VudENoZWNrID0ge1xuICAgIFt3Y1N0YXR1c106IHRydWUsXG4gICAgbGFiZWw6IGBXb3JkIGNvdW50ICgke3djTGFiZWx9KWAsXG4gICAgZGV0YWlsOiBgJHt3b3Jkc30gd29yZHMgJHt3Y0Jhcn0gXHUyMDE0ICR7XG4gICAgICB3b3JkcyA8IHdjVGFyZ2V0LmxvID8gYHRvbyBzaG9ydDsgYWltIGZvciAke3djVGFyZ2V0LmxvfVx1MjAxMyR7d2NUYXJnZXQuaGl9LmBcbiAgICAgIDogd29yZHMgPiB3Y1RhcmdldC5oaSA/IGB0b28gbG9uZzsgdHJpbSB0byAke3djVGFyZ2V0LmhpfSB3b3Jkcy5gXG4gICAgICA6ICd3aXRoaW4gdGFyZ2V0IHJhbmdlLidcbiAgICB9YCxcbiAgfTtcblxuICAvLyBcdTI1MDBcdTI1MDAgUnVsZSA0OiBDYWxsLXRvLWFjdGlvbiBjbG9zaW5nIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICBjb25zdCBsYXN0UGFyYSA9IHRleHQuc3BsaXQoL1xcbnsyLH0vKS5maWx0ZXIocCA9PiBwLnRyaW0oKSkuc2xpY2UoLTEpWzBdIHx8ICcnO1xuICAvLyBBc3NlcnRpdmUgQ1RBczogY2FuZGlkYXRlIHRha2VzIGluaXRpYXRpdmUgKHBhc3MpXG4gIGNvbnN0IGFzc2VydGl2ZUN0YVBhdHRlcm5zID0gW1xuICAgIC9pbnRlcnZpZXcvaSwgL2Rpc2N1c3MvaSwgL29wcG9ydHVuaXR5IHRvIChzcGVha3x0YWxrfG1lZXR8Y29ubmVjdCkvaSxcbiAgICAvaSB3aWxsIChjYWxsfGZvbGxvdy4/dXB8cmVhY2ggb3V0fGNvbnRhY3R8c2VuZCkvaSxcbiAgICAvaSAocGxhbnxpbnRlbmQpIHRvL2ksIC93ZWxjb21lIHRoZSBjaGFuY2UvaSxcbiAgICAvYXZhaWxhYmxlIChmb3J8dG8pL2ksIC9jb250YWN0IG1lL2ksXG4gIF07XG4gIC8vIFBhc3NpdmUgQ1RBczogd2FpdGluZyBmb3IgYSByZXNwb25zZSAoZmFpbCBcdTIwMTQgc3RvcnkgVVMtUDUgcmVxdWlyZXMgcmVqZWN0aW9uKVxuICBjb25zdCBwYXNzaXZlQ3RhUGF0dGVybnMgPSBbXG4gICAgL2hlYXIgZnJvbSB5b3UvaSwgL2xvb2sgZm9yd2FyZCB0byAoeW91cnxoZWFyaW5nKS9pLFxuICAgIC9hd2FpdChpbmcpPyB5b3VyL2ksIC9ob3BlIHRvIChoZWFyfG1lZXQpL2ksXG4gIF07XG4gIGNvbnN0IGhhc0Fzc2VydGl2ZUN0YSA9IGFzc2VydGl2ZUN0YVBhdHRlcm5zLnNvbWUocmUgPT4gcmUudGVzdChsYXN0UGFyYSkpO1xuICBjb25zdCBoYXNQYXNzaXZlQ3RhICAgPSBwYXNzaXZlQ3RhUGF0dGVybnMuc29tZShyZSA9PiByZS50ZXN0KGxhc3RQYXJhKSk7XG4gIGNvbnN0IGN0YUNoZWNrID0ge1xuICAgIHBhc3M6IGhhc0Fzc2VydGl2ZUN0YSxcbiAgICBmYWlsOiAhaGFzQXNzZXJ0aXZlQ3RhICYmIGhhc1Bhc3NpdmVDdGEsXG4gICAgbGFiZWw6ICdDYWxsLXRvLWFjdGlvbiBjbG9zaW5nJyxcbiAgICBkZXRhaWw6IGhhc0Fzc2VydGl2ZUN0YVxuICAgICAgPyAnQXNzZXJ0aXZlIGNhbGwtdG8tYWN0aW9uIFx1MjAxNCB0YWtlcyBpbml0aWF0aXZlLidcbiAgICAgIDogaGFzUGFzc2l2ZUN0YVxuICAgICAgICA/ICdQYXNzaXZlIGNsb3NpbmcgcmVqZWN0ZWQgXHUyMDE0IHBocmFzZXMgbGlrZSBcIkkgbG9vayBmb3J3YXJkIHRvIGhlYXJpbmcgZnJvbSB5b3VcIiBhcmUgdG9vIHBhc3NpdmUuIFJlcGxhY2Ugd2l0aCBhIGRpcmVjdCBpbnRlcnZpZXcgcmVxdWVzdDogXCJJIHdvdWxkIHdlbGNvbWUgdGhlIG9wcG9ydHVuaXR5IHRvIGludGVydmlld1wiIG9yIFwiSSB3aWxsIGZvbGxvdyB1cCBuZXh0IHdlZWsuXCInXG4gICAgICAgIDogJ05vIGNhbGwtdG8tYWN0aW9uIGZvdW5kIFx1MjAxNCBhZGQgYSBkaXJlY3QgaW50ZXJ2aWV3IHJlcXVlc3Qgb3IgcHJvYWN0aXZlIGZvbGxvdy11cCBzdGF0ZW1lbnQuJyxcbiAgfTtcblxuICAvLyBcdTI1MDBcdTI1MDAgUnVsZSA1OiBOYW1lZCBvciBxdWFudGlmaWVkIGFjaGlldmVtZW50IFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICBjb25zdCBhY2hpZXZlbWVudFBhdHRlcm5zID0gW1xuICAgIC9cXGQrJS8sICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwZXJjZW50YWdlc1xuICAgIC9cXCRbXFxkLF0rLywgICAgICAgICAgICAgICAgICAgICAgLy8gZG9sbGFyIGFtb3VudHNcbiAgICAvXFxkKyAodGltZXN8eHxmb2xkfHllYXJ8bW9udGh8d2Vla3xkYXl8dGVhbXxwZW9wbGV8c3RhZmZ8Y2xpZW50fGN1c3RvbWVyfHByb2plY3R8cHJvZHVjdHxzeXN0ZW18YXdhcmR8cGF0ZW50KS9pLFxuICAgIC9yZWR1Y2VkfGluY3JlYXNlZHxncmV3fGdyZXd8ZG91YmxlZHx0cmlwbGVkfHNhdmVkfGdlbmVyYXRlZHxkZWxpdmVyZWR8bGF1bmNoZWR8bGVkfGJ1aWx0fGRlc2lnbmVkfGFyY2hpdGVjdGVkfHBpb25lZXJlZHx3b258YXdhcmRlZHxlYXJuZWR8YWNoaWV2ZWQvaSxcbiAgXTtcbiAgY29uc3QgaGFzQWNoaWV2ZW1lbnQgPSBhY2hpZXZlbWVudFBhdHRlcm5zLnNvbWUocmUgPT4gcmUudGVzdCh0ZXh0KSk7XG4gIGNvbnN0IGFjaGlldmVtZW50Q2hlY2sgPSB7XG4gICAgcGFzczogaGFzQWNoaWV2ZW1lbnQsXG4gICAgd2FybjogIWhhc0FjaGlldmVtZW50LFxuICAgIGxhYmVsOiAnU3BlY2lmaWMgYWNoaWV2ZW1lbnQnLFxuICAgIGRldGFpbDogaGFzQWNoaWV2ZW1lbnRcbiAgICAgID8gJ0NvbnRhaW5zIGEgcXVhbnRpZmllZCBvciBuYW1lZCBhY2hpZXZlbWVudCBcdTIwMTQgZ29vZC4nXG4gICAgICA6ICdObyBxdWFudGlmaWVkIGFjaGlldmVtZW50IGRldGVjdGVkIFx1MjAxNCBhZGQgYXQgbGVhc3Qgb25lIHNwZWNpZmljIHJlc3VsdCAoZS5nLiwgXCJpbmNyZWFzZWQgcmV2ZW51ZSBieSAzMCVcIiwgXCJsZWQgYSB0ZWFtIG9mIDhcIikuJyxcbiAgfTtcblxuICAvLyBcdTI1MDBcdTI1MDAgUnVsZSA3OiBHZW5lcmljIGZpbGxlciBwaHJhc2VzIChHQVAtMTcpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICBjb25zdCBfQ0xfRklMTEVSID0gW1xuICAgICdpIGFtIHdyaXRpbmcgdG8gYXBwbHknLCAnaSBhbSBleGNpdGVkIHRvIGFwcGx5JywgJ2kgYW0gcGxlYXNlZCB0byBhcHBseScsXG4gICAgJ3BsZWFzZSBmaW5kIG15JywgJ2F0dGFjaGVkIHBsZWFzZSBmaW5kJywgJ2VuY2xvc2VkIHBsZWFzZSBmaW5kJyxcbiAgICAndGhpcyBsZXR0ZXIgaXMgdG8gZXhwcmVzcycsICdpIGZlZWwgaSB3b3VsZCBiZSBhIGdyZWF0IGZpdCcsXG4gICAgJ2kgYmVsaWV2ZSBpIHdvdWxkIGJlIGEgcGVyZmVjdCBmaXQnLCAnaSBhbSBjb25maWRlbnQgdGhhdCBpJyxcbiAgICAncmVzdWx0cy1kcml2ZW4nLCAnZGV0YWlsLW9yaWVudGVkJywgJ3NlYXNvbmVkIHByb2Zlc3Npb25hbCcsXG4gICAgJ3Bhc3Npb25hdGUgYWJvdXQnLCAnZHluYW1pYyBwcm9mZXNzaW9uYWwnLCAnaGlnaGx5IG1vdGl2YXRlZCcsXG4gICAgJ3RlYW0gcGxheWVyJywgJ3NlbGYtc3RhcnRlcicsICdoYXJkIHdvcmtpbmcnLFxuICBdO1xuICBjb25zdCBfdGV4dExjICAgID0gdGV4dC50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBmb3VuZEZpbGwgID0gX0NMX0ZJTExFUi5maWx0ZXIocCA9PiBfdGV4dExjLmluY2x1ZGVzKHApKTtcbiAgY29uc3QgZmlsbGVyQ2hlY2sgPSB7XG4gICAgcGFzczogZm91bmRGaWxsLmxlbmd0aCA9PT0gMCxcbiAgICB3YXJuOiBmb3VuZEZpbGwubGVuZ3RoID4gMCAmJiBmb3VuZEZpbGwubGVuZ3RoIDw9IDIsXG4gICAgZmFpbDogZm91bmRGaWxsLmxlbmd0aCA+IDIsXG4gICAgbGFiZWw6ICdGaWxsZXIgcGhyYXNlcycsXG4gICAgZGV0YWlsOiBmb3VuZEZpbGwubGVuZ3RoID09PSAwXG4gICAgICA/ICdObyBnZW5lcmljIGZpbGxlciBwaHJhc2VzIGRldGVjdGVkIFx1MjAxNCBnb29kLidcbiAgICAgIDogYEdlbmVyaWMgcGhyYXNlJHtmb3VuZEZpbGwubGVuZ3RoID4gMSA/ICdzJyA6ICcnfSBkZXRlY3RlZDogJHtmb3VuZEZpbGwuc2xpY2UoMCwgMykubWFwKHAgPT4gYFx1MjAxQyR7cH1cdTIwMURgKS5qb2luKCcsICcpfSR7Zm91bmRGaWxsLmxlbmd0aCA+IDMgPyAnXHUyMDI2JyA6ICcnfSBcdTIwMTQgcmVwbGFjZSB3aXRoIHNwZWNpZmljIHZhbHVlIGNsYWltcy5gLFxuICB9O1xuXG4gIC8vIFx1MjUwMFx1MjUwMCBSZW5kZXIgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIGNvbnN0IGNoZWNrcyA9IFtvcGVuaW5nQ2hlY2ssIGlGaXJzdENoZWNrLCBjb21wYW55Q2hlY2ssIHdvcmRDb3VudENoZWNrLCBjdGFDaGVjaywgYWNoaWV2ZW1lbnRDaGVjaywgZmlsbGVyQ2hlY2tdO1xuICBjb250YWluZXIuaW5uZXJIVE1MID0gY2hlY2tzLm1hcChjID0+IHtcbiAgICBjb25zdCBzdGF0ZSA9IGMucGFzcyA/ICdwYXNzJyA6IGMud2FybiA/ICd3YXJuJyA6ICdmYWlsJztcbiAgICByZXR1cm4gYDxkaXYgY2xhc3M9XCJjbC1jaGVjayAke3N0YXRlfVwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjYy1pY29uXCI+PC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjYy1sYWJlbFwiPiR7ZXNjYXBlSHRtbChjLmxhYmVsKX08L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cImNjLWRldGFpbFwiPiR7Yy5kZXRhaWx9PC9zcGFuPlxuICAgIDwvZGl2PmA7XG4gIH0pLmpvaW4oJycpO1xuXG4gIHBhbmVsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgR2V0IGNvbXBhbnkgbmFtZSBmb3IgY292ZXIgbGV0dGVyIHZhbGlkYXRpb24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIF9nZXRDb21wYW55TmFtZUZvckNMKCkge1xuICAvLyBUcnkgYW5hbHlzaXMgZGF0YSBmaXJzdCwgdGhlbiBmYWxsIGJhY2sgdG8gam9iIGRlc2NyaXB0aW9uIGZpcnN0IGxpbmVcbiAgY29uc3QgYW5hbHlzaXMgPSB3aW5kb3cuX2xhc3RBbmFseXNpc0RhdGEgfHwgKHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zICYmIHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zLmpvYl9hbmFseXNpcyk7XG4gIGlmIChhbmFseXNpcyAmJiBhbmFseXNpcy5jb21wYW55X25hbWUpIHJldHVybiBhbmFseXNpcy5jb21wYW55X25hbWU7XG4gIGlmIChhbmFseXNpcyAmJiBhbmFseXNpcy5jb21wYW55KSAgICAgIHJldHVybiBhbmFseXNpcy5jb21wYW55O1xuICAvLyBGYWxsIGJhY2s6IGZpcnN0IG5vbi1lbXB0eSBsaW5lIG9mIGpvYiBkZXNjcmlwdGlvbiBpbiB0YWJEYXRhXG4gIGNvbnN0IGpkID0gc3RhdGVNYW5hZ2VyLmdldFRhYkRhdGEoJ2pvYicpIHx8ICcnO1xuICBjb25zdCBmaXJzdExpbmUgPSBqZC5zcGxpdCgnXFxuJykuZmluZChsID0+IGwudHJpbSgpKTtcbiAgcmV0dXJuIGZpcnN0TGluZSA/IGZpcnN0TGluZS50cmltKCkuc2xpY2UoMCwgNjApIDogJyc7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFeHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5leHBvcnQge1xuICBDT1ZFUl9MRVRURVJfVE9ORVMsXG4gIF9jb3ZlckxldHRlckZvcm1TdGF0ZSxcbiAgcG9wdWxhdGVDb3ZlckxldHRlclRhYixcbiAgZ2VuZXJhdGVDb3ZlckxldHRlcixcbiAgc2F2ZUNvdmVyTGV0dGVyLFxuICBfcmVuZGVyQ29uc2lzdGVuY3lSZXBvcnQsXG4gIF9kZWJvdW5jZWRWYWxpZGF0ZUNMLFxuICBfdmFsaWRhdGVDb3ZlckxldHRlcixcbiAgX2dldENvbXBhbnlOYW1lRm9yQ0wsXG59O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvc2NyZWVuaW5nLXF1ZXN0aW9ucy5qc1xuICogU2NyZWVuaW5nIHF1ZXN0aW9ucyB0YWI6IHBhcnNlLCBzZWFyY2gsIGdlbmVyYXRlLCBzYXZlIHJlc3BvbnNlcy5cbiAqXG4gKiBEZXBlbmRlbmNpZXMgKHJlc29sdmVkIHRocm91Z2ggZ2xvYmFsVGhpcyBhdCBydW50aW1lKTpcbiAqICAgZXNjYXBlSHRtbCwgc2hvd0FsZXJ0TW9kYWxcbiAqL1xuXG4vLyBcdTI1MDBcdTI1MDAgTW9kdWxlLWxldmVsIHN0YXRlIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4vKiogUGVyLXF1ZXN0aW9uIGRyYWZ0IHN0YXRlOiB7IGZvcm1hdCwgZXhwZXJpZW5jZUluZGljZXMsIHJlc3BvbnNlVGV4dCwgdG9waWNUYWcsIHByaW9yUmVzcG9uc2UgfSAqL1xuY29uc3QgX3NjcmVlbmluZ1N0YXRlID0ge307XG5cbi8qKiBSYXcgdGV4dCBmcm9tIHRoZSBzYy1pbnB1dCB0ZXh0YXJlYSBcdTIwMTQgc3Vydml2ZXMgdGFiIG5hdmlnYXRpb24uICovXG5sZXQgX3NjcmVlbmluZ0lucHV0VGV4dCA9ICcnO1xuXG4vKiogUmVzZXQgZnVuY3Rpb24gZm9yIHRlc3RpbmcgXHUyMDE0IGNsZWFycyBzYXZlZCB0ZXh0YXJlYSBzdGF0ZS4gKi9cbmZ1bmN0aW9uIF9yZXNldFNjcmVlbmluZ0lucHV0VGV4dCgpIHsgX3NjcmVlbmluZ0lucHV0VGV4dCA9ICcnOyB9XG5cbi8vIFx1MjUwMFx1MjUwMCBQb3B1bGF0ZSBzY3JlZW5pbmcgdGFiIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBwb3B1bGF0ZVNjcmVlbmluZ1RhYigpIHtcbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgc3R5bGU9XCJtYXgtd2lkdGg6OTAwcHg7bWFyZ2luOjAgYXV0bztwYWRkaW5nOjIwcHggMTBweDtcIj5cbiAgICAgIDxoMiBzdHlsZT1cImZvbnQtc2l6ZToxLjNlbTtmb250LXdlaWdodDo3MDA7bWFyZ2luLWJvdHRvbTo4cHg7XCI+XHVEODNEXHVEQ0NCIFNjcmVlbmluZyBRdWVzdGlvbnM8L2gyPlxuICAgICAgPHAgY2xhc3M9XCJzYy1pbnRyb1wiPlBhc3RlIG9uZSBvciBtb3JlIHNjcmVlbmluZyBxdWVzdGlvbnMgYmVsb3cgXHUyMDE0IG9uZSBwZXIgbGluZSwgb3Igc2VwYXJhdGVkIGJ5IGJsYW5rIGxpbmVzLiBDbGljayA8c3Ryb25nPlBhcnNlIFF1ZXN0aW9uczwvc3Ryb25nPiB0byBnZW5lcmF0ZSB0YWlsb3JlZCBkcmFmdCByZXNwb25zZXMuPC9wPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6MTBweDthbGlnbi1pdGVtczpmbGV4LXN0YXJ0O21hcmdpbi1ib3R0b206MjBweDtcIj5cbiAgICAgICAgPHRleHRhcmVhIGlkPVwic2MtaW5wdXRcIiByb3dzPVwiNlwiIHN0eWxlPVwiZmxleDoxO3BhZGRpbmc6MTJweDtib3JkZXI6MXB4IHNvbGlkICNlMmU4ZjA7Ym9yZGVyLXJhZGl1czo4cHg7Zm9udC1zaXplOjAuOTNlbTtyZXNpemU6dmVydGljYWw7XCIgcGxhY2Vob2xkZXI9XCJQYXN0ZSBzY3JlZW5pbmcgcXVlc3Rpb25zIGhlcmVcdTIwMjYmIzEwOyYjMTA7RS5nLiYjMTA7RGVzY3JpYmUgYSB0aW1lIHlvdSBsZWQgYSBjcm9zcy1mdW5jdGlvbmFsIHByb2plY3QuJiMxMDsmIzEwO0hvdyBkbyB5b3UgaGFuZGxlIHRpZ2h0IGRlYWRsaW5lcz9cIj48L3RleHRhcmVhPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLXByaW1hcnlcIiBvbmNsaWNrPVwicGFyc2VTY3JlZW5pbmdRdWVzdGlvbnMoKVwiPlBhcnNlIFF1ZXN0aW9uczwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGlkPVwic2MtcXVlc3Rpb25zLWNvbnRhaW5lclwiPjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInNjLXNhdmUtYmFyXCIgaWQ9XCJzYy1zYXZlLWJhclwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29udGludWUtYnRuXCIgaWQ9XCJzYy1zYXZlLWJ0blwiIG9uY2xpY2s9XCJzYXZlU2NyZWVuaW5nUmVzcG9uc2VzKClcIj5cdUQ4M0RcdURDQkUgU2F2ZSBBbGwgUmVzcG9uc2VzPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJuYXYtYnV0dG9ucyBuYXYtZW5kXCIgc3R5bGU9XCJtYXJnaW4tdG9wOjI0cHg7XCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJjb250aW51ZS1idG5cIiBvbmNsaWNrPVwiaGFuZGxlU3RlcENsaWNrKCdpbnRlcnZpZXdfcHJlcCcpXCI+XHVEODNDXHVERkE0IFByb2NlZWQgdG8gSW50ZXJ2aWV3IFByZXAgXHUyMTkyPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xuXG4gIC8vIFJlc3RvcmUgdGhlIHJhdyBpbnB1dCB0ZXh0IGFuZCB3aXJlIHVwIHNhdmUtb24taW5wdXQgbGlzdGVuZXIuXG4gIGNvbnN0IHNjSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2MtaW5wdXQnKTtcbiAgaWYgKHNjSW5wdXQpIHtcbiAgICBpZiAoX3NjcmVlbmluZ0lucHV0VGV4dCkgc2NJbnB1dC52YWx1ZSA9IF9zY3JlZW5pbmdJbnB1dFRleHQ7XG4gICAgc2NJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHsgX3NjcmVlbmluZ0lucHV0VGV4dCA9IHNjSW5wdXQudmFsdWU7IH0pO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBQYXJzZSBxdWVzdGlvbnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIHBhcnNlU2NyZWVuaW5nUXVlc3Rpb25zKCkge1xuICBjb25zdCByYXcgPSAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NjLWlucHV0Jyk/LnZhbHVlIHx8ICcnKS50cmltKCk7XG4gIGlmICghcmF3KSB7IHNob3dBbGVydE1vZGFsKCdcdTI2QTBcdUZFMEYgTm8gSW5wdXQnLCAnUGxlYXNlIHBhc3RlIGF0IGxlYXN0IG9uZSBzY3JlZW5pbmcgcXVlc3Rpb24gZmlyc3QuJyk7IHJldHVybjsgfVxuXG4gIC8vIFNwbGl0IG9uIGJsYW5rIGxpbmVzIChwcmVmZXJyZWQpIG9yIG51bWJlcmVkIGxpc3QgcGF0dGVybnM7IGZpbHRlciBlbXB0eSByZXN1bHRzXG4gIGxldCBxdWVzdGlvbnMgPSByYXcuc3BsaXQoL1xcblxccypcXG4rLykubWFwKHEgPT4gcS50cmltKCkpLmZpbHRlcihCb29sZWFuKTtcbiAgaWYgKHF1ZXN0aW9ucy5sZW5ndGggPT09IDEpIHtcbiAgICAvLyBUcnkgbnVtYmVyZWQgcGF0dGVybnMgbGlrZSBcIjEuIFwiIG9yIFwiMSkgXCIgb3IgXCJRMTpcIiB3aXRob3V0IHJlcXVpcmluZyBzcGFjZSBhZnRlclxuICAgIGNvbnN0IG51bWJlcmVkID0gcmF3LnNwbGl0KC9cXG4oPz1cXGQrWy5cXCldXFxzKig/PVtBLVpdKXxRXFxkK1s6XFwuXT9cXHMqKD89W0EtWl0pKS8pXG4gICAgICAubWFwKHEgPT4gcS50cmltKCkpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGlmIChudW1iZXJlZC5sZW5ndGggPiAxKSBxdWVzdGlvbnMgPSBudW1iZXJlZDtcbiAgfVxuICBpZiAocXVlc3Rpb25zLmxlbmd0aCA9PT0gMSkge1xuICAgIC8vIExhc3QgcmVzb3J0OiBzcGxpdCBvbiBhbnkgc2luZ2xlIG5ld2xpbmUgaWYgd2Ugc3RpbGwgaGF2ZSBqdXN0IG9uZSBcInF1ZXN0aW9uXCJcbiAgICBjb25zdCBzaW5nbGVMaW5lID0gcmF3LnNwbGl0KC9cXG4rLykubWFwKHEgPT4gcS50cmltKCkpLmZpbHRlcihxID0+IHEubGVuZ3RoID4gMCk7XG4gICAgaWYgKHNpbmdsZUxpbmUubGVuZ3RoID4gMSkgcXVlc3Rpb25zID0gc2luZ2xlTGluZTtcbiAgfVxuXG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzYy1xdWVzdGlvbnMtY29udGFpbmVyJyk7XG4gIGNvbnRhaW5lci5pbm5lckhUTUwgPSBxdWVzdGlvbnMubWFwKChxLCBpKSA9PiByZW5kZXJRdWVzdGlvbkJsb2NrKHEsIGkpKS5qb2luKCcnKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NjLXNhdmUtYmFyJykuc3R5bGUuZGlzcGxheSA9IHF1ZXN0aW9ucy5sZW5ndGggPyAnJyA6ICdub25lJztcblxuICAvLyBLaWNrIG9mZiBzZWFyY2hlcyBpbiBwYXJhbGxlbFxuICBxdWVzdGlvbnMuZm9yRWFjaCgocSwgaSkgPT4gc2VhcmNoRm9yUXVlc3Rpb24ocSwgaSkpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgUmVuZGVyIHF1ZXN0aW9uIGJsb2NrIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiByZW5kZXJRdWVzdGlvbkJsb2NrKHF1ZXN0aW9uLCBpZHgpIHtcbiAgcmV0dXJuIGBcbiAgICA8ZGl2IGNsYXNzPVwic2MtcXVlc3Rpb24tYmxvY2tcIiBpZD1cInNjLWJsb2NrLSR7aWR4fVwiIGRhdGEtcXVlc3Rpb249XCIke2VzY2FwZUh0bWwocXVlc3Rpb24pfVwiPlxuICAgICAgPGRpdiBjbGFzcz1cInNjLXF1ZXN0aW9uLWhlYWRlclwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInNjLXF1ZXN0aW9uLW51bVwiPiR7aWR4ICsgMX08L3NwYW4+XG4gICAgICAgIDxzcGFuPiR7ZXNjYXBlSHRtbChxdWVzdGlvbil9PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwic2MtcXVlc3Rpb24tYm9keVwiPlxuICAgICAgICA8ZGl2IGlkPVwic2MtcHJpb3ItJHtpZHh9XCI+PGVtIHN0eWxlPVwiY29sb3I6Izk0YTNiODtmb250LXNpemU6MC44N2VtO1wiPlNlYXJjaGluZyByZXNwb25zZSBsaWJyYXJ5XHUyMDI2PC9lbT48L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cInNjLWV4cC0ke2lkeH1cIj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNjLWZvcm1hdC1yb3dcIiBpZD1cInNjLWZtdC0ke2lkeH1cIj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOiMzNzQxNTE7YWxpZ24tc2VsZjpjZW50ZXI7XCI+Rm9ybWF0Ojwvc3Bhbj5cbiAgICAgICAgICAke1snZGlyZWN0Jywnc3RhcicsJ3RlY2huaWNhbCddLm1hcChmID0+IGBcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzYy1mb3JtYXQtYnRuJHtmID09PSAnZGlyZWN0JyA/ICcgYWN0aXZlJyA6ICcnfVwiIGRhdGEtZm10PVwiJHtmfVwiIG9uY2xpY2s9XCJzZWxlY3RGb3JtYXQoJHtpZHh9LCcke2Z9Jyx0aGlzKVwiPiR7X2ZtdExhYmVsKGYpfTwvYnV0dG9uPmApLmpvaW4oJycpfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1wcmltYXJ5XCIgaWQ9XCJzYy1nZW4tYnRuLSR7aWR4fVwiIG9uY2xpY2s9XCJnZW5lcmF0ZVNjcmVlbmluZ1Jlc3BvbnNlKCR7aWR4fSlcIj5cdTI3MjggR2VuZXJhdGUgRHJhZnQ8L2J1dHRvbj5cbiAgICAgICAgPGRpdiBpZD1cInNjLXJlc3VsdC0ke2lkeH1cIiBzdHlsZT1cIm1hcmdpbi10b3A6MTJweDtcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNjLXRvcGljLXJvd1wiIGlkPVwic2MtdG9waWMtcm93LSR7aWR4fVwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJzYy10b3BpYy0ke2lkeH1cIj5Ub3BpYyB0YWc6PC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJzYy10b3BpYy1pbnB1dFwiIGlkPVwic2MtdG9waWMtJHtpZHh9XCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cImUuZy4gbGVhZGVyc2hpcCwgY3Jvc3MtZnVuY3Rpb25hbCwgZGVhZGxpbmUtbWFuYWdlbWVudFwiPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PmA7XG59XG5cbmZ1bmN0aW9uIF9mbXRMYWJlbChmbXQpIHtcbiAgcmV0dXJuIHsgZGlyZWN0OiAnRGlyZWN0L0NvbmNpc2UgKDE1MFx1MjAxMzIwMHcpJywgc3RhcjogJ1NUQVIgKDI1MFx1MjAxMzM1MHcpJywgdGVjaG5pY2FsOiAnVGVjaG5pY2FsIERldGFpbCAoNDAwXHUyMDEzNTAwdyknIH1bZm10XSB8fCBmbXQ7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBGb3JtYXQgc2VsZWN0aW9uIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBzZWxlY3RGb3JtYXQoaWR4LCBmbXQsIGJ0bikge1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGAjc2MtZm10LSR7aWR4fSAuc2MtZm9ybWF0LWJ0bmApLmZvckVhY2goYiA9PiBiLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpKTtcbiAgYnRuLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICBpZiAoIV9zY3JlZW5pbmdTdGF0ZVtpZHhdKSBfc2NyZWVuaW5nU3RhdGVbaWR4XSA9IHt9O1xuICBfc2NyZWVuaW5nU3RhdGVbaWR4XS5mb3JtYXQgPSBmbXQ7XG59XG5cbmZ1bmN0aW9uIF9nZXRTZWxlY3RlZEZvcm1hdChpZHgpIHtcbiAgY29uc3QgYWN0aXZlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgI3NjLWZtdC0ke2lkeH0gLnNjLWZvcm1hdC1idG4uYWN0aXZlYCk7XG4gIHJldHVybiBhY3RpdmUgPyBhY3RpdmUuZ2V0QXR0cmlidXRlKCdkYXRhLWZtdCcpIDogJ2RpcmVjdCc7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBTZWFyY2ggZm9yIHByaW9yIHJlc3BvbnNlcyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gc2VhcmNoRm9yUXVlc3Rpb24ocXVlc3Rpb24sIGlkeCkge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9zY3JlZW5pbmcvc2VhcmNoJywge1xuICAgICAgbWV0aG9kOiAgJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiAgICBKU09OLnN0cmluZ2lmeSh7IHF1ZXN0aW9uIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmICghZGF0YS5vaykgeyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc2MtcHJpb3ItJHtpZHh9YCkuaW5uZXJIVE1MID0gJyc7IHJldHVybjsgfVxuXG4gICAgLy8gUmVuZGVyIHByaW9yIG1hdGNoXG4gICAgY29uc3QgcHJpb3JFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzYy1wcmlvci0ke2lkeH1gKTtcbiAgICBpZiAoZGF0YS5wcmlvcikge1xuICAgICAgY29uc3QgcCA9IGRhdGEucHJpb3I7XG4gICAgICBwcmlvckVsLmlubmVySFRNTCA9IGBcbiAgICAgICAgPGRpdiBjbGFzcz1cInNjLXByaW9yLW1hdGNoXCI+XG4gICAgICAgICAgPHN0cm9uZz5cdUQ4M0RcdURDREEgU2ltaWxhciBwcmlvciByZXNwb25zZSBmb3VuZDwvc3Ryb25nPiBcdTIwMTQgJHtlc2NhcGVIdG1sKHAuY29tcGFueSB8fCAnJyl9ICgke2VzY2FwZUh0bWwocC5kYXRlIHx8ICcnKX0pPGJyPlxuICAgICAgICAgIDxlbSBzdHlsZT1cImNvbG9yOiM3ODM1MGY7XCI+XCIke2VzY2FwZUh0bWwoKHAucXVlc3Rpb24gfHwgJycpLnN1YnN0cmluZygwLCAxMjApKX1cdTIwMjZcIjwvZW0+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6NnB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtcIj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwic2MtdXNlLXByaW9yLSR7aWR4fVwiIG9uY2hhbmdlPVwidG9nZ2xlUHJpb3JVc2UoJHtpZHh9KVwiPiBVc2UgYXMgc3RhcnRpbmcgcG9pbnRcbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PmA7XG4gICAgICBpZiAoIV9zY3JlZW5pbmdTdGF0ZVtpZHhdKSBfc2NyZWVuaW5nU3RhdGVbaWR4XSA9IHt9O1xuICAgICAgX3NjcmVlbmluZ1N0YXRlW2lkeF0ucHJpb3JSZXNwb25zZSA9IHAucmVzcG9uc2VfdGV4dCB8fCAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgcHJpb3JFbC5pbm5lckhUTUwgPSAnJztcbiAgICB9XG5cbiAgICAvLyBSZW5kZXIgZXhwZXJpZW5jZSBjYXJkc1xuICAgIGNvbnN0IGV4cEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNjLWV4cC0ke2lkeH1gKTtcbiAgICBpZiAoZGF0YS5leHBlcmllbmNlcyAmJiBkYXRhLmV4cGVyaWVuY2VzLmxlbmd0aCkge1xuICAgICAgY29uc3QgY2FyZHMgPSBkYXRhLmV4cGVyaWVuY2VzLm1hcChlID0+IGBcbiAgICAgICAgPGxhYmVsIGNsYXNzPVwic2MtZXhwLWNhcmRcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1pZHg9XCIke2UuaWR4fVwiIGNoZWNrZWQgb25jaGFuZ2U9XCJ1cGRhdGVFeHBTZWxlY3Rpb24oJHtpZHh9KVwiPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmbGV4OjE7XCI+XG4gICAgICAgICAgICA8c3Ryb25nPiR7ZXNjYXBlSHRtbChlLnRpdGxlKX08L3N0cm9uZz4gXHUwMEI3ICR7ZXNjYXBlSHRtbChlLmNvbXBhbnkpfVxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYy1zY29yZS1iYWRnZVwiPiR7TWF0aC5yb3VuZChlLnNjb3JlICogMTAwKX0lIG1hdGNoPC9zcGFuPlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImNvbG9yOiM2NDc0OGI7bWFyZ2luLXRvcDoycHg7XCI+JHtlc2NhcGVIdG1sKGUuc3VtbWFyeSl9PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbGFiZWw+YCkuam9pbignJyk7XG4gICAgICBleHBFbC5pbm5lckhUTUwgPSBgPHAgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjojMzc0MTUxO21hcmdpbi1ib3R0b206NnB4O1wiPlJlbGV2YW50IGV4cGVyaWVuY2U6PC9wPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2MtZXhwLWxpc3RcIj4ke2NhcmRzfTwvZGl2PmA7XG4gICAgICBpZiAoIV9zY3JlZW5pbmdTdGF0ZVtpZHhdKSBfc2NyZWVuaW5nU3RhdGVbaWR4XSA9IHt9O1xuICAgICAgX3NjcmVlbmluZ1N0YXRlW2lkeF0uZXhwZXJpZW5jZUluZGljZXMgPSBkYXRhLmV4cGVyaWVuY2VzLm1hcChlID0+IGUuaWR4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXhwRWwuaW5uZXJIVE1MID0gJyc7XG4gICAgfVxuICB9IGNhdGNoIChfKSB7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNjLXByaW9yLSR7aWR4fWApLmlubmVySFRNTCA9ICcnO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBUb2dnbGUgcHJpb3IgdXNlIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiB0b2dnbGVQcmlvclVzZShpZHgpIHtcbiAgY29uc3QgY2IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc2MtdXNlLXByaW9yLSR7aWR4fWApO1xuICBpZiAoIV9zY3JlZW5pbmdTdGF0ZVtpZHhdKSBfc2NyZWVuaW5nU3RhdGVbaWR4XSA9IHt9O1xuICBfc2NyZWVuaW5nU3RhdGVbaWR4XS51c2VQcmlvciA9IGNiPy5jaGVja2VkID8/IGZhbHNlO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVFeHBTZWxlY3Rpb24oaWR4KSB7XG4gIGNvbnN0IGJsb2NrICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzYy1ibG9jay0ke2lkeH1gKTtcbiAgY29uc3QgY2hlY2tlZCAgID0gQXJyYXkuZnJvbShibG9jay5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFt0eXBlPWNoZWNrYm94XVtkYXRhLWlkeF0nKSlcbiAgICAuZmlsdGVyKGNiID0+IGNiLmNoZWNrZWQpXG4gICAgLm1hcChjYiA9PiBwYXJzZUludChjYi5nZXRBdHRyaWJ1dGUoJ2RhdGEtaWR4JyksIDEwKSk7XG4gIGlmICghX3NjcmVlbmluZ1N0YXRlW2lkeF0pIF9zY3JlZW5pbmdTdGF0ZVtpZHhdID0ge307XG4gIF9zY3JlZW5pbmdTdGF0ZVtpZHhdLmV4cGVyaWVuY2VJbmRpY2VzID0gY2hlY2tlZDtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEdlbmVyYXRlIHNjcmVlbmluZyByZXNwb25zZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVTY3JlZW5pbmdSZXNwb25zZShpZHgpIHtcbiAgLyogZHVja2Zsb3c6XG4gICAqICAgaWQ6IHNjcmVlbmluZ191aV9nZW5lcmF0ZV9saXZlXG4gICAqICAga2luZDogdWlcbiAgICogICB0aW1lc3RhbXA6ICcyMDI2LTAzLTI1VDIxOjM5OjQ4WidcbiAgICogICBzdGF0dXM6IGxpdmVcbiAgICogICBoYW5kbGVzOlxuICAgKiAgIC0gdWk6c2NyZWVuaW5nLmdlbmVyYXRlLXJlc3BvbnNlXG4gICAqICAgY2FsbHM6XG4gICAqICAgLSBQT1NUIC9hcGkvc2NyZWVuaW5nL2dlbmVyYXRlXG4gICAqICAgcmVhZHM6XG4gICAqICAgLSBkb206c2MtcXVlc3Rpb24tYmxvY2sucXVlc3Rpb25cbiAgICogICAtIHdpbmRvdzpfc2NyZWVuaW5nU3RhdGUuZm9ybWF0XG4gICAqICAgLSB3aW5kb3c6X3NjcmVlbmluZ1N0YXRlLnByaW9yUmVzcG9uc2VcbiAgICogICAtIHdpbmRvdzpfc2NyZWVuaW5nU3RhdGUuZXhwZXJpZW5jZUluZGljZXNcbiAgICogICB3cml0ZXM6XG4gICAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9zY3JlZW5pbmcvZ2VuZXJhdGUucXVlc3Rpb25cbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL3NjcmVlbmluZy9nZW5lcmF0ZS5mb3JtYXRcbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL3NjcmVlbmluZy9nZW5lcmF0ZS5leHBlcmllbmNlX2luZGljZXNcbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL3NjcmVlbmluZy9nZW5lcmF0ZS5wcmlvcl9yZXNwb25zZVxuICAgKiAgIC0gd2luZG93Ol9zY3JlZW5pbmdTdGF0ZS5yZXNwb25zZVRleHRcbiAgICogICAtIHdpbmRvdzpfc2NyZWVuaW5nU3RhdGUuZm9ybWF0XG4gICAqICAgbm90ZXM6IEdlbmVyYXRlcyBhIHNpbmdsZSBzY3JlZW5pbmcgcmVzcG9uc2UgZnJvbSB0aGUgc2VsZWN0ZWQgZm9ybWF0LCBwcmlvci1yZXNwb25zZSBzZWVkLCBhbmQgY2hvc2VuIGV4cGVyaWVuY2UgZXZpZGVuY2UsIHRoZW4gc3RvcmVzIHRoZSBkcmFmdCBiYWNrIGludG8gVUkgc3RhdGUgZm9yIGVkaXRpbmcuXG4gICAqL1xuICBjb25zdCBidG4gICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzYy1nZW4tYnRuLSR7aWR4fWApO1xuICBpZiAoYnRuKSB7IGJ0bi5kaXNhYmxlZCA9IHRydWU7IGJ0bi50ZXh0Q29udGVudCA9ICdcdTIzRjMgR2VuZXJhdGluZ1x1MjAyNic7IH1cblxuICBjb25zdCBxdWVzdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzYy1ibG9jay0ke2lkeH1gKT8uZGF0YXNldC5xdWVzdGlvbiB8fCAnJztcbiAgY29uc3Qgc3RhdGUgICAgPSBfc2NyZWVuaW5nU3RhdGVbaWR4XSB8fCB7fTtcbiAgY29uc3QgZm10ICAgICAgPSBfZ2V0U2VsZWN0ZWRGb3JtYXQoaWR4KTtcbiAgY29uc3QgcHJpb3IgICAgPSAoc3RhdGUudXNlUHJpb3IgJiYgc3RhdGUucHJpb3JSZXNwb25zZSkgPyBzdGF0ZS5wcmlvclJlc3BvbnNlIDogJyc7XG4gIGNvbnN0IGV4cElkeCAgID0gc3RhdGUuZXhwZXJpZW5jZUluZGljZXMgPz8gW107XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvc2NyZWVuaW5nL2dlbmVyYXRlJywge1xuICAgICAgbWV0aG9kOiAgJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIHF1ZXN0aW9uLFxuICAgICAgICBmb3JtYXQ6ICAgICAgICAgICAgICBmbXQsXG4gICAgICAgIGV4cGVyaWVuY2VfaW5kaWNlczogIGV4cElkeCxcbiAgICAgICAgcHJpb3JfcmVzcG9uc2U6ICAgICAgcHJpb3IsXG4gICAgICB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoIWRhdGEub2spIHsgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsIGRhdGEuZXJyb3IgfHwgJ0dlbmVyYXRpb24gZmFpbGVkLicpOyByZXR1cm47IH1cblxuICAgIGlmICghX3NjcmVlbmluZ1N0YXRlW2lkeF0pIF9zY3JlZW5pbmdTdGF0ZVtpZHhdID0ge307XG4gICAgX3NjcmVlbmluZ1N0YXRlW2lkeF0ucmVzcG9uc2VUZXh0ID0gZGF0YS50ZXh0O1xuICAgIF9zY3JlZW5pbmdTdGF0ZVtpZHhdLmZvcm1hdCAgICAgICA9IGZtdDtcblxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzYy1yZXN1bHQtJHtpZHh9YCkuaW5uZXJIVE1MID0gYFxuICAgICAgPHRleHRhcmVhIGNsYXNzPVwic2MtcmVzcG9uc2UtdGV4dGFyZWFcIiBpZD1cInNjLXRleHQtJHtpZHh9XCIgcm93cz1cIjdcIlxuICAgICAgICBvbmlucHV0PVwiX3NjcmVlbmluZ1N0YXRlWyR7aWR4fV0gPSBfc2NyZWVuaW5nU3RhdGVbJHtpZHh9XSB8fCB7fTsgX3NjcmVlbmluZ1N0YXRlWyR7aWR4fV0ucmVzcG9uc2VUZXh0ID0gdGhpcy52YWx1ZTtcIlxuICAgICAgPiR7ZXNjYXBlSHRtbChkYXRhLnRleHQpfTwvdGV4dGFyZWE+YDtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc2MtdG9waWMtcm93LSR7aWR4fWApLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIGNvbnRhY3Qgc2VydmVyLicpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChidG4pIHsgYnRuLmRpc2FibGVkID0gZmFsc2U7IGJ0bi50ZXh0Q29udGVudCA9ICdcdTI3MjggR2VuZXJhdGUgRHJhZnQnOyB9XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIFNhdmUgcmVzcG9uc2VzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBzYXZlU2NyZWVuaW5nUmVzcG9uc2VzKCkge1xuICAvKiBkdWNrZmxvdzpcbiAgICogICBpZDogc2NyZWVuaW5nX3VpX3NhdmVfbGl2ZVxuICAgKiAgIGtpbmQ6IHVpXG4gICAqICAgdGltZXN0YW1wOiAnMjAyNi0wMy0yNVQyMTozOTo0OFonXG4gICAqICAgc3RhdHVzOiBsaXZlXG4gICAqICAgaGFuZGxlczpcbiAgICogICAtIHVpOnNjcmVlbmluZy5zYXZlLWFsbFxuICAgKiAgIGNhbGxzOlxuICAgKiAgIC0gUE9TVCAvYXBpL3NjcmVlbmluZy9zYXZlXG4gICAqICAgcmVhZHM6XG4gICAqICAgLSB3aW5kb3c6X3NjcmVlbmluZ1N0YXRlXG4gICAqICAgLSBkb206LnNjLXF1ZXN0aW9uLWJsb2NrXG4gICAqICAgLSBkb206I3NjLXRleHQtKi52YWx1ZVxuICAgKiAgIC0gZG9tOiNzYy10b3BpYy0qLnZhbHVlXG4gICAqICAgd3JpdGVzOlxuICAgKiAgIC0gcmVxdWVzdDpQT1NUIC9hcGkvc2NyZWVuaW5nL3NhdmUucmVzcG9uc2VzXG4gICAqICAgbm90ZXM6IEFnZ3JlZ2F0ZXMgdGhlIGVkaXRlZCBzY3JlZW5pbmcgcmVzcG9uc2VzIGFuZCB0b3BpYyB0YWdzIGZyb20gdGhlIFVJIGludG8gdGhlIHN0cnVjdHVyZWQgcGF5bG9hZCB0aGF0IGJhY2tlbmQgc3RhdGUsIG1ldGFkYXRhLCBhcmNoaXZlIERPQ1gsIGFuZCB0aGUgcmVzcG9uc2UgbGlicmFyeSBhbGwgcGVyc2lzdC5cbiAgICovXG4gIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzYy1zYXZlLWJ0bicpO1xuICBpZiAoYnRuKSB7IGJ0bi5kaXNhYmxlZCA9IHRydWU7IGJ0bi50ZXh0Q29udGVudCA9ICdcdTIzRjMgU2F2aW5nXHUyMDI2JzsgfVxuXG4gIGNvbnN0IHJlc3BvbnNlcyA9IFtdO1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2MtcXVlc3Rpb24tYmxvY2snKS5mb3JFYWNoKChibG9jaywgaSkgPT4ge1xuICAgIGNvbnN0IHFFbCAgICA9IGJsb2NrLnF1ZXJ5U2VsZWN0b3IoJy5zYy1xdWVzdGlvbi1oZWFkZXIgc3BhbjpsYXN0LWNoaWxkJyk7XG4gICAgY29uc3QgdGV4dEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNjLXRleHQtJHtpfWApO1xuICAgIGNvbnN0IHRvcGljRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc2MtdG9waWMtJHtpfWApO1xuICAgIGlmICghdGV4dEVsKSByZXR1cm47IC8vIG5vdCB5ZXQgZ2VuZXJhdGVkIFx1MjAxNCBza2lwXG5cbiAgICBjb25zdCBxdWVzdGlvbiAgICAgPSBxRWwgPyBxRWwudGV4dENvbnRlbnQudHJpbSgpIDogJyc7XG4gICAgY29uc3QgcmVzcG9uc2VUZXh0ID0gKF9zY3JlZW5pbmdTdGF0ZVtpXT8ucmVzcG9uc2VUZXh0KSB8fCB0ZXh0RWwudmFsdWUgfHwgJyc7XG4gICAgY29uc3QgZm10ICAgICAgICAgID0gX2dldFNlbGVjdGVkRm9ybWF0KGkpO1xuICAgIGNvbnN0IHRvcGljVGFnICAgICA9IHRvcGljRWwgPyB0b3BpY0VsLnZhbHVlLnRyaW0oKSA6ICcnO1xuXG4gICAgcmVzcG9uc2VzLnB1c2goeyBxdWVzdGlvbiwgdG9waWNfdGFnOiB0b3BpY1RhZywgZm9ybWF0OiBmbXQsIHJlc3BvbnNlX3RleHQ6IHJlc3BvbnNlVGV4dCB9KTtcbiAgfSk7XG5cbiAgaWYgKCFyZXNwb25zZXMubGVuZ3RoKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjZBMFx1RkUwRiBOb3RoaW5nIHRvIFNhdmUnLCAnUGxlYXNlIGdlbmVyYXRlIGF0IGxlYXN0IG9uZSByZXNwb25zZSBiZWZvcmUgc2F2aW5nLicpO1xuICAgIGlmIChidG4pIHsgYnRuLmRpc2FibGVkID0gZmFsc2U7IGJ0bi50ZXh0Q29udGVudCA9ICdcdUQ4M0RcdURDQkUgU2F2ZSBBbGwgUmVzcG9uc2VzJzsgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL3NjcmVlbmluZy9zYXZlJywge1xuICAgICAgbWV0aG9kOiAgJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiAgICBKU09OLnN0cmluZ2lmeSh7IHJlc3BvbnNlcyB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjcwNSBTYXZlZCcsIGAke2RhdGEuY291bnR9IHJlc3BvbnNlJHtkYXRhLmNvdW50ICE9PSAxID8gJ3MnIDogJyd9IHNhdmVkIGFzIDxzdHJvbmc+JHtlc2NhcGVIdG1sKGRhdGEuZmlsZW5hbWUpfTwvc3Ryb25nPiBhbmQgYWRkZWQgdG8geW91ciByZXNwb25zZSBsaWJyYXJ5LmApO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIFNhdmUgRmFpbGVkJywgZGF0YS5lcnJvciB8fCAnQ291bGQgbm90IHNhdmUgcmVzcG9uc2VzLicpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIGNvbnRhY3Qgc2VydmVyLicpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChidG4pIHsgYnRuLmRpc2FibGVkID0gZmFsc2U7IGJ0bi50ZXh0Q29udGVudCA9ICdcdUQ4M0RcdURDQkUgU2F2ZSBBbGwgUmVzcG9uc2VzJzsgfVxuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFeHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5leHBvcnQge1xuICBfc2NyZWVuaW5nU3RhdGUsXG4gIF9zY3JlZW5pbmdJbnB1dFRleHQsXG4gIF9yZXNldFNjcmVlbmluZ0lucHV0VGV4dCxcbiAgcG9wdWxhdGVTY3JlZW5pbmdUYWIsXG4gIHBhcnNlU2NyZWVuaW5nUXVlc3Rpb25zLFxuICByZW5kZXJRdWVzdGlvbkJsb2NrLFxuICBfZm10TGFiZWwsXG4gIHNlbGVjdEZvcm1hdCxcbiAgX2dldFNlbGVjdGVkRm9ybWF0LFxuICBzZWFyY2hGb3JRdWVzdGlvbixcbiAgdG9nZ2xlUHJpb3JVc2UsXG4gIHVwZGF0ZUV4cFNlbGVjdGlvbixcbiAgZ2VuZXJhdGVTY3JlZW5pbmdSZXNwb25zZSxcbiAgc2F2ZVNjcmVlbmluZ1Jlc3BvbnNlcyxcbn07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9maW5hbGlzZS5qc1xuICogRmluYWxpc2UgJiBhcmNoaXZlIHRhYjogZmluYWxpc2UgYXBwbGljYXRpb24sIGhhcnZlc3QgY2FuZGlkYXRlcyxcbiAqIGFwcGx5IHNlbGVjdGVkIHVwZGF0ZXMgdG8gbWFzdGVyIENWIGRhdGEuXG4gKlxuICogRGVwZW5kZW5jaWVzIChyZXNvbHZlZCB0aHJvdWdoIGdsb2JhbFRoaXMgYXQgcnVudGltZSk6XG4gKiAgIGVzY2FwZUh0bWwsIF9yZW5kZXJDb25zaXN0ZW5jeVJlcG9ydFxuICovXG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IGZvcm1hdEF0c1Njb3JlU3VtbWFyeSB9IGZyb20gJy4vYXRzLXJlZmluZW1lbnQuanMnO1xuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdmaW5hbGlzZScpO1xuXG5mdW5jdGlvbiBfZm9ybWF0RHVyYXRpb24oc2Vjcykge1xuICBpZiAoc2VjcyA9PSBudWxsIHx8IHNlY3MgPCAwKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgaCA9IE1hdGguZmxvb3Ioc2VjcyAvIDM2MDApO1xuICBjb25zdCBtID0gTWF0aC5mbG9vcigoc2VjcyAlIDM2MDApIC8gNjApO1xuICBjb25zdCBzID0gc2VjcyAlIDYwO1xuICBpZiAoaCA+IDApIHJldHVybiBgJHtofWggJHttfW1gO1xuICBpZiAobSA+IDApIHJldHVybiBgJHttfW0gJHtzfXNgO1xuICByZXR1cm4gYCR7c31zYDtcbn1cblxuZnVuY3Rpb24gX3JlbmRlckZpbmFsaXNlQXRzSXRlbXMoc2NvcmUsIGF0c0tleXdvcmRzKSB7XG4gIGlmICghc2NvcmUgfHwgdHlwZW9mIHNjb3JlLm92ZXJhbGwgIT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGA8bGk+QVRTIGtleXdvcmRzIHRyYWNrZWQ6ICR7YXRzS2V5d29yZHMubGVuZ3RofTwvbGk+YDtcbiAgfVxuXG4gIGNvbnN0IHN1bW1hcnkgPSBmb3JtYXRBdHNTY29yZVN1bW1hcnkoc2NvcmUpO1xuICBjb25zdCBoYXJkU2NvcmUgPSB0eXBlb2Ygc2NvcmUuaGFyZF9yZXF1aXJlbWVudF9zY29yZSA9PT0gJ251bWJlcidcbiAgICA/IGAke01hdGgucm91bmQoc2NvcmUuaGFyZF9yZXF1aXJlbWVudF9zY29yZSl9JWBcbiAgICA6ICduL2EnO1xuICBjb25zdCBzb2Z0U2NvcmUgPSB0eXBlb2Ygc2NvcmUuc29mdF9yZXF1aXJlbWVudF9zY29yZSA9PT0gJ251bWJlcidcbiAgICA/IGAke01hdGgucm91bmQoc2NvcmUuc29mdF9yZXF1aXJlbWVudF9zY29yZSl9JWBcbiAgICA6ICduL2EnO1xuXG4gIHJldHVybiBbXG4gICAgYDxsaT5BVFMgc2NvcmU6IDxzdHJvbmc+JHtzdW1tYXJ5Lm92ZXJhbGx9JTwvc3Ryb25nPiA8c3BhbiBzdHlsZT1cImNvbG9yOiM0NzU1Njk7XCI+KGhhcmQgJHtoYXJkU2NvcmV9IFx1MjAyMiBzb2Z0ICR7c29mdFNjb3JlfSk8L3NwYW4+PC9saT5gLFxuICAgIGA8bGk+QVRTIGNvdmVyYWdlOiAke2VzY2FwZUh0bWwoc3VtbWFyeS5saW5lKX08L2xpPmAsXG4gICAgYDxsaT5BVFMgZGV0YWlsOiAke2VzY2FwZUh0bWwoc3VtbWFyeS5kZXRhaWwpfTwvbGk+YCxcbiAgXS5qb2luKCcnKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFBvcHVsYXRlIGZpbmFsaXNlIHRhYiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gcG9wdWxhdGVGaW5hbGlzZVRhYigpIHtcbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG5cbiAgLy8gRmV0Y2ggY3VycmVudCBzdGF0dXMgdG8gZ2V0IGdlbmVyYXRlZCBmaWxlcyBhbmQgam9iIGFuYWx5c2lzIGZvciBjb25zaXN0ZW5jeSBjaGVja1xuICBsZXQgZ2VuZXJhdGVkICA9IG51bGw7XG4gIGxldCBzdGF0dXNEYXRhID0gbnVsbDtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvc3RhdHVzJyk7XG4gICAgc3RhdHVzRGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgZ2VuZXJhdGVkICA9IHN0YXR1c0RhdGEuZ2VuZXJhdGVkX2ZpbGVzIHx8IG51bGw7XG4gIH0gY2F0Y2ggKGVycikgeyBsb2cud2FybignRmFpbGVkIHRvIGZldGNoIHN0YXR1cyBmb3IgZmluYWxpc2UgdGFiOicsIGVycik7IH1cblxuICBpZiAoIWdlbmVyYXRlZCB8fCAhZ2VuZXJhdGVkLm91dHB1dF9kaXIpIHtcbiAgICBjb250ZW50LmlubmVySFRNTCA9IGBcbiAgICAgIDxoMT5cdTI3MDUgRmluYWxpc2UgQXBwbGljYXRpb248L2gxPlxuICAgICAgPGRpdiBjbGFzcz1cImVtcHR5LXN0YXRlXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpY29uXCI+XHVEODNEXHVEQ0MyPC9kaXY+XG4gICAgICAgIDxoMz5ObyBDViBHZW5lcmF0ZWQgWWV0PC9oMz5cbiAgICAgICAgPHA+UGxlYXNlIGdlbmVyYXRlIGEgQ1YgZmlyc3QgYmVmb3JlIGZpbmFsaXNpbmcuPC9wPlxuICAgICAgPC9kaXY+YDtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBmaWxlcyA9IGdlbmVyYXRlZC5maWxlcyB8fCBbXTtcblxuICBsZXQgaHRtbCA9IGBcbiAgICA8aDE+XHUyNzA1IEZpbmFsaXNlIEFwcGxpY2F0aW9uPC9oMT5cbiAgICA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7bWFyZ2luLWJvdHRvbToyNHB4O1wiPlxuICAgICAgQXJjaGl2ZSB0aGlzIGFwcGxpY2F0aW9uIHRvIHlvdXIgQ1YgaGlzdG9yeSwgdXBkYXRlIHRoZSByZXNwb25zZSBsaWJyYXJ5LCBhbmQgb3B0aW9uYWxseVxuICAgICAgd3JpdGUgYW55IGltcHJvdmVtZW50cyBiYWNrIHRvIE1hc3RlciBDViBEYXRhLlxuICAgIDwvcD5cblxuICAgIDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmMGZkZjQ7Ym9yZGVyOjFweCBzb2xpZCAjYmJmN2QwO2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MTZweDttYXJnaW4tYm90dG9tOjI0cHg7XCI+XG4gICAgICA8aDMgc3R5bGU9XCJtYXJnaW46MCAwIDEwcHg7XCI+XHVEODNEXHVEQ0MyIEdlbmVyYXRlZCBGaWxlczwvaDM+XG4gICAgICA8dWwgc3R5bGU9XCJtYXJnaW46MDtwYWRkaW5nLWxlZnQ6MjBweDtsaW5lLWhlaWdodDoxLjg7XCI+XG4gICAgICAgICR7ZmlsZXMubWFwKGYgPT4gYDxsaT48Y29kZSBzdHlsZT1cImZvbnQtc2l6ZTowLjllbTtcIj4ke2VzY2FwZUh0bWwoZil9PC9jb2RlPjwvbGk+YCkuam9pbignJykgfHwgJzxsaT4obm9uZSk8L2xpPid9XG4gICAgICA8L3VsPlxuICAgICAgPHAgc3R5bGU9XCJtYXJnaW46OHB4IDAgMDtmb250LXNpemU6MC44NWVtO2NvbG9yOiMxNjY1MzQ7XCI+T3V0cHV0IGRpcjogPGNvZGU+JHtlc2NhcGVIdG1sKGdlbmVyYXRlZC5vdXRwdXRfZGlyKX08L2NvZGU+PC9wPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBpZD1cInJlYWRpbmVzcy1jaGVja2xpc3RcIj48L2Rpdj5cbiAgICA8ZGl2IGlkPVwiY29uc2lzdGVuY3ktcmVwb3J0XCI+PC9kaXY+XG4gICAgPGRpdiBpZD1cInJld3JpdGUtYXVkaXQtbG9nXCI+PC9kaXY+XG5cbiAgICA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZmZmO2JvcmRlcjoxcHggc29saWQgI2UyZThmMDtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjIwcHg7bWFyZ2luLWJvdHRvbToyNHB4O1wiPlxuICAgICAgPGgzIHN0eWxlPVwibWFyZ2luOjAgMCAxNnB4O1wiPlx1RDgzRFx1RENDQiBBcHBsaWNhdGlvbiBTdGF0dXM8L2gzPlxuXG4gICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNnB4O1wiPlxuICAgICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjZweDtcIiBmb3I9XCJmaW5hbGlzZS1zdGF0dXNcIj5TdGF0dXM8L2xhYmVsPlxuICAgICAgICA8c2VsZWN0IGlkPVwiZmluYWxpc2Utc3RhdHVzXCIgc3R5bGU9XCJ3aWR0aDoyMjBweDtwYWRkaW5nOjhweCAxMHB4O2JvcmRlcjoxcHggc29saWQgI2NiZDVlMTtib3JkZXItcmFkaXVzOjZweDtmb250LXNpemU6MC45NWVtO1wiPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJkcmFmdFwiPkRyYWZ0IFx1MjAxNCBub3QgeWV0IHNlbnQ8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicmVhZHlcIiBzZWxlY3RlZD5SZWFkeSB0byBzZW5kPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInNlbnRcIj5TZW50PC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImludGVydmlld1wiPkludGVydmlldyBzY2hlZHVsZWQ8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicmVqZWN0ZWRcIj5SZWplY3RlZDwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJhY2NlcHRlZFwiPkFjY2VwdGVkPC9vcHRpb24+XG4gICAgICAgIDwvc2VsZWN0PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjIwcHg7XCI+XG4gICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NnB4O1wiIGZvcj1cImZpbmFsaXNlLW5vdGVzXCI+Tm90ZXM8L2xhYmVsPlxuICAgICAgICA8dGV4dGFyZWEgaWQ9XCJmaW5hbGlzZS1ub3Rlc1wiIHJvd3M9XCI0XCIgbWF4bGVuZ3RoPVwiMjAwMFwiXG4gICAgICAgICAgb25pbnB1dD1cImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaW5hbGlzZS1ub3Rlcy1jb3VudGVyJykudGV4dENvbnRlbnQ9dGhpcy52YWx1ZS5sZW5ndGgrJyAvIDIwMDAnO2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaW5hbGlzZS1ub3Rlcy1jb3VudGVyJykuc3R5bGUuY29sb3I9dGhpcy52YWx1ZS5sZW5ndGg+MTgwMD8nI2RjMjYyNic6dGhpcy52YWx1ZS5sZW5ndGg+MTYwMD8nI2Q5NzcwNic6JyM2YjcyODAnXCJcbiAgICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7cGFkZGluZzoxMHB4O2JvcmRlcjoxcHggc29saWQgI2NiZDVlMTtib3JkZXItcmFkaXVzOjZweDtcbiAgICAgICAgICAgICAgICAgZm9udC1zaXplOjAuOTJlbTtyZXNpemU6dmVydGljYWw7Ym94LXNpemluZzpib3JkZXItYm94O1wiXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJSZWNydWl0ZXIgbmFtZSwgc2FsYXJ5IGluZm8sIGZvbGxvdy11cCBkYXRlLCBpbnRlcnZpZXcgbm90ZXNcdTIwMjZcIj48L3RleHRhcmVhPlxuICAgICAgICA8ZGl2IGlkPVwiZmluYWxpc2Utbm90ZXMtY291bnRlclwiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiIHN0eWxlPVwidGV4dC1hbGlnbjpyaWdodDtmb250LXNpemU6MC44ZW07Y29sb3I6IzZiNzI4MDttYXJnaW4tdG9wOjJweDtcIj4wIC8gMjAwMDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxidXR0b24gaWQ9XCJmaW5hbGlzZS1idG5cIiBvbmNsaWNrPVwiZmluYWxpc2VBcHBsaWNhdGlvbigpXCJcbiAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiMwNTk2Njk7Y29sb3I6I2ZmZjtib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjZweDtcbiAgICAgICAgICAgICAgIHBhZGRpbmc6MTBweCAyNHB4O2ZvbnQtc2l6ZToxZW07Zm9udC13ZWlnaHQ6NjAwO2N1cnNvcjpwb2ludGVyO1wiPlxuICAgICAgICBcdTI3MDUgRmluYWxpc2UgJmFtcDsgQXJjaGl2ZVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGlkPVwiZmluYWxpc2UtcmVzdWx0XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+PC9kaXY+XG4gICAgPGRpdiBpZD1cImhhcnZlc3Qtc2VjdGlvblwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPjwvZGl2PlxuICBgO1xuXG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gaHRtbDtcbiAgX3JlbmRlclJlYWRpbmVzc0NoZWNrbGlzdChmaWxlcywgc3RhdHVzRGF0YSk7XG4gIGlmIChzdGF0dXNEYXRhKSBfcmVuZGVyQ29uc2lzdGVuY3lSZXBvcnQoc3RhdHVzRGF0YSk7XG4gIF9yZW5kZXJSZXdyaXRlQXVkaXRMb2coKTtcbiAgX3Jlc3RvcmVGaW5hbGlzZU1ldGEoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gX3Jlc3RvcmVGaW5hbGlzZU1ldGEoKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvZmluYWxpc2UtbWV0YScpO1xuICAgIGlmICghcmVzLm9rKSByZXR1cm47XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgY29uc3Qgc3RhdHVzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmluYWxpc2Utc3RhdHVzJyk7XG4gICAgY29uc3Qgbm90ZXNFbCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmluYWxpc2Utbm90ZXMnKTtcbiAgICBpZiAoc3RhdHVzRWwgJiYgZGF0YS5hcHBsaWNhdGlvbl9zdGF0dXMpIHN0YXR1c0VsLnZhbHVlID0gZGF0YS5hcHBsaWNhdGlvbl9zdGF0dXM7XG4gICAgaWYgKG5vdGVzRWwgICYmIGRhdGEubm90ZXMpIHtcbiAgICAgIG5vdGVzRWwudmFsdWUgPSBkYXRhLm5vdGVzO1xuICAgICAgY29uc3QgY291bnRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaW5hbGlzZS1ub3Rlcy1jb3VudGVyJyk7XG4gICAgICBpZiAoY291bnRlcikge1xuICAgICAgICBjb25zdCBsZW4gPSBkYXRhLm5vdGVzLmxlbmd0aDtcbiAgICAgICAgY291bnRlci50ZXh0Q29udGVudCA9IGAke2xlbn0gLyAyMDAwYDtcbiAgICAgICAgY291bnRlci5zdHlsZS5jb2xvciA9IGxlbiA+IDE4MDAgPyAnI2RjMjYyNicgOiBsZW4gPiAxNjAwID8gJyNkOTc3MDYnIDogJyM2YjcyODAnO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoXykge31cbn1cblxuLy8gXHUyNTAwXHUyNTAwIFN1Ym1pc3Npb24gcmVhZGluZXNzIGNoZWNrbGlzdCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gX3JlbmRlclJlYWRpbmVzc0NoZWNrbGlzdChmaWxlcywgc3RhdHVzRGF0YSkge1xuICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWFkaW5lc3MtY2hlY2tsaXN0Jyk7XG4gIGlmICghZWwpIHJldHVybjtcblxuICBjb25zdCBmaWxlU2V0ID0gbmV3IFNldCgoZmlsZXMgfHwgW10pLm1hcChmID0+IChmIHx8ICcnKS50b0xvd2VyQ2FzZSgpKSk7XG4gIGNvbnN0IGhhc1BkZiAgPSBbLi4uZmlsZVNldF0uc29tZShmID0+IGYuZW5kc1dpdGgoJy5wZGYnKSAmJiAhZi5pbmNsdWRlcygnY292ZXJsZXR0ZXInKSAmJiAhZi5pbmNsdWRlcygnY292ZXJfbGV0dGVyJykpO1xuICBjb25zdCBoYXNEb2N4ID0gWy4uLmZpbGVTZXRdLnNvbWUoZiA9PiBmLmVuZHNXaXRoKCcuZG9jeCcpICYmICFmLmluY2x1ZGVzKCdjb3ZlcmxldHRlcicpICYmICFmLmluY2x1ZGVzKCdjb3Zlcl9sZXR0ZXInKSAmJiAhZi5pbmNsdWRlcygnc2NyZWVuaW5nJykpO1xuICBjb25zdCBoYXNIdG1sID0gWy4uLmZpbGVTZXRdLnNvbWUoZiA9PiBmLmVuZHNXaXRoKCcuaHRtbCcpKTtcbiAgY29uc3QgaGFzQ2wgICA9IFsuLi5maWxlU2V0XS5zb21lKGYgPT4gZi5pbmNsdWRlcygnY292ZXJsZXR0ZXInKSB8fCBmLmluY2x1ZGVzKCdjb3Zlcl9sZXR0ZXInKSk7XG4gIGNvbnN0IGhhc1NjciAgPSBbLi4uZmlsZVNldF0uc29tZShmID0+IGYuaW5jbHVkZXMoJ3NjcmVlbmluZycpKTtcblxuICBjb25zdCBhdHNDaGVja3MgID0gc3RhdHVzRGF0YT8uYXRzX2NoZWNrcyB8fCBbXTtcbiAgY29uc3QgYXRzRmFpbHMgICA9IChhdHNDaGVja3MpLmZpbHRlcihjID0+IGMuc3RhdHVzID09PSAnZmFpbCcgfHwgYy5zdGF0dXMgPT09ICdlcnJvcicpLmxlbmd0aDtcbiAgY29uc3QgYXRzU2Nhbm5lZCA9IGF0c0NoZWNrcy5sZW5ndGggPiAwO1xuXG4gIGNvbnN0IGxheW91dEZyZXNoID0gc3RhdHVzRGF0YT8ubGF5b3V0X2ZyZXNobmVzcyAhPT0gJ3N0YWxlJztcblxuICBjb25zdCBpdGVtcyA9IFtcbiAgICB7IG9rOiBoYXNQZGYsICAgbGFiZWw6ICdDViBQREYgZ2VuZXJhdGVkJywgICAgICAgIHdhcm46IGZhbHNlIH0sXG4gICAgeyBvazogaGFzRG9jeCwgIGxhYmVsOiAnQ1YgRE9DWCBnZW5lcmF0ZWQnLCAgICAgICB3YXJuOiBmYWxzZSB9LFxuICAgIHsgb2s6IGhhc0h0bWwsICBsYWJlbDogJ0NWIEhUTUwgZ2VuZXJhdGVkJywgICAgICAgd2FybjogZmFsc2UgfSxcbiAgICB7IG9rOiBoYXNDbCwgICAgbGFiZWw6ICdDb3ZlciBsZXR0ZXIgZ2VuZXJhdGVkJywgIHdhcm46IHRydWUgIH0sXG4gICAgeyBvazogaGFzU2NyLCAgIGxhYmVsOiAnU2NyZWVuaW5nIFEmQSBnZW5lcmF0ZWQnLCB3YXJuOiB0cnVlICB9LFxuICAgIHsgb2s6IGF0c1NjYW5uZWQgJiYgYXRzRmFpbHMgPT09IDAsIHdhcm46IHRydWUsXG4gICAgICBsYWJlbDogYXRzU2Nhbm5lZFxuICAgICAgICA/IChhdHNGYWlscyA+IDAgPyBgQVRTIHZhbGlkYXRpb24gXHUyMDE0ICR7YXRzRmFpbHN9IGlzc3VlJHthdHNGYWlscyAhPT0gMSA/ICdzJyA6ICcnfSBmb3VuZGAgOiAnQVRTIHZhbGlkYXRpb24gcGFzc2VkJylcbiAgICAgICAgOiAnQVRTIHZhbGlkYXRpb24gbm90IHlldCBydW4nIH0sXG4gICAgeyBvazogbGF5b3V0RnJlc2gsIHdhcm46IHRydWUsIGxhYmVsOiAnTGF5b3V0IGlzIGN1cnJlbnQgKG5vdCBzdGFsZSknIH0sXG4gIF07XG5cbiAgY29uc3Qgcm93cyA9IGl0ZW1zLm1hcCgoeyBvaywgbGFiZWwsIHdhcm4gfSkgPT4ge1xuICAgIGNvbnN0IGljb24gID0gb2sgPyAnXHUyNzA1JyA6ICh3YXJuID8gJ1x1MjZBMCcgOiAnXHUyNzRDJyk7XG4gICAgY29uc3QgY29sb3IgPSBvayA/ICcjMDY1ZjQ2JyA6ICh3YXJuID8gJyM5MjQwMGUnIDogJyM5OTFiMWInKTtcbiAgICBjb25zdCBiZyAgICA9IG9rID8gJyNmMGZkZjQnIDogKHdhcm4gPyAnI2ZmZmJlYicgOiAnI2ZlZjJmMicpO1xuICAgIHJldHVybiBgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjEwcHg7cGFkZGluZzo4cHggMTJweDtiYWNrZ3JvdW5kOiR7Ymd9O2JvcmRlci1yYWRpdXM6NnB4O21hcmdpbi1ib3R0b206NnB4O1wiPlxuICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCIgc3R5bGU9XCJmb250LXNpemU6MS4xZW07XCI+JHtpY29ufTwvc3Bhbj5cbiAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6JHtjb2xvcn07Zm9udC1zaXplOjAuOTJlbTtcIj4ke2VzY2FwZUh0bWwobGFiZWwpfTwvc3Bhbj5cbiAgICA8L2Rpdj5gO1xuICB9KS5qb2luKCcnKTtcblxuICBjb25zdCBhbGxSZXF1aXJlZCA9IGhhc1BkZiAmJiBoYXNEb2N4ICYmIGhhc0h0bWw7XG4gIGNvbnN0IGhlYWRlckNvbG9yID0gYWxsUmVxdWlyZWQgPyAnIzA2NWY0NicgOiAnIzkyNDAwZSc7XG4gIGVsLmlubmVySFRNTCA9IGBcbiAgICA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZmZmO2JvcmRlcjoxcHggc29saWQgI2UyZThmMDtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjE2cHggMjBweDttYXJnaW4tYm90dG9tOjI0cHg7XCI+XG4gICAgICA8aDMgc3R5bGU9XCJtYXJnaW46MCAwIDEycHg7Y29sb3I6JHtoZWFkZXJDb2xvcn07XCI+XHVEODNEXHVEQ0NCIFN1Ym1pc3Npb24gUmVhZGluZXNzPC9oMz5cbiAgICAgICR7cm93c31cbiAgICAgIDxwIHN0eWxlPVwibWFyZ2luOjEwcHggMCAwO2ZvbnQtc2l6ZTowLjgyZW07Y29sb3I6IzY0NzQ4YjtcIj5cbiAgICAgICAgXHUyNkEwIGl0ZW1zIGFyZSBvcHRpb25hbCBcdTIwMTQgdGhleSB3YXJuIGJ1dCBkbyBub3QgYmxvY2sgYXJjaGl2aW5nLlxuICAgICAgICBcdTI3NEMgaXRlbXMgbXVzdCBiZSByZXNvbHZlZCBiZWZvcmUgc3VibWl0dGluZy5cbiAgICAgIDwvcD5cbiAgICA8L2Rpdj5gO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgUmV3cml0ZSBhdWRpdCBsb2cgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIF9yZW5kZXJSZXdyaXRlQXVkaXRMb2coKSB7XG4gIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jld3JpdGUtYXVkaXQtbG9nJyk7XG4gIGlmICghZWwpIHJldHVybjtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvcmV3cml0ZXMnKTtcbiAgICBpZiAoIXJlcy5vaykgcmV0dXJuO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGNvbnN0IGF1ZGl0ID0gZGF0YS5yZXdyaXRlX2F1ZGl0IHx8IFtdO1xuICAgIGlmIChhdWRpdC5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICBjb25zdCByb3dzID0gYXVkaXQubWFwKGVudHJ5ID0+IHtcbiAgICAgIGNvbnN0IG91dGNvbWUgPSBlbnRyeS5vdXRjb21lIHx8IGVudHJ5LmRlY2lzaW9uIHx8ICdcdTIwMTQnO1xuICAgICAgY29uc3QgaWNvbiA9IG91dGNvbWUgPT09ICdhY2NlcHRlZCcgPyAnXHUyNzA1JyA6IG91dGNvbWUgPT09ICdlZGl0ZWQnID8gJ1x1MjcwRlx1RkUwRicgOiBvdXRjb21lID09PSAncmVqZWN0ZWQnID8gJ1x1Mjc0QycgOiAnXHUyMDE0JztcbiAgICAgIGNvbnN0IG9yaWdpbmFsICA9IGVzY2FwZUh0bWwoKGVudHJ5Lm9yaWdpbmFsX3RleHQgfHwgZW50cnkub3JpZ2luYWwgfHwgJycpLnNsaWNlKDAsIDEyMCkpO1xuICAgICAgY29uc3QgZmluYWwgICAgID0gZXNjYXBlSHRtbCgoZW50cnkuZmluYWxfdGV4dCB8fCBlbnRyeS5yZXdyaXR0ZW4gfHwgZW50cnkuc3VnZ2VzdGVkIHx8ICcnKS5zbGljZSgwLCAxMjApKTtcbiAgICAgIGNvbnN0IGZpZWxkICAgICA9IGVzY2FwZUh0bWwoZW50cnkuZmllbGQgfHwgZW50cnkudHlwZSB8fCAnXHUyMDE0Jyk7XG4gICAgICByZXR1cm4gYDx0cj5cbiAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzo2cHggOHB4O2ZvbnQtc2l6ZTowLjhlbTtjb2xvcjojNmI3MjgwO1wiPiR7ZmllbGR9PC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzo2cHggOHB4O2ZvbnQtc2l6ZTowLjhlbTtjb2xvcjojMzc0MTUxO1wiPiR7b3JpZ2luYWx9JHtvcmlnaW5hbC5sZW5ndGggPT09IDEyMCA/ICdcdTIwMjYnIDogJyd9PC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzo2cHggOHB4O2ZvbnQtc2l6ZTowLjhlbTtjb2xvcjojMzc0MTUxO1wiPiR7ZmluYWx9JHtmaW5hbC5sZW5ndGggPT09IDEyMCA/ICdcdTIwMjYnIDogJyd9PC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzo2cHggOHB4O2ZvbnQtc2l6ZTowLjhlbTt0ZXh0LWFsaWduOmNlbnRlcjtcIj4ke2ljb259ICR7ZXNjYXBlSHRtbChvdXRjb21lKX08L3RkPlxuICAgICAgPC90cj5gO1xuICAgIH0pLmpvaW4oJycpO1xuICAgIGVsLmlubmVySFRNTCA9IGBcbiAgICAgIDxkZXRhaWxzIHN0eWxlPVwibWFyZ2luLWJvdHRvbToyNHB4O1wiPlxuICAgICAgICA8c3VtbWFyeSBzdHlsZT1cImN1cnNvcjpwb2ludGVyO2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MC45NWVtO3BhZGRpbmc6MTBweCAwO2NvbG9yOiMzNzQxNTE7dXNlci1zZWxlY3Q6bm9uZTtcIj5cbiAgICAgICAgICBcdUQ4M0RcdURDQ0IgUmV3cml0ZSBhdWRpdCBsb2cgKCR7YXVkaXQubGVuZ3RofSBkZWNpc2lvbiR7YXVkaXQubGVuZ3RoICE9PSAxID8gJ3MnIDogJyd9KVxuICAgICAgICA8L3N1bW1hcnk+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJvdmVyZmxvdy14OmF1dG87bWFyZ2luLXRvcDoxMHB4O1wiPlxuICAgICAgICAgIDx0YWJsZSBzdHlsZT1cIndpZHRoOjEwMCU7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlO2ZvbnQtc2l6ZTowLjg1ZW07XCI+XG4gICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgIDx0ciBzdHlsZT1cImJhY2tncm91bmQ6I2Y4ZmFmYztib3JkZXItYm90dG9tOjJweCBzb2xpZCAjZTJlOGYwO1wiPlxuICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cInBhZGRpbmc6OHB4O3RleHQtYWxpZ246bGVmdDtjb2xvcjojMzc0MTUxO2ZvbnQtd2VpZ2h0OjYwMDtcIj5GaWVsZDwvdGg+XG4gICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwicGFkZGluZzo4cHg7dGV4dC1hbGlnbjpsZWZ0O2NvbG9yOiMzNzQxNTE7Zm9udC13ZWlnaHQ6NjAwO1wiPk9yaWdpbmFsPC90aD5cbiAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJwYWRkaW5nOjhweDt0ZXh0LWFsaWduOmxlZnQ7Y29sb3I6IzM3NDE1MTtmb250LXdlaWdodDo2MDA7XCI+RmluYWw8L3RoPlxuICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cInBhZGRpbmc6OHB4O3RleHQtYWxpZ246Y2VudGVyO2NvbG9yOiMzNzQxNTE7Zm9udC13ZWlnaHQ6NjAwO1wiPk91dGNvbWU8L3RoPlxuICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICAgIDx0Ym9keT4ke3Jvd3N9PC90Ym9keT5cbiAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGV0YWlscz5gO1xuICB9IGNhdGNoIHsgLyogbm9uLWZhdGFsICovIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIEZpbmFsaXNlIGFwcGxpY2F0aW9uIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBmaW5hbGlzZUFwcGxpY2F0aW9uKCkge1xuICAvKiBkdWNrZmxvdzpcbiAgICogICBpZDogZmluYWxpc2VfdWlfc3VibWl0X2xpdmVcbiAgICogICBraW5kOiB1aVxuICAgKiAgIHRpbWVzdGFtcDogJzIwMjYtMDMtMjVUMjE6Mzk6NDhaJ1xuICAgKiAgIHN0YXR1czogbGl2ZVxuICAgKiAgIGhhbmRsZXM6XG4gICAqICAgLSB1aTpmaW5hbGlzZS5zdWJtaXRcbiAgICogICBjYWxsczpcbiAgICogICAtIFBPU1QgL2FwaS9maW5hbGlzZVxuICAgKiAgIHJlYWRzOlxuICAgKiAgIC0gZG9tOiNmaW5hbGlzZS1zdGF0dXMudmFsdWVcbiAgICogICAtIGRvbTojZmluYWxpc2Utbm90ZXMudmFsdWVcbiAgICogICB3cml0ZXM6XG4gICAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9maW5hbGlzZS5zdGF0dXNcbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL2ZpbmFsaXNlLm5vdGVzXG4gICAqICAgLSBkb206I2ZpbmFsaXNlLXJlc3VsdFxuICAgKiAgIG5vdGVzOiBTdWJtaXRzIGZpbmFsIGFwcGxpY2F0aW9uIHN0YXR1cyBhbmQgbm90ZXMgc28gYmFja2VuZCBtZXRhZGF0YSwgYXJjaGl2ZSBzdGF0ZSwgYW5kIG9wdGlvbmFsIGdpdCBmaW5hbGl6YXRpb24gY2FuIGJlIHdyaXR0ZW4gZnJvbSB0aGUgY3VycmVudCBzZXNzaW9uLlxuICAgKi9cbiAgY29uc3QgYnRuICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbmFsaXNlLWJ0bicpO1xuICBjb25zdCByZXN1bHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmluYWxpc2UtcmVzdWx0Jyk7XG4gIGNvbnN0IHN0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaW5hbGlzZS1zdGF0dXMnKS52YWx1ZTtcbiAgY29uc3Qgbm90ZXMgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbmFsaXNlLW5vdGVzJykudmFsdWU7XG5cbiAgYnRuLmRpc2FibGVkICAgID0gdHJ1ZTtcbiAgYnRuLnRleHRDb250ZW50ID0gJ1x1MjNGMyBGaW5hbGlzaW5nXHUyMDI2JztcbiAgcmVzdWx0LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHJlc3VsdC5pbm5lckhUTUwgICAgID0gJyc7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvZmluYWxpc2UnLCB7XG4gICAgICBtZXRob2Q6ICAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6ICAgIEpTT04uc3RyaW5naWZ5KHsgc3RhdHVzLCBub3RlcyB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcblxuICAgIGlmICghcmVzLm9rIHx8ICFkYXRhLm9rKSB7XG4gICAgICByZXN1bHQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICByZXN1bHQuaW5uZXJIVE1MID0gYDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZWUyZTI7Ym9yZGVyOjFweCBzb2xpZCAjZmNhNWE1O2JvcmRlci1yYWRpdXM6OHB4O1xuICAgICAgICBwYWRkaW5nOjE0cHggMThweDtjb2xvcjojOTkxYjFiO1wiPlxuICAgICAgICA8c3Ryb25nPlx1Mjc0QyBFcnJvcjo8L3N0cm9uZz4gJHtlc2NhcGVIdG1sKGRhdGEuZXJyb3IgfHwgJ0ZpbmFsaXNlIGZhaWxlZCcpfVxuICAgICAgPC9kaXY+YDtcbiAgICAgIGJ0bi5kaXNhYmxlZCAgICA9IGZhbHNlO1xuICAgICAgYnRuLnRleHRDb250ZW50ID0gJ1x1MjcwNSBGaW5hbGlzZSAmIEFyY2hpdmUnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN1bW1hcnkgPSBkYXRhLnN1bW1hcnkgfHwge307XG4gICAgY29uc3QgaGFzaCAgICA9IGRhdGEuY29tbWl0X2hhc2ggPyBgPGNvZGUgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO1wiPiR7ZXNjYXBlSHRtbChkYXRhLmNvbW1pdF9oYXNoKX08L2NvZGU+YCA6ICcobm8gY29tbWl0KSc7XG4gICAgY29uc3QgZ2l0V2FybiA9IGRhdGEuZ2l0X2Vycm9yXG4gICAgICA/IGA8cCBzdHlsZT1cImNvbG9yOiNkOTc3MDY7Zm9udC1zaXplOjAuODdlbTttYXJnaW4tdG9wOjhweDtcIj5cdTI2QTAgR2l0OiAke2VzY2FwZUh0bWwoZGF0YS5naXRfZXJyb3IpfTwvcD5gXG4gICAgICA6ICcnO1xuICAgIGNvbnN0IGFwcHJvdmVkQ291bnQgPSBzdW1tYXJ5LmFwcHJvdmVkX3Jld3JpdGVzID8/IDA7XG4gICAgY29uc3QgYXRzS2V5d29yZHMgICA9IHN1bW1hcnkuYXRzX2tleXdvcmRzIHx8IFtdO1xuICAgIGNvbnN0IGF0c1Njb3JlICAgICAgPSBzdW1tYXJ5LmF0c19zY29yZSB8fCBudWxsO1xuICAgIGNvbnN0IGR1cmF0aW9uU2VjcyAgPSBzdW1tYXJ5LnNlc3Npb25fZHVyYXRpb25fc2VjcztcbiAgICBjb25zdCBkdXJhdGlvblN0ciAgID0gZHVyYXRpb25TZWNzICE9IG51bGwgPyBfZm9ybWF0RHVyYXRpb24oZHVyYXRpb25TZWNzKSA6IG51bGw7XG5cbiAgICByZXN1bHQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgcmVzdWx0LmlubmVySFRNTCA9IGBcbiAgICAgIDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmMGZkZjQ7Ym9yZGVyOjFweCBzb2xpZCAjODZlZmFjO2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MTZweCAyMHB4O21hcmdpbi1ib3R0b206MjBweDtcIj5cbiAgICAgICAgPHN0cm9uZz5cdTI3MDUgQXBwbGljYXRpb24gYXJjaGl2ZWQhPC9zdHJvbmc+XG4gICAgICAgIDx1bCBzdHlsZT1cIm1hcmdpbjo4cHggMCAwO3BhZGRpbmctbGVmdDoyMHB4O2xpbmUtaGVpZ2h0OjEuODtmb250LXNpemU6MC45MmVtO1wiPlxuICAgICAgICAgIDxsaT5TdGF0dXM6IDxzdHJvbmc+JHtlc2NhcGVIdG1sKHN0YXR1cyl9PC9zdHJvbmc+PC9saT5cbiAgICAgICAgICA8bGk+QXBwcm92ZWQgcmV3cml0ZXM6ICR7YXBwcm92ZWRDb3VudH08L2xpPlxuICAgICAgICAgICR7X3JlbmRlckZpbmFsaXNlQXRzSXRlbXMoYXRzU2NvcmUsIGF0c0tleXdvcmRzKX1cbiAgICAgICAgICAke2R1cmF0aW9uU3RyID8gYDxsaT5TZXNzaW9uIGR1cmF0aW9uOiAke2VzY2FwZUh0bWwoZHVyYXRpb25TdHIpfTwvbGk+YCA6ICcnfVxuICAgICAgICAgIDxsaT5HaXQgY29tbWl0OiAke2hhc2h9PC9saT5cbiAgICAgICAgPC91bD5cbiAgICAgICAgJHtnaXRXYXJufVxuICAgICAgPC9kaXY+YDtcblxuICAgIGJ0bi50ZXh0Q29udGVudCA9ICdcdTI3MDUgQXJjaGl2ZWQnO1xuXG4gICAgLy8gU2hvdyBoYXJ2ZXN0IHNlY3Rpb25cbiAgICBhd2FpdCBzaG93SGFydmVzdFNlY3Rpb24oKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmVzdWx0LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgIHJlc3VsdC5pbm5lckhUTUwgPSBgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2ZlZTJlMjtib3JkZXI6MXB4IHNvbGlkICNmY2E1YTU7Ym9yZGVyLXJhZGl1czo4cHg7XG4gICAgICBwYWRkaW5nOjE0cHggMThweDtjb2xvcjojOTkxYjFiO1wiPlxuICAgICAgPHN0cm9uZz5cdTI3NEMgTmV0d29yayBlcnJvcjo8L3N0cm9uZz4gJHtlc2NhcGVIdG1sKGVyci5tZXNzYWdlKX1cbiAgICA8L2Rpdj5gO1xuICAgIGJ0bi5kaXNhYmxlZCAgICA9IGZhbHNlO1xuICAgIGJ0bi50ZXh0Q29udGVudCA9ICdcdTI3MDUgRmluYWxpc2UgJiBBcmNoaXZlJztcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgU2hvdyBoYXJ2ZXN0IHNlY3Rpb24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIHNob3dIYXJ2ZXN0U2VjdGlvbigpIHtcbiAgY29uc3Qgc2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoYXJ2ZXN0LXNlY3Rpb24nKTtcbiAgc2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgc2VjdGlvbi5pbm5lckhUTUwgPSBgXG4gICAgPGgyIHN0eWxlPVwibWFyZ2luLXRvcDowO1wiPlx1RDgzRFx1RENFNSBVcGRhdGUgTWFzdGVyIENWIERhdGE8L2gyPlxuICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDttYXJnaW4tYm90dG9tOjE2cHg7XCI+TG9hZGluZyBpbXByb3ZlbWVudCBjYW5kaWRhdGVzIGZyb20gdGhpcyBzZXNzaW9uXHUyMDI2PC9wPlxuICAgIDxkaXYgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjtwYWRkaW5nOjI0cHg7XCI+PGRpdiBjbGFzcz1cImxvYWRpbmctc3Bpbm5lclwiPjwvZGl2PjwvZGl2PmA7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvaGFydmVzdC9jYW5kaWRhdGVzJyk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG5cbiAgICBpZiAoIWRhdGEub2spIHtcbiAgICAgIHNlY3Rpb24uaW5uZXJIVE1MID0gYFxuICAgICAgICA8aDIgc3R5bGU9XCJtYXJnaW4tdG9wOjA7XCI+XHVEODNEXHVEQ0U1IFVwZGF0ZSBNYXN0ZXIgQ1YgRGF0YTwvaDI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZWUyZTI7Ym9yZGVyOjFweCBzb2xpZCAjZmNhNWE1O2JvcmRlci1yYWRpdXM6OHB4O1xuICAgICAgICAgIHBhZGRpbmc6MTJweCAxNnB4O2NvbG9yOiM5OTFiMWI7XCI+XG4gICAgICAgICAgXHUyNzRDICR7ZXNjYXBlSHRtbChkYXRhLmVycm9yIHx8ICdGYWlsZWQgdG8gbG9hZCBjYW5kaWRhdGVzJyl9XG4gICAgICAgIDwvZGl2PmA7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY2FuZGlkYXRlcyA9IGRhdGEuY2FuZGlkYXRlcyB8fCBbXTtcblxuICAgIGlmIChjYW5kaWRhdGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgc2VjdGlvbi5pbm5lckhUTUwgPSBgXG4gICAgICAgIDxoMiBzdHlsZT1cIm1hcmdpbi10b3A6MDtcIj5cdUQ4M0RcdURDRTUgVXBkYXRlIE1hc3RlciBDViBEYXRhPC9oMj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImVtcHR5LXN0YXRlXCIgc3R5bGU9XCJwYWRkaW5nOjI0cHggMDtcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWNvblwiPlx1RDgzRFx1RENDQjwvZGl2PlxuICAgICAgICAgIDxoMz5ObyBVcGRhdGUgQ2FuZGlkYXRlczwvaDM+XG4gICAgICAgICAgPHA+Tm90aGluZyBmcm9tIHRoaXMgc2Vzc2lvbiB3YXJyYW50cyB3cml0aW5nIGJhY2sgdG8gdGhlIG1hc3RlciBDVi48L3A+XG4gICAgICAgIDwvZGl2PmA7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdHlwZUljb25zID0ge1xuICAgICAgaW1wcm92ZWRfYnVsbGV0OiAgICAnXHUyNzBGXHVGRTBGJyxcbiAgICAgIG5ld19za2lsbDogICAgICAgICAgJ1x1RDgzRFx1REVFMCcsXG4gICAgICBzdW1tYXJ5X3ZhcmlhbnQ6ICAgICdcdUQ4M0RcdURDREQnLFxuICAgICAgc2tpbGxfZ2FwX2NvbmZpcm1lZDonXHUyNzA1JyxcbiAgICB9O1xuXG4gICAgbGV0IGh0bWwgPSBgXG4gICAgICA8aDIgc3R5bGU9XCJtYXJnaW4tdG9wOjA7XCI+XHVEODNEXHVEQ0U1IFVwZGF0ZSBNYXN0ZXIgQ1YgRGF0YTwvaDI+XG4gICAgICA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7bWFyZ2luLWJvdHRvbToxNnB4O1wiPlxuICAgICAgICBTZWxlY3QgaW1wcm92ZW1lbnRzIGZyb20gdGhpcyBzZXNzaW9uIHRvIHdyaXRlIGJhY2sgdG8gPGNvZGU+TWFzdGVyX0NWX0RhdGEuanNvbjwvY29kZT4uXG4gICAgICAgIE5vIGl0ZW1zIGFyZSBwcmUtc2VsZWN0ZWQgXHUyMDE0IGNob29zZSBvbmx5IHdoYXQgeW91IHdhbnQgdG8ga2VlcC5cbiAgICAgIDwvcD5cbiAgICAgIDx0YWJsZSBjbGFzcz1cInJldmlldy10YWJsZVwiIHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNnB4O1wiPlxuICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgPHRyPlxuICAgICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6MzZweDt0ZXh0LWFsaWduOmNlbnRlcjtcIj5JbmNsdWRlPC90aD5cbiAgICAgICAgICAgIDx0aD5UeXBlPC90aD5cbiAgICAgICAgICAgIDx0aD5DaGFuZ2U8L3RoPlxuICAgICAgICAgICAgPHRoPlJhdGlvbmFsZTwvdGg+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgPC90aGVhZD5cbiAgICAgICAgPHRib2R5PmA7XG5cbiAgICBmb3IgKGNvbnN0IGMgb2YgY2FuZGlkYXRlcykge1xuICAgICAgY29uc3QgaWNvbiAgICAgPSB0eXBlSWNvbnNbYy50eXBlXSB8fCAnXHVEODNEXHVEQ0NDJztcbiAgICAgIGNvbnN0IG9yaWdpbmFsID0gYy5vcmlnaW5hbCAmJiBjLm9yaWdpbmFsICE9PSAnKG5vdCBpbiBtYXN0ZXIgZGF0YSknXG4gICAgICAgID8gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC44MmVtO2NvbG9yOiM2YjcyODA7bWFyZ2luLXRvcDo0cHg7bWFyZ2luLWJvdHRvbToycHg7XG4gICAgICAgICAgICAgICB0ZXh0LWRlY29yYXRpb246bGluZS10aHJvdWdoO1wiPiR7ZXNjYXBlSHRtbChjLm9yaWdpbmFsKX08L2Rpdj5gXG4gICAgICAgIDogJyc7XG4gICAgICBodG1sICs9IGBcbiAgICAgICAgPHRyIGlkPVwiaGFydmVzdC1yb3ctJHtlc2NhcGVIdG1sKGMuaWQpfVwiPlxuICAgICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO1wiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiaGFydmVzdC1jaGstJHtlc2NhcGVIdG1sKGMuaWQpfVwiXG4gICAgICAgICAgICAgIGRhdGEtaGFydmVzdC1pZD1cIiR7ZXNjYXBlSHRtbChjLmlkKX1cIiBzdHlsZT1cIndpZHRoOjE2cHg7aGVpZ2h0OjE2cHg7Y3Vyc29yOnBvaW50ZXI7XCI+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICA8c3BhbiB0aXRsZT1cIiR7ZXNjYXBlSHRtbChjLnR5cGUpfVwiPiR7aWNvbn08L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07Y29sb3I6IzQ3NTU2OTttYXJnaW4tbGVmdDo0cHg7XCI+JHtlc2NhcGVIdG1sKGMudHlwZS5yZXBsYWNlKC9fL2csJyAnKSl9PC9zcGFuPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPHRkPlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtd2VpZ2h0OjUwMDtcIj4ke2VzY2FwZUh0bWwoYy5sYWJlbCl9PC9kaXY+XG4gICAgICAgICAgICAke29yaWdpbmFsfVxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjg4ZW07Y29sb3I6IzFlMjkzYjttYXJnaW4tdG9wOjJweDtcIj4ke2VzY2FwZUh0bWwoYy5wcm9wb3NlZCl9PC9kaXY+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8dGQgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2NvbG9yOiM2NDc0OGI7XCI+JHtlc2NhcGVIdG1sKGMucmF0aW9uYWxlKX08L3RkPlxuICAgICAgICA8L3RyPmA7XG4gICAgfVxuXG4gICAgaHRtbCArPSBgXG4gICAgICAgIDwvdGJvZHk+XG4gICAgICA8L3RhYmxlPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6MTJweDthbGlnbi1pdGVtczpjZW50ZXI7XCI+XG4gICAgICAgIDxidXR0b24gb25jbGljaz1cImFwcGx5SGFydmVzdFNlbGVjdGlvbnMoKVwiXG4gICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiMwZWE1ZTk7Y29sb3I6I2ZmZjtib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjZweDtcbiAgICAgICAgICAgICAgICAgcGFkZGluZzoxMHB4IDI0cHg7Zm9udC1zaXplOjFlbTtmb250LXdlaWdodDo2MDA7Y3Vyc29yOnBvaW50ZXI7XCIgaWQ9XCJoYXJ2ZXN0LWFwcGx5LWJ0blwiPlxuICAgICAgICAgIFx1RDgzRFx1RENFNSBBcHBseSBTZWxlY3RlZCBVcGRhdGVzXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIG9uY2xpY2s9XCJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGFydmVzdC1zZWN0aW9uJykuc3R5bGUuZGlzcGxheT0nbm9uZSdcIlxuICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDojZjFmNWY5O2NvbG9yOiM0NzU1Njk7Ym9yZGVyOjFweCBzb2xpZCAjY2JkNWUxO2JvcmRlci1yYWRpdXM6NnB4O1xuICAgICAgICAgICAgICAgICBwYWRkaW5nOjEwcHggMjBweDtmb250LXNpemU6MC45NWVtO2N1cnNvcjpwb2ludGVyO1wiPlxuICAgICAgICAgIFNraXBcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgaWQ9XCJoYXJ2ZXN0LXJlc3VsdFwiIHN0eWxlPVwibWFyZ2luLXRvcDoxNnB4O1wiPjwvZGl2PmA7XG5cbiAgICBzZWN0aW9uLmlubmVySFRNTCA9IGh0bWw7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHNlY3Rpb24uaW5uZXJIVE1MID0gYFxuICAgICAgPGgyIHN0eWxlPVwibWFyZ2luLXRvcDowO1wiPlx1RDgzRFx1RENFNSBVcGRhdGUgTWFzdGVyIENWIERhdGE8L2gyPlxuICAgICAgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2ZlZTJlMjtib3JkZXI6MXB4IHNvbGlkICNmY2E1YTU7Ym9yZGVyLXJhZGl1czo4cHg7XG4gICAgICAgIHBhZGRpbmc6MTJweCAxNnB4O2NvbG9yOiM5OTFiMWI7XCI+XG4gICAgICAgIFx1Mjc0QyBOZXR3b3JrIGVycm9yOiAke2VzY2FwZUh0bWwoZXJyLm1lc3NhZ2UpfVxuICAgICAgPC9kaXY+YDtcbiAgfVxufVxuXG4vLyBhcHBseUhhcnZlc3RTZWxlY3Rpb25zKCkgKGJvdW5kIHZpYSB0aGUgYnV0dG9uJ3Mgb25jbGljayBhYm92ZSkgbGl2ZXMgaW5cbi8vIHdlYi9oYXJ2ZXN0LmpzLCBub3QgaGVyZSBcdTIwMTQgdGhpcyBmaWxlIHVzZWQgdG8gY2FycnkgaXRzIG93biBkaXZlcmdlbnRcbi8vIGR1cGxpY2F0ZSAoZGlmZmVyZW50IGNvbmZpcm0vbWVzc2FnZSBjb3B5LCBubyBjb25maXJtLW1vZGFsIHN0ZXApLCBidXRcbi8vIHNpbmNlIGJvdGggZmlsZXMgcmVuZGVyIGEgYnV0dG9uIHdpdGggdGhlIHNhbWUgb25jbGljayBhbmQgd2luZG93IHJlc29sdmVzXG4vLyBiYXJlIGlkZW50aWZpZXJzIGF0IGNsaWNrIHRpbWUsIGhhcnZlc3QuanMncyB2ZXJzaW9uIHdhcyBhbHdheXMgdGhlIG9uZVxuLy8gYWN0dWFsbHkgaW52b2tlZCBpbiBwcm9kdWN0aW9uIHJlZ2FyZGxlc3M7IHRoaXMgY29weSB3YXMgdW5yZWFjaGFibGUgZGVhZFxuLy8gY29kZS4gUmVtb3ZlZDsgc2VlIHdlYi9oYXJ2ZXN0LmpzLlxuXG4vLyBcdTI1MDBcdTI1MDAgRXhwb3J0cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZXhwb3J0IHtcbiAgcG9wdWxhdGVGaW5hbGlzZVRhYixcbiAgZmluYWxpc2VBcHBsaWNhdGlvbixcbiAgc2hvd0hhcnZlc3RTZWN0aW9uLFxuICBfcmVuZGVyUmVhZGluZXNzQ2hlY2tsaXN0LFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL2ludGVydmlldy1wcmVwLmpzXG4gKiBJbnRlcnZpZXcgUHJlcGFyYXRpb24gcGhhc2UgXHUyMDE0IHBsYWNlaG9sZGVyIGNvbnRlbnQgd2l0aCBuYXZpZ2F0aW9uLlxuICpcbiAqIERlcGVuZGVuY2llcyAocmVzb2x2ZWQgdGhyb3VnaCBnbG9iYWxUaGlzIGF0IHJ1bnRpbWUpOlxuICogICBoYW5kbGVTdGVwQ2xpY2tcbiAqL1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5jb25zdCBsb2cgPSBnZXRMb2dnZXIoJ2ludGVydmlldy1wcmVwJyk7XG5cbmFzeW5jIGZ1bmN0aW9uIHBvcHVsYXRlSW50ZXJ2aWV3UHJlcFRhYigpIHtcbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIGlmICghY29udGVudCkgcmV0dXJuO1xuXG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgc3R5bGU9XCJtYXgtd2lkdGg6NzAwcHg7bWFyZ2luOjAgYXV0bztwYWRkaW5nOjQwcHggMjBweDt0ZXh0LWFsaWduOmNlbnRlcjtcIj5cbiAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6M2VtO21hcmdpbi1ib3R0b206MTZweDtcIj5cdUQ4M0NcdURGQTQ8L2Rpdj5cbiAgICAgIDxoMiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTJweDtcIj5JbnRlcnZpZXcgUHJlcGFyYXRpb248L2gyPlxuICAgICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO21hcmdpbi1ib3R0b206OHB4O1wiPlxuICAgICAgICBBSS1nZW5lcmF0ZWQgaW50ZXJ2aWV3IHByZXBhcmF0aW9uIGJhc2VkIG9uIHRoaXMgam9iIGFuZCB5b3VyIENWIGlzIGNvbWluZyBzb29uLlxuICAgICAgPC9wPlxuICAgICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO2ZvbnQtc2l6ZTowLjllbTtcIj5cbiAgICAgICAgVGhpcyB3aWxsIGluY2x1ZGUgbGlrZWx5IGludGVydmlldyBxdWVzdGlvbnMsIHN1Z2dlc3RlZCB0YWxraW5nIHBvaW50cywgYW5kXG4gICAgICAgIFNUQVItZm9ybWF0IGFuc3dlcnMgZHJhd24gZnJvbSB5b3VyIGV4cGVyaWVuY2UuXG4gICAgICA8L3A+XG4gICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDo0MHB4O1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLXByaW1hcnlcIiBvbmNsaWNrPVwiaGFuZGxlU3RlcENsaWNrKCd0aGFua195b3UnKVwiXG4gICAgICAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6MWVtO3BhZGRpbmc6MTBweCAyNHB4O1wiPlxuICAgICAgICAgIFByb2NlZWQgdG8gVGhhbmsgWW91IExldHRlciBcdTIxOTJcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xuXG4gIGxvZy5kZWJ1ZygnSW50ZXJ2aWV3IHByZXAgcGxhY2Vob2xkZXIgcmVuZGVyZWQnKTtcbn1cblxuZXhwb3J0IHsgcG9wdWxhdGVJbnRlcnZpZXdQcmVwVGFiIH07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi90aGFuay15b3UuanNcbiAqIFRoYW5rIFlvdSBMZXR0ZXIgcGhhc2UgXHUyMDE0IHBsYWNlaG9sZGVyIGNvbnRlbnQgd2l0aCBuYXZpZ2F0aW9uLlxuICpcbiAqIERlcGVuZGVuY2llcyAocmVzb2x2ZWQgdGhyb3VnaCBnbG9iYWxUaGlzIGF0IHJ1bnRpbWUpOlxuICogICBoYW5kbGVTdGVwQ2xpY2tcbiAqL1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5jb25zdCBsb2cgPSBnZXRMb2dnZXIoJ3RoYW5rLXlvdScpO1xuXG5hc3luYyBmdW5jdGlvbiBwb3B1bGF0ZVRoYW5rWW91VGFiKCkge1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgaWYgKCFjb250ZW50KSByZXR1cm47XG5cbiAgY29udGVudC5pbm5lckhUTUwgPSBgXG4gICAgPGRpdiBzdHlsZT1cIm1heC13aWR0aDo3MDBweDttYXJnaW46MCBhdXRvO3BhZGRpbmc6NDBweCAyMHB4O3RleHQtYWxpZ246Y2VudGVyO1wiPlxuICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTozZW07bWFyZ2luLWJvdHRvbToxNnB4O1wiPlx1RDgzRFx1REU0RjwvZGl2PlxuICAgICAgPGgyIHN0eWxlPVwibWFyZ2luLWJvdHRvbToxMnB4O1wiPlRoYW5rIFlvdSBMZXR0ZXI8L2gyPlxuICAgICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO21hcmdpbi1ib3R0b206OHB4O1wiPlxuICAgICAgICBBSS1nZW5lcmF0ZWQgdGhhbmsgeW91IGxldHRlciB0ZW1wbGF0ZXMgYXJlIGNvbWluZyBzb29uLlxuICAgICAgPC9wPlxuICAgICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO2ZvbnQtc2l6ZTowLjllbTtcIj5cbiAgICAgICAgQWZ0ZXIgeW91ciBpbnRlcnZpZXcsIHVzZSB0aGlzIHRvIGdlbmVyYXRlIGEgcGVyc29uYWxpc2VkIHRoYW5rIHlvdSBub3RlXG4gICAgICAgIHRoYXQgcmVpbmZvcmNlcyB5b3VyIGZpdCBmb3IgdGhlIHJvbGUuXG4gICAgICA8L3A+XG4gICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDo0MHB4O1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLXByaW1hcnlcIiBvbmNsaWNrPVwiaGFuZGxlU3RlcENsaWNrKCdoYXJ2ZXN0JylcIlxuICAgICAgICAgICAgICAgIHN0eWxlPVwiZm9udC1zaXplOjFlbTtwYWRkaW5nOjEwcHggMjRweDtcIj5cbiAgICAgICAgICBQcm9jZWVkIHRvIEhhcnZlc3QgSW1wcm92ZW1lbnRzIFx1MjE5MlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PmA7XG5cbiAgbG9nLmRlYnVnKCdUaGFuayB5b3UgbGV0dGVyIHBsYWNlaG9sZGVyIHJlbmRlcmVkJyk7XG59XG5cbmV4cG9ydCB7IHBvcHVsYXRlVGhhbmtZb3VUYWIgfTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogSGFydmVzdCB0YWI6IExMTS1zY29yZWQgZ3JvdXBlZCB2aWV3IG9mIG1hc3Rlci1DViBpbXByb3ZlbWVudCBjYW5kaWRhdGVzLlxuICpcbiAqIFB1YmxpYyBleHBvcnRzOlxuICogICBwb3B1bGF0ZUhhcnZlc3RUYWIoKSAgICAgICAgXHUyMDE0IGNhbGxlZCBieSByZXZpZXctdGFibGUtYmFzZS5qcyBvbiB0YWIgc3dpdGNoXG4gKiAgIGFwcGx5SGFydmVzdFNlbGVjdGlvbnMoKSAgICBcdTIwMTQgY2FsbGVkIGJ5IGlubGluZSBvbmNsaWNrIG9uIHRoZSBBcHBseSBidXR0b25cbiAqICAgcmVmcmVzaEhhcnZlc3RBbmFseXNpcygpICAgIFx1MjAxNCBjYWxsZWQgYnkgaW5saW5lIG9uY2xpY2sgb24gdGhlIFJlZnJlc2ggYnV0dG9uXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZXNjLCByZW5kZXJQcm9wb3NhbFJvdywgYXR0YWNoUHJvcG9zYWxSb3dMaXN0ZW5lcnMgfSBmcm9tICcuL3Byb3Bvc2FsLXJldmlldy5qcyc7XG5cbmNvbnN0IGxvZyA9IGdldExvZ2dlcignaGFydmVzdCcpO1xuXG4vLyBcdTI1MDBcdTI1MDAgRGlzcGxheSBjb25maWcgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8qKlxuICogTWVyZ2VkIGRpc3BsYXkgdHlwZSBjb25maWcuXG4gKiBuZXdfc2tpbGwgYW5kIHNraWxsX2dhcF9jb25maXJtZWQgYm90aCBtYXAgdG8gdGhlICdza2lsbCcgZGlzcGxheSBncm91cC5cbiAqL1xuY29uc3QgSEFSVkVTVF9UWVBFX0NPTkZJRyA9IHtcbiAgaW1wcm92ZWRfYnVsbGV0OiAgICAgeyBsYWJlbDogJ0V4cGVyaWVuY2UgQnVsbGV0cycsICAgICBpY29uOiAnXHUyNzBGXHVGRTBGJywgIHNvcnQ6IDEsIGRpc3BsYXlUeXBlOiAnaW1wcm92ZWRfYnVsbGV0JyAgICAgfSxcbiAgbmV3X3NraWxsOiAgICAgICAgICAgeyBsYWJlbDogJ1NraWxscycsICAgICAgICAgICAgICAgICBpY29uOiAnXHVEODNEXHVERUUwXHVGRTBGJywgIHNvcnQ6IDIsIGRpc3BsYXlUeXBlOiAnc2tpbGwnICAgICAgICAgICAgICAgfSxcbiAgc2tpbGxfZ2FwX2NvbmZpcm1lZDogeyBsYWJlbDogJ1NraWxscycsICAgICAgICAgICAgICAgICBpY29uOiAnXHVEODNEXHVERUUwXHVGRTBGJywgIHNvcnQ6IDIsIGRpc3BsYXlUeXBlOiAnc2tpbGwnICAgICAgICAgICAgICAgfSxcbiAgc3VtbWFyeV92YXJpYW50OiAgICAgeyBsYWJlbDogJ1Byb2Zlc3Npb25hbCBTdW1tYXJ5JywgICBpY29uOiAnXHVEODNEXHVEQ0REJywgIHNvcnQ6IDMsIGRpc3BsYXlUeXBlOiAnc3VtbWFyeV92YXJpYW50JyAgICAgfSxcbiAgc2tpbGxfdHlwZV91cGRhdGU6ICAgeyBsYWJlbDogJ1NraWxsIENsYXNzaWZpY2F0aW9uJywgICBpY29uOiAnXHVEODNDXHVERkY3XHVGRTBGJywgIHNvcnQ6IDQsIGRpc3BsYXlUeXBlOiAnc2tpbGxfdHlwZV91cGRhdGUnICB9LFxufTtcblxuY29uc3QgSEFSVkVTVF9UWVBFX0RFU0NSSVBUSU9OUyA9IHtcbiAgaW1wcm92ZWRfYnVsbGV0OiAgICAgICdSZXdyaXR0ZW4gYWNoaWV2ZW1lbnQgYnVsbGV0cyB5b3UgYXBwcm92ZWQgaW4gdGhlIFJld3JpdGVzIHN0ZXAuIFByb21vdGluZyB1cGRhdGVzIHRoZSBidWxsZXQgdGV4dCBpbiB5b3VyIG1hc3RlciBDVi4nLFxuICBza2lsbDogICAgICAgICAgICAgICAgJ1NraWxscyBhYnNlbnQgZnJvbSB5b3VyIG1hc3RlciBDViBcdTIwMTQgZWl0aGVyIGFkZGVkIChcdUQ4M0NcdUREOTUgQWRkZWQpIGR1cmluZyB0aGUgU2tpbGxzIFJldmlldyBvciBjb25maXJtZWQgd2hlbiBhc2tlZCAoXHUyNzA1IENvbmZpcm1lZCkuIFByb21vdGluZyBhZGRzIHRoZW0gdG8geW91ciBza2lsbHMgc2VjdGlvbi4nLFxuICBzdW1tYXJ5X3ZhcmlhbnQ6ICAgICAgJ0EgcmV3cml0dGVuIHZlcnNpb24gb2YgeW91ciBwcm9mZXNzaW9uYWwgc3VtbWFyeS4gUHJvbW90aW5nIHN0b3JlcyBpdCBhcyBhIG5hbWVkIHZhcmlhbnQgaW4geW91ciBtYXN0ZXIgQ1YuJyxcbiAgc2tpbGxfdHlwZV91cGRhdGU6ICAgICdIYXJkL3NvZnQgc2tpbGwgY2xhc3NpZmljYXRpb25zIHlvdSBjaGFuZ2VkIGR1cmluZyB0aGlzIHNlc3Npb24uIFByb21vdGluZyBwZXJzaXN0cyB0aGUgbmV3IHR5cGUgc28gaXQgaXMgbm90IHJlLWNsYXNzaWZpZWQgb24gZXZlcnkgYXBwbGljYXRpb24uJyxcbn07XG5cbmNvbnN0IEhBUlZFU1RfU09VUkNFX0JBREdFID0ge1xuICBuZXdfc2tpbGw6ICAgICAgICAgICAnPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC43NWVtO2JhY2tncm91bmQ6I2RiZWFmZTtjb2xvcjojMWQ0ZWQ4O2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6MXB4IDZweDttYXJnaW4tbGVmdDo2cHg7d2hpdGUtc3BhY2U6bm93cmFwO1wiPlx1RDgzQ1x1REQ5NSBBZGRlZDwvc3Bhbj4nLFxuICBza2lsbF9nYXBfY29uZmlybWVkOiAnPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC43NWVtO2JhY2tncm91bmQ6I2RjZmNlNztjb2xvcjojMTY2NTM0O2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6MXB4IDZweDttYXJnaW4tbGVmdDo2cHg7d2hpdGUtc3BhY2U6bm93cmFwO1wiPlx1MjcwNSBDb25maXJtZWQ8L3NwYW4+JyxcbiAgc2tpbGxfdHlwZV91cGRhdGU6ICAgJzxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjAuNzVlbTtiYWNrZ3JvdW5kOiNmZWY5YzM7Y29sb3I6Izg1NGQwZTtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjFweCA2cHg7bWFyZ2luLWxlZnQ6NnB4O3doaXRlLXNwYWNlOm5vd3JhcDtcIj5cdUQ4M0NcdURGRjdcdUZFMEYgUmVjbGFzc2lmaWVkPC9zcGFuPicsXG59O1xuXG5jb25zdCBSRUNfQ09ORklHID0ge1xuICBwcm9tb3RlOiB7IGxhYmVsOiAnUHJvbW90ZScsICAgICAgaWNvbjogJ1x1MkIwNlx1RkUwRicsICBjb2xvcjogJyMxNjY1MzQnLCBiZzogJyNmMGZkZjQnLCBzb3J0OiAwIH0sXG4gIHNraXA6ICAgIHsgbGFiZWw6ICdTa2lwJywgICAgICAgICBpY29uOiAnXHUyM0VEXHVGRTBGJywgIGNvbG9yOiAnIzlhMzQxMicsIGJnOiAnI2ZmZjdlZCcsIHNvcnQ6IDEgfSxcbiAgbnVsbDogICAgeyBsYWJlbDogJ1VuYW5hbHl6ZWQnLCAgIGljb246ICdcdTI3NTMnLCAgY29sb3I6ICcjNGI1NTYzJywgYmc6ICcjZjlmYWZiJywgc29ydDogMiB9LFxufTtcblxuY29uc3QgQ09ORl9DT05GSUcgPSB7XG4gIGhpZ2g6ICAgeyBsYWJlbDogJ0hpZ2gnLCAgIGNvbG9yOiAnIzE1ODAzZCcsIGJnOiAnI2YwZmRmNCcsIHNvcnQ6IDAgfSxcbiAgbWVkaXVtOiB7IGxhYmVsOiAnTWVkaXVtJywgY29sb3I6ICcjYjQ1MzA5JywgYmc6ICcjZmZmYmViJywgc29ydDogMSB9LFxuICBsb3c6ICAgIHsgbGFiZWw6ICdMb3cnLCAgICBjb2xvcjogJyNiOTFjMWMnLCBiZzogJyNmZWYyZjInLCBzb3J0OiAyIH0sXG4gIG51bGw6ICAgeyBsYWJlbDogJycsICAgICAgIGNvbG9yOiAnIzZiNzI4MCcsIGJnOiAnI2Y5ZmFmYicsIHNvcnQ6IDMgfSxcbn07XG5cbi8vIFx1MjUwMFx1MjUwMCBHcm91cGluZyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gZ2V0RGlzcGxheVR5cGUoY2FuZGlkYXRlKSB7XG4gIHJldHVybiBIQVJWRVNUX1RZUEVfQ09ORklHW2NhbmRpZGF0ZS50eXBlXT8uZGlzcGxheVR5cGUgPz8gY2FuZGlkYXRlLnR5cGU7XG59XG5cbi8qKlxuICogR3JvdXAgZW5yaWNoZWQgY2FuZGlkYXRlcyBpbnRvIGEgbmVzdGVkIHN0cnVjdHVyZTpcbiAqICAgeyBkaXNwbGF5VHlwZSBcdTIxOTIgeyByZWMgXHUyMTkyIHsgY29uZmlkZW5jZSBcdTIxOTIgW2NhbmRpZGF0ZSwgXHUyMDI2XSB9IH0gfVxuICovXG5mdW5jdGlvbiBncm91cENhbmRpZGF0ZXMoZW5yaWNoZWQpIHtcbiAgY29uc3QgZ3JvdXBzID0ge307XG4gIGZvciAoY29uc3QgYyBvZiBlbnJpY2hlZCkge1xuICAgIGNvbnN0IGR0ICAgPSBnZXREaXNwbGF5VHlwZShjKTtcbiAgICBjb25zdCByZWMgID0gYy5yZWNvbW1lbmRhdGlvbiA/PyAnbnVsbCc7XG4gICAgY29uc3QgY29uZiA9IGMuY29uZmlkZW5jZSAgICAgPz8gJ251bGwnO1xuICAgIGlmICghZ3JvdXBzW2R0XSkgICAgICAgICAgICAgICAgZ3JvdXBzW2R0XSAgICAgICA9IHt9O1xuICAgIGlmICghZ3JvdXBzW2R0XVtyZWNdKSAgICAgICAgICAgZ3JvdXBzW2R0XVtyZWNdICA9IHt9O1xuICAgIGlmICghZ3JvdXBzW2R0XVtyZWNdW2NvbmZdKSAgICAgZ3JvdXBzW2R0XVtyZWNdW2NvbmZdID0gW107XG4gICAgZ3JvdXBzW2R0XVtyZWNdW2NvbmZdLnB1c2goYyk7XG4gIH1cbiAgcmV0dXJuIGdyb3Vwcztcbn1cblxuZnVuY3Rpb24gc29ydGVkS2V5cyhvYmosIGNvbmZpZ01hcCkge1xuICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5zb3J0KChhLCBiKSA9PiB7XG4gICAgY29uc3Qgc2EgPSBjb25maWdNYXBbYV0/LnNvcnQgPz8gOTk7XG4gICAgY29uc3Qgc2IgPSBjb25maWdNYXBbYl0/LnNvcnQgPz8gOTk7XG4gICAgcmV0dXJuIHNhIC0gc2I7XG4gIH0pO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgUHJlLWNoZWNrIGxvZ2ljIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuLy8gQWxsIGhhcnZlc3QgaXRlbXMgc3RhcnQgdW5jaGVja2VkIFx1MjAxNCBtYXN0ZXIgQ1YgdXBkYXRlcyBhcmUgb3B0LWluIG9ubHkgKFVTLUExMSkuXG4vLyBHcm91cHMgd2l0aCBoaWdoL21lZGl1bSBjb25maWRlbmNlIHByb21vdGlvbnMgYXJlIGV4cGFuZGVkIHNvIGNhbmRpZGF0ZXMgYXJlXG4vLyBwcm9taW5lbnQsIGJ1dCBubyBjaGVja2JveCBpcyBwcmUtc2VsZWN0ZWQuXG5cbmZ1bmN0aW9uIHNob3VsZFByZUNoZWNrKF9jYW5kaWRhdGUpIHtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgQ29sbGFwc2UgZGVmYXVsdCBsb2dpYyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gdHlwZUdyb3VwRXhwYW5kZWQoZHRDYW5kaWRhdGVzKSB7XG4gIHJldHVybiBkdENhbmRpZGF0ZXMuc29tZShjID0+IGMucmVjb21tZW5kYXRpb24gPT09ICdwcm9tb3RlJyAmJlxuICAgIChjLmNvbmZpZGVuY2UgPT09ICdoaWdoJyB8fCBjLmNvbmZpZGVuY2UgPT09ICdtZWRpdW0nKSk7XG59XG5cbmZ1bmN0aW9uIHJlY0dyb3VwRXhwYW5kZWQocmVjLCBjb25mQ2FuZGlkYXRlcykge1xuICBpZiAocmVjICE9PSAncHJvbW90ZScpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGNvbmZDYW5kaWRhdGVzLnNvbWUoYyA9PiBjLmNvbmZpZGVuY2UgPT09ICdoaWdoJyB8fCBjLmNvbmZpZGVuY2UgPT09ICdtZWRpdW0nKTtcbn1cblxuZnVuY3Rpb24gY29uZlRpZXJFeHBhbmRlZChyZWMsIGNvbmYpIHtcbiAgcmV0dXJuIHJlYyA9PT0gJ3Byb21vdGUnICYmIChjb25mID09PSAnaGlnaCcgfHwgY29uZiA9PT0gJ21lZGl1bScpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgUmVuZGVyaW5nIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiByZW5kZXJDb25maWRlbmNlQmFkZ2UoY29uZikge1xuICBjb25zdCBjZmcgPSBDT05GX0NPTkZJR1tjb25mXSA/PyBDT05GX0NPTkZJR1snbnVsbCddO1xuICBpZiAoIWNmZy5sYWJlbCkgcmV0dXJuICcnO1xuICByZXR1cm4gYDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjAuN2VtO2ZvbnQtd2VpZ2h0OjYwMDtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjFweCA2cHg7YmFja2dyb3VuZDoke2NmZy5iZ307Y29sb3I6JHtjZmcuY29sb3J9O2JvcmRlcjoxcHggc29saWQgJHtjZmcuY29sb3J9MzA7d2hpdGUtc3BhY2U6bm93cmFwO1wiPiR7ZXNjKGNmZy5sYWJlbCl9PC9zcGFuPmA7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclJlY29tbWVuZGF0aW9uQmFkZ2UocmVjKSB7XG4gIGNvbnN0IGNmZyA9IFJFQ19DT05GSUdbcmVjXSA/PyBSRUNfQ09ORklHWydudWxsJ107XG4gIHJldHVybiBgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC43NWVtO2ZvbnQtd2VpZ2h0OjYwMDtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjJweCA4cHg7YmFja2dyb3VuZDoke2NmZy5iZ307Y29sb3I6JHtjZmcuY29sb3J9O3doaXRlLXNwYWNlOm5vd3JhcDtcIj4ke2NmZy5pY29ufSAke2VzYyhjZmcubGFiZWwpfTwvc3Bhbj5gO1xufVxuXG5mdW5jdGlvbiByZW5kZXJDYW5kaWRhdGVSb3coYywgaWR4KSB7XG4gIGNvbnN0IHR5cGVDZmcgICA9IEhBUlZFU1RfVFlQRV9DT05GSUdbYy50eXBlXSA/PyB7fTtcbiAgY29uc3QgcmVjQmFkZ2UgID0gYy5yZWNvbW1lbmRhdGlvbiA/IHJlbmRlclJlY29tbWVuZGF0aW9uQmFkZ2UoYy5yZWNvbW1lbmRhdGlvbikgOiAnJztcbiAgY29uc3QgY29uZkJhZGdlID0gYy5jb25maWRlbmNlID8gcmVuZGVyQ29uZmlkZW5jZUJhZGdlKGMuY29uZmlkZW5jZSkgOiAnJztcbiAgY29uc3QgaGFzUmVhc29uaW5nID0gYy5hbmFseXNpc0F2YWlsYWJsZSAmJiBjLnJlYXNvbmluZztcblxuICByZXR1cm4gcmVuZGVyUHJvcG9zYWxSb3coe1xuICAgIGlkOiAgICAgICAgICAgICAgYy5pZCxcbiAgICB0eXBlTGFiZWw6ICAgICAgIHR5cGVDZmcubGFiZWwgPz8gYy50eXBlLFxuICAgIHNvdXJjZUJhZGdlSHRtbDogSEFSVkVTVF9TT1VSQ0VfQkFER0VbYy50eXBlXSA/PyAnJyxcbiAgICBsYWJlbDogICAgICAgICAgIGMubGFiZWwsXG4gICAgb3JpZ2luYWw6ICAgICAgICBjLm9yaWdpbmFsLFxuICAgIHByb3Bvc2VkOiAgICAgICAgYy5wcm9wb3NlZCxcbiAgICBkZXRhaWxUZXh0OiAgICAgIGhhc1JlYXNvbmluZyA/IGMucmVhc29uaW5nIDogbnVsbCxcbiAgICBiYWRnZXNIdG1sOiAgICAgICBgJHtyZWNCYWRnZX0ke2NvbmZCYWRnZX1gLFxuICAgIGNoZWNrZWQ6ICAgICAgICAgc2hvdWxkUHJlQ2hlY2soYyksXG4gIH0sIHtcbiAgICBpZFByZWZpeDogICAgICAgICAnaGFydmVzdCcsXG4gICAgY2hlY2tib3hEYXRhQXR0cjogJ2hhcnZlc3QtaWQnLFxuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVuZGVyQ29uZmlkZW5jZVRpZXIocmVjLCBjb25mLCBjYW5kaWRhdGVzKSB7XG4gIGNvbnN0IGNmZyAgICAgID0gQ09ORl9DT05GSUdbY29uZl0gPz8gQ09ORl9DT05GSUdbJ251bGwnXTtcbiAgY29uc3QgZXhwYW5kZWQgPSBjb25mVGllckV4cGFuZGVkKHJlYywgY29uZik7XG4gIGNvbnN0IHRpZXJJZCAgID0gYGhhcnZlc3QtY29uZi0ke3JlY30tJHtjb25mfS0ke0RhdGUubm93KCl9YDtcbiAgY29uc3QgY291bnQgICAgPSBjYW5kaWRhdGVzLmxlbmd0aDtcblxuICBpZiAoIWNmZy5sYWJlbCkge1xuICAgIC8vIE5vLWFuYWx5c2lzIHRpZXIgXHUyMDE0IHJlbmRlciByb3dzIGRpcmVjdGx5IHdpdGhvdXQgYSBzdWItaGVhZGVyXG4gICAgcmV0dXJuIGNhbmRpZGF0ZXMubWFwKChjLCBpKSA9PiByZW5kZXJDYW5kaWRhdGVSb3coYywgaSkpLmpvaW4oJycpO1xuICB9XG5cbiAgY29uc3QgdG9nZ2xlSWNvbiA9IGV4cGFuZGVkID8gJ1x1MjVCRScgOiAnXHUyNUI4JztcbiAgY29uc3QgaGVhZGVySHRtbCA9IGBcbiAgICA8dHIgY2xhc3M9XCJoYXJ2ZXN0LWNvbmYtaGVhZGVyXCIgc3R5bGU9XCJjdXJzb3I6cG9pbnRlcjtiYWNrZ3JvdW5kOiNmYWZhZmE7XCIgb25jbGljaz1cInRvZ2dsZUhhcnZlc3RTZWN0aW9uKCcke3RpZXJJZH0nKVwiPlxuICAgICAgPHRkIGNvbHNwYW49XCIyXCIgc3R5bGU9XCJwYWRkaW5nOjZweCAxMnB4IDZweCAzNnB4O2ZvbnQtc2l6ZTowLjhlbTtjb2xvcjoke2NmZy5jb2xvcn07Zm9udC13ZWlnaHQ6NjAwO1wiPlxuICAgICAgICA8c3BhbiBpZD1cIiR7dGllcklkfS1pY29uXCI+JHt0b2dnbGVJY29ufTwvc3Bhbj5cbiAgICAgICAgJHtlc2MoY2ZnLmxhYmVsKX0gY29uZmlkZW5jZVxuICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07Zm9udC13ZWlnaHQ6NDAwO2NvbG9yOiM5Y2EzYWY7bWFyZ2luLWxlZnQ6NnB4O1wiPigke2NvdW50fSk8L3NwYW4+XG4gICAgICA8L3RkPlxuICAgIDwvdHI+XG4gICAgPHRib2R5IGlkPVwiJHt0aWVySWR9XCIgc3R5bGU9XCIke2V4cGFuZGVkID8gJycgOiAnZGlzcGxheTpub25lOyd9XCI+XG4gICAgICAke2NhbmRpZGF0ZXMubWFwKChjLCBpKSA9PiByZW5kZXJDYW5kaWRhdGVSb3coYywgaSkpLmpvaW4oJycpfVxuICAgIDwvdGJvZHk+YDtcbiAgcmV0dXJuIGhlYWRlckh0bWw7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclJlY0dyb3VwKGR0LCByZWMsIGNvbmZNYXApIHtcbiAgY29uc3QgY2ZnID0gUkVDX0NPTkZJR1tyZWNdID8/IFJFQ19DT05GSUdbJ251bGwnXTtcbiAgY29uc3QgYWxsQ2FuZHMgPSBPYmplY3QudmFsdWVzKGNvbmZNYXApLmZsYXQoKTtcbiAgY29uc3QgZXhwYW5kZWQgPSByZWNHcm91cEV4cGFuZGVkKHJlYywgYWxsQ2FuZHMpO1xuICBjb25zdCBncm91cElkICA9IGBoYXJ2ZXN0LXJlYy0ke2R0fS0ke3JlY30tJHtEYXRlLm5vdygpfWA7XG4gIGNvbnN0IGNvdW50ICAgID0gYWxsQ2FuZHMubGVuZ3RoO1xuXG4gIGNvbnN0IGNvbmZzICAgID0gc29ydGVkS2V5cyhjb25mTWFwLCBDT05GX0NPTkZJRyk7XG4gIGNvbnN0IGhhc011bHRpcGxlQ29uZnMgPSBjb25mcy5sZW5ndGggPiAxIHx8IChjb25mcy5sZW5ndGggPT09IDEgJiYgQ09ORl9DT05GSUdbY29uZnNbMF1dPy5sYWJlbCk7XG5cbiAgY29uc3QgaW5uZXJSb3dzID0gY29uZnMubWFwKGNvbmYgPT4gcmVuZGVyQ29uZmlkZW5jZVRpZXIocmVjLCBjb25mLCBjb25mTWFwW2NvbmZdKSkuam9pbignJyk7XG5cbiAgY29uc3QgdG9nZ2xlSWNvbiA9IGV4cGFuZGVkID8gJ1x1MjVCRScgOiAnXHUyNUI4JztcbiAgcmV0dXJuIGBcbiAgICA8dHIgY2xhc3M9XCJoYXJ2ZXN0LXJlYy1oZWFkZXJcIiBzdHlsZT1cImN1cnNvcjpwb2ludGVyO2JhY2tncm91bmQ6JHtjZmcuYmd9O1wiIG9uY2xpY2s9XCJ0b2dnbGVIYXJ2ZXN0U2VjdGlvbignJHtncm91cElkfScpXCI+XG4gICAgICA8dGQgY29sc3Bhbj1cIjJcIiBzdHlsZT1cInBhZGRpbmc6OHB4IDEycHggOHB4IDI0cHg7Zm9udC1zaXplOjAuODVlbTtjb2xvcjoke2NmZy5jb2xvcn07Zm9udC13ZWlnaHQ6NzAwO1wiPlxuICAgICAgICA8c3BhbiBpZD1cIiR7Z3JvdXBJZH0taWNvblwiPiR7dG9nZ2xlSWNvbn08L3NwYW4+XG4gICAgICAgICR7Y2ZnLmljb259ICR7ZXNjKGNmZy5sYWJlbCl9XG4gICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtmb250LXdlaWdodDo0MDA7Y29sb3I6IzljYTNhZjttYXJnaW4tbGVmdDo2cHg7XCI+KCR7Y291bnR9KTwvc3Bhbj5cbiAgICAgIDwvdGQ+XG4gICAgPC90cj5cbiAgICA8dGJvZHkgaWQ9XCIke2dyb3VwSWR9XCIgc3R5bGU9XCIke2V4cGFuZGVkID8gJycgOiAnZGlzcGxheTpub25lOyd9XCI+XG4gICAgICAke2hhc011bHRpcGxlQ29uZnMgPyBpbm5lclJvd3MgOiBhbGxDYW5kcy5tYXAoKGMsIGkpID0+IHJlbmRlckNhbmRpZGF0ZVJvdyhjLCBpKSkuam9pbignJyl9XG4gICAgPC90Ym9keT5gO1xufVxuXG5mdW5jdGlvbiByZW5kZXJUeXBlR3JvdXAoZHQsIHJlY01hcCwgYWxsRHRDYW5kaWRhdGVzKSB7XG4gIGNvbnN0IGNmZyAgICAgID0gSEFSVkVTVF9UWVBFX0NPTkZJR1tkdF0gPz8geyBsYWJlbDogZHQsIGljb246ICdcdUQ4M0RcdURDQ0InLCBzb3J0OiA5OSB9O1xuICBjb25zdCBleHBhbmRlZCA9IHR5cGVHcm91cEV4cGFuZGVkKGFsbER0Q2FuZGlkYXRlcyk7XG4gIGNvbnN0IGdyb3VwSWQgID0gYGhhcnZlc3QtdHlwZS0ke2R0fS0ke0RhdGUubm93KCl9YDtcbiAgY29uc3QgY291bnQgICAgPSBhbGxEdENhbmRpZGF0ZXMubGVuZ3RoO1xuICBjb25zdCBkZXNjICAgICA9IEhBUlZFU1RfVFlQRV9ERVNDUklQVElPTlNbZHRdID8/ICcnO1xuXG4gIGNvbnN0IHJlY3MgICAgICAgID0gc29ydGVkS2V5cyhyZWNNYXAsIFJFQ19DT05GSUcpO1xuICBjb25zdCBoYXNNdWx0aXBsZVJlY3MgPSByZWNzLmxlbmd0aCA+IDE7XG5cbiAgY29uc3QgaW5uZXJIdG1sID0gcmVjcy5tYXAocmVjID0+IHtcbiAgICBpZiAoIWhhc011bHRpcGxlUmVjcykge1xuICAgICAgLy8gU3VwcHJlc3MgdGhlIHJlYy1sZXZlbCBoZWFkZXI7IHJlbmRlciBjb25maWRlbmNlIHRpZXJzIGRpcmVjdGx5XG4gICAgICBjb25zdCBjb25mTWFwICA9IHJlY01hcFtyZWNdO1xuICAgICAgY29uc3QgY29uZnMgICAgPSBzb3J0ZWRLZXlzKGNvbmZNYXAsIENPTkZfQ09ORklHKTtcbiAgICAgIGNvbnN0IGhhc0NvbmZzID0gY29uZnMubGVuZ3RoID4gMSB8fCAoY29uZnMubGVuZ3RoID09PSAxICYmIENPTkZfQ09ORklHW2NvbmZzWzBdXT8ubGFiZWwpO1xuICAgICAgcmV0dXJuIGhhc0NvbmZzXG4gICAgICAgID8gY29uZnMubWFwKGNvbmYgPT4gcmVuZGVyQ29uZmlkZW5jZVRpZXIocmVjLCBjb25mLCBjb25mTWFwW2NvbmZdKSkuam9pbignJylcbiAgICAgICAgOiBjb25mTWFwW2NvbmZzWzBdXS5tYXAoKGMsIGkpID0+IHJlbmRlckNhbmRpZGF0ZVJvdyhjLCBpKSkuam9pbignJyk7XG4gICAgfVxuICAgIHJldHVybiByZW5kZXJSZWNHcm91cChkdCwgcmVjLCByZWNNYXBbcmVjXSk7XG4gIH0pLmpvaW4oJycpO1xuXG4gIGNvbnN0IHRvZ2dsZUljb24gPSBleHBhbmRlZCA/ICdcdTI1QkUnIDogJ1x1MjVCOCc7XG4gIHJldHVybiBgXG4gICAgPGRpdiBjbGFzcz1cImhhcnZlc3QtdHlwZS1zZWN0aW9uXCIgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjI0cHg7Ym9yZGVyOjFweCBzb2xpZCAjZTJlOGYwO2JvcmRlci1yYWRpdXM6OHB4O292ZXJmbG93OmhpZGRlbjtcIj5cbiAgICAgIDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmOGZhZmM7cGFkZGluZzoxMnB4IDE2cHg7Y3Vyc29yOnBvaW50ZXI7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTBweDtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZTJlOGYwO1wiXG4gICAgICAgICAgIG9uY2xpY2s9XCJ0b2dnbGVIYXJ2ZXN0U2VjdGlvbignJHtncm91cElkfScpXCI+XG4gICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjEuMjVlbTtcIj4ke2NmZy5pY29ufTwvc3Bhbj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImZsZXg6MTtcIj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6NzAwO2NvbG9yOiMwZjE3MmE7Zm9udC1zaXplOjAuOTVlbTtcIj5cbiAgICAgICAgICAgIDxzcGFuIGlkPVwiJHtncm91cElkfS1pY29uXCI+JHt0b2dnbGVJY29ufTwvc3Bhbj5cbiAgICAgICAgICAgICR7ZXNjKGNmZy5sYWJlbCl9XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjgyZW07Zm9udC13ZWlnaHQ6NDAwO2NvbG9yOiM5NGEzYjg7bWFyZ2luLWxlZnQ6NnB4O1wiPigke2NvdW50fSk8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgJHtkZXNjID8gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC43OGVtO2NvbG9yOiM2NDc0OGI7bWFyZ2luLXRvcDoycHg7XCI+JHtlc2MoZGVzYyl9PC9kaXY+YCA6ICcnfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBpZD1cIiR7Z3JvdXBJZH1cIiBzdHlsZT1cIiR7ZXhwYW5kZWQgPyAnJyA6ICdkaXNwbGF5Om5vbmU7J31cIj5cbiAgICAgICAgPHRhYmxlIHN0eWxlPVwid2lkdGg6MTAwJTtib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7XCI+XG4gICAgICAgICAgJHtpbm5lckh0bWx9XG4gICAgICAgIDwvdGFibGU+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xufVxuXG5mdW5jdGlvbiByZW5kZXJIYXJ2ZXN0VGFiSHRtbChlbnJpY2hlZCwgYW5hbHlzaXNPaywgYW5hbHlzaXNFcnJvcikge1xuICBjb25zdCBncm91cHMgPSBncm91cENhbmRpZGF0ZXMoZW5yaWNoZWQpO1xuICBjb25zdCBkdEtleXMgPSBzb3J0ZWRLZXlzKGdyb3VwcywgT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKEhBUlZFU1RfVFlQRV9DT05GSUcpLm1hcCgoW2ssIHZdKSA9PiBbdi5kaXNwbGF5VHlwZSwgdl0pXG4gICkpO1xuXG4gIGNvbnN0IHRvdGFsQ291bnQgPSBlbnJpY2hlZC5sZW5ndGg7XG5cbiAgY29uc3QgYW5hbHlzaXNXYXJuaW5nID0gIWFuYWx5c2lzT2tcbiAgICA/IGA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZmZmYmViO2JvcmRlcjoxcHggc29saWQgI2ZjZDM0ZDtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjEwcHggMTRweDttYXJnaW4tYm90dG9tOjE2cHg7Zm9udC1zaXplOjAuODdlbTtjb2xvcjojOTI0MDBlO1wiPlxuICAgICAgICBcdTI2QTBcdUZFMEYgTExNIGFuYWx5c2lzIHVuYXZhaWxhYmxlJHthbmFseXNpc0Vycm9yID8gYDogJHtlc2MoYW5hbHlzaXNFcnJvcil9YCA6ICcnfS4gQ2hlY2tib3hlcyBhcmUgdW5jaGVja2VkIFx1MjAxNCByZXZpZXcgbWFudWFsbHkuXG4gICAgICAgIDxidXR0b24gb25jbGljaz1cInJlZnJlc2hIYXJ2ZXN0QW5hbHlzaXMoKVwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6MTBweDtmb250LXNpemU6MC44NWVtO3BhZGRpbmc6MnB4IDEwcHg7Ym9yZGVyOjFweCBzb2xpZCAjZDk3NzA2O2JvcmRlci1yYWRpdXM6NHB4O2JhY2tncm91bmQ6d2hpdGU7Y29sb3I6I2I0NTMwOTtjdXJzb3I6cG9pbnRlcjtcIj5SZXRyeSBhbmFseXNpczwvYnV0dG9uPlxuICAgICAgPC9kaXY+YFxuICAgIDogJyc7XG5cbiAgY29uc3Qgc2VjdGlvbnNIdG1sID0gZHRLZXlzLm1hcChkdCA9PiB7XG4gICAgY29uc3QgcmVjTWFwICAgICAgPSBncm91cHNbZHRdO1xuICAgIGNvbnN0IGFsbER0Q2FuZHMgID0gT2JqZWN0LnZhbHVlcyhyZWNNYXApLmZsYXRNYXAoY29uZk1hcCA9PiBPYmplY3QudmFsdWVzKGNvbmZNYXApLmZsYXQoKSk7XG4gICAgcmV0dXJuIHJlbmRlclR5cGVHcm91cChkdCwgcmVjTWFwLCBhbGxEdENhbmRzKTtcbiAgfSkuam9pbignJyk7XG5cbiAgcmV0dXJuIGBcbiAgICA8aDE+XHVEODNDXHVERjNFIEhhcnZlc3QgSW1wcm92ZW1lbnRzPC9oMT5cbiAgICA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7bWFyZ2luLWJvdHRvbTo4cHg7XCI+XG4gICAgICBSZXZpZXcgTExNLXNjb3JlZCBjYW5kaWRhdGVzIGZvciBwcm9tb3Rpb24gdG8geW91ciBtYXN0ZXIgQ1YuXG4gICAgICBDaGVjayB0aGUgaXRlbXMgeW91IHdhbnQgdG8gYXBwbHkgKCR7dG90YWxDb3VudH0gY2FuZGlkYXRlJHt0b3RhbENvdW50ID09PSAxID8gJycgOiAncyd9IGZvdW5kKS5cbiAgICA8L3A+XG4gICAgJHthbmFseXNpc1dhcm5pbmd9XG4gICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6MTBweDthbGlnbi1pdGVtczpjZW50ZXI7bWFyZ2luLWJvdHRvbToyMHB4O2ZsZXgtd3JhcDp3cmFwO1wiPlxuICAgICAgPGJ1dHRvbiBpZD1cImhhcnZlc3QtYXBwbHktYnRuXCIgb25jbGljaz1cImFwcGx5SGFydmVzdFNlbGVjdGlvbnMoKVwiXG4gICAgICAgIHN0eWxlPVwicGFkZGluZzoxMHB4IDI0cHg7Zm9udC1zaXplOjFlbTtmb250LXdlaWdodDo2MDA7Y3Vyc29yOnBvaW50ZXI7YmFja2dyb3VuZDojMTZhMzRhO2NvbG9yOndoaXRlO2JvcmRlcjpub25lO2JvcmRlci1yYWRpdXM6NnB4O1wiPlxuICAgICAgICBcdTI3MDUgQXBwbHkgU2VsZWN0ZWQgdG8gTWFzdGVyIENWXG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gb25jbGljaz1cInJlZnJlc2hIYXJ2ZXN0QW5hbHlzaXMoKVwiXG4gICAgICAgIHN0eWxlPVwicGFkZGluZzoxMHB4IDE4cHg7Zm9udC1zaXplOjAuOWVtO2N1cnNvcjpwb2ludGVyO2JhY2tncm91bmQ6d2hpdGU7Y29sb3I6IzQ3NTU2OTtib3JkZXI6MXB4IHNvbGlkICNjYmQ1ZTE7Ym9yZGVyLXJhZGl1czo2cHg7XCI+XG4gICAgICAgIFx1RDgzRFx1REQwNCBSZS1hbmFseXNlXG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtjb2xvcjojOTRhM2I4O1wiPlxuICAgICAgICAke3RvdGFsQ291bnR9IGNhbmRpZGF0ZSR7dG90YWxDb3VudCAhPT0gMSA/ICdzJyA6ICcnfVxuICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuICAgICR7c2VjdGlvbnNIdG1sfVxuICAgIDxkaXYgaWQ9XCJoYXJ2ZXN0LXJlc3VsdFwiIHN0eWxlPVwibWFyZ2luLXRvcDoyMHB4O1wiPjwvZGl2PmA7XG59XG5cbmZ1bmN0aW9uIHJlbmRlckVtcHR5U3RhdGVIdG1sKCkge1xuICByZXR1cm4gYFxuICAgIDxoMT5cdUQ4M0NcdURGM0UgSGFydmVzdCBJbXByb3ZlbWVudHM8L2gxPlxuICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtcIj5ObyBoYXJ2ZXN0IGNhbmRpZGF0ZXMgZm91bmQgZm9yIHRoaXMgc2Vzc2lvbi48L3A+XG4gICAgPHAgc3R5bGU9XCJjb2xvcjojOTRhM2I4O2ZvbnQtc2l6ZTowLjllbTtcIj5cbiAgICAgIENhbmRpZGF0ZXMgYXJlIGdlbmVyYXRlZCBmcm9tIGFwcHJvdmVkIHJld3JpdGVzLCBza2lsbHMgYWRkZWQgZHVyaW5nIHJldmlldyxcbiAgICAgIGFuZCBzdW1tYXJ5IHZhcmlhbnRzIGNyZWF0ZWQgZHVyaW5nIHRoZSBzZXNzaW9uLlxuICAgIDwvcD5gO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgQVBJIGNhbGxzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaENhbmRpZGF0ZXMoKSB7XG4gIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9oYXJ2ZXN0L2NhbmRpZGF0ZXMnKTtcbiAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gIHJldHVybiBkYXRhO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaEFuYWx5c2lzKGZvcmNlUmVmcmVzaCA9IGZhbHNlKSB7XG4gIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9oYXJ2ZXN0L2FuYWx5emUnLCB7XG4gICAgbWV0aG9kOiAgJ1BPU1QnLFxuICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgIGJvZHk6ICAgIEpTT04uc3RyaW5naWZ5KHsgZm9yY2VfcmVmcmVzaDogZm9yY2VSZWZyZXNoIH0pLFxuICB9KTtcbiAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gIHJldHVybiBkYXRhO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgVG9nZ2xlIGhlbHBlcnMgKGNhbGxlZCBieSBpbmxpbmUgb25jbGljaykgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIHRvZ2dsZUhhcnZlc3RTZWN0aW9uKGlkKSB7XG4gIGNvbnN0IGVsICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gIGNvbnN0IGljb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtpZH0taWNvbmApO1xuICBpZiAoIWVsKSByZXR1cm47XG4gIGNvbnN0IGhpZGRlbiA9IGVsLnN0eWxlLmRpc3BsYXkgPT09ICdub25lJztcbiAgZWwuc3R5bGUuZGlzcGxheSA9IGhpZGRlbiA/ICcnIDogJ25vbmUnO1xuICBpZiAoaWNvbikgaWNvbi50ZXh0Q29udGVudCA9IGhpZGRlbiA/ICdcdTI1QkUnIDogJ1x1MjVCOCc7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBNYWluIGVudHJ5IHBvaW50cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gcG9wdWxhdGVIYXJ2ZXN0VGFiKCkge1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgaWYgKCFjb250ZW50KSByZXR1cm47XG5cbiAgY29udGVudC5pbm5lckhUTUwgPSBgXG4gICAgPGgxPlx1RDgzQ1x1REYzRSBIYXJ2ZXN0IEltcHJvdmVtZW50czwvaDE+XG4gICAgPGRpdiBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO3BhZGRpbmc6NDBweDtcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJsb2FkaW5nLXNwaW5uZXJcIj48L2Rpdj5cbiAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDttYXJnaW4tdG9wOjEycHg7XCI+TG9hZGluZyBjYW5kaWRhdGVzIGFuZCBydW5uaW5nIExMTSBhbmFseXNpc1x1MjAyNjwvcD5cbiAgICA8L2Rpdj5gO1xuXG4gIGxldCBjYW5kaWRhdGVzID0gW107XG4gIGxldCBhbmFseXNpc09rID0gZmFsc2U7XG4gIGxldCBhbmFseXNlcyAgID0gW107XG4gIGxldCBhbmFseXNpc0Vycm9yID0gbnVsbDtcblxuICB0cnkge1xuICAgIGNvbnN0IGNhbmREYXRhID0gYXdhaXQgZmV0Y2hDYW5kaWRhdGVzKCk7XG4gICAgaWYgKCFjYW5kRGF0YS5vaykge1xuICAgICAgY29udGVudC5pbm5lckhUTUwgPSBgPGgxPlx1RDgzQ1x1REYzRSBIYXJ2ZXN0IEltcHJvdmVtZW50czwvaDE+PHAgY2xhc3M9XCJlcnJvci1tZXNzYWdlXCI+RmFpbGVkIHRvIGxvYWQgY2FuZGlkYXRlczogJHtlc2MoY2FuZERhdGEuZXJyb3IgfHwgJ1Vua25vd24gZXJyb3InKX08L3A+YDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY2FuZGlkYXRlcyA9IGNhbmREYXRhLmNhbmRpZGF0ZXMgfHwgW107XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy5lcnJvcigncG9wdWxhdGVIYXJ2ZXN0VGFiOiBjYW5kaWRhdGVzIGZldGNoIGZhaWxlZCcsIGVycik7XG4gICAgY29udGVudC5pbm5lckhUTUwgPSBgPGgxPlx1RDgzQ1x1REYzRSBIYXJ2ZXN0IEltcHJvdmVtZW50czwvaDE+PHAgY2xhc3M9XCJlcnJvci1tZXNzYWdlXCI+TmV0d29yayBlcnJvciBsb2FkaW5nIGNhbmRpZGF0ZXMuPC9wPmA7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGNhbmRpZGF0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgY29udGVudC5pbm5lckhUTUwgPSByZW5kZXJFbXB0eVN0YXRlSHRtbCgpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgYW5hbHlzaXNEYXRhID0gYXdhaXQgZmV0Y2hBbmFseXNpcyhmYWxzZSk7XG4gICAgaWYgKGFuYWx5c2lzRGF0YS5vaykge1xuICAgICAgYW5hbHlzaXNPayA9IHRydWU7XG4gICAgICBhbmFseXNlcyAgID0gYW5hbHlzaXNEYXRhLmFuYWx5c2VzIHx8IFtdO1xuICAgIH0gZWxzZSB7XG4gICAgICBhbmFseXNpc0Vycm9yID0gYW5hbHlzaXNEYXRhLmVycm9yIHx8ICdBbmFseXNpcyBmYWlsZWQnO1xuICAgICAgbG9nLndhcm4oJ3BvcHVsYXRlSGFydmVzdFRhYjogYW5hbHlzaXMgbm90IG9rJywgYW5hbHlzaXNFcnJvcik7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cuZXJyb3IoJ3BvcHVsYXRlSGFydmVzdFRhYjogYW5hbHlzaXMgZmV0Y2ggZmFpbGVkJywgZXJyKTtcbiAgICBhbmFseXNpc0Vycm9yID0gZXJyLm1lc3NhZ2U7XG4gIH1cblxuICBjb25zdCBhbmFseXNlc0J5SWQgPSBPYmplY3QuZnJvbUVudHJpZXMoYW5hbHlzZXMubWFwKGEgPT4gW2EuaWQsIGFdKSk7XG4gIGNvbnN0IGVucmljaGVkID0gY2FuZGlkYXRlcy5tYXAoYyA9PiAoe1xuICAgIC4uLmMsXG4gICAgcmVjb21tZW5kYXRpb246ICAgIGFuYWx5c2VzQnlJZFtjLmlkXT8ucmVjb21tZW5kYXRpb24gPz8gbnVsbCxcbiAgICBjb25maWRlbmNlOiAgICAgICAgYW5hbHlzZXNCeUlkW2MuaWRdPy5jb25maWRlbmNlICAgICA/PyBudWxsLFxuICAgIHJlYXNvbmluZzogICAgICAgICBhbmFseXNlc0J5SWRbYy5pZF0/LnJlYXNvbmluZyAgICAgID8/IG51bGwsXG4gICAgYW5hbHlzaXNBdmFpbGFibGU6IGFuYWx5c2lzT2ssXG4gIH0pKTtcblxuICBjb250ZW50LmlubmVySFRNTCA9IHJlbmRlckhhcnZlc3RUYWJIdG1sKGVucmljaGVkLCBhbmFseXNpc09rLCBhbmFseXNpc0Vycm9yKTtcbiAgYXR0YWNoUHJvcG9zYWxSb3dMaXN0ZW5lcnMoY29udGVudCwgJ2hhcnZlc3QnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVmcmVzaEhhcnZlc3RBbmFseXNpcygpIHtcbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIGlmICghY29udGVudCkgcmV0dXJuO1xuXG4gIC8vIFNob3cgc3Bpbm5lciBpbmxpbmUgd2hpbGUgcmUtZmV0Y2hpbmdcbiAgY29uc3QgYXBwbHlCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGFydmVzdC1hcHBseS1idG4nKTtcbiAgaWYgKGFwcGx5QnRuKSBhcHBseUJ0bi5kaXNhYmxlZCA9IHRydWU7XG5cbiAgLy8gUmUtcnVuIGZ1bGwgcG9wdWxhdGUgd2l0aCBmb3JjZSByZWZyZXNoXG4gIHRyeSB7XG4gICAgY29uc3QgY2FuZERhdGEgPSBhd2FpdCBmZXRjaENhbmRpZGF0ZXMoKTtcbiAgICBjb25zdCBjYW5kaWRhdGVzID0gKGNhbmREYXRhLm9rICYmIGNhbmREYXRhLmNhbmRpZGF0ZXMpID8gY2FuZERhdGEuY2FuZGlkYXRlcyA6IFtdO1xuXG4gICAgaWYgKGNhbmRpZGF0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb250ZW50LmlubmVySFRNTCA9IHJlbmRlckVtcHR5U3RhdGVIdG1sKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGFuYWx5c2lzT2sgPSBmYWxzZTtcbiAgICBsZXQgYW5hbHlzZXMgICA9IFtdO1xuICAgIGxldCBhbmFseXNpc0Vycm9yID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYW5hbHlzaXNEYXRhID0gYXdhaXQgZmV0Y2hBbmFseXNpcyh0cnVlKTtcbiAgICAgIGlmIChhbmFseXNpc0RhdGEub2spIHtcbiAgICAgICAgYW5hbHlzaXNPayA9IHRydWU7XG4gICAgICAgIGFuYWx5c2VzICAgPSBhbmFseXNpc0RhdGEuYW5hbHlzZXMgfHwgW107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhbmFseXNpc0Vycm9yID0gYW5hbHlzaXNEYXRhLmVycm9yIHx8ICdBbmFseXNpcyBmYWlsZWQnO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgYW5hbHlzaXNFcnJvciA9IGVyci5tZXNzYWdlO1xuICAgIH1cblxuICAgIGNvbnN0IGFuYWx5c2VzQnlJZCA9IE9iamVjdC5mcm9tRW50cmllcyhhbmFseXNlcy5tYXAoYSA9PiBbYS5pZCwgYV0pKTtcbiAgICBjb25zdCBlbnJpY2hlZCA9IGNhbmRpZGF0ZXMubWFwKGMgPT4gKHtcbiAgICAgIC4uLmMsXG4gICAgICByZWNvbW1lbmRhdGlvbjogICAgYW5hbHlzZXNCeUlkW2MuaWRdPy5yZWNvbW1lbmRhdGlvbiA/PyBudWxsLFxuICAgICAgY29uZmlkZW5jZTogICAgICAgIGFuYWx5c2VzQnlJZFtjLmlkXT8uY29uZmlkZW5jZSAgICAgPz8gbnVsbCxcbiAgICAgIHJlYXNvbmluZzogICAgICAgICBhbmFseXNlc0J5SWRbYy5pZF0/LnJlYXNvbmluZyAgICAgID8/IG51bGwsXG4gICAgICBhbmFseXNpc0F2YWlsYWJsZTogYW5hbHlzaXNPayxcbiAgICB9KSk7XG5cbiAgICBjb250ZW50LmlubmVySFRNTCA9IHJlbmRlckhhcnZlc3RUYWJIdG1sKGVucmljaGVkLCBhbmFseXNpc09rLCBhbmFseXNpc0Vycm9yKTtcbiAgICBhdHRhY2hQcm9wb3NhbFJvd0xpc3RlbmVycyhjb250ZW50LCAnaGFydmVzdCcpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cuZXJyb3IoJ3JlZnJlc2hIYXJ2ZXN0QW5hbHlzaXM6IGZhaWxlZCcsIGVycik7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gYXBwbHlIYXJ2ZXN0U2VsZWN0aW9ucygpIHtcbiAgY29uc3QgY2hlY2tib3hlcyAgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtkYXRhLWhhcnZlc3QtaWRdOmNoZWNrZWQnKTtcbiAgY29uc3Qgc2VsZWN0ZWRJZHMgPSBBcnJheS5mcm9tKGNoZWNrYm94ZXMpLm1hcChjYiA9PiBjYi5kYXRhc2V0LmhhcnZlc3RJZCk7XG4gIGNvbnN0IHJlc3VsdERpdiAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hhcnZlc3QtcmVzdWx0Jyk7XG4gIGNvbnN0IGFwcGx5QnRuICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hhcnZlc3QtYXBwbHktYnRuJyk7XG5cbiAgaWYgKHNlbGVjdGVkSWRzLmxlbmd0aCA9PT0gMCkge1xuICAgIGlmIChyZXN1bHREaXYpIHJlc3VsdERpdi5pbm5lckhUTUwgPSAnPHAgc3R5bGU9XCJjb2xvcjojYjQ1MzA5O1wiPk5vIGl0ZW1zIHNlbGVjdGVkLjwvcD4nO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0ICh0eXBlb2Ygc2hvd0NvbmZpcm1Nb2RhbCA9PT0gJ2Z1bmN0aW9uJ1xuICAgID8gc2hvd0NvbmZpcm1Nb2RhbChcbiAgICAgICAgYFByb21vdGUgJHtzZWxlY3RlZElkcy5sZW5ndGh9IGl0ZW0ke3NlbGVjdGVkSWRzLmxlbmd0aCAhPT0gMSA/ICdzJyA6ICcnfSB0byBtYXN0ZXIgQ1Y/YCxcbiAgICAgICAgJ1RoaXMgd2lsbCBwZXJtYW5lbnRseSB3cml0ZSBjaGFuZ2VzIHRvIHlvdXIgTWFzdGVyX0NWX0RhdGEuanNvbi4gQSBiYWNrdXAgd2lsbCBiZSBjcmVhdGVkIGZpcnN0LicsXG4gICAgICApXG4gICAgOiBQcm9taXNlLnJlc29sdmUod2luZG93LmNvbmZpcm0oYFByb21vdGUgJHtzZWxlY3RlZElkcy5sZW5ndGh9IGl0ZW0ocykgdG8gbWFzdGVyIENWP1xcblxcblRoaXMgd2lsbCBwZXJtYW5lbnRseSB3cml0ZSBjaGFuZ2VzIHRvIHlvdXIgTWFzdGVyX0NWX0RhdGEuanNvbi5gKSkpO1xuXG4gIGlmICghY29uZmlybWVkKSByZXR1cm47XG5cbiAgaWYgKGFwcGx5QnRuKSB7IGFwcGx5QnRuLmRpc2FibGVkID0gdHJ1ZTsgYXBwbHlCdG4udGV4dENvbnRlbnQgPSAnQXBwbHlpbmdcdTIwMjYnOyB9XG4gIGlmIChyZXN1bHREaXYpIHJlc3VsdERpdi5pbm5lckhUTUwgPSAnJztcblxuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9oYXJ2ZXN0L2FwcGx5Jywge1xuICAgICAgbWV0aG9kOiAgJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiAgICBKU09OLnN0cmluZ2lmeSh7IHNlbGVjdGVkX2lkczogc2VsZWN0ZWRJZHMgfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG5cbiAgICBpZiAoIWRhdGEub2spIHtcbiAgICAgIGlmIChyZXN1bHREaXYpIHJlc3VsdERpdi5pbm5lckhUTUwgPSBgPHAgY2xhc3M9XCJlcnJvci1tZXNzYWdlXCI+QXBwbHkgZmFpbGVkOiAke2VzYyhkYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yJyl9PC9wPmA7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgd3JpdHRlbkNvdW50ID0gZGF0YS53cml0dGVuX2NvdW50ID8/IDA7XG4gICAgY29uc3QgY29tbWl0SGFzaCAgID0gZGF0YS5jb21taXRfaGFzaCAgID8gYCAoY29tbWl0ICR7ZXNjKGRhdGEuY29tbWl0X2hhc2gpfSlgIDogJyc7XG4gICAgY29uc3QgYmFja3VwTm90ZSAgID0gZGF0YS5iYWNrdXBfcGF0aCAgID8gYCBCYWNrdXAgc2F2ZWQgdG8gPGNvZGU+JHtlc2MoZGF0YS5iYWNrdXBfcGF0aCl9PC9jb2RlPi5gIDogJyc7XG4gICAgY29uc3QgZ2l0V2FybmluZyAgID0gZGF0YS5naXRfZXJyb3JcbiAgICAgID8gYDxwIHN0eWxlPVwiY29sb3I6I2I0NTMwOTtmb250LXNpemU6MC44N2VtO1wiPlx1MjZBMFx1RkUwRiBHaXQgY29tbWl0IHNraXBwZWQ6ICR7ZXNjKGRhdGEuZ2l0X2Vycm9yPy5tZXNzYWdlIHx8IGRhdGEuZ2l0X2Vycm9yKX08L3A+YFxuICAgICAgOiAnJztcblxuICAgIGlmIChyZXN1bHREaXYpIHtcbiAgICAgIHJlc3VsdERpdi5pbm5lckhUTUwgPSBgXG4gICAgICAgIDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmMGZkZjQ7Ym9yZGVyOjFweCBzb2xpZCAjODZlZmFjO2JvcmRlci1yYWRpdXM6NnB4O3BhZGRpbmc6MTJweCAxNnB4O1wiPlxuICAgICAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzE2NjUzNDtmb250LXdlaWdodDo2MDA7bWFyZ2luOjAgMCA0cHg7XCI+XG4gICAgICAgICAgICBcdTI3MDUgJHt3cml0dGVuQ291bnR9IGl0ZW0ke3dyaXR0ZW5Db3VudCAhPT0gMSA/ICdzJyA6ICcnfSB3cml0dGVuIHRvIG1hc3RlciBDViR7Y29tbWl0SGFzaH0uXG4gICAgICAgICAgPC9wPlxuICAgICAgICAgICR7YmFja3VwTm90ZSA/IGA8cCBzdHlsZT1cImZvbnQtc2l6ZTowLjgyZW07Y29sb3I6IzZiNzI4MDttYXJnaW46NHB4IDAgMDtcIj4ke2JhY2t1cE5vdGV9PC9wPmAgOiAnJ31cbiAgICAgICAgICAke2dpdFdhcm5pbmd9XG4gICAgICAgIDwvZGl2PmA7XG4gICAgfVxuXG4gICAgLy8gRGlzYWJsZSBjaGVja2JveGVzIGZvciBhcHBsaWVkIGl0ZW1zXG4gICAgZm9yIChjb25zdCBpZCBvZiBzZWxlY3RlZElkcykge1xuICAgICAgY29uc3QgY2IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgaGFydmVzdC1jaGstJHtpZH1gKTtcbiAgICAgIGlmIChjYikgeyBjYi5kaXNhYmxlZCA9IHRydWU7IGNiLmNoZWNrZWQgPSBmYWxzZTsgfVxuICAgICAgY29uc3Qgcm93ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYGhhcnZlc3Qtcm93LSR7aWR9YCk7XG4gICAgICBpZiAocm93KSByb3cuc3R5bGUub3BhY2l0eSA9ICcwLjQ1JztcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy5lcnJvcignYXBwbHlIYXJ2ZXN0U2VsZWN0aW9uczogZmFpbGVkJywgZXJyKTtcbiAgICBpZiAocmVzdWx0RGl2KSByZXN1bHREaXYuaW5uZXJIVE1MID0gYDxwIGNsYXNzPVwiZXJyb3ItbWVzc2FnZVwiPk5ldHdvcmsgZXJyb3I6ICR7ZXNjKGVyci5tZXNzYWdlKX08L3A+YDtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoYXBwbHlCdG4pIHsgYXBwbHlCdG4uZGlzYWJsZWQgPSBmYWxzZTsgYXBwbHlCdG4udGV4dENvbnRlbnQgPSAnXHUyNzA1IEFwcGx5IFNlbGVjdGVkIHRvIE1hc3RlciBDVic7IH1cbiAgfVxufVxuXG5leHBvcnQgeyBwb3B1bGF0ZUhhcnZlc3RUYWIsIGFwcGx5SGFydmVzdFNlbGVjdGlvbnMsIHJlZnJlc2hIYXJ2ZXN0QW5hbHlzaXMsIHRvZ2dsZUhhcnZlc3RTZWN0aW9uIH07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9zZXNzaW9uLXN3aXRjaGVyLXVpLmpzXG4gKiBTZXNzaW9uIG1hbmFnZW1lbnQgbW9kYWwsIHRyYXNoIHZpZXcsIGFuZCBvd25lcnNoaXAgY29uZmxpY3QgZGlhbG9nLlxuICpcbiAqIFRoZSBzZXNzaW9uLWNvbmZsaWN0IHJldHJ5IGJhbm5lciAoc2hvd1Nlc3Npb25Db25mbGljdEJhbm5lci9cbiAqIGNvbmZsaWN0UmV0cnlOb3cvY29uZmxpY3REaXNtaXNzKSBsaXZlcyBpbiB3ZWIvZmV0Y2gtdXRpbHMuanMsIHdoaWNoIG93bnNcbiAqIGhhbmRsZTQwOUNvbmZsaWN0ICh0aGUgYWN0dWFsIHRyaWdnZXIpIFx1MjAxNCB0aGlzIGZpbGUgdXNlZCB0byBjYXJyeSBpdHMgb3duXG4gKiBieXRlLWZvci1ieXRlIGR1cGxpY2F0ZSB3aXRoIGEgc2VwYXJhdGUgcmV0cnkgcXVldWUvdGltZXIsIHdoaWNoIG1lYW50XG4gKiBjbGlja2luZyBcIlJldHJ5IE5vd1wiIGNvdWxkIHNpbGVudGx5IGRyYWluIHRoZSB3cm9uZyAoYWx3YXlzLWVtcHR5KSBxdWV1ZVxuICogZGVwZW5kaW5nIG9uIHdlYi9zcmMvbWFpbi5qcydzIG1vZHVsZSBsb2FkIG9yZGVyLCBuZXZlciBhY3R1YWxseVxuICogcmVzb2x2aW5nIHRoZSBwZW5kaW5nIHJldHJpZWQgcmVxdWVzdC4gUmVtb3ZlZDsgc2VlIHdlYi9mZXRjaC11dGlscy5qcy5cbiAqXG4gKiBEZXBlbmRlbmNpZXMgKHJlc29sdmVkIHRocm91Z2ggZ2xvYmFsVGhpcyBhdCBydW50aW1lKTpcbiAqICAgZXNjYXBlSHRtbCwgcGFyc2VTZXNzaW9uTGlzdFJlc3BvbnNlLCBmb3JtYXRTZXNzaW9uUGhhc2VMYWJlbCxcbiAqICAgZm9ybWF0U2Vzc2lvblRpbWVzdGFtcCwgYnVpbGRTZXNzaW9uU3dpdGNoZXJMYWJlbCxcbiAqICAgZ2V0QWN0aXZlU2Vzc2lvbk93bmVyc2hpcE1ldGEsIF9nZXRDdXJyZW50U2Vzc2lvbklkVmFsdWUsXG4gKiAgIGxvYWRTZXNzaW9uRmlsZSwgY3JlYXRlTmV3U2Vzc2lvbkFuZE5hdmlnYXRlLCBmZXRjaFN0YXR1cyxcbiAqICAgc2V0SW5pdGlhbEZvY3VzLCB0cmFwRm9jdXMsIHJlc3RvcmVGb2N1cywgY29uZmlybURpYWxvZ1xuICovXG5cbi8vIFx1MjUwMFx1MjUwMCBTb3J0IHN0YXRlICYgc2Vzc2lvbiBjYWNoZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmNvbnN0IF9TTV9TVE9SQUdFX0tFWSA9ICdjdl9zbV9zb3J0X2tleSc7XG5jb25zdCBfU01fU1RPUkFHRV9ESVIgPSAnY3Zfc21fc29ydF9kaXInO1xuXG5sZXQgX3NtU29ydEtleSA9ICgoKSA9PiB7IHRyeSB7IHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShfU01fU1RPUkFHRV9LRVkpIHx8ICdsYXN0TW9kaWZpZWQnOyB9IGNhdGNoIChfKSB7IHJldHVybiAnbGFzdE1vZGlmaWVkJzsgfSB9KSgpO1xubGV0IF9zbVNvcnREaXIgPSAoKCkgPT4geyB0cnkgeyByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oX1NNX1NUT1JBR0VfRElSKSB8fCAnZGVzYyc7ICAgICAgICAgfSBjYXRjaCAoXykgeyByZXR1cm4gJ2Rlc2MnOyAgICAgICAgIH0gfSkoKTtcblxubGV0IF9zbUFjdGl2ZUNhY2hlID0gW107XG5sZXQgX3NtU2F2ZWRDYWNoZSAgPSBbXTtcblxuLy8gXHUyNTAwXHUyNTAwIFJlbmRlciBoZWxwZXJzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBfcmVuZGVyQWN0aXZlU2Vzc2lvblJvd3MoYWN0aXZlU2Vzc2lvbnMpIHtcbiAgaWYgKCFhY3RpdmVTZXNzaW9ucy5sZW5ndGgpIHtcbiAgICByZXR1cm4gJzxwIGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1lbXB0eVwiPk5vIGFjdGl2ZSBpbi1tZW1vcnkgc2Vzc2lvbnMuPC9wPic7XG4gIH1cblxuICBjb25zdCBjdXJyZW50U2Vzc2lvbklkID0gX2dldEN1cnJlbnRTZXNzaW9uSWRWYWx1ZSgpO1xuXG4gIHJldHVybiBgPGRpdiBjbGFzcz1cInNlc3Npb24tc3dpdGNoZXItbGlzdFwiPiR7YWN0aXZlU2Vzc2lvbnMubWFwKHNlc3Npb24gPT4ge1xuICAgIGNvbnN0IG93bmVyc2hpcCA9IGdldEFjdGl2ZVNlc3Npb25Pd25lcnNoaXBNZXRhKHNlc3Npb24sIHsgY3VycmVudFNlc3Npb25JZCB9KTtcbiAgICBjb25zdCBvcGVuSHJlZiA9IGAvP3Nlc3Npb249JHtlbmNvZGVVUklDb21wb25lbnQoc2Vzc2lvbi5zZXNzaW9uX2lkIHx8ICcnKX1gO1xuICAgIGNvbnN0IGFjdGlvbkh0bWwgPSBvd25lcnNoaXAuaXNDdXJyZW50XG4gICAgICA/ICc8c3BhbiBjbGFzcz1cInNlc3Npb24tc3dpdGNoZXItYnRuXCIgYXJpYS1kaXNhYmxlZD1cInRydWVcIj5DdXJyZW50PC9zcGFuPidcbiAgICAgIDogYDxhIGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1saW5rXCIgaHJlZj1cIiR7b3BlbkhyZWZ9XCI+T3BlbjwvYT5gO1xuICAgIHJldHVybiBgXG4gICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1yb3dcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNlc3Npb24tc3dpdGNoZXItcm93LW1haW5cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1yb3ctdGl0bGVcIj5cbiAgICAgICAgICAgIDxzdHJvbmc+JHtlc2NhcGVIdG1sKHNlc3Npb24ucG9zaXRpb25fbmFtZSB8fCAnVW50aXRsZWQnKX08L3N0cm9uZz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2Vzc2lvbi1zdGF0dXMtcGlsbCAke293bmVyc2hpcC5jbGFzc05hbWV9XCI+PHNwYW4gY2xhc3M9XCJzZXNzaW9uLXN0YXR1cy1kb3RcIj48L3NwYW4+JHtlc2NhcGVIdG1sKG93bmVyc2hpcC5sYWJlbCl9PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLXJvdy1tZXRhXCI+XG4gICAgICAgICAgICAke2VzY2FwZUh0bWwoZm9ybWF0U2Vzc2lvblBoYXNlTGFiZWwoc2Vzc2lvbi5waGFzZSkpfSBcdTAwQjcgQ3JlYXRlZCAke2VzY2FwZUh0bWwoZm9ybWF0U2Vzc2lvblRpbWVzdGFtcChzZXNzaW9uLmNyZWF0ZWQpKX0gXHUwMEI3IExhc3QgbW9kaWZpZWQgJHtlc2NhcGVIdG1sKGZvcm1hdFNlc3Npb25UaW1lc3RhbXAoc2Vzc2lvbi5sYXN0X21vZGlmaWVkKSl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1hY3Rpb25zXCI+JHthY3Rpb25IdG1sfTwvZGl2PlxuICAgICAgPC9kaXY+YDtcbiAgfSkuam9pbignJyl9PC9kaXY+YDtcbn1cblxuZnVuY3Rpb24gX3JlbmRlclNhdmVkU2Vzc2lvblJvd3Moc2F2ZWRTZXNzaW9ucywgeyBpbmNsdWRlTWFuYWdlbWVudCA9IGZhbHNlIH0gPSB7fSkge1xuICBpZiAoIXNhdmVkU2Vzc2lvbnMubGVuZ3RoKSB7XG4gICAgcmV0dXJuICc8cCBjbGFzcz1cInNlc3Npb24tc3dpdGNoZXItZW1wdHlcIj5ObyBzYXZlZCBzZXNzaW9ucyBmb3VuZC48L3A+JztcbiAgfVxuXG4gIGZ1bmN0aW9uIF9jcmVhdGVkSXNvRnJvbVNlc3Npb25QYXRoKHNlc3Npb25QYXRoKSB7XG4gICAgaWYgKCFzZXNzaW9uUGF0aCkgcmV0dXJuICcnO1xuICAgIGNvbnN0IHBhdGhUZXh0ID0gU3RyaW5nKHNlc3Npb25QYXRoKTtcbiAgICBjb25zdCBwYXJ0cyA9IHBhdGhUZXh0LnNwbGl0KC9bXFxcXC9dLykuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGlmIChwYXJ0cy5sZW5ndGggPCAyKSByZXR1cm4gJyc7XG5cbiAgICBjb25zdCBkaXJOYW1lID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMl07XG4gICAgY29uc3QgbWF0Y2ggPSBkaXJOYW1lLm1hdGNoKC8oXFxkezR9KShcXGR7Mn0pKFxcZHsyfSlbXy1dPyhcXGR7Mn0pKFxcZHsyfSkoXFxkezJ9KS8pO1xuICAgIGlmICghbWF0Y2gpIHJldHVybiAnJztcblxuICAgIGNvbnN0IFssIHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kXSA9IG1hdGNoO1xuICAgIHJldHVybiBgJHt5ZWFyfS0ke21vbnRofS0ke2RheX1UJHtob3VyfToke21pbnV0ZX06JHtzZWNvbmR9WmA7XG4gIH1cblxuICByZXR1cm4gYDxkaXYgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLWxpc3RcIj4ke3NhdmVkU2Vzc2lvbnMubWFwKChzZXNzaW9uLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IGVzY2FwZWRQYXRoID0gZXNjYXBlSHRtbChzZXNzaW9uLnBhdGggfHwgJycpO1xuICAgIGNvbnN0IGNyZWF0ZWRJc28gPSBfY3JlYXRlZElzb0Zyb21TZXNzaW9uUGF0aChzZXNzaW9uLnBhdGgpO1xuICAgIGNvbnN0IGNyZWF0ZWRMYWJlbCA9IGNyZWF0ZWRJc28gPyBmb3JtYXRTZXNzaW9uVGltZXN0YW1wKGNyZWF0ZWRJc28pIDogJ1x1MjAxNCc7XG4gICAgY29uc3Qgc2F2ZWRMYWJlbCA9IGZvcm1hdFNlc3Npb25UaW1lc3RhbXAoc2Vzc2lvbi50aW1lc3RhbXApO1xuICAgIGNvbnN0IHNhdmVkTWV0YSA9IHNhdmVkTGFiZWwgPT09ICdcdTIwMTQnID8gJycgOiBgIFx1MDBCNyBTYXZlZCAke2VzY2FwZUh0bWwoc2F2ZWRMYWJlbCl9YDtcbiAgICBjb25zdCBtYW5hZ2VtZW50SHRtbCA9IGluY2x1ZGVNYW5hZ2VtZW50XG4gICAgICA/IGBcbiAgICAgICAgPGJ1dHRvbiBkYXRhLXNtLWFjdGlvbj1cInJlbmFtZVwiIGRhdGEtc20tcGF0aD1cIiR7ZXNjYXBlZFBhdGh9XCIgZGF0YS1zbS1pZHg9XCIke2luZGV4fVwiIGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1idG5cIiB0aXRsZT1cIlJlbmFtZSBzZXNzaW9uXCI+UmVuYW1lPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gZGF0YS1zbS1hY3Rpb249XCJkZWxldGVcIiBkYXRhLXNtLXBhdGg9XCIke2VzY2FwZWRQYXRofVwiIGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1idG4gZGFuZ2VyXCIgdGl0bGU9XCJNb3ZlIHNlc3Npb24gdG8gVHJhc2hcIj5Nb3ZlIHRvIFRyYXNoPC9idXR0b24+YFxuICAgICAgOiAnJztcblxuICAgIHJldHVybiBgXG4gICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1yb3dcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNlc3Npb24tc3dpdGNoZXItcm93LW1haW5cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1yb3ctdGl0bGVcIj5cbiAgICAgICAgICAgIDxzdHJvbmcgaWQ9XCJzbS1uYW1lLSR7aW5kZXh9XCI+JHtlc2NhcGVIdG1sKHNlc3Npb24ucG9zaXRpb25fbmFtZSB8fCAnVW50aXRsZWQnKX08L3N0cm9uZz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2Vzc2lvbi1zdGF0dXMtcGlsbCBzZXNzaW9uLXN0YXR1cy1zYXZlZFwiPjxzcGFuIGNsYXNzPVwic2Vzc2lvbi1zdGF0dXMtZG90XCI+PC9zcGFuPlNhdmVkPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgaWQ9XCJzbS1yZW5hbWUtJHtpbmRleH1cIiBzdHlsZT1cImRpc3BsYXk6bm9uZTthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjZweDttYXJnaW46OHB4IDAgNHB4O1wiPlxuICAgICAgICAgICAgPGlucHV0IGlkPVwic20taW5wdXQtJHtpbmRleH1cIiB0eXBlPVwidGV4dFwiIHZhbHVlPVwiJHtlc2NhcGVIdG1sKHNlc3Npb24ucG9zaXRpb25fbmFtZSB8fCAnJyl9XCIgY2xhc3M9XCJzbS1rZXktaW5wdXRcIiBkYXRhLXNtLXBhdGg9XCIke2VzY2FwZWRQYXRofVwiIGRhdGEtc20taWR4PVwiJHtpbmRleH1cIiBzdHlsZT1cImJvcmRlcjoxcHggc29saWQgIzNiODJmNjtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjZweCAxMHB4O2ZvbnQtc2l6ZToxM3B4O2ZsZXg6MTttaW4td2lkdGg6MDtcIj5cbiAgICAgICAgICAgIDxidXR0b24gZGF0YS1zbS1hY3Rpb249XCJzdWJtaXQtcmVuYW1lXCIgZGF0YS1zbS1wYXRoPVwiJHtlc2NhcGVkUGF0aH1cIiBkYXRhLXNtLWlkeD1cIiR7aW5kZXh9XCIgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLWJ0blwiPlNhdmU8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gZGF0YS1zbS1hY3Rpb249XCJjYW5jZWwtcmVuYW1lXCIgZGF0YS1zbS1pZHg9XCIke2luZGV4fVwiIGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1idG5cIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1yb3ctbWV0YVwiPlxuICAgICAgICAgICAgJHtlc2NhcGVIdG1sKGZvcm1hdFNlc3Npb25QaGFzZUxhYmVsKHNlc3Npb24ucGhhc2UpKX0gXHUwMEI3IENyZWF0ZWQgJHtlc2NhcGVIdG1sKGNyZWF0ZWRMYWJlbCl9JHtzYXZlZE1ldGF9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1hY3Rpb25zXCI+XG4gICAgICAgICAgPGJ1dHRvbiBkYXRhLXNtLWFjdGlvbj1cImxvYWRcIiBkYXRhLXNtLXBhdGg9XCIke2VzY2FwZWRQYXRofVwiIGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1saW5rXCI+TG9hZDwvYnV0dG9uPlxuICAgICAgICAgICR7bWFuYWdlbWVudEh0bWx9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+YDtcbiAgfSkuam9pbignJyl9PC9kaXY+YDtcbn1cblxuZnVuY3Rpb24gX3JlbmRlclNlc3Npb25Td2l0Y2hlclNlY3Rpb25zKGFjdGl2ZVNlc3Npb25zLCBzYXZlZFNlc3Npb25zLCB7IGluY2x1ZGVTYXZlZE1hbmFnZW1lbnQgPSBmYWxzZSB9ID0ge30pIHtcbiAgY29uc3Qgc2F2ZWRTZWN0aW9uTm90ZSA9IGluY2x1ZGVTYXZlZE1hbmFnZW1lbnRcbiAgICA/ICdMb2FkIGZyb20gZGlzaywgcmVuYW1lLCBvciBtb3ZlIHNhdmVkIHdvcmsgdG8gVHJhc2guJ1xuICAgIDogJ0xvYWQgc2F2ZWQgd29yayBmcm9tIGRpc2suJztcblxuICByZXR1cm4gYFxuICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLXNlY3Rpb25zXCI+XG4gICAgICA8c2VjdGlvbiBjbGFzcz1cInNlc3Npb24tc3dpdGNoZXItc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1zZWN0aW9uLWhlYWRlclwiPlxuICAgICAgICAgIDxoMz5BY3RpdmUgU2Vzc2lvbnM8L2gzPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1zZWN0aW9uLW5vdGVcIj5Jbi1tZW1vcnkgc2Vzc2lvbnMgdGhhdCBjYW4gYmUgb3BlbmVkIGRpcmVjdGx5Ljwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgICR7X3JlbmRlckFjdGl2ZVNlc3Npb25Sb3dzKGFjdGl2ZVNlc3Npb25zKX1cbiAgICAgIDwvc2VjdGlvbj5cbiAgICAgIDxzZWN0aW9uIGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1zZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLXNlY3Rpb24taGVhZGVyXCI+XG4gICAgICAgICAgPGgzPlNhdmVkIFNlc3Npb25zPC9oMz5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlc3Npb24tc3dpdGNoZXItc2VjdGlvbi1ub3RlXCI+JHtzYXZlZFNlY3Rpb25Ob3RlfTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgICR7X3JlbmRlclNhdmVkU2Vzc2lvblJvd3Moc2F2ZWRTZXNzaW9ucywgeyBpbmNsdWRlTWFuYWdlbWVudDogaW5jbHVkZVNhdmVkTWFuYWdlbWVudCB9KX1cbiAgICAgIDwvc2VjdGlvbj5cbiAgICA8L2Rpdj5gO1xufVxuXG5mdW5jdGlvbiBfdXBkYXRlU2Vzc2lvblN3aXRjaGVySGVhZGVyKHN0YXR1cyA9IHt9KSB7XG4gIGNvbnN0IGxhYmVsID0gYnVpbGRTZXNzaW9uU3dpdGNoZXJMYWJlbChzdGF0dXMpO1xuICBjb25zdCBzd2l0Y2hlckxhYmVsRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2Vzc2lvbi1zd2l0Y2hlci1sYWJlbCcpO1xuICBjb25zdCBzd2l0Y2hlckJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXNzaW9uLXN3aXRjaGVyLWJ0bicpO1xuICBjb25zdCBzdWJ0aXRsZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWRlci1zZXNzaW9uLW5hbWUnKTtcbiAgY29uc3QgaGFzU2Vzc2lvbiA9IEJvb2xlYW4oX2dldEN1cnJlbnRTZXNzaW9uSWRWYWx1ZSgpKTtcblxuICBpZiAoc3dpdGNoZXJMYWJlbEVsKSBzd2l0Y2hlckxhYmVsRWwudGV4dENvbnRlbnQgPSBsYWJlbDtcbiAgaWYgKHN3aXRjaGVyQnRuKSBzd2l0Y2hlckJ0bi5jbGFzc0xpc3QudG9nZ2xlKCdpcy1zZXNzaW9uLWFjdGl2ZScsIGhhc1Nlc3Npb24pO1xuICBpZiAoc3VidGl0bGVFbCkge1xuICAgIHN1YnRpdGxlRWwudGV4dENvbnRlbnQgPSBoYXNTZXNzaW9uID8gYEN1cnJlbnQgc2Vzc2lvbjogJHtsYWJlbH1gIDogJ1NlbGVjdCBvciBjcmVhdGUgYSBzZXNzaW9uJztcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgT3duZXJzaGlwIGNvbmZsaWN0IGRpYWxvZyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gc2hvd093bmVyc2hpcENvbmZsaWN0RGlhbG9nKG1lc3NhZ2UgPSAnVGhpcyBzZXNzaW9uIGlzIGN1cnJlbnRseSBjbGFpbWVkIGJ5IGFub3RoZXIgYnJvd3NlciB0YWIuJykge1xuICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvd25lcnNoaXAtY29uZmxpY3Qtb3ZlcmxheScpO1xuICAgIGNvbnN0IG1lc3NhZ2VFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvd25lcnNoaXAtY29uZmxpY3QtbWVzc2FnZScpO1xuICAgIGNvbnN0IGxvYWREaWZmZXJlbnRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3duZXJzaGlwLWxvYWQtZGlmZmVyZW50LWJ0bicpO1xuICAgIGNvbnN0IG5ld1Nlc3Npb25CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3duZXJzaGlwLW5ldy1zZXNzaW9uLWJ0bicpO1xuICAgIGNvbnN0IHRha2VvdmVyQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ293bmVyc2hpcC10YWtlb3Zlci1idG4nKTtcbiAgICBpZiAoIW92ZXJsYXkgfHwgIW1lc3NhZ2VFbCB8fCAhbG9hZERpZmZlcmVudEJ0biB8fCAhbmV3U2Vzc2lvbkJ0biB8fCAhdGFrZW92ZXJCdG4pIHtcbiAgICAgIHJlc29sdmUoJ2RpZmZlcmVudCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNsZWFudXAgPSAoY2hvaWNlKSA9PiB7XG4gICAgICBvdmVybGF5LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICByZXN0b3JlRm9jdXMoKTtcbiAgICAgIGxvYWREaWZmZXJlbnRCdG4ub25jbGljayA9IG51bGw7XG4gICAgICBuZXdTZXNzaW9uQnRuLm9uY2xpY2sgPSBudWxsO1xuICAgICAgdGFrZW92ZXJCdG4ub25jbGljayA9IG51bGw7XG4gICAgICByZXNvbHZlKGNob2ljZSk7XG4gICAgfTtcblxuICAgIG1lc3NhZ2VFbC50ZXh0Q29udGVudCA9IG1lc3NhZ2U7XG4gICAgb3ZlcmxheS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICAgIHdpbmRvdy5fZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgc2V0SW5pdGlhbEZvY3VzKCdvd25lcnNoaXAtY29uZmxpY3Qtb3ZlcmxheScpO1xuICAgIHRyYXBGb2N1cygnb3duZXJzaGlwLWNvbmZsaWN0LW92ZXJsYXknKTtcblxuICAgIGxvYWREaWZmZXJlbnRCdG4ub25jbGljayA9ICgpID0+IGNsZWFudXAoJ2RpZmZlcmVudCcpO1xuICAgIG5ld1Nlc3Npb25CdG4ub25jbGljayA9ICgpID0+IGNsZWFudXAoJ25ldycpO1xuICAgIHRha2VvdmVyQnRuLm9uY2xpY2sgPSAoKSA9PiBjbGVhbnVwKCd0YWtlb3ZlcicpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gY2xvc2VPd25lcnNoaXBDb25mbGljdERpYWxvZyhjaG9pY2UgPSAnZGlmZmVyZW50Jykge1xuICBjb25zdCBvdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ293bmVyc2hpcC1jb25mbGljdC1vdmVybGF5Jyk7XG4gIGlmIChvdmVybGF5KSBvdmVybGF5LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHJlc3RvcmVGb2N1cygpO1xuICBjb25zdCBsb2FkRGlmZmVyZW50QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ293bmVyc2hpcC1sb2FkLWRpZmZlcmVudC1idG4nKTtcbiAgaWYgKGxvYWREaWZmZXJlbnRCdG4gJiYgdHlwZW9mIGxvYWREaWZmZXJlbnRCdG4ub25jbGljayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGxvYWREaWZmZXJlbnRCdG4ub25jbGljaygpO1xuICAgIHJldHVybjtcbiAgfVxuICByZXR1cm4gY2hvaWNlO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgU2Vzc2lvbiBmaWxlLWJyb3dzZXIgdGFibGUgaGVscGVycyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gX3NldFNtU29ydChrZXkpIHtcbiAgaWYgKF9zbVNvcnRLZXkgPT09IGtleSkge1xuICAgIF9zbVNvcnREaXIgPSBfc21Tb3J0RGlyID09PSAnYXNjJyA/ICdkZXNjJyA6ICdhc2MnO1xuICB9IGVsc2Uge1xuICAgIF9zbVNvcnRLZXkgPSBrZXk7XG4gICAgX3NtU29ydERpciA9IGtleSA9PT0gJ2xhc3RNb2RpZmllZCcgPyAnZGVzYycgOiAnYXNjJztcbiAgfVxuICB0cnkge1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKF9TTV9TVE9SQUdFX0tFWSwgX3NtU29ydEtleSk7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oX1NNX1NUT1JBR0VfRElSLCBfc21Tb3J0RGlyKTtcbiAgfSBjYXRjaCAoXykgeyAvKiBzdG9yYWdlIHVuYXZhaWxhYmxlICovIH1cbiAgX3JlbmRlclNlc3Npb25UYWJsZUZyb21DYWNoZSgpO1xufVxuXG5mdW5jdGlvbiBfY3JlYXRlZElzb0Zyb21TZXNzaW9uUGF0aChzZXNzaW9uUGF0aCkge1xuICBpZiAoIXNlc3Npb25QYXRoKSByZXR1cm4gJyc7XG4gIGNvbnN0IHBhdGhUZXh0ID0gU3RyaW5nKHNlc3Npb25QYXRoKTtcbiAgY29uc3QgcGFydHMgICAgPSBwYXRoVGV4dC5zcGxpdCgvW1xcXFwvXS8pLmZpbHRlcihCb29sZWFuKTtcbiAgaWYgKHBhcnRzLmxlbmd0aCA8IDIpIHJldHVybiAnJztcbiAgY29uc3QgZGlyTmFtZSAgPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAyXTtcbiAgY29uc3QgbWF0Y2ggICAgPSBkaXJOYW1lLm1hdGNoKC8oXFxkezR9KShcXGR7Mn0pKFxcZHsyfSlbXy1dPyhcXGR7Mn0pKFxcZHsyfSkoXFxkezJ9KS8pO1xuICBpZiAoIW1hdGNoKSByZXR1cm4gJyc7XG4gIGNvbnN0IFssIHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kXSA9IG1hdGNoO1xuICByZXR1cm4gYCR7eWVhcn0tJHttb250aH0tJHtkYXl9VCR7aG91cn06JHttaW51dGV9OiR7c2Vjb25kfVpgO1xufVxuXG5mdW5jdGlvbiBfbm9ybWFsaXplU2Vzc2lvbnNGb3JUYWJsZShhY3RpdmVTZXNzaW9ucywgc2F2ZWRTZXNzaW9ucykge1xuICBjb25zdCBjdXJyZW50U2Vzc2lvbklkID0gX2dldEN1cnJlbnRTZXNzaW9uSWRWYWx1ZSgpO1xuICBjb25zdCByb3dzID0gW107XG5cbiAgZm9yIChjb25zdCBzIG9mIGFjdGl2ZVNlc3Npb25zKSB7XG4gICAgY29uc3Qgb3duZXJzaGlwID0gZ2V0QWN0aXZlU2Vzc2lvbk93bmVyc2hpcE1ldGEocywgeyBjdXJyZW50U2Vzc2lvbklkIH0pO1xuICAgIHJvd3MucHVzaCh7XG4gICAgICB0eXBlOiAgICAgICAgICAgICAgJ2FjdGl2ZScsXG4gICAgICBuYW1lOiAgICAgICAgICAgICAgIHMucG9zaXRpb25fbmFtZSB8fCAnVW50aXRsZWQnLFxuICAgICAgY29tcGFueTogICAgICAgICAgICBzLmNvbXBhbnkgfHwgJycsXG4gICAgICBwaGFzZTogICAgICAgICAgICAgIHMucGhhc2UgICAgICAgICB8fCAnJyxcbiAgICAgIGFwcGxpY2F0aW9uU3RhdHVzOiAgcy5hcHBsaWNhdGlvbl9zdGF0dXMgfHwgJycsXG4gICAgICBhdHNTY29yZTogICAgICAgICAgIHMuYXRzX3Njb3JlID8/IG51bGwsXG4gICAgICBsYXN0TW9kaWZpZWQ6ICAgICAgIHMubGFzdF9tb2RpZmllZCAgPyBuZXcgRGF0ZShzLmxhc3RfbW9kaWZpZWQpIDogbnVsbCxcbiAgICAgIGNyZWF0ZWQ6ICAgICAgICAgICAgcy5jcmVhdGVkICAgICAgICA/IG5ldyBEYXRlKHMuY3JlYXRlZCkgICAgICAgOiBudWxsLFxuICAgICAgb3duZXJzaGlwLFxuICAgICAgc2Vzc2lvbklkOiAgICAgICAgICBzLnNlc3Npb25faWQsXG4gICAgICBwYXRoOiAgICAgICAgICAgICAgIG51bGwsXG4gICAgICBpZHg6ICAgICAgICAgICAgICAgIG51bGwsXG4gICAgfSk7XG4gIH1cblxuICBzYXZlZFNlc3Npb25zLmZvckVhY2goKHMsIGlkeCkgPT4ge1xuICAgIGNvbnN0IGNyZWF0ZWRJc28gPSBfY3JlYXRlZElzb0Zyb21TZXNzaW9uUGF0aChzLnBhdGgpO1xuICAgIHJvd3MucHVzaCh7XG4gICAgICB0eXBlOiAgICAgICAgICAgICAgJ3NhdmVkJyxcbiAgICAgIG5hbWU6ICAgICAgICAgICAgICAgcy5wb3NpdGlvbl9uYW1lIHx8ICdVbnRpdGxlZCcsXG4gICAgICBjb21wYW55OiAgICAgICAgICAgIHMuY29tcGFueSB8fCAnJyxcbiAgICAgIHBoYXNlOiAgICAgICAgICAgICAgcy5waGFzZSAgICAgICAgIHx8ICcnLFxuICAgICAgYXBwbGljYXRpb25TdGF0dXM6ICBzLmFwcGxpY2F0aW9uX3N0YXR1cyB8fCAnJyxcbiAgICAgIG5vdGVzOiAgICAgICAgICAgICAgcy5ub3RlcyB8fCAnJyxcbiAgICAgIGF0c1Njb3JlOiAgICAgICAgICAgcy5hdHNfc2NvcmUgPz8gbnVsbCxcbiAgICAgIGxhc3RNb2RpZmllZDogICAgICAgcy50aW1lc3RhbXAgID8gbmV3IERhdGUocy50aW1lc3RhbXApICA6IG51bGwsXG4gICAgICBjcmVhdGVkOiAgICAgICAgICAgIGNyZWF0ZWRJc28gICA/IG5ldyBEYXRlKGNyZWF0ZWRJc28pICAgOiBudWxsLFxuICAgICAgb3duZXJzaGlwOiAgICAgICAgICBudWxsLFxuICAgICAgc2Vzc2lvbklkOiAgICAgICAgICBudWxsLFxuICAgICAgcGF0aDogICAgICAgICAgICAgICBzLnBhdGgsXG4gICAgICBpZHgsXG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiByb3dzO1xufVxuXG5mdW5jdGlvbiBfc29ydFNlc3Npb25Sb3dzKHJvd3MsIGtleSwgZGlyKSB7XG4gIHJldHVybiBbLi4ucm93c10uc29ydCgoYSwgYikgPT4ge1xuICAgIGxldCBhdiwgYnY7XG4gICAgc3dpdGNoIChrZXkpIHtcbiAgICAgIGNhc2UgJ25hbWUnOlxuICAgICAgICBhdiA9IChhLm5hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGJ2ID0gKGIubmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgcmV0dXJuIGRpciA9PT0gJ2FzYycgPyBhdi5sb2NhbGVDb21wYXJlKGJ2KSA6IGJ2LmxvY2FsZUNvbXBhcmUoYXYpO1xuICAgICAgY2FzZSAnc3RhdHVzJzoge1xuICAgICAgICBjb25zdCByYW5rID0gciA9PiByLnR5cGUgPT09ICdhY3RpdmUnID8gKHIub3duZXJzaGlwPy5pc0N1cnJlbnQgPyAwIDogMSkgOiAyO1xuICAgICAgICBhdiA9IHJhbmsoYSk7IGJ2ID0gcmFuayhiKTtcbiAgICAgICAgcmV0dXJuIGRpciA9PT0gJ2FzYycgPyBhdiAtIGJ2IDogYnYgLSBhdjtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3BoYXNlJzpcbiAgICAgICAgYXYgPSAoYS5waGFzZSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgYnYgPSAoYi5waGFzZSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgcmV0dXJuIGRpciA9PT0gJ2FzYycgPyBhdi5sb2NhbGVDb21wYXJlKGJ2KSA6IGJ2LmxvY2FsZUNvbXBhcmUoYXYpO1xuICAgICAgY2FzZSAnbGFzdE1vZGlmaWVkJzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGF2ID0gYS5sYXN0TW9kaWZpZWQgPyBhLmxhc3RNb2RpZmllZC5nZXRUaW1lKCkgOiAwO1xuICAgICAgICBidiA9IGIubGFzdE1vZGlmaWVkID8gYi5sYXN0TW9kaWZpZWQuZ2V0VGltZSgpIDogMDtcbiAgICAgICAgcmV0dXJuIGRpciA9PT0gJ2FzYycgPyBhdiAtIGJ2IDogYnYgLSBhdjtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBfcmVuZGVyU2Vzc2lvblRhYmxlSGVhZGVyKCkge1xuICBjb25zdCBjb2xzID0gW1xuICAgIHsga2V5OiAnbmFtZScsICAgICAgICAgbGFiZWw6ICdOYW1lJyAgICAgfSxcbiAgICB7IGtleTogJ3N0YXR1cycsICAgICAgIGxhYmVsOiAnU3RhdHVzJyAgIH0sXG4gICAgeyBrZXk6ICdwaGFzZScsICAgICAgICBsYWJlbDogJ1BoYXNlJyAgICB9LFxuICAgIHsga2V5OiAnbGFzdE1vZGlmaWVkJywgbGFiZWw6ICdNb2RpZmllZCcgfSxcbiAgXTtcbiAgY29uc3QgY2VsbHMgPSBjb2xzLm1hcCgoeyBrZXksIGxhYmVsIH0pID0+IHtcbiAgICBjb25zdCBhY3RpdmUgPSBfc21Tb3J0S2V5ID09PSBrZXk7XG4gICAgY29uc3QgaWNvbiAgID0gYWN0aXZlID8gKF9zbVNvcnREaXIgPT09ICdhc2MnID8gJ1xcdTI1YjInIDogJ1xcdTI1YmMnKSA6ICdcXHUyMWM1JztcbiAgICByZXR1cm4gYDxzcGFuIGNsYXNzPVwic20tdGgke2FjdGl2ZSA/ICcgc20tdGgtc29ydGVkJyA6ICcnfVwiIGRhdGEtc20tc29ydD1cIiR7a2V5fVwiIHJvbGU9XCJidXR0b25cIiB0YWJpbmRleD1cIjBcIiB0aXRsZT1cIlNvcnQgYnkgJHtsYWJlbH1cIj4ke2VzY2FwZUh0bWwobGFiZWwpfSA8c3BhbiBjbGFzcz1cInNtLXNvcnQtaWNvbiR7YWN0aXZlID8gJyBzbS1zb3J0LWFjdGl2ZScgOiAnJ31cIj4ke2ljb259PC9zcGFuPjwvc3Bhbj5gO1xuICB9KTtcbiAgcmV0dXJuIGA8ZGl2IGNsYXNzPVwic20tdGhlYWRcIj4ke2NlbGxzLmpvaW4oJycpfTxzcGFuIGNsYXNzPVwic20tdGggc20tdGgtYWN0aW9uc1wiPkFjdGlvbnM8L3NwYW4+PC9kaXY+YDtcbn1cblxuZnVuY3Rpb24gX2ZtdERhdGVDb21wYWN0KGQpIHtcbiAgaWYgKCFkKSByZXR1cm4gJ1xcdTIwMTQnO1xuICB0cnkge1xuICAgIHJldHVybiBkLnRvTG9jYWxlU3RyaW5nKCdlbi1VUycsIHtcbiAgICAgIG1vbnRoOiAnbnVtZXJpYycsIGRheTogJ251bWVyaWMnLCB5ZWFyOiAnMi1kaWdpdCcsXG4gICAgICBob3VyOiAnbnVtZXJpYycsIG1pbnV0ZTogJzItZGlnaXQnLFxuICAgIH0pO1xuICB9IGNhdGNoIChfKSB7IHJldHVybiAnXFx1MjAxNCc7IH1cbn1cblxuZnVuY3Rpb24gX3JlbmRlclNlc3Npb25UYWJsZVJvdyhyb3cpIHtcbiAgY29uc3QgcGhhc2VMYWJlbCA9IGVzY2FwZUh0bWwoZm9ybWF0U2Vzc2lvblBoYXNlTGFiZWwocm93LnBoYXNlKSk7XG4gIGNvbnN0IG1vZExhYmVsICAgPSBlc2NhcGVIdG1sKF9mbXREYXRlQ29tcGFjdChyb3cubGFzdE1vZGlmaWVkKSk7XG5cbiAgY29uc3Qgc3RhdHVzUGlsbCA9IHJvdy50eXBlID09PSAnYWN0aXZlJ1xuICAgID8gYDxzcGFuIGNsYXNzPVwic2Vzc2lvbi1zdGF0dXMtcGlsbCAke3Jvdy5vd25lcnNoaXAuY2xhc3NOYW1lfVwiPjxzcGFuIGNsYXNzPVwic2Vzc2lvbi1zdGF0dXMtZG90XCI+PC9zcGFuPiR7ZXNjYXBlSHRtbChyb3cub3duZXJzaGlwLmxhYmVsKX08L3NwYW4+YFxuICAgIDogYDxzcGFuIGNsYXNzPVwic2Vzc2lvbi1zdGF0dXMtcGlsbCBzZXNzaW9uLXN0YXR1cy1zYXZlZFwiPjxzcGFuIGNsYXNzPVwic2Vzc2lvbi1zdGF0dXMtZG90XCI+PC9zcGFuPlNhdmVkPC9zcGFuPmA7XG5cbiAgbGV0IGFjdGlvbkh0bWw7XG4gIGlmIChyb3cudHlwZSA9PT0gJ2FjdGl2ZScpIHtcbiAgICBjb25zdCBocmVmID0gYC8/c2Vzc2lvbj0ke2VuY29kZVVSSUNvbXBvbmVudChyb3cuc2Vzc2lvbklkIHx8ICcnKX1gO1xuICAgIGFjdGlvbkh0bWwgPSByb3cub3duZXJzaGlwLmlzQ3VycmVudFxuICAgICAgPyAnPHNwYW4gY2xhc3M9XCJzbS1idG4gc20tYnRuLWRpc2FibGVkXCIgYXJpYS1kaXNhYmxlZD1cInRydWVcIj5DdXJyZW50PC9zcGFuPidcbiAgICAgIDogYDxhIGNsYXNzPVwic20tYnRuIHNtLWJ0bi1vcGVuXCIgaHJlZj1cIiR7aHJlZn1cIj5PcGVuPC9hPmA7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZXAgID0gZXNjYXBlSHRtbChyb3cucGF0aCB8fCAnJyk7XG4gICAgY29uc3QgaWR4ID0gcm93LmlkeDtcbiAgICBhY3Rpb25IdG1sID1cbiAgICAgIGA8YnV0dG9uIGRhdGEtc20tYWN0aW9uPVwibG9hZFwiICAgZGF0YS1zbS1wYXRoPVwiJHtlcH1cIiBjbGFzcz1cInNtLWJ0biBzbS1idG4tb3BlbiBzbS1idG4taWNvblwiIHRpdGxlPVwiTG9hZCBzZXNzaW9uXCIgYXJpYS1sYWJlbD1cIkxvYWQgc2Vzc2lvblwiPjxpIGNsYXNzPVwiZmEtc29saWQgZmEtZm9sZGVyLW9wZW5cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+PC9idXR0b24+YCArXG4gICAgICBgPGJ1dHRvbiBkYXRhLXNtLWFjdGlvbj1cInJlbmFtZVwiIGRhdGEtc20tcGF0aD1cIiR7ZXB9XCIgZGF0YS1zbS1pZHg9XCIke2lkeH1cIiBjbGFzcz1cInNtLWJ0biBzbS1idG4taWNvblwiIHRpdGxlPVwiUmVuYW1lIHNlc3Npb25cIiBhcmlhLWxhYmVsPVwiUmVuYW1lIHNlc3Npb25cIj48aSBjbGFzcz1cImZhLXNvbGlkIGZhLXBlbmNpbFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT48L2J1dHRvbj5gICtcbiAgICAgIGA8YnV0dG9uIGRhdGEtc20tYWN0aW9uPVwiZHVwbGljYXRlXCIgZGF0YS1zbS1wYXRoPVwiJHtlcH1cIiBjbGFzcz1cInNtLWJ0biBzbS1idG4taWNvblwiIHRpdGxlPVwiRHVwbGljYXRlIHNlc3Npb25cIiBhcmlhLWxhYmVsPVwiRHVwbGljYXRlIHNlc3Npb25cIj48aSBjbGFzcz1cImZhLXNvbGlkIGZhLWNvcHlcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+PC9idXR0b24+YCArXG4gICAgICBgPGJ1dHRvbiBkYXRhLXNtLWFjdGlvbj1cImRlbGV0ZVwiIGRhdGEtc20tcGF0aD1cIiR7ZXB9XCIgY2xhc3M9XCJzbS1idG4gc20tYnRuLWRhbmdlciBzbS1idG4taWNvblwiIHRpdGxlPVwiTW92ZSB0byBUcmFzaFwiIGFyaWEtbGFiZWw9XCJNb3ZlIHNlc3Npb24gdG8gVHJhc2hcIj48aSBjbGFzcz1cImZhLXNvbGlkIGZhLXRyYXNoXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPjwvYnV0dG9uPmA7XG4gIH1cblxuICBjb25zdCByb3dDbGFzcyA9IChyb3cudHlwZSA9PT0gJ2FjdGl2ZScgJiYgcm93Lm93bmVyc2hpcC5pc0N1cnJlbnQpID8gJ3NtLXRyIHNtLXRyLWN1cnJlbnQnIDogJ3NtLXRyJztcblxuICBjb25zdCBjb21wYW55U3ViID0gcm93LmNvbXBhbnlcbiAgICA/IGA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuOGVtO2NvbG9yOiM5NGEzYjg7bWFyZ2luLXRvcDoxcHg7XCI+JHtlc2NhcGVIdG1sKHJvdy5jb21wYW55KX08L2Rpdj5gXG4gICAgOiAnJztcbiAgY29uc3QgbmFtZUNlbGwgPSByb3cudHlwZSA9PT0gJ3NhdmVkJ1xuICAgID8gYDxzcGFuIGlkPVwic20tbmFtZS0ke3Jvdy5pZHh9XCI+JHtlc2NhcGVIdG1sKHJvdy5uYW1lKX08L3NwYW4+YCArXG4gICAgICBgJHtjb21wYW55U3VifWAgK1xuICAgICAgYDxzcGFuIGlkPVwic20tcmVuYW1lLSR7cm93LmlkeH1cIiBzdHlsZT1cImRpc3BsYXk6bm9uZTthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjRweDttYXJnaW4tdG9wOjNweDtcIj5gICtcbiAgICAgICAgYDxpbnB1dCBpZD1cInNtLWlucHV0LSR7cm93LmlkeH1cIiB0eXBlPVwidGV4dFwiIHZhbHVlPVwiJHtlc2NhcGVIdG1sKHJvdy5uYW1lKX1cIiBjbGFzcz1cInNtLWtleS1pbnB1dFwiYCArXG4gICAgICAgICAgYCBkYXRhLXNtLXBhdGg9XCIke2VzY2FwZUh0bWwocm93LnBhdGggfHwgJycpfVwiIGRhdGEtc20taWR4PVwiJHtyb3cuaWR4fVwiYCArXG4gICAgICAgICAgYCBzdHlsZT1cImJvcmRlcjoxcHggc29saWQgIzNiODJmNjtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjNweCA4cHg7Zm9udC1zaXplOjEycHg7ZmxleDoxO21pbi13aWR0aDo2MHB4O1wiPmAgK1xuICAgICAgICBgPGJ1dHRvbiBkYXRhLXNtLWFjdGlvbj1cInN1Ym1pdC1yZW5hbWVcIiBkYXRhLXNtLXBhdGg9XCIke2VzY2FwZUh0bWwocm93LnBhdGggfHwgJycpfVwiIGRhdGEtc20taWR4PVwiJHtyb3cuaWR4fVwiIGNsYXNzPVwic20tYnRuXCIgdGl0bGU9XCJTYXZlIHJlbmFtZVwiIGFyaWEtbGFiZWw9XCJTYXZlIHJlbmFtZVwiPlxcdTI3MTM8L2J1dHRvbj5gICtcbiAgICAgICAgYDxidXR0b24gZGF0YS1zbS1hY3Rpb249XCJjYW5jZWwtcmVuYW1lXCIgZGF0YS1zbS1pZHg9XCIke3Jvdy5pZHh9XCIgY2xhc3M9XCJzbS1idG5cIiB0aXRsZT1cIkNhbmNlbCByZW5hbWVcIiBhcmlhLWxhYmVsPVwiQ2FuY2VsIHJlbmFtZVwiPlxcdTI3MTU8L2J1dHRvbj5gICtcbiAgICAgIGA8L3NwYW4+YFxuICAgIDogYDxzcGFuPiR7ZXNjYXBlSHRtbChyb3cubmFtZSl9PC9zcGFuPiR7Y29tcGFueVN1Yn1gO1xuXG4gIGNvbnN0IGFwcFN0YXR1c0xhYmVscyA9IHtcbiAgICBkcmFmdDogJ0RyYWZ0JywgcmVhZHk6ICdSZWFkeScsIHNlbnQ6ICdTZW50JywgcXVldWVkOiAnUXVldWVkJyxcbiAgICBpbnRlcnZpZXc6ICdJbnRlcnZpZXcnLCByZWplY3RlZDogJ1JlamVjdGVkJywgYWNjZXB0ZWQ6ICdBY2NlcHRlZCcsXG4gICAgcGFya2VkOiAnUGFya2VkJyxcbiAgfTtcbiAgY29uc3QgYXBwU3RhdHVzQ29sb3JzID0ge1xuICAgIGRyYWZ0OiAnIzk0YTNiOCcsIHJlYWR5OiAnIzNiODJmNicsIHNlbnQ6ICcjMjJjNTVlJywgcXVldWVkOiAnI2VhYjMwOCcsXG4gICAgaW50ZXJ2aWV3OiAnI2E4NTVmNycsIHJlamVjdGVkOiAnI2VmNDQ0NCcsIGFjY2VwdGVkOiAnIzA1OTY2OScsXG4gICAgcGFya2VkOiAnI2Y5NzMxNicsXG4gIH07XG4gIGNvbnN0IGFwcFN0YXR1cyA9IHJvdy5hcHBsaWNhdGlvblN0YXR1cyB8fCAnJztcbiAgY29uc3QgYXBwU3RhdHVzQmFkZ2UgPSBhcHBTdGF0dXMgJiYgYXBwU3RhdHVzTGFiZWxzW2FwcFN0YXR1c11cbiAgICA/IGAgPHNwYW4gaWQ9XCJzbS1zdGF0dXMtYmFkZ2UtJHtyb3cuaWR4fVwiIHN0eWxlPVwiZm9udC1zaXplOjAuNzVlbTtwYWRkaW5nOjFweCA2cHg7Ym9yZGVyLXJhZGl1czo5cHg7YmFja2dyb3VuZDoke2FwcFN0YXR1c0NvbG9yc1thcHBTdGF0dXNdfTtjb2xvcjojZmZmO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtcIj4ke2FwcFN0YXR1c0xhYmVsc1thcHBTdGF0dXNdfTwvc3Bhbj5gXG4gICAgOiBgPHNwYW4gaWQ9XCJzbS1zdGF0dXMtYmFkZ2UtJHtyb3cuaWR4fVwiPjwvc3Bhbj5gO1xuXG4gIC8vIFN0YXR1cy1lZGl0IGlubGluZSB3aWRnZXQgKHNhdmVkIHJvd3Mgb25seSlcbiAgY29uc3Qgc3RhdHVzRWRpdFdpZGdldCA9IHJvdy50eXBlID09PSAnc2F2ZWQnXG4gICAgPyBgPHNwYW4gaWQ9XCJzbS1zdGF0dXMtZWRpdC0ke3Jvdy5pZHh9XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDo0cHg7bWFyZ2luLXRvcDoycHg7XCI+YCArXG4gICAgICAgIGA8c2VsZWN0IGlkPVwic20tc3RhdHVzLXNlbC0ke3Jvdy5pZHh9XCIgY2xhc3M9XCJzbS1rZXktaW5wdXRcIiBzdHlsZT1cImJvcmRlcjoxcHggc29saWQgIzNiODJmNjtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjJweCA0cHg7Zm9udC1zaXplOjEycHg7XCIgYXJpYS1sYWJlbD1cIlNlbGVjdCBhcHBsaWNhdGlvbiBzdGF0dXNcIj5gICtcbiAgICAgICAgICBgPG9wdGlvbiB2YWx1ZT1cIlwiPi0tIGNsZWFyIC0tPC9vcHRpb24+YCArXG4gICAgICAgICAgT2JqZWN0LmVudHJpZXMoYXBwU3RhdHVzTGFiZWxzKS5tYXAoKFt2LCBsXSkgPT5cbiAgICAgICAgICAgIGA8b3B0aW9uIHZhbHVlPVwiJHt2fVwiJHthcHBTdGF0dXMgPT09IHYgPyAnIHNlbGVjdGVkJyA6ICcnfT4ke2x9PC9vcHRpb24+YFxuICAgICAgICAgICkuam9pbignJykgK1xuICAgICAgICBgPC9zZWxlY3Q+YCArXG4gICAgICAgIGA8YnV0dG9uIGRhdGEtc20tYWN0aW9uPVwic3VibWl0LXN0YXR1c1wiIGRhdGEtc20tcGF0aD1cIiR7ZXNjYXBlSHRtbChyb3cucGF0aCB8fCAnJyl9XCIgZGF0YS1zbS1pZHg9XCIke3Jvdy5pZHh9XCIgY2xhc3M9XCJzbS1idG5cIiB0aXRsZT1cIlNhdmUgc3RhdHVzXCIgYXJpYS1sYWJlbD1cIlNhdmUgc3RhdHVzXCI+JiMxMDAwMzs8L2J1dHRvbj5gICtcbiAgICAgICAgYDxidXR0b24gZGF0YS1zbS1hY3Rpb249XCJjYW5jZWwtc3RhdHVzXCIgZGF0YS1zbS1pZHg9XCIke3Jvdy5pZHh9XCIgY2xhc3M9XCJzbS1idG5cIiB0aXRsZT1cIkNhbmNlbFwiIGFyaWEtbGFiZWw9XCJDYW5jZWwgc3RhdHVzIGVkaXRcIj4mIzEwMDA1OzwvYnV0dG9uPmAgK1xuICAgICAgYDwvc3Bhbj5gXG4gICAgOiAnJztcblxuICAvLyBOb3Rlcy1lZGl0IGlubGluZSB3aWRnZXQgKHNhdmVkIHJvd3Mgb25seSlcbiAgY29uc3Qgbm90ZXNQcmV2aWV3ID0gcm93Lm5vdGVzXG4gICAgPyBgPGRpdiBpZD1cInNtLW5vdGVzLXByZXZpZXctJHtyb3cuaWR4fVwiIHN0eWxlPVwiZm9udC1zaXplOjAuNzhlbTtjb2xvcjojOTRhM2I4O21hcmdpbi10b3A6MnB4O21heC13aWR0aDoyNjBweDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpczt3aGl0ZS1zcGFjZTpub3dyYXA7XCIgdGl0bGU9XCIke2VzY2FwZUh0bWwocm93Lm5vdGVzKX1cIj4ke2VzY2FwZUh0bWwocm93Lm5vdGVzKX08L2Rpdj5gXG4gICAgOiBgPGRpdiBpZD1cInNtLW5vdGVzLXByZXZpZXctJHtyb3cuaWR4fVwiIHN0eWxlPVwiZGlzcGxheTpub25lO2ZvbnQtc2l6ZTowLjc4ZW07Y29sb3I6Izk0YTNiODttYXJnaW4tdG9wOjJweDtcIj48L2Rpdj5gO1xuICBjb25zdCBub3Rlc0VkaXRXaWRnZXQgPSByb3cudHlwZSA9PT0gJ3NhdmVkJ1xuICAgID8gYDxzcGFuIGlkPVwic20tbm90ZXMtZWRpdC0ke3Jvdy5pZHh9XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2dhcDo0cHg7bWFyZ2luLXRvcDo0cHg7d2lkdGg6MTAwJTtcIj5gICtcbiAgICAgICAgYDx0ZXh0YXJlYSBpZD1cInNtLW5vdGVzLXRhLSR7cm93LmlkeH1cIiByb3dzPVwiMlwiIG1heGxlbmd0aD1cIjIwMDBcImAgK1xuICAgICAgICAgIGAgc3R5bGU9XCJ3aWR0aDoxMDAlO2ZvbnQtc2l6ZToxMnB4O3BhZGRpbmc6NHB4O2JvcmRlcjoxcHggc29saWQgIzNiODJmNjtib3JkZXItcmFkaXVzOjRweDtyZXNpemU6dmVydGljYWw7XCJgICtcbiAgICAgICAgICBgIGFyaWEtbGFiZWw9XCJTZXNzaW9uIG5vdGVzXCIgcGxhY2Vob2xkZXI9XCJlLmcuLCBJbnRlcnZpZXdlZCAyMDI1LTAzLTEwLCBhd2FpdGluZyBjYWxsYmFja1wiPiR7ZXNjYXBlSHRtbChyb3cubm90ZXMgfHwgJycpfTwvdGV4dGFyZWE+YCArXG4gICAgICAgIGA8c3BhbiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6NHB4O1wiPmAgK1xuICAgICAgICAgIGA8YnV0dG9uIGRhdGEtc20tYWN0aW9uPVwic3VibWl0LW5vdGVzXCIgZGF0YS1zbS1wYXRoPVwiJHtlc2NhcGVIdG1sKHJvdy5wYXRoIHx8ICcnKX1cIiBkYXRhLXNtLWlkeD1cIiR7cm93LmlkeH1cIiBjbGFzcz1cInNtLWJ0blwiIHRpdGxlPVwiU2F2ZSBub3Rlc1wiIGFyaWEtbGFiZWw9XCJTYXZlIG5vdGVzXCI+JiMxMDAwMzs8L2J1dHRvbj5gICtcbiAgICAgICAgICBgPGJ1dHRvbiBkYXRhLXNtLWFjdGlvbj1cImNhbmNlbC1ub3Rlc1wiIGRhdGEtc20taWR4PVwiJHtyb3cuaWR4fVwiIGNsYXNzPVwic20tYnRuXCIgdGl0bGU9XCJDYW5jZWxcIiBhcmlhLWxhYmVsPVwiQ2FuY2VsIG5vdGVzIGVkaXRcIj4mIzEwMDA1OzwvYnV0dG9uPmAgK1xuICAgICAgICBgPC9zcGFuPmAgK1xuICAgICAgYDwvc3Bhbj5gXG4gICAgOiAnJztcblxuICBpZiAocm93LnR5cGUgPT09ICdzYXZlZCcpIHtcbiAgICBhY3Rpb25IdG1sICs9XG4gICAgICBgPGJ1dHRvbiBkYXRhLXNtLWFjdGlvbj1cImVkaXQtc3RhdHVzXCIgZGF0YS1zbS1wYXRoPVwiJHtlc2NhcGVIdG1sKHJvdy5wYXRoIHx8ICcnKX1cIiBkYXRhLXNtLWlkeD1cIiR7cm93LmlkeH1cIiBjbGFzcz1cInNtLWJ0biBzbS1idG4taWNvblwiIHRpdGxlPVwiVXBkYXRlIGFwcGxpY2F0aW9uIHN0YXR1c1wiIGFyaWEtbGFiZWw9XCJVcGRhdGUgYXBwbGljYXRpb24gc3RhdHVzXCI+PGkgY2xhc3M9XCJmYS1zb2xpZCBmYS10YWdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+PC9idXR0b24+YDtcbiAgICBhY3Rpb25IdG1sICs9XG4gICAgICBgPGJ1dHRvbiBkYXRhLXNtLWFjdGlvbj1cImVkaXQtbm90ZXNcIiBkYXRhLXNtLXBhdGg9XCIke2VzY2FwZUh0bWwocm93LnBhdGggfHwgJycpfVwiIGRhdGEtc20taWR4PVwiJHtyb3cuaWR4fVwiIGNsYXNzPVwic20tYnRuIHNtLWJ0bi1pY29uXCIgdGl0bGU9XCJFZGl0IG5vdGVzXCIgYXJpYS1sYWJlbD1cIkVkaXQgbm90ZXNcIj48aSBjbGFzcz1cImZhLXNvbGlkIGZhLW5vdGUtc3RpY2t5XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPjwvYnV0dG9uPmA7XG4gIH1cblxuICBjb25zdCBhdHNTY29yZUxhYmVsID0gcm93LmF0c1Njb3JlICE9IG51bGxcbiAgICA/ICgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHMgPSBOdW1iZXIocm93LmF0c1Njb3JlKTtcbiAgICAgICAgY29uc3QgY29sb3IgPSBzID49IDc1ID8gJyMwNTk2NjknIDogcyA+PSA1MCA/ICcjZDk3NzA2JyA6ICcjZGMyNjI2JztcbiAgICAgICAgcmV0dXJuIGAgPHNwYW4gdGl0bGU9XCJBVFMgbWF0Y2ggc2NvcmVcIiBzdHlsZT1cImZvbnQtc2l6ZTowLjc4ZW07cGFkZGluZzoxcHggNXB4O2JvcmRlci1yYWRpdXM6OXB4O2JhY2tncm91bmQ6JHtjb2xvcn07Y29sb3I6I2ZmZjt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7Zm9udC13ZWlnaHQ6NjAwO1wiPiR7c30lPC9zcGFuPmA7XG4gICAgICB9KSgpXG4gICAgOiAnJztcblxuICByZXR1cm4gYDxkaXYgY2xhc3M9XCIke3Jvd0NsYXNzfVwiPmAgK1xuICAgIGA8c3BhbiBjbGFzcz1cInNtLXRkIHNtLXRkLW5hbWVcIj4ke25hbWVDZWxsfTwvc3Bhbj5gICtcbiAgICBgPHNwYW4gY2xhc3M9XCJzbS10ZCBzbS10ZC1zdGF0dXNcIj4ke3N0YXR1c1BpbGx9PC9zcGFuPmAgK1xuICAgIGA8c3BhbiBjbGFzcz1cInNtLXRkIHNtLXRkLXBoYXNlXCI+PHNwYW4gaWQ9XCJzbS1waGFzZS0ke3Jvdy5pZHh9XCI+JHtwaGFzZUxhYmVsfSR7YXRzU2NvcmVMYWJlbH0ke2FwcFN0YXR1c0JhZGdlfTwvc3Bhbj4ke3N0YXR1c0VkaXRXaWRnZXR9JHtub3Rlc1ByZXZpZXd9JHtub3Rlc0VkaXRXaWRnZXR9PC9zcGFuPmAgK1xuICAgIGA8c3BhbiBjbGFzcz1cInNtLXRkIHNtLXRkLWRhdGVcIj4ke21vZExhYmVsfTwvc3Bhbj5gICtcbiAgICBgPHNwYW4gY2xhc3M9XCJzbS10ZCBzbS10ZC1hY3Rpb25zXCI+JHthY3Rpb25IdG1sfTwvc3Bhbj5gICtcbiAgICBgPC9kaXY+YDtcbn1cblxuZnVuY3Rpb24gX3JlbmRlclJlY2VudHNTdHJpcChyZWNlbnRSb3dzKSB7XG4gIGlmICghcmVjZW50Um93cy5sZW5ndGgpIHJldHVybiAnJztcbiAgY29uc3QgaXRlbXMgPSByZWNlbnRSb3dzLm1hcChyb3cgPT4ge1xuICAgIGNvbnN0IGxhYmVsICAgID0gZXNjYXBlSHRtbChyb3cubmFtZSk7XG4gICAgY29uc3QgZG90Q2xhc3MgPSByb3cudHlwZSA9PT0gJ2FjdGl2ZSdcbiAgICAgID8gKHJvdy5vd25lcnNoaXAuaXNDdXJyZW50ID8gJ3NtLXJlY2VudC1kb3QtY3VycmVudCcgOiAnc20tcmVjZW50LWRvdC1vdGhlcicpXG4gICAgICA6ICdzbS1yZWNlbnQtZG90LXNhdmVkJztcbiAgICBjb25zdCBkb3QgPSBgPHNwYW4gY2xhc3M9XCJzbS1yZWNlbnQtZG90ICR7ZG90Q2xhc3N9XCI+PC9zcGFuPmA7XG4gICAgaWYgKHJvdy50eXBlID09PSAnYWN0aXZlJykge1xuICAgICAgY29uc3QgaHJlZiAgPSBgLz9zZXNzaW9uPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHJvdy5zZXNzaW9uSWQgfHwgJycpfWA7XG4gICAgICBjb25zdCBleHRyYSA9IHJvdy5vd25lcnNoaXAuaXNDdXJyZW50ID8gJyBzbS1yZWNlbnQtY3VycmVudCcgOiAnJztcbiAgICAgIHJldHVybiBgPGEgY2xhc3M9XCJzbS1yZWNlbnQtaXRlbSR7ZXh0cmF9XCIgaHJlZj1cIiR7aHJlZn1cIj4ke2RvdH0ke2xhYmVsfTwvYT5gO1xuICAgIH1cbiAgICByZXR1cm4gYDxidXR0b24gY2xhc3M9XCJzbS1yZWNlbnQtaXRlbVwiIGRhdGEtc20tYWN0aW9uPVwibG9hZFwiIGRhdGEtc20tcGF0aD1cIiR7ZXNjYXBlSHRtbChyb3cucGF0aCB8fCAnJyl9XCI+JHtkb3R9JHtsYWJlbH08L2J1dHRvbj5gO1xuICB9KS5qb2luKCcnKTtcbiAgcmV0dXJuIGA8ZGl2IGNsYXNzPVwic20tcmVjZW50c1wiPjxkaXYgY2xhc3M9XCJzbS1yZWNlbnRzLWxhYmVsXCI+UmVjZW50PC9kaXY+PGRpdiBjbGFzcz1cInNtLXJlY2VudHMtbGlzdFwiPiR7aXRlbXN9PC9kaXY+PC9kaXY+YDtcbn1cblxuZnVuY3Rpb24gX3JlbmRlclNlc3Npb25UYWJsZUZyb21DYWNoZSgpIHtcbiAgY29uc3QgYm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXNzaW9ucy1tb2RhbC1ib2R5Jyk7XG4gIGlmICghYm9keSkgcmV0dXJuO1xuXG4gIGNvbnN0IHJvd3MgICA9IF9ub3JtYWxpemVTZXNzaW9uc0ZvclRhYmxlKF9zbUFjdGl2ZUNhY2hlLCBfc21TYXZlZENhY2hlKTtcbiAgY29uc3QgYnlEYXRlID0gX3NvcnRTZXNzaW9uUm93cyhyb3dzLCAnbGFzdE1vZGlmaWVkJywgJ2Rlc2MnKTtcbiAgY29uc3Qgc29ydGVkID0gX3NvcnRTZXNzaW9uUm93cyhyb3dzLCBfc21Tb3J0S2V5LCBfc21Tb3J0RGlyKTtcblxuICBpZiAoc29ydGVkLmxlbmd0aCA9PT0gMCkge1xuICAgIGJvZHkuaW5uZXJIVE1MID0gJzxwIGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1lbXB0eVwiIHN0eWxlPVwicGFkZGluZzoyNHB4IDE2cHg7XCI+Tm8gc2Vzc2lvbnMgZm91bmQuIENyZWF0ZSBvbmUgdG8gZ2V0IHN0YXJ0ZWQuPC9wPic7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcGFydHMgPSBbXG4gICAgX3NtQWN0aXZlQ2FjaGUubGVuZ3RoID8gYCR7X3NtQWN0aXZlQ2FjaGUubGVuZ3RofSBhY3RpdmVgIDogJycsXG4gICAgX3NtU2F2ZWRDYWNoZS5sZW5ndGggID8gYCR7X3NtU2F2ZWRDYWNoZS5sZW5ndGh9IHNhdmVkYCAgIDogJycsXG4gIF0uZmlsdGVyKEJvb2xlYW4pO1xuXG4gIGJvZHkuaW5uZXJIVE1MID1cbiAgICBfcmVuZGVyUmVjZW50c1N0cmlwKGJ5RGF0ZS5zbGljZSgwLCA1KSkgK1xuICAgIGA8ZGl2IGNsYXNzPVwic20tdGFibGUtd3JhcFwiPmAgK1xuICAgICAgYDxkaXYgY2xhc3M9XCJzbS10YWJsZS1pbmZvXCI+JHtwYXJ0cy5qb2luKCcgXFx1MDBiNyAnKX08L2Rpdj5gICtcbiAgICAgIF9yZW5kZXJTZXNzaW9uVGFibGVIZWFkZXIoKSArXG4gICAgICBgPGRpdiBjbGFzcz1cInNtLXRib2R5XCI+JHtzb3J0ZWQubWFwKF9yZW5kZXJTZXNzaW9uVGFibGVSb3cpLmpvaW4oJycpfTwvZGl2PmAgK1xuICAgIGA8L2Rpdj5gO1xufVxuXG5mdW5jdGlvbiBfaGFuZGxlU2Vzc2lvbk1vZGFsQ2xpY2soZSkge1xuICBjb25zdCBzb3J0QnRuID0gZS50YXJnZXQuY2xvc2VzdCgnW2RhdGEtc20tc29ydF0nKTtcbiAgaWYgKHNvcnRCdG4pIHsgX3NldFNtU29ydChzb3J0QnRuLmRhdGFzZXQuc21Tb3J0KTsgcmV0dXJuOyB9XG5cbiAgY29uc3QgYnRuID0gZS50YXJnZXQuY2xvc2VzdCgnW2RhdGEtc20tYWN0aW9uXScpO1xuICBpZiAoIWJ0bikgcmV0dXJuO1xuICBjb25zdCBwYXRoICAgPSBidG4uZGF0YXNldC5zbVBhdGg7XG4gIGNvbnN0IGlkeCAgICA9IHBhcnNlSW50KGJ0bi5kYXRhc2V0LnNtSWR4ID8/ICctMScsIDEwKTtcbiAgY29uc3QgYWN0aW9uID0gYnRuLmRhdGFzZXQuc21BY3Rpb247XG4gIGlmICAgICAgKGFjdGlvbiA9PT0gJ3JlbmFtZScpICAgICAgICBzdGFydFNlc3Npb25Nb2RhbFJlbmFtZShwYXRoLCBpZHgpO1xuICBlbHNlIGlmIChhY3Rpb24gPT09ICdzdWJtaXQtcmVuYW1lJykgc3VibWl0U2Vzc2lvbk1vZGFsUmVuYW1lKHBhdGgsIGlkeCk7XG4gIGVsc2UgaWYgKGFjdGlvbiA9PT0gJ2NhbmNlbC1yZW5hbWUnKSBjYW5jZWxTZXNzaW9uTW9kYWxSZW5hbWUoaWR4KTtcbiAgZWxzZSBpZiAoYWN0aW9uID09PSAnZWRpdC1zdGF0dXMnKSAgIHN0YXJ0U2Vzc2lvblN0YXR1c0VkaXQoaWR4KTtcbiAgZWxzZSBpZiAoYWN0aW9uID09PSAnc3VibWl0LXN0YXR1cycpIHN1Ym1pdFNlc3Npb25TdGF0dXNFZGl0KHBhdGgsIGlkeCk7XG4gIGVsc2UgaWYgKGFjdGlvbiA9PT0gJ2NhbmNlbC1zdGF0dXMnKSBjYW5jZWxTZXNzaW9uU3RhdHVzRWRpdChpZHgpO1xuICBlbHNlIGlmIChhY3Rpb24gPT09ICdlZGl0LW5vdGVzJykgICAgc3RhcnRTZXNzaW9uTm90ZXNFZGl0KGlkeCk7XG4gIGVsc2UgaWYgKGFjdGlvbiA9PT0gJ3N1Ym1pdC1ub3RlcycpICBzdWJtaXRTZXNzaW9uTm90ZXNFZGl0KHBhdGgsIGlkeCk7XG4gIGVsc2UgaWYgKGFjdGlvbiA9PT0gJ2NhbmNlbC1ub3RlcycpICBjYW5jZWxTZXNzaW9uTm90ZXNFZGl0KGlkeCk7XG4gIGVsc2UgaWYgKGFjdGlvbiA9PT0gJ2xvYWQnKSAgICAgICAgICBsb2FkU2Vzc2lvbkFuZENsb3NlTW9kYWwocGF0aCk7XG4gIGVsc2UgaWYgKGFjdGlvbiA9PT0gJ2R1cGxpY2F0ZScpICAgICBfZHVwbGljYXRlU2Vzc2lvbkZyb21Nb2RhbChwYXRoKTtcbiAgZWxzZSBpZiAoYWN0aW9uID09PSAnZGVsZXRlJykgICAgICAgIF9kZWxldGVTZXNzaW9uRnJvbU1vZGFsKHBhdGgsIGUpO1xufVxuXG5mdW5jdGlvbiBfaGFuZGxlU2Vzc2lvbk1vZGFsS2V5ZG93bihlKSB7XG4gIGlmICgoZS5rZXkgPT09ICdFbnRlcicgfHwgZS5rZXkgPT09ICcgJykgJiYgZS50YXJnZXQuY2xvc2VzdCgnW2RhdGEtc20tc29ydF0nKSkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBfc2V0U21Tb3J0KGUudGFyZ2V0LmNsb3Nlc3QoJ1tkYXRhLXNtLXNvcnRdJykuZGF0YXNldC5zbVNvcnQpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBpbnB1dCA9IGUudGFyZ2V0LmNsb3Nlc3QoJy5zbS1rZXktaW5wdXQnKTtcbiAgaWYgKCFpbnB1dCkgcmV0dXJuO1xuICBjb25zdCBwYXRoID0gaW5wdXQuZGF0YXNldC5zbVBhdGg7XG4gIGNvbnN0IGlkeCAgPSBwYXJzZUludChpbnB1dC5kYXRhc2V0LnNtSWR4LCAxMCk7XG4gIGlmICAgICAgKGUua2V5ID09PSAnRW50ZXInKSAgc3VibWl0U2Vzc2lvbk1vZGFsUmVuYW1lKHBhdGgsIGlkeCk7XG4gIGVsc2UgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgY2FuY2VsU2Vzc2lvbk1vZGFsUmVuYW1lKGlkeCk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBTZXNzaW9ucyBtb2RhbCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gb3BlblNlc3Npb25zTW9kYWwoeyByZXF1aXJlZCA9IGZhbHNlIH0gPSB7fSkge1xuICBjb25zdCBvdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Nlc3Npb25zLW1vZGFsLW92ZXJsYXknKTtcbiAgaWYgKCFvdmVybGF5KSByZXR1cm47XG4gIG92ZXJsYXkuZGF0YXNldC5kaXNtaXNzRGlzYWJsZWQgPSByZXF1aXJlZCA/ICcxJyA6ICcnO1xuICBjb25zdCBjbG9zZVggICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXNzaW9ucy1tb2RhbC1jbG9zZS14Jyk7XG4gIGNvbnN0IGNsb3NlRm9vdGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Nlc3Npb25zLW1vZGFsLWNsb3NlLWZvb3RlcicpO1xuICBpZiAoY2xvc2VYKSAgICAgIGNsb3NlWC5zdHlsZS5kaXNwbGF5ICAgICAgPSByZXF1aXJlZCA/ICdub25lJyA6ICcnO1xuICBpZiAoY2xvc2VGb290ZXIpIGNsb3NlRm9vdGVyLnN0eWxlLmRpc3BsYXkgPSByZXF1aXJlZCA/ICdub25lJyA6ICcnO1xuICBvdmVybGF5LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIHdpbmRvdy5fZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIGF3YWl0IF9yZW5kZXJTZXNzaW9uc01vZGFsQm9keSgpO1xuICBfcmVmcmVzaFRyYXNoQmFkZ2UoKTtcbiAgdHJhcEZvY3VzKCdzZXNzaW9ucy1tb2RhbC1vdmVybGF5Jyk7XG4gIHNldEluaXRpYWxGb2N1cygnc2Vzc2lvbnMtbW9kYWwtb3ZlcmxheScpO1xufVxuXG5mdW5jdGlvbiBjbG9zZVNlc3Npb25zTW9kYWwoKSB7XG4gIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2Vzc2lvbnMtbW9kYWwtb3ZlcmxheScpO1xuICBpZiAoIW92ZXJsYXkpIHJldHVybjtcbiAgaWYgKG92ZXJsYXkuZGF0YXNldC5kaXNtaXNzRGlzYWJsZWQgPT09ICcxJykgcmV0dXJuO1xuICBvdmVybGF5LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHJlc3RvcmVGb2N1cygpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBfcmVuZGVyU2Vzc2lvbnNNb2RhbEJvZHkoKSB7XG4gIGNvbnN0IGJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2Vzc2lvbnMtbW9kYWwtYm9keScpO1xuICBpZiAoIWJvZHkpIHJldHVybjtcbiAgYm9keS5pbm5lckhUTUwgPSAnPGRpdiBzdHlsZT1cInBhZGRpbmc6MjRweDtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7Z2FwOjEwcHg7Y29sb3I6IzZiNzI4MDtcIj48c3BhbiBjbGFzcz1cImxvYWRpbmctc3Bpbm5lclwiPjwvc3Bhbj4gTG9hZGluZyBzZXNzaW9uc1xcdTIwMjY8L2Rpdj4nO1xuICB0cnkge1xuICAgIGNvbnN0IFthY3RpdmVSZXMsIHNhdmVkUmVzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGZldGNoKCcvYXBpL3Nlc3Npb25zL2FjdGl2ZScpLFxuICAgICAgZmV0Y2goJy9hcGkvc2Vzc2lvbnMnKSxcbiAgICBdKTtcbiAgICBfc21BY3RpdmVDYWNoZSA9IGFjdGl2ZVJlcy5vayA/ICgoYXdhaXQgYWN0aXZlUmVzLmpzb24oKSkuc2Vzc2lvbnMgfHwgW10pIDogW107XG4gICAgY29uc3Qgc2F2ZWREYXRhID0gc2F2ZWRSZXMub2sgPyBwYXJzZVNlc3Npb25MaXN0UmVzcG9uc2UoYXdhaXQgc2F2ZWRSZXMuanNvbigpKSA6IHsgc2Vzc2lvbnM6IFtdIH07XG4gICAgX3NtU2F2ZWRDYWNoZSAgID0gc2F2ZWREYXRhLnNlc3Npb25zIHx8IFtdO1xuICB9IGNhdGNoIChlKSB7XG4gICAgYm9keS5pbm5lckhUTUwgPSBgPHAgc3R5bGU9XCJwYWRkaW5nOjIwcHg7Y29sb3I6I2VmNDQ0NDtcIj5Db3VsZCBub3QgbG9hZCBzZXNzaW9uczogJHtlc2NhcGVIdG1sKGUubWVzc2FnZSl9PC9wPmA7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIFdpcmUgZXZlbnQgZGVsZWdhdGlvbiBvbmNlOyBwZXJzaXN0cyBhY3Jvc3MgcmUtcmVuZGVycyBzaW5jZSBib2R5IGVsZW1lbnQgaXMgc3RhYmxlXG4gIGlmICghYm9keS5fc21MaXN0ZW5lckF0dGFjaGVkKSB7XG4gICAgYm9keS5fc21MaXN0ZW5lckF0dGFjaGVkID0gdHJ1ZTtcbiAgICBib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgICBfaGFuZGxlU2Vzc2lvbk1vZGFsQ2xpY2spO1xuICAgIGJvZHkuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIF9oYW5kbGVTZXNzaW9uTW9kYWxLZXlkb3duKTtcbiAgfVxuICBfcmVuZGVyU2Vzc2lvblRhYmxlRnJvbUNhY2hlKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxvYWRTZXNzaW9uQW5kQ2xvc2VNb2RhbChwYXRoKSB7XG4gIC8vIENsZWFyIGRpc21pc3NEaXNhYmxlZCBzbyBsb2FkaW5nIGEgc2Vzc2lvbiBhbHdheXMgY2xvc2VzIHRoZSBtb2RhbCxcbiAgLy8gZXZlbiB3aGVuIGl0IHdhcyBvcGVuZWQgaW4gcmVxdWlyZWQgKHN0YXJ0dXApIG1vZGUuXG4gIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2Vzc2lvbnMtbW9kYWwtb3ZlcmxheScpO1xuICBpZiAob3ZlcmxheSkgb3ZlcmxheS5kYXRhc2V0LmRpc21pc3NEaXNhYmxlZCA9ICcnO1xuICBjbG9zZVNlc3Npb25zTW9kYWwoKTtcbiAgYXdhaXQgbG9hZFNlc3Npb25GaWxlKHBhdGgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBuZXdTZXNzaW9uRnJvbU1vZGFsKCkge1xuICBjbG9zZVNlc3Npb25zTW9kYWwoKTtcbiAgYXdhaXQgY3JlYXRlTmV3U2Vzc2lvbkFuZE5hdmlnYXRlKCk7XG59XG5cbmZ1bmN0aW9uIHN0YXJ0U2Vzc2lvbk1vZGFsUmVuYW1lKHBhdGgsIGlkeCkge1xuICBjb25zdCBuYW1lRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc20tbmFtZS0ke2lkeH1gKTtcbiAgY29uc3QgZm9ybSAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNtLXJlbmFtZS0ke2lkeH1gKTtcbiAgaWYgKG5hbWVFbCkgbmFtZUVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIGlmIChmb3JtKSAgIGZvcm0uc3R5bGUuZGlzcGxheSAgID0gJ2ZsZXgnO1xuICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzbS1pbnB1dC0ke2lkeH1gKTtcbiAgaWYgKGlucHV0KSB7IGlucHV0LmZvY3VzKCk7IGlucHV0LnNlbGVjdCgpOyB9XG59XG5cbmZ1bmN0aW9uIGNhbmNlbFNlc3Npb25Nb2RhbFJlbmFtZShpZHgpIHtcbiAgY29uc3QgbmFtZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNtLW5hbWUtJHtpZHh9YCk7XG4gIGNvbnN0IGZvcm0gICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzbS1yZW5hbWUtJHtpZHh9YCk7XG4gIGlmIChmb3JtKSAgIGZvcm0uc3R5bGUuZGlzcGxheSAgID0gJ25vbmUnO1xuICBpZiAobmFtZUVsKSBuYW1lRWwuc3R5bGUuZGlzcGxheSA9ICcnO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzdWJtaXRTZXNzaW9uTW9kYWxSZW5hbWUocGF0aCwgaWR4KSB7XG4gIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNtLWlucHV0LSR7aWR4fWApO1xuICBpZiAoIWlucHV0KSByZXR1cm47XG4gIGNvbnN0IG5ld05hbWUgPSBpbnB1dC52YWx1ZS50cmltKCk7XG4gIGlmICghbmV3TmFtZSkgcmV0dXJuO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9yZW5hbWUtc2Vzc2lvbicsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcGF0aCwgbmV3X25hbWU6IG5ld05hbWUgfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEub2spIHtcbiAgICAgIGNvbnN0IG5hbWVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzbS1uYW1lLSR7aWR4fWApO1xuICAgICAgaWYgKG5hbWVFbCkgbmFtZUVsLnRleHRDb250ZW50ID0gbmV3TmFtZTtcbiAgICAgIGNhbmNlbFNlc3Npb25Nb2RhbFJlbmFtZShpZHgpO1xuICAgICAgYXdhaXQgZmV0Y2hTdGF0dXMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHNob3dUb2FzdChgUmVuYW1lIGZhaWxlZDogJHtkYXRhLmVycm9yfWAsICdlcnJvcicpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkgeyBpZiAodHlwZW9mIHNob3dUb2FzdCA9PT0gJ2Z1bmN0aW9uJykgc2hvd1RvYXN0KGBSZW5hbWUgZXJyb3I6ICR7ZS5tZXNzYWdlfWAsICdlcnJvcicpOyB9XG59XG5cbmZ1bmN0aW9uIHN0YXJ0U2Vzc2lvblN0YXR1c0VkaXQoaWR4KSB7XG4gIGNvbnN0IHBoYXNlRWwgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNtLXBoYXNlLSR7aWR4fWApO1xuICBjb25zdCBlZGl0V2lkZ2V0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNtLXN0YXR1cy1lZGl0LSR7aWR4fWApO1xuICBpZiAocGhhc2VFbCkgICAgcGhhc2VFbC5zdHlsZS5kaXNwbGF5ICAgID0gJ25vbmUnO1xuICBpZiAoZWRpdFdpZGdldCkgZWRpdFdpZGdldC5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICBjb25zdCBzZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc20tc3RhdHVzLXNlbC0ke2lkeH1gKTtcbiAgaWYgKHNlbCkgc2VsLmZvY3VzKCk7XG59XG5cbmZ1bmN0aW9uIGNhbmNlbFNlc3Npb25TdGF0dXNFZGl0KGlkeCkge1xuICBjb25zdCBwaGFzZUVsICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNtLXBoYXNlLSR7aWR4fWApO1xuICBjb25zdCBlZGl0V2lkZ2V0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNtLXN0YXR1cy1lZGl0LSR7aWR4fWApO1xuICBpZiAoZWRpdFdpZGdldCkgZWRpdFdpZGdldC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBpZiAocGhhc2VFbCkgICAgcGhhc2VFbC5zdHlsZS5kaXNwbGF5ICAgID0gJyc7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN1Ym1pdFNlc3Npb25TdGF0dXNFZGl0KHBhdGgsIGlkeCkge1xuICBjb25zdCBzZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc20tc3RhdHVzLXNlbC0ke2lkeH1gKTtcbiAgaWYgKCFzZWwpIHJldHVybjtcbiAgY29uc3QgbmV3U3RhdHVzID0gc2VsLnZhbHVlO1xuICBjb25zdCBfYXBwU3RhdHVzTGFiZWxzID0ge1xuICAgIGRyYWZ0OiAnRHJhZnQnLCByZWFkeTogJ1JlYWR5Jywgc2VudDogJ1NlbnQnLCBxdWV1ZWQ6ICdRdWV1ZWQnLFxuICAgIGludGVydmlldzogJ0ludGVydmlldycsIHJlamVjdGVkOiAnUmVqZWN0ZWQnLCBhY2NlcHRlZDogJ0FjY2VwdGVkJyxcbiAgICBwYXJrZWQ6ICdQYXJrZWQnLFxuICB9O1xuICBjb25zdCBfYXBwU3RhdHVzQ29sb3JzID0ge1xuICAgIGRyYWZ0OiAnIzk0YTNiOCcsIHJlYWR5OiAnIzNiODJmNicsIHNlbnQ6ICcjMjJjNTVlJywgcXVldWVkOiAnI2VhYjMwOCcsXG4gICAgaW50ZXJ2aWV3OiAnI2E4NTVmNycsIHJlamVjdGVkOiAnI2VmNDQ0NCcsIGFjY2VwdGVkOiAnIzA1OTY2OScsXG4gICAgcGFya2VkOiAnI2Y5NzMxNicsXG4gIH07XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL3Nlc3Npb25zL21ldGFkYXRhJywge1xuICAgICAgbWV0aG9kOiAnUEFUQ0gnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcGF0aCwgYXBwbGljYXRpb25fc3RhdHVzOiBuZXdTdGF0dXMgfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEub2spIHtcbiAgICAgIGNvbnN0IGJhZGdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNtLXN0YXR1cy1iYWRnZS0ke2lkeH1gKTtcbiAgICAgIGlmIChiYWRnZSkge1xuICAgICAgICBpZiAobmV3U3RhdHVzICYmIF9hcHBTdGF0dXNMYWJlbHNbbmV3U3RhdHVzXSkge1xuICAgICAgICAgIGJhZGdlLnRleHRDb250ZW50ID0gX2FwcFN0YXR1c0xhYmVsc1tuZXdTdGF0dXNdO1xuICAgICAgICAgIGJhZGdlLnN0eWxlLmNzc1RleHQgPSBgZm9udC1zaXplOjAuNzVlbTtwYWRkaW5nOjFweCA2cHg7Ym9yZGVyLXJhZGl1czo5cHg7YmFja2dyb3VuZDoke19hcHBTdGF0dXNDb2xvcnNbbmV3U3RhdHVzXX07Y29sb3I6I2ZmZjt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBiYWRnZS50ZXh0Q29udGVudCA9ICcnO1xuICAgICAgICAgIGJhZGdlLnN0eWxlLmNzc1RleHQgPSAnJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2FuY2VsU2Vzc2lvblN0YXR1c0VkaXQoaWR4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHNob3dUb2FzdChgU3RhdHVzIHVwZGF0ZSBmYWlsZWQ6ICR7ZGF0YS5lcnJvciB8fCAnVW5rbm93biBlcnJvcid9YCwgJ2Vycm9yJyk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHNob3dUb2FzdChgU3RhdHVzIHVwZGF0ZSBlcnJvcjogJHtlLm1lc3NhZ2V9YCwgJ2Vycm9yJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3RhcnRTZXNzaW9uTm90ZXNFZGl0KGlkeCkge1xuICBjb25zdCBlZGl0V2lkZ2V0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNtLW5vdGVzLWVkaXQtJHtpZHh9YCk7XG4gIGNvbnN0IHByZXZpZXcgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc20tbm90ZXMtcHJldmlldy0ke2lkeH1gKTtcbiAgaWYgKHByZXZpZXcpICAgIHByZXZpZXcuc3R5bGUuZGlzcGxheSAgICA9ICdub25lJztcbiAgaWYgKGVkaXRXaWRnZXQpIGVkaXRXaWRnZXQuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgY29uc3QgdGEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc20tbm90ZXMtdGEtJHtpZHh9YCk7XG4gIGlmICh0YSkgeyB0YS5mb2N1cygpOyB0YS5zZWxlY3Rpb25TdGFydCA9IHRhLnNlbGVjdGlvbkVuZCA9IHRhLnZhbHVlLmxlbmd0aDsgfVxufVxuXG5mdW5jdGlvbiBjYW5jZWxTZXNzaW9uTm90ZXNFZGl0KGlkeCkge1xuICBjb25zdCBlZGl0V2lkZ2V0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNtLW5vdGVzLWVkaXQtJHtpZHh9YCk7XG4gIGNvbnN0IHByZXZpZXcgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc20tbm90ZXMtcHJldmlldy0ke2lkeH1gKTtcbiAgaWYgKGVkaXRXaWRnZXQpIGVkaXRXaWRnZXQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgaWYgKHByZXZpZXcpICAgIHByZXZpZXcuc3R5bGUuZGlzcGxheSAgICA9ICcnO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzdWJtaXRTZXNzaW9uTm90ZXNFZGl0KHBhdGgsIGlkeCkge1xuICBjb25zdCB0YSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzbS1ub3Rlcy10YS0ke2lkeH1gKTtcbiAgaWYgKCF0YSkgcmV0dXJuO1xuICBjb25zdCBuZXdOb3RlcyA9IHRhLnZhbHVlO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9zZXNzaW9ucy9tZXRhZGF0YScsIHtcbiAgICAgIG1ldGhvZDogJ1BBVENIJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHBhdGgsIG5vdGVzOiBuZXdOb3RlcyB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgY29uc3QgcHJldmlldyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzbS1ub3Rlcy1wcmV2aWV3LSR7aWR4fWApO1xuICAgICAgaWYgKHByZXZpZXcpIHtcbiAgICAgICAgcHJldmlldy50ZXh0Q29udGVudCA9IG5ld05vdGVzO1xuICAgICAgICBwcmV2aWV3LnRpdGxlICAgICAgID0gbmV3Tm90ZXM7XG4gICAgICAgIHByZXZpZXcuc3R5bGUuZGlzcGxheSA9IG5ld05vdGVzID8gJycgOiAnbm9uZSc7XG4gICAgICB9XG4gICAgICBjYW5jZWxTZXNzaW9uTm90ZXNFZGl0KGlkeCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0eXBlb2Ygc2hvd1RvYXN0ID09PSAnZnVuY3Rpb24nKSBzaG93VG9hc3QoYE5vdGVzIHVwZGF0ZSBmYWlsZWQ6ICR7ZGF0YS5lcnJvciB8fCAnVW5rbm93biBlcnJvcid9YCwgJ2Vycm9yJyk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHNob3dUb2FzdChgTm90ZXMgdXBkYXRlIGVycm9yOiAke2UubWVzc2FnZX1gLCAnZXJyb3InKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBfZGVsZXRlU2Vzc2lvbkZyb21Nb2RhbChwYXRoLCBldmVudCkge1xuICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgaWYgKHR5cGVvZiBjb25maXJtRGlhbG9nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY29uc3Qgb2sgPSBhd2FpdCBjb25maXJtRGlhbG9nKCdNb3ZlIHRoaXMgc2Vzc2lvbiB0byBUcmFzaD8gWW91IGNhbiByZXN0b3JlIGl0IGZyb20gdGhlIFRyYXNoIHZpZXcuJyk7XG4gICAgaWYgKCFvaykgcmV0dXJuO1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL2RlbGV0ZS1zZXNzaW9uJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBwYXRoIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgIGF3YWl0IF9yZW5kZXJTZXNzaW9uc01vZGFsQm9keSgpO1xuICAgICAgYXdhaXQgX3JlZnJlc2hUcmFzaEJhZGdlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0eXBlb2Ygc2hvd1RvYXN0ID09PSAnZnVuY3Rpb24nKSBzaG93VG9hc3QoYEZhaWxlZCB0byBtb3ZlIHNlc3Npb24gdG8gVHJhc2g6ICR7ZGF0YS5lcnJvciB8fCAnVW5rbm93biBlcnJvcid9YCwgJ2Vycm9yJyk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7IGlmICh0eXBlb2Ygc2hvd1RvYXN0ID09PSAnZnVuY3Rpb24nKSBzaG93VG9hc3QoYEVycm9yOiAke2UubWVzc2FnZX1gLCAnZXJyb3InKTsgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgRHVwbGljYXRlIHNlc3Npb24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIF9kdXBsaWNhdGVTZXNzaW9uRnJvbU1vZGFsKHBhdGgpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvc2Vzc2lvbnMvZHVwbGljYXRlJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBwYXRoIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBhd2FpdCBfcmVuZGVyU2Vzc2lvbnNNb2RhbEJvZHkoKTtcbiAgICAgIGlmICh0eXBlb2Ygc2hvd1RvYXN0ID09PSAnZnVuY3Rpb24nKSBzaG93VG9hc3QoYFNlc3Npb24gZHVwbGljYXRlZDogXCIke2RhdGEubmV3X25hbWV9XCJgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHNob3dUb2FzdChgRmFpbGVkIHRvIGR1cGxpY2F0ZSBzZXNzaW9uOiAke2RhdGEuZXJyb3IgfHwgJ1Vua25vd24gZXJyb3InfWAsICdlcnJvcicpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkgeyBpZiAodHlwZW9mIHNob3dUb2FzdCA9PT0gJ2Z1bmN0aW9uJykgc2hvd1RvYXN0KGBFcnJvcjogJHtlLm1lc3NhZ2V9YCwgJ2Vycm9yJyk7IH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIFRyYXNoIGJhZGdlIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBfcmVmcmVzaFRyYXNoQmFkZ2UoKSB7XG4gIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXNzaW9ucy10cmFzaC1idG4nKTtcbiAgaWYgKCFidG4pIHJldHVybjtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvdHJhc2gnKTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBjb25zdCBuID0gKGRhdGEuaXRlbXMgfHwgW10pLmxlbmd0aDtcbiAgICBidG4udGV4dENvbnRlbnQgPSBuID4gMCA/IGBcdUQ4M0RcdURERDEgVHJhc2ggKCR7bn0pYCA6ICdcdUQ4M0RcdURERDEgVHJhc2gnO1xuICB9IGNhdGNoIChfKSB7IC8qIGlnbm9yZSAqLyB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBUcmFzaCB2aWV3IChpbmxpbmUgaW4gc2Vzc2lvbnMgbW9kYWwpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBvcGVuVHJhc2hWaWV3KCkge1xuICBjb25zdCBib2R5ICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2Vzc2lvbnMtbW9kYWwtYm9keScpO1xuICBjb25zdCBmb290ZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc2Vzc2lvbnMtbW9kYWwtb3ZlcmxheSAubW9kYWwtZm9vdGVyJyk7XG4gIGlmICghYm9keSkgcmV0dXJuO1xuXG4gIGJvZHkuaW5uZXJIVE1MID0gJzxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDoxMnB4O3BhZGRpbmc6MjRweDtjb2xvcjojNmI3MjgwO1wiPjxkaXYgY2xhc3M9XCJsb2FkaW5nLXNwaW5uZXJcIiBzdHlsZT1cIndpZHRoOjIwcHg7aGVpZ2h0OjIwcHg7Ym9yZGVyLXdpZHRoOjJweDtmbGV4LXNocmluazowO1wiPjwvZGl2PjxzcGFuPkxvYWRpbmcgdHJhc2hcdTIwMjY8L3NwYW4+PC9kaXY+JztcblxuICBpZiAoZm9vdGVyKSB7XG4gICAgZm9vdGVyLmlubmVySFRNTCA9IGBcbiAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgb25jbGljaz1cImVtcHR5VHJhc2goKVwiXG4gICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDojZmVlMmUyO2NvbG9yOiNkYzI2MjY7Ym9yZGVyLWNvbG9yOiNmZWNhY2E7XCI+RW1wdHkgVHJhc2g8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgb25jbGljaz1cImNsb3NlVHJhc2hWaWV3KClcIj5cdTIxOTAgQmFjazwvYnV0dG9uPmA7XG4gIH1cblxuICBhd2FpdCBfcmVuZGVyVHJhc2hWaWV3KCk7XG59XG5cbmZ1bmN0aW9uIGNsb3NlVHJhc2hWaWV3KCkge1xuICBjb25zdCBmb290ZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc2Vzc2lvbnMtbW9kYWwtb3ZlcmxheSAubW9kYWwtZm9vdGVyJyk7XG4gIGlmIChmb290ZXIpIHtcbiAgICBmb290ZXIuaW5uZXJIVE1MID0gYFxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwibmV3U2Vzc2lvbkZyb21Nb2RhbCgpXCJcbiAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiMxMGI5ODE7Y29sb3I6I2ZmZjtib3JkZXItY29sb3I6IzEwYjk4MTtcIj5cdUZGMEIgTmV3IFNlc3Npb248L2J1dHRvbj5cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjhweDthbGlnbi1pdGVtczpjZW50ZXI7XCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJzZXNzaW9ucy10cmFzaC1idG5cIiBjbGFzcz1cImFjdGlvbi1idG5cIlxuICAgICAgICAgIG9uY2xpY2s9XCJvcGVuVHJhc2hWaWV3KClcIlxuICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDojZjFmNWY5O2NvbG9yOiM2NDc0OGI7Ym9yZGVyLWNvbG9yOiNlMmU4ZjA7XCI+XHVEODNEXHVEREQxIFRyYXNoPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgb25jbGljaz1cImNsb3NlU2Vzc2lvbnNNb2RhbCgpXCI+Q2xvc2U8L2J1dHRvbj5cbiAgICAgIDwvZGl2PmA7XG4gIH1cbiAgX3JlbmRlclNlc3Npb25zTW9kYWxCb2R5KCk7XG4gIF9yZWZyZXNoVHJhc2hCYWRnZSgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBfcmVuZGVyVHJhc2hWaWV3KCkge1xuICBjb25zdCBib2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Nlc3Npb25zLW1vZGFsLWJvZHknKTtcbiAgaWYgKCFib2R5KSByZXR1cm47XG4gIGxldCBpdGVtcyA9IFtdO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS90cmFzaCcpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGl0ZW1zID0gZGF0YS5pdGVtcyB8fCBbXTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGJvZHkuaW5uZXJIVE1MID0gYDxwIHN0eWxlPVwicGFkZGluZzoyMHB4O2NvbG9yOiNlZjQ0NDQ7XCI+Q291bGQgbm90IGxvYWQgdHJhc2g6ICR7ZXNjYXBlSHRtbChlLm1lc3NhZ2UpfTwvcD5gO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoaXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgYm9keS5pbm5lckhUTUwgPSAnPHAgc3R5bGU9XCJwYWRkaW5nOjI0cHg7dGV4dC1hbGlnbjpjZW50ZXI7Y29sb3I6IzZiNzI4MDtcIj5UcmFzaCBpcyBlbXB0eS48L3A+JztcbiAgICByZXR1cm47XG4gIH1cblxuICBmdW5jdGlvbiBmbXREYXRlKHRzKSB7XG4gICAgaWYgKCF0cykgcmV0dXJuICcnO1xuICAgIHRyeSB7IHJldHVybiBuZXcgRGF0ZSh0cykudG9Mb2NhbGVEYXRlU3RyaW5nKCdlbi1VUycsIHsgbW9udGg6ICdzaG9ydCcsIGRheTogJ251bWVyaWMnLCB5ZWFyOiAnbnVtZXJpYycgfSk7IH1cbiAgICBjYXRjaCB7IHJldHVybiB0cy5zbGljZSgwLCAxMCk7IH1cbiAgfVxuXG4gIGxldCBodG1sID0gJzx0YWJsZSBzdHlsZT1cIndpZHRoOjEwMCU7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlO1wiPic7XG4gIGl0ZW1zLmZvckVhY2gocyA9PiB7XG4gICAgY29uc3QgZXAgPSBlc2NhcGVIdG1sKHMucGF0aCk7XG4gICAgaHRtbCArPSBgXG4gICAgICA8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZjFmNWY5O3ZlcnRpY2FsLWFsaWduOnRvcDtcIj5cbiAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzoxMnB4IDE2cHg7XCI+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtd2VpZ2h0OjYwMDtjb2xvcjojMWUyOTNiO1wiPiR7ZXNjYXBlSHRtbChzLnBvc2l0aW9uX25hbWUgfHwgJ1VudGl0bGVkJyl9PC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZToxMnB4O2NvbG9yOiM5NGEzYjg7bWFyZ2luLXRvcDoycHg7XCI+JHtmbXREYXRlKHMudGltZXN0YW1wKX0ke3MucGhhc2UgPyAnIFx1MDBCNyAnICsgZXNjYXBlSHRtbChzLnBoYXNlKSA6ICcnfTwvZGl2PlxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOjEycHggMTZweDt3aGl0ZS1zcGFjZTpub3dyYXA7dmVydGljYWwtYWxpZ246bWlkZGxlO1wiPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjZweDtcIj5cbiAgICAgICAgICAgIDxidXR0b24gZGF0YS10cmFzaC1hY3Rpb249XCJyZXN0b3JlXCIgZGF0YS10cmFzaC1wYXRoPVwiJHtlcH1cIlxuICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6I2RiZWFmZTtjb2xvcjojMWQ0ZWQ4O2JvcmRlcjoxcHggc29saWQgI2JmZGJmZTtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjZweCAxMnB4O2ZvbnQtc2l6ZToxM3B4O2ZvbnQtd2VpZ2h0OjYwMDtjdXJzb3I6cG9pbnRlcjtcIj5SZXN0b3JlPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIGRhdGEtdHJhc2gtYWN0aW9uPVwiZGVsZXRlLWZvcmV2ZXJcIiBkYXRhLXRyYXNoLXBhdGg9XCIke2VwfVwiXG4gICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDojZmVlMmUyO2NvbG9yOiNkYzI2MjY7Ym9yZGVyOjFweCBzb2xpZCAjZmVjYWNhO2JvcmRlci1yYWRpdXM6NnB4O3BhZGRpbmc6NnB4IDhweDtmb250LXNpemU6MTNweDtjdXJzb3I6cG9pbnRlcjtcIiB0aXRsZT1cIkRlbGV0ZSBwZXJtYW5lbnRseVwiIGFyaWEtbGFiZWw9XCJEZWxldGUgcGVybWFuZW50bHlcIj5cdTI3MTU8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvdHI+YDtcbiAgfSk7XG4gIGh0bWwgKz0gJzwvdGFibGU+JztcbiAgY29uc3QgdHJhc2hXcmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHRyYXNoV3JhcHBlci5pbm5lckhUTUwgPSBodG1sO1xuICBib2R5LmlubmVySFRNTCA9ICcnO1xuICBib2R5LmFwcGVuZENoaWxkKHRyYXNoV3JhcHBlcik7XG4gIC8vIFdpcmUgdXAgdHJhc2ggYWN0aW9uIGJ1dHRvbnMgdmlhIGV2ZW50IGRlbGVnYXRpb25cbiAgdHJhc2hXcmFwcGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZSA9PiB7XG4gICAgY29uc3QgYnRuID0gZS50YXJnZXQuY2xvc2VzdCgnW2RhdGEtdHJhc2gtYWN0aW9uXScpO1xuICAgIGlmICghYnRuKSByZXR1cm47XG4gICAgY29uc3QgcGF0aCAgID0gYnRuLmRhdGFzZXQudHJhc2hQYXRoO1xuICAgIGNvbnN0IGFjdGlvbiA9IGJ0bi5kYXRhc2V0LnRyYXNoQWN0aW9uO1xuICAgIGlmICAgICAgKGFjdGlvbiA9PT0gJ3Jlc3RvcmUnKSAgICAgICAgcmVzdG9yZUZyb21UcmFzaChwYXRoKTtcbiAgICBlbHNlIGlmIChhY3Rpb24gPT09ICdkZWxldGUtZm9yZXZlcicpIGRlbGV0ZUZvcmV2ZXIocGF0aCk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXN0b3JlRnJvbVRyYXNoKHBhdGgpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvdHJhc2gvcmVzdG9yZScsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcGF0aCB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5zdWNjZXNzKSB7IGF3YWl0IF9yZW5kZXJUcmFzaFZpZXcoKTsgYXdhaXQgX3JlZnJlc2hUcmFzaEJhZGdlKCk7IH1cbiAgICBlbHNlIGlmICh0eXBlb2Ygc2hvd1RvYXN0ID09PSAnZnVuY3Rpb24nKSBzaG93VG9hc3QoYFJlc3RvcmUgZmFpbGVkOiAke2RhdGEuZXJyb3IgfHwgJ1Vua25vd24gZXJyb3InfWAsICdlcnJvcicpO1xuICB9IGNhdGNoIChlKSB7IGlmICh0eXBlb2Ygc2hvd1RvYXN0ID09PSAnZnVuY3Rpb24nKSBzaG93VG9hc3QoYEVycm9yOiAke2UubWVzc2FnZX1gLCAnZXJyb3InKTsgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVGb3JldmVyKHBhdGgpIHtcbiAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgY29uZmlybURpYWxvZyhcbiAgICAnUGVybWFuZW50bHkgZGVsZXRlIHRoaXMgc2Vzc2lvbj8gVGhpcyBjYW5ub3QgYmUgdW5kb25lLicsXG4gICAgeyBjb25maXJtTGFiZWw6ICdEZWxldGUgRm9yZXZlcicsIGNhbmNlbExhYmVsOiAnQ2FuY2VsJywgZGFuZ2VyOiB0cnVlIH1cbiAgKTtcbiAgaWYgKCFjb25maXJtZWQpIHJldHVybjtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvdHJhc2gvZGVsZXRlJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBwYXRoIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHsgYXdhaXQgX3JlbmRlclRyYXNoVmlldygpOyBhd2FpdCBfcmVmcmVzaFRyYXNoQmFkZ2UoKTsgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHNob3dUb2FzdChgRGVsZXRlIGZhaWxlZDogJHtkYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yJ31gLCAnZXJyb3InKTtcbiAgfSBjYXRjaCAoZSkgeyBpZiAodHlwZW9mIHNob3dUb2FzdCA9PT0gJ2Z1bmN0aW9uJykgc2hvd1RvYXN0KGBFcnJvcjogJHtlLm1lc3NhZ2V9YCwgJ2Vycm9yJyk7IH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZW1wdHlUcmFzaCgpIHtcbiAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgY29uZmlybURpYWxvZyhcbiAgICAnUGVybWFuZW50bHkgZGVsZXRlIGFsbCBpdGVtcyBpbiBUcmFzaD8gVGhpcyBjYW5ub3QgYmUgdW5kb25lLicsXG4gICAgeyBjb25maXJtTGFiZWw6ICdFbXB0eSBUcmFzaCcsIGNhbmNlbExhYmVsOiAnQ2FuY2VsJywgZGFuZ2VyOiB0cnVlIH1cbiAgKTtcbiAgaWYgKCFjb25maXJtZWQpIHJldHVybjtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvdHJhc2gvZW1wdHknLCB7IG1ldGhvZDogJ1BPU1QnIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHsgYXdhaXQgX3JlbmRlclRyYXNoVmlldygpOyBhd2FpdCBfcmVmcmVzaFRyYXNoQmFkZ2UoKTsgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHNob3dUb2FzdChgRmFpbGVkIHRvIGVtcHR5IHRyYXNoOiAke2RhdGEuZXJyb3IgfHwgJ1Vua25vd24gZXJyb3InfWAsICdlcnJvcicpO1xuICB9IGNhdGNoIChlKSB7IGlmICh0eXBlb2Ygc2hvd1RvYXN0ID09PSAnZnVuY3Rpb24nKSBzaG93VG9hc3QoYEVycm9yOiAke2UubWVzc2FnZX1gLCAnZXJyb3InKTsgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgRXhwb3J0cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZXhwb3J0IHtcbiAgX3JlbmRlckFjdGl2ZVNlc3Npb25Sb3dzLFxuICBfcmVuZGVyU2F2ZWRTZXNzaW9uUm93cyxcbiAgX3JlbmRlclNlc3Npb25Td2l0Y2hlclNlY3Rpb25zLFxuICBfdXBkYXRlU2Vzc2lvblN3aXRjaGVySGVhZGVyLFxuICBzaG93T3duZXJzaGlwQ29uZmxpY3REaWFsb2csXG4gIGNsb3NlT3duZXJzaGlwQ29uZmxpY3REaWFsb2csXG4gIG9wZW5TZXNzaW9uc01vZGFsLFxuICBjbG9zZVNlc3Npb25zTW9kYWwsXG4gIF9yZW5kZXJTZXNzaW9uc01vZGFsQm9keSxcbiAgbG9hZFNlc3Npb25BbmRDbG9zZU1vZGFsLFxuICBuZXdTZXNzaW9uRnJvbU1vZGFsLFxuICBzdGFydFNlc3Npb25Nb2RhbFJlbmFtZSxcbiAgY2FuY2VsU2Vzc2lvbk1vZGFsUmVuYW1lLFxuICBzdWJtaXRTZXNzaW9uTW9kYWxSZW5hbWUsXG4gIF9kZWxldGVTZXNzaW9uRnJvbU1vZGFsLFxuICBfZHVwbGljYXRlU2Vzc2lvbkZyb21Nb2RhbCxcbiAgX3JlZnJlc2hUcmFzaEJhZGdlLFxuICBvcGVuVHJhc2hWaWV3LFxuICBjbG9zZVRyYXNoVmlldyxcbiAgX3JlbmRlclRyYXNoVmlldyxcbiAgcmVzdG9yZUZyb21UcmFzaCxcbiAgZGVsZXRlRm9yZXZlcixcbiAgZW1wdHlUcmFzaCxcbn07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9rZXlib2FyZC1zaG9ydGN1dHMuanMgXHUyMDE0IEdsb2JhbCBrZXlib2FyZCBzaG9ydGN1dHMgZm9yIHdvcmtmbG93IG5hdmlnYXRpb24uXG4gKlxuICogU2hvcnRjdXRzIGltcGxlbWVudGVkOlxuICogICBDdHJsK0VudGVyICAgICAgIFRyaWdnZXIgdGhlIHByaW1hcnkgYWN0aW9uIGJ1dHRvbiBvbiB0aGUgY3VycmVudCB0YWJcbiAqICAgQ3RybCtTaGlmdCtSICAgICBSZS1ydW4gdGhlIGN1cnJlbnQgd29ya2Zsb3cgcGhhc2UgKGNhbGxzIGNvbmZpcm1SZVJ1blBoYXNlKVxuICogICBBICAgICAgICAgICAgICAgIEFjY2VwdCB0aGUgZm9jdXNlZCByZXZpZXcgY2FyZCAocmV3cml0ZSAvIHNwZWxsLWNoZWNrIHRhYnMpXG4gKiAgIFIgICAgICAgICAgICAgICAgUmVqZWN0IHRoZSBmb2N1c2VkIHJldmlldyBjYXJkIChyZXdyaXRlIC8gc3BlbGwtY2hlY2sgdGFicylcbiAqICAgXHUyMTkxIC8gXHUyMTkzICAgICAgICAgICAgTmF2aWdhdGUgYmV0d2VlbiByZXZpZXcgY2FyZHMgb24gcmV2aWV3IHRhYnNcbiAqICAgQ3RybCtaICAgICAgICAgICBVbmRvIHRoZSBtb3N0IHJlY2VudCBNYXN0ZXIgQ1YgZGF0YSBjaGFuZ2UgKE1hc3RlciBDViBtb2RhbCBvbmx5KVxuICogICBDdHJsK1NoaWZ0K1ogICAgIFJlZG8gdGhlIHByZXZpb3VzbHkgdW5kb25lIE1hc3RlciBDViBkYXRhIGNoYW5nZSAoTWFzdGVyIENWIG1vZGFsIG9ubHkpXG4gKiAgID8gICAgICAgICAgICAgICAgVG9nZ2xlIGtleWJvYXJkIHNob3J0Y3V0IGhlbHAgcGFuZWxcbiAqL1xuXG4vKiogVHJhY2sgd2hpY2ggY2FyZCBpcyBrZXlib2FyZC1mb2N1c2VkIG9uIHRoZSBjdXJyZW50IHJldmlldyB0YWIuICovXG5sZXQgX2ZvY3VzZWRDYXJkSW5kZXggPSAtMTtcblxuLyoqIFJldHVybnMgdHJ1ZSBpZiBmb2N1cyBpcyBpbnNpZGUgYSB0ZXh0IGlucHV0LCBzbyBBL1IvXHUyMTkxL1x1MjE5MyBzaG91bGQgbm90IGZpcmUuICovXG5mdW5jdGlvbiBfaW5UZXh0SW5wdXQoKSB7XG4gIGNvbnN0IGVsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgaWYgKCFlbCkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCB0YWcgPSBlbC50YWdOYW1lO1xuICByZXR1cm4gdGFnID09PSAnSU5QVVQnIHx8IHRhZyA9PT0gJ1RFWFRBUkVBJyB8fCB0YWcgPT09ICdTRUxFQ1QnIHx8IGVsLmlzQ29udGVudEVkaXRhYmxlO1xufVxuXG4vKiogUmV0dXJucyB0cnVlIGlmIGFueSBtb2RhbCBvdmVybGF5IGlzIGN1cnJlbnRseSB2aXNpYmxlLiAqL1xuZnVuY3Rpb24gX21vZGFsT3BlbigpIHtcbiAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tyb2xlPVwiZGlhbG9nXCJdOm5vdChbc3R5bGUqPVwiZGlzcGxheTogbm9uZVwiXSk6bm90KFtzdHlsZSo9XCJkaXNwbGF5Om5vbmVcIl0pJykgIT09IG51bGw7XG59XG5cbi8qKiBSZXR1cm5zIHRydWUgaWYgdGhlIE1hc3RlciBDViBtb2RhbCAod2ViL2luZGV4Lmh0bWwjbWFzdGVyLWN2LW1vZGFsLW92ZXJsYXkpIGlzIG9wZW4uICovXG5mdW5jdGlvbiBfbWFzdGVyQ3ZNb2RhbE9wZW4oKSB7XG4gIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1jdi1tb2RhbC1vdmVybGF5Jyk7XG4gIHJldHVybiAhIWVsICYmIGVsLnN0eWxlLmRpc3BsYXkgIT09ICdub25lJztcbn1cblxuLyoqXG4gKiBNYXAgdGFiIElEcyB0byB0aGVpciBwcmltYXJ5IGFjdGlvbiBidXR0b24gSURzLlxuICogQnV0dG9ucyB0aGF0IG1pZ2h0IGJlIGRpc2FibGVkIGF0IHJ1bnRpbWUgYXJlIHN0aWxsIGNsaWNrZWQgXHUyMDE0IHRoZSBidXR0b24nc1xuICogb3duIGRpc2FibGVkIGNoZWNrIHByZXZlbnRzIGFjY2lkZW50YWwgc3VibWlzc2lvbi5cbiAqL1xuY29uc3QgX1RBQl9BQ1RJT05fQlROID0ge1xuICAnam9iJzogICAgICAgICAgICAgICAgICAgJ3NlbmQtYnRuJyxcbiAgJ2FuYWx5c2lzJzogICAgICAgICAgICAgICdhbmFseXplLWJ0bicsXG4gICdnb2Fscyc6ICAgICAgICAgICAgICAgICAncmVjb21tZW5kLWJ0bicsXG4gICdyZXdyaXRlJzogICAgICAgICAgICAgICAncmV3cml0ZS1idG4nLFxuICAnc3BlbGwnOiAgICAgICAgICAgICAgICAgJ3NwZWxsLWJ0bicsXG4gICdmaW5hbF9nZW5lcmF0ZSc6ICAgICAgICAnZ2VuZXJhdGUtYnRuJyxcbiAgJ2xheW91dCc6ICAgICAgICAgICAgICAgICdsYXlvdXQtYnRuJyxcbiAgJ2Rvd25sb2FkJzogICAgICAgICAgICAgICdmaW5hbC1nZW5lcmF0ZS1wcm9jZWVkLWJ0bicsXG4gICdmaW5hbGlzZSc6ICAgICAgICAgICAgICAnZmluYWxpc2UtYWN0aW9uLWJ0bicsXG59O1xuXG4vKiogQ2xpY2sgdGhlIHByaW1hcnkgYWN0aW9uIGJ1dHRvbiBmb3IgdGhlIGN1cnJlbnQgdGFiIChDdHJsK0VudGVyKS4gKi9cbmZ1bmN0aW9uIF90cmlnZ2VyUHJpbWFyeUFjdGlvbigpIHtcbiAgY29uc3QgdGFiID0gdHlwZW9mIHN0YXRlTWFuYWdlciAhPT0gJ3VuZGVmaW5lZCcgPyBzdGF0ZU1hbmFnZXIuZ2V0Q3VycmVudFRhYigpIDogbnVsbDtcbiAgaWYgKCF0YWIpIHJldHVybjtcbiAgY29uc3QgYnRuSWQgPSBfVEFCX0FDVElPTl9CVE5bdGFiXTtcbiAgaWYgKCFidG5JZCkgcmV0dXJuO1xuICBjb25zdCBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChidG5JZCk7XG4gIGlmIChidG4gJiYgIWJ0bi5kaXNhYmxlZCkgYnRuLmNsaWNrKCk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBDYXJkIG5hdmlnYXRpb24gaGVscGVycyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLyoqIFJldHVybiB2aXNpYmxlIHJldmlldyBjYXJkcyBmb3IgdGhlIGN1cnJlbnQgdGFiLiAqL1xuZnVuY3Rpb24gX2dldENhcmRzKCkge1xuICBjb25zdCB0YWIgPSB0eXBlb2Ygc3RhdGVNYW5hZ2VyICE9PSAndW5kZWZpbmVkJyA/IHN0YXRlTWFuYWdlci5nZXRDdXJyZW50VGFiKCkgOiBudWxsO1xuICBpZiAodGFiID09PSAncmV3cml0ZScpIHJldHVybiBbLi4uZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnJld3JpdGUtY2FyZCcpXTtcbiAgaWYgKHRhYiA9PT0gJ3NwZWxsJykgICByZXR1cm4gWy4uLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zcGVsbC1jYXJkJyldO1xuICByZXR1cm4gW107XG59XG5cbi8qKiBWaXN1YWxseSBoaWdobGlnaHQgYSBjYXJkIGFzIGtleWJvYXJkLWZvY3VzZWQuICovXG5mdW5jdGlvbiBfaGlnaGxpZ2h0Q2FyZChjYXJkcywgaWR4KSB7XG4gIGNhcmRzLmZvckVhY2goKGMsIGkpID0+IHtcbiAgICBpZiAoaSA9PT0gaWR4KSB7XG4gICAgICBjLmNsYXNzTGlzdC5hZGQoJ2tiLWZvY3VzZWQnKTtcbiAgICAgIGMuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ25lYXJlc3QnLCBiZWhhdmlvcjogJ3Ntb290aCcgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGMuY2xhc3NMaXN0LnJlbW92ZSgna2ItZm9jdXNlZCcpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKiBNb3ZlIHRoZSBrZXlib2FyZCBmb2N1cyB0byBjYXJkIGF0IGRlbHRhIG9mZnNldCBmcm9tIGN1cnJlbnQuICovXG5mdW5jdGlvbiBfbW92ZUNhcmRGb2N1cyhkZWx0YSkge1xuICBjb25zdCBjYXJkcyA9IF9nZXRDYXJkcygpO1xuICBpZiAoIWNhcmRzLmxlbmd0aCkgcmV0dXJuO1xuICBfZm9jdXNlZENhcmRJbmRleCA9IE1hdGgubWF4KDAsIE1hdGgubWluKGNhcmRzLmxlbmd0aCAtIDEsIF9mb2N1c2VkQ2FyZEluZGV4ICsgZGVsdGEpKTtcbiAgX2hpZ2hsaWdodENhcmQoY2FyZHMsIF9mb2N1c2VkQ2FyZEluZGV4KTtcbn1cblxuLyoqIEFjY2VwdCB0aGUgY3VycmVudGx5IGtleWJvYXJkLWZvY3VzZWQgcmV3cml0ZSBjYXJkLiAqL1xuZnVuY3Rpb24gX2FjY2VwdEZvY3VzZWRDYXJkKCkge1xuICBjb25zdCB0YWIgPSB0eXBlb2Ygc3RhdGVNYW5hZ2VyICE9PSAndW5kZWZpbmVkJyA/IHN0YXRlTWFuYWdlci5nZXRDdXJyZW50VGFiKCkgOiBudWxsO1xuICBpZiAodGFiID09PSAncmV3cml0ZScpIHtcbiAgICBjb25zdCBjYXJkcyA9IF9nZXRDYXJkcygpO1xuICAgIGlmIChfZm9jdXNlZENhcmRJbmRleCA8IDAgfHwgX2ZvY3VzZWRDYXJkSW5kZXggPj0gY2FyZHMubGVuZ3RoKSByZXR1cm47XG4gICAgY29uc3QgY2FyZCA9IGNhcmRzW19mb2N1c2VkQ2FyZEluZGV4XTtcbiAgICBjb25zdCBpZCA9IGNhcmQuaWQucmVwbGFjZSgncnctY2FyZC0nLCAnJyk7XG4gICAgaWYgKHR5cGVvZiBhcHBseVJld3JpdGVBY3Rpb24gPT09ICdmdW5jdGlvbicpIGFwcGx5UmV3cml0ZUFjdGlvbihpZCwgJ2FjY2VwdCcpO1xuICB9IGVsc2UgaWYgKHRhYiA9PT0gJ3NwZWxsJykge1xuICAgIGNvbnN0IGNhcmRzID0gX2dldENhcmRzKCk7XG4gICAgaWYgKF9mb2N1c2VkQ2FyZEluZGV4IDwgMCB8fCBfZm9jdXNlZENhcmRJbmRleCA+PSBjYXJkcy5sZW5ndGgpIHJldHVybjtcbiAgICAvLyBzcGVsbCBjYXJkczogZmluZCB0aGUgYWNjZXB0IGJ1dHRvbiB3aXRoaW4gdGhlIGZvY3VzZWQgY2FyZFxuICAgIGNvbnN0IGJ0biA9IGNhcmRzW19mb2N1c2VkQ2FyZEluZGV4XS5xdWVyeVNlbGVjdG9yKCdbZGF0YS1hY3Rpb249XCJrZWVwXCJdLCAuc3BlbGwta2VlcC1idG4nKTtcbiAgICBpZiAoYnRuKSBidG4uY2xpY2soKTtcbiAgfVxufVxuXG4vKiogUmVqZWN0IHRoZSBjdXJyZW50bHkga2V5Ym9hcmQtZm9jdXNlZCByZXZpZXcgY2FyZC4gKi9cbmZ1bmN0aW9uIF9yZWplY3RGb2N1c2VkQ2FyZCgpIHtcbiAgY29uc3QgdGFiID0gdHlwZW9mIHN0YXRlTWFuYWdlciAhPT0gJ3VuZGVmaW5lZCcgPyBzdGF0ZU1hbmFnZXIuZ2V0Q3VycmVudFRhYigpIDogbnVsbDtcbiAgaWYgKHRhYiA9PT0gJ3Jld3JpdGUnKSB7XG4gICAgY29uc3QgY2FyZHMgPSBfZ2V0Q2FyZHMoKTtcbiAgICBpZiAoX2ZvY3VzZWRDYXJkSW5kZXggPCAwIHx8IF9mb2N1c2VkQ2FyZEluZGV4ID49IGNhcmRzLmxlbmd0aCkgcmV0dXJuO1xuICAgIGNvbnN0IGNhcmQgPSBjYXJkc1tfZm9jdXNlZENhcmRJbmRleF07XG4gICAgY29uc3QgaWQgPSBjYXJkLmlkLnJlcGxhY2UoJ3J3LWNhcmQtJywgJycpO1xuICAgIGlmICh0eXBlb2YgYXBwbHlSZXdyaXRlQWN0aW9uID09PSAnZnVuY3Rpb24nKSBhcHBseVJld3JpdGVBY3Rpb24oaWQsICdyZWplY3QnKTtcbiAgfSBlbHNlIGlmICh0YWIgPT09ICdzcGVsbCcpIHtcbiAgICBjb25zdCBjYXJkcyA9IF9nZXRDYXJkcygpO1xuICAgIGlmIChfZm9jdXNlZENhcmRJbmRleCA8IDAgfHwgX2ZvY3VzZWRDYXJkSW5kZXggPj0gY2FyZHMubGVuZ3RoKSByZXR1cm47XG4gICAgY29uc3QgYnRuID0gY2FyZHNbX2ZvY3VzZWRDYXJkSW5kZXhdLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWFjdGlvbj1cImFwcGx5XCJdLCAuc3BlbGwtYXBwbHktYnRuJyk7XG4gICAgaWYgKGJ0bikgYnRuLmNsaWNrKCk7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIFNob3J0Y3V0IGhlbHAgcGFuZWwgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmNvbnN0IF9QQU5FTF9JRCA9ICdrYi1zaG9ydGN1dHMtcGFuZWwnO1xuXG4vKiogVG9nZ2xlIHRoZSBrZXlib2FyZCBzaG9ydGN1dCBoZWxwIHBhbmVsLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNob3dLZXlib2FyZFNob3J0Y3V0c1BhbmVsKCkge1xuICBjb25zdCBleGlzdGluZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKF9QQU5FTF9JRCk7XG4gIGlmIChleGlzdGluZykgeyBleGlzdGluZy5yZW1vdmUoKTsgcmV0dXJuOyB9XG5cbiAgY29uc3QgcGFuZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgcGFuZWwuaWQgPSBfUEFORUxfSUQ7XG4gIHBhbmVsLnNldEF0dHJpYnV0ZSgncm9sZScsICdkaWFsb2cnKTtcbiAgcGFuZWwuc2V0QXR0cmlidXRlKCdhcmlhLW1vZGFsJywgJ3RydWUnKTtcbiAgcGFuZWwuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgJ0tleWJvYXJkIHNob3J0Y3V0cycpO1xuICBwYW5lbC5pbm5lckhUTUwgPSBgXG4gICAgPGRpdiBpZD1cImtiLXNob3J0Y3V0cy1pbm5lclwiPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjthbGlnbi1pdGVtczpjZW50ZXI7bWFyZ2luLWJvdHRvbToxMnB4XCI+XG4gICAgICAgIDxzdHJvbmc+S2V5Ym9hcmQgU2hvcnRjdXRzPC9zdHJvbmc+XG4gICAgICAgIDxidXR0b24gaWQ9XCJrYi1zaG9ydGN1dHMtY2xvc2VcIiBhcmlhLWxhYmVsPVwiQ2xvc2Uga2V5Ym9hcmQgc2hvcnRjdXRzXCIgc3R5bGU9XCJiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOm5vbmU7Zm9udC1zaXplOjEuMmVtO2N1cnNvcjpwb2ludGVyO3BhZGRpbmc6MnB4IDZweFwiPlx1MjcxNTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8dGFibGUgc3R5bGU9XCJib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7d2lkdGg6MTAwJVwiPlxuICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgPHRyPjx0ZCBzdHlsZT1cInBhZGRpbmc6NHB4IDEycHggNHB4IDBcIj48a2JkPkN0cmw8L2tiZD4rPGtiZD5FbnRlcjwva2JkPjwvdGQ+PHRkPlRyaWdnZXIgcHJpbWFyeSBhY3Rpb24gb24gY3VycmVudCBzdGVwPC90ZD48L3RyPlxuICAgICAgICAgIDx0cj48dGQgc3R5bGU9XCJwYWRkaW5nOjRweCAxMnB4IDRweCAwXCI+PGtiZD5DdHJsPC9rYmQ+KzxrYmQ+U2hpZnQ8L2tiZD4rPGtiZD5SPC9rYmQ+PC90ZD48dGQ+UmUtcnVuIGN1cnJlbnQgd29ya2Zsb3cgcGhhc2U8L3RkPjwvdHI+XG4gICAgICAgICAgPHRyPjx0ZCBzdHlsZT1cInBhZGRpbmc6NHB4IDEycHggNHB4IDBcIj48a2JkPlx1MjE5MTwva2JkPiAvIDxrYmQ+XHUyMTkzPC9rYmQ+PC90ZD48dGQ+TmF2aWdhdGUgYmV0d2VlbiByZXZpZXcgY2FyZHM8L3RkPjwvdHI+XG4gICAgICAgICAgPHRyPjx0ZCBzdHlsZT1cInBhZGRpbmc6NHB4IDEycHggNHB4IDBcIj48a2JkPkE8L2tiZD48L3RkPjx0ZD5BY2NlcHQgZm9jdXNlZCBjYXJkIChyZXdyaXRlIC8gc3BlbGwpPC90ZD48L3RyPlxuICAgICAgICAgIDx0cj48dGQgc3R5bGU9XCJwYWRkaW5nOjRweCAxMnB4IDRweCAwXCI+PGtiZD5SPC9rYmQ+PC90ZD48dGQ+UmVqZWN0IGZvY3VzZWQgY2FyZCAocmV3cml0ZSAvIHNwZWxsKTwvdGQ+PC90cj5cbiAgICAgICAgICA8dHI+PHRkIHN0eWxlPVwicGFkZGluZzo0cHggMTJweCA0cHggMFwiPjxrYmQ+Q3RybDwva2JkPis8a2JkPlo8L2tiZD48L3RkPjx0ZD5VbmRvIE1hc3RlciBDViBjaGFuZ2UgKE1hc3RlciBDViBtb2RhbCk8L3RkPjwvdHI+XG4gICAgICAgICAgPHRyPjx0ZCBzdHlsZT1cInBhZGRpbmc6NHB4IDEycHggNHB4IDBcIj48a2JkPkN0cmw8L2tiZD4rPGtiZD5TaGlmdDwva2JkPis8a2JkPlo8L2tiZD48L3RkPjx0ZD5SZWRvIE1hc3RlciBDViBjaGFuZ2UgKE1hc3RlciBDViBtb2RhbCk8L3RkPjwvdHI+XG4gICAgICAgICAgPHRyPjx0ZCBzdHlsZT1cInBhZGRpbmc6NHB4IDEycHggNHB4IDBcIj48a2JkPj88L2tiZD48L3RkPjx0ZD5Ub2dnbGUgdGhpcyBoZWxwIHBhbmVsPC90ZD48L3RyPlxuICAgICAgICAgIDx0cj48dGQgc3R5bGU9XCJwYWRkaW5nOjRweCAxMnB4IDRweCAwXCI+PGtiZD5Fc2M8L2tiZD48L3RkPjx0ZD5DbG9zZSBtb2RhbHMgLyB0aGlzIHBhbmVsPC90ZD48L3RyPlxuICAgICAgICA8L3Rib2R5PlxuICAgICAgPC90YWJsZT5cbiAgICA8L2Rpdj5gO1xuICBPYmplY3QuYXNzaWduKHBhbmVsLnN0eWxlLCB7XG4gICAgcG9zaXRpb246ICAgJ2ZpeGVkJyxcbiAgICBib3R0b206ICAgICAnODBweCcsXG4gICAgcmlnaHQ6ICAgICAgJzI0cHgnLFxuICAgIGJhY2tncm91bmQ6ICcjMWYyOTM3JyxcbiAgICBjb2xvcjogICAgICAnI2Y5ZmFmYicsXG4gICAgYm9yZGVyOiAgICAgJzFweCBzb2xpZCAjMzc0MTUxJyxcbiAgICBib3JkZXJSYWRpdXM6ICc4cHgnLFxuICAgIHBhZGRpbmc6ICAgICcxNnB4IDIwcHgnLFxuICAgIHpJbmRleDogICAgICcxMDAwMCcsXG4gICAgZm9udFNpemU6ICAgJzAuODVlbScsXG4gICAgbWluV2lkdGg6ICAgJzM0MHB4JyxcbiAgICBib3hTaGFkb3c6ICAnMCA0cHggMjBweCByZ2JhKDAsMCwwLDAuNSknLFxuICB9KTtcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChwYW5lbCk7XG4gIHBhbmVsLnF1ZXJ5U2VsZWN0b3IoJyNrYi1zaG9ydGN1dHMtY2xvc2UnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHBhbmVsLnJlbW92ZSgpKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFJlc2V0IGNhcmQgZm9jdXMgd2hlbiB0YWIgY2hhbmdlcyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLyoqIENhbGxlZCB3aGVuZXZlciB0aGUgYWN0aXZlIHRhYiBjaGFuZ2VzIHNvIGNhcmQgZm9jdXMgcmVzZXRzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0Q2FyZEZvY3VzKCkge1xuICBfZm9jdXNlZENhcmRJbmRleCA9IC0xO1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcua2ItZm9jdXNlZCcpLmZvckVhY2goZWwgPT4gZWwuY2xhc3NMaXN0LnJlbW92ZSgna2ItZm9jdXNlZCcpKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEdsb2JhbCBrZXlkb3duIGhhbmRsZXIgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIF9vbktleURvd24oZSkge1xuICAvLyBDdHJsK0VudGVyIFx1MjE5MiBwcmltYXJ5IGFjdGlvbiAoYWx3YXlzLCBldmVuIGluIHRleHQgaW5wdXRzIHdoZW4gdGhlIG1haW5cbiAgLy8gc2VuZC1ib3ggaXMgZm9jdXNlZCwgdG8gbWF0Y2ggdGhlIGV4aXN0aW5nIEVudGVyIGJlaGF2aW91ciB0aGVyZSkuXG4gIGlmIChlLmN0cmxLZXkgJiYgZS5rZXkgPT09ICdFbnRlcicpIHtcbiAgICBfdHJpZ2dlclByaW1hcnlBY3Rpb24oKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBDdHJsK1NoaWZ0K1IgXHUyMTkyIHJlLXJ1biBjdXJyZW50IHBoYXNlXG4gIGlmIChlLmN0cmxLZXkgJiYgZS5zaGlmdEtleSAmJiBlLmtleSA9PT0gJ1InKSB7XG4gICAgY29uc3QgYWN0aXZlRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbaWRePVwic3RlcC1cIl0uYWN0aXZlJyk7XG4gICAgY29uc3Qgc3RlcCA9IGFjdGl2ZUVsID8gYWN0aXZlRWwuaWQucmVwbGFjZSgnc3RlcC0nLCAnJykgOiBudWxsO1xuICAgIGlmIChzdGVwICYmIHR5cGVvZiBjb25maXJtUmVSdW5QaGFzZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgY29uZmlybVJlUnVuUGhhc2Uoc3RlcCk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEN0cmwrWiAvIEN0cmwrU2hpZnQrWiBcdTIxOTIgdW5kby9yZWRvIHRoZSBtb3N0IHJlY2VudCBNYXN0ZXIgQ1YgZGF0YSBjaGFuZ2UuXG4gIC8vIFNjb3BlZCB0byB3aGVuIHRoZSBNYXN0ZXIgQ1YgbW9kYWwgaXMgb3BlbiBcdTIwMTQgYW5kIG5vIG5lc3RlZCBzdWItbW9kYWxcbiAgLy8gKGUuZy4gdGhlIGJhY2t1cC1oaXN0b3J5IGJyb3dzZXIpIGlzIHN0YWNrZWQgb24gdG9wIG9mIGl0IFx1MjAxNCBhbmQgZm9jdXNcbiAgLy8gaXNuJ3QgaW4gYSB0ZXh0IGZpZWxkLCBzaW5jZSBDdHJsK1ogaW5zaWRlIGEgdGV4dGFyZWEgbXVzdCBzdGlsbCBwZXJmb3JtXG4gIC8vIG5hdGl2ZSB0ZXh0LXVuZG8gcmF0aGVyIHRoYW4gYmVpbmcgaGlqYWNrZWQgYnkgdGhpcyBzaG9ydGN1dC5cbiAgaWYgKGUuY3RybEtleSAmJiAhZS5hbHRLZXkgJiYgKGUua2V5ID09PSAneicgfHwgZS5rZXkgPT09ICdaJylcbiAgICAgICYmIF9tYXN0ZXJDdk1vZGFsT3BlbigpICYmICFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja3VwLWhpc3Rvcnktb3ZlcmxheScpXG4gICAgICAmJiAhX2luVGV4dElucHV0KCkpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgaWYgKGUuc2hpZnRLZXkpIHtcbiAgICAgIGlmICh0eXBlb2YgcmVkb01hc3RlckRhdGFDaGFuZ2UgPT09ICdmdW5jdGlvbicpIHJlZG9NYXN0ZXJEYXRhQ2hhbmdlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0eXBlb2YgdW5kb01hc3RlckRhdGFDaGFuZ2UgPT09ICdmdW5jdGlvbicpIHVuZG9NYXN0ZXJEYXRhQ2hhbmdlKCk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEFsbCBzaW5nbGUta2V5IHNob3J0Y3V0cyBhcmUgc3VwcHJlc3NlZCB3aGVuIHR5cGluZyBpbnRvIGFuIGlucHV0LlxuICBpZiAoX2luVGV4dElucHV0KCkpIHJldHVybjtcbiAgLy8gQWxsIHNpbmdsZS1rZXkgc2hvcnRjdXRzIGFyZSBzdXBwcmVzc2VkIHdoZW4gYSBtb2RhbCBkaWFsb2cgaXMgb3BlbixcbiAgLy8gZXhjZXB0IEVzY2FwZSAoaGFuZGxlZCBieSB1aS1jb3JlLmpzKS5cbiAgaWYgKF9tb2RhbE9wZW4oKSkgcmV0dXJuO1xuXG4gIHN3aXRjaCAoZS5rZXkpIHtcbiAgICBjYXNlICc/JzpcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHNob3dLZXlib2FyZFNob3J0Y3V0c1BhbmVsKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIF9tb3ZlQ2FyZEZvY3VzKC0xKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ0Fycm93RG93bic6XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBfbW92ZUNhcmRGb2N1cygxKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2EnOlxuICAgIGNhc2UgJ0EnOlxuICAgICAgX2FjY2VwdEZvY3VzZWRDYXJkKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdyJzpcbiAgICBjYXNlICdSJzpcbiAgICAgIF9yZWplY3RGb2N1c2VkQ2FyZCgpO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGJyZWFrO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBJbml0aWFsaXNhdGlvbiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLyoqXG4gKiBBdHRhY2ggdGhlIGdsb2JhbCBrZXlib2FyZC1zaG9ydGN1dCBsaXN0ZW5lci5cbiAqIENhbGxlZCBvbmNlIGZyb20gYXBwLmpzIGFmdGVyIERPTUNvbnRlbnRMb2FkZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0S2V5Ym9hcmRTaG9ydGN1dHMoKSB7XG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBfb25LZXlEb3duKTtcbn1cbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8vIE9yY2hlc3RyYXRvciBlbnRyeS1wb2ludCBcdTIwMTQgYWxsIG1vZHVsZSBmdW5jdGlvbnMgYXJlIGV4cG9zZWQgYXMgZ2xvYmFscyBieSBidW5kbGUuanMuXG4vLyBOb3RlOiBhcHAuanMgaXMgYSBwbGFpbiBsZWdhY3kgc2NyaXB0IChub3QgYnVuZGxlZCkuIGxvZ2xldmVsIGlzIGF2YWlsYWJsZVxuLy8gdmlhIGdsb2JhbFRoaXMubG9nbGV2ZWwgKHNldCBieSBidW5kbGUuanMgd2hpY2ggaW5jbHVkZXMgd2ViL2xvZ2dlci5qcykuXG5jb25zdCBfYXBwTG9nID0gKHR5cGVvZiBsb2dsZXZlbCAhPT0gJ3VuZGVmaW5lZCcpID8gbG9nbGV2ZWwuZ2V0TG9nZ2VyKCdhcHAnKSA6IGNvbnNvbGU7XG4vLyBUaGlzIGZpbGUgY29udGFpbnMgb25seSBpbml0KCkgYW5kIHRvcC1sZXZlbCBldmVudC13aXJpbmcgKFx1MjI2NCAzMDAgbGluZXMpLlxuXG5sZXQgX2xpc3RlbmVyc1JlZ2lzdGVyZWQgPSBmYWxzZTtcblxuZnVuY3Rpb24gX3NldENvbm5lY3Rpb25NZXNzYWdlKG1lc3NhZ2VOb2RlLCB0ZXh0LCBraW5kID0gJ2luZm8nKSB7XG4gIGlmICghbWVzc2FnZU5vZGUpIHJldHVybjtcbiAgY29uc3QgY29udGVudCA9IG1lc3NhZ2VOb2RlLnF1ZXJ5U2VsZWN0b3IoJy5jb250ZW50Jyk7XG4gIGlmICghY29udGVudCkgcmV0dXJuO1xuICBjb250ZW50LnRleHRDb250ZW50ID0gdGV4dDtcbiAgY29udGVudC5zdHlsZS5kaXNwbGF5ID0gJ2lubGluZS1ibG9jayc7XG4gIGNvbnRlbnQuc3R5bGUucGFkZGluZyA9ICc2cHggMTBweCc7XG4gIGNvbnRlbnQuc3R5bGUuYm9yZGVyUmFkaXVzID0gJzk5OXB4JztcbiAgY29udGVudC5zdHlsZS5mb250V2VpZ2h0ID0gJzYwMCc7XG4gIGNvbnRlbnQuc3R5bGUuZm9udFNpemUgPSAnMC44OGVtJztcbiAgY29udGVudC5zdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkICNjYmQ1ZTEnO1xuICBpZiAoa2luZCA9PT0gJ3N1Y2Nlc3MnKSB7XG4gICAgY29udGVudC5zdHlsZS5jb2xvciA9ICcjMTY2NTM0JztcbiAgICBjb250ZW50LnN0eWxlLmJhY2tncm91bmQgPSAnI2VjZmRmNSc7XG4gICAgY29udGVudC5zdHlsZS5ib3JkZXJDb2xvciA9ICcjODZlZmFjJztcbiAgfSBlbHNlIGlmIChraW5kID09PSAnZXJyb3InKSB7XG4gICAgY29udGVudC5zdHlsZS5jb2xvciA9ICcjYjkxYzFjJztcbiAgICBjb250ZW50LnN0eWxlLmJhY2tncm91bmQgPSAnI2ZlZjJmMic7XG4gICAgY29udGVudC5zdHlsZS5ib3JkZXJDb2xvciA9ICcjZmVjYWNhJztcbiAgfSBlbHNlIHtcbiAgICBjb250ZW50LnN0eWxlLmNvbG9yID0gJyMxZTQwYWYnO1xuICAgIGNvbnRlbnQuc3R5bGUuYmFja2dyb3VuZCA9ICcjZWZmNmZmJztcbiAgICBjb250ZW50LnN0eWxlLmJvcmRlckNvbG9yID0gJyNiZmRiZmUnO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGluaXQoKSB7XG4gIC8vIEluaXRpYWxpemUgYWJvcnQgY29udHJvbGxlciB0byBudWxsIChzZXQgdG8gbmV3IEFib3J0Q29udHJvbGxlciBieSBzZXRMb2FkaW5nKHRydWUpKVxuICB3aW5kb3cuX2N1cnJlbnRBYm9ydENvbnRyb2xsZXIgPSBudWxsO1xuXG4gIC8vIEZsdXNoIGFueSBtZXNzYWdlcyB0aGF0IHdlcmUgcXVldWVkIGJlZm9yZSBET01Db250ZW50TG9hZGVkIChkZWZlbnNpdmUgXHUyMDE0IHNob3VsZCBiZSBlbXB0eSBpbiBwcmFjdGljZSkuXG4gIF9mbHVzaE1lc3NhZ2VRdWV1ZSgpO1xuXG4gIGNvbnN0IGhhc0FjdGl2ZVNlc3Npb24gPSBhd2FpdCBlbnN1cmVTZXNzaW9uQ29udGV4dCgpO1xuICBpZiAoIWhhc0FjdGl2ZVNlc3Npb24pIHtcbiAgICBjb25zdCBmYWlsZWRNZXNzYWdlID0gYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgJ1x1MjZBMFx1RkUwRiBDb3VsZCBub3QgZXN0YWJsaXNoIGEgc2Vzc2lvbi4gQ3JlYXRlIG9yIGxvYWQgYSBzZXNzaW9uIHRvIGNvbnRpbnVlLicpO1xuICAgIF9zZXRDb25uZWN0aW9uTWVzc2FnZShmYWlsZWRNZXNzYWdlLCAnXHUyNkEwXHVGRTBGIENvdWxkIG5vdCBlc3RhYmxpc2ggYSBzZXNzaW9uLiBDcmVhdGUgb3IgbG9hZCBhIHNlc3Npb24gdG8gY29udGludWUuJywgJ2Vycm9yJyk7XG4gICAgc2V0dXBFdmVudExpc3RlbmVycygpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFNob3cgd2VsY29tZS9vbmJvYXJkaW5nIG1vZGFsIG9uIGV2ZXJ5IHN0YXJ0dXAgdW50aWwgdXNlciBkaXNtaXNzZXMgaXQuXG4gIGF3YWl0IG1heWJlU2hvd1dlbGNvbWVNb2RhbCgpO1xuXG4gIC8vIFJlc3RvcmUgc2Vzc2lvbiBzdGF0ZSBmaXJzdFxuICBhd2FpdCByZXN0b3JlU2Vzc2lvbigpO1xuXG4gIC8vIFNob3cgY29ubmVjdGlvbiBzdGF0dXMgYWZ0ZXIgcmVzdG9yZVNlc3Npb24gc28gaXQgaXMgbm90IHJlbW92ZWQgYnkgaGlzdG9yeSByZXN0b3JlLlxuICBjb25zdCBjb25uZWN0aW9uTWVzc2FnZSA9IGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsICdcdUQ4M0RcdUREMDQgQ29ubmVjdGluZyB0byBDViBCdWlsZGVyLi4uJyk7XG4gIF9zZXRDb25uZWN0aW9uTWVzc2FnZShjb25uZWN0aW9uTWVzc2FnZSwgJ1x1RDgzRFx1REQwNCBDb25uZWN0aW5nIHRvIENWIEJ1aWxkZXIuLi4nLCAnaW5mbycpO1xuXG4gIC8vIFJlc3RvcmUgQVRTIGJhZGdlIGZyb20gY2FjaGVkIHNjb3JlIChpZiBhbnkpXG4gIHVwZGF0ZUF0c0JhZGdlKHN0YXRlTWFuYWdlci5nZXRBdHNTY29yZSgpKTtcblxuICAvLyBJbml0aWFsaXplIHRoZSByZXN0XG4gIGF3YWl0IGZldGNoU3RhdHVzKCk7XG4gIGNvbnN0IGNvbm5lY3RlZE1lc3NhZ2UgPSBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnXHUyNzA1IENvbm5lY3Rpb24gc3VjY2Vzc2Z1bC4nKTtcbiAgX3NldENvbm5lY3Rpb25NZXNzYWdlKGNvbm5lY3RlZE1lc3NhZ2UsICdcdTI3MDUgQ29ubmVjdGlvbiBzdWNjZXNzZnVsLicsICdzdWNjZXNzJyk7XG4gIGlmIChzdGF0ZU1hbmFnZXIuZ2V0Q3VycmVudFRhYigpID09PSAnam9iJykgYXdhaXQgcG9wdWxhdGVKb2JUYWIoKTtcbiAgc2V0dXBFdmVudExpc3RlbmVycygpO1xuXG4gIC8vIFNldCB1cCBwZXJpb2RpYyBzdGF0ZSBzYXZpbmdcbiAgc2V0SW50ZXJ2YWwoc2F2ZVRhYkRhdGEsIDUwMDApOyAvLyBTYXZlIGV2ZXJ5IDUgc2Vjb25kc1xuXG4gIC8vIFNhdmUgc3RhdGUgYmVmb3JlIHBhZ2UgdW5sb2FkXG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCAoKSA9PiB7XG4gICAgc2F2ZVRhYkRhdGEoKTtcbiAgICBjb25zdCBhY3RpdmVTZXNzaW9uSWQgPSBzdGF0ZU1hbmFnZXIuZ2V0U2Vzc2lvbklkKCk7XG4gICAgaWYgKGFjdGl2ZVNlc3Npb25JZCkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oU3RvcmFnZUtleXMuU0VTU0lPTl9JRCwgYWN0aXZlU2Vzc2lvbklkKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIFByb21wdCB1c2VyIHRvIGFuYWx5emUgaWYgYSBqb2IgZGVzY3JpcHRpb24gaXMgbG9hZGVkIGJ1dCBub3QgeWV0IGFuYWx5emVkLlxuICAvLyBEbyBOT1QgYXV0by1maXJlIFx1MjAxNCBhIHJldHVybmluZyB1c2VyIG1heSBoYXZlIGludGVudGlvbmFsbHkgbGVmdCBpdCB1bmFuYWx5emVkXG4gIC8vIChlLmcuIG1pZC1lZGl0KS4gTGV0IHRoZW0gY2xpY2sgQW5hbHlzZSBKb2IgZXhwbGljaXRseSAoR0FQLTI0OCkuXG4gIGlmICghc3RhdGVNYW5hZ2VyLmlzUmVjb25uZWN0aW5nKCkpIHtcbiAgICBjb25zdCBzdGF0dXMgPSBhd2FpdCBmZXRjaFN0YXR1cygpO1xuICAgIGlmICghc3RhdHVzLl9lcnJvciAmJiBzdGF0dXMuam9iX2Rlc2NyaXB0aW9uICYmICFzdGF0dXMuam9iX2FuYWx5c2lzKSB7XG4gICAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnXHVEODNEXHVEQ0NCIEpvYiBkZXNjcmlwdGlvbiBkZXRlY3RlZCBcdTIwMTQgY2xpY2sgPHN0cm9uZz5BbmFseXNlIEpvYjwvc3Ryb25nPiB3aGVuIHJlYWR5IHRvIGJlZ2luLicpO1xuICAgICAgY29uc3QgYW5hbHl6ZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhbmFseXplLWJ0bicpO1xuICAgICAgaWYgKGFuYWx5emVCdG4pIHtcbiAgICAgICAgYW5hbHl6ZUJ0bi5zdHlsZS5vdXRsaW5lID0gJzJweCBzb2xpZCAjM2I4MmY2JztcbiAgICAgICAgYW5hbHl6ZUJ0bi5zdHlsZS5vdXRsaW5lT2Zmc2V0ID0gJzJweCc7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzdGF0dXMuam9iX2FuYWx5c2lzKSB7XG4gICAgICBfYXBwTG9nLmluZm8oJ0pvYiBhbmFseXNpcyBhbHJlYWR5IGNvbXBsZXRlLCBza2lwcGluZyBhdXRvLWFuYWx5c2lzJyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIF9hcHBMb2cuaW5mbygnUmVjb25uZWN0aW5nIHRvIGV4aXN0aW5nIHNlc3Npb24sIHNraXBwaW5nIGF1dG8tYW5hbHlzaXMnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzZXR1cEV2ZW50TGlzdGVuZXJzKCkge1xuICBpZiAoX2xpc3RlbmVyc1JlZ2lzdGVyZWQpIHJldHVybjtcbiAgX2xpc3RlbmVyc1JlZ2lzdGVyZWQgPSB0cnVlO1xuXG4gIC8vIFRhYiBzd2l0Y2hpbmdcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnRhYicpLmZvckVhY2godGFiID0+IHtcbiAgICB0YWIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBzd2l0Y2hUYWIodGFiLmRhdGFzZXQudGFiKSk7XG4gIH0pO1xuXG4gIC8vIE1lc3NhZ2Ugc2VuZGluZ1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VuZC1idG4nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHNlbmRNZXNzYWdlKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21lc3NhZ2UtaW5wdXQnKS5hZGRFdmVudExpc3RlbmVyKCdrZXlwcmVzcycsIChlKSA9PiB7XG4gICAgaWYgKGUua2V5ID09PSAnRW50ZXInKSBzZW5kTWVzc2FnZSgpO1xuICB9KTtcblxuICAvLyBBY3Rpb24gYnV0dG9ucyBcdTIwMTQgb25lIHBlciB3b3JrZmxvdyBzdGFnZVxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYW5hbHl6ZS1idG4nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFuYWx5emVKb2IpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjb21tZW5kLWJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gc2VuZEFjdGlvbigncmVjb21tZW5kX2N1c3RvbWl6YXRpb25zJykpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ2VuZXJhdGUtYnRuJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gU29mdCBnYXRlOiB3YXJuIGlmIGN1c3RvbWlzYXRpb24gaXRlbXMgaGF2ZSBuZXZlciBiZWVuIGluZGl2aWR1YWxseSByZXZpZXdlZCAoR0FQLTExNilcbiAgICBjb25zdCByZXZpZXdlZCA9IHdpbmRvdy5fZXhwbGljaXRseVJldmlld2VkIHx8IHsgZXhwZXJpZW5jZXM6IG5ldyBTZXQoKSwgc2tpbGxzOiBuZXcgU2V0KCkgfTtcbiAgICBjb25zdCB0b3RhbEV4cCA9ICh3aW5kb3cuX2V4cGVyaWVuY2VzT3JkZXJlZCB8fCBbXSkubGVuZ3RoO1xuICAgIGNvbnN0IHRvdGFsU2tpbGwgPSBPYmplY3Qua2V5cyh1c2VyU2VsZWN0aW9ucz8uc2tpbGxzIHx8IHt9KS5sZW5ndGg7XG4gICAgY29uc3QgdW5yZXZpZXdlZEV4cCA9IHRvdGFsRXhwIC0gcmV2aWV3ZWQuZXhwZXJpZW5jZXMuc2l6ZTtcbiAgICBjb25zdCB1bnJldmlld2VkU2tpbGwgPSB0b3RhbFNraWxsIC0gcmV2aWV3ZWQuc2tpbGxzLnNpemU7XG4gICAgY29uc3QgdW5yZXZpZXdlZFRvdGFsID0gTWF0aC5tYXgoMCwgdW5yZXZpZXdlZEV4cCkgKyBNYXRoLm1heCgwLCB1bnJldmlld2VkU2tpbGwpO1xuICAgIGlmICh1bnJldmlld2VkVG90YWwgPiAwKSB7XG4gICAgICBjb25zdCBwYXJ0cyA9IFtdO1xuICAgICAgaWYgKHVucmV2aWV3ZWRFeHAgPiAwKSBwYXJ0cy5wdXNoKGAke3VucmV2aWV3ZWRFeHB9IGV4cGVyaWVuY2UgZW50ciR7dW5yZXZpZXdlZEV4cCA9PT0gMSA/ICd5JyA6ICdpZXMnfWApO1xuICAgICAgaWYgKHVucmV2aWV3ZWRTa2lsbCA+IDApIHBhcnRzLnB1c2goYCR7dW5yZXZpZXdlZFNraWxsfSBza2lsbCR7dW5yZXZpZXdlZFNraWxsID09PSAxID8gJycgOiAncyd9YCk7XG4gICAgICBjb25zdCBvayA9IHdpbmRvdy5jb25maXJtKFxuICAgICAgICBgJHtwYXJ0cy5qb2luKCcgYW5kICcpfSBub3QgaW5kaXZpZHVhbGx5IHJldmlld2VkIFx1MjAxNCB0aGUgQUkncyByZWNvbW1lbmRhdGlvbiB3aWxsIGJlIHVzZWQgZm9yIHRoZXNlLlxcblxcblByb2NlZWQgYW55d2F5P2BcbiAgICAgICk7XG4gICAgICBpZiAoIW9rKSByZXR1cm47XG4gICAgfVxuICAgIGlmICh1c2VyU2VsZWN0aW9ucyAmJiAoT2JqZWN0LmtleXModXNlclNlbGVjdGlvbnMuZXhwZXJpZW5jZXMpLmxlbmd0aCA+IDAgfHwgT2JqZWN0LmtleXModXNlclNlbGVjdGlvbnMuc2tpbGxzKS5sZW5ndGggPiAwKSkge1xuICAgICAgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgJ0FwcGx5aW5nIHlvdXIgcmV2aWV3IGRlY2lzaW9ucy4uLicpO1xuICAgICAgLy8gRGVjaXNpb25zIHdlcmUgYWxyZWFkeSBzdWJtaXR0ZWQgdmlhIHN1Ym1pdEV4cGVyaWVuY2VEZWNpc2lvbnMvc3VibWl0U2tpbGxEZWNpc2lvbnNcbiAgICAgIC8vIEJhY2tlbmQgaGFzIHRoZW0gaW4gY29udmVyc2F0aW9uLnN0YXRlWydleHBlcmllbmNlX2RlY2lzaW9ucyddIGFuZCBbJ3NraWxsX2RlY2lzaW9ucyddXG4gICAgfVxuICAgIGF3YWl0IGZldGNoQW5kUmV2aWV3UmV3cml0ZXMoKTtcbiAgfSk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXdyaXRlLWJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc3VibWl0UmV3cml0ZURlY2lzaW9ucyk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzcGVsbC1idG4nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHN1Ym1pdFNwZWxsQ2hlY2tEZWNpc2lvbnMpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ2VuZXJhdGUtcHJvY2VlZC1idG4nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHN3aXRjaFRhYignbGF5b3V0JykpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGF5b3V0LWJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlTGF5b3V0UHJpbWFyeUFjdGlvbik7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaW5hbC1nZW5lcmF0ZS1wcm9jZWVkLWJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZmluYWxHZW5lcmF0aW9uQ29tcGxldGUpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmluYWxpc2UtYWN0aW9uLWJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gc3dpdGNoVGFiKCdmaW5hbGlzZScpKTtcblxuICBpZiAodHlwZW9mIGluaXRLZXlib2FyZFNob3J0Y3V0cyA9PT0gJ2Z1bmN0aW9uJykgaW5pdEtleWJvYXJkU2hvcnRjdXRzKCk7XG59XG5cbi8vIFRlc3RzIG5vdyBpbXBvcnQgaGVscGVyIGZ1bmN0aW9ucyBmcm9tIHRoZWlyIGNhbm9uaWNhbCBFUyBtb2R1bGVzIGRpcmVjdGx5LlxuXG5leHBvcnQgeyBpbml0LCBzZXR1cEV2ZW50TGlzdGVuZXJzIH07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9zcmMvbWFpbi5qcyBcdTIwMTQgZXNidWlsZCBlbnRyeSBwb2ludCBmb3IgdGhlIGZ1bGwgYnJvd3NlciBidW5kbGUuXG4gKlxuICogUGhhc2UgMiBtb2R1bGVzOiB1dGlscywgYXBpLWNsaWVudCwgc3RhdGUtbWFuYWdlciwgdWktY29yZSwgbGF5b3V0LWluc3RydWN0aW9uXG4gKiBQaGFzZSAzIG1vZHVsZXM6IGFsbCBkb21haW4gc3BsaXQgbW9kdWxlcyAoVGllciAwXHUyMDEzNykgZnJvbSB0aGUgYXBwLmpzIG1vZHVsYXJpc2F0aW9uLlxuICpcbiAqIEV2ZXJ5IGV4cG9ydCBpcyBhc3NpZ25lZCB0byBgd2luZG93YCBzbyB0aGF0IGxlZ2FjeSBpbmxpbmUgb25jbGljaz1cImZuKClcIlxuICogaGFuZGxlcnMgYW5kIGFwcC5qcyBjb250aW51ZSB0byB3b3JrIHVuY2hhbmdlZC5cbiAqXG4gKiBCdWlsZDogIG5wbSBydW4gYnVpbGQgICAgICAgICAgXHUyMTkyIHdlYi9idW5kbGUuanMgKGRldmVsb3BtZW50LCB1bm1pbmlmaWVkKVxuICogICAgICAgICBucG0gcnVuIGJ1aWxkOnByb2QgICAgIFx1MjE5MiB3ZWIvYnVuZGxlLmpzIChtaW5pZmllZClcbiAqICAgICAgICAgbnBtIHJ1biBidWlsZDp3YXRjaCAgICBcdTIxOTIgcmVidWlsZCBvbiBldmVyeSBzb3VyY2UgY2hhbmdlXG4gKi9cblxuLy8gXHUyNTAwXHUyNTAwIExvZ2dlciAobXVzdCBiZSBmaXJzdCBzbyBuYW1lZCBsb2dnZXJzIGFyZSBhdmFpbGFibGUgdG8gYWxsIG1vZHVsZXMpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuaW1wb3J0ICogYXMgTG9nZ2VyIGZyb20gJy4uL2xvZ2dlci5qcyc7XG5cbi8vIFx1MjUwMFx1MjUwMCBQaGFzZSAyIChvcmlnaW5hbCBidW5kbGUpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuaW1wb3J0ICogYXMgVXRpbHMgICAgICAgICAgICAgZnJvbSAnLi4vdXRpbHMuanMnO1xuaW1wb3J0ICogYXMgQXBpQ2xpZW50ICAgICAgICAgZnJvbSAnLi4vYXBpLWNsaWVudC5qcyc7XG5pbXBvcnQgKiBhcyBTdGF0ZSAgICAgICAgICAgICBmcm9tICcuLi9zdGF0ZS1tYW5hZ2VyLmpzJztcbmltcG9ydCAqIGFzIFByb3ZpZGVySW5mbyAgICAgIGZyb20gJy4uL3Byb3ZpZGVyLWluZm8uanMnO1xuaW1wb3J0ICogYXMgVWlDb3JlICAgICAgICAgICAgZnJvbSAnLi4vdWktY29yZS5qcyc7XG5pbXBvcnQgKiBhcyBMYXlvdXRJbnN0cnVjdGlvbiBmcm9tICcuLi9sYXlvdXQtaW5zdHJ1Y3Rpb24uanMnO1xuXG4vLyBcdTI1MDBcdTI1MDAgVGllciAwIFx1MjAxNCBubyBkZXBlbmRlbmNpZXMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5pbXBvcnQgKiBhcyBWYWxpZGF0b3JzICAgICAgICAgICAgZnJvbSAnLi4vdmFsaWRhdG9ycy5qcyc7XG5pbXBvcnQgKiBhcyBSZWNvbW1lbmRhdGlvbkhlbHBlcnMgZnJvbSAnLi4vcmVjb21tZW5kYXRpb24taGVscGVycy5qcyc7XG5pbXBvcnQgKiBhcyBVaUhlbHBlcnMgICAgICAgICAgICAgZnJvbSAnLi4vdWktaGVscGVycy5qcyc7XG5pbXBvcnQgKiBhcyBQcm9wb3NhbFJldmlldyAgICAgICAgZnJvbSAnLi4vcHJvcG9zYWwtcmV2aWV3LmpzJztcblxuLy8gXHUyNTAwXHUyNTAwIFRpZXIgMSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmltcG9ydCAqIGFzIEZldGNoVXRpbHMgICBmcm9tICcuLi9mZXRjaC11dGlscy5qcyc7XG5pbXBvcnQgKiBhcyBNZXNzYWdlUXVldWUgZnJvbSAnLi4vbWVzc2FnZS1xdWV1ZS5qcyc7XG5pbXBvcnQgKiBhcyBMbG1Mb2cgICAgICAgZnJvbSAnLi4vbGxtLWxvZy5qcyc7XG5cbi8vIFx1MjUwMFx1MjUwMCBUaWVyIDIgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5pbXBvcnQgKiBhcyBBdXRoUHJvdmlkZXIgICBmcm9tICcuLi9hdXRoLXByb3ZpZGVyLmpzJztcbmltcG9ydCAqIGFzIEF0c1JlZmluZW1lbnQgIGZyb20gJy4uL2F0cy1yZWZpbmVtZW50LmpzJztcbmltcG9ydCAqIGFzIEF0c01vZGFscyAgICAgIGZyb20gJy4uL2F0cy1tb2RhbHMuanMnO1xuaW1wb3J0ICogYXMgU2Vzc2lvbkFjdGlvbnMgZnJvbSAnLi4vc2Vzc2lvbi1hY3Rpb25zLmpzJztcbmltcG9ydCAqIGFzIEpvYkFuYWx5c2lzICAgIGZyb20gJy4uL2pvYi1hbmFseXNpcy5qcyc7XG5cbi8vIFx1MjUwMFx1MjUwMCBUaWVyIDMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5pbXBvcnQgKiBhcyBHb2FscyAgICAgICAgICAgZnJvbSAnLi4vZ29hbHMuanMnO1xuaW1wb3J0ICogYXMgU2Vzc2lvbk1hbmFnZXIgIGZyb20gJy4uL3Nlc3Npb24tbWFuYWdlci5qcyc7XG5pbXBvcnQgKiBhcyBKb2JJbnB1dCAgICAgICAgZnJvbSAnLi4vam9iLWlucHV0LmpzJztcbmltcG9ydCAqIGFzIE1lc3NhZ2VEaXNwYXRjaCBmcm9tICcuLi9tZXNzYWdlLWRpc3BhdGNoLmpzJztcbmltcG9ydCAqIGFzIFF1ZXN0aW9uc1BhbmVsICBmcm9tICcuLi9xdWVzdGlvbnMtcGFuZWwuanMnO1xuXG4vLyBcdTI1MDBcdTI1MDAgVGllciA0IFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuaW1wb3J0ICogYXMgUmV2aWV3SWNvbnMgICAgZnJvbSAnLi4vcmV2aWV3LWljb25zLmpzJztcbmltcG9ydCAqIGFzIFJldmlld1RhYmxlQmFzZSBmcm9tICcuLi9yZXZpZXctdGFibGUtYmFzZS5qcyc7XG5cbi8vIFx1MjUwMFx1MjUwMCBUaWVyIDUgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5pbXBvcnQgKiBhcyBFeHBlcmllbmNlUmV2aWV3ICAgZnJvbSAnLi4vZXhwZXJpZW5jZS1yZXZpZXcuanMnO1xuaW1wb3J0ICogYXMgU2tpbGxzUmV2aWV3ICAgICAgIGZyb20gJy4uL3NraWxscy1yZXZpZXcuanMnO1xuaW1wb3J0ICogYXMgQWNoaWV2ZW1lbnRzUmV2aWV3IGZyb20gJy4uL2FjaGlldmVtZW50cy1yZXZpZXcuanMnO1xuaW1wb3J0ICogYXMgVGFnbGluZVJldmlldyAgICAgIGZyb20gJy4uL3RhZ2xpbmUtcmV2aWV3LmpzJztcbmltcG9ydCAqIGFzIFN1bW1hcnlSZXZpZXcgICAgICBmcm9tICcuLi9zdW1tYXJ5LXJldmlldy5qcyc7XG5pbXBvcnQgKiBhcyBQdWJsaWNhdGlvbnNSZXZpZXcgZnJvbSAnLi4vcHVibGljYXRpb25zLXJldmlldy5qcyc7XG5cbi8vIFx1MjUwMFx1MjUwMCBUaWVyIDYgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5pbXBvcnQgKiBhcyBSZXdyaXRlUmV2aWV3ICAgICAgZnJvbSAnLi4vcmV3cml0ZS1yZXZpZXcuanMnO1xuaW1wb3J0ICogYXMgU3BlbGxDaGVjayAgICAgICAgIGZyb20gJy4uL3NwZWxsLWNoZWNrLmpzJztcbmltcG9ydCAqIGFzIERvd25sb2FkVGFiICAgICAgICBmcm9tICcuLi9kb3dubG9hZC10YWIuanMnO1xuaW1wb3J0ICogYXMgRmluYWxHZW5lcmF0ZSAgICAgIGZyb20gJy4uL2ZpbmFsLWdlbmVyYXRlLmpzJztcbmltcG9ydCAqIGFzIFdvcmtmbG93U3RlcHMgICAgICBmcm9tICcuLi93b3JrZmxvdy1zdGVwcy5qcyc7XG5pbXBvcnQgKiBhcyBNYXN0ZXJEYXRhQWlVcGRhdGUgZnJvbSAnLi4vbWFzdGVyLWRhdGEtYWktdXBkYXRlLmpzJztcbmltcG9ydCAqIGFzIE1hc3RlckN2ICAgICAgICAgICBmcm9tICcuLi9tYXN0ZXItY3YuanMnO1xuaW1wb3J0ICogYXMgQ292ZXJMZXR0ZXIgICAgICAgIGZyb20gJy4uL2NvdmVyLWxldHRlci5qcyc7XG5pbXBvcnQgKiBhcyBTY3JlZW5pbmdRdWVzdGlvbnMgZnJvbSAnLi4vc2NyZWVuaW5nLXF1ZXN0aW9ucy5qcyc7XG5pbXBvcnQgKiBhcyBGaW5hbGlzZSAgICAgICAgICAgZnJvbSAnLi4vZmluYWxpc2UuanMnO1xuaW1wb3J0ICogYXMgSW50ZXJ2aWV3UHJlcCAgICAgIGZyb20gJy4uL2ludGVydmlldy1wcmVwLmpzJztcbmltcG9ydCAqIGFzIFRoYW5rWW91ICAgICAgICAgICBmcm9tICcuLi90aGFuay15b3UuanMnO1xuaW1wb3J0ICogYXMgSGFydmVzdCAgICAgICAgICAgIGZyb20gJy4uL2hhcnZlc3QuanMnO1xuXG4vLyBcdTI1MDBcdTI1MDAgVGllciA3IFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuaW1wb3J0ICogYXMgU2Vzc2lvblN3aXRjaGVyVWkgIGZyb20gJy4uL3Nlc3Npb24tc3dpdGNoZXItdWkuanMnO1xuaW1wb3J0ICogYXMgS2V5Ym9hcmRTaG9ydGN1dHMgIGZyb20gJy4uL2tleWJvYXJkLXNob3J0Y3V0cy5qcyc7XG5cbi8vIFx1MjUwMFx1MjUwMCBBcHAgb3JjaGVzdHJhdG9yIChmb2xkZWQgaW50byBidW5kbGUgXHUyMDE0IEdBUC02NCkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5pbXBvcnQgKiBhcyBBcHAgZnJvbSAnLi4vYXBwLmpzJztcblxuLy8gXHUyNTAwXHUyNTAwIEFzc2lnbiBhbGwgZXhwb3J0cyB0byBnbG9iYWxUaGlzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuLy8gUGhhc2UgMiBtb2R1bGVzIGZpcnN0OyBwaGFzZSAzIGRvbWFpbiBtb2R1bGVzIGZvbGxvdyBzbyBmdWxseS1mZWF0dXJlZFxuLy8gaW1wbGVtZW50YXRpb25zIG92ZXJyaWRlIGFueSBwbGFjZWhvbGRlciBzdHVicyAoZS5nLiBzaG93U2Vzc2lvbkNvbmZsaWN0QmFubmVyXG4vLyBpbiBzZXNzaW9uLXN3aXRjaGVyLXVpIG92ZXJyaWRlcyB0aGUgc2ltcGxlIHN0dWIgaW4gdWktY29yZSkuXG5PYmplY3QuYXNzaWduKGdsb2JhbFRoaXMsXG4gIExvZ2dlciwgVXRpbHMsIEFwaUNsaWVudCwgU3RhdGUsIFByb3ZpZGVySW5mbywgVWlDb3JlLCBMYXlvdXRJbnN0cnVjdGlvbixcbiAgVmFsaWRhdG9ycywgUmVjb21tZW5kYXRpb25IZWxwZXJzLCBVaUhlbHBlcnMsIFByb3Bvc2FsUmV2aWV3LFxuICBGZXRjaFV0aWxzLCBNZXNzYWdlUXVldWUsIExsbUxvZyxcbiAgQXV0aFByb3ZpZGVyLCBBdHNSZWZpbmVtZW50LCBBdHNNb2RhbHMsIFNlc3Npb25BY3Rpb25zLCBKb2JBbmFseXNpcyxcbiAgR29hbHMsXG4gIFNlc3Npb25NYW5hZ2VyLCBKb2JJbnB1dCwgTWVzc2FnZURpc3BhdGNoLCBRdWVzdGlvbnNQYW5lbCxcbiAgUmV2aWV3VGFibGVCYXNlLFxuICBFeHBlcmllbmNlUmV2aWV3LCBTa2lsbHNSZXZpZXcsIEFjaGlldmVtZW50c1JldmlldywgVGFnbGluZVJldmlldywgU3VtbWFyeVJldmlldywgUHVibGljYXRpb25zUmV2aWV3LCBSZXZpZXdJY29ucyxcbiAgUmV3cml0ZVJldmlldywgU3BlbGxDaGVjaywgRG93bmxvYWRUYWIsIEZpbmFsR2VuZXJhdGUsIFdvcmtmbG93U3RlcHMsIE1hc3RlckRhdGFBaVVwZGF0ZSwgTWFzdGVyQ3YsXG4gIENvdmVyTGV0dGVyLCBTY3JlZW5pbmdRdWVzdGlvbnMsIEZpbmFsaXNlLCBJbnRlcnZpZXdQcmVwLCBUaGFua1lvdSwgSGFydmVzdCxcbiAgU2Vzc2lvblN3aXRjaGVyVWksIEtleWJvYXJkU2hvcnRjdXRzLFxuICBBcHAsXG4pO1xuXG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgQXBwLmluaXQpO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBTUEsT0FBQyxTQUFVLE1BQU0sWUFBWTtBQUN6QjtBQUNBLFlBQUksT0FBTyxXQUFXLGNBQWMsT0FBTyxLQUFLO0FBQzVDLGlCQUFPLFVBQVU7QUFBQSxRQUNyQixXQUFXLE9BQU8sV0FBVyxZQUFZLE9BQU8sU0FBUztBQUNyRCxpQkFBTyxVQUFVLFdBQVc7QUFBQSxRQUNoQyxPQUFPO0FBQ0gsZUFBSyxNQUFNLFdBQVc7QUFBQSxRQUMxQjtBQUFBLE1BQ0osR0FBRSxTQUFNLFdBQVk7QUFDaEI7QUFHQSxZQUFJLE9BQU8sV0FBVztBQUFBLFFBQUM7QUFDdkIsWUFBSSxn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QVMsQ0FBQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxVQThFL0Isa0JBQWtCLE1BQU0sQ0FBQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFVBYXpCLDBCQUEwQixjQUFjLENBQUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFVBaUJ6QywrQkFBK0IsWUFBWSxDQUFDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFVBa0I1QyxxQkFBcUIsU0FBUyxDQUFDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FB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QUF5QjtBQUN4RixhQUFTLGVBQWUsc0JBQXNCLEVBQUUsaUJBQWlCLFNBQVMsTUFBTSxVQUFVLFFBQVEsQ0FBQztBQUNuRyxhQUFTLGVBQWUsWUFBWSxFQUFFLGlCQUFpQixTQUFTLHlCQUF5QjtBQUN6RixhQUFTLGVBQWUsNEJBQTRCLEVBQUUsaUJBQWlCLFNBQVMsdUJBQXVCO0FBQ3ZHLGFBQVMsZUFBZSxxQkFBcUIsRUFBRSxpQkFBaUIsU0FBUyxNQUFNLFVBQVUsVUFBVSxDQUFDO0FBRXBHLFFBQUksT0FBTywwQkFBMEIsV0FBWSx1QkFBc0I7QUFBQSxFQUN6RTs7O0FDL0RBLFNBQU87QUFBQSxJQUFPO0FBQUEsSUFDWjtBQUFBLElBQVE7QUFBQSxJQUFPO0FBQUEsSUFBVztBQUFBLElBQU87QUFBQSxJQUFjO0FBQUEsSUFBUTtBQUFBLElBQ3ZEO0FBQUEsSUFBWTtBQUFBLElBQXVCO0FBQUEsSUFBVztBQUFBLElBQzlDO0FBQUEsSUFBWTtBQUFBLElBQWM7QUFBQSxJQUMxQjtBQUFBLElBQWM7QUFBQSxJQUFlO0FBQUEsSUFBVztBQUFBLElBQWdCO0FBQUEsSUFDeEQ7QUFBQSxJQUNBO0FBQUEsSUFBZ0I7QUFBQSxJQUFVO0FBQUEsSUFBaUI7QUFBQSxJQUMzQztBQUFBLElBQ0E7QUFBQSxJQUFrQjtBQUFBLElBQWM7QUFBQSxJQUFvQjtBQUFBLElBQWU7QUFBQSxJQUFlO0FBQUEsSUFBb0I7QUFBQSxJQUN0RztBQUFBLElBQWU7QUFBQSxJQUFZO0FBQUEsSUFBYTtBQUFBLElBQWU7QUFBQSxJQUFlO0FBQUEsSUFBb0I7QUFBQSxJQUMxRjtBQUFBLElBQWE7QUFBQSxJQUFvQjtBQUFBLElBQVU7QUFBQSxJQUFlO0FBQUEsSUFBVTtBQUFBLElBQ3BFO0FBQUEsSUFBbUI7QUFBQSxJQUNuQjtBQUFBLEVBQ0Y7QUFFQSxXQUFTLGlCQUFpQixvQkFBd0IsSUFBSTsiLAogICJuYW1lcyI6IFsiZ2V0TG9nZ2VyIiwgImxvZ2dlciIsICJsb2dsZXZlbCIsICJjbGVhbkpzb25SZXNwb25zZSIsICJlc2NhcGVIdG1sIiwgImV4dHJhY3RGaXJzdEpzb25PYmplY3QiLCAiZXh0cmFjdFRpdGxlQW5kQ29tcGFueUZyb21Kb2JUZXh0IiwgImZvcm1hdFNlc3Npb25QaGFzZUxhYmVsIiwgIm5vcm1hbGl6ZVBvc2l0aW9uTGFiZWwiLCAibm9ybWFsaXplVGV4dCIsICJ0ZXh0IiwgIm0iLCAiaHRtbCIsICJ2IiwgIlN0b3JhZ2VLZXlzIiwgImFwaUNhbGwiLCAiY3JlYXRlU2Vzc2lvbiIsICJmZXRjaFN0YXR1cyIsICJnZXRPd25lclRva2VuIiwgImdldFNjb3BlZFRhYkRhdGFTdG9yYWdlS2V5IiwgImdldFNlc3Npb25JZEZyb21VUkwiLCAiX3VwZGF0ZUxMTVN0YXR1c0JhciIsICJsbG1GZXRjaCIsICJzZXRMb2FkaW5nIiwgIl8iLCAiaW5pdCIsICJjaGF0QXJlYSIsICJTdG9yYWdlS2V5cyIsICJnZXRTZXNzaW9uSWRGcm9tVVJMIiwgImdldE93bmVyVG9rZW4iLCAiZ2V0U2NvcGVkVGFiRGF0YVN0b3JhZ2VLZXkiLCAic2Vzc2lvbklkIiwgImluaXQiLCAiXyIsICJhcGlDYWxsIiwgImNyZWF0ZVNlc3Npb24iLCAiZmV0Y2hTdGF0dXMiLCAiUEhBU0VTIiwgInN0YXRlTWFuYWdlciIsICJsb2ciLCAiUEhBU0VTIiwgInN0YXRlTWFuYWdlciIsICJTdG9yYWdlS2V5cyIsICJnZXRQcm92aWRlckluZm8iLCAibG9hZFByb3ZpZGVySW5mbyIsICJwcm92aWRlckluZm9Qb3BvdmVyQ29udGVudCIsICJsb2FkUHJvdmlkZXJJbmZvIiwgImdldFByb3ZpZGVySW5mbyIsICJwcm92aWRlckluZm9Qb3BvdmVyQ29udGVudCIsICJlc2NhcGVIdG1sIiwgIl91cGRhdGVMbG1TdGF0dXNQaWxsIiwgImNsb3NlTW9kZWxNb2RhbCIsICJjb25maXJtRGlhbG9nIiwgImdldFN0YWdlRm9yVGFiIiwgInB1c2hGb2N1c1N0YWNrIiwgInJlc3RvcmVGb2N1cyIsICJzZXRJbml0aWFsRm9jdXMiLCAidHJhcEZvY3VzIiwgInVwZGF0ZVRhYkJhckZvclN0YWdlIiwgImxvZyIsICJmZXRjaFN0YXR1cyIsICJhcGlDYWxsIiwgIl8iLCAic2V0SW5pdGlhbEZvY3VzIiwgInRyYXBGb2N1cyIsICJyZXN0b3JlRm9jdXMiLCAicHVzaEZvY3VzU3RhY2siLCAiY29uZmlybURpYWxvZyIsICJnZXRTdGFnZUZvclRhYiIsICJzdGF0ZU1hbmFnZXIiLCAidXBkYXRlVGFiQmFyRm9yU3RhZ2UiLCAiU3RvcmFnZUtleXMiLCAiX3VwZGF0ZUxsbVN0YXR1c1BpbGwiLCAidGV4dCIsICJiIiwgImVzY2FwZUh0bWwiLCAiY2xvc2VNb2RlbE1vZGFsIiwgInYiLCAibSIsICJldmVudCIsICJ1cGRhdGVXb3JrZmxvd1N0ZXBzQ2xpY2thYmxlIiwgImhhbmRsZUxheW91dFByaW1hcnlBY3Rpb24iLCAiaW5pdGlhdGVMYXlvdXRJbnN0cnVjdGlvbnMiLCAicmVmcmVzaEF0c1Njb3JlIiwgInNjaGVkdWxlQXRzUmVmcmVzaCIsICJ1cGRhdGVBdHNCYWRnZSIsICJ0ZXh0IiwgImdlbmVyYXRpb25TdGF0ZSIsICJzZXNzaW9uSWQiLCAiX2UiLCAiX2ZsdXNoTWVzc2FnZVF1ZXVlIiwgImFwcGVuZEZvcm1hdHRlZEFuYWx5c2lzIiwgImFwcGVuZExvYWRpbmdNZXNzYWdlIiwgImFwcGVuZE1lc3NhZ2UiLCAiYXBwZW5kUmF3SHRtbCIsICJhcHBlbmRSZXRyeU1lc3NhZ2UiLCAicmVtb3ZlTG9hZGluZ01lc3NhZ2UiLCAibG9nIiwgIl9mbHVzaE1lc3NhZ2VRdWV1ZSIsICJ0ZXh0IiwgImFwcGVuZE1lc3NhZ2UiLCAiYXBwZW5kTG9hZGluZ01lc3NhZ2UiLCAicmVtb3ZlTG9hZGluZ01lc3NhZ2UiLCAiaHRtbCIsICJlc2NhcGVIdG1sIiwgImFwcGVuZFJldHJ5TWVzc2FnZSIsICJhcHBlbmRGb3JtYXR0ZWRBbmFseXNpcyIsICJjbGVhbkpzb25SZXNwb25zZSIsICJhcHBlbmRSYXdIdG1sIiwgIl91cGRhdGVQYWdlRXN0aW1hdGUiLCAiaGFuZGxlQWN0aW9uQ2xpY2siLCAiaGFuZGxlQ3VzdG9taXphdGlvblJlc3BvbnNlIiwgInNob3dUYWJsZUJhc2VkUmV2aWV3IiwgInN3aXRjaFRhYiIsICJ1cGRhdGVJbmNsdXNpb25Db3VudHMiLCAidXNlclNlbGVjdGlvbnMiLCAibG9nIiwgInVzZXJTZWxlY3Rpb25zIiwgInN0YXRlTWFuYWdlciIsICJ1cGRhdGVJbmNsdXNpb25Db3VudHMiLCAidiIsICJzd2l0Y2hUYWIiLCAidGFiRGF0YSIsICJzaG93VGFibGVCYXNlZFJldmlldyIsICJzZXNzaW9uSWQiLCAiXyIsICJodG1sIiwgImhhbmRsZUN1c3RvbWl6YXRpb25SZXNwb25zZSIsICJzdGF0ZU1hbmFnZXIiLCAiX3VwZGF0ZVBhZ2VFc3RpbWF0ZSIsICJ1c2VyU2VsZWN0aW9ucyIsICJoYW5kbGVBY3Rpb25DbGljayIsICJfdXBkYXRlVmlld2luZ0luZGljYXRvciIsICJjb25maXJtUmVSdW5QaGFzZSIsICJzaG93QnVsbGV0UmVvcmRlciIsICJsb2ciLCAic3RhdGVNYW5hZ2VyIiwgImdlbmVyYXRpb25TdGF0ZSIsICJjb25maXJtUmVSdW5QaGFzZSIsICJfdXBkYXRlVmlld2luZ0luZGljYXRvciIsICJxIiwgImNsb3NlTW9kYWwiLCAiX2UiLCAic2hvd0J1bGxldFJlb3JkZXIiLCAiXyIsICJ0ZXh0IiwgImxvZyIsICJzdGF0ZU1hbmFnZXIiLCAiaHRtbCIsICJzZXNzaW9uSWQiLCAiZXNjYXBlSHRtbCIsICJ0ZXh0IiwgImdlbmVyYXRpb25TdGF0ZSIsICJpbml0aWF0ZUxheW91dEluc3RydWN0aW9ucyIsICJfIiwgImFwcGVuZE1lc3NhZ2UiLCAiY29uZmlybVJlUnVuUGhhc2UiLCAiYXBpQ2FsbCIsICJ3IiwgIl9lIiwgInNjaGVkdWxlQXRzUmVmcmVzaCIsICJzd2l0Y2hUYWIiLCAiaGFuZGxlTGF5b3V0UHJpbWFyeUFjdGlvbiIsICJwYXJzZU1lc3NhZ2VSZXNwb25zZSIsICJwYXJzZVJld3JpdGVzUmVzcG9uc2UiLCAicGFyc2VTZXNzaW9uTGlzdFJlc3BvbnNlIiwgInBhcnNlU3RhdHVzUmVzcG9uc2UiLCAibG9nIiwgInBhcnNlU3RhdHVzUmVzcG9uc2UiLCAiayIsICJwYXJzZVNlc3Npb25MaXN0UmVzcG9uc2UiLCAicGFyc2VSZXdyaXRlc1Jlc3BvbnNlIiwgInBhcnNlTWVzc2FnZVJlc3BvbnNlIiwgImJ1aWxkRmFsbGJhY2tQb3N0QW5hbHlzaXNRdWVzdGlvbnMiLCAiZ2V0QWNoaWV2ZW1lbnRDb25maWRlbmNlIiwgImdldEFjaGlldmVtZW50UmVhc29uaW5nIiwgImdldEFjaGlldmVtZW50UmVjb21tZW5kYXRpb24iLCAiZ2V0Q29uZmlkZW5jZUxldmVsIiwgImdldEV4cGVyaWVuY2VSZWFzb25pbmciLCAiZ2V0RXhwZXJpZW5jZVJlY29tbWVuZGF0aW9uIiwgImdldFNraWxsQ29uZmlkZW5jZSIsICJnZXRTa2lsbFJlYXNvbmluZyIsICJnZXRTa2lsbFJlY29tbWVuZGF0aW9uIiwgImxvZyIsICJnZXRFeHBlcmllbmNlUmVjb21tZW5kYXRpb24iLCAiZ2V0Q29uZmlkZW5jZUxldmVsIiwgImdldEV4cGVyaWVuY2VSZWFzb25pbmciLCAiZ2V0U2tpbGxSZWNvbW1lbmRhdGlvbiIsICJnZXRTa2lsbENvbmZpZGVuY2UiLCAiZ2V0U2tpbGxSZWFzb25pbmciLCAiZ2V0QWNoaWV2ZW1lbnRSZWNvbW1lbmRhdGlvbiIsICJnZXRBY2hpZXZlbWVudENvbmZpZGVuY2UiLCAiZ2V0QWNoaWV2ZW1lbnRSZWFzb25pbmciLCAiYnVpbGRGYWxsYmFja1Bvc3RBbmFseXNpc1F1ZXN0aW9ucyIsICJjbG9zZUFsZXJ0TW9kYWwiLCAic2hvd0FsZXJ0TW9kYWwiLCAic2hvd0NvbmZpcm1Nb2RhbCIsICJzaG93VG9hc3QiLCAidXBkYXRlQWN0aW9uQnV0dG9ucyIsICJzaG93QWxlcnRNb2RhbCIsICJjbG9zZUFsZXJ0TW9kYWwiLCAic2hvd0NvbmZpcm1Nb2RhbCIsICJzaG93VG9hc3QiLCAic3RhdGVNYW5hZ2VyIiwgImdlbmVyYXRpb25TdGF0ZSIsICJ1cGRhdGVBY3Rpb25CdXR0b25zIiwgImV2ZW50IiwgImZldGNoQW5kRGlzcGxheUxsbUxvZyIsICJsb2ciLCAidGV4dCIsICJlc2NhcGVIdG1sIiwgIm0iLCAiaHRtbCIsICJmZXRjaEFuZERpc3BsYXlMbG1Mb2ciLCAic2Vzc2lvbklkIiwgImdldFNlc3Npb25JZEZyb21VUkwiLCAidXBkYXRlQXV0aEJhZGdlIiwgInVwZGF0ZUF1dGhCYWRnZSIsICJ0ZXh0IiwgImdldFByb3ZpZGVySW5mbyIsICJwb3B1bGF0ZUF0c1Njb3JlVGFiIiwgInNlc3Npb25JZCIsICJzdGF0ZU1hbmFnZXIiLCAiXyIsICJlc2NhcGVIdG1sIiwgInB1c2hGb2N1c1N0YWNrIiwgInRyYXBGb2N1cyIsICJ1cGRhdGVBdHNCYWRnZSIsICJyZXN0b3JlRm9jdXMiLCAiayIsICJwb3B1bGF0ZUF0c1Njb3JlVGFiIiwgIl9BQ1RJT05fTEFCRUxTIiwgInNlbmRBY3Rpb24iLCAidXBkYXRlUG9zaXRpb25UaXRsZSIsICJsb2ciLCAiX0FDVElPTl9MQUJFTFMiLCAic2VuZEFjdGlvbiIsICJzdGF0ZU1hbmFnZXIiLCAiX2UiLCAiU3RvcmFnZUtleXMiLCAidGV4dCIsICJ1cGRhdGVQb3NpdGlvblRpdGxlIiwgImFuYWx5emVKb2IiLCAibWVyZ2VQb3N0QW5hbHlzaXNRdWVzdGlvbnMiLCAibm9ybWFsaXplUG9zdEFuYWx5c2lzUXVlc3Rpb25zIiwgImxvZyIsICJub3JtYWxpemVQb3N0QW5hbHlzaXNRdWVzdGlvbnMiLCAicSIsICJ0ZXh0IiwgIm1lcmdlUG9zdEFuYWx5c2lzUXVlc3Rpb25zIiwgImFuYWx5emVKb2IiLCAic3RhdGVNYW5hZ2VyIiwgIlN0b3JhZ2VLZXlzIiwgIl9lIiwgInBvcHVsYXRlR29hbHNUYWIiLCAibG9nIiwgInBvcHVsYXRlR29hbHNUYWIiLCAiX2dldEN1cnJlbnRTZXNzaW9uSWRWYWx1ZSIsICJidWlsZFNlc3Npb25Td2l0Y2hlckxhYmVsIiwgImNyZWF0ZU5ld1Nlc3Npb25BbmROYXZpZ2F0ZSIsICJlbnN1cmVTZXNzaW9uQ29udGV4dCIsICJmb3JtYXRTZXNzaW9uUGhhc2VMYWJlbCIsICJmb3JtYXRTZXNzaW9uVGltZXN0YW1wIiwgImdldEFjdGl2ZVNlc3Npb25Pd25lcnNoaXBNZXRhIiwgImxvYWRTZXNzaW9uRmlsZSIsICJtYXliZVNob3dXZWxjb21lTW9kYWwiLCAicmVzdG9yZVNlc3Npb24iLCAic2F2ZVRhYkRhdGEiLCAibG9nIiwgImZvcm1hdFNlc3Npb25QaGFzZUxhYmVsIiwgIl9nZXRDdXJyZW50U2Vzc2lvbklkVmFsdWUiLCAiXyIsICJidWlsZFNlc3Npb25Td2l0Y2hlckxhYmVsIiwgImdldEFjdGl2ZVNlc3Npb25Pd25lcnNoaXBNZXRhIiwgImZvcm1hdFNlc3Npb25UaW1lc3RhbXAiLCAibWF5YmVTaG93V2VsY29tZU1vZGFsIiwgImNyZWF0ZU5ld1Nlc3Npb25BbmROYXZpZ2F0ZSIsICJzdGF0ZU1hbmFnZXIiLCAiUEhBU0VTIiwgImVuc3VyZVNlc3Npb25Db250ZXh0IiwgInJlc3RvcmVTZXNzaW9uIiwgImsiLCAidiIsICJfZSIsICJsb2FkU2Vzc2lvbkZpbGUiLCAic2F2ZVRhYkRhdGEiLCAicG9wdWxhdGVKb2JUYWIiLCAic2hvd0xvYWRKb2JQYW5lbCIsICJfZ2V0RGVmYXVsdHMiLCAiX2RlZmF1bHRzIiwgImNoYW5nZURlZmF1bHRzIiwgIm5ld0RlZmF1bHRzIiwgIm5vb3BUZXN0IiwgImVkaXQiLCAicmVnZXgiLCAib3B0IiwgInNvdXJjZSIsICJvYmoiLCAibmFtZSIsICJ2YWwiLCAidmFsU291cmNlIiwgIm90aGVyIiwgInN1cHBvcnRzTG9va2JlaGluZCIsICJidWxsIiwgImluZGVudCIsICJuZXdsaW5lIiwgImJsb2NrQ29kZSIsICJmZW5jZXMiLCAiaHIiLCAiaGVhZGluZyIsICJidWxsZXQiLCAibGhlYWRpbmdDb3JlIiwgImxoZWFkaW5nIiwgImxoZWFkaW5nR2ZtIiwgIl9wYXJhZ3JhcGgiLCAiYmxvY2tUZXh0IiwgIl9ibG9ja0xhYmVsIiwgImRlZiIsICJsaXN0IiwgIl90YWciLCAiX2NvbW1lbnQiLCAiaHRtbCIsICJwYXJhZ3JhcGgiLCAiYmxvY2txdW90ZSIsICJibG9ja05vcm1hbCIsICJnZm1UYWJsZSIsICJibG9ja0dmbSIsICJibG9ja1BlZGFudGljIiwgImVzY2FwZSIsICJpbmxpbmVDb2RlIiwgImJyIiwgImlubGluZVRleHQiLCAiX3B1bmN0dWF0aW9uIiwgIl9wdW5jdHVhdGlvbk9yU3BhY2UiLCAiX25vdFB1bmN0dWF0aW9uT3JTcGFjZSIsICJwdW5jdHVhdGlvbiIsICJfcHVuY3R1YXRpb25HZm1TdHJvbmdFbSIsICJfcHVuY3R1YXRpb25PclNwYWNlR2ZtU3Ryb25nRW0iLCAiX25vdFB1bmN0dWF0aW9uT3JTcGFjZUdmbVN0cm9uZ0VtIiwgImJsb2NrU2tpcCIsICJlbVN0cm9uZ0xEZWxpbUNvcmUiLCAiZW1TdHJvbmdMRGVsaW0iLCAiZW1TdHJvbmdMRGVsaW1HZm0iLCAiZW1TdHJvbmdSRGVsaW1Bc3RDb3JlIiwgImVtU3Ryb25nUkRlbGltQXN0IiwgImVtU3Ryb25nUkRlbGltQXN0R2ZtIiwgImVtU3Ryb25nUkRlbGltVW5kIiwgImRlbExEZWxpbSIsICJkZWxSRGVsaW1Db3JlIiwgImRlbFJEZWxpbSIsICJhbnlQdW5jdHVhdGlvbiIsICJhdXRvbGluayIsICJfaW5saW5lQ29tbWVudCIsICJ0YWciLCAiX2lubGluZUxhYmVsIiwgImxpbmsiLCAicmVmbGluayIsICJub2xpbmsiLCAicmVmbGlua1NlYXJjaCIsICJfY2FzZUluc2Vuc2l0aXZlUHJvdG9jb2wiLCAiaW5saW5lTm9ybWFsIiwgImlubGluZVBlZGFudGljIiwgImlubGluZUdmbSIsICJpbmxpbmVCcmVha3MiLCAiYmxvY2siLCAiaW5saW5lIiwgImVzY2FwZVJlcGxhY2VtZW50cyIsICJnZXRFc2NhcGVSZXBsYWNlbWVudCIsICJjaCIsICJlc2NhcGVIdG1sRW50aXRpZXMiLCAiZW5jb2RlIiwgImNsZWFuVXJsIiwgImhyZWYiLCAic3BsaXRDZWxscyIsICJ0YWJsZVJvdyIsICJjb3VudCIsICJyb3ciLCAibWF0Y2giLCAib2Zmc2V0IiwgInN0ciIsICJlc2NhcGVkIiwgImN1cnIiLCAiY2VsbHMiLCAiaSIsICJydHJpbSIsICJjIiwgImludmVydCIsICJsIiwgInN1ZmZMZW4iLCAiY3VyckNoYXIiLCAiZmluZENsb3NpbmdCcmFja2V0IiwgImIiLCAibGV2ZWwiLCAiZXhwYW5kVGFicyIsICJsaW5lIiwgImNvbCIsICJleHBhbmRlZCIsICJjaGFyIiwgImFkZGVkIiwgIm91dHB1dExpbmsiLCAiY2FwIiwgInJhdyIsICJsZXhlciIsICJydWxlcyIsICJ0aXRsZSIsICJ0ZXh0IiwgInRva2VuIiwgImluZGVudENvZGVDb21wZW5zYXRpb24iLCAibWF0Y2hJbmRlbnRUb0NvZGUiLCAiaW5kZW50VG9Db2RlIiwgIm5vZGUiLCAibWF0Y2hJbmRlbnRJbk5vZGUiLCAiaW5kZW50SW5Ob2RlIiwgIl9Ub2tlbml6ZXIiLCAib3B0aW9ucyIsICJzcmMiLCAidHJpbW1lZCIsICJsaW5lcyIsICJ0b2tlbnMiLCAiaW5CbG9ja3F1b3RlIiwgImN1cnJlbnRMaW5lcyIsICJjdXJyZW50UmF3IiwgImN1cnJlbnRUZXh0IiwgInRvcCIsICJsYXN0VG9rZW4iLCAib2xkVG9rZW4iLCAibmV3VGV4dCIsICJuZXdUb2tlbiIsICJpc29yZGVyZWQiLCAiaXRlbVJlZ2V4IiwgImVuZHNXaXRoQmxhbmtMaW5lIiwgImVuZEVhcmx5IiwgIml0ZW1Db250ZW50cyIsICJuZXh0TGluZSIsICJibGFua0xpbmUiLCAibmV4dEJ1bGxldFJlZ2V4IiwgImhyUmVnZXgiLCAiZmVuY2VzQmVnaW5SZWdleCIsICJoZWFkaW5nQmVnaW5SZWdleCIsICJodG1sQmVnaW5SZWdleCIsICJibG9ja3F1b3RlQmVnaW5SZWdleCIsICJyYXdMaW5lIiwgIm5leHRMaW5lV2l0aG91dFRhYnMiLCAibGFzdEl0ZW0iLCAiaXRlbSIsICJ0YXNrUmF3IiwgImNoZWNrYm94VG9rZW4iLCAic3BhY2VycyIsICJ0IiwgImhhc011bHRpcGxlTGluZUJyZWFrcyIsICJoZWFkZXJzIiwgImFsaWducyIsICJyb3dzIiwgImFsaWduIiwgImNlbGwiLCAidHJpbW1lZFVybCIsICJydHJpbVNsYXNoIiwgImxhc3RQYXJlbkluZGV4IiwgImxpbmtMZW4iLCAibGlua3MiLCAibGlua1N0cmluZyIsICJtYXNrZWRTcmMiLCAicHJldkNoYXIiLCAibExlbmd0aCIsICJyRGVsaW0iLCAickxlbmd0aCIsICJkZWxpbVRvdGFsIiwgIm1pZERlbGltVG90YWwiLCAiZW5kUmVnIiwgImxhc3RDaGFyTGVuZ3RoIiwgImhhc05vblNwYWNlQ2hhcnMiLCAiaGFzU3BhY2VDaGFyc09uQm90aEVuZHMiLCAicHJldkNhcFplcm8iLCAiX0xleGVyIiwgIl9fTGV4ZXIiLCAibmV4dCIsICJsYXN0UGFyYWdyYXBoQ2xpcHBlZCIsICJleHRUb2tlbml6ZXIiLCAiY3V0U3JjIiwgInN0YXJ0SW5kZXgiLCAidGVtcFNyYyIsICJ0ZW1wU3RhcnQiLCAiZ2V0U3RhcnRJbmRleCIsICJlcnJNc2ciLCAia2VlcFByZXZDaGFyIiwgIl9SZW5kZXJlciIsICJsYW5nIiwgImxhbmdTdHJpbmciLCAiY29kZSIsICJkZXB0aCIsICJvcmRlcmVkIiwgInN0YXJ0IiwgImJvZHkiLCAiaiIsICJ0eXBlIiwgInN0YXJ0QXR0ciIsICJjaGVja2VkIiwgImhlYWRlciIsICJrIiwgImNvbnRlbnQiLCAiY2xlYW5IcmVmIiwgIm91dCIsICJfVGV4dFJlbmRlcmVyIiwgIl9QYXJzZXIiLCAiX19QYXJzZXIiLCAiYW55VG9rZW4iLCAiZ2VuZXJpY1Rva2VuIiwgInJldCIsICJyZW5kZXJlciIsICJfSG9va3MiLCAibWFya2Rvd24iLCAiTWFya2VkIiwgImFyZ3MiLCAiY2FsbGJhY2siLCAidmFsdWVzIiwgInRhYmxlVG9rZW4iLCAibGlzdFRva2VuIiwgImNoaWxkVG9rZW5zIiwgImV4dGVuc2lvbnMiLCAicGFjayIsICJvcHRzIiwgImV4dCIsICJwcmV2UmVuZGVyZXIiLCAiZXh0TGV2ZWwiLCAicHJvcCIsICJyZW5kZXJlclByb3AiLCAicmVuZGVyZXJGdW5jIiwgInRva2VuaXplciIsICJ0b2tlbml6ZXJQcm9wIiwgInRva2VuaXplckZ1bmMiLCAicHJldlRva2VuaXplciIsICJob29rcyIsICJob29rc1Byb3AiLCAiaG9va3NGdW5jIiwgInByZXZIb29rIiwgImFyZyIsICJ3YWxrVG9rZW5zIiwgInBhY2tXYWxrdG9rZW5zIiwgImJsb2NrVHlwZSIsICJvcmlnT3B0IiwgInRocm93RXJyb3IiLCAicHJvY2Vzc2VkU3JjIiwgInByb2Nlc3NlZFRva2VucyIsICJlIiwgInNpbGVudCIsICJhc3luYyIsICJtc2ciLCAibWFya2VkSW5zdGFuY2UiLCAibWFya2VkIiwgInNldE9wdGlvbnMiLCAidXNlIiwgInBhcnNlSW5saW5lIiwgInBhcnNlciIsICJfUGFyc2VyIiwgImxleGVyIiwgIl9MZXhlciIsICJlbnRyaWVzIiwgInNldFByb3RvdHlwZU9mIiwgImlzRnJvemVuIiwgImdldFByb3RvdHlwZU9mIiwgImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsICJPYmplY3QiLCAiZnJlZXplIiwgInNlYWwiLCAiY3JlYXRlIiwgImFwcGx5IiwgImNvbnN0cnVjdCIsICJSZWZsZWN0IiwgIngiLCAiZnVuYyIsICJ0aGlzQXJnIiwgIl9sZW4iLCAiYXJndW1lbnRzIiwgImxlbmd0aCIsICJhcmdzIiwgIkFycmF5IiwgIl9rZXkiLCAiRnVuYyIsICJfbGVuMiIsICJfa2V5MiIsICJhcnJheUZvckVhY2giLCAidW5hcHBseSIsICJwcm90b3R5cGUiLCAiZm9yRWFjaCIsICJhcnJheUxhc3RJbmRleE9mIiwgImxhc3RJbmRleE9mIiwgImFycmF5UG9wIiwgInBvcCIsICJhcnJheVB1c2giLCAicHVzaCIsICJhcnJheVNwbGljZSIsICJzcGxpY2UiLCAic3RyaW5nVG9Mb3dlckNhc2UiLCAiU3RyaW5nIiwgInRvTG93ZXJDYXNlIiwgInN0cmluZ1RvU3RyaW5nIiwgInRvU3RyaW5nIiwgInN0cmluZ01hdGNoIiwgIm1hdGNoIiwgInN0cmluZ1JlcGxhY2UiLCAicmVwbGFjZSIsICJzdHJpbmdJbmRleE9mIiwgImluZGV4T2YiLCAic3RyaW5nVHJpbSIsICJ0cmltIiwgIm9iamVjdEhhc093blByb3BlcnR5IiwgImhhc093blByb3BlcnR5IiwgInJlZ0V4cFRlc3QiLCAiUmVnRXhwIiwgInRlc3QiLCAidHlwZUVycm9yQ3JlYXRlIiwgInVuY29uc3RydWN0IiwgIlR5cGVFcnJvciIsICJsYXN0SW5kZXgiLCAiX2xlbjMiLCAiX2tleTMiLCAiX2xlbjQiLCAiX2tleTQiLCAiYWRkVG9TZXQiLCAic2V0IiwgImFycmF5IiwgInRyYW5zZm9ybUNhc2VGdW5jIiwgImwiLCAiZWxlbWVudCIsICJsY0VsZW1lbnQiLCAiY2xlYW5BcnJheSIsICJpbmRleCIsICJpc1Byb3BlcnR5RXhpc3QiLCAiY2xvbmUiLCAib2JqZWN0IiwgIm5ld09iamVjdCIsICJwcm9wZXJ0eSIsICJ2YWx1ZSIsICJpc0FycmF5IiwgImNvbnN0cnVjdG9yIiwgImxvb2t1cEdldHRlciIsICJwcm9wIiwgImRlc2MiLCAiZ2V0IiwgImZhbGxiYWNrVmFsdWUiLCAiaHRtbCIsICJzdmciLCAic3ZnRmlsdGVycyIsICJzdmdEaXNhbGxvd2VkIiwgIm1hdGhNbCIsICJtYXRoTWxEaXNhbGxvd2VkIiwgInRleHQiLCAieG1sIiwgIk1VU1RBQ0hFX0VYUFIiLCAiRVJCX0VYUFIiLCAiVE1QTElUX0VYUFIiLCAiREFUQV9BVFRSIiwgIkFSSUFfQVRUUiIsICJJU19BTExPV0VEX1VSSSIsICJJU19TQ1JJUFRfT1JfREFUQSIsICJBVFRSX1dISVRFU1BBQ0UiLCAiRE9DVFlQRV9OQU1FIiwgIkNVU1RPTV9FTEVNRU5UIiwgIk5PREVfVFlQRSIsICJhdHRyaWJ1dGUiLCAiY2RhdGFTZWN0aW9uIiwgImVudGl0eVJlZmVyZW5jZSIsICJlbnRpdHlOb2RlIiwgInByb2dyZXNzaW5nSW5zdHJ1Y3Rpb24iLCAiY29tbWVudCIsICJkb2N1bWVudCIsICJkb2N1bWVudFR5cGUiLCAiZG9jdW1lbnRGcmFnbWVudCIsICJub3RhdGlvbiIsICJnZXRHbG9iYWwiLCAid2luZG93IiwgIl9jcmVhdGVUcnVzdGVkVHlwZXNQb2xpY3kiLCAidHJ1c3RlZFR5cGVzIiwgInB1cmlmeUhvc3RFbGVtZW50IiwgImNyZWF0ZVBvbGljeSIsICJzdWZmaXgiLCAiQVRUUl9OQU1FIiwgImhhc0F0dHJpYnV0ZSIsICJnZXRBdHRyaWJ1dGUiLCAicG9saWN5TmFtZSIsICJjcmVhdGVIVE1MIiwgImNyZWF0ZVNjcmlwdFVSTCIsICJzY3JpcHRVcmwiLCAiXyIsICJjb25zb2xlIiwgIndhcm4iLCAiX2NyZWF0ZUhvb2tzTWFwIiwgImFmdGVyU2FuaXRpemVBdHRyaWJ1dGVzIiwgImFmdGVyU2FuaXRpemVFbGVtZW50cyIsICJhZnRlclNhbml0aXplU2hhZG93RE9NIiwgImJlZm9yZVNhbml0aXplQXR0cmlidXRlcyIsICJiZWZvcmVTYW5pdGl6ZUVsZW1lbnRzIiwgImJlZm9yZVNhbml0aXplU2hhZG93RE9NIiwgInVwb25TYW5pdGl6ZUF0dHJpYnV0ZSIsICJ1cG9uU2FuaXRpemVFbGVtZW50IiwgInVwb25TYW5pdGl6ZVNoYWRvd05vZGUiLCAiY3JlYXRlRE9NUHVyaWZ5IiwgInVuZGVmaW5lZCIsICJET01QdXJpZnkiLCAicm9vdCIsICJ2ZXJzaW9uIiwgIlZFUlNJT04iLCAicmVtb3ZlZCIsICJub2RlVHlwZSIsICJFbGVtZW50IiwgImlzU3VwcG9ydGVkIiwgIm9yaWdpbmFsRG9jdW1lbnQiLCAiY3VycmVudFNjcmlwdCIsICJEb2N1bWVudEZyYWdtZW50IiwgIkhUTUxUZW1wbGF0ZUVsZW1lbnQiLCAiTm9kZSIsICJOb2RlRmlsdGVyIiwgIk5hbWVkTm9kZU1hcCIsICJNb3pOYW1lZEF0dHJNYXAiLCAiSFRNTEZvcm1FbGVtZW50IiwgIkRPTVBhcnNlciIsICJFbGVtZW50UHJvdG90eXBlIiwgImNsb25lTm9kZSIsICJyZW1vdmUiLCAiZ2V0TmV4dFNpYmxpbmciLCAiZ2V0Q2hpbGROb2RlcyIsICJnZXRQYXJlbnROb2RlIiwgInRlbXBsYXRlIiwgImNyZWF0ZUVsZW1lbnQiLCAiY29udGVudCIsICJvd25lckRvY3VtZW50IiwgInRydXN0ZWRUeXBlc1BvbGljeSIsICJlbXB0eUhUTUwiLCAiaW1wbGVtZW50YXRpb24iLCAiY3JlYXRlTm9kZUl0ZXJhdG9yIiwgImNyZWF0ZURvY3VtZW50RnJhZ21lbnQiLCAiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCAiaW1wb3J0Tm9kZSIsICJob29rcyIsICJjcmVhdGVIVE1MRG9jdW1lbnQiLCAiRVhQUkVTU0lPTlMiLCAiQUxMT1dFRF9UQUdTIiwgIkRFRkFVTFRfQUxMT1dFRF9UQUdTIiwgIlRBR1MiLCAiQUxMT1dFRF9BVFRSIiwgIkRFRkFVTFRfQUxMT1dFRF9BVFRSIiwgIkFUVFJTIiwgIkNVU1RPTV9FTEVNRU5UX0hBTkRMSU5HIiwgInRhZ05hbWVDaGVjayIsICJ3cml0YWJsZSIsICJjb25maWd1cmFibGUiLCAiZW51bWVyYWJsZSIsICJhdHRyaWJ1dGVOYW1lQ2hlY2siLCAiYWxsb3dDdXN0b21pemVkQnVpbHRJbkVsZW1lbnRzIiwgIkZPUkJJRF9UQUdTIiwgIkZPUkJJRF9BVFRSIiwgIkVYVFJBX0VMRU1FTlRfSEFORExJTkciLCAidGFnQ2hlY2siLCAiYXR0cmlidXRlQ2hlY2siLCAiQUxMT1dfQVJJQV9BVFRSIiwgIkFMTE9XX0RBVEFfQVRUUiIsICJBTExPV19VTktOT1dOX1BST1RPQ09MUyIsICJBTExPV19TRUxGX0NMT1NFX0lOX0FUVFIiLCAiU0FGRV9GT1JfVEVNUExBVEVTIiwgIlNBRkVfRk9SX1hNTCIsICJXSE9MRV9ET0NVTUVOVCIsICJTRVRfQ09ORklHIiwgIkZPUkNFX0JPRFkiLCAiUkVUVVJOX0RPTSIsICJSRVRVUk5fRE9NX0ZSQUdNRU5UIiwgIlJFVFVSTl9UUlVTVEVEX1RZUEUiLCAiU0FOSVRJWkVfRE9NIiwgIlNBTklUSVpFX05BTUVEX1BST1BTIiwgIlNBTklUSVpFX05BTUVEX1BST1BTX1BSRUZJWCIsICJLRUVQX0NPTlRFTlQiLCAiSU5fUExBQ0UiLCAiVVNFX1BST0ZJTEVTIiwgIkZPUkJJRF9DT05URU5UUyIsICJERUZBVUxUX0ZPUkJJRF9DT05URU5UUyIsICJEQVRBX1VSSV9UQUdTIiwgIkRFRkFVTFRfREFUQV9VUklfVEFHUyIsICJVUklfU0FGRV9BVFRSSUJVVEVTIiwgIkRFRkFVTFRfVVJJX1NBRkVfQVRUUklCVVRFUyIsICJNQVRITUxfTkFNRVNQQUNFIiwgIlNWR19OQU1FU1BBQ0UiLCAiSFRNTF9OQU1FU1BBQ0UiLCAiTkFNRVNQQUNFIiwgIklTX0VNUFRZX0lOUFVUIiwgIkFMTE9XRURfTkFNRVNQQUNFUyIsICJERUZBVUxUX0FMTE9XRURfTkFNRVNQQUNFUyIsICJNQVRITUxfVEVYVF9JTlRFR1JBVElPTl9QT0lOVFMiLCAiSFRNTF9JTlRFR1JBVElPTl9QT0lOVFMiLCAiQ09NTU9OX1NWR19BTkRfSFRNTF9FTEVNRU5UUyIsICJQQVJTRVJfTUVESUFfVFlQRSIsICJTVVBQT1JURURfUEFSU0VSX01FRElBX1RZUEVTIiwgIkRFRkFVTFRfUEFSU0VSX01FRElBX1RZUEUiLCAiQ09ORklHIiwgImZvcm1FbGVtZW50IiwgImlzUmVnZXhPckZ1bmN0aW9uIiwgInRlc3RWYWx1ZSIsICJGdW5jdGlvbiIsICJfcGFyc2VDb25maWciLCAiY2ZnIiwgIkFERF9VUklfU0FGRV9BVFRSIiwgIkFERF9EQVRBX1VSSV9UQUdTIiwgIkFMTE9XRURfVVJJX1JFR0VYUCIsICJBRERfVEFHUyIsICJBRERfQVRUUiIsICJBRERfRk9SQklEX0NPTlRFTlRTIiwgInRhYmxlIiwgInRib2R5IiwgIlRSVVNURURfVFlQRVNfUE9MSUNZIiwgIkFMTF9TVkdfVEFHUyIsICJBTExfTUFUSE1MX1RBR1MiLCAiX2NoZWNrVmFsaWROYW1lc3BhY2UiLCAicGFyZW50IiwgInRhZ05hbWUiLCAibmFtZXNwYWNlVVJJIiwgInBhcmVudFRhZ05hbWUiLCAiQm9vbGVhbiIsICJfZm9yY2VSZW1vdmUiLCAibm9kZSIsICJyZW1vdmVDaGlsZCIsICJfcmVtb3ZlQXR0cmlidXRlIiwgIm5hbWUiLCAiZ2V0QXR0cmlidXRlTm9kZSIsICJmcm9tIiwgInJlbW92ZUF0dHJpYnV0ZSIsICJzZXRBdHRyaWJ1dGUiLCAiX2luaXREb2N1bWVudCIsICJkaXJ0eSIsICJkb2MiLCAibGVhZGluZ1doaXRlc3BhY2UiLCAibWF0Y2hlcyIsICJkaXJ0eVBheWxvYWQiLCAicGFyc2VGcm9tU3RyaW5nIiwgImRvY3VtZW50RWxlbWVudCIsICJjcmVhdGVEb2N1bWVudCIsICJpbm5lckhUTUwiLCAiYm9keSIsICJpbnNlcnRCZWZvcmUiLCAiY3JlYXRlVGV4dE5vZGUiLCAiY2hpbGROb2RlcyIsICJjYWxsIiwgIl9jcmVhdGVOb2RlSXRlcmF0b3IiLCAiU0hPV19FTEVNRU5UIiwgIlNIT1dfQ09NTUVOVCIsICJTSE9XX1RFWFQiLCAiU0hPV19QUk9DRVNTSU5HX0lOU1RSVUNUSU9OIiwgIlNIT1dfQ0RBVEFfU0VDVElPTiIsICJfaXNDbG9iYmVyZWQiLCAibm9kZU5hbWUiLCAidGV4dENvbnRlbnQiLCAiYXR0cmlidXRlcyIsICJoYXNDaGlsZE5vZGVzIiwgIl9pc05vZGUiLCAiX2V4ZWN1dGVIb29rcyIsICJjdXJyZW50Tm9kZSIsICJkYXRhIiwgImhvb2siLCAiX3Nhbml0aXplRWxlbWVudHMiLCAiYWxsb3dlZFRhZ3MiLCAiZmlyc3RFbGVtZW50Q2hpbGQiLCAiX2lzQmFzaWNDdXN0b21FbGVtZW50IiwgInBhcmVudE5vZGUiLCAiY2hpbGRDb3VudCIsICJpIiwgImNoaWxkQ2xvbmUiLCAiX19yZW1vdmFsQ291bnQiLCAiZXhwciIsICJfaXNWYWxpZEF0dHJpYnV0ZSIsICJsY1RhZyIsICJsY05hbWUiLCAiX3Nhbml0aXplQXR0cmlidXRlcyIsICJob29rRXZlbnQiLCAiYXR0ck5hbWUiLCAiYXR0clZhbHVlIiwgImtlZXBBdHRyIiwgImFsbG93ZWRBdHRyaWJ1dGVzIiwgImZvcmNlS2VlcEF0dHIiLCAiYXR0ciIsICJpbml0VmFsdWUiLCAiZ2V0QXR0cmlidXRlVHlwZSIsICJzZXRBdHRyaWJ1dGVOUyIsICJfc2FuaXRpemVTaGFkb3dET00iLCAiZnJhZ21lbnQiLCAic2hhZG93Tm9kZSIsICJzaGFkb3dJdGVyYXRvciIsICJuZXh0Tm9kZSIsICJzYW5pdGl6ZSIsICJpbXBvcnRlZE5vZGUiLCAicmV0dXJuTm9kZSIsICJhcHBlbmRDaGlsZCIsICJmaXJzdENoaWxkIiwgIm5vZGVJdGVyYXRvciIsICJzaGFkb3dyb290IiwgInNoYWRvd3Jvb3Rtb2RlIiwgInNlcmlhbGl6ZWRIVE1MIiwgIm91dGVySFRNTCIsICJkb2N0eXBlIiwgInNldENvbmZpZyIsICJjbGVhckNvbmZpZyIsICJpc1ZhbGlkQXR0cmlidXRlIiwgInRhZyIsICJhZGRIb29rIiwgImVudHJ5UG9pbnQiLCAiaG9va0Z1bmN0aW9uIiwgInJlbW92ZUhvb2siLCAicmVtb3ZlSG9va3MiLCAicmVtb3ZlQWxsSG9va3MiLCAibG9nIiwgInRleHQiLCAicG9wdWxhdGVKb2JUYWIiLCAiaHRtbCIsICJQSEFTRVMiLCAic2hvd0xvYWRKb2JQYW5lbCIsICJzdGF0ZU1hbmFnZXIiLCAiZXZlbnQiLCAibSIsICJ1IiwgIl9wcm9jZWVkQWZ0ZXJJbnRha2UiLCAiX3Nob3dJbnRha2VDb25maXJtQ2FyZCIsICJzZW5kTWVzc2FnZSIsICJsb2ciLCAiUkVUUllfUE9MSUNZX1NUT1JBR0VfS0VZIiwgInRleHQiLCAic2VuZE1lc3NhZ2UiLCAic3RhdGVNYW5hZ2VyIiwgImdldFNlc3Npb25JZEZyb21VUkwiLCAiX3Nob3dJbnRha2VDb25maXJtQ2FyZCIsICJfcHJvY2VlZEFmdGVySW50YWtlIiwgIl9lIiwgImFza1Bvc3RBbmFseXNpc1F1ZXN0aW9ucyIsICJoYW5kbGVRdWVzdGlvblJlc3BvbnNlIiwgInBvcHVsYXRlUXVlc3Rpb25zVGFiIiwgImxvZyIsICJhc2tQb3N0QW5hbHlzaXNRdWVzdGlvbnMiLCAicG9wdWxhdGVRdWVzdGlvbnNUYWIiLCAic3RhdGVNYW5hZ2VyIiwgInEiLCAiXyIsICJoYW5kbGVRdWVzdGlvblJlc3BvbnNlIiwgImJ1aWxkRXhwZXJpZW5jZVJldmlld1RhYmxlIiwgImhhbmRsZUV4cGVyaWVuY2VSZXNwb25zZSIsICJsb2ciLCAiX2ZpbmRFeHBlcmllbmNlUmVjb21tZW5kYXRpb25SZWNvcmQiLCAiXyIsICJidWlsZEV4cGVyaWVuY2VSZXZpZXdUYWJsZSIsICJiIiwgImhhbmRsZUV4cGVyaWVuY2VSZXNwb25zZSIsICJzdGF0ZU1hbmFnZXIiLCAiYnVpbGRTa2lsbHNSZXZpZXdUYWJsZSIsICJoYW5kbGVTa2lsbHNSZXNwb25zZSIsICJsb2ciLCAibSIsICJ4IiwgIm5hbWUiLCAic2tpbGwiLCAiXyIsICJidWlsZFNraWxsc1Jldmlld1RhYmxlIiwgInN0YXRlTWFuYWdlciIsICJiIiwgImUiLCAic2tpbGxOYW1lIiwgImhhbmRsZVNraWxsc1Jlc3BvbnNlIiwgIl9hY2hWZXJiV2FybmluZyIsICJidWlsZEFjaGlldmVtZW50c0VkaXRvciIsICJidWlsZEFjaGlldmVtZW50c1Jldmlld1RhYmxlIiwgImVudHJpZXMiLCAiXyIsICJidWlsZEFjaGlldmVtZW50c1Jldmlld1RhYmxlIiwgImIiLCAiaHRtbCIsICJrIiwgInYiLCAic3RhdGVNYW5hZ2VyIiwgImJ1aWxkQWNoaWV2ZW1lbnRzRWRpdG9yIiwgIl9hY2hWZXJiV2FybmluZyIsICJ0ZXh0IiwgIl9lIiwgImJ1aWxkVGFnbGluZVJldmlld1NlY3Rpb24iLCAiYnVpbGRUYWdsaW5lUmV2aWV3U2VjdGlvbiIsICJfZSIsICJzdGF0ZU1hbmFnZXIiLCAiYnVpbGRTdW1tYXJ5Rm9jdXNTZWN0aW9uIiwgImJ1aWxkU3VtbWFyeUZvY3VzU2VjdGlvbiIsICJrIiwgInRleHQiLCAidyIsICJzdGF0ZU1hbmFnZXIiLCAiYnVpbGRQdWJsaWNhdGlvbnNSZXZpZXdUYWJsZSIsICJsb2ciLCAiYnVpbGRQdWJsaWNhdGlvbnNSZXZpZXdUYWJsZSIsICJxIiwgImh0bWwiLCAiYnRuIiwgInN0YXRlTWFuYWdlciIsICJhcHBseVJld3JpdGVBY3Rpb24iLCAiZmV0Y2hBbmRSZXZpZXdSZXdyaXRlcyIsICJyZW5kZXJSZXdyaXRlUGFuZWwiLCAicmV3cml0ZURlY2lzaW9ucyIsICJzdWJtaXRSZXdyaXRlRGVjaXNpb25zIiwgInJld3JpdGVEZWNpc2lvbnMiLCAiXyIsICJmZXRjaEFuZFJldmlld1Jld3JpdGVzIiwgInJlbmRlclJld3JpdGVQYW5lbCIsICJ3IiwgImFwcGx5UmV3cml0ZUFjdGlvbiIsICJiIiwgIm0iLCAiaSIsICJqIiwgImsiLCAic3VibWl0UmV3cml0ZURlY2lzaW9ucyIsICJzdGF0ZU1hbmFnZXIiLCAicG9wdWxhdGVTcGVsbENoZWNrVGFiIiwgInN1Ym1pdFNwZWxsQ2hlY2tEZWNpc2lvbnMiLCAibG9nIiwgInBvcHVsYXRlU3BlbGxDaGVja1RhYiIsICJjb250ZW50IiwgInN0YXRlTWFuYWdlciIsICJodG1sIiwgImIiLCAiYXRzU2NvcmUiLCAiayIsICJzdWJtaXRTcGVsbENoZWNrRGVjaXNpb25zIiwgInBvcHVsYXRlRG93bmxvYWRUYWIiLCAibG9nIiwgImh0bWwiLCAiXyIsICJwb3B1bGF0ZURvd25sb2FkVGFiIiwgInN0YXRlTWFuYWdlciIsICJ3IiwgIm0iLCAiZmluYWxHZW5lcmF0aW9uQ29tcGxldGUiLCAibG9nIiwgImh0bWwiLCAiZmluYWxHZW5lcmF0aW9uQ29tcGxldGUiLCAic3RhdGVNYW5hZ2VyIiwgInJlbmRlck1hc3RlckRhdGFBaVVwZGF0ZURpc2FibGVkTm90ZSIsICJyZW5kZXJNYXN0ZXJEYXRhQWlVcGRhdGVQYW5lbCIsICJsb2ciLCAicmVuZGVyTWFzdGVyRGF0YUFpVXBkYXRlUGFuZWwiLCAicmVuZGVyTWFzdGVyRGF0YUFpVXBkYXRlRGlzYWJsZWROb3RlIiwgIm0iLCAiZXZlbnQiLCAib3Blbk1hc3RlckN2TW9kYWwiLCAicG9wdWxhdGVNYXN0ZXJUYWIiLCAicmVkb01hc3RlckRhdGFDaGFuZ2UiLCAidW5kb01hc3RlckRhdGFDaGFuZ2UiLCAieCIsICJ2IiwgInRleHQiLCAiayIsICJfIiwgInNlc3Npb25JZCIsICJldmVudCIsICJfcmVuZGVyQ29uc2lzdGVuY3lSZXBvcnQiLCAicG9wdWxhdGVDb3ZlckxldHRlclRhYiIsICJwb3B1bGF0ZUNvdmVyTGV0dGVyVGFiIiwgIl8iLCAidGV4dCIsICJfcmVuZGVyQ29uc2lzdGVuY3lSZXBvcnQiLCAic3RhdGVNYW5hZ2VyIiwgImsiLCAicmUiLCAicG9wdWxhdGVTY3JlZW5pbmdUYWIiLCAicSIsICJiIiwgIl8iLCAicG9wdWxhdGVGaW5hbGlzZVRhYiIsICJsb2ciLCAibSIsICJwb3B1bGF0ZUZpbmFsaXNlVGFiIiwgImh0bWwiLCAiX3JlbmRlclJld3JpdGVBdWRpdExvZyIsICJfIiwgImF0c1Njb3JlIiwgInBvcHVsYXRlSW50ZXJ2aWV3UHJlcFRhYiIsICJsb2ciLCAicG9wdWxhdGVJbnRlcnZpZXdQcmVwVGFiIiwgInBvcHVsYXRlVGhhbmtZb3VUYWIiLCAibG9nIiwgInBvcHVsYXRlVGhhbmtZb3VUYWIiLCAicG9wdWxhdGVIYXJ2ZXN0VGFiIiwgImxvZyIsICJiIiwgImsiLCAidiIsICJwb3B1bGF0ZUhhcnZlc3RUYWIiLCAiX3VwZGF0ZVNlc3Npb25Td2l0Y2hlckhlYWRlciIsICJvcGVuU2Vzc2lvbnNNb2RhbCIsICJzaG93T3duZXJzaGlwQ29uZmxpY3REaWFsb2ciLCAiXyIsICJfY3JlYXRlZElzb0Zyb21TZXNzaW9uUGF0aCIsICJiIiwgInYiLCAiZXZlbnQiLCAiZm10RGF0ZSIsICJodG1sIiwgImluaXRLZXlib2FyZFNob3J0Y3V0cyIsICJyZXNldENhcmRGb2N1cyIsICJzZXR1cEV2ZW50TGlzdGVuZXJzIiwgInRleHQiXQp9Cg== diff --git a/web/questions-panel.js b/web/questions-panel.js index 1325e0fe..5ac81200 100644 --- a/web/questions-panel.js +++ b/web/questions-panel.js @@ -180,9 +180,12 @@ function renderQuestionsPanel() { ? `Group ${_currentGroup + 1} of ${numGroups}` : `${total} question${total > 1 ? 's' : ''}`; + const groupNavHtml = numGroups > 1 ? renderQGroupNav(numGroups, qs, existingAnswers) : ''; + let panelHtml = `

💬 A few quick questions

-

${groupLabel} — answer each to continue.

`; +

${groupLabel} — answer each to continue.

+ ${groupNavHtml}`; groupQs.forEach((q, localIdx) => { const idx = groupStart + localIdx; @@ -230,8 +233,44 @@ function renderQuestionsPanel() { updateQProgress(); } -function advanceQGroup() { - // Flush current group's textarea values into window.questionAnswers before advancing. +// Group-navigation strip (GAP-16 Part D): lets the user jump back to an +// earlier group to review/edit it without losing forward progress. These +// are plain buttons, not an ARIA tablist — no arrow-key roving is implemented, +// so a tab/tablist role would set a false expectation for screen readers. +function _isGroupFullyAnswered(groupIdx, qs, existingAnswers) { + const groupStart = groupIdx * GROUP_SIZE; + const groupEnd = Math.min(groupStart + GROUP_SIZE, qs.length); + for (let idx = groupStart; idx < groupEnd; idx++) { + const q = qs[idx]; + if (!q) continue; + if (!(existingAnswers[q.type] || '').toString().trim()) return false; + } + return true; +} + +function renderQGroupNav(numGroups, qs, existingAnswers) { + const dots = []; + for (let i = 0; i < numGroups; i++) { + const isActive = i === _currentGroup; + const isDone = !isActive && _isGroupFullyAnswered(i, qs, existingAnswers); + const cls = ['q-group-dot']; + if (isActive) cls.push('active'); + if (isDone) cls.push('done'); + const stateLabel = isActive ? 'current' : isDone ? 'completed' : 'not yet answered'; + const ariaLabel = `Review answers for Group ${i + 1}, ${stateLabel} — no resubmission`; + dots.push( + `` + ); + } + return `
${dots.join('')}
`; +} + +// Flush the current group's textarea values into window.questionAnswers. +// Shared by advanceQGroup() (forward progression) and jumpToQGroup() +// (backward navigation) so both persist in-progress edits the same way. +function _flushCurrentGroupAnswers() { const qs = window.postAnalysisQuestions || []; const groupStart = _currentGroup * GROUP_SIZE; const groupEnd = Math.min(groupStart + GROUP_SIZE, qs.length); @@ -243,11 +282,26 @@ function advanceQGroup() { window.questionAnswers[q.type] = ta.value.trim(); } } +} + +function advanceQGroup() { + _flushCurrentGroupAnswers(); persistPostAnalysisState(); _currentGroup++; renderQuestionsPanel(); } +// Jump back (or forward) to a specific group without requiring the current +// group to be complete. Flushes in-progress answers first so nothing typed +// so far is lost, but — unlike advanceQGroup() — does not gate on completeness +// and does not resubmit anything. +function jumpToQGroup(targetGroup) { + _flushCurrentGroupAnswers(); + persistPostAnalysisState(); + _currentGroup = targetGroup; + renderQuestionsPanel(); +} + // --------------------------------------------------------------------------- // Interaction handlers // --------------------------------------------------------------------------- @@ -482,4 +536,6 @@ export { showNextQuestion, handleQuestionResponse, finishPostAnalysisQuestions, + advanceQGroup, + jumpToQGroup, }; diff --git a/web/styles.css b/web/styles.css index f0f4e0ff..a4af60f5 100644 --- a/web/styles.css +++ b/web/styles.css @@ -544,6 +544,16 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sa .questions-panel { background: var(--cv-white); border: 1px solid var(--cv-border); border-radius: 10px; padding: 20px; margin-top: 20px; } .questions-panel h2 { margin: 0 0 4px; font-size: 16px; font-weight: 700; color: var(--cv-text-primary); } .questions-panel .q-progress { font-size: 13px; color: var(--cv-text-secondary); margin-bottom: 16px; } +.q-group-nav { display: flex; gap: 6px; margin: -8px 0 16px; } +.q-group-dot { + width: 24px; height: 24px; border-radius: 50%; border: 1px solid var(--cv-border); + background: var(--cv-white); color: var(--cv-text-secondary); font-size: 11px; font-weight: 700; + cursor: pointer; display: flex; align-items: center; justify-content: center; padding: 0; +} +.q-group-dot:hover { border-color: var(--cv-accent); } +.q-group-dot:focus-visible { outline: 2px solid var(--cv-accent); outline-offset: 2px; } +.q-group-dot.active { background: var(--cv-accent); border-color: var(--cv-accent); color: var(--cv-white); } +.q-group-dot.done { background: var(--cv-success-bg); border-color: var(--cv-success-border); color: var(--cv-success-text); border-style: dashed; } .question-item { margin-bottom: 20px; padding-bottom: 20px; border-bottom: 1px solid var(--cv-bg-subtle); } .question-item:last-child { border-bottom: none; margin-bottom: 0; padding-bottom: 0; } .question-item.answered { background: #f8fffe; border-left: 3px solid var(--cv-success); padding-left: 12px; border-radius: 4px; } From cdd2a409007726ff50842d0f18c13a5ff28efdb2 Mon Sep 17 00:00:00 2001 From: "Gregory R. Warnes" Date: Sat, 4 Jul 2026 14:35:58 -0400 Subject: [PATCH 2/9] =?UTF-8?q?feat(ux):=20make=20workflow-step=20?= =?UTF-8?q?=E2=86=94=20tab-bar=20relationship=20visible=20(GAP-16=20Part?= =?UTF-8?q?=20A)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds a small "Now viewing: {step}" label above the tab bar, sourced from the existing _STEP_DISPLAY map, so users can see which workflow step's sub-tabs are currently shown after a step click silently filters the tab bar (STAGE_TABS/updateTabBarForStage already did this filtering correctly, just invisibly). Screen-reader announcement is combined into the single existing #workflow-stage-announcer write in switchTab() (stage + tab in one message) rather than adding a second live region, avoiding a double- announce on every navigation. Also fixes a real terminology inconsistency this label would otherwise have propagated: _STEP_DISPLAY.customizations read "Customisations" while the step pill itself reads "Customise" (already flagged in tasks/ui-review.md's H4 finding). Normalized to "Customise" everywhere, including two matching strings in download-tab.js's "Refine Customisations" button. Co-Authored-By: Claude Sonnet 5 --- tests/js/review-table-base.test.js | 24 + tests/js/ui-core.test.js | 38 + web/bundle.js | 6753 ++++++++++++++-------------- web/download-tab.js | 4 +- web/index.html | 1 + web/review-table-base.js | 20 +- web/styles.css | 6 + web/ui-core.js | 11 + web/workflow-steps.js | 2 +- 9 files changed, 3479 insertions(+), 3380 deletions(-) diff --git a/tests/js/review-table-base.test.js b/tests/js/review-table-base.test.js index 143f4bad..80bd404a 100644 --- a/tests/js/review-table-base.test.js +++ b/tests/js/review-table-base.test.js @@ -179,6 +179,30 @@ describe('switchTab', () => { expect(globalThis.updateActionButtons).toHaveBeenCalledWith('layout') }) + it('announces a single combined stage + tab message (GAP-16 Part A) instead of two separate live-region writes', () => { + vi.useFakeTimers() + document.body.innerHTML += '
' + globalThis.getStageForTab.mockReturnValue('job') + + switchTab('analysis') + vi.advanceTimersByTime(60) + + expect(document.getElementById('workflow-stage-announcer').textContent).toBe('Now viewing: Job Input — Analysis') + vi.useRealTimers() + }) + + it('falls back to a tab-only announcement when no stage is resolved for the tab', () => { + vi.useFakeTimers() + document.body.innerHTML += '
' + globalThis.getStageForTab.mockReturnValue(null) + + switchTab('analysis') + vi.advanceTimersByTime(60) + + expect(document.getElementById('workflow-stage-announcer').textContent).toBe('Now viewing: Analysis') + vi.useRealTimers() + }) + it('adds full-width class for non-generate tabs', () => { switchTab('analysis') expect(document.getElementById('document-content').classList.contains('full-width')).toBe(true) diff --git a/tests/js/ui-core.test.js b/tests/js/ui-core.test.js index c4de3093..54b61e69 100644 --- a/tests/js/ui-core.test.js +++ b/tests/js/ui-core.test.js @@ -113,6 +113,44 @@ describe('toggleChat', () => { // loadTabContent lives in web/review-table-base.js — see tests/js/review-table-base.test.js // (ui-core.js's copy was dead/superseded; see its header comment.) +describe('updateTabBarForStage — tab-stage-label (GAP-16 Part A)', () => { + function buildTabBarFixture() { + document.body.innerHTML = ` +
+
+ +
+
+
+
+ +
` + } + + it('sets the label text from _STEP_DISPLAY for the given stage', () => { + buildTabBarFixture() + mod.updateTabBarForStage('customizations') + expect(document.getElementById('tab-stage-label').textContent).toBe('Now viewing: Customise') + }) + + it('updates the label again on a subsequent call with a different stage', () => { + buildTabBarFixture() + mod.updateTabBarForStage('customizations') + mod.updateTabBarForStage('job') + expect(document.getElementById('tab-stage-label').textContent).toBe('Now viewing: Job Input') + }) + + it('does not throw when #tab-stage-label is absent from the DOM', () => { + document.body.innerHTML = ` +
+ +
+ +
` + expect(() => mod.updateTabBarForStage('customizations')).not.toThrow() + }) +}) + describe('openModelModal', () => { function buildModelFixture() { document.body.innerHTML = ` diff --git a/web/bundle.js b/web/bundle.js index 763c7dd3..e6b54548 100644 --- a/web/bundle.js +++ b/web/bundle.js @@ -1446,3644 +1446,3655 @@ trapFocus: () => trapFocus2, updateTabBarForStage: () => updateTabBarForStage2 }); - var log3 = getLogger("ui-core"); - var _focusStack = []; - var _focusTrapStack = []; - var _settingsData = null; - var RETRY_POLICY_STORAGE_KEY = "cv-builder-retry-policy"; - function _getRetryPolicyFromStorage() { - const defaults = { - baseMs: 1500, - capMs: 6e4, - maxAttempts: 6, - autoRetry: true - }; - try { - const raw = localStorage.getItem(RETRY_POLICY_STORAGE_KEY); - if (!raw) return defaults; - const parsed = JSON.parse(raw); - return { - baseMs: Math.max(200, Number(parsed.baseMs || defaults.baseMs)), - capMs: Math.max(1e3, Number(parsed.capMs || defaults.capMs)), - maxAttempts: Math.max(1, Number(parsed.maxAttempts || defaults.maxAttempts)), - autoRetry: parsed.autoRetry !== false - }; - } catch { - return defaults; - } + + // web/workflow-steps.js + var workflow_steps_exports = {}; + __export(workflow_steps_exports, { + _ACTION_LABELS: () => _ACTION_LABELS, + _STEP_DISPLAY: () => _STEP_DISPLAY, + _STEP_ORDER: () => _STEP_ORDER, + _applyBulletOrder: () => _applyBulletOrder, + _executeReRunPhase: () => _executeReRunPhase, + _getStepTooltip: () => _getStepTooltip, + _highlightChangedItems: () => _highlightChangedItems, + _markChanged: () => _markChanged, + _showAnalysisClarificationAmendModal: () => _showAnalysisClarificationAmendModal, + _showReRunConfirmModal: () => _showReRunConfirmModal, + _updateBulletArrows: () => _updateBulletArrows, + _updateViewingIndicator: () => _updateViewingIndicator2, + applyDirtyPhaseNavigationState: () => applyDirtyPhaseNavigationState, + applyLayoutFreshnessNavigationState: () => applyLayoutFreshnessNavigationState, + backToPhase: () => backToPhase, + confirmReRunPhase: () => confirmReRunPhase2, + handleStepClick: () => handleStepClick, + moveBullet: () => moveBullet, + reRunPhase: () => reRunPhase, + resetBulletOrder: () => resetBulletOrder, + saveBulletOrder: () => saveBulletOrder, + showBulletReorder: () => showBulletReorder2, + updateWorkflowSteps: () => updateWorkflowSteps + }); + var log3 = getLogger("workflow-steps"); + function _findExperienceRecommendationRecord(expId) { + const data = globalThis.window?.pendingRecommendations; + if (!data || !Array.isArray(data.experience_recommendations)) return null; + return data.experience_recommendations.find((rec) => String(rec?.id || rec?.experience_id || "") === String(expId)) || null; } - function _saveRetryPolicyToStorage(policy) { - try { - localStorage.setItem(RETRY_POLICY_STORAGE_KEY, JSON.stringify(policy)); - } catch (error) { - log3.warn("Could not save retry policy preference:", error); + var _STEP_ORDER = [ + "job", + "analysis", + "customizations", + "rewrite", + "spell", + "layout", + "download", + "cover_letter", + "screening", + "interview_prep", + "thank_you", + "harvest" + ]; + var _STEP_DISPLAY = { + job: "Job Input", + analysis: "Job Analysis", + customizations: "Customise", + rewrite: "Rewrite Review", + spell: "Spell Check", + layout: "Layout Review", + download: "File Review", + cover_letter: "Cover Letter", + screening: "Screening", + interview_prep: "Interview Prep", + thank_you: "Thank You", + harvest: "Harvest" + }; + var _ACTION_LABELS = { + recommend_customizations: "Selecting experiences & skills\u2026", + generate_cv: "Generating CV\u2026" + }; + var _NAV_TAB_LABELS = { + download: "\u2B07\uFE0F File Review" + }; + function applyLayoutFreshnessNavigationState() { + const freshness = stateManager2.getLayoutFreshness(); + const generationState2 = stateManager2.getGenerationState(); + const layoutStep = document.getElementById("step-layout"); + if (layoutStep) { + layoutStep.classList.remove("stale", "stale-critical"); + const rerun = layoutStep.querySelector(".step-rerun")?.outerHTML || ""; + const refineBadge = layoutStep.querySelector(".step-inline-badge")?.outerHTML || ""; + const staleBadge = freshness.isStale ? ' Outdated' : ""; + if (freshness.isStale) { + layoutStep.classList.add("stale"); + if (freshness.isCritical) layoutStep.classList.add("stale-critical"); + } + layoutStep.innerHTML = `\u{1F3A8} Layout Review${staleBadge}${refineBadge ? ` ${refineBadge}` : ""}${rerun ? ` ${rerun}` : ""}`; } + const showDownstreamBadge = freshness.isStale && Boolean( + generationState2.finalGeneratedAt || generationState2.phase === "final_complete" + ); + Object.entries(_NAV_TAB_LABELS).forEach(([tab, label]) => { + const tabEl = document.getElementById(`tab-${tab}`); + if (!tabEl) return; + tabEl.classList.remove("tab-stale", "tab-stale-critical"); + if (showDownstreamBadge) { + tabEl.classList.add("tab-stale"); + if (freshness.isCritical) tabEl.classList.add("tab-stale-critical"); + tabEl.innerHTML = `${label} Outdated`; + } else { + tabEl.textContent = label; + } + }); } - function _settingsSourceLabel(meta, key, runtimeOverrides = null) { - if (runtimeOverrides && key in runtimeOverrides) { - return "Source: runtime selection"; + async function backToPhase(step, feedback) { + try { + const body = feedback ? { phase: step, feedback } : { phase: step }; + const res = await fetch("/api/back-to-phase", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(body) + }); + const data = await res.json(); + if (!res.ok || !data.ok) { + appendRetryMessage("\u26A0 Could not navigate back: " + (data.error || "Unknown error"), () => backToPhase(step, feedback)); + return; + } + appendMessage("assistant", `\u21BB Navigating back to ${step}. Prior decisions and approvals are preserved.`); + if (feedback) appendMessage("system", `Refinement feedback queued: "${feedback}"`); + await fetchStatus(); + const tabMap = { + job: null, + analysis: "analysis", + customizations: "goals", + rewrite: "rewrite", + spell: "spell" + }; + const resolvedTab = tabMap[step] || tabMap[data.phase] || null; + if (resolvedTab) switchTab(resolvedTab); + } catch (err) { + appendRetryMessage("\u26A0 Network error in backToPhase: " + err.message, () => backToPhase(step)); } - const source = meta?.sources?.[key] || "default"; - const envKey = meta?.env_keys?.[key] || null; - if (source === "env") return `Source: environment variable (${envKey || "locked"})`; - if (source === "dotenv") return `Source: .env (${envKey || "locked"})`; - if (source === "config") return "Source: config.yaml"; - return "Source: built-in default"; } - function _renderSettingsSources(meta, runtimeOverrides = null) { - const sourceTargets = [ - "llm.default_provider", - "llm.default_model", - "llm.request_timeout_seconds", - "llm.temperature", - "generation.max_skills", - "generation.max_achievements", - "generation.max_publications", - "generation.skills_section_title", - "generation.formats.ats_docx", - "generation.formats.human_pdf", - "generation.formats.human_docx" - ]; - sourceTargets.forEach((key) => { - const el = document.getElementById(`source-${key}`); - if (!el) return; - el.textContent = _settingsSourceLabel(meta, key, runtimeOverrides); - const runtimeKey = runtimeOverrides && key in runtimeOverrides; - const isLocked = Boolean(meta?.locked?.[key]); - el.style.color = runtimeKey ? "#1e40af" : isLocked ? "#b45309" : "#64748b"; + function _showReRunConfirmModal(step, mode, onConfirm) { + const stepIdx = _STEP_ORDER.indexOf(step); + const downstream = _STEP_ORDER.slice(stepIdx + 1).filter((s) => { + const el = document.getElementById(`step-${s}`); + return el && el.classList.contains("completed"); + }); + const stepLabel = _STEP_DISPLAY[step] || step; + const title = mode === "rerun" ? `\u21BB Re-run ${stepLabel}?` : `\u2190 Navigate back to ${stepLabel}?`; + const bodyText = mode === "rerun" ? "The following stages will see updated inputs and may show changed recommendations:" : "You are navigating back past the following completed stages:"; + const note = "All existing approvals and rewrites are preserved as context."; + const listHtml = downstream.map((s) => `
  • ${_STEP_DISPLAY[s] || s}
  • `).join(""); + const overlay = document.createElement("div"); + overlay.id = "rerun-confirm-overlay"; + overlay.style.cssText = `position:fixed;inset:0;background:rgba(0,0,0,0.5); + z-index:10000;display:flex;align-items:center;justify-content:center;`; + overlay.innerHTML = ` +
    +

    + ${escapeHtml(title)}

    +

    ${escapeHtml(bodyText)}

    +
      ${listHtml}
    +

    ${escapeHtml(note)}

    +
    + + +
    +
    `; + document.body.appendChild(overlay); + _focusedElementBeforeModal = document.activeElement; + if (typeof trapFocus === "function") trapFocus("rerun-confirm-overlay"); + document.getElementById("rerun-proceed-btn").focus(); + const close = () => { + overlay.remove(); + restoreFocus(); + }; + document.getElementById("rerun-cancel-btn").addEventListener("click", close); + document.getElementById("rerun-proceed-btn").addEventListener("click", () => { + close(); + onConfirm(); + }); + overlay.addEventListener("click", (e) => { + if (e.target === overlay) close(); + }); + overlay.addEventListener("keydown", (e) => { + if (e.key === "Escape") close(); }); } - function _setSettingsStatus(message, kind = "info") { - const el = document.getElementById("settings-status-msg"); - if (!el) return; - el.style.display = ""; - if (kind === "success") { - el.style.background = "#ecfdf5"; - el.style.border = "1px solid #86efac"; - el.style.color = "#166534"; - } else if (kind === "error") { - el.style.background = "#fef2f2"; - el.style.border = "1px solid #fecaca"; - el.style.color = "#991b1b"; - } else { - el.style.background = "#eff6ff"; - el.style.border = "1px solid #bfdbfe"; - el.style.color = "#1e40af"; - } - el.textContent = message; + function confirmReRunPhase2(step) { + _showReRunConfirmModal(step, "rerun", () => backToPhase(step)); } - function _collectSettingsPayloadFromForm() { - return { - llm: { - default_provider: document.getElementById("settings-llm-default-provider")?.value?.trim() || null, - default_model: document.getElementById("settings-llm-default-model")?.value?.trim() || null, - request_timeout_seconds: Number(document.getElementById("settings-llm-request-timeout")?.value || 120), - temperature: Number(document.getElementById("settings-llm-temperature")?.value || 0.7) - }, - generation: { - max_skills: Number(document.getElementById("settings-gen-max-skills")?.value || 20), - max_achievements: Number(document.getElementById("settings-gen-max-achievements")?.value || 5), - max_publications: Number(document.getElementById("settings-gen-max-publications")?.value || 10), - skills_section_title: document.getElementById("settings-gen-skills-title")?.value?.trim() || "Skills", - formats: { - ats_docx: Boolean(document.getElementById("settings-format-ats-docx")?.checked), - human_pdf: Boolean(document.getElementById("settings-format-human-pdf")?.checked), - human_docx: Boolean(document.getElementById("settings-format-human-docx")?.checked) - }, - ai_attribution: Boolean(document.getElementById("settings-gen-ai-attribution")?.checked) - } - }; - } - function _collectRetryPolicyFromForm() { - return { - baseMs: Number(document.getElementById("settings-retry-base-ms")?.value || 1500), - capMs: Number(document.getElementById("settings-retry-cap-ms")?.value || 6e4), - maxAttempts: Number(document.getElementById("settings-retry-max-attempts")?.value || 6), - autoRetry: Boolean(document.getElementById("settings-retry-auto")?.checked) - }; + function _getStepTooltip(step, isActive, isViewing, isBrowsingAway, isCompleted, isStale, isStaleCritical) { + if (isStaleCritical) return isViewing ? "Critical changes \u2014 review required. Click \u21BB to rerun." : "Critical changes \u2014 review required."; + if (isStale) return isViewing ? "Results may be outdated. Click \u21BB to rerun." : "Results may be outdated."; + if (isBrowsingAway) return "Active step \u2014 click to return"; + if (isActive && isViewing) return "Current step"; + if (isCompleted && isViewing) return "Click \u21BB to rerun from here"; + if (isCompleted) return "Click to view"; + return ""; } - function _renderSettingsToForm(payload) { - const settings = payload?.settings || {}; - const llm = settings.llm || {}; - const generation = settings.generation || {}; - const formats = generation.formats || {}; - const runtimeProvider = payload?.runtime?.llm?.provider || null; - const runtimeModel = payload?.runtime?.llm?.model || null; - const runtimeOverrides = {}; - if (runtimeProvider) runtimeOverrides["llm.default_provider"] = runtimeProvider; - if (runtimeModel) runtimeOverrides["llm.default_model"] = runtimeModel; - const setValue = (id, value) => { - const el = document.getElementById(id); - if (el) el.value = value ?? ""; - }; - const setChecked = (id, value) => { - const el = document.getElementById(id); - if (el) el.checked = Boolean(value); + function _updateViewingIndicator2(tabName) { + const tabToStep = { + "job": "job", + "analysis": "analysis", + "questions": "analysis", + "exp-review": "customizations", + "rewrite": "rewrite", + "spell": "spell", + "layout": "layout", + "final_generate": "download", + "download": "download", + "cover-letter": "cover_letter", + "screening": "screening", + "interview-prep": "interview_prep", + "thank-you": "thank_you", + "harvest": "harvest" }; - setValue("settings-llm-default-provider", runtimeProvider || llm.default_provider || ""); - setValue("settings-llm-default-model", runtimeModel || llm.default_model || ""); - setValue("settings-llm-request-timeout", llm.request_timeout_seconds ?? 120); - setValue("settings-llm-temperature", llm.temperature ?? 0.7); - setValue("settings-gen-max-skills", generation.max_skills ?? 20); - setValue("settings-gen-max-achievements", generation.max_achievements ?? 5); - setValue("settings-gen-max-publications", generation.max_publications ?? 10); - setValue("settings-gen-skills-title", generation.skills_section_title || "Skills"); - setChecked("settings-format-ats-docx", formats.ats_docx); - setChecked("settings-format-human-pdf", formats.human_pdf); - setChecked("settings-format-human-docx", formats.human_docx); - setChecked("settings-gen-ai-attribution", generation.ai_attribution); - const retryPolicy = _getRetryPolicyFromStorage(); - setValue("settings-retry-base-ms", retryPolicy.baseMs); - setValue("settings-retry-cap-ms", retryPolicy.capMs); - setValue("settings-retry-max-attempts", retryPolicy.maxAttempts); - setChecked("settings-retry-auto", retryPolicy.autoRetry); - _renderSettingsSources(payload.meta || {}, runtimeOverrides); - const pathEl = document.getElementById("settings-config-path"); - if (pathEl) { - pathEl.textContent = payload?.meta?.config_path ? `Config file: ${payload.meta.config_path}` : ""; - } + const viewedStep = tabToStep[tabName] || null; + let activeStep = null; + _STEP_ORDER.forEach((step) => { + const el = document.getElementById(`step-${step}`); + if (el && el.classList.contains("active")) activeStep = step; + }); + _STEP_ORDER.forEach((step) => { + const el = document.getElementById(`step-${step}`); + if (!el) return; + const isViewing = step === viewedStep; + const isActive = step === activeStep; + const isBrowsingAway = isActive && !!viewedStep && viewedStep !== activeStep; + const isCompleted = el.classList.contains("completed"); + const isStale = el.classList.contains("stale"); + const isStaleCritical = el.classList.contains("stale-critical"); + el.classList.toggle("viewing", isViewing); + el.classList.toggle("browsing-away", isBrowsingAway); + const tooltipText = _getStepTooltip(step, isActive, isViewing, isBrowsingAway, isCompleted, isStale, isStaleCritical); + if (tooltipText) { + el.setAttribute("data-bs-toggle", "tooltip"); + el.setAttribute("data-bs-placement", "bottom"); + el.setAttribute("data-bs-title", tooltipText); + if (typeof bootstrap !== "undefined") { + const tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.setContent({ ".tooltip-inner": tooltipText }); + else new bootstrap.Tooltip(el); + } + } else { + el.removeAttribute("data-bs-toggle"); + el.removeAttribute("data-bs-title"); + if (typeof bootstrap !== "undefined") { + const tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + } + } + }); } - async function reloadSettingsModal() { - try { - _setSettingsStatus("Loading settings...", "info"); - const [result, status] = await Promise.all([fetchSettings(), fetchStatus2().catch(() => null)]); - _renderSettingsToForm(result); - const attrEl = document.getElementById("settings-gen-ai-attribution"); - if (attrEl && status) attrEl.checked = Boolean(status.ai_attribution); - _setSettingsStatus("Settings loaded.", "success"); - } catch (error) { - _setSettingsStatus(`Failed to load settings: ${error.message || error}`, "error"); + async function _showAnalysisClarificationAmendModal(onProceed) { + const questions = window.postAnalysisQuestions || []; + const answers = window.questionAnswers || {}; + if (!questions.length) { + await onProceed(); + return; } - } - async function saveSettingsModal() { - const saveBtn = document.getElementById("settings-save-btn"); - try { - if (saveBtn) { - saveBtn.disabled = true; - saveBtn.textContent = "Saving..."; + const overlay = document.createElement("div"); + overlay.id = "clar-amend-overlay"; + overlay.style.cssText = "position:fixed;inset:0;background:rgba(0,0,0,0.5);z-index:10000;display:flex;align-items:center;justify-content:center;overflow-y:auto;"; + const formRows = questions.map((q2, i) => { + const qtype = q2.type || `clarification_${i + 1}`; + const qtext = escapeHtml(q2.question || ""); + const curAns = escapeHtml(answers[qtype] || ""); + const choices = Array.isArray(q2.choices) ? q2.choices : []; + if (choices.length) { + const radios = choices.map((c) => ` + `).join(""); + return ` +
    + + ${radios} +
    `; } - _setSettingsStatus("Saving settings...", "info"); - const payload = _collectSettingsPayloadFromForm(); - const aiAttribution = Boolean(payload.generation?.ai_attribution); - const result = await updateSettings(payload); - _saveRetryPolicyToStorage(_collectRetryPolicyFromForm()); - _settingsData = result; - _renderSettingsToForm(result); + return ` +
    + + +
    `; + }).join(""); + overlay.innerHTML = ` +
    +

    \u21BB Amend Clarification Answers

    +

    + Update your answers before rerunning analysis, or keep them as-is. +

    +
    + ${formRows} +
    +
    + + + +
    +
    `; + document.body.appendChild(overlay); + if (typeof _focusedElementBeforeModal !== "undefined") window._focusedElementBeforeModal = document.activeElement; + if (typeof trapFocus === "function") trapFocus("clar-amend-overlay"); + overlay.querySelector("#clar-amend-save").focus(); + function closeModal2() { + overlay.remove(); + if (typeof restoreFocus === "function") restoreFocus(); + } + overlay.querySelector("#clar-amend-cancel").addEventListener("click", closeModal2); + overlay.addEventListener("click", (e) => { + if (e.target === overlay) closeModal2(); + }); + overlay.addEventListener("keydown", (e) => { + if (e.key === "Escape") closeModal2(); + }); + overlay.querySelector("#clar-amend-keep").addEventListener("click", () => { + closeModal2(); + onProceed(); + }); + overlay.querySelector("#clar-amend-save").addEventListener("click", async () => { + const form = document.getElementById("clar-amend-form"); + const updated = {}; + questions.forEach((q2, i) => { + const qtype = q2.type || `clarification_${i + 1}`; + const el = form.querySelector(`[name="clar-${qtype}"]`); + if (!el) return; + if (el.type === "radio") { + const checked = form.querySelector(`[name="clar-${qtype}"]:checked`); + if (checked) updated[qtype] = checked.value; + } else { + const val = el.value.trim(); + if (val) updated[qtype] = val; + } + }); + closeModal2(); try { - await apiCall2("POST", "/api/generation-settings", { ai_attribution: aiAttribution }); - } catch (_2) { - } - _setSettingsStatus("Settings saved successfully.", "success"); - } catch (error) { - _setSettingsStatus(`Failed to save settings: ${error.message || error}`, "error"); - } finally { - if (saveBtn) { - saveBtn.disabled = false; - saveBtn.textContent = "Save Settings"; + await fetch("/api/post-analysis-responses", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ questions, answers: updated }) + }); + window.questionAnswers = updated; + } catch (_e2) { } + await onProceed(); + }); + } + async function reRunPhase(step) { + if (step === "analysis") { + await _showAnalysisClarificationAmendModal(() => _executeReRunPhase("analysis")); + return; } + await _executeReRunPhase(step); } - async function openSettingsModal() { - const overlay = document.getElementById("settings-modal-overlay"); - if (!overlay) return; - overlay.style.display = "flex"; - _focusStack.push(document.activeElement); - setInitialFocus2("settings-modal-overlay"); - trapFocus2("settings-modal-overlay"); - await reloadSettingsModal(); - } - function closeSettingsModal() { - const overlay = document.getElementById("settings-modal-overlay"); - if (overlay) overlay.style.display = "none"; - restoreFocus2(); - } - function getFocusableElements(container) { - const focusableSelectors = [ - "a[href]", - "button:not([disabled])", - "input:not([disabled])", - "textarea:not([disabled])", - "select:not([disabled])", - '[tabindex]:not([tabindex="-1"])' - ].join(", "); - return Array.from(container.querySelectorAll(focusableSelectors)); - } - function setInitialFocus2(modalId) { - const modal = document.getElementById(modalId); - if (!modal) return; - const focusTarget = modal.querySelector('[data-focus-target="true"]') || modal.querySelector('input[type="text"]') || modal.querySelector("button"); - if (focusTarget) { - setTimeout(() => focusTarget.focus(), 50); + async function _executeReRunPhase(step) { + const loadingMsg = appendLoadingMessage(`\u21BB Re-running ${step}\u2026`); + setLoading(true, `Re-running ${step}\u2026`); + try { + const res = await fetch("/api/re-run-phase", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ phase: step }) + }); + const data = await res.json(); + removeLoadingMessage(loadingMsg); + setLoading(false); + if (!res.ok || !data.ok) { + appendRetryMessage("\u26A0 Re-run failed: " + (data.error || "Unknown error"), () => reRunPhase(step)); + return; + } + appendMessage("assistant", `\u2705 ${step} re-run complete. Review the updated results \u2014 changed items are highlighted.`); + await fetchStatus(); + if (step === "spell") window._spellCheckCache = null; + if (step === "rewrite") window._rewritePanelCache = null; + const tabMap = { + analysis: "analysis", + customizations: "goals", + rewrite: "rewrite", + spell: "spell" + }; + if (tabMap[step]) switchTab(tabMap[step]); + if (data.prior_output && data.new_output) { + setTimeout(() => _highlightChangedItems(step, data.prior_output, data.new_output), 300); + } + } catch (err) { + removeLoadingMessage(loadingMsg); + setLoading(false); + appendRetryMessage("\u26A0 Network error in reRunPhase: " + err.message, () => reRunPhase(step)); } } - function trapFocus2(modalId) { - const modal = document.getElementById(modalId); - if (!modal) return; - const focusableElements = getFocusableElements(modal); - if (focusableElements.length === 0) return; - const firstElement = focusableElements[0]; - const lastElement = focusableElements[focusableElements.length - 1]; - const listener = (e) => { - if (e.key !== "Tab") return; - const isShift = e.shiftKey; - const activeEl = document.activeElement; - if (isShift) { - if (activeEl === firstElement) { - e.preventDefault(); - lastElement.focus(); + function _highlightChangedItems(step, priorOutput, newOutput) { + if (step === "rewrite") { + const priorIds = new Set((priorOutput.pending_rewrites || []).map((r) => String(r.id))); + const newItems = newOutput.pending_rewrites || []; + for (const item of newItems) { + const id = String(item.id || ""); + const cardId = id.replace(/[^a-zA-Z0-9_-]/g, "_"); + const el = document.getElementById(`rw-card-${cardId}`); + if (!el) continue; + const isNew = !priorIds.has(id); + const priorItem = (priorOutput.pending_rewrites || []).find((r) => String(r.id) === id); + const changed = isNew || priorItem && priorItem.proposed !== item.proposed; + if (changed) _markChanged(el); + } + return; + } + if (step === "customizations") { + const priorExpIds = new Set( + (priorOutput.customizations?.experience_recommendations || []).map((r) => String(r.id)) + ); + const newExpRecs = newOutput.customizations?.experience_recommendations || []; + for (const rec of newExpRecs) { + const id = String(rec.id || ""); + const el = document.querySelector(`tr[data-exp-id="${CSS.escape(id)}"]`); + if (!el) continue; + const prior = (priorOutput.customizations?.experience_recommendations || []).find((r) => String(r.id) === id); + if (!priorExpIds.has(id) || prior && prior.recommendation !== rec.recommendation) { + _markChanged(el); } - } else { - if (activeEl === lastElement) { - e.preventDefault(); - firstElement.focus(); + } + const priorSkills = new Set( + (priorOutput.customizations?.skill_recommendations || []).map((r) => (r.skill || "").toLowerCase()) + ); + const newSkillRecs = newOutput.customizations?.skill_recommendations || []; + for (const rec of newSkillRecs) { + const name = (rec.skill || "").toLowerCase(); + const el = document.querySelector(`tr[data-skill="${CSS.escape(name)}"]`); + if (!el) continue; + const prior = (priorOutput.customizations?.skill_recommendations || []).find( + (r) => (r.skill || "").toLowerCase() === name + ); + if (!priorSkills.has(name) || prior && prior.recommendation !== rec.recommendation) { + _markChanged(el); } } - }; - document.addEventListener("keydown", listener); - _focusTrapStack.push(listener); - } - function restoreFocus2() { - const el = _focusStack.pop(); - if (el && typeof el.focus === "function") el.focus(); - const listener = _focusTrapStack.pop(); - if (listener) document.removeEventListener("keydown", listener); - } - function pushFocusStack2(el) { - _focusStack.push(el || document.activeElement); + return; + } } - var STAGE_TABS = { - job: ["job", "master"], - analysis: ["analysis"], - customizations: ["goals", "questions", "exp-review", "ach-editor", "skills-review", "achievements-review", "tagline-review", "summary-review", "publications-review", "ats-score"], - rewrite: ["rewrite"], - spell: ["spell"], - layout: ["layout"], - download: ["final_generate", "download"], - cover_letter: ["cover-letter"], - screening: ["screening"], - interview_prep: ["interview-prep"], - thank_you: ["thank-you"], - harvest: ["harvest"] - }; - function confirmDialog2(message, { confirmLabel = "OK", cancelLabel = "Cancel", danger = false } = {}) { - return new Promise((resolve) => { - const previousFocus = document.activeElement; - let overlay = document.getElementById("confirm-dialog-overlay"); - if (!overlay) { - overlay = document.createElement("div"); - overlay.id = "confirm-dialog-overlay"; - overlay.style.cssText = "display:none; position:fixed; inset:0; background:rgba(0,0,0,0.45); z-index:9999;align-items:center; justify-content:center;"; - overlay.innerHTML = ''; - document.body.appendChild(overlay); - } - const okBtn = document.getElementById("confirm-dialog-ok"); - const cancelBtn = document.getElementById("confirm-dialog-cancel"); - const msgEl = document.getElementById("confirm-dialog-msg"); - msgEl.textContent = message; - okBtn.textContent = confirmLabel; - cancelBtn.textContent = cancelLabel; - okBtn.style.background = danger ? "#dc2626" : "#3b82f6"; - overlay.style.display = "flex"; - okBtn.focus(); - const trapFocus3 = (e) => { - if (e.key !== "Tab") return; - e.preventDefault(); - const focused = document.activeElement; - if (e.shiftKey) { - (focused === cancelBtn ? okBtn : cancelBtn).focus(); - } else { - (focused === okBtn ? cancelBtn : okBtn).focus(); - } - }; - overlay.addEventListener("keydown", trapFocus3); - const finish = (result) => { - overlay.style.display = "none"; - overlay.removeEventListener("keydown", trapFocus3); - okBtn.replaceWith(okBtn.cloneNode(true)); - cancelBtn.replaceWith(cancelBtn.cloneNode(true)); - if (previousFocus && typeof previousFocus.focus === "function") { - previousFocus.focus(); - } - resolve(result); - }; - overlay.addEventListener("keydown", (e) => { - if (e.key === "Escape") finish(false); - }, { once: true }); - document.getElementById("confirm-dialog-ok").addEventListener("click", () => finish(true), { once: true }); - document.getElementById("confirm-dialog-cancel").addEventListener("click", () => finish(false), { once: true }); - overlay.addEventListener("click", (e) => { - if (e.target === overlay) finish(false); - }, { once: true }); - }); + function _markChanged(el) { + el.setAttribute("data-changed", "true"); + setTimeout(() => el.removeAttribute("data-changed"), 2500); } - function setupEventListeners() { - document.querySelectorAll(".tab").forEach((tab) => { - tab.addEventListener("click", (e) => { - const tabName = e.target.id.replace("tab-", ""); - switchTab(tabName); + async function showBulletReorder2(expId, expTitle) { + let achievements = []; + let proposedOrder = null; + let hasJobAnalysis = false; + let proposedReasoning = ""; + let proposedAtsImpact = ""; + let proposedPageImpact = ""; + try { + const detailsRes = await fetch("/api/experience-details", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ experience_id: expId }) }); - tab.addEventListener("keydown", (e) => { - if (e.key === "Enter" || e.key === " ") { - e.preventDefault(); - e.target.click(); - return; - } - if (["ArrowLeft", "ArrowRight", "Home", "End"].includes(e.key)) { - e.preventDefault(); - const tabs = Array.from(document.querySelectorAll('.tab:not([style*="display: none"])')); - const currentIndex = tabs.indexOf(e.target); - let nextTab; - if (e.key === "ArrowLeft" || e.key === "Home") { - nextTab = e.key === "Home" ? tabs[0] : tabs[(currentIndex - 1 + tabs.length) % tabs.length]; - } else { - nextTab = e.key === "End" ? tabs[tabs.length - 1] : tabs[(currentIndex + 1) % tabs.length]; - } - if (nextTab) { - nextTab.focus(); - nextTab.click(); - } + if (!detailsRes.ok) { + let detailsErr = `HTTP ${detailsRes.status}`; + try { + const payload = await detailsRes.json(); + detailsErr = payload.error || payload.message || detailsErr; + } catch (_2) { } - }); - }); - const messageInput = document.getElementById("message-input"); - if (messageInput) { - messageInput.addEventListener("keypress", (e) => { - if (e.key === "Enter" && !e.shiftKey) { - e.preventDefault(); - if (typeof globalThis.sendMessage === "function") { - globalThis.sendMessage(); + throw new Error(detailsErr); + } + const detailsData = await detailsRes.json(); + achievements = detailsData.experience && detailsData.experience.achievements || []; + const recRecord = _findExperienceRecommendationRecord(expId); + const llmBulletOrder = recRecord && typeof recRecord.bullet_order === "object" ? recRecord.bullet_order : null; + if (Array.isArray(llmBulletOrder?.order) && llmBulletOrder.order.length > 1) { + proposedOrder = llmBulletOrder.order; + hasJobAnalysis = true; + proposedReasoning = String(llmBulletOrder.reasoning || "").trim(); + proposedAtsImpact = String(llmBulletOrder.ats_impact || "").trim(); + proposedPageImpact = String(llmBulletOrder.page_length_impact || "").trim(); + } + if (!proposedOrder) { + try { + const proposedRes = await fetch(`/api/proposed-bullet-order?experience_id=${encodeURIComponent(expId)}`); + if (proposedRes.ok) { + const proposedData = await proposedRes.json(); + proposedOrder = proposedData.proposed_order || null; + hasJobAnalysis = proposedData.has_job_analysis || false; + } else { + log3.warn("Could not load suggested bullet order:", proposedRes.status); } + } catch (e) { + log3.warn("Could not load suggested bullet order:", e); } - }); + } + } catch (e) { + const errorText = e.message === "Failed to fetch" ? "Failed to fetch (server unavailable)." : e.message; + appendRetryMessage("\u26A0 Could not load bullets: " + errorText, () => showBulletReorder2(expId, expTitle)); + return; } - document.addEventListener("keydown", (e) => { + if (!achievements.length) { + appendMessage("system", "No bullet points found for this experience."); + return; + } + if (typeof _focusedElementBeforeModal !== "undefined") { + _focusedElementBeforeModal = document.activeElement; + } + const modal = document.createElement("div"); + modal.id = "bullet-reorder-modal"; + modal.setAttribute("role", "dialog"); + modal.setAttribute("aria-modal", "true"); + modal.setAttribute("aria-labelledby", "bullet-reorder-title"); + modal.style.cssText = ` + position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.5); + z-index:9999;display:flex;align-items:center;justify-content:center;`; + const suggestedBtn = hasJobAnalysis ? `` : ""; + const suggestionMeta = proposedReasoning || proposedAtsImpact || proposedPageImpact ? `
    + ${proposedReasoning ? `
    AI rationale: ${escapeHtml(proposedReasoning)}
    ` : ""} + ${proposedAtsImpact ? `
    ATS impact: ${escapeHtml(proposedAtsImpact)}
    ` : ""} + ${proposedPageImpact ? `
    Page length impact: ${escapeHtml(proposedPageImpact)}
    ` : ""} +
    ` : ""; + modal.innerHTML = ` +
    +
    +
    +

    \u2195 Reorder Bullets

    +
    ${expTitle}
    +
    + +
    +
    + Use \u2191 \u2193 to reorder. Bullets higher in the list appear first on your CV. + The most relevant bullet will be auto-ranked highest if you reset. +
    + ${suggestionMeta} +
      +
    +
    + ${suggestedBtn} + + +
    +
    `; + document.body.appendChild(modal); + if (typeof trapFocus === "function") trapFocus("bullet-reorder-modal"); + if (typeof setInitialFocus === "function") setInitialFocus("bullet-reorder-modal"); + const escHandler = (e) => { if (e.key === "Escape") { - closeAllModals(); + e.preventDefault(); + restoreFocus(); + modal.remove(); + document.removeEventListener("keydown", escHandler); } + }; + document.addEventListener("keydown", escHandler); + const list = document.getElementById("bullet-reorder-list"); + achievements.forEach((ach, idx) => { + const text2 = typeof ach === "object" ? ach.text || "" : String(ach); + const li = document.createElement("li"); + li.dataset.origIndex = idx; + li.style.cssText = `display:flex;align-items:flex-start;gap:8px;padding:8px;margin-bottom:6px; + background:#f8fafc;border:1px solid #e2e8f0;border-radius:6px;`; + li.innerHTML = ` +
    + + +
    + ${text2}`; + list.appendChild(li); }); - document.querySelectorAll('[role="dialog"]').forEach((modal) => { - modal.addEventListener("click", (e) => { - if (e.target === modal) { - closeModal(modal.id); - } + _updateBulletArrows(); + if (hasJobAnalysis && proposedOrder) { + document.getElementById("use-llm-order-btn")?.addEventListener("click", () => { + _applyBulletOrder(proposedOrder); }); - }); - } - function getStageForTab2(tab) { - for (const [stage, tabs] of Object.entries(STAGE_TABS)) { - if (tabs.includes(tab)) return stage; } - return null; } - function getVisibleStage() { - const activeTab = stateManager2.getCurrentTab(); - return getStageForTab2(activeTab) || getWorkflowStepForPhase(stateManager2.getPhase()); + function _applyBulletOrder(order) { + const list = document.getElementById("bullet-reorder-list"); + if (!list) return; + const items = Array.from(list.querySelectorAll("li")); + const byOrig = {}; + items.forEach((li) => { + byOrig[parseInt(li.dataset.origIndex, 10)] = li; + }); + const listed = new Set(order.map(Number)); + order.forEach((idx) => { + if (byOrig[idx]) list.appendChild(byOrig[idx]); + }); + items.forEach((li) => { + if (!listed.has(parseInt(li.dataset.origIndex, 10))) list.appendChild(li); + }); + _updateBulletArrows(); } - function updateTabScrollButtons() { - const tabBar = document.getElementById("tab-bar"); - const leftBtn = document.getElementById("tab-scroll-left"); - const rightBtn = document.getElementById("tab-scroll-right"); - if (!tabBar || !leftBtn || !rightBtn) return; - leftBtn.style.display = tabBar.scrollLeft > 0 ? "" : "none"; - rightBtn.style.display = tabBar.scrollLeft < tabBar.scrollWidth - tabBar.clientWidth - 1 ? "" : "none"; + function moveBullet(btn, direction) { + const li = btn.closest("li"); + const list = li.parentNode; + if (direction === -1 && li.previousElementSibling) { + list.insertBefore(li, li.previousElementSibling); + } else if (direction === 1 && li.nextElementSibling) { + list.insertBefore(li.nextElementSibling, li); + } + _updateBulletArrows(); } - function updateTabBarForStage2(stage) { - const stageTabs = STAGE_TABS[stage] || []; - document.querySelectorAll(".tab").forEach((tab) => { - tab.style.display = stageTabs.includes(tab.dataset.tab) ? "" : "none"; + function _updateBulletArrows() { + const list = document.getElementById("bullet-reorder-list"); + if (!list) return; + const items = list.querySelectorAll("li"); + items.forEach((li, idx) => { + const [upBtn, downBtn] = li.querySelectorAll("button"); + upBtn.disabled = idx === 0; + downBtn.disabled = idx === items.length - 1; + upBtn.style.opacity = upBtn.disabled ? "0.3" : "1"; + downBtn.style.opacity = downBtn.disabled ? "0.3" : "1"; }); - const tabBar = document.getElementById("tab-bar"); - if (tabBar) tabBar.scrollLeft = 0; - updateTabScrollButtons(); } - function toggleChat() { - const interactionArea = document.querySelector(".interaction-area"); - const viewerArea = document.querySelector(".viewer-area"); - if (interactionArea) { - const isCollapsed = interactionArea.classList.toggle("collapsed"); - if (viewerArea) { - viewerArea.style.flex = isCollapsed ? "1 1 100%" : "0 1 60%"; - } - const toggleBtn = document.getElementById("toggle-chat"); - if (toggleBtn) { - toggleBtn.setAttribute("aria-expanded", String(!isCollapsed)); - toggleBtn.setAttribute("aria-label", isCollapsed ? "Expand chat panel" : "Collapse chat panel"); - } - try { - localStorage.setItem(StorageKeys2.CHAT_COLLAPSED, isCollapsed); - } catch (e) { - log3.warn("Could not save chat state"); + async function saveBulletOrder(expId) { + const list = document.getElementById("bullet-reorder-list"); + const items = list ? list.querySelectorAll("li") : []; + const order = Array.from(items).map((li) => parseInt(li.dataset.origIndex, 10)); + try { + const res = await fetch("/api/reorder-bullets", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ experience_id: expId, order }) + }); + const data = await res.json(); + if (!res.ok || !data.ok) { + appendRetryMessage("\u26A0 Could not save bullet order: " + (data.error || "Unknown"), () => saveBulletOrder(expId)); + return; } + appendMessage("assistant", "\u2195 Bullet order saved. It will apply when you generate the CV."); + document.getElementById("bullet-reorder-modal")?.remove(); + } catch (e) { + appendRetryMessage("\u26A0 Network error saving bullet order: " + e.message, () => saveBulletOrder(expId)); } } - function openModal(modalId) { - const modal = document.getElementById(modalId); - if (modal) { - _focusStack.push(document.activeElement); - modal.classList.add("visible"); - modal.setAttribute("aria-hidden", "false"); - document.body.style.overflow = "hidden"; - setInitialFocus2(modalId); - trapFocus2(modalId); - } - } - function closeModal(modalId) { - const modal = document.getElementById(modalId); - if (modal) { - if (modal.dataset.dismissDisabled === "1") return; - modal.classList.remove("visible"); - modal.setAttribute("aria-hidden", "true"); - if (!document.querySelector('[role="dialog"].visible')) { - document.body.style.overflow = ""; + async function resetBulletOrder(expId) { + try { + const res = await fetch("/api/reorder-bullets", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ experience_id: expId, order: [] }) + }); + const data = await res.json(); + if (!res.ok || !data.ok) { + appendRetryMessage("\u26A0 Could not reset bullet order: " + (data.error || "Unknown"), () => resetBulletOrder(expId)); + return; } - restoreFocus2(); + appendMessage("assistant", "\u21BA Bullet order reset. Relevance-based ordering will apply."); + restoreFocus(); + document.getElementById("bullet-reorder-modal")?.remove(); + } catch (e) { + appendRetryMessage("\u26A0 Network error resetting bullet order: " + e.message, () => resetBulletOrder(expId)); } } - function closeAllModals() { - document.querySelectorAll('[role="dialog"]').forEach((modal) => { - if (modal.dataset.dismissDisabled === "1") return; - modal.classList.remove("visible"); - modal.setAttribute("aria-hidden", "true"); - if (modal.style.display && modal.style.display !== "none") { - modal.style.display = "none"; - } - }); - document.body.style.overflow = ""; - restoreFocus2(); - } - var _modelData = null; - var _modelDataTable = null; - var _selectedModelProviders = /* @__PURE__ */ new Set(); - var _modelSelectorLoading = false; - var _catalogRefreshing = false; - var _catalogRefreshPending = false; - var _showFullModelCatalog = false; - var _copilotAuthPollTimer = null; - var _modelWizardStep = 1; - var _modelWizardSelectedProvider = null; - function _getModelPrefsFromStorage() { - try { - const saved = localStorage.getItem(StorageKeys2.TAB_DATA); - return saved ? JSON.parse(saved) || {} : {}; - } catch { - return {}; - } - } - function _saveModelPrefsToStorage(patch) { - try { - const parsed = _getModelPrefsFromStorage(); - localStorage.setItem(StorageKeys2.TAB_DATA, JSON.stringify({ ...parsed, ...patch })); - } catch (e) { - log3.warn("Failed to persist model preferences locally:", e); - } - } - function _appendRecentModel(provider, model) { - if (!provider || !model) return; - const parsed = _getModelPrefsFromStorage(); - const existing = Array.isArray(parsed.recentModels) ? parsed.recentModels : []; - const filtered = existing.filter((item) => !(item.provider === provider && item.model === model)); - filtered.unshift({ provider, model }); - _saveModelPrefsToStorage({ recentModels: filtered.slice(0, 6) }); - } - function _updateLlmStatusPill2(kind, text2, icon = "", tooltip = "") { - const pill = document.getElementById("llm-status-pill"); - const label = document.getElementById("llm-status-label"); - const iconEl = document.getElementById("llm-status-icon"); - if (!pill || !label) return; - const aliases = { - authenticated: "connected", - unauthenticated: "unconfigured", - polling: "connecting" + var _PHASE_PROGRESSION = [ + "init", + "job_analysis", + "customization", + "rewrite_review", + "spell_check", + "generation", + "layout_review", + "final_generation", + "refinement" + ]; + var _STEP_FWD_PHASE_MIN = { + analysis: 1, + // job_analysis + customizations: 2, + // customization + rewrite: 3, + // rewrite_review + spell: 4, + // spell_check + layout: 5, + // generation + download: 7, + // final_generation + cover_letter: 7, + screening: 7, + interview_prep: 7, + thank_you: 7, + harvest: 7 + }; + function updateWorkflowSteps(status) { + const UPCOMING = /* @__PURE__ */ new Set(); + const RE_RUN_STEPS = /* @__PURE__ */ new Set(["analysis", "customizations", "rewrite", "spell", "layout"]); + const STEP_LABELS = { + job: "\u{1F4E5} Job Input", + analysis: "\u{1F50D} Analysis", + customizations: "\u2699\uFE0F Customise", + rewrite: "\u270F\uFE0F Rewrites", + spell: "\u{1F524} Spell Check", + layout: "\u{1F3A8} Layout Review", + download: "\u2B07\uFE0F Download Files", + cover_letter: "\u{1F4E9} Cover Letter", + screening: "\u{1F4CB} Screening", + interview_prep: "\u{1F3A4} Interview Prep", + thank_you: "\u{1F64F} Thank You", + harvest: "\u{1F33E} Harvest" }; - const normalizedKind = aliases[kind] || kind || "unconfigured"; - const defaultTooltip = { - unconfigured: "No provider/model is configured yet.", - configured: "Provider/model is configured. Connectivity not yet verified.", - connecting: "Testing or connecting to the selected provider.", - connected: "Provider responded successfully to a live request.", - "auth-required": "Authentication is required. Check API key or sign in.", - "rate-limited": "Rate limit reached. Wait before retrying requests.", - unavailable: "Provider is temporarily unavailable or unreachable.", - error: "Connection failed. Open model settings for details." + const phase = status.phase || ""; + const postLayout = phase === PHASES.FINAL_GENERATION || phase === PHASES.REFINEMENT; + const done = { + job: !!status.job_description, + analysis: !!status.job_analysis, + customizations: !!status.customizations, + rewrite: phase !== PHASES.REWRITE_REVIEW && !!status.customizations, + spell: phase === PHASES.GENERATION || phase === PHASES.LAYOUT_REVIEW || phase === PHASES.FINAL_GENERATION || phase === PHASES.REFINEMENT, + layout: postLayout, + download: postLayout, + cover_letter: postLayout, + screening: postLayout, + interview_prep: postLayout, + thank_you: postLayout, + harvest: postLayout }; - pill.classList.remove("authenticated", "unauthenticated", "polling", "unconfigured", "configured", "connecting", "connected", "auth-required", "rate-limited", "unavailable", "error"); - if (normalizedKind) pill.classList.add(normalizedKind); - label.textContent = text2; - const iconByKind = { - unconfigured: "\u25CB", - configured: "\u25D4", - connecting: "\u29D7", - connected: "\u2713", - "auth-required": "\u{1F511}", - "rate-limited": "\u23F3", - unavailable: "\u2601", - error: "\u26A0" + const highestPhaseIdx = _PHASE_PROGRESSION.indexOf(status.highest_phase || ""); + const currentPhaseIdx = _PHASE_PROGRESSION.indexOf(phase); + const phaseToStep = { + "init": "job", + "job_analysis": "analysis", + "customization": "customizations", + "rewrite_review": "rewrite", + "spell_check": "spell", + "generation": "layout", + "layout_review": "layout", + "final_generation": "download", + "refinement": "download" }; - const iconText = icon || iconByKind[normalizedKind] || "\u26A0"; - if (iconEl) iconEl.textContent = iconText; - const tooltipText = tooltip || defaultTooltip[normalizedKind] || ""; - pill.title = tooltipText; - if (iconEl) iconEl.title = tooltipText; - label.title = tooltipText; - } - async function loadModelSelector() { - if (_modelSelectorLoading) return; - _modelSelectorLoading = true; - try { - _modelData = await apiCall2("GET", "/api/model"); - try { - const saved = localStorage.getItem(StorageKeys2.TAB_DATA); - if (saved) { - const parsed = JSON.parse(saved); - if (parsed && !(_modelData && _modelData.provider) && parsed.currentModelProvider) { - _modelData = _modelData || {}; - _modelData.provider = parsed.currentModelProvider; - } - if (parsed && !(_modelData && _modelData.model) && parsed.currentModelName) { - _modelData = _modelData || {}; - _modelData.model = parsed.currentModelName; - } + const activeStep = phaseToStep[phase] || "job"; + const _phaseToStep2 = Object.assign({ "init": "job" }, phaseToStep); + const reentryStep = status.iterating ? _phaseToStep2[status.reentry_phase] || status.reentry_phase || null : null; + const stepIds = [ + "job", + "analysis", + "customizations", + "rewrite", + "spell", + "layout", + "download", + "cover_letter", + "screening", + "interview_prep", + "thank_you", + "harvest" + ]; + const staleSteps = new Set(status.stale_steps || []); + stepIds.forEach((step) => { + const el = document.getElementById(`step-${step}`); + if (!el) return; + if (UPCOMING.has(step)) return; + el.classList.remove("active", "completed", "clickable", "upcoming", "stale", "forward-skip"); + let label = STEP_LABELS[step] || step; + if (step === activeStep) { + el.classList.add("active"); + if (status.iterating && reentryStep === step) { + label += ' \u21BB Refining'; } - } catch (e) { - log3.warn("Could not read saved model from localStorage:", e); - } - const label = document.getElementById("model-current-label"); - if (label) { - const prov = _modelData.provider; - const model = _modelData.model || "\u2014"; - label.textContent = prov ? `${prov} \xB7 ${model}` : model; - } - if (_modelData && _modelData.provider) { - _selectedModelProviders = /* @__PURE__ */ new Set([_modelData.provider]); - _updateLlmStatusPill2("configured", `${_modelData.provider} configured`); - } else { - _updateLlmStatusPill2("unconfigured", "Not configured"); + } else if (done[step]) { + el.classList.add("completed"); + el.classList.add("clickable"); + if (RE_RUN_STEPS.has(step)) { + const rerunLabel = _STEP_DISPLAY[step] || step; + label += ` `; + } + } else if (highestPhaseIdx >= 0 && (_STEP_FWD_PHASE_MIN[step] ?? Infinity) <= highestPhaseIdx && highestPhaseIdx > currentPhaseIdx) { + el.classList.add("forward-skip", "clickable"); + label += ' \u23E9'; } - } catch (e) { - log3.warn("Could not load model list:", e); - } finally { - _modelSelectorLoading = false; + if (staleSteps.has(step)) el.classList.add("stale"); + const isStale = staleSteps.has(step); + const isStaleCritical = el.classList.contains("stale-critical"); + const isActive = el.classList.contains("active"); + const isCompleted = el.classList.contains("completed"); + const isFwdSkip = el.classList.contains("forward-skip"); + const srState = isStaleCritical ? " (critical \u2014 review required)" : isStale ? " (stale \u2014 results may be outdated)" : isActive ? " (current step)" : isCompleted ? " (completed)" : isFwdSkip ? " (previously completed \u2014 click to jump ahead)" : ""; + if (srState) label += `${srState}`; + el.innerHTML = label; + }); + applyLayoutFreshnessNavigationState(); + if (!document.getElementById("step-rerun-style")) { + const s = document.createElement("style"); + s.id = "step-rerun-style"; + s.textContent = ".step.completed:hover .step-rerun, .step.completed:focus-within .step-rerun { opacity: 1 !important; } .step-rerun:focus-visible { outline: 2px solid #3b82f6; outline-offset: 2px; opacity: 1 !important; }"; + document.head.appendChild(s); } + if (typeof updateTabBarForStage === "function") { + updateTabBarForStage(activeStep); + } + updateActionButtons(activeStep); + _updateViewingIndicator2(stateManager2.getCurrentTab()); } - function _providerStageLabel(provider, capableSet) { - const isCapable = capableSet.has(provider); - return isCapable ? "list_models" : "fallback"; - } - function _providerDisplayLabel(provider) { - const deprecated = { - "copilot-oauth": "Copilot OAuth (deprecated)", - copilot: "Copilot (deprecated)", - github: "GitHub Models (deprecated)", - "copilot-sdk": "Copilot SDK (recommended)" - }; - if (deprecated[provider]) return deprecated[provider]; - return provider; + if (typeof window !== "undefined") { + window.addEventListener(GENERATION_STATE_EVENT, applyLayoutFreshnessNavigationState); + window.addEventListener(GENERATION_STATE_EVENT, applyDirtyPhaseNavigationState); } - function _getQuickModelCandidates(rows) { - const parsed = _getModelPrefsFromStorage(); - const recents = Array.isArray(parsed.recentModels) ? parsed.recentModels : []; - const ranked = []; - for (const recent of recents) { - const hit = rows.find((row) => row.provider === recent.provider && row.model === recent.model); - if (hit) ranked.push(hit); - } - const popular = [...rows].sort((a, b2) => { - const am = Number(a.copilot_multiplier ?? 999); - const bm = Number(b2.copilot_multiplier ?? 999); - if (am !== bm) return am - bm; - const ac = Number(a.context_window || 0); - const bc = Number(b2.context_window || 0); - return bc - ac; + function applyDirtyPhaseNavigationState() { + const dirtyPhases = stateManager2.getDirtyPhases(); + const stepsToClear = []; + stepsToClear.forEach((step) => { + const el = document.getElementById(`step-${step}`); + if (!el) return; + const isDirty = dirtyPhases.includes(step); + el.classList.toggle("stale", isDirty); + const rerunHtml = el.querySelector(".step-rerun")?.outerHTML || ""; + const label = _STEP_DISPLAY[step] || step; + const badge = isDirty ? ' Content changed' : ""; + el.innerHTML = `${label}${badge}${rerunHtml ? ` ${rerunHtml}` : ""}`; }); - for (const item of popular) { - if (!ranked.some((r) => r.provider === item.provider && r.model === item.model)) { - ranked.push(item); - } - } - return ranked.slice(0, 8); - } - function _renderQuickModelList(rows) { - const quickEl = document.getElementById("model-quick-list"); - if (!quickEl) return; - quickEl.innerHTML = ""; - const candidates = _getQuickModelCandidates(rows || []); - for (const item of candidates) { - const isActive = item.provider === _modelData?.provider && item.model === _modelData?.model; - const button = document.createElement("button"); - button.className = "header-pill-btn"; - button.style.padding = "5px 10px"; - button.style.fontSize = "0.82em"; - button.style.background = isActive ? "#dbeafe" : "#f8fafc"; - button.style.color = isActive ? "#1e3a8a" : "#334155"; - button.style.borderColor = isActive ? "#93c5fd" : "#cbd5e1"; - button.title = `${item.provider} \xB7 ${item.model}`; - button.textContent = `${item.provider} \xB7 ${item.model}`; - button.addEventListener("click", async () => { - await setModel(item.model, item.provider); - }); - quickEl.appendChild(button); - } - } - function _syncCatalogVisibility() { - const wrap = document.getElementById("model-full-table-wrap"); - const search = document.getElementById("model-global-search"); - const toggle = document.getElementById("model-show-all-btn"); - if (wrap) wrap.style.display = _showFullModelCatalog ? "" : "none"; - if (search) search.style.display = _showFullModelCatalog ? "" : "none"; - if (toggle) toggle.textContent = _showFullModelCatalog ? "Hide Full Catalog" : "Show Full Catalog"; - } - function toggleModelCatalogVisibility() { - _showFullModelCatalog = !_showFullModelCatalog; - _syncCatalogVisibility(); } - async function _renderAuthStep(provider) { - const content = document.getElementById("model-auth-step-content"); - const keyPanel = document.getElementById("model-auth-key-panel"); - const devPanel = document.getElementById("model-auth-device-panel"); - const keyInput = document.getElementById("model-auth-key-input"); - const keyStatus = document.getElementById("model-auth-key-status"); - if (!content) return; - if (keyPanel) keyPanel.style.display = "none"; - if (devPanel) devPanel.style.display = "none"; - if (keyInput) keyInput.value = ""; - if (keyStatus) keyStatus.textContent = ""; - if (!provider) { - content.innerHTML = '

    Select a provider in Step 1 first.

    '; - return; - } - let credData = null; - try { - const resp = await fetch("/api/settings/credentials/status"); - if (resp.ok) { - const data = await resp.json(); - credData = (data.providers || {})[provider] || null; - } - } catch { - } - const authType = credData?.auth_type || "api_key"; - const label = credData?.label || provider; - const helpText = credData?.help_text || ""; - const getKeyUrl = credData?.get_key_url || ""; - const isSet = credData?.is_set || false; - const source = credData?.source || "unset"; - const envVar = credData?.env_var || null; - const isLocked = credData?.locked || false; - const isSetBadge = isSet ? '✓ Key saved' : 'Not configured'; - let sourceLabel = ""; - let tooltipText = ""; - if (source === "env") { - sourceLabel = `Source: environment variable (${envVar || "locked"})`; - tooltipText = `Currently loaded from the ${envVar} environment variable. To change it permanently, update your shell config (e.g. ~/.zshrc) and restart the server. You can still save a value below \u2014 it takes effect immediately but will be overridden by the environment variable on next restart.`; - } else if (source === "dotenv") { - sourceLabel = `Source: .env file (${envVar || "locked"})`; - tooltipText = `Currently loaded from ${envVar} in your .env file. To change it permanently, edit the .env file in the project directory and restart the server. You can still save a value below \u2014 it takes effect immediately but will be overridden by .env on next restart.`; - } else if (source === "config") { - sourceLabel = "Source: config.yaml"; - tooltipText = "Stored in config.yaml. Update it using the input below."; - } - const infoIcon = tooltipText ? ` ` : ""; - const sourceLabelHtml = sourceLabel ? `${escapeHtml2(sourceLabel)}${infoIcon}` : ""; - const sourceDesc = source === "env" ? "environment variable" : ".env file"; - const sourceRef = envVar ? `${sourceDesc} ${escapeHtml2(envVar)}` : sourceDesc; - const lockedWarnHtml = isLocked ? `
    \u26A0 This key is loaded from the ${sourceRef}. Any value saved below takes effect immediately for the current session, but will be overridden by the ${sourceDesc} when the server restarts or reloads.
    ` : ""; - const getKeyLink = getKeyUrl ? `Get your key ↗` : ""; - content.innerHTML = `
    ${escapeHtml2(label)} ${isSetBadge}${sourceLabelHtml}` + (getKeyLink ? ` ${getKeyLink}` : "") + `
    ` + (helpText ? `

    ${escapeHtml2(helpText)}

    ` : "") + lockedWarnHtml; - if (authType === "api_key") { - if (keyPanel) { - keyPanel.style.display = ""; - if (keyInput) { - keyInput.disabled = false; - keyInput.style.opacity = ""; - keyInput.placeholder = isSet ? "Enter new key to replace the saved one" : "Paste your API key here"; - keyInput.dataset.provider = provider; - } - } - } else if (authType === "device_flow") { - if (devPanel) { - devPanel.style.display = ""; - await _refreshCopilotAuthStatus(); - } - } else if (authType === "cli") { - content.innerHTML += `

    Run this command in a terminal, then return here and click Next:

    gh auth login
    `; - } else { - content.innerHTML += `
    No authentication required for this provider.
    `; - } + function _doStepNavigate(step) { + const stepToTab = { + analysis: "analysis", + customizations: "goals", + rewrite: "rewrite", + spell: "spell", + layout: "layout", + download: "final_generate", + cover_letter: "cover-letter", + screening: "screening", + interview_prep: "interview-prep", + thank_you: "thank-you", + harvest: "harvest" + }; + const tabName = stepToTab[step]; + if (!tabName) return; + if (typeof updateTabBarForStage === "function") updateTabBarForStage(step); + switchTab(tabName); } - async function _refreshCopilotAuthStatus() { - const statusEl = document.getElementById("model-auth-status"); - const startBtn = document.getElementById("model-auth-start-btn"); - const logoutBtn = document.getElementById("model-auth-logout-btn"); - const codeEl = document.getElementById("model-auth-code"); - const linkEl = document.getElementById("model-auth-link"); - if (!statusEl) return; - if (codeEl) codeEl.textContent = ""; - if (linkEl) linkEl.style.display = "none"; - try { - const st = await fetch("/api/copilot-auth/status").then((res) => res.json()); - if (st.authenticated) { - statusEl.textContent = "Authenticated with GitHub Copilot."; - if (startBtn) startBtn.style.display = "none"; - if (logoutBtn) logoutBtn.style.display = ""; - _updateLlmStatusPill2("authenticated", "Copilot ready"); - } else if (st.polling) { - statusEl.textContent = "Waiting for device approval\u2026"; - if (startBtn) startBtn.style.display = ""; - if (logoutBtn) logoutBtn.style.display = "none"; - _updateLlmStatusPill2("polling", "Copilot auth pending", "\u29D7"); + function handleStepClick(step) { + const el = document.getElementById(`step-${step}`); + if (!el) return; + if (step === "job") { + if (el.classList.contains("completed") || el.classList.contains("active")) { + switchTab("job"); } else { - statusEl.textContent = "Not authenticated. Start sign-in to enable Copilot OAuth."; - if (startBtn) startBtn.style.display = ""; - if (logoutBtn) logoutBtn.style.display = "none"; - _updateLlmStatusPill2("unauthenticated", "Copilot not authenticated"); - } - } catch { - statusEl.textContent = "Unable to load auth status."; - } - } - async function saveProviderApiKey() { - const keyInput = document.getElementById("model-auth-key-input"); - const keyStatus = document.getElementById("model-auth-key-status"); - const provider = keyInput?.dataset?.provider || _modelWizardSelectedProvider; - const value = (keyInput?.value || "").trim(); - if (!value) { - if (keyStatus) { - keyStatus.textContent = "Please enter a key value."; - keyStatus.style.color = "#b91c1c"; - } - return; - } - if (!provider) { - if (keyStatus) { - keyStatus.textContent = "No provider selected."; - keyStatus.style.color = "#b91c1c"; + showLoadJobPanel(); } return; } - if (keyStatus) { - keyStatus.textContent = "Saving\u2026"; - keyStatus.style.color = "#475569"; - } - try { - await apiCall2("POST", "/api/settings/credentials", { provider, key_value: value }); - if (keyInput) keyInput.value = ""; - if (keyStatus) { - keyStatus.textContent = "Key saved successfully."; - keyStatus.style.color = "#065f46"; - } - await _renderAuthStep(provider); - } catch (e) { - if (keyStatus) { - keyStatus.textContent = `Error: ${e.message || e}`; - keyStatus.style.color = "#b91c1c"; - } - } - } - function toggleApiKeyVisibility() { - const input = document.getElementById("model-auth-key-input"); - const toggle = document.getElementById("model-auth-key-toggle"); - if (!input) return; - const isHidden = input.type === "password"; - input.type = isHidden ? "text" : "password"; - if (toggle) toggle.textContent = isHidden ? "\u{1F648}" : "\u{1F441}"; - } - async function startCopilotAuthFromWizard() { - const statusEl = document.getElementById("model-auth-status"); - const codeEl = document.getElementById("model-auth-code"); - const linkEl = document.getElementById("model-auth-link"); - if (!statusEl || !codeEl || !linkEl) return; - _showModelWizardBusy("Starting GitHub device authorization..."); - try { - const flowRes = await fetch("/api/copilot-auth/start", { method: "POST" }); - if (!flowRes.ok) throw new Error(await flowRes.text()); - const flow = await flowRes.json(); - codeEl.textContent = flow.user_code || ""; - linkEl.href = flow.verification_uri || "https://github.com/login/device"; - linkEl.style.display = ""; - statusEl.textContent = "Open GitHub, enter the code, then return here."; - window.open(linkEl.href, "_blank"); - await fetch("/api/copilot-auth/poll", { method: "POST" }); - _updateLlmStatusPill2("polling", "Copilot auth pending", "\u29D7"); - if (_copilotAuthPollTimer) clearInterval(_copilotAuthPollTimer); - _copilotAuthPollTimer = setInterval(async () => { - try { - const st = await fetch("/api/copilot-auth/status").then((res) => res.json()); - if (st.authenticated) { - clearInterval(_copilotAuthPollTimer); - _copilotAuthPollTimer = null; - await _refreshCopilotAuthStatus(); - } - } catch { - } - }, 5e3); - } catch (error) { - statusEl.textContent = `Auth start failed: ${error.message || error}`; - } finally { - _hideModelWizardBusy(); - } - } - async function logoutCopilotAuthFromWizard() { - await fetch("/api/copilot-auth/logout", { method: "POST" }); - await _refreshCopilotAuthStatus(); - } - function _wireGlobalModelSearch() { - const input = document.getElementById("model-global-search"); - if (!input) return; - input.oninput = () => { - if (_modelDataTable && typeof _modelDataTable.search === "function") { - _modelDataTable.search(input.value || "").draw(); - } - }; - } - function _renderProviderSelector() { - const listEl = document.getElementById("model-provider-list"); - if (!listEl || !_modelData) return; - const providers = Array.isArray(_modelData.providers) ? _modelData.providers : Array.from(new Set((_modelData.all_models || []).map((r) => r.provider).filter(Boolean))).sort(); - const capableSet = new Set(_modelData.list_models_capable || []); - if (!_modelWizardSelectedProvider) { - _modelWizardSelectedProvider = _modelData.provider || providers[0] || null; - } - if (_modelWizardSelectedProvider) { - _selectedModelProviders = /* @__PURE__ */ new Set([_modelWizardSelectedProvider]); - } - listEl.querySelectorAll('[data-bs-toggle="popover"]').forEach((el) => { - window.bootstrap?.Popover?.getInstance(el)?.dispose(); - }); - listEl.innerHTML = ""; - providers.forEach((provider) => { - const checked = provider === _modelWizardSelectedProvider; - const sourceLabel = _providerStageLabel(provider, capableSet); - const info = getProviderInfo(provider); - const label = document.createElement("label"); - label.style.cssText = "display:flex; align-items:center; gap:6px; padding:4px 8px; border:1px solid #cbd5e1; border-radius:999px; font-size:0.82em; background:#fff; cursor:pointer;"; - label.innerHTML = `${escapeHtml2(_providerDisplayLabel(provider))}(${escapeHtml2(sourceLabel)})`; - if (info) { - const btn = document.createElement("button"); - btn.type = "button"; - btn.setAttribute("aria-label", "Provider info"); - btn.setAttribute("data-bs-toggle", "popover"); - btn.setAttribute("data-bs-trigger", "click"); - btn.setAttribute("data-bs-placement", "right"); - btn.setAttribute("data-bs-html", "true"); - btn.setAttribute("data-bs-container", "body"); - btn.setAttribute("data-bs-content", providerInfoPopoverContent(info)); - btn.style.cssText = "background:none;border:none;cursor:pointer;color:#64748b;font-size:0.9em;padding:0 1px;line-height:1;vertical-align:middle;"; - btn.textContent = "\u24D8"; - btn.addEventListener("click", (e) => e.stopPropagation()); - label.appendChild(btn); - requestAnimationFrame(() => { - if (window.bootstrap?.Popover) { - new window.bootstrap.Popover(btn, { sanitize: false }); - } - }); - } - const checkbox = label.querySelector("input"); - checkbox.addEventListener("change", () => { - if (!checkbox.checked) return; - _modelWizardSelectedProvider = provider; - _selectedModelProviders = /* @__PURE__ */ new Set([provider]); - _updateModelWizardNav(); - }); - listEl.appendChild(label); - }); - _updateModelWizardNav(); - } - function _showModelWizardBusy(message) { - const overlay = document.getElementById("model-wizard-busy-overlay"); - const messageEl = document.getElementById("model-wizard-busy-message"); - if (messageEl) messageEl.textContent = message || "Working..."; - if (overlay) overlay.style.display = "flex"; - } - function _hideModelWizardBusy() { - const overlay = document.getElementById("model-wizard-busy-overlay"); - if (overlay) overlay.style.display = "none"; - } - function _setModelWizardStep(step) { - _modelWizardStep = [1, 2, 3, 4].includes(step) ? step : 1; - const panes = { - 1: document.getElementById("model-step-provider"), - 2: document.getElementById("model-step-auth"), - 3: document.getElementById("model-step-models"), - 4: document.getElementById("model-step-success") - }; - Object.entries(panes).forEach(([num, el]) => { - if (el) el.style.display = Number(num) === _modelWizardStep ? "" : "none"; - }); - if (_modelWizardStep === 2) { - _renderAuthStep(_modelWizardSelectedProvider); - } - _updateModelWizardNav(); - } - function _updateModelWizardProgressBar() { - [1, 2, 3, 4].forEach((stepNum) => { - const stepEl = document.getElementById(`model-progress-step-${stepNum}`); - if (!stepEl) return; - const badgeEl = stepEl.querySelector(".model-progress-badge"); - stepEl.classList.remove("is-active", "is-complete", "is-upcoming"); - if (stepNum < _modelWizardStep) { - stepEl.classList.add("is-complete"); - stepEl.setAttribute("aria-current", "false"); - if (badgeEl) badgeEl.textContent = "\u2713"; - } else if (stepNum === _modelWizardStep) { - stepEl.classList.add("is-active"); - stepEl.setAttribute("aria-current", "step"); - if (badgeEl) badgeEl.textContent = String(stepNum); - } else { - stepEl.classList.add("is-upcoming"); - stepEl.setAttribute("aria-current", "false"); - if (badgeEl) badgeEl.textContent = String(stepNum); - } - }); - } - function _updateModelWizardNav() { - const stepLabel = document.getElementById("model-wizard-step-label"); - const backBtn = document.getElementById("model-wizard-back-btn"); - const nextBtn = document.getElementById("model-wizard-next-btn"); - const testBtn = document.getElementById("model-test-btn"); - const refreshBtn = document.getElementById("pricing-refresh-btn"); - const footer = document.querySelector(".model-wizard-footer"); - _updateModelWizardProgressBar(); - if (stepLabel) { - const labels = { - 1: "Step 1 of 4: Choose provider", - 2: "Step 2 of 4: Set up authentication", - 3: "Step 3 of 4: Choose model and test connection", - 4: "Step 4 of 4: Complete" - }; - stepLabel.textContent = labels[_modelWizardStep] || ""; - } - if (backBtn) { - backBtn.disabled = _modelWizardStep === 1; - backBtn.style.display = _modelWizardStep === 4 ? "none" : ""; - } - if (nextBtn) { - nextBtn.style.display = _modelWizardStep === 1 || _modelWizardStep === 2 ? "" : "none"; - nextBtn.disabled = _modelWizardStep === 1 && !_modelWizardSelectedProvider; - nextBtn.textContent = _modelWizardStep === 2 ? "Next" : "Next"; - } - if (testBtn) testBtn.style.display = _modelWizardStep === 3 ? "" : "none"; - if (refreshBtn) refreshBtn.style.display = _modelWizardStep === 3 ? "" : "none"; - if (footer) footer.style.justifyContent = _modelWizardStep === 4 ? "center" : "space-between"; - } - async function _loadModelsForSelectedProvider() { - if (!_modelWizardSelectedProvider) return false; - const loadingEl = document.getElementById("model-models-loading"); - if (loadingEl) { - loadingEl.style.display = ""; - loadingEl.style.color = "#475569"; - loadingEl.innerHTML = 'Loading models for selected provider...'; - } - _showModelWizardBusy("Querying available models..."); - try { - _selectedModelProviders = /* @__PURE__ */ new Set([_modelWizardSelectedProvider]); - _modelData.provider = _modelWizardSelectedProvider; - await _refreshModelCatalogForSelection(); - if (loadingEl) { - loadingEl.style.display = "none"; - loadingEl.textContent = ""; - } - return true; - } catch (error) { - log3.warn("Could not load models for selected provider:", error); - if (loadingEl) { - loadingEl.style.display = ""; - loadingEl.textContent = "Failed to load models for selected provider."; - loadingEl.style.color = "#b91c1c"; - } - return false; - } finally { - _hideModelWizardBusy(); - } - } - async function nextWizardStep() { - if (_modelWizardStep === 1) { - if (!_modelWizardSelectedProvider) return; - _setModelWizardStep(2); - return; - } - if (_modelWizardStep === 2) { - const loaded = await _loadModelsForSelectedProvider(); - if (!loaded) return; - _setModelWizardStep(3); - } - } - function previousWizardStep() { - if (_modelWizardStep === 2) { - _setModelWizardStep(1); - return; - } - if (_modelWizardStep === 3) { - _setModelWizardStep(2); - return; - } - if (_modelWizardStep === 4) { - _setModelWizardStep(3); - } - } - async function _refreshModelCatalogForSelection() { - if (!_modelData) return; - if (_catalogRefreshing) { - _catalogRefreshPending = true; - return; - } - _catalogRefreshing = true; - try { - const selected = Array.from(_selectedModelProviders); - if (!selected.length) { - _selectedModelProviders = /* @__PURE__ */ new Set([_modelData.provider]); - } - const providersParam = encodeURIComponent(Array.from(_selectedModelProviders).join(",")); - const catalog = await apiCall2("GET", `/api/model-catalog?providers=${providersParam}`); - _modelData.all_models = catalog.all_models || []; - _modelData.pricing_updated_at = catalog.pricing_updated_at || _modelData.pricing_updated_at; - _modelData.pricing_source = catalog.pricing_source || _modelData.pricing_source; - if (Array.isArray(catalog.providers) && catalog.providers.length) { - _modelData.providers = catalog.providers; - } - if (Array.isArray(catalog.list_models_capable)) { - _modelData.list_models_capable = catalog.list_models_capable; - } - } catch (error) { - log3.warn("Could not refresh model catalog for selected providers:", error); - } finally { - _catalogRefreshing = false; - } - _renderProviderSelector(); - _buildModelTable(); - if (_catalogRefreshPending) { - _catalogRefreshPending = false; - await _refreshModelCatalogForSelection(); - } - } - async function openModelModal() { - const overlay = document.getElementById("model-modal-overlay"); - if (!overlay) return; - if (!_modelData) { - await loadModelSelector(); - } - await loadProviderInfo(); - if (!_modelWizardSelectedProvider) { - _modelWizardSelectedProvider = _modelData?.provider || null; - } - const successSummary = document.getElementById("model-success-summary"); - if (successSummary) { - successSummary.textContent = "Provider and model are configured and the connection check succeeded."; - } - _renderProviderSelector(); - _syncCatalogVisibility(); - _wireGlobalModelSearch(); - _setModelWizardStep(1); - _hideModelWizardBusy(); - overlay.style.display = "flex"; - _focusStack.push(document.activeElement); - setInitialFocus2("model-modal-overlay"); - trapFocus2("model-modal-overlay"); - } - function closeModelModal2() { - const overlay = document.getElementById("model-modal-overlay"); - if (overlay) overlay.style.display = "none"; - _setModelWizardStep(1); - _hideModelWizardBusy(); - if (_copilotAuthPollTimer) { - clearInterval(_copilotAuthPollTimer); - _copilotAuthPollTimer = null; - } - restoreFocus2(); - } - function _applyModelRowVisualState(tr, isActive) { - tr.classList.toggle("model-row-active", isActive); - tr.style.cssText = isActive ? "background:#eff6ff; font-weight:600; cursor:pointer;" : "cursor:pointer;"; - const model = tr.getAttribute("data-model") || ""; - const modelCell = tr.cells && tr.cells[1]; - if (modelCell) { - modelCell.innerHTML = `${escapeHtml2(model)}` + (isActive ? ' ✓ active' : ""); - } - } - function _syncModelTableSelection() { - const tbody = document.getElementById("model-table-body"); - if (!tbody || !_modelData) return; - const activeProvider = _modelData.provider; - const activeModel = _modelData.model; - tbody.querySelectorAll("tr").forEach((tr) => { - const isActive = tr.getAttribute("data-provider") === activeProvider && tr.getAttribute("data-model") === activeModel; - _applyModelRowVisualState(tr, isActive); - }); - } - function _buildModelTable() { - const tbody = document.getElementById("model-table-body"); - const thead = document.getElementById("model-table-head"); - if (!tbody || !_modelData) return; - const currentProvider = _modelData.provider; - const currentModel = _modelData.model; - if (thead) { - const thS = "padding:10px 14px; white-space:nowrap;"; - thead.innerHTML = `ProviderModelContext$/1M in$/1M outCopilotSourceNotes`; - } - if (window.$ && $.fn && $.fn.DataTable && $.fn.DataTable.isDataTable("#model-table")) { - try { - _modelDataTable = $("#model-table").DataTable(); - _modelDataTable.destroy(); - } catch (e) { - log3.warn("DataTable.destroy() failed (table may already be torn down):", e); - } finally { - _modelDataTable = null; - } - } - let rows = _modelData.all_models && _modelData.all_models.length ? _modelData.all_models.filter((r) => r.model) : (_modelData.available || []).map( - (r) => typeof r === "object" ? { ...r, provider: currentProvider } : { model: r, provider: currentProvider } - ); - _renderQuickModelList(rows); - tbody.innerHTML = ""; - const tdBase = "padding:9px 14px; border-bottom:1px solid #e2e8f0;"; - const fmtCost = (v2) => v2 != null ? "$" + Number(v2).toFixed(v2 < 1 ? 3 : 2) : "\u2014"; - const fmtPriceHint = (source) => { - if (source === "runtime_cache") { - return 'cache'; - } - return 'static'; - }; - const fmtSource = (s) => { - if (s === "list_models") { - return 'list_models'; - } - return 'fallback_static'; - }; - const fmtMult = (v2) => { - if (v2 == null) return "\u2014"; - if (v2 === 0) return 'free'; - return Number(v2).toFixed(v2 % 1 === 0 ? 0 : 2) + "×"; - }; - rows.forEach((item) => { - const provider = item.provider || currentProvider; - const m2 = item.model; - const ctx = item.context_window ? Number(item.context_window).toLocaleString() : "\u2014"; - const source = item.source || "fallback_static"; - const priceSource = item.price_source || "static_baseline"; - const notes = item.notes || ""; - const isSelected = provider === currentProvider && m2 === currentModel; - const tr = document.createElement("tr"); - tr.setAttribute("data-provider", provider); - tr.setAttribute("data-model", m2); - _applyModelRowVisualState(tr, isSelected); - tr.addEventListener("mouseover", () => { - if (!tr.classList.contains("model-row-active")) tr.style.background = "#f8fafc"; - }); - tr.addEventListener("mouseout", () => { - if (!tr.classList.contains("model-row-active")) tr.style.background = ""; - }); - tr.innerHTML = `${escapeHtml2(_providerDisplayLabel(provider))}${escapeHtml2(m2)}${ctx}${fmtCost(item.cost_input)}${fmtPriceHint(priceSource)}${fmtCost(item.cost_output)}${fmtPriceHint(priceSource)}${fmtMult(item.copilot_multiplier)}${fmtSource(source)}${escapeHtml2(notes)}`; - tbody.appendChild(tr); - }); - tbody.onclick = async (event2) => { - const tr = event2.target.closest("tr"); - if (!tr) return; - const provider = tr.getAttribute("data-provider"); - const model = tr.getAttribute("data-model"); - if (!model) return; - tr.style.cssText = "background:#fef3c7; cursor:wait; opacity:0.85;"; - const modelCell = tr.cells && tr.cells[1]; - if (modelCell) { - modelCell.innerHTML = `${escapeHtml2(model)}`; - } - const status = document.getElementById("model-test-status"); - if (status) { - status.style.display = ""; - status.style.color = "#92400e"; - status.innerHTML = ` Switching to ${escapeHtml2(model)}\u2026`; - } - await setModel(model, provider); - }; - if (window.$ && $.fn && $.fn.DataTable) { - _modelDataTable = $("#model-table").DataTable({ - paging: false, - searching: true, - info: false, - orderCellsTop: true, - order: [[0, "asc"], [1, "asc"]], - autoWidth: false, - language: { search: "Filter:" }, - initComplete: function() { - const api = this.api(); - const $thead = $("#model-table thead"); - const hasFilterRow = $thead.find("tr.model-filter-row").length > 0; - if (!hasFilterRow) { - const $filterRow = $(''); - api.columns().every(function(colIdx) { - const title = $(api.column(colIdx).header()).text().trim(); - const $th = $(''); - const $input = $("", { - type: "text", - placeholder: title, - style: "width:100%; padding:4px 6px; border:1px solid #cbd5e1; border-radius:4px; font-size:0.82em;" - }); - $th.append($input); - $filterRow.append($th); - }); - $thead.append($filterRow); - } - api.columns().every(function(colIdx) { - const $input = $("#model-table thead tr.model-filter-row th").eq(colIdx).find("input"); - if (!$input.length) return; - $input.off("click.modelFilter keyup.modelFilter change.modelFilter"); - $input.on("click.modelFilter", function(event2) { - event2.stopPropagation(); - }); - $input.on("keyup.modelFilter change.modelFilter", function() { - const value = this.value; - if (api.column(colIdx).search() !== value) { - api.column(colIdx).search(value).draw(); - } - }); - }); - } - }); - } - _syncModelTableSelection(); - _updatePricingFooter(); - } - async function setModel(model, provider) { - if (!model) return; - _showModelWizardBusy(`Applying model ${model}...`); - try { - const payload = provider ? { model, provider } : { model }; - await apiCall2("POST", "/api/model", payload); - if (_modelData) { - _modelData.model = model; - if (provider) _modelData.provider = provider; - } - const effectiveProvider = _modelData && _modelData.provider || provider; - const label = document.getElementById("model-current-label"); - if (label) { - label.textContent = effectiveProvider ? `${effectiveProvider} \xB7 ${model}` : model; - } - _appendRecentModel(effectiveProvider, model); - _syncModelTableSelection(); - _renderQuickModelList(_modelData && _modelData.all_models || []); - _updateLlmStatusPill2("configured", `${effectiveProvider || "Provider"} configured`); - _saveModelPrefsToStorage({ - currentModelProvider: effectiveProvider || null, - currentModelName: model || null - }); - if (typeof globalThis.updateAuthBadge === "function") { - globalThis.updateAuthBadge({}, effectiveProvider || null); - } - await _refreshCopilotAuthStatus(); - await testCurrentModel(); - } catch (e) { - log3.error("Failed to switch model:", e); - const msg = e.message || String(e); - _syncModelTableSelection(); - const status = document.getElementById("model-test-status"); - if (status) { - status.style.display = ""; - status.style.color = "#dc2626"; - status.textContent = `\u274C ${msg}`; - } - if (typeof appendMessage === "function") { - appendMessage("system", `\u274C Model switch failed: ${msg}`); - } - } finally { - _hideModelWizardBusy(); - } - } - async function testCurrentModel() { - const badge = document.getElementById("model-test-badge"); - const status = document.getElementById("model-test-status"); - const btn = document.getElementById("model-test-btn"); - const SPIN = "\u23F3"; - const OK = "\u2705"; - const FAIL = "\u274C"; - const setRunning = () => { - if (badge) { - badge.textContent = SPIN; - badge.style.display = ""; - badge.title = "Testing\u2026"; - } - if (status) { - status.innerHTML = `${SPIN} Testing connection\u2026`; - status.style.display = ""; - } - if (btn) { - btn.disabled = true; - btn.textContent = "\u23F3 Testing\u2026"; - } - _updateLlmStatusPill2("connecting", "Connecting\u2026", "\u29D7"); - }; - const setOk = (latencyMs) => { - const tip = `Connected \u2014 ${latencyMs}ms`; - if (badge) { - badge.textContent = OK; - badge.style.display = ""; - badge.title = tip; - } - if (status) { - status.innerHTML = `${OK} ${tip}`; - status.style.color = "#16a34a"; - status.style.display = ""; - } - if (btn) { - btn.disabled = false; - btn.innerHTML = "✓ Test connection"; - } - _updateLlmStatusPill2("connected", `Healthy (${latencyMs}ms)`, "\u2713"); - const successSummary = document.getElementById("model-success-summary"); - if (successSummary) { - successSummary.textContent = `Connection verified in ${latencyMs}ms. You can close the wizard and continue.`; - } - _setModelWizardStep(4); - }; - const setFail = (errMsg) => { - if (badge) { - badge.textContent = FAIL; - badge.style.display = ""; - badge.title = errMsg; - } - if (status) { - status.innerHTML = `${FAIL} Connection failed`; - status.style.color = "#dc2626"; - status.style.display = ""; - } - if (btn) { - btn.disabled = false; - btn.innerHTML = "✓ Test connection"; - } - _updateLlmStatusPill2("error", "Connection failed", "\u26A0", errMsg); - if (_modelWizardStep === 3) { - _setModelWizardStep(2); + if (el.classList.contains("forward-skip")) { + const label = _STEP_DISPLAY[step] || step; + if (typeof confirmDialog === "function") { + confirmDialog( + `Jump ahead to ${label}? + +Intermediate stages may need re-running if you make changes here.`, + { confirmLabel: "Jump ahead", cancelLabel: "Stay here" } + ).then((confirmed) => { + if (confirmed) _doStepNavigate(step); + }); + } else { + _doStepNavigate(step); } + return; + } + if (!el.classList.contains("completed") && !el.classList.contains("active")) return; + const hasUnansweredPostAnalysisQuestions = () => { + const qs = Array.isArray(window.postAnalysisQuestions) ? window.postAnalysisQuestions : []; + if (qs.length === 0) return false; + const answers = window.questionAnswers && typeof window.questionAnswers === "object" ? window.questionAnswers : {}; + return qs.some((q2) => { + const value = answers[q2.type]; + return !value || !String(value).trim(); + }); }; - setRunning(); - _showModelWizardBusy("Testing model connection..."); - try { - const result = await apiCall2("POST", "/api/model/test"); - if (result.ok) { - setOk(result.latency_ms); - return true; + const stepToTab = { + analysis: hasUnansweredPostAnalysisQuestions() ? "questions" : "analysis", + customizations: "goals", + rewrite: "rewrite", + spell: "spell", + layout: "layout", + download: "final_generate", + cover_letter: "cover-letter", + screening: "screening", + interview_prep: "interview-prep", + thank_you: "thank-you", + harvest: "harvest" + }; + const tabName = stepToTab[step]; + if (!tabName) return; + const doNavigate = () => { + if (typeof updateTabBarForStage === "function") updateTabBarForStage(step); + switchTab(tabName); + }; + if (el.classList.contains("completed") && !el.classList.contains("active")) { + const stepIdx = _STEP_ORDER.indexOf(step); + const hasDownstreamCompleted = _STEP_ORDER.slice(stepIdx + 1).some((s) => { + const downstream = document.getElementById(`step-${s}`); + return downstream && downstream.classList.contains("completed"); + }); + if (hasDownstreamCompleted) { + _showReRunConfirmModal(step, "back-nav", doNavigate); + return; } - setFail(result.error || "Unknown error"); - return false; - } catch (e) { - setFail(e.message || String(e)); - return false; - } finally { - _hideModelWizardBusy(); } + doNavigate(); } - function _updatePricingFooter() { - const el = document.getElementById("pricing-updated-label"); - if (!el || !_modelData) return; - const ts = _modelData.pricing_updated_at; - const source = _modelData.pricing_source; - const sourceLabel = source === "openrouter" ? 'OpenRouter' : "static baseline (March 2026)"; - if (!ts) { - el.innerHTML = `Prices: ${sourceLabel}`; - return; - } + + // web/ui-core.js + var log4 = getLogger("ui-core"); + var _focusStack = []; + var _focusTrapStack = []; + var _settingsData = null; + var RETRY_POLICY_STORAGE_KEY = "cv-builder-retry-policy"; + function _getRetryPolicyFromStorage() { + const defaults = { + baseMs: 1500, + capMs: 6e4, + maxAttempts: 6, + autoRetry: true + }; try { - const d = new Date(ts); - const now = /* @__PURE__ */ new Date(); - const h = Math.round((now - d) / 36e5); - const age = h < 1 ? "just now" : h < 24 ? `${h}h ago` : `${Math.round(h / 24)}d ago`; - el.innerHTML = `Prices via ${sourceLabel} · updated ${age}`; + const raw = localStorage.getItem(RETRY_POLICY_STORAGE_KEY); + if (!raw) return defaults; + const parsed = JSON.parse(raw); + return { + baseMs: Math.max(200, Number(parsed.baseMs || defaults.baseMs)), + capMs: Math.max(1e3, Number(parsed.capMs || defaults.capMs)), + maxAttempts: Math.max(1, Number(parsed.maxAttempts || defaults.maxAttempts)), + autoRetry: parsed.autoRetry !== false + }; } catch { - el.innerHTML = `Prices: ${sourceLabel}`; + return defaults; } } - async function refreshModelPricing() { - const btn = document.getElementById("pricing-refresh-btn"); - const lbl = document.getElementById("pricing-updated-label"); - if (btn) { - btn.disabled = true; - btn.textContent = "Refreshing\u2026"; - } - _showModelWizardBusy("Refreshing model pricing..."); + function _saveRetryPolicyToStorage(policy) { try { - await apiCall2("POST", "/api/model-pricing/refresh"); - _modelData = await apiCall2("GET", "/api/model"); - _buildModelTable(); - } catch (e) { - if (lbl) lbl.textContent = "Refresh failed"; - log3.error("Pricing refresh failed:", e); - } finally { - _hideModelWizardBusy(); - if (btn) { - btn.disabled = false; - btn.textContent = "\u21BB Refresh prices"; - } + localStorage.setItem(RETRY_POLICY_STORAGE_KEY, JSON.stringify(policy)); + } catch (error) { + log4.warn("Could not save retry policy preference:", error); } } - function updateWorkflowStepsClickable2(currentPhase) { - const sequentialSteps = [ - "step-job", - "step-analysis", - "step-customizations", - "step-rewrite", - "step-spell", - "step-layout" - ]; - const postLayoutSteps = [ - "step-download", - "step-cover_letter", - "step-screening", - "step-interview_prep", - "step-thank_you", - "step-harvest" - ]; - const phaseToIndex = { - "init": 0, - "job_analysis": 1, - "customization": 2, - "rewrite_review": 3, - "spell_check": 4, - "generation": 5, - "layout_review": 5, - "final_generation": 5, - "refinement": 5, - // Legacy fallbacks (step names sometimes passed on DOMContentLoaded) - "job": 0, - "layout": 5, - "finalise": 5 - }; - const postLayoutUnlocked = ["final_generation", "refinement"].includes(currentPhase); - const currentIdx = phaseToIndex[currentPhase] ?? 0; - function _makeStepClickable(el) { - if (!el || el.classList.contains("clickable")) return; - el.classList.add("clickable"); - el.setAttribute("role", "button"); - el.setAttribute("tabindex", "0"); - if (!el._stepKeyHandler) { - el._stepKeyHandler = (e) => { - if (e.key === "Enter" || e.key === " ") { - e.preventDefault(); - el.click(); - } - }; - el.addEventListener("keydown", el._stepKeyHandler); - } + function _settingsSourceLabel(meta, key, runtimeOverrides = null) { + if (runtimeOverrides && key in runtimeOverrides) { + return "Source: runtime selection"; } - function _makeStepInert(el) { + const source = meta?.sources?.[key] || "default"; + const envKey = meta?.env_keys?.[key] || null; + if (source === "env") return `Source: environment variable (${envKey || "locked"})`; + if (source === "dotenv") return `Source: .env (${envKey || "locked"})`; + if (source === "config") return "Source: config.yaml"; + return "Source: built-in default"; + } + function _renderSettingsSources(meta, runtimeOverrides = null) { + const sourceTargets = [ + "llm.default_provider", + "llm.default_model", + "llm.request_timeout_seconds", + "llm.temperature", + "generation.max_skills", + "generation.max_achievements", + "generation.max_publications", + "generation.skills_section_title", + "generation.formats.ats_docx", + "generation.formats.human_pdf", + "generation.formats.human_docx" + ]; + sourceTargets.forEach((key) => { + const el = document.getElementById(`source-${key}`); if (!el) return; - el.classList.remove("clickable"); - el.removeAttribute("role"); - el.setAttribute("tabindex", "-1"); - if (el._stepKeyHandler) { - el.removeEventListener("keydown", el._stepKeyHandler); - delete el._stepKeyHandler; - } + el.textContent = _settingsSourceLabel(meta, key, runtimeOverrides); + const runtimeKey = runtimeOverrides && key in runtimeOverrides; + const isLocked = Boolean(meta?.locked?.[key]); + el.style.color = runtimeKey ? "#1e40af" : isLocked ? "#b45309" : "#64748b"; + }); + } + function _setSettingsStatus(message, kind = "info") { + const el = document.getElementById("settings-status-msg"); + if (!el) return; + el.style.display = ""; + if (kind === "success") { + el.style.background = "#ecfdf5"; + el.style.border = "1px solid #86efac"; + el.style.color = "#166534"; + } else if (kind === "error") { + el.style.background = "#fef2f2"; + el.style.border = "1px solid #fecaca"; + el.style.color = "#991b1b"; + } else { + el.style.background = "#eff6ff"; + el.style.border = "1px solid #bfdbfe"; + el.style.color = "#1e40af"; } - sequentialSteps.forEach((id, idx) => { - const el = document.getElementById(id); - if (!el) return; - if (idx <= currentIdx || postLayoutUnlocked) { - _makeStepClickable(el); - } else { - _makeStepInert(el); + el.textContent = message; + } + function _collectSettingsPayloadFromForm() { + return { + llm: { + default_provider: document.getElementById("settings-llm-default-provider")?.value?.trim() || null, + default_model: document.getElementById("settings-llm-default-model")?.value?.trim() || null, + request_timeout_seconds: Number(document.getElementById("settings-llm-request-timeout")?.value || 120), + temperature: Number(document.getElementById("settings-llm-temperature")?.value || 0.7) + }, + generation: { + max_skills: Number(document.getElementById("settings-gen-max-skills")?.value || 20), + max_achievements: Number(document.getElementById("settings-gen-max-achievements")?.value || 5), + max_publications: Number(document.getElementById("settings-gen-max-publications")?.value || 10), + skills_section_title: document.getElementById("settings-gen-skills-title")?.value?.trim() || "Skills", + formats: { + ats_docx: Boolean(document.getElementById("settings-format-ats-docx")?.checked), + human_pdf: Boolean(document.getElementById("settings-format-human-pdf")?.checked), + human_docx: Boolean(document.getElementById("settings-format-human-docx")?.checked) + }, + ai_attribution: Boolean(document.getElementById("settings-gen-ai-attribution")?.checked) } - }); - postLayoutSteps.forEach((id) => { + }; + } + function _collectRetryPolicyFromForm() { + return { + baseMs: Number(document.getElementById("settings-retry-base-ms")?.value || 1500), + capMs: Number(document.getElementById("settings-retry-cap-ms")?.value || 6e4), + maxAttempts: Number(document.getElementById("settings-retry-max-attempts")?.value || 6), + autoRetry: Boolean(document.getElementById("settings-retry-auto")?.checked) + }; + } + function _renderSettingsToForm(payload) { + const settings = payload?.settings || {}; + const llm = settings.llm || {}; + const generation = settings.generation || {}; + const formats = generation.formats || {}; + const runtimeProvider = payload?.runtime?.llm?.provider || null; + const runtimeModel = payload?.runtime?.llm?.model || null; + const runtimeOverrides = {}; + if (runtimeProvider) runtimeOverrides["llm.default_provider"] = runtimeProvider; + if (runtimeModel) runtimeOverrides["llm.default_model"] = runtimeModel; + const setValue = (id, value) => { const el = document.getElementById(id); - if (!el) return; - if (postLayoutUnlocked) { - _makeStepClickable(el); - } else { - _makeStepInert(el); - } - }); - const allStepIds = [...sequentialSteps, ...postLayoutSteps]; - allStepIds.forEach((id) => { + if (el) el.value = value ?? ""; + }; + const setChecked = (id, value) => { const el = document.getElementById(id); - if (el) el.removeAttribute("aria-current"); - }); - const activeStepId = postLayoutUnlocked ? "step-download" : sequentialSteps[currentIdx]; - if (activeStepId) { - const activeEl = document.getElementById(activeStepId); - if (activeEl) activeEl.setAttribute("aria-current", "step"); + if (el) el.checked = Boolean(value); + }; + setValue("settings-llm-default-provider", runtimeProvider || llm.default_provider || ""); + setValue("settings-llm-default-model", runtimeModel || llm.default_model || ""); + setValue("settings-llm-request-timeout", llm.request_timeout_seconds ?? 120); + setValue("settings-llm-temperature", llm.temperature ?? 0.7); + setValue("settings-gen-max-skills", generation.max_skills ?? 20); + setValue("settings-gen-max-achievements", generation.max_achievements ?? 5); + setValue("settings-gen-max-publications", generation.max_publications ?? 10); + setValue("settings-gen-skills-title", generation.skills_section_title || "Skills"); + setChecked("settings-format-ats-docx", formats.ats_docx); + setChecked("settings-format-human-pdf", formats.human_pdf); + setChecked("settings-format-human-docx", formats.human_docx); + setChecked("settings-gen-ai-attribution", generation.ai_attribution); + const retryPolicy = _getRetryPolicyFromStorage(); + setValue("settings-retry-base-ms", retryPolicy.baseMs); + setValue("settings-retry-cap-ms", retryPolicy.capMs); + setValue("settings-retry-max-attempts", retryPolicy.maxAttempts); + setChecked("settings-retry-auto", retryPolicy.autoRetry); + _renderSettingsSources(payload.meta || {}, runtimeOverrides); + const pathEl = document.getElementById("settings-config-path"); + if (pathEl) { + pathEl.textContent = payload?.meta?.config_path ? `Config file: ${payload.meta.config_path}` : ""; } } - document.addEventListener("DOMContentLoaded", () => { - loadModelSelector(); - const tabBar = document.getElementById("tab-bar"); - const leftBtn = document.getElementById("tab-scroll-left"); - const rightBtn = document.getElementById("tab-scroll-right"); - if (tabBar && leftBtn && rightBtn) { - leftBtn.addEventListener("click", () => { - tabBar.scrollBy({ left: -160, behavior: "smooth" }); - }); - rightBtn.addEventListener("click", () => { - tabBar.scrollBy({ left: 160, behavior: "smooth" }); - }); - tabBar.addEventListener("scroll", updateTabScrollButtons); - new ResizeObserver(updateTabScrollButtons).observe(tabBar); + async function reloadSettingsModal() { + try { + _setSettingsStatus("Loading settings...", "info"); + const [result, status] = await Promise.all([fetchSettings(), fetchStatus2().catch(() => null)]); + _renderSettingsToForm(result); + const attrEl = document.getElementById("settings-gen-ai-attribution"); + if (attrEl && status) attrEl.checked = Boolean(status.ai_attribution); + _setSettingsStatus("Settings loaded.", "success"); + } catch (error) { + _setSettingsStatus(`Failed to load settings: ${error.message || error}`, "error"); } - updateTabBarForStage2("job"); - updateWorkflowStepsClickable2("job"); - if (typeof stateManager2?.onPhaseChange === "function") { - stateManager2.onPhaseChange((phase) => { - updateWorkflowStepsClickable2(phase); - }); + } + async function saveSettingsModal() { + const saveBtn = document.getElementById("settings-save-btn"); + try { + if (saveBtn) { + saveBtn.disabled = true; + saveBtn.textContent = "Saving..."; + } + _setSettingsStatus("Saving settings...", "info"); + const payload = _collectSettingsPayloadFromForm(); + const aiAttribution = Boolean(payload.generation?.ai_attribution); + const result = await updateSettings(payload); + _saveRetryPolicyToStorage(_collectRetryPolicyFromForm()); + _settingsData = result; + _renderSettingsToForm(result); + try { + await apiCall2("POST", "/api/generation-settings", { ai_attribution: aiAttribution }); + } catch (_2) { + } + _setSettingsStatus("Settings saved successfully.", "success"); + } catch (error) { + _setSettingsStatus(`Failed to save settings: ${error.message || error}`, "error"); + } finally { + if (saveBtn) { + saveBtn.disabled = false; + saveBtn.textContent = "Save Settings"; + } } - }); - - // web/layout-instruction.js - var layout_instruction_exports = {}; - __export(layout_instruction_exports, { - addToInstructionHistory: () => addToInstructionHistory, - applyAcceptedProposals: () => applyAcceptedProposals, - completeLayoutReview: () => completeLayoutReview, - confirmLayoutReview: () => confirmLayoutReview, - displayLayoutPreview: () => displayLayoutPreview, - generateFinalOutputs: () => generateFinalOutputs, - handleLayoutPrimaryAction: () => handleLayoutPrimaryAction2, - initiateLayoutInstructions: () => initiateLayoutInstructions2, - loadLayoutInstructionHistory: () => loadLayoutInstructionHistory, - pxToPt: () => pxToPt, - renderContentProposals: () => renderContentProposals, - renderDirtyPhasesCallout: () => renderDirtyPhasesCallout, - renderInstructionHistory: () => renderInstructionHistory, - renderLayoutPreviewStatus: () => renderLayoutPreviewStatus, - renderPreviewOutputStatus: () => renderPreviewOutputStatus, - showConfirmationMessage: () => showConfirmationMessage, - showProcessing: () => showProcessing, - submitContentProposal: () => submitContentProposal, - submitLayoutInstruction: () => submitLayoutInstruction, - submitSmartInstruction: () => submitSmartInstruction, - undoInstruction: () => undoInstruction - }); - - // web/ats-refinement.js - var ats_refinement_exports = {}; - __export(ats_refinement_exports, { - formatAtsScoreSummary: () => formatAtsScoreSummary, - refreshAtsScore: () => refreshAtsScore2, - scheduleAtsRefresh: () => scheduleAtsRefresh2, - updateAtsBadge: () => updateAtsBadge2 - }); - function _dispatchAtsScoreUpdated() { - document.dispatchEvent(new CustomEvent("ats-score-updated")); } - function _safeText(value) { - return typeof value === "string" ? value.trim() : ""; + async function openSettingsModal() { + const overlay = document.getElementById("settings-modal-overlay"); + if (!overlay) return; + overlay.style.display = "flex"; + _focusStack.push(document.activeElement); + setInitialFocus2("settings-modal-overlay"); + trapFocus2("settings-modal-overlay"); + await reloadSettingsModal(); } - function _coerceObject(value) { - return value && typeof value === "object" ? value : {}; + function closeSettingsModal() { + const overlay = document.getElementById("settings-modal-overlay"); + if (overlay) overlay.style.display = "none"; + restoreFocus2(); } - function _formatDateLabel(value) { - const text2 = _safeText(value); - if (!text2) return ""; - if (/^\d{4}-\d{2}-\d{2}$/.test(text2)) { - const [year, month, day] = text2.split("-"); - return `${month}/${day}/${year}`; - } - const parsed = new Date(text2); - if (!Number.isNaN(parsed.getTime())) { - return parsed.toISOString().slice(0, 10); - } - return text2; + function getFocusableElements(container) { + const focusableSelectors = [ + "a[href]", + "button:not([disabled])", + "input:not([disabled])", + "textarea:not([disabled])", + "select:not([disabled])", + '[tabindex]:not([tabindex="-1"])' + ].join(", "); + return Array.from(container.querySelectorAll(focusableSelectors)); } - function _getPageLengthLabel() { - const generationState2 = _coerceObject(globalThis.stateManager?.getGenerationState?.()); - const exact = Number(generationState2.pageCountExact); - if (Number.isFinite(exact) && exact > 0) { - return `Length ${exact} page${exact === 1 ? "" : "s"}`; - } - const estimate = Number(generationState2.pageCountEstimate); - if (Number.isFinite(estimate) && estimate > 0) { - return `Length ${estimate.toFixed(1)} pages est`; + function setInitialFocus2(modalId) { + const modal = document.getElementById(modalId); + if (!modal) return; + const focusTarget = modal.querySelector('[data-focus-target="true"]') || modal.querySelector('input[type="text"]') || modal.querySelector("button"); + if (focusTarget) { + setTimeout(() => focusTarget.focus(), 50); } - return ""; } - function _getJobSummaryLabel() { - const intake = _coerceObject(window._statusIntake); - const analysis = _coerceObject(globalThis.stateManager?.getTabData?.("analysis")); - const positionFallback = _safeText(document.getElementById("position-title")?.textContent || ""); - const role = _safeText( - intake.role || analysis.job_title || analysis.title || analysis.position_name || "" - ); - const company = _safeText(intake.company || analysis.company_name || analysis.company || ""); - const dateApplied = _formatDateLabel( - intake.date_applied || analysis.date_applied || analysis.application_date || "" - ); - const primary = role && company ? `${role} @ ${company}` : role || company || positionFallback; - if (!primary) return ""; - if (!dateApplied) return primary; - return `${primary} (${dateApplied})`; + function trapFocus2(modalId) { + const modal = document.getElementById(modalId); + if (!modal) return; + const focusableElements = getFocusableElements(modal); + if (focusableElements.length === 0) return; + const firstElement = focusableElements[0]; + const lastElement = focusableElements[focusableElements.length - 1]; + const listener = (e) => { + if (e.key !== "Tab") return; + const isShift = e.shiftKey; + const activeEl = document.activeElement; + if (isShift) { + if (activeEl === firstElement) { + e.preventDefault(); + lastElement.focus(); + } + } else { + if (activeEl === lastElement) { + e.preventDefault(); + firstElement.focus(); + } + } + }; + document.addEventListener("keydown", listener); + _focusTrapStack.push(listener); } - function _keywordCount(keywords, type, statuses = ["matched", "partial"]) { - return keywords.filter((keyword) => keyword.type === type && statuses.includes(keyword.status)).length; + function restoreFocus2() { + const el = _focusStack.pop(); + if (el && typeof el.focus === "function") el.focus(); + const listener = _focusTrapStack.pop(); + if (listener) document.removeEventListener("keydown", listener); } - function _buildSummaryDetail(score, keywords) { - const missingHard = keywords.filter((keyword) => keyword.type === "hard" && keyword.status === "missing").map((keyword) => keyword.keyword).filter(Boolean); - if (missingHard.length > 0) { - const preview = missingHard.slice(0, 2).join(", "); - const suffix = missingHard.length > 2 ? ` +${missingHard.length - 2} more` : ""; - return `Missing hard: ${preview}${suffix}`; - } - const exact = keywords.filter((keyword) => keyword.match_type === "exact" || keyword.match_type === "synonym").length; - const partial = keywords.filter((keyword) => keyword.match_type === "partial").length; - const topSections = Object.entries(score.section_scores || {}).filter(([, value]) => typeof value === "number" && value > 0).sort((left, right) => right[1] - left[1]).slice(0, 2).map(([section, value]) => `${section} ${Math.round(value)}%`); - if (topSections.length > 0) { - return `Top sections: ${topSections.join(" \u2022 ")}`; - } - if (exact > 0 || partial > 0) { - return `Match quality: ${exact} exact \u2022 ${partial} partial`; - } - return `Basis: ${score.basis || "review"}`; + function pushFocusStack2(el) { + _focusStack.push(el || document.activeElement); } - function formatAtsScoreSummary(score) { - const keywords = Array.isArray(score?.keyword_status) ? score.keyword_status : []; - const overall = typeof score?.overall === "number" ? Math.round(score.overall) : null; - if (overall === null) { - return { overall: null, line: "", detail: "", keywords }; - } - if (keywords.length === 0) { - return { - overall, - line: `Overall ${overall}%`, - detail: `Basis: ${score.basis || "review"}`, - keywords + var STAGE_TABS = { + job: ["job", "master"], + analysis: ["analysis"], + customizations: ["goals", "questions", "exp-review", "ach-editor", "skills-review", "achievements-review", "tagline-review", "summary-review", "publications-review", "ats-score"], + rewrite: ["rewrite"], + spell: ["spell"], + layout: ["layout"], + download: ["final_generate", "download"], + cover_letter: ["cover-letter"], + screening: ["screening"], + interview_prep: ["interview-prep"], + thank_you: ["thank-you"], + harvest: ["harvest"] + }; + function confirmDialog2(message, { confirmLabel = "OK", cancelLabel = "Cancel", danger = false } = {}) { + return new Promise((resolve) => { + const previousFocus = document.activeElement; + let overlay = document.getElementById("confirm-dialog-overlay"); + if (!overlay) { + overlay = document.createElement("div"); + overlay.id = "confirm-dialog-overlay"; + overlay.style.cssText = "display:none; position:fixed; inset:0; background:rgba(0,0,0,0.45); z-index:9999;align-items:center; justify-content:center;"; + overlay.innerHTML = ''; + document.body.appendChild(overlay); + } + const okBtn = document.getElementById("confirm-dialog-ok"); + const cancelBtn = document.getElementById("confirm-dialog-cancel"); + const msgEl = document.getElementById("confirm-dialog-msg"); + msgEl.textContent = message; + okBtn.textContent = confirmLabel; + cancelBtn.textContent = cancelLabel; + okBtn.style.background = danger ? "#dc2626" : "#3b82f6"; + overlay.style.display = "flex"; + okBtn.focus(); + const trapFocus3 = (e) => { + if (e.key !== "Tab") return; + e.preventDefault(); + const focused = document.activeElement; + if (e.shiftKey) { + (focused === cancelBtn ? okBtn : cancelBtn).focus(); + } else { + (focused === okBtn ? cancelBtn : okBtn).focus(); + } }; - } - const hardTotal = keywords.filter((keyword) => keyword.type === "hard").length; - const softTotal = keywords.filter((keyword) => keyword.type === "soft").length; - const bonusTotal = keywords.filter((keyword) => keyword.type === "bonus").length; - const summaryParts = []; - if (hardTotal > 0) { - summaryParts.push(`Hard ${_keywordCount(keywords, "hard")}/${hardTotal}`); - } - if (softTotal > 0) { - summaryParts.push(`Soft ${_keywordCount(keywords, "soft")}/${softTotal}`); - } - if (bonusTotal > 0) { - summaryParts.push(`Bonus ${_keywordCount(keywords, "bonus")}/${bonusTotal}`); - } - return { - overall, - line: summaryParts.join(" \u2022 ") || `Overall ${overall}%`, - detail: _buildSummaryDetail(score, keywords), - keywords - }; + overlay.addEventListener("keydown", trapFocus3); + const finish = (result) => { + overlay.style.display = "none"; + overlay.removeEventListener("keydown", trapFocus3); + okBtn.replaceWith(okBtn.cloneNode(true)); + cancelBtn.replaceWith(cancelBtn.cloneNode(true)); + if (previousFocus && typeof previousFocus.focus === "function") { + previousFocus.focus(); + } + resolve(result); + }; + overlay.addEventListener("keydown", (e) => { + if (e.key === "Escape") finish(false); + }, { once: true }); + document.getElementById("confirm-dialog-ok").addEventListener("click", () => finish(true), { once: true }); + document.getElementById("confirm-dialog-cancel").addEventListener("click", () => finish(false), { once: true }); + overlay.addEventListener("click", (e) => { + if (e.target === overlay) finish(false); + }, { once: true }); + }); } - function _updateAtsSummary(score) { - const header = document.getElementById("ats-score-header"); - const summary = document.getElementById("ats-score-summary"); - const summaryLine = document.getElementById("ats-score-summary-line"); - const summaryDetail = document.getElementById("ats-score-summary-detail"); - if (!header || !summary || !summaryLine || !summaryDetail) return; - const keywords = Array.isArray(score?.keyword_status) ? score.keyword_status : []; - const hasScore = score && typeof score.overall === "number"; - const pageLengthLabel = _getPageLengthLabel(); - const jobSummaryLabel = _getJobSummaryLabel(); - if (!hasScore) { - header.style.display = "none"; - summary.style.display = "none"; - summaryLine.textContent = ""; - summaryDetail.textContent = ""; - return; - } - header.style.display = "flex"; - const summaryContent = formatAtsScoreSummary(score); - const lineParts = [summaryContent.line, pageLengthLabel].filter(Boolean); - const detailParts = [jobSummaryLabel, summaryContent.detail].filter(Boolean); - if (lineParts.length === 0 && detailParts.length === 0 && keywords.length === 0) { - summary.style.display = "none"; - summaryLine.textContent = ""; - summaryDetail.textContent = ""; - return; + function setupEventListeners() { + document.querySelectorAll(".tab").forEach((tab) => { + tab.addEventListener("click", (e) => { + const tabName = e.target.id.replace("tab-", ""); + switchTab(tabName); + }); + tab.addEventListener("keydown", (e) => { + if (e.key === "Enter" || e.key === " ") { + e.preventDefault(); + e.target.click(); + return; + } + if (["ArrowLeft", "ArrowRight", "Home", "End"].includes(e.key)) { + e.preventDefault(); + const tabs = Array.from(document.querySelectorAll('.tab:not([style*="display: none"])')); + const currentIndex = tabs.indexOf(e.target); + let nextTab; + if (e.key === "ArrowLeft" || e.key === "Home") { + nextTab = e.key === "Home" ? tabs[0] : tabs[(currentIndex - 1 + tabs.length) % tabs.length]; + } else { + nextTab = e.key === "End" ? tabs[tabs.length - 1] : tabs[(currentIndex + 1) % tabs.length]; + } + if (nextTab) { + nextTab.focus(); + nextTab.click(); + } + } + }); + }); + const messageInput = document.getElementById("message-input"); + if (messageInput) { + messageInput.addEventListener("keypress", (e) => { + if (e.key === "Enter" && !e.shiftKey) { + e.preventDefault(); + if (typeof globalThis.sendMessage === "function") { + globalThis.sendMessage(); + } + } + }); } - summaryLine.textContent = lineParts.join(" \u2022 "); - summaryDetail.textContent = detailParts.join(" \u2022 "); - summary.style.display = "flex"; + document.addEventListener("keydown", (e) => { + if (e.key === "Escape") { + closeAllModals(); + } + }); + document.querySelectorAll('[role="dialog"]').forEach((modal) => { + modal.addEventListener("click", (e) => { + if (e.target === modal) { + closeModal(modal.id); + } + }); + }); } - function updateAtsBadge2(score) { - _updateAtsSummary(score); - const badge = document.getElementById("ats-score-badge"); - const valueEl = document.getElementById("ats-score-value"); - if (!badge || !valueEl) { - _dispatchAtsScoreUpdated(); - return; - } - if (!score || typeof score.overall !== "number") { - badge.style.display = "none"; - _dispatchAtsScoreUpdated(); - return; - } - const overall = Math.round(score.overall); - valueEl.textContent = `${overall}%`; - badge.style.display = "flex"; - badge.classList.remove("score-high", "score-medium", "score-low"); - if (overall >= 75) { - badge.classList.add("score-high"); - } else if (overall >= 50) { - badge.classList.add("score-medium"); - } else { - badge.classList.add("score-low"); + function getStageForTab2(tab) { + for (const [stage, tabs] of Object.entries(STAGE_TABS)) { + if (tabs.includes(tab)) return stage; } - badge.setAttribute("aria-label", `ATS match score: ${overall}% (${score.basis || "review"})`); - _dispatchAtsScoreUpdated(); + return null; } - async function refreshAtsScore2(basis = "review_checkpoint") { - const sessionId2 = globalThis.stateManager?.getSessionId?.(); - if (!sessionId2) return; - try { - const res = await fetch("/api/cv/ats-score", { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ session_id: sessionId2, basis }) - }); - if (!res.ok) return; - const data = await res.json(); - if (data.ok && data.ats_score) { - globalThis.stateManager?.setAtsScore?.(data.ats_score); - updateAtsBadge2(data.ats_score); + function getVisibleStage() { + const activeTab = stateManager2.getCurrentTab(); + return getStageForTab2(activeTab) || getWorkflowStepForPhase(stateManager2.getPhase()); + } + function updateTabScrollButtons() { + const tabBar = document.getElementById("tab-bar"); + const leftBtn = document.getElementById("tab-scroll-left"); + const rightBtn = document.getElementById("tab-scroll-right"); + if (!tabBar || !leftBtn || !rightBtn) return; + leftBtn.style.display = tabBar.scrollLeft > 0 ? "" : "none"; + rightBtn.style.display = tabBar.scrollLeft < tabBar.scrollWidth - tabBar.clientWidth - 1 ? "" : "none"; + } + function updateTabBarForStage2(stage) { + const stageTabs = STAGE_TABS[stage] || []; + document.querySelectorAll(".tab").forEach((tab) => { + tab.style.display = stageTabs.includes(tab.dataset.tab) ? "" : "none"; + }); + const tabBar = document.getElementById("tab-bar"); + if (tabBar) tabBar.scrollLeft = 0; + updateTabScrollButtons(); + const labelEl = document.getElementById("tab-stage-label"); + if (labelEl) { + const stepLabel = _STEP_DISPLAY[stage] || stage; + labelEl.textContent = stepLabel ? `Now viewing: ${stepLabel}` : ""; + } + } + function toggleChat() { + const interactionArea = document.querySelector(".interaction-area"); + const viewerArea = document.querySelector(".viewer-area"); + if (interactionArea) { + const isCollapsed = interactionArea.classList.toggle("collapsed"); + if (viewerArea) { + viewerArea.style.flex = isCollapsed ? "1 1 100%" : "0 1 60%"; + } + const toggleBtn = document.getElementById("toggle-chat"); + if (toggleBtn) { + toggleBtn.setAttribute("aria-expanded", String(!isCollapsed)); + toggleBtn.setAttribute("aria-label", isCollapsed ? "Expand chat panel" : "Collapse chat panel"); + } + try { + localStorage.setItem(StorageKeys2.CHAT_COLLAPSED, isCollapsed); + } catch (e) { + log4.warn("Could not save chat state"); } - } catch (_e2) { } } - var _atsRefreshTimer = null; - function scheduleAtsRefresh2(basis = "review_checkpoint") { - clearTimeout(_atsRefreshTimer); - _atsRefreshTimer = setTimeout(() => refreshAtsScore2(basis), 600); + function openModal(modalId) { + const modal = document.getElementById(modalId); + if (modal) { + _focusStack.push(document.activeElement); + modal.classList.add("visible"); + modal.setAttribute("aria-hidden", "false"); + document.body.style.overflow = "hidden"; + setInitialFocus2(modalId); + trapFocus2(modalId); + } } - function _refreshSummaryFromState() { - const score = globalThis.stateManager?.getAtsScore?.(); - if (score && typeof score.overall === "number") { - _updateAtsSummary(score); + function closeModal(modalId) { + const modal = document.getElementById(modalId); + if (modal) { + if (modal.dataset.dismissDisabled === "1") return; + modal.classList.remove("visible"); + modal.setAttribute("aria-hidden", "true"); + if (!document.querySelector('[role="dialog"].visible')) { + document.body.style.overflow = ""; + } + restoreFocus2(); } } - if (typeof window !== "undefined") { - window.addEventListener("cvbuilder:generation-state-changed", () => { - _refreshSummaryFromState(); + function closeAllModals() { + document.querySelectorAll('[role="dialog"]').forEach((modal) => { + if (modal.dataset.dismissDisabled === "1") return; + modal.classList.remove("visible"); + modal.setAttribute("aria-hidden", "true"); + if (modal.style.display && modal.style.display !== "none") { + modal.style.display = "none"; + } }); + document.body.style.overflow = ""; + restoreFocus2(); } - if (typeof document !== "undefined") { - const positionTitleEl = document.getElementById("position-title"); - if (positionTitleEl && typeof MutationObserver !== "undefined") { - const titleObserver = new MutationObserver(() => { - _refreshSummaryFromState(); - }); - titleObserver.observe(positionTitleEl, { - childList: true, - characterData: true, - subtree: true - }); + var _modelData = null; + var _modelDataTable = null; + var _selectedModelProviders = /* @__PURE__ */ new Set(); + var _modelSelectorLoading = false; + var _catalogRefreshing = false; + var _catalogRefreshPending = false; + var _showFullModelCatalog = false; + var _copilotAuthPollTimer = null; + var _modelWizardStep = 1; + var _modelWizardSelectedProvider = null; + function _getModelPrefsFromStorage() { + try { + const saved = localStorage.getItem(StorageKeys2.TAB_DATA); + return saved ? JSON.parse(saved) || {} : {}; + } catch { + return {}; } } - - // web/message-queue.js - var message_queue_exports = {}; - __export(message_queue_exports, { - _flushMessageQueue: () => _flushMessageQueue2, - _messageQueue: () => _messageQueue, - appendFormattedAnalysis: () => appendFormattedAnalysis2, - appendFormattedResponse: () => appendFormattedResponse, - appendLoadingMessage: () => appendLoadingMessage2, - appendMessage: () => appendMessage2, - appendMessageHtml: () => appendMessageHtml, - appendRawHtml: () => appendRawHtml2, - appendRetryMessage: () => appendRetryMessage2, - removeLoadingMessage: () => removeLoadingMessage2 - }); - var log4 = getLogger("message-queue"); - var _messageQueue = []; - function _flushMessageQueue2() { - while (_messageQueue.length) { - const { type, text: text2 } = _messageQueue.shift(); - appendMessage2(type, text2); + function _saveModelPrefsToStorage(patch) { + try { + const parsed = _getModelPrefsFromStorage(); + localStorage.setItem(StorageKeys2.TAB_DATA, JSON.stringify({ ...parsed, ...patch })); + } catch (e) { + log4.warn("Failed to persist model preferences locally:", e); } } - function appendLoadingMessage2(text2) { - const conversation = document.getElementById("conversation"); - const message = document.createElement("div"); - message.className = "message system"; - const content = document.createElement("div"); - content.className = "content loading-message"; - content.innerHTML = `
    ${text2}`; - message.appendChild(content); - conversation.appendChild(message); - conversation.scrollTop = conversation.scrollHeight; - return message; - } - function removeLoadingMessage2(messageElement) { - if (messageElement && messageElement.parentNode) { - messageElement.parentNode.removeChild(messageElement); - } + function _appendRecentModel(provider, model) { + if (!provider || !model) return; + const parsed = _getModelPrefsFromStorage(); + const existing = Array.isArray(parsed.recentModels) ? parsed.recentModels : []; + const filtered = existing.filter((item) => !(item.provider === provider && item.model === model)); + filtered.unshift({ provider, model }); + _saveModelPrefsToStorage({ recentModels: filtered.slice(0, 6) }); } - function appendMessageHtml(type, html2) { - const conversation = document.getElementById("conversation"); - const message = document.createElement("div"); - message.className = `message ${type}`; - const content = document.createElement("div"); - content.className = "content"; - content.innerHTML = html2; - message.appendChild(content); - conversation.appendChild(message); - conversation.scrollTop = conversation.scrollHeight; + function _updateLlmStatusPill2(kind, text2, icon = "", tooltip = "") { + const pill = document.getElementById("llm-status-pill"); + const label = document.getElementById("llm-status-label"); + const iconEl = document.getElementById("llm-status-icon"); + if (!pill || !label) return; + const aliases = { + authenticated: "connected", + unauthenticated: "unconfigured", + polling: "connecting" + }; + const normalizedKind = aliases[kind] || kind || "unconfigured"; + const defaultTooltip = { + unconfigured: "No provider/model is configured yet.", + configured: "Provider/model is configured. Connectivity not yet verified.", + connecting: "Testing or connecting to the selected provider.", + connected: "Provider responded successfully to a live request.", + "auth-required": "Authentication is required. Check API key or sign in.", + "rate-limited": "Rate limit reached. Wait before retrying requests.", + unavailable: "Provider is temporarily unavailable or unreachable.", + error: "Connection failed. Open model settings for details." + }; + pill.classList.remove("authenticated", "unauthenticated", "polling", "unconfigured", "configured", "connecting", "connected", "auth-required", "rate-limited", "unavailable", "error"); + if (normalizedKind) pill.classList.add(normalizedKind); + label.textContent = text2; + const iconByKind = { + unconfigured: "\u25CB", + configured: "\u25D4", + connecting: "\u29D7", + connected: "\u2713", + "auth-required": "\u{1F511}", + "rate-limited": "\u23F3", + unavailable: "\u2601", + error: "\u26A0" + }; + const iconText = icon || iconByKind[normalizedKind] || "\u26A0"; + if (iconEl) iconEl.textContent = iconText; + const tooltipText = tooltip || defaultTooltip[normalizedKind] || ""; + pill.title = tooltipText; + if (iconEl) iconEl.title = tooltipText; + label.title = tooltipText; } - var COLLAPSE_LINE_THRESHOLD = 8; - var COLLAPSE_CHAR_THRESHOLD = 480; - function _makeCollapsibleContent(html2, textStr) { - const lines = textStr.split("\n"); - if (lines.length <= COLLAPSE_LINE_THRESHOLD && textStr.length <= COLLAPSE_CHAR_THRESHOLD) { - return { html: html2, collapsible: false }; - } - const previewLines = lines.slice(0, COLLAPSE_LINE_THRESHOLD); - const previewHtml = escapeHtml2(previewLines.join("\n")).replace(/\*\*(.+?)\*\*/g, "$1").replace(/\*(.+?)\*/g, "$1").replace(/`([^`]+)`/g, "$1").replace(/\n/g, "
    "); - const overflow = lines.length - COLLAPSE_LINE_THRESHOLD; - const id = `collapsible-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`; - const wrapped = ` -
    ${previewHtml}
    - - `; - return { html: wrapped, collapsible: true }; + } catch (e) { + log4.warn("Could not load model list:", e); + } finally { + _modelSelectorLoading = false; + } + } + function _providerStageLabel(provider, capableSet) { + const isCapable = capableSet.has(provider); + return isCapable ? "list_models" : "fallback"; + } + function _providerDisplayLabel(provider) { + const deprecated = { + "copilot-oauth": "Copilot OAuth (deprecated)", + copilot: "Copilot (deprecated)", + github: "GitHub Models (deprecated)", + "copilot-sdk": "Copilot SDK (recommended)" + }; + if (deprecated[provider]) return deprecated[provider]; + return provider; } - function appendMessage2(type, text2) { - const conversation = document.getElementById("conversation"); - if (!conversation) { - _messageQueue.push({ type, text: text2 }); - return null; + function _getQuickModelCandidates(rows) { + const parsed = _getModelPrefsFromStorage(); + const recents = Array.isArray(parsed.recentModels) ? parsed.recentModels : []; + const ranked = []; + for (const recent of recents) { + const hit = rows.find((row) => row.provider === recent.provider && row.model === recent.model); + if (hit) ranked.push(hit); } - const message = document.createElement("div"); - message.className = `message ${type}`; - const content = document.createElement("div"); - content.className = "content"; - const textStr = typeof text2 === "string" ? text2 : JSON.stringify(text2, null, 2); - const renderedHtml = escapeHtml2(textStr).replace(/\*\*(.+?)\*\*/g, "$1").replace(/\*(.+?)\*/g, "$1").replace(/`([^`]+)`/g, "$1").replace(/\n/g, "
    "); - if (type === "user" || type === "assistant") { - const { html: html2, collapsible } = _makeCollapsibleContent(renderedHtml, textStr); - content.innerHTML = html2; - if (collapsible) content.classList.add("collapsible-msg"); - } else { - content.innerHTML = renderedHtml; + const popular = [...rows].sort((a, b2) => { + const am = Number(a.copilot_multiplier ?? 999); + const bm = Number(b2.copilot_multiplier ?? 999); + if (am !== bm) return am - bm; + const ac = Number(a.context_window || 0); + const bc = Number(b2.context_window || 0); + return bc - ac; + }); + for (const item of popular) { + if (!ranked.some((r) => r.provider === item.provider && r.model === item.model)) { + ranked.push(item); + } } - message.appendChild(content); - const optionsMatch = textStr.match(/\(([^)]+\/[^)]+)\)\s*$/); - if (optionsMatch && type === "assistant") { - const options = optionsMatch[1].split("/").map((opt) => opt.trim()); - const buttonContainer = document.createElement("div"); - buttonContainer.style.cssText = "margin-top: 12px; display: flex; gap: 8px; flex-wrap: wrap;"; - options.forEach((option) => { - const btn = document.createElement("button"); - btn.textContent = option; - btn.className = "action-btn"; - btn.style.cssText = "padding: 8px 16px; background: #3b82f6; color: white; border: none; border-radius: 6px; cursor: pointer;"; - btn.onclick = () => { - document.getElementById("message-input").value = option; - if (typeof sendMessage === "function") sendMessage(); - }; - buttonContainer.appendChild(btn); + return ranked.slice(0, 8); + } + function _renderQuickModelList(rows) { + const quickEl = document.getElementById("model-quick-list"); + if (!quickEl) return; + quickEl.innerHTML = ""; + const candidates = _getQuickModelCandidates(rows || []); + for (const item of candidates) { + const isActive = item.provider === _modelData?.provider && item.model === _modelData?.model; + const button = document.createElement("button"); + button.className = "header-pill-btn"; + button.style.padding = "5px 10px"; + button.style.fontSize = "0.82em"; + button.style.background = isActive ? "#dbeafe" : "#f8fafc"; + button.style.color = isActive ? "#1e3a8a" : "#334155"; + button.style.borderColor = isActive ? "#93c5fd" : "#cbd5e1"; + button.title = `${item.provider} \xB7 ${item.model}`; + button.textContent = `${item.provider} \xB7 ${item.model}`; + button.addEventListener("click", async () => { + await setModel(item.model, item.provider); }); - message.appendChild(buttonContainer); + quickEl.appendChild(button); } - conversation.appendChild(message); - conversation.scrollTop = conversation.scrollHeight; - return message; } - function appendRetryMessage2(text2, retryFn, retryLabel = "Retry", cancelFn = null) { - const conversation = document.getElementById("conversation"); - const message = document.createElement("div"); - message.className = "message system"; - const content = document.createElement("div"); - content.className = "content"; - const escaped = escapeHtml2(text2); - content.innerHTML = escaped.replace(/\*\*(.+?)\*\*/g, "$1").replace(/\n/g, "
    "); - message.appendChild(content); - if (typeof retryFn === "function") { - const btn = document.createElement("button"); - btn.textContent = retryLabel; - btn.style.cssText = "margin-top:8px;padding:6px 14px;background:#3b82f6;color:#fff;border:none;border-radius:6px;cursor:pointer;font-size:0.85rem;display:inline-block;margin-right:8px;"; - btn.onclick = () => { - message.remove(); - retryFn(); - }; - message.appendChild(btn); + function _syncCatalogVisibility() { + const wrap = document.getElementById("model-full-table-wrap"); + const search = document.getElementById("model-global-search"); + const toggle = document.getElementById("model-show-all-btn"); + if (wrap) wrap.style.display = _showFullModelCatalog ? "" : "none"; + if (search) search.style.display = _showFullModelCatalog ? "" : "none"; + if (toggle) toggle.textContent = _showFullModelCatalog ? "Hide Full Catalog" : "Show Full Catalog"; + } + function toggleModelCatalogVisibility() { + _showFullModelCatalog = !_showFullModelCatalog; + _syncCatalogVisibility(); + } + async function _renderAuthStep(provider) { + const content = document.getElementById("model-auth-step-content"); + const keyPanel = document.getElementById("model-auth-key-panel"); + const devPanel = document.getElementById("model-auth-device-panel"); + const keyInput = document.getElementById("model-auth-key-input"); + const keyStatus = document.getElementById("model-auth-key-status"); + if (!content) return; + if (keyPanel) keyPanel.style.display = "none"; + if (devPanel) devPanel.style.display = "none"; + if (keyInput) keyInput.value = ""; + if (keyStatus) keyStatus.textContent = ""; + if (!provider) { + content.innerHTML = '

    Select a provider in Step 1 first.

    '; + return; } - if (typeof cancelFn === "function") { - const cancelBtn = document.createElement("button"); - cancelBtn.textContent = "Stop retries"; - cancelBtn.style.cssText = "margin-top:8px;padding:6px 14px;background:#6b7280;color:#fff;border:none;border-radius:6px;cursor:pointer;font-size:0.85rem;display:inline-block;"; - cancelBtn.onclick = () => { - message.remove(); - cancelFn(); - }; - message.appendChild(cancelBtn); + let credData = null; + try { + const resp = await fetch("/api/settings/credentials/status"); + if (resp.ok) { + const data = await resp.json(); + credData = (data.providers || {})[provider] || null; + } + } catch { + } + const authType = credData?.auth_type || "api_key"; + const label = credData?.label || provider; + const helpText = credData?.help_text || ""; + const getKeyUrl = credData?.get_key_url || ""; + const isSet = credData?.is_set || false; + const source = credData?.source || "unset"; + const envVar = credData?.env_var || null; + const isLocked = credData?.locked || false; + const isSetBadge = isSet ? '✓ Key saved' : 'Not configured'; + let sourceLabel = ""; + let tooltipText = ""; + if (source === "env") { + sourceLabel = `Source: environment variable (${envVar || "locked"})`; + tooltipText = `Currently loaded from the ${envVar} environment variable. To change it permanently, update your shell config (e.g. ~/.zshrc) and restart the server. You can still save a value below \u2014 it takes effect immediately but will be overridden by the environment variable on next restart.`; + } else if (source === "dotenv") { + sourceLabel = `Source: .env file (${envVar || "locked"})`; + tooltipText = `Currently loaded from ${envVar} in your .env file. To change it permanently, edit the .env file in the project directory and restart the server. You can still save a value below \u2014 it takes effect immediately but will be overridden by .env on next restart.`; + } else if (source === "config") { + sourceLabel = "Source: config.yaml"; + tooltipText = "Stored in config.yaml. Update it using the input below."; + } + const infoIcon = tooltipText ? ` ` : ""; + const sourceLabelHtml = sourceLabel ? `${escapeHtml2(sourceLabel)}${infoIcon}` : ""; + const sourceDesc = source === "env" ? "environment variable" : ".env file"; + const sourceRef = envVar ? `${sourceDesc} ${escapeHtml2(envVar)}` : sourceDesc; + const lockedWarnHtml = isLocked ? `
    \u26A0 This key is loaded from the ${sourceRef}. Any value saved below takes effect immediately for the current session, but will be overridden by the ${sourceDesc} when the server restarts or reloads.
    ` : ""; + const getKeyLink = getKeyUrl ? `Get your key ↗` : ""; + content.innerHTML = `
    ${escapeHtml2(label)} ${isSetBadge}${sourceLabelHtml}` + (getKeyLink ? ` ${getKeyLink}` : "") + `
    ` + (helpText ? `

    ${escapeHtml2(helpText)}

    ` : "") + lockedWarnHtml; + if (authType === "api_key") { + if (keyPanel) { + keyPanel.style.display = ""; + if (keyInput) { + keyInput.disabled = false; + keyInput.style.opacity = ""; + keyInput.placeholder = isSet ? "Enter new key to replace the saved one" : "Paste your API key here"; + keyInput.dataset.provider = provider; + } + } + } else if (authType === "device_flow") { + if (devPanel) { + devPanel.style.display = ""; + await _refreshCopilotAuthStatus(); + } + } else if (authType === "cli") { + content.innerHTML += `

    Run this command in a terminal, then return here and click Next:

    gh auth login
    `; + } else { + content.innerHTML += `
    No authentication required for this provider.
    `; } - conversation.appendChild(message); - conversation.scrollTop = conversation.scrollHeight; - return message; } - function appendFormattedAnalysis2(result) { + async function _refreshCopilotAuthStatus() { + const statusEl = document.getElementById("model-auth-status"); + const startBtn = document.getElementById("model-auth-start-btn"); + const logoutBtn = document.getElementById("model-auth-logout-btn"); + const codeEl = document.getElementById("model-auth-code"); + const linkEl = document.getElementById("model-auth-link"); + if (!statusEl) return; + if (codeEl) codeEl.textContent = ""; + if (linkEl) linkEl.style.display = "none"; try { - const cleanResult = cleanJsonResponse2(result); - const data = typeof cleanResult === "string" ? JSON.parse(cleanResult) : cleanResult; - if (data && typeof data === "object" && (data.title || data.required_skills)) { - const conversation = document.getElementById("conversation"); - const message = document.createElement("div"); - message.className = "message assistant"; - const content = document.createElement("div"); - content.className = "content job-analysis"; - let html2 = "

    \u{1F4CB} Job Analysis Complete

    "; - if (data.title) html2 += `

    Position: ${data.title} at ${data.company || "Company"}

    `; - if (data.domain) html2 += `

    Domain: ${data.domain}

    `; - if (data.required_skills?.length) { - html2 += "

    \u{1F3AF} Required Skills:

      "; - data.required_skills.forEach((s) => { - html2 += `
    • ${s}
    • `; - }); - html2 += "
    "; - } - if (data.preferred_skills?.length) { - html2 += "

    \u2B50 Preferred Skills:

      "; - data.preferred_skills.forEach((s) => { - html2 += `
    • ${s}
    • `; - }); - html2 += "
    "; - } - if (data.nice_to_have_requirements?.length) { - html2 += "

    \u2728 Nice to Have:

      "; - data.nice_to_have_requirements.forEach((r) => { - html2 += `
    • ${r}
    • `; - }); - html2 += "
    "; - } - if (data.ats_keywords?.length) { - html2 += '

    \u{1F511} ATS Keywords:

    '; - data.ats_keywords.forEach((kw) => { - html2 += `${kw}`; - }); - html2 += "

    "; - } - content.innerHTML = html2; - message.appendChild(content); - conversation.appendChild(message); - conversation.scrollTop = conversation.scrollHeight; + const st = await fetch("/api/copilot-auth/status").then((res) => res.json()); + if (st.authenticated) { + statusEl.textContent = "Authenticated with GitHub Copilot."; + if (startBtn) startBtn.style.display = "none"; + if (logoutBtn) logoutBtn.style.display = ""; + _updateLlmStatusPill2("authenticated", "Copilot ready"); + } else if (st.polling) { + statusEl.textContent = "Waiting for device approval\u2026"; + if (startBtn) startBtn.style.display = ""; + if (logoutBtn) logoutBtn.style.display = "none"; + _updateLlmStatusPill2("polling", "Copilot auth pending", "\u29D7"); } else { - appendMessage2("assistant", result); + statusEl.textContent = "Not authenticated. Start sign-in to enable Copilot OAuth."; + if (startBtn) startBtn.style.display = ""; + if (logoutBtn) logoutBtn.style.display = "none"; + _updateLlmStatusPill2("unauthenticated", "Copilot not authenticated"); } - } catch (e) { - log4.error("Analysis display error:", e); - appendMessage2("assistant", result); + } catch { + statusEl.textContent = "Unable to load auth status."; } } - function appendFormattedResponse(response) { + async function saveProviderApiKey() { + const keyInput = document.getElementById("model-auth-key-input"); + const keyStatus = document.getElementById("model-auth-key-status"); + const provider = keyInput?.dataset?.provider || _modelWizardSelectedProvider; + const value = (keyInput?.value || "").trim(); + if (!value) { + if (keyStatus) { + keyStatus.textContent = "Please enter a key value."; + keyStatus.style.color = "#b91c1c"; + } + return; + } + if (!provider) { + if (keyStatus) { + keyStatus.textContent = "No provider selected."; + keyStatus.style.color = "#b91c1c"; + } + return; + } + if (keyStatus) { + keyStatus.textContent = "Saving\u2026"; + keyStatus.style.color = "#475569"; + } try { - const data = typeof response === "string" ? JSON.parse(response) : response; - if (data && typeof data === "object" && (data.title || data.required_skills)) { - appendFormattedAnalysis2(response); - } else { - appendMessage2("assistant", response); + await apiCall2("POST", "/api/settings/credentials", { provider, key_value: value }); + if (keyInput) keyInput.value = ""; + if (keyStatus) { + keyStatus.textContent = "Key saved successfully."; + keyStatus.style.color = "#065f46"; } + await _renderAuthStep(provider); } catch (e) { - appendMessage2("assistant", response); + if (keyStatus) { + keyStatus.textContent = `Error: ${e.message || e}`; + keyStatus.style.color = "#b91c1c"; + } } } - function appendRawHtml2(html2) { - const conversation = document.getElementById("conversation"); - if (!conversation) return; - conversation.insertAdjacentHTML("beforeend", html2); - conversation.scrollTop = conversation.scrollHeight; + function toggleApiKeyVisibility() { + const input = document.getElementById("model-auth-key-input"); + const toggle = document.getElementById("model-auth-key-toggle"); + if (!input) return; + const isHidden = input.type === "password"; + input.type = isHidden ? "text" : "password"; + if (toggle) toggle.textContent = isHidden ? "\u{1F648}" : "\u{1F441}"; } - - // web/review-table-base.js - var review_table_base_exports = {}; - __export(review_table_base_exports, { - _loadReviewPane: () => _loadReviewPane, - _resolvedExpAction: () => _resolvedExpAction, - _resolvedSkillAction: () => _resolvedSkillAction, - _updatePageEstimate: () => _updatePageEstimate2, - bulkAction: () => bulkAction, - handleActionClick: () => handleActionClick2, - handleCustomizationResponse: () => handleCustomizationResponse2, - loadTabContent: () => loadTabContent, - populateAnalysisTab: () => populateAnalysisTab, - populateReviewTab: () => populateReviewTab, - populateTaglineReviewTab: () => populateTaglineReviewTab, - showTableBasedReview: () => showTableBasedReview2, - switchReviewSubtab: () => switchReviewSubtab, - switchTab: () => switchTab2, - updateInclusionCounts: () => updateInclusionCounts2, - userSelections: () => userSelections2 - }); - var log5 = getLogger("review-table-base"); - var userSelections2 = { - experiences: {}, - // exp_id -> 'emphasize'|'include'|'de-emphasize'|'exclude' - skills: {} - // skill_name -> 'emphasize'|'include'|'de-emphasize'|'exclude' - }; - var pageEstimateTimer = null; - var pageEstimateRequestId = 0; - var _draftInputs = {}; - function _saveDraftInputsForTab(tabName) { - if (!tabName) return; - const content = document.getElementById("document-content"); - if (!content) return; - const saved = {}; - content.querySelectorAll("textarea, input, select").forEach((el) => { - if (!el.id || el.type === "file") return; - saved[el.id] = el.type === "checkbox" || el.type === "radio" ? el.checked : el.value; - }); - if (Object.keys(saved).length > 0) { - _draftInputs[tabName] = saved; + async function startCopilotAuthFromWizard() { + const statusEl = document.getElementById("model-auth-status"); + const codeEl = document.getElementById("model-auth-code"); + const linkEl = document.getElementById("model-auth-link"); + if (!statusEl || !codeEl || !linkEl) return; + _showModelWizardBusy("Starting GitHub device authorization..."); + try { + const flowRes = await fetch("/api/copilot-auth/start", { method: "POST" }); + if (!flowRes.ok) throw new Error(await flowRes.text()); + const flow = await flowRes.json(); + codeEl.textContent = flow.user_code || ""; + linkEl.href = flow.verification_uri || "https://github.com/login/device"; + linkEl.style.display = ""; + statusEl.textContent = "Open GitHub, enter the code, then return here."; + window.open(linkEl.href, "_blank"); + await fetch("/api/copilot-auth/poll", { method: "POST" }); + _updateLlmStatusPill2("polling", "Copilot auth pending", "\u29D7"); + if (_copilotAuthPollTimer) clearInterval(_copilotAuthPollTimer); + _copilotAuthPollTimer = setInterval(async () => { + try { + const st = await fetch("/api/copilot-auth/status").then((res) => res.json()); + if (st.authenticated) { + clearInterval(_copilotAuthPollTimer); + _copilotAuthPollTimer = null; + await _refreshCopilotAuthStatus(); + } + } catch { + } + }, 5e3); + } catch (error) { + statusEl.textContent = `Auth start failed: ${error.message || error}`; + } finally { + _hideModelWizardBusy(); } } - function _restoreDraftInputsForTab(tabName) { - const cached = _draftInputs[tabName]; - if (!cached) return; - Object.entries(cached).forEach(([id, value]) => { - const el = document.getElementById(id); - if (!el || el.readOnly || el.disabled || el.type === "file") return; - if (el.type === "checkbox" || el.type === "radio") { - el.checked = value; - } else { - el.value = value; + async function logoutCopilotAuthFromWizard() { + await fetch("/api/copilot-auth/logout", { method: "POST" }); + await _refreshCopilotAuthStatus(); + } + function _wireGlobalModelSearch() { + const input = document.getElementById("model-global-search"); + if (!input) return; + input.oninput = () => { + if (_modelDataTable && typeof _modelDataTable.search === "function") { + _modelDataTable.search(input.value || "").draw(); } - }); + }; } - function ensureTabDataState() { - return stateManager2.getAllTabData(); + function _renderProviderSelector() { + const listEl = document.getElementById("model-provider-list"); + if (!listEl || !_modelData) return; + const providers = Array.isArray(_modelData.providers) ? _modelData.providers : Array.from(new Set((_modelData.all_models || []).map((r) => r.provider).filter(Boolean))).sort(); + const capableSet = new Set(_modelData.list_models_capable || []); + if (!_modelWizardSelectedProvider) { + _modelWizardSelectedProvider = _modelData.provider || providers[0] || null; + } + if (_modelWizardSelectedProvider) { + _selectedModelProviders = /* @__PURE__ */ new Set([_modelWizardSelectedProvider]); + } + listEl.querySelectorAll('[data-bs-toggle="popover"]').forEach((el) => { + window.bootstrap?.Popover?.getInstance(el)?.dispose(); + }); + listEl.innerHTML = ""; + providers.forEach((provider) => { + const checked = provider === _modelWizardSelectedProvider; + const sourceLabel = _providerStageLabel(provider, capableSet); + const info = getProviderInfo(provider); + const label = document.createElement("label"); + label.style.cssText = "display:flex; align-items:center; gap:6px; padding:4px 8px; border:1px solid #cbd5e1; border-radius:999px; font-size:0.82em; background:#fff; cursor:pointer;"; + label.innerHTML = `${escapeHtml2(_providerDisplayLabel(provider))}(${escapeHtml2(sourceLabel)})`; + if (info) { + const btn = document.createElement("button"); + btn.type = "button"; + btn.setAttribute("aria-label", "Provider info"); + btn.setAttribute("data-bs-toggle", "popover"); + btn.setAttribute("data-bs-trigger", "click"); + btn.setAttribute("data-bs-placement", "right"); + btn.setAttribute("data-bs-html", "true"); + btn.setAttribute("data-bs-container", "body"); + btn.setAttribute("data-bs-content", providerInfoPopoverContent(info)); + btn.style.cssText = "background:none;border:none;cursor:pointer;color:#64748b;font-size:0.9em;padding:0 1px;line-height:1;vertical-align:middle;"; + btn.textContent = "\u24D8"; + btn.addEventListener("click", (e) => e.stopPropagation()); + label.appendChild(btn); + requestAnimationFrame(() => { + if (window.bootstrap?.Popover) { + new window.bootstrap.Popover(btn, { sanitize: false }); + } + }); + } + const checkbox = label.querySelector("input"); + checkbox.addEventListener("change", () => { + if (!checkbox.checked) return; + _modelWizardSelectedProvider = provider; + _selectedModelProviders = /* @__PURE__ */ new Set([provider]); + _updateModelWizardNav(); + }); + listEl.appendChild(label); + }); + _updateModelWizardNav(); } - function isReconnectInProgress() { - return stateManager2.isReconnecting(); + function _showModelWizardBusy(message) { + const overlay = document.getElementById("model-wizard-busy-overlay"); + const messageEl = document.getElementById("model-wizard-busy-message"); + if (messageEl) messageEl.textContent = message || "Working..."; + if (overlay) overlay.style.display = "flex"; } - function updateInclusionCounts2() { - try { - const expDecs = window._savedDecisions && window._savedDecisions.experience_decisions || userSelections2.experiences || {}; - const skillDecs = window._savedDecisions && window._savedDecisions.skill_decisions || userSelections2.skills || {}; - const achDecs = window._savedDecisions && window._savedDecisions.achievement_decisions || window.achievementDecisions || {}; - const expIncluded = Object.values(expDecs).filter((v2) => v2 !== "exclude").length; - const skillIncluded = Object.values(skillDecs).filter((v2) => v2 !== "exclude").length; - const achIncluded = Object.values(achDecs).filter((v2) => v2 !== "exclude").length; - const expTab = document.getElementById("tab-exp-review"); - const skillTab = document.getElementById("tab-skills-review"); - const achTab = document.getElementById("tab-achievements-review"); - if (expTab) expTab.textContent = `\u{1F4CA} Experiences${expIncluded ? " (" + expIncluded + ")" : ""}`; - if (skillTab) skillTab.textContent = `\u{1F6E0}\uFE0F Skills${skillIncluded ? " (" + skillIncluded + ")" : ""}`; - if (achTab) achTab.textContent = `\u{1F3C6} Achievements${achIncluded ? " (" + achIncluded + ")" : ""}`; - } catch (e) { - log5.warn("Failed to update inclusion counts:", e); - } + function _hideModelWizardBusy() { + const overlay = document.getElementById("model-wizard-busy-overlay"); + if (overlay) overlay.style.display = "none"; } - function _populateGenerateTab(cvData, content) { - if (!cvData || !cvData.files || !cvData.files.length) { - content.innerHTML = '
    \u{1F4C4}

    Generated CV

    Generate CV to see preview

    '; - return; - } - const meta = cvData.metadata || {}; - const role = meta.role || meta.position || ""; - const company = meta.company || ""; - const subtitle = role && company ? `${role} \u2014 ${company}` : role || company || "CV generated"; - const ICONS = { ".pdf": "\u{1F4C4}", ".docx": "\u{1F4DD}", ".html": "\u{1F310}" }; - const LABELS = { - ".pdf": (f) => f.includes("ATS") ? "ATS PDF" : "Human PDF", - ".docx": (f) => f.includes("ATS") ? "ATS DOCX" : f.startsWith("CoverLetter_") ? "Cover Letter" : "Human DOCX", - ".html": () => "HTML" + function _setModelWizardStep(step) { + _modelWizardStep = [1, 2, 3, 4].includes(step) ? step : 1; + const panes = { + 1: document.getElementById("model-step-provider"), + 2: document.getElementById("model-step-auth"), + 3: document.getElementById("model-step-models"), + 4: document.getElementById("model-step-success") }; - const downloadableExts = /* @__PURE__ */ new Set([".pdf", ".docx", ".html"]); - const files = (cvData.files || []).filter((f) => { - const ext = f.slice(f.lastIndexOf(".")).toLowerCase(); - return downloadableExts.has(ext) && f !== "job_description.txt"; + Object.entries(panes).forEach(([num, el]) => { + if (el) el.style.display = Number(num) === _modelWizardStep ? "" : "none"; }); - const sid = typeof getSessionIdFromURL === "function" ? getSessionIdFromURL() : null; - const sessionParam = sid ? `?session_id=${encodeURIComponent(sid)}` : ""; - let fileRows = ""; - for (const f of files) { - const ext = f.slice(f.lastIndexOf(".")).toLowerCase(); - const icon = ICONS[ext] || "\u{1F4C1}"; - const label = LABELS[ext] ? LABELS[ext](f) : f; - fileRows += ` -
    - ${icon} -
    -
    ${label}
    -
    ${escapeHtml(f)}
    -
    - Download -
    `; + if (_modelWizardStep === 2) { + _renderAuthStep(_modelWizardSelectedProvider); } - content.innerHTML = ` -
    -
    - \u2705 -
    -

    CV Generated

    -
    ${escapeHtml(subtitle)}
    -
    -
    -
    - ${fileRows} -
    - -
    `; - } - var _visitedCustomiseTabs = /* @__PURE__ */ new Set(); - var _CUSTOMISE_TABS = /* @__PURE__ */ new Set(["goals", "questions", "exp-review", "ach-editor", "skills-review", "achievements-review", "tagline-review", "summary-review", "publications-review", "ats-score"]); - function _updateVisitedTabIndicators() { - _visitedCustomiseTabs.forEach((name) => { - const el = document.getElementById(`tab-${name}`); - if (el) el.classList.add("tab--visited"); - }); + _updateModelWizardNav(); } - function switchTab2(tab) { - if (typeof resetCardFocus === "function") resetCardFocus(); - _saveDraftInputsForTab(stateManager2.getCurrentTab()); - if (typeof getStageForTab === "function" && typeof updateTabBarForStage === "function") { - const tabStage = getStageForTab(tab); - if (tabStage) { - updateTabBarForStage(tabStage); - updateActionButtons(tabStage); + function _updateModelWizardProgressBar() { + [1, 2, 3, 4].forEach((stepNum) => { + const stepEl = document.getElementById(`model-progress-step-${stepNum}`); + if (!stepEl) return; + const badgeEl = stepEl.querySelector(".model-progress-badge"); + stepEl.classList.remove("is-active", "is-complete", "is-upcoming"); + if (stepNum < _modelWizardStep) { + stepEl.classList.add("is-complete"); + stepEl.setAttribute("aria-current", "false"); + if (badgeEl) badgeEl.textContent = "\u2713"; + } else if (stepNum === _modelWizardStep) { + stepEl.classList.add("is-active"); + stepEl.setAttribute("aria-current", "step"); + if (badgeEl) badgeEl.textContent = String(stepNum); + } else { + stepEl.classList.add("is-upcoming"); + stepEl.setAttribute("aria-current", "false"); + if (badgeEl) badgeEl.textContent = String(stepNum); } - } - if (typeof stateManager2?.getPhase === "function" && typeof updateWorkflowStepsClickable === "function") { - updateWorkflowStepsClickable(stateManager2.getPhase()); - } - document.querySelectorAll(".tab").forEach((t) => { - t.classList.remove("active"); - t.setAttribute("aria-selected", "false"); - t.setAttribute("tabindex", "-1"); }); - const activeTab = document.getElementById(`tab-${tab}`); - if (activeTab) { - activeTab.classList.add("active"); - activeTab.setAttribute("aria-selected", "true"); - activeTab.setAttribute("tabindex", "0"); - const tabpanel = document.getElementById("document-content"); - if (tabpanel) tabpanel.setAttribute("aria-labelledby", `tab-${tab}`); + } + function _updateModelWizardNav() { + const stepLabel = document.getElementById("model-wizard-step-label"); + const backBtn = document.getElementById("model-wizard-back-btn"); + const nextBtn = document.getElementById("model-wizard-next-btn"); + const testBtn = document.getElementById("model-test-btn"); + const refreshBtn = document.getElementById("pricing-refresh-btn"); + const footer = document.querySelector(".model-wizard-footer"); + _updateModelWizardProgressBar(); + if (stepLabel) { + const labels = { + 1: "Step 1 of 4: Choose provider", + 2: "Step 2 of 4: Set up authentication", + 3: "Step 3 of 4: Choose model and test connection", + 4: "Step 4 of 4: Complete" + }; + stepLabel.textContent = labels[_modelWizardStep] || ""; } - stateManager2.setCurrentTab(tab); - if (_CUSTOMISE_TABS.has(tab)) { - _visitedCustomiseTabs.add(tab); - _updateVisitedTabIndicators(); + if (backBtn) { + backBtn.disabled = _modelWizardStep === 1; + backBtn.style.display = _modelWizardStep === 4 ? "none" : ""; } - const announcer = document.getElementById("workflow-stage-announcer"); - if (announcer && activeTab) { - announcer.textContent = ""; - setTimeout(() => { - announcer.textContent = `Now viewing: ${activeTab.textContent.trim()}`; - }, 50); + if (nextBtn) { + nextBtn.style.display = _modelWizardStep === 1 || _modelWizardStep === 2 ? "" : "none"; + nextBtn.disabled = _modelWizardStep === 1 && !_modelWizardSelectedProvider; + nextBtn.textContent = _modelWizardStep === 2 ? "Next" : "Next"; } - if (typeof _updateViewingIndicator === "function") _updateViewingIndicator(tab); - const content = document.getElementById("document-content"); - content.classList.toggle("full-width", tab !== "generate"); - loadTabContent(tab); + if (testBtn) testBtn.style.display = _modelWizardStep === 3 ? "" : "none"; + if (refreshBtn) refreshBtn.style.display = _modelWizardStep === 3 ? "" : "none"; + if (footer) footer.style.justifyContent = _modelWizardStep === 4 ? "center" : "space-between"; } - async function loadTabContent(tab) { - const content = document.getElementById("document-content"); - const tabData2 = ensureTabDataState(); + async function _loadModelsForSelectedProvider() { + if (!_modelWizardSelectedProvider) return false; + const loadingEl = document.getElementById("model-models-loading"); + if (loadingEl) { + loadingEl.style.display = ""; + loadingEl.style.color = "#475569"; + loadingEl.innerHTML = 'Loading models for selected provider...'; + } + _showModelWizardBusy("Querying available models..."); try { - switch (tab) { - case "job": - await populateJobTab(); - break; - case "goals": - if (typeof populateGoalsTab === "function") await populateGoalsTab(); - break; - case "analysis": - if (tabData2.analysis) { - populateAnalysisTab(tabData2.analysis); - } else { - content.innerHTML = '
    \u{1F50D}

    Job Analysis

    Click "Analyze Job" to generate analysis

    '; - } - break; - case "questions": - populateQuestionsTab(); - break; - case "customizations": - switchTab2("exp-review"); - return; - case "exp-review": - await populateReviewTab("experiences"); - break; - case "ach-editor": - await buildAchievementsEditor(); - break; - case "skills-review": - await populateReviewTab("skills"); - break; - case "achievements-review": - await populateReviewTab("achievements"); - break; - case "tagline-review": - await populateTaglineReviewTab(); - break; - case "summary-review": - await populateReviewTab("summary"); - break; - case "publications-review": - await populateReviewTab("publications"); - break; - case "ats-score": - if (typeof populateAtsScoreTab === "function") await populateAtsScoreTab(); - break; - case "rewrite": - if (window._rewritePanelCache) { - renderRewritePanel( - window._rewritePanelCache.rewrites, - window._rewritePanelCache.warnings - ); - } else { - content.innerHTML = '
    \u270F\uFE0F

    Rewrites

    Loading rewrites\u2026

    '; - try { - const data = await apiCall("GET", "/api/rewrites"); - if (data.rewrites) { - renderRewritePanel(data.rewrites, data.persuasion_warnings || []); - } else { - content.innerHTML = '
    \u270F\uFE0F

    Rewrites

    Complete customizations to reach this step

    '; - } - } catch (e) { - content.innerHTML = '
    \u270F\uFE0F

    Rewrites

    Complete customizations to reach this step

    '; - } - } - break; - case "editor": - await populateCVEditorTab(); - break; - case "generate": - _populateGenerateTab(tabData2.cv, content); - break; - case "download": - if (tabData2.cv && Object.keys(tabData2.cv).length > 0) { - await populateDownloadTab(tabData2.cv); - } else { - content.innerHTML = '
    \u2B07\uFE0F

    Download

    Generate CV to enable downloads

    '; - } - break; - case "spell": - await populateSpellCheckTab(); - break; - case "layout": - initiateLayoutInstructions(); - break; - case "finalise": - await populateFinaliseTab(); - break; - case "harvest": - if (typeof populateHarvestTab === "function") await populateHarvestTab(); - break; - case "interview-prep": - if (typeof populateInterviewPrepTab === "function") await populateInterviewPrepTab(); - break; - case "thank-you": - if (typeof populateThankYouTab === "function") await populateThankYouTab(); - break; - case "master": - await populateMasterTab(); - break; - case "cover-letter": - await populateCoverLetterTab(); - break; - case "screening": - await populateScreeningTab(); - break; + _selectedModelProviders = /* @__PURE__ */ new Set([_modelWizardSelectedProvider]); + _modelData.provider = _modelWizardSelectedProvider; + await _refreshModelCatalogForSelection(); + if (loadingEl) { + loadingEl.style.display = "none"; + loadingEl.textContent = ""; } + return true; } catch (error) { - log5.error(`Error loading tab ${tab}:`, error); - const errorMessage = document.createElement("p"); - errorMessage.style.cssText = "padding: 20px; color: #c41e3a;"; - errorMessage.textContent = `Error loading content: ${error.message}`; - content.appendChild(errorMessage); + log4.warn("Could not load models for selected provider:", error); + if (loadingEl) { + loadingEl.style.display = ""; + loadingEl.textContent = "Failed to load models for selected provider."; + loadingEl.style.color = "#b91c1c"; + } + return false; + } finally { + _hideModelWizardBusy(); + } + } + async function nextWizardStep() { + if (_modelWizardStep === 1) { + if (!_modelWizardSelectedProvider) return; + _setModelWizardStep(2); return; } - _restoreDraftInputsForTab(tab); + if (_modelWizardStep === 2) { + const loaded = await _loadModelsForSelectedProvider(); + if (!loaded) return; + _setModelWizardStep(3); + } } - async function showTableBasedReview2() { - if (!window.pendingRecommendations) { - appendMessage("assistant", "No recommendations to review. Please generate customizations first."); + function previousWizardStep() { + if (_modelWizardStep === 2) { + _setModelWizardStep(1); return; } - switchTab2("exp-review"); - appendMessage("assistant", "\u2705 Customizations generated! Please review each section in the **Customizations** tab \u2014 Experiences, Achievements, Skills, Summary, and Publications. Select your preferences using the action buttons, then submit your decisions."); + if (_modelWizardStep === 3) { + _setModelWizardStep(2); + return; + } + if (_modelWizardStep === 4) { + _setModelWizardStep(3); + } } - var _synonymMapCache = null; - async function _loadSynonymMap() { - if (_synonymMapCache) return _synonymMapCache; + async function _refreshModelCatalogForSelection() { + if (!_modelData) return; + if (_catalogRefreshing) { + _catalogRefreshPending = true; + return; + } + _catalogRefreshing = true; try { - const sessionId2 = stateManager2.getSessionId && stateManager2.getSessionId(); - const url = sessionId2 ? `/api/synonym-map?session_id=${encodeURIComponent(sessionId2)}` : "/api/synonym-map"; - const res = await fetch(url); - if (!res.ok) return _synonymMapCache = {}; - const raw = await res.json(); - const aliasToCanon = {}; - const canonToAliases = {}; - Object.entries(raw).forEach(([alias, canon]) => { - aliasToCanon[alias.toLowerCase()] = canon; - const cl = canon.toLowerCase(); - (canonToAliases[cl] = canonToAliases[cl] || []).push(alias); + const selected = Array.from(_selectedModelProviders); + if (!selected.length) { + _selectedModelProviders = /* @__PURE__ */ new Set([_modelData.provider]); + } + const providersParam = encodeURIComponent(Array.from(_selectedModelProviders).join(",")); + const catalog = await apiCall2("GET", `/api/model-catalog?providers=${providersParam}`); + _modelData.all_models = catalog.all_models || []; + _modelData.pricing_updated_at = catalog.pricing_updated_at || _modelData.pricing_updated_at; + _modelData.pricing_source = catalog.pricing_source || _modelData.pricing_source; + if (Array.isArray(catalog.providers) && catalog.providers.length) { + _modelData.providers = catalog.providers; + } + if (Array.isArray(catalog.list_models_capable)) { + _modelData.list_models_capable = catalog.list_models_capable; + } + } catch (error) { + log4.warn("Could not refresh model catalog for selected providers:", error); + } finally { + _catalogRefreshing = false; + } + _renderProviderSelector(); + _buildModelTable(); + if (_catalogRefreshPending) { + _catalogRefreshPending = false; + await _refreshModelCatalogForSelection(); + } + } + async function openModelModal() { + const overlay = document.getElementById("model-modal-overlay"); + if (!overlay) return; + if (!_modelData) { + await loadModelSelector(); + } + await loadProviderInfo(); + if (!_modelWizardSelectedProvider) { + _modelWizardSelectedProvider = _modelData?.provider || null; + } + const successSummary = document.getElementById("model-success-summary"); + if (successSummary) { + successSummary.textContent = "Provider and model are configured and the connection check succeeded."; + } + _renderProviderSelector(); + _syncCatalogVisibility(); + _wireGlobalModelSearch(); + _setModelWizardStep(1); + _hideModelWizardBusy(); + overlay.style.display = "flex"; + _focusStack.push(document.activeElement); + setInitialFocus2("model-modal-overlay"); + trapFocus2("model-modal-overlay"); + } + function closeModelModal2() { + const overlay = document.getElementById("model-modal-overlay"); + if (overlay) overlay.style.display = "none"; + _setModelWizardStep(1); + _hideModelWizardBusy(); + if (_copilotAuthPollTimer) { + clearInterval(_copilotAuthPollTimer); + _copilotAuthPollTimer = null; + } + restoreFocus2(); + } + function _applyModelRowVisualState(tr, isActive) { + tr.classList.toggle("model-row-active", isActive); + tr.style.cssText = isActive ? "background:#eff6ff; font-weight:600; cursor:pointer;" : "cursor:pointer;"; + const model = tr.getAttribute("data-model") || ""; + const modelCell = tr.cells && tr.cells[1]; + if (modelCell) { + modelCell.innerHTML = `${escapeHtml2(model)}` + (isActive ? ' ✓ active' : ""); + } + } + function _syncModelTableSelection() { + const tbody = document.getElementById("model-table-body"); + if (!tbody || !_modelData) return; + const activeProvider = _modelData.provider; + const activeModel = _modelData.model; + tbody.querySelectorAll("tr").forEach((tr) => { + const isActive = tr.getAttribute("data-provider") === activeProvider && tr.getAttribute("data-model") === activeModel; + _applyModelRowVisualState(tr, isActive); + }); + } + function _buildModelTable() { + const tbody = document.getElementById("model-table-body"); + const thead = document.getElementById("model-table-head"); + if (!tbody || !_modelData) return; + const currentProvider = _modelData.provider; + const currentModel = _modelData.model; + if (thead) { + const thS = "padding:10px 14px; white-space:nowrap;"; + thead.innerHTML = `ProviderModelContext$/1M in$/1M outCopilotSourceNotes`; + } + if (window.$ && $.fn && $.fn.DataTable && $.fn.DataTable.isDataTable("#model-table")) { + try { + _modelDataTable = $("#model-table").DataTable(); + _modelDataTable.destroy(); + } catch (e) { + log4.warn("DataTable.destroy() failed (table may already be torn down):", e); + } finally { + _modelDataTable = null; + } + } + let rows = _modelData.all_models && _modelData.all_models.length ? _modelData.all_models.filter((r) => r.model) : (_modelData.available || []).map( + (r) => typeof r === "object" ? { ...r, provider: currentProvider } : { model: r, provider: currentProvider } + ); + _renderQuickModelList(rows); + tbody.innerHTML = ""; + const tdBase = "padding:9px 14px; border-bottom:1px solid #e2e8f0;"; + const fmtCost = (v2) => v2 != null ? "$" + Number(v2).toFixed(v2 < 1 ? 3 : 2) : "\u2014"; + const fmtPriceHint = (source) => { + if (source === "runtime_cache") { + return 'cache'; + } + return 'static'; + }; + const fmtSource = (s) => { + if (s === "list_models") { + return 'list_models'; + } + return 'fallback_static'; + }; + const fmtMult = (v2) => { + if (v2 == null) return "\u2014"; + if (v2 === 0) return 'free'; + return Number(v2).toFixed(v2 % 1 === 0 ? 0 : 2) + "×"; + }; + rows.forEach((item) => { + const provider = item.provider || currentProvider; + const m2 = item.model; + const ctx = item.context_window ? Number(item.context_window).toLocaleString() : "\u2014"; + const source = item.source || "fallback_static"; + const priceSource = item.price_source || "static_baseline"; + const notes = item.notes || ""; + const isSelected = provider === currentProvider && m2 === currentModel; + const tr = document.createElement("tr"); + tr.setAttribute("data-provider", provider); + tr.setAttribute("data-model", m2); + _applyModelRowVisualState(tr, isSelected); + tr.addEventListener("mouseover", () => { + if (!tr.classList.contains("model-row-active")) tr.style.background = "#f8fafc"; + }); + tr.addEventListener("mouseout", () => { + if (!tr.classList.contains("model-row-active")) tr.style.background = ""; + }); + tr.innerHTML = `${escapeHtml2(_providerDisplayLabel(provider))}${escapeHtml2(m2)}${ctx}${fmtCost(item.cost_input)}${fmtPriceHint(priceSource)}${fmtCost(item.cost_output)}${fmtPriceHint(priceSource)}${fmtMult(item.copilot_multiplier)}${fmtSource(source)}${escapeHtml2(notes)}`; + tbody.appendChild(tr); + }); + tbody.onclick = async (event2) => { + const tr = event2.target.closest("tr"); + if (!tr) return; + const provider = tr.getAttribute("data-provider"); + const model = tr.getAttribute("data-model"); + if (!model) return; + tr.style.cssText = "background:#fef3c7; cursor:wait; opacity:0.85;"; + const modelCell = tr.cells && tr.cells[1]; + if (modelCell) { + modelCell.innerHTML = `${escapeHtml2(model)}`; + } + const status = document.getElementById("model-test-status"); + if (status) { + status.style.display = ""; + status.style.color = "#92400e"; + status.innerHTML = ` Switching to ${escapeHtml2(model)}\u2026`; + } + await setModel(model, provider); + }; + if (window.$ && $.fn && $.fn.DataTable) { + _modelDataTable = $("#model-table").DataTable({ + paging: false, + searching: true, + info: false, + orderCellsTop: true, + order: [[0, "asc"], [1, "asc"]], + autoWidth: false, + language: { search: "Filter:" }, + initComplete: function() { + const api = this.api(); + const $thead = $("#model-table thead"); + const hasFilterRow = $thead.find("tr.model-filter-row").length > 0; + if (!hasFilterRow) { + const $filterRow = $(''); + api.columns().every(function(colIdx) { + const title = $(api.column(colIdx).header()).text().trim(); + const $th = $(''); + const $input = $("", { + type: "text", + placeholder: title, + style: "width:100%; padding:4px 6px; border:1px solid #cbd5e1; border-radius:4px; font-size:0.82em;" + }); + $th.append($input); + $filterRow.append($th); + }); + $thead.append($filterRow); + } + api.columns().every(function(colIdx) { + const $input = $("#model-table thead tr.model-filter-row th").eq(colIdx).find("input"); + if (!$input.length) return; + $input.off("click.modelFilter keyup.modelFilter change.modelFilter"); + $input.on("click.modelFilter", function(event2) { + event2.stopPropagation(); + }); + $input.on("keyup.modelFilter change.modelFilter", function() { + const value = this.value; + if (api.column(colIdx).search() !== value) { + api.column(colIdx).search(value).draw(); + } + }); + }); + } }); - _synonymMapCache = { aliasToCanon, canonToAliases }; - } catch (_2) { - _synonymMapCache = {}; } - return _synonymMapCache; - } - function _kwSynonymAnnotation(kw, synMap) { - if (!synMap || !synMap.aliasToCanon && !synMap.canonToAliases) return ""; - const kl = kw.toLowerCase(); - if (synMap.aliasToCanon[kl]) return ` = ${synMap.aliasToCanon[kl]}`; - const aliases = synMap.canonToAliases && synMap.canonToAliases[kl]; - if (aliases && aliases.length) return ` (${aliases.join(", ")})`; - return ""; + _syncModelTableSelection(); + _updatePricingFooter(); } - async function populateAnalysisTab(result) { - const content = document.getElementById("document-content"); + async function setModel(model, provider) { + if (!model) return; + _showModelWizardBusy(`Applying model ${model}...`); try { - let data; - if (result !== null && typeof result === "object") { - data = result; - } else { - const cleanResult = cleanJsonResponse(result); - data = typeof cleanResult === "string" ? JSON.parse(cleanResult) : cleanResult; - } - stateManager2.setTabData("analysis", result); - saveTabData(); - let html2 = '
    '; - html2 += '
    '; - html2 += `

    ${data.title || "Role"}

    `; - if (data.company) html2 += `

    \u{1F3E2} ${data.company}

    `; - html2 += '
    '; - if (data.domain) { - const conf = data.domain_confidence; - let confLabel = ""; - let confTitle = ""; - if (typeof conf === "number") { - if (conf >= 0.8) { - confLabel = ""; - confTitle = `Domain confidence: High (${Math.round(conf * 100)}%)`; - } else if (conf >= 0.6) { - confLabel = " \u26A0"; - confTitle = `Domain confidence: Medium (${Math.round(conf * 100)}%) \u2014 verify this is correct`; - } else { - confLabel = " \u26A0"; - confTitle = `Domain confidence: Low (${Math.round(conf * 100)}%) \u2014 the JD spans multiple domains; consider overriding`; - } - } - html2 += `\u{1F52C} ${escapeHtml(data.domain)}${confLabel}`; - } - if (data.role_level) html2 += `\u{1F4CA} ${data.role_level}`; - if (data.suggested_summary) html2 += `\u{1F4AC} ${data.suggested_summary}`; - html2 += "
    "; - const requiredSkills = Array.isArray(data.required_skills) ? data.required_skills : []; - const masterSkills = window._masterSkills || []; - if (requiredSkills.length > 0 && masterSkills.length > 0) { - const missing = requiredSkills.filter( - (skill) => !masterSkills.some((ms) => ms.includes(skill.toLowerCase()) || skill.toLowerCase().includes(ms)) - ); - if (missing.length > 0) { - html2 += `
    \u26A0 ${missing.length} required skill${missing.length > 1 ? "s" : ""} not found in your master CV: ${missing.join(", ")}
    `; - } - } - if (requiredSkills.length > 0) { - html2 += '

    \u{1F3AF} Required Skills

    '; - requiredSkills.forEach((skill) => { - const isMissing = masterSkills.length > 0 && !masterSkills.some( - (ms) => ms.includes(skill.toLowerCase()) || skill.toLowerCase().includes(ms) - ); - html2 += `${skill}${isMissing ? ' (not in master CV)' : ""}`; - }); - html2 += "
    "; + const payload = provider ? { model, provider } : { model }; + await apiCall2("POST", "/api/model", payload); + if (_modelData) { + _modelData.model = model; + if (provider) _modelData.provider = provider; } - const preferred = [ - ...Array.isArray(data.preferred_skills) ? data.preferred_skills : [], - ...Array.isArray(data.nice_to_have_requirements) ? data.nice_to_have_requirements : [] - ]; - if (preferred.length > 0) { - html2 += '

    \u2B50 Preferred / Nice-to-Have

      '; - preferred.forEach((item) => { - html2 += `
    • ${item}
    • `; - }); - html2 += "
    "; + const effectiveProvider = _modelData && _modelData.provider || provider; + const label = document.getElementById("model-current-label"); + if (label) { + label.textContent = effectiveProvider ? `${effectiveProvider} \xB7 ${model}` : model; } - const atsKws = Array.isArray(data.ats_keywords) ? data.ats_keywords : []; - if (atsKws.length > 0) { - const synMap = await _loadSynonymMap(); - html2 += '

    \u{1F511} ATS Keywords (higher rank = higher priority)

    '; - atsKws.forEach((kw, idx) => { - const annotation = _kwSynonymAnnotation(kw, synMap); - const titleAttr = annotation ? ` title="Synonym: ${escapeHtml(kw + annotation)}"` : ""; - const annotHtml = annotation ? `${escapeHtml(annotation)}` : ""; - html2 += `#${idx + 1}${escapeHtml(kw)}${annotHtml}`; - }); - html2 += "
    "; + _appendRecentModel(effectiveProvider, model); + _syncModelTableSelection(); + _renderQuickModelList(_modelData && _modelData.all_models || []); + _updateLlmStatusPill2("configured", `${effectiveProvider || "Provider"} configured`); + _saveModelPrefsToStorage({ + currentModelProvider: effectiveProvider || null, + currentModelName: model || null + }); + if (typeof globalThis.updateAuthBadge === "function") { + globalThis.updateAuthBadge({}, effectiveProvider || null); } - const culture = Array.isArray(data.culture_indicators) ? data.culture_indicators : []; - if (culture.length > 0) { - html2 += '

    \u{1F3E2} Culture Indicators

      '; - culture.forEach((c) => { - html2 += `
    • ${c}
    • `; - }); - html2 += "
    "; + await _refreshCopilotAuthStatus(); + await testCurrentModel(); + } catch (e) { + log4.error("Failed to switch model:", e); + const msg = e.message || String(e); + _syncModelTableSelection(); + const status = document.getElementById("model-test-status"); + if (status) { + status.style.display = ""; + status.style.color = "#dc2626"; + status.textContent = `\u274C ${msg}`; } - const mustHave = Array.isArray(data.must_have_requirements) ? data.must_have_requirements : []; - if (mustHave.length > 0) { - html2 += '

    \u2705 Must-Have Requirements

      '; - mustHave.forEach((r) => { - html2 += `
    • ${r}
    • `; - }); - html2 += "
    "; + if (typeof appendMessage === "function") { + appendMessage("system", `\u274C Model switch failed: ${msg}`); } - html2 += ``; - html2 += "
    "; - content.innerHTML = html2; - } catch (e) { - log5.error("Analysis parsing error:", e, "Original result:", result); - content.innerHTML = `
    \u274C

    Analysis Error

    Could not parse analysis results: ${escapeHtml(e.message)}

    Debug Info
    ${escapeHtml(JSON.stringify(result, null, 2))}
    `; + } finally { + _hideModelWizardBusy(); } } - async function handleCustomizationResponse2(response) { - try { - const data = response !== null && typeof response === "object" ? response : extractFirstJsonObject(response); - if (!data) { - appendMessage("assistant", typeof response === "string" ? response : ""); - return; + async function testCurrentModel() { + const badge = document.getElementById("model-test-badge"); + const status = document.getElementById("model-test-status"); + const btn = document.getElementById("model-test-btn"); + const SPIN = "\u23F3"; + const OK = "\u2705"; + const FAIL = "\u274C"; + const setRunning = () => { + if (badge) { + badge.textContent = SPIN; + badge.style.display = ""; + badge.title = "Testing\u2026"; } - if (data && (data.recommended_experiences || data.recommended_skills)) { - stateManager2.setTabData("customizations", data); - window.pendingRecommendations = data; - saveTabData(); - if (!isReconnectInProgress()) { - appendMessage("assistant", "\u2705 Customizations generated! Please review each section in the **Customizations** tab \u2014 Experiences, Achievements, Skills, Summary, and Publications. Select your preferences using the action buttons, then submit your decisions."); - switchTab2("exp-review"); - } - } else if (!isReconnectInProgress()) { - appendMessage("assistant", response); + if (status) { + status.innerHTML = `${SPIN} Testing connection\u2026`; + status.style.display = ""; } - } catch (e) { - log5.error("Customization response error:", e); - if (!isReconnectInProgress()) { - appendMessage("assistant", response); + if (btn) { + btn.disabled = true; + btn.textContent = "\u23F3 Testing\u2026"; } - } - } - async function populateReviewTab(pane) { - const content = document.getElementById("document-content"); - const customizations = stateManager2.getTabData("customizations"); - if (!window.pendingRecommendations || !customizations) { - content.innerHTML = '
    \u2699\uFE0F

    Review Customizations

    Click "Recommend Customizations" to generate recommendations.

    '; - return; - } - const paneConfig = { - experiences: { title: "", desc: "Sorted by date (most recent first). Click action buttons to override recommendations.", container: "experience-table-container" }, - skills: { title: "\u{1F6E0}\uFE0F Skills", desc: "Sorted by relevance. Select how to feature each skill.", container: "skills-table-container" }, - achievements: { title: "\u{1F3C6} Achievements", desc: "Select how to feature each key achievement. AI recommendations are pre-selected.", container: "achievements-table-container" }, - summary: { title: "\u{1F4DD} Professional Summary", desc: "Select which professional summary to use. The AI's recommendation is pre-selected.", container: "summary-focus-container" }, - publications: { title: "\u{1F4C4} Publications", desc: "All publications ranked by relevance. Accept or reject each for your CV.", container: "publications-table-container" } + _updateLlmStatusPill2("connecting", "Connecting\u2026", "\u29D7"); }; - const cfg = paneConfig[pane] || {}; - const headerHtml = pane === "experiences" ? ` -

    \u2699\uFE0F Review Customization Recommendations

    -

    Review the AI's recommendations. Use the action buttons to adjust each item, then save your decisions before generating the CV.

    -
    - \u{1F4C4} - Estimated length: calculating\u2026 -
    -
    - ` : cfg.title ? `

    ${cfg.title}

    ` : ""; - const navBack = { - skills: ``, - achievements: ``, - publications: `` + const setOk = (latencyMs) => { + const tip = `Connected \u2014 ${latencyMs}ms`; + if (badge) { + badge.textContent = OK; + badge.style.display = ""; + badge.title = tip; + } + if (status) { + status.innerHTML = `${OK} ${tip}`; + status.style.color = "#16a34a"; + status.style.display = ""; + } + if (btn) { + btn.disabled = false; + btn.innerHTML = "✓ Test connection"; + } + _updateLlmStatusPill2("connected", `Healthy (${latencyMs}ms)`, "\u2713"); + const successSummary = document.getElementById("model-success-summary"); + if (successSummary) { + successSummary.textContent = `Connection verified in ${latencyMs}ms. You can close the wizard and continue.`; + } + _setModelWizardStep(4); }; - const navContinue = { - experiences: ``, - skills: ``, - achievements: ``, - publications: `` + const setFail = (errMsg) => { + if (badge) { + badge.textContent = FAIL; + badge.style.display = ""; + badge.title = errMsg; + } + if (status) { + status.innerHTML = `${FAIL} Connection failed`; + status.style.color = "#dc2626"; + status.style.display = ""; + } + if (btn) { + btn.disabled = false; + btn.innerHTML = "✓ Test connection"; + } + _updateLlmStatusPill2("error", "Connection failed", "\u26A0", errMsg); + if (_modelWizardStep === 3) { + _setModelWizardStep(2); + } }; - const navHtml = pane === "summary" ? "" : ` - `; - content.innerHTML = ` - ${headerHtml} - ${cfg.desc ? `

    ${escapeHtml(cfg.desc)}

    ` : ""} -
    - ${navHtml} - `; - window._activeReviewPane = pane; - switch (pane) { - case "experiences": - await buildExperienceReviewTable(); - _updatePageEstimate2(); - break; - case "skills": - await buildSkillsReviewTable(); - break; - case "achievements": - await buildAchievementsReviewTable(); - break; - case "summary": - await buildSummaryFocusSection(); - break; - case "publications": - await buildPublicationsReviewTable(); - break; + setRunning(); + _showModelWizardBusy("Testing model connection..."); + try { + const result = await apiCall2("POST", "/api/model/test"); + if (result.ok) { + setOk(result.latency_ms); + return true; + } + setFail(result.error || "Unknown error"); + return false; + } catch (e) { + setFail(e.message || String(e)); + return false; + } finally { + _hideModelWizardBusy(); } } - window._activeReviewPane = "experiences"; - async function switchReviewSubtab(pane) { - document.querySelectorAll(".review-subtab").forEach((btn) => { - btn.classList.toggle("active", btn.dataset.pane === pane); - }); - document.querySelectorAll(".review-pane").forEach((p) => p.style.display = "none"); - const target = document.getElementById(`review-pane-${pane}`); - if (target) target.style.display = "block"; - window._activeReviewPane = pane; - if (!window._reviewPaneLoaded || !window._reviewPaneLoaded[pane]) { - await _loadReviewPane(pane); + function _updatePricingFooter() { + const el = document.getElementById("pricing-updated-label"); + if (!el || !_modelData) return; + const ts = _modelData.pricing_updated_at; + const source = _modelData.pricing_source; + const sourceLabel = source === "openrouter" ? 'OpenRouter' : "static baseline (March 2026)"; + if (!ts) { + el.innerHTML = `Prices: ${sourceLabel}`; + return; + } + try { + const d = new Date(ts); + const now = /* @__PURE__ */ new Date(); + const h = Math.round((now - d) / 36e5); + const age = h < 1 ? "just now" : h < 24 ? `${h}h ago` : `${Math.round(h / 24)}d ago`; + el.innerHTML = `Prices via ${sourceLabel} · updated ${age}`; + } catch { + el.innerHTML = `Prices: ${sourceLabel}`; } } - async function _loadReviewPane(pane) { - if (!window._reviewPaneLoaded) window._reviewPaneLoaded = {}; + async function refreshModelPricing() { + const btn = document.getElementById("pricing-refresh-btn"); + const lbl = document.getElementById("pricing-updated-label"); + if (btn) { + btn.disabled = true; + btn.textContent = "Refreshing\u2026"; + } + _showModelWizardBusy("Refreshing model pricing..."); try { - switch (pane) { - case "experiences": - await buildExperienceReviewTable(); - break; - case "skills": - await buildSkillsReviewTable(); - break; - case "achievements": - await buildAchievementsReviewTable(); - break; - case "summary": - await buildSummaryFocusSection(); - break; - case "publications": - await buildPublicationsReviewTable(); - break; - default: - return; + await apiCall2("POST", "/api/model-pricing/refresh"); + _modelData = await apiCall2("GET", "/api/model"); + _buildModelTable(); + } catch (e) { + if (lbl) lbl.textContent = "Refresh failed"; + log4.error("Pricing refresh failed:", e); + } finally { + _hideModelWizardBusy(); + if (btn) { + btn.disabled = false; + btn.textContent = "\u21BB Refresh prices"; } - window._reviewPaneLoaded[pane] = true; - } catch (error) { - delete window._reviewPaneLoaded[pane]; - throw error; } } - function _updatePageEstimate2() { - const widget = document.getElementById("page-estimate-widget"); - if (!widget) return; - const label = document.getElementById("pe-label"); - const fill = document.getElementById("pe-fill"); - const icon = document.getElementById("pe-icon"); - if (label) label.textContent = "Updating server layout estimate\u2026"; - if (fill) fill.style.width = "0%"; - if (icon) icon.textContent = "\u23F3"; - const payload = { - experience_decisions: { - ...window._savedDecisions && window._savedDecisions.experience_decisions || {}, - ...userSelections2.experiences || {} - }, - skill_decisions: { - ...window._savedDecisions && window._savedDecisions.skill_decisions || {}, - ...userSelections2.skills || {} - }, - achievement_decisions: window._savedDecisions && window._savedDecisions.achievement_decisions || window.achievementDecisions || {}, - publication_decisions: window._savedDecisions && window._savedDecisions.publication_decisions || window.publicationDecisions || {}, - summary_focus_override: window.selectedSummaryKey || null + function updateWorkflowStepsClickable2(currentPhase) { + const sequentialSteps = [ + "step-job", + "step-analysis", + "step-customizations", + "step-rewrite", + "step-spell", + "step-layout" + ]; + const postLayoutSteps = [ + "step-download", + "step-cover_letter", + "step-screening", + "step-interview_prep", + "step-thank_you", + "step-harvest" + ]; + const phaseToIndex = { + "init": 0, + "job_analysis": 1, + "customization": 2, + "rewrite_review": 3, + "spell_check": 4, + "generation": 5, + "layout_review": 5, + "final_generation": 5, + "refinement": 5, + // Legacy fallbacks (step names sometimes passed on DOMContentLoaded) + "job": 0, + "layout": 5, + "finalise": 5 }; - const requestId = ++pageEstimateRequestId; - clearTimeout(pageEstimateTimer); - pageEstimateTimer = setTimeout(async () => { - try { - const response = await apiCall("POST", "/api/cv/layout-estimate", payload); - if (!response.ok) throw new Error(response.error || "estimate failed"); - if (requestId !== pageEstimateRequestId) return; - const pages = Number(response.page_count_estimate || 0); - const pct = Math.min(100, pages / 3 * 100); - const confidence = Number(response.page_count_confidence || 0); - let cls = "ok"; - let colour = "#22c55e"; - let iconText = response.page_count_exact != null ? "\u2705" : "\u{1F4C4}"; - if (response.page_length_warning) { - cls = pages > 3 ? "over" : "warn"; - colour = pages > 3 ? "#ef4444" : "#f59e0b"; - iconText = pages > 3 ? "\u{1F6A8}" : "\u26A0\uFE0F"; - } - const sourceLabel = response.page_count_exact != null ? `Exact: ${response.page_count_exact} page${response.page_count_exact === 1 ? "" : "s"}` : `Estimated: ${pages.toFixed(1)} pages`; - const confidenceLabel = response.page_count_exact != null ? "" : ` (${Math.round(confidence * 100)}% confidence)`; - const contributorText = Array.isArray(response.contributors) && response.contributors.length > 0 ? ` ${response.contributors[0]}.` : ""; - const recheckText = response.page_count_needs_exact_recheck && response.page_count_exact == null ? " Exact recheck recommended." : ""; - widget.className = `page-estimate ${cls}`; - if (label) { - label.textContent = `${sourceLabel}${confidenceLabel}.${contributorText}${recheckText}`.trim(); - } - if (fill) { - fill.style.width = `${pct}%`; - fill.style.background = colour; - } - if (icon) icon.textContent = iconText; - stateManager2.setGenerationState({ - pageCountEstimate: response.page_count_estimate ?? null, - pageCountExact: response.page_count_exact ?? null, - pageCountConfidence: response.page_count_confidence ?? null, - pageCountSource: response.page_count_source || null, - pageNeedsExactRecheck: Boolean(response.page_count_needs_exact_recheck), - pageWarning: Boolean(response.page_length_warning) - }); - } catch (error) { - if (requestId !== pageEstimateRequestId) return; - widget.className = "page-estimate warn"; - if (label) label.textContent = `Layout estimate unavailable: ${error.message}`; - if (fill) { - fill.style.width = "0%"; - fill.style.background = "#f59e0b"; - } - if (icon) icon.textContent = "\u26A0\uFE0F"; - } - }, 250); - } - function handleActionClick2(itemId, action, type) { - const row = type === "experience" ? document.querySelector(`tr[data-exp-id="${itemId}"]`) : document.querySelector(`tr[data-skill="${itemId}"]`); - const buttons = row.querySelectorAll(".icon-btn"); - buttons.forEach((btn) => { - btn.classList.remove("active"); - if (btn.hasAttribute("aria-pressed")) btn.setAttribute("aria-pressed", "false"); - }); - const clickedBtn = row.querySelector(`[data-action="${action}"]`); - clickedBtn.classList.add("active"); - if (clickedBtn.hasAttribute("aria-pressed")) clickedBtn.setAttribute("aria-pressed", "true"); - if (type === "experience") { - userSelections2.experiences[itemId] = action; - window._explicitlyReviewed = window._explicitlyReviewed || { experiences: /* @__PURE__ */ new Set(), skills: /* @__PURE__ */ new Set() }; - window._explicitlyReviewed.experiences.add(itemId); - } else { - userSelections2.skills[itemId] = action; - window._explicitlyReviewed = window._explicitlyReviewed || { experiences: /* @__PURE__ */ new Set(), skills: /* @__PURE__ */ new Set() }; - window._explicitlyReviewed.skills.add(itemId); + const postLayoutUnlocked = ["final_generation", "refinement"].includes(currentPhase); + const currentIdx = phaseToIndex[currentPhase] ?? 0; + function _makeStepClickable(el) { + if (!el || el.classList.contains("clickable")) return; + el.classList.add("clickable"); + el.setAttribute("role", "button"); + el.setAttribute("tabindex", "0"); + if (!el._stepKeyHandler) { + el._stepKeyHandler = (e) => { + if (e.key === "Enter" || e.key === " ") { + e.preventDefault(); + el.click(); + } + }; + el.addEventListener("keydown", el._stepKeyHandler); + } } - _updatePageEstimate2(); - } - function bulkAction(action, type) { - const tableId = type === "experience" ? "#experience-review-table" : "#skills-review-table"; - const data = window.pendingRecommendations || {}; - const dt = $.fn.DataTable.isDataTable(tableId) ? $(tableId).DataTable() : null; - const rows = dt ? dt.rows({ search: "applied" }).nodes().toArray() : Array.from(document.querySelectorAll(`${tableId} tbody tr`)); - rows.forEach((row) => { - const expId = row.dataset.expId; - const skillId = row.dataset.skill; - const itemId = expId || skillId; - if (!itemId) return; - let resolvedAction = action; - if (action === "recommended") { - resolvedAction = type === "experience" ? _resolvedExpAction(itemId, data) : _resolvedSkillAction(itemId, data); + function _makeStepInert(el) { + if (!el) return; + el.classList.remove("clickable"); + el.removeAttribute("role"); + el.setAttribute("tabindex", "-1"); + if (el._stepKeyHandler) { + el.removeEventListener("keydown", el._stepKeyHandler); + delete el._stepKeyHandler; } - row.querySelectorAll(".icon-btn").forEach((btn) => { - btn.classList.remove("active"); - if (btn.hasAttribute("aria-pressed")) btn.setAttribute("aria-pressed", "false"); - }); - const target = row.querySelector(`[data-action="${resolvedAction}"]`); - if (target) { - target.classList.add("active"); - if (target.hasAttribute("aria-pressed")) target.setAttribute("aria-pressed", "true"); + } + sequentialSteps.forEach((id, idx) => { + const el = document.getElementById(id); + if (!el) return; + if (idx <= currentIdx || postLayoutUnlocked) { + _makeStepClickable(el); + } else { + _makeStepInert(el); } - if (type === "experience") { - userSelections2.experiences[itemId] = resolvedAction; + }); + postLayoutSteps.forEach((id) => { + const el = document.getElementById(id); + if (!el) return; + if (postLayoutUnlocked) { + _makeStepClickable(el); } else { - userSelections2.skills[itemId] = resolvedAction; + _makeStepInert(el); } }); - _updatePageEstimate2(); - } - function _resolvedExpAction(expId, data) { - const rec = getExperienceRecommendation(expId, data); - if (rec === "Emphasize") return "emphasize"; - if (rec === "Include") return "include"; - if (rec === "De-emphasize") return "de-emphasize"; - return "exclude"; - } - function _resolvedSkillAction(skillName, data) { - const rec = getSkillRecommendation(skillName, data); - if (rec === "Emphasize") return "emphasize"; - if (rec === "Include") return "include"; - if (rec === "De-emphasize") return "de-emphasize"; - return "exclude"; - } - async function populateTaglineReviewTab() { - const content = document.getElementById("document-content"); - if (!content) return; - content.innerHTML = ` -

    \u{1F3F7}\uFE0F Applicant Tagline

    -
    - `; - if (typeof buildTaglineReviewSection === "function") { - await buildTaglineReviewSection(); + const allStepIds = [...sequentialSteps, ...postLayoutSteps]; + allStepIds.forEach((id) => { + const el = document.getElementById(id); + if (el) el.removeAttribute("aria-current"); + }); + const activeStepId = postLayoutUnlocked ? "step-download" : sequentialSteps[currentIdx]; + if (activeStepId) { + const activeEl = document.getElementById(activeStepId); + if (activeEl) activeEl.setAttribute("aria-current", "step"); } } + document.addEventListener("DOMContentLoaded", () => { + loadModelSelector(); + const tabBar = document.getElementById("tab-bar"); + const leftBtn = document.getElementById("tab-scroll-left"); + const rightBtn = document.getElementById("tab-scroll-right"); + if (tabBar && leftBtn && rightBtn) { + leftBtn.addEventListener("click", () => { + tabBar.scrollBy({ left: -160, behavior: "smooth" }); + }); + rightBtn.addEventListener("click", () => { + tabBar.scrollBy({ left: 160, behavior: "smooth" }); + }); + tabBar.addEventListener("scroll", updateTabScrollButtons); + new ResizeObserver(updateTabScrollButtons).observe(tabBar); + } + updateTabBarForStage2("job"); + updateWorkflowStepsClickable2("job"); + if (typeof stateManager2?.onPhaseChange === "function") { + stateManager2.onPhaseChange((phase) => { + updateWorkflowStepsClickable2(phase); + }); + } + }); - // web/workflow-steps.js - var workflow_steps_exports = {}; - __export(workflow_steps_exports, { - _ACTION_LABELS: () => _ACTION_LABELS, - _STEP_DISPLAY: () => _STEP_DISPLAY, - _STEP_ORDER: () => _STEP_ORDER, - _applyBulletOrder: () => _applyBulletOrder, - _executeReRunPhase: () => _executeReRunPhase, - _getStepTooltip: () => _getStepTooltip, - _highlightChangedItems: () => _highlightChangedItems, - _markChanged: () => _markChanged, - _showAnalysisClarificationAmendModal: () => _showAnalysisClarificationAmendModal, - _showReRunConfirmModal: () => _showReRunConfirmModal, - _updateBulletArrows: () => _updateBulletArrows, - _updateViewingIndicator: () => _updateViewingIndicator2, - applyDirtyPhaseNavigationState: () => applyDirtyPhaseNavigationState, - applyLayoutFreshnessNavigationState: () => applyLayoutFreshnessNavigationState, - backToPhase: () => backToPhase, - confirmReRunPhase: () => confirmReRunPhase2, - handleStepClick: () => handleStepClick, - moveBullet: () => moveBullet, - reRunPhase: () => reRunPhase, - resetBulletOrder: () => resetBulletOrder, - saveBulletOrder: () => saveBulletOrder, - showBulletReorder: () => showBulletReorder2, - updateWorkflowSteps: () => updateWorkflowSteps + // web/layout-instruction.js + var layout_instruction_exports = {}; + __export(layout_instruction_exports, { + addToInstructionHistory: () => addToInstructionHistory, + applyAcceptedProposals: () => applyAcceptedProposals, + completeLayoutReview: () => completeLayoutReview, + confirmLayoutReview: () => confirmLayoutReview, + displayLayoutPreview: () => displayLayoutPreview, + generateFinalOutputs: () => generateFinalOutputs, + handleLayoutPrimaryAction: () => handleLayoutPrimaryAction2, + initiateLayoutInstructions: () => initiateLayoutInstructions2, + loadLayoutInstructionHistory: () => loadLayoutInstructionHistory, + pxToPt: () => pxToPt, + renderContentProposals: () => renderContentProposals, + renderDirtyPhasesCallout: () => renderDirtyPhasesCallout, + renderInstructionHistory: () => renderInstructionHistory, + renderLayoutPreviewStatus: () => renderLayoutPreviewStatus, + renderPreviewOutputStatus: () => renderPreviewOutputStatus, + showConfirmationMessage: () => showConfirmationMessage, + showProcessing: () => showProcessing, + submitContentProposal: () => submitContentProposal, + submitLayoutInstruction: () => submitLayoutInstruction, + submitSmartInstruction: () => submitSmartInstruction, + undoInstruction: () => undoInstruction }); - var log6 = getLogger("workflow-steps"); - function _findExperienceRecommendationRecord(expId) { - const data = globalThis.window?.pendingRecommendations; - if (!data || !Array.isArray(data.experience_recommendations)) return null; - return data.experience_recommendations.find((rec) => String(rec?.id || rec?.experience_id || "") === String(expId)) || null; + + // web/ats-refinement.js + var ats_refinement_exports = {}; + __export(ats_refinement_exports, { + formatAtsScoreSummary: () => formatAtsScoreSummary, + refreshAtsScore: () => refreshAtsScore2, + scheduleAtsRefresh: () => scheduleAtsRefresh2, + updateAtsBadge: () => updateAtsBadge2 + }); + function _dispatchAtsScoreUpdated() { + document.dispatchEvent(new CustomEvent("ats-score-updated")); } - var _STEP_ORDER = [ - "job", - "analysis", - "customizations", - "rewrite", - "spell", - "layout", - "download", - "cover_letter", - "screening", - "interview_prep", - "thank_you", - "harvest" - ]; - var _STEP_DISPLAY = { - job: "Job Input", - analysis: "Job Analysis", - customizations: "Customisations", - rewrite: "Rewrite Review", - spell: "Spell Check", - layout: "Layout Review", - download: "File Review", - cover_letter: "Cover Letter", - screening: "Screening", - interview_prep: "Interview Prep", - thank_you: "Thank You", - harvest: "Harvest" - }; - var _ACTION_LABELS = { - recommend_customizations: "Selecting experiences & skills\u2026", - generate_cv: "Generating CV\u2026" - }; - var _NAV_TAB_LABELS = { - download: "\u2B07\uFE0F File Review" - }; - function applyLayoutFreshnessNavigationState() { - const freshness = stateManager2.getLayoutFreshness(); - const generationState2 = stateManager2.getGenerationState(); - const layoutStep = document.getElementById("step-layout"); - if (layoutStep) { - layoutStep.classList.remove("stale", "stale-critical"); - const rerun = layoutStep.querySelector(".step-rerun")?.outerHTML || ""; - const refineBadge = layoutStep.querySelector(".step-inline-badge")?.outerHTML || ""; - const staleBadge = freshness.isStale ? ' Outdated' : ""; - if (freshness.isStale) { - layoutStep.classList.add("stale"); - if (freshness.isCritical) layoutStep.classList.add("stale-critical"); - } - layoutStep.innerHTML = `\u{1F3A8} Layout Review${staleBadge}${refineBadge ? ` ${refineBadge}` : ""}${rerun ? ` ${rerun}` : ""}`; - } - const showDownstreamBadge = freshness.isStale && Boolean( - generationState2.finalGeneratedAt || generationState2.phase === "final_complete" - ); - Object.entries(_NAV_TAB_LABELS).forEach(([tab, label]) => { - const tabEl = document.getElementById(`tab-${tab}`); - if (!tabEl) return; - tabEl.classList.remove("tab-stale", "tab-stale-critical"); - if (showDownstreamBadge) { - tabEl.classList.add("tab-stale"); - if (freshness.isCritical) tabEl.classList.add("tab-stale-critical"); - tabEl.innerHTML = `${label} Outdated`; - } else { - tabEl.textContent = label; - } - }); + function _safeText(value) { + return typeof value === "string" ? value.trim() : ""; + } + function _coerceObject(value) { + return value && typeof value === "object" ? value : {}; + } + function _formatDateLabel(value) { + const text2 = _safeText(value); + if (!text2) return ""; + if (/^\d{4}-\d{2}-\d{2}$/.test(text2)) { + const [year, month, day] = text2.split("-"); + return `${month}/${day}/${year}`; + } + const parsed = new Date(text2); + if (!Number.isNaN(parsed.getTime())) { + return parsed.toISOString().slice(0, 10); + } + return text2; } - async function backToPhase(step, feedback) { - try { - const body = feedback ? { phase: step, feedback } : { phase: step }; - const res = await fetch("/api/back-to-phase", { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify(body) - }); - const data = await res.json(); - if (!res.ok || !data.ok) { - appendRetryMessage("\u26A0 Could not navigate back: " + (data.error || "Unknown error"), () => backToPhase(step, feedback)); - return; - } - appendMessage("assistant", `\u21BB Navigating back to ${step}. Prior decisions and approvals are preserved.`); - if (feedback) appendMessage("system", `Refinement feedback queued: "${feedback}"`); - await fetchStatus(); - const tabMap = { - job: null, - analysis: "analysis", - customizations: "goals", - rewrite: "rewrite", - spell: "spell" - }; - const resolvedTab = tabMap[step] || tabMap[data.phase] || null; - if (resolvedTab) switchTab(resolvedTab); - } catch (err) { - appendRetryMessage("\u26A0 Network error in backToPhase: " + err.message, () => backToPhase(step)); + function _getPageLengthLabel() { + const generationState2 = _coerceObject(globalThis.stateManager?.getGenerationState?.()); + const exact = Number(generationState2.pageCountExact); + if (Number.isFinite(exact) && exact > 0) { + return `Length ${exact} page${exact === 1 ? "" : "s"}`; + } + const estimate = Number(generationState2.pageCountEstimate); + if (Number.isFinite(estimate) && estimate > 0) { + return `Length ${estimate.toFixed(1)} pages est`; } + return ""; } - function _showReRunConfirmModal(step, mode, onConfirm) { - const stepIdx = _STEP_ORDER.indexOf(step); - const downstream = _STEP_ORDER.slice(stepIdx + 1).filter((s) => { - const el = document.getElementById(`step-${s}`); - return el && el.classList.contains("completed"); - }); - const stepLabel = _STEP_DISPLAY[step] || step; - const title = mode === "rerun" ? `\u21BB Re-run ${stepLabel}?` : `\u2190 Navigate back to ${stepLabel}?`; - const bodyText = mode === "rerun" ? "The following stages will see updated inputs and may show changed recommendations:" : "You are navigating back past the following completed stages:"; - const note = "All existing approvals and rewrites are preserved as context."; - const listHtml = downstream.map((s) => `
  • ${_STEP_DISPLAY[s] || s}
  • `).join(""); - const overlay = document.createElement("div"); - overlay.id = "rerun-confirm-overlay"; - overlay.style.cssText = `position:fixed;inset:0;background:rgba(0,0,0,0.5); - z-index:10000;display:flex;align-items:center;justify-content:center;`; - overlay.innerHTML = ` -
    -

    - ${escapeHtml(title)}

    -

    ${escapeHtml(bodyText)}

    -
      ${listHtml}
    -

    ${escapeHtml(note)}

    -
    - - -
    -
    `; - document.body.appendChild(overlay); - _focusedElementBeforeModal = document.activeElement; - if (typeof trapFocus === "function") trapFocus("rerun-confirm-overlay"); - document.getElementById("rerun-proceed-btn").focus(); - const close = () => { - overlay.remove(); - restoreFocus(); - }; - document.getElementById("rerun-cancel-btn").addEventListener("click", close); - document.getElementById("rerun-proceed-btn").addEventListener("click", () => { - close(); - onConfirm(); - }); - overlay.addEventListener("click", (e) => { - if (e.target === overlay) close(); - }); - overlay.addEventListener("keydown", (e) => { - if (e.key === "Escape") close(); - }); + function _getJobSummaryLabel() { + const intake = _coerceObject(window._statusIntake); + const analysis = _coerceObject(globalThis.stateManager?.getTabData?.("analysis")); + const positionFallback = _safeText(document.getElementById("position-title")?.textContent || ""); + const role = _safeText( + intake.role || analysis.job_title || analysis.title || analysis.position_name || "" + ); + const company = _safeText(intake.company || analysis.company_name || analysis.company || ""); + const dateApplied = _formatDateLabel( + intake.date_applied || analysis.date_applied || analysis.application_date || "" + ); + const primary = role && company ? `${role} @ ${company}` : role || company || positionFallback; + if (!primary) return ""; + if (!dateApplied) return primary; + return `${primary} (${dateApplied})`; } - function confirmReRunPhase2(step) { - _showReRunConfirmModal(step, "rerun", () => backToPhase(step)); + function _keywordCount(keywords, type, statuses = ["matched", "partial"]) { + return keywords.filter((keyword) => keyword.type === type && statuses.includes(keyword.status)).length; } - function _getStepTooltip(step, isActive, isViewing, isBrowsingAway, isCompleted, isStale, isStaleCritical) { - if (isStaleCritical) return isViewing ? "Critical changes \u2014 review required. Click \u21BB to rerun." : "Critical changes \u2014 review required."; - if (isStale) return isViewing ? "Results may be outdated. Click \u21BB to rerun." : "Results may be outdated."; - if (isBrowsingAway) return "Active step \u2014 click to return"; - if (isActive && isViewing) return "Current step"; - if (isCompleted && isViewing) return "Click \u21BB to rerun from here"; - if (isCompleted) return "Click to view"; - return ""; + function _buildSummaryDetail(score, keywords) { + const missingHard = keywords.filter((keyword) => keyword.type === "hard" && keyword.status === "missing").map((keyword) => keyword.keyword).filter(Boolean); + if (missingHard.length > 0) { + const preview = missingHard.slice(0, 2).join(", "); + const suffix = missingHard.length > 2 ? ` +${missingHard.length - 2} more` : ""; + return `Missing hard: ${preview}${suffix}`; + } + const exact = keywords.filter((keyword) => keyword.match_type === "exact" || keyword.match_type === "synonym").length; + const partial = keywords.filter((keyword) => keyword.match_type === "partial").length; + const topSections = Object.entries(score.section_scores || {}).filter(([, value]) => typeof value === "number" && value > 0).sort((left, right) => right[1] - left[1]).slice(0, 2).map(([section, value]) => `${section} ${Math.round(value)}%`); + if (topSections.length > 0) { + return `Top sections: ${topSections.join(" \u2022 ")}`; + } + if (exact > 0 || partial > 0) { + return `Match quality: ${exact} exact \u2022 ${partial} partial`; + } + return `Basis: ${score.basis || "review"}`; } - function _updateViewingIndicator2(tabName) { - const tabToStep = { - "job": "job", - "analysis": "analysis", - "questions": "analysis", - "exp-review": "customizations", - "rewrite": "rewrite", - "spell": "spell", - "layout": "layout", - "final_generate": "download", - "download": "download", - "cover-letter": "cover_letter", - "screening": "screening", - "interview-prep": "interview_prep", - "thank-you": "thank_you", - "harvest": "harvest" + function formatAtsScoreSummary(score) { + const keywords = Array.isArray(score?.keyword_status) ? score.keyword_status : []; + const overall = typeof score?.overall === "number" ? Math.round(score.overall) : null; + if (overall === null) { + return { overall: null, line: "", detail: "", keywords }; + } + if (keywords.length === 0) { + return { + overall, + line: `Overall ${overall}%`, + detail: `Basis: ${score.basis || "review"}`, + keywords + }; + } + const hardTotal = keywords.filter((keyword) => keyword.type === "hard").length; + const softTotal = keywords.filter((keyword) => keyword.type === "soft").length; + const bonusTotal = keywords.filter((keyword) => keyword.type === "bonus").length; + const summaryParts = []; + if (hardTotal > 0) { + summaryParts.push(`Hard ${_keywordCount(keywords, "hard")}/${hardTotal}`); + } + if (softTotal > 0) { + summaryParts.push(`Soft ${_keywordCount(keywords, "soft")}/${softTotal}`); + } + if (bonusTotal > 0) { + summaryParts.push(`Bonus ${_keywordCount(keywords, "bonus")}/${bonusTotal}`); + } + return { + overall, + line: summaryParts.join(" \u2022 ") || `Overall ${overall}%`, + detail: _buildSummaryDetail(score, keywords), + keywords }; - const viewedStep = tabToStep[tabName] || null; - let activeStep = null; - _STEP_ORDER.forEach((step) => { - const el = document.getElementById(`step-${step}`); - if (el && el.classList.contains("active")) activeStep = step; - }); - _STEP_ORDER.forEach((step) => { - const el = document.getElementById(`step-${step}`); - if (!el) return; - const isViewing = step === viewedStep; - const isActive = step === activeStep; - const isBrowsingAway = isActive && !!viewedStep && viewedStep !== activeStep; - const isCompleted = el.classList.contains("completed"); - const isStale = el.classList.contains("stale"); - const isStaleCritical = el.classList.contains("stale-critical"); - el.classList.toggle("viewing", isViewing); - el.classList.toggle("browsing-away", isBrowsingAway); - const tooltipText = _getStepTooltip(step, isActive, isViewing, isBrowsingAway, isCompleted, isStale, isStaleCritical); - if (tooltipText) { - el.setAttribute("data-bs-toggle", "tooltip"); - el.setAttribute("data-bs-placement", "bottom"); - el.setAttribute("data-bs-title", tooltipText); - if (typeof bootstrap !== "undefined") { - const tip = bootstrap.Tooltip.getInstance(el); - if (tip) tip.setContent({ ".tooltip-inner": tooltipText }); - else new bootstrap.Tooltip(el); - } - } else { - el.removeAttribute("data-bs-toggle"); - el.removeAttribute("data-bs-title"); - if (typeof bootstrap !== "undefined") { - const tip = bootstrap.Tooltip.getInstance(el); - if (tip) tip.dispose(); - } - } - }); } - async function _showAnalysisClarificationAmendModal(onProceed) { - const questions = window.postAnalysisQuestions || []; - const answers = window.questionAnswers || {}; - if (!questions.length) { - await onProceed(); + function _updateAtsSummary(score) { + const header = document.getElementById("ats-score-header"); + const summary = document.getElementById("ats-score-summary"); + const summaryLine = document.getElementById("ats-score-summary-line"); + const summaryDetail = document.getElementById("ats-score-summary-detail"); + if (!header || !summary || !summaryLine || !summaryDetail) return; + const keywords = Array.isArray(score?.keyword_status) ? score.keyword_status : []; + const hasScore = score && typeof score.overall === "number"; + const pageLengthLabel = _getPageLengthLabel(); + const jobSummaryLabel = _getJobSummaryLabel(); + if (!hasScore) { + header.style.display = "none"; + summary.style.display = "none"; + summaryLine.textContent = ""; + summaryDetail.textContent = ""; + return; + } + header.style.display = "flex"; + const summaryContent = formatAtsScoreSummary(score); + const lineParts = [summaryContent.line, pageLengthLabel].filter(Boolean); + const detailParts = [jobSummaryLabel, summaryContent.detail].filter(Boolean); + if (lineParts.length === 0 && detailParts.length === 0 && keywords.length === 0) { + summary.style.display = "none"; + summaryLine.textContent = ""; + summaryDetail.textContent = ""; + return; + } + summaryLine.textContent = lineParts.join(" \u2022 "); + summaryDetail.textContent = detailParts.join(" \u2022 "); + summary.style.display = "flex"; + } + function updateAtsBadge2(score) { + _updateAtsSummary(score); + const badge = document.getElementById("ats-score-badge"); + const valueEl = document.getElementById("ats-score-value"); + if (!badge || !valueEl) { + _dispatchAtsScoreUpdated(); return; } - const overlay = document.createElement("div"); - overlay.id = "clar-amend-overlay"; - overlay.style.cssText = "position:fixed;inset:0;background:rgba(0,0,0,0.5);z-index:10000;display:flex;align-items:center;justify-content:center;overflow-y:auto;"; - const formRows = questions.map((q2, i) => { - const qtype = q2.type || `clarification_${i + 1}`; - const qtext = escapeHtml(q2.question || ""); - const curAns = escapeHtml(answers[qtype] || ""); - const choices = Array.isArray(q2.choices) ? q2.choices : []; - if (choices.length) { - const radios = choices.map((c) => ` - `).join(""); - return ` -
    - - ${radios} -
    `; + if (!score || typeof score.overall !== "number") { + badge.style.display = "none"; + _dispatchAtsScoreUpdated(); + return; + } + const overall = Math.round(score.overall); + valueEl.textContent = `${overall}%`; + badge.style.display = "flex"; + badge.classList.remove("score-high", "score-medium", "score-low"); + if (overall >= 75) { + badge.classList.add("score-high"); + } else if (overall >= 50) { + badge.classList.add("score-medium"); + } else { + badge.classList.add("score-low"); + } + badge.setAttribute("aria-label", `ATS match score: ${overall}% (${score.basis || "review"})`); + _dispatchAtsScoreUpdated(); + } + async function refreshAtsScore2(basis = "review_checkpoint") { + const sessionId2 = globalThis.stateManager?.getSessionId?.(); + if (!sessionId2) return; + try { + const res = await fetch("/api/cv/ats-score", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ session_id: sessionId2, basis }) + }); + if (!res.ok) return; + const data = await res.json(); + if (data.ok && data.ats_score) { + globalThis.stateManager?.setAtsScore?.(data.ats_score); + updateAtsBadge2(data.ats_score); } - return ` -
    - - -
    `; - }).join(""); - overlay.innerHTML = ` -
    -

    \u21BB Amend Clarification Answers

    -

    - Update your answers before rerunning analysis, or keep them as-is. -

    -
    - ${formRows} -
    -
    - - - -
    -
    `; - document.body.appendChild(overlay); - if (typeof _focusedElementBeforeModal !== "undefined") window._focusedElementBeforeModal = document.activeElement; - if (typeof trapFocus === "function") trapFocus("clar-amend-overlay"); - overlay.querySelector("#clar-amend-save").focus(); - function closeModal2() { - overlay.remove(); - if (typeof restoreFocus === "function") restoreFocus(); + } catch (_e2) { } - overlay.querySelector("#clar-amend-cancel").addEventListener("click", closeModal2); - overlay.addEventListener("click", (e) => { - if (e.target === overlay) closeModal2(); - }); - overlay.addEventListener("keydown", (e) => { - if (e.key === "Escape") closeModal2(); - }); - overlay.querySelector("#clar-amend-keep").addEventListener("click", () => { - closeModal2(); - onProceed(); + } + var _atsRefreshTimer = null; + function scheduleAtsRefresh2(basis = "review_checkpoint") { + clearTimeout(_atsRefreshTimer); + _atsRefreshTimer = setTimeout(() => refreshAtsScore2(basis), 600); + } + function _refreshSummaryFromState() { + const score = globalThis.stateManager?.getAtsScore?.(); + if (score && typeof score.overall === "number") { + _updateAtsSummary(score); + } + } + if (typeof window !== "undefined") { + window.addEventListener("cvbuilder:generation-state-changed", () => { + _refreshSummaryFromState(); }); - overlay.querySelector("#clar-amend-save").addEventListener("click", async () => { - const form = document.getElementById("clar-amend-form"); - const updated = {}; - questions.forEach((q2, i) => { - const qtype = q2.type || `clarification_${i + 1}`; - const el = form.querySelector(`[name="clar-${qtype}"]`); - if (!el) return; - if (el.type === "radio") { - const checked = form.querySelector(`[name="clar-${qtype}"]:checked`); - if (checked) updated[qtype] = checked.value; - } else { - const val = el.value.trim(); - if (val) updated[qtype] = val; - } + } + if (typeof document !== "undefined") { + const positionTitleEl = document.getElementById("position-title"); + if (positionTitleEl && typeof MutationObserver !== "undefined") { + const titleObserver = new MutationObserver(() => { + _refreshSummaryFromState(); }); - closeModal2(); - try { - await fetch("/api/post-analysis-responses", { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ questions, answers: updated }) - }); - window.questionAnswers = updated; - } catch (_e2) { + titleObserver.observe(positionTitleEl, { + childList: true, + characterData: true, + subtree: true + }); + } + } + + // web/message-queue.js + var message_queue_exports = {}; + __export(message_queue_exports, { + _flushMessageQueue: () => _flushMessageQueue2, + _messageQueue: () => _messageQueue, + appendFormattedAnalysis: () => appendFormattedAnalysis2, + appendFormattedResponse: () => appendFormattedResponse, + appendLoadingMessage: () => appendLoadingMessage2, + appendMessage: () => appendMessage2, + appendMessageHtml: () => appendMessageHtml, + appendRawHtml: () => appendRawHtml2, + appendRetryMessage: () => appendRetryMessage2, + removeLoadingMessage: () => removeLoadingMessage2 + }); + var log5 = getLogger("message-queue"); + var _messageQueue = []; + function _flushMessageQueue2() { + while (_messageQueue.length) { + const { type, text: text2 } = _messageQueue.shift(); + appendMessage2(type, text2); + } + } + function appendLoadingMessage2(text2) { + const conversation = document.getElementById("conversation"); + const message = document.createElement("div"); + message.className = "message system"; + const content = document.createElement("div"); + content.className = "content loading-message"; + content.innerHTML = `
    ${text2}`; + message.appendChild(content); + conversation.appendChild(message); + conversation.scrollTop = conversation.scrollHeight; + return message; + } + function removeLoadingMessage2(messageElement) { + if (messageElement && messageElement.parentNode) { + messageElement.parentNode.removeChild(messageElement); + } + } + function appendMessageHtml(type, html2) { + const conversation = document.getElementById("conversation"); + const message = document.createElement("div"); + message.className = `message ${type}`; + const content = document.createElement("div"); + content.className = "content"; + content.innerHTML = html2; + message.appendChild(content); + conversation.appendChild(message); + conversation.scrollTop = conversation.scrollHeight; + } + var COLLAPSE_LINE_THRESHOLD = 8; + var COLLAPSE_CHAR_THRESHOLD = 480; + function _makeCollapsibleContent(html2, textStr) { + const lines = textStr.split("\n"); + if (lines.length <= COLLAPSE_LINE_THRESHOLD && textStr.length <= COLLAPSE_CHAR_THRESHOLD) { + return { html: html2, collapsible: false }; + } + const previewLines = lines.slice(0, COLLAPSE_LINE_THRESHOLD); + const previewHtml = escapeHtml2(previewLines.join("\n")).replace(/\*\*(.+?)\*\*/g, "$1").replace(/\*(.+?)\*/g, "$1").replace(/`([^`]+)`/g, "$1").replace(/\n/g, "
    "); + const overflow = lines.length - COLLAPSE_LINE_THRESHOLD; + const id = `collapsible-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`; + const wrapped = ` +
    ${previewHtml}
    + + `; + return { html: wrapped, collapsible: true }; } - async function reRunPhase(step) { - if (step === "analysis") { - await _showAnalysisClarificationAmendModal(() => _executeReRunPhase("analysis")); - return; + function appendMessage2(type, text2) { + const conversation = document.getElementById("conversation"); + if (!conversation) { + _messageQueue.push({ type, text: text2 }); + return null; + } + const message = document.createElement("div"); + message.className = `message ${type}`; + const content = document.createElement("div"); + content.className = "content"; + const textStr = typeof text2 === "string" ? text2 : JSON.stringify(text2, null, 2); + const renderedHtml = escapeHtml2(textStr).replace(/\*\*(.+?)\*\*/g, "$1").replace(/\*(.+?)\*/g, "$1").replace(/`([^`]+)`/g, "$1").replace(/\n/g, "
    "); + if (type === "user" || type === "assistant") { + const { html: html2, collapsible } = _makeCollapsibleContent(renderedHtml, textStr); + content.innerHTML = html2; + if (collapsible) content.classList.add("collapsible-msg"); + } else { + content.innerHTML = renderedHtml; + } + message.appendChild(content); + const optionsMatch = textStr.match(/\(([^)]+\/[^)]+)\)\s*$/); + if (optionsMatch && type === "assistant") { + const options = optionsMatch[1].split("/").map((opt) => opt.trim()); + const buttonContainer = document.createElement("div"); + buttonContainer.style.cssText = "margin-top: 12px; display: flex; gap: 8px; flex-wrap: wrap;"; + options.forEach((option) => { + const btn = document.createElement("button"); + btn.textContent = option; + btn.className = "action-btn"; + btn.style.cssText = "padding: 8px 16px; background: #3b82f6; color: white; border: none; border-radius: 6px; cursor: pointer;"; + btn.onclick = () => { + document.getElementById("message-input").value = option; + if (typeof sendMessage === "function") sendMessage(); + }; + buttonContainer.appendChild(btn); + }); + message.appendChild(buttonContainer); } - await _executeReRunPhase(step); + conversation.appendChild(message); + conversation.scrollTop = conversation.scrollHeight; + return message; } - async function _executeReRunPhase(step) { - const loadingMsg = appendLoadingMessage(`\u21BB Re-running ${step}\u2026`); - setLoading(true, `Re-running ${step}\u2026`); - try { - const res = await fetch("/api/re-run-phase", { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ phase: step }) - }); - const data = await res.json(); - removeLoadingMessage(loadingMsg); - setLoading(false); - if (!res.ok || !data.ok) { - appendRetryMessage("\u26A0 Re-run failed: " + (data.error || "Unknown error"), () => reRunPhase(step)); - return; - } - appendMessage("assistant", `\u2705 ${step} re-run complete. Review the updated results \u2014 changed items are highlighted.`); - await fetchStatus(); - if (step === "spell") window._spellCheckCache = null; - if (step === "rewrite") window._rewritePanelCache = null; - const tabMap = { - analysis: "analysis", - customizations: "goals", - rewrite: "rewrite", - spell: "spell" + function appendRetryMessage2(text2, retryFn, retryLabel = "Retry", cancelFn = null) { + const conversation = document.getElementById("conversation"); + const message = document.createElement("div"); + message.className = "message system"; + const content = document.createElement("div"); + content.className = "content"; + const escaped = escapeHtml2(text2); + content.innerHTML = escaped.replace(/\*\*(.+?)\*\*/g, "$1").replace(/\n/g, "
    "); + message.appendChild(content); + if (typeof retryFn === "function") { + const btn = document.createElement("button"); + btn.textContent = retryLabel; + btn.style.cssText = "margin-top:8px;padding:6px 14px;background:#3b82f6;color:#fff;border:none;border-radius:6px;cursor:pointer;font-size:0.85rem;display:inline-block;margin-right:8px;"; + btn.onclick = () => { + message.remove(); + retryFn(); }; - if (tabMap[step]) switchTab(tabMap[step]); - if (data.prior_output && data.new_output) { - setTimeout(() => _highlightChangedItems(step, data.prior_output, data.new_output), 300); - } - } catch (err) { - removeLoadingMessage(loadingMsg); - setLoading(false); - appendRetryMessage("\u26A0 Network error in reRunPhase: " + err.message, () => reRunPhase(step)); + message.appendChild(btn); } - } - function _highlightChangedItems(step, priorOutput, newOutput) { - if (step === "rewrite") { - const priorIds = new Set((priorOutput.pending_rewrites || []).map((r) => String(r.id))); - const newItems = newOutput.pending_rewrites || []; - for (const item of newItems) { - const id = String(item.id || ""); - const cardId = id.replace(/[^a-zA-Z0-9_-]/g, "_"); - const el = document.getElementById(`rw-card-${cardId}`); - if (!el) continue; - const isNew = !priorIds.has(id); - const priorItem = (priorOutput.pending_rewrites || []).find((r) => String(r.id) === id); - const changed = isNew || priorItem && priorItem.proposed !== item.proposed; - if (changed) _markChanged(el); - } - return; + if (typeof cancelFn === "function") { + const cancelBtn = document.createElement("button"); + cancelBtn.textContent = "Stop retries"; + cancelBtn.style.cssText = "margin-top:8px;padding:6px 14px;background:#6b7280;color:#fff;border:none;border-radius:6px;cursor:pointer;font-size:0.85rem;display:inline-block;"; + cancelBtn.onclick = () => { + message.remove(); + cancelFn(); + }; + message.appendChild(cancelBtn); } - if (step === "customizations") { - const priorExpIds = new Set( - (priorOutput.customizations?.experience_recommendations || []).map((r) => String(r.id)) - ); - const newExpRecs = newOutput.customizations?.experience_recommendations || []; - for (const rec of newExpRecs) { - const id = String(rec.id || ""); - const el = document.querySelector(`tr[data-exp-id="${CSS.escape(id)}"]`); - if (!el) continue; - const prior = (priorOutput.customizations?.experience_recommendations || []).find((r) => String(r.id) === id); - if (!priorExpIds.has(id) || prior && prior.recommendation !== rec.recommendation) { - _markChanged(el); + conversation.appendChild(message); + conversation.scrollTop = conversation.scrollHeight; + return message; + } + function appendFormattedAnalysis2(result) { + try { + const cleanResult = cleanJsonResponse2(result); + const data = typeof cleanResult === "string" ? JSON.parse(cleanResult) : cleanResult; + if (data && typeof data === "object" && (data.title || data.required_skills)) { + const conversation = document.getElementById("conversation"); + const message = document.createElement("div"); + message.className = "message assistant"; + const content = document.createElement("div"); + content.className = "content job-analysis"; + let html2 = "

    \u{1F4CB} Job Analysis Complete

    "; + if (data.title) html2 += `

    Position: ${data.title} at ${data.company || "Company"}

    `; + if (data.domain) html2 += `

    Domain: ${data.domain}

    `; + if (data.required_skills?.length) { + html2 += "

    \u{1F3AF} Required Skills:

      "; + data.required_skills.forEach((s) => { + html2 += `
    • ${s}
    • `; + }); + html2 += "
    "; } - } - const priorSkills = new Set( - (priorOutput.customizations?.skill_recommendations || []).map((r) => (r.skill || "").toLowerCase()) - ); - const newSkillRecs = newOutput.customizations?.skill_recommendations || []; - for (const rec of newSkillRecs) { - const name = (rec.skill || "").toLowerCase(); - const el = document.querySelector(`tr[data-skill="${CSS.escape(name)}"]`); - if (!el) continue; - const prior = (priorOutput.customizations?.skill_recommendations || []).find( - (r) => (r.skill || "").toLowerCase() === name - ); - if (!priorSkills.has(name) || prior && prior.recommendation !== rec.recommendation) { - _markChanged(el); + if (data.preferred_skills?.length) { + html2 += "

    \u2B50 Preferred Skills:

      "; + data.preferred_skills.forEach((s) => { + html2 += `
    • ${s}
    • `; + }); + html2 += "
    "; + } + if (data.nice_to_have_requirements?.length) { + html2 += "

    \u2728 Nice to Have:

      "; + data.nice_to_have_requirements.forEach((r) => { + html2 += `
    • ${r}
    • `; + }); + html2 += "
    "; + } + if (data.ats_keywords?.length) { + html2 += '

    \u{1F511} ATS Keywords:

    '; + data.ats_keywords.forEach((kw) => { + html2 += `${kw}`; + }); + html2 += "

    "; } + content.innerHTML = html2; + message.appendChild(content); + conversation.appendChild(message); + conversation.scrollTop = conversation.scrollHeight; + } else { + appendMessage2("assistant", result); } - return; + } catch (e) { + log5.error("Analysis display error:", e); + appendMessage2("assistant", result); } } - function _markChanged(el) { - el.setAttribute("data-changed", "true"); - setTimeout(() => el.removeAttribute("data-changed"), 2500); - } - async function showBulletReorder2(expId, expTitle) { - let achievements = []; - let proposedOrder = null; - let hasJobAnalysis = false; - let proposedReasoning = ""; - let proposedAtsImpact = ""; - let proposedPageImpact = ""; + function appendFormattedResponse(response) { try { - const detailsRes = await fetch("/api/experience-details", { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ experience_id: expId }) - }); - if (!detailsRes.ok) { - let detailsErr = `HTTP ${detailsRes.status}`; - try { - const payload = await detailsRes.json(); - detailsErr = payload.error || payload.message || detailsErr; - } catch (_2) { - } - throw new Error(detailsErr); - } - const detailsData = await detailsRes.json(); - achievements = detailsData.experience && detailsData.experience.achievements || []; - const recRecord = _findExperienceRecommendationRecord(expId); - const llmBulletOrder = recRecord && typeof recRecord.bullet_order === "object" ? recRecord.bullet_order : null; - if (Array.isArray(llmBulletOrder?.order) && llmBulletOrder.order.length > 1) { - proposedOrder = llmBulletOrder.order; - hasJobAnalysis = true; - proposedReasoning = String(llmBulletOrder.reasoning || "").trim(); - proposedAtsImpact = String(llmBulletOrder.ats_impact || "").trim(); - proposedPageImpact = String(llmBulletOrder.page_length_impact || "").trim(); + const data = typeof response === "string" ? JSON.parse(response) : response; + if (data && typeof data === "object" && (data.title || data.required_skills)) { + appendFormattedAnalysis2(response); + } else { + appendMessage2("assistant", response); } - if (!proposedOrder) { - try { - const proposedRes = await fetch(`/api/proposed-bullet-order?experience_id=${encodeURIComponent(expId)}`); - if (proposedRes.ok) { - const proposedData = await proposedRes.json(); - proposedOrder = proposedData.proposed_order || null; - hasJobAnalysis = proposedData.has_job_analysis || false; - } else { - log6.warn("Could not load suggested bullet order:", proposedRes.status); - } - } catch (e) { - log6.warn("Could not load suggested bullet order:", e); - } + } catch (e) { + appendMessage2("assistant", response); + } + } + function appendRawHtml2(html2) { + const conversation = document.getElementById("conversation"); + if (!conversation) return; + conversation.insertAdjacentHTML("beforeend", html2); + conversation.scrollTop = conversation.scrollHeight; + } + + // web/review-table-base.js + var review_table_base_exports = {}; + __export(review_table_base_exports, { + _loadReviewPane: () => _loadReviewPane, + _resolvedExpAction: () => _resolvedExpAction, + _resolvedSkillAction: () => _resolvedSkillAction, + _updatePageEstimate: () => _updatePageEstimate2, + bulkAction: () => bulkAction, + handleActionClick: () => handleActionClick2, + handleCustomizationResponse: () => handleCustomizationResponse2, + loadTabContent: () => loadTabContent, + populateAnalysisTab: () => populateAnalysisTab, + populateReviewTab: () => populateReviewTab, + populateTaglineReviewTab: () => populateTaglineReviewTab, + showTableBasedReview: () => showTableBasedReview2, + switchReviewSubtab: () => switchReviewSubtab, + switchTab: () => switchTab2, + updateInclusionCounts: () => updateInclusionCounts2, + userSelections: () => userSelections2 + }); + var log6 = getLogger("review-table-base"); + var userSelections2 = { + experiences: {}, + // exp_id -> 'emphasize'|'include'|'de-emphasize'|'exclude' + skills: {} + // skill_name -> 'emphasize'|'include'|'de-emphasize'|'exclude' + }; + var pageEstimateTimer = null; + var pageEstimateRequestId = 0; + var _draftInputs = {}; + function _saveDraftInputsForTab(tabName) { + if (!tabName) return; + const content = document.getElementById("document-content"); + if (!content) return; + const saved = {}; + content.querySelectorAll("textarea, input, select").forEach((el) => { + if (!el.id || el.type === "file") return; + saved[el.id] = el.type === "checkbox" || el.type === "radio" ? el.checked : el.value; + }); + if (Object.keys(saved).length > 0) { + _draftInputs[tabName] = saved; + } + } + function _restoreDraftInputsForTab(tabName) { + const cached = _draftInputs[tabName]; + if (!cached) return; + Object.entries(cached).forEach(([id, value]) => { + const el = document.getElementById(id); + if (!el || el.readOnly || el.disabled || el.type === "file") return; + if (el.type === "checkbox" || el.type === "radio") { + el.checked = value; + } else { + el.value = value; } + }); + } + function ensureTabDataState() { + return stateManager2.getAllTabData(); + } + function isReconnectInProgress() { + return stateManager2.isReconnecting(); + } + function updateInclusionCounts2() { + try { + const expDecs = window._savedDecisions && window._savedDecisions.experience_decisions || userSelections2.experiences || {}; + const skillDecs = window._savedDecisions && window._savedDecisions.skill_decisions || userSelections2.skills || {}; + const achDecs = window._savedDecisions && window._savedDecisions.achievement_decisions || window.achievementDecisions || {}; + const expIncluded = Object.values(expDecs).filter((v2) => v2 !== "exclude").length; + const skillIncluded = Object.values(skillDecs).filter((v2) => v2 !== "exclude").length; + const achIncluded = Object.values(achDecs).filter((v2) => v2 !== "exclude").length; + const expTab = document.getElementById("tab-exp-review"); + const skillTab = document.getElementById("tab-skills-review"); + const achTab = document.getElementById("tab-achievements-review"); + if (expTab) expTab.textContent = `\u{1F4CA} Experiences${expIncluded ? " (" + expIncluded + ")" : ""}`; + if (skillTab) skillTab.textContent = `\u{1F6E0}\uFE0F Skills${skillIncluded ? " (" + skillIncluded + ")" : ""}`; + if (achTab) achTab.textContent = `\u{1F3C6} Achievements${achIncluded ? " (" + achIncluded + ")" : ""}`; } catch (e) { - const errorText = e.message === "Failed to fetch" ? "Failed to fetch (server unavailable)." : e.message; - appendRetryMessage("\u26A0 Could not load bullets: " + errorText, () => showBulletReorder2(expId, expTitle)); - return; + log6.warn("Failed to update inclusion counts:", e); } - if (!achievements.length) { - appendMessage("system", "No bullet points found for this experience."); + } + function _populateGenerateTab(cvData, content) { + if (!cvData || !cvData.files || !cvData.files.length) { + content.innerHTML = '
    \u{1F4C4}

    Generated CV

    Generate CV to see preview

    '; return; } - if (typeof _focusedElementBeforeModal !== "undefined") { - _focusedElementBeforeModal = document.activeElement; + const meta = cvData.metadata || {}; + const role = meta.role || meta.position || ""; + const company = meta.company || ""; + const subtitle = role && company ? `${role} \u2014 ${company}` : role || company || "CV generated"; + const ICONS = { ".pdf": "\u{1F4C4}", ".docx": "\u{1F4DD}", ".html": "\u{1F310}" }; + const LABELS = { + ".pdf": (f) => f.includes("ATS") ? "ATS PDF" : "Human PDF", + ".docx": (f) => f.includes("ATS") ? "ATS DOCX" : f.startsWith("CoverLetter_") ? "Cover Letter" : "Human DOCX", + ".html": () => "HTML" + }; + const downloadableExts = /* @__PURE__ */ new Set([".pdf", ".docx", ".html"]); + const files = (cvData.files || []).filter((f) => { + const ext = f.slice(f.lastIndexOf(".")).toLowerCase(); + return downloadableExts.has(ext) && f !== "job_description.txt"; + }); + const sid = typeof getSessionIdFromURL === "function" ? getSessionIdFromURL() : null; + const sessionParam = sid ? `?session_id=${encodeURIComponent(sid)}` : ""; + let fileRows = ""; + for (const f of files) { + const ext = f.slice(f.lastIndexOf(".")).toLowerCase(); + const icon = ICONS[ext] || "\u{1F4C1}"; + const label = LABELS[ext] ? LABELS[ext](f) : f; + fileRows += ` +
    + ${icon} +
    +
    ${label}
    +
    ${escapeHtml(f)}
    +
    + Download +
    `; } - const modal = document.createElement("div"); - modal.id = "bullet-reorder-modal"; - modal.setAttribute("role", "dialog"); - modal.setAttribute("aria-modal", "true"); - modal.setAttribute("aria-labelledby", "bullet-reorder-title"); - modal.style.cssText = ` - position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.5); - z-index:9999;display:flex;align-items:center;justify-content:center;`; - const suggestedBtn = hasJobAnalysis ? `` : ""; - const suggestionMeta = proposedReasoning || proposedAtsImpact || proposedPageImpact ? `
    - ${proposedReasoning ? `
    AI rationale: ${escapeHtml(proposedReasoning)}
    ` : ""} - ${proposedAtsImpact ? `
    ATS impact: ${escapeHtml(proposedAtsImpact)}
    ` : ""} - ${proposedPageImpact ? `
    Page length impact: ${escapeHtml(proposedPageImpact)}
    ` : ""} -
    ` : ""; - modal.innerHTML = ` -
    -
    + content.innerHTML = ` +
    +
    + \u2705
    -

    \u2195 Reorder Bullets

    -
    ${expTitle}
    +

    CV Generated

    +
    ${escapeHtml(subtitle)}
    -
    -
    - Use \u2191 \u2193 to reorder. Bullets higher in the list appear first on your CV. - The most relevant bullet will be auto-ranked highest if you reset. +
    + ${fileRows}
    - ${suggestionMeta} -
      -
    -
    - ${suggestedBtn} - - +
    `; - document.body.appendChild(modal); - if (typeof trapFocus === "function") trapFocus("bullet-reorder-modal"); - if (typeof setInitialFocus === "function") setInitialFocus("bullet-reorder-modal"); - const escHandler = (e) => { - if (e.key === "Escape") { - e.preventDefault(); - restoreFocus(); - modal.remove(); - document.removeEventListener("keydown", escHandler); + } + var _visitedCustomiseTabs = /* @__PURE__ */ new Set(); + var _CUSTOMISE_TABS = /* @__PURE__ */ new Set(["goals", "questions", "exp-review", "ach-editor", "skills-review", "achievements-review", "tagline-review", "summary-review", "publications-review", "ats-score"]); + function _updateVisitedTabIndicators() { + _visitedCustomiseTabs.forEach((name) => { + const el = document.getElementById(`tab-${name}`); + if (el) el.classList.add("tab--visited"); + }); + } + function switchTab2(tab) { + if (typeof resetCardFocus === "function") resetCardFocus(); + _saveDraftInputsForTab(stateManager2.getCurrentTab()); + let _switchTabStage = null; + if (typeof getStageForTab === "function" && typeof updateTabBarForStage === "function") { + _switchTabStage = getStageForTab(tab); + if (_switchTabStage) { + updateTabBarForStage(_switchTabStage); + updateActionButtons(_switchTabStage); + } + } + if (typeof stateManager2?.getPhase === "function" && typeof updateWorkflowStepsClickable === "function") { + updateWorkflowStepsClickable(stateManager2.getPhase()); + } + document.querySelectorAll(".tab").forEach((t) => { + t.classList.remove("active"); + t.setAttribute("aria-selected", "false"); + t.setAttribute("tabindex", "-1"); + }); + const activeTab = document.getElementById(`tab-${tab}`); + if (activeTab) { + activeTab.classList.add("active"); + activeTab.setAttribute("aria-selected", "true"); + activeTab.setAttribute("tabindex", "0"); + const tabpanel = document.getElementById("document-content"); + if (tabpanel) tabpanel.setAttribute("aria-labelledby", `tab-${tab}`); + } + stateManager2.setCurrentTab(tab); + if (_CUSTOMISE_TABS.has(tab)) { + _visitedCustomiseTabs.add(tab); + _updateVisitedTabIndicators(); + } + const announcer = document.getElementById("workflow-stage-announcer"); + if (announcer && activeTab) { + const stageLabel = _switchTabStage ? _STEP_DISPLAY[_switchTabStage] : null; + const tabLabel = activeTab.textContent.trim(); + const message = stageLabel ? `Now viewing: ${stageLabel} \u2014 ${tabLabel}` : `Now viewing: ${tabLabel}`; + announcer.textContent = ""; + setTimeout(() => { + announcer.textContent = message; + }, 50); + } + if (typeof _updateViewingIndicator === "function") _updateViewingIndicator(tab); + const content = document.getElementById("document-content"); + content.classList.toggle("full-width", tab !== "generate"); + loadTabContent(tab); + } + async function loadTabContent(tab) { + const content = document.getElementById("document-content"); + const tabData2 = ensureTabDataState(); + try { + switch (tab) { + case "job": + await populateJobTab(); + break; + case "goals": + if (typeof populateGoalsTab === "function") await populateGoalsTab(); + break; + case "analysis": + if (tabData2.analysis) { + populateAnalysisTab(tabData2.analysis); + } else { + content.innerHTML = '
    \u{1F50D}

    Job Analysis

    Click "Analyze Job" to generate analysis

    '; + } + break; + case "questions": + populateQuestionsTab(); + break; + case "customizations": + switchTab2("exp-review"); + return; + case "exp-review": + await populateReviewTab("experiences"); + break; + case "ach-editor": + await buildAchievementsEditor(); + break; + case "skills-review": + await populateReviewTab("skills"); + break; + case "achievements-review": + await populateReviewTab("achievements"); + break; + case "tagline-review": + await populateTaglineReviewTab(); + break; + case "summary-review": + await populateReviewTab("summary"); + break; + case "publications-review": + await populateReviewTab("publications"); + break; + case "ats-score": + if (typeof populateAtsScoreTab === "function") await populateAtsScoreTab(); + break; + case "rewrite": + if (window._rewritePanelCache) { + renderRewritePanel( + window._rewritePanelCache.rewrites, + window._rewritePanelCache.warnings + ); + } else { + content.innerHTML = '
    \u270F\uFE0F

    Rewrites

    Loading rewrites\u2026

    '; + try { + const data = await apiCall("GET", "/api/rewrites"); + if (data.rewrites) { + renderRewritePanel(data.rewrites, data.persuasion_warnings || []); + } else { + content.innerHTML = '
    \u270F\uFE0F

    Rewrites

    Complete customizations to reach this step

    '; + } + } catch (e) { + content.innerHTML = '
    \u270F\uFE0F

    Rewrites

    Complete customizations to reach this step

    '; + } + } + break; + case "editor": + await populateCVEditorTab(); + break; + case "generate": + _populateGenerateTab(tabData2.cv, content); + break; + case "download": + if (tabData2.cv && Object.keys(tabData2.cv).length > 0) { + await populateDownloadTab(tabData2.cv); + } else { + content.innerHTML = '
    \u2B07\uFE0F

    Download

    Generate CV to enable downloads

    '; + } + break; + case "spell": + await populateSpellCheckTab(); + break; + case "layout": + initiateLayoutInstructions(); + break; + case "finalise": + await populateFinaliseTab(); + break; + case "harvest": + if (typeof populateHarvestTab === "function") await populateHarvestTab(); + break; + case "interview-prep": + if (typeof populateInterviewPrepTab === "function") await populateInterviewPrepTab(); + break; + case "thank-you": + if (typeof populateThankYouTab === "function") await populateThankYouTab(); + break; + case "master": + await populateMasterTab(); + break; + case "cover-letter": + await populateCoverLetterTab(); + break; + case "screening": + await populateScreeningTab(); + break; } - }; - document.addEventListener("keydown", escHandler); - const list = document.getElementById("bullet-reorder-list"); - achievements.forEach((ach, idx) => { - const text2 = typeof ach === "object" ? ach.text || "" : String(ach); - const li = document.createElement("li"); - li.dataset.origIndex = idx; - li.style.cssText = `display:flex;align-items:flex-start;gap:8px;padding:8px;margin-bottom:6px; - background:#f8fafc;border:1px solid #e2e8f0;border-radius:6px;`; - li.innerHTML = ` -
    - - -
    - ${text2}`; - list.appendChild(li); - }); - _updateBulletArrows(); - if (hasJobAnalysis && proposedOrder) { - document.getElementById("use-llm-order-btn")?.addEventListener("click", () => { - _applyBulletOrder(proposedOrder); - }); + } catch (error) { + log6.error(`Error loading tab ${tab}:`, error); + const errorMessage = document.createElement("p"); + errorMessage.style.cssText = "padding: 20px; color: #c41e3a;"; + errorMessage.textContent = `Error loading content: ${error.message}`; + content.appendChild(errorMessage); + return; } + _restoreDraftInputsForTab(tab); } - function _applyBulletOrder(order) { - const list = document.getElementById("bullet-reorder-list"); - if (!list) return; - const items = Array.from(list.querySelectorAll("li")); - const byOrig = {}; - items.forEach((li) => { - byOrig[parseInt(li.dataset.origIndex, 10)] = li; - }); - const listed = new Set(order.map(Number)); - order.forEach((idx) => { - if (byOrig[idx]) list.appendChild(byOrig[idx]); - }); - items.forEach((li) => { - if (!listed.has(parseInt(li.dataset.origIndex, 10))) list.appendChild(li); - }); - _updateBulletArrows(); + async function showTableBasedReview2() { + if (!window.pendingRecommendations) { + appendMessage("assistant", "No recommendations to review. Please generate customizations first."); + return; + } + switchTab2("exp-review"); + appendMessage("assistant", "\u2705 Customizations generated! Please review each section in the **Customizations** tab \u2014 Experiences, Achievements, Skills, Summary, and Publications. Select your preferences using the action buttons, then submit your decisions."); } - function moveBullet(btn, direction) { - const li = btn.closest("li"); - const list = li.parentNode; - if (direction === -1 && li.previousElementSibling) { - list.insertBefore(li, li.previousElementSibling); - } else if (direction === 1 && li.nextElementSibling) { - list.insertBefore(li.nextElementSibling, li); + var _synonymMapCache = null; + async function _loadSynonymMap() { + if (_synonymMapCache) return _synonymMapCache; + try { + const sessionId2 = stateManager2.getSessionId && stateManager2.getSessionId(); + const url = sessionId2 ? `/api/synonym-map?session_id=${encodeURIComponent(sessionId2)}` : "/api/synonym-map"; + const res = await fetch(url); + if (!res.ok) return _synonymMapCache = {}; + const raw = await res.json(); + const aliasToCanon = {}; + const canonToAliases = {}; + Object.entries(raw).forEach(([alias, canon]) => { + aliasToCanon[alias.toLowerCase()] = canon; + const cl = canon.toLowerCase(); + (canonToAliases[cl] = canonToAliases[cl] || []).push(alias); + }); + _synonymMapCache = { aliasToCanon, canonToAliases }; + } catch (_2) { + _synonymMapCache = {}; } - _updateBulletArrows(); + return _synonymMapCache; } - function _updateBulletArrows() { - const list = document.getElementById("bullet-reorder-list"); - if (!list) return; - const items = list.querySelectorAll("li"); - items.forEach((li, idx) => { - const [upBtn, downBtn] = li.querySelectorAll("button"); - upBtn.disabled = idx === 0; - downBtn.disabled = idx === items.length - 1; - upBtn.style.opacity = upBtn.disabled ? "0.3" : "1"; - downBtn.style.opacity = downBtn.disabled ? "0.3" : "1"; - }); + function _kwSynonymAnnotation(kw, synMap) { + if (!synMap || !synMap.aliasToCanon && !synMap.canonToAliases) return ""; + const kl = kw.toLowerCase(); + if (synMap.aliasToCanon[kl]) return ` = ${synMap.aliasToCanon[kl]}`; + const aliases = synMap.canonToAliases && synMap.canonToAliases[kl]; + if (aliases && aliases.length) return ` (${aliases.join(", ")})`; + return ""; } - async function saveBulletOrder(expId) { - const list = document.getElementById("bullet-reorder-list"); - const items = list ? list.querySelectorAll("li") : []; - const order = Array.from(items).map((li) => parseInt(li.dataset.origIndex, 10)); + async function populateAnalysisTab(result) { + const content = document.getElementById("document-content"); try { - const res = await fetch("/api/reorder-bullets", { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ experience_id: expId, order }) - }); - const data = await res.json(); - if (!res.ok || !data.ok) { - appendRetryMessage("\u26A0 Could not save bullet order: " + (data.error || "Unknown"), () => saveBulletOrder(expId)); - return; + let data; + if (result !== null && typeof result === "object") { + data = result; + } else { + const cleanResult = cleanJsonResponse(result); + data = typeof cleanResult === "string" ? JSON.parse(cleanResult) : cleanResult; + } + stateManager2.setTabData("analysis", result); + saveTabData(); + let html2 = '
    '; + html2 += '
    '; + html2 += `

    ${data.title || "Role"}

    `; + if (data.company) html2 += `

    \u{1F3E2} ${data.company}

    `; + html2 += '
    '; + if (data.domain) { + const conf = data.domain_confidence; + let confLabel = ""; + let confTitle = ""; + if (typeof conf === "number") { + if (conf >= 0.8) { + confLabel = ""; + confTitle = `Domain confidence: High (${Math.round(conf * 100)}%)`; + } else if (conf >= 0.6) { + confLabel = " \u26A0"; + confTitle = `Domain confidence: Medium (${Math.round(conf * 100)}%) \u2014 verify this is correct`; + } else { + confLabel = " \u26A0"; + confTitle = `Domain confidence: Low (${Math.round(conf * 100)}%) \u2014 the JD spans multiple domains; consider overriding`; + } + } + html2 += `\u{1F52C} ${escapeHtml(data.domain)}${confLabel}`; + } + if (data.role_level) html2 += `\u{1F4CA} ${data.role_level}`; + if (data.suggested_summary) html2 += `\u{1F4AC} ${data.suggested_summary}`; + html2 += "
    "; + const requiredSkills = Array.isArray(data.required_skills) ? data.required_skills : []; + const masterSkills = window._masterSkills || []; + if (requiredSkills.length > 0 && masterSkills.length > 0) { + const missing = requiredSkills.filter( + (skill) => !masterSkills.some((ms) => ms.includes(skill.toLowerCase()) || skill.toLowerCase().includes(ms)) + ); + if (missing.length > 0) { + html2 += `
    \u26A0 ${missing.length} required skill${missing.length > 1 ? "s" : ""} not found in your master CV: ${missing.join(", ")}
    `; + } + } + if (requiredSkills.length > 0) { + html2 += '

    \u{1F3AF} Required Skills

    '; + requiredSkills.forEach((skill) => { + const isMissing = masterSkills.length > 0 && !masterSkills.some( + (ms) => ms.includes(skill.toLowerCase()) || skill.toLowerCase().includes(ms) + ); + html2 += `${skill}${isMissing ? ' (not in master CV)' : ""}`; + }); + html2 += "
    "; + } + const preferred = [ + ...Array.isArray(data.preferred_skills) ? data.preferred_skills : [], + ...Array.isArray(data.nice_to_have_requirements) ? data.nice_to_have_requirements : [] + ]; + if (preferred.length > 0) { + html2 += '

    \u2B50 Preferred / Nice-to-Have

      '; + preferred.forEach((item) => { + html2 += `
    • ${item}
    • `; + }); + html2 += "
    "; + } + const atsKws = Array.isArray(data.ats_keywords) ? data.ats_keywords : []; + if (atsKws.length > 0) { + const synMap = await _loadSynonymMap(); + html2 += '

    \u{1F511} ATS Keywords (higher rank = higher priority)

    '; + atsKws.forEach((kw, idx) => { + const annotation = _kwSynonymAnnotation(kw, synMap); + const titleAttr = annotation ? ` title="Synonym: ${escapeHtml(kw + annotation)}"` : ""; + const annotHtml = annotation ? `${escapeHtml(annotation)}` : ""; + html2 += `#${idx + 1}${escapeHtml(kw)}${annotHtml}`; + }); + html2 += "
    "; + } + const culture = Array.isArray(data.culture_indicators) ? data.culture_indicators : []; + if (culture.length > 0) { + html2 += '

    \u{1F3E2} Culture Indicators

      '; + culture.forEach((c) => { + html2 += `
    • ${c}
    • `; + }); + html2 += "
    "; + } + const mustHave = Array.isArray(data.must_have_requirements) ? data.must_have_requirements : []; + if (mustHave.length > 0) { + html2 += '

    \u2705 Must-Have Requirements

      '; + mustHave.forEach((r) => { + html2 += `
    • ${r}
    • `; + }); + html2 += "
    "; } - appendMessage("assistant", "\u2195 Bullet order saved. It will apply when you generate the CV."); - document.getElementById("bullet-reorder-modal")?.remove(); + html2 += ``; + html2 += "
    "; + content.innerHTML = html2; } catch (e) { - appendRetryMessage("\u26A0 Network error saving bullet order: " + e.message, () => saveBulletOrder(expId)); + log6.error("Analysis parsing error:", e, "Original result:", result); + content.innerHTML = `
    \u274C

    Analysis Error

    Could not parse analysis results: ${escapeHtml(e.message)}

    Debug Info
    ${escapeHtml(JSON.stringify(result, null, 2))}
    `; } } - async function resetBulletOrder(expId) { + async function handleCustomizationResponse2(response) { try { - const res = await fetch("/api/reorder-bullets", { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ experience_id: expId, order: [] }) - }); - const data = await res.json(); - if (!res.ok || !data.ok) { - appendRetryMessage("\u26A0 Could not reset bullet order: " + (data.error || "Unknown"), () => resetBulletOrder(expId)); + const data = response !== null && typeof response === "object" ? response : extractFirstJsonObject(response); + if (!data) { + appendMessage("assistant", typeof response === "string" ? response : ""); return; } - appendMessage("assistant", "\u21BA Bullet order reset. Relevance-based ordering will apply."); - restoreFocus(); - document.getElementById("bullet-reorder-modal")?.remove(); + if (data && (data.recommended_experiences || data.recommended_skills)) { + stateManager2.setTabData("customizations", data); + window.pendingRecommendations = data; + saveTabData(); + if (!isReconnectInProgress()) { + appendMessage("assistant", "\u2705 Customizations generated! Please review each section in the **Customizations** tab \u2014 Experiences, Achievements, Skills, Summary, and Publications. Select your preferences using the action buttons, then submit your decisions."); + switchTab2("exp-review"); + } + } else if (!isReconnectInProgress()) { + appendMessage("assistant", response); + } } catch (e) { - appendRetryMessage("\u26A0 Network error resetting bullet order: " + e.message, () => resetBulletOrder(expId)); + log6.error("Customization response error:", e); + if (!isReconnectInProgress()) { + appendMessage("assistant", response); + } } } - var _PHASE_PROGRESSION = [ - "init", - "job_analysis", - "customization", - "rewrite_review", - "spell_check", - "generation", - "layout_review", - "final_generation", - "refinement" - ]; - var _STEP_FWD_PHASE_MIN = { - analysis: 1, - // job_analysis - customizations: 2, - // customization - rewrite: 3, - // rewrite_review - spell: 4, - // spell_check - layout: 5, - // generation - download: 7, - // final_generation - cover_letter: 7, - screening: 7, - interview_prep: 7, - thank_you: 7, - harvest: 7 - }; - function updateWorkflowSteps(status) { - const UPCOMING = /* @__PURE__ */ new Set(); - const RE_RUN_STEPS = /* @__PURE__ */ new Set(["analysis", "customizations", "rewrite", "spell", "layout"]); - const STEP_LABELS = { - job: "\u{1F4E5} Job Input", - analysis: "\u{1F50D} Analysis", - customizations: "\u2699\uFE0F Customise", - rewrite: "\u270F\uFE0F Rewrites", - spell: "\u{1F524} Spell Check", - layout: "\u{1F3A8} Layout Review", - download: "\u2B07\uFE0F Download Files", - cover_letter: "\u{1F4E9} Cover Letter", - screening: "\u{1F4CB} Screening", - interview_prep: "\u{1F3A4} Interview Prep", - thank_you: "\u{1F64F} Thank You", - harvest: "\u{1F33E} Harvest" + async function populateReviewTab(pane) { + const content = document.getElementById("document-content"); + const customizations = stateManager2.getTabData("customizations"); + if (!window.pendingRecommendations || !customizations) { + content.innerHTML = '
    \u2699\uFE0F

    Review Customizations

    Click "Recommend Customizations" to generate recommendations.

    '; + return; + } + const paneConfig = { + experiences: { title: "", desc: "Sorted by date (most recent first). Click action buttons to override recommendations.", container: "experience-table-container" }, + skills: { title: "\u{1F6E0}\uFE0F Skills", desc: "Sorted by relevance. Select how to feature each skill.", container: "skills-table-container" }, + achievements: { title: "\u{1F3C6} Achievements", desc: "Select how to feature each key achievement. AI recommendations are pre-selected.", container: "achievements-table-container" }, + summary: { title: "\u{1F4DD} Professional Summary", desc: "Select which professional summary to use. The AI's recommendation is pre-selected.", container: "summary-focus-container" }, + publications: { title: "\u{1F4C4} Publications", desc: "All publications ranked by relevance. Accept or reject each for your CV.", container: "publications-table-container" } }; - const phase = status.phase || ""; - const postLayout = phase === PHASES.FINAL_GENERATION || phase === PHASES.REFINEMENT; - const done = { - job: !!status.job_description, - analysis: !!status.job_analysis, - customizations: !!status.customizations, - rewrite: phase !== PHASES.REWRITE_REVIEW && !!status.customizations, - spell: phase === PHASES.GENERATION || phase === PHASES.LAYOUT_REVIEW || phase === PHASES.FINAL_GENERATION || phase === PHASES.REFINEMENT, - layout: postLayout, - download: postLayout, - cover_letter: postLayout, - screening: postLayout, - interview_prep: postLayout, - thank_you: postLayout, - harvest: postLayout + const cfg = paneConfig[pane] || {}; + const headerHtml = pane === "experiences" ? ` +

    \u2699\uFE0F Review Customization Recommendations

    +

    Review the AI's recommendations. Use the action buttons to adjust each item, then save your decisions before generating the CV.

    +
    + \u{1F4C4} + Estimated length: calculating\u2026 +
    +
    + ` : cfg.title ? `

    ${cfg.title}

    ` : ""; + const navBack = { + skills: ``, + achievements: ``, + publications: `` }; - const highestPhaseIdx = _PHASE_PROGRESSION.indexOf(status.highest_phase || ""); - const currentPhaseIdx = _PHASE_PROGRESSION.indexOf(phase); - const phaseToStep = { - "init": "job", - "job_analysis": "analysis", - "customization": "customizations", - "rewrite_review": "rewrite", - "spell_check": "spell", - "generation": "layout", - "layout_review": "layout", - "final_generation": "download", - "refinement": "download" + const navContinue = { + experiences: ``, + skills: ``, + achievements: ``, + publications: `` }; - const activeStep = phaseToStep[phase] || "job"; - const _phaseToStep2 = Object.assign({ "init": "job" }, phaseToStep); - const reentryStep = status.iterating ? _phaseToStep2[status.reentry_phase] || status.reentry_phase || null : null; - const stepIds = [ - "job", - "analysis", - "customizations", - "rewrite", - "spell", - "layout", - "download", - "cover_letter", - "screening", - "interview_prep", - "thank_you", - "harvest" - ]; - const staleSteps = new Set(status.stale_steps || []); - stepIds.forEach((step) => { - const el = document.getElementById(`step-${step}`); - if (!el) return; - if (UPCOMING.has(step)) return; - el.classList.remove("active", "completed", "clickable", "upcoming", "stale", "forward-skip"); - let label = STEP_LABELS[step] || step; - if (step === activeStep) { - el.classList.add("active"); - if (status.iterating && reentryStep === step) { - label += ' \u21BB Refining'; - } - } else if (done[step]) { - el.classList.add("completed"); - el.classList.add("clickable"); - if (RE_RUN_STEPS.has(step)) { - const rerunLabel = _STEP_DISPLAY[step] || step; - label += ` `; - } - } else if (highestPhaseIdx >= 0 && (_STEP_FWD_PHASE_MIN[step] ?? Infinity) <= highestPhaseIdx && highestPhaseIdx > currentPhaseIdx) { - el.classList.add("forward-skip", "clickable"); - label += ' \u23E9'; - } - if (staleSteps.has(step)) el.classList.add("stale"); - const isStale = staleSteps.has(step); - const isStaleCritical = el.classList.contains("stale-critical"); - const isActive = el.classList.contains("active"); - const isCompleted = el.classList.contains("completed"); - const isFwdSkip = el.classList.contains("forward-skip"); - const srState = isStaleCritical ? " (critical \u2014 review required)" : isStale ? " (stale \u2014 results may be outdated)" : isActive ? " (current step)" : isCompleted ? " (completed)" : isFwdSkip ? " (previously completed \u2014 click to jump ahead)" : ""; - if (srState) label += `${srState}`; - el.innerHTML = label; - }); - applyLayoutFreshnessNavigationState(); - if (!document.getElementById("step-rerun-style")) { - const s = document.createElement("style"); - s.id = "step-rerun-style"; - s.textContent = ".step.completed:hover .step-rerun, .step.completed:focus-within .step-rerun { opacity: 1 !important; } .step-rerun:focus-visible { outline: 2px solid #3b82f6; outline-offset: 2px; opacity: 1 !important; }"; - document.head.appendChild(s); - } - if (typeof updateTabBarForStage === "function") { - updateTabBarForStage(activeStep); + const navHtml = pane === "summary" ? "" : ` + `; + content.innerHTML = ` + ${headerHtml} + ${cfg.desc ? `

    ${escapeHtml(cfg.desc)}

    ` : ""} +
    + ${navHtml} + `; + window._activeReviewPane = pane; + switch (pane) { + case "experiences": + await buildExperienceReviewTable(); + _updatePageEstimate2(); + break; + case "skills": + await buildSkillsReviewTable(); + break; + case "achievements": + await buildAchievementsReviewTable(); + break; + case "summary": + await buildSummaryFocusSection(); + break; + case "publications": + await buildPublicationsReviewTable(); + break; } - updateActionButtons(activeStep); - _updateViewingIndicator2(stateManager2.getCurrentTab()); - } - if (typeof window !== "undefined") { - window.addEventListener(GENERATION_STATE_EVENT, applyLayoutFreshnessNavigationState); - window.addEventListener(GENERATION_STATE_EVENT, applyDirtyPhaseNavigationState); } - function applyDirtyPhaseNavigationState() { - const dirtyPhases = stateManager2.getDirtyPhases(); - const stepsToClear = []; - stepsToClear.forEach((step) => { - const el = document.getElementById(`step-${step}`); - if (!el) return; - const isDirty = dirtyPhases.includes(step); - el.classList.toggle("stale", isDirty); - const rerunHtml = el.querySelector(".step-rerun")?.outerHTML || ""; - const label = _STEP_DISPLAY[step] || step; - const badge = isDirty ? ' Content changed' : ""; - el.innerHTML = `${label}${badge}${rerunHtml ? ` ${rerunHtml}` : ""}`; + window._activeReviewPane = "experiences"; + async function switchReviewSubtab(pane) { + document.querySelectorAll(".review-subtab").forEach((btn) => { + btn.classList.toggle("active", btn.dataset.pane === pane); }); + document.querySelectorAll(".review-pane").forEach((p) => p.style.display = "none"); + const target = document.getElementById(`review-pane-${pane}`); + if (target) target.style.display = "block"; + window._activeReviewPane = pane; + if (!window._reviewPaneLoaded || !window._reviewPaneLoaded[pane]) { + await _loadReviewPane(pane); + } } - function _doStepNavigate(step) { - const stepToTab = { - analysis: "analysis", - customizations: "goals", - rewrite: "rewrite", - spell: "spell", - layout: "layout", - download: "final_generate", - cover_letter: "cover-letter", - screening: "screening", - interview_prep: "interview-prep", - thank_you: "thank-you", - harvest: "harvest" - }; - const tabName = stepToTab[step]; - if (!tabName) return; - if (typeof updateTabBarForStage === "function") updateTabBarForStage(step); - switchTab(tabName); - } - function handleStepClick(step) { - const el = document.getElementById(`step-${step}`); - if (!el) return; - if (step === "job") { - if (el.classList.contains("completed") || el.classList.contains("active")) { - switchTab("job"); - } else { - showLoadJobPanel(); + async function _loadReviewPane(pane) { + if (!window._reviewPaneLoaded) window._reviewPaneLoaded = {}; + try { + switch (pane) { + case "experiences": + await buildExperienceReviewTable(); + break; + case "skills": + await buildSkillsReviewTable(); + break; + case "achievements": + await buildAchievementsReviewTable(); + break; + case "summary": + await buildSummaryFocusSection(); + break; + case "publications": + await buildPublicationsReviewTable(); + break; + default: + return; } - return; + window._reviewPaneLoaded[pane] = true; + } catch (error) { + delete window._reviewPaneLoaded[pane]; + throw error; } - if (el.classList.contains("forward-skip")) { - const label = _STEP_DISPLAY[step] || step; - if (typeof confirmDialog === "function") { - confirmDialog( - `Jump ahead to ${label}? - -Intermediate stages may need re-running if you make changes here.`, - { confirmLabel: "Jump ahead", cancelLabel: "Stay here" } - ).then((confirmed) => { - if (confirmed) _doStepNavigate(step); + } + function _updatePageEstimate2() { + const widget = document.getElementById("page-estimate-widget"); + if (!widget) return; + const label = document.getElementById("pe-label"); + const fill = document.getElementById("pe-fill"); + const icon = document.getElementById("pe-icon"); + if (label) label.textContent = "Updating server layout estimate\u2026"; + if (fill) fill.style.width = "0%"; + if (icon) icon.textContent = "\u23F3"; + const payload = { + experience_decisions: { + ...window._savedDecisions && window._savedDecisions.experience_decisions || {}, + ...userSelections2.experiences || {} + }, + skill_decisions: { + ...window._savedDecisions && window._savedDecisions.skill_decisions || {}, + ...userSelections2.skills || {} + }, + achievement_decisions: window._savedDecisions && window._savedDecisions.achievement_decisions || window.achievementDecisions || {}, + publication_decisions: window._savedDecisions && window._savedDecisions.publication_decisions || window.publicationDecisions || {}, + summary_focus_override: window.selectedSummaryKey || null + }; + const requestId = ++pageEstimateRequestId; + clearTimeout(pageEstimateTimer); + pageEstimateTimer = setTimeout(async () => { + try { + const response = await apiCall("POST", "/api/cv/layout-estimate", payload); + if (!response.ok) throw new Error(response.error || "estimate failed"); + if (requestId !== pageEstimateRequestId) return; + const pages = Number(response.page_count_estimate || 0); + const pct = Math.min(100, pages / 3 * 100); + const confidence = Number(response.page_count_confidence || 0); + let cls = "ok"; + let colour = "#22c55e"; + let iconText = response.page_count_exact != null ? "\u2705" : "\u{1F4C4}"; + if (response.page_length_warning) { + cls = pages > 3 ? "over" : "warn"; + colour = pages > 3 ? "#ef4444" : "#f59e0b"; + iconText = pages > 3 ? "\u{1F6A8}" : "\u26A0\uFE0F"; + } + const sourceLabel = response.page_count_exact != null ? `Exact: ${response.page_count_exact} page${response.page_count_exact === 1 ? "" : "s"}` : `Estimated: ${pages.toFixed(1)} pages`; + const confidenceLabel = response.page_count_exact != null ? "" : ` (${Math.round(confidence * 100)}% confidence)`; + const contributorText = Array.isArray(response.contributors) && response.contributors.length > 0 ? ` ${response.contributors[0]}.` : ""; + const recheckText = response.page_count_needs_exact_recheck && response.page_count_exact == null ? " Exact recheck recommended." : ""; + widget.className = `page-estimate ${cls}`; + if (label) { + label.textContent = `${sourceLabel}${confidenceLabel}.${contributorText}${recheckText}`.trim(); + } + if (fill) { + fill.style.width = `${pct}%`; + fill.style.background = colour; + } + if (icon) icon.textContent = iconText; + stateManager2.setGenerationState({ + pageCountEstimate: response.page_count_estimate ?? null, + pageCountExact: response.page_count_exact ?? null, + pageCountConfidence: response.page_count_confidence ?? null, + pageCountSource: response.page_count_source || null, + pageNeedsExactRecheck: Boolean(response.page_count_needs_exact_recheck), + pageWarning: Boolean(response.page_length_warning) }); - } else { - _doStepNavigate(step); + } catch (error) { + if (requestId !== pageEstimateRequestId) return; + widget.className = "page-estimate warn"; + if (label) label.textContent = `Layout estimate unavailable: ${error.message}`; + if (fill) { + fill.style.width = "0%"; + fill.style.background = "#f59e0b"; + } + if (icon) icon.textContent = "\u26A0\uFE0F"; } - return; + }, 250); + } + function handleActionClick2(itemId, action, type) { + const row = type === "experience" ? document.querySelector(`tr[data-exp-id="${itemId}"]`) : document.querySelector(`tr[data-skill="${itemId}"]`); + const buttons = row.querySelectorAll(".icon-btn"); + buttons.forEach((btn) => { + btn.classList.remove("active"); + if (btn.hasAttribute("aria-pressed")) btn.setAttribute("aria-pressed", "false"); + }); + const clickedBtn = row.querySelector(`[data-action="${action}"]`); + clickedBtn.classList.add("active"); + if (clickedBtn.hasAttribute("aria-pressed")) clickedBtn.setAttribute("aria-pressed", "true"); + if (type === "experience") { + userSelections2.experiences[itemId] = action; + window._explicitlyReviewed = window._explicitlyReviewed || { experiences: /* @__PURE__ */ new Set(), skills: /* @__PURE__ */ new Set() }; + window._explicitlyReviewed.experiences.add(itemId); + } else { + userSelections2.skills[itemId] = action; + window._explicitlyReviewed = window._explicitlyReviewed || { experiences: /* @__PURE__ */ new Set(), skills: /* @__PURE__ */ new Set() }; + window._explicitlyReviewed.skills.add(itemId); } - if (!el.classList.contains("completed") && !el.classList.contains("active")) return; - const hasUnansweredPostAnalysisQuestions = () => { - const qs = Array.isArray(window.postAnalysisQuestions) ? window.postAnalysisQuestions : []; - if (qs.length === 0) return false; - const answers = window.questionAnswers && typeof window.questionAnswers === "object" ? window.questionAnswers : {}; - return qs.some((q2) => { - const value = answers[q2.type]; - return !value || !String(value).trim(); - }); - }; - const stepToTab = { - analysis: hasUnansweredPostAnalysisQuestions() ? "questions" : "analysis", - customizations: "goals", - rewrite: "rewrite", - spell: "spell", - layout: "layout", - download: "final_generate", - cover_letter: "cover-letter", - screening: "screening", - interview_prep: "interview-prep", - thank_you: "thank-you", - harvest: "harvest" - }; - const tabName = stepToTab[step]; - if (!tabName) return; - const doNavigate = () => { - if (typeof updateTabBarForStage === "function") updateTabBarForStage(step); - switchTab(tabName); - }; - if (el.classList.contains("completed") && !el.classList.contains("active")) { - const stepIdx = _STEP_ORDER.indexOf(step); - const hasDownstreamCompleted = _STEP_ORDER.slice(stepIdx + 1).some((s) => { - const downstream = document.getElementById(`step-${s}`); - return downstream && downstream.classList.contains("completed"); + _updatePageEstimate2(); + } + function bulkAction(action, type) { + const tableId = type === "experience" ? "#experience-review-table" : "#skills-review-table"; + const data = window.pendingRecommendations || {}; + const dt = $.fn.DataTable.isDataTable(tableId) ? $(tableId).DataTable() : null; + const rows = dt ? dt.rows({ search: "applied" }).nodes().toArray() : Array.from(document.querySelectorAll(`${tableId} tbody tr`)); + rows.forEach((row) => { + const expId = row.dataset.expId; + const skillId = row.dataset.skill; + const itemId = expId || skillId; + if (!itemId) return; + let resolvedAction = action; + if (action === "recommended") { + resolvedAction = type === "experience" ? _resolvedExpAction(itemId, data) : _resolvedSkillAction(itemId, data); + } + row.querySelectorAll(".icon-btn").forEach((btn) => { + btn.classList.remove("active"); + if (btn.hasAttribute("aria-pressed")) btn.setAttribute("aria-pressed", "false"); }); - if (hasDownstreamCompleted) { - _showReRunConfirmModal(step, "back-nav", doNavigate); - return; + const target = row.querySelector(`[data-action="${resolvedAction}"]`); + if (target) { + target.classList.add("active"); + if (target.hasAttribute("aria-pressed")) target.setAttribute("aria-pressed", "true"); } + if (type === "experience") { + userSelections2.experiences[itemId] = resolvedAction; + } else { + userSelections2.skills[itemId] = resolvedAction; + } + }); + _updatePageEstimate2(); + } + function _resolvedExpAction(expId, data) { + const rec = getExperienceRecommendation(expId, data); + if (rec === "Emphasize") return "emphasize"; + if (rec === "Include") return "include"; + if (rec === "De-emphasize") return "de-emphasize"; + return "exclude"; + } + function _resolvedSkillAction(skillName, data) { + const rec = getSkillRecommendation(skillName, data); + if (rec === "Emphasize") return "emphasize"; + if (rec === "Include") return "include"; + if (rec === "De-emphasize") return "de-emphasize"; + return "exclude"; + } + async function populateTaglineReviewTab() { + const content = document.getElementById("document-content"); + if (!content) return; + content.innerHTML = ` +

    \u{1F3F7}\uFE0F Applicant Tagline

    +
    + `; + if (typeof buildTaglineReviewSection === "function") { + await buildTaglineReviewSection(); } - doNavigate(); } // web/layout-instruction.js @@ -16276,8 +16287,8 @@ Proceed anyway?`, Go back to refine an earlier step \u2014 all prior decisions and approvals are preserved.
    -
    -
    diff --git a/web/review-table-base.js b/web/review-table-base.js index 832717d5..ccae1b8d 100644 --- a/web/review-table-base.js +++ b/web/review-table-base.js @@ -28,6 +28,7 @@ import { getLogger } from './logger.js'; const log = getLogger('review-table-base'); import { stateManager } from './state-manager.js'; +import { _STEP_DISPLAY } from './workflow-steps.js'; // ── Module-level state ──────────────────────────────────────────────────── @@ -184,11 +185,12 @@ function switchTab(tab) { _saveDraftInputsForTab(stateManager.getCurrentTab()); // Sync second-bar visibility to this tab's stage + let _switchTabStage = null; if (typeof getStageForTab === 'function' && typeof updateTabBarForStage === 'function') { - const tabStage = getStageForTab(tab); - if (tabStage) { - updateTabBarForStage(tabStage); - updateActionButtons(tabStage); + _switchTabStage = getStageForTab(tab); + if (_switchTabStage) { + updateTabBarForStage(_switchTabStage); + updateActionButtons(_switchTabStage); } } // Always update workflow clickable state using current phase @@ -218,11 +220,17 @@ function switchTab(tab) { _updateVisitedTabIndicators(); } - // Announce the tab change to screen readers (GAP-73) + // Announce the tab change to screen readers (GAP-73). Combined with the + // stage name (GAP-16 Part A) into a single message from this one call site + // — #tab-stage-label is a visible-only label, not a second live region, to + // avoid a double-announce of the same navigation event. const announcer = document.getElementById('workflow-stage-announcer'); if (announcer && activeTab) { + const stageLabel = _switchTabStage ? _STEP_DISPLAY[_switchTabStage] : null; + const tabLabel = activeTab.textContent.trim(); + const message = stageLabel ? `Now viewing: ${stageLabel} — ${tabLabel}` : `Now viewing: ${tabLabel}`; announcer.textContent = ''; - setTimeout(() => { announcer.textContent = `Now viewing: ${activeTab.textContent.trim()}`; }, 50); + setTimeout(() => { announcer.textContent = message; }, 50); } // Sync view-cursor ring to the newly visible tab diff --git a/web/styles.css b/web/styles.css index a4af60f5..b57b0f2a 100644 --- a/web/styles.css +++ b/web/styles.css @@ -664,6 +664,12 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sa background: var(--cv-bg-light); border-bottom: 2px solid var(--cv-border); } +.tab-stage-label { + display: flex; align-items: center; padding: 0 12px; + font-size: 11px; font-weight: 600; color: var(--cv-text-secondary); + background: var(--cv-bg-light); white-space: nowrap; + border-right: 1px solid var(--cv-border); flex-shrink: 0; +} .tab-scroll-btn { flex-shrink: 0; background: var(--cv-bg-light); diff --git a/web/ui-core.js b/web/ui-core.js index a7191976..bf3f93e5 100644 --- a/web/ui-core.js +++ b/web/ui-core.js @@ -21,6 +21,7 @@ import { loadStateFromLocalStorage, stateManager, } from './state-manager.js'; +import { _STEP_DISPLAY } from './workflow-steps.js'; // ───────────────────────────────────────────────────────────────────────── // Accessibility: Focus Management for Modals @@ -562,6 +563,16 @@ function updateTabBarForStage(stage) { const tabBar = document.getElementById('tab-bar'); if (tabBar) tabBar.scrollLeft = 0; updateTabScrollButtons(); + + // GAP-16 (Part A): surface which workflow step's sub-tabs are currently + // shown. Visible-only label — no aria-live here; switchTab() in + // review-table-base.js is the sole live-speech source for this event, to + // avoid a double-announce from two independent live regions. + const labelEl = document.getElementById('tab-stage-label'); + if (labelEl) { + const stepLabel = _STEP_DISPLAY[stage] || stage; + labelEl.textContent = stepLabel ? `Now viewing: ${stepLabel}` : ''; + } } // loadTabContent() lives in web/review-table-base.js, which owns the diff --git a/web/workflow-steps.js b/web/workflow-steps.js index a560bc37..ba304e6a 100644 --- a/web/workflow-steps.js +++ b/web/workflow-steps.js @@ -37,7 +37,7 @@ const _STEP_ORDER = [ const _STEP_DISPLAY = { job: 'Job Input', analysis: 'Job Analysis', - customizations: 'Customisations', + customizations: 'Customise', rewrite: 'Rewrite Review', spell: 'Spell Check', layout: 'Layout Review', From da6ab78b3f93f7202accb0b42b3cfe3895dc5487 Mon Sep 17 00:00:00 2001 From: "Gregory R. Warnes" Date: Mon, 6 Jul 2026 11:05:04 -0400 Subject: [PATCH 3/9] feat(ux): responsive breakpoints for the two-panel chat/viewer shell (GAP-16 Part C) The chat+viewer split had zero responsive handling at any width. Below 900px, .main-container switches to a column layout so both panels stack and remain usable; .interaction-area gets a capped height (50vh, 44px when collapsed) so the viewer panel isn't squeezed out. Below 600px the new .tab-stage-label (GAP-16 Part A) is hidden to keep the tab-bar scroll arrows usable in the remaining space. Verified via Playwright against the static markup at 1280/1024/900/899/ 700/600/599px: flex-direction switches at exactly 900px as intended, and toggleChat()'s inline style.flex (main-axis, set on .viewer-area) does not interfere with width in the stacked layout, since main axis becomes vertical once flex-direction is column. Co-Authored-By: Claude Sonnet 5 --- web/styles.css | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/web/styles.css b/web/styles.css index b57b0f2a..15c2825b 100644 --- a/web/styles.css +++ b/web/styles.css @@ -1577,6 +1577,28 @@ details.rewrite-rationale summary { cursor: pointer; color: var(--cv-gray-700); .preview-output-link { width: 100%; } } +/* GAP-16 Part C: the two-panel chat + viewer shell had zero responsive + handling at any width. Stack vertically below ~900px so both panels + remain usable on a narrow window. Only `width`/`flex-direction` are + touched here — toggleChat() sets `.viewer-area`'s inline `style.flex` + (a main-axis property), which becomes irrelevant for width once the + container's main axis switches to vertical (column), so this does not + fight with that JS-set inline style. */ +@media (max-width: 900px) { + .main-container { flex-direction: column; height: auto; min-height: 0; } + .interaction-area { + width: 100%; max-height: 50vh; border-right: none; + border-bottom: 1px solid var(--cv-border); + } + .interaction-area.collapsed { width: 100%; min-width: 0; max-width: none; max-height: 44px; } + .viewer-area { width: 100%; max-height: none; } + .viewer-area.expanded { width: 100%; } + .tab-stage-label { max-width: 40vw; overflow: hidden; text-overflow: ellipsis; } +} +@media (max-width: 600px) { + .tab-stage-label { display: none; } +} + /* ==== Master CV Management Tab ==== */ .master-profile-card { background: linear-gradient(135deg, var(--cv-info-dark), var(--cv-accent)); color: var(--cv-white); border-radius: 12px; padding: 24px; margin-bottom: 24px; } .master-profile-name { font-size: 1.5em; font-weight: 700; margin-bottom: 4px; } From bc525550b52eee38e409e9581762ab070cda8100 Mon Sep 17 00:00:00 2001 From: "Gregory R. Warnes" Date: Mon, 6 Jul 2026 11:38:39 -0400 Subject: [PATCH 4/9] feat(ux): inline early CV preview panel during customization/rewrite (GAP-16 Part B) Add a persistent, collapsible CV preview panel shown across the customization/rewrite/spell-check pipeline, so users see a rendered CV long before Layout Review. Fetches only the read-only GET /api/layout-html endpoint via a new early-preview-panel.js module; iframe rendering is extracted into a shared, side-effect-free preview-render.js util (also adopted by layout-instruction.js) so no mutating fetch path can leak into this read-only panel via a shared import. Adds an ESLint mutation-boundary guard scoped to early-preview-panel.js, wired into CI, as a structural backstop beyond the unit tests. Co-Authored-By: Claude Sonnet 5 --- .github/workflows/integration-harness.yml | 3 + eslint.config.mjs | 25 ++++ package.json | 1 + tests/js/api-client.test.js | 7 +- tests/js/app-init.test.js | 7 +- tests/js/early-preview-panel.test.js | 151 ++++++++++++++++++++++ tests/js/preview-render.test.js | 36 ++++++ tests/js/review-table-base.test.js | 8 ++ web/api-client.js | 13 +- web/app.js | 1 + web/bundle.js | 107 ++++++++++++++- web/early-preview-panel.js | 129 ++++++++++++++++++ web/index.html | 15 ++- web/layout-instruction.js | 5 +- web/preview-render.js | 30 +++++ web/review-table-base.js | 4 + web/src/main.js | 3 +- web/styles.css | 9 ++ 18 files changed, 535 insertions(+), 19 deletions(-) create mode 100644 tests/js/early-preview-panel.test.js create mode 100644 tests/js/preview-render.test.js create mode 100644 web/early-preview-panel.js create mode 100644 web/preview-render.js diff --git a/.github/workflows/integration-harness.yml b/.github/workflows/integration-harness.yml index 27544c36..8c99a2fa 100644 --- a/.github/workflows/integration-harness.yml +++ b/.github/workflows/integration-harness.yml @@ -88,6 +88,9 @@ jobs: - name: Install npm dependencies run: npm install + - name: Run eslint mutation-boundary guard (GAP-16 Part B) + run: npm run lint:early-preview-guard + - name: Verify JS bundle builds run: npm run build diff --git a/eslint.config.mjs b/eslint.config.mjs index e9de6774..e0f8e97b 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -37,4 +37,29 @@ export default [ 'sonarjs/no-all-duplicated-branches': 'error', }, }, + // GAP-16 Part B mutation-boundary guard: early-preview-panel.js must only + // ever call the read-only GET /api/layout-html endpoint. Calling either + // mutating endpoint here would silently fast-forward the user's workflow + // phase (see the module's own header comment) — fail CI, don't just rely + // on a unit test that could later be weakened or deleted unnoticed. + { + files: ['web/early-preview-panel.js'], + languageOptions: { + ecmaVersion: 2022, + sourceType: 'module', + }, + rules: { + 'no-restricted-syntax': [ + 'error', + { + selector: "Literal[value='/api/cv/generate-preview']", + message: 'early-preview-panel.js must not call the mutating /api/cv/generate-preview endpoint — see the module header comment.', + }, + { + selector: "Literal[value='/api/cv/smart-instruction']", + message: 'early-preview-panel.js must not call the mutating /api/cv/smart-instruction endpoint — see the module header comment.', + }, + ], + }, + }, ]; diff --git a/package.json b/package.json index 89c0f723..8a46f17b 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "lint:duplicates": "python3 scripts/lint_duplicate_definitions.py", "lint:duplicate-code": "jscpd web scripts --config .jscpd.json --exit-code 1", "lint:duplicate-functions": "eslint \"web/*.js\"", + "lint:early-preview-guard": "eslint web/early-preview-panel.js", "lint:duplicate-code:py": "conda run -n cvgen pylint scripts", "lint:duplication": "npm run lint:duplicates && npm run lint:duplicate-functions && npm run lint:duplicate-code && npm run lint:duplicate-code:py" }, diff --git a/tests/js/api-client.test.js b/tests/js/api-client.test.js index 2eb70296..59057b9a 100644 --- a/tests/js/api-client.test.js +++ b/tests/js/api-client.test.js @@ -54,8 +54,11 @@ describe('StorageKeys', () => { it('defines LLM_DISCLOSURE_SHOWN', () => { expect(apiClient.StorageKeys.LLM_DISCLOSURE_SHOWN).toBe('cv-builder-llm-disclosure-shown') }) - it('has exactly 6 keys', () => { - expect(Object.keys(apiClient.StorageKeys)).toHaveLength(6) + it('defines EARLY_PREVIEW_COLLAPSED', () => { + expect(apiClient.StorageKeys.EARLY_PREVIEW_COLLAPSED).toBe('cv-builder-early-preview-collapsed') + }) + it('has exactly 7 keys', () => { + expect(Object.keys(apiClient.StorageKeys)).toHaveLength(7) }) it('all values are strings', () => { Object.values(apiClient.StorageKeys).forEach(v => expect(typeof v).toBe('string')) diff --git a/tests/js/app-init.test.js b/tests/js/app-init.test.js index 0b612a25..56d54bfe 100644 --- a/tests/js/app-init.test.js +++ b/tests/js/app-init.test.js @@ -65,7 +65,12 @@ afterEach(() => { // app.js IS imported (`import * as App from '../app.js'`, main.js:89, the // Phase 3 modularisation entry point), so it belongs in the expected set, // not excluded from it. -const STANDALONE_WEB_MODULES = new Set(['bundle.js']) +// +// preview-render.js (GAP-16 Part B) is a shared, side-effect-free DOM util +// with no globalThis-registered exports of its own — it's imported directly +// by layout-instruction.js and early-preview-panel.js instead, so it never +// needs a top-level `from '../preview-render.js'` import in main.js. +const STANDALONE_WEB_MODULES = new Set(['bundle.js', 'preview-render.js']) // ── Helper: check all exports in a namespace are non-null ───────────────────── diff --git a/tests/js/early-preview-panel.test.js b/tests/js/early-preview-panel.test.js new file mode 100644 index 00000000..fe4bd92b --- /dev/null +++ b/tests/js/early-preview-panel.test.js @@ -0,0 +1,151 @@ +// Copyright (C) 2026 Gregory R. Warnes +// SPDX-License-Identifier: AGPL-3.0-or-later +// +// This file is part of CV-Builder. +// For commercial licensing, contact greg@warnes-innovations.com + +vi.mock('../../web/api-client.js', () => ({ + apiCall: vi.fn(), + StorageKeys: { EARLY_PREVIEW_COLLAPSED: 'cv-builder-early-preview-collapsed' }, +})) + +vi.mock('../../web/state-manager.js', () => ({ + stateManager: { + getLayoutFreshness: vi.fn(() => ({ isStale: false })), + }, +})) + +const PANEL_HTML = ` + +` + +let mod +let apiCall +let stateManager + +beforeEach(async () => { + vi.resetModules() + localStorage.clear() + document.body.innerHTML = PANEL_HTML + apiCall = (await import('../../web/api-client.js')).apiCall + stateManager = (await import('../../web/state-manager.js')).stateManager + apiCall.mockReset() + stateManager.getLayoutFreshness.mockReset().mockReturnValue({ isStale: false }) + mod = await import('../../web/early-preview-panel.js') +}) + +afterEach(() => { + vi.restoreAllMocks() + document.body.innerHTML = '' + localStorage.clear() +}) + +describe('toggleEarlyPreviewPanel — scope gating', () => { + it('shows the panel and fetches for an in-scope tab', async () => { + apiCall.mockResolvedValue({ ok: true, html: 'CV' }) + + await mod.toggleEarlyPreviewPanel('rewrite') + + expect(document.getElementById('early-preview-panel').style.display).toBe('block') + expect(apiCall).toHaveBeenCalledWith('GET', '/api/layout-html') + }) + + it('hides the panel and does not fetch for an out-of-scope tab', async () => { + await mod.toggleEarlyPreviewPanel('layout') + + expect(document.getElementById('early-preview-panel').style.display).toBe('none') + expect(apiCall).not.toHaveBeenCalled() + }) + + it('does not throw when the panel element is absent', async () => { + document.body.innerHTML = '' + await expect(mod.toggleEarlyPreviewPanel('rewrite')).resolves.not.toThrow() + }) +}) + +describe('toggleEarlyPreviewPanel — body states', () => { + it('renders an empty-state message when no preview exists yet (404)', async () => { + apiCall.mockRejectedValue(new Error('404: Not found')) + + await mod.toggleEarlyPreviewPanel('spell') + + const body = document.getElementById('early-preview-body') + expect(body.querySelector('.early-preview-empty')).toBeTruthy() + expect(body.textContent).toContain('No CV preview yet') + }) + + it('renders a sandboxed iframe with content when a fresh preview exists', async () => { + apiCall.mockResolvedValue({ ok: true, html: '

    My CV

    ' }) + stateManager.getLayoutFreshness.mockReturnValue({ isStale: false }) + + await mod.toggleEarlyPreviewPanel('rewrite') + + const iframe = document.getElementById('early-preview-iframe') + expect(iframe).toBeTruthy() + expect(iframe.srcdoc).toContain('

    My CV

    ') + expect(iframe.getAttribute('sandbox')).toBe('allow-same-origin') + expect(iframe.classList.contains('early-preview-iframe-stale')).toBe(false) + expect(document.getElementById('early-preview-status-note').textContent).toBe('') + }) + + it('renders the stale note and dimmed class when the preview is stale', async () => { + apiCall.mockResolvedValue({ ok: true, html: '

    My CV

    ' }) + stateManager.getLayoutFreshness.mockReturnValue({ isStale: true }) + + await mod.toggleEarlyPreviewPanel('rewrite') + + const iframe = document.getElementById('early-preview-iframe') + expect(iframe.classList.contains('early-preview-iframe-stale')).toBe(true) + expect(document.getElementById('early-preview-status-note').textContent).toContain('Layout Review') + }) +}) + +describe('initEarlyPreviewPanel — collapse toggle', () => { + it('toggles aria-expanded and label text when the toggle button is clicked', async () => { + apiCall.mockResolvedValue({ ok: true, html: 'CV' }) + mod.initEarlyPreviewPanel() + + const btn = document.getElementById('early-preview-toggle-btn') + expect(btn.getAttribute('aria-expanded')).toBe('true') + expect(btn.textContent).toBe('Hide') + + btn.click() + await Promise.resolve() + + expect(btn.getAttribute('aria-expanded')).toBe('false') + expect(btn.textContent).toBe('Show') + }) + + it('persists collapse state via localStorage', async () => { + apiCall.mockResolvedValue({ ok: true, html: 'CV' }) + mod.initEarlyPreviewPanel() + + document.getElementById('early-preview-toggle-btn').click() + await Promise.resolve() + + expect(localStorage.getItem('cv-builder-early-preview-collapsed')).toBe('true') + }) +}) + +describe('mutation-boundary safety', () => { + it('never calls the mutating generate-preview or smart-instruction endpoints', async () => { + apiCall.mockResolvedValue({ ok: true, html: 'CV' }) + + await mod.toggleEarlyPreviewPanel('rewrite') + mod.initEarlyPreviewPanel() + document.getElementById('early-preview-toggle-btn').click() + await Promise.resolve() + + for (const call of apiCall.mock.calls) { + expect(call[1]).not.toBe('/api/cv/generate-preview') + expect(call[1]).not.toBe('/api/cv/smart-instruction') + } + }) +}) diff --git a/tests/js/preview-render.test.js b/tests/js/preview-render.test.js new file mode 100644 index 00000000..581ffe48 --- /dev/null +++ b/tests/js/preview-render.test.js @@ -0,0 +1,36 @@ +// Copyright (C) 2026 Gregory R. Warnes +// SPDX-License-Identifier: AGPL-3.0-or-later +// +// This file is part of CV-Builder. +// For commercial licensing, contact greg@warnes-innovations.com + +import { renderHtmlIntoIframe } from '../../web/preview-render.js' + +describe('renderHtmlIntoIframe', () => { + afterEach(() => { + document.body.innerHTML = '' + }) + + it('sets sandbox and referrerpolicy attributes for safe rendering', () => { + document.body.innerHTML = '' + const iframe = document.getElementById('frame') + + renderHtmlIntoIframe(iframe, '

    Hi

    ') + + expect(iframe.getAttribute('sandbox')).toBe('allow-same-origin') + expect(iframe.getAttribute('referrerpolicy')).toBe('no-referrer') + }) + + it('assigns the given html to srcdoc', () => { + document.body.innerHTML = '' + const iframe = document.getElementById('frame') + + renderHtmlIntoIframe(iframe, '

    Preview

    ') + + expect(iframe.srcdoc).toContain('

    Preview

    ') + }) + + it('does not throw when passed a null iframe element', () => { + expect(() => renderHtmlIntoIframe(null, '')).not.toThrow() + }) +}) diff --git a/tests/js/review-table-base.test.js b/tests/js/review-table-base.test.js index 80bd404a..bad1bef4 100644 --- a/tests/js/review-table-base.test.js +++ b/tests/js/review-table-base.test.js @@ -203,6 +203,14 @@ describe('switchTab', () => { vi.useRealTimers() }) + it('notifies the early preview panel of the target tab (GAP-16 Part B)', () => { + vi.stubGlobal('toggleEarlyPreviewPanel', vi.fn()) + + switchTab('analysis') + + expect(globalThis.toggleEarlyPreviewPanel).toHaveBeenCalledWith('analysis') + }) + it('adds full-width class for non-generate tabs', () => { switchTab('analysis') expect(document.getElementById('document-content').classList.contains('full-width')).toBe(true) diff --git a/web/api-client.js b/web/api-client.js index d7b20b39..2edebba1 100644 --- a/web/api-client.js +++ b/web/api-client.js @@ -18,12 +18,13 @@ const log = getLogger('api-client'); * Centralized localStorage key management to avoid duplication */ const StorageKeys = { - SESSION_ID: 'cv-builder-session-id', - SESSION_PATH: 'cv-builder-session-path', - TAB_DATA: 'cv-builder-tab-data', - CURRENT_TAB: 'cv-builder-current-tab', - CHAT_COLLAPSED: 'cv-builder-chat-collapsed', - LLM_DISCLOSURE_SHOWN: 'cv-builder-llm-disclosure-shown', + SESSION_ID: 'cv-builder-session-id', + SESSION_PATH: 'cv-builder-session-path', + TAB_DATA: 'cv-builder-tab-data', + CURRENT_TAB: 'cv-builder-current-tab', + CHAT_COLLAPSED: 'cv-builder-chat-collapsed', + LLM_DISCLOSURE_SHOWN: 'cv-builder-llm-disclosure-shown', + EARLY_PREVIEW_COLLAPSED: 'cv-builder-early-preview-collapsed', }; const OWNER_TOKEN_KEY = 'cv-builder-owner-token'; diff --git a/web/app.js b/web/app.js index b6687794..ef82e087 100644 --- a/web/app.js +++ b/web/app.js @@ -155,6 +155,7 @@ function setupEventListeners() { document.getElementById('finalise-action-btn').addEventListener('click', () => switchTab('finalise')); if (typeof initKeyboardShortcuts === 'function') initKeyboardShortcuts(); + if (typeof initEarlyPreviewPanel === 'function') initEarlyPreviewPanel(); } // Tests now import helper functions from their canonical ES modules directly. diff --git a/web/bundle.js b/web/bundle.js index e6b54548..690033f1 100644 --- a/web/bundle.js +++ b/web/bundle.js @@ -772,7 +772,8 @@ TAB_DATA: "cv-builder-tab-data", CURRENT_TAB: "cv-builder-current-tab", CHAT_COLLAPSED: "cv-builder-chat-collapsed", - LLM_DISCLOSURE_SHOWN: "cv-builder-llm-disclosure-shown" + LLM_DISCLOSURE_SHOWN: "cv-builder-llm-disclosure-shown", + EARLY_PREVIEW_COLLAPSED: "cv-builder-early-preview-collapsed" }; var OWNER_TOKEN_KEY = "cv-builder-owner-token"; function getSessionIdFromURL2() { @@ -4519,6 +4520,7 @@ Intermediate stages may need re-running if you make changes here.`, if (typeof stateManager2?.getPhase === "function" && typeof updateWorkflowStepsClickable === "function") { updateWorkflowStepsClickable(stateManager2.getPhase()); } + if (typeof toggleEarlyPreviewPanel === "function") toggleEarlyPreviewPanel(tab); document.querySelectorAll(".tab").forEach((t) => { t.classList.remove("active"); t.setAttribute("aria-selected", "false"); @@ -5097,6 +5099,14 @@ Intermediate stages may need re-running if you make changes here.`, } } + // web/preview-render.js + function renderHtmlIntoIframe(iframeEl, html2) { + if (!iframeEl) return; + iframeEl.setAttribute("sandbox", "allow-same-origin"); + iframeEl.setAttribute("referrerpolicy", "no-referrer"); + iframeEl.srcdoc = html2; + } + // web/layout-instruction.js var log7 = getLogger("layout-instruction"); var dismissedStaleCalloutRevision = null; @@ -5850,9 +5860,7 @@ Intermediate stages may need re-running if you make changes here.`, if (!preview) return; showPreviewLoading(false); preview.onload = () => fitLayoutPreviewToPane(preview); - preview.setAttribute("sandbox", "allow-same-origin"); - preview.setAttribute("referrerpolicy", "no-referrer"); - preview.srcdoc = html2; + renderHtmlIntoIframe(preview, html2); const doc = preview.contentDocument || preview.contentWindow?.document; if (doc?.readyState === "complete") { fitLayoutPreviewToPane(preview); @@ -21747,6 +21755,93 @@ This will permanently write changes to your Master_CV_Data.json.`))); } } + // web/early-preview-panel.js + var early_preview_panel_exports = {}; + __export(early_preview_panel_exports, { + initEarlyPreviewPanel: () => initEarlyPreviewPanel2, + toggleEarlyPreviewPanel: () => toggleEarlyPreviewPanel2 + }); + var EARLY_PREVIEW_TABS = /* @__PURE__ */ new Set([ + "exp-review", + "ach-editor", + "skills-review", + "achievements-review", + "tagline-review", + "summary-review", + "publications-review", + // customizations + "rewrite", + "spell" + ]); + var _collapsed = false; + try { + _collapsed = localStorage.getItem(StorageKeys2.EARLY_PREVIEW_COLLAPSED) === "true"; + } catch (_e2) { + } + function _setCollapsed(collapsed) { + _collapsed = collapsed; + try { + localStorage.setItem(StorageKeys2.EARLY_PREVIEW_COLLAPSED, String(collapsed)); + } catch (_e2) { + } + const btn = document.getElementById("early-preview-toggle-btn"); + if (btn) { + btn.textContent = collapsed ? "Show" : "Hide"; + btn.setAttribute("aria-expanded", String(!collapsed)); + } + } + async function _renderEarlyPreviewBody() { + const body = document.getElementById("early-preview-body"); + const note = document.getElementById("early-preview-status-note"); + if (!body) return; + if (_collapsed) { + body.style.display = "none"; + return; + } + body.style.display = ""; + let data; + try { + data = await apiCall2("GET", "/api/layout-html"); + } catch (_e2) { + data = null; + } + if (data && data.ok && data.html) { + const freshness = typeof stateManager2?.getLayoutFreshness === "function" ? stateManager2.getLayoutFreshness() : { isStale: false }; + body.innerHTML = ''; + const iframe = document.getElementById("early-preview-iframe"); + const stateLabel = freshness.isStale ? "stale" : "fresh"; + iframe.title = `CV preview \u2014 ${stateLabel}`; + iframe.classList.toggle("early-preview-iframe-stale", Boolean(freshness.isStale)); + renderHtmlIntoIframe(iframe, data.html); + if (note) { + note.textContent = freshness.isStale ? "Preview reflects an earlier version \u2014 visit Layout Review to refresh." : ""; + } + return; + } + body.innerHTML = '
    No CV preview yet \u2014 available after you reach Layout Review.
    '; + if (note) note.textContent = ""; + } + async function toggleEarlyPreviewPanel2(tab) { + const panel = document.getElementById("early-preview-panel"); + if (!panel) return; + if (!EARLY_PREVIEW_TABS.has(tab)) { + panel.style.display = "none"; + return; + } + panel.style.display = "block"; + await _renderEarlyPreviewBody(); + } + function initEarlyPreviewPanel2() { + const btn = document.getElementById("early-preview-toggle-btn"); + if (!btn) return; + btn.setAttribute("aria-expanded", String(!_collapsed)); + btn.textContent = _collapsed ? "Show" : "Hide"; + btn.addEventListener("click", () => { + _setCollapsed(!_collapsed); + _renderEarlyPreviewBody(); + }); + } + // web/session-switcher-ui.js var session_switcher_ui_exports = {}; __export(session_switcher_ui_exports, { @@ -22890,6 +22985,7 @@ Proceed anyway?` document.getElementById("final-generate-proceed-btn").addEventListener("click", finalGenerationComplete); document.getElementById("finalise-action-btn").addEventListener("click", () => switchTab("finalise")); if (typeof initKeyboardShortcuts === "function") initKeyboardShortcuts(); + if (typeof initEarlyPreviewPanel === "function") initEarlyPreviewPanel(); } // web/src/main.js @@ -22940,6 +23036,7 @@ Proceed anyway?` interview_prep_exports, thank_you_exports, harvest_exports, + early_preview_panel_exports, session_switcher_ui_exports, keyboard_shortcuts_exports, app_exports @@ -22951,4 +23048,4 @@ Proceed anyway?` dompurify/dist/purify.es.mjs: (*! @license DOMPurify 3.3.3 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.3.3/LICENSE *) */ -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbm9kZV9tb2R1bGVzL2xvZ2xldmVsL2xpYi9sb2dsZXZlbC5qcyIsICJsb2dnZXIuanMiLCAidXRpbHMuanMiLCAiYXBpLWNsaWVudC5qcyIsICJmZXRjaC11dGlscy5qcyIsICJzdGF0ZS1tYW5hZ2VyLmpzIiwgInByb3ZpZGVyLWluZm8uanMiLCAidWktY29yZS5qcyIsICJ3b3JrZmxvdy1zdGVwcy5qcyIsICJsYXlvdXQtaW5zdHJ1Y3Rpb24uanMiLCAiYXRzLXJlZmluZW1lbnQuanMiLCAibWVzc2FnZS1xdWV1ZS5qcyIsICJyZXZpZXctdGFibGUtYmFzZS5qcyIsICJ2YWxpZGF0b3JzLmpzIiwgInJlY29tbWVuZGF0aW9uLWhlbHBlcnMuanMiLCAidWktaGVscGVycy5qcyIsICJwcm9wb3NhbC1yZXZpZXcuanMiLCAibGxtLWxvZy5qcyIsICJhdXRoLXByb3ZpZGVyLmpzIiwgImF0cy1tb2RhbHMuanMiLCAic2Vzc2lvbi1hY3Rpb25zLmpzIiwgImpvYi1hbmFseXNpcy5qcyIsICJnb2Fscy5qcyIsICJzZXNzaW9uLW1hbmFnZXIuanMiLCAiam9iLWlucHV0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tYXJrZWQvc3JjL2RlZmF1bHRzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9tYXJrZWQvc3JjL3J1bGVzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9tYXJrZWQvc3JjL2hlbHBlcnMudHMiLCAiLi4vbm9kZV9tb2R1bGVzL21hcmtlZC9zcmMvVG9rZW5pemVyLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9tYXJrZWQvc3JjL0xleGVyLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9tYXJrZWQvc3JjL1JlbmRlcmVyLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9tYXJrZWQvc3JjL1RleHRSZW5kZXJlci50cyIsICIuLi9ub2RlX21vZHVsZXMvbWFya2VkL3NyYy9QYXJzZXIudHMiLCAiLi4vbm9kZV9tb2R1bGVzL21hcmtlZC9zcmMvSG9va3MudHMiLCAiLi4vbm9kZV9tb2R1bGVzL21hcmtlZC9zcmMvSW5zdGFuY2UudHMiLCAiLi4vbm9kZV9tb2R1bGVzL21hcmtlZC9zcmMvbWFya2VkLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9kb21wdXJpZnkvc3JjL3V0aWxzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9kb21wdXJpZnkvc3JjL3RhZ3MudHMiLCAiLi4vbm9kZV9tb2R1bGVzL2RvbXB1cmlmeS9zcmMvYXR0cnMudHMiLCAiLi4vbm9kZV9tb2R1bGVzL2RvbXB1cmlmeS9zcmMvcmVnZXhwLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9kb21wdXJpZnkvc3JjL3B1cmlmeS50cyIsICJtZXNzYWdlLWRpc3BhdGNoLmpzIiwgInF1ZXN0aW9ucy1wYW5lbC5qcyIsICJyZXZpZXctaWNvbnMuanMiLCAiZXhwZXJpZW5jZS1yZXZpZXcuanMiLCAic2tpbGxzLXJldmlldy5qcyIsICJhY2hpZXZlbWVudHMtcmV2aWV3LmpzIiwgInRhZ2xpbmUtcmV2aWV3LmpzIiwgInN1bW1hcnktcmV2aWV3LmpzIiwgInB1YmxpY2F0aW9ucy1yZXZpZXcuanMiLCAicmV3cml0ZS1yZXZpZXcuanMiLCAic3BlbGwtY2hlY2suanMiLCAiZG93bmxvYWQtdGFiLmpzIiwgImZpbmFsLWdlbmVyYXRlLmpzIiwgIm1hc3Rlci1kYXRhLWFpLXVwZGF0ZS5qcyIsICJtYXN0ZXItY3YuanMiLCAiY292ZXItbGV0dGVyLmpzIiwgInNjcmVlbmluZy1xdWVzdGlvbnMuanMiLCAiZmluYWxpc2UuanMiLCAiaW50ZXJ2aWV3LXByZXAuanMiLCAidGhhbmsteW91LmpzIiwgImhhcnZlc3QuanMiLCAic2Vzc2lvbi1zd2l0Y2hlci11aS5qcyIsICJrZXlib2FyZC1zaG9ydGN1dHMuanMiLCAiYXBwLmpzIiwgInNyYy9tYWluLmpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKlxuKiBsb2dsZXZlbCAtIGh0dHBzOi8vZ2l0aHViLmNvbS9waW10ZXJyeS9sb2dsZXZlbFxuKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTMgVGltIFBlcnJ5XG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiovXG4oZnVuY3Rpb24gKHJvb3QsIGRlZmluaXRpb24pIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgICAgIGRlZmluZShkZWZpbml0aW9uKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgICAgIG1vZHVsZS5leHBvcnRzID0gZGVmaW5pdGlvbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJvb3QubG9nID0gZGVmaW5pdGlvbigpO1xuICAgIH1cbn0odGhpcywgZnVuY3Rpb24gKCkge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgLy8gU2xpZ2h0bHkgZHViaW91cyB0cmlja3MgdG8gY3V0IGRvd24gbWluaW1pemVkIGZpbGUgc2l6ZVxuICAgIHZhciBub29wID0gZnVuY3Rpb24oKSB7fTtcbiAgICB2YXIgdW5kZWZpbmVkVHlwZSA9IFwidW5kZWZpbmVkXCI7XG4gICAgdmFyIGlzSUUgPSAodHlwZW9mIHdpbmRvdyAhPT0gdW5kZWZpbmVkVHlwZSkgJiYgKHR5cGVvZiB3aW5kb3cubmF2aWdhdG9yICE9PSB1bmRlZmluZWRUeXBlKSAmJiAoXG4gICAgICAgIC9UcmlkZW50XFwvfE1TSUUgLy50ZXN0KHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50KVxuICAgICk7XG5cbiAgICB2YXIgbG9nTWV0aG9kcyA9IFtcbiAgICAgICAgXCJ0cmFjZVwiLFxuICAgICAgICBcImRlYnVnXCIsXG4gICAgICAgIFwiaW5mb1wiLFxuICAgICAgICBcIndhcm5cIixcbiAgICAgICAgXCJlcnJvclwiXG4gICAgXTtcblxuICAgIHZhciBfbG9nZ2Vyc0J5TmFtZSA9IHt9O1xuICAgIHZhciBkZWZhdWx0TG9nZ2VyID0gbnVsbDtcblxuICAgIC8vIENyb3NzLWJyb3dzZXIgYmluZCBlcXVpdmFsZW50IHRoYXQgd29ya3MgYXQgbGVhc3QgYmFjayB0byBJRTZcbiAgICBmdW5jdGlvbiBiaW5kTWV0aG9kKG9iaiwgbWV0aG9kTmFtZSkge1xuICAgICAgICB2YXIgbWV0aG9kID0gb2JqW21ldGhvZE5hbWVdO1xuICAgICAgICBpZiAodHlwZW9mIG1ldGhvZC5iaW5kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gbWV0aG9kLmJpbmQob2JqKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmNhbGwobWV0aG9kLCBvYmopO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIC8vIE1pc3NpbmcgYmluZCBzaGltIG9yIElFOCArIE1vZGVybml6ciwgZmFsbGJhY2sgdG8gd3JhcHBpbmdcbiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuYXBwbHkobWV0aG9kLCBbb2JqLCBhcmd1bWVudHNdKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVHJhY2UoKSBkb2Vzbid0IHByaW50IHRoZSBtZXNzYWdlIGluIElFLCBzbyBmb3IgdGhhdCBjYXNlIHdlIG5lZWQgdG8gd3JhcCBpdFxuICAgIGZ1bmN0aW9uIHRyYWNlRm9ySUUoKSB7XG4gICAgICAgIGlmIChjb25zb2xlLmxvZykge1xuICAgICAgICAgICAgaWYgKGNvbnNvbGUubG9nLmFwcGx5KSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2cuYXBwbHkoY29uc29sZSwgYXJndW1lbnRzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gSW4gb2xkIElFLCBuYXRpdmUgY29uc29sZSBtZXRob2RzIHRoZW1zZWx2ZXMgZG9uJ3QgaGF2ZSBhcHBseSgpLlxuICAgICAgICAgICAgICAgIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5hcHBseShjb25zb2xlLmxvZywgW2NvbnNvbGUsIGFyZ3VtZW50c10pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb25zb2xlLnRyYWNlKSBjb25zb2xlLnRyYWNlKCk7XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgdGhlIGJlc3QgbG9nZ2luZyBtZXRob2QgcG9zc2libGUgZm9yIHRoaXMgZW52XG4gICAgLy8gV2hlcmV2ZXIgcG9zc2libGUgd2Ugd2FudCB0byBiaW5kLCBub3Qgd3JhcCwgdG8gcHJlc2VydmUgc3RhY2sgdHJhY2VzXG4gICAgZnVuY3Rpb24gcmVhbE1ldGhvZChtZXRob2ROYW1lKSB7XG4gICAgICAgIGlmIChtZXRob2ROYW1lID09PSAnZGVidWcnKSB7XG4gICAgICAgICAgICBtZXRob2ROYW1lID0gJ2xvZyc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgPT09IHVuZGVmaW5lZFR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gTm8gbWV0aG9kIHBvc3NpYmxlLCBmb3Igbm93IC0gZml4ZWQgbGF0ZXIgYnkgZW5hYmxlTG9nZ2luZ1doZW5Db25zb2xlQXJyaXZlc1xuICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZE5hbWUgPT09ICd0cmFjZScgJiYgaXNJRSkge1xuICAgICAgICAgICAgcmV0dXJuIHRyYWNlRm9ySUU7XG4gICAgICAgIH0gZWxzZSBpZiAoY29uc29sZVttZXRob2ROYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYmluZE1ldGhvZChjb25zb2xlLCBtZXRob2ROYW1lKTtcbiAgICAgICAgfSBlbHNlIGlmIChjb25zb2xlLmxvZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYmluZE1ldGhvZChjb25zb2xlLCAnbG9nJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbm9vcDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoZXNlIHByaXZhdGUgZnVuY3Rpb25zIGFsd2F5cyBuZWVkIGB0aGlzYCB0byBiZSBzZXQgcHJvcGVybHlcblxuICAgIGZ1bmN0aW9uIHJlcGxhY2VMb2dnaW5nTWV0aG9kcygpIHtcbiAgICAgICAgLypqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi9cbiAgICAgICAgdmFyIGxldmVsID0gdGhpcy5nZXRMZXZlbCgpO1xuXG4gICAgICAgIC8vIFJlcGxhY2UgdGhlIGFjdHVhbCBtZXRob2RzLlxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxvZ01ldGhvZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBtZXRob2ROYW1lID0gbG9nTWV0aG9kc1tpXTtcbiAgICAgICAgICAgIHRoaXNbbWV0aG9kTmFtZV0gPSAoaSA8IGxldmVsKSA/XG4gICAgICAgICAgICAgICAgbm9vcCA6XG4gICAgICAgICAgICAgICAgdGhpcy5tZXRob2RGYWN0b3J5KG1ldGhvZE5hbWUsIGxldmVsLCB0aGlzLm5hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVmaW5lIGxvZy5sb2cgYXMgYW4gYWxpYXMgZm9yIGxvZy5kZWJ1Z1xuICAgICAgICB0aGlzLmxvZyA9IHRoaXMuZGVidWc7XG5cbiAgICAgICAgLy8gUmV0dXJuIGFueSBpbXBvcnRhbnQgd2FybmluZ3MuXG4gICAgICAgIGlmICh0eXBlb2YgY29uc29sZSA9PT0gdW5kZWZpbmVkVHlwZSAmJiBsZXZlbCA8IHRoaXMubGV2ZWxzLlNJTEVOVCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiTm8gY29uc29sZSBhdmFpbGFibGUgZm9yIGxvZ2dpbmdcIjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEluIG9sZCBJRSB2ZXJzaW9ucywgdGhlIGNvbnNvbGUgaXNuJ3QgcHJlc2VudCB1bnRpbCB5b3UgZmlyc3Qgb3BlbiBpdC5cbiAgICAvLyBXZSBidWlsZCByZWFsTWV0aG9kKCkgcmVwbGFjZW1lbnRzIGhlcmUgdGhhdCByZWdlbmVyYXRlIGxvZ2dpbmcgbWV0aG9kc1xuICAgIGZ1bmN0aW9uIGVuYWJsZUxvZ2dpbmdXaGVuQ29uc29sZUFycml2ZXMobWV0aG9kTmFtZSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSB1bmRlZmluZWRUeXBlKSB7XG4gICAgICAgICAgICAgICAgcmVwbGFjZUxvZ2dpbmdNZXRob2RzLmNhbGwodGhpcyk7XG4gICAgICAgICAgICAgICAgdGhpc1ttZXRob2ROYW1lXS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIEJ5IGRlZmF1bHQsIHdlIHVzZSBjbG9zZWx5IGJvdW5kIHJlYWwgbWV0aG9kcyB3aGVyZXZlciBwb3NzaWJsZSwgYW5kXG4gICAgLy8gb3RoZXJ3aXNlIHdlIHdhaXQgZm9yIGEgY29uc29sZSB0byBhcHBlYXIsIGFuZCB0aGVuIHRyeSBhZ2Fpbi5cbiAgICBmdW5jdGlvbiBkZWZhdWx0TWV0aG9kRmFjdG9yeShtZXRob2ROYW1lLCBfbGV2ZWwsIF9sb2dnZXJOYW1lKSB7XG4gICAgICAgIC8qanNoaW50IHZhbGlkdGhpczp0cnVlICovXG4gICAgICAgIHJldHVybiByZWFsTWV0aG9kKG1ldGhvZE5hbWUpIHx8XG4gICAgICAgICAgICAgICBlbmFibGVMb2dnaW5nV2hlbkNvbnNvbGVBcnJpdmVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gTG9nZ2VyKG5hbWUsIGZhY3RvcnkpIHtcbiAgICAgIC8vIFByaXZhdGUgaW5zdGFuY2UgdmFyaWFibGVzLlxuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgLyoqXG4gICAgICAgKiBUaGUgbGV2ZWwgaW5oZXJpdGVkIGZyb20gYSBwYXJlbnQgbG9nZ2VyIChvciBhIGdsb2JhbCBkZWZhdWx0KS4gV2VcbiAgICAgICAqIGNhY2hlIHRoaXMgaGVyZSByYXRoZXIgdGhhbiBkZWxlZ2F0aW5nIHRvIHRoZSBwYXJlbnQgc28gdGhhdCBpdCBzdGF5c1xuICAgICAgICogaW4gc3luYyB3aXRoIHRoZSBhY3R1YWwgbG9nZ2luZyBtZXRob2RzIHRoYXQgd2UgaGF2ZSBpbnN0YWxsZWQgKHRoZVxuICAgICAgICogcGFyZW50IGNvdWxkIGNoYW5nZSBsZXZlbHMgYnV0IHdlIG1pZ2h0IG5vdCBoYXZlIHJlYnVpbHQgdGhlIGxvZ2dlcnNcbiAgICAgICAqIGluIHRoaXMgY2hpbGQgeWV0KS5cbiAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgKi9cbiAgICAgIHZhciBpbmhlcml0ZWRMZXZlbDtcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGRlZmF1bHQgbGV2ZWwgZm9yIHRoaXMgbG9nZ2VyLCBpZiBhbnkuIElmIHNldCwgdGhpcyBvdmVycmlkZXNcbiAgICAgICAqIGBpbmhlcml0ZWRMZXZlbGAuXG4gICAgICAgKiBAdHlwZSB7bnVtYmVyfG51bGx9XG4gICAgICAgKi9cbiAgICAgIHZhciBkZWZhdWx0TGV2ZWw7XG4gICAgICAvKipcbiAgICAgICAqIEEgdXNlci1zcGVjaWZpYyBsZXZlbCBmb3IgdGhpcyBsb2dnZXIuIElmIHNldCwgdGhpcyBvdmVycmlkZXNcbiAgICAgICAqIGBkZWZhdWx0TGV2ZWxgLlxuICAgICAgICogQHR5cGUge251bWJlcnxudWxsfVxuICAgICAgICovXG4gICAgICB2YXIgdXNlckxldmVsO1xuXG4gICAgICB2YXIgc3RvcmFnZUtleSA9IFwibG9nbGV2ZWxcIjtcbiAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBzdG9yYWdlS2V5ICs9IFwiOlwiICsgbmFtZTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG5hbWUgPT09IFwic3ltYm9sXCIpIHtcbiAgICAgICAgc3RvcmFnZUtleSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gcGVyc2lzdExldmVsSWZQb3NzaWJsZShsZXZlbE51bSkge1xuICAgICAgICAgIHZhciBsZXZlbE5hbWUgPSAobG9nTWV0aG9kc1tsZXZlbE51bV0gfHwgJ3NpbGVudCcpLnRvVXBwZXJDYXNlKCk7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gdW5kZWZpbmVkVHlwZSB8fCAhc3RvcmFnZUtleSkgcmV0dXJuO1xuXG4gICAgICAgICAgLy8gVXNlIGxvY2FsU3RvcmFnZSBpZiBhdmFpbGFibGVcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlW3N0b3JhZ2VLZXldID0gbGV2ZWxOYW1lO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfSBjYXRjaCAoaWdub3JlKSB7fVxuXG4gICAgICAgICAgLy8gVXNlIHNlc3Npb24gY29va2llIGFzIGZhbGxiYWNrXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgd2luZG93LmRvY3VtZW50LmNvb2tpZSA9XG4gICAgICAgICAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KHN0b3JhZ2VLZXkpICsgXCI9XCIgKyBsZXZlbE5hbWUgKyBcIjtcIjtcbiAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGdldFBlcnNpc3RlZExldmVsKCkge1xuICAgICAgICAgIHZhciBzdG9yZWRMZXZlbDtcblxuICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSB1bmRlZmluZWRUeXBlIHx8ICFzdG9yYWdlS2V5KSByZXR1cm47XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBzdG9yZWRMZXZlbCA9IHdpbmRvdy5sb2NhbFN0b3JhZ2Vbc3RvcmFnZUtleV07XG4gICAgICAgICAgfSBjYXRjaCAoaWdub3JlKSB7fVxuXG4gICAgICAgICAgLy8gRmFsbGJhY2sgdG8gY29va2llcyBpZiBsb2NhbCBzdG9yYWdlIGdpdmVzIHVzIG5vdGhpbmdcbiAgICAgICAgICBpZiAodHlwZW9mIHN0b3JlZExldmVsID09PSB1bmRlZmluZWRUeXBlKSB7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICB2YXIgY29va2llID0gd2luZG93LmRvY3VtZW50LmNvb2tpZTtcbiAgICAgICAgICAgICAgICAgIHZhciBjb29raWVOYW1lID0gZW5jb2RlVVJJQ29tcG9uZW50KHN0b3JhZ2VLZXkpO1xuICAgICAgICAgICAgICAgICAgdmFyIGxvY2F0aW9uID0gY29va2llLmluZGV4T2YoY29va2llTmFtZSArIFwiPVwiKTtcbiAgICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbiAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICBzdG9yZWRMZXZlbCA9IC9eKFteO10rKS8uZXhlYyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29va2llLnNsaWNlKGxvY2F0aW9uICsgY29va2llTmFtZS5sZW5ndGggKyAxKVxuICAgICAgICAgICAgICAgICAgICAgIClbMV07XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGlnbm9yZSkge31cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBJZiB0aGUgc3RvcmVkIGxldmVsIGlzIG5vdCB2YWxpZCwgdHJlYXQgaXQgYXMgaWYgbm90aGluZyB3YXMgc3RvcmVkLlxuICAgICAgICAgIGlmIChzZWxmLmxldmVsc1tzdG9yZWRMZXZlbF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBzdG9yZWRMZXZlbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gc3RvcmVkTGV2ZWw7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGNsZWFyUGVyc2lzdGVkTGV2ZWwoKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IHVuZGVmaW5lZFR5cGUgfHwgIXN0b3JhZ2VLZXkpIHJldHVybjtcblxuICAgICAgICAgIC8vIFVzZSBsb2NhbFN0b3JhZ2UgaWYgYXZhaWxhYmxlXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHN0b3JhZ2VLZXkpO1xuICAgICAgICAgIH0gY2F0Y2ggKGlnbm9yZSkge31cblxuICAgICAgICAgIC8vIFVzZSBzZXNzaW9uIGNvb2tpZSBhcyBmYWxsYmFja1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHdpbmRvdy5kb2N1bWVudC5jb29raWUgPVxuICAgICAgICAgICAgICAgIGVuY29kZVVSSUNvbXBvbmVudChzdG9yYWdlS2V5KSArIFwiPTsgZXhwaXJlcz1UaHUsIDAxIEphbiAxOTcwIDAwOjAwOjAwIFVUQ1wiO1xuICAgICAgICAgIH0gY2F0Y2ggKGlnbm9yZSkge31cbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gbm9ybWFsaXplTGV2ZWwoaW5wdXQpIHtcbiAgICAgICAgICB2YXIgbGV2ZWwgPSBpbnB1dDtcbiAgICAgICAgICBpZiAodHlwZW9mIGxldmVsID09PSBcInN0cmluZ1wiICYmIHNlbGYubGV2ZWxzW2xldmVsLnRvVXBwZXJDYXNlKCldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgbGV2ZWwgPSBzZWxmLmxldmVsc1tsZXZlbC50b1VwcGVyQ2FzZSgpXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHR5cGVvZiBsZXZlbCA9PT0gXCJudW1iZXJcIiAmJiBsZXZlbCA+PSAwICYmIGxldmVsIDw9IHNlbGYubGV2ZWxzLlNJTEVOVCkge1xuICAgICAgICAgICAgICByZXR1cm4gbGV2ZWw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImxvZy5zZXRMZXZlbCgpIGNhbGxlZCB3aXRoIGludmFsaWQgbGV2ZWw6IFwiICsgaW5wdXQpO1xuICAgICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLypcbiAgICAgICAqXG4gICAgICAgKiBQdWJsaWMgbG9nZ2VyIEFQSSAtIHNlZSBodHRwczovL2dpdGh1Yi5jb20vcGltdGVycnkvbG9nbGV2ZWwgZm9yIGRldGFpbHNcbiAgICAgICAqXG4gICAgICAgKi9cblxuICAgICAgc2VsZi5uYW1lID0gbmFtZTtcblxuICAgICAgc2VsZi5sZXZlbHMgPSB7IFwiVFJBQ0VcIjogMCwgXCJERUJVR1wiOiAxLCBcIklORk9cIjogMiwgXCJXQVJOXCI6IDMsXG4gICAgICAgICAgXCJFUlJPUlwiOiA0LCBcIlNJTEVOVFwiOiA1fTtcblxuICAgICAgc2VsZi5tZXRob2RGYWN0b3J5ID0gZmFjdG9yeSB8fCBkZWZhdWx0TWV0aG9kRmFjdG9yeTtcblxuICAgICAgc2VsZi5nZXRMZXZlbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAodXNlckxldmVsICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB1c2VyTGV2ZWw7XG4gICAgICAgICAgfSBlbHNlIGlmIChkZWZhdWx0TGV2ZWwgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRMZXZlbDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGluaGVyaXRlZExldmVsO1xuICAgICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHNlbGYuc2V0TGV2ZWwgPSBmdW5jdGlvbiAobGV2ZWwsIHBlcnNpc3QpIHtcbiAgICAgICAgICB1c2VyTGV2ZWwgPSBub3JtYWxpemVMZXZlbChsZXZlbCk7XG4gICAgICAgICAgaWYgKHBlcnNpc3QgIT09IGZhbHNlKSB7ICAvLyBkZWZhdWx0cyB0byB0cnVlXG4gICAgICAgICAgICAgIHBlcnNpc3RMZXZlbElmUG9zc2libGUodXNlckxldmVsKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBOT1RFOiBpbiB2MiwgdGhpcyBzaG91bGQgY2FsbCByZWJ1aWxkKCksIHdoaWNoIHVwZGF0ZXMgY2hpbGRyZW4uXG4gICAgICAgICAgcmV0dXJuIHJlcGxhY2VMb2dnaW5nTWV0aG9kcy5jYWxsKHNlbGYpO1xuICAgICAgfTtcblxuICAgICAgc2VsZi5zZXREZWZhdWx0TGV2ZWwgPSBmdW5jdGlvbiAobGV2ZWwpIHtcbiAgICAgICAgICBkZWZhdWx0TGV2ZWwgPSBub3JtYWxpemVMZXZlbChsZXZlbCk7XG4gICAgICAgICAgaWYgKCFnZXRQZXJzaXN0ZWRMZXZlbCgpKSB7XG4gICAgICAgICAgICAgIHNlbGYuc2V0TGV2ZWwobGV2ZWwsIGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBzZWxmLnJlc2V0TGV2ZWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdXNlckxldmVsID0gbnVsbDtcbiAgICAgICAgICBjbGVhclBlcnNpc3RlZExldmVsKCk7XG4gICAgICAgICAgcmVwbGFjZUxvZ2dpbmdNZXRob2RzLmNhbGwoc2VsZik7XG4gICAgICB9O1xuXG4gICAgICBzZWxmLmVuYWJsZUFsbCA9IGZ1bmN0aW9uKHBlcnNpc3QpIHtcbiAgICAgICAgICBzZWxmLnNldExldmVsKHNlbGYubGV2ZWxzLlRSQUNFLCBwZXJzaXN0KTtcbiAgICAgIH07XG5cbiAgICAgIHNlbGYuZGlzYWJsZUFsbCA9IGZ1bmN0aW9uKHBlcnNpc3QpIHtcbiAgICAgICAgICBzZWxmLnNldExldmVsKHNlbGYubGV2ZWxzLlNJTEVOVCwgcGVyc2lzdCk7XG4gICAgICB9O1xuXG4gICAgICBzZWxmLnJlYnVpbGQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKGRlZmF1bHRMb2dnZXIgIT09IHNlbGYpIHtcbiAgICAgICAgICAgICAgaW5oZXJpdGVkTGV2ZWwgPSBub3JtYWxpemVMZXZlbChkZWZhdWx0TG9nZ2VyLmdldExldmVsKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXBsYWNlTG9nZ2luZ01ldGhvZHMuY2FsbChzZWxmKTtcblxuICAgICAgICAgIGlmIChkZWZhdWx0TG9nZ2VyID09PSBzZWxmKSB7XG4gICAgICAgICAgICAgIGZvciAodmFyIGNoaWxkTmFtZSBpbiBfbG9nZ2Vyc0J5TmFtZSkge1xuICAgICAgICAgICAgICAgIF9sb2dnZXJzQnlOYW1lW2NoaWxkTmFtZV0ucmVidWlsZCgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgLy8gSW5pdGlhbGl6ZSBhbGwgdGhlIGludGVybmFsIGxldmVscy5cbiAgICAgIGluaGVyaXRlZExldmVsID0gbm9ybWFsaXplTGV2ZWwoXG4gICAgICAgICAgZGVmYXVsdExvZ2dlciA/IGRlZmF1bHRMb2dnZXIuZ2V0TGV2ZWwoKSA6IFwiV0FSTlwiXG4gICAgICApO1xuICAgICAgdmFyIGluaXRpYWxMZXZlbCA9IGdldFBlcnNpc3RlZExldmVsKCk7XG4gICAgICBpZiAoaW5pdGlhbExldmVsICE9IG51bGwpIHtcbiAgICAgICAgICB1c2VyTGV2ZWwgPSBub3JtYWxpemVMZXZlbChpbml0aWFsTGV2ZWwpO1xuICAgICAgfVxuICAgICAgcmVwbGFjZUxvZ2dpbmdNZXRob2RzLmNhbGwoc2VsZik7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKlxuICAgICAqIFRvcC1sZXZlbCBBUElcbiAgICAgKlxuICAgICAqL1xuXG4gICAgZGVmYXVsdExvZ2dlciA9IG5ldyBMb2dnZXIoKTtcblxuICAgIGRlZmF1bHRMb2dnZXIuZ2V0TG9nZ2VyID0gZnVuY3Rpb24gZ2V0TG9nZ2VyKG5hbWUpIHtcbiAgICAgICAgaWYgKCh0eXBlb2YgbmFtZSAhPT0gXCJzeW1ib2xcIiAmJiB0eXBlb2YgbmFtZSAhPT0gXCJzdHJpbmdcIikgfHwgbmFtZSA9PT0gXCJcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIllvdSBtdXN0IHN1cHBseSBhIG5hbWUgd2hlbiBjcmVhdGluZyBhIGxvZ2dlci5cIik7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbG9nZ2VyID0gX2xvZ2dlcnNCeU5hbWVbbmFtZV07XG4gICAgICAgIGlmICghbG9nZ2VyKSB7XG4gICAgICAgICAgICBsb2dnZXIgPSBfbG9nZ2Vyc0J5TmFtZVtuYW1lXSA9IG5ldyBMb2dnZXIoXG4gICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICBkZWZhdWx0TG9nZ2VyLm1ldGhvZEZhY3RvcnlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxvZ2dlcjtcbiAgICB9O1xuXG4gICAgLy8gR3JhYiB0aGUgY3VycmVudCBnbG9iYWwgbG9nIHZhcmlhYmxlIGluIGNhc2Ugb2Ygb3ZlcndyaXRlXG4gICAgdmFyIF9sb2cgPSAodHlwZW9mIHdpbmRvdyAhPT0gdW5kZWZpbmVkVHlwZSkgPyB3aW5kb3cubG9nIDogdW5kZWZpbmVkO1xuICAgIGRlZmF1bHRMb2dnZXIubm9Db25mbGljdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gdW5kZWZpbmVkVHlwZSAmJlxuICAgICAgICAgICAgICAgd2luZG93LmxvZyA9PT0gZGVmYXVsdExvZ2dlcikge1xuICAgICAgICAgICAgd2luZG93LmxvZyA9IF9sb2c7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVmYXVsdExvZ2dlcjtcbiAgICB9O1xuXG4gICAgZGVmYXVsdExvZ2dlci5nZXRMb2dnZXJzID0gZnVuY3Rpb24gZ2V0TG9nZ2VycygpIHtcbiAgICAgICAgcmV0dXJuIF9sb2dnZXJzQnlOYW1lO1xuICAgIH07XG5cbiAgICAvLyBFUzYgZGVmYXVsdCBleHBvcnQsIGZvciBjb21wYXRpYmlsaXR5XG4gICAgZGVmYXVsdExvZ2dlclsnZGVmYXVsdCddID0gZGVmYXVsdExvZ2dlcjtcblxuICAgIHJldHVybiBkZWZhdWx0TG9nZ2VyO1xufSkpO1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvbG9nZ2VyLmpzXG4gKiBDZW50cmFsaXNlZCBsb2dnaW5nIHVzaW5nIHRoZSBsb2dsZXZlbCBsaWJyYXJ5LlxuICpcbiAqIFVzYWdlIChwZXItbW9kdWxlIG5hbWVkIGxvZ2dlcnMpOlxuICogICBpbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG4gKiAgIGNvbnN0IGxvZyA9IGdldExvZ2dlcignYXBpLWNsaWVudCcpO1xuICogICBsb2cuaW5mbygncmVxdWVzdCBzdGFydGVkJywgZW5kcG9pbnQpO1xuICogICBsb2cud2Fybignc2Vzc2lvbiBjb25mbGljdCcpO1xuICogICBsb2cuZXJyb3IoJ2ZhdGFsJywgZXJyb3IpO1xuICpcbiAqIFJvb3QgbG9nZ2VyICh1bmNoYW5nZWQgZ2xvYmFsIGxldmVsKTpcbiAqICAgaW1wb3J0IGxvZyBmcm9tICcuL2xvZ2dlci5qcyc7XG4gKiAgIGxvZy5zZXRMZXZlbCgnZGVidWcnKTsgICAvLyBsb3dlciB0aGUgZ2xvYmFsIG1pbmltdW1cbiAqXG4gKiBUaGUgZGVmYXVsdCBsZXZlbCBpcyAnd2FybicgaW4gcHJvZHVjdGlvbiBidWlsZHMgKE5PREVfRU5WPXByb2R1Y3Rpb24pIGFuZFxuICogJ2RlYnVnJyBpbiBkZXZlbG9wbWVudC4gIEluZGl2aWR1YWwgbW9kdWxlIGxldmVscyBjYW4gYmUgb3ZlcnJpZGRlbiBhdFxuICogcnVudGltZSB2aWEgdGhlIGJyb3dzZXIgY29uc29sZTpcbiAqICAgbG9nbGV2ZWwuZ2V0TG9nZ2VyKCdhcGktY2xpZW50Jykuc2V0TGV2ZWwoJ3RyYWNlJyk7XG4gKlxuICogREVQRU5ERU5DSUVTOiBsb2dsZXZlbCAobnBtKVxuICovXG5cbmltcG9ydCBsb2dsZXZlbCBmcm9tICdsb2dsZXZlbCc7XG5cbi8vIERlZmF1bHQgbGV2ZWw6IGRlYnVnIGluIGRldiwgd2FybiBpbiBwcm9kLlxuY29uc3QgREVGQVVMVF9MRVZFTCA9ICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vzcy5lbnYgJiYgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJylcbiAgPyAnd2FybidcbiAgOiAnZGVidWcnO1xuXG5sb2dsZXZlbC5zZXREZWZhdWx0TGV2ZWwoREVGQVVMVF9MRVZFTCk7XG5cbi8qKlxuICogR2V0IChvciBjcmVhdGUpIGEgbmFtZWQgY2hpbGQgbG9nZ2VyLlxuICogTmFtZWQgbG9nZ2VycyBpbmhlcml0IHRoZSByb290IGRlZmF1bHQgbGV2ZWwgYnV0IGNhbiBiZSB0dW5lZCBpbmRlcGVuZGVudGx5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gTW9kdWxlIG5hbWUsIGUuZy4gJ2FwaS1jbGllbnQnXG4gKiBAcmV0dXJucyB7aW1wb3J0KCdsb2dsZXZlbCcpLkxvZ2dlcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExvZ2dlcihuYW1lKSB7XG4gIHJldHVybiBsb2dsZXZlbC5nZXRMb2dnZXIobmFtZSk7XG59XG5cbi8vIEV4cG9zZSByb290IGxvZ2xldmVsIGluc3RhbmNlIG9uIGdsb2JhbFRoaXMgc28gdGhlIGJyb3dzZXIgY29uc29sZSBjYW5cbi8vIGFkanVzdCBsZXZlbHMgYXQgcnVudGltZSB3aXRob3V0IGEgYnVpbGQgc3RlcDpcbi8vICAgbG9nbGV2ZWwuc2V0TGV2ZWwoJ2RlYnVnJyk7XG4vLyAgIGxvZ2xldmVsLmdldExvZ2dlcignYXBpLWNsaWVudCcpLnNldExldmVsKCd0cmFjZScpO1xuaWYgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJykge1xuICBnbG9iYWxUaGlzLmxvZ2xldmVsID0gbG9nbGV2ZWw7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGxvZ2xldmVsO1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB1dGlscy5qc1xuICogVXRpbGl0eSBmdW5jdGlvbnMgZm9yIHRleHQgcHJvY2Vzc2luZywgZm9ybWF0dGluZywgYW5kIGRhdGEgbWFuaXB1bGF0aW9uLlxuICogTm8gZGVwZW5kZW5jaWVzIG9uIERPTSBvciBjb21wbGV4IHN0YXRlLiBQdXJlIGZ1bmN0aW9ucy5cbiAqL1xuXG4vKipcbiAqIE5vcm1hbGl6ZSB3aGl0ZXNwYWNlIGluIHRleHQ6XG4gKiAtIFJlbW92ZSBsZWFkaW5nL3RyYWlsaW5nIHdoaXRlc3BhY2VcbiAqIC0gQ29sbGFwc2UgaW50ZXJuYWwgd2hpdGVzcGFjZSB0byBzaW5nbGUgc3BhY2VzXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVRleHQodGV4dCkge1xuICByZXR1cm4gdGV4dFxuICAgIC50cmltKCkgIC8vIFJlbW92ZSBsZWFkaW5nL3RyYWlsaW5nIHdoaXRlc3BhY2VcbiAgICAucmVwbGFjZSgvXFxzKy9nLCAnICcpICAvLyBDb2xsYXBzZSBpbnRlcm5hbCB3aGl0ZXNwYWNlXG4gICAgLnRyaW0oKTtcbn1cblxuLyoqXG4gKiBGb3JtYXQgYSBVbml4IHRpbWVzdGFtcCBhcyBodW1hbi1yZWFkYWJsZSBkYXRlIHN0cmluZy5cbiAqIEV4YW1wbGU6IDE3MDkyMzY4MDAgXHUyMTkyIFwiTWFyIDEsIDIwMjRcIlxuICovXG5mdW5jdGlvbiBmbXREYXRlKHRzKSB7XG4gIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh0cyAqIDEwMDApO1xuICByZXR1cm4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcoJ2VuLVVTJywgeyBtb250aDogJ3Nob3J0JywgZGF5OiAnbnVtZXJpYycsIHllYXI6ICdudW1lcmljJyB9KTtcbn1cblxuLyoqXG4gKiBDbGVhbiBKU09OIHJlc3BvbnNlIGJ5IHJlbW92aW5nIG1hcmtkb3duIGNvZGUgYmxvY2tzLlxuICogSGFuZGxlcyBjb21tb24gcGF0dGVybnM6XG4gKiAtIGBgYGpzb24gLi4uIGBgYFxuICogLSBgYGBcbiAqICAgLi4uXG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gY2xlYW5Kc29uUmVzcG9uc2UodGV4dCkge1xuICBpZiAodHlwZW9mIHRleHQgIT09ICdzdHJpbmcnKSByZXR1cm4gdGV4dDtcbiAgbGV0IGNsZWFuZWQgPSB0ZXh0O1xuICAvLyBSZW1vdmUgYGBganNvbiB3cmFwcGVyXG4gIGNsZWFuZWQgPSBjbGVhbmVkLnJlcGxhY2UoL15gYGBqc29uXFxzKi9pLCAnJykucmVwbGFjZSgvYGBgXFxzKiQvaSwgJycpO1xuICAvLyBSZW1vdmUgYGBgIHdyYXBwZXJcbiAgY2xlYW5lZCA9IGNsZWFuZWQucmVwbGFjZSgvXmBgYFxccyovaSwgJycpLnJlcGxhY2UoL2BgYFxccyokL2ksICcnKTtcbiAgcmV0dXJuIGNsZWFuZWQudHJpbSgpO1xufVxuXG4vKipcbiAqIEV4dHJhY3QgYW5kIHBhcnNlIHRoZSBmaXJzdCB2YWxpZCBKU09OIG9iamVjdCBlbWJlZGRlZCBpbiBmcmVlLWZvcm0gdGV4dC5cbiAqIFJldHVybnMgbnVsbCB3aGVuIG5vIGNvbXBsZXRlIHBhcnNlYWJsZSBvYmplY3QgaXMgZm91bmQuXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RGaXJzdEpzb25PYmplY3QodGV4dCkge1xuICBpZiAodGV4dCA9PSBudWxsIHx8IHR5cGVvZiB0ZXh0ICE9PSAnc3RyaW5nJykgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgY2xlYW5lZCA9IGNsZWFuSnNvblJlc3BvbnNlKHRleHQpO1xuXG4gIGZvciAobGV0IHN0YXJ0ID0gMDsgc3RhcnQgPCBjbGVhbmVkLmxlbmd0aDsgc3RhcnQgKz0gMSkge1xuICAgIGlmIChjbGVhbmVkW3N0YXJ0XSAhPT0gJ3snKSBjb250aW51ZTtcblxuICAgIGxldCBkZXB0aCA9IDA7XG4gICAgbGV0IGluU3RyaW5nID0gZmFsc2U7XG4gICAgbGV0IGlzRXNjYXBlZCA9IGZhbHNlO1xuXG4gICAgZm9yIChsZXQgaW5kZXggPSBzdGFydDsgaW5kZXggPCBjbGVhbmVkLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgY29uc3QgY2hhciA9IGNsZWFuZWRbaW5kZXhdO1xuXG4gICAgICBpZiAoaW5TdHJpbmcpIHtcbiAgICAgICAgaWYgKGlzRXNjYXBlZCkge1xuICAgICAgICAgIGlzRXNjYXBlZCA9IGZhbHNlO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFyID09PSAnXFxcXCcpIHtcbiAgICAgICAgICBpc0VzY2FwZWQgPSB0cnVlO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFyID09PSAnXCInKSB7XG4gICAgICAgICAgaW5TdHJpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoYXIgPT09ICdcIicpIHtcbiAgICAgICAgaW5TdHJpbmcgPSB0cnVlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoYXIgPT09ICd7Jykge1xuICAgICAgICBkZXB0aCArPSAxO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoYXIgIT09ICd9JykgY29udGludWU7XG5cbiAgICAgIGRlcHRoIC09IDE7XG4gICAgICBpZiAoZGVwdGggIT09IDApIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBjYW5kaWRhdGUgPSBjbGVhbmVkLnNsaWNlKHN0YXJ0LCBpbmRleCArIDEpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoY2FuZGlkYXRlKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBFc2NhcGUgSFRNTCBzcGVjaWFsIGNoYXJhY3RlcnMgdG8gcHJldmVudCBpbmplY3Rpb24uXG4gKiBDb252ZXJ0czogJiA8ID4gXCIgJ1xuICovXG5mdW5jdGlvbiBlc2NhcGVIdG1sKHRleHQpIHtcbiAgaWYgKHRleHQgPT0gbnVsbCkgcmV0dXJuICcnO1xuICBpZiAodHlwZW9mIHRleHQgIT09ICdzdHJpbmcnKSByZXR1cm4gZXNjYXBlSHRtbChTdHJpbmcodGV4dCkpO1xuICBjb25zdCBtYXAgPSB7XG4gICAgJyYnOiAnJmFtcDsnLFxuICAgICc8JzogJyZsdDsnLFxuICAgICc+JzogJyZndDsnLFxuICAgICdcIic6ICcmcXVvdDsnLFxuICAgIFwiJ1wiOiAnJiMwMzk7J1xuICB9O1xuICByZXR1cm4gdGV4dC5yZXBsYWNlKC9bJjw+XCInXS9nLCBtID0+IG1hcFttXSk7XG59XG5cbi8qKlxuICogRXh0cmFjdCB0aXRsZSBhbmQgY29tcGFueSBmcm9tIGpvYiBkZXNjcmlwdGlvbiB0ZXh0LlxuICogUGF0dGVybnM6XG4gKiAtIFwiVGl0bGUgfCBDb21wYW55XCJcbiAqIC0gXCJUaXRsZSBhdCBDb21wYW55XCJcbiAqIC0gRmlyc3QgbGluZSBjb250YWluaW5nIFwidGl0bGVcIiwgXCJwb3NpdGlvblwiLCBcInJvbGVcIiwgXCJhcmNoaXRlY3RcIiwgZXRjLlxuICovXG5mdW5jdGlvbiBleHRyYWN0VGl0bGVBbmRDb21wYW55RnJvbUpvYlRleHQoam9iVGV4dCkge1xuICBjb25zdCBsaW5lcyA9IGpvYlRleHQuc3BsaXQoJ1xcbicpLm1hcChsID0+IGwudHJpbSgpKS5maWx0ZXIobCA9PiBsLmxlbmd0aCA+IDApO1xuXG4gIC8vIExvb2sgZm9yIHBhdHRlcm5zOiBcIlRpdGxlIHwgQ29tcGFueVwiIG9yIFwiVGl0bGUgYXQgQ29tcGFueVwiXG4gIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgIGlmIChsaW5lLmluY2x1ZGVzKCd8JykpIHtcbiAgICAgIGNvbnN0IFt0aXRsZSwgY29tcGFueV0gPSBsaW5lLnNwbGl0KCd8JykubWFwKHMgPT4gcy50cmltKCkpO1xuICAgICAgaWYgKHRpdGxlICYmIGNvbXBhbnkpIHtcbiAgICAgICAgcmV0dXJuIHsgdGl0bGUsIGNvbXBhbnkgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGxpbmUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnIGF0ICcpKSB7XG4gICAgICBjb25zdCBbdGl0bGUsIGNvbXBhbnldID0gbGluZS5zcGxpdCgvXFxzK2F0XFxzKy9pKS5tYXAocyA9PiBzLnRyaW0oKSk7XG4gICAgICBpZiAodGl0bGUgJiYgY29tcGFueSkge1xuICAgICAgICByZXR1cm4geyB0aXRsZSwgY29tcGFueSB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEZhbGxiYWNrOiB1c2UgZmlyc3Qgbm9uLWVtcHR5IGxpbmUgYXMgdGl0bGVcbiAgY29uc3QgdGl0bGVMaW5lID0gbGluZXNbMF07XG4gIHJldHVybiB7XG4gICAgdGl0bGU6IHRpdGxlTGluZSB8fCAnVW50aXRsZWQgUG9zaXRpb24nLFxuICAgIGNvbXBhbnk6IGxpbmVzLmZpbmQobCA9PiBsLnRvTG93ZXJDYXNlKCkgIT09IHRpdGxlTGluZS50b0xvd2VyQ2FzZSgpKSB8fCAnVW5rbm93biBDb21wYW55J1xuICB9O1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSBwb3NpdGlvbiBsYWJlbDpcbiAqIC0gQ2FwaXRhbGl6ZSBlYWNoIHdvcmRcbiAqIC0gUmVtb3ZlIHRyYWlsaW5nIFwicm9sZVwiLCBcInBvc2l0aW9uXCIsIFwidGl0bGVcIiwgXCJqb2JcIlxuICogRXhhbXBsZXM6XG4gKiAtIFwic2VuaW9yIGRhdGEgc2NpZW50aXN0XCIgXHUyMTkyIFwiU2VuaW9yIERhdGEgU2NpZW50aXN0XCJcbiAqIC0gXCJkaXJlY3RvciBvZiBlbmdpbmVlcmluZ1wiIFx1MjE5MiBcIkRpcmVjdG9yIG9mIEVuZ2luZWVyaW5nXCJcbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplUG9zaXRpb25MYWJlbCh0aXRsZSwgY29tcGFueSkge1xuICBsZXQgbm9ybWFsaXplZCA9IHRpdGxlXG4gICAgLnNwbGl0KCcgJylcbiAgICAubWFwKHdvcmQgPT4gd29yZC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHdvcmQuc2xpY2UoMSkudG9Mb3dlckNhc2UoKSlcbiAgICAuam9pbignICcpO1xuXG4gIC8vIFJlbW92ZSBjb21tb24gc3VmZml4ZXNcbiAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWRcbiAgICAucmVwbGFjZSgvXFxzKyhyb2xlfHBvc2l0aW9ufHRpdGxlfGpvYilcXHMqJC9pLCAnJylcbiAgICAudHJpbSgpO1xuXG4gIHJldHVybiBub3JtYWxpemVkIHx8ICdQcm9mZXNzaW9uYWwgUm9sZSc7XG59XG5cbi8qKlxuICogU3RyaXAgSFRNTCB0YWdzIGZyb20gc3RyaW5nLlxuICogVXNlcyBhbiBpbmVydCB0ZW1wbGF0ZSBlbGVtZW50LCB0aGVuIHJlbW92ZXMgZXhlY3V0YWJsZS9ub24tdmlzaWJsZSBub2Rlcy5cbiAqL1xuZnVuY3Rpb24gc3RyaXBIdG1sKGh0bWwpIHtcbiAgY29uc3QgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpO1xuICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBTdHJpbmcoaHRtbCA/PyAnJyk7XG4gIHRlbXBsYXRlLmNvbnRlbnQucXVlcnlTZWxlY3RvckFsbCgnc2NyaXB0LCBzdHlsZSwgbm9zY3JpcHQsIHRlbXBsYXRlJykuZm9yRWFjaChub2RlID0+IG5vZGUucmVtb3ZlKCkpO1xuICByZXR1cm4gdGVtcGxhdGUuY29udGVudC50ZXh0Q29udGVudCB8fCAnJztcbn1cblxuLyoqXG4gKiBUcnVuY2F0ZSB0ZXh0IHRvIG1heCBsZW5ndGggd2l0aCBlbGxpcHNpcy5cbiAqIFByZXNlcnZlcyB3b3JkIGJvdW5kYXJpZXMgd2hlbiBwb3NzaWJsZS5cbiAqL1xuZnVuY3Rpb24gdHJ1bmNhdGVUZXh0KHRleHQsIG1heExlbmd0aCA9IDEwMCkge1xuICBpZiAodGV4dC5sZW5ndGggPD0gbWF4TGVuZ3RoKSByZXR1cm4gdGV4dDtcblxuICAvLyBUcnVuY2F0ZSBhdCBtYXggbGVuZ3RoXG4gIGxldCB0cnVuY2F0ZWQgPSB0ZXh0LnN1YnN0cmluZygwLCBtYXhMZW5ndGgpO1xuXG4gIC8vIFRyeSB0byBmaW5kIHRoZSBsYXN0IHNwYWNlIHRvIGF2b2lkIGN1dHRpbmcgd29yZHNcbiAgY29uc3QgbGFzdFNwYWNlID0gdHJ1bmNhdGVkLmxhc3RJbmRleE9mKCcgJyk7XG4gIGlmIChsYXN0U3BhY2UgPiBNYXRoLmZsb29yKG1heExlbmd0aCAqIDAuNzUpKSB7XG4gICAgdHJ1bmNhdGVkID0gdHJ1bmNhdGVkLnN1YnN0cmluZygwLCBsYXN0U3BhY2UpO1xuICB9XG5cbiAgcmV0dXJuIHRydW5jYXRlZCArICdcdTIwMjYnO1xufVxuXG4vKipcbiAqIENhcGl0YWxpemUgZmlyc3QgbGV0dGVyIG9mIGVhY2ggd29yZC5cbiAqL1xuZnVuY3Rpb24gY2FwaXRhbGl6ZVdvcmRzKHRleHQpIHtcbiAgcmV0dXJuIHRleHRcbiAgICAuc3BsaXQoJyAnKVxuICAgIC5tYXAod29yZCA9PiB3b3JkLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgd29yZC5zbGljZSgxKS50b0xvd2VyQ2FzZSgpKVxuICAgIC5qb2luKCcgJyk7XG59XG5cbi8qKlxuICogQ29uZGl0aW9uYWwgcGx1cmFsaXphdGlvbiBoZWxwZXIuXG4gKiBFeGFtcGxlOiBwbHVyYWxpemUoMSwgJ2l0ZW0nLCAnaXRlbXMnKSBcdTIxOTIgJ2l0ZW0nXG4gKiAgICAgICAgICBwbHVyYWxpemUoMywgJ2l0ZW0nLCAnaXRlbXMnKSBcdTIxOTIgJ2l0ZW1zJ1xuICovXG5mdW5jdGlvbiBwbHVyYWxpemUoY291bnQsIHNpbmd1bGFyLCBwbHVyYWwpIHtcbiAgcmV0dXJuIGNvdW50ID09PSAxID8gc2luZ3VsYXIgOiBwbHVyYWw7XG59XG5cbi8qKlxuICogSHVtYW4tcmVhZGFibGUgdGltZSBkdXJhdGlvbi5cbiAqIEV4YW1wbGU6IDUwMDAgXHUyMTkyIFwiNSBzZWNvbmRzXCIsIDY1MDAwIFx1MjE5MiBcIjEgbWludXRlXCJcbiAqL1xuZnVuY3Rpb24gZm9ybWF0RHVyYXRpb24obXMpIHtcbiAgY29uc3Qgc2Vjb25kcyA9IE1hdGguZmxvb3IobXMgLyAxMDAwKTtcbiAgY29uc3QgbWludXRlcyA9IE1hdGguZmxvb3Ioc2Vjb25kcyAvIDYwKTtcbiAgY29uc3QgaG91cnMgPSBNYXRoLmZsb29yKG1pbnV0ZXMgLyA2MCk7XG5cbiAgaWYgKGhvdXJzID4gMCkgcmV0dXJuIGAke2hvdXJzfWggJHttaW51dGVzICUgNjB9bWA7XG4gIGlmIChtaW51dGVzID4gMCkgcmV0dXJuIGAke21pbnV0ZXN9bSAke3NlY29uZHMgJSA2MH1zYDtcbiAgcmV0dXJuIGAke3NlY29uZHN9c2A7XG59XG5cbi8qKlxuICogT3JkaW5hbCBudW1iZXIgc3VmZml4LlxuICogRXhhbXBsZTogMSBcdTIxOTIgXCIxc3RcIiwgMiBcdTIxOTIgXCIybmRcIiwgMyBcdTIxOTIgXCIzcmRcIiwgNCBcdTIxOTIgXCI0dGhcIlxuICovXG5mdW5jdGlvbiBvcmRpbmFsKG4pIHtcbiAgY29uc3QgcyA9IFsndGgnLCAnc3QnLCAnbmQnLCAncmQnXTtcbiAgY29uc3QgdiA9IG4gJSAxMDA7XG4gIHJldHVybiBuICsgKHNbKHYgLSAyMCkgJSAxMF0gfHwgc1t2XSB8fCBzWzBdKTtcbn1cblxuLy8gVXRpbGl0eSBmdW5jdGlvbnMgZm9yIHNlc3Npb24gbWFuYWdlbWVudCBhbmQgZm9ybWF0dGluZ1xuXG4vLyBGdWxsLWxlbmd0aCBwaGFzZSBsYWJlbHMgXHUyMDE0IHVzZWQgYnkgd29ya2Zsb3cgc3RlcCBkaXNwbGF5LCBzdGF0dXMgdGV4dCwgZXRjLlxuY29uc3QgU0VTU0lPTl9QSEFTRV9MQUJFTFMgPSB7XG4gIGluaXQ6ICAgICAgICAgICAgICdHZXR0aW5nIFN0YXJ0ZWQnLFxuICBqb2JfYW5hbHlzaXM6ICAgICAnSm9iIEFuYWx5c2lzJyxcbiAgY3VzdG9taXphdGlvbjogICAgJ0N1c3RvbWlzYXRpb24nLFxuICByZXdyaXRlX3JldmlldzogICAnUmV3cml0ZSBSZXZpZXcnLFxuICBzcGVsbF9jaGVjazogICAgICAnU3BlbGwgQ2hlY2snLFxuICBnZW5lcmF0aW9uOiAgICAgICAnR2VuZXJhdGlvbicsXG4gIGxheW91dF9yZXZpZXc6ICAgICdMYXlvdXQgUmV2aWV3JyxcbiAgcmVmaW5lbWVudDogICAgICAgJ0ZpbmFsaXNlJyxcbiAgZmluYWxfZ2VuZXJhdGlvbjogJ0ZpbmFsIEdlbmVyYXRpb24nLFxufTtcblxuLy8gQWJicmV2aWF0ZWQgcGhhc2UgbGFiZWxzIFx1MjAxNCB1c2VkIGJ5IHRoZSBjb21wYWN0IHNlc3Npb24tc3dpdGNoZXIgVUkuXG4vLyBJbnRlbnRpb25hbGx5IHNlcGFyYXRlIGZyb20gU0VTU0lPTl9QSEFTRV9MQUJFTFM6IHRoZSB0d28gc2V0cyBzZXJ2ZSBkaWZmZXJlbnRcbi8vIFVJIGNvbnRleHRzIChzcGFjZS1jb25zdHJhaW5lZCBoZWFkZXIgY2hpcCB2cy4gZnVsbCB3b3JrZmxvdyBzdGVwIGxhYmVsKS5cbmNvbnN0IFNFU1NJT05fUEhBU0VfTEFCRUxTX1NIT1JUID0ge1xuICBpbml0OiAgICAgICAgICAgICAnU2V0dXAnLFxuICBqb2JfYW5hbHlzaXM6ICAgICAnQW5hbHlzaXMnLFxuICBjdXN0b21pemF0aW9uOiAgICAnQ3VzdG9taXNpbmcnLFxuICByZXdyaXRlX3JldmlldzogICAnUmV3cml0ZXMnLFxuICBzcGVsbF9jaGVjazogICAgICAnU3BlbGwgQ2hlY2snLFxuICBnZW5lcmF0aW9uOiAgICAgICAnR2VuZXJhdGUnLFxuICBsYXlvdXRfcmV2aWV3OiAgICAnTGF5b3V0JyxcbiAgcmVmaW5lbWVudDogICAgICAgJ0ZpbmFsaXNlJyxcbiAgZmluYWxfZ2VuZXJhdGlvbjogJ0ZpbmFsIEdlbicsXG59O1xuXG4vKipcbiAqIEZvcm1hdCBzZXNzaW9uIHBoYXNlIGxhYmVscyAoZnVsbCBmb3JtKS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwaGFzZSAtIFRoZSBwaGFzZSBzdHJpbmcgdG8gZm9ybWF0LlxuICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgZm9ybWF0dGVkIHBoYXNlIGxhYmVsLlxuICovXG5mdW5jdGlvbiBmb3JtYXRTZXNzaW9uUGhhc2VMYWJlbChwaGFzZSkge1xuICBpZiAoIXBoYXNlKSByZXR1cm4gJ2luaXQnO1xuICByZXR1cm4gU0VTU0lPTl9QSEFTRV9MQUJFTFNbcGhhc2VdIHx8IFN0cmluZyhwaGFzZSkucmVwbGFjZSgvXy9nLCAnICcpO1xufVxuXG4vKipcbiAqIEZvcm1hdCBzZXNzaW9uIHRpbWVzdGFtcHMuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGltZXN0YW1wIC0gVGhlIHRpbWVzdGFtcCB0byBmb3JtYXQuXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyAtIEZvcm1hdHRpbmcgb3B0aW9ucy5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuaW5jbHVkZVRpbWU9dHJ1ZV0gLSBXaGV0aGVyIHRvIGluY2x1ZGUgdGltZSBpbiB0aGUgb3V0cHV0LlxuICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAqL1xuZnVuY3Rpb24gZm9ybWF0U2Vzc2lvblRpbWVzdGFtcCh0aW1lc3RhbXAsIHsgaW5jbHVkZVRpbWUgPSB0cnVlIH0gPSB7fSkge1xuICBpZiAoIXRpbWVzdGFtcCkgcmV0dXJuICdcdTIwMTQnO1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgRGF0ZSh0aW1lc3RhbXApLnRvTG9jYWxlU3RyaW5nKCdlbi1VUycsIHtcbiAgICAgIG1vbnRoOiAnc2hvcnQnLCBkYXk6ICdudW1lcmljJywgeWVhcjogJ251bWVyaWMnLFxuICAgICAgLi4uKGluY2x1ZGVUaW1lID8geyBob3VyOiAnbnVtZXJpYycsIG1pbnV0ZTogJzItZGlnaXQnIH0gOiB7fSksXG4gICAgfSk7XG4gIH0gY2F0Y2ggKF8pIHtcbiAgICByZXR1cm4gU3RyaW5nKHRpbWVzdGFtcCkucmVwbGFjZSgnVCcsICcgJykuc2xpY2UoMCwgaW5jbHVkZVRpbWUgPyAxNiA6IDEwKTtcbiAgfVxufVxuXG4vLyBTdHJ1Y3R1cmVkIGxvZ2dpbmcgaGVscGVyIChnbG9iYWwgYW5kIHRlc3QtZnJpZW5kbHkpLlxuY29uc3QgTE9HX0xFVkVMUyA9IHsgZGVidWc6IDEwLCBpbmZvOiAyMCwgd2FybjogMzAsIGVycm9yOiA0MCB9O1xuY29uc3QgREVGQVVMVF9MT0dfTEVWRUwgPSAnaW5mbyc7XG5cbmZ1bmN0aW9uIGNyZWF0ZUxvZ0VudHJ5KGxldmVsLCBtZXNzYWdlLCBtZXRhZGF0YSA9IHt9KSB7XG4gIGNvbnN0IGVudHJ5ID0ge1xuICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIGxldmVsLFxuICAgIG1lc3NhZ2U6IFN0cmluZyhtZXNzYWdlKSxcbiAgICAuLi5tZXRhZGF0YSxcbiAgfTtcbiAgcmV0dXJuIGVudHJ5O1xufVxuXG5jb25zdCBsb2dnZXIgPSB7XG4gIGxldmVsOiBERUZBVUxUX0xPR19MRVZFTCxcblxuICBzZXRMZXZlbChuZXdMZXZlbCkge1xuICAgIGlmIChMT0dfTEVWRUxTW25ld0xldmVsXSAhPSBudWxsKSB7XG4gICAgICB0aGlzLmxldmVsID0gbmV3TGV2ZWw7XG4gICAgfVxuICB9LFxuXG4gIHNob3VsZExvZyhsZXZlbCkge1xuICAgIGlmIChMT0dfTEVWRUxTW2xldmVsXSA9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIExPR19MRVZFTFNbbGV2ZWxdID49IExPR19MRVZFTFNbdGhpcy5sZXZlbF07XG4gIH0sXG5cbiAgbG9nKGxldmVsLCBtZXNzYWdlLCBtZXRhZGF0YSA9IHt9KSB7XG4gICAgaWYgKCF0aGlzLnNob3VsZExvZyhsZXZlbCkpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgZW50cnkgPSBjcmVhdGVMb2dFbnRyeShsZXZlbCwgbWVzc2FnZSwgbWV0YWRhdGEpO1xuICAgIGNvbnN0IGZvcm1hdHRlZCA9IEpTT04uc3RyaW5naWZ5KGVudHJ5KTtcblxuICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGlmIChsZXZlbCA9PT0gJ2Vycm9yJykgY29uc29sZS5lcnJvcihmb3JtYXR0ZWQpO1xuICAgICAgZWxzZSBpZiAobGV2ZWwgPT09ICd3YXJuJykgY29uc29sZS53YXJuKGZvcm1hdHRlZCk7XG4gICAgICBlbHNlIGNvbnNvbGUubG9nKGZvcm1hdHRlZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVudHJ5O1xuICB9LFxuXG4gIGRlYnVnKG1lc3NhZ2UsIG1ldGFkYXRhID0ge30pIHsgcmV0dXJuIHRoaXMubG9nKCdkZWJ1ZycsIG1lc3NhZ2UsIG1ldGFkYXRhKTsgfSxcbiAgaW5mbyhtZXNzYWdlLCBtZXRhZGF0YSA9IHt9KSB7IHJldHVybiB0aGlzLmxvZygnaW5mbycsIG1lc3NhZ2UsIG1ldGFkYXRhKTsgfSxcbiAgd2FybihtZXNzYWdlLCBtZXRhZGF0YSA9IHt9KSB7IHJldHVybiB0aGlzLmxvZygnd2FybicsIG1lc3NhZ2UsIG1ldGFkYXRhKTsgfSxcbiAgZXJyb3IobWVzc2FnZSwgbWV0YWRhdGEgPSB7fSkgeyByZXR1cm4gdGhpcy5sb2coJ2Vycm9yJywgbWVzc2FnZSwgbWV0YWRhdGEpOyB9LFxuXG4gIGV2ZW50KGFjdGlvbiwgbWV0YWRhdGEgPSB7fSkge1xuICAgIHJldHVybiB0aGlzLmluZm8oYGV2ZW50OiR7YWN0aW9ufWAsIHsgYWN0aW9uLCAuLi5tZXRhZGF0YSB9KTtcbiAgfSxcbn07XG5cbmlmICh0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgZ2xvYmFsVGhpcy5sb2dnZXIgPSBsb2dnZXI7XG59XG5cbmV4cG9ydCB7XG4gIG5vcm1hbGl6ZVRleHQsIGZtdERhdGUsIGNsZWFuSnNvblJlc3BvbnNlLCBleHRyYWN0Rmlyc3RKc29uT2JqZWN0LCBlc2NhcGVIdG1sLFxuICBleHRyYWN0VGl0bGVBbmRDb21wYW55RnJvbUpvYlRleHQsIG5vcm1hbGl6ZVBvc2l0aW9uTGFiZWwsXG4gIHN0cmlwSHRtbCwgdHJ1bmNhdGVUZXh0LCBjYXBpdGFsaXplV29yZHMsIHBsdXJhbGl6ZSxcbiAgZm9ybWF0RHVyYXRpb24sIG9yZGluYWwsXG4gIFNFU1NJT05fUEhBU0VfTEFCRUxTLCBTRVNTSU9OX1BIQVNFX0xBQkVMU19TSE9SVCxcbiAgZm9ybWF0U2Vzc2lvblBoYXNlTGFiZWwsXG4gIGxvZ2dlcixcbn07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIGFwaS1jbGllbnQuanNcbiAqIENlbnRyYWxpemVkIEhUVFAgY29tbXVuaWNhdGlvbiBsYXllci4gQWxsIEFQSSBjYWxscyBnbyB0aHJvdWdoIGFwaUNhbGwoKS5cbiAqIFByb3ZpZGVzIGVycm9yIGhhbmRsaW5nLCBsb2dnaW5nLCBhbmQgcmV0cnkgbG9naWMuXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgaGFuZGxlNDA5Q29uZmxpY3QgfSBmcm9tICcuL2ZldGNoLXV0aWxzLmpzJztcbmNvbnN0IGxvZyA9IGdldExvZ2dlcignYXBpLWNsaWVudCcpO1xuXG4vKipcbiAqIENlbnRyYWxpemVkIGxvY2FsU3RvcmFnZSBrZXkgbWFuYWdlbWVudCB0byBhdm9pZCBkdXBsaWNhdGlvblxuICovXG5jb25zdCBTdG9yYWdlS2V5cyA9IHtcbiAgU0VTU0lPTl9JRDogICAgICAgICAgICdjdi1idWlsZGVyLXNlc3Npb24taWQnLFxuICBTRVNTSU9OX1BBVEg6ICAgICAgICAgJ2N2LWJ1aWxkZXItc2Vzc2lvbi1wYXRoJyxcbiAgVEFCX0RBVEE6ICAgICAgICAgICAgICdjdi1idWlsZGVyLXRhYi1kYXRhJyxcbiAgQ1VSUkVOVF9UQUI6ICAgICAgICAgICdjdi1idWlsZGVyLWN1cnJlbnQtdGFiJyxcbiAgQ0hBVF9DT0xMQVBTRUQ6ICAgICAgICdjdi1idWlsZGVyLWNoYXQtY29sbGFwc2VkJyxcbiAgTExNX0RJU0NMT1NVUkVfU0hPV046ICdjdi1idWlsZGVyLWxsbS1kaXNjbG9zdXJlLXNob3duJyxcbn07XG5cbmNvbnN0IE9XTkVSX1RPS0VOX0tFWSA9ICdjdi1idWlsZGVyLW93bmVyLXRva2VuJztcblxuZnVuY3Rpb24gZ2V0U2Vzc2lvbklkRnJvbVVSTCgpIHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICF3aW5kb3cubG9jYXRpb24pIHJldHVybiBudWxsO1xuICByZXR1cm4gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKS5nZXQoJ3Nlc3Npb24nKTtcbn1cblxuZnVuY3Rpb24gZ2V0T3duZXJUb2tlbigpIHtcbiAgaWYgKHR5cGVvZiBzZXNzaW9uU3RvcmFnZSA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybiBudWxsO1xuICBsZXQgdG9rZW4gPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKE9XTkVSX1RPS0VOX0tFWSk7XG4gIGlmICghdG9rZW4pIHtcbiAgICBpZiAodHlwZW9mIGNyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNyeXB0by5yYW5kb21VVUlEID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0b2tlbiA9IGNyeXB0by5yYW5kb21VVUlEKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRva2VuID0gYHRhYi0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygxNikuc2xpY2UoMiwgMTApfWA7XG4gICAgfVxuICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oT1dORVJfVE9LRU5fS0VZLCB0b2tlbik7XG4gIH1cbiAgcmV0dXJuIHRva2VuO1xufVxuXG5mdW5jdGlvbiBnZXRTY29wZWRUYWJEYXRhU3RvcmFnZUtleShzZXNzaW9uSWQgPSBudWxsKSB7XG4gIGNvbnN0IHNjb3BlZFNlc3Npb25JZCA9IHNlc3Npb25JZCB8fCBnZXRTZXNzaW9uSWRGcm9tVVJMKCk7XG4gIHJldHVybiBzY29wZWRTZXNzaW9uSWRcbiAgICA/IGAke1N0b3JhZ2VLZXlzLlRBQl9EQVRBfS0ke3Njb3BlZFNlc3Npb25JZH1gXG4gICAgOiBTdG9yYWdlS2V5cy5UQUJfREFUQTtcbn1cblxuZnVuY3Rpb24gX2lzU2Vzc2lvbk1hbmFnZW1lbnRQYXRoKHBhdGhuYW1lKSB7XG4gIHJldHVybiBwYXRobmFtZSA9PT0gJy9hcGkvc2Vzc2lvbnMvbmV3J1xuICAgIHx8IHBhdGhuYW1lID09PSAnL2FwaS9zZXNzaW9ucy9jbGFpbSdcbiAgICB8fCBwYXRobmFtZSA9PT0gJy9hcGkvc2Vzc2lvbnMvdGFrZW92ZXInO1xufVxuXG5mdW5jdGlvbiBfYnVpbGRTZXNzaW9uQXdhcmVSZXF1ZXN0KGlucHV0LCBpbml0ID0ge30pIHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICF3aW5kb3cubG9jYXRpb24pIHtcbiAgICByZXR1cm4gW2lucHV0LCBpbml0XTtcbiAgfVxuXG4gIGNvbnN0IHVybCA9IG5ldyBVUkwodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJyA/IGlucHV0IDogaW5wdXQudXJsLCB3aW5kb3cubG9jYXRpb24ub3JpZ2luKTtcbiAgaWYgKCF1cmwucGF0aG5hbWUuc3RhcnRzV2l0aCgnL2FwaS8nKSkge1xuICAgIHJldHVybiBbaW5wdXQsIGluaXRdO1xuICB9XG5cbiAgY29uc3Qgb3duZXJUb2tlbiA9IGdldE93bmVyVG9rZW4oKTtcbiAgaWYgKCF1cmwuc2VhcmNoUGFyYW1zLmhhcygnb3duZXJfdG9rZW4nKSAmJiAhX2lzU2Vzc2lvbk1hbmFnZW1lbnRQYXRoKHVybC5wYXRobmFtZSkgJiYgb3duZXJUb2tlbikge1xuICAgIHVybC5zZWFyY2hQYXJhbXMuc2V0KCdvd25lcl90b2tlbicsIG93bmVyVG9rZW4pO1xuICB9XG5cbiAgY29uc3Qgc2Vzc2lvbklkID0gZ2V0U2Vzc2lvbklkRnJvbVVSTCgpO1xuICBpZiAoIXNlc3Npb25JZCkge1xuICAgIHJldHVybiBbdXJsLnRvU3RyaW5nKCksIGluaXRdO1xuICB9XG5cbiAgY29uc3QgbWV0aG9kID0gKGluaXQubWV0aG9kIHx8ICdHRVQnKS50b1VwcGVyQ2FzZSgpO1xuICBjb25zdCBuZXh0SW5pdCA9IHsgLi4uaW5pdCB9O1xuICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoaW5pdC5oZWFkZXJzIHx8IHt9KTtcblxuICBpZiAoIXVybC5zZWFyY2hQYXJhbXMuaGFzKCdzZXNzaW9uX2lkJykgJiYgIV9pc1Nlc3Npb25NYW5hZ2VtZW50UGF0aCh1cmwucGF0aG5hbWUpKSB7XG4gICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ3Nlc3Npb25faWQnLCBzZXNzaW9uSWQpO1xuICB9XG5cbiAgY29uc3QgbmVlZHNCb2R5Q29udGV4dCA9ICFbJ0dFVCcsICdIRUFEJ10uaW5jbHVkZXMobWV0aG9kKTtcbiAgY29uc3QgYm9keSA9IG5leHRJbml0LmJvZHk7XG4gIGNvbnN0IGlzRm9ybURhdGEgPSB0eXBlb2YgRm9ybURhdGEgIT09ICd1bmRlZmluZWQnICYmIGJvZHkgaW5zdGFuY2VvZiBGb3JtRGF0YTtcbiAgY29uc3QgaXNVUkxTZWFyY2hQYXJhbXMgPSB0eXBlb2YgVVJMU2VhcmNoUGFyYW1zICE9PSAndW5kZWZpbmVkJyAmJiBib2R5IGluc3RhbmNlb2YgVVJMU2VhcmNoUGFyYW1zO1xuICBjb25zdCBjb250ZW50VHlwZSA9IGhlYWRlcnMuZ2V0KCdDb250ZW50LVR5cGUnKSB8fCAnJztcblxuICBpZiAobmVlZHNCb2R5Q29udGV4dCAmJiAhaXNGb3JtRGF0YSAmJiAhaXNVUkxTZWFyY2hQYXJhbXMpIHtcbiAgICBsZXQgcGF5bG9hZCA9IHt9O1xuICAgIGlmICh0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycgJiYgYm9keS50cmltKCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHBheWxvYWQgPSBKU09OLnBhcnNlKGJvZHkpO1xuICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICByZXR1cm4gW3VybC50b1N0cmluZygpLCBuZXh0SW5pdF07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChib2R5ID09IG51bGwpIHtcbiAgICAgIHBheWxvYWQgPSB7fTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBib2R5ID09PSAnb2JqZWN0Jykge1xuICAgICAgcGF5bG9hZCA9IHsgLi4uYm9keSB9O1xuICAgIH1cblxuICAgIGlmIChwYXlsb2FkLnNlc3Npb25faWQgPT0gbnVsbCAmJiAhX2lzU2Vzc2lvbk1hbmFnZW1lbnRQYXRoKHVybC5wYXRobmFtZSkpIHtcbiAgICAgIHBheWxvYWQuc2Vzc2lvbl9pZCA9IHNlc3Npb25JZDtcbiAgICB9XG4gICAgaWYgKHBheWxvYWQub3duZXJfdG9rZW4gPT0gbnVsbCAmJiAhX2lzU2Vzc2lvbk1hbmFnZW1lbnRQYXRoKHVybC5wYXRobmFtZSkpIHtcbiAgICAgIGlmIChvd25lclRva2VuKSBwYXlsb2FkLm93bmVyX3Rva2VuID0gb3duZXJUb2tlbjtcbiAgICB9XG5cbiAgICBuZXh0SW5pdC5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocGF5bG9hZCk7XG4gICAgaWYgKCFjb250ZW50VHlwZSkge1xuICAgICAgaGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uJyk7XG4gICAgfVxuICB9XG5cbiAgbmV4dEluaXQuaGVhZGVycyA9IGhlYWRlcnM7XG4gIHJldHVybiBbdXJsLnRvU3RyaW5nKCksIG5leHRJbml0XTtcbn1cblxuY29uc3QgX25hdGl2ZUZldGNoID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5mZXRjaCA9PT0gJ2Z1bmN0aW9uJ1xuICA/IHdpbmRvdy5mZXRjaC5iaW5kKHdpbmRvdylcbiAgOiAodHlwZW9mIGdsb2JhbFRoaXMuZmV0Y2ggPT09ICdmdW5jdGlvbicgPyBnbG9iYWxUaGlzLmZldGNoLmJpbmQoZ2xvYmFsVGhpcykgOiBudWxsKTtcblxuYXN5bmMgZnVuY3Rpb24gc2Vzc2lvbkF3YXJlRmV0Y2goaW5wdXQsIGluaXQgPSB7fSkge1xuICBpZiAoX25hdGl2ZUZldGNoID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZldGNoIGlzIG5vdCBhdmFpbGFibGUnKTtcbiAgfVxuICBjb25zdCBbbmV4dElucHV0LCBuZXh0SW5pdF0gPSBfYnVpbGRTZXNzaW9uQXdhcmVSZXF1ZXN0KGlucHV0LCBpbml0KTtcbiAgbGV0IHJlc3AgPSBhd2FpdCBfbmF0aXZlRmV0Y2gobmV4dElucHV0LCBuZXh0SW5pdCk7XG4gIGlmIChyZXNwLnN0YXR1cyA9PT0gNDA5KSB7XG4gICAgY29uc3Qgc2hvdWxkUmV0cnkgPSBhd2FpdCBoYW5kbGU0MDlDb25mbGljdChuZXh0SW5wdXQsIG5leHRJbml0LCByZXNwKTtcbiAgICBpZiAoc2hvdWxkUmV0cnkpIHJlc3AgPSBhd2FpdCBfbmF0aXZlRmV0Y2gobmV4dElucHV0LCBuZXh0SW5pdCk7XG4gIH1cbiAgcmV0dXJuIHJlc3A7XG59XG5cbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93LmZldGNoID09PSAnZnVuY3Rpb24nKSB7XG4gIHdpbmRvdy5mZXRjaCA9IHNlc3Npb25Bd2FyZUZldGNoO1xufVxuXG4vKipcbiAqIEJhc2UgQVBJIGNhbGwgZnVuY3Rpb24gd2l0aCBlcnJvciBoYW5kbGluZyBhbmQgbG9nZ2luZy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2QgLSBIVFRQIG1ldGhvZCAoR0VULCBQT1NULCBldGMuKVxuICogQHBhcmFtIHtzdHJpbmd9IGVuZHBvaW50IC0gQVBJIGVuZHBvaW50IChlLmcuLCAnL2FwaS9zdGF0dXMnKVxuICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBSZXF1ZXN0IGJvZHkgZGF0YSAoZm9yIFBPU1QvUFVUKVxuICogQHJldHVybnMge1Byb21pc2U8b2JqZWN0Pn0gUGFyc2VkIEpTT04gcmVzcG9uc2VcbiAqL1xuYXN5bmMgZnVuY3Rpb24gYXBpQ2FsbChtZXRob2QsIGVuZHBvaW50LCBkYXRhID0gbnVsbCkge1xuICBjb25zdCBvcHRpb25zID0ge1xuICAgIG1ldGhvZCxcbiAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfVxuICB9O1xuXG4gIGlmIChkYXRhICYmIChtZXRob2QgPT09ICdQT1NUJyB8fCBtZXRob2QgPT09ICdQVVQnKSkge1xuICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNlc3Npb25Bd2FyZUZldGNoKGVuZHBvaW50LCBvcHRpb25zKTtcblxuICAgIC8vIEhhbmRsZSA0MDkgQ29uZmxpY3QgKHNlc3Npb24gYWxyZWFkeSBhY3RpdmUpXG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA5KSB7XG4gICAgICBsb2cud2FybihgU2Vzc2lvbiBjb25mbGljdCBvbiAke2VuZHBvaW50fWApO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTZXNzaW9uIGFscmVhZHkgYWN0aXZlIGluIGFub3RoZXIgdGFiJyk7XG4gICAgfVxuXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgbG9nLmVycm9yKGBBUEkgZXJyb3Igb24gJHttZXRob2R9ICR7ZW5kcG9pbnR9OmAsIHJlc3BvbnNlLnN0YXR1cywgcmVzcG9uc2Uuc3RhdHVzVGV4dCk7XG4gICAgICBsZXQgZXJyb3JNZXNzYWdlID0gcmVzcG9uc2Uuc3RhdHVzVGV4dDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGVycm9ySnNvbiA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgaWYgKGVycm9ySnNvbiAmJiB0eXBlb2YgZXJyb3JKc29uID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGVycm9ySnNvbi5lcnJvciB8fCBlcnJvckpzb24ubWVzc2FnZSB8fCBlcnJvck1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgLy8gRmFsbCBiYWNrIHRvIHN0YXR1cyB0ZXh0IHdoZW4gcmVzcG9uc2UgaXMgbm90IEpTT04uXG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7cmVzcG9uc2Uuc3RhdHVzfTogJHtlcnJvck1lc3NhZ2V9YCk7XG4gICAgfVxuXG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICByZXR1cm4ganNvbjtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cuZXJyb3IoYEFQSSBjYWxsIGZhaWxlZDogJHttZXRob2R9ICR7ZW5kcG9pbnR9YCwgZXJyb3IpO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09XG4vLyBTZXNzaW9uIE1hbmFnZW1lbnRcbi8vID09PT09PT09PT09PT09PT09PT09XG5cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVNlc3Npb24oKSB7XG4gIHJldHVybiBhcGlDYWxsKCdQT1NUJywgJy9hcGkvc2Vzc2lvbnMvbmV3Jyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoU3RhdHVzKCkge1xuICBjb25zdCBzdGF0dXMgPSBhd2FpdCBhcGlDYWxsKCdHRVQnLCAnL2FwaS9zdGF0dXMnKTtcblxuICAvLyBLZWVwIHByb3ZpZGVyL2F1dGggVUkgaW4gc3luYyB3aGVuZXZlciBzdGF0dXMgaXMgZmV0Y2hlZC5cbiAgY29uc3QgcHJvdmlkZXIgPSBzdGF0dXM/LmxsbV9wcm92aWRlciB8fCBudWxsO1xuICBpZiAocHJvdmlkZXIpIHtcbiAgICBnbG9iYWxUaGlzLmN1cnJlbnRQcm92aWRlciA9IHByb3ZpZGVyO1xuICB9XG4gIGlmICh0eXBlb2YgZ2xvYmFsVGhpcy51cGRhdGVBdXRoQmFkZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICBnbG9iYWxUaGlzLnVwZGF0ZUF1dGhCYWRnZShzdGF0dXM/LmNvcGlsb3RfYXV0aCB8fCB7fSwgcHJvdmlkZXIpO1xuICB9XG5cbiAgLy8gVXBkYXRlIHdvcmtmbG93IHN0ZXAgYmFyIChjbGlja2FibGUvY29tcGxldGVkL2FjdGl2ZSBzdGF0ZSkgb24gZXZlcnkgc3RhdHVzIGZldGNoLlxuICBpZiAodHlwZW9mIGdsb2JhbFRoaXMudXBkYXRlV29ya2Zsb3dTdGVwcyA9PT0gJ2Z1bmN0aW9uJyAmJiBzdGF0dXMgJiYgIXN0YXR1cy5fZXJyb3IpIHtcbiAgICBnbG9iYWxUaGlzLnVwZGF0ZVdvcmtmbG93U3RlcHMoc3RhdHVzKTtcbiAgfVxuXG4gIHJldHVybiBzdGF0dXM7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09XG4vLyBTZXR0aW5nc1xuLy8gPT09PT09PT09PT09PT09PT09PT1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hTZXR0aW5ncygpIHtcbiAgcmV0dXJuIGFwaUNhbGwoJ0dFVCcsICcvYXBpL3NldHRpbmdzJyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVNldHRpbmdzKHNldHRpbmdzKSB7XG4gIHJldHVybiBhcGlDYWxsKCdQVVQnLCAnL2FwaS9zZXR0aW5ncycsIHsgc2V0dGluZ3MgfSk7XG59XG5cbmV4cG9ydCB7XG4gIFN0b3JhZ2VLZXlzLFxuICBPV05FUl9UT0tFTl9LRVksXG4gIGFwaUNhbGwsXG4gIGdldFNlc3Npb25JZEZyb21VUkwsXG4gIGdldE93bmVyVG9rZW4sXG4gIGdldFNjb3BlZFRhYkRhdGFTdG9yYWdlS2V5LFxuICBzZXNzaW9uQXdhcmVGZXRjaCxcbiAgY3JlYXRlU2Vzc2lvbixcbiAgZmV0Y2hTdGF0dXMsXG4gIGZldGNoU2V0dGluZ3MsIHVwZGF0ZVNldHRpbmdzLFxufTtcblxuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvZmV0Y2gtdXRpbHMuanNcbiAqIEdsb2JhbCBmZXRjaCBpbnRlcmNlcHRvciwgNDA5LWNvbmZsaWN0IHJldHJ5IHF1ZXVlLCBMTE0gYnVzeSBvdmVybGF5LCBhbmRcbiAqIHRoZSBzZXRMb2FkaW5nIGhlbHBlciB0aGF0IGRyaXZlcyBidXR0b25zL3Byb2dyZXNzIGJhci9hYm9ydCBjb250cm9sbGVyLlxuICpcbiAqIERFUEVOREVOQ0lFUzogdWktY29yZS5qcyBleHBvcnRzICh0cmFwRm9jdXMgZXRjLikgYXZhaWxhYmxlIG9uIGdsb2JhbFRoaXMuXG4gKiAgICAgICAgICAgICAgIHNldExvYWRpbmcgY2FsbHMgX3VwZGF0ZUxMTU92ZXJsYXkgKGRlZmluZWQgaGVyZSkgYW5kXG4gKiAgICAgICAgICAgICAgIGFwcGVuZE1lc3NhZ2UgKGRlZmluZWQgaW4gbWVzc2FnZS1xdWV1ZS5qcywgb24gZ2xvYmFsVGhpcykuXG4gKi9cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyA0MDkgQ29uZmxpY3QgcmV0cnkgcXVldWVcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5jb25zdCBfY29uZmxpY3RSZXRyeVF1ZXVlID0gW107XG5sZXQgICBfY29uZmxpY3RUaW1lcklkICAgID0gbnVsbDtcbmxldCAgIF9jb25mbGljdENvdW50ZG93biAgPSAwO1xuXG4vKiogUmV0dXJuIHRydWUgaWYgdGhpcyByZXF1ZXN0IHNob3VsZCBiZSBpbnRlcmNlcHRlZCBieSB0aGUgNDA5IGhhbmRsZXIuICovXG5mdW5jdGlvbiBfc2hvdWxkSGFuZGxlQnVzeUNvbmZsaWN0KGFyZ3MpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCByYXdVcmwgPSB0eXBlb2YgYXJnc1swXSA9PT0gJ3N0cmluZycgPyBhcmdzWzBdIDogYXJnc1swXT8udXJsO1xuICAgIGlmICghcmF3VXJsKSByZXR1cm4gdHJ1ZTtcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHJhd1VybCwgd2luZG93LmxvY2F0aW9uLm9yaWdpbik7XG4gICAgcmV0dXJuIHVybC5wYXRobmFtZSAhPT0gJy9hcGkvc2Vzc2lvbnMvY2xhaW0nICYmIHVybC5wYXRobmFtZSAhPT0gJy9hcGkvc2Vzc2lvbnMvdGFrZW92ZXInO1xuICB9IGNhdGNoIChfKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBIYW5kbGUgYSA0MDkgQ29uZmxpY3QgcmVzcG9uc2U6IHNob3cgdGhlIGFtYmVyIGJhbm5lciBhbmQgYXdhaXQgdXNlciBjaG9pY2UuXG4gKiBSZXR1cm5zIGEgUHJvbWlzZTxib29sZWFuPiBcdTIwMTQgdHJ1ZSBtZWFucyBcInJldHJ5XCIsIGZhbHNlIG1lYW5zIFwiZGlzbWlzc1wiLlxuICogQ2FsbGVkIGZyb20gYXBpLWNsaWVudC5qcyBpbnNpZGUgc2Vzc2lvbkF3YXJlRmV0Y2ggc28gdGhlIGZ1bGwgZmV0Y2ggcGlwZWxpbmVcbiAqIGlzIG93bmVkIGJ5IGEgc2luZ2xlIG1vZHVsZS1sZXZlbCB3aW5kb3cuZmV0Y2ggYXNzaWdubWVudCB0aGVyZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xSZXF1ZXN0fSBpbnB1dCAtIFRoZSByZXF1ZXN0IFVSTC9vYmplY3QgKHVzZWQgZm9yIHBhdGggZmlsdGVyaW5nKS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBpbml0IC0gVGhlIGZldGNoIGluaXQgb3B0aW9ucy5cbiAqIEBwYXJhbSB7UmVzcG9uc2V9IFtyZXNwb25zZV0gLSBUaGUgNDA5IHJlc3BvbnNlICh1c2VkIHRvIGNoZWNrIGNvbmZsaWN0X3R5cGUpLlxuICovXG5hc3luYyBmdW5jdGlvbiBoYW5kbGU0MDlDb25mbGljdChpbnB1dCwgaW5pdCwgcmVzcG9uc2UpIHtcbiAgaWYgKCFfc2hvdWxkSGFuZGxlQnVzeUNvbmZsaWN0KFtpbnB1dCwgaW5pdF0pKSByZXR1cm4gZmFsc2U7XG4gIGlmIChyZXNwb25zZSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBib2R5ID0gYXdhaXQgcmVzcG9uc2UuY2xvbmUoKS5qc29uKCk7XG4gICAgICBpZiAoYm9keSAmJiBib2R5LmNvbmZsaWN0X3R5cGUgJiYgYm9keS5jb25mbGljdF90eXBlICE9PSAnc2Vzc2lvbl9vd25lcnNoaXAnKSByZXR1cm4gZmFsc2U7XG4gICAgfSBjYXRjaCAoXykgeyAvKiBub24tSlNPTiBib2R5IFx1MjAxNCBwcm9jZWVkIHRvIGJhbm5lciAqLyB9XG4gIH1cbiAgc2hvd1Nlc3Npb25Db25mbGljdEJhbm5lcigpO1xuICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBfY29uZmxpY3RSZXRyeVF1ZXVlLnB1c2gocmVzb2x2ZSkpO1xufVxuXG5mdW5jdGlvbiBzaG93U2Vzc2lvbkNvbmZsaWN0QmFubmVyKCkge1xuICBjb25zdCBiYW5uZXIgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXNzaW9uLWNvbmZsaWN0LWJhbm5lcicpO1xuICBjb25zdCBiYW5uZXJUZXh0ICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb25mbGljdC1iYW5uZXItdGV4dCcpO1xuICBjb25zdCBjb3VudGRvd25FbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb25mbGljdC1jb3VudGRvd24nKTtcbiAgaWYgKCFiYW5uZXIpIHJldHVybjtcbiAgYmFubmVyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICBpZiAoX2NvbmZsaWN0VGltZXJJZCkgeyBjbGVhckludGVydmFsKF9jb25mbGljdFRpbWVySWQpOyBfY29uZmxpY3RUaW1lcklkID0gbnVsbDsgfVxuICBfY29uZmxpY3RDb3VudGRvd24gPSAzMDtcbiAgaWYgKGJhbm5lclRleHQpICBiYW5uZXJUZXh0LnRleHRDb250ZW50ICA9ICdcdTI2QTAgQW5vdGhlciBvcGVyYXRpb24gaXMgaW4gcHJvZ3Jlc3MuIEF1dG8tcmV0cnlpbmcgaW4gJztcbiAgaWYgKGNvdW50ZG93bkVsKSBjb3VudGRvd25FbC50ZXh0Q29udGVudCA9IGAke19jb25mbGljdENvdW50ZG93bn1zXHUyMDI2YDtcbiAgX2NvbmZsaWN0VGltZXJJZCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICBfY29uZmxpY3RDb3VudGRvd24tLTtcbiAgICBpZiAoX2NvbmZsaWN0Q291bnRkb3duIDw9IDApIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwoX2NvbmZsaWN0VGltZXJJZCk7IF9jb25mbGljdFRpbWVySWQgPSBudWxsO1xuICAgICAgY29uZmxpY3RSZXRyeU5vdygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY291bnRkb3duRWwpIGNvdW50ZG93bkVsLnRleHRDb250ZW50ID0gYCR7X2NvbmZsaWN0Q291bnRkb3dufXNcdTIwMjZgO1xuICAgIH1cbiAgfSwgMTAwMCk7XG59XG5cbmZ1bmN0aW9uIGNvbmZsaWN0UmV0cnlOb3coKSB7XG4gIGlmIChfY29uZmxpY3RUaW1lcklkKSB7IGNsZWFySW50ZXJ2YWwoX2NvbmZsaWN0VGltZXJJZCk7IF9jb25mbGljdFRpbWVySWQgPSBudWxsOyB9XG4gIGNvbnN0IGJhbm5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXNzaW9uLWNvbmZsaWN0LWJhbm5lcicpO1xuICBpZiAoYmFubmVyKSBiYW5uZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgd2hpbGUgKF9jb25mbGljdFJldHJ5UXVldWUubGVuZ3RoKSBfY29uZmxpY3RSZXRyeVF1ZXVlLnNoaWZ0KCkodHJ1ZSk7XG59XG5cbmZ1bmN0aW9uIGNvbmZsaWN0RGlzbWlzcygpIHtcbiAgaWYgKF9jb25mbGljdFRpbWVySWQpIHsgY2xlYXJJbnRlcnZhbChfY29uZmxpY3RUaW1lcklkKTsgX2NvbmZsaWN0VGltZXJJZCA9IG51bGw7IH1cbiAgY29uc3QgYmFubmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Nlc3Npb24tY29uZmxpY3QtYmFubmVyJyk7XG4gIGlmIChiYW5uZXIpIGJhbm5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICB3aGlsZSAoX2NvbmZsaWN0UmV0cnlRdWV1ZS5sZW5ndGgpIF9jb25mbGljdFJldHJ5UXVldWUuc2hpZnQoKShmYWxzZSk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gTExNIGZldGNoIHdyYXBwZXIgKGF0dGFjaGVzIGFib3J0IHNpZ25hbClcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiBsbG1GZXRjaCh1cmwsIG9wdGlvbnMgPSB7fSkge1xuICBpZiAod2luZG93Ll9jdXJyZW50QWJvcnRDb250cm9sbGVyKSB7XG4gICAgb3B0aW9ucy5zaWduYWwgPSB3aW5kb3cuX2N1cnJlbnRBYm9ydENvbnRyb2xsZXIuc2lnbmFsO1xuICB9XG4gIHJldHVybiBmZXRjaCh1cmwsIG9wdGlvbnMpO1xufVxuXG5mdW5jdGlvbiBhYm9ydEN1cnJlbnRSZXF1ZXN0KCkge1xuICBpZiAod2luZG93Ll9jdXJyZW50QWJvcnRDb250cm9sbGVyKSB7XG4gICAgd2luZG93Ll9jdXJyZW50QWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gICAgd2luZG93Ll9jdXJyZW50QWJvcnRDb250cm9sbGVyID0gbnVsbDtcbiAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICBpZiAodHlwZW9mIGFwcGVuZE1lc3NhZ2UgPT09ICdmdW5jdGlvbicpIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsICdcdTIzRjkgUmVxdWVzdCBzdG9wcGVkLicpO1xuICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gTExNIGJ1c3kgb3ZlcmxheVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmxldCBfbGxtRWxhcHNlZFRpbWVyID0gbnVsbDtcbmxldCBfbGxtU3RhcnRUaW1lICAgID0gbnVsbDtcblxuZnVuY3Rpb24gX3VwZGF0ZUxMTU92ZXJsYXkobG9hZGluZywgbGFiZWwpIHtcbiAgY29uc3Qgb3ZlcmxheSAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtLWJ1c3ktb3ZlcmxheScpO1xuICBjb25zdCBsYWJlbEVsICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG0tYnVzeS1sYWJlbCcpO1xuICBjb25zdCBlbGFwc2VkICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG0tYnVzeS1lbGFwc2VkJyk7XG4gIGlmICghb3ZlcmxheSkgcmV0dXJuO1xuXG4gIGlmIChsb2FkaW5nKSB7XG4gICAgb3ZlcmxheS5jbGFzc0xpc3QuYWRkKCd2aXNpYmxlJyk7XG4gICAgb3ZlcmxheS5jbGFzc0xpc3QucmVtb3ZlKCdzbG93Jyk7XG4gICAgaWYgKGxhYmVsRWwpIGxhYmVsRWwudGV4dENvbnRlbnQgPSBsYWJlbCB8fCAnUmVhc29uaW5nXHUyMDI2JztcbiAgICBpZiAoZWxhcHNlZCkgIGVsYXBzZWQudGV4dENvbnRlbnQgPSAnMDowMCc7XG5cbiAgICBfbGxtU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBjbGVhckludGVydmFsKF9sbG1FbGFwc2VkVGltZXIpO1xuICAgIF9sbG1FbGFwc2VkVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICBjb25zdCBzZWNzID0gTWF0aC5mbG9vcigoRGF0ZS5ub3coKSAtIF9sbG1TdGFydFRpbWUpIC8gMTAwMCk7XG4gICAgICBjb25zdCBtbSA9IFN0cmluZyhNYXRoLmZsb29yKHNlY3MgLyA2MCkpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgICBjb25zdCBzcyA9IFN0cmluZyhzZWNzICUgNjApLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgICBpZiAoZWxhcHNlZCkgZWxhcHNlZC50ZXh0Q29udGVudCA9IGAke21tfToke3NzfWA7XG4gICAgICBpZiAoc2VjcyA+PSAzMCAmJiAhb3ZlcmxheS5jbGFzc0xpc3QuY29udGFpbnMoJ3Nsb3cnKSkge1xuICAgICAgICBvdmVybGF5LmNsYXNzTGlzdC5hZGQoJ3Nsb3cnKTtcbiAgICAgIH1cbiAgICB9LCAxMDAwKTtcbiAgfSBlbHNlIHtcbiAgICBjbGVhckludGVydmFsKF9sbG1FbGFwc2VkVGltZXIpO1xuICAgIF9sbG1FbGFwc2VkVGltZXIgPSBudWxsO1xuICAgIF9sbG1TdGFydFRpbWUgICAgPSBudWxsO1xuICAgIG92ZXJsYXkuY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZScsICdzbG93Jyk7XG4gICAgaWYgKGxhYmVsRWwpIGxhYmVsRWwudGV4dENvbnRlbnQgPSAnUmVhc29uaW5nXHUyMDI2JztcbiAgICBpZiAoZWxhcHNlZCkgIGVsYXBzZWQudGV4dENvbnRlbnQgPSAnMDowMCc7XG4gICAgX3JlZnJlc2hDb250ZXh0U3RhdHMoKTtcbiAgfVxufVxuXG4vLyBCYWNrd2FyZCBjb21wYXRpYmlsaXR5IGZvciB0ZXN0cy9pbXBvcnRzIHRoYXQgc3RpbGwgcmVmZXJlbmNlIHRoZSBvbGQgbmFtZS5cbmZ1bmN0aW9uIF91cGRhdGVMTE1TdGF0dXNCYXIobG9hZGluZywgbGFiZWwpIHtcbiAgX3VwZGF0ZUxMTU92ZXJsYXkobG9hZGluZywgbGFiZWwpO1xuXG4gIGNvbnN0IGJhciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG0tc3RhdHVzLWJhcicpO1xuICBjb25zdCB0aGlua2luZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG0tdGhpbmtpbmcnKTtcbiAgY29uc3Qgc3RlcExhYmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbS1zdGVwLWxhYmVsJyk7XG4gIGNvbnN0IGFib3J0QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbS1hYm9ydC1idG4nKTtcbiAgaWYgKCFiYXIpIHJldHVybjtcblxuICBpZiAobG9hZGluZykge1xuICAgIGJhci5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICAgIGlmICh0aGlua2luZykgdGhpbmtpbmcuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICBpZiAoc3RlcExhYmVsKSBzdGVwTGFiZWwudGV4dENvbnRlbnQgPSBsYWJlbCB8fCAnUmVhc29uaW5nXHUyMDI2JztcbiAgICBpZiAoYWJvcnRCdG4pIHtcbiAgICAgIGFib3J0QnRuLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIGFib3J0QnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmICh0aGlua2luZykgdGhpbmtpbmcuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBpZiAoYWJvcnRCdG4pIGFib3J0QnRuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgYmFyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gX3JlZnJlc2hDb250ZXh0U3RhdHMoKSB7XG4gIGNvbnN0IHRva2VuRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtLXRva2VuLWNvdW50Jyk7XG4gIGlmICghdG9rZW5FbCkgcmV0dXJuO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9jb250ZXh0LXN0YXRzJyk7XG4gICAgaWYgKCFyZXMub2spIHJldHVybjtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoIWRhdGEub2spIHJldHVybjtcbiAgICBjb25zdCBlc3QgICAgPSBkYXRhLmVzdGltYXRlZF90b2tlbnMgfHwgMDtcbiAgICBjb25zdCB3aW4gICAgPSBkYXRhLmNvbnRleHRfd2luZG93ICAgfHwgMTI4XzAwMDtcbiAgICBjb25zdCBleGFjdCAgPSBkYXRhLnRva2VuX3NvdXJjZSA9PT0gJ2V4YWN0JztcbiAgICBjb25zdCBwY3QgICAgPSBNYXRoLnJvdW5kKChlc3QgLyB3aW4pICogMTAwKTtcbiAgICBjb25zdCBlc3RTdHIgPSBlc3QgPj0gMTAwMCA/IGAkeyhlc3QgLyAxMDAwKS50b0ZpeGVkKDEpfUtgIDogYCR7ZXN0fWA7XG4gICAgY29uc3Qgd2luU3RyID0gd2luID49IDEwMDAgPyBgJHtNYXRoLnJvdW5kKHdpbiAvIDEwMDApfUtgICA6IGAke3dpbn1gO1xuICAgIHRva2VuRWwudGV4dENvbnRlbnQgPSBgJHtleGFjdCA/ICcnIDogJ34nfSR7ZXN0U3RyfSAvICR7d2luU3RyfSAoJHtwY3R9JSlgO1xuICB9IGNhdGNoIChfKSB7IC8qIHNpbGVudGx5IGlnbm9yZSAqLyB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gTG9hZGluZyBzdGF0ZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIHNldExvYWRpbmcobG9hZGluZywgbGFiZWwpIHtcbiAgaWYgKHR5cGVvZiBzdGF0ZU1hbmFnZXIgIT09ICd1bmRlZmluZWQnICYmIHN0YXRlTWFuYWdlcj8uc2V0TG9hZGluZykge1xuICAgIHN0YXRlTWFuYWdlci5zZXRMb2FkaW5nKGxvYWRpbmcpO1xuICB9XG5cbiAgaWYgKGxvYWRpbmcpIHtcbiAgICB3aW5kb3cuX2N1cnJlbnRBYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgLy8gRXhwYW5kIGNoYXQgcGFuZWwgaWYgY29sbGFwc2VkXG4gICAgY29uc3QgY2hhdEFyZWEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2hhdC1hcmVhJyk7XG4gICAgY29uc3Qgdmlld2VyQXJlYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2aWV3ZXItYXJlYScpO1xuICAgIGNvbnN0IHRvZ2dsZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2dnbGUtY2hhdCcpO1xuICAgIGlmIChjaGF0QXJlYT8uY2xhc3NMaXN0LmNvbnRhaW5zKCdjb2xsYXBzZWQnKSkge1xuICAgICAgY2hhdEFyZWEuY2xhc3NMaXN0LnJlbW92ZSgnY29sbGFwc2VkJyk7XG4gICAgICB2aWV3ZXJBcmVhPy5jbGFzc0xpc3QucmVtb3ZlKCdleHBhbmRlZCcpO1xuICAgICAgaWYgKHRvZ2dsZUJ0bikgdG9nZ2xlQnRuLnRleHRDb250ZW50ID0gJ1x1MjVDMCc7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHdpbmRvdy5fY3VycmVudEFib3J0Q29udHJvbGxlciA9IG51bGw7XG4gIH1cblxuICBfdXBkYXRlTExNU3RhdHVzQmFyKGxvYWRpbmcsIGxhYmVsKTtcblxuICAvLyBPbmx5IGRpc2FibGUgYnV0dG9ucyBpbnNpZGUgdGhlIGNoYXQvaW50ZXJhY3Rpb24gYXJlYSBcdTIwMTQgbm90IHRoZSB3aG9sZSBwYWdlLlxuICBjb25zdCBjaGF0QXJlYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaGF0LWFyZWEnKTtcbiAgY29uc3Qgc2NvcGUgPSBjaGF0QXJlYSB8fCBkb2N1bWVudDtcbiAgc2NvcGUucXVlcnlTZWxlY3RvckFsbCgnYnV0dG9uJykuZm9yRWFjaChidG4gPT4geyBidG4uZGlzYWJsZWQgPSBsb2FkaW5nOyB9KTtcbiAgY29uc3Qgc3RvcEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG0tYnVzeS1zdG9wJyk7XG4gIGlmIChzdG9wQnRuKSBzdG9wQnRuLmRpc2FibGVkID0gZmFsc2U7XG5cbiAgbGV0IGJhciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2FkaW5nLXByb2dyZXNzLWJhcicpO1xuICBpZiAobG9hZGluZykge1xuICAgIGlmICghYmFyKSB7XG4gICAgICBiYXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGJhci5pZCA9ICdsb2FkaW5nLXByb2dyZXNzLWJhcic7XG4gICAgICBkb2N1bWVudC5ib2R5LnByZXBlbmQoYmFyKTtcbiAgICB9XG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHsgYmFyLnN0eWxlLndpZHRoID0gJzcwJSc7IH0pO1xuICAgIGlmIChsYWJlbCkgYmFyLnRpdGxlID0gbGFiZWw7XG4gIH0gZWxzZSB7XG4gICAgaWYgKGJhcikge1xuICAgICAgYmFyLnN0eWxlLndpZHRoID0gJzEwMCUnO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiBiYXIucmVtb3ZlKCksIDQwMCk7XG4gICAgfVxuICB9XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnN0ZXAuYWN0aXZlJykuZm9yRWFjaChlbCA9PiB7XG4gICAgZWwuY2xhc3NMaXN0LnRvZ2dsZSgnbG9hZGluZy1zdGVwJywgbG9hZGluZyk7XG4gIH0pO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgRVMgbW9kdWxlIGV4cG9ydHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5leHBvcnQge1xuICBoYW5kbGU0MDlDb25mbGljdCxcbiAgc2hvd1Nlc3Npb25Db25mbGljdEJhbm5lciwgY29uZmxpY3RSZXRyeU5vdywgY29uZmxpY3REaXNtaXNzLFxuICBsbG1GZXRjaCwgYWJvcnRDdXJyZW50UmVxdWVzdCxcbiAgX3VwZGF0ZUxMTVN0YXR1c0JhcixcbiAgX3VwZGF0ZUxMTU92ZXJsYXksIF9yZWZyZXNoQ29udGV4dFN0YXRzLFxuICBzZXRMb2FkaW5nLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogc3RhdGUtbWFuYWdlci5qc1xuICogTWFuYWdlcyBzZXNzaW9uIHN0YXRlLCBsb2NhbFN0b3JhZ2UgcGVyc2lzdGVuY2UsIGFuZCBzdGF0ZSBpbml0aWFsaXphdGlvbi5cbiAqIENlbnRyYWxpemVzIGFsbCBzdGF0ZSBtYW5hZ2VtZW50IGxvZ2ljIChjdXJyZW50VGFiLCBpbnRlcmFjdGl2ZVN0YXRlLCBzZXNzaW9uSWQsIGV0Yy4pXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdzdGF0ZS1tYW5hZ2VyJyk7XG5cbmltcG9ydCB7IFN0b3JhZ2VLZXlzIH0gZnJvbSAnLi9hcGktY2xpZW50LmpzJztcblxuLyoqXG4gKiBNaXJyb3Igb2YgdGhlIFB5dGhvbiBQaGFzZSBlbnVtIGluIHNjcmlwdHMvdXRpbHMvY29udmVyc2F0aW9uX21hbmFnZXIucHkuXG4gKiBQeXRob24gaXMgdGhlIFNPVVJDRSBPRiBUUlVUSCBcdTIwMTQgdXBkYXRlIGJvdGggZmlsZXMgdG9nZXRoZXIgd2hlbmV2ZXIgYWRkaW5nXG4gKiBvciByZW5hbWluZyBhIHBoYXNlLlxuICovXG5jb25zdCBQSEFTRVMgPSB7XG4gIElOSVQ6ICAgICAgICAgICAgICdpbml0JyxcbiAgSk9CX0FOQUxZU0lTOiAgICAgJ2pvYl9hbmFseXNpcycsXG4gIENVU1RPTUlaQVRJT046ICAgICdjdXN0b21pemF0aW9uJyxcbiAgUkVXUklURV9SRVZJRVc6ICAgJ3Jld3JpdGVfcmV2aWV3JyxcbiAgU1BFTExfQ0hFQ0s6ICAgICAgJ3NwZWxsX2NoZWNrJyxcbiAgR0VORVJBVElPTjogICAgICAgJ2dlbmVyYXRpb24nLFxuICBMQVlPVVRfUkVWSUVXOiAgICAnbGF5b3V0X3JldmlldycsXG4gIEZJTkFMX0dFTkVSQVRJT046ICdmaW5hbF9nZW5lcmF0aW9uJyxcbiAgUkVGSU5FTUVOVDogICAgICAgJ3JlZmluZW1lbnQnLFxufTtcblxuY29uc3QgUEhBU0VfVE9fU1RFUCA9IHtcbiAgW1BIQVNFUy5JTklUXTogICAgICAgICAgICAgJ2pvYicsXG4gIFtQSEFTRVMuSk9CX0FOQUxZU0lTXTogICAgICdhbmFseXNpcycsXG4gIFtQSEFTRVMuQ1VTVE9NSVpBVElPTl06ICAgICdjdXN0b21pemF0aW9ucycsXG4gIFtQSEFTRVMuUkVXUklURV9SRVZJRVddOiAgICdyZXdyaXRlJyxcbiAgW1BIQVNFUy5TUEVMTF9DSEVDS106ICAgICAgJ3NwZWxsJyxcbiAgW1BIQVNFUy5HRU5FUkFUSU9OXTogICAgICAgJ2xheW91dCcsXG4gIFtQSEFTRVMuTEFZT1VUX1JFVklFV106ICAgICdsYXlvdXQnLFxuICBbUEhBU0VTLkZJTkFMX0dFTkVSQVRJT05dOiAnZG93bmxvYWQnLFxuICBbUEhBU0VTLlJFRklORU1FTlRdOiAgICAgICAnZG93bmxvYWQnLFxufTtcblxuZnVuY3Rpb24gZ2V0V29ya2Zsb3dTdGVwRm9yUGhhc2UocGhhc2UpIHtcbiAgcmV0dXJuIFBIQVNFX1RPX1NURVBbcGhhc2VdIHx8ICdqb2InO1xufVxuXG4vKipcbiAqIFN0YWdlZCBnZW5lcmF0aW9uIHdvcmtmbG93IHBoYXNlcyAoR0FQLTIwIGltcGxlbWVudGF0aW9uKS5cbiAqIFRoZXNlIHRyYWNrIHRoZSBwcmV2aWV3L2xheW91dCByZXZpZXcgXHUyMTkyIGNvbmZpcm1lZCBcdTIxOTIgZmluYWwgcGlwZWxpbmVcbiAqIGluZGVwZW5kZW50bHkgb2YgdGhlIG1haW4gY29udmVyc2F0aW9uIFBIQVNFUyBhYm92ZS5cbiAqIEJhY2tlbmQgc291cmNlIG9mIHRydXRoIGlzIHNlc3Npb25fZGF0YVsnZ2VuZXJhdGlvbl9zdGF0ZSddWydwaGFzZSddLlxuICovXG5jb25zdCBHRU5FUkFUSU9OX1BIQVNFUyA9IHtcbiAgSURMRTogICAgICAgICAgICdpZGxlJyxcbiAgTEFZT1VUX1JFVklFVzogICdsYXlvdXRfcmV2aWV3JyxcbiAgQ09ORklSTUVEOiAgICAgICdjb25maXJtZWQnLFxuICBGSU5BTF9DT01QTEVURTogJ2ZpbmFsX2NvbXBsZXRlJyxcbn07XG5cbmNvbnN0IEdFTkVSQVRJT05fU1RBVEVfRVZFTlQgPSAnY3ZidWlsZGVyOmdlbmVyYXRpb24tc3RhdGUtY2hhbmdlZCc7XG5cbmZ1bmN0aW9uIGNyZWF0ZURlZmF1bHRHZW5lcmF0aW9uU3RhdGUoKSB7XG4gIHJldHVybiB7XG4gICAgcGhhc2U6IEdFTkVSQVRJT05fUEhBU0VTLklETEUsXG4gICAgcHJldmlld0F2YWlsYWJsZTogZmFsc2UsXG4gICAgcHJldmlld091dHB1dHM6IG51bGwsXG4gICAgbGF5b3V0Q29uZmlybWVkOiBmYWxzZSxcbiAgICBwYWdlQ291bnRFc3RpbWF0ZTogbnVsbCxcbiAgICBwYWdlQ291bnRFeGFjdDogbnVsbCxcbiAgICBwYWdlQ291bnRDb25maWRlbmNlOiBudWxsLFxuICAgIHBhZ2VDb3VudFNvdXJjZTogbnVsbCxcbiAgICBwYWdlTmVlZHNFeGFjdFJlY2hlY2s6IGZhbHNlLFxuICAgIHBhZ2VXYXJuaW5nOiBmYWxzZSxcbiAgICBsYXlvdXRJbnN0cnVjdGlvbnNDb3VudDogMCxcbiAgICBmaW5hbEdlbmVyYXRlZEF0OiBudWxsLFxuICAgIHByZXZpZXdHZW5lcmF0ZWRBdDogbnVsbCxcbiAgICBwcmV2aWV3UmVxdWVzdElkOiBudWxsLFxuICAgIGNvbmZpcm1lZEF0OiBudWxsLFxuICAgIGNvbnRlbnRSZXZpc2lvbjogMCxcbiAgICBsYXN0UHJldmlld0NvbnRlbnRSZXZpc2lvbjogbnVsbCxcbiAgICBsYXN0RmluYWxDb250ZW50UmV2aXNpb246IG51bGwsXG4gICAgZGlydHlQaGFzZXM6IFtdLFxuICAgIGVhcmxpZXN0RGlydHlTdGVwOiBudWxsLFxuICB9O1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVSZXZpc2lvbih2YWx1ZSkge1xuICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHZhbHVlKSA/IHZhbHVlIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0TGFzdFJlbmRlcmVkQ29udGVudFJldmlzaW9uKHN0YXRlKSB7XG4gIGNvbnN0IHJldmlzaW9ucyA9IFtcbiAgICBub3JtYWxpemVSZXZpc2lvbihzdGF0ZS5sYXN0UHJldmlld0NvbnRlbnRSZXZpc2lvbiksXG4gICAgbm9ybWFsaXplUmV2aXNpb24oc3RhdGUubGFzdEZpbmFsQ29udGVudFJldmlzaW9uKSxcbiAgXS5maWx0ZXIodmFsdWUgPT4gdmFsdWUgIT09IG51bGwpO1xuICByZXR1cm4gcmV2aXNpb25zLmxlbmd0aCA+IDAgPyBNYXRoLm1heCguLi5yZXZpc2lvbnMpIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVTZXNzaW9uSWQoKSB7XG4gIGNvbnN0IGNyeXB0b0FwaSA9IGdsb2JhbFRoaXMuY3J5cHRvO1xuICBpZiAoY3J5cHRvQXBpPy5yYW5kb21VVUlEKSB7XG4gICAgcmV0dXJuIGBzZXNzaW9uLSR7Y3J5cHRvQXBpLnJhbmRvbVVVSUQoKX1gO1xuICB9XG5cbiAgaWYgKGNyeXB0b0FwaT8uZ2V0UmFuZG9tVmFsdWVzKSB7XG4gICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheSgxNik7XG4gICAgY3J5cHRvQXBpLmdldFJhbmRvbVZhbHVlcyhieXRlcyk7XG4gICAgY29uc3QgdG9rZW4gPSBBcnJheS5mcm9tKGJ5dGVzLCBieXRlID0+IGJ5dGUudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJykpLmpvaW4oJycpO1xuICAgIHJldHVybiBgc2Vzc2lvbi0ke3Rva2VufWA7XG4gIH1cblxuICBsb2cud2FybignV2ViIENyeXB0byBBUEkgdW5hdmFpbGFibGU7IGZhbGxpbmcgYmFjayB0byB0aW1lc3RhbXAtcGx1cy1yYW5kb20gc2Vzc2lvbiBpZCBnZW5lcmF0aW9uLicpO1xuICByZXR1cm4gYHNlc3Npb24tJHtEYXRlLm5vdygpLnRvU3RyaW5nKDM2KX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCAxMSl9YDtcbn1cblxuZnVuY3Rpb24gZ2V0TGF5b3V0RnJlc2huZXNzRnJvbVN0YXRlKHN0YXRlKSB7XG4gIGNvbnN0IHByZXZpZXdBdmFpbGFibGUgPSBCb29sZWFuKHN0YXRlLnByZXZpZXdBdmFpbGFibGUpO1xuICBjb25zdCBoYXNGaW5hbE91dHB1dHMgPSBCb29sZWFuKFxuICAgIHN0YXRlLmZpbmFsR2VuZXJhdGVkQXRcbiAgICAgIHx8IHN0YXRlLnBoYXNlID09PSBHRU5FUkFUSU9OX1BIQVNFUy5GSU5BTF9DT01QTEVURVxuICAgICAgfHwgbm9ybWFsaXplUmV2aXNpb24oc3RhdGUubGFzdEZpbmFsQ29udGVudFJldmlzaW9uKSAhPT0gbnVsbFxuICApO1xuXG4gIGlmICghcHJldmlld0F2YWlsYWJsZSkge1xuICAgIHJldHVybiB7XG4gICAgICBzaG93Q2hpcDogZmFsc2UsXG4gICAgICBpc1N0YWxlOiBmYWxzZSxcbiAgICAgIGlzQ3JpdGljYWw6IGZhbHNlLFxuICAgICAgaGFzRmluYWxPdXRwdXRzLFxuICAgICAgbGFiZWw6ICcnLFxuICAgICAgYXJpYUxhYmVsOiAnJyxcbiAgICAgIHRvbmU6ICdoaWRkZW4nLFxuICAgIH07XG4gIH1cblxuICBjb25zdCBjb250ZW50UmV2aXNpb24gPSBub3JtYWxpemVSZXZpc2lvbihzdGF0ZS5jb250ZW50UmV2aXNpb24pID8/IDA7XG4gIGNvbnN0IGxhc3RSZW5kZXJlZFJldmlzaW9uID0gZ2V0TGFzdFJlbmRlcmVkQ29udGVudFJldmlzaW9uKHN0YXRlKTtcbiAgY29uc3QgaXNTdGFsZSA9IGxhc3RSZW5kZXJlZFJldmlzaW9uICE9PSBudWxsICYmIGNvbnRlbnRSZXZpc2lvbiA+IGxhc3RSZW5kZXJlZFJldmlzaW9uO1xuICBjb25zdCBpc0NyaXRpY2FsID0gaXNTdGFsZSAmJiBoYXNGaW5hbE91dHB1dHM7XG5cbiAgaWYgKGlzQ3JpdGljYWwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2hvd0NoaXA6IHRydWUsXG4gICAgICBpc1N0YWxlLFxuICAgICAgaXNDcml0aWNhbCxcbiAgICAgIGhhc0ZpbmFsT3V0cHV0cyxcbiAgICAgIGxhYmVsOiAnRmlsZXMgb3V0ZGF0ZWQnLFxuICAgICAgYXJpYUxhYmVsOiAnRmlsZXMgb3V0ZGF0ZWQuIEFjdGl2YXRlIHRvIHJldmlldyBsYXlvdXQgYW5kIHJlZ2VuZXJhdGUgb3V0cHV0cy4nLFxuICAgICAgdG9uZTogJ2NyaXRpY2FsJyxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGlzU3RhbGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2hvd0NoaXA6IHRydWUsXG4gICAgICBpc1N0YWxlLFxuICAgICAgaXNDcml0aWNhbCxcbiAgICAgIGhhc0ZpbmFsT3V0cHV0cyxcbiAgICAgIGxhYmVsOiAnTGF5b3V0IG91dGRhdGVkJyxcbiAgICAgIGFyaWFMYWJlbDogJ0xheW91dCBvdXRkYXRlZC4gQWN0aXZhdGUgdG8gcmV2aWV3IGFuZCByZWdlbmVyYXRlIHByZXZpZXcuJyxcbiAgICAgIHRvbmU6ICdzdGFsZScsXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc2hvd0NoaXA6IHRydWUsXG4gICAgaXNTdGFsZSxcbiAgICBpc0NyaXRpY2FsLFxuICAgIGhhc0ZpbmFsT3V0cHV0cyxcbiAgICBsYWJlbDogJ0xheW91dCBjdXJyZW50JyxcbiAgICBhcmlhTGFiZWw6ICdMYXlvdXQgY3VycmVudC4gUHJldmlldyBtYXRjaGVzIGxhdGVzdCBjb250ZW50LicsXG4gICAgdG9uZTogJ2ZyZXNoJyxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZW1pdEdlbmVyYXRpb25TdGF0ZUNoYW5nZWQoKSB7XG4gIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2Ygd2luZG93LmRpc3BhdGNoRXZlbnQgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KEdFTkVSQVRJT05fU1RBVEVfRVZFTlQsIHtcbiAgICBkZXRhaWw6IHtcbiAgICAgIGdlbmVyYXRpb25TdGF0ZTogeyAuLi5nZW5lcmF0aW9uU3RhdGUgfSxcbiAgICAgIGxheW91dEZyZXNobmVzczogZ2V0TGF5b3V0RnJlc2huZXNzRnJvbVN0YXRlKGdlbmVyYXRpb25TdGF0ZSksXG4gICAgfSxcbiAgfSkpO1xufVxuXG4vLyBHbG9iYWwgc3RhdGUgdmFyaWFibGVzIChtb3ZlZCBpbnRvIG1vZHVsZSBmb3IgY2xhcml0eSlcbmxldCBjdXJyZW50VGFiID0gJ2pvYic7XG5sZXQgaXNMb2FkaW5nID0gZmFsc2U7XG5sZXQgdGFiRGF0YSA9IHtcbiAgYW5hbHlzaXM6IG51bGwsXG4gIGN1c3RvbWl6YXRpb25zOiBudWxsLFxuICBjdjogbnVsbFxufTtcbmxldCBpbnRlcmFjdGl2ZVN0YXRlID0ge1xuICBpc1Jldmlld2luZzogZmFsc2UsXG4gIGN1cnJlbnRJbmRleDogMCxcbiAgdHlwZTogbnVsbCwgLy8gJ2V4cGVyaWVuY2VzJyBvciAnc2tpbGxzJ1xuICBkYXRhOiBudWxsXG59O1xubGV0IHNlc3Npb25JZCA9IG51bGw7XG5sZXQgbGFzdEtub3duUGhhc2UgPSBQSEFTRVMuSU5JVDtcbmxldCBpc1JlY29ubmVjdGluZyA9IGZhbHNlO1xuY29uc3QgX3BoYXNlQ2hhbmdlTGlzdGVuZXJzID0gW107XG4vLyBDdXJyZW50IG1vZGVsL3Byb3ZpZGVyIHNlbGVjdGlvbiAocGVyc2lzdGVkIHRvIGxvY2FsU3RvcmFnZSlcbmxldCBjdXJyZW50TW9kZWxQcm92aWRlciA9IG51bGw7XG5sZXQgY3VycmVudE1vZGVsTmFtZSA9IG51bGw7XG5cblxuLy8gU3RhZ2VkIGdlbmVyYXRpb24gc3RhdGUgKEdBUC0yMCk6IHRyYWNrcyBwcmV2aWV3IFx1MjE5MiBjb25maXJtIFx1MjE5MiBmaW5hbCBwaXBlbGluZS5cbi8vIFN5bmNlZCBmcm9tIC9hcGkvY3YvZ2VuZXJhdGlvbi1zdGF0ZSBvbiBwYWdlIGxvYWQgYW5kIGFmdGVyIGtleSB0cmFuc2l0aW9ucy5cbmxldCBnZW5lcmF0aW9uU3RhdGUgPSBjcmVhdGVEZWZhdWx0R2VuZXJhdGlvblN0YXRlKCk7XG5cbi8vIEFUUyBzY29yZSBzdGF0ZSAoR0FQLTIxKTogY2FjaGVkIHNjb3JlIGZyb20gL2FwaS9jdi9hdHMtc2NvcmUuXG4vLyBOdWxsIHVudGlsIGZpcnN0IHNjb3JlIGlzIGZldGNoZWQuXG5sZXQgYXRzU2NvcmUgPSBudWxsO1xuXG4vLyBFeHBvcnQgc3RhdGUgZ2V0dGVycy9zZXR0ZXJzXG5jb25zdCBzdGF0ZU1hbmFnZXIgPSB7XG4gIC8vIFRhYiBzdGF0ZVxuICBnZXRDdXJyZW50VGFiOiAoKSA9PiBjdXJyZW50VGFiLFxuICBzZXRDdXJyZW50VGFiOiAodGFiKSA9PiB7IGN1cnJlbnRUYWIgPSB0YWI7IHNhdmVTdGF0ZVRvTG9jYWxTdG9yYWdlKCk7IH0sXG4gIGdldEN1cnJlbnRTdGFnZTogKCkgPT4gZ2V0V29ya2Zsb3dTdGVwRm9yUGhhc2UobGFzdEtub3duUGhhc2UpLFxuXG4gIC8vIExvYWRpbmcgc3RhdGVcbiAgaXNMb2FkaW5nOiAoKSA9PiBpc0xvYWRpbmcsXG4gIHNldExvYWRpbmc6IChsb2FkaW5nKSA9PiB7XG4gICAgaXNMb2FkaW5nID0gbG9hZGluZztcbiAgfSxcblxuICAvLyBUYWIgZGF0YSAoYW5hbHlzaXMsIGN1c3RvbWl6YXRpb25zLCBDVilcbiAgZ2V0VGFiRGF0YTogKHRhYikgPT4gdGFiRGF0YVt0YWJdLFxuICBnZXRBbGxUYWJEYXRhOiAoKSA9PiAoeyAuLi50YWJEYXRhIH0pLFxuICBzZXRUYWJEYXRhOiAodGFiLCBkYXRhKSA9PiB7IHRhYkRhdGFbdGFiXSA9IGRhdGE7IHNhdmVTdGF0ZVRvTG9jYWxTdG9yYWdlKCk7IH0sXG5cbiAgLy8gSW50ZXJhY3RpdmUgc3RhdGUgKGZvciBleHBlcmllbmNlL3NraWxsIHNlbGVjdGlvbiByZXZpZXcpXG4gIGdldEludGVyYWN0aXZlU3RhdGU6ICgpID0+IGludGVyYWN0aXZlU3RhdGUsXG4gIHNldEludGVyYWN0aXZlU3RhdGU6IChzdGF0ZSkgPT4geyBpbnRlcmFjdGl2ZVN0YXRlID0geyAuLi5pbnRlcmFjdGl2ZVN0YXRlLCAuLi5zdGF0ZSB9OyBzYXZlU3RhdGVUb0xvY2FsU3RvcmFnZSgpOyB9LFxuXG4gIC8vIFJlY29ubmVjdCBzdGF0ZVxuICBpc1JlY29ubmVjdGluZzogKCkgPT4gaXNSZWNvbm5lY3RpbmcsXG4gIHNldElzUmVjb25uZWN0aW5nOiAocmVjb25uZWN0aW5nKSA9PiB7IGlzUmVjb25uZWN0aW5nID0gQm9vbGVhbihyZWNvbm5lY3RpbmcpOyB9LFxuXG4gIC8vIFNlc3Npb24gbWFuYWdlbWVudFxuICBnZXRTZXNzaW9uSWQ6ICgpID0+IHNlc3Npb25JZCxcbiAgc2V0U2Vzc2lvbklkOiAoaWQpID0+IHsgc2Vzc2lvbklkID0gaWQ7IGxvY2FsU3RvcmFnZS5zZXRJdGVtKFN0b3JhZ2VLZXlzLlNFU1NJT05fSUQsIGlkKTsgfSxcblxuICAvLyBNb2RlbC9wcm92aWRlciBzZWxlY3Rpb25cbiAgZ2V0Q3VycmVudE1vZGVsUHJvdmlkZXI6ICgpID0+IGN1cnJlbnRNb2RlbFByb3ZpZGVyLFxuICBnZXRDdXJyZW50TW9kZWxOYW1lOiAoKSA9PiBjdXJyZW50TW9kZWxOYW1lLFxuICBzZXRDdXJyZW50TW9kZWw6IChwcm92aWRlciwgbW9kZWwpID0+IHsgY3VycmVudE1vZGVsUHJvdmlkZXIgPSBwcm92aWRlciB8fCBudWxsOyBjdXJyZW50TW9kZWxOYW1lID0gbW9kZWwgfHwgbnVsbDsgc2F2ZVN0YXRlVG9Mb2NhbFN0b3JhZ2UoKTsgfSxcblxuICAvLyBQaGFzZSB0cmFja2luZ1xuICBnZXRQaGFzZTogKCkgPT4gbGFzdEtub3duUGhhc2UsXG4gIHNldFBoYXNlOiAocGhhc2UpID0+IHtcbiAgICBsYXN0S25vd25QaGFzZSA9IHBoYXNlO1xuICAgIHNhdmVTdGF0ZVRvTG9jYWxTdG9yYWdlKCk7XG4gICAgX3BoYXNlQ2hhbmdlTGlzdGVuZXJzLmZvckVhY2goZm4gPT4geyB0cnkgeyBmbihwaGFzZSk7IH0gY2F0Y2ggKGUpIHsgLyogaWdub3JlICovIH0gfSk7XG4gIH0sXG4gIG9uUGhhc2VDaGFuZ2U6IChmbikgPT4geyBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSBfcGhhc2VDaGFuZ2VMaXN0ZW5lcnMucHVzaChmbik7IH0sXG4gIGdldFdvcmtmbG93U3RlcDogKCkgPT4gZ2V0V29ya2Zsb3dTdGVwRm9yUGhhc2UobGFzdEtub3duUGhhc2UpLFxuXG4gIC8vIFBvc3QtYW5hbHlzaXMgcXVlc3Rpb25zXG4gIGdldFBvc3RBbmFseXNpc1F1ZXN0aW9uczogKCkgPT4gd2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucyB8fCBbXSxcbiAgc2V0UG9zdEFuYWx5c2lzUXVlc3Rpb25zOiAocXVlc3Rpb25zKSA9PiB7IHdpbmRvdy5wb3N0QW5hbHlzaXNRdWVzdGlvbnMgPSBxdWVzdGlvbnM7IH0sXG5cbiAgLy8gUXVlc3Rpb24gYW5zd2Vyc1xuICBnZXRRdWVzdGlvbkFuc3dlcnM6ICgpID0+IHdpbmRvdy5xdWVzdGlvbkFuc3dlcnMgfHwge30sXG4gIHNldFF1ZXN0aW9uQW5zd2VyczogKGFuc3dlcnMpID0+IHsgd2luZG93LnF1ZXN0aW9uQW5zd2VycyA9IGFuc3dlcnM7IH0sXG5cbiAgLy8gUGVuZGluZyByZWNvbW1lbmRhdGlvbnNcbiAgZ2V0UGVuZGluZ1JlY29tbWVuZGF0aW9uczogKCkgPT4gd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnMgfHwgbnVsbCxcbiAgc2V0UGVuZGluZ1JlY29tbWVuZGF0aW9uczogKHJlYykgPT4geyB3aW5kb3cucGVuZGluZ1JlY29tbWVuZGF0aW9ucyA9IHJlYzsgc2F2ZVN0YXRlVG9Mb2NhbFN0b3JhZ2UoKTsgfSxcblxuICAvLyBBVFMgc2NvcmUgc3RhdGUgKEdBUC0yMSlcbiAgZ2V0QXRzU2NvcmU6ICgpID0+IGF0c1Njb3JlLFxuICBzZXRBdHNTY29yZTogKHNjb3JlKSA9PiB7IGF0c1Njb3JlID0gc2NvcmU7IHNhdmVTdGF0ZVRvTG9jYWxTdG9yYWdlKCk7IH0sXG4gIGNsZWFyQXRzU2NvcmU6ICgpID0+IHsgYXRzU2NvcmUgPSBudWxsOyBzYXZlU3RhdGVUb0xvY2FsU3RvcmFnZSgpOyB9LFxuXG4gIC8vIFN0YWdlZCBnZW5lcmF0aW9uIHN0YXRlIChHQVAtMjApXG4gIGdldEdlbmVyYXRpb25TdGF0ZTogKCkgPT4gZ2VuZXJhdGlvblN0YXRlLFxuICBnZXRMYXlvdXRGcmVzaG5lc3M6ICgpID0+IGdldExheW91dEZyZXNobmVzc0Zyb21TdGF0ZShnZW5lcmF0aW9uU3RhdGUpLFxuICBzZXRHZW5lcmF0aW9uU3RhdGU6ICh1cGRhdGUpID0+IHtcbiAgICBnZW5lcmF0aW9uU3RhdGUgPSB7IC4uLmdlbmVyYXRpb25TdGF0ZSwgLi4udXBkYXRlIH07XG4gICAgc2F2ZVN0YXRlVG9Mb2NhbFN0b3JhZ2UoKTtcbiAgICBlbWl0R2VuZXJhdGlvblN0YXRlQ2hhbmdlZCgpO1xuICB9LFxuICBtYXJrQ29udGVudENoYW5nZWQ6ICgpID0+IHtcbiAgICBnZW5lcmF0aW9uU3RhdGUgPSB7XG4gICAgICAuLi5nZW5lcmF0aW9uU3RhdGUsXG4gICAgICBjb250ZW50UmV2aXNpb246IChub3JtYWxpemVSZXZpc2lvbihnZW5lcmF0aW9uU3RhdGUuY29udGVudFJldmlzaW9uKSA/PyAwKSArIDEsXG4gICAgfTtcbiAgICBzYXZlU3RhdGVUb0xvY2FsU3RvcmFnZSgpO1xuICAgIGVtaXRHZW5lcmF0aW9uU3RhdGVDaGFuZ2VkKCk7XG4gIH0sXG4gIG1hcmtQcmV2aWV3R2VuZXJhdGVkOiAodXBkYXRlID0ge30pID0+IHtcbiAgICBjb25zdCBjb250ZW50UmV2aXNpb24gPSBub3JtYWxpemVSZXZpc2lvbihnZW5lcmF0aW9uU3RhdGUuY29udGVudFJldmlzaW9uKSA/PyAwO1xuICAgIGdlbmVyYXRpb25TdGF0ZSA9IHtcbiAgICAgIC4uLmdlbmVyYXRpb25TdGF0ZSxcbiAgICAgIC4uLnVwZGF0ZSxcbiAgICAgIHBoYXNlOiBHRU5FUkFUSU9OX1BIQVNFUy5MQVlPVVRfUkVWSUVXLFxuICAgICAgcHJldmlld0F2YWlsYWJsZTogdHJ1ZSxcbiAgICAgIGxheW91dENvbmZpcm1lZDogZmFsc2UsXG4gICAgICBsYXN0UHJldmlld0NvbnRlbnRSZXZpc2lvbjogY29udGVudFJldmlzaW9uLFxuICAgIH07XG4gICAgc2F2ZVN0YXRlVG9Mb2NhbFN0b3JhZ2UoKTtcbiAgICBlbWl0R2VuZXJhdGlvblN0YXRlQ2hhbmdlZCgpO1xuICB9LFxuICBtYXJrTGF5b3V0Q29uZmlybWVkOiAodXBkYXRlID0ge30pID0+IHtcbiAgICBnZW5lcmF0aW9uU3RhdGUgPSB7XG4gICAgICAuLi5nZW5lcmF0aW9uU3RhdGUsXG4gICAgICAuLi51cGRhdGUsXG4gICAgICBwaGFzZTogR0VORVJBVElPTl9QSEFTRVMuQ09ORklSTUVELFxuICAgICAgbGF5b3V0Q29uZmlybWVkOiB0cnVlLFxuICAgIH07XG4gICAgc2F2ZVN0YXRlVG9Mb2NhbFN0b3JhZ2UoKTtcbiAgICBlbWl0R2VuZXJhdGlvblN0YXRlQ2hhbmdlZCgpO1xuICB9LFxuICBtYXJrRmluYWxHZW5lcmF0ZWQ6IChnZW5lcmF0ZWRBdCA9IG51bGwsIHVwZGF0ZSA9IHt9KSA9PiB7XG4gICAgY29uc3QgY29udGVudFJldmlzaW9uID0gbm9ybWFsaXplUmV2aXNpb24oZ2VuZXJhdGlvblN0YXRlLmNvbnRlbnRSZXZpc2lvbikgPz8gMDtcbiAgICBnZW5lcmF0aW9uU3RhdGUgPSB7XG4gICAgICAuLi5nZW5lcmF0aW9uU3RhdGUsXG4gICAgICAuLi51cGRhdGUsXG4gICAgICBwaGFzZTogR0VORVJBVElPTl9QSEFTRVMuRklOQUxfQ09NUExFVEUsXG4gICAgICBsYXlvdXRDb25maXJtZWQ6IHRydWUsXG4gICAgICBmaW5hbEdlbmVyYXRlZEF0OiBnZW5lcmF0ZWRBdCB8fCB1cGRhdGUuZmluYWxHZW5lcmF0ZWRBdCB8fCBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICBsYXN0RmluYWxDb250ZW50UmV2aXNpb246IGNvbnRlbnRSZXZpc2lvbixcbiAgICB9O1xuICAgIHNhdmVTdGF0ZVRvTG9jYWxTdG9yYWdlKCk7XG4gICAgZW1pdEdlbmVyYXRpb25TdGF0ZUNoYW5nZWQoKTtcbiAgfSxcbiAgcmVzZXRHZW5lcmF0aW9uU3RhdGU6ICgpID0+IHtcbiAgICBnZW5lcmF0aW9uU3RhdGUgPSBjcmVhdGVEZWZhdWx0R2VuZXJhdGlvblN0YXRlKCk7XG4gICAgc2F2ZVN0YXRlVG9Mb2NhbFN0b3JhZ2UoKTtcbiAgICBlbWl0R2VuZXJhdGlvblN0YXRlQ2hhbmdlZCgpO1xuICB9LFxuICBzZXREaXJ0eVBoYXNlczogKHBoYXNlcywgZWFybGllc3RTdGVwKSA9PiB7XG4gICAgZ2VuZXJhdGlvblN0YXRlID0ge1xuICAgICAgLi4uZ2VuZXJhdGlvblN0YXRlLFxuICAgICAgZGlydHlQaGFzZXM6ICAgICAgIEFycmF5LmlzQXJyYXkocGhhc2VzKSA/IHBoYXNlcyA6IFtdLFxuICAgICAgZWFybGllc3REaXJ0eVN0ZXA6IGVhcmxpZXN0U3RlcCB8fCBudWxsLFxuICAgIH07XG4gICAgc2F2ZVN0YXRlVG9Mb2NhbFN0b3JhZ2UoKTtcbiAgICBlbWl0R2VuZXJhdGlvblN0YXRlQ2hhbmdlZCgpO1xuICB9LFxuICBjbGVhckRpcnR5UGhhc2VzOiAoKSA9PiB7XG4gICAgZ2VuZXJhdGlvblN0YXRlID0ge1xuICAgICAgLi4uZ2VuZXJhdGlvblN0YXRlLFxuICAgICAgZGlydHlQaGFzZXM6ICAgICAgIFtdLFxuICAgICAgZWFybGllc3REaXJ0eVN0ZXA6IG51bGwsXG4gICAgfTtcbiAgICBzYXZlU3RhdGVUb0xvY2FsU3RvcmFnZSgpO1xuICAgIGVtaXRHZW5lcmF0aW9uU3RhdGVDaGFuZ2VkKCk7XG4gIH0sXG4gIGdldERpcnR5UGhhc2VzOiAgICAgICAoKSA9PiBnZW5lcmF0aW9uU3RhdGUuZGlydHlQaGFzZXMgfHwgW10sXG4gIGdldEVhcmxpZXN0RGlydHlTdGVwOiAoKSA9PiBnZW5lcmF0aW9uU3RhdGUuZWFybGllc3REaXJ0eVN0ZXAgfHwgbnVsbCxcbn07XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBmcmVzaCBzdGF0ZSBvYmplY3Qgd2l0aCBhbGwgZGVmYXVsdCB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIGluaXRpYWxpemVTdGF0ZSgpIHtcbiAgY3VycmVudFRhYiA9ICdqb2InO1xuICBpc0xvYWRpbmcgPSBmYWxzZTtcbiAgdGFiRGF0YSA9IHtcbiAgICBhbmFseXNpczogbnVsbCxcbiAgICBjdXN0b21pemF0aW9uczogbnVsbCxcbiAgICBjdjogbnVsbFxuICB9O1xuICBpbnRlcmFjdGl2ZVN0YXRlID0ge1xuICAgIGlzUmV2aWV3aW5nOiBmYWxzZSxcbiAgICBjdXJyZW50SW5kZXg6IDAsXG4gICAgdHlwZTogbnVsbCxcbiAgICBkYXRhOiBudWxsXG4gIH07XG4gIHdpbmRvdy5wb3N0QW5hbHlzaXNRdWVzdGlvbnMgPSBbXTtcbiAgd2luZG93LnF1ZXN0aW9uQW5zd2VycyA9IHt9O1xuICBsYXN0S25vd25QaGFzZSA9IFBIQVNFUy5JTklUO1xuICBnZW5lcmF0aW9uU3RhdGUgPSBjcmVhdGVEZWZhdWx0R2VuZXJhdGlvblN0YXRlKCk7XG5cbiAgLy8gR2V0IG9yIGdlbmVyYXRlIHNlc3Npb24gSURcbiAgbGV0IHN0b3JlZElkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oU3RvcmFnZUtleXMuU0VTU0lPTl9JRCk7XG4gIGlmICghc3RvcmVkSWQpIHtcbiAgICBzdG9yZWRJZCA9IGdlbmVyYXRlU2Vzc2lvbklkKCk7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oU3RvcmFnZUtleXMuU0VTU0lPTl9JRCwgc3RvcmVkSWQpO1xuICB9XG4gIHNlc3Npb25JZCA9IHN0b3JlZElkO1xuXG4gIHNhdmVTdGF0ZVRvTG9jYWxTdG9yYWdlKCk7XG4gIGVtaXRHZW5lcmF0aW9uU3RhdGVDaGFuZ2VkKCk7XG59XG5cbi8qKlxuICogTG9hZCBzdGF0ZSBmcm9tIGJyb3dzZXIgbG9jYWxTdG9yYWdlLlxuICovXG5mdW5jdGlvbiBsb2FkU3RhdGVGcm9tTG9jYWxTdG9yYWdlKCkge1xuICB0cnkge1xuICAgIGNvbnN0IHNhdmVkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oU3RvcmFnZUtleXMuVEFCX0RBVEEpO1xuICAgIGlmICghc2F2ZWQpIHJldHVybiBmYWxzZTtcblxuICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKHNhdmVkKTtcblxuICAgIC8vIE9ubHkgcmVzdG9yZSBpZiBkYXRhIGlzIHJlY2VudCAod2l0aGluIDI0IGhvdXJzKVxuICAgIGNvbnN0IGFnZSA9IERhdGUubm93KCkgLSAoZGF0YS50aW1lc3RhbXAgfHwgMCk7XG4gICAgaWYgKGFnZSA+IDI0ICogNjAgKiA2MCAqIDEwMDApIHtcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKFN0b3JhZ2VLZXlzLlRBQl9EQVRBKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBSZXN0b3JlIHRhYiBkYXRhXG4gICAgaWYgKGRhdGEudGFiRGF0YSkge1xuICAgICAgdGFiRGF0YSA9IHsgLi4udGFiRGF0YSwgLi4uZGF0YS50YWJEYXRhIH07XG4gICAgfVxuXG4gICAgaWYgKGRhdGEuY3VycmVudFRhYikge1xuICAgICAgY3VycmVudFRhYiA9IGRhdGEuY3VycmVudFRhYjtcbiAgICB9XG5cbiAgICAvLyBSZXN0b3JlIGludGVyYWN0aXZlIHN0YXRlXG4gICAgaWYgKGRhdGEuaW50ZXJhY3RpdmVTdGF0ZSkge1xuICAgICAgaW50ZXJhY3RpdmVTdGF0ZSA9IHsgLi4uaW50ZXJhY3RpdmVTdGF0ZSwgLi4uZGF0YS5pbnRlcmFjdGl2ZVN0YXRlIH07XG4gICAgfVxuXG4gICAgLy8gUmVzdG9yZSBwZW5kaW5nIHJlY29tbWVuZGF0aW9uc1xuICAgIGlmIChkYXRhLnBlbmRpbmdSZWNvbW1lbmRhdGlvbnMpIHtcbiAgICAgIHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zID0gZGF0YS5wZW5kaW5nUmVjb21tZW5kYXRpb25zO1xuICAgIH1cblxuICAgIC8vIFJlc3RvcmUgc2F2ZWQgbW9kZWwvcHJvdmlkZXIgc2VsZWN0aW9uXG4gICAgaWYgKGRhdGEuY3VycmVudE1vZGVsUHJvdmlkZXIpIHtcbiAgICAgIGN1cnJlbnRNb2RlbFByb3ZpZGVyID0gZGF0YS5jdXJyZW50TW9kZWxQcm92aWRlcjtcbiAgICB9XG4gICAgaWYgKGRhdGEuY3VycmVudE1vZGVsTmFtZSkge1xuICAgICAgY3VycmVudE1vZGVsTmFtZSA9IGRhdGEuY3VycmVudE1vZGVsTmFtZTtcbiAgICB9XG5cbiAgICAvLyBSZXN0b3JlIHBvc3QtYW5hbHlzaXMgc3RhdGVcbiAgICBpZiAoZGF0YS5wb3N0QW5hbHlzaXNRdWVzdGlvbnMpIHtcbiAgICAgIHdpbmRvdy5wb3N0QW5hbHlzaXNRdWVzdGlvbnMgPSBkYXRhLnBvc3RBbmFseXNpc1F1ZXN0aW9ucztcbiAgICB9XG4gICAgaWYgKGRhdGEucXVlc3Rpb25BbnN3ZXJzKSB7XG4gICAgICB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzID0gZGF0YS5xdWVzdGlvbkFuc3dlcnM7XG4gICAgfVxuXG4gICAgLy8gUmVzdG9yZSBwaGFzZVxuICAgIGlmIChkYXRhLmxhc3RLbm93blBoYXNlKSB7XG4gICAgICBsYXN0S25vd25QaGFzZSA9IGRhdGEubGFzdEtub3duUGhhc2U7XG4gICAgfVxuXG4gICAgLy8gUmVzdG9yZSBzdGFnZWQgZ2VuZXJhdGlvbiBzdGF0ZVxuICAgIGlmIChkYXRhLmdlbmVyYXRpb25TdGF0ZSkge1xuICAgICAgZ2VuZXJhdGlvblN0YXRlID0geyAuLi5nZW5lcmF0aW9uU3RhdGUsIC4uLmRhdGEuZ2VuZXJhdGlvblN0YXRlIH07XG4gICAgfVxuXG4gICAgLy8gUmVzdG9yZSBBVFMgc2NvcmVcbiAgICBpZiAoZGF0YS5hdHNTY29yZSkge1xuICAgICAgYXRzU2NvcmUgPSBkYXRhLmF0c1Njb3JlO1xuICAgIH1cblxuICAgIGVtaXRHZW5lcmF0aW9uU3RhdGVDaGFuZ2VkKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nLndhcm4oJ0ZhaWxlZCB0byBsb2FkIHN0YXRlIGZyb20gbG9jYWxTdG9yYWdlOicsIGVycm9yKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBTYXZlIGN1cnJlbnQgc3RhdGUgdG8gYnJvd3NlciBsb2NhbFN0b3JhZ2UuXG4gKi9cbmZ1bmN0aW9uIHNhdmVTdGF0ZVRvTG9jYWxTdG9yYWdlKCkge1xuICB0cnkge1xuICAgIGNvbnN0IGRhdGFUb1NhdmUgPSB7XG4gICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICB0YWJEYXRhLFxuICAgICAgaW50ZXJhY3RpdmVTdGF0ZSxcbiAgICAgIHBlbmRpbmdSZWNvbW1lbmRhdGlvbnM6IHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zLFxuICAgICAgcG9zdEFuYWx5c2lzUXVlc3Rpb25zOiB3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zLFxuICAgICAgcXVlc3Rpb25BbnN3ZXJzOiB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzLFxuICAgICAgbGFzdEtub3duUGhhc2UsXG4gICAgICBjdXJyZW50VGFiLFxuICAgICAgLy8gUGVyc2lzdCBsYXN0LXNlbGVjdGVkIG1vZGVsL3Byb3ZpZGVyIHNvIFVJIHNlbGVjdGlvbnMgc3Vydml2ZSByZWxvYWRzXG4gICAgICBjdXJyZW50TW9kZWxQcm92aWRlcixcbiAgICAgIGN1cnJlbnRNb2RlbE5hbWUsXG4gICAgICBnZW5lcmF0aW9uU3RhdGUsXG4gICAgICBhdHNTY29yZSxcbiAgICB9O1xuXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oU3RvcmFnZUtleXMuVEFCX0RBVEEsIEpTT04uc3RyaW5naWZ5KGRhdGFUb1NhdmUpKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cud2FybignRmFpbGVkIHRvIHNhdmUgc3RhdGUgdG8gbG9jYWxTdG9yYWdlOicsIGVycm9yKTtcbiAgfVxufVxuXG4vKipcbiAqIENsZWFyIGFsbCBzdGF0ZSAob24gbmV3IHNlc3Npb24gb3IgcmVzZXQgYWN0aW9uKS5cbiAqL1xuZnVuY3Rpb24gY2xlYXJTdGF0ZSgpIHtcbiAgaW5pdGlhbGl6ZVN0YXRlKCk7XG4gIE9iamVjdC52YWx1ZXMoU3RvcmFnZUtleXMpLmZvckVhY2goa2V5ID0+IGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSkpO1xufVxuXG4vLyBUaGUgYXV0aG9yaXRhdGl2ZSByZXN0b3JlU2Vzc2lvbi9yZXN0b3JlQmFja2VuZFN0YXRlL2xvYWRTZXNzaW9uRmlsZVxuLy8gaW1wbGVtZW50YXRpb25zIGxpdmUgaW4gYHdlYi9hcHAuanNgLiBSZW1vdmUgZHVwbGljYXRlIGltcGxlbWVudGF0aW9uc1xuLy8gZnJvbSB0aGlzIG1vZHVsZSB0byBhdm9pZCBjb25mbGljdGluZyBiZWhhdmlvciBhbmQgZW5zdXJlIGEgc2luZ2xlXG4vLyByZXN0b3JlIHBhdGggaXMgdXNlZCBieSB0aGUgYXBwbGljYXRpb24uXG5cbmV4cG9ydCB7XG4gIFBIQVNFUyxcbiAgUEhBU0VfVE9fU1RFUCxcbiAgR0VORVJBVElPTl9QSEFTRVMsXG4gIEdFTkVSQVRJT05fU1RBVEVfRVZFTlQsXG4gIHN0YXRlTWFuYWdlcixcbiAgZ2V0V29ya2Zsb3dTdGVwRm9yUGhhc2UsXG4gIGluaXRpYWxpemVTdGF0ZSwgbG9hZFN0YXRlRnJvbUxvY2FsU3RvcmFnZSwgc2F2ZVN0YXRlVG9Mb2NhbFN0b3JhZ2UsXG4gIGNsZWFyU3RhdGUsXG59O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvcHJvdmlkZXItaW5mby5qcyBcdTIwMTQgTExNIHByb3ZpZGVyIGRpc3BsYXkgbWV0YWRhdGEgY2xpZW50LlxuICpcbiAqIFByb3ZpZGVyIGRhdGEgaXMgbm93IHRoZSBzaW5nbGUgc291cmNlIG9mIHRydXRoIGluIHNjcmlwdHMvdXRpbHMvcHJvdmlkZXJfcmVnaXN0cnkucHlcbiAqIGFuZCBzZXJ2ZWQgYnkgR0VUIC9hcGkvcHJvdmlkZXJzLiBUaGlzIG1vZHVsZSBmZXRjaGVzIGFuZCBjYWNoZXMgdGhhdCBkYXRhLlxuICpcbiAqIEFsbCBwcm92aWRlciBkZXNjcmlwdGlvbnMsIFVSTHMsIGFuZCB0aWVyL3ByaXZhY3kgZmxhZ3Mgc2hvdWxkIGJlIGVkaXRlZCBpblxuICogcHJvdmlkZXJfcmVnaXN0cnkucHkgcmF0aGVyIHRoYW4gaGVyZS5cbiAqXG4gKiBTZXJ2ZXIgZmllbGQgbmFtZXMgKHNuYWtlX2Nhc2UsIG1hdGNoaW5nIFB5dGhvbik6XG4gKiAgIGZyZWVfdGllciAgIFx1MjAxNCB3aGV0aGVyIGEgbm8tY29zdCBBUEkgZW50cnkgdGllciBpcyBhdmFpbGFibGVcbiAqICAgY29uZmlkZW50aWFsIFx1MjAxNCB3aGV0aGVyIHRoZSBwcm92aWRlciBjb21taXRzIG5vdCB0byB0cmFpbiBvbiBBUEkgcmVxdWVzdCBkYXRhXG4gKiAgIG5vdGUgICAgICAgIFx1MjAxNCBvbmUtc2VudGVuY2UgcGxhaW4tdGV4dCBkZXNjcmlwdGlvblxuICogICBob21lcGFnZSAgICBcdTIwMTQgcHJvdmlkZXIgbGFuZGluZyBwYWdlIFVSTCAobnVsbCBpZiBub3QgYXBwbGljYWJsZSlcbiAqICAgcHJpY2luZ191cmwgXHUyMDE0IHByaWNpbmcgLyBwbGFucyBwYWdlIFVSTCAobnVsbCBpZiBub3QgYXBwbGljYWJsZSlcbiAqICAgcHJpdmFjeV91cmwgXHUyMDE0IHByaXZhY3kgcG9saWN5IG9yIGRhdGEtdXNlIHBvbGljeSBVUkwgKG51bGwgaWYgbm90IGFwcGxpY2FibGUpXG4gKi9cblxuaW1wb3J0IHsgZXNjYXBlSHRtbCB9IGZyb20gJy4vdXRpbHMuanMnO1xuXG4vKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIG9iamVjdD58bnVsbH0gKi9cbmxldCBfY2FjaGUgPSBudWxsO1xuXG4vKipcbiAqIEZldGNoIHByb3ZpZGVyIGRpc3BsYXkgbWV0YWRhdGEgZnJvbSB0aGUgc2VydmVyIGFuZCBjYWNoZSBpdC5cbiAqIFNhZmUgdG8gY2FsbCBtdWx0aXBsZSB0aW1lcyBcdTIwMTQgcmV0dXJucyB0aGUgY2FjaGUgaWYgcG9wdWxhdGVkLCByZXRyaWVzIGlmXG4gKiB0aGUgaW5pdGlhbCBmZXRjaCBmYWlsZWQgKG5vbi1mYXRhbCwgcG9wb3ZlcnMgd2lsbCBqdXN0IG5vdCBhcHBlYXIpLlxuICogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywgb2JqZWN0PnxudWxsPn1cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRQcm92aWRlckluZm8oKSB7XG4gIGlmIChfY2FjaGUgIT09IG51bGwpIHJldHVybiBfY2FjaGU7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKCcvYXBpL3Byb3ZpZGVycycpO1xuICAgIGlmIChyZXNwLm9rKSB7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcC5qc29uKCk7XG4gICAgICBfY2FjaGUgPSBkYXRhLnByb3ZpZGVycyB8fCB7fTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIE5vbi1mYXRhbDogcG9wb3ZlcnMgc2ltcGx5IHdvbid0IGFwcGVhci5cbiAgfVxuICByZXR1cm4gX2NhY2hlO1xufVxuXG4vKipcbiAqIFJldHVybiBjYWNoZWQgZGlzcGxheSBpbmZvIGZvciBhIHByb3ZpZGVyLCBvciBudWxsIGlmIG5vdCBsb2FkZWQgLyB1bmtub3duLlxuICogQ2FsbCBsb2FkUHJvdmlkZXJJbmZvKCkgZmlyc3QgKGUuZy4gaW4gb3Blbk1vZGVsTW9kYWwpLlxuICogQHBhcmFtIHtzdHJpbmd9IHByb3ZpZGVyXG4gKiBAcmV0dXJucyB7b2JqZWN0fG51bGx9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcm92aWRlckluZm8ocHJvdmlkZXIpIHtcbiAgcmV0dXJuIF9jYWNoZSA/IChfY2FjaGVbcHJvdmlkZXJdIHx8IG51bGwpIDogbnVsbDtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgSFRNTCBjb250ZW50IHN0cmluZyBmb3IgYSBwcm92aWRlciBpbmZvIEJvb3RzdHJhcCA1IHBvcG92ZXIuXG4gKiBVc2VzIHNuYWtlX2Nhc2UgZmllbGQgbmFtZXMgYXMgcmV0dXJuZWQgYnkgR0VUIC9hcGkvcHJvdmlkZXJzLlxuICogQHBhcmFtIHtvYmplY3R9IGluZm8gLSBQcm92aWRlciBpbmZvIGVudHJ5IGZyb20gZ2V0UHJvdmlkZXJJbmZvKClcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEhUTUwgc3RyaW5nIChzYWZlIHRvIHBhc3MgdG8gQlM1IFBvcG92ZXIgd2l0aCBzYW5pdGl6ZTpmYWxzZSlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVySW5mb1BvcG92ZXJDb250ZW50KGluZm8pIHtcbiAgY29uc3QgdGllckljb24gID0gaW5mby5mcmVlX3RpZXIgICAgPyAnJiMxMDAwMzsgRnJlZSB0aWVyIGF2YWlsYWJsZScgICAgOiAnJiMxMDAwNzsgUGFpZCBvbmx5IChubyBmcmVlIEFQSSB0aWVyKSc7XG4gIGNvbnN0IHByaXZJY29uICA9IGluZm8uY29uZmlkZW50aWFsID8gJyYjMTI4Mjc0OyBEYXRhIGNvbmZpZGVudGlhbCcgICAgIDogJyYjOTg4ODsmIzY1MDM5OyBEYXRhIG1heSBiZSByZXZpZXdlZC9yZXRhaW5lZCc7XG4gIGNvbnN0IHRpZXJDb2xvciA9IGluZm8uZnJlZV90aWVyICAgID8gJyMwNjVmNDYnIDogJyM5MjQwMGUnO1xuICBjb25zdCBwcml2Q29sb3IgPSBpbmZvLmNvbmZpZGVudGlhbCA/ICcjMWU0MGFmJyA6ICcjOTI0MDBlJztcblxuICBjb25zdCBsaW5rcyA9IFtcbiAgICBpbmZvLmhvbWVwYWdlICAgID8gYDxhIGhyZWY9XCIke2VzY2FwZUh0bWwoaW5mby5ob21lcGFnZSl9XCIgICAgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiPkhvbWVwYWdlPC9hPmAgICAgICAgICAgIDogJycsXG4gICAgaW5mby5wcmljaW5nX3VybCA/IGA8YSBocmVmPVwiJHtlc2NhcGVIdG1sKGluZm8ucHJpY2luZ191cmwpfVwiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIj5QcmljaW5nICZhbXA7IHBsYW5zPC9hPmAgOiAnJyxcbiAgICBpbmZvLnByaXZhY3lfdXJsID8gYDxhIGhyZWY9XCIke2VzY2FwZUh0bWwoaW5mby5wcml2YWN5X3VybCl9XCIgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiPlByaXZhY3kgcG9saWN5PC9hPmAgICAgICA6ICcnLFxuICBdLmZpbHRlcihCb29sZWFuKTtcblxuICByZXR1cm4gJzxkaXYgc3R5bGU9XCJtaW4td2lkdGg6MjIwcHg7bWF4LXdpZHRoOjMwMHB4O2ZvbnQtc2l6ZTowLjgyZW07bGluZS1oZWlnaHQ6MS41O1wiPidcbiAgICArIGA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTo2cHg7XCI+PHNwYW4gc3R5bGU9XCJjb2xvcjoke3RpZXJDb2xvcn07XCI+JHt0aWVySWNvbn08L3NwYW4+PC9kaXY+YFxuICAgICsgYDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjhweDtcIj48c3BhbiBzdHlsZT1cImNvbG9yOiR7cHJpdkNvbG9yfTtcIj4ke3ByaXZJY29ufTwvc3Bhbj48L2Rpdj5gXG4gICAgKyBgPHAgc3R5bGU9XCJtYXJnaW46MCAwIDhweDtjb2xvcjojMzc0MTUxO1wiPiR7ZXNjYXBlSHRtbChpbmZvLm5vdGUpfTwvcD5gXG4gICAgKyAobGlua3MubGVuZ3RoID8gJzx1bCBzdHlsZT1cIm1hcmdpbjowO3BhZGRpbmctbGVmdDoxNnB4O1wiPicgKyBsaW5rcy5tYXAobCA9PiBgPGxpPiR7bH08L2xpPmApLmpvaW4oJycpICsgJzwvdWw+JyA6ICcnKVxuICAgICsgJzwvZGl2Pic7XG59XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHVpLWNvcmUuanNcbiAqIENvcmUgVUkgcm91dGluZywgdGFiIG1hbmFnZW1lbnQsIG1vZGFsIG1hbmFnZW1lbnQsIGFuZCBwYWdlIGluaXRpYWxpemF0aW9uLlxuICogRW50cnkgcG9pbnQgZm9yIHRoZSBhcHBsaWNhdGlvbiAtIGxvYWRzIG9uIERPTUNvbnRlbnRMb2FkZWQuXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCd1aS1jb3JlJyk7XG5cbmltcG9ydCB7IGVzY2FwZUh0bWwgfSBmcm9tICcuL3V0aWxzLmpzJztcbmltcG9ydCB7IFN0b3JhZ2VLZXlzLCBhcGlDYWxsLCBmZXRjaFN0YXR1cywgZmV0Y2hTZXR0aW5ncywgdXBkYXRlU2V0dGluZ3MgfSBmcm9tICcuL2FwaS1jbGllbnQuanMnO1xuaW1wb3J0IHtcbiAgZ2V0V29ya2Zsb3dTdGVwRm9yUGhhc2UsXG4gIGluaXRpYWxpemVTdGF0ZSxcbiAgbG9hZFN0YXRlRnJvbUxvY2FsU3RvcmFnZSxcbiAgc3RhdGVNYW5hZ2VyLFxufSBmcm9tICcuL3N0YXRlLW1hbmFnZXIuanMnO1xuaW1wb3J0IHsgX1NURVBfRElTUExBWSB9IGZyb20gJy4vd29ya2Zsb3ctc3RlcHMuanMnO1xuXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbi8vIEFjY2Vzc2liaWxpdHk6IEZvY3VzIE1hbmFnZW1lbnQgZm9yIE1vZGFsc1xuLy8gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8qKiBTdGFjayBvZiBlbGVtZW50cyB0aGF0IG9wZW5lZCBlYWNoIG1vZGFsIChzdXBwb3J0cyBuZXN0ZWQgbW9kYWxzKS4gKi9cbmNvbnN0IF9mb2N1c1N0YWNrID0gW107XG5cbi8qKiBTdGFjayBvZiBmb2N1cy10cmFwIGxpc3RlbmVycyAob25lIHBlciBvcGVuIG1vZGFsKS4gKi9cbmNvbnN0IF9mb2N1c1RyYXBTdGFjayA9IFtdO1xubGV0IF9zZXR0aW5nc0RhdGEgPSBudWxsO1xuY29uc3QgUkVUUllfUE9MSUNZX1NUT1JBR0VfS0VZID0gJ2N2LWJ1aWxkZXItcmV0cnktcG9saWN5JztcblxuZnVuY3Rpb24gX2dldFJldHJ5UG9saWN5RnJvbVN0b3JhZ2UoKSB7XG4gIGNvbnN0IGRlZmF1bHRzID0ge1xuICAgIGJhc2VNczogMTUwMCxcbiAgICBjYXBNczogNjAwMDAsXG4gICAgbWF4QXR0ZW1wdHM6IDYsXG4gICAgYXV0b1JldHJ5OiB0cnVlLFxuICB9O1xuICB0cnkge1xuICAgIGNvbnN0IHJhdyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFJFVFJZX1BPTElDWV9TVE9SQUdFX0tFWSk7XG4gICAgaWYgKCFyYXcpIHJldHVybiBkZWZhdWx0cztcbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHJhdyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGJhc2VNczogTWF0aC5tYXgoMjAwLCBOdW1iZXIocGFyc2VkLmJhc2VNcyB8fCBkZWZhdWx0cy5iYXNlTXMpKSxcbiAgICAgIGNhcE1zOiBNYXRoLm1heCgxMDAwLCBOdW1iZXIocGFyc2VkLmNhcE1zIHx8IGRlZmF1bHRzLmNhcE1zKSksXG4gICAgICBtYXhBdHRlbXB0czogTWF0aC5tYXgoMSwgTnVtYmVyKHBhcnNlZC5tYXhBdHRlbXB0cyB8fCBkZWZhdWx0cy5tYXhBdHRlbXB0cykpLFxuICAgICAgYXV0b1JldHJ5OiBwYXJzZWQuYXV0b1JldHJ5ICE9PSBmYWxzZSxcbiAgICB9O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZGVmYXVsdHM7XG4gIH1cbn1cblxuZnVuY3Rpb24gX3NhdmVSZXRyeVBvbGljeVRvU3RvcmFnZShwb2xpY3kpIHtcbiAgdHJ5IHtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShSRVRSWV9QT0xJQ1lfU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KHBvbGljeSkpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy53YXJuKCdDb3VsZCBub3Qgc2F2ZSByZXRyeSBwb2xpY3kgcHJlZmVyZW5jZTonLCBlcnJvcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX3NldHRpbmdzU291cmNlTGFiZWwobWV0YSwga2V5LCBydW50aW1lT3ZlcnJpZGVzID0gbnVsbCkge1xuICBpZiAocnVudGltZU92ZXJyaWRlcyAmJiBrZXkgaW4gcnVudGltZU92ZXJyaWRlcykge1xuICAgIHJldHVybiAnU291cmNlOiBydW50aW1lIHNlbGVjdGlvbic7XG4gIH1cbiAgY29uc3Qgc291cmNlID0gbWV0YT8uc291cmNlcz8uW2tleV0gfHwgJ2RlZmF1bHQnO1xuICBjb25zdCBlbnZLZXkgPSBtZXRhPy5lbnZfa2V5cz8uW2tleV0gfHwgbnVsbDtcbiAgaWYgKHNvdXJjZSA9PT0gJ2VudicpIHJldHVybiBgU291cmNlOiBlbnZpcm9ubWVudCB2YXJpYWJsZSAoJHtlbnZLZXkgfHwgJ2xvY2tlZCd9KWA7XG4gIGlmIChzb3VyY2UgPT09ICdkb3RlbnYnKSByZXR1cm4gYFNvdXJjZTogLmVudiAoJHtlbnZLZXkgfHwgJ2xvY2tlZCd9KWA7XG4gIGlmIChzb3VyY2UgPT09ICdjb25maWcnKSByZXR1cm4gJ1NvdXJjZTogY29uZmlnLnlhbWwnO1xuICByZXR1cm4gJ1NvdXJjZTogYnVpbHQtaW4gZGVmYXVsdCc7XG59XG5cbmZ1bmN0aW9uIF9yZW5kZXJTZXR0aW5nc1NvdXJjZXMobWV0YSwgcnVudGltZU92ZXJyaWRlcyA9IG51bGwpIHtcbiAgY29uc3Qgc291cmNlVGFyZ2V0cyA9IFtcbiAgICAnbGxtLmRlZmF1bHRfcHJvdmlkZXInLFxuICAgICdsbG0uZGVmYXVsdF9tb2RlbCcsXG4gICAgJ2xsbS5yZXF1ZXN0X3RpbWVvdXRfc2Vjb25kcycsXG4gICAgJ2xsbS50ZW1wZXJhdHVyZScsXG4gICAgJ2dlbmVyYXRpb24ubWF4X3NraWxscycsXG4gICAgJ2dlbmVyYXRpb24ubWF4X2FjaGlldmVtZW50cycsXG4gICAgJ2dlbmVyYXRpb24ubWF4X3B1YmxpY2F0aW9ucycsXG4gICAgJ2dlbmVyYXRpb24uc2tpbGxzX3NlY3Rpb25fdGl0bGUnLFxuICAgICdnZW5lcmF0aW9uLmZvcm1hdHMuYXRzX2RvY3gnLFxuICAgICdnZW5lcmF0aW9uLmZvcm1hdHMuaHVtYW5fcGRmJyxcbiAgICAnZ2VuZXJhdGlvbi5mb3JtYXRzLmh1bWFuX2RvY3gnLFxuICBdO1xuICBzb3VyY2VUYXJnZXRzLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNvdXJjZS0ke2tleX1gKTtcbiAgICBpZiAoIWVsKSByZXR1cm47XG4gICAgZWwudGV4dENvbnRlbnQgPSBfc2V0dGluZ3NTb3VyY2VMYWJlbChtZXRhLCBrZXksIHJ1bnRpbWVPdmVycmlkZXMpO1xuICAgIGNvbnN0IHJ1bnRpbWVLZXkgPSBydW50aW1lT3ZlcnJpZGVzICYmIGtleSBpbiBydW50aW1lT3ZlcnJpZGVzO1xuICAgIGNvbnN0IGlzTG9ja2VkID0gQm9vbGVhbihtZXRhPy5sb2NrZWQ/LltrZXldKTtcbiAgICBlbC5zdHlsZS5jb2xvciA9IHJ1bnRpbWVLZXkgPyAnIzFlNDBhZicgOiAoaXNMb2NrZWQgPyAnI2I0NTMwOScgOiAnIzY0NzQ4YicpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gX3NldFNldHRpbmdzU3RhdHVzKG1lc3NhZ2UsIGtpbmQgPSAnaW5mbycpIHtcbiAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dGluZ3Mtc3RhdHVzLW1zZycpO1xuICBpZiAoIWVsKSByZXR1cm47XG4gIGVsLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgaWYgKGtpbmQgPT09ICdzdWNjZXNzJykge1xuICAgIGVsLnN0eWxlLmJhY2tncm91bmQgPSAnI2VjZmRmNSc7XG4gICAgZWwuc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCAjODZlZmFjJztcbiAgICBlbC5zdHlsZS5jb2xvciA9ICcjMTY2NTM0JztcbiAgfSBlbHNlIGlmIChraW5kID09PSAnZXJyb3InKSB7XG4gICAgZWwuc3R5bGUuYmFja2dyb3VuZCA9ICcjZmVmMmYyJztcbiAgICBlbC5zdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkICNmZWNhY2EnO1xuICAgIGVsLnN0eWxlLmNvbG9yID0gJyM5OTFiMWInO1xuICB9IGVsc2Uge1xuICAgIGVsLnN0eWxlLmJhY2tncm91bmQgPSAnI2VmZjZmZic7XG4gICAgZWwuc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCAjYmZkYmZlJztcbiAgICBlbC5zdHlsZS5jb2xvciA9ICcjMWU0MGFmJztcbiAgfVxuICBlbC50ZXh0Q29udGVudCA9IG1lc3NhZ2U7XG59XG5cbmZ1bmN0aW9uIF9jb2xsZWN0U2V0dGluZ3NQYXlsb2FkRnJvbUZvcm0oKSB7XG4gIHJldHVybiB7XG4gICAgbGxtOiB7XG4gICAgICBkZWZhdWx0X3Byb3ZpZGVyOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dGluZ3MtbGxtLWRlZmF1bHQtcHJvdmlkZXInKT8udmFsdWU/LnRyaW0oKSB8fCBudWxsLFxuICAgICAgZGVmYXVsdF9tb2RlbDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHRpbmdzLWxsbS1kZWZhdWx0LW1vZGVsJyk/LnZhbHVlPy50cmltKCkgfHwgbnVsbCxcbiAgICAgIHJlcXVlc3RfdGltZW91dF9zZWNvbmRzOiBOdW1iZXIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHRpbmdzLWxsbS1yZXF1ZXN0LXRpbWVvdXQnKT8udmFsdWUgfHwgMTIwKSxcbiAgICAgIHRlbXBlcmF0dXJlOiBOdW1iZXIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHRpbmdzLWxsbS10ZW1wZXJhdHVyZScpPy52YWx1ZSB8fCAwLjcpLFxuICAgIH0sXG4gICAgZ2VuZXJhdGlvbjoge1xuICAgICAgbWF4X3NraWxsczogTnVtYmVyKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR0aW5ncy1nZW4tbWF4LXNraWxscycpPy52YWx1ZSB8fCAyMCksXG4gICAgICBtYXhfYWNoaWV2ZW1lbnRzOiBOdW1iZXIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHRpbmdzLWdlbi1tYXgtYWNoaWV2ZW1lbnRzJyk/LnZhbHVlIHx8IDUpLFxuICAgICAgbWF4X3B1YmxpY2F0aW9uczogTnVtYmVyKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR0aW5ncy1nZW4tbWF4LXB1YmxpY2F0aW9ucycpPy52YWx1ZSB8fCAxMCksXG4gICAgICBza2lsbHNfc2VjdGlvbl90aXRsZTogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHRpbmdzLWdlbi1za2lsbHMtdGl0bGUnKT8udmFsdWU/LnRyaW0oKSB8fCAnU2tpbGxzJyxcbiAgICAgIGZvcm1hdHM6IHtcbiAgICAgICAgYXRzX2RvY3g6IEJvb2xlYW4oZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHRpbmdzLWZvcm1hdC1hdHMtZG9jeCcpPy5jaGVja2VkKSxcbiAgICAgICAgaHVtYW5fcGRmOiBCb29sZWFuKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR0aW5ncy1mb3JtYXQtaHVtYW4tcGRmJyk/LmNoZWNrZWQpLFxuICAgICAgICBodW1hbl9kb2N4OiBCb29sZWFuKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR0aW5ncy1mb3JtYXQtaHVtYW4tZG9jeCcpPy5jaGVja2VkKSxcbiAgICAgIH0sXG4gICAgICBhaV9hdHRyaWJ1dGlvbjogQm9vbGVhbihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dGluZ3MtZ2VuLWFpLWF0dHJpYnV0aW9uJyk/LmNoZWNrZWQpLFxuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIF9jb2xsZWN0UmV0cnlQb2xpY3lGcm9tRm9ybSgpIHtcbiAgcmV0dXJuIHtcbiAgICBiYXNlTXM6IE51bWJlcihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dGluZ3MtcmV0cnktYmFzZS1tcycpPy52YWx1ZSB8fCAxNTAwKSxcbiAgICBjYXBNczogTnVtYmVyKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR0aW5ncy1yZXRyeS1jYXAtbXMnKT8udmFsdWUgfHwgNjAwMDApLFxuICAgIG1heEF0dGVtcHRzOiBOdW1iZXIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHRpbmdzLXJldHJ5LW1heC1hdHRlbXB0cycpPy52YWx1ZSB8fCA2KSxcbiAgICBhdXRvUmV0cnk6IEJvb2xlYW4oZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHRpbmdzLXJldHJ5LWF1dG8nKT8uY2hlY2tlZCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIF9yZW5kZXJTZXR0aW5nc1RvRm9ybShwYXlsb2FkKSB7XG4gIGNvbnN0IHNldHRpbmdzID0gcGF5bG9hZD8uc2V0dGluZ3MgfHwge307XG4gIGNvbnN0IGxsbSA9IHNldHRpbmdzLmxsbSB8fCB7fTtcbiAgY29uc3QgZ2VuZXJhdGlvbiA9IHNldHRpbmdzLmdlbmVyYXRpb24gfHwge307XG4gIGNvbnN0IGZvcm1hdHMgPSBnZW5lcmF0aW9uLmZvcm1hdHMgfHwge307XG4gIGNvbnN0IHJ1bnRpbWVQcm92aWRlciA9IHBheWxvYWQ/LnJ1bnRpbWU/LmxsbT8ucHJvdmlkZXIgfHwgbnVsbDtcbiAgY29uc3QgcnVudGltZU1vZGVsID0gcGF5bG9hZD8ucnVudGltZT8ubGxtPy5tb2RlbCB8fCBudWxsO1xuICBjb25zdCBydW50aW1lT3ZlcnJpZGVzID0ge307XG4gIGlmIChydW50aW1lUHJvdmlkZXIpIHJ1bnRpbWVPdmVycmlkZXNbJ2xsbS5kZWZhdWx0X3Byb3ZpZGVyJ10gPSBydW50aW1lUHJvdmlkZXI7XG4gIGlmIChydW50aW1lTW9kZWwpIHJ1bnRpbWVPdmVycmlkZXNbJ2xsbS5kZWZhdWx0X21vZGVsJ10gPSBydW50aW1lTW9kZWw7XG5cbiAgY29uc3Qgc2V0VmFsdWUgPSAoaWQsIHZhbHVlKSA9PiB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgaWYgKGVsKSBlbC52YWx1ZSA9IHZhbHVlID8/ICcnO1xuICB9O1xuICBjb25zdCBzZXRDaGVja2VkID0gKGlkLCB2YWx1ZSkgPT4ge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgIGlmIChlbCkgZWwuY2hlY2tlZCA9IEJvb2xlYW4odmFsdWUpO1xuICB9O1xuXG4gIHNldFZhbHVlKCdzZXR0aW5ncy1sbG0tZGVmYXVsdC1wcm92aWRlcicsIHJ1bnRpbWVQcm92aWRlciB8fCBsbG0uZGVmYXVsdF9wcm92aWRlciB8fCAnJyk7XG4gIHNldFZhbHVlKCdzZXR0aW5ncy1sbG0tZGVmYXVsdC1tb2RlbCcsIHJ1bnRpbWVNb2RlbCB8fCBsbG0uZGVmYXVsdF9tb2RlbCB8fCAnJyk7XG4gIHNldFZhbHVlKCdzZXR0aW5ncy1sbG0tcmVxdWVzdC10aW1lb3V0JywgbGxtLnJlcXVlc3RfdGltZW91dF9zZWNvbmRzID8/IDEyMCk7XG4gIHNldFZhbHVlKCdzZXR0aW5ncy1sbG0tdGVtcGVyYXR1cmUnLCBsbG0udGVtcGVyYXR1cmUgPz8gMC43KTtcblxuICBzZXRWYWx1ZSgnc2V0dGluZ3MtZ2VuLW1heC1za2lsbHMnLCBnZW5lcmF0aW9uLm1heF9za2lsbHMgPz8gMjApO1xuICBzZXRWYWx1ZSgnc2V0dGluZ3MtZ2VuLW1heC1hY2hpZXZlbWVudHMnLCBnZW5lcmF0aW9uLm1heF9hY2hpZXZlbWVudHMgPz8gNSk7XG4gIHNldFZhbHVlKCdzZXR0aW5ncy1nZW4tbWF4LXB1YmxpY2F0aW9ucycsIGdlbmVyYXRpb24ubWF4X3B1YmxpY2F0aW9ucyA/PyAxMCk7XG4gIHNldFZhbHVlKCdzZXR0aW5ncy1nZW4tc2tpbGxzLXRpdGxlJywgZ2VuZXJhdGlvbi5za2lsbHNfc2VjdGlvbl90aXRsZSB8fCAnU2tpbGxzJyk7XG5cbiAgc2V0Q2hlY2tlZCgnc2V0dGluZ3MtZm9ybWF0LWF0cy1kb2N4JywgZm9ybWF0cy5hdHNfZG9jeCk7XG4gIHNldENoZWNrZWQoJ3NldHRpbmdzLWZvcm1hdC1odW1hbi1wZGYnLCBmb3JtYXRzLmh1bWFuX3BkZik7XG4gIHNldENoZWNrZWQoJ3NldHRpbmdzLWZvcm1hdC1odW1hbi1kb2N4JywgZm9ybWF0cy5odW1hbl9kb2N4KTtcbiAgc2V0Q2hlY2tlZCgnc2V0dGluZ3MtZ2VuLWFpLWF0dHJpYnV0aW9uJywgZ2VuZXJhdGlvbi5haV9hdHRyaWJ1dGlvbik7XG5cbiAgY29uc3QgcmV0cnlQb2xpY3kgPSBfZ2V0UmV0cnlQb2xpY3lGcm9tU3RvcmFnZSgpO1xuICBzZXRWYWx1ZSgnc2V0dGluZ3MtcmV0cnktYmFzZS1tcycsIHJldHJ5UG9saWN5LmJhc2VNcyk7XG4gIHNldFZhbHVlKCdzZXR0aW5ncy1yZXRyeS1jYXAtbXMnLCByZXRyeVBvbGljeS5jYXBNcyk7XG4gIHNldFZhbHVlKCdzZXR0aW5ncy1yZXRyeS1tYXgtYXR0ZW1wdHMnLCByZXRyeVBvbGljeS5tYXhBdHRlbXB0cyk7XG4gIHNldENoZWNrZWQoJ3NldHRpbmdzLXJldHJ5LWF1dG8nLCByZXRyeVBvbGljeS5hdXRvUmV0cnkpO1xuXG4gIF9yZW5kZXJTZXR0aW5nc1NvdXJjZXMocGF5bG9hZC5tZXRhIHx8IHt9LCBydW50aW1lT3ZlcnJpZGVzKTtcblxuICBjb25zdCBwYXRoRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dGluZ3MtY29uZmlnLXBhdGgnKTtcbiAgaWYgKHBhdGhFbCkge1xuICAgIHBhdGhFbC50ZXh0Q29udGVudCA9IHBheWxvYWQ/Lm1ldGE/LmNvbmZpZ19wYXRoXG4gICAgICA/IGBDb25maWcgZmlsZTogJHtwYXlsb2FkLm1ldGEuY29uZmlnX3BhdGh9YFxuICAgICAgOiAnJztcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZWxvYWRTZXR0aW5nc01vZGFsKCkge1xuICB0cnkge1xuICAgIF9zZXRTZXR0aW5nc1N0YXR1cygnTG9hZGluZyBzZXR0aW5ncy4uLicsICdpbmZvJyk7XG4gICAgY29uc3QgW3Jlc3VsdCwgc3RhdHVzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtmZXRjaFNldHRpbmdzKCksIGZldGNoU3RhdHVzKCkuY2F0Y2goKCkgPT4gbnVsbCldKTtcbiAgICBfcmVuZGVyU2V0dGluZ3NUb0Zvcm0ocmVzdWx0KTtcbiAgICAvLyBhaV9hdHRyaWJ1dGlvbiBpcyBwZXItc2Vzc2lvbiwgbm90IGluIGNvbmZpZy55YW1sIFx1MjAxNCByZWFkIGZyb20gc2Vzc2lvbiBzdGF0dXNcbiAgICBjb25zdCBhdHRyRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dGluZ3MtZ2VuLWFpLWF0dHJpYnV0aW9uJyk7XG4gICAgaWYgKGF0dHJFbCAmJiBzdGF0dXMpIGF0dHJFbC5jaGVja2VkID0gQm9vbGVhbihzdGF0dXMuYWlfYXR0cmlidXRpb24pO1xuICAgIF9zZXRTZXR0aW5nc1N0YXR1cygnU2V0dGluZ3MgbG9hZGVkLicsICdzdWNjZXNzJyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgX3NldFNldHRpbmdzU3RhdHVzKGBGYWlsZWQgdG8gbG9hZCBzZXR0aW5nczogJHtlcnJvci5tZXNzYWdlIHx8IGVycm9yfWAsICdlcnJvcicpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNhdmVTZXR0aW5nc01vZGFsKCkge1xuICBjb25zdCBzYXZlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHRpbmdzLXNhdmUtYnRuJyk7XG4gIHRyeSB7XG4gICAgaWYgKHNhdmVCdG4pIHtcbiAgICAgIHNhdmVCdG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgc2F2ZUJ0bi50ZXh0Q29udGVudCA9ICdTYXZpbmcuLi4nO1xuICAgIH1cbiAgICBfc2V0U2V0dGluZ3NTdGF0dXMoJ1NhdmluZyBzZXR0aW5ncy4uLicsICdpbmZvJyk7XG4gICAgY29uc3QgcGF5bG9hZCA9IF9jb2xsZWN0U2V0dGluZ3NQYXlsb2FkRnJvbUZvcm0oKTtcbiAgICBjb25zdCBhaUF0dHJpYnV0aW9uID0gQm9vbGVhbihwYXlsb2FkLmdlbmVyYXRpb24/LmFpX2F0dHJpYnV0aW9uKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB1cGRhdGVTZXR0aW5ncyhwYXlsb2FkKTtcbiAgICBfc2F2ZVJldHJ5UG9saWN5VG9TdG9yYWdlKF9jb2xsZWN0UmV0cnlQb2xpY3lGcm9tRm9ybSgpKTtcbiAgICBfc2V0dGluZ3NEYXRhID0gcmVzdWx0O1xuICAgIF9yZW5kZXJTZXR0aW5nc1RvRm9ybShyZXN1bHQpO1xuICAgIC8vIGFpX2F0dHJpYnV0aW9uIGlzIHBlci1zZXNzaW9uIHN0YXRlLCBub3QgYSBjb25maWcueWFtbCBrZXkgXHUyMDE0IHNhdmUgaXQgc2VwYXJhdGVseVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBhcGlDYWxsKCdQT1NUJywgJy9hcGkvZ2VuZXJhdGlvbi1zZXR0aW5ncycsIHsgYWlfYXR0cmlidXRpb246IGFpQXR0cmlidXRpb24gfSk7XG4gICAgfSBjYXRjaCAoXykgeyAvKiBub24tZmF0YWwgKi8gfVxuICAgIF9zZXRTZXR0aW5nc1N0YXR1cygnU2V0dGluZ3Mgc2F2ZWQgc3VjY2Vzc2Z1bGx5LicsICdzdWNjZXNzJyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgX3NldFNldHRpbmdzU3RhdHVzKGBGYWlsZWQgdG8gc2F2ZSBzZXR0aW5nczogJHtlcnJvci5tZXNzYWdlIHx8IGVycm9yfWAsICdlcnJvcicpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChzYXZlQnRuKSB7XG4gICAgICBzYXZlQnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICBzYXZlQnRuLnRleHRDb250ZW50ID0gJ1NhdmUgU2V0dGluZ3MnO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBvcGVuU2V0dGluZ3NNb2RhbCgpIHtcbiAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR0aW5ncy1tb2RhbC1vdmVybGF5Jyk7XG4gIGlmICghb3ZlcmxheSkgcmV0dXJuO1xuICBvdmVybGF5LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIF9mb2N1c1N0YWNrLnB1c2goZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7XG4gIHNldEluaXRpYWxGb2N1cygnc2V0dGluZ3MtbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ3NldHRpbmdzLW1vZGFsLW92ZXJsYXknKTtcbiAgYXdhaXQgcmVsb2FkU2V0dGluZ3NNb2RhbCgpO1xufVxuXG5mdW5jdGlvbiBjbG9zZVNldHRpbmdzTW9kYWwoKSB7XG4gIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dGluZ3MtbW9kYWwtb3ZlcmxheScpO1xuICBpZiAob3ZlcmxheSkgb3ZlcmxheS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICByZXN0b3JlRm9jdXMoKTtcbn1cblxuLyoqXG4gKiBHZXQgYWxsIGZvY3VzYWJsZSBlbGVtZW50cyB3aXRoaW4gYSBjb250YWluZXIuXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBjb250YWluZXIgLSBUaGUgbW9kYWwgb3IgY29udGFpbmVyIGVsZW1lbnRcbiAqIEByZXR1cm5zIHtIVE1MRWxlbWVudFtdfSBBcnJheSBvZiBmb2N1c2FibGUgZWxlbWVudHNcbiAqL1xuZnVuY3Rpb24gZ2V0Rm9jdXNhYmxlRWxlbWVudHMoY29udGFpbmVyKSB7XG4gIGNvbnN0IGZvY3VzYWJsZVNlbGVjdG9ycyA9IFtcbiAgICAnYVtocmVmXScsICdidXR0b246bm90KFtkaXNhYmxlZF0pJywgJ2lucHV0Om5vdChbZGlzYWJsZWRdKScsXG4gICAgJ3RleHRhcmVhOm5vdChbZGlzYWJsZWRdKScsICdzZWxlY3Q6bm90KFtkaXNhYmxlZF0pJyxcbiAgICAnW3RhYmluZGV4XTpub3QoW3RhYmluZGV4PVwiLTFcIl0pJyxcbiAgXS5qb2luKCcsICcpO1xuICByZXR1cm4gQXJyYXkuZnJvbShjb250YWluZXIucXVlcnlTZWxlY3RvckFsbChmb2N1c2FibGVTZWxlY3RvcnMpKTtcbn1cblxuLyoqXG4gKiBTZXQgaW5pdGlhbCBmb2N1cyB0byB0aGUgZmlyc3QgZm9jdXNhYmxlIGVsZW1lbnQgaW4gYSBtb2RhbC5cbiAqIFByaW9yaXRpemVzIGVsZW1lbnRzIHdpdGggaWQ9XCJbbW9kYWxJZF0tZm9jdXMtdGFyZ2V0XCIgaWYgcHJlc2VudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RhbElkIC0gSUQgb2YgdGhlIG1vZGFsXG4gKi9cbmZ1bmN0aW9uIHNldEluaXRpYWxGb2N1cyhtb2RhbElkKSB7XG4gIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobW9kYWxJZCk7XG4gIGlmICghbW9kYWwpIHJldHVybjtcblxuICAvLyBUcnkgdG8gZm9jdXMgYW4gZXhwbGljaXQgdGFyZ2V0IChlLmcuLCBpbnB1dCBmaWVsZCB3aXRoIGNsYXNzL2lkKVxuICBjb25zdCBmb2N1c1RhcmdldCA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWZvY3VzLXRhcmdldD1cInRydWVcIl0nKSB8fFxuICAgICAgICAgICAgICAgICAgICAgIG1vZGFsLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W3R5cGU9XCJ0ZXh0XCJdJykgfHxcbiAgICAgICAgICAgICAgICAgICAgICBtb2RhbC5xdWVyeVNlbGVjdG9yKCdidXR0b24nKTtcblxuICBpZiAoZm9jdXNUYXJnZXQpIHtcbiAgICAvLyBTbWFsbCBkZWxheSB0byBlbnN1cmUgbW9kYWwgcmVuZGVyICsgYWN0dWFsIGRpc3BsYXlcbiAgICBzZXRUaW1lb3V0KCgpID0+IGZvY3VzVGFyZ2V0LmZvY3VzKCksIDUwKTtcbiAgfVxufVxuXG4vKipcbiAqIFRyYXAgZm9jdXMgd2l0aGluIGEgbW9kYWwgdXNpbmcgVGFiL1NoaWZ0K1RhYi5cbiAqIFByZXZlbnRzIHVzZXIgdGFiYmluZyB0byBlbGVtZW50cyBvdXRzaWRlIHRoZSBtb2RhbC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RhbElkIC0gSUQgb2YgdGhlIG1vZGFsXG4gKi9cbmZ1bmN0aW9uIHRyYXBGb2N1cyhtb2RhbElkKSB7XG4gIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobW9kYWxJZCk7XG4gIGlmICghbW9kYWwpIHJldHVybjtcblxuICBjb25zdCBmb2N1c2FibGVFbGVtZW50cyA9IGdldEZvY3VzYWJsZUVsZW1lbnRzKG1vZGFsKTtcbiAgaWYgKGZvY3VzYWJsZUVsZW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIGNvbnN0IGZpcnN0RWxlbWVudCA9IGZvY3VzYWJsZUVsZW1lbnRzWzBdO1xuICBjb25zdCBsYXN0RWxlbWVudCA9IGZvY3VzYWJsZUVsZW1lbnRzW2ZvY3VzYWJsZUVsZW1lbnRzLmxlbmd0aCAtIDFdO1xuXG4gIGNvbnN0IGxpc3RlbmVyID0gKGUpID0+IHtcbiAgICBpZiAoZS5rZXkgIT09ICdUYWInKSByZXR1cm47XG5cbiAgICBjb25zdCBpc1NoaWZ0ID0gZS5zaGlmdEtleTtcbiAgICBjb25zdCBhY3RpdmVFbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG5cbiAgICBpZiAoaXNTaGlmdCkge1xuICAgICAgaWYgKGFjdGl2ZUVsID09PSBmaXJzdEVsZW1lbnQpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBsYXN0RWxlbWVudC5mb2N1cygpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoYWN0aXZlRWwgPT09IGxhc3RFbGVtZW50KSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZmlyc3RFbGVtZW50LmZvY3VzKCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBsaXN0ZW5lcik7XG4gIF9mb2N1c1RyYXBTdGFjay5wdXNoKGxpc3RlbmVyKTtcbn1cblxuLyoqXG4gKiBSZXN0b3JlIGZvY3VzIHRvIHRoZSBlbGVtZW50IHRoYXQgb3BlbmVkIHRoZSBtb2RhbC5cbiAqL1xuZnVuY3Rpb24gcmVzdG9yZUZvY3VzKCkge1xuICBjb25zdCBlbCA9IF9mb2N1c1N0YWNrLnBvcCgpO1xuICBpZiAoZWwgJiYgdHlwZW9mIGVsLmZvY3VzID09PSAnZnVuY3Rpb24nKSBlbC5mb2N1cygpO1xuXG4gIGNvbnN0IGxpc3RlbmVyID0gX2ZvY3VzVHJhcFN0YWNrLnBvcCgpO1xuICBpZiAobGlzdGVuZXIpIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBsaXN0ZW5lcik7XG59XG5cbmZ1bmN0aW9uIHB1c2hGb2N1c1N0YWNrKGVsKSB7XG4gIF9mb2N1c1N0YWNrLnB1c2goZWwgfHwgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7XG59XG5cbi8qKiBNYXBzIGVhY2ggd29ya2Zsb3cgc3RhZ2UgKHRvcCBiYXIpIHRvIHRoZSB0YWJzIHNob3duIGluIHRoZSBzZWNvbmQgbmF2IGJhci4gKi9cbmNvbnN0IFNUQUdFX1RBQlMgPSB7XG4gIGpvYjogICAgICAgICAgICBbJ2pvYicsICdtYXN0ZXInXSxcbiAgYW5hbHlzaXM6ICAgICAgIFsnYW5hbHlzaXMnXSxcbiAgY3VzdG9taXphdGlvbnM6IFsnZ29hbHMnLCAncXVlc3Rpb25zJywgJ2V4cC1yZXZpZXcnLCAnYWNoLWVkaXRvcicsICdza2lsbHMtcmV2aWV3JywgJ2FjaGlldmVtZW50cy1yZXZpZXcnLCAndGFnbGluZS1yZXZpZXcnLCAnc3VtbWFyeS1yZXZpZXcnLCAncHVibGljYXRpb25zLXJldmlldycsICdhdHMtc2NvcmUnXSxcbiAgcmV3cml0ZTogICAgICAgIFsncmV3cml0ZSddLFxuICBzcGVsbDogICAgICAgICAgWydzcGVsbCddLFxuICBsYXlvdXQ6ICAgICAgICAgWydsYXlvdXQnXSxcbiAgZG93bmxvYWQ6ICAgICAgIFsnZmluYWxfZ2VuZXJhdGUnLCAnZG93bmxvYWQnXSxcbiAgY292ZXJfbGV0dGVyOiAgIFsnY292ZXItbGV0dGVyJ10sXG4gIHNjcmVlbmluZzogICAgICBbJ3NjcmVlbmluZyddLFxuICBpbnRlcnZpZXdfcHJlcDogWydpbnRlcnZpZXctcHJlcCddLFxuICB0aGFua195b3U6ICAgICAgWyd0aGFuay15b3UnXSxcbiAgaGFydmVzdDogICAgICAgIFsnaGFydmVzdCddLFxufTtcblxuLyoqXG4gKiBDdXN0b20gY29uZmlybSBkaWFsb2cgXHUyMDE0IHJldHVybnMgYSBQcm9taXNlPGJvb2xlYW4+LlxuICogUmVwbGFjZXMgYnJvd3NlciBjb25maXJtKCkgd2hpY2ggY2FuIGJlIHNpbGVudGx5IHN1cHByZXNzZWQgb25jZSB0aGUgdXNlclxuICogY2hlY2tzIFwiUHJldmVudCB0aGlzIHBhZ2UgZnJvbSBjcmVhdGluZyBhZGRpdGlvbmFsIGRpYWxvZ3NcIi5cbiAqXG4gKiBVc2FnZTogIGlmIChhd2FpdCBjb25maXJtRGlhbG9nKCdBcmUgeW91IHN1cmU/JykpIHsgLi4uIH1cbiAqL1xuZnVuY3Rpb24gY29uZmlybURpYWxvZyhtZXNzYWdlLCB7IGNvbmZpcm1MYWJlbCA9ICdPSycsIGNhbmNlbExhYmVsID0gJ0NhbmNlbCcsIGRhbmdlciA9IGZhbHNlIH0gPSB7fSkge1xuICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgY29uc3QgcHJldmlvdXNGb2N1cyA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG5cbiAgICAvLyBSZXVzZSBvciBjcmVhdGUgdGhlIHNoYXJlZCBvdmVybGF5IGVsZW1lbnRcbiAgICBsZXQgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb25maXJtLWRpYWxvZy1vdmVybGF5Jyk7XG4gICAgaWYgKCFvdmVybGF5KSB7XG4gICAgICBvdmVybGF5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBvdmVybGF5LmlkID0gJ2NvbmZpcm0tZGlhbG9nLW92ZXJsYXknO1xuICAgICAgb3ZlcmxheS5zdHlsZS5jc3NUZXh0ID1cbiAgICAgICAgJ2Rpc3BsYXk6bm9uZTsgcG9zaXRpb246Zml4ZWQ7IGluc2V0OjA7IGJhY2tncm91bmQ6cmdiYSgwLDAsMCwwLjQ1KTsgei1pbmRleDo5OTk5OycgK1xuICAgICAgICAnYWxpZ24taXRlbXM6Y2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyOyc7XG4gICAgICBvdmVybGF5LmlubmVySFRNTCA9XG4gICAgICAgICc8ZGl2IGlkPVwiY29uZmlybS1kaWFsb2ctYm94XCIgcm9sZT1cImRpYWxvZ1wiIGFyaWEtbW9kYWw9XCJ0cnVlXCInICtcbiAgICAgICAgJyBhcmlhLWxhYmVsbGVkYnk9XCJjb25maXJtLWRpYWxvZy1tc2dcIicgK1xuICAgICAgICAnIHN0eWxlPVwiYmFja2dyb3VuZDojZmZmOyBib3JkZXItcmFkaXVzOjhweDsgcGFkZGluZzoyNHB4IDI4cHg7JyArXG4gICAgICAgICdtYXgtd2lkdGg6NDAwcHg7IHdpZHRoOjkwJTsgYm94LXNoYWRvdzowIDhweCAzMnB4IHJnYmEoMCwwLDAsMC4xOCk7IGZvbnQtZmFtaWx5OmluaGVyaXQ7XCI+JyArXG4gICAgICAgICc8cCBpZD1cImNvbmZpcm0tZGlhbG9nLW1zZ1wiIHN0eWxlPVwibWFyZ2luOjAgMCAyMHB4OyBmb250LXNpemU6MC45NWVtOyBjb2xvcjojMWUyOTNiOyB3aGl0ZS1zcGFjZTpwcmUtd3JhcDtcIj48L3A+JyArXG4gICAgICAgICc8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4OyBnYXA6OHB4OyBqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmQ7XCI+JyArXG4gICAgICAgICc8YnV0dG9uIGlkPVwiY29uZmlybS1kaWFsb2ctY2FuY2VsXCIgc3R5bGU9XCJwYWRkaW5nOjZweCAxNnB4OyBib3JkZXI6MXB4IHNvbGlkICNjYmQ1ZTE7JyArXG4gICAgICAgICdib3JkZXItcmFkaXVzOjVweDsgYmFja2dyb3VuZDojZjhmYWZjOyBjdXJzb3I6cG9pbnRlcjsgY29sb3I6IzQ3NTU2OTtcIj48L2J1dHRvbj4nICtcbiAgICAgICAgJzxidXR0b24gaWQ9XCJjb25maXJtLWRpYWxvZy1va1wiIHN0eWxlPVwicGFkZGluZzo2cHggMTZweDsgYm9yZGVyOm5vbmU7JyArXG4gICAgICAgICdib3JkZXItcmFkaXVzOjVweDsgY3Vyc29yOnBvaW50ZXI7IGNvbG9yOiNmZmY7IGZvbnQtd2VpZ2h0OjYwMDtcIj48L2J1dHRvbj4nICtcbiAgICAgICAgJzwvZGl2PjwvZGl2Pic7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG92ZXJsYXkpO1xuICAgIH1cblxuICAgIGNvbnN0IG9rQnRuICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb25maXJtLWRpYWxvZy1vaycpO1xuICAgIGNvbnN0IGNhbmNlbEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb25maXJtLWRpYWxvZy1jYW5jZWwnKTtcbiAgICBjb25zdCBtc2dFbCAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29uZmlybS1kaWFsb2ctbXNnJyk7XG5cbiAgICBtc2dFbC50ZXh0Q29udGVudCAgICAgICAgICA9IG1lc3NhZ2U7XG4gICAgb2tCdG4udGV4dENvbnRlbnQgICAgICAgICAgPSBjb25maXJtTGFiZWw7XG4gICAgY2FuY2VsQnRuLnRleHRDb250ZW50ICAgICAgPSBjYW5jZWxMYWJlbDtcbiAgICBva0J0bi5zdHlsZS5iYWNrZ3JvdW5kICAgICA9IGRhbmdlciA/ICcjZGMyNjI2JyA6ICcjM2I4MmY2JztcblxuICAgIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICBva0J0bi5mb2N1cygpO1xuXG4gICAgLy8gRm9jdXMgdHJhcCBcdTIwMTQga2VlcCBUYWIvU2hpZnQrVGFiIGluc2lkZSB0aGUgdHdvIGJ1dHRvbnNcbiAgICBjb25zdCB0cmFwRm9jdXMgPSAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ICE9PSAnVGFiJykgcmV0dXJuO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgY29uc3QgZm9jdXNlZCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoZS5zaGlmdEtleSkge1xuICAgICAgICAoZm9jdXNlZCA9PT0gY2FuY2VsQnRuID8gb2tCdG4gOiBjYW5jZWxCdG4pLmZvY3VzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAoZm9jdXNlZCA9PT0gb2tCdG4gPyBjYW5jZWxCdG4gOiBva0J0bikuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIG92ZXJsYXkuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRyYXBGb2N1cyk7XG5cbiAgICBjb25zdCBmaW5pc2ggPSAocmVzdWx0KSA9PiB7XG4gICAgICBvdmVybGF5LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICBvdmVybGF5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0cmFwRm9jdXMpO1xuICAgICAgLy8gUmVtb3ZlIGxpc3RlbmVycyB0byBhdm9pZCBzdGFja2luZyBoYW5kbGVyc1xuICAgICAgb2tCdG4ucmVwbGFjZVdpdGgob2tCdG4uY2xvbmVOb2RlKHRydWUpKTtcbiAgICAgIGNhbmNlbEJ0bi5yZXBsYWNlV2l0aChjYW5jZWxCdG4uY2xvbmVOb2RlKHRydWUpKTtcbiAgICAgIGlmIChwcmV2aW91c0ZvY3VzICYmIHR5cGVvZiBwcmV2aW91c0ZvY3VzLmZvY3VzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHByZXZpb3VzRm9jdXMuZm9jdXMoKTtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICB9O1xuXG4gICAgLy8gRXNjYXBlIGtleSBjYW5jZWxzXG4gICAgb3ZlcmxheS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGUpID0+IHsgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgZmluaXNoKGZhbHNlKTsgfSwgeyBvbmNlOiB0cnVlIH0pO1xuXG4gICAgLy8gUmViaW5kIGNsb25lZCBidXR0b25zXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbmZpcm0tZGlhbG9nLW9rJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAgICAgKCkgPT4gZmluaXNoKHRydWUpLCAgeyBvbmNlOiB0cnVlIH0pO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb25maXJtLWRpYWxvZy1jYW5jZWwnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IGZpbmlzaChmYWxzZSksIHsgb25jZTogdHJ1ZSB9KTtcbiAgICBvdmVybGF5LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZSA9PiB7IGlmIChlLnRhcmdldCA9PT0gb3ZlcmxheSkgZmluaXNoKGZhbHNlKTsgfSwgeyBvbmNlOiB0cnVlIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplIHRoZSBhcHBsaWNhdGlvbiBvbiBET00gcmVhZHkuXG4gKiBTZXRzIHVwIGV2ZW50IGxpc3RlbmVycywgcmVzdG9yZXMgc2Vzc2lvbiwgYW5kIGxvYWRzIGluaXRpYWwgdGFiLlxuICovXG4vKipcbiAqIFNldCB1cCBhbGwgZ2xvYmFsIGV2ZW50IGxpc3RlbmVycy5cbiAqL1xuZnVuY3Rpb24gc2V0dXBFdmVudExpc3RlbmVycygpIHtcbiAgLy8gVGFiIGJ1dHRvbnNcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnRhYicpLmZvckVhY2godGFiID0+IHtcbiAgICB0YWIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgY29uc3QgdGFiTmFtZSA9IGUudGFyZ2V0LmlkLnJlcGxhY2UoJ3RhYi0nLCAnJyk7XG4gICAgICBzd2l0Y2hUYWIodGFiTmFtZSk7XG4gICAgfSk7XG5cbiAgICAvLyBLZXlib2FyZCBuYXZpZ2F0aW9uIGZvciB0YWJzIChXQ0FHIDIuMSBBQSB0YWJsaXN0IHBhdHRlcm4pXG4gICAgdGFiLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4ge1xuICAgICAgLy8gRW50ZXIvU3BhY2UgYWN0aXZhdGUgdGhlIGZvY3VzZWQgdGFiXG4gICAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicgfHwgZS5rZXkgPT09ICcgJykge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUudGFyZ2V0LmNsaWNrKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIEFycm93L0hvbWUvRW5kIG5hdmlnYXRlIGFuZCBhY3RpdmF0ZVxuICAgICAgaWYgKFsnQXJyb3dMZWZ0JywgJ0Fycm93UmlnaHQnLCAnSG9tZScsICdFbmQnXS5pbmNsdWRlcyhlLmtleSkpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjb25zdCB0YWJzID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudGFiOm5vdChbc3R5bGUqPVwiZGlzcGxheTogbm9uZVwiXSknKSk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IHRhYnMuaW5kZXhPZihlLnRhcmdldCk7XG5cbiAgICAgICAgbGV0IG5leHRUYWI7XG4gICAgICAgIGlmIChlLmtleSA9PT0gJ0Fycm93TGVmdCcgfHwgZS5rZXkgPT09ICdIb21lJykge1xuICAgICAgICAgIG5leHRUYWIgPSBlLmtleSA9PT0gJ0hvbWUnID8gdGFic1swXSA6IHRhYnNbKGN1cnJlbnRJbmRleCAtIDEgKyB0YWJzLmxlbmd0aCkgJSB0YWJzLmxlbmd0aF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV4dFRhYiA9IGUua2V5ID09PSAnRW5kJyA/IHRhYnNbdGFicy5sZW5ndGggLSAxXSA6IHRhYnNbKGN1cnJlbnRJbmRleCArIDEpICUgdGFicy5sZW5ndGhdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5leHRUYWIpIHtcbiAgICAgICAgICBuZXh0VGFiLmZvY3VzKCk7XG4gICAgICAgICAgbmV4dFRhYi5jbGljaygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIE1lc3NhZ2UgaW5wdXQgKEVudGVyIGtleSB0byBzZW5kKVxuICBjb25zdCBtZXNzYWdlSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWVzc2FnZS1pbnB1dCcpO1xuICBpZiAobWVzc2FnZUlucHV0KSB7XG4gICAgbWVzc2FnZUlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXByZXNzJywgKGUpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJyAmJiAhZS5zaGlmdEtleSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcy5zZW5kTWVzc2FnZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGdsb2JhbFRoaXMuc2VuZE1lc3NhZ2UoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gTW9kYWwgY2xvc2Ugb24gRVNDIGtleVxuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGUpID0+IHtcbiAgICBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICBjbG9zZUFsbE1vZGFscygpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gQ2xvc2UgbW9kYWxzIG9uIGJhY2tncm91bmQgY2xpY2tcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW3JvbGU9XCJkaWFsb2dcIl0nKS5mb3JFYWNoKG1vZGFsID0+IHtcbiAgICBtb2RhbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICBpZiAoZS50YXJnZXQgPT09IG1vZGFsKSB7XG4gICAgICAgIGNsb3NlTW9kYWwobW9kYWwuaWQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdGhlIHN0YWdlIHRoYXQgb3ducyBhIGdpdmVuIHRhYiwgb3IgbnVsbCBpZiB1bm1hcHBlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWJcbiAqIEByZXR1cm5zIHtzdHJpbmd8bnVsbH1cbiAqL1xuZnVuY3Rpb24gZ2V0U3RhZ2VGb3JUYWIodGFiKSB7XG4gIGZvciAoY29uc3QgW3N0YWdlLCB0YWJzXSBvZiBPYmplY3QuZW50cmllcyhTVEFHRV9UQUJTKSkge1xuICAgIGlmICh0YWJzLmluY2x1ZGVzKHRhYikpIHJldHVybiBzdGFnZTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0VmlzaWJsZVN0YWdlKCkge1xuICBjb25zdCBhY3RpdmVUYWIgPSBzdGF0ZU1hbmFnZXIuZ2V0Q3VycmVudFRhYigpO1xuICByZXR1cm4gZ2V0U3RhZ2VGb3JUYWIoYWN0aXZlVGFiKSB8fCBnZXRXb3JrZmxvd1N0ZXBGb3JQaGFzZShzdGF0ZU1hbmFnZXIuZ2V0UGhhc2UoKSk7XG59XG5cbi8qKlxuICogU2hvdy9oaWRlIHRoZSBzY3JvbGwgYXJyb3cgYnV0dG9ucyBiYXNlZCBvbiB3aGV0aGVyIHRoZSB0YWIgYmFyIGlzIHNjcm9sbGFibGUuXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZVRhYlNjcm9sbEJ1dHRvbnMoKSB7XG4gIGNvbnN0IHRhYkJhciAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFiLWJhcicpO1xuICBjb25zdCBsZWZ0QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYi1zY3JvbGwtbGVmdCcpO1xuICBjb25zdCByaWdodEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWItc2Nyb2xsLXJpZ2h0Jyk7XG4gIGlmICghdGFiQmFyIHx8ICFsZWZ0QnRuIHx8ICFyaWdodEJ0bikgcmV0dXJuO1xuICBsZWZ0QnRuLnN0eWxlLmRpc3BsYXkgID0gdGFiQmFyLnNjcm9sbExlZnQgPiAwID8gJycgOiAnbm9uZSc7XG4gIHJpZ2h0QnRuLnN0eWxlLmRpc3BsYXkgPSB0YWJCYXIuc2Nyb2xsTGVmdCA8IHRhYkJhci5zY3JvbGxXaWR0aCAtIHRhYkJhci5jbGllbnRXaWR0aCAtIDEgPyAnJyA6ICdub25lJztcbn1cblxuLyoqXG4gKiBTaG93IG9ubHkgdGhlIHRhYnMgdGhhdCBiZWxvbmcgdG8gdGhlIGdpdmVuIHN0YWdlIGluIHRoZSBzZWNvbmQgbmF2IGJhci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzdGFnZSAtIEtleSBmcm9tIFNUQUdFX1RBQlNcbiAqL1xuZnVuY3Rpb24gdXBkYXRlVGFiQmFyRm9yU3RhZ2Uoc3RhZ2UpIHtcbiAgY29uc3Qgc3RhZ2VUYWJzID0gU1RBR0VfVEFCU1tzdGFnZV0gfHwgW107XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50YWInKS5mb3JFYWNoKHRhYiA9PiB7XG4gICAgdGFiLnN0eWxlLmRpc3BsYXkgPSBzdGFnZVRhYnMuaW5jbHVkZXModGFiLmRhdGFzZXQudGFiKSA/ICcnIDogJ25vbmUnO1xuICB9KTtcbiAgLy8gUmVzZXQgc2Nyb2xsIHBvc2l0aW9uIHRvIHNob3cgYWN0aXZlIHRhYiwgdGhlbiByZWZyZXNoIGFycm93IHZpc2liaWxpdHlcbiAgY29uc3QgdGFiQmFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYi1iYXInKTtcbiAgaWYgKHRhYkJhcikgdGFiQmFyLnNjcm9sbExlZnQgPSAwO1xuICB1cGRhdGVUYWJTY3JvbGxCdXR0b25zKCk7XG5cbiAgLy8gR0FQLTE2IChQYXJ0IEEpOiBzdXJmYWNlIHdoaWNoIHdvcmtmbG93IHN0ZXAncyBzdWItdGFicyBhcmUgY3VycmVudGx5XG4gIC8vIHNob3duLiBWaXNpYmxlLW9ubHkgbGFiZWwgXHUyMDE0IG5vIGFyaWEtbGl2ZSBoZXJlOyBzd2l0Y2hUYWIoKSBpblxuICAvLyByZXZpZXctdGFibGUtYmFzZS5qcyBpcyB0aGUgc29sZSBsaXZlLXNwZWVjaCBzb3VyY2UgZm9yIHRoaXMgZXZlbnQsIHRvXG4gIC8vIGF2b2lkIGEgZG91YmxlLWFubm91bmNlIGZyb20gdHdvIGluZGVwZW5kZW50IGxpdmUgcmVnaW9ucy5cbiAgY29uc3QgbGFiZWxFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWItc3RhZ2UtbGFiZWwnKTtcbiAgaWYgKGxhYmVsRWwpIHtcbiAgICBjb25zdCBzdGVwTGFiZWwgPSBfU1RFUF9ESVNQTEFZW3N0YWdlXSB8fCBzdGFnZTtcbiAgICBsYWJlbEVsLnRleHRDb250ZW50ID0gc3RlcExhYmVsID8gYE5vdyB2aWV3aW5nOiAke3N0ZXBMYWJlbH1gIDogJyc7XG4gIH1cbn1cblxuLy8gbG9hZFRhYkNvbnRlbnQoKSBsaXZlcyBpbiB3ZWIvcmV2aWV3LXRhYmxlLWJhc2UuanMsIHdoaWNoIG93bnMgdGhlXG4vLyBmdWxsIH4yMC1jYXNlIHRhYiBkaXNwYXRjaCAodGhpcyBmaWxlJ3MgY29weSBvbmx5IGV2ZXIgaGFuZGxlZCA1IG9mIHRoZW1cbi8vIGFuZCB3YXMgbmV2ZXIgY2FsbGVkIGludGVybmFsbHkgXHUyMDE0IGRlYWQgY29kZSwgc3VwZXJzZWRlZCBvbmNlIHRoZSB0YWJcbi8vIHN5c3RlbSBncmV3KS4gcmV2aWV3LXRhYmxlLWJhc2UuanMncyB2ZXJzaW9uIG5vdyBjYXJyaWVzIHRoZSBzYW1lXG4vLyBzYWZlIHRleHRDb250ZW50LWJhc2VkIGVycm9yIHJlbmRlcmluZyB0aGlzIGNvcHkgaGFkOyBzZWUgaXRzIG93blxuLy8gdHJ5L2NhdGNoLiBSZW1vdmVkIGhlcmUgcmF0aGVyIHRoYW4gbGVmdCB0byBkcmlmdCBmdXJ0aGVyIG91dCBvZiBzeW5jLlxuXG4vKipcbiAqIFRvZ2dsZSBjb2xsYXBzaWJsZSBjaGF0IHBhbmVsIChpbnRlcmFjdGlvbiBhcmVhKS5cbiAqL1xuZnVuY3Rpb24gdG9nZ2xlQ2hhdCgpIHtcbiAgY29uc3QgaW50ZXJhY3Rpb25BcmVhID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmludGVyYWN0aW9uLWFyZWEnKTtcbiAgY29uc3Qgdmlld2VyQXJlYSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy52aWV3ZXItYXJlYScpO1xuXG4gIGlmIChpbnRlcmFjdGlvbkFyZWEpIHtcbiAgICBjb25zdCBpc0NvbGxhcHNlZCA9IGludGVyYWN0aW9uQXJlYS5jbGFzc0xpc3QudG9nZ2xlKCdjb2xsYXBzZWQnKTtcbiAgICBpZiAodmlld2VyQXJlYSkge1xuICAgICAgdmlld2VyQXJlYS5zdHlsZS5mbGV4ID0gaXNDb2xsYXBzZWQgPyAnMSAxIDEwMCUnIDogJzAgMSA2MCUnO1xuICAgIH1cbiAgICAvLyBLZWVwIGFyaWEtbGFiZWwgYW5kIGFyaWEtZXhwYW5kZWQgaW4gc3luYyB3aXRoIGNvbGxhcHNlZCBzdGF0ZVxuICAgIGNvbnN0IHRvZ2dsZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2dnbGUtY2hhdCcpO1xuICAgIGlmICh0b2dnbGVCdG4pIHtcbiAgICAgIHRvZ2dsZUJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCBTdHJpbmcoIWlzQ29sbGFwc2VkKSk7XG4gICAgICB0b2dnbGVCdG4uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgaXNDb2xsYXBzZWQgPyAnRXhwYW5kIGNoYXQgcGFuZWwnIDogJ0NvbGxhcHNlIGNoYXQgcGFuZWwnKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFN0b3JhZ2VLZXlzLkNIQVRfQ09MTEFQU0VELCBpc0NvbGxhcHNlZCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nLndhcm4oJ0NvdWxkIG5vdCBzYXZlIGNoYXQgc3RhdGUnKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBPcGVuIGEgbW9kYWwgYnkgSUQuXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kYWxJZCAtIElEIG9mIG1vZGFsIGVsZW1lbnRcbiAqL1xuZnVuY3Rpb24gb3Blbk1vZGFsKG1vZGFsSWQpIHtcbiAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChtb2RhbElkKTtcbiAgaWYgKG1vZGFsKSB7XG4gICAgLy8gU2F2ZSBmb2N1cyBiZWZvcmUgb3BlbmluZyBtb2RhbFxuICAgIF9mb2N1c1N0YWNrLnB1c2goZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7XG5cbiAgICBtb2RhbC5jbGFzc0xpc3QuYWRkKCd2aXNpYmxlJyk7XG4gICAgbW9kYWwuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICdmYWxzZScpO1xuICAgIC8vIExvY2sgYm9keSBzY3JvbGxcbiAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XG5cbiAgICAvLyBTZXQgaW5pdGlhbCBmb2N1cyBhbmQgdHJhcCBmb2N1cyB3aXRoaW4gbW9kYWxcbiAgICBzZXRJbml0aWFsRm9jdXMobW9kYWxJZCk7XG4gICAgdHJhcEZvY3VzKG1vZGFsSWQpO1xuICB9XG59XG5cbi8qKlxuICogQ2xvc2UgYSBtb2RhbCBieSBJRC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RhbElkIC0gSUQgb2YgbW9kYWwgZWxlbWVudFxuICovXG5mdW5jdGlvbiBjbG9zZU1vZGFsKG1vZGFsSWQpIHtcbiAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChtb2RhbElkKTtcbiAgaWYgKG1vZGFsKSB7XG4gICAgaWYgKG1vZGFsLmRhdGFzZXQuZGlzbWlzc0Rpc2FibGVkID09PSAnMScpIHJldHVybjtcbiAgICBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJyk7XG4gICAgbW9kYWwuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7XG4gICAgLy8gUmVzdG9yZSBib2R5IHNjcm9sbFxuICAgIGlmICghZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW3JvbGU9XCJkaWFsb2dcIl0udmlzaWJsZScpKSB7XG4gICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJyc7XG4gICAgfVxuICAgIC8vIFJlc3RvcmUgZm9jdXNcbiAgICByZXN0b3JlRm9jdXMoKTtcbiAgfVxufVxuXG4vKipcbiAqIENsb3NlIGFsbCBvcGVuIG1vZGFscy5cbiAqL1xuZnVuY3Rpb24gY2xvc2VBbGxNb2RhbHMoKSB7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tyb2xlPVwiZGlhbG9nXCJdJykuZm9yRWFjaChtb2RhbCA9PiB7XG4gICAgaWYgKG1vZGFsLmRhdGFzZXQuZGlzbWlzc0Rpc2FibGVkID09PSAnMScpIHJldHVybjtcbiAgICBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJyk7XG4gICAgbW9kYWwuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7XG4gICAgaWYgKG1vZGFsLnN0eWxlLmRpc3BsYXkgJiYgbW9kYWwuc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnKSB7XG4gICAgICBtb2RhbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH1cbiAgfSk7XG4gIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnJztcbiAgLy8gUmVzdG9yZSBmb2N1c1xuICByZXN0b3JlRm9jdXMoKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIE1vZGVsIHNlbGVjdG9yIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5sZXQgX21vZGVsRGF0YSA9IG51bGw7IC8vIGNhY2hlZCBmcm9tIGxhc3QgbG9hZE1vZGVsU2VsZWN0b3IoKSBjYWxsXG5sZXQgX21vZGVsRGF0YVRhYmxlID0gbnVsbDtcbmxldCBfc2VsZWN0ZWRNb2RlbFByb3ZpZGVycyA9IG5ldyBTZXQoKTtcbmxldCBfbW9kZWxTZWxlY3RvckxvYWRpbmcgPSBmYWxzZTsgICAvLyBndWFyZDogbG9hZE1vZGVsU2VsZWN0b3IoKSBpbiBmbGlnaHRcbmxldCBfY2F0YWxvZ1JlZnJlc2hpbmcgPSBmYWxzZTsgICAgICAvLyBndWFyZDogX3JlZnJlc2hNb2RlbENhdGFsb2dGb3JTZWxlY3Rpb24oKSBpbiBmbGlnaHRcbmxldCBfY2F0YWxvZ1JlZnJlc2hQZW5kaW5nID0gZmFsc2U7ICAvLyBxdWV1ZSBvbmUgcmVydW4gd2hlbiB0b2dnbGVzIGhhcHBlbiBtaWQtcmVmcmVzaFxubGV0IF9zaG93RnVsbE1vZGVsQ2F0YWxvZyA9IGZhbHNlO1xubGV0IF9jb3BpbG90QXV0aFBvbGxUaW1lciA9IG51bGw7XG5sZXQgX21vZGVsV2l6YXJkU3RlcCA9IDE7XG5sZXQgX21vZGVsV2l6YXJkU2VsZWN0ZWRQcm92aWRlciA9IG51bGw7XG5cblxuZnVuY3Rpb24gX2dldE1vZGVsUHJlZnNGcm9tU3RvcmFnZSgpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzYXZlZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFN0b3JhZ2VLZXlzLlRBQl9EQVRBKTtcbiAgICByZXR1cm4gc2F2ZWQgPyAoSlNPTi5wYXJzZShzYXZlZCkgfHwge30pIDoge307XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7fTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfc2F2ZU1vZGVsUHJlZnNUb1N0b3JhZ2UocGF0Y2gpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWQgPSBfZ2V0TW9kZWxQcmVmc0Zyb21TdG9yYWdlKCk7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oU3RvcmFnZUtleXMuVEFCX0RBVEEsIEpTT04uc3RyaW5naWZ5KHsgLi4ucGFyc2VkLCAuLi5wYXRjaCB9KSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2cud2FybignRmFpbGVkIHRvIHBlcnNpc3QgbW9kZWwgcHJlZmVyZW5jZXMgbG9jYWxseTonLCBlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfYXBwZW5kUmVjZW50TW9kZWwocHJvdmlkZXIsIG1vZGVsKSB7XG4gIGlmICghcHJvdmlkZXIgfHwgIW1vZGVsKSByZXR1cm47XG4gIGNvbnN0IHBhcnNlZCA9IF9nZXRNb2RlbFByZWZzRnJvbVN0b3JhZ2UoKTtcbiAgY29uc3QgZXhpc3RpbmcgPSBBcnJheS5pc0FycmF5KHBhcnNlZC5yZWNlbnRNb2RlbHMpID8gcGFyc2VkLnJlY2VudE1vZGVscyA6IFtdO1xuICBjb25zdCBmaWx0ZXJlZCA9IGV4aXN0aW5nLmZpbHRlcigoaXRlbSkgPT4gIShpdGVtLnByb3ZpZGVyID09PSBwcm92aWRlciAmJiBpdGVtLm1vZGVsID09PSBtb2RlbCkpO1xuICBmaWx0ZXJlZC51bnNoaWZ0KHsgcHJvdmlkZXIsIG1vZGVsIH0pO1xuICBfc2F2ZU1vZGVsUHJlZnNUb1N0b3JhZ2UoeyByZWNlbnRNb2RlbHM6IGZpbHRlcmVkLnNsaWNlKDAsIDYpIH0pO1xufVxuXG5mdW5jdGlvbiBfdXBkYXRlTGxtU3RhdHVzUGlsbChraW5kLCB0ZXh0LCBpY29uID0gJycsIHRvb2x0aXAgPSAnJykge1xuICBjb25zdCBwaWxsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbS1zdGF0dXMtcGlsbCcpO1xuICBjb25zdCBsYWJlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG0tc3RhdHVzLWxhYmVsJyk7XG4gIGNvbnN0IGljb25FbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG0tc3RhdHVzLWljb24nKTtcbiAgaWYgKCFwaWxsIHx8ICFsYWJlbCkgcmV0dXJuO1xuXG4gIGNvbnN0IGFsaWFzZXMgPSB7XG4gICAgYXV0aGVudGljYXRlZDogJ2Nvbm5lY3RlZCcsXG4gICAgdW5hdXRoZW50aWNhdGVkOiAndW5jb25maWd1cmVkJyxcbiAgICBwb2xsaW5nOiAnY29ubmVjdGluZycsXG4gIH07XG4gIGNvbnN0IG5vcm1hbGl6ZWRLaW5kID0gYWxpYXNlc1traW5kXSB8fCBraW5kIHx8ICd1bmNvbmZpZ3VyZWQnO1xuICBjb25zdCBkZWZhdWx0VG9vbHRpcCA9IHtcbiAgICB1bmNvbmZpZ3VyZWQ6ICdObyBwcm92aWRlci9tb2RlbCBpcyBjb25maWd1cmVkIHlldC4nLFxuICAgIGNvbmZpZ3VyZWQ6ICdQcm92aWRlci9tb2RlbCBpcyBjb25maWd1cmVkLiBDb25uZWN0aXZpdHkgbm90IHlldCB2ZXJpZmllZC4nLFxuICAgIGNvbm5lY3Rpbmc6ICdUZXN0aW5nIG9yIGNvbm5lY3RpbmcgdG8gdGhlIHNlbGVjdGVkIHByb3ZpZGVyLicsXG4gICAgY29ubmVjdGVkOiAnUHJvdmlkZXIgcmVzcG9uZGVkIHN1Y2Nlc3NmdWxseSB0byBhIGxpdmUgcmVxdWVzdC4nLFxuICAgICdhdXRoLXJlcXVpcmVkJzogJ0F1dGhlbnRpY2F0aW9uIGlzIHJlcXVpcmVkLiBDaGVjayBBUEkga2V5IG9yIHNpZ24gaW4uJyxcbiAgICAncmF0ZS1saW1pdGVkJzogJ1JhdGUgbGltaXQgcmVhY2hlZC4gV2FpdCBiZWZvcmUgcmV0cnlpbmcgcmVxdWVzdHMuJyxcbiAgICB1bmF2YWlsYWJsZTogJ1Byb3ZpZGVyIGlzIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlIG9yIHVucmVhY2hhYmxlLicsXG4gICAgZXJyb3I6ICdDb25uZWN0aW9uIGZhaWxlZC4gT3BlbiBtb2RlbCBzZXR0aW5ncyBmb3IgZGV0YWlscy4nLFxuICB9O1xuICBwaWxsLmNsYXNzTGlzdC5yZW1vdmUoJ2F1dGhlbnRpY2F0ZWQnLCAndW5hdXRoZW50aWNhdGVkJywgJ3BvbGxpbmcnLCAndW5jb25maWd1cmVkJywgJ2NvbmZpZ3VyZWQnLCAnY29ubmVjdGluZycsICdjb25uZWN0ZWQnLCAnYXV0aC1yZXF1aXJlZCcsICdyYXRlLWxpbWl0ZWQnLCAndW5hdmFpbGFibGUnLCAnZXJyb3InKTtcbiAgaWYgKG5vcm1hbGl6ZWRLaW5kKSBwaWxsLmNsYXNzTGlzdC5hZGQobm9ybWFsaXplZEtpbmQpO1xuICBsYWJlbC50ZXh0Q29udGVudCA9IHRleHQ7XG4gIGNvbnN0IGljb25CeUtpbmQgPSB7XG4gICAgdW5jb25maWd1cmVkOiAnXHUyNUNCJyxcbiAgICBjb25maWd1cmVkOiAnXHUyNUQ0JyxcbiAgICBjb25uZWN0aW5nOiAnXHUyOUQ3JyxcbiAgICBjb25uZWN0ZWQ6ICdcdTI3MTMnLFxuICAgICdhdXRoLXJlcXVpcmVkJzogJ1x1RDgzRFx1REQxMScsXG4gICAgJ3JhdGUtbGltaXRlZCc6ICdcdTIzRjMnLFxuICAgIHVuYXZhaWxhYmxlOiAnXHUyNjAxJyxcbiAgICBlcnJvcjogJ1x1MjZBMCcsXG4gIH07XG4gIGNvbnN0IGljb25UZXh0ID0gaWNvbiB8fCBpY29uQnlLaW5kW25vcm1hbGl6ZWRLaW5kXSB8fCAnXHUyNkEwJztcbiAgaWYgKGljb25FbCkgaWNvbkVsLnRleHRDb250ZW50ID0gaWNvblRleHQ7XG4gIGNvbnN0IHRvb2x0aXBUZXh0ID0gdG9vbHRpcCB8fCBkZWZhdWx0VG9vbHRpcFtub3JtYWxpemVkS2luZF0gfHwgJyc7XG4gIHBpbGwudGl0bGUgPSB0b29sdGlwVGV4dDtcbiAgaWYgKGljb25FbCkgaWNvbkVsLnRpdGxlID0gdG9vbHRpcFRleHQ7XG4gIGxhYmVsLnRpdGxlID0gdG9vbHRpcFRleHQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxvYWRNb2RlbFNlbGVjdG9yKCkge1xuICBpZiAoX21vZGVsU2VsZWN0b3JMb2FkaW5nKSByZXR1cm47XG4gIF9tb2RlbFNlbGVjdG9yTG9hZGluZyA9IHRydWU7XG4gIHRyeSB7XG4gICAgX21vZGVsRGF0YSA9IGF3YWl0IGFwaUNhbGwoJ0dFVCcsICcvYXBpL21vZGVsJyk7XG4gICAgLy8gSWYgYmFja2VuZCBkaWRuJ3QgcmV0dXJuIGEgcGVyc2lzdGVudCBzZWxlY3Rpb24sIHByZWZlciBhIGxvY2FsbHktc2F2ZWQgY2hvaWNlXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNhdmVkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oU3RvcmFnZUtleXMuVEFCX0RBVEEpO1xuICAgICAgaWYgKHNhdmVkKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2Uoc2F2ZWQpO1xuICAgICAgICBpZiAocGFyc2VkICYmICEoX21vZGVsRGF0YSAmJiBfbW9kZWxEYXRhLnByb3ZpZGVyKSAmJiBwYXJzZWQuY3VycmVudE1vZGVsUHJvdmlkZXIpIHtcbiAgICAgICAgICBfbW9kZWxEYXRhID0gX21vZGVsRGF0YSB8fCB7fTtcbiAgICAgICAgICBfbW9kZWxEYXRhLnByb3ZpZGVyID0gcGFyc2VkLmN1cnJlbnRNb2RlbFByb3ZpZGVyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJzZWQgJiYgIShfbW9kZWxEYXRhICYmIF9tb2RlbERhdGEubW9kZWwpICYmIHBhcnNlZC5jdXJyZW50TW9kZWxOYW1lKSB7XG4gICAgICAgICAgX21vZGVsRGF0YSA9IF9tb2RlbERhdGEgfHwge307XG4gICAgICAgICAgX21vZGVsRGF0YS5tb2RlbCA9IHBhcnNlZC5jdXJyZW50TW9kZWxOYW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nLndhcm4oJ0NvdWxkIG5vdCByZWFkIHNhdmVkIG1vZGVsIGZyb20gbG9jYWxTdG9yYWdlOicsIGUpO1xuICAgIH1cbiAgICBjb25zdCBsYWJlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1jdXJyZW50LWxhYmVsJyk7XG4gICAgaWYgKGxhYmVsKSB7XG4gICAgICBjb25zdCBwcm92ICA9IF9tb2RlbERhdGEucHJvdmlkZXI7XG4gICAgICBjb25zdCBtb2RlbCA9IF9tb2RlbERhdGEubW9kZWwgfHwgJ1x1MjAxNCc7XG4gICAgICBsYWJlbC50ZXh0Q29udGVudCA9IHByb3YgPyBgJHtwcm92fSBcdTAwQjcgJHttb2RlbH1gIDogbW9kZWw7XG4gICAgfVxuICAgIGlmIChfbW9kZWxEYXRhICYmIF9tb2RlbERhdGEucHJvdmlkZXIpIHtcbiAgICAgIF9zZWxlY3RlZE1vZGVsUHJvdmlkZXJzID0gbmV3IFNldChbX21vZGVsRGF0YS5wcm92aWRlcl0pO1xuICAgICAgX3VwZGF0ZUxsbVN0YXR1c1BpbGwoJ2NvbmZpZ3VyZWQnLCBgJHtfbW9kZWxEYXRhLnByb3ZpZGVyfSBjb25maWd1cmVkYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIF91cGRhdGVMbG1TdGF0dXNQaWxsKCd1bmNvbmZpZ3VyZWQnLCAnTm90IGNvbmZpZ3VyZWQnKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2cud2FybignQ291bGQgbm90IGxvYWQgbW9kZWwgbGlzdDonLCBlKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBfbW9kZWxTZWxlY3RvckxvYWRpbmcgPSBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfcHJvdmlkZXJTdGFnZUxhYmVsKHByb3ZpZGVyLCBjYXBhYmxlU2V0KSB7XG4gIGNvbnN0IGlzQ2FwYWJsZSA9IGNhcGFibGVTZXQuaGFzKHByb3ZpZGVyKTtcbiAgcmV0dXJuIGlzQ2FwYWJsZSA/ICdsaXN0X21vZGVscycgOiAnZmFsbGJhY2snO1xufVxuXG5mdW5jdGlvbiBfcHJvdmlkZXJEaXNwbGF5TGFiZWwocHJvdmlkZXIpIHtcbiAgY29uc3QgZGVwcmVjYXRlZCA9IHtcbiAgICAnY29waWxvdC1vYXV0aCc6ICdDb3BpbG90IE9BdXRoIChkZXByZWNhdGVkKScsXG4gICAgY29waWxvdDogJ0NvcGlsb3QgKGRlcHJlY2F0ZWQpJyxcbiAgICBnaXRodWI6ICdHaXRIdWIgTW9kZWxzIChkZXByZWNhdGVkKScsXG4gICAgJ2NvcGlsb3Qtc2RrJzogJ0NvcGlsb3QgU0RLIChyZWNvbW1lbmRlZCknLFxuICB9O1xuICBpZiAoZGVwcmVjYXRlZFtwcm92aWRlcl0pIHJldHVybiBkZXByZWNhdGVkW3Byb3ZpZGVyXTtcbiAgcmV0dXJuIHByb3ZpZGVyO1xufVxuXG5mdW5jdGlvbiBfZ2V0UXVpY2tNb2RlbENhbmRpZGF0ZXMocm93cykge1xuICBjb25zdCBwYXJzZWQgPSBfZ2V0TW9kZWxQcmVmc0Zyb21TdG9yYWdlKCk7XG4gIGNvbnN0IHJlY2VudHMgPSBBcnJheS5pc0FycmF5KHBhcnNlZC5yZWNlbnRNb2RlbHMpID8gcGFyc2VkLnJlY2VudE1vZGVscyA6IFtdO1xuICBjb25zdCByYW5rZWQgPSBbXTtcblxuICBmb3IgKGNvbnN0IHJlY2VudCBvZiByZWNlbnRzKSB7XG4gICAgY29uc3QgaGl0ID0gcm93cy5maW5kKChyb3cpID0+IHJvdy5wcm92aWRlciA9PT0gcmVjZW50LnByb3ZpZGVyICYmIHJvdy5tb2RlbCA9PT0gcmVjZW50Lm1vZGVsKTtcbiAgICBpZiAoaGl0KSByYW5rZWQucHVzaChoaXQpO1xuICB9XG5cbiAgY29uc3QgcG9wdWxhciA9IFsuLi5yb3dzXVxuICAgIC5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBjb25zdCBhbSA9IE51bWJlcihhLmNvcGlsb3RfbXVsdGlwbGllciA/PyA5OTkpO1xuICAgICAgY29uc3QgYm0gPSBOdW1iZXIoYi5jb3BpbG90X211bHRpcGxpZXIgPz8gOTk5KTtcbiAgICAgIGlmIChhbSAhPT0gYm0pIHJldHVybiBhbSAtIGJtO1xuICAgICAgY29uc3QgYWMgPSBOdW1iZXIoYS5jb250ZXh0X3dpbmRvdyB8fCAwKTtcbiAgICAgIGNvbnN0IGJjID0gTnVtYmVyKGIuY29udGV4dF93aW5kb3cgfHwgMCk7XG4gICAgICByZXR1cm4gYmMgLSBhYztcbiAgICB9KTtcblxuICBmb3IgKGNvbnN0IGl0ZW0gb2YgcG9wdWxhcikge1xuICAgIGlmICghcmFua2VkLnNvbWUoKHIpID0+IHIucHJvdmlkZXIgPT09IGl0ZW0ucHJvdmlkZXIgJiYgci5tb2RlbCA9PT0gaXRlbS5tb2RlbCkpIHtcbiAgICAgIHJhbmtlZC5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByYW5rZWQuc2xpY2UoMCwgOCk7XG59XG5cbmZ1bmN0aW9uIF9yZW5kZXJRdWlja01vZGVsTGlzdChyb3dzKSB7XG4gIGNvbnN0IHF1aWNrRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtcXVpY2stbGlzdCcpO1xuICBpZiAoIXF1aWNrRWwpIHJldHVybjtcbiAgcXVpY2tFbC5pbm5lckhUTUwgPSAnJztcblxuICBjb25zdCBjYW5kaWRhdGVzID0gX2dldFF1aWNrTW9kZWxDYW5kaWRhdGVzKHJvd3MgfHwgW10pO1xuICBmb3IgKGNvbnN0IGl0ZW0gb2YgY2FuZGlkYXRlcykge1xuICAgIGNvbnN0IGlzQWN0aXZlID0gaXRlbS5wcm92aWRlciA9PT0gX21vZGVsRGF0YT8ucHJvdmlkZXIgJiYgaXRlbS5tb2RlbCA9PT0gX21vZGVsRGF0YT8ubW9kZWw7XG4gICAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgYnV0dG9uLmNsYXNzTmFtZSA9ICdoZWFkZXItcGlsbC1idG4nO1xuICAgIGJ1dHRvbi5zdHlsZS5wYWRkaW5nID0gJzVweCAxMHB4JztcbiAgICBidXR0b24uc3R5bGUuZm9udFNpemUgPSAnMC44MmVtJztcbiAgICBidXR0b24uc3R5bGUuYmFja2dyb3VuZCA9IGlzQWN0aXZlID8gJyNkYmVhZmUnIDogJyNmOGZhZmMnO1xuICAgIGJ1dHRvbi5zdHlsZS5jb2xvciA9IGlzQWN0aXZlID8gJyMxZTNhOGEnIDogJyMzMzQxNTUnO1xuICAgIGJ1dHRvbi5zdHlsZS5ib3JkZXJDb2xvciA9IGlzQWN0aXZlID8gJyM5M2M1ZmQnIDogJyNjYmQ1ZTEnO1xuICAgIGJ1dHRvbi50aXRsZSA9IGAke2l0ZW0ucHJvdmlkZXJ9IFx1MDBCNyAke2l0ZW0ubW9kZWx9YDtcbiAgICBidXR0b24udGV4dENvbnRlbnQgPSBgJHtpdGVtLnByb3ZpZGVyfSBcdTAwQjcgJHtpdGVtLm1vZGVsfWA7XG4gICAgYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgc2V0TW9kZWwoaXRlbS5tb2RlbCwgaXRlbS5wcm92aWRlcik7XG4gICAgfSk7XG4gICAgcXVpY2tFbC5hcHBlbmRDaGlsZChidXR0b24pO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9zeW5jQ2F0YWxvZ1Zpc2liaWxpdHkoKSB7XG4gIGNvbnN0IHdyYXAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtZnVsbC10YWJsZS13cmFwJyk7XG4gIGNvbnN0IHNlYXJjaCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1nbG9iYWwtc2VhcmNoJyk7XG4gIGNvbnN0IHRvZ2dsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1zaG93LWFsbC1idG4nKTtcbiAgaWYgKHdyYXApIHdyYXAuc3R5bGUuZGlzcGxheSA9IF9zaG93RnVsbE1vZGVsQ2F0YWxvZyA/ICcnIDogJ25vbmUnO1xuICBpZiAoc2VhcmNoKSBzZWFyY2guc3R5bGUuZGlzcGxheSA9IF9zaG93RnVsbE1vZGVsQ2F0YWxvZyA/ICcnIDogJ25vbmUnO1xuICBpZiAodG9nZ2xlKSB0b2dnbGUudGV4dENvbnRlbnQgPSBfc2hvd0Z1bGxNb2RlbENhdGFsb2cgPyAnSGlkZSBGdWxsIENhdGFsb2cnIDogJ1Nob3cgRnVsbCBDYXRhbG9nJztcbn1cblxuZnVuY3Rpb24gdG9nZ2xlTW9kZWxDYXRhbG9nVmlzaWJpbGl0eSgpIHtcbiAgX3Nob3dGdWxsTW9kZWxDYXRhbG9nID0gIV9zaG93RnVsbE1vZGVsQ2F0YWxvZztcbiAgX3N5bmNDYXRhbG9nVmlzaWJpbGl0eSgpO1xufVxuXG4vLyBfcmVuZGVyQXV0aFN0ZXAgXHUyMDE0IGNhbGxlZCBieSBfc2V0TW9kZWxXaXphcmRTdGVwIHdoZW4gZW50ZXJpbmcgU3RlcCAyLlxuLy8gUmVuZGVycyBwcm92aWRlci1zcGVjaWZpYyBjb250ZW50IGludG8gI21vZGVsLWF1dGgtc3RlcC1jb250ZW50IGFuZCBzaG93c1xuLy8gdGhlIGFwcHJvcHJpYXRlIHN1Yi1wYW5lbCAoa2V5IGlucHV0LCBkZXZpY2UtZmxvdywgQ0xJIG5vdGljZSwgb3Igbm9uZSkuXG5hc3luYyBmdW5jdGlvbiBfcmVuZGVyQXV0aFN0ZXAocHJvdmlkZXIpIHtcbiAgY29uc3QgY29udGVudCAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1hdXRoLXN0ZXAtY29udGVudCcpO1xuICBjb25zdCBrZXlQYW5lbCAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLWF1dGgta2V5LXBhbmVsJyk7XG4gIGNvbnN0IGRldlBhbmVsICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtYXV0aC1kZXZpY2UtcGFuZWwnKTtcbiAgY29uc3Qga2V5SW5wdXQgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1hdXRoLWtleS1pbnB1dCcpO1xuICBjb25zdCBrZXlTdGF0dXMgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLWF1dGgta2V5LXN0YXR1cycpO1xuXG4gIGlmICghY29udGVudCkgcmV0dXJuO1xuXG4gIC8vIFJlc2V0IHN1Yi1wYW5lbHNcbiAgaWYgKGtleVBhbmVsKSAga2V5UGFuZWwuc3R5bGUuZGlzcGxheSAgPSAnbm9uZSc7XG4gIGlmIChkZXZQYW5lbCkgIGRldlBhbmVsLnN0eWxlLmRpc3BsYXkgID0gJ25vbmUnO1xuICBpZiAoa2V5SW5wdXQpICBrZXlJbnB1dC52YWx1ZSA9ICcnO1xuICBpZiAoa2V5U3RhdHVzKSBrZXlTdGF0dXMudGV4dENvbnRlbnQgPSAnJztcblxuICBpZiAoIXByb3ZpZGVyKSB7XG4gICAgY29udGVudC5pbm5lckhUTUwgPSAnPHAgc3R5bGU9XCJjb2xvcjojNjQ3NDhiO1wiPlNlbGVjdCBhIHByb3ZpZGVyIGluIFN0ZXAgMSBmaXJzdC48L3A+JztcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgY3JlZERhdGEgPSBudWxsO1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaCgnL2FwaS9zZXR0aW5ncy9jcmVkZW50aWFscy9zdGF0dXMnKTtcbiAgICBpZiAocmVzcC5vaykge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3AuanNvbigpO1xuICAgICAgY3JlZERhdGEgPSAoZGF0YS5wcm92aWRlcnMgfHwge30pW3Byb3ZpZGVyXSB8fCBudWxsO1xuICAgIH1cbiAgfSBjYXRjaCB7IC8qIG5vbi1mYXRhbCAqLyB9XG5cbiAgY29uc3QgYXV0aFR5cGUgICA9IGNyZWREYXRhPy5hdXRoX3R5cGUgIHx8ICdhcGlfa2V5JztcbiAgY29uc3QgbGFiZWwgICAgICA9IGNyZWREYXRhPy5sYWJlbCAgICAgIHx8IHByb3ZpZGVyO1xuICBjb25zdCBoZWxwVGV4dCAgID0gY3JlZERhdGE/LmhlbHBfdGV4dCAgfHwgJyc7XG4gIGNvbnN0IGdldEtleVVybCAgPSBjcmVkRGF0YT8uZ2V0X2tleV91cmwgfHwgJyc7XG4gIGNvbnN0IGlzU2V0ICAgICAgPSBjcmVkRGF0YT8uaXNfc2V0ICAgICB8fCBmYWxzZTtcbiAgY29uc3Qgc291cmNlICAgICA9IGNyZWREYXRhPy5zb3VyY2UgICAgIHx8ICd1bnNldCc7XG4gIGNvbnN0IGVudlZhciAgICAgPSBjcmVkRGF0YT8uZW52X3ZhciAgICB8fCBudWxsO1xuICBjb25zdCBpc0xvY2tlZCAgID0gY3JlZERhdGE/LmxvY2tlZCAgICAgfHwgZmFsc2U7XG5cbiAgY29uc3QgaXNTZXRCYWRnZSA9IGlzU2V0XG4gICAgPyAnPHNwYW4gc3R5bGU9XCJkaXNwbGF5OmlubGluZS1ibG9jaztwYWRkaW5nOjJweCA4cHg7Ym9yZGVyLXJhZGl1czo5OTlweDtiYWNrZ3JvdW5kOiNkMWZhZTU7Y29sb3I6IzA2NWY0Njtmb250LXNpemU6MC44ZW07Zm9udC13ZWlnaHQ6NjAwO1wiPiYjMTAwMDM7IEtleSBzYXZlZDwvc3Bhbj4nXG4gICAgOiAnPHNwYW4gc3R5bGU9XCJkaXNwbGF5OmlubGluZS1ibG9jaztwYWRkaW5nOjJweCA4cHg7Ym9yZGVyLXJhZGl1czo5OTlweDtiYWNrZ3JvdW5kOiNmZWUyZTI7Y29sb3I6Izk5MWIxYjtmb250LXNpemU6MC44ZW07Zm9udC13ZWlnaHQ6NjAwO1wiPk5vdCBjb25maWd1cmVkPC9zcGFuPic7XG5cbiAgLy8gU291cmNlIGxhYmVsICsgXHUyNEQ4IHRvb2x0aXAgXHUyMDE0IG1pcnJvcnMgdGhlIHNldHRpbmdzIGRpYWxvZyBwYXR0ZXJuLlxuICBsZXQgc291cmNlTGFiZWwgPSAnJztcbiAgbGV0IHRvb2x0aXBUZXh0ID0gJyc7XG4gIGlmIChzb3VyY2UgPT09ICdlbnYnKSB7XG4gICAgc291cmNlTGFiZWwgPSBgU291cmNlOiBlbnZpcm9ubWVudCB2YXJpYWJsZSAoJHtlbnZWYXIgfHwgJ2xvY2tlZCd9KWA7XG4gICAgdG9vbHRpcFRleHQgPSBgQ3VycmVudGx5IGxvYWRlZCBmcm9tIHRoZSAke2VudlZhcn0gZW52aXJvbm1lbnQgdmFyaWFibGUuIGAgK1xuICAgICAgYFRvIGNoYW5nZSBpdCBwZXJtYW5lbnRseSwgdXBkYXRlIHlvdXIgc2hlbGwgY29uZmlnIChlLmcuIH4vLnpzaHJjKSBhbmQgcmVzdGFydCB0aGUgc2VydmVyLiBgICtcbiAgICAgIGBZb3UgY2FuIHN0aWxsIHNhdmUgYSB2YWx1ZSBiZWxvdyBcdTIwMTQgaXQgdGFrZXMgZWZmZWN0IGltbWVkaWF0ZWx5IGJ1dCB3aWxsIGJlIG92ZXJyaWRkZW4gYnkgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIG9uIG5leHQgcmVzdGFydC5gO1xuICB9IGVsc2UgaWYgKHNvdXJjZSA9PT0gJ2RvdGVudicpIHtcbiAgICBzb3VyY2VMYWJlbCA9IGBTb3VyY2U6IC5lbnYgZmlsZSAoJHtlbnZWYXIgfHwgJ2xvY2tlZCd9KWA7XG4gICAgdG9vbHRpcFRleHQgPSBgQ3VycmVudGx5IGxvYWRlZCBmcm9tICR7ZW52VmFyfSBpbiB5b3VyIC5lbnYgZmlsZS4gYCArXG4gICAgICBgVG8gY2hhbmdlIGl0IHBlcm1hbmVudGx5LCBlZGl0IHRoZSAuZW52IGZpbGUgaW4gdGhlIHByb2plY3QgZGlyZWN0b3J5IGFuZCByZXN0YXJ0IHRoZSBzZXJ2ZXIuIGAgK1xuICAgICAgYFlvdSBjYW4gc3RpbGwgc2F2ZSBhIHZhbHVlIGJlbG93IFx1MjAxNCBpdCB0YWtlcyBlZmZlY3QgaW1tZWRpYXRlbHkgYnV0IHdpbGwgYmUgb3ZlcnJpZGRlbiBieSAuZW52IG9uIG5leHQgcmVzdGFydC5gO1xuICB9IGVsc2UgaWYgKHNvdXJjZSA9PT0gJ2NvbmZpZycpIHtcbiAgICBzb3VyY2VMYWJlbCA9ICdTb3VyY2U6IGNvbmZpZy55YW1sJztcbiAgICB0b29sdGlwVGV4dCA9ICdTdG9yZWQgaW4gY29uZmlnLnlhbWwuIFVwZGF0ZSBpdCB1c2luZyB0aGUgaW5wdXQgYmVsb3cuJztcbiAgfVxuXG4gIGNvbnN0IGluZm9JY29uID0gdG9vbHRpcFRleHRcbiAgICA/IGAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdGl0bGU9XCIke2VzY2FwZUh0bWwodG9vbHRpcFRleHQpfVwiIGFyaWEtbGFiZWw9XCJXaGVyZSBpcyB0aGlzIGtleSBzdG9yZWQ/XCIgYCArXG4gICAgICBgc3R5bGU9XCJiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOm5vbmU7Y3Vyc29yOmhlbHA7Y29sb3I6IzY0NzQ4Yjtmb250LXNpemU6MC44NWVtO3BhZGRpbmc6MCAycHg7dmVydGljYWwtYWxpZ246bWlkZGxlO2xpbmUtaGVpZ2h0OjE7XCI+XHUyNEQ4PC9idXR0b24+YFxuICAgIDogJyc7XG5cbiAgY29uc3Qgc291cmNlTGFiZWxIdG1sID0gc291cmNlTGFiZWxcbiAgICA/IGA8c3BhbiBzdHlsZT1cIm1hcmdpbi1sZWZ0OjEwcHg7Zm9udC1zaXplOjAuOGVtO2NvbG9yOiR7aXNMb2NrZWQgPyAnI2I0NTMwOScgOiAnIzY0NzQ4Yid9O1wiPiR7ZXNjYXBlSHRtbChzb3VyY2VMYWJlbCl9JHtpbmZvSWNvbn08L3NwYW4+YFxuICAgIDogJyc7XG5cbiAgLy8gQW1iZXIgd2FybmluZyB3aGVuIGEgbG9ja2VkIHNvdXJjZSBleGlzdHMgXHUyMDE0IGlucHV0IHJlbWFpbnMgZW5hYmxlZCBzbyB0aGVcbiAgLy8gdXNlciBjYW4gc2F2ZSBhIHNlc3Npb24vY29uZmlnIG92ZXJyaWRlLCBidXQgdGhlIHByZWNlZGVuY2UgcnVsZSBpcyBjbGVhci5cbiAgY29uc3Qgc291cmNlRGVzYyA9IHNvdXJjZSA9PT0gJ2VudicgPyAnZW52aXJvbm1lbnQgdmFyaWFibGUnIDogJy5lbnYgZmlsZSc7XG4gIGNvbnN0IHNvdXJjZVJlZiAgPSBlbnZWYXJcbiAgICA/IGAke3NvdXJjZURlc2N9IDxjb2RlPiR7ZXNjYXBlSHRtbChlbnZWYXIpfTwvY29kZT5gXG4gICAgOiBzb3VyY2VEZXNjO1xuICBjb25zdCBsb2NrZWRXYXJuSHRtbCA9IGlzTG9ja2VkXG4gICAgPyBgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2ZlZjNjNztib3JkZXI6MXB4IHNvbGlkICNmNTllMGI7Ym9yZGVyLXJhZGl1czo2cHg7cGFkZGluZzo4cHggMTJweDttYXJnaW46OHB4IDA7Zm9udC1zaXplOjAuODVlbTtjb2xvcjojOTI0MDBlO1wiPmAgK1xuICAgICAgYFx1MjZBMCBUaGlzIGtleSBpcyBsb2FkZWQgZnJvbSB0aGUgPHN0cm9uZz4ke3NvdXJjZVJlZn08L3N0cm9uZz4uIGAgK1xuICAgICAgYEFueSB2YWx1ZSBzYXZlZCBiZWxvdyB0YWtlcyBlZmZlY3QgaW1tZWRpYXRlbHkgZm9yIHRoZSBjdXJyZW50IHNlc3Npb24sIGJ1dCB3aWxsIGJlIGAgK1xuICAgICAgYDxzdHJvbmc+b3ZlcnJpZGRlbiBieSB0aGUgJHtzb3VyY2VEZXNjfSB3aGVuIHRoZSBzZXJ2ZXIgcmVzdGFydHMgb3IgcmVsb2Fkczwvc3Ryb25nPi48L2Rpdj5gXG4gICAgOiAnJztcblxuICBjb25zdCBnZXRLZXlMaW5rID0gZ2V0S2V5VXJsXG4gICAgPyBgPGEgaHJlZj1cIiR7ZXNjYXBlSHRtbChnZXRLZXlVcmwpfVwiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIiBzdHlsZT1cImNvbG9yOiMyNTYzZWI7XCI+R2V0IHlvdXIga2V5ICYjODU5OTs8L2E+YFxuICAgIDogJyc7XG5cbiAgY29udGVudC5pbm5lckhUTUwgPVxuICAgIGA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxMHB4O1wiPmAgK1xuICAgIGAgIDxzdHJvbmc+JHtlc2NhcGVIdG1sKGxhYmVsKX08L3N0cm9uZz4gJHtpc1NldEJhZGdlfSR7c291cmNlTGFiZWxIdG1sfWAgK1xuICAgIChnZXRLZXlMaW5rID8gYCAgPHNwYW4gc3R5bGU9XCJtYXJnaW4tbGVmdDoxMHB4O1wiPiR7Z2V0S2V5TGlua308L3NwYW4+YCA6ICcnKSArXG4gICAgYDwvZGl2PmAgK1xuICAgIChoZWxwVGV4dCA/IGA8cCBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07Y29sb3I6IzQ3NTU2OTttYXJnaW46MCAwIDEycHg7XCI+JHtlc2NhcGVIdG1sKGhlbHBUZXh0KX08L3A+YCA6ICcnKSArXG4gICAgbG9ja2VkV2Fybkh0bWw7XG5cbiAgaWYgKGF1dGhUeXBlID09PSAnYXBpX2tleScpIHtcbiAgICBpZiAoa2V5UGFuZWwpIHtcbiAgICAgIGtleVBhbmVsLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIGlmIChrZXlJbnB1dCkge1xuICAgICAgICAvLyBBbHdheXMgZW5hYmxlIGlucHV0IFx1MjAxNCB1c2VyIGNhbiBzYXZlIGEgbmV3IHZhbHVlIGV2ZW4gd2hlbiBlbnYvZG90ZW52IGlzIHRoZSBjdXJyZW50XG4gICAgICAgIC8vIHNvdXJjZS4gVGhlIHdhcm5pbmcgYmFubmVyIGFib3ZlIGNvbW11bmljYXRlcyB0aGUgcmVzdGFydC1wcmVjZWRlbmNlIGJlaGF2aW91ci5cbiAgICAgICAga2V5SW5wdXQuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAga2V5SW5wdXQuc3R5bGUub3BhY2l0eSA9ICcnO1xuICAgICAgICBrZXlJbnB1dC5wbGFjZWhvbGRlciA9IGlzU2V0ID8gJ0VudGVyIG5ldyBrZXkgdG8gcmVwbGFjZSB0aGUgc2F2ZWQgb25lJyA6ICdQYXN0ZSB5b3VyIEFQSSBrZXkgaGVyZSc7XG4gICAgICAgIGtleUlucHV0LmRhdGFzZXQucHJvdmlkZXIgPSBwcm92aWRlcjtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAoYXV0aFR5cGUgPT09ICdkZXZpY2VfZmxvdycpIHtcbiAgICBpZiAoZGV2UGFuZWwpIHtcbiAgICAgIGRldlBhbmVsLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIGF3YWl0IF9yZWZyZXNoQ29waWxvdEF1dGhTdGF0dXMoKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoYXV0aFR5cGUgPT09ICdjbGknKSB7XG4gICAgY29udGVudC5pbm5lckhUTUwgKz1cbiAgICAgIGA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZjBmZGY0O2JvcmRlcjoxcHggc29saWQgI2JiZjdkMDtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjEwcHggMTRweDtmb250LXNpemU6MC44OGVtO1wiPmAgK1xuICAgICAgYDxwIHN0eWxlPVwibWFyZ2luOjAgMCA2cHg7XCI+UnVuIHRoaXMgY29tbWFuZCBpbiBhIHRlcm1pbmFsLCB0aGVuIHJldHVybiBoZXJlIGFuZCBjbGljayA8c3Ryb25nPk5leHQ8L3N0cm9uZz46PC9wPmAgK1xuICAgICAgYDxjb2RlIHN0eWxlPVwiZm9udC1zaXplOjFlbTtcIj5naCBhdXRoIGxvZ2luPC9jb2RlPjwvZGl2PmA7XG4gIH0gZWxzZSB7XG4gICAgY29udGVudC5pbm5lckhUTUwgKz1cbiAgICAgIGA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZjhmYWZjO2JvcmRlcjoxcHggc29saWQgI2UyZThmMDtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjEwcHggMTRweDtmb250LXNpemU6MC44OGVtO2NvbG9yOiM0NzU1Njk7XCI+YCArXG4gICAgICBgTm8gYXV0aGVudGljYXRpb24gcmVxdWlyZWQgZm9yIHRoaXMgcHJvdmlkZXIuPC9kaXY+YDtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBfcmVmcmVzaENvcGlsb3RBdXRoU3RhdHVzKCkge1xuICBjb25zdCBzdGF0dXNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1hdXRoLXN0YXR1cycpO1xuICBjb25zdCBzdGFydEJ0biAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtYXV0aC1zdGFydC1idG4nKTtcbiAgY29uc3QgbG9nb3V0QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLWF1dGgtbG9nb3V0LWJ0bicpO1xuICBjb25zdCBjb2RlRWwgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtYXV0aC1jb2RlJyk7XG4gIGNvbnN0IGxpbmtFbCAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1hdXRoLWxpbmsnKTtcbiAgaWYgKCFzdGF0dXNFbCkgcmV0dXJuO1xuXG4gIGlmIChjb2RlRWwpICBjb2RlRWwudGV4dENvbnRlbnQgPSAnJztcbiAgaWYgKGxpbmtFbCkgIGxpbmtFbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gIHRyeSB7XG4gICAgY29uc3Qgc3QgPSBhd2FpdCBmZXRjaCgnL2FwaS9jb3BpbG90LWF1dGgvc3RhdHVzJykudGhlbigocmVzKSA9PiByZXMuanNvbigpKTtcbiAgICBpZiAoc3QuYXV0aGVudGljYXRlZCkge1xuICAgICAgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnQXV0aGVudGljYXRlZCB3aXRoIEdpdEh1YiBDb3BpbG90Lic7XG4gICAgICBpZiAoc3RhcnRCdG4pIHN0YXJ0QnRuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICBpZiAobG9nb3V0QnRuKSBsb2dvdXRCdG4uc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgX3VwZGF0ZUxsbVN0YXR1c1BpbGwoJ2F1dGhlbnRpY2F0ZWQnLCAnQ29waWxvdCByZWFkeScpO1xuICAgIH0gZWxzZSBpZiAoc3QucG9sbGluZykge1xuICAgICAgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnV2FpdGluZyBmb3IgZGV2aWNlIGFwcHJvdmFsXHUyMDI2JztcbiAgICAgIGlmIChzdGFydEJ0bikgc3RhcnRCdG4uc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgaWYgKGxvZ291dEJ0bikgbG9nb3V0QnRuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICBfdXBkYXRlTGxtU3RhdHVzUGlsbCgncG9sbGluZycsICdDb3BpbG90IGF1dGggcGVuZGluZycsICdcdTI5RDcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnTm90IGF1dGhlbnRpY2F0ZWQuIFN0YXJ0IHNpZ24taW4gdG8gZW5hYmxlIENvcGlsb3QgT0F1dGguJztcbiAgICAgIGlmIChzdGFydEJ0bikgc3RhcnRCdG4uc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgaWYgKGxvZ291dEJ0bikgbG9nb3V0QnRuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICBfdXBkYXRlTGxtU3RhdHVzUGlsbCgndW5hdXRoZW50aWNhdGVkJywgJ0NvcGlsb3Qgbm90IGF1dGhlbnRpY2F0ZWQnKTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJ1VuYWJsZSB0byBsb2FkIGF1dGggc3RhdHVzLic7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZVByb3ZpZGVyQXBpS2V5KCkge1xuICBjb25zdCBrZXlJbnB1dCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtYXV0aC1rZXktaW5wdXQnKTtcbiAgY29uc3Qga2V5U3RhdHVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLWF1dGgta2V5LXN0YXR1cycpO1xuICBjb25zdCBwcm92aWRlciAgPSBrZXlJbnB1dD8uZGF0YXNldD8ucHJvdmlkZXIgfHwgX21vZGVsV2l6YXJkU2VsZWN0ZWRQcm92aWRlcjtcbiAgY29uc3QgdmFsdWUgICAgID0gKGtleUlucHV0Py52YWx1ZSB8fCAnJykudHJpbSgpO1xuXG4gIGlmICghdmFsdWUpIHtcbiAgICBpZiAoa2V5U3RhdHVzKSB7IGtleVN0YXR1cy50ZXh0Q29udGVudCA9ICdQbGVhc2UgZW50ZXIgYSBrZXkgdmFsdWUuJzsga2V5U3RhdHVzLnN0eWxlLmNvbG9yID0gJyNiOTFjMWMnOyB9XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICghcHJvdmlkZXIpIHtcbiAgICBpZiAoa2V5U3RhdHVzKSB7IGtleVN0YXR1cy50ZXh0Q29udGVudCA9ICdObyBwcm92aWRlciBzZWxlY3RlZC4nOyBrZXlTdGF0dXMuc3R5bGUuY29sb3IgPSAnI2I5MWMxYyc7IH1cbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoa2V5U3RhdHVzKSB7IGtleVN0YXR1cy50ZXh0Q29udGVudCA9ICdTYXZpbmdcdTIwMjYnOyBrZXlTdGF0dXMuc3R5bGUuY29sb3IgPSAnIzQ3NTU2OSc7IH1cbiAgdHJ5IHtcbiAgICBhd2FpdCBhcGlDYWxsKCdQT1NUJywgJy9hcGkvc2V0dGluZ3MvY3JlZGVudGlhbHMnLCB7IHByb3ZpZGVyLCBrZXlfdmFsdWU6IHZhbHVlIH0pO1xuICAgIGlmIChrZXlJbnB1dCkgIGtleUlucHV0LnZhbHVlID0gJyc7XG4gICAgaWYgKGtleVN0YXR1cykge1xuICAgICAga2V5U3RhdHVzLnRleHRDb250ZW50ID0gJ0tleSBzYXZlZCBzdWNjZXNzZnVsbHkuJztcbiAgICAgIGtleVN0YXR1cy5zdHlsZS5jb2xvciA9ICcjMDY1ZjQ2JztcbiAgICB9XG4gICAgLy8gUmUtcmVuZGVyIGJhZGdlIHRvIHNob3cga2V5IGlzIG5vdyBzZXRcbiAgICBhd2FpdCBfcmVuZGVyQXV0aFN0ZXAocHJvdmlkZXIpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKGtleVN0YXR1cykgeyBrZXlTdGF0dXMudGV4dENvbnRlbnQgPSBgRXJyb3I6ICR7ZS5tZXNzYWdlIHx8IGV9YDsga2V5U3RhdHVzLnN0eWxlLmNvbG9yID0gJyNiOTFjMWMnOyB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9nZ2xlQXBpS2V5VmlzaWJpbGl0eSgpIHtcbiAgY29uc3QgaW5wdXQgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLWF1dGgta2V5LWlucHV0Jyk7XG4gIGNvbnN0IHRvZ2dsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1hdXRoLWtleS10b2dnbGUnKTtcbiAgaWYgKCFpbnB1dCkgcmV0dXJuO1xuICBjb25zdCBpc0hpZGRlbiA9IGlucHV0LnR5cGUgPT09ICdwYXNzd29yZCc7XG4gIGlucHV0LnR5cGUgPSBpc0hpZGRlbiA/ICd0ZXh0JyA6ICdwYXNzd29yZCc7XG4gIGlmICh0b2dnbGUpIHRvZ2dsZS50ZXh0Q29udGVudCA9IGlzSGlkZGVuID8gJ1x1RDgzRFx1REU0OCcgOiAnXHVEODNEXHVEQzQxJztcbn1cblxuYXN5bmMgZnVuY3Rpb24gc3RhcnRDb3BpbG90QXV0aEZyb21XaXphcmQoKSB7XG4gIGNvbnN0IHN0YXR1c0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLWF1dGgtc3RhdHVzJyk7XG4gIGNvbnN0IGNvZGVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1hdXRoLWNvZGUnKTtcbiAgY29uc3QgbGlua0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLWF1dGgtbGluaycpO1xuICBpZiAoIXN0YXR1c0VsIHx8ICFjb2RlRWwgfHwgIWxpbmtFbCkgcmV0dXJuO1xuXG4gIF9zaG93TW9kZWxXaXphcmRCdXN5KCdTdGFydGluZyBHaXRIdWIgZGV2aWNlIGF1dGhvcml6YXRpb24uLi4nKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBmbG93UmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvY29waWxvdC1hdXRoL3N0YXJ0JywgeyBtZXRob2Q6ICdQT1NUJyB9KTtcbiAgICBpZiAoIWZsb3dSZXMub2spIHRocm93IG5ldyBFcnJvcihhd2FpdCBmbG93UmVzLnRleHQoKSk7XG4gICAgY29uc3QgZmxvdyA9IGF3YWl0IGZsb3dSZXMuanNvbigpO1xuXG4gICAgY29kZUVsLnRleHRDb250ZW50ID0gZmxvdy51c2VyX2NvZGUgfHwgJyc7XG4gICAgbGlua0VsLmhyZWYgPSBmbG93LnZlcmlmaWNhdGlvbl91cmkgfHwgJ2h0dHBzOi8vZ2l0aHViLmNvbS9sb2dpbi9kZXZpY2UnO1xuICAgIGxpbmtFbC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnT3BlbiBHaXRIdWIsIGVudGVyIHRoZSBjb2RlLCB0aGVuIHJldHVybiBoZXJlLic7XG4gICAgd2luZG93Lm9wZW4obGlua0VsLmhyZWYsICdfYmxhbmsnKTtcblxuICAgIGF3YWl0IGZldGNoKCcvYXBpL2NvcGlsb3QtYXV0aC9wb2xsJywgeyBtZXRob2Q6ICdQT1NUJyB9KTtcbiAgICBfdXBkYXRlTGxtU3RhdHVzUGlsbCgncG9sbGluZycsICdDb3BpbG90IGF1dGggcGVuZGluZycsICdcdTI5RDcnKTtcbiAgICBpZiAoX2NvcGlsb3RBdXRoUG9sbFRpbWVyKSBjbGVhckludGVydmFsKF9jb3BpbG90QXV0aFBvbGxUaW1lcik7XG4gICAgX2NvcGlsb3RBdXRoUG9sbFRpbWVyID0gc2V0SW50ZXJ2YWwoYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc3QgPSBhd2FpdCBmZXRjaCgnL2FwaS9jb3BpbG90LWF1dGgvc3RhdHVzJykudGhlbigocmVzKSA9PiByZXMuanNvbigpKTtcbiAgICAgICAgaWYgKHN0LmF1dGhlbnRpY2F0ZWQpIHtcbiAgICAgICAgICBjbGVhckludGVydmFsKF9jb3BpbG90QXV0aFBvbGxUaW1lcik7XG4gICAgICAgICAgX2NvcGlsb3RBdXRoUG9sbFRpbWVyID0gbnVsbDtcbiAgICAgICAgICBhd2FpdCBfcmVmcmVzaENvcGlsb3RBdXRoU3RhdHVzKCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBrZWVwIHBvbGxpbmcgc2lsZW50bHkgdW50aWwgY2xvc2VcbiAgICAgIH1cbiAgICB9LCA1MDAwKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBzdGF0dXNFbC50ZXh0Q29udGVudCA9IGBBdXRoIHN0YXJ0IGZhaWxlZDogJHtlcnJvci5tZXNzYWdlIHx8IGVycm9yfWA7XG4gIH0gZmluYWxseSB7XG4gICAgX2hpZGVNb2RlbFdpemFyZEJ1c3koKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBsb2dvdXRDb3BpbG90QXV0aEZyb21XaXphcmQoKSB7XG4gIGF3YWl0IGZldGNoKCcvYXBpL2NvcGlsb3QtYXV0aC9sb2dvdXQnLCB7IG1ldGhvZDogJ1BPU1QnIH0pO1xuICBhd2FpdCBfcmVmcmVzaENvcGlsb3RBdXRoU3RhdHVzKCk7XG59XG5cbmZ1bmN0aW9uIF93aXJlR2xvYmFsTW9kZWxTZWFyY2goKSB7XG4gIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLWdsb2JhbC1zZWFyY2gnKTtcbiAgaWYgKCFpbnB1dCkgcmV0dXJuO1xuICBpbnB1dC5vbmlucHV0ID0gKCkgPT4ge1xuICAgIGlmIChfbW9kZWxEYXRhVGFibGUgJiYgdHlwZW9mIF9tb2RlbERhdGFUYWJsZS5zZWFyY2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIF9tb2RlbERhdGFUYWJsZS5zZWFyY2goaW5wdXQudmFsdWUgfHwgJycpLmRyYXcoKTtcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIF9yZW5kZXJQcm92aWRlclNlbGVjdG9yKCkge1xuICBjb25zdCBsaXN0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtcHJvdmlkZXItbGlzdCcpO1xuICBpZiAoIWxpc3RFbCB8fCAhX21vZGVsRGF0YSkgcmV0dXJuO1xuXG4gIGNvbnN0IHByb3ZpZGVycyA9IEFycmF5LmlzQXJyYXkoX21vZGVsRGF0YS5wcm92aWRlcnMpXG4gICAgPyBfbW9kZWxEYXRhLnByb3ZpZGVyc1xuICAgIDogQXJyYXkuZnJvbShuZXcgU2V0KChfbW9kZWxEYXRhLmFsbF9tb2RlbHMgfHwgW10pLm1hcChyID0+IHIucHJvdmlkZXIpLmZpbHRlcihCb29sZWFuKSkpLnNvcnQoKTtcbiAgY29uc3QgY2FwYWJsZVNldCA9IG5ldyBTZXQoX21vZGVsRGF0YS5saXN0X21vZGVsc19jYXBhYmxlIHx8IFtdKTtcblxuICBpZiAoIV9tb2RlbFdpemFyZFNlbGVjdGVkUHJvdmlkZXIpIHtcbiAgICBfbW9kZWxXaXphcmRTZWxlY3RlZFByb3ZpZGVyID0gX21vZGVsRGF0YS5wcm92aWRlciB8fCBwcm92aWRlcnNbMF0gfHwgbnVsbDtcbiAgfVxuICBpZiAoX21vZGVsV2l6YXJkU2VsZWN0ZWRQcm92aWRlcikge1xuICAgIF9zZWxlY3RlZE1vZGVsUHJvdmlkZXJzID0gbmV3IFNldChbX21vZGVsV2l6YXJkU2VsZWN0ZWRQcm92aWRlcl0pO1xuICB9XG5cbiAgLy8gRGlzcG9zZSBhbnkgZXhpc3RpbmcgQlM1IHBvcG92ZXJzIGJlZm9yZSBjbGVhcmluZyB0aGUgbGlzdC5cbiAgbGlzdEVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWJzLXRvZ2dsZT1cInBvcG92ZXJcIl0nKS5mb3JFYWNoKGVsID0+IHtcbiAgICB3aW5kb3cuYm9vdHN0cmFwPy5Qb3BvdmVyPy5nZXRJbnN0YW5jZShlbCk/LmRpc3Bvc2UoKTtcbiAgfSk7XG5cbiAgbGlzdEVsLmlubmVySFRNTCA9ICcnO1xuICBwcm92aWRlcnMuZm9yRWFjaChwcm92aWRlciA9PiB7XG4gICAgY29uc3QgY2hlY2tlZCA9IHByb3ZpZGVyID09PSBfbW9kZWxXaXphcmRTZWxlY3RlZFByb3ZpZGVyO1xuICAgIGNvbnN0IHNvdXJjZUxhYmVsID0gX3Byb3ZpZGVyU3RhZ2VMYWJlbChwcm92aWRlciwgY2FwYWJsZVNldCk7XG4gICAgY29uc3QgaW5mbyA9IGdldFByb3ZpZGVySW5mbyhwcm92aWRlcik7XG5cbiAgICBjb25zdCBsYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xhYmVsJyk7XG4gICAgbGFiZWwuc3R5bGUuY3NzVGV4dCA9ICdkaXNwbGF5OmZsZXg7IGFsaWduLWl0ZW1zOmNlbnRlcjsgZ2FwOjZweDsgcGFkZGluZzo0cHggOHB4OyBib3JkZXI6MXB4IHNvbGlkICNjYmQ1ZTE7IGJvcmRlci1yYWRpdXM6OTk5cHg7IGZvbnQtc2l6ZTowLjgyZW07IGJhY2tncm91bmQ6I2ZmZjsgY3Vyc29yOnBvaW50ZXI7JztcbiAgICBsYWJlbC5pbm5lckhUTUwgPVxuICAgICAgYDxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwibW9kZWwtcHJvdmlkZXItY2hvaWNlXCIgdmFsdWU9XCIke2VzY2FwZUh0bWwocHJvdmlkZXIpfVwiICR7Y2hlY2tlZCA/ICdjaGVja2VkJyA6ICcnfSBzdHlsZT1cIm1hcmdpbjowO1wiIC8+YCArXG4gICAgICBgPHNwYW4+JHtlc2NhcGVIdG1sKF9wcm92aWRlckRpc3BsYXlMYWJlbChwcm92aWRlcikpfTwvc3Bhbj5gICtcbiAgICAgIGA8c3BhbiBzdHlsZT1cImNvbG9yOiM2NDc0OGI7IGZvbnQtc2l6ZTowLjhlbTtcIj4oJHtlc2NhcGVIdG1sKHNvdXJjZUxhYmVsKX0pPC9zcGFuPmA7XG5cbiAgICAvLyBBcHBlbmQgYSBcdTI0RDggYnV0dG9uIHdpcmVkIHRvIGEgQlM1IEhUTUwgcG9wb3ZlciBzbyBsaW5rcyBpbnNpZGUgYXJlIGNsaWNrYWJsZS5cbiAgICBpZiAoaW5mbykge1xuICAgICAgY29uc3QgYnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgICBidG4udHlwZSA9ICdidXR0b24nO1xuICAgICAgYnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsICdQcm92aWRlciBpbmZvJyk7XG4gICAgICBidG4uc2V0QXR0cmlidXRlKCdkYXRhLWJzLXRvZ2dsZScsICdwb3BvdmVyJyk7XG4gICAgICBidG4uc2V0QXR0cmlidXRlKCdkYXRhLWJzLXRyaWdnZXInLCAnY2xpY2snKTtcbiAgICAgIGJ0bi5zZXRBdHRyaWJ1dGUoJ2RhdGEtYnMtcGxhY2VtZW50JywgJ3JpZ2h0Jyk7XG4gICAgICBidG4uc2V0QXR0cmlidXRlKCdkYXRhLWJzLWh0bWwnLCAndHJ1ZScpO1xuICAgICAgYnRuLnNldEF0dHJpYnV0ZSgnZGF0YS1icy1jb250YWluZXInLCAnYm9keScpO1xuICAgICAgYnRuLnNldEF0dHJpYnV0ZSgnZGF0YS1icy1jb250ZW50JywgcHJvdmlkZXJJbmZvUG9wb3ZlckNvbnRlbnQoaW5mbykpO1xuICAgICAgYnRuLnN0eWxlLmNzc1RleHQgPSAnYmFja2dyb3VuZDpub25lO2JvcmRlcjpub25lO2N1cnNvcjpwb2ludGVyO2NvbG9yOiM2NDc0OGI7Zm9udC1zaXplOjAuOWVtO3BhZGRpbmc6MCAxcHg7bGluZS1oZWlnaHQ6MTt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7JztcbiAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICdcdTI0RDgnO1xuICAgICAgLy8gUHJldmVudCB0aGUgcmFkaW8tbGFiZWwgY2xpY2sgZnJvbSBwcm9wYWdhdGluZyB0byB0aGUgcmFkaW8gYnV0dG9uLlxuICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZSA9PiBlLnN0b3BQcm9wYWdhdGlvbigpKTtcbiAgICAgIGxhYmVsLmFwcGVuZENoaWxkKGJ0bik7XG5cbiAgICAgIC8vIEluaXRpYWxpc2UgYWZ0ZXIgYXBwZW5kIFx1MjAxNCBCUzUgbXVzdCBmaW5kIHRoZSBlbGVtZW50IGluIHRoZSBET00uXG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICBpZiAod2luZG93LmJvb3RzdHJhcD8uUG9wb3Zlcikge1xuICAgICAgICAgIG5ldyB3aW5kb3cuYm9vdHN0cmFwLlBvcG92ZXIoYnRuLCB7IHNhbml0aXplOiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgY2hlY2tib3ggPSBsYWJlbC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpO1xuICAgIGNoZWNrYm94LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHtcbiAgICAgIGlmICghY2hlY2tib3guY2hlY2tlZCkgcmV0dXJuO1xuICAgICAgX21vZGVsV2l6YXJkU2VsZWN0ZWRQcm92aWRlciA9IHByb3ZpZGVyO1xuICAgICAgX3NlbGVjdGVkTW9kZWxQcm92aWRlcnMgPSBuZXcgU2V0KFtwcm92aWRlcl0pO1xuICAgICAgX3VwZGF0ZU1vZGVsV2l6YXJkTmF2KCk7XG4gICAgfSk7XG5cbiAgICBsaXN0RWwuYXBwZW5kQ2hpbGQobGFiZWwpO1xuICB9KTtcblxuICBfdXBkYXRlTW9kZWxXaXphcmROYXYoKTtcbn1cblxuZnVuY3Rpb24gX3Nob3dNb2RlbFdpemFyZEJ1c3kobWVzc2FnZSkge1xuICBjb25zdCBvdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLXdpemFyZC1idXN5LW92ZXJsYXknKTtcbiAgY29uc3QgbWVzc2FnZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLXdpemFyZC1idXN5LW1lc3NhZ2UnKTtcbiAgaWYgKG1lc3NhZ2VFbCkgbWVzc2FnZUVsLnRleHRDb250ZW50ID0gbWVzc2FnZSB8fCAnV29ya2luZy4uLic7XG4gIGlmIChvdmVybGF5KSBvdmVybGF5LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG59XG5cbmZ1bmN0aW9uIF9oaWRlTW9kZWxXaXphcmRCdXN5KCkge1xuICBjb25zdCBvdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLXdpemFyZC1idXN5LW92ZXJsYXknKTtcbiAgaWYgKG92ZXJsYXkpIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbn1cblxuZnVuY3Rpb24gX3NldE1vZGVsV2l6YXJkU3RlcChzdGVwKSB7XG4gIF9tb2RlbFdpemFyZFN0ZXAgPSBbMSwgMiwgMywgNF0uaW5jbHVkZXMoc3RlcCkgPyBzdGVwIDogMTtcbiAgY29uc3QgcGFuZXMgPSB7XG4gICAgMTogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLXN0ZXAtcHJvdmlkZXInKSxcbiAgICAyOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtc3RlcC1hdXRoJyksXG4gICAgMzogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLXN0ZXAtbW9kZWxzJyksXG4gICAgNDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLXN0ZXAtc3VjY2VzcycpLFxuICB9O1xuICBPYmplY3QuZW50cmllcyhwYW5lcykuZm9yRWFjaCgoW251bSwgZWxdKSA9PiB7XG4gICAgaWYgKGVsKSBlbC5zdHlsZS5kaXNwbGF5ID0gTnVtYmVyKG51bSkgPT09IF9tb2RlbFdpemFyZFN0ZXAgPyAnJyA6ICdub25lJztcbiAgfSk7XG4gIGlmIChfbW9kZWxXaXphcmRTdGVwID09PSAyKSB7XG4gICAgX3JlbmRlckF1dGhTdGVwKF9tb2RlbFdpemFyZFNlbGVjdGVkUHJvdmlkZXIpO1xuICB9XG4gIF91cGRhdGVNb2RlbFdpemFyZE5hdigpO1xufVxuXG5mdW5jdGlvbiBfdXBkYXRlTW9kZWxXaXphcmRQcm9ncmVzc0JhcigpIHtcbiAgWzEsIDIsIDMsIDRdLmZvckVhY2goKHN0ZXBOdW0pID0+IHtcbiAgICBjb25zdCBzdGVwRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgbW9kZWwtcHJvZ3Jlc3Mtc3RlcC0ke3N0ZXBOdW19YCk7XG4gICAgaWYgKCFzdGVwRWwpIHJldHVybjtcbiAgICBjb25zdCBiYWRnZUVsID0gc3RlcEVsLnF1ZXJ5U2VsZWN0b3IoJy5tb2RlbC1wcm9ncmVzcy1iYWRnZScpO1xuICAgIHN0ZXBFbC5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnLCAnaXMtY29tcGxldGUnLCAnaXMtdXBjb21pbmcnKTtcbiAgICBpZiAoc3RlcE51bSA8IF9tb2RlbFdpemFyZFN0ZXApIHtcbiAgICAgIHN0ZXBFbC5jbGFzc0xpc3QuYWRkKCdpcy1jb21wbGV0ZScpO1xuICAgICAgc3RlcEVsLnNldEF0dHJpYnV0ZSgnYXJpYS1jdXJyZW50JywgJ2ZhbHNlJyk7XG4gICAgICBpZiAoYmFkZ2VFbCkgYmFkZ2VFbC50ZXh0Q29udGVudCA9ICdcdTI3MTMnO1xuICAgIH0gZWxzZSBpZiAoc3RlcE51bSA9PT0gX21vZGVsV2l6YXJkU3RlcCkge1xuICAgICAgc3RlcEVsLmNsYXNzTGlzdC5hZGQoJ2lzLWFjdGl2ZScpO1xuICAgICAgc3RlcEVsLnNldEF0dHJpYnV0ZSgnYXJpYS1jdXJyZW50JywgJ3N0ZXAnKTtcbiAgICAgIGlmIChiYWRnZUVsKSBiYWRnZUVsLnRleHRDb250ZW50ID0gU3RyaW5nKHN0ZXBOdW0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGVwRWwuY2xhc3NMaXN0LmFkZCgnaXMtdXBjb21pbmcnKTtcbiAgICAgIHN0ZXBFbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtY3VycmVudCcsICdmYWxzZScpO1xuICAgICAgaWYgKGJhZGdlRWwpIGJhZGdlRWwudGV4dENvbnRlbnQgPSBTdHJpbmcoc3RlcE51bSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gX3VwZGF0ZU1vZGVsV2l6YXJkTmF2KCkge1xuICBjb25zdCBzdGVwTGFiZWwgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLXdpemFyZC1zdGVwLWxhYmVsJyk7XG4gIGNvbnN0IGJhY2tCdG4gICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtd2l6YXJkLWJhY2stYnRuJyk7XG4gIGNvbnN0IG5leHRCdG4gICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtd2l6YXJkLW5leHQtYnRuJyk7XG4gIGNvbnN0IHRlc3RCdG4gICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtdGVzdC1idG4nKTtcbiAgY29uc3QgcmVmcmVzaEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcmljaW5nLXJlZnJlc2gtYnRuJyk7XG4gIGNvbnN0IGZvb3RlciAgICAgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubW9kZWwtd2l6YXJkLWZvb3RlcicpO1xuXG4gIF91cGRhdGVNb2RlbFdpemFyZFByb2dyZXNzQmFyKCk7XG5cbiAgaWYgKHN0ZXBMYWJlbCkge1xuICAgIGNvbnN0IGxhYmVscyA9IHtcbiAgICAgIDE6ICdTdGVwIDEgb2YgNDogQ2hvb3NlIHByb3ZpZGVyJyxcbiAgICAgIDI6ICdTdGVwIDIgb2YgNDogU2V0IHVwIGF1dGhlbnRpY2F0aW9uJyxcbiAgICAgIDM6ICdTdGVwIDMgb2YgNDogQ2hvb3NlIG1vZGVsIGFuZCB0ZXN0IGNvbm5lY3Rpb24nLFxuICAgICAgNDogJ1N0ZXAgNCBvZiA0OiBDb21wbGV0ZScsXG4gICAgfTtcbiAgICBzdGVwTGFiZWwudGV4dENvbnRlbnQgPSBsYWJlbHNbX21vZGVsV2l6YXJkU3RlcF0gfHwgJyc7XG4gIH1cblxuICBpZiAoYmFja0J0bikge1xuICAgIGJhY2tCdG4uZGlzYWJsZWQgPSBfbW9kZWxXaXphcmRTdGVwID09PSAxO1xuICAgIGJhY2tCdG4uc3R5bGUuZGlzcGxheSA9IF9tb2RlbFdpemFyZFN0ZXAgPT09IDQgPyAnbm9uZScgOiAnJztcbiAgfVxuICAvLyBOZXh0IGJ1dHRvbjogdmlzaWJsZSBvbiBzdGVwcyAxIGFuZCAyXG4gIGlmIChuZXh0QnRuKSB7XG4gICAgbmV4dEJ0bi5zdHlsZS5kaXNwbGF5ID0gKF9tb2RlbFdpemFyZFN0ZXAgPT09IDEgfHwgX21vZGVsV2l6YXJkU3RlcCA9PT0gMikgPyAnJyA6ICdub25lJztcbiAgICBuZXh0QnRuLmRpc2FibGVkID0gX21vZGVsV2l6YXJkU3RlcCA9PT0gMSAmJiAhX21vZGVsV2l6YXJkU2VsZWN0ZWRQcm92aWRlcjtcbiAgICBuZXh0QnRuLnRleHRDb250ZW50ID0gX21vZGVsV2l6YXJkU3RlcCA9PT0gMiA/ICdOZXh0JyA6ICdOZXh0JztcbiAgfVxuICBpZiAodGVzdEJ0bikgICAgdGVzdEJ0bi5zdHlsZS5kaXNwbGF5ICAgID0gX21vZGVsV2l6YXJkU3RlcCA9PT0gMyA/ICcnIDogJ25vbmUnO1xuICBpZiAocmVmcmVzaEJ0bikgcmVmcmVzaEJ0bi5zdHlsZS5kaXNwbGF5ID0gX21vZGVsV2l6YXJkU3RlcCA9PT0gMyA/ICcnIDogJ25vbmUnO1xuICBpZiAoZm9vdGVyKSBmb290ZXIuc3R5bGUuanVzdGlmeUNvbnRlbnQgID0gX21vZGVsV2l6YXJkU3RlcCA9PT0gNCA/ICdjZW50ZXInIDogJ3NwYWNlLWJldHdlZW4nO1xufVxuXG5hc3luYyBmdW5jdGlvbiBfbG9hZE1vZGVsc0ZvclNlbGVjdGVkUHJvdmlkZXIoKSB7XG4gIGlmICghX21vZGVsV2l6YXJkU2VsZWN0ZWRQcm92aWRlcikgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGxvYWRpbmdFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1tb2RlbHMtbG9hZGluZycpO1xuICBpZiAobG9hZGluZ0VsKSB7XG4gICAgbG9hZGluZ0VsLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICBsb2FkaW5nRWwuc3R5bGUuY29sb3IgPSAnIzQ3NTU2OSc7XG4gICAgbG9hZGluZ0VsLmlubmVySFRNTCA9ICc8c3BhbiBjbGFzcz1cImxvYWRpbmctc3Bpbm5lclwiIHN0eWxlPVwid2lkdGg6MTRweDtoZWlnaHQ6MTRweDtib3JkZXItd2lkdGg6MnB4O3ZlcnRpY2FsLWFsaWduOm1pZGRsZTttYXJnaW4tcmlnaHQ6NnB4O1wiPjwvc3Bhbj5Mb2FkaW5nIG1vZGVscyBmb3Igc2VsZWN0ZWQgcHJvdmlkZXIuLi4nO1xuICB9XG5cbiAgX3Nob3dNb2RlbFdpemFyZEJ1c3koJ1F1ZXJ5aW5nIGF2YWlsYWJsZSBtb2RlbHMuLi4nKTtcbiAgdHJ5IHtcbiAgICBfc2VsZWN0ZWRNb2RlbFByb3ZpZGVycyA9IG5ldyBTZXQoW19tb2RlbFdpemFyZFNlbGVjdGVkUHJvdmlkZXJdKTtcbiAgICBfbW9kZWxEYXRhLnByb3ZpZGVyID0gX21vZGVsV2l6YXJkU2VsZWN0ZWRQcm92aWRlcjtcbiAgICBhd2FpdCBfcmVmcmVzaE1vZGVsQ2F0YWxvZ0ZvclNlbGVjdGlvbigpO1xuICAgIGlmIChsb2FkaW5nRWwpIHtcbiAgICAgIGxvYWRpbmdFbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgbG9hZGluZ0VsLnRleHRDb250ZW50ID0gJyc7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy53YXJuKCdDb3VsZCBub3QgbG9hZCBtb2RlbHMgZm9yIHNlbGVjdGVkIHByb3ZpZGVyOicsIGVycm9yKTtcbiAgICBpZiAobG9hZGluZ0VsKSB7XG4gICAgICBsb2FkaW5nRWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgbG9hZGluZ0VsLnRleHRDb250ZW50ID0gJ0ZhaWxlZCB0byBsb2FkIG1vZGVscyBmb3Igc2VsZWN0ZWQgcHJvdmlkZXIuJztcbiAgICAgIGxvYWRpbmdFbC5zdHlsZS5jb2xvciA9ICcjYjkxYzFjJztcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGZpbmFsbHkge1xuICAgIF9oaWRlTW9kZWxXaXphcmRCdXN5KCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gbmV4dFdpemFyZFN0ZXAoKSB7XG4gIGlmIChfbW9kZWxXaXphcmRTdGVwID09PSAxKSB7XG4gICAgaWYgKCFfbW9kZWxXaXphcmRTZWxlY3RlZFByb3ZpZGVyKSByZXR1cm47XG4gICAgX3NldE1vZGVsV2l6YXJkU3RlcCgyKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKF9tb2RlbFdpemFyZFN0ZXAgPT09IDIpIHtcbiAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCBfbG9hZE1vZGVsc0ZvclNlbGVjdGVkUHJvdmlkZXIoKTtcbiAgICBpZiAoIWxvYWRlZCkgcmV0dXJuO1xuICAgIF9zZXRNb2RlbFdpemFyZFN0ZXAoMyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJldmlvdXNXaXphcmRTdGVwKCkge1xuICBpZiAoX21vZGVsV2l6YXJkU3RlcCA9PT0gMikgeyBfc2V0TW9kZWxXaXphcmRTdGVwKDEpOyByZXR1cm47IH1cbiAgaWYgKF9tb2RlbFdpemFyZFN0ZXAgPT09IDMpIHsgX3NldE1vZGVsV2l6YXJkU3RlcCgyKTsgcmV0dXJuOyB9XG4gIGlmIChfbW9kZWxXaXphcmRTdGVwID09PSA0KSB7IF9zZXRNb2RlbFdpemFyZFN0ZXAoMyk7IH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gX3JlZnJlc2hNb2RlbENhdGFsb2dGb3JTZWxlY3Rpb24oKSB7XG4gIGlmICghX21vZGVsRGF0YSkgcmV0dXJuO1xuICBpZiAoX2NhdGFsb2dSZWZyZXNoaW5nKSB7XG4gICAgX2NhdGFsb2dSZWZyZXNoUGVuZGluZyA9IHRydWU7XG4gICAgcmV0dXJuO1xuICB9XG4gIF9jYXRhbG9nUmVmcmVzaGluZyA9IHRydWU7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBzZWxlY3RlZCA9IEFycmF5LmZyb20oX3NlbGVjdGVkTW9kZWxQcm92aWRlcnMpO1xuICAgIGlmICghc2VsZWN0ZWQubGVuZ3RoKSB7XG4gICAgICBfc2VsZWN0ZWRNb2RlbFByb3ZpZGVycyA9IG5ldyBTZXQoW19tb2RlbERhdGEucHJvdmlkZXJdKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm92aWRlcnNQYXJhbSA9IGVuY29kZVVSSUNvbXBvbmVudChBcnJheS5mcm9tKF9zZWxlY3RlZE1vZGVsUHJvdmlkZXJzKS5qb2luKCcsJykpO1xuICAgIGNvbnN0IGNhdGFsb2cgPSBhd2FpdCBhcGlDYWxsKCdHRVQnLCBgL2FwaS9tb2RlbC1jYXRhbG9nP3Byb3ZpZGVycz0ke3Byb3ZpZGVyc1BhcmFtfWApO1xuICAgIF9tb2RlbERhdGEuYWxsX21vZGVscyA9IGNhdGFsb2cuYWxsX21vZGVscyB8fCBbXTtcbiAgICBfbW9kZWxEYXRhLnByaWNpbmdfdXBkYXRlZF9hdCA9IGNhdGFsb2cucHJpY2luZ191cGRhdGVkX2F0IHx8IF9tb2RlbERhdGEucHJpY2luZ191cGRhdGVkX2F0O1xuICAgIF9tb2RlbERhdGEucHJpY2luZ19zb3VyY2UgPSBjYXRhbG9nLnByaWNpbmdfc291cmNlIHx8IF9tb2RlbERhdGEucHJpY2luZ19zb3VyY2U7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY2F0YWxvZy5wcm92aWRlcnMpICYmIGNhdGFsb2cucHJvdmlkZXJzLmxlbmd0aCkge1xuICAgICAgX21vZGVsRGF0YS5wcm92aWRlcnMgPSBjYXRhbG9nLnByb3ZpZGVycztcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY2F0YWxvZy5saXN0X21vZGVsc19jYXBhYmxlKSkge1xuICAgICAgX21vZGVsRGF0YS5saXN0X21vZGVsc19jYXBhYmxlID0gY2F0YWxvZy5saXN0X21vZGVsc19jYXBhYmxlO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cud2FybignQ291bGQgbm90IHJlZnJlc2ggbW9kZWwgY2F0YWxvZyBmb3Igc2VsZWN0ZWQgcHJvdmlkZXJzOicsIGVycm9yKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBfY2F0YWxvZ1JlZnJlc2hpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIF9yZW5kZXJQcm92aWRlclNlbGVjdG9yKCk7XG4gIF9idWlsZE1vZGVsVGFibGUoKTtcblxuICBpZiAoX2NhdGFsb2dSZWZyZXNoUGVuZGluZykge1xuICAgIF9jYXRhbG9nUmVmcmVzaFBlbmRpbmcgPSBmYWxzZTtcbiAgICBhd2FpdCBfcmVmcmVzaE1vZGVsQ2F0YWxvZ0ZvclNlbGVjdGlvbigpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG9wZW5Nb2RlbE1vZGFsKCkge1xuICBjb25zdCBvdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLW1vZGFsLW92ZXJsYXknKTtcbiAgaWYgKCFvdmVybGF5KSByZXR1cm47XG5cbiAgaWYgKCFfbW9kZWxEYXRhKSB7XG4gICAgYXdhaXQgbG9hZE1vZGVsU2VsZWN0b3IoKTtcbiAgfVxuICBhd2FpdCBsb2FkUHJvdmlkZXJJbmZvKCk7XG4gIGlmICghX21vZGVsV2l6YXJkU2VsZWN0ZWRQcm92aWRlcikge1xuICAgIF9tb2RlbFdpemFyZFNlbGVjdGVkUHJvdmlkZXIgPSBfbW9kZWxEYXRhPy5wcm92aWRlciB8fCBudWxsO1xuICB9XG4gIGNvbnN0IHN1Y2Nlc3NTdW1tYXJ5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLXN1Y2Nlc3Mtc3VtbWFyeScpO1xuICBpZiAoc3VjY2Vzc1N1bW1hcnkpIHtcbiAgICBzdWNjZXNzU3VtbWFyeS50ZXh0Q29udGVudCA9ICdQcm92aWRlciBhbmQgbW9kZWwgYXJlIGNvbmZpZ3VyZWQgYW5kIHRoZSBjb25uZWN0aW9uIGNoZWNrIHN1Y2NlZWRlZC4nO1xuICB9XG4gIF9yZW5kZXJQcm92aWRlclNlbGVjdG9yKCk7XG4gIF9zeW5jQ2F0YWxvZ1Zpc2liaWxpdHkoKTtcbiAgX3dpcmVHbG9iYWxNb2RlbFNlYXJjaCgpO1xuICBfc2V0TW9kZWxXaXphcmRTdGVwKDEpO1xuICBfaGlkZU1vZGVsV2l6YXJkQnVzeSgpO1xuICBvdmVybGF5LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIF9mb2N1c1N0YWNrLnB1c2goZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7XG4gIHNldEluaXRpYWxGb2N1cygnbW9kZWwtbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ21vZGVsLW1vZGFsLW92ZXJsYXknKTtcbn1cblxuZnVuY3Rpb24gY2xvc2VNb2RlbE1vZGFsKCkge1xuICBjb25zdCBvdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLW1vZGFsLW92ZXJsYXknKTtcbiAgaWYgKG92ZXJsYXkpIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgX3NldE1vZGVsV2l6YXJkU3RlcCgxKTtcbiAgX2hpZGVNb2RlbFdpemFyZEJ1c3koKTtcbiAgaWYgKF9jb3BpbG90QXV0aFBvbGxUaW1lcikge1xuICAgIGNsZWFySW50ZXJ2YWwoX2NvcGlsb3RBdXRoUG9sbFRpbWVyKTtcbiAgICBfY29waWxvdEF1dGhQb2xsVGltZXIgPSBudWxsO1xuICB9XG4gIHJlc3RvcmVGb2N1cygpO1xufVxuXG5mdW5jdGlvbiBfYXBwbHlNb2RlbFJvd1Zpc3VhbFN0YXRlKHRyLCBpc0FjdGl2ZSkge1xuICB0ci5jbGFzc0xpc3QudG9nZ2xlKCdtb2RlbC1yb3ctYWN0aXZlJywgaXNBY3RpdmUpO1xuICB0ci5zdHlsZS5jc3NUZXh0ID0gaXNBY3RpdmVcbiAgICA/ICdiYWNrZ3JvdW5kOiNlZmY2ZmY7IGZvbnQtd2VpZ2h0OjYwMDsgY3Vyc29yOnBvaW50ZXI7J1xuICAgIDogJ2N1cnNvcjpwb2ludGVyOyc7XG5cbiAgY29uc3QgbW9kZWwgPSB0ci5nZXRBdHRyaWJ1dGUoJ2RhdGEtbW9kZWwnKSB8fCAnJztcbiAgY29uc3QgbW9kZWxDZWxsID0gdHIuY2VsbHMgJiYgdHIuY2VsbHNbMV07XG4gIGlmIChtb2RlbENlbGwpIHtcbiAgICBtb2RlbENlbGwuaW5uZXJIVE1MID0gYCR7ZXNjYXBlSHRtbChtb2RlbCl9YCArXG4gICAgICAoaXNBY3RpdmUgPyAnIDxzcGFuIHN0eWxlPVwiY29sb3I6IzNiODJmNjsgZm9udC1zaXplOjAuNzVlbTtcIj4mIzEwMDAzOyBhY3RpdmU8L3NwYW4+JyA6ICcnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfc3luY01vZGVsVGFibGVTZWxlY3Rpb24oKSB7XG4gIGNvbnN0IHRib2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLXRhYmxlLWJvZHknKTtcbiAgaWYgKCF0Ym9keSB8fCAhX21vZGVsRGF0YSkgcmV0dXJuO1xuXG4gIGNvbnN0IGFjdGl2ZVByb3ZpZGVyID0gX21vZGVsRGF0YS5wcm92aWRlcjtcbiAgY29uc3QgYWN0aXZlTW9kZWwgPSBfbW9kZWxEYXRhLm1vZGVsO1xuICB0Ym9keS5xdWVyeVNlbGVjdG9yQWxsKCd0cicpLmZvckVhY2godHIgPT4ge1xuICAgIGNvbnN0IGlzQWN0aXZlID0gKFxuICAgICAgdHIuZ2V0QXR0cmlidXRlKCdkYXRhLXByb3ZpZGVyJykgPT09IGFjdGl2ZVByb3ZpZGVyICYmXG4gICAgICB0ci5nZXRBdHRyaWJ1dGUoJ2RhdGEtbW9kZWwnKSA9PT0gYWN0aXZlTW9kZWxcbiAgICApO1xuICAgIF9hcHBseU1vZGVsUm93VmlzdWFsU3RhdGUodHIsIGlzQWN0aXZlKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIF9idWlsZE1vZGVsVGFibGUoKSB7XG4gIGNvbnN0IHRib2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLXRhYmxlLWJvZHknKTtcbiAgY29uc3QgdGhlYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtdGFibGUtaGVhZCcpO1xuICBpZiAoIXRib2R5IHx8ICFfbW9kZWxEYXRhKSByZXR1cm47XG5cbiAgY29uc3QgY3VycmVudFByb3ZpZGVyID0gX21vZGVsRGF0YS5wcm92aWRlcjtcbiAgY29uc3QgY3VycmVudE1vZGVsICAgID0gX21vZGVsRGF0YS5tb2RlbDtcblxuICAvLyBGaXhlZCA3LWNvbHVtbiBoZWFkZXJzIFx1MjAxNCBubyBkeW5hbWljIHJlYnVpbGRpbmcgbmVlZGVkXG4gIGlmICh0aGVhZCkge1xuICAgIGNvbnN0IHRoUyA9ICdwYWRkaW5nOjEwcHggMTRweDsgd2hpdGUtc3BhY2U6bm93cmFwOyc7XG4gICAgdGhlYWQuaW5uZXJIVE1MID1cbiAgICAgIGA8dHIgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmMWY1Zjk7IHRleHQtYWxpZ246bGVmdDtcIj5gICtcbiAgICAgICAgYDx0aCBzdHlsZT1cIiR7dGhTfVwiPlByb3ZpZGVyPC90aD5gICtcbiAgICAgICAgYDx0aCBzdHlsZT1cIiR7dGhTfVwiPk1vZGVsPC90aD5gICtcbiAgICAgICAgYDx0aCBzdHlsZT1cIiR7dGhTfSB0ZXh0LWFsaWduOnJpZ2h0O1wiPkNvbnRleHQ8L3RoPmAgK1xuICAgICAgICBgPHRoIHN0eWxlPVwiJHt0aFN9IHRleHQtYWxpZ246cmlnaHQ7XCIgdGl0bGU9XCJVU0QgcGVyIDFNIGlucHV0IHRva2VucyAoZGlyZWN0IEFQSSBiaWxsaW5nKVwiPiQvMU0gaW48L3RoPmAgK1xuICAgICAgICBgPHRoIHN0eWxlPVwiJHt0aFN9IHRleHQtYWxpZ246cmlnaHQ7XCIgdGl0bGU9XCJVU0QgcGVyIDFNIG91dHB1dCB0b2tlbnMgKGRpcmVjdCBBUEkgYmlsbGluZylcIj4kLzFNIG91dDwvdGg+YCArXG4gICAgICAgIGA8dGggc3R5bGU9XCIke3RoU30gdGV4dC1hbGlnbjpyaWdodDtcIiB0aXRsZT1cIkdpdEh1YiBDb3BpbG90IHByZW1pdW0tcmVxdWVzdCBtdWx0aXBsaWVyICgwID0gZnJlZSBmb3IgcGFpZCBzdWJzY3JpYmVycylcIj5Db3BpbG90PC90aD5gICtcbiAgICAgICAgYDx0aCBzdHlsZT1cIiR7dGhTfVwiPlNvdXJjZTwvdGg+YCArXG4gICAgICAgIGA8dGggc3R5bGU9XCIke3RoU31cIj5Ob3RlczwvdGg+YCArXG4gICAgICBgPC90cj5gO1xuICB9XG5cbiAgLy8gVGVhciBkb3duIGFueSBleGlzdGluZyBEYXRhVGFibGUgYmVmb3JlIHJlYnVpbGRpbmcgcm93cy5cbiAgaWYgKHdpbmRvdy4kICYmICQuZm4gJiYgJC5mbi5EYXRhVGFibGUgJiYgJC5mbi5EYXRhVGFibGUuaXNEYXRhVGFibGUoJyNtb2RlbC10YWJsZScpKSB7XG4gICAgdHJ5IHtcbiAgICAgIF9tb2RlbERhdGFUYWJsZSA9ICQoJyNtb2RlbC10YWJsZScpLkRhdGFUYWJsZSgpO1xuICAgICAgX21vZGVsRGF0YVRhYmxlLmRlc3Ryb3koKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2cud2FybignRGF0YVRhYmxlLmRlc3Ryb3koKSBmYWlsZWQgKHRhYmxlIG1heSBhbHJlYWR5IGJlIHRvcm4gZG93bik6JywgZSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIF9tb2RlbERhdGFUYWJsZSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLy8gUHJlZmVyIGNyb3NzLXByb3ZpZGVyIGxpc3Q7IGZhbGwgYmFjayB0byBjdXJyZW50LXByb3ZpZGVyIGF2YWlsYWJsZSBsaXN0XG4gIGxldCByb3dzID0gKF9tb2RlbERhdGEuYWxsX21vZGVscyAmJiBfbW9kZWxEYXRhLmFsbF9tb2RlbHMubGVuZ3RoKVxuICAgID8gX21vZGVsRGF0YS5hbGxfbW9kZWxzLmZpbHRlcihyID0+IHIubW9kZWwpXG4gICAgOiAoX21vZGVsRGF0YS5hdmFpbGFibGUgfHwgW10pLm1hcChyID0+XG4gICAgICAgIHR5cGVvZiByID09PSAnb2JqZWN0J1xuICAgICAgICAgID8geyAuLi5yLCBwcm92aWRlcjogY3VycmVudFByb3ZpZGVyIH1cbiAgICAgICAgICA6IHsgbW9kZWw6IHIsIHByb3ZpZGVyOiBjdXJyZW50UHJvdmlkZXIgfVxuICAgICAgKTtcblxuICBfcmVuZGVyUXVpY2tNb2RlbExpc3Qocm93cyk7XG4gIHRib2R5LmlubmVySFRNTCA9ICcnO1xuICBjb25zdCB0ZEJhc2UgID0gJ3BhZGRpbmc6OXB4IDE0cHg7IGJvcmRlci1ib3R0b206MXB4IHNvbGlkICNlMmU4ZjA7JztcbiAgY29uc3QgZm10Q29zdCA9IHYgPT4gKHYgIT0gbnVsbCkgPyAnJCcgKyBOdW1iZXIodikudG9GaXhlZCh2IDwgMSA/IDMgOiAyKSA6ICdcdTIwMTQnO1xuICBjb25zdCBmbXRQcmljZUhpbnQgPSBzb3VyY2UgPT4ge1xuICAgIGlmIChzb3VyY2UgPT09ICdydW50aW1lX2NhY2hlJykge1xuICAgICAgcmV0dXJuICc8c3BhbiB0aXRsZT1cIlByaWNlIGZyb20gcnVudGltZSBjYWNoZVwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6NnB4OyBkaXNwbGF5OmlubGluZS1ibG9jazsgcGFkZGluZzoxcHggNXB4OyBib3JkZXItcmFkaXVzOjk5OXB4OyBiYWNrZ3JvdW5kOiNlY2ZlZmY7IGNvbG9yOiMwZjc2NmU7IGZvbnQtc2l6ZTowLjcyZW07IGZvbnQtd2VpZ2h0OjYwMDsgdmVydGljYWwtYWxpZ246bWlkZGxlO1wiPmNhY2hlPC9zcGFuPic7XG4gICAgfVxuICAgIHJldHVybiAnPHNwYW4gdGl0bGU9XCJQcmljZSBmcm9tIHN0YXRpYyBiYXNlbGluZVwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6NnB4OyBkaXNwbGF5OmlubGluZS1ibG9jazsgcGFkZGluZzoxcHggNXB4OyBib3JkZXItcmFkaXVzOjk5OXB4OyBiYWNrZ3JvdW5kOiNmOGZhZmM7IGNvbG9yOiM2NDc0OGI7IGZvbnQtc2l6ZTowLjcyZW07IGZvbnQtd2VpZ2h0OjYwMDsgdmVydGljYWwtYWxpZ246bWlkZGxlO1wiPnN0YXRpYzwvc3Bhbj4nO1xuICB9O1xuICBjb25zdCBmbXRTb3VyY2UgPSBzID0+IHtcbiAgICBpZiAocyA9PT0gJ2xpc3RfbW9kZWxzJykge1xuICAgICAgcmV0dXJuICc8c3BhbiBzdHlsZT1cImRpc3BsYXk6aW5saW5lLWJsb2NrOyBwYWRkaW5nOjJweCA2cHg7IGJvcmRlci1yYWRpdXM6OTk5cHg7IGJhY2tncm91bmQ6I2VjZmVmZjsgY29sb3I6IzBmNzY2ZTsgZm9udC1zaXplOjAuNzhlbTsgZm9udC13ZWlnaHQ6NjAwO1wiPmxpc3RfbW9kZWxzPC9zcGFuPic7XG4gICAgfVxuICAgIHJldHVybiAnPHNwYW4gc3R5bGU9XCJkaXNwbGF5OmlubGluZS1ibG9jazsgcGFkZGluZzoycHggNnB4OyBib3JkZXItcmFkaXVzOjk5OXB4OyBiYWNrZ3JvdW5kOiNmMWY1Zjk7IGNvbG9yOiM0NzU1Njk7IGZvbnQtc2l6ZTowLjc4ZW07IGZvbnQtd2VpZ2h0OjYwMDtcIj5mYWxsYmFja19zdGF0aWM8L3NwYW4+JztcbiAgfTtcbiAgY29uc3QgZm10TXVsdCA9IHYgPT4ge1xuICAgIGlmICh2ID09IG51bGwpIHJldHVybiAnXHUyMDE0JztcbiAgICBpZiAodiA9PT0gMCkgICByZXR1cm4gJzxzcGFuIHN0eWxlPVwiY29sb3I6IzE2YTM0YTsgZm9udC13ZWlnaHQ6NjAwO1wiPmZyZWU8L3NwYW4+JztcbiAgICByZXR1cm4gTnVtYmVyKHYpLnRvRml4ZWQodiAlIDEgPT09IDAgPyAwIDogMikgKyAnJnRpbWVzOyc7XG4gIH07XG5cbiAgcm93cy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgIGNvbnN0IHByb3ZpZGVyICAgPSBpdGVtLnByb3ZpZGVyIHx8IGN1cnJlbnRQcm92aWRlcjtcbiAgICBjb25zdCBtICAgICAgICAgID0gaXRlbS5tb2RlbDtcbiAgICBjb25zdCBjdHggICAgICAgID0gaXRlbS5jb250ZXh0X3dpbmRvdyA/IE51bWJlcihpdGVtLmNvbnRleHRfd2luZG93KS50b0xvY2FsZVN0cmluZygpIDogJ1x1MjAxNCc7XG4gICAgY29uc3Qgc291cmNlICAgICA9IGl0ZW0uc291cmNlIHx8ICdmYWxsYmFja19zdGF0aWMnO1xuICAgIGNvbnN0IHByaWNlU291cmNlID0gaXRlbS5wcmljZV9zb3VyY2UgfHwgJ3N0YXRpY19iYXNlbGluZSc7XG4gICAgY29uc3Qgbm90ZXMgICAgICA9IGl0ZW0ubm90ZXMgfHwgJyc7XG4gICAgY29uc3QgaXNTZWxlY3RlZCA9IChwcm92aWRlciA9PT0gY3VycmVudFByb3ZpZGVyICYmIG0gPT09IGN1cnJlbnRNb2RlbCk7XG5cbiAgICBjb25zdCB0ciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7XG4gICAgdHIuc2V0QXR0cmlidXRlKCdkYXRhLXByb3ZpZGVyJywgcHJvdmlkZXIpO1xuICAgIHRyLnNldEF0dHJpYnV0ZSgnZGF0YS1tb2RlbCcsIG0pO1xuICAgIF9hcHBseU1vZGVsUm93VmlzdWFsU3RhdGUodHIsIGlzU2VsZWN0ZWQpO1xuICAgIHRyLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsICgpID0+IHtcbiAgICAgIGlmICghdHIuY2xhc3NMaXN0LmNvbnRhaW5zKCdtb2RlbC1yb3ctYWN0aXZlJykpIHRyLnN0eWxlLmJhY2tncm91bmQgPSAnI2Y4ZmFmYyc7XG4gICAgfSk7XG4gICAgdHIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdXQnLCAoKSA9PiB7XG4gICAgICBpZiAoIXRyLmNsYXNzTGlzdC5jb250YWlucygnbW9kZWwtcm93LWFjdGl2ZScpKSB0ci5zdHlsZS5iYWNrZ3JvdW5kID0gJyc7XG4gICAgfSk7XG5cbiAgICB0ci5pbm5lckhUTUwgPVxuICAgICAgYDx0ZCBzdHlsZT1cIiR7dGRCYXNlfSBjb2xvcjojNjQ3NDhiOyB3aGl0ZS1zcGFjZTpub3dyYXA7XCI+JHtlc2NhcGVIdG1sKF9wcm92aWRlckRpc3BsYXlMYWJlbChwcm92aWRlcikpfTwvdGQ+YCArXG4gICAgICBgPHRkIHN0eWxlPVwiJHt0ZEJhc2V9XCI+JHtlc2NhcGVIdG1sKG0pfTwvdGQ+YCArXG4gICAgICBgPHRkIHN0eWxlPVwiJHt0ZEJhc2V9IHdoaXRlLXNwYWNlOm5vd3JhcDsgdGV4dC1hbGlnbjpyaWdodDsgZm9udC12YXJpYW50LW51bWVyaWM6dGFidWxhci1udW1zO1wiPiR7Y3R4fTwvdGQ+YCArXG4gICAgICBgPHRkIHN0eWxlPVwiJHt0ZEJhc2V9IHRleHQtYWxpZ246cmlnaHQ7IGZvbnQtdmFyaWFudC1udW1lcmljOnRhYnVsYXItbnVtczsgd2hpdGUtc3BhY2U6bm93cmFwO1wiPiR7Zm10Q29zdChpdGVtLmNvc3RfaW5wdXQpfSR7Zm10UHJpY2VIaW50KHByaWNlU291cmNlKX08L3RkPmAgK1xuICAgICAgYDx0ZCBzdHlsZT1cIiR7dGRCYXNlfSB0ZXh0LWFsaWduOnJpZ2h0OyBmb250LXZhcmlhbnQtbnVtZXJpYzp0YWJ1bGFyLW51bXM7IHdoaXRlLXNwYWNlOm5vd3JhcDtcIj4ke2ZtdENvc3QoaXRlbS5jb3N0X291dHB1dCl9JHtmbXRQcmljZUhpbnQocHJpY2VTb3VyY2UpfTwvdGQ+YCArXG4gICAgICBgPHRkIHN0eWxlPVwiJHt0ZEJhc2V9IHRleHQtYWxpZ246cmlnaHQ7IGZvbnQtdmFyaWFudC1udW1lcmljOnRhYnVsYXItbnVtczsgd2hpdGUtc3BhY2U6bm93cmFwO1wiPiR7Zm10TXVsdChpdGVtLmNvcGlsb3RfbXVsdGlwbGllcil9PC90ZD5gICtcbiAgICAgIGA8dGQgc3R5bGU9XCIke3RkQmFzZX0gd2hpdGUtc3BhY2U6bm93cmFwO1wiPiR7Zm10U291cmNlKHNvdXJjZSl9PC90ZD5gICtcbiAgICAgIGA8dGQgc3R5bGU9XCIke3RkQmFzZX0gY29sb3I6IzY0NzQ4YjtcIj4ke2VzY2FwZUh0bWwobm90ZXMpfTwvdGQ+YDtcbiAgICB0Ym9keS5hcHBlbmRDaGlsZCh0cik7XG4gIH0pO1xuXG4gIC8vIFJlYmluZCByb3cgY2xpY2sgdXNpbmcgZGVsZWdhdGlvbiBzbyBzb3J0aW5nL2ZpbHRlciByZWRyYXdzIHN0aWxsIHdvcmsuXG4gIHRib2R5Lm9uY2xpY2sgPSBhc3luYyAoZXZlbnQpID0+IHtcbiAgICBjb25zdCB0ciA9IGV2ZW50LnRhcmdldC5jbG9zZXN0KCd0cicpO1xuICAgIGlmICghdHIpIHJldHVybjtcbiAgICBjb25zdCBwcm92aWRlciA9IHRyLmdldEF0dHJpYnV0ZSgnZGF0YS1wcm92aWRlcicpO1xuICAgIGNvbnN0IG1vZGVsID0gdHIuZ2V0QXR0cmlidXRlKCdkYXRhLW1vZGVsJyk7XG4gICAgaWYgKCFtb2RlbCkgcmV0dXJuO1xuXG4gICAgLy8gSW1tZWRpYXRlIGZlZWRiYWNrIHdoaWxlIHRoZSBBUEkgY2FsbCBpcyBpbi1mbGlnaHRcbiAgICB0ci5zdHlsZS5jc3NUZXh0ID0gJ2JhY2tncm91bmQ6I2ZlZjNjNzsgY3Vyc29yOndhaXQ7IG9wYWNpdHk6MC44NTsnO1xuICAgIGNvbnN0IG1vZGVsQ2VsbCA9IHRyLmNlbGxzICYmIHRyLmNlbGxzWzFdO1xuICAgIGlmIChtb2RlbENlbGwpIHtcbiAgICAgIG1vZGVsQ2VsbC5pbm5lckhUTUwgPVxuICAgICAgICBgPHNwYW4gY2xhc3M9XCJsb2FkaW5nLXNwaW5uZXJcIiBzdHlsZT1cIndpZHRoOjE0cHg7aGVpZ2h0OjE0cHg7Ym9yZGVyLXdpZHRoOjJweDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7bWFyZ2luLXJpZ2h0OjZweDtcIj48L3NwYW4+JHtlc2NhcGVIdG1sKG1vZGVsKX1gO1xuICAgIH1cbiAgICBjb25zdCBzdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtdGVzdC1zdGF0dXMnKTtcbiAgICBpZiAoc3RhdHVzKSB7XG4gICAgICBzdGF0dXMuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgc3RhdHVzLnN0eWxlLmNvbG9yICAgPSAnIzkyNDAwZSc7XG4gICAgICBzdGF0dXMuaW5uZXJIVE1MICAgICA9XG4gICAgICAgIGA8c3BhbiBjbGFzcz1cImxvYWRpbmctc3Bpbm5lclwiIHN0eWxlPVwid2lkdGg6MTRweDtoZWlnaHQ6MTRweDtib3JkZXItd2lkdGg6MnB4O3ZlcnRpY2FsLWFsaWduOm1pZGRsZTttYXJnaW4tcmlnaHQ6NnB4O1wiPjwvc3Bhbj4gU3dpdGNoaW5nIHRvICR7ZXNjYXBlSHRtbChtb2RlbCl9XFx1MjAyNmA7XG4gICAgfVxuXG4gICAgYXdhaXQgc2V0TW9kZWwobW9kZWwsIHByb3ZpZGVyKTtcbiAgfTtcblxuICAvLyBFbmhhbmNlIHdpdGggRGF0YVRhYmxlcyBmb3Igc29ydGluZy9zZWFyY2hpbmc7IGtlZXAgcGFnaW5nIGRpc2FibGVkLlxuICBpZiAod2luZG93LiQgJiYgJC5mbiAmJiAkLmZuLkRhdGFUYWJsZSkge1xuICAgIF9tb2RlbERhdGFUYWJsZSA9ICQoJyNtb2RlbC10YWJsZScpLkRhdGFUYWJsZSh7XG4gICAgICBwYWdpbmc6IGZhbHNlLFxuICAgICAgc2VhcmNoaW5nOiB0cnVlLFxuICAgICAgaW5mbzogZmFsc2UsXG4gICAgICBvcmRlckNlbGxzVG9wOiB0cnVlLFxuICAgICAgb3JkZXI6IFtbMCwgJ2FzYyddLCBbMSwgJ2FzYyddXSxcbiAgICAgIGF1dG9XaWR0aDogZmFsc2UsXG4gICAgICBsYW5ndWFnZTogeyBzZWFyY2g6ICdGaWx0ZXI6JyB9LFxuICAgICAgaW5pdENvbXBsZXRlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgY29uc3QgYXBpID0gdGhpcy5hcGkoKTtcbiAgICAgICAgY29uc3QgJHRoZWFkID0gJCgnI21vZGVsLXRhYmxlIHRoZWFkJyk7XG4gICAgICAgIGNvbnN0IGhhc0ZpbHRlclJvdyA9ICR0aGVhZC5maW5kKCd0ci5tb2RlbC1maWx0ZXItcm93JykubGVuZ3RoID4gMDtcbiAgICAgICAgaWYgKCFoYXNGaWx0ZXJSb3cpIHtcbiAgICAgICAgICBjb25zdCAkZmlsdGVyUm93ID0gJCgnPHRyIGNsYXNzPVwibW9kZWwtZmlsdGVyLXJvd1wiPjwvdHI+Jyk7XG4gICAgICAgICAgYXBpLmNvbHVtbnMoKS5ldmVyeShmdW5jdGlvbihjb2xJZHgpIHtcbiAgICAgICAgICAgIGNvbnN0IHRpdGxlID0gJChhcGkuY29sdW1uKGNvbElkeCkuaGVhZGVyKCkpLnRleHQoKS50cmltKCk7XG4gICAgICAgICAgICBjb25zdCAkdGggPSAkKCc8dGggc3R5bGU9XCJwYWRkaW5nOjZweCAxMHB4OyBiYWNrZ3JvdW5kOiNmOGZhZmM7IGJvcmRlci10b3A6MXB4IHNvbGlkICNlMmU4ZjA7XCI+PC90aD4nKTtcbiAgICAgICAgICAgIGNvbnN0ICRpbnB1dCA9ICQoJzxpbnB1dD4nLCB7XG4gICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6IHRpdGxlLFxuICAgICAgICAgICAgICBzdHlsZTogJ3dpZHRoOjEwMCU7IHBhZGRpbmc6NHB4IDZweDsgYm9yZGVyOjFweCBzb2xpZCAjY2JkNWUxOyBib3JkZXItcmFkaXVzOjRweDsgZm9udC1zaXplOjAuODJlbTsnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAkdGguYXBwZW5kKCRpbnB1dCk7XG4gICAgICAgICAgICAkZmlsdGVyUm93LmFwcGVuZCgkdGgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgICR0aGVhZC5hcHBlbmQoJGZpbHRlclJvdyk7XG4gICAgICAgIH1cblxuICAgICAgICBhcGkuY29sdW1ucygpLmV2ZXJ5KGZ1bmN0aW9uKGNvbElkeCkge1xuICAgICAgICAgIGNvbnN0ICRpbnB1dCA9ICQoJyNtb2RlbC10YWJsZSB0aGVhZCB0ci5tb2RlbC1maWx0ZXItcm93IHRoJykuZXEoY29sSWR4KS5maW5kKCdpbnB1dCcpO1xuICAgICAgICAgIGlmICghJGlucHV0Lmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICAgICRpbnB1dC5vZmYoJ2NsaWNrLm1vZGVsRmlsdGVyIGtleXVwLm1vZGVsRmlsdGVyIGNoYW5nZS5tb2RlbEZpbHRlcicpO1xuICAgICAgICAgICRpbnB1dC5vbignY2xpY2subW9kZWxGaWx0ZXInLCBmdW5jdGlvbihldmVudCkgeyBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgfSk7XG4gICAgICAgICAgJGlucHV0Lm9uKCdrZXl1cC5tb2RlbEZpbHRlciBjaGFuZ2UubW9kZWxGaWx0ZXInLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICAgICAgICAgIGlmIChhcGkuY29sdW1uKGNvbElkeCkuc2VhcmNoKCkgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgIGFwaS5jb2x1bW4oY29sSWR4KS5zZWFyY2godmFsdWUpLmRyYXcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgX3N5bmNNb2RlbFRhYmxlU2VsZWN0aW9uKCk7XG5cbiAgLy8gVXBkYXRlIHByaWNpbmcgZnJlc2huZXNzIGZvb3RlclxuICBfdXBkYXRlUHJpY2luZ0Zvb3RlcigpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZXRNb2RlbChtb2RlbCwgcHJvdmlkZXIpIHtcbiAgaWYgKCFtb2RlbCkgcmV0dXJuO1xuICBfc2hvd01vZGVsV2l6YXJkQnVzeShgQXBwbHlpbmcgbW9kZWwgJHttb2RlbH0uLi5gKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXlsb2FkID0gcHJvdmlkZXIgPyB7IG1vZGVsLCBwcm92aWRlciB9IDogeyBtb2RlbCB9O1xuICAgIGF3YWl0IGFwaUNhbGwoJ1BPU1QnLCAnL2FwaS9tb2RlbCcsIHBheWxvYWQpO1xuICAgIGlmIChfbW9kZWxEYXRhKSB7XG4gICAgICBfbW9kZWxEYXRhLm1vZGVsID0gbW9kZWw7XG4gICAgICBpZiAocHJvdmlkZXIpIF9tb2RlbERhdGEucHJvdmlkZXIgPSBwcm92aWRlcjtcbiAgICB9XG4gICAgY29uc3QgZWZmZWN0aXZlUHJvdmlkZXIgPSAoX21vZGVsRGF0YSAmJiBfbW9kZWxEYXRhLnByb3ZpZGVyKSB8fCBwcm92aWRlcjtcbiAgICBjb25zdCBsYWJlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1jdXJyZW50LWxhYmVsJyk7XG4gICAgaWYgKGxhYmVsKSB7XG4gICAgICBsYWJlbC50ZXh0Q29udGVudCA9IGVmZmVjdGl2ZVByb3ZpZGVyID8gYCR7ZWZmZWN0aXZlUHJvdmlkZXJ9IFx1MDBCNyAke21vZGVsfWAgOiBtb2RlbDtcbiAgICB9XG4gICAgX2FwcGVuZFJlY2VudE1vZGVsKGVmZmVjdGl2ZVByb3ZpZGVyLCBtb2RlbCk7XG4gICAgX3N5bmNNb2RlbFRhYmxlU2VsZWN0aW9uKCk7XG4gICAgX3JlbmRlclF1aWNrTW9kZWxMaXN0KChfbW9kZWxEYXRhICYmIF9tb2RlbERhdGEuYWxsX21vZGVscykgfHwgW10pO1xuICAgIF91cGRhdGVMbG1TdGF0dXNQaWxsKCdjb25maWd1cmVkJywgYCR7ZWZmZWN0aXZlUHJvdmlkZXIgfHwgJ1Byb3ZpZGVyJ30gY29uZmlndXJlZGApO1xuXG4gICAgX3NhdmVNb2RlbFByZWZzVG9TdG9yYWdlKHtcbiAgICAgIGN1cnJlbnRNb2RlbFByb3ZpZGVyOiBlZmZlY3RpdmVQcm92aWRlciB8fCBudWxsLFxuICAgICAgY3VycmVudE1vZGVsTmFtZTogbW9kZWwgfHwgbnVsbCxcbiAgICB9KTtcbiAgICBpZiAodHlwZW9mIGdsb2JhbFRoaXMudXBkYXRlQXV0aEJhZGdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBnbG9iYWxUaGlzLnVwZGF0ZUF1dGhCYWRnZSh7fSwgZWZmZWN0aXZlUHJvdmlkZXIgfHwgbnVsbCk7XG4gICAgfVxuICAgIGF3YWl0IF9yZWZyZXNoQ29waWxvdEF1dGhTdGF0dXMoKTtcbiAgICBhd2FpdCB0ZXN0Q3VycmVudE1vZGVsKCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2cuZXJyb3IoJ0ZhaWxlZCB0byBzd2l0Y2ggbW9kZWw6JywgZSk7XG4gICAgY29uc3QgbXNnID0gZS5tZXNzYWdlIHx8IFN0cmluZyhlKTtcbiAgICBfc3luY01vZGVsVGFibGVTZWxlY3Rpb24oKTtcbiAgICBjb25zdCBzdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtdGVzdC1zdGF0dXMnKTtcbiAgICBpZiAoc3RhdHVzKSB7XG4gICAgICBzdGF0dXMuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgc3RhdHVzLnN0eWxlLmNvbG9yID0gJyNkYzI2MjYnO1xuICAgICAgc3RhdHVzLnRleHRDb250ZW50ID0gYFx1Mjc0QyAke21zZ31gO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGFwcGVuZE1lc3NhZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsIGBcdTI3NEMgTW9kZWwgc3dpdGNoIGZhaWxlZDogJHttc2d9YCk7XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIF9oaWRlTW9kZWxXaXphcmRCdXN5KCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gdGVzdEN1cnJlbnRNb2RlbCgpIHtcbiAgLy8gVXBkYXRlIGJvdGggdGhlIGhlYWRlciBiYWRnZSBhbmQgdGhlIG1vZGFsIHN0YXR1cyBsaW5lXG4gIGNvbnN0IGJhZGdlICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC10ZXN0LWJhZGdlJyk7XG4gIGNvbnN0IHN0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC10ZXN0LXN0YXR1cycpO1xuICBjb25zdCBidG4gICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtdGVzdC1idG4nKTtcblxuICBjb25zdCBTUElOID0gJ1x1MjNGMyc7XG4gIGNvbnN0IE9LICAgPSAnXHUyNzA1JztcbiAgY29uc3QgRkFJTCA9ICdcdTI3NEMnO1xuXG4gIGNvbnN0IHNldFJ1bm5pbmcgPSAoKSA9PiB7XG4gICAgaWYgKGJhZGdlKSAgeyBiYWRnZS50ZXh0Q29udGVudCAgPSBTUElOOyBiYWRnZS5zdHlsZS5kaXNwbGF5ICA9ICcnOyBiYWRnZS50aXRsZSAgPSAnVGVzdGluZ1x1MjAyNic7IH1cbiAgICBpZiAoc3RhdHVzKSB7IHN0YXR1cy5pbm5lckhUTUwgICA9IGAke1NQSU59IFRlc3RpbmcgY29ubmVjdGlvblx1MjAyNmA7IHN0YXR1cy5zdHlsZS5kaXNwbGF5ID0gJyc7IH1cbiAgICBpZiAoYnRuKSAgICB7IGJ0bi5kaXNhYmxlZCA9IHRydWU7IGJ0bi50ZXh0Q29udGVudCA9ICdcdTIzRjMgVGVzdGluZ1x1MjAyNic7IH1cbiAgICBfdXBkYXRlTGxtU3RhdHVzUGlsbCgnY29ubmVjdGluZycsICdDb25uZWN0aW5nXHUyMDI2JywgJ1x1MjlENycpO1xuICB9O1xuXG4gIGNvbnN0IHNldE9rID0gKGxhdGVuY3lNcykgPT4ge1xuICAgIGNvbnN0IHRpcCA9IGBDb25uZWN0ZWQgXHUyMDE0ICR7bGF0ZW5jeU1zfW1zYDtcbiAgICBpZiAoYmFkZ2UpICB7IGJhZGdlLnRleHRDb250ZW50ICA9IE9LOyAgYmFkZ2Uuc3R5bGUuZGlzcGxheSAgPSAnJzsgYmFkZ2UudGl0bGUgID0gdGlwOyB9XG4gICAgaWYgKHN0YXR1cykgeyBzdGF0dXMuaW5uZXJIVE1MICAgPSBgJHtPS30gJHt0aXB9YDsgc3RhdHVzLnN0eWxlLmNvbG9yID0gJyMxNmEzNGEnOyBzdGF0dXMuc3R5bGUuZGlzcGxheSA9ICcnOyB9XG4gICAgaWYgKGJ0bikgICAgeyBidG4uZGlzYWJsZWQgPSBmYWxzZTsgYnRuLmlubmVySFRNTCA9ICcmIzEwMDAzOyBUZXN0IGNvbm5lY3Rpb24nOyB9XG4gICAgX3VwZGF0ZUxsbVN0YXR1c1BpbGwoJ2Nvbm5lY3RlZCcsIGBIZWFsdGh5ICgke2xhdGVuY3lNc31tcylgLCAnXHUyNzEzJyk7XG4gICAgY29uc3Qgc3VjY2Vzc1N1bW1hcnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtc3VjY2Vzcy1zdW1tYXJ5Jyk7XG4gICAgaWYgKHN1Y2Nlc3NTdW1tYXJ5KSB7XG4gICAgICBzdWNjZXNzU3VtbWFyeS50ZXh0Q29udGVudCA9IGBDb25uZWN0aW9uIHZlcmlmaWVkIGluICR7bGF0ZW5jeU1zfW1zLiBZb3UgY2FuIGNsb3NlIHRoZSB3aXphcmQgYW5kIGNvbnRpbnVlLmA7XG4gICAgfVxuICAgIF9zZXRNb2RlbFdpemFyZFN0ZXAoNCk7XG4gIH07XG5cbiAgY29uc3Qgc2V0RmFpbCA9IChlcnJNc2cpID0+IHtcbiAgICBpZiAoYmFkZ2UpICB7IGJhZGdlLnRleHRDb250ZW50ICA9IEZBSUw7IGJhZGdlLnN0eWxlLmRpc3BsYXkgID0gJyc7IGJhZGdlLnRpdGxlICA9IGVyck1zZzsgfVxuICAgIGlmIChzdGF0dXMpIHtcbiAgICAgIHN0YXR1cy5pbm5lckhUTUwgICA9IGAke0ZBSUx9IDxzcGFuIHRpdGxlPVwiJHtlcnJNc2cucmVwbGFjZSgvXCIvZywgJyZxdW90OycpfVwiIHN0eWxlPVwiY3Vyc29yOmhlbHA7IHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmUgZG90dGVkO1wiPkNvbm5lY3Rpb24gZmFpbGVkPC9zcGFuPmA7XG4gICAgICBzdGF0dXMuc3R5bGUuY29sb3IgPSAnI2RjMjYyNic7XG4gICAgICBzdGF0dXMuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgIH1cbiAgICBpZiAoYnRuKSAgICB7IGJ0bi5kaXNhYmxlZCA9IGZhbHNlOyBidG4uaW5uZXJIVE1MID0gJyYjMTAwMDM7IFRlc3QgY29ubmVjdGlvbic7IH1cbiAgICBfdXBkYXRlTGxtU3RhdHVzUGlsbCgnZXJyb3InLCAnQ29ubmVjdGlvbiBmYWlsZWQnLCAnXHUyNkEwJywgZXJyTXNnKTtcbiAgICBpZiAoX21vZGVsV2l6YXJkU3RlcCA9PT0gMykge1xuICAgICAgX3NldE1vZGVsV2l6YXJkU3RlcCgyKTtcbiAgICB9XG4gIH07XG5cbiAgc2V0UnVubmluZygpO1xuICBfc2hvd01vZGVsV2l6YXJkQnVzeSgnVGVzdGluZyBtb2RlbCBjb25uZWN0aW9uLi4uJyk7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYXBpQ2FsbCgnUE9TVCcsICcvYXBpL21vZGVsL3Rlc3QnKTtcbiAgICBpZiAocmVzdWx0Lm9rKSB7XG4gICAgICBzZXRPayhyZXN1bHQubGF0ZW5jeV9tcyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgc2V0RmFpbChyZXN1bHQuZXJyb3IgfHwgJ1Vua25vd24gZXJyb3InKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBzZXRGYWlsKGUubWVzc2FnZSB8fCBTdHJpbmcoZSkpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBmaW5hbGx5IHtcbiAgICBfaGlkZU1vZGVsV2l6YXJkQnVzeSgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF91cGRhdGVQcmljaW5nRm9vdGVyKCkge1xuICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcmljaW5nLXVwZGF0ZWQtbGFiZWwnKTtcbiAgaWYgKCFlbCB8fCAhX21vZGVsRGF0YSkgcmV0dXJuO1xuICBjb25zdCB0cyAgICAgPSBfbW9kZWxEYXRhLnByaWNpbmdfdXBkYXRlZF9hdDtcbiAgY29uc3Qgc291cmNlID0gX21vZGVsRGF0YS5wcmljaW5nX3NvdXJjZTtcblxuICBjb25zdCBzb3VyY2VMYWJlbCA9IChzb3VyY2UgPT09ICdvcGVucm91dGVyJylcbiAgICA/ICc8YSBocmVmPVwiaHR0cHM6Ly9vcGVucm91dGVyLmFpXCIgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9vcGVuZXJcIiAnICtcbiAgICAgICdzdHlsZT1cImNvbG9yOmluaGVyaXQ7IHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmUgZG90dGVkO1wiPk9wZW5Sb3V0ZXI8L2E+J1xuICAgIDogJ3N0YXRpYyBiYXNlbGluZSAoTWFyY2ggMjAyNiknO1xuXG4gIGlmICghdHMpIHsgZWwuaW5uZXJIVE1MID0gYFByaWNlczogJHtzb3VyY2VMYWJlbH1gOyByZXR1cm47IH1cbiAgdHJ5IHtcbiAgICBjb25zdCBkICAgPSBuZXcgRGF0ZSh0cyk7XG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICBjb25zdCBoICAgPSBNYXRoLnJvdW5kKChub3cgLSBkKSAvIDNfNjAwXzAwMCk7XG4gICAgY29uc3QgYWdlID0gaCA8IDEgPyAnanVzdCBub3cnIDogaCA8IDI0ID8gYCR7aH1oIGFnb2AgOiBgJHtNYXRoLnJvdW5kKGggLyAyNCl9ZCBhZ29gO1xuICAgIGVsLmlubmVySFRNTCA9IGBQcmljZXMgdmlhICR7c291cmNlTGFiZWx9ICZtaWRkb3Q7IHVwZGF0ZWQgJHthZ2V9YDtcbiAgfSBjYXRjaCB7IGVsLmlubmVySFRNTCA9IGBQcmljZXM6ICR7c291cmNlTGFiZWx9YDsgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZWZyZXNoTW9kZWxQcmljaW5nKCkge1xuICBjb25zdCBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJpY2luZy1yZWZyZXNoLWJ0bicpO1xuICBjb25zdCBsYmwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJpY2luZy11cGRhdGVkLWxhYmVsJyk7XG4gIGlmIChidG4pIHsgYnRuLmRpc2FibGVkID0gdHJ1ZTsgYnRuLnRleHRDb250ZW50ID0gJ1JlZnJlc2hpbmdcdTIwMjYnOyB9XG4gIF9zaG93TW9kZWxXaXphcmRCdXN5KCdSZWZyZXNoaW5nIG1vZGVsIHByaWNpbmcuLi4nKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBhcGlDYWxsKCdQT1NUJywgJy9hcGkvbW9kZWwtcHJpY2luZy9yZWZyZXNoJyk7XG4gICAgLy8gUmUtZmV0Y2ggbW9kZWwgZGF0YSBzbyB0aGUgdGFibGUgZ2V0cyBmcmVzaCBwcmljZXNcbiAgICBfbW9kZWxEYXRhID0gYXdhaXQgYXBpQ2FsbCgnR0VUJywgJy9hcGkvbW9kZWwnKTtcbiAgICBfYnVpbGRNb2RlbFRhYmxlKCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAobGJsKSBsYmwudGV4dENvbnRlbnQgPSAnUmVmcmVzaCBmYWlsZWQnO1xuICAgIGxvZy5lcnJvcignUHJpY2luZyByZWZyZXNoIGZhaWxlZDonLCBlKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBfaGlkZU1vZGVsV2l6YXJkQnVzeSgpO1xuICAgIGlmIChidG4pIHsgYnRuLmRpc2FibGVkID0gZmFsc2U7IGJ0bi50ZXh0Q29udGVudCA9ICdcdTIxQkIgUmVmcmVzaCBwcmljZXMnOyB9XG4gIH1cbn1cblxuXG4vLyBIZWxwZXI6IHVwZGF0ZSB3b3JrZmxvdyBzdGVwIGJhciBjbGlja2FibGUgc3RhdGVcbmZ1bmN0aW9uIHVwZGF0ZVdvcmtmbG93U3RlcHNDbGlja2FibGUoY3VycmVudFBoYXNlKSB7XG4gIC8vIFNlcXVlbnRpYWwgcHJlLWxheW91dCBzdGVwcyB1bmxvY2sgb25lLWJ5LW9uZSBhcyB0aGUgdXNlciBwcm9ncmVzc2VzLlxuICBjb25zdCBzZXF1ZW50aWFsU3RlcHMgPSBbXG4gICAgJ3N0ZXAtam9iJyxcbiAgICAnc3RlcC1hbmFseXNpcycsXG4gICAgJ3N0ZXAtY3VzdG9taXphdGlvbnMnLFxuICAgICdzdGVwLXJld3JpdGUnLFxuICAgICdzdGVwLXNwZWxsJyxcbiAgICAnc3RlcC1sYXlvdXQnLFxuICBdO1xuICAvLyBQb3N0LWxheW91dCBzdGVwcyBhbGwgdW5sb2NrIHNpbXVsdGFuZW91c2x5IG9uY2UgbGF5b3V0IGlzIGNvbmZpcm1lZC5cbiAgY29uc3QgcG9zdExheW91dFN0ZXBzID0gW1xuICAgICdzdGVwLWRvd25sb2FkJyxcbiAgICAnc3RlcC1jb3Zlcl9sZXR0ZXInLFxuICAgICdzdGVwLXNjcmVlbmluZycsXG4gICAgJ3N0ZXAtaW50ZXJ2aWV3X3ByZXAnLFxuICAgICdzdGVwLXRoYW5rX3lvdScsXG4gICAgJ3N0ZXAtaGFydmVzdCcsXG4gIF07XG4gIC8vIE1hcCBiYWNrZW5kIHBoYXNlIHN0cmluZ3MgdG8gaG93IG1hbnkgc2VxdWVudGlhbCBzdGVwcyBhcmUgdW5sb2NrZWQgKDAtYmFzZWQgaW5kZXgpLlxuICBjb25zdCBwaGFzZVRvSW5kZXggPSB7XG4gICAgJ2luaXQnOiAgICAgICAgICAgICAwLFxuICAgICdqb2JfYW5hbHlzaXMnOiAgICAgMSxcbiAgICAnY3VzdG9taXphdGlvbic6ICAgIDIsXG4gICAgJ3Jld3JpdGVfcmV2aWV3JzogICAzLFxuICAgICdzcGVsbF9jaGVjayc6ICAgICAgNCxcbiAgICAnZ2VuZXJhdGlvbic6ICAgICAgIDUsXG4gICAgJ2xheW91dF9yZXZpZXcnOiAgICA1LFxuICAgICdmaW5hbF9nZW5lcmF0aW9uJzogNSxcbiAgICAncmVmaW5lbWVudCc6ICAgICAgIDUsXG4gICAgLy8gTGVnYWN5IGZhbGxiYWNrcyAoc3RlcCBuYW1lcyBzb21ldGltZXMgcGFzc2VkIG9uIERPTUNvbnRlbnRMb2FkZWQpXG4gICAgJ2pvYic6ICAgICAgICAgICAgICAwLFxuICAgICdsYXlvdXQnOiAgICAgICAgICAgNSxcbiAgICAnZmluYWxpc2UnOiAgICAgICAgIDUsXG4gIH07XG4gIGNvbnN0IHBvc3RMYXlvdXRVbmxvY2tlZCA9IFsnZmluYWxfZ2VuZXJhdGlvbicsICdyZWZpbmVtZW50J10uaW5jbHVkZXMoY3VycmVudFBoYXNlKTtcbiAgY29uc3QgY3VycmVudElkeCA9IHBoYXNlVG9JbmRleFtjdXJyZW50UGhhc2VdID8/IDA7XG5cbiAgZnVuY3Rpb24gX21ha2VTdGVwQ2xpY2thYmxlKGVsKSB7XG4gICAgaWYgKCFlbCB8fCBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2NsaWNrYWJsZScpKSByZXR1cm47XG4gICAgZWwuY2xhc3NMaXN0LmFkZCgnY2xpY2thYmxlJyk7XG4gICAgZWwuc2V0QXR0cmlidXRlKCdyb2xlJywgJ2J1dHRvbicpO1xuICAgIGVsLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnMCcpO1xuICAgIGlmICghZWwuX3N0ZXBLZXlIYW5kbGVyKSB7XG4gICAgICBlbC5fc3RlcEtleUhhbmRsZXIgPSAoZSkgPT4ge1xuICAgICAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicgfHwgZS5rZXkgPT09ICcgJykge1xuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBlbC5jbGljaygpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGVsLl9zdGVwS2V5SGFuZGxlcik7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gX21ha2VTdGVwSW5lcnQoZWwpIHtcbiAgICBpZiAoIWVsKSByZXR1cm47XG4gICAgZWwuY2xhc3NMaXN0LnJlbW92ZSgnY2xpY2thYmxlJyk7XG4gICAgZWwucmVtb3ZlQXR0cmlidXRlKCdyb2xlJyk7XG4gICAgZWwuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICctMScpO1xuICAgIGlmIChlbC5fc3RlcEtleUhhbmRsZXIpIHtcbiAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBlbC5fc3RlcEtleUhhbmRsZXIpO1xuICAgICAgZGVsZXRlIGVsLl9zdGVwS2V5SGFuZGxlcjtcbiAgICB9XG4gIH1cblxuICBzZXF1ZW50aWFsU3RlcHMuZm9yRWFjaCgoaWQsIGlkeCkgPT4ge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgIGlmICghZWwpIHJldHVybjtcbiAgICBpZiAoaWR4IDw9IGN1cnJlbnRJZHggfHwgcG9zdExheW91dFVubG9ja2VkKSB7XG4gICAgICBfbWFrZVN0ZXBDbGlja2FibGUoZWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICBfbWFrZVN0ZXBJbmVydChlbCk7XG4gICAgfVxuICB9KTtcblxuICBwb3N0TGF5b3V0U3RlcHMuZm9yRWFjaChpZCA9PiB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIGlmIChwb3N0TGF5b3V0VW5sb2NrZWQpIHtcbiAgICAgIF9tYWtlU3RlcENsaWNrYWJsZShlbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIF9tYWtlU3RlcEluZXJ0KGVsKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIE1hcmsgdGhlIGN1cnJlbnRseSBhY3RpdmUgc3RlcCBmb3Igc2NyZWVuIHJlYWRlcnMuXG4gIGNvbnN0IGFsbFN0ZXBJZHMgPSBbLi4uc2VxdWVudGlhbFN0ZXBzLCAuLi5wb3N0TGF5b3V0U3RlcHNdO1xuICBhbGxTdGVwSWRzLmZvckVhY2goaWQgPT4ge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgIGlmIChlbCkgZWwucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWN1cnJlbnQnKTtcbiAgfSk7XG4gIC8vIEZvciBwb3N0LWxheW91dCBwaGFzZXMsIG1hcmsgc3RlcC1kb3dubG9hZCBhcyB0aGUgYWN0aXZlIHN0ZXAgc28gc2NyZWVuIHJlYWRlcnNcbiAgLy8gaGF2ZSBhIHByb2dyYW1tYXRpYyBjdXJyZW50LXBvc2l0aW9uIGluZGljYXRvci5cbiAgY29uc3QgYWN0aXZlU3RlcElkID0gcG9zdExheW91dFVubG9ja2VkID8gJ3N0ZXAtZG93bmxvYWQnIDogc2VxdWVudGlhbFN0ZXBzW2N1cnJlbnRJZHhdO1xuICBpZiAoYWN0aXZlU3RlcElkKSB7XG4gICAgY29uc3QgYWN0aXZlRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChhY3RpdmVTdGVwSWQpO1xuICAgIGlmIChhY3RpdmVFbCkgYWN0aXZlRWwuc2V0QXR0cmlidXRlKCdhcmlhLWN1cnJlbnQnLCAnc3RlcCcpO1xuICB9XG59XG5cbi8vIEluaXRpYWxpemUgb24gcGFnZSBsb2FkIFx1MjAxNCBkZWxlZ2F0ZXMgdG8gYXBwLmpzIGluaXQoKSB3aGljaCBpcyBsb2FkZWQgYWZ0ZXIgdGhpcyBmaWxlXG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgKCkgPT4ge1xuICBsb2FkTW9kZWxTZWxlY3RvcigpO1xuXG4gIC8vIFdpcmUgdXAgdGFiIHNjcm9sbCBhcnJvdyBidXR0b25zXG4gIGNvbnN0IHRhYkJhciAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYi1iYXInKTtcbiAgY29uc3QgbGVmdEJ0biAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFiLXNjcm9sbC1sZWZ0Jyk7XG4gIGNvbnN0IHJpZ2h0QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYi1zY3JvbGwtcmlnaHQnKTtcbiAgaWYgKHRhYkJhciAmJiBsZWZ0QnRuICYmIHJpZ2h0QnRuKSB7XG4gICAgbGVmdEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICAoKSA9PiB7IHRhYkJhci5zY3JvbGxCeSh7IGxlZnQ6IC0xNjAsIGJlaGF2aW9yOiAnc21vb3RoJyB9KTsgfSk7XG4gICAgcmlnaHRCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7IHRhYkJhci5zY3JvbGxCeSh7IGxlZnQ6ICAxNjAsIGJlaGF2aW9yOiAnc21vb3RoJyB9KTsgfSk7XG4gICAgdGFiQmFyLmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHVwZGF0ZVRhYlNjcm9sbEJ1dHRvbnMpO1xuICAgIG5ldyBSZXNpemVPYnNlcnZlcih1cGRhdGVUYWJTY3JvbGxCdXR0b25zKS5vYnNlcnZlKHRhYkJhcik7XG4gIH1cblxuICAvLyBTaG93IG9ubHkgdGhlIEpvYiB0YWIgdW50aWwgZmV0Y2hTdGF0dXMgcmVzb2x2ZXMgdGhlIGFjdHVhbCBzdGFnZVxuICB1cGRhdGVUYWJCYXJGb3JTdGFnZSgnam9iJyk7XG4gIHVwZGF0ZVdvcmtmbG93U3RlcHNDbGlja2FibGUoJ2pvYicpO1xuXG4gIC8vIExpc3RlbiBmb3IgcGhhc2UgY2hhbmdlcyB0byB1cGRhdGUgY2xpY2thYmxlIHN0ZXBzXG4gIGlmICh0eXBlb2Ygc3RhdGVNYW5hZ2VyPy5vblBoYXNlQ2hhbmdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgc3RhdGVNYW5hZ2VyLm9uUGhhc2VDaGFuZ2UoKHBoYXNlKSA9PiB7XG4gICAgICB1cGRhdGVXb3JrZmxvd1N0ZXBzQ2xpY2thYmxlKHBoYXNlKTtcbiAgICB9KTtcbiAgfVxuXG59KTtcblxuLy8gXHUyNTAwXHUyNTAwIEVTIG1vZHVsZSBleHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuZXhwb3J0IHtcbiAgLy8gRm9jdXMgLyBhY2Nlc3NpYmlsaXR5XG4gIHNldEluaXRpYWxGb2N1cywgdHJhcEZvY3VzLCByZXN0b3JlRm9jdXMsIHB1c2hGb2N1c1N0YWNrLFxuICAvLyBEaWFsb2dzICYgbW9kYWxzXG4gIGNvbmZpcm1EaWFsb2csIG9wZW5Nb2RhbCwgY2xvc2VNb2RhbCwgY2xvc2VBbGxNb2RhbHMsXG4gIC8vIFRhYiAmIHN0YWdlIG1hbmFnZW1lbnRcbiAgc2V0dXBFdmVudExpc3RlbmVycywgZ2V0U3RhZ2VGb3JUYWIsIGdldFZpc2libGVTdGFnZSwgdXBkYXRlVGFiQmFyRm9yU3RhZ2UsXG4gIC8vIENoYXRcbiAgdG9nZ2xlQ2hhdCxcbiAgLy8gTW9kZWwgc2VsZWN0b3JcbiAgbG9hZE1vZGVsU2VsZWN0b3IsIG9wZW5Nb2RlbE1vZGFsLCBjbG9zZU1vZGVsTW9kYWwsIHNldE1vZGVsLCB0ZXN0Q3VycmVudE1vZGVsLCByZWZyZXNoTW9kZWxQcmljaW5nLFxuICB0b2dnbGVNb2RlbENhdGFsb2dWaXNpYmlsaXR5LCBzdGFydENvcGlsb3RBdXRoRnJvbVdpemFyZCwgbG9nb3V0Q29waWxvdEF1dGhGcm9tV2l6YXJkLFxuICBuZXh0V2l6YXJkU3RlcCwgcHJldmlvdXNXaXphcmRTdGVwLFxuICBzYXZlUHJvdmlkZXJBcGlLZXksIHRvZ2dsZUFwaUtleVZpc2liaWxpdHksXG4gIF91cGRhdGVMbG1TdGF0dXNQaWxsLFxuICAvLyBTZXR0aW5ncyBtb2RhbFxuICBvcGVuU2V0dGluZ3NNb2RhbCwgY2xvc2VTZXR0aW5nc01vZGFsLCBzYXZlU2V0dGluZ3NNb2RhbCwgcmVsb2FkU2V0dGluZ3NNb2RhbCxcbn07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi93b3JrZmxvdy1zdGVwcy5qc1xuICogV29ya2Zsb3cgcHJvZ3Jlc3MgYmFyLCBwaGFzZSByZS1ydW4vYmFjay1uYXYsIGFuZCBidWxsZXQgcmVvcmRlciBtb2RhbC5cbiAqXG4gKiBEZXBlbmRlbmNpZXMgKHJlc29sdmVkIHRocm91Z2ggZ2xvYmFsVGhpcyBhdCBydW50aW1lKTpcbiAqICAgUEhBU0VTLCBlc2NhcGVIdG1sLFxuICogICBhcHBlbmRMb2FkaW5nTWVzc2FnZSwgcmVtb3ZlTG9hZGluZ01lc3NhZ2UsIGFwcGVuZFJldHJ5TWVzc2FnZSwgYXBwZW5kTWVzc2FnZSxcbiAqICAgc2V0TG9hZGluZywgZmV0Y2hTdGF0dXMsIHN3aXRjaFRhYiwgc2VuZEFjdGlvbixcbiAqICAgc2hvd0xvYWRKb2JQYW5lbCwgdXBkYXRlQWN0aW9uQnV0dG9ucywgdXBkYXRlVGFiQmFyRm9yU3RhZ2UsXG4gKiAgIHRyYXBGb2N1cywgcmVzdG9yZUZvY3VzLCBfZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCxcbiAqICAgcG9zdEFuYWx5c2lzUXVlc3Rpb25zLCBxdWVzdGlvbkFuc3dlcnMsIENTU1xuICovXG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmNvbnN0IGxvZyA9IGdldExvZ2dlcignd29ya2Zsb3ctc3RlcHMnKTtcblxuaW1wb3J0IHsgc3RhdGVNYW5hZ2VyLCBHRU5FUkFUSU9OX1NUQVRFX0VWRU5UIH0gZnJvbSAnLi9zdGF0ZS1tYW5hZ2VyLmpzJztcblxuZnVuY3Rpb24gX2ZpbmRFeHBlcmllbmNlUmVjb21tZW5kYXRpb25SZWNvcmQoZXhwSWQpIHtcbiAgY29uc3QgZGF0YSA9IGdsb2JhbFRoaXMud2luZG93Py5wZW5kaW5nUmVjb21tZW5kYXRpb25zO1xuICBpZiAoIWRhdGEgfHwgIUFycmF5LmlzQXJyYXkoZGF0YS5leHBlcmllbmNlX3JlY29tbWVuZGF0aW9ucykpIHJldHVybiBudWxsO1xuICByZXR1cm4gZGF0YS5leHBlcmllbmNlX3JlY29tbWVuZGF0aW9ucy5maW5kKChyZWMpID0+IFN0cmluZyhyZWM/LmlkIHx8IHJlYz8uZXhwZXJpZW5jZV9pZCB8fCAnJykgPT09IFN0cmluZyhleHBJZCkpIHx8IG51bGw7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBTdGVwLW9yZGVyIGNvbnN0YW50cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuY29uc3QgX1NURVBfT1JERVIgPSBbXG4gICdqb2InLCAnYW5hbHlzaXMnLCAnY3VzdG9taXphdGlvbnMnLCAncmV3cml0ZScsICdzcGVsbCcsICdsYXlvdXQnLFxuICAnZG93bmxvYWQnLCAnY292ZXJfbGV0dGVyJywgJ3NjcmVlbmluZycsICdpbnRlcnZpZXdfcHJlcCcsICd0aGFua195b3UnLCAnaGFydmVzdCcsXG5dO1xuY29uc3QgX1NURVBfRElTUExBWSA9IHtcbiAgam9iOiAgICAgICAgICAgICdKb2IgSW5wdXQnLFxuICBhbmFseXNpczogICAgICAgJ0pvYiBBbmFseXNpcycsXG4gIGN1c3RvbWl6YXRpb25zOiAnQ3VzdG9taXNlJyxcbiAgcmV3cml0ZTogICAgICAgICdSZXdyaXRlIFJldmlldycsXG4gIHNwZWxsOiAgICAgICAgICAnU3BlbGwgQ2hlY2snLFxuICBsYXlvdXQ6ICAgICAgICAgJ0xheW91dCBSZXZpZXcnLFxuICBkb3dubG9hZDogICAgICAgJ0ZpbGUgUmV2aWV3JyxcbiAgY292ZXJfbGV0dGVyOiAgICdDb3ZlciBMZXR0ZXInLFxuICBzY3JlZW5pbmc6ICAgICAgJ1NjcmVlbmluZycsXG4gIGludGVydmlld19wcmVwOiAnSW50ZXJ2aWV3IFByZXAnLFxuICB0aGFua195b3U6ICAgICAgJ1RoYW5rIFlvdScsXG4gIGhhcnZlc3Q6ICAgICAgICAnSGFydmVzdCcsXG59O1xuY29uc3QgX0FDVElPTl9MQUJFTFMgPSB7XG4gIHJlY29tbWVuZF9jdXN0b21pemF0aW9uczogJ1NlbGVjdGluZyBleHBlcmllbmNlcyAmIHNraWxsc1x1MjAyNicsXG4gIGdlbmVyYXRlX2N2OiAnR2VuZXJhdGluZyBDVlx1MjAyNicsXG59O1xuXG5jb25zdCBfTkFWX1RBQl9MQUJFTFMgPSB7XG4gIGRvd25sb2FkOiAnXHUyQjA3XHVGRTBGIEZpbGUgUmV2aWV3Jyxcbn07XG5cbmZ1bmN0aW9uIGFwcGx5TGF5b3V0RnJlc2huZXNzTmF2aWdhdGlvblN0YXRlKCkge1xuICBjb25zdCBmcmVzaG5lc3MgPSBzdGF0ZU1hbmFnZXIuZ2V0TGF5b3V0RnJlc2huZXNzKCk7XG4gIGNvbnN0IGdlbmVyYXRpb25TdGF0ZSA9IHN0YXRlTWFuYWdlci5nZXRHZW5lcmF0aW9uU3RhdGUoKTtcbiAgY29uc3QgbGF5b3V0U3RlcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGVwLWxheW91dCcpO1xuXG4gIGlmIChsYXlvdXRTdGVwKSB7XG4gICAgbGF5b3V0U3RlcC5jbGFzc0xpc3QucmVtb3ZlKCdzdGFsZScsICdzdGFsZS1jcml0aWNhbCcpO1xuICAgIGNvbnN0IHJlcnVuID0gbGF5b3V0U3RlcC5xdWVyeVNlbGVjdG9yKCcuc3RlcC1yZXJ1bicpPy5vdXRlckhUTUwgfHwgJyc7XG4gICAgY29uc3QgcmVmaW5lQmFkZ2UgPSBsYXlvdXRTdGVwLnF1ZXJ5U2VsZWN0b3IoJy5zdGVwLWlubGluZS1iYWRnZScpPy5vdXRlckhUTUwgfHwgJyc7XG4gICAgY29uc3Qgc3RhbGVCYWRnZSA9IGZyZXNobmVzcy5pc1N0YWxlXG4gICAgICA/ICcgPHNwYW4gY2xhc3M9XCJzdGVwLWlubGluZS1iYWRnZSBzdGVwLXN0YWxlLWJhZGdlXCI+T3V0ZGF0ZWQ8L3NwYW4+J1xuICAgICAgOiAnJztcbiAgICBpZiAoZnJlc2huZXNzLmlzU3RhbGUpIHtcbiAgICAgIGxheW91dFN0ZXAuY2xhc3NMaXN0LmFkZCgnc3RhbGUnKTtcbiAgICAgIGlmIChmcmVzaG5lc3MuaXNDcml0aWNhbCkgbGF5b3V0U3RlcC5jbGFzc0xpc3QuYWRkKCdzdGFsZS1jcml0aWNhbCcpO1xuICAgIH1cbiAgICBsYXlvdXRTdGVwLmlubmVySFRNTCA9IGBcdUQ4M0NcdURGQTggTGF5b3V0IFJldmlldyR7c3RhbGVCYWRnZX0ke3JlZmluZUJhZGdlID8gYCAke3JlZmluZUJhZGdlfWAgOiAnJ30ke3JlcnVuID8gYCAke3JlcnVufWAgOiAnJ31gO1xuICB9XG5cbiAgY29uc3Qgc2hvd0Rvd25zdHJlYW1CYWRnZSA9IGZyZXNobmVzcy5pc1N0YWxlICYmIEJvb2xlYW4oXG4gICAgZ2VuZXJhdGlvblN0YXRlLmZpbmFsR2VuZXJhdGVkQXQgfHwgZ2VuZXJhdGlvblN0YXRlLnBoYXNlID09PSAnZmluYWxfY29tcGxldGUnXG4gICk7XG4gIE9iamVjdC5lbnRyaWVzKF9OQVZfVEFCX0xBQkVMUykuZm9yRWFjaCgoW3RhYiwgbGFiZWxdKSA9PiB7XG4gICAgY29uc3QgdGFiRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgdGFiLSR7dGFifWApO1xuICAgIGlmICghdGFiRWwpIHJldHVybjtcbiAgICB0YWJFbC5jbGFzc0xpc3QucmVtb3ZlKCd0YWItc3RhbGUnLCAndGFiLXN0YWxlLWNyaXRpY2FsJyk7XG4gICAgaWYgKHNob3dEb3duc3RyZWFtQmFkZ2UpIHtcbiAgICAgIHRhYkVsLmNsYXNzTGlzdC5hZGQoJ3RhYi1zdGFsZScpO1xuICAgICAgaWYgKGZyZXNobmVzcy5pc0NyaXRpY2FsKSB0YWJFbC5jbGFzc0xpc3QuYWRkKCd0YWItc3RhbGUtY3JpdGljYWwnKTtcbiAgICAgIHRhYkVsLmlubmVySFRNTCA9IGAke2xhYmVsfSA8c3BhbiBjbGFzcz1cInRhYi1zdGFsZS1iYWRnZVwiPk91dGRhdGVkPC9zcGFuPmA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhYkVsLnRleHRDb250ZW50ID0gbGFiZWw7XG4gICAgfVxuICB9KTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEJhY2sgdG8gcGhhc2UgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIGJhY2tUb1BoYXNlKHN0ZXAsIGZlZWRiYWNrKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgYm9keSA9IGZlZWRiYWNrID8ge3BoYXNlOiBzdGVwLCBmZWVkYmFja30gOiB7cGhhc2U6IHN0ZXB9O1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9iYWNrLXRvLXBoYXNlJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7J0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ30sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoIXJlcy5vayB8fCAhZGF0YS5vaykge1xuICAgICAgYXBwZW5kUmV0cnlNZXNzYWdlKCdcdTI2QTAgQ291bGQgbm90IG5hdmlnYXRlIGJhY2s6ICcgKyAoZGF0YS5lcnJvciB8fCAnVW5rbm93biBlcnJvcicpLCAoKSA9PiBiYWNrVG9QaGFzZShzdGVwLCBmZWVkYmFjaykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCBgXHUyMUJCIE5hdmlnYXRpbmcgYmFjayB0byAke3N0ZXB9LiBQcmlvciBkZWNpc2lvbnMgYW5kIGFwcHJvdmFscyBhcmUgcHJlc2VydmVkLmApO1xuICAgIGlmIChmZWVkYmFjaykgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgYFJlZmluZW1lbnQgZmVlZGJhY2sgcXVldWVkOiBcIiR7ZmVlZGJhY2t9XCJgKTtcbiAgICBhd2FpdCBmZXRjaFN0YXR1cygpO1xuXG4gICAgLy8gU3dpdGNoIHRvIHRoZSBhcHByb3ByaWF0ZSB2aWV3ZXIgdGFiXG4gICAgY29uc3QgdGFiTWFwID0ge1xuICAgICAgam9iOiAgICAgICAgICAgIG51bGwsXG4gICAgICBhbmFseXNpczogICAgICAgJ2FuYWx5c2lzJyxcbiAgICAgIGN1c3RvbWl6YXRpb25zOiAnZ29hbHMnLFxuICAgICAgcmV3cml0ZTogICAgICAgICdyZXdyaXRlJyxcbiAgICAgIHNwZWxsOiAgICAgICAgICAnc3BlbGwnLFxuICAgIH07XG4gICAgY29uc3QgcmVzb2x2ZWRUYWIgPSB0YWJNYXBbc3RlcF0gfHwgdGFiTWFwW2RhdGEucGhhc2VdIHx8IG51bGw7XG4gICAgaWYgKHJlc29sdmVkVGFiKSBzd2l0Y2hUYWIocmVzb2x2ZWRUYWIpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBhcHBlbmRSZXRyeU1lc3NhZ2UoJ1x1MjZBMCBOZXR3b3JrIGVycm9yIGluIGJhY2tUb1BoYXNlOiAnICsgZXJyLm1lc3NhZ2UsICgpID0+IGJhY2tUb1BoYXNlKHN0ZXApKTtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgUmUtcnVuIGNvbmZpcm0gbW9kYWwgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8qKlxuICogU2hvdyBhIGRvd25zdHJlYW0tYXdhcmUgY29uZmlybWF0aW9uIG1vZGFsIGJlZm9yZSByZS1ydW5uaW5nIG9yIGJhY2stbmF2aWdhdGluZy5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgIHN0ZXAgICAgICAtIFRoZSB0YXJnZXQgc3RlcCBrZXlcbiAqIEBwYXJhbSB7J3JlcnVuJ3wnYmFjay1uYXYnfSBtb2RlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkNvbmZpcm0gLSBDYWxsZWQgaWYgdGhlIHVzZXIgY2xpY2tzIFByb2NlZWRcbiAqL1xuZnVuY3Rpb24gX3Nob3dSZVJ1bkNvbmZpcm1Nb2RhbChzdGVwLCBtb2RlLCBvbkNvbmZpcm0pIHtcbiAgY29uc3Qgc3RlcElkeCAgICA9IF9TVEVQX09SREVSLmluZGV4T2Yoc3RlcCk7XG4gIC8vIE9ubHkgc2hvdyBkb3duc3RyZWFtIHN0YWdlcyB0aGF0IGhhdmUgYWN0dWFsbHkgYmVlbiBjb21wbGV0ZWRcbiAgY29uc3QgZG93bnN0cmVhbSA9IF9TVEVQX09SREVSLnNsaWNlKHN0ZXBJZHggKyAxKS5maWx0ZXIocyA9PiB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc3RlcC0ke3N9YCk7XG4gICAgcmV0dXJuIGVsICYmIGVsLmNsYXNzTGlzdC5jb250YWlucygnY29tcGxldGVkJyk7XG4gIH0pO1xuICBjb25zdCBzdGVwTGFiZWwgID0gX1NURVBfRElTUExBWVtzdGVwXSB8fCBzdGVwO1xuXG4gIGNvbnN0IHRpdGxlID0gbW9kZSA9PT0gJ3JlcnVuJ1xuICAgID8gYFx1MjFCQiBSZS1ydW4gJHtzdGVwTGFiZWx9P2BcbiAgICA6IGBcdTIxOTAgTmF2aWdhdGUgYmFjayB0byAke3N0ZXBMYWJlbH0/YDtcbiAgY29uc3QgYm9keVRleHQgPSBtb2RlID09PSAncmVydW4nXG4gICAgPyAnVGhlIGZvbGxvd2luZyBzdGFnZXMgd2lsbCBzZWUgdXBkYXRlZCBpbnB1dHMgYW5kIG1heSBzaG93IGNoYW5nZWQgcmVjb21tZW5kYXRpb25zOidcbiAgICA6ICdZb3UgYXJlIG5hdmlnYXRpbmcgYmFjayBwYXN0IHRoZSBmb2xsb3dpbmcgY29tcGxldGVkIHN0YWdlczonO1xuICBjb25zdCBub3RlID0gJ0FsbCBleGlzdGluZyBhcHByb3ZhbHMgYW5kIHJld3JpdGVzIGFyZSBwcmVzZXJ2ZWQgYXMgY29udGV4dC4nO1xuXG4gIGNvbnN0IGxpc3RIdG1sID0gZG93bnN0cmVhbVxuICAgIC5tYXAocyA9PiBgPGxpIHN0eWxlPVwicGFkZGluZzoycHggMDtcIj4ke19TVEVQX0RJU1BMQVlbc10gfHwgc308L2xpPmApXG4gICAgLmpvaW4oJycpO1xuXG4gIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgb3ZlcmxheS5pZCA9ICdyZXJ1bi1jb25maXJtLW92ZXJsYXknO1xuICBvdmVybGF5LnN0eWxlLmNzc1RleHQgPSBgcG9zaXRpb246Zml4ZWQ7aW5zZXQ6MDtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsMC41KTtcbiAgICB6LWluZGV4OjEwMDAwO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjtgO1xuICBvdmVybGF5LmlubmVySFRNTCA9IGBcbiAgICA8ZGl2IHJvbGU9XCJkaWFsb2dcIiBhcmlhLW1vZGFsPVwidHJ1ZVwiIGFyaWEtbGFiZWxsZWRieT1cInJlcnVuLWNvbmZpcm0tdGl0bGVcIlxuICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZmY7Ym9yZGVyLXJhZGl1czoxMHB4O3BhZGRpbmc6MjRweCAyOHB4O21heC13aWR0aDo0NDBweDtcbiAgICAgICAgICAgICAgICB3aWR0aDo5MiU7Ym94LXNoYWRvdzowIDIwcHggNjBweCByZ2JhKDAsMCwwLDAuMyk7XCI+XG4gICAgICA8aDMgaWQ9XCJyZXJ1bi1jb25maXJtLXRpdGxlXCIgc3R5bGU9XCJtYXJnaW46MCAwIDEwcHg7Zm9udC1zaXplOjEuMWVtO2NvbG9yOiMxZTI5M2I7XCI+XG4gICAgICAgICR7ZXNjYXBlSHRtbCh0aXRsZSl9PC9oMz5cbiAgICAgIDxwIHN0eWxlPVwibWFyZ2luOjAgMCA4cHg7Zm9udC1zaXplOjAuOWVtO2NvbG9yOiM0NzU1Njk7XCI+JHtlc2NhcGVIdG1sKGJvZHlUZXh0KX08L3A+XG4gICAgICA8dWwgc3R5bGU9XCJtYXJnaW46MCAwIDEycHg7cGFkZGluZy1sZWZ0OjIwcHg7Zm9udC1zaXplOjAuOWVtO2NvbG9yOiMzNzQxNTE7XCI+JHtsaXN0SHRtbH08L3VsPlxuICAgICAgPHAgc3R5bGU9XCJtYXJnaW46MCAwIDE4cHg7Zm9udC1zaXplOjAuODVlbTtjb2xvcjojNmI3MjgwO1wiPiR7ZXNjYXBlSHRtbChub3RlKX08L3A+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDoxMHB4O2p1c3RpZnktY29udGVudDpmbGV4LWVuZDtcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInJlcnVuLWNhbmNlbC1idG5cIiBjbGFzcz1cImJ0bi1zZWNvbmRhcnlcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInJlcnVuLXByb2NlZWQtYnRuXCIgY2xhc3M9XCJidG4tcHJpbWFyeVwiPlByb2NlZWQ8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PmA7XG5cbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChvdmVybGF5KTtcbiAgX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBpZiAodHlwZW9mIHRyYXBGb2N1cyA9PT0gJ2Z1bmN0aW9uJykgdHJhcEZvY3VzKCdyZXJ1bi1jb25maXJtLW92ZXJsYXknKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlcnVuLXByb2NlZWQtYnRuJykuZm9jdXMoKTtcblxuICBjb25zdCBjbG9zZSA9ICgpID0+IHsgb3ZlcmxheS5yZW1vdmUoKTsgcmVzdG9yZUZvY3VzKCk7IH07XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXJ1bi1jYW5jZWwtYnRuJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjbG9zZSk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXJ1bi1wcm9jZWVkLWJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4geyBjbG9zZSgpOyBvbkNvbmZpcm0oKTsgfSk7XG4gIG92ZXJsYXkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBlID0+IHsgaWYgKGUudGFyZ2V0ID09PSBvdmVybGF5KSBjbG9zZSgpOyB9KTtcbiAgb3ZlcmxheS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZSA9PiB7IGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIGNsb3NlKCk7IH0pO1xufVxuXG5mdW5jdGlvbiBjb25maXJtUmVSdW5QaGFzZShzdGVwKSB7XG4gIF9zaG93UmVSdW5Db25maXJtTW9kYWwoc3RlcCwgJ3JlcnVuJywgKCkgPT4gYmFja1RvUGhhc2Uoc3RlcCkpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgVmlldy1jdXJzb3IgaW5kaWNhdG9yIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4vKipcbiAqIFJldHVybiBhIHRvb2x0aXAgc3RyaW5nIGZvciBhIHN0ZXAgcGlsbCBiYXNlZCBvbiBpdHMgY29tYmluZWQgc3RhdGUuXG4gKi9cbmZ1bmN0aW9uIF9nZXRTdGVwVG9vbHRpcChzdGVwLCBpc0FjdGl2ZSwgaXNWaWV3aW5nLCBpc0Jyb3dzaW5nQXdheSwgaXNDb21wbGV0ZWQsIGlzU3RhbGUsIGlzU3RhbGVDcml0aWNhbCkge1xuICBpZiAoaXNTdGFsZUNyaXRpY2FsKSByZXR1cm4gaXNWaWV3aW5nID8gJ0NyaXRpY2FsIGNoYW5nZXMgXHUyMDE0IHJldmlldyByZXF1aXJlZC4gQ2xpY2sgXHUyMUJCIHRvIHJlcnVuLicgOiAnQ3JpdGljYWwgY2hhbmdlcyBcdTIwMTQgcmV2aWV3IHJlcXVpcmVkLic7XG4gIGlmIChpc1N0YWxlKSAgICAgICAgIHJldHVybiBpc1ZpZXdpbmcgPyAnUmVzdWx0cyBtYXkgYmUgb3V0ZGF0ZWQuIENsaWNrIFx1MjFCQiB0byByZXJ1bi4nICAgICAgICAgICA6ICdSZXN1bHRzIG1heSBiZSBvdXRkYXRlZC4nO1xuICBpZiAoaXNCcm93c2luZ0F3YXkpICByZXR1cm4gJ0FjdGl2ZSBzdGVwIFx1MjAxNCBjbGljayB0byByZXR1cm4nO1xuICBpZiAoaXNBY3RpdmUgJiYgaXNWaWV3aW5nKSAgICByZXR1cm4gJ0N1cnJlbnQgc3RlcCc7XG4gIGlmIChpc0NvbXBsZXRlZCAmJiBpc1ZpZXdpbmcpIHJldHVybiAnQ2xpY2sgXHUyMUJCIHRvIHJlcnVuIGZyb20gaGVyZSc7XG4gIGlmIChpc0NvbXBsZXRlZCkgICAgICAgICAgICAgIHJldHVybiAnQ2xpY2sgdG8gdmlldyc7XG4gIHJldHVybiAnJztcbn1cblxuLyoqXG4gKiBTeW5jIHRoZSBibHVlIHJpbmcgKHZpZXcgY3Vyc29yKSBhbmQgYW1iZXIgcHVsc2luZyByaW5nIChicm93c2luZy1hd2F5KVxuICogdG8gdGhlIGN1cnJlbnRseSB2aXNpYmxlIHRhYi4gQ2FsbGVkIGFmdGVyIGV2ZXJ5IHRhYiBzd2l0Y2ggYW5kIHN0YXR1cyB1cGRhdGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFiTmFtZSAtIFRoZSBjdXJyZW50bHkgdmlzaWJsZSB0YWIgaWQgKGUuZy4gJ2FuYWx5c2lzJywgJ2V4cC1yZXZpZXcnKVxuICovXG5mdW5jdGlvbiBfdXBkYXRlVmlld2luZ0luZGljYXRvcih0YWJOYW1lKSB7XG4gIGNvbnN0IHRhYlRvU3RlcCA9IHtcbiAgICAnam9iJzogICAgICAgICAgICdqb2InLFxuICAgICdhbmFseXNpcyc6ICAgICAgJ2FuYWx5c2lzJyxcbiAgICAncXVlc3Rpb25zJzogICAgICdhbmFseXNpcycsXG4gICAgJ2V4cC1yZXZpZXcnOiAgICAnY3VzdG9taXphdGlvbnMnLFxuICAgICdyZXdyaXRlJzogICAgICAgJ3Jld3JpdGUnLFxuICAgICdzcGVsbCc6ICAgICAgICAgJ3NwZWxsJyxcbiAgICAnbGF5b3V0JzogICAgICAgICdsYXlvdXQnLFxuICAgICdmaW5hbF9nZW5lcmF0ZSc6J2Rvd25sb2FkJyxcbiAgICAnZG93bmxvYWQnOiAgICAgICdkb3dubG9hZCcsXG4gICAgJ2NvdmVyLWxldHRlcic6ICAnY292ZXJfbGV0dGVyJyxcbiAgICAnc2NyZWVuaW5nJzogICAgICdzY3JlZW5pbmcnLFxuICAgICdpbnRlcnZpZXctcHJlcCc6J2ludGVydmlld19wcmVwJyxcbiAgICAndGhhbmsteW91JzogICAgICd0aGFua195b3UnLFxuICAgICdoYXJ2ZXN0JzogICAgICAgJ2hhcnZlc3QnLFxuICB9O1xuICBjb25zdCB2aWV3ZWRTdGVwID0gdGFiVG9TdGVwW3RhYk5hbWVdIHx8IG51bGw7XG5cbiAgbGV0IGFjdGl2ZVN0ZXAgPSBudWxsO1xuICBfU1RFUF9PUkRFUi5mb3JFYWNoKHN0ZXAgPT4ge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHN0ZXAtJHtzdGVwfWApO1xuICAgIGlmIChlbCAmJiBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2FjdGl2ZScpKSBhY3RpdmVTdGVwID0gc3RlcDtcbiAgfSk7XG5cbiAgX1NURVBfT1JERVIuZm9yRWFjaChzdGVwID0+IHtcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzdGVwLSR7c3RlcH1gKTtcbiAgICBpZiAoIWVsKSByZXR1cm47XG5cbiAgICBjb25zdCBpc1ZpZXdpbmcgICAgICA9IHN0ZXAgPT09IHZpZXdlZFN0ZXA7XG4gICAgY29uc3QgaXNBY3RpdmUgICAgICAgPSBzdGVwID09PSBhY3RpdmVTdGVwO1xuICAgIGNvbnN0IGlzQnJvd3NpbmdBd2F5ID0gaXNBY3RpdmUgJiYgISF2aWV3ZWRTdGVwICYmIHZpZXdlZFN0ZXAgIT09IGFjdGl2ZVN0ZXA7XG4gICAgY29uc3QgaXNDb21wbGV0ZWQgICAgPSBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2NvbXBsZXRlZCcpO1xuICAgIGNvbnN0IGlzU3RhbGUgICAgICAgID0gZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdzdGFsZScpO1xuICAgIGNvbnN0IGlzU3RhbGVDcml0aWNhbCA9IGVsLmNsYXNzTGlzdC5jb250YWlucygnc3RhbGUtY3JpdGljYWwnKTtcblxuICAgIGVsLmNsYXNzTGlzdC50b2dnbGUoJ3ZpZXdpbmcnLCAgICAgICBpc1ZpZXdpbmcpO1xuICAgIGVsLmNsYXNzTGlzdC50b2dnbGUoJ2Jyb3dzaW5nLWF3YXknLCBpc0Jyb3dzaW5nQXdheSk7XG5cbiAgICBjb25zdCB0b29sdGlwVGV4dCA9IF9nZXRTdGVwVG9vbHRpcChzdGVwLCBpc0FjdGl2ZSwgaXNWaWV3aW5nLCBpc0Jyb3dzaW5nQXdheSwgaXNDb21wbGV0ZWQsIGlzU3RhbGUsIGlzU3RhbGVDcml0aWNhbCk7XG4gICAgaWYgKHRvb2x0aXBUZXh0KSB7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoJ2RhdGEtYnMtdG9nZ2xlJywgICAgJ3Rvb2x0aXAnKTtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZSgnZGF0YS1icy1wbGFjZW1lbnQnLCAnYm90dG9tJyk7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoJ2RhdGEtYnMtdGl0bGUnLCAgICAgdG9vbHRpcFRleHQpO1xuICAgICAgaWYgKHR5cGVvZiBib290c3RyYXAgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGNvbnN0IHRpcCA9IGJvb3RzdHJhcC5Ub29sdGlwLmdldEluc3RhbmNlKGVsKTtcbiAgICAgICAgaWYgKHRpcCkgdGlwLnNldENvbnRlbnQoeyAnLnRvb2x0aXAtaW5uZXInOiB0b29sdGlwVGV4dCB9KTtcbiAgICAgICAgZWxzZSAgICAgbmV3IGJvb3RzdHJhcC5Ub29sdGlwKGVsKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWJzLXRvZ2dsZScpO1xuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWJzLXRpdGxlJyk7XG4gICAgICBpZiAodHlwZW9mIGJvb3RzdHJhcCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY29uc3QgdGlwID0gYm9vdHN0cmFwLlRvb2x0aXAuZ2V0SW5zdGFuY2UoZWwpO1xuICAgICAgICBpZiAodGlwKSB0aXAuZGlzcG9zZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBSZS1ydW4gcGhhc2UgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8qKlxuICogU2hvdyBhbiBhbWVuZC1jbGFyaWZpY2F0aW9ucyBtb2RhbCBiZWZvcmUgcmUtcnVubmluZyB0aGUgYW5hbHlzaXMgcGhhc2UuXG4gKiBDYWxscyBvblByb2NlZWQoKSBpZiB0aGUgdXNlciBjb25maXJtcyAod2l0aCBvciB3aXRob3V0IHVwZGF0aW5nIGFuc3dlcnMpLlxuICovXG5hc3luYyBmdW5jdGlvbiBfc2hvd0FuYWx5c2lzQ2xhcmlmaWNhdGlvbkFtZW5kTW9kYWwob25Qcm9jZWVkKSB7XG4gIGNvbnN0IHF1ZXN0aW9ucyA9IHdpbmRvdy5wb3N0QW5hbHlzaXNRdWVzdGlvbnMgfHwgW107XG4gIGNvbnN0IGFuc3dlcnMgICA9IHdpbmRvdy5xdWVzdGlvbkFuc3dlcnMgfHwge307XG5cbiAgLy8gTm8gcHJpb3IgcXVlc3Rpb25zIFx1MjAxNCBza2lwIHRoZSBtb2RhbCBhbmQgcHJvY2VlZCBkaXJlY3RseS5cbiAgaWYgKCFxdWVzdGlvbnMubGVuZ3RoKSB7IGF3YWl0IG9uUHJvY2VlZCgpOyByZXR1cm47IH1cblxuICBjb25zdCBvdmVybGF5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIG92ZXJsYXkuaWQgPSAnY2xhci1hbWVuZC1vdmVybGF5JztcbiAgb3ZlcmxheS5zdHlsZS5jc3NUZXh0ID0gJ3Bvc2l0aW9uOmZpeGVkO2luc2V0OjA7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLDAuNSk7ei1pbmRleDoxMDAwMDtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7b3ZlcmZsb3cteTphdXRvOyc7XG5cbiAgY29uc3QgZm9ybVJvd3MgPSBxdWVzdGlvbnMubWFwKChxLCBpKSA9PiB7XG4gICAgY29uc3QgcXR5cGUgID0gcS50eXBlIHx8IGBjbGFyaWZpY2F0aW9uXyR7aSArIDF9YDtcbiAgICBjb25zdCBxdGV4dCAgPSBlc2NhcGVIdG1sKHEucXVlc3Rpb24gfHwgJycpO1xuICAgIGNvbnN0IGN1ckFucyA9IGVzY2FwZUh0bWwoYW5zd2Vyc1txdHlwZV0gfHwgJycpO1xuICAgIGNvbnN0IGNob2ljZXMgPSBBcnJheS5pc0FycmF5KHEuY2hvaWNlcykgPyBxLmNob2ljZXMgOiBbXTtcblxuICAgIGlmIChjaG9pY2VzLmxlbmd0aCkge1xuICAgICAgY29uc3QgcmFkaW9zID0gY2hvaWNlcy5tYXAoYyA9PiBgXG4gICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjZweDttYXJnaW4tYm90dG9tOjRweDtjdXJzb3I6cG9pbnRlcjtcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cImNsYXItJHtlc2NhcGVIdG1sKHF0eXBlKX1cIiB2YWx1ZT1cIiR7ZXNjYXBlSHRtbChjKX1cIlxuICAgICAgICAgICAgJHthbnN3ZXJzW3F0eXBlXSA9PT0gYyA/ICdjaGVja2VkJyA6ICcnfSBzdHlsZT1cImZsZXgtc2hyaW5rOjA7XCI+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC45ZW07XCI+JHtlc2NhcGVIdG1sKGMpfTwvc3Bhbj5cbiAgICAgICAgPC9sYWJlbD5gKS5qb2luKCcnKTtcbiAgICAgIHJldHVybiBgXG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgICAgPGxhYmVsIHN0eWxlPVwiZm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZTowLjllbTtkaXNwbGF5OmJsb2NrO21hcmdpbi1ib3R0b206NnB4O1wiPiR7cXRleHR9PC9sYWJlbD5cbiAgICAgICAgICAke3JhZGlvc31cbiAgICAgICAgPC9kaXY+YDtcbiAgICB9XG4gICAgcmV0dXJuIGBcbiAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgIDxsYWJlbCBmb3I9XCJjbGFyLWFucy0ke2VzY2FwZUh0bWwocXR5cGUpfVwiIHN0eWxlPVwiZm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZTowLjllbTtkaXNwbGF5OmJsb2NrO21hcmdpbi1ib3R0b206NHB4O1wiPiR7cXRleHR9PC9sYWJlbD5cbiAgICAgICAgPHRleHRhcmVhIGlkPVwiY2xhci1hbnMtJHtlc2NhcGVIdG1sKHF0eXBlKX1cIiBuYW1lPVwiY2xhci0ke2VzY2FwZUh0bWwocXR5cGUpfVwiIHJvd3M9XCIyXCJcbiAgICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Ym94LXNpemluZzpib3JkZXItYm94O3BhZGRpbmc6NnB4IDhweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo2cHg7Zm9udC1zaXplOjAuOWVtO3Jlc2l6ZTp2ZXJ0aWNhbDtcIlxuICAgICAgICA+JHtjdXJBbnN9PC90ZXh0YXJlYT5cbiAgICAgIDwvZGl2PmA7XG4gIH0pLmpvaW4oJycpO1xuXG4gIG92ZXJsYXkuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgcm9sZT1cImRpYWxvZ1wiIGFyaWEtbW9kYWw9XCJ0cnVlXCIgYXJpYS1sYWJlbGxlZGJ5PVwiY2xhci1hbWVuZC10aXRsZVwiXG4gICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6I2ZmZjtib3JkZXItcmFkaXVzOjEwcHg7cGFkZGluZzoyNHB4IDI4cHg7bWF4LXdpZHRoOjUwMHB4O3dpZHRoOjk0JTtcbiAgICAgICAgICAgICAgICBib3gtc2hhZG93OjAgMjBweCA2MHB4IHJnYmEoMCwwLDAsMC4zKTttYXJnaW46MjBweCBhdXRvO1wiPlxuICAgICAgPGgzIGlkPVwiY2xhci1hbWVuZC10aXRsZVwiIHN0eWxlPVwibWFyZ2luOjAgMCA2cHg7Zm9udC1zaXplOjEuMWVtO2NvbG9yOiMxZTI5M2I7XCI+XHUyMUJCIEFtZW5kIENsYXJpZmljYXRpb24gQW5zd2VyczwvaDM+XG4gICAgICA8cCBzdHlsZT1cIm1hcmdpbjowIDAgMTZweDtmb250LXNpemU6MC44NWVtO2NvbG9yOiM2YjcyODA7XCI+XG4gICAgICAgIFVwZGF0ZSB5b3VyIGFuc3dlcnMgYmVmb3JlIHJlcnVubmluZyBhbmFseXNpcywgb3Iga2VlcCB0aGVtIGFzLWlzLlxuICAgICAgPC9wPlxuICAgICAgPGZvcm0gaWQ9XCJjbGFyLWFtZW5kLWZvcm1cIiBvbnN1Ym1pdD1cInJldHVybiBmYWxzZTtcIj5cbiAgICAgICAgJHtmb3JtUm93c31cbiAgICAgIDwvZm9ybT5cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjEwcHg7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kO21hcmdpbi10b3A6OHB4O2ZsZXgtd3JhcDp3cmFwO1wiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiY2xhci1hbWVuZC1jYW5jZWxcIiBjbGFzcz1cImJ0bi1zZWNvbmRhcnlcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImNsYXItYW1lbmQta2VlcFwiICAgY2xhc3M9XCJidG4tc2Vjb25kYXJ5XCI+S2VlcCBFeGlzdGluZyBBbnN3ZXJzPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gaWQ9XCJjbGFyLWFtZW5kLXNhdmVcIiAgIGNsYXNzPVwiYnRuLXByaW1hcnlcIj5VcGRhdGUgJmFtcDsgUmVydW48L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PmA7XG5cbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChvdmVybGF5KTtcbiAgaWYgKHR5cGVvZiBfZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCAhPT0gJ3VuZGVmaW5lZCcpIHdpbmRvdy5fZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIGlmICh0eXBlb2YgdHJhcEZvY3VzID09PSAnZnVuY3Rpb24nKSB0cmFwRm9jdXMoJ2NsYXItYW1lbmQtb3ZlcmxheScpO1xuICBvdmVybGF5LnF1ZXJ5U2VsZWN0b3IoJyNjbGFyLWFtZW5kLXNhdmUnKS5mb2N1cygpO1xuXG4gIGZ1bmN0aW9uIGNsb3NlTW9kYWwoKSB7XG4gICAgb3ZlcmxheS5yZW1vdmUoKTtcbiAgICBpZiAodHlwZW9mIHJlc3RvcmVGb2N1cyA9PT0gJ2Z1bmN0aW9uJykgcmVzdG9yZUZvY3VzKCk7XG4gIH1cblxuICBvdmVybGF5LnF1ZXJ5U2VsZWN0b3IoJyNjbGFyLWFtZW5kLWNhbmNlbCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xvc2VNb2RhbCk7XG4gIG92ZXJsYXkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBlID0+IHsgaWYgKGUudGFyZ2V0ID09PSBvdmVybGF5KSBjbG9zZU1vZGFsKCk7IH0pO1xuICBvdmVybGF5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBlID0+IHsgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgY2xvc2VNb2RhbCgpOyB9KTtcblxuICBvdmVybGF5LnF1ZXJ5U2VsZWN0b3IoJyNjbGFyLWFtZW5kLWtlZXAnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBjbG9zZU1vZGFsKCk7XG4gICAgb25Qcm9jZWVkKCk7XG4gIH0pO1xuXG4gIG92ZXJsYXkucXVlcnlTZWxlY3RvcignI2NsYXItYW1lbmQtc2F2ZScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZvcm0gICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2xhci1hbWVuZC1mb3JtJyk7XG4gICAgY29uc3QgdXBkYXRlZCA9IHt9O1xuICAgIHF1ZXN0aW9ucy5mb3JFYWNoKChxLCBpKSA9PiB7XG4gICAgICBjb25zdCBxdHlwZSA9IHEudHlwZSB8fCBgY2xhcmlmaWNhdGlvbl8ke2kgKyAxfWA7XG4gICAgICBjb25zdCBlbCAgICA9IGZvcm0ucXVlcnlTZWxlY3RvcihgW25hbWU9XCJjbGFyLSR7cXR5cGV9XCJdYCk7XG4gICAgICBpZiAoIWVsKSByZXR1cm47XG4gICAgICBpZiAoZWwudHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgICBjb25zdCBjaGVja2VkID0gZm9ybS5xdWVyeVNlbGVjdG9yKGBbbmFtZT1cImNsYXItJHtxdHlwZX1cIl06Y2hlY2tlZGApO1xuICAgICAgICBpZiAoY2hlY2tlZCkgdXBkYXRlZFtxdHlwZV0gPSBjaGVja2VkLnZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdmFsID0gZWwudmFsdWUudHJpbSgpO1xuICAgICAgICBpZiAodmFsKSB1cGRhdGVkW3F0eXBlXSA9IHZhbDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNsb3NlTW9kYWwoKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZmV0Y2goJy9hcGkvcG9zdC1hbmFseXNpcy1yZXNwb25zZXMnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBxdWVzdGlvbnMsIGFuc3dlcnM6IHVwZGF0ZWQgfSksXG4gICAgICB9KTtcbiAgICAgIHdpbmRvdy5xdWVzdGlvbkFuc3dlcnMgPSB1cGRhdGVkO1xuICAgIH0gY2F0Y2ggKF9lKSB7IC8qIHNpbGVudCBcdTIwMTQgcHJvY2VlZCB3aXRoIHdoYXRldmVyIHRoZSBiYWNrZW5kIGFscmVhZHkgaGFzICovIH1cbiAgICBhd2FpdCBvblByb2NlZWQoKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlUnVuUGhhc2Uoc3RlcCkge1xuICAvLyBJbnRlcmNlcHQgYW5hbHlzaXMgcmVydW5zIHRvIGxldCB0aGUgdXNlciBhbWVuZCBwcmlvciBjbGFyaWZpY2F0aW9uIGFuc3dlcnMuXG4gIGlmIChzdGVwID09PSAnYW5hbHlzaXMnKSB7XG4gICAgYXdhaXQgX3Nob3dBbmFseXNpc0NsYXJpZmljYXRpb25BbWVuZE1vZGFsKCgpID0+IF9leGVjdXRlUmVSdW5QaGFzZSgnYW5hbHlzaXMnKSk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGF3YWl0IF9leGVjdXRlUmVSdW5QaGFzZShzdGVwKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gX2V4ZWN1dGVSZVJ1blBoYXNlKHN0ZXApIHtcbiAgY29uc3QgbG9hZGluZ01zZyA9IGFwcGVuZExvYWRpbmdNZXNzYWdlKGBcdTIxQkIgUmUtcnVubmluZyAke3N0ZXB9XHUyMDI2YCk7XG4gIHNldExvYWRpbmcodHJ1ZSwgYFJlLXJ1bm5pbmcgJHtzdGVwfVx1MjAyNmApO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9yZS1ydW4tcGhhc2UnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtwaGFzZTogc3RlcH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIHJlbW92ZUxvYWRpbmdNZXNzYWdlKGxvYWRpbmdNc2cpO1xuICAgIHNldExvYWRpbmcoZmFsc2UpO1xuXG4gICAgaWYgKCFyZXMub2sgfHwgIWRhdGEub2spIHtcbiAgICAgIGFwcGVuZFJldHJ5TWVzc2FnZSgnXHUyNkEwIFJlLXJ1biBmYWlsZWQ6ICcgKyAoZGF0YS5lcnJvciB8fCAnVW5rbm93biBlcnJvcicpLCAoKSA9PiByZVJ1blBoYXNlKHN0ZXApKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCBgXHUyNzA1ICR7c3RlcH0gcmUtcnVuIGNvbXBsZXRlLiBSZXZpZXcgdGhlIHVwZGF0ZWQgcmVzdWx0cyBcdTIwMTQgY2hhbmdlZCBpdGVtcyBhcmUgaGlnaGxpZ2h0ZWQuYCk7XG4gICAgYXdhaXQgZmV0Y2hTdGF0dXMoKTtcblxuICAgIC8vIENsZWFyIHBlci1waGFzZSBjYWNoZXMgc28gYmFjay1uYXZpZ2F0aW9uIGZldGNoZXMgZnJlc2ggcmVzdWx0c1xuICAgIGlmIChzdGVwID09PSAnc3BlbGwnKSAgIHdpbmRvdy5fc3BlbGxDaGVja0NhY2hlICA9IG51bGw7XG4gICAgaWYgKHN0ZXAgPT09ICdyZXdyaXRlJykgd2luZG93Ll9yZXdyaXRlUGFuZWxDYWNoZSA9IG51bGw7XG5cbiAgICAvLyBOYXZpZ2F0ZSB0byB0aGUgc3RlcCdzIHZpZXdlciB0YWJcbiAgICBjb25zdCB0YWJNYXAgPSB7XG4gICAgICBhbmFseXNpczogICAgICAgJ2FuYWx5c2lzJyxcbiAgICAgIGN1c3RvbWl6YXRpb25zOiAnZ29hbHMnLFxuICAgICAgcmV3cml0ZTogICAgICAgICdyZXdyaXRlJyxcbiAgICAgIHNwZWxsOiAgICAgICAgICAnc3BlbGwnLFxuICAgIH07XG4gICAgaWYgKHRhYk1hcFtzdGVwXSkgc3dpdGNoVGFiKHRhYk1hcFtzdGVwXSk7XG5cbiAgICAvLyBDb21wdXRlIGNoYW5nZWQtaXRlbSBJRHMgZnJvbSBwcmlvciB2cyBuZXcgb3V0cHV0IGFuZCBoaWdobGlnaHQgdGhlbS5cbiAgICBpZiAoZGF0YS5wcmlvcl9vdXRwdXQgJiYgZGF0YS5uZXdfb3V0cHV0KSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IF9oaWdobGlnaHRDaGFuZ2VkSXRlbXMoc3RlcCwgZGF0YS5wcmlvcl9vdXRwdXQsIGRhdGEubmV3X291dHB1dCksIDMwMCk7XG4gICAgfVxuXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJlbW92ZUxvYWRpbmdNZXNzYWdlKGxvYWRpbmdNc2cpO1xuICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgIGFwcGVuZFJldHJ5TWVzc2FnZSgnXHUyNkEwIE5ldHdvcmsgZXJyb3IgaW4gcmVSdW5QaGFzZTogJyArIGVyci5tZXNzYWdlLCAoKSA9PiByZVJ1blBoYXNlKHN0ZXApKTtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgSGlnaGxpZ2h0IGNoYW5nZWQgaXRlbXMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8qKlxuICogQ29tcGFyZSBwcmlvciBhbmQgbmV3IHJlLXJ1biBvdXRwdXRzOyBtYXJrIERPTSBlbGVtZW50cyBmb3IgY2hhbmdlZCBlbnRpdGllcy5cbiAqXG4gKiBTdHJhdGVnaWVzIGJ5IHN0ZXA6XG4gKiAgIHJld3JpdGUgICAgICAgIFx1MjAxNCBjb21wYXJlIHJld3JpdGUgSURzOyBtYXJrIHJ3LWNhcmQtPGlkPlxuICogICBjdXN0b21pemF0aW9ucyBcdTIwMTQgY29tcGFyZSBleHBlcmllbmNlIElEczsgbWFyayB0cltkYXRhLWV4cC1pZF0gYW5kIHRyW2RhdGEtc2tpbGxdXG4gKiAgIGFuYWx5c2lzICAgICAgIFx1MjAxNCBubyBwZXItZW50aXR5IERPTSB0YXJnZXRpbmc7IHNraXBcbiAqL1xuZnVuY3Rpb24gX2hpZ2hsaWdodENoYW5nZWRJdGVtcyhzdGVwLCBwcmlvck91dHB1dCwgbmV3T3V0cHV0KSB7XG4gIGlmIChzdGVwID09PSAncmV3cml0ZScpIHtcbiAgICBjb25zdCBwcmlvcklkcyA9IG5ldyBTZXQoKHByaW9yT3V0cHV0LnBlbmRpbmdfcmV3cml0ZXMgfHwgW10pLm1hcChyID0+IFN0cmluZyhyLmlkKSkpO1xuICAgIGNvbnN0IG5ld0l0ZW1zICA9IG5ld091dHB1dC5wZW5kaW5nX3Jld3JpdGVzICB8fCBbXTtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbmV3SXRlbXMpIHtcbiAgICAgIGNvbnN0IGlkICAgICAgPSBTdHJpbmcoaXRlbS5pZCB8fCAnJyk7XG4gICAgICBjb25zdCBjYXJkSWQgID0gaWQucmVwbGFjZSgvW15hLXpBLVowLTlfLV0vZywgJ18nKTtcbiAgICAgIGNvbnN0IGVsICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcnctY2FyZC0ke2NhcmRJZH1gKTtcbiAgICAgIGlmICghZWwpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgaXNOZXcgICAgID0gIXByaW9ySWRzLmhhcyhpZCk7XG4gICAgICBjb25zdCBwcmlvckl0ZW0gPSAocHJpb3JPdXRwdXQucGVuZGluZ19yZXdyaXRlcyB8fCBbXSkuZmluZChyID0+IFN0cmluZyhyLmlkKSA9PT0gaWQpO1xuICAgICAgY29uc3QgY2hhbmdlZCAgID0gaXNOZXcgfHwgKHByaW9ySXRlbSAmJiBwcmlvckl0ZW0ucHJvcG9zZWQgIT09IGl0ZW0ucHJvcG9zZWQpO1xuICAgICAgaWYgKGNoYW5nZWQpIF9tYXJrQ2hhbmdlZChlbCk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChzdGVwID09PSAnY3VzdG9taXphdGlvbnMnKSB7XG4gICAgY29uc3QgcHJpb3JFeHBJZHMgPSBuZXcgU2V0KFxuICAgICAgKHByaW9yT3V0cHV0LmN1c3RvbWl6YXRpb25zPy5leHBlcmllbmNlX3JlY29tbWVuZGF0aW9ucyB8fCBbXSkubWFwKHIgPT4gU3RyaW5nKHIuaWQpKVxuICAgICk7XG4gICAgY29uc3QgbmV3RXhwUmVjcyAgPSBuZXdPdXRwdXQuY3VzdG9taXphdGlvbnM/LmV4cGVyaWVuY2VfcmVjb21tZW5kYXRpb25zIHx8IFtdO1xuICAgIGZvciAoY29uc3QgcmVjIG9mIG5ld0V4cFJlY3MpIHtcbiAgICAgIGNvbnN0IGlkICAgPSBTdHJpbmcocmVjLmlkIHx8ICcnKTtcbiAgICAgIGNvbnN0IGVsICAgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGB0cltkYXRhLWV4cC1pZD1cIiR7Q1NTLmVzY2FwZShpZCl9XCJdYCk7XG4gICAgICBpZiAoIWVsKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHByaW9yID0gKHByaW9yT3V0cHV0LmN1c3RvbWl6YXRpb25zPy5leHBlcmllbmNlX3JlY29tbWVuZGF0aW9ucyB8fCBbXSkuZmluZChyID0+IFN0cmluZyhyLmlkKSA9PT0gaWQpO1xuICAgICAgaWYgKCFwcmlvckV4cElkcy5oYXMoaWQpIHx8IChwcmlvciAmJiBwcmlvci5yZWNvbW1lbmRhdGlvbiAhPT0gcmVjLnJlY29tbWVuZGF0aW9uKSkge1xuICAgICAgICBfbWFya0NoYW5nZWQoZWwpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHByaW9yU2tpbGxzID0gbmV3IFNldChcbiAgICAgIChwcmlvck91dHB1dC5jdXN0b21pemF0aW9ucz8uc2tpbGxfcmVjb21tZW5kYXRpb25zIHx8IFtdKS5tYXAociA9PiAoci5za2lsbCB8fCAnJykudG9Mb3dlckNhc2UoKSlcbiAgICApO1xuICAgIGNvbnN0IG5ld1NraWxsUmVjcyA9IG5ld091dHB1dC5jdXN0b21pemF0aW9ucz8uc2tpbGxfcmVjb21tZW5kYXRpb25zIHx8IFtdO1xuICAgIGZvciAoY29uc3QgcmVjIG9mIG5ld1NraWxsUmVjcykge1xuICAgICAgY29uc3QgbmFtZSA9IChyZWMuc2tpbGwgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBjb25zdCBlbCAgID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgdHJbZGF0YS1za2lsbD1cIiR7Q1NTLmVzY2FwZShuYW1lKX1cIl1gKTtcbiAgICAgIGlmICghZWwpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgcHJpb3IgPSAocHJpb3JPdXRwdXQuY3VzdG9taXphdGlvbnM/LnNraWxsX3JlY29tbWVuZGF0aW9ucyB8fCBbXSkuZmluZChcbiAgICAgICAgciA9PiAoci5za2lsbCB8fCAnJykudG9Mb3dlckNhc2UoKSA9PT0gbmFtZVxuICAgICAgKTtcbiAgICAgIGlmICghcHJpb3JTa2lsbHMuaGFzKG5hbWUpIHx8IChwcmlvciAmJiBwcmlvci5yZWNvbW1lbmRhdGlvbiAhPT0gcmVjLnJlY29tbWVuZGF0aW9uKSkge1xuICAgICAgICBfbWFya0NoYW5nZWQoZWwpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm47XG4gIH1cbn1cblxuLyoqIEFwcGx5IGRhdGEtY2hhbmdlZCBhdHRyaWJ1dGUgYW5kIHRyaWdnZXIgaGlnaGxpZ2h0IGFuaW1hdGlvbiBvbiBhbiBlbGVtZW50LiAqL1xuZnVuY3Rpb24gX21hcmtDaGFuZ2VkKGVsKSB7XG4gIGVsLnNldEF0dHJpYnV0ZSgnZGF0YS1jaGFuZ2VkJywgJ3RydWUnKTtcbiAgLy8gUmVtb3ZlIHRoZSBhdHRyaWJ1dGUgYWZ0ZXIgdGhlIGFuaW1hdGlvbiBjb21wbGV0ZXMgc28gaXQgY2FuIGJlIHJlLXRyaWdnZXJlZCBvbiBhIHNlY29uZCByZXJ1bi5cbiAgc2V0VGltZW91dCgoKSA9PiBlbC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtY2hhbmdlZCcpLCAyNTAwKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEJ1bGxldCByZW9yZGVyIG1vZGFsIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBzaG93QnVsbGV0UmVvcmRlcihleHBJZCwgZXhwVGl0bGUpIHtcbiAgLy8gRmV0Y2ggYWNoaWV2ZW1lbnRzIChyZXF1aXJlZCkgYW5kIHN1Z2dlc3RlZCBvcmRlciAoYmVzdC1lZmZvcnQpLlxuICBsZXQgYWNoaWV2ZW1lbnRzID0gW107XG4gIGxldCBwcm9wb3NlZE9yZGVyID0gbnVsbDtcbiAgbGV0IGhhc0pvYkFuYWx5c2lzID0gZmFsc2U7XG4gIGxldCBwcm9wb3NlZFJlYXNvbmluZyA9ICcnO1xuICBsZXQgcHJvcG9zZWRBdHNJbXBhY3QgPSAnJztcbiAgbGV0IHByb3Bvc2VkUGFnZUltcGFjdCA9ICcnO1xuICB0cnkge1xuICAgIGNvbnN0IGRldGFpbHNSZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9leHBlcmllbmNlLWRldGFpbHMnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeydDb250ZW50LVR5cGUnOidhcHBsaWNhdGlvbi9qc29uJ30sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7ZXhwZXJpZW5jZV9pZDogZXhwSWR9KSxcbiAgICB9KTtcbiAgICBpZiAoIWRldGFpbHNSZXMub2spIHtcbiAgICAgIGxldCBkZXRhaWxzRXJyID0gYEhUVFAgJHtkZXRhaWxzUmVzLnN0YXR1c31gO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IGF3YWl0IGRldGFpbHNSZXMuanNvbigpO1xuICAgICAgICBkZXRhaWxzRXJyID0gcGF5bG9hZC5lcnJvciB8fCBwYXlsb2FkLm1lc3NhZ2UgfHwgZGV0YWlsc0VycjtcbiAgICAgIH0gY2F0Y2ggKF8pIHsgLyoga2VlcCBzdGF0dXMtYmFzZWQgZXJyb3IgKi8gfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGRldGFpbHNFcnIpO1xuICAgIH1cblxuICAgIGNvbnN0IGRldGFpbHNEYXRhID0gYXdhaXQgZGV0YWlsc1Jlcy5qc29uKCk7XG4gICAgYWNoaWV2ZW1lbnRzICA9IChkZXRhaWxzRGF0YS5leHBlcmllbmNlICYmIGRldGFpbHNEYXRhLmV4cGVyaWVuY2UuYWNoaWV2ZW1lbnRzKSB8fCBbXTtcblxuICAgIGNvbnN0IHJlY1JlY29yZCA9IF9maW5kRXhwZXJpZW5jZVJlY29tbWVuZGF0aW9uUmVjb3JkKGV4cElkKTtcbiAgICBjb25zdCBsbG1CdWxsZXRPcmRlciA9IHJlY1JlY29yZCAmJiB0eXBlb2YgcmVjUmVjb3JkLmJ1bGxldF9vcmRlciA9PT0gJ29iamVjdCdcbiAgICAgID8gcmVjUmVjb3JkLmJ1bGxldF9vcmRlclxuICAgICAgOiBudWxsO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGxsbUJ1bGxldE9yZGVyPy5vcmRlcikgJiYgbGxtQnVsbGV0T3JkZXIub3JkZXIubGVuZ3RoID4gMSkge1xuICAgICAgcHJvcG9zZWRPcmRlciA9IGxsbUJ1bGxldE9yZGVyLm9yZGVyO1xuICAgICAgaGFzSm9iQW5hbHlzaXMgPSB0cnVlO1xuICAgICAgcHJvcG9zZWRSZWFzb25pbmcgPSBTdHJpbmcobGxtQnVsbGV0T3JkZXIucmVhc29uaW5nIHx8ICcnKS50cmltKCk7XG4gICAgICBwcm9wb3NlZEF0c0ltcGFjdCA9IFN0cmluZyhsbG1CdWxsZXRPcmRlci5hdHNfaW1wYWN0IHx8ICcnKS50cmltKCk7XG4gICAgICBwcm9wb3NlZFBhZ2VJbXBhY3QgPSBTdHJpbmcobGxtQnVsbGV0T3JkZXIucGFnZV9sZW5ndGhfaW1wYWN0IHx8ICcnKS50cmltKCk7XG4gICAgfVxuXG4gICAgLy8gU3VnZ2VzdGVkIG9yZGVyIGlzIG9wdGlvbmFsOyBmYWlsdXJlcyBzaG91bGQgbm90IGJsb2NrIG9wZW5pbmcgdGhlIG1vZGFsLlxuICAgIGlmICghcHJvcG9zZWRPcmRlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcHJvcG9zZWRSZXMgPSBhd2FpdCBmZXRjaChgL2FwaS9wcm9wb3NlZC1idWxsZXQtb3JkZXI/ZXhwZXJpZW5jZV9pZD0ke2VuY29kZVVSSUNvbXBvbmVudChleHBJZCl9YCk7XG4gICAgICAgIGlmIChwcm9wb3NlZFJlcy5vaykge1xuICAgICAgICAgIGNvbnN0IHByb3Bvc2VkRGF0YSA9IGF3YWl0IHByb3Bvc2VkUmVzLmpzb24oKTtcbiAgICAgICAgICBwcm9wb3NlZE9yZGVyID0gcHJvcG9zZWREYXRhLnByb3Bvc2VkX29yZGVyIHx8IG51bGw7XG4gICAgICAgICAgaGFzSm9iQW5hbHlzaXMgPSBwcm9wb3NlZERhdGEuaGFzX2pvYl9hbmFseXNpcyB8fCBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2cud2FybignQ291bGQgbm90IGxvYWQgc3VnZ2VzdGVkIGJ1bGxldCBvcmRlcjonLCBwcm9wb3NlZFJlcy5zdGF0dXMpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZy53YXJuKCdDb3VsZCBub3QgbG9hZCBzdWdnZXN0ZWQgYnVsbGV0IG9yZGVyOicsIGUpO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnN0IGVycm9yVGV4dCA9IGUubWVzc2FnZSA9PT0gJ0ZhaWxlZCB0byBmZXRjaCdcbiAgICAgID8gJ0ZhaWxlZCB0byBmZXRjaCAoc2VydmVyIHVuYXZhaWxhYmxlKS4nXG4gICAgICA6IGUubWVzc2FnZTtcbiAgICBhcHBlbmRSZXRyeU1lc3NhZ2UoJ1x1MjZBMCBDb3VsZCBub3QgbG9hZCBidWxsZXRzOiAnICsgZXJyb3JUZXh0LCAoKSA9PiBzaG93QnVsbGV0UmVvcmRlcihleHBJZCwgZXhwVGl0bGUpKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCFhY2hpZXZlbWVudHMubGVuZ3RoKSB7XG4gICAgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgJ05vIGJ1bGxldCBwb2ludHMgZm91bmQgZm9yIHRoaXMgZXhwZXJpZW5jZS4nKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBTYXZlIGZvY3VzIG9yaWdpbiBmb3IgcmVzdG9yYXRpb24gb24gY2xvc2UgKEdBUC0xNzYpXG4gIGlmICh0eXBlb2YgX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICB9XG5cbiAgLy8gQnVpbGQgbW9kYWwgY29udGVudFxuICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBtb2RhbC5pZCA9ICdidWxsZXQtcmVvcmRlci1tb2RhbCc7XG4gIG1vZGFsLnNldEF0dHJpYnV0ZSgncm9sZScsICdkaWFsb2cnKTtcbiAgbW9kYWwuc2V0QXR0cmlidXRlKCdhcmlhLW1vZGFsJywgJ3RydWUnKTtcbiAgbW9kYWwuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsbGVkYnknLCAnYnVsbGV0LXJlb3JkZXItdGl0bGUnKTtcbiAgbW9kYWwuc3R5bGUuY3NzVGV4dCA9IGBcbiAgICBwb3NpdGlvbjpmaXhlZDt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsMC41KTtcbiAgICB6LWluZGV4Ojk5OTk7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2A7XG5cbiAgY29uc3Qgc3VnZ2VzdGVkQnRuID0gaGFzSm9iQW5hbHlzaXNcbiAgICA/IGA8YnV0dG9uIGNsYXNzPVwiYnRuLXNlY29uZGFyeVwiIGlkPVwidXNlLWxsbS1vcmRlci1idG5cIiB0aXRsZT1cIkFwcGx5IGpvYi1yZWxldmFuY2UgcmFua2luZyBmcm9tIHlvdXIgam9iIGFuYWx5c2lzXCJcbiAgICAgICAgIHN0eWxlPVwiY29sb3I6IzYzNjZmMTtib3JkZXItY29sb3I6IzYzNjZmMTtcIj5cdTI3MjggVXNlIFN1Z2dlc3RlZCBPcmRlcjwvYnV0dG9uPmBcbiAgICA6ICcnO1xuICBjb25zdCBzdWdnZXN0aW9uTWV0YSA9IHByb3Bvc2VkUmVhc29uaW5nIHx8IHByb3Bvc2VkQXRzSW1wYWN0IHx8IHByb3Bvc2VkUGFnZUltcGFjdFxuICAgID8gYDxkaXYgaWQ9XCJidWxsZXQtb3JkZXItYWktbm90ZVwiIHN0eWxlPVwiZm9udC1zaXplOjAuODJlbTtjb2xvcjojNDMzOGNhO2JhY2tncm91bmQ6I2VlZjJmZjtib3JkZXI6MXB4IHNvbGlkICNjN2QyZmU7Ym9yZGVyLXJhZGl1czo2cHg7cGFkZGluZzoxMHB4IDEycHg7bWFyZ2luLWJvdHRvbToxMnB4O1wiPlxuICAgICAgICAke3Byb3Bvc2VkUmVhc29uaW5nID8gYDxkaXY+PHN0cm9uZz5BSSByYXRpb25hbGU6PC9zdHJvbmc+ICR7ZXNjYXBlSHRtbChwcm9wb3NlZFJlYXNvbmluZyl9PC9kaXY+YCA6ICcnfVxuICAgICAgICAke3Byb3Bvc2VkQXRzSW1wYWN0ID8gYDxkaXY+PHN0cm9uZz5BVFMgaW1wYWN0Ojwvc3Ryb25nPiAke2VzY2FwZUh0bWwocHJvcG9zZWRBdHNJbXBhY3QpfTwvZGl2PmAgOiAnJ31cbiAgICAgICAgJHtwcm9wb3NlZFBhZ2VJbXBhY3QgPyBgPGRpdj48c3Ryb25nPlBhZ2UgbGVuZ3RoIGltcGFjdDo8L3N0cm9uZz4gJHtlc2NhcGVIdG1sKHByb3Bvc2VkUGFnZUltcGFjdCl9PC9kaXY+YCA6ICcnfVxuICAgICAgPC9kaXY+YFxuICAgIDogJyc7XG5cbiAgbW9kYWwuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZmY7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzoyNHB4O21heC13aWR0aDo2NDBweDt3aWR0aDo5MiU7XG4gICAgICAgICAgICAgICAgbWF4LWhlaWdodDo4MHZoO292ZXJmbG93LXk6YXV0bztib3gtc2hhZG93OjAgMjBweCA2MHB4IHJnYmEoMCwwLDAsMC4zKTtcIj5cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47YWxpZ24taXRlbXM6ZmxleC1zdGFydDttYXJnaW4tYm90dG9tOjE2cHg7XCI+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGgzIGlkPVwiYnVsbGV0LXJlb3JkZXItdGl0bGVcIiBzdHlsZT1cIm1hcmdpbjowO2NvbG9yOiMxZjI5Mzc7XCI+XHUyMTk1IFJlb3JkZXIgQnVsbGV0czwvaDM+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImNvbG9yOiM2YjcyODA7Zm9udC1zaXplOjAuOWVtO21hcmdpbi10b3A6NHB4O1wiPiR7ZXhwVGl0bGV9PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8YnV0dG9uIGFyaWEtbGFiZWw9XCJDbG9zZSByZW9yZGVyIGRpYWxvZ1wiXG4gICAgICAgICAgb25jbGljaz1cInJlc3RvcmVGb2N1cygpO2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidWxsZXQtcmVvcmRlci1tb2RhbCcpLnJlbW92ZSgpXCJcbiAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6bm9uZTtib3JkZXI6bm9uZTtmb250LXNpemU6MS40ZW07Y3Vyc29yOnBvaW50ZXI7Y29sb3I6IzZiNzI4MDtcIj5cdTI3MTU8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07Y29sb3I6IzZiNzI4MDttYXJnaW4tYm90dG9tOjEycHg7XCI+XG4gICAgICAgIFVzZSBcdTIxOTEgXHUyMTkzIHRvIHJlb3JkZXIuIEJ1bGxldHMgaGlnaGVyIGluIHRoZSBsaXN0IGFwcGVhciBmaXJzdCBvbiB5b3VyIENWLlxuICAgICAgICBUaGUgbW9zdCByZWxldmFudCBidWxsZXQgd2lsbCBiZSBhdXRvLXJhbmtlZCBoaWdoZXN0IGlmIHlvdSByZXNldC5cbiAgICAgIDwvZGl2PlxuICAgICAgJHtzdWdnZXN0aW9uTWV0YX1cbiAgICAgIDxvbCBpZD1cImJ1bGxldC1yZW9yZGVyLWxpc3RcIiBzdHlsZT1cInBhZGRpbmc6MDttYXJnaW46MDtsaXN0LXN0eWxlOm5vbmU7XCI+XG4gICAgICA8L29sPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6MTBweDttYXJnaW4tdG9wOjE4cHg7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kO1wiPlxuICAgICAgICAke3N1Z2dlc3RlZEJ0bn1cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1zZWNvbmRhcnlcIiBvbmNsaWNrPVwicmVzZXRCdWxsZXRPcmRlcignJHtleHBJZH0nKVwiPlx1MjFCQSBSZXNldCB0byBBdXRvPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4tcHJpbWFyeVwiICAgb25jbGljaz1cInNhdmVCdWxsZXRPcmRlcignJHtleHBJZH0nKTtyZXN0b3JlRm9jdXMoKVwiPlNhdmUgT3JkZXI8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PmA7XG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobW9kYWwpO1xuICBpZiAodHlwZW9mIHRyYXBGb2N1cyA9PT0gJ2Z1bmN0aW9uJykgdHJhcEZvY3VzKCdidWxsZXQtcmVvcmRlci1tb2RhbCcpO1xuICBpZiAodHlwZW9mIHNldEluaXRpYWxGb2N1cyA9PT0gJ2Z1bmN0aW9uJykgc2V0SW5pdGlhbEZvY3VzKCdidWxsZXQtcmVvcmRlci1tb2RhbCcpO1xuXG4gIC8vIENsb3NlIG9uIEVzY2FwZVxuICBjb25zdCBlc2NIYW5kbGVyID0gKGUpID0+IHtcbiAgICBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICByZXN0b3JlRm9jdXMoKTtcbiAgICAgIG1vZGFsLnJlbW92ZSgpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGVzY0hhbmRsZXIpO1xuICAgIH1cbiAgfTtcbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGVzY0hhbmRsZXIpO1xuXG4gIC8vIFBvcHVsYXRlIGxpc3QgaXRlbXNcbiAgY29uc3QgbGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidWxsZXQtcmVvcmRlci1saXN0Jyk7XG4gIGFjaGlldmVtZW50cy5mb3JFYWNoKChhY2gsIGlkeCkgPT4ge1xuICAgIGNvbnN0IHRleHQgPSAodHlwZW9mIGFjaCA9PT0gJ29iamVjdCcgPyAoYWNoLnRleHQgfHwgJycpIDogU3RyaW5nKGFjaCkpO1xuICAgIGNvbnN0IGxpID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTtcbiAgICBsaS5kYXRhc2V0Lm9yaWdJbmRleCA9IGlkeDtcbiAgICBsaS5zdHlsZS5jc3NUZXh0ID0gYGRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpmbGV4LXN0YXJ0O2dhcDo4cHg7cGFkZGluZzo4cHg7bWFyZ2luLWJvdHRvbTo2cHg7XG4gICAgICBiYWNrZ3JvdW5kOiNmOGZhZmM7Ym9yZGVyOjFweCBzb2xpZCAjZTJlOGYwO2JvcmRlci1yYWRpdXM6NnB4O2A7XG4gICAgbGkuaW5uZXJIVE1MID0gYFxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Z2FwOjJweDtmbGV4LXNocmluazowO1wiPlxuICAgICAgICA8YnV0dG9uIHRpdGxlPVwiTW92ZSB1cFwiIGFyaWEtbGFiZWw9XCJNb3ZlIGJ1bGxldCB1cFwiXG4gICAgICAgICAgb25jbGljaz1cIm1vdmVCdWxsZXQodGhpcywtMSlcIlxuICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDpub25lO2JvcmRlcjoxcHggc29saWQgI2QxZDVkYjtib3JkZXItcmFkaXVzOjNweDtcbiAgICAgICAgICAgICAgICAgY3Vyc29yOnBvaW50ZXI7cGFkZGluZzoxcHggNXB4O2xpbmUtaGVpZ2h0OjEuMjtmb250LXNpemU6MC45ZW07XCI+XHUyMTkxPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gdGl0bGU9XCJNb3ZlIGRvd25cIiBhcmlhLWxhYmVsPVwiTW92ZSBidWxsZXQgZG93blwiXG4gICAgICAgICAgb25jbGljaz1cIm1vdmVCdWxsZXQodGhpcywrMSlcIlxuICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDpub25lO2JvcmRlcjoxcHggc29saWQgI2QxZDVkYjtib3JkZXItcmFkaXVzOjNweDtcbiAgICAgICAgICAgICAgICAgY3Vyc29yOnBvaW50ZXI7cGFkZGluZzoxcHggNXB4O2xpbmUtaGVpZ2h0OjEuMjtmb250LXNpemU6MC45ZW07XCI+XHUyMTkzPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxzcGFuIHN0eWxlPVwiZmxleDoxO2ZvbnQtc2l6ZTowLjllbTtcIj4ke3RleHR9PC9zcGFuPmA7XG4gICAgbGlzdC5hcHBlbmRDaGlsZChsaSk7XG4gIH0pO1xuICBfdXBkYXRlQnVsbGV0QXJyb3dzKCk7XG5cbiAgLy8gV2lyZSB1cCBcIlVzZSBTdWdnZXN0ZWQgT3JkZXJcIiBidXR0b24gaWYgam9iIGFuYWx5c2lzIGlzIGF2YWlsYWJsZVxuICBpZiAoaGFzSm9iQW5hbHlzaXMgJiYgcHJvcG9zZWRPcmRlcikge1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1c2UtbGxtLW9yZGVyLWJ0bicpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIF9hcHBseUJ1bGxldE9yZGVyKHByb3Bvc2VkT3JkZXIpO1xuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9hcHBseUJ1bGxldE9yZGVyKG9yZGVyKSB7XG4gIGNvbnN0IGxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnVsbGV0LXJlb3JkZXItbGlzdCcpO1xuICBpZiAoIWxpc3QpIHJldHVybjtcbiAgY29uc3QgaXRlbXMgPSBBcnJheS5mcm9tKGxpc3QucXVlcnlTZWxlY3RvckFsbCgnbGknKSk7XG4gIC8vIEJ1aWxkIGEgbWFwIGZyb20gb3JpZ0luZGV4IFx1MjE5MiBsaSBlbGVtZW50XG4gIGNvbnN0IGJ5T3JpZyA9IHt9O1xuICBpdGVtcy5mb3JFYWNoKGxpID0+IHsgYnlPcmlnW3BhcnNlSW50KGxpLmRhdGFzZXQub3JpZ0luZGV4LCAxMCldID0gbGk7IH0pO1xuICAvLyBSZS1hcHBlbmQgaW4gcHJvcG9zZWQgb3JkZXIsIHRoZW4gYW55IG5vdCBsaXN0ZWRcbiAgY29uc3QgbGlzdGVkID0gbmV3IFNldChvcmRlci5tYXAoTnVtYmVyKSk7XG4gIG9yZGVyLmZvckVhY2goaWR4ID0+IHsgaWYgKGJ5T3JpZ1tpZHhdKSBsaXN0LmFwcGVuZENoaWxkKGJ5T3JpZ1tpZHhdKTsgfSk7XG4gIGl0ZW1zLmZvckVhY2gobGkgPT4ge1xuICAgIGlmICghbGlzdGVkLmhhcyhwYXJzZUludChsaS5kYXRhc2V0Lm9yaWdJbmRleCwgMTApKSkgbGlzdC5hcHBlbmRDaGlsZChsaSk7XG4gIH0pO1xuICBfdXBkYXRlQnVsbGV0QXJyb3dzKCk7XG59XG5cbmZ1bmN0aW9uIG1vdmVCdWxsZXQoYnRuLCBkaXJlY3Rpb24pIHtcbiAgY29uc3QgbGkgICA9IGJ0bi5jbG9zZXN0KCdsaScpO1xuICBjb25zdCBsaXN0ID0gbGkucGFyZW50Tm9kZTtcbiAgaWYgKGRpcmVjdGlvbiA9PT0gLTEgJiYgbGkucHJldmlvdXNFbGVtZW50U2libGluZykge1xuICAgIGxpc3QuaW5zZXJ0QmVmb3JlKGxpLCBsaS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nKTtcbiAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT09ICsxICYmIGxpLm5leHRFbGVtZW50U2libGluZykge1xuICAgIGxpc3QuaW5zZXJ0QmVmb3JlKGxpLm5leHRFbGVtZW50U2libGluZywgbGkpO1xuICB9XG4gIF91cGRhdGVCdWxsZXRBcnJvd3MoKTtcbn1cblxuZnVuY3Rpb24gX3VwZGF0ZUJ1bGxldEFycm93cygpIHtcbiAgY29uc3QgbGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidWxsZXQtcmVvcmRlci1saXN0Jyk7XG4gIGlmICghbGlzdCkgcmV0dXJuO1xuICBjb25zdCBpdGVtcyA9IGxpc3QucXVlcnlTZWxlY3RvckFsbCgnbGknKTtcbiAgaXRlbXMuZm9yRWFjaCgobGksIGlkeCkgPT4ge1xuICAgIGNvbnN0IFt1cEJ0biwgZG93bkJ0bl0gPSBsaS5xdWVyeVNlbGVjdG9yQWxsKCdidXR0b24nKTtcbiAgICB1cEJ0bi5kaXNhYmxlZCAgID0gaWR4ID09PSAwO1xuICAgIGRvd25CdG4uZGlzYWJsZWQgPSBpZHggPT09IGl0ZW1zLmxlbmd0aCAtIDE7XG4gICAgdXBCdG4uc3R5bGUub3BhY2l0eSAgID0gdXBCdG4uZGlzYWJsZWQgICA/ICcwLjMnIDogJzEnO1xuICAgIGRvd25CdG4uc3R5bGUub3BhY2l0eSA9IGRvd25CdG4uZGlzYWJsZWQgPyAnMC4zJyA6ICcxJztcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNhdmVCdWxsZXRPcmRlcihleHBJZCkge1xuICBjb25zdCBsaXN0ICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidWxsZXQtcmVvcmRlci1saXN0Jyk7XG4gIGNvbnN0IGl0ZW1zID0gbGlzdCA/IGxpc3QucXVlcnlTZWxlY3RvckFsbCgnbGknKSA6IFtdO1xuICBjb25zdCBvcmRlciA9IEFycmF5LmZyb20oaXRlbXMpLm1hcChsaSA9PiBwYXJzZUludChsaS5kYXRhc2V0Lm9yaWdJbmRleCwgMTApKTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvcmVvcmRlci1idWxsZXRzJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsnQ29udGVudC1UeXBlJzonYXBwbGljYXRpb24vanNvbid9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe2V4cGVyaWVuY2VfaWQ6IGV4cElkLCBvcmRlcn0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmICghcmVzLm9rIHx8ICFkYXRhLm9rKSB7XG4gICAgICBhcHBlbmRSZXRyeU1lc3NhZ2UoJ1x1MjZBMCBDb3VsZCBub3Qgc2F2ZSBidWxsZXQgb3JkZXI6ICcgKyAoZGF0YS5lcnJvcnx8J1Vua25vd24nKSwgKCkgPT4gc2F2ZUJ1bGxldE9yZGVyKGV4cElkKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsICdcdTIxOTUgQnVsbGV0IG9yZGVyIHNhdmVkLiBJdCB3aWxsIGFwcGx5IHdoZW4geW91IGdlbmVyYXRlIHRoZSBDVi4nKTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnVsbGV0LXJlb3JkZXItbW9kYWwnKT8ucmVtb3ZlKCk7XG4gIH0gY2F0Y2goZSkge1xuICAgIGFwcGVuZFJldHJ5TWVzc2FnZSgnXHUyNkEwIE5ldHdvcmsgZXJyb3Igc2F2aW5nIGJ1bGxldCBvcmRlcjogJyArIGUubWVzc2FnZSwgKCkgPT4gc2F2ZUJ1bGxldE9yZGVyKGV4cElkKSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVzZXRCdWxsZXRPcmRlcihleHBJZCkge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9yZW9yZGVyLWJ1bGxldHMnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeydDb250ZW50LVR5cGUnOidhcHBsaWNhdGlvbi9qc29uJ30sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7ZXhwZXJpZW5jZV9pZDogZXhwSWQsIG9yZGVyOiBbXX0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmICghcmVzLm9rIHx8ICFkYXRhLm9rKSB7XG4gICAgICBhcHBlbmRSZXRyeU1lc3NhZ2UoJ1x1MjZBMCBDb3VsZCBub3QgcmVzZXQgYnVsbGV0IG9yZGVyOiAnICsgKGRhdGEuZXJyb3J8fCdVbmtub3duJyksICgpID0+IHJlc2V0QnVsbGV0T3JkZXIoZXhwSWQpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ1x1MjFCQSBCdWxsZXQgb3JkZXIgcmVzZXQuIFJlbGV2YW5jZS1iYXNlZCBvcmRlcmluZyB3aWxsIGFwcGx5LicpO1xuICAgIHJlc3RvcmVGb2N1cygpO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidWxsZXQtcmVvcmRlci1tb2RhbCcpPy5yZW1vdmUoKTtcbiAgfSBjYXRjaChlKSB7XG4gICAgYXBwZW5kUmV0cnlNZXNzYWdlKCdcdTI2QTAgTmV0d29yayBlcnJvciByZXNldHRpbmcgYnVsbGV0IG9yZGVyOiAnICsgZS5tZXNzYWdlLCAoKSA9PiByZXNldEJ1bGxldE9yZGVyKGV4cElkKSk7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIEZvcndhcmQtc2tpcCBwaGFzZSB3YXRlcm1hcmsgKEdBUC0xMDEpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4vLyBCYWNrZW5kIHBoYXNlIG9yZGVyaW5nIChtYXRjaGVzIGNvbnZlcnNhdGlvbl9tYW5hZ2VyLnB5IF9QSEFTRV9PUkRFUikuXG5jb25zdCBfUEhBU0VfUFJPR1JFU1NJT04gPSBbXG4gICdpbml0JywgJ2pvYl9hbmFseXNpcycsICdjdXN0b21pemF0aW9uJywgJ3Jld3JpdGVfcmV2aWV3JyxcbiAgJ3NwZWxsX2NoZWNrJywgJ2dlbmVyYXRpb24nLCAnbGF5b3V0X3JldmlldycsICdmaW5hbF9nZW5lcmF0aW9uJywgJ3JlZmluZW1lbnQnLFxuXTtcblxuLy8gTWluaW11bSBoaWdoZXN0UGhhc2UgaW5kZXggcmVxdWlyZWQgZm9yIGVhY2ggc3RlcCB0byBiZSBmb3J3YXJkLXNraXBwYWJsZS5cbmNvbnN0IF9TVEVQX0ZXRF9QSEFTRV9NSU4gPSB7XG4gIGFuYWx5c2lzOiAgICAgICAxLCAgIC8vIGpvYl9hbmFseXNpc1xuICBjdXN0b21pemF0aW9uczogMiwgICAvLyBjdXN0b21pemF0aW9uXG4gIHJld3JpdGU6ICAgICAgICAzLCAgIC8vIHJld3JpdGVfcmV2aWV3XG4gIHNwZWxsOiAgICAgICAgICA0LCAgIC8vIHNwZWxsX2NoZWNrXG4gIGxheW91dDogICAgICAgICA1LCAgIC8vIGdlbmVyYXRpb25cbiAgZG93bmxvYWQ6ICAgICAgIDcsICAgLy8gZmluYWxfZ2VuZXJhdGlvblxuICBjb3Zlcl9sZXR0ZXI6ICAgNyxcbiAgc2NyZWVuaW5nOiAgICAgIDcsXG4gIGludGVydmlld19wcmVwOiA3LFxuICB0aGFua195b3U6ICAgICAgNyxcbiAgaGFydmVzdDogICAgICAgIDcsXG59O1xuXG4vLyBcdTI1MDBcdTI1MDAgV29ya2Zsb3cgc3RlcCBiYXIgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIHVwZGF0ZVdvcmtmbG93U3RlcHMoc3RhdHVzKSB7XG4gIC8vIDEyLXN0ZXAgd29ya2Zsb3cgYmFyOiBKb2IgSW5wdXQgXHUyMTkyIEFuYWx5c2lzIFx1MjE5MiBDdXN0b21pc2UgXHUyMTkyIFJld3JpdGVzIFx1MjE5MlxuICAvLyAgIFNwZWxsIENoZWNrIFx1MjE5MiBMYXlvdXQgUmV2aWV3IFx1MjE5MiBEb3dubG9hZCBcdTIxOTIgQ292ZXIgTGV0dGVyIFx1MjE5MiBTY3JlZW5pbmcgXHUyMTkyXG4gIC8vICAgSW50ZXJ2aWV3IFByZXAgXHUyMTkyIFRoYW5rIFlvdSBcdTIxOTIgSGFydmVzdFxuICAvL1xuICBjb25zdCBVUENPTUlORyA9IG5ldyBTZXQoKTtcblxuICAvLyBTdGVwcyB0aGF0IHN1cHBvcnQgTExNIHJlLWV4ZWN1dGlvbiB2aWEgL2FwaS9yZS1ydW4tcGhhc2VcbiAgY29uc3QgUkVfUlVOX1NURVBTID0gbmV3IFNldChbJ2FuYWx5c2lzJywgJ2N1c3RvbWl6YXRpb25zJywgJ3Jld3JpdGUnLCAnc3BlbGwnLCAnbGF5b3V0J10pO1xuXG4gIC8vIEJhc2UgbGFiZWwgZm9yIGVhY2ggc3RlcCAodXNlZCB3aGVuIGluamVjdGluZyBcdTIxQkIgYnV0dG9uKVxuICBjb25zdCBTVEVQX0xBQkVMUyA9IHtcbiAgICBqb2I6ICAgICAgICAgICAgJ1x1RDgzRFx1RENFNSBKb2IgSW5wdXQnLFxuICAgIGFuYWx5c2lzOiAgICAgICAnXHVEODNEXHVERDBEIEFuYWx5c2lzJyxcbiAgICBjdXN0b21pemF0aW9uczogJ1x1MjY5OVx1RkUwRiBDdXN0b21pc2UnLFxuICAgIHJld3JpdGU6ICAgICAgICAnXHUyNzBGXHVGRTBGIFJld3JpdGVzJyxcbiAgICBzcGVsbDogICAgICAgICAgJ1x1RDgzRFx1REQyNCBTcGVsbCBDaGVjaycsXG4gICAgbGF5b3V0OiAgICAgICAgICdcdUQ4M0NcdURGQTggTGF5b3V0IFJldmlldycsXG4gICAgZG93bmxvYWQ6ICAgICAgICdcdTJCMDdcdUZFMEYgRG93bmxvYWQgRmlsZXMnLFxuICAgIGNvdmVyX2xldHRlcjogICAnXHVEODNEXHVEQ0U5IENvdmVyIExldHRlcicsXG4gICAgc2NyZWVuaW5nOiAgICAgICdcdUQ4M0RcdURDQ0IgU2NyZWVuaW5nJyxcbiAgICBpbnRlcnZpZXdfcHJlcDogJ1x1RDgzQ1x1REZBNCBJbnRlcnZpZXcgUHJlcCcsXG4gICAgdGhhbmtfeW91OiAgICAgICdcdUQ4M0RcdURFNEYgVGhhbmsgWW91JyxcbiAgICBoYXJ2ZXN0OiAgICAgICAgJ1x1RDgzQ1x1REYzRSBIYXJ2ZXN0JyxcbiAgfTtcblxuICAvLyBEZXRlcm1pbmUgd2hpY2ggc3RlcHMgYXJlIGRvbmUgYmFzZWQgb24gc2Vzc2lvbiBzdGF0ZSBmaWVsZHMuXG4gIGNvbnN0IHBoYXNlID0gc3RhdHVzLnBoYXNlIHx8ICcnO1xuICAvLyBBbGwgcG9zdC1sYXlvdXQgcGhhc2VzIHVubG9jayBzaW11bHRhbmVvdXNseSBvbmNlIGxheW91dCBpcyBjb25maXJtZWQuXG4gIGNvbnN0IHBvc3RMYXlvdXQgPSBwaGFzZSA9PT0gUEhBU0VTLkZJTkFMX0dFTkVSQVRJT04gfHwgcGhhc2UgPT09IFBIQVNFUy5SRUZJTkVNRU5UO1xuICBjb25zdCBkb25lID0ge1xuICAgIGpvYjogICAgICAgICAgICAhIXN0YXR1cy5qb2JfZGVzY3JpcHRpb24sXG4gICAgYW5hbHlzaXM6ICAgICAgICEhc3RhdHVzLmpvYl9hbmFseXNpcyxcbiAgICBjdXN0b21pemF0aW9uczogISFzdGF0dXMuY3VzdG9taXphdGlvbnMsXG4gICAgcmV3cml0ZTogICAgICAgIHBoYXNlICE9PSBQSEFTRVMuUkVXUklURV9SRVZJRVcgJiYgKCEhc3RhdHVzLmN1c3RvbWl6YXRpb25zKSxcbiAgICBzcGVsbDogICAgICAgICAgcGhhc2UgPT09IFBIQVNFUy5HRU5FUkFUSU9OIHx8IHBoYXNlID09PSBQSEFTRVMuTEFZT1VUX1JFVklFVyB8fFxuICAgICAgICAgICAgICAgICAgICBwaGFzZSA9PT0gUEhBU0VTLkZJTkFMX0dFTkVSQVRJT04gfHwgcGhhc2UgPT09IFBIQVNFUy5SRUZJTkVNRU5ULFxuICAgIGxheW91dDogICAgICAgICBwb3N0TGF5b3V0LFxuICAgIGRvd25sb2FkOiAgICAgICBwb3N0TGF5b3V0LFxuICAgIGNvdmVyX2xldHRlcjogICBwb3N0TGF5b3V0LFxuICAgIHNjcmVlbmluZzogICAgICBwb3N0TGF5b3V0LFxuICAgIGludGVydmlld19wcmVwOiBwb3N0TGF5b3V0LFxuICAgIHRoYW5rX3lvdTogICAgICBwb3N0TGF5b3V0LFxuICAgIGhhcnZlc3Q6ICAgICAgICBwb3N0TGF5b3V0LFxuICB9O1xuXG4gIC8vIEZvcndhcmQtc2tpcCB3YXRlcm1hcmsgKEdBUC0xMDEpOiBzdGVwcyBwcmV2aW91c2x5IHJlYWNoZWQgYnV0IG5vdCBjdXJyZW50bHlcbiAgLy8gXCJkb25lXCIgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IHBoYXNlIGFyZSBzdGlsbCBuYXZpZ2FibGUgd2l0aCBhIGNvbmZpcm1hdGlvbi5cbiAgY29uc3QgaGlnaGVzdFBoYXNlSWR4ID0gX1BIQVNFX1BST0dSRVNTSU9OLmluZGV4T2Yoc3RhdHVzLmhpZ2hlc3RfcGhhc2UgfHwgJycpO1xuICBjb25zdCBjdXJyZW50UGhhc2VJZHggPSBfUEhBU0VfUFJPR1JFU1NJT04uaW5kZXhPZihwaGFzZSk7XG5cbiAgLy8gRGV0ZXJtaW5lIHRoZSBhY3RpdmUgc3RlcCBmcm9tIHRoZSBiYWNrZW5kIHBoYXNlIHN0cmluZy5cbiAgY29uc3QgcGhhc2VUb1N0ZXAgPSB7XG4gICAgJ2luaXQnOiAgICAgICAgICAgICAnam9iJyxcbiAgICAnam9iX2FuYWx5c2lzJzogICAgICdhbmFseXNpcycsXG4gICAgJ2N1c3RvbWl6YXRpb24nOiAgICAnY3VzdG9taXphdGlvbnMnLFxuICAgICdyZXdyaXRlX3Jldmlldyc6ICAgJ3Jld3JpdGUnLFxuICAgICdzcGVsbF9jaGVjayc6ICAgICAgJ3NwZWxsJyxcbiAgICAnZ2VuZXJhdGlvbic6ICAgICAgICdsYXlvdXQnLFxuICAgICdsYXlvdXRfcmV2aWV3JzogICAgJ2xheW91dCcsXG4gICAgJ2ZpbmFsX2dlbmVyYXRpb24nOiAnZG93bmxvYWQnLFxuICAgICdyZWZpbmVtZW50JzogICAgICAgJ2Rvd25sb2FkJyxcbiAgfTtcbiAgY29uc3QgYWN0aXZlU3RlcCA9IHBoYXNlVG9TdGVwW3BoYXNlXSB8fCAnam9iJztcblxuICAvLyBSZXNvbHZlIHRoZSByZWVudHJ5IHN0ZXAgZm9yIHRoZSBcIlJlZmluaW5nXCIgYmFkZ2VcbiAgY29uc3QgX3BoYXNlVG9TdGVwMiA9IE9iamVjdC5hc3NpZ24oeydpbml0JzogJ2pvYid9LCBwaGFzZVRvU3RlcCk7XG4gIGNvbnN0IHJlZW50cnlTdGVwID0gc3RhdHVzLml0ZXJhdGluZ1xuICAgID8gKF9waGFzZVRvU3RlcDJbc3RhdHVzLnJlZW50cnlfcGhhc2VdIHx8IHN0YXR1cy5yZWVudHJ5X3BoYXNlIHx8IG51bGwpXG4gICAgOiBudWxsO1xuXG4gIGNvbnN0IHN0ZXBJZHMgPSBbXG4gICAgJ2pvYicsICdhbmFseXNpcycsICdjdXN0b21pemF0aW9ucycsICdyZXdyaXRlJywgJ3NwZWxsJywgJ2xheW91dCcsXG4gICAgJ2Rvd25sb2FkJywgJ2NvdmVyX2xldHRlcicsICdzY3JlZW5pbmcnLCAnaW50ZXJ2aWV3X3ByZXAnLCAndGhhbmtfeW91JywgJ2hhcnZlc3QnLFxuICBdO1xuICBjb25zdCBzdGFsZVN0ZXBzID0gbmV3IFNldChzdGF0dXMuc3RhbGVfc3RlcHMgfHwgW10pO1xuICBzdGVwSWRzLmZvckVhY2goc3RlcCA9PiB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc3RlcC0ke3N0ZXB9YCk7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIC8vIFVwY29taW5nIHN0ZXBzIGFyZSBmaXhlZCBcdTIwMTQgbmV2ZXIgY2hhbmdlIHRoZWlyIGNsYXNzLlxuICAgIGlmIChVUENPTUlORy5oYXMoc3RlcCkpIHJldHVybjtcbiAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnLCAnY29tcGxldGVkJywgJ2NsaWNrYWJsZScsICd1cGNvbWluZycsICdzdGFsZScsICdmb3J3YXJkLXNraXAnKTtcblxuICAgIGxldCBsYWJlbCA9IFNURVBfTEFCRUxTW3N0ZXBdIHx8IHN0ZXA7XG5cbiAgICBpZiAoc3RlcCA9PT0gYWN0aXZlU3RlcCkge1xuICAgICAgZWwuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgICAvLyBcIlx1MjFCQiBSZWZpbmluZ1wiIGJhZGdlIHNob3duIG9uIHRoZSBhY3RpdmUgc3RlcCB3aGVuIGl0ZXJhdGluZ1xuICAgICAgaWYgKHN0YXR1cy5pdGVyYXRpbmcgJiYgcmVlbnRyeVN0ZXAgPT09IHN0ZXApIHtcbiAgICAgICAgbGFiZWwgKz0gJyA8c3BhbiBjbGFzcz1cInN0ZXAtaW5saW5lLWJhZGdlXCI+XHUyMUJCIFJlZmluaW5nPC9zcGFuPic7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChkb25lW3N0ZXBdKSB7XG4gICAgICBlbC5jbGFzc0xpc3QuYWRkKCdjb21wbGV0ZWQnKTtcbiAgICAgIC8vIENvbXBsZXRlZCBzdGVwcyBhcmUgY2xpY2thYmxlIGZvciBiYWNrLW5hdmlnYXRpb24uXG4gICAgICBlbC5jbGFzc0xpc3QuYWRkKCdjbGlja2FibGUnKTtcbiAgICAgIC8vIEFkZCBcdTIxQkIgcmUtcnVuIGJ1dHRvbiBmb3Igc3RlcHMgdGhhdCBzdXBwb3J0IExMTSByZS1leGVjdXRpb25cbiAgICAgIGlmIChSRV9SVU5fU1RFUFMuaGFzKHN0ZXApKSB7XG4gICAgICAgIGNvbnN0IHJlcnVuTGFiZWwgPSBfU1RFUF9ESVNQTEFZW3N0ZXBdIHx8IHN0ZXA7XG4gICAgICAgIGxhYmVsICs9IGAgPGJ1dHRvbiBjbGFzcz1cInN0ZXAtcmVydW5cIiBhcmlhLWxhYmVsPVwiUmUtcnVuICR7cmVydW5MYWJlbH1cIlxuICAgICAgICAgIHRpdGxlPVwiUmUtcnVuICR7c3RlcH0gd2l0aCB1cGRhdGVkIGlucHV0c1wiXG4gICAgICAgICAgb25jbGljaz1cImV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO2NvbmZpcm1SZVJ1blBoYXNlKCcke3N0ZXB9JylcIlxuICAgICAgICAgIHN0eWxlPVwiZm9udC1zaXplOjAuOGVtO29wYWNpdHk6MC4zNTt0cmFuc2l0aW9uOm9wYWNpdHkgMC4xNXM7bWFyZ2luLWxlZnQ6MnB4O2N1cnNvcjpwb2ludGVyO2JhY2tncm91bmQ6bm9uZTtib3JkZXI6bm9uZTtwYWRkaW5nOjA7Y29sb3I6aW5oZXJpdDtsaW5lLWhlaWdodDoxO1wiPlx1MjFCQjwvYnV0dG9uPmA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChoaWdoZXN0UGhhc2VJZHggPj0gMCAmJiAoX1NURVBfRldEX1BIQVNFX01JTltzdGVwXSA/PyBJbmZpbml0eSkgPD0gaGlnaGVzdFBoYXNlSWR4XG4gICAgICAgICAgICAgICAmJiBoaWdoZXN0UGhhc2VJZHggPiBjdXJyZW50UGhhc2VJZHgpIHtcbiAgICAgIC8vIEZvcndhcmQtc2tpcDogc3RlcCB3YXMgY29tcGxldGVkIGluIGEgcHJpb3IgaXRlcmF0aW9uIGJ1dCBpcyBhaGVhZCBvZiBjdXJyZW50IHBoYXNlLlxuICAgICAgZWwuY2xhc3NMaXN0LmFkZCgnZm9yd2FyZC1za2lwJywgJ2NsaWNrYWJsZScpO1xuICAgICAgbGFiZWwgKz0gJyA8c3BhbiBjbGFzcz1cInN0ZXAtaW5saW5lLWJhZGdlIHN0ZXAtZndkLWJhZGdlXCIgdGl0bGU9XCJQcmV2aW91c2x5IGNvbXBsZXRlZCBcdTIwMTQgY2xpY2sgdG8ganVtcCBhaGVhZFwiPlx1MjNFOTwvc3Bhbj4nO1xuICAgIH1cblxuICAgIC8vIEFwcGx5IHN0YWxlIGNsYXNzIGZvciBzdGVwcyBkb3duc3RyZWFtIG9mIGEgcmUtcnVuXG4gICAgaWYgKHN0YWxlU3RlcHMuaGFzKHN0ZXApKSBlbC5jbGFzc0xpc3QuYWRkKCdzdGFsZScpO1xuXG4gICAgLy8gQXBwZW5kIHNyLW9ubHkgc3RhdGUgZGVzY3JpcHRpb24gZm9yIHNjcmVlbiByZWFkZXIgdXNlcnNcbiAgICBjb25zdCBpc1N0YWxlICAgICAgICAgPSBzdGFsZVN0ZXBzLmhhcyhzdGVwKTtcbiAgICBjb25zdCBpc1N0YWxlQ3JpdGljYWwgPSBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ3N0YWxlLWNyaXRpY2FsJyk7XG4gICAgY29uc3QgaXNBY3RpdmUgICAgICAgID0gZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdhY3RpdmUnKTtcbiAgICBjb25zdCBpc0NvbXBsZXRlZCAgICAgPSBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2NvbXBsZXRlZCcpO1xuICAgIGNvbnN0IGlzRndkU2tpcCAgICAgICA9IGVsLmNsYXNzTGlzdC5jb250YWlucygnZm9yd2FyZC1za2lwJyk7XG4gICAgY29uc3Qgc3JTdGF0ZSA9IGlzU3RhbGVDcml0aWNhbCA/ICcgKGNyaXRpY2FsIFx1MjAxNCByZXZpZXcgcmVxdWlyZWQpJ1xuICAgICAgOiBpc1N0YWxlICAgICA/ICcgKHN0YWxlIFx1MjAxNCByZXN1bHRzIG1heSBiZSBvdXRkYXRlZCknXG4gICAgICA6IGlzQWN0aXZlICAgID8gJyAoY3VycmVudCBzdGVwKSdcbiAgICAgIDogaXNDb21wbGV0ZWQgPyAnIChjb21wbGV0ZWQpJ1xuICAgICAgOiBpc0Z3ZFNraXAgICA/ICcgKHByZXZpb3VzbHkgY29tcGxldGVkIFx1MjAxNCBjbGljayB0byBqdW1wIGFoZWFkKSdcbiAgICAgIDogJyc7XG4gICAgaWYgKHNyU3RhdGUpIGxhYmVsICs9IGA8c3BhbiBjbGFzcz1cInNyLW9ubHlcIj4ke3NyU3RhdGV9PC9zcGFuPmA7XG5cbiAgICBlbC5pbm5lckhUTUwgPSBsYWJlbDtcbiAgfSk7XG5cbiAgYXBwbHlMYXlvdXRGcmVzaG5lc3NOYXZpZ2F0aW9uU3RhdGUoKTtcblxuICAvLyBTaG93IFx1MjFCQiBpY29ucyB2aWEgQ1NTIDpob3ZlciBvbiB0aGUgcGFyZW50IC5jb21wbGV0ZWQgc3RlcFxuICAvLyAoaW5qZWN0IGEgPHN0eWxlPiBvbmx5IG9uY2UpXG4gIGlmICghZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0ZXAtcmVydW4tc3R5bGUnKSkge1xuICAgIGNvbnN0IHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgIHMuaWQgPSAnc3RlcC1yZXJ1bi1zdHlsZSc7XG4gICAgcy50ZXh0Q29udGVudCA9ICcuc3RlcC5jb21wbGV0ZWQ6aG92ZXIgLnN0ZXAtcmVydW4sIC5zdGVwLmNvbXBsZXRlZDpmb2N1cy13aXRoaW4gLnN0ZXAtcmVydW4geyBvcGFjaXR5OiAxICFpbXBvcnRhbnQ7IH0gLnN0ZXAtcmVydW46Zm9jdXMtdmlzaWJsZSB7IG91dGxpbmU6IDJweCBzb2xpZCAjM2I4MmY2OyBvdXRsaW5lLW9mZnNldDogMnB4OyBvcGFjaXR5OiAxICFpbXBvcnRhbnQ7IH0nO1xuICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQocyk7XG4gIH1cblxuICAvLyBTeW5jIHNlY29uZC1iYXIgdGFiIHZpc2liaWxpdHkgYW5kIGFjdGlvbiBidXR0b25zIHRvIHRoZSBhY3RpdmUgd29ya2Zsb3cgc3RlcFxuICBpZiAodHlwZW9mIHVwZGF0ZVRhYkJhckZvclN0YWdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdXBkYXRlVGFiQmFyRm9yU3RhZ2UoYWN0aXZlU3RlcCk7XG4gIH1cbiAgdXBkYXRlQWN0aW9uQnV0dG9ucyhhY3RpdmVTdGVwKTtcblxuICAvLyBTeW5jIHZpZXctY3Vyc29yIHJpbmcgdG8gdGhlIGN1cnJlbnRseSB2aXNpYmxlIHRhYlxuICBfdXBkYXRlVmlld2luZ0luZGljYXRvcihzdGF0ZU1hbmFnZXIuZ2V0Q3VycmVudFRhYigpKTtcbn1cblxuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEdFTkVSQVRJT05fU1RBVEVfRVZFTlQsIGFwcGx5TGF5b3V0RnJlc2huZXNzTmF2aWdhdGlvblN0YXRlKTtcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoR0VORVJBVElPTl9TVEFURV9FVkVOVCwgYXBwbHlEaXJ0eVBoYXNlTmF2aWdhdGlvblN0YXRlKTtcbn1cblxuLyoqXG4gKiBNYXJrIG9yIHVubWFyayB3b3JrZmxvdyBzdGVwIHBpbGxzIGFzIHN0YWxlIGJhc2VkIG9uIGRpcnR5IHBoYXNlcyBzZXQgYnlcbiAqIGxheW91dC1waGFzZSBjb250ZW50IGVkaXRzIChQT1NUIC9hcGkvY3YvYXBwbHktY29udGVudC1jaGFuZ2VzKS5cbiAqXG4gKiBPbmx5IGFmZmVjdHMgc3RlcHMgbGlzdGVkIGluIHN0YXRlTWFuYWdlci5nZXREaXJ0eVBoYXNlcygpIHRoYXQgYXJlIE5PVFxuICogYWxyZWFkeSBoYW5kbGVkIGJ5IGFwcGx5TGF5b3V0RnJlc2huZXNzTmF2aWdhdGlvblN0YXRlIChpLmUuIG5vdCAnbGF5b3V0JykuXG4gKi9cbmZ1bmN0aW9uIGFwcGx5RGlydHlQaGFzZU5hdmlnYXRpb25TdGF0ZSgpIHtcbiAgY29uc3QgZGlydHlQaGFzZXMgPSBzdGF0ZU1hbmFnZXIuZ2V0RGlydHlQaGFzZXMoKTtcbiAgY29uc3Qgc3RlcHNUb0NsZWFyID0gW107ICAgIC8vIHN0ZXBzIHdlIG1hbmFnZSBoZXJlIChub3QgJ2xheW91dCcpXG5cbiAgc3RlcHNUb0NsZWFyLmZvckVhY2goc3RlcCA9PiB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc3RlcC0ke3N0ZXB9YCk7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuXG4gICAgY29uc3QgaXNEaXJ0eSA9IGRpcnR5UGhhc2VzLmluY2x1ZGVzKHN0ZXApO1xuICAgIGVsLmNsYXNzTGlzdC50b2dnbGUoJ3N0YWxlJywgaXNEaXJ0eSk7XG5cbiAgICAvLyBQcmVzZXJ2ZSBleGlzdGluZyByZXJ1biBidXR0b24gbWFya3VwLCB1cGRhdGUgdGV4dCArIGJhZGdlXG4gICAgY29uc3QgcmVydW5IdG1sID0gZWwucXVlcnlTZWxlY3RvcignLnN0ZXAtcmVydW4nKT8ub3V0ZXJIVE1MIHx8ICcnO1xuICAgIGNvbnN0IGxhYmVsICAgICA9IF9TVEVQX0RJU1BMQVlbc3RlcF0gfHwgc3RlcDtcbiAgICBjb25zdCBiYWRnZSAgICAgPSBpc0RpcnR5XG4gICAgICA/ICcgPHNwYW4gY2xhc3M9XCJzdGVwLWlubGluZS1iYWRnZSBzdGVwLXN0YWxlLWJhZGdlXCI+Q29udGVudCBjaGFuZ2VkPC9zcGFuPidcbiAgICAgIDogJyc7XG4gICAgZWwuaW5uZXJIVE1MID0gYCR7bGFiZWx9JHtiYWRnZX0ke3JlcnVuSHRtbCA/IGAgJHtyZXJ1bkh0bWx9YCA6ICcnfWA7XG4gIH0pO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgU3RlcCBuYXZpZ2F0aW9uIGhlbHBlciBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gX2RvU3RlcE5hdmlnYXRlKHN0ZXApIHtcbiAgY29uc3Qgc3RlcFRvVGFiID0ge1xuICAgIGFuYWx5c2lzOiAgICAgICAnYW5hbHlzaXMnLFxuICAgIGN1c3RvbWl6YXRpb25zOiAnZ29hbHMnLFxuICAgIHJld3JpdGU6ICAgICAgICAncmV3cml0ZScsXG4gICAgc3BlbGw6ICAgICAgICAgICdzcGVsbCcsXG4gICAgbGF5b3V0OiAgICAgICAgICdsYXlvdXQnLFxuICAgIGRvd25sb2FkOiAgICAgICAnZmluYWxfZ2VuZXJhdGUnLFxuICAgIGNvdmVyX2xldHRlcjogICAnY292ZXItbGV0dGVyJyxcbiAgICBzY3JlZW5pbmc6ICAgICAgJ3NjcmVlbmluZycsXG4gICAgaW50ZXJ2aWV3X3ByZXA6ICdpbnRlcnZpZXctcHJlcCcsXG4gICAgdGhhbmtfeW91OiAgICAgICd0aGFuay15b3UnLFxuICAgIGhhcnZlc3Q6ICAgICAgICAnaGFydmVzdCcsXG4gIH07XG4gIGNvbnN0IHRhYk5hbWUgPSBzdGVwVG9UYWJbc3RlcF07XG4gIGlmICghdGFiTmFtZSkgcmV0dXJuO1xuICBpZiAodHlwZW9mIHVwZGF0ZVRhYkJhckZvclN0YWdlID09PSAnZnVuY3Rpb24nKSB1cGRhdGVUYWJCYXJGb3JTdGFnZShzdGVwKTtcbiAgc3dpdGNoVGFiKHRhYk5hbWUpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgU3RlcCBjbGljayAoYmFjay1uYXYpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4vLyBCYWNrLW5hdmlnYXRpb246IGNsaWNraW5nIGEgY29tcGxldGVkIHdvcmtmbG93IHN0ZXAgbmF2aWdhdGVzIHRvIGl0cyB2aWV3ZXIgdGFiLlxuLy8gQ2xpY2tpbmcgdGhlIGpvYiBzdGVwIGFsd2F5cyBvcGVucyB0aGUgbG9hZC1qb2IgcGFuZWwuXG5mdW5jdGlvbiBoYW5kbGVTdGVwQ2xpY2soc3RlcCkge1xuICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzdGVwLSR7c3RlcH1gKTtcbiAgaWYgKCFlbCkgcmV0dXJuO1xuXG4gIC8vIEpvYiBzdGVwOiBzaG93IGpvYiBjb250ZW50IGlmIGEgam9iIGlzIGxvYWRlZCwgb3RoZXJ3aXNlIG9wZW4gdGhlIGxvYWQgcGFuZWwuXG4gIGlmIChzdGVwID09PSAnam9iJykge1xuICAgIGlmIChlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2NvbXBsZXRlZCcpIHx8IGVsLmNsYXNzTGlzdC5jb250YWlucygnYWN0aXZlJykpIHtcbiAgICAgIHN3aXRjaFRhYignam9iJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3dMb2FkSm9iUGFuZWwoKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gRm9yd2FyZC1za2lwOiBwcmV2aW91c2x5IHJlYWNoZWQgc3RhZ2UgdGhhdCBpcyBhaGVhZCBvZiBjdXJyZW50IHBoYXNlLlxuICBpZiAoZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdmb3J3YXJkLXNraXAnKSkge1xuICAgIGNvbnN0IGxhYmVsID0gX1NURVBfRElTUExBWVtzdGVwXSB8fCBzdGVwO1xuICAgIGlmICh0eXBlb2YgY29uZmlybURpYWxvZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29uZmlybURpYWxvZyhcbiAgICAgICAgYEp1bXAgYWhlYWQgdG8gJHtsYWJlbH0/XFxuXFxuSW50ZXJtZWRpYXRlIHN0YWdlcyBtYXkgbmVlZCByZS1ydW5uaW5nIGlmIHlvdSBtYWtlIGNoYW5nZXMgaGVyZS5gLFxuICAgICAgICB7IGNvbmZpcm1MYWJlbDogJ0p1bXAgYWhlYWQnLCBjYW5jZWxMYWJlbDogJ1N0YXkgaGVyZScgfVxuICAgICAgKS50aGVuKGNvbmZpcm1lZCA9PiB7IGlmIChjb25maXJtZWQpIF9kb1N0ZXBOYXZpZ2F0ZShzdGVwKTsgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIF9kb1N0ZXBOYXZpZ2F0ZShzdGVwKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gT25seSBuYXZpZ2F0ZSBpZiB0aGUgc3RlcCBpcyBjb21wbGV0ZWQgKGJhY2stbmF2KSBvciBhY3RpdmUuXG4gIGlmICghZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdjb21wbGV0ZWQnKSAmJiAhZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdhY3RpdmUnKSkgcmV0dXJuO1xuXG4gIGNvbnN0IGhhc1VuYW5zd2VyZWRQb3N0QW5hbHlzaXNRdWVzdGlvbnMgPSAoKSA9PiB7XG4gICAgY29uc3QgcXMgPSBBcnJheS5pc0FycmF5KHdpbmRvdy5wb3N0QW5hbHlzaXNRdWVzdGlvbnMpID8gd2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucyA6IFtdO1xuICAgIGlmIChxcy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBhbnN3ZXJzID0gKHdpbmRvdy5xdWVzdGlvbkFuc3dlcnMgJiYgdHlwZW9mIHdpbmRvdy5xdWVzdGlvbkFuc3dlcnMgPT09ICdvYmplY3QnKVxuICAgICAgPyB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzXG4gICAgICA6IHt9O1xuICAgIHJldHVybiBxcy5zb21lKHEgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBhbnN3ZXJzW3EudHlwZV07XG4gICAgICByZXR1cm4gIXZhbHVlIHx8ICFTdHJpbmcodmFsdWUpLnRyaW0oKTtcbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCBzdGVwVG9UYWIgPSB7XG4gICAgYW5hbHlzaXM6ICAgICAgIGhhc1VuYW5zd2VyZWRQb3N0QW5hbHlzaXNRdWVzdGlvbnMoKSA/ICdxdWVzdGlvbnMnIDogJ2FuYWx5c2lzJyxcbiAgICBjdXN0b21pemF0aW9uczogJ2dvYWxzJyxcbiAgICByZXdyaXRlOiAgICAgICAgJ3Jld3JpdGUnLFxuICAgIHNwZWxsOiAgICAgICAgICAnc3BlbGwnLFxuICAgIGxheW91dDogICAgICAgICAnbGF5b3V0JyxcbiAgICBkb3dubG9hZDogICAgICAgJ2ZpbmFsX2dlbmVyYXRlJyxcbiAgICBjb3Zlcl9sZXR0ZXI6ICAgJ2NvdmVyLWxldHRlcicsXG4gICAgc2NyZWVuaW5nOiAgICAgICdzY3JlZW5pbmcnLFxuICAgIGludGVydmlld19wcmVwOiAnaW50ZXJ2aWV3LXByZXAnLFxuICAgIHRoYW5rX3lvdTogICAgICAndGhhbmsteW91JyxcbiAgICBoYXJ2ZXN0OiAgICAgICAgJ2hhcnZlc3QnLFxuICB9O1xuICBjb25zdCB0YWJOYW1lID0gc3RlcFRvVGFiW3N0ZXBdO1xuICBpZiAoIXRhYk5hbWUpIHJldHVybjtcblxuICBjb25zdCBkb05hdmlnYXRlID0gKCkgPT4ge1xuICAgIGlmICh0eXBlb2YgdXBkYXRlVGFiQmFyRm9yU3RhZ2UgPT09ICdmdW5jdGlvbicpIHVwZGF0ZVRhYkJhckZvclN0YWdlKHN0ZXApO1xuICAgIHN3aXRjaFRhYih0YWJOYW1lKTtcbiAgfTtcblxuICAvLyBTaG93IGEgZG93bnN0cmVhbS1hd2FyZW5lc3MgZGlhbG9nIHdoZW4gYmFjay1uYXZpZ2F0aW5nIHRvIGEgY29tcGxldGVkIHN0ZXBcbiAgLy8gdGhhdCBoYXMgZG93bnN0cmVhbSBjb21wbGV0ZWQgc3RlcHMgKG5vdCB3aGVuIHRoZSBzdGVwIGlzIGFjdGl2ZSkuXG4gIGlmIChlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2NvbXBsZXRlZCcpICYmICFlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2FjdGl2ZScpKSB7XG4gICAgY29uc3Qgc3RlcElkeCA9IF9TVEVQX09SREVSLmluZGV4T2Yoc3RlcCk7XG4gICAgY29uc3QgaGFzRG93bnN0cmVhbUNvbXBsZXRlZCA9IF9TVEVQX09SREVSLnNsaWNlKHN0ZXBJZHggKyAxKS5zb21lKHMgPT4ge1xuICAgICAgY29uc3QgZG93bnN0cmVhbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzdGVwLSR7c31gKTtcbiAgICAgIHJldHVybiBkb3duc3RyZWFtICYmIGRvd25zdHJlYW0uY2xhc3NMaXN0LmNvbnRhaW5zKCdjb21wbGV0ZWQnKTtcbiAgICB9KTtcbiAgICBpZiAoaGFzRG93bnN0cmVhbUNvbXBsZXRlZCkge1xuICAgICAgX3Nob3dSZVJ1bkNvbmZpcm1Nb2RhbChzdGVwLCAnYmFjay1uYXYnLCBkb05hdmlnYXRlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBkb05hdmlnYXRlKCk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFeHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5leHBvcnQge1xuICBfU1RFUF9PUkRFUixcbiAgX1NURVBfRElTUExBWSxcbiAgYmFja1RvUGhhc2UsXG4gIF9zaG93UmVSdW5Db25maXJtTW9kYWwsXG4gIF9zaG93QW5hbHlzaXNDbGFyaWZpY2F0aW9uQW1lbmRNb2RhbCxcbiAgY29uZmlybVJlUnVuUGhhc2UsXG4gIHJlUnVuUGhhc2UsXG4gIF9leGVjdXRlUmVSdW5QaGFzZSxcbiAgX2dldFN0ZXBUb29sdGlwLFxuICBfdXBkYXRlVmlld2luZ0luZGljYXRvcixcbiAgX2hpZ2hsaWdodENoYW5nZWRJdGVtcyxcbiAgX21hcmtDaGFuZ2VkLFxuICBhcHBseUxheW91dEZyZXNobmVzc05hdmlnYXRpb25TdGF0ZSxcbiAgYXBwbHlEaXJ0eVBoYXNlTmF2aWdhdGlvblN0YXRlLFxuICBzaG93QnVsbGV0UmVvcmRlcixcbiAgX2FwcGx5QnVsbGV0T3JkZXIsXG4gIG1vdmVCdWxsZXQsXG4gIF91cGRhdGVCdWxsZXRBcnJvd3MsXG4gIHNhdmVCdWxsZXRPcmRlcixcbiAgcmVzZXRCdWxsZXRPcmRlcixcbiAgdXBkYXRlV29ya2Zsb3dTdGVwcyxcbiAgaGFuZGxlU3RlcENsaWNrLFxuICBfQUNUSU9OX0xBQkVMUyxcbn07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIGxheW91dC1pbnN0cnVjdGlvbi5qc1xuICogRnJvbnRlbmQgVUkgZm9yIG5hdHVyYWwtbGFuZ3VhZ2UgbGF5b3V0IGluc3RydWN0aW9uIHdvcmtmbG93LlxuICogSGFuZGxlcyBpbnN0cnVjdGlvbiBzdWJtaXNzaW9uLCBwcmV2aWV3IHVwZGF0ZXMsIGFuZCBpbnN0cnVjdGlvbiBoaXN0b3J5LlxuICovXG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmNvbnN0IGxvZyA9IGdldExvZ2dlcignbGF5b3V0LWluc3RydWN0aW9uJyk7XG5cbmltcG9ydCB7IGFwaUNhbGwgfSBmcm9tICcuL2FwaS1jbGllbnQuanMnO1xuaW1wb3J0IHsgc2NoZWR1bGVBdHNSZWZyZXNoIH0gZnJvbSAnLi9hdHMtcmVmaW5lbWVudC5qcyc7XG5pbXBvcnQgeyBhcHBlbmRNZXNzYWdlLCBhcHBlbmRNZXNzYWdlSHRtbCB9IGZyb20gJy4vbWVzc2FnZS1xdWV1ZS5qcyc7XG5pbXBvcnQgeyBzd2l0Y2hUYWIgfSBmcm9tICcuL3Jldmlldy10YWJsZS1iYXNlLmpzJztcbmltcG9ydCB7IHN0YXRlTWFuYWdlciwgR0VORVJBVElPTl9TVEFURV9FVkVOVCwgR0VORVJBVElPTl9QSEFTRVMgfSBmcm9tICcuL3N0YXRlLW1hbmFnZXIuanMnO1xuaW1wb3J0IHsgZXNjYXBlSHRtbCB9IGZyb20gJy4vdXRpbHMuanMnO1xuaW1wb3J0IHsgY29uZmlybVJlUnVuUGhhc2UgfSBmcm9tICcuL3dvcmtmbG93LXN0ZXBzLmpzJztcblxubGV0IGRpc21pc3NlZFN0YWxlQ2FsbG91dFJldmlzaW9uID0gbnVsbDtcblxuLyoqXG4gKiBDb252ZXJ0IGEgQ1NTIHBpeGVsIHZhbHVlIHRvIGl0cyB0eXBvZ3JhcGhpYyBwb2ludCBlcXVpdmFsZW50LlxuICogQXNzdW1lcyB0aGUgc3RhbmRhcmQgc2NyZWVuIHJlc29sdXRpb24gY29udmVudGlvbjogOTYgcHgvaW4sIDcyIHB0L2luLFxuICogc28gMXB4ID0gMC43NSBwdC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBweFxuICogQHJldHVybnMge251bWJlcn0gcHQgdmFsdWUgcm91bmRlZCB0byBvbmUgZGVjaW1hbCBwbGFjZVxuICovXG5leHBvcnQgZnVuY3Rpb24gcHhUb1B0KHB4KSB7XG4gIHJldHVybiBNYXRoLnJvdW5kKHB4ICogMC43NSAqIDEwKSAvIDEwO1xufVxuXG5mdW5jdGlvbiBjb2VyY2VCb29sZWFuKHZhbHVlLCBkZWZhdWx0VmFsdWUgPSBmYWxzZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHJldHVybiB2YWx1ZTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCBub3JtYWxpemVkID0gdmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKFsnMScsICd0cnVlJywgJ3llcycsICdvbiddLmluY2x1ZGVzKG5vcm1hbGl6ZWQpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoWycwJywgJ2ZhbHNlJywgJ25vJywgJ29mZiddLmluY2x1ZGVzKG5vcm1hbGl6ZWQpKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gIHJldHVybiBCb29sZWFuKHZhbHVlKTtcbn1cblxuLy8gVW5kbyBzdGFjayBcdTIwMTQgZWFjaCBlbnRyeSBpcyB7IGh0bWwsIGluc3RydWN0aW9ucyB9IHNuYXBzaG90dGVkIGJlZm9yZSBhXG4vLyBsYXlvdXQgaW5zdHJ1Y3Rpb24gaXMgYXBwbGllZC4gIENhcCBhdCAyMCBlbnRyaWVzIHRvIGJvdW5kIG1lbW9yeS5cbmNvbnN0IF9sYXlvdXRVbmRvU3RhY2sgPSBbXTtcbmNvbnN0IF9VTkRPX1NUQUNLX01BWCA9IDIwO1xuXG5mdW5jdGlvbiBnZXRDdkFydGlmYWN0cygpIHtcbiAgcmV0dXJuIHN0YXRlTWFuYWdlci5nZXRUYWJEYXRhKCdjdicpIHx8IHt9O1xufVxuXG5mdW5jdGlvbiB1cGRhdGVDdkFydGlmYWN0cyhuZXh0Q3ZBcnRpZmFjdHMpIHtcbiAgc3RhdGVNYW5hZ2VyLnNldFRhYkRhdGEoJ2N2JywgbmV4dEN2QXJ0aWZhY3RzKTtcbn1cblxuZnVuY3Rpb24gc2V0UHJldmlld0h0bWwoaHRtbCkge1xuICB1cGRhdGVDdkFydGlmYWN0cyh7IC4uLmdldEN2QXJ0aWZhY3RzKCksICcqLmh0bWwnOiBodG1sIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRQcmV2aWV3T3V0cHV0cygpIHtcbiAgcmV0dXJuIHN0YXRlTWFuYWdlcj8uZ2V0R2VuZXJhdGlvblN0YXRlPy4oKT8ucHJldmlld091dHB1dHMgfHwgbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0UHJldmlld091dHB1dFVybChyZW5kZXJlcikge1xuICBjb25zdCBzZXNzaW9uSWQgPSBzdGF0ZU1hbmFnZXI/LmdldFNlc3Npb25JZD8uKCk7XG4gIGNvbnN0IHN1ZmZpeCA9IHNlc3Npb25JZFxuICAgID8gYD9zZXNzaW9uX2lkPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHNlc3Npb25JZCl9YFxuICAgIDogJyc7XG4gIHJldHVybiBgL2FwaS9jdi9wcmV2aWV3LW91dHB1dC8ke2VuY29kZVVSSUNvbXBvbmVudChyZW5kZXJlcil9JHtzdWZmaXh9YDtcbn1cblxuZnVuY3Rpb24gcmVuZGVyUHJldmlld091dHB1dFN0YXR1cyhwcmV2aWV3T3V0cHV0cyA9IG51bGwpIHtcbiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ByZXZpZXctb3V0cHV0LXN0YXR1cycpO1xuICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuO1xuXG4gIGNvbnN0IHBkZnMgPSBwcmV2aWV3T3V0cHV0cz8ucGRmcyB8fCB7fTtcbiAgY29uc3QgcmVuZGVyZXJPcmRlciA9IFsnY2hyb21lJywgJ3dlYXN5cHJpbnQnXTtcbiAgY29uc3QgYXZhaWxhYmxlUmVuZGVyZXJzID0gcmVuZGVyZXJPcmRlci5maWx0ZXIoKHJlbmRlcmVyS2V5KSA9PiByZW5kZXJlcktleSBpbiBwZGZzKTtcblxuICBpZiAoYXZhaWxhYmxlUmVuZGVyZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBgXG4gICAgICA8ZGl2IGNsYXNzPVwicHJldmlldy1vdXRwdXQtZW1wdHlcIj5cbiAgICAgICAgUHJldmlldyBQREZzIHdpbGwgYXBwZWFyIGhlcmUgYWZ0ZXIgdGhlIGN1cnJlbnQgbGF5b3V0IGlzIHJlbmRlcmVkLlxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCByZW5kZXJlckxhYmVscyA9IHtcbiAgICBjaHJvbWU6ICdDaHJvbWUnLFxuICAgIHdlYXN5cHJpbnQ6ICdXZWFzeVByaW50JyxcbiAgfTtcblxuICBjb250YWluZXIuaW5uZXJIVE1MID0gYXZhaWxhYmxlUmVuZGVyZXJzLm1hcCgocmVuZGVyZXJLZXkpID0+IHtcbiAgICBjb25zdCByZW5kZXJlciA9IHBkZnNbcmVuZGVyZXJLZXldIHx8IHt9O1xuICAgIGNvbnN0IG9rID0gQm9vbGVhbihyZW5kZXJlci5vayk7XG4gICAgY29uc3QgZGV0YWlsID0gcmVuZGVyZXIucmVuZGVyZXJfZGV0YWlsIHx8IHJlbmRlcmVyLmVycm9yIHx8ICdObyBkZXRhaWwgYXZhaWxhYmxlJztcbiAgICBjb25zdCByZW5kZXJlckxhYmVsID0gcmVuZGVyZXJMYWJlbHNbcmVuZGVyZXJLZXldIHx8IHJlbmRlcmVyS2V5O1xuICAgIGNvbnN0IGJhZGdlTWFya3VwID0gb2tcbiAgICAgID8gYDxhIGNsYXNzPVwicHJldmlldy1vdXRwdXQtYmFkZ2UgcHJldmlldy1vdXRwdXQtYmFkZ2UtbGluayBpcy1yZWFkeVwiIGhyZWY9XCIke2dldFByZXZpZXdPdXRwdXRVcmwocmVuZGVyZXJLZXkpfVwiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyXCI+JHtyZW5kZXJlckxhYmVsfSBSZWFkeTwvYT5gXG4gICAgICA6IGA8c3BhbiBjbGFzcz1cInByZXZpZXctb3V0cHV0LWJhZGdlIGlzLWZhaWxlZFwiPiR7cmVuZGVyZXJMYWJlbH0gRmFpbGVkPC9zcGFuPmA7XG5cbiAgICByZXR1cm4gYFxuICAgICAgPGRpdiBjbGFzcz1cInByZXZpZXctb3V0cHV0LXJvdyAke29rID8gJ2lzLXJlYWR5JyA6ICdpcy1mYWlsZWQnfVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHJldmlldy1vdXRwdXQtY29weVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcmV2aWV3LW91dHB1dC10aXRsZS1yb3dcIj5cbiAgICAgICAgICAgICR7YmFkZ2VNYXJrdXB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInByZXZpZXctb3V0cHV0LWRldGFpbFwiPiR7ZXNjYXBlSHRtbChkZXRhaWwpfTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIGA7XG4gIH0pLmpvaW4oJycpO1xufVxuXG5mdW5jdGlvbiBhcHBlbmRMYXlvdXRTYWZldHlBbGVydChzYWZldHlBbGVydCkge1xuICBpZiAoIXNhZmV0eUFsZXJ0Py5mbGFnZ2VkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgaXNzdWVzID0gKHNhZmV0eUFsZXJ0Lmlzc3VlcyB8fCBbXSlcbiAgICAubWFwKGlzc3VlID0+IHtcbiAgICAgIGNvbnN0IHRleHQgPSB0eXBlb2YgaXNzdWUgPT09ICdzdHJpbmcnXG4gICAgICAgID8gaXNzdWVcbiAgICAgICAgOiAoaXNzdWU/LmRldGFpbCB8fCBpc3N1ZT8uaXNzdWUgfHwgSlNPTi5zdHJpbmdpZnkoaXNzdWUpKTtcbiAgICAgIHJldHVybiBgPGxpPiR7ZXNjYXBlSHRtbCh0ZXh0KX08L2xpPmA7XG4gICAgfSlcbiAgICAuam9pbignJyk7XG5cbiAgYXBwZW5kTWVzc2FnZUh0bWwoXG4gICAgJ3N5c3RlbScsXG4gICAgYDxzdHJvbmc+XHUyNkEwXHVGRTBGIExheW91dCBzYWZldHkgc2FuaXRpemF0aW9uIGFwcGxpZWQuPC9zdHJvbmc+PGJyPiR7ZXNjYXBlSHRtbChzYWZldHlBbGVydC5tZXNzYWdlIHx8ICdQb3RlbnRpYWwgcHJvbXB0IHBheWxvYWRzIG9yIHVuc2FmZSBIVE1MIHdlcmUgcmVtb3ZlZCBiZWZvcmUgYXBwbHlpbmcgdGhlIGNoYW5nZS4nKX08YnI+PHVsIHN0eWxlPVwibWFyZ2luOjZweCAwIDAgMThweFwiPiR7aXNzdWVzfTwvdWw+YCxcbiAgKTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTGF5b3V0SW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb24gPSB7fSkge1xuICByZXR1cm4ge1xuICAgIHRpbWVzdGFtcDogaW5zdHJ1Y3Rpb24udGltZXN0YW1wIHx8ICcnLFxuICAgIGluc3RydWN0aW9uX3RleHQ6IGluc3RydWN0aW9uLmluc3RydWN0aW9uX3RleHQgfHwgaW5zdHJ1Y3Rpb24uaW5zdHJ1Y3Rpb24gfHwgJycsXG4gICAgY2hhbmdlX3N1bW1hcnk6IGluc3RydWN0aW9uLmNoYW5nZV9zdW1tYXJ5IHx8IGluc3RydWN0aW9uLnN1bW1hcnkgfHwgJycsXG4gICAgY29uZmlybWF0aW9uOiBpbnN0cnVjdGlvbi5jb25maXJtYXRpb24gIT09IGZhbHNlLFxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRDdXJyZW50Q29udGVudFJldmlzaW9uKCkge1xuICByZXR1cm4gc3RhdGVNYW5hZ2VyLmdldEdlbmVyYXRpb25TdGF0ZSgpLmNvbnRlbnRSZXZpc2lvbiA/PyAwO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRHZW5lcmF0aW9uVGltZXN0YW1wKHRpbWVzdGFtcCkge1xuICBpZiAoIXRpbWVzdGFtcCkgcmV0dXJuICcnO1xuICBjb25zdCBwYXJzZWQgPSBuZXcgRGF0ZSh0aW1lc3RhbXApO1xuICBpZiAoTnVtYmVyLmlzTmFOKHBhcnNlZC5nZXRUaW1lKCkpKSByZXR1cm4gJyc7XG4gIHJldHVybiBwYXJzZWQudG9Mb2NhbGVTdHJpbmcoW10sIHsgbW9udGg6ICdzaG9ydCcsIGRheTogJ251bWVyaWMnLCBob3VyOiAnbnVtZXJpYycsIG1pbnV0ZTogJzItZGlnaXQnIH0pO1xufVxuXG5mdW5jdGlvbiBidWlsZExheW91dEZyZXNobmVzc0NoaXBNYXJrdXAoZnJlc2huZXNzKSB7XG4gIGlmICghZnJlc2huZXNzPy5zaG93Q2hpcCkgcmV0dXJuICcnO1xuICBjb25zdCBpY29uID0gZnJlc2huZXNzLmlzQ3JpdGljYWwgPyAnXHUyMUJCJyA6IChmcmVzaG5lc3MuaXNTdGFsZSA/ICchJyA6ICdcdTI3MTMnKTtcbiAgcmV0dXJuIGA8c3BhbiBjbGFzcz1cImxheW91dC1mcmVzaG5lc3MtY2hpcCAke2ZyZXNobmVzcy50b25lfSBsYXlvdXQtcGFuZS1mcmVzaG5lc3MtY2hpcFwiXG4gICAgYXJpYS1sYWJlbD1cIiR7ZXNjYXBlSHRtbChmcmVzaG5lc3MuYXJpYUxhYmVsIHx8ICcnKX1cIj5cbiAgICA8c3BhbiBjbGFzcz1cImxheW91dC1mcmVzaG5lc3MtaWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiR7aWNvbn08L3NwYW4+XG4gICAgPHNwYW4gY2xhc3M9XCJsYXlvdXQtZnJlc2huZXNzLWxhYmVsXCI+JHtlc2NhcGVIdG1sKGZyZXNobmVzcy5sYWJlbCB8fCAnJyl9PC9zcGFuPlxuICA8L3NwYW4+YDtcbn1cblxuZnVuY3Rpb24gcmVuZGVyTGF5b3V0UHJldmlld1N0YXR1cygpIHtcbiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xheW91dC1wcmV2aWV3LXN0YXR1cycpO1xuICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuO1xuICBjb25zdCBmcmVzaG5lc3MgPSBzdGF0ZU1hbmFnZXIuZ2V0TGF5b3V0RnJlc2huZXNzKCk7XG4gIGNvbnN0IGdlbmVyYXRpb25TdGF0ZSA9IHN0YXRlTWFuYWdlci5nZXRHZW5lcmF0aW9uU3RhdGUoKTtcbiAgaWYgKCFnZW5lcmF0aW9uU3RhdGUucHJldmlld0F2YWlsYWJsZSkge1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcbiAgICBjb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgbGFzdFByZXZpZXdSZXZpc2lvbiA9IE51bWJlci5pc0Zpbml0ZShnZW5lcmF0aW9uU3RhdGUubGFzdFByZXZpZXdDb250ZW50UmV2aXNpb24pXG4gICAgPyBnZW5lcmF0aW9uU3RhdGUubGFzdFByZXZpZXdDb250ZW50UmV2aXNpb24gOiBudWxsO1xuICBjb25zdCBjdXJyZW50UmV2aXNpb24gPSBOdW1iZXIuaXNGaW5pdGUoZ2VuZXJhdGlvblN0YXRlLmNvbnRlbnRSZXZpc2lvbilcbiAgICA/IGdlbmVyYXRpb25TdGF0ZS5jb250ZW50UmV2aXNpb24gOiBudWxsO1xuICBjb25zdCBwZW5kaW5nUmV2aXNpb25Db3VudCA9IGxhc3RQcmV2aWV3UmV2aXNpb24gIT09IG51bGwgJiYgY3VycmVudFJldmlzaW9uICE9PSBudWxsXG4gICAgPyBNYXRoLm1heCgwLCBjdXJyZW50UmV2aXNpb24gLSBsYXN0UHJldmlld1JldmlzaW9uKSA6IDA7XG4gIGNvbnN0IHRpbWVzdGFtcExhYmVsID0gZm9ybWF0R2VuZXJhdGlvblRpbWVzdGFtcChnZW5lcmF0aW9uU3RhdGUucHJldmlld0dlbmVyYXRlZEF0KTtcbiAgY29uc3QgZGV0YWlsTGluZXMgPSBbXTtcbiAgaWYgKHRpbWVzdGFtcExhYmVsKSBkZXRhaWxMaW5lcy5wdXNoKGBQcmV2aWV3IGdlbmVyYXRlZCAke3RpbWVzdGFtcExhYmVsfWApO1xuICBpZiAoZ2VuZXJhdGlvblN0YXRlLmxheW91dENvbmZpcm1lZCAmJiBnZW5lcmF0aW9uU3RhdGUuY29uZmlybWVkQXQpIHtcbiAgICBjb25zdCBjb25maXJtZWRMYWJlbCA9IGZvcm1hdEdlbmVyYXRpb25UaW1lc3RhbXAoZ2VuZXJhdGlvblN0YXRlLmNvbmZpcm1lZEF0KTtcbiAgICBpZiAoY29uZmlybWVkTGFiZWwpIGRldGFpbExpbmVzLnB1c2goYExheW91dCBjb25maXJtZWQgJHtjb25maXJtZWRMYWJlbH1gKTtcbiAgfVxuICBpZiAoZnJlc2huZXNzLmlzU3RhbGUpIHtcbiAgICBpZiAocGVuZGluZ1JldmlzaW9uQ291bnQgPiAwKSB7XG4gICAgICBkZXRhaWxMaW5lcy5wdXNoKGAke3BlbmRpbmdSZXZpc2lvbkNvdW50fSBjb250ZW50IGNoYW5nZSR7cGVuZGluZ1JldmlzaW9uQ291bnQgPT09IDEgPyAnJyA6ICdzJ30gc2luY2UgdGhpcyBwcmV2aWV3YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRldGFpbExpbmVzLnB1c2goJ0NvbnRlbnQgY2hhbmdlZCBhZnRlciB0aGlzIHByZXZpZXcgd2FzIGdlbmVyYXRlZCcpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChnZW5lcmF0aW9uU3RhdGUubGF5b3V0Q29uZmlybWVkIHx8IGdlbmVyYXRpb25TdGF0ZS5waGFzZSA9PT0gJ2NvbmZpcm1lZCcpIHtcbiAgICBkZXRhaWxMaW5lcy5wdXNoKCdDb25maXJtZWQgcHJldmlldyBtYXRjaGVzIHRoZSBsYXRlc3QgYXBwcm92ZWQgY29udGVudCcpO1xuICB9IGVsc2Uge1xuICAgIGRldGFpbExpbmVzLnB1c2goJ1ByZXZpZXcgbWF0Y2hlcyB0aGUgbGF0ZXN0IGFwcHJvdmVkIGNvbnRlbnQnKTtcbiAgfVxuICBjb25zdCBzdGFnZUxhYmVsID0gZ2VuZXJhdGlvblN0YXRlLmxheW91dENvbmZpcm1lZCB8fCBnZW5lcmF0aW9uU3RhdGUucGhhc2UgPT09ICdjb25maXJtZWQnXG4gICAgPyAnUmVhZHkgZm9yIGZpbmFsIGZpbGVzJyA6ICdSZWFkeSBmb3IgbGF5b3V0IHJldmlldyc7XG4gIC8vIFBhZ2UgY291bnQgYmFkZ2U6IHNob3duIHdoZW4gYSBwYWdlIGNvdW50IGlzIGF2YWlsYWJsZSBmcm9tIHRoZSBwcmV2aWV3XG4gIGNvbnN0IHBjID0gZ2VuZXJhdGlvblN0YXRlLnBhZ2VDb3VudEV4YWN0ID8/IGdlbmVyYXRpb25TdGF0ZS5wYWdlQ291bnRFc3RpbWF0ZTtcbiAgbGV0IHBhZ2VDb3VudEJhZGdlID0gJyc7XG4gIGlmIChwYyAhPT0gbnVsbCAmJiBwYyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgcGNMYWJlbCAgPSBnZW5lcmF0aW9uU3RhdGUucGFnZUNvdW50RXhhY3QgIT09IG51bGwgPyBgJHtwY30gcGFnZSR7cGMgIT09IDEgPyAncycgOiAnJ31gIDogYH4ke3BjfSBwYWdlJHtwYyAhPT0gMSA/ICdzJyA6ICcnfWA7XG4gICAgY29uc3QgcGNXYXJuICAgPSBnZW5lcmF0aW9uU3RhdGUucGFnZVdhcm5pbmc7XG4gICAgcGFnZUNvdW50QmFkZ2UgPSBgPHNwYW4gY2xhc3M9XCJsYXlvdXQtcGFnZS1jb3VudC1iYWRnZSR7cGNXYXJuID8gJyB3YXJuJyA6ICcnfVwiIHRpdGxlPVwiJHtwY1dhcm4gPyAnUGFnZSBjb3VudCBvdXRzaWRlIHJlY29tbWVuZGVkIHJhbmdlJyA6ICdQYWdlIGNvdW50IHdpdGhpbiByYW5nZSd9XCI+JHtwY1dhcm4gPyAnXHUyNkEwICcgOiAnXHVEODNEXHVEQ0M0ICd9JHtlc2NhcGVIdG1sKHBjTGFiZWwpfTwvc3Bhbj5gO1xuICB9XG4gIGNvbnRhaW5lci5pbm5lckhUTUwgPSBgXG4gICAgPGRpdiBjbGFzcz1cImxheW91dC1wcmV2aWV3LXN0YXR1cy1jYXJkICR7ZnJlc2huZXNzLnRvbmV9XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibGF5b3V0LXByZXZpZXctc3RhdHVzLWhlYWRlclwiPlxuICAgICAgICAke2J1aWxkTGF5b3V0RnJlc2huZXNzQ2hpcE1hcmt1cChmcmVzaG5lc3MpfVxuICAgICAgICA8c3BhbiBjbGFzcz1cImxheW91dC1wcmV2aWV3LXN0YXR1cy1zdGFnZVwiPiR7ZXNjYXBlSHRtbChzdGFnZUxhYmVsKX08L3NwYW4+XG4gICAgICAgICR7cGFnZUNvdW50QmFkZ2V9XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJsYXlvdXQtcHJldmlldy1zdGF0dXMtZGV0YWlsc1wiPlxuICAgICAgICAke2RldGFpbExpbmVzLm1hcCgobGluZSkgPT4gYDxkaXY+JHtlc2NhcGVIdG1sKGxpbmUpfTwvZGl2PmApLmpvaW4oJycpfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+YDtcbiAgY29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xufVxuXG5mdW5jdGlvbiByZW5kZXJMYXlvdXRTdGFsZUNhbGxvdXQoKSB7XG4gIGNvbnN0IGNhbGxvdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGF5b3V0LXN0YWxlLWNhbGxvdXQnKTtcbiAgaWYgKCFjYWxsb3V0KSByZXR1cm47XG5cbiAgY29uc3QgZnJlc2huZXNzID0gc3RhdGVNYW5hZ2VyLmdldExheW91dEZyZXNobmVzcygpO1xuICBjb25zdCBjb250ZW50UmV2aXNpb24gPSBnZXRDdXJyZW50Q29udGVudFJldmlzaW9uKCk7XG4gIGNvbnN0IGlzRGlzbWlzc2VkID0gZGlzbWlzc2VkU3RhbGVDYWxsb3V0UmV2aXNpb24gPT09IGNvbnRlbnRSZXZpc2lvbjtcblxuICBpZiAoIWZyZXNobmVzcy5pc1N0YWxlIHx8IGlzRGlzbWlzc2VkKSB7XG4gICAgaWYgKCFmcmVzaG5lc3MuaXNTdGFsZSkgZGlzbWlzc2VkU3RhbGVDYWxsb3V0UmV2aXNpb24gPSBudWxsO1xuICAgIGNhbGxvdXQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICByZXR1cm47XG4gIH1cblxuICBjYWxsb3V0LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xufVxuXG5mdW5jdGlvbiByZWZyZXNoTGF5b3V0UmV2aWV3U3RhdGUoKSB7XG4gIGNvbnN0IGZyZXNobmVzcyA9IHN0YXRlTWFuYWdlci5nZXRMYXlvdXRGcmVzaG5lc3MoKTtcbiAgY29uc3QgZ2VuZXJhdGlvblN0YXRlID0gc3RhdGVNYW5hZ2VyLmdldEdlbmVyYXRpb25TdGF0ZSgpO1xuICBjb25zdCBjb25maXJtQnRuICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb25maXJtLWxheW91dC1idG4nKTtcbiAgY29uc3QgZmluYWxCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJvY2VlZC10by1maW5hbGlzZS1idG4nKTtcblxuICByZW5kZXJMYXlvdXRQcmV2aWV3U3RhdHVzKCk7XG4gIHJlbmRlckxheW91dFN0YWxlQ2FsbG91dCgpO1xuICByZW5kZXJEaXJ0eVBoYXNlc0NhbGxvdXQoKTtcblxuICBjb25zdCBkaXJ0eVBoYXNlcyA9IHN0YXRlTWFuYWdlci5nZXREaXJ0eVBoYXNlcygpO1xuICBjb25zdCBoYXNEaXJ0eSA9IGRpcnR5UGhhc2VzLmxlbmd0aCA+IDA7XG5cbiAgY29uc3Qgc2hvd0NvbmZpcm0gPSBnZW5lcmF0aW9uU3RhdGUucHJldmlld0F2YWlsYWJsZSAmJiAhZnJlc2huZXNzLmlzU3RhbGUgJiYgIWdlbmVyYXRpb25TdGF0ZS5sYXlvdXRDb25maXJtZWQgJiYgIWhhc0RpcnR5XG4gICAgPyAnYmxvY2snXG4gICAgOiAnbm9uZSc7XG5cbiAgaWYgKGNvbmZpcm1CdG4pICBjb25maXJtQnRuLnN0eWxlLmRpc3BsYXkgID0gc2hvd0NvbmZpcm07XG4gIGNvbnN0IGhpbnRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYXlvdXQtdHdvLXN0ZXAtaGludCcpO1xuICBpZiAoaGludEVsKSBoaW50RWwuc3R5bGUuZGlzcGxheSA9IHNob3dDb25maXJtO1xuXG4gIGlmIChmaW5hbEJ0bikge1xuICAgIGZpbmFsQnRuLnN0eWxlLmRpc3BsYXkgPSBnZW5lcmF0aW9uU3RhdGUucHJldmlld0F2YWlsYWJsZVxuICAgICAgJiYgIWZyZXNobmVzcy5pc1N0YWxlXG4gICAgICAmJiAhaGFzRGlydHlcbiAgICAgICYmIChnZW5lcmF0aW9uU3RhdGUubGF5b3V0Q29uZmlybWVkIHx8IGdlbmVyYXRpb25TdGF0ZS5waGFzZSA9PT0gJ2NvbmZpcm1lZCcpXG4gICAgICA/ICdibG9jaydcbiAgICAgIDogJ25vbmUnO1xuICB9XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBsYXlvdXQgaW5zdHJ1Y3Rpb24gVUkgYW5kIGV2ZW50IGhhbmRsZXJzLlxuICogQ2FsbGVkIHdoZW4gbGF5b3V0IHRhYiBpcyBhY3RpdmF0ZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGluaXRpYXRlTGF5b3V0SW5zdHJ1Y3Rpb25zKCkge1xuICBjb25zdCBpbnN0cnVjdGlvblRhYiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIGlmICghaW5zdHJ1Y3Rpb25UYWIpIHJldHVybjtcblxuICAvLyBDcmVhdGUgdHdvLWNvbHVtbiBsYXlvdXQgaWYgaXQgZG9lc24ndCBleGlzdFxuICBpZiAoIWluc3RydWN0aW9uVGFiLnF1ZXJ5U2VsZWN0b3IoJy5sYXlvdXQtaW5zdHJ1Y3Rpb24tcGFuZWwnKSkge1xuICAgIGluc3RydWN0aW9uVGFiLmlubmVySFRNTCA9IGBcbiAgICAgIDxkaXYgY2xhc3M9XCJsYXlvdXQtaW5zdHJ1Y3Rpb24tcGFuZWxcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxheW91dC1wcmV2aWV3LXBhbmVcIj5cbiAgICAgICAgICA8aDM+Q3VycmVudCBMYXlvdXQgUHJldmlldzwvaDM+XG4gICAgICAgICAgPGRpdiBpZD1cImxheW91dC1wcmV2aWV3LXN0YXR1c1wiIGNsYXNzPVwibGF5b3V0LXByZXZpZXctc3RhdHVzXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInByZXZpZXctaWZyYW1lLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGRpdiBpZD1cInByZXZpZXctbG9hZGluZy1vdmVybGF5XCIgY2xhc3M9XCJwcmV2aWV3LWxvYWRpbmctb3ZlcmxheVwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Bpbm5lclwiPjwvZGl2PlxuICAgICAgICAgICAgICA8cCBjbGFzcz1cInByZXZpZXctbG9hZGluZy1sYWJlbFwiPlJlbmRlcmluZyBwcmV2aWV3XHUyMDI2PC9wPlxuICAgICAgICAgICAgICA8cCBpZD1cInByZXZpZXctbG9hZGluZy1sb2dcIiBjbGFzcz1cInByZXZpZXctbG9hZGluZy1sb2dcIj48L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxpZnJhbWUgaWQ9XCJsYXlvdXQtcHJldmlld1wiIGNsYXNzPVwibGF5b3V0LXByZXZpZXctaWZyYW1lXCIgdGl0bGU9XCJDViBMYXlvdXQgUHJldmlld1wiIHNhbmRib3g9XCJhbGxvdy1zYW1lLW9yaWdpblwiIHJlZmVycmVycG9saWN5PVwibm8tcmVmZXJyZXJcIj48L2lmcmFtZT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxheW91dC1pbnB1dC1wYW5lXCI+XG4gICAgICAgICAgPGgzPkxheW91dCBSZXZpZXc8L2gzPlxuICAgICAgICAgIDxwIGNsYXNzPVwibGF5b3V0LXNjb3BlLWxhYmVsXCI+XHVEODNEXHVEQ0ExIERlc2NyaWJlIGEgbGF5b3V0IGNoYW5nZSAoc3BhY2luZywgbWFyZ2lucywgY29sdW1uIHdpZHRocywgc2VjdGlvbiBvcmRlcikuIFRleHQgY29udGVudCBpcyBmaW5hbGlzZWQgXHUyMDE0IGNvbnRlbnQgZWRpdHMgYXJlIG5vdCBhcHBsaWVkIGhlcmUuPC9wPlxuICAgICAgICAgIDxkaXYgaWQ9XCJsYXlvdXQtcGFnZS1lc3RpbWF0ZVwiIHN0eWxlPVwiZGlzcGxheTpub25lO21hcmdpbi1ib3R0b206MTBweDtcIj48L2Rpdj5cblxuICAgICAgICAgIDxkaXYgaWQ9XCJsYXlvdXQtc3RhbGUtY2FsbG91dFwiIGNsYXNzPVwibGF5b3V0LXN0YWxlLWNhbGxvdXRcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj5cbiAgICAgICAgICAgIDxoND5MYXlvdXQgcHJldmlldyBpcyBvdXQgb2YgZGF0ZTwvaDQ+XG4gICAgICAgICAgICA8cD5Zb3UgY2hhbmdlZCBDViBjb250ZW50IGFmdGVyIHRoZSBjdXJyZW50IHByZXZpZXcgd2FzIGdlbmVyYXRlZC4gUmVnZW5lcmF0ZSB0aGUgcHJldmlldyBiZWZvcmUgdHJ1c3RpbmcgcGFnZSBjb3VudCwgbGF5b3V0IGZlZWRiYWNrLCBvciBmaW5hbCBmaWxlcy48L3A+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGF5b3V0LXN0YWxlLWNhbGxvdXQtYWN0aW9uc1wiPlxuICAgICAgICAgICAgICA8YnV0dG9uIGlkPVwicmVnZW5lcmF0ZS1sYXlvdXQtcHJldmlldy1idG5cIiBjbGFzcz1cImJ0bi13YXJuaW5nIGxheW91dC1hY3Rpb24tYnRuXCI+UmVnZW5lcmF0ZSBwcmV2aWV3PC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b24gaWQ9XCJkaXNtaXNzLWxheW91dC1zdGFsZS1idG5cIiBjbGFzcz1cImJ0bi1zZWNvbmRhcnkgbGF5b3V0LWFjdGlvbi1idG5cIj5LZWVwIHJldmlld2luZyBjdXJyZW50IHByZXZpZXc8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInByZXZpZXctb3V0cHV0LWNhcmRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcmV2aWV3LW91dHB1dC1jYXJkLWhlYWRlclwiPlxuICAgICAgICAgICAgICA8aDQ+UHJldmlldyBQREZzPC9oND5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwcmV2aWV3LW91dHB1dC1jYXJkLW5vdGVcIj5DaHJvbWUgYW5kIFdlYXN5UHJpbnQgcmVuZGVyIGluIHBhcmFsbGVsPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGlkPVwicHJldmlldy1vdXRwdXQtc3RhdHVzXCIgY2xhc3M9XCJwcmV2aWV3LW91dHB1dC1zdGF0dXNcIj48L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYXlvdXQtc2V0dGluZ3Mtcm93XCIgc3R5bGU9XCJkaXNwbGF5OmZsZXg7IGZsZXgtd3JhcDp3cmFwOyBhbGlnbi1pdGVtczpjZW50ZXI7IGdhcDoxMHB4OyBtYXJnaW4tYm90dG9tOjE0cHg7IHBhZGRpbmc6OHB4IDEwcHg7IGJhY2tncm91bmQ6I2Y4ZmFmYzsgYm9yZGVyOjFweCBzb2xpZCAjZTJlOGYwOyBib3JkZXItcmFkaXVzOjZweDtcIj5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJiYXNlLWZvbnQtc2l6ZS1pbnB1dFwiIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTsgZm9udC13ZWlnaHQ6NjAwOyBjb2xvcjojNDc1NTY5OyB3aGl0ZS1zcGFjZTpub3dyYXA7XCI+QmFzZSBmb250IHNpemU6PC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBpZD1cImJhc2UtZm9udC1zaXplLWlucHV0XCJcbiAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgIG1pbj1cIjZcIiBtYXg9XCIxNlwiIHN0ZXA9XCIwLjVcIlxuICAgICAgICAgICAgICB2YWx1ZT1cIjEzXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDo2MHB4OyBwYWRkaW5nOjNweCA2cHg7IGJvcmRlcjoxcHggc29saWQgI2NiZDVlMTsgYm9yZGVyLXJhZGl1czo0cHg7IGZvbnQtc2l6ZTowLjllbTtcIlxuICAgICAgICAgICAgICB0aXRsZT1cIkNvbnRyb2xzIHRoZSByb290IGZvbnQgc2l6ZSBmb3IgdGhlIENWLiBBbGwgcmVtLWJhc2VkIHNpemVzIHNjYWxlIHdpdGggdGhpcyB2YWx1ZS5cIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxzcGFuIGlkPVwiZm9udC1zaXplLXB0LWRpc3BsYXlcIiBzdHlsZT1cImZvbnQtc2l6ZTowLjgyZW07IGNvbG9yOiM2NDc0OGI7IHdoaXRlLXNwYWNlOm5vd3JhcDtcIj5weCZuYnNwOyg5LjgmbmJzcDtwdCk8L3NwYW4+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwicGFnZS1tYXJnaW4taW5wdXRcIiBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07IGZvbnQtd2VpZ2h0OjYwMDsgY29sb3I6IzQ3NTU2OTsgd2hpdGUtc3BhY2U6bm93cmFwOyBtYXJnaW4tbGVmdDo4cHg7XCI+UGFnZSBtYXJnaW4gKGluKTo8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIGlkPVwicGFnZS1tYXJnaW4taW5wdXRcIlxuICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgbWluPVwiMC41XCIgbWF4PVwiMS41XCIgc3RlcD1cIjAuMDVcIlxuICAgICAgICAgICAgICB2YWx1ZT1cIjAuNVwiXG4gICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6NzJweDsgcGFkZGluZzozcHggNnB4OyBib3JkZXI6MXB4IHNvbGlkICNjYmQ1ZTE7IGJvcmRlci1yYWRpdXM6NHB4OyBmb250LXNpemU6MC45ZW07XCJcbiAgICAgICAgICAgICAgdGl0bGU9XCJDb250cm9scyB0aGUgcHJpbnQgcGFnZSBtYXJnaW5zIGZvciBhbGwgUERGIHBhZ2VzLlwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cInB1YmxpY2F0aW9ucy1zdGFydC1uZXctcGFnZS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTppbmxpbmUtZmxleDsgYWxpZ24taXRlbXM6Y2VudGVyOyBnYXA6NnB4OyBmb250LXNpemU6MC44M2VtOyBjb2xvcjojMzM0MTU1OyBtYXJnaW4tbGVmdDo4cHg7XCI+XG4gICAgICAgICAgICAgIDxpbnB1dCBpZD1cInB1YmxpY2F0aW9ucy1zdGFydC1uZXctcGFnZS1pbnB1dFwiIHR5cGU9XCJjaGVja2JveFwiIC8+XG4gICAgICAgICAgICAgIFN0YXJ0IFB1YmxpY2F0aW9ucyBvbiBuZXcgcGFnZVxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJza2lsbHMtc2hvdy1leHBlcmllbmNlLXNlbGVjdFwiIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTsgZm9udC13ZWlnaHQ6NjAwOyBjb2xvcjojNDc1NTY5OyB3aGl0ZS1zcGFjZTpub3dyYXA7IG1hcmdpbi1sZWZ0OjhweDtcIj5Ta2lsbCBleHBlcmllbmNlIGxldmVsOjwvbGFiZWw+XG4gICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgIGlkPVwic2tpbGxzLXNob3ctZXhwZXJpZW5jZS1zZWxlY3RcIlxuICAgICAgICAgICAgICBzdHlsZT1cInBhZGRpbmc6M3B4IDZweDsgYm9yZGVyOjFweCBzb2xpZCAjY2JkNWUxOyBib3JkZXItcmFkaXVzOjRweDsgZm9udC1zaXplOjAuOWVtO1wiXG4gICAgICAgICAgICAgIHRpdGxlPVwiQ29udHJvbHMgd2hldGhlciB5ZWFycyBvZiBleHBlcmllbmNlIGFyZSBzaG93biBuZXh0IHRvIGVhY2ggc2tpbGwuXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImluZGl2aWR1YWxcIj5JbmRpdmlkdWFsIHNldHRpbmc8L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImFsd2F5c1wiPkFsd2F5czwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwibmV2ZXJcIj5OZXZlcjwvb3B0aW9uPlxuICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwiYXBwbHktbGF5b3V0LXNldHRpbmdzLWJ0blwiIGNsYXNzPVwiYnRuLXNlY29uZGFyeVwiIHN0eWxlPVwicGFkZGluZzozcHggMTBweDsgZm9udC1zaXplOjAuODVlbTtcIj5BcHBseTwvYnV0dG9uPlxuICAgICAgICAgICAgPHNwYW4gaWQ9XCJsYXlvdXQtc2V0dGluZ3Mtc3RhdHVzXCIgc3R5bGU9XCJmb250LXNpemU6MC44ZW07IGNvbG9yOiM2NDc0OGI7XCI+PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPHRleHRhcmVhXG4gICAgICAgICAgICBpZD1cImluc3RydWN0aW9uLWlucHV0XCJcbiAgICAgICAgICAgIGNsYXNzPVwibGF5b3V0LWluc3RydWN0aW9uLXRleHRhcmVhXCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiwgTW92ZSBQdWJsaWNhdGlvbnMgc2VjdGlvbiBhZnRlciBTa2lsbHMmIzEwO29yOiBTaG9ydGVuIHRoZSBzZWNvbmQgYnVsbGV0IHVuZGVyIEdlbmVudGVjaCB0byBmb2N1cyBvbiBpbXBhY3QmIzEwO29yOiBLZWVwIHRoZSBHZW5lbnRlY2ggZW50cnkgb24gb25lIHBhZ2VcIlxuICAgICAgICAgICAgcm93cz1cIjZcIj48L3RleHRhcmVhPlxuXG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImFwcGx5LWluc3RydWN0aW9uLWJ0blwiIGNsYXNzPVwiYnRuLXByaW1hcnkgbGF5b3V0LWFjdGlvbi1idG5cIj5cbiAgICAgICAgICAgIEFwcGx5XG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiY29uZmlybS1sYXlvdXQtYnRuXCIgY2xhc3M9XCJjb250aW51ZS1idG4gbGF5b3V0LWFjdGlvbi1idG5cIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj5cbiAgICAgICAgICAgIENvbmZpcm0gTGF5b3V0XG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8cCBpZD1cImxheW91dC10d28tc3RlcC1oaW50XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7Zm9udC1zaXplOjAuODJlbTtjb2xvcjojNmI3MjgwO21hcmdpbjo2cHggMCAycHg7XCI+XG4gICAgICAgICAgICBPbmNlIHRoZSBwcmV2aWV3IGxvb2tzIHJpZ2h0LCBjb25maXJtIHRoZSBsYXlvdXQgXHUyMDE0IHRoZW4gZ2VuZXJhdGUgeW91ciBmaW5hbCBzdWJtaXNzaW9uIGZpbGVzLlxuICAgICAgICAgIDwvcD5cblxuICAgICAgICAgIDxkaXYgaWQ9XCJwcm9jZXNzaW5nLWluZGljYXRvclwiIGNsYXNzPVwicHJvY2Vzc2luZy1pbmRpY2F0b3JcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Bpbm5lclwiPjwvZGl2PlxuICAgICAgICAgICAgPHA+QXBwbHlpbmcgaW5zdHJ1Y3Rpb24uLi48L3A+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGlkPVwiY29uZmlybWF0aW9uLW1lc3NhZ2VcIiBjbGFzcz1cImNvbmZpcm1hdGlvbi1tZXNzYWdlXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPjwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImxheW91dC1oaXN0b3J5LXNlY3Rpb25cIj5cbiAgICAgICAgICAgIDxoND5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoaXN0b3J5LXRvZ2dsZVwiPlx1MjVCQzwvc3Bhbj5cbiAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gSGlzdG9yeSAoPHNwYW4gaWQ9XCJpbnN0cnVjdGlvbi1jb3VudFwiPjA8L3NwYW4+KVxuICAgICAgICAgICAgPC9oND5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJpbnN0cnVjdGlvbi1oaXN0b3J5XCIgY2xhc3M9XCJpbnN0cnVjdGlvbi1oaXN0b3J5LWxpc3RcIj48L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxidXR0b24gaWQ9XCJwcm9jZWVkLXRvLWZpbmFsaXNlLWJ0blwiIGNsYXNzPVwiY29udGludWUtYnRuIGxheW91dC1hY3Rpb24tYnRuXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxuICAgICAgICAgICAgR2VuZXJhdGUgRmluYWwgRmlsZXNcbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDxkaXYgaWQ9XCJjb250ZW50LXByb3Bvc2FsLXByb2Nlc3NpbmdcIiBjbGFzcz1cInByb2Nlc3NpbmctaW5kaWNhdG9yXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Bpbm5lclwiPjwvZGl2PlxuICAgICAgICAgICAgPHA+R2VuZXJhdGluZyBjb250ZW50IHByb3Bvc2Fsc1x1MjAyNjwvcD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGlkPVwiY29udGVudC1wcm9wb3NhbHMtcGFuZWxcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj48L2Rpdj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiYXBwbHktY29udGVudC1jaGFuZ2VzLWJ0blwiIGNsYXNzPVwiYnRuLXdhcm5pbmcgbGF5b3V0LWFjdGlvbi1idG5cIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj5cbiAgICAgICAgICAgIEFwcGx5IEFwcHJvdmVkIENoYW5nZXNcbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDxkaXYgaWQ9XCJkaXJ0eS1waGFzZXMtY2FsbG91dFwiIGNsYXNzPVwiZGlydHktcGhhc2VzLWNhbGxvdXRcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj5cbiAgICAgICAgICAgIDxoND5cdTI2QTAgQ29udGVudCBDaGFuZ2VkIFx1MjAxNCBSZS1ydW4gUmVxdWlyZWQ8L2g0PlxuICAgICAgICAgICAgPHA+VGV4dCBlZGl0cyBoYXZlIGJlZW4gc3RhZ2VkLiBUaGUgY3VycmVudCBwcmV2aWV3IG5vIGxvbmdlciByZWZsZWN0cyB0aGUgdXBkYXRlZCBjb250ZW50LjwvcD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYXlvdXQtc3RhbGUtY2FsbG91dC1hY3Rpb25zXCI+XG4gICAgICAgICAgICAgIDxidXR0b24gaWQ9XCJyZXR1cm4tdG8tZWFybGllc3QtZGlydHktYnRuXCIgY2xhc3M9XCJidG4td2FybmluZyBsYXlvdXQtYWN0aW9uLWJ0blwiPlx1MjFCQiBSZXR1cm4gdG8gR2VuZXJhdGUgQ1Y8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIGA7XG5cbiAgICAvLyBXaXJlIHVwIGV2ZW50IGxpc3RlbmVyc1xuICAgIHNldHVwTGF5b3V0SW5zdHJ1Y3Rpb25MaXN0ZW5lcnMoKTtcbiAgfVxuXG4gIC8vIFJlc3RvcmUgc2F2ZWQgZm9udCBzaXplIGZyb20gc2Vzc2lvbiBzdGF0ZSBpZiBhdmFpbGFibGVcbiAgY29uc3Qgc2F2ZWRGb250U2l6ZSA9IHN0YXRlTWFuYWdlcj8uZ2V0U2Vzc2lvblN0YXRlPy4oKT8uYmFzZV9mb250X3NpemU7XG4gIGlmIChzYXZlZEZvbnRTaXplKSB7XG4gICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFzZS1mb250LXNpemUtaW5wdXQnKTtcbiAgICBpZiAoaW5wdXQpIHtcbiAgICAgIGNvbnN0IHB4ID0gcGFyc2VGbG9hdChzYXZlZEZvbnRTaXplKSB8fCAxMztcbiAgICAgIGlucHV0LnZhbHVlID0gcHg7XG4gICAgICBjb25zdCBwdERpc3BsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZm9udC1zaXplLXB0LWRpc3BsYXknKTtcbiAgICAgIGlmIChwdERpc3BsYXkpIHB0RGlzcGxheS50ZXh0Q29udGVudCA9IGBweFxcdTAwYTAoJHtweFRvUHQocHgpfVxcdTAwYTBwdClgO1xuICAgIH1cbiAgfVxuICBjb25zdCBzYXZlZFBhZ2VNYXJnaW4gPSBzdGF0ZU1hbmFnZXI/LmdldFNlc3Npb25TdGF0ZT8uKCk/LnBhZ2VfbWFyZ2luO1xuICBpZiAoc2F2ZWRQYWdlTWFyZ2luKSB7XG4gICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGFnZS1tYXJnaW4taW5wdXQnKTtcbiAgICBpZiAoaW5wdXQpIGlucHV0LnZhbHVlID0gcGFyc2VGbG9hdChzYXZlZFBhZ2VNYXJnaW4pIHx8IDAuNTtcbiAgfVxuICBjb25zdCBwdWJsaWNhdGlvbnNTdGFydElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1YmxpY2F0aW9ucy1zdGFydC1uZXctcGFnZS1pbnB1dCcpO1xuICBpZiAocHVibGljYXRpb25zU3RhcnRJbnB1dCkge1xuICAgIGNvbnN0IHNlc3Npb25TdGF0ZSA9IHN0YXRlTWFuYWdlcj8uZ2V0U2Vzc2lvblN0YXRlPy4oKSB8fCB7fTtcbiAgICBjb25zdCBjdXN0b21pemF0aW9uU3RhdGUgPSBzdGF0ZU1hbmFnZXI/LmdldFRhYkRhdGE/LignY3VzdG9taXphdGlvbnMnKSB8fCB7fTtcbiAgICBjb25zdCBzYXZlZFB1YmxpY2F0aW9uc1N0YXJ0ID1cbiAgICAgIHNlc3Npb25TdGF0ZS5wdWJsaWNhdGlvbnNfc3RhcnRfbmV3X3BhZ2VcbiAgICAgID8/IHNlc3Npb25TdGF0ZT8uY3VzdG9taXphdGlvbnM/LnB1YmxpY2F0aW9uc19zdGFydF9uZXdfcGFnZVxuICAgICAgPz8gY3VzdG9taXphdGlvblN0YXRlLnB1YmxpY2F0aW9uc19zdGFydF9uZXdfcGFnZVxuICAgICAgPz8gY3VzdG9taXphdGlvblN0YXRlLnB1YmxpY2F0aW9uc19wYWdlX2JyZWFrXG4gICAgICA/PyBjdXN0b21pemF0aW9uU3RhdGUuc3RhcnRfcHVibGljYXRpb25zX29uX25ld19wYWdlXG4gICAgICA/PyBmYWxzZTtcbiAgICBwdWJsaWNhdGlvbnNTdGFydElucHV0LmNoZWNrZWQgPSBjb2VyY2VCb29sZWFuKHNhdmVkUHVibGljYXRpb25zU3RhcnQsIGZhbHNlKTtcbiAgfVxuICBjb25zdCBza2lsbHNTaG93RXhwZXJpZW5jZVNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbHMtc2hvdy1leHBlcmllbmNlLXNlbGVjdCcpO1xuICBpZiAoc2tpbGxzU2hvd0V4cGVyaWVuY2VTZWxlY3QpIHtcbiAgICBjb25zdCBzZXNzaW9uU3RhdGUgPSBzdGF0ZU1hbmFnZXI/LmdldFNlc3Npb25TdGF0ZT8uKCkgfHwge307XG4gICAgY29uc3QgY3VzdG9taXphdGlvblN0YXRlID0gc3RhdGVNYW5hZ2VyPy5nZXRUYWJEYXRhPy4oJ2N1c3RvbWl6YXRpb25zJykgfHwge307XG4gICAgY29uc3Qgc2F2ZWRTa2lsbHNFeHAgPVxuICAgICAgc2Vzc2lvblN0YXRlLnNraWxsc19zaG93X2V4cGVyaWVuY2VcbiAgICAgID8/IHNlc3Npb25TdGF0ZT8uY3VzdG9taXphdGlvbnM/LnNraWxsc19zaG93X2V4cGVyaWVuY2VcbiAgICAgID8/IGN1c3RvbWl6YXRpb25TdGF0ZS5za2lsbHNfc2hvd19leHBlcmllbmNlXG4gICAgICA/PyAnaW5kaXZpZHVhbCc7XG4gICAgY29uc3QgdmFsaWQgPSBbJ2Fsd2F5cycsICduZXZlcicsICdpbmRpdmlkdWFsJ107XG4gICAgc2tpbGxzU2hvd0V4cGVyaWVuY2VTZWxlY3QudmFsdWUgPSB2YWxpZC5pbmNsdWRlcyhzYXZlZFNraWxsc0V4cCkgPyBzYXZlZFNraWxsc0V4cCA6ICdpbmRpdmlkdWFsJztcbiAgfVxuXG4gIHJlbmRlclByZXZpZXdPdXRwdXRTdGF0dXMoZ2V0UHJldmlld091dHB1dHMoKSk7XG5cbiAgLy8gTG9hZCBhbmQgZGlzcGxheSBjdXJyZW50IEhUTUwgcHJldmlldyB2aWEgdGhlIHN0YWdlZCBnZW5lcmF0aW9uIGNvbnRyYWN0LlxuICAvLyAvYXBpL2N2L2dlbmVyYXRlLXByZXZpZXcgZ2VuZXJhdGVzIGZyZXNoIEhUTUwgYW5kIHN0b3JlcyBpdCBpbiBzZXNzaW9uIHN0YXRlLlxuICAvLyBGYWxsIGJhY2sgdG8gdGhlIGxlZ2FjeSAvYXBpL2xheW91dC1odG1sIGVuZHBvaW50IGlmIHRoZSBzZXNzaW9uIGhhcyBub1xuICAvLyBjdXN0b21pemF0aW9uIGRhdGEgeWV0IChlLmcuIHNlc3Npb24gcmVzdG9yZWQgYWZ0ZXIgZnVsbCBnZW5lcmF0aW9uKS5cbiAgY29uc3QgY2FjaGVkSHRtbCA9IGdldEN2QXJ0aWZhY3RzKClbJyouaHRtbCddIHx8ICcnO1xuICBpZiAoY2FjaGVkSHRtbCkge1xuICAgIGRpc3BsYXlMYXlvdXRQcmV2aWV3KGNhY2hlZEh0bWwpO1xuICB9IGVsc2Uge1xuICAgIF9mZXRjaEFuZERpc3BsYXlMYXlvdXRQcmV2aWV3KCk7XG4gIH1cblxuICAvLyBSZXN0b3JlIGFueSBwcmlvciBpbnN0cnVjdGlvbnMgZnJvbSBzZXNzaW9uXG4gIGF3YWl0IHJlc3RvcmVJbnN0cnVjdGlvbkhpc3RvcnkoKTtcbiAgcmVmcmVzaExheW91dFJldmlld1N0YXRlKCk7XG5cbiAgLy8gU2hvdyBhIHByb2FjdGl2ZSBwYWdlLWxlbmd0aCBlc3RpbWF0ZSBzbyB1c2VycyBjYW4gYWRqdXN0IGNvbnRlbnQgYmVmb3JlIGdlbmVyYXRpbmdcbiAgX2ZldGNoUGFnZUVzdGltYXRlKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9mZXRjaFBhZ2VFc3RpbWF0ZSgpIHtcbiAgY29uc3QgYmFubmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xheW91dC1wYWdlLWVzdGltYXRlJyk7XG4gIGlmICghYmFubmVyKSByZXR1cm47XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvZXN0aW1hdGUtcGFnZXMnKTtcbiAgICBpZiAoIXJlcy5vaykgcmV0dXJuO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmICghZGF0YS5vayB8fCAhZGF0YS5lc3RpbWF0ZWRfcGFnZXMpIHJldHVybjtcbiAgICBjb25zdCBwYWdlcyA9IGRhdGEuZXN0aW1hdGVkX3BhZ2VzO1xuICAgIGNvbnN0IGlzT3ZlciA9IHBhZ2VzID4gMztcbiAgICBjb25zdCBjb2xvciA9IGlzT3ZlciA/ICcjOTI0MDBlJyA6ICcjMTY2NTM0JztcbiAgICBjb25zdCBiZyAgICA9IGlzT3ZlciA/ICcjZmVmM2M3JyA6ICcjZjBmZGY0JztcbiAgICBjb25zdCBib3JkZXIgPSBpc092ZXIgPyAnI2ZjZDM0ZCcgOiAnI2JiZjdkMCc7XG4gICAgY29uc3QgbXNnICAgPSBpc092ZXJcbiAgICAgID8gYFx1MjZBMCBFc3RpbWF0ZWQgfiR7cGFnZXN9IHBhZ2VzIFx1MjAxNCBzZW5pb3IgY2FuZGlkYXRlIHRhcmdldCBpcyAyXHUyMDEzMyBwYWdlcy4gQ29uc2lkZXIgcmVkdWNpbmcgc2VsZWN0ZWQgYnVsbGV0IHBvaW50cyBiZWZvcmUgZ2VuZXJhdGluZy5gXG4gICAgICA6IGBcdTI3MTMgRXN0aW1hdGVkIH4ke3BhZ2VzfSBwYWdlcyBcdTIwMTQgd2l0aGluIHRoZSAyXHUyMDEzMyBwYWdlIHRhcmdldCBmb3Igc2VuaW9yIGNhbmRpZGF0ZXMuYDtcbiAgICBiYW5uZXIuc3R5bGUuY3NzVGV4dCA9IGBkaXNwbGF5OmJsb2NrO3BhZGRpbmc6OHB4IDEycHg7Ym9yZGVyLXJhZGl1czo2cHg7Ym9yZGVyOjFweCBzb2xpZCAke2JvcmRlcn07YmFja2dyb3VuZDoke2JnfTtjb2xvcjoke2NvbG9yfTtmb250LXNpemU6MC44N2VtO2A7XG4gICAgYmFubmVyLnRleHRDb250ZW50ID0gbXNnO1xuICB9IGNhdGNoIChfKSB7IC8qIHNpbGVudCBcdTIwMTQgbm9uLWNyaXRpY2FsICovIH1cbn1cblxuLyoqXG4gKiBTZXQgdXAgZXZlbnQgbGlzdGVuZXJzIGZvciBsYXlvdXQgaW5zdHJ1Y3Rpb24gVUkuXG4gKi9cbmZ1bmN0aW9uIHNldHVwTGF5b3V0SW5zdHJ1Y3Rpb25MaXN0ZW5lcnMoKSB7XG4gIGNvbnN0IGFwcGx5QnRuICAgICAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FwcGx5LWluc3RydWN0aW9uLWJ0bicpO1xuICBjb25zdCBjb25maXJtQnRuICAgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb25maXJtLWxheW91dC1idG4nKTtcbiAgY29uc3QgcHJvY2VlZEJ0biAgICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJvY2VlZC10by1maW5hbGlzZS1idG4nKTtcbiAgY29uc3QgcmVnZW5lcmF0ZUJ0biAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVnZW5lcmF0ZS1sYXlvdXQtcHJldmlldy1idG4nKTtcbiAgY29uc3QgZGlzbWlzc0NhbGxvdXRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGlzbWlzcy1sYXlvdXQtc3RhbGUtYnRuJyk7XG4gIGNvbnN0IGluc3RydWN0aW9uSW5wdXQgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2luc3RydWN0aW9uLWlucHV0Jyk7XG4gIGNvbnN0IGhpc3RvcnlUb2dnbGUgICAgID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmhpc3RvcnktdG9nZ2xlJyk7XG4gIGNvbnN0IGFwcGx5U2V0dGluZ3NCdG4gID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FwcGx5LWxheW91dC1zZXR0aW5ncy1idG4nKTtcbiAgY29uc3QgZm9udFNpemVJbnB1dCAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFzZS1mb250LXNpemUtaW5wdXQnKTtcbiAgY29uc3QgcGFnZU1hcmdpbklucHV0ICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGFnZS1tYXJnaW4taW5wdXQnKTtcbiAgY29uc3QgcHVibGljYXRpb25zU3RhcnRJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWJsaWNhdGlvbnMtc3RhcnQtbmV3LXBhZ2UtaW5wdXQnKTtcbiAgY29uc3Qgc2tpbGxzU2hvd0V4cGVyaWVuY2VTZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGxzLXNob3ctZXhwZXJpZW5jZS1zZWxlY3QnKTtcblxuICBpZiAoYXBwbHlTZXR0aW5nc0J0biAmJiBmb250U2l6ZUlucHV0ICYmIHBhZ2VNYXJnaW5JbnB1dCAmJiBwdWJsaWNhdGlvbnNTdGFydElucHV0KSB7XG4gICAgYXBwbHlTZXR0aW5nc0J0bi5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgJ2NsaWNrJyxcbiAgICAgICgpID0+IGFwcGx5TGF5b3V0U2V0dGluZ3MoXG4gICAgICAgIGZvbnRTaXplSW5wdXQudmFsdWUsXG4gICAgICAgIHBhZ2VNYXJnaW5JbnB1dC52YWx1ZSxcbiAgICAgICAgcHVibGljYXRpb25zU3RhcnRJbnB1dC5jaGVja2VkLFxuICAgICAgICBza2lsbHNTaG93RXhwZXJpZW5jZVNlbGVjdD8udmFsdWUgfHwgJ2luZGl2aWR1YWwnLFxuICAgICAgKSxcbiAgICApO1xuICAgIGZvbnRTaXplSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwdERpc3BsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZm9udC1zaXplLXB0LWRpc3BsYXknKTtcbiAgICAgIGlmIChwdERpc3BsYXkpIHtcbiAgICAgICAgY29uc3QgcHggPSBwYXJzZUZsb2F0KGZvbnRTaXplSW5wdXQudmFsdWUpO1xuICAgICAgICBwdERpc3BsYXkudGV4dENvbnRlbnQgPSBpc05hTihweCkgPyAncHgnIDogYHB4XFx1MDBhMCgke3B4VG9QdChweCl9XFx1MDBhMHB0KWA7XG4gICAgICB9XG4gICAgfSk7XG4gICAgZm9udFNpemVJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdrZXlwcmVzcycsIChlKSA9PiB7XG4gICAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicpIHtcbiAgICAgICAgYXBwbHlMYXlvdXRTZXR0aW5ncyhcbiAgICAgICAgICBmb250U2l6ZUlucHV0LnZhbHVlLFxuICAgICAgICAgIHBhZ2VNYXJnaW5JbnB1dC52YWx1ZSxcbiAgICAgICAgICBwdWJsaWNhdGlvbnNTdGFydElucHV0LmNoZWNrZWQsXG4gICAgICAgICAgc2tpbGxzU2hvd0V4cGVyaWVuY2VTZWxlY3Q/LnZhbHVlIHx8ICdpbmRpdmlkdWFsJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBwYWdlTWFyZ2luSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5cHJlc3MnLCAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSAnRW50ZXInKSB7XG4gICAgICAgIGFwcGx5TGF5b3V0U2V0dGluZ3MoXG4gICAgICAgICAgZm9udFNpemVJbnB1dC52YWx1ZSxcbiAgICAgICAgICBwYWdlTWFyZ2luSW5wdXQudmFsdWUsXG4gICAgICAgICAgcHVibGljYXRpb25zU3RhcnRJbnB1dC5jaGVja2VkLFxuICAgICAgICAgIHNraWxsc1Nob3dFeHBlcmllbmNlU2VsZWN0Py52YWx1ZSB8fCAnaW5kaXZpZHVhbCcsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBpZiAoYXBwbHlCdG4pIHtcbiAgICBhcHBseUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IGluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb25JbnB1dC52YWx1ZS50cmltKCk7XG4gICAgICBpZiAoIWluc3RydWN0aW9uKSB7XG4gICAgICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsICdcdTI2QTBcdUZFMEYgUGxlYXNlIGVudGVyIGFuIGluc3RydWN0aW9uIGJlZm9yZSBzdWJtaXR0aW5nLicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzdWJtaXRTbWFydEluc3RydWN0aW9uKGluc3RydWN0aW9uKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChjb25maXJtQnRuKSB7XG4gICAgY29uZmlybUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNvbmZpcm1MYXlvdXRSZXZpZXcpO1xuICB9XG5cbiAgaWYgKHByb2NlZWRCdG4pIHtcbiAgICBwcm9jZWVkQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZ2VuZXJhdGVGaW5hbE91dHB1dHMpO1xuICB9XG5cbiAgaWYgKHJlZ2VuZXJhdGVCdG4pIHtcbiAgICByZWdlbmVyYXRlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlUmVnZW5lcmF0ZVByZXZpZXdBY3Rpb24pO1xuICB9XG5cbiAgaWYgKGRpc21pc3NDYWxsb3V0QnRuKSB7XG4gICAgZGlzbWlzc0NhbGxvdXRCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBkaXNtaXNzZWRTdGFsZUNhbGxvdXRSZXZpc2lvbiA9IGdldEN1cnJlbnRDb250ZW50UmV2aXNpb24oKTtcbiAgICAgIHJlbmRlckxheW91dFN0YWxlQ2FsbG91dCgpO1xuICAgIH0pO1xuICB9XG5cbiAgaWYgKGhpc3RvcnlUb2dnbGUpIHtcbiAgICBoaXN0b3J5VG9nZ2xlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgIGUudGFyZ2V0LnRleHRDb250ZW50ID0gZS50YXJnZXQudGV4dENvbnRlbnQgPT09ICdcdTI1QkMnID8gJ1x1MjVCNicgOiAnXHUyNUJDJztcbiAgICAgIGNvbnN0IGhpc3RvcnlMaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2luc3RydWN0aW9uLWhpc3RvcnknKTtcbiAgICAgIGlmIChoaXN0b3J5TGlzdCkge1xuICAgICAgICBoaXN0b3J5TGlzdC5jbGFzc0xpc3QudG9nZ2xlKCdjb2xsYXBzZWQnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIEFsbG93IEVudGVyIGtleSB0byBzdWJtaXQgaW4gdGV4dGFyZWEgKFNoaWZ0K0VudGVyIGZvciBuZXcgbGluZSlcbiAgaWYgKGluc3RydWN0aW9uSW5wdXQpIHtcbiAgICBpbnN0cnVjdGlvbklucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXByZXNzJywgKGUpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJyAmJiAhZS5zaGlmdEtleSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGFwcGx5QnRuPy5jbGljaygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gQ29udGVudCBwcm9wb3NhbCBhbmQgZGlydHktcGhhc2UgYnV0dG9uc1xuICBjb25zdCBhcHBseUNvbnRlbnRDaGFuZ2VzQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FwcGx5LWNvbnRlbnQtY2hhbmdlcy1idG4nKTtcbiAgY29uc3QgcmV0dXJuVG9EaXJ0eUJ0biAgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXR1cm4tdG8tZWFybGllc3QtZGlydHktYnRuJyk7XG5cbiAgaWYgKGFwcGx5Q29udGVudENoYW5nZXNCdG4pIHtcbiAgICBhcHBseUNvbnRlbnRDaGFuZ2VzQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXBwbHlBY2NlcHRlZFByb3Bvc2Fscyk7XG4gIH1cblxuICBpZiAocmV0dXJuVG9EaXJ0eUJ0bikge1xuICAgIHJldHVyblRvRGlydHlCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBzdGVwID0gc3RhdGVNYW5hZ2VyLmdldEVhcmxpZXN0RGlydHlTdGVwKCkgfHwgJ2dlbmVyYXRlJztcbiAgICAgIGNvbmZpcm1SZVJ1blBoYXNlKHN0ZXApO1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogU2F2ZSBsYXlvdXQgZGlzcGxheSBzZXR0aW5ncyB0byBzZXNzaW9uIHN0YXRlLCB0aGVuIHJlLXJlbmRlciB0aGUgcHJldmlldy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYXBwbHlMYXlvdXRTZXR0aW5ncyhmb250U2l6ZVZhbHVlLCBwYWdlTWFyZ2luVmFsdWUsIHB1YmxpY2F0aW9uc1N0YXJ0TmV3UGFnZSA9IGZhbHNlLCBza2lsbHNTaG93RXhwZXJpZW5jZSA9ICdpbmRpdmlkdWFsJykge1xuICBjb25zdCBzdGF0dXNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYXlvdXQtc2V0dGluZ3Mtc3RhdHVzJyk7XG4gIGNvbnN0IHBhcnNlZEZvbnRTaXplID0gcGFyc2VGbG9hdChmb250U2l6ZVZhbHVlKTtcbiAgY29uc3QgcGFyc2VkUGFnZU1hcmdpbiA9IHBhcnNlRmxvYXQocGFnZU1hcmdpblZhbHVlKTtcbiAgaWYgKGlzTmFOKHBhcnNlZEZvbnRTaXplKSB8fCBwYXJzZWRGb250U2l6ZSA8IDYgfHwgcGFyc2VkRm9udFNpemUgPiAxNikge1xuICAgIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnXHUyNkEwXHVGRTBGIEZvbnQgbXVzdCBiZSA2XHUyMDEzMTYnO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoaXNOYU4ocGFyc2VkUGFnZU1hcmdpbikgfHwgcGFyc2VkUGFnZU1hcmdpbiA8IDAuNSB8fCBwYXJzZWRQYWdlTWFyZ2luID4gMS41KSB7XG4gICAgaWYgKHN0YXR1c0VsKSBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICdcdTI2QTBcdUZFMEYgTWFyZ2luIG11c3QgYmUgMC41XHUyMDEzMS41JztcbiAgICByZXR1cm47XG4gIH1cbiAgdHJ5IHtcbiAgICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJ1NhdmluZ1x1MjAyNic7XG4gICAgY29uc3Qgc2F2ZVJlcyA9IGF3YWl0IGFwaUNhbGwoJ1BPU1QnLCAnL2FwaS9sYXlvdXQtc2V0dGluZ3MnLCB7XG4gICAgICBiYXNlX2ZvbnRfc2l6ZTogYCR7cGFyc2VkRm9udFNpemV9cHhgLFxuICAgICAgcGFnZV9tYXJnaW46IGAke3BhcnNlZFBhZ2VNYXJnaW59aW5gLFxuICAgICAgcHVibGljYXRpb25zX3N0YXJ0X25ld19wYWdlOiBCb29sZWFuKHB1YmxpY2F0aW9uc1N0YXJ0TmV3UGFnZSksXG4gICAgICBza2lsbHNfc2hvd19leHBlcmllbmNlOiBza2lsbHNTaG93RXhwZXJpZW5jZSxcbiAgICB9KTtcbiAgICBpZiAoIXNhdmVSZXMub2spIHRocm93IG5ldyBFcnJvcihzYXZlUmVzLmVycm9yIHx8ICdzYXZlIGZhaWxlZCcpO1xuXG4gICAgaWYgKHN0YXR1c0VsKSBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICdSZS1yZW5kZXJpbmdcdTIwMjYnO1xuICAgIGNvbnN0IHByZXZpZXdSZXMgPSBhd2FpdCBhcGlDYWxsKCdQT1NUJywgJy9hcGkvY3YvZ2VuZXJhdGUtcHJldmlldycsIHsgY29udGVudF9yZXZpc2lvbjogZ2V0Q3VycmVudENvbnRlbnRSZXZpc2lvbigpIH0pO1xuICAgIGlmIChwcmV2aWV3UmVzLm9rICYmIHByZXZpZXdSZXMuaHRtbCkge1xuICAgICAgZGlzcGxheUxheW91dFByZXZpZXcocHJldmlld1Jlcy5odG1sKTtcbiAgICAgIHNldFByZXZpZXdIdG1sKHByZXZpZXdSZXMuaHRtbCk7XG4gICAgICBkaXNtaXNzZWRTdGFsZUNhbGxvdXRSZXZpc2lvbiA9IG51bGw7XG4gICAgICBzdGF0ZU1hbmFnZXI/Lm1hcmtQcmV2aWV3R2VuZXJhdGVkPy4oe1xuICAgICAgICBwcmV2aWV3QXZhaWxhYmxlOiB0cnVlLFxuICAgICAgICBwcmV2aWV3T3V0cHV0czogcHJldmlld1Jlcy5wcmV2aWV3X291dHB1dHMgfHwgbnVsbCxcbiAgICAgICAgcGFnZUNvdW50RXN0aW1hdGU6IHByZXZpZXdSZXMucGFnZV9jb3VudF9lc3RpbWF0ZSA/PyBudWxsLFxuICAgICAgICBwYWdlQ291bnRFeGFjdDogcHJldmlld1Jlcy5wYWdlX2NvdW50X2V4YWN0ID8/IG51bGwsXG4gICAgICAgIHBhZ2VDb3VudENvbmZpZGVuY2U6IHByZXZpZXdSZXMucGFnZV9jb3VudF9jb25maWRlbmNlID8/IG51bGwsXG4gICAgICAgIHBhZ2VDb3VudFNvdXJjZTogcHJldmlld1Jlcy5wYWdlX2NvdW50X3NvdXJjZSB8fCBudWxsLFxuICAgICAgICBwYWdlV2FybmluZzogQm9vbGVhbihwcmV2aWV3UmVzLnBhZ2VfbGVuZ3RoX3dhcm5pbmcpLFxuICAgICAgICBwcmV2aWV3R2VuZXJhdGVkQXQ6IHByZXZpZXdSZXMucHJldmlld19nZW5lcmF0ZWRfYXQgfHwgbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICBwcmV2aWV3UmVxdWVzdElkOiBwcmV2aWV3UmVzLnByZXZpZXdfcmVxdWVzdF9pZCB8fCBudWxsLFxuICAgICAgfSk7XG4gICAgICByZW5kZXJQcmV2aWV3T3V0cHV0U3RhdHVzKHByZXZpZXdSZXMucHJldmlld19vdXRwdXRzIHx8IG51bGwpO1xuICAgICAgcmVmcmVzaExheW91dFJldmlld1N0YXRlKCk7XG4gICAgICAocHJldmlld1Jlcy5jb250ZW50X3dhcm5pbmdzIHx8IFtdKS5mb3JFYWNoKHcgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHNob3dUb2FzdCA9PT0gJ2Z1bmN0aW9uJykgc2hvd1RvYXN0KHcubWVzc2FnZSwgJ3dhcm5pbmcnLCA4MDAwKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoc3RhdHVzRWwpIHsgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnXHUyNzA1IEFwcGxpZWQnOyBzZXRUaW1lb3V0KCgpID0+IHsgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnJzsgfSwgMjAwMCk7IH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKHN0YXR1c0VsKSBzdGF0dXNFbC50ZXh0Q29udGVudCA9IGBcdTI3NEMgRmFpbGVkIHRvIGFwcGx5IFx1MjAxNCB0cnkgYWdhaW4gb3IgcmVmcmVzaC5gO1xuICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsIGBcdTI3NEMgQ291bGQgbm90IGFwcGx5IHRoZSBpbnN0cnVjdGlvbi4gVHJ5IHJlcGhyYXNpbmcgaXQgb3IgcmVmcmVzaCB0aGUgcGFnZSBpZiB0aGUgcHJvYmxlbSBwZXJzaXN0cy5gKTtcbiAgfVxufVxuXG4vKipcbiAqIFN1Ym1pdCBhbiBpbnN0cnVjdGlvbiB0aHJvdWdoIHRoZSB1bmlmaWVkIHNtYXJ0LWluc3RydWN0aW9uIGVuZHBvaW50LlxuICogVGhlIGJhY2tlbmQgY2xhc3NpZmllcyB0aGUgaW5zdHJ1Y3Rpb24gYXMgbGF5b3V0IG9yIGNvbnRlbnQgYW5kIGRlbGVnYXRlc1xuICogdG8gdGhlIGFwcHJvcHJpYXRlIGhhbmRsZXIuIFRoZSByZXNwb25zZSBpcyByb3V0ZWQgYWNjb3JkaW5nbHkgaGVyZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3VibWl0U21hcnRJbnN0cnVjdGlvbihpbnN0cnVjdGlvblRleHQpIHtcbiAgY29uc3QgY3VycmVudEh0bWwgPSBnZXRDdkFydGlmYWN0cygpWycqLmh0bWwnXSB8fCAnJztcbiAgLy8gU25hcHNob3Qgc3RhdGUgZm9yIHVuZG8gYmVmb3JlIGFwcGx5aW5nLlxuICBfbGF5b3V0VW5kb1N0YWNrLnB1c2goe1xuICAgIGh0bWw6IGN1cnJlbnRIdG1sLFxuICAgIGluc3RydWN0aW9uczogKHdpbmRvdy5sYXlvdXRJbnN0cnVjdGlvbnMgfHwgW10pLm1hcChpID0+ICh7IC4uLmkgfSkpLFxuICB9KTtcbiAgaWYgKF9sYXlvdXRVbmRvU3RhY2subGVuZ3RoID4gX1VORE9fU1RBQ0tfTUFYKSB7XG4gICAgX2xheW91dFVuZG9TdGFjay5zaGlmdCgpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBzaG93UHJvY2Vzc2luZyh0cnVlKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGFwaUNhbGwoJ1BPU1QnLCAnL2FwaS9jdi9zbWFydC1pbnN0cnVjdGlvbicsIHsgaW5zdHJ1Y3Rpb246IGluc3RydWN0aW9uVGV4dCB9KTtcblxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIGlmIChyZXNwb25zZS5lcnJvciA9PT0gJ2NsYXJpZnknKSB7XG4gICAgICAgIHNob3dDbGFyaWZpY2F0aW9uRGlhbG9nKHJlc3BvbnNlLnF1ZXN0aW9uLCBpbnN0cnVjdGlvblRleHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXBwZW5kTGF5b3V0U2FmZXR5QWxlcnQocmVzcG9uc2Uuc2FmZXR5X2FsZXJ0KTtcbiAgICAgICAgbGV0IGVycm9ySHRtbCA9IGBcdTI2QTBcdUZFMEYgRXJyb3I6ICR7ZXNjYXBlSHRtbChyZXNwb25zZS5lcnJvcil9IFx1MjAxNCAke2VzY2FwZUh0bWwocmVzcG9uc2UuZGV0YWlscyB8fCAnJyl9YDtcbiAgICAgICAgaWYgKHJlc3BvbnNlLnJhd19yZXNwb25zZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZXJyb3JIdG1sICs9IGA8YnI+PGRldGFpbHMgc3R5bGU9XCJtYXJnaW4tdG9wOjZweFwiPjxzdW1tYXJ5IHN0eWxlPVwiY3Vyc29yOnBvaW50ZXI7Zm9udC1zaXplOjAuODVlbTtjb2xvcjojNjQ3NDhiXCI+UmF3IExMTSByZXNwb25zZTwvc3VtbWFyeT48cHJlIHN0eWxlPVwiZm9udC1zaXplOjAuNzVlbTt3aGl0ZS1zcGFjZTpwcmUtd3JhcDt3b3JkLWJyZWFrOmJyZWFrLWFsbDttYXgtaGVpZ2h0OjIwMHB4O292ZXJmbG93LXk6YXV0bztiYWNrZ3JvdW5kOiNmOGZhZmM7Ym9yZGVyOjFweCBzb2xpZCAjZTJlOGYwO2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6OHB4O21hcmdpbi10b3A6NHB4XCI+JHtlc2NhcGVIdG1sKHJlc3BvbnNlLnJhd19yZXNwb25zZSB8fCAnKGVtcHR5KScpfTwvcHJlPjwvZGV0YWlscz5gO1xuICAgICAgICB9XG4gICAgICAgIGFwcGVuZE1lc3NhZ2VIdG1sKCdzeXN0ZW0nLCBlcnJvckh0bWwpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGluc3RydWN0aW9uVHlwZSA9IHJlc3BvbnNlLmluc3RydWN0aW9uX3R5cGUgfHwgJ2xheW91dCc7XG5cbiAgICBpZiAoaW5zdHJ1Y3Rpb25UeXBlID09PSAnY29udGVudCcpIHtcbiAgICAgIC8vIENvbnRlbnQgcGF0aDogcmVuZGVyIHByb3Bvc2FscyBmb3IgcmV2aWV3XG4gICAgICBjb25zdCBwcm9wb3NhbHMgPSByZXNwb25zZS5wcm9wb3NhbHMgfHwgW107XG4gICAgICBpZiAocHJvcG9zYWxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnXHUyNkEwXHVGRTBGIE5vIGNvbnRlbnQgcHJvcG9zYWxzIHdlcmUgZ2VuZXJhdGVkLiBUcnkgcmVwaHJhc2luZyB5b3VyIGluc3RydWN0aW9uLicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVuZGVyQ29udGVudFByb3Bvc2Fscyhwcm9wb3NhbHMpO1xuICAgICAgICBjb25zdCBwYW5lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb250ZW50LXByb3Bvc2Fscy1wYW5lbCcpO1xuICAgICAgICBpZiAocGFuZWwpIHBhbmVsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgfVxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2luc3RydWN0aW9uLWlucHV0JykudmFsdWUgPSAnJztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBMYXlvdXQgcGF0aDogdXBkYXRlIHByZXZpZXdcbiAgICBjb25zdCBuZXdIdG1sID0gcmVzcG9uc2UuaHRtbDtcbiAgICBkaXNwbGF5TGF5b3V0UHJldmlldyhuZXdIdG1sKTtcbiAgICBhcHBlbmRMYXlvdXRTYWZldHlBbGVydChyZXNwb25zZS5zYWZldHlfYWxlcnQpO1xuICAgIHNldFByZXZpZXdIdG1sKG5ld0h0bWwpO1xuICAgIGRpc21pc3NlZFN0YWxlQ2FsbG91dFJldmlzaW9uID0gbnVsbDtcbiAgICBzdGF0ZU1hbmFnZXI/Lm1hcmtQcmV2aWV3R2VuZXJhdGVkPy4oe1xuICAgICAgcHJldmlld0F2YWlsYWJsZTogdHJ1ZSxcbiAgICAgIHByZXZpZXdPdXRwdXRzOiByZXNwb25zZS5wcmV2aWV3X291dHB1dHMgfHwgbnVsbCxcbiAgICAgIGxheW91dENvbmZpcm1lZDogZmFsc2UsXG4gICAgICBwYWdlQ291bnRFc3RpbWF0ZTogcmVzcG9uc2UucGFnZV9jb3VudF9lc3RpbWF0ZSA/PyBudWxsLFxuICAgICAgcGFnZUNvdW50RXhhY3Q6IHJlc3BvbnNlLnBhZ2VfY291bnRfZXhhY3QgPz8gbnVsbCxcbiAgICAgIHBhZ2VDb3VudENvbmZpZGVuY2U6IHJlc3BvbnNlLnBhZ2VfY291bnRfY29uZmlkZW5jZSA/PyBudWxsLFxuICAgICAgcGFnZUNvdW50U291cmNlOiByZXNwb25zZS5wYWdlX2NvdW50X3NvdXJjZSB8fCBudWxsLFxuICAgICAgcGFnZVdhcm5pbmc6IEJvb2xlYW4ocmVzcG9uc2UucGFnZV9sZW5ndGhfd2FybmluZyksXG4gICAgICBwcmV2aWV3R2VuZXJhdGVkQXQ6IHJlc3BvbnNlLnByZXZpZXdfZ2VuZXJhdGVkX2F0IHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHByZXZpZXdSZXF1ZXN0SWQ6IHJlc3BvbnNlLnByZXZpZXdfcmVxdWVzdF9pZCB8fCBudWxsLFxuICAgIH0pO1xuICAgIHJlbmRlclByZXZpZXdPdXRwdXRTdGF0dXMocmVzcG9uc2UucHJldmlld19vdXRwdXRzIHx8IG51bGwpO1xuXG4gICAgY29uc3QgaW5zdHJ1Y3Rpb24gPSB7XG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9Mb2NhbGVUaW1lU3RyaW5nKCksXG4gICAgICBpbnN0cnVjdGlvbl90ZXh0OiBpbnN0cnVjdGlvblRleHQsXG4gICAgICBjaGFuZ2Vfc3VtbWFyeTogcmVzcG9uc2Uuc3VtbWFyeSxcbiAgICAgIGNvbmZpcm1hdGlvbjogdHJ1ZSxcbiAgICB9O1xuICAgIGFkZFRvSW5zdHJ1Y3Rpb25IaXN0b3J5KGluc3RydWN0aW9uKTtcbiAgICBzaG93Q29uZmlybWF0aW9uTWVzc2FnZShgJHtyZXNwb25zZS5zYWZldHlfYWxlcnQ/LmZsYWdnZWQgPyAnXHUyNkEwXHVGRTBGICcgOiAnXHUyNzA1ICd9JHtyZXNwb25zZS5zdW1tYXJ5fWApO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnN0cnVjdGlvbi1pbnB1dCcpLnZhbHVlID0gJyc7XG4gICAgcmVmcmVzaExheW91dFJldmlld1N0YXRlKCk7XG5cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCBgXHUyNzRDIENvdWxkIG5vdCBhcHBseSB0aGUgaW5zdHJ1Y3Rpb24uIFRyeSByZXBocmFzaW5nIGl0LCBvciBjbGljayBcIlJlZ2VuZXJhdGUgUHJldmlld1wiIHRvIHJlc2V0IHRoZSBwcmV2aWV3IGFuZCB0cnkgYWdhaW4uYCk7XG4gIH0gZmluYWxseSB7XG4gICAgc2hvd1Byb2Nlc3NpbmcoZmFsc2UpO1xuICB9XG59XG5cbi8qKlxuICogU3VibWl0IGxheW91dCBpbnN0cnVjdGlvbiB0byBiYWNrZW5kIGZvciBwcm9jZXNzaW5nLlxuICpcbiAqIFVzZXMgUE9TVCAvYXBpL2N2L2xheW91dC1yZWZpbmUgKHN0YWdlZCBnZW5lcmF0aW9uIGNvbnRyYWN0KSB3aGVuIGFcbiAqIHNlc3Npb24tc3RvcmVkIHByZXZpZXcgaXMgYXZhaWxhYmxlLiAgRmFsbHMgYmFjayB0byB0aGUgbGVnYWN5XG4gKiBQT1NUIC9hcGkvbGF5b3V0LWluc3RydWN0aW9uIGVuZHBvaW50ICh3aGljaCByZXF1aXJlcyB0aGUgSFRNTCBpbiB0aGVcbiAqIHJlcXVlc3QgYm9keSkgd2hlbiBubyBzZXNzaW9uIHByZXZpZXcgZXhpc3RzLlxuICovXG5hc3luYyBmdW5jdGlvbiBzdWJtaXRMYXlvdXRJbnN0cnVjdGlvbihpbnN0cnVjdGlvblRleHQpIHtcbiAgLyogZHVja2Zsb3c6XG4gICAqICAgaWQ6IGxheW91dF91aV9yZWZpbmVfbGl2ZVxuICAgKiAgIGtpbmQ6IHVpXG4gICAqICAgdGltZXN0YW1wOiAnMjAyNi0wMy0yNlQwMDoyNDowMFonXG4gICAqICAgc3RhdHVzOiBsaXZlXG4gICAqICAgaGFuZGxlczpcbiAgICogICAtIHVpOmxheW91dC5zdWJtaXQtaW5zdHJ1Y3Rpb25cbiAgICogICBjYWxsczpcbiAgICogICAtIFBPU1QgL2FwaS9jdi9sYXlvdXQtcmVmaW5lXG4gICAqICAgLSBQT1NUIC9hcGkvbGF5b3V0LWluc3RydWN0aW9uXG4gICAqICAgcmVhZHM6XG4gICAqICAgLSBkb206I2luc3RydWN0aW9uLWlucHV0LnZhbHVlXG4gICAqICAgLSBzdGF0ZTpnZW5lcmF0aW9uX3N0YXRlLnByZXZpZXdBdmFpbGFibGVcbiAgICogICAtIHN0YXRlOmdlbmVyYXRpb25fc3RhdGUucGhhc2VcbiAgICogICAtIHdpbmRvdzpsYXlvdXRJbnN0cnVjdGlvbnNcbiAgICogICB3cml0ZXM6XG4gICAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9jdi9sYXlvdXQtcmVmaW5lLmluc3RydWN0aW9uXG4gICAqICAgLSBkb206I2xheW91dC1wcmV2aWV3XG4gICAqICAgLSB3aW5kb3c6bGF5b3V0SW5zdHJ1Y3Rpb25zXG4gICAqICAgLSBzdGF0ZTpnZW5lcmF0aW9uX3N0YXRlLnByZXZpZXdfb3V0cHV0c1xuICAgKiAgIG5vdGVzOiBTdWJtaXRzIGEgbmF0dXJhbC1sYW5ndWFnZSBsYXlvdXQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCB0aGUgc3RhZ2VkIHByZXZpZXcgd2hlbiBhdmFpbGFibGUsIHRoZW4gcmVmcmVzaGVzIHRoZSBwcmV2aWV3IGFuZCBsb2NhbCBpbnN0cnVjdGlvbiBoaXN0b3J5IGZyb20gdGhlIHJldHVybmVkIEhUTUwuXG4gICAqL1xuICBjb25zdCBjdXJyZW50SHRtbCA9IGdldEN2QXJ0aWZhY3RzKClbJyouaHRtbCddIHx8ICcnO1xuICBjb25zdCBwcmlvckluc3RydWN0aW9ucyA9IHdpbmRvdy5sYXlvdXRJbnN0cnVjdGlvbnMgfHwgW107XG5cbiAgLy8gU25hcHNob3Qgc3RhdGUgYmVmb3JlIGFwcGx5aW5nIHNvIFVuZG8gY2FuIHJlc3RvcmUgaXQuXG4gIF9sYXlvdXRVbmRvU3RhY2sucHVzaCh7XG4gICAgaHRtbDogY3VycmVudEh0bWwsXG4gICAgaW5zdHJ1Y3Rpb25zOiAod2luZG93LmxheW91dEluc3RydWN0aW9ucyB8fCBbXSkubWFwKGkgPT4gKHsgLi4uaSB9KSksXG4gIH0pO1xuICBpZiAoX2xheW91dFVuZG9TdGFjay5sZW5ndGggPiBfVU5ET19TVEFDS19NQVgpIHtcbiAgICBfbGF5b3V0VW5kb1N0YWNrLnNoaWZ0KCk7XG4gIH1cblxuICB0cnkge1xuICAgIHNob3dQcm9jZXNzaW5nKHRydWUpO1xuXG4gICAgLy8gUHJlZmVyIHRoZSBzZXNzaW9uLWJhY2tlZCBlbmRwb2ludDsgaXQgbWFuYWdlcyBIVE1MIHNlcnZlci1zaWRlLlxuICAgIGxldCByZXNwb25zZTtcbiAgICBjb25zdCBnZW5TdGF0ZSA9IHN0YXRlTWFuYWdlcj8uZ2V0R2VuZXJhdGlvblN0YXRlPy4oKSB8fCB7fTtcbiAgICBjb25zdCB1c2VTZXNzaW9uRW5kcG9pbnQgPSBnZW5TdGF0ZS5wcmV2aWV3QXZhaWxhYmxlIHx8IGdlblN0YXRlLnBoYXNlID09PSAnbGF5b3V0X3Jldmlldyc7XG5cbiAgICBpZiAodXNlU2Vzc2lvbkVuZHBvaW50KSB7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IGFwaUNhbGwoJ1BPU1QnLCAnL2FwaS9jdi9sYXlvdXQtcmVmaW5lJywge1xuICAgICAgICBpbnN0cnVjdGlvbjogaW5zdHJ1Y3Rpb25UZXh0LFxuICAgICAgICBjb250ZW50X3JldmlzaW9uOiBnZXRDdXJyZW50Q29udGVudFJldmlzaW9uKCksXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCBhcGlDYWxsKCdQT1NUJywgJy9hcGkvbGF5b3V0LWluc3RydWN0aW9uJywge1xuICAgICAgICBpbnN0cnVjdGlvbjogaW5zdHJ1Y3Rpb25UZXh0LFxuICAgICAgICBjdXJyZW50X2h0bWw6IGN1cnJlbnRIdG1sLFxuICAgICAgICBwcmlvcl9pbnN0cnVjdGlvbnM6IHByaW9ySW5zdHJ1Y3Rpb25zLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgaWYgKHJlc3BvbnNlLmVycm9yID09PSAnY2xhcmlmeScpIHtcbiAgICAgICAgc2hvd0NsYXJpZmljYXRpb25EaWFsb2cocmVzcG9uc2UucXVlc3Rpb24sIGluc3RydWN0aW9uVGV4dCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhcHBlbmRMYXlvdXRTYWZldHlBbGVydChyZXNwb25zZS5zYWZldHlfYWxlcnQpO1xuICAgICAgICBsZXQgZXJyb3JIdG1sID0gYFx1MjZBMFx1RkUwRiBFcnJvcjogJHtlc2NhcGVIdG1sKHJlc3BvbnNlLmVycm9yKX0gXHUyMDE0ICR7ZXNjYXBlSHRtbChyZXNwb25zZS5kZXRhaWxzIHx8ICcnKX1gO1xuICAgICAgICBpZiAocmVzcG9uc2UucmF3X3Jlc3BvbnNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBlcnJvckh0bWwgKz0gYDxicj48ZGV0YWlscyBzdHlsZT1cIm1hcmdpbi10b3A6NnB4XCI+PHN1bW1hcnkgc3R5bGU9XCJjdXJzb3I6cG9pbnRlcjtmb250LXNpemU6MC44NWVtO2NvbG9yOiM2NDc0OGJcIj5SYXcgTExNIHJlc3BvbnNlPC9zdW1tYXJ5PjxwcmUgc3R5bGU9XCJmb250LXNpemU6MC43NWVtO3doaXRlLXNwYWNlOnByZS13cmFwO3dvcmQtYnJlYWs6YnJlYWstYWxsO21heC1oZWlnaHQ6MjAwcHg7b3ZlcmZsb3cteTphdXRvO2JhY2tncm91bmQ6I2Y4ZmFmYztib3JkZXI6MXB4IHNvbGlkICNlMmU4ZjA7Ym9yZGVyLXJhZGl1czo0cHg7cGFkZGluZzo4cHg7bWFyZ2luLXRvcDo0cHhcIj4ke2VzY2FwZUh0bWwocmVzcG9uc2UucmF3X3Jlc3BvbnNlIHx8ICcoZW1wdHkpJyl9PC9wcmU+PC9kZXRhaWxzPmA7XG4gICAgICAgIH1cbiAgICAgICAgYXBwZW5kTWVzc2FnZUh0bWwoJ3N5c3RlbScsIGVycm9ySHRtbCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHByZXZpZXcgd2l0aCBuZXcgSFRNTFxuICAgIGNvbnN0IG5ld0h0bWwgPSByZXNwb25zZS5odG1sO1xuICAgIGRpc3BsYXlMYXlvdXRQcmV2aWV3KG5ld0h0bWwpO1xuXG4gICAgYXBwZW5kTGF5b3V0U2FmZXR5QWxlcnQocmVzcG9uc2Uuc2FmZXR5X2FsZXJ0KTtcblxuICAgIC8vIFVwZGF0ZSBzdGF0ZVxuICAgIHNldFByZXZpZXdIdG1sKG5ld0h0bWwpO1xuICAgIGRpc21pc3NlZFN0YWxlQ2FsbG91dFJldmlzaW9uID0gbnVsbDtcbiAgICBzdGF0ZU1hbmFnZXI/Lm1hcmtQcmV2aWV3R2VuZXJhdGVkPy4oe1xuICAgICAgcHJldmlld0F2YWlsYWJsZTogdHJ1ZSxcbiAgICAgIHByZXZpZXdPdXRwdXRzOiByZXNwb25zZS5wcmV2aWV3X291dHB1dHMgfHwgbnVsbCxcbiAgICAgIGxheW91dENvbmZpcm1lZDogZmFsc2UsXG4gICAgICBwYWdlQ291bnRFc3RpbWF0ZTogcmVzcG9uc2UucGFnZV9jb3VudF9lc3RpbWF0ZSA/PyBudWxsLFxuICAgICAgcGFnZUNvdW50RXhhY3Q6IHJlc3BvbnNlLnBhZ2VfY291bnRfZXhhY3QgPz8gbnVsbCxcbiAgICAgIHBhZ2VDb3VudENvbmZpZGVuY2U6IHJlc3BvbnNlLnBhZ2VfY291bnRfY29uZmlkZW5jZSA/PyBudWxsLFxuICAgICAgcGFnZUNvdW50U291cmNlOiByZXNwb25zZS5wYWdlX2NvdW50X3NvdXJjZSB8fCBudWxsLFxuICAgICAgcGFnZVdhcm5pbmc6IEJvb2xlYW4ocmVzcG9uc2UucGFnZV9sZW5ndGhfd2FybmluZyksXG4gICAgICBwcmV2aWV3R2VuZXJhdGVkQXQ6IHJlc3BvbnNlLnByZXZpZXdfZ2VuZXJhdGVkX2F0IHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHByZXZpZXdSZXF1ZXN0SWQ6IHJlc3BvbnNlLnByZXZpZXdfcmVxdWVzdF9pZCB8fCBudWxsLFxuICAgIH0pO1xuICAgIHJlbmRlclByZXZpZXdPdXRwdXRTdGF0dXMocmVzcG9uc2UucHJldmlld19vdXRwdXRzIHx8IG51bGwpO1xuXG4gICAgLy8gQWRkIHRvIGluc3RydWN0aW9uIGhpc3RvcnlcbiAgICBjb25zdCBpbnN0cnVjdGlvbiA9IHtcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0xvY2FsZVRpbWVTdHJpbmcoKSxcbiAgICAgIGluc3RydWN0aW9uX3RleHQ6IGluc3RydWN0aW9uVGV4dCxcbiAgICAgIGNoYW5nZV9zdW1tYXJ5OiByZXNwb25zZS5zdW1tYXJ5LFxuICAgICAgY29uZmlybWF0aW9uOiB0cnVlXG4gICAgfTtcbiAgICBhZGRUb0luc3RydWN0aW9uSGlzdG9yeShpbnN0cnVjdGlvbik7XG5cbiAgICAvLyBTaG93IGNvbmZpcm1hdGlvblxuICAgIHNob3dDb25maXJtYXRpb25NZXNzYWdlKGAke3Jlc3BvbnNlLnNhZmV0eV9hbGVydD8uZmxhZ2dlZCA/ICdcdTI2QTBcdUZFMEYgJyA6ICdcdTI3MDUgJ30ke3Jlc3BvbnNlLnN1bW1hcnl9YCk7XG5cbiAgICAvLyBDbGVhciBpbnB1dCBhbmQgcmVmcmVzaCB0aGUgc3RhZ2VkIGNvbnRyb2xzLlxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnN0cnVjdGlvbi1pbnB1dCcpLnZhbHVlID0gJyc7XG4gICAgcmVmcmVzaExheW91dFJldmlld1N0YXRlKCk7XG5cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCBgXHUyNzRDIENvdWxkIG5vdCBhcHBseSB0aGUgbGF5b3V0IGluc3RydWN0aW9uLiBUcnkgcmVwaHJhc2luZyBpdCwgb3IgY2xpY2sgXCJSZWdlbmVyYXRlIFByZXZpZXdcIiB0byByZXNldCBhbmQgdHJ5IGFnYWluLmApO1xuICB9IGZpbmFsbHkge1xuICAgIHNob3dQcm9jZXNzaW5nKGZhbHNlKTtcbiAgfVxufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBtYXJrUHJldmlld0dlbmVyYXRlZCBwYXlsb2FkIGZyb20gYSAvYXBpL2N2L2dlbmVyYXRlLXByZXZpZXcgcmVzcG9uc2UuXG4gKiBAcGFyYW0ge09iamVjdH0gZGF0YSAtIFJlc3BvbnNlIGZyb20gdGhlIGdlbmVyYXRlLXByZXZpZXcgZW5kcG9pbnQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBQYXlsb2FkIHN1aXRhYmxlIGZvciBzdGF0ZU1hbmFnZXIubWFya1ByZXZpZXdHZW5lcmF0ZWQoKS5cbiAqL1xuZnVuY3Rpb24gX2J1aWxkUHJldmlld1BheWxvYWQoZGF0YSkge1xuICByZXR1cm4ge1xuICAgIHByZXZpZXdBdmFpbGFibGU6ICAgIHRydWUsXG4gICAgcHJldmlld091dHB1dHM6ICAgICAgZGF0YS5wcmV2aWV3X291dHB1dHMgICAgICB8fCBudWxsLFxuICAgIHBhZ2VDb3VudEVzdGltYXRlOiAgIGRhdGEucGFnZV9jb3VudF9lc3RpbWF0ZSAgPz8gbnVsbCxcbiAgICBwYWdlQ291bnRFeGFjdDogICAgICBkYXRhLnBhZ2VfY291bnRfZXhhY3QgICAgICA/PyBudWxsLFxuICAgIHBhZ2VDb3VudENvbmZpZGVuY2U6IGRhdGEucGFnZV9jb3VudF9jb25maWRlbmNlID8/IG51bGwsXG4gICAgcGFnZUNvdW50U291cmNlOiAgICAgZGF0YS5wYWdlX2NvdW50X3NvdXJjZSAgICAgfHwgbnVsbCxcbiAgICBwYWdlV2FybmluZzogICAgICAgICBCb29sZWFuKGRhdGEucGFnZV9sZW5ndGhfd2FybmluZyksXG4gICAgcHJldmlld0dlbmVyYXRlZEF0OiAgZGF0YS5wcmV2aWV3X2dlbmVyYXRlZF9hdCAgfHwgbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIHByZXZpZXdSZXF1ZXN0SWQ6ICAgIGRhdGEucHJldmlld19yZXF1ZXN0X2lkICAgIHx8IG51bGwsXG4gIH07XG59XG5cbi8qKlxuICogRmV0Y2ggdGhlIENWIEhUTUwgcHJldmlldyB2aWEgdGhlIHN0YWdlZCBnZW5lcmF0aW9uIGNvbnRyYWN0LlxuICpcbiAqIFN0cmF0ZWd5IGRlcGVuZHMgb24gdGhlIGN1cnJlbnQgZ2VuZXJhdGlvbiBzdGF0ZTpcbiAqXG4gKiAtIHBoYXNlIGlzIG5vdCBjb25maXJtZWQvZmluYWxfY29tcGxldGU6XG4gKiAgIEFsd2F5cyBjYWxscyBQT1NUIC9hcGkvY3YvZ2VuZXJhdGUtcHJldmlldywgd2hpY2ggc3RvcmVzIHByZXZpZXdfaHRtbCBpblxuICogICBnZW5lcmF0aW9uX3N0YXRlIChyZXF1aXJlZCBmb3IgY29uZmlybS1sYXlvdXQpIGFuZCBjYWxscyBtYXJrUHJldmlld0dlbmVyYXRlZC5cbiAqICAgVGhpcyBib290c3RyYXBzIHRoZSBzdGFnZWQgc3RhdGUgZXZlbiBhZnRlciBsZWdhY3kgZ2VuZXJhdGVfY3YgYWN0aW9ucyB0aGF0XG4gKiAgIHdyaXRlIGZpbGVzIHRvIGRpc2sgd2l0aG91dCBwb3B1bGF0aW5nIGdlbmVyYXRpb25fc3RhdGUucHJldmlld19odG1sLlxuICogICBGYWxscyBiYWNrIHRvIEdFVCAvYXBpL2xheW91dC1odG1sIChwYXNzaXZlLCBubyBzdGF0ZSBjaGFuZ2UpIHdoZW5cbiAqICAgZ2VuZXJhdGUtcHJldmlldyBpcyB1bmF2YWlsYWJsZSAoZS5nLiBzZXNzaW9uIGhhcyBubyBqb2JfYW5hbHlzaXMgeWV0KS5cbiAqXG4gKiAtIHBoYXNlIGlzIGNvbmZpcm1lZC9maW5hbF9jb21wbGV0ZSAocGFzc2l2ZSByZXN0b3JlKTpcbiAqICAgUmVhZHMgSFRNTCBmcm9tIGRpc2sgdmlhIEdFVCAvYXBpL2xheW91dC1odG1sIHdpdGhvdXQgdG91Y2hpbmcgc2Vzc2lvbiBzdGF0ZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gX2ZldGNoQW5kRGlzcGxheUxheW91dFByZXZpZXcoKSB7XG4gIGNvbnN0IGdlblN0YXRlICAgID0gc3RhdGVNYW5hZ2VyPy5nZXRHZW5lcmF0aW9uU3RhdGU/LigpIHx8IHt9O1xuICBjb25zdCBpc0NvbmZpcm1lZCA9IGdlblN0YXRlLnBoYXNlID09PSBHRU5FUkFUSU9OX1BIQVNFUy5DT05GSVJNRURcbiAgICAgICAgICAgICAgICAgICB8fCBnZW5TdGF0ZS5waGFzZSA9PT0gR0VORVJBVElPTl9QSEFTRVMuRklOQUxfQ09NUExFVEU7XG5cbiAgc2hvd1ByZXZpZXdMb2FkaW5nKHRydWUsIGlzQ29uZmlybWVkID8gJ0xvYWRpbmcgc2F2ZWQgbGF5b3V0XHUyMDI2JyA6ICdHZW5lcmF0aW5nIHByZXZpZXdcdTIwMjYnKTtcbiAgdHJ5IHtcbiAgICAvLyBGcmVzaC1yZW5kZXIgcGF0aDogYWx3YXlzIHBvcHVsYXRlIGdlbmVyYXRpb25fc3RhdGUucHJldmlld19odG1sIG9uIHRoZSBiYWNrZW5kXG4gICAgLy8gc28gdGhhdCBjb25maXJtLWxheW91dCBzdWNjZWVkcy4gQ292ZXJzIGJvdGggdGhlIG5vcm1hbCBzdGFnZWQgcGF0aCBhbmQgdGhlXG4gICAgLy8gbGVnYWN5IGdlbmVyYXRlX2N2IHBhdGggdGhhdCBkb2VzIG5vdCBjYWxsIGdlbmVyYXRlLXByZXZpZXcgaXRzZWxmLlxuICAgIGlmICghaXNDb25maXJtZWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBhcGlDYWxsKCdQT1NUJywgJy9hcGkvY3YvZ2VuZXJhdGUtcHJldmlldycsIHt9KTtcbiAgICAgICAgaWYgKGRhdGEub2sgJiYgZGF0YS5odG1sKSB7XG4gICAgICAgICAgZGlzcGxheUxheW91dFByZXZpZXcoZGF0YS5odG1sKTtcbiAgICAgICAgICBzZXRQcmV2aWV3SHRtbChkYXRhLmh0bWwpO1xuICAgICAgICAgIGRpc21pc3NlZFN0YWxlQ2FsbG91dFJldmlzaW9uID0gbnVsbDtcbiAgICAgICAgICBzdGF0ZU1hbmFnZXI/Lm1hcmtQcmV2aWV3R2VuZXJhdGVkPy4oX2J1aWxkUHJldmlld1BheWxvYWQoZGF0YSkpO1xuICAgICAgICAgIHJlbmRlclByZXZpZXdPdXRwdXRTdGF0dXMoZGF0YS5wcmV2aWV3X291dHB1dHMgfHwgbnVsbCk7XG4gICAgICAgICAgcmVmcmVzaExheW91dFJldmlld1N0YXRlKCk7XG4gICAgICAgICAgKGRhdGEuY29udGVudF93YXJuaW5ncyB8fCBbXSkuZm9yRWFjaCh3ID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc2hvd1RvYXN0ID09PSAnZnVuY3Rpb24nKSBzaG93VG9hc3Qody5tZXNzYWdlLCAnd2FybmluZycsIDgwMDApO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoX2UpIHtcbiAgICAgICAgLy8gZmFsbCB0aHJvdWdoIHRvIGxlZ2FjeSBkaXNrIHJlYWRcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQYXNzaXZlIHJlc3RvcmUgcGF0aDogbG9hZCBzdG9yZWQgSFRNTCBmcm9tIGRpc2sgd2l0aG91dCB0b3VjaGluZyBnZW5lcmF0aW9uIHN0YXRlLlxuICAgIC8vIFVzZWQgZm9yIGNvbmZpcm1lZC9maW5hbF9jb21wbGV0ZSBsYXlvdXRzLCBvciBhcyBmYWxsYmFjayB3aGVuIGdlbmVyYXRlLXByZXZpZXdcbiAgICAvLyBpcyB1bmF2YWlsYWJsZSAoZS5nLiBzZXNzaW9uIGhhcyBubyBqb2JfYW5hbHlzaXMgeWV0KS5cbiAgICB0cnkge1xuICAgICAgc2hvd1ByZXZpZXdMb2FkaW5nKHRydWUsICdMb2FkaW5nIHN0b3JlZCBsYXlvdXRcdTIwMjYnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBhcGlDYWxsKCdHRVQnLCAnL2FwaS9sYXlvdXQtaHRtbCcpO1xuICAgICAgaWYgKGRhdGEub2sgJiYgZGF0YS5odG1sKSB7XG4gICAgICAgIGRpc3BsYXlMYXlvdXRQcmV2aWV3KGRhdGEuaHRtbCk7XG4gICAgICAgIHNldFByZXZpZXdIdG1sKGRhdGEuaHRtbCk7XG4gICAgICAgIHJlZnJlc2hMYXlvdXRSZXZpZXdTdGF0ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsb2cud2FybignTGF5b3V0IHByZXZpZXcgbm90IGF2YWlsYWJsZTonLCBkYXRhLmVycm9yIHx8ICdubyBIVE1MIHJldHVybmVkJyk7XG4gICAgfSBjYXRjaCAoX2UpIHtcbiAgICAgIC8vIG5vIHByZXZpZXcgYXZhaWxhYmxlXG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIHNob3dQcmV2aWV3TG9hZGluZyhmYWxzZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBEaXNwbGF5IEhUTUwgcHJldmlldyBpbiBpZnJhbWUuXG4gKi9cbmZ1bmN0aW9uIGRpc3BsYXlMYXlvdXRQcmV2aWV3KGh0bWwpIHtcbiAgY29uc3QgcHJldmlldyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYXlvdXQtcHJldmlldycpO1xuICBpZiAoIXByZXZpZXcpIHJldHVybjtcblxuICBzaG93UHJldmlld0xvYWRpbmcoZmFsc2UpO1xuICBwcmV2aWV3Lm9ubG9hZCA9ICgpID0+IGZpdExheW91dFByZXZpZXdUb1BhbmUocHJldmlldyk7XG4gIHByZXZpZXcuc2V0QXR0cmlidXRlKCdzYW5kYm94JywgJ2FsbG93LXNhbWUtb3JpZ2luJyk7XG4gIHByZXZpZXcuc2V0QXR0cmlidXRlKCdyZWZlcnJlcnBvbGljeScsICduby1yZWZlcnJlcicpO1xuICBwcmV2aWV3LnNyY2RvYyA9IGh0bWw7XG5cbiAgY29uc3QgZG9jID0gcHJldmlldy5jb250ZW50RG9jdW1lbnQgfHwgcHJldmlldy5jb250ZW50V2luZG93Py5kb2N1bWVudDtcbiAgaWYgKGRvYz8ucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykge1xuICAgIGZpdExheW91dFByZXZpZXdUb1BhbmUocHJldmlldyk7XG4gIH1cbn1cblxuLyoqXG4gKiBTY2FsZSB0aGUgcHJldmlldyBzbyBhbiBlbnRpcmUgQ1YgcGFnZSB3aWR0aCBmaXRzIHdpdGhpbiB0aGUgcHJldmlldyBwYW5lLlxuICovXG5mdW5jdGlvbiBmaXRMYXlvdXRQcmV2aWV3VG9QYW5lKHByZXZpZXcpIHtcbiAgY29uc3QgZG9jID0gcHJldmlldz8uY29udGVudERvY3VtZW50IHx8IHByZXZpZXc/LmNvbnRlbnRXaW5kb3c/LmRvY3VtZW50O1xuICBjb25zdCBjb250YWluZXIgPSBwcmV2aWV3Py5jbG9zZXN0KCcucHJldmlldy1pZnJhbWUtY29udGFpbmVyJyk7XG4gIGlmICghZG9jIHx8ICFjb250YWluZXIpIHJldHVybjtcblxuICBjb25zdCBwYWdlQ29udGFpbmVyID0gZG9jLnF1ZXJ5U2VsZWN0b3IoJy5wYWdlLWNvbnRhaW5lcicpIHx8IGRvYy5ib2R5O1xuICBpZiAoIXBhZ2VDb250YWluZXIpIHJldHVybjtcblxuICBjb25zdCBjb250YWluZXJXaWR0aCA9IE1hdGgubWF4KGNvbnRhaW5lci5jbGllbnRXaWR0aCAtIDI0LCAxKTtcbiAgY29uc3QgY29udGVudFdpZHRoID0gTWF0aC5tYXgoXG4gICAgTWF0aC5jZWlsKHBhZ2VDb250YWluZXIuc2Nyb2xsV2lkdGggfHwgMCksXG4gICAgTWF0aC5jZWlsKHBhZ2VDb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggfHwgMCksXG4gICAgMVxuICApO1xuICBjb25zdCBzY2FsZSA9IE1hdGgubWluKDEsIGNvbnRhaW5lcldpZHRoIC8gY29udGVudFdpZHRoKTtcblxuICBkb2MuZG9jdW1lbnRFbGVtZW50LnN0eWxlLmJhY2tncm91bmQgPSAnI2Y4ZmFmYyc7XG4gIGRvYy5ib2R5LnN0eWxlLm1hcmdpbiA9ICcwJztcbiAgZG9jLmJvZHkuc3R5bGUucGFkZGluZyA9ICcwJztcbiAgZG9jLmJvZHkuc3R5bGUuYmFja2dyb3VuZCA9ICcjZjhmYWZjJztcbiAgZG9jLmJvZHkuc3R5bGUub3ZlcmZsb3dYID0gJ2F1dG8nO1xuXG4gIHBhZ2VDb250YWluZXIuc3R5bGUuem9vbSA9IGAke3NjYWxlfWA7XG4gIHBhZ2VDb250YWluZXIuc3R5bGUudHJhbnNmb3JtID0gJyc7XG4gIHBhZ2VDb250YWluZXIuc3R5bGUudHJhbnNmb3JtT3JpZ2luID0gJyc7XG4gIHBhZ2VDb250YWluZXIuc3R5bGUubWFyZ2luID0gJzEycHgnO1xuICBwcmV2aWV3LnN0eWxlLm1pbldpZHRoID0gJyc7XG59XG5cbi8qKlxuICogQWRkIGluc3RydWN0aW9uIHRvIGhpc3RvcnkgcGFuZWwuXG4gKi9cbmZ1bmN0aW9uIGFkZFRvSW5zdHJ1Y3Rpb25IaXN0b3J5KGluc3RydWN0aW9uKSB7XG4gIC8vIEluaXRpYWxpemUgZ2xvYmFsIGluc3RydWN0aW9uIGxpc3QgaWYgbmVlZGVkXG4gIGlmICghd2luZG93LmxheW91dEluc3RydWN0aW9ucykge1xuICAgIHdpbmRvdy5sYXlvdXRJbnN0cnVjdGlvbnMgPSBbXTtcbiAgfVxuXG4gIHdpbmRvdy5sYXlvdXRJbnN0cnVjdGlvbnMucHVzaChub3JtYWxpemVMYXlvdXRJbnN0cnVjdGlvbihpbnN0cnVjdGlvbikpO1xuICByZW5kZXJJbnN0cnVjdGlvbkhpc3RvcnkoKTtcbn1cblxuLyoqXG4gKiBSZW5kZXIgaW5zdHJ1Y3Rpb24gaGlzdG9yeSBmcm9tIGN1cnJlbnQgc3RhdGUgd2l0aG91dCBtdXRhdGluZyBpdC5cbiAqL1xuZnVuY3Rpb24gcmVuZGVySW5zdHJ1Y3Rpb25IaXN0b3J5KCkge1xuICBjb25zdCBoaXN0b3J5TGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnN0cnVjdGlvbi1oaXN0b3J5Jyk7XG4gIGlmICghaGlzdG9yeUxpc3QpIHJldHVybjtcblxuICBjb25zdCBpbnN0cnVjdGlvbnMgPSB3aW5kb3cubGF5b3V0SW5zdHJ1Y3Rpb25zIHx8IFtdO1xuICBoaXN0b3J5TGlzdC5pbm5lckhUTUwgPSAnJztcbiAgY29uc3QgbGFzdElkeCA9IGluc3RydWN0aW9ucy5sZW5ndGggLSAxO1xuICBpbnN0cnVjdGlvbnMuZm9yRWFjaCgoaW5zdHJ1Y3Rpb24sIGluZGV4KSA9PiB7XG4gICAgY29uc3QgZW50cnkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBlbnRyeS5jbGFzc05hbWUgPSAnaW5zdHJ1Y3Rpb24taGlzdG9yeS1lbnRyeSc7XG4gICAgY29uc3QgaXNMYXN0ID0gaW5kZXggPT09IGxhc3RJZHg7XG4gICAgY29uc3QgdW5kb0h0bWwgPSBpc0xhc3RcbiAgICAgID8gYDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuLXNtXCIgb25jbGljaz1cInVuZG9JbnN0cnVjdGlvbigke2luZGV4fSlcIj5cdTIxQTkgVW5kbzwvYnV0dG9uPmBcbiAgICAgIDogYDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuLXNtXCIgZGlzYWJsZWQgdGl0bGU9XCJVbmRvIGlzIHNlcXVlbnRpYWwgXHUyMDE0IHVuZG8gdGhlIG1vc3QgcmVjZW50IGluc3RydWN0aW9uIGZpcnN0XCJcbiAgICAgICAgICAgc3R5bGU9XCJvcGFjaXR5OjAuMztjdXJzb3I6bm90LWFsbG93ZWQ7XCI+XHUyMUE5IFVuZG88L2J1dHRvbj5gO1xuICAgIGVudHJ5LmlubmVySFRNTCA9IGBcbiAgICAgIDxkaXYgY2xhc3M9XCJpbnN0cnVjdGlvbi10aW1lXCI+JHtpbnN0cnVjdGlvbi50aW1lc3RhbXAgfHwgJyd9PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiaW5zdHJ1Y3Rpb24tdGV4dFwiPiR7ZXNjYXBlSHRtbChpbnN0cnVjdGlvbi5pbnN0cnVjdGlvbl90ZXh0IHx8ICcnKX08L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbnN0cnVjdGlvbi1zdW1tYXJ5XCI+PGVtPiR7ZXNjYXBlSHRtbChpbnN0cnVjdGlvbi5jaGFuZ2Vfc3VtbWFyeSB8fCAnJyl9PC9lbT48L2Rpdj5cbiAgICAgICR7dW5kb0h0bWx9XG4gICAgYDtcbiAgICBoaXN0b3J5TGlzdC5hcHBlbmRDaGlsZChlbnRyeSk7XG4gIH0pO1xuXG4gIC8vIFVwZGF0ZSBjb3VudFxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5zdHJ1Y3Rpb24tY291bnQnKS50ZXh0Q29udGVudCA9ICh3aW5kb3cubGF5b3V0SW5zdHJ1Y3Rpb25zIHx8IFtdKS5sZW5ndGg7XG59XG5cbi8qKlxuICogUmVzdG9yZSBpbnN0cnVjdGlvbiBoaXN0b3J5IGZyb20gc2Vzc2lvbiBzdGF0ZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbG9hZExheW91dEluc3RydWN0aW9uSGlzdG9yeSgpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGFwaUNhbGwoJ0dFVCcsICcvYXBpL2xheW91dC1oaXN0b3J5Jyk7XG4gICAgaWYgKCFyZXNwb25zZT8uaW5zdHJ1Y3Rpb25zIHx8ICFBcnJheS5pc0FycmF5KHJlc3BvbnNlLmluc3RydWN0aW9ucykpIHtcbiAgICAgIHJldHVybiB3aW5kb3cubGF5b3V0SW5zdHJ1Y3Rpb25zIHx8IFtdO1xuICAgIH1cblxuICAgIHJldHVybiByZXNwb25zZS5pbnN0cnVjdGlvbnMubWFwKChpbnN0cnVjdGlvbikgPT4gbm9ybWFsaXplTGF5b3V0SW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb24pKTtcbiAgfSBjYXRjaCAoX2Vycm9yKSB7XG4gICAgcmV0dXJuIHdpbmRvdy5sYXlvdXRJbnN0cnVjdGlvbnMgfHwgW107XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVzdG9yZUluc3RydWN0aW9uSGlzdG9yeSgpIHtcbiAgd2luZG93LmxheW91dEluc3RydWN0aW9ucyA9IGF3YWl0IGxvYWRMYXlvdXRJbnN0cnVjdGlvbkhpc3RvcnkoKTtcbiAgcmVuZGVySW5zdHJ1Y3Rpb25IaXN0b3J5KCk7XG4gIHJlZnJlc2hMYXlvdXRSZXZpZXdTdGF0ZSgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVSZWdlbmVyYXRlUHJldmlld0FjdGlvbigpIHtcbiAgdHJ5IHtcbiAgICBzaG93UHJvY2Vzc2luZyh0cnVlKTtcbiAgICBhd2FpdCBfZmV0Y2hBbmREaXNwbGF5TGF5b3V0UHJldmlldygpO1xuICAgIHNob3dDb25maXJtYXRpb25NZXNzYWdlKCdcdTI3MDUgUHJldmlldyByZWdlbmVyYXRlZCBmcm9tIHRoZSBsYXRlc3QgY29udGVudC4nKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCBgXHUyNzRDIENvdWxkIG5vdCByZWdlbmVyYXRlIHRoZSBwcmV2aWV3LiBDaGVjayB0aGF0IHlvdXIgc2Vzc2lvbiBpcyBhY3RpdmUgYW5kIHRyeSBhZ2Fpbi4gSWYgdGhlIHByb2JsZW0gcGVyc2lzdHMsIHJlbG9hZCB0aGUgcGFnZS5gKTtcbiAgICBzaG93UHJldmlld0xvYWRpbmcoZmFsc2UpO1xuICB9IGZpbmFsbHkge1xuICAgIHNob3dQcm9jZXNzaW5nKGZhbHNlKTtcbiAgfVxufVxuXG4vKipcbiAqIFNob3cgcHJvY2Vzc2luZyBzcGlubmVyIChyaWdodC1wYW5lIGluZGljYXRvciBmb3IgbGF5b3V0LWluc3RydWN0aW9uIGFwcGx5KS5cbiAqL1xuZnVuY3Rpb24gc2hvd1Byb2Nlc3Npbmcoc2hvdykge1xuICBjb25zdCBpbmRpY2F0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJvY2Vzc2luZy1pbmRpY2F0b3InKTtcbiAgaWYgKGluZGljYXRvcikge1xuICAgIGluZGljYXRvci5zdHlsZS5kaXNwbGF5ID0gc2hvdyA/ICdibG9jaycgOiAnbm9uZSc7XG4gIH1cbn1cblxuLyoqXG4gKiBTaG93IG9yIGhpZGUgdGhlIHByZXZpZXctYXJlYSBsb2FkaW5nIG92ZXJsYXkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHNob3dcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbG9nVGV4dF0gT3B0aW9uYWwgc3RhdHVzIGxpbmUgc2hvd24gYmVsb3cgdGhlIHNwaW5uZXIuXG4gKi9cbmZ1bmN0aW9uIHNob3dQcmV2aWV3TG9hZGluZyhzaG93LCBsb2dUZXh0ID0gJycpIHtcbiAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcmV2aWV3LWxvYWRpbmctb3ZlcmxheScpO1xuICBpZiAoIW92ZXJsYXkpIHJldHVybjtcbiAgb3ZlcmxheS5zdHlsZS5kaXNwbGF5ID0gc2hvdyA/ICdmbGV4JyA6ICdub25lJztcbiAgY29uc3QgbG9nRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJldmlldy1sb2FkaW5nLWxvZycpO1xuICBpZiAobG9nRWwpIGxvZ0VsLnRleHRDb250ZW50ID0gbG9nVGV4dDtcbn1cblxuLyoqXG4gKiBTaG93IGNvbmZpcm1hdGlvbiBtZXNzYWdlLlxuICovXG5mdW5jdGlvbiBzaG93Q29uZmlybWF0aW9uTWVzc2FnZShtZXNzYWdlKSB7XG4gIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29uZmlybWF0aW9uLW1lc3NhZ2UnKTtcbiAgaWYgKCFlbGVtZW50KSByZXR1cm47XG5cbiAgZWxlbWVudC50ZXh0Q29udGVudCA9IG1lc3NhZ2U7XG4gIGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG5cbiAgLy8gQXV0by1oaWRlIGFmdGVyIDMgc2Vjb25kc1xuICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIH0sIDMwMDApO1xufVxuXG4vKipcbiAqIFNob3cgaW5saW5lIGNsYXJpZmljYXRpb24gcGFuZWwgd2hlbiBMTE0gbmVlZHMgbW9yZSBpbmZvLlxuICogUmVwbGFjZXMgd2luZG93LnByb21wdCgpIHdpdGggYW4gYWNjZXNzaWJsZSBpbmxpbmUgZm9ybS5cbiAqL1xuZnVuY3Rpb24gc2hvd0NsYXJpZmljYXRpb25EaWFsb2cocXVlc3Rpb24sIG9yaWdpbmFsSW5zdHJ1Y3Rpb24pIHtcbiAgY29uc3QgaW5wdXRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnN0cnVjdGlvbi1pbnB1dCcpO1xuICBjb25zdCBjb250YWluZXIgPSBpbnB1dEVsID8gaW5wdXRFbC5jbG9zZXN0KCdkaXYnKSB8fCBpbnB1dEVsLnBhcmVudE5vZGUgOiBudWxsO1xuICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuO1xuXG4gIGNvbnN0IGV4aXN0aW5nUGFuZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGF5b3V0LWNsYXJpZmljYXRpb24tcGFuZWwnKTtcbiAgaWYgKGV4aXN0aW5nUGFuZWwpIGV4aXN0aW5nUGFuZWwucmVtb3ZlKCk7XG5cbiAgY29uc3QgcGFuZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgcGFuZWwuaWQgPSAnbGF5b3V0LWNsYXJpZmljYXRpb24tcGFuZWwnO1xuICBwYW5lbC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnYWxlcnQnKTtcbiAgcGFuZWwuc3R5bGUuY3NzVGV4dCA9ICdiYWNrZ3JvdW5kOiNmZWY5YzM7Ym9yZGVyOjFweCBzb2xpZCAjZmRlMDQ3O2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MTRweDttYXJnaW4tdG9wOjEwcHg7JztcbiAgcGFuZWwuaW5uZXJIVE1MID0gYFxuICAgIDxwIHN0eWxlPVwibWFyZ2luOjAgMCA4cHg7Zm9udC1zaXplOjAuOWVtO2NvbG9yOiM5MjQwMGU7Zm9udC13ZWlnaHQ6NjAwO1wiPlxuICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+XHUyNzUzPC9zcGFuPiBDbGFyaWZpY2F0aW9uIG5lZWRlZFxuICAgIDwvcD5cbiAgICA8cCBzdHlsZT1cIm1hcmdpbjowIDAgMTBweDtmb250LXNpemU6MC44OGVtO2NvbG9yOiM3ODM1MGY7XCI+JHtlc2NhcGVIdG1sKHF1ZXN0aW9uKX08L3A+XG4gICAgPGxhYmVsIGZvcj1cImxheW91dC1jbGFyaWZpY2F0aW9uLWlucHV0XCIgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjojMzc0MTUxO2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWJvdHRvbTo0cHg7XCI+XG4gICAgICBZb3VyIGNsYXJpZmljYXRpb246XG4gICAgPC9sYWJlbD5cbiAgICA8dGV4dGFyZWEgaWQ9XCJsYXlvdXQtY2xhcmlmaWNhdGlvbi1pbnB1dFwiIHJvd3M9XCIyXCJcbiAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTtib3gtc2l6aW5nOmJvcmRlci1ib3g7cGFkZGluZzo4cHg7Ym9yZGVyOjFweCBzb2xpZCAjZmRlMDQ3O2JvcmRlci1yYWRpdXM6NHB4O2ZvbnQtc2l6ZTowLjg4ZW07cmVzaXplOnZlcnRpY2FsO1wiXG4gICAgICBhcmlhLWxhYmVsPVwiQ2xhcmlmaWNhdGlvbiBmb3IgbGF5b3V0IGluc3RydWN0aW9uXCI+JHtlc2NhcGVIdG1sKG9yaWdpbmFsSW5zdHJ1Y3Rpb24pfTwvdGV4dGFyZWE+XG4gICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6OHB4O21hcmdpbi10b3A6OHB4O1wiPlxuICAgICAgPGJ1dHRvbiBpZD1cImxheW91dC1jbGFyaWZpY2F0aW9uLXN1Ym1pdFwiXG4gICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDojZDk3NzA2O2NvbG9yOiNmZmY7Ym9yZGVyOm5vbmU7Ym9yZGVyLXJhZGl1czo0cHg7cGFkZGluZzo2cHggMTRweDtmb250LXNpemU6MC44NWVtO2N1cnNvcjpwb2ludGVyO2ZvbnQtd2VpZ2h0OjYwMDtcIj5cbiAgICAgICAgU3VibWl0IGNsYXJpZmljYXRpb25cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiBpZD1cImxheW91dC1jbGFyaWZpY2F0aW9uLWNhbmNlbFwiXG4gICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDpub25lO2JvcmRlcjoxcHggc29saWQgI2Q5NzcwNjtjb2xvcjojOTI0MDBlO2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6NnB4IDE0cHg7Zm9udC1zaXplOjAuODVlbTtjdXJzb3I6cG9pbnRlcjtcIj5cbiAgICAgICAgQ2FuY2VsXG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5gO1xuXG4gIGNvbnRhaW5lci5hcHBlbmRDaGlsZChwYW5lbCk7XG5cbiAgY29uc3QgY2xhcklucHV0ICA9IHBhbmVsLnF1ZXJ5U2VsZWN0b3IoJyNsYXlvdXQtY2xhcmlmaWNhdGlvbi1pbnB1dCcpO1xuICBjb25zdCBzdWJtaXRCdG4gID0gcGFuZWwucXVlcnlTZWxlY3RvcignI2xheW91dC1jbGFyaWZpY2F0aW9uLXN1Ym1pdCcpO1xuICBjb25zdCBjYW5jZWxCdG4gID0gcGFuZWwucXVlcnlTZWxlY3RvcignI2xheW91dC1jbGFyaWZpY2F0aW9uLWNhbmNlbCcpO1xuXG4gIGNsYXJJbnB1dC5mb2N1cygpO1xuICBjbGFySW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2UoY2xhcklucHV0LnZhbHVlLmxlbmd0aCwgY2xhcklucHV0LnZhbHVlLmxlbmd0aCk7XG5cbiAgc3VibWl0QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGNvbnN0IGNsYXJpZmllZCA9IGNsYXJJbnB1dC52YWx1ZS50cmltKCk7XG4gICAgcGFuZWwucmVtb3ZlKCk7XG4gICAgaWYgKGNsYXJpZmllZCAmJiBjbGFyaWZpZWQgIT09IG9yaWdpbmFsSW5zdHJ1Y3Rpb24pIHtcbiAgICAgIHN1Ym1pdExheW91dEluc3RydWN0aW9uKGNsYXJpZmllZCk7XG4gICAgfVxuICB9KTtcbiAgY2FuY2VsQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gcGFuZWwucmVtb3ZlKCkpO1xuICBjbGFySW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGUgPT4ge1xuICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJyAmJiAhZS5zaGlmdEtleSkgeyBlLnByZXZlbnREZWZhdWx0KCk7IHN1Ym1pdEJ0bi5jbGljaygpOyB9XG4gICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgY2FuY2VsQnRuLmNsaWNrKCk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFVuZG8gdGhlIGxhc3QgbGF5b3V0IGluc3RydWN0aW9uIGJ5IHJlc3RvcmluZyB0aGUgcHJldmlvdXMgc25hcHNob3QuXG4gKiBUaGUgaW5kZXggcGFyYW1ldGVyIGlzIGFjY2VwdGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGJ1dCBpcyBpZ25vcmVkIFx1MjAxNFxuICogdGhlIHVuZG8gc3RhY2sgYWx3YXlzIHJlc3RvcmVzIHRoZSBtb3N0IHJlY2VudCBwcmUtaW5zdHJ1Y3Rpb24gc3RhdGUuXG4gKi9cbmZ1bmN0aW9uIHVuZG9JbnN0cnVjdGlvbihfaW5kZXgpIHtcbiAgaWYgKF9sYXlvdXRVbmRvU3RhY2subGVuZ3RoID09PSAwKSB7XG4gICAgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgJ1x1MjEzOVx1RkUwRiBOb3RoaW5nIHRvIHVuZG8uJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgc25hcHNob3QgPSBfbGF5b3V0VW5kb1N0YWNrLnBvcCgpO1xuICB3aW5kb3cubGF5b3V0SW5zdHJ1Y3Rpb25zID0gc25hcHNob3QuaW5zdHJ1Y3Rpb25zO1xuXG4gIGRpc3BsYXlMYXlvdXRQcmV2aWV3KHNuYXBzaG90Lmh0bWwpO1xuICBzZXRQcmV2aWV3SHRtbChzbmFwc2hvdC5odG1sKTtcbiAgcmVuZGVySW5zdHJ1Y3Rpb25IaXN0b3J5KCk7XG4gIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsICdcdTIxQTlcdUZFMEYgTGFzdCBsYXlvdXQgaW5zdHJ1Y3Rpb24gdW5kb25lLicpO1xufVxuXG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgKCkgPT4ge1xuICBjb25zdCBwcmV2aWV3ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xheW91dC1wcmV2aWV3Jyk7XG4gIGlmIChwcmV2aWV3KSB7XG4gICAgZml0TGF5b3V0UHJldmlld1RvUGFuZShwcmV2aWV3KTtcbiAgfVxufSk7XG5cbmFzeW5jIGZ1bmN0aW9uIGNvbmZpcm1MYXlvdXRSZXZpZXcoKSB7XG4gIHRyeSB7XG4gICAgc2hvd1Byb2Nlc3NpbmcodHJ1ZSk7XG5cbiAgICBjb25zdCBmcmVzaG5lc3MgPSBzdGF0ZU1hbmFnZXIuZ2V0TGF5b3V0RnJlc2huZXNzKCk7XG4gICAgaWYgKGZyZXNobmVzcy5pc1N0YWxlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ByZXZpZXcgaXMgb3V0ZGF0ZWQuIFJlZ2VuZXJhdGUgdGhlIHByZXZpZXcgYmVmb3JlIGNvbmZpcm1pbmcgbGF5b3V0LicpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpcm1SZXMgPSBhd2FpdCBhcGlDYWxsKCdQT1NUJywgJy9hcGkvY3YvY29uZmlybS1sYXlvdXQnLCB7IGNvbnRlbnRfcmV2aXNpb246IGdldEN1cnJlbnRDb250ZW50UmV2aXNpb24oKSB9KTtcbiAgICBpZiAoIWNvbmZpcm1SZXM/Lm9rKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoY29uZmlybVJlcz8uZXJyb3IgfHwgJ0ZhaWxlZCB0byBjb25maXJtIGxheW91dC4nKTtcbiAgICB9XG5cbiAgICBzdGF0ZU1hbmFnZXIubWFya0xheW91dENvbmZpcm1lZCh7XG4gICAgICBjb25maXJtZWRBdDogY29uZmlybVJlcy5jb25maXJtZWRfYXQgfHwgbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIH0pO1xuICAgIHNob3dDb25maXJtYXRpb25NZXNzYWdlKCdcdTI3MDUgTGF5b3V0IGNvbmZpcm1lZC4gR2VuZXJhdGUgZmluYWwgZmlsZXMgd2hlbiB5b3UgYXJlIHJlYWR5LicpO1xuICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsICdcdTI3MDUgTGF5b3V0IGNvbmZpcm1lZC4gUmV2aWV3IHRoZSBwcmV2aWV3IGlmIG5lZWRlZCwgdGhlbiBnZW5lcmF0ZSB0aGUgZmluYWwgZmlsZXMuJyk7XG4gICAgcmVmcmVzaExheW91dFJldmlld1N0YXRlKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgYFx1Mjc0QyBDb3VsZCBub3QgY29uZmlybSB0aGUgbGF5b3V0LiBUcnkgY2xpY2tpbmcgQ29uZmlybSBhZ2Fpbi4gSWYgdGhlIHByb2JsZW0gcGVyc2lzdHMsIHJlbG9hZCB0aGUgcGFnZS5gKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBzaG93UHJvY2Vzc2luZyhmYWxzZSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVGaW5hbE91dHB1dHMoKSB7XG4gIC8qIGR1Y2tmbG93OlxuICAgKiAgIGlkOiBsYXlvdXRfdWlfZ2VuZXJhdGVfZmluYWxfbGl2ZVxuICAgKiAgIGtpbmQ6IHVpXG4gICAqICAgdGltZXN0YW1wOiAnMjAyNi0wMy0yNlQwMDoyNDowMFonXG4gICAqICAgc3RhdHVzOiBsaXZlXG4gICAqICAgaGFuZGxlczpcbiAgICogICAtIHVpOmxheW91dC5nZW5lcmF0ZS1maW5hbFxuICAgKiAgIGNhbGxzOlxuICAgKiAgIC0gUE9TVCAvYXBpL2N2L2dlbmVyYXRlLWZpbmFsXG4gICAqICAgLSBQT1NUIC9hcGkvbGF5b3V0LWNvbXBsZXRlXG4gICAqICAgcmVhZHM6XG4gICAqICAgLSBzdGF0ZTpnZW5lcmF0aW9uX3N0YXRlLmxheW91dENvbmZpcm1lZFxuICAgKiAgIC0gc3RhdGU6Z2VuZXJhdGlvbl9zdGF0ZS5waGFzZVxuICAgKiAgIC0gc3RhdGU6bGF5b3V0X2ZyZXNobmVzc1xuICAgKiAgIHdyaXRlczpcbiAgICogICAtIHRhYjpjdkFydGlmYWN0c1xuICAgKiAgIC0gc3RhdGU6Z2VuZXJhdGlvbl9zdGF0ZS5maW5hbF9nZW5lcmF0ZWRfYXRcbiAgICogICAtIHVpOndvcmtmbG93LnJlZmluZW1lbnRcbiAgICogICBub3RlczogR2VuZXJhdGVzIHRoZSBmaW5hbCBodW1hbi1yZWFkYWJsZSBvdXRwdXRzIGZyb20gdGhlIGNvbmZpcm1lZCBwcmV2aWV3IGFuZCBhZHZhbmNlcyB0aGUgVUkgaW50byBmaWxlIHJldmlldy9maW5hbGlzZSB3aXRoIHRoZSBuZXcgYXJ0aWZhY3Qgc2V0LlxuICAgKi9cbiAgdHJ5IHtcbiAgICBzaG93UHJvY2Vzc2luZyh0cnVlKTtcblxuICAgIGNvbnN0IGZyZXNobmVzcyA9IHN0YXRlTWFuYWdlci5nZXRMYXlvdXRGcmVzaG5lc3MoKTtcbiAgICBjb25zdCBnZW5lcmF0aW9uU3RhdGUgPSBzdGF0ZU1hbmFnZXIuZ2V0R2VuZXJhdGlvblN0YXRlKCk7XG4gICAgaWYgKGZyZXNobmVzcy5pc1N0YWxlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ByZXZpZXcgaXMgb3V0ZGF0ZWQuIFJlZ2VuZXJhdGUgdGhlIHByZXZpZXcgYmVmb3JlIGdlbmVyYXRpbmcgZmluYWwgZmlsZXMuJyk7XG4gICAgfVxuICAgIGlmICghZ2VuZXJhdGlvblN0YXRlLmxheW91dENvbmZpcm1lZCAmJiBnZW5lcmF0aW9uU3RhdGUucGhhc2UgIT09ICdjb25maXJtZWQnKSB7XG4gICAgICBjb25zdCBoYXNJbnN0cnVjdGlvbnMgPSAod2luZG93LmxheW91dEluc3RydWN0aW9ucyB8fCBbXSkubGVuZ3RoID4gMDtcbiAgICAgIGlmIChoYXNJbnN0cnVjdGlvbnMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb25maXJtIGxheW91dCBiZWZvcmUgZ2VuZXJhdGluZyBmaW5hbCBmaWxlcy4nKTtcbiAgICAgIH1cbiAgICAgIC8vIE5vIGluc3RydWN0aW9ucyBhZGRlZCBcdTIwMTQgYXV0by1jb25maXJtIHNvIHVzZXJzIGFyZW4ndCBibG9ja2VkIGJ5IGEgcmVkdW5kYW50IGNsaWNrLlxuICAgICAgY29uc3QgY29uZmlybVJlcyA9IGF3YWl0IGFwaUNhbGwoJ1BPU1QnLCAnL2FwaS9jdi9jb25maXJtLWxheW91dCcsIHsgY29udGVudF9yZXZpc2lvbjogZ2V0Q3VycmVudENvbnRlbnRSZXZpc2lvbigpIH0pO1xuICAgICAgaWYgKCFjb25maXJtUmVzPy5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoY29uZmlybVJlcz8uZXJyb3IgfHwgJ0ZhaWxlZCB0byBhdXRvLWNvbmZpcm0gbGF5b3V0LicpO1xuICAgICAgfVxuICAgICAgc3RhdGVNYW5hZ2VyLm1hcmtMYXlvdXRDb25maXJtZWQoeyBjb25maXJtZWRBdDogY29uZmlybVJlcy5jb25maXJtZWRfYXQgfHwgbmV3IERhdGUoKS50b0lTT1N0cmluZygpIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbmFsUmVzID0gYXdhaXQgYXBpQ2FsbCgnUE9TVCcsICcvYXBpL2N2L2dlbmVyYXRlLWZpbmFsJywge30pO1xuICAgIGlmICghZmluYWxSZXM/Lm9rIHx8ICFmaW5hbFJlcy5vdXRwdXRzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZmluYWxSZXM/LmVycm9yIHx8ICdGYWlsZWQgdG8gZ2VuZXJhdGUgZmluYWwgQ1Ygb3V0cHV0LicpO1xuICAgIH1cblxuICAgIHVwZGF0ZUN2QXJ0aWZhY3RzKGZpbmFsUmVzLm91dHB1dHMpO1xuICAgIHN0YXRlTWFuYWdlci5tYXJrRmluYWxHZW5lcmF0ZWQoZmluYWxSZXMuZ2VuZXJhdGVkX2F0IHx8IG51bGwsIHtcbiAgICAgIHBhZ2VDb3VudEVzdGltYXRlOiBmaW5hbFJlcy5wYWdlX2NvdW50X2VzdGltYXRlID8/IG51bGwsXG4gICAgICBwYWdlQ291bnRFeGFjdDogZmluYWxSZXMucGFnZV9jb3VudF9leGFjdCA/PyBudWxsLFxuICAgIH0pO1xuXG4gICAgc2NoZWR1bGVBdHNSZWZyZXNoKCdwb3N0X2dlbmVyYXRpb24nKTtcblxuICAgIHN0YXRlTWFuYWdlci5zZXRQaGFzZSgnZmluYWxfZ2VuZXJhdGlvbicpO1xuICAgIHN3aXRjaFRhYignZmluYWxfZ2VuZXJhdGUnKTtcbiAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCAnXHUyNzA1IEZpbmFsIGZpbGVzIGdlbmVyYXRlZCBmcm9tIHRoZSBjb25maXJtZWQgbGF5b3V0LicpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsIGBcdTI3NEMgQ291bGQgbm90IGdlbmVyYXRlIGZpbmFsIGZpbGVzOiAke2Vycm9yLm1lc3NhZ2V9IFRyeSBjbGlja2luZyBHZW5lcmF0ZSBhZ2Fpbi4gSWYgbGF5b3V0IGNvbmZpcm1hdGlvbiBpcyBuZWVkZWQgZmlyc3QsIGNsaWNrIENvbmZpcm0gTGF5b3V0LCB0aGVuIHRyeSBhZ2Fpbi5gKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBzaG93UHJvY2Vzc2luZyhmYWxzZSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gaGFuZGxlTGF5b3V0UHJpbWFyeUFjdGlvbigpIHtcbiAgY29uc3QgZnJlc2huZXNzID0gc3RhdGVNYW5hZ2VyLmdldExheW91dEZyZXNobmVzcygpO1xuICBjb25zdCBnZW5lcmF0aW9uU3RhdGUgPSBzdGF0ZU1hbmFnZXIuZ2V0R2VuZXJhdGlvblN0YXRlKCk7XG4gIGlmIChmcmVzaG5lc3MuaXNTdGFsZSkgcmV0dXJuIGhhbmRsZVJlZ2VuZXJhdGVQcmV2aWV3QWN0aW9uKCk7XG4gIGlmIChnZW5lcmF0aW9uU3RhdGUubGF5b3V0Q29uZmlybWVkIHx8IGdlbmVyYXRpb25TdGF0ZS5waGFzZSA9PT0gJ2NvbmZpcm1lZCcpIHtcbiAgICByZXR1cm4gZ2VuZXJhdGVGaW5hbE91dHB1dHMoKTtcbiAgfVxuICByZXR1cm4gY29uZmlybUxheW91dFJldmlldygpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb21wbGV0ZUxheW91dFJldmlldygpIHtcbiAgcmV0dXJuIGhhbmRsZUxheW91dFByaW1hcnlBY3Rpb24oKTtcbn1cblxuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEdFTkVSQVRJT05fU1RBVEVfRVZFTlQsIHJlZnJlc2hMYXlvdXRSZXZpZXdTdGF0ZSk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBDb250ZW50IHByb3Bvc2FsIGZ1bmN0aW9ucyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLyoqXG4gKiBTdWJtaXQgYSBuYXR1cmFsLWxhbmd1YWdlIGNvbnRlbnQgZWRpdCByZXF1ZXN0IHRvIHRoZSBiYWNrZW5kIGFuZCByZW5kZXIgcHJvcG9zYWxzLlxuICovXG5hc3luYyBmdW5jdGlvbiBzdWJtaXRDb250ZW50UHJvcG9zYWwoKSB7XG4gIGNvbnN0IGlucHV0ICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5zdHJ1Y3Rpb24taW5wdXQnKTtcbiAgY29uc3QgcHJvY2Vzc2luZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb250ZW50LXByb3Bvc2FsLXByb2Nlc3NpbmcnKTtcbiAgY29uc3QgcGFuZWwgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb250ZW50LXByb3Bvc2Fscy1wYW5lbCcpO1xuXG4gIGNvbnN0IGluc3RydWN0aW9uID0gaW5wdXQ/LnZhbHVlLnRyaW0oKTtcbiAgaWYgKCFpbnN0cnVjdGlvbikge1xuICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsICdcdTI2QTBcdUZFMEYgUGxlYXNlIGRlc2NyaWJlIHRoZSBjb250ZW50IGNoYW5nZSB5b3Ugd2FudCBiZWZvcmUgc3VibWl0dGluZy4nKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAocHJvY2Vzc2luZykgcHJvY2Vzc2luZy5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICBpZiAocGFuZWwpICAgICAgIHBhbmVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGlDYWxsKCdQT1NUJywgJy9hcGkvY3YvcHJvcG9zZS1jb250ZW50LWNoYW5nZScsIHsgaW5zdHJ1Y3Rpb24gfSk7XG4gICAgaWYgKCFyZXM/Lm9rKSB7XG4gICAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCBgXHUyNzRDIENvdWxkIG5vdCBnZW5lcmF0ZSBjb250ZW50IHByb3Bvc2Fscy4gVHJ5IHJlcGhyYXNpbmcgeW91ciBpbnN0cnVjdGlvbiBvciBjaGVjayB0aGUgc2Vzc2lvbiBpcyBzdGlsbCBhY3RpdmUuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHByb3Bvc2FscyA9IHJlcy5wcm9wb3NhbHMgfHwgW107XG4gICAgaWYgKHByb3Bvc2Fscy5sZW5ndGggPT09IDApIHtcbiAgICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsICdcdTI2QTBcdUZFMEYgTm8gcHJvcG9zYWxzIHdlcmUgZ2VuZXJhdGVkLiBUcnkgcmVwaHJhc2luZyB5b3VyIGluc3RydWN0aW9uLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZW5kZXJDb250ZW50UHJvcG9zYWxzKHByb3Bvc2Fscyk7XG4gICAgaWYgKHBhbmVsKSBwYW5lbC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgYFx1Mjc0QyBDb3VsZCBub3Qgc3VibWl0IHRoZSBjb250ZW50IHByb3Bvc2FsLiBDaGVjayB5b3VyIGNvbm5lY3Rpb24gYW5kIHRyeSBhZ2Fpbi5gKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAocHJvY2Vzc2luZykgcHJvY2Vzc2luZy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICB9XG59XG5cbi8qKlxuICogUmVuZGVyIGEgbGlzdCBvZiBjb250ZW50IHByb3Bvc2FscyBhcyByZXZpZXdhYmxlIGNhcmRzIGluc2lkZSAjY29udGVudC1wcm9wb3NhbHMtcGFuZWwuXG4gKiBAcGFyYW0ge0FycmF5PHtpZCwgdHlwZSwgbG9jYXRpb24sIG9yaWdpbmFsLCBwcm9wb3NlZCwgcmVhc29ufT59IHByb3Bvc2Fsc1xuICovXG5mdW5jdGlvbiByZW5kZXJDb250ZW50UHJvcG9zYWxzKHByb3Bvc2Fscykge1xuICBjb25zdCBwYW5lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb250ZW50LXByb3Bvc2Fscy1wYW5lbCcpO1xuICBpZiAoIXBhbmVsKSByZXR1cm47XG5cbiAgY29uc3QgYXBwbHlCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXBwbHktY29udGVudC1jaGFuZ2VzLWJ0bicpO1xuXG4gIHBhbmVsLmlubmVySFRNTCA9IGBcbiAgICA8cCBjbGFzcz1cImNvbnRlbnQtcHJvcG9zYWxzLWhlYWRpbmdcIj4ke3Byb3Bvc2Fscy5sZW5ndGh9IHByb3Bvc2FsJHtwcm9wb3NhbHMubGVuZ3RoICE9PSAxID8gJ3MnIDogJyd9IFx1MjAxNCBhcHByb3ZlIHRoZSBjaGFuZ2VzIHlvdSB3YW50IHRvIGFwcGx5OjwvcD5cbiAgICAke3Byb3Bvc2Fscy5tYXAoKHAsIGkpID0+IGBcbiAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50LXByb3Bvc2FsLWNhcmRcIiBkYXRhLXByb3Bvc2FsLWlkPVwiJHtlc2NhcGVIdG1sKHAuaWQpfVwiIGRhdGEtcHJvcG9zYWwtaW5kZXg9XCIke2l9XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwcm9wb3NhbC1tZXRhXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJwcm9wb3NhbC10eXBlLWJhZGdlXCI+JHtwLnR5cGUgPT09ICdzdW1tYXJ5JyA/ICdTdW1tYXJ5JyA6ICdCdWxsZXQnfTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInByb3Bvc2FsLWxvY2F0aW9uXCI+JHtlc2NhcGVIdG1sKHAubG9jYXRpb24pfTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwcm9wb3NhbC1kaWZmXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInByb3Bvc2FsLW9yaWdpbmFsXCI+PHN0cm9uZz5CZWZvcmU6PC9zdHJvbmc+ICR7ZXNjYXBlSHRtbChwLm9yaWdpbmFsKX08L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvcG9zYWwtcHJvcG9zZWRcIj48c3Ryb25nPkFmdGVyOjwvc3Ryb25nPiAke2VzY2FwZUh0bWwocC5wcm9wb3NlZCl9PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICAke3AucmVhc29uID8gYDxkaXYgY2xhc3M9XCJwcm9wb3NhbC1yZWFzb25cIj48ZW0+JHtlc2NhcGVIdG1sKHAucmVhc29uKX08L2VtPjwvZGl2PmAgOiAnJ31cbiAgICAgICAgPGRpdiBjbGFzcz1cInByb3Bvc2FsLWFjdGlvbnNcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJwcm9wb3NhbC1hcHByb3ZlLWxhYmVsXCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJwcm9wb3NhbC1hcHByb3ZlLWNoZWNrYm94XCIgY2hlY2tlZD5cbiAgICAgICAgICAgIEFwcHJvdmUgdGhpcyBjaGFuZ2VcbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PmApLmpvaW4oJycpfVxuICBgO1xuXG4gIC8vIFN0b3JlIHByb3Bvc2FscyBmb3IgbGF0ZXIgcmV0cmlldmFsXG4gIHBhbmVsLmRhdGFzZXQucHJvcG9zYWxzID0gSlNPTi5zdHJpbmdpZnkocHJvcG9zYWxzKTtcblxuICBpZiAoYXBwbHlCdG4pIGFwcGx5QnRuLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xufVxuXG4vKipcbiAqIENvbGxlY3QgYXBwcm92ZWQgcHJvcG9zYWxzIGFuZCBQT1NUIHRoZW0gdG8gL2FwaS9jdi9hcHBseS1jb250ZW50LWNoYW5nZXMuXG4gKiBVcGRhdGVzIGRpcnR5LXBoYXNlIHN0YXRlIGFuZCBzaG93cyB0aGUgcmV0dXJuIGNhbGxvdXQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGFwcGx5QWNjZXB0ZWRQcm9wb3NhbHMoKSB7XG4gIGNvbnN0IHBhbmVsICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbnRlbnQtcHJvcG9zYWxzLXBhbmVsJyk7XG4gIGNvbnN0IGFwcGx5QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FwcGx5LWNvbnRlbnQtY2hhbmdlcy1idG4nKTtcblxuICBjb25zdCBhbGxQcm9wb3NhbHMgPSBKU09OLnBhcnNlKHBhbmVsPy5kYXRhc2V0LnByb3Bvc2FscyB8fCAnW10nKTtcbiAgY29uc3QgY2hlY2tib3hlcyAgID0gcGFuZWw/LnF1ZXJ5U2VsZWN0b3JBbGwoJy5wcm9wb3NhbC1hcHByb3ZlLWNoZWNrYm94JykgfHwgW107XG5cbiAgY29uc3QgYWNjZXB0ZWQgPSBhbGxQcm9wb3NhbHMuZmlsdGVyKChfLCBpKSA9PiBjaGVja2JveGVzW2ldPy5jaGVja2VkKTtcbiAgaWYgKGFjY2VwdGVkLmxlbmd0aCA9PT0gMCkge1xuICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsICdcdTI2QTBcdUZFMEYgTm8gcHJvcG9zYWxzIGFwcHJvdmVkLiBUaWNrIGF0IGxlYXN0IG9uZSBjaGFuZ2UgdG8gYXBwbHkuJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGFwcGx5QnRuKSBhcHBseUJ0bi5kaXNhYmxlZCA9IHRydWU7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGlDYWxsKCdQT1NUJywgJy9hcGkvY3YvYXBwbHktY29udGVudC1jaGFuZ2VzJywgeyBhY2NlcHRlZCB9KTtcbiAgICBpZiAoIXJlcz8ub2spIHtcbiAgICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsIGBcdTI3NEMgRmFpbGVkIHRvIGFwcGx5IGNvbnRlbnQgY2hhbmdlczogJHtyZXM/LmVycm9yIHx8ICdVbmtub3duIGVycm9yJ31gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzdGF0ZU1hbmFnZXIuc2V0RGlydHlQaGFzZXMoXG4gICAgICByZXMuZGlydHlfcGhhc2VzIHx8IFsnZ2VuZXJhdGUnLCAnbGF5b3V0J10sXG4gICAgICByZXMuZWFybGllc3RfZGlydHlfc3RlcCB8fCAnZ2VuZXJhdGUnLFxuICAgICk7XG5cbiAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCBgXHUyNzA1ICR7cmVzLmFwcGxpZWRfY291bnR9IGNvbnRlbnQgY2hhbmdlJHtyZXMuYXBwbGllZF9jb3VudCAhPT0gMSA/ICdzJyA6ICcnfSBzdGFnZWQuIFJldHVybiB0byBHZW5lcmF0ZSBDViB0byBhcHBseSB0aGVtLmApO1xuXG4gICAgLy8gQ2xlYXIgdGhlIHByb3Bvc2FsIHBhbmVsXG4gICAgaWYgKHBhbmVsKSB7IHBhbmVsLmlubmVySFRNTCA9ICcnOyBwYW5lbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOyBwYW5lbC5kYXRhc2V0LnByb3Bvc2FscyA9ICdbXSc7IH1cbiAgICBpZiAoYXBwbHlCdG4pIGFwcGx5QnRuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICByZWZyZXNoTGF5b3V0UmV2aWV3U3RhdGUoKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgYFx1Mjc0QyBDb3VsZCBub3QgYXBwbHkgY29udGVudCBjaGFuZ2VzLiBDaGVjayB5b3VyIGNvbm5lY3Rpb24gYW5kIHRyeSBhZ2Fpbi5gKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoYXBwbHlCdG4pIGFwcGx5QnRuLmRpc2FibGVkID0gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBTaG93IG9yIGhpZGUgdGhlIGRpcnR5LXBoYXNlcyBjYWxsb3V0IGJhc2VkIG9uIHN0YXRlTWFuYWdlci5nZXREaXJ0eVBoYXNlcygpLlxuICovXG5mdW5jdGlvbiByZW5kZXJEaXJ0eVBoYXNlc0NhbGxvdXQoKSB7XG4gIGNvbnN0IGNhbGxvdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGlydHktcGhhc2VzLWNhbGxvdXQnKTtcbiAgaWYgKCFjYWxsb3V0KSByZXR1cm47XG4gIGNvbnN0IGRpcnR5ID0gc3RhdGVNYW5hZ2VyLmdldERpcnR5UGhhc2VzKCk7XG4gIGNhbGxvdXQuc3R5bGUuZGlzcGxheSA9IGRpcnR5Lmxlbmd0aCA+IDAgPyAnYmxvY2snIDogJ25vbmUnO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgRVMgbW9kdWxlIGV4cG9ydHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5leHBvcnQge1xuICBpbml0aWF0ZUxheW91dEluc3RydWN0aW9ucyxcbiAgY29tcGxldGVMYXlvdXRSZXZpZXcsXG4gIGNvbmZpcm1MYXlvdXRSZXZpZXcsXG4gIGdlbmVyYXRlRmluYWxPdXRwdXRzLFxuICBoYW5kbGVMYXlvdXRQcmltYXJ5QWN0aW9uLFxuICBsb2FkTGF5b3V0SW5zdHJ1Y3Rpb25IaXN0b3J5LFxuICByZW5kZXJQcmV2aWV3T3V0cHV0U3RhdHVzLFxuICByZW5kZXJMYXlvdXRQcmV2aWV3U3RhdHVzLFxuICBkaXNwbGF5TGF5b3V0UHJldmlldyxcbiAgc3VibWl0TGF5b3V0SW5zdHJ1Y3Rpb24sXG4gIHN1Ym1pdFNtYXJ0SW5zdHJ1Y3Rpb24sXG4gIC8vIGhlbHBlcnMgZXhwb3J0ZWQgZm9yIHVuaXQgdGVzdHNcbiAgc2hvd1Byb2Nlc3NpbmcsXG4gIHNob3dDb25maXJtYXRpb25NZXNzYWdlLFxuICByZW5kZXJJbnN0cnVjdGlvbkhpc3RvcnksXG4gIGFkZFRvSW5zdHJ1Y3Rpb25IaXN0b3J5LFxuICB1bmRvSW5zdHJ1Y3Rpb24sXG4gIC8vIGNvbnRlbnQgcHJvcG9zYWxcbiAgc3VibWl0Q29udGVudFByb3Bvc2FsLFxuICByZW5kZXJDb250ZW50UHJvcG9zYWxzLFxuICBhcHBseUFjY2VwdGVkUHJvcG9zYWxzLFxuICByZW5kZXJEaXJ0eVBoYXNlc0NhbGxvdXQsXG59O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvYXRzLXJlZmluZW1lbnQuanNcbiAqIEFUUyBzY29yZSBiYWRnZSBkaXNwbGF5IGFuZCBkZWJvdW5jZWQgcmVmcmVzaCBzY2hlZHVsaW5nLlxuICpcbiAqIERFUEVOREVOQ0lFUzpcbiAqICAgLSBnbG9iYWxUaGlzLnN0YXRlTWFuYWdlciBmcm9tIHN0YXRlLW1hbmFnZXIuanMgKGFjY2Vzc2VkIHZpYSBnbG9iYWxUaGlzIHRocm91Z2hvdXQpXG4gKi9cblxuZnVuY3Rpb24gX2Rpc3BhdGNoQXRzU2NvcmVVcGRhdGVkKCkge1xuICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnYXRzLXNjb3JlLXVwZGF0ZWQnKSk7XG59XG5cbmZ1bmN0aW9uIF9zYWZlVGV4dCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlLnRyaW0oKSA6ICcnO1xufVxuXG5mdW5jdGlvbiBfY29lcmNlT2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnID8gdmFsdWUgOiB7fTtcbn1cblxuZnVuY3Rpb24gX2Zvcm1hdERhdGVMYWJlbCh2YWx1ZSkge1xuICBjb25zdCB0ZXh0ID0gX3NhZmVUZXh0KHZhbHVlKTtcbiAgaWYgKCF0ZXh0KSByZXR1cm4gJyc7XG5cbiAgaWYgKC9eXFxkezR9LVxcZHsyfS1cXGR7Mn0kLy50ZXN0KHRleHQpKSB7XG4gICAgY29uc3QgW3llYXIsIG1vbnRoLCBkYXldID0gdGV4dC5zcGxpdCgnLScpO1xuICAgIHJldHVybiBgJHttb250aH0vJHtkYXl9LyR7eWVhcn1gO1xuICB9XG5cbiAgY29uc3QgcGFyc2VkID0gbmV3IERhdGUodGV4dCk7XG4gIGlmICghTnVtYmVyLmlzTmFOKHBhcnNlZC5nZXRUaW1lKCkpKSB7XG4gICAgcmV0dXJuIHBhcnNlZC50b0lTT1N0cmluZygpLnNsaWNlKDAsIDEwKTtcbiAgfVxuICByZXR1cm4gdGV4dDtcbn1cblxuZnVuY3Rpb24gX2dldFBhZ2VMZW5ndGhMYWJlbCgpIHtcbiAgY29uc3QgZ2VuZXJhdGlvblN0YXRlID0gX2NvZXJjZU9iamVjdChnbG9iYWxUaGlzLnN0YXRlTWFuYWdlcj8uZ2V0R2VuZXJhdGlvblN0YXRlPy4oKSk7XG4gIGNvbnN0IGV4YWN0ID0gTnVtYmVyKGdlbmVyYXRpb25TdGF0ZS5wYWdlQ291bnRFeGFjdCk7XG4gIGlmIChOdW1iZXIuaXNGaW5pdGUoZXhhY3QpICYmIGV4YWN0ID4gMCkge1xuICAgIHJldHVybiBgTGVuZ3RoICR7ZXhhY3R9IHBhZ2Uke2V4YWN0ID09PSAxID8gJycgOiAncyd9YDtcbiAgfVxuXG4gIGNvbnN0IGVzdGltYXRlID0gTnVtYmVyKGdlbmVyYXRpb25TdGF0ZS5wYWdlQ291bnRFc3RpbWF0ZSk7XG4gIGlmIChOdW1iZXIuaXNGaW5pdGUoZXN0aW1hdGUpICYmIGVzdGltYXRlID4gMCkge1xuICAgIHJldHVybiBgTGVuZ3RoICR7ZXN0aW1hdGUudG9GaXhlZCgxKX0gcGFnZXMgZXN0YDtcbiAgfVxuXG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gX2dldEpvYlN1bW1hcnlMYWJlbCgpIHtcbiAgY29uc3QgaW50YWtlID0gX2NvZXJjZU9iamVjdCh3aW5kb3cuX3N0YXR1c0ludGFrZSk7XG4gIGNvbnN0IGFuYWx5c2lzID0gX2NvZXJjZU9iamVjdChnbG9iYWxUaGlzLnN0YXRlTWFuYWdlcj8uZ2V0VGFiRGF0YT8uKCdhbmFseXNpcycpKTtcbiAgY29uc3QgcG9zaXRpb25GYWxsYmFjayA9IF9zYWZlVGV4dChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncG9zaXRpb24tdGl0bGUnKT8udGV4dENvbnRlbnQgfHwgJycpO1xuXG4gIGNvbnN0IHJvbGUgPSBfc2FmZVRleHQoXG4gICAgaW50YWtlLnJvbGVcbiAgICAgIHx8IGFuYWx5c2lzLmpvYl90aXRsZVxuICAgICAgfHwgYW5hbHlzaXMudGl0bGVcbiAgICAgIHx8IGFuYWx5c2lzLnBvc2l0aW9uX25hbWVcbiAgICAgIHx8ICcnXG4gICk7XG4gIGNvbnN0IGNvbXBhbnkgPSBfc2FmZVRleHQoaW50YWtlLmNvbXBhbnkgfHwgYW5hbHlzaXMuY29tcGFueV9uYW1lIHx8IGFuYWx5c2lzLmNvbXBhbnkgfHwgJycpO1xuICBjb25zdCBkYXRlQXBwbGllZCA9IF9mb3JtYXREYXRlTGFiZWwoXG4gICAgaW50YWtlLmRhdGVfYXBwbGllZFxuICAgICAgfHwgYW5hbHlzaXMuZGF0ZV9hcHBsaWVkXG4gICAgICB8fCBhbmFseXNpcy5hcHBsaWNhdGlvbl9kYXRlXG4gICAgICB8fCAnJ1xuICApO1xuXG4gIGNvbnN0IHByaW1hcnkgPSByb2xlICYmIGNvbXBhbnlcbiAgICA/IGAke3JvbGV9IEAgJHtjb21wYW55fWBcbiAgICA6IChyb2xlIHx8IGNvbXBhbnkgfHwgcG9zaXRpb25GYWxsYmFjayk7XG4gIGlmICghcHJpbWFyeSkgcmV0dXJuICcnO1xuICBpZiAoIWRhdGVBcHBsaWVkKSByZXR1cm4gcHJpbWFyeTtcbiAgcmV0dXJuIGAke3ByaW1hcnl9ICgke2RhdGVBcHBsaWVkfSlgO1xufVxuXG5mdW5jdGlvbiBfa2V5d29yZENvdW50KGtleXdvcmRzLCB0eXBlLCBzdGF0dXNlcyA9IFsnbWF0Y2hlZCcsICdwYXJ0aWFsJ10pIHtcbiAgcmV0dXJuIGtleXdvcmRzLmZpbHRlcihrZXl3b3JkID0+IGtleXdvcmQudHlwZSA9PT0gdHlwZSAmJiBzdGF0dXNlcy5pbmNsdWRlcyhrZXl3b3JkLnN0YXR1cykpLmxlbmd0aDtcbn1cblxuZnVuY3Rpb24gX2J1aWxkU3VtbWFyeURldGFpbChzY29yZSwga2V5d29yZHMpIHtcbiAgY29uc3QgbWlzc2luZ0hhcmQgPSBrZXl3b3Jkc1xuICAgIC5maWx0ZXIoa2V5d29yZCA9PiBrZXl3b3JkLnR5cGUgPT09ICdoYXJkJyAmJiBrZXl3b3JkLnN0YXR1cyA9PT0gJ21pc3NpbmcnKVxuICAgIC5tYXAoa2V5d29yZCA9PiBrZXl3b3JkLmtleXdvcmQpXG4gICAgLmZpbHRlcihCb29sZWFuKTtcblxuICBpZiAobWlzc2luZ0hhcmQubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IHByZXZpZXcgPSBtaXNzaW5nSGFyZC5zbGljZSgwLCAyKS5qb2luKCcsICcpO1xuICAgIGNvbnN0IHN1ZmZpeCA9IG1pc3NpbmdIYXJkLmxlbmd0aCA+IDIgPyBgICske21pc3NpbmdIYXJkLmxlbmd0aCAtIDJ9IG1vcmVgIDogJyc7XG4gICAgcmV0dXJuIGBNaXNzaW5nIGhhcmQ6ICR7cHJldmlld30ke3N1ZmZpeH1gO1xuICB9XG5cbiAgY29uc3QgZXhhY3QgPSBrZXl3b3Jkcy5maWx0ZXIoa2V5d29yZCA9PiBrZXl3b3JkLm1hdGNoX3R5cGUgPT09ICdleGFjdCcgfHwga2V5d29yZC5tYXRjaF90eXBlID09PSAnc3lub255bScpLmxlbmd0aDtcbiAgY29uc3QgcGFydGlhbCA9IGtleXdvcmRzLmZpbHRlcihrZXl3b3JkID0+IGtleXdvcmQubWF0Y2hfdHlwZSA9PT0gJ3BhcnRpYWwnKS5sZW5ndGg7XG4gIGNvbnN0IHRvcFNlY3Rpb25zID0gT2JqZWN0LmVudHJpZXMoc2NvcmUuc2VjdGlvbl9zY29yZXMgfHwge30pXG4gICAgLmZpbHRlcigoWywgdmFsdWVdKSA9PiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIHZhbHVlID4gMClcbiAgICAuc29ydCgobGVmdCwgcmlnaHQpID0+IHJpZ2h0WzFdIC0gbGVmdFsxXSlcbiAgICAuc2xpY2UoMCwgMilcbiAgICAubWFwKChbc2VjdGlvbiwgdmFsdWVdKSA9PiBgJHtzZWN0aW9ufSAke01hdGgucm91bmQodmFsdWUpfSVgKTtcblxuICBpZiAodG9wU2VjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBgVG9wIHNlY3Rpb25zOiAke3RvcFNlY3Rpb25zLmpvaW4oJyBcdTIwMjIgJyl9YDtcbiAgfVxuXG4gIGlmIChleGFjdCA+IDAgfHwgcGFydGlhbCA+IDApIHtcbiAgICByZXR1cm4gYE1hdGNoIHF1YWxpdHk6ICR7ZXhhY3R9IGV4YWN0IFx1MjAyMiAke3BhcnRpYWx9IHBhcnRpYWxgO1xuICB9XG5cbiAgcmV0dXJuIGBCYXNpczogJHtzY29yZS5iYXNpcyB8fCAncmV2aWV3J31gO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRBdHNTY29yZVN1bW1hcnkoc2NvcmUpIHtcbiAgY29uc3Qga2V5d29yZHMgPSBBcnJheS5pc0FycmF5KHNjb3JlPy5rZXl3b3JkX3N0YXR1cykgPyBzY29yZS5rZXl3b3JkX3N0YXR1cyA6IFtdO1xuICBjb25zdCBvdmVyYWxsID0gdHlwZW9mIHNjb3JlPy5vdmVyYWxsID09PSAnbnVtYmVyJyA/IE1hdGgucm91bmQoc2NvcmUub3ZlcmFsbCkgOiBudWxsO1xuXG4gIGlmIChvdmVyYWxsID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHsgb3ZlcmFsbDogbnVsbCwgbGluZTogJycsIGRldGFpbDogJycsIGtleXdvcmRzIH07XG4gIH1cblxuICBpZiAoa2V5d29yZHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG92ZXJhbGwsXG4gICAgICBsaW5lOiBgT3ZlcmFsbCAke292ZXJhbGx9JWAsXG4gICAgICBkZXRhaWw6IGBCYXNpczogJHtzY29yZS5iYXNpcyB8fCAncmV2aWV3J31gLFxuICAgICAga2V5d29yZHMsXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IGhhcmRUb3RhbCA9IGtleXdvcmRzLmZpbHRlcihrZXl3b3JkID0+IGtleXdvcmQudHlwZSA9PT0gJ2hhcmQnKS5sZW5ndGg7XG4gIGNvbnN0IHNvZnRUb3RhbCA9IGtleXdvcmRzLmZpbHRlcihrZXl3b3JkID0+IGtleXdvcmQudHlwZSA9PT0gJ3NvZnQnKS5sZW5ndGg7XG4gIGNvbnN0IGJvbnVzVG90YWwgPSBrZXl3b3Jkcy5maWx0ZXIoa2V5d29yZCA9PiBrZXl3b3JkLnR5cGUgPT09ICdib251cycpLmxlbmd0aDtcbiAgY29uc3Qgc3VtbWFyeVBhcnRzID0gW107XG5cbiAgaWYgKGhhcmRUb3RhbCA+IDApIHtcbiAgICBzdW1tYXJ5UGFydHMucHVzaChgSGFyZCAke19rZXl3b3JkQ291bnQoa2V5d29yZHMsICdoYXJkJyl9LyR7aGFyZFRvdGFsfWApO1xuICB9XG4gIGlmIChzb2Z0VG90YWwgPiAwKSB7XG4gICAgc3VtbWFyeVBhcnRzLnB1c2goYFNvZnQgJHtfa2V5d29yZENvdW50KGtleXdvcmRzLCAnc29mdCcpfS8ke3NvZnRUb3RhbH1gKTtcbiAgfVxuICBpZiAoYm9udXNUb3RhbCA+IDApIHtcbiAgICBzdW1tYXJ5UGFydHMucHVzaChgQm9udXMgJHtfa2V5d29yZENvdW50KGtleXdvcmRzLCAnYm9udXMnKX0vJHtib251c1RvdGFsfWApO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBvdmVyYWxsLFxuICAgIGxpbmU6IHN1bW1hcnlQYXJ0cy5qb2luKCcgXHUyMDIyICcpIHx8IGBPdmVyYWxsICR7b3ZlcmFsbH0lYCxcbiAgICBkZXRhaWw6IF9idWlsZFN1bW1hcnlEZXRhaWwoc2NvcmUsIGtleXdvcmRzKSxcbiAgICBrZXl3b3JkcyxcbiAgfTtcbn1cblxuZnVuY3Rpb24gX3VwZGF0ZUF0c1N1bW1hcnkoc2NvcmUpIHtcbiAgY29uc3QgaGVhZGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F0cy1zY29yZS1oZWFkZXInKTtcbiAgY29uc3Qgc3VtbWFyeSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdHMtc2NvcmUtc3VtbWFyeScpO1xuICBjb25zdCBzdW1tYXJ5TGluZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdHMtc2NvcmUtc3VtbWFyeS1saW5lJyk7XG4gIGNvbnN0IHN1bW1hcnlEZXRhaWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXRzLXNjb3JlLXN1bW1hcnktZGV0YWlsJyk7XG5cbiAgaWYgKCFoZWFkZXIgfHwgIXN1bW1hcnkgfHwgIXN1bW1hcnlMaW5lIHx8ICFzdW1tYXJ5RGV0YWlsKSByZXR1cm47XG5cbiAgY29uc3Qga2V5d29yZHMgPSBBcnJheS5pc0FycmF5KHNjb3JlPy5rZXl3b3JkX3N0YXR1cykgPyBzY29yZS5rZXl3b3JkX3N0YXR1cyA6IFtdO1xuICBjb25zdCBoYXNTY29yZSA9IHNjb3JlICYmIHR5cGVvZiBzY29yZS5vdmVyYWxsID09PSAnbnVtYmVyJztcbiAgY29uc3QgcGFnZUxlbmd0aExhYmVsID0gX2dldFBhZ2VMZW5ndGhMYWJlbCgpO1xuICBjb25zdCBqb2JTdW1tYXJ5TGFiZWwgPSBfZ2V0Sm9iU3VtbWFyeUxhYmVsKCk7XG5cbiAgaWYgKCFoYXNTY29yZSkge1xuICAgIGhlYWRlci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIHN1bW1hcnkuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBzdW1tYXJ5TGluZS50ZXh0Q29udGVudCA9ICcnO1xuICAgIHN1bW1hcnlEZXRhaWwudGV4dENvbnRlbnQgPSAnJztcbiAgICByZXR1cm47XG4gIH1cblxuICBoZWFkZXIuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcblxuICBjb25zdCBzdW1tYXJ5Q29udGVudCA9IGZvcm1hdEF0c1Njb3JlU3VtbWFyeShzY29yZSk7XG4gIGNvbnN0IGxpbmVQYXJ0cyA9IFtzdW1tYXJ5Q29udGVudC5saW5lLCBwYWdlTGVuZ3RoTGFiZWxdLmZpbHRlcihCb29sZWFuKTtcbiAgY29uc3QgZGV0YWlsUGFydHMgPSBbam9iU3VtbWFyeUxhYmVsLCBzdW1tYXJ5Q29udGVudC5kZXRhaWxdLmZpbHRlcihCb29sZWFuKTtcblxuICBpZiAobGluZVBhcnRzLmxlbmd0aCA9PT0gMCAmJiBkZXRhaWxQYXJ0cy5sZW5ndGggPT09IDAgJiYga2V5d29yZHMubGVuZ3RoID09PSAwKSB7XG4gICAgc3VtbWFyeS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIHN1bW1hcnlMaW5lLnRleHRDb250ZW50ID0gJyc7XG4gICAgc3VtbWFyeURldGFpbC50ZXh0Q29udGVudCA9ICcnO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHN1bW1hcnlMaW5lLnRleHRDb250ZW50ID0gbGluZVBhcnRzLmpvaW4oJyBcdTIwMjIgJyk7XG4gIHN1bW1hcnlEZXRhaWwudGV4dENvbnRlbnQgPSBkZXRhaWxQYXJ0cy5qb2luKCcgXHUyMDIyICcpO1xuICBzdW1tYXJ5LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUF0c0JhZGdlKHNjb3JlKSB7XG4gIF91cGRhdGVBdHNTdW1tYXJ5KHNjb3JlKTtcblxuICBjb25zdCBiYWRnZSAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F0cy1zY29yZS1iYWRnZScpO1xuICBjb25zdCB2YWx1ZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F0cy1zY29yZS12YWx1ZScpO1xuICBpZiAoIWJhZGdlIHx8ICF2YWx1ZUVsKSB7XG4gICAgX2Rpc3BhdGNoQXRzU2NvcmVVcGRhdGVkKCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKCFzY29yZSB8fCB0eXBlb2Ygc2NvcmUub3ZlcmFsbCAhPT0gJ251bWJlcicpIHtcbiAgICBiYWRnZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIF9kaXNwYXRjaEF0c1Njb3JlVXBkYXRlZCgpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG92ZXJhbGwgPSBNYXRoLnJvdW5kKHNjb3JlLm92ZXJhbGwpO1xuICB2YWx1ZUVsLnRleHRDb250ZW50ID0gYCR7b3ZlcmFsbH0lYDtcbiAgYmFkZ2Uuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcblxuICBiYWRnZS5jbGFzc0xpc3QucmVtb3ZlKCdzY29yZS1oaWdoJywgJ3Njb3JlLW1lZGl1bScsICdzY29yZS1sb3cnKTtcbiAgaWYgKG92ZXJhbGwgPj0gNzUpIHtcbiAgICBiYWRnZS5jbGFzc0xpc3QuYWRkKCdzY29yZS1oaWdoJyk7XG4gIH0gZWxzZSBpZiAob3ZlcmFsbCA+PSA1MCkge1xuICAgIGJhZGdlLmNsYXNzTGlzdC5hZGQoJ3Njb3JlLW1lZGl1bScpO1xuICB9IGVsc2Uge1xuICAgIGJhZGdlLmNsYXNzTGlzdC5hZGQoJ3Njb3JlLWxvdycpO1xuICB9XG5cbiAgYmFkZ2Uuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgYEFUUyBtYXRjaCBzY29yZTogJHtvdmVyYWxsfSUgKCR7c2NvcmUuYmFzaXMgfHwgJ3Jldmlldyd9KWApO1xuICBfZGlzcGF0Y2hBdHNTY29yZVVwZGF0ZWQoKTtcbn1cblxuLyoqXG4gKiBGZXRjaCBBVFMgc2NvcmUgZnJvbSBiYWNrZW5kIGFuZCB1cGRhdGUgYmFkZ2UgKyBzdGF0ZU1hbmFnZXIuXG4gKiBTYWZlIHRvIGNhbGwgYXQgYW55IHBoYXNlIFx1MjAxNCBkb2VzIG5vdGhpbmcgd2hlbiBubyBzZXNzaW9uL2FuYWx5c2lzIGF2YWlsYWJsZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW2Jhc2lzXSAgXCJhbmFseXNpc1wiIHwgXCJyZXZpZXdfY2hlY2twb2ludFwiIHwgXCJwb3N0X2dlbmVyYXRpb25cIlxuICovXG5hc3luYyBmdW5jdGlvbiByZWZyZXNoQXRzU2NvcmUoYmFzaXMgPSAncmV2aWV3X2NoZWNrcG9pbnQnKSB7XG4gIGNvbnN0IHNlc3Npb25JZCA9IGdsb2JhbFRoaXMuc3RhdGVNYW5hZ2VyPy5nZXRTZXNzaW9uSWQ/LigpO1xuICBpZiAoIXNlc3Npb25JZCkgcmV0dXJuO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL2N2L2F0cy1zY29yZScsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHNlc3Npb25faWQ6IHNlc3Npb25JZCwgYmFzaXMgfSksXG4gICAgfSk7XG4gICAgaWYgKCFyZXMub2spIHJldHVybjtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vayAmJiBkYXRhLmF0c19zY29yZSkge1xuICAgICAgZ2xvYmFsVGhpcy5zdGF0ZU1hbmFnZXI/LnNldEF0c1Njb3JlPy4oZGF0YS5hdHNfc2NvcmUpO1xuICAgICAgdXBkYXRlQXRzQmFkZ2UoZGF0YS5hdHNfc2NvcmUpO1xuICAgIH1cbiAgfSBjYXRjaCAoX2UpIHtcbiAgICAvLyBOb24tZmF0YWwgXHUyMDE0IGJhZGdlIHN0YXlzIGhpZGRlbiBvciBzaG93cyBzdGFsZSB2YWx1ZVxuICB9XG59XG5cbi8qKiBEZWJvdW5jZWQ6IGRlZmVycyByZWZyZXNoIDYwMG1zIGFmdGVyIHRoZSBsYXN0IGNhbGwuICovXG5sZXQgX2F0c1JlZnJlc2hUaW1lciA9IG51bGw7XG5mdW5jdGlvbiBzY2hlZHVsZUF0c1JlZnJlc2goYmFzaXMgPSAncmV2aWV3X2NoZWNrcG9pbnQnKSB7XG4gIGNsZWFyVGltZW91dChfYXRzUmVmcmVzaFRpbWVyKTtcbiAgX2F0c1JlZnJlc2hUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gcmVmcmVzaEF0c1Njb3JlKGJhc2lzKSwgNjAwKTtcbn1cblxuZnVuY3Rpb24gX3JlZnJlc2hTdW1tYXJ5RnJvbVN0YXRlKCkge1xuICBjb25zdCBzY29yZSA9IGdsb2JhbFRoaXMuc3RhdGVNYW5hZ2VyPy5nZXRBdHNTY29yZT8uKCk7XG4gIGlmIChzY29yZSAmJiB0eXBlb2Ygc2NvcmUub3ZlcmFsbCA9PT0gJ251bWJlcicpIHtcbiAgICBfdXBkYXRlQXRzU3VtbWFyeShzY29yZSk7XG4gIH1cbn1cblxuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdjdmJ1aWxkZXI6Z2VuZXJhdGlvbi1zdGF0ZS1jaGFuZ2VkJywgKCkgPT4ge1xuICAgIF9yZWZyZXNoU3VtbWFyeUZyb21TdGF0ZSgpO1xuICB9KTtcbn1cblxuaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgY29uc3QgcG9zaXRpb25UaXRsZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Bvc2l0aW9uLXRpdGxlJyk7XG4gIGlmIChwb3NpdGlvblRpdGxlRWwgJiYgdHlwZW9mIE11dGF0aW9uT2JzZXJ2ZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgY29uc3QgdGl0bGVPYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHtcbiAgICAgIF9yZWZyZXNoU3VtbWFyeUZyb21TdGF0ZSgpO1xuICAgIH0pO1xuICAgIHRpdGxlT2JzZXJ2ZXIub2JzZXJ2ZShwb3NpdGlvblRpdGxlRWwsIHtcbiAgICAgIGNoaWxkTGlzdDogdHJ1ZSxcbiAgICAgIGNoYXJhY3RlckRhdGE6IHRydWUsXG4gICAgICBzdWJ0cmVlOiB0cnVlLFxuICAgIH0pO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFUyBtb2R1bGUgZXhwb3J0cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmV4cG9ydCB7IHVwZGF0ZUF0c0JhZGdlLCByZWZyZXNoQXRzU2NvcmUsIHNjaGVkdWxlQXRzUmVmcmVzaCwgZm9ybWF0QXRzU2NvcmVTdW1tYXJ5IH07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9tZXNzYWdlLXF1ZXVlLmpzXG4gKiBDb252ZXJzYXRpb24gbWVzc2FnZSBhcHBlbmRpbmcsIGxvYWRpbmcgbWVzc2FnZXMsIGFuZCB0aGUgcHJlLURPTSBidWZmZXJcbiAqIHF1ZXVlIHRoYXQgaG9sZHMgbWVzc2FnZXMgZW1pdHRlZCBiZWZvcmUgI2NvbnZlcnNhdGlvbiBleGlzdHMuXG4gKlxuICogREVQRU5ERU5DSUVTOlxuICogICAtIGNsZWFuSnNvblJlc3BvbnNlLCBlc2NhcGVIdG1sIGZyb20gdXRpbHMuanNcbiAqICAgLSBzZW5kTWVzc2FnZSBmcm9tIG1lc3NhZ2UtZGlzcGF0Y2guanMgKG9uIGdsb2JhbFRoaXMsIGZvciBpbmxpbmUgYnV0dG9ucylcbiAqL1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBjbGVhbkpzb25SZXNwb25zZSwgZXNjYXBlSHRtbCB9IGZyb20gJy4vdXRpbHMuanMnO1xuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdtZXNzYWdlLXF1ZXVlJyk7XG5cbi8vIEJ1ZmZlciBmb3IgbWVzc2FnZXMgZW1pdHRlZCBiZWZvcmUgdGhlICNjb252ZXJzYXRpb24gZGl2IGV4aXN0cy5cbi8vIEZsdXNoZWQgYXQgdGhlIHN0YXJ0IG9mIGluaXQoKSBvbmNlIHRoZSBET00gaXMgZnVsbHkgcmVhZHkuXG5jb25zdCBfbWVzc2FnZVF1ZXVlID0gW107XG5cbmZ1bmN0aW9uIF9mbHVzaE1lc3NhZ2VRdWV1ZSgpIHtcbiAgd2hpbGUgKF9tZXNzYWdlUXVldWUubGVuZ3RoKSB7XG4gICAgY29uc3QgeyB0eXBlLCB0ZXh0IH0gPSBfbWVzc2FnZVF1ZXVlLnNoaWZ0KCk7XG4gICAgYXBwZW5kTWVzc2FnZSh0eXBlLCB0ZXh0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhcHBlbmRMb2FkaW5nTWVzc2FnZSh0ZXh0KSB7XG4gIGNvbnN0IGNvbnZlcnNhdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb252ZXJzYXRpb24nKTtcbiAgY29uc3QgbWVzc2FnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBtZXNzYWdlLmNsYXNzTmFtZSA9ICdtZXNzYWdlIHN5c3RlbSc7XG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgY29udGVudC5jbGFzc05hbWUgPSAnY29udGVudCBsb2FkaW5nLW1lc3NhZ2UnO1xuICBjb250ZW50LmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwibG9hZGluZy1zcGlubmVyXCI+PC9kaXY+PHNwYW4+JHt0ZXh0fTwvc3Bhbj5gO1xuICBtZXNzYWdlLmFwcGVuZENoaWxkKGNvbnRlbnQpO1xuICBjb252ZXJzYXRpb24uYXBwZW5kQ2hpbGQobWVzc2FnZSk7XG4gIGNvbnZlcnNhdGlvbi5zY3JvbGxUb3AgPSBjb252ZXJzYXRpb24uc2Nyb2xsSGVpZ2h0O1xuICByZXR1cm4gbWVzc2FnZTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlTG9hZGluZ01lc3NhZ2UobWVzc2FnZUVsZW1lbnQpIHtcbiAgaWYgKG1lc3NhZ2VFbGVtZW50ICYmIG1lc3NhZ2VFbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgICBtZXNzYWdlRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG1lc3NhZ2VFbGVtZW50KTtcbiAgfVxufVxuXG4vKiogUmVzdG9yZXMgYSBwcmV2aW91c2x5LXNhdmVkIG1lc3NhZ2Ugd2hvc2UgY29udGVudCBpcyBhbHJlYWR5IEhUTUwgKHNhdmVkIHZpYSBpbm5lckhUTUwpLiAqL1xuZnVuY3Rpb24gYXBwZW5kTWVzc2FnZUh0bWwodHlwZSwgaHRtbCkge1xuICBjb25zdCBjb252ZXJzYXRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udmVyc2F0aW9uJyk7XG4gIGNvbnN0IG1lc3NhZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgbWVzc2FnZS5jbGFzc05hbWUgPSBgbWVzc2FnZSAke3R5cGV9YDtcbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBjb250ZW50LmNsYXNzTmFtZSA9ICdjb250ZW50JztcbiAgY29udGVudC5pbm5lckhUTUwgPSBodG1sO1xuICBtZXNzYWdlLmFwcGVuZENoaWxkKGNvbnRlbnQpO1xuICBjb252ZXJzYXRpb24uYXBwZW5kQ2hpbGQobWVzc2FnZSk7XG4gIGNvbnZlcnNhdGlvbi5zY3JvbGxUb3AgPSBjb252ZXJzYXRpb24uc2Nyb2xsSGVpZ2h0O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIENvbGxhcHNpYmxlIGxvbmctY29udGVudCBoZWxwZXJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5jb25zdCBDT0xMQVBTRV9MSU5FX1RIUkVTSE9MRCA9IDg7ICAvLyBsaW5lcyBiZWZvcmUgY29sbGFwc2luZ1xuY29uc3QgQ09MTEFQU0VfQ0hBUl9USFJFU0hPTEQgPSA0ODA7IC8vIGNoYXJzIGJlZm9yZSBjb2xsYXBzaW5nXG5cbi8qKlxuICogV3JhcCByZW5kZXJlZCBIVE1MIGluIGEgY29sbGFwc2libGUgY29udGFpbmVyIHdoZW4gdGhlIGNvbnRlbnQgZXhjZWVkcyB0aGVcbiAqIHRocmVzaG9sZCwgc2hvd2luZyB0aGUgZmlyc3QgZmV3IGxpbmVzIHdpdGggYSB0b2dnbGUgYnV0dG9uLlxuICovXG5mdW5jdGlvbiBfbWFrZUNvbGxhcHNpYmxlQ29udGVudChodG1sLCB0ZXh0U3RyKSB7XG4gIGNvbnN0IGxpbmVzID0gdGV4dFN0ci5zcGxpdCgnXFxuJyk7XG4gIGlmIChsaW5lcy5sZW5ndGggPD0gQ09MTEFQU0VfTElORV9USFJFU0hPTEQgJiYgdGV4dFN0ci5sZW5ndGggPD0gQ09MTEFQU0VfQ0hBUl9USFJFU0hPTEQpIHtcbiAgICByZXR1cm4geyBodG1sLCBjb2xsYXBzaWJsZTogZmFsc2UgfTtcbiAgfVxuXG4gIC8vIEJ1aWxkIHByZXZpZXc6IGZpcnN0IENPTExBUFNFX0xJTkVfVEhSRVNIT0xEIGxpbmVzIHdvcnRoIG9mIGVzY2FwZWQgdGV4dFxuICBjb25zdCBwcmV2aWV3TGluZXMgPSBsaW5lcy5zbGljZSgwLCBDT0xMQVBTRV9MSU5FX1RIUkVTSE9MRCk7XG4gIGNvbnN0IHByZXZpZXdIdG1sID0gZXNjYXBlSHRtbChwcmV2aWV3TGluZXMuam9pbignXFxuJykpXG4gICAgLnJlcGxhY2UoL1xcKlxcKiguKz8pXFwqXFwqL2csICc8c3Ryb25nPiQxPC9zdHJvbmc+JylcbiAgICAucmVwbGFjZSgvXFwqKC4rPylcXCovZywgJzxlbT4kMTwvZW0+JylcbiAgICAucmVwbGFjZSgvYChbXmBdKylgL2csICc8Y29kZT4kMTwvY29kZT4nKVxuICAgIC5yZXBsYWNlKC9cXG4vZywgJzxicj4nKTtcblxuICBjb25zdCBvdmVyZmxvdyA9IGxpbmVzLmxlbmd0aCAtIENPTExBUFNFX0xJTkVfVEhSRVNIT0xEO1xuICBjb25zdCBpZCA9IGBjb2xsYXBzaWJsZS0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgNyl9YDtcblxuICBjb25zdCB3cmFwcGVkID0gYFxuICAgIDxkaXYgY2xhc3M9XCJtc2ctcHJldmlld1wiIGlkPVwiJHtpZH0tcHJldmlld1wiPiR7cHJldmlld0h0bWx9PC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm1zZy1mdWxsXCIgaWQ9XCIke2lkfS1mdWxsXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmVcIj4ke2h0bWx9PC9kaXY+XG4gICAgPGJ1dHRvbiBjbGFzcz1cIm1zZy10b2dnbGUtYnRuXCIgb25jbGljaz1cIihmdW5jdGlvbihidG4pe1xuICAgICAgdmFyIHA9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJyR7aWR9LXByZXZpZXcnKSxcbiAgICAgICAgICBmPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCcke2lkfS1mdWxsJyk7XG4gICAgICBpZihmLnN0eWxlLmRpc3BsYXk9PT0nbm9uZScpe1xuICAgICAgICBwLnN0eWxlLmRpc3BsYXk9J25vbmUnOyBmLnN0eWxlLmRpc3BsYXk9J2Jsb2NrJzsgYnRuLnRleHRDb250ZW50PSdTaG93IGxlc3MnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcC5zdHlsZS5kaXNwbGF5PScnOyBmLnN0eWxlLmRpc3BsYXk9J25vbmUnOyBidG4udGV4dENvbnRlbnQ9J1Nob3cgJHtvdmVyZmxvd30gbW9yZSBsaW5lJHtvdmVyZmxvdyA9PT0gMSA/ICcnIDogJ3MnfVx1MjAyNic7XG4gICAgICB9XG4gICAgfSkodGhpcylcIiB0eXBlPVwiYnV0dG9uXCI+U2hvdyAke292ZXJmbG93fSBtb3JlIGxpbmUke292ZXJmbG93ID09PSAxID8gJycgOiAncyd9XHUyMDI2PC9idXR0b24+YDtcblxuICByZXR1cm4geyBodG1sOiB3cmFwcGVkLCBjb2xsYXBzaWJsZTogdHJ1ZSB9O1xufVxuXG5mdW5jdGlvbiBhcHBlbmRNZXNzYWdlKHR5cGUsIHRleHQpIHtcbiAgY29uc3QgY29udmVyc2F0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbnZlcnNhdGlvbicpO1xuICBpZiAoIWNvbnZlcnNhdGlvbikge1xuICAgIC8vIERPTSBub3QgcmVhZHkgeWV0IFx1MjAxNCBidWZmZXIgdW50aWwgX2ZsdXNoTWVzc2FnZVF1ZXVlKCkgaXMgY2FsbGVkIGZyb20gaW5pdCgpXG4gICAgX21lc3NhZ2VRdWV1ZS5wdXNoKHsgdHlwZSwgdGV4dCB9KTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCBtZXNzYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIG1lc3NhZ2UuY2xhc3NOYW1lID0gYG1lc3NhZ2UgJHt0eXBlfWA7XG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgY29udGVudC5jbGFzc05hbWUgPSAnY29udGVudCc7XG5cbiAgLy8gU2ltcGxlIG1hcmtkb3duIHJlbmRlcmluZzogY29udmVydCAqKnRleHQqKiB0byA8c3Ryb25nPiBhbmQgcHJlc2VydmUgbmV3bGluZXNcbiAgY29uc3QgdGV4dFN0ciA9IHR5cGVvZiB0ZXh0ID09PSAnc3RyaW5nJyA/IHRleHQgOiBKU09OLnN0cmluZ2lmeSh0ZXh0LCBudWxsLCAyKTtcbiAgY29uc3QgcmVuZGVyZWRIdG1sID0gZXNjYXBlSHRtbCh0ZXh0U3RyKVxuICAgIC5yZXBsYWNlKC9cXCpcXCooLis/KVxcKlxcKi9nLCAnPHN0cm9uZz4kMTwvc3Ryb25nPicpXG4gICAgLnJlcGxhY2UoL1xcKiguKz8pXFwqL2csICc8ZW0+JDE8L2VtPicpXG4gICAgLnJlcGxhY2UoL2AoW15gXSspYC9nLCAnPGNvZGU+JDE8L2NvZGU+JylcbiAgICAucmVwbGFjZSgvXFxuL2csICc8YnI+Jyk7XG5cbiAgLy8gQXBwbHkgY29sbGFwc2libGUgd3JhcHBlciBmb3IgbG9uZyB1c2VyL2Fzc2lzdGFudCBtZXNzYWdlc1xuICBpZiAodHlwZSA9PT0gJ3VzZXInIHx8IHR5cGUgPT09ICdhc3Npc3RhbnQnKSB7XG4gICAgY29uc3QgeyBodG1sLCBjb2xsYXBzaWJsZSB9ID0gX21ha2VDb2xsYXBzaWJsZUNvbnRlbnQocmVuZGVyZWRIdG1sLCB0ZXh0U3RyKTtcbiAgICBjb250ZW50LmlubmVySFRNTCA9IGh0bWw7XG4gICAgaWYgKGNvbGxhcHNpYmxlKSBjb250ZW50LmNsYXNzTGlzdC5hZGQoJ2NvbGxhcHNpYmxlLW1zZycpO1xuICB9IGVsc2Uge1xuICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gcmVuZGVyZWRIdG1sO1xuICB9XG4gIG1lc3NhZ2UuYXBwZW5kQ2hpbGQoY29udGVudCk7XG5cbiAgLy8gQ2hlY2sgaWYgbWVzc2FnZSBlbmRzIHdpdGggcmVzcG9uc2Ugb3B0aW9ucyBsaWtlICh5ZXMvbm8vbWF5YmUpXG4gIGNvbnN0IG9wdGlvbnNNYXRjaCA9IHRleHRTdHIubWF0Y2goL1xcKChbXildK1xcL1teKV0rKVxcKVxccyokLyk7XG4gIGlmIChvcHRpb25zTWF0Y2ggJiYgdHlwZSA9PT0gJ2Fzc2lzdGFudCcpIHtcbiAgICBjb25zdCBvcHRpb25zID0gb3B0aW9uc01hdGNoWzFdLnNwbGl0KCcvJykubWFwKG9wdCA9PiBvcHQudHJpbSgpKTtcbiAgICBjb25zdCBidXR0b25Db250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBidXR0b25Db250YWluZXIuc3R5bGUuY3NzVGV4dCA9ICdtYXJnaW4tdG9wOiAxMnB4OyBkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDsgZmxleC13cmFwOiB3cmFwOyc7XG4gICAgb3B0aW9ucy5mb3JFYWNoKG9wdGlvbiA9PiB7XG4gICAgICBjb25zdCBidG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICAgIGJ0bi50ZXh0Q29udGVudCA9IG9wdGlvbjtcbiAgICAgIGJ0bi5jbGFzc05hbWUgPSAnYWN0aW9uLWJ0bic7XG4gICAgICBidG4uc3R5bGUuY3NzVGV4dCA9ICdwYWRkaW5nOiA4cHggMTZweDsgYmFja2dyb3VuZDogIzNiODJmNjsgY29sb3I6IHdoaXRlOyBib3JkZXI6IG5vbmU7IGJvcmRlci1yYWRpdXM6IDZweDsgY3Vyc29yOiBwb2ludGVyOyc7XG4gICAgICBidG4ub25jbGljayA9ICgpID0+IHtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21lc3NhZ2UtaW5wdXQnKS52YWx1ZSA9IG9wdGlvbjtcbiAgICAgICAgaWYgKHR5cGVvZiBzZW5kTWVzc2FnZSA9PT0gJ2Z1bmN0aW9uJykgc2VuZE1lc3NhZ2UoKTtcbiAgICAgIH07XG4gICAgICBidXR0b25Db250YWluZXIuYXBwZW5kQ2hpbGQoYnRuKTtcbiAgICB9KTtcbiAgICBtZXNzYWdlLmFwcGVuZENoaWxkKGJ1dHRvbkNvbnRhaW5lcik7XG4gIH1cblxuICBjb252ZXJzYXRpb24uYXBwZW5kQ2hpbGQobWVzc2FnZSk7XG4gIGNvbnZlcnNhdGlvbi5zY3JvbGxUb3AgPSBjb252ZXJzYXRpb24uc2Nyb2xsSGVpZ2h0O1xuICByZXR1cm4gbWVzc2FnZTtcbn1cblxuLyoqXG4gKiBBcHBlbmRzIGEgc3lzdGVtIGVycm9yIG1lc3NhZ2Ugd2l0aCBhbiBvcHRpb25hbCBSZXRyeSBidXR0b24uXG4gKiBAcGFyYW0ge3N0cmluZ30gICB0ZXh0ICAgICAgIC0gRXJyb3IgbWVzc2FnZSB0ZXh0IChzdXBwb3J0cyAqKmJvbGQqKiBtYXJrZG93bilcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtyZXRyeUZuXSAgLSBDYWxsZWQgd2hlbiBSZXRyeSBpcyBjbGlja2VkOyBvbWl0IGZvciBub24tcmV0cnlhYmxlIGVycm9yc1xuICogQHBhcmFtIHtzdHJpbmd9ICAgW3JldHJ5TGFiZWxdIC0gUmV0cnkgYnV0dG9uIGxhYmVsIChkZWZhdWx0ICdSZXRyeScpXG4gKi9cbmZ1bmN0aW9uIGFwcGVuZFJldHJ5TWVzc2FnZSh0ZXh0LCByZXRyeUZuLCByZXRyeUxhYmVsID0gJ1JldHJ5JywgY2FuY2VsRm4gPSBudWxsKSB7XG4gIGNvbnN0IGNvbnZlcnNhdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb252ZXJzYXRpb24nKTtcbiAgY29uc3QgbWVzc2FnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBtZXNzYWdlLmNsYXNzTmFtZSA9ICdtZXNzYWdlIHN5c3RlbSc7XG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgY29udGVudC5jbGFzc05hbWUgPSAnY29udGVudCc7XG4gIGNvbnN0IGVzY2FwZWQgPSBlc2NhcGVIdG1sKHRleHQpO1xuICBjb250ZW50LmlubmVySFRNTCA9IGVzY2FwZWRcbiAgICAucmVwbGFjZSgvXFwqXFwqKC4rPylcXCpcXCovZywgJzxzdHJvbmc+JDE8L3N0cm9uZz4nKVxuICAgIC5yZXBsYWNlKC9cXG4vZywgJzxicj4nKTtcbiAgbWVzc2FnZS5hcHBlbmRDaGlsZChjb250ZW50KTtcbiAgaWYgKHR5cGVvZiByZXRyeUZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY29uc3QgYnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgYnRuLnRleHRDb250ZW50ID0gcmV0cnlMYWJlbDtcbiAgICBidG4uc3R5bGUuY3NzVGV4dCA9ICdtYXJnaW4tdG9wOjhweDtwYWRkaW5nOjZweCAxNHB4O2JhY2tncm91bmQ6IzNiODJmNjtjb2xvcjojZmZmO2JvcmRlcjpub25lO2JvcmRlci1yYWRpdXM6NnB4O2N1cnNvcjpwb2ludGVyO2ZvbnQtc2l6ZTowLjg1cmVtO2Rpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbi1yaWdodDo4cHg7JztcbiAgICBidG4ub25jbGljayA9ICgpID0+IHsgbWVzc2FnZS5yZW1vdmUoKTsgcmV0cnlGbigpOyB9O1xuICAgIG1lc3NhZ2UuYXBwZW5kQ2hpbGQoYnRuKTtcbiAgfVxuICBpZiAodHlwZW9mIGNhbmNlbEZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY29uc3QgY2FuY2VsQnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgY2FuY2VsQnRuLnRleHRDb250ZW50ID0gJ1N0b3AgcmV0cmllcyc7XG4gICAgY2FuY2VsQnRuLnN0eWxlLmNzc1RleHQgPSAnbWFyZ2luLXRvcDo4cHg7cGFkZGluZzo2cHggMTRweDtiYWNrZ3JvdW5kOiM2YjcyODA7Y29sb3I6I2ZmZjtib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjZweDtjdXJzb3I6cG9pbnRlcjtmb250LXNpemU6MC44NXJlbTtkaXNwbGF5OmlubGluZS1ibG9jazsnO1xuICAgIGNhbmNlbEJ0bi5vbmNsaWNrID0gKCkgPT4geyBtZXNzYWdlLnJlbW92ZSgpOyBjYW5jZWxGbigpOyB9O1xuICAgIG1lc3NhZ2UuYXBwZW5kQ2hpbGQoY2FuY2VsQnRuKTtcbiAgfVxuICBjb252ZXJzYXRpb24uYXBwZW5kQ2hpbGQobWVzc2FnZSk7XG4gIGNvbnZlcnNhdGlvbi5zY3JvbGxUb3AgPSBjb252ZXJzYXRpb24uc2Nyb2xsSGVpZ2h0O1xuICByZXR1cm4gbWVzc2FnZTtcbn1cblxuZnVuY3Rpb24gYXBwZW5kRm9ybWF0dGVkQW5hbHlzaXMocmVzdWx0KSB7XG4gIHRyeSB7XG4gICAgY29uc3QgY2xlYW5SZXN1bHQgPSBjbGVhbkpzb25SZXNwb25zZShyZXN1bHQpO1xuICAgIGNvbnN0IGRhdGEgPSB0eXBlb2YgY2xlYW5SZXN1bHQgPT09ICdzdHJpbmcnID8gSlNPTi5wYXJzZShjbGVhblJlc3VsdCkgOiBjbGVhblJlc3VsdDtcblxuICAgIGlmIChkYXRhICYmIHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyAmJiAoZGF0YS50aXRsZSB8fCBkYXRhLnJlcXVpcmVkX3NraWxscykpIHtcbiAgICAgIGNvbnN0IGNvbnZlcnNhdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb252ZXJzYXRpb24nKTtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIG1lc3NhZ2UuY2xhc3NOYW1lID0gJ21lc3NhZ2UgYXNzaXN0YW50JztcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGNvbnRlbnQuY2xhc3NOYW1lID0gJ2NvbnRlbnQgam9iLWFuYWx5c2lzJztcblxuICAgICAgbGV0IGh0bWwgPSAnPGgzPlx1RDgzRFx1RENDQiBKb2IgQW5hbHlzaXMgQ29tcGxldGU8L2gzPic7XG4gICAgICBpZiAoZGF0YS50aXRsZSkgIGh0bWwgKz0gYDxwPjxzdHJvbmc+UG9zaXRpb246PC9zdHJvbmc+ICR7ZGF0YS50aXRsZX0gYXQgJHtkYXRhLmNvbXBhbnkgfHwgJ0NvbXBhbnknfTwvcD5gO1xuICAgICAgaWYgKGRhdGEuZG9tYWluKSBodG1sICs9IGA8cD48c3Ryb25nPkRvbWFpbjo8L3N0cm9uZz4gJHtkYXRhLmRvbWFpbn08L3A+YDtcblxuICAgICAgaWYgKGRhdGEucmVxdWlyZWRfc2tpbGxzPy5sZW5ndGgpIHtcbiAgICAgICAgaHRtbCArPSAnPGg0Plx1RDgzQ1x1REZBRiBSZXF1aXJlZCBTa2lsbHM6PC9oND48dWw+JztcbiAgICAgICAgZGF0YS5yZXF1aXJlZF9za2lsbHMuZm9yRWFjaChzID0+IHsgaHRtbCArPSBgPGxpPiR7c308L2xpPmA7IH0pO1xuICAgICAgICBodG1sICs9ICc8L3VsPic7XG4gICAgICB9XG4gICAgICBpZiAoZGF0YS5wcmVmZXJyZWRfc2tpbGxzPy5sZW5ndGgpIHtcbiAgICAgICAgaHRtbCArPSAnPGg0Plx1MkI1MCBQcmVmZXJyZWQgU2tpbGxzOjwvaDQ+PHVsPic7XG4gICAgICAgIGRhdGEucHJlZmVycmVkX3NraWxscy5mb3JFYWNoKHMgPT4geyBodG1sICs9IGA8bGk+JHtzfTwvbGk+YDsgfSk7XG4gICAgICAgIGh0bWwgKz0gJzwvdWw+JztcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhLm5pY2VfdG9faGF2ZV9yZXF1aXJlbWVudHM/Lmxlbmd0aCkge1xuICAgICAgICBodG1sICs9ICc8aDQ+XHUyNzI4IE5pY2UgdG8gSGF2ZTo8L2g0Pjx1bD4nO1xuICAgICAgICBkYXRhLm5pY2VfdG9faGF2ZV9yZXF1aXJlbWVudHMuZm9yRWFjaChyID0+IHsgaHRtbCArPSBgPGxpPiR7cn08L2xpPmA7IH0pO1xuICAgICAgICBodG1sICs9ICc8L3VsPic7XG4gICAgICB9XG4gICAgICBpZiAoZGF0YS5hdHNfa2V5d29yZHM/Lmxlbmd0aCkge1xuICAgICAgICBodG1sICs9ICc8aDQ+XHVEODNEXHVERDExIEFUUyBLZXl3b3Jkczo8L2g0PjxwIHN0eWxlPVwibGluZS1oZWlnaHQ6IDI7XCI+JztcbiAgICAgICAgZGF0YS5hdHNfa2V5d29yZHMuZm9yRWFjaChrdyA9PiB7XG4gICAgICAgICAgaHRtbCArPSBgPHNwYW4gc3R5bGU9XCJkaXNwbGF5OmlubGluZS1ibG9jaztiYWNrZ3JvdW5kOiNkYmVhZmU7Y29sb3I6IzFlNDBhZjtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjJweCA4cHg7bWFyZ2luOjJweDtmb250LXNpemU6MC44NWVtO1wiPiR7a3d9PC9zcGFuPmA7XG4gICAgICAgIH0pO1xuICAgICAgICBodG1sICs9ICc8L3A+JztcbiAgICAgIH1cblxuICAgICAgY29udGVudC5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgbWVzc2FnZS5hcHBlbmRDaGlsZChjb250ZW50KTtcbiAgICAgIGNvbnZlcnNhdGlvbi5hcHBlbmRDaGlsZChtZXNzYWdlKTtcbiAgICAgIGNvbnZlcnNhdGlvbi5zY3JvbGxUb3AgPSBjb252ZXJzYXRpb24uc2Nyb2xsSGVpZ2h0O1xuICAgIH0gZWxzZSB7XG4gICAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCByZXN1bHQpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZy5lcnJvcignQW5hbHlzaXMgZGlzcGxheSBlcnJvcjonLCBlKTtcbiAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCByZXN1bHQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFwcGVuZEZvcm1hdHRlZFJlc3BvbnNlKHJlc3BvbnNlKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgZGF0YSA9IHR5cGVvZiByZXNwb25zZSA9PT0gJ3N0cmluZycgPyBKU09OLnBhcnNlKHJlc3BvbnNlKSA6IHJlc3BvbnNlO1xuICAgIGlmIChkYXRhICYmIHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyAmJiAoZGF0YS50aXRsZSB8fCBkYXRhLnJlcXVpcmVkX3NraWxscykpIHtcbiAgICAgIGFwcGVuZEZvcm1hdHRlZEFuYWx5c2lzKHJlc3BvbnNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgcmVzcG9uc2UpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIHJlc3BvbnNlKTtcbiAgfVxufVxuXG4vLyBhcHBlbmRSYXdIdG1sIGlzIG5lZWRlZCBieSBtZXNzYWdlLWRpc3BhdGNoOyBkZWZpbmVkIGhlcmUgc2luY2UgaXQgdXNlcyB0aGVcbi8vIGNvbnZlcnNhdGlvbiBlbGVtZW50IHBhdHRlcm4uXG5mdW5jdGlvbiBhcHBlbmRSYXdIdG1sKGh0bWwpIHtcbiAgY29uc3QgY29udmVyc2F0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbnZlcnNhdGlvbicpO1xuICBpZiAoIWNvbnZlcnNhdGlvbikgcmV0dXJuO1xuICBjb252ZXJzYXRpb24uaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCBodG1sKTtcbiAgY29udmVyc2F0aW9uLnNjcm9sbFRvcCA9IGNvbnZlcnNhdGlvbi5zY3JvbGxIZWlnaHQ7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFUyBtb2R1bGUgZXhwb3J0cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmV4cG9ydCB7XG4gIF9tZXNzYWdlUXVldWUsIF9mbHVzaE1lc3NhZ2VRdWV1ZSxcbiAgYXBwZW5kTG9hZGluZ01lc3NhZ2UsIHJlbW92ZUxvYWRpbmdNZXNzYWdlLFxuICBhcHBlbmRNZXNzYWdlSHRtbCwgYXBwZW5kTWVzc2FnZSxcbiAgYXBwZW5kUmV0cnlNZXNzYWdlLFxuICBhcHBlbmRGb3JtYXR0ZWRBbmFseXNpcywgYXBwZW5kRm9ybWF0dGVkUmVzcG9uc2UsXG4gIGFwcGVuZFJhd0h0bWwsXG59O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvcmV2aWV3LXRhYmxlLWJhc2UuanNcbiAqIFRhYiBzd2l0Y2hpbmcsIGFuYWx5c2lzIHRhYiwgY3VzdG9taXphdGlvbiByZXNwb25zZSBoYW5kbGVyLCByZXZpZXctcGFuZVxuICogY29vcmRpbmF0aW9uLCBhbmQgdGhlIHBhZ2UtZXN0aW1hdGUgd2lkZ2V0LlxuICpcbiAqIERlcGVuZGVuY2llcyAoYWxsIHJlc29sdmVkIHRocm91Z2ggZ2xvYmFsVGhpcyBhdCBydW50aW1lKTpcbiAqICAgYXBwZW5kTWVzc2FnZSwgc2F2ZVRhYkRhdGEsIGNsZWFuSnNvblJlc3BvbnNlLCBlc2NhcGVIdG1sLFxuICogICBnZXRTdGFnZUZvclRhYiwgdXBkYXRlVGFiQmFyRm9yU3RhZ2UsIHVwZGF0ZUFjdGlvbkJ1dHRvbnMsXG4gKiAgIHBvcHVsYXRlSm9iVGFiLCBwb3B1bGF0ZVF1ZXN0aW9uc1RhYiwgYnVpbGRBY2hpZXZlbWVudHNFZGl0b3IsXG4gKiAgIHJlbmRlclJld3JpdGVQYW5lbCwgcG9wdWxhdGVDVkVkaXRvclRhYixcbiAqICAgcG9wdWxhdGVEb3dubG9hZFRhYiwgcG9wdWxhdGVTcGVsbENoZWNrVGFiLCBpbml0aWF0ZUxheW91dEluc3RydWN0aW9ucyxcbiAqICAgcG9wdWxhdGVGaW5hbGlzZVRhYiwgcG9wdWxhdGVNYXN0ZXJUYWIsIHBvcHVsYXRlQ292ZXJMZXR0ZXJUYWIsXG4gKiAgIHBvcHVsYXRlU2NyZWVuaW5nVGFiLCBleHRyYWN0Rmlyc3RKc29uT2JqZWN0LFxuICogICBmZXRjaFN0YXR1cywgYXBpQ2FsbCxcbiAqICAgYnVpbGRFeHBlcmllbmNlUmV2aWV3VGFibGUsIGJ1aWxkU2tpbGxzUmV2aWV3VGFibGUsXG4gKiAgIGJ1aWxkQWNoaWV2ZW1lbnRzUmV2aWV3VGFibGUsIGJ1aWxkU3VtbWFyeUZvY3VzU2VjdGlvbixcbiAqICAgYnVpbGRQdWJsaWNhdGlvbnNSZXZpZXdUYWJsZSwgZ2V0RXhwZXJpZW5jZURldGFpbHMsXG4gKiAgIGdldEV4cGVyaWVuY2VSZWNvbW1lbmRhdGlvbiwgYWNoaWV2ZW1lbnREZWNpc2lvbnNcbiAqL1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5jb25zdCBsb2cgPSBnZXRMb2dnZXIoJ3Jldmlldy10YWJsZS1iYXNlJyk7XG5cbmltcG9ydCB7IHN0YXRlTWFuYWdlciB9IGZyb20gJy4vc3RhdGUtbWFuYWdlci5qcyc7XG5pbXBvcnQgeyBfU1RFUF9ESVNQTEFZIH0gZnJvbSAnLi93b3JrZmxvdy1zdGVwcy5qcyc7XG5cbi8vIFx1MjUwMFx1MjUwMCBNb2R1bGUtbGV2ZWwgc3RhdGUgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmxldCB1c2VyU2VsZWN0aW9ucyA9IHtcbiAgZXhwZXJpZW5jZXM6IHt9LCAgLy8gZXhwX2lkIC0+ICdlbXBoYXNpemUnfCdpbmNsdWRlJ3wnZGUtZW1waGFzaXplJ3wnZXhjbHVkZSdcbiAgc2tpbGxzOiB7fSAgICAgICAgLy8gc2tpbGxfbmFtZSAtPiAnZW1waGFzaXplJ3wnaW5jbHVkZSd8J2RlLWVtcGhhc2l6ZSd8J2V4Y2x1ZGUnXG59O1xubGV0IHBhZ2VFc3RpbWF0ZVRpbWVyID0gbnVsbDtcbmxldCBwYWdlRXN0aW1hdGVSZXF1ZXN0SWQgPSAwO1xuXG4vLyBEcmFmdCBpbnB1dCBjYWNoZSBcdTIwMTMgcHJlc2VydmVzIHVzZXItdHlwZWQgdmFsdWVzIGFjcm9zcyB0YWIgc3dpdGNoZXNcbmNvbnN0IF9kcmFmdElucHV0cyA9IHt9O1xuXG5mdW5jdGlvbiBfc2F2ZURyYWZ0SW5wdXRzRm9yVGFiKHRhYk5hbWUpIHtcbiAgaWYgKCF0YWJOYW1lKSByZXR1cm47XG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9jdW1lbnQtY29udGVudCcpO1xuICBpZiAoIWNvbnRlbnQpIHJldHVybjtcbiAgY29uc3Qgc2F2ZWQgPSB7fTtcbiAgY29udGVudC5xdWVyeVNlbGVjdG9yQWxsKCd0ZXh0YXJlYSwgaW5wdXQsIHNlbGVjdCcpLmZvckVhY2goZWwgPT4ge1xuICAgIGlmICghZWwuaWQgfHwgZWwudHlwZSA9PT0gJ2ZpbGUnKSByZXR1cm47XG4gICAgc2F2ZWRbZWwuaWRdID0gKGVsLnR5cGUgPT09ICdjaGVja2JveCcgfHwgZWwudHlwZSA9PT0gJ3JhZGlvJykgPyBlbC5jaGVja2VkIDogZWwudmFsdWU7XG4gIH0pO1xuICBpZiAoT2JqZWN0LmtleXMoc2F2ZWQpLmxlbmd0aCA+IDApIHtcbiAgICBfZHJhZnRJbnB1dHNbdGFiTmFtZV0gPSBzYXZlZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBfcmVzdG9yZURyYWZ0SW5wdXRzRm9yVGFiKHRhYk5hbWUpIHtcbiAgY29uc3QgY2FjaGVkID0gX2RyYWZ0SW5wdXRzW3RhYk5hbWVdO1xuICBpZiAoIWNhY2hlZCkgcmV0dXJuO1xuICBPYmplY3QuZW50cmllcyhjYWNoZWQpLmZvckVhY2goKFtpZCwgdmFsdWVdKSA9PiB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgaWYgKCFlbCB8fCBlbC5yZWFkT25seSB8fCBlbC5kaXNhYmxlZCB8fCBlbC50eXBlID09PSAnZmlsZScpIHJldHVybjtcbiAgICBpZiAoZWwudHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBlbC50eXBlID09PSAncmFkaW8nKSB7XG4gICAgICBlbC5jaGVja2VkID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZW5zdXJlVGFiRGF0YVN0YXRlKCkge1xuICByZXR1cm4gc3RhdGVNYW5hZ2VyLmdldEFsbFRhYkRhdGEoKTtcbn1cblxuZnVuY3Rpb24gaXNSZWNvbm5lY3RJblByb2dyZXNzKCkge1xuICByZXR1cm4gc3RhdGVNYW5hZ2VyLmlzUmVjb25uZWN0aW5nKCk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBJbmNsdXNpb24gY291bnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiB1cGRhdGVJbmNsdXNpb25Db3VudHMoKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgZXhwRGVjcyA9ICh3aW5kb3cuX3NhdmVkRGVjaXNpb25zICYmIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMuZXhwZXJpZW5jZV9kZWNpc2lvbnMpIHx8IHVzZXJTZWxlY3Rpb25zLmV4cGVyaWVuY2VzIHx8IHt9O1xuICAgIGNvbnN0IHNraWxsRGVjcyA9ICh3aW5kb3cuX3NhdmVkRGVjaXNpb25zICYmIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMuc2tpbGxfZGVjaXNpb25zKSB8fCB1c2VyU2VsZWN0aW9ucy5za2lsbHMgfHwge307XG4gICAgY29uc3QgYWNoRGVjcyA9ICh3aW5kb3cuX3NhdmVkRGVjaXNpb25zICYmIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMuYWNoaWV2ZW1lbnRfZGVjaXNpb25zKSB8fCB3aW5kb3cuYWNoaWV2ZW1lbnREZWNpc2lvbnMgfHwge307XG5cbiAgICBjb25zdCBleHBJbmNsdWRlZCA9IE9iamVjdC52YWx1ZXMoZXhwRGVjcykuZmlsdGVyKHYgPT4gdiAhPT0gJ2V4Y2x1ZGUnKS5sZW5ndGg7XG4gICAgY29uc3Qgc2tpbGxJbmNsdWRlZCA9IE9iamVjdC52YWx1ZXMoc2tpbGxEZWNzKS5maWx0ZXIodiA9PiB2ICE9PSAnZXhjbHVkZScpLmxlbmd0aDtcbiAgICBjb25zdCBhY2hJbmNsdWRlZCA9IE9iamVjdC52YWx1ZXMoYWNoRGVjcykuZmlsdGVyKHYgPT4gdiAhPT0gJ2V4Y2x1ZGUnKS5sZW5ndGg7XG5cbiAgICBjb25zdCBleHBUYWIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFiLWV4cC1yZXZpZXcnKTtcbiAgICBjb25zdCBza2lsbFRhYiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWItc2tpbGxzLXJldmlldycpO1xuICAgIGNvbnN0IGFjaFRhYiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWItYWNoaWV2ZW1lbnRzLXJldmlldycpO1xuXG4gICAgaWYgKGV4cFRhYikgZXhwVGFiLnRleHRDb250ZW50ID0gYFx1RDgzRFx1RENDQSBFeHBlcmllbmNlcyR7ZXhwSW5jbHVkZWQgPyAnICgnICsgZXhwSW5jbHVkZWQgKyAnKScgOiAnJ31gO1xuICAgIGlmIChza2lsbFRhYikgc2tpbGxUYWIudGV4dENvbnRlbnQgPSBgXHVEODNEXHVERUUwXHVGRTBGIFNraWxscyR7c2tpbGxJbmNsdWRlZCA/ICcgKCcgKyBza2lsbEluY2x1ZGVkICsgJyknIDogJyd9YDtcbiAgICBpZiAoYWNoVGFiKSBhY2hUYWIudGV4dENvbnRlbnQgPSBgXHVEODNDXHVERkM2IEFjaGlldmVtZW50cyR7YWNoSW5jbHVkZWQgPyAnICgnICsgYWNoSW5jbHVkZWQgKyAnKScgOiAnJ31gO1xuICB9IGNhdGNoIChlKSB7IGxvZy53YXJuKCdGYWlsZWQgdG8gdXBkYXRlIGluY2x1c2lvbiBjb3VudHM6JywgZSk7IH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIEdlbmVyYXRlIENWIHRhYiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gX3BvcHVsYXRlR2VuZXJhdGVUYWIoY3ZEYXRhLCBjb250ZW50KSB7XG4gIGlmICghY3ZEYXRhIHx8ICFjdkRhdGEuZmlsZXMgfHwgIWN2RGF0YS5maWxlcy5sZW5ndGgpIHtcbiAgICBjb250ZW50LmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwiZW1wdHktc3RhdGVcIj48ZGl2IGNsYXNzPVwiaWNvblwiPlx1RDgzRFx1RENDNDwvZGl2PjxoMz5HZW5lcmF0ZWQgQ1Y8L2gzPjxwPkdlbmVyYXRlIENWIHRvIHNlZSBwcmV2aWV3PC9wPjwvZGl2Pic7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgbWV0YSAgICAgPSBjdkRhdGEubWV0YWRhdGEgfHwge307XG4gIGNvbnN0IHJvbGUgICAgID0gbWV0YS5yb2xlICAgICB8fCBtZXRhLnBvc2l0aW9uIHx8ICcnO1xuICBjb25zdCBjb21wYW55ICA9IG1ldGEuY29tcGFueSAgfHwgJyc7XG4gIGNvbnN0IHN1YnRpdGxlID0gcm9sZSAmJiBjb21wYW55ID8gYCR7cm9sZX0gXHUyMDE0ICR7Y29tcGFueX1gIDogcm9sZSB8fCBjb21wYW55IHx8ICdDViBnZW5lcmF0ZWQnO1xuXG4gIGNvbnN0IElDT05TID0geyAnLnBkZic6ICdcdUQ4M0RcdURDQzQnLCAnLmRvY3gnOiAnXHVEODNEXHVEQ0REJywgJy5odG1sJzogJ1x1RDgzQ1x1REYxMCcgfTtcbiAgY29uc3QgTEFCRUxTID0ge1xuICAgICcucGRmJzogIGYgPT4gZi5pbmNsdWRlcygnQVRTJykgPyAnQVRTIFBERicgIDogJ0h1bWFuIFBERicsXG4gICAgJy5kb2N4JzogZiA9PiBmLmluY2x1ZGVzKCdBVFMnKSA/ICdBVFMgRE9DWCcgOiBmLnN0YXJ0c1dpdGgoJ0NvdmVyTGV0dGVyXycpID8gJ0NvdmVyIExldHRlcicgOiAnSHVtYW4gRE9DWCcsXG4gICAgJy5odG1sJzogKCkgPT4gJ0hUTUwnLFxuICB9O1xuXG4gIGNvbnN0IGRvd25sb2FkYWJsZUV4dHMgPSBuZXcgU2V0KFsnLnBkZicsICcuZG9jeCcsICcuaHRtbCddKTtcbiAgY29uc3QgZmlsZXMgPSAoY3ZEYXRhLmZpbGVzIHx8IFtdKS5maWx0ZXIoZiA9PiB7XG4gICAgY29uc3QgZXh0ID0gZi5zbGljZShmLmxhc3RJbmRleE9mKCcuJykpLnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIGRvd25sb2FkYWJsZUV4dHMuaGFzKGV4dCkgJiYgZiAhPT0gJ2pvYl9kZXNjcmlwdGlvbi50eHQnO1xuICB9KTtcblxuICBjb25zdCBzaWQgPSB0eXBlb2YgZ2V0U2Vzc2lvbklkRnJvbVVSTCA9PT0gJ2Z1bmN0aW9uJyA/IGdldFNlc3Npb25JZEZyb21VUkwoKSA6IG51bGw7XG4gIGNvbnN0IHNlc3Npb25QYXJhbSA9IHNpZCA/IGA/c2Vzc2lvbl9pZD0ke2VuY29kZVVSSUNvbXBvbmVudChzaWQpfWAgOiAnJztcblxuICBsZXQgZmlsZVJvd3MgPSAnJztcbiAgZm9yIChjb25zdCBmIG9mIGZpbGVzKSB7XG4gICAgY29uc3QgZXh0ICAgPSBmLnNsaWNlKGYubGFzdEluZGV4T2YoJy4nKSkudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBpY29uICA9IElDT05TW2V4dF0gIHx8ICdcdUQ4M0RcdURDQzEnO1xuICAgIGNvbnN0IGxhYmVsID0gTEFCRUxTW2V4dF0gPyBMQUJFTFNbZXh0XShmKSA6IGY7XG4gICAgZmlsZVJvd3MgKz0gYFxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjEycHg7cGFkZGluZzoxMHB4IDA7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2YxZjVmOTtcIj5cbiAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MS40ZW07XCI+JHtpY29ufTwvc3Bhbj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImZsZXg6MTttaW4td2lkdGg6MDtcIj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtmb250LXdlaWdodDo2MDA7Y29sb3I6IzM3NDE1MTtcIj4ke2xhYmVsfTwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC43OGVtO2NvbG9yOiM5Y2EzYWY7d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO1wiPiR7ZXNjYXBlSHRtbChmKX08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxhIGhyZWY9XCIvYXBpL2Rvd25sb2FkLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGYpfSR7c2Vzc2lvblBhcmFtfVwiIGRvd25sb2FkPVwiJHtlc2NhcGVIdG1sKGYpfVwiXG4gICAgICAgICAgIGNsYXNzPVwiYnRuLXNlY29uZGFyeVwiIHN0eWxlPVwicGFkZGluZzo2cHggMTRweDtmb250LXNpemU6MC44NWVtO3RleHQtZGVjb3JhdGlvbjpub25lO2Rpc3BsYXk6aW5saW5lLWJsb2NrO1wiPkRvd25sb2FkPC9hPlxuICAgICAgPC9kaXY+YDtcbiAgfVxuXG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgc3R5bGU9XCJtYXgtd2lkdGg6NjQwcHg7bWFyZ2luOjAgYXV0bztwYWRkaW5nOjI0cHggMDtcIj5cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDoxMnB4O21hcmdpbi1ib3R0b206MjRweDtcIj5cbiAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MmVtO1wiPlx1MjcwNTwvc3Bhbj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8aDIgc3R5bGU9XCJtYXJnaW46MDtmb250LXNpemU6MS4yZW07Y29sb3I6IzExMTgyNztcIj5DViBHZW5lcmF0ZWQ8L2gyPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC45ZW07Y29sb3I6IzZiNzI4MDtcIj4ke2VzY2FwZUh0bWwoc3VidGl0bGUpfTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2ZmZjtib3JkZXI6MXB4IHNvbGlkICNlMmU4ZjA7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzowIDE2cHg7bWFyZ2luLWJvdHRvbToyNHB4O1wiPlxuICAgICAgICAke2ZpbGVSb3dzfVxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwibmF2LWJ1dHRvbnMgbmF2LWVuZFwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29udGludWUtYnRuXCIgb25jbGljaz1cInN3aXRjaFRhYignbGF5b3V0JylcIj5PcGVuIExheW91dCBSZXZpZXcgXHUyMTkyPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgVGFiIHN3aXRjaGluZyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLy8gVHJhY2tzIHdoaWNoIGN1c3RvbWlzZS1zdGFnZSBzdWItdGFicyBoYXZlIGJlZW4gdmlld2VkIHRoaXMgc2Vzc2lvbiAoR0FQLTI2OSkuXG5jb25zdCBfdmlzaXRlZEN1c3RvbWlzZVRhYnMgPSBuZXcgU2V0KCk7XG5jb25zdCBfQ1VTVE9NSVNFX1RBQlMgPSBuZXcgU2V0KFsnZ29hbHMnLCAncXVlc3Rpb25zJywgJ2V4cC1yZXZpZXcnLCAnYWNoLWVkaXRvcicsICdza2lsbHMtcmV2aWV3JywgJ2FjaGlldmVtZW50cy1yZXZpZXcnLCAndGFnbGluZS1yZXZpZXcnLCAnc3VtbWFyeS1yZXZpZXcnLCAncHVibGljYXRpb25zLXJldmlldycsICdhdHMtc2NvcmUnXSk7XG5cbmZ1bmN0aW9uIF91cGRhdGVWaXNpdGVkVGFiSW5kaWNhdG9ycygpIHtcbiAgX3Zpc2l0ZWRDdXN0b21pc2VUYWJzLmZvckVhY2gobmFtZSA9PiB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgdGFiLSR7bmFtZX1gKTtcbiAgICBpZiAoZWwpIGVsLmNsYXNzTGlzdC5hZGQoJ3RhYi0tdmlzaXRlZCcpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gc3dpdGNoVGFiKHRhYikge1xuICAvLyBDbGVhciBrZXlib2FyZC1mb2N1c2VkIGNhcmQgc3RhdGUgd2hlbiBsZWF2aW5nIGEgcmV2aWV3IHRhYlxuICBpZiAodHlwZW9mIHJlc2V0Q2FyZEZvY3VzID09PSAnZnVuY3Rpb24nKSByZXNldENhcmRGb2N1cygpO1xuXG4gIC8vIFNhdmUgdW5zYXZlZCB1c2VyIGlucHV0IGZyb20gdGhlIHRhYiB3ZSBhcmUgbGVhdmluZ1xuICBfc2F2ZURyYWZ0SW5wdXRzRm9yVGFiKHN0YXRlTWFuYWdlci5nZXRDdXJyZW50VGFiKCkpO1xuXG4gIC8vIFN5bmMgc2Vjb25kLWJhciB2aXNpYmlsaXR5IHRvIHRoaXMgdGFiJ3Mgc3RhZ2VcbiAgbGV0IF9zd2l0Y2hUYWJTdGFnZSA9IG51bGw7XG4gIGlmICh0eXBlb2YgZ2V0U3RhZ2VGb3JUYWIgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHVwZGF0ZVRhYkJhckZvclN0YWdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgX3N3aXRjaFRhYlN0YWdlID0gZ2V0U3RhZ2VGb3JUYWIodGFiKTtcbiAgICBpZiAoX3N3aXRjaFRhYlN0YWdlKSB7XG4gICAgICB1cGRhdGVUYWJCYXJGb3JTdGFnZShfc3dpdGNoVGFiU3RhZ2UpO1xuICAgICAgdXBkYXRlQWN0aW9uQnV0dG9ucyhfc3dpdGNoVGFiU3RhZ2UpO1xuICAgIH1cbiAgfVxuICAvLyBBbHdheXMgdXBkYXRlIHdvcmtmbG93IGNsaWNrYWJsZSBzdGF0ZSB1c2luZyBjdXJyZW50IHBoYXNlXG4gIGlmICh0eXBlb2Ygc3RhdGVNYW5hZ2VyPy5nZXRQaGFzZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdXBkYXRlV29ya2Zsb3dTdGVwc0NsaWNrYWJsZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHVwZGF0ZVdvcmtmbG93U3RlcHNDbGlja2FibGUoc3RhdGVNYW5hZ2VyLmdldFBoYXNlKCkpO1xuICB9XG5cbiAgLy8gVXBkYXRlIGFjdGl2ZSB0YWIsIEFSSUEgc3RhdGUsIGFuZCByb3ZpbmcgdGFiaW5kZXggKFdDQUcgMi4xIHRhYmxpc3QgcGF0dGVybilcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnRhYicpLmZvckVhY2godCA9PiB7XG4gICAgdC5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICB0LnNldEF0dHJpYnV0ZSgnYXJpYS1zZWxlY3RlZCcsICdmYWxzZScpO1xuICAgIHQuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICctMScpO1xuICB9KTtcbiAgY29uc3QgYWN0aXZlVGFiID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHRhYi0ke3RhYn1gKTtcbiAgaWYgKGFjdGl2ZVRhYikge1xuICAgIGFjdGl2ZVRhYi5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICBhY3RpdmVUYWIuc2V0QXR0cmlidXRlKCdhcmlhLXNlbGVjdGVkJywgJ3RydWUnKTtcbiAgICBhY3RpdmVUYWIuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICcwJyk7XG4gICAgY29uc3QgdGFicGFuZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9jdW1lbnQtY29udGVudCcpO1xuICAgIGlmICh0YWJwYW5lbCkgdGFicGFuZWwuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsbGVkYnknLCBgdGFiLSR7dGFifWApO1xuICB9XG4gIHN0YXRlTWFuYWdlci5zZXRDdXJyZW50VGFiKHRhYik7XG5cbiAgLy8gTWFyayB0aGlzIHRhYiBhcyB2aXNpdGVkIGFuZCByZWZyZXNoIHRoZSB2aXNpdGVkIGluZGljYXRvcnMgKEdBUC0yNjkpXG4gIGlmIChfQ1VTVE9NSVNFX1RBQlMuaGFzKHRhYikpIHtcbiAgICBfdmlzaXRlZEN1c3RvbWlzZVRhYnMuYWRkKHRhYik7XG4gICAgX3VwZGF0ZVZpc2l0ZWRUYWJJbmRpY2F0b3JzKCk7XG4gIH1cblxuICAvLyBBbm5vdW5jZSB0aGUgdGFiIGNoYW5nZSB0byBzY3JlZW4gcmVhZGVycyAoR0FQLTczKS4gQ29tYmluZWQgd2l0aCB0aGVcbiAgLy8gc3RhZ2UgbmFtZSAoR0FQLTE2IFBhcnQgQSkgaW50byBhIHNpbmdsZSBtZXNzYWdlIGZyb20gdGhpcyBvbmUgY2FsbCBzaXRlXG4gIC8vIFx1MjAxNCAjdGFiLXN0YWdlLWxhYmVsIGlzIGEgdmlzaWJsZS1vbmx5IGxhYmVsLCBub3QgYSBzZWNvbmQgbGl2ZSByZWdpb24sIHRvXG4gIC8vIGF2b2lkIGEgZG91YmxlLWFubm91bmNlIG9mIHRoZSBzYW1lIG5hdmlnYXRpb24gZXZlbnQuXG4gIGNvbnN0IGFubm91bmNlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd3b3JrZmxvdy1zdGFnZS1hbm5vdW5jZXInKTtcbiAgaWYgKGFubm91bmNlciAmJiBhY3RpdmVUYWIpIHtcbiAgICBjb25zdCBzdGFnZUxhYmVsID0gX3N3aXRjaFRhYlN0YWdlID8gX1NURVBfRElTUExBWVtfc3dpdGNoVGFiU3RhZ2VdIDogbnVsbDtcbiAgICBjb25zdCB0YWJMYWJlbCA9IGFjdGl2ZVRhYi50ZXh0Q29udGVudC50cmltKCk7XG4gICAgY29uc3QgbWVzc2FnZSA9IHN0YWdlTGFiZWwgPyBgTm93IHZpZXdpbmc6ICR7c3RhZ2VMYWJlbH0gXHUyMDE0ICR7dGFiTGFiZWx9YCA6IGBOb3cgdmlld2luZzogJHt0YWJMYWJlbH1gO1xuICAgIGFubm91bmNlci50ZXh0Q29udGVudCA9ICcnO1xuICAgIHNldFRpbWVvdXQoKCkgPT4geyBhbm5vdW5jZXIudGV4dENvbnRlbnQgPSBtZXNzYWdlOyB9LCA1MCk7XG4gIH1cblxuICAvLyBTeW5jIHZpZXctY3Vyc29yIHJpbmcgdG8gdGhlIG5ld2x5IHZpc2libGUgdGFiXG4gIGlmICh0eXBlb2YgX3VwZGF0ZVZpZXdpbmdJbmRpY2F0b3IgPT09ICdmdW5jdGlvbicpIF91cGRhdGVWaWV3aW5nSW5kaWNhdG9yKHRhYik7XG5cbiAgLy8gQWxsIHRhYnMgZXhjZXB0ICdjdicgdXNlIGZ1bGwtd2lkdGggbGF5b3V0IChubyBwYXBlci1zaXplZCBjZW50ZXJpbmcpXG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9jdW1lbnQtY29udGVudCcpO1xuICBjb250ZW50LmNsYXNzTGlzdC50b2dnbGUoJ2Z1bGwtd2lkdGgnLCB0YWIgIT09ICdnZW5lcmF0ZScpO1xuXG4gIC8vIExvYWQgY29udGVudCBmb3IgdGFiXG4gIGxvYWRUYWJDb250ZW50KHRhYik7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxvYWRUYWJDb250ZW50KHRhYikge1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgY29uc3QgdGFiRGF0YSA9IGVuc3VyZVRhYkRhdGFTdGF0ZSgpO1xuXG4gIHRyeSB7XG4gIHN3aXRjaCAodGFiKSB7XG4gICAgY2FzZSAnam9iJzpcbiAgICAgIGF3YWl0IHBvcHVsYXRlSm9iVGFiKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdnb2Fscyc6XG4gICAgICBpZiAodHlwZW9mIHBvcHVsYXRlR29hbHNUYWIgPT09ICdmdW5jdGlvbicpIGF3YWl0IHBvcHVsYXRlR29hbHNUYWIoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2FuYWx5c2lzJzpcbiAgICAgIGlmICh0YWJEYXRhLmFuYWx5c2lzKSB7XG4gICAgICAgIHBvcHVsYXRlQW5hbHlzaXNUYWIodGFiRGF0YS5hbmFseXNpcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250ZW50LmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwiZW1wdHktc3RhdGVcIj48ZGl2IGNsYXNzPVwiaWNvblwiPlx1RDgzRFx1REQwRDwvZGl2PjxoMz5Kb2IgQW5hbHlzaXM8L2gzPjxwPkNsaWNrIFwiQW5hbHl6ZSBKb2JcIiB0byBnZW5lcmF0ZSBhbmFseXNpczwvcD48L2Rpdj4nO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAncXVlc3Rpb25zJzpcbiAgICAgIHBvcHVsYXRlUXVlc3Rpb25zVGFiKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdjdXN0b21pemF0aW9ucyc6XG4gICAgICBzd2l0Y2hUYWIoJ2V4cC1yZXZpZXcnKTtcbiAgICAgIHJldHVybjtcbiAgICBjYXNlICdleHAtcmV2aWV3JzpcbiAgICAgIGF3YWl0IHBvcHVsYXRlUmV2aWV3VGFiKCdleHBlcmllbmNlcycpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYWNoLWVkaXRvcic6XG4gICAgICBhd2FpdCBidWlsZEFjaGlldmVtZW50c0VkaXRvcigpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc2tpbGxzLXJldmlldyc6XG4gICAgICBhd2FpdCBwb3B1bGF0ZVJldmlld1RhYignc2tpbGxzJyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdhY2hpZXZlbWVudHMtcmV2aWV3JzpcbiAgICAgIGF3YWl0IHBvcHVsYXRlUmV2aWV3VGFiKCdhY2hpZXZlbWVudHMnKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3RhZ2xpbmUtcmV2aWV3JzpcbiAgICAgIGF3YWl0IHBvcHVsYXRlVGFnbGluZVJldmlld1RhYigpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc3VtbWFyeS1yZXZpZXcnOlxuICAgICAgYXdhaXQgcG9wdWxhdGVSZXZpZXdUYWIoJ3N1bW1hcnknKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3B1YmxpY2F0aW9ucy1yZXZpZXcnOlxuICAgICAgYXdhaXQgcG9wdWxhdGVSZXZpZXdUYWIoJ3B1YmxpY2F0aW9ucycpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYXRzLXNjb3JlJzpcbiAgICAgIGlmICh0eXBlb2YgcG9wdWxhdGVBdHNTY29yZVRhYiA9PT0gJ2Z1bmN0aW9uJykgYXdhaXQgcG9wdWxhdGVBdHNTY29yZVRhYigpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAncmV3cml0ZSc6XG4gICAgICBpZiAod2luZG93Ll9yZXdyaXRlUGFuZWxDYWNoZSkge1xuICAgICAgICByZW5kZXJSZXdyaXRlUGFuZWwoXG4gICAgICAgICAgd2luZG93Ll9yZXdyaXRlUGFuZWxDYWNoZS5yZXdyaXRlcyxcbiAgICAgICAgICB3aW5kb3cuX3Jld3JpdGVQYW5lbENhY2hlLndhcm5pbmdzLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImVtcHR5LXN0YXRlXCI+PGRpdiBjbGFzcz1cImljb25cIj5cdTI3MEZcdUZFMEY8L2Rpdj48aDM+UmV3cml0ZXM8L2gzPjxwPkxvYWRpbmcgcmV3cml0ZXNcdTIwMjY8L3A+PC9kaXY+JztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgYXBpQ2FsbCgnR0VUJywgJy9hcGkvcmV3cml0ZXMnKTtcbiAgICAgICAgICBpZiAoZGF0YS5yZXdyaXRlcykge1xuICAgICAgICAgICAgcmVuZGVyUmV3cml0ZVBhbmVsKGRhdGEucmV3cml0ZXMsIGRhdGEucGVyc3Vhc2lvbl93YXJuaW5ncyB8fCBbXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJlbXB0eS1zdGF0ZVwiPjxkaXYgY2xhc3M9XCJpY29uXCI+XHUyNzBGXHVGRTBGPC9kaXY+PGgzPlJld3JpdGVzPC9oMz48cD5Db21wbGV0ZSBjdXN0b21pemF0aW9ucyB0byByZWFjaCB0aGlzIHN0ZXA8L3A+PC9kaXY+JztcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb250ZW50LmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwiZW1wdHktc3RhdGVcIj48ZGl2IGNsYXNzPVwiaWNvblwiPlx1MjcwRlx1RkUwRjwvZGl2PjxoMz5SZXdyaXRlczwvaDM+PHA+Q29tcGxldGUgY3VzdG9taXphdGlvbnMgdG8gcmVhY2ggdGhpcyBzdGVwPC9wPjwvZGl2Pic7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2VkaXRvcic6XG4gICAgICBhd2FpdCBwb3B1bGF0ZUNWRWRpdG9yVGFiKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdnZW5lcmF0ZSc6XG4gICAgICBfcG9wdWxhdGVHZW5lcmF0ZVRhYih0YWJEYXRhLmN2LCBjb250ZW50KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2Rvd25sb2FkJzpcbiAgICAgIGlmICh0YWJEYXRhLmN2ICYmIE9iamVjdC5rZXlzKHRhYkRhdGEuY3YpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYXdhaXQgcG9wdWxhdGVEb3dubG9hZFRhYih0YWJEYXRhLmN2KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJlbXB0eS1zdGF0ZVwiPjxkaXYgY2xhc3M9XCJpY29uXCI+XHUyQjA3XHVGRTBGPC9kaXY+PGgzPkRvd25sb2FkPC9oMz48cD5HZW5lcmF0ZSBDViB0byBlbmFibGUgZG93bmxvYWRzPC9wPjwvZGl2Pic7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdzcGVsbCc6XG4gICAgICBhd2FpdCBwb3B1bGF0ZVNwZWxsQ2hlY2tUYWIoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2xheW91dCc6XG4gICAgICBpbml0aWF0ZUxheW91dEluc3RydWN0aW9ucygpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZmluYWxpc2UnOlxuICAgICAgYXdhaXQgcG9wdWxhdGVGaW5hbGlzZVRhYigpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnaGFydmVzdCc6XG4gICAgICBpZiAodHlwZW9mIHBvcHVsYXRlSGFydmVzdFRhYiA9PT0gJ2Z1bmN0aW9uJykgYXdhaXQgcG9wdWxhdGVIYXJ2ZXN0VGFiKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdpbnRlcnZpZXctcHJlcCc6XG4gICAgICBpZiAodHlwZW9mIHBvcHVsYXRlSW50ZXJ2aWV3UHJlcFRhYiA9PT0gJ2Z1bmN0aW9uJykgYXdhaXQgcG9wdWxhdGVJbnRlcnZpZXdQcmVwVGFiKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd0aGFuay15b3UnOlxuICAgICAgaWYgKHR5cGVvZiBwb3B1bGF0ZVRoYW5rWW91VGFiID09PSAnZnVuY3Rpb24nKSBhd2FpdCBwb3B1bGF0ZVRoYW5rWW91VGFiKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdtYXN0ZXInOlxuICAgICAgYXdhaXQgcG9wdWxhdGVNYXN0ZXJUYWIoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2NvdmVyLWxldHRlcic6XG4gICAgICBhd2FpdCBwb3B1bGF0ZUNvdmVyTGV0dGVyVGFiKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdzY3JlZW5pbmcnOlxuICAgICAgYXdhaXQgcG9wdWxhdGVTY3JlZW5pbmdUYWIoKTtcbiAgICAgIGJyZWFrO1xuICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nLmVycm9yKGBFcnJvciBsb2FkaW5nIHRhYiAke3RhYn06YCwgZXJyb3IpO1xuICAgIC8vIHRleHRDb250ZW50LCBub3QgaW5uZXJIVE1MIFx1MjAxNCBhIHRocm93biBlcnJvciBtZXNzYWdlIG11c3QgbmV2ZXIgYmVcbiAgICAvLyBpbnRlcnByZXRlZCBhcyBIVE1MIChlLmcuIGFuIGVycm9yIHN0cmluZyBjb250YWluaW5nIGEgc3RyYXkgPGltZz4pLlxuICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3AnKTtcbiAgICBlcnJvck1lc3NhZ2Uuc3R5bGUuY3NzVGV4dCA9ICdwYWRkaW5nOiAyMHB4OyBjb2xvcjogI2M0MWUzYTsnO1xuICAgIGVycm9yTWVzc2FnZS50ZXh0Q29udGVudCA9IGBFcnJvciBsb2FkaW5nIGNvbnRlbnQ6ICR7ZXJyb3IubWVzc2FnZX1gO1xuICAgIGNvbnRlbnQuYXBwZW5kQ2hpbGQoZXJyb3JNZXNzYWdlKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBSZXN0b3JlIHVuc2F2ZWQgdXNlciBpbnB1dCBmb3IgdGhlIG5ld2x5IGxvYWRlZCB0YWJcbiAgX3Jlc3RvcmVEcmFmdElucHV0c0ZvclRhYih0YWIpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgUmV2aWV3IHRhYiAoZmxhdCwgb25lIHBhbmUgcGVyIHRvcC1sZXZlbCB0YWIpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBzaG93VGFibGVCYXNlZFJldmlldygpIHtcbiAgaWYgKCF3aW5kb3cucGVuZGluZ1JlY29tbWVuZGF0aW9ucykge1xuICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsICdObyByZWNvbW1lbmRhdGlvbnMgdG8gcmV2aWV3LiBQbGVhc2UgZ2VuZXJhdGUgY3VzdG9taXphdGlvbnMgZmlyc3QuJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgc3dpdGNoVGFiKCdleHAtcmV2aWV3Jyk7XG4gIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsICdcdTI3MDUgQ3VzdG9taXphdGlvbnMgZ2VuZXJhdGVkISBQbGVhc2UgcmV2aWV3IGVhY2ggc2VjdGlvbiBpbiB0aGUgKipDdXN0b21pemF0aW9ucyoqIHRhYiBcdTIwMTQgRXhwZXJpZW5jZXMsIEFjaGlldmVtZW50cywgU2tpbGxzLCBTdW1tYXJ5LCBhbmQgUHVibGljYXRpb25zLiBTZWxlY3QgeW91ciBwcmVmZXJlbmNlcyB1c2luZyB0aGUgYWN0aW9uIGJ1dHRvbnMsIHRoZW4gc3VibWl0IHlvdXIgZGVjaXNpb25zLicpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgQW5hbHlzaXMgdGFiIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4vLyBDYWNoZWQgc3lub255bSBtYXA6IGFsaWFzIChsb3dlcikgXHUyMTkyIGNhbm9uaWNhbCwgYW5kIGNhbm9uaWNhbCAobG93ZXIpIFx1MjE5MiBbYWxpYXNlc11cbmxldCBfc3lub255bU1hcENhY2hlID0gbnVsbDtcbmFzeW5jIGZ1bmN0aW9uIF9sb2FkU3lub255bU1hcCgpIHtcbiAgaWYgKF9zeW5vbnltTWFwQ2FjaGUpIHJldHVybiBfc3lub255bU1hcENhY2hlO1xuICB0cnkge1xuICAgIGNvbnN0IHNlc3Npb25JZCA9IHN0YXRlTWFuYWdlci5nZXRTZXNzaW9uSWQgJiYgc3RhdGVNYW5hZ2VyLmdldFNlc3Npb25JZCgpO1xuICAgIGNvbnN0IHVybCA9IHNlc3Npb25JZCA/IGAvYXBpL3N5bm9ueW0tbWFwP3Nlc3Npb25faWQ9JHtlbmNvZGVVUklDb21wb25lbnQoc2Vzc2lvbklkKX1gIDogJy9hcGkvc3lub255bS1tYXAnO1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICAgIGlmICghcmVzLm9rKSByZXR1cm4gKF9zeW5vbnltTWFwQ2FjaGUgPSB7fSk7XG4gICAgY29uc3QgcmF3ICA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgY29uc3QgYWxpYXNUb0Nhbm9uID0ge307XG4gICAgY29uc3QgY2Fub25Ub0FsaWFzZXMgPSB7fTtcbiAgICBPYmplY3QuZW50cmllcyhyYXcpLmZvckVhY2goKFthbGlhcywgY2Fub25dKSA9PiB7XG4gICAgICBhbGlhc1RvQ2Fub25bYWxpYXMudG9Mb3dlckNhc2UoKV0gPSBjYW5vbjtcbiAgICAgIGNvbnN0IGNsID0gY2Fub24udG9Mb3dlckNhc2UoKTtcbiAgICAgIChjYW5vblRvQWxpYXNlc1tjbF0gPSBjYW5vblRvQWxpYXNlc1tjbF0gfHwgW10pLnB1c2goYWxpYXMpO1xuICAgIH0pO1xuICAgIF9zeW5vbnltTWFwQ2FjaGUgPSB7IGFsaWFzVG9DYW5vbiwgY2Fub25Ub0FsaWFzZXMgfTtcbiAgfSBjYXRjaCAoXykgeyBfc3lub255bU1hcENhY2hlID0ge307IH1cbiAgcmV0dXJuIF9zeW5vbnltTWFwQ2FjaGU7XG59XG5cbmZ1bmN0aW9uIF9rd1N5bm9ueW1Bbm5vdGF0aW9uKGt3LCBzeW5NYXApIHtcbiAgaWYgKCFzeW5NYXAgfHwgKCFzeW5NYXAuYWxpYXNUb0Nhbm9uICYmICFzeW5NYXAuY2Fub25Ub0FsaWFzZXMpKSByZXR1cm4gJyc7XG4gIGNvbnN0IGtsID0ga3cudG9Mb3dlckNhc2UoKTtcbiAgLy8gSXMga3cgYW4gYWxpYXM/IFNob3cgY2Fub25pY2FsIGZvcm0uXG4gIGlmIChzeW5NYXAuYWxpYXNUb0Nhbm9uW2tsXSkgcmV0dXJuIGAgPSAke3N5bk1hcC5hbGlhc1RvQ2Fub25ba2xdfWA7XG4gIC8vIElzIGt3IGEgY2Fub25pY2FsIGZvcm0/IFNob3cgYWxpYXNlcy5cbiAgY29uc3QgYWxpYXNlcyA9IHN5bk1hcC5jYW5vblRvQWxpYXNlcyAmJiBzeW5NYXAuY2Fub25Ub0FsaWFzZXNba2xdO1xuICBpZiAoYWxpYXNlcyAmJiBhbGlhc2VzLmxlbmd0aCkgcmV0dXJuIGAgKCR7YWxpYXNlcy5qb2luKCcsICcpfSlgO1xuICByZXR1cm4gJyc7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHBvcHVsYXRlQW5hbHlzaXNUYWIocmVzdWx0KSB7XG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9jdW1lbnQtY29udGVudCcpO1xuICB0cnkge1xuICAgIC8vIHJlc3VsdCBtYXkgYWxyZWFkeSBiZSBhIHBhcnNlZCBvYmplY3QgKGUuZy4gY29taW5nIGZyb20gc3RhdGVNYW5hZ2VyKSBvciBhXG4gICAgLy8gcmF3IEpTT04gc3RyaW5nLiAgY2xlYW5Kc29uUmVzcG9uc2Ugb25seSBoYW5kbGVzIHN0cmluZ3MsIHNvIHNraXAgaXQgd2hlblxuICAgIC8vIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IGFuIG9iamVjdCB0byBhdm9pZCBcImNsZWFuZWQucmVwbGFjZSBpcyBub3QgYSBmdW5jdGlvblwiLlxuICAgIGxldCBkYXRhO1xuICAgIGlmIChyZXN1bHQgIT09IG51bGwgJiYgdHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGRhdGEgPSByZXN1bHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNsZWFuUmVzdWx0ID0gY2xlYW5Kc29uUmVzcG9uc2UocmVzdWx0KTtcbiAgICAgIGRhdGEgPSB0eXBlb2YgY2xlYW5SZXN1bHQgPT09ICdzdHJpbmcnID8gSlNPTi5wYXJzZShjbGVhblJlc3VsdCkgOiBjbGVhblJlc3VsdDtcbiAgICB9XG5cbiAgICAvLyBQZXJzaXN0IG9ubHkgYWZ0ZXIgdGhlIGFuYWx5c2lzIHBheWxvYWQgaGFzIGJlZW4gdmFsaWRhdGVkLlxuICAgIHN0YXRlTWFuYWdlci5zZXRUYWJEYXRhKCdhbmFseXNpcycsIHJlc3VsdCk7XG4gICAgc2F2ZVRhYkRhdGEoKTtcblxuICAgIC8vIFx1MjUwMFx1MjUwMCBTZWN0aW9uIDE6IFJvbGUgJiBEb21haW4gY2FyZCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICBsZXQgaHRtbCA9ICc8ZGl2IGNsYXNzPVwiYW5hbHlzaXMtcGFnZVwiPic7XG4gICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cImFuYWx5c2lzLXJvbGUtY2FyZFwiPic7XG4gICAgaHRtbCArPSBgPGgxPiR7ZGF0YS50aXRsZSB8fCAnUm9sZSd9PC9oMT5gO1xuICAgIGlmIChkYXRhLmNvbXBhbnkpIGh0bWwgKz0gYDxwIGNsYXNzPVwiY29tcGFueVwiPlx1RDgzQ1x1REZFMiAke2RhdGEuY29tcGFueX08L3A+YDtcbiAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwibWV0YVwiPic7XG4gICAgaWYgKGRhdGEuZG9tYWluKSB7XG4gICAgICBjb25zdCBjb25mID0gZGF0YS5kb21haW5fY29uZmlkZW5jZTtcbiAgICAgIGxldCBjb25mTGFiZWwgPSAnJztcbiAgICAgIGxldCBjb25mVGl0bGUgPSAnJztcbiAgICAgIGlmICh0eXBlb2YgY29uZiA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgaWYgKGNvbmYgPj0gMC44KSB7IGNvbmZMYWJlbCA9ICcnOyBjb25mVGl0bGUgPSBgRG9tYWluIGNvbmZpZGVuY2U6IEhpZ2ggKCR7TWF0aC5yb3VuZChjb25mICogMTAwKX0lKWA7IH1cbiAgICAgICAgZWxzZSBpZiAoY29uZiA+PSAwLjYpIHsgY29uZkxhYmVsID0gJyBcdTI2QTAnOyBjb25mVGl0bGUgPSBgRG9tYWluIGNvbmZpZGVuY2U6IE1lZGl1bSAoJHtNYXRoLnJvdW5kKGNvbmYgKiAxMDApfSUpIFx1MjAxNCB2ZXJpZnkgdGhpcyBpcyBjb3JyZWN0YDsgfVxuICAgICAgICBlbHNlIHsgY29uZkxhYmVsID0gJyBcdTI2QTAnOyBjb25mVGl0bGUgPSBgRG9tYWluIGNvbmZpZGVuY2U6IExvdyAoJHtNYXRoLnJvdW5kKGNvbmYgKiAxMDApfSUpIFx1MjAxNCB0aGUgSkQgc3BhbnMgbXVsdGlwbGUgZG9tYWluczsgY29uc2lkZXIgb3ZlcnJpZGluZ2A7IH1cbiAgICAgIH1cbiAgICAgIGh0bWwgKz0gYDxzcGFuIGNsYXNzPVwibWV0YS1jaGlwXCIgdGl0bGU9XCIke2VzY2FwZUh0bWwoY29uZlRpdGxlIHx8ICdJbmZlcnJlZCB0ZWNobmljYWwgZG9tYWluJyl9XCI+XHVEODNEXHVERDJDICR7ZXNjYXBlSHRtbChkYXRhLmRvbWFpbil9JHtjb25mTGFiZWx9PC9zcGFuPmA7XG4gICAgfVxuICAgIGlmIChkYXRhLnJvbGVfbGV2ZWwpIGh0bWwgKz0gYDxzcGFuIGNsYXNzPVwibWV0YS1jaGlwXCI+XHVEODNEXHVEQ0NBICR7ZGF0YS5yb2xlX2xldmVsfTwvc3Bhbj5gO1xuICAgIGlmIChkYXRhLnN1Z2dlc3RlZF9zdW1tYXJ5KSBodG1sICs9IGA8c3BhbiBjbGFzcz1cIm1ldGEtY2hpcFwiPlx1RDgzRFx1RENBQyAke2RhdGEuc3VnZ2VzdGVkX3N1bW1hcnl9PC9zcGFuPmA7XG4gICAgaHRtbCArPSAnPC9kaXY+PC9kaXY+JztcblxuICAgIC8vIFx1MjUwMFx1MjUwMCBNaXNtYXRjaCBjYWxsb3V0IChjb21wdXRlZCBmcm9tIG1hc3RlciBza2lsbHMpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIGNvbnN0IHJlcXVpcmVkU2tpbGxzID0gQXJyYXkuaXNBcnJheShkYXRhLnJlcXVpcmVkX3NraWxscykgPyBkYXRhLnJlcXVpcmVkX3NraWxscyA6IFtdO1xuICAgIGNvbnN0IG1hc3RlclNraWxscyA9IHdpbmRvdy5fbWFzdGVyU2tpbGxzIHx8IFtdO1xuICAgIGlmIChyZXF1aXJlZFNraWxscy5sZW5ndGggPiAwICYmIG1hc3RlclNraWxscy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBtaXNzaW5nID0gcmVxdWlyZWRTa2lsbHMuZmlsdGVyKHNraWxsID0+XG4gICAgICAgICFtYXN0ZXJTa2lsbHMuc29tZShtcyA9PiBtcy5pbmNsdWRlcyhza2lsbC50b0xvd2VyQ2FzZSgpKSB8fCBza2lsbC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKG1zKSlcbiAgICAgICk7XG4gICAgICBpZiAobWlzc2luZy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGh0bWwgKz0gYDxkaXYgY2xhc3M9XCJtaXNtYXRjaC1jYWxsb3V0XCI+XHUyNkEwIDxzdHJvbmc+JHttaXNzaW5nLmxlbmd0aH0gcmVxdWlyZWQgc2tpbGwke21pc3NpbmcubGVuZ3RoID4gMSA/ICdzJyA6ICcnfSBub3QgZm91bmQgaW4geW91ciBtYXN0ZXIgQ1Y6PC9zdHJvbmc+ICR7bWlzc2luZy5qb2luKCcsICcpfTwvZGl2PmA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gXHUyNTAwXHUyNTAwIFNlY3Rpb24gMjogUmVxdWlyZWQgU2tpbGxzIGdyaWQgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgaWYgKHJlcXVpcmVkU2tpbGxzLmxlbmd0aCA+IDApIHtcbiAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJhbmFseXNpcy1zZWN0aW9uXCI+PGgyPlx1RDgzQ1x1REZBRiBSZXF1aXJlZCBTa2lsbHM8L2gyPjxkaXYgY2xhc3M9XCJza2lsbC1ncmlkXCI+JztcbiAgICAgIHJlcXVpcmVkU2tpbGxzLmZvckVhY2goc2tpbGwgPT4ge1xuICAgICAgICBjb25zdCBpc01pc3NpbmcgPSBtYXN0ZXJTa2lsbHMubGVuZ3RoID4gMCAmJiAhbWFzdGVyU2tpbGxzLnNvbWUoXG4gICAgICAgICAgbXMgPT4gbXMuaW5jbHVkZXMoc2tpbGwudG9Mb3dlckNhc2UoKSkgfHwgc2tpbGwudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhtcylcbiAgICAgICAgKTtcbiAgICAgICAgaHRtbCArPSBgPHNwYW4gY2xhc3M9XCJza2lsbC1iYWRnZSR7aXNNaXNzaW5nID8gJyBtaXNzaW5nJyA6ICcnfVwiIHRpdGxlPVwiJHtpc01pc3NpbmcgPyAnTm90IGluIG1hc3RlciBDVicgOiAnRm91bmQgaW4gbWFzdGVyIENWJ31cIj4ke3NraWxsfSR7aXNNaXNzaW5nID8gJzxzcGFuIGNsYXNzPVwic3Itb25seVwiPiAobm90IGluIG1hc3RlciBDVik8L3NwYW4+JyA6ICcnfTwvc3Bhbj5gO1xuICAgICAgfSk7XG4gICAgICBodG1sICs9ICc8L2Rpdj48L2Rpdj4nO1xuICAgIH1cblxuICAgIC8vIFx1MjUwMFx1MjUwMCBTZWN0aW9uIDM6IFByZWZlcnJlZCAvIE5pY2UtdG8tSGF2ZSBsaXN0IFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIGNvbnN0IHByZWZlcnJlZCA9IFtcbiAgICAgIC4uLihBcnJheS5pc0FycmF5KGRhdGEucHJlZmVycmVkX3NraWxscykgPyBkYXRhLnByZWZlcnJlZF9za2lsbHMgOiBbXSksXG4gICAgICAuLi4oQXJyYXkuaXNBcnJheShkYXRhLm5pY2VfdG9faGF2ZV9yZXF1aXJlbWVudHMpID8gZGF0YS5uaWNlX3RvX2hhdmVfcmVxdWlyZW1lbnRzIDogW10pLFxuICAgIF07XG4gICAgaWYgKHByZWZlcnJlZC5sZW5ndGggPiAwKSB7XG4gICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwiYW5hbHlzaXMtc2VjdGlvblwiPjxoMj5cdTJCNTAgUHJlZmVycmVkIC8gTmljZS10by1IYXZlPC9oMj48dWwgY2xhc3M9XCJwcmVmZXJyZWQtbGlzdFwiPic7XG4gICAgICBwcmVmZXJyZWQuZm9yRWFjaChpdGVtID0+IHsgaHRtbCArPSBgPGxpPiR7aXRlbX08L2xpPmA7IH0pO1xuICAgICAgaHRtbCArPSAnPC91bD48L2Rpdj4nO1xuICAgIH1cblxuICAgIC8vIFx1MjUwMFx1MjUwMCBTZWN0aW9uIDQ6IEFUUyBLZXl3b3JkcyB3aXRoIHJhbmsgYmFkZ2VzIGFuZCBzeW5vbnltIGFubm90YXRpb25zIFx1MjUwMFx1MjUwMFxuICAgIGNvbnN0IGF0c0t3cyA9IEFycmF5LmlzQXJyYXkoZGF0YS5hdHNfa2V5d29yZHMpID8gZGF0YS5hdHNfa2V5d29yZHMgOiBbXTtcbiAgICBpZiAoYXRzS3dzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHN5bk1hcCA9IGF3YWl0IF9sb2FkU3lub255bU1hcCgpO1xuICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cImFuYWx5c2lzLXNlY3Rpb25cIj48aDI+XHVEODNEXHVERDExIEFUUyBLZXl3b3JkcyA8c21hbGwgc3R5bGU9XCJmb250LXdlaWdodDo0MDA7Y29sb3I6IzY0NzQ4Yjtmb250LXNpemU6MTJweDtcIj4oaGlnaGVyIHJhbmsgPSBoaWdoZXIgcHJpb3JpdHkpPC9zbWFsbD48L2gyPjxkaXYgY2xhc3M9XCJrdy1iYWRnZXNcIj4nO1xuICAgICAgYXRzS3dzLmZvckVhY2goKGt3LCBpZHgpID0+IHtcbiAgICAgICAgY29uc3QgYW5ub3RhdGlvbiA9IF9rd1N5bm9ueW1Bbm5vdGF0aW9uKGt3LCBzeW5NYXApO1xuICAgICAgICBjb25zdCB0aXRsZUF0dHIgID0gYW5ub3RhdGlvbiA/IGAgdGl0bGU9XCJTeW5vbnltOiAke2VzY2FwZUh0bWwoa3cgKyBhbm5vdGF0aW9uKX1cImAgOiAnJztcbiAgICAgICAgY29uc3QgYW5ub3RIdG1sICA9IGFubm90YXRpb24gPyBgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MTBweDtjb2xvcjojNjQ3NDhiO21hcmdpbi1sZWZ0OjNweDtcIj4ke2VzY2FwZUh0bWwoYW5ub3RhdGlvbil9PC9zcGFuPmAgOiAnJztcbiAgICAgICAgaHRtbCArPSBgPHNwYW4gY2xhc3M9XCJrdy1iYWRnZVwiJHt0aXRsZUF0dHJ9PjxzcGFuIGNsYXNzPVwia3ctcmFua1wiPiMke2lkeCArIDF9PC9zcGFuPiR7ZXNjYXBlSHRtbChrdyl9JHthbm5vdEh0bWx9PC9zcGFuPmA7XG4gICAgICB9KTtcbiAgICAgIGh0bWwgKz0gJzwvZGl2PjwvZGl2Pic7XG4gICAgfVxuXG4gICAgLy8gXHUyNTAwXHUyNTAwIEN1bHR1cmUgaW5kaWNhdG9ycyAob3B0aW9uYWwpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIGNvbnN0IGN1bHR1cmUgPSBBcnJheS5pc0FycmF5KGRhdGEuY3VsdHVyZV9pbmRpY2F0b3JzKSA/IGRhdGEuY3VsdHVyZV9pbmRpY2F0b3JzIDogW107XG4gICAgaWYgKGN1bHR1cmUubGVuZ3RoID4gMCkge1xuICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cImFuYWx5c2lzLXNlY3Rpb25cIj48aDI+XHVEODNDXHVERkUyIEN1bHR1cmUgSW5kaWNhdG9yczwvaDI+PHVsIGNsYXNzPVwicHJlZmVycmVkLWxpc3RcIj4nO1xuICAgICAgY3VsdHVyZS5mb3JFYWNoKGMgPT4geyBodG1sICs9IGA8bGk+JHtjfTwvbGk+YDsgfSk7XG4gICAgICBodG1sICs9ICc8L3VsPjwvZGl2Pic7XG4gICAgfVxuXG4gICAgLy8gXHUyNTAwXHUyNTAwIE11c3QtaGF2ZSByZXF1aXJlbWVudHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgY29uc3QgbXVzdEhhdmUgPSBBcnJheS5pc0FycmF5KGRhdGEubXVzdF9oYXZlX3JlcXVpcmVtZW50cykgPyBkYXRhLm11c3RfaGF2ZV9yZXF1aXJlbWVudHMgOiBbXTtcbiAgICBpZiAobXVzdEhhdmUubGVuZ3RoID4gMCkge1xuICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cImFuYWx5c2lzLXNlY3Rpb25cIj48aDI+XHUyNzA1IE11c3QtSGF2ZSBSZXF1aXJlbWVudHM8L2gyPjx1bCBjbGFzcz1cInByZWZlcnJlZC1saXN0XCI+JztcbiAgICAgIG11c3RIYXZlLmZvckVhY2gociA9PiB7IGh0bWwgKz0gYDxsaT4ke3J9PC9saT5gOyB9KTtcbiAgICAgIGh0bWwgKz0gJzwvdWw+PC9kaXY+JztcbiAgICB9XG5cbiAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwibmF2LWJ1dHRvbnMgbmF2LWVuZFwiPjxidXR0b24gY2xhc3M9XCJjb250aW51ZS1idG5cIiBvbmNsaWNrPVwic2VuZEFjdGlvbihcXHUwMDI3cmVjb21tZW5kX2N1c3RvbWl6YXRpb25zXFx1MDAyNylcIj5Db250aW51ZSB0byBDdXN0b21pemF0aW9ucyBcdTIxOTI8L2J1dHRvbj48L2Rpdj4nO1xuICAgIGh0bWwgKz0gJzwvZGl2Pic7IC8vIC5hbmFseXNpcy1wYWdlXG4gICAgY29udGVudC5pbm5lckhUTUwgPSBodG1sO1xuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nLmVycm9yKCdBbmFseXNpcyBwYXJzaW5nIGVycm9yOicsIGUsICdPcmlnaW5hbCByZXN1bHQ6JywgcmVzdWx0KTtcbiAgICBjb250ZW50LmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwiZW1wdHktc3RhdGVcIj48ZGl2IGNsYXNzPVwiaWNvblwiPlx1Mjc0QzwvZGl2PjxoMz5BbmFseXNpcyBFcnJvcjwvaDM+PHA+Q291bGQgbm90IHBhcnNlIGFuYWx5c2lzIHJlc3VsdHM6ICR7ZXNjYXBlSHRtbChlLm1lc3NhZ2UpfTwvcD48ZGV0YWlscz48c3VtbWFyeT5EZWJ1ZyBJbmZvPC9zdW1tYXJ5PjxwcmU+JHtlc2NhcGVIdG1sKEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMikpfTwvcHJlPjwvZGV0YWlscz48L2Rpdj5gO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBDdXN0b21pemF0aW9uIHJlc3BvbnNlIGhhbmRsZXIgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZUN1c3RvbWl6YXRpb25SZXNwb25zZShyZXNwb25zZSkge1xuICB0cnkge1xuICAgIC8vIEFjY2VwdCBhIHByZS1wYXJzZWQgb2JqZWN0IG9yIGEgcmF3IHN0cmluZyAocGFyc2UgYXQgYm91bmRhcnkpLlxuICAgIGNvbnN0IGRhdGEgPSAocmVzcG9uc2UgIT09IG51bGwgJiYgdHlwZW9mIHJlc3BvbnNlID09PSAnb2JqZWN0JylcbiAgICAgID8gcmVzcG9uc2VcbiAgICAgIDogZXh0cmFjdEZpcnN0SnNvbk9iamVjdChyZXNwb25zZSk7XG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCB0eXBlb2YgcmVzcG9uc2UgPT09ICdzdHJpbmcnID8gcmVzcG9uc2UgOiAnJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGRhdGEgJiYgKGRhdGEucmVjb21tZW5kZWRfZXhwZXJpZW5jZXMgfHwgZGF0YS5yZWNvbW1lbmRlZF9za2lsbHMpKSB7XG4gICAgICBzdGF0ZU1hbmFnZXIuc2V0VGFiRGF0YSgnY3VzdG9taXphdGlvbnMnLCBkYXRhKTtcbiAgICAgIHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zID0gZGF0YTtcbiAgICAgIHNhdmVUYWJEYXRhKCk7XG5cbiAgICAgIGlmICghaXNSZWNvbm5lY3RJblByb2dyZXNzKCkpIHtcbiAgICAgICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ1x1MjcwNSBDdXN0b21pemF0aW9ucyBnZW5lcmF0ZWQhIFBsZWFzZSByZXZpZXcgZWFjaCBzZWN0aW9uIGluIHRoZSAqKkN1c3RvbWl6YXRpb25zKiogdGFiIFx1MjAxNCBFeHBlcmllbmNlcywgQWNoaWV2ZW1lbnRzLCBTa2lsbHMsIFN1bW1hcnksIGFuZCBQdWJsaWNhdGlvbnMuIFNlbGVjdCB5b3VyIHByZWZlcmVuY2VzIHVzaW5nIHRoZSBhY3Rpb24gYnV0dG9ucywgdGhlbiBzdWJtaXQgeW91ciBkZWNpc2lvbnMuJyk7XG4gICAgICAgIHN3aXRjaFRhYignZXhwLXJldmlldycpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIWlzUmVjb25uZWN0SW5Qcm9ncmVzcygpKSB7XG4gICAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCByZXNwb25zZSk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nLmVycm9yKCdDdXN0b21pemF0aW9uIHJlc3BvbnNlIGVycm9yOicsIGUpO1xuICAgIGlmICghaXNSZWNvbm5lY3RJblByb2dyZXNzKCkpIHtcbiAgICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIHJlc3BvbnNlKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBTeW5jIHRoZSBza2lsbHMtdGl0bGUgc2VsZWN0L2N1c3RvbS1pbnB1dCBjb250cm9scyB0byBhIGdpdmVuIHRpdGxlIHZhbHVlLFxuICogYW5kIGF0dGFjaCBjaGFuZ2UgbGlzdGVuZXJzIHNvIHVwZGF0ZXMgYXJlIHNhdmVkIHZpYSB0aGUgQVBJLlxuICogZHVja2Zsb3c6XG4gKiAgIGlkOiBnZW5lcmF0aW9uX3NldHRpbmdzLndlYl9yZXZpZXdfdGFibGVfYmFzZS5MMzMwXG4gKiAgIGtpbmQ6IHVpXG4gKiAgIHRpbWVzdGFtcDogJzIwMjYtMDMtMjdUMDE6MjM6MjhaJ1xuICogICBzdGF0dXM6IGxpdmVcbiAqICAgaGFuZGxlczpcbiAqICAgLSB1aTpnZW5lcmF0aW9uLXNldHRpbmdzLnN5bmMtc2tpbGxzLXRpdGxlXG4gKiAgIGNhbGxzOlxuICogICAtIFBPU1QgL2FwaS9nZW5lcmF0aW9uLXNldHRpbmdzXG4gKiAgIHJlYWRzOlxuICogICAtIHJlc3BvbnNlOkdFVCAvYXBpL3N0YXR1cy5za2lsbHNfc2VjdGlvbl90aXRsZVxuICogICB3cml0ZXM6XG4gKiAgIC0gcmVxdWVzdDpQT1NUIC9hcGkvZ2VuZXJhdGlvbi1zZXR0aW5ncy5za2lsbHNfc2VjdGlvbl90aXRsZVxuICogICBub3RlczogS2VlcHMgdGhlIFVJIHNraWxscy10aXRsZSBjb250cm9scyBpbiBzeW5jIHdpdGggc3RhdHVzIGRhdGEgYW5kIHBlcnNpc3RzIHRpdGxlIGNoYW5nZXMgYmFjayB0byB0aGUgc2Vzc2lvbiBzZXR0aW5ncyByb3V0ZS5cbiAqL1xuZnVuY3Rpb24gX3N5bmNTa2lsbHNUaXRsZUNvbnRyb2xzKGN1cnJlbnRUaXRsZSkge1xuICBjb25zdCBrbm93bk9wdGlvbnMgPSBbJ1NraWxscycsICdUZWNobmljYWwgU2tpbGxzJywgJ0tleSBTa2lsbHMnLCAnQ29yZSBTa2lsbHMnXTtcbiAgY29uc3Qgc2VsICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbHMtdGl0bGUtc2VsZWN0Jyk7XG4gIGNvbnN0IGN1c3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGxzLXRpdGxlLWN1c3RvbScpO1xuICBpZiAoIXNlbCkgcmV0dXJuO1xuXG4gIGNvbnN0IGlzS25vd24gPSBrbm93bk9wdGlvbnMuaW5jbHVkZXMoY3VycmVudFRpdGxlKTtcbiAgaWYgKGlzS25vd24pIHtcbiAgICBzZWwudmFsdWUgPSBjdXJyZW50VGl0bGU7XG4gICAgaWYgKGN1c3QpIGN1c3Quc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgfSBlbHNlIHtcbiAgICBzZWwudmFsdWUgPSAnX19jdXN0b21fXyc7XG4gICAgaWYgKGN1c3QpIHtcbiAgICAgIGN1c3Quc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgY3VzdC52YWx1ZSA9IGN1cnJlbnRUaXRsZTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBzYXZlVGl0bGUgPSBhc3luYyAodGl0bGUpID0+IHtcbiAgICB0cnkgeyBhd2FpdCBhcGlDYWxsKCdQT1NUJywgJy9hcGkvZ2VuZXJhdGlvbi1zZXR0aW5ncycsIHsgc2tpbGxzX3NlY3Rpb25fdGl0bGU6IHRpdGxlIH0pOyB9XG4gICAgY2F0Y2ggKGUpIHsgbG9nLndhcm4oJ0ZhaWxlZCB0byBzYXZlIHNraWxsc19zZWN0aW9uX3RpdGxlIHNldHRpbmc6JywgZSk7IH1cbiAgfTtcblxuICBzZWwuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4ge1xuICAgIGlmIChzZWwudmFsdWUgPT09ICdfX2N1c3RvbV9fJykge1xuICAgICAgaWYgKGN1c3QpIHsgY3VzdC5zdHlsZS5kaXNwbGF5ID0gJyc7IGN1c3QuZm9jdXMoKTsgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY3VzdCkgY3VzdC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgc2F2ZVRpdGxlKHNlbC52YWx1ZSk7XG4gICAgfVxuICB9KTtcblxuICBpZiAoY3VzdCkge1xuICAgIGN1c3QuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgY29uc3QgdiA9IGN1c3QudmFsdWUudHJpbSgpO1xuICAgICAgaWYgKHYpIHNhdmVUaXRsZSh2KTtcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFJlbmRlcnMgb25lIG9mIHRoZSA1IHJldmlldyBwYW5lcyBhcyBhIHRvcC1sZXZlbCB0YWIuXG4gKiBSZXBsYWNlcyB0aGUgb2xkIHN1Yi10YWIgYXBwcm9hY2ggd2l0aCBhIGZsYXQgc2luZ2xlLWxldmVsIHRhYiBzdHJ1Y3R1cmUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBvcHVsYXRlUmV2aWV3VGFiKHBhbmUpIHtcbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIGNvbnN0IGN1c3RvbWl6YXRpb25zID0gc3RhdGVNYW5hZ2VyLmdldFRhYkRhdGEoJ2N1c3RvbWl6YXRpb25zJyk7XG5cbiAgaWYgKCF3aW5kb3cucGVuZGluZ1JlY29tbWVuZGF0aW9ucyB8fCAhY3VzdG9taXphdGlvbnMpIHtcbiAgICBjb250ZW50LmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwiZW1wdHktc3RhdGVcIj48ZGl2IGNsYXNzPVwiaWNvblwiPlx1MjY5OVx1RkUwRjwvZGl2PjxoMz5SZXZpZXcgQ3VzdG9taXphdGlvbnM8L2gzPjxwPkNsaWNrIFwiUmVjb21tZW5kIEN1c3RvbWl6YXRpb25zXCIgdG8gZ2VuZXJhdGUgcmVjb21tZW5kYXRpb25zLjwvcD48L2Rpdj4nO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHBhbmVDb25maWcgPSB7XG4gICAgZXhwZXJpZW5jZXM6ICAgeyB0aXRsZTogJycsIGRlc2M6ICdTb3J0ZWQgYnkgZGF0ZSAobW9zdCByZWNlbnQgZmlyc3QpLiBDbGljayBhY3Rpb24gYnV0dG9ucyB0byBvdmVycmlkZSByZWNvbW1lbmRhdGlvbnMuJywgICAgICAgICBjb250YWluZXI6ICdleHBlcmllbmNlLXRhYmxlLWNvbnRhaW5lcicgICB9LFxuICAgIHNraWxsczogICAgICAgIHsgdGl0bGU6ICdcdUQ4M0RcdURFRTBcdUZFMEYgU2tpbGxzJywgICAgICAgICAgIGRlc2M6ICdTb3J0ZWQgYnkgcmVsZXZhbmNlLiBTZWxlY3QgaG93IHRvIGZlYXR1cmUgZWFjaCBza2lsbC4nLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyOiAnc2tpbGxzLXRhYmxlLWNvbnRhaW5lcicgICAgICAgfSxcbiAgICBhY2hpZXZlbWVudHM6ICB7IHRpdGxlOiAnXHVEODNDXHVERkM2IEFjaGlldmVtZW50cycsICAgICAgZGVzYzogJ1NlbGVjdCBob3cgdG8gZmVhdHVyZSBlYWNoIGtleSBhY2hpZXZlbWVudC4gQUkgcmVjb21tZW5kYXRpb25zIGFyZSBwcmUtc2VsZWN0ZWQuJywgIGNvbnRhaW5lcjogJ2FjaGlldmVtZW50cy10YWJsZS1jb250YWluZXInICB9LFxuICAgIHN1bW1hcnk6ICAgICAgIHsgdGl0bGU6ICdcdUQ4M0RcdURDREQgUHJvZmVzc2lvbmFsIFN1bW1hcnknLCBkZXNjOiAnU2VsZWN0IHdoaWNoIHByb2Zlc3Npb25hbCBzdW1tYXJ5IHRvIHVzZS4gVGhlIEFJXFwncyByZWNvbW1lbmRhdGlvbiBpcyBwcmUtc2VsZWN0ZWQuJywgY29udGFpbmVyOiAnc3VtbWFyeS1mb2N1cy1jb250YWluZXInICAgIH0sXG4gICAgcHVibGljYXRpb25zOiAgeyB0aXRsZTogJ1x1RDgzRFx1RENDNCBQdWJsaWNhdGlvbnMnLCAgICAgIGRlc2M6ICdBbGwgcHVibGljYXRpb25zIHJhbmtlZCBieSByZWxldmFuY2UuIEFjY2VwdCBvciByZWplY3QgZWFjaCBmb3IgeW91ciBDVi4nLCAgICAgICAgICBjb250YWluZXI6ICdwdWJsaWNhdGlvbnMtdGFibGUtY29udGFpbmVyJyB9LFxuICB9O1xuICBjb25zdCBjZmcgPSBwYW5lQ29uZmlnW3BhbmVdIHx8IHt9O1xuXG4gIGNvbnN0IGhlYWRlckh0bWwgPSBwYW5lID09PSAnZXhwZXJpZW5jZXMnID8gYFxuICAgIDxoMT5cdTI2OTlcdUZFMEYgUmV2aWV3IEN1c3RvbWl6YXRpb24gUmVjb21tZW5kYXRpb25zPC9oMT5cbiAgICA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7bWFyZ2luLWJvdHRvbToxNnB4O1wiPlJldmlldyB0aGUgQUkncyByZWNvbW1lbmRhdGlvbnMuIFVzZSB0aGUgYWN0aW9uIGJ1dHRvbnMgdG8gYWRqdXN0IGVhY2ggaXRlbSwgdGhlbiBzYXZlIHlvdXIgZGVjaXNpb25zIGJlZm9yZSBnZW5lcmF0aW5nIHRoZSBDVi48L3A+XG4gICAgPGRpdiBpZD1cInBhZ2UtZXN0aW1hdGUtd2lkZ2V0XCIgY2xhc3M9XCJwYWdlLWVzdGltYXRlIG9rXCI+XG4gICAgICA8c3BhbiBpZD1cInBlLWljb25cIj5cdUQ4M0RcdURDQzQ8L3NwYW4+XG4gICAgICA8c3BhbiBpZD1cInBlLWxhYmVsXCI+RXN0aW1hdGVkIGxlbmd0aDogY2FsY3VsYXRpbmdcdTIwMjY8L3NwYW4+XG4gICAgICA8ZGl2IGNsYXNzPVwicGUtYmFyXCI+PGRpdiBjbGFzcz1cInBlLWZpbGxcIiBpZD1cInBlLWZpbGxcIiBzdHlsZT1cIndpZHRoOjAlO2JhY2tncm91bmQ6Izg2ZWZhYztcIj48L2Rpdj48L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYCA6IChjZmcudGl0bGUgPyBgPGgyIHN0eWxlPVwibWFyZ2luOjAgMCAxMnB4O1wiPiR7Y2ZnLnRpdGxlfTwvaDI+YCA6ICcnKTtcblxuICBjb25zdCBuYXZCYWNrID0ge1xuICAgIHNraWxsczogICAgICAgYDxidXR0b24gY2xhc3M9XCJiYWNrLWJ0blwiIG9uY2xpY2s9XCJzd2l0Y2hUYWIoJ2FjaC1lZGl0b3InKVwiPlx1MjE5MCBCYWNrIHRvIEV4cGVyaWVuY2UgQnVsbGV0czwvYnV0dG9uPmAsXG4gICAgYWNoaWV2ZW1lbnRzOiBgPGJ1dHRvbiBjbGFzcz1cImJhY2stYnRuXCIgb25jbGljaz1cInN3aXRjaFRhYignc2tpbGxzLXJldmlldycpXCI+XHUyMTkwIEJhY2sgdG8gU2tpbGxzPC9idXR0b24+YCxcbiAgICBwdWJsaWNhdGlvbnM6IGA8YnV0dG9uIGNsYXNzPVwiYmFjay1idG5cIiBvbmNsaWNrPVwic3dpdGNoVGFiKCdzdW1tYXJ5LXJldmlldycpXCI+XHUyMTkwIEJhY2sgdG8gU3VtbWFyeTwvYnV0dG9uPmAsXG4gIH07XG4gIGNvbnN0IG5hdkNvbnRpbnVlID0ge1xuICAgIGV4cGVyaWVuY2VzOiAgYDxidXR0b24gY2xhc3M9XCJjb250aW51ZS1idG5cIiBvbmNsaWNrPVwic3VibWl0RXhwZXJpZW5jZURlY2lzaW9ucygpXCI+Q29udGludWUgdG8gRXhwZXJpZW5jZSBCdWxsZXRzIFx1MjE5MjwvYnV0dG9uPmAsXG4gICAgc2tpbGxzOiAgICAgICBgPGJ1dHRvbiBjbGFzcz1cImNvbnRpbnVlLWJ0blwiIG9uY2xpY2s9XCJzdWJtaXRTa2lsbERlY2lzaW9ucygpXCI+Q29udGludWUgdG8gQWNoaWV2ZW1lbnRzIFx1MjE5MjwvYnV0dG9uPmAsXG4gICAgYWNoaWV2ZW1lbnRzOiBgPGJ1dHRvbiBjbGFzcz1cImNvbnRpbnVlLWJ0blwiIG9uY2xpY2s9XCJzdWJtaXRBY2hpZXZlbWVudERlY2lzaW9ucygpXCI+Q29udGludWUgdG8gVGFnbGluZSBcdTIxOTI8L2J1dHRvbj5gLFxuICAgIHB1YmxpY2F0aW9uczogYDxidXR0b24gY2xhc3M9XCJjb250aW51ZS1idG5cIiBvbmNsaWNrPVwic3VibWl0UHVibGljYXRpb25EZWNpc2lvbnMoKVwiPkNvbnRpbnVlIHRvIFJld3JpdGUgXHUyMTkyPC9idXR0b24+YCxcbiAgfTtcbiAgY29uc3QgbmF2SHRtbCA9IHBhbmUgPT09ICdzdW1tYXJ5JyA/ICcnIDogYFxuICAgIDxkaXYgY2xhc3M9XCJuYXYtYnV0dG9ucyR7cGFuZSA9PT0gJ2V4cGVyaWVuY2VzJyA/ICcgbmF2LWVuZCcgOiAnJ31cIiBzdHlsZT1cIm1hcmdpbjoxNnB4IDA7XCI+XG4gICAgICAke25hdkJhY2tbcGFuZV0gfHwgJyd9XG4gICAgICAke25hdkNvbnRpbnVlW3BhbmVdIHx8ICcnfVxuICAgIDwvZGl2PmA7XG5cbiAgY29udGVudC5pbm5lckhUTUwgPSBgXG4gICAgJHtoZWFkZXJIdG1sfVxuICAgICR7Y2ZnLmRlc2MgPyBgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO2ZvbnQtc2l6ZTowLjk1ZW07bWFyZ2luLWJvdHRvbToxNnB4O1wiPiR7ZXNjYXBlSHRtbChjZmcuZGVzYyl9PC9wPmAgOiAnJ31cbiAgICA8ZGl2IGlkPVwiJHtjZmcuY29udGFpbmVyfVwiPjwvZGl2PlxuICAgICR7bmF2SHRtbH1cbiAgYDtcblxuICB3aW5kb3cuX2FjdGl2ZVJldmlld1BhbmUgPSBwYW5lO1xuICBzd2l0Y2ggKHBhbmUpIHtcbiAgICBjYXNlICdleHBlcmllbmNlcyc6XG4gICAgICBhd2FpdCBidWlsZEV4cGVyaWVuY2VSZXZpZXdUYWJsZSgpO1xuICAgICAgX3VwZGF0ZVBhZ2VFc3RpbWF0ZSgpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc2tpbGxzJzpcbiAgICAgIGF3YWl0IGJ1aWxkU2tpbGxzUmV2aWV3VGFibGUoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2FjaGlldmVtZW50cyc6XG4gICAgICBhd2FpdCBidWlsZEFjaGlldmVtZW50c1Jldmlld1RhYmxlKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdzdW1tYXJ5JzpcbiAgICAgIGF3YWl0IGJ1aWxkU3VtbWFyeUZvY3VzU2VjdGlvbigpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAncHVibGljYXRpb25zJzpcbiAgICAgIGF3YWl0IGJ1aWxkUHVibGljYXRpb25zUmV2aWV3VGFibGUoKTtcbiAgICAgIGJyZWFrO1xuICB9XG59XG5cbi8vIFRyYWNrIHdoaWNoIHBhbmUgaXMgY3VycmVudGx5IGFjdGl2ZVxud2luZG93Ll9hY3RpdmVSZXZpZXdQYW5lID0gJ2V4cGVyaWVuY2VzJztcblxuYXN5bmMgZnVuY3Rpb24gc3dpdGNoUmV2aWV3U3VidGFiKHBhbmUpIHtcbiAgLy8gVXBkYXRlIGJ1dHRvbiBzdGF0ZXNcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnJldmlldy1zdWJ0YWInKS5mb3JFYWNoKGJ0biA9PiB7XG4gICAgYnRuLmNsYXNzTGlzdC50b2dnbGUoJ2FjdGl2ZScsIGJ0bi5kYXRhc2V0LnBhbmUgPT09IHBhbmUpO1xuICB9KTtcblxuICAvLyBIaWRlIGFsbCBwYW5lcywgc2hvdyB0aGUgc2VsZWN0ZWQgb25lXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5yZXZpZXctcGFuZScpLmZvckVhY2gocCA9PiBwLnN0eWxlLmRpc3BsYXkgPSAnbm9uZScpO1xuICBjb25zdCB0YXJnZXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcmV2aWV3LXBhbmUtJHtwYW5lfWApO1xuICBpZiAodGFyZ2V0KSB0YXJnZXQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG5cbiAgd2luZG93Ll9hY3RpdmVSZXZpZXdQYW5lID0gcGFuZTtcblxuICAvLyBMYXp5LWxvYWQgcGFuZSBjb250ZW50IG9uIGZpcnN0IHZpc2l0XG4gIGlmICghd2luZG93Ll9yZXZpZXdQYW5lTG9hZGVkIHx8ICF3aW5kb3cuX3Jldmlld1BhbmVMb2FkZWRbcGFuZV0pIHtcbiAgICBhd2FpdCBfbG9hZFJldmlld1BhbmUocGFuZSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gX2xvYWRSZXZpZXdQYW5lKHBhbmUpIHtcbiAgaWYgKCF3aW5kb3cuX3Jldmlld1BhbmVMb2FkZWQpIHdpbmRvdy5fcmV2aWV3UGFuZUxvYWRlZCA9IHt9O1xuICB0cnkge1xuICAgIHN3aXRjaCAocGFuZSkge1xuICAgICAgY2FzZSAnZXhwZXJpZW5jZXMnOiAgIGF3YWl0IGJ1aWxkRXhwZXJpZW5jZVJldmlld1RhYmxlKCk7ICBicmVhaztcbiAgICAgIGNhc2UgJ3NraWxscyc6ICAgICAgICBhd2FpdCBidWlsZFNraWxsc1Jldmlld1RhYmxlKCk7ICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYWNoaWV2ZW1lbnRzJzogIGF3YWl0IGJ1aWxkQWNoaWV2ZW1lbnRzUmV2aWV3VGFibGUoKTsgYnJlYWs7XG4gICAgICBjYXNlICdzdW1tYXJ5JzogICAgICAgYXdhaXQgYnVpbGRTdW1tYXJ5Rm9jdXNTZWN0aW9uKCk7ICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3B1YmxpY2F0aW9ucyc6ICBhd2FpdCBidWlsZFB1YmxpY2F0aW9uc1Jldmlld1RhYmxlKCk7IGJyZWFrO1xuICAgICAgZGVmYXVsdDogcmV0dXJuO1xuICAgIH1cbiAgICB3aW5kb3cuX3Jldmlld1BhbmVMb2FkZWRbcGFuZV0gPSB0cnVlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGRlbGV0ZSB3aW5kb3cuX3Jldmlld1BhbmVMb2FkZWRbcGFuZV07XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIFBhZ2UtZXN0aW1hdGUgd2lkZ2V0IFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBfdXBkYXRlUGFnZUVzdGltYXRlKCkge1xuICBjb25zdCB3aWRnZXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGFnZS1lc3RpbWF0ZS13aWRnZXQnKTtcbiAgaWYgKCF3aWRnZXQpIHJldHVybjtcblxuICBjb25zdCBsYWJlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwZS1sYWJlbCcpO1xuICBjb25zdCBmaWxsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BlLWZpbGwnKTtcbiAgY29uc3QgaWNvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwZS1pY29uJyk7XG5cbiAgaWYgKGxhYmVsKSBsYWJlbC50ZXh0Q29udGVudCA9ICdVcGRhdGluZyBzZXJ2ZXIgbGF5b3V0IGVzdGltYXRlXHUyMDI2JztcbiAgaWYgKGZpbGwpIGZpbGwuc3R5bGUud2lkdGggPSAnMCUnO1xuICBpZiAoaWNvbikgaWNvbi50ZXh0Q29udGVudCA9ICdcdTIzRjMnO1xuXG4gIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgZXhwZXJpZW5jZV9kZWNpc2lvbnM6IHtcbiAgICAgIC4uLigod2luZG93Ll9zYXZlZERlY2lzaW9ucyAmJiB3aW5kb3cuX3NhdmVkRGVjaXNpb25zLmV4cGVyaWVuY2VfZGVjaXNpb25zKSB8fCB7fSksXG4gICAgICAuLi4odXNlclNlbGVjdGlvbnMuZXhwZXJpZW5jZXMgfHwge30pLFxuICAgIH0sXG4gICAgc2tpbGxfZGVjaXNpb25zOiB7XG4gICAgICAuLi4oKHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMgJiYgd2luZG93Ll9zYXZlZERlY2lzaW9ucy5za2lsbF9kZWNpc2lvbnMpIHx8IHt9KSxcbiAgICAgIC4uLih1c2VyU2VsZWN0aW9ucy5za2lsbHMgfHwge30pLFxuICAgIH0sXG4gICAgYWNoaWV2ZW1lbnRfZGVjaXNpb25zOiAoXG4gICAgICAod2luZG93Ll9zYXZlZERlY2lzaW9ucyAmJiB3aW5kb3cuX3NhdmVkRGVjaXNpb25zLmFjaGlldmVtZW50X2RlY2lzaW9ucylcbiAgICAgIHx8IHdpbmRvdy5hY2hpZXZlbWVudERlY2lzaW9uc1xuICAgICAgfHwge31cbiAgICApLFxuICAgIHB1YmxpY2F0aW9uX2RlY2lzaW9uczogKFxuICAgICAgKHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMgJiYgd2luZG93Ll9zYXZlZERlY2lzaW9ucy5wdWJsaWNhdGlvbl9kZWNpc2lvbnMpXG4gICAgICB8fCB3aW5kb3cucHVibGljYXRpb25EZWNpc2lvbnNcbiAgICAgIHx8IHt9XG4gICAgKSxcbiAgICBzdW1tYXJ5X2ZvY3VzX292ZXJyaWRlOiB3aW5kb3cuc2VsZWN0ZWRTdW1tYXJ5S2V5IHx8IG51bGwsXG4gIH07XG5cbiAgY29uc3QgcmVxdWVzdElkID0gKytwYWdlRXN0aW1hdGVSZXF1ZXN0SWQ7XG4gIGNsZWFyVGltZW91dChwYWdlRXN0aW1hdGVUaW1lcik7XG4gIHBhZ2VFc3RpbWF0ZVRpbWVyID0gc2V0VGltZW91dChhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXBpQ2FsbCgnUE9TVCcsICcvYXBpL2N2L2xheW91dC1lc3RpbWF0ZScsIHBheWxvYWQpO1xuICAgICAgaWYgKCFyZXNwb25zZS5vaykgdGhyb3cgbmV3IEVycm9yKHJlc3BvbnNlLmVycm9yIHx8ICdlc3RpbWF0ZSBmYWlsZWQnKTtcbiAgICAgIGlmIChyZXF1ZXN0SWQgIT09IHBhZ2VFc3RpbWF0ZVJlcXVlc3RJZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBwYWdlcyA9IE51bWJlcihyZXNwb25zZS5wYWdlX2NvdW50X2VzdGltYXRlIHx8IDApO1xuICAgICAgY29uc3QgcGN0ID0gTWF0aC5taW4oMTAwLCAocGFnZXMgLyAzKSAqIDEwMCk7XG4gICAgICBjb25zdCBjb25maWRlbmNlID0gTnVtYmVyKHJlc3BvbnNlLnBhZ2VfY291bnRfY29uZmlkZW5jZSB8fCAwKTtcblxuICAgICAgbGV0IGNscyA9ICdvayc7XG4gICAgICBsZXQgY29sb3VyID0gJyMyMmM1NWUnO1xuICAgICAgbGV0IGljb25UZXh0ID0gcmVzcG9uc2UucGFnZV9jb3VudF9leGFjdCAhPSBudWxsID8gJ1x1MjcwNScgOiAnXHVEODNEXHVEQ0M0JztcbiAgICAgIGlmIChyZXNwb25zZS5wYWdlX2xlbmd0aF93YXJuaW5nKSB7XG4gICAgICAgIGNscyA9IHBhZ2VzID4gMyA/ICdvdmVyJyA6ICd3YXJuJztcbiAgICAgICAgY29sb3VyID0gcGFnZXMgPiAzID8gJyNlZjQ0NDQnIDogJyNmNTllMGInO1xuICAgICAgICBpY29uVGV4dCA9IHBhZ2VzID4gMyA/ICdcdUQ4M0RcdURFQTgnIDogJ1x1MjZBMFx1RkUwRic7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNvdXJjZUxhYmVsID0gcmVzcG9uc2UucGFnZV9jb3VudF9leGFjdCAhPSBudWxsXG4gICAgICAgID8gYEV4YWN0OiAke3Jlc3BvbnNlLnBhZ2VfY291bnRfZXhhY3R9IHBhZ2Uke3Jlc3BvbnNlLnBhZ2VfY291bnRfZXhhY3QgPT09IDEgPyAnJyA6ICdzJ31gXG4gICAgICAgIDogYEVzdGltYXRlZDogJHtwYWdlcy50b0ZpeGVkKDEpfSBwYWdlc2A7XG4gICAgICBjb25zdCBjb25maWRlbmNlTGFiZWwgPSByZXNwb25zZS5wYWdlX2NvdW50X2V4YWN0ICE9IG51bGxcbiAgICAgICAgPyAnJ1xuICAgICAgICA6IGAgKCR7TWF0aC5yb3VuZChjb25maWRlbmNlICogMTAwKX0lIGNvbmZpZGVuY2UpYDtcbiAgICAgIGNvbnN0IGNvbnRyaWJ1dG9yVGV4dCA9IEFycmF5LmlzQXJyYXkocmVzcG9uc2UuY29udHJpYnV0b3JzKSAmJiByZXNwb25zZS5jb250cmlidXRvcnMubGVuZ3RoID4gMFxuICAgICAgICA/IGAgJHtyZXNwb25zZS5jb250cmlidXRvcnNbMF19LmBcbiAgICAgICAgOiAnJztcbiAgICAgIGNvbnN0IHJlY2hlY2tUZXh0ID0gcmVzcG9uc2UucGFnZV9jb3VudF9uZWVkc19leGFjdF9yZWNoZWNrICYmIHJlc3BvbnNlLnBhZ2VfY291bnRfZXhhY3QgPT0gbnVsbFxuICAgICAgICA/ICcgRXhhY3QgcmVjaGVjayByZWNvbW1lbmRlZC4nXG4gICAgICAgIDogJyc7XG5cbiAgICAgIHdpZGdldC5jbGFzc05hbWUgPSBgcGFnZS1lc3RpbWF0ZSAke2Nsc31gO1xuICAgICAgaWYgKGxhYmVsKSB7XG4gICAgICAgIGxhYmVsLnRleHRDb250ZW50ID0gYCR7c291cmNlTGFiZWx9JHtjb25maWRlbmNlTGFiZWx9LiR7Y29udHJpYnV0b3JUZXh0fSR7cmVjaGVja1RleHR9YC50cmltKCk7XG4gICAgICB9XG4gICAgICBpZiAoZmlsbCkge1xuICAgICAgICBmaWxsLnN0eWxlLndpZHRoID0gYCR7cGN0fSVgO1xuICAgICAgICBmaWxsLnN0eWxlLmJhY2tncm91bmQgPSBjb2xvdXI7XG4gICAgICB9XG4gICAgICBpZiAoaWNvbikgaWNvbi50ZXh0Q29udGVudCA9IGljb25UZXh0O1xuXG4gICAgICBzdGF0ZU1hbmFnZXIuc2V0R2VuZXJhdGlvblN0YXRlKHtcbiAgICAgICAgcGFnZUNvdW50RXN0aW1hdGU6IHJlc3BvbnNlLnBhZ2VfY291bnRfZXN0aW1hdGUgPz8gbnVsbCxcbiAgICAgICAgcGFnZUNvdW50RXhhY3Q6IHJlc3BvbnNlLnBhZ2VfY291bnRfZXhhY3QgPz8gbnVsbCxcbiAgICAgICAgcGFnZUNvdW50Q29uZmlkZW5jZTogcmVzcG9uc2UucGFnZV9jb3VudF9jb25maWRlbmNlID8/IG51bGwsXG4gICAgICAgIHBhZ2VDb3VudFNvdXJjZTogcmVzcG9uc2UucGFnZV9jb3VudF9zb3VyY2UgfHwgbnVsbCxcbiAgICAgICAgcGFnZU5lZWRzRXhhY3RSZWNoZWNrOiBCb29sZWFuKHJlc3BvbnNlLnBhZ2VfY291bnRfbmVlZHNfZXhhY3RfcmVjaGVjayksXG4gICAgICAgIHBhZ2VXYXJuaW5nOiBCb29sZWFuKHJlc3BvbnNlLnBhZ2VfbGVuZ3RoX3dhcm5pbmcpLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChyZXF1ZXN0SWQgIT09IHBhZ2VFc3RpbWF0ZVJlcXVlc3RJZCkgcmV0dXJuO1xuICAgICAgd2lkZ2V0LmNsYXNzTmFtZSA9ICdwYWdlLWVzdGltYXRlIHdhcm4nO1xuICAgICAgaWYgKGxhYmVsKSBsYWJlbC50ZXh0Q29udGVudCA9IGBMYXlvdXQgZXN0aW1hdGUgdW5hdmFpbGFibGU6ICR7ZXJyb3IubWVzc2FnZX1gO1xuICAgICAgaWYgKGZpbGwpIHtcbiAgICAgICAgZmlsbC5zdHlsZS53aWR0aCA9ICcwJSc7XG4gICAgICAgIGZpbGwuc3R5bGUuYmFja2dyb3VuZCA9ICcjZjU5ZTBiJztcbiAgICAgIH1cbiAgICAgIGlmIChpY29uKSBpY29uLnRleHRDb250ZW50ID0gJ1x1MjZBMFx1RkUwRic7XG4gICAgfVxuICB9LCAyNTApO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgU2hhcmVkIGFjdGlvbiBjbGljayBoYW5kbGVycyAoZXhwZXJpZW5jZSArIHNraWxscyB0YWJsZXMpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBoYW5kbGVBY3Rpb25DbGljayhpdGVtSWQsIGFjdGlvbiwgdHlwZSkge1xuICAvLyBSZW1vdmUgYWN0aXZlIGNsYXNzIGZyb20gYWxsIGJ1dHRvbnMgaW4gdGhpcyByb3dcbiAgY29uc3Qgcm93ID0gdHlwZSA9PT0gJ2V4cGVyaWVuY2UnXG4gICAgPyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGB0cltkYXRhLWV4cC1pZD1cIiR7aXRlbUlkfVwiXWApXG4gICAgOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGB0cltkYXRhLXNraWxsPVwiJHtpdGVtSWR9XCJdYCk7XG5cbiAgY29uc3QgYnV0dG9ucyA9IHJvdy5xdWVyeVNlbGVjdG9yQWxsKCcuaWNvbi1idG4nKTtcbiAgYnV0dG9ucy5mb3JFYWNoKGJ0biA9PiB7XG4gICAgYnRuLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgIGlmIChidG4uaGFzQXR0cmlidXRlKCdhcmlhLXByZXNzZWQnKSkgYnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJywgJ2ZhbHNlJyk7XG4gIH0pO1xuXG4gIC8vIEFkZCBhY3RpdmUgY2xhc3MgdG8gY2xpY2tlZCBidXR0b25cbiAgY29uc3QgY2xpY2tlZEJ0biA9IHJvdy5xdWVyeVNlbGVjdG9yKGBbZGF0YS1hY3Rpb249XCIke2FjdGlvbn1cIl1gKTtcbiAgY2xpY2tlZEJ0bi5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgaWYgKGNsaWNrZWRCdG4uaGFzQXR0cmlidXRlKCdhcmlhLXByZXNzZWQnKSkgY2xpY2tlZEJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsICd0cnVlJyk7XG5cbiAgLy8gU3RvcmUgc2VsZWN0aW9uIGFuZCByZWNvcmQgZXhwbGljaXQgcmV2aWV3XG4gIGlmICh0eXBlID09PSAnZXhwZXJpZW5jZScpIHtcbiAgICB1c2VyU2VsZWN0aW9ucy5leHBlcmllbmNlc1tpdGVtSWRdID0gYWN0aW9uO1xuICAgIHdpbmRvdy5fZXhwbGljaXRseVJldmlld2VkID0gd2luZG93Ll9leHBsaWNpdGx5UmV2aWV3ZWQgfHwgeyBleHBlcmllbmNlczogbmV3IFNldCgpLCBza2lsbHM6IG5ldyBTZXQoKSB9O1xuICAgIHdpbmRvdy5fZXhwbGljaXRseVJldmlld2VkLmV4cGVyaWVuY2VzLmFkZChpdGVtSWQpO1xuICB9IGVsc2Uge1xuICAgIHVzZXJTZWxlY3Rpb25zLnNraWxsc1tpdGVtSWRdID0gYWN0aW9uO1xuICAgIHdpbmRvdy5fZXhwbGljaXRseVJldmlld2VkID0gd2luZG93Ll9leHBsaWNpdGx5UmV2aWV3ZWQgfHwgeyBleHBlcmllbmNlczogbmV3IFNldCgpLCBza2lsbHM6IG5ldyBTZXQoKSB9O1xuICAgIHdpbmRvdy5fZXhwbGljaXRseVJldmlld2VkLnNraWxscy5hZGQoaXRlbUlkKTtcbiAgfVxuICBfdXBkYXRlUGFnZUVzdGltYXRlKCk7XG59XG5cbi8qKlxuICogQXBwbHkgYSBidWxrIGFjdGlvbiB0byBhbGwgdmlzaWJsZSAoRGF0YVRhYmxlLWZpbHRlcmVkKSByb3dzIGluIG9uZSB0YWJsZS5cbiAqIGFjdGlvbjogJ2VtcGhhc2l6ZScgfCAnaW5jbHVkZScgfCAnZGUtZW1waGFzaXplJyB8ICdleGNsdWRlJyB8ICdyZWNvbW1lbmRlZCdcbiAqIHR5cGU6ICAgJ2V4cGVyaWVuY2UnIHwgJ3NraWxsJ1xuICovXG5mdW5jdGlvbiBidWxrQWN0aW9uKGFjdGlvbiwgdHlwZSkge1xuICBjb25zdCB0YWJsZUlkICA9IHR5cGUgPT09ICdleHBlcmllbmNlJyA/ICcjZXhwZXJpZW5jZS1yZXZpZXctdGFibGUnIDogJyNza2lsbHMtcmV2aWV3LXRhYmxlJztcbiAgY29uc3QgZGF0YSAgICAgPSB3aW5kb3cucGVuZGluZ1JlY29tbWVuZGF0aW9ucyB8fCB7fTtcbiAgY29uc3QgZHQgICAgICAgPSAkLmZuLkRhdGFUYWJsZS5pc0RhdGFUYWJsZSh0YWJsZUlkKSA/ICQodGFibGVJZCkuRGF0YVRhYmxlKCkgOiBudWxsO1xuXG4gIC8vIEl0ZXJhdGUgb25seSB0aGUgcm93cyB0aGF0IERhdGFUYWJsZSBjdXJyZW50bHkgc2hvd3MgKHJlc3BlY3RzIHNlYXJjaCBmaWx0ZXIpXG4gIGNvbnN0IHJvd3MgPSBkdFxuICAgID8gZHQucm93cyh7IHNlYXJjaDogJ2FwcGxpZWQnIH0pLm5vZGVzKCkudG9BcnJheSgpXG4gICAgOiBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYCR7dGFibGVJZH0gdGJvZHkgdHJgKSk7XG5cbiAgcm93cy5mb3JFYWNoKHJvdyA9PiB7XG4gICAgY29uc3QgZXhwSWQgICAgPSByb3cuZGF0YXNldC5leHBJZDtcbiAgICBjb25zdCBza2lsbElkICA9IHJvdy5kYXRhc2V0LnNraWxsO1xuICAgIGNvbnN0IGl0ZW1JZCAgID0gZXhwSWQgfHwgc2tpbGxJZDtcbiAgICBpZiAoIWl0ZW1JZCkgcmV0dXJuO1xuXG4gICAgbGV0IHJlc29sdmVkQWN0aW9uID0gYWN0aW9uO1xuICAgIGlmIChhY3Rpb24gPT09ICdyZWNvbW1lbmRlZCcpIHtcbiAgICAgIHJlc29sdmVkQWN0aW9uID0gdHlwZSA9PT0gJ2V4cGVyaWVuY2UnXG4gICAgICAgID8gX3Jlc29sdmVkRXhwQWN0aW9uKGl0ZW1JZCwgZGF0YSlcbiAgICAgICAgOiBfcmVzb2x2ZWRTa2lsbEFjdGlvbihpdGVtSWQsIGRhdGEpO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBidXR0b24gc3RhdGVzXG4gICAgcm93LnF1ZXJ5U2VsZWN0b3JBbGwoJy5pY29uLWJ0bicpLmZvckVhY2goYnRuID0+IHtcbiAgICAgIGJ0bi5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICAgIGlmIChidG4uaGFzQXR0cmlidXRlKCdhcmlhLXByZXNzZWQnKSkgYnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJywgJ2ZhbHNlJyk7XG4gICAgfSk7XG4gICAgY29uc3QgdGFyZ2V0ID0gcm93LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWFjdGlvbj1cIiR7cmVzb2x2ZWRBY3Rpb259XCJdYCk7XG4gICAgaWYgKHRhcmdldCkge1xuICAgICAgdGFyZ2V0LmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgICAgaWYgKHRhcmdldC5oYXNBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcpKSB0YXJnZXQuc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCAndHJ1ZScpO1xuICAgIH1cblxuICAgIC8vIFN0b3JlIHNlbGVjdGlvblxuICAgIGlmICh0eXBlID09PSAnZXhwZXJpZW5jZScpIHtcbiAgICAgIHVzZXJTZWxlY3Rpb25zLmV4cGVyaWVuY2VzW2l0ZW1JZF0gPSByZXNvbHZlZEFjdGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgdXNlclNlbGVjdGlvbnMuc2tpbGxzW2l0ZW1JZF0gPSByZXNvbHZlZEFjdGlvbjtcbiAgICB9XG4gIH0pO1xuICBfdXBkYXRlUGFnZUVzdGltYXRlKCk7XG59XG5cbmZ1bmN0aW9uIF9yZXNvbHZlZEV4cEFjdGlvbihleHBJZCwgZGF0YSkge1xuICBjb25zdCByZWMgPSBnZXRFeHBlcmllbmNlUmVjb21tZW5kYXRpb24oZXhwSWQsIGRhdGEpO1xuICBpZiAocmVjID09PSAnRW1waGFzaXplJykgICAgcmV0dXJuICdlbXBoYXNpemUnO1xuICBpZiAocmVjID09PSAnSW5jbHVkZScpICAgICAgcmV0dXJuICdpbmNsdWRlJztcbiAgaWYgKHJlYyA9PT0gJ0RlLWVtcGhhc2l6ZScpIHJldHVybiAnZGUtZW1waGFzaXplJztcbiAgcmV0dXJuICdleGNsdWRlJztcbn1cblxuZnVuY3Rpb24gX3Jlc29sdmVkU2tpbGxBY3Rpb24oc2tpbGxOYW1lLCBkYXRhKSB7XG4gIGNvbnN0IHJlYyA9IGdldFNraWxsUmVjb21tZW5kYXRpb24oc2tpbGxOYW1lLCBkYXRhKTtcbiAgaWYgKHJlYyA9PT0gJ0VtcGhhc2l6ZScpICAgIHJldHVybiAnZW1waGFzaXplJztcbiAgaWYgKHJlYyA9PT0gJ0luY2x1ZGUnKSAgICAgIHJldHVybiAnaW5jbHVkZSc7XG4gIGlmIChyZWMgPT09ICdEZS1lbXBoYXNpemUnKSByZXR1cm4gJ2RlLWVtcGhhc2l6ZSc7XG4gIHJldHVybiAnZXhjbHVkZSc7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBUYWdsaW5lIHJldmlldyB0YWIgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIHBvcHVsYXRlVGFnbGluZVJldmlld1RhYigpIHtcbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIGlmICghY29udGVudCkgcmV0dXJuO1xuICBjb250ZW50LmlubmVySFRNTCA9IGBcbiAgICA8aDIgc3R5bGU9XCJtYXJnaW46MCAwIDE2cHg7XCI+XHVEODNDXHVERkY3XHVGRTBGIEFwcGxpY2FudCBUYWdsaW5lPC9oMj5cbiAgICA8ZGl2IGlkPVwidGFnbGluZS1yZXZpZXctY29udGFpbmVyXCI+PC9kaXY+XG4gIGA7XG4gIGlmICh0eXBlb2YgYnVpbGRUYWdsaW5lUmV2aWV3U2VjdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGF3YWl0IGJ1aWxkVGFnbGluZVJldmlld1NlY3Rpb24oKTtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgRXhwb3J0cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZXhwb3J0IHtcbiAgdXNlclNlbGVjdGlvbnMsXG4gIHVwZGF0ZUluY2x1c2lvbkNvdW50cyxcbiAgc3dpdGNoVGFiLFxuICBsb2FkVGFiQ29udGVudCxcbiAgcG9wdWxhdGVBbmFseXNpc1RhYixcbiAgaGFuZGxlQ3VzdG9taXphdGlvblJlc3BvbnNlLFxuICBzaG93VGFibGVCYXNlZFJldmlldyxcbiAgcG9wdWxhdGVSZXZpZXdUYWIsXG4gIHBvcHVsYXRlVGFnbGluZVJldmlld1RhYixcbiAgc3dpdGNoUmV2aWV3U3VidGFiLFxuICBfbG9hZFJldmlld1BhbmUsXG4gIF91cGRhdGVQYWdlRXN0aW1hdGUsXG4gIGhhbmRsZUFjdGlvbkNsaWNrLFxuICBidWxrQWN0aW9uLFxuICBfcmVzb2x2ZWRFeHBBY3Rpb24sXG4gIF9yZXNvbHZlZFNraWxsQWN0aW9uLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL3ZhbGlkYXRvcnMuanNcbiAqIEFQSSByZXNwb25zZSB2YWxpZGF0b3JzIFx1MjAxNCBEVE8gbWlycm9ycyBvZiBQeXRob24gZGF0YWNsYXNzZXMgaW4gd2ViX2FwcC5weS5cbiAqXG4gKiBFYWNoIGZ1bmN0aW9uIGNoZWNrcyB0aGF0IHJlcXVpcmVkIGZpZWxkcyBhcmUgcHJlc2VudCBpbiBhbiBBUEkgcmVzcG9uc2UgYW5kXG4gKiBsb2dzIGEgY29uc29sZS53YXJuIGlmIGFueSBhcmUgbWlzc2luZyBvciBoYXZlIGFuIHVuZXhwZWN0ZWQgdHlwZS4gIFZhbGlkYXRvcnNcbiAqIHJldHVybiB0aGUgb3JpZ2luYWwgZGF0YSBvYmplY3QgdW5jaGFuZ2VkIHNvIHRoZXkgY2FuIGJlIHVzZWQgaW5saW5lLlxuICpcbiAqIFVwZGF0ZSBib3RoIHRoaXMgZmlsZSBhbmQgdGhlIFB5dGhvbiBkYXRhY2xhc3NlcyBpbiB3ZWJfYXBwLnB5IHRvZ2V0aGVyXG4gKiB3aGVuZXZlciBhZGRpbmcgb3IgcmVtb3ZpbmcgcmVzcG9uc2UgZmllbGRzLlxuICpcbiAqIERFUEVOREVOQ0lFUzogbm9uZVxuICovXG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmNvbnN0IGxvZyA9IGdldExvZ2dlcigndmFsaWRhdG9ycycpO1xuXG4vKiogVmFsaWRhdGUgR0VUIC9hcGkvc3RhdHVzIHJlc3BvbnNlLiAqL1xuZnVuY3Rpb24gcGFyc2VTdGF0dXNSZXNwb25zZShkYXRhKSB7XG4gIGNvbnN0IHJlcXVpcmVkID0gW1xuICAgICdwaGFzZScsICdsbG1fcHJvdmlkZXInLCAnam9iX2Rlc2NyaXB0aW9uJyxcbiAgICAncG9zdF9hbmFseXNpc19xdWVzdGlvbnMnLCAncG9zdF9hbmFseXNpc19hbnN3ZXJzJyxcbiAgICAnYWxsX2V4cGVyaWVuY2VfaWRzJywgJ2FsbF9leHBlcmllbmNlcycsICdhbGxfc2tpbGxzJywgJ2FsbF9hY2hpZXZlbWVudHMnLFxuICAgICdwcm9mZXNzaW9uYWxfc3VtbWFyaWVzJywgJ2NvcGlsb3RfYXV0aCcsICdpdGVyYXRpbmcnLFxuICAgICdleHBlcmllbmNlX2RlY2lzaW9ucycsICdza2lsbF9kZWNpc2lvbnMnLFxuICAgICdhY2hpZXZlbWVudF9kZWNpc2lvbnMnLCAncHVibGljYXRpb25fZGVjaXNpb25zJyxcbiAgICAnZXh0cmFfc2tpbGxzJywgJ2V4dHJhX3NraWxsX21hdGNoZXMnLCAnc2Vzc2lvbl9maWxlJyxcbiAgXTtcbiAgY29uc3QgbWlzc2luZyA9IHJlcXVpcmVkLmZpbHRlcihrID0+ICEoayBpbiBkYXRhKSk7XG4gIGlmIChtaXNzaW5nLmxlbmd0aCkge1xuICAgIGxvZy53YXJuKCdbcGFyc2VTdGF0dXNSZXNwb25zZV0gTWlzc2luZyBmaWVsZHM6JywgbWlzc2luZywgZGF0YSk7XG4gIH1cbiAgaWYgKCdwb3N0X2FuYWx5c2lzX3F1ZXN0aW9ucycgaW4gZGF0YSAmJiAhQXJyYXkuaXNBcnJheShkYXRhLnBvc3RfYW5hbHlzaXNfcXVlc3Rpb25zKSkge1xuICAgIGxvZy53YXJuKCdbcGFyc2VTdGF0dXNSZXNwb25zZV0gcG9zdF9hbmFseXNpc19xdWVzdGlvbnMgc2hvdWxkIGJlIGFuIGFycmF5OicsIGRhdGEucG9zdF9hbmFseXNpc19xdWVzdGlvbnMpO1xuICB9XG4gIGlmICgnYWxsX2V4cGVyaWVuY2VfaWRzJyBpbiBkYXRhICYmICFBcnJheS5pc0FycmF5KGRhdGEuYWxsX2V4cGVyaWVuY2VfaWRzKSkge1xuICAgIGxvZy53YXJuKCdbcGFyc2VTdGF0dXNSZXNwb25zZV0gYWxsX2V4cGVyaWVuY2VfaWRzIHNob3VsZCBiZSBhbiBhcnJheTonLCBkYXRhLmFsbF9leHBlcmllbmNlX2lkcyk7XG4gIH1cbiAgcmV0dXJuIGRhdGE7XG59XG5cbi8qKiBWYWxpZGF0ZSBHRVQgL2FwaS9zZXNzaW9ucyByZXNwb25zZS4gKi9cbmZ1bmN0aW9uIHBhcnNlU2Vzc2lvbkxpc3RSZXNwb25zZShkYXRhKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShkYXRhLnNlc3Npb25zKSkge1xuICAgIGxvZy53YXJuKCdbcGFyc2VTZXNzaW9uTGlzdFJlc3BvbnNlXSBzZXNzaW9ucyBzaG91bGQgYmUgYW4gYXJyYXk6JywgZGF0YSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgaXRlbVJlcXVpcmVkID0gWydwYXRoJywgJ3Bvc2l0aW9uX25hbWUnLCAndGltZXN0YW1wJywgJ3BoYXNlJywgJ2hhc19qb2InLCAnaGFzX2FuYWx5c2lzJywgJ2hhc19jdXN0b21pemF0aW9ucyddO1xuICAgIGRhdGEuc2Vzc2lvbnMuZm9yRWFjaCgocywgaSkgPT4ge1xuICAgICAgY29uc3QgbWlzc2luZyA9IGl0ZW1SZXF1aXJlZC5maWx0ZXIoayA9PiAhKGsgaW4gcykpO1xuICAgICAgaWYgKG1pc3NpbmcubGVuZ3RoKSBsb2cud2FybihgW3BhcnNlU2Vzc2lvbkxpc3RSZXNwb25zZV0gc2Vzc2lvbnNbJHtpfV0gbWlzc2luZyBmaWVsZHM6YCwgbWlzc2luZywgcyk7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGRhdGE7XG59XG5cbi8qKiBWYWxpZGF0ZSBHRVQgL2FwaS9yZXdyaXRlcyByZXNwb25zZS4gKi9cbmZ1bmN0aW9uIHBhcnNlUmV3cml0ZXNSZXNwb25zZShkYXRhKSB7XG4gIGNvbnN0IHJlcXVpcmVkID0gWydvaycsICdyZXdyaXRlcycsICdwZXJzdWFzaW9uX3dhcm5pbmdzJywgJ3BoYXNlJ107XG4gIGNvbnN0IG1pc3NpbmcgPSByZXF1aXJlZC5maWx0ZXIoayA9PiAhKGsgaW4gZGF0YSkpO1xuICBpZiAobWlzc2luZy5sZW5ndGgpIGxvZy53YXJuKCdbcGFyc2VSZXdyaXRlc1Jlc3BvbnNlXSBNaXNzaW5nIGZpZWxkczonLCBtaXNzaW5nLCBkYXRhKTtcbiAgaWYgKCdyZXdyaXRlcycgaW4gZGF0YSAmJiAhQXJyYXkuaXNBcnJheShkYXRhLnJld3JpdGVzKSkge1xuICAgIGxvZy53YXJuKCdbcGFyc2VSZXdyaXRlc1Jlc3BvbnNlXSByZXdyaXRlcyBzaG91bGQgYmUgYW4gYXJyYXk6JywgZGF0YS5yZXdyaXRlcyk7XG4gIH1cbiAgcmV0dXJuIGRhdGE7XG59XG5cbi8qKiBWYWxpZGF0ZSBQT1NUIC9hcGkvbWVzc2FnZSBhbmQgUE9TVCAvYXBpL2FjdGlvbiByZXNwb25zZXMuICovXG5mdW5jdGlvbiBwYXJzZU1lc3NhZ2VSZXNwb25zZShkYXRhKSB7XG4gIGlmICghZGF0YS5vayAmJiAhZGF0YS5lcnJvcikge1xuICAgIGxvZy53YXJuKCdbcGFyc2VNZXNzYWdlUmVzcG9uc2VdIFJlc3BvbnNlIGhhcyBuZWl0aGVyIG9rIG5vciBlcnJvcjonLCBkYXRhKTtcbiAgfVxuICByZXR1cm4gZGF0YTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEVTIG1vZHVsZSBleHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuZXhwb3J0IHtcbiAgcGFyc2VTdGF0dXNSZXNwb25zZSxcbiAgcGFyc2VTZXNzaW9uTGlzdFJlc3BvbnNlLFxuICBwYXJzZVJld3JpdGVzUmVzcG9uc2UsXG4gIHBhcnNlTWVzc2FnZVJlc3BvbnNlLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL3JlY29tbWVuZGF0aW9uLWhlbHBlcnMuanNcbiAqIFB1cmUgaGVscGVyIGZ1bmN0aW9ucyBmb3IgbG9va2luZyB1cCBMTE0gcmVjb21tZW5kYXRpb24gZGF0YSBmcm9tIHRoZVxuICogL2FwaS9zdGF0dXMgcmVzcG9uc2Ugb2JqZWN0LiAgU3VwcG9ydHMgZXhwZXJpZW5jZSwgc2tpbGwsIGFuZCBhY2hpZXZlbWVudFxuICogcmVjb21tZW5kYXRpb25zIHdpdGggYmFja3dhcmRzLWNvbXBhdGlibGUgZmxhdC1saXN0IGZhbGxiYWNrcyBmb3Igb2xkXG4gKiBzZXNzaW9uIGRhdGEuXG4gKlxuICogREVQRU5ERU5DSUVTOiBub25lXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdyZWNvbW1lbmRhdGlvbi1oZWxwZXJzJyk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gSW50ZXJuYWwgbG9va3VwIGhlbHBlcnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogTG9vayB1cCBhIHNpbmdsZSBleHBlcmllbmNlIGVudHJ5IGluIGV4cGVyaWVuY2VfcmVjb21tZW5kYXRpb25zLiAqL1xuZnVuY3Rpb24gX2ZpbmRFeHBSZWMoZXhwSWQsIGRhdGEpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEuZXhwZXJpZW5jZV9yZWNvbW1lbmRhdGlvbnMpKSB7XG4gICAgbG9nLndhcm4oJ1tyZWNvbW1lbmRhdGlvbl0gZXhwZXJpZW5jZV9yZWNvbW1lbmRhdGlvbnMgbWlzc2luZzsgdXNpbmcgZmxhdC1saXN0IGZhbGxiYWNrIGZvcicsIGV4cElkKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gZGF0YS5leHBlcmllbmNlX3JlY29tbWVuZGF0aW9ucy5maW5kKHIgPT4gci5pZCA9PT0gZXhwSWQgfHwgci5leHBlcmllbmNlX2lkID09PSBleHBJZCkgfHwgbnVsbDtcbn1cblxuLyoqIExvb2sgdXAgYSBzaW5nbGUgc2tpbGwgZW50cnkgaW4gc2tpbGxfcmVjb21tZW5kYXRpb25zLiAqL1xuZnVuY3Rpb24gX2ZpbmRTa2lsbFJlYyhza2lsbCwgZGF0YSkge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YS5za2lsbF9yZWNvbW1lbmRhdGlvbnMpKSB7XG4gICAgbG9nLndhcm4oJ1tyZWNvbW1lbmRhdGlvbl0gc2tpbGxfcmVjb21tZW5kYXRpb25zIG1pc3Npbmc7IHVzaW5nIGZsYXQtbGlzdCBmYWxsYmFjayBmb3InLCBza2lsbCk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIGRhdGEuc2tpbGxfcmVjb21tZW5kYXRpb25zLmZpbmQociA9PiByLnNraWxsID09PSBza2lsbCB8fCByLm5hbWUgPT09IHNraWxsKSB8fCBudWxsO1xufVxuXG4vKiogUGFyc2UgYSByYXcgY29uZmlkZW5jZSBzdHJpbmcgdG8gYSB7bGV2ZWwsIHRleHR9IG9iamVjdCwgb3IgbnVsbCBpZiB1bnJlY29nbmlzZWQuICovXG5mdW5jdGlvbiBfcGFyc2VDb25maWRlbmNlKGNvbmYpIHtcbiAgY29uc3QgYyA9IChjb25mIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICBpZiAoYy5pbmNsdWRlcygndmVyeSBoaWdoJykpIHJldHVybiB7IGxldmVsOiAndmVyeS1oaWdoJywgdGV4dDogJ1ZlcnkgSGlnaCBDb25maWRlbmNlJyB9O1xuICBpZiAoYy5pbmNsdWRlcygndmVyeSBsb3cnKSkgIHJldHVybiB7IGxldmVsOiAndmVyeS1sb3cnLCAgdGV4dDogJ1ZlcnkgTG93IENvbmZpZGVuY2UnICB9O1xuICBpZiAoYy5pbmNsdWRlcygnaGlnaCcpKSAgICAgIHJldHVybiB7IGxldmVsOiAnaGlnaCcsICAgICAgdGV4dDogJ0hpZ2ggQ29uZmlkZW5jZScgICAgICB9O1xuICBpZiAoYy5pbmNsdWRlcygnbWVkaXVtJykpICAgIHJldHVybiB7IGxldmVsOiAnbWVkaXVtJywgICAgdGV4dDogJ01lZGl1bSBDb25maWRlbmNlJyAgICB9O1xuICBpZiAoYy5pbmNsdWRlcygnbG93JykpICAgICAgIHJldHVybiB7IGxldmVsOiAnbG93JywgICAgICAgdGV4dDogJ0xvdyBDb25maWRlbmNlJyAgICAgICB9O1xuICByZXR1cm4gbnVsbDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBFeHBlcmllbmNlIHJlY29tbWVuZGF0aW9uc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIGdldEV4cGVyaWVuY2VSZWNvbW1lbmRhdGlvbihleHBJZCwgZGF0YSkge1xuICBjb25zdCByZWMgPSBfZmluZEV4cFJlYyhleHBJZCwgZGF0YSk7XG4gIGlmIChyZWMgJiYgcmVjLnJlY29tbWVuZGF0aW9uKSByZXR1cm4gcmVjLnJlY29tbWVuZGF0aW9uO1xuICAvLyBCYWNrd2FyZHMtY29tcGF0IGZsYXQtbGlzdCBmYWxsYmFja1xuICBpZiAoZGF0YS5vbWl0dGVkX2V4cGVyaWVuY2VzICAgICAmJiBkYXRhLm9taXR0ZWRfZXhwZXJpZW5jZXMuaW5jbHVkZXMoZXhwSWQpKSAgICAgcmV0dXJuICdPbWl0JztcbiAgaWYgKGRhdGEucmVjb21tZW5kZWRfZXhwZXJpZW5jZXMgJiYgZGF0YS5yZWNvbW1lbmRlZF9leHBlcmllbmNlcy5pbmNsdWRlcyhleHBJZCkpIHJldHVybiAnRW1waGFzaXplJztcbiAgcmV0dXJuICdJbmNsdWRlJztcbn1cblxuZnVuY3Rpb24gZ2V0Q29uZmlkZW5jZUxldmVsKGV4cElkLCBkYXRhKSB7XG4gIGNvbnN0IHJlYyA9IF9maW5kRXhwUmVjKGV4cElkLCBkYXRhKTtcbiAgcmV0dXJuIChyZWMgJiYgX3BhcnNlQ29uZmlkZW5jZShyZWMuY29uZmlkZW5jZSkpIHx8IHsgbGV2ZWw6ICdtZWRpdW0nLCB0ZXh0OiAnTWVkaXVtIENvbmZpZGVuY2UnIH07XG59XG5cbmZ1bmN0aW9uIGdldEV4cGVyaWVuY2VSZWFzb25pbmcoZXhwSWQsIGRhdGEpIHtcbiAgY29uc3QgcmVjID0gX2ZpbmRFeHBSZWMoZXhwSWQsIGRhdGEpO1xuICByZXR1cm4gKHJlYyAmJiByZWMucmVhc29uaW5nKSB8fCAnVGhpcyBleHBlcmllbmNlIHdhcyBzZWxlY3RlZCBiYXNlZCBvbiBpdHMgcmVsZXZhbmNlIHRvIHRoZSBwb3NpdGlvbiByZXF1aXJlbWVudHMuJztcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTa2lsbCByZWNvbW1lbmRhdGlvbnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiBnZXRTa2lsbFJlY29tbWVuZGF0aW9uKHNraWxsLCBkYXRhKSB7XG4gIGNvbnN0IHJlYyA9IF9maW5kU2tpbGxSZWMoc2tpbGwsIGRhdGEpO1xuICBpZiAocmVjICYmIHJlYy5yZWNvbW1lbmRhdGlvbikgcmV0dXJuIHJlYy5yZWNvbW1lbmRhdGlvbjtcbiAgaWYgKGRhdGEucmVjb21tZW5kZWRfc2tpbGxzICYmIGRhdGEucmVjb21tZW5kZWRfc2tpbGxzLmluY2x1ZGVzKHNraWxsKSkgcmV0dXJuICdJbmNsdWRlJztcbiAgcmV0dXJuICdPbWl0Jztcbn1cblxuZnVuY3Rpb24gZ2V0U2tpbGxDb25maWRlbmNlKHNraWxsLCBkYXRhKSB7XG4gIGNvbnN0IHJlYyA9IF9maW5kU2tpbGxSZWMoc2tpbGwsIGRhdGEpO1xuICBpZiAocmVjKSB7XG4gICAgY29uc3QgcGFyc2VkID0gX3BhcnNlQ29uZmlkZW5jZShyZWMuY29uZmlkZW5jZSk7XG4gICAgaWYgKHBhcnNlZCkgcmV0dXJuIHBhcnNlZDtcbiAgfVxuICBpZiAoZGF0YS5yZWNvbW1lbmRlZF9za2lsbHMgJiYgZGF0YS5yZWNvbW1lbmRlZF9za2lsbHMuaW5jbHVkZXMoc2tpbGwpKSB7XG4gICAgcmV0dXJuIHsgbGV2ZWw6ICdtZWRpdW0nLCB0ZXh0OiAnTWVkaXVtIENvbmZpZGVuY2UnIH07XG4gIH1cbiAgcmV0dXJuIHsgbGV2ZWw6ICdsb3cnLCB0ZXh0OiAnTG93IENvbmZpZGVuY2UnIH07XG59XG5cbmZ1bmN0aW9uIGdldFNraWxsUmVhc29uaW5nKHNraWxsLCBkYXRhKSB7XG4gIGNvbnN0IHJlYyA9IF9maW5kU2tpbGxSZWMoc2tpbGwsIGRhdGEpO1xuICBpZiAocmVjICYmIHJlYy5yZWFzb25pbmcpIHJldHVybiByZWMucmVhc29uaW5nO1xuICBpZiAoZGF0YS5yZWNvbW1lbmRlZF9za2lsbHMgJiYgZGF0YS5yZWNvbW1lbmRlZF9za2lsbHMuaW5jbHVkZXMoc2tpbGwpKSB7XG4gICAgcmV0dXJuICdUaGlzIHNraWxsIHdhcyBpZGVudGlmaWVkIGFzIHJlbGV2YW50IHRvIHRoZSBwb3NpdGlvbiByZXF1aXJlbWVudHMuJztcbiAgfVxuICByZXR1cm4gJ1RoaXMgc2tpbGwgd2FzIG5vdCBzcGVjaWZpY2FsbHkgbWVudGlvbmVkIGluIHRoZSBqb2IgcmVxdWlyZW1lbnRzLic7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQWNoaWV2ZW1lbnQgcmVjb21tZW5kYXRpb25zXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gZ2V0QWNoaWV2ZW1lbnRSZWNvbW1lbmRhdGlvbihhY2hJZCwgZGF0YSkge1xuICBpZiAoZGF0YS5hY2hpZXZlbWVudF9yZWNvbW1lbmRhdGlvbnMgJiYgQXJyYXkuaXNBcnJheShkYXRhLmFjaGlldmVtZW50X3JlY29tbWVuZGF0aW9ucykpIHtcbiAgICBjb25zdCByZWMgPSBkYXRhLmFjaGlldmVtZW50X3JlY29tbWVuZGF0aW9ucy5maW5kKHIgPT4gci5pZCA9PT0gYWNoSWQpO1xuICAgIGlmIChyZWMgJiYgcmVjLnJlY29tbWVuZGF0aW9uKSByZXR1cm4gcmVjLnJlY29tbWVuZGF0aW9uO1xuICB9XG4gIGlmIChkYXRhLnJlY29tbWVuZGVkX2FjaGlldmVtZW50cyAmJiBkYXRhLnJlY29tbWVuZGVkX2FjaGlldmVtZW50cy5pbmNsdWRlcyhhY2hJZCkpIHtcbiAgICByZXR1cm4gJ0luY2x1ZGUnO1xuICB9XG4gIHJldHVybiAnRGUtZW1waGFzaXplJztcbn1cblxuZnVuY3Rpb24gZ2V0QWNoaWV2ZW1lbnRDb25maWRlbmNlKGFjaElkLCBkYXRhLCBhY2hJbXBvcnRhbmNlKSB7XG4gIGlmIChkYXRhLmFjaGlldmVtZW50X3JlY29tbWVuZGF0aW9ucyAmJiBBcnJheS5pc0FycmF5KGRhdGEuYWNoaWV2ZW1lbnRfcmVjb21tZW5kYXRpb25zKSkge1xuICAgIGNvbnN0IHJlYyA9IGRhdGEuYWNoaWV2ZW1lbnRfcmVjb21tZW5kYXRpb25zLmZpbmQociA9PiByLmlkID09PSBhY2hJZCk7XG4gICAgaWYgKHJlYyAmJiByZWMuY29uZmlkZW5jZSkge1xuICAgICAgY29uc3QgY29uZiA9IHJlYy5jb25maWRlbmNlLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAoY29uZi5pbmNsdWRlcygndmVyeSBoaWdoJykpIHJldHVybiB7IGxldmVsOiAndmVyeS1oaWdoJywgdGV4dDogJ1ZlcnkgSGlnaCcgfTtcbiAgICAgIGlmIChjb25mLmluY2x1ZGVzKCdoaWdoJykpICAgICAgcmV0dXJuIHsgbGV2ZWw6ICdoaWdoJywgICAgICB0ZXh0OiAnSGlnaCcgICAgICB9O1xuICAgICAgaWYgKGNvbmYuaW5jbHVkZXMoJ21lZGl1bScpKSAgICByZXR1cm4geyBsZXZlbDogJ21lZGl1bScsICAgIHRleHQ6ICdNZWRpdW0nICAgIH07XG4gICAgICBpZiAoY29uZi5pbmNsdWRlcygndmVyeSBsb3cnKSkgIHJldHVybiB7IGxldmVsOiAndmVyeS1sb3cnLCAgdGV4dDogJ1ZlcnkgTG93JyAgfTtcbiAgICAgIGlmIChjb25mLmluY2x1ZGVzKCdsb3cnKSkgICAgICAgcmV0dXJuIHsgbGV2ZWw6ICdsb3cnLCAgICAgICB0ZXh0OiAnTG93JyAgICAgICB9O1xuICAgIH1cbiAgfVxuICBjb25zdCBpbXAgPSBhY2hJbXBvcnRhbmNlIHx8IDU7XG4gIGlmIChpbXAgPj0gOSkgcmV0dXJuIHsgbGV2ZWw6ICd2ZXJ5LWhpZ2gnLCB0ZXh0OiAnVmVyeSBIaWdoJyB9O1xuICBpZiAoaW1wID49IDcpIHJldHVybiB7IGxldmVsOiAnaGlnaCcsICAgICAgdGV4dDogJ0hpZ2gnICAgICAgfTtcbiAgaWYgKGltcCA+PSA1KSByZXR1cm4geyBsZXZlbDogJ21lZGl1bScsICAgIHRleHQ6ICdNZWRpdW0nICAgIH07XG4gIGlmIChpbXAgPj0gMykgcmV0dXJuIHsgbGV2ZWw6ICdsb3cnLCAgICAgICB0ZXh0OiAnTG93JyAgICAgICB9O1xuICByZXR1cm4geyBsZXZlbDogJ3ZlcnktbG93JywgdGV4dDogJ1ZlcnkgTG93JyB9O1xufVxuXG5mdW5jdGlvbiBnZXRBY2hpZXZlbWVudFJlYXNvbmluZyhhY2hJZCwgZGF0YSwgYWNoKSB7XG4gIGlmIChkYXRhLmFjaGlldmVtZW50X3JlY29tbWVuZGF0aW9ucyAmJiBBcnJheS5pc0FycmF5KGRhdGEuYWNoaWV2ZW1lbnRfcmVjb21tZW5kYXRpb25zKSkge1xuICAgIGNvbnN0IHJlYyA9IGRhdGEuYWNoaWV2ZW1lbnRfcmVjb21tZW5kYXRpb25zLmZpbmQociA9PiByLmlkID09PSBhY2hJZCk7XG4gICAgaWYgKHJlYyAmJiByZWMucmVhc29uaW5nKSByZXR1cm4gcmVjLnJlYXNvbmluZztcbiAgfVxuICBjb25zdCByZWxldmFudEZvciA9IChhY2gucmVsZXZhbnRfZm9yIHx8IFtdKS5qb2luKCcsICcpO1xuICBpZiAoZGF0YS5yZWNvbW1lbmRlZF9hY2hpZXZlbWVudHMgJiYgZGF0YS5yZWNvbW1lbmRlZF9hY2hpZXZlbWVudHMuaW5jbHVkZXMoYWNoSWQpKSB7XG4gICAgcmV0dXJuIHJlbGV2YW50Rm9yXG4gICAgICA/IGBSZWNvbW1lbmRlZCBmb3IgdGhpcyByb2xlLiBSZWxldmFudCBmb3I6ICR7cmVsZXZhbnRGb3J9LmBcbiAgICAgIDogJ1JlY29tbWVuZGVkIGJ5IEFJIGFzIHJlbGV2YW50IHRvIHRoaXMgcm9sZS4nO1xuICB9XG4gIHJldHVybiByZWxldmFudEZvclxuICAgID8gYFJlbGV2YW50IGZvcjogJHtyZWxldmFudEZvcn0uIE5vdCBzcGVjaWZpY2FsbHkgaGlnaGxpZ2h0ZWQgZm9yIHRoaXMgcm9sZS5gXG4gICAgOiAnTm90IHNwZWNpZmljYWxseSBoaWdobGlnaHRlZCBmb3IgdGhpcyByb2xlIGJhc2VkIG9uIGpvYiByZXF1aXJlbWVudHMuJztcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBGYWxsYmFjayBxdWVzdGlvbiBnZW5lcmF0aW9uXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gYnVpbGRGYWxsYmFja1Bvc3RBbmFseXNpc1F1ZXN0aW9ucyhkYXRhKSB7XG4gIGNvbnN0IHF1ZXN0aW9ucyA9IFtdO1xuXG4gIGlmIChkYXRhLnJvbGVfbGV2ZWwpIHtcbiAgICBxdWVzdGlvbnMucHVzaCh7XG4gICAgICBxdWVzdGlvbjogYFRoaXMgcm9sZSBhcHBlYXJzIHRvIGJlIGF0ICR7ZGF0YS5yb2xlX2xldmVsfSBsZXZlbC4gU2hvdWxkIEkgZW1waGFzaXplIHlvdXIgbW9zdCBzZW5pb3IgZXhwZXJpZW5jZXMgb3IgaW5jbHVkZSBhIGJyb2FkZXIgcmFuZ2UgdG8gc2hvdyBjYXJlZXIgcHJvZ3Jlc3Npb24/YCxcbiAgICAgIHR5cGU6ICdleHBlcmllbmNlX2xldmVsJyxcbiAgICAgIGNob2ljZXM6IFsnRW1waGFzaXplIG1vc3Qgc2VuaW9yJywgJ0Jyb2FkZXIgY2FyZWVyIHByb2dyZXNzaW9uJywgJ0xldCB5b3UgZGVjaWRlIGJhc2VkIG9uIGFuYWx5c2lzJ10sXG4gICAgfSk7XG4gIH1cblxuICBpZiAoZGF0YS5yZXF1aXJlZF9za2lsbHMgJiYgZGF0YS5yZXF1aXJlZF9za2lsbHMuc29tZShza2lsbCA9PlxuICAgICAgc2tpbGwudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnbGVhZGVyc2hpcCcpIHx8XG4gICAgICBza2lsbC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdtYW5hZ2VtZW50JykgfHxcbiAgICAgIHNraWxsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ3RlYW0nKSkpIHtcbiAgICBxdWVzdGlvbnMucHVzaCh7XG4gICAgICBxdWVzdGlvbjogJ1RoaXMgcm9sZSBoYXMgbGVhZGVyc2hpcCBjb21wb25lbnRzLiBXb3VsZCB5b3UgcHJlZmVyIG1lIHRvIGVtcGhhc2l6ZSB5b3VyIG1hbmFnZW1lbnQgZXhwZXJpZW5jZSBvciBmb2N1cyBtb3JlIG9uIHlvdXIgdGVjaG5pY2FsIGNvbnRyaWJ1dGlvbnM/JyxcbiAgICAgIHR5cGU6ICdsZWFkZXJzaGlwX2ZvY3VzJyxcbiAgICAgIGNob2ljZXM6IFsnRW1waGFzaXplIG1hbmFnZW1lbnQnLCAnRm9jdXMgb24gdGVjaG5pY2FsJywgJ0JhbGFuY2UgYm90aCBlcXVhbGx5J10sXG4gICAgfSk7XG4gIH1cblxuICBpZiAoZGF0YS5kb21haW4pIHtcbiAgICBxdWVzdGlvbnMucHVzaCh7XG4gICAgICBxdWVzdGlvbjogYFRoZSByb2xlIGlzIGluICR7ZGF0YS5kb21haW59LiBEbyB5b3UgaGF2ZSBwYXJ0aWN1bGFyIHByb2plY3RzIG9yIGFjaGlldmVtZW50cyBpbiB0aGlzIGRvbWFpbiB0aGF0IHlvdSdkIGxpa2UgbWUgdG8gaGlnaGxpZ2h0P2AsXG4gICAgICB0eXBlOiAnZG9tYWluX2V4cGVydGlzZScsXG4gICAgICBjaG9pY2VzOiBbJ0hpZ2hsaWdodCBkb21haW4tc3BlY2lmaWMgYWNoaWV2ZW1lbnRzJywgJ1VzZSBhbGwgYXZhaWxhYmxlIGV4cGVyaWVuY2UnLCAnUHJpb3JpdGl6ZSBtb3N0IHJlY2VudCB3b3JrJ10sXG4gICAgfSk7XG4gIH1cblxuICBpZiAoZGF0YS5jb21wYW55KSB7XG4gICAgcXVlc3Rpb25zLnB1c2goe1xuICAgICAgcXVlc3Rpb246IGBGb3IgJHtkYXRhLmNvbXBhbnl9LCB3b3VsZCB5b3UgbGlrZSBtZSB0byB0YWlsb3IgZW1waGFzaXMgdG93YXJkIHRoZWlyIGN1bHR1cmUgYW5kIHZhbHVlcz8gSWYgc28sIHdoYXQgc2hvdWxkIEkgcHJpb3JpdGl6ZT9gLFxuICAgICAgdHlwZTogJ2NvbXBhbnlfY3VsdHVyZScsXG4gICAgICBjaG9pY2VzOiBbJ1Jlc2VhcmNoLWRyaXZlbiAvIGFjYWRlbWljJywgJ0luZHVzdHJ5IC8gY29tbWVyY2lhbCBpbXBhY3QnLCAnSW5ub3ZhdGlvbiAvIHN0YXJ0dXAnLCAnVXNlIGN1bHR1cmFsIGluZGljYXRvcnMgZnJvbSBqb2IgZGVzY3JpcHRpb24nXSxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBxdWVzdGlvbnM7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFUyBtb2R1bGUgZXhwb3J0cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmV4cG9ydCB7XG4gIGdldEV4cGVyaWVuY2VSZWNvbW1lbmRhdGlvbiwgZ2V0Q29uZmlkZW5jZUxldmVsLCBnZXRFeHBlcmllbmNlUmVhc29uaW5nLFxuICBnZXRTa2lsbFJlY29tbWVuZGF0aW9uLCBnZXRTa2lsbENvbmZpZGVuY2UsIGdldFNraWxsUmVhc29uaW5nLFxuICBnZXRBY2hpZXZlbWVudFJlY29tbWVuZGF0aW9uLCBnZXRBY2hpZXZlbWVudENvbmZpZGVuY2UsIGdldEFjaGlldmVtZW50UmVhc29uaW5nLFxuICBidWlsZEZhbGxiYWNrUG9zdEFuYWx5c2lzUXVlc3Rpb25zLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL3VpLWhlbHBlcnMuanNcbiAqIExpZ2h0d2VpZ2h0IERPTSBoZWxwZXJzOiB0b2FzdHMsIGFsZXJ0L2NvbmZpcm0gbW9kYWxzLCBjaGF0IHRvZ2dsZSwgYW5kXG4gKiB3b3JrZmxvdy1zdGFnZSBhY3Rpb24tYnV0dG9uIG1hbmFnZW1lbnQuXG4gKlxuICogREVQRU5ERU5DSUVTOiB1aS1jb3JlLmpzIGV4cG9ydHMgKHRyYXBGb2N1cywgcmVzdG9yZUZvY3VzLCBzZXRJbml0aWFsRm9jdXMsXG4gKiAgICAgICAgICAgICAgIHB1c2hGb2N1c1N0YWNrKSBhdmFpbGFibGUgb24gZ2xvYmFsVGhpcyBhdCBydW50aW1lLlxuICovXG5cbmltcG9ydCB7IHN0YXRlTWFuYWdlciwgR0VORVJBVElPTl9TVEFURV9FVkVOVCB9IGZyb20gJy4vc3RhdGUtbWFuYWdlci5qcyc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQWxlcnQgbW9kYWwgKGluZm9ybWF0aW9uYWwgXHUyMDE0IHNpbmdsZSBPSyBidXR0b24pXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gX3NldE1vZGFsVGV4dChlbCwgbWVzc2FnZSkge1xuICBlbC50ZXh0Q29udGVudCA9ICcnO1xuICBjb25zdCBwYXJ0cyA9IFN0cmluZyhtZXNzYWdlIHx8ICcnKS5zcGxpdCgnXFxuJyk7XG4gIHBhcnRzLmZvckVhY2goKHBhcnQsIGkpID0+IHtcbiAgICBlbC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShwYXJ0KSk7XG4gICAgaWYgKGkgPCBwYXJ0cy5sZW5ndGggLSAxKSBlbC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdicicpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHNob3dBbGVydE1vZGFsKHRpdGxlLCBtZXNzYWdlKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhbGVydC1tb2RhbC10aXRsZScpLnRleHRDb250ZW50ID0gdGl0bGU7XG4gIF9zZXRNb2RhbFRleHQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FsZXJ0LW1vZGFsLW1lc3NhZ2UnKSwgbWVzc2FnZSk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhbGVydC1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gIC8vIHB1c2hGb2N1c1N0YWNrIChHQVAtMTk3KSBwYWlycyB3aXRoIHRyYXBGb2N1cy9yZXN0b3JlRm9jdXMgYmVsb3cgXHUyMDE0IHVzaW5nXG4gIC8vIHRoZSBzaGFyZWQgZm9jdXMtc3RhY2sgbWVjaGFuaXNtLCBub3QgYSBsb2NhbCB2YXJpYWJsZSwgc28gY2xvc2VBbGVydE1vZGFsXG4gIC8vIGFsc28gcG9wcyB0aGUga2V5ZG93biBsaXN0ZW5lciB0cmFwRm9jdXMgcmVnaXN0ZXJzIG9uIGRvY3VtZW50LiBBIHByaW9yXG4gIC8vIHZlcnNpb24gdHJhY2tlZCBpdHMgb3duIGBfYWxlcnRQcmV2aW91c0ZvY3VzYCBhbmQgbmV2ZXIgY2FsbGVkXG4gIC8vIHJlc3RvcmVGb2N1cygpLCB3aGljaCBsZWZ0IHRoYXQgdHJhcEZvY3VzIGxpc3RlbmVyIHBlcm1hbmVudGx5IGF0dGFjaGVkXG4gIC8vIGFmdGVyIGV2ZXJ5IGFsZXJ0IG1vZGFsIGNsb3NlLlxuICBpZiAodHlwZW9mIHB1c2hGb2N1c1N0YWNrID09PSAnZnVuY3Rpb24nKSBwdXNoRm9jdXNTdGFjayhkb2N1bWVudC5hY3RpdmVFbGVtZW50KTtcbiAgaWYgKHR5cGVvZiBzZXRJbml0aWFsRm9jdXMgPT09ICdmdW5jdGlvbicpIHNldEluaXRpYWxGb2N1cygnYWxlcnQtbW9kYWwtb3ZlcmxheScpO1xuICBpZiAodHlwZW9mIHRyYXBGb2N1cyA9PT0gJ2Z1bmN0aW9uJykgdHJhcEZvY3VzKCdhbGVydC1tb2RhbC1vdmVybGF5Jyk7XG59XG5cbmZ1bmN0aW9uIGNsb3NlQWxlcnRNb2RhbCgpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FsZXJ0LW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBpZiAodHlwZW9mIHJlc3RvcmVGb2N1cyA9PT0gJ2Z1bmN0aW9uJykgcmVzdG9yZUZvY3VzKCk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ29uZmlybSBtb2RhbCAocmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0cnVlL2ZhbHNlKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmxldCBfY29uZmlybVJlc29sdmUgPSBudWxsO1xubGV0IF9jb25maXJtUHJldmlvdXNGb2N1cyA9IG51bGw7XG5cbmZ1bmN0aW9uIHNob3dDb25maXJtTW9kYWwodGl0bGUsIG1lc3NhZ2UsIG9rTGFiZWwgPSAnT0snKSB7XG4gIF9jb25maXJtUHJldmlvdXNGb2N1cyA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb25maXJtLW1vZGFsLXRpdGxlJykudGV4dENvbnRlbnQgPSB0aXRsZTtcbiAgX3NldE1vZGFsVGV4dChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29uZmlybS1tb2RhbC1tZXNzYWdlJyksIG1lc3NhZ2UpO1xuICBjb25zdCBva0J0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb25maXJtLW1vZGFsLW9rJyk7XG4gIGlmIChva0J0bikgb2tCdG4udGV4dENvbnRlbnQgPSBva0xhYmVsO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29uZmlybS1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gIGlmIChva0J0bikgb2tCdG4uZm9jdXMoKTtcbiAgaWYgKHR5cGVvZiB0cmFwRm9jdXMgPT09ICdmdW5jdGlvbicpIHRyYXBGb2N1cygnY29uZmlybS1tb2RhbC1vdmVybGF5Jyk7XG4gIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHsgX2NvbmZpcm1SZXNvbHZlID0gcmVzb2x2ZTsgfSk7XG59XG5cbmZ1bmN0aW9uIGNsb3NlQ29uZmlybU1vZGFsKHJlc3VsdCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29uZmlybS1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgaWYgKHR5cGVvZiByZXN0b3JlRm9jdXMgPT09ICdmdW5jdGlvbicpIHJlc3RvcmVGb2N1cygpO1xuICBpZiAoX2NvbmZpcm1SZXNvbHZlKSB7IF9jb25maXJtUmVzb2x2ZShyZXN1bHQpOyBfY29uZmlybVJlc29sdmUgPSBudWxsOyB9XG4gIGlmIChfY29uZmlybVByZXZpb3VzRm9jdXMgJiYgdHlwZW9mIF9jb25maXJtUHJldmlvdXNGb2N1cy5mb2N1cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIF9jb25maXJtUHJldmlvdXNGb2N1cy5mb2N1cygpO1xuICB9XG4gIF9jb25maXJtUHJldmlvdXNGb2N1cyA9IG51bGw7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVG9hc3Qgbm90aWZpY2F0aW9uc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIHNob3dUb2FzdChtZXNzYWdlLCB0eXBlID0gJ3N1Y2Nlc3MnLCBkdXJhdGlvbiA9IDMwMDApIHtcbiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvYXN0LWNvbnRhaW5lcicpO1xuICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuO1xuICBjb25zdCB0b2FzdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICB0b2FzdC5jbGFzc05hbWUgPSBgdG9hc3QgdG9hc3QtJHt0eXBlfWA7XG4gIHRvYXN0LnRleHRDb250ZW50ID0gbWVzc2FnZTtcbiAgY29udGFpbmVyLmFwcGVuZENoaWxkKHRvYXN0KTtcbiAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHsgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHsgdG9hc3QuY2xhc3NMaXN0LmFkZCgndG9hc3Qtc2hvdycpOyB9KTsgfSk7XG4gIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIHRvYXN0LmNsYXNzTGlzdC5yZW1vdmUoJ3RvYXN0LXNob3cnKTtcbiAgICB0b2FzdC5hZGRFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgKCkgPT4gdG9hc3QucmVtb3ZlKCksIHsgb25jZTogdHJ1ZSB9KTtcbiAgfSwgZHVyYXRpb24pO1xufVxuXG5mdW5jdGlvbiByZWZyZXNoTGF5b3V0U3RhdHVzVUkoKSB7XG4gIGNvbnN0IGxheW91dENoaXAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGF5b3V0LWZyZXNobmVzcy1jaGlwJyk7XG4gIGNvbnN0IGxheW91dEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYXlvdXQtYnRuJyk7XG4gIGNvbnN0IGZyZXNobmVzcyA9IHN0YXRlTWFuYWdlci5nZXRMYXlvdXRGcmVzaG5lc3MoKTtcbiAgY29uc3QgZ2VuZXJhdGlvblN0YXRlID0gc3RhdGVNYW5hZ2VyLmdldEdlbmVyYXRpb25TdGF0ZSgpO1xuXG4gIGlmIChsYXlvdXRDaGlwKSB7XG4gICAgbGF5b3V0Q2hpcC5zdHlsZS5kaXNwbGF5ID0gZnJlc2huZXNzLnNob3dDaGlwID8gJycgOiAnbm9uZSc7XG4gICAgbGF5b3V0Q2hpcC5jbGFzc05hbWUgPSBgbGF5b3V0LWZyZXNobmVzcy1jaGlwICR7ZnJlc2huZXNzLnRvbmV9YDtcbiAgICBsYXlvdXRDaGlwLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIGZyZXNobmVzcy5hcmlhTGFiZWwgfHwgJycpO1xuICAgIGxheW91dENoaXAuaW5uZXJIVE1MID0gZnJlc2huZXNzLnNob3dDaGlwXG4gICAgICA/IGA8c3BhbiBjbGFzcz1cImxheW91dC1mcmVzaG5lc3MtaWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiR7ZnJlc2huZXNzLmlzQ3JpdGljYWwgPyAnXHUyMUJCJyA6IChmcmVzaG5lc3MuaXNTdGFsZSA/ICchJyA6ICdcdTI3MTMnKX08L3NwYW4+PHNwYW4gY2xhc3M9XCJsYXlvdXQtZnJlc2huZXNzLWxhYmVsXCI+JHtmcmVzaG5lc3MubGFiZWx9PC9zcGFuPmBcbiAgICAgIDogJyc7XG4gIH1cblxuICBpZiAobGF5b3V0QnRuKSB7XG4gICAgaWYgKGZyZXNobmVzcy5pc1N0YWxlKSB7XG4gICAgICBsYXlvdXRCdG4udGV4dENvbnRlbnQgPSAnXHUyMUJCIFJlZ2VuZXJhdGUgUHJldmlldyc7XG4gICAgICBsYXlvdXRCdG4udGl0bGUgPSAnUHJldmlldyBpcyBvdXQgb2YgZGF0ZSBcdTIwMTQgcmVnZW5lcmF0ZSBiZWZvcmUgY29uZmlybWluZyBsYXlvdXQnO1xuICAgIH0gZWxzZSBpZiAoZ2VuZXJhdGlvblN0YXRlLmxheW91dENvbmZpcm1lZCB8fCBnZW5lcmF0aW9uU3RhdGUucGhhc2UgPT09ICdjb25maXJtZWQnKSB7XG4gICAgICBsYXlvdXRCdG4udGV4dENvbnRlbnQgPSAnXHUyQjA3XHVGRTBGIEdlbmVyYXRlIEZpbmFsIEZpbGVzJztcbiAgICAgIGxheW91dEJ0bi50aXRsZSA9ICdMYXlvdXQgY29uZmlybWVkIFx1MjAxNCBwcm9kdWNlIGZpbmFsIHN1Ym1pc3Npb24tcmVhZHkgRE9DWCBhbmQgUERGIGZpbGVzJztcbiAgICB9IGVsc2Uge1xuICAgICAgbGF5b3V0QnRuLnRleHRDb250ZW50ID0gJ1x1MjcwNSBDb25maXJtIExheW91dCc7XG4gICAgICBsYXlvdXRCdG4udGl0bGUgPSAnU3RlcCAyIG9mIDM6IENvbmZpcm0gdGhlIGxheW91dCBsb29rcyByaWdodCBiZWZvcmUgZ2VuZXJhdGluZyBmaW5hbCBmaWxlcyc7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGhhbmRsZUxheW91dEZyZXNobmVzc0NoaXBDbGljaygpIHtcbiAgaWYgKHR5cGVvZiB1cGRhdGVUYWJCYXJGb3JTdGFnZSA9PT0gJ2Z1bmN0aW9uJykgdXBkYXRlVGFiQmFyRm9yU3RhZ2UoJ2xheW91dCcpO1xuICBpZiAodHlwZW9mIHVwZGF0ZUFjdGlvbkJ1dHRvbnMgPT09ICdmdW5jdGlvbicpIHVwZGF0ZUFjdGlvbkJ1dHRvbnMoJ2xheW91dCcpO1xuICBpZiAodHlwZW9mIHN3aXRjaFRhYiA9PT0gJ2Z1bmN0aW9uJykgc3dpdGNoVGFiKCdsYXlvdXQnKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBXb3JrZmxvdy1zdGFnZSBwcmltYXJ5IGFjdGlvbiBidXR0b25zXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIEFsbCBzdGFnZS1zcGVjaWZpYyBwcmltYXJ5IGFjdGlvbiBidXR0b24gSURzIChleGNsdWRlcyByZXNldCB3aGljaCBpcyBhbHdheXMgdmlzaWJsZSkuICovXG5jb25zdCBfU1RBR0VfQlVUVE9OUyA9IFtcbiAgJ2FuYWx5emUtYnRuJywgJ3JlY29tbWVuZC1idG4nLCAnZ2VuZXJhdGUtYnRuJyxcbiAgJ3Jld3JpdGUtYnRuJywgJ3NwZWxsLWJ0bicsICdnZW5lcmF0ZS1wcm9jZWVkLWJ0bicsXG4gICdsYXlvdXQtYnRuJywgJ2ZpbmFsLWdlbmVyYXRlLXByb2NlZWQtYnRuJywgJ2ZpbmFsaXNlLWFjdGlvbi1idG4nLFxuXTtcblxuLyoqIE1hcHMgZWFjaCB3b3JrZmxvdyBzdGFnZSB0byBpdHMgb25lIHByaW1hcnkgYWN0aW9uIGJ1dHRvbi4gKi9cbmNvbnN0IF9TVEFHRV9CVVRUT05fTUFQID0ge1xuICBqb2I6ICAgICAgICAgICAgJ2FuYWx5emUtYnRuJyxcbiAgYW5hbHlzaXM6ICAgICAgICdyZWNvbW1lbmQtYnRuJyxcbiAgY3VzdG9taXphdGlvbnM6ICdnZW5lcmF0ZS1idG4nLFxuICByZXdyaXRlOiAgICAgICAgJ3Jld3JpdGUtYnRuJyxcbiAgc3BlbGw6ICAgICAgICAgICdzcGVsbC1idG4nLFxuICBnZW5lcmF0ZTogICAgICAgJ2dlbmVyYXRlLXByb2NlZWQtYnRuJyxcbiAgbGF5b3V0OiAgICAgICAgICdsYXlvdXQtYnRuJyxcbiAgZmluYWxfZ2VuZXJhdGU6ICdmaW5hbC1nZW5lcmF0ZS1wcm9jZWVkLWJ0bicsXG4gIGZpbmFsaXNlOiAgICAgICAnZmluYWxpc2UtYWN0aW9uLWJ0bicsXG59O1xuXG4vKipcbiAqIFNob3cgb25seSB0aGUgcHJpbWFyeSBhY3Rpb24gYnV0dG9uIGZvciB0aGUgZ2l2ZW4gd29ya2Zsb3cgc3RhZ2UuXG4gKiBSZXNldCBpcyBhbHdheXMgdmlzaWJsZS4gIEFsbCBvdGhlciBzdGFnZSBidXR0b25zIGFyZSBoaWRkZW4uXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZUFjdGlvbkJ1dHRvbnMoc3RhZ2UpIHtcbiAgY29uc3QgYWN0aXZlSWQgPSBfU1RBR0VfQlVUVE9OX01BUFtzdGFnZV0gfHwgbnVsbDtcbiAgX1NUQUdFX0JVVFRPTlMuZm9yRWFjaChpZCA9PiB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgaWYgKGVsKSBlbC5zdHlsZS5kaXNwbGF5ID0gKGlkID09PSBhY3RpdmVJZCkgPyAnJyA6ICdub25lJztcbiAgfSk7XG4gIHJlZnJlc2hMYXlvdXRTdGF0dXNVSSgpO1xufVxuXG5pZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoR0VORVJBVElPTl9TVEFURV9FVkVOVCwgcmVmcmVzaExheW91dFN0YXR1c1VJKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEVTIG1vZHVsZSBleHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuZXhwb3J0IHtcbiAgc2hvd0FsZXJ0TW9kYWwsIGNsb3NlQWxlcnRNb2RhbCxcbiAgc2hvd0NvbmZpcm1Nb2RhbCwgY2xvc2VDb25maXJtTW9kYWwsXG4gIHNob3dUb2FzdCxcbiAgcmVmcmVzaExheW91dFN0YXR1c1VJLFxuICBoYW5kbGVMYXlvdXRGcmVzaG5lc3NDaGlwQ2xpY2ssXG4gIHVwZGF0ZUFjdGlvbkJ1dHRvbnMsXG59O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiBTaGFyZWQgcHJvcG9zYWwtcmV2aWV3IHJvdyByZW5kZXJlciwgZXh0cmFjdGVkIGZyb20gd2ViL2hhcnZlc3QuanMgc28gdGhlXG4gKiBHQVAtMDEgXCJVcGRhdGUgdmlhIEFJXCIgcGFuZWwgKHdlYi9tYXN0ZXItZGF0YS1haS11cGRhdGUuanMpIGRvZXNuJ3RcbiAqIGR1cGxpY2F0ZSBvciBmb3JrIHRoZSBzYW1lIGJlZm9yZS9hZnRlciBkaWZmLXJvdyBVSSBhIHRoaXJkIHRpbWUuXG4gKlxuICogUm93IG1hcmt1cCB1c2VzIGBkYXRhLXRvZ2dsZS1yZWFzb25pbmc9XCJJRFwiYCBhdHRyaWJ1dGVzIGluc3RlYWQgb2YgaW5saW5lXG4gKiBgb25jbGljaz1cIi4uLlwiYCBoYW5kbGVycyBcdTIwMTQgdGhlIGNhbGxlciBhdHRhY2hlcyBPTkUgZGVsZWdhdGVkIGNsaWNrXG4gKiBsaXN0ZW5lciAoYXR0YWNoUHJvcG9zYWxSb3dMaXN0ZW5lcnMpIHJhdGhlciB0aGFuIGVhY2ggcm93IHdpcmluZyBpdHMgb3duXG4gKiBpbmxpbmUgaGFuZGxlci4gVGhpcyBtYXR0ZXJzIGJlY2F1c2UgaGFydmVzdC5qcydzIG9yaWdpbmFsIGlubGluZS1vbmNsaWNrXG4gKiB2ZXJzaW9uIGNhbGxlZCBoYXJ2ZXN0LmpzLXNwZWNpZmljIGdsb2JhbCBmdW5jdGlvbnMgZGlyZWN0bHk7IGEgcm93XG4gKiByZW5kZXJlZCBieSBhIGRpZmZlcmVudCBtb2R1bGUgKG1hc3Rlci1kYXRhLWFpLXVwZGF0ZS5qcykgbXVzdCBub3RcbiAqIHNpbGVudGx5IHJlZmVyZW5jZSBmdW5jdGlvbnMgdGhhdCBkb24ndCBleGlzdCB0aGVyZS5cbiAqXG4gKiBgaWRQcmVmaXhgIGtlZXBzIGVhY2ggY2FsbGVyJ3MgZXhpc3RpbmcgRE9NLWlkIGNvbnZlbnRpb24gaW50YWN0IChlLmcuXG4gKiBoYXJ2ZXN0LmpzJ3MgYGhhcnZlc3Qtcm93LSpgL2BoYXJ2ZXN0LWNoay0qYCwgcmVmZXJlbmNlZCBlbHNld2hlcmUgaW4gdGhhdFxuICogZmlsZSwgbm90YWJseSBhcHBseUhhcnZlc3RTZWxlY3Rpb25zKSByYXRoZXIgdGhhbiBmb3JjaW5nIGEgcmVuYW1lLlxuICpcbiAqIFB1YmxpYyBleHBvcnRzOlxuICogICBlc2Moc3RyKVxuICogICByZW5kZXJQcm9wb3NhbFJvdyhpdGVtLCBvcHRzKVxuICogICBhdHRhY2hQcm9wb3NhbFJvd0xpc3RlbmVycyhjb250YWluZXJFbCwgaWRQcmVmaXgsIGhhbmRsZXJzKVxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBlc2Moc3RyKSB7XG4gIHJldHVybiBTdHJpbmcoc3RyID8/ICcnKVxuICAgIC5yZXBsYWNlKC8mL2csICcmYW1wOycpXG4gICAgLnJlcGxhY2UoLzwvZywgJyZsdDsnKVxuICAgIC5yZXBsYWNlKC8+L2csICcmZ3Q7JylcbiAgICAucmVwbGFjZSgvXCIvZywgJyZxdW90OycpO1xufVxuXG4vKipcbiAqIFJlbmRlciBvbmUgcHJvcG9zYWwtcmV2aWV3IHJvdyAoY2hlY2tib3ggKyBiZWZvcmUvYWZ0ZXIgKyBvcHRpb25hbFxuICogY29sbGFwc2libGUgZGV0YWlsICsgb3B0aW9uYWwgYmFkZ2VzL2ZsYWcgYmFubmVyKS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gaXRlbVxuICogQHBhcmFtIHtzdHJpbmd9IGl0ZW0uaWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBpdGVtLnR5cGVMYWJlbCAgICAgLSBzbWFsbCBjYXBzIGxhYmVsIGFib3ZlIHRoZSByb3cgKGUuZy4gc2VjdGlvbiBuYW1lKVxuICogQHBhcmFtIHtzdHJpbmd9IFtpdGVtLnNvdXJjZUJhZGdlSHRtbF1cbiAqIEBwYXJhbSB7c3RyaW5nfSBpdGVtLmxhYmVsICAgICAgICAgLSBzZWNvbmRhcnkgc3VtbWFyeSBsaW5lXG4gKiBAcGFyYW0ge3N0cmluZ30gW2l0ZW0ub3JpZ2luYWxdICAgIC0gXCJCZWZvcmVcIiBibG9jayB0ZXh0IChvbWl0IGZvciBhZGQtb25seSBwcm9wb3NhbHMpXG4gKiBAcGFyYW0ge3N0cmluZ30gW2l0ZW0ucHJvcG9zZWRdICAgIC0gXCJBZnRlclwiIGJsb2NrIHRleHQgKGFscmVhZHkgZGlzcGxheS1yZWFkeSwgbm90IGEgcmF3IG9iamVjdClcbiAqIEBwYXJhbSB7c3RyaW5nfSBbaXRlbS5kZXRhaWxUZXh0XSAgLSBjb2xsYXBzaWJsZSBkZXRhaWwgKGhhcnZlc3Q6IHJlYXNvbmluZzsgR0FQLTAxOiByYXRpb25hbGUpXG4gKiBAcGFyYW0ge3N0cmluZ30gW2l0ZW0uYmFkZ2VzSHRtbF0gIC0gcHJlLXJlbmRlcmVkIHJpZ2h0LXNpZGUgYmFkZ2UgSFRNTCAoY2FsbGVyLXNwZWNpZmljKVxuICogQHBhcmFtIHtzdHJpbmd9IFtpdGVtLmZsYWdIdG1sXSAgICAtIHByZS1yZW5kZXJlZCBhZHZpc29yeS93YXJuaW5nIGJhbm5lciAoZS5nLiBwb3NzaWJsZS1kdXBsaWNhdGUsIHN0YWxlKVxuICogQHBhcmFtIHtib29sZWFufSBbaXRlbS5jaGVja2VkXVxuICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLmlkUHJlZml4ICAgICAgICAgIC0gc2hhcmVkIHByZWZpeCBmb3Igcm93L3JlYXNvbi9jaGVja2JveCBpZHMsIGUuZy4gJ2hhcnZlc3QnIG9yICdtZHUnXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuY2hlY2tib3hEYXRhQXR0cl0gLSBrZWJhYi1jYXNlIGRhdGEtYXR0cmlidXRlIHN1ZmZpeCwgZS5nLiAnaGFydmVzdC1pZCcgb3IgJ21kdS1pZCdcbiAqICAgKE5PVCBjYW1lbENhc2UgXHUyMDE0IHRoaXMgaXMgaW50ZXJwb2xhdGVkIHZlcmJhdGltIGludG8gYGRhdGEtJHtjaGVja2JveERhdGFBdHRyfWAgaW4gdGhlIEhUTUwgc3RyaW5nO1xuICogICBhIGNhbWVsQ2FzZSB2YWx1ZSBsaWtlICdoYXJ2ZXN0SWQnIHByb2R1Y2VzIHRoZSBsaXRlcmFsIGF0dHJpYnV0ZSBgZGF0YS1oYXJ2ZXN0SWRgLCB3aGljaCB0aGUgSFRNTFxuICogICBwYXJzZXIgbG93ZXJjYXNlcyB0byBgZGF0YS1oYXJ2ZXN0aWRgIG9uIGluc2VydGlvbiwgc2lsZW50bHkgYnJlYWtpbmcgYC5kYXRhc2V0LmhhcnZlc3RJZGAgL1xuICogICBgW2RhdGEtaGFydmVzdC1pZF1gIGxvb2t1cHMgZWxzZXdoZXJlLiBUaGlzIGJpdCBtYXN0ZXItZGF0YS1haS11cGRhdGUuanMncyBvd24gZmlyc3QgZHJhZnQuKVxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmFyaWFMYWJlbFN1ZmZpeF0gIC0gYXBwZW5kZWQgdG8gdGhlIGNoZWNrYm94J3MgYXJpYS1sYWJlbCBhZnRlciBgbGFiZWxgIChlLmcuIGR1cGxpY2F0ZS9mbGFnIHRleHQpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJQcm9wb3NhbFJvdyhpdGVtLCBvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGlkUHJlZml4ID0gJ3Byb3Bvc2FsJyxcbiAgICBjaGVja2JveERhdGFBdHRyID0gJ3Byb3Bvc2FsLWlkJyxcbiAgICBhcmlhTGFiZWxTdWZmaXggPSAnJyxcbiAgfSA9IG9wdHM7XG5cbiAgY29uc3QgY2hlY2tlZCA9IGl0ZW0uY2hlY2tlZCA/ICcgY2hlY2tlZCcgOiAnJztcbiAgY29uc3Qgcm93SWQgPSBgJHtpZFByZWZpeH0tcm93LSR7ZXNjKGl0ZW0uaWQpfWA7XG4gIGNvbnN0IHJlYXNvbklkID0gYCR7aWRQcmVmaXh9LXJlYXNvbi0ke2VzYyhpdGVtLmlkKX1gO1xuICBjb25zdCBjaGVja2JveElkID0gYCR7aWRQcmVmaXh9LWNoay0ke2VzYyhpdGVtLmlkKX1gO1xuICBjb25zdCBhcmlhTGFiZWwgPSBlc2MoYCR7aXRlbS5sYWJlbCB8fCAnJ30ke2FyaWFMYWJlbFN1ZmZpeH1gKTtcblxuICBjb25zdCBoYXNEZXRhaWwgPSBCb29sZWFuKGl0ZW0uZGV0YWlsVGV4dCk7XG4gIGNvbnN0IGRldGFpbFRvZ2dsZSA9IGhhc0RldGFpbFxuICAgID8gYDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGRhdGEtdG9nZ2xlLXJlYXNvbmluZz1cIiR7ZXNjKGl0ZW0uaWQpfVwiIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiIGFyaWEtY29udHJvbHM9XCIke3JlYXNvbklkfVwiIHN0eWxlPVwiZm9udC1zaXplOjAuNzVlbTtiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOm5vbmU7Y29sb3I6dmFyKC0tY3YtZ3JheS01MDApO2N1cnNvcjpwb2ludGVyO3BhZGRpbmc6MCA0cHg7dmVydGljYWwtYWxpZ246bWlkZGxlO1wiIHRpdGxlPVwiVG9nZ2xlIGRldGFpbHNcIj5cdUQ4M0RcdURDQUM8L2J1dHRvbj5gXG4gICAgOiAnJztcbiAgY29uc3QgZGV0YWlsQmxvY2sgPSBoYXNEZXRhaWxcbiAgICA/IGA8ZGl2IGlkPVwiJHtyZWFzb25JZH1cIiBzdHlsZT1cImRpc3BsYXk6bm9uZTttYXJnaW4tdG9wOjZweDtwYWRkaW5nOjhweCAxMHB4O2JhY2tncm91bmQ6dmFyKC0tY3YtYmctbGlnaHQpO2JvcmRlci1sZWZ0OjNweCBzb2xpZCB2YXIoLS1jdi1zbGF0ZS00MDApO2JvcmRlci1yYWRpdXM6NHB4O2ZvbnQtc2l6ZTowLjgyZW07Y29sb3I6dmFyKC0tY3YtdGV4dC1tdXRlZCk7bGluZS1oZWlnaHQ6MS41O1wiPiR7ZXNjKGl0ZW0uZGV0YWlsVGV4dCl9PC9kaXY+YFxuICAgIDogJyc7XG5cbiAgcmV0dXJuIGBcbiAgICA8dHIgaWQ9XCIke3Jvd0lkfVwiIHN0eWxlPVwiYm9yZGVyLWJvdHRvbToxcHggc29saWQgdmFyKC0tY3YtYmctc3VidGxlKTtcIj5cbiAgICAgIDx0ZCBzdHlsZT1cInBhZGRpbmc6MTBweCAxMnB4O3dpZHRoOjM2cHg7dmVydGljYWwtYWxpZ246dG9wO1wiPlxuICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCIke2NoZWNrYm94SWR9XCIgZGF0YS0ke2NoZWNrYm94RGF0YUF0dHJ9PVwiJHtlc2MoaXRlbS5pZCl9XCIke2NoZWNrZWR9XG4gICAgICAgICAgYXJpYS1sYWJlbD1cIiR7YXJpYUxhYmVsfVwiXG4gICAgICAgICAgc3R5bGU9XCJ3aWR0aDoxNnB4O2hlaWdodDoxNnB4O2N1cnNvcjpwb2ludGVyO21hcmdpbi10b3A6MnB4O1wiPlxuICAgICAgPC90ZD5cbiAgICAgIDx0ZCBzdHlsZT1cInBhZGRpbmc6MTBweCAxMnB4O1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmZsZXgtc3RhcnQ7Z2FwOjhweDtmbGV4LXdyYXA6d3JhcDtcIj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDoxO21pbi13aWR0aDoyMDBweDtcIj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC43OGVtO2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjp2YXIoLS1jdi10ZXh0LXNlY29uZGFyeSk7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO2xldHRlci1zcGFjaW5nOjAuMDRlbTttYXJnaW4tYm90dG9tOjRweDtcIj5cbiAgICAgICAgICAgICAgJHtlc2MoaXRlbS50eXBlTGFiZWwgfHwgJycpfSR7aXRlbS5zb3VyY2VCYWRnZUh0bWwgfHwgJyd9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC44N2VtO2NvbG9yOnZhcigtLWN2LXNsYXRlLTQwMCk7bWFyZ2luLWJvdHRvbTo2cHg7XCI+JHtlc2MoaXRlbS5sYWJlbCB8fCAnJyl9PC9kaXY+XG4gICAgICAgICAgICAke2l0ZW0uZmxhZ0h0bWwgfHwgJyd9XG4gICAgICAgICAgICAke2l0ZW0ub3JpZ2luYWwgPyBgXG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTo2cHg7XCI+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC43MmVtO2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjp2YXIoLS1jdi1ncmF5LTUwMCk7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO2xldHRlci1zcGFjaW5nOjAuMDNlbTttYXJnaW4tYm90dG9tOjJweDtcIj5CZWZvcmU8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07Y29sb3I6dmFyKC0tY3YtZ3JheS01MDApO2JhY2tncm91bmQ6dmFyKC0tY3YtYmctbGlnaHQpO2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6NnB4IDhweDtib3JkZXItbGVmdDozcHggc29saWQgdmFyKC0tY3YtZ3JheS0zMDApO2xpbmUtaGVpZ2h0OjEuNTtcIj4ke2VzYyhpdGVtLm9yaWdpbmFsKX08L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PmAgOiAnJ31cbiAgICAgICAgICAgICR7aXRlbS5wcm9wb3NlZCA/IGBcbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjRweDtcIj5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjcyZW07Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOnZhcigtLWN2LWdyYXktNTAwKTt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7bGV0dGVyLXNwYWNpbmc6MC4wM2VtO21hcmdpbi1ib3R0b206MnB4O1wiPkFmdGVyPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2NvbG9yOnZhcigtLWN2LXRleHQtcHJpbWFyeSk7YmFja2dyb3VuZDp2YXIoLS1jdi1zdWNjZXNzLWJnKTtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjZweCA4cHg7Ym9yZGVyLWxlZnQ6M3B4IHNvbGlkIHZhcigtLWN2LXN1Y2Nlc3MtYm9yZGVyKTtsaW5lLWhlaWdodDoxLjU7XCI+JHtlc2MoaXRlbS5wcm9wb3NlZCl9PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5gIDogJyd9XG4gICAgICAgICAgICAke2RldGFpbEJsb2NrfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2dhcDo0cHg7YWxpZ24taXRlbXM6ZmxleC1lbmQ7ZmxleC1zaHJpbms6MDtcIj5cbiAgICAgICAgICAgICR7aXRlbS5iYWRnZXNIdG1sIHx8ICcnfVxuICAgICAgICAgICAgJHtkZXRhaWxUb2dnbGV9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC90ZD5cbiAgICA8L3RyPmA7XG59XG5cbi8qKlxuICogQXR0YWNoIG9uZSBkZWxlZ2F0ZWQgY2xpY2sgbGlzdGVuZXIgdG8gYGNvbnRhaW5lckVsYCBjb3ZlcmluZyBldmVyeVxuICogYFtkYXRhLXRvZ2dsZS1yZWFzb25pbmddYCBlbGVtZW50IHJlbmRlcmVkIGJ5IHJlbmRlclByb3Bvc2FsUm93IHdpdGggdGhlXG4gKiBtYXRjaGluZyBgaWRQcmVmaXhgLiBHdWFyZHMgYWdhaW5zdCBkb3VibGUtYXR0YWNoaW5nIGFjcm9zcyByZXBlYXRlZFxuICogY2FsbHMgKGUuZy4gYSB0YWIgYmVpbmcgcmUtcG9wdWxhdGVkKSB2aWEgYSBtYXJrZXIgb24gYGNvbnRhaW5lckVsYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF0dGFjaFByb3Bvc2FsUm93TGlzdGVuZXJzKGNvbnRhaW5lckVsLCBpZFByZWZpeCwgaGFuZGxlcnMgPSB7fSkge1xuICBpZiAoIWNvbnRhaW5lckVsKSByZXR1cm47XG4gIGNvbnN0IGd1YXJkS2V5ID0gYHByb3Bvc2FsTGlzdGVuZXJzQXR0YWNoZWRfJHtpZFByZWZpeH1gO1xuICBpZiAoY29udGFpbmVyRWwuZGF0YXNldFtndWFyZEtleV0pIHJldHVybjtcbiAgY29udGFpbmVyRWwuZGF0YXNldFtndWFyZEtleV0gPSAnMSc7XG5cbiAgY29udGFpbmVyRWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQpID0+IHtcbiAgICBjb25zdCB0b2dnbGUgPSBldmVudC50YXJnZXQuY2xvc2VzdCgnW2RhdGEtdG9nZ2xlLXJlYXNvbmluZ10nKTtcbiAgICBpZiAoIXRvZ2dsZSkgcmV0dXJuO1xuICAgIGNvbnN0IGlkID0gdG9nZ2xlLmRhdGFzZXQudG9nZ2xlUmVhc29uaW5nO1xuICAgIGNvbnN0IHJlYXNvbkVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7aWRQcmVmaXh9LXJlYXNvbi0ke2lkfWApO1xuICAgIGlmIChyZWFzb25FbCkge1xuICAgICAgY29uc3Qgbm93VmlzaWJsZSA9IHJlYXNvbkVsLnN0eWxlLmRpc3BsYXkgPT09ICdub25lJztcbiAgICAgIHJlYXNvbkVsLnN0eWxlLmRpc3BsYXkgPSBub3dWaXNpYmxlID8gJ2Jsb2NrJyA6ICdub25lJztcbiAgICAgIHRvZ2dsZS5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCBTdHJpbmcobm93VmlzaWJsZSkpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGhhbmRsZXJzLm9uVG9nZ2xlUmVhc29uaW5nID09PSAnZnVuY3Rpb24nKSBoYW5kbGVycy5vblRvZ2dsZVJlYXNvbmluZyhpZCk7XG4gIH0pO1xufVxuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvbGxtLWxvZy5qc1xuICogRmV0Y2hlcyByYXcgTExNIGludGVyYWN0aW9uIGxvZyBlbnRyaWVzIGZyb20gL2FwaS9sbG0tbG9nIGFuZCBkaXNwbGF5c1xuICogdGhlbSBpbiB0aGUgQ29udmVyc2F0aW9uIHBhbmVsIGFzIGNvbGxhcHNpYmxlIHRyYW5zY3JpcHQgZW50cmllcy5cbiAqXG4gKiBFYWNoIExMTSBjYWxsIHNob3dzOlxuICogICAtIEhlYWRlcjogdGltZXN0YW1wIGFuZCBtZXNzYWdlLWNvdW50IHN1bW1hcnlcbiAqICAgLSBQcm9tcHQgc2VjdGlvbjogYWxsIG1lc3NhZ2VzIHNlbnQgKHJvbGUtcHJlZml4ZWQpLCBjb2xsYXBzaWJsZSB3aGVuIGxvbmdcbiAqICAgLSBSZXNwb25zZSBzZWN0aW9uOiByYXcgTExNIHJlc3BvbnNlLCBjb2xsYXBzaWJsZSB3aGVuIGxvbmdcbiAqXG4gKiBERVBFTkRFTkNJRVMgKGdsb2JhbFRoaXMpOlxuICogICAtIGFwcGVuZE1lc3NhZ2VIdG1sICAobWVzc2FnZS1xdWV1ZS5qcylcbiAqICAgLSBnZXRTZXNzaW9uSWRGcm9tVVJMIChhcGktY2xpZW50LmpzKVxuICovXG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IGVzY2FwZUh0bWwgfSBmcm9tICcuL3V0aWxzLmpzJztcbmltcG9ydCB7IGdldFNlc3Npb25JZEZyb21VUkwgfSBmcm9tICcuL2FwaS1jbGllbnQuanMnO1xuXG5jb25zdCBsb2cgPSBnZXRMb2dnZXIoJ2xsbS1sb2cnKTtcblxuLy8gQ3Vyc29yIHRyYWNrcyB0aGUgbmV4dCBpbmRleCB0byBmZXRjaCBmcm9tIC9hcGkvbGxtLWxvZy5cbi8vIEluY3JlbWVudCBhZnRlciBlYWNoIHN1Y2Nlc3NmdWwgZmV0Y2ggYnkgYHRvdGFsYCByZXR1cm5lZCBmcm9tIHRoZSBzZXJ2ZXIuXG5sZXQgX2xsbUxvZ0N1cnNvciA9IDA7XG5cbi8qKiBSZXNldCB0aGUgY3Vyc29yIHRvIDAgKGNhbGwgd2hlbiBhIG5ldyBzZXNzaW9uIGlzIGxvYWRlZCkuICovXG5mdW5jdGlvbiByZXNldExsbUxvZ0N1cnNvcigpIHtcbiAgX2xsbUxvZ0N1cnNvciA9IDA7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ29sbGFwc2libGUgSFRNTCBidWlsZGVyIChtaXJyb3JzIF9tYWtlQ29sbGFwc2libGVDb250ZW50IGluIG1lc3NhZ2UtcXVldWUuanMpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY29uc3QgX0xPR19DT0xMQVBTRV9MSU5FUyA9IDg7XG5jb25zdCBfTE9HX0NPTExBUFNFX0NIQVJTID0gNDgwO1xuXG4vKipcbiAqIFdyYXAgYHRleHRgIGluIGEgY29sbGFwc2libGUgPHByZT4gYmxvY2sgd2hlbiBpdCBleGNlZWRzIHRoZSB0aHJlc2hvbGQuXG4gKiBSZXR1cm5zIGFuIEhUTUwgc3RyaW5nIHJlYWR5IGZvciBpbnNlcnRpb24gdmlhIGlubmVySFRNTC5cbiAqL1xuZnVuY3Rpb24gX2NvbGxhcHNpYmxlUHJlKHRleHQpIHtcbiAgY29uc3QgZXNjYXBlZCA9IGVzY2FwZUh0bWwodGV4dCk7XG4gIGNvbnN0IGxpbmVzICAgPSB0ZXh0LnNwbGl0KCdcXG4nKTtcblxuICBpZiAobGluZXMubGVuZ3RoIDw9IF9MT0dfQ09MTEFQU0VfTElORVMgJiYgdGV4dC5sZW5ndGggPD0gX0xPR19DT0xMQVBTRV9DSEFSUykge1xuICAgIHJldHVybiBgPHByZSBjbGFzcz1cImxsbS1sb2ctdGV4dFwiPiR7ZXNjYXBlZH08L3ByZT5gO1xuICB9XG5cbiAgY29uc3QgcHJldmlld1RleHQgPSBsaW5lcy5zbGljZSgwLCBfTE9HX0NPTExBUFNFX0xJTkVTKS5qb2luKCdcXG4nKTtcbiAgY29uc3Qgb3ZlcmZsb3cgICAgPSBsaW5lcy5sZW5ndGggLSBfTE9HX0NPTExBUFNFX0xJTkVTO1xuICBjb25zdCBpZCAgICAgICAgICA9IGBsbG1sb2ctJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDcpfWA7XG4gIGNvbnN0IGxhYmVsICAgICAgID0gYFNob3cgJHtvdmVyZmxvd30gbW9yZSBsaW5lJHtvdmVyZmxvdyA9PT0gMSA/ICcnIDogJ3MnfVx1MjAyNmA7XG5cbiAgcmV0dXJuIGBcbiAgICA8cHJlIGNsYXNzPVwibGxtLWxvZy10ZXh0IG1zZy1wcmV2aWV3XCIgaWQ9XCIke2lkfS1wcmV2aWV3XCI+JHtlc2NhcGVIdG1sKHByZXZpZXdUZXh0KX1cdTIwMjY8L3ByZT5cbiAgICA8cHJlIGNsYXNzPVwibGxtLWxvZy10ZXh0IG1zZy1mdWxsXCIgICAgaWQ9XCIke2lkfS1mdWxsXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmVcIj4ke2VzY2FwZWR9PC9wcmU+XG4gICAgPGJ1dHRvbiBjbGFzcz1cIm1zZy10b2dnbGUtYnRuXCIgdHlwZT1cImJ1dHRvblwiXG4gICAgICBvbmNsaWNrPVwiKGZ1bmN0aW9uKGJ0bil7XG4gICAgICAgIHZhciBwPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCcke2lkfS1wcmV2aWV3JyksXG4gICAgICAgICAgICBmPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCcke2lkfS1mdWxsJyk7XG4gICAgICAgIGlmKGYuc3R5bGUuZGlzcGxheT09PSdub25lJyl7XG4gICAgICAgICAgcC5zdHlsZS5kaXNwbGF5PSdub25lJzsgZi5zdHlsZS5kaXNwbGF5PSdibG9jayc7IGJ0bi50ZXh0Q29udGVudD0nU2hvdyBsZXNzJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwLnN0eWxlLmRpc3BsYXk9Jyc7IGYuc3R5bGUuZGlzcGxheT0nbm9uZSc7IGJ0bi50ZXh0Q29udGVudD0nJHtsYWJlbH0nO1xuICAgICAgICB9XG4gICAgICB9KSh0aGlzKVwiPiR7bGFiZWx9PC9idXR0b24+YDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBSZW5kZXIgb25lIGludGVyYWN0aW9uIGludG8gdGhlIGNvbnZlcnNhdGlvbiBwYW5lbFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIF9yZW5kZXJJbnRlcmFjdGlvbihpeCkge1xuICBjb25zdCBjb252ZXJzYXRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udmVyc2F0aW9uJyk7XG4gIGlmICghY29udmVyc2F0aW9uKSByZXR1cm47XG5cbiAgY29uc3QgdHMgPSBpeC50aW1lc3RhbXBcbiAgICA/IG5ldyBEYXRlKGl4LnRpbWVzdGFtcCkudG9Mb2NhbGVUaW1lU3RyaW5nKFtdLCB7IGhvdXI6ICcyLWRpZ2l0JywgbWludXRlOiAnMi1kaWdpdCcsIHNlY29uZDogJzItZGlnaXQnIH0pXG4gICAgOiAnJztcblxuICBjb25zdCBtc2dzICAgICA9IEFycmF5LmlzQXJyYXkoaXgubWVzc2FnZXMpID8gaXgubWVzc2FnZXMgOiBbXTtcbiAgY29uc3QgbXNnQ291bnQgPSBtc2dzLmxlbmd0aDtcblxuICAvLyBCdWlsZCBmb3JtYXR0ZWQgcHJvbXB0IHRleHQ6IGVhY2ggbWVzc2FnZSBvbiBpdHMgb3duIGxhYmVsbGVkIGJsb2NrXG4gIGNvbnN0IHByb21wdFRleHQgPSBtc2dzXG4gICAgLm1hcChtID0+IGBbJHsobS5yb2xlIHx8ICd1bmtub3duJykudG9VcHBlckNhc2UoKX1dXFxuJHttLmNvbnRlbnQgfHwgJyd9YClcbiAgICAuam9pbignXFxuXFxuXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXFxuXFxuJyk7XG5cbiAgY29uc3QgcmVzcG9uc2VUZXh0ID0gdHlwZW9mIGl4LnJlc3BvbnNlID09PSAnc3RyaW5nJyA/IGl4LnJlc3BvbnNlIDogJyc7XG5cbiAgY29uc3QgaHRtbCA9IGBcbiAgICA8ZGl2IGNsYXNzPVwibGxtLWxvZy1oZWFkZXJcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwibGxtLWxvZy1pY29uXCI+XHVEODNFXHVERDE2PC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJsbG0tbG9nLWxhYmVsXCI+TExNIEludGVyYWN0aW9uPC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJsbG0tbG9nLW1ldGFcIj4ke21zZ0NvdW50fSBtZXNzYWdlJHttc2dDb3VudCA9PT0gMSA/ICcnIDogJ3MnfTwvc3Bhbj5cbiAgICAgICR7dHMgPyBgPHNwYW4gY2xhc3M9XCJsbG0tbG9nLXRzXCI+JHtlc2NhcGVIdG1sKHRzKX08L3NwYW4+YCA6ICcnfVxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJsbG0tbG9nLXNlY3Rpb25cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJsbG0tbG9nLXNlY3Rpb24tbGFiZWxcIj5Qcm9tcHQ8L2Rpdj5cbiAgICAgICR7X2NvbGxhcHNpYmxlUHJlKHByb21wdFRleHQpfVxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJsbG0tbG9nLXNlY3Rpb25cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJsbG0tbG9nLXNlY3Rpb24tbGFiZWxcIj5SZXNwb25zZTwvZGl2PlxuICAgICAgJHtfY29sbGFwc2libGVQcmUocmVzcG9uc2VUZXh0KX1cbiAgICA8L2Rpdj5gO1xuXG4gIGNvbnN0IG1lc3NhZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgbWVzc2FnZS5jbGFzc05hbWUgPSAnbWVzc2FnZSBsbG0tcmF3JztcbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBjb250ZW50LmNsYXNzTmFtZSA9ICdjb250ZW50JztcbiAgY29udGVudC5pbm5lckhUTUwgPSBodG1sO1xuICBtZXNzYWdlLmFwcGVuZENoaWxkKGNvbnRlbnQpO1xuICBjb252ZXJzYXRpb24uYXBwZW5kQ2hpbGQobWVzc2FnZSk7XG4gIGNvbnZlcnNhdGlvbi5zY3JvbGxUb3AgPSBjb252ZXJzYXRpb24uc2Nyb2xsSGVpZ2h0O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFB1YmxpYyBBUElcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIEZldGNoIExMTSBpbnRlcmFjdGlvbiBsb2cgZW50cmllcyBhZGRlZCBzaW5jZSB0aGUgbGFzdCBjYWxsIGFuZCBkaXNwbGF5XG4gKiBlYWNoIG9uZSBpbiB0aGUgQ29udmVyc2F0aW9uIHBhbmVsLiAgU2FmZSB0byBjYWxsIGFmdGVyIGV2ZXJ5IGJhY2tlbmRcbiAqIG9wZXJhdGlvbiB0aGF0IG1heSB0cmlnZ2VyIExMTSBjYWxscy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZmV0Y2hBbmREaXNwbGF5TGxtTG9nKCkge1xuICBjb25zdCBzZXNzaW9uSWQgPSBnZXRTZXNzaW9uSWRGcm9tVVJMKCk7XG4gIGlmICghc2Vzc2lvbklkKSByZXR1cm47XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChcbiAgICAgIGAvYXBpL2xsbS1sb2c/c2Vzc2lvbl9pZD0ke2VuY29kZVVSSUNvbXBvbmVudChzZXNzaW9uSWQpfSZzaW5jZT0ke19sbG1Mb2dDdXJzb3J9YCxcbiAgICApO1xuICAgIGlmICghcmVzLm9rKSB7XG4gICAgICBsb2cud2FybignbGxtLWxvZyBmZXRjaCBmYWlsZWQnLCByZXMuc3RhdHVzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZGF0YSAgICAgICAgID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBjb25zdCBpbnRlcmFjdGlvbnMgPSBBcnJheS5pc0FycmF5KGRhdGEuaW50ZXJhY3Rpb25zKSA/IGRhdGEuaW50ZXJhY3Rpb25zIDogW107XG5cbiAgICBmb3IgKGNvbnN0IGl4IG9mIGludGVyYWN0aW9ucykge1xuICAgICAgX3JlbmRlckludGVyYWN0aW9uKGl4KTtcbiAgICB9XG5cbiAgICAvLyBBZHZhbmNlIGN1cnNvciB0byB0aGUgbmV3IHRvdGFsIHNvIHRoZSBuZXh0IGNhbGwgZmV0Y2hlcyBvbmx5IG5ldyBlbnRyaWVzLlxuICAgIGlmICh0eXBlb2YgZGF0YS50b3RhbCA9PT0gJ251bWJlcicpIHtcbiAgICAgIF9sbG1Mb2dDdXJzb3IgPSBkYXRhLnRvdGFsO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLmVycm9yKCdmZXRjaEFuZERpc3BsYXlMbG1Mb2cgZXJyb3I6JywgZXJyKTtcbiAgfVxufVxuXG5leHBvcnQgeyBmZXRjaEFuZERpc3BsYXlMbG1Mb2csIHJlc2V0TGxtTG9nQ3Vyc29yIH07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9hdXRoLXByb3ZpZGVyLmpzXG4gKiBDb3BpbG90IC8gR2l0SHViIE9BdXRoIGF1dGggZmxvdywgYmFkZ2UgdXBkYXRlcywgYW5kIHByb3ZpZGVyIGxhYmVsIGZvcm1hdHRpbmcuXG4gKlxuICogREVQRU5ERU5DSUVTOlxuICogICAtIGNvbmZpcm1EaWFsb2cgZnJvbSB1aS1jb3JlLmpzIChvbiBnbG9iYWxUaGlzKVxuICogICAtIHNldEluaXRpYWxGb2N1cywgdHJhcEZvY3VzLCByZXN0b3JlRm9jdXMgZnJvbSB1aS1jb3JlLmpzIChvbiBnbG9iYWxUaGlzKVxuICogICAtIHVwZGF0ZUF1dGhCYWRnZSAoc2VsZi1yZWZlcmVuY2U7IGV4cG9ydGVkIHRvIGdsb2JhbFRoaXMpXG4gKiAgIC0gZ2V0UHJvdmlkZXJJbmZvIGZyb20gcHJvdmlkZXItaW5mby5qcyAoaW1wb3J0ZWQgZGlyZWN0bHkpXG4gKi9cblxuaW1wb3J0IHsgZ2V0UHJvdmlkZXJJbmZvIH0gZnJvbSAnLi9wcm92aWRlci1pbmZvLmpzJztcblxubGV0IF9hdXRoUG9sbFRpbWVyID0gbnVsbDtcblxuZnVuY3Rpb24gZm9ybWF0UHJvdmlkZXJMYWJlbChwcm92aWRlcikge1xuICBpZiAoIXByb3ZpZGVyIHx8IHR5cGVvZiBwcm92aWRlciAhPT0gJ3N0cmluZycpIHJldHVybiAnUHJvdmlkZXInO1xuICBjb25zdCBhbGlhc2VzID0ge1xuICAgIG9wZW5haTogJ09wZW5BSScsXG4gICAgJ2NvcGlsb3Qtb2F1dGgnOiAnQ29waWxvdCBPQXV0aCAoZGVwcmVjYXRlZCknLFxuICAgIGNvcGlsb3Q6ICdDb3BpbG90IChkZXByZWNhdGVkKScsXG4gICAgZ2l0aHViOiAnR2l0SHViIE1vZGVscyAoZGVwcmVjYXRlZCknLFxuICAgICdjb3BpbG90LXNkayc6ICdDb3BpbG90IFNESyAocmVjb21tZW5kZWQpJyxcbiAgfTtcbiAgaWYgKGFsaWFzZXNbcHJvdmlkZXJdKSByZXR1cm4gYWxpYXNlc1twcm92aWRlcl07XG4gIHJldHVybiBwcm92aWRlclxuICAgIC5zcGxpdCgvWy1fXFxzXSsvKVxuICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAubWFwKHBhcnQgPT4gcGFydC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHBhcnQuc2xpY2UoMSkudG9Mb3dlckNhc2UoKSlcbiAgICAuam9pbignICcpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVBdXRoQmFkZ2UoYXV0aFN0YXR1cywgcHJvdmlkZXIgPSBudWxsKSB7XG4gIGNvbnN0IGxlZ2FjeUJhZGdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvcGlsb3QtYXV0aC1iYWRnZScpO1xuICBjb25zdCBsZWdhY3lJY29uICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdXRoLWJhZGdlLWljb24nKTtcbiAgY29uc3QgbGVnYWN5TGFiZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXV0aC1iYWRnZS1sYWJlbCcpO1xuXG4gIGNvbnN0IHBpbGwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtLXN0YXR1cy1waWxsJyk7XG4gIGNvbnN0IHBpbGxJY29uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbS1zdGF0dXMtaWNvbicpO1xuICBjb25zdCBwaWxsTGFiZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtLXN0YXR1cy1sYWJlbCcpO1xuXG4gIGNvbnN0IGFwcGx5U3RhdGUgPSAoa2luZCwgdGV4dCwgaWNvblRleHQpID0+IHtcbiAgICBpZiAobGVnYWN5QmFkZ2UgJiYgbGVnYWN5SWNvbiAmJiBsZWdhY3lMYWJlbCkge1xuICAgICAgbGVnYWN5QmFkZ2UuY2xhc3NMaXN0LnJlbW92ZSgnYXV0aGVudGljYXRlZCcsICd1bmF1dGhlbnRpY2F0ZWQnLCAncG9sbGluZycpO1xuICAgICAgbGVnYWN5QmFkZ2UuY2xhc3NMaXN0LmFkZChraW5kKTtcbiAgICAgIGlmIChraW5kID09PSAnY29ubmVjdGVkJyB8fCBraW5kID09PSAnY29uZmlndXJlZCcpIGxlZ2FjeUJhZGdlLmNsYXNzTGlzdC5hZGQoJ2F1dGhlbnRpY2F0ZWQnKTtcbiAgICAgIGlmIChraW5kID09PSAnY29ubmVjdGluZycpIGxlZ2FjeUJhZGdlLmNsYXNzTGlzdC5hZGQoJ3BvbGxpbmcnKTtcbiAgICAgIGlmIChraW5kID09PSAndW5jb25maWd1cmVkJyB8fCBraW5kID09PSAnYXV0aC1yZXF1aXJlZCcgfHwga2luZCA9PT0gJ3JhdGUtbGltaXRlZCcgfHwga2luZCA9PT0gJ3VuYXZhaWxhYmxlJyB8fCBraW5kID09PSAnZXJyb3InKSBsZWdhY3lCYWRnZS5jbGFzc0xpc3QuYWRkKCd1bmF1dGhlbnRpY2F0ZWQnKTtcbiAgICAgIGxlZ2FjeUljb24udGV4dENvbnRlbnQgPSBpY29uVGV4dDtcbiAgICAgIGxlZ2FjeUxhYmVsLnRleHRDb250ZW50ID0gdGV4dDtcbiAgICB9XG4gICAgaWYgKHBpbGwgJiYgcGlsbEljb24gJiYgcGlsbExhYmVsKSB7XG4gICAgICBwaWxsLmNsYXNzTGlzdC5yZW1vdmUoJ2F1dGhlbnRpY2F0ZWQnLCAndW5hdXRoZW50aWNhdGVkJywgJ3BvbGxpbmcnLCAndW5jb25maWd1cmVkJywgJ2NvbmZpZ3VyZWQnLCAnY29ubmVjdGluZycsICdjb25uZWN0ZWQnLCAnYXV0aC1yZXF1aXJlZCcsICdyYXRlLWxpbWl0ZWQnLCAndW5hdmFpbGFibGUnLCAnZXJyb3InKTtcbiAgICAgIHBpbGwuY2xhc3NMaXN0LmFkZChraW5kKTtcbiAgICAgIGlmIChraW5kID09PSAnY29ubmVjdGVkJyB8fCBraW5kID09PSAnY29uZmlndXJlZCcpIHBpbGwuY2xhc3NMaXN0LmFkZCgnYXV0aGVudGljYXRlZCcpO1xuICAgICAgaWYgKGtpbmQgPT09ICdjb25uZWN0aW5nJykgcGlsbC5jbGFzc0xpc3QuYWRkKCdwb2xsaW5nJyk7XG4gICAgICBpZiAoa2luZCA9PT0gJ3VuY29uZmlndXJlZCcgfHwga2luZCA9PT0gJ2F1dGgtcmVxdWlyZWQnIHx8IGtpbmQgPT09ICdyYXRlLWxpbWl0ZWQnIHx8IGtpbmQgPT09ICd1bmF2YWlsYWJsZScgfHwga2luZCA9PT0gJ2Vycm9yJykgcGlsbC5jbGFzc0xpc3QuYWRkKCd1bmF1dGhlbnRpY2F0ZWQnKTtcbiAgICAgIHBpbGxJY29uLnRleHRDb250ZW50ID0gaWNvblRleHQ7XG4gICAgICBwaWxsTGFiZWwudGV4dENvbnRlbnQgPSB0ZXh0O1xuICAgICAgY29uc3QgdG9vbHRpcE1hcCA9IHtcbiAgICAgICAgdW5jb25maWd1cmVkOiAnTm8gcHJvdmlkZXIvbW9kZWwgaXMgY29uZmlndXJlZCB5ZXQuJyxcbiAgICAgICAgY29uZmlndXJlZDogJ1Byb3ZpZGVyL21vZGVsIGlzIGNvbmZpZ3VyZWQuIENvbm5lY3Rpdml0eSBub3QgeWV0IHZlcmlmaWVkLicsXG4gICAgICAgIGNvbm5lY3Rpbmc6ICdUZXN0aW5nIG9yIGNvbm5lY3RpbmcgdG8gdGhlIHNlbGVjdGVkIHByb3ZpZGVyLicsXG4gICAgICAgIGNvbm5lY3RlZDogJ1Byb3ZpZGVyIHJlc3BvbmRlZCBzdWNjZXNzZnVsbHkgdG8gYSBsaXZlIHJlcXVlc3QuJyxcbiAgICAgICAgJ2F1dGgtcmVxdWlyZWQnOiAnQXV0aGVudGljYXRpb24gaXMgcmVxdWlyZWQuIENoZWNrIEFQSSBrZXkgb3Igc2lnbiBpbi4nLFxuICAgICAgICAncmF0ZS1saW1pdGVkJzogJ1JhdGUgbGltaXQgcmVhY2hlZC4gV2FpdCBiZWZvcmUgcmV0cnlpbmcgcmVxdWVzdHMuJyxcbiAgICAgICAgdW5hdmFpbGFibGU6ICdQcm92aWRlciBpcyB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZSBvciB1bnJlYWNoYWJsZS4nLFxuICAgICAgICBlcnJvcjogJ0Nvbm5lY3Rpb24gZmFpbGVkLiBPcGVuIG1vZGVsIHNldHRpbmdzIGZvciBkZXRhaWxzLicsXG4gICAgICB9O1xuICAgICAgY29uc3QgdGlwID0gdG9vbHRpcE1hcFtraW5kXSB8fCAnJztcbiAgICAgIHBpbGwudGl0bGUgPSB0aXA7XG4gICAgICBwaWxsSWNvbi50aXRsZSA9IHRpcDtcbiAgICAgIHBpbGxMYWJlbC50aXRsZSA9IHRpcDtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgYWN0aXZlUHJvdmlkZXIgPSBwcm92aWRlciB8fCB3aW5kb3cuY3VycmVudFByb3ZpZGVyIHx8IG51bGw7XG4gIGNvbnN0IGlzQ29waWxvdE9BdXRoID0gYWN0aXZlUHJvdmlkZXIgPT09ICdjb3BpbG90LW9hdXRoJztcblxuICAvLyBOb24tY29uZmlkZW50aWFsIGJhZGdlOiBzaG93IHVubGVzcyB0aGUgcHJvdmlkZXIgZXhwbGljaXRseSBtYXJrcyBjb25maWRlbnRpYWw6dHJ1ZS5cbiAgLy8gRGVmYXVsdCBpcyBub24tY29uZmlkZW50aWFsIChmYWlsLXNhZmUgXHUyMDE0IG1vc3QgcHJvdmlkZXJzIHJldGFpbi9yZXZpZXcgQVBJIGRhdGEpLlxuICBjb25zdCBuY0JhZGdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbS1ub24tY29uZmlkZW50aWFsLWJhZGdlJyk7XG4gIGlmIChuY0JhZGdlICYmIGFjdGl2ZVByb3ZpZGVyKSB7XG4gICAgY29uc3QgaW5mbyA9IGdldFByb3ZpZGVySW5mbyhhY3RpdmVQcm92aWRlcik7XG4gICAgbmNCYWRnZS5zdHlsZS5kaXNwbGF5ID0gKGluZm8gJiYgaW5mby5jb25maWRlbnRpYWwgIT09IHRydWUpID8gJycgOiAnbm9uZSc7XG4gIH1cblxuICBpZiAoYWN0aXZlUHJvdmlkZXIgJiYgIWlzQ29waWxvdE9BdXRoKSB7XG4gICAgYXBwbHlTdGF0ZSgnY29uZmlndXJlZCcsIGAke2Zvcm1hdFByb3ZpZGVyTGFiZWwoYWN0aXZlUHJvdmlkZXIpfSBjb25maWd1cmVkYCwgJ1x1MjVENCcpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChhdXRoU3RhdHVzLmF1dGhlbnRpY2F0ZWQpIHtcbiAgICBhcHBseVN0YXRlKCdjb25uZWN0ZWQnLCAnQ29waWxvdCByZWFkeScsICdcdTI3MTMnKTtcbiAgfSBlbHNlIGlmIChhdXRoU3RhdHVzLnBvbGxpbmcpIHtcbiAgICBhcHBseVN0YXRlKCdjb25uZWN0aW5nJywgJ1dhaXRpbmcgZm9yIGFwcHJvdmFsXHUyMDI2JywgJ1x1MjlENycpO1xuICB9IGVsc2Uge1xuICAgIGFwcGx5U3RhdGUoJ2F1dGgtcmVxdWlyZWQnLCAnTm90IGF1dGhlbnRpY2F0ZWQnLCAnXHVEODNEXHVERDExJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2xvc2VDb3BpbG90QXV0aE1vZGFsKCkge1xuICBpZiAoX2F1dGhQb2xsVGltZXIpIHsgY2xlYXJJbnRlcnZhbChfYXV0aFBvbGxUaW1lcik7IF9hdXRoUG9sbFRpbWVyID0gbnVsbDsgfVxuICBpZiAodHlwZW9mIGNsb3NlTW9kZWxNb2RhbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNsb3NlTW9kZWxNb2RhbCgpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBsZWdhY3lPdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F1dGgtbW9kYWwtb3ZlcmxheScpO1xuICBpZiAobGVnYWN5T3ZlcmxheSkgbGVnYWN5T3ZlcmxheS5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJyk7XG4gIGlmICh0eXBlb2YgcmVzdG9yZUZvY3VzID09PSAnZnVuY3Rpb24nKSByZXN0b3JlRm9jdXMoKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEVTIG1vZHVsZSBleHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuZXhwb3J0IHtcbiAgZm9ybWF0UHJvdmlkZXJMYWJlbCwgdXBkYXRlQXV0aEJhZGdlLFxuICBjbG9zZUNvcGlsb3RBdXRoTW9kYWwsXG59O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiBhdHMtbW9kYWxzLmpzXG4gKiBBVFMgUmVwb3J0IGFuZCBKb2IgQW5hbHlzaXMgbW9kYWwgZGlhbG9ncyArIEFUUyBTY29yZSB0YWIgcmVuZGVyZXIuXG4gKlxuICogREVQRU5ERU5DSUVTOlxuICogLSBzdGF0ZS1tYW5hZ2VyLmpzIGZvciBwZXJzaXN0ZWQgQVRTIHNjb3JlICsgYW5hbHlzaXMgZGF0YVxuICogLSB1dGlscy5qcyBmb3IgSFRNTCBlc2NhcGluZ1xuICogLSBhdHMtcmVmaW5lbWVudC5qcyBmb3IgQVRTIGZldGNoL2JhZGdlIHVwZGF0ZXNcbiAqIC0gaW5kZXguaHRtbCBtb2RhbCBvdmVybGF5czogI2F0cy1yZXBvcnQtbW9kYWwtb3ZlcmxheSwgI2pvYi1hbmFseXNpcy1tb2RhbC1vdmVybGF5XG4gKi9cblxuaW1wb3J0IHsgcmVmcmVzaEF0c1Njb3JlLCB1cGRhdGVBdHNCYWRnZSB9IGZyb20gJy4vYXRzLXJlZmluZW1lbnQuanMnO1xuaW1wb3J0IHsgc3RhdGVNYW5hZ2VyIH0gZnJvbSAnLi9zdGF0ZS1tYW5hZ2VyLmpzJztcbmltcG9ydCB7IGVzY2FwZUh0bWwgfSBmcm9tICcuL3V0aWxzLmpzJztcbmltcG9ydCB7IHRyYXBGb2N1cywgcmVzdG9yZUZvY3VzLCBwdXNoRm9jdXNTdGFjayB9IGZyb20gJy4vdWktY29yZS5qcyc7XG5cbmxldCBfYXRzU3lub255bU1hcENhY2hlID0gbnVsbDtcblxuYXN5bmMgZnVuY3Rpb24gX2xvYWRBdHNTeW5vbnltTWFwKCkge1xuICBpZiAoX2F0c1N5bm9ueW1NYXBDYWNoZSkgcmV0dXJuIF9hdHNTeW5vbnltTWFwQ2FjaGU7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2Vzc2lvbklkID0gc3RhdGVNYW5hZ2VyPy5nZXRTZXNzaW9uSWQ/LigpO1xuICAgIGNvbnN0IHVybCA9IHNlc3Npb25JZCA/IGAvYXBpL3N5bm9ueW0tbWFwP3Nlc3Npb25faWQ9JHtlbmNvZGVVUklDb21wb25lbnQoc2Vzc2lvbklkKX1gIDogJy9hcGkvc3lub255bS1tYXAnO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgaWYgKCFyZXMub2spIHJldHVybiAoX2F0c1N5bm9ueW1NYXBDYWNoZSA9IHt9KTtcbiAgICBjb25zdCByYXcgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGNvbnN0IGFsaWFzVG9DYW5vbiA9IHt9O1xuICAgIGNvbnN0IGNhbm9uVG9BbGlhc2VzID0ge307XG4gICAgT2JqZWN0LmVudHJpZXMocmF3KS5mb3JFYWNoKChbYWxpYXMsIGNhbm9uXSkgPT4ge1xuICAgICAgYWxpYXNUb0Nhbm9uW2FsaWFzLnRvTG93ZXJDYXNlKCldID0gY2Fub247XG4gICAgICBjb25zdCBjbCA9IGNhbm9uLnRvTG93ZXJDYXNlKCk7XG4gICAgICAoY2Fub25Ub0FsaWFzZXNbY2xdID0gY2Fub25Ub0FsaWFzZXNbY2xdIHx8IFtdKS5wdXNoKGFsaWFzKTtcbiAgICB9KTtcbiAgICBfYXRzU3lub255bU1hcENhY2hlID0geyBhbGlhc1RvQ2Fub24sIGNhbm9uVG9BbGlhc2VzIH07XG4gIH0gY2F0Y2ggKF8pIHsgX2F0c1N5bm9ueW1NYXBDYWNoZSA9IHt9OyB9XG4gIHJldHVybiBfYXRzU3lub255bU1hcENhY2hlO1xufVxuXG5mdW5jdGlvbiBfa3dTeW5Bbm5vdGF0aW9uKGt3LCBzeW5NYXApIHtcbiAgaWYgKCFzeW5NYXAgfHwgKCFzeW5NYXAuYWxpYXNUb0Nhbm9uICYmICFzeW5NYXAuY2Fub25Ub0FsaWFzZXMpKSByZXR1cm4gJyc7XG4gIGNvbnN0IGtsID0gKGt3IHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICBpZiAoc3luTWFwLmFsaWFzVG9DYW5vbiAmJiBzeW5NYXAuYWxpYXNUb0Nhbm9uW2tsXSkgcmV0dXJuIGA9ICR7c3luTWFwLmFsaWFzVG9DYW5vbltrbF19YDtcbiAgY29uc3QgYWxpYXNlcyA9IHN5bk1hcC5jYW5vblRvQWxpYXNlcyAmJiBzeW5NYXAuY2Fub25Ub0FsaWFzZXNba2xdO1xuICBpZiAoYWxpYXNlcyAmJiBhbGlhc2VzLmxlbmd0aCkgcmV0dXJuIGBhbHNvOiAke2FsaWFzZXMuam9pbignLCAnKX1gO1xuICByZXR1cm4gJyc7XG59XG5cbmNvbnN0IEFUU19HUk9VUFMgPSBbXG4gIFsnaGFyZCcsICdIYXJkIFJlcXVpcmVtZW50cyddLFxuICBbJ3NvZnQnLCAnUHJlZmVycmVkIFNraWxscyddLFxuICBbJ2JvbnVzJywgJ1x1MjYwNSBCb251cyBLZXl3b3JkcyddLFxuXTtcblxuZnVuY3Rpb24gX2tleXdvcmRTdGF0dXMoa2V5d29yZCkge1xuICByZXR1cm4ga2V5d29yZD8uc3RhdHVzIHx8IChrZXl3b3JkPy5mb3VuZCA/ICdtYXRjaGVkJyA6ICdtaXNzaW5nJyk7XG59XG5cbmZ1bmN0aW9uIF9rZXl3b3JkVHlwZShrZXl3b3JkKSB7XG4gIHJldHVybiBrZXl3b3JkPy50eXBlIHx8ICdvdGhlcic7XG59XG5cbmZ1bmN0aW9uIF9pc0V4YWN0TWF0Y2goa2V5d29yZCkge1xuICByZXR1cm4gX2tleXdvcmRTdGF0dXMoa2V5d29yZCkgPT09ICdtYXRjaGVkJyAmJiBrZXl3b3JkPy5tYXRjaF90eXBlICE9PSAncGFydGlhbCc7XG59XG5cbmZ1bmN0aW9uIF9pc1BhcnRpYWxNYXRjaChrZXl3b3JkKSB7XG4gIHJldHVybiBfa2V5d29yZFN0YXR1cyhrZXl3b3JkKSA9PT0gJ3BhcnRpYWwnIHx8IGtleXdvcmQ/Lm1hdGNoX3R5cGUgPT09ICdwYXJ0aWFsJztcbn1cblxuZnVuY3Rpb24gX2tleXdvcmRTb3J0VmFsdWUoa2V5d29yZCkge1xuICBpZiAoX2tleXdvcmRTdGF0dXMoa2V5d29yZCkgPT09ICdtaXNzaW5nJykgcmV0dXJuIDA7XG4gIGlmIChfaXNQYXJ0aWFsTWF0Y2goa2V5d29yZCkpIHJldHVybiAxO1xuICByZXR1cm4gMjtcbn1cblxuZnVuY3Rpb24gX2tleXdvcmRTdGF0dXNCYWRnZShrZXl3b3JkKSB7XG4gIGlmIChfa2V5d29yZFN0YXR1cyhrZXl3b3JkKSA9PT0gJ21pc3NpbmcnKSB7XG4gICAgcmV0dXJuICc8c3BhbiBzdHlsZT1cImRpc3BsYXk6aW5saW5lLWJsb2NrO3BhZGRpbmc6MnB4IDhweDtib3JkZXItcmFkaXVzOjk5OXB4O2JhY2tncm91bmQ6I2ZlZTJlMjtjb2xvcjojOTkxYjFiO2ZvbnQtc2l6ZTowLjhlbTtmb250LXdlaWdodDo2MDA7XCI+XHUyNzRDIE1pc3Npbmc8L3NwYW4+JztcbiAgfVxuICBpZiAoX2lzUGFydGlhbE1hdGNoKGtleXdvcmQpKSB7XG4gICAgcmV0dXJuICc8c3BhbiBzdHlsZT1cImRpc3BsYXk6aW5saW5lLWJsb2NrO3BhZGRpbmc6MnB4IDhweDtib3JkZXItcmFkaXVzOjk5OXB4O2JhY2tncm91bmQ6I2ZlZjNjNztjb2xvcjojOTI0MDBlO2ZvbnQtc2l6ZTowLjhlbTtmb250LXdlaWdodDo2MDA7XCI+XHUyNkEwIFBhcnRpYWw8L3NwYW4+JztcbiAgfVxuICByZXR1cm4gJzxzcGFuIHN0eWxlPVwiZGlzcGxheTppbmxpbmUtYmxvY2s7cGFkZGluZzoycHggOHB4O2JvcmRlci1yYWRpdXM6OTk5cHg7YmFja2dyb3VuZDojZGNmY2U3O2NvbG9yOiMxNjY1MzQ7Zm9udC1zaXplOjAuOGVtO2ZvbnQtd2VpZ2h0OjYwMDtcIj5cdTI3MDUgTWF0Y2hlZDwvc3Bhbj4nO1xufVxuXG5mdW5jdGlvbiBfcmVuZGVyS2V5d29yZEdyb3VwKHRpdGxlLCBrZXl3b3Jkcywgc3luTWFwKSB7XG4gIGlmIChrZXl3b3Jkcy5sZW5ndGggPT09IDApIHJldHVybiAnJztcblxuICBjb25zdCBleGFjdENvdW50ID0ga2V5d29yZHMuZmlsdGVyKF9pc0V4YWN0TWF0Y2gpLmxlbmd0aDtcbiAgY29uc3QgcGFydGlhbENvdW50ID0ga2V5d29yZHMuZmlsdGVyKF9pc1BhcnRpYWxNYXRjaCkubGVuZ3RoO1xuICBjb25zdCBtaXNzaW5nQ291bnQgPSBrZXl3b3Jkcy5maWx0ZXIoa2V5d29yZCA9PiBfa2V5d29yZFN0YXR1cyhrZXl3b3JkKSA9PT0gJ21pc3NpbmcnKS5sZW5ndGg7XG4gIGNvbnN0IHNvcnRlZCA9IFsuLi5rZXl3b3Jkc10uc29ydCgobGVmdCwgcmlnaHQpID0+IHtcbiAgICBjb25zdCBwcmlvcml0eSA9IF9rZXl3b3JkU29ydFZhbHVlKGxlZnQpIC0gX2tleXdvcmRTb3J0VmFsdWUocmlnaHQpO1xuICAgIGlmIChwcmlvcml0eSAhPT0gMCkgcmV0dXJuIHByaW9yaXR5O1xuICAgIHJldHVybiBTdHJpbmcobGVmdC5rZXl3b3JkIHx8IGxlZnQudGVybSB8fCAnJykubG9jYWxlQ29tcGFyZShTdHJpbmcocmlnaHQua2V5d29yZCB8fCByaWdodC50ZXJtIHx8ICcnKSk7XG4gIH0pO1xuXG4gIHJldHVybiBgXG4gICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6MTZweDtcIj5cbiAgICAgIDxoNCBzdHlsZT1cIm1hcmdpbjowIDAgOHB4O2ZvbnQtc2l6ZToxcmVtO2NvbG9yOiMzMzQxNTU7XCI+JHtlc2NhcGVIdG1sKHRpdGxlKX08L2g0PlxuICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjgyZW07Y29sb3I6IzY0NzQ4YjttYXJnaW4tYm90dG9tOjhweDtcIj4ke2V4YWN0Q291bnR9IGV4YWN0IFx1MjAyMiAke3BhcnRpYWxDb3VudH0gcGFydGlhbCBcdTIwMjIgJHttaXNzaW5nQ291bnR9IG1pc3Npbmc8L2Rpdj5cbiAgICAgIDx0YWJsZSBzdHlsZT1cIndpZHRoOjEwMCU7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlO2ZvbnQtc2l6ZTowLjllbTtcIj5cbiAgICAgICAgPHRoZWFkPlxuICAgICAgICAgIDx0ciBzdHlsZT1cInRleHQtYWxpZ246bGVmdDtjb2xvcjojNjQ3NDhiO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNlMmU4ZjA7XCI+XG4gICAgICAgICAgICA8dGggc3R5bGU9XCJwYWRkaW5nOjZweCA4cHg7XCI+S2V5d29yZDwvdGg+XG4gICAgICAgICAgICA8dGggc3R5bGU9XCJwYWRkaW5nOjZweCA4cHg7XCI+Q292ZXJhZ2U8L3RoPlxuICAgICAgICAgICAgPHRoIHN0eWxlPVwicGFkZGluZzo2cHggOHB4O1wiPlNlY3Rpb25zPC90aD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICA8L3RoZWFkPlxuICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgJHtzb3J0ZWQubWFwKGtleXdvcmQgPT4ge1xuICAgICAgICAgICAgY29uc3Qga3cgPSBrZXl3b3JkLmtleXdvcmQgfHwga2V5d29yZC50ZXJtIHx8ICcnO1xuICAgICAgICAgICAgY29uc3Qgc2VjdGlvbnMgPSBBcnJheS5pc0FycmF5KGtleXdvcmQubWF0Y2hlZF9pbl9zZWN0aW9ucykgJiYga2V5d29yZC5tYXRjaGVkX2luX3NlY3Rpb25zLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgPyBrZXl3b3JkLm1hdGNoZWRfaW5fc2VjdGlvbnMuam9pbignLCAnKVxuICAgICAgICAgICAgICA6ICdOb3QgZm91bmQnO1xuICAgICAgICAgICAgY29uc3Qgc3luQW5ub3QgPSBfa3dTeW5Bbm5vdGF0aW9uKGt3LCBzeW5NYXApO1xuICAgICAgICAgICAgY29uc3Qgc3luSHRtbCA9IHN5bkFubm90XG4gICAgICAgICAgICAgID8gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC43OGVtO2NvbG9yOiM2NDc0OGI7bWFyZ2luLXRvcDoycHg7XCIgdGl0bGU9XCJTeW5vbnltIGdyb3VwaW5nXCI+JHtlc2NhcGVIdG1sKHN5bkFubm90KX08L2Rpdj5gXG4gICAgICAgICAgICAgIDogJyc7XG4gICAgICAgICAgICByZXR1cm4gYFxuICAgICAgICAgICAgICA8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZjFmNWY5O3ZlcnRpY2FsLWFsaWduOnRvcDtcIj5cbiAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOjhweDtcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDo2MDA7Y29sb3I6IzFlMjkzYjtcIj4ke2VzY2FwZUh0bWwoa3cpfTwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjhlbTtjb2xvcjojOTRhM2I4O3RleHQtdHJhbnNmb3JtOmNhcGl0YWxpemU7XCI+JHtlc2NhcGVIdG1sKF9rZXl3b3JkVHlwZShrZXl3b3JkKSl9PC9kaXY+XG4gICAgICAgICAgICAgICAgICAke3N5bkh0bWx9XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOjhweDtcIj4ke19rZXl3b3JkU3RhdHVzQmFkZ2Uoa2V5d29yZCl9PC90ZD5cbiAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOjhweDtjb2xvcjojNDc1NTY5O1wiPiR7ZXNjYXBlSHRtbChzZWN0aW9ucyl9PC90ZD5cbiAgICAgICAgICAgICAgPC90cj5gO1xuICAgICAgICAgIH0pLmpvaW4oJycpfVxuICAgICAgICA8L3Rib2R5PlxuICAgICAgPC90YWJsZT5cbiAgICA8L2Rpdj5gO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEFUUyBSZXBvcnQgTW9kYWxcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIE9wZW4gdGhlIEFUUyBSZXBvcnQgbW9kYWwuIFJlbmRlcnMgdGhlIGNhY2hlZCBBVFMgc2NvcmUgZnJvbSBzdGF0ZSwgb3JcbiAqIGZldGNoZXMgYSBmcmVzaCBzY29yZSBpZiBub25lIGlzIGNhY2hlZC5cbiAqL1xuZnVuY3Rpb24gX2F0c0VzY2FwZUhhbmRsZXIoZSkge1xuICBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSBjbG9zZUF0c1JlcG9ydE1vZGFsKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG9wZW5BdHNSZXBvcnRNb2RhbCgpIHtcbiAgcHVzaEZvY3VzU3RhY2soZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7XG4gIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXRzLXJlcG9ydC1tb2RhbC1vdmVybGF5Jyk7XG4gIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIF9hdHNFc2NhcGVIYW5kbGVyKTtcbiAgLy8gTW92ZSBmb2N1cyB0byB0aGUgQ2xvc2UgYnV0dG9uIGluIHRoZSBtb2RhbCBmb290ZXJcbiAgY29uc3QgY2xvc2VCdG4gPSBvdmVybGF5LnF1ZXJ5U2VsZWN0b3IoJy5tb2RhbC1mb290ZXIgLmFjdGlvbi1idG4nKTtcbiAgaWYgKGNsb3NlQnRuKSBjbG9zZUJ0bi5mb2N1cygpO1xuICB0cmFwRm9jdXMoJ2F0cy1yZXBvcnQtbW9kYWwtb3ZlcmxheScpO1xuICBjb25zdCBib2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F0cy1yZXBvcnQtbW9kYWwtYm9keScpO1xuXG4gIC8vIEEgY2FjaGVkIHNjb3JlIHJlbmRlcnMgaW1tZWRpYXRlbHkgdXNpbmcgd2hhdGV2ZXIgc3lub255bSBtYXAgaXMgYWxyZWFkeVxuICAvLyBjYWNoZWQgKG9yIG5vbmUpIHJhdGhlciB0aGFuIGJsb2NraW5nIG9uIGEgbmV0d29yayByb3VuZC10cmlwIGZvciBpdCBcdTIwMTRcbiAgLy8gdGhlIGFubm90YXRpb25zIGFyZSBhbiBlbnJpY2htZW50LCBub3QgcmVxdWlyZWQgZm9yIF9yZW5kZXJBdHNSZXBvcnQgdG9cbiAgLy8gd29yaywgYW5kIGEgY2FjaGVkLXNjb3JlIG9wZW4gc2hvdWxkIGJlIGluc3RhbnQuXG4gIGNvbnN0IGNhY2hlZCA9IHN0YXRlTWFuYWdlcj8uZ2V0QXRzU2NvcmU/LigpO1xuICBpZiAoY2FjaGVkKSB7XG4gICAgYm9keS5pbm5lckhUTUwgPSBfcmVuZGVyQXRzUmVwb3J0KGNhY2hlZCwgX2F0c1N5bm9ueW1NYXBDYWNoZSB8fCB7fSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYm9keS5pbm5lckhUTUwgPSAnPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjEycHg7cGFkZGluZzoyNHB4O2NvbG9yOiM2YjcyODA7XCI+PGRpdiBjbGFzcz1cImxvYWRpbmctc3Bpbm5lclwiIHN0eWxlPVwid2lkdGg6MjBweDtoZWlnaHQ6MjBweDtib3JkZXItd2lkdGg6MnB4O2ZsZXgtc2hyaW5rOjA7XCI+PC9kaXY+PHNwYW4+RmV0Y2hpbmcgQVRTIHNjb3JlXHUyMDI2PC9zcGFuPjwvZGl2Pic7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2Vzc2lvbklkID0gc3RhdGVNYW5hZ2VyPy5nZXRTZXNzaW9uSWQ/LigpO1xuICAgIGNvbnN0IFtzeW5NYXAsIHJlc10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBfbG9hZEF0c1N5bm9ueW1NYXAoKSxcbiAgICAgIGZldGNoKCcvYXBpL2N2L2F0cy1zY29yZScsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHNlc3Npb25faWQ6IHNlc3Npb25JZCwgYmFzaXM6ICdyZXZpZXdfY2hlY2twb2ludCcgfSksXG4gICAgICB9KSxcbiAgICBdKTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vayAmJiBkYXRhLmF0c19zY29yZSkge1xuICAgICAgc3RhdGVNYW5hZ2VyPy5zZXRBdHNTY29yZT8uKGRhdGEuYXRzX3Njb3JlKTtcbiAgICAgIHVwZGF0ZUF0c0JhZGdlKGRhdGEuYXRzX3Njb3JlKTtcbiAgICAgIGJvZHkuaW5uZXJIVE1MID0gX3JlbmRlckF0c1JlcG9ydChkYXRhLmF0c19zY29yZSwgc3luTWFwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYm9keS5pbm5lckhUTUwgPSBgPHAgc3R5bGU9XCJwYWRkaW5nOjI0cHg7Y29sb3I6I2VmNDQ0NDtcIj5Db3VsZCBub3QgbG9hZCBBVFMgcmVwb3J0OiAke2VzY2FwZUh0bWwoZGF0YS5lcnJvciB8fCAndW5rbm93biBlcnJvcicpfTwvcD5gO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGJvZHkuaW5uZXJIVE1MID0gYDxwIHN0eWxlPVwicGFkZGluZzoyNHB4O2NvbG9yOiNlZjQ0NDQ7XCI+RXJyb3I6ICR7ZXNjYXBlSHRtbChlLm1lc3NhZ2UpfTwvcD5gO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNsb3NlQXRzUmVwb3J0TW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdHMtcmVwb3J0LW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgX2F0c0VzY2FwZUhhbmRsZXIpO1xuICByZXN0b3JlRm9jdXMoKTtcbn1cblxuLyoqXG4gKiBSZW5kZXIgYW4gQVRTIHNjb3JlIG9iamVjdCBpbnRvIEhUTUwgZm9yIHRoZSBtb2RhbCBib2R5LlxuICovXG5mdW5jdGlvbiBfcmVuZGVyQXRzUmVwb3J0KHNjb3JlLCBzeW5NYXApIHtcbiAgY29uc3Qgb3ZlcmFsbCA9IE1hdGgucm91bmQoc2NvcmUub3ZlcmFsbCA/PyAwKTtcbiAgY29uc3QgaGFyZCA9IE1hdGgucm91bmQoc2NvcmUuaGFyZF9yZXF1aXJlbWVudF9zY29yZSA/PyAwKTtcbiAgY29uc3Qgc29mdCA9IE1hdGgucm91bmQoc2NvcmUuc29mdF9yZXF1aXJlbWVudF9zY29yZSA/PyAwKTtcblxuICBjb25zdCBzY29yZUNvbG9yID0gb3ZlcmFsbCA+PSA3NSA/ICcjMTBiOTgxJyA6IG92ZXJhbGwgPj0gNTAgPyAnI2Y1OWUwYicgOiAnI2VmNDQ0NCc7XG5cbiAgY29uc3Qga2V5d29yZHMgPSBzY29yZS5rZXl3b3JkX3N0YXR1cyB8fCBbXTtcbiAgY29uc3QgbWlzc2luZ0t3ID0ga2V5d29yZHMuZmlsdGVyKGtleXdvcmQgPT4gX2tleXdvcmRTdGF0dXMoa2V5d29yZCkgPT09ICdtaXNzaW5nJyk7XG4gIGNvbnN0IG1pc3NpbmdIYXJkID0gbWlzc2luZ0t3LmZpbHRlcihrZXl3b3JkID0+IF9rZXl3b3JkVHlwZShrZXl3b3JkKSA9PT0gJ2hhcmQnKTtcbiAgY29uc3Qga2V5d29yZEdyb3VwcyA9IEFUU19HUk9VUFNcbiAgICAubWFwKChbdHlwZSwgdGl0bGVdKSA9PiBfcmVuZGVyS2V5d29yZEdyb3VwKHRpdGxlLCBrZXl3b3Jkcy5maWx0ZXIoa2V5d29yZCA9PiBfa2V5d29yZFR5cGUoa2V5d29yZCkgPT09IHR5cGUpLCBzeW5NYXApKVxuICAgIC5qb2luKCcnKTtcblxuICBjb25zdCBzZWN0aW9uU2NvcmVzID0gc2NvcmUuc2VjdGlvbl9zY29yZXMgfHwge307XG4gIGNvbnN0IHNlY3RIdG1sID0gT2JqZWN0LmtleXMoc2VjdGlvblNjb3JlcykubGVuZ3RoID09PSAwID8gJycgOiBgXG4gICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6MTZweDtcIj5cbiAgICAgIDxoNCBzdHlsZT1cIm1hcmdpbjowIDAgOHB4O2ZvbnQtc2l6ZToxcmVtO2NvbG9yOiMzMzQxNTU7XCI+U2VjdGlvbiBTY29yZXM8L2g0PlxuICAgICAgPHRhYmxlIHN0eWxlPVwid2lkdGg6MTAwJTtib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7Zm9udC1zaXplOjAuOWVtO1wiPlxuICAgICAgICAke09iamVjdC5lbnRyaWVzKHNlY3Rpb25TY29yZXMpLm1hcCgoW3NlYywgdmFsXSkgPT4gYFxuICAgICAgICAgIDx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206MXB4IHNvbGlkICNmMWY1Zjk7XCI+XG4gICAgICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOjRweCA4cHg7dGV4dC10cmFuc2Zvcm06Y2FwaXRhbGl6ZTtjb2xvcjojNDc1NTY5O1wiPiR7ZXNjYXBlSHRtbChzZWMpfTwvdGQ+XG4gICAgICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOjRweCA4cHg7Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOiMxZTI5M2I7XCI+JHtNYXRoLnJvdW5kKHZhbCl9JTwvdGQ+XG4gICAgICAgICAgPC90cj5gKS5qb2luKCcnKX1cbiAgICAgIDwvdGFibGU+XG4gICAgPC9kaXY+YDtcblxuICByZXR1cm4gYFxuICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nOjIwcHg7XCI+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MjRweDttYXJnaW4tYm90dG9tOjIwcHg7XCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6Mi40ZW07Zm9udC13ZWlnaHQ6NzAwO2NvbG9yOiR7c2NvcmVDb2xvcn07XCI+JHtvdmVyYWxsfSU8L2Rpdj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuOWVtO2NvbG9yOiM0NzU1Njk7XCI+SGFyZCByZXF1aXJlbWVudHM6IDxzdHJvbmc+JHtoYXJkfSU8L3N0cm9uZz48L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuOWVtO2NvbG9yOiM0NzU1Njk7XCI+UHJlZmVycmVkIHNraWxsczogPHN0cm9uZz4ke3NvZnR9JTwvc3Ryb25nPjwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC43NWVtO2NvbG9yOiM5NGEzYjg7bWFyZ2luLXRvcDoycHg7XCI+QmFzaXM6ICR7ZXNjYXBlSHRtbChzY29yZS5iYXNpcyB8fCAncmV2aWV3Jyl9PC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjc1ZW07Y29sb3I6Izk0YTNiODttYXJnaW4tdG9wOjRweDtcIiB0aXRsZT1cIlNjb3JlIHRocmVzaG9sZHNcIj5cbiAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIHN0eWxlPVwiY29sb3I6IzEwYjk4MTtcIj5cdTI1Q0Y8L3NwYW4+IFx1MjI2NTc1JSBTdHJvbmcgbWF0Y2ggJm5ic3A7XG4gICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIiBzdHlsZT1cImNvbG9yOiNmNTllMGI7XCI+XHUyNUNGPC9zcGFuPiA1MFx1MjAxMzc0JSBQYXJ0aWFsIG1hdGNoICZuYnNwO1xuICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCIgc3R5bGU9XCJjb2xvcjojZWY0NDQ0O1wiPlx1MjVDRjwvc3Bhbj4gJmx0OzUwJSBMb3cgbWF0Y2hcbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgICR7a2V5d29yZEdyb3Vwc31cbiAgICAgICR7c2VjdEh0bWx9XG4gICAgICAke21pc3NpbmdIYXJkLmxlbmd0aCA+IDAgPyBgXG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOjE2cHg7cGFkZGluZzoxMnB4O2JhY2tncm91bmQ6I2ZmZjdlZDtib3JkZXI6MXB4IHNvbGlkICNmZWQ3YWE7Ym9yZGVyLXJhZGl1czo2cHg7XCI+XG4gICAgICAgICAgPHN0cm9uZyBzdHlsZT1cImNvbG9yOiM5YTM0MTI7XCI+TWlzc2luZyBoYXJkIHJlcXVpcmVtZW50cyAoJHttaXNzaW5nSGFyZC5sZW5ndGh9KTo8L3N0cm9uZz5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiM3YzJkMTI7Zm9udC1zaXplOjAuOWVtO1wiPiAke21pc3NpbmdIYXJkLm1hcChrZXl3b3JkID0+IGVzY2FwZUh0bWwoa2V5d29yZC5rZXl3b3JkIHx8IGtleXdvcmQudGVybSB8fCAnJykpLmpvaW4oJywgJyl9PC9zcGFuPlxuICAgICAgICA8L2Rpdj5gIDogJyd9XG4gICAgICAke21pc3NpbmdLdy5sZW5ndGggPiBtaXNzaW5nSGFyZC5sZW5ndGggPyBgXG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOjE2cHg7cGFkZGluZzoxMnB4O2JhY2tncm91bmQ6I2ZmZjdlZDtib3JkZXI6MXB4IHNvbGlkICNmZWQ3YWE7Ym9yZGVyLXJhZGl1czo2cHg7XCI+XG4gICAgICAgICAgPHN0cm9uZyBzdHlsZT1cImNvbG9yOiM5YTM0MTI7XCI+UmVtYWluaW5nIGtleXdvcmQgZ2FwcyAoJHttaXNzaW5nS3cubGVuZ3RoIC0gbWlzc2luZ0hhcmQubGVuZ3RofSk6PC9zdHJvbmc+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjojN2MyZDEyO2ZvbnQtc2l6ZTowLjllbTtcIj4gJHttaXNzaW5nS3cuZmlsdGVyKGtleXdvcmQgPT4gX2tleXdvcmRUeXBlKGtleXdvcmQpICE9PSAnaGFyZCcpLm1hcChrZXl3b3JkID0+IGVzY2FwZUh0bWwoa2V5d29yZC5rZXl3b3JkIHx8IGtleXdvcmQudGVybSB8fCAnJykpLmpvaW4oJywgJyl9PC9zcGFuPlxuICAgICAgICA8L2Rpdj5gIDogJyd9XG4gICAgPC9kaXY+YDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBKb2IgQW5hbHlzaXMgTW9kYWxcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIE9wZW4gdGhlIEpvYiBBbmFseXNpcyBtb2RhbC4gUmV1c2VzIHRhYkRhdGEuYW5hbHlzaXMgaWYgYXZhaWxhYmxlLlxuICovXG5mdW5jdGlvbiBfam9iQW5hbHlzaXNFc2NhcGVIYW5kbGVyKGUpIHtcbiAgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgY2xvc2VKb2JBbmFseXNpc01vZGFsKCk7XG59XG5cbmZ1bmN0aW9uIG9wZW5Kb2JBbmFseXNpc01vZGFsKCkge1xuICBwdXNoRm9jdXNTdGFjayhkb2N1bWVudC5hY3RpdmVFbGVtZW50KTtcbiAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqb2ItYW5hbHlzaXMtbW9kYWwtb3ZlcmxheScpO1xuICBvdmVybGF5LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBfam9iQW5hbHlzaXNFc2NhcGVIYW5kbGVyKTtcbiAgY29uc3QgY2xvc2VCdG4gPSBvdmVybGF5LnF1ZXJ5U2VsZWN0b3IoJy5tb2RhbC1mb290ZXIgLmFjdGlvbi1idG4nKTtcbiAgaWYgKGNsb3NlQnRuKSBjbG9zZUJ0bi5mb2N1cygpO1xuICB0cmFwRm9jdXMoJ2pvYi1hbmFseXNpcy1tb2RhbC1vdmVybGF5Jyk7XG4gIGNvbnN0IGJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnam9iLWFuYWx5c2lzLW1vZGFsLWJvZHknKTtcblxuICBjb25zdCBhbmFseXNpcyA9IHN0YXRlTWFuYWdlci5nZXRUYWJEYXRhKCdhbmFseXNpcycpO1xuICBpZiAoYW5hbHlzaXMpIHtcbiAgICAvLyBSZW5kZXIgaW50byBhIHRlbXAgZGl2IHVzaW5nIHBvcHVsYXRlQW5hbHlzaXNUYWIncyBvdXRwdXQgcGF0dGVyblxuICAgIGNvbnN0IHRtcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRtcC5zdHlsZS5wYWRkaW5nID0gJzIwcHgnO1xuICAgIGJvZHkuaW5uZXJIVE1MID0gJyc7XG4gICAgYm9keS5hcHBlbmRDaGlsZCh0bXApO1xuICAgIC8vIHBvcHVsYXRlQW5hbHlzaXNUYWIgd3JpdGVzIHRvICNkb2N1bWVudC1jb250ZW50OyB1c2UgYSBzaGltXG4gICAgX3JlbmRlckFuYWx5c2lzSW50b0VsKHRtcCwgYW5hbHlzaXMpO1xuICB9IGVsc2Uge1xuICAgIGJvZHkuaW5uZXJIVE1MID0gJzxwIHN0eWxlPVwicGFkZGluZzoyNHB4O3RleHQtYWxpZ246Y2VudGVyO2NvbG9yOiM2YjcyODA7XCI+Tm8gam9iIGFuYWx5c2lzIGF2YWlsYWJsZS4gUnVuIGpvYiBhbmFseXNpcyBmaXJzdC48L3A+JztcbiAgfVxufVxuXG5mdW5jdGlvbiBjbG9zZUpvYkFuYWx5c2lzTW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqb2ItYW5hbHlzaXMtbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBfam9iQW5hbHlzaXNFc2NhcGVIYW5kbGVyKTtcbiAgcmVzdG9yZUZvY3VzKCk7XG59XG5cbi8qKlxuICogUmVuZGVyIGpvYiBhbmFseXNpcyBkYXRhIGludG8gYW4gYXJiaXRyYXJ5IGNvbnRhaW5lciBlbGVtZW50LlxuICogTWlycm9ycyB0aGUgc3RydWN0dXJlIGZyb20gcG9wdWxhdGVBbmFseXNpc1RhYiBpbiBhcHAuanMuXG4gKi9cbmZ1bmN0aW9uIF9yZW5kZXJBbmFseXNpc0ludG9FbChlbCwgcmVzdWx0KSB7XG4gIGlmICghcmVzdWx0KSB7XG4gICAgZWwuaW5uZXJIVE1MID0gJzxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtcIj5ObyBhbmFseXNpcyBkYXRhLjwvcD4nO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIERlZHVwbGljYXRlIGxpc3RzOiBjYXNlLWluc2Vuc2l0aXZlLCBrZWVwIGZpcnN0IG9jY3VycmVuY2Ugb2YgZWFjaCBub3JtYWxpc2VkIGZvcm0uXG4gIGNvbnN0IF9kZWR1cCA9IChhcnIpID0+IHtcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldCgpO1xuICAgIHJldHVybiAoYXJyIHx8IFtdKS5maWx0ZXIoaXRlbSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBTdHJpbmcodHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnID8gaXRlbSA6IGl0ZW0ua2V5d29yZCB8fCBpdGVtLnRlcm0gfHwgJycpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKCFrZXkgfHwgc2Vlbi5oYXMoa2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgc2Vlbi5hZGQoa2V5KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICB9O1xuICBjb25zdCByZXEgPSBfZGVkdXAocmVzdWx0LnJlcXVpcmVkX3NraWxscyk7XG4gIGNvbnN0IHByZWYgPSBfZGVkdXAocmVzdWx0LnByZWZlcnJlZF9za2lsbHMgfHwgcmVzdWx0Lm5pY2VfdG9faGF2ZSk7XG4gIGNvbnN0IGtleXdvcmRzID0gX2RlZHVwKHJlc3VsdC5hdHNfa2V5d29yZHMpO1xuICBjb25zdCBjdWx0dXJlID0gcmVzdWx0LmN1bHR1cmVfaW5kaWNhdG9ycyB8fCBbXTtcbiAgY29uc3QgbXVzdEhhdmUgPSByZXN1bHQubXVzdF9oYXZlX3JlcXVpcmVtZW50cyB8fCBbXTtcbiAgY29uc3QgbWlzc2luZyA9IHJlc3VsdC5taXNzaW5nX3JlcXVpcmVkIHx8IFtdO1xuXG4gIGVsLmlubmVySFRNTCA9IGBcbiAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuOTVlbTtsaW5lLWhlaWdodDoxLjY7XCI+XG4gICAgICA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZjhmYWZjO2JvcmRlcjoxcHggc29saWQgI2UyZThmMDtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjE0cHggMTZweDttYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MS4xZW07Zm9udC13ZWlnaHQ6NzAwO2NvbG9yOiMxZTI5M2I7XCI+JHtlc2NhcGVIdG1sKHJlc3VsdC5qb2JfdGl0bGUgfHwgcmVzdWx0LnRpdGxlIHx8ICdSb2xlJyl9PC9kaXY+XG4gICAgICAgICR7cmVzdWx0LmNvbXBhbnkgPyBgPGRpdiBzdHlsZT1cImNvbG9yOiM0NzU1Njk7XCI+JHtlc2NhcGVIdG1sKHJlc3VsdC5jb21wYW55KX08L2Rpdj5gIDogJyd9XG4gICAgICAgICR7cmVzdWx0LmRvbWFpbiA/IGA8c3BhbiBzdHlsZT1cImRpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbi10b3A6NnB4O3BhZGRpbmc6MnB4IDhweDtiYWNrZ3JvdW5kOiNkYmVhZmU7Y29sb3I6IzFlNDBhZjtib3JkZXItcmFkaXVzOjEwcHg7Zm9udC1zaXplOjAuOGVtO1wiPiR7ZXNjYXBlSHRtbChyZXN1bHQuZG9tYWluKX08L3NwYW4+YCA6ICcnfVxuICAgICAgPC9kaXY+XG5cbiAgICAgICR7bWlzc2luZy5sZW5ndGggPiAwID8gYFxuICAgICAgICA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZmZmN2VkO2JvcmRlcjoxcHggc29saWQgI2ZlZDdhYTtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjEwcHggMTRweDttYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgICAgPHN0cm9uZyBzdHlsZT1cImNvbG9yOiM5YTM0MTI7XCI+XHUyNkEwIE1pc3NpbmcgcmVxdWlyZWQgc2tpbGxzOjwvc3Ryb25nPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJjb2xvcjojN2MyZDEyO21hcmdpbi10b3A6NHB4O1wiPiR7bWlzc2luZy5tYXAocyA9PiBlc2NhcGVIdG1sKHMpKS5qb2luKCcgXHUwMEI3ICcpfTwvZGl2PlxuICAgICAgICA8L2Rpdj5gIDogJyd9XG5cbiAgICAgICR7cmVxLmxlbmd0aCA+IDAgPyBgXG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgICAgPGg0IHN0eWxlPVwibWFyZ2luOjAgMCA4cHg7Zm9udC1zaXplOjAuOTVlbTt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7bGV0dGVyLXNwYWNpbmc6LjVweDtjb2xvcjojMzM0MTU1O1wiPlJlcXVpcmVkIFNraWxsczwvaDQ+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtmbGV4LXdyYXA6d3JhcDtnYXA6NnB4O1wiPlxuICAgICAgICAgICAgJHtyZXEubWFwKHMgPT4gYDxzcGFuIHN0eWxlPVwicGFkZGluZzoycHggMTBweDtib3JkZXItcmFkaXVzOjEycHg7YmFja2dyb3VuZDoke21pc3NpbmcuaW5jbHVkZXMocyk/JyNmZWUyZTInOicjZGNmY2U3J307Y29sb3I6JHttaXNzaW5nLmluY2x1ZGVzKHMpPycjOTkxYjFiJzonIzE2NjUzNCd9O2ZvbnQtc2l6ZTowLjg1ZW07XCI+JHtlc2NhcGVIdG1sKHMpfTwvc3Bhbj5gKS5qb2luKCcnKX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+YCA6ICcnfVxuXG4gICAgICAke3ByZWYubGVuZ3RoID4gMCA/IGBcbiAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTRweDtcIj5cbiAgICAgICAgICA8aDQgc3R5bGU9XCJtYXJnaW46MCAwIDhweDtmb250LXNpemU6MC45NWVtO3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTtsZXR0ZXItc3BhY2luZzouNXB4O2NvbG9yOiMzMzQxNTU7XCI+UHJlZmVycmVkIC8gTmljZS10by1oYXZlPC9oND5cbiAgICAgICAgICA8dWwgc3R5bGU9XCJtYXJnaW46MDtwYWRkaW5nLWxlZnQ6MThweDtjb2xvcjojNDc1NTY5O1wiPiR7cHJlZi5tYXAocyA9PiBgPGxpPiR7ZXNjYXBlSHRtbChzKX08L2xpPmApLmpvaW4oJycpfTwvdWw+XG4gICAgICAgIDwvZGl2PmAgOiAnJ31cblxuICAgICAgJHtrZXl3b3Jkcy5sZW5ndGggPiAwID8gYFxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgIDxoNCBzdHlsZT1cIm1hcmdpbjowIDAgOHB4O2ZvbnQtc2l6ZTowLjk1ZW07dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO2xldHRlci1zcGFjaW5nOi41cHg7Y29sb3I6IzMzNDE1NTtcIj5BVFMgS2V5d29yZHM8L2g0PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7ZmxleC13cmFwOndyYXA7Z2FwOjZweDtcIj5cbiAgICAgICAgICAgICR7a2V5d29yZHMubWFwKChrLCBpKSA9PiBgPHNwYW4gc3R5bGU9XCJwYWRkaW5nOjJweCA4cHg7Ym9yZGVyLXJhZGl1czoxMnB4O2JhY2tncm91bmQ6I2YwZjlmZjtib3JkZXI6MXB4IHNvbGlkICNiYWU2ZmQ7Y29sb3I6IzAzNjlhMTtmb250LXNpemU6MC44MmVtO1wiPiR7aSA8IDUgPyBgPHN0cm9uZz4jJHtpKzF9PC9zdHJvbmc+IGAgOiAnJ30ke2VzY2FwZUh0bWwodHlwZW9mIGsgPT09ICdzdHJpbmcnID8gayA6IGsua2V5d29yZCB8fCBrLnRlcm0gfHwgJycpfTwvc3Bhbj5gKS5qb2luKCcnKX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+YCA6ICcnfVxuXG4gICAgICAke211c3RIYXZlLmxlbmd0aCA+IDAgPyBgXG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgICAgPGg0IHN0eWxlPVwibWFyZ2luOjAgMCA4cHg7Zm9udC1zaXplOjAuOTVlbTt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7bGV0dGVyLXNwYWNpbmc6LjVweDtjb2xvcjojMzM0MTU1O1wiPk11c3QtaGF2ZSBSZXF1aXJlbWVudHM8L2g0PlxuICAgICAgICAgIDx1bCBzdHlsZT1cIm1hcmdpbjowO3BhZGRpbmctbGVmdDoxOHB4O2NvbG9yOiM0NzU1Njk7XCI+JHttdXN0SGF2ZS5tYXAocyA9PiBgPGxpPiR7ZXNjYXBlSHRtbChzKX08L2xpPmApLmpvaW4oJycpfTwvdWw+XG4gICAgICAgIDwvZGl2PmAgOiAnJ31cblxuICAgICAgJHtjdWx0dXJlLmxlbmd0aCA+IDAgPyBgXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGg0IHN0eWxlPVwibWFyZ2luOjAgMCA4cHg7Zm9udC1zaXplOjAuOTVlbTt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7bGV0dGVyLXNwYWNpbmc6LjVweDtjb2xvcjojMzM0MTU1O1wiPkN1bHR1cmUgSW5kaWNhdG9yczwvaDQ+XG4gICAgICAgICAgPHVsIHN0eWxlPVwibWFyZ2luOjA7cGFkZGluZy1sZWZ0OjE4cHg7Y29sb3I6IzQ3NTU2OTtcIj4ke2N1bHR1cmUubWFwKHMgPT4gYDxsaT4ke2VzY2FwZUh0bWwocyl9PC9saT5gKS5qb2luKCcnKX08L3VsPlxuICAgICAgICA8L2Rpdj5gIDogJyd9XG4gICAgPC9kaXY+YDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBBVFMgU2NvcmUgVGFiIChpbiBjdXN0b21pemUgcGhhc2UpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBQb3B1bGF0ZSB0aGUgQVRTIFNjb3JlIHRhYiBjb250ZW50IGFyZWEuXG4gKiBDYWxsZWQgYnkgYXBwLmpzIHN3aXRjaFRhYiB3aGVuIGNhc2UgJ2F0cy1zY29yZScgaXMgc2VsZWN0ZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBvcHVsYXRlQXRzU2NvcmVUYWIoKSB7XG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9jdW1lbnQtY29udGVudCcpO1xuICBpZiAoIWNvbnRlbnQpIHJldHVybjtcblxuICBjb25zdCBjYWNoZWQgPSBzdGF0ZU1hbmFnZXI/LmdldEF0c1Njb3JlPy4oKTtcbiAgaWYgKGNhY2hlZCkge1xuICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gYDxkaXYgc3R5bGU9XCJtYXgtd2lkdGg6NjgwcHg7bWFyZ2luOjAgYXV0bztcIj4ke19yZW5kZXJBdHNSZXBvcnQoY2FjaGVkKX08L2Rpdj5gO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJlbXB0eS1zdGF0ZVwiPjxkaXYgY2xhc3M9XCJpY29uXCI+XHVEODNEXHVEQ0NBPC9kaXY+PGgzPkFUUyBTY29yZTwvaDM+PHA+Q29tcGxldGUgam9iIGFuYWx5c2lzIGFuZCBza2lsbHMgcmV2aWV3IHRvIHNlZSB5b3VyIEFUUyBzY29yZTwvcD48YnV0dG9uIGNsYXNzPVwiYnRuLXByaW1hcnlcIiBvbmNsaWNrPVwicmVmcmVzaEF0c1Njb3JlKFxcJ3Jldmlld19jaGVja3BvaW50XFwnKS50aGVuKCgpPT5wb3B1bGF0ZUF0c1Njb3JlVGFiKCkpXCI+Q29tcHV0ZSBBVFMgU2NvcmU8L2J1dHRvbj48L2Rpdj4nO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNob3cvaGlkZSB0aGUgbW9kYWwgc2hvcnRjdXQgYnV0dG9ucyB3aGVuIEFUUyBiYWRnZSBiZWNvbWVzIHZpc2libGVcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFNob3cgb3IgaGlkZSB0aGUgQVRTIFJlcG9ydCBhbmQgSm9iIEFuYWx5c2lzIHNob3J0Y3V0IGJ1dHRvbnMuXG4gKiBEcml2ZW4gYnkgdGhlICdhdHMtc2NvcmUtdXBkYXRlZCcgY3VzdG9tIGV2ZW50IGRpc3BhdGNoZWQgYnkgYXBwLmpzXG4gKiB3aGVuZXZlciB1cGRhdGVBdHNCYWRnZSgpIHJ1bnMuIE5vIG1vbmtleS1wYXRjaGluZyByZXF1aXJlZC5cbiAqL1xuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignYXRzLXNjb3JlLXVwZGF0ZWQnLCAoKSA9PiB7XG4gIGNvbnN0IGJhZGdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F0cy1zY29yZS1iYWRnZScpO1xuICBjb25zdCB2aXNpYmxlID0gYmFkZ2UgJiYgYmFkZ2Uuc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnO1xuICBjb25zdCByZXBvcnRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXRzLXJlcG9ydC1idG4nKTtcbiAgY29uc3QgYW5hbHlzaXNCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnam9iLWFuYWx5c2lzLWJ0bicpO1xuICBpZiAocmVwb3J0QnRuKSByZXBvcnRCdG4uc3R5bGUuZGlzcGxheSA9IHZpc2libGUgPyAnaW5saW5lLWJsb2NrJyA6ICdub25lJztcbiAgaWYgKGFuYWx5c2lzQnRuKSBhbmFseXNpc0J0bi5zdHlsZS5kaXNwbGF5ID0gdmlzaWJsZSA/ICdpbmxpbmUtYmxvY2snIDogJ25vbmUnO1xufSk7XG5cbmV4cG9ydCB7XG4gIG9wZW5BdHNSZXBvcnRNb2RhbCxcbiAgY2xvc2VBdHNSZXBvcnRNb2RhbCxcbiAgX3JlbmRlckF0c1JlcG9ydCxcbiAgb3BlbkpvYkFuYWx5c2lzTW9kYWwsXG4gIGNsb3NlSm9iQW5hbHlzaXNNb2RhbCxcbiAgX3JlbmRlckFuYWx5c2lzSW50b0VsLFxuICBwb3B1bGF0ZUF0c1Njb3JlVGFiLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL3Nlc3Npb24tYWN0aW9ucy5qc1xuICogU2Vzc2lvbi1sZXZlbCBkaXNwYXRjaCAoc2VuZEFjdGlvbiksIHNhdmUsIGFuZCBwb3NpdGlvbiB0aXRsZSB1cGRhdGVzLlxuICpcbiAqIERFUEVOREVOQ0lFUyAoYWxsIG9uIGdsb2JhbFRoaXMgYXQgcnVudGltZSk6XG4gKiAgIC0gc3RhdGVNYW5hZ2VyIChzdGF0ZS1tYW5hZ2VyLmpzIFx1MjAxNCBpc0xvYWRpbmcoKS9zZXRUYWJEYXRhKCkpXG4gKiAgIC0gdXNlclNlbGVjdGlvbnMgKHdpbmRvdyBnbG9iYWwgZnJvbSBhcHApXG4gKiAgIC0gYXBwZW5kTG9hZGluZ01lc3NhZ2UsIHJlbW92ZUxvYWRpbmdNZXNzYWdlLCBhcHBlbmRNZXNzYWdlLCBhcHBlbmRSZXRyeU1lc3NhZ2VcbiAqICAgLSBzZXRMb2FkaW5nLCBsbG1GZXRjaCAoZmV0Y2gtdXRpbHMuanMpXG4gKiAgIC0gcGFyc2VNZXNzYWdlUmVzcG9uc2UsIHBhcnNlU3RhdHVzUmVzcG9uc2UgKHZhbGlkYXRvcnMuanMpXG4gKiAgIC0gaGFuZGxlQ3VzdG9taXphdGlvblJlc3BvbnNlIChyZXZpZXctdGFibGUtYmFzZS5qcywgVGllciA0KVxuICogICAtIHJlZnJlc2hBdHNTY29yZSwgc3dpdGNoVGFiLCBmZXRjaFN0YXR1cyAoZ2xvYmFsVGhpcylcbiAqICAgLSBjbGVhclN0YXRlLCBTdG9yYWdlS2V5cyAoc3RhdGUtbWFuYWdlci5qcyAvIGFwaS1jbGllbnQuanMpXG4gKiAgIC0gc2hvd0xvYWRKb2JQYW5lbCwgY2xlYXJKb2JJbnB1dCwgY2xlYXJVUkxJbnB1dCwgX2NsZWFyRmllbGRFcnJvcixcbiAqICAgICBfdXBkYXRlUGFzdGVDaGFyQ291bnQgKGpvYi1pbnB1dC5qcywgVGllciAzKVxuICogICAtIG5vcm1hbGl6ZVBvc2l0aW9uTGFiZWwsIGV4dHJhY3RUaXRsZUFuZENvbXBhbnlGcm9tSm9iVGV4dCxcbiAqICAgICBjbGVhbkpzb25SZXNwb25zZSAodXRpbHMuanMpXG4gKiAgIC0gX3VwZGF0ZVNlc3Npb25Td2l0Y2hlckhlYWRlciAoc2Vzc2lvbi1zd2l0Y2hlci11aS5qcywgVGllciA3KVxuICovXG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmNvbnN0IGxvZyA9IGdldExvZ2dlcignc2Vzc2lvbi1hY3Rpb25zJyk7XG5cbmltcG9ydCB7IFN0b3JhZ2VLZXlzIH0gZnJvbSAnLi9hcGktY2xpZW50LmpzJztcbmltcG9ydCB7IHN0YXRlTWFuYWdlciB9IGZyb20gJy4vc3RhdGUtbWFuYWdlci5qcyc7XG5cbi8qKiBNYXBzIGFjdGlvbiBpZGVudGlmaWVycyB0byBodW1hbi1yZWFkYWJsZSBMTE0gc3RhdHVzIGJhciBsYWJlbHMuICovXG5jb25zdCBfQUNUSU9OX0xBQkVMUyA9IHtcbiAgYW5hbHl6ZV9qb2I6ICAgICAgICAgICAgICAnQW5hbHlzaW5nIGpvYiBkZXNjcmlwdGlvblx1MjAyNicsXG4gIHJlY29tbWVuZF9jdXN0b21pemF0aW9uczogJ0dlbmVyYXRpbmcgY3VzdG9taXNhdGlvbiByZWNvbW1lbmRhdGlvbnNcdTIwMjYnLFxuICBnZW5lcmF0ZV9jdjogICAgICAgICAgICAgICdHZW5lcmF0aW5nIENWIGZpbGVzXHUyMDI2Jyxcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIHNlbmRBY3Rpb24oYWN0aW9uKSB7XG4gIGlmIChzdGF0ZU1hbmFnZXIuaXNMb2FkaW5nKCkpIHJldHVybjtcblxuICBjb25zdCBsb2FkaW5nTXNnID0gYXBwZW5kTG9hZGluZ01lc3NhZ2UoYEV4ZWN1dGluZyAke2FjdGlvbn0uLi5gKTtcbiAgc2V0TG9hZGluZyh0cnVlLCBfQUNUSU9OX0xBQkVMU1thY3Rpb25dIHx8IGAke2FjdGlvbi5yZXBsYWNlKC9fL2csICcgJyl9XHUyMDI2YCk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwYXlsb2FkID0geyBhY3Rpb24gfTtcbiAgICBpZiAoYWN0aW9uID09PSAncmVjb21tZW5kX2N1c3RvbWl6YXRpb25zJyAmJiB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzKSB7XG4gICAgICBwYXlsb2FkLnVzZXJfcHJlZmVyZW5jZXMgPSB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGxsbUZldGNoKCcvYXBpL2FjdGlvbicsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShwYXlsb2FkKSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gcGFyc2VNZXNzYWdlUmVzcG9uc2UoYXdhaXQgcmVzLmpzb24oKSk7XG5cbiAgICByZW1vdmVMb2FkaW5nTWVzc2FnZShsb2FkaW5nTXNnKTtcblxuICAgIGlmIChkYXRhLmVycm9yKSB7XG4gICAgICBhcHBlbmRSZXRyeU1lc3NhZ2UoJ1x1Mjc0QyBFcnJvcjogJyArIGRhdGEuZXJyb3IsICgpID0+IHNlbmRBY3Rpb24oYWN0aW9uKSk7XG4gICAgfSBlbHNlIGlmIChhY3Rpb24gPT09ICdyZWNvbW1lbmRfY3VzdG9taXphdGlvbnMnKSB7XG4gICAgICBjb25zdCBjdXN0b21pemF0aW9uRGF0YSA9IGRhdGEucmVzdWx0Py5jb250ZXh0X2RhdGE/LmN1c3RvbWl6YXRpb25zID8/IGRhdGEucmVzdWx0O1xuICAgICAgYXdhaXQgaGFuZGxlQ3VzdG9taXphdGlvblJlc3BvbnNlKGN1c3RvbWl6YXRpb25EYXRhKTtcbiAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PT0gJ2dlbmVyYXRlX2N2Jykge1xuICAgICAgY29uc3QgZ2VuZXJhdGlvbk1zZyA9IGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsICdcdTIzRjMgR2VuZXJhdGluZyBDViBmaWxlcyAoQVRTIERPQ1ggXHUyMTkyIEhUTUwgXHUyMTkyIEh1bWFuIERPQ1gpLi4uJyk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEyMDsgaSsrKSB7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCA1MDApKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBzdGF0dXNSZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvc3RhdHVzJyk7XG4gICAgICAgICAgY29uc3Qgc3RhdHVzRGF0YSA9IHBhcnNlU3RhdHVzUmVzcG9uc2UoYXdhaXQgc3RhdHVzUmVzLmpzb24oKSk7XG4gICAgICAgICAgY29uc3QgcHJvZ3Jlc3MgICA9IHN0YXR1c0RhdGEuZ2VuZXJhdGlvbl9wcm9ncmVzcyB8fCBbXTtcbiAgICAgICAgICBpZiAocHJvZ3Jlc3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgdG90YWwgPSBwcm9ncmVzcy5sZW5ndGg7XG4gICAgICAgICAgICBjb25zdCBkb25lQ291bnQgPSBwcm9ncmVzcy5maWx0ZXIocCA9PiBwLnN0YXR1cyA9PT0gJ2NvbXBsZXRlJykubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgYWN0aXZlID0gcHJvZ3Jlc3MuZmluZChwID0+IHAuc3RhdHVzICE9PSAnY29tcGxldGUnKTtcbiAgICAgICAgICAgIGNvbnN0IHN0ZXBMYWJlbCA9IGFjdGl2ZVxuICAgICAgICAgICAgICA/IGAke2FjdGl2ZS5zdGVwLnJlcGxhY2UoL18vZywgJyAnKX0gKCR7ZG9uZUNvdW50ICsgMX0gb2YgJHt0b3RhbH0pYFxuICAgICAgICAgICAgICA6IGAke3RvdGFsfSBvZiAke3RvdGFsfSBjb21wbGV0ZWA7XG4gICAgICAgICAgICBpZiAodHlwZW9mIF91cGRhdGVMTE1TdGF0dXNCYXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgX3VwZGF0ZUxMTVN0YXR1c0Jhcih0cnVlLCBgR2VuZXJhdGluZyBDVjogJHtzdGVwTGFiZWx9XHUyMDI2YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzdGVwcyA9IHByb2dyZXNzLm1hcChwID0+XG4gICAgICAgICAgICAgIGAke3Auc3RhdHVzID09PSAnY29tcGxldGUnID8gJ1x1MjcxMycgOiAnXHUyM0YzJ30gJHtwLnN0ZXAucmVwbGFjZSgvXy9nLCAnICcpfSAke3AuZWxhcHNlZF9tcyA/IGAoJHtwLmVsYXBzZWRfbXN9bXMpYCA6ICcnfWBcbiAgICAgICAgICAgICkuam9pbignIFx1MjAyMiAnKTtcbiAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uTXNnKSBnZW5lcmF0aW9uTXNnLnF1ZXJ5U2VsZWN0b3IoJy5jb250ZW50JykudGV4dENvbnRlbnQgPSBgR2VuZXJhdGluZyBDVjogJHtzdGVwc31gO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocHJvZ3Jlc3MuZXZlcnkocCA9PiBwLnN0YXR1cyA9PT0gJ2NvbXBsZXRlJykgJiYgcHJvZ3Jlc3MubGVuZ3RoID4gMCkgYnJlYWs7XG4gICAgICAgIH0gY2F0Y2ggKF9lKSB7IC8qIHBvbGxpbmcgZXJyb3IgXHUyMDE0IGNvbnRpbnVlICovIH1cbiAgICAgIH1cbiAgICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsICdDViBnZW5lcmF0ZWQgc3VjY2Vzc2Z1bGx5ISBSZXZpZXcgeW91ciBsYXlvdXQgYmVsb3cuJyk7XG4gICAgICBzdGF0ZU1hbmFnZXIuc2V0VGFiRGF0YSgnY3YnLCBkYXRhLnJlc3VsdCk7XG4gICAgICByZWZyZXNoQXRzU2NvcmUoJ3Bvc3RfZ2VuZXJhdGlvbicpO1xuICAgICAgc3dpdGNoVGFiKCdsYXlvdXQnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgZGF0YS5yZXN1bHQpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cuZXJyb3IoJz09PSBTRU5EIEFDVElPTiBFUlJPUiA9PT0nLCBhY3Rpb24sIGVycm9yKTtcbiAgICByZW1vdmVMb2FkaW5nTWVzc2FnZShsb2FkaW5nTXNnKTtcbiAgICBpZiAoZXJyb3IubmFtZSAhPT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICBhcHBlbmRSZXRyeU1lc3NhZ2UoJ1x1Mjc0QyBFcnJvcjogJyArIGVycm9yLm1lc3NhZ2UsICgpID0+IHNlbmRBY3Rpb24oYWN0aW9uKSk7XG4gICAgfVxuICB9XG5cbiAgc2V0TG9hZGluZyhmYWxzZSk7XG4gIGF3YWl0IGZldGNoU3RhdHVzKCk7XG4gIGlmICh0eXBlb2YgZmV0Y2hBbmREaXNwbGF5TGxtTG9nID09PSAnZnVuY3Rpb24nKSBmZXRjaEFuZERpc3BsYXlMbG1Mb2coKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZVNlc3Npb24oKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL3NhdmUnLCB7IG1ldGhvZDogJ1BPU1QnIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBpZiAoZGF0YS5zZXNzaW9uX2ZpbGUpIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFN0b3JhZ2VLZXlzLlNFU1NJT05fUEFUSCwgZGF0YS5zZXNzaW9uX2ZpbGUpO1xuICAgICAgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgJ1Nlc3Npb24gc2F2ZWQgc3VjY2Vzc2Z1bGx5LicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcHBlbmRSZXRyeU1lc3NhZ2UoJ1x1Mjc0QyBFcnJvciBzYXZpbmcgc2Vzc2lvbjogJyArIGRhdGEuZXJyb3IsIHNhdmVTZXNzaW9uKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nLmVycm9yKCc9PT0gU0FWRSBTRVNTSU9OIEVSUk9SID09PScsIGVycm9yKTtcbiAgICBhcHBlbmRSZXRyeU1lc3NhZ2UoJ1x1Mjc0QyBFcnJvcjogJyArIGVycm9yLm1lc3NhZ2UsIHNhdmVTZXNzaW9uKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfZm9ybWF0QmFyRGF0ZSh2YWx1ZSkge1xuICBjb25zdCB0ZXh0ID0gU3RyaW5nKHZhbHVlIHx8ICcnKS50cmltKCk7XG4gIGlmICghdGV4dCkgcmV0dXJuICcnO1xuICBpZiAoL15cXGR7NH0tXFxkezJ9LVxcZHsyfSQvLnRlc3QodGV4dCkpIHtcbiAgICBjb25zdCBbeWVhciwgbW9udGgsIGRheV0gPSB0ZXh0LnNwbGl0KCctJyk7XG4gICAgcmV0dXJuIGAke21vbnRofS8ke2RheX0vJHt5ZWFyfWA7XG4gIH1cbiAgY29uc3QgcGFyc2VkID0gbmV3IERhdGUodGV4dCk7XG4gIGlmICghTnVtYmVyLmlzTmFOKHBhcnNlZC5nZXRUaW1lKCkpKSB7XG4gICAgcmV0dXJuIHBhcnNlZC50b0lTT1N0cmluZygpLnNsaWNlKDAsIDEwKTtcbiAgfVxuICByZXR1cm4gdGV4dDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlUG9zaXRpb25UaXRsZShzdGF0dXMgPSB7fSkge1xuICBjb25zdCBwb3NpdGlvbkVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Bvc2l0aW9uLXRpdGxlJyk7XG4gIGlmICghcG9zaXRpb25FbCkgcmV0dXJuO1xuXG4gIGNvbnN0IGZhbGxiYWNrQnJvd3NlclRpdGxlID0gJ0NWIEJ1aWxkZXIgXHUyMDE0IFByb2Zlc3Npb25hbCBXZWIgVUknO1xuICBsZXQgbGFiZWwgPSAoc3RhdHVzLnBvc2l0aW9uX25hbWUgfHwgJycpLnRvU3RyaW5nKCkudHJpbSgpO1xuICBsZXQgY29tcGFueSA9ICcnO1xuICBsZXQgZGF0ZUFwcGxpZWQgPSAnJztcblxuICBpZiAoIWxhYmVsICYmIHN0YXR1cy5qb2JfYW5hbHlzaXMpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYW5hbHlzaXMgPSB0eXBlb2Ygc3RhdHVzLmpvYl9hbmFseXNpcyA9PT0gJ3N0cmluZydcbiAgICAgICAgPyBKU09OLnBhcnNlKGNsZWFuSnNvblJlc3BvbnNlKHN0YXR1cy5qb2JfYW5hbHlzaXMpKVxuICAgICAgICA6IHN0YXR1cy5qb2JfYW5hbHlzaXM7XG4gICAgICBjb25zdCB0aXRsZSA9IGFuYWx5c2lzPy5qb2JfdGl0bGUgfHwgYW5hbHlzaXM/LnRpdGxlIHx8IGFuYWx5c2lzPy5wb3NpdGlvbl9uYW1lIHx8ICcnO1xuICAgICAgbGFiZWwgPSBub3JtYWxpemVQb3NpdGlvbkxhYmVsKHRpdGxlLCBhbmFseXNpcz8uY29tcGFueSk7XG4gICAgICBjb21wYW55ID0gKGFuYWx5c2lzPy5jb21wYW55X25hbWUgfHwgYW5hbHlzaXM/LmNvbXBhbnkgfHwgJycpLnRyaW0oKTtcbiAgICAgIGRhdGVBcHBsaWVkID0gX2Zvcm1hdEJhckRhdGUoYW5hbHlzaXM/LmRhdGVfYXBwbGllZCB8fCBhbmFseXNpcz8uYXBwbGljYXRpb25fZGF0ZSB8fCAnJyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZy53YXJuKCdGYWlsZWQgdG8gcGFyc2Ugam9iX2FuYWx5c2lzIGZvciB0aXRsZTonLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFsYWJlbCAmJiBzdGF0dXMuam9iX2Rlc2NyaXB0aW9uX3RleHQpIHtcbiAgICBjb25zdCBwYXJzZWQgPSBleHRyYWN0VGl0bGVBbmRDb21wYW55RnJvbUpvYlRleHQoc3RhdHVzLmpvYl9kZXNjcmlwdGlvbl90ZXh0KTtcbiAgICBsYWJlbCA9IG5vcm1hbGl6ZVBvc2l0aW9uTGFiZWwocGFyc2VkLnRpdGxlLCBwYXJzZWQuY29tcGFueSk7XG4gICAgaWYgKCFjb21wYW55KSBjb21wYW55ID0gKHBhcnNlZC5jb21wYW55IHx8ICcnKS50cmltKCk7XG4gIH1cblxuICBwb3NpdGlvbkVsLnRleHRDb250ZW50ID0gbGFiZWw7XG4gIGRvY3VtZW50LnRpdGxlID0gbGFiZWwgPyBgJHtsYWJlbH0gXHUyMDE0IENWIEJ1aWxkZXJgIDogZmFsbGJhY2tCcm93c2VyVGl0bGU7XG5cbiAgY29uc3QgcG9zaXRpb25Db21wYW55RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncG9zaXRpb24tY29tcGFueScpO1xuICBpZiAocG9zaXRpb25Db21wYW55RWwpIHtcbiAgICBjb25zdCBpbnRha2UgPSB3aW5kb3cuX3N0YXR1c0ludGFrZSB8fCB7fTtcbiAgICBjb25zdCBmaW5hbENvbXBhbnkgPSAoaW50YWtlLmNvbXBhbnkgfHwgJycpLnRyaW0oKSB8fCBjb21wYW55O1xuICAgIGNvbnN0IGZpbmFsRGF0ZSA9IGRhdGVBcHBsaWVkIHx8IF9mb3JtYXRCYXJEYXRlKGludGFrZS5kYXRlX2FwcGxpZWQgfHwgJycpO1xuICAgIGNvbnN0IHN1YnRpdGxlID0gW2ZpbmFsQ29tcGFueSwgZmluYWxEYXRlXS5maWx0ZXIoQm9vbGVhbikuam9pbignICBcdTAwQjcgICcpO1xuICAgIHBvc2l0aW9uQ29tcGFueUVsLnRleHRDb250ZW50ID0gc3VidGl0bGU7XG4gICAgcG9zaXRpb25Db21wYW55RWwuc3R5bGUuZGlzcGxheSA9IHN1YnRpdGxlID8gJycgOiAnbm9uZSc7XG4gIH1cblxuICBjb25zdCByZW5hbWVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVuYW1lLXNlc3Npb24tYnRuJyk7XG4gIGlmIChyZW5hbWVCdG4pIHJlbmFtZUJ0bi5zdHlsZS5kaXNwbGF5ID0gbGFiZWwgPyAnJyA6ICdub25lJztcbiAgaWYgKHR5cGVvZiBfdXBkYXRlU2Vzc2lvblN3aXRjaGVySGVhZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgX3VwZGF0ZVNlc3Npb25Td2l0Y2hlckhlYWRlcih7IHBvc2l0aW9uX25hbWU6IGxhYmVsLCBwaGFzZTogc3RhdHVzLnBoYXNlIHx8IG51bGwgfSk7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIEVTIG1vZHVsZSBleHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuZXhwb3J0IHsgc2VuZEFjdGlvbiwgc2F2ZVNlc3Npb24sIHVwZGF0ZVBvc2l0aW9uVGl0bGUsIF9BQ1RJT05fTEFCRUxTIH07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9qb2ItYW5hbHlzaXMuanNcbiAqIEpvYiBhbmFseXNpcyBvcmNoZXN0cmF0aW9uOiBmaXJlcyBhbmFseXplX2pvYiBhY3Rpb24sIG1lcmdlcyBwb3N0LWFuYWx5c2lzXG4gKiBxdWVzdGlvbnMsIGFuZCB0cmFuc2l0aW9ucyB0aGUgVUkgdG8gdGhlIGFuYWx5c2lzIHRhYi5cbiAqXG4gKiBERVBFTkRFTkNJRVMgKGFsbCBvbiBnbG9iYWxUaGlzIGF0IHJ1bnRpbWUpOlxuICogICAtIHN0YXRlTWFuYWdlciAoc3RhdGUtbWFuYWdlci5qcyBcdTIwMTQgaXNMb2FkaW5nKCkvc2V0VGFiRGF0YSgpKVxuICogICAtIGxsbUZldGNoLCBzZXRMb2FkaW5nIChmZXRjaC11dGlscy5qcylcbiAqICAgLSBhcHBlbmRMb2FkaW5nTWVzc2FnZSwgcmVtb3ZlTG9hZGluZ01lc3NhZ2UsIGFwcGVuZE1lc3NhZ2UsXG4gKiAgICAgYXBwZW5kUmV0cnlNZXNzYWdlLCBhcHBlbmRGb3JtYXR0ZWRBbmFseXNpcyAobWVzc2FnZS1xdWV1ZS5qcylcbiAqICAgLSBwYXJzZU1lc3NhZ2VSZXNwb25zZSAodmFsaWRhdG9ycy5qcylcbiAqICAgLSBhc2tQb3N0QW5hbHlzaXNRdWVzdGlvbnMgKHF1ZXN0aW9ucy1wYW5lbC5qcylcbiAqICAgLSByZWZyZXNoQXRzU2NvcmUgKGF0cy1yZWZpbmVtZW50LmpzKVxuICogICAtIHN3aXRjaFRhYiAocmV2aWV3LXRhYmxlLWJhc2UuanMsIFRpZXIgNClcbiAqICAgLSBmZXRjaFN0YXR1cyAoYXBwLmpzIG9yY2hlc3RyYXRvciwgVGllciA4KVxuICogICAtIF9zaG93SW50YWtlQ29uZmlybUNhcmQsIF9wcm9jZWVkQWZ0ZXJJbnRha2UgKG1lc3NhZ2UtZGlzcGF0Y2guanMsIFRpZXIgMylcbiAqL1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5jb25zdCBsb2cgPSBnZXRMb2dnZXIoJ2pvYi1hbmFseXNpcycpO1xuXG5pbXBvcnQgeyBTdG9yYWdlS2V5cyB9IGZyb20gJy4vYXBpLWNsaWVudC5qcyc7XG5pbXBvcnQgeyBzdGF0ZU1hbmFnZXIgfSBmcm9tICcuL3N0YXRlLW1hbmFnZXIuanMnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFBvc3QtYW5hbHlzaXMgcXVlc3Rpb24gaGVscGVyc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBOb3JtYWxpc2UgYSByYXcgcXVlc3Rpb25zIGFycmF5IHRvIFt7cXVlc3Rpb24sIHR5cGUsIGNob2ljZXN9XS4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBvc3RBbmFseXNpc1F1ZXN0aW9ucyhyYXdRdWVzdGlvbnMpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHJhd1F1ZXN0aW9ucykpIHJldHVybiBbXTtcbiAgcmV0dXJuIHJhd1F1ZXN0aW9uc1xuICAgIC5maWx0ZXIocSA9PiBxICYmIHR5cGVvZiBxLnF1ZXN0aW9uID09PSAnc3RyaW5nJyAmJiBxLnF1ZXN0aW9uLnRyaW0oKSlcbiAgICAubWFwKChxLCBpZHgpID0+ICh7XG4gICAgICBxdWVzdGlvbjogcS5xdWVzdGlvbi50cmltKCksXG4gICAgICB0eXBlOiAgICAgKHEudHlwZSB8fCBgY2xhcmlmaWNhdGlvbl8ke2lkeCArIDF9YCkudG9TdHJpbmcoKSxcbiAgICAgIGNob2ljZXM6ICBBcnJheS5pc0FycmF5KHEuY2hvaWNlcykgPyBxLmNob2ljZXMgOiBbXSxcbiAgICB9KSk7XG59XG5cbi8qKlxuICogRXh0cmFjdCBudW1iZXJlZC1saXN0IHF1ZXN0aW9ucyBmcm9tIHVuc3RydWN0dXJlZCBhc3Npc3RhbnQgdGV4dC5cbiAqIFJldHVybnMgYXQgbW9zdCA0IHF1ZXN0aW9ucy5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdFN0cnVjdHVyZWRRdWVzdGlvbnNGcm9tQXNzaXN0YW50VGV4dCh0ZXh0KSB7XG4gIGlmICh0eXBlb2YgdGV4dCAhPT0gJ3N0cmluZycgfHwgIXRleHQudHJpbSgpKSByZXR1cm4gW107XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSB0ZXh0LnJlcGxhY2UoL1xcclxcbi9nLCAnXFxuJyk7XG4gIGNvbnN0IGJsb2NrcyA9IG5vcm1hbGl6ZWQuc3BsaXQoL15cXHMqXFxkK1xcLlxccysvbSk7XG4gIGlmIChibG9ja3MubGVuZ3RoIDw9IDEpIHJldHVybiBbXTtcbiAgcmV0dXJuIGJsb2Nrc1xuICAgIC5zbGljZSgxKVxuICAgIC5tYXAoKGJsb2NrLCBpZHgpID0+IHtcbiAgICAgIGNvbnN0IHF1ZXN0aW9uID0gYmxvY2sudHJpbSgpO1xuICAgICAgaWYgKCFxdWVzdGlvbikgcmV0dXJuIG51bGw7XG4gICAgICByZXR1cm4geyBxdWVzdGlvbjogcXVlc3Rpb24uc2xpY2UoMCwgNDAwMCksIHR5cGU6IGBjbGFyaWZpY2F0aW9uXyR7aWR4ICsgMX1gLCBjaG9pY2VzOiBbXSB9O1xuICAgIH0pXG4gICAgLmZpbHRlcihCb29sZWFuKVxuICAgIC5zbGljZSgwLCA0KTtcbn1cblxuLyoqXG4gKiBNZXJnZSBzZXJ2ZXItcHJvdmlkZWQgcXVlc3Rpb25zIHdpdGggdGhvc2UgZXh0cmFjdGVkIGZyb20gdGhlIGFzc2lzdGFudCB0ZXh0LFxuICogZGUtZHVwbGljYXRpbmcgYnkgcXVlc3Rpb24gdGV4dCBhbmQgdHlwZS5cbiAqL1xuZnVuY3Rpb24gbWVyZ2VQb3N0QW5hbHlzaXNRdWVzdGlvbnMoZXhpc3RpbmdRdWVzdGlvbnMsIGluY29taW5nUXVlc3Rpb25zKSB7XG4gIGNvbnN0IGV4aXN0aW5nID0gbm9ybWFsaXplUG9zdEFuYWx5c2lzUXVlc3Rpb25zKGV4aXN0aW5nUXVlc3Rpb25zKTtcbiAgY29uc3QgaW5jb21pbmcgPSBub3JtYWxpemVQb3N0QW5hbHlzaXNRdWVzdGlvbnMoaW5jb21pbmdRdWVzdGlvbnMpO1xuXG4gIGNvbnN0IG1lcmdlZCAgICAgICAgPSBbLi4uZXhpc3RpbmddO1xuICBjb25zdCBzZWVuQnlRdWVzdGlvbiA9IG5ldyBTZXQoZXhpc3RpbmcubWFwKHEgPT4gcS5xdWVzdGlvbi50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xccysvZywgJyAnKS50cmltKCkpKTtcbiAgY29uc3QgdXNlZFR5cGVzICAgICAgPSBuZXcgU2V0KGV4aXN0aW5nLm1hcChxID0+IHEudHlwZSkpO1xuXG4gIGluY29taW5nLmZvckVhY2goKHEsIGlkeCkgPT4ge1xuICAgIGNvbnN0IGtleSA9IHEucXVlc3Rpb24udG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXHMrL2csICcgJykudHJpbSgpO1xuICAgIGlmICgha2V5IHx8IHNlZW5CeVF1ZXN0aW9uLmhhcyhrZXkpKSByZXR1cm47XG4gICAgbGV0IHR5cGUgPSBxLnR5cGUgfHwgYGNsYXJpZmljYXRpb25fJHttZXJnZWQubGVuZ3RoICsgaWR4ICsgMX1gO1xuICAgIGlmICh1c2VkVHlwZXMuaGFzKHR5cGUpKSB0eXBlID0gYCR7dHlwZX1fJHttZXJnZWQubGVuZ3RoICsgaWR4ICsgMX1gO1xuICAgIG1lcmdlZC5wdXNoKHsgcXVlc3Rpb246IHEucXVlc3Rpb24sIHR5cGUsIGNob2ljZXM6IEFycmF5LmlzQXJyYXkocS5jaG9pY2VzKSA/IHEuY2hvaWNlcyA6IFtdIH0pO1xuICAgIHNlZW5CeVF1ZXN0aW9uLmFkZChrZXkpO1xuICAgIHVzZWRUeXBlcy5hZGQodHlwZSk7XG4gIH0pO1xuXG4gIHJldHVybiBtZXJnZWQ7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gYW5hbHl6ZUpvYlxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmFzeW5jIGZ1bmN0aW9uIGFuYWx5emVKb2IoKSB7XG4gIGlmIChzdGF0ZU1hbmFnZXIuaXNMb2FkaW5nKCkpIHJldHVybjtcblxuICBpZiAoIWxvY2FsU3RvcmFnZS5nZXRJdGVtKFN0b3JhZ2VLZXlzLkxMTV9ESVNDTE9TVVJFX1NIT1dOKSkge1xuICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsICdcdTIxMzlcdUZFMEYgQ29udGVudCB5b3Ugc3VibWl0IGlzIHNlbnQgdG8gdGhlIGNvbmZpZ3VyZWQgTExNIHByb3ZpZGVyIGZvciBhbmFseXNpcy4gUmV2aWV3IHlvdXIgcHJvdmlkZXJcXCdzIGRhdGEgcG9saWN5IGZvciBkZXRhaWxzLicpO1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFN0b3JhZ2VLZXlzLkxMTV9ESVNDTE9TVVJFX1NIT1dOLCAnMScpO1xuICB9XG5cbiAgY29uc3QgbG9hZGluZ01zZyA9IGFwcGVuZExvYWRpbmdNZXNzYWdlKCdBbmFseXppbmcgam9iIGRlc2NyaXB0aW9uLi4uJyk7XG4gIHNldExvYWRpbmcodHJ1ZSwgJ0FuYWx5c2luZyBqb2IgZGVzY3JpcHRpb25cdTIwMjYnKTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBsbG1GZXRjaCgnL2FwaS9hY3Rpb24nLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBhY3Rpb246ICdhbmFseXplX2pvYicgfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IHBhcnNlTWVzc2FnZVJlc3BvbnNlKGF3YWl0IHJlcy5qc29uKCkpO1xuXG4gICAgcmVtb3ZlTG9hZGluZ01lc3NhZ2UobG9hZGluZ01zZyk7XG5cbiAgICBpZiAoZGF0YS5lcnJvcikge1xuICAgICAgYXBwZW5kUmV0cnlNZXNzYWdlKCdcdTI3NEMgRXJyb3I6ICcgKyBkYXRhLmVycm9yLCBhbmFseXplSm9iKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcmVzdWx0ICAgICAgID0gZGF0YS5yZXN1bHQ7XG4gICAgICBjb25zdCBhbmFseXNpc1RleHQgPSB0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJyA/IHJlc3VsdCA6IChyZXN1bHQ/LnRleHQpIHx8IG51bGw7XG4gICAgICBjb25zdCBhbmFseXNpc0RhdGEgPSB0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0JyAmJiByZXN1bHQgIT09IG51bGxcbiAgICAgICAgPyAocmVzdWx0LmNvbnRleHRfZGF0YT8uam9iX2FuYWx5c2lzID8/IHJlc3VsdClcbiAgICAgICAgOiByZXN1bHQ7XG4gICAgICBjb25zdCBjb250ZXh0UXVlc3Rpb25zID0gKHR5cGVvZiByZXN1bHQgPT09ICdvYmplY3QnICYmIHJlc3VsdCAhPT0gbnVsbClcbiAgICAgICAgPyByZXN1bHQuY29udGV4dF9kYXRhPy5wb3N0X2FuYWx5c2lzX3F1ZXN0aW9uc1xuICAgICAgICA6IG51bGw7XG4gICAgICBjb25zdCBzdHJ1Y3R1cmVkUXVlc3Rpb25zID0gbWVyZ2VQb3N0QW5hbHlzaXNRdWVzdGlvbnMoXG4gICAgICAgIGNvbnRleHRRdWVzdGlvbnMsXG4gICAgICAgIChjb250ZXh0UXVlc3Rpb25zICYmIGNvbnRleHRRdWVzdGlvbnMubGVuZ3RoID4gMClcbiAgICAgICAgICA/IFtdXG4gICAgICAgICAgOiBleHRyYWN0U3RydWN0dXJlZFF1ZXN0aW9uc0Zyb21Bc3Npc3RhbnRUZXh0KGFuYWx5c2lzVGV4dCksXG4gICAgICApO1xuXG4gICAgICBpZiAoYW5hbHlzaXNUZXh0KSBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCBhbmFseXNpc1RleHQpO1xuICAgICAgYXBwZW5kRm9ybWF0dGVkQW5hbHlzaXMoYW5hbHlzaXNEYXRhKTtcbiAgICAgIHN0YXRlTWFuYWdlci5zZXRUYWJEYXRhKCdhbmFseXNpcycsIGFuYWx5c2lzRGF0YSk7XG4gICAgICByZWZyZXNoQXRzU2NvcmUoJ2FuYWx5c2lzJyk7XG4gICAgICBzd2l0Y2hUYWIoJ2FuYWx5c2lzJyk7XG5cbiAgICAgIGNvbnN0IGNvbnRpbnVlQWZ0ZXJJbnRha2UgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGFza1Bvc3RBbmFseXNpc1F1ZXN0aW9ucyhhbmFseXNpc0RhdGEsIHN0cnVjdHVyZWRRdWVzdGlvbnMpO1xuICAgICAgfTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaW50YWtlUmVzICA9IGF3YWl0IGxsbUZldGNoKCcvYXBpL2ludGFrZS1tZXRhZGF0YScpO1xuICAgICAgICBjb25zdCBpbnRha2VEYXRhID0gYXdhaXQgaW50YWtlUmVzLmpzb24oKTtcbiAgICAgICAgaWYgKGludGFrZURhdGEuY29uZmlybWVkKSB7XG4gICAgICAgICAgYXdhaXQgX3Byb2NlZWRBZnRlckludGFrZShjb250aW51ZUFmdGVySW50YWtlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhd2FpdCBfc2hvd0ludGFrZUNvbmZpcm1DYXJkKGNvbnRpbnVlQWZ0ZXJJbnRha2UpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChfZSkge1xuICAgICAgICBhd2FpdCBjb250aW51ZUFmdGVySW50YWtlKCk7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy5lcnJvcignPT09IEFOQUxZWkUgSk9CIEVSUk9SID09PScsIGVycm9yKTtcbiAgICByZW1vdmVMb2FkaW5nTWVzc2FnZShsb2FkaW5nTXNnKTtcbiAgICBpZiAoZXJyb3IubmFtZSAhPT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICBhcHBlbmRSZXRyeU1lc3NhZ2UoJ1x1Mjc0QyBFcnJvcjogJyArIGVycm9yLm1lc3NhZ2UsIGFuYWx5emVKb2IpO1xuICAgIH1cbiAgfVxuXG4gIHNldExvYWRpbmcoZmFsc2UpO1xuICAvLyBVcGRhdGUgdGhlIHBvc2l0aW9uLXRpdGxlIGJhciB3aXRoIHRoZSBsYXRlc3Qgc2Vzc2lvbiBuYW1lIGFmdGVyIGFuYWx5c2lzLlxuICB0cnkge1xuICAgIGNvbnN0IGxhdGVzdFN0YXR1cyA9IGF3YWl0IGZldGNoU3RhdHVzKCk7XG4gICAgaWYgKGxhdGVzdFN0YXR1cyAmJiB0eXBlb2YgdXBkYXRlUG9zaXRpb25UaXRsZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdXBkYXRlUG9zaXRpb25UaXRsZShsYXRlc3RTdGF0dXMpO1xuICAgIH1cbiAgfSBjYXRjaCAoX2UpIHsgLyogbm9uLWZhdGFsICovIH1cbiAgaWYgKHR5cGVvZiBmZXRjaEFuZERpc3BsYXlMbG1Mb2cgPT09ICdmdW5jdGlvbicpIGZldGNoQW5kRGlzcGxheUxsbUxvZygpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgRVMgbW9kdWxlIGV4cG9ydHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5leHBvcnQge1xuICBub3JtYWxpemVQb3N0QW5hbHlzaXNRdWVzdGlvbnMsXG4gIGV4dHJhY3RTdHJ1Y3R1cmVkUXVlc3Rpb25zRnJvbUFzc2lzdGFudFRleHQsXG4gIG1lcmdlUG9zdEFuYWx5c2lzUXVlc3Rpb25zLFxuICBhbmFseXplSm9iLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL2dvYWxzLmpzIFx1MjAxNCBHZW5lcmF0aW9uIEdvYWxzIGNvbmZpZ3VyYXRpb24gdGFiLlxuICpcbiAqIEFsbG93cyB0aGUgdXNlciB0byBzZXQgZG9jdW1lbnQtbGVuZ3RoIGFuZCBjaGFyYWN0ZXItY291bnQgY29uc3RyYWludHMgdGhhdFxuICogYXJlIGluamVjdGVkIGludG8gZXZlcnkgTExNIHByb21wdCBhbmQgdXNlZCB0byBjb250cm9sIHRoZSBmaW5hbCBQREYgbGVuZ3RoLlxuICpcbiAqIEZpZWxkczpcbiAqICAgcGRmX3BhZ2VzX2VuYWJsZWQgICAgXHUyMDE0IHdoZXRoZXIgdGhlIFBERiBwYWdlIGdvYWwgaXMgYWN0aXZlXG4gKiAgIG1heF9wZGZfcGFnZXNfbW9kZSAgIFx1MjAxNCAnY29tYmluZWQnIHwgJ3NwbGl0J1xuICogICBtYXhfcGRmX3BhZ2VzICAgICAgICBcdTIwMTQgY29tYmluZWQgdG90YWwgUERGIHBhZ2UgZ29hbCAobW9kZT1jb21iaW5lZClcbiAqICAgbWF4X3BkZl9yZXN1bWVfcGFnZXMgXHUyMDE0IHJlc3VtZS1wb3J0aW9uIHBhZ2UgZ29hbCAobW9kZT1zcGxpdClcbiAqICAgbWF4X3BkZl9jdl9wYWdlcyAgICAgXHUyMDE0IENWL3B1YmxpY2F0aW9ucyBwb3J0aW9uIHBhZ2UgZ29hbCAobW9kZT1zcGxpdClcbiAqICAgYXRzX3BhZ2VzX2VuYWJsZWQgICAgXHUyMDE0IHdoZXRoZXIgdGhlIEFUUyBwYWdlIGdvYWwgaXMgYWN0aXZlXG4gKiAgIG1heF9hdHNfcGFnZXMgICAgICAgIFx1MjAxNCB0YXJnZXQgcGFnZSBjb3VudCBmb3IgQVRTIHBsYWluLXRleHQgb3V0cHV0XG4gKiAgIGF0c19jaGFyc19lbmFibGVkICAgIFx1MjAxNCB3aGV0aGVyIHRoZSBBVFMgY2hhcmFjdGVyIGxpbWl0IGlzIGFjdGl2ZSAoZGVmYXVsdCBmYWxzZSlcbiAqICAgbWF4X2F0c19jaGFycyAgICAgICAgXHUyMDE0IG1heGltdW0gY2hhcmFjdGVycyAoaW5jbHVkaW5nIHNwYWNlcykgZm9yIEFUUyB0ZXh0XG4gKlxuICogRWFjaCBnb2FsIGhhcyBhIGNoZWNrYm94IHRvIGVuYWJsZSBvciBkaXNhYmxlIGl0OyBkaXNhYmxlZCBnb2FscyBhcmUgbm90XG4gKiBzZW50IHRvIHRoZSBiYWNrZW5kIGFuZCBhcmUgbm90IGluamVjdGVkIGludG8gcHJvbXB0cy5cbiAqXG4gKiBERVBFTkRFTkNJRVMgKGF2YWlsYWJsZSBvbiBnbG9iYWxUaGlzIHZpYSBtYWluLmpzKTpcbiAqICAgYXBpQ2FsbCAoYXBpLWNsaWVudC5qcylcbiAqL1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5cbmNvbnN0IGxvZyA9IGdldExvZ2dlcignZ29hbHMnKTtcblxuY29uc3QgR09BTFNfREVGQVVMVFMgPSB7XG4gIHBkZl9wYWdlc19lbmFibGVkOiAgICB0cnVlLFxuICBtYXhfcGRmX3BhZ2VzX21vZGU6ICAgJ2NvbWJpbmVkJyxcbiAgbWF4X3BkZl9wYWdlczogICAgICAgIDIsXG4gIG1heF9wZGZfcmVzdW1lX3BhZ2VzOiAyLFxuICBtYXhfcGRmX2N2X3BhZ2VzOiAgICAgMSxcbiAgYXRzX3BhZ2VzX2VuYWJsZWQ6ICAgIHRydWUsXG4gIG1heF9hdHNfcGFnZXM6ICAgICAgICAxLFxuICBhdHNfY2hhcnNfZW5hYmxlZDogICAgZmFsc2UsXG4gIG1heF9hdHNfY2hhcnM6ICAgICAgICA1MDAwLFxufTtcblxuLyoqIFNoYXJlZCBpbmxpbmUgc3R5bGVzICovXG5jb25zdCBTID0ge1xuICBzZWN0aW9uOiAgICAnbWFyZ2luLWJvdHRvbToyMHB4O2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyLCNlMGUwZTApO2JvcmRlci1yYWRpdXM6NnB4O3BhZGRpbmc6MTZweCcsXG4gIGhlYWRlcjogICAgICdkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDoxMHB4O21hcmdpbi1ib3R0b206MTJweCcsXG4gIGNoZWNrYm94OiAgICd3aWR0aDoxNnB4O2hlaWdodDoxNnB4O2N1cnNvcjpwb2ludGVyO2ZsZXgtc2hyaW5rOjAnLFxuICBsYWJlbDogICAgICAnZm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxcmVtO2N1cnNvcjpwb2ludGVyO21hcmdpbjowJyxcbiAgaGludDogICAgICAgJ2ZvbnQtc2l6ZTowLjg3NXJlbTtjb2xvcjp2YXIoLS10ZXh0LXNlY29uZGFyeSwjNTU1KTttYXJnaW46MCAwIDhweCcsXG4gIG51bUlucHV0OiAgICdwYWRkaW5nOjZweCAxMHB4O2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyLCNjY2MpO2JvcmRlci1yYWRpdXM6NHB4O2ZvbnQtc2l6ZToxcmVtJyxcbiAgcm93OiAgICAgICAgJ2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweCcsXG4gIG11dGVkOiAgICAgICdjb2xvcjp2YXIoLS10ZXh0LXNlY29uZGFyeSwjNTU1KScsXG4gIHJhZGlvTGFiZWw6ICdkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6ZmxleC1zdGFydDtnYXA6OHB4O2N1cnNvcjpwb2ludGVyJyxcbiAgcmFkaW9JbnB1dDogJ21hcmdpbi10b3A6M3B4Jyxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwb3B1bGF0ZUdvYWxzVGFiKCkge1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgaWYgKCFjb250ZW50KSByZXR1cm47XG5cbiAgY29udGVudC5pbm5lckhUTUwgPSBgXG4gICAgPGRpdiBjbGFzcz1cImdvYWxzLXBhbmVsXCIgc3R5bGU9XCJtYXgtd2lkdGg6NjQwcHg7bWFyZ2luOjAgYXV0bztwYWRkaW5nOjI4cHggMjRweFwiPlxuICAgICAgPGgyIHN0eWxlPVwibWFyZ2luLXRvcDowO21hcmdpbi1ib3R0b206OHB4XCI+XHVEODNDXHVERkFGIEdlbmVyYXRpb24gR29hbHM8L2gyPlxuICAgICAgPHAgc3R5bGU9XCIke1MubXV0ZWR9O21hcmdpbi1ib3R0b206MjRweDtsaW5lLWhlaWdodDoxLjVcIj5cbiAgICAgICAgU2V0IG9wdGlvbmFsIGxlbmd0aCBjb25zdHJhaW50cyBmb3IgdGhlIGdlbmVyYXRlZCBDVi5cbiAgICAgICAgQ2hlY2sgZWFjaCBnb2FsIHlvdSB3YW50IHRvIGVuZm9yY2U7IHVuY2hlY2tlZCBnb2FscyBhcmUgaWdub3JlZC5cbiAgICAgICAgVGhlc2UgZ3VpZGUgdGhlIEFJIGF0IGV2ZXJ5IGVkaXRpbmcgc3RhZ2UgYW5kIGNvbnRyb2wgdGhlIGZpbmFsIGRvY3VtZW50IGxlbmd0aC5cbiAgICAgIDwvcD5cblxuICAgICAgPCEtLSBcdTI1MDBcdTI1MDAgUERGIFBhZ2UgTGVuZ3RoIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMCAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJnb2Fscy1zZWN0aW9uXCIgc3R5bGU9XCIke1Muc2VjdGlvbn1cIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cIiR7Uy5oZWFkZXJ9XCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiZ29hbHMtcGRmLWVuYWJsZWRcIlxuICAgICAgICAgICAgICAgICBvbmNoYW5nZT1cImdvYWxzVG9nZ2xlU2VjdGlvbigncGRmJylcIlxuICAgICAgICAgICAgICAgICBjaGVja2VkIHN0eWxlPVwiJHtTLmNoZWNrYm94fVwiPlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJnb2Fscy1wZGYtZW5hYmxlZFwiIHN0eWxlPVwiJHtTLmxhYmVsfVwiPlBERiBQYWdlIExlbmd0aDwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwiZ29hbHMtcGRmLWJvZHlcIj5cbiAgICAgICAgICA8cCBzdHlsZT1cIiR7Uy5oaW50fVwiPlxuICAgICAgICAgICAgVGFyZ2V0IHBhZ2UgY291bnQgZm9yIHRoZSBodW1hbi1yZWFkYWJsZSBQREYgKGUuZy4gMVx1MjAxMzMpLlxuICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtnYXA6MTJweFwiPlxuXG4gICAgICAgICAgICA8IS0tIFx1MjUwMFx1MjUwMCBTaW5nbGUgdG90YWwgb3B0aW9uIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMCAtLT5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBzdHlsZT1cIiR7Uy5yYWRpb0xhYmVsfVwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwiZ29hbHMtcGRmLW1vZGVcIiB2YWx1ZT1cImNvbWJpbmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJnb2Fscy1wZGYtbW9kZS1jb21iaW5lZFwiXG4gICAgICAgICAgICAgICAgICAgICAgIG9uY2hhbmdlPVwiZ29hbHNVcGRhdGVQZGZNb2RlKClcIiBjaGVja2VkXG4gICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiJHtTLnJhZGlvSW5wdXR9XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgICAgICA8c3Ryb25nPlNpbmdsZSB0b3RhbDwvc3Ryb25nPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtc2l6ZTowLjg3NXJlbTske1MubXV0ZWR9O21hcmdpbi10b3A6MnB4XCI+XG4gICAgICAgICAgICAgICAgICAgIE9uZSBwYWdlIGdvYWwgY292ZXJpbmcgdGhlIGVudGlyZSBkb2N1bWVudCwgaW5jbHVkaW5nXG4gICAgICAgICAgICAgICAgICAgIHB1YmxpY2F0aW9ucyBhbmQgY2l0YXRpb25zLlxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGRpdiBpZD1cImdvYWxzLXBkZi1jb21iaW5lZFwiXG4gICAgICAgICAgICAgICAgICAgc3R5bGU9XCJwYWRkaW5nLWxlZnQ6MjRweDttYXJnaW4tdG9wOjhweDske1Mucm93fVwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJnb2Fscy1tYXgtcGRmLXBhZ2VzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgbWluPVwiMVwiIG1heD1cIjEwXCIgc3RlcD1cIjFcIlxuICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT1cIiR7R09BTFNfREVGQVVMVFMubWF4X3BkZl9wYWdlc31cIlxuICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOjkwcHg7JHtTLm51bUlucHV0fVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiJHtTLm11dGVkfVwiPnBhZ2VzIHRvdGFsPC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIFx1MjUwMFx1MjUwMCBTcGxpdCBwb3J0aW9ucyBvcHRpb24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwIC0tPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIHN0eWxlPVwiJHtTLnJhZGlvTGFiZWx9XCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJnb2Fscy1wZGYtbW9kZVwiIHZhbHVlPVwic3BsaXRcIlxuICAgICAgICAgICAgICAgICAgICAgICBpZD1cImdvYWxzLXBkZi1tb2RlLXNwbGl0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgb25jaGFuZ2U9XCJnb2Fsc1VwZGF0ZVBkZk1vZGUoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiJHtTLnJhZGlvSW5wdXR9XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgICAgICA8c3Ryb25nPlNwbGl0IHBvcnRpb25zPC9zdHJvbmc+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC1zaXplOjAuODc1cmVtOyR7Uy5tdXRlZH07bWFyZ2luLXRvcDoycHhcIj5cbiAgICAgICAgICAgICAgICAgICAgU2VwYXJhdGUgcGFnZSBnb2FscyBmb3IgdGhlIHJlc3VtZSBwb3J0aW9uIChleHBlcmllbmNlLCBza2lsbHMpXG4gICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgQ1YvcHVibGljYXRpb25zIHBvcnRpb24gKGNpdGF0aW9ucywgcHVibGljYXRpb25zKS5cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxkaXYgaWQ9XCJnb2Fscy1wZGYtc3BsaXRcIlxuICAgICAgICAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZy1sZWZ0OjI0cHg7bWFyZ2luLXRvcDo4cHg7ZGlzcGxheTpub25lO2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtnYXA6OHB4XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cIiR7Uy5yb3d9XCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWwgc3R5bGU9XCJtaW4td2lkdGg6MTg1cHg7Zm9udC1zaXplOjAuOXJlbVwiPlJlc3VtZSBwb3J0aW9uOjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiZ29hbHMtbWF4LXBkZi1yZXN1bWUtcGFnZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIG1pbj1cIjFcIiBtYXg9XCIxMFwiIHN0ZXA9XCIxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT1cIiR7R09BTFNfREVGQVVMVFMubWF4X3BkZl9yZXN1bWVfcGFnZXN9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOjkwcHg7JHtTLm51bUlucHV0fVwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCIke1MubXV0ZWR9XCI+cGFnZXM8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cIiR7Uy5yb3d9XCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWwgc3R5bGU9XCJtaW4td2lkdGg6MTg1cHg7Zm9udC1zaXplOjAuOXJlbVwiPkNWIC8gUHVibGljYXRpb25zIHBvcnRpb246PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJnb2Fscy1tYXgtcGRmLWN2LXBhZ2VzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICBtaW49XCIxXCIgbWF4PVwiMTBcIiBzdGVwPVwiMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCIke0dPQUxTX0RFRkFVTFRTLm1heF9wZGZfY3ZfcGFnZXN9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOjkwcHg7JHtTLm51bUlucHV0fVwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCIke1MubXV0ZWR9XCI+cGFnZXM8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8L2Rpdj48IS0tIGVuZCBtb2RlIG9wdGlvbnMgY29sdW1uIC0tPlxuICAgICAgICA8L2Rpdj48IS0tIGVuZCBnb2Fscy1wZGYtYm9keSAtLT5cbiAgICAgIDwvZGl2PjwhLS0gZW5kIFBERiBzZWN0aW9uIC0tPlxuXG4gICAgICA8IS0tIFx1MjUwMFx1MjUwMCBBVFMgUGxhaW4tVGV4dCBQYWdlIExlbmd0aCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDAgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiZ29hbHMtc2VjdGlvblwiIHN0eWxlPVwiJHtTLnNlY3Rpb259XCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCIke1MuaGVhZGVyfVwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImdvYWxzLWF0cy1wYWdlcy1lbmFibGVkXCJcbiAgICAgICAgICAgICAgICAgb25jaGFuZ2U9XCJnb2Fsc1RvZ2dsZVNlY3Rpb24oJ2F0cy1wYWdlcycpXCJcbiAgICAgICAgICAgICAgICAgY2hlY2tlZCBzdHlsZT1cIiR7Uy5jaGVja2JveH1cIj5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwiZ29hbHMtYXRzLXBhZ2VzLWVuYWJsZWRcIiBzdHlsZT1cIiR7Uy5sYWJlbH1cIj5BVFMgUGxhaW4tVGV4dCBQYWdlIExlbmd0aDwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwiZ29hbHMtYXRzLXBhZ2VzLWJvZHlcIj5cbiAgICAgICAgICA8cCBzdHlsZT1cIiR7Uy5oaW50fVwiPlxuICAgICAgICAgICAgVGFyZ2V0IG51bWJlciBvZiBwYWdlcyBmb3IgdGhlIEFUUy1vcHRpbWlzZWQgcGxhaW4tdGV4dCBvdXRwdXQgKHR5cGljYWxseSAxXHUyMDEzMikuXG4gICAgICAgICAgPC9wPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCIke1Mucm93fVwiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cImdvYWxzLW1heC1hdHMtcGFnZXNcIlxuICAgICAgICAgICAgICAgICAgIG1pbj1cIjFcIiBtYXg9XCI1XCIgc3RlcD1cIjFcIlxuICAgICAgICAgICAgICAgICAgIHZhbHVlPVwiJHtHT0FMU19ERUZBVUxUUy5tYXhfYXRzX3BhZ2VzfVwiXG4gICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDo5MHB4OyR7Uy5udW1JbnB1dH1cIj5cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiJHtTLm11dGVkfVwiPnBhZ2VzPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFx1MjUwMFx1MjUwMCBBVFMgQ2hhcmFjdGVyIENvdW50IChkaXNhYmxlZCBieSBkZWZhdWx0KSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDAgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiZ29hbHMtc2VjdGlvblwiIHN0eWxlPVwiJHtTLnNlY3Rpb259O21hcmdpbi1ib3R0b206MjhweFwiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiJHtTLmhlYWRlcn1cIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJnb2Fscy1hdHMtY2hhcnMtZW5hYmxlZFwiXG4gICAgICAgICAgICAgICAgIG9uY2hhbmdlPVwiZ29hbHNUb2dnbGVTZWN0aW9uKCdhdHMtY2hhcnMnKVwiXG4gICAgICAgICAgICAgICAgIHN0eWxlPVwiJHtTLmNoZWNrYm94fVwiPlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJnb2Fscy1hdHMtY2hhcnMtZW5hYmxlZFwiIHN0eWxlPVwiJHtTLmxhYmVsfVwiPkFUUyBDaGFyYWN0ZXIgQ291bnQgTGltaXQ8L2xhYmVsPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjAuOHJlbTske1MubXV0ZWR9O2ZvbnQtc3R5bGU6aXRhbGljXCI+KG9wdGlvbmFsIFx1MjAxNCB1bmNvbW1vbik8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwiZ29hbHMtYXRzLWNoYXJzLWJvZHlcIiBzdHlsZT1cIm9wYWNpdHk6MC40O3BvaW50ZXItZXZlbnRzOm5vbmVcIj5cbiAgICAgICAgICA8cCBzdHlsZT1cIiR7Uy5oaW50fVwiPlxuICAgICAgICAgICAgTWF4aW11bSBjaGFyYWN0ZXJzIChpbmNsdWRpbmcgc3BhY2VzKSBpbiB0aGUgQVRTIHBsYWluLXRleHQgb3V0cHV0LlxuICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiJHtTLnJvd31cIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJnb2Fscy1tYXgtYXRzLWNoYXJzXCJcbiAgICAgICAgICAgICAgICAgICBtaW49XCI1MDBcIiBtYXg9XCIyMDAwMFwiIHN0ZXA9XCIxMDBcIlxuICAgICAgICAgICAgICAgICAgIHZhbHVlPVwiJHtHT0FMU19ERUZBVUxUUy5tYXhfYXRzX2NoYXJzfVwiXG4gICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDoxMTBweDske1MubnVtSW5wdXR9XCI+XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cIiR7Uy5tdXRlZH1cIj5jaGFyYWN0ZXJzPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFx1MjUwMFx1MjUwMCBHZW5lcmF0aW9uIFNldHRpbmdzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMCAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJnb2Fscy1zZWN0aW9uXCIgc3R5bGU9XCIke1Muc2VjdGlvbn07bWFyZ2luLWJvdHRvbToyOHB4XCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCIke1MuaGVhZGVyfVwiPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjEuMXJlbVwiPlx1MjY5OVx1RkUwRjwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cIiR7Uy5sYWJlbH1cIj5HZW5lcmF0aW9uIFNldHRpbmdzPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHAgc3R5bGU9XCIke1MuaGludH1cIj5cbiAgICAgICAgICBDb250cm9scyB0aGUgc2hhcGUgb2YgdGhlIGdlbmVyYXRlZCBDViBcdTIwMTQgYXBwbGllZCBkdXJpbmcgY3VzdG9taXphdGlvbiBhbmQgcmV3cml0ZSBzdGVwcy5cbiAgICAgICAgPC9wPlxuXG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2dhcDoxNHB4XCI+XG4gICAgICAgICAgPCEtLSBNYXggc2tpbGxzIC0tPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDoxMnB4O2ZsZXgtd3JhcDp3cmFwXCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwiZ29hbHMtbWF4LXNraWxscy1pbnB1dFwiIHN0eWxlPVwiZm9udC1zaXplOjAuOXJlbTtjb2xvcjojNGI1NTYzO3doaXRlLXNwYWNlOm5vd3JhcDttaW4td2lkdGg6MTYwcHhcIj5cbiAgICAgICAgICAgICAgTWF4IHNraWxscyBpbiBDVjpcbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhbmdlXCIgaWQ9XCJnb2Fscy1tYXgtc2tpbGxzLWlucHV0XCIgbWluPVwiMVwiIG1heD1cIjYwXCIgc3RlcD1cIjFcIiB2YWx1ZT1cIjIwXCJcbiAgICAgICAgICAgICAgICAgICBvbmlucHV0PVwiZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLW1heC1za2lsbHMtdmFsdWUnKS50ZXh0Q29udGVudD10aGlzLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICBvbmNoYW5nZT1cImdvYWxzQXV0b1NhdmVTZXR0aW5ncygpXCJcbiAgICAgICAgICAgICAgICAgICBzdHlsZT1cImZsZXg6MTttaW4td2lkdGg6MTIwcHg7YWNjZW50LWNvbG9yOiMzYjgyZjZcIj5cbiAgICAgICAgICAgIDxzcGFuIGlkPVwiZ29hbHMtbWF4LXNraWxscy12YWx1ZVwiIHN0eWxlPVwiZm9udC13ZWlnaHQ6NjAwO2NvbG9yOiMxZTI5M2I7bWluLXdpZHRoOjJlbTt0ZXh0LWFsaWduOnJpZ2h0XCI+MjA8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjgyZW07JHtTLm11dGVkfVwiPihkZWZhdWx0OiAyMCk8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIFNraWxscyBzZWN0aW9uIHRpdGxlIC0tPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDoxMnB4O2ZsZXgtd3JhcDp3cmFwXCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwiZ29hbHMtc2tpbGxzLXRpdGxlLXNlbGVjdFwiIHN0eWxlPVwiZm9udC1zaXplOjAuOXJlbTtjb2xvcjojNGI1NTYzO3doaXRlLXNwYWNlOm5vd3JhcDttaW4td2lkdGg6MTYwcHhcIj5cbiAgICAgICAgICAgICAgU2tpbGxzIHNlY3Rpb24gdGl0bGU6XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPHNlbGVjdCBpZD1cImdvYWxzLXNraWxscy10aXRsZS1zZWxlY3RcIlxuICAgICAgICAgICAgICAgICAgICBvbmNoYW5nZT1cImdvYWxzT25Ta2lsbHNUaXRsZVNlbGVjdCgpXCJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6MC45ZW07Ym9yZGVyOjFweCBzb2xpZCAjZDFkNWRiO2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMWUyOTNiXCI+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJTa2lsbHNcIj5Ta2lsbHM8L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlRlY2huaWNhbCBTa2lsbHNcIj5UZWNobmljYWwgU2tpbGxzPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJLZXkgU2tpbGxzXCI+S2V5IFNraWxsczwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiQ29yZSBTa2lsbHNcIj5Db3JlIFNraWxsczwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiX19jdXN0b21fX1wiPkN1c3RvbVx1MjAyNjwvb3B0aW9uPlxuICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImdvYWxzLXNraWxscy10aXRsZS1jdXN0b21cIiBwbGFjZWhvbGRlcj1cIkVudGVyIGN1c3RvbSB0aXRsZVwiXG4gICAgICAgICAgICAgICAgICAgb25jaGFuZ2U9XCJnb2Fsc0F1dG9TYXZlU2V0dGluZ3MoKVwiXG4gICAgICAgICAgICAgICAgICAgc3R5bGU9XCJkaXNwbGF5Om5vbmU7Zm9udC1zaXplOjAuOWVtO2JvcmRlcjoxcHggc29saWQgI2QxZDVkYjtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjRweCA4cHg7Y29sb3I6IzFlMjkzYjttaW4td2lkdGg6MTYwcHhcIj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxzcGFuIGlkPVwiZ29hbHMtc2V0dGluZ3Mtc3RhdHVzXCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO21hcmdpbi10b3A6OHB4O2ZvbnQtc2l6ZTowLjgycmVtO3RyYW5zaXRpb246Y29sb3IgMC4yc1wiPjwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IHN0eWxlPVwiJHtTLnJvd307Z2FwOjE0cHhcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInNhdmUtZ29hbHMtYnRuXCJcbiAgICAgICAgICAgICAgICBvbmNsaWNrPVwic2F2ZUdlbmVyYXRpb25Hb2FscygpXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1wcmltYXJ5XCJcbiAgICAgICAgICAgICAgICBzdHlsZT1cInBhZGRpbmc6OHB4IDIycHg7Zm9udC1zaXplOjAuOTVyZW1cIj5cbiAgICAgICAgICBTYXZlIEdvYWxzXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8c3BhbiBpZD1cImdvYWxzLXN0YXR1c1wiXG4gICAgICAgICAgICAgIHN0eWxlPVwiZm9udC1zaXplOjAuODc1cmVtO3RyYW5zaXRpb246Y29sb3IgMC4yc1wiPjwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgO1xuXG4gIC8vIFJlc3RvcmUgc2F2ZWQgZ29hbHMgZnJvbSB0aGUgYmFja2VuZCBzZXNzaW9uIHN0YXRlLlxuICBhd2FpdCBfbG9hZEdvYWxzRnJvbVN0YXR1cygpO1xufVxuXG4vKipcbiAqIFRvZ2dsZSB0aGUgZW5hYmxlZC9kaXNhYmxlZCBhcHBlYXJhbmNlIG9mIGEgZ29hbCBzZWN0aW9uLlxuICogRXhwb3J0ZWQgc28gdGhlIGlubGluZSBvbmNoYW5nZT1cImdvYWxzVG9nZ2xlU2VjdGlvbiguLi4pXCIgaGFuZGxlcnMgd29yay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdvYWxzVG9nZ2xlU2VjdGlvbihzZWN0aW9uKSB7XG4gIGNvbnN0IE1BUCA9IHtcbiAgICAncGRmJzogICAgICAgeyBjYjogJ2dvYWxzLXBkZi1lbmFibGVkJywgICAgICAgYm9keTogJ2dvYWxzLXBkZi1ib2R5JyAgICAgICB9LFxuICAgICdhdHMtcGFnZXMnOiB7IGNiOiAnZ29hbHMtYXRzLXBhZ2VzLWVuYWJsZWQnLCBib2R5OiAnZ29hbHMtYXRzLXBhZ2VzLWJvZHknIH0sXG4gICAgJ2F0cy1jaGFycyc6IHsgY2I6ICdnb2Fscy1hdHMtY2hhcnMtZW5hYmxlZCcsIGJvZHk6ICdnb2Fscy1hdHMtY2hhcnMtYm9keScgfSxcbiAgfTtcbiAgY29uc3Qgc2VsID0gTUFQW3NlY3Rpb25dO1xuICBpZiAoIXNlbCkgcmV0dXJuO1xuICBjb25zdCBjYiAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc2VsLmNiKTtcbiAgY29uc3QgYm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHNlbC5ib2R5KTtcbiAgaWYgKCFjYiB8fCAhYm9keSkgcmV0dXJuO1xuICBib2R5LnN0eWxlLm9wYWNpdHkgICAgICAgPSBjYi5jaGVja2VkID8gJzEnICAgIDogJzAuNCc7XG4gIGJvZHkuc3R5bGUucG9pbnRlckV2ZW50cyA9IGNiLmNoZWNrZWQgPyAnYXV0bycgOiAnbm9uZSc7XG59XG5cbi8qKlxuICogU2hvdy9oaWRlIGNvbWJpbmVkIHZzIHNwbGl0IFBERiBwYWdlIGlucHV0cyB3aGVuIHRoZSBtb2RlIHJhZGlvIGNoYW5nZXMuXG4gKiBFeHBvcnRlZCBzbyB0aGUgaW5saW5lIG9uY2hhbmdlPVwiZ29hbHNVcGRhdGVQZGZNb2RlKClcIiBoYW5kbGVyIHdvcmtzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ29hbHNVcGRhdGVQZGZNb2RlKCkge1xuICBjb25zdCBjb21iaW5lZFJhZGlvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLXBkZi1tb2RlLWNvbWJpbmVkJyk7XG4gIGNvbnN0IGlzQ29tYmluZWQgICAgPSBjb21iaW5lZFJhZGlvPy5jaGVja2VkID8/IHRydWU7XG4gIGNvbnN0IGNvbWJpbmVkRGl2ICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtcGRmLWNvbWJpbmVkJyk7XG4gIGNvbnN0IHNwbGl0RGl2ICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtcGRmLXNwbGl0Jyk7XG4gIGlmIChjb21iaW5lZERpdikgY29tYmluZWREaXYuc3R5bGUuZGlzcGxheSA9IGlzQ29tYmluZWQgPyAnZmxleCcgICA6ICdub25lJztcbiAgaWYgKHNwbGl0RGl2KSAgICBzcGxpdERpdi5zdHlsZS5kaXNwbGF5ICAgID0gaXNDb21iaW5lZCA/ICdub25lJyAgIDogJ2ZsZXgnO1xufVxuXG4vKipcbiAqIEZldGNoIGN1cnJlbnQgZ2VuZXJhdGlvbiBnb2FscyBmcm9tIHRoZSBzZXNzaW9uIGFuZCBwb3B1bGF0ZSB0aGUgZm9ybSBpbnB1dHMuXG4gKiBAcHJpdmF0ZVxuICovXG5hc3luYyBmdW5jdGlvbiBfbG9hZEdvYWxzRnJvbVN0YXR1cygpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBkYXRhICA9IGF3YWl0IGFwaUNhbGwoJ0dFVCcsICcvYXBpL3N0YXR1cycpO1xuICAgIGNvbnN0IGdvYWxzID0gZGF0YT8uZ2VuZXJhdGlvbl9nb2FscztcbiAgICBpZiAoIWdvYWxzKSByZXR1cm47XG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgRW5hYmxlZCBjaGVja2JveGVzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIGNvbnN0IHBkZkVuYWJsZWRDYiAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLXBkZi1lbmFibGVkJyk7XG4gICAgY29uc3QgYXRzUGFnZUVuYWJsZWRDYiAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtYXRzLXBhZ2VzLWVuYWJsZWQnKTtcbiAgICBjb25zdCBhdHNDaGFyc0VuYWJsZWRDYiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb2Fscy1hdHMtY2hhcnMtZW5hYmxlZCcpO1xuXG4gICAgaWYgKHBkZkVuYWJsZWRDYiAgICAgICYmIGdvYWxzLnBkZl9wYWdlc19lbmFibGVkICAhPSBudWxsKSBwZGZFbmFibGVkQ2IuY2hlY2tlZCAgICAgID0gZ29hbHMucGRmX3BhZ2VzX2VuYWJsZWQ7XG4gICAgaWYgKGF0c1BhZ2VFbmFibGVkQ2IgICYmIGdvYWxzLmF0c19wYWdlc19lbmFibGVkICAhPSBudWxsKSBhdHNQYWdlRW5hYmxlZENiLmNoZWNrZWQgID0gZ29hbHMuYXRzX3BhZ2VzX2VuYWJsZWQ7XG4gICAgaWYgKGF0c0NoYXJzRW5hYmxlZENiICYmIGdvYWxzLmF0c19jaGFyc19lbmFibGVkICAhPSBudWxsKSBhdHNDaGFyc0VuYWJsZWRDYi5jaGVja2VkID0gZ29hbHMuYXRzX2NoYXJzX2VuYWJsZWQ7XG5cbiAgICBnb2Fsc1RvZ2dsZVNlY3Rpb24oJ3BkZicpO1xuICAgIGdvYWxzVG9nZ2xlU2VjdGlvbignYXRzLXBhZ2VzJyk7XG4gICAgZ29hbHNUb2dnbGVTZWN0aW9uKCdhdHMtY2hhcnMnKTtcblxuICAgIC8vIFx1MjUwMFx1MjUwMCBQREYgbW9kZSByYWRpbyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICBpZiAoZ29hbHMubWF4X3BkZl9wYWdlc19tb2RlKSB7XG4gICAgICBjb25zdCByYWRpbyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgIGBpbnB1dFtuYW1lPVwiZ29hbHMtcGRmLW1vZGVcIl1bdmFsdWU9XCIke2dvYWxzLm1heF9wZGZfcGFnZXNfbW9kZX1cIl1gKTtcbiAgICAgIGlmIChyYWRpbykgcmFkaW8uY2hlY2tlZCA9IHRydWU7XG4gICAgICBnb2Fsc1VwZGF0ZVBkZk1vZGUoKTtcbiAgICB9XG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgTnVtZXJpYyB2YWx1ZXMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgY29uc3QgcGRmSW5wdXQgICAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLW1heC1wZGYtcGFnZXMnKTtcbiAgICBjb25zdCBwZGZSZXN1bWVJbnB1dCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtbWF4LXBkZi1yZXN1bWUtcGFnZXMnKTtcbiAgICBjb25zdCBwZGZDdklucHV0ICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtbWF4LXBkZi1jdi1wYWdlcycpO1xuICAgIGNvbnN0IGF0c1BhZ2VJbnB1dCAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb2Fscy1tYXgtYXRzLXBhZ2VzJyk7XG4gICAgY29uc3QgYXRzQ2hhcklucHV0ICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLW1heC1hdHMtY2hhcnMnKTtcblxuICAgIGlmIChwZGZJbnB1dCAgICAgICAmJiBnb2Fscy5tYXhfcGRmX3BhZ2VzICAgICAgICAgIT0gbnVsbCkgcGRmSW5wdXQudmFsdWUgICAgICAgPSBnb2Fscy5tYXhfcGRmX3BhZ2VzO1xuICAgIGlmIChwZGZSZXN1bWVJbnB1dCAmJiBnb2Fscy5tYXhfcGRmX3Jlc3VtZV9wYWdlcyAgIT0gbnVsbCkgcGRmUmVzdW1lSW5wdXQudmFsdWUgPSBnb2Fscy5tYXhfcGRmX3Jlc3VtZV9wYWdlcztcbiAgICBpZiAocGRmQ3ZJbnB1dCAgICAgJiYgZ29hbHMubWF4X3BkZl9jdl9wYWdlcyAgICAgICE9IG51bGwpIHBkZkN2SW5wdXQudmFsdWUgICAgID0gZ29hbHMubWF4X3BkZl9jdl9wYWdlcztcbiAgICBpZiAoYXRzUGFnZUlucHV0ICAgJiYgZ29hbHMubWF4X2F0c19wYWdlcyAgICAgICAgICE9IG51bGwpIGF0c1BhZ2VJbnB1dC52YWx1ZSAgID0gZ29hbHMubWF4X2F0c19wYWdlcztcbiAgICBpZiAoYXRzQ2hhcklucHV0ICAgJiYgZ29hbHMubWF4X2F0c19jaGFycyAgICAgICAgICE9IG51bGwpIGF0c0NoYXJJbnB1dC52YWx1ZSAgID0gZ29hbHMubWF4X2F0c19jaGFycztcblxuICAgIC8vIFx1MjUwMFx1MjUwMCBHZW5lcmF0aW9uIFNldHRpbmdzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIGNvbnN0IG1heFNraWxsc1NsaWRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb2Fscy1tYXgtc2tpbGxzLWlucHV0Jyk7XG4gICAgY29uc3QgbWF4U2tpbGxzTGFiZWwgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLW1heC1za2lsbHMtdmFsdWUnKTtcbiAgICBpZiAobWF4U2tpbGxzU2xpZGVyICYmIGRhdGEubWF4X3NraWxscyAhPSBudWxsKSB7XG4gICAgICBtYXhTa2lsbHNTbGlkZXIudmFsdWUgPSBkYXRhLm1heF9za2lsbHM7XG4gICAgICBpZiAobWF4U2tpbGxzTGFiZWwpIG1heFNraWxsc0xhYmVsLnRleHRDb250ZW50ID0gZGF0YS5tYXhfc2tpbGxzO1xuICAgIH1cbiAgICBjb25zdCBrbm93blRpdGxlcyA9IFsnU2tpbGxzJywgJ1RlY2huaWNhbCBTa2lsbHMnLCAnS2V5IFNraWxscycsICdDb3JlIFNraWxscyddO1xuICAgIGNvbnN0IGN1cnJlbnRUaXRsZSA9IGRhdGEuc2tpbGxzX3NlY3Rpb25fdGl0bGUgfHwgJ1NraWxscyc7XG4gICAgY29uc3QgdGl0bGVTZWxlY3QgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLXNraWxscy10aXRsZS1zZWxlY3QnKTtcbiAgICBjb25zdCB0aXRsZUN1c3RvbSAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtc2tpbGxzLXRpdGxlLWN1c3RvbScpO1xuICAgIGlmICh0aXRsZVNlbGVjdCkge1xuICAgICAgY29uc3QgaXNLbm93biA9IGtub3duVGl0bGVzLmluY2x1ZGVzKGN1cnJlbnRUaXRsZSk7XG4gICAgICB0aXRsZVNlbGVjdC52YWx1ZSA9IGlzS25vd24gPyBjdXJyZW50VGl0bGUgOiAnX19jdXN0b21fXyc7XG4gICAgICBpZiAodGl0bGVDdXN0b20pIHtcbiAgICAgICAgdGl0bGVDdXN0b20uc3R5bGUuZGlzcGxheSA9IGlzS25vd24gPyAnbm9uZScgOiAnJztcbiAgICAgICAgaWYgKCFpc0tub3duKSB0aXRsZUN1c3RvbS52YWx1ZSA9IGN1cnJlbnRUaXRsZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy53YXJuKCdGYWlsZWQgdG8gbG9hZCBnZW5lcmF0aW9uIGdvYWxzIGZyb20gYmFja2VuZDonLCBlcnIpO1xuICB9XG59XG5cbi8qKlxuICogUmVhZCB0aGUgZm9ybSBpbnB1dHMsIHZhbGlkYXRlLCBhbmQgUE9TVCB0byAvYXBpL2dlbmVyYXRpb24tZ29hbHMuXG4gKiBFeHBvc2VkIG9uIGdsb2JhbFRoaXMgc28gdGhlIGlubGluZSBvbmNsaWNrPVwic2F2ZUdlbmVyYXRpb25Hb2FscygpXCIgd29ya3MuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzYXZlR2VuZXJhdGlvbkdvYWxzKCkge1xuICBjb25zdCBzdGF0dXNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb2Fscy1zdGF0dXMnKTtcblxuICAvLyBcdTI1MDBcdTI1MDAgUmVhZCBlbmFibGVkIGZsYWdzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICBjb25zdCBwZGZFbmFibGVkICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtcGRmLWVuYWJsZWQnKT8uY2hlY2tlZCAgICAgID8/IHRydWU7XG4gIGNvbnN0IGF0c1BhZ2VFbmFibGVkICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb2Fscy1hdHMtcGFnZXMtZW5hYmxlZCcpPy5jaGVja2VkID8/IHRydWU7XG4gIGNvbnN0IGF0c0NoYXJzRW5hYmxlZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb2Fscy1hdHMtY2hhcnMtZW5hYmxlZCcpPy5jaGVja2VkID8/IGZhbHNlO1xuXG4gIC8vIFx1MjUwMFx1MjUwMCBSZWFkIFBERiBtb2RlIGFuZCB2YWx1ZXMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIGNvbnN0IHBkZk1vZGUgICAgICAgID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXRbbmFtZT1cImdvYWxzLXBkZi1tb2RlXCJdOmNoZWNrZWQnKT8udmFsdWUgPz8gJ2NvbWJpbmVkJztcbiAgY29uc3QgcGRmUGFnZXMgICAgICAgPSBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtbWF4LXBkZi1wYWdlcycpPy52YWx1ZSwgICAgICAgIDEwKTtcbiAgY29uc3QgcGRmUmVzdW1lUGFnZXMgPSBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtbWF4LXBkZi1yZXN1bWUtcGFnZXMnKT8udmFsdWUsIDEwKTtcbiAgY29uc3QgcGRmQ3ZQYWdlcyAgICAgPSBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtbWF4LXBkZi1jdi1wYWdlcycpPy52YWx1ZSwgICAgIDEwKTtcbiAgY29uc3QgYXRzUGFnZXMgICAgICAgPSBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtbWF4LWF0cy1wYWdlcycpPy52YWx1ZSwgICAgICAgIDEwKTtcbiAgY29uc3QgYXRzQ2hhcnMgICAgICAgPSBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtbWF4LWF0cy1jaGFycycpPy52YWx1ZSwgICAgICAgIDEwKTtcblxuICAvLyBcdTI1MDBcdTI1MDAgVmFsaWRhdGUgb25seSBlbmFibGVkIGZpZWxkcyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgaWYgKHBkZkVuYWJsZWQpIHtcbiAgICBpZiAocGRmTW9kZSA9PT0gJ2NvbWJpbmVkJykge1xuICAgICAgaWYgKCFwZGZQYWdlcyB8fCBwZGZQYWdlcyA8IDEgfHwgcGRmUGFnZXMgPiAxMCkge1xuICAgICAgICBfc2V0U3RhdHVzKHN0YXR1c0VsLCAnXHUyNkEwXHVGRTBGIFBERiBwYWdlcyBtdXN0IGJlIDFcdTIwMTMxMC4nLCAnd2FybicpOyByZXR1cm47XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghcGRmUmVzdW1lUGFnZXMgfHwgcGRmUmVzdW1lUGFnZXMgPCAxIHx8IHBkZlJlc3VtZVBhZ2VzID4gMTApIHtcbiAgICAgICAgX3NldFN0YXR1cyhzdGF0dXNFbCwgJ1x1MjZBMFx1RkUwRiBSZXN1bWUgcG9ydGlvbiBwYWdlcyBtdXN0IGJlIDFcdTIwMTMxMC4nLCAnd2FybicpOyByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoIXBkZkN2UGFnZXMgfHwgcGRmQ3ZQYWdlcyA8IDEgfHwgcGRmQ3ZQYWdlcyA+IDEwKSB7XG4gICAgICAgIF9zZXRTdGF0dXMoc3RhdHVzRWwsICdcdTI2QTBcdUZFMEYgQ1YgLyBQdWJsaWNhdGlvbnMgcG9ydGlvbiBwYWdlcyBtdXN0IGJlIDFcdTIwMTMxMC4nLCAnd2FybicpOyByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChhdHNQYWdlRW5hYmxlZCAgJiYgKCFhdHNQYWdlcyAgfHwgYXRzUGFnZXMgIDwgMSAgfHwgYXRzUGFnZXMgID4gNSkpICAgICB7IF9zZXRTdGF0dXMoc3RhdHVzRWwsICdcdTI2QTBcdUZFMEYgQVRTIHBhZ2VzIG11c3QgYmUgMVx1MjAxMzUuJywgICAgICAgICAgJ3dhcm4nKTsgcmV0dXJuOyB9XG4gIGlmIChhdHNDaGFyc0VuYWJsZWQgJiYgKCFhdHNDaGFycyAgfHwgYXRzQ2hhcnMgIDwgNTAwIHx8IGF0c0NoYXJzID4gMjAwMDApKSB7IF9zZXRTdGF0dXMoc3RhdHVzRWwsICdcdTI2QTBcdUZFMEYgQ2hhcmFjdGVycyBtdXN0IGJlIDUwMFx1MjAxMzIwIDAwMC4nLCAnd2FybicpOyByZXR1cm47IH1cblxuICAvLyBcdTI1MDBcdTI1MDAgQnVpbGQgcGF5bG9hZCAoaW5jbHVkZSBlbmFibGVkIGZsYWdzICsgYWN0aXZlIHZhbHVlcyBvbmx5KSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICBwZGZfcGFnZXNfZW5hYmxlZDogIHBkZkVuYWJsZWQsXG4gICAgYXRzX3BhZ2VzX2VuYWJsZWQ6ICBhdHNQYWdlRW5hYmxlZCxcbiAgICBhdHNfY2hhcnNfZW5hYmxlZDogIGF0c0NoYXJzRW5hYmxlZCxcbiAgICBtYXhfcGRmX3BhZ2VzX21vZGU6IHBkZk1vZGUsXG4gIH07XG5cbiAgaWYgKHBkZkVuYWJsZWQpIHtcbiAgICBpZiAocGRmTW9kZSA9PT0gJ2NvbWJpbmVkJykge1xuICAgICAgcGF5bG9hZC5tYXhfcGRmX3BhZ2VzID0gcGRmUGFnZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBheWxvYWQubWF4X3BkZl9yZXN1bWVfcGFnZXMgPSBwZGZSZXN1bWVQYWdlcztcbiAgICAgIHBheWxvYWQubWF4X3BkZl9jdl9wYWdlcyAgICAgPSBwZGZDdlBhZ2VzO1xuICAgIH1cbiAgfVxuICBpZiAoYXRzUGFnZUVuYWJsZWQpICBwYXlsb2FkLm1heF9hdHNfcGFnZXMgPSBhdHNQYWdlcztcbiAgaWYgKGF0c0NoYXJzRW5hYmxlZCkgcGF5bG9hZC5tYXhfYXRzX2NoYXJzID0gYXRzQ2hhcnM7XG5cbiAgX3NldFN0YXR1cyhzdGF0dXNFbCwgJ1NhdmluZ1x1MjAyNicsICdpbmZvJyk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBhcGlDYWxsKCdQT1NUJywgJy9hcGkvZ2VuZXJhdGlvbi1nb2FscycsIHBheWxvYWQpO1xuICAgIF9zZXRTdGF0dXMoc3RhdHVzRWwsICdcdTI3MTMgU2F2ZWQnLCAnb2snKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHsgaWYgKHN0YXR1c0VsKSBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICcnOyB9LCAzMDAwKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLmVycm9yKCdGYWlsZWQgdG8gc2F2ZSBnZW5lcmF0aW9uIGdvYWxzOicsIGVycik7XG4gICAgX3NldFN0YXR1cyhzdGF0dXNFbCwgJ1NhdmUgZmFpbGVkLiBQbGVhc2UgdHJ5IGFnYWluLicsICdlcnJvcicpO1xuICB9XG59XG5cbi8qKlxuICogU2hvdy9oaWRlIHRoZSBjdXN0b20tdGl0bGUgaW5wdXQgd2hlbiB0aGUgc2tpbGxzLXRpdGxlIHNlbGVjdCBjaGFuZ2VzLlxuICogRXhwb3J0ZWQgc28gdGhlIGlubGluZSBvbmNoYW5nZT1cImdvYWxzT25Ta2lsbHNUaXRsZVNlbGVjdCgpXCIgaGFuZGxlciB3b3Jrcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdvYWxzT25Ta2lsbHNUaXRsZVNlbGVjdCgpIHtcbiAgY29uc3Qgc2VsICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLXNraWxscy10aXRsZS1zZWxlY3QnKTtcbiAgY29uc3QgY3VzdG9tID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLXNraWxscy10aXRsZS1jdXN0b20nKTtcbiAgaWYgKCFzZWwpIHJldHVybjtcbiAgaWYgKHNlbC52YWx1ZSA9PT0gJ19fY3VzdG9tX18nKSB7XG4gICAgaWYgKGN1c3RvbSkgeyBjdXN0b20uc3R5bGUuZGlzcGxheSA9ICcnOyBjdXN0b20uZm9jdXMoKTsgfVxuICB9IGVsc2Uge1xuICAgIGlmIChjdXN0b20pIGN1c3RvbS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGdvYWxzQXV0b1NhdmVTZXR0aW5ncygpO1xuICB9XG59XG5cbi8qKlxuICogQXV0by1zYXZlIHRoZSBnZW5lcmF0aW9uIHNldHRpbmdzIChtYXhfc2tpbGxzICsgc2tpbGxzX3NlY3Rpb25fdGl0bGUpXG4gKiB2aWEgUE9TVCAvYXBpL2dlbmVyYXRpb24tc2V0dGluZ3Mgd2l0aG91dCBibG9ja2luZy5cbiAqIEV4cG9ydGVkIHNvIGlubGluZSBvbmNoYW5nZT1cImdvYWxzQXV0b1NhdmVTZXR0aW5ncygpXCIgaGFuZGxlcnMgd29yay5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdvYWxzQXV0b1NhdmVTZXR0aW5ncygpIHtcbiAgY29uc3Qgc3RhdHVzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtc2V0dGluZ3Mtc3RhdHVzJyk7XG4gIGNvbnN0IHNsaWRlciAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLW1heC1za2lsbHMtaW5wdXQnKTtcbiAgY29uc3Qgc2VsICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtc2tpbGxzLXRpdGxlLXNlbGVjdCcpO1xuICBjb25zdCBjdXN0b20gICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb2Fscy1za2lsbHMtdGl0bGUtY3VzdG9tJyk7XG5cbiAgY29uc3QgbWF4U2tpbGxzID0gc2xpZGVyID8gcGFyc2VJbnQoc2xpZGVyLnZhbHVlLCAxMCkgOiBudWxsO1xuICBjb25zdCB0aXRsZSAgICAgPSBzZWw/LnZhbHVlID09PSAnX19jdXN0b21fXydcbiAgICA/IChjdXN0b20/LnZhbHVlPy50cmltKCkgfHwgbnVsbClcbiAgICA6IChzZWw/LnZhbHVlIHx8IG51bGwpO1xuXG4gIGlmICghbWF4U2tpbGxzICYmICF0aXRsZSkgcmV0dXJuO1xuXG4gIGNvbnN0IHBheWxvYWQgPSB7fTtcbiAgaWYgKG1heFNraWxscyAmJiBtYXhTa2lsbHMgPj0gMSkgcGF5bG9hZC5tYXhfc2tpbGxzICAgICAgICAgID0gbWF4U2tpbGxzO1xuICBpZiAodGl0bGUpICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLnNraWxsc19zZWN0aW9uX3RpdGxlID0gdGl0bGU7XG5cbiAgX3NldFN0YXR1cyhzdGF0dXNFbCwgJ1NhdmluZ1x1MjAyNicsICdpbmZvJyk7XG4gIHRyeSB7XG4gICAgYXdhaXQgYXBpQ2FsbCgnUE9TVCcsICcvYXBpL2dlbmVyYXRpb24tc2V0dGluZ3MnLCBwYXlsb2FkKTtcbiAgICBfc2V0U3RhdHVzKHN0YXR1c0VsLCAnXHUyNzEzIFNhdmVkJywgJ29rJyk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7IGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnJzsgfSwgMjAwMCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy53YXJuKCdGYWlsZWQgdG8gc2F2ZSBnZW5lcmF0aW9uIHNldHRpbmdzOicsIGVycik7XG4gICAgX3NldFN0YXR1cyhzdGF0dXNFbCwgJ1NhdmUgZmFpbGVkJywgJ2Vycm9yJyk7XG4gIH1cbn1cblxuLyoqIEBwcml2YXRlICovXG5mdW5jdGlvbiBfc2V0U3RhdHVzKGVsLCBtZXNzYWdlLCBsZXZlbCkge1xuICBpZiAoIWVsKSByZXR1cm47XG4gIGNvbnN0IGNvbG91cnMgPSB7XG4gICAgb2s6ICAgICd2YXIoLS1zdWNjZXNzLCMyZTdkMzIpJyxcbiAgICBlcnJvcjogJ3ZhcigtLWRhbmdlciwjYzYyODI4KScsXG4gICAgd2FybjogICd2YXIoLS13YXJuaW5nLCNlNjUxMDApJyxcbiAgICBpbmZvOiAgJ3ZhcigtLXRleHQtc2Vjb25kYXJ5LCM1NTUpJyxcbiAgfTtcbiAgZWwuc3R5bGUuY29sb3IgID0gY29sb3Vyc1tsZXZlbF0gfHwgY29sb3Vycy5pbmZvO1xuICBlbC50ZXh0Q29udGVudCAgPSBtZXNzYWdlO1xufVxuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvc2Vzc2lvbi1tYW5hZ2VyLmpzXG4gKiBTZXNzaW9uIGxpZmVjeWNsZTogY3JlYXRlLCBjbGFpbSwgcmVzdG9yZSwgc2F2ZSwgbG9hZC5cbiAqIEFsc28gb3ducyBmb3JtYXRTZXNzaW9uUGhhc2VMYWJlbCBhbmQgcmVsYXRlZCBzZXNzaW9uLWxhYmVsIGhlbHBlcnMuXG4gKlxuICogREVQRU5ERU5DSUVTIChhbGwgb24gZ2xvYmFsVGhpcyBhdCBydW50aW1lKTpcbiAqICAgLSBjcmVhdGVTZXNzaW9uLCBmZXRjaFN0YXR1cyAoYXBpLWNsaWVudC5qcylcbiAqICAgLSBnZXRTZXNzaW9uSWRGcm9tVVJMLCBnZXRPd25lclRva2VuLCBTdG9yYWdlS2V5cywgZ2V0U2NvcGVkVGFiRGF0YVN0b3JhZ2VLZXkgKHN0YXRlLW1hbmFnZXIuanMpXG4gKiAgIC0gYXBwZW5kTWVzc2FnZSwgYXBwZW5kUmV0cnlNZXNzYWdlIChtZXNzYWdlLXF1ZXVlLmpzKVxuICogICAtIHBhcnNlU3RhdHVzUmVzcG9uc2UsIHBhcnNlUmV3cml0ZXNSZXNwb25zZSAodmFsaWRhdG9ycy5qcylcbiAqICAgLSByZWZyZXNoQXRzU2NvcmUgKGF0cy1yZWZpbmVtZW50LmpzKVxuICogICAtIHVwZGF0ZUluY2x1c2lvbkNvdW50cyAocmV2aWV3LXRhYmxlLWJhc2UuanMsIFRpZXIgNClcbiAqICAgLSBzd2l0Y2hUYWIgKHJldmlldy10YWJsZS1iYXNlLmpzLCBUaWVyIDQpXG4gKiAgIC0gcmVuZGVyUmV3cml0ZVBhbmVsIChyZXdyaXRlLXJldmlldy5qcywgVGllciA2KVxuICogICAtIHNob3dPd25lcnNoaXBDb25mbGljdERpYWxvZywgb3BlblNlc3Npb25zTW9kYWwgKHNlc3Npb24tc3dpdGNoZXItdWkuanMsIFRpZXIgNylcbiAqICAgLSB1cGRhdGVBY3Rpb25CdXR0b25zICh1aS1oZWxwZXJzLmpzKVxuICogICAtIHVwZGF0ZVBvc2l0aW9uVGl0bGUgKHNlc3Npb24tYWN0aW9ucy5qcylcbiAqICAgLSBlc2NhcGVIdG1sLCBTRVNTSU9OX1BIQVNFX0xBQkVMU19TSE9SVCAodXRpbHMuanMpXG4gKiAgIC0gc3RhdGVNYW5hZ2VyIChzdGF0ZS1tYW5hZ2VyLmpzIFx1MjAxNCBnZXRBbGxUYWJEYXRhKCkvZ2V0Q3VycmVudFRhYigpL3NldFRhYkRhdGEoKS9zZXRDdXJyZW50VGFiKCkpXG4gKiAgIC0gc2Vzc2lvbklkLCBpc1JlY29ubmVjdGluZywgbGFzdEtub3duUGhhc2UsIGludGVyYWN0aXZlU3RhdGUsXG4gKiAgICAgcmV3cml0ZURlY2lzaW9ucywgUEhBU0VTICh3aW5kb3cgZ2xvYmFscylcbiAqL1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5jb25zdCBsb2cgPSBnZXRMb2dnZXIoJ3Nlc3Npb24tbWFuYWdlcicpO1xuXG5pbXBvcnQgeyBTRVNTSU9OX1BIQVNFX0xBQkVMU19TSE9SVCwgU0VTU0lPTl9QSEFTRV9MQUJFTFMgfSBmcm9tICcuL3V0aWxzLmpzJztcbmltcG9ydCB7IFBIQVNFUywgc3RhdGVNYW5hZ2VyIH0gZnJvbSAnLi9zdGF0ZS1tYW5hZ2VyLmpzJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTZXNzaW9uIHBoYXNlIGxhYmVscyAoYWJicmV2aWF0ZWQgZm9ybSBcdTIwMTQgZm9yIGNvbXBhY3Qgc2Vzc2lvbi1zd2l0Y2hlciBVSSlcbi8vIEZ1bGwtbGVuZ3RoIGxhYmVscyBsaXZlIGluIHV0aWxzLmpzIFNFU1NJT05fUEhBU0VfTEFCRUxTLlxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIGZvcm1hdFNlc3Npb25QaGFzZUxhYmVsKHBoYXNlKSB7XG4gIGlmICghcGhhc2UpIHJldHVybiAnaW5pdCc7XG4gIHJldHVybiBTRVNTSU9OX1BIQVNFX0xBQkVMU19TSE9SVFtwaGFzZV0gfHwgU3RyaW5nKHBoYXNlKS5yZXBsYWNlKC9fL2csICcgJyk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ3VycmVudCBzZXNzaW9uIGlkZW50aXR5IGhlbHBlcnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiBfZ2V0Q3VycmVudFNlc3Npb25JZFZhbHVlKCkge1xuICBpZiAodHlwZW9mIGdldFNlc3Npb25JZEZyb21VUkwgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZ2V0U2Vzc2lvbklkRnJvbVVSTCgpO1xuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCkuZ2V0KCdzZXNzaW9uJyk7XG4gIH0gY2F0Y2ggKF8pIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBfZ2V0Q3VycmVudE93bmVyVG9rZW5WYWx1ZSgpIHtcbiAgaWYgKHR5cGVvZiBnZXRPd25lclRva2VuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGdldE93bmVyVG9rZW4oKTtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdjdi1idWlsZGVyLW93bmVyLXRva2VuJyk7XG4gIH0gY2F0Y2ggKF8pIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZFNlc3Npb25Td2l0Y2hlckxhYmVsKHN0YXR1cyA9IHt9KSB7XG4gIGNvbnN0IHBvc2l0aW9uTmFtZSA9IChzdGF0dXMucG9zaXRpb25fbmFtZSB8fCAnJykudG9TdHJpbmcoKS50cmltKCk7XG4gIGNvbnN0IHBoYXNlID0gZm9ybWF0U2Vzc2lvblBoYXNlTGFiZWwoc3RhdHVzLnBoYXNlKTtcbiAgaWYgKHBvc2l0aW9uTmFtZSkge1xuICAgIHJldHVybiBgJHtwb3NpdGlvbk5hbWV9IFx1MDBCNyAke3BoYXNlfWA7XG4gIH1cbiAgcmV0dXJuIF9nZXRDdXJyZW50U2Vzc2lvbklkVmFsdWUoKSA/IGBTZXNzaW9uIFx1MDBCNyAke3BoYXNlfWAgOiAnXHVEODNEXHVEQ0MyIFNlc3Npb25zJztcbn1cblxuZnVuY3Rpb24gZ2V0QWN0aXZlU2Vzc2lvbk93bmVyc2hpcE1ldGEoc2Vzc2lvbiwge1xuICBjdXJyZW50U2Vzc2lvbklkID0gX2dldEN1cnJlbnRTZXNzaW9uSWRWYWx1ZSgpLFxufSA9IHt9KSB7XG4gIGlmICghc2Vzc2lvbiB8fCB0eXBlb2Ygc2Vzc2lvbiAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4geyBsYWJlbDogJ1Vua25vd24nLCBjbGFzc05hbWU6ICdzZXNzaW9uLXN0YXR1cy11bmNsYWltZWQnLCBpc0N1cnJlbnQ6IGZhbHNlIH07XG4gIH1cblxuICBjb25zdCBpc0N1cnJlbnRTZXNzaW9uID0gQm9vbGVhbihjdXJyZW50U2Vzc2lvbklkKSAmJiBzZXNzaW9uLnNlc3Npb25faWQgPT09IGN1cnJlbnRTZXNzaW9uSWQ7XG4gIGNvbnN0IHNhbWVPd25lciA9IEJvb2xlYW4oc2Vzc2lvbi5vd25lZF9ieV9yZXF1ZXN0ZXIpO1xuXG4gIGlmIChpc0N1cnJlbnRTZXNzaW9uKSB7XG4gICAgcmV0dXJuIHsgbGFiZWw6ICdDdXJyZW50IHRhYicsIGNsYXNzTmFtZTogJ3Nlc3Npb24tc3RhdHVzLWN1cnJlbnQnLCBpc0N1cnJlbnQ6IHRydWUgfTtcbiAgfVxuICBpZiAoc2FtZU93bmVyKSB7XG4gICAgcmV0dXJuIHsgbGFiZWw6ICdPd25lZCBieSB0aGlzIHRhYicsIGNsYXNzTmFtZTogJ3Nlc3Npb24tc3RhdHVzLWN1cnJlbnQnLCBpc0N1cnJlbnQ6IGZhbHNlIH07XG4gIH1cbiAgaWYgKHNlc3Npb24uY2xhaW1lZCkge1xuICAgIHJldHVybiB7IGxhYmVsOiAnT3duZWQgYnkgYW5vdGhlciB0YWInLCBjbGFzc05hbWU6ICdzZXNzaW9uLXN0YXR1cy1vd25lZCcsIGlzQ3VycmVudDogZmFsc2UgfTtcbiAgfVxuICByZXR1cm4geyBsYWJlbDogJ1VuY2xhaW1lZCcsIGNsYXNzTmFtZTogJ3Nlc3Npb24tc3RhdHVzLXVuY2xhaW1lZCcsIGlzQ3VycmVudDogZmFsc2UgfTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0U2Vzc2lvblRpbWVzdGFtcCh0aW1lc3RhbXAsIHsgaW5jbHVkZVRpbWUgPSB0cnVlIH0gPSB7fSkge1xuICBpZiAoIXRpbWVzdGFtcCkgcmV0dXJuICdcdTIwMTQnO1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgRGF0ZSh0aW1lc3RhbXApLnRvTG9jYWxlU3RyaW5nKCdlbi1VUycsIHtcbiAgICAgIG1vbnRoOiAnc2hvcnQnLCBkYXk6ICdudW1lcmljJywgeWVhcjogJ251bWVyaWMnLFxuICAgICAgLi4uKGluY2x1ZGVUaW1lID8geyBob3VyOiAnbnVtZXJpYycsIG1pbnV0ZTogJzItZGlnaXQnIH0gOiB7fSksXG4gICAgfSk7XG4gIH0gY2F0Y2ggKF8pIHtcbiAgICByZXR1cm4gU3RyaW5nKHRpbWVzdGFtcCkucmVwbGFjZSgnVCcsICcgJykuc2xpY2UoMCwgaW5jbHVkZVRpbWUgPyAxNiA6IDEwKTtcbiAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFdlbGNvbWUgLyBvbmJvYXJkaW5nIG1vZGFsIChHQVAtMzYgLyBHQVAtMzcpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY29uc3QgX1dFTENPTUVfRElTTUlTU0VEX0tFWSA9ICdjdi1idWlsZGVyLXdlbGNvbWUtZGlzbWlzc2VkJztcblxuLyoqXG4gKiBTd2l0Y2ggd2hpY2ggY29udGVudCBzZWN0aW9uIGlzIHZpc2libGUgaW5zaWRlIHRoZSB3ZWxjb21lIG1vZGFsLlxuICogQHBhcmFtIHsncHJlc2VudCd8J21pc3NpbmcnfSBzZWN0aW9uXG4gKi9cbmZ1bmN0aW9uIF9zZXRXZWxjb21lU2VjdGlvbihzZWN0aW9uKSB7XG4gIGNvbnN0IHNQcmVzZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3dlbGNvbWUtc2VjdGlvbi1wcmVzZW50Jyk7XG4gIGNvbnN0IHNFbXB0eSAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3dlbGNvbWUtc2VjdGlvbi1lbXB0eScpO1xuICBjb25zdCBzTWlzc2luZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd3ZWxjb21lLXNlY3Rpb24tbWlzc2luZycpO1xuICBjb25zdCBmUHJlc2VudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd3ZWxjb21lLWZvb3Rlci1wcmVzZW50Jyk7XG4gIGNvbnN0IGZNaXNzaW5nID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3dlbGNvbWUtZm9vdGVyLW1pc3NpbmcnKTtcbiAgaWYgKHNQcmVzZW50KSBzUHJlc2VudC5zdHlsZS5kaXNwbGF5ID0gc2VjdGlvbiA9PT0gJ3ByZXNlbnQnID8gJycgOiAnbm9uZSc7XG4gIGlmIChzRW1wdHkpICAgc0VtcHR5LnN0eWxlLmRpc3BsYXkgICA9IHNlY3Rpb24gPT09ICdlbXB0eScgICA/ICcnIDogJ25vbmUnO1xuICBpZiAoc01pc3NpbmcpIHNNaXNzaW5nLnN0eWxlLmRpc3BsYXkgPSBzZWN0aW9uID09PSAnbWlzc2luZycgPyAnJyA6ICdub25lJztcbiAgLy8gRW1wdHkgc2tlbGV0b246IHNob3cgXCJwcmVzZW50XCIgZm9vdGVyIChDbG9zZS9kaXNtaXNzKSBub3QgXCJtaXNzaW5nXCIgZm9vdGVyIChDcmVhdGUvUmVsb2FkKVxuICBpZiAoZlByZXNlbnQpIGZQcmVzZW50LnN0eWxlLmRpc3BsYXkgPSAoc2VjdGlvbiA9PT0gJ3ByZXNlbnQnIHx8IHNlY3Rpb24gPT09ICdlbXB0eScpID8gJ2ZsZXgnIDogJ25vbmUnO1xuICBpZiAoZk1pc3NpbmcpIGZNaXNzaW5nLnN0eWxlLmRpc3BsYXkgPSBzZWN0aW9uID09PSAnbWlzc2luZycgPyAnZmxleCcgOiAnbm9uZSc7XG4gIC8vIEZvciBlbXB0eSBzdGF0ZTogY2hhbmdlIENUQSB0byBuYXZpZ2F0ZSB0byBNYXN0ZXIgQ1YgaW5zdGVhZCBvZiBqdXN0IGNsb3NpbmdcbiAgY29uc3QgZ2V0U3RhcnRlZEJ0biA9IGZQcmVzZW50ID8gZlByZXNlbnQucXVlcnlTZWxlY3RvcignYnV0dG9uLnByaW1hcnknKSA6IG51bGw7XG4gIGlmIChnZXRTdGFydGVkQnRuKSB7XG4gICAgaWYgKHNlY3Rpb24gPT09ICdlbXB0eScpIHtcbiAgICAgIGdldFN0YXJ0ZWRCdG4udGV4dENvbnRlbnQgPSAnT3BlbiBNYXN0ZXIgQ1YnO1xuICAgICAgZ2V0U3RhcnRlZEJ0bi5vbmNsaWNrID0gKCkgPT4geyBjbG9zZVdlbGNvbWVNb2RhbCgpOyBpZiAodHlwZW9mIG9wZW5NYXN0ZXJDdk1vZGFsID09PSAnZnVuY3Rpb24nKSBvcGVuTWFzdGVyQ3ZNb2RhbCgpOyB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBnZXRTdGFydGVkQnRuLnRleHRDb250ZW50ID0gJ0dldCBTdGFydGVkJztcbiAgICAgIGdldFN0YXJ0ZWRCdG4ub25jbGljayA9ICgpID0+IHtcbiAgICAgICAgY2xvc2VXZWxjb21lTW9kYWwoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBzd2l0Y2hUYWIgPT09ICdmdW5jdGlvbicpIHN3aXRjaFRhYignam9iJyk7XG4gICAgICB9O1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFNob3cgdGhlIG9uYm9hcmRpbmcgbW9kYWwgaW4gdGhlIFwibWlzc2luZyBtYXN0ZXIgQ1ZcIiBzdGF0ZS5cbiAqIENhbGxlZCBmcm9tIGNyZWF0ZU5ld1Nlc3Npb25BbmROYXZpZ2F0ZSgpIHdoZW4gdGhlIGJhY2tlbmQgcmV0dXJucyBtYXN0ZXJfY3ZfbWlzc2luZy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtYXN0ZXJDdlBhdGggLSBTZXJ2ZXItcmVwb3J0ZWQgZXhwZWN0ZWQgZmlsZSBwYXRoLlxuICovXG5mdW5jdGlvbiBzaG93T25ib2FyZGluZ01vZGFsKG1hc3RlckN2UGF0aCkge1xuICBjb25zdCBvdmVybGF5ICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvbmJvYXJkaW5nLW1vZGFsLW92ZXJsYXknKTtcbiAgY29uc3QgcGF0aEVsICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb25ib2FyZGluZy1tYXN0ZXItY3YtcGF0aCcpO1xuICBjb25zdCBzdGF0dXNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvbmJvYXJkaW5nLW1vZGFsLXN0YXR1cycpO1xuICBpZiAocGF0aEVsKSAgIHBhdGhFbC50ZXh0Q29udGVudCAgID0gbWFzdGVyQ3ZQYXRoIHx8ICcodW5rbm93biknO1xuICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJyc7XG4gIF9zZXRXZWxjb21lU2VjdGlvbignbWlzc2luZycpO1xuICBpZiAob3ZlcmxheSkge1xuICAgIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICBfb3Blbk9uYm9hcmRpbmdGb2N1c1RyYXAob3ZlcmxheSk7XG4gIH1cbn1cblxuLyoqXG4gKiBTaG93IHRoZSB3ZWxjb21lIG1vZGFsIHVubGVzcyB0aGUgdXNlciBoYXMgZGlzbWlzc2VkIGl0LlxuICogQ2FsbHMgL2FwaS9zZXR1cC9tYXN0ZXItY3Ytc3RhdHVzIHRvIGNob29zZSB3aGljaCBzZWN0aW9uIHRvIGRpc3BsYXkuXG4gKiBTYWZlIHRvIGNhbGwgb24gZXZlcnkgc3RhcnR1cCBcdTIwMTQgbm8tb3BzIGltbWVkaWF0ZWx5IGlmIGRpc21pc3NlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbWF5YmVTaG93V2VsY29tZU1vZGFsKCkge1xuICB0cnkge1xuICAgIGlmIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbShfV0VMQ09NRV9ESVNNSVNTRURfS0VZKSkgcmV0dXJuO1xuICB9IGNhdGNoIChfKSB7fVxuICBsZXQgc2VjdGlvbiA9ICdwcmVzZW50JztcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9zZXR1cC9tYXN0ZXItY3Ytc3RhdHVzJyk7XG4gICAgaWYgKHJlcy5vaykge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSk7XG4gICAgICBpZiAoIWRhdGEuZXhpc3RzKSB7XG4gICAgICAgIGNvbnN0IHBhdGhFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvbmJvYXJkaW5nLW1hc3Rlci1jdi1wYXRoJyk7XG4gICAgICAgIGlmIChwYXRoRWwpIHBhdGhFbC50ZXh0Q29udGVudCA9IGRhdGEucGF0aCB8fCAnKHVua25vd24pJztcbiAgICAgICAgc2VjdGlvbiA9ICdtaXNzaW5nJztcbiAgICAgIH0gZWxzZSBpZiAoZGF0YS5pc19lbXB0eSkge1xuICAgICAgICBzZWN0aW9uID0gJ2VtcHR5JztcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKF8pIHt9XG4gIGNvbnN0IHN0YXR1c0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ29uYm9hcmRpbmctbW9kYWwtc3RhdHVzJyk7XG4gIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnJztcbiAgX3NldFdlbGNvbWVTZWN0aW9uKHNlY3Rpb24pO1xuICBjb25zdCBvdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ29uYm9hcmRpbmctbW9kYWwtb3ZlcmxheScpO1xuICBpZiAob3ZlcmxheSkge1xuICAgIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICBfb3Blbk9uYm9hcmRpbmdGb2N1c1RyYXAob3ZlcmxheSk7XG4gIH1cbn1cblxuLyoqIFdpcmUgZm9jdXMgdHJhcCBhbmQgRXNjYXBlIGhhbmRsZXIgZm9yIHRoZSBvbmJvYXJkaW5nIG92ZXJsYXkgKFdDQUcgMi4xLjIpLiAqL1xuZnVuY3Rpb24gX29wZW5PbmJvYXJkaW5nRm9jdXNUcmFwKG92ZXJsYXkpIHtcbiAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzLnNldEluaXRpYWxGb2N1cyA9PT0gJ2Z1bmN0aW9uJykgZ2xvYmFsVGhpcy5zZXRJbml0aWFsRm9jdXMoJ29uYm9hcmRpbmctbW9kYWwtb3ZlcmxheScpO1xuICBpZiAodHlwZW9mIGdsb2JhbFRoaXMudHJhcEZvY3VzID09PSAnZnVuY3Rpb24nKSAgICAgICBnbG9iYWxUaGlzLnRyYXBGb2N1cygnb25ib2FyZGluZy1tb2RhbC1vdmVybGF5Jyk7XG4gIGlmICghb3ZlcmxheS5fb25ib2FyZGluZ0VzY0hhbmRsZXIpIHtcbiAgICBvdmVybGF5Ll9vbmJvYXJkaW5nRXNjSGFuZGxlciA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSBjbG9zZVdlbGNvbWVNb2RhbCgpO1xuICAgIH07XG4gICAgb3ZlcmxheS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb3ZlcmxheS5fb25ib2FyZGluZ0VzY0hhbmRsZXIpO1xuICB9XG59XG5cbi8qKlxuICogU2hvdyB0aGUgd2VsY29tZSBtb2RhbCB1bmNvbmRpdGlvbmFsbHkgKGlnbm9yZXMgdGhlIFwiZG9uJ3Qgc2hvdyBhZ2FpblwiIGZsYWcpLlxuICogVXNlZCBieSB0aGUgSGVscCBidXR0b24gc28gdXNlcnMgY2FuIGFsd2F5cyByZW9wZW4gb25ib2FyZGluZyBtaWQtc2Vzc2lvbi5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2hvd1dlbGNvbWVNb2RhbCgpIHtcbiAgbGV0IHNlY3Rpb24gPSAncHJlc2VudCc7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvc2V0dXAvbWFzdGVyLWN2LXN0YXR1cycpO1xuICAgIGlmIChyZXMub2spIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpLmNhdGNoKCgpID0+ICh7fSkpO1xuICAgICAgaWYgKCFkYXRhLmV4aXN0cykge1xuICAgICAgICBjb25zdCBwYXRoRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb25ib2FyZGluZy1tYXN0ZXItY3YtcGF0aCcpO1xuICAgICAgICBpZiAocGF0aEVsKSBwYXRoRWwudGV4dENvbnRlbnQgPSBkYXRhLnBhdGggfHwgJyh1bmtub3duKSc7XG4gICAgICAgIHNlY3Rpb24gPSAnbWlzc2luZyc7XG4gICAgICB9IGVsc2UgaWYgKGRhdGEuaXNfZW1wdHkpIHtcbiAgICAgICAgc2VjdGlvbiA9ICdlbXB0eSc7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChfKSB7fVxuICBjb25zdCBzdGF0dXNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvbmJvYXJkaW5nLW1vZGFsLXN0YXR1cycpO1xuICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJyc7XG4gIF9zZXRXZWxjb21lU2VjdGlvbihzZWN0aW9uKTtcbiAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvbmJvYXJkaW5nLW1vZGFsLW92ZXJsYXknKTtcbiAgaWYgKG92ZXJsYXkpIHtcbiAgICBvdmVybGF5LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgX29wZW5PbmJvYXJkaW5nRm9jdXNUcmFwKG92ZXJsYXkpO1xuICB9XG59XG5cbi8qKlxuICogQ2xvc2UgdGhlIHdlbGNvbWUgbW9kYWwuXG4gKiBJZiBcIkRvbid0IHNob3cgYWdhaW5cIiBpcyBjaGVja2VkLCBwZXJzaXN0cyB0aGUgZGlzbWlzc2FsIGluIGxvY2FsU3RvcmFnZS5cbiAqL1xuZnVuY3Rpb24gY2xvc2VXZWxjb21lTW9kYWwoKSB7XG4gIGNvbnN0IG92ZXJsYXkgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ29uYm9hcmRpbmctbW9kYWwtb3ZlcmxheScpO1xuICBjb25zdCBjaGVja2JveCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd3ZWxjb21lLWRvbnQtc2hvdy1hZ2FpbicpO1xuICBpZiAob3ZlcmxheSkge1xuICAgIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBpZiAob3ZlcmxheS5fb25ib2FyZGluZ0VzY0hhbmRsZXIpIHtcbiAgICAgIG92ZXJsYXkucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIG92ZXJsYXkuX29uYm9hcmRpbmdFc2NIYW5kbGVyKTtcbiAgICAgIGRlbGV0ZSBvdmVybGF5Ll9vbmJvYXJkaW5nRXNjSGFuZGxlcjtcbiAgICB9XG4gIH1cbiAgaWYgKGNoZWNrYm94ICYmIGNoZWNrYm94LmNoZWNrZWQpIHtcbiAgICB0cnkgeyBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShfV0VMQ09NRV9ESVNNSVNTRURfS0VZLCAnMScpOyB9IGNhdGNoIChfKSB7fVxuICB9XG4gIGlmICh0eXBlb2YgZ2xvYmFsVGhpcy5yZXN0b3JlRm9jdXMgPT09ICdmdW5jdGlvbicpIGdsb2JhbFRoaXMucmVzdG9yZUZvY3VzKCk7XG59XG5cbi8qKlxuICogQ2FsbGVkIGJ5IHRoZSBvbmJvYXJkaW5nIG1vZGFsIFwiQ3JlYXRlIGVtcHR5IHByb2ZpbGVcIiBidXR0b24uXG4gKiBQT1NUcyB0byAvYXBpL3NldHVwL2NyZWF0ZS1tYXN0ZXItY3YsIHRoZW4gbmF2aWdhdGVzIHRvIGEgbmV3IHNlc3Npb24uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG9uYm9hcmRpbmdDcmVhdGVFbXB0eVByb2ZpbGUoKSB7XG4gIGNvbnN0IGJ0biAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ29uYm9hcmRpbmctY3JlYXRlLWJ0bicpO1xuICBjb25zdCBzdGF0dXNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvbmJvYXJkaW5nLW1vZGFsLXN0YXR1cycpO1xuICBpZiAoYnRuKSBidG4uZGlzYWJsZWQgPSB0cnVlO1xuICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJ0NyZWF0aW5nIHByb2ZpbGVcdTIwMjYnO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9zZXR1cC9jcmVhdGUtbWFzdGVyLWN2JywgeyBtZXRob2Q6ICdQT1NUJyB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKTtcbiAgICBpZiAoIXJlcy5vaykge1xuICAgICAgY29uc3QgbXNnID0gZGF0YS5lcnJvciA9PT0gJ2FscmVhZHlfZXhpc3RzJ1xuICAgICAgICA/ICdGaWxlIGFscmVhZHkgZXhpc3RzIFx1MjAxNCBwbGVhc2UgcmVsb2FkIHRoZSBwYWdlLidcbiAgICAgICAgOiAoZGF0YS5lcnJvciB8fCBgU2VydmVyIGVycm9yICR7cmVzLnN0YXR1c31gKTtcbiAgICAgIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSBtc2c7XG4gICAgICBpZiAoYnRuKSBidG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gRmlsZSBjcmVhdGVkIFx1MjAxNCBub3cgbmF2aWdhdGUgdG8gYSBuZXcgc2Vzc2lvblxuICAgIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnUHJvZmlsZSBjcmVhdGVkISBTdGFydGluZyBzZXNzaW9uXHUyMDI2JztcbiAgICBhd2FpdCBjcmVhdGVOZXdTZXNzaW9uQW5kTmF2aWdhdGUoKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKHN0YXR1c0VsKSBzdGF0dXNFbC50ZXh0Q29udGVudCA9IGBFcnJvcjogJHtlcnIubWVzc2FnZX1gO1xuICAgIGlmIChidG4pIGJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU2Vzc2lvbiBjcmVhdGlvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZU5ld1Nlc3Npb25BbmROYXZpZ2F0ZSgpIHtcbiAgY29uc3QgZGF0YSA9IGF3YWl0IGNyZWF0ZVNlc3Npb24oKTtcbiAgaWYgKGRhdGEuZXJyb3IgPT09ICdtYXN0ZXJfY3ZfbWlzc2luZycpIHtcbiAgICBzaG93T25ib2FyZGluZ01vZGFsKGRhdGEubWFzdGVyX2N2X3BhdGggfHwgJycpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIWRhdGEuc2Vzc2lvbl9pZCkgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gY3JlYXRlIHNlc3Npb24nKTtcbiAgLy8gQ2xlYXIgYW55IHN0YWxlIHNlc3Npb24gcGF0aCBcdTIwMTQgdGhlIG5ldyBzZXNzaW9uIGhhcyBubyBzYXZlZCBmaWxlIHlldC5cbiAgLy8gSWYgU0VTU0lPTl9QQVRIIHdlcmUgbGVmdCBwb2ludGluZyBhdCBhIHByZXZpb3VzIHNlc3Npb24ncyBmaWxlLCB0aGVcbiAgLy8gZGlzay1yZXN0b3JlIGd1YXJkIGluIHJlc3RvcmVCYWNrZW5kU3RhdGUgY291bGQgbG9hZCB0aGUgd3Jvbmcgc2Vzc2lvblxuICAvLyBvbiB0aGUgbmV4dCB2aXNpdCBvbmNlIFNFU1NJT05fSUQgaXMgdXBkYXRlZCBieSB0aGUgYmVmb3JldW5sb2FkIGhhbmRsZXIuXG4gIHRyeSB7IGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdjdi1idWlsZGVyLXNlc3Npb24tcGF0aCcpOyB9IGNhdGNoIChfKSB7fVxuICB3aW5kb3cubG9jYXRpb24uYXNzaWduKGRhdGEucmVkaXJlY3RfdXJsIHx8IGAvP3Nlc3Npb249JHtkYXRhLnNlc3Npb25faWR9YCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZU5ld1Nlc3Npb25Jbk5ld1RhYigpIHtcbiAgY29uc3QgZGF0YSA9IGF3YWl0IGNyZWF0ZVNlc3Npb24oKTtcbiAgaWYgKGRhdGEuZXJyb3IgPT09ICdtYXN0ZXJfY3ZfbWlzc2luZycpIHtcbiAgICBzaG93T25ib2FyZGluZ01vZGFsKGRhdGEubWFzdGVyX2N2X3BhdGggfHwgJycpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIWRhdGEuc2Vzc2lvbl9pZCkgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gY3JlYXRlIHNlc3Npb24nKTtcbiAgd2luZG93Lm9wZW4oZGF0YS5yZWRpcmVjdF91cmwgfHwgYC8/c2Vzc2lvbj0ke2RhdGEuc2Vzc2lvbl9pZH1gLCAnX2JsYW5rJywgJ25vb3BlbmVyJyk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU2Vzc2lvbiBjbGFpbSAvIG93bmVyc2hpcFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmFzeW5jIGZ1bmN0aW9uIF9jbGFpbUN1cnJlbnRTZXNzaW9uKHNlc3Npb25JZFRvQ2xhaW0pIHtcbiAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvc2Vzc2lvbnMvY2xhaW0nLCB7XG4gICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgc2Vzc2lvbl9pZDogc2Vzc2lvbklkVG9DbGFpbSxcbiAgICAgIG93bmVyX3Rva2VuOiBnZXRPd25lclRva2VuKCksXG4gICAgfSksXG4gIH0pO1xuXG4gIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpLmNhdGNoKCgpID0+ICh7fSkpO1xuICBpZiAocmVzLm9rICYmIGRhdGEub2sgIT09IGZhbHNlKSByZXR1cm4gdHJ1ZTtcblxuICBpZiAocmVzLnN0YXR1cyA9PT0gNDA5ICYmIGRhdGEuZXJyb3IgPT09ICdzZXNzaW9uX293bmVkJykge1xuICAgIGNvbnN0IGFjdGlvbiA9IGF3YWl0IHNob3dPd25lcnNoaXBDb25mbGljdERpYWxvZyhcbiAgICAgICdUaGlzIHNlc3Npb24gaXMgY3VycmVudGx5IGNsYWltZWQgYnkgYW5vdGhlciBicm93c2VyIHRhYi4gWW91IGNhbiB0YWtlIGl0IG92ZXIsIHN0YXJ0IGEgbmV3IHNlc3Npb24sIG9yIGxvYWQgYSBkaWZmZXJlbnQgb25lLidcbiAgICApO1xuICAgIGlmIChhY3Rpb24gPT09ICduZXcnKSB7XG4gICAgICBhd2FpdCBjcmVhdGVOZXdTZXNzaW9uQW5kTmF2aWdhdGUoKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGFjdGlvbiAhPT0gJ3Rha2VvdmVyJykge1xuICAgICAgc2hvd1Nlc3Npb25zTGFuZGluZ1BhbmVsKCdTZWxlY3QgYSBkaWZmZXJlbnQgc2Vzc2lvbiBvciBjcmVhdGUgYSBuZXcgb25lLicpO1xuICAgICAgb3BlblNlc3Npb25zTW9kYWwoeyByZXF1aXJlZDogdHJ1ZSB9KTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCB0YWtlb3ZlclJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3Nlc3Npb25zL3Rha2VvdmVyJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgc2Vzc2lvbl9pZDogc2Vzc2lvbklkVG9DbGFpbSxcbiAgICAgICAgb3duZXJfdG9rZW46IGdldE93bmVyVG9rZW4oKSxcbiAgICAgIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IHRha2VvdmVyRGF0YSA9IGF3YWl0IHRha2VvdmVyUmVzLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKTtcbiAgICBpZiAoIXRha2VvdmVyUmVzLm9rKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IodGFrZW92ZXJEYXRhLmVycm9yIHx8ICdGYWlsZWQgdG8gdGFrZSBvdmVyIHNlc3Npb24nKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAocmVzLnN0YXR1cyA9PT0gNDA0IHx8IGRhdGEuZXJyb3IgPT09ICdzZXNzaW9uX25vdF9mb3VuZCcpIHtcbiAgICBzaG93U2Vzc2lvbnNMYW5kaW5nUGFuZWwoJ1RoYXQgc2Vzc2lvbiBpcyBubyBsb25nZXIgYWN0aXZlLiBMb2FkIGl0IGZyb20gZGlzayBvciBjcmVhdGUgYSBuZXcgb25lLicpO1xuICAgIG9wZW5TZXNzaW9uc01vZGFsKHsgcmVxdWlyZWQ6IHRydWUgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGRhdGEuZXJyb3IgfHwgYEZhaWxlZCB0byBjbGFpbSBzZXNzaW9uICgke3Jlcy5zdGF0dXN9KWApO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNlc3Npb24gbmF2aWdhdGlvbiBmcm9tIGxhbmRpbmcgcGFnZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIHNob3dTZXNzaW9uc0xhbmRpbmdQYW5lbChtZXNzYWdlID0gJycpIHtcbiAgc3RhdGVNYW5hZ2VyLnNldEN1cnJlbnRUYWIoJ2pvYicpO1xuICBzdGF0ZU1hbmFnZXIuc2V0UGhhc2UoUEhBU0VTLklOSVQpO1xuICB1cGRhdGVBY3Rpb25CdXR0b25zKCdqb2InKTtcbiAgdXBkYXRlUG9zaXRpb25UaXRsZSh7fSk7XG5cbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIGlmICghY29udGVudCkgcmV0dXJuO1xuXG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLWxhbmRpbmctc2hlbGxcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLWxhbmRpbmctaGVhZGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLWxhbmRpbmctY29weVwiPlxuICAgICAgICAgIDxoMj5TZWxlY3QgYSBTZXNzaW9uPC9oMj5cbiAgICAgICAgICA8cD5FYWNoIGJyb3dzZXIgdGFiIG5vdyB3b3JrcyBhZ2FpbnN0IGl0cyBvd24gVVJMLXNjb3BlZCBzZXNzaW9uLjwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLWxhbmRpbmctYWN0aW9uc1wiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgb25jbGljaz1cImNyZWF0ZU5ld1Nlc3Npb25Jbk5ld1RhYigpXCI+XHVGRjBCIE5ldyBTZXNzaW9uIGluIE5ldyBUYWI8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgICR7bWVzc2FnZSA/IGA8cCBzdHlsZT1cIm1hcmdpbi1ib3R0b206MjBweDtjb2xvcjojYjQ1MzA5O2ZvbnQtd2VpZ2h0OjYwMDtcIj4ke2VzY2FwZUh0bWwobWVzc2FnZSl9PC9wPmAgOiAnJ31cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjEycHg7bWFyZ2luLWJvdHRvbToyNHB4O2ZsZXgtd3JhcDp3cmFwO1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBwcmltYXJ5XCIgb25jbGljaz1cImNyZWF0ZU5ld1Nlc3Npb25BbmROYXZpZ2F0ZSgpXCI+KyBOZXcgU2Vzc2lvbjwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGA7XG59XG5cbmZ1bmN0aW9uIF9yZXN0b3JlVGFiRm9yUGhhc2Uoc2Vzc2lvblBoYXNlKSB7XG4gIGNvbnN0IHBoYXNlVGFiTWFwID0ge1xuICAgIFtQSEFTRVMuSU5JVF06ICAgICAgICAgICAgICdqb2InLFxuICAgIFtQSEFTRVMuSk9CX0FOQUxZU0lTXTogICAgICdhbmFseXNpcycsXG4gICAgW1BIQVNFUy5DVVNUT01JWkFUSU9OXTogICAgJ2V4cC1yZXZpZXcnLFxuICAgIFtQSEFTRVMuUkVXUklURV9SRVZJRVddOiAgICdyZXdyaXRlJyxcbiAgICBbUEhBU0VTLlNQRUxMX0NIRUNLXTogICAgICAnc3BlbGwnLFxuICAgIFtQSEFTRVMuR0VORVJBVElPTl06ICAgICAgICdsYXlvdXQnLFxuICAgIFtQSEFTRVMuTEFZT1VUX1JFVklFV106ICAgICdsYXlvdXQnLFxuICAgIFtQSEFTRVMuRklOQUxfR0VORVJBVElPTl06ICdmaW5hbF9nZW5lcmF0ZScsXG4gICAgW1BIQVNFUy5SRUZJTkVNRU5UXTogICAgICAgJ2Rvd25sb2FkJyxcbiAgfTtcbiAgY29uc3QgdGFyZ2V0VGFiID0gcGhhc2VUYWJNYXBbc2Vzc2lvblBoYXNlXSB8fCAnam9iJztcblxuICBpZiAodHlwZW9mIHN3aXRjaFRhYiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHN3aXRjaFRhYih0YXJnZXRUYWIpO1xuICB9IGVsc2Uge1xuICAgIHN0YXRlTWFuYWdlci5zZXRDdXJyZW50VGFiKHRhcmdldFRhYik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX3Jlc29sdmVSZXN0b3JlZFBoYXNlKHN0YXR1c0RhdGEpIHtcbiAgY29uc3QgcGhhc2UgPSBzdGF0dXNEYXRhPy5waGFzZSB8fCBQSEFTRVMuSU5JVDtcblxuICAvLyBHdWFyZDogbm8gam9iX2FuYWx5c2lzIG1lYW5zIHdlIGNhbm5vdCBiZSBwYXN0IHRoZSBpbml0aWFsIGlucHV0IHN0ZXAuXG4gIGlmICghc3RhdHVzRGF0YT8uam9iX2FuYWx5c2lzKSB7XG4gICAgcmV0dXJuIFBIQVNFUy5JTklUO1xuICB9XG5cbiAgLy8gR3VhcmQ6IHBoYXNlIGNsYWltcyBjdXN0b21pemF0aW9ucyB3ZXJlIHJldmlld2VkLCBidXQgdGhleSB3ZXJlIG5ldmVyXG4gIC8vIGdlbmVyYXRlZCAoZS5nLiBiYWNrZW5kIHJlc3RhcnRlZCBhZnRlciBhbmFseXplX2pvYiBidXQgYmVmb3JlXG4gIC8vIHJlY29tbWVuZF9jdXN0b21pemF0aW9ucyByYW4sIG9yIGxlZ2FjeSBzZXNzaW9ucyBzYXZlZCB3aXRoIHRoZSBvbGRcbiAgLy8gcHJlbWF0dXJlLUNVU1RPTUlaQVRJT04gYnVnKS4gRmFsbCBiYWNrIHNvIHRoZSB1c2VyIHNlZXMgdGhlIEFuYWx5c2lzXG4gIC8vIHN0ZXAgYW5kIGNhbiBydW4gUmVjb21tZW5kIEN1c3RvbWl6YXRpb25zIGZyb20gdGhlcmUuXG4gIGlmIChcbiAgICAocGhhc2UgPT09IFBIQVNFUy5DVVNUT01JWkFUSU9OIHx8IHBoYXNlID09PSBQSEFTRVMuUkVXUklURV9SRVZJRVcpXG4gICAgJiYgIXN0YXR1c0RhdGE/LmN1c3RvbWl6YXRpb25zXG4gICkge1xuICAgIHJldHVybiBQSEFTRVMuSk9CX0FOQUxZU0lTO1xuICB9XG5cbiAgcmV0dXJuIHBoYXNlO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNlc3Npb24gY29udGV4dCAvIHJlc3RvcmVcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5hc3luYyBmdW5jdGlvbiBlbnN1cmVTZXNzaW9uQ29udGV4dCgpIHtcbiAgY29uc3QgdXJsU2Vzc2lvbklkID0gZ2V0U2Vzc2lvbklkRnJvbVVSTCgpO1xuICBpZiAoIXVybFNlc3Npb25JZCkge1xuICAgIHNob3dTZXNzaW9uc0xhbmRpbmdQYW5lbCgpO1xuICAgIG9wZW5TZXNzaW9uc01vZGFsKHsgcmVxdWlyZWQ6IHRydWUgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgc3RhdGVNYW5hZ2VyLnNldFNlc3Npb25JZCh1cmxTZXNzaW9uSWQpO1xuICByZXR1cm4gX2NsYWltQ3VycmVudFNlc3Npb24odXJsU2Vzc2lvbklkKTtcbn1cblxuZnVuY3Rpb24gX2FwcGVuZFJlc3RvcmVkRGVjaXNpb25zU3VtbWFyeSgpIHtcbiAgY29uc3QgcGhhc2UgPSBzdGF0ZU1hbmFnZXIuZ2V0UGhhc2UoKTtcbiAgY29uc3QgY3VzdG9taXphdGlvbnMgPSBzdGF0ZU1hbmFnZXIuZ2V0VGFiRGF0YSgnY3VzdG9taXphdGlvbnMnKSB8fCB3aW5kb3cucGVuZGluZ1JlY29tbWVuZGF0aW9ucztcbiAgY29uc3QgcGFydHMgPSBbXTtcblxuICBpZiAoY3VzdG9taXphdGlvbnMpIHtcbiAgICBjb25zdCBleHBDb3VudCA9IChjdXN0b21pemF0aW9ucy5yZWNvbW1lbmRlZF9leHBlcmllbmNlcyB8fCBbXSkubGVuZ3RoO1xuICAgIGlmIChleHBDb3VudCA+IDApIHBhcnRzLnB1c2goYCR7ZXhwQ291bnR9IGV4cGVyaWVuY2Uke2V4cENvdW50ICE9PSAxID8gJ3MnIDogJyd9IHJlY29tbWVuZGVkYCk7XG4gICAgY29uc3Qgc2tpbGxDb3VudCA9IChjdXN0b21pemF0aW9ucy5yZWNvbW1lbmRlZF9za2lsbHMgfHwgW10pLmxlbmd0aDtcbiAgICBpZiAoc2tpbGxDb3VudCA+IDApIHBhcnRzLnB1c2goYCR7c2tpbGxDb3VudH0gc2tpbGwke3NraWxsQ291bnQgIT09IDEgPyAncycgOiAnJ30gcmVjb21tZW5kZWRgKTtcbiAgfVxuXG4gIGNvbnN0IGRlY2lzaW9ucyA9IHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMgfHwge307XG4gIGNvbnN0IGFwcHJvdmVkUmV3cml0ZXMgPSBBcnJheS5pc0FycmF5KHdpbmRvdy5hcHByb3ZlZFJld3JpdGVzKSA/IHdpbmRvdy5hcHByb3ZlZFJld3JpdGVzLmxlbmd0aFxuICAgIDogT2JqZWN0LmtleXMoZGVjaXNpb25zLmV4cGVyaWVuY2VfZGVjaXNpb25zIHx8IHt9KS5sZW5ndGg7XG4gIGlmIChhcHByb3ZlZFJld3JpdGVzID4gMCkgcGFydHMucHVzaChgJHthcHByb3ZlZFJld3JpdGVzfSByZXdyaXRlJHthcHByb3ZlZFJld3JpdGVzICE9PSAxID8gJ3MnIDogJyd9IGFwcHJvdmVkYCk7XG5cbiAgY29uc3QgYXRzID0gc3RhdGVNYW5hZ2VyLmdldEF0c1Njb3JlKCk7XG4gIGlmIChhdHMgJiYgdHlwZW9mIGF0cy5vdmVyYWxsID09PSAnbnVtYmVyJykge1xuICAgIHBhcnRzLnB1c2goYEFUUyBzY29yZSAke01hdGgucm91bmQoYXRzLm92ZXJhbGwpfSVgKTtcbiAgfVxuXG4gIGlmIChwYXJ0cy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgcGhhc2VMYWJlbCA9IFNFU1NJT05fUEhBU0VfTEFCRUxTX1NIT1JUW3BoYXNlXSB8fCBTdHJpbmcocGhhc2UpLnJlcGxhY2UoL18vZywgJyAnKTtcbiAgICBjb25zdCBwb3NpdGlvbkN0eCA9IHdpbmRvdy5fcmVzdG9yZWRQb3NpdGlvbk5hbWUgPyBgIGZvciAke3dpbmRvdy5fcmVzdG9yZWRQb3NpdGlvbk5hbWV9YCA6ICcnO1xuICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsIGBcdUQ4M0RcdURDQ0IgUmVzdG9yZWQke3Bvc2l0aW9uQ3R4fSBhdCBzdGFnZTogJHtwaGFzZUxhYmVsfSBcdTIwMTQgJHtwYXJ0cy5qb2luKCcsICcpfS5gKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZXN0b3JlU2Vzc2lvbigpIHtcbiAgdHJ5IHtcbiAgICBzdGF0ZU1hbmFnZXIuc2V0SXNSZWNvbm5lY3RpbmcodHJ1ZSk7XG5cbiAgICBjb25zdCBzdG9yZWRTZXNzaW9uSWQgPSBnZXRTZXNzaW9uSWRGcm9tVVJMKCkgfHwgbG9jYWxTdG9yYWdlLmdldEl0ZW0oU3RvcmFnZUtleXMuU0VTU0lPTl9JRCk7XG4gICAgaWYgKCFzdG9yZWRTZXNzaW9uSWQpIHtcbiAgICAgIHN0YXRlTWFuYWdlci5zZXRJc1JlY29ubmVjdGluZyhmYWxzZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN0YXRlTWFuYWdlci5zZXRTZXNzaW9uSWQoc3RvcmVkU2Vzc2lvbklkKTtcblxuICAgIC8vIFRyeSB0byByZXN0b3JlIGNvbnZlcnNhdGlvbiBoaXN0b3J5IGZyb20gYmFja2VuZFxuICAgIGNvbnN0IGhpc3RvcnlSZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9oaXN0b3J5Jyk7XG4gICAgaWYgKGhpc3RvcnlSZXMub2spIHtcbiAgICAgIGNvbnN0IGhpc3RvcnlEYXRhID0gYXdhaXQgaGlzdG9yeVJlcy5qc29uKCk7XG5cbiAgICAgIC8vIEFsd2F5cyBjbGVhciBwbGFjZWhvbGRlciBIVE1MIGNvbnRlbnQgbm93IHRoYXQgd2UgaGF2ZSBhIGxpdmUgc2Vzc2lvbiByZXNwb25zZS5cbiAgICAgIGNvbnN0IGNvbnZlcnNhdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb252ZXJzYXRpb24nKTtcbiAgICAgIGNvbnZlcnNhdGlvbi5pbm5lckhUTUwgPSAnJztcblxuICAgICAgLy8gQWx3YXlzIHJlc3RvcmUgZnJvbSB0aGUgc2VydmVyIHNlc3Npb24gZmlsZSAoYXV0aG9yaXRhdGl2ZSBoaXN0b3J5IHNvdXJjZSkuXG4gICAgICBpZiAoaGlzdG9yeURhdGEuaGlzdG9yeSAmJiBoaXN0b3J5RGF0YS5oaXN0b3J5Lmxlbmd0aCA+IDApIHtcblxuICAgICAgICBoaXN0b3J5RGF0YS5oaXN0b3J5LmZvckVhY2gobXNnID0+IHtcbiAgICAgICAgICBpZiAobXNnLnJvbGUgPT09ICd1c2VyJykge1xuICAgICAgICAgICAgYXBwZW5kTWVzc2FnZSgndXNlcicsIG1zZy5jb250ZW50KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKG1zZy5yb2xlID09PSAnYXNzaXN0YW50Jykge1xuICAgICAgICAgICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgbXNnLmNvbnRlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgJ1x1RDgzRFx1REQwNCBTZXNzaW9uIHJlc3RvcmVkIGZyb20gc2VydmVyLicpO1xuICAgICAgICBsb2cuaW5mbyhgUmVzdG9yZWQgJHtoaXN0b3J5RGF0YS5oaXN0b3J5Lmxlbmd0aH0gbWVzc2FnZXMgZnJvbSBiYWNrZW5kYCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSBwaGFzZVxuICAgICAgaWYgKGhpc3RvcnlEYXRhLnBoYXNlKSB7XG4gICAgICAgIHN0YXRlTWFuYWdlci5zZXRQaGFzZShoaXN0b3J5RGF0YS5waGFzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVHJ5IHRvIHJlc3RvcmUgYmFja2VuZCBzdGF0ZS5cbiAgICAvLyBSZXR1cm5zIHRydWUgd2hlbiBzZXJ2ZXIgaGFkIGxpdmUgc2Vzc2lvbiBkYXRhIChpbiBtZW1vcnkgb3IgbG9hZGVkIGZyb20gZGlzaykuXG4gICAgY29uc3Qgc2VydmVySGFzRGF0YSA9IGF3YWl0IHJlc3RvcmVCYWNrZW5kU3RhdGUoKTtcblxuICAgIC8vIFJlc3RvcmUgVUktb25seSBwcmVmcyAoYWN0aXZlUmV2aWV3UGFuZSkgZnJvbSBsb2NhbFN0b3JhZ2UuXG4gICAgcmVzdG9yZVRhYkRhdGEoeyB1aVByZWZzT25seTogc2VydmVySGFzRGF0YSB9KTtcblxuICAgIC8vIFNob3cgYSByZXN0b3JlZC1kZWNpc2lvbnMgc3VtbWFyeSB3aGVuIHRoZSBiYWNrZW5kIGhhZCBsaXZlIHNlc3Npb24gZGF0YS5cbiAgICBpZiAoc2VydmVySGFzRGF0YSkge1xuICAgICAgX2FwcGVuZFJlc3RvcmVkRGVjaXNpb25zU3VtbWFyeSgpO1xuICAgIH1cblxuICAgIHN0YXRlTWFuYWdlci5zZXRJc1JlY29ubmVjdGluZyhmYWxzZSk7XG5cbiAgICAvLyBSdW4gYSBiYWNrZ3JvdW5kIGhlYWx0aCBjaGVjayBzbyB0aGUgc3RhdHVzIHBpbGwgcmVmbGVjdHMgbGl2ZSBjb25uZWN0aXZpdHkuXG4gICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzLnRlc3RDdXJyZW50TW9kZWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGdsb2JhbFRoaXMudGVzdEN1cnJlbnRNb2RlbCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICB9XG5cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cud2FybignU2Vzc2lvbiByZXN0b3JhdGlvbiBmYWlsZWQ6JywgZXJyb3IpO1xuICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsIGBcdTI2QTBcdUZFMEYgQ291bGQgbm90IHJlc3RvcmUgcHJldmlvdXMgc2Vzc2lvbi4gU3RhcnRpbmcgZnJlc2guICgke2Vycm9yLm1lc3NhZ2V9KWApO1xuICAgIHN0YXRlTWFuYWdlci5zZXRJc1JlY29ubmVjdGluZyhmYWxzZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2h5ZHJhdGVTdGF0dXNEZXJpdmVkU3RhdGUoc3RhdHVzRGF0YSkge1xuICB3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0cyA9IHt9O1xuICB0cnkge1xuICAgIGlmIChzdGF0dXNEYXRhLmFjaGlldmVtZW50X2VkaXRzICYmIE9iamVjdC5rZXlzKHN0YXR1c0RhdGEuYWNoaWV2ZW1lbnRfZWRpdHMpLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHN0YXR1c0RhdGEuYWNoaWV2ZW1lbnRfZWRpdHMpKSB7XG4gICAgICAgIGNvbnN0IGlkeCA9IHBhcnNlSW50KGssIDEwKTtcbiAgICAgICAgY29uc3QgcmF3SXRlbXMgPSBBcnJheS5pc0FycmF5KHYpID8gdiA6IFt2XTtcbiAgICAgICAgd2luZG93LmFjaGlldmVtZW50RWRpdHNbaWR4XSA9IHJhd0l0ZW1zLm1hcChpdGVtID0+IHtcbiAgICAgICAgICBpZiAoaXRlbSAmJiB0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoaXRlbSkpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHRleHQ6IFN0cmluZyhpdGVtLnRleHQgPz8gaXRlbS5kZXNjcmlwdGlvbiA/PyBpdGVtLmNvbnRlbnQgPz8gJycpLFxuICAgICAgICAgICAgICBoaWRkZW46IEJvb2xlYW4oaXRlbS5oaWRkZW4pLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRleHQ6IFN0cmluZyhpdGVtID8/ICcnKSxcbiAgICAgICAgICAgIGhpZGRlbjogZmFsc2UsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChfZSkgeyAvKiBub24tZmF0YWwgKi8gfVxuXG4gIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMgPSB7XG4gICAgZXhwZXJpZW5jZV9kZWNpc2lvbnM6IHN0YXR1c0RhdGEuZXhwZXJpZW5jZV9kZWNpc2lvbnMgfHwge30sXG4gICAgc2tpbGxfZGVjaXNpb25zOiAgICAgIHN0YXR1c0RhdGEuc2tpbGxfZGVjaXNpb25zICAgICAgfHwge30sXG4gICAgYWNoaWV2ZW1lbnRfZGVjaXNpb25zOnN0YXR1c0RhdGEuYWNoaWV2ZW1lbnRfZGVjaXNpb25zIHx8IHt9LFxuICAgIHB1YmxpY2F0aW9uX2RlY2lzaW9uczpzdGF0dXNEYXRhLnB1YmxpY2F0aW9uX2RlY2lzaW9ucyB8fCB7fSxcbiAgICBzdW1tYXJ5X2ZvY3VzX292ZXJyaWRlOiBzdGF0dXNEYXRhLnN1bW1hcnlfZm9jdXNfb3ZlcnJpZGUgfHwgbnVsbCxcbiAgICBleHRyYV9za2lsbHM6ICAgICAgICAgICBzdGF0dXNEYXRhLmV4dHJhX3NraWxscyB8fCBbXSxcbiAgICBleHRyYV9za2lsbF9tYXRjaGVzOiAgICBzdGF0dXNEYXRhLmV4dHJhX3NraWxsX21hdGNoZXMgfHwge30sXG4gIH07XG4gIHdpbmRvdy5fYWxsRXhwZXJpZW5jZXMgPSBzdGF0dXNEYXRhLmFsbF9leHBlcmllbmNlcyB8fCBbXTtcbiAgd2luZG93LnNlbGVjdGVkU3VtbWFyeUtleSA9IHN0YXR1c0RhdGEuc3VtbWFyeV9mb2N1c19vdmVycmlkZSB8fCBzdGF0dXNEYXRhLnNlbGVjdGVkX3N1bW1hcnlfa2V5IHx8IG51bGw7XG4gIHdpbmRvdy5fbmV3U2tpbGxzRnJvbUxMTSA9IHN0YXR1c0RhdGEubmV3X3NraWxsc19mcm9tX2xsbSB8fCBbXTtcbiAgd2luZG93Ll9zdGF0dXNJbnRha2UgPSBzdGF0dXNEYXRhLmludGFrZSAmJiB0eXBlb2Ygc3RhdHVzRGF0YS5pbnRha2UgPT09ICdvYmplY3QnXG4gICAgPyBzdGF0dXNEYXRhLmludGFrZVxuICAgIDoge307XG4gIHdpbmRvdy5wb3N0QW5hbHlzaXNRdWVzdGlvbnMgPSBBcnJheS5pc0FycmF5KHN0YXR1c0RhdGEucG9zdF9hbmFseXNpc19xdWVzdGlvbnMpXG4gICAgPyBzdGF0dXNEYXRhLnBvc3RfYW5hbHlzaXNfcXVlc3Rpb25zXG4gICAgOiBbXTtcbiAgd2luZG93LnF1ZXN0aW9uQW5zd2VycyA9IChzdGF0dXNEYXRhLnBvc3RfYW5hbHlzaXNfYW5zd2VycyAmJiB0eXBlb2Ygc3RhdHVzRGF0YS5wb3N0X2FuYWx5c2lzX2Fuc3dlcnMgPT09ICdvYmplY3QnKVxuICAgID8gc3RhdHVzRGF0YS5wb3N0X2FuYWx5c2lzX2Fuc3dlcnNcbiAgICA6IHt9O1xuICB3aW5kb3cuX3Jlc3RvcmVkUG9zaXRpb25OYW1lID0gc3RhdHVzRGF0YS5wb3NpdGlvbl9uYW1lIHx8IG51bGw7XG59XG5cbmZ1bmN0aW9uIF9oeWRyYXRlU3RhdHVzVGFiU3RhdGUoc3RhdHVzRGF0YSkge1xuICBjb25zdCBoYXNBbmFseXNpcyA9IHN0YXR1c0RhdGEuam9iX2FuYWx5c2lzICE9PSB1bmRlZmluZWQgJiYgc3RhdHVzRGF0YS5qb2JfYW5hbHlzaXMgIT09IG51bGw7XG4gIGNvbnN0IGhhc0N1c3RvbWl6YXRpb25zID0gc3RhdHVzRGF0YS5jdXN0b21pemF0aW9ucyAhPT0gdW5kZWZpbmVkICYmIHN0YXR1c0RhdGEuY3VzdG9taXphdGlvbnMgIT09IG51bGw7XG4gIGNvbnN0IGhhc0dlbmVyYXRlZEZpbGVzID0gc3RhdHVzRGF0YS5nZW5lcmF0ZWRfZmlsZXMgIT09IHVuZGVmaW5lZCAmJiBzdGF0dXNEYXRhLmdlbmVyYXRlZF9maWxlcyAhPT0gbnVsbDtcblxuICBzdGF0ZU1hbmFnZXIuc2V0VGFiRGF0YSgnYW5hbHlzaXMnLCBoYXNBbmFseXNpcyA/IHN0YXR1c0RhdGEuam9iX2FuYWx5c2lzIDogbnVsbCk7XG4gIHN0YXRlTWFuYWdlci5zZXRUYWJEYXRhKCdjdXN0b21pemF0aW9ucycsIGhhc0N1c3RvbWl6YXRpb25zID8gc3RhdHVzRGF0YS5jdXN0b21pemF0aW9ucyA6IG51bGwpO1xuICBzdGF0ZU1hbmFnZXIuc2V0VGFiRGF0YSgnY3YnLCBoYXNHZW5lcmF0ZWRGaWxlcyA/IHN0YXR1c0RhdGEuZ2VuZXJhdGVkX2ZpbGVzIDogbnVsbCk7XG4gIHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zID0gaGFzQ3VzdG9taXphdGlvbnMgPyBzdGF0dXNEYXRhLmN1c3RvbWl6YXRpb25zIDogbnVsbDtcblxuICBpZiAoaGFzQW5hbHlzaXMpIHtcbiAgICByZWZyZXNoQXRzU2NvcmUoJ2FuYWx5c2lzJyk7XG4gIH1cblxuICByZXR1cm4gaGFzQW5hbHlzaXMgfHwgaGFzQ3VzdG9taXphdGlvbnMgfHwgaGFzR2VuZXJhdGVkRmlsZXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc3RvcmVCYWNrZW5kU3RhdGUoKSB7XG4gIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2VydmVyIGhhZCBhbnkgbGl2ZSBzZXNzaW9uIGRhdGEuXG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdHVzUmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvc3RhdHVzJyk7XG4gICAgaWYgKCFzdGF0dXNSZXMub2spIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBzdGF0dXNEYXRhID0gcGFyc2VTdGF0dXNSZXNwb25zZShhd2FpdCBzdGF0dXNSZXMuanNvbigpKTtcblxuICAgIGlmICh0eXBlb2YgdXBkYXRlQXV0aEJhZGdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB1cGRhdGVBdXRoQmFkZ2Uoc3RhdHVzRGF0YS5jb3BpbG90X2F1dGggfHwge30sIHN0YXR1c0RhdGEubGxtX3Byb3ZpZGVyIHx8IG51bGwpO1xuICAgIH1cblxuICAgIF9oeWRyYXRlU3RhdHVzRGVyaXZlZFN0YXRlKHN0YXR1c0RhdGEpO1xuXG4gICAgbGV0IHNlcnZlckhhc0RhdGEgPSBfaHlkcmF0ZVN0YXR1c1RhYlN0YXRlKHN0YXR1c0RhdGEpO1xuXG4gICAgaWYgKHN0YXR1c0RhdGEuam9iX2FuYWx5c2lzICE9PSB1bmRlZmluZWQgJiYgc3RhdHVzRGF0YS5qb2JfYW5hbHlzaXMgIT09IG51bGwpIHtcbiAgICAgIGxvZy5pbmZvKCdSZXN0b3JlZCBhbmFseXNpcyBkYXRhIGZyb20gYmFja2VuZCBtZW1vcnknKTtcbiAgICB9XG4gICAgaWYgKHN0YXR1c0RhdGEuY3VzdG9taXphdGlvbnMgIT09IHVuZGVmaW5lZCAmJiBzdGF0dXNEYXRhLmN1c3RvbWl6YXRpb25zICE9PSBudWxsKSB7XG4gICAgICBsb2cuaW5mbygnUmVzdG9yZWQgY3VzdG9taXphdGlvbnMgZGF0YSBmcm9tIGJhY2tlbmQgbWVtb3J5Jyk7XG4gICAgfVxuICAgIGlmIChzdGF0dXNEYXRhLmdlbmVyYXRlZF9maWxlcyAhPT0gdW5kZWZpbmVkICYmIHN0YXR1c0RhdGEuZ2VuZXJhdGVkX2ZpbGVzICE9PSBudWxsKSB7XG4gICAgICBsb2cuaW5mbygnUmVzdG9yZWQgQ1YgZGF0YSBmcm9tIGJhY2tlbmQgbWVtb3J5Jyk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGdlbmVyYXRpb25SZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9jdi9nZW5lcmF0aW9uLXN0YXRlJyk7XG4gICAgICBpZiAoZ2VuZXJhdGlvblJlcy5vaykge1xuICAgICAgICBjb25zdCBnZW5lcmF0aW9uRGF0YSA9IGF3YWl0IGdlbmVyYXRpb25SZXMuanNvbigpO1xuICAgICAgICBpZiAoZ2VuZXJhdGlvbkRhdGE/Lm9rKSB7XG4gICAgICAgICAgY29uc3QgaGFzQ2FjaGVkQXRzU2NvcmUgPSBCb29sZWFuKGdlbmVyYXRpb25EYXRhLmF0c19zY29yZSk7XG4gICAgICAgICAgY29uc3QgaGFzUGVyc2lzdGVkR2VuZXJhdGlvbkRhdGEgPSBCb29sZWFuKFxuICAgICAgICAgICAgZ2VuZXJhdGlvbkRhdGEucHJldmlld19hdmFpbGFibGVcbiAgICAgICAgICAgICAgfHwgZ2VuZXJhdGlvbkRhdGEuZmluYWxfZ2VuZXJhdGVkX2F0XG4gICAgICAgICAgICAgIHx8IGhhc0NhY2hlZEF0c1Njb3JlXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHN0YXRlTWFuYWdlci5zZXRHZW5lcmF0aW9uU3RhdGUoe1xuICAgICAgICAgICAgcGhhc2U6IGdlbmVyYXRpb25EYXRhLnBoYXNlIHx8ICdpZGxlJyxcbiAgICAgICAgICAgIHByZXZpZXdBdmFpbGFibGU6IEJvb2xlYW4oZ2VuZXJhdGlvbkRhdGEucHJldmlld19hdmFpbGFibGUpLFxuICAgICAgICAgICAgcHJldmlld091dHB1dHM6IGdlbmVyYXRpb25EYXRhLnByZXZpZXdfb3V0cHV0cyB8fCBudWxsLFxuICAgICAgICAgICAgbGF5b3V0Q29uZmlybWVkOiBCb29sZWFuKGdlbmVyYXRpb25EYXRhLmxheW91dF9jb25maXJtZWQpLFxuICAgICAgICAgICAgcGFnZUNvdW50RXN0aW1hdGU6IGdlbmVyYXRpb25EYXRhLnBhZ2VfY291bnRfZXN0aW1hdGUgPz8gbnVsbCxcbiAgICAgICAgICAgIHBhZ2VDb3VudEV4YWN0OiBnZW5lcmF0aW9uRGF0YS5wYWdlX2NvdW50X2V4YWN0ID8/IG51bGwsXG4gICAgICAgICAgICBwYWdlQ291bnRDb25maWRlbmNlOiBnZW5lcmF0aW9uRGF0YS5wYWdlX2NvdW50X2NvbmZpZGVuY2UgPz8gbnVsbCxcbiAgICAgICAgICAgIHBhZ2VDb3VudFNvdXJjZTogZ2VuZXJhdGlvbkRhdGEucGFnZV9jb3VudF9zb3VyY2UgfHwgbnVsbCxcbiAgICAgICAgICAgIHBhZ2VOZWVkc0V4YWN0UmVjaGVjazogQm9vbGVhbihcbiAgICAgICAgICAgICAgZ2VuZXJhdGlvbkRhdGEucGFnZV9jb3VudF9uZWVkc19leGFjdF9yZWNoZWNrLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHBhZ2VXYXJuaW5nOiBCb29sZWFuKGdlbmVyYXRpb25EYXRhLnBhZ2VfbGVuZ3RoX3dhcm5pbmcpLFxuICAgICAgICAgICAgbGF5b3V0SW5zdHJ1Y3Rpb25zQ291bnQ6IGdlbmVyYXRpb25EYXRhLmxheW91dF9pbnN0cnVjdGlvbnNfY291bnQgfHwgMCxcbiAgICAgICAgICAgIGZpbmFsR2VuZXJhdGVkQXQ6IGdlbmVyYXRpb25EYXRhLmZpbmFsX2dlbmVyYXRlZF9hdCB8fCBudWxsLFxuICAgICAgICAgICAgcHJldmlld0dlbmVyYXRlZEF0OiBnZW5lcmF0aW9uRGF0YS5wcmV2aWV3X2dlbmVyYXRlZF9hdCB8fCBudWxsLFxuICAgICAgICAgICAgcHJldmlld1JlcXVlc3RJZDogZ2VuZXJhdGlvbkRhdGEucHJldmlld19yZXF1ZXN0X2lkIHx8IG51bGwsXG4gICAgICAgICAgICBjb25maXJtZWRBdDogZ2VuZXJhdGlvbkRhdGEuY29uZmlybWVkX2F0IHx8IG51bGwsXG4gICAgICAgICAgICAvLyBPcHRpb25hbCBzZXJ2ZXItcHJvdmlkZWQgcmV2aXNpb24gbWV0YWRhdGEgKGlmIGJhY2tlbmQgZXhwb3NlcyB0aGVtKVxuICAgICAgICAgICAgY29udGVudFJldmlzaW9uOiAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHYgPSBnZW5lcmF0aW9uRGF0YS5jb250ZW50X3JldmlzaW9uID8/IGdlbmVyYXRpb25EYXRhLmNvbnRlbnRSZXZpc2lvbjtcbiAgICAgICAgICAgICAgcmV0dXJuICh2ID09PSB1bmRlZmluZWQgfHwgdiA9PT0gbnVsbCkgPyAwIDogKE51bWJlci5pc0Zpbml0ZShOdW1iZXIodikpID8gTnVtYmVyKHYpIDogMCk7XG4gICAgICAgICAgICB9KSgpLFxuICAgICAgICAgICAgbGFzdFByZXZpZXdDb250ZW50UmV2aXNpb246IGdlbmVyYXRpb25EYXRhLmxhc3RfcHJldmlld19jb250ZW50X3JldmlzaW9uID8/IGdlbmVyYXRpb25EYXRhLmxhc3RQcmV2aWV3Q29udGVudFJldmlzaW9uID8/IG51bGwsXG4gICAgICAgICAgICBsYXN0RmluYWxDb250ZW50UmV2aXNpb246IGdlbmVyYXRpb25EYXRhLmxhc3RfZmluYWxfY29udGVudF9yZXZpc2lvbiA/PyBnZW5lcmF0aW9uRGF0YS5sYXN0RmluYWxDb250ZW50UmV2aXNpb24gPz8gbnVsbCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmIChoYXNDYWNoZWRBdHNTY29yZSkge1xuICAgICAgICAgICAgc3RhdGVNYW5hZ2VyLnNldEF0c1Njb3JlKGdlbmVyYXRpb25EYXRhLmF0c19zY29yZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXRlTWFuYWdlci5jbGVhckF0c1Njb3JlKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGhhc1BlcnNpc3RlZEdlbmVyYXRpb25EYXRhKSB7XG4gICAgICAgICAgICBzZXJ2ZXJIYXNEYXRhID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChfZSkgeyAvKiBub24tZmF0YWwgKi8gfVxuXG4gICAgY29uc3QgcmVzdG9yZWRQaGFzZSA9IF9yZXNvbHZlUmVzdG9yZWRQaGFzZShzdGF0dXNEYXRhKTtcbiAgICBzdGF0ZU1hbmFnZXIuc2V0UGhhc2UocmVzdG9yZWRQaGFzZSk7XG4gICAgX3Jlc3RvcmVUYWJGb3JQaGFzZShyZXN0b3JlZFBoYXNlKTtcblxuICAgIC8vIEtlZXAgdGhlIHBvc2l0aW9uLXRpdGxlIGVsZW1lbnQgaW4gc3luYyB3aGVuZXZlciB3ZSByZXN0b3JlIHN0YXR1cyBkYXRhLlxuICAgIGlmICh0eXBlb2YgdXBkYXRlUG9zaXRpb25UaXRsZSA9PT0gJ2Z1bmN0aW9uJykgdXBkYXRlUG9zaXRpb25UaXRsZShzdGF0dXNEYXRhKTtcblxuICAgIGlmICh0eXBlb2YgdXBkYXRlSW5jbHVzaW9uQ291bnRzID09PSAnZnVuY3Rpb24nKSB1cGRhdGVJbmNsdXNpb25Db3VudHMoKTtcblxuICAgIGlmICghc3RhdHVzRGF0YS5wb3NpdGlvbl9uYW1lICYmICFzdGF0dXNEYXRhLmpvYl9hbmFseXNpcykge1xuICAgICAgY29uc3Qgc3RvcmVkUGF0aCAgICA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFN0b3JhZ2VLZXlzLlNFU1NJT05fUEFUSCk7XG4gICAgICBjb25zdCBzdG9yZWRTZXNzaW9uID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oU3RvcmFnZUtleXMuU0VTU0lPTl9JRCk7XG4gICAgICBjb25zdCBjdXJyZW50U2Vzc2lvbiA9IGdldFNlc3Npb25JZEZyb21VUkwgPyBnZXRTZXNzaW9uSWRGcm9tVVJMKCkgOiBudWxsO1xuICAgICAgLy8gT25seSBhdXRvLXJlc3RvcmUgZnJvbSBkaXNrIHdoZW4gcmVjb25uZWN0aW5nIHRvIHRoZSBTQU1FIHNlc3Npb25cbiAgICAgIC8vIChzdG9yZWRTZXNzaW9uIG1hdGNoZXMgdGhlIGN1cnJlbnQgVVJMIHNlc3Npb25faWQpLiAgQSBmcmVzaCBuZXcgc2Vzc2lvblxuICAgICAgLy8gd2lsbCBoYXZlIGEgZGlmZmVyZW50IElELCBzbyB0aGlzIGd1YXJkIHByZXZlbnRzIHRoZSBuZXcgc2Vzc2lvbiBmcm9tXG4gICAgICAvLyBzaWxlbnRseSBsb2FkaW5nIHRoZSBwcmV2aW91cyBzZXNzaW9uJ3MgZGF0YSBvZmYgZGlzay5cbiAgICAgIGlmIChzdG9yZWRQYXRoICYmIHN0b3JlZFNlc3Npb24gJiYgc3RvcmVkU2Vzc2lvbiA9PT0gY3VycmVudFNlc3Npb24pIHtcbiAgICAgICAgLy8gUGFzcyByZWRpcmVjdE9uTWlzbWF0Y2g6ZmFsc2Ugc28gdGhhdCBpZiB0aGUgZmlsZSBvbiBkaXNrIGJlbG9uZ3MgdG8gYVxuICAgICAgICAvLyBkaWZmZXJlbnQgc2Vzc2lvbiAoZS5nLiBTRVNTSU9OX1BBVEggd2FzIG5ldmVyIHVwZGF0ZWQgYWZ0ZXIgYSBuZXdcbiAgICAgICAgLy8gc2Vzc2lvbiB3YXMgY3JlYXRlZCksIHdlIHNpbGVudGx5IHNraXAgdGhlIHJlc3RvcmUgcmF0aGVyIHRoYW5cbiAgICAgICAgLy8gbmF2aWdhdGluZyB0aGUgYnJvd3NlciB0byBhIHNlc3Npb24gdGhlIHVzZXIgZGlkbid0IGFzayBmb3IuXG4gICAgICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IGxvYWRTZXNzaW9uRmlsZShzdG9yZWRQYXRoLCB7IHJlZGlyZWN0T25NaXNtYXRjaDogZmFsc2UgfSk7XG4gICAgICAgIGlmIChsb2FkZWQpIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzZXJ2ZXJIYXNEYXRhO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy53YXJuKCdGYWlsZWQgdG8gcmVzdG9yZSBiYWNrZW5kIHN0YXRlOicsIGVycm9yKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9hZFNlc3Npb25GaWxlKHBhdGgsIHsgcmVkaXJlY3RPbk1pc21hdGNoID0gdHJ1ZSB9ID0ge30pIHtcbiAgdHJ5IHtcbiAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnXHVEODNEXHVERDA0IFJlc3RvcmluZyBzZXNzaW9uIGZyb20gZmlsZS4uLicpO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL2xvYWQtc2Vzc2lvbicsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHBhdGggfSlcbiAgICB9KTtcbiAgICBpZiAoIXJlcy5vaykge1xuICAgICAgY29uc3QgZXJyID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsIGBcdTI3NEMgRmFpbGVkIHRvIHJlc3RvcmUgc2Vzc2lvbjogJHtlcnIuZXJyb3J9YCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuXG4gICAgaWYgKGRhdGEucmVkaXJlY3RfdXJsICYmIGdldFNlc3Npb25JZEZyb21VUkwoKSAhPT0gZGF0YS5zZXNzaW9uX2lkKSB7XG4gICAgICBpZiAoIXJlZGlyZWN0T25NaXNtYXRjaCkge1xuICAgICAgICAvLyBUaGUgZmlsZSBvbiBkaXNrIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgc2Vzc2lvbiB0aGFuIHRoZSBvbmUgaW4gdGhlXG4gICAgICAgIC8vIFVSTC4gIFNpbGVudGx5IGFib3J0IHJhdGhlciB0aGFuIHJlZGlyZWN0aW5nIHRoZSBicm93c2VyIFx1MjAxNCB0aGUgY2FsbGVyXG4gICAgICAgIC8vIChyZXN0b3JlQmFja2VuZFN0YXRlKSBvbmx5IHdhbnRzIHRvIHJlc3RvcmUgVEhJUyBzZXNzaW9uLCBub3QgbG9hZCBhXG4gICAgICAgIC8vIGRpZmZlcmVudCBvbmUuXG4gICAgICAgIGxvZy53YXJuKFxuICAgICAgICAgICdsb2FkU2Vzc2lvbkZpbGU6IHNlc3Npb25faWQgbWlzbWF0Y2ggKHVybD0lcywgZmlsZT0lcyk7IHNraXBwaW5nIHJlc3RvcmUnLFxuICAgICAgICAgIGdldFNlc3Npb25JZEZyb21VUkwoKSwgZGF0YS5zZXNzaW9uX2lkLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKGRhdGEucmVkaXJlY3RfdXJsKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFN0b3JhZ2VLZXlzLlNFU1NJT05fUEFUSCwgZGF0YS5zZXNzaW9uX2ZpbGUgfHwgcGF0aCk7XG5cbiAgICAvLyBSZXNldCBzZXNzaW9uLXNjb3BlZCBzdWdnZXN0aW9uIHN0YXRlXG4gICAgd2luZG93Ll9zdWdnZXN0ZWRBY2hzT3JkZXJlZCA9IG51bGw7XG5cbiAgICAvLyBSZWxvYWQgY29udmVyc2F0aW9uIGhpc3RvcnkgZnJvbSB0aGUgZnJlc2hseS1sb2FkZWQgYmFja2VuZFxuICAgIGNvbnN0IGhpc3RvcnlSZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9oaXN0b3J5Jyk7XG4gICAgaWYgKGhpc3RvcnlSZXMub2spIHtcbiAgICAgIGNvbnN0IGhpc3RvcnlEYXRhID0gYXdhaXQgaGlzdG9yeVJlcy5qc29uKCk7XG4gICAgICBjb25zdCBjb252ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbnZlcnNhdGlvbicpO1xuICAgICAgY29udi5pbm5lckhUTUwgPSAnJztcbiAgICAgIChoaXN0b3J5RGF0YS5oaXN0b3J5IHx8IFtdKS5mb3JFYWNoKG1zZyA9PiB7XG4gICAgICAgIGlmIChtc2cucm9sZSAhPT0gJ3N5c3RlbScpIGFwcGVuZE1lc3NhZ2UobXNnLnJvbGUsIG1zZy5jb250ZW50KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnXHUyNkEwIENvdWxkIG5vdCByZXN0b3JlIGNvbnZlcnNhdGlvbiBoaXN0b3J5LicpO1xuICAgIH1cblxuICAgIGF3YWl0IGZldGNoU3RhdHVzKCk7XG5cbiAgICAvLyBSdW4gYSBiYWNrZ3JvdW5kIGhlYWx0aCBjaGVjayBzbyB0aGUgc3RhdHVzIHBpbGwgcmVmbGVjdHMgbGl2ZSBjb25uZWN0aXZpdHkuXG4gICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzLnRlc3RDdXJyZW50TW9kZWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGdsb2JhbFRoaXMudGVzdEN1cnJlbnRNb2RlbCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICB9XG5cbiAgICAvLyBSZWh5ZHJhdGUgdGFiRGF0YSBhbmQgc3dpdGNoIHRvIHRoZSBjb3JyZWN0IHRhYiBmb3IgdGhlIHJlc3RvcmVkIHBoYXNlXG4gICAgY29uc3Qgc2Vzc2lvblBoYXNlID0gZGF0YS5waGFzZSB8fCBQSEFTRVMuSU5JVDtcbiAgICBjb25zdCBwaGFzZVRhYk1hcCA9IHtcbiAgICAgIFtQSEFTRVMuSU5JVF06ICAgICAgICAgICAgICdqb2InLFxuICAgICAgW1BIQVNFUy5KT0JfQU5BTFlTSVNdOiAgICAgJ2FuYWx5c2lzJyxcbiAgICAgIFtQSEFTRVMuQ1VTVE9NSVpBVElPTl06ICAgICdleHAtcmV2aWV3JyxcbiAgICAgIFtQSEFTRVMuUkVXUklURV9SRVZJRVddOiAgICdyZXdyaXRlJyxcbiAgICAgIFtQSEFTRVMuU1BFTExfQ0hFQ0tdOiAgICAgICdzcGVsbCcsXG4gICAgICBbUEhBU0VTLkdFTkVSQVRJT05dOiAgICAgICAnbGF5b3V0JyxcbiAgICAgIFtQSEFTRVMuTEFZT1VUX1JFVklFV106ICAgICdsYXlvdXQnLFxuICAgICAgW1BIQVNFUy5GSU5BTF9HRU5FUkFUSU9OXTogJ2ZpbmFsX2dlbmVyYXRlJyxcbiAgICAgIFtQSEFTRVMuUkVGSU5FTUVOVF06ICAgICAgICdkb3dubG9hZCcsXG4gICAgfTtcbiAgICBjb25zdCB0YXJnZXRUYWIgPSBwaGFzZVRhYk1hcFtzZXNzaW9uUGhhc2VdIHx8ICdqb2InO1xuXG4gICAgY29uc3QgY3VzdG9taXphdGlvblBoYXNlcyA9IFtcbiAgICAgIFBIQVNFUy5DVVNUT01JWkFUSU9OLCBQSEFTRVMuUkVXUklURV9SRVZJRVcsIFBIQVNFUy5TUEVMTF9DSEVDSyxcbiAgICAgIFBIQVNFUy5HRU5FUkFUSU9OLCBQSEFTRVMuTEFZT1VUX1JFVklFVywgUEhBU0VTLkZJTkFMX0dFTkVSQVRJT04sIFBIQVNFUy5SRUZJTkVNRU5ULFxuICAgIF07XG4gICAgaWYgKGN1c3RvbWl6YXRpb25QaGFzZXMuaW5jbHVkZXMoc2Vzc2lvblBoYXNlKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgczIgPSBhd2FpdCBmZXRjaCgnL2FwaS9zdGF0dXMnKTtcbiAgICAgICAgY29uc3Qgc2QgPSBwYXJzZVN0YXR1c1Jlc3BvbnNlKGF3YWl0IHMyLmpzb24oKSk7XG4gICAgICAgIF9oeWRyYXRlU3RhdHVzRGVyaXZlZFN0YXRlKHNkKTtcbiAgICAgICAgX2h5ZHJhdGVTdGF0dXNUYWJTdGF0ZShzZCk7XG4gICAgICB9IGNhdGNoIChfKSB7IC8qIG5vbi1mYXRhbCAqLyB9XG4gICAgfVxuXG4gICAgLy8gRm9yIHJld3JpdGVfcmV2aWV3IHBoYXNlLCBwcmUtcG9wdWxhdGUgdGhlIHJld3JpdGUgcGFuZWwgY2FjaGVcbiAgICBpZiAoc2Vzc2lvblBoYXNlID09PSBQSEFTRVMuUkVXUklURV9SRVZJRVcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJyID0gYXdhaXQgZmV0Y2goJy9hcGkvcmV3cml0ZXMnKTtcbiAgICAgICAgaWYgKHJyLm9rKSB7XG4gICAgICAgICAgY29uc3QgcmQgPSBwYXJzZVJld3JpdGVzUmVzcG9uc2UoYXdhaXQgcnIuanNvbigpKTtcbiAgICAgICAgICBjb25zdCByZXdyaXRlcyA9IHJkLnJld3JpdGVzIHx8IFtdO1xuICAgICAgICAgIGNvbnN0IHdhcm5pbmdzID0gcmQucGVyc3Vhc2lvbl93YXJuaW5ncyB8fCBbXTtcbiAgICAgICAgICByZXdyaXRlRGVjaXNpb25zID0ge307XG4gICAgICAgICAgcmVuZGVyUmV3cml0ZVBhbmVsKHJld3JpdGVzLCB3YXJuaW5ncyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKF8pIHsgLyogbm9uLWZhdGFsICovIH1cbiAgICB9XG5cbiAgICBzd2l0Y2hUYWIodGFyZ2V0VGFiKTtcbiAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCBgXHUyNzA1IFNlc3Npb24gcmVzdG9yZWQ6ICR7ZGF0YS5wb3NpdGlvbl9uYW1lIHx8ICdVbm5hbWVkJ30gKCR7U0VTU0lPTl9QSEFTRV9MQUJFTFNbZGF0YS5waGFzZV0gfHwgU3RyaW5nKGRhdGEucGhhc2UgfHwgUEhBU0VTLklOSVQpLnJlcGxhY2UoL18vZywgJyAnKX0pYCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsIGBcdTI3NEMgRXJyb3IgcmVzdG9yaW5nIHNlc3Npb246ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUmVuYW1lIC8gdGFiIGRhdGEgcGVyc2lzdGVuY2Vcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5hc3luYyBmdW5jdGlvbiBwcm9tcHRSZW5hbWVDdXJyZW50U2Vzc2lvbigpIHtcbiAgY29uc3QgdGl0bGVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwb3NpdGlvbi10aXRsZScpO1xuICBjb25zdCByZW5hbWVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVuYW1lLXNlc3Npb24tYnRuJyk7XG4gIGNvbnN0IGN1cnJlbnQgPSAodGl0bGVFbD8udGV4dENvbnRlbnQgfHwgJycpLnRyaW0oKTtcblxuICAvLyBCdWlsZCBpbmxpbmUgaW5wdXQgd2lkZ2V0IHNvIHdlIG5ldmVyIGNhbGwgd2luZG93LnByb21wdCgpXG4gIGNvbnN0IHdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gIHdyYXBwZXIuc3R5bGUuY3NzVGV4dCA9ICdkaXNwbGF5OmlubGluZS1mbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6NHB4Oyc7XG4gIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgaW5wdXQudHlwZSA9ICd0ZXh0JztcbiAgaW5wdXQudmFsdWUgPSBjdXJyZW50O1xuICBpbnB1dC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnTmV3IHNlc3Npb24gbmFtZScpO1xuICBpbnB1dC5zdHlsZS5jc3NUZXh0ID0gJ2ZvbnQtc2l6ZTppbmhlcml0O3BhZGRpbmc6MXB4IDRweDtib3JkZXI6MXB4IHNvbGlkICM5NGEzYjg7Ym9yZGVyLXJhZGl1czozcHg7d2lkdGg6MjIwcHg7JztcbiAgY29uc3Qgb2tCdG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgb2tCdG4udGV4dENvbnRlbnQgPSAnXHUyNzEzJztcbiAgb2tCdG4udGl0bGUgPSAnU2F2ZSByZW5hbWUnO1xuICBva0J0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnU2F2ZSByZW5hbWUnKTtcbiAgb2tCdG4uc3R5bGUuY3NzVGV4dCA9ICdiYWNrZ3JvdW5kOiMxMGI5ODE7Y29sb3I6I2ZmZjtib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjNweDtjdXJzb3I6cG9pbnRlcjtwYWRkaW5nOjFweCA2cHg7Zm9udC1zaXplOjFlbTsnO1xuICBjb25zdCBjYW5jZWxCdG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgY2FuY2VsQnRuLnRleHRDb250ZW50ID0gJ1x1MjcxNSc7XG4gIGNhbmNlbEJ0bi50aXRsZSA9ICdDYW5jZWwgcmVuYW1lJztcbiAgY2FuY2VsQnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsICdDYW5jZWwgcmVuYW1lJyk7XG4gIGNhbmNlbEJ0bi5zdHlsZS5jc3NUZXh0ID0gJ2JhY2tncm91bmQ6IzZiNzI4MDtjb2xvcjojZmZmO2JvcmRlcjpub25lO2JvcmRlci1yYWRpdXM6M3B4O2N1cnNvcjpwb2ludGVyO3BhZGRpbmc6MXB4IDZweDtmb250LXNpemU6MWVtOyc7XG4gIHdyYXBwZXIuYXBwZW5kKGlucHV0LCBva0J0biwgY2FuY2VsQnRuKTtcblxuICBpZiAodGl0bGVFbCkgdGl0bGVFbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBpZiAocmVuYW1lQnRuKSByZW5hbWVCdG4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgdGl0bGVFbD8ucGFyZW50RWxlbWVudD8uaW5zZXJ0QmVmb3JlKHdyYXBwZXIsIHRpdGxlRWwpO1xuICBpbnB1dC5mb2N1cygpO1xuICBpbnB1dC5zZWxlY3QoKTtcblxuICBhc3luYyBmdW5jdGlvbiBkb1JlbmFtZSgpIHtcbiAgICBjb25zdCBuZXdOYW1lID0gaW5wdXQudmFsdWUudHJpbSgpO1xuICAgIGNsZWFudXAoKTtcbiAgICBpZiAoIW5ld05hbWUgfHwgbmV3TmFtZSA9PT0gY3VycmVudCkgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvcmVuYW1lLWN1cnJlbnQtc2Vzc2lvbicsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IG5ld19uYW1lOiBuZXdOYW1lIH0pLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLm9rKSBhd2FpdCBmZXRjaFN0YXR1cygpO1xuICAgICAgZWxzZSBpZiAodHlwZW9mIHNob3dUb2FzdCA9PT0gJ2Z1bmN0aW9uJykgc2hvd1RvYXN0KGBSZW5hbWUgZmFpbGVkOiAke2RhdGEuZXJyb3J9YCwgJ2Vycm9yJyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHNob3dUb2FzdChgUmVuYW1lIGVycm9yOiAke2UubWVzc2FnZX1gLCAnZXJyb3InKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgIHdyYXBwZXIucmVtb3ZlKCk7XG4gICAgaWYgKHRpdGxlRWwpIHRpdGxlRWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgIGlmIChyZW5hbWVCdG4pIHJlbmFtZUJ0bi5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gIH1cblxuICBva0J0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGRvUmVuYW1lKTtcbiAgY2FuY2VsQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xlYW51cCk7XG4gIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBlID0+IHtcbiAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicpIGRvUmVuYW1lKCk7XG4gICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgY2xlYW51cCgpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gc2F2ZVRhYkRhdGEoKSB7XG4gIHRyeSB7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oZ2V0U2NvcGVkVGFiRGF0YVN0b3JhZ2VLZXkoc3RhdGVNYW5hZ2VyLmdldFNlc3Npb25JZCgpKSwgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgdGFiRGF0YTogc3RhdGVNYW5hZ2VyLmdldEFsbFRhYkRhdGEoKSxcbiAgICAgIGN1cnJlbnRUYWI6IHN0YXRlTWFuYWdlci5nZXRDdXJyZW50VGFiKCksXG4gICAgICBwZW5kaW5nUmVjb21tZW5kYXRpb25zOiB3aW5kb3cucGVuZGluZ1JlY29tbWVuZGF0aW9ucyB8fCBudWxsLFxuICAgICAgaW50ZXJhY3RpdmVTdGF0ZTogc3RhdGVNYW5hZ2VyLmdldEludGVyYWN0aXZlU3RhdGUoKSxcbiAgICAgIGFjdGl2ZVJldmlld1BhbmU6IHdpbmRvdy5fYWN0aXZlUmV2aWV3UGFuZSB8fCAnZXhwZXJpZW5jZXMnLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpXG4gICAgfSkpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy53YXJuKCdGYWlsZWQgdG8gc2F2ZSB0YWIgZGF0YTonLCBlcnJvcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzdG9yZVRhYkRhdGEoeyB1aVByZWZzT25seSA9IGZhbHNlIH0gPSB7fSkge1xuICB0cnkge1xuICAgIGNvbnN0IHNhdmVkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oZ2V0U2NvcGVkVGFiRGF0YVN0b3JhZ2VLZXkoc3RhdGVNYW5hZ2VyLmdldFNlc3Npb25JZCgpKSk7XG4gICAgaWYgKHNhdmVkKSB7XG4gICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShzYXZlZCk7XG5cbiAgICAgIGNvbnN0IGFnZSA9IERhdGUubm93KCkgLSAoZGF0YS50aW1lc3RhbXAgfHwgMCk7XG4gICAgICBpZiAoYWdlIDwgMjQgKiA2MCAqIDYwICogMTAwMCkge1xuICAgICAgICBpZiAoIXVpUHJlZnNPbmx5KSB7XG4gICAgICAgICAgaWYgKGRhdGEudGFiRGF0YSkge1xuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoZGF0YS50YWJEYXRhKS5mb3JFYWNoKChbdGFiLCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgICAgc3RhdGVNYW5hZ2VyLnNldFRhYkRhdGEodGFiLCB2YWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGRhdGEucGVuZGluZ1JlY29tbWVuZGF0aW9ucykge1xuICAgICAgICAgICAgd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnMgPSBkYXRhLnBlbmRpbmdSZWNvbW1lbmRhdGlvbnM7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChkYXRhLmludGVyYWN0aXZlU3RhdGUpIHtcbiAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zZXRJbnRlcmFjdGl2ZVN0YXRlKGRhdGEuaW50ZXJhY3RpdmVTdGF0ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhLmFjdGl2ZVJldmlld1BhbmUpIHtcbiAgICAgICAgICB3aW5kb3cuX2FjdGl2ZVJldmlld1BhbmUgPSBkYXRhLmFjdGl2ZVJldmlld1BhbmU7XG4gICAgICAgIH1cblxuICAgICAgICBsb2cuaW5mbyhgUmVzdG9yZWQgdGFiIGRhdGEgZnJvbSBsb2NhbFN0b3JhZ2UgKHVpUHJlZnNPbmx5PSR7dWlQcmVmc09ubHl9KWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oZ2V0U2NvcGVkVGFiRGF0YVN0b3JhZ2VLZXkoc3RhdGVNYW5hZ2VyLmdldFNlc3Npb25JZCgpKSk7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy53YXJuKCdGYWlsZWQgdG8gcmVzdG9yZSB0YWIgZGF0YTonLCBlcnJvcik7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIEVTIG1vZHVsZSBleHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuZXhwb3J0IHtcbiAgZm9ybWF0U2Vzc2lvblBoYXNlTGFiZWwsXG4gIF9nZXRDdXJyZW50U2Vzc2lvbklkVmFsdWUsXG4gIF9nZXRDdXJyZW50T3duZXJUb2tlblZhbHVlLFxuICBidWlsZFNlc3Npb25Td2l0Y2hlckxhYmVsLFxuICBnZXRBY3RpdmVTZXNzaW9uT3duZXJzaGlwTWV0YSxcbiAgZm9ybWF0U2Vzc2lvblRpbWVzdGFtcCxcbiAgY3JlYXRlTmV3U2Vzc2lvbkFuZE5hdmlnYXRlLFxuICBjcmVhdGVOZXdTZXNzaW9uSW5OZXdUYWIsXG4gIG9uYm9hcmRpbmdDcmVhdGVFbXB0eVByb2ZpbGUsXG4gIHNob3dPbmJvYXJkaW5nTW9kYWwsXG4gIG1heWJlU2hvd1dlbGNvbWVNb2RhbCxcbiAgc2hvd1dlbGNvbWVNb2RhbCxcbiAgY2xvc2VXZWxjb21lTW9kYWwsXG4gIF9jbGFpbUN1cnJlbnRTZXNzaW9uLFxuICBfcmVzb2x2ZVJlc3RvcmVkUGhhc2UsXG4gIHNob3dTZXNzaW9uc0xhbmRpbmdQYW5lbCxcbiAgZW5zdXJlU2Vzc2lvbkNvbnRleHQsXG4gIHJlc3RvcmVTZXNzaW9uLFxuICByZXN0b3JlQmFja2VuZFN0YXRlLFxuICBsb2FkU2Vzc2lvbkZpbGUsXG4gIHByb21wdFJlbmFtZUN1cnJlbnRTZXNzaW9uLFxuICBzYXZlVGFiRGF0YSxcbiAgcmVzdG9yZVRhYkRhdGEsXG59O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvam9iLWlucHV0LmpzXG4gKiBKb2IgZGVzY3JpcHRpb24gaW5wdXQgcGFuZWw6IHBhc3RlLCBVUkwgZmV0Y2gsIGZpbGUgdXBsb2FkLCBsb2FkLWl0ZW1zIHRhYmxlLlxuICpcbiAqIERFUEVOREVOQ0lFUyAoYWxsIG9uIGdsb2JhbFRoaXMgYXQgcnVudGltZSk6XG4gKiAgIC0gbWFya2VkLCBkb21wdXJpZnkgKG5wbSBcdTIwMTQgYnVuZGxlZDsgdXNlZCBpbnRlcm5hbGx5IGZvciBzYWZlIG1hcmtkb3duIHJlbmRlcmluZylcbiAqICAgLSBlc2NhcGVIdG1sICh1dGlscy5qcylcbiAqICAgLSBhcHBlbmRNZXNzYWdlLCBhcHBlbmRSZXRyeU1lc3NhZ2UgKG1lc3NhZ2UtcXVldWUuanMpXG4gKiAgIC0gc2V0TG9hZGluZyAoZmV0Y2gtdXRpbHMuanMpXG4gKiAgIC0gc2F2ZVRhYkRhdGEgKHNlc3Npb24tbWFuYWdlci5qcylcbiAqICAgLSBzd2l0Y2hUYWIgKHJldmlldy10YWJsZS1iYXNlLmpzLCBUaWVyIDQpXG4gKiAgIC0gYW5hbHl6ZUpvYiAoam9iLWFuYWx5c2lzLmpzKVxuICogICAtIGZldGNoU3RhdHVzIChhcGktY2xpZW50LmpzKVxuICogICAtIHNob3dBbGVydE1vZGFsICh1aS1oZWxwZXJzLmpzKVxuICogICAtIHN0YXRlTWFuYWdlciAoc3RhdGUtbWFuYWdlci5qcyBcdTIwMTQgZ2V0Q3VycmVudFRhYigpL3NldFRhYkRhdGEoKSlcbiAqICAgLSBQSEFTRVMgKHdpbmRvdyBnbG9iYWwpXG4gKlxuICogR0FQLTIzIGludGFrZSBjb25maXJtYXRpb246XG4gKiAgIEFsbCBqb2ItdGV4dCBzdWJtaXNzaW9ucyAocGFzdGUsIFVSTCwgZmlsZSkgcm91dGUgZGlyZWN0bHkgdG8gYW5hbHl6ZUpvYigpXG4gKiAgIHNvIGV2ZXJ5IHNvdXJjZSBmb2xsb3dzIHRoZSBzYW1lIHBvc3QtYW5hbHlzaXMgaW50YWtlIHBhdGguXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdqb2ItaW5wdXQnKTtcblxuaW1wb3J0IHsgUEhBU0VTLCBzdGF0ZU1hbmFnZXIgfSBmcm9tICcuL3N0YXRlLW1hbmFnZXIuanMnO1xuaW1wb3J0IHsgbWFya2VkIH0gZnJvbSAnbWFya2VkJztcbmltcG9ydCBET01QdXJpZnkgZnJvbSAnZG9tcHVyaWZ5JztcblxuLy8gUmVuZGVyIGpvYiBkZXNjcmlwdGlvbiB0ZXh0IHNhZmVseTogbWFya2VkIHBhcnNlcyBHRk0gKGluY2x1ZGluZyBlbWJlZGRlZCBIVE1MXG4vLyBhbmQgYXV0b2xpbmtzKSwgRE9NUHVyaWZ5IHNhbml0aXplcyB0aGUgb3V0cHV0IGJlZm9yZSB3cml0aW5nIHRvIGlubmVySFRNTC5cbi8vIEZPUkJJRF9BVFRSOiBbJ3N0eWxlJ10gc3RyaXBzIGlubGluZSBDU1MgZnJvbSBIVE1MIGVtYmVkZGVkIGluIHRoZSBqb2IgdGV4dFxuLy8gKGUuZy4gV29yZC1zdHlsZSBmb250LXNpemUvZm9udC1mYW1pbHkgZnJvbSBKU09OLUxEIGRlc2NyaXB0aW9uIGZpZWxkcyksXG4vLyBzbyB0aGUgcGFnZSdzIG93biBzdHlsZXNoZWV0IGNvbnRyb2xzIGZvbnQgcmVuZGVyaW5nIGNvbnNpc3RlbnRseS5cbmZ1bmN0aW9uIF9yZW5kZXJKb2JUZXh0KHRleHQpIHtcbiAgY29uc3QgcmF3ID0gbWFya2VkLnBhcnNlKHRleHQsIHsgZ2ZtOiB0cnVlLCBicmVha3M6IHRydWUgfSk7XG4gIHJldHVybiBET01QdXJpZnkuc2FuaXRpemUocmF3LCB7IEZPUkJJRF9BVFRSOiBbJ3N0eWxlJ10gfSk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gSm9iIHRhYiBkaXNwbGF5XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuYXN5bmMgZnVuY3Rpb24gcG9wdWxhdGVKb2JUYWIoKSB7XG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9jdW1lbnQtY29udGVudCcpO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3N0YXR1cycpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuXG4gICAgaWYgKGRhdGEuam9iX2Rlc2NyaXB0aW9uX3RleHQpIHtcbiAgICAgIGNvbnN0IGpvYlRleHQgPSBkYXRhLmpvYl9kZXNjcmlwdGlvbl90ZXh0O1xuICAgICAgY29uc3QgcG9zaXRpb25OYW1lID0gZGF0YS5wb3NpdGlvbl9uYW1lIHx8IG51bGw7XG4gICAgICBjb25zdCBqb2JVcmwgPSBkYXRhLmpvYl91cmwgfHwgbnVsbDtcbiAgICAgIGNvbnN0IHRpdGxlVGV4dCA9IHBvc2l0aW9uTmFtZVxuICAgICAgICA/IGVzY2FwZUh0bWwocG9zaXRpb25OYW1lKVxuICAgICAgICA6ICc8ZW0gc3R5bGU9XCJjb2xvcjojOWNhM2FmO1wiPlBvc2l0aW9uIHRpdGxlIG5vdCB5ZXQgZXh0cmFjdGVkXHUyMDI2PC9lbT4nO1xuICAgICAgY29uc3QgdGl0bGVDb250ZW50ID0gKHBvc2l0aW9uTmFtZSAmJiBqb2JVcmwpXG4gICAgICAgID8gYDxhIGhyZWY9XCIke2VzY2FwZUh0bWwoam9iVXJsKX1cIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCIgc3R5bGU9XCJjb2xvcjppbmhlcml0O3RleHQtZGVjb3JhdGlvbjpub25lO1wiPiR7dGl0bGVUZXh0fTwvYT5gXG4gICAgICAgIDogdGl0bGVUZXh0O1xuICAgICAgbGV0IGh0bWwgPSAnPGgxPicgKyB0aXRsZUNvbnRlbnQgKyAnPC9oMT4nO1xuICAgICAgaWYgKGpvYlVybCkge1xuICAgICAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwibWF4LXdpZHRoOjEwMCU7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7d2hpdGUtc3BhY2U6bm93cmFwO2NvbG9yOiM2NDc0OGI7Zm9udC1zaXplOjAuODVlbTttYXJnaW46LThweCAwIDhweCAwO1wiIHRpdGxlPVwiJHtlc2NhcGVIdG1sKGpvYlVybCl9XCI+PGEgaHJlZj1cIiR7ZXNjYXBlSHRtbChqb2JVcmwpfVwiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIiBzdHlsZT1cImNvbG9yOiMzYjgyZjY7dGV4dC1kZWNvcmF0aW9uOm5vbmU7XCI+JHtlc2NhcGVIdG1sKGpvYlVybCl9PC9hPjwvZGl2PmA7XG4gICAgICB9XG5cbiAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJsaW5lLWhlaWdodDogMS42OyBiYWNrZ3JvdW5kOiAjZjhmOWZhOyBwYWRkaW5nOiAyMHB4OyBib3JkZXItcmFkaXVzOiA4cHg7IG1hcmdpbjogMjBweCAwO1wiPicgKyBfcmVuZGVySm9iVGV4dChqb2JUZXh0KSArICc8L2Rpdj4nO1xuXG4gICAgICBjb25zdCBhbmFseXplQnRuID0gZGF0YS5waGFzZSA9PT0gUEhBU0VTLklOSVRcbiAgICAgICAgPyAnPGJ1dHRvbiBvbmNsaWNrPVwiYW5hbHl6ZUpvYigpXCIgY2xhc3M9XCJidG4tcHJpbWFyeVwiIHN0eWxlPVwibWFyZ2luLXJpZ2h0OjhweDtcIj5cdUQ4M0RcdUREMEQgQW5hbHlzZSBKb2I8L2J1dHRvbj4nXG4gICAgICAgIDogJyc7XG4gICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDoyMHB4O1wiPicgKyBhbmFseXplQnRuICsgJzxidXR0b24gb25jbGljaz1cInNob3dMb2FkSm9iUGFuZWwoKVwiIGNsYXNzPVwiYnRuLXNlY29uZGFyeVwiPlx1RDgzRFx1RENFNSBMb2FkIERpZmZlcmVudCBKb2I8L2J1dHRvbj48L2Rpdj4nO1xuICAgICAgY29udGVudC5pbm5lckhUTUwgPSBodG1sO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBzaG93TG9hZEpvYlBhbmVsKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy5lcnJvcignRXJyb3IgbG9hZGluZyBqb2IgZGVzY3JpcHRpb246JywgZXJyb3IpO1xuICAgIGF3YWl0IHNob3dMb2FkSm9iUGFuZWwoKTtcbiAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIExvYWQtam9iIHBhbmVsIChzZXNzaW9ucyArIHNlcnZlciBmaWxlcyB0YWJsZSArIGlucHV0IG1ldGhvZHMpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuYXN5bmMgZnVuY3Rpb24gc2hvd0xvYWRKb2JQYW5lbCgpIHtcbiAgaWYgKHN0YXRlTWFuYWdlci5nZXRDdXJyZW50VGFiKCkgIT09ICdqb2InKSB7XG4gICAgc3dpdGNoVGFiKCdqb2InKTtcbiAgfVxuXG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9jdW1lbnQtY29udGVudCcpO1xuICBjb250ZW50LmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwiZW1wdHktc3RhdGVcIj48ZGl2IGNsYXNzPVwibG9hZGluZy1zcGlubmVyXCI+PC9kaXY+PHAgc3R5bGU9XCJtYXJnaW4tdG9wOjEycHg7Y29sb3I6IzY0NzQ4YjtcIj5Mb2FkaW5nXHUyMDI2PC9wPjwvZGl2Pic7XG5cbiAgY29udGVudC5pbm5lckhUTUwgPSBgXG4gICAgPGRpdiBzdHlsZT1cIm1heC13aWR0aDo4MjBweDttYXJnaW46MCBhdXRvO3BhZGRpbmc6MjRweDtcIj5cbiAgICAgIDxoMSBzdHlsZT1cImZvbnQtc2l6ZToyMnB4O2ZvbnQtd2VpZ2h0OjcwMDtjb2xvcjojMWUyOTNiO21hcmdpbi1ib3R0b206NnB4O1wiPlx1RDgzRFx1RENFNSBBZGQgSm9iIERlc2NyaXB0aW9uPC9oMT5cblxuICAgICAgPGRpdiBzdHlsZT1cImJvcmRlcjoxcHggc29saWQgI2UyZThmMDtib3JkZXItcmFkaXVzOjhweDtvdmVyZmxvdzp2aXNpYmxlO1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZjhmYWZjO3BhZGRpbmc6MTBweCAxNnB4O2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNlMmU4ZjA7Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxM3B4O2NvbG9yOiM0NzU1Njk7XCI+QWRkIE5ldyBKb2IgRGVzY3JpcHRpb248L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6MjBweDtcIj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1tZXRob2QtdGFic1wiIHN0eWxlPVwibWFyZ2luLXRvcDowO1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImlucHV0LXRhYiBhY3RpdmVcIiBvbmNsaWNrPVwic3dpdGNoSW5wdXRNZXRob2QoJ3Bhc3RlJylcIj5cdUQ4M0RcdURDREQgUGFzdGUgVGV4dDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImlucHV0LXRhYlwiIG9uY2xpY2s9XCJzd2l0Y2hJbnB1dE1ldGhvZCgndXJsJylcIj5cdUQ4M0RcdUREMTcgRnJvbSBVUkw8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpbnB1dC10YWJcIiBvbmNsaWNrPVwic3dpdGNoSW5wdXRNZXRob2QoJ2ZpbGUnKVwiPlx1RDgzRFx1RENDMSBVcGxvYWQgRmlsZTwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LW1ldGhvZCBhY3RpdmVcIiBpZD1cInBhc3RlLW1ldGhvZFwiPlxuICAgICAgICAgICAgPHRleHRhcmVhIGlkPVwiam9iLXRleHQtaW5wdXRcIiBwbGFjZWhvbGRlcj1cIlBhc3RlIHRoZSBqb2IgZGVzY3JpcHRpb24gaGVyZVx1MjAyNlwiIHJvd3M9XCIxMlwiXG4gICAgICAgICAgICAgIGFyaWEtcmVxdWlyZWQ9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgYXJpYS1kZXNjcmliZWRieT1cInBhc3RlLWNoYXItY291bnQgcGFzdGUtZXJyb3JcIlxuICAgICAgICAgICAgICBvbmJsdXI9XCJfdmFsaWRhdGVQYXN0ZUZpZWxkKClcIiBvbmlucHV0PVwiX3VwZGF0ZVBhc3RlQ2hhckNvdW50KClcIlxuICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXNpemU6MTRweDtwYWRkaW5nOjEycHg7Ym9yZGVyOjFweCBzb2xpZCAjZDFkNWRiO2JvcmRlci1yYWRpdXM6NnB4O3Jlc2l6ZTp2ZXJ0aWNhbDttYXJnaW4tdG9wOjhweDtcIj48L3RleHRhcmVhPlxuICAgICAgICAgICAgPGRpdiBpZD1cInBhc3RlLWNoYXItY291bnRcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIlxuICAgICAgICAgICAgICBzdHlsZT1cImZvbnQtc2l6ZToxMnB4O2NvbG9yOiM5NGEzYjg7bWFyZ2luLXRvcDo0cHg7bWluLWhlaWdodDoxOHB4O1wiPjwvZGl2PlxuICAgICAgICAgICAgPHNwYW4gaWQ9XCJwYXN0ZS1lcnJvclwiIGNsYXNzPVwiZmllbGQtZXJyb3JcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIj48L3NwYW4+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDoxMHB4O2Rpc3BsYXk6ZmxleDtnYXA6MTJweDtcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPVwic3VibWl0Sm9iVGV4dCgpXCIgY2xhc3M9XCJidG4tcHJpbWFyeVwiPlN1Ym1pdCBKb2IgRGVzY3JpcHRpb248L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPVwiY2xlYXJKb2JJbnB1dCgpXCIgY2xhc3M9XCJidG4tc2Vjb25kYXJ5XCI+Q2xlYXI8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LW1ldGhvZFwiIGlkPVwidXJsLW1ldGhvZFwiPlxuICAgICAgICAgICAgPHAgc3R5bGU9XCJtYXJnaW46OHB4IDAgMTBweDtcIj5FbnRlciBhIFVSTCB0byBhdXRvbWF0aWNhbGx5IGV4dHJhY3QgdGhlIGpvYiBkZXNjcmlwdGlvbjo8L3A+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInVybFwiIGlkPVwiam9iLXVybC1pbnB1dFwiIHBsYWNlaG9sZGVyPVwiaHR0cHM6Ly9jb21wYW55LmNvbS9qb2ItcG9zdGluZ1wiXG4gICAgICAgICAgICAgIGFyaWEtcmVxdWlyZWQ9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgYXJpYS1kZXNjcmliZWRieT1cInVybC1lcnJvclwiXG4gICAgICAgICAgICAgIG9uYmx1cj1cIl92YWxpZGF0ZVVSTEZpZWxkKClcIlxuICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7cGFkZGluZzoxMnB4O2JvcmRlcjoxcHggc29saWQgI2QxZDVkYjtib3JkZXItcmFkaXVzOjZweDtcIiAvPlxuICAgICAgICAgICAgPHNwYW4gaWQ9XCJ1cmwtZXJyb3JcIiBjbGFzcz1cImZpZWxkLWVycm9yXCIgYXJpYS1saXZlPVwicG9saXRlXCI+PC9zcGFuPlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6MTBweDtkaXNwbGF5OmZsZXg7Z2FwOjEycHg7XCI+XG4gICAgICAgICAgICAgIDxidXR0b24gb25jbGljaz1cImZldGNoSm9iRnJvbVVSTCgpXCIgY2xhc3M9XCJidG4tcHJpbWFyeVwiPkZldGNoIEpvYiBEZXNjcmlwdGlvbjwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uIG9uY2xpY2s9XCJjbGVhclVSTElucHV0KClcIiBjbGFzcz1cImJ0bi1zZWNvbmRhcnlcIj5DbGVhcjwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDoxNHB4O2Rpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6MWZyIDFmcjtnYXA6MTBweDtmb250LXNpemU6MTNweDtcIj5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2YwZjlmZjtib3JkZXI6MXB4IHNvbGlkICMwZWE1ZTk7Ym9yZGVyLXJhZGl1czo2cHg7cGFkZGluZzoxMHB4O1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDo2MDA7Y29sb3I6IzAzNjlhMTttYXJnaW4tYm90dG9tOjRweDtcIj5cdTI3MDUgV29ya3Mgd2VsbCB3aXRoOjwvZGl2PlxuICAgICAgICAgICAgICAgIDx1bCBzdHlsZT1cIm1hcmdpbjowO3BhZGRpbmctbGVmdDoxNnB4O2NvbG9yOiMwMzY5YTE7bGluZS1oZWlnaHQ6MS43O1wiPjxsaT5Db21wYW55IGNhcmVlciBwYWdlczwvbGk+PGxpPkFuZ2VsTGlzdCwgUmVtb3RlT0s8L2xpPjxsaT5Hb3Zlcm5tZW50ICZhbXA7IHVuaXZlcnNpdHkgc2l0ZXM8L2xpPjwvdWw+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZmVmM2M3O2JvcmRlcjoxcHggc29saWQgI2Y1OWUwYjtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjEwcHg7XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtd2VpZ2h0OjYwMDtjb2xvcjojOTI0MDBlO21hcmdpbi1ib3R0b206NHB4O1wiPlx1MjZBMFx1RkUwRiBDb3B5IG1hbnVhbGx5IGZyb206PC9kaXY+XG4gICAgICAgICAgICAgICAgPHVsIHN0eWxlPVwibWFyZ2luOjA7cGFkZGluZy1sZWZ0OjE2cHg7Y29sb3I6IzkyNDAwZTtsaW5lLWhlaWdodDoxLjc7XCI+PGxpPjxzdHJvbmc+TGlua2VkSW48L3N0cm9uZz4gKGxvZ2luIHJlcXVpcmVkKTwvbGk+PGxpPjxzdHJvbmc+SW5kZWVkPC9zdHJvbmc+IChhbnRpLWJvdCk8L2xpPjxsaT48c3Ryb25nPkdsYXNzZG9vcjwvc3Ryb25nPiAoYXV0aCByZXF1aXJlZCk8L2xpPjwvdWw+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtbWV0aG9kXCIgaWQ9XCJmaWxlLW1ldGhvZFwiPlxuICAgICAgICAgICAgPGRpdiBpZD1cImZpbGUtZHJvcC16b25lXCJcbiAgICAgICAgICAgICAgICAgb25kcmFnb3Zlcj1cImV2ZW50LnByZXZlbnREZWZhdWx0KCk7IHRoaXMuY2xhc3NMaXN0LmFkZCgnZHJhZy1vdmVyJylcIlxuICAgICAgICAgICAgICAgICBvbmRyYWdsZWF2ZT1cInRoaXMuY2xhc3NMaXN0LnJlbW92ZSgnZHJhZy1vdmVyJylcIlxuICAgICAgICAgICAgICAgICBvbmRyb3A9XCJoYW5kbGVGaWxlRHJvcChldmVudClcIlxuICAgICAgICAgICAgICAgICBvbmNsaWNrPVwiZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pvYi1maWxlLWlucHV0JykuY2xpY2soKVwiXG4gICAgICAgICAgICAgICAgIHN0eWxlPVwiYm9yZGVyOjJweCBkYXNoZWQgI2QxZDVkYjtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjMycHggMTZweDt0ZXh0LWFsaWduOmNlbnRlcjtjdXJzb3I6cG9pbnRlcjt0cmFuc2l0aW9uOmJhY2tncm91bmQgMC4ycyxib3JkZXItY29sb3IgMC4yczttYXJnaW46OHB4IDA7XCI+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MnJlbTttYXJnaW4tYm90dG9tOjhweDtcIj5cdUQ4M0RcdURDQzQ8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5Ecm9wIGEgZmlsZSBoZXJlLCBvciBjbGljayB0byBicm93c2U8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjg1cmVtO2NvbG9yOiM2NDc0OGI7XCI+LnR4dCAmbmJzcDtcdTAwQjcmbmJzcDsgLm1kICZuYnNwO1x1MDBCNyZuYnNwOyAuaHRtbCAmbmJzcDtcdTAwQjcmbmJzcDsgLnBkZiAmbmJzcDtcdTAwQjcmbmJzcDsgLmRvY3ggJm5ic3A7XHUwMEI3Jm5ic3A7IC5ydGY8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgaWQ9XCJqb2ItZmlsZS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpub25lXCJcbiAgICAgICAgICAgICAgICAgICBhY2NlcHQ9XCIudHh0LC5tZCwucnN0LC50ZXh0LC5odG1sLC5odG0sLnBkZiwuZG9jeCwuZG9jLC5ydGZcIlxuICAgICAgICAgICAgICAgICAgIGFyaWEtZGVzY3JpYmVkYnk9XCJmaWxlLXVwbG9hZC1lcnJvclwiXG4gICAgICAgICAgICAgICAgICAgb25jaGFuZ2U9XCJoYW5kbGVGaWxlU2VsZWN0ZWQodGhpcy5maWxlc1swXSlcIj5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJmaWxlLXNlbGVjdGVkLWluZm9cIiBzdHlsZT1cImRpc3BsYXk6bm9uZTttYXJnaW46OHB4IDA7XCI+XG4gICAgICAgICAgICAgIDxzcGFuIGlkPVwiZmlsZS1zZWxlY3RlZC1uYW1lXCIgc3R5bGU9XCJmb250LXdlaWdodDo2MDA7XCI+PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBpZD1cImZpbGUtc2VsZWN0ZWQtc2l6ZVwiIHN0eWxlPVwiY29sb3I6IzY0NzQ4YjttYXJnaW4tbGVmdDo4cHg7XCI+PC9zcGFuPlxuICAgICAgICAgICAgICA8YnV0dG9uIG9uY2xpY2s9XCJjbGVhclNlbGVjdGVkRmlsZSgpXCIgc3R5bGU9XCJtYXJnaW4tbGVmdDo4cHg7YmFja2dyb3VuZDpub25lO2JvcmRlcjpub25lO2N1cnNvcjpwb2ludGVyO2NvbG9yOiM2NDc0OGI7XCI+XHUyNzE1PC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJmaWxlLXVwbG9hZC1lcnJvclwiIHN0eWxlPVwiZGlzcGxheTpub25lO2NvbG9yOiNjMDM5MmI7bWFyZ2luOjhweCAwO2ZvbnQtc2l6ZTowLjg1cmVtO1wiPjwvZGl2PlxuICAgICAgICAgICAgPGRpdiBpZD1cImZpbGUtc2l6ZS13YXJuaW5nXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7Y29sb3I6IzkyNDAwZTtiYWNrZ3JvdW5kOiNmZWYzYzc7Ym9yZGVyOjFweCBzb2xpZCAjZmNkMzRkO2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6NHB4IDhweDttYXJnaW46NHB4IDA7Zm9udC1zaXplOjAuODVyZW07XCI+PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDo4cHg7bWFyZ2luLXRvcDo0cHg7YWxpZ24taXRlbXM6Y2VudGVyO1wiPlxuICAgICAgICAgICAgICA8YnV0dG9uIGlkPVwiZmlsZS11cGxvYWQtYnRuXCIgb25jbGljaz1cInVwbG9hZEpvYkZpbGUoKVwiIGNsYXNzPVwiYnRuLXByaW1hcnlcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj5cdUQ4M0RcdURDRTQgVXNlIFRoaXMgRmlsZTwvYnV0dG9uPlxuICAgICAgICAgICAgICA8ZGl2IGlkPVwiZmlsZS11cGxvYWQtc3Bpbm5lclwiIHN0eWxlPVwiZGlzcGxheTpub25lO2ZvbnQtc2l6ZTowLjg1cmVtO2NvbG9yOiM2NDc0OGI7XCI+XHUyM0YzIFBhcnNpbmdcdTIwMjY8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGA7XG4gIC8vIFNob3cgbWluaW11bS1sZW5ndGggaGludCBpbW1lZGlhdGVseSBvbiBmaXJzdCByZW5kZXIgKEdBUC0yODgpLlxuICBfdXBkYXRlUGFzdGVDaGFyQ291bnQoKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBJbnB1dCBtZXRob2Qgc3dpdGNoaW5nXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gc3dpdGNoSW5wdXRNZXRob2QobWV0aG9kKSB7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5pbnB1dC10YWInKS5mb3JFYWNoKHRhYiA9PiB0YWIuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJykpO1xuICBldmVudC50YXJnZXQuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmlucHV0LW1ldGhvZCcpLmZvckVhY2gocGFuZWwgPT4gcGFuZWwuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJykpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChtZXRob2QgKyAnLW1ldGhvZCcpLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEZpbGUgdXBsb2FkXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxubGV0IF9wZW5kaW5nVXBsb2FkRmlsZSA9IG51bGw7XG5cbmZ1bmN0aW9uIGhhbmRsZUZpbGVEcm9wKGV2ZW50KSB7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlLWRyb3Atem9uZScpLmNsYXNzTGlzdC5yZW1vdmUoJ2RyYWctb3ZlcicpO1xuICBjb25zdCBmaWxlID0gZXZlbnQuZGF0YVRyYW5zZmVyLmZpbGVzWzBdO1xuICBpZiAoZmlsZSkgaGFuZGxlRmlsZVNlbGVjdGVkKGZpbGUpO1xufVxuXG5mdW5jdGlvbiBoYW5kbGVGaWxlU2VsZWN0ZWQoZmlsZSkge1xuICBpZiAoIWZpbGUpIHJldHVybjtcblxuICBjb25zdCBzaXplTWIgID0gKGZpbGUuc2l6ZSAvICgxMDI0ICogMTAyNCkpLnRvRml4ZWQoMSk7XG4gIGNvbnN0IHNpemVTdHIgPSBmaWxlLnNpemUgPiAxMDI0ICogMTAyNCA/IGAke3NpemVNYn0gTUJgIDogYCR7KGZpbGUuc2l6ZSAvIDEwMjQpLnRvRml4ZWQoMSl9IEtCYDtcbiAgY29uc3QgZXJyRWwgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlLXVwbG9hZC1lcnJvcicpO1xuICBjb25zdCB3YXJuRWwgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGUtc2l6ZS13YXJuaW5nJyk7XG5cbiAgY29uc3QgYWxsb3dlZE1pbWVzID0gWydhcHBsaWNhdGlvbi9wZGYnLCAnYXBwbGljYXRpb24vbXN3b3JkJyxcbiAgICAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LndvcmRwcm9jZXNzaW5nbWwuZG9jdW1lbnQnLFxuICAgICd0ZXh0L3BsYWluJywgJ3RleHQvaHRtbCddO1xuICBjb25zdCBhbGxvd2VkRXh0cyAgPSBbJy5wZGYnLCAnLmRvYycsICcuZG9jeCcsICcudHh0JywgJy5odG1sJywgJy5odG0nXTtcbiAgY29uc3QgZXh0ID0gJy4nICsgKGZpbGUubmFtZS5zcGxpdCgnLicpLnBvcCgpIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBtaW1lT2sgPSBhbGxvd2VkTWltZXMuc29tZShtID0+IGZpbGUudHlwZS5zdGFydHNXaXRoKG0pKSB8fCBmaWxlLnR5cGUgPT09ICcnO1xuICBjb25zdCBleHRPayAgPSBhbGxvd2VkRXh0cy5pbmNsdWRlcyhleHQpO1xuICBpZiAoIW1pbWVPayAmJiAhZXh0T2spIHtcbiAgICBlcnJFbC50ZXh0Q29udGVudCAgID0gYFVuc3VwcG9ydGVkIGZpbGUgdHlwZSBcIiR7ZXh0IHx8IGZpbGUudHlwZX1cIi4gU3VwcG9ydGVkIGZvcm1hdHM6IFBERiwgV29yZCAoLmRvYy8uZG9jeCksIHBsYWluIHRleHQsIEhUTUwuYDtcbiAgICBlcnJFbC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICBpZiAod2FybkVsKSB3YXJuRWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmlsZS11cGxvYWQtYnRuJykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoZmlsZS5zaXplID4gMjAgKiAxMDI0ICogMTAyNCkge1xuICAgIGVyckVsLnRleHRDb250ZW50ICAgPSBgRmlsZSBpcyB0b28gbGFyZ2UgKCR7c2l6ZU1ifSBNQikuIE1heGltdW0gYWxsb3dlZCBzaXplIGlzIDIwIE1CLmA7XG4gICAgZXJyRWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgaWYgKHdhcm5FbCkgd2FybkVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGUtdXBsb2FkLWJ0bicpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgX3BlbmRpbmdVcGxvYWRGaWxlID0gZmlsZTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGUtc2VsZWN0ZWQtbmFtZScpLnRleHRDb250ZW50ICA9IGZpbGUubmFtZTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGUtc2VsZWN0ZWQtc2l6ZScpLnRleHRDb250ZW50ICA9IGAoJHtzaXplU3RyfSlgO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmlsZS1zZWxlY3RlZC1pbmZvJykuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlLXVwbG9hZC1idG4nKS5zdHlsZS5kaXNwbGF5ICAgID0gJ2lubGluZS1ibG9jayc7XG4gIGVyckVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgaWYgKHdhcm5FbCkge1xuICAgIGlmIChmaWxlLnNpemUgPiA1ICogMTAyNCAqIDEwMjQpIHtcbiAgICAgIHdhcm5FbC50ZXh0Q29udGVudCAgID0gYFx1MjZBMCBMYXJnZSBmaWxlICgke3NpemVNYn0gTUIpIFx1MjAxNCBwYXJzaW5nIG1heSB0YWtlIGEgbW9tZW50LmA7XG4gICAgICB3YXJuRWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdhcm5FbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjbGVhclNlbGVjdGVkRmlsZSgpIHtcbiAgX3BlbmRpbmdVcGxvYWRGaWxlID0gbnVsbDtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pvYi1maWxlLWlucHV0JykudmFsdWUgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGUtc2VsZWN0ZWQtaW5mbycpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlLXVwbG9hZC1idG4nKS5zdHlsZS5kaXNwbGF5ICAgPSAnbm9uZSc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlLXVwbG9hZC1lcnJvcicpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIGNvbnN0IHdhcm4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmlsZS1zaXplLXdhcm5pbmcnKTtcbiAgaWYgKHdhcm4pIHdhcm4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBsb2FkSm9iRmlsZSgpIHtcbiAgaWYgKCFfcGVuZGluZ1VwbG9hZEZpbGUpIHJldHVybjtcblxuICBjb25zdCBlcnJFbCAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGUtdXBsb2FkLWVycm9yJyk7XG4gIGNvbnN0IHNwaW5uZXIgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmlsZS11cGxvYWQtc3Bpbm5lcicpO1xuICBjb25zdCB1cGxvYWRCdG4gID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGUtdXBsb2FkLWJ0bicpO1xuXG4gIGVyckVsLnN0eWxlLmRpc3BsYXkgICAgPSAnbm9uZSc7XG4gIHNwaW5uZXIuc3R5bGUuZGlzcGxheSAgPSAnaW5saW5lJztcbiAgdXBsb2FkQnRuLmRpc2FibGVkICAgICA9IHRydWU7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZScsIF9wZW5kaW5nVXBsb2FkRmlsZSk7XG5cbiAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2goJy9hcGkvdXBsb2FkLWZpbGUnLCB7IG1ldGhvZDogJ1BPU1QnLCBib2R5OiBmb3JtRGF0YSB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcC5qc29uKCk7XG5cbiAgICBpZiAoIXJlc3Aub2sgfHwgZGF0YS5lcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGRhdGEubWVzc2FnZSB8fCBkYXRhLmVycm9yIHx8IGBTZXJ2ZXIgZXJyb3IgJHtyZXNwLnN0YXR1c31gKTtcbiAgICB9XG5cbiAgICBjb25zdCBqb2JSZXNwID0gYXdhaXQgZmV0Y2goJy9hcGkvam9iJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgam9iX3RleHQ6IGRhdGEudGV4dCB9KVxuICAgIH0pO1xuICAgIGNvbnN0IGpvYkRhdGEgPSBhd2FpdCBqb2JSZXNwLmpzb24oKTtcbiAgICBpZiAoIWpvYlJlc3Aub2spIHRocm93IG5ldyBFcnJvcihqb2JEYXRhLmVycm9yIHx8ICdGYWlsZWQgdG8gcHJvY2VzcyBqb2IgZGVzY3JpcHRpb24nKTtcblxuICAgIGlmIChqb2JEYXRhLmVycm9yKSB7XG4gICAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnRXJyb3I6ICcgKyBqb2JEYXRhLmVycm9yKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGVNYW5hZ2VyLnNldFRhYkRhdGEoJ2pvYicsIGRhdGEudGV4dCk7XG4gICAgICBzYXZlVGFiRGF0YSgpO1xuICAgICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgYFx1MjcwNSBKb2IgZGVzY3JpcHRpb24gbG9hZGVkIGZyb20gXCIke2RhdGEuZmlsZW5hbWV9XCIgKCR7ZGF0YS5jb250ZW50X2xlbmd0aC50b0xvY2FsZVN0cmluZygpfSBjaGFycykuYCk7XG4gICAgICBhd2FpdCBhbmFseXplSm9iKCk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBlcnJFbC50ZXh0Q29udGVudCAgID0gZXJyLm1lc3NhZ2U7XG4gICAgZXJyRWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gIH0gZmluYWxseSB7XG4gICAgc3Bpbm5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIHVwbG9hZEJ0bi5kaXNhYmxlZCAgICA9IGZhbHNlO1xuICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUGFzdGUgdGV4dCBzdWJtaXNzaW9uXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY29uc3QgUEFTVEVfTUlOX0NIQVJTID0gMjAwO1xuXG5mdW5jdGlvbiBfdXBkYXRlUGFzdGVDaGFyQ291bnQoKSB7XG4gIGNvbnN0IHZhbCA9IChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnam9iLXRleHQtaW5wdXQnKT8udmFsdWUgfHwgJycpLnRyaW0oKTtcbiAgY29uc3QgY291bnRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYXN0ZS1jaGFyLWNvdW50Jyk7XG4gIGlmICghY291bnRFbCkgcmV0dXJuO1xuICBjb25zdCBuID0gdmFsLmxlbmd0aDtcbiAgaWYgKG4gPT09IDApIHtcbiAgICBjb3VudEVsLnN0eWxlLmNvbG9yID0gJyM5NGEzYjgnO1xuICAgIGNvdW50RWwudGV4dENvbnRlbnQgPSBgUGFzdGUgdGhlIGZ1bGwgam9iIGRlc2NyaXB0aW9uIChtaW5pbXVtICR7UEFTVEVfTUlOX0NIQVJTfSBjaGFyYWN0ZXJzIGZvciBiZXN0IHJlc3VsdHMpYDtcbiAgfSBlbHNlIGlmIChuIDwgUEFTVEVfTUlOX0NIQVJTKSB7XG4gICAgY291bnRFbC5zdHlsZS5jb2xvciA9ICcjZWY0NDQ0JztcbiAgICBjb3VudEVsLnRleHRDb250ZW50ID0gYCR7bn0gLyAke1BBU1RFX01JTl9DSEFSU30gbWluaW11bSBcdTIwMTQgVG9vIHNob3J0LCBhaW0gZm9yIGF0IGxlYXN0ICR7UEFTVEVfTUlOX0NIQVJTfSBjaGFyYWN0ZXJzYDtcbiAgfSBlbHNlIHtcbiAgICBjb3VudEVsLnN0eWxlLmNvbG9yID0gJyMxNmEzNGEnO1xuICAgIGNvdW50RWwudGV4dENvbnRlbnQgPSBgJHtufSAvICR7UEFTVEVfTUlOX0NIQVJTfSBtaW5pbXVtIFx1MjcxM2A7XG4gIH1cbn1cblxuZnVuY3Rpb24gX3ZhbGlkYXRlUGFzdGVGaWVsZCgpIHtcbiAgY29uc3QgdmFsID0gKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqb2ItdGV4dC1pbnB1dCcpPy52YWx1ZSB8fCAnJykudHJpbSgpO1xuICBfdXBkYXRlUGFzdGVDaGFyQ291bnQoKTtcbiAgaWYgKHZhbC5sZW5ndGggPiAwICYmIHZhbC5sZW5ndGggPCBQQVNURV9NSU5fQ0hBUlMpIHtcbiAgICBfc2hvd0ZpZWxkRXJyb3IoJ2pvYi10ZXh0LWlucHV0JywgJ3Bhc3RlLWVycm9yJywgYEpvYiBkZXNjcmlwdGlvbiBpcyB0b28gc2hvcnQgXHUyMDE0IHBsZWFzZSBwYXN0ZSBhdCBsZWFzdCAke1BBU1RFX01JTl9DSEFSU30gY2hhcmFjdGVycy5gKTtcbiAgfSBlbHNlIHtcbiAgICBfY2xlYXJGaWVsZEVycm9yKCdqb2ItdGV4dC1pbnB1dCcsICdwYXN0ZS1lcnJvcicpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN1Ym1pdEpvYlRleHQoKSB7XG4gIC8qIGR1Y2tmbG93OlxuICAgKiAgIGlkOiBqb2JfdWlfc3VibWl0X2xpdmVcbiAgICogICBraW5kOiB1aVxuICAgKiAgIHRpbWVzdGFtcDogJzIwMjYtMDMtMzFUMTI6NDk6NDdaJ1xuICAgKiAgIHN0YXR1czogbGl2ZVxuICAgKiAgIGhhbmRsZXM6XG4gICAqICAgLSB1aTpqb2ItaW5wdXQuc3VibWl0LXRleHRcbiAgICogICBjYWxsczpcbiAgICogICAtIFBPU1QgL2FwaS9qb2JcbiAgICogICAtIGFuYWx5emVKb2JcbiAgICogICByZWFkczpcbiAgICogICAtIGRvbTojam9iLXRleHQtaW5wdXQudmFsdWVcbiAgICogICB3cml0ZXM6XG4gICAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9qb2Iuam9iX3RleHRcbiAgICogICAtIHRhYjpqb2JcbiAgICogICAtIHVpOndvcmtmbG93LmpvYlxuICAgKiAgIG5vdGVzOiBTdWJtaXRzIHBhc3RlZCBqb2IgdGV4dCB0byB0aGUgYmFja2VuZCwgY2FjaGVzIHRoZSBzYW1lIHRleHQgaW4gdGFiIHN0YXRlLCB0aGVuIHJ1bnMgYW5hbHl6ZUpvYigpIHNvIGFsbCBqb2Igc291cmNlcyBzaGFyZSB0aGUgc2FtZSBhbmFseXNpcyBhbmQgaW50YWtlIGZsb3cuXG4gICAqL1xuICBjb25zdCB0ZXh0SW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnam9iLXRleHQtaW5wdXQnKTtcbiAgY29uc3Qgam9iVGV4dCA9IHRleHRJbnB1dC52YWx1ZS50cmltKCk7XG5cbiAgaWYgKCFqb2JUZXh0KSB7XG4gICAgX3Nob3dGaWVsZEVycm9yKCdqb2ItdGV4dC1pbnB1dCcsICdwYXN0ZS1lcnJvcicsICdQbGVhc2UgZW50ZXIgYSBqb2IgZGVzY3JpcHRpb24gYmVmb3JlIHN1Ym1pdHRpbmcuJyk7XG4gICAgdGV4dElucHV0LmZvY3VzKCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChqb2JUZXh0Lmxlbmd0aCA8IFBBU1RFX01JTl9DSEFSUykge1xuICAgIF9zaG93RmllbGRFcnJvcignam9iLXRleHQtaW5wdXQnLCAncGFzdGUtZXJyb3InLCBgSm9iIGRlc2NyaXB0aW9uIGlzIHRvbyBzaG9ydCBcdTIwMTQgcGxlYXNlIHBhc3RlIGF0IGxlYXN0ICR7UEFTVEVfTUlOX0NIQVJTfSBjaGFyYWN0ZXJzLmApO1xuICAgIHRleHRJbnB1dC5mb2N1cygpO1xuICAgIHJldHVybjtcbiAgfVxuICBfY2xlYXJGaWVsZEVycm9yKCdqb2ItdGV4dC1pbnB1dCcsICdwYXN0ZS1lcnJvcicpO1xuXG4gIHNldExvYWRpbmcodHJ1ZSwgJ0FuYWx5c2luZyBqb2IgZGVzY3JpcHRpb25cdTIwMjYnKTtcbiAgYXBwZW5kTWVzc2FnZSgndXNlcicsICdTdWJtaXR0aW5nIGpvYiBkZXNjcmlwdGlvbi4uLicpO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9qb2InLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBqb2JfdGV4dDogam9iVGV4dCB9KVxuICAgIH0pO1xuXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAgIGlmIChkYXRhLmVycm9yKSB7XG4gICAgICBfc2hvd0ZpZWxkRXJyb3IoJ2pvYi10ZXh0LWlucHV0JywgJ3Bhc3RlLWVycm9yJywgZGF0YS5lcnJvcik7XG4gICAgICBhcHBlbmRSZXRyeU1lc3NhZ2UoJ1x1Mjc0QyBFcnJvcjogJyArIGRhdGEuZXJyb3IsIHN1Ym1pdEpvYlRleHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBfY2xlYXJGaWVsZEVycm9yKCdqb2ItdGV4dC1pbnB1dCcsICdwYXN0ZS1lcnJvcicpO1xuICAgICAgc3RhdGVNYW5hZ2VyLnNldFRhYkRhdGEoJ2pvYicsIGpvYlRleHQpO1xuICAgICAgc2F2ZVRhYkRhdGEoKTtcbiAgICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsICdcdTI3MDUgSm9iIGRlc2NyaXB0aW9uIHN1Ym1pdHRlZCBzdWNjZXNzZnVsbHkuJyk7XG5cbiAgICAgIGlmICh0eXBlb2YgdXBkYXRlVGFiQmFyRm9yU3RhZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdXBkYXRlVGFiQmFyRm9yU3RhZ2UoJ2pvYicpO1xuICAgICAgfVxuICAgICAgc3dpdGNoVGFiKCdqb2InKTtcbiAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgICAgYXdhaXQgYW5hbHl6ZUpvYigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cuZXJyb3IoJ0Vycm9yIHN1Ym1pdHRpbmcgam9iOicsIGVycm9yKTtcbiAgICBhcHBlbmRSZXRyeU1lc3NhZ2UoJ1x1Mjc0QyBFcnJvciBzdWJtaXR0aW5nIGpvYiBkZXNjcmlwdGlvbjogJyArIGVycm9yLm1lc3NhZ2UsIHN1Ym1pdEpvYlRleHQpO1xuICB9XG5cbiAgc2V0TG9hZGluZyhmYWxzZSk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVVJMIGZldGNoXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gX3ZhbGlkYXRlVVJMRmllbGQoKSB7XG4gIGNvbnN0IHZhbCA9IChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnam9iLXVybC1pbnB1dCcpPy52YWx1ZSB8fCAnJykudHJpbSgpO1xuICBpZiAoIXZhbCkgeyBfY2xlYXJGaWVsZEVycm9yKCdqb2ItdXJsLWlucHV0JywgJ3VybC1lcnJvcicpOyByZXR1cm47IH1cbiAgdHJ5IHtcbiAgICBjb25zdCB1ID0gbmV3IFVSTCh2YWwpO1xuICAgIGlmICghWydodHRwOicsICdodHRwczonXS5pbmNsdWRlcyh1LnByb3RvY29sKSkgdGhyb3cgbmV3IEVycm9yKCdQcm90b2NvbCBub3QgaHR0cC9odHRwcycpO1xuICAgIF9jbGVhckZpZWxkRXJyb3IoJ2pvYi11cmwtaW5wdXQnLCAndXJsLWVycm9yJyk7XG4gIH0gY2F0Y2gge1xuICAgIF9zaG93RmllbGRFcnJvcignam9iLXVybC1pbnB1dCcsICd1cmwtZXJyb3InLCAnUGxlYXNlIGVudGVyIGEgdmFsaWQgVVJMIHN0YXJ0aW5nIHdpdGggaHR0cHM6Ly8gb3IgaHR0cDovLycpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoSm9iRnJvbVVSTCgpIHtcbiAgY29uc3QgdXJsSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnam9iLXVybC1pbnB1dCcpO1xuICBjb25zdCB1cmwgPSB1cmxJbnB1dC52YWx1ZS50cmltKCk7XG5cbiAgaWYgKCF1cmwpIHtcbiAgICBfc2hvd0ZpZWxkRXJyb3IoJ2pvYi11cmwtaW5wdXQnLCAndXJsLWVycm9yJywgJ1BsZWFzZSBlbnRlciBhIFVSTCBiZWZvcmUgZmV0Y2hpbmcuJyk7XG4gICAgdXJsSW5wdXQuZm9jdXMoKTtcbiAgICByZXR1cm47XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCB1ID0gbmV3IFVSTCh1cmwpO1xuICAgIGlmICghWydodHRwOicsICdodHRwczonXS5pbmNsdWRlcyh1LnByb3RvY29sKSkgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgX2NsZWFyRmllbGRFcnJvcignam9iLXVybC1pbnB1dCcsICd1cmwtZXJyb3InKTtcbiAgfSBjYXRjaCB7XG4gICAgX3Nob3dGaWVsZEVycm9yKCdqb2ItdXJsLWlucHV0JywgJ3VybC1lcnJvcicsICdQbGVhc2UgZW50ZXIgYSB2YWxpZCBVUkwgc3RhcnRpbmcgd2l0aCBodHRwczovLyBvciBodHRwOi8vJyk7XG4gICAgdXJsSW5wdXQuZm9jdXMoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBzZXRMb2FkaW5nKHRydWUsICdGZXRjaGluZyBqb2IgZnJvbSBVUkxcdTIwMjYnKTtcbiAgYXBwZW5kTWVzc2FnZSgndXNlcicsIGBGZXRjaGluZyBqb2IgZGVzY3JpcHRpb24gZnJvbSBVUkw6ICR7dXJsfWApO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9mZXRjaC1qb2ItdXJsJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgdXJsOiB1cmwgfSlcbiAgICB9KTtcblxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICBpZiAoZGF0YS5lcnJvcikge1xuICAgICAgbGV0IGVycm9yTWVzc2FnZSA9IGRhdGEuZXJyb3I7XG4gICAgICBsZXQgaGVscE1lc3NhZ2UgPSBkYXRhLm1lc3NhZ2UgfHwgJyc7XG5cbiAgICAgIGlmIChkYXRhLnByb3RlY3RlZF9zaXRlKSB7XG4gICAgICAgIGVycm9yTWVzc2FnZSA9IGAke2RhdGEuc2l0ZV9uYW1lfSBQcm90ZWN0aW9uIERldGVjdGVkYDtcbiAgICAgICAgaGVscE1lc3NhZ2UgPSBkYXRhLm1lc3NhZ2U7XG5cbiAgICAgICAgaWYgKGRhdGEuaW5zdHJ1Y3Rpb25zICYmIGRhdGEuaW5zdHJ1Y3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBoZWxwTWVzc2FnZSArPSAnXFxuXFxuSG93IHRvIHByb2NlZWQ6XFxuJyArIGRhdGEuaW5zdHJ1Y3Rpb25zLm1hcCgoaW5zdCwgaSkgPT4gYCR7aSArIDF9LiAke2luc3R9YCkuam9pbignXFxuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBzaG93UHJvdGVjdGVkU2l0ZU1vZGFsKGRhdGEuc2l0ZV9uYW1lLCBkYXRhLm1lc3NhZ2UsIGRhdGEuaW5zdHJ1Y3Rpb25zKTtcbiAgICAgIH0gZWxzZSBpZiAoZGF0YS5pbnN0cnVjdGlvbnMpIHtcbiAgICAgICAgaGVscE1lc3NhZ2UgKz0gJ1xcblxcblN1Z2dlc3RlZCBzb2x1dGlvbnM6XFxuJyArIGRhdGEuaW5zdHJ1Y3Rpb25zLm1hcCgoaW5zdCwgaSkgPT4gYCR7aSArIDF9LiAke2luc3R9YCkuam9pbignXFxuJyk7XG4gICAgICAgIHNob3dBbGVydE1vZGFsKCdVUkwgRmV0Y2ggRXJyb3InLCBgJHtlcnJvck1lc3NhZ2V9XFxuXFxuJHtoZWxwTWVzc2FnZX1gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF9zaG93RmllbGRFcnJvcignam9iLXVybC1pbnB1dCcsICd1cmwtZXJyb3InLCBlcnJvck1lc3NhZ2UpO1xuICAgICAgICBzaG93QWxlcnRNb2RhbCgnRXJyb3InLCBgJHtlcnJvck1lc3NhZ2V9JHtoZWxwTWVzc2FnZSA/ICdcXG5cXG4nICsgaGVscE1lc3NhZ2UgOiAnJ31gKTtcbiAgICAgIH1cblxuICAgICAgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgYFx1Mjc0QyAke2Vycm9yTWVzc2FnZX06ICR7ZGF0YS5tZXNzYWdlIHx8ICdQbGVhc2UgdHJ5IG1hbnVhbCBpbnB1dC4nfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZU1hbmFnZXIuc2V0VGFiRGF0YSgnam9iJywgZGF0YS5qb2JfdGV4dCk7XG4gICAgICBzYXZlVGFiRGF0YSgpO1xuICAgICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgYFx1MjcwNSAke2RhdGEubWVzc2FnZX0hIEZldGNoZWQgJHtkYXRhLmNvbnRlbnRfbGVuZ3RoIHx8ICdjb250ZW50J30gY2hhcmFjdGVycy4gUmV2aWV3IHRoZSBqb2IgZGVzY3JpcHRpb24gYmVsb3csIHRoZW4gY2xpY2sgXCJcdUQ4M0RcdUREMEQgQW5hbHlzZSBKb2JcIiB0byBjb250aW51ZS5gKTtcbiAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgICAgc3dpdGNoVGFiKCdqb2InKTtcbiAgICAgIGF3YWl0IHBvcHVsYXRlSm9iVGFiKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy5lcnJvcignRXJyb3IgZmV0Y2hpbmcgVVJMOicsIGVycm9yKTtcbiAgICBfc2hvd0ZpZWxkRXJyb3IoJ2pvYi11cmwtaW5wdXQnLCAndXJsLWVycm9yJywgYE5ldHdvcmsgZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICBhcHBlbmRSZXRyeU1lc3NhZ2UoYE5ldHdvcmsgZXJyb3Igb2NjdXJyZWQ6ICR7ZXJyb3IubWVzc2FnZX0uIFBsZWFzZSBjaGVjayB5b3VyIGNvbm5lY3Rpb24gb3IgdHJ5IG1hbnVhbCBpbnB1dC5gLCBmZXRjaEpvYkZyb21VUkwpO1xuICAgIHNob3dBbGVydE1vZGFsKCdOZXR3b3JrIEVycm9yJywgJ1VuYWJsZSB0byBjb25uZWN0IHRvIHRoZSBzZXJ2ZXIuIFBsZWFzZSB0cnkgYWdhaW4gb3IgdXNlIHRoZSBcIlBhc3RlIFRleHRcIiBvcHRpb24gdG8gaW5wdXQgdGhlIGpvYiBkZXNjcmlwdGlvbiBtYW51YWxseS4nKTtcbiAgfVxuXG4gIHNldExvYWRpbmcoZmFsc2UpO1xufVxuXG5mdW5jdGlvbiBzaG93UHJvdGVjdGVkU2l0ZU1vZGFsKHNpdGVOYW1lLCBtZXNzYWdlLCBpbnN0cnVjdGlvbnMpIHtcbiAgbGV0IGluc3RydWN0aW9uc0xpc3QgPSAnJztcbiAgaWYgKGluc3RydWN0aW9ucyAmJiBpbnN0cnVjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgIGluc3RydWN0aW9uc0xpc3QgPSAnPG9sIHN0eWxlPVwibWFyZ2luOiAxNnB4IDA7IHBhZGRpbmctbGVmdDogMjBweDtcIj4nICtcbiAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbnMubWFwKGluc3QgPT4gYDxsaSBzdHlsZT1cIm1hcmdpbjogOHB4IDA7XCI+JHtpbnN0fTwvbGk+YCkuam9pbignJykgK1xuICAgICAgICAgICAgICAgICAgICAgICc8L29sPic7XG4gIH1cblxuICBjb25zdCBzYWZlTmFtZSA9IGVzY2FwZUh0bWwoc2l0ZU5hbWUpO1xuICBjb25zdCBzYWZlTWVzc2FnZSA9IGVzY2FwZUh0bWwobWVzc2FnZSk7XG4gIGNvbnN0IG1vZGFsQ29udGVudCA9IGBcbiAgICA8ZGl2IHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyOyBtYXJnaW4tYm90dG9tOiAxNnB4O1wiPlxuICAgICAgXHVEODNEXHVERDEyIDxzdHJvbmc+JHtzYWZlTmFtZX0gcmVxdWlyZXMgbWFudWFsIGlucHV0PC9zdHJvbmc+XG4gICAgPC9kaXY+XG4gICAgPHA+JHtzYWZlTWVzc2FnZX08L3A+XG4gICAgJHtpbnN0cnVjdGlvbnNMaXN0fVxuICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAyMHB4OyBwYWRkaW5nOiAxMnB4OyBiYWNrZ3JvdW5kOiAjZjBmOWZmOyBib3JkZXI6IDFweCBzb2xpZCAjMGVhNWU5OyBib3JkZXItcmFkaXVzOiA2cHg7XCI+XG4gICAgICA8c3Ryb25nPlx1RDgzRFx1RENBMSBUaXA6PC9zdHJvbmc+IEFmdGVyIGNvcHlpbmcgdGhlIGpvYiBkZXNjcmlwdGlvbiwgY2xpY2sgdGhlIFwiUGFzdGUgVGV4dFwiIHRhYiBhYm92ZSB0byBzdWJtaXQgaXQgZGlyZWN0bHkuXG4gICAgPC9kaXY+XG4gIGA7XG5cbiAgc2hvd0FsZXJ0TW9kYWwoYCR7c2FmZU5hbWV9IElucHV0IFJlcXVpcmVkYCwgbW9kYWxDb250ZW50KTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDbGVhciBoZWxwZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gY2xlYXJKb2JJbnB1dCgpIHtcbiAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnam9iLXRleHQtaW5wdXQnKTtcbiAgaWYgKGVsKSBlbC52YWx1ZSA9ICcnO1xufVxuXG5mdW5jdGlvbiBjbGVhclVSTElucHV0KCkge1xuICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqb2ItdXJsLWlucHV0Jyk7XG4gIGlmIChlbCkgZWwudmFsdWUgPSAnJztcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBGaWVsZCBlcnJvciBoZWxwZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gX3Nob3dGaWVsZEVycm9yKGlucHV0SWQsIGVycm9ySWQsIG1zZykge1xuICBjb25zdCBpbnAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaW5wdXRJZCk7XG4gIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlcnJvcklkKTtcbiAgaWYgKHNwYW4pICB7IHNwYW4udGV4dENvbnRlbnQgPSBtc2c7IHNwYW4uY2xhc3NMaXN0LmFkZCgndmlzaWJsZScpOyB9XG4gIGlmIChpbnApICAge1xuICAgIGlucC5jbGFzc0xpc3QuYWRkKCdmaWVsZC1pbnZhbGlkJyk7XG4gICAgaW5wLnNldEF0dHJpYnV0ZSgnYXJpYS1pbnZhbGlkJywgJ3RydWUnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfY2xlYXJGaWVsZEVycm9yKGlucHV0SWQsIGVycm9ySWQpIHtcbiAgY29uc3QgaW5wICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlucHV0SWQpO1xuICBjb25zdCBzcGFuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZXJyb3JJZCk7XG4gIGlmIChzcGFuKSAgeyBzcGFuLnRleHRDb250ZW50ID0gJyc7IHNwYW4uY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZScpOyB9XG4gIGlmIChpbnApICAge1xuICAgIGlucC5jbGFzc0xpc3QucmVtb3ZlKCdmaWVsZC1pbnZhbGlkJyk7XG4gICAgaW5wLnNldEF0dHJpYnV0ZSgnYXJpYS1pbnZhbGlkJywgJ2ZhbHNlJyk7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIEVTIG1vZHVsZSBleHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuZXhwb3J0IHtcbiAgcG9wdWxhdGVKb2JUYWIsXG4gIHNob3dMb2FkSm9iUGFuZWwsXG4gIHN3aXRjaElucHV0TWV0aG9kLFxuICBfcGVuZGluZ1VwbG9hZEZpbGUsXG4gIGhhbmRsZUZpbGVEcm9wLFxuICBoYW5kbGVGaWxlU2VsZWN0ZWQsXG4gIGNsZWFyU2VsZWN0ZWRGaWxlLFxuICB1cGxvYWRKb2JGaWxlLFxuICBQQVNURV9NSU5fQ0hBUlMsXG4gIF91cGRhdGVQYXN0ZUNoYXJDb3VudCxcbiAgX3ZhbGlkYXRlUGFzdGVGaWVsZCxcbiAgc3VibWl0Sm9iVGV4dCxcbiAgX3ZhbGlkYXRlVVJMRmllbGQsXG4gIGZldGNoSm9iRnJvbVVSTCxcbiAgc2hvd1Byb3RlY3RlZFNpdGVNb2RhbCxcbiAgY2xlYXJKb2JJbnB1dCxcbiAgY2xlYXJVUkxJbnB1dCxcbiAgX3Nob3dGaWVsZEVycm9yLFxuICBfY2xlYXJGaWVsZEVycm9yLFxufTtcbiIsICJpbXBvcnQgdHlwZSB7IE1hcmtlZE9wdGlvbnMgfSBmcm9tICcuL01hcmtlZE9wdGlvbnMudHMnO1xuXG4vKipcbiAqIEdldHMgdGhlIG9yaWdpbmFsIG1hcmtlZCBkZWZhdWx0IG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfZ2V0RGVmYXVsdHM8UGFyc2VyT3V0cHV0ID0gc3RyaW5nLCBSZW5kZXJlck91dHB1dCA9IHN0cmluZz4oKTogTWFya2VkT3B0aW9uczxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0PiB7XG4gIHJldHVybiB7XG4gICAgYXN5bmM6IGZhbHNlLFxuICAgIGJyZWFrczogZmFsc2UsXG4gICAgZXh0ZW5zaW9uczogbnVsbCxcbiAgICBnZm06IHRydWUsXG4gICAgaG9va3M6IG51bGwsXG4gICAgcGVkYW50aWM6IGZhbHNlLFxuICAgIHJlbmRlcmVyOiBudWxsLFxuICAgIHNpbGVudDogZmFsc2UsXG4gICAgdG9rZW5pemVyOiBudWxsLFxuICAgIHdhbGtUb2tlbnM6IG51bGwsXG4gIH07XG59XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGxldCBfZGVmYXVsdHM6IE1hcmtlZE9wdGlvbnM8YW55LCBhbnk+ID0gX2dldERlZmF1bHRzKCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGFuZ2VEZWZhdWx0czxQYXJzZXJPdXRwdXQgPSBzdHJpbmcsIFJlbmRlcmVyT3V0cHV0ID0gc3RyaW5nPihuZXdEZWZhdWx0czogTWFya2VkT3B0aW9uczxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0Pikge1xuICBfZGVmYXVsdHMgPSBuZXdEZWZhdWx0cztcbn1cbiIsICJjb25zdCBub29wVGVzdCA9IHsgZXhlYzogKCkgPT4gbnVsbCB9IGFzIHVua25vd24gYXMgUmVnRXhwO1xuXG5mdW5jdGlvbiBlZGl0KHJlZ2V4OiBzdHJpbmcgfCBSZWdFeHAsIG9wdCA9ICcnKSB7XG4gIGxldCBzb3VyY2UgPSB0eXBlb2YgcmVnZXggPT09ICdzdHJpbmcnID8gcmVnZXggOiByZWdleC5zb3VyY2U7XG4gIGNvbnN0IG9iaiA9IHtcbiAgICByZXBsYWNlOiAobmFtZTogc3RyaW5nIHwgUmVnRXhwLCB2YWw6IHN0cmluZyB8IFJlZ0V4cCkgPT4ge1xuICAgICAgbGV0IHZhbFNvdXJjZSA9IHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnID8gdmFsIDogdmFsLnNvdXJjZTtcbiAgICAgIHZhbFNvdXJjZSA9IHZhbFNvdXJjZS5yZXBsYWNlKG90aGVyLmNhcmV0LCAnJDEnKTtcbiAgICAgIHNvdXJjZSA9IHNvdXJjZS5yZXBsYWNlKG5hbWUsIHZhbFNvdXJjZSk7XG4gICAgICByZXR1cm4gb2JqO1xuICAgIH0sXG4gICAgZ2V0UmVnZXg6ICgpID0+IHtcbiAgICAgIHJldHVybiBuZXcgUmVnRXhwKHNvdXJjZSwgb3B0KTtcbiAgICB9LFxuICB9O1xuICByZXR1cm4gb2JqO1xufVxuXG5jb25zdCBzdXBwb3J0c0xvb2tiZWhpbmQgPSAoKCkgPT4ge1xudHJ5IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1yZWdleC1saXRlcmFsc1xuICByZXR1cm4gISFuZXcgUmVnRXhwKCcoPzw9MSkoPzwhMSknKTtcbn0gY2F0Y2gge1xuICAvLyBTZWUgYnJvd3NlciBzdXBwb3J0IGhlcmU6XG4gIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL1JlZ3VsYXJfZXhwcmVzc2lvbnMvTG9va2JlaGluZF9hc3NlcnRpb25cbiAgcmV0dXJuIGZhbHNlO1xufVxufSkoKTtcblxuZXhwb3J0IGNvbnN0IG90aGVyID0ge1xuICBjb2RlUmVtb3ZlSW5kZW50OiAvXig/OiB7MSw0fXwgezAsM31cXHQpL2dtLFxuICBvdXRwdXRMaW5rUmVwbGFjZTogL1xcXFwoW1xcW1xcXV0pL2csXG4gIGluZGVudENvZGVDb21wZW5zYXRpb246IC9eKFxccyspKD86YGBgKS8sXG4gIGJlZ2lubmluZ1NwYWNlOiAvXlxccysvLFxuICBlbmRpbmdIYXNoOiAvIyQvLFxuICBzdGFydGluZ1NwYWNlQ2hhcjogL14gLyxcbiAgZW5kaW5nU3BhY2VDaGFyOiAvICQvLFxuICBub25TcGFjZUNoYXI6IC9bXiBdLyxcbiAgbmV3TGluZUNoYXJHbG9iYWw6IC9cXG4vZyxcbiAgdGFiQ2hhckdsb2JhbDogL1xcdC9nLFxuICBtdWx0aXBsZVNwYWNlR2xvYmFsOiAvXFxzKy9nLFxuICBibGFua0xpbmU6IC9eWyBcXHRdKiQvLFxuICBkb3VibGVCbGFua0xpbmU6IC9cXG5bIFxcdF0qXFxuWyBcXHRdKiQvLFxuICBibG9ja3F1b3RlU3RhcnQ6IC9eIHswLDN9Pi8sXG4gIGJsb2NrcXVvdGVTZXRleHRSZXBsYWNlOiAvXFxuIHswLDN9KCg/Oj0rfC0rKSAqKSg/PVxcbnwkKS9nLFxuICBibG9ja3F1b3RlU2V0ZXh0UmVwbGFjZTI6IC9eIHswLDN9PlsgXFx0XT8vZ20sXG4gIGxpc3RSZXBsYWNlTmVzdGluZzogL14gezEsNH0oPz0oIHs0fSkqW14gXSkvZyxcbiAgbGlzdElzVGFzazogL15cXFtbIHhYXVxcXSArXFxTLyxcbiAgbGlzdFJlcGxhY2VUYXNrOiAvXlxcW1sgeFhdXFxdICsvLFxuICBsaXN0VGFza0NoZWNrYm94OiAvXFxbWyB4WF1cXF0vLFxuICBhbnlMaW5lOiAvXFxuLipcXG4vLFxuICBocmVmQnJhY2tldHM6IC9ePCguKik+JC8sXG4gIHRhYmxlRGVsaW1pdGVyOiAvWzp8XS8sXG4gIHRhYmxlQWxpZ25DaGFyczogL15cXHx8XFx8ICokL2csXG4gIHRhYmxlUm93QmxhbmtMaW5lOiAvXFxuWyBcXHRdKiQvLFxuICB0YWJsZUFsaWduUmlnaHQ6IC9eICotKzogKiQvLFxuICB0YWJsZUFsaWduQ2VudGVyOiAvXiAqOi0rOiAqJC8sXG4gIHRhYmxlQWxpZ25MZWZ0OiAvXiAqOi0rICokLyxcbiAgc3RhcnRBVGFnOiAvXjxhIC9pLFxuICBlbmRBVGFnOiAvXjxcXC9hPi9pLFxuICBzdGFydFByZVNjcmlwdFRhZzogL148KHByZXxjb2RlfGtiZHxzY3JpcHQpKFxcc3w+KS9pLFxuICBlbmRQcmVTY3JpcHRUYWc6IC9ePFxcLyhwcmV8Y29kZXxrYmR8c2NyaXB0KShcXHN8PikvaSxcbiAgc3RhcnRBbmdsZUJyYWNrZXQ6IC9ePC8sXG4gIGVuZEFuZ2xlQnJhY2tldDogLz4kLyxcbiAgcGVkYW50aWNIcmVmVGl0bGU6IC9eKFteJ1wiXSpbXlxcc10pXFxzKyhbJ1wiXSkoLiopXFwyLyxcbiAgdW5pY29kZUFscGhhTnVtZXJpYzogL1tcXHB7TH1cXHB7Tn1dL3UsXG4gIGVzY2FwZVRlc3Q6IC9bJjw+XCInXS8sXG4gIGVzY2FwZVJlcGxhY2U6IC9bJjw+XCInXS9nLFxuICBlc2NhcGVUZXN0Tm9FbmNvZGU6IC9bPD5cIiddfCYoPyEoI1xcZHsxLDd9fCNbWHhdW2EtZkEtRjAtOV17MSw2fXxcXHcrKTspLyxcbiAgZXNjYXBlUmVwbGFjZU5vRW5jb2RlOiAvWzw+XCInXXwmKD8hKCNcXGR7MSw3fXwjW1h4XVthLWZBLUYwLTldezEsNn18XFx3Kyk7KS9nLFxuICBjYXJldDogLyhefFteXFxbXSlcXF4vZyxcbiAgcGVyY2VudERlY29kZTogLyUyNS9nLFxuICBmaW5kUGlwZTogL1xcfC9nLFxuICBzcGxpdFBpcGU6IC8gXFx8LyxcbiAgc2xhc2hQaXBlOiAvXFxcXFxcfC9nLFxuICBjYXJyaWFnZVJldHVybjogL1xcclxcbnxcXHIvZyxcbiAgc3BhY2VMaW5lOiAvXiArJC9nbSxcbiAgbm90U3BhY2VTdGFydDogL15cXFMqLyxcbiAgZW5kaW5nTmV3bGluZTogL1xcbiQvLFxuICBsaXN0SXRlbVJlZ2V4OiAoYnVsbDogc3RyaW5nKSA9PiBuZXcgUmVnRXhwKGBeKCB7MCwzfSR7YnVsbH0pKCg/OltcXHQgXVteXFxcXG5dKik/KD86XFxcXG58JCkpYCksXG4gIG5leHRCdWxsZXRSZWdleDogKGluZGVudDogbnVtYmVyKSA9PiBuZXcgUmVnRXhwKGBeIHswLCR7TWF0aC5taW4oMywgaW5kZW50IC0gMSl9fSg/OlsqKy1dfFxcXFxkezEsOX1bLildKSgoPzpbIFxcdF1bXlxcXFxuXSopPyg/OlxcXFxufCQpKWApLFxuICBoclJlZ2V4OiAoaW5kZW50OiBudW1iZXIpID0+IG5ldyBSZWdFeHAoYF4gezAsJHtNYXRoLm1pbigzLCBpbmRlbnQgLSAxKX19KCg/Oi0gKil7Myx9fCg/Ol8gKil7Myx9fCg/OlxcXFwqICopezMsfSkoPzpcXFxcbit8JClgKSxcbiAgZmVuY2VzQmVnaW5SZWdleDogKGluZGVudDogbnVtYmVyKSA9PiBuZXcgUmVnRXhwKGBeIHswLCR7TWF0aC5taW4oMywgaW5kZW50IC0gMSl9fSg/OlxcYFxcYFxcYHx+fn4pYCksXG4gIGhlYWRpbmdCZWdpblJlZ2V4OiAoaW5kZW50OiBudW1iZXIpID0+IG5ldyBSZWdFeHAoYF4gezAsJHtNYXRoLm1pbigzLCBpbmRlbnQgLSAxKX19I2ApLFxuICBodG1sQmVnaW5SZWdleDogKGluZGVudDogbnVtYmVyKSA9PiBuZXcgUmVnRXhwKGBeIHswLCR7TWF0aC5taW4oMywgaW5kZW50IC0gMSl9fTwoPzpbYS16XS4qPnwhLS0pYCwgJ2knKSxcbiAgYmxvY2txdW90ZUJlZ2luUmVnZXg6IChpbmRlbnQ6IG51bWJlcikgPT4gbmV3IFJlZ0V4cChgXiB7MCwke01hdGgubWluKDMsIGluZGVudCAtIDEpfX0+YCksXG59O1xuXG4vKipcbiAqIEJsb2NrLUxldmVsIEdyYW1tYXJcbiAqL1xuXG5jb25zdCBuZXdsaW5lID0gL14oPzpbIFxcdF0qKD86XFxufCQpKSsvO1xuY29uc3QgYmxvY2tDb2RlID0gL14oKD86IHs0fXwgezAsM31cXHQpW15cXG5dKyg/Olxcbig/OlsgXFx0XSooPzpcXG58JCkpKik/KSsvO1xuY29uc3QgZmVuY2VzID0gL14gezAsM30oYHszLH0oPz1bXmBcXG5dKig/OlxcbnwkKSl8fnszLH0pKFteXFxuXSopKD86XFxufCQpKD86fChbXFxzXFxTXSo/KSg/OlxcbnwkKSkoPzogezAsM31cXDFbfmBdKiAqKD89XFxufCQpfCQpLztcbmNvbnN0IGhyID0gL14gezAsM30oKD86LVtcXHQgXSopezMsfXwoPzpfWyBcXHRdKil7Myx9fCg/OlxcKlsgXFx0XSopezMsfSkoPzpcXG4rfCQpLztcbmNvbnN0IGhlYWRpbmcgPSAvXiB7MCwzfSgjezEsNn0pKD89XFxzfCQpKC4qKSg/Olxcbit8JCkvO1xuY29uc3QgYnVsbGV0ID0gLyB7MCwzfSg/OlsqKy1dfFxcZHsxLDl9Wy4pXSkvO1xuY29uc3QgbGhlYWRpbmdDb3JlID0gL14oPyFidWxsIHxibG9ja0NvZGV8ZmVuY2VzfGJsb2NrcXVvdGV8aGVhZGluZ3xodG1sfHRhYmxlKSgoPzoufFxcbig/IVxccyo/XFxufGJ1bGwgfGJsb2NrQ29kZXxmZW5jZXN8YmxvY2txdW90ZXxoZWFkaW5nfGh0bWx8dGFibGUpKSs/KVxcbiB7MCwzfSg9K3wtKykgKig/Olxcbit8JCkvO1xuY29uc3QgbGhlYWRpbmcgPSBlZGl0KGxoZWFkaW5nQ29yZSlcbiAgLnJlcGxhY2UoL2J1bGwvZywgYnVsbGV0KSAvLyBsaXN0cyBjYW4gaW50ZXJydXB0XG4gIC5yZXBsYWNlKC9ibG9ja0NvZGUvZywgLyg/OiB7NH18IHswLDN9XFx0KS8pIC8vIGluZGVudGVkIGNvZGUgYmxvY2tzIGNhbiBpbnRlcnJ1cHRcbiAgLnJlcGxhY2UoL2ZlbmNlcy9nLCAvIHswLDN9KD86YHszLH18fnszLH0pLykgLy8gZmVuY2VkIGNvZGUgYmxvY2tzIGNhbiBpbnRlcnJ1cHRcbiAgLnJlcGxhY2UoL2Jsb2NrcXVvdGUvZywgLyB7MCwzfT4vKSAvLyBibG9ja3F1b3RlIGNhbiBpbnRlcnJ1cHRcbiAgLnJlcGxhY2UoL2hlYWRpbmcvZywgLyB7MCwzfSN7MSw2fS8pIC8vIEFUWCBoZWFkaW5nIGNhbiBpbnRlcnJ1cHRcbiAgLnJlcGxhY2UoL2h0bWwvZywgLyB7MCwzfTxbXlxcbj5dKz5cXG4vKSAvLyBibG9jayBodG1sIGNhbiBpbnRlcnJ1cHRcbiAgLnJlcGxhY2UoL1xcfHRhYmxlL2csICcnKSAvLyB0YWJsZSBub3QgaW4gY29tbW9ubWFya1xuICAuZ2V0UmVnZXgoKTtcbmNvbnN0IGxoZWFkaW5nR2ZtID0gZWRpdChsaGVhZGluZ0NvcmUpXG4gIC5yZXBsYWNlKC9idWxsL2csIGJ1bGxldCkgLy8gbGlzdHMgY2FuIGludGVycnVwdFxuICAucmVwbGFjZSgvYmxvY2tDb2RlL2csIC8oPzogezR9fCB7MCwzfVxcdCkvKSAvLyBpbmRlbnRlZCBjb2RlIGJsb2NrcyBjYW4gaW50ZXJydXB0XG4gIC5yZXBsYWNlKC9mZW5jZXMvZywgLyB7MCwzfSg/OmB7Myx9fH57Myx9KS8pIC8vIGZlbmNlZCBjb2RlIGJsb2NrcyBjYW4gaW50ZXJydXB0XG4gIC5yZXBsYWNlKC9ibG9ja3F1b3RlL2csIC8gezAsM30+LykgLy8gYmxvY2txdW90ZSBjYW4gaW50ZXJydXB0XG4gIC5yZXBsYWNlKC9oZWFkaW5nL2csIC8gezAsM30jezEsNn0vKSAvLyBBVFggaGVhZGluZyBjYW4gaW50ZXJydXB0XG4gIC5yZXBsYWNlKC9odG1sL2csIC8gezAsM308W15cXG4+XSs+XFxuLykgLy8gYmxvY2sgaHRtbCBjYW4gaW50ZXJydXB0XG4gIC5yZXBsYWNlKC90YWJsZS9nLCAvIHswLDN9XFx8Pyg/Ols6XFwtIF0qXFx8KStbXFw6XFwtIF0qXFxuLykgLy8gdGFibGUgY2FuIGludGVycnVwdFxuICAuZ2V0UmVnZXgoKTtcbmNvbnN0IF9wYXJhZ3JhcGggPSAvXihbXlxcbl0rKD86XFxuKD8haHJ8aGVhZGluZ3xsaGVhZGluZ3xibG9ja3F1b3RlfGZlbmNlc3xsaXN0fGh0bWx8dGFibGV8ICtcXG4pW15cXG5dKykqKS87XG5jb25zdCBibG9ja1RleHQgPSAvXlteXFxuXSsvO1xuY29uc3QgX2Jsb2NrTGFiZWwgPSAvKD8hXFxzKlxcXSkoPzpcXFxcW1xcc1xcU118W15cXFtcXF1cXFxcXSkrLztcbmNvbnN0IGRlZiA9IGVkaXQoL14gezAsM31cXFsobGFiZWwpXFxdOiAqKD86XFxuWyBcXHRdKik/KFtePFxcc11bXlxcc10qfDwuKj8+KSg/Oig/OiArKD86XFxuWyBcXHRdKik/fCAqXFxuWyBcXHRdKikodGl0bGUpKT8gKig/Olxcbit8JCkvKVxuICAucmVwbGFjZSgnbGFiZWwnLCBfYmxvY2tMYWJlbClcbiAgLnJlcGxhY2UoJ3RpdGxlJywgLyg/OlwiKD86XFxcXFwiP3xbXlwiXFxcXF0pKlwifCdbXidcXG5dKig/OlxcblteJ1xcbl0rKSpcXG4/J3xcXChbXigpXSpcXCkpLylcbiAgLmdldFJlZ2V4KCk7XG5cbmNvbnN0IGxpc3QgPSBlZGl0KC9eKGJ1bGwpKFsgXFx0XVteXFxuXSs/KT8oPzpcXG58JCkvKVxuICAucmVwbGFjZSgvYnVsbC9nLCBidWxsZXQpXG4gIC5nZXRSZWdleCgpO1xuXG5jb25zdCBfdGFnID0gJ2FkZHJlc3N8YXJ0aWNsZXxhc2lkZXxiYXNlfGJhc2Vmb250fGJsb2NrcXVvdGV8Ym9keXxjYXB0aW9uJ1xuICArICd8Y2VudGVyfGNvbHxjb2xncm91cHxkZHxkZXRhaWxzfGRpYWxvZ3xkaXJ8ZGl2fGRsfGR0fGZpZWxkc2V0fGZpZ2NhcHRpb24nXG4gICsgJ3xmaWd1cmV8Zm9vdGVyfGZvcm18ZnJhbWV8ZnJhbWVzZXR8aFsxLTZdfGhlYWR8aGVhZGVyfGhyfGh0bWx8aWZyYW1lJ1xuICArICd8bGVnZW5kfGxpfGxpbmt8bWFpbnxtZW51fG1lbnVpdGVtfG1ldGF8bmF2fG5vZnJhbWVzfG9sfG9wdGdyb3VwfG9wdGlvbidcbiAgKyAnfHB8cGFyYW18c2VhcmNofHNlY3Rpb258c3VtbWFyeXx0YWJsZXx0Ym9keXx0ZHx0Zm9vdHx0aHx0aGVhZHx0aXRsZSdcbiAgKyAnfHRyfHRyYWNrfHVsJztcbmNvbnN0IF9jb21tZW50ID0gLzwhLS0oPzotPz58W1xcc1xcU10qPyg/Oi0tPnwkKSkvO1xuY29uc3QgaHRtbCA9IGVkaXQoXG4gICdeIHswLDN9KD86JyAvLyBvcHRpb25hbCBpbmRlbnRhdGlvblxuKyAnPChzY3JpcHR8cHJlfHN0eWxlfHRleHRhcmVhKVtcXFxccz5dW1xcXFxzXFxcXFNdKj8oPzo8L1xcXFwxPlteXFxcXG5dKlxcXFxuK3wkKScgLy8gKDEpXG4rICd8Y29tbWVudFteXFxcXG5dKihcXFxcbit8JCknIC8vICgyKVxuKyAnfDxcXFxcP1tcXFxcc1xcXFxTXSo/KD86XFxcXD8+XFxcXG4qfCQpJyAvLyAoMylcbisgJ3w8IVtBLVpdW1xcXFxzXFxcXFNdKj8oPzo+XFxcXG4qfCQpJyAvLyAoNClcbisgJ3w8IVxcXFxbQ0RBVEFcXFxcW1tcXFxcc1xcXFxTXSo/KD86XFxcXF1cXFxcXT5cXFxcbip8JCknIC8vICg1KVxuKyAnfDwvPyh0YWcpKD86ICt8XFxcXG58Lz8+KVtcXFxcc1xcXFxTXSo/KD86KD86XFxcXG5bIFxcdF0qKStcXFxcbnwkKScgLy8gKDYpXG4rICd8PCg/IXNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWEpKFthLXpdW1xcXFx3LV0qKSg/OmF0dHJpYnV0ZSkqPyAqLz8+KD89WyBcXFxcdF0qKD86XFxcXG58JCkpW1xcXFxzXFxcXFNdKj8oPzooPzpcXFxcblsgXFx0XSopK1xcXFxufCQpJyAvLyAoNykgb3BlbiB0YWdcbisgJ3w8Lyg/IXNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWEpW2Etel1bXFxcXHctXSpcXFxccyo+KD89WyBcXFxcdF0qKD86XFxcXG58JCkpW1xcXFxzXFxcXFNdKj8oPzooPzpcXFxcblsgXFx0XSopK1xcXFxufCQpJyAvLyAoNykgY2xvc2luZyB0YWdcbisgJyknLCAnaScpXG4gIC5yZXBsYWNlKCdjb21tZW50JywgX2NvbW1lbnQpXG4gIC5yZXBsYWNlKCd0YWcnLCBfdGFnKVxuICAucmVwbGFjZSgnYXR0cmlidXRlJywgLyArW2EtekEtWjpfXVtcXHcuOi1dKig/OiAqPSAqXCJbXlwiXFxuXSpcInwgKj0gKidbXidcXG5dKid8ICo9ICpbXlxcc1wiJz08PmBdKyk/LylcbiAgLmdldFJlZ2V4KCk7XG5cbmNvbnN0IHBhcmFncmFwaCA9IGVkaXQoX3BhcmFncmFwaClcbiAgLnJlcGxhY2UoJ2hyJywgaHIpXG4gIC5yZXBsYWNlKCdoZWFkaW5nJywgJyB7MCwzfSN7MSw2fSg/OlxcXFxzfCQpJylcbiAgLnJlcGxhY2UoJ3xsaGVhZGluZycsICcnKSAvLyBzZXRleHQgaGVhZGluZ3MgZG9uJ3QgaW50ZXJydXB0IGNvbW1vbm1hcmsgcGFyYWdyYXBoc1xuICAucmVwbGFjZSgnfHRhYmxlJywgJycpXG4gIC5yZXBsYWNlKCdibG9ja3F1b3RlJywgJyB7MCwzfT4nKVxuICAucmVwbGFjZSgnZmVuY2VzJywgJyB7MCwzfSg/OmB7Myx9KD89W15gXFxcXG5dKlxcXFxuKXx+ezMsfSlbXlxcXFxuXSpcXFxcbicpXG4gIC5yZXBsYWNlKCdsaXN0JywgJyB7MCwzfSg/OlsqKy1dfDFbLildKVsgXFxcXHRdJykgLy8gb25seSBsaXN0cyBzdGFydGluZyBmcm9tIDEgY2FuIGludGVycnVwdFxuICAucmVwbGFjZSgnaHRtbCcsICc8Lz8oPzp0YWcpKD86ICt8XFxcXG58Lz8+KXw8KD86c2NyaXB0fHByZXxzdHlsZXx0ZXh0YXJlYXwhLS0pJylcbiAgLnJlcGxhY2UoJ3RhZycsIF90YWcpIC8vIHBhcnMgY2FuIGJlIGludGVycnVwdGVkIGJ5IHR5cGUgKDYpIGh0bWwgYmxvY2tzXG4gIC5nZXRSZWdleCgpO1xuXG5jb25zdCBibG9ja3F1b3RlID0gZWRpdCgvXiggezAsM30+ID8ocGFyYWdyYXBofFteXFxuXSopKD86XFxufCQpKSsvKVxuICAucmVwbGFjZSgncGFyYWdyYXBoJywgcGFyYWdyYXBoKVxuICAuZ2V0UmVnZXgoKTtcblxuLyoqXG4gKiBOb3JtYWwgQmxvY2sgR3JhbW1hclxuICovXG5cbmNvbnN0IGJsb2NrTm9ybWFsID0ge1xuICBibG9ja3F1b3RlLFxuICBjb2RlOiBibG9ja0NvZGUsXG4gIGRlZixcbiAgZmVuY2VzLFxuICBoZWFkaW5nLFxuICBocixcbiAgaHRtbCxcbiAgbGhlYWRpbmcsXG4gIGxpc3QsXG4gIG5ld2xpbmUsXG4gIHBhcmFncmFwaCxcbiAgdGFibGU6IG5vb3BUZXN0LFxuICB0ZXh0OiBibG9ja1RleHQsXG59O1xuXG50eXBlIEJsb2NrS2V5cyA9IGtleW9mIHR5cGVvZiBibG9ja05vcm1hbDtcblxuLyoqXG4gKiBHRk0gQmxvY2sgR3JhbW1hclxuICovXG5cbmNvbnN0IGdmbVRhYmxlID0gZWRpdChcbiAgJ14gKihbXlxcXFxuIF0uKilcXFxcbicgLy8gSGVhZGVyXG4rICcgezAsM30oKD86XFxcXHwgKik/Oj8tKzo/ICooPzpcXFxcfCAqOj8tKzo/ICopKig/OlxcXFx8ICopPyknIC8vIEFsaWduXG4rICcoPzpcXFxcbigoPzooPyEgKlxcXFxufGhyfGhlYWRpbmd8YmxvY2txdW90ZXxjb2RlfGZlbmNlc3xsaXN0fGh0bWwpLiooPzpcXFxcbnwkKSkqKVxcXFxuKnwkKScpIC8vIENlbGxzXG4gIC5yZXBsYWNlKCdocicsIGhyKVxuICAucmVwbGFjZSgnaGVhZGluZycsICcgezAsM30jezEsNn0oPzpcXFxcc3wkKScpXG4gIC5yZXBsYWNlKCdibG9ja3F1b3RlJywgJyB7MCwzfT4nKVxuICAucmVwbGFjZSgnY29kZScsICcoPzogezR9fCB7MCwzfVxcdClbXlxcXFxuXScpXG4gIC5yZXBsYWNlKCdmZW5jZXMnLCAnIHswLDN9KD86YHszLH0oPz1bXmBcXFxcbl0qXFxcXG4pfH57Myx9KVteXFxcXG5dKlxcXFxuJylcbiAgLnJlcGxhY2UoJ2xpc3QnLCAnIHswLDN9KD86WyorLV18MVsuKV0pWyBcXFxcdF0nKSAvLyBvbmx5IGxpc3RzIHN0YXJ0aW5nIGZyb20gMSBjYW4gaW50ZXJydXB0XG4gIC5yZXBsYWNlKCdodG1sJywgJzwvPyg/OnRhZykoPzogK3xcXFxcbnwvPz4pfDwoPzpzY3JpcHR8cHJlfHN0eWxlfHRleHRhcmVhfCEtLSknKVxuICAucmVwbGFjZSgndGFnJywgX3RhZykgLy8gdGFibGVzIGNhbiBiZSBpbnRlcnJ1cHRlZCBieSB0eXBlICg2KSBodG1sIGJsb2Nrc1xuICAuZ2V0UmVnZXgoKTtcblxuY29uc3QgYmxvY2tHZm06IFJlY29yZDxCbG9ja0tleXMsIFJlZ0V4cD4gPSB7XG4gIC4uLmJsb2NrTm9ybWFsLFxuICBsaGVhZGluZzogbGhlYWRpbmdHZm0sXG4gIHRhYmxlOiBnZm1UYWJsZSxcbiAgcGFyYWdyYXBoOiBlZGl0KF9wYXJhZ3JhcGgpXG4gICAgLnJlcGxhY2UoJ2hyJywgaHIpXG4gICAgLnJlcGxhY2UoJ2hlYWRpbmcnLCAnIHswLDN9I3sxLDZ9KD86XFxcXHN8JCknKVxuICAgIC5yZXBsYWNlKCd8bGhlYWRpbmcnLCAnJykgLy8gc2V0ZXh0IGhlYWRpbmdzIGRvbid0IGludGVycnVwdCBjb21tb25tYXJrIHBhcmFncmFwaHNcbiAgICAucmVwbGFjZSgndGFibGUnLCBnZm1UYWJsZSkgLy8gaW50ZXJydXB0IHBhcmFncmFwaHMgd2l0aCB0YWJsZVxuICAgIC5yZXBsYWNlKCdibG9ja3F1b3RlJywgJyB7MCwzfT4nKVxuICAgIC5yZXBsYWNlKCdmZW5jZXMnLCAnIHswLDN9KD86YHszLH0oPz1bXmBcXFxcbl0qXFxcXG4pfH57Myx9KVteXFxcXG5dKlxcXFxuJylcbiAgICAucmVwbGFjZSgnbGlzdCcsICcgezAsM30oPzpbKistXXwxWy4pXSlbIFxcXFx0XScpIC8vIG9ubHkgbGlzdHMgc3RhcnRpbmcgZnJvbSAxIGNhbiBpbnRlcnJ1cHRcbiAgICAucmVwbGFjZSgnaHRtbCcsICc8Lz8oPzp0YWcpKD86ICt8XFxcXG58Lz8+KXw8KD86c2NyaXB0fHByZXxzdHlsZXx0ZXh0YXJlYXwhLS0pJylcbiAgICAucmVwbGFjZSgndGFnJywgX3RhZykgLy8gcGFycyBjYW4gYmUgaW50ZXJydXB0ZWQgYnkgdHlwZSAoNikgaHRtbCBibG9ja3NcbiAgICAuZ2V0UmVnZXgoKSxcbn07XG5cbi8qKlxuICogUGVkYW50aWMgZ3JhbW1hciAob3JpZ2luYWwgSm9obiBHcnViZXIncyBsb29zZSBtYXJrZG93biBzcGVjaWZpY2F0aW9uKVxuICovXG5cbmNvbnN0IGJsb2NrUGVkYW50aWM6IFJlY29yZDxCbG9ja0tleXMsIFJlZ0V4cD4gPSB7XG4gIC4uLmJsb2NrTm9ybWFsLFxuICBodG1sOiBlZGl0KFxuICAgICdeICooPzpjb21tZW50ICooPzpcXFxcbnxcXFxccyokKSdcbiAgICArICd8PCh0YWcpW1xcXFxzXFxcXFNdKz88L1xcXFwxPiAqKD86XFxcXG57Mix9fFxcXFxzKiQpJyAvLyBjbG9zZWQgdGFnXG4gICAgKyAnfDx0YWcoPzpcIlteXCJdKlwifFxcJ1teXFwnXSpcXCd8XFxcXHNbXlxcJ1wiLz5cXFxcc10qKSo/Lz8+ICooPzpcXFxcbnsyLH18XFxcXHMqJCkpJylcbiAgICAucmVwbGFjZSgnY29tbWVudCcsIF9jb21tZW50KVxuICAgIC5yZXBsYWNlKC90YWcvZywgJyg/ISg/OidcbiAgICAgICsgJ2F8ZW18c3Ryb25nfHNtYWxsfHN8Y2l0ZXxxfGRmbnxhYmJyfGRhdGF8dGltZXxjb2RlfHZhcnxzYW1wfGtiZHxzdWInXG4gICAgICArICd8c3VwfGl8Ynx1fG1hcmt8cnVieXxydHxycHxiZGl8YmRvfHNwYW58YnJ8d2JyfGluc3xkZWx8aW1nKSdcbiAgICAgICsgJ1xcXFxiKVxcXFx3Kyg/ITp8W15cXFxcd1xcXFxzQF0qQClcXFxcYicpXG4gICAgLmdldFJlZ2V4KCksXG4gIGRlZjogL14gKlxcWyhbXlxcXV0rKVxcXTogKjw/KFteXFxzPl0rKT4/KD86ICsoW1wiKF1bXlxcbl0rW1wiKV0pKT8gKig/Olxcbit8JCkvLFxuICBoZWFkaW5nOiAvXigjezEsNn0pKC4qKSg/Olxcbit8JCkvLFxuICBmZW5jZXM6IG5vb3BUZXN0LCAvLyBmZW5jZXMgbm90IHN1cHBvcnRlZFxuICBsaGVhZGluZzogL14oLis/KVxcbiB7MCwzfSg9K3wtKykgKig/Olxcbit8JCkvLFxuICBwYXJhZ3JhcGg6IGVkaXQoX3BhcmFncmFwaClcbiAgICAucmVwbGFjZSgnaHInLCBocilcbiAgICAucmVwbGFjZSgnaGVhZGluZycsICcgKiN7MSw2fSAqW15cXG5dJylcbiAgICAucmVwbGFjZSgnbGhlYWRpbmcnLCBsaGVhZGluZylcbiAgICAucmVwbGFjZSgnfHRhYmxlJywgJycpXG4gICAgLnJlcGxhY2UoJ2Jsb2NrcXVvdGUnLCAnIHswLDN9PicpXG4gICAgLnJlcGxhY2UoJ3xmZW5jZXMnLCAnJylcbiAgICAucmVwbGFjZSgnfGxpc3QnLCAnJylcbiAgICAucmVwbGFjZSgnfGh0bWwnLCAnJylcbiAgICAucmVwbGFjZSgnfHRhZycsICcnKVxuICAgIC5nZXRSZWdleCgpLFxufTtcblxuLyoqXG4gKiBJbmxpbmUtTGV2ZWwgR3JhbW1hclxuICovXG5cbmNvbnN0IGVzY2FwZSA9IC9eXFxcXChbIVwiIyQlJicoKSorLFxcLS4vOjs8PT4/QFxcW1xcXVxcXFxeX2B7fH1+XSkvO1xuY29uc3QgaW5saW5lQ29kZSA9IC9eKGArKShbXmBdfFteYF1bXFxzXFxTXSo/W15gXSlcXDEoPyFgKS87XG5jb25zdCBiciA9IC9eKCB7Mix9fFxcXFwpXFxuKD8hXFxzKiQpLztcbmNvbnN0IGlubGluZVRleHQgPSAvXihgK3xbXmBdKSg/Oig/PSB7Mix9XFxuKXxbXFxzXFxTXSo/KD86KD89W1xcXFw8IVxcW2AqX118XFxiX3wkKXxbXiBdKD89IHsyLH1cXG4pKSkvO1xuXG4vLyBsaXN0IG9mIHVuaWNvZGUgcHVuY3R1YXRpb24gbWFya3MsIHBsdXMgYW55IG1pc3NpbmcgY2hhcmFjdGVycyBmcm9tIENvbW1vbk1hcmsgc3BlY1xuY29uc3QgX3B1bmN0dWF0aW9uID0gL1tcXHB7UH1cXHB7U31dL3U7XG5jb25zdCBfcHVuY3R1YXRpb25PclNwYWNlID0gL1tcXHNcXHB7UH1cXHB7U31dL3U7XG5jb25zdCBfbm90UHVuY3R1YXRpb25PclNwYWNlID0gL1teXFxzXFxwe1B9XFxwe1N9XS91O1xuY29uc3QgcHVuY3R1YXRpb24gPSBlZGl0KC9eKCg/IVsqX10pcHVuY3RTcGFjZSkvLCAndScpXG4gIC5yZXBsYWNlKC9wdW5jdFNwYWNlL2csIF9wdW5jdHVhdGlvbk9yU3BhY2UpLmdldFJlZ2V4KCk7XG5cbi8vIEdGTSBhbGxvd3MgfiBpbnNpZGUgc3Ryb25nIGFuZCBlbSBmb3Igc3RyaWtldGhyb3VnaFxuY29uc3QgX3B1bmN0dWF0aW9uR2ZtU3Ryb25nRW0gPSAvKD8hfilbXFxwe1B9XFxwe1N9XS91O1xuY29uc3QgX3B1bmN0dWF0aW9uT3JTcGFjZUdmbVN0cm9uZ0VtID0gLyg/IX4pW1xcc1xccHtQfVxccHtTfV0vdTtcbmNvbnN0IF9ub3RQdW5jdHVhdGlvbk9yU3BhY2VHZm1TdHJvbmdFbSA9IC8oPzpbXlxcc1xccHtQfVxccHtTfV18fikvdTtcblxuLy8gc2VxdWVuY2VzIGVtIHNob3VsZCBza2lwIG92ZXIgW3RpdGxlXShsaW5rKSwgYGNvZGVgLCA8aHRtbD5cbmNvbnN0IGJsb2NrU2tpcCA9IGVkaXQoL2xpbmt8cHJlY29kZS1jb2RlfGh0bWwvLCAnZycpXG4gIC5yZXBsYWNlKCdsaW5rJywgL1xcWyg/OlteXFxbXFxdYF18KD88YT5gKylbXmBdK1xcazxhPig/IWApKSo/XFxdXFwoKD86XFxcXFtcXHNcXFNdfFteXFxcXFxcKFxcKV18XFwoKD86XFxcXFtcXHNcXFNdfFteXFxcXFxcKFxcKV0pKlxcKSkqXFwpLylcbiAgLnJlcGxhY2UoJ3ByZWNvZGUtJywgc3VwcG9ydHNMb29rYmVoaW5kID8gJyg/PCFgKSgpJyA6ICcoXl58W15gXSknKVxuICAucmVwbGFjZSgnY29kZScsIC8oPzxiPmArKVteYF0rXFxrPGI+KD8hYCkvKVxuICAucmVwbGFjZSgnaHRtbCcsIC88KD8hIClbXjw+XSo/Pi8pXG4gIC5nZXRSZWdleCgpO1xuXG5jb25zdCBlbVN0cm9uZ0xEZWxpbUNvcmUgPSAvXig/OlxcKisoPzooKD8hXFwqKXB1bmN0KXwoW15cXHMqXSkpPyl8Xl8rKD86KCg/IV8pcHVuY3QpfChbXlxcc19dKSk/LztcblxuY29uc3QgZW1TdHJvbmdMRGVsaW0gPSBlZGl0KGVtU3Ryb25nTERlbGltQ29yZSwgJ3UnKVxuICAucmVwbGFjZSgvcHVuY3QvZywgX3B1bmN0dWF0aW9uKVxuICAuZ2V0UmVnZXgoKTtcblxuY29uc3QgZW1TdHJvbmdMRGVsaW1HZm0gPSBlZGl0KGVtU3Ryb25nTERlbGltQ29yZSwgJ3UnKVxuICAucmVwbGFjZSgvcHVuY3QvZywgX3B1bmN0dWF0aW9uR2ZtU3Ryb25nRW0pXG4gIC5nZXRSZWdleCgpO1xuXG5jb25zdCBlbVN0cm9uZ1JEZWxpbUFzdENvcmUgPVxuICAnXlteXypdKj9fX1teXypdKj9cXFxcKlteXypdKj8oPz1fXyknIC8vIFNraXAgb3JwaGFuIGluc2lkZSBzdHJvbmdcbisgJ3xbXipdKyg/PVteKl0pJyAvLyBDb25zdW1lIHRvIGRlbGltXG4rICd8KD8hXFxcXCopcHVuY3QoXFxcXCorKSg/PVtcXFxcc118JCknIC8vICgxKSAjKioqIGNhbiBvbmx5IGJlIGEgUmlnaHQgRGVsaW1pdGVyXG4rICd8bm90UHVuY3RTcGFjZShcXFxcKispKD8hXFxcXCopKD89cHVuY3RTcGFjZXwkKScgLy8gKDIpIGEqKiojLCBhKioqIGNhbiBvbmx5IGJlIGEgUmlnaHQgRGVsaW1pdGVyXG4rICd8KD8hXFxcXCopcHVuY3RTcGFjZShcXFxcKispKD89bm90UHVuY3RTcGFjZSknIC8vICgzKSAjKioqYSwgKioqYSBjYW4gb25seSBiZSBMZWZ0IERlbGltaXRlclxuKyAnfFtcXFxcc10oXFxcXCorKSg/IVxcXFwqKSg/PXB1bmN0KScgLy8gKDQpICoqKiMgY2FuIG9ubHkgYmUgTGVmdCBEZWxpbWl0ZXJcbisgJ3woPyFcXFxcKilwdW5jdChcXFxcKispKD8hXFxcXCopKD89cHVuY3QpJyAvLyAoNSkgIyoqKiMgY2FuIGJlIGVpdGhlciBMZWZ0IG9yIFJpZ2h0IERlbGltaXRlclxuKyAnfG5vdFB1bmN0U3BhY2UoXFxcXCorKSg/PW5vdFB1bmN0U3BhY2UpJzsgLy8gKDYpIGEqKiphIGNhbiBiZSBlaXRoZXIgTGVmdCBvciBSaWdodCBEZWxpbWl0ZXJcblxuY29uc3QgZW1TdHJvbmdSRGVsaW1Bc3QgPSBlZGl0KGVtU3Ryb25nUkRlbGltQXN0Q29yZSwgJ2d1JylcbiAgLnJlcGxhY2UoL25vdFB1bmN0U3BhY2UvZywgX25vdFB1bmN0dWF0aW9uT3JTcGFjZSlcbiAgLnJlcGxhY2UoL3B1bmN0U3BhY2UvZywgX3B1bmN0dWF0aW9uT3JTcGFjZSlcbiAgLnJlcGxhY2UoL3B1bmN0L2csIF9wdW5jdHVhdGlvbilcbiAgLmdldFJlZ2V4KCk7XG5cbmNvbnN0IGVtU3Ryb25nUkRlbGltQXN0R2ZtID0gZWRpdChlbVN0cm9uZ1JEZWxpbUFzdENvcmUsICdndScpXG4gIC5yZXBsYWNlKC9ub3RQdW5jdFNwYWNlL2csIF9ub3RQdW5jdHVhdGlvbk9yU3BhY2VHZm1TdHJvbmdFbSlcbiAgLnJlcGxhY2UoL3B1bmN0U3BhY2UvZywgX3B1bmN0dWF0aW9uT3JTcGFjZUdmbVN0cm9uZ0VtKVxuICAucmVwbGFjZSgvcHVuY3QvZywgX3B1bmN0dWF0aW9uR2ZtU3Ryb25nRW0pXG4gIC5nZXRSZWdleCgpO1xuXG4vLyAoNikgTm90IGFsbG93ZWQgZm9yIF9cbmNvbnN0IGVtU3Ryb25nUkRlbGltVW5kID0gZWRpdChcbiAgJ15bXl8qXSo/XFxcXCpcXFxcKlteXypdKj9fW15fKl0qPyg/PVxcXFwqXFxcXCopJyAvLyBTa2lwIG9ycGhhbiBpbnNpZGUgc3Ryb25nXG4rICd8W15fXSsoPz1bXl9dKScgLy8gQ29uc3VtZSB0byBkZWxpbVxuKyAnfCg/IV8pcHVuY3QoXyspKD89W1xcXFxzXXwkKScgLy8gKDEpICNfX18gY2FuIG9ubHkgYmUgYSBSaWdodCBEZWxpbWl0ZXJcbisgJ3xub3RQdW5jdFNwYWNlKF8rKSg/IV8pKD89cHVuY3RTcGFjZXwkKScgLy8gKDIpIGFfX18jLCBhX19fIGNhbiBvbmx5IGJlIGEgUmlnaHQgRGVsaW1pdGVyXG4rICd8KD8hXylwdW5jdFNwYWNlKF8rKSg/PW5vdFB1bmN0U3BhY2UpJyAvLyAoMykgI19fX2EsIF9fX2EgY2FuIG9ubHkgYmUgTGVmdCBEZWxpbWl0ZXJcbisgJ3xbXFxcXHNdKF8rKSg/IV8pKD89cHVuY3QpJyAvLyAoNCkgX19fIyBjYW4gb25seSBiZSBMZWZ0IERlbGltaXRlclxuKyAnfCg/IV8pcHVuY3QoXyspKD8hXykoPz1wdW5jdCknLCAnZ3UnKSAvLyAoNSkgI19fXyMgY2FuIGJlIGVpdGhlciBMZWZ0IG9yIFJpZ2h0IERlbGltaXRlclxuICAucmVwbGFjZSgvbm90UHVuY3RTcGFjZS9nLCBfbm90UHVuY3R1YXRpb25PclNwYWNlKVxuICAucmVwbGFjZSgvcHVuY3RTcGFjZS9nLCBfcHVuY3R1YXRpb25PclNwYWNlKVxuICAucmVwbGFjZSgvcHVuY3QvZywgX3B1bmN0dWF0aW9uKVxuICAuZ2V0UmVnZXgoKTtcblxuLy8gVGlsZGUgbGVmdCBkZWxpbWl0ZXIgZm9yIHN0cmlrZXRocm91Z2ggKHNpbWlsYXIgdG8gZW1TdHJvbmdMRGVsaW0gZm9yIGFzdGVyaXNrKVxuY29uc3QgZGVsTERlbGltID0gZWRpdCgvXn5+Pyg/OigoPyF+KXB1bmN0KXxbXlxcc35dKS8sICd1JylcbiAgLnJlcGxhY2UoL3B1bmN0L2csIF9wdW5jdHVhdGlvbilcbiAgLmdldFJlZ2V4KCk7XG5cbi8vIFRpbGRlIGRlbGltaXRlciBwYXR0ZXJucyBmb3Igc3RyaWtldGhyb3VnaCAoc2ltaWxhciB0byBhc3RlcmlzaylcbmNvbnN0IGRlbFJEZWxpbUNvcmUgPVxuICAnXltefl0rKD89W15+XSknIC8vIENvbnN1bWUgdG8gZGVsaW1cbisgJ3woPyF+KXB1bmN0KH5+PykoPz1bXFxcXHNdfCQpJyAvLyAoMSkgI35+IGNhbiBvbmx5IGJlIGEgUmlnaHQgRGVsaW1pdGVyXG4rICd8bm90UHVuY3RTcGFjZSh+fj8pKD8hfikoPz1wdW5jdFNwYWNlfCQpJyAvLyAoMikgYX5+IywgYX5+IGNhbiBvbmx5IGJlIGEgUmlnaHQgRGVsaW1pdGVyXG4rICd8KD8hfilwdW5jdFNwYWNlKH5+PykoPz1ub3RQdW5jdFNwYWNlKScgLy8gKDMpICN+fmEsIH5+YSBjYW4gb25seSBiZSBMZWZ0IERlbGltaXRlclxuKyAnfFtcXFxcc10ofn4/KSg/IX4pKD89cHVuY3QpJyAvLyAoNCkgfn4jIGNhbiBvbmx5IGJlIExlZnQgRGVsaW1pdGVyXG4rICd8KD8hfilwdW5jdCh+fj8pKD8hfikoPz1wdW5jdCknIC8vICg1KSAjfn4jIGNhbiBiZSBlaXRoZXIgTGVmdCBvciBSaWdodCBEZWxpbWl0ZXJcbisgJ3xub3RQdW5jdFNwYWNlKH5+PykoPz1ub3RQdW5jdFNwYWNlKSc7IC8vICg2KSBhfn5hIGNhbiBiZSBlaXRoZXIgTGVmdCBvciBSaWdodCBEZWxpbWl0ZXJcblxuY29uc3QgZGVsUkRlbGltID0gZWRpdChkZWxSRGVsaW1Db3JlLCAnZ3UnKVxuICAucmVwbGFjZSgvbm90UHVuY3RTcGFjZS9nLCBfbm90UHVuY3R1YXRpb25PclNwYWNlKVxuICAucmVwbGFjZSgvcHVuY3RTcGFjZS9nLCBfcHVuY3R1YXRpb25PclNwYWNlKVxuICAucmVwbGFjZSgvcHVuY3QvZywgX3B1bmN0dWF0aW9uKVxuICAuZ2V0UmVnZXgoKTtcblxuY29uc3QgYW55UHVuY3R1YXRpb24gPSBlZGl0KC9cXFxcKHB1bmN0KS8sICdndScpXG4gIC5yZXBsYWNlKC9wdW5jdC9nLCBfcHVuY3R1YXRpb24pXG4gIC5nZXRSZWdleCgpO1xuXG5jb25zdCBhdXRvbGluayA9IGVkaXQoL148KHNjaGVtZTpbXlxcc1xceDAwLVxceDFmPD5dKnxlbWFpbCk+LylcbiAgLnJlcGxhY2UoJ3NjaGVtZScsIC9bYS16QS1aXVthLXpBLVowLTkrLi1dezEsMzF9LylcbiAgLnJlcGxhY2UoJ2VtYWlsJywgL1thLXpBLVowLTkuISMkJSYnKisvPT9eX2B7fH1+LV0rKEApW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSk/KD86XFwuW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSk/KSsoPyFbLV9dKS8pXG4gIC5nZXRSZWdleCgpO1xuXG5jb25zdCBfaW5saW5lQ29tbWVudCA9IGVkaXQoX2NvbW1lbnQpLnJlcGxhY2UoJyg/Oi0tPnwkKScsICctLT4nKS5nZXRSZWdleCgpO1xuY29uc3QgdGFnID0gZWRpdChcbiAgJ15jb21tZW50J1xuICAgICsgJ3xePC9bYS16QS1aXVtcXFxcdzotXSpcXFxccyo+JyAvLyBzZWxmLWNsb3NpbmcgdGFnXG4gICAgKyAnfF48W2EtekEtWl1bXFxcXHctXSooPzphdHRyaWJ1dGUpKj9cXFxccyovPz4nIC8vIG9wZW4gdGFnXG4gICAgKyAnfF48XFxcXD9bXFxcXHNcXFxcU10qP1xcXFw/PicgLy8gcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiwgZS5nLiA8P3BocCA/PlxuICAgICsgJ3xePCFbYS16QS1aXStcXFxcc1tcXFxcc1xcXFxTXSo/PicgLy8gZGVjbGFyYXRpb24sIGUuZy4gPCFET0NUWVBFIGh0bWw+XG4gICAgKyAnfF48IVxcXFxbQ0RBVEFcXFxcW1tcXFxcc1xcXFxTXSo/XFxcXF1cXFxcXT4nKSAvLyBDREFUQSBzZWN0aW9uXG4gIC5yZXBsYWNlKCdjb21tZW50JywgX2lubGluZUNvbW1lbnQpXG4gIC5yZXBsYWNlKCdhdHRyaWJ1dGUnLCAvXFxzK1thLXpBLVo6X11bXFx3LjotXSooPzpcXHMqPVxccypcIlteXCJdKlwifFxccyo9XFxzKidbXiddKid8XFxzKj1cXHMqW15cXHNcIic9PD5gXSspPy8pXG4gIC5nZXRSZWdleCgpO1xuXG5jb25zdCBfaW5saW5lTGFiZWwgPSAvKD86XFxbKD86XFxcXFtcXHNcXFNdfFteXFxbXFxdXFxcXF0pKlxcXXxcXFxcW1xcc1xcU118YCsoPyFgKVteYF0qP2ArKD8hYCl8YGArKD89XFxdKXxbXlxcW1xcXVxcXFxgXSkqPy87XG5cbmNvbnN0IGxpbmsgPSBlZGl0KC9eIT9cXFsobGFiZWwpXFxdXFwoXFxzKihocmVmKSg/Oig/OlsgXFx0XSsoPzpcXG5bIFxcdF0qKT98XFxuWyBcXHRdKikodGl0bGUpKT9cXHMqXFwpLylcbiAgLnJlcGxhY2UoJ2xhYmVsJywgX2lubGluZUxhYmVsKVxuICAucmVwbGFjZSgnaHJlZicsIC88KD86XFxcXC58W15cXG48PlxcXFxdKSs+fFteIFxcdFxcblxceDAwLVxceDFmXSovKVxuICAucmVwbGFjZSgndGl0bGUnLCAvXCIoPzpcXFxcXCI/fFteXCJcXFxcXSkqXCJ8Jyg/OlxcXFwnP3xbXidcXFxcXSkqJ3xcXCgoPzpcXFxcXFwpP3xbXilcXFxcXSkqXFwpLylcbiAgLmdldFJlZ2V4KCk7XG5cbmNvbnN0IHJlZmxpbmsgPSBlZGl0KC9eIT9cXFsobGFiZWwpXFxdXFxbKHJlZilcXF0vKVxuICAucmVwbGFjZSgnbGFiZWwnLCBfaW5saW5lTGFiZWwpXG4gIC5yZXBsYWNlKCdyZWYnLCBfYmxvY2tMYWJlbClcbiAgLmdldFJlZ2V4KCk7XG5cbmNvbnN0IG5vbGluayA9IGVkaXQoL14hP1xcWyhyZWYpXFxdKD86XFxbXFxdKT8vKVxuICAucmVwbGFjZSgncmVmJywgX2Jsb2NrTGFiZWwpXG4gIC5nZXRSZWdleCgpO1xuXG5jb25zdCByZWZsaW5rU2VhcmNoID0gZWRpdCgncmVmbGlua3xub2xpbmsoPyFcXFxcKCknLCAnZycpXG4gIC5yZXBsYWNlKCdyZWZsaW5rJywgcmVmbGluaylcbiAgLnJlcGxhY2UoJ25vbGluaycsIG5vbGluaylcbiAgLmdldFJlZ2V4KCk7XG5cbmNvbnN0IF9jYXNlSW5zZW5zaXRpdmVQcm90b2NvbCA9IC9baEhdW3RUXVt0VF1bcFBdW3NTXT98W2ZGXVt0VF1bcFBdLztcblxuLyoqXG4gKiBOb3JtYWwgSW5saW5lIEdyYW1tYXJcbiAqL1xuXG5jb25zdCBpbmxpbmVOb3JtYWwgPSB7XG4gIF9iYWNrcGVkYWw6IG5vb3BUZXN0LCAvLyBvbmx5IHVzZWQgZm9yIEdGTSB1cmxcbiAgYW55UHVuY3R1YXRpb24sXG4gIGF1dG9saW5rLFxuICBibG9ja1NraXAsXG4gIGJyLFxuICBjb2RlOiBpbmxpbmVDb2RlLFxuICBkZWw6IG5vb3BUZXN0LFxuICBkZWxMRGVsaW06IG5vb3BUZXN0LFxuICBkZWxSRGVsaW06IG5vb3BUZXN0LFxuICBlbVN0cm9uZ0xEZWxpbSxcbiAgZW1TdHJvbmdSRGVsaW1Bc3QsXG4gIGVtU3Ryb25nUkRlbGltVW5kLFxuICBlc2NhcGUsXG4gIGxpbmssXG4gIG5vbGluayxcbiAgcHVuY3R1YXRpb24sXG4gIHJlZmxpbmssXG4gIHJlZmxpbmtTZWFyY2gsXG4gIHRhZyxcbiAgdGV4dDogaW5saW5lVGV4dCxcbiAgdXJsOiBub29wVGVzdCxcbn07XG5cbnR5cGUgSW5saW5lS2V5cyA9IGtleW9mIHR5cGVvZiBpbmxpbmVOb3JtYWw7XG5cbi8qKlxuICogUGVkYW50aWMgSW5saW5lIEdyYW1tYXJcbiAqL1xuXG5jb25zdCBpbmxpbmVQZWRhbnRpYzogUmVjb3JkPElubGluZUtleXMsIFJlZ0V4cD4gPSB7XG4gIC4uLmlubGluZU5vcm1hbCxcbiAgbGluazogZWRpdCgvXiE/XFxbKGxhYmVsKVxcXVxcKCguKj8pXFwpLylcbiAgICAucmVwbGFjZSgnbGFiZWwnLCBfaW5saW5lTGFiZWwpXG4gICAgLmdldFJlZ2V4KCksXG4gIHJlZmxpbms6IGVkaXQoL14hP1xcWyhsYWJlbClcXF1cXHMqXFxbKFteXFxdXSopXFxdLylcbiAgICAucmVwbGFjZSgnbGFiZWwnLCBfaW5saW5lTGFiZWwpXG4gICAgLmdldFJlZ2V4KCksXG59O1xuXG4vKipcbiAqIEdGTSBJbmxpbmUgR3JhbW1hclxuICovXG5cbmNvbnN0IGlubGluZUdmbTogUmVjb3JkPElubGluZUtleXMsIFJlZ0V4cD4gPSB7XG4gIC4uLmlubGluZU5vcm1hbCxcbiAgZW1TdHJvbmdSRGVsaW1Bc3Q6IGVtU3Ryb25nUkRlbGltQXN0R2ZtLFxuICBlbVN0cm9uZ0xEZWxpbTogZW1TdHJvbmdMRGVsaW1HZm0sXG4gIGRlbExEZWxpbSxcbiAgZGVsUkRlbGltLFxuICB1cmw6IGVkaXQoL14oKD86cHJvdG9jb2wpOlxcL1xcL3x3d3dcXC4pKD86W2EtekEtWjAtOVxcLV0rXFwuPykrW15cXHM8XSp8XmVtYWlsLylcbiAgICAucmVwbGFjZSgncHJvdG9jb2wnLCBfY2FzZUluc2Vuc2l0aXZlUHJvdG9jb2wpXG4gICAgLnJlcGxhY2UoJ2VtYWlsJywgL1tBLVphLXowLTkuXystXSsoQClbYS16QS1aMC05LV9dKyg/OlxcLlthLXpBLVowLTktX10qW2EtekEtWjAtOV0pKyg/IVstX10pLylcbiAgICAuZ2V0UmVnZXgoKSxcbiAgX2JhY2twZWRhbDogLyg/OltePyEuLDo7Kl8nXCJ+KCkmXSt8XFwoW14pXSpcXCl8Jig/IVthLXpBLVowLTldKzskKXxbPyEuLDo7Kl8nXCJ+KV0rKD8hJCkpKy8sXG4gIGRlbDogL14ofn4/KSg/PVteXFxzfl0pKCg/OlxcXFxbXFxzXFxTXXxbXlxcXFxdKSo/KD86XFxcXFtcXHNcXFNdfFteXFxzflxcXFxdKSlcXDEoPz1bXn5dfCQpLyxcbiAgdGV4dDogZWRpdCgvXihbYH5dK3xbXmB+XSkoPzooPz0gezIsfVxcbil8KD89W2EtekEtWjAtOS4hIyQlJicqK1xcLz0/X2B7XFx8fX4tXStAKXxbXFxzXFxTXSo/KD86KD89W1xcXFw8IVxcW2Aqfl9dfFxcYl98cHJvdG9jb2w6XFwvXFwvfHd3d1xcLnwkKXxbXiBdKD89IHsyLH1cXG4pfFteYS16QS1aMC05LiEjJCUmJyorXFwvPT9fYHtcXHx9fi1dKD89W2EtekEtWjAtOS4hIyQlJicqK1xcLz0/X2B7XFx8fX4tXStAKSkpLylcbiAgICAucmVwbGFjZSgncHJvdG9jb2wnLCBfY2FzZUluc2Vuc2l0aXZlUHJvdG9jb2wpXG4gICAgLmdldFJlZ2V4KCksXG59O1xuXG4vKipcbiAqIEdGTSArIExpbmUgQnJlYWtzIElubGluZSBHcmFtbWFyXG4gKi9cblxuY29uc3QgaW5saW5lQnJlYWtzOiBSZWNvcmQ8SW5saW5lS2V5cywgUmVnRXhwPiA9IHtcbiAgLi4uaW5saW5lR2ZtLFxuICBicjogZWRpdChicikucmVwbGFjZSgnezIsfScsICcqJykuZ2V0UmVnZXgoKSxcbiAgdGV4dDogZWRpdChpbmxpbmVHZm0udGV4dClcbiAgICAucmVwbGFjZSgnXFxcXGJfJywgJ1xcXFxiX3wgezIsfVxcXFxuJylcbiAgICAucmVwbGFjZSgvXFx7MixcXH0vZywgJyonKVxuICAgIC5nZXRSZWdleCgpLFxufTtcblxuLyoqXG4gKiBleHBvcnRzXG4gKi9cblxuZXhwb3J0IGNvbnN0IGJsb2NrID0ge1xuICBub3JtYWw6IGJsb2NrTm9ybWFsLFxuICBnZm06IGJsb2NrR2ZtLFxuICBwZWRhbnRpYzogYmxvY2tQZWRhbnRpYyxcbn07XG5cbmV4cG9ydCBjb25zdCBpbmxpbmUgPSB7XG4gIG5vcm1hbDogaW5saW5lTm9ybWFsLFxuICBnZm06IGlubGluZUdmbSxcbiAgYnJlYWtzOiBpbmxpbmVCcmVha3MsXG4gIHBlZGFudGljOiBpbmxpbmVQZWRhbnRpYyxcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVsZXMge1xuICBvdGhlcjogdHlwZW9mIG90aGVyXG4gIGJsb2NrOiBSZWNvcmQ8QmxvY2tLZXlzLCBSZWdFeHA+XG4gIGlubGluZTogUmVjb3JkPElubGluZUtleXMsIFJlZ0V4cD5cbn1cbiIsICJpbXBvcnQgeyBvdGhlciB9IGZyb20gJy4vcnVsZXMudHMnO1xuXG4vKipcbiAqIEhlbHBlcnNcbiAqL1xuY29uc3QgZXNjYXBlUmVwbGFjZW1lbnRzOiB7IFtpbmRleDogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICcmJzogJyZhbXA7JyxcbiAgJzwnOiAnJmx0OycsXG4gICc+JzogJyZndDsnLFxuICAnXCInOiAnJnF1b3Q7JyxcbiAgXCInXCI6ICcmIzM5OycsXG59O1xuY29uc3QgZ2V0RXNjYXBlUmVwbGFjZW1lbnQgPSAoY2g6IHN0cmluZykgPT4gZXNjYXBlUmVwbGFjZW1lbnRzW2NoXTtcblxuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZUh0bWxFbnRpdGllcyhodG1sOiBzdHJpbmcsIGVuY29kZT86IGJvb2xlYW4pIHtcbiAgaWYgKGVuY29kZSkge1xuICAgIGlmIChvdGhlci5lc2NhcGVUZXN0LnRlc3QoaHRtbCkpIHtcbiAgICAgIHJldHVybiBodG1sLnJlcGxhY2Uob3RoZXIuZXNjYXBlUmVwbGFjZSwgZ2V0RXNjYXBlUmVwbGFjZW1lbnQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAob3RoZXIuZXNjYXBlVGVzdE5vRW5jb2RlLnRlc3QoaHRtbCkpIHtcbiAgICAgIHJldHVybiBodG1sLnJlcGxhY2Uob3RoZXIuZXNjYXBlUmVwbGFjZU5vRW5jb2RlLCBnZXRFc2NhcGVSZXBsYWNlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGh0bWw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhblVybChocmVmOiBzdHJpbmcpIHtcbiAgdHJ5IHtcbiAgICBocmVmID0gZW5jb2RlVVJJKGhyZWYpLnJlcGxhY2Uob3RoZXIucGVyY2VudERlY29kZSwgJyUnKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIGhyZWY7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdENlbGxzKHRhYmxlUm93OiBzdHJpbmcsIGNvdW50PzogbnVtYmVyKSB7XG4gIC8vIGVuc3VyZSB0aGF0IGV2ZXJ5IGNlbGwtZGVsaW1pdGluZyBwaXBlIGhhcyBhIHNwYWNlXG4gIC8vIGJlZm9yZSBpdCB0byBkaXN0aW5ndWlzaCBpdCBmcm9tIGFuIGVzY2FwZWQgcGlwZVxuICBjb25zdCByb3cgPSB0YWJsZVJvdy5yZXBsYWNlKG90aGVyLmZpbmRQaXBlLCAobWF0Y2gsIG9mZnNldCwgc3RyKSA9PiB7XG4gICAgICBsZXQgZXNjYXBlZCA9IGZhbHNlO1xuICAgICAgbGV0IGN1cnIgPSBvZmZzZXQ7XG4gICAgICB3aGlsZSAoLS1jdXJyID49IDAgJiYgc3RyW2N1cnJdID09PSAnXFxcXCcpIGVzY2FwZWQgPSAhZXNjYXBlZDtcbiAgICAgIGlmIChlc2NhcGVkKSB7XG4gICAgICAgIC8vIG9kZCBudW1iZXIgb2Ygc2xhc2hlcyBtZWFucyB8IGlzIGVzY2FwZWRcbiAgICAgICAgLy8gc28gd2UgbGVhdmUgaXQgYWxvbmVcbiAgICAgICAgcmV0dXJuICd8JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGFkZCBzcGFjZSBiZWZvcmUgdW5lc2NhcGVkIHxcbiAgICAgICAgcmV0dXJuICcgfCc7XG4gICAgICB9XG4gICAgfSksXG4gICAgY2VsbHMgPSByb3cuc3BsaXQob3RoZXIuc3BsaXRQaXBlKTtcbiAgbGV0IGkgPSAwO1xuXG4gIC8vIEZpcnN0L2xhc3QgY2VsbCBpbiBhIHJvdyBjYW5ub3QgYmUgZW1wdHkgaWYgaXQgaGFzIG5vIGxlYWRpbmcvdHJhaWxpbmcgcGlwZVxuICBpZiAoIWNlbGxzWzBdLnRyaW0oKSkge1xuICAgIGNlbGxzLnNoaWZ0KCk7XG4gIH1cbiAgaWYgKGNlbGxzLmxlbmd0aCA+IDAgJiYgIWNlbGxzLmF0KC0xKT8udHJpbSgpKSB7XG4gICAgY2VsbHMucG9wKCk7XG4gIH1cblxuICBpZiAoY291bnQpIHtcbiAgICBpZiAoY2VsbHMubGVuZ3RoID4gY291bnQpIHtcbiAgICAgIGNlbGxzLnNwbGljZShjb3VudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdoaWxlIChjZWxscy5sZW5ndGggPCBjb3VudCkgY2VsbHMucHVzaCgnJyk7XG4gICAgfVxuICB9XG5cbiAgZm9yICg7IGkgPCBjZWxscy5sZW5ndGg7IGkrKykge1xuICAgIC8vIGxlYWRpbmcgb3IgdHJhaWxpbmcgd2hpdGVzcGFjZSBpcyBpZ25vcmVkIHBlciB0aGUgZ2ZtIHNwZWNcbiAgICBjZWxsc1tpXSA9IGNlbGxzW2ldLnRyaW0oKS5yZXBsYWNlKG90aGVyLnNsYXNoUGlwZSwgJ3wnKTtcbiAgfVxuICByZXR1cm4gY2VsbHM7XG59XG5cbi8qKlxuICogUmVtb3ZlIHRyYWlsaW5nICdjJ3MuIEVxdWl2YWxlbnQgdG8gc3RyLnJlcGxhY2UoL2MqJC8sICcnKS5cbiAqIC9jKiQvIGlzIHZ1bG5lcmFibGUgdG8gUkVET1MuXG4gKlxuICogQHBhcmFtIHN0clxuICogQHBhcmFtIGNcbiAqIEBwYXJhbSBpbnZlcnQgUmVtb3ZlIHN1ZmZpeCBvZiBub24tYyBjaGFycyBpbnN0ZWFkLiBEZWZhdWx0IGZhbHNleS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ0cmltKHN0cjogc3RyaW5nLCBjOiBzdHJpbmcsIGludmVydD86IGJvb2xlYW4pIHtcbiAgY29uc3QgbCA9IHN0ci5sZW5ndGg7XG4gIGlmIChsID09PSAwKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgLy8gTGVuZ3RoIG9mIHN1ZmZpeCBtYXRjaGluZyB0aGUgaW52ZXJ0IGNvbmRpdGlvbi5cbiAgbGV0IHN1ZmZMZW4gPSAwO1xuXG4gIC8vIFN0ZXAgbGVmdCB1bnRpbCB3ZSBmYWlsIHRvIG1hdGNoIHRoZSBpbnZlcnQgY29uZGl0aW9uLlxuICB3aGlsZSAoc3VmZkxlbiA8IGwpIHtcbiAgICBjb25zdCBjdXJyQ2hhciA9IHN0ci5jaGFyQXQobCAtIHN1ZmZMZW4gLSAxKTtcbiAgICBpZiAoY3VyckNoYXIgPT09IGMgJiYgIWludmVydCkge1xuICAgICAgc3VmZkxlbisrO1xuICAgIH0gZWxzZSBpZiAoY3VyckNoYXIgIT09IGMgJiYgaW52ZXJ0KSB7XG4gICAgICBzdWZmTGVuKys7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdHIuc2xpY2UoMCwgbCAtIHN1ZmZMZW4pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZENsb3NpbmdCcmFja2V0KHN0cjogc3RyaW5nLCBiOiBzdHJpbmcpIHtcbiAgaWYgKHN0ci5pbmRleE9mKGJbMV0pID09PSAtMSkge1xuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIGxldCBsZXZlbCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHN0cltpXSA9PT0gJ1xcXFwnKSB7XG4gICAgICBpKys7XG4gICAgfSBlbHNlIGlmIChzdHJbaV0gPT09IGJbMF0pIHtcbiAgICAgIGxldmVsKys7XG4gICAgfSBlbHNlIGlmIChzdHJbaV0gPT09IGJbMV0pIHtcbiAgICAgIGxldmVsLS07XG4gICAgICBpZiAobGV2ZWwgPCAwKSB7XG4gICAgICAgIHJldHVybiBpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAobGV2ZWwgPiAwKSB7XG4gICAgcmV0dXJuIC0yO1xuICB9XG5cbiAgcmV0dXJuIC0xO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhwYW5kVGFicyhsaW5lOiBzdHJpbmcsIGluZGVudCA9IDApIHtcbiAgbGV0IGNvbCA9IGluZGVudDtcbiAgbGV0IGV4cGFuZGVkID0gJyc7XG4gIGZvciAoY29uc3QgY2hhciBvZiBsaW5lKSB7XG4gICAgaWYgKGNoYXIgPT09ICdcXHQnKSB7XG4gICAgICBjb25zdCBhZGRlZCA9IDQgLSAoY29sICUgNCk7XG4gICAgICBleHBhbmRlZCArPSAnICcucmVwZWF0KGFkZGVkKTtcbiAgICAgIGNvbCArPSBhZGRlZDtcbiAgICB9IGVsc2Uge1xuICAgICAgZXhwYW5kZWQgKz0gY2hhcjtcbiAgICAgIGNvbCsrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBleHBhbmRlZDtcbn1cbiIsICJpbXBvcnQgeyBfZGVmYXVsdHMgfSBmcm9tICcuL2RlZmF1bHRzLnRzJztcbmltcG9ydCB7XG4gIHJ0cmltLFxuICBzcGxpdENlbGxzLFxuICBmaW5kQ2xvc2luZ0JyYWNrZXQsXG4gIGV4cGFuZFRhYnMsXG59IGZyb20gJy4vaGVscGVycy50cyc7XG5pbXBvcnQgdHlwZSB7IFJ1bGVzIH0gZnJvbSAnLi9ydWxlcy50cyc7XG5pbXBvcnQgdHlwZSB7IF9MZXhlciB9IGZyb20gJy4vTGV4ZXIudHMnO1xuaW1wb3J0IHR5cGUgeyBMaW5rcywgVG9rZW5zLCBUb2tlbiB9IGZyb20gJy4vVG9rZW5zLnRzJztcbmltcG9ydCB0eXBlIHsgTWFya2VkT3B0aW9ucyB9IGZyb20gJy4vTWFya2VkT3B0aW9ucy50cyc7XG5cbmZ1bmN0aW9uIG91dHB1dExpbmsoY2FwOiBzdHJpbmdbXSwgbGluazogUGljazxUb2tlbnMuTGluaywgJ2hyZWYnIHwgJ3RpdGxlJz4sIHJhdzogc3RyaW5nLCBsZXhlcjogX0xleGVyLCBydWxlczogUnVsZXMpOiBUb2tlbnMuTGluayB8IFRva2Vucy5JbWFnZSB7XG4gIGNvbnN0IGhyZWYgPSBsaW5rLmhyZWY7XG4gIGNvbnN0IHRpdGxlID0gbGluay50aXRsZSB8fCBudWxsO1xuICBjb25zdCB0ZXh0ID0gY2FwWzFdLnJlcGxhY2UocnVsZXMub3RoZXIub3V0cHV0TGlua1JlcGxhY2UsICckMScpO1xuXG4gIGxleGVyLnN0YXRlLmluTGluayA9IHRydWU7XG4gIGNvbnN0IHRva2VuOiBUb2tlbnMuTGluayB8IFRva2Vucy5JbWFnZSA9IHtcbiAgICB0eXBlOiBjYXBbMF0uY2hhckF0KDApID09PSAnIScgPyAnaW1hZ2UnIDogJ2xpbmsnLFxuICAgIHJhdyxcbiAgICBocmVmLFxuICAgIHRpdGxlLFxuICAgIHRleHQsXG4gICAgdG9rZW5zOiBsZXhlci5pbmxpbmVUb2tlbnModGV4dCksXG4gIH07XG4gIGxleGVyLnN0YXRlLmluTGluayA9IGZhbHNlO1xuICByZXR1cm4gdG9rZW47XG59XG5cbmZ1bmN0aW9uIGluZGVudENvZGVDb21wZW5zYXRpb24ocmF3OiBzdHJpbmcsIHRleHQ6IHN0cmluZywgcnVsZXM6IFJ1bGVzKSB7XG4gIGNvbnN0IG1hdGNoSW5kZW50VG9Db2RlID0gcmF3Lm1hdGNoKHJ1bGVzLm90aGVyLmluZGVudENvZGVDb21wZW5zYXRpb24pO1xuXG4gIGlmIChtYXRjaEluZGVudFRvQ29kZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiB0ZXh0O1xuICB9XG5cbiAgY29uc3QgaW5kZW50VG9Db2RlID0gbWF0Y2hJbmRlbnRUb0NvZGVbMV07XG5cbiAgcmV0dXJuIHRleHRcbiAgICAuc3BsaXQoJ1xcbicpXG4gICAgLm1hcChub2RlID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoSW5kZW50SW5Ob2RlID0gbm9kZS5tYXRjaChydWxlcy5vdGhlci5iZWdpbm5pbmdTcGFjZSk7XG4gICAgICBpZiAobWF0Y2hJbmRlbnRJbk5vZGUgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IFtpbmRlbnRJbk5vZGVdID0gbWF0Y2hJbmRlbnRJbk5vZGU7XG5cbiAgICAgIGlmIChpbmRlbnRJbk5vZGUubGVuZ3RoID49IGluZGVudFRvQ29kZS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUuc2xpY2UoaW5kZW50VG9Db2RlLmxlbmd0aCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBub2RlO1xuICAgIH0pXG4gICAgLmpvaW4oJ1xcbicpO1xufVxuXG4vKipcbiAqIFRva2VuaXplclxuICovXG5leHBvcnQgY2xhc3MgX1Rva2VuaXplcjxQYXJzZXJPdXRwdXQgPSBzdHJpbmcsIFJlbmRlcmVyT3V0cHV0ID0gc3RyaW5nPiB7XG4gIG9wdGlvbnM6IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD47XG4gIHJ1bGVzITogUnVsZXM7IC8vIHNldCBieSB0aGUgbGV4ZXJcbiAgbGV4ZXIhOiBfTGV4ZXI8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD47IC8vIHNldCBieSB0aGUgbGV4ZXJcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zPzogTWFya2VkT3B0aW9uczxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0Pikge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwgX2RlZmF1bHRzO1xuICB9XG5cbiAgc3BhY2Uoc3JjOiBzdHJpbmcpOiBUb2tlbnMuU3BhY2UgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuYmxvY2submV3bGluZS5leGVjKHNyYyk7XG4gICAgaWYgKGNhcCAmJiBjYXBbMF0ubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ3NwYWNlJyxcbiAgICAgICAgcmF3OiBjYXBbMF0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGNvZGUoc3JjOiBzdHJpbmcpOiBUb2tlbnMuQ29kZSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5ibG9jay5jb2RlLmV4ZWMoc3JjKTtcbiAgICBpZiAoY2FwKSB7XG4gICAgICBjb25zdCB0ZXh0ID0gY2FwWzBdLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5jb2RlUmVtb3ZlSW5kZW50LCAnJyk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAnY29kZScsXG4gICAgICAgIHJhdzogY2FwWzBdLFxuICAgICAgICBjb2RlQmxvY2tTdHlsZTogJ2luZGVudGVkJyxcbiAgICAgICAgdGV4dDogIXRoaXMub3B0aW9ucy5wZWRhbnRpY1xuICAgICAgICAgID8gcnRyaW0odGV4dCwgJ1xcbicpXG4gICAgICAgICAgOiB0ZXh0LFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBmZW5jZXMoc3JjOiBzdHJpbmcpOiBUb2tlbnMuQ29kZSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5ibG9jay5mZW5jZXMuZXhlYyhzcmMpO1xuICAgIGlmIChjYXApIHtcbiAgICAgIGNvbnN0IHJhdyA9IGNhcFswXTtcbiAgICAgIGNvbnN0IHRleHQgPSBpbmRlbnRDb2RlQ29tcGVuc2F0aW9uKHJhdywgY2FwWzNdIHx8ICcnLCB0aGlzLnJ1bGVzKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ2NvZGUnLFxuICAgICAgICByYXcsXG4gICAgICAgIGxhbmc6IGNhcFsyXSA/IGNhcFsyXS50cmltKCkucmVwbGFjZSh0aGlzLnJ1bGVzLmlubGluZS5hbnlQdW5jdHVhdGlvbiwgJyQxJykgOiBjYXBbMl0sXG4gICAgICAgIHRleHQsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGhlYWRpbmcoc3JjOiBzdHJpbmcpOiBUb2tlbnMuSGVhZGluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5ibG9jay5oZWFkaW5nLmV4ZWMoc3JjKTtcbiAgICBpZiAoY2FwKSB7XG4gICAgICBsZXQgdGV4dCA9IGNhcFsyXS50cmltKCk7XG5cbiAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyAjc1xuICAgICAgaWYgKHRoaXMucnVsZXMub3RoZXIuZW5kaW5nSGFzaC50ZXN0KHRleHQpKSB7XG4gICAgICAgIGNvbnN0IHRyaW1tZWQgPSBydHJpbSh0ZXh0LCAnIycpO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnBlZGFudGljKSB7XG4gICAgICAgICAgdGV4dCA9IHRyaW1tZWQudHJpbSgpO1xuICAgICAgICB9IGVsc2UgaWYgKCF0cmltbWVkIHx8IHRoaXMucnVsZXMub3RoZXIuZW5kaW5nU3BhY2VDaGFyLnRlc3QodHJpbW1lZCkpIHtcbiAgICAgICAgICAvLyBDb21tb25NYXJrIHJlcXVpcmVzIHNwYWNlIGJlZm9yZSB0cmFpbGluZyAjc1xuICAgICAgICAgIHRleHQgPSB0cmltbWVkLnRyaW0oKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAnaGVhZGluZycsXG4gICAgICAgIHJhdzogY2FwWzBdLFxuICAgICAgICBkZXB0aDogY2FwWzFdLmxlbmd0aCxcbiAgICAgICAgdGV4dCxcbiAgICAgICAgdG9rZW5zOiB0aGlzLmxleGVyLmlubGluZSh0ZXh0KSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgaHIoc3JjOiBzdHJpbmcpOiBUb2tlbnMuSHIgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuYmxvY2suaHIuZXhlYyhzcmMpO1xuICAgIGlmIChjYXApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdocicsXG4gICAgICAgIHJhdzogcnRyaW0oY2FwWzBdLCAnXFxuJyksXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGJsb2NrcXVvdGUoc3JjOiBzdHJpbmcpOiBUb2tlbnMuQmxvY2txdW90ZSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5ibG9jay5ibG9ja3F1b3RlLmV4ZWMoc3JjKTtcbiAgICBpZiAoY2FwKSB7XG4gICAgICBsZXQgbGluZXMgPSBydHJpbShjYXBbMF0sICdcXG4nKS5zcGxpdCgnXFxuJyk7XG4gICAgICBsZXQgcmF3ID0gJyc7XG4gICAgICBsZXQgdGV4dCA9ICcnO1xuICAgICAgY29uc3QgdG9rZW5zOiBUb2tlbltdID0gW107XG5cbiAgICAgIHdoaWxlIChsaW5lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxldCBpbkJsb2NrcXVvdGUgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgY3VycmVudExpbmVzID0gW107XG5cbiAgICAgICAgbGV0IGk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIC8vIGdldCBsaW5lcyB1cCB0byBhIGNvbnRpbnVhdGlvblxuICAgICAgICAgIGlmICh0aGlzLnJ1bGVzLm90aGVyLmJsb2NrcXVvdGVTdGFydC50ZXN0KGxpbmVzW2ldKSkge1xuICAgICAgICAgICAgY3VycmVudExpbmVzLnB1c2gobGluZXNbaV0pO1xuICAgICAgICAgICAgaW5CbG9ja3F1b3RlID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCFpbkJsb2NrcXVvdGUpIHtcbiAgICAgICAgICAgIGN1cnJlbnRMaW5lcy5wdXNoKGxpbmVzW2ldKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxpbmVzID0gbGluZXMuc2xpY2UoaSk7XG5cbiAgICAgICAgY29uc3QgY3VycmVudFJhdyA9IGN1cnJlbnRMaW5lcy5qb2luKCdcXG4nKTtcbiAgICAgICAgY29uc3QgY3VycmVudFRleHQgPSBjdXJyZW50UmF3XG4gICAgICAgICAgLy8gcHJlY2VkZSBzZXRleHQgY29udGludWF0aW9uIHdpdGggNCBzcGFjZXMgc28gaXQgaXNuJ3QgYSBzZXRleHRcbiAgICAgICAgICAucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLmJsb2NrcXVvdGVTZXRleHRSZXBsYWNlLCAnXFxuICAgICQxJylcbiAgICAgICAgICAucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLmJsb2NrcXVvdGVTZXRleHRSZXBsYWNlMiwgJycpO1xuICAgICAgICByYXcgPSByYXcgPyBgJHtyYXd9XFxuJHtjdXJyZW50UmF3fWAgOiBjdXJyZW50UmF3O1xuICAgICAgICB0ZXh0ID0gdGV4dCA/IGAke3RleHR9XFxuJHtjdXJyZW50VGV4dH1gIDogY3VycmVudFRleHQ7XG5cbiAgICAgICAgLy8gcGFyc2UgYmxvY2txdW90ZSBsaW5lcyBhcyB0b3AgbGV2ZWwgdG9rZW5zXG4gICAgICAgIC8vIG1lcmdlIHBhcmFncmFwaHMgaWYgdGhpcyBpcyBhIGNvbnRpbnVhdGlvblxuICAgICAgICBjb25zdCB0b3AgPSB0aGlzLmxleGVyLnN0YXRlLnRvcDtcbiAgICAgICAgdGhpcy5sZXhlci5zdGF0ZS50b3AgPSB0cnVlO1xuICAgICAgICB0aGlzLmxleGVyLmJsb2NrVG9rZW5zKGN1cnJlbnRUZXh0LCB0b2tlbnMsIHRydWUpO1xuICAgICAgICB0aGlzLmxleGVyLnN0YXRlLnRvcCA9IHRvcDtcblxuICAgICAgICAvLyBpZiB0aGVyZSBpcyBubyBjb250aW51YXRpb24gdGhlbiB3ZSBhcmUgZG9uZVxuICAgICAgICBpZiAobGluZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsYXN0VG9rZW4gPSB0b2tlbnMuYXQoLTEpO1xuXG4gICAgICAgIGlmIChsYXN0VG9rZW4/LnR5cGUgPT09ICdjb2RlJykge1xuICAgICAgICAgIC8vIGJsb2NrcXVvdGUgY29udGludWF0aW9uIGNhbm5vdCBiZSBwcmVjZWRlZCBieSBhIGNvZGUgYmxvY2tcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBlbHNlIGlmIChsYXN0VG9rZW4/LnR5cGUgPT09ICdibG9ja3F1b3RlJykge1xuICAgICAgICAgIC8vIGluY2x1ZGUgY29udGludWF0aW9uIGluIG5lc3RlZCBibG9ja3F1b3RlXG4gICAgICAgICAgY29uc3Qgb2xkVG9rZW4gPSBsYXN0VG9rZW4gYXMgVG9rZW5zLkJsb2NrcXVvdGU7XG4gICAgICAgICAgY29uc3QgbmV3VGV4dCA9IG9sZFRva2VuLnJhdyArICdcXG4nICsgbGluZXMuam9pbignXFxuJyk7XG4gICAgICAgICAgY29uc3QgbmV3VG9rZW4gPSB0aGlzLmJsb2NrcXVvdGUobmV3VGV4dCkhO1xuICAgICAgICAgIHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV0gPSBuZXdUb2tlbjtcblxuICAgICAgICAgIHJhdyA9IHJhdy5zdWJzdHJpbmcoMCwgcmF3Lmxlbmd0aCAtIG9sZFRva2VuLnJhdy5sZW5ndGgpICsgbmV3VG9rZW4ucmF3O1xuICAgICAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cmluZygwLCB0ZXh0Lmxlbmd0aCAtIG9sZFRva2VuLnRleHQubGVuZ3RoKSArIG5ld1Rva2VuLnRleHQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSBpZiAobGFzdFRva2VuPy50eXBlID09PSAnbGlzdCcpIHtcbiAgICAgICAgICAvLyBpbmNsdWRlIGNvbnRpbnVhdGlvbiBpbiBuZXN0ZWQgbGlzdFxuICAgICAgICAgIGNvbnN0IG9sZFRva2VuID0gbGFzdFRva2VuIGFzIFRva2Vucy5MaXN0O1xuICAgICAgICAgIGNvbnN0IG5ld1RleHQgPSBvbGRUb2tlbi5yYXcgKyAnXFxuJyArIGxpbmVzLmpvaW4oJ1xcbicpO1xuICAgICAgICAgIGNvbnN0IG5ld1Rva2VuID0gdGhpcy5saXN0KG5ld1RleHQpITtcbiAgICAgICAgICB0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdID0gbmV3VG9rZW47XG5cbiAgICAgICAgICByYXcgPSByYXcuc3Vic3RyaW5nKDAsIHJhdy5sZW5ndGggLSBsYXN0VG9rZW4ucmF3Lmxlbmd0aCkgKyBuZXdUb2tlbi5yYXc7XG4gICAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIHRleHQubGVuZ3RoIC0gb2xkVG9rZW4ucmF3Lmxlbmd0aCkgKyBuZXdUb2tlbi5yYXc7XG4gICAgICAgICAgbGluZXMgPSBuZXdUZXh0LnN1YnN0cmluZyh0b2tlbnMuYXQoLTEpIS5yYXcubGVuZ3RoKS5zcGxpdCgnXFxuJyk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ2Jsb2NrcXVvdGUnLFxuICAgICAgICByYXcsXG4gICAgICAgIHRva2VucyxcbiAgICAgICAgdGV4dCxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgbGlzdChzcmM6IHN0cmluZyk6IFRva2Vucy5MaXN0IHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgY2FwID0gdGhpcy5ydWxlcy5ibG9jay5saXN0LmV4ZWMoc3JjKTtcbiAgICBpZiAoY2FwKSB7XG4gICAgICBsZXQgYnVsbCA9IGNhcFsxXS50cmltKCk7XG4gICAgICBjb25zdCBpc29yZGVyZWQgPSBidWxsLmxlbmd0aCA+IDE7XG5cbiAgICAgIGNvbnN0IGxpc3Q6IFRva2Vucy5MaXN0ID0ge1xuICAgICAgICB0eXBlOiAnbGlzdCcsXG4gICAgICAgIHJhdzogJycsXG4gICAgICAgIG9yZGVyZWQ6IGlzb3JkZXJlZCxcbiAgICAgICAgc3RhcnQ6IGlzb3JkZXJlZCA/ICtidWxsLnNsaWNlKDAsIC0xKSA6ICcnLFxuICAgICAgICBsb29zZTogZmFsc2UsXG4gICAgICAgIGl0ZW1zOiBbXSxcbiAgICAgIH07XG5cbiAgICAgIGJ1bGwgPSBpc29yZGVyZWQgPyBgXFxcXGR7MSw5fVxcXFwke2J1bGwuc2xpY2UoLTEpfWAgOiBgXFxcXCR7YnVsbH1gO1xuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLnBlZGFudGljKSB7XG4gICAgICAgIGJ1bGwgPSBpc29yZGVyZWQgPyBidWxsIDogJ1sqKy1dJztcbiAgICAgIH1cblxuICAgICAgLy8gR2V0IG5leHQgbGlzdCBpdGVtXG4gICAgICBjb25zdCBpdGVtUmVnZXggPSB0aGlzLnJ1bGVzLm90aGVyLmxpc3RJdGVtUmVnZXgoYnVsbCk7XG4gICAgICBsZXQgZW5kc1dpdGhCbGFua0xpbmUgPSBmYWxzZTtcbiAgICAgIC8vIENoZWNrIGlmIGN1cnJlbnQgYnVsbGV0IHBvaW50IGNhbiBzdGFydCBhIG5ldyBMaXN0IEl0ZW1cbiAgICAgIHdoaWxlIChzcmMpIHtcbiAgICAgICAgbGV0IGVuZEVhcmx5ID0gZmFsc2U7XG4gICAgICAgIGxldCByYXcgPSAnJztcbiAgICAgICAgbGV0IGl0ZW1Db250ZW50cyA9ICcnO1xuICAgICAgICBpZiAoIShjYXAgPSBpdGVtUmVnZXguZXhlYyhzcmMpKSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucnVsZXMuYmxvY2suaHIudGVzdChzcmMpKSB7IC8vIEVuZCBsaXN0IGlmIGJ1bGxldCB3YXMgYWN0dWFsbHkgSFIgKHBvc3NpYmx5IG1vdmUgaW50byBpdGVtUmVnZXg/KVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmF3ID0gY2FwWzBdO1xuICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHJhdy5sZW5ndGgpO1xuXG4gICAgICAgIGxldCBsaW5lID0gZXhwYW5kVGFicyhjYXBbMl0uc3BsaXQoJ1xcbicsIDEpWzBdLCBjYXBbMV0ubGVuZ3RoKTtcbiAgICAgICAgbGV0IG5leHRMaW5lID0gc3JjLnNwbGl0KCdcXG4nLCAxKVswXTtcbiAgICAgICAgbGV0IGJsYW5rTGluZSA9ICFsaW5lLnRyaW0oKTtcblxuICAgICAgICBsZXQgaW5kZW50ID0gMDtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5wZWRhbnRpYykge1xuICAgICAgICAgIGluZGVudCA9IDI7XG4gICAgICAgICAgaXRlbUNvbnRlbnRzID0gbGluZS50cmltU3RhcnQoKTtcbiAgICAgICAgfSBlbHNlIGlmIChibGFua0xpbmUpIHtcbiAgICAgICAgICBpbmRlbnQgPSBjYXBbMV0ubGVuZ3RoICsgMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpbmRlbnQgPSBsaW5lLnNlYXJjaCh0aGlzLnJ1bGVzLm90aGVyLm5vblNwYWNlQ2hhcik7IC8vIEZpbmQgZmlyc3Qgbm9uLXNwYWNlIGNoYXJcbiAgICAgICAgICBpbmRlbnQgPSBpbmRlbnQgPiA0ID8gMSA6IGluZGVudDsgLy8gVHJlYXQgaW5kZW50ZWQgY29kZSBibG9ja3MgKD4gNCBzcGFjZXMpIGFzIGhhdmluZyBvbmx5IDEgaW5kZW50XG4gICAgICAgICAgaXRlbUNvbnRlbnRzID0gbGluZS5zbGljZShpbmRlbnQpO1xuICAgICAgICAgIGluZGVudCArPSBjYXBbMV0ubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJsYW5rTGluZSAmJiB0aGlzLnJ1bGVzLm90aGVyLmJsYW5rTGluZS50ZXN0KG5leHRMaW5lKSkgeyAvLyBJdGVtcyBiZWdpbiB3aXRoIGF0IG1vc3Qgb25lIGJsYW5rIGxpbmVcbiAgICAgICAgICByYXcgKz0gbmV4dExpbmUgKyAnXFxuJztcbiAgICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKG5leHRMaW5lLmxlbmd0aCArIDEpO1xuICAgICAgICAgIGVuZEVhcmx5ID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZW5kRWFybHkpIHtcbiAgICAgICAgICBjb25zdCBuZXh0QnVsbGV0UmVnZXggPSB0aGlzLnJ1bGVzLm90aGVyLm5leHRCdWxsZXRSZWdleChpbmRlbnQpO1xuICAgICAgICAgIGNvbnN0IGhyUmVnZXggPSB0aGlzLnJ1bGVzLm90aGVyLmhyUmVnZXgoaW5kZW50KTtcbiAgICAgICAgICBjb25zdCBmZW5jZXNCZWdpblJlZ2V4ID0gdGhpcy5ydWxlcy5vdGhlci5mZW5jZXNCZWdpblJlZ2V4KGluZGVudCk7XG4gICAgICAgICAgY29uc3QgaGVhZGluZ0JlZ2luUmVnZXggPSB0aGlzLnJ1bGVzLm90aGVyLmhlYWRpbmdCZWdpblJlZ2V4KGluZGVudCk7XG4gICAgICAgICAgY29uc3QgaHRtbEJlZ2luUmVnZXggPSB0aGlzLnJ1bGVzLm90aGVyLmh0bWxCZWdpblJlZ2V4KGluZGVudCk7XG4gICAgICAgICAgY29uc3QgYmxvY2txdW90ZUJlZ2luUmVnZXggPSB0aGlzLnJ1bGVzLm90aGVyLmJsb2NrcXVvdGVCZWdpblJlZ2V4KGluZGVudCk7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiBmb2xsb3dpbmcgbGluZXMgc2hvdWxkIGJlIGluY2x1ZGVkIGluIExpc3QgSXRlbVxuICAgICAgICAgIHdoaWxlIChzcmMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJhd0xpbmUgPSBzcmMuc3BsaXQoJ1xcbicsIDEpWzBdO1xuICAgICAgICAgICAgbGV0IG5leHRMaW5lV2l0aG91dFRhYnM7XG4gICAgICAgICAgICBuZXh0TGluZSA9IHJhd0xpbmU7XG5cbiAgICAgICAgICAgIC8vIFJlLWFsaWduIHRvIGZvbGxvdyBjb21tb25tYXJrIG5lc3RpbmcgcnVsZXNcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucGVkYW50aWMpIHtcbiAgICAgICAgICAgICAgbmV4dExpbmUgPSBuZXh0TGluZS5yZXBsYWNlKHRoaXMucnVsZXMub3RoZXIubGlzdFJlcGxhY2VOZXN0aW5nLCAnICAnKTtcbiAgICAgICAgICAgICAgbmV4dExpbmVXaXRob3V0VGFicyA9IG5leHRMaW5lO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbmV4dExpbmVXaXRob3V0VGFicyA9IG5leHRMaW5lLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci50YWJDaGFyR2xvYmFsLCAnICAgICcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBFbmQgbGlzdCBpdGVtIGlmIGZvdW5kIGNvZGUgZmVuY2VzXG4gICAgICAgICAgICBpZiAoZmVuY2VzQmVnaW5SZWdleC50ZXN0KG5leHRMaW5lKSkge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRW5kIGxpc3QgaXRlbSBpZiBmb3VuZCBzdGFydCBvZiBuZXcgaGVhZGluZ1xuICAgICAgICAgICAgaWYgKGhlYWRpbmdCZWdpblJlZ2V4LnRlc3QobmV4dExpbmUpKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBFbmQgbGlzdCBpdGVtIGlmIGZvdW5kIHN0YXJ0IG9mIGh0bWwgYmxvY2tcbiAgICAgICAgICAgIGlmIChodG1sQmVnaW5SZWdleC50ZXN0KG5leHRMaW5lKSkge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRW5kIGxpc3QgaXRlbSBpZiBmb3VuZCBzdGFydCBvZiBibG9ja3F1b3RlXG4gICAgICAgICAgICBpZiAoYmxvY2txdW90ZUJlZ2luUmVnZXgudGVzdChuZXh0TGluZSkpIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEVuZCBsaXN0IGl0ZW0gaWYgZm91bmQgc3RhcnQgb2YgbmV3IGJ1bGxldFxuICAgICAgICAgICAgaWYgKG5leHRCdWxsZXRSZWdleC50ZXN0KG5leHRMaW5lKSkge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSG9yaXpvbnRhbCBydWxlIGZvdW5kXG4gICAgICAgICAgICBpZiAoaHJSZWdleC50ZXN0KG5leHRMaW5lKSkge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG5leHRMaW5lV2l0aG91dFRhYnMuc2VhcmNoKHRoaXMucnVsZXMub3RoZXIubm9uU3BhY2VDaGFyKSA+PSBpbmRlbnQgfHwgIW5leHRMaW5lLnRyaW0oKSkgeyAvLyBEZWRlbnQgaWYgcG9zc2libGVcbiAgICAgICAgICAgICAgaXRlbUNvbnRlbnRzICs9ICdcXG4nICsgbmV4dExpbmVXaXRob3V0VGFicy5zbGljZShpbmRlbnQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gbm90IGVub3VnaCBpbmRlbnRhdGlvblxuICAgICAgICAgICAgICBpZiAoYmxhbmtMaW5lKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBwYXJhZ3JhcGggY29udGludWF0aW9uIHVubGVzcyBsYXN0IGxpbmUgd2FzIGEgZGlmZmVyZW50IGJsb2NrIGxldmVsIGVsZW1lbnRcbiAgICAgICAgICAgICAgaWYgKGxpbmUucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLnRhYkNoYXJHbG9iYWwsICcgICAgJykuc2VhcmNoKHRoaXMucnVsZXMub3RoZXIubm9uU3BhY2VDaGFyKSA+PSA0KSB7IC8vIGluZGVudGVkIGNvZGUgYmxvY2tcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoZmVuY2VzQmVnaW5SZWdleC50ZXN0KGxpbmUpKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGhlYWRpbmdCZWdpblJlZ2V4LnRlc3QobGluZSkpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoaHJSZWdleC50ZXN0KGxpbmUpKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpdGVtQ29udGVudHMgKz0gJ1xcbicgKyBuZXh0TGluZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYmxhbmtMaW5lID0gIW5leHRMaW5lLnRyaW0oKTtcblxuICAgICAgICAgICAgcmF3ICs9IHJhd0xpbmUgKyAnXFxuJztcbiAgICAgICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcocmF3TGluZS5sZW5ndGggKyAxKTtcbiAgICAgICAgICAgIGxpbmUgPSBuZXh0TGluZVdpdGhvdXRUYWJzLnNsaWNlKGluZGVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFsaXN0Lmxvb3NlKSB7XG4gICAgICAgICAgLy8gSWYgdGhlIHByZXZpb3VzIGl0ZW0gZW5kZWQgd2l0aCBhIGJsYW5rIGxpbmUsIHRoZSBsaXN0IGlzIGxvb3NlXG4gICAgICAgICAgaWYgKGVuZHNXaXRoQmxhbmtMaW5lKSB7XG4gICAgICAgICAgICBsaXN0Lmxvb3NlID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucnVsZXMub3RoZXIuZG91YmxlQmxhbmtMaW5lLnRlc3QocmF3KSkge1xuICAgICAgICAgICAgZW5kc1dpdGhCbGFua0xpbmUgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxpc3QuaXRlbXMucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ2xpc3RfaXRlbScsXG4gICAgICAgICAgcmF3LFxuICAgICAgICAgIHRhc2s6ICEhdGhpcy5vcHRpb25zLmdmbSAmJiB0aGlzLnJ1bGVzLm90aGVyLmxpc3RJc1Rhc2sudGVzdChpdGVtQ29udGVudHMpLFxuICAgICAgICAgIGxvb3NlOiBmYWxzZSxcbiAgICAgICAgICB0ZXh0OiBpdGVtQ29udGVudHMsXG4gICAgICAgICAgdG9rZW5zOiBbXSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgbGlzdC5yYXcgKz0gcmF3O1xuICAgICAgfVxuXG4gICAgICAvLyBEbyBub3QgY29uc3VtZSBuZXdsaW5lcyBhdCBlbmQgb2YgZmluYWwgaXRlbS4gQWx0ZXJuYXRpdmVseSwgbWFrZSBpdGVtUmVnZXggKnN0YXJ0KiB3aXRoIGFueSBuZXdsaW5lcyB0byBzaW1wbGlmeS9zcGVlZCB1cCBlbmRzV2l0aEJsYW5rTGluZSBsb2dpY1xuICAgICAgY29uc3QgbGFzdEl0ZW0gPSBsaXN0Lml0ZW1zLmF0KC0xKTtcbiAgICAgIGlmIChsYXN0SXRlbSkge1xuICAgICAgICBsYXN0SXRlbS5yYXcgPSBsYXN0SXRlbS5yYXcudHJpbUVuZCgpO1xuICAgICAgICBsYXN0SXRlbS50ZXh0ID0gbGFzdEl0ZW0udGV4dC50cmltRW5kKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBub3QgYSBsaXN0IHNpbmNlIHRoZXJlIHdlcmUgbm8gaXRlbXNcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbGlzdC5yYXcgPSBsaXN0LnJhdy50cmltRW5kKCk7XG5cbiAgICAgIC8vIEl0ZW0gY2hpbGQgdG9rZW5zIGhhbmRsZWQgaGVyZSBhdCBlbmQgYmVjYXVzZSB3ZSBuZWVkZWQgdG8gaGF2ZSB0aGUgZmluYWwgaXRlbSB0byB0cmltIGl0IGZpcnN0XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbGlzdC5pdGVtcykge1xuICAgICAgICB0aGlzLmxleGVyLnN0YXRlLnRvcCA9IGZhbHNlO1xuICAgICAgICBpdGVtLnRva2VucyA9IHRoaXMubGV4ZXIuYmxvY2tUb2tlbnMoaXRlbS50ZXh0LCBbXSk7XG4gICAgICAgIGlmIChpdGVtLnRhc2spIHtcbiAgICAgICAgICAvLyBSZW1vdmUgY2hlY2tib3ggbWFya2Rvd24gZnJvbSBpdGVtIHRva2Vuc1xuICAgICAgICAgIGl0ZW0udGV4dCA9IGl0ZW0udGV4dC5yZXBsYWNlKHRoaXMucnVsZXMub3RoZXIubGlzdFJlcGxhY2VUYXNrLCAnJyk7XG4gICAgICAgICAgaWYgKGl0ZW0udG9rZW5zWzBdPy50eXBlID09PSAndGV4dCcgfHwgaXRlbS50b2tlbnNbMF0/LnR5cGUgPT09ICdwYXJhZ3JhcGgnKSB7XG4gICAgICAgICAgICBpdGVtLnRva2Vuc1swXS5yYXcgPSBpdGVtLnRva2Vuc1swXS5yYXcucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLmxpc3RSZXBsYWNlVGFzaywgJycpO1xuICAgICAgICAgICAgaXRlbS50b2tlbnNbMF0udGV4dCA9IGl0ZW0udG9rZW5zWzBdLnRleHQucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLmxpc3RSZXBsYWNlVGFzaywgJycpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMubGV4ZXIuaW5saW5lUXVldWUubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMucnVsZXMub3RoZXIubGlzdElzVGFzay50ZXN0KHRoaXMubGV4ZXIuaW5saW5lUXVldWVbaV0uc3JjKSkge1xuICAgICAgICAgICAgICAgIHRoaXMubGV4ZXIuaW5saW5lUXVldWVbaV0uc3JjID0gdGhpcy5sZXhlci5pbmxpbmVRdWV1ZVtpXS5zcmMucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLmxpc3RSZXBsYWNlVGFzaywgJycpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgdGFza1JhdyA9IHRoaXMucnVsZXMub3RoZXIubGlzdFRhc2tDaGVja2JveC5leGVjKGl0ZW0ucmF3KTtcbiAgICAgICAgICBpZiAodGFza1Jhdykge1xuICAgICAgICAgICAgY29uc3QgY2hlY2tib3hUb2tlbjogVG9rZW5zLkNoZWNrYm94ID0ge1xuICAgICAgICAgICAgICB0eXBlOiAnY2hlY2tib3gnLFxuICAgICAgICAgICAgICByYXc6IHRhc2tSYXdbMF0gKyAnICcsXG4gICAgICAgICAgICAgIGNoZWNrZWQ6IHRhc2tSYXdbMF0gIT09ICdbIF0nLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGl0ZW0uY2hlY2tlZCA9IGNoZWNrYm94VG9rZW4uY2hlY2tlZDtcbiAgICAgICAgICAgIGlmIChsaXN0Lmxvb3NlKSB7XG4gICAgICAgICAgICAgIGlmIChpdGVtLnRva2Vuc1swXSAmJiBbJ3BhcmFncmFwaCcsICd0ZXh0J10uaW5jbHVkZXMoaXRlbS50b2tlbnNbMF0udHlwZSkgJiYgJ3Rva2VucycgaW4gaXRlbS50b2tlbnNbMF0gJiYgaXRlbS50b2tlbnNbMF0udG9rZW5zKSB7XG4gICAgICAgICAgICAgICAgaXRlbS50b2tlbnNbMF0ucmF3ID0gY2hlY2tib3hUb2tlbi5yYXcgKyBpdGVtLnRva2Vuc1swXS5yYXc7XG4gICAgICAgICAgICAgICAgaXRlbS50b2tlbnNbMF0udGV4dCA9IGNoZWNrYm94VG9rZW4ucmF3ICsgaXRlbS50b2tlbnNbMF0udGV4dDtcbiAgICAgICAgICAgICAgICBpdGVtLnRva2Vuc1swXS50b2tlbnMudW5zaGlmdChjaGVja2JveFRva2VuKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpdGVtLnRva2Vucy51bnNoaWZ0KHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6ICdwYXJhZ3JhcGgnLFxuICAgICAgICAgICAgICAgICAgcmF3OiBjaGVja2JveFRva2VuLnJhdyxcbiAgICAgICAgICAgICAgICAgIHRleHQ6IGNoZWNrYm94VG9rZW4ucmF3LFxuICAgICAgICAgICAgICAgICAgdG9rZW5zOiBbY2hlY2tib3hUb2tlbl0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGl0ZW0udG9rZW5zLnVuc2hpZnQoY2hlY2tib3hUb2tlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFsaXN0Lmxvb3NlKSB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgbGlzdCBzaG91bGQgYmUgbG9vc2VcbiAgICAgICAgICBjb25zdCBzcGFjZXJzID0gaXRlbS50b2tlbnMuZmlsdGVyKHQgPT4gdC50eXBlID09PSAnc3BhY2UnKTtcbiAgICAgICAgICBjb25zdCBoYXNNdWx0aXBsZUxpbmVCcmVha3MgPSBzcGFjZXJzLmxlbmd0aCA+IDAgJiYgc3BhY2Vycy5zb21lKHQgPT4gdGhpcy5ydWxlcy5vdGhlci5hbnlMaW5lLnRlc3QodC5yYXcpKTtcblxuICAgICAgICAgIGxpc3QubG9vc2UgPSBoYXNNdWx0aXBsZUxpbmVCcmVha3M7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU2V0IGFsbCBpdGVtcyB0byBsb29zZSBpZiBsaXN0IGlzIGxvb3NlXG4gICAgICBpZiAobGlzdC5sb29zZSkge1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbGlzdC5pdGVtcykge1xuICAgICAgICAgIGl0ZW0ubG9vc2UgPSB0cnVlO1xuICAgICAgICAgIGZvciAoY29uc3QgdG9rZW4gb2YgaXRlbS50b2tlbnMpIHtcbiAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgICAgICAgdG9rZW4udHlwZSA9ICdwYXJhZ3JhcGgnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbGlzdDtcbiAgICB9XG4gIH1cblxuICBodG1sKHNyYzogc3RyaW5nKTogVG9rZW5zLkhUTUwgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuYmxvY2suaHRtbC5leGVjKHNyYyk7XG4gICAgaWYgKGNhcCkge1xuICAgICAgY29uc3QgdG9rZW46IFRva2Vucy5IVE1MID0ge1xuICAgICAgICB0eXBlOiAnaHRtbCcsXG4gICAgICAgIGJsb2NrOiB0cnVlLFxuICAgICAgICByYXc6IGNhcFswXSxcbiAgICAgICAgcHJlOiBjYXBbMV0gPT09ICdwcmUnIHx8IGNhcFsxXSA9PT0gJ3NjcmlwdCcgfHwgY2FwWzFdID09PSAnc3R5bGUnLFxuICAgICAgICB0ZXh0OiBjYXBbMF0sXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHRva2VuO1xuICAgIH1cbiAgfVxuXG4gIGRlZihzcmM6IHN0cmluZyk6IFRva2Vucy5EZWYgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuYmxvY2suZGVmLmV4ZWMoc3JjKTtcbiAgICBpZiAoY2FwKSB7XG4gICAgICBjb25zdCB0YWcgPSBjYXBbMV0udG9Mb3dlckNhc2UoKS5yZXBsYWNlKHRoaXMucnVsZXMub3RoZXIubXVsdGlwbGVTcGFjZUdsb2JhbCwgJyAnKTtcbiAgICAgIGNvbnN0IGhyZWYgPSBjYXBbMl0gPyBjYXBbMl0ucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLmhyZWZCcmFja2V0cywgJyQxJykucmVwbGFjZSh0aGlzLnJ1bGVzLmlubGluZS5hbnlQdW5jdHVhdGlvbiwgJyQxJykgOiAnJztcbiAgICAgIGNvbnN0IHRpdGxlID0gY2FwWzNdID8gY2FwWzNdLnN1YnN0cmluZygxLCBjYXBbM10ubGVuZ3RoIC0gMSkucmVwbGFjZSh0aGlzLnJ1bGVzLmlubGluZS5hbnlQdW5jdHVhdGlvbiwgJyQxJykgOiBjYXBbM107XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAnZGVmJyxcbiAgICAgICAgdGFnLFxuICAgICAgICByYXc6IGNhcFswXSxcbiAgICAgICAgaHJlZixcbiAgICAgICAgdGl0bGUsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHRhYmxlKHNyYzogc3RyaW5nKTogVG9rZW5zLlRhYmxlIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjYXAgPSB0aGlzLnJ1bGVzLmJsb2NrLnRhYmxlLmV4ZWMoc3JjKTtcbiAgICBpZiAoIWNhcCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5ydWxlcy5vdGhlci50YWJsZURlbGltaXRlci50ZXN0KGNhcFsyXSkpIHtcbiAgICAgIC8vIGRlbGltaXRlciByb3cgbXVzdCBoYXZlIGEgcGlwZSAofCkgb3IgY29sb24gKDopIG90aGVyd2lzZSBpdCBpcyBhIHNldGV4dCBoZWFkaW5nXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaGVhZGVycyA9IHNwbGl0Q2VsbHMoY2FwWzFdKTtcbiAgICBjb25zdCBhbGlnbnMgPSBjYXBbMl0ucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLnRhYmxlQWxpZ25DaGFycywgJycpLnNwbGl0KCd8Jyk7XG4gICAgY29uc3Qgcm93cyA9IGNhcFszXT8udHJpbSgpID8gY2FwWzNdLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci50YWJsZVJvd0JsYW5rTGluZSwgJycpLnNwbGl0KCdcXG4nKSA6IFtdO1xuXG4gICAgY29uc3QgaXRlbTogVG9rZW5zLlRhYmxlID0ge1xuICAgICAgdHlwZTogJ3RhYmxlJyxcbiAgICAgIHJhdzogY2FwWzBdLFxuICAgICAgaGVhZGVyOiBbXSxcbiAgICAgIGFsaWduOiBbXSxcbiAgICAgIHJvd3M6IFtdLFxuICAgIH07XG5cbiAgICBpZiAoaGVhZGVycy5sZW5ndGggIT09IGFsaWducy5sZW5ndGgpIHtcbiAgICAgIC8vIGhlYWRlciBhbmQgYWxpZ24gY29sdW1ucyBtdXN0IGJlIGVxdWFsLCByb3dzIGNhbiBiZSBkaWZmZXJlbnQuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBhbGlnbiBvZiBhbGlnbnMpIHtcbiAgICAgIGlmICh0aGlzLnJ1bGVzLm90aGVyLnRhYmxlQWxpZ25SaWdodC50ZXN0KGFsaWduKSkge1xuICAgICAgICBpdGVtLmFsaWduLnB1c2goJ3JpZ2h0Jyk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMucnVsZXMub3RoZXIudGFibGVBbGlnbkNlbnRlci50ZXN0KGFsaWduKSkge1xuICAgICAgICBpdGVtLmFsaWduLnB1c2goJ2NlbnRlcicpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnJ1bGVzLm90aGVyLnRhYmxlQWxpZ25MZWZ0LnRlc3QoYWxpZ24pKSB7XG4gICAgICAgIGl0ZW0uYWxpZ24ucHVzaCgnbGVmdCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXRlbS5hbGlnbi5wdXNoKG51bGwpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVhZGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgaXRlbS5oZWFkZXIucHVzaCh7XG4gICAgICAgIHRleHQ6IGhlYWRlcnNbaV0sXG4gICAgICAgIHRva2VuczogdGhpcy5sZXhlci5pbmxpbmUoaGVhZGVyc1tpXSksXG4gICAgICAgIGhlYWRlcjogdHJ1ZSxcbiAgICAgICAgYWxpZ246IGl0ZW0uYWxpZ25baV0sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICBpdGVtLnJvd3MucHVzaChzcGxpdENlbGxzKHJvdywgaXRlbS5oZWFkZXIubGVuZ3RoKS5tYXAoKGNlbGwsIGkpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0ZXh0OiBjZWxsLFxuICAgICAgICAgIHRva2VuczogdGhpcy5sZXhlci5pbmxpbmUoY2VsbCksXG4gICAgICAgICAgaGVhZGVyOiBmYWxzZSxcbiAgICAgICAgICBhbGlnbjogaXRlbS5hbGlnbltpXSxcbiAgICAgICAgfTtcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXRlbTtcbiAgfVxuXG4gIGxoZWFkaW5nKHNyYzogc3RyaW5nKTogVG9rZW5zLkhlYWRpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuYmxvY2subGhlYWRpbmcuZXhlYyhzcmMpO1xuICAgIGlmIChjYXApIHtcbiAgICAgIGNvbnN0IHRleHQgPSBjYXBbMV0udHJpbSgpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ2hlYWRpbmcnLFxuICAgICAgICByYXc6IGNhcFswXSxcbiAgICAgICAgZGVwdGg6IGNhcFsyXS5jaGFyQXQoMCkgPT09ICc9JyA/IDEgOiAyLFxuICAgICAgICB0ZXh0LFxuICAgICAgICB0b2tlbnM6IHRoaXMubGV4ZXIuaW5saW5lKHRleHQpLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBwYXJhZ3JhcGgoc3JjOiBzdHJpbmcpOiBUb2tlbnMuUGFyYWdyYXBoIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjYXAgPSB0aGlzLnJ1bGVzLmJsb2NrLnBhcmFncmFwaC5leGVjKHNyYyk7XG4gICAgaWYgKGNhcCkge1xuICAgICAgY29uc3QgdGV4dCA9IGNhcFsxXS5jaGFyQXQoY2FwWzFdLmxlbmd0aCAtIDEpID09PSAnXFxuJ1xuICAgICAgICA/IGNhcFsxXS5zbGljZSgwLCAtMSlcbiAgICAgICAgOiBjYXBbMV07XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAncGFyYWdyYXBoJyxcbiAgICAgICAgcmF3OiBjYXBbMF0sXG4gICAgICAgIHRleHQsXG4gICAgICAgIHRva2VuczogdGhpcy5sZXhlci5pbmxpbmUodGV4dCksXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHRleHQoc3JjOiBzdHJpbmcpOiBUb2tlbnMuVGV4dCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5ibG9jay50ZXh0LmV4ZWMoc3JjKTtcbiAgICBpZiAoY2FwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgIHJhdzogY2FwWzBdLFxuICAgICAgICB0ZXh0OiBjYXBbMF0sXG4gICAgICAgIHRva2VuczogdGhpcy5sZXhlci5pbmxpbmUoY2FwWzBdKSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgZXNjYXBlKHNyYzogc3RyaW5nKTogVG9rZW5zLkVzY2FwZSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5pbmxpbmUuZXNjYXBlLmV4ZWMoc3JjKTtcbiAgICBpZiAoY2FwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAnZXNjYXBlJyxcbiAgICAgICAgcmF3OiBjYXBbMF0sXG4gICAgICAgIHRleHQ6IGNhcFsxXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgdGFnKHNyYzogc3RyaW5nKTogVG9rZW5zLlRhZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5pbmxpbmUudGFnLmV4ZWMoc3JjKTtcbiAgICBpZiAoY2FwKSB7XG4gICAgICBpZiAoIXRoaXMubGV4ZXIuc3RhdGUuaW5MaW5rICYmIHRoaXMucnVsZXMub3RoZXIuc3RhcnRBVGFnLnRlc3QoY2FwWzBdKSkge1xuICAgICAgICB0aGlzLmxleGVyLnN0YXRlLmluTGluayA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMubGV4ZXIuc3RhdGUuaW5MaW5rICYmIHRoaXMucnVsZXMub3RoZXIuZW5kQVRhZy50ZXN0KGNhcFswXSkpIHtcbiAgICAgICAgdGhpcy5sZXhlci5zdGF0ZS5pbkxpbmsgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5sZXhlci5zdGF0ZS5pblJhd0Jsb2NrICYmIHRoaXMucnVsZXMub3RoZXIuc3RhcnRQcmVTY3JpcHRUYWcudGVzdChjYXBbMF0pKSB7XG4gICAgICAgIHRoaXMubGV4ZXIuc3RhdGUuaW5SYXdCbG9jayA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMubGV4ZXIuc3RhdGUuaW5SYXdCbG9jayAmJiB0aGlzLnJ1bGVzLm90aGVyLmVuZFByZVNjcmlwdFRhZy50ZXN0KGNhcFswXSkpIHtcbiAgICAgICAgdGhpcy5sZXhlci5zdGF0ZS5pblJhd0Jsb2NrID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdodG1sJyxcbiAgICAgICAgcmF3OiBjYXBbMF0sXG4gICAgICAgIGluTGluazogdGhpcy5sZXhlci5zdGF0ZS5pbkxpbmssXG4gICAgICAgIGluUmF3QmxvY2s6IHRoaXMubGV4ZXIuc3RhdGUuaW5SYXdCbG9jayxcbiAgICAgICAgYmxvY2s6IGZhbHNlLFxuICAgICAgICB0ZXh0OiBjYXBbMF0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGxpbmsoc3JjOiBzdHJpbmcpOiBUb2tlbnMuTGluayB8IFRva2Vucy5JbWFnZSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5pbmxpbmUubGluay5leGVjKHNyYyk7XG4gICAgaWYgKGNhcCkge1xuICAgICAgY29uc3QgdHJpbW1lZFVybCA9IGNhcFsyXS50cmltKCk7XG4gICAgICBpZiAoIXRoaXMub3B0aW9ucy5wZWRhbnRpYyAmJiB0aGlzLnJ1bGVzLm90aGVyLnN0YXJ0QW5nbGVCcmFja2V0LnRlc3QodHJpbW1lZFVybCkpIHtcbiAgICAgICAgLy8gY29tbW9ubWFyayByZXF1aXJlcyBtYXRjaGluZyBhbmdsZSBicmFja2V0c1xuICAgICAgICBpZiAoISh0aGlzLnJ1bGVzLm90aGVyLmVuZEFuZ2xlQnJhY2tldC50ZXN0KHRyaW1tZWRVcmwpKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVuZGluZyBhbmdsZSBicmFja2V0IGNhbm5vdCBiZSBlc2NhcGVkXG4gICAgICAgIGNvbnN0IHJ0cmltU2xhc2ggPSBydHJpbSh0cmltbWVkVXJsLnNsaWNlKDAsIC0xKSwgJ1xcXFwnKTtcbiAgICAgICAgaWYgKCh0cmltbWVkVXJsLmxlbmd0aCAtIHJ0cmltU2xhc2gubGVuZ3RoKSAlIDIgPT09IDApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGZpbmQgY2xvc2luZyBwYXJlbnRoZXNpc1xuICAgICAgICBjb25zdCBsYXN0UGFyZW5JbmRleCA9IGZpbmRDbG9zaW5nQnJhY2tldChjYXBbMl0sICcoKScpO1xuICAgICAgICBpZiAobGFzdFBhcmVuSW5kZXggPT09IC0yKSB7XG4gICAgICAgICAgLy8gbW9yZSBvcGVuIHBhcmVucyB0aGFuIGNsb3NlZFxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsYXN0UGFyZW5JbmRleCA+IC0xKSB7XG4gICAgICAgICAgY29uc3Qgc3RhcnQgPSBjYXBbMF0uaW5kZXhPZignIScpID09PSAwID8gNSA6IDQ7XG4gICAgICAgICAgY29uc3QgbGlua0xlbiA9IHN0YXJ0ICsgY2FwWzFdLmxlbmd0aCArIGxhc3RQYXJlbkluZGV4O1xuICAgICAgICAgIGNhcFsyXSA9IGNhcFsyXS5zdWJzdHJpbmcoMCwgbGFzdFBhcmVuSW5kZXgpO1xuICAgICAgICAgIGNhcFswXSA9IGNhcFswXS5zdWJzdHJpbmcoMCwgbGlua0xlbikudHJpbSgpO1xuICAgICAgICAgIGNhcFszXSA9ICcnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsZXQgaHJlZiA9IGNhcFsyXTtcbiAgICAgIGxldCB0aXRsZSA9ICcnO1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5wZWRhbnRpYykge1xuICAgICAgICAvLyBzcGxpdCBwZWRhbnRpYyBocmVmIGFuZCB0aXRsZVxuICAgICAgICBjb25zdCBsaW5rID0gdGhpcy5ydWxlcy5vdGhlci5wZWRhbnRpY0hyZWZUaXRsZS5leGVjKGhyZWYpO1xuXG4gICAgICAgIGlmIChsaW5rKSB7XG4gICAgICAgICAgaHJlZiA9IGxpbmtbMV07XG4gICAgICAgICAgdGl0bGUgPSBsaW5rWzNdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aXRsZSA9IGNhcFszXSA/IGNhcFszXS5zbGljZSgxLCAtMSkgOiAnJztcbiAgICAgIH1cblxuICAgICAgaHJlZiA9IGhyZWYudHJpbSgpO1xuICAgICAgaWYgKHRoaXMucnVsZXMub3RoZXIuc3RhcnRBbmdsZUJyYWNrZXQudGVzdChocmVmKSkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnBlZGFudGljICYmICEodGhpcy5ydWxlcy5vdGhlci5lbmRBbmdsZUJyYWNrZXQudGVzdCh0cmltbWVkVXJsKSkpIHtcbiAgICAgICAgICAvLyBwZWRhbnRpYyBhbGxvd3Mgc3RhcnRpbmcgYW5nbGUgYnJhY2tldCB3aXRob3V0IGVuZGluZyBhbmdsZSBicmFja2V0XG4gICAgICAgICAgaHJlZiA9IGhyZWYuc2xpY2UoMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaHJlZiA9IGhyZWYuc2xpY2UoMSwgLTEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gb3V0cHV0TGluayhjYXAsIHtcbiAgICAgICAgaHJlZjogaHJlZiA/IGhyZWYucmVwbGFjZSh0aGlzLnJ1bGVzLmlubGluZS5hbnlQdW5jdHVhdGlvbiwgJyQxJykgOiBocmVmLFxuICAgICAgICB0aXRsZTogdGl0bGUgPyB0aXRsZS5yZXBsYWNlKHRoaXMucnVsZXMuaW5saW5lLmFueVB1bmN0dWF0aW9uLCAnJDEnKSA6IHRpdGxlLFxuICAgICAgfSwgY2FwWzBdLCB0aGlzLmxleGVyLCB0aGlzLnJ1bGVzKTtcbiAgICB9XG4gIH1cblxuICByZWZsaW5rKHNyYzogc3RyaW5nLCBsaW5rczogTGlua3MpOiBUb2tlbnMuTGluayB8IFRva2Vucy5JbWFnZSB8IFRva2Vucy5UZXh0IHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgY2FwO1xuICAgIGlmICgoY2FwID0gdGhpcy5ydWxlcy5pbmxpbmUucmVmbGluay5leGVjKHNyYykpXG4gICAgICB8fCAoY2FwID0gdGhpcy5ydWxlcy5pbmxpbmUubm9saW5rLmV4ZWMoc3JjKSkpIHtcbiAgICAgIGNvbnN0IGxpbmtTdHJpbmcgPSAoY2FwWzJdIHx8IGNhcFsxXSkucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLm11bHRpcGxlU3BhY2VHbG9iYWwsICcgJyk7XG4gICAgICBjb25zdCBsaW5rID0gbGlua3NbbGlua1N0cmluZy50b0xvd2VyQ2FzZSgpXTtcbiAgICAgIGlmICghbGluaykge1xuICAgICAgICBjb25zdCB0ZXh0ID0gY2FwWzBdLmNoYXJBdCgwKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgcmF3OiB0ZXh0LFxuICAgICAgICAgIHRleHQsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gb3V0cHV0TGluayhjYXAsIGxpbmssIGNhcFswXSwgdGhpcy5sZXhlciwgdGhpcy5ydWxlcyk7XG4gICAgfVxuICB9XG5cbiAgZW1TdHJvbmcoc3JjOiBzdHJpbmcsIG1hc2tlZFNyYzogc3RyaW5nLCBwcmV2Q2hhciA9ICcnKTogVG9rZW5zLkVtIHwgVG9rZW5zLlN0cm9uZyB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IG1hdGNoID0gdGhpcy5ydWxlcy5pbmxpbmUuZW1TdHJvbmdMRGVsaW0uZXhlYyhzcmMpO1xuICAgIGlmICghbWF0Y2gpIHJldHVybjtcbiAgICBpZiAoIW1hdGNoWzFdICYmICFtYXRjaFsyXSAmJiAhbWF0Y2hbM10gJiYgIW1hdGNoWzRdKSByZXR1cm47XG5cbiAgICAvLyBfIGNhbid0IGJlIGJldHdlZW4gdHdvIGFscGhhbnVtZXJpY3MuIFxccHtMfVxccHtOfSBpbmNsdWRlcyBub24tZW5nbGlzaCBhbHBoYWJldC9udW1iZXJzIGFzIHdlbGxcbiAgICBpZiAobWF0Y2hbNF0gJiYgcHJldkNoYXIubWF0Y2godGhpcy5ydWxlcy5vdGhlci51bmljb2RlQWxwaGFOdW1lcmljKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgbmV4dENoYXIgPSBtYXRjaFsxXSB8fCBtYXRjaFszXSB8fCAnJztcblxuICAgIGlmICghbmV4dENoYXIgfHwgIXByZXZDaGFyIHx8IHRoaXMucnVsZXMuaW5saW5lLnB1bmN0dWF0aW9uLmV4ZWMocHJldkNoYXIpKSB7XG4gICAgICAvLyB1bmljb2RlIFJlZ2V4IGNvdW50cyBlbW9qaSBhcyAxIGNoYXI7IHNwcmVhZCBpbnRvIGFycmF5IGZvciBwcm9wZXIgY291bnQgKHVzZWQgbXVsdGlwbGUgdGltZXMgYmVsb3cpXG4gICAgICBjb25zdCBsTGVuZ3RoID0gWy4uLm1hdGNoWzBdXS5sZW5ndGggLSAxO1xuICAgICAgbGV0IHJEZWxpbSwgckxlbmd0aCwgZGVsaW1Ub3RhbCA9IGxMZW5ndGgsIG1pZERlbGltVG90YWwgPSAwO1xuXG4gICAgICBjb25zdCBlbmRSZWcgPSBtYXRjaFswXVswXSA9PT0gJyonID8gdGhpcy5ydWxlcy5pbmxpbmUuZW1TdHJvbmdSRGVsaW1Bc3QgOiB0aGlzLnJ1bGVzLmlubGluZS5lbVN0cm9uZ1JEZWxpbVVuZDtcbiAgICAgIGVuZFJlZy5sYXN0SW5kZXggPSAwO1xuXG4gICAgICAvLyBDbGlwIG1hc2tlZFNyYyB0byBzYW1lIHNlY3Rpb24gb2Ygc3RyaW5nIGFzIHNyYyAobW92ZSB0byBsZXhlcj8pXG4gICAgICBtYXNrZWRTcmMgPSBtYXNrZWRTcmMuc2xpY2UoLTEgKiBzcmMubGVuZ3RoICsgbExlbmd0aCk7XG5cbiAgICAgIHdoaWxlICgobWF0Y2ggPSBlbmRSZWcuZXhlYyhtYXNrZWRTcmMpKSAhPSBudWxsKSB7XG4gICAgICAgIHJEZWxpbSA9IG1hdGNoWzFdIHx8IG1hdGNoWzJdIHx8IG1hdGNoWzNdIHx8IG1hdGNoWzRdIHx8IG1hdGNoWzVdIHx8IG1hdGNoWzZdO1xuXG4gICAgICAgIGlmICghckRlbGltKSBjb250aW51ZTsgLy8gc2tpcCBzaW5nbGUgKiBpbiBfX2FiYyphYmNfX1xuXG4gICAgICAgIHJMZW5ndGggPSBbLi4uckRlbGltXS5sZW5ndGg7XG5cbiAgICAgICAgaWYgKG1hdGNoWzNdIHx8IG1hdGNoWzRdKSB7IC8vIGZvdW5kIGFub3RoZXIgTGVmdCBEZWxpbVxuICAgICAgICAgIGRlbGltVG90YWwgKz0gckxlbmd0aDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBlbHNlIGlmIChtYXRjaFs1XSB8fCBtYXRjaFs2XSkgeyAvLyBlaXRoZXIgTGVmdCBvciBSaWdodCBEZWxpbVxuICAgICAgICAgIGlmIChsTGVuZ3RoICUgMyAmJiAhKChsTGVuZ3RoICsgckxlbmd0aCkgJSAzKSkge1xuICAgICAgICAgICAgbWlkRGVsaW1Ub3RhbCArPSByTGVuZ3RoO1xuICAgICAgICAgICAgY29udGludWU7IC8vIENvbW1vbk1hcmsgRW1waGFzaXMgUnVsZXMgOS0xMFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGRlbGltVG90YWwgLT0gckxlbmd0aDtcblxuICAgICAgICBpZiAoZGVsaW1Ub3RhbCA+IDApIGNvbnRpbnVlOyAvLyBIYXZlbid0IGZvdW5kIGVub3VnaCBjbG9zaW5nIGRlbGltaXRlcnNcblxuICAgICAgICAvLyBSZW1vdmUgZXh0cmEgY2hhcmFjdGVycy4gKmEqKiogLT4gKmEqXG4gICAgICAgIHJMZW5ndGggPSBNYXRoLm1pbihyTGVuZ3RoLCByTGVuZ3RoICsgZGVsaW1Ub3RhbCArIG1pZERlbGltVG90YWwpO1xuICAgICAgICAvLyBjaGFyIGxlbmd0aCBjYW4gYmUgPjEgZm9yIHVuaWNvZGUgY2hhcmFjdGVycztcbiAgICAgICAgY29uc3QgbGFzdENoYXJMZW5ndGggPSBbLi4ubWF0Y2hbMF1dWzBdLmxlbmd0aDtcbiAgICAgICAgY29uc3QgcmF3ID0gc3JjLnNsaWNlKDAsIGxMZW5ndGggKyBtYXRjaC5pbmRleCArIGxhc3RDaGFyTGVuZ3RoICsgckxlbmd0aCk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGBlbWAgaWYgc21hbGxlc3QgZGVsaW1pdGVyIGhhcyBvZGQgY2hhciBjb3VudC4gKmEqKipcbiAgICAgICAgaWYgKE1hdGgubWluKGxMZW5ndGgsIHJMZW5ndGgpICUgMikge1xuICAgICAgICAgIGNvbnN0IHRleHQgPSByYXcuc2xpY2UoMSwgLTEpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnZW0nLFxuICAgICAgICAgICAgcmF3LFxuICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgIHRva2VuczogdGhpcy5sZXhlci5pbmxpbmVUb2tlbnModGV4dCksXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENyZWF0ZSAnc3Ryb25nJyBpZiBzbWFsbGVzdCBkZWxpbWl0ZXIgaGFzIGV2ZW4gY2hhciBjb3VudC4gKiphKioqXG4gICAgICAgIGNvbnN0IHRleHQgPSByYXcuc2xpY2UoMiwgLTIpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6ICdzdHJvbmcnLFxuICAgICAgICAgIHJhdyxcbiAgICAgICAgICB0ZXh0LFxuICAgICAgICAgIHRva2VuczogdGhpcy5sZXhlci5pbmxpbmVUb2tlbnModGV4dCksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29kZXNwYW4oc3JjOiBzdHJpbmcpOiBUb2tlbnMuQ29kZXNwYW4gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuaW5saW5lLmNvZGUuZXhlYyhzcmMpO1xuICAgIGlmIChjYXApIHtcbiAgICAgIGxldCB0ZXh0ID0gY2FwWzJdLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5uZXdMaW5lQ2hhckdsb2JhbCwgJyAnKTtcbiAgICAgIGNvbnN0IGhhc05vblNwYWNlQ2hhcnMgPSB0aGlzLnJ1bGVzLm90aGVyLm5vblNwYWNlQ2hhci50ZXN0KHRleHQpO1xuICAgICAgY29uc3QgaGFzU3BhY2VDaGFyc09uQm90aEVuZHMgPSB0aGlzLnJ1bGVzLm90aGVyLnN0YXJ0aW5nU3BhY2VDaGFyLnRlc3QodGV4dCkgJiYgdGhpcy5ydWxlcy5vdGhlci5lbmRpbmdTcGFjZUNoYXIudGVzdCh0ZXh0KTtcbiAgICAgIGlmIChoYXNOb25TcGFjZUNoYXJzICYmIGhhc1NwYWNlQ2hhcnNPbkJvdGhFbmRzKSB7XG4gICAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cmluZygxLCB0ZXh0Lmxlbmd0aCAtIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ2NvZGVzcGFuJyxcbiAgICAgICAgcmF3OiBjYXBbMF0sXG4gICAgICAgIHRleHQsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGJyKHNyYzogc3RyaW5nKTogVG9rZW5zLkJyIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjYXAgPSB0aGlzLnJ1bGVzLmlubGluZS5ici5leGVjKHNyYyk7XG4gICAgaWYgKGNhcCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ2JyJyxcbiAgICAgICAgcmF3OiBjYXBbMF0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGRlbChzcmM6IHN0cmluZywgbWFza2VkU3JjOiBzdHJpbmcsIHByZXZDaGFyID0gJycpOiBUb2tlbnMuRGVsIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgbWF0Y2ggPSB0aGlzLnJ1bGVzLmlubGluZS5kZWxMRGVsaW0uZXhlYyhzcmMpO1xuICAgIGlmICghbWF0Y2gpIHJldHVybjtcblxuICAgIGNvbnN0IG5leHRDaGFyID0gbWF0Y2hbMV0gfHwgJyc7XG5cbiAgICBpZiAoIW5leHRDaGFyIHx8ICFwcmV2Q2hhciB8fCB0aGlzLnJ1bGVzLmlubGluZS5wdW5jdHVhdGlvbi5leGVjKHByZXZDaGFyKSkge1xuICAgICAgLy8gdW5pY29kZSBSZWdleCBjb3VudHMgZW1vamkgYXMgMSBjaGFyOyBzcHJlYWQgaW50byBhcnJheSBmb3IgcHJvcGVyIGNvdW50XG4gICAgICBjb25zdCBsTGVuZ3RoID0gWy4uLm1hdGNoWzBdXS5sZW5ndGggLSAxO1xuICAgICAgbGV0IHJEZWxpbSwgckxlbmd0aCwgZGVsaW1Ub3RhbCA9IGxMZW5ndGg7XG5cbiAgICAgIGNvbnN0IGVuZFJlZyA9IHRoaXMucnVsZXMuaW5saW5lLmRlbFJEZWxpbTtcbiAgICAgIGVuZFJlZy5sYXN0SW5kZXggPSAwO1xuXG4gICAgICAvLyBDbGlwIG1hc2tlZFNyYyB0byBzYW1lIHNlY3Rpb24gb2Ygc3RyaW5nIGFzIHNyY1xuICAgICAgbWFza2VkU3JjID0gbWFza2VkU3JjLnNsaWNlKC0xICogc3JjLmxlbmd0aCArIGxMZW5ndGgpO1xuXG4gICAgICB3aGlsZSAoKG1hdGNoID0gZW5kUmVnLmV4ZWMobWFza2VkU3JjKSkgIT0gbnVsbCkge1xuICAgICAgICByRGVsaW0gPSBtYXRjaFsxXSB8fCBtYXRjaFsyXSB8fCBtYXRjaFszXSB8fCBtYXRjaFs0XSB8fCBtYXRjaFs1XSB8fCBtYXRjaFs2XTtcblxuICAgICAgICBpZiAoIXJEZWxpbSkgY29udGludWU7XG5cbiAgICAgICAgckxlbmd0aCA9IFsuLi5yRGVsaW1dLmxlbmd0aDtcblxuICAgICAgICBpZiAockxlbmd0aCAhPT0gbExlbmd0aCkgY29udGludWU7XG5cbiAgICAgICAgaWYgKG1hdGNoWzNdIHx8IG1hdGNoWzRdKSB7IC8vIGZvdW5kIGFub3RoZXIgTGVmdCBEZWxpbVxuICAgICAgICAgIGRlbGltVG90YWwgKz0gckxlbmd0aDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlbGltVG90YWwgLT0gckxlbmd0aDtcblxuICAgICAgICBpZiAoZGVsaW1Ub3RhbCA+IDApIGNvbnRpbnVlOyAvLyBIYXZlbid0IGZvdW5kIGVub3VnaCBjbG9zaW5nIGRlbGltaXRlcnNcblxuICAgICAgICAvLyBSZW1vdmUgZXh0cmEgY2hhcmFjdGVyc1xuICAgICAgICByTGVuZ3RoID0gTWF0aC5taW4ockxlbmd0aCwgckxlbmd0aCArIGRlbGltVG90YWwpO1xuICAgICAgICAvLyBjaGFyIGxlbmd0aCBjYW4gYmUgPjEgZm9yIHVuaWNvZGUgY2hhcmFjdGVyc1xuICAgICAgICBjb25zdCBsYXN0Q2hhckxlbmd0aCA9IFsuLi5tYXRjaFswXV1bMF0ubGVuZ3RoO1xuICAgICAgICBjb25zdCByYXcgPSBzcmMuc2xpY2UoMCwgbExlbmd0aCArIG1hdGNoLmluZGV4ICsgbGFzdENoYXJMZW5ndGggKyByTGVuZ3RoKTtcblxuICAgICAgICAvLyBDcmVhdGUgZGVsIHRva2VuIC0gb25seSBzaW5nbGUgfiBvciBkb3VibGUgfn4gc3VwcG9ydGVkXG4gICAgICAgIGNvbnN0IHRleHQgPSByYXcuc2xpY2UobExlbmd0aCwgLWxMZW5ndGgpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6ICdkZWwnLFxuICAgICAgICAgIHJhdyxcbiAgICAgICAgICB0ZXh0LFxuICAgICAgICAgIHRva2VuczogdGhpcy5sZXhlci5pbmxpbmVUb2tlbnModGV4dCksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXV0b2xpbmsoc3JjOiBzdHJpbmcpOiBUb2tlbnMuTGluayB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5pbmxpbmUuYXV0b2xpbmsuZXhlYyhzcmMpO1xuICAgIGlmIChjYXApIHtcbiAgICAgIGxldCB0ZXh0LCBocmVmO1xuICAgICAgaWYgKGNhcFsyXSA9PT0gJ0AnKSB7XG4gICAgICAgIHRleHQgPSBjYXBbMV07XG4gICAgICAgIGhyZWYgPSAnbWFpbHRvOicgKyB0ZXh0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGV4dCA9IGNhcFsxXTtcbiAgICAgICAgaHJlZiA9IHRleHQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdsaW5rJyxcbiAgICAgICAgcmF3OiBjYXBbMF0sXG4gICAgICAgIHRleHQsXG4gICAgICAgIGhyZWYsXG4gICAgICAgIHRva2VuczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgIHJhdzogdGV4dCxcbiAgICAgICAgICAgIHRleHQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgdXJsKHNyYzogc3RyaW5nKTogVG9rZW5zLkxpbmsgfCB1bmRlZmluZWQge1xuICAgIGxldCBjYXA7XG4gICAgaWYgKGNhcCA9IHRoaXMucnVsZXMuaW5saW5lLnVybC5leGVjKHNyYykpIHtcbiAgICAgIGxldCB0ZXh0LCBocmVmO1xuICAgICAgaWYgKGNhcFsyXSA9PT0gJ0AnKSB7XG4gICAgICAgIHRleHQgPSBjYXBbMF07XG4gICAgICAgIGhyZWYgPSAnbWFpbHRvOicgKyB0ZXh0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZG8gZXh0ZW5kZWQgYXV0b2xpbmsgcGF0aCB2YWxpZGF0aW9uXG4gICAgICAgIGxldCBwcmV2Q2FwWmVybztcbiAgICAgICAgZG8ge1xuICAgICAgICAgIHByZXZDYXBaZXJvID0gY2FwWzBdO1xuICAgICAgICAgIGNhcFswXSA9IHRoaXMucnVsZXMuaW5saW5lLl9iYWNrcGVkYWwuZXhlYyhjYXBbMF0pPy5bMF0gPz8gJyc7XG4gICAgICAgIH0gd2hpbGUgKHByZXZDYXBaZXJvICE9PSBjYXBbMF0pO1xuICAgICAgICB0ZXh0ID0gY2FwWzBdO1xuICAgICAgICBpZiAoY2FwWzFdID09PSAnd3d3LicpIHtcbiAgICAgICAgICBocmVmID0gJ2h0dHA6Ly8nICsgY2FwWzBdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGhyZWYgPSBjYXBbMF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdsaW5rJyxcbiAgICAgICAgcmF3OiBjYXBbMF0sXG4gICAgICAgIHRleHQsXG4gICAgICAgIGhyZWYsXG4gICAgICAgIHRva2VuczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgIHJhdzogdGV4dCxcbiAgICAgICAgICAgIHRleHQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgaW5saW5lVGV4dChzcmM6IHN0cmluZyk6IFRva2Vucy5UZXh0IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjYXAgPSB0aGlzLnJ1bGVzLmlubGluZS50ZXh0LmV4ZWMoc3JjKTtcbiAgICBpZiAoY2FwKSB7XG4gICAgICBjb25zdCBlc2NhcGVkID0gdGhpcy5sZXhlci5zdGF0ZS5pblJhd0Jsb2NrO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICByYXc6IGNhcFswXSxcbiAgICAgICAgdGV4dDogY2FwWzBdLFxuICAgICAgICBlc2NhcGVkLFxuICAgICAgfTtcbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBfVG9rZW5pemVyIH0gZnJvbSAnLi9Ub2tlbml6ZXIudHMnO1xuaW1wb3J0IHsgX2RlZmF1bHRzIH0gZnJvbSAnLi9kZWZhdWx0cy50cyc7XG5pbXBvcnQgeyBvdGhlciwgYmxvY2ssIGlubGluZSB9IGZyb20gJy4vcnVsZXMudHMnO1xuaW1wb3J0IHR5cGUgeyBUb2tlbiwgVG9rZW5zTGlzdCwgVG9rZW5zIH0gZnJvbSAnLi9Ub2tlbnMudHMnO1xuaW1wb3J0IHR5cGUgeyBNYXJrZWRPcHRpb25zIH0gZnJvbSAnLi9NYXJrZWRPcHRpb25zLnRzJztcblxuLyoqXG4gKiBCbG9jayBMZXhlclxuICovXG5leHBvcnQgY2xhc3MgX0xleGVyPFBhcnNlck91dHB1dCA9IHN0cmluZywgUmVuZGVyZXJPdXRwdXQgPSBzdHJpbmc+IHtcbiAgdG9rZW5zOiBUb2tlbnNMaXN0O1xuICBvcHRpb25zOiBNYXJrZWRPcHRpb25zPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+O1xuICBzdGF0ZToge1xuICAgIGluTGluazogYm9vbGVhbjtcbiAgICBpblJhd0Jsb2NrOiBib29sZWFuO1xuICAgIHRvcDogYm9vbGVhbjtcbiAgfTtcblxuICBwdWJsaWMgaW5saW5lUXVldWU6IHsgc3JjOiBzdHJpbmcsIHRva2VuczogVG9rZW5bXSB9W107XG5cbiAgcHJpdmF0ZSB0b2tlbml6ZXI6IF9Ub2tlbml6ZXI8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD47XG5cbiAgY29uc3RydWN0b3Iob3B0aW9ucz86IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4pIHtcbiAgICAvLyBUb2tlbkxpc3QgY2Fubm90IGJlIGNyZWF0ZWQgaW4gb25lIGdvXG4gICAgdGhpcy50b2tlbnMgPSBbXSBhcyB1bmtub3duIGFzIFRva2Vuc0xpc3Q7XG4gICAgdGhpcy50b2tlbnMubGlua3MgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwgX2RlZmF1bHRzO1xuICAgIHRoaXMub3B0aW9ucy50b2tlbml6ZXIgPSB0aGlzLm9wdGlvbnMudG9rZW5pemVyIHx8IG5ldyBfVG9rZW5pemVyPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+KCk7XG4gICAgdGhpcy50b2tlbml6ZXIgPSB0aGlzLm9wdGlvbnMudG9rZW5pemVyO1xuICAgIHRoaXMudG9rZW5pemVyLm9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgdGhpcy50b2tlbml6ZXIubGV4ZXIgPSB0aGlzO1xuICAgIHRoaXMuaW5saW5lUXVldWUgPSBbXTtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgaW5MaW5rOiBmYWxzZSxcbiAgICAgIGluUmF3QmxvY2s6IGZhbHNlLFxuICAgICAgdG9wOiB0cnVlLFxuICAgIH07XG5cbiAgICBjb25zdCBydWxlcyA9IHtcbiAgICAgIG90aGVyLFxuICAgICAgYmxvY2s6IGJsb2NrLm5vcm1hbCxcbiAgICAgIGlubGluZTogaW5saW5lLm5vcm1hbCxcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5wZWRhbnRpYykge1xuICAgICAgcnVsZXMuYmxvY2sgPSBibG9jay5wZWRhbnRpYztcbiAgICAgIHJ1bGVzLmlubGluZSA9IGlubGluZS5wZWRhbnRpYztcbiAgICB9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy5nZm0pIHtcbiAgICAgIHJ1bGVzLmJsb2NrID0gYmxvY2suZ2ZtO1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5icmVha3MpIHtcbiAgICAgICAgcnVsZXMuaW5saW5lID0gaW5saW5lLmJyZWFrcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJ1bGVzLmlubGluZSA9IGlubGluZS5nZm07XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMudG9rZW5pemVyLnJ1bGVzID0gcnVsZXM7XG4gIH1cblxuICAvKipcbiAgICogRXhwb3NlIFJ1bGVzXG4gICAqL1xuICBzdGF0aWMgZ2V0IHJ1bGVzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBibG9jayxcbiAgICAgIGlubGluZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXRpYyBMZXggTWV0aG9kXG4gICAqL1xuICBzdGF0aWMgbGV4PFBhcnNlck91dHB1dCA9IHN0cmluZywgUmVuZGVyZXJPdXRwdXQgPSBzdHJpbmc+KHNyYzogc3RyaW5nLCBvcHRpb25zPzogTWFya2VkT3B0aW9uczxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0Pikge1xuICAgIGNvbnN0IGxleGVyID0gbmV3IF9MZXhlcjxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0PihvcHRpb25zKTtcbiAgICByZXR1cm4gbGV4ZXIubGV4KHNyYyk7XG4gIH1cblxuICAvKipcbiAgICogU3RhdGljIExleCBJbmxpbmUgTWV0aG9kXG4gICAqL1xuICBzdGF0aWMgbGV4SW5saW5lPFBhcnNlck91dHB1dCA9IHN0cmluZywgUmVuZGVyZXJPdXRwdXQgPSBzdHJpbmc+KHNyYzogc3RyaW5nLCBvcHRpb25zPzogTWFya2VkT3B0aW9uczxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0Pikge1xuICAgIGNvbnN0IGxleGVyID0gbmV3IF9MZXhlcjxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0PihvcHRpb25zKTtcbiAgICByZXR1cm4gbGV4ZXIuaW5saW5lVG9rZW5zKHNyYyk7XG4gIH1cblxuICAvKipcbiAgICogUHJlcHJvY2Vzc2luZ1xuICAgKi9cbiAgbGV4KHNyYzogc3RyaW5nKSB7XG4gICAgc3JjID0gc3JjLnJlcGxhY2Uob3RoZXIuY2FycmlhZ2VSZXR1cm4sICdcXG4nKTtcblxuICAgIHRoaXMuYmxvY2tUb2tlbnMoc3JjLCB0aGlzLnRva2Vucyk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuaW5saW5lUXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5leHQgPSB0aGlzLmlubGluZVF1ZXVlW2ldO1xuICAgICAgdGhpcy5pbmxpbmVUb2tlbnMobmV4dC5zcmMsIG5leHQudG9rZW5zKTtcbiAgICB9XG4gICAgdGhpcy5pbmxpbmVRdWV1ZSA9IFtdO1xuXG4gICAgcmV0dXJuIHRoaXMudG9rZW5zO1xuICB9XG5cbiAgLyoqXG4gICAqIExleGluZ1xuICAgKi9cbiAgYmxvY2tUb2tlbnMoc3JjOiBzdHJpbmcsIHRva2Vucz86IFRva2VuW10sIGxhc3RQYXJhZ3JhcGhDbGlwcGVkPzogYm9vbGVhbik6IFRva2VuW107XG4gIGJsb2NrVG9rZW5zKHNyYzogc3RyaW5nLCB0b2tlbnM/OiBUb2tlbnNMaXN0LCBsYXN0UGFyYWdyYXBoQ2xpcHBlZD86IGJvb2xlYW4pOiBUb2tlbnNMaXN0O1xuICBibG9ja1Rva2VucyhzcmM6IHN0cmluZywgdG9rZW5zOiBUb2tlbltdID0gW10sIGxhc3RQYXJhZ3JhcGhDbGlwcGVkID0gZmFsc2UpIHtcbiAgICB0aGlzLnRva2VuaXplci5sZXhlciA9IHRoaXM7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5wZWRhbnRpYykge1xuICAgICAgc3JjID0gc3JjLnJlcGxhY2Uob3RoZXIudGFiQ2hhckdsb2JhbCwgJyAgICAnKS5yZXBsYWNlKG90aGVyLnNwYWNlTGluZSwgJycpO1xuICAgIH1cblxuICAgIHdoaWxlIChzcmMpIHtcbiAgICAgIGxldCB0b2tlbjogVG9rZW5zLkdlbmVyaWMgfCB1bmRlZmluZWQ7XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucz8uYmxvY2s/LnNvbWUoKGV4dFRva2VuaXplcikgPT4ge1xuICAgICAgICBpZiAodG9rZW4gPSBleHRUb2tlbml6ZXIuY2FsbCh7IGxleGVyOiB0aGlzIH0sIHNyYywgdG9rZW5zKSkge1xuICAgICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0pKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBuZXdsaW5lXG4gICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5zcGFjZShzcmMpKSB7XG4gICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IGxhc3RUb2tlbiA9IHRva2Vucy5hdCgtMSk7XG4gICAgICAgIGlmICh0b2tlbi5yYXcubGVuZ3RoID09PSAxICYmIGxhc3RUb2tlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gaWYgdGhlcmUncyBhIHNpbmdsZSBcXG4gYXMgYSBzcGFjZXIsIGl0J3MgdGVybWluYXRpbmcgdGhlIGxhc3QgbGluZSxcbiAgICAgICAgICAvLyBzbyBtb3ZlIGl0IHRoZXJlIHNvIHRoYXQgd2UgZG9uJ3QgZ2V0IHVubmVjZXNzYXJ5IHBhcmFncmFwaCB0YWdzXG4gICAgICAgICAgbGFzdFRva2VuLnJhdyArPSAnXFxuJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGNvZGVcbiAgICAgIGlmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLmNvZGUoc3JjKSkge1xuICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICBjb25zdCBsYXN0VG9rZW4gPSB0b2tlbnMuYXQoLTEpO1xuICAgICAgICAvLyBBbiBpbmRlbnRlZCBjb2RlIGJsb2NrIGNhbm5vdCBpbnRlcnJ1cHQgYSBwYXJhZ3JhcGguXG4gICAgICAgIGlmIChsYXN0VG9rZW4/LnR5cGUgPT09ICdwYXJhZ3JhcGgnIHx8IGxhc3RUb2tlbj8udHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICAgICAgbGFzdFRva2VuLnJhdyArPSAobGFzdFRva2VuLnJhdy5lbmRzV2l0aCgnXFxuJykgPyAnJyA6ICdcXG4nKSArIHRva2VuLnJhdztcbiAgICAgICAgICBsYXN0VG9rZW4udGV4dCArPSAnXFxuJyArIHRva2VuLnRleHQ7XG4gICAgICAgICAgdGhpcy5pbmxpbmVRdWV1ZS5hdCgtMSkhLnNyYyA9IGxhc3RUb2tlbi50ZXh0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gZmVuY2VzXG4gICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5mZW5jZXMoc3JjKSkge1xuICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBoZWFkaW5nXG4gICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5oZWFkaW5nKHNyYykpIHtcbiAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gaHJcbiAgICAgIGlmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLmhyKHNyYykpIHtcbiAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gYmxvY2txdW90ZVxuICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIuYmxvY2txdW90ZShzcmMpKSB7XG4gICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGxpc3RcbiAgICAgIGlmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLmxpc3Qoc3JjKSkge1xuICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBodG1sXG4gICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5odG1sKHNyYykpIHtcbiAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gZGVmXG4gICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5kZWYoc3JjKSkge1xuICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICBjb25zdCBsYXN0VG9rZW4gPSB0b2tlbnMuYXQoLTEpO1xuICAgICAgICBpZiAobGFzdFRva2VuPy50eXBlID09PSAncGFyYWdyYXBoJyB8fCBsYXN0VG9rZW4/LnR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgICAgIGxhc3RUb2tlbi5yYXcgKz0gKGxhc3RUb2tlbi5yYXcuZW5kc1dpdGgoJ1xcbicpID8gJycgOiAnXFxuJykgKyB0b2tlbi5yYXc7XG4gICAgICAgICAgbGFzdFRva2VuLnRleHQgKz0gJ1xcbicgKyB0b2tlbi5yYXc7XG4gICAgICAgICAgdGhpcy5pbmxpbmVRdWV1ZS5hdCgtMSkhLnNyYyA9IGxhc3RUb2tlbi50ZXh0O1xuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLnRva2Vucy5saW5rc1t0b2tlbi50YWddKSB7XG4gICAgICAgICAgdGhpcy50b2tlbnMubGlua3NbdG9rZW4udGFnXSA9IHtcbiAgICAgICAgICAgIGhyZWY6IHRva2VuLmhyZWYsXG4gICAgICAgICAgICB0aXRsZTogdG9rZW4udGl0bGUsXG4gICAgICAgICAgfTtcbiAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIHRhYmxlIChnZm0pXG4gICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci50YWJsZShzcmMpKSB7XG4gICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGxoZWFkaW5nXG4gICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5saGVhZGluZyhzcmMpKSB7XG4gICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIHRvcC1sZXZlbCBwYXJhZ3JhcGhcbiAgICAgIC8vIHByZXZlbnQgcGFyYWdyYXBoIGNvbnN1bWluZyBleHRlbnNpb25zIGJ5IGNsaXBwaW5nICdzcmMnIHRvIGV4dGVuc2lvbiBzdGFydFxuICAgICAgbGV0IGN1dFNyYyA9IHNyYztcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucz8uc3RhcnRCbG9jaykge1xuICAgICAgICBsZXQgc3RhcnRJbmRleCA9IEluZmluaXR5O1xuICAgICAgICBjb25zdCB0ZW1wU3JjID0gc3JjLnNsaWNlKDEpO1xuICAgICAgICBsZXQgdGVtcFN0YXJ0O1xuICAgICAgICB0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5zdGFydEJsb2NrLmZvckVhY2goKGdldFN0YXJ0SW5kZXgpID0+IHtcbiAgICAgICAgICB0ZW1wU3RhcnQgPSBnZXRTdGFydEluZGV4LmNhbGwoeyBsZXhlcjogdGhpcyB9LCB0ZW1wU3JjKTtcbiAgICAgICAgICBpZiAodHlwZW9mIHRlbXBTdGFydCA9PT0gJ251bWJlcicgJiYgdGVtcFN0YXJ0ID49IDApIHtcbiAgICAgICAgICAgIHN0YXJ0SW5kZXggPSBNYXRoLm1pbihzdGFydEluZGV4LCB0ZW1wU3RhcnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChzdGFydEluZGV4IDwgSW5maW5pdHkgJiYgc3RhcnRJbmRleCA+PSAwKSB7XG4gICAgICAgICAgY3V0U3JjID0gc3JjLnN1YnN0cmluZygwLCBzdGFydEluZGV4ICsgMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnN0YXRlLnRvcCAmJiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5wYXJhZ3JhcGgoY3V0U3JjKSkpIHtcbiAgICAgICAgY29uc3QgbGFzdFRva2VuID0gdG9rZW5zLmF0KC0xKTtcbiAgICAgICAgaWYgKGxhc3RQYXJhZ3JhcGhDbGlwcGVkICYmIGxhc3RUb2tlbj8udHlwZSA9PT0gJ3BhcmFncmFwaCcpIHtcbiAgICAgICAgICBsYXN0VG9rZW4ucmF3ICs9IChsYXN0VG9rZW4ucmF3LmVuZHNXaXRoKCdcXG4nKSA/ICcnIDogJ1xcbicpICsgdG9rZW4ucmF3O1xuICAgICAgICAgIGxhc3RUb2tlbi50ZXh0ICs9ICdcXG4nICsgdG9rZW4udGV4dDtcbiAgICAgICAgICB0aGlzLmlubGluZVF1ZXVlLnBvcCgpO1xuICAgICAgICAgIHRoaXMuaW5saW5lUXVldWUuYXQoLTEpIS5zcmMgPSBsYXN0VG9rZW4udGV4dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdFBhcmFncmFwaENsaXBwZWQgPSBjdXRTcmMubGVuZ3RoICE9PSBzcmMubGVuZ3RoO1xuICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gdGV4dFxuICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIudGV4dChzcmMpKSB7XG4gICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IGxhc3RUb2tlbiA9IHRva2Vucy5hdCgtMSk7XG4gICAgICAgIGlmIChsYXN0VG9rZW4/LnR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgICAgIGxhc3RUb2tlbi5yYXcgKz0gKGxhc3RUb2tlbi5yYXcuZW5kc1dpdGgoJ1xcbicpID8gJycgOiAnXFxuJykgKyB0b2tlbi5yYXc7XG4gICAgICAgICAgbGFzdFRva2VuLnRleHQgKz0gJ1xcbicgKyB0b2tlbi50ZXh0O1xuICAgICAgICAgIHRoaXMuaW5saW5lUXVldWUucG9wKCk7XG4gICAgICAgICAgdGhpcy5pbmxpbmVRdWV1ZS5hdCgtMSkhLnNyYyA9IGxhc3RUb2tlbi50ZXh0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNyYykge1xuICAgICAgICBjb25zdCBlcnJNc2cgPSAnSW5maW5pdGUgbG9vcCBvbiBieXRlOiAnICsgc3JjLmNoYXJDb2RlQXQoMCk7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJNc2cpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJNc2cpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zdGF0ZS50b3AgPSB0cnVlO1xuICAgIHJldHVybiB0b2tlbnM7XG4gIH1cblxuICBpbmxpbmUoc3JjOiBzdHJpbmcsIHRva2VuczogVG9rZW5bXSA9IFtdKSB7XG4gICAgdGhpcy5pbmxpbmVRdWV1ZS5wdXNoKHsgc3JjLCB0b2tlbnMgfSk7XG4gICAgcmV0dXJuIHRva2VucztcbiAgfVxuXG4gIC8qKlxuICAgKiBMZXhpbmcvQ29tcGlsaW5nXG4gICAqL1xuICBpbmxpbmVUb2tlbnMoc3JjOiBzdHJpbmcsIHRva2VuczogVG9rZW5bXSA9IFtdKTogVG9rZW5bXSB7XG4gICAgdGhpcy50b2tlbml6ZXIubGV4ZXIgPSB0aGlzO1xuICAgIC8vIFN0cmluZyB3aXRoIGxpbmtzIG1hc2tlZCB0byBhdm9pZCBpbnRlcmZlcmVuY2Ugd2l0aCBlbSBhbmQgc3Ryb25nXG4gICAgbGV0IG1hc2tlZFNyYyA9IHNyYztcbiAgICBsZXQgbWF0Y2g6IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGwgPSBudWxsO1xuXG4gICAgLy8gTWFzayBvdXQgcmVmbGlua3NcbiAgICBpZiAodGhpcy50b2tlbnMubGlua3MpIHtcbiAgICAgIGNvbnN0IGxpbmtzID0gT2JqZWN0LmtleXModGhpcy50b2tlbnMubGlua3MpO1xuICAgICAgaWYgKGxpbmtzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgd2hpbGUgKChtYXRjaCA9IHRoaXMudG9rZW5pemVyLnJ1bGVzLmlubGluZS5yZWZsaW5rU2VhcmNoLmV4ZWMobWFza2VkU3JjKSkgIT0gbnVsbCkge1xuICAgICAgICAgIGlmIChsaW5rcy5pbmNsdWRlcyhtYXRjaFswXS5zbGljZShtYXRjaFswXS5sYXN0SW5kZXhPZignWycpICsgMSwgLTEpKSkge1xuICAgICAgICAgICAgbWFza2VkU3JjID0gbWFza2VkU3JjLnNsaWNlKDAsIG1hdGNoLmluZGV4KVxuICAgICAgICAgICAgICArICdbJyArICdhJy5yZXBlYXQobWF0Y2hbMF0ubGVuZ3RoIC0gMikgKyAnXSdcbiAgICAgICAgICAgICAgKyBtYXNrZWRTcmMuc2xpY2UodGhpcy50b2tlbml6ZXIucnVsZXMuaW5saW5lLnJlZmxpbmtTZWFyY2gubGFzdEluZGV4KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBNYXNrIG91dCBlc2NhcGVkIGNoYXJhY3RlcnNcbiAgICB3aGlsZSAoKG1hdGNoID0gdGhpcy50b2tlbml6ZXIucnVsZXMuaW5saW5lLmFueVB1bmN0dWF0aW9uLmV4ZWMobWFza2VkU3JjKSkgIT0gbnVsbCkge1xuICAgICAgbWFza2VkU3JjID0gbWFza2VkU3JjLnNsaWNlKDAsIG1hdGNoLmluZGV4KSArICcrKycgKyBtYXNrZWRTcmMuc2xpY2UodGhpcy50b2tlbml6ZXIucnVsZXMuaW5saW5lLmFueVB1bmN0dWF0aW9uLmxhc3RJbmRleCk7XG4gICAgfVxuXG4gICAgLy8gTWFzayBvdXQgb3RoZXIgYmxvY2tzXG4gICAgbGV0IG9mZnNldDtcbiAgICB3aGlsZSAoKG1hdGNoID0gdGhpcy50b2tlbml6ZXIucnVsZXMuaW5saW5lLmJsb2NrU2tpcC5leGVjKG1hc2tlZFNyYykpICE9IG51bGwpIHtcbiAgICAgIG9mZnNldCA9IG1hdGNoWzJdID8gbWF0Y2hbMl0ubGVuZ3RoIDogMDtcbiAgICAgIG1hc2tlZFNyYyA9IG1hc2tlZFNyYy5zbGljZSgwLCBtYXRjaC5pbmRleCArIG9mZnNldCkgKyAnWycgKyAnYScucmVwZWF0KG1hdGNoWzBdLmxlbmd0aCAtIG9mZnNldCAtIDIpICsgJ10nICsgbWFza2VkU3JjLnNsaWNlKHRoaXMudG9rZW5pemVyLnJ1bGVzLmlubGluZS5ibG9ja1NraXAubGFzdEluZGV4KTtcbiAgICB9XG5cbiAgICAvLyBNYXNrIG91dCBibG9ja3MgZnJvbSBleHRlbnNpb25zXG4gICAgbWFza2VkU3JjID0gdGhpcy5vcHRpb25zLmhvb2tzPy5lbVN0cm9uZ01hc2s/LmNhbGwoeyBsZXhlcjogdGhpcyB9LCBtYXNrZWRTcmMpID8/IG1hc2tlZFNyYztcblxuICAgIGxldCBrZWVwUHJldkNoYXIgPSBmYWxzZTtcbiAgICBsZXQgcHJldkNoYXIgPSAnJztcbiAgICB3aGlsZSAoc3JjKSB7XG4gICAgICBpZiAoIWtlZXBQcmV2Q2hhcikge1xuICAgICAgICBwcmV2Q2hhciA9ICcnO1xuICAgICAgfVxuICAgICAga2VlcFByZXZDaGFyID0gZmFsc2U7XG5cbiAgICAgIGxldCB0b2tlbjogVG9rZW5zLkdlbmVyaWMgfCB1bmRlZmluZWQ7XG5cbiAgICAgIC8vIGV4dGVuc2lvbnNcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucz8uaW5saW5lPy5zb21lKChleHRUb2tlbml6ZXIpID0+IHtcbiAgICAgICAgaWYgKHRva2VuID0gZXh0VG9rZW5pemVyLmNhbGwoeyBsZXhlcjogdGhpcyB9LCBzcmMsIHRva2VucykpIHtcbiAgICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gZXNjYXBlXG4gICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5lc2NhcGUoc3JjKSkge1xuICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyB0YWdcbiAgICAgIGlmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLnRhZyhzcmMpKSB7XG4gICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGxpbmtcbiAgICAgIGlmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLmxpbmsoc3JjKSkge1xuICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyByZWZsaW5rLCBub2xpbmtcbiAgICAgIGlmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLnJlZmxpbmsoc3JjLCB0aGlzLnRva2Vucy5saW5rcykpIHtcbiAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgbGFzdFRva2VuID0gdG9rZW5zLmF0KC0xKTtcbiAgICAgICAgaWYgKHRva2VuLnR5cGUgPT09ICd0ZXh0JyAmJiBsYXN0VG9rZW4/LnR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgICAgIGxhc3RUb2tlbi5yYXcgKz0gdG9rZW4ucmF3O1xuICAgICAgICAgIGxhc3RUb2tlbi50ZXh0ICs9IHRva2VuLnRleHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBlbSAmIHN0cm9uZ1xuICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIuZW1TdHJvbmcoc3JjLCBtYXNrZWRTcmMsIHByZXZDaGFyKSkge1xuICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBjb2RlXG4gICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5jb2Rlc3BhbihzcmMpKSB7XG4gICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGJyXG4gICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5icihzcmMpKSB7XG4gICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGRlbCAoZ2ZtKVxuICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIuZGVsKHNyYywgbWFza2VkU3JjLCBwcmV2Q2hhcikpIHtcbiAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gYXV0b2xpbmtcbiAgICAgIGlmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLmF1dG9saW5rKHNyYykpIHtcbiAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gdXJsIChnZm0pXG4gICAgICBpZiAoIXRoaXMuc3RhdGUuaW5MaW5rICYmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLnVybChzcmMpKSkge1xuICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyB0ZXh0XG4gICAgICAvLyBwcmV2ZW50IGlubGluZVRleHQgY29uc3VtaW5nIGV4dGVuc2lvbnMgYnkgY2xpcHBpbmcgJ3NyYycgdG8gZXh0ZW5zaW9uIHN0YXJ0XG4gICAgICBsZXQgY3V0U3JjID0gc3JjO1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5leHRlbnNpb25zPy5zdGFydElubGluZSkge1xuICAgICAgICBsZXQgc3RhcnRJbmRleCA9IEluZmluaXR5O1xuICAgICAgICBjb25zdCB0ZW1wU3JjID0gc3JjLnNsaWNlKDEpO1xuICAgICAgICBsZXQgdGVtcFN0YXJ0O1xuICAgICAgICB0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5zdGFydElubGluZS5mb3JFYWNoKChnZXRTdGFydEluZGV4KSA9PiB7XG4gICAgICAgICAgdGVtcFN0YXJ0ID0gZ2V0U3RhcnRJbmRleC5jYWxsKHsgbGV4ZXI6IHRoaXMgfSwgdGVtcFNyYyk7XG4gICAgICAgICAgaWYgKHR5cGVvZiB0ZW1wU3RhcnQgPT09ICdudW1iZXInICYmIHRlbXBTdGFydCA+PSAwKSB7XG4gICAgICAgICAgICBzdGFydEluZGV4ID0gTWF0aC5taW4oc3RhcnRJbmRleCwgdGVtcFN0YXJ0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoc3RhcnRJbmRleCA8IEluZmluaXR5ICYmIHN0YXJ0SW5kZXggPj0gMCkge1xuICAgICAgICAgIGN1dFNyYyA9IHNyYy5zdWJzdHJpbmcoMCwgc3RhcnRJbmRleCArIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5pbmxpbmVUZXh0KGN1dFNyYykpIHtcbiAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgaWYgKHRva2VuLnJhdy5zbGljZSgtMSkgIT09ICdfJykgeyAvLyBUcmFjayBwcmV2Q2hhciBiZWZvcmUgc3RyaW5nIG9mIF9fX18gc3RhcnRlZFxuICAgICAgICAgIHByZXZDaGFyID0gdG9rZW4ucmF3LnNsaWNlKC0xKTtcbiAgICAgICAgfVxuICAgICAgICBrZWVwUHJldkNoYXIgPSB0cnVlO1xuICAgICAgICBjb25zdCBsYXN0VG9rZW4gPSB0b2tlbnMuYXQoLTEpO1xuICAgICAgICBpZiAobGFzdFRva2VuPy50eXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgICBsYXN0VG9rZW4ucmF3ICs9IHRva2VuLnJhdztcbiAgICAgICAgICBsYXN0VG9rZW4udGV4dCArPSB0b2tlbi50ZXh0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNyYykge1xuICAgICAgICBjb25zdCBlcnJNc2cgPSAnSW5maW5pdGUgbG9vcCBvbiBieXRlOiAnICsgc3JjLmNoYXJDb2RlQXQoMCk7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJNc2cpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJNc2cpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRva2VucztcbiAgfVxufVxuIiwgImltcG9ydCB7IF9kZWZhdWx0cyB9IGZyb20gJy4vZGVmYXVsdHMudHMnO1xuaW1wb3J0IHtcbiAgY2xlYW5VcmwsXG4gIGVzY2FwZUh0bWxFbnRpdGllcyxcbn0gZnJvbSAnLi9oZWxwZXJzLnRzJztcbmltcG9ydCB7IG90aGVyIH0gZnJvbSAnLi9ydWxlcy50cyc7XG5pbXBvcnQgdHlwZSB7IE1hcmtlZE9wdGlvbnMgfSBmcm9tICcuL01hcmtlZE9wdGlvbnMudHMnO1xuaW1wb3J0IHR5cGUgeyBUb2tlbnMgfSBmcm9tICcuL1Rva2Vucy50cyc7XG5pbXBvcnQgdHlwZSB7IF9QYXJzZXIgfSBmcm9tICcuL1BhcnNlci50cyc7XG5cbi8qKlxuICogUmVuZGVyZXJcbiAqL1xuZXhwb3J0IGNsYXNzIF9SZW5kZXJlcjxQYXJzZXJPdXRwdXQgPSBzdHJpbmcsIFJlbmRlcmVyT3V0cHV0ID0gc3RyaW5nPiB7XG4gIG9wdGlvbnM6IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD47XG4gIHBhcnNlciE6IF9QYXJzZXI8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD47IC8vIHNldCBieSB0aGUgcGFyc2VyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBNYXJrZWRPcHRpb25zPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+KSB7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCBfZGVmYXVsdHM7XG4gIH1cblxuICBzcGFjZSh0b2tlbjogVG9rZW5zLlNwYWNlKTogUmVuZGVyZXJPdXRwdXQge1xuICAgIHJldHVybiAnJyBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIGNvZGUoeyB0ZXh0LCBsYW5nLCBlc2NhcGVkIH06IFRva2Vucy5Db2RlKTogUmVuZGVyZXJPdXRwdXQge1xuICAgIGNvbnN0IGxhbmdTdHJpbmcgPSAobGFuZyB8fCAnJykubWF0Y2gob3RoZXIubm90U3BhY2VTdGFydCk/LlswXTtcblxuICAgIGNvbnN0IGNvZGUgPSB0ZXh0LnJlcGxhY2Uob3RoZXIuZW5kaW5nTmV3bGluZSwgJycpICsgJ1xcbic7XG5cbiAgICBpZiAoIWxhbmdTdHJpbmcpIHtcbiAgICAgIHJldHVybiAnPHByZT48Y29kZT4nXG4gICAgICAgICsgKGVzY2FwZWQgPyBjb2RlIDogZXNjYXBlSHRtbEVudGl0aWVzKGNvZGUsIHRydWUpKVxuICAgICAgICArICc8L2NvZGU+PC9wcmU+XFxuJyBhcyBSZW5kZXJlck91dHB1dDtcbiAgICB9XG5cbiAgICByZXR1cm4gJzxwcmU+PGNvZGUgY2xhc3M9XCJsYW5ndWFnZS0nXG4gICAgICArIGVzY2FwZUh0bWxFbnRpdGllcyhsYW5nU3RyaW5nKVxuICAgICAgKyAnXCI+J1xuICAgICAgKyAoZXNjYXBlZCA/IGNvZGUgOiBlc2NhcGVIdG1sRW50aXRpZXMoY29kZSwgdHJ1ZSkpXG4gICAgICArICc8L2NvZGU+PC9wcmU+XFxuJyBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIGJsb2NrcXVvdGUoeyB0b2tlbnMgfTogVG9rZW5zLkJsb2NrcXVvdGUpOiBSZW5kZXJlck91dHB1dCB7XG4gICAgY29uc3QgYm9keSA9IHRoaXMucGFyc2VyLnBhcnNlKHRva2Vucyk7XG4gICAgcmV0dXJuIGA8YmxvY2txdW90ZT5cXG4ke2JvZHl9PC9ibG9ja3F1b3RlPlxcbmAgYXMgUmVuZGVyZXJPdXRwdXQ7XG4gIH1cblxuICBodG1sKHsgdGV4dCB9OiBUb2tlbnMuSFRNTCB8IFRva2Vucy5UYWcpOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuIHRleHQgYXMgUmVuZGVyZXJPdXRwdXQ7XG4gIH1cblxuICBkZWYodG9rZW46IFRva2Vucy5EZWYpOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuICcnIGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgaGVhZGluZyh7IHRva2VucywgZGVwdGggfTogVG9rZW5zLkhlYWRpbmcpOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuIGA8aCR7ZGVwdGh9PiR7dGhpcy5wYXJzZXIucGFyc2VJbmxpbmUodG9rZW5zKX08L2gke2RlcHRofT5cXG5gIGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgaHIodG9rZW46IFRva2Vucy5Icik6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICByZXR1cm4gJzxocj5cXG4nIGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgbGlzdCh0b2tlbjogVG9rZW5zLkxpc3QpOiBSZW5kZXJlck91dHB1dCB7XG4gICAgY29uc3Qgb3JkZXJlZCA9IHRva2VuLm9yZGVyZWQ7XG4gICAgY29uc3Qgc3RhcnQgPSB0b2tlbi5zdGFydDtcblxuICAgIGxldCBib2R5ID0gJyc7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCB0b2tlbi5pdGVtcy5sZW5ndGg7IGorKykge1xuICAgICAgY29uc3QgaXRlbSA9IHRva2VuLml0ZW1zW2pdO1xuICAgICAgYm9keSArPSB0aGlzLmxpc3RpdGVtKGl0ZW0pO1xuICAgIH1cblxuICAgIGNvbnN0IHR5cGUgPSBvcmRlcmVkID8gJ29sJyA6ICd1bCc7XG4gICAgY29uc3Qgc3RhcnRBdHRyID0gKG9yZGVyZWQgJiYgc3RhcnQgIT09IDEpID8gKCcgc3RhcnQ9XCInICsgc3RhcnQgKyAnXCInKSA6ICcnO1xuICAgIHJldHVybiAnPCcgKyB0eXBlICsgc3RhcnRBdHRyICsgJz5cXG4nICsgYm9keSArICc8LycgKyB0eXBlICsgJz5cXG4nIGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgbGlzdGl0ZW0oaXRlbTogVG9rZW5zLkxpc3RJdGVtKTogUmVuZGVyZXJPdXRwdXQge1xuICAgIHJldHVybiBgPGxpPiR7dGhpcy5wYXJzZXIucGFyc2UoaXRlbS50b2tlbnMpfTwvbGk+XFxuYCBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIGNoZWNrYm94KHsgY2hlY2tlZCB9OiBUb2tlbnMuQ2hlY2tib3gpOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuICc8aW5wdXQgJ1xuICAgICAgKyAoY2hlY2tlZCA/ICdjaGVja2VkPVwiXCIgJyA6ICcnKVxuICAgICAgKyAnZGlzYWJsZWQ9XCJcIiB0eXBlPVwiY2hlY2tib3hcIj4gJyBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIHBhcmFncmFwaCh7IHRva2VucyB9OiBUb2tlbnMuUGFyYWdyYXBoKTogUmVuZGVyZXJPdXRwdXQge1xuICAgIHJldHVybiBgPHA+JHt0aGlzLnBhcnNlci5wYXJzZUlubGluZSh0b2tlbnMpfTwvcD5cXG5gIGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgdGFibGUodG9rZW46IFRva2Vucy5UYWJsZSk6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICBsZXQgaGVhZGVyID0gJyc7XG5cbiAgICAvLyBoZWFkZXJcbiAgICBsZXQgY2VsbCA9ICcnO1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgdG9rZW4uaGVhZGVyLmxlbmd0aDsgaisrKSB7XG4gICAgICBjZWxsICs9IHRoaXMudGFibGVjZWxsKHRva2VuLmhlYWRlcltqXSk7XG4gICAgfVxuICAgIGhlYWRlciArPSB0aGlzLnRhYmxlcm93KHsgdGV4dDogY2VsbCBhcyBQYXJzZXJPdXRwdXQgfSk7XG5cbiAgICBsZXQgYm9keSA9ICcnO1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgdG9rZW4ucm93cy5sZW5ndGg7IGorKykge1xuICAgICAgY29uc3Qgcm93ID0gdG9rZW4ucm93c1tqXTtcblxuICAgICAgY2VsbCA9ICcnO1xuICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCByb3cubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgY2VsbCArPSB0aGlzLnRhYmxlY2VsbChyb3dba10pO1xuICAgICAgfVxuXG4gICAgICBib2R5ICs9IHRoaXMudGFibGVyb3coeyB0ZXh0OiBjZWxsIGFzIFBhcnNlck91dHB1dCB9KTtcbiAgICB9XG4gICAgaWYgKGJvZHkpIGJvZHkgPSBgPHRib2R5PiR7Ym9keX08L3Rib2R5PmA7XG5cbiAgICByZXR1cm4gJzx0YWJsZT5cXG4nXG4gICAgICArICc8dGhlYWQ+XFxuJ1xuICAgICAgKyBoZWFkZXJcbiAgICAgICsgJzwvdGhlYWQ+XFxuJ1xuICAgICAgKyBib2R5XG4gICAgICArICc8L3RhYmxlPlxcbicgYXMgUmVuZGVyZXJPdXRwdXQ7XG4gIH1cblxuICB0YWJsZXJvdyh7IHRleHQgfTogVG9rZW5zLlRhYmxlUm93PFBhcnNlck91dHB1dD4pOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuIGA8dHI+XFxuJHt0ZXh0fTwvdHI+XFxuYCBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIHRhYmxlY2VsbCh0b2tlbjogVG9rZW5zLlRhYmxlQ2VsbCk6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICBjb25zdCBjb250ZW50ID0gdGhpcy5wYXJzZXIucGFyc2VJbmxpbmUodG9rZW4udG9rZW5zKTtcbiAgICBjb25zdCB0eXBlID0gdG9rZW4uaGVhZGVyID8gJ3RoJyA6ICd0ZCc7XG4gICAgY29uc3QgdGFnID0gdG9rZW4uYWxpZ25cbiAgICAgID8gYDwke3R5cGV9IGFsaWduPVwiJHt0b2tlbi5hbGlnbn1cIj5gXG4gICAgICA6IGA8JHt0eXBlfT5gO1xuICAgIHJldHVybiB0YWcgKyBjb250ZW50ICsgYDwvJHt0eXBlfT5cXG5gIGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgLyoqXG4gICAqIHNwYW4gbGV2ZWwgcmVuZGVyZXJcbiAgICovXG4gIHN0cm9uZyh7IHRva2VucyB9OiBUb2tlbnMuU3Ryb25nKTogUmVuZGVyZXJPdXRwdXQge1xuICAgIHJldHVybiBgPHN0cm9uZz4ke3RoaXMucGFyc2VyLnBhcnNlSW5saW5lKHRva2Vucyl9PC9zdHJvbmc+YCBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIGVtKHsgdG9rZW5zIH06IFRva2Vucy5FbSk6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICByZXR1cm4gYDxlbT4ke3RoaXMucGFyc2VyLnBhcnNlSW5saW5lKHRva2Vucyl9PC9lbT5gIGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgY29kZXNwYW4oeyB0ZXh0IH06IFRva2Vucy5Db2Rlc3Bhbik6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICByZXR1cm4gYDxjb2RlPiR7ZXNjYXBlSHRtbEVudGl0aWVzKHRleHQsIHRydWUpfTwvY29kZT5gIGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgYnIodG9rZW46IFRva2Vucy5Ccik6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICByZXR1cm4gJzxicj4nIGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgZGVsKHsgdG9rZW5zIH06IFRva2Vucy5EZWwpOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuIGA8ZGVsPiR7dGhpcy5wYXJzZXIucGFyc2VJbmxpbmUodG9rZW5zKX08L2RlbD5gIGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgbGluayh7IGhyZWYsIHRpdGxlLCB0b2tlbnMgfTogVG9rZW5zLkxpbmspOiBSZW5kZXJlck91dHB1dCB7XG4gICAgY29uc3QgdGV4dCA9IHRoaXMucGFyc2VyLnBhcnNlSW5saW5lKHRva2VucykgYXMgc3RyaW5nO1xuICAgIGNvbnN0IGNsZWFuSHJlZiA9IGNsZWFuVXJsKGhyZWYpO1xuICAgIGlmIChjbGVhbkhyZWYgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiB0ZXh0IGFzIFJlbmRlcmVyT3V0cHV0O1xuICAgIH1cbiAgICBocmVmID0gY2xlYW5IcmVmO1xuICAgIGxldCBvdXQgPSAnPGEgaHJlZj1cIicgKyBocmVmICsgJ1wiJztcbiAgICBpZiAodGl0bGUpIHtcbiAgICAgIG91dCArPSAnIHRpdGxlPVwiJyArIChlc2NhcGVIdG1sRW50aXRpZXModGl0bGUpKSArICdcIic7XG4gICAgfVxuICAgIG91dCArPSAnPicgKyB0ZXh0ICsgJzwvYT4nO1xuICAgIHJldHVybiBvdXQgYXMgUmVuZGVyZXJPdXRwdXQ7XG4gIH1cblxuICBpbWFnZSh7IGhyZWYsIHRpdGxlLCB0ZXh0LCB0b2tlbnMgfTogVG9rZW5zLkltYWdlKTogUmVuZGVyZXJPdXRwdXQge1xuICAgIGlmICh0b2tlbnMpIHtcbiAgICAgIHRleHQgPSB0aGlzLnBhcnNlci5wYXJzZUlubGluZSh0b2tlbnMsIHRoaXMucGFyc2VyLnRleHRSZW5kZXJlcikgYXMgc3RyaW5nO1xuICAgIH1cbiAgICBjb25zdCBjbGVhbkhyZWYgPSBjbGVhblVybChocmVmKTtcbiAgICBpZiAoY2xlYW5IcmVmID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gZXNjYXBlSHRtbEVudGl0aWVzKHRleHQpIGFzIFJlbmRlcmVyT3V0cHV0O1xuICAgIH1cbiAgICBocmVmID0gY2xlYW5IcmVmO1xuXG4gICAgbGV0IG91dCA9IGA8aW1nIHNyYz1cIiR7aHJlZn1cIiBhbHQ9XCIke2VzY2FwZUh0bWxFbnRpdGllcyh0ZXh0KX1cImA7XG4gICAgaWYgKHRpdGxlKSB7XG4gICAgICBvdXQgKz0gYCB0aXRsZT1cIiR7ZXNjYXBlSHRtbEVudGl0aWVzKHRpdGxlKX1cImA7XG4gICAgfVxuICAgIG91dCArPSAnPic7XG4gICAgcmV0dXJuIG91dCBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIHRleHQodG9rZW46IFRva2Vucy5UZXh0IHwgVG9rZW5zLkVzY2FwZSk6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICByZXR1cm4gJ3Rva2VucycgaW4gdG9rZW4gJiYgdG9rZW4udG9rZW5zXG4gICAgICA/IHRoaXMucGFyc2VyLnBhcnNlSW5saW5lKHRva2VuLnRva2VucykgYXMgdW5rbm93biBhcyBSZW5kZXJlck91dHB1dFxuICAgICAgOiAoJ2VzY2FwZWQnIGluIHRva2VuICYmIHRva2VuLmVzY2FwZWQgPyB0b2tlbi50ZXh0IGFzIFJlbmRlcmVyT3V0cHV0IDogZXNjYXBlSHRtbEVudGl0aWVzKHRva2VuLnRleHQpIGFzIFJlbmRlcmVyT3V0cHV0KTtcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgVG9rZW5zIH0gZnJvbSAnLi9Ub2tlbnMudHMnO1xuXG4vKipcbiAqIFRleHRSZW5kZXJlclxuICogcmV0dXJucyBvbmx5IHRoZSB0ZXh0dWFsIHBhcnQgb2YgdGhlIHRva2VuXG4gKi9cbmV4cG9ydCBjbGFzcyBfVGV4dFJlbmRlcmVyPFJlbmRlcmVyT3V0cHV0ID0gc3RyaW5nPiB7XG4gIC8vIG5vIG5lZWQgZm9yIGJsb2NrIGxldmVsIHJlbmRlcmVyc1xuICBzdHJvbmcoeyB0ZXh0IH06IFRva2Vucy5TdHJvbmcpOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuIHRleHQgYXMgUmVuZGVyZXJPdXRwdXQ7XG4gIH1cblxuICBlbSh7IHRleHQgfTogVG9rZW5zLkVtKTogUmVuZGVyZXJPdXRwdXQge1xuICAgIHJldHVybiB0ZXh0IGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgY29kZXNwYW4oeyB0ZXh0IH06IFRva2Vucy5Db2Rlc3Bhbik6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICByZXR1cm4gdGV4dCBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIGRlbCh7IHRleHQgfTogVG9rZW5zLkRlbCk6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICByZXR1cm4gdGV4dCBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIGh0bWwoeyB0ZXh0IH06IFRva2Vucy5IVE1MIHwgVG9rZW5zLlRhZyk6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICByZXR1cm4gdGV4dCBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIHRleHQoeyB0ZXh0IH06IFRva2Vucy5UZXh0IHwgVG9rZW5zLkVzY2FwZSB8IFRva2Vucy5UYWcpOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuIHRleHQgYXMgUmVuZGVyZXJPdXRwdXQ7XG4gIH1cblxuICBsaW5rKHsgdGV4dCB9OiBUb2tlbnMuTGluayk6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICByZXR1cm4gJycgKyB0ZXh0IGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgaW1hZ2UoeyB0ZXh0IH06IFRva2Vucy5JbWFnZSk6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICByZXR1cm4gJycgKyB0ZXh0IGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgYnIoKTogUmVuZGVyZXJPdXRwdXQge1xuICAgIHJldHVybiAnJyBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIGNoZWNrYm94KHsgcmF3IH06IFRva2Vucy5DaGVja2JveCk6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICByZXR1cm4gcmF3IGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgX1JlbmRlcmVyIH0gZnJvbSAnLi9SZW5kZXJlci50cyc7XG5pbXBvcnQgeyBfVGV4dFJlbmRlcmVyIH0gZnJvbSAnLi9UZXh0UmVuZGVyZXIudHMnO1xuaW1wb3J0IHsgX2RlZmF1bHRzIH0gZnJvbSAnLi9kZWZhdWx0cy50cyc7XG5pbXBvcnQgdHlwZSB7IE1hcmtlZFRva2VuLCBUb2tlbiwgVG9rZW5zIH0gZnJvbSAnLi9Ub2tlbnMudHMnO1xuaW1wb3J0IHR5cGUgeyBNYXJrZWRPcHRpb25zIH0gZnJvbSAnLi9NYXJrZWRPcHRpb25zLnRzJztcblxuLyoqXG4gKiBQYXJzaW5nICYgQ29tcGlsaW5nXG4gKi9cbmV4cG9ydCBjbGFzcyBfUGFyc2VyPFBhcnNlck91dHB1dCA9IHN0cmluZywgUmVuZGVyZXJPdXRwdXQgPSBzdHJpbmc+IHtcbiAgb3B0aW9uczogTWFya2VkT3B0aW9uczxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0PjtcbiAgcmVuZGVyZXI6IF9SZW5kZXJlcjxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0PjtcbiAgdGV4dFJlbmRlcmVyOiBfVGV4dFJlbmRlcmVyPFJlbmRlcmVyT3V0cHV0PjtcbiAgY29uc3RydWN0b3Iob3B0aW9ucz86IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4pIHtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IF9kZWZhdWx0cztcbiAgICB0aGlzLm9wdGlvbnMucmVuZGVyZXIgPSB0aGlzLm9wdGlvbnMucmVuZGVyZXIgfHwgbmV3IF9SZW5kZXJlcjxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0PigpO1xuICAgIHRoaXMucmVuZGVyZXIgPSB0aGlzLm9wdGlvbnMucmVuZGVyZXI7XG4gICAgdGhpcy5yZW5kZXJlci5vcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgIHRoaXMucmVuZGVyZXIucGFyc2VyID0gdGhpcztcbiAgICB0aGlzLnRleHRSZW5kZXJlciA9IG5ldyBfVGV4dFJlbmRlcmVyPFJlbmRlcmVyT3V0cHV0PigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXRpYyBQYXJzZSBNZXRob2RcbiAgICovXG4gIHN0YXRpYyBwYXJzZTxQYXJzZXJPdXRwdXQgPSBzdHJpbmcsIFJlbmRlcmVyT3V0cHV0ID0gc3RyaW5nPih0b2tlbnM6IFRva2VuW10sIG9wdGlvbnM/OiBNYXJrZWRPcHRpb25zPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+KSB7XG4gICAgY29uc3QgcGFyc2VyID0gbmV3IF9QYXJzZXI8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4ob3B0aW9ucyk7XG4gICAgcmV0dXJuIHBhcnNlci5wYXJzZSh0b2tlbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXRpYyBQYXJzZSBJbmxpbmUgTWV0aG9kXG4gICAqL1xuICBzdGF0aWMgcGFyc2VJbmxpbmU8UGFyc2VyT3V0cHV0ID0gc3RyaW5nLCBSZW5kZXJlck91dHB1dCA9IHN0cmluZz4odG9rZW5zOiBUb2tlbltdLCBvcHRpb25zPzogTWFya2VkT3B0aW9uczxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0Pikge1xuICAgIGNvbnN0IHBhcnNlciA9IG5ldyBfUGFyc2VyPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+KG9wdGlvbnMpO1xuICAgIHJldHVybiBwYXJzZXIucGFyc2VJbmxpbmUodG9rZW5zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBMb29wXG4gICAqL1xuICBwYXJzZSh0b2tlbnM6IFRva2VuW10pOiBQYXJzZXJPdXRwdXQge1xuICAgIHRoaXMucmVuZGVyZXIucGFyc2VyID0gdGhpcztcbiAgICBsZXQgb3V0ID0gJyc7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgYW55VG9rZW4gPSB0b2tlbnNbaV07XG5cbiAgICAgIC8vIFJ1biBhbnkgcmVuZGVyZXIgZXh0ZW5zaW9uc1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5leHRlbnNpb25zPy5yZW5kZXJlcnM/LlthbnlUb2tlbi50eXBlXSkge1xuICAgICAgICBjb25zdCBnZW5lcmljVG9rZW4gPSBhbnlUb2tlbiBhcyBUb2tlbnMuR2VuZXJpYztcbiAgICAgICAgY29uc3QgcmV0ID0gdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMucmVuZGVyZXJzW2dlbmVyaWNUb2tlbi50eXBlXS5jYWxsKHsgcGFyc2VyOiB0aGlzIH0sIGdlbmVyaWNUb2tlbik7XG4gICAgICAgIGlmIChyZXQgIT09IGZhbHNlIHx8ICFbJ3NwYWNlJywgJ2hyJywgJ2hlYWRpbmcnLCAnY29kZScsICd0YWJsZScsICdibG9ja3F1b3RlJywgJ2xpc3QnLCAnaHRtbCcsICdkZWYnLCAncGFyYWdyYXBoJywgJ3RleHQnXS5pbmNsdWRlcyhnZW5lcmljVG9rZW4udHlwZSkpIHtcbiAgICAgICAgICBvdXQgKz0gcmV0IHx8ICcnO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRva2VuID0gYW55VG9rZW4gYXMgTWFya2VkVG9rZW47XG5cbiAgICAgIHN3aXRjaCAodG9rZW4udHlwZSkge1xuICAgICAgICBjYXNlICdzcGFjZSc6IHtcbiAgICAgICAgICBvdXQgKz0gdGhpcy5yZW5kZXJlci5zcGFjZSh0b2tlbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnaHInOiB7XG4gICAgICAgICAgb3V0ICs9IHRoaXMucmVuZGVyZXIuaHIodG9rZW4pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2hlYWRpbmcnOiB7XG4gICAgICAgICAgb3V0ICs9IHRoaXMucmVuZGVyZXIuaGVhZGluZyh0b2tlbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnY29kZSc6IHtcbiAgICAgICAgICBvdXQgKz0gdGhpcy5yZW5kZXJlci5jb2RlKHRva2VuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0YWJsZSc6IHtcbiAgICAgICAgICBvdXQgKz0gdGhpcy5yZW5kZXJlci50YWJsZSh0b2tlbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnYmxvY2txdW90ZSc6IHtcbiAgICAgICAgICBvdXQgKz0gdGhpcy5yZW5kZXJlci5ibG9ja3F1b3RlKHRva2VuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdsaXN0Jzoge1xuICAgICAgICAgIG91dCArPSB0aGlzLnJlbmRlcmVyLmxpc3QodG9rZW4pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2NoZWNrYm94Jzoge1xuICAgICAgICAgIG91dCArPSB0aGlzLnJlbmRlcmVyLmNoZWNrYm94KHRva2VuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdodG1sJzoge1xuICAgICAgICAgIG91dCArPSB0aGlzLnJlbmRlcmVyLmh0bWwodG9rZW4pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RlZic6IHtcbiAgICAgICAgICBvdXQgKz0gdGhpcy5yZW5kZXJlci5kZWYodG9rZW4pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3BhcmFncmFwaCc6IHtcbiAgICAgICAgICBvdXQgKz0gdGhpcy5yZW5kZXJlci5wYXJhZ3JhcGgodG9rZW4pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3RleHQnOiB7XG4gICAgICAgICAgb3V0ICs9IHRoaXMucmVuZGVyZXIudGV4dCh0b2tlbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgY29uc3QgZXJyTXNnID0gJ1Rva2VuIHdpdGggXCInICsgdG9rZW4udHlwZSArICdcIiB0eXBlIHdhcyBub3QgZm91bmQuJztcbiAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNpbGVudCkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJNc2cpO1xuICAgICAgICAgICAgcmV0dXJuICcnIGFzIFBhcnNlck91dHB1dDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVyck1zZyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dCBhcyBQYXJzZXJPdXRwdXQ7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgSW5saW5lIFRva2Vuc1xuICAgKi9cbiAgcGFyc2VJbmxpbmUodG9rZW5zOiBUb2tlbltdLCByZW5kZXJlcjogX1JlbmRlcmVyPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+IHwgX1RleHRSZW5kZXJlcjxSZW5kZXJlck91dHB1dD4gPSB0aGlzLnJlbmRlcmVyKTogUGFyc2VyT3V0cHV0IHtcbiAgICB0aGlzLnJlbmRlcmVyLnBhcnNlciA9IHRoaXM7XG4gICAgbGV0IG91dCA9ICcnO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGFueVRva2VuID0gdG9rZW5zW2ldO1xuXG4gICAgICAvLyBSdW4gYW55IHJlbmRlcmVyIGV4dGVuc2lvbnNcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucz8ucmVuZGVyZXJzPy5bYW55VG9rZW4udHlwZV0pIHtcbiAgICAgICAgY29uc3QgcmV0ID0gdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMucmVuZGVyZXJzW2FueVRva2VuLnR5cGVdLmNhbGwoeyBwYXJzZXI6IHRoaXMgfSwgYW55VG9rZW4pO1xuICAgICAgICBpZiAocmV0ICE9PSBmYWxzZSB8fCAhWydlc2NhcGUnLCAnaHRtbCcsICdsaW5rJywgJ2ltYWdlJywgJ3N0cm9uZycsICdlbScsICdjb2Rlc3BhbicsICdicicsICdkZWwnLCAndGV4dCddLmluY2x1ZGVzKGFueVRva2VuLnR5cGUpKSB7XG4gICAgICAgICAgb3V0ICs9IHJldCB8fCAnJztcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCB0b2tlbiA9IGFueVRva2VuIGFzIE1hcmtlZFRva2VuO1xuXG4gICAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnZXNjYXBlJzoge1xuICAgICAgICAgIG91dCArPSByZW5kZXJlci50ZXh0KHRva2VuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdodG1sJzoge1xuICAgICAgICAgIG91dCArPSByZW5kZXJlci5odG1sKHRva2VuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdsaW5rJzoge1xuICAgICAgICAgIG91dCArPSByZW5kZXJlci5saW5rKHRva2VuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdpbWFnZSc6IHtcbiAgICAgICAgICBvdXQgKz0gcmVuZGVyZXIuaW1hZ2UodG9rZW4pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2NoZWNrYm94Jzoge1xuICAgICAgICAgIG91dCArPSByZW5kZXJlci5jaGVja2JveCh0b2tlbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc3Ryb25nJzoge1xuICAgICAgICAgIG91dCArPSByZW5kZXJlci5zdHJvbmcodG9rZW4pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2VtJzoge1xuICAgICAgICAgIG91dCArPSByZW5kZXJlci5lbSh0b2tlbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnY29kZXNwYW4nOiB7XG4gICAgICAgICAgb3V0ICs9IHJlbmRlcmVyLmNvZGVzcGFuKHRva2VuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdicic6IHtcbiAgICAgICAgICBvdXQgKz0gcmVuZGVyZXIuYnIodG9rZW4pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RlbCc6IHtcbiAgICAgICAgICBvdXQgKz0gcmVuZGVyZXIuZGVsKHRva2VuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0ZXh0Jzoge1xuICAgICAgICAgIG91dCArPSByZW5kZXJlci50ZXh0KHRva2VuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgY29uc3QgZXJyTXNnID0gJ1Rva2VuIHdpdGggXCInICsgdG9rZW4udHlwZSArICdcIiB0eXBlIHdhcyBub3QgZm91bmQuJztcbiAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNpbGVudCkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJNc2cpO1xuICAgICAgICAgICAgcmV0dXJuICcnIGFzIFBhcnNlck91dHB1dDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVyck1zZyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXQgYXMgUGFyc2VyT3V0cHV0O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgX2RlZmF1bHRzIH0gZnJvbSAnLi9kZWZhdWx0cy50cyc7XG5pbXBvcnQgeyBfTGV4ZXIgfSBmcm9tICcuL0xleGVyLnRzJztcbmltcG9ydCB7IF9QYXJzZXIgfSBmcm9tICcuL1BhcnNlci50cyc7XG5pbXBvcnQgdHlwZSB7IE1hcmtlZE9wdGlvbnMgfSBmcm9tICcuL01hcmtlZE9wdGlvbnMudHMnO1xuaW1wb3J0IHR5cGUgeyBUb2tlbiwgVG9rZW5zTGlzdCB9IGZyb20gJy4vVG9rZW5zLnRzJztcblxuZXhwb3J0IGNsYXNzIF9Ib29rczxQYXJzZXJPdXRwdXQgPSBzdHJpbmcsIFJlbmRlcmVyT3V0cHV0ID0gc3RyaW5nPiB7XG4gIG9wdGlvbnM6IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD47XG4gIGJsb2NrPzogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zPzogTWFya2VkT3B0aW9uczxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0Pikge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwgX2RlZmF1bHRzO1xuICB9XG5cbiAgc3RhdGljIHBhc3NUaHJvdWdoSG9va3MgPSBuZXcgU2V0KFtcbiAgICAncHJlcHJvY2VzcycsXG4gICAgJ3Bvc3Rwcm9jZXNzJyxcbiAgICAncHJvY2Vzc0FsbFRva2VucycsXG4gICAgJ2VtU3Ryb25nTWFzaycsXG4gIF0pO1xuXG4gIHN0YXRpYyBwYXNzVGhyb3VnaEhvb2tzUmVzcGVjdEFzeW5jID0gbmV3IFNldChbXG4gICAgJ3ByZXByb2Nlc3MnLFxuICAgICdwb3N0cHJvY2VzcycsXG4gICAgJ3Byb2Nlc3NBbGxUb2tlbnMnLFxuICBdKTtcblxuICAvKipcbiAgICogUHJvY2VzcyBtYXJrZG93biBiZWZvcmUgbWFya2VkXG4gICAqL1xuICBwcmVwcm9jZXNzKG1hcmtkb3duOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gbWFya2Rvd247XG4gIH1cblxuICAvKipcbiAgICogUHJvY2VzcyBIVE1MIGFmdGVyIG1hcmtlZCBpcyBmaW5pc2hlZFxuICAgKi9cbiAgcG9zdHByb2Nlc3MoaHRtbDogUGFyc2VyT3V0cHV0KSB7XG4gICAgcmV0dXJuIGh0bWw7XG4gIH1cblxuICAvKipcbiAgICogUHJvY2VzcyBhbGwgdG9rZW5zIGJlZm9yZSB3YWxrIHRva2Vuc1xuICAgKi9cbiAgcHJvY2Vzc0FsbFRva2Vucyh0b2tlbnM6IFRva2VuW10gfCBUb2tlbnNMaXN0KSB7XG4gICAgcmV0dXJuIHRva2VucztcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXNrIGNvbnRlbnRzIHRoYXQgc2hvdWxkIG5vdCBiZSBpbnRlcnByZXRlZCBhcyBlbS9zdHJvbmcgZGVsaW1pdGVyc1xuICAgKi9cbiAgZW1TdHJvbmdNYXNrKHNyYzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHNyYztcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm92aWRlIGZ1bmN0aW9uIHRvIHRva2VuaXplIG1hcmtkb3duXG4gICAqL1xuICBwcm92aWRlTGV4ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuYmxvY2sgPyBfTGV4ZXIubGV4IDogX0xleGVyLmxleElubGluZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm92aWRlIGZ1bmN0aW9uIHRvIHBhcnNlIHRva2Vuc1xuICAgKi9cbiAgcHJvdmlkZVBhcnNlcigpIHtcbiAgICByZXR1cm4gdGhpcy5ibG9jayA/IF9QYXJzZXIucGFyc2U8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4gOiBfUGFyc2VyLnBhcnNlSW5saW5lPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgX2dldERlZmF1bHRzIH0gZnJvbSAnLi9kZWZhdWx0cy50cyc7XG5pbXBvcnQgeyBfTGV4ZXIgfSBmcm9tICcuL0xleGVyLnRzJztcbmltcG9ydCB7IF9QYXJzZXIgfSBmcm9tICcuL1BhcnNlci50cyc7XG5pbXBvcnQgeyBfSG9va3MgfSBmcm9tICcuL0hvb2tzLnRzJztcbmltcG9ydCB7IF9SZW5kZXJlciB9IGZyb20gJy4vUmVuZGVyZXIudHMnO1xuaW1wb3J0IHsgX1Rva2VuaXplciB9IGZyb20gJy4vVG9rZW5pemVyLnRzJztcbmltcG9ydCB7IF9UZXh0UmVuZGVyZXIgfSBmcm9tICcuL1RleHRSZW5kZXJlci50cyc7XG5pbXBvcnQgeyBlc2NhcGVIdG1sRW50aXRpZXMgfSBmcm9tICcuL2hlbHBlcnMudHMnO1xuaW1wb3J0IHR5cGUgeyBNYXJrZWRFeHRlbnNpb24sIE1hcmtlZE9wdGlvbnMgfSBmcm9tICcuL01hcmtlZE9wdGlvbnMudHMnO1xuaW1wb3J0IHR5cGUgeyBUb2tlbiwgVG9rZW5zLCBUb2tlbnNMaXN0IH0gZnJvbSAnLi9Ub2tlbnMudHMnO1xuXG5leHBvcnQgdHlwZSBNYXliZVByb21pc2UgPSB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcblxudHlwZSBVbmtub3duRnVuY3Rpb24gPSAoLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duO1xudHlwZSBHZW5lcmljUmVuZGVyZXJGdW5jdGlvbiA9ICguLi5hcmdzOiB1bmtub3duW10pID0+IHN0cmluZyB8IGZhbHNlO1xuXG5leHBvcnQgY2xhc3MgTWFya2VkPFBhcnNlck91dHB1dCA9IHN0cmluZywgUmVuZGVyZXJPdXRwdXQgPSBzdHJpbmc+IHtcbiAgZGVmYXVsdHMgPSBfZ2V0RGVmYXVsdHM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4oKTtcbiAgb3B0aW9ucyA9IHRoaXMuc2V0T3B0aW9ucztcblxuICBwYXJzZSA9IHRoaXMucGFyc2VNYXJrZG93bih0cnVlKTtcbiAgcGFyc2VJbmxpbmUgPSB0aGlzLnBhcnNlTWFya2Rvd24oZmFsc2UpO1xuXG4gIFBhcnNlciA9IF9QYXJzZXI8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD47XG4gIFJlbmRlcmVyID0gX1JlbmRlcmVyPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+O1xuICBUZXh0UmVuZGVyZXIgPSBfVGV4dFJlbmRlcmVyPFJlbmRlcmVyT3V0cHV0PjtcbiAgTGV4ZXIgPSBfTGV4ZXI7XG4gIFRva2VuaXplciA9IF9Ub2tlbml6ZXI8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD47XG4gIEhvb2tzID0gX0hvb2tzPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+O1xuXG4gIGNvbnN0cnVjdG9yKC4uLmFyZ3M6IE1hcmtlZEV4dGVuc2lvbjxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0PltdKSB7XG4gICAgdGhpcy51c2UoLi4uYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogUnVuIGNhbGxiYWNrIGZvciBldmVyeSB0b2tlblxuICAgKi9cbiAgd2Fsa1Rva2Vucyh0b2tlbnM6IFRva2VuW10gfCBUb2tlbnNMaXN0LCBjYWxsYmFjazogKHRva2VuOiBUb2tlbikgPT4gTWF5YmVQcm9taXNlIHwgTWF5YmVQcm9taXNlW10pIHtcbiAgICBsZXQgdmFsdWVzOiBNYXliZVByb21pc2VbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdG9rZW5zKSB7XG4gICAgICB2YWx1ZXMgPSB2YWx1ZXMuY29uY2F0KGNhbGxiYWNrLmNhbGwodGhpcywgdG9rZW4pKTtcbiAgICAgIHN3aXRjaCAodG9rZW4udHlwZSkge1xuICAgICAgICBjYXNlICd0YWJsZSc6IHtcbiAgICAgICAgICBjb25zdCB0YWJsZVRva2VuID0gdG9rZW4gYXMgVG9rZW5zLlRhYmxlO1xuICAgICAgICAgIGZvciAoY29uc3QgY2VsbCBvZiB0YWJsZVRva2VuLmhlYWRlcikge1xuICAgICAgICAgICAgdmFsdWVzID0gdmFsdWVzLmNvbmNhdCh0aGlzLndhbGtUb2tlbnMoY2VsbC50b2tlbnMsIGNhbGxiYWNrKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvciAoY29uc3Qgcm93IG9mIHRhYmxlVG9rZW4ucm93cykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBjZWxsIG9mIHJvdykge1xuICAgICAgICAgICAgICB2YWx1ZXMgPSB2YWx1ZXMuY29uY2F0KHRoaXMud2Fsa1Rva2VucyhjZWxsLnRva2VucywgY2FsbGJhY2spKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnbGlzdCc6IHtcbiAgICAgICAgICBjb25zdCBsaXN0VG9rZW4gPSB0b2tlbiBhcyBUb2tlbnMuTGlzdDtcbiAgICAgICAgICB2YWx1ZXMgPSB2YWx1ZXMuY29uY2F0KHRoaXMud2Fsa1Rva2VucyhsaXN0VG9rZW4uaXRlbXMsIGNhbGxiYWNrKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIGNvbnN0IGdlbmVyaWNUb2tlbiA9IHRva2VuIGFzIFRva2Vucy5HZW5lcmljO1xuICAgICAgICAgIGlmICh0aGlzLmRlZmF1bHRzLmV4dGVuc2lvbnM/LmNoaWxkVG9rZW5zPy5bZ2VuZXJpY1Rva2VuLnR5cGVdKSB7XG4gICAgICAgICAgICB0aGlzLmRlZmF1bHRzLmV4dGVuc2lvbnMuY2hpbGRUb2tlbnNbZ2VuZXJpY1Rva2VuLnR5cGVdLmZvckVhY2goKGNoaWxkVG9rZW5zKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHRva2VucyA9IGdlbmVyaWNUb2tlbltjaGlsZFRva2Vuc10uZmxhdChJbmZpbml0eSkgYXMgVG9rZW5bXSB8IFRva2Vuc0xpc3Q7XG4gICAgICAgICAgICAgIHZhbHVlcyA9IHZhbHVlcy5jb25jYXQodGhpcy53YWxrVG9rZW5zKHRva2VucywgY2FsbGJhY2spKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZ2VuZXJpY1Rva2VuLnRva2Vucykge1xuICAgICAgICAgICAgdmFsdWVzID0gdmFsdWVzLmNvbmNhdCh0aGlzLndhbGtUb2tlbnMoZ2VuZXJpY1Rva2VuLnRva2VucywgY2FsbGJhY2spKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfVxuXG4gIHVzZSguLi5hcmdzOiBNYXJrZWRFeHRlbnNpb248UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD5bXSkge1xuICAgIGNvbnN0IGV4dGVuc2lvbnM6IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD5bJ2V4dGVuc2lvbnMnXSA9IHRoaXMuZGVmYXVsdHMuZXh0ZW5zaW9ucyB8fCB7IHJlbmRlcmVyczoge30sIGNoaWxkVG9rZW5zOiB7fSB9O1xuXG4gICAgYXJncy5mb3JFYWNoKChwYWNrKSA9PiB7XG4gICAgICAvLyBjb3B5IG9wdGlvbnMgdG8gbmV3IG9iamVjdFxuICAgICAgY29uc3Qgb3B0cyA9IHsgLi4ucGFjayB9IGFzIE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD47XG5cbiAgICAgIC8vIHNldCBhc3luYyB0byB0cnVlIGlmIGl0IHdhcyBzZXQgdG8gdHJ1ZSBiZWZvcmVcbiAgICAgIG9wdHMuYXN5bmMgPSB0aGlzLmRlZmF1bHRzLmFzeW5jIHx8IG9wdHMuYXN5bmMgfHwgZmFsc2U7XG5cbiAgICAgIC8vID09LS0gUGFyc2UgXCJhZGRvblwiIGV4dGVuc2lvbnMgLS09PSAvL1xuICAgICAgaWYgKHBhY2suZXh0ZW5zaW9ucykge1xuICAgICAgICBwYWNrLmV4dGVuc2lvbnMuZm9yRWFjaCgoZXh0KSA9PiB7XG4gICAgICAgICAgaWYgKCFleHQubmFtZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHRlbnNpb24gbmFtZSByZXF1aXJlZCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoJ3JlbmRlcmVyJyBpbiBleHQpIHsgLy8gUmVuZGVyZXIgZXh0ZW5zaW9uc1xuICAgICAgICAgICAgY29uc3QgcHJldlJlbmRlcmVyID0gZXh0ZW5zaW9ucy5yZW5kZXJlcnNbZXh0Lm5hbWVdO1xuICAgICAgICAgICAgaWYgKHByZXZSZW5kZXJlcikge1xuICAgICAgICAgICAgICAvLyBSZXBsYWNlIGV4dGVuc2lvbiB3aXRoIGZ1bmMgdG8gcnVuIG5ldyBleHRlbnNpb24gYnV0IGZhbGwgYmFjayBpZiBmYWxzZVxuICAgICAgICAgICAgICBleHRlbnNpb25zLnJlbmRlcmVyc1tleHQubmFtZV0gPSBmdW5jdGlvbiguLi5hcmdzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJldCA9IGV4dC5yZW5kZXJlci5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgICAgICAgICBpZiAocmV0ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgcmV0ID0gcHJldlJlbmRlcmVyLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZXh0ZW5zaW9ucy5yZW5kZXJlcnNbZXh0Lm5hbWVdID0gZXh0LnJlbmRlcmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoJ3Rva2VuaXplcicgaW4gZXh0KSB7IC8vIFRva2VuaXplciBFeHRlbnNpb25zXG4gICAgICAgICAgICBpZiAoIWV4dC5sZXZlbCB8fCAoZXh0LmxldmVsICE9PSAnYmxvY2snICYmIGV4dC5sZXZlbCAhPT0gJ2lubGluZScpKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImV4dGVuc2lvbiBsZXZlbCBtdXN0IGJlICdibG9jaycgb3IgJ2lubGluZSdcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBleHRMZXZlbCA9IGV4dGVuc2lvbnNbZXh0LmxldmVsXTtcbiAgICAgICAgICAgIGlmIChleHRMZXZlbCkge1xuICAgICAgICAgICAgICBleHRMZXZlbC51bnNoaWZ0KGV4dC50b2tlbml6ZXIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZXh0ZW5zaW9uc1tleHQubGV2ZWxdID0gW2V4dC50b2tlbml6ZXJdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV4dC5zdGFydCkgeyAvLyBGdW5jdGlvbiB0byBjaGVjayBmb3Igc3RhcnQgb2YgdG9rZW5cbiAgICAgICAgICAgICAgaWYgKGV4dC5sZXZlbCA9PT0gJ2Jsb2NrJykge1xuICAgICAgICAgICAgICAgIGlmIChleHRlbnNpb25zLnN0YXJ0QmxvY2spIHtcbiAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMuc3RhcnRCbG9jay5wdXNoKGV4dC5zdGFydCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMuc3RhcnRCbG9jayA9IFtleHQuc3RhcnRdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChleHQubGV2ZWwgPT09ICdpbmxpbmUnKSB7XG4gICAgICAgICAgICAgICAgaWYgKGV4dGVuc2lvbnMuc3RhcnRJbmxpbmUpIHtcbiAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMuc3RhcnRJbmxpbmUucHVzaChleHQuc3RhcnQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBleHRlbnNpb25zLnN0YXJ0SW5saW5lID0gW2V4dC5zdGFydF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICgnY2hpbGRUb2tlbnMnIGluIGV4dCAmJiBleHQuY2hpbGRUb2tlbnMpIHsgLy8gQ2hpbGQgdG9rZW5zIHRvIGJlIHZpc2l0ZWQgYnkgd2Fsa1Rva2Vuc1xuICAgICAgICAgICAgZXh0ZW5zaW9ucy5jaGlsZFRva2Vuc1tleHQubmFtZV0gPSBleHQuY2hpbGRUb2tlbnM7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgb3B0cy5leHRlbnNpb25zID0gZXh0ZW5zaW9ucztcbiAgICAgIH1cblxuICAgICAgLy8gPT0tLSBQYXJzZSBcIm92ZXJ3cml0ZVwiIGV4dGVuc2lvbnMgLS09PSAvL1xuICAgICAgaWYgKHBhY2sucmVuZGVyZXIpIHtcbiAgICAgICAgY29uc3QgcmVuZGVyZXIgPSB0aGlzLmRlZmF1bHRzLnJlbmRlcmVyIHx8IG5ldyBfUmVuZGVyZXI8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4odGhpcy5kZWZhdWx0cyk7XG4gICAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBwYWNrLnJlbmRlcmVyKSB7XG4gICAgICAgICAgaWYgKCEocHJvcCBpbiByZW5kZXJlcikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgcmVuZGVyZXIgJyR7cHJvcH0nIGRvZXMgbm90IGV4aXN0YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChbJ29wdGlvbnMnLCAncGFyc2VyJ10uaW5jbHVkZXMocHJvcCkpIHtcbiAgICAgICAgICAgIC8vIGlnbm9yZSBvcHRpb25zIHByb3BlcnR5XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcmVuZGVyZXJQcm9wID0gcHJvcCBhcyBFeGNsdWRlPGtleW9mIF9SZW5kZXJlcjxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0PiwgJ29wdGlvbnMnIHwgJ3BhcnNlcic+O1xuICAgICAgICAgIGNvbnN0IHJlbmRlcmVyRnVuYyA9IHBhY2sucmVuZGVyZXJbcmVuZGVyZXJQcm9wXSBhcyBHZW5lcmljUmVuZGVyZXJGdW5jdGlvbjtcbiAgICAgICAgICBjb25zdCBwcmV2UmVuZGVyZXIgPSByZW5kZXJlcltyZW5kZXJlclByb3BdIGFzIEdlbmVyaWNSZW5kZXJlckZ1bmN0aW9uO1xuICAgICAgICAgIC8vIFJlcGxhY2UgcmVuZGVyZXIgd2l0aCBmdW5jIHRvIHJ1biBleHRlbnNpb24sIGJ1dCBmYWxsIGJhY2sgaWYgZmFsc2VcbiAgICAgICAgICByZW5kZXJlcltyZW5kZXJlclByb3BdID0gKC4uLmFyZ3M6IHVua25vd25bXSkgPT4ge1xuICAgICAgICAgICAgbGV0IHJldCA9IHJlbmRlcmVyRnVuYy5hcHBseShyZW5kZXJlciwgYXJncyk7XG4gICAgICAgICAgICBpZiAocmV0ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICByZXQgPSBwcmV2UmVuZGVyZXIuYXBwbHkocmVuZGVyZXIsIGFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIChyZXQgfHwgJycpIGFzIFJlbmRlcmVyT3V0cHV0O1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgb3B0cy5yZW5kZXJlciA9IHJlbmRlcmVyO1xuICAgICAgfVxuICAgICAgaWYgKHBhY2sudG9rZW5pemVyKSB7XG4gICAgICAgIGNvbnN0IHRva2VuaXplciA9IHRoaXMuZGVmYXVsdHMudG9rZW5pemVyIHx8IG5ldyBfVG9rZW5pemVyPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+KHRoaXMuZGVmYXVsdHMpO1xuICAgICAgICBmb3IgKGNvbnN0IHByb3AgaW4gcGFjay50b2tlbml6ZXIpIHtcbiAgICAgICAgICBpZiAoIShwcm9wIGluIHRva2VuaXplcikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdG9rZW5pemVyICcke3Byb3B9JyBkb2VzIG5vdCBleGlzdGApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoWydvcHRpb25zJywgJ3J1bGVzJywgJ2xleGVyJ10uaW5jbHVkZXMocHJvcCkpIHtcbiAgICAgICAgICAgIC8vIGlnbm9yZSBvcHRpb25zLCBydWxlcywgYW5kIGxleGVyIHByb3BlcnRpZXNcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB0b2tlbml6ZXJQcm9wID0gcHJvcCBhcyBFeGNsdWRlPGtleW9mIF9Ub2tlbml6ZXI8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4sICdvcHRpb25zJyB8ICdydWxlcycgfCAnbGV4ZXInPjtcbiAgICAgICAgICBjb25zdCB0b2tlbml6ZXJGdW5jID0gcGFjay50b2tlbml6ZXJbdG9rZW5pemVyUHJvcF0gYXMgVW5rbm93bkZ1bmN0aW9uO1xuICAgICAgICAgIGNvbnN0IHByZXZUb2tlbml6ZXIgPSB0b2tlbml6ZXJbdG9rZW5pemVyUHJvcF0gYXMgVW5rbm93bkZ1bmN0aW9uO1xuICAgICAgICAgIC8vIFJlcGxhY2UgdG9rZW5pemVyIHdpdGggZnVuYyB0byBydW4gZXh0ZW5zaW9uLCBidXQgZmFsbCBiYWNrIGlmIGZhbHNlXG4gICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBjYW5ub3QgdHlwZSB0b2tlbml6ZXIgZnVuY3Rpb24gZHluYW1pY2FsbHlcbiAgICAgICAgICB0b2tlbml6ZXJbdG9rZW5pemVyUHJvcF0gPSAoLi4uYXJnczogdW5rbm93bltdKSA9PiB7XG4gICAgICAgICAgICBsZXQgcmV0ID0gdG9rZW5pemVyRnVuYy5hcHBseSh0b2tlbml6ZXIsIGFyZ3MpO1xuICAgICAgICAgICAgaWYgKHJldCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgcmV0ID0gcHJldlRva2VuaXplci5hcHBseSh0b2tlbml6ZXIsIGFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIG9wdHMudG9rZW5pemVyID0gdG9rZW5pemVyO1xuICAgICAgfVxuXG4gICAgICAvLyA9PS0tIFBhcnNlIEhvb2tzIGV4dGVuc2lvbnMgLS09PSAvL1xuICAgICAgaWYgKHBhY2suaG9va3MpIHtcbiAgICAgICAgY29uc3QgaG9va3MgPSB0aGlzLmRlZmF1bHRzLmhvb2tzIHx8IG5ldyBfSG9va3M8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4oKTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wIGluIHBhY2suaG9va3MpIHtcbiAgICAgICAgICBpZiAoIShwcm9wIGluIGhvb2tzKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBob29rICcke3Byb3B9JyBkb2VzIG5vdCBleGlzdGApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoWydvcHRpb25zJywgJ2Jsb2NrJ10uaW5jbHVkZXMocHJvcCkpIHtcbiAgICAgICAgICAgIC8vIGlnbm9yZSBvcHRpb25zIGFuZCBibG9jayBwcm9wZXJ0aWVzXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgaG9va3NQcm9wID0gcHJvcCBhcyBFeGNsdWRlPGtleW9mIF9Ib29rczxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0PiwgJ29wdGlvbnMnIHwgJ2Jsb2NrJz47XG4gICAgICAgICAgY29uc3QgaG9va3NGdW5jID0gcGFjay5ob29rc1tob29rc1Byb3BdIGFzIFVua25vd25GdW5jdGlvbjtcbiAgICAgICAgICBjb25zdCBwcmV2SG9vayA9IGhvb2tzW2hvb2tzUHJvcF0gYXMgVW5rbm93bkZ1bmN0aW9uO1xuICAgICAgICAgIGlmIChfSG9va3MucGFzc1Rocm91Z2hIb29rcy5oYXMocHJvcCkpIHtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgY2Fubm90IHR5cGUgaG9vayBmdW5jdGlvbiBkeW5hbWljYWxseVxuICAgICAgICAgICAgaG9va3NbaG9va3NQcm9wXSA9IChhcmc6IHVua25vd24pID0+IHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuZGVmYXVsdHMuYXN5bmMgJiYgX0hvb2tzLnBhc3NUaHJvdWdoSG9va3NSZXNwZWN0QXN5bmMuaGFzKHByb3ApKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChhc3luYygpID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJldCA9IGF3YWl0IGhvb2tzRnVuYy5jYWxsKGhvb2tzLCBhcmcpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHByZXZIb29rLmNhbGwoaG9va3MsIHJldCk7XG4gICAgICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNvbnN0IHJldCA9IGhvb2tzRnVuYy5jYWxsKGhvb2tzLCBhcmcpO1xuICAgICAgICAgICAgICByZXR1cm4gcHJldkhvb2suY2FsbChob29rcywgcmV0KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgY2Fubm90IHR5cGUgaG9vayBmdW5jdGlvbiBkeW5hbWljYWxseVxuICAgICAgICAgICAgaG9va3NbaG9va3NQcm9wXSA9ICguLi5hcmdzOiB1bmtub3duW10pID0+IHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuZGVmYXVsdHMuYXN5bmMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKGFzeW5jKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgbGV0IHJldCA9IGF3YWl0IGhvb2tzRnVuYy5hcHBseShob29rcywgYXJncyk7XG4gICAgICAgICAgICAgICAgICBpZiAocmV0ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICByZXQgPSBhd2FpdCBwcmV2SG9vay5hcHBseShob29rcywgYXJncyk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICAgICAgICAgIH0pKCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBsZXQgcmV0ID0gaG9va3NGdW5jLmFwcGx5KGhvb2tzLCBhcmdzKTtcbiAgICAgICAgICAgICAgaWYgKHJldCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXQgPSBwcmV2SG9vay5hcHBseShob29rcywgYXJncyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG9wdHMuaG9va3MgPSBob29rcztcbiAgICAgIH1cblxuICAgICAgLy8gPT0tLSBQYXJzZSBXYWxrVG9rZW5zIGV4dGVuc2lvbnMgLS09PSAvL1xuICAgICAgaWYgKHBhY2sud2Fsa1Rva2Vucykge1xuICAgICAgICBjb25zdCB3YWxrVG9rZW5zID0gdGhpcy5kZWZhdWx0cy53YWxrVG9rZW5zO1xuICAgICAgICBjb25zdCBwYWNrV2Fsa3Rva2VucyA9IHBhY2sud2Fsa1Rva2VucztcbiAgICAgICAgb3B0cy53YWxrVG9rZW5zID0gZnVuY3Rpb24odG9rZW4pIHtcbiAgICAgICAgICBsZXQgdmFsdWVzOiBNYXliZVByb21pc2VbXSA9IFtdO1xuICAgICAgICAgIHZhbHVlcy5wdXNoKHBhY2tXYWxrdG9rZW5zLmNhbGwodGhpcywgdG9rZW4pKTtcbiAgICAgICAgICBpZiAod2Fsa1Rva2Vucykge1xuICAgICAgICAgICAgdmFsdWVzID0gdmFsdWVzLmNvbmNhdCh3YWxrVG9rZW5zLmNhbGwodGhpcywgdG9rZW4pKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHZhbHVlcztcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5kZWZhdWx0cyA9IHsgLi4udGhpcy5kZWZhdWx0cywgLi4ub3B0cyB9O1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRPcHRpb25zKG9wdDogTWFya2VkT3B0aW9uczxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0Pikge1xuICAgIHRoaXMuZGVmYXVsdHMgPSB7IC4uLnRoaXMuZGVmYXVsdHMsIC4uLm9wdCB9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgbGV4ZXIoc3JjOiBzdHJpbmcsIG9wdGlvbnM/OiBNYXJrZWRPcHRpb25zPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+KSB7XG4gICAgcmV0dXJuIF9MZXhlci5sZXgoc3JjLCBvcHRpb25zID8/IHRoaXMuZGVmYXVsdHMpO1xuICB9XG5cbiAgcGFyc2VyKHRva2VuczogVG9rZW5bXSwgb3B0aW9ucz86IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4pIHtcbiAgICByZXR1cm4gX1BhcnNlci5wYXJzZTxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0Pih0b2tlbnMsIG9wdGlvbnMgPz8gdGhpcy5kZWZhdWx0cyk7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlTWFya2Rvd24oYmxvY2tUeXBlOiBib29sZWFuKSB7XG4gICAgdHlwZSBvdmVybG9hZGVkUGFyc2UgPSB7XG4gICAgICAoc3JjOiBzdHJpbmcsIG9wdGlvbnM6IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4gJiB7IGFzeW5jOiB0cnVlIH0pOiBQcm9taXNlPFBhcnNlck91dHB1dD47XG4gICAgICAoc3JjOiBzdHJpbmcsIG9wdGlvbnM6IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4gJiB7IGFzeW5jOiBmYWxzZSB9KTogUGFyc2VyT3V0cHV0O1xuICAgICAgKHNyYzogc3RyaW5nLCBvcHRpb25zPzogTWFya2VkT3B0aW9uczxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0PiB8IG51bGwpOiBQYXJzZXJPdXRwdXQgfCBQcm9taXNlPFBhcnNlck91dHB1dD47XG4gICAgfTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgY29uc3QgcGFyc2U6IG92ZXJsb2FkZWRQYXJzZSA9IChzcmM6IHN0cmluZywgb3B0aW9ucz86IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4gfCBudWxsKTogYW55ID0+IHtcbiAgICAgIGNvbnN0IG9yaWdPcHQgPSB7IC4uLm9wdGlvbnMgfTtcbiAgICAgIGNvbnN0IG9wdCA9IHsgLi4udGhpcy5kZWZhdWx0cywgLi4ub3JpZ09wdCB9O1xuXG4gICAgICBjb25zdCB0aHJvd0Vycm9yID0gdGhpcy5vbkVycm9yKCEhb3B0LnNpbGVudCwgISFvcHQuYXN5bmMpO1xuXG4gICAgICAvLyB0aHJvdyBlcnJvciBpZiBhbiBleHRlbnNpb24gc2V0IGFzeW5jIHRvIHRydWUgYnV0IHBhcnNlIHdhcyBjYWxsZWQgd2l0aCBhc3luYzogZmFsc2VcbiAgICAgIGlmICh0aGlzLmRlZmF1bHRzLmFzeW5jID09PSB0cnVlICYmIG9yaWdPcHQuYXN5bmMgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKG5ldyBFcnJvcignbWFya2VkKCk6IFRoZSBhc3luYyBvcHRpb24gd2FzIHNldCB0byB0cnVlIGJ5IGFuIGV4dGVuc2lvbi4gUmVtb3ZlIGFzeW5jOiBmYWxzZSBmcm9tIHRoZSBwYXJzZSBvcHRpb25zIG9iamVjdCB0byByZXR1cm4gYSBQcm9taXNlLicpKTtcbiAgICAgIH1cblxuICAgICAgLy8gdGhyb3cgZXJyb3IgaW4gY2FzZSBvZiBub24gc3RyaW5nIGlucHV0XG4gICAgICBpZiAodHlwZW9mIHNyYyA9PT0gJ3VuZGVmaW5lZCcgfHwgc3JjID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKG5ldyBFcnJvcignbWFya2VkKCk6IGlucHV0IHBhcmFtZXRlciBpcyB1bmRlZmluZWQgb3IgbnVsbCcpKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2Ygc3JjICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihuZXcgRXJyb3IoJ21hcmtlZCgpOiBpbnB1dCBwYXJhbWV0ZXIgaXMgb2YgdHlwZSAnXG4gICAgICAgICAgKyBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoc3JjKSArICcsIHN0cmluZyBleHBlY3RlZCcpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdC5ob29rcykge1xuICAgICAgICBvcHQuaG9va3Mub3B0aW9ucyA9IG9wdDtcbiAgICAgICAgb3B0Lmhvb2tzLmJsb2NrID0gYmxvY2tUeXBlO1xuICAgICAgfVxuXG4gICAgICBpZiAob3B0LmFzeW5jKSB7XG4gICAgICAgIHJldHVybiAoYXN5bmMoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcHJvY2Vzc2VkU3JjID0gb3B0Lmhvb2tzID8gYXdhaXQgb3B0Lmhvb2tzLnByZXByb2Nlc3Moc3JjKSA6IHNyYztcbiAgICAgICAgICBjb25zdCBsZXhlciA9IG9wdC5ob29rcyA/IGF3YWl0IG9wdC5ob29rcy5wcm92aWRlTGV4ZXIoKSA6IChibG9ja1R5cGUgPyBfTGV4ZXIubGV4IDogX0xleGVyLmxleElubGluZSk7XG4gICAgICAgICAgY29uc3QgdG9rZW5zID0gYXdhaXQgbGV4ZXIocHJvY2Vzc2VkU3JjLCBvcHQpO1xuICAgICAgICAgIGNvbnN0IHByb2Nlc3NlZFRva2VucyA9IG9wdC5ob29rcyA/IGF3YWl0IG9wdC5ob29rcy5wcm9jZXNzQWxsVG9rZW5zKHRva2VucykgOiB0b2tlbnM7XG4gICAgICAgICAgaWYgKG9wdC53YWxrVG9rZW5zKSB7XG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLndhbGtUb2tlbnMocHJvY2Vzc2VkVG9rZW5zLCBvcHQud2Fsa1Rva2VucykpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBwYXJzZXIgPSBvcHQuaG9va3MgPyBhd2FpdCBvcHQuaG9va3MucHJvdmlkZVBhcnNlcigpIDogKGJsb2NrVHlwZSA/IF9QYXJzZXIucGFyc2UgOiBfUGFyc2VyLnBhcnNlSW5saW5lKTtcbiAgICAgICAgICBjb25zdCBodG1sID0gYXdhaXQgcGFyc2VyKHByb2Nlc3NlZFRva2Vucywgb3B0KTtcbiAgICAgICAgICByZXR1cm4gb3B0Lmhvb2tzID8gYXdhaXQgb3B0Lmhvb2tzLnBvc3Rwcm9jZXNzKGh0bWwpIDogaHRtbDtcbiAgICAgICAgfSkoKS5jYXRjaCh0aHJvd0Vycm9yKTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKG9wdC5ob29rcykge1xuICAgICAgICAgIHNyYyA9IG9wdC5ob29rcy5wcmVwcm9jZXNzKHNyYykgYXMgc3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxleGVyID0gb3B0Lmhvb2tzID8gb3B0Lmhvb2tzLnByb3ZpZGVMZXhlcigpIDogKGJsb2NrVHlwZSA/IF9MZXhlci5sZXggOiBfTGV4ZXIubGV4SW5saW5lKTtcbiAgICAgICAgbGV0IHRva2VucyA9IGxleGVyKHNyYywgb3B0KTtcbiAgICAgICAgaWYgKG9wdC5ob29rcykge1xuICAgICAgICAgIHRva2VucyA9IG9wdC5ob29rcy5wcm9jZXNzQWxsVG9rZW5zKHRva2Vucyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdC53YWxrVG9rZW5zKSB7XG4gICAgICAgICAgdGhpcy53YWxrVG9rZW5zKHRva2Vucywgb3B0LndhbGtUb2tlbnMpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcnNlciA9IG9wdC5ob29rcyA/IG9wdC5ob29rcy5wcm92aWRlUGFyc2VyKCkgOiAoYmxvY2tUeXBlID8gX1BhcnNlci5wYXJzZSA6IF9QYXJzZXIucGFyc2VJbmxpbmUpO1xuICAgICAgICBsZXQgaHRtbCA9IHBhcnNlcih0b2tlbnMsIG9wdCk7XG4gICAgICAgIGlmIChvcHQuaG9va3MpIHtcbiAgICAgICAgICBodG1sID0gb3B0Lmhvb2tzLnBvc3Rwcm9jZXNzKGh0bWwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBodG1sO1xuICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGUgYXMgRXJyb3IpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gcGFyc2U7XG4gIH1cblxuICBwcml2YXRlIG9uRXJyb3Ioc2lsZW50OiBib29sZWFuLCBhc3luYzogYm9vbGVhbikge1xuICAgIHJldHVybiAoZTogRXJyb3IpOiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz4gPT4ge1xuICAgICAgZS5tZXNzYWdlICs9ICdcXG5QbGVhc2UgcmVwb3J0IHRoaXMgdG8gaHR0cHM6Ly9naXRodWIuY29tL21hcmtlZGpzL21hcmtlZC4nO1xuXG4gICAgICBpZiAoc2lsZW50KSB7XG4gICAgICAgIGNvbnN0IG1zZyA9ICc8cD5BbiBlcnJvciBvY2N1cnJlZDo8L3A+PHByZT4nXG4gICAgICAgICAgKyBlc2NhcGVIdG1sRW50aXRpZXMoZS5tZXNzYWdlICsgJycsIHRydWUpXG4gICAgICAgICAgKyAnPC9wcmU+JztcbiAgICAgICAgaWYgKGFzeW5jKSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtc2cpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtc2c7XG4gICAgICB9XG5cbiAgICAgIGlmIChhc3luYykge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlO1xuICAgIH07XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBfTGV4ZXIgfSBmcm9tICcuL0xleGVyLnRzJztcbmltcG9ydCB7IF9QYXJzZXIgfSBmcm9tICcuL1BhcnNlci50cyc7XG5pbXBvcnQgeyBfVG9rZW5pemVyIH0gZnJvbSAnLi9Ub2tlbml6ZXIudHMnO1xuaW1wb3J0IHsgX1JlbmRlcmVyIH0gZnJvbSAnLi9SZW5kZXJlci50cyc7XG5pbXBvcnQgeyBfVGV4dFJlbmRlcmVyIH0gZnJvbSAnLi9UZXh0UmVuZGVyZXIudHMnO1xuaW1wb3J0IHsgX0hvb2tzIH0gZnJvbSAnLi9Ib29rcy50cyc7XG5pbXBvcnQgeyBNYXJrZWQgfSBmcm9tICcuL0luc3RhbmNlLnRzJztcbmltcG9ydCB7XG4gIF9nZXREZWZhdWx0cyxcbiAgY2hhbmdlRGVmYXVsdHMsXG4gIF9kZWZhdWx0cyxcbn0gZnJvbSAnLi9kZWZhdWx0cy50cyc7XG5pbXBvcnQgdHlwZSB7IE1hcmtlZEV4dGVuc2lvbiwgTWFya2VkT3B0aW9ucyB9IGZyb20gJy4vTWFya2VkT3B0aW9ucy50cyc7XG5pbXBvcnQgdHlwZSB7IFRva2VuLCBUb2tlbnNMaXN0IH0gZnJvbSAnLi9Ub2tlbnMudHMnO1xuaW1wb3J0IHR5cGUgeyBNYXliZVByb21pc2UgfSBmcm9tICcuL0luc3RhbmNlLnRzJztcblxuY29uc3QgbWFya2VkSW5zdGFuY2UgPSBuZXcgTWFya2VkKCk7XG5cbi8qKlxuICogQ29tcGlsZXMgbWFya2Rvd24gdG8gSFRNTCBhc3luY2hyb25vdXNseS5cbiAqXG4gKiBAcGFyYW0gc3JjIFN0cmluZyBvZiBtYXJrZG93biBzb3VyY2UgdG8gYmUgY29tcGlsZWRcbiAqIEBwYXJhbSBvcHRpb25zIEhhc2ggb2Ygb3B0aW9ucywgaGF2aW5nIGFzeW5jOiB0cnVlXG4gKiBAcmV0dXJuIFByb21pc2Ugb2Ygc3RyaW5nIG9mIGNvbXBpbGVkIEhUTUxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcmtlZChzcmM6IHN0cmluZywgb3B0aW9uczogTWFya2VkT3B0aW9ucyAmIHsgYXN5bmM6IHRydWUgfSk6IFByb21pc2U8c3RyaW5nPjtcblxuLyoqXG4gKiBDb21waWxlcyBtYXJrZG93biB0byBIVE1MLlxuICpcbiAqIEBwYXJhbSBzcmMgU3RyaW5nIG9mIG1hcmtkb3duIHNvdXJjZSB0byBiZSBjb21waWxlZFxuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9uYWwgaGFzaCBvZiBvcHRpb25zXG4gKiBAcmV0dXJuIFN0cmluZyBvZiBjb21waWxlZCBIVE1MLiBXaWxsIGJlIGEgUHJvbWlzZSBvZiBzdHJpbmcgaWYgYXN5bmMgaXMgc2V0IHRvIHRydWUgYnkgYW55IGV4dGVuc2lvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXJrZWQoc3JjOiBzdHJpbmcsIG9wdGlvbnM6IE1hcmtlZE9wdGlvbnMgJiB7IGFzeW5jOiBmYWxzZSB9KTogc3RyaW5nO1xuZXhwb3J0IGZ1bmN0aW9uIG1hcmtlZChzcmM6IHN0cmluZywgb3B0aW9uczogTWFya2VkT3B0aW9ucyAmIHsgYXN5bmM6IHRydWUgfSk6IFByb21pc2U8c3RyaW5nPjtcbmV4cG9ydCBmdW5jdGlvbiBtYXJrZWQoc3JjOiBzdHJpbmcsIG9wdGlvbnM/OiBNYXJrZWRPcHRpb25zIHwgbnVsbCk6IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPjtcbmV4cG9ydCBmdW5jdGlvbiBtYXJrZWQoc3JjOiBzdHJpbmcsIG9wdD86IE1hcmtlZE9wdGlvbnMgfCBudWxsKTogc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+IHtcbiAgcmV0dXJuIG1hcmtlZEluc3RhbmNlLnBhcnNlKHNyYywgb3B0KTtcbn1cblxuLyoqXG4gKiBTZXRzIHRoZSBkZWZhdWx0IG9wdGlvbnMuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgSGFzaCBvZiBvcHRpb25zXG4gKi9cbm1hcmtlZC5vcHRpb25zID1cbiAgbWFya2VkLnNldE9wdGlvbnMgPSBmdW5jdGlvbihvcHRpb25zOiBNYXJrZWRPcHRpb25zKSB7XG4gICAgbWFya2VkSW5zdGFuY2Uuc2V0T3B0aW9ucyhvcHRpb25zKTtcbiAgICBtYXJrZWQuZGVmYXVsdHMgPSBtYXJrZWRJbnN0YW5jZS5kZWZhdWx0cztcbiAgICBjaGFuZ2VEZWZhdWx0cyhtYXJrZWQuZGVmYXVsdHMpO1xuICAgIHJldHVybiBtYXJrZWQ7XG4gIH07XG5cbi8qKlxuICogR2V0cyB0aGUgb3JpZ2luYWwgbWFya2VkIGRlZmF1bHQgb3B0aW9ucy5cbiAqL1xubWFya2VkLmdldERlZmF1bHRzID0gX2dldERlZmF1bHRzO1xuXG5tYXJrZWQuZGVmYXVsdHMgPSBfZGVmYXVsdHM7XG5cbi8qKlxuICogVXNlIEV4dGVuc2lvblxuICovXG5cbm1hcmtlZC51c2UgPSBmdW5jdGlvbiguLi5hcmdzOiBNYXJrZWRFeHRlbnNpb25bXSkge1xuICBtYXJrZWRJbnN0YW5jZS51c2UoLi4uYXJncyk7XG4gIG1hcmtlZC5kZWZhdWx0cyA9IG1hcmtlZEluc3RhbmNlLmRlZmF1bHRzO1xuICBjaGFuZ2VEZWZhdWx0cyhtYXJrZWQuZGVmYXVsdHMpO1xuICByZXR1cm4gbWFya2VkO1xufTtcblxuLyoqXG4gKiBSdW4gY2FsbGJhY2sgZm9yIGV2ZXJ5IHRva2VuXG4gKi9cblxubWFya2VkLndhbGtUb2tlbnMgPSBmdW5jdGlvbih0b2tlbnM6IFRva2VuW10gfCBUb2tlbnNMaXN0LCBjYWxsYmFjazogKHRva2VuOiBUb2tlbikgPT4gTWF5YmVQcm9taXNlIHwgTWF5YmVQcm9taXNlW10pIHtcbiAgcmV0dXJuIG1hcmtlZEluc3RhbmNlLndhbGtUb2tlbnModG9rZW5zLCBjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIENvbXBpbGVzIG1hcmtkb3duIHRvIEhUTUwgd2l0aG91dCBlbmNsb3NpbmcgYHBgIHRhZy5cbiAqXG4gKiBAcGFyYW0gc3JjIFN0cmluZyBvZiBtYXJrZG93biBzb3VyY2UgdG8gYmUgY29tcGlsZWRcbiAqIEBwYXJhbSBvcHRpb25zIEhhc2ggb2Ygb3B0aW9uc1xuICogQHJldHVybiBTdHJpbmcgb2YgY29tcGlsZWQgSFRNTFxuICovXG5tYXJrZWQucGFyc2VJbmxpbmUgPSBtYXJrZWRJbnN0YW5jZS5wYXJzZUlubGluZTtcblxuLyoqXG4gKiBFeHBvc2VcbiAqL1xubWFya2VkLlBhcnNlciA9IF9QYXJzZXI7XG5tYXJrZWQucGFyc2VyID0gX1BhcnNlci5wYXJzZTtcbm1hcmtlZC5SZW5kZXJlciA9IF9SZW5kZXJlcjtcbm1hcmtlZC5UZXh0UmVuZGVyZXIgPSBfVGV4dFJlbmRlcmVyO1xubWFya2VkLkxleGVyID0gX0xleGVyO1xubWFya2VkLmxleGVyID0gX0xleGVyLmxleDtcbm1hcmtlZC5Ub2tlbml6ZXIgPSBfVG9rZW5pemVyO1xubWFya2VkLkhvb2tzID0gX0hvb2tzO1xubWFya2VkLnBhcnNlID0gbWFya2VkO1xuXG5leHBvcnQgY29uc3Qgb3B0aW9ucyA9IG1hcmtlZC5vcHRpb25zO1xuZXhwb3J0IGNvbnN0IHNldE9wdGlvbnMgPSBtYXJrZWQuc2V0T3B0aW9ucztcbmV4cG9ydCBjb25zdCB1c2UgPSBtYXJrZWQudXNlO1xuZXhwb3J0IGNvbnN0IHdhbGtUb2tlbnMgPSBtYXJrZWQud2Fsa1Rva2VucztcbmV4cG9ydCBjb25zdCBwYXJzZUlubGluZSA9IG1hcmtlZC5wYXJzZUlubGluZTtcbmV4cG9ydCBjb25zdCBwYXJzZSA9IG1hcmtlZDtcbmV4cG9ydCBjb25zdCBwYXJzZXIgPSBfUGFyc2VyLnBhcnNlO1xuZXhwb3J0IGNvbnN0IGxleGVyID0gX0xleGVyLmxleDtcbmV4cG9ydCB7IF9kZWZhdWx0cyBhcyBkZWZhdWx0cywgX2dldERlZmF1bHRzIGFzIGdldERlZmF1bHRzIH0gZnJvbSAnLi9kZWZhdWx0cy50cyc7XG5leHBvcnQgeyBfTGV4ZXIgYXMgTGV4ZXIgfSBmcm9tICcuL0xleGVyLnRzJztcbmV4cG9ydCB7IF9QYXJzZXIgYXMgUGFyc2VyIH0gZnJvbSAnLi9QYXJzZXIudHMnO1xuZXhwb3J0IHsgX1Rva2VuaXplciBhcyBUb2tlbml6ZXIgfSBmcm9tICcuL1Rva2VuaXplci50cyc7XG5leHBvcnQgeyBfUmVuZGVyZXIgYXMgUmVuZGVyZXIgfSBmcm9tICcuL1JlbmRlcmVyLnRzJztcbmV4cG9ydCB7IF9UZXh0UmVuZGVyZXIgYXMgVGV4dFJlbmRlcmVyIH0gZnJvbSAnLi9UZXh0UmVuZGVyZXIudHMnO1xuZXhwb3J0IHsgX0hvb2tzIGFzIEhvb2tzIH0gZnJvbSAnLi9Ib29rcy50cyc7XG5leHBvcnQgeyBNYXJrZWQgfSBmcm9tICcuL0luc3RhbmNlLnRzJztcbmV4cG9ydCB0eXBlICogZnJvbSAnLi9NYXJrZWRPcHRpb25zLnRzJztcbmV4cG9ydCB0eXBlICogZnJvbSAnLi9Ub2tlbnMudHMnO1xuIiwgImNvbnN0IHtcbiAgZW50cmllcyxcbiAgc2V0UHJvdG90eXBlT2YsXG4gIGlzRnJvemVuLFxuICBnZXRQcm90b3R5cGVPZixcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxufSA9IE9iamVjdDtcblxubGV0IHsgZnJlZXplLCBzZWFsLCBjcmVhdGUgfSA9IE9iamVjdDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBpbXBvcnQvbm8tbXV0YWJsZS1leHBvcnRzXG5sZXQgeyBhcHBseSwgY29uc3RydWN0IH0gPSB0eXBlb2YgUmVmbGVjdCAhPT0gJ3VuZGVmaW5lZCcgJiYgUmVmbGVjdDtcblxuaWYgKCFmcmVlemUpIHtcbiAgZnJlZXplID0gZnVuY3Rpb24gPFQ+KHg6IFQpOiBUIHtcbiAgICByZXR1cm4geDtcbiAgfTtcbn1cblxuaWYgKCFzZWFsKSB7XG4gIHNlYWwgPSBmdW5jdGlvbiA8VD4oeDogVCk6IFQge1xuICAgIHJldHVybiB4O1xuICB9O1xufVxuXG5pZiAoIWFwcGx5KSB7XG4gIGFwcGx5ID0gZnVuY3Rpb24gPFQ+KFxuICAgIGZ1bmM6ICh0aGlzQXJnOiBhbnksIC4uLmFyZ3M6IGFueVtdKSA9PiBULFxuICAgIHRoaXNBcmc6IGFueSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBUIHtcbiAgICByZXR1cm4gZnVuYy5hcHBseSh0aGlzQXJnLCBhcmdzKTtcbiAgfTtcbn1cblxuaWYgKCFjb25zdHJ1Y3QpIHtcbiAgY29uc3RydWN0ID0gZnVuY3Rpb24gPFQ+KEZ1bmM6IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQsIC4uLmFyZ3M6IGFueVtdKTogVCB7XG4gICAgcmV0dXJuIG5ldyBGdW5jKC4uLmFyZ3MpO1xuICB9O1xufVxuXG5jb25zdCBhcnJheUZvckVhY2ggPSB1bmFwcGx5KEFycmF5LnByb3RvdHlwZS5mb3JFYWNoKTtcbmNvbnN0IGFycmF5SW5kZXhPZiA9IHVuYXBwbHkoQXJyYXkucHJvdG90eXBlLmluZGV4T2YpO1xuY29uc3QgYXJyYXlMYXN0SW5kZXhPZiA9IHVuYXBwbHkoQXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mKTtcbmNvbnN0IGFycmF5UG9wID0gdW5hcHBseShBcnJheS5wcm90b3R5cGUucG9wKTtcbmNvbnN0IGFycmF5UHVzaCA9IHVuYXBwbHkoQXJyYXkucHJvdG90eXBlLnB1c2gpO1xuY29uc3QgYXJyYXlTbGljZSA9IHVuYXBwbHkoQXJyYXkucHJvdG90eXBlLnNsaWNlKTtcbmNvbnN0IGFycmF5U3BsaWNlID0gdW5hcHBseShBcnJheS5wcm90b3R5cGUuc3BsaWNlKTtcblxuY29uc3Qgc3RyaW5nVG9Mb3dlckNhc2UgPSB1bmFwcGx5KFN0cmluZy5wcm90b3R5cGUudG9Mb3dlckNhc2UpO1xuY29uc3Qgc3RyaW5nVG9TdHJpbmcgPSB1bmFwcGx5KFN0cmluZy5wcm90b3R5cGUudG9TdHJpbmcpO1xuY29uc3Qgc3RyaW5nTWF0Y2ggPSB1bmFwcGx5KFN0cmluZy5wcm90b3R5cGUubWF0Y2gpO1xuY29uc3Qgc3RyaW5nUmVwbGFjZSA9IHVuYXBwbHkoU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlKTtcbmNvbnN0IHN0cmluZ0luZGV4T2YgPSB1bmFwcGx5KFN0cmluZy5wcm90b3R5cGUuaW5kZXhPZik7XG5jb25zdCBzdHJpbmdUcmltID0gdW5hcHBseShTdHJpbmcucHJvdG90eXBlLnRyaW0pO1xuXG5jb25zdCBvYmplY3RIYXNPd25Qcm9wZXJ0eSA9IHVuYXBwbHkoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSk7XG5cbmNvbnN0IHJlZ0V4cFRlc3QgPSB1bmFwcGx5KFJlZ0V4cC5wcm90b3R5cGUudGVzdCk7XG5cbmNvbnN0IHR5cGVFcnJvckNyZWF0ZSA9IHVuY29uc3RydWN0KFR5cGVFcnJvcik7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBmdW5jdGlvbiB0aGF0IGNhbGxzIHRoZSBnaXZlbiBmdW5jdGlvbiB3aXRoIGEgc3BlY2lmaWVkIHRoaXNBcmcgYW5kIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gZnVuYyAtIFRoZSBmdW5jdGlvbiB0byBiZSB3cmFwcGVkIGFuZCBjYWxsZWQuXG4gKiBAcmV0dXJucyBBIG5ldyBmdW5jdGlvbiB0aGF0IGNhbGxzIHRoZSBnaXZlbiBmdW5jdGlvbiB3aXRoIGEgc3BlY2lmaWVkIHRoaXNBcmcgYW5kIGFyZ3VtZW50cy5cbiAqL1xuZnVuY3Rpb24gdW5hcHBseTxUPihcbiAgZnVuYzogKHRoaXNBcmc6IGFueSwgLi4uYXJnczogYW55W10pID0+IFRcbik6ICh0aGlzQXJnOiBhbnksIC4uLmFyZ3M6IGFueVtdKSA9PiBUIHtcbiAgcmV0dXJuICh0aGlzQXJnOiBhbnksIC4uLmFyZ3M6IGFueVtdKTogVCA9PiB7XG4gICAgaWYgKHRoaXNBcmcgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgIHRoaXNBcmcubGFzdEluZGV4ID0gMDtcbiAgICB9XG5cbiAgICByZXR1cm4gYXBwbHkoZnVuYywgdGhpc0FyZywgYXJncyk7XG4gIH07XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBmdW5jdGlvbiB0aGF0IGNvbnN0cnVjdHMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdpdmVuIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIHdpdGggdGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gZnVuYyAtIFRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbiB0byBiZSB3cmFwcGVkIGFuZCBjYWxsZWQuXG4gKiBAcmV0dXJucyBBIG5ldyBmdW5jdGlvbiB0aGF0IGNvbnN0cnVjdHMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdpdmVuIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIHdpdGggdGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAqL1xuZnVuY3Rpb24gdW5jb25zdHJ1Y3Q8VD4oXG4gIEZ1bmM6IG5ldyAoLi4uYXJnczogYW55W10pID0+IFRcbik6ICguLi5hcmdzOiBhbnlbXSkgPT4gVCB7XG4gIHJldHVybiAoLi4uYXJnczogYW55W10pOiBUID0+IGNvbnN0cnVjdChGdW5jLCBhcmdzKTtcbn1cblxuLyoqXG4gKiBBZGQgcHJvcGVydGllcyB0byBhIGxvb2t1cCB0YWJsZVxuICpcbiAqIEBwYXJhbSBzZXQgLSBUaGUgc2V0IHRvIHdoaWNoIGVsZW1lbnRzIHdpbGwgYmUgYWRkZWQuXG4gKiBAcGFyYW0gYXJyYXkgLSBUaGUgYXJyYXkgY29udGFpbmluZyBlbGVtZW50cyB0byBiZSBhZGRlZCB0byB0aGUgc2V0LlxuICogQHBhcmFtIHRyYW5zZm9ybUNhc2VGdW5jIC0gQW4gb3B0aW9uYWwgZnVuY3Rpb24gdG8gdHJhbnNmb3JtIHRoZSBjYXNlIG9mIGVhY2ggZWxlbWVudCBiZWZvcmUgYWRkaW5nIHRvIHRoZSBzZXQuXG4gKiBAcmV0dXJucyBUaGUgbW9kaWZpZWQgc2V0IHdpdGggYWRkZWQgZWxlbWVudHMuXG4gKi9cbmZ1bmN0aW9uIGFkZFRvU2V0KFxuICBzZXQ6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIGFycmF5OiByZWFkb25seSBhbnlbXSxcbiAgdHJhbnNmb3JtQ2FzZUZ1bmM6IFJldHVyblR5cGU8dHlwZW9mIHVuYXBwbHk8c3RyaW5nPj4gPSBzdHJpbmdUb0xvd2VyQ2FzZVxuKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gIGlmIChzZXRQcm90b3R5cGVPZikge1xuICAgIC8vIE1ha2UgJ2luJyBhbmQgdHJ1dGh5IGNoZWNrcyBsaWtlIEJvb2xlYW4oc2V0LmNvbnN0cnVjdG9yKVxuICAgIC8vIGluZGVwZW5kZW50IG9mIGFueSBwcm9wZXJ0aWVzIGRlZmluZWQgb24gT2JqZWN0LnByb3RvdHlwZS5cbiAgICAvLyBQcmV2ZW50IHByb3RvdHlwZSBzZXR0ZXJzIGZyb20gaW50ZXJjZXB0aW5nIHNldCBhcyBhIHRoaXMgdmFsdWUuXG4gICAgc2V0UHJvdG90eXBlT2Yoc2V0LCBudWxsKTtcbiAgfVxuXG4gIGxldCBsID0gYXJyYXkubGVuZ3RoO1xuICB3aGlsZSAobC0tKSB7XG4gICAgbGV0IGVsZW1lbnQgPSBhcnJheVtsXTtcbiAgICBpZiAodHlwZW9mIGVsZW1lbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zdCBsY0VsZW1lbnQgPSB0cmFuc2Zvcm1DYXNlRnVuYyhlbGVtZW50KTtcbiAgICAgIGlmIChsY0VsZW1lbnQgIT09IGVsZW1lbnQpIHtcbiAgICAgICAgLy8gQ29uZmlnIHByZXNldHMgKGUuZy4gdGFncy5qcywgYXR0cnMuanMpIGFyZSBpbW11dGFibGUuXG4gICAgICAgIGlmICghaXNGcm96ZW4oYXJyYXkpKSB7XG4gICAgICAgICAgKGFycmF5IGFzIGFueVtdKVtsXSA9IGxjRWxlbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIGVsZW1lbnQgPSBsY0VsZW1lbnQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2V0W2VsZW1lbnRdID0gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBzZXQ7XG59XG5cbi8qKlxuICogQ2xlYW4gdXAgYW4gYXJyYXkgdG8gaGFyZGVuIGFnYWluc3QgQ1NQUFxuICpcbiAqIEBwYXJhbSBhcnJheSAtIFRoZSBhcnJheSB0byBiZSBjbGVhbmVkLlxuICogQHJldHVybnMgVGhlIGNsZWFuZWQgdmVyc2lvbiBvZiB0aGUgYXJyYXlcbiAqL1xuZnVuY3Rpb24gY2xlYW5BcnJheTxUPihhcnJheTogVFtdKTogQXJyYXk8VCB8IG51bGw+IHtcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGFycmF5Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IGlzUHJvcGVydHlFeGlzdCA9IG9iamVjdEhhc093blByb3BlcnR5KGFycmF5LCBpbmRleCk7XG5cbiAgICBpZiAoIWlzUHJvcGVydHlFeGlzdCkge1xuICAgICAgYXJyYXlbaW5kZXhdID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYXJyYXk7XG59XG5cbi8qKlxuICogU2hhbGxvdyBjbG9uZSBhbiBvYmplY3RcbiAqXG4gKiBAcGFyYW0gb2JqZWN0IC0gVGhlIG9iamVjdCB0byBiZSBjbG9uZWQuXG4gKiBAcmV0dXJucyBBIG5ldyBvYmplY3QgdGhhdCBjb3BpZXMgdGhlIG9yaWdpbmFsLlxuICovXG5mdW5jdGlvbiBjbG9uZTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4ob2JqZWN0OiBUKTogVCB7XG4gIGNvbnN0IG5ld09iamVjdCA9IGNyZWF0ZShudWxsKTtcblxuICBmb3IgKGNvbnN0IFtwcm9wZXJ0eSwgdmFsdWVdIG9mIGVudHJpZXMob2JqZWN0KSkge1xuICAgIGNvbnN0IGlzUHJvcGVydHlFeGlzdCA9IG9iamVjdEhhc093blByb3BlcnR5KG9iamVjdCwgcHJvcGVydHkpO1xuXG4gICAgaWYgKGlzUHJvcGVydHlFeGlzdCkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIG5ld09iamVjdFtwcm9wZXJ0eV0gPSBjbGVhbkFycmF5KHZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHZhbHVlICYmXG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgdmFsdWUuY29uc3RydWN0b3IgPT09IE9iamVjdFxuICAgICAgKSB7XG4gICAgICAgIG5ld09iamVjdFtwcm9wZXJ0eV0gPSBjbG9uZSh2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXdPYmplY3RbcHJvcGVydHldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ld09iamVjdDtcbn1cblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBhdXRvbWF0aWNhbGx5IGNoZWNrcyBpZiB0aGUgcHJvcCBpcyBmdW5jdGlvbiBvciBnZXR0ZXIgYW5kIGJlaGF2ZXMgYWNjb3JkaW5nbHkuXG4gKlxuICogQHBhcmFtIG9iamVjdCAtIFRoZSBvYmplY3QgdG8gbG9vayB1cCB0aGUgZ2V0dGVyIGZ1bmN0aW9uIGluIGl0cyBwcm90b3R5cGUgY2hhaW4uXG4gKiBAcGFyYW0gcHJvcCAtIFRoZSBwcm9wZXJ0eSBuYW1lIGZvciB3aGljaCB0byBmaW5kIHRoZSBnZXR0ZXIgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBUaGUgZ2V0dGVyIGZ1bmN0aW9uIGZvdW5kIGluIHRoZSBwcm90b3R5cGUgY2hhaW4gb3IgYSBmYWxsYmFjayBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gbG9va3VwR2V0dGVyPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PihcbiAgb2JqZWN0OiBULFxuICBwcm9wOiBzdHJpbmdcbik6IFJldHVyblR5cGU8dHlwZW9mIHVuYXBwbHk8YW55Pj4gfCAoKCkgPT4gbnVsbCkge1xuICB3aGlsZSAob2JqZWN0ICE9PSBudWxsKSB7XG4gICAgY29uc3QgZGVzYyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3ApO1xuXG4gICAgaWYgKGRlc2MpIHtcbiAgICAgIGlmIChkZXNjLmdldCkge1xuICAgICAgICByZXR1cm4gdW5hcHBseShkZXNjLmdldCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgZGVzYy52YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gdW5hcHBseShkZXNjLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBvYmplY3QgPSBnZXRQcm90b3R5cGVPZihvYmplY3QpO1xuICB9XG5cbiAgZnVuY3Rpb24gZmFsbGJhY2tWYWx1ZSgpOiBudWxsIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBmYWxsYmFja1ZhbHVlO1xufVxuXG5leHBvcnQge1xuICAvLyBBcnJheVxuICBhcnJheUZvckVhY2gsXG4gIGFycmF5SW5kZXhPZixcbiAgYXJyYXlMYXN0SW5kZXhPZixcbiAgYXJyYXlQb3AsXG4gIGFycmF5UHVzaCxcbiAgYXJyYXlTbGljZSxcbiAgYXJyYXlTcGxpY2UsXG4gIC8vIE9iamVjdFxuICBlbnRyaWVzLFxuICBmcmVlemUsXG4gIGdldFByb3RvdHlwZU9mLFxuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsXG4gIGlzRnJvemVuLFxuICBzZXRQcm90b3R5cGVPZixcbiAgc2VhbCxcbiAgY2xvbmUsXG4gIGNyZWF0ZSxcbiAgb2JqZWN0SGFzT3duUHJvcGVydHksXG4gIC8vIFJlZ0V4cFxuICByZWdFeHBUZXN0LFxuICAvLyBTdHJpbmdcbiAgc3RyaW5nSW5kZXhPZixcbiAgc3RyaW5nTWF0Y2gsXG4gIHN0cmluZ1JlcGxhY2UsXG4gIHN0cmluZ1RvTG93ZXJDYXNlLFxuICBzdHJpbmdUb1N0cmluZyxcbiAgc3RyaW5nVHJpbSxcbiAgLy8gRXJyb3JzXG4gIHR5cGVFcnJvckNyZWF0ZSxcbiAgLy8gT3RoZXJcbiAgbG9va3VwR2V0dGVyLFxuICBhZGRUb1NldCxcbiAgLy8gUmVmbGVjdFxuICB1bmFwcGx5LFxuICB1bmNvbnN0cnVjdCxcbn07XG4iLCAiaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi91dGlscy5qcyc7XG5cbmV4cG9ydCBjb25zdCBodG1sID0gZnJlZXplKFtcbiAgJ2EnLFxuICAnYWJicicsXG4gICdhY3JvbnltJyxcbiAgJ2FkZHJlc3MnLFxuICAnYXJlYScsXG4gICdhcnRpY2xlJyxcbiAgJ2FzaWRlJyxcbiAgJ2F1ZGlvJyxcbiAgJ2InLFxuICAnYmRpJyxcbiAgJ2JkbycsXG4gICdiaWcnLFxuICAnYmxpbmsnLFxuICAnYmxvY2txdW90ZScsXG4gICdib2R5JyxcbiAgJ2JyJyxcbiAgJ2J1dHRvbicsXG4gICdjYW52YXMnLFxuICAnY2FwdGlvbicsXG4gICdjZW50ZXInLFxuICAnY2l0ZScsXG4gICdjb2RlJyxcbiAgJ2NvbCcsXG4gICdjb2xncm91cCcsXG4gICdjb250ZW50JyxcbiAgJ2RhdGEnLFxuICAnZGF0YWxpc3QnLFxuICAnZGQnLFxuICAnZGVjb3JhdG9yJyxcbiAgJ2RlbCcsXG4gICdkZXRhaWxzJyxcbiAgJ2RmbicsXG4gICdkaWFsb2cnLFxuICAnZGlyJyxcbiAgJ2RpdicsXG4gICdkbCcsXG4gICdkdCcsXG4gICdlbGVtZW50JyxcbiAgJ2VtJyxcbiAgJ2ZpZWxkc2V0JyxcbiAgJ2ZpZ2NhcHRpb24nLFxuICAnZmlndXJlJyxcbiAgJ2ZvbnQnLFxuICAnZm9vdGVyJyxcbiAgJ2Zvcm0nLFxuICAnaDEnLFxuICAnaDInLFxuICAnaDMnLFxuICAnaDQnLFxuICAnaDUnLFxuICAnaDYnLFxuICAnaGVhZCcsXG4gICdoZWFkZXInLFxuICAnaGdyb3VwJyxcbiAgJ2hyJyxcbiAgJ2h0bWwnLFxuICAnaScsXG4gICdpbWcnLFxuICAnaW5wdXQnLFxuICAnaW5zJyxcbiAgJ2tiZCcsXG4gICdsYWJlbCcsXG4gICdsZWdlbmQnLFxuICAnbGknLFxuICAnbWFpbicsXG4gICdtYXAnLFxuICAnbWFyaycsXG4gICdtYXJxdWVlJyxcbiAgJ21lbnUnLFxuICAnbWVudWl0ZW0nLFxuICAnbWV0ZXInLFxuICAnbmF2JyxcbiAgJ25vYnInLFxuICAnb2wnLFxuICAnb3B0Z3JvdXAnLFxuICAnb3B0aW9uJyxcbiAgJ291dHB1dCcsXG4gICdwJyxcbiAgJ3BpY3R1cmUnLFxuICAncHJlJyxcbiAgJ3Byb2dyZXNzJyxcbiAgJ3EnLFxuICAncnAnLFxuICAncnQnLFxuICAncnVieScsXG4gICdzJyxcbiAgJ3NhbXAnLFxuICAnc2VhcmNoJyxcbiAgJ3NlY3Rpb24nLFxuICAnc2VsZWN0JyxcbiAgJ3NoYWRvdycsXG4gICdzbG90JyxcbiAgJ3NtYWxsJyxcbiAgJ3NvdXJjZScsXG4gICdzcGFjZXInLFxuICAnc3BhbicsXG4gICdzdHJpa2UnLFxuICAnc3Ryb25nJyxcbiAgJ3N0eWxlJyxcbiAgJ3N1YicsXG4gICdzdW1tYXJ5JyxcbiAgJ3N1cCcsXG4gICd0YWJsZScsXG4gICd0Ym9keScsXG4gICd0ZCcsXG4gICd0ZW1wbGF0ZScsXG4gICd0ZXh0YXJlYScsXG4gICd0Zm9vdCcsXG4gICd0aCcsXG4gICd0aGVhZCcsXG4gICd0aW1lJyxcbiAgJ3RyJyxcbiAgJ3RyYWNrJyxcbiAgJ3R0JyxcbiAgJ3UnLFxuICAndWwnLFxuICAndmFyJyxcbiAgJ3ZpZGVvJyxcbiAgJ3dicicsXG5dIGFzIGNvbnN0KTtcblxuZXhwb3J0IGNvbnN0IHN2ZyA9IGZyZWV6ZShbXG4gICdzdmcnLFxuICAnYScsXG4gICdhbHRnbHlwaCcsXG4gICdhbHRnbHlwaGRlZicsXG4gICdhbHRnbHlwaGl0ZW0nLFxuICAnYW5pbWF0ZWNvbG9yJyxcbiAgJ2FuaW1hdGVtb3Rpb24nLFxuICAnYW5pbWF0ZXRyYW5zZm9ybScsXG4gICdjaXJjbGUnLFxuICAnY2xpcHBhdGgnLFxuICAnZGVmcycsXG4gICdkZXNjJyxcbiAgJ2VsbGlwc2UnLFxuICAnZW50ZXJrZXloaW50JyxcbiAgJ2V4cG9ydHBhcnRzJyxcbiAgJ2ZpbHRlcicsXG4gICdmb250JyxcbiAgJ2cnLFxuICAnZ2x5cGgnLFxuICAnZ2x5cGhyZWYnLFxuICAnaGtlcm4nLFxuICAnaW1hZ2UnLFxuICAnaW5wdXRtb2RlJyxcbiAgJ2xpbmUnLFxuICAnbGluZWFyZ3JhZGllbnQnLFxuICAnbWFya2VyJyxcbiAgJ21hc2snLFxuICAnbWV0YWRhdGEnLFxuICAnbXBhdGgnLFxuICAncGFydCcsXG4gICdwYXRoJyxcbiAgJ3BhdHRlcm4nLFxuICAncG9seWdvbicsXG4gICdwb2x5bGluZScsXG4gICdyYWRpYWxncmFkaWVudCcsXG4gICdyZWN0JyxcbiAgJ3N0b3AnLFxuICAnc3R5bGUnLFxuICAnc3dpdGNoJyxcbiAgJ3N5bWJvbCcsXG4gICd0ZXh0JyxcbiAgJ3RleHRwYXRoJyxcbiAgJ3RpdGxlJyxcbiAgJ3RyZWYnLFxuICAndHNwYW4nLFxuICAndmlldycsXG4gICd2a2VybicsXG5dIGFzIGNvbnN0KTtcblxuZXhwb3J0IGNvbnN0IHN2Z0ZpbHRlcnMgPSBmcmVlemUoW1xuICAnZmVCbGVuZCcsXG4gICdmZUNvbG9yTWF0cml4JyxcbiAgJ2ZlQ29tcG9uZW50VHJhbnNmZXInLFxuICAnZmVDb21wb3NpdGUnLFxuICAnZmVDb252b2x2ZU1hdHJpeCcsXG4gICdmZURpZmZ1c2VMaWdodGluZycsXG4gICdmZURpc3BsYWNlbWVudE1hcCcsXG4gICdmZURpc3RhbnRMaWdodCcsXG4gICdmZURyb3BTaGFkb3cnLFxuICAnZmVGbG9vZCcsXG4gICdmZUZ1bmNBJyxcbiAgJ2ZlRnVuY0InLFxuICAnZmVGdW5jRycsXG4gICdmZUZ1bmNSJyxcbiAgJ2ZlR2F1c3NpYW5CbHVyJyxcbiAgJ2ZlSW1hZ2UnLFxuICAnZmVNZXJnZScsXG4gICdmZU1lcmdlTm9kZScsXG4gICdmZU1vcnBob2xvZ3knLFxuICAnZmVPZmZzZXQnLFxuICAnZmVQb2ludExpZ2h0JyxcbiAgJ2ZlU3BlY3VsYXJMaWdodGluZycsXG4gICdmZVNwb3RMaWdodCcsXG4gICdmZVRpbGUnLFxuICAnZmVUdXJidWxlbmNlJyxcbl0gYXMgY29uc3QpO1xuXG4vLyBMaXN0IG9mIFNWRyBlbGVtZW50cyB0aGF0IGFyZSBkaXNhbGxvd2VkIGJ5IGRlZmF1bHQuXG4vLyBXZSBzdGlsbCBuZWVkIHRvIGtub3cgdGhlbSBzbyB0aGF0IHdlIGNhbiBkbyBuYW1lc3BhY2Vcbi8vIGNoZWNrcyBwcm9wZXJseSBpbiBjYXNlIG9uZSB3YW50cyB0byBhZGQgdGhlbSB0b1xuLy8gYWxsb3ctbGlzdC5cbmV4cG9ydCBjb25zdCBzdmdEaXNhbGxvd2VkID0gZnJlZXplKFtcbiAgJ2FuaW1hdGUnLFxuICAnY29sb3ItcHJvZmlsZScsXG4gICdjdXJzb3InLFxuICAnZGlzY2FyZCcsXG4gICdmb250LWZhY2UnLFxuICAnZm9udC1mYWNlLWZvcm1hdCcsXG4gICdmb250LWZhY2UtbmFtZScsXG4gICdmb250LWZhY2Utc3JjJyxcbiAgJ2ZvbnQtZmFjZS11cmknLFxuICAnZm9yZWlnbm9iamVjdCcsXG4gICdoYXRjaCcsXG4gICdoYXRjaHBhdGgnLFxuICAnbWVzaCcsXG4gICdtZXNoZ3JhZGllbnQnLFxuICAnbWVzaHBhdGNoJyxcbiAgJ21lc2hyb3cnLFxuICAnbWlzc2luZy1nbHlwaCcsXG4gICdzY3JpcHQnLFxuICAnc2V0JyxcbiAgJ3NvbGlkY29sb3InLFxuICAndW5rbm93bicsXG4gICd1c2UnLFxuXSBhcyBjb25zdCk7XG5cbmV4cG9ydCBjb25zdCBtYXRoTWwgPSBmcmVlemUoW1xuICAnbWF0aCcsXG4gICdtZW5jbG9zZScsXG4gICdtZXJyb3InLFxuICAnbWZlbmNlZCcsXG4gICdtZnJhYycsXG4gICdtZ2x5cGgnLFxuICAnbWknLFxuICAnbWxhYmVsZWR0cicsXG4gICdtbXVsdGlzY3JpcHRzJyxcbiAgJ21uJyxcbiAgJ21vJyxcbiAgJ21vdmVyJyxcbiAgJ21wYWRkZWQnLFxuICAnbXBoYW50b20nLFxuICAnbXJvb3QnLFxuICAnbXJvdycsXG4gICdtcycsXG4gICdtc3BhY2UnLFxuICAnbXNxcnQnLFxuICAnbXN0eWxlJyxcbiAgJ21zdWInLFxuICAnbXN1cCcsXG4gICdtc3Vic3VwJyxcbiAgJ210YWJsZScsXG4gICdtdGQnLFxuICAnbXRleHQnLFxuICAnbXRyJyxcbiAgJ211bmRlcicsXG4gICdtdW5kZXJvdmVyJyxcbiAgJ21wcmVzY3JpcHRzJyxcbl0gYXMgY29uc3QpO1xuXG4vLyBTaW1pbGFybHkgdG8gU1ZHLCB3ZSB3YW50IHRvIGtub3cgYWxsIE1hdGhNTCBlbGVtZW50cyxcbi8vIGV2ZW4gdGhvc2UgdGhhdCB3ZSBkaXNhbGxvdyBieSBkZWZhdWx0LlxuZXhwb3J0IGNvbnN0IG1hdGhNbERpc2FsbG93ZWQgPSBmcmVlemUoW1xuICAnbWFjdGlvbicsXG4gICdtYWxpZ25ncm91cCcsXG4gICdtYWxpZ25tYXJrJyxcbiAgJ21sb25nZGl2JyxcbiAgJ21zY2FycmllcycsXG4gICdtc2NhcnJ5JyxcbiAgJ21zZ3JvdXAnLFxuICAnbXN0YWNrJyxcbiAgJ21zbGluZScsXG4gICdtc3JvdycsXG4gICdzZW1hbnRpY3MnLFxuICAnYW5ub3RhdGlvbicsXG4gICdhbm5vdGF0aW9uLXhtbCcsXG4gICdtcHJlc2NyaXB0cycsXG4gICdub25lJyxcbl0gYXMgY29uc3QpO1xuXG5leHBvcnQgY29uc3QgdGV4dCA9IGZyZWV6ZShbJyN0ZXh0J10gYXMgY29uc3QpO1xuIiwgImltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4vdXRpbHMuanMnO1xuXG5leHBvcnQgY29uc3QgaHRtbCA9IGZyZWV6ZShbXG4gICdhY2NlcHQnLFxuICAnYWN0aW9uJyxcbiAgJ2FsaWduJyxcbiAgJ2FsdCcsXG4gICdhdXRvY2FwaXRhbGl6ZScsXG4gICdhdXRvY29tcGxldGUnLFxuICAnYXV0b3BpY3R1cmVpbnBpY3R1cmUnLFxuICAnYXV0b3BsYXknLFxuICAnYmFja2dyb3VuZCcsXG4gICdiZ2NvbG9yJyxcbiAgJ2JvcmRlcicsXG4gICdjYXB0dXJlJyxcbiAgJ2NlbGxwYWRkaW5nJyxcbiAgJ2NlbGxzcGFjaW5nJyxcbiAgJ2NoZWNrZWQnLFxuICAnY2l0ZScsXG4gICdjbGFzcycsXG4gICdjbGVhcicsXG4gICdjb2xvcicsXG4gICdjb2xzJyxcbiAgJ2NvbHNwYW4nLFxuICAnY29udHJvbHMnLFxuICAnY29udHJvbHNsaXN0JyxcbiAgJ2Nvb3JkcycsXG4gICdjcm9zc29yaWdpbicsXG4gICdkYXRldGltZScsXG4gICdkZWNvZGluZycsXG4gICdkZWZhdWx0JyxcbiAgJ2RpcicsXG4gICdkaXNhYmxlZCcsXG4gICdkaXNhYmxlcGljdHVyZWlucGljdHVyZScsXG4gICdkaXNhYmxlcmVtb3RlcGxheWJhY2snLFxuICAnZG93bmxvYWQnLFxuICAnZHJhZ2dhYmxlJyxcbiAgJ2VuY3R5cGUnLFxuICAnZW50ZXJrZXloaW50JyxcbiAgJ2V4cG9ydHBhcnRzJyxcbiAgJ2ZhY2UnLFxuICAnZm9yJyxcbiAgJ2hlYWRlcnMnLFxuICAnaGVpZ2h0JyxcbiAgJ2hpZGRlbicsXG4gICdoaWdoJyxcbiAgJ2hyZWYnLFxuICAnaHJlZmxhbmcnLFxuICAnaWQnLFxuICAnaW5lcnQnLFxuICAnaW5wdXRtb2RlJyxcbiAgJ2ludGVncml0eScsXG4gICdpc21hcCcsXG4gICdraW5kJyxcbiAgJ2xhYmVsJyxcbiAgJ2xhbmcnLFxuICAnbGlzdCcsXG4gICdsb2FkaW5nJyxcbiAgJ2xvb3AnLFxuICAnbG93JyxcbiAgJ21heCcsXG4gICdtYXhsZW5ndGgnLFxuICAnbWVkaWEnLFxuICAnbWV0aG9kJyxcbiAgJ21pbicsXG4gICdtaW5sZW5ndGgnLFxuICAnbXVsdGlwbGUnLFxuICAnbXV0ZWQnLFxuICAnbmFtZScsXG4gICdub25jZScsXG4gICdub3NoYWRlJyxcbiAgJ25vdmFsaWRhdGUnLFxuICAnbm93cmFwJyxcbiAgJ29wZW4nLFxuICAnb3B0aW11bScsXG4gICdwYXJ0JyxcbiAgJ3BhdHRlcm4nLFxuICAncGxhY2Vob2xkZXInLFxuICAncGxheXNpbmxpbmUnLFxuICAncG9wb3ZlcicsXG4gICdwb3BvdmVydGFyZ2V0JyxcbiAgJ3BvcG92ZXJ0YXJnZXRhY3Rpb24nLFxuICAncG9zdGVyJyxcbiAgJ3ByZWxvYWQnLFxuICAncHViZGF0ZScsXG4gICdyYWRpb2dyb3VwJyxcbiAgJ3JlYWRvbmx5JyxcbiAgJ3JlbCcsXG4gICdyZXF1aXJlZCcsXG4gICdyZXYnLFxuICAncmV2ZXJzZWQnLFxuICAncm9sZScsXG4gICdyb3dzJyxcbiAgJ3Jvd3NwYW4nLFxuICAnc3BlbGxjaGVjaycsXG4gICdzY29wZScsXG4gICdzZWxlY3RlZCcsXG4gICdzaGFwZScsXG4gICdzaXplJyxcbiAgJ3NpemVzJyxcbiAgJ3Nsb3QnLFxuICAnc3BhbicsXG4gICdzcmNsYW5nJyxcbiAgJ3N0YXJ0JyxcbiAgJ3NyYycsXG4gICdzcmNzZXQnLFxuICAnc3RlcCcsXG4gICdzdHlsZScsXG4gICdzdW1tYXJ5JyxcbiAgJ3RhYmluZGV4JyxcbiAgJ3RpdGxlJyxcbiAgJ3RyYW5zbGF0ZScsXG4gICd0eXBlJyxcbiAgJ3VzZW1hcCcsXG4gICd2YWxpZ24nLFxuICAndmFsdWUnLFxuICAnd2lkdGgnLFxuICAnd3JhcCcsXG4gICd4bWxucycsXG4gICdzbG90Jyxcbl0gYXMgY29uc3QpO1xuXG5leHBvcnQgY29uc3Qgc3ZnID0gZnJlZXplKFtcbiAgJ2FjY2VudC1oZWlnaHQnLFxuICAnYWNjdW11bGF0ZScsXG4gICdhZGRpdGl2ZScsXG4gICdhbGlnbm1lbnQtYmFzZWxpbmUnLFxuICAnYW1wbGl0dWRlJyxcbiAgJ2FzY2VudCcsXG4gICdhdHRyaWJ1dGVuYW1lJyxcbiAgJ2F0dHJpYnV0ZXR5cGUnLFxuICAnYXppbXV0aCcsXG4gICdiYXNlZnJlcXVlbmN5JyxcbiAgJ2Jhc2VsaW5lLXNoaWZ0JyxcbiAgJ2JlZ2luJyxcbiAgJ2JpYXMnLFxuICAnYnknLFxuICAnY2xhc3MnLFxuICAnY2xpcCcsXG4gICdjbGlwcGF0aHVuaXRzJyxcbiAgJ2NsaXAtcGF0aCcsXG4gICdjbGlwLXJ1bGUnLFxuICAnY29sb3InLFxuICAnY29sb3ItaW50ZXJwb2xhdGlvbicsXG4gICdjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnMnLFxuICAnY29sb3ItcHJvZmlsZScsXG4gICdjb2xvci1yZW5kZXJpbmcnLFxuICAnY3gnLFxuICAnY3knLFxuICAnZCcsXG4gICdkeCcsXG4gICdkeScsXG4gICdkaWZmdXNlY29uc3RhbnQnLFxuICAnZGlyZWN0aW9uJyxcbiAgJ2Rpc3BsYXknLFxuICAnZGl2aXNvcicsXG4gICdkdXInLFxuICAnZWRnZW1vZGUnLFxuICAnZWxldmF0aW9uJyxcbiAgJ2VuZCcsXG4gICdleHBvbmVudCcsXG4gICdmaWxsJyxcbiAgJ2ZpbGwtb3BhY2l0eScsXG4gICdmaWxsLXJ1bGUnLFxuICAnZmlsdGVyJyxcbiAgJ2ZpbHRlcnVuaXRzJyxcbiAgJ2Zsb29kLWNvbG9yJyxcbiAgJ2Zsb29kLW9wYWNpdHknLFxuICAnZm9udC1mYW1pbHknLFxuICAnZm9udC1zaXplJyxcbiAgJ2ZvbnQtc2l6ZS1hZGp1c3QnLFxuICAnZm9udC1zdHJldGNoJyxcbiAgJ2ZvbnQtc3R5bGUnLFxuICAnZm9udC12YXJpYW50JyxcbiAgJ2ZvbnQtd2VpZ2h0JyxcbiAgJ2Z4JyxcbiAgJ2Z5JyxcbiAgJ2cxJyxcbiAgJ2cyJyxcbiAgJ2dseXBoLW5hbWUnLFxuICAnZ2x5cGhyZWYnLFxuICAnZ3JhZGllbnR1bml0cycsXG4gICdncmFkaWVudHRyYW5zZm9ybScsXG4gICdoZWlnaHQnLFxuICAnaHJlZicsXG4gICdpZCcsXG4gICdpbWFnZS1yZW5kZXJpbmcnLFxuICAnaW4nLFxuICAnaW4yJyxcbiAgJ2ludGVyY2VwdCcsXG4gICdrJyxcbiAgJ2sxJyxcbiAgJ2syJyxcbiAgJ2szJyxcbiAgJ2s0JyxcbiAgJ2tlcm5pbmcnLFxuICAna2V5cG9pbnRzJyxcbiAgJ2tleXNwbGluZXMnLFxuICAna2V5dGltZXMnLFxuICAnbGFuZycsXG4gICdsZW5ndGhhZGp1c3QnLFxuICAnbGV0dGVyLXNwYWNpbmcnLFxuICAna2VybmVsbWF0cml4JyxcbiAgJ2tlcm5lbHVuaXRsZW5ndGgnLFxuICAnbGlnaHRpbmctY29sb3InLFxuICAnbG9jYWwnLFxuICAnbWFya2VyLWVuZCcsXG4gICdtYXJrZXItbWlkJyxcbiAgJ21hcmtlci1zdGFydCcsXG4gICdtYXJrZXJoZWlnaHQnLFxuICAnbWFya2VydW5pdHMnLFxuICAnbWFya2Vyd2lkdGgnLFxuICAnbWFza2NvbnRlbnR1bml0cycsXG4gICdtYXNrdW5pdHMnLFxuICAnbWF4JyxcbiAgJ21hc2snLFxuICAnbWFzay10eXBlJyxcbiAgJ21lZGlhJyxcbiAgJ21ldGhvZCcsXG4gICdtb2RlJyxcbiAgJ21pbicsXG4gICduYW1lJyxcbiAgJ251bW9jdGF2ZXMnLFxuICAnb2Zmc2V0JyxcbiAgJ29wZXJhdG9yJyxcbiAgJ29wYWNpdHknLFxuICAnb3JkZXInLFxuICAnb3JpZW50JyxcbiAgJ29yaWVudGF0aW9uJyxcbiAgJ29yaWdpbicsXG4gICdvdmVyZmxvdycsXG4gICdwYWludC1vcmRlcicsXG4gICdwYXRoJyxcbiAgJ3BhdGhsZW5ndGgnLFxuICAncGF0dGVybmNvbnRlbnR1bml0cycsXG4gICdwYXR0ZXJudHJhbnNmb3JtJyxcbiAgJ3BhdHRlcm51bml0cycsXG4gICdwb2ludHMnLFxuICAncHJlc2VydmVhbHBoYScsXG4gICdwcmVzZXJ2ZWFzcGVjdHJhdGlvJyxcbiAgJ3ByaW1pdGl2ZXVuaXRzJyxcbiAgJ3InLFxuICAncngnLFxuICAncnknLFxuICAncmFkaXVzJyxcbiAgJ3JlZngnLFxuICAncmVmeScsXG4gICdyZXBlYXRjb3VudCcsXG4gICdyZXBlYXRkdXInLFxuICAncmVzdGFydCcsXG4gICdyZXN1bHQnLFxuICAncm90YXRlJyxcbiAgJ3NjYWxlJyxcbiAgJ3NlZWQnLFxuICAnc2hhcGUtcmVuZGVyaW5nJyxcbiAgJ3Nsb3BlJyxcbiAgJ3NwZWN1bGFyY29uc3RhbnQnLFxuICAnc3BlY3VsYXJleHBvbmVudCcsXG4gICdzcHJlYWRtZXRob2QnLFxuICAnc3RhcnRvZmZzZXQnLFxuICAnc3RkZGV2aWF0aW9uJyxcbiAgJ3N0aXRjaHRpbGVzJyxcbiAgJ3N0b3AtY29sb3InLFxuICAnc3RvcC1vcGFjaXR5JyxcbiAgJ3N0cm9rZS1kYXNoYXJyYXknLFxuICAnc3Ryb2tlLWRhc2hvZmZzZXQnLFxuICAnc3Ryb2tlLWxpbmVjYXAnLFxuICAnc3Ryb2tlLWxpbmVqb2luJyxcbiAgJ3N0cm9rZS1taXRlcmxpbWl0JyxcbiAgJ3N0cm9rZS1vcGFjaXR5JyxcbiAgJ3N0cm9rZScsXG4gICdzdHJva2Utd2lkdGgnLFxuICAnc3R5bGUnLFxuICAnc3VyZmFjZXNjYWxlJyxcbiAgJ3N5c3RlbWxhbmd1YWdlJyxcbiAgJ3RhYmluZGV4JyxcbiAgJ3RhYmxldmFsdWVzJyxcbiAgJ3RhcmdldHgnLFxuICAndGFyZ2V0eScsXG4gICd0cmFuc2Zvcm0nLFxuICAndHJhbnNmb3JtLW9yaWdpbicsXG4gICd0ZXh0LWFuY2hvcicsXG4gICd0ZXh0LWRlY29yYXRpb24nLFxuICAndGV4dC1yZW5kZXJpbmcnLFxuICAndGV4dGxlbmd0aCcsXG4gICd0eXBlJyxcbiAgJ3UxJyxcbiAgJ3UyJyxcbiAgJ3VuaWNvZGUnLFxuICAndmFsdWVzJyxcbiAgJ3ZpZXdib3gnLFxuICAndmlzaWJpbGl0eScsXG4gICd2ZXJzaW9uJyxcbiAgJ3ZlcnQtYWR2LXknLFxuICAndmVydC1vcmlnaW4teCcsXG4gICd2ZXJ0LW9yaWdpbi15JyxcbiAgJ3dpZHRoJyxcbiAgJ3dvcmQtc3BhY2luZycsXG4gICd3cmFwJyxcbiAgJ3dyaXRpbmctbW9kZScsXG4gICd4Y2hhbm5lbHNlbGVjdG9yJyxcbiAgJ3ljaGFubmVsc2VsZWN0b3InLFxuICAneCcsXG4gICd4MScsXG4gICd4MicsXG4gICd4bWxucycsXG4gICd5JyxcbiAgJ3kxJyxcbiAgJ3kyJyxcbiAgJ3onLFxuICAnem9vbWFuZHBhbicsXG5dIGFzIGNvbnN0KTtcblxuZXhwb3J0IGNvbnN0IG1hdGhNbCA9IGZyZWV6ZShbXG4gICdhY2NlbnQnLFxuICAnYWNjZW50dW5kZXInLFxuICAnYWxpZ24nLFxuICAnYmV2ZWxsZWQnLFxuICAnY2xvc2UnLFxuICAnY29sdW1uc2FsaWduJyxcbiAgJ2NvbHVtbmxpbmVzJyxcbiAgJ2NvbHVtbnNwYW4nLFxuICAnZGVub21hbGlnbicsXG4gICdkZXB0aCcsXG4gICdkaXInLFxuICAnZGlzcGxheScsXG4gICdkaXNwbGF5c3R5bGUnLFxuICAnZW5jb2RpbmcnLFxuICAnZmVuY2UnLFxuICAnZnJhbWUnLFxuICAnaGVpZ2h0JyxcbiAgJ2hyZWYnLFxuICAnaWQnLFxuICAnbGFyZ2VvcCcsXG4gICdsZW5ndGgnLFxuICAnbGluZXRoaWNrbmVzcycsXG4gICdsc3BhY2UnLFxuICAnbHF1b3RlJyxcbiAgJ21hdGhiYWNrZ3JvdW5kJyxcbiAgJ21hdGhjb2xvcicsXG4gICdtYXRoc2l6ZScsXG4gICdtYXRodmFyaWFudCcsXG4gICdtYXhzaXplJyxcbiAgJ21pbnNpemUnLFxuICAnbW92YWJsZWxpbWl0cycsXG4gICdub3RhdGlvbicsXG4gICdudW1hbGlnbicsXG4gICdvcGVuJyxcbiAgJ3Jvd2FsaWduJyxcbiAgJ3Jvd2xpbmVzJyxcbiAgJ3Jvd3NwYWNpbmcnLFxuICAncm93c3BhbicsXG4gICdyc3BhY2UnLFxuICAncnF1b3RlJyxcbiAgJ3NjcmlwdGxldmVsJyxcbiAgJ3NjcmlwdG1pbnNpemUnLFxuICAnc2NyaXB0c2l6ZW11bHRpcGxpZXInLFxuICAnc2VsZWN0aW9uJyxcbiAgJ3NlcGFyYXRvcicsXG4gICdzZXBhcmF0b3JzJyxcbiAgJ3N0cmV0Y2h5JyxcbiAgJ3N1YnNjcmlwdHNoaWZ0JyxcbiAgJ3N1cHNjcmlwdHNoaWZ0JyxcbiAgJ3N5bW1ldHJpYycsXG4gICd2b2Zmc2V0JyxcbiAgJ3dpZHRoJyxcbiAgJ3htbG5zJyxcbl0pO1xuXG5leHBvcnQgY29uc3QgeG1sID0gZnJlZXplKFtcbiAgJ3hsaW5rOmhyZWYnLFxuICAneG1sOmlkJyxcbiAgJ3hsaW5rOnRpdGxlJyxcbiAgJ3htbDpzcGFjZScsXG4gICd4bWxuczp4bGluaycsXG5dIGFzIGNvbnN0KTtcbiIsICJpbXBvcnQgeyBzZWFsIH0gZnJvbSAnLi91dGlscy5qcyc7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL2JldHRlci1yZWdleFxuZXhwb3J0IGNvbnN0IE1VU1RBQ0hFX0VYUFIgPSBzZWFsKC9cXHtcXHtbXFx3XFxXXSp8W1xcd1xcV10qXFx9XFx9L2dtKTsgLy8gU3BlY2lmeSB0ZW1wbGF0ZSBkZXRlY3Rpb24gcmVnZXggZm9yIFNBRkVfRk9SX1RFTVBMQVRFUyBtb2RlXG5leHBvcnQgY29uc3QgRVJCX0VYUFIgPSBzZWFsKC88JVtcXHdcXFddKnxbXFx3XFxXXSolPi9nbSk7XG5leHBvcnQgY29uc3QgVE1QTElUX0VYUFIgPSBzZWFsKC9cXCRcXHtbXFx3XFxXXSovZ20pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHVuaWNvcm4vYmV0dGVyLXJlZ2V4XG5leHBvcnQgY29uc3QgREFUQV9BVFRSID0gc2VhbCgvXmRhdGEtW1xcLVxcdy5cXHUwMEI3LVxcdUZGRkZdKyQvKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2VsZXNzLWVzY2FwZVxuZXhwb3J0IGNvbnN0IEFSSUFfQVRUUiA9IHNlYWwoL15hcmlhLVtcXC1cXHddKyQvKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2VsZXNzLWVzY2FwZVxuZXhwb3J0IGNvbnN0IElTX0FMTE9XRURfVVJJID0gc2VhbChcbiAgL14oPzooPzooPzpmfGh0KXRwcz98bWFpbHRvfHRlbHxjYWxsdG98c21zfGNpZHx4bXBwfG1hdHJpeCk6fFteYS16XXxbYS16Ky5cXC1dKyg/OlteYS16Ky5cXC06XXwkKSkvaSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZWxlc3MtZXNjYXBlXG4pO1xuZXhwb3J0IGNvbnN0IElTX1NDUklQVF9PUl9EQVRBID0gc2VhbCgvXig/OlxcdytzY3JpcHR8ZGF0YSk6L2kpO1xuZXhwb3J0IGNvbnN0IEFUVFJfV0hJVEVTUEFDRSA9IHNlYWwoXG4gIC9bXFx1MDAwMC1cXHUwMDIwXFx1MDBBMFxcdTE2ODBcXHUxODBFXFx1MjAwMC1cXHUyMDI5XFx1MjA1RlxcdTMwMDBdL2cgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb250cm9sLXJlZ2V4XG4pO1xuZXhwb3J0IGNvbnN0IERPQ1RZUEVfTkFNRSA9IHNlYWwoL15odG1sJC9pKTtcbmV4cG9ydCBjb25zdCBDVVNUT01fRUxFTUVOVCA9IHNlYWwoL15bYS16XVsuXFx3XSooLVsuXFx3XSspKyQvaSk7XG4iLCAiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L2luZGVudCAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIFRydXN0ZWRIVE1MLFxuICBUcnVzdGVkVHlwZXNXaW5kb3csXG59IGZyb20gJ3RydXN0ZWQtdHlwZXMvbGliL2luZGV4LmpzJztcbmltcG9ydCB0eXBlIHsgQ29uZmlnLCBVc2VQcm9maWxlc0NvbmZpZyB9IGZyb20gJy4vY29uZmlnJztcbmltcG9ydCAqIGFzIFRBR1MgZnJvbSAnLi90YWdzLmpzJztcbmltcG9ydCAqIGFzIEFUVFJTIGZyb20gJy4vYXR0cnMuanMnO1xuaW1wb3J0ICogYXMgRVhQUkVTU0lPTlMgZnJvbSAnLi9yZWdleHAuanMnO1xuaW1wb3J0IHtcbiAgYWRkVG9TZXQsXG4gIGNsb25lLFxuICBlbnRyaWVzLFxuICBmcmVlemUsXG4gIGFycmF5Rm9yRWFjaCxcbiAgYXJyYXlMYXN0SW5kZXhPZixcbiAgYXJyYXlQb3AsXG4gIGFycmF5UHVzaCxcbiAgYXJyYXlTcGxpY2UsXG4gIHN0cmluZ01hdGNoLFxuICBzdHJpbmdSZXBsYWNlLFxuICBzdHJpbmdUb0xvd2VyQ2FzZSxcbiAgc3RyaW5nVG9TdHJpbmcsXG4gIHN0cmluZ0luZGV4T2YsXG4gIHN0cmluZ1RyaW0sXG4gIHJlZ0V4cFRlc3QsXG4gIHR5cGVFcnJvckNyZWF0ZSxcbiAgbG9va3VwR2V0dGVyLFxuICBjcmVhdGUsXG4gIG9iamVjdEhhc093blByb3BlcnR5LFxufSBmcm9tICcuL3V0aWxzLmpzJztcblxuZXhwb3J0IHR5cGUgeyBDb25maWcgfSBmcm9tICcuL2NvbmZpZyc7XG5cbmRlY2xhcmUgY29uc3QgVkVSU0lPTjogc3RyaW5nO1xuXG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvTm9kZS9ub2RlVHlwZVxuY29uc3QgTk9ERV9UWVBFID0ge1xuICBlbGVtZW50OiAxLFxuICBhdHRyaWJ1dGU6IDIsXG4gIHRleHQ6IDMsXG4gIGNkYXRhU2VjdGlvbjogNCxcbiAgZW50aXR5UmVmZXJlbmNlOiA1LCAvLyBEZXByZWNhdGVkXG4gIGVudGl0eU5vZGU6IDYsIC8vIERlcHJlY2F0ZWRcbiAgcHJvZ3Jlc3NpbmdJbnN0cnVjdGlvbjogNyxcbiAgY29tbWVudDogOCxcbiAgZG9jdW1lbnQ6IDksXG4gIGRvY3VtZW50VHlwZTogMTAsXG4gIGRvY3VtZW50RnJhZ21lbnQ6IDExLFxuICBub3RhdGlvbjogMTIsIC8vIERlcHJlY2F0ZWRcbn07XG5cbmNvbnN0IGdldEdsb2JhbCA9IGZ1bmN0aW9uICgpOiBXaW5kb3dMaWtlIHtcbiAgcmV0dXJuIHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnID8gbnVsbCA6IHdpbmRvdztcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5vLW9wIHBvbGljeSBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuXG4gKiBEb24ndCBleHBvcnQgdGhpcyBmdW5jdGlvbiBvdXRzaWRlIHRoaXMgbW9kdWxlIVxuICogQHBhcmFtIHRydXN0ZWRUeXBlcyBUaGUgcG9saWN5IGZhY3RvcnkuXG4gKiBAcGFyYW0gcHVyaWZ5SG9zdEVsZW1lbnQgVGhlIFNjcmlwdCBlbGVtZW50IHVzZWQgdG8gbG9hZCBET01QdXJpZnkgKHRvIGRldGVybWluZSBwb2xpY3kgbmFtZSBzdWZmaXgpLlxuICogQHJldHVybiBUaGUgcG9saWN5IGNyZWF0ZWQgKG9yIG51bGwsIGlmIFRydXN0ZWQgVHlwZXNcbiAqIGFyZSBub3Qgc3VwcG9ydGVkIG9yIGNyZWF0aW5nIHRoZSBwb2xpY3kgZmFpbGVkKS5cbiAqL1xuY29uc3QgX2NyZWF0ZVRydXN0ZWRUeXBlc1BvbGljeSA9IGZ1bmN0aW9uIChcbiAgdHJ1c3RlZFR5cGVzOiBUcnVzdGVkVHlwZVBvbGljeUZhY3RvcnksXG4gIHB1cmlmeUhvc3RFbGVtZW50OiBIVE1MU2NyaXB0RWxlbWVudFxuKSB7XG4gIGlmIChcbiAgICB0eXBlb2YgdHJ1c3RlZFR5cGVzICE9PSAnb2JqZWN0JyB8fFxuICAgIHR5cGVvZiB0cnVzdGVkVHlwZXMuY3JlYXRlUG9saWN5ICE9PSAnZnVuY3Rpb24nXG4gICkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gQWxsb3cgdGhlIGNhbGxlcnMgdG8gY29udHJvbCB0aGUgdW5pcXVlIHBvbGljeSBuYW1lXG4gIC8vIGJ5IGFkZGluZyBhIGRhdGEtdHQtcG9saWN5LXN1ZmZpeCB0byB0aGUgc2NyaXB0IGVsZW1lbnQgd2l0aCB0aGUgRE9NUHVyaWZ5LlxuICAvLyBQb2xpY3kgY3JlYXRpb24gd2l0aCBkdXBsaWNhdGUgbmFtZXMgdGhyb3dzIGluIFRydXN0ZWQgVHlwZXMuXG4gIGxldCBzdWZmaXggPSBudWxsO1xuICBjb25zdCBBVFRSX05BTUUgPSAnZGF0YS10dC1wb2xpY3ktc3VmZml4JztcbiAgaWYgKHB1cmlmeUhvc3RFbGVtZW50ICYmIHB1cmlmeUhvc3RFbGVtZW50Lmhhc0F0dHJpYnV0ZShBVFRSX05BTUUpKSB7XG4gICAgc3VmZml4ID0gcHVyaWZ5SG9zdEVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJfTkFNRSk7XG4gIH1cblxuICBjb25zdCBwb2xpY3lOYW1lID0gJ2RvbXB1cmlmeScgKyAoc3VmZml4ID8gJyMnICsgc3VmZml4IDogJycpO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIHRydXN0ZWRUeXBlcy5jcmVhdGVQb2xpY3kocG9saWN5TmFtZSwge1xuICAgICAgY3JlYXRlSFRNTChodG1sKSB7XG4gICAgICAgIHJldHVybiBodG1sO1xuICAgICAgfSxcbiAgICAgIGNyZWF0ZVNjcmlwdFVSTChzY3JpcHRVcmwpIHtcbiAgICAgICAgcmV0dXJuIHNjcmlwdFVybDtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0gY2F0Y2ggKF8pIHtcbiAgICAvLyBQb2xpY3kgY3JlYXRpb24gZmFpbGVkIChtb3N0IGxpa2VseSBhbm90aGVyIERPTVB1cmlmeSBzY3JpcHQgaGFzXG4gICAgLy8gYWxyZWFkeSBydW4pLiBTa2lwIGNyZWF0aW5nIHRoZSBwb2xpY3ksIGFzIHRoaXMgd2lsbCBvbmx5IGNhdXNlIGVycm9yc1xuICAgIC8vIGlmIFRUIGFyZSBlbmZvcmNlZC5cbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAnVHJ1c3RlZFR5cGVzIHBvbGljeSAnICsgcG9saWN5TmFtZSArICcgY291bGQgbm90IGJlIGNyZWF0ZWQuJ1xuICAgICk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn07XG5cbmNvbnN0IF9jcmVhdGVIb29rc01hcCA9IGZ1bmN0aW9uICgpOiBIb29rc01hcCB7XG4gIHJldHVybiB7XG4gICAgYWZ0ZXJTYW5pdGl6ZUF0dHJpYnV0ZXM6IFtdLFxuICAgIGFmdGVyU2FuaXRpemVFbGVtZW50czogW10sXG4gICAgYWZ0ZXJTYW5pdGl6ZVNoYWRvd0RPTTogW10sXG4gICAgYmVmb3JlU2FuaXRpemVBdHRyaWJ1dGVzOiBbXSxcbiAgICBiZWZvcmVTYW5pdGl6ZUVsZW1lbnRzOiBbXSxcbiAgICBiZWZvcmVTYW5pdGl6ZVNoYWRvd0RPTTogW10sXG4gICAgdXBvblNhbml0aXplQXR0cmlidXRlOiBbXSxcbiAgICB1cG9uU2FuaXRpemVFbGVtZW50OiBbXSxcbiAgICB1cG9uU2FuaXRpemVTaGFkb3dOb2RlOiBbXSxcbiAgfTtcbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZURPTVB1cmlmeSh3aW5kb3c6IFdpbmRvd0xpa2UgPSBnZXRHbG9iYWwoKSk6IERPTVB1cmlmeSB7XG4gIGNvbnN0IERPTVB1cmlmeTogRE9NUHVyaWZ5ID0gKHJvb3Q6IFdpbmRvd0xpa2UpID0+IGNyZWF0ZURPTVB1cmlmeShyb290KTtcblxuICBET01QdXJpZnkudmVyc2lvbiA9IFZFUlNJT047XG5cbiAgRE9NUHVyaWZ5LnJlbW92ZWQgPSBbXTtcblxuICBpZiAoXG4gICAgIXdpbmRvdyB8fFxuICAgICF3aW5kb3cuZG9jdW1lbnQgfHxcbiAgICB3aW5kb3cuZG9jdW1lbnQubm9kZVR5cGUgIT09IE5PREVfVFlQRS5kb2N1bWVudCB8fFxuICAgICF3aW5kb3cuRWxlbWVudFxuICApIHtcbiAgICAvLyBOb3QgcnVubmluZyBpbiBhIGJyb3dzZXIsIHByb3ZpZGUgYSBmYWN0b3J5IGZ1bmN0aW9uXG4gICAgLy8gc28gdGhhdCB5b3UgY2FuIHBhc3MgeW91ciBvd24gV2luZG93XG4gICAgRE9NUHVyaWZ5LmlzU3VwcG9ydGVkID0gZmFsc2U7XG5cbiAgICByZXR1cm4gRE9NUHVyaWZ5O1xuICB9XG5cbiAgbGV0IHsgZG9jdW1lbnQgfSA9IHdpbmRvdztcblxuICBjb25zdCBvcmlnaW5hbERvY3VtZW50ID0gZG9jdW1lbnQ7XG4gIGNvbnN0IGN1cnJlbnRTY3JpcHQ6IEhUTUxTY3JpcHRFbGVtZW50ID1cbiAgICBvcmlnaW5hbERvY3VtZW50LmN1cnJlbnRTY3JpcHQgYXMgSFRNTFNjcmlwdEVsZW1lbnQ7XG4gIGNvbnN0IHtcbiAgICBEb2N1bWVudEZyYWdtZW50LFxuICAgIEhUTUxUZW1wbGF0ZUVsZW1lbnQsXG4gICAgTm9kZSxcbiAgICBFbGVtZW50LFxuICAgIE5vZGVGaWx0ZXIsXG4gICAgTmFtZWROb2RlTWFwID0gd2luZG93Lk5hbWVkTm9kZU1hcCB8fCAod2luZG93IGFzIGFueSkuTW96TmFtZWRBdHRyTWFwLFxuICAgIEhUTUxGb3JtRWxlbWVudCxcbiAgICBET01QYXJzZXIsXG4gICAgdHJ1c3RlZFR5cGVzLFxuICB9ID0gd2luZG93O1xuXG4gIGNvbnN0IEVsZW1lbnRQcm90b3R5cGUgPSBFbGVtZW50LnByb3RvdHlwZTtcblxuICBjb25zdCBjbG9uZU5vZGUgPSBsb29rdXBHZXR0ZXIoRWxlbWVudFByb3RvdHlwZSwgJ2Nsb25lTm9kZScpO1xuICBjb25zdCByZW1vdmUgPSBsb29rdXBHZXR0ZXIoRWxlbWVudFByb3RvdHlwZSwgJ3JlbW92ZScpO1xuICBjb25zdCBnZXROZXh0U2libGluZyA9IGxvb2t1cEdldHRlcihFbGVtZW50UHJvdG90eXBlLCAnbmV4dFNpYmxpbmcnKTtcbiAgY29uc3QgZ2V0Q2hpbGROb2RlcyA9IGxvb2t1cEdldHRlcihFbGVtZW50UHJvdG90eXBlLCAnY2hpbGROb2RlcycpO1xuICBjb25zdCBnZXRQYXJlbnROb2RlID0gbG9va3VwR2V0dGVyKEVsZW1lbnRQcm90b3R5cGUsICdwYXJlbnROb2RlJyk7XG5cbiAgLy8gQXMgcGVyIGlzc3VlICM0NywgdGhlIHdlYi1jb21wb25lbnRzIHJlZ2lzdHJ5IGlzIGluaGVyaXRlZCBieSBhXG4gIC8vIG5ldyBkb2N1bWVudCBjcmVhdGVkIHZpYSBjcmVhdGVIVE1MRG9jdW1lbnQuIEFzIHBlciB0aGUgc3BlY1xuICAvLyAoaHR0cDovL3czYy5naXRodWIuaW8vd2ViY29tcG9uZW50cy9zcGVjL2N1c3RvbS8jY3JlYXRpbmctYW5kLXBhc3NpbmctcmVnaXN0cmllcylcbiAgLy8gYSBuZXcgZW1wdHkgcmVnaXN0cnkgaXMgdXNlZCB3aGVuIGNyZWF0aW5nIGEgdGVtcGxhdGUgY29udGVudHMgb3duZXJcbiAgLy8gZG9jdW1lbnQsIHNvIHdlIHVzZSB0aGF0IGFzIG91ciBwYXJlbnQgZG9jdW1lbnQgdG8gZW5zdXJlIG5vdGhpbmdcbiAgLy8gaXMgaW5oZXJpdGVkLlxuICBpZiAodHlwZW9mIEhUTUxUZW1wbGF0ZUVsZW1lbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7XG4gICAgaWYgKHRlbXBsYXRlLmNvbnRlbnQgJiYgdGVtcGxhdGUuY29udGVudC5vd25lckRvY3VtZW50KSB7XG4gICAgICBkb2N1bWVudCA9IHRlbXBsYXRlLmNvbnRlbnQub3duZXJEb2N1bWVudDtcbiAgICB9XG4gIH1cblxuICBsZXQgdHJ1c3RlZFR5cGVzUG9saWN5O1xuICBsZXQgZW1wdHlIVE1MID0gJyc7XG5cbiAgY29uc3Qge1xuICAgIGltcGxlbWVudGF0aW9uLFxuICAgIGNyZWF0ZU5vZGVJdGVyYXRvcixcbiAgICBjcmVhdGVEb2N1bWVudEZyYWdtZW50LFxuICAgIGdldEVsZW1lbnRzQnlUYWdOYW1lLFxuICB9ID0gZG9jdW1lbnQ7XG4gIGNvbnN0IHsgaW1wb3J0Tm9kZSB9ID0gb3JpZ2luYWxEb2N1bWVudDtcblxuICBsZXQgaG9va3MgPSBfY3JlYXRlSG9va3NNYXAoKTtcblxuICAvKipcbiAgICogRXhwb3NlIHdoZXRoZXIgdGhpcyBicm93c2VyIHN1cHBvcnRzIHJ1bm5pbmcgdGhlIGZ1bGwgRE9NUHVyaWZ5LlxuICAgKi9cbiAgRE9NUHVyaWZ5LmlzU3VwcG9ydGVkID1cbiAgICB0eXBlb2YgZW50cmllcyA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIHR5cGVvZiBnZXRQYXJlbnROb2RlID09PSAnZnVuY3Rpb24nICYmXG4gICAgaW1wbGVtZW50YXRpb24gJiZcbiAgICBpbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQgIT09IHVuZGVmaW5lZDtcblxuICBjb25zdCB7XG4gICAgTVVTVEFDSEVfRVhQUixcbiAgICBFUkJfRVhQUixcbiAgICBUTVBMSVRfRVhQUixcbiAgICBEQVRBX0FUVFIsXG4gICAgQVJJQV9BVFRSLFxuICAgIElTX1NDUklQVF9PUl9EQVRBLFxuICAgIEFUVFJfV0hJVEVTUEFDRSxcbiAgICBDVVNUT01fRUxFTUVOVCxcbiAgfSA9IEVYUFJFU1NJT05TO1xuXG4gIGxldCB7IElTX0FMTE9XRURfVVJJIH0gPSBFWFBSRVNTSU9OUztcblxuICAvKipcbiAgICogV2UgY29uc2lkZXIgdGhlIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGJlbG93IHRvIGJlIHNhZmUuIElkZWFsbHlcbiAgICogZG9uJ3QgYWRkIGFueSBuZXcgb25lcyBidXQgZmVlbCBmcmVlIHRvIHJlbW92ZSB1bndhbnRlZCBvbmVzLlxuICAgKi9cblxuICAvKiBhbGxvd2VkIGVsZW1lbnQgbmFtZXMgKi9cbiAgbGV0IEFMTE9XRURfVEFHUyA9IG51bGw7XG4gIGNvbnN0IERFRkFVTFRfQUxMT1dFRF9UQUdTID0gYWRkVG9TZXQoe30sIFtcbiAgICAuLi5UQUdTLmh0bWwsXG4gICAgLi4uVEFHUy5zdmcsXG4gICAgLi4uVEFHUy5zdmdGaWx0ZXJzLFxuICAgIC4uLlRBR1MubWF0aE1sLFxuICAgIC4uLlRBR1MudGV4dCxcbiAgXSk7XG5cbiAgLyogQWxsb3dlZCBhdHRyaWJ1dGUgbmFtZXMgKi9cbiAgbGV0IEFMTE9XRURfQVRUUiA9IG51bGw7XG4gIGNvbnN0IERFRkFVTFRfQUxMT1dFRF9BVFRSID0gYWRkVG9TZXQoe30sIFtcbiAgICAuLi5BVFRSUy5odG1sLFxuICAgIC4uLkFUVFJTLnN2ZyxcbiAgICAuLi5BVFRSUy5tYXRoTWwsXG4gICAgLi4uQVRUUlMueG1sLFxuICBdKTtcblxuICAvKlxuICAgKiBDb25maWd1cmUgaG93IERPTVB1cmlmeSBzaG91bGQgaGFuZGxlIGN1c3RvbSBlbGVtZW50cyBhbmQgdGhlaXIgYXR0cmlidXRlcyBhcyB3ZWxsIGFzIGN1c3RvbWl6ZWQgYnVpbHQtaW4gZWxlbWVudHMuXG4gICAqIEBwcm9wZXJ0eSB7UmVnRXhwfEZ1bmN0aW9ufG51bGx9IHRhZ05hbWVDaGVjayBvbmUgb2YgW251bGwsIHJlZ2V4UGF0dGVybiwgcHJlZGljYXRlXS4gRGVmYXVsdDogYG51bGxgIChkaXNhbGxvdyBhbnkgY3VzdG9tIGVsZW1lbnRzKVxuICAgKiBAcHJvcGVydHkge1JlZ0V4cHxGdW5jdGlvbnxudWxsfSBhdHRyaWJ1dGVOYW1lQ2hlY2sgb25lIG9mIFtudWxsLCByZWdleFBhdHRlcm4sIHByZWRpY2F0ZV0uIERlZmF1bHQ6IGBudWxsYCAoZGlzYWxsb3cgYW55IGF0dHJpYnV0ZXMgbm90IG9uIHRoZSBhbGxvdyBsaXN0KVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IGFsbG93Q3VzdG9taXplZEJ1aWx0SW5FbGVtZW50cyBhbGxvdyBjdXN0b20gZWxlbWVudHMgZGVyaXZlZCBmcm9tIGJ1aWx0LWlucyBpZiB0aGV5IHBhc3MgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrLiBEZWZhdWx0OiBgZmFsc2VgLlxuICAgKi9cbiAgbGV0IENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HID0gT2JqZWN0LnNlYWwoXG4gICAgY3JlYXRlKG51bGwsIHtcbiAgICAgIHRhZ05hbWVDaGVjazoge1xuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IG51bGwsXG4gICAgICB9LFxuICAgICAgYXR0cmlidXRlTmFtZUNoZWNrOiB7XG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogbnVsbCxcbiAgICAgIH0sXG4gICAgICBhbGxvd0N1c3RvbWl6ZWRCdWlsdEluRWxlbWVudHM6IHtcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgfSlcbiAgKTtcblxuICAvKiBFeHBsaWNpdGx5IGZvcmJpZGRlbiB0YWdzIChvdmVycmlkZXMgQUxMT1dFRF9UQUdTL0FERF9UQUdTKSAqL1xuICBsZXQgRk9SQklEX1RBR1MgPSBudWxsO1xuXG4gIC8qIEV4cGxpY2l0bHkgZm9yYmlkZGVuIGF0dHJpYnV0ZXMgKG92ZXJyaWRlcyBBTExPV0VEX0FUVFIvQUREX0FUVFIpICovXG4gIGxldCBGT1JCSURfQVRUUiA9IG51bGw7XG5cbiAgLyogQ29uZmlnIG9iamVjdCB0byBzdG9yZSBBRERfVEFHUy9BRERfQVRUUiBmdW5jdGlvbnMgKHdoZW4gdXNlZCBhcyBmdW5jdGlvbnMpICovXG4gIGNvbnN0IEVYVFJBX0VMRU1FTlRfSEFORExJTkcgPSBPYmplY3Quc2VhbChcbiAgICBjcmVhdGUobnVsbCwge1xuICAgICAgdGFnQ2hlY2s6IHtcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgfSxcbiAgICAgIGF0dHJpYnV0ZUNoZWNrOiB7XG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogbnVsbCxcbiAgICAgIH0sXG4gICAgfSlcbiAgKTtcblxuICAvKiBEZWNpZGUgaWYgQVJJQSBhdHRyaWJ1dGVzIGFyZSBva2F5ICovXG4gIGxldCBBTExPV19BUklBX0FUVFIgPSB0cnVlO1xuXG4gIC8qIERlY2lkZSBpZiBjdXN0b20gZGF0YSBhdHRyaWJ1dGVzIGFyZSBva2F5ICovXG4gIGxldCBBTExPV19EQVRBX0FUVFIgPSB0cnVlO1xuXG4gIC8qIERlY2lkZSBpZiB1bmtub3duIHByb3RvY29scyBhcmUgb2theSAqL1xuICBsZXQgQUxMT1dfVU5LTk9XTl9QUk9UT0NPTFMgPSBmYWxzZTtcblxuICAvKiBEZWNpZGUgaWYgc2VsZi1jbG9zaW5nIHRhZ3MgaW4gYXR0cmlidXRlcyBhcmUgYWxsb3dlZC5cbiAgICogVXN1YWxseSByZW1vdmVkIGR1ZSB0byBhIG1YU1MgaXNzdWUgaW4galF1ZXJ5IDMuMCAqL1xuICBsZXQgQUxMT1dfU0VMRl9DTE9TRV9JTl9BVFRSID0gdHJ1ZTtcblxuICAvKiBPdXRwdXQgc2hvdWxkIGJlIHNhZmUgZm9yIGNvbW1vbiB0ZW1wbGF0ZSBlbmdpbmVzLlxuICAgKiBUaGlzIG1lYW5zLCBET01QdXJpZnkgcmVtb3ZlcyBkYXRhIGF0dHJpYnV0ZXMsIG11c3RhY2hlcyBhbmQgRVJCXG4gICAqL1xuICBsZXQgU0FGRV9GT1JfVEVNUExBVEVTID0gZmFsc2U7XG5cbiAgLyogT3V0cHV0IHNob3VsZCBiZSBzYWZlIGV2ZW4gZm9yIFhNTCB1c2VkIHdpdGhpbiBIVE1MIGFuZCBhbGlrZS5cbiAgICogVGhpcyBtZWFucywgRE9NUHVyaWZ5IHJlbW92ZXMgY29tbWVudHMgd2hlbiBjb250YWluaW5nIHJpc2t5IGNvbnRlbnQuXG4gICAqL1xuICBsZXQgU0FGRV9GT1JfWE1MID0gdHJ1ZTtcblxuICAvKiBEZWNpZGUgaWYgZG9jdW1lbnQgd2l0aCA8aHRtbD4uLi4gc2hvdWxkIGJlIHJldHVybmVkICovXG4gIGxldCBXSE9MRV9ET0NVTUVOVCA9IGZhbHNlO1xuXG4gIC8qIFRyYWNrIHdoZXRoZXIgY29uZmlnIGlzIGFscmVhZHkgc2V0IG9uIHRoaXMgaW5zdGFuY2Ugb2YgRE9NUHVyaWZ5LiAqL1xuICBsZXQgU0VUX0NPTkZJRyA9IGZhbHNlO1xuXG4gIC8qIERlY2lkZSBpZiBhbGwgZWxlbWVudHMgKGUuZy4gc3R5bGUsIHNjcmlwdCkgbXVzdCBiZSBjaGlsZHJlbiBvZlxuICAgKiBkb2N1bWVudC5ib2R5LiBCeSBkZWZhdWx0LCBicm93c2VycyBtaWdodCBtb3ZlIHRoZW0gdG8gZG9jdW1lbnQuaGVhZCAqL1xuICBsZXQgRk9SQ0VfQk9EWSA9IGZhbHNlO1xuXG4gIC8qIERlY2lkZSBpZiBhIERPTSBgSFRNTEJvZHlFbGVtZW50YCBzaG91bGQgYmUgcmV0dXJuZWQsIGluc3RlYWQgb2YgYSBodG1sXG4gICAqIHN0cmluZyAob3IgYSBUcnVzdGVkSFRNTCBvYmplY3QgaWYgVHJ1c3RlZCBUeXBlcyBhcmUgc3VwcG9ydGVkKS5cbiAgICogSWYgYFdIT0xFX0RPQ1VNRU5UYCBpcyBlbmFibGVkIGEgYEhUTUxIdG1sRWxlbWVudGAgd2lsbCBiZSByZXR1cm5lZCBpbnN0ZWFkXG4gICAqL1xuICBsZXQgUkVUVVJOX0RPTSA9IGZhbHNlO1xuXG4gIC8qIERlY2lkZSBpZiBhIERPTSBgRG9jdW1lbnRGcmFnbWVudGAgc2hvdWxkIGJlIHJldHVybmVkLCBpbnN0ZWFkIG9mIGEgaHRtbFxuICAgKiBzdHJpbmcgIChvciBhIFRydXN0ZWRIVE1MIG9iamVjdCBpZiBUcnVzdGVkIFR5cGVzIGFyZSBzdXBwb3J0ZWQpICovXG4gIGxldCBSRVRVUk5fRE9NX0ZSQUdNRU5UID0gZmFsc2U7XG5cbiAgLyogVHJ5IHRvIHJldHVybiBhIFRydXN0ZWQgVHlwZSBvYmplY3QgaW5zdGVhZCBvZiBhIHN0cmluZywgcmV0dXJuIGEgc3RyaW5nIGluXG4gICAqIGNhc2UgVHJ1c3RlZCBUeXBlcyBhcmUgbm90IHN1cHBvcnRlZCAgKi9cbiAgbGV0IFJFVFVSTl9UUlVTVEVEX1RZUEUgPSBmYWxzZTtcblxuICAvKiBPdXRwdXQgc2hvdWxkIGJlIGZyZWUgZnJvbSBET00gY2xvYmJlcmluZyBhdHRhY2tzP1xuICAgKiBUaGlzIHNhbml0aXplcyBtYXJrdXBzIG5hbWVkIHdpdGggY29sbGlkaW5nLCBjbG9iYmVyYWJsZSBidWlsdC1pbiBET00gQVBJcy5cbiAgICovXG4gIGxldCBTQU5JVElaRV9ET00gPSB0cnVlO1xuXG4gIC8qIEFjaGlldmUgZnVsbCBET00gQ2xvYmJlcmluZyBwcm90ZWN0aW9uIGJ5IGlzb2xhdGluZyB0aGUgbmFtZXNwYWNlIG9mIG5hbWVkXG4gICAqIHByb3BlcnRpZXMgYW5kIEpTIHZhcmlhYmxlcywgbWl0aWdhdGluZyBhdHRhY2tzIHRoYXQgYWJ1c2UgdGhlIEhUTUwvRE9NIHNwZWMgcnVsZXMuXG4gICAqXG4gICAqIEhUTUwvRE9NIHNwZWMgcnVsZXMgdGhhdCBlbmFibGUgRE9NIENsb2JiZXJpbmc6XG4gICAqICAgLSBOYW1lZCBBY2Nlc3Mgb24gV2luZG93ICjCpzcuMy4zKVxuICAgKiAgIC0gRE9NIFRyZWUgQWNjZXNzb3JzICjCpzMuMS41KVxuICAgKiAgIC0gRm9ybSBFbGVtZW50IFBhcmVudC1DaGlsZCBSZWxhdGlvbnMgKMKnNC4xMC4zKVxuICAgKiAgIC0gSWZyYW1lIHNyY2RvYyAvIE5lc3RlZCBXaW5kb3dQcm94aWVzICjCpzQuOC41KVxuICAgKiAgIC0gSFRNTENvbGxlY3Rpb24gKMKnNC4yLjEwLjIpXG4gICAqXG4gICAqIE5hbWVzcGFjZSBpc29sYXRpb24gaXMgaW1wbGVtZW50ZWQgYnkgcHJlZml4aW5nIGBpZGAgYW5kIGBuYW1lYCBhdHRyaWJ1dGVzXG4gICAqIHdpdGggYSBjb25zdGFudCBzdHJpbmcsIGkuZS4sIGB1c2VyLWNvbnRlbnQtYFxuICAgKi9cbiAgbGV0IFNBTklUSVpFX05BTUVEX1BST1BTID0gZmFsc2U7XG4gIGNvbnN0IFNBTklUSVpFX05BTUVEX1BST1BTX1BSRUZJWCA9ICd1c2VyLWNvbnRlbnQtJztcblxuICAvKiBLZWVwIGVsZW1lbnQgY29udGVudCB3aGVuIHJlbW92aW5nIGVsZW1lbnQ/ICovXG4gIGxldCBLRUVQX0NPTlRFTlQgPSB0cnVlO1xuXG4gIC8qIElmIGEgYE5vZGVgIGlzIHBhc3NlZCB0byBzYW5pdGl6ZSgpLCB0aGVuIHBlcmZvcm1zIHNhbml0aXphdGlvbiBpbi1wbGFjZSBpbnN0ZWFkXG4gICAqIG9mIGltcG9ydGluZyBpdCBpbnRvIGEgbmV3IERvY3VtZW50IGFuZCByZXR1cm5pbmcgYSBzYW5pdGl6ZWQgY29weSAqL1xuICBsZXQgSU5fUExBQ0UgPSBmYWxzZTtcblxuICAvKiBBbGxvdyB1c2FnZSBvZiBwcm9maWxlcyBsaWtlIGh0bWwsIHN2ZyBhbmQgbWF0aE1sICovXG4gIGxldCBVU0VfUFJPRklMRVM6IFVzZVByb2ZpbGVzQ29uZmlnIHwgZmFsc2UgPSB7fTtcblxuICAvKiBUYWdzIHRvIGlnbm9yZSBjb250ZW50IG9mIHdoZW4gS0VFUF9DT05URU5UIGlzIHRydWUgKi9cbiAgbGV0IEZPUkJJRF9DT05URU5UUyA9IG51bGw7XG4gIGNvbnN0IERFRkFVTFRfRk9SQklEX0NPTlRFTlRTID0gYWRkVG9TZXQoe30sIFtcbiAgICAnYW5ub3RhdGlvbi14bWwnLFxuICAgICdhdWRpbycsXG4gICAgJ2NvbGdyb3VwJyxcbiAgICAnZGVzYycsXG4gICAgJ2ZvcmVpZ25vYmplY3QnLFxuICAgICdoZWFkJyxcbiAgICAnaWZyYW1lJyxcbiAgICAnbWF0aCcsXG4gICAgJ21pJyxcbiAgICAnbW4nLFxuICAgICdtbycsXG4gICAgJ21zJyxcbiAgICAnbXRleHQnLFxuICAgICdub2VtYmVkJyxcbiAgICAnbm9mcmFtZXMnLFxuICAgICdub3NjcmlwdCcsXG4gICAgJ3BsYWludGV4dCcsXG4gICAgJ3NjcmlwdCcsXG4gICAgJ3N0eWxlJyxcbiAgICAnc3ZnJyxcbiAgICAndGVtcGxhdGUnLFxuICAgICd0aGVhZCcsXG4gICAgJ3RpdGxlJyxcbiAgICAndmlkZW8nLFxuICAgICd4bXAnLFxuICBdKTtcblxuICAvKiBUYWdzIHRoYXQgYXJlIHNhZmUgZm9yIGRhdGE6IFVSSXMgKi9cbiAgbGV0IERBVEFfVVJJX1RBR1MgPSBudWxsO1xuICBjb25zdCBERUZBVUxUX0RBVEFfVVJJX1RBR1MgPSBhZGRUb1NldCh7fSwgW1xuICAgICdhdWRpbycsXG4gICAgJ3ZpZGVvJyxcbiAgICAnaW1nJyxcbiAgICAnc291cmNlJyxcbiAgICAnaW1hZ2UnLFxuICAgICd0cmFjaycsXG4gIF0pO1xuXG4gIC8qIEF0dHJpYnV0ZXMgc2FmZSBmb3IgdmFsdWVzIGxpa2UgXCJqYXZhc2NyaXB0OlwiICovXG4gIGxldCBVUklfU0FGRV9BVFRSSUJVVEVTID0gbnVsbDtcbiAgY29uc3QgREVGQVVMVF9VUklfU0FGRV9BVFRSSUJVVEVTID0gYWRkVG9TZXQoe30sIFtcbiAgICAnYWx0JyxcbiAgICAnY2xhc3MnLFxuICAgICdmb3InLFxuICAgICdpZCcsXG4gICAgJ2xhYmVsJyxcbiAgICAnbmFtZScsXG4gICAgJ3BhdHRlcm4nLFxuICAgICdwbGFjZWhvbGRlcicsXG4gICAgJ3JvbGUnLFxuICAgICdzdW1tYXJ5JyxcbiAgICAndGl0bGUnLFxuICAgICd2YWx1ZScsXG4gICAgJ3N0eWxlJyxcbiAgICAneG1sbnMnLFxuICBdKTtcblxuICBjb25zdCBNQVRITUxfTkFNRVNQQUNFID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwnO1xuICBjb25zdCBTVkdfTkFNRVNQQUNFID0gJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJztcbiAgY29uc3QgSFRNTF9OQU1FU1BBQ0UgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCc7XG4gIC8qIERvY3VtZW50IG5hbWVzcGFjZSAqL1xuICBsZXQgTkFNRVNQQUNFID0gSFRNTF9OQU1FU1BBQ0U7XG4gIGxldCBJU19FTVBUWV9JTlBVVCA9IGZhbHNlO1xuXG4gIC8qIEFsbG93ZWQgWEhUTUwrWE1MIG5hbWVzcGFjZXMgKi9cbiAgbGV0IEFMTE9XRURfTkFNRVNQQUNFUyA9IG51bGw7XG4gIGNvbnN0IERFRkFVTFRfQUxMT1dFRF9OQU1FU1BBQ0VTID0gYWRkVG9TZXQoXG4gICAge30sXG4gICAgW01BVEhNTF9OQU1FU1BBQ0UsIFNWR19OQU1FU1BBQ0UsIEhUTUxfTkFNRVNQQUNFXSxcbiAgICBzdHJpbmdUb1N0cmluZ1xuICApO1xuXG4gIGxldCBNQVRITUxfVEVYVF9JTlRFR1JBVElPTl9QT0lOVFMgPSBhZGRUb1NldCh7fSwgW1xuICAgICdtaScsXG4gICAgJ21vJyxcbiAgICAnbW4nLFxuICAgICdtcycsXG4gICAgJ210ZXh0JyxcbiAgXSk7XG5cbiAgbGV0IEhUTUxfSU5URUdSQVRJT05fUE9JTlRTID0gYWRkVG9TZXQoe30sIFsnYW5ub3RhdGlvbi14bWwnXSk7XG5cbiAgLy8gQ2VydGFpbiBlbGVtZW50cyBhcmUgYWxsb3dlZCBpbiBib3RoIFNWRyBhbmQgSFRNTFxuICAvLyBuYW1lc3BhY2UuIFdlIG5lZWQgdG8gc3BlY2lmeSB0aGVtIGV4cGxpY2l0bHlcbiAgLy8gc28gdGhhdCB0aGV5IGRvbid0IGdldCBlcnJvbmVvdXNseSBkZWxldGVkIGZyb21cbiAgLy8gSFRNTCBuYW1lc3BhY2UuXG4gIGNvbnN0IENPTU1PTl9TVkdfQU5EX0hUTUxfRUxFTUVOVFMgPSBhZGRUb1NldCh7fSwgW1xuICAgICd0aXRsZScsXG4gICAgJ3N0eWxlJyxcbiAgICAnZm9udCcsXG4gICAgJ2EnLFxuICAgICdzY3JpcHQnLFxuICBdKTtcblxuICAvKiBQYXJzaW5nIG9mIHN0cmljdCBYSFRNTCBkb2N1bWVudHMgKi9cbiAgbGV0IFBBUlNFUl9NRURJQV9UWVBFOiBudWxsIHwgRE9NUGFyc2VyU3VwcG9ydGVkVHlwZSA9IG51bGw7XG4gIGNvbnN0IFNVUFBPUlRFRF9QQVJTRVJfTUVESUFfVFlQRVMgPSBbJ2FwcGxpY2F0aW9uL3hodG1sK3htbCcsICd0ZXh0L2h0bWwnXTtcbiAgY29uc3QgREVGQVVMVF9QQVJTRVJfTUVESUFfVFlQRSA9ICd0ZXh0L2h0bWwnO1xuICBsZXQgdHJhbnNmb3JtQ2FzZUZ1bmM6IG51bGwgfCBQYXJhbWV0ZXJzPHR5cGVvZiBhZGRUb1NldD5bMl0gPSBudWxsO1xuXG4gIC8qIEtlZXAgYSByZWZlcmVuY2UgdG8gY29uZmlnIHRvIHBhc3MgdG8gaG9va3MgKi9cbiAgbGV0IENPTkZJRzogQ29uZmlnIHwgbnVsbCA9IG51bGw7XG5cbiAgLyogSWRlYWxseSwgZG8gbm90IHRvdWNoIGFueXRoaW5nIGJlbG93IHRoaXMgbGluZSAqL1xuICAvKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICovXG5cbiAgY29uc3QgZm9ybUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdmb3JtJyk7XG5cbiAgY29uc3QgaXNSZWdleE9yRnVuY3Rpb24gPSBmdW5jdGlvbiAoXG4gICAgdGVzdFZhbHVlOiB1bmtub3duXG4gICk6IHRlc3RWYWx1ZSBpcyBGdW5jdGlvbiB8IFJlZ0V4cCB7XG4gICAgcmV0dXJuIHRlc3RWYWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCB8fCB0ZXN0VmFsdWUgaW5zdGFuY2VvZiBGdW5jdGlvbjtcbiAgfTtcblxuICAvKipcbiAgICogX3BhcnNlQ29uZmlnXG4gICAqXG4gICAqIEBwYXJhbSBjZmcgb3B0aW9uYWwgY29uZmlnIGxpdGVyYWxcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG4gIGNvbnN0IF9wYXJzZUNvbmZpZyA9IGZ1bmN0aW9uIChjZmc6IENvbmZpZyA9IHt9KTogdm9pZCB7XG4gICAgaWYgKENPTkZJRyAmJiBDT05GSUcgPT09IGNmZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8qIFNoaWVsZCBjb25maWd1cmF0aW9uIG9iamVjdCBmcm9tIHRhbXBlcmluZyAqL1xuICAgIGlmICghY2ZnIHx8IHR5cGVvZiBjZmcgIT09ICdvYmplY3QnKSB7XG4gICAgICBjZmcgPSB7fTtcbiAgICB9XG5cbiAgICAvKiBTaGllbGQgY29uZmlndXJhdGlvbiBvYmplY3QgZnJvbSBwcm90b3R5cGUgcG9sbHV0aW9uICovXG4gICAgY2ZnID0gY2xvbmUoY2ZnKTtcblxuICAgIFBBUlNFUl9NRURJQV9UWVBFID1cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL3ByZWZlci1pbmNsdWRlc1xuICAgICAgU1VQUE9SVEVEX1BBUlNFUl9NRURJQV9UWVBFUy5pbmRleE9mKGNmZy5QQVJTRVJfTUVESUFfVFlQRSkgPT09IC0xXG4gICAgICAgID8gREVGQVVMVF9QQVJTRVJfTUVESUFfVFlQRVxuICAgICAgICA6IGNmZy5QQVJTRVJfTUVESUFfVFlQRTtcblxuICAgIC8vIEhUTUwgdGFncyBhbmQgYXR0cmlidXRlcyBhcmUgbm90IGNhc2Utc2Vuc2l0aXZlLCBjb252ZXJ0aW5nIHRvIGxvd2VyY2FzZS4gS2VlcGluZyBYSFRNTCBhcyBpcy5cbiAgICB0cmFuc2Zvcm1DYXNlRnVuYyA9XG4gICAgICBQQVJTRVJfTUVESUFfVFlQRSA9PT0gJ2FwcGxpY2F0aW9uL3hodG1sK3htbCdcbiAgICAgICAgPyBzdHJpbmdUb1N0cmluZ1xuICAgICAgICA6IHN0cmluZ1RvTG93ZXJDYXNlO1xuXG4gICAgLyogU2V0IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyAqL1xuICAgIEFMTE9XRURfVEFHUyA9IG9iamVjdEhhc093blByb3BlcnR5KGNmZywgJ0FMTE9XRURfVEFHUycpXG4gICAgICA/IGFkZFRvU2V0KHt9LCBjZmcuQUxMT1dFRF9UQUdTLCB0cmFuc2Zvcm1DYXNlRnVuYylcbiAgICAgIDogREVGQVVMVF9BTExPV0VEX1RBR1M7XG4gICAgQUxMT1dFRF9BVFRSID0gb2JqZWN0SGFzT3duUHJvcGVydHkoY2ZnLCAnQUxMT1dFRF9BVFRSJylcbiAgICAgID8gYWRkVG9TZXQoe30sIGNmZy5BTExPV0VEX0FUVFIsIHRyYW5zZm9ybUNhc2VGdW5jKVxuICAgICAgOiBERUZBVUxUX0FMTE9XRURfQVRUUjtcbiAgICBBTExPV0VEX05BTUVTUEFDRVMgPSBvYmplY3RIYXNPd25Qcm9wZXJ0eShjZmcsICdBTExPV0VEX05BTUVTUEFDRVMnKVxuICAgICAgPyBhZGRUb1NldCh7fSwgY2ZnLkFMTE9XRURfTkFNRVNQQUNFUywgc3RyaW5nVG9TdHJpbmcpXG4gICAgICA6IERFRkFVTFRfQUxMT1dFRF9OQU1FU1BBQ0VTO1xuICAgIFVSSV9TQUZFX0FUVFJJQlVURVMgPSBvYmplY3RIYXNPd25Qcm9wZXJ0eShjZmcsICdBRERfVVJJX1NBRkVfQVRUUicpXG4gICAgICA/IGFkZFRvU2V0KFxuICAgICAgICAgIGNsb25lKERFRkFVTFRfVVJJX1NBRkVfQVRUUklCVVRFUyksXG4gICAgICAgICAgY2ZnLkFERF9VUklfU0FGRV9BVFRSLFxuICAgICAgICAgIHRyYW5zZm9ybUNhc2VGdW5jXG4gICAgICAgIClcbiAgICAgIDogREVGQVVMVF9VUklfU0FGRV9BVFRSSUJVVEVTO1xuICAgIERBVEFfVVJJX1RBR1MgPSBvYmplY3RIYXNPd25Qcm9wZXJ0eShjZmcsICdBRERfREFUQV9VUklfVEFHUycpXG4gICAgICA/IGFkZFRvU2V0KFxuICAgICAgICAgIGNsb25lKERFRkFVTFRfREFUQV9VUklfVEFHUyksXG4gICAgICAgICAgY2ZnLkFERF9EQVRBX1VSSV9UQUdTLFxuICAgICAgICAgIHRyYW5zZm9ybUNhc2VGdW5jXG4gICAgICAgIClcbiAgICAgIDogREVGQVVMVF9EQVRBX1VSSV9UQUdTO1xuICAgIEZPUkJJRF9DT05URU5UUyA9IG9iamVjdEhhc093blByb3BlcnR5KGNmZywgJ0ZPUkJJRF9DT05URU5UUycpXG4gICAgICA/IGFkZFRvU2V0KHt9LCBjZmcuRk9SQklEX0NPTlRFTlRTLCB0cmFuc2Zvcm1DYXNlRnVuYylcbiAgICAgIDogREVGQVVMVF9GT1JCSURfQ09OVEVOVFM7XG4gICAgRk9SQklEX1RBR1MgPSBvYmplY3RIYXNPd25Qcm9wZXJ0eShjZmcsICdGT1JCSURfVEFHUycpXG4gICAgICA/IGFkZFRvU2V0KHt9LCBjZmcuRk9SQklEX1RBR1MsIHRyYW5zZm9ybUNhc2VGdW5jKVxuICAgICAgOiBjbG9uZSh7fSk7XG4gICAgRk9SQklEX0FUVFIgPSBvYmplY3RIYXNPd25Qcm9wZXJ0eShjZmcsICdGT1JCSURfQVRUUicpXG4gICAgICA/IGFkZFRvU2V0KHt9LCBjZmcuRk9SQklEX0FUVFIsIHRyYW5zZm9ybUNhc2VGdW5jKVxuICAgICAgOiBjbG9uZSh7fSk7XG4gICAgVVNFX1BST0ZJTEVTID0gb2JqZWN0SGFzT3duUHJvcGVydHkoY2ZnLCAnVVNFX1BST0ZJTEVTJylcbiAgICAgID8gY2ZnLlVTRV9QUk9GSUxFU1xuICAgICAgOiBmYWxzZTtcbiAgICBBTExPV19BUklBX0FUVFIgPSBjZmcuQUxMT1dfQVJJQV9BVFRSICE9PSBmYWxzZTsgLy8gRGVmYXVsdCB0cnVlXG4gICAgQUxMT1dfREFUQV9BVFRSID0gY2ZnLkFMTE9XX0RBVEFfQVRUUiAhPT0gZmFsc2U7IC8vIERlZmF1bHQgdHJ1ZVxuICAgIEFMTE9XX1VOS05PV05fUFJPVE9DT0xTID0gY2ZnLkFMTE9XX1VOS05PV05fUFJPVE9DT0xTIHx8IGZhbHNlOyAvLyBEZWZhdWx0IGZhbHNlXG4gICAgQUxMT1dfU0VMRl9DTE9TRV9JTl9BVFRSID0gY2ZnLkFMTE9XX1NFTEZfQ0xPU0VfSU5fQVRUUiAhPT0gZmFsc2U7IC8vIERlZmF1bHQgdHJ1ZVxuICAgIFNBRkVfRk9SX1RFTVBMQVRFUyA9IGNmZy5TQUZFX0ZPUl9URU1QTEFURVMgfHwgZmFsc2U7IC8vIERlZmF1bHQgZmFsc2VcbiAgICBTQUZFX0ZPUl9YTUwgPSBjZmcuU0FGRV9GT1JfWE1MICE9PSBmYWxzZTsgLy8gRGVmYXVsdCB0cnVlXG4gICAgV0hPTEVfRE9DVU1FTlQgPSBjZmcuV0hPTEVfRE9DVU1FTlQgfHwgZmFsc2U7IC8vIERlZmF1bHQgZmFsc2VcbiAgICBSRVRVUk5fRE9NID0gY2ZnLlJFVFVSTl9ET00gfHwgZmFsc2U7IC8vIERlZmF1bHQgZmFsc2VcbiAgICBSRVRVUk5fRE9NX0ZSQUdNRU5UID0gY2ZnLlJFVFVSTl9ET01fRlJBR01FTlQgfHwgZmFsc2U7IC8vIERlZmF1bHQgZmFsc2VcbiAgICBSRVRVUk5fVFJVU1RFRF9UWVBFID0gY2ZnLlJFVFVSTl9UUlVTVEVEX1RZUEUgfHwgZmFsc2U7IC8vIERlZmF1bHQgZmFsc2VcbiAgICBGT1JDRV9CT0RZID0gY2ZnLkZPUkNFX0JPRFkgfHwgZmFsc2U7IC8vIERlZmF1bHQgZmFsc2VcbiAgICBTQU5JVElaRV9ET00gPSBjZmcuU0FOSVRJWkVfRE9NICE9PSBmYWxzZTsgLy8gRGVmYXVsdCB0cnVlXG4gICAgU0FOSVRJWkVfTkFNRURfUFJPUFMgPSBjZmcuU0FOSVRJWkVfTkFNRURfUFJPUFMgfHwgZmFsc2U7IC8vIERlZmF1bHQgZmFsc2VcbiAgICBLRUVQX0NPTlRFTlQgPSBjZmcuS0VFUF9DT05URU5UICE9PSBmYWxzZTsgLy8gRGVmYXVsdCB0cnVlXG4gICAgSU5fUExBQ0UgPSBjZmcuSU5fUExBQ0UgfHwgZmFsc2U7IC8vIERlZmF1bHQgZmFsc2VcbiAgICBJU19BTExPV0VEX1VSSSA9IGNmZy5BTExPV0VEX1VSSV9SRUdFWFAgfHwgRVhQUkVTU0lPTlMuSVNfQUxMT1dFRF9VUkk7XG4gICAgTkFNRVNQQUNFID0gY2ZnLk5BTUVTUEFDRSB8fCBIVE1MX05BTUVTUEFDRTtcbiAgICBNQVRITUxfVEVYVF9JTlRFR1JBVElPTl9QT0lOVFMgPVxuICAgICAgY2ZnLk1BVEhNTF9URVhUX0lOVEVHUkFUSU9OX1BPSU5UUyB8fCBNQVRITUxfVEVYVF9JTlRFR1JBVElPTl9QT0lOVFM7XG4gICAgSFRNTF9JTlRFR1JBVElPTl9QT0lOVFMgPVxuICAgICAgY2ZnLkhUTUxfSU5URUdSQVRJT05fUE9JTlRTIHx8IEhUTUxfSU5URUdSQVRJT05fUE9JTlRTO1xuXG4gICAgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcgPSBjZmcuQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcgfHwge307XG4gICAgaWYgKFxuICAgICAgY2ZnLkNVU1RPTV9FTEVNRU5UX0hBTkRMSU5HICYmXG4gICAgICBpc1JlZ2V4T3JGdW5jdGlvbihjZmcuQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrKVxuICAgICkge1xuICAgICAgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrID1cbiAgICAgICAgY2ZnLkNVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVjaztcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBjZmcuQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcgJiZcbiAgICAgIGlzUmVnZXhPckZ1bmN0aW9uKGNmZy5DVVNUT01fRUxFTUVOVF9IQU5ETElORy5hdHRyaWJ1dGVOYW1lQ2hlY2spXG4gICAgKSB7XG4gICAgICBDVVNUT01fRUxFTUVOVF9IQU5ETElORy5hdHRyaWJ1dGVOYW1lQ2hlY2sgPVxuICAgICAgICBjZmcuQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcuYXR0cmlidXRlTmFtZUNoZWNrO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGNmZy5DVVNUT01fRUxFTUVOVF9IQU5ETElORyAmJlxuICAgICAgdHlwZW9mIGNmZy5DVVNUT01fRUxFTUVOVF9IQU5ETElORy5hbGxvd0N1c3RvbWl6ZWRCdWlsdEluRWxlbWVudHMgPT09XG4gICAgICAgICdib29sZWFuJ1xuICAgICkge1xuICAgICAgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcuYWxsb3dDdXN0b21pemVkQnVpbHRJbkVsZW1lbnRzID1cbiAgICAgICAgY2ZnLkNVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLmFsbG93Q3VzdG9taXplZEJ1aWx0SW5FbGVtZW50cztcbiAgICB9XG5cbiAgICBpZiAoU0FGRV9GT1JfVEVNUExBVEVTKSB7XG4gICAgICBBTExPV19EQVRBX0FUVFIgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoUkVUVVJOX0RPTV9GUkFHTUVOVCkge1xuICAgICAgUkVUVVJOX0RPTSA9IHRydWU7XG4gICAgfVxuXG4gICAgLyogUGFyc2UgcHJvZmlsZSBpbmZvICovXG4gICAgaWYgKFVTRV9QUk9GSUxFUykge1xuICAgICAgQUxMT1dFRF9UQUdTID0gYWRkVG9TZXQoe30sIFRBR1MudGV4dCk7XG4gICAgICBBTExPV0VEX0FUVFIgPSBjcmVhdGUobnVsbCk7XG4gICAgICBpZiAoVVNFX1BST0ZJTEVTLmh0bWwgPT09IHRydWUpIHtcbiAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9UQUdTLCBUQUdTLmh0bWwpO1xuICAgICAgICBhZGRUb1NldChBTExPV0VEX0FUVFIsIEFUVFJTLmh0bWwpO1xuICAgICAgfVxuXG4gICAgICBpZiAoVVNFX1BST0ZJTEVTLnN2ZyA9PT0gdHJ1ZSkge1xuICAgICAgICBhZGRUb1NldChBTExPV0VEX1RBR1MsIFRBR1Muc3ZnKTtcbiAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9BVFRSLCBBVFRSUy5zdmcpO1xuICAgICAgICBhZGRUb1NldChBTExPV0VEX0FUVFIsIEFUVFJTLnhtbCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChVU0VfUFJPRklMRVMuc3ZnRmlsdGVycyA9PT0gdHJ1ZSkge1xuICAgICAgICBhZGRUb1NldChBTExPV0VEX1RBR1MsIFRBR1Muc3ZnRmlsdGVycyk7XG4gICAgICAgIGFkZFRvU2V0KEFMTE9XRURfQVRUUiwgQVRUUlMuc3ZnKTtcbiAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9BVFRSLCBBVFRSUy54bWwpO1xuICAgICAgfVxuXG4gICAgICBpZiAoVVNFX1BST0ZJTEVTLm1hdGhNbCA9PT0gdHJ1ZSkge1xuICAgICAgICBhZGRUb1NldChBTExPV0VEX1RBR1MsIFRBR1MubWF0aE1sKTtcbiAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9BVFRSLCBBVFRSUy5tYXRoTWwpO1xuICAgICAgICBhZGRUb1NldChBTExPV0VEX0FUVFIsIEFUVFJTLnhtbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogUHJldmVudCBmdW5jdGlvbi1iYXNlZCBBRERfQVRUUiAvIEFERF9UQUdTIGZyb20gbGVha2luZyBhY3Jvc3MgY2FsbHMgKi9cbiAgICBpZiAoIW9iamVjdEhhc093blByb3BlcnR5KGNmZywgJ0FERF9UQUdTJykpIHtcbiAgICAgIEVYVFJBX0VMRU1FTlRfSEFORExJTkcudGFnQ2hlY2sgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICghb2JqZWN0SGFzT3duUHJvcGVydHkoY2ZnLCAnQUREX0FUVFInKSkge1xuICAgICAgRVhUUkFfRUxFTUVOVF9IQU5ETElORy5hdHRyaWJ1dGVDaGVjayA9IG51bGw7XG4gICAgfVxuXG4gICAgLyogTWVyZ2UgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzICovXG4gICAgaWYgKGNmZy5BRERfVEFHUykge1xuICAgICAgaWYgKHR5cGVvZiBjZmcuQUREX1RBR1MgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgRVhUUkFfRUxFTUVOVF9IQU5ETElORy50YWdDaGVjayA9IGNmZy5BRERfVEFHUztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChBTExPV0VEX1RBR1MgPT09IERFRkFVTFRfQUxMT1dFRF9UQUdTKSB7XG4gICAgICAgICAgQUxMT1dFRF9UQUdTID0gY2xvbmUoQUxMT1dFRF9UQUdTKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFkZFRvU2V0KEFMTE9XRURfVEFHUywgY2ZnLkFERF9UQUdTLCB0cmFuc2Zvcm1DYXNlRnVuYyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNmZy5BRERfQVRUUikge1xuICAgICAgaWYgKHR5cGVvZiBjZmcuQUREX0FUVFIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgRVhUUkFfRUxFTUVOVF9IQU5ETElORy5hdHRyaWJ1dGVDaGVjayA9IGNmZy5BRERfQVRUUjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChBTExPV0VEX0FUVFIgPT09IERFRkFVTFRfQUxMT1dFRF9BVFRSKSB7XG4gICAgICAgICAgQUxMT1dFRF9BVFRSID0gY2xvbmUoQUxMT1dFRF9BVFRSKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFkZFRvU2V0KEFMTE9XRURfQVRUUiwgY2ZnLkFERF9BVFRSLCB0cmFuc2Zvcm1DYXNlRnVuYyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNmZy5BRERfVVJJX1NBRkVfQVRUUikge1xuICAgICAgYWRkVG9TZXQoVVJJX1NBRkVfQVRUUklCVVRFUywgY2ZnLkFERF9VUklfU0FGRV9BVFRSLCB0cmFuc2Zvcm1DYXNlRnVuYyk7XG4gICAgfVxuXG4gICAgaWYgKGNmZy5GT1JCSURfQ09OVEVOVFMpIHtcbiAgICAgIGlmIChGT1JCSURfQ09OVEVOVFMgPT09IERFRkFVTFRfRk9SQklEX0NPTlRFTlRTKSB7XG4gICAgICAgIEZPUkJJRF9DT05URU5UUyA9IGNsb25lKEZPUkJJRF9DT05URU5UUyk7XG4gICAgICB9XG5cbiAgICAgIGFkZFRvU2V0KEZPUkJJRF9DT05URU5UUywgY2ZnLkZPUkJJRF9DT05URU5UUywgdHJhbnNmb3JtQ2FzZUZ1bmMpO1xuICAgIH1cblxuICAgIGlmIChjZmcuQUREX0ZPUkJJRF9DT05URU5UUykge1xuICAgICAgaWYgKEZPUkJJRF9DT05URU5UUyA9PT0gREVGQVVMVF9GT1JCSURfQ09OVEVOVFMpIHtcbiAgICAgICAgRk9SQklEX0NPTlRFTlRTID0gY2xvbmUoRk9SQklEX0NPTlRFTlRTKTtcbiAgICAgIH1cblxuICAgICAgYWRkVG9TZXQoRk9SQklEX0NPTlRFTlRTLCBjZmcuQUREX0ZPUkJJRF9DT05URU5UUywgdHJhbnNmb3JtQ2FzZUZ1bmMpO1xuICAgIH1cblxuICAgIC8qIEFkZCAjdGV4dCBpbiBjYXNlIEtFRVBfQ09OVEVOVCBpcyBzZXQgdG8gdHJ1ZSAqL1xuICAgIGlmIChLRUVQX0NPTlRFTlQpIHtcbiAgICAgIEFMTE9XRURfVEFHU1snI3RleHQnXSA9IHRydWU7XG4gICAgfVxuXG4gICAgLyogQWRkIGh0bWwsIGhlYWQgYW5kIGJvZHkgdG8gQUxMT1dFRF9UQUdTIGluIGNhc2UgV0hPTEVfRE9DVU1FTlQgaXMgdHJ1ZSAqL1xuICAgIGlmIChXSE9MRV9ET0NVTUVOVCkge1xuICAgICAgYWRkVG9TZXQoQUxMT1dFRF9UQUdTLCBbJ2h0bWwnLCAnaGVhZCcsICdib2R5J10pO1xuICAgIH1cblxuICAgIC8qIEFkZCB0Ym9keSB0byBBTExPV0VEX1RBR1MgaW4gY2FzZSB0YWJsZXMgYXJlIHBlcm1pdHRlZCwgc2VlICMyODYsICMzNjUgKi9cbiAgICBpZiAoQUxMT1dFRF9UQUdTLnRhYmxlKSB7XG4gICAgICBhZGRUb1NldChBTExPV0VEX1RBR1MsIFsndGJvZHknXSk7XG4gICAgICBkZWxldGUgRk9SQklEX1RBR1MudGJvZHk7XG4gICAgfVxuXG4gICAgaWYgKGNmZy5UUlVTVEVEX1RZUEVTX1BPTElDWSkge1xuICAgICAgaWYgKHR5cGVvZiBjZmcuVFJVU1RFRF9UWVBFU19QT0xJQ1kuY3JlYXRlSFRNTCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyB0eXBlRXJyb3JDcmVhdGUoXG4gICAgICAgICAgJ1RSVVNURURfVFlQRVNfUE9MSUNZIGNvbmZpZ3VyYXRpb24gb3B0aW9uIG11c3QgcHJvdmlkZSBhIFwiY3JlYXRlSFRNTFwiIGhvb2suJ1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGNmZy5UUlVTVEVEX1RZUEVTX1BPTElDWS5jcmVhdGVTY3JpcHRVUkwgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgdHlwZUVycm9yQ3JlYXRlKFxuICAgICAgICAgICdUUlVTVEVEX1RZUEVTX1BPTElDWSBjb25maWd1cmF0aW9uIG9wdGlvbiBtdXN0IHByb3ZpZGUgYSBcImNyZWF0ZVNjcmlwdFVSTFwiIGhvb2suJ1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBPdmVyd3JpdGUgZXhpc3RpbmcgVHJ1c3RlZFR5cGVzIHBvbGljeS5cbiAgICAgIHRydXN0ZWRUeXBlc1BvbGljeSA9IGNmZy5UUlVTVEVEX1RZUEVTX1BPTElDWTtcblxuICAgICAgLy8gU2lnbiBsb2NhbCB2YXJpYWJsZXMgcmVxdWlyZWQgYnkgYHNhbml0aXplYC5cbiAgICAgIGVtcHR5SFRNTCA9IHRydXN0ZWRUeXBlc1BvbGljeS5jcmVhdGVIVE1MKCcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVW5pbml0aWFsaXplZCBwb2xpY3ksIGF0dGVtcHQgdG8gaW5pdGlhbGl6ZSB0aGUgaW50ZXJuYWwgZG9tcHVyaWZ5IHBvbGljeS5cbiAgICAgIGlmICh0cnVzdGVkVHlwZXNQb2xpY3kgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0cnVzdGVkVHlwZXNQb2xpY3kgPSBfY3JlYXRlVHJ1c3RlZFR5cGVzUG9saWN5KFxuICAgICAgICAgIHRydXN0ZWRUeXBlcyxcbiAgICAgICAgICBjdXJyZW50U2NyaXB0XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIGNyZWF0aW5nIHRoZSBpbnRlcm5hbCBwb2xpY3kgc3VjY2VlZGVkIHNpZ24gaW50ZXJuYWwgdmFyaWFibGVzLlxuICAgICAgaWYgKHRydXN0ZWRUeXBlc1BvbGljeSAhPT0gbnVsbCAmJiB0eXBlb2YgZW1wdHlIVE1MID09PSAnc3RyaW5nJykge1xuICAgICAgICBlbXB0eUhUTUwgPSB0cnVzdGVkVHlwZXNQb2xpY3kuY3JlYXRlSFRNTCgnJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUHJldmVudCBmdXJ0aGVyIG1hbmlwdWxhdGlvbiBvZiBjb25maWd1cmF0aW9uLlxuICAgIC8vIE5vdCBhdmFpbGFibGUgaW4gSUU4LCBTYWZhcmkgNSwgZXRjLlxuICAgIGlmIChmcmVlemUpIHtcbiAgICAgIGZyZWV6ZShjZmcpO1xuICAgIH1cblxuICAgIENPTkZJRyA9IGNmZztcbiAgfTtcblxuICAvKiBLZWVwIHRyYWNrIG9mIGFsbCBwb3NzaWJsZSBTVkcgYW5kIE1hdGhNTCB0YWdzXG4gICAqIHNvIHRoYXQgd2UgY2FuIHBlcmZvcm0gdGhlIG5hbWVzcGFjZSBjaGVja3NcbiAgICogY29ycmVjdGx5LiAqL1xuICBjb25zdCBBTExfU1ZHX1RBR1MgPSBhZGRUb1NldCh7fSwgW1xuICAgIC4uLlRBR1Muc3ZnLFxuICAgIC4uLlRBR1Muc3ZnRmlsdGVycyxcbiAgICAuLi5UQUdTLnN2Z0Rpc2FsbG93ZWQsXG4gIF0pO1xuICBjb25zdCBBTExfTUFUSE1MX1RBR1MgPSBhZGRUb1NldCh7fSwgW1xuICAgIC4uLlRBR1MubWF0aE1sLFxuICAgIC4uLlRBR1MubWF0aE1sRGlzYWxsb3dlZCxcbiAgXSk7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBlbGVtZW50IGEgRE9NIGVsZW1lbnQgd2hvc2UgbmFtZXNwYWNlIGlzIGJlaW5nIGNoZWNrZWRcbiAgICogQHJldHVybnMgUmV0dXJuIGZhbHNlIGlmIHRoZSBlbGVtZW50IGhhcyBhXG4gICAqICBuYW1lc3BhY2UgdGhhdCBhIHNwZWMtY29tcGxpYW50IHBhcnNlciB3b3VsZCBuZXZlclxuICAgKiAgcmV0dXJuLiBSZXR1cm4gdHJ1ZSBvdGhlcndpc2UuXG4gICAqL1xuICBjb25zdCBfY2hlY2tWYWxpZE5hbWVzcGFjZSA9IGZ1bmN0aW9uIChlbGVtZW50OiBFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgbGV0IHBhcmVudCA9IGdldFBhcmVudE5vZGUoZWxlbWVudCk7XG5cbiAgICAvLyBJbiBKU0RPTSwgaWYgd2UncmUgaW5zaWRlIHNoYWRvdyBET00sIHRoZW4gcGFyZW50Tm9kZVxuICAgIC8vIGNhbiBiZSBudWxsLiBXZSBqdXN0IHNpbXVsYXRlIHBhcmVudCBpbiB0aGlzIGNhc2UuXG4gICAgaWYgKCFwYXJlbnQgfHwgIXBhcmVudC50YWdOYW1lKSB7XG4gICAgICBwYXJlbnQgPSB7XG4gICAgICAgIG5hbWVzcGFjZVVSSTogTkFNRVNQQUNFLFxuICAgICAgICB0YWdOYW1lOiAndGVtcGxhdGUnLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCB0YWdOYW1lID0gc3RyaW5nVG9Mb3dlckNhc2UoZWxlbWVudC50YWdOYW1lKTtcbiAgICBjb25zdCBwYXJlbnRUYWdOYW1lID0gc3RyaW5nVG9Mb3dlckNhc2UocGFyZW50LnRhZ05hbWUpO1xuXG4gICAgaWYgKCFBTExPV0VEX05BTUVTUEFDRVNbZWxlbWVudC5uYW1lc3BhY2VVUkldKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnQubmFtZXNwYWNlVVJJID09PSBTVkdfTkFNRVNQQUNFKSB7XG4gICAgICAvLyBUaGUgb25seSB3YXkgdG8gc3dpdGNoIGZyb20gSFRNTCBuYW1lc3BhY2UgdG8gU1ZHXG4gICAgICAvLyBpcyB2aWEgPHN2Zz4uIElmIGl0IGhhcHBlbnMgdmlhIGFueSBvdGhlciB0YWcsIHRoZW5cbiAgICAgIC8vIGl0IHNob3VsZCBiZSBraWxsZWQuXG4gICAgICBpZiAocGFyZW50Lm5hbWVzcGFjZVVSSSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICAgICAgcmV0dXJuIHRhZ05hbWUgPT09ICdzdmcnO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGUgb25seSB3YXkgdG8gc3dpdGNoIGZyb20gTWF0aE1MIHRvIFNWRyBpcyB2aWFgXG4gICAgICAvLyBzdmcgaWYgcGFyZW50IGlzIGVpdGhlciA8YW5ub3RhdGlvbi14bWw+IG9yIE1hdGhNTFxuICAgICAgLy8gdGV4dCBpbnRlZ3JhdGlvbiBwb2ludHMuXG4gICAgICBpZiAocGFyZW50Lm5hbWVzcGFjZVVSSSA9PT0gTUFUSE1MX05BTUVTUEFDRSkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIHRhZ05hbWUgPT09ICdzdmcnICYmXG4gICAgICAgICAgKHBhcmVudFRhZ05hbWUgPT09ICdhbm5vdGF0aW9uLXhtbCcgfHxcbiAgICAgICAgICAgIE1BVEhNTF9URVhUX0lOVEVHUkFUSU9OX1BPSU5UU1twYXJlbnRUYWdOYW1lXSlcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gV2Ugb25seSBhbGxvdyBlbGVtZW50cyB0aGF0IGFyZSBkZWZpbmVkIGluIFNWR1xuICAgICAgLy8gc3BlYy4gQWxsIG90aGVycyBhcmUgZGlzYWxsb3dlZCBpbiBTVkcgbmFtZXNwYWNlLlxuICAgICAgcmV0dXJuIEJvb2xlYW4oQUxMX1NWR19UQUdTW3RhZ05hbWVdKTtcbiAgICB9XG5cbiAgICBpZiAoZWxlbWVudC5uYW1lc3BhY2VVUkkgPT09IE1BVEhNTF9OQU1FU1BBQ0UpIHtcbiAgICAgIC8vIFRoZSBvbmx5IHdheSB0byBzd2l0Y2ggZnJvbSBIVE1MIG5hbWVzcGFjZSB0byBNYXRoTUxcbiAgICAgIC8vIGlzIHZpYSA8bWF0aD4uIElmIGl0IGhhcHBlbnMgdmlhIGFueSBvdGhlciB0YWcsIHRoZW5cbiAgICAgIC8vIGl0IHNob3VsZCBiZSBraWxsZWQuXG4gICAgICBpZiAocGFyZW50Lm5hbWVzcGFjZVVSSSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICAgICAgcmV0dXJuIHRhZ05hbWUgPT09ICdtYXRoJztcbiAgICAgIH1cblxuICAgICAgLy8gVGhlIG9ubHkgd2F5IHRvIHN3aXRjaCBmcm9tIFNWRyB0byBNYXRoTUwgaXMgdmlhXG4gICAgICAvLyA8bWF0aD4gYW5kIEhUTUwgaW50ZWdyYXRpb24gcG9pbnRzXG4gICAgICBpZiAocGFyZW50Lm5hbWVzcGFjZVVSSSA9PT0gU1ZHX05BTUVTUEFDRSkge1xuICAgICAgICByZXR1cm4gdGFnTmFtZSA9PT0gJ21hdGgnICYmIEhUTUxfSU5URUdSQVRJT05fUE9JTlRTW3BhcmVudFRhZ05hbWVdO1xuICAgICAgfVxuXG4gICAgICAvLyBXZSBvbmx5IGFsbG93IGVsZW1lbnRzIHRoYXQgYXJlIGRlZmluZWQgaW4gTWF0aE1MXG4gICAgICAvLyBzcGVjLiBBbGwgb3RoZXJzIGFyZSBkaXNhbGxvd2VkIGluIE1hdGhNTCBuYW1lc3BhY2UuXG4gICAgICByZXR1cm4gQm9vbGVhbihBTExfTUFUSE1MX1RBR1NbdGFnTmFtZV0pO1xuICAgIH1cblxuICAgIGlmIChlbGVtZW50Lm5hbWVzcGFjZVVSSSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICAgIC8vIFRoZSBvbmx5IHdheSB0byBzd2l0Y2ggZnJvbSBTVkcgdG8gSFRNTCBpcyB2aWFcbiAgICAgIC8vIEhUTUwgaW50ZWdyYXRpb24gcG9pbnRzLCBhbmQgZnJvbSBNYXRoTUwgdG8gSFRNTFxuICAgICAgLy8gaXMgdmlhIE1hdGhNTCB0ZXh0IGludGVncmF0aW9uIHBvaW50c1xuICAgICAgaWYgKFxuICAgICAgICBwYXJlbnQubmFtZXNwYWNlVVJJID09PSBTVkdfTkFNRVNQQUNFICYmXG4gICAgICAgICFIVE1MX0lOVEVHUkFUSU9OX1BPSU5UU1twYXJlbnRUYWdOYW1lXVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBwYXJlbnQubmFtZXNwYWNlVVJJID09PSBNQVRITUxfTkFNRVNQQUNFICYmXG4gICAgICAgICFNQVRITUxfVEVYVF9JTlRFR1JBVElPTl9QT0lOVFNbcGFyZW50VGFnTmFtZV1cbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIFdlIGRpc2FsbG93IHRhZ3MgdGhhdCBhcmUgc3BlY2lmaWMgZm9yIE1hdGhNTFxuICAgICAgLy8gb3IgU1ZHIGFuZCBzaG91bGQgbmV2ZXIgYXBwZWFyIGluIEhUTUwgbmFtZXNwYWNlXG4gICAgICByZXR1cm4gKFxuICAgICAgICAhQUxMX01BVEhNTF9UQUdTW3RhZ05hbWVdICYmXG4gICAgICAgIChDT01NT05fU1ZHX0FORF9IVE1MX0VMRU1FTlRTW3RhZ05hbWVdIHx8ICFBTExfU1ZHX1RBR1NbdGFnTmFtZV0pXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEZvciBYSFRNTCBhbmQgWE1MIGRvY3VtZW50cyB0aGF0IHN1cHBvcnQgY3VzdG9tIG5hbWVzcGFjZXNcbiAgICBpZiAoXG4gICAgICBQQVJTRVJfTUVESUFfVFlQRSA9PT0gJ2FwcGxpY2F0aW9uL3hodG1sK3htbCcgJiZcbiAgICAgIEFMTE9XRURfTkFNRVNQQUNFU1tlbGVtZW50Lm5hbWVzcGFjZVVSSV1cbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIFRoZSBjb2RlIHNob3VsZCBuZXZlciByZWFjaCB0aGlzIHBsYWNlICh0aGlzIG1lYW5zXG4gICAgLy8gdGhhdCB0aGUgZWxlbWVudCBzb21laG93IGdvdCBuYW1lc3BhY2UgdGhhdCBpcyBub3RcbiAgICAvLyBIVE1MLCBTVkcsIE1hdGhNTCBvciBhbGxvd2VkIHZpYSBBTExPV0VEX05BTUVTUEFDRVMpLlxuICAgIC8vIFJldHVybiBmYWxzZSBqdXN0IGluIGNhc2UuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBfZm9yY2VSZW1vdmVcbiAgICpcbiAgICogQHBhcmFtIG5vZGUgYSBET00gbm9kZVxuICAgKi9cbiAgY29uc3QgX2ZvcmNlUmVtb3ZlID0gZnVuY3Rpb24gKG5vZGU6IE5vZGUpOiB2b2lkIHtcbiAgICBhcnJheVB1c2goRE9NUHVyaWZ5LnJlbW92ZWQsIHsgZWxlbWVudDogbm9kZSB9KTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9wcmVmZXItZG9tLW5vZGUtcmVtb3ZlXG4gICAgICBnZXRQYXJlbnROb2RlKG5vZGUpLnJlbW92ZUNoaWxkKG5vZGUpO1xuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIHJlbW92ZShub2RlKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIF9yZW1vdmVBdHRyaWJ1dGVcbiAgICpcbiAgICogQHBhcmFtIG5hbWUgYW4gQXR0cmlidXRlIG5hbWVcbiAgICogQHBhcmFtIGVsZW1lbnQgYSBET00gbm9kZVxuICAgKi9cbiAgY29uc3QgX3JlbW92ZUF0dHJpYnV0ZSA9IGZ1bmN0aW9uIChuYW1lOiBzdHJpbmcsIGVsZW1lbnQ6IEVsZW1lbnQpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgYXJyYXlQdXNoKERPTVB1cmlmeS5yZW1vdmVkLCB7XG4gICAgICAgIGF0dHJpYnV0ZTogZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKG5hbWUpLFxuICAgICAgICBmcm9tOiBlbGVtZW50LFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgYXJyYXlQdXNoKERPTVB1cmlmeS5yZW1vdmVkLCB7XG4gICAgICAgIGF0dHJpYnV0ZTogbnVsbCxcbiAgICAgICAgZnJvbTogZWxlbWVudCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuXG4gICAgLy8gV2Ugdm9pZCBhdHRyaWJ1dGUgdmFsdWVzIGZvciB1bnJlbW92YWJsZSBcImlzXCIgYXR0cmlidXRlc1xuICAgIGlmIChuYW1lID09PSAnaXMnKSB7XG4gICAgICBpZiAoUkVUVVJOX0RPTSB8fCBSRVRVUk5fRE9NX0ZSQUdNRU5UKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgX2ZvcmNlUmVtb3ZlKGVsZW1lbnQpO1xuICAgICAgICB9IGNhdGNoIChfKSB7fVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShuYW1lLCAnJyk7XG4gICAgICAgIH0gY2F0Y2ggKF8pIHt9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBfaW5pdERvY3VtZW50XG4gICAqXG4gICAqIEBwYXJhbSBkaXJ0eSAtIGEgc3RyaW5nIG9mIGRpcnR5IG1hcmt1cFxuICAgKiBAcmV0dXJuIGEgRE9NLCBmaWxsZWQgd2l0aCB0aGUgZGlydHkgbWFya3VwXG4gICAqL1xuICBjb25zdCBfaW5pdERvY3VtZW50ID0gZnVuY3Rpb24gKGRpcnR5OiBzdHJpbmcpOiBEb2N1bWVudCB7XG4gICAgLyogQ3JlYXRlIGEgSFRNTCBkb2N1bWVudCAqL1xuICAgIGxldCBkb2MgPSBudWxsO1xuICAgIGxldCBsZWFkaW5nV2hpdGVzcGFjZSA9IG51bGw7XG5cbiAgICBpZiAoRk9SQ0VfQk9EWSkge1xuICAgICAgZGlydHkgPSAnPHJlbW92ZT48L3JlbW92ZT4nICsgZGlydHk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIElmIEZPUkNFX0JPRFkgaXNuJ3QgdXNlZCwgbGVhZGluZyB3aGl0ZXNwYWNlIG5lZWRzIHRvIGJlIHByZXNlcnZlZCBtYW51YWxseSAqL1xuICAgICAgY29uc3QgbWF0Y2hlcyA9IHN0cmluZ01hdGNoKGRpcnR5LCAvXltcXHJcXG5cXHQgXSsvKTtcbiAgICAgIGxlYWRpbmdXaGl0ZXNwYWNlID0gbWF0Y2hlcyAmJiBtYXRjaGVzWzBdO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIFBBUlNFUl9NRURJQV9UWVBFID09PSAnYXBwbGljYXRpb24veGh0bWwreG1sJyAmJlxuICAgICAgTkFNRVNQQUNFID09PSBIVE1MX05BTUVTUEFDRVxuICAgICkge1xuICAgICAgLy8gUm9vdCBvZiBYSFRNTCBkb2MgbXVzdCBjb250YWluIHhtbG5zIGRlY2xhcmF0aW9uIChzZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL3hodG1sMS9ub3JtYXRpdmUuaHRtbCNzdHJpY3QpXG4gICAgICBkaXJ0eSA9XG4gICAgICAgICc8aHRtbCB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIj48aGVhZD48L2hlYWQ+PGJvZHk+JyArXG4gICAgICAgIGRpcnR5ICtcbiAgICAgICAgJzwvYm9keT48L2h0bWw+JztcbiAgICB9XG5cbiAgICBjb25zdCBkaXJ0eVBheWxvYWQgPSB0cnVzdGVkVHlwZXNQb2xpY3lcbiAgICAgID8gdHJ1c3RlZFR5cGVzUG9saWN5LmNyZWF0ZUhUTUwoZGlydHkpXG4gICAgICA6IGRpcnR5O1xuICAgIC8qXG4gICAgICogVXNlIHRoZSBET01QYXJzZXIgQVBJIGJ5IGRlZmF1bHQsIGZhbGxiYWNrIGxhdGVyIGlmIG5lZWRzIGJlXG4gICAgICogRE9NUGFyc2VyIG5vdCB3b3JrIGZvciBzdmcgd2hlbiBoYXMgbXVsdGlwbGUgcm9vdCBlbGVtZW50LlxuICAgICAqL1xuICAgIGlmIChOQU1FU1BBQ0UgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgICB0cnkge1xuICAgICAgICBkb2MgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKGRpcnR5UGF5bG9hZCwgUEFSU0VSX01FRElBX1RZUEUpO1xuICAgICAgfSBjYXRjaCAoXykge31cbiAgICB9XG5cbiAgICAvKiBVc2UgY3JlYXRlSFRNTERvY3VtZW50IGluIGNhc2UgRE9NUGFyc2VyIGlzIG5vdCBhdmFpbGFibGUgKi9cbiAgICBpZiAoIWRvYyB8fCAhZG9jLmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgZG9jID0gaW1wbGVtZW50YXRpb24uY3JlYXRlRG9jdW1lbnQoTkFNRVNQQUNFLCAndGVtcGxhdGUnLCBudWxsKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGRvYy5kb2N1bWVudEVsZW1lbnQuaW5uZXJIVE1MID0gSVNfRU1QVFlfSU5QVVRcbiAgICAgICAgICA/IGVtcHR5SFRNTFxuICAgICAgICAgIDogZGlydHlQYXlsb2FkO1xuICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAvLyBTeW50YXggZXJyb3IgaWYgZGlydHlQYXlsb2FkIGlzIGludmFsaWQgeG1sXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYm9keSA9IGRvYy5ib2R5IHx8IGRvYy5kb2N1bWVudEVsZW1lbnQ7XG5cbiAgICBpZiAoZGlydHkgJiYgbGVhZGluZ1doaXRlc3BhY2UpIHtcbiAgICAgIGJvZHkuaW5zZXJ0QmVmb3JlKFxuICAgICAgICBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShsZWFkaW5nV2hpdGVzcGFjZSksXG4gICAgICAgIGJvZHkuY2hpbGROb2Rlc1swXSB8fCBudWxsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8qIFdvcmsgb24gd2hvbGUgZG9jdW1lbnQgb3IganVzdCBpdHMgYm9keSAqL1xuICAgIGlmIChOQU1FU1BBQ0UgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgICByZXR1cm4gZ2V0RWxlbWVudHNCeVRhZ05hbWUuY2FsbChcbiAgICAgICAgZG9jLFxuICAgICAgICBXSE9MRV9ET0NVTUVOVCA/ICdodG1sJyA6ICdib2R5J1xuICAgICAgKVswXTtcbiAgICB9XG5cbiAgICByZXR1cm4gV0hPTEVfRE9DVU1FTlQgPyBkb2MuZG9jdW1lbnRFbGVtZW50IDogYm9keTtcbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIE5vZGVJdGVyYXRvciBvYmplY3QgdGhhdCB5b3UgY2FuIHVzZSB0byB0cmF2ZXJzZSBmaWx0ZXJlZCBsaXN0cyBvZiBub2RlcyBvciBlbGVtZW50cyBpbiBhIGRvY3VtZW50LlxuICAgKlxuICAgKiBAcGFyYW0gcm9vdCBUaGUgcm9vdCBlbGVtZW50IG9yIG5vZGUgdG8gc3RhcnQgdHJhdmVyc2luZyBvbi5cbiAgICogQHJldHVybiBUaGUgY3JlYXRlZCBOb2RlSXRlcmF0b3JcbiAgICovXG4gIGNvbnN0IF9jcmVhdGVOb2RlSXRlcmF0b3IgPSBmdW5jdGlvbiAocm9vdDogTm9kZSk6IE5vZGVJdGVyYXRvciB7XG4gICAgcmV0dXJuIGNyZWF0ZU5vZGVJdGVyYXRvci5jYWxsKFxuICAgICAgcm9vdC5vd25lckRvY3VtZW50IHx8IHJvb3QsXG4gICAgICByb290LFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2VcbiAgICAgIE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5UIHxcbiAgICAgICAgTm9kZUZpbHRlci5TSE9XX0NPTU1FTlQgfFxuICAgICAgICBOb2RlRmlsdGVyLlNIT1dfVEVYVCB8XG4gICAgICAgIE5vZGVGaWx0ZXIuU0hPV19QUk9DRVNTSU5HX0lOU1RSVUNUSU9OIHxcbiAgICAgICAgTm9kZUZpbHRlci5TSE9XX0NEQVRBX1NFQ1RJT04sXG4gICAgICBudWxsXG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAgICogX2lzQ2xvYmJlcmVkXG4gICAqXG4gICAqIEBwYXJhbSBlbGVtZW50IGVsZW1lbnQgdG8gY2hlY2sgZm9yIGNsb2JiZXJpbmcgYXR0YWNrc1xuICAgKiBAcmV0dXJuIHRydWUgaWYgY2xvYmJlcmVkLCBmYWxzZSBpZiBzYWZlXG4gICAqL1xuICBjb25zdCBfaXNDbG9iYmVyZWQgPSBmdW5jdGlvbiAoZWxlbWVudDogRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBlbGVtZW50IGluc3RhbmNlb2YgSFRNTEZvcm1FbGVtZW50ICYmXG4gICAgICAodHlwZW9mIGVsZW1lbnQubm9kZU5hbWUgIT09ICdzdHJpbmcnIHx8XG4gICAgICAgIHR5cGVvZiBlbGVtZW50LnRleHRDb250ZW50ICE9PSAnc3RyaW5nJyB8fFxuICAgICAgICB0eXBlb2YgZWxlbWVudC5yZW1vdmVDaGlsZCAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICAhKGVsZW1lbnQuYXR0cmlidXRlcyBpbnN0YW5jZW9mIE5hbWVkTm9kZU1hcCkgfHxcbiAgICAgICAgdHlwZW9mIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlICE9PSAnZnVuY3Rpb24nIHx8XG4gICAgICAgIHR5cGVvZiBlbGVtZW50LnNldEF0dHJpYnV0ZSAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICB0eXBlb2YgZWxlbWVudC5uYW1lc3BhY2VVUkkgIT09ICdzdHJpbmcnIHx8XG4gICAgICAgIHR5cGVvZiBlbGVtZW50Lmluc2VydEJlZm9yZSAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICB0eXBlb2YgZWxlbWVudC5oYXNDaGlsZE5vZGVzICE9PSAnZnVuY3Rpb24nKVxuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBvYmplY3QgaXMgYSBET00gbm9kZS5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIG9iamVjdCB0byBjaGVjayB3aGV0aGVyIGl0J3MgYSBET00gbm9kZVxuICAgKiBAcmV0dXJuIHRydWUgaXMgb2JqZWN0IGlzIGEgRE9NIG5vZGVcbiAgICovXG4gIGNvbnN0IF9pc05vZGUgPSBmdW5jdGlvbiAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBOb2RlIHtcbiAgICByZXR1cm4gdHlwZW9mIE5vZGUgPT09ICdmdW5jdGlvbicgJiYgdmFsdWUgaW5zdGFuY2VvZiBOb2RlO1xuICB9O1xuXG4gIGZ1bmN0aW9uIF9leGVjdXRlSG9va3M8VCBleHRlbmRzIEhvb2tGdW5jdGlvbj4oXG4gICAgaG9va3M6IEhvb2tGdW5jdGlvbltdLFxuICAgIGN1cnJlbnROb2RlOiBQYXJhbWV0ZXJzPFQ+WzBdLFxuICAgIGRhdGE6IFBhcmFtZXRlcnM8VD5bMV1cbiAgKTogdm9pZCB7XG4gICAgYXJyYXlGb3JFYWNoKGhvb2tzLCAoaG9vazogVCkgPT4ge1xuICAgICAgaG9vay5jYWxsKERPTVB1cmlmeSwgY3VycmVudE5vZGUsIGRhdGEsIENPTkZJRyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogX3Nhbml0aXplRWxlbWVudHNcbiAgICpcbiAgICogQHByb3RlY3Qgbm9kZU5hbWVcbiAgICogQHByb3RlY3QgdGV4dENvbnRlbnRcbiAgICogQHByb3RlY3QgcmVtb3ZlQ2hpbGRcbiAgICogQHBhcmFtIGN1cnJlbnROb2RlIHRvIGNoZWNrIGZvciBwZXJtaXNzaW9uIHRvIGV4aXN0XG4gICAqIEByZXR1cm4gdHJ1ZSBpZiBub2RlIHdhcyBraWxsZWQsIGZhbHNlIGlmIGxlZnQgYWxpdmVcbiAgICovXG4gIGNvbnN0IF9zYW5pdGl6ZUVsZW1lbnRzID0gZnVuY3Rpb24gKGN1cnJlbnROb2RlOiBhbnkpOiBib29sZWFuIHtcbiAgICBsZXQgY29udGVudCA9IG51bGw7XG5cbiAgICAvKiBFeGVjdXRlIGEgaG9vayBpZiBwcmVzZW50ICovXG4gICAgX2V4ZWN1dGVIb29rcyhob29rcy5iZWZvcmVTYW5pdGl6ZUVsZW1lbnRzLCBjdXJyZW50Tm9kZSwgbnVsbCk7XG5cbiAgICAvKiBDaGVjayBpZiBlbGVtZW50IGlzIGNsb2JiZXJlZCBvciBjYW4gY2xvYmJlciAqL1xuICAgIGlmIChfaXNDbG9iYmVyZWQoY3VycmVudE5vZGUpKSB7XG4gICAgICBfZm9yY2VSZW1vdmUoY3VycmVudE5vZGUpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyogTm93IGxldCdzIGNoZWNrIHRoZSBlbGVtZW50J3MgdHlwZSBhbmQgbmFtZSAqL1xuICAgIGNvbnN0IHRhZ05hbWUgPSB0cmFuc2Zvcm1DYXNlRnVuYyhjdXJyZW50Tm9kZS5ub2RlTmFtZSk7XG5cbiAgICAvKiBFeGVjdXRlIGEgaG9vayBpZiBwcmVzZW50ICovXG4gICAgX2V4ZWN1dGVIb29rcyhob29rcy51cG9uU2FuaXRpemVFbGVtZW50LCBjdXJyZW50Tm9kZSwge1xuICAgICAgdGFnTmFtZSxcbiAgICAgIGFsbG93ZWRUYWdzOiBBTExPV0VEX1RBR1MsXG4gICAgfSk7XG5cbiAgICAvKiBEZXRlY3QgbVhTUyBhdHRlbXB0cyBhYnVzaW5nIG5hbWVzcGFjZSBjb25mdXNpb24gKi9cbiAgICBpZiAoXG4gICAgICBTQUZFX0ZPUl9YTUwgJiZcbiAgICAgIGN1cnJlbnROb2RlLmhhc0NoaWxkTm9kZXMoKSAmJlxuICAgICAgIV9pc05vZGUoY3VycmVudE5vZGUuZmlyc3RFbGVtZW50Q2hpbGQpICYmXG4gICAgICByZWdFeHBUZXN0KC88Wy9cXHchXS9nLCBjdXJyZW50Tm9kZS5pbm5lckhUTUwpICYmXG4gICAgICByZWdFeHBUZXN0KC88Wy9cXHchXS9nLCBjdXJyZW50Tm9kZS50ZXh0Q29udGVudClcbiAgICApIHtcbiAgICAgIF9mb3JjZVJlbW92ZShjdXJyZW50Tm9kZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKiBSZW1vdmUgYW55IG9jY3VycmVuY2Ugb2YgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMgKi9cbiAgICBpZiAoY3VycmVudE5vZGUubm9kZVR5cGUgPT09IE5PREVfVFlQRS5wcm9ncmVzc2luZ0luc3RydWN0aW9uKSB7XG4gICAgICBfZm9yY2VSZW1vdmUoY3VycmVudE5vZGUpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyogUmVtb3ZlIGFueSBraW5kIG9mIHBvc3NpYmx5IGhhcm1mdWwgY29tbWVudHMgKi9cbiAgICBpZiAoXG4gICAgICBTQUZFX0ZPUl9YTUwgJiZcbiAgICAgIGN1cnJlbnROb2RlLm5vZGVUeXBlID09PSBOT0RFX1RZUEUuY29tbWVudCAmJlxuICAgICAgcmVnRXhwVGVzdCgvPFsvXFx3XS9nLCBjdXJyZW50Tm9kZS5kYXRhKVxuICAgICkge1xuICAgICAgX2ZvcmNlUmVtb3ZlKGN1cnJlbnROb2RlKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qIFJlbW92ZSBlbGVtZW50IGlmIGFueXRoaW5nIGZvcmJpZHMgaXRzIHByZXNlbmNlICovXG4gICAgaWYgKFxuICAgICAgIShcbiAgICAgICAgRVhUUkFfRUxFTUVOVF9IQU5ETElORy50YWdDaGVjayBpbnN0YW5jZW9mIEZ1bmN0aW9uICYmXG4gICAgICAgIEVYVFJBX0VMRU1FTlRfSEFORExJTkcudGFnQ2hlY2sodGFnTmFtZSlcbiAgICAgICkgJiZcbiAgICAgICghQUxMT1dFRF9UQUdTW3RhZ05hbWVdIHx8IEZPUkJJRF9UQUdTW3RhZ05hbWVdKVxuICAgICkge1xuICAgICAgLyogQ2hlY2sgaWYgd2UgaGF2ZSBhIGN1c3RvbSBlbGVtZW50IHRvIGhhbmRsZSAqL1xuICAgICAgaWYgKCFGT1JCSURfVEFHU1t0YWdOYW1lXSAmJiBfaXNCYXNpY0N1c3RvbUVsZW1lbnQodGFnTmFtZSkpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVjayBpbnN0YW5jZW9mIFJlZ0V4cCAmJlxuICAgICAgICAgIHJlZ0V4cFRlc3QoQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrLCB0YWdOYW1lKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrIGluc3RhbmNlb2YgRnVuY3Rpb24gJiZcbiAgICAgICAgICBDVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2sodGFnTmFtZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8qIEtlZXAgY29udGVudCBleGNlcHQgZm9yIGJhZC1saXN0ZWQgZWxlbWVudHMgKi9cbiAgICAgIGlmIChLRUVQX0NPTlRFTlQgJiYgIUZPUkJJRF9DT05URU5UU1t0YWdOYW1lXSkge1xuICAgICAgICBjb25zdCBwYXJlbnROb2RlID0gZ2V0UGFyZW50Tm9kZShjdXJyZW50Tm9kZSkgfHwgY3VycmVudE5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgY29uc3QgY2hpbGROb2RlcyA9IGdldENoaWxkTm9kZXMoY3VycmVudE5vZGUpIHx8IGN1cnJlbnROb2RlLmNoaWxkTm9kZXM7XG5cbiAgICAgICAgaWYgKGNoaWxkTm9kZXMgJiYgcGFyZW50Tm9kZSkge1xuICAgICAgICAgIGNvbnN0IGNoaWxkQ291bnQgPSBjaGlsZE5vZGVzLmxlbmd0aDtcblxuICAgICAgICAgIGZvciAobGV0IGkgPSBjaGlsZENvdW50IC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkQ2xvbmUgPSBjbG9uZU5vZGUoY2hpbGROb2Rlc1tpXSwgdHJ1ZSk7XG4gICAgICAgICAgICBjaGlsZENsb25lLl9fcmVtb3ZhbENvdW50ID0gKGN1cnJlbnROb2RlLl9fcmVtb3ZhbENvdW50IHx8IDApICsgMTtcbiAgICAgICAgICAgIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNoaWxkQ2xvbmUsIGdldE5leHRTaWJsaW5nKGN1cnJlbnROb2RlKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIF9mb3JjZVJlbW92ZShjdXJyZW50Tm9kZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKiBDaGVjayB3aGV0aGVyIGVsZW1lbnQgaGFzIGEgdmFsaWQgbmFtZXNwYWNlICovXG4gICAgaWYgKGN1cnJlbnROb2RlIGluc3RhbmNlb2YgRWxlbWVudCAmJiAhX2NoZWNrVmFsaWROYW1lc3BhY2UoY3VycmVudE5vZGUpKSB7XG4gICAgICBfZm9yY2VSZW1vdmUoY3VycmVudE5vZGUpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyogTWFrZSBzdXJlIHRoYXQgb2xkZXIgYnJvd3NlcnMgZG9uJ3QgZ2V0IGZhbGxiYWNrLXRhZyBtWFNTICovXG4gICAgaWYgKFxuICAgICAgKHRhZ05hbWUgPT09ICdub3NjcmlwdCcgfHxcbiAgICAgICAgdGFnTmFtZSA9PT0gJ25vZW1iZWQnIHx8XG4gICAgICAgIHRhZ05hbWUgPT09ICdub2ZyYW1lcycpICYmXG4gICAgICByZWdFeHBUZXN0KC88XFwvbm8oc2NyaXB0fGVtYmVkfGZyYW1lcykvaSwgY3VycmVudE5vZGUuaW5uZXJIVE1MKVxuICAgICkge1xuICAgICAgX2ZvcmNlUmVtb3ZlKGN1cnJlbnROb2RlKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qIFNhbml0aXplIGVsZW1lbnQgY29udGVudCB0byBiZSB0ZW1wbGF0ZS1zYWZlICovXG4gICAgaWYgKFNBRkVfRk9SX1RFTVBMQVRFUyAmJiBjdXJyZW50Tm9kZS5ub2RlVHlwZSA9PT0gTk9ERV9UWVBFLnRleHQpIHtcbiAgICAgIC8qIEdldCB0aGUgZWxlbWVudCdzIHRleHQgY29udGVudCAqL1xuICAgICAgY29udGVudCA9IGN1cnJlbnROb2RlLnRleHRDb250ZW50O1xuXG4gICAgICBhcnJheUZvckVhY2goW01VU1RBQ0hFX0VYUFIsIEVSQl9FWFBSLCBUTVBMSVRfRVhQUl0sIChleHByOiBSZWdFeHApID0+IHtcbiAgICAgICAgY29udGVudCA9IHN0cmluZ1JlcGxhY2UoY29udGVudCwgZXhwciwgJyAnKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoY3VycmVudE5vZGUudGV4dENvbnRlbnQgIT09IGNvbnRlbnQpIHtcbiAgICAgICAgYXJyYXlQdXNoKERPTVB1cmlmeS5yZW1vdmVkLCB7IGVsZW1lbnQ6IGN1cnJlbnROb2RlLmNsb25lTm9kZSgpIH0pO1xuICAgICAgICBjdXJyZW50Tm9kZS50ZXh0Q29udGVudCA9IGNvbnRlbnQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogRXhlY3V0ZSBhIGhvb2sgaWYgcHJlc2VudCAqL1xuICAgIF9leGVjdXRlSG9va3MoaG9va3MuYWZ0ZXJTYW5pdGl6ZUVsZW1lbnRzLCBjdXJyZW50Tm9kZSwgbnVsbCk7XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgLyoqXG4gICAqIF9pc1ZhbGlkQXR0cmlidXRlXG4gICAqXG4gICAqIEBwYXJhbSBsY1RhZyBMb3dlcmNhc2UgdGFnIG5hbWUgb2YgY29udGFpbmluZyBlbGVtZW50LlxuICAgKiBAcGFyYW0gbGNOYW1lIExvd2VyY2FzZSBhdHRyaWJ1dGUgbmFtZS5cbiAgICogQHBhcmFtIHZhbHVlIEF0dHJpYnV0ZSB2YWx1ZS5cbiAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgYHZhbHVlYCBpcyB2YWxpZCwgb3RoZXJ3aXNlIGZhbHNlLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbiAgY29uc3QgX2lzVmFsaWRBdHRyaWJ1dGUgPSBmdW5jdGlvbiAoXG4gICAgbGNUYWc6IHN0cmluZyxcbiAgICBsY05hbWU6IHN0cmluZyxcbiAgICB2YWx1ZTogc3RyaW5nXG4gICk6IGJvb2xlYW4ge1xuICAgIC8qIEZPUkJJRF9BVFRSIG11c3QgYWx3YXlzIHdpbiwgZXZlbiBpZiBBRERfQVRUUiBwcmVkaWNhdGUgd291bGQgYWxsb3cgaXQgKi9cbiAgICBpZiAoRk9SQklEX0FUVFJbbGNOYW1lXSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qIE1ha2Ugc3VyZSBhdHRyaWJ1dGUgY2Fubm90IGNsb2JiZXIgKi9cbiAgICBpZiAoXG4gICAgICBTQU5JVElaRV9ET00gJiZcbiAgICAgIChsY05hbWUgPT09ICdpZCcgfHwgbGNOYW1lID09PSAnbmFtZScpICYmXG4gICAgICAodmFsdWUgaW4gZG9jdW1lbnQgfHwgdmFsdWUgaW4gZm9ybUVsZW1lbnQpXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyogQWxsb3cgdmFsaWQgZGF0YS0qIGF0dHJpYnV0ZXM6IEF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIgYWZ0ZXIgXCItXCJcbiAgICAgICAgKGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2RvbS5odG1sI2VtYmVkZGluZy1jdXN0b20tbm9uLXZpc2libGUtZGF0YS13aXRoLXRoZS1kYXRhLSotYXR0cmlidXRlcylcbiAgICAgICAgWE1MLWNvbXBhdGlibGUgKGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2luZnJhc3RydWN0dXJlLmh0bWwjeG1sLWNvbXBhdGlibGUgYW5kIGh0dHA6Ly93d3cudzMub3JnL1RSL3htbC8jZDBlODA0KVxuICAgICAgICBXZSBkb24ndCBuZWVkIHRvIGNoZWNrIHRoZSB2YWx1ZTsgaXQncyBhbHdheXMgVVJJIHNhZmUuICovXG4gICAgaWYgKFxuICAgICAgQUxMT1dfREFUQV9BVFRSICYmXG4gICAgICAhRk9SQklEX0FUVFJbbGNOYW1lXSAmJlxuICAgICAgcmVnRXhwVGVzdChEQVRBX0FUVFIsIGxjTmFtZSlcbiAgICApIHtcbiAgICAgIC8vIFRoaXMgYXR0cmlidXRlIGlzIHNhZmVcbiAgICB9IGVsc2UgaWYgKEFMTE9XX0FSSUFfQVRUUiAmJiByZWdFeHBUZXN0KEFSSUFfQVRUUiwgbGNOYW1lKSkge1xuICAgICAgLy8gVGhpcyBhdHRyaWJ1dGUgaXMgc2FmZVxuICAgICAgLyogQ2hlY2sgaWYgQUREX0FUVFIgZnVuY3Rpb24gYWxsb3dzIHRoaXMgYXR0cmlidXRlICovXG4gICAgfSBlbHNlIGlmIChcbiAgICAgIEVYVFJBX0VMRU1FTlRfSEFORExJTkcuYXR0cmlidXRlQ2hlY2sgaW5zdGFuY2VvZiBGdW5jdGlvbiAmJlxuICAgICAgRVhUUkFfRUxFTUVOVF9IQU5ETElORy5hdHRyaWJ1dGVDaGVjayhsY05hbWUsIGxjVGFnKVxuICAgICkge1xuICAgICAgLy8gVGhpcyBhdHRyaWJ1dGUgaXMgc2FmZVxuICAgICAgLyogT3RoZXJ3aXNlLCBjaGVjayB0aGUgbmFtZSBpcyBwZXJtaXR0ZWQgKi9cbiAgICB9IGVsc2UgaWYgKCFBTExPV0VEX0FUVFJbbGNOYW1lXSB8fCBGT1JCSURfQVRUUltsY05hbWVdKSB7XG4gICAgICBpZiAoXG4gICAgICAgIC8vIEZpcnN0IGNvbmRpdGlvbiBkb2VzIGEgdmVyeSBiYXNpYyBjaGVjayBpZiBhKSBpdCdzIGJhc2ljYWxseSBhIHZhbGlkIGN1c3RvbSBlbGVtZW50IHRhZ25hbWUgQU5EXG4gICAgICAgIC8vIGIpIGlmIHRoZSB0YWdOYW1lIHBhc3NlcyB3aGF0ZXZlciB0aGUgdXNlciBoYXMgY29uZmlndXJlZCBmb3IgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrXG4gICAgICAgIC8vIGFuZCBjKSBpZiB0aGUgYXR0cmlidXRlIG5hbWUgcGFzc2VzIHdoYXRldmVyIHRoZSB1c2VyIGhhcyBjb25maWd1cmVkIGZvciBDVVNUT01fRUxFTUVOVF9IQU5ETElORy5hdHRyaWJ1dGVOYW1lQ2hlY2tcbiAgICAgICAgKF9pc0Jhc2ljQ3VzdG9tRWxlbWVudChsY1RhZykgJiZcbiAgICAgICAgICAoKENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVjayBpbnN0YW5jZW9mIFJlZ0V4cCAmJlxuICAgICAgICAgICAgcmVnRXhwVGVzdChDVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2ssIGxjVGFnKSkgfHxcbiAgICAgICAgICAgIChDVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2sgaW5zdGFuY2VvZiBGdW5jdGlvbiAmJlxuICAgICAgICAgICAgICBDVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2sobGNUYWcpKSkgJiZcbiAgICAgICAgICAoKENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLmF0dHJpYnV0ZU5hbWVDaGVjayBpbnN0YW5jZW9mIFJlZ0V4cCAmJlxuICAgICAgICAgICAgcmVnRXhwVGVzdChDVVNUT01fRUxFTUVOVF9IQU5ETElORy5hdHRyaWJ1dGVOYW1lQ2hlY2ssIGxjTmFtZSkpIHx8XG4gICAgICAgICAgICAoQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcuYXR0cmlidXRlTmFtZUNoZWNrIGluc3RhbmNlb2YgRnVuY3Rpb24gJiZcbiAgICAgICAgICAgICAgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcuYXR0cmlidXRlTmFtZUNoZWNrKGxjTmFtZSwgbGNUYWcpKSkpIHx8XG4gICAgICAgIC8vIEFsdGVybmF0aXZlLCBzZWNvbmQgY29uZGl0aW9uIGNoZWNrcyBpZiBpdCdzIGFuIGBpc2AtYXR0cmlidXRlLCBBTkRcbiAgICAgICAgLy8gdGhlIHZhbHVlIHBhc3NlcyB3aGF0ZXZlciB0aGUgdXNlciBoYXMgY29uZmlndXJlZCBmb3IgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrXG4gICAgICAgIChsY05hbWUgPT09ICdpcycgJiZcbiAgICAgICAgICBDVVNUT01fRUxFTUVOVF9IQU5ETElORy5hbGxvd0N1c3RvbWl6ZWRCdWlsdEluRWxlbWVudHMgJiZcbiAgICAgICAgICAoKENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVjayBpbnN0YW5jZW9mIFJlZ0V4cCAmJlxuICAgICAgICAgICAgcmVnRXhwVGVzdChDVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2ssIHZhbHVlKSkgfHxcbiAgICAgICAgICAgIChDVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2sgaW5zdGFuY2VvZiBGdW5jdGlvbiAmJlxuICAgICAgICAgICAgICBDVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2sodmFsdWUpKSkpXG4gICAgICApIHtcbiAgICAgICAgLy8gSWYgdXNlciBoYXMgc3VwcGxpZWQgYSByZWdleHAgb3IgZnVuY3Rpb24gaW4gQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrLCB3ZSBuZWVkIHRvIGFsc28gYWxsb3cgZGVyaXZlZCBjdXN0b20gZWxlbWVudHMgdXNpbmcgdGhlIHNhbWUgdGFnTmFtZSB0ZXN0LlxuICAgICAgICAvLyBBZGRpdGlvbmFsbHksIHdlIG5lZWQgdG8gYWxsb3cgYXR0cmlidXRlcyBwYXNzaW5nIHRoZSBDVVNUT01fRUxFTUVOVF9IQU5ETElORy5hdHRyaWJ1dGVOYW1lQ2hlY2sgdXNlciBoYXMgY29uZmlndXJlZCwgYXMgY3VzdG9tIGVsZW1lbnRzIGNhbiBkZWZpbmUgdGhlc2UgYXQgdGhlaXIgb3duIGRpc2NyZXRpb24uXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICAvKiBDaGVjayB2YWx1ZSBpcyBzYWZlLiBGaXJzdCwgaXMgYXR0ciBpbmVydD8gSWYgc28sIGlzIHNhZmUgKi9cbiAgICB9IGVsc2UgaWYgKFVSSV9TQUZFX0FUVFJJQlVURVNbbGNOYW1lXSkge1xuICAgICAgLy8gVGhpcyBhdHRyaWJ1dGUgaXMgc2FmZVxuICAgICAgLyogQ2hlY2sgbm8gc2NyaXB0LCBkYXRhIG9yIHVua25vd24gcG9zc2libHkgdW5zYWZlIFVSSVxuICAgICAgICB1bmxlc3Mgd2Uga25vdyBVUkkgdmFsdWVzIGFyZSBzYWZlIGZvciB0aGF0IGF0dHJpYnV0ZSAqL1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICByZWdFeHBUZXN0KElTX0FMTE9XRURfVVJJLCBzdHJpbmdSZXBsYWNlKHZhbHVlLCBBVFRSX1dISVRFU1BBQ0UsICcnKSlcbiAgICApIHtcbiAgICAgIC8vIFRoaXMgYXR0cmlidXRlIGlzIHNhZmVcbiAgICAgIC8qIEtlZXAgaW1hZ2UgZGF0YSBVUklzIGFsaXZlIGlmIHNyYy94bGluazpocmVmIGlzIGFsbG93ZWQgKi9cbiAgICAgIC8qIEZ1cnRoZXIgcHJldmVudCBnYWRnZXQgWFNTIGZvciBkeW5hbWljYWxseSBidWlsdCBzY3JpcHQgdGFncyAqL1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAobGNOYW1lID09PSAnc3JjJyB8fCBsY05hbWUgPT09ICd4bGluazpocmVmJyB8fCBsY05hbWUgPT09ICdocmVmJykgJiZcbiAgICAgIGxjVGFnICE9PSAnc2NyaXB0JyAmJlxuICAgICAgc3RyaW5nSW5kZXhPZih2YWx1ZSwgJ2RhdGE6JykgPT09IDAgJiZcbiAgICAgIERBVEFfVVJJX1RBR1NbbGNUYWddXG4gICAgKSB7XG4gICAgICAvLyBUaGlzIGF0dHJpYnV0ZSBpcyBzYWZlXG4gICAgICAvKiBBbGxvdyB1bmtub3duIHByb3RvY29sczogVGhpcyBwcm92aWRlcyBzdXBwb3J0IGZvciBsaW5rcyB0aGF0XG4gICAgICAgIGFyZSBoYW5kbGVkIGJ5IHByb3RvY29sIGhhbmRsZXJzIHdoaWNoIG1heSBiZSB1bmtub3duIGFoZWFkIG9mXG4gICAgICAgIHRpbWUsIGUuZy4gZmI6LCBzcG90aWZ5OiAqL1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBBTExPV19VTktOT1dOX1BST1RPQ09MUyAmJlxuICAgICAgIXJlZ0V4cFRlc3QoSVNfU0NSSVBUX09SX0RBVEEsIHN0cmluZ1JlcGxhY2UodmFsdWUsIEFUVFJfV0hJVEVTUEFDRSwgJycpKVxuICAgICkge1xuICAgICAgLy8gVGhpcyBhdHRyaWJ1dGUgaXMgc2FmZVxuICAgICAgLyogQ2hlY2sgZm9yIGJpbmFyeSBhdHRyaWJ1dGVzICovXG4gICAgfSBlbHNlIGlmICh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBCaW5hcnkgYXR0cmlidXRlcyBhcmUgc2FmZSBhdCB0aGlzIHBvaW50XG4gICAgICAvKiBBbnl0aGluZyBlbHNlLCBwcmVzdW1lIHVuc2FmZSwgZG8gbm90IGFkZCBpdCBiYWNrICovXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgLyoqXG4gICAqIF9pc0Jhc2ljQ3VzdG9tRWxlbWVudFxuICAgKiBjaGVja3MgaWYgYXQgbGVhc3Qgb25lIGRhc2ggaXMgaW5jbHVkZWQgaW4gdGFnTmFtZSwgYW5kIGl0J3Mgbm90IHRoZSBmaXJzdCBjaGFyXG4gICAqIGZvciBtb3JlIHNvcGhpc3RpY2F0ZWQgY2hlY2tpbmcgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMvdmFsaWRhdGUtZWxlbWVudC1uYW1lXG4gICAqXG4gICAqIEBwYXJhbSB0YWdOYW1lIG5hbWUgb2YgdGhlIHRhZyBvZiB0aGUgbm9kZSB0byBzYW5pdGl6ZVxuICAgKiBAcmV0dXJucyBSZXR1cm5zIHRydWUgaWYgdGhlIHRhZyBuYW1lIG1lZXRzIHRoZSBiYXNpYyBjcml0ZXJpYSBmb3IgYSBjdXN0b20gZWxlbWVudCwgb3RoZXJ3aXNlIGZhbHNlLlxuICAgKi9cbiAgY29uc3QgX2lzQmFzaWNDdXN0b21FbGVtZW50ID0gZnVuY3Rpb24gKHRhZ05hbWU6IHN0cmluZyk6IFJlZ0V4cE1hdGNoQXJyYXkge1xuICAgIHJldHVybiB0YWdOYW1lICE9PSAnYW5ub3RhdGlvbi14bWwnICYmIHN0cmluZ01hdGNoKHRhZ05hbWUsIENVU1RPTV9FTEVNRU5UKTtcbiAgfTtcblxuICAvKipcbiAgICogX3Nhbml0aXplQXR0cmlidXRlc1xuICAgKlxuICAgKiBAcHJvdGVjdCBhdHRyaWJ1dGVzXG4gICAqIEBwcm90ZWN0IG5vZGVOYW1lXG4gICAqIEBwcm90ZWN0IHJlbW92ZUF0dHJpYnV0ZVxuICAgKiBAcHJvdGVjdCBzZXRBdHRyaWJ1dGVcbiAgICpcbiAgICogQHBhcmFtIGN1cnJlbnROb2RlIHRvIHNhbml0aXplXG4gICAqL1xuICBjb25zdCBfc2FuaXRpemVBdHRyaWJ1dGVzID0gZnVuY3Rpb24gKGN1cnJlbnROb2RlOiBFbGVtZW50KTogdm9pZCB7XG4gICAgLyogRXhlY3V0ZSBhIGhvb2sgaWYgcHJlc2VudCAqL1xuICAgIF9leGVjdXRlSG9va3MoaG9va3MuYmVmb3JlU2FuaXRpemVBdHRyaWJ1dGVzLCBjdXJyZW50Tm9kZSwgbnVsbCk7XG5cbiAgICBjb25zdCB7IGF0dHJpYnV0ZXMgfSA9IGN1cnJlbnROb2RlO1xuXG4gICAgLyogQ2hlY2sgaWYgd2UgaGF2ZSBhdHRyaWJ1dGVzOyBpZiBub3Qgd2UgbWlnaHQgaGF2ZSBhIHRleHQgbm9kZSAqL1xuICAgIGlmICghYXR0cmlidXRlcyB8fCBfaXNDbG9iYmVyZWQoY3VycmVudE5vZGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaG9va0V2ZW50ID0ge1xuICAgICAgYXR0ck5hbWU6ICcnLFxuICAgICAgYXR0clZhbHVlOiAnJyxcbiAgICAgIGtlZXBBdHRyOiB0cnVlLFxuICAgICAgYWxsb3dlZEF0dHJpYnV0ZXM6IEFMTE9XRURfQVRUUixcbiAgICAgIGZvcmNlS2VlcEF0dHI6IHVuZGVmaW5lZCxcbiAgICB9O1xuICAgIGxldCBsID0gYXR0cmlidXRlcy5sZW5ndGg7XG5cbiAgICAvKiBHbyBiYWNrd2FyZHMgb3ZlciBhbGwgYXR0cmlidXRlczsgc2FmZWx5IHJlbW92ZSBiYWQgb25lcyAqL1xuICAgIHdoaWxlIChsLS0pIHtcbiAgICAgIGNvbnN0IGF0dHIgPSBhdHRyaWJ1dGVzW2xdO1xuICAgICAgY29uc3QgeyBuYW1lLCBuYW1lc3BhY2VVUkksIHZhbHVlOiBhdHRyVmFsdWUgfSA9IGF0dHI7XG4gICAgICBjb25zdCBsY05hbWUgPSB0cmFuc2Zvcm1DYXNlRnVuYyhuYW1lKTtcblxuICAgICAgY29uc3QgaW5pdFZhbHVlID0gYXR0clZhbHVlO1xuICAgICAgbGV0IHZhbHVlID0gbmFtZSA9PT0gJ3ZhbHVlJyA/IGluaXRWYWx1ZSA6IHN0cmluZ1RyaW0oaW5pdFZhbHVlKTtcblxuICAgICAgLyogRXhlY3V0ZSBhIGhvb2sgaWYgcHJlc2VudCAqL1xuICAgICAgaG9va0V2ZW50LmF0dHJOYW1lID0gbGNOYW1lO1xuICAgICAgaG9va0V2ZW50LmF0dHJWYWx1ZSA9IHZhbHVlO1xuICAgICAgaG9va0V2ZW50LmtlZXBBdHRyID0gdHJ1ZTtcbiAgICAgIGhvb2tFdmVudC5mb3JjZUtlZXBBdHRyID0gdW5kZWZpbmVkOyAvLyBBbGxvd3MgZGV2ZWxvcGVycyB0byBzZWUgdGhpcyBpcyBhIHByb3BlcnR5IHRoZXkgY2FuIHNldFxuICAgICAgX2V4ZWN1dGVIb29rcyhob29rcy51cG9uU2FuaXRpemVBdHRyaWJ1dGUsIGN1cnJlbnROb2RlLCBob29rRXZlbnQpO1xuICAgICAgdmFsdWUgPSBob29rRXZlbnQuYXR0clZhbHVlO1xuXG4gICAgICAvKiBGdWxsIERPTSBDbG9iYmVyaW5nIHByb3RlY3Rpb24gdmlhIG5hbWVzcGFjZSBpc29sYXRpb24sXG4gICAgICAgKiBQcmVmaXggaWQgYW5kIG5hbWUgYXR0cmlidXRlcyB3aXRoIGB1c2VyLWNvbnRlbnQtYFxuICAgICAgICovXG4gICAgICBpZiAoU0FOSVRJWkVfTkFNRURfUFJPUFMgJiYgKGxjTmFtZSA9PT0gJ2lkJyB8fCBsY05hbWUgPT09ICduYW1lJykpIHtcbiAgICAgICAgLy8gUmVtb3ZlIHRoZSBhdHRyaWJ1dGUgd2l0aCB0aGlzIHZhbHVlXG4gICAgICAgIF9yZW1vdmVBdHRyaWJ1dGUobmFtZSwgY3VycmVudE5vZGUpO1xuXG4gICAgICAgIC8vIFByZWZpeCB0aGUgdmFsdWUgYW5kIGxhdGVyIHJlLWNyZWF0ZSB0aGUgYXR0cmlidXRlIHdpdGggdGhlIHNhbml0aXplZCB2YWx1ZVxuICAgICAgICB2YWx1ZSA9IFNBTklUSVpFX05BTUVEX1BST1BTX1BSRUZJWCArIHZhbHVlO1xuICAgICAgfVxuXG4gICAgICAvKiBXb3JrIGFyb3VuZCBhIHNlY3VyaXR5IGlzc3VlIHdpdGggY29tbWVudHMgaW5zaWRlIGF0dHJpYnV0ZXMgKi9cbiAgICAgIGlmIChcbiAgICAgICAgU0FGRV9GT1JfWE1MICYmXG4gICAgICAgIHJlZ0V4cFRlc3QoXG4gICAgICAgICAgLygoLS0hP3xdKT4pfDxcXC8oc3R5bGV8c2NyaXB0fHRpdGxlfHhtcHx0ZXh0YXJlYXxub3NjcmlwdHxpZnJhbWV8bm9lbWJlZHxub2ZyYW1lcykvaSxcbiAgICAgICAgICB2YWx1ZVxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgX3JlbW92ZUF0dHJpYnV0ZShuYW1lLCBjdXJyZW50Tm9kZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvKiBNYWtlIHN1cmUgd2UgY2Fubm90IGVhc2lseSB1c2UgYW5pbWF0ZWQgaHJlZnMsIGV2ZW4gaWYgYW5pbWF0aW9ucyBhcmUgYWxsb3dlZCAqL1xuICAgICAgaWYgKGxjTmFtZSA9PT0gJ2F0dHJpYnV0ZW5hbWUnICYmIHN0cmluZ01hdGNoKHZhbHVlLCAnaHJlZicpKSB7XG4gICAgICAgIF9yZW1vdmVBdHRyaWJ1dGUobmFtZSwgY3VycmVudE5vZGUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLyogRGlkIHRoZSBob29rcyBhcHByb3ZlIG9mIHRoZSBhdHRyaWJ1dGU/ICovXG4gICAgICBpZiAoaG9va0V2ZW50LmZvcmNlS2VlcEF0dHIpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8qIERpZCB0aGUgaG9va3MgYXBwcm92ZSBvZiB0aGUgYXR0cmlidXRlPyAqL1xuICAgICAgaWYgKCFob29rRXZlbnQua2VlcEF0dHIpIHtcbiAgICAgICAgX3JlbW92ZUF0dHJpYnV0ZShuYW1lLCBjdXJyZW50Tm9kZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvKiBXb3JrIGFyb3VuZCBhIHNlY3VyaXR5IGlzc3VlIGluIGpRdWVyeSAzLjAgKi9cbiAgICAgIGlmICghQUxMT1dfU0VMRl9DTE9TRV9JTl9BVFRSICYmIHJlZ0V4cFRlc3QoL1xcLz4vaSwgdmFsdWUpKSB7XG4gICAgICAgIF9yZW1vdmVBdHRyaWJ1dGUobmFtZSwgY3VycmVudE5vZGUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLyogU2FuaXRpemUgYXR0cmlidXRlIGNvbnRlbnQgdG8gYmUgdGVtcGxhdGUtc2FmZSAqL1xuICAgICAgaWYgKFNBRkVfRk9SX1RFTVBMQVRFUykge1xuICAgICAgICBhcnJheUZvckVhY2goW01VU1RBQ0hFX0VYUFIsIEVSQl9FWFBSLCBUTVBMSVRfRVhQUl0sIChleHByOiBSZWdFeHApID0+IHtcbiAgICAgICAgICB2YWx1ZSA9IHN0cmluZ1JlcGxhY2UodmFsdWUsIGV4cHIsICcgJyk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvKiBJcyBgdmFsdWVgIHZhbGlkIGZvciB0aGlzIGF0dHJpYnV0ZT8gKi9cbiAgICAgIGNvbnN0IGxjVGFnID0gdHJhbnNmb3JtQ2FzZUZ1bmMoY3VycmVudE5vZGUubm9kZU5hbWUpO1xuICAgICAgaWYgKCFfaXNWYWxpZEF0dHJpYnV0ZShsY1RhZywgbGNOYW1lLCB2YWx1ZSkpIHtcbiAgICAgICAgX3JlbW92ZUF0dHJpYnV0ZShuYW1lLCBjdXJyZW50Tm9kZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvKiBIYW5kbGUgYXR0cmlidXRlcyB0aGF0IHJlcXVpcmUgVHJ1c3RlZCBUeXBlcyAqL1xuICAgICAgaWYgKFxuICAgICAgICB0cnVzdGVkVHlwZXNQb2xpY3kgJiZcbiAgICAgICAgdHlwZW9mIHRydXN0ZWRUeXBlcyA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgdHlwZW9mIHRydXN0ZWRUeXBlcy5nZXRBdHRyaWJ1dGVUeXBlID09PSAnZnVuY3Rpb24nXG4gICAgICApIHtcbiAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSkge1xuICAgICAgICAgIC8qIE5hbWVzcGFjZXMgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkLCBzZWUgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MTMwNTI5MyAqL1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN3aXRjaCAodHJ1c3RlZFR5cGVzLmdldEF0dHJpYnV0ZVR5cGUobGNUYWcsIGxjTmFtZSkpIHtcbiAgICAgICAgICAgIGNhc2UgJ1RydXN0ZWRIVE1MJzoge1xuICAgICAgICAgICAgICB2YWx1ZSA9IHRydXN0ZWRUeXBlc1BvbGljeS5jcmVhdGVIVE1MKHZhbHVlKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgJ1RydXN0ZWRTY3JpcHRVUkwnOiB7XG4gICAgICAgICAgICAgIHZhbHVlID0gdHJ1c3RlZFR5cGVzUG9saWN5LmNyZWF0ZVNjcmlwdFVSTCh2YWx1ZSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvKiBIYW5kbGUgaW52YWxpZCBkYXRhLSogYXR0cmlidXRlIHNldCBieSB0cnktY2F0Y2hpbmcgaXQgKi9cbiAgICAgIGlmICh2YWx1ZSAhPT0gaW5pdFZhbHVlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSkge1xuICAgICAgICAgICAgY3VycmVudE5vZGUuc2V0QXR0cmlidXRlTlMobmFtZXNwYWNlVVJJLCBuYW1lLCB2YWx1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8qIEZhbGxiYWNrIHRvIHNldEF0dHJpYnV0ZSgpIGZvciBicm93c2VyLXVucmVjb2duaXplZCBuYW1lc3BhY2VzIGUuZy4gXCJ4LXNjaGVtYVwiLiAqL1xuICAgICAgICAgICAgY3VycmVudE5vZGUuc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoX2lzQ2xvYmJlcmVkKGN1cnJlbnROb2RlKSkge1xuICAgICAgICAgICAgX2ZvcmNlUmVtb3ZlKGN1cnJlbnROb2RlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXJyYXlQb3AoRE9NUHVyaWZ5LnJlbW92ZWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAgIF9yZW1vdmVBdHRyaWJ1dGUobmFtZSwgY3VycmVudE5vZGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogRXhlY3V0ZSBhIGhvb2sgaWYgcHJlc2VudCAqL1xuICAgIF9leGVjdXRlSG9va3MoaG9va3MuYWZ0ZXJTYW5pdGl6ZUF0dHJpYnV0ZXMsIGN1cnJlbnROb2RlLCBudWxsKTtcbiAgfTtcblxuICAvKipcbiAgICogX3Nhbml0aXplU2hhZG93RE9NXG4gICAqXG4gICAqIEBwYXJhbSBmcmFnbWVudCB0byBpdGVyYXRlIG92ZXIgcmVjdXJzaXZlbHlcbiAgICovXG4gIGNvbnN0IF9zYW5pdGl6ZVNoYWRvd0RPTSA9IGZ1bmN0aW9uIChmcmFnbWVudDogRG9jdW1lbnRGcmFnbWVudCk6IHZvaWQge1xuICAgIGxldCBzaGFkb3dOb2RlID0gbnVsbDtcbiAgICBjb25zdCBzaGFkb3dJdGVyYXRvciA9IF9jcmVhdGVOb2RlSXRlcmF0b3IoZnJhZ21lbnQpO1xuXG4gICAgLyogRXhlY3V0ZSBhIGhvb2sgaWYgcHJlc2VudCAqL1xuICAgIF9leGVjdXRlSG9va3MoaG9va3MuYmVmb3JlU2FuaXRpemVTaGFkb3dET00sIGZyYWdtZW50LCBudWxsKTtcblxuICAgIHdoaWxlICgoc2hhZG93Tm9kZSA9IHNoYWRvd0l0ZXJhdG9yLm5leHROb2RlKCkpKSB7XG4gICAgICAvKiBFeGVjdXRlIGEgaG9vayBpZiBwcmVzZW50ICovXG4gICAgICBfZXhlY3V0ZUhvb2tzKGhvb2tzLnVwb25TYW5pdGl6ZVNoYWRvd05vZGUsIHNoYWRvd05vZGUsIG51bGwpO1xuXG4gICAgICAvKiBTYW5pdGl6ZSB0YWdzIGFuZCBlbGVtZW50cyAqL1xuICAgICAgX3Nhbml0aXplRWxlbWVudHMoc2hhZG93Tm9kZSk7XG5cbiAgICAgIC8qIENoZWNrIGF0dHJpYnV0ZXMgbmV4dCAqL1xuICAgICAgX3Nhbml0aXplQXR0cmlidXRlcyhzaGFkb3dOb2RlKTtcblxuICAgICAgLyogRGVlcCBzaGFkb3cgRE9NIGRldGVjdGVkICovXG4gICAgICBpZiAoc2hhZG93Tm9kZS5jb250ZW50IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCkge1xuICAgICAgICBfc2FuaXRpemVTaGFkb3dET00oc2hhZG93Tm9kZS5jb250ZW50KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBFeGVjdXRlIGEgaG9vayBpZiBwcmVzZW50ICovXG4gICAgX2V4ZWN1dGVIb29rcyhob29rcy5hZnRlclNhbml0aXplU2hhZG93RE9NLCBmcmFnbWVudCwgbnVsbCk7XG4gIH07XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbiAgRE9NUHVyaWZ5LnNhbml0aXplID0gZnVuY3Rpb24gKGRpcnR5LCBjZmcgPSB7fSkge1xuICAgIGxldCBib2R5ID0gbnVsbDtcbiAgICBsZXQgaW1wb3J0ZWROb2RlID0gbnVsbDtcbiAgICBsZXQgY3VycmVudE5vZGUgPSBudWxsO1xuICAgIGxldCByZXR1cm5Ob2RlID0gbnVsbDtcbiAgICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhIHN0cmluZyB0byBzYW5pdGl6ZS5cbiAgICAgIERPIE5PVCByZXR1cm4gZWFybHksIGFzIHRoaXMgd2lsbCByZXR1cm4gdGhlIHdyb25nIHR5cGUgaWZcbiAgICAgIHRoZSB1c2VyIGhhcyByZXF1ZXN0ZWQgYSBET00gb2JqZWN0IHJhdGhlciB0aGFuIGEgc3RyaW5nICovXG4gICAgSVNfRU1QVFlfSU5QVVQgPSAhZGlydHk7XG4gICAgaWYgKElTX0VNUFRZX0lOUFVUKSB7XG4gICAgICBkaXJ0eSA9ICc8IS0tPic7XG4gICAgfVxuXG4gICAgLyogU3RyaW5naWZ5LCBpbiBjYXNlIGRpcnR5IGlzIGFuIG9iamVjdCAqL1xuICAgIGlmICh0eXBlb2YgZGlydHkgIT09ICdzdHJpbmcnICYmICFfaXNOb2RlKGRpcnR5KSkge1xuICAgICAgaWYgKHR5cGVvZiBkaXJ0eS50b1N0cmluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBkaXJ0eSA9IGRpcnR5LnRvU3RyaW5nKCk7XG4gICAgICAgIGlmICh0eXBlb2YgZGlydHkgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgdHlwZUVycm9yQ3JlYXRlKCdkaXJ0eSBpcyBub3QgYSBzdHJpbmcsIGFib3J0aW5nJyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IHR5cGVFcnJvckNyZWF0ZSgndG9TdHJpbmcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBSZXR1cm4gZGlydHkgSFRNTCBpZiBET01QdXJpZnkgY2Fubm90IHJ1biAqL1xuICAgIGlmICghRE9NUHVyaWZ5LmlzU3VwcG9ydGVkKSB7XG4gICAgICByZXR1cm4gZGlydHk7XG4gICAgfVxuXG4gICAgLyogQXNzaWduIGNvbmZpZyB2YXJzICovXG4gICAgaWYgKCFTRVRfQ09ORklHKSB7XG4gICAgICBfcGFyc2VDb25maWcoY2ZnKTtcbiAgICB9XG5cbiAgICAvKiBDbGVhbiB1cCByZW1vdmVkIGVsZW1lbnRzICovXG4gICAgRE9NUHVyaWZ5LnJlbW92ZWQgPSBbXTtcblxuICAgIC8qIENoZWNrIGlmIGRpcnR5IGlzIGNvcnJlY3RseSB0eXBlZCBmb3IgSU5fUExBQ0UgKi9cbiAgICBpZiAodHlwZW9mIGRpcnR5ID09PSAnc3RyaW5nJykge1xuICAgICAgSU5fUExBQ0UgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoSU5fUExBQ0UpIHtcbiAgICAgIC8qIERvIHNvbWUgZWFybHkgcHJlLXNhbml0aXphdGlvbiB0byBhdm9pZCB1bnNhZmUgcm9vdCBub2RlcyAqL1xuICAgICAgaWYgKChkaXJ0eSBhcyBOb2RlKS5ub2RlTmFtZSkge1xuICAgICAgICBjb25zdCB0YWdOYW1lID0gdHJhbnNmb3JtQ2FzZUZ1bmMoKGRpcnR5IGFzIE5vZGUpLm5vZGVOYW1lKTtcbiAgICAgICAgaWYgKCFBTExPV0VEX1RBR1NbdGFnTmFtZV0gfHwgRk9SQklEX1RBR1NbdGFnTmFtZV0pIHtcbiAgICAgICAgICB0aHJvdyB0eXBlRXJyb3JDcmVhdGUoXG4gICAgICAgICAgICAncm9vdCBub2RlIGlzIGZvcmJpZGRlbiBhbmQgY2Fubm90IGJlIHNhbml0aXplZCBpbi1wbGFjZSdcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChkaXJ0eSBpbnN0YW5jZW9mIE5vZGUpIHtcbiAgICAgIC8qIElmIGRpcnR5IGlzIGEgRE9NIGVsZW1lbnQsIGFwcGVuZCB0byBhbiBlbXB0eSBkb2N1bWVudCB0byBhdm9pZFxuICAgICAgICAgZWxlbWVudHMgYmVpbmcgc3RyaXBwZWQgYnkgdGhlIHBhcnNlciAqL1xuICAgICAgYm9keSA9IF9pbml0RG9jdW1lbnQoJzwhLS0tLT4nKTtcbiAgICAgIGltcG9ydGVkTm9kZSA9IGJvZHkub3duZXJEb2N1bWVudC5pbXBvcnROb2RlKGRpcnR5LCB0cnVlKTtcbiAgICAgIGlmIChcbiAgICAgICAgaW1wb3J0ZWROb2RlLm5vZGVUeXBlID09PSBOT0RFX1RZUEUuZWxlbWVudCAmJlxuICAgICAgICBpbXBvcnRlZE5vZGUubm9kZU5hbWUgPT09ICdCT0RZJ1xuICAgICAgKSB7XG4gICAgICAgIC8qIE5vZGUgaXMgYWxyZWFkeSBhIGJvZHksIHVzZSBhcyBpcyAqL1xuICAgICAgICBib2R5ID0gaW1wb3J0ZWROb2RlO1xuICAgICAgfSBlbHNlIGlmIChpbXBvcnRlZE5vZGUubm9kZU5hbWUgPT09ICdIVE1MJykge1xuICAgICAgICBib2R5ID0gaW1wb3J0ZWROb2RlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vcHJlZmVyLWRvbS1ub2RlLWFwcGVuZFxuICAgICAgICBib2R5LmFwcGVuZENoaWxkKGltcG9ydGVkTm9kZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIEV4aXQgZGlyZWN0bHkgaWYgd2UgaGF2ZSBub3RoaW5nIHRvIGRvICovXG4gICAgICBpZiAoXG4gICAgICAgICFSRVRVUk5fRE9NICYmXG4gICAgICAgICFTQUZFX0ZPUl9URU1QTEFURVMgJiZcbiAgICAgICAgIVdIT0xFX0RPQ1VNRU5UICYmXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL3ByZWZlci1pbmNsdWRlc1xuICAgICAgICBkaXJ0eS5pbmRleE9mKCc8JykgPT09IC0xXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRydXN0ZWRUeXBlc1BvbGljeSAmJiBSRVRVUk5fVFJVU1RFRF9UWVBFXG4gICAgICAgICAgPyB0cnVzdGVkVHlwZXNQb2xpY3kuY3JlYXRlSFRNTChkaXJ0eSlcbiAgICAgICAgICA6IGRpcnR5O1xuICAgICAgfVxuXG4gICAgICAvKiBJbml0aWFsaXplIHRoZSBkb2N1bWVudCB0byB3b3JrIG9uICovXG4gICAgICBib2R5ID0gX2luaXREb2N1bWVudChkaXJ0eSk7XG5cbiAgICAgIC8qIENoZWNrIHdlIGhhdmUgYSBET00gbm9kZSBmcm9tIHRoZSBkYXRhICovXG4gICAgICBpZiAoIWJvZHkpIHtcbiAgICAgICAgcmV0dXJuIFJFVFVSTl9ET00gPyBudWxsIDogUkVUVVJOX1RSVVNURURfVFlQRSA/IGVtcHR5SFRNTCA6ICcnO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qIFJlbW92ZSBmaXJzdCBlbGVtZW50IG5vZGUgKG91cnMpIGlmIEZPUkNFX0JPRFkgaXMgc2V0ICovXG4gICAgaWYgKGJvZHkgJiYgRk9SQ0VfQk9EWSkge1xuICAgICAgX2ZvcmNlUmVtb3ZlKGJvZHkuZmlyc3RDaGlsZCk7XG4gICAgfVxuXG4gICAgLyogR2V0IG5vZGUgaXRlcmF0b3IgKi9cbiAgICBjb25zdCBub2RlSXRlcmF0b3IgPSBfY3JlYXRlTm9kZUl0ZXJhdG9yKElOX1BMQUNFID8gZGlydHkgOiBib2R5KTtcblxuICAgIC8qIE5vdyBzdGFydCBpdGVyYXRpbmcgb3ZlciB0aGUgY3JlYXRlZCBkb2N1bWVudCAqL1xuICAgIHdoaWxlICgoY3VycmVudE5vZGUgPSBub2RlSXRlcmF0b3IubmV4dE5vZGUoKSkpIHtcbiAgICAgIC8qIFNhbml0aXplIHRhZ3MgYW5kIGVsZW1lbnRzICovXG4gICAgICBfc2FuaXRpemVFbGVtZW50cyhjdXJyZW50Tm9kZSk7XG5cbiAgICAgIC8qIENoZWNrIGF0dHJpYnV0ZXMgbmV4dCAqL1xuICAgICAgX3Nhbml0aXplQXR0cmlidXRlcyhjdXJyZW50Tm9kZSk7XG5cbiAgICAgIC8qIFNoYWRvdyBET00gZGV0ZWN0ZWQsIHNhbml0aXplIGl0ICovXG4gICAgICBpZiAoY3VycmVudE5vZGUuY29udGVudCBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpIHtcbiAgICAgICAgX3Nhbml0aXplU2hhZG93RE9NKGN1cnJlbnROb2RlLmNvbnRlbnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qIElmIHdlIHNhbml0aXplZCBgZGlydHlgIGluLXBsYWNlLCByZXR1cm4gaXQuICovXG4gICAgaWYgKElOX1BMQUNFKSB7XG4gICAgICByZXR1cm4gZGlydHk7XG4gICAgfVxuXG4gICAgLyogUmV0dXJuIHNhbml0aXplZCBzdHJpbmcgb3IgRE9NICovXG4gICAgaWYgKFJFVFVSTl9ET00pIHtcbiAgICAgIGlmIChSRVRVUk5fRE9NX0ZSQUdNRU5UKSB7XG4gICAgICAgIHJldHVybk5vZGUgPSBjcmVhdGVEb2N1bWVudEZyYWdtZW50LmNhbGwoYm9keS5vd25lckRvY3VtZW50KTtcblxuICAgICAgICB3aGlsZSAoYm9keS5maXJzdENoaWxkKSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vcHJlZmVyLWRvbS1ub2RlLWFwcGVuZFxuICAgICAgICAgIHJldHVybk5vZGUuYXBwZW5kQ2hpbGQoYm9keS5maXJzdENoaWxkKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuTm9kZSA9IGJvZHk7XG4gICAgICB9XG5cbiAgICAgIGlmIChBTExPV0VEX0FUVFIuc2hhZG93cm9vdCB8fCBBTExPV0VEX0FUVFIuc2hhZG93cm9vdG1vZGUpIHtcbiAgICAgICAgLypcbiAgICAgICAgICBBZG9wdE5vZGUoKSBpcyBub3QgdXNlZCBiZWNhdXNlIGludGVybmFsIHN0YXRlIGlzIG5vdCByZXNldFxuICAgICAgICAgIChlLmcuIHRoZSBwYXN0IG5hbWVzIG1hcCBvZiBhIEhUTUxGb3JtRWxlbWVudCksIHRoaXMgaXMgc2FmZVxuICAgICAgICAgIGluIHRoZW9yeSBidXQgd2Ugd291bGQgcmF0aGVyIG5vdCByaXNrIGFub3RoZXIgYXR0YWNrIHZlY3Rvci5cbiAgICAgICAgICBUaGUgc3RhdGUgdGhhdCBpcyBjbG9uZWQgYnkgaW1wb3J0Tm9kZSgpIGlzIGV4cGxpY2l0bHkgZGVmaW5lZFxuICAgICAgICAgIGJ5IHRoZSBzcGVjcy5cbiAgICAgICAgKi9cbiAgICAgICAgcmV0dXJuTm9kZSA9IGltcG9ydE5vZGUuY2FsbChvcmlnaW5hbERvY3VtZW50LCByZXR1cm5Ob2RlLCB0cnVlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJldHVybk5vZGU7XG4gICAgfVxuXG4gICAgbGV0IHNlcmlhbGl6ZWRIVE1MID0gV0hPTEVfRE9DVU1FTlQgPyBib2R5Lm91dGVySFRNTCA6IGJvZHkuaW5uZXJIVE1MO1xuXG4gICAgLyogU2VyaWFsaXplIGRvY3R5cGUgaWYgYWxsb3dlZCAqL1xuICAgIGlmIChcbiAgICAgIFdIT0xFX0RPQ1VNRU5UICYmXG4gICAgICBBTExPV0VEX1RBR1NbJyFkb2N0eXBlJ10gJiZcbiAgICAgIGJvZHkub3duZXJEb2N1bWVudCAmJlxuICAgICAgYm9keS5vd25lckRvY3VtZW50LmRvY3R5cGUgJiZcbiAgICAgIGJvZHkub3duZXJEb2N1bWVudC5kb2N0eXBlLm5hbWUgJiZcbiAgICAgIHJlZ0V4cFRlc3QoRVhQUkVTU0lPTlMuRE9DVFlQRV9OQU1FLCBib2R5Lm93bmVyRG9jdW1lbnQuZG9jdHlwZS5uYW1lKVxuICAgICkge1xuICAgICAgc2VyaWFsaXplZEhUTUwgPVxuICAgICAgICAnPCFET0NUWVBFICcgKyBib2R5Lm93bmVyRG9jdW1lbnQuZG9jdHlwZS5uYW1lICsgJz5cXG4nICsgc2VyaWFsaXplZEhUTUw7XG4gICAgfVxuXG4gICAgLyogU2FuaXRpemUgZmluYWwgc3RyaW5nIHRlbXBsYXRlLXNhZmUgKi9cbiAgICBpZiAoU0FGRV9GT1JfVEVNUExBVEVTKSB7XG4gICAgICBhcnJheUZvckVhY2goW01VU1RBQ0hFX0VYUFIsIEVSQl9FWFBSLCBUTVBMSVRfRVhQUl0sIChleHByOiBSZWdFeHApID0+IHtcbiAgICAgICAgc2VyaWFsaXplZEhUTUwgPSBzdHJpbmdSZXBsYWNlKHNlcmlhbGl6ZWRIVE1MLCBleHByLCAnICcpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydXN0ZWRUeXBlc1BvbGljeSAmJiBSRVRVUk5fVFJVU1RFRF9UWVBFXG4gICAgICA/IHRydXN0ZWRUeXBlc1BvbGljeS5jcmVhdGVIVE1MKHNlcmlhbGl6ZWRIVE1MKVxuICAgICAgOiBzZXJpYWxpemVkSFRNTDtcbiAgfTtcblxuICBET01QdXJpZnkuc2V0Q29uZmlnID0gZnVuY3Rpb24gKGNmZyA9IHt9KSB7XG4gICAgX3BhcnNlQ29uZmlnKGNmZyk7XG4gICAgU0VUX0NPTkZJRyA9IHRydWU7XG4gIH07XG5cbiAgRE9NUHVyaWZ5LmNsZWFyQ29uZmlnID0gZnVuY3Rpb24gKCkge1xuICAgIENPTkZJRyA9IG51bGw7XG4gICAgU0VUX0NPTkZJRyA9IGZhbHNlO1xuICB9O1xuXG4gIERPTVB1cmlmeS5pc1ZhbGlkQXR0cmlidXRlID0gZnVuY3Rpb24gKHRhZywgYXR0ciwgdmFsdWUpIHtcbiAgICAvKiBJbml0aWFsaXplIHNoYXJlZCBjb25maWcgdmFycyBpZiBuZWNlc3NhcnkuICovXG4gICAgaWYgKCFDT05GSUcpIHtcbiAgICAgIF9wYXJzZUNvbmZpZyh7fSk7XG4gICAgfVxuXG4gICAgY29uc3QgbGNUYWcgPSB0cmFuc2Zvcm1DYXNlRnVuYyh0YWcpO1xuICAgIGNvbnN0IGxjTmFtZSA9IHRyYW5zZm9ybUNhc2VGdW5jKGF0dHIpO1xuICAgIHJldHVybiBfaXNWYWxpZEF0dHJpYnV0ZShsY1RhZywgbGNOYW1lLCB2YWx1ZSk7XG4gIH07XG5cbiAgRE9NUHVyaWZ5LmFkZEhvb2sgPSBmdW5jdGlvbiAoXG4gICAgZW50cnlQb2ludDoga2V5b2YgSG9va3NNYXAsXG4gICAgaG9va0Z1bmN0aW9uOiBIb29rRnVuY3Rpb25cbiAgKSB7XG4gICAgaWYgKHR5cGVvZiBob29rRnVuY3Rpb24gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhcnJheVB1c2goaG9va3NbZW50cnlQb2ludF0sIGhvb2tGdW5jdGlvbik7XG4gIH07XG5cbiAgRE9NUHVyaWZ5LnJlbW92ZUhvb2sgPSBmdW5jdGlvbiAoXG4gICAgZW50cnlQb2ludDoga2V5b2YgSG9va3NNYXAsXG4gICAgaG9va0Z1bmN0aW9uOiBIb29rRnVuY3Rpb25cbiAgKSB7XG4gICAgaWYgKGhvb2tGdW5jdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBpbmRleCA9IGFycmF5TGFzdEluZGV4T2YoaG9va3NbZW50cnlQb2ludF0sIGhvb2tGdW5jdGlvbik7XG5cbiAgICAgIHJldHVybiBpbmRleCA9PT0gLTFcbiAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgOiBhcnJheVNwbGljZShob29rc1tlbnRyeVBvaW50XSwgaW5kZXgsIDEpWzBdO1xuICAgIH1cblxuICAgIHJldHVybiBhcnJheVBvcChob29rc1tlbnRyeVBvaW50XSk7XG4gIH07XG5cbiAgRE9NUHVyaWZ5LnJlbW92ZUhvb2tzID0gZnVuY3Rpb24gKGVudHJ5UG9pbnQ6IGtleW9mIEhvb2tzTWFwKSB7XG4gICAgaG9va3NbZW50cnlQb2ludF0gPSBbXTtcbiAgfTtcblxuICBET01QdXJpZnkucmVtb3ZlQWxsSG9va3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgaG9va3MgPSBfY3JlYXRlSG9va3NNYXAoKTtcbiAgfTtcblxuICByZXR1cm4gRE9NUHVyaWZ5O1xufVxuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVET01QdXJpZnkoKTtcblxuZXhwb3J0IGludGVyZmFjZSBET01QdXJpZnkge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIERPTVB1cmlmeSBpbnN0YW5jZSB1c2luZyB0aGUgZ2l2ZW4gd2luZG93LWxpa2Ugb2JqZWN0LiBEZWZhdWx0cyB0byBgd2luZG93YC5cbiAgICovXG4gIChyb290PzogV2luZG93TGlrZSk6IERPTVB1cmlmeTtcblxuICAvKipcbiAgICogVmVyc2lvbiBsYWJlbCwgZXhwb3NlZCBmb3IgZWFzaWVyIGNoZWNrc1xuICAgKiBpZiBET01QdXJpZnkgaXMgdXAgdG8gZGF0ZSBvciBub3RcbiAgICovXG4gIHZlcnNpb246IHN0cmluZztcblxuICAvKipcbiAgICogQXJyYXkgb2YgZWxlbWVudHMgdGhhdCBET01QdXJpZnkgcmVtb3ZlZCBkdXJpbmcgc2FuaXRhdGlvbi5cbiAgICogRW1wdHkgaWYgbm90aGluZyB3YXMgcmVtb3ZlZC5cbiAgICovXG4gIHJlbW92ZWQ6IEFycmF5PFJlbW92ZWRFbGVtZW50IHwgUmVtb3ZlZEF0dHJpYnV0ZT47XG5cbiAgLyoqXG4gICAqIEV4cG9zZSB3aGV0aGVyIHRoaXMgYnJvd3NlciBzdXBwb3J0cyBydW5uaW5nIHRoZSBmdWxsIERPTVB1cmlmeS5cbiAgICovXG4gIGlzU3VwcG9ydGVkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGNvbmZpZ3VyYXRpb24gb25jZS5cbiAgICpcbiAgICogQHBhcmFtIGNmZyBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgKi9cbiAgc2V0Q29uZmlnKGNmZz86IENvbmZpZyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgdGhlIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBjbGVhckNvbmZpZygpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBQcm92aWRlcyBjb3JlIHNhbml0YXRpb24gZnVuY3Rpb25hbGl0eS5cbiAgICpcbiAgICogQHBhcmFtIGRpcnR5IHN0cmluZyBvciBET00gbm9kZVxuICAgKiBAcGFyYW0gY2ZnIG9iamVjdFxuICAgKiBAcmV0dXJucyBTYW5pdGl6ZWQgVHJ1c3RlZEhUTUwuXG4gICAqL1xuICBzYW5pdGl6ZShcbiAgICBkaXJ0eTogc3RyaW5nIHwgTm9kZSxcbiAgICBjZmc6IENvbmZpZyAmIHsgUkVUVVJOX1RSVVNURURfVFlQRTogdHJ1ZSB9XG4gICk6IFRydXN0ZWRIVE1MO1xuXG4gIC8qKlxuICAgKiBQcm92aWRlcyBjb3JlIHNhbml0YXRpb24gZnVuY3Rpb25hbGl0eS5cbiAgICpcbiAgICogQHBhcmFtIGRpcnR5IERPTSBub2RlXG4gICAqIEBwYXJhbSBjZmcgb2JqZWN0XG4gICAqIEByZXR1cm5zIFNhbml0aXplZCBET00gbm9kZS5cbiAgICovXG4gIHNhbml0aXplKGRpcnR5OiBOb2RlLCBjZmc6IENvbmZpZyAmIHsgSU5fUExBQ0U6IHRydWUgfSk6IE5vZGU7XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVzIGNvcmUgc2FuaXRhdGlvbiBmdW5jdGlvbmFsaXR5LlxuICAgKlxuICAgKiBAcGFyYW0gZGlydHkgc3RyaW5nIG9yIERPTSBub2RlXG4gICAqIEBwYXJhbSBjZmcgb2JqZWN0XG4gICAqIEByZXR1cm5zIFNhbml0aXplZCBET00gbm9kZS5cbiAgICovXG4gIHNhbml0aXplKGRpcnR5OiBzdHJpbmcgfCBOb2RlLCBjZmc6IENvbmZpZyAmIHsgUkVUVVJOX0RPTTogdHJ1ZSB9KTogTm9kZTtcblxuICAvKipcbiAgICogUHJvdmlkZXMgY29yZSBzYW5pdGF0aW9uIGZ1bmN0aW9uYWxpdHkuXG4gICAqXG4gICAqIEBwYXJhbSBkaXJ0eSBzdHJpbmcgb3IgRE9NIG5vZGVcbiAgICogQHBhcmFtIGNmZyBvYmplY3RcbiAgICogQHJldHVybnMgU2FuaXRpemVkIGRvY3VtZW50IGZyYWdtZW50LlxuICAgKi9cbiAgc2FuaXRpemUoXG4gICAgZGlydHk6IHN0cmluZyB8IE5vZGUsXG4gICAgY2ZnOiBDb25maWcgJiB7IFJFVFVSTl9ET01fRlJBR01FTlQ6IHRydWUgfVxuICApOiBEb2N1bWVudEZyYWdtZW50O1xuXG4gIC8qKlxuICAgKiBQcm92aWRlcyBjb3JlIHNhbml0YXRpb24gZnVuY3Rpb25hbGl0eS5cbiAgICpcbiAgICogQHBhcmFtIGRpcnR5IHN0cmluZyBvciBET00gbm9kZVxuICAgKiBAcGFyYW0gY2ZnIG9iamVjdFxuICAgKiBAcmV0dXJucyBTYW5pdGl6ZWQgc3RyaW5nLlxuICAgKi9cbiAgc2FuaXRpemUoZGlydHk6IHN0cmluZyB8IE5vZGUsIGNmZz86IENvbmZpZyk6IHN0cmluZztcblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGFuIGF0dHJpYnV0ZSB2YWx1ZSBpcyB2YWxpZC5cbiAgICogVXNlcyBsYXN0IHNldCBjb25maWcsIGlmIGFueS4gT3RoZXJ3aXNlLCB1c2VzIGNvbmZpZyBkZWZhdWx0cy5cbiAgICpcbiAgICogQHBhcmFtIHRhZyBUYWcgbmFtZSBvZiBjb250YWluaW5nIGVsZW1lbnQuXG4gICAqIEBwYXJhbSBhdHRyIEF0dHJpYnV0ZSBuYW1lLlxuICAgKiBAcGFyYW0gdmFsdWUgQXR0cmlidXRlIHZhbHVlLlxuICAgKiBAcmV0dXJucyBSZXR1cm5zIHRydWUgaWYgYHZhbHVlYCBpcyB2YWxpZC4gT3RoZXJ3aXNlLCByZXR1cm5zIGZhbHNlLlxuICAgKi9cbiAgaXNWYWxpZEF0dHJpYnV0ZSh0YWc6IHN0cmluZywgYXR0cjogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQWRkcyBhIERPTVB1cmlmeSBob29rLlxuICAgKlxuICAgKiBAcGFyYW0gZW50cnlQb2ludCBlbnRyeSBwb2ludCBmb3IgdGhlIGhvb2sgdG8gYWRkXG4gICAqIEBwYXJhbSBob29rRnVuY3Rpb24gZnVuY3Rpb24gdG8gZXhlY3V0ZVxuICAgKi9cbiAgYWRkSG9vayhlbnRyeVBvaW50OiBCYXNpY0hvb2tOYW1lLCBob29rRnVuY3Rpb246IE5vZGVIb29rKTogdm9pZDtcblxuICAvKipcbiAgICogQWRkcyBhIERPTVB1cmlmeSBob29rLlxuICAgKlxuICAgKiBAcGFyYW0gZW50cnlQb2ludCBlbnRyeSBwb2ludCBmb3IgdGhlIGhvb2sgdG8gYWRkXG4gICAqIEBwYXJhbSBob29rRnVuY3Rpb24gZnVuY3Rpb24gdG8gZXhlY3V0ZVxuICAgKi9cbiAgYWRkSG9vayhlbnRyeVBvaW50OiBFbGVtZW50SG9va05hbWUsIGhvb2tGdW5jdGlvbjogRWxlbWVudEhvb2spOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBBZGRzIGEgRE9NUHVyaWZ5IGhvb2suXG4gICAqXG4gICAqIEBwYXJhbSBlbnRyeVBvaW50IGVudHJ5IHBvaW50IGZvciB0aGUgaG9vayB0byBhZGRcbiAgICogQHBhcmFtIGhvb2tGdW5jdGlvbiBmdW5jdGlvbiB0byBleGVjdXRlXG4gICAqL1xuICBhZGRIb29rKFxuICAgIGVudHJ5UG9pbnQ6IERvY3VtZW50RnJhZ21lbnRIb29rTmFtZSxcbiAgICBob29rRnVuY3Rpb246IERvY3VtZW50RnJhZ21lbnRIb29rXG4gICk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBET01QdXJpZnkgaG9vay5cbiAgICpcbiAgICogQHBhcmFtIGVudHJ5UG9pbnQgZW50cnkgcG9pbnQgZm9yIHRoZSBob29rIHRvIGFkZFxuICAgKiBAcGFyYW0gaG9va0Z1bmN0aW9uIGZ1bmN0aW9uIHRvIGV4ZWN1dGVcbiAgICovXG4gIGFkZEhvb2soXG4gICAgZW50cnlQb2ludDogJ3Vwb25TYW5pdGl6ZUVsZW1lbnQnLFxuICAgIGhvb2tGdW5jdGlvbjogVXBvblNhbml0aXplRWxlbWVudEhvb2tcbiAgKTogdm9pZDtcblxuICAvKipcbiAgICogQWRkcyBhIERPTVB1cmlmeSBob29rLlxuICAgKlxuICAgKiBAcGFyYW0gZW50cnlQb2ludCBlbnRyeSBwb2ludCBmb3IgdGhlIGhvb2sgdG8gYWRkXG4gICAqIEBwYXJhbSBob29rRnVuY3Rpb24gZnVuY3Rpb24gdG8gZXhlY3V0ZVxuICAgKi9cbiAgYWRkSG9vayhcbiAgICBlbnRyeVBvaW50OiAndXBvblNhbml0aXplQXR0cmlidXRlJyxcbiAgICBob29rRnVuY3Rpb246IFVwb25TYW5pdGl6ZUF0dHJpYnV0ZUhvb2tcbiAgKTogdm9pZDtcblxuICAvKipcbiAgICogUmVtb3ZlIGEgRE9NUHVyaWZ5IGhvb2sgYXQgYSBnaXZlbiBlbnRyeVBvaW50XG4gICAqIChwb3BzIGl0IGZyb20gdGhlIHN0YWNrIG9mIGhvb2tzIGlmIGhvb2sgbm90IHNwZWNpZmllZClcbiAgICpcbiAgICogQHBhcmFtIGVudHJ5UG9pbnQgZW50cnkgcG9pbnQgZm9yIHRoZSBob29rIHRvIHJlbW92ZVxuICAgKiBAcGFyYW0gaG9va0Z1bmN0aW9uIG9wdGlvbmFsIHNwZWNpZmljIGhvb2sgdG8gcmVtb3ZlXG4gICAqIEByZXR1cm5zIHJlbW92ZWQgaG9va1xuICAgKi9cbiAgcmVtb3ZlSG9vayhcbiAgICBlbnRyeVBvaW50OiBCYXNpY0hvb2tOYW1lLFxuICAgIGhvb2tGdW5jdGlvbj86IE5vZGVIb29rXG4gICk6IE5vZGVIb29rIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBET01QdXJpZnkgaG9vayBhdCBhIGdpdmVuIGVudHJ5UG9pbnRcbiAgICogKHBvcHMgaXQgZnJvbSB0aGUgc3RhY2sgb2YgaG9va3MgaWYgaG9vayBub3Qgc3BlY2lmaWVkKVxuICAgKlxuICAgKiBAcGFyYW0gZW50cnlQb2ludCBlbnRyeSBwb2ludCBmb3IgdGhlIGhvb2sgdG8gcmVtb3ZlXG4gICAqIEBwYXJhbSBob29rRnVuY3Rpb24gb3B0aW9uYWwgc3BlY2lmaWMgaG9vayB0byByZW1vdmVcbiAgICogQHJldHVybnMgcmVtb3ZlZCBob29rXG4gICAqL1xuICByZW1vdmVIb29rKFxuICAgIGVudHJ5UG9pbnQ6IEVsZW1lbnRIb29rTmFtZSxcbiAgICBob29rRnVuY3Rpb24/OiBFbGVtZW50SG9va1xuICApOiBFbGVtZW50SG9vayB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogUmVtb3ZlIGEgRE9NUHVyaWZ5IGhvb2sgYXQgYSBnaXZlbiBlbnRyeVBvaW50XG4gICAqIChwb3BzIGl0IGZyb20gdGhlIHN0YWNrIG9mIGhvb2tzIGlmIGhvb2sgbm90IHNwZWNpZmllZClcbiAgICpcbiAgICogQHBhcmFtIGVudHJ5UG9pbnQgZW50cnkgcG9pbnQgZm9yIHRoZSBob29rIHRvIHJlbW92ZVxuICAgKiBAcGFyYW0gaG9va0Z1bmN0aW9uIG9wdGlvbmFsIHNwZWNpZmljIGhvb2sgdG8gcmVtb3ZlXG4gICAqIEByZXR1cm5zIHJlbW92ZWQgaG9va1xuICAgKi9cbiAgcmVtb3ZlSG9vayhcbiAgICBlbnRyeVBvaW50OiBEb2N1bWVudEZyYWdtZW50SG9va05hbWUsXG4gICAgaG9va0Z1bmN0aW9uPzogRG9jdW1lbnRGcmFnbWVudEhvb2tcbiAgKTogRG9jdW1lbnRGcmFnbWVudEhvb2sgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIERPTVB1cmlmeSBob29rIGF0IGEgZ2l2ZW4gZW50cnlQb2ludFxuICAgKiAocG9wcyBpdCBmcm9tIHRoZSBzdGFjayBvZiBob29rcyBpZiBob29rIG5vdCBzcGVjaWZpZWQpXG4gICAqXG4gICAqIEBwYXJhbSBlbnRyeVBvaW50IGVudHJ5IHBvaW50IGZvciB0aGUgaG9vayB0byByZW1vdmVcbiAgICogQHBhcmFtIGhvb2tGdW5jdGlvbiBvcHRpb25hbCBzcGVjaWZpYyBob29rIHRvIHJlbW92ZVxuICAgKiBAcmV0dXJucyByZW1vdmVkIGhvb2tcbiAgICovXG4gIHJlbW92ZUhvb2soXG4gICAgZW50cnlQb2ludDogJ3Vwb25TYW5pdGl6ZUVsZW1lbnQnLFxuICAgIGhvb2tGdW5jdGlvbj86IFVwb25TYW5pdGl6ZUVsZW1lbnRIb29rXG4gICk6IFVwb25TYW5pdGl6ZUVsZW1lbnRIb29rIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBET01QdXJpZnkgaG9vayBhdCBhIGdpdmVuIGVudHJ5UG9pbnRcbiAgICogKHBvcHMgaXQgZnJvbSB0aGUgc3RhY2sgb2YgaG9va3MgaWYgaG9vayBub3Qgc3BlY2lmaWVkKVxuICAgKlxuICAgKiBAcGFyYW0gZW50cnlQb2ludCBlbnRyeSBwb2ludCBmb3IgdGhlIGhvb2sgdG8gcmVtb3ZlXG4gICAqIEBwYXJhbSBob29rRnVuY3Rpb24gb3B0aW9uYWwgc3BlY2lmaWMgaG9vayB0byByZW1vdmVcbiAgICogQHJldHVybnMgcmVtb3ZlZCBob29rXG4gICAqL1xuICByZW1vdmVIb29rKFxuICAgIGVudHJ5UG9pbnQ6ICd1cG9uU2FuaXRpemVBdHRyaWJ1dGUnLFxuICAgIGhvb2tGdW5jdGlvbj86IFVwb25TYW5pdGl6ZUF0dHJpYnV0ZUhvb2tcbiAgKTogVXBvblNhbml0aXplQXR0cmlidXRlSG9vayB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogUmVtb3ZlcyBhbGwgRE9NUHVyaWZ5IGhvb2tzIGF0IGEgZ2l2ZW4gZW50cnlQb2ludFxuICAgKlxuICAgKiBAcGFyYW0gZW50cnlQb2ludCBlbnRyeSBwb2ludCBmb3IgdGhlIGhvb2tzIHRvIHJlbW92ZVxuICAgKi9cbiAgcmVtb3ZlSG9va3MoZW50cnlQb2ludDogSG9va05hbWUpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFsbCBET01QdXJpZnkgaG9va3MuXG4gICAqL1xuICByZW1vdmVBbGxIb29rcygpOiB2b2lkO1xufVxuXG4vKipcbiAqIEFuIGVsZW1lbnQgcmVtb3ZlZCBieSBET01QdXJpZnkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVtb3ZlZEVsZW1lbnQge1xuICAvKipcbiAgICogVGhlIGVsZW1lbnQgdGhhdCB3YXMgcmVtb3ZlZC5cbiAgICovXG4gIGVsZW1lbnQ6IE5vZGU7XG59XG5cbi8qKlxuICogQW4gZWxlbWVudCByZW1vdmVkIGJ5IERPTVB1cmlmeS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZW1vdmVkQXR0cmlidXRlIHtcbiAgLyoqXG4gICAqIFRoZSBhdHRyaWJ1dGUgdGhhdCB3YXMgcmVtb3ZlZC5cbiAgICovXG4gIGF0dHJpYnV0ZTogQXR0ciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBlbGVtZW50IHRoYXQgdGhlIGF0dHJpYnV0ZSB3YXMgcmVtb3ZlZC5cbiAgICovXG4gIGZyb206IE5vZGU7XG59XG5cbnR5cGUgQmFzaWNIb29rTmFtZSA9XG4gIHwgJ2JlZm9yZVNhbml0aXplRWxlbWVudHMnXG4gIHwgJ2FmdGVyU2FuaXRpemVFbGVtZW50cydcbiAgfCAndXBvblNhbml0aXplU2hhZG93Tm9kZSc7XG50eXBlIEVsZW1lbnRIb29rTmFtZSA9ICdiZWZvcmVTYW5pdGl6ZUF0dHJpYnV0ZXMnIHwgJ2FmdGVyU2FuaXRpemVBdHRyaWJ1dGVzJztcbnR5cGUgRG9jdW1lbnRGcmFnbWVudEhvb2tOYW1lID1cbiAgfCAnYmVmb3JlU2FuaXRpemVTaGFkb3dET00nXG4gIHwgJ2FmdGVyU2FuaXRpemVTaGFkb3dET00nO1xudHlwZSBVcG9uU2FuaXRpemVFbGVtZW50SG9va05hbWUgPSAndXBvblNhbml0aXplRWxlbWVudCc7XG50eXBlIFVwb25TYW5pdGl6ZUF0dHJpYnV0ZUhvb2tOYW1lID0gJ3Vwb25TYW5pdGl6ZUF0dHJpYnV0ZSc7XG5cbmludGVyZmFjZSBIb29rc01hcCB7XG4gIGJlZm9yZVNhbml0aXplRWxlbWVudHM6IE5vZGVIb29rW107XG4gIGFmdGVyU2FuaXRpemVFbGVtZW50czogTm9kZUhvb2tbXTtcbiAgYmVmb3JlU2FuaXRpemVTaGFkb3dET006IERvY3VtZW50RnJhZ21lbnRIb29rW107XG4gIHVwb25TYW5pdGl6ZVNoYWRvd05vZGU6IE5vZGVIb29rW107XG4gIGFmdGVyU2FuaXRpemVTaGFkb3dET006IERvY3VtZW50RnJhZ21lbnRIb29rW107XG4gIGJlZm9yZVNhbml0aXplQXR0cmlidXRlczogRWxlbWVudEhvb2tbXTtcbiAgYWZ0ZXJTYW5pdGl6ZUF0dHJpYnV0ZXM6IEVsZW1lbnRIb29rW107XG4gIHVwb25TYW5pdGl6ZUVsZW1lbnQ6IFVwb25TYW5pdGl6ZUVsZW1lbnRIb29rW107XG4gIHVwb25TYW5pdGl6ZUF0dHJpYnV0ZTogVXBvblNhbml0aXplQXR0cmlidXRlSG9va1tdO1xufVxuXG50eXBlIEFycmF5RWxlbWVudDxUPiA9IFQgZXh0ZW5kcyBBcnJheTxpbmZlciBVPiA/IFUgOiBuZXZlcjtcblxudHlwZSBIb29rRnVuY3Rpb24gPSBBcnJheUVsZW1lbnQ8SG9va3NNYXBba2V5b2YgSG9va3NNYXBdPjtcblxuZXhwb3J0IHR5cGUgSG9va05hbWUgPVxuICB8IEJhc2ljSG9va05hbWVcbiAgfCBFbGVtZW50SG9va05hbWVcbiAgfCBEb2N1bWVudEZyYWdtZW50SG9va05hbWVcbiAgfCBVcG9uU2FuaXRpemVFbGVtZW50SG9va05hbWVcbiAgfCBVcG9uU2FuaXRpemVBdHRyaWJ1dGVIb29rTmFtZTtcblxuZXhwb3J0IHR5cGUgTm9kZUhvb2sgPSAoXG4gIHRoaXM6IERPTVB1cmlmeSxcbiAgY3VycmVudE5vZGU6IE5vZGUsXG4gIGhvb2tFdmVudDogbnVsbCxcbiAgY29uZmlnOiBDb25maWdcbikgPT4gdm9pZDtcblxuZXhwb3J0IHR5cGUgRWxlbWVudEhvb2sgPSAoXG4gIHRoaXM6IERPTVB1cmlmeSxcbiAgY3VycmVudE5vZGU6IEVsZW1lbnQsXG4gIGhvb2tFdmVudDogbnVsbCxcbiAgY29uZmlnOiBDb25maWdcbikgPT4gdm9pZDtcblxuZXhwb3J0IHR5cGUgRG9jdW1lbnRGcmFnbWVudEhvb2sgPSAoXG4gIHRoaXM6IERPTVB1cmlmeSxcbiAgY3VycmVudE5vZGU6IERvY3VtZW50RnJhZ21lbnQsXG4gIGhvb2tFdmVudDogbnVsbCxcbiAgY29uZmlnOiBDb25maWdcbikgPT4gdm9pZDtcblxuZXhwb3J0IHR5cGUgVXBvblNhbml0aXplRWxlbWVudEhvb2sgPSAoXG4gIHRoaXM6IERPTVB1cmlmeSxcbiAgY3VycmVudE5vZGU6IE5vZGUsXG4gIGhvb2tFdmVudDogVXBvblNhbml0aXplRWxlbWVudEhvb2tFdmVudCxcbiAgY29uZmlnOiBDb25maWdcbikgPT4gdm9pZDtcblxuZXhwb3J0IHR5cGUgVXBvblNhbml0aXplQXR0cmlidXRlSG9vayA9IChcbiAgdGhpczogRE9NUHVyaWZ5LFxuICBjdXJyZW50Tm9kZTogRWxlbWVudCxcbiAgaG9va0V2ZW50OiBVcG9uU2FuaXRpemVBdHRyaWJ1dGVIb29rRXZlbnQsXG4gIGNvbmZpZzogQ29uZmlnXG4pID0+IHZvaWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXBvblNhbml0aXplRWxlbWVudEhvb2tFdmVudCB7XG4gIHRhZ05hbWU6IHN0cmluZztcbiAgYWxsb3dlZFRhZ3M6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVwb25TYW5pdGl6ZUF0dHJpYnV0ZUhvb2tFdmVudCB7XG4gIGF0dHJOYW1lOiBzdHJpbmc7XG4gIGF0dHJWYWx1ZTogc3RyaW5nO1xuICBrZWVwQXR0cjogYm9vbGVhbjtcbiAgYWxsb3dlZEF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+O1xuICBmb3JjZUtlZXBBdHRyOiBib29sZWFuIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEEgYFdpbmRvd2AtbGlrZSBvYmplY3QgY29udGFpbmluZyB0aGUgcHJvcGVydGllcyBhbmQgdHlwZXMgdGhhdCBET01QdXJpZnkgcmVxdWlyZXMuXG4gKi9cbmV4cG9ydCB0eXBlIFdpbmRvd0xpa2UgPSBQaWNrPFxuICB0eXBlb2YgZ2xvYmFsVGhpcyxcbiAgfCAnRG9jdW1lbnRGcmFnbWVudCdcbiAgfCAnSFRNTFRlbXBsYXRlRWxlbWVudCdcbiAgfCAnTm9kZSdcbiAgfCAnRWxlbWVudCdcbiAgfCAnTm9kZUZpbHRlcidcbiAgfCAnTmFtZWROb2RlTWFwJ1xuICB8ICdIVE1MRm9ybUVsZW1lbnQnXG4gIHwgJ0RPTVBhcnNlcidcbj4gJiB7XG4gIGRvY3VtZW50PzogRG9jdW1lbnQ7XG4gIE1vek5hbWVkQXR0ck1hcD86IHR5cGVvZiB3aW5kb3cuTmFtZWROb2RlTWFwO1xufSAmIFBpY2s8VHJ1c3RlZFR5cGVzV2luZG93LCAndHJ1c3RlZFR5cGVzJz47XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9tZXNzYWdlLWRpc3BhdGNoLmpzXG4gKiBDaGF0IG1lc3NhZ2UgZGlzcGF0Y2g6IHNlbmRNZXNzYWdlLCBpbnRha2UgY29uZmlybWF0aW9uIGNhcmQsXG4gKiBwcmlvci1jbGFyaWZpY2F0aW9uIHByZWxvYWQuXG4gKlxuICogREVQRU5ERU5DSUVTIChhbGwgb24gZ2xvYmFsVGhpcyBhdCBydW50aW1lKTpcbiAqICAgLSBwYXJzZU1lc3NhZ2VSZXNwb25zZSAodmFsaWRhdG9ycy5qcylcbiAqICAgLSBzZXRMb2FkaW5nLCBsbG1GZXRjaCAoZmV0Y2gtdXRpbHMuanMpXG4gKiAgIC0gYXBwZW5kTWVzc2FnZSwgYXBwZW5kUmV0cnlNZXNzYWdlLCBhcHBlbmRSYXdIdG1sIChtZXNzYWdlLXF1ZXVlLmpzKVxuICogICAtIG5vcm1hbGl6ZVRleHQsIGVzY2FwZUh0bWwgKHV0aWxzLmpzKVxuICogICAtIGZldGNoU3RhdHVzIChhcGktY2xpZW50LmpzKVxuICogICAtIGFuYWx5emVKb2IgKGpvYi1hbmFseXNpcy5qcylcbiAqICAgLSBzZW5kQWN0aW9uIChzZXNzaW9uLWFjdGlvbnMuanMpXG4gKiAgIC0gc2hvd1RhYmxlQmFzZWRSZXZpZXcgKHJldmlldy10YWJsZS1iYXNlLmpzLCBUaWVyIDQpXG4gKiAgIC0gaGFuZGxlRXhwZXJpZW5jZVJlc3BvbnNlIChleHBlcmllbmNlLXJldmlldy5qcywgVGllciA1KVxuICogICAtIGhhbmRsZVNraWxsc1Jlc3BvbnNlIChza2lsbHMtcmV2aWV3LmpzLCBUaWVyIDUpXG4gKiAgIC0gaGFuZGxlUXVlc3Rpb25SZXNwb25zZSAocXVlc3Rpb25zLXBhbmVsLmpzKVxuICogICAtIGV4dHJhY3RGaXJzdEpzb25PYmplY3QsIGhhbmRsZUN1c3RvbWl6YXRpb25SZXNwb25zZSAoYXBwLmpzIG9yY2hlc3RyYXRvcilcbiAqICAgLSBzdGF0ZU1hbmFnZXIgKHN0YXRlLW1hbmFnZXIuanMgXHUyMDE0IGlzTG9hZGluZygpKVxuICogICAtIHF1ZXN0aW9uQW5zd2VycywgcGVuZGluZ1JlY29tbWVuZGF0aW9ucyAod2luZG93IGdsb2JhbHMpXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdtZXNzYWdlLWRpc3BhdGNoJyk7XG5cbmltcG9ydCB7IHN0YXRlTWFuYWdlciB9IGZyb20gJy4vc3RhdGUtbWFuYWdlci5qcyc7XG5pbXBvcnQgeyBnZXRTZXNzaW9uSWRGcm9tVVJMIH0gZnJvbSAnLi9hcGktY2xpZW50LmpzJztcblxubGV0IF9wZW5kaW5nUG9zdEludGFrZUNvbnRpbnVhdGlvbiA9IG51bGw7XG5jb25zdCBSRVRSWV9QT0xJQ1lfU1RPUkFHRV9LRVkgPSAnY3YtYnVpbGRlci1yZXRyeS1wb2xpY3knO1xubGV0IF9yZXRyeUF0dGVtcHRDb3VudCA9IDA7XG5sZXQgX3JldHJ5VGltZXIgPSBudWxsO1xubGV0IF9yZXRyeUludGVydmFsID0gbnVsbDtcblxuZnVuY3Rpb24gX2NsZWFyUmV0cnlUaW1lcnMoKSB7XG4gIGlmIChfcmV0cnlUaW1lcikge1xuICAgIGNsZWFyVGltZW91dChfcmV0cnlUaW1lcik7XG4gICAgX3JldHJ5VGltZXIgPSBudWxsO1xuICB9XG4gIGlmIChfcmV0cnlJbnRlcnZhbCkge1xuICAgIGNsZWFySW50ZXJ2YWwoX3JldHJ5SW50ZXJ2YWwpO1xuICAgIF9yZXRyeUludGVydmFsID0gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBfZ2V0UmV0cnlQb2xpY3koKSB7XG4gIGNvbnN0IGRlZmF1bHRzID0ge1xuICAgIGJhc2VNczogMTUwMCxcbiAgICBjYXBNczogNjAwMDAsXG4gICAgbWF4QXR0ZW1wdHM6IDYsXG4gICAgYXV0b1JldHJ5OiB0cnVlLFxuICB9O1xuICB0cnkge1xuICAgIGNvbnN0IHJhdyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFJFVFJZX1BPTElDWV9TVE9SQUdFX0tFWSk7XG4gICAgaWYgKCFyYXcpIHJldHVybiBkZWZhdWx0cztcbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHJhdyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGJhc2VNczogTWF0aC5tYXgoMjAwLCBOdW1iZXIocGFyc2VkLmJhc2VNcyB8fCBkZWZhdWx0cy5iYXNlTXMpKSxcbiAgICAgIGNhcE1zOiBNYXRoLm1heCgxMDAwLCBOdW1iZXIocGFyc2VkLmNhcE1zIHx8IGRlZmF1bHRzLmNhcE1zKSksXG4gICAgICBtYXhBdHRlbXB0czogTWF0aC5tYXgoMSwgTnVtYmVyKHBhcnNlZC5tYXhBdHRlbXB0cyB8fCBkZWZhdWx0cy5tYXhBdHRlbXB0cykpLFxuICAgICAgYXV0b1JldHJ5OiBwYXJzZWQuYXV0b1JldHJ5ICE9PSBmYWxzZSxcbiAgICB9O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZGVmYXVsdHM7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2NhbGN1bGF0ZVJldHJ5RGVsYXlNcyhraW5kLCBlcnJvcikge1xuICBjb25zdCBwb2xpY3kgPSBfZ2V0UmV0cnlQb2xpY3koKTtcbiAgY29uc3QgZXhwID0gTWF0aC5taW4ocG9saWN5LmNhcE1zLCBwb2xpY3kuYmFzZU1zICogKDIgKiogX3JldHJ5QXR0ZW1wdENvdW50KSk7XG4gIGNvbnN0IGppdHRlciA9IE1hdGgucm91bmQoZXhwICogKDAuMSArIE1hdGgucmFuZG9tKCkgKiAwLjE1KSk7XG4gIGxldCBkZWxheU1zID0gTWF0aC5taW4ocG9saWN5LmNhcE1zLCBleHAgKyBqaXR0ZXIpO1xuXG4gIGlmIChraW5kID09PSAncmF0ZS1saW1pdGVkJykge1xuICAgIGNvbnN0IHJldHJ5QWZ0ZXJTZWMgPSBOdW1iZXIoZXJyb3I/LnJldHJ5QWZ0ZXJTZWMgfHwgMCk7XG4gICAgaWYgKHJldHJ5QWZ0ZXJTZWMgPiAwKSB7XG4gICAgICBkZWxheU1zID0gTWF0aC5tYXgoZGVsYXlNcywgcmV0cnlBZnRlclNlYyAqIDEwMDApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGVsYXlNcztcbn1cblxuZnVuY3Rpb24gX3NjaGVkdWxlUmV0cnkodGV4dCwgZGVyaXZlZCwgZXJyb3IpIHtcbiAgX2NsZWFyUmV0cnlUaW1lcnMoKTtcbiAgY29uc3QgcG9saWN5ID0gX2dldFJldHJ5UG9saWN5KCk7XG5cbiAgLy8gQ2xpZW50IGVycm9ycyAoNHh4KSBhbmQgYXV0aCBmYWlsdXJlcyBhcmUgbm90IHRyYW5zaWVudDsgZG8gbm90IGF1dG8tcmV0cnkuXG4gIGNvbnN0IE5PTl9SRVRSWUFCTEUgPSBuZXcgU2V0KFsnY2xpZW50LWVycm9yJywgJ2F1dGgtcmVxdWlyZWQnXSk7XG4gIGNvbnN0IGNhbkF1dG9SZXRyeSA9IHBvbGljeS5hdXRvUmV0cnlcbiAgICAmJiBfcmV0cnlBdHRlbXB0Q291bnQgPCBwb2xpY3kubWF4QXR0ZW1wdHNcbiAgICAmJiAhTk9OX1JFVFJZQUJMRS5oYXMoZGVyaXZlZC5raW5kKTtcblxuICBjb25zdCBkZWxheU1zID0gX2NhbGN1bGF0ZVJldHJ5RGVsYXlNcyhkZXJpdmVkLmtpbmQsIGVycm9yKTtcbiAgY29uc3QgdG90YWxTZWNvbmRzID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKGRlbGF5TXMgLyAxMDAwKSk7XG5cbiAgY29uc3QgcmV0cnlBY3Rpb24gPSAoKSA9PiB7XG4gICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWVzc2FnZS1pbnB1dCcpO1xuICAgIGlmIChpbnB1dCkgaW5wdXQudmFsdWUgPSB0ZXh0O1xuICAgIHNlbmRNZXNzYWdlKCk7XG4gIH07XG5cbiAgbGV0IHJldHJ5TWVzc2FnZTtcbiAgY29uc3QgY2FuY2VsRm4gPSBjYW5BdXRvUmV0cnkgPyAoKSA9PiB7XG4gICAgX2NsZWFyUmV0cnlUaW1lcnMoKTtcbiAgICBpZiAocmV0cnlNZXNzYWdlKSByZXRyeU1lc3NhZ2UucmVtb3ZlKCk7XG4gIH0gOiBudWxsO1xuXG4gIHJldHJ5TWVzc2FnZSA9IGFwcGVuZFJldHJ5TWVzc2FnZShcbiAgICBgXHUyNkEwXHVGRTBGICR7ZXJyb3IubWVzc2FnZX1gLFxuICAgICgpID0+IHtcbiAgICAgIF9jbGVhclJldHJ5VGltZXJzKCk7XG4gICAgICBfcmV0cnlBdHRlbXB0Q291bnQgKz0gMTtcbiAgICAgIHJldHJ5QWN0aW9uKCk7XG4gICAgfSxcbiAgICBjYW5BdXRvUmV0cnkgPyBgUmV0cnkgaW4gJHt0b3RhbFNlY29uZHN9c2AgOiAnUmV0cnknLFxuICAgIGNhbmNlbEZuLFxuICApO1xuXG4gIGlmICghY2FuQXV0b1JldHJ5KSByZXR1cm47XG5cbiAgY29uc3QgcmV0cnlCdG4gPSByZXRyeU1lc3NhZ2U/LnF1ZXJ5U2VsZWN0b3IoJ2J1dHRvbicpO1xuICBsZXQgcmVtYWluaW5nID0gdG90YWxTZWNvbmRzO1xuICBpZiAocmV0cnlCdG4pIHtcbiAgICByZXRyeUJ0bi50ZXh0Q29udGVudCA9IGBSZXRyeSBpbiAke3JlbWFpbmluZ31zYDtcbiAgICBpZiAoZGVyaXZlZC5raW5kID09PSAncmF0ZS1saW1pdGVkJykge1xuICAgICAgcmV0cnlCdG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgcmV0cnlCdG4uc3R5bGUub3BhY2l0eSA9ICcwLjcnO1xuICAgICAgcmV0cnlCdG4uc3R5bGUuY3Vyc29yID0gJ25vdC1hbGxvd2VkJztcbiAgICB9XG4gIH1cblxuICBfcmV0cnlJbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICByZW1haW5pbmcgLT0gMTtcbiAgICBpZiAocmV0cnlCdG4gJiYgcmVtYWluaW5nID4gMCkge1xuICAgICAgcmV0cnlCdG4udGV4dENvbnRlbnQgPSBgUmV0cnkgaW4gJHtyZW1haW5pbmd9c2A7XG4gICAgfVxuICAgIGlmIChyZW1haW5pbmcgPD0gMCkge1xuICAgICAgaWYgKHJldHJ5QnRuKSB7XG4gICAgICAgIHJldHJ5QnRuLnRleHRDb250ZW50ID0gJ1JldHJ5IE5vdyc7XG4gICAgICAgIHJldHJ5QnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgIHJldHJ5QnRuLnN0eWxlLm9wYWNpdHkgPSAnJztcbiAgICAgICAgcmV0cnlCdG4uc3R5bGUuY3Vyc29yID0gJyc7XG4gICAgICB9XG4gICAgICBjbGVhckludGVydmFsKF9yZXRyeUludGVydmFsKTtcbiAgICAgIF9yZXRyeUludGVydmFsID0gbnVsbDtcbiAgICB9XG4gIH0sIDEwMDApO1xuXG4gIF9yZXRyeVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgX3JldHJ5VGltZXIgPSBudWxsO1xuICAgIF9yZXRyeUF0dGVtcHRDb3VudCArPSAxO1xuICAgIHJldHJ5TWVzc2FnZT8ucmVtb3ZlKCk7XG4gICAgcmV0cnlBY3Rpb24oKTtcbiAgfSwgZGVsYXlNcyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9wYXJzZUFwaUpzb25SZXNwb25zZShyZXNwb25zZSwgZW5kcG9pbnQpIHtcbiAgY29uc3Qgc3RhdHVzID0gTnVtYmVyKHJlc3BvbnNlPy5zdGF0dXMgfHwgMCk7XG4gIGNvbnN0IHN0YXR1c1RleHQgPSByZXNwb25zZT8uc3RhdHVzVGV4dCB8fCAnVW5rbm93biBTdGF0dXMnO1xuICBjb25zdCBjb250ZW50VHlwZSA9IChyZXNwb25zZT8uaGVhZGVycz8uZ2V0KCdjb250ZW50LXR5cGUnKSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgcmF3ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICBsZXQgZGV0YWlsID0gc3RhdHVzVGV4dDtcbiAgICBpZiAoY29udGVudFR5cGUuaW5jbHVkZXMoJ2FwcGxpY2F0aW9uL2pzb24nKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IEpTT04ucGFyc2UocmF3IHx8ICd7fScpO1xuICAgICAgICBkZXRhaWwgPSBwYXlsb2FkPy5lcnJvciB8fCBwYXlsb2FkPy5tZXNzYWdlIHx8IGRldGFpbDtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBLZWVwIGZhbGxiYWNrIGRldGFpbCBpZiBtYWxmb3JtZWQgSlNPTiBlcnJvciBwYXlsb2FkLlxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoKHJhdyB8fCAnJykudHJpbSgpLnN0YXJ0c1dpdGgoJzwnKSkge1xuICAgICAgZGV0YWlsID0gJ3NlcnZlciByZXR1cm5lZCBIVE1MIGluc3RlYWQgb2YgSlNPTiAocG9zc2libGUgc2Vzc2lvbiByZWRpcmVjdCBvciBiYWNrZW5kIGVycm9yKSc7XG4gICAgfSBlbHNlIGlmICgocmF3IHx8ICcnKS50cmltKCkpIHtcbiAgICAgIGRldGFpbCA9IHJhdy50cmltKCkuc2xpY2UoMCwgMjIwKTtcbiAgICB9XG4gICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoYCR7c3RhdHVzfTogJHtkZXRhaWx9YCk7XG4gICAgZXJyb3Iuc3RhdHVzID0gc3RhdHVzO1xuICAgIGVycm9yLnJldHJ5QWZ0ZXJTZWMgPSBOdW1iZXIocmVzcG9uc2U/LmhlYWRlcnM/LmdldCgncmV0cnktYWZ0ZXInKSB8fCAwKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxuXG4gIGlmICghY29udGVudFR5cGUuaW5jbHVkZXMoJ2FwcGxpY2F0aW9uL2pzb24nKSkge1xuICAgIGNvbnN0IHNuaXBwZXQgPSAocmF3IHx8ICcnKS50cmltKCkuc2xpY2UoMCwgODApO1xuICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihcbiAgICAgIGBFeHBlY3RlZCBKU09OIGZyb20gJHtlbmRwb2ludH0sIGdvdCAke2NvbnRlbnRUeXBlIHx8ICd1bmtub3duIGNvbnRlbnQgdHlwZSd9JHtzbmlwcGV0ID8gYDogJHtzbmlwcGV0fWAgOiAnJ31gLFxuICAgICk7XG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBwYXJzZU1lc3NhZ2VSZXNwb25zZShKU09OLnBhcnNlKHJhdyB8fCAne30nKSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBJbnZhbGlkIEpTT04gZnJvbSAke2VuZHBvaW50fTogJHtlcnJvci5tZXNzYWdlfWApO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9zZXRMaXZlTGxtU3RhdGUoa2luZCwgdGV4dCwgaWNvbiA9ICcnLCB0b29sdGlwID0gJycpIHtcbiAgaWYgKHR5cGVvZiBfdXBkYXRlTGxtU3RhdHVzUGlsbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIF91cGRhdGVMbG1TdGF0dXNQaWxsKGtpbmQsIHRleHQsIGljb24sIHRvb2x0aXApO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9kZXJpdmVFcnJvclN0YXRlKGVycm9yKSB7XG4gIGNvbnN0IG1lc3NhZ2UgPSBTdHJpbmcoZXJyb3I/Lm1lc3NhZ2UgfHwgZXJyb3IgfHwgJ1Vua25vd24gZXJyb3InKTtcbiAgY29uc3QgbG93ZXIgPSBtZXNzYWdlLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IHN0YXR1cyA9IE51bWJlcihlcnJvcj8uc3RhdHVzIHx8IDApO1xuXG4gIGlmIChzdGF0dXMgPT09IDQwMSB8fCBzdGF0dXMgPT09IDQwMyB8fCBtZXNzYWdlLnN0YXJ0c1dpdGgoJzQwMTonKSB8fCBtZXNzYWdlLnN0YXJ0c1dpdGgoJzQwMzonKSB8fCBsb3dlci5pbmNsdWRlcygnYXV0aCcpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtpbmQ6ICdhdXRoLXJlcXVpcmVkJyxcbiAgICAgIHRleHQ6ICdBdXRoZW50aWNhdGlvbiByZXF1aXJlZCcsXG4gICAgICBpY29uOiAnXHVEODNEXHVERDExJyxcbiAgICAgIHRvb2x0aXA6ICdBdXRoZW50aWNhdGlvbiBmYWlsZWQuIENoZWNrIEFQSSBrZXkvdG9rZW4gb3Igc2lnbiBpbiBhZ2Fpbi4nLFxuICAgIH07XG4gIH1cblxuICBpZiAoc3RhdHVzID09PSA0MjkgfHwgbWVzc2FnZS5zdGFydHNXaXRoKCc0Mjk6JykgfHwgbG93ZXIuaW5jbHVkZXMoJ3JhdGUgbGltaXQnKSkge1xuICAgIHJldHVybiB7XG4gICAgICBraW5kOiAncmF0ZS1saW1pdGVkJyxcbiAgICAgIHRleHQ6ICdSYXRlIGxpbWl0ZWQnLFxuICAgICAgaWNvbjogJ1x1MjNGMycsXG4gICAgICB0b29sdGlwOiAnUHJvdmlkZXIgcmF0ZSBsaW1pdCByZWFjaGVkLiBXYWl0IGJyaWVmbHkgYW5kIHJldHJ5LicsXG4gICAgfTtcbiAgfVxuXG4gIGlmIChcbiAgICBzdGF0dXMgPT09IDUwMiB8fFxuICAgIHN0YXR1cyA9PT0gNTAzIHx8XG4gICAgc3RhdHVzID09PSA1MDQgfHxcbiAgICBtZXNzYWdlLnN0YXJ0c1dpdGgoJzUwMjonKSB8fFxuICAgIG1lc3NhZ2Uuc3RhcnRzV2l0aCgnNTAzOicpIHx8XG4gICAgbWVzc2FnZS5zdGFydHNXaXRoKCc1MDQ6JykgfHxcbiAgICBsb3dlci5pbmNsdWRlcygndGltZW91dCcpIHx8XG4gICAgbG93ZXIuaW5jbHVkZXMoJ3VuYXZhaWxhYmxlJykgfHxcbiAgICBsb3dlci5pbmNsdWRlcygnY2Fubm90IHJlYWNoJylcbiAgKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtpbmQ6ICd1bmF2YWlsYWJsZScsXG4gICAgICB0ZXh0OiAnUHJvdmlkZXIgdW5hdmFpbGFibGUnLFxuICAgICAgaWNvbjogJ1x1MjYwMScsXG4gICAgICB0b29sdGlwOiAnUHJvdmlkZXIgaXMgY3VycmVudGx5IHVuYXZhaWxhYmxlIG9yIHVucmVhY2hhYmxlLiBSZXRyeSBzb29uLicsXG4gICAgfTtcbiAgfVxuXG4gIC8vIDR4eCBjbGllbnQgZXJyb3JzIGFyZSBub3QgdHJhbnNpZW50IFx1MjAxNCByZXRyeWluZyB3aWxsIG5vdCBmaXggdGhlbS5cbiAgaWYgKHN0YXR1cyA+PSA0MDAgJiYgc3RhdHVzIDwgNTAwKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtpbmQ6ICdjbGllbnQtZXJyb3InLFxuICAgICAgdGV4dDogJ1JlcXVlc3QgZXJyb3InLFxuICAgICAgaWNvbjogJ1x1MjZBMCcsXG4gICAgICB0b29sdGlwOiBtZXNzYWdlLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGtpbmQ6ICdlcnJvcicsXG4gICAgdGV4dDogJ0Nvbm5lY3Rpb24gZmFpbGVkJyxcbiAgICBpY29uOiAnXHUyNkEwJyxcbiAgICB0b29sdGlwOiBtZXNzYWdlLFxuICB9O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIERlZmF1bHQgTExNIG1lc3NhZ2UgaGFuZGxlclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmFzeW5jIGZ1bmN0aW9uIF9oYW5kbGVMTE1NZXNzYWdlKHRleHQpIHtcbiAgX2NsZWFyUmV0cnlUaW1lcnMoKTtcbiAgc2V0TG9hZGluZyh0cnVlLCAnVGhpbmtpbmdcdTIwMjYnKTtcbiAgX3NldExpdmVMbG1TdGF0ZSgnY29ubmVjdGluZycsICdDb25uZWN0aW5nXHUyMDI2JywgJ1x1MjlENycsICdTZW5kaW5nIHJlcXVlc3QgdG8gcHJvdmlkZXIuJyk7XG4gIGxldCB0ZXJtaW5hbFN0YXRlID0gbnVsbDtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBsbG1GZXRjaCgnL2FwaS9tZXNzYWdlJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgbWVzc2FnZTogdGV4dCB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgX3BhcnNlQXBpSnNvblJlc3BvbnNlKHJlcywgJy9hcGkvbWVzc2FnZScpO1xuXG4gICAgaWYgKGRhdGEuZXJyb3IpIHtcbiAgICAgIGNvbnN0IGVycm9yTXNnID0gZGF0YS5lcnJvci50b1N0cmluZygpO1xuICAgICAgY29uc3QgZGVyaXZlZCA9IF9kZXJpdmVFcnJvclN0YXRlKG5ldyBFcnJvcihlcnJvck1zZykpO1xuICAgICAgX3NldExpdmVMbG1TdGF0ZShkZXJpdmVkLmtpbmQsIGRlcml2ZWQudGV4dCwgZGVyaXZlZC5pY29uLCBkZXJpdmVkLnRvb2x0aXApO1xuICAgICAgX3NjaGVkdWxlUmV0cnkodGV4dCwgZGVyaXZlZCwgbmV3IEVycm9yKGVycm9yTXNnKSk7XG4gICAgICB0ZXJtaW5hbFN0YXRlID0gZGVyaXZlZDtcbiAgICAgIGxvZy5lcnJvcignU2VydmVyIGVycm9yOicsIGRhdGEuZXJyb3IpO1xuICAgIH0gZWxzZSBpZiAoZGF0YS5yZXNwb25zZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY2xlYW5SZXNwb25zZSA9IGRhdGEucmVzcG9uc2U7XG4gICAgICAgIGNvbnN0IHBhcnNlZEN1c3RvbWl6YXRpb24gPSBleHRyYWN0Rmlyc3RKc29uT2JqZWN0KGNsZWFuUmVzcG9uc2UpO1xuICAgICAgICBpZiAocGFyc2VkQ3VzdG9taXphdGlvbiAmJiAocGFyc2VkQ3VzdG9taXphdGlvbi5yZWNvbW1lbmRlZF9leHBlcmllbmNlcyB8fCBwYXJzZWRDdXN0b21pemF0aW9uLnJlY29tbWVuZGVkX3NraWxscykpIHtcbiAgICAgICAgICBjb25zdCBqc29uU3RhcnQgPSBjbGVhblJlc3BvbnNlLmluZGV4T2YoJ3snKTtcbiAgICAgICAgICBjb25zdCB0ZXh0QmVmb3JlSnNvbiA9IGpzb25TdGFydCA+IDAgPyBjbGVhblJlc3BvbnNlLnN1YnN0cmluZygwLCBqc29uU3RhcnQpLnRyaW0oKSA6ICcnO1xuICAgICAgICAgIGlmICh0ZXh0QmVmb3JlSnNvbiAmJiAhdGV4dEJlZm9yZUpzb24uaW5jbHVkZXMoJ3tcImFjdGlvblwiOicpKSB7XG4gICAgICAgICAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCB0ZXh0QmVmb3JlSnNvbik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGF3YWl0IGhhbmRsZUN1c3RvbWl6YXRpb25SZXNwb25zZShwYXJzZWRDdXN0b21pemF0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoY2xlYW5SZXNwb25zZS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgY2xlYW5SZXNwb25zZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nLmVycm9yKCdFcnJvciBwcm9jZXNzaW5nIG1lc3NhZ2UgcmVzcG9uc2U6JywgZXJyLCBkYXRhLnJlc3BvbnNlKTtcbiAgICAgICAgY29uc3QgZGVyaXZlZCA9IF9kZXJpdmVFcnJvclN0YXRlKGVycik7XG4gICAgICAgIF9zZXRMaXZlTGxtU3RhdGUoZGVyaXZlZC5raW5kLCBkZXJpdmVkLnRleHQsIGRlcml2ZWQuaWNvbiwgZGVyaXZlZC50b29sdGlwKTtcbiAgICAgICAgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgYFx1MjZBMFx1RkUwRiBJIGVuY291bnRlcmVkIGFuIGlzc3VlIHByb2Nlc3NpbmcgdGhhdCByZXNwb25zZTogJHtlcnIubWVzc2FnZX0uIFRoZSBjb252ZXJzYXRpb24gaGFzIGJlZW4gc2F2ZWQuYCk7XG4gICAgICAgIHRlcm1pbmFsU3RhdGUgPSBkZXJpdmVkO1xuICAgICAgfVxuICAgICAgY29uc3QgY29ubmVjdGVkU3RhdGUgPSB7IGtpbmQ6ICdjb25uZWN0ZWQnLCB0ZXh0OiAnQ29ubmVjdGVkJywgaWNvbjogJ1x1MjcxMycsIHRvb2x0aXA6ICdQcm92aWRlciByZXNwb25kZWQgc3VjY2Vzc2Z1bGx5IHRvIGEgbGl2ZSByZXF1ZXN0LicgfTtcbiAgICAgIF9zZXRMaXZlTGxtU3RhdGUoY29ubmVjdGVkU3RhdGUua2luZCwgY29ubmVjdGVkU3RhdGUudGV4dCwgY29ubmVjdGVkU3RhdGUuaWNvbiwgY29ubmVjdGVkU3RhdGUudG9vbHRpcCk7XG4gICAgICB0ZXJtaW5hbFN0YXRlID0gY29ubmVjdGVkU3RhdGU7XG4gICAgICBfcmV0cnlBdHRlbXB0Q291bnQgPSAwO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cuZXJyb3IoJz09PSBNRVNTQUdFIEVSUk9SID09PScsIGVycm9yLm5hbWUsIGVycm9yLm1lc3NhZ2UsIGVycm9yLnN0YWNrKTtcbiAgICBpZiAoZXJyb3IubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICAvLyBVc2VyIGNsaWNrZWQgU3RvcCBcdTIwMTQgbWVzc2FnZSBhbHJlYWR5IHNob3duIGJ5IGFib3J0Q3VycmVudFJlcXVlc3QoKS5cbiAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkZXJpdmVkID0gX2Rlcml2ZUVycm9yU3RhdGUoZXJyb3IpO1xuICAgIF9zZXRMaXZlTGxtU3RhdGUoZGVyaXZlZC5raW5kLCBkZXJpdmVkLnRleHQsIGRlcml2ZWQuaWNvbiwgZGVyaXZlZC50b29sdGlwKTtcbiAgICBfc2NoZWR1bGVSZXRyeSh0ZXh0LCBkZXJpdmVkLCBlcnJvcik7XG4gICAgdGVybWluYWxTdGF0ZSA9IGRlcml2ZWQ7XG4gIH1cbiAgc2V0TG9hZGluZyhmYWxzZSk7XG4gIGF3YWl0IGZldGNoU3RhdHVzKCk7XG4gIGlmICh0ZXJtaW5hbFN0YXRlKSB7XG4gICAgX3NldExpdmVMbG1TdGF0ZSh0ZXJtaW5hbFN0YXRlLmtpbmQsIHRlcm1pbmFsU3RhdGUudGV4dCwgdGVybWluYWxTdGF0ZS5pY29uLCB0ZXJtaW5hbFN0YXRlLnRvb2x0aXApO1xuICB9XG4gIGlmICh0eXBlb2YgZmV0Y2hBbmREaXNwbGF5TGxtTG9nID09PSAnZnVuY3Rpb24nKSBmZXRjaEFuZERpc3BsYXlMbG1Mb2coKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBNZXNzYWdlIGRpc3BhdGNoIHRhYmxlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gSGFuZGxlcnMgY2hlY2tlZCBpbiBvcmRlcjsgZmlyc3QgbWF0Y2hpbmcgdGVzdCgpIHdpbnMuXG5jb25zdCBfbWVzc2FnZUhhbmRsZXJzID0gW1xuICB7XG4gICAgdGVzdDogdCA9PiB0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ3JldmlldyByZWNvbW1lbmRhdGlvbnMnKSB8fCB0LnRvTG93ZXJDYXNlKCkgPT09ICdyZXZpZXcnLFxuICAgIGhhbmRsZTogYXN5bmMgKCkgPT4gc2hvd1RhYmxlQmFzZWRSZXZpZXcoKSxcbiAgfSxcbiAge1xuICAgIHRlc3Q6ICgpID0+IHdpbmRvdy53YWl0aW5nRm9yRXhwZXJpZW5jZVJlc3BvbnNlLFxuICAgIGhhbmRsZTogYXN5bmMgdCA9PiBoYW5kbGVFeHBlcmllbmNlUmVzcG9uc2UodCksXG4gIH0sXG4gIHtcbiAgICB0ZXN0OiAoKSA9PiB3aW5kb3cud2FpdGluZ0ZvclNraWxsc1Jlc3BvbnNlLFxuICAgIGhhbmRsZTogYXN5bmMgdCA9PiBoYW5kbGVTa2lsbHNSZXNwb25zZSh0KSxcbiAgfSxcbiAge1xuICAgIC8vIFBvc3QtYW5hbHlzaXMgcXVlc3Rpb24gcmVzcG9uc2UgXHUyMDE0IGxvY2FsIGhhbmRsZXIgKyBiYWNrZW5kIHNhdmUuXG4gICAgdGVzdDogKCkgPT4gd2luZG93LndhaXRpbmdGb3JRdWVzdGlvblJlc3BvbnNlLFxuICAgIGhhbmRsZTogYXN5bmMgdCA9PiB7XG4gICAgICBjb25zdCBxdWVzdGlvbkhhbmRsZWQgPSBoYW5kbGVRdWVzdGlvblJlc3BvbnNlKHQpO1xuICAgICAgc2V0TG9hZGluZyh0cnVlLCAnVGhpbmtpbmdcdTIwMjYnKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGxsbUZldGNoKCcvYXBpL21lc3NhZ2UnLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBtZXNzYWdlOiB0IH0pLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IF9wYXJzZUFwaUpzb25SZXNwb25zZShyZXMsICcvYXBpL21lc3NhZ2UnKTtcbiAgICAgICAgaWYgKGRhdGEuZXJyb3IpIHtcbiAgICAgICAgICBsb2cuZXJyb3IoJ0JhY2tlbmQgZXJyb3Igc2F2aW5nIHF1ZXN0aW9uIHJlc3BvbnNlOicsIGRhdGEuZXJyb3IpO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGEucmVzcG9uc2UgJiYgIXF1ZXN0aW9uSGFuZGxlZCkge1xuICAgICAgICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIGRhdGEucmVzcG9uc2UpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGVyci5uYW1lICE9PSAnQWJvcnRFcnJvcicpIGxvZy5lcnJvcignPT09IFFVRVNUSU9OIFJFU1BPTlNFIFNBVkUgRVJST1IgPT09JywgZXJyKTtcbiAgICAgIH1cbiAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgICAgaWYgKCFxdWVzdGlvbkhhbmRsZWQpIGF3YWl0IF9oYW5kbGVMTE1NZXNzYWdlKHQpO1xuICAgIH0sXG4gIH0sXG4gIHtcbiAgICB0ZXN0OiB0ID0+IHQudG9Mb3dlckNhc2UoKSA9PT0gJ3Byb2NlZWQnLFxuICAgIGhhbmRsZTogYXN5bmMgKCkgPT4gd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnNcbiAgICAgID8gc2hvd1RhYmxlQmFzZWRSZXZpZXcoKVxuICAgICAgOiBzZW5kQWN0aW9uKCdyZWNvbW1lbmRfY3VzdG9taXphdGlvbnMnKSxcbiAgfSxcbiAge1xuICAgIHRlc3Q6ICgpID0+IHRydWUsXG4gICAgaGFuZGxlOiBfaGFuZGxlTExNTWVzc2FnZSxcbiAgfSxcbl07XG5cbmFzeW5jIGZ1bmN0aW9uIHNlbmRNZXNzYWdlKCkge1xuICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZXNzYWdlLWlucHV0Jyk7XG4gIGNvbnN0IHRleHQgPSBub3JtYWxpemVUZXh0KGlucHV0LnZhbHVlKTtcbiAgaWYgKCF0ZXh0IHx8IHN0YXRlTWFuYWdlci5pc0xvYWRpbmcoKSkgcmV0dXJuO1xuXG4gIGlmICghZ2V0U2Vzc2lvbklkRnJvbVVSTCgpKSB7XG4gICAgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgJ1x1MjZBMFx1RkUwRiBObyBhY3RpdmUgc2Vzc2lvbi4gQ3JlYXRlIG9yIGxvYWQgYSBzZXNzaW9uIGJlZm9yZSBzZW5kaW5nIG1lc3NhZ2VzLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGFwcGVuZE1lc3NhZ2UoJ3VzZXInLCB0ZXh0KTtcbiAgaW5wdXQudmFsdWUgPSAnJztcblxuICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgX21lc3NhZ2VIYW5kbGVycykge1xuICAgIGlmIChoYW5kbGVyLnRlc3QodGV4dCkpIHtcbiAgICAgIGF3YWl0IGhhbmRsZXIuaGFuZGxlKHRleHQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEludGFrZSBjb25maXJtYXRpb24gY2FyZCAoR0FQLTIzKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmFzeW5jIGZ1bmN0aW9uIF9zaG93SW50YWtlQ29uZmlybUNhcmQoY29udGludWF0aW9uID0gbnVsbCkge1xuICBpZiAodHlwZW9mIGNvbnRpbnVhdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIF9wZW5kaW5nUG9zdEludGFrZUNvbnRpbnVhdGlvbiA9IGNvbnRpbnVhdGlvbjtcbiAgfVxuXG4gIGxldCBleHRyYWN0ZWQgPSB7cm9sZTogJycsIGNvbXBhbnk6ICcnLCBkYXRlX2FwcGxpZWQ6ICcnfTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgbGxtRmV0Y2goJy9hcGkvaW50YWtlLW1ldGFkYXRhJyk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEuY29uZmlybWVkKSB7XG4gICAgICBhd2FpdCBfcHJvY2VlZEFmdGVySW50YWtlKGNvbnRpbnVhdGlvbik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGV4dHJhY3RlZCA9IGRhdGE7XG4gIH0gY2F0Y2ggKF9lKSB7IC8qIGZhbGwgdGhyb3VnaCB3aXRoIGVtcHR5IGRlZmF1bHRzICovIH1cblxuICBjb25zdCB0b2RheSA9IGV4dHJhY3RlZC5kYXRlX2FwcGxpZWQgfHwgbmV3IERhdGUoKS50b0lTT1N0cmluZygpLnNsaWNlKDAsIDEwKTtcbiAgY29uc3QgY2FyZEh0bWwgPSBgXG4gICAgPGRpdiBjbGFzcz1cImludGFrZS1jb25maXJtLWNhcmRcIiBpZD1cImludGFrZS1jb25maXJtLWNhcmRcIiByb2xlPVwiZm9ybVwiIGFyaWEtbGFiZWw9XCJDb25maXJtIGpvYiBkZXRhaWxzXCI+XG4gICAgICA8aDM+XHVEODNEXHVEQ0NCIENvbmZpcm0gam9iIGRldGFpbHM8L2gzPlxuICAgICAgPHA+UmV2aWV3IHRoZSBleHRyYWN0ZWQgZGV0YWlscyBiZWZvcmUgYW5hbHlzaXMgYmVnaW5zLiBFZGl0IGFueSBmaWVsZCBpZiBuZWVkZWQuPC9wPlxuICAgICAgPGRpdiBjbGFzcz1cImludGFrZS1maWVsZC1yb3dcIj5cbiAgICAgICAgPGxhYmVsIGZvcj1cImludGFrZS1yb2xlLWlucHV0XCI+Um9sZSAvIEpvYiBUaXRsZTwvbGFiZWw+XG4gICAgICAgIDxpbnB1dCBpZD1cImludGFrZS1yb2xlLWlucHV0XCIgdHlwZT1cInRleHRcIiB2YWx1ZT1cIiR7ZXNjYXBlSHRtbChleHRyYWN0ZWQucm9sZSB8fCAnJyl9XCJcbiAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBTZW5pb3IgU29mdHdhcmUgRW5naW5lZXJcIiBhdXRvY29tcGxldGU9XCJvZmZcIj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImludGFrZS1maWVsZC1yb3dcIj5cbiAgICAgICAgPGxhYmVsIGZvcj1cImludGFrZS1jb21wYW55LWlucHV0XCI+Q29tcGFueTwvbGFiZWw+XG4gICAgICAgIDxpbnB1dCBpZD1cImludGFrZS1jb21wYW55LWlucHV0XCIgdHlwZT1cInRleHRcIiB2YWx1ZT1cIiR7ZXNjYXBlSHRtbChleHRyYWN0ZWQuY29tcGFueSB8fCAnJyl9XCJcbiAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBBY21lIENvcnBcIiBhdXRvY29tcGxldGU9XCJvZmZcIj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImludGFrZS1maWVsZC1yb3dcIj5cbiAgICAgICAgPGxhYmVsIGZvcj1cImludGFrZS1kYXRlLWlucHV0XCI+RGF0ZSBBcHBsaWVkPC9sYWJlbD5cbiAgICAgICAgPGlucHV0IGlkPVwiaW50YWtlLWRhdGUtaW5wdXRcIiB0eXBlPVwiZGF0ZVwiIHZhbHVlPVwiJHtlc2NhcGVIdG1sKHRvZGF5KX1cIj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImludGFrZS1hY3Rpb25zXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4tc2Vjb25kYXJ5XCIgb25jbGljaz1cIl9za2lwSW50YWtlQ2FyZCgpXCIgdHlwZT1cImJ1dHRvblwiPlNraXA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1wcmltYXJ5XCIgICBvbmNsaWNrPVwiX3N1Ym1pdEludGFrZUNhcmQoKVwiIHR5cGU9XCJidXR0b25cIiBpZD1cImludGFrZS1jb25maXJtLWJ0blwiPkNvbmZpcm0gJmFtcDsgQ29udGludWU8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PmA7XG4gIGFwcGVuZFJhd0h0bWwoY2FyZEh0bWwpO1xuXG4gIGNvbnN0IHJvbGVJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnRha2Utcm9sZS1pbnB1dCcpO1xuICBpZiAocm9sZUlucHV0ICYmICFyb2xlSW5wdXQudmFsdWUudHJpbSgpKSByb2xlSW5wdXQuZm9jdXMoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gX3N1Ym1pdEludGFrZUNhcmQoY29udGludWF0aW9uID0gbnVsbCkge1xuICBjb25zdCByb2xlICAgICAgICAgPSAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ludGFrZS1yb2xlLWlucHV0Jyk/LnZhbHVlICAgIHx8ICcnKS50cmltKCk7XG4gIGNvbnN0IGNvbXBhbnkgICAgICA9IChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW50YWtlLWNvbXBhbnktaW5wdXQnKT8udmFsdWUgfHwgJycpLnRyaW0oKTtcbiAgY29uc3QgZGF0ZV9hcHBsaWVkID0gKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnRha2UtZGF0ZS1pbnB1dCcpPy52YWx1ZSAgICB8fCAnJykudHJpbSgpO1xuXG4gIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnRha2UtY29uZmlybS1idG4nKTtcbiAgaWYgKGJ0bikgYnRuLmRpc2FibGVkID0gdHJ1ZTtcblxuICB0cnkge1xuICAgIGF3YWl0IGxsbUZldGNoKCcvYXBpL2NvbmZpcm0taW50YWtlJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7J0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ30sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7cm9sZSwgY29tcGFueSwgZGF0ZV9hcHBsaWVkfSksXG4gICAgfSk7XG4gIH0gY2F0Y2ggKF9lKSB7IC8qIG5vbi1mYXRhbCAqLyB9XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ludGFrZS1jb25maXJtLWNhcmQnKT8ucmVtb3ZlKCk7XG4gIGF3YWl0IF9wcm9jZWVkQWZ0ZXJJbnRha2UoY29udGludWF0aW9uKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gX3NraXBJbnRha2VDYXJkKGNvbnRpbnVhdGlvbiA9IG51bGwpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ludGFrZS1jb25maXJtLWNhcmQnKT8ucmVtb3ZlKCk7XG4gIGF3YWl0IF9wcm9jZWVkQWZ0ZXJJbnRha2UoY29udGludWF0aW9uKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gX3Byb2NlZWRBZnRlckludGFrZShjb250aW51YXRpb24gPSBudWxsKSB7XG4gIGNvbnN0IGVmZmVjdGl2ZUNvbnRpbnVhdGlvbiA9XG4gICAgKHR5cGVvZiBjb250aW51YXRpb24gPT09ICdmdW5jdGlvbicgJiYgY29udGludWF0aW9uKVxuICAgIHx8IF9wZW5kaW5nUG9zdEludGFrZUNvbnRpbnVhdGlvblxuICAgIHx8IChhc3luYyAoKSA9PiBhbmFseXplSm9iKCkpO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGxsbUZldGNoKCcvYXBpL3ByaW9yLWNsYXJpZmljYXRpb25zJyk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEuZm91bmQgJiYgZGF0YS5tYXRjaGVzICYmIGRhdGEubWF0Y2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBiZXN0ID0gZGF0YS5tYXRjaGVzWzBdO1xuICAgICAgX3BlbmRpbmdQb3N0SW50YWtlQ29udGludWF0aW9uID0gZWZmZWN0aXZlQ29udGludWF0aW9uO1xuICAgICAgYXdhaXQgX29mZmVyUHJpb3JDbGFyaWZpY2F0aW9ucyhiZXN0KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH0gY2F0Y2ggKF9lKSB7IC8qIGZhbGwgdGhyb3VnaCAqLyB9XG5cbiAgX3BlbmRpbmdQb3N0SW50YWtlQ29udGludWF0aW9uID0gbnVsbDtcbiAgYXdhaXQgZWZmZWN0aXZlQ29udGludWF0aW9uKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9vZmZlclByaW9yQ2xhcmlmaWNhdGlvbnMobWF0Y2gpIHtcbiAgY29uc3Qgcm9sZU5hbWUgPSBlc2NhcGVIdG1sKG1hdGNoLnJvbGUgfHwgbWF0Y2gucG9zaXRpb25fbmFtZSB8fCAnYSBzaW1pbGFyIHJvbGUnKTtcbiAgY29uc3QgYmFubmVySHRtbCA9IGBcbiAgICA8ZGl2IGNsYXNzPVwicHJpb3ItY2xhcmlmaWNhdGlvbnMtYmFubmVyXCIgaWQ9XCJwcmlvci1jbGFyLWJhbm5lclwiIHJvbGU9XCJzdGF0dXNcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwY2ItdGV4dFwiPlxuICAgICAgICBcdUQ4M0RcdURDQTEgRm91bmQgcHJpb3IgYW5zd2VycyBmcm9tIDxzcGFuIGNsYXNzPVwicGNiLXJvbGVcIj4ke3JvbGVOYW1lfTwvc3Bhbj4uXG4gICAgICAgIExvYWQgdGhlbSBhcyBkZWZhdWx0cyBmb3IgdGhlIGNsYXJpZmljYXRpb24gcXVlc3Rpb25zP1xuICAgICAgPC9kaXY+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLXNlY29uZGFyeVwiIG9uY2xpY2s9XCJfZGlzbWlzc1ByaW9yQ2xhcmlmaWNhdGlvbnMoKVwiIHR5cGU9XCJidXR0b25cIj5ObyB0aGFua3M8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJidG4tcHJpbWFyeVwiICAgb25jbGljaz1cIl9sb2FkUHJpb3JDbGFyaWZpY2F0aW9ucygpXCIgdHlwZT1cImJ1dHRvblwiIGlkPVwicGNiLWxvYWQtYnRuXCI+TG9hZCBkZWZhdWx0czwvYnV0dG9uPlxuICAgIDwvZGl2PmA7XG4gIGFwcGVuZFJhd0h0bWwoYmFubmVySHRtbCk7XG5cbiAgd2luZG93Ll9wZW5kaW5nUHJpb3JBbnN3ZXJzID0gbWF0Y2guYW5zd2VycyB8fCB7fTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gX2Rpc21pc3NQcmlvckNsYXJpZmljYXRpb25zKCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJpb3ItY2xhci1iYW5uZXInKT8ucmVtb3ZlKCk7XG4gIGRlbGV0ZSB3aW5kb3cuX3BlbmRpbmdQcmlvckFuc3dlcnM7XG4gIGNvbnN0IGNvbnRpbnVhdGlvbiA9IF9wZW5kaW5nUG9zdEludGFrZUNvbnRpbnVhdGlvbiB8fCAoYXN5bmMgKCkgPT4gYW5hbHl6ZUpvYigpKTtcbiAgX3BlbmRpbmdQb3N0SW50YWtlQ29udGludWF0aW9uID0gbnVsbDtcbiAgYXdhaXQgY29udGludWF0aW9uKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9sb2FkUHJpb3JDbGFyaWZpY2F0aW9ucygpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ByaW9yLWNsYXItYmFubmVyJyk/LnJlbW92ZSgpO1xuICBjb25zdCBhbnN3ZXJzID0gd2luZG93Ll9wZW5kaW5nUHJpb3JBbnN3ZXJzIHx8IHt9O1xuICBkZWxldGUgd2luZG93Ll9wZW5kaW5nUHJpb3JBbnN3ZXJzO1xuICBpZiAodHlwZW9mIHF1ZXN0aW9uQW5zd2VycyA9PT0gJ29iamVjdCcgJiYgcXVlc3Rpb25BbnN3ZXJzICE9PSBudWxsKSB7XG4gICAgT2JqZWN0LmFzc2lnbihxdWVzdGlvbkFuc3dlcnMsIGFuc3dlcnMpO1xuICB9IGVsc2Uge1xuICAgIHdpbmRvdy5xdWVzdGlvbkFuc3dlcnMgPSBPYmplY3QuYXNzaWduKHt9LCBhbnN3ZXJzKTtcbiAgfVxuICBjb25zdCBjb250aW51YXRpb24gPSBfcGVuZGluZ1Bvc3RJbnRha2VDb250aW51YXRpb24gfHwgKGFzeW5jICgpID0+IGFuYWx5emVKb2IoKSk7XG4gIF9wZW5kaW5nUG9zdEludGFrZUNvbnRpbnVhdGlvbiA9IG51bGw7XG4gIGF3YWl0IGNvbnRpbnVhdGlvbigpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgRVMgbW9kdWxlIGV4cG9ydHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5leHBvcnQge1xuICBfaGFuZGxlTExNTWVzc2FnZSxcbiAgX21lc3NhZ2VIYW5kbGVycyxcbiAgc2VuZE1lc3NhZ2UsXG4gIF9zaG93SW50YWtlQ29uZmlybUNhcmQsXG4gIF9zdWJtaXRJbnRha2VDYXJkLFxuICBfc2tpcEludGFrZUNhcmQsXG4gIF9wcm9jZWVkQWZ0ZXJJbnRha2UsXG4gIF9vZmZlclByaW9yQ2xhcmlmaWNhdGlvbnMsXG4gIF9kaXNtaXNzUHJpb3JDbGFyaWZpY2F0aW9ucyxcbiAgX2xvYWRQcmlvckNsYXJpZmljYXRpb25zLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL3F1ZXN0aW9ucy1wYW5lbC5qc1xuICogUG9zdC1hbmFseXNpcyBjbGFyaWZ5aW5nIHF1ZXN0aW9ucyBwYW5lbDogcmVuZGVyLCBkcmFmdCwgc3VibWl0LlxuICpcbiAqIERFUEVOREVOQ0lFUyAoYWxsIG9uIGdsb2JhbFRoaXMgYXQgcnVudGltZSk6XG4gKiAgIC0gY2xlYW5Kc29uUmVzcG9uc2UgKHV0aWxzLmpzKVxuICogICAtIG1lcmdlUG9zdEFuYWx5c2lzUXVlc3Rpb25zLCBub3JtYWxpemVQb3N0QW5hbHlzaXNRdWVzdGlvbnMgKGpvYi1hbmFseXNpcy5qcylcbiAqICAgLSBidWlsZEZhbGxiYWNrUG9zdEFuYWx5c2lzUXVlc3Rpb25zIChyZWNvbW1lbmRhdGlvbi1oZWxwZXJzLmpzKVxuICogICAtIGFwcGVuZE1lc3NhZ2UgKG1lc3NhZ2UtcXVldWUuanMpXG4gKiAgIC0gc2VuZEFjdGlvbiAoc2Vzc2lvbi1hY3Rpb25zLmpzKVxuICogICAtIGVzY2FwZUh0bWwgKHV0aWxzLmpzKVxuICogICAtIHN3aXRjaFRhYiAocmV2aWV3LXRhYmxlLWJhc2UuanMsIFRpZXIgNClcbiAqICAgLSBzdGF0ZU1hbmFnZXIgKHN0YXRlLW1hbmFnZXIuanMgXHUyMDE0IGdldFRhYkRhdGEoKSlcbiAqICAgLSBwb3N0QW5hbHlzaXNRdWVzdGlvbnMsIHF1ZXN0aW9uQW5zd2VycyAod2luZG93IGdsb2JhbHMpXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdxdWVzdGlvbnMtcGFuZWwnKTtcblxuaW1wb3J0IHsgc3RhdGVNYW5hZ2VyIH0gZnJvbSAnLi9zdGF0ZS1tYW5hZ2VyLmpzJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTdGF0ZSBwZXJzaXN0ZW5jZSBoZWxwZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuYXN5bmMgZnVuY3Rpb24gcGVyc2lzdFBvc3RBbmFseXNpc1N0YXRlKCkge1xuICB0cnkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zKSkge1xuICAgICAgd2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucyA9IFtdO1xuICAgIH1cbiAgICBpZiAoIXdpbmRvdy5xdWVzdGlvbkFuc3dlcnMgfHwgdHlwZW9mIHdpbmRvdy5xdWVzdGlvbkFuc3dlcnMgIT09ICdvYmplY3QnKSB7XG4gICAgICB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzID0ge307XG4gICAgfVxuXG4gICAgYXdhaXQgZmV0Y2goJy9hcGkvcG9zdC1hbmFseXNpcy1yZXNwb25zZXMnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBxdWVzdGlvbnM6IHdpbmRvdy5wb3N0QW5hbHlzaXNRdWVzdGlvbnMsXG4gICAgICAgIGFuc3dlcnM6IHdpbmRvdy5xdWVzdGlvbkFuc3dlcnNcbiAgICAgIH0pXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nLndhcm4oJ0ZhaWxlZCB0byBwZXJzaXN0IHBvc3QtYW5hbHlzaXMgc3RhdGU6JywgZXJyb3IpO1xuICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gTWFya2Rvd24gcmVuZGVyZXIgZm9yIHF1ZXN0aW9uIHRleHRcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiByZW5kZXJRdWVzdGlvbk1hcmtkb3duKG1hcmtkb3duVGV4dCkge1xuICBjb25zdCBzYWZlID0gZXNjYXBlSHRtbChtYXJrZG93blRleHQgfHwgJycpO1xuICByZXR1cm4gc2FmZVxuICAgIC5yZXBsYWNlKC9cXCpcXCooLis/KVxcKlxcKi9nLCAnPHN0cm9uZz4kMTwvc3Ryb25nPicpXG4gICAgLnJlcGxhY2UoL1xcKiguKz8pXFwqL2csICc8ZW0+JDE8L2VtPicpXG4gICAgLnJlcGxhY2UoL2AoW15gXSspYC9nLCAnPGNvZGU+JDE8L2NvZGU+JylcbiAgICAucmVwbGFjZSgvXFxuL2csICc8YnI+Jyk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQVBJIGZldGNoIGZvciBxdWVzdGlvbnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaFBvc3RBbmFseXNpc1F1ZXN0aW9uc0Zyb21BcGkoYW5hbHlzaXNEYXRhKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvcG9zdC1hbmFseXNpcy1xdWVzdGlvbnMnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBhbmFseXNpczogYW5hbHlzaXNEYXRhIH0pXG4gICAgfSk7XG4gICAgaWYgKCFyZXMub2spIHJldHVybiBbXTtcbiAgICBjb25zdCBwYXlsb2FkID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICByZXR1cm4gbm9ybWFsaXplUG9zdEFuYWx5c2lzUXVlc3Rpb25zKHBheWxvYWQucXVlc3Rpb25zKTtcbiAgfSBjYXRjaCAoYXBpRXJyb3IpIHtcbiAgICBsb2cud2FybignRmFpbGVkIHRvIGZldGNoIHBvc3QtYW5hbHlzaXMgcXVlc3Rpb25zOicsIGFwaUVycm9yKTtcbiAgICByZXR1cm4gW107XG4gIH1cbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBNYWluIG9yY2hlc3RyYXRvcjogY2FsbGVkIGFmdGVyIGFuYWx5emVKb2IgY29tcGxldGVzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuYXN5bmMgZnVuY3Rpb24gYXNrUG9zdEFuYWx5c2lzUXVlc3Rpb25zKGFuYWx5c2lzUmVzdWx0LCBwcmVmZXJyZWRRdWVzdGlvbnMgPSBudWxsKSB7XG4gIHRyeSB7XG4gICAgbGV0IGRhdGE7XG4gICAgaWYgKGFuYWx5c2lzUmVzdWx0ICE9PSBudWxsICYmIHR5cGVvZiBhbmFseXNpc1Jlc3VsdCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGRhdGEgPSBhbmFseXNpc1Jlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY2xlYW5SZXN1bHQgPSBjbGVhbkpzb25SZXNwb25zZShhbmFseXNpc1Jlc3VsdCk7XG4gICAgICBkYXRhID0gdHlwZW9mIGNsZWFuUmVzdWx0ID09PSAnc3RyaW5nJyA/IEpTT04ucGFyc2UoY2xlYW5SZXN1bHQpIDogY2xlYW5SZXN1bHQ7XG4gICAgfVxuXG4gICAgd2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucyA9IG1lcmdlUG9zdEFuYWx5c2lzUXVlc3Rpb25zKFtdLCBwcmVmZXJyZWRRdWVzdGlvbnMpO1xuXG4gICAgaWYgKHdpbmRvdy5wb3N0QW5hbHlzaXNRdWVzdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zID0gYXdhaXQgZmV0Y2hQb3N0QW5hbHlzaXNRdWVzdGlvbnNGcm9tQXBpKGRhdGEpO1xuICAgIH1cblxuICAgIGlmICh3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgd2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucyA9IGJ1aWxkRmFsbGJhY2tQb3N0QW5hbHlzaXNRdWVzdGlvbnMoZGF0YSk7XG4gICAgfVxuXG4gICAgaWYgKCF3aW5kb3cucXVlc3Rpb25BbnN3ZXJzIHx8IHR5cGVvZiB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzICE9PSAnb2JqZWN0Jykge1xuICAgICAgd2luZG93LnF1ZXN0aW9uQW5zd2VycyA9IHt9O1xuICAgIH1cbiAgICBhd2FpdCBwZXJzaXN0UG9zdEFuYWx5c2lzU3RhdGUoKTtcblxuICAgIGlmICh3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHJlbmRlclF1ZXN0aW9uc1BhbmVsKCk7XG4gICAgICBzd2l0Y2hUYWIoJ3F1ZXN0aW9ucycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCAnQW5hbHlzaXMgY29tcGxldGUhIE5vIGNsYXJpZnlpbmcgcXVlc3Rpb25zIG5lZWRlZC4gR2VuZXJhdGluZyBjdXN0b21pemF0aW9uIHJlY29tbWVuZGF0aW9uc1x1MjAyNicpO1xuICAgICAgYXdhaXQgc2VuZEFjdGlvbigncmVjb21tZW5kX2N1c3RvbWl6YXRpb25zJyk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nLmVycm9yKCdFcnJvciBwYXJzaW5nIGFuYWx5c2lzIGZvciBxdWVzdGlvbnM6JywgZSk7XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ0FuYWx5c2lzIGNvbXBsZXRlISBDbGljayBcIlJlY29tbWVuZCBDdXN0b21pemF0aW9uc1wiIHdoZW4gcmVhZHkuJyk7XG4gIH1cbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBUYWIgcG9wdWxhdGlvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIHBvcHVsYXRlUXVlc3Rpb25zVGFiKCkge1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgaWYgKCFjb250ZW50KSByZXR1cm47XG5cbiAgaWYgKCFzdGF0ZU1hbmFnZXIuZ2V0VGFiRGF0YSgnYW5hbHlzaXMnKSkge1xuICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJlbXB0eS1zdGF0ZVwiPjxkaXYgY2xhc3M9XCJpY29uXCI+XHVEODNEXHVEQ0FDPC9kaXY+PGgzPk5vIFF1ZXN0aW9ucyBZZXQ8L2gzPjxwPlJ1biBcIkFuYWx5c2UgSm9iXCIgZmlyc3QgdG8gZ2VuZXJhdGUgY2xhcmlmeWluZyBxdWVzdGlvbnMuPC9wPjwvZGl2Pic7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgaGFzUXVlc3Rpb25zID0gQXJyYXkuaXNBcnJheSh3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zKSAmJiB3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zLmxlbmd0aCA+IDA7XG4gIGlmICghaGFzUXVlc3Rpb25zKSB7XG4gICAgY29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImVtcHR5LXN0YXRlXCI+PGRpdiBjbGFzcz1cImljb25cIj5cdTI3MDU8L2Rpdj48aDM+UXVlc3Rpb25zIENvbXBsZXRlPC9oMz48cD5ObyBwZW5kaW5nIGNsYXJpZnlpbmcgcXVlc3Rpb25zIFx1MjAxNCBjdXN0b21pemF0aW9uIHJlY29tbWVuZGF0aW9ucyB3aWxsIGJlIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LjwvcD48L2Rpdj4nO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIF9jdXJyZW50R3JvdXAgPSAwO1xuICBjb250ZW50LmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwiYW5hbHlzaXMtcGFnZVwiPjxkaXYgY2xhc3M9XCJhbmFseXNpcy1zZWN0aW9uXCI+PGgyPlx1RDgzRFx1RENBQyBDbGFyaWZ5aW5nIFF1ZXN0aW9uczwvaDI+PHAgc3R5bGU9XCJjb2xvcjojNjQ3NDhiOyBtYXJnaW46IDA7XCI+UGxlYXNlIGFuc3dlciBlYWNoIHF1ZXN0aW9uIHRvIGltcHJvdmUgcmVjb21tZW5kYXRpb24gcXVhbGl0eS48L3A+PC9kaXY+PC9kaXY+JztcbiAgcmVuZGVyUXVlc3Rpb25zUGFuZWwoKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBQYW5lbCByZW5kZXJlclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIHJlbmRlclF1ZXN0aW9uc1BhbmVsKCkge1xuICBjb25zdCBxcyA9IHdpbmRvdy5wb3N0QW5hbHlzaXNRdWVzdGlvbnMgfHwgW107XG4gIGlmIChxcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgaWYgKCFjb250ZW50KSByZXR1cm47XG5cbiAgY29uc3QgZXhpc3RpbmcgPSBjb250ZW50LnF1ZXJ5U2VsZWN0b3IoJy5xdWVzdGlvbnMtcGFuZWwnKTtcbiAgaWYgKGV4aXN0aW5nKSBleGlzdGluZy5yZW1vdmUoKTtcblxuICBjb25zdCB0b3RhbCAgICAgID0gcXMubGVuZ3RoO1xuICBjb25zdCBudW1Hcm91cHMgID0gTWF0aC5jZWlsKHRvdGFsIC8gR1JPVVBfU0laRSk7XG4gIC8vIENsYW1wIGdyb3VwIGluZGV4IGluIGNhc2UgcXMgc2hyYW5rIHNpbmNlIGxhc3QgcmVuZGVyLlxuICBfY3VycmVudEdyb3VwICAgID0gTWF0aC5taW4oX2N1cnJlbnRHcm91cCwgbnVtR3JvdXBzIC0gMSk7XG4gIGNvbnN0IGdyb3VwU3RhcnQgPSBfY3VycmVudEdyb3VwICogR1JPVVBfU0laRTtcbiAgY29uc3QgZ3JvdXBFbmQgICA9IE1hdGgubWluKGdyb3VwU3RhcnQgKyBHUk9VUF9TSVpFLCB0b3RhbCk7XG4gIGNvbnN0IGdyb3VwUXMgICAgPSBxcy5zbGljZShncm91cFN0YXJ0LCBncm91cEVuZCk7XG4gIGNvbnN0IGlzTGFzdEdyb3VwID0gX2N1cnJlbnRHcm91cCA9PT0gbnVtR3JvdXBzIC0gMTtcblxuICBjb25zdCBleGlzdGluZ0Fuc3dlcnMgPSAod2luZG93LnF1ZXN0aW9uQW5zd2VycyAmJiB0eXBlb2Ygd2luZG93LnF1ZXN0aW9uQW5zd2VycyA9PT0gJ29iamVjdCcpXG4gICAgPyB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzIDoge307XG5cbiAgY29uc3QgZ3JvdXBMYWJlbCA9IG51bUdyb3VwcyA+IDFcbiAgICA/IGBHcm91cCAke19jdXJyZW50R3JvdXAgKyAxfSBvZiAke251bUdyb3Vwc31gXG4gICAgOiBgJHt0b3RhbH0gcXVlc3Rpb24ke3RvdGFsID4gMSA/ICdzJyA6ICcnfWA7XG5cbiAgY29uc3QgZ3JvdXBOYXZIdG1sID0gbnVtR3JvdXBzID4gMSA/IHJlbmRlclFHcm91cE5hdihudW1Hcm91cHMsIHFzLCBleGlzdGluZ0Fuc3dlcnMpIDogJyc7XG5cbiAgbGV0IHBhbmVsSHRtbCA9IGA8ZGl2IGNsYXNzPVwicXVlc3Rpb25zLXBhbmVsXCIgaWQ9XCJxdWVzdGlvbnMtcGFuZWxcIj5cbiAgICA8aDI+XHVEODNEXHVEQ0FDIEEgZmV3IHF1aWNrIHF1ZXN0aW9uczwvaDI+XG4gICAgPHAgY2xhc3M9XCJxLXByb2dyZXNzXCIgaWQ9XCJxLXByb2dyZXNzXCI+JHtncm91cExhYmVsfSBcdTIwMTQgYW5zd2VyIGVhY2ggdG8gY29udGludWUuPC9wPlxuICAgICR7Z3JvdXBOYXZIdG1sfWA7XG5cbiAgZ3JvdXBRcy5mb3JFYWNoKChxLCBsb2NhbElkeCkgPT4ge1xuICAgIGNvbnN0IGlkeCA9IGdyb3VwU3RhcnQgKyBsb2NhbElkeDtcbiAgICBjb25zdCBzYXZlZEFuc3dlciA9IChleGlzdGluZ0Fuc3dlcnNbcS50eXBlXSB8fCAnJykudG9TdHJpbmcoKTtcbiAgICBjb25zdCBpc0Fuc3dlcmVkICA9IHNhdmVkQW5zd2VyLnRyaW0oKS5sZW5ndGggPiAwO1xuICAgIGNvbnN0IHJlbmRlcmVkUXVlc3Rpb24gPSByZW5kZXJRdWVzdGlvbk1hcmtkb3duKHEucXVlc3Rpb24pO1xuICAgIGNvbnN0IGNoaXBzID0gKHEuY2hvaWNlcyB8fCBbXSkubWFwKChjLCBjaSkgPT5cbiAgICAgIGA8YnV0dG9uIGNsYXNzPVwicS1jaGlwXCIgZGF0YS1xaWR4PVwiJHtpZHh9XCIgZGF0YS1jaWR4PVwiJHtjaX1cIiBvbmNsaWNrPVwic2VsZWN0UUNoaXAodGhpcywgJHtpZHh9KVwiPiR7ZXNjYXBlSHRtbChjKX08L2J1dHRvbj5gXG4gICAgKS5qb2luKCcnKTtcbiAgICBwYW5lbEh0bWwgKz0gYFxuICAgICAgPGRpdiBjbGFzcz1cInF1ZXN0aW9uLWl0ZW0ke2lzQW5zd2VyZWQgPyAnIGFuc3dlcmVkJyA6ICcnfVwiIGlkPVwicS1pdGVtLSR7aWR4fVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicS1oZWFkZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicS10ZXh0XCI+JHtpZHggKyAxfS4gJHtyZW5kZXJlZFF1ZXN0aW9ufTwvZGl2PlxuICAgICAgICAgICR7aXNBbnN3ZXJlZCA/ICc8c3BhbiBjbGFzcz1cInEtYW5zd2VyZWQtYmFkZ2VcIj5cdTI3MTMgQW5zd2VyZWQ8L3NwYW4+JyA6ICcnfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgJHtjaGlwcyA/IGA8ZGl2IGNsYXNzPVwicS1jaGlwc1wiPiR7Y2hpcHN9PC9kaXY+YCA6ICcnfVxuICAgICAgICA8ZGl2IGNsYXNzPVwicS1hbnN3ZXItcm93XCI+XG4gICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwicS1pbnB1dFwiIGlkPVwicS1pbnB1dC0ke2lkeH1cIiBwbGFjZWhvbGRlcj1cIllvdXIgYW5zd2VyXHUyMDI2XCIgb25pbnB1dD1cIm9uUUlucHV0Q2hhbmdlKCR7aWR4fSlcIj4ke2VzY2FwZUh0bWwoc2F2ZWRBbnN3ZXIpfTwvdGV4dGFyZWE+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInEtZHJhZnQtYnRuXCIgaWQ9XCJxLWRyYWZ0LWJ0bi0ke2lkeH1cIiBvbmNsaWNrPVwiZHJhZnRRdWVzdGlvblJlc3BvbnNlKCR7aWR4fSlcIiB0aXRsZT1cIkdlbmVyYXRlIGEgZHJhZnQgYW5zd2VyIHVzaW5nIEFJXCI+XHUyNzI4IERyYWZ0PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+YDtcbiAgfSk7XG5cbiAgaWYgKGlzTGFzdEdyb3VwKSB7XG4gICAgcGFuZWxIdG1sICs9IGA8YnV0dG9uIGNsYXNzPVwicXVlc3Rpb25zLXN1Ym1pdC1idG5cIiBpZD1cInEtc3VibWl0LWJ0blwiIG9uY2xpY2s9XCJzdWJtaXRBbGxBbnN3ZXJzKClcIiBkaXNhYmxlZD5TdWJtaXQgQW5zd2VyczwvYnV0dG9uPmA7XG4gIH0gZWxzZSB7XG4gICAgcGFuZWxIdG1sICs9IGA8YnV0dG9uIGNsYXNzPVwicXVlc3Rpb25zLXN1Ym1pdC1idG5cIiBpZD1cInEtc3VibWl0LWJ0blwiIG9uY2xpY2s9XCJhZHZhbmNlUUdyb3VwKClcIiBkaXNhYmxlZD5Db250aW51ZSBcdTIxOTIgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC44ZW07Zm9udC13ZWlnaHQ6NDAwO1wiPigke2dyb3VwRW5kfSBvZiAke3RvdGFsfSBhbnN3ZXJlZCk8L3NwYW4+PC9idXR0b24+YDtcbiAgfVxuICBwYW5lbEh0bWwgKz0gJzwvZGl2Pic7XG5cbiAgY29udGVudC5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsIHBhbmVsSHRtbCk7XG5cbiAgLy8gUmVzdG9yZSBjaGlwIHNlbGVjdGlvbiBmb3IgYW55IHF1ZXN0aW9uIHdob3NlIHNhdmVkIGFuc3dlciBtYXRjaGVzIGEgY2hpcCBsYWJlbC5cbiAgZ3JvdXBRcy5mb3JFYWNoKChxLCBsb2NhbElkeCkgPT4ge1xuICAgIGNvbnN0IGlkeCA9IGdyb3VwU3RhcnQgKyBsb2NhbElkeDtcbiAgICBjb25zdCBzYXZlZCA9IChleGlzdGluZ0Fuc3dlcnNbcS50eXBlXSB8fCAnJykudG9TdHJpbmcoKS50cmltKCk7XG4gICAgaWYgKCFzYXZlZCkgcmV0dXJuO1xuICAgIGNvbnN0IGl0ZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcS1pdGVtLSR7aWR4fWApO1xuICAgIGlmICghaXRlbSkgcmV0dXJuO1xuICAgIGl0ZW0ucXVlcnlTZWxlY3RvckFsbCgnLnEtY2hpcCcpLmZvckVhY2goY2hpcCA9PiB7XG4gICAgICBpZiAoKGNoaXAudGV4dENvbnRlbnQgfHwgJycpLnRyaW0oKSA9PT0gc2F2ZWQpIGNoaXAuY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgdXBkYXRlUVByb2dyZXNzKCk7XG59XG5cbi8vIEdyb3VwLW5hdmlnYXRpb24gc3RyaXAgKEdBUC0xNiBQYXJ0IEQpOiBsZXRzIHRoZSB1c2VyIGp1bXAgYmFjayB0byBhblxuLy8gZWFybGllciBncm91cCB0byByZXZpZXcvZWRpdCBpdCB3aXRob3V0IGxvc2luZyBmb3J3YXJkIHByb2dyZXNzLiBUaGVzZVxuLy8gYXJlIHBsYWluIGJ1dHRvbnMsIG5vdCBhbiBBUklBIHRhYmxpc3QgXHUyMDE0IG5vIGFycm93LWtleSByb3ZpbmcgaXMgaW1wbGVtZW50ZWQsXG4vLyBzbyBhIHRhYi90YWJsaXN0IHJvbGUgd291bGQgc2V0IGEgZmFsc2UgZXhwZWN0YXRpb24gZm9yIHNjcmVlbiByZWFkZXJzLlxuZnVuY3Rpb24gX2lzR3JvdXBGdWxseUFuc3dlcmVkKGdyb3VwSWR4LCBxcywgZXhpc3RpbmdBbnN3ZXJzKSB7XG4gIGNvbnN0IGdyb3VwU3RhcnQgPSBncm91cElkeCAqIEdST1VQX1NJWkU7XG4gIGNvbnN0IGdyb3VwRW5kICAgID0gTWF0aC5taW4oZ3JvdXBTdGFydCArIEdST1VQX1NJWkUsIHFzLmxlbmd0aCk7XG4gIGZvciAobGV0IGlkeCA9IGdyb3VwU3RhcnQ7IGlkeCA8IGdyb3VwRW5kOyBpZHgrKykge1xuICAgIGNvbnN0IHEgPSBxc1tpZHhdO1xuICAgIGlmICghcSkgY29udGludWU7XG4gICAgaWYgKCEoZXhpc3RpbmdBbnN3ZXJzW3EudHlwZV0gfHwgJycpLnRvU3RyaW5nKCkudHJpbSgpKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclFHcm91cE5hdihudW1Hcm91cHMsIHFzLCBleGlzdGluZ0Fuc3dlcnMpIHtcbiAgY29uc3QgZG90cyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUdyb3VwczsgaSsrKSB7XG4gICAgY29uc3QgaXNBY3RpdmUgPSBpID09PSBfY3VycmVudEdyb3VwO1xuICAgIGNvbnN0IGlzRG9uZSAgID0gIWlzQWN0aXZlICYmIF9pc0dyb3VwRnVsbHlBbnN3ZXJlZChpLCBxcywgZXhpc3RpbmdBbnN3ZXJzKTtcbiAgICBjb25zdCBjbHMgPSBbJ3EtZ3JvdXAtZG90J107XG4gICAgaWYgKGlzQWN0aXZlKSBjbHMucHVzaCgnYWN0aXZlJyk7XG4gICAgaWYgKGlzRG9uZSkgY2xzLnB1c2goJ2RvbmUnKTtcbiAgICBjb25zdCBzdGF0ZUxhYmVsID0gaXNBY3RpdmUgPyAnY3VycmVudCcgOiBpc0RvbmUgPyAnY29tcGxldGVkJyA6ICdub3QgeWV0IGFuc3dlcmVkJztcbiAgICBjb25zdCBhcmlhTGFiZWwgPSBgUmV2aWV3IGFuc3dlcnMgZm9yIEdyb3VwICR7aSArIDF9LCAke3N0YXRlTGFiZWx9IFx1MjAxNCBubyByZXN1Ym1pc3Npb25gO1xuICAgIGRvdHMucHVzaChcbiAgICAgIGA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIiR7Y2xzLmpvaW4oJyAnKX1cIiBkYXRhLWdyb3VwPVwiJHtpfVwiYCArXG4gICAgICBgJHtpc0FjdGl2ZSA/ICcgYXJpYS1jdXJyZW50PVwic3RlcFwiJyA6ICcnfSBhcmlhLWxhYmVsPVwiJHtlc2NhcGVIdG1sKGFyaWFMYWJlbCl9XCJgICtcbiAgICAgIGAgb25jbGljaz1cImp1bXBUb1FHcm91cCgke2l9KVwiPiR7aXNEb25lID8gJ1x1MjcxMycgOiBpICsgMX08L2J1dHRvbj5gXG4gICAgKTtcbiAgfVxuICByZXR1cm4gYDxkaXYgY2xhc3M9XCJxLWdyb3VwLW5hdlwiIGFyaWEtbGFiZWw9XCJRdWVzdGlvbiBncm91cHNcIj4ke2RvdHMuam9pbignJyl9PC9kaXY+YDtcbn1cblxuLy8gRmx1c2ggdGhlIGN1cnJlbnQgZ3JvdXAncyB0ZXh0YXJlYSB2YWx1ZXMgaW50byB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzLlxuLy8gU2hhcmVkIGJ5IGFkdmFuY2VRR3JvdXAoKSAoZm9yd2FyZCBwcm9ncmVzc2lvbikgYW5kIGp1bXBUb1FHcm91cCgpXG4vLyAoYmFja3dhcmQgbmF2aWdhdGlvbikgc28gYm90aCBwZXJzaXN0IGluLXByb2dyZXNzIGVkaXRzIHRoZSBzYW1lIHdheS5cbmZ1bmN0aW9uIF9mbHVzaEN1cnJlbnRHcm91cEFuc3dlcnMoKSB7XG4gIGNvbnN0IHFzID0gd2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucyB8fCBbXTtcbiAgY29uc3QgZ3JvdXBTdGFydCA9IF9jdXJyZW50R3JvdXAgKiBHUk9VUF9TSVpFO1xuICBjb25zdCBncm91cEVuZCAgID0gTWF0aC5taW4oZ3JvdXBTdGFydCArIEdST1VQX1NJWkUsIHFzLmxlbmd0aCk7XG4gIGZvciAobGV0IGlkeCA9IGdyb3VwU3RhcnQ7IGlkeCA8IGdyb3VwRW5kOyBpZHgrKykge1xuICAgIGNvbnN0IHEgID0gcXNbaWR4XTtcbiAgICBjb25zdCB0YSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBxLWlucHV0LSR7aWR4fWApO1xuICAgIGlmIChxICYmIHRhICYmIHRhLnZhbHVlLnRyaW0oKSkge1xuICAgICAgaWYgKCF3aW5kb3cucXVlc3Rpb25BbnN3ZXJzKSB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzID0ge307XG4gICAgICB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzW3EudHlwZV0gPSB0YS52YWx1ZS50cmltKCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFkdmFuY2VRR3JvdXAoKSB7XG4gIF9mbHVzaEN1cnJlbnRHcm91cEFuc3dlcnMoKTtcbiAgcGVyc2lzdFBvc3RBbmFseXNpc1N0YXRlKCk7XG4gIF9jdXJyZW50R3JvdXArKztcbiAgcmVuZGVyUXVlc3Rpb25zUGFuZWwoKTtcbn1cblxuLy8gSnVtcCBiYWNrIChvciBmb3J3YXJkKSB0byBhIHNwZWNpZmljIGdyb3VwIHdpdGhvdXQgcmVxdWlyaW5nIHRoZSBjdXJyZW50XG4vLyBncm91cCB0byBiZSBjb21wbGV0ZS4gRmx1c2hlcyBpbi1wcm9ncmVzcyBhbnN3ZXJzIGZpcnN0IHNvIG5vdGhpbmcgdHlwZWRcbi8vIHNvIGZhciBpcyBsb3N0LCBidXQgXHUyMDE0IHVubGlrZSBhZHZhbmNlUUdyb3VwKCkgXHUyMDE0IGRvZXMgbm90IGdhdGUgb24gY29tcGxldGVuZXNzXG4vLyBhbmQgZG9lcyBub3QgcmVzdWJtaXQgYW55dGhpbmcuXG5mdW5jdGlvbiBqdW1wVG9RR3JvdXAodGFyZ2V0R3JvdXApIHtcbiAgX2ZsdXNoQ3VycmVudEdyb3VwQW5zd2VycygpO1xuICBwZXJzaXN0UG9zdEFuYWx5c2lzU3RhdGUoKTtcbiAgX2N1cnJlbnRHcm91cCA9IHRhcmdldEdyb3VwO1xuICByZW5kZXJRdWVzdGlvbnNQYW5lbCgpO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEludGVyYWN0aW9uIGhhbmRsZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuYXN5bmMgZnVuY3Rpb24gZHJhZnRRdWVzdGlvblJlc3BvbnNlKGlkeCkge1xuICBjb25zdCBxcyA9IHdpbmRvdy5wb3N0QW5hbHlzaXNRdWVzdGlvbnMgfHwgW107XG4gIGNvbnN0IHEgID0gcXNbaWR4XTtcbiAgaWYgKCFxKSByZXR1cm47XG5cbiAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHEtZHJhZnQtYnRuLSR7aWR4fWApO1xuICBjb25zdCB0YSAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcS1pbnB1dC0ke2lkeH1gKTtcbiAgaWYgKCFidG4gfHwgIXRhKSByZXR1cm47XG5cbiAgYnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgYnRuLmlubmVySFRNTCA9ICc8c3BhbiBjbGFzcz1cInNwaW5uZXJcIiBzdHlsZT1cImRpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjExcHg7aGVpZ2h0OjExcHg7Ym9yZGVyOjJweCBzb2xpZCBjdXJyZW50Q29sb3I7Ym9yZGVyLXRvcC1jb2xvcjp0cmFuc3BhcmVudDtib3JkZXItcmFkaXVzOjUwJTthbmltYXRpb246c3BpbiAwLjdzIGxpbmVhciBpbmZpbml0ZTt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7XCI+PC9zcGFuPic7XG5cbiAgdHJ5IHtcbiAgICBsZXQgYW5hbHlzaXNQYXlsb2FkID0gbnVsbDtcbiAgICBjb25zdCBhbmFseXNpc1N0YXRlID0gc3RhdGVNYW5hZ2VyLmdldFRhYkRhdGEoJ2FuYWx5c2lzJyk7XG4gICAgaWYgKGFuYWx5c2lzU3RhdGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNsZWFuZWQgPSBjbGVhbkpzb25SZXNwb25zZShhbmFseXNpc1N0YXRlKTtcbiAgICAgICAgYW5hbHlzaXNQYXlsb2FkID0gdHlwZW9mIGNsZWFuZWQgPT09ICdzdHJpbmcnID8gSlNPTi5wYXJzZShjbGVhbmVkKSA6IGNsZWFuZWQ7XG4gICAgICB9IGNhdGNoIChfKSB7IC8qIHVzZSBudWxsICovIH1cbiAgICB9XG5cbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9wb3N0LWFuYWx5c2lzLWRyYWZ0LXJlc3BvbnNlJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcXVlc3Rpb246IHEucXVlc3Rpb24sIHF1ZXN0aW9uX3R5cGU6IHEudHlwZSwgYW5hbHlzaXM6IGFuYWx5c2lzUGF5bG9hZCB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vayAmJiBkYXRhLnRleHQpIHtcbiAgICAgIHRhLnZhbHVlID0gZGF0YS50ZXh0O1xuICAgICAgdXBkYXRlUVByb2dyZXNzKCk7XG4gICAgICBjb25zdCBpdGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHEtaXRlbS0ke2lkeH1gKTtcbiAgICAgIGlmIChpdGVtKSBpdGVtLnF1ZXJ5U2VsZWN0b3JBbGwoJy5xLWNoaXAnKS5mb3JFYWNoKGMgPT4gYy5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpKTtcbiAgICAgIHNob3dEcmFmdEVycm9yKGlkeCwgbnVsbCk7XG4gICAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCBgXHUyNzI4IERyYWZ0IGFuc3dlciBmb3IgUSR7aWR4ICsgMX06XFxuXFxuJHtkYXRhLnRleHR9XFxuXFxuUmV2aWV3IGFuZCBlZGl0IGluIHRoZSBmaWVsZCBiZWxvdyBiZWZvcmUgc3VibWl0dGluZy5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLndhcm4oJ0RyYWZ0IGdlbmVyYXRpb24gZmFpbGVkOicsIGRhdGEuZXJyb3IpO1xuICAgICAgc2hvd0RyYWZ0RXJyb3IoaWR4LCBkYXRhLmVycm9yIHx8ICdEcmFmdCBmYWlsZWQgXHUyMDE0IHBsZWFzZSB0cnkgYWdhaW4uJyk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cuZXJyb3IoJ0RyYWZ0IGZldGNoIGVycm9yOicsIGVycik7XG4gICAgc2hvd0RyYWZ0RXJyb3IoaWR4LCAnTmV0d29yayBlcnJvciBcdTIwMTQgcGxlYXNlIHRyeSBhZ2Fpbi4nKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBidG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICBidG4uaW5uZXJIVE1MID0gJ1x1MjcyOCBEcmFmdCc7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2VsZWN0UUNoaXAoYnRuLCBxSWR4KSB7XG4gIGNvbnN0IHBhbmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHEtaXRlbS0ke3FJZHh9YCk7XG4gIGlmIChwYW5lbCkge1xuICAgIHBhbmVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5xLWNoaXAnKS5mb3JFYWNoKGMgPT4gYy5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpKTtcbiAgfVxuICBidG4uY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTtcbiAgY29uc3QgdGV4dGFyZWEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcS1pbnB1dC0ke3FJZHh9YCk7XG4gIGlmICh0ZXh0YXJlYSkge1xuICAgIHRleHRhcmVhLnZhbHVlID0gYnRuLnRleHRDb250ZW50O1xuICAgIHVwZGF0ZVFQcm9ncmVzcygpO1xuICB9XG4gIC8vIFBlcnNpc3QgdGhlIGNoaXAgYW5zd2VyIGltbWVkaWF0ZWx5IHNvIGl0IHN1cnZpdmVzIHRhYiBuYXZpZ2F0aW9uLlxuICBjb25zdCBxID0gKHdpbmRvdy5wb3N0QW5hbHlzaXNRdWVzdGlvbnMgfHwgW10pW3FJZHhdO1xuICBpZiAocSkge1xuICAgIGlmICghd2luZG93LnF1ZXN0aW9uQW5zd2VycyB8fCB0eXBlb2Ygd2luZG93LnF1ZXN0aW9uQW5zd2VycyAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHdpbmRvdy5xdWVzdGlvbkFuc3dlcnMgPSB7fTtcbiAgICB9XG4gICAgd2luZG93LnF1ZXN0aW9uQW5zd2Vyc1txLnR5cGVdID0gYnRuLnRleHRDb250ZW50O1xuICAgIHBlcnNpc3RQb3N0QW5hbHlzaXNTdGF0ZSgpO1xuICB9XG59XG5cbi8vIEN1cnJlbnQgcXVlc3Rpb24tZ3JvdXAgaW5kZXggKFx1MjI2NDMtcGVyLWdyb3VwIGZsb3csIEdBUC0yMDEpLlxubGV0IF9jdXJyZW50R3JvdXAgPSAwO1xuY29uc3QgR1JPVVBfU0laRSA9IDM7XG5cbi8vIERlYm91bmNlIHRpbWVyIGZvciBwZXJzaXN0aW5nIGFuc3dlcnMgd2hpbGUgdGhlIHVzZXIgdHlwZXMuXG5sZXQgX3BlcnNpc3REZWJvdW5jZVRpbWVyID0gbnVsbDtcblxuZnVuY3Rpb24gb25RSW5wdXRDaGFuZ2UoaWR4KSB7XG4gIHVwZGF0ZVFQcm9ncmVzcygpO1xuICBjb25zdCBxID0gKHdpbmRvdy5wb3N0QW5hbHlzaXNRdWVzdGlvbnMgfHwgW10pW2lkeF07XG4gIGlmICghcSkgcmV0dXJuO1xuICBjb25zdCB0YSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBxLWlucHV0LSR7aWR4fWApO1xuICBpZiAoIXRhKSByZXR1cm47XG4gIGlmICghd2luZG93LnF1ZXN0aW9uQW5zd2VycyB8fCB0eXBlb2Ygd2luZG93LnF1ZXN0aW9uQW5zd2VycyAhPT0gJ29iamVjdCcpIHtcbiAgICB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzID0ge307XG4gIH1cbiAgd2luZG93LnF1ZXN0aW9uQW5zd2Vyc1txLnR5cGVdID0gdGEudmFsdWU7XG5cbiAgLy8gRGVib3VuY2UtcGVyc2lzdCBzbyBhbnN3ZXJzIHN1cnZpdmUgdGFiIG5hdmlnYXRpb24gYW5kIHN0YXR1cyBwb2xsaW5nLlxuICBjbGVhclRpbWVvdXQoX3BlcnNpc3REZWJvdW5jZVRpbWVyKTtcbiAgX3BlcnNpc3REZWJvdW5jZVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiBwZXJzaXN0UG9zdEFuYWx5c2lzU3RhdGUoKSwgNTAwKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlUVByb2dyZXNzKCkge1xuICBjb25zdCBxcyA9IHdpbmRvdy5wb3N0QW5hbHlzaXNRdWVzdGlvbnMgfHwgW107XG4gIGNvbnN0IHN0b3JlZEFuc3dlcnMgPSB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzIHx8IHt9O1xuICBjb25zdCBncm91cFN0YXJ0ID0gX2N1cnJlbnRHcm91cCAqIEdST1VQX1NJWkU7XG4gIGNvbnN0IGdyb3VwRW5kICAgPSBNYXRoLm1pbihncm91cFN0YXJ0ICsgR1JPVVBfU0laRSwgcXMubGVuZ3RoKTtcblxuICAvLyBDb3VudCBhbnN3ZXJzOiB1c2UgRE9NIHZhbHVlcyBmb3IgdGhlIGN1cnJlbnQgZ3JvdXAgKGxpdmUpLCBzdG9yZWQgZm9yIG90aGVycy5cbiAgY29uc3QgYW5zd2VyZWQgPSBxcy5maWx0ZXIoKHEsIGlkeCkgPT4ge1xuICAgIGlmIChpZHggPj0gZ3JvdXBTdGFydCAmJiBpZHggPCBncm91cEVuZCkge1xuICAgICAgY29uc3QgdGEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcS1pbnB1dC0ke2lkeH1gKTtcbiAgICAgIHJldHVybiB0YSA/IHRhLnZhbHVlLnRyaW0oKS5sZW5ndGggPiAwIDogISEoc3RvcmVkQW5zd2Vyc1txLnR5cGVdIHx8ICcnKS50cmltKCk7XG4gICAgfVxuICAgIHJldHVybiAhIShzdG9yZWRBbnN3ZXJzW3EudHlwZV0gfHwgJycpLnRyaW0oKTtcbiAgfSkubGVuZ3RoO1xuXG4gIGNvbnN0IGdyb3VwQW5zd2VyZWQgPSBxcy5zbGljZShncm91cFN0YXJ0LCBncm91cEVuZCkuZmlsdGVyKChxLCBsaSkgPT4ge1xuICAgIGNvbnN0IHRhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHEtaW5wdXQtJHtncm91cFN0YXJ0ICsgbGl9YCk7XG4gICAgcmV0dXJuIHRhID8gdGEudmFsdWUudHJpbSgpLmxlbmd0aCA+IDAgOiAhIShzdG9yZWRBbnN3ZXJzW3EudHlwZV0gfHwgJycpLnRyaW0oKTtcbiAgfSkubGVuZ3RoO1xuXG4gIGNvbnN0IG51bUdyb3VwcyAgPSBNYXRoLmNlaWwocXMubGVuZ3RoIC8gR1JPVVBfU0laRSk7XG4gIGNvbnN0IGdyb3VwTGFiZWwgPSBudW1Hcm91cHMgPiAxXG4gICAgPyBgR3JvdXAgJHtfY3VycmVudEdyb3VwICsgMX0gb2YgJHtudW1Hcm91cHN9YFxuICAgIDogYCR7cXMubGVuZ3RofSBxdWVzdGlvbiR7cXMubGVuZ3RoID4gMSA/ICdzJyA6ICcnfWA7XG5cbiAgY29uc3QgcHJvZ3Jlc3NFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdxLXByb2dyZXNzJyk7XG4gIGlmIChwcm9ncmVzc0VsKSB7XG4gICAgcHJvZ3Jlc3NFbC50ZXh0Q29udGVudCA9IGAke2dyb3VwTGFiZWx9IFx1MjAxNCAke2Fuc3dlcmVkfSBvZiAke3FzLmxlbmd0aH0gYW5zd2VyZWRgO1xuICB9XG4gIGNvbnN0IHN1Ym1pdEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdxLXN1Ym1pdC1idG4nKTtcbiAgaWYgKHN1Ym1pdEJ0bikge1xuICAgIGNvbnN0IGN1cnJlbnRHcm91cFNpemUgPSBncm91cEVuZCAtIGdyb3VwU3RhcnQ7XG4gICAgc3VibWl0QnRuLmRpc2FibGVkID0gZ3JvdXBBbnN3ZXJlZCA8IGN1cnJlbnRHcm91cFNpemU7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gc3VibWl0QWxsQW5zd2VycygpIHtcbiAgLyogZHVja2Zsb3c6XG4gICAqICAgaWQ6IHF1ZXN0aW9uc191aV9zdWJtaXRfbGl2ZVxuICAgKiAgIGtpbmQ6IHVpXG4gICAqICAgdGltZXN0YW1wOiAnMjAyNi0wMy0yNVQyMTozOTo0OFonXG4gICAqICAgc3RhdHVzOiBsaXZlXG4gICAqICAgaGFuZGxlczpcbiAgICogICAtIHVpOnF1ZXN0aW9ucy5zdWJtaXQtYWxsXG4gICAqICAgY2FsbHM6XG4gICAqICAgLSBQT1NUIC9hcGkvcG9zdC1hbmFseXNpcy1yZXNwb25zZXNcbiAgICogICAtIFBPU1QgL2FwaS9hY3Rpb25cbiAgICogICByZWFkczpcbiAgICogICAtIHdpbmRvdzpwb3N0QW5hbHlzaXNRdWVzdGlvbnNcbiAgICogICAtIGRvbTpxLWlucHV0LSoudmFsdWVcbiAgICogICB3cml0ZXM6XG4gICAqICAgLSB3aW5kb3c6cXVlc3Rpb25BbnN3ZXJzXG4gICAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9wb3N0LWFuYWx5c2lzLXJlc3BvbnNlcy5hbnN3ZXJzXG4gICAqICAgbm90ZXM6IENvbGxlY3RzIHRoZSBjbGFyaWZ5aW5nLXF1ZXN0aW9uIGFuc3dlcnMgZnJvbSB0aGUgVUksIHBlcnNpc3RzIHRoZW0gdG8gc2Vzc2lvbiBzdGF0ZSwgYW5kIHRoZW4gYWR2YW5jZXMgaW50byBjdXN0b21pemF0aW9uIHJlY29tbWVuZGF0aW9uIGdlbmVyYXRpb24uXG4gICAqL1xuICBjb25zdCBxcyA9IHdpbmRvdy5wb3N0QW5hbHlzaXNRdWVzdGlvbnMgfHwgW107XG4gIHFzLmZvckVhY2goKHEsIGlkeCkgPT4ge1xuICAgIGNvbnN0IHRhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHEtaW5wdXQtJHtpZHh9YCk7XG4gICAgaWYgKHRhICYmIHRhLnZhbHVlLnRyaW0oKSkge1xuICAgICAgd2luZG93LnF1ZXN0aW9uQW5zd2Vyc1txLnR5cGVdID0gdGEudmFsdWUudHJpbSgpO1xuICAgIH1cbiAgfSk7XG4gIGF3YWl0IHBlcnNpc3RQb3N0QW5hbHlzaXNTdGF0ZSgpO1xuXG4gIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdxLXN1Ym1pdC1idG4nKTtcbiAgaWYgKGJ0bikge1xuICAgIGJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgYnRuLmlubmVySFRNTCA9ICc8c3BhbiBjbGFzcz1cInNwaW5uZXJcIiBzdHlsZT1cImRpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjE0cHg7aGVpZ2h0OjE0cHg7Ym9yZGVyOjJweCBzb2xpZCAjZmZmO2JvcmRlci10b3AtY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyLXJhZGl1czo1MCU7YW5pbWF0aW9uOnNwaW4gMC43cyBsaW5lYXIgaW5maW5pdGU7dmVydGljYWwtYWxpZ246bWlkZGxlO21hcmdpbi1yaWdodDo2cHg7XCI+PC9zcGFuPlByb2Nlc3NpbmdcdTIwMjYnO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCBgXHUyNzEzIFRoYW5rIHlvdSEgJHtxcy5sZW5ndGh9IGFuc3dlciR7cXMubGVuZ3RoID4gMSA/ICdzJyA6ICcnfSBzYXZlZC4gR2VuZXJhdGluZyBjdXN0b21pemF0aW9uIHJlY29tbWVuZGF0aW9uc1x1MjAyNmApO1xuICAgIGF3YWl0IHNlbmRBY3Rpb24oJ3JlY29tbWVuZF9jdXN0b21pemF0aW9ucycpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChidG4pIHtcbiAgICAgIGJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgYnRuLmlubmVySFRNTCA9ICdTdWJtaXQgQW5zd2Vycyc7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNob3dEcmFmdEVycm9yKGlkeCwgbWVzc2FnZSkge1xuICBjb25zdCByb3cgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjcS1pdGVtLSR7aWR4fSAucS1hbnN3ZXItcm93YCk7XG4gIGlmICghcm93KSByZXR1cm47XG4gIGxldCBlcnJFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBxLWRyYWZ0LWVyci0ke2lkeH1gKTtcbiAgaWYgKCFtZXNzYWdlKSB7XG4gICAgaWYgKGVyckVsKSBlcnJFbC5yZW1vdmUoKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCFlcnJFbCkge1xuICAgIGVyckVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZXJyRWwuaWQgPSBgcS1kcmFmdC1lcnItJHtpZHh9YDtcbiAgICBlcnJFbC5jbGFzc05hbWUgPSAncS1kcmFmdC1lcnJvcic7XG4gICAgcm93Lmluc2VydEFkamFjZW50RWxlbWVudCgnYWZ0ZXJlbmQnLCBlcnJFbCk7XG4gIH1cbiAgZXJyRWwudGV4dENvbnRlbnQgPSBgXHUyNkEwICR7bWVzc2FnZX1gO1xufVxuXG4vLyBMZWdhY3kgY29tcGF0aWJpbGl0eSBzaGltXG5mdW5jdGlvbiBzaG93TmV4dFF1ZXN0aW9uKCkgeyByZW5kZXJRdWVzdGlvbnNQYW5lbCgpOyB9XG5cbmZ1bmN0aW9uIGhhbmRsZVF1ZXN0aW9uUmVzcG9uc2UobWVzc2FnZSkge1xuICBpZiAoIXdpbmRvdy5wb3N0QW5hbHlzaXNRdWVzdGlvbnMgfHwgd2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcbiAgaWYgKCF3aW5kb3cud2FpdGluZ0ZvclF1ZXN0aW9uUmVzcG9uc2UpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgaWR4ID0gd2luZG93LmN1cnJlbnRRdWVzdGlvbkluZGV4IHx8IDA7XG4gIGNvbnN0IHEgPSB3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zW2lkeF07XG4gIGlmICghcSkgcmV0dXJuIGZhbHNlO1xuICB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzW3EudHlwZV0gPSBtZXNzYWdlO1xuICB3aW5kb3cud2FpdGluZ0ZvclF1ZXN0aW9uUmVzcG9uc2UgPSBmYWxzZTtcbiAgd2luZG93LmN1cnJlbnRRdWVzdGlvbkluZGV4ID0gaWR4ICsgMTtcbiAgcGVyc2lzdFBvc3RBbmFseXNpc1N0YXRlKCk7XG4gIHJlbmRlclF1ZXN0aW9uc1BhbmVsKCk7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBmaW5pc2hQb3N0QW5hbHlzaXNRdWVzdGlvbnMoKSB7XG4gIHdpbmRvdy53YWl0aW5nRm9yUXVlc3Rpb25SZXNwb25zZSA9IGZhbHNlO1xuICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCAnVGhhbmsgeW91IGZvciB0aG9zZSBpbnNpZ2h0cyEgQ2xpY2sgXCJSZWNvbW1lbmQgQ3VzdG9taXphdGlvbnNcIiB3aGVuIHlvdVxcJ3JlIHJlYWR5LicpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgRVMgbW9kdWxlIGV4cG9ydHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5leHBvcnQge1xuICBwZXJzaXN0UG9zdEFuYWx5c2lzU3RhdGUsXG4gIHJlbmRlclF1ZXN0aW9uTWFya2Rvd24sXG4gIGZldGNoUG9zdEFuYWx5c2lzUXVlc3Rpb25zRnJvbUFwaSxcbiAgYXNrUG9zdEFuYWx5c2lzUXVlc3Rpb25zLFxuICBwb3B1bGF0ZVF1ZXN0aW9uc1RhYixcbiAgcmVuZGVyUXVlc3Rpb25zUGFuZWwsXG4gIGRyYWZ0UXVlc3Rpb25SZXNwb25zZSxcbiAgc2VsZWN0UUNoaXAsXG4gIG9uUUlucHV0Q2hhbmdlLFxuICB1cGRhdGVRUHJvZ3Jlc3MsXG4gIHN1Ym1pdEFsbEFuc3dlcnMsXG4gIHNob3dEcmFmdEVycm9yLFxuICBzaG93TmV4dFF1ZXN0aW9uLFxuICBoYW5kbGVRdWVzdGlvblJlc3BvbnNlLFxuICBmaW5pc2hQb3N0QW5hbHlzaXNRdWVzdGlvbnMsXG4gIGFkdmFuY2VRR3JvdXAsXG4gIGp1bXBUb1FHcm91cCxcbn07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG5mdW5jdGlvbiBleWVTbGFzaEljb24oKSB7XG4gIHJldHVybiBgXG4gICAgPHN2ZyBjbGFzcz1cImljb24tZ2x5cGhcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgZm9jdXNhYmxlPVwiZmFsc2VcIj5cbiAgICAgIDxwYXRoIGQ9XCJNMyAzbDE4IDE4XCI+PC9wYXRoPlxuICAgICAgPHBhdGggZD1cIk0xMC41OCAxMC41OGEyIDIgMCAwIDAgMi44MyAyLjgzXCI+PC9wYXRoPlxuICAgICAgPHBhdGggZD1cIk05Ljg4IDUuMDlBMTAuOTQgMTAuOTQgMCAwIDEgMTIgNWM1IDAgOS4yNyAzLjExIDExIDctMS4wNCAyLjM1LTIuNzggNC4zMi00Ljk2IDUuNDVcIj48L3BhdGg+XG4gICAgICA8cGF0aCBkPVwiTTYuNjEgNi42MUM0LjYyIDcuOSAzLjAzIDkuNzkgMiAxMmMxLjczIDMuODkgNiA3IDEwIDcgMS41MiAwIDIuOTgtLjM2IDQuMjktMVwiPjwvcGF0aD5cbiAgICA8L3N2Zz5cbiAgYDtcbn1cblxuZXhwb3J0IHsgZXllU2xhc2hJY29uIH07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9leHBlcmllbmNlLXJldmlldy5qc1xuICogRXhwZXJpZW5jZS1yZXZpZXcgdGFibGU6IGZldGNoLCByZW5kZXIsIHJvdy1yZW9yZGVyLCBhbmQgc3VibWl0IGRlY2lzaW9ucy5cbiAqXG4gKiBEZXBlbmRlbmNpZXMgKHJlc29sdmVkIHRocm91Z2ggZ2xvYmFsVGhpcyBhdCBydW50aW1lKTpcbiAqICAgdXNlclNlbGVjdGlvbnMsIHBlbmRpbmdSZWNvbW1lbmRhdGlvbnMsIF9zYXZlZERlY2lzaW9ucywgX2V4cGVyaWVuY2VzT3JkZXJlZCxcbiAqICAgcGFyc2VTdGF0dXNSZXNwb25zZSwgZ2V0RXhwZXJpZW5jZVJlY29tbWVuZGF0aW9uLCBnZXRDb25maWRlbmNlTGV2ZWwsXG4gKiAgIGdldEV4cGVyaWVuY2VSZWFzb25pbmcsIGVzY2FwZUh0bWwsIHNob3dCdWxsZXRSZW9yZGVyLFxuICogICBoYW5kbGVBY3Rpb25DbGljaywgYnVsa0FjdGlvbiwgX3VwZGF0ZVBhZ2VFc3RpbWF0ZSxcbiAqICAgdXBkYXRlSW5jbHVzaW9uQ291bnRzLCBzd2l0Y2hUYWIsXG4gKiAgIHNob3dBbGVydE1vZGFsLCBzaG93VG9hc3QsIHNjaGVkdWxlQXRzUmVmcmVzaCxcbiAqICAgJCwgJC5mbi5EYXRhVGFibGUgKGpRdWVyeSArIERhdGFUYWJsZXMpXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdleHBlcmllbmNlLXJldmlldycpO1xuXG5pbXBvcnQgeyBzdGF0ZU1hbmFnZXIgfSBmcm9tICcuL3N0YXRlLW1hbmFnZXIuanMnO1xuaW1wb3J0IHsgZXllU2xhc2hJY29uIH0gZnJvbSAnLi9yZXZpZXctaWNvbnMuanMnO1xuXG5mdW5jdGlvbiBfZmluZEV4cGVyaWVuY2VSZWNvbW1lbmRhdGlvblJlY29yZChleHBJZCwgZGF0YSkge1xuICBpZiAoIWRhdGEgfHwgIUFycmF5LmlzQXJyYXkoZGF0YS5leHBlcmllbmNlX3JlY29tbWVuZGF0aW9ucykpIHJldHVybiBudWxsO1xuICByZXR1cm4gZGF0YS5leHBlcmllbmNlX3JlY29tbWVuZGF0aW9ucy5maW5kKChyZWMpID0+IFN0cmluZyhyZWM/LmlkIHx8IHJlYz8uZXhwZXJpZW5jZV9pZCB8fCAnJykgPT09IFN0cmluZyhleHBJZCkpIHx8IG51bGw7XG59XG5cbmZ1bmN0aW9uIF9mb3JtYXRTdWdnZXN0ZWRPcmRlclN1bW1hcnkob3JkZXIpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KG9yZGVyKSB8fCBvcmRlci5sZW5ndGggPCAyKSByZXR1cm4gJyc7XG4gIHJldHVybiBvcmRlci5tYXAoKGlkeCkgPT4gU3RyaW5nKE51bWJlcihpZHgpICsgMSkpLmpvaW4oJyAtPiAnKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEV4cGVyaWVuY2UgZGV0YWlscyBmZXRjaCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gZ2V0RXhwZXJpZW5jZURldGFpbHMoZXhwSWQpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9leHBlcmllbmNlLWRldGFpbHMnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBleHBlcmllbmNlX2lkOiBleHBJZCB9KVxuICAgIH0pO1xuXG4gICAgaWYgKHJlcy5vaykge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICByZXR1cm4gZGF0YS5leHBlcmllbmNlIHx8IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZy53YXJuKCdDb3VsZCBub3QgZmV0Y2ggZXhwZXJpZW5jZSBkZXRhaWxzIGZvcicsIGV4cElkKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cud2FybignRXJyb3IgZmV0Y2hpbmcgZXhwZXJpZW5jZSBkZXRhaWxzOicsIGVycm9yKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgUmVydW4gc25hcHNob3QgKGNoYW5nZSBiYWRnZSBmb3IgZXhwZXJpZW5jZXMpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuZnVuY3Rpb24gX2V4cFNuYXBzaG90S2V5KCkge1xuICB0cnkge1xuICAgIGNvbnN0IHNpZCA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCkuZ2V0KCdzZXNzaW9uJyk7XG4gICAgcmV0dXJuIHNpZCA/IGBleHBfc25hcF8ke3NpZH1gIDogbnVsbDtcbiAgfSBjYXRjaCAoXykgeyByZXR1cm4gbnVsbDsgfVxufVxuZnVuY3Rpb24gX3NhdmVFeHBTbmFwc2hvdChyZWNvbW1lbmRlZElkcykge1xuICBjb25zdCBrZXkgPSBfZXhwU25hcHNob3RLZXkoKTtcbiAgaWYgKCFrZXkpIHJldHVybjtcbiAgdHJ5IHsgbG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCBKU09OLnN0cmluZ2lmeShbLi4ucmVjb21tZW5kZWRJZHNdKSk7IH0gY2F0Y2ggKF8pIHt9XG59XG5mdW5jdGlvbiBfZ2V0RXhwU25hcHNob3QoKSB7XG4gIGNvbnN0IGtleSA9IF9leHBTbmFwc2hvdEtleSgpO1xuICBpZiAoIWtleSkgcmV0dXJuIG51bGw7XG4gIHRyeSB7XG4gICAgY29uc3QgcmF3ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KTtcbiAgICByZXR1cm4gcmF3ID8gbmV3IFNldChKU09OLnBhcnNlKHJhdykpIDogbnVsbDtcbiAgfSBjYXRjaCAoXykgeyByZXR1cm4gbnVsbDsgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgQnVpbGQgcmV2aWV3IHRhYmxlIChmZXRjaCArIGluaXRpYWxpc2UpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBidWlsZEV4cGVyaWVuY2VSZXZpZXdUYWJsZSgpIHtcbiAgY29uc3QgZGF0YSA9IHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zO1xuICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwZXJpZW5jZS10YWJsZS1jb250YWluZXInKTtcbiAgaWYgKCFjb250YWluZXIpIHJldHVybjtcblxuICBjb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJlbXB0eS1zdGF0ZVwiPjxkaXYgY2xhc3M9XCJsb2FkaW5nLXNwaW5uZXJcIj48L2Rpdj48cCBzdHlsZT1cIm1hcmdpbi10b3A6MTJweDtjb2xvcjojNjQ3NDhiO1wiPkxvYWRpbmcgZXhwZXJpZW5jZSByZWNvbW1lbmRhdGlvbnNcdTIwMjY8L3A+PC9kaXY+JztcblxuICBsZXQgYWxsRXhwZXJpZW5jZUlkcyA9IFtdO1xuICBsZXQgc2F2ZWRSb3dPcmRlciA9IFtdO1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXR1c1JlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3N0YXR1cycpO1xuICAgIGNvbnN0IHN0YXR1c0RhdGEgPSBwYXJzZVN0YXR1c1Jlc3BvbnNlKGF3YWl0IHN0YXR1c1Jlcy5qc29uKCkpO1xuICAgIGFsbEV4cGVyaWVuY2VJZHMgPSBzdGF0dXNEYXRhLmFsbF9leHBlcmllbmNlX2lkcyB8fCBkYXRhLnJlY29tbWVuZGVkX2V4cGVyaWVuY2VzIHx8IFtdO1xuICAgIHNhdmVkUm93T3JkZXIgICAgPSBBcnJheS5pc0FycmF5KHN0YXR1c0RhdGEuZXhwZXJpZW5jZV9yb3dfb3JkZXIpID8gc3RhdHVzRGF0YS5leHBlcmllbmNlX3Jvd19vcmRlciA6IFtdO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGFsbEV4cGVyaWVuY2VJZHMgPSBkYXRhLnJlY29tbWVuZGVkX2V4cGVyaWVuY2VzIHx8IFtdO1xuICB9XG5cbiAgY29uc3QgcmVjb21tZW5kZWRTZXQgPSBuZXcgU2V0KGRhdGEucmVjb21tZW5kZWRfZXhwZXJpZW5jZXMgfHwgW10pO1xuXG4gIC8vIEZldGNoIGFsbCBleHBlcmllbmNlIGRldGFpbHNcbiAgY29uc3QgZXhwZXJpZW5jZXNXaXRoRGV0YWlscyA9IFtdO1xuICBmb3IgKGNvbnN0IGV4cElkIG9mIGFsbEV4cGVyaWVuY2VJZHMpIHtcbiAgICBjb25zdCBkZXRhaWxzID0gYXdhaXQgZ2V0RXhwZXJpZW5jZURldGFpbHMoZXhwSWQpO1xuICAgIGV4cGVyaWVuY2VzV2l0aERldGFpbHMucHVzaCh7IGlkOiBleHBJZCwgZGV0YWlscyB9KTtcbiAgfVxuXG4gIC8vIE9uIGZpcnN0IGxvYWQ6IHJlc3RvcmUgdXNlcidzIHNhdmVkIG9yZGVyIGlmIHByZXNlbnQ7IG90aGVyd2lzZSBkZWZhdWx0LXNvcnRcbiAgLy8gd2l0aCBwcmVzZW50L2N1cnJlbnQgcG9zaXRpb25zIGZpcnN0LCB0aGVuIHJldmVyc2UtY2hyb25vbG9naWNhbCBieSBlbmQgZGF0ZS5cbiAgLy8gT24gcmUtcmVuZGVyLCBwcmVzZXJ2ZSB0aGUgaW4tbWVtb3J5IHVzZXIgb3JkZXIuXG4gIGlmICghd2luZG93Ll9leHBlcmllbmNlc09yZGVyZWQpIHtcbiAgICBpZiAoc2F2ZWRSb3dPcmRlci5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBSZXN0b3JlIHVzZXIncyBleHBsaWNpdGx5IHNhdmVkIG9yZGVyaW5nIGZyb20gdGhlIHNlc3Npb25cbiAgICAgIGNvbnN0IG9yZGVyTWFwID0gT2JqZWN0LmZyb21FbnRyaWVzKHNhdmVkUm93T3JkZXIubWFwKChpZCwgaSkgPT4gW2lkLCBpXSkpO1xuICAgICAgZXhwZXJpZW5jZXNXaXRoRGV0YWlscy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIGNvbnN0IGFpID0gb3JkZXJNYXBbYS5pZF0gPz8gc2F2ZWRSb3dPcmRlci5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGJpID0gb3JkZXJNYXBbYi5pZF0gPz8gc2F2ZWRSb3dPcmRlci5sZW5ndGg7XG4gICAgICAgIHJldHVybiBhaSAtIGJpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIERlZmF1bHQ6IHNvcnQgYnkgTExNIHJlY29tbWVuZGF0aW9uIHN0cmVuZ3RoIGZpcnN0LCB0aGVuIHJldmVyc2UtY2hyb25vbG9naWNhbFxuICAgICAgY29uc3QgX0FDVElPTl9SQU5LID0geyBlbXBoYXNpemU6IDAsIGluY2x1ZGU6IDEsICdkZS1lbXBoYXNpemUnOiAyLCBleGNsdWRlOiAzIH07XG4gICAgICBjb25zdCBfcGFyc2VFbmRLZXkgPSAoZXhwKSA9PiB7XG4gICAgICAgIGNvbnN0IHJhdyA9IChleHAuZGV0YWlscz8uZW5kX2RhdGUgfHwgZXhwLmRldGFpbHM/LmVuZCB8fCAnJykudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICghcmF3IHx8IFsncHJlc2VudCcsICdjdXJyZW50JywgJ25vdycsICdvbmdvaW5nJ10uaW5jbHVkZXMocmF3KSkgcmV0dXJuICc5OTk5LTEyJztcbiAgICAgICAgaWYgKC9eXFxkezR9JC8udGVzdChyYXcpKSByZXR1cm4gcmF3ICsgJy0xMic7XG4gICAgICAgIHJldHVybiByYXc7XG4gICAgICB9O1xuICAgICAgY29uc3QgX2dldEFjdGlvblJhbmsgPSAoZXhwKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlYyA9IGdldEV4cGVyaWVuY2VSZWNvbW1lbmRhdGlvbihleHAuaWQsIGRhdGEpO1xuICAgICAgICBpZiAoIXJlYykgcmV0dXJuIDE7IC8vIGRlZmF1bHQgdG8gJ2luY2x1ZGUnIHJhbmsgd2hlbiBubyByZWNvbW1lbmRhdGlvblxuICAgICAgICBpZiAocmVjID09PSAnRW1waGFzaXplJykgICAgcmV0dXJuIDA7XG4gICAgICAgIGlmIChyZWMgPT09ICdJbmNsdWRlJykgICAgICByZXR1cm4gMTtcbiAgICAgICAgaWYgKHJlYyA9PT0gJ0RlLWVtcGhhc2l6ZScpIHJldHVybiAyO1xuICAgICAgICBpZiAocmVjID09PSAnT21pdCcpICAgICAgICAgcmV0dXJuIDM7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfTtcbiAgICAgIGV4cGVyaWVuY2VzV2l0aERldGFpbHMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICBjb25zdCByYW5rRGlmZiA9IF9nZXRBY3Rpb25SYW5rKGEpIC0gX2dldEFjdGlvblJhbmsoYik7XG4gICAgICAgIGlmIChyYW5rRGlmZiAhPT0gMCkgcmV0dXJuIHJhbmtEaWZmO1xuICAgICAgICByZXR1cm4gX3BhcnNlRW5kS2V5KGIpLmxvY2FsZUNvbXBhcmUoX3BhcnNlRW5kS2V5KGEpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB3aW5kb3cuX2V4cGVyaWVuY2VzT3JkZXJlZCA9IGV4cGVyaWVuY2VzV2l0aERldGFpbHM7XG4gIH0gZWxzZSB7XG4gICAgLy8gTWVyZ2UgYW55IG5ld2x5IGRpc2NvdmVyZWQgZXhwZXJpZW5jZXMgaW50byB0aGUgY2FjaGVkIG9yZGVyXG4gICAgY29uc3Qga25vd25JZHMgPSBuZXcgU2V0KHdpbmRvdy5fZXhwZXJpZW5jZXNPcmRlcmVkLm1hcChlID0+IGUuaWQpKTtcbiAgICBmb3IgKGNvbnN0IGV4cCBvZiBleHBlcmllbmNlc1dpdGhEZXRhaWxzKSB7XG4gICAgICBpZiAoIWtub3duSWRzLmhhcyhleHAuaWQpKSB3aW5kb3cuX2V4cGVyaWVuY2VzT3JkZXJlZC5wdXNoKGV4cCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQ29tcHV0ZSB3aGljaCByZWNvbW1lbmRhdGlvbnMgYXJlIG5ldyBzaW5jZSBsYXN0IHJlbmRlciAocmVydW4gY2hhbmdlIGJhZGdlcylcbiAgY29uc3QgcHJldkV4cFNuYXAgPSBfZ2V0RXhwU25hcHNob3QoKTtcbiAgY29uc3QgbmV3UmVjb21tZW5kZWRFeHBzID0gcHJldkV4cFNuYXBcbiAgICA/IG5ldyBTZXQoWy4uLnJlY29tbWVuZGVkU2V0XS5maWx0ZXIoaWQgPT4gIXByZXZFeHBTbmFwLmhhcyhpZCkpKVxuICAgIDogbmV3IFNldCgpO1xuICBfc2F2ZUV4cFNuYXBzaG90KHJlY29tbWVuZGVkU2V0KTtcblxuICAvLyBJbml0aWFsaXNlIHNhdmVkIGRlY2lzaW9uc1xuICBjb25zdCBzYXZlZEV4cERlY3MgPSB3aW5kb3cuX3NhdmVkRGVjaXNpb25zPy5leHBlcmllbmNlX2RlY2lzaW9ucyB8fCB7fTtcbiAgZm9yIChjb25zdCB7IGlkOiBleHBJZCB9IG9mIHdpbmRvdy5fZXhwZXJpZW5jZXNPcmRlcmVkKSB7XG4gICAgY29uc3QgcmVjb21tZW5kYXRpb24gPSBnZXRFeHBlcmllbmNlUmVjb21tZW5kYXRpb24oZXhwSWQsIGRhdGEpO1xuICAgIGNvbnN0IGlzUmVjb21tZW5kZWQgID0gcmVjb21tZW5kZWRTZXQuaGFzKGV4cElkKTtcbiAgICBsZXQgZGVmYXVsdEFjdGlvbiA9ICdleGNsdWRlJztcbiAgICBpZiAgICAgIChyZWNvbW1lbmRhdGlvbiA9PT0gJ0VtcGhhc2l6ZScpICAgIGRlZmF1bHRBY3Rpb24gPSAnZW1waGFzaXplJztcbiAgICBlbHNlIGlmIChyZWNvbW1lbmRhdGlvbiA9PT0gJ0luY2x1ZGUnKSAgICAgIGRlZmF1bHRBY3Rpb24gPSAnaW5jbHVkZSc7XG4gICAgZWxzZSBpZiAocmVjb21tZW5kYXRpb24gPT09ICdEZS1lbXBoYXNpemUnKSBkZWZhdWx0QWN0aW9uID0gJ2RlLWVtcGhhc2l6ZSc7XG4gICAgZWxzZSBpZiAocmVjb21tZW5kYXRpb24gPT09ICdPbWl0JykgICAgICAgICBkZWZhdWx0QWN0aW9uID0gJ2V4Y2x1ZGUnO1xuICAgIGVsc2UgaWYgKGlzUmVjb21tZW5kZWQpICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEFjdGlvbiA9ICdpbmNsdWRlJztcbiAgICB1c2VyU2VsZWN0aW9ucy5leHBlcmllbmNlc1tleHBJZF0gPSBzYXZlZEV4cERlY3NbZXhwSWRdIHx8IGRlZmF1bHRBY3Rpb247XG4gIH1cblxuICBfcmVuZGVyRXhwZXJpZW5jZVRhYmxlKGNvbnRhaW5lciwgcmVjb21tZW5kZWRTZXQsIGRhdGEsIG5ld1JlY29tbWVuZGVkRXhwcyk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBSZW5kZXIgdGFibGUgSFRNTCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gX3JlbmRlckV4cGVyaWVuY2VUYWJsZShjb250YWluZXIsIHJlY29tbWVuZGVkU2V0LCBkYXRhLCBuZXdSZWNvbW1lbmRlZEV4cHMgPSBuZXcgU2V0KCkpIHtcbiAgaWYgKCFjb250YWluZXIpIGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHBlcmllbmNlLXRhYmxlLWNvbnRhaW5lcicpO1xuICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuO1xuICBpZiAoIXJlY29tbWVuZGVkU2V0KSByZWNvbW1lbmRlZFNldCA9IG5ldyBTZXQoKHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zPy5yZWNvbW1lbmRlZF9leHBlcmllbmNlcykgfHwgW10pO1xuICBpZiAoIWRhdGEpIGRhdGEgPSB3aW5kb3cucGVuZGluZ1JlY29tbWVuZGF0aW9ucztcblxuICAvLyBEZXN0cm95IGFueSBleGlzdGluZyBEYXRhVGFibGUgYmVmb3JlIHJlYnVpbGRpbmdcbiAgaWYgKCQuZm4uRGF0YVRhYmxlLmlzRGF0YVRhYmxlKCcjZXhwZXJpZW5jZS1yZXZpZXctdGFibGUnKSkge1xuICAgICQoJyNleHBlcmllbmNlLXJldmlldy10YWJsZScpLkRhdGFUYWJsZSgpLmRlc3Ryb3koKTtcbiAgfVxuXG4gIGNvbnN0IGV4cHMgPSB3aW5kb3cuX2V4cGVyaWVuY2VzT3JkZXJlZCB8fCBbXTtcbiAgbGV0IHRhYmxlSFRNTCA9IGBcbiAgICA8dGFibGUgaWQ9XCJleHBlcmllbmNlLXJldmlldy10YWJsZVwiIGNsYXNzPVwicmV2aWV3LXRhYmxlXCI+XG4gICAgICA8dGhlYWQ+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8dGg+RXhwZXJpZW5jZTwvdGg+XG4gICAgICAgICAgPHRoPkRhdGVzPC90aD5cbiAgICAgICAgICA8dGg+UmVjb21tZW5kYXRpb248L3RoPlxuICAgICAgICAgIDx0aD5Db25maWRlbmNlPC90aD5cbiAgICAgICAgICA8dGg+UmVhc29uaW5nPC90aD5cbiAgICAgICAgICA8dGg+WW91ciBTZWxlY3Rpb248L3RoPlxuICAgICAgICA8L3RyPlxuICAgICAgPC90aGVhZD5cbiAgICAgIDx0Ym9keT5cbiAgYDtcblxuICBleHBzLmZvckVhY2goKHsgaWQ6IGV4cElkLCBkZXRhaWxzIH0sIHJvd0lkeCkgPT4ge1xuICAgIGNvbnN0IHJlY29tbWVuZGF0aW9uICAgID0gZ2V0RXhwZXJpZW5jZVJlY29tbWVuZGF0aW9uKGV4cElkLCBkYXRhKTtcbiAgICBjb25zdCBjb25maWRlbmNlICAgICAgICA9IGdldENvbmZpZGVuY2VMZXZlbChleHBJZCwgZGF0YSk7XG4gICAgY29uc3QgcmVhc29uaW5nICAgICAgICAgPSBnZXRFeHBlcmllbmNlUmVhc29uaW5nKGV4cElkLCBkYXRhKTtcbiAgICBjb25zdCByZWNSZWNvcmQgICAgICAgICA9IF9maW5kRXhwZXJpZW5jZVJlY29tbWVuZGF0aW9uUmVjb3JkKGV4cElkLCBkYXRhKTtcbiAgICBjb25zdCBidWxsZXRPcmRlciAgICAgICA9IHJlY1JlY29yZCAmJiB0eXBlb2YgcmVjUmVjb3JkLmJ1bGxldF9vcmRlciA9PT0gJ29iamVjdCcgPyByZWNSZWNvcmQuYnVsbGV0X29yZGVyIDogbnVsbDtcbiAgICBjb25zdCBidWxsZXRPcmRlclN1bW1hcnkgPSBfZm9ybWF0U3VnZ2VzdGVkT3JkZXJTdW1tYXJ5KGJ1bGxldE9yZGVyPy5vcmRlcik7XG4gICAgY29uc3QgdGl0bGUgICAgICAgICAgICAgPSBkZXRhaWxzID8gZGV0YWlscy50aXRsZSAgIDogZXhwSWQ7XG4gICAgY29uc3QgY29tcGFueSAgICAgICAgICAgPSBkZXRhaWxzID8gZGV0YWlscy5jb21wYW55IDogJyc7XG4gICAgY29uc3Qgc3RhcnREYXRlICAgICAgICAgPSBkZXRhaWxzPy5zdGFydF9kYXRlIHx8ICcnO1xuICAgIGNvbnN0IGVuZERhdGUgICAgICAgICAgID0gZGV0YWlscz8uZW5kX2RhdGUgICB8fCAncHJlc2VudCc7XG4gICAgY29uc3QgZHVyYXRpb24gICAgICAgICAgPSBzdGFydERhdGUgPyBgJHtzdGFydERhdGV9IC0gJHtlbmREYXRlfWAgOiAoZGV0YWlscz8uZHVyYXRpb24gfHwgJycpO1xuICAgIGNvbnN0IGRlZmF1bHRBY3Rpb24gICAgID0gdXNlclNlbGVjdGlvbnMuZXhwZXJpZW5jZXNbZXhwSWRdIHx8ICdpbmNsdWRlJztcbiAgICBjb25zdCByZWNvbW1lbmRhdGlvblRleHQgPSByZWNvbW1lbmRhdGlvbiB8fCAnSW5jbHVkZSc7XG4gICAgY29uc3QgY29uZmlkZW5jZUJhZGdlICAgPSBgPHNwYW4gY2xhc3M9XCJjb25maWRlbmNlLWJhZGdlIGNvbmZpZGVuY2UtJHtjb25maWRlbmNlLmxldmVsfVwiPiR7Y29uZmlkZW5jZS50ZXh0fTwvc3Bhbj5gO1xuICAgIGNvbnN0IHJlYXNvbmluZ1NlZ21lbnRzID0gW3JlYXNvbmluZyB8fCAnVGhpcyBleHBlcmllbmNlIHdhcyBzZWxlY3RlZCBiYXNlZCBvbiBpdHMgcmVsZXZhbmNlIHRvIHRoZSBwb3NpdGlvbiByZXF1aXJlbWVudHMuJ107XG4gICAgaWYgKGJ1bGxldE9yZGVyU3VtbWFyeSkgcmVhc29uaW5nU2VnbWVudHMucHVzaChgU3VnZ2VzdGVkIGJ1bGxldCBvcmRlcjogJHtidWxsZXRPcmRlclN1bW1hcnl9LmApO1xuICAgIGlmIChidWxsZXRPcmRlcj8ucmVhc29uaW5nKSByZWFzb25pbmdTZWdtZW50cy5wdXNoKFN0cmluZyhidWxsZXRPcmRlci5yZWFzb25pbmcpKTtcbiAgICBpZiAoYnVsbGV0T3JkZXI/LmF0c19pbXBhY3QpIHJlYXNvbmluZ1NlZ21lbnRzLnB1c2goYEFUUyBpbXBhY3Q6ICR7YnVsbGV0T3JkZXIuYXRzX2ltcGFjdH1gKTtcbiAgICBpZiAoYnVsbGV0T3JkZXI/LnBhZ2VfbGVuZ3RoX2ltcGFjdCkgcmVhc29uaW5nU2VnbWVudHMucHVzaChgUGFnZSBsZW5ndGggaW1wYWN0OiAke2J1bGxldE9yZGVyLnBhZ2VfbGVuZ3RoX2ltcGFjdH1gKTtcbiAgICBjb25zdCByZWFzb25pbmdUZXh0ICAgICA9IHJlYXNvbmluZ1NlZ21lbnRzLmpvaW4oJyAnKTtcbiAgICBjb25zdCBpc0ZpcnN0ICAgICAgICAgICA9IHJvd0lkeCA9PT0gMDtcbiAgICBjb25zdCBpc0xhc3QgICAgICAgICAgICA9IHJvd0lkeCA9PT0gZXhwcy5sZW5ndGggLSAxO1xuICAgIGNvbnN0IHRpdGxlRXNjICAgICAgICAgID0gZXNjYXBlSHRtbCh0aXRsZSk7XG4gICAgY29uc3QgcmVydW5OZXdCYWRnZSA9IG5ld1JlY29tbWVuZGVkRXhwcy5oYXMoZXhwSWQpXG4gICAgICA/ICc8c3BhbiBjbGFzcz1cInJ3LWNoYW5nZS1iYWRnZSBydy1jaGFuZ2UtbmV3XCIgYXJpYS1sYWJlbD1cIk5ldyByZWNvbW1lbmRhdGlvbiBzaW5jZSBwcmV2aW91cyBydW5cIj5cdUQ4M0NcdUREOTUgTmV3PC9zcGFuPidcbiAgICAgIDogJyc7XG5cbiAgICB0YWJsZUhUTUwgKz0gYFxuICAgICAgPHRyIGRhdGEtZXhwLWlkPVwiJHtleHBJZH1cIiBkYXRhLXN0YXJ0LWRhdGU9XCIke3N0YXJ0RGF0ZX1cIj5cbiAgICAgICAgPHRkPlxuICAgICAgICAgIDxzdHJvbmc+JHt0aXRsZUVzY308L3N0cm9uZz4ke3JlcnVuTmV3QmFkZ2V9PGJyPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtcIj4ke2VzY2FwZUh0bWwoY29tcGFueSl9PC9zcGFuPlxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJ3aGl0ZS1zcGFjZTpub3dyYXA7XCI+JHtlc2NhcGVIdG1sKGR1cmF0aW9uKX08L3RkPlxuICAgICAgICA8dGQ+PHN0cm9uZz4ke2VzY2FwZUh0bWwocmVjb21tZW5kYXRpb25UZXh0KX08L3N0cm9uZz48L3RkPlxuICAgICAgICA8dGQ+JHtjb25maWRlbmNlQmFkZ2V9PC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwibWF4LXdpZHRoOjMwMHB4O1wiPjxzbWFsbD4ke2VzY2FwZUh0bWwocmVhc29uaW5nVGV4dCl9PC9zbWFsbD48L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJhY3Rpb24tYnRuc1wiIHN0eWxlPVwid2hpdGUtc3BhY2U6bm93cmFwO1wiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0biAke2RlZmF1bHRBY3Rpb24gPT09ICdlbXBoYXNpemUnICAgID8gJ2FjdGl2ZScgOiAnJ31cIiBkYXRhLWFjdGlvbj1cImVtcGhhc2l6ZVwiICAgIGFyaWEtbGFiZWw9XCJFbXBoYXNpemUgJHt0aXRsZUVzY31cIiAgICAgICBhcmlhLXByZXNzZWQ9XCIke2RlZmF1bHRBY3Rpb24gPT09ICdlbXBoYXNpemUnfVwiICAgIHRpdGxlPVwiRW1waGFzaXplIFx1MjAxNCBmZWF0dXJlIHByb21pbmVudGx5XCIgc3R5bGU9XCJjb2xvcjojMTBiOTgxO1wiPlx1Mjc5NTwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0biAke2RlZmF1bHRBY3Rpb24gPT09ICdpbmNsdWRlJyAgICAgID8gJ2FjdGl2ZScgOiAnJ31cIiBkYXRhLWFjdGlvbj1cImluY2x1ZGVcIiAgICAgIGFyaWEtbGFiZWw9XCJJbmNsdWRlICR7dGl0bGVFc2N9XCIgICAgICAgICBhcmlhLXByZXNzZWQ9XCIke2RlZmF1bHRBY3Rpb24gPT09ICdpbmNsdWRlJ31cIiAgICAgIHRpdGxlPVwiSW5jbHVkZSBcdTIwMTQgc3RhbmRhcmQgdHJlYXRtZW50XCI+XHUyNzEzPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuICR7ZGVmYXVsdEFjdGlvbiA9PT0gJ2RlLWVtcGhhc2l6ZScgPyAnYWN0aXZlJyA6ICcnfVwiIGRhdGEtYWN0aW9uPVwiZGUtZW1waGFzaXplXCIgYXJpYS1sYWJlbD1cIkRlLWVtcGhhc2l6ZSAke3RpdGxlRXNjfVwiICAgIGFyaWEtcHJlc3NlZD1cIiR7ZGVmYXVsdEFjdGlvbiA9PT0gJ2RlLWVtcGhhc2l6ZSd9XCIgdGl0bGU9XCJEZS1lbXBoYXNpemUgXHUyMDE0IGJyaWVmIG1lbnRpb25cIiAgICBzdHlsZT1cImNvbG9yOiNmNTllMGI7XCI+XHUyNzk2PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuICR7ZGVmYXVsdEFjdGlvbiA9PT0gJ2V4Y2x1ZGUnICAgICAgPyAnYWN0aXZlJyA6ICcnfVwiIGRhdGEtYWN0aW9uPVwiZXhjbHVkZVwiICAgICAgYXJpYS1sYWJlbD1cIkV4Y2x1ZGUgJHt0aXRsZUVzY31cIiAgICAgICAgIGFyaWEtcHJlc3NlZD1cIiR7ZGVmYXVsdEFjdGlvbiA9PT0gJ2V4Y2x1ZGUnfVwiICAgICAgdGl0bGU9XCJFeGNsdWRlIFx1MjAxNCBvbWl0IGZyb20gQ1ZcIiAgICAgICAgICBzdHlsZT1cImNvbG9yOiNlZjQ0NDQ7XCI+JHtleWVTbGFzaEljb24oKX08L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBkYXRhLWFjdGlvbj1cInJlb3JkZXJcIiBhcmlhLWxhYmVsPVwiUmVvcmRlciBidWxsZXRzIGZvciAke3RpdGxlRXNjfVwiIHRpdGxlPVwiJHtidWxsZXRPcmRlclN1bW1hcnkgPyBgUmVvcmRlciBidWxsZXQgcG9pbnRzIChBSSBzdWdnZXN0ZWQgb3JkZXIgJHtidWxsZXRPcmRlclN1bW1hcnl9KWAgOiAnUmVvcmRlciBidWxsZXQgcG9pbnRzJ31cIiBzdHlsZT1cImNvbG9yOiM2MzY2ZjE7XCI+XHUyMTk1PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgZGF0YS1hY3Rpb249XCJyb3ctdXBcIiAgIGFyaWEtbGFiZWw9XCJNb3ZlICR7dGl0bGVFc2N9IGVhcmxpZXIgaW4gQ1ZcIiB0aXRsZT1cIk1vdmUgdXAgaW4gQ1ZcIiAgICR7aXNGaXJzdCA/ICdkaXNhYmxlZCcgOiAnJ30+XHUyMTkxPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgZGF0YS1hY3Rpb249XCJyb3ctZG93blwiIGFyaWEtbGFiZWw9XCJNb3ZlICR7dGl0bGVFc2N9IGxhdGVyIGluIENWXCIgICB0aXRsZT1cIk1vdmUgZG93biBpbiBDVlwiICR7aXNMYXN0ICA/ICdkaXNhYmxlZCcgOiAnJ30+XHUyMTkzPC9idXR0b24+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L3RyPlxuICAgIGA7XG4gIH0pO1xuXG4gIHRhYmxlSFRNTCArPSAnPC90Ym9keT48L3RhYmxlPic7XG4gIGNvbnRhaW5lci5pbm5lckhUTUwgPSB0YWJsZUhUTUw7XG5cbiAgLy8gRGVsZWdhdGVkIGNsaWNrIGhhbmRsZXJcbiAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJyNleHBlcmllbmNlLXJldmlldy10YWJsZSB0Ym9keScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGUgPT4ge1xuICAgIGNvbnN0IGJ0biA9IGUudGFyZ2V0LmNsb3Nlc3QoJy5pY29uLWJ0bicpO1xuICAgIGlmICghYnRuKSByZXR1cm47XG4gICAgY29uc3QgdHIgPSBidG4uY2xvc2VzdCgndHJbZGF0YS1leHAtaWRdJyk7XG4gICAgaWYgKCF0cikgcmV0dXJuO1xuICAgIGNvbnN0IGV4cElkICA9IHRyLmRhdGFzZXQuZXhwSWQ7XG4gICAgY29uc3QgYWN0aW9uID0gYnRuLmRhdGFzZXQuYWN0aW9uO1xuICAgIGlmIChhY3Rpb24gPT09ICdyZW9yZGVyJykge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGNvbnN0IHRpdGxlRWwgPSB0ci5xdWVyeVNlbGVjdG9yKCdzdHJvbmcnKTtcbiAgICAgIHNob3dCdWxsZXRSZW9yZGVyKGV4cElkLCB0aXRsZUVsID8gdGl0bGVFbC50ZXh0Q29udGVudCA6ICcnKTtcbiAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PT0gJ3Jvdy11cCcpIHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBtb3ZlRXhwZXJpZW5jZVJvdyhleHBJZCwgLTEpO1xuICAgIH0gZWxzZSBpZiAoYWN0aW9uID09PSAncm93LWRvd24nKSB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgbW92ZUV4cGVyaWVuY2VSb3coZXhwSWQsICsxKTtcbiAgICB9IGVsc2UgaWYgKGFjdGlvbikge1xuICAgICAgaGFuZGxlQWN0aW9uQ2xpY2soZXhwSWQsIGFjdGlvbiwgJ2V4cGVyaWVuY2UnKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIEJ1bGsgdG9vbGJhclxuICBjb25zdCBleHBUb29sYmFyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGV4cFRvb2xiYXIuY2xhc3NOYW1lID0gJ2J1bGstdG9vbGJhcic7XG4gIGV4cFRvb2xiYXIuaW5uZXJIVE1MID0gYFxuICAgIDxzcGFuPkJ1bGs6PC9zcGFuPlxuICAgIDxidXR0b24gY2xhc3M9XCJidWxrLWJ0biBidWxrLXJlY29tbWVuZGVkXCIgb25jbGljaz1cImJ1bGtBY3Rpb24oJ3JlY29tbWVuZGVkJywnZXhwZXJpZW5jZScpXCIgdGl0bGU9XCJTZXQgYWxsIHRvIHRoZSBMTE0gcmVjb21tZW5kYXRpb25cIj5cdTI3MjggQWNjZXB0IEFsbCBSZWNvbW1lbmRlZDwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJidWxrLWJ0biBidWxrLWVtcGhhc2l6ZVwiICAgb25jbGljaz1cImJ1bGtBY3Rpb24oJ2VtcGhhc2l6ZScsJ2V4cGVyaWVuY2UnKVwiPlx1Mjc5NSBFbXBoYXNpemUgQWxsPC9idXR0b24+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImJ1bGstYnRuIGJ1bGstaW5jbHVkZVwiICAgICBvbmNsaWNrPVwiYnVsa0FjdGlvbignaW5jbHVkZScsJ2V4cGVyaWVuY2UnKVwiPlx1MjcxMyBJbmNsdWRlIEFsbDwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJidWxrLWJ0biBidWxrLWV4Y2x1ZGVcIiAgICAgb25jbGljaz1cImJ1bGtBY3Rpb24oJ2V4Y2x1ZGUnLCdleHBlcmllbmNlJylcIj4ke2V5ZVNsYXNoSWNvbigpfSBFeGNsdWRlIEFsbDwvYnV0dG9uPlxuICBgO1xuICBjb250YWluZXIuaW5zZXJ0QmVmb3JlKGV4cFRvb2xiYXIsIGNvbnRhaW5lci5maXJzdENoaWxkKTtcblxuICAvLyBJbml0aWFsaXplIERhdGFUYWJsZSB3aXRoIG5vIGF1dG8tc29ydCAocm93cyBzdGF5IGluIHVzZXItc3BlY2lmaWVkIG9yZGVyKVxuICAkKCcjZXhwZXJpZW5jZS1yZXZpZXctdGFibGUnKS5EYXRhVGFibGUoe1xuICAgIHBhZ2luZzogZmFsc2UsXG4gICAgb3JkZXI6IFtdLFxuICAgIGxhbmd1YWdlOiB7IHNlYXJjaDogJ0ZpbHRlciBleHBlcmllbmNlczonIH1cbiAgfSk7XG4gIF91cGRhdGVQYWdlRXN0aW1hdGUoKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFJvdyByZW9yZGVyIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBtb3ZlRXhwZXJpZW5jZVJvdyhleHBJZCwgZGlyZWN0aW9uKSB7XG4gIGNvbnN0IGFyciA9IHdpbmRvdy5fZXhwZXJpZW5jZXNPcmRlcmVkO1xuICBpZiAoIWFycikgcmV0dXJuO1xuICBjb25zdCBpZHggPSBhcnIuZmluZEluZGV4KGUgPT4gZS5pZCA9PT0gZXhwSWQpO1xuICBpZiAoaWR4IDwgMCkgcmV0dXJuO1xuICBjb25zdCBuZXdJZHggPSBpZHggKyBkaXJlY3Rpb247XG4gIGlmIChuZXdJZHggPCAwIHx8IG5ld0lkeCA+PSBhcnIubGVuZ3RoKSByZXR1cm47XG4gIFthcnJbaWR4XSwgYXJyW25ld0lkeF1dID0gW2FycltuZXdJZHhdLCBhcnJbaWR4XV07XG4gIHdpbmRvdy5fZXhwZXJpZW5jZXNPcmRlcmVkID0gYXJyO1xuICBfcmVuZGVyRXhwZXJpZW5jZVRhYmxlKG51bGwsIG51bGwsIG51bGwpO1xuICAvLyBQZXJzaXN0IHRoZSBuZXcgb3JkZXIgdG8gdGhlIGJhY2tlbmQgKGZpcmUtYW5kLWZvcmdldDsgbm8gVUkgYmxvY2spXG4gIGZldGNoKCcvYXBpL3Jlb3JkZXItcm93cycsIHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHR5cGU6ICdleHBlcmllbmNlJywgb3JkZXJlZF9pZHM6IGFyci5tYXAoZSA9PiBlLmlkKSB9KVxuICB9KS5jYXRjaCgoKSA9PiB7fSk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBMZWdhY3kgaW50ZXJhY3RpdmUtbW9kZSByZXNwb25zZSBoYW5kbGVyIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVFeHBlcmllbmNlUmVzcG9uc2UobWVzc2FnZSkge1xuICB3aW5kb3cud2FpdGluZ0ZvckV4cGVyaWVuY2VSZXNwb25zZSA9IGZhbHNlO1xuICBjb25zdCByZXNwb25zZSA9IG1lc3NhZ2UudG9Mb3dlckNhc2UoKTtcblxuICBpZiAocmVzcG9uc2UuaW5jbHVkZXMoJ3llcycpKSB7XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ0dyZWF0ISBJXFwnbGwgaW5jbHVkZSB0aGlzIGV4cGVyaWVuY2UgcHJvbWluZW50bHkuJyk7XG4gIH0gZWxzZSBpZiAocmVzcG9uc2UuaW5jbHVkZXMoJ25vJykpIHtcbiAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCAnVW5kZXJzdG9vZC4gSVxcJ2xsIGV4Y2x1ZGUgdGhpcyBleHBlcmllbmNlIGZyb20gdGhlIGZpbmFsIENWLicpO1xuICB9IGVsc2UgaWYgKHJlc3BvbnNlLmluY2x1ZGVzKCdtYXliZScpKSB7XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ0lcXCdsbCBpbmNsdWRlIGl0IGJ1dCB3aXRoIGxlc3MgZW1waGFzaXMuJyk7XG4gIH0gZWxzZSB7XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ0lcXCdsbCBub3RlIHlvdXIgZmVlZGJhY2sgb24gdGhpcyBleHBlcmllbmNlLicpO1xuICB9XG5cbiAgLy8gTW92ZSB0byBuZXh0IGV4cGVyaWVuY2UgKGN1cnJlbnRJbmRleCBhbHJlYWR5IGluY3JlbWVudGVkIGluIHNob3dOZXh0RXhwZXJpZW5jZSlcbiAgc2V0VGltZW91dCgoKSA9PiBzaG93TmV4dEV4cGVyaWVuY2UoKSwgODAwKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFN1Ym1pdCBkZWNpc2lvbnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIHN1Ym1pdEV4cGVyaWVuY2VEZWNpc2lvbnMoKSB7XG4gIC8qIGR1Y2tmbG93OlxuICAgKiAgIGlkOiBleHBlcmllbmNlX3VpX3N1Ym1pdF9saXZlXG4gICAqICAga2luZDogdWlcbiAgICogICB0aW1lc3RhbXA6ICcyMDI2LTAzLTI1VDIxOjM5OjQ4WidcbiAgICogICBzdGF0dXM6IGxpdmVcbiAgICogICBoYW5kbGVzOlxuICAgKiAgIC0gdWk6ZXhwZXJpZW5jZS1yZXZpZXcuc3VibWl0XG4gICAqICAgY2FsbHM6XG4gICAqICAgLSBQT1NUIC9hcGkvcmV2aWV3LWRlY2lzaW9uc1xuICAgKiAgIC0gUE9TVCAvYXBpL2N2L2xheW91dC1lc3RpbWF0ZVxuICAgKiAgIHJlYWRzOlxuICAgKiAgIC0gd2luZG93OnVzZXJTZWxlY3Rpb25zLmV4cGVyaWVuY2VzXG4gICAqICAgd3JpdGVzOlxuICAgKiAgIC0gcmVxdWVzdDpQT1NUIC9hcGkvcmV2aWV3LWRlY2lzaW9ucy5kZWNpc2lvbnNcbiAgICogICAtIHdpbmRvdzpfc2F2ZWREZWNpc2lvbnMuZXhwZXJpZW5jZV9kZWNpc2lvbnNcbiAgICogICBub3RlczogUGVyc2lzdHMgcGVyLWV4cGVyaWVuY2UgaW5jbHVzaW9uIGRlY2lzaW9ucyBhbmQgdHJpZ2dlcnMgZG93bnN0cmVhbSBBVFMvbGF5b3V0IHJlZnJlc2hlcyB0aGF0IGRlcGVuZCBvbiB0aGUgc2FtZSByZXZpZXcgY2hvaWNlcy5cbiAgICovXG4gIGNvbnN0IGRlY2lzaW9ucyA9IHVzZXJTZWxlY3Rpb25zLmV4cGVyaWVuY2VzO1xuICBjb25zdCBjb3VudCA9IE9iamVjdC5rZXlzKGRlY2lzaW9ucykubGVuZ3RoO1xuXG4gIGlmIChjb3VudCA9PT0gMCkge1xuICAgIHNob3dBbGVydE1vZGFsKCdObyBTZWxlY3Rpb25zJywgJ1BsZWFzZSBzZWxlY3QgYWN0aW9ucyBmb3IgYXQgbGVhc3Qgb25lIGV4cGVyaWVuY2UgYmVmb3JlIHN1Ym1pdHRpbmcuJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3Jldmlldy1kZWNpc2lvbnMnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICB0eXBlOiAnZXhwZXJpZW5jZXMnLFxuICAgICAgICBkZWNpc2lvbnM6IGRlY2lzaW9uc1xuICAgICAgfSlcbiAgICB9KTtcblxuICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgc3RhdGVNYW5hZ2VyLm1hcmtDb250ZW50Q2hhbmdlZCgpO1xuICAgICAgc2hvd1RvYXN0KGBFeHBlcmllbmNlIGRlY2lzaW9ucyBzYXZlZCAoJHtjb3VudH0gaXRlbXMpYCk7XG4gICAgICBzY2hlZHVsZUF0c1JlZnJlc2goKTtcbiAgICAgIC8vIFBlcnNpc3Qgc2F2ZWQgZGVjaXNpb25zIGxvY2FsbHkgc28gdGhlIFVJIHJlZmxlY3RzIHRoZW0gaW1tZWRpYXRlbHlcbiAgICAgIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMgPSB3aW5kb3cuX3NhdmVkRGVjaXNpb25zIHx8IHt9O1xuICAgICAgd2luZG93Ll9zYXZlZERlY2lzaW9ucy5leHBlcmllbmNlX2RlY2lzaW9ucyA9IGRlY2lzaW9ucztcbiAgICAgIHVzZXJTZWxlY3Rpb25zLmV4cGVyaWVuY2VzID0geyAuLi5kZWNpc2lvbnMgfTtcbiAgICAgIGlmICh0eXBlb2YgdXBkYXRlSW5jbHVzaW9uQ291bnRzID09PSAnZnVuY3Rpb24nKSB1cGRhdGVJbmNsdXNpb25Db3VudHMoKTtcbiAgICAgIHN3aXRjaFRhYignYWNoLWVkaXRvcicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBlcnJvciA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIHNob3dUb2FzdChgRXJyb3I6ICR7ZXJyb3IuZXJyb3IgfHwgJ0ZhaWxlZCB0byBzYXZlIGRlY2lzaW9ucyd9YCwgJ2Vycm9yJyk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy5lcnJvcignRXJyb3Igc3VibWl0dGluZyBleHBlcmllbmNlIGRlY2lzaW9uczonLCBlcnJvcik7XG4gICAgc2hvd1RvYXN0KCdGYWlsZWQgdG8gc2F2ZSBkZWNpc2lvbnMuIFBsZWFzZSB0cnkgYWdhaW4uJywgJ2Vycm9yJyk7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIEV4cG9ydHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmV4cG9ydCB7XG4gIGdldEV4cGVyaWVuY2VEZXRhaWxzLFxuICBidWlsZEV4cGVyaWVuY2VSZXZpZXdUYWJsZSxcbiAgX3JlbmRlckV4cGVyaWVuY2VUYWJsZSxcbiAgbW92ZUV4cGVyaWVuY2VSb3csXG4gIGhhbmRsZUV4cGVyaWVuY2VSZXNwb25zZSxcbiAgc3VibWl0RXhwZXJpZW5jZURlY2lzaW9ucyxcbn07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9za2lsbHMtcmV2aWV3LmpzXG4gKiBTa2lsbHMtcmV2aWV3IHRhYmxlOiBmZXRjaCwgcmVuZGVyLCByb3ctcmVvcmRlciwgYW5kIHN1Ym1pdCBkZWNpc2lvbnMuXG4gKlxuICogRGVwZW5kZW5jaWVzIChyZXNvbHZlZCB0aHJvdWdoIGdsb2JhbFRoaXMgYXQgcnVudGltZSk6XG4gKiAgIHVzZXJTZWxlY3Rpb25zLCBwZW5kaW5nUmVjb21tZW5kYXRpb25zLCBfc2F2ZWREZWNpc2lvbnMsIF9za2lsbHNPcmRlcmVkLFxuICogICBfbmV3U2tpbGxzRnJvbUxMTSwgdGFiRGF0YSwgcGFyc2VTdGF0dXNSZXNwb25zZSxcbiAqICAgZ2V0U2tpbGxSZWNvbW1lbmRhdGlvbiwgZ2V0U2tpbGxDb25maWRlbmNlLCBnZXRTa2lsbFJlYXNvbmluZyxcbiAqICAgZXNjYXBlSHRtbCwgaGFuZGxlQWN0aW9uQ2xpY2ssIGJ1bGtBY3Rpb24sIF91cGRhdGVQYWdlRXN0aW1hdGUsXG4gKiAgIHVwZGF0ZUluY2x1c2lvbkNvdW50cywgc3dpdGNoVGFiLFxuICogICBzaG93QWxlcnRNb2RhbCwgc2hvd1RvYXN0LCBzY2hlZHVsZUF0c1JlZnJlc2gsXG4gKiAgICQsICQuZm4uRGF0YVRhYmxlIChqUXVlcnkgKyBEYXRhVGFibGVzKVxuICovXG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmNvbnN0IGxvZyA9IGdldExvZ2dlcignc2tpbGxzLXJldmlldycpO1xuXG5pbXBvcnQgeyBzdGF0ZU1hbmFnZXIgfSBmcm9tICcuL3N0YXRlLW1hbmFnZXIuanMnO1xuaW1wb3J0IHsgZXllU2xhc2hJY29uIH0gZnJvbSAnLi9yZXZpZXctaWNvbnMuanMnO1xuXG4vLyBcdTI1MDBcdTI1MDAgWWVhcnMtZnJvbS1leHBlcmllbmNlIGhlbHBlcnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIF9wYXJzZVllYXJGcm9tU3RyKHN0cikge1xuICBpZiAoIXN0cikgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHMgPSBTdHJpbmcoc3RyKS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgaWYgKFsnY3VycmVudCcsICdwcmVzZW50JywgJ25vdycsICdvbmdvaW5nJ10uaW5jbHVkZXMocykpIHJldHVybiBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCk7XG4gIGNvbnN0IG0gPSBzLm1hdGNoKC9cXGIoMTl8MjApXFxkezJ9XFxiLyk7XG4gIHJldHVybiBtID8gcGFyc2VJbnQobVswXSwgMTApIDogbnVsbDtcbn1cblxuLyoqXG4gKiBHaXZlbiBhIGxpc3Qgb2YgZXhwZXJpZW5jZSBJRHMgYW5kIHRoZSBmdWxsIGV4cGVyaWVuY2VzIGFycmF5LCByZXR1cm5cbiAqIHRoZSB0b3RhbCB5ZWFycyBvZiBleHBlcmllbmNlIChzdW0gb2YgZHVyYXRpb24gb2YgbWF0Y2hlZCBlbnRyaWVzKS5cbiAqIFJldHVybnMgbnVsbCBpZiBubyBtYXRjaGluZyBlbnRyaWVzIGZvdW5kLlxuICovXG5mdW5jdGlvbiBfY29tcHV0ZVllYXJzRnJvbUlkcyhpZHMsIGFsbEV4cGVyaWVuY2VzKSB7XG4gIGNvbnN0IGlkU2V0ID0gbmV3IFNldCgoaWRzIHx8IFtdKS5tYXAoeCA9PiBTdHJpbmcoeCkudHJpbSgpKS5maWx0ZXIoQm9vbGVhbikpO1xuICBpZiAoaWRTZXQuc2l6ZSA9PT0gMCkgcmV0dXJuIG51bGw7XG4gIGxldCB0b3RhbCA9IDA7XG4gIGNvbnN0IGN1cnJlbnRZZWFyID0gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpO1xuICBmb3IgKGNvbnN0IGV4cCBvZiAoYWxsRXhwZXJpZW5jZXMgfHwgW10pKSB7XG4gICAgaWYgKCFleHAgfHwgdHlwZW9mIGV4cCAhPT0gJ29iamVjdCcpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGV4cElkID0gU3RyaW5nKGV4cC5pZCB8fCAnJykudHJpbSgpO1xuICAgIGlmICghaWRTZXQuaGFzKGV4cElkKSkgY29udGludWU7XG4gICAgY29uc3Qgc3RhcnRZZWFyID0gX3BhcnNlWWVhckZyb21TdHIoZXhwLnN0YXJ0X2RhdGUgfHwgZXhwLnN0YXJ0KTtcbiAgICBjb25zdCBlbmRZZWFyICAgPSBfcGFyc2VZZWFyRnJvbVN0cihleHAuZW5kX2RhdGUgICB8fCBleHAuZW5kKSA/PyBjdXJyZW50WWVhcjtcbiAgICB0b3RhbCArPSBzdGFydFllYXIgPT0gbnVsbCA/IDEgOiBNYXRoLm1heCgxLCBlbmRZZWFyIC0gc3RhcnRZZWFyICsgMSk7XG4gIH1cbiAgcmV0dXJuIHRvdGFsID4gMCA/IHRvdGFsIDogbnVsbDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZVNraWxsR3JvdXBPdmVycmlkZShza2lsbE5hbWUsIGdyb3VwTmFtZSkge1xuICBjb25zdCBub3JtYWxpemVkR3JvdXAgPSBncm91cE5hbWUgPT0gbnVsbCA/IG51bGwgOiBTdHJpbmcoZ3JvdXBOYW1lKS50cmltKCkgfHwgbnVsbDtcbiAgY29uc3Qgc2sgPSAod2luZG93Ll9za2lsbHNPcmRlcmVkIHx8IFtdKS5maW5kKHMgPT4gKHR5cGVvZiBzID09PSAnc3RyaW5nJyA/IHMgOiBzLm5hbWUgfHwgcykgPT09IHNraWxsTmFtZSk7XG4gIGlmIChzayAmJiB0eXBlb2Ygc2sgPT09ICdvYmplY3QnKSBzay5ncm91cCA9IG5vcm1hbGl6ZWRHcm91cCB8fCAnJztcblxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3Jldmlldy1za2lsbC1ncm91cCcsIHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHNraWxsOiBza2lsbE5hbWUsIGdyb3VwOiBub3JtYWxpemVkR3JvdXAgfSksXG4gIH0pO1xuXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICBjb25zdCBlcnJvciA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3IuZXJyb3IgfHwgJ0ZhaWxlZCB0byBzYXZlIHNraWxsIGdyb3VwJyk7XG4gIH1cblxuICByZXR1cm4gcmVzcG9uc2U7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNhdmVTa2lsbENhdGVnb3J5T3ZlcnJpZGUoc2tpbGxOYW1lLCBjYXRlZ29yeU5hbWUpIHtcbiAgY29uc3Qgbm9ybWFsaXplZENhdGVnb3J5ID0gY2F0ZWdvcnlOYW1lID09IG51bGwgPyBudWxsIDogU3RyaW5nKGNhdGVnb3J5TmFtZSkudHJpbSgpIHx8IG51bGw7XG4gIGNvbnN0IHNrID0gKHdpbmRvdy5fc2tpbGxzT3JkZXJlZCB8fCBbXSkuZmluZChzID0+ICh0eXBlb2YgcyA9PT0gJ3N0cmluZycgPyBzIDogcy5uYW1lIHx8IHMpID09PSBza2lsbE5hbWUpO1xuICBpZiAoc2sgJiYgdHlwZW9mIHNrID09PSAnb2JqZWN0Jykge1xuICAgIGlmIChub3JtYWxpemVkQ2F0ZWdvcnkpIHNrLmNhdGVnb3J5ID0gbm9ybWFsaXplZENhdGVnb3J5O1xuICAgIGVsc2UgZGVsZXRlIHNrLmNhdGVnb3J5O1xuICB9XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9yZXZpZXctc2tpbGwtY2F0ZWdvcnknLCB7XG4gICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBza2lsbDogc2tpbGxOYW1lLCBjYXRlZ29yeTogbm9ybWFsaXplZENhdGVnb3J5IH0pLFxuICB9KTtcblxuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgY29uc3QgZXJyb3IgPSBhd2FpdCByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGVycm9yLmVycm9yIHx8ICdGYWlsZWQgdG8gc2F2ZSBza2lsbCBjYXRlZ29yeScpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3BvbnNlO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW5hbWVTa2lsbENhdGVnb3J5KG9sZENhdGVnb3J5LCBuZXdDYXRlZ29yeSkge1xuICBjb25zdCBub3JtYWxpemVkT2xkID0gU3RyaW5nKG9sZENhdGVnb3J5IHx8ICcnKS50cmltKCk7XG4gIGNvbnN0IG5vcm1hbGl6ZWROZXcgPSBTdHJpbmcobmV3Q2F0ZWdvcnkgfHwgJycpLnRyaW0oKTtcblxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3Jldmlldy1za2lsbC1jYXRlZ29yaWVzJywge1xuICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGFjdGlvbjogJ3JlbmFtZScsXG4gICAgICBvbGRfY2F0ZWdvcnk6IG5vcm1hbGl6ZWRPbGQsXG4gICAgICBuZXdfY2F0ZWdvcnk6IG5vcm1hbGl6ZWROZXcsXG4gICAgfSksXG4gIH0pO1xuXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICBjb25zdCBlcnJvciA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3IuZXJyb3IgfHwgJ0ZhaWxlZCB0byByZW5hbWUgc2tpbGwgY2F0ZWdvcnknKTtcbiAgfVxuXG4gIHJldHVybiByZXNwb25zZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZVNraWxsQ2F0ZWdvcnlPcmRlcihvcmRlcmVkQ2F0ZWdvcmllcykge1xuICBjb25zdCBub3JtYWxpemVkT3JkZXIgPSBBcnJheS5mcm9tKG5ldyBTZXQoXG4gICAgKG9yZGVyZWRDYXRlZ29yaWVzIHx8IFtdKVxuICAgICAgLm1hcChjYXRlZ29yeSA9PiBTdHJpbmcoY2F0ZWdvcnkgfHwgJycpLnRyaW0oKSlcbiAgICAgIC5maWx0ZXIoQm9vbGVhbiksXG4gICkpO1xuXG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvcmV2aWV3LXNraWxsLWNhdGVnb3JpZXMnLCB7XG4gICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgYWN0aW9uOiAncmVvcmRlcicsXG4gICAgICBvcmRlcmVkX2NhdGVnb3JpZXM6IG5vcm1hbGl6ZWRPcmRlcixcbiAgICB9KSxcbiAgfSk7XG5cbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIGNvbnN0IGVycm9yID0gYXdhaXQgcmVzcG9uc2UuanNvbigpLmNhdGNoKCgpID0+ICh7fSkpO1xuICAgIHRocm93IG5ldyBFcnJvcihlcnJvci5lcnJvciB8fCAnRmFpbGVkIHRvIHNhdmUgc2tpbGwgY2F0ZWdvcnkgb3JkZXInKTtcbiAgfVxuXG4gIHJldHVybiByZXNwb25zZTtcbn1cblxuZnVuY3Rpb24gX25vcm1hbGl6ZVNraWxsU3Vic2tpbGxzKHZhbHVlKSB7XG4gIGNvbnN0IHJhd1ZhbHVlcyA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBTdHJpbmcodmFsdWUgfHwgJycpLnNwbGl0KCcsJyk7XG4gIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQoXG4gICAgcmF3VmFsdWVzXG4gICAgICAubWFwKGl0ZW0gPT4gU3RyaW5nKGl0ZW0gfHwgJycpLnRyaW0oKSlcbiAgICAgIC5maWx0ZXIoQm9vbGVhbiksXG4gICkpO1xufVxuXG5mdW5jdGlvbiBfc2tpbGxOYW1lKHNraWxsKSB7XG4gIHJldHVybiB0eXBlb2Ygc2tpbGwgPT09ICdzdHJpbmcnID8gc2tpbGwgOiBTdHJpbmcoc2tpbGw/Lm5hbWUgfHwgc2tpbGwgfHwgJycpLnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gX25vcm1hbGl6ZUV4dHJhU2tpbGxFbnRyeShyYXdTa2lsbCwgeyB1c2VyQ3JlYXRlZCA9IGZhbHNlIH0gPSB7fSkge1xuICBpZiAodHlwZW9mIHJhd1NraWxsID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IG5hbWUgPSByYXdTa2lsbC50cmltKCk7XG4gICAgcmV0dXJuIG5hbWUgPyB7IG5hbWUsIF9pc05ldzogdHJ1ZSB9IDogbnVsbDtcbiAgfVxuICBpZiAoIXJhd1NraWxsIHx8IHR5cGVvZiByYXdTa2lsbCAhPT0gJ29iamVjdCcpIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IG5hbWUgPSBTdHJpbmcocmF3U2tpbGwubmFtZSB8fCAnJykudHJpbSgpO1xuICBpZiAoIW5hbWUpIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSB7XG4gICAgLi4ucmF3U2tpbGwsXG4gICAgbmFtZSxcbiAgICBfaXNOZXc6IHRydWUsXG4gIH07XG4gIGNvbnN0IHN1YnNraWxscyA9IF9ub3JtYWxpemVTa2lsbFN1YnNraWxscyhyYXdTa2lsbC5zdWJza2lsbHMgfHwgcmF3U2tpbGwuc3ViX3NraWxscyB8fCBbXSk7XG4gIGlmIChzdWJza2lsbHMubGVuZ3RoID4gMCkgbm9ybWFsaXplZC5zdWJza2lsbHMgPSBzdWJza2lsbHM7XG4gIGVsc2UgZGVsZXRlIG5vcm1hbGl6ZWQuc3Vic2tpbGxzO1xuXG4gIGlmICh1c2VyQ3JlYXRlZCB8fCByYXdTa2lsbC51c2VyX2NyZWF0ZWQgfHwgcmF3U2tpbGwuX2lzVXNlckNyZWF0ZWQpIHtcbiAgICBub3JtYWxpemVkLnVzZXJfY3JlYXRlZCA9IHRydWU7XG4gICAgbm9ybWFsaXplZC5faXNVc2VyQ3JlYXRlZCA9IHRydWU7XG4gIH1cblxuICByZXR1cm4gbm9ybWFsaXplZDtcbn1cblxuZnVuY3Rpb24gX3NraWxsSW5saW5lTGFiZWwoc2tpbGwpIHtcbiAgaWYgKCFza2lsbCB8fCB0eXBlb2Ygc2tpbGwgPT09ICdzdHJpbmcnKSByZXR1cm4gX3NraWxsTmFtZShza2lsbCk7XG4gIGNvbnN0IG5hbWUgPSBfc2tpbGxOYW1lKHNraWxsKTtcbiAgY29uc3QgcGFyZW50aGV0aWNhbCA9IFN0cmluZyhza2lsbC5wYXJlbnRoZXRpY2FsIHx8ICcnKS50cmltKCk7XG4gIGlmIChwYXJlbnRoZXRpY2FsKSByZXR1cm4gYCR7bmFtZX0gKCR7cGFyZW50aGV0aWNhbH0pYDtcblxuICBjb25zdCBxdWFsaWZpZXJQYXJ0cyA9IFtdO1xuICBjb25zdCBwcm9maWNpZW5jeSA9IFN0cmluZyhza2lsbC5wcm9maWNpZW5jeSB8fCAnJykudHJpbSgpO1xuICBpZiAocHJvZmljaWVuY3kpIHF1YWxpZmllclBhcnRzLnB1c2gocHJvZmljaWVuY3kuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBwcm9maWNpZW5jeS5zbGljZSgxKSk7XG4gIF9ub3JtYWxpemVTa2lsbFN1YnNraWxscyhza2lsbC5zdWJza2lsbHMgfHwgc2tpbGwuc3ViX3NraWxscyB8fCBbXSkuZm9yRWFjaChpdGVtID0+IHF1YWxpZmllclBhcnRzLnB1c2goaXRlbSkpO1xuICBpZiAocXVhbGlmaWVyUGFydHMubGVuZ3RoID4gMCkgcmV0dXJuIGAke25hbWV9ICgke3F1YWxpZmllclBhcnRzLmpvaW4oJywgJyl9KWA7XG4gIHJldHVybiBuYW1lO1xufVxuXG5mdW5jdGlvbiBfZmluZFNraWxsUmVjb21tZW5kYXRpb25SZWNvcmQoc2tpbGxOYW1lLCBkYXRhKSB7XG4gIGlmICghZGF0YSB8fCAhQXJyYXkuaXNBcnJheShkYXRhLnNraWxsX3JlY29tbWVuZGF0aW9ucykpIHJldHVybiBudWxsO1xuICByZXR1cm4gZGF0YS5za2lsbF9yZWNvbW1lbmRhdGlvbnMuZmluZCgocmVjKSA9PiB7XG4gICAgY29uc3QgcmVjTmFtZSA9IFN0cmluZyhyZWM/LnNraWxsIHx8IHJlYz8ubmFtZSB8fCAnJykudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIHJlY05hbWUgPT09IFN0cmluZyhza2lsbE5hbWUgfHwgJycpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICB9KSB8fCBudWxsO1xufVxuXG5mdW5jdGlvbiBfYnVpbGRTa2lsbEdyb3VwaW5nU3VnZ2VzdGlvbihyZWMsIHNraWxsKSB7XG4gIGNvbnN0IGdyb3VwaW5nID0gcmVjICYmIHR5cGVvZiByZWMuZ3JvdXBpbmcgPT09ICdvYmplY3QnID8gcmVjLmdyb3VwaW5nIDogbnVsbDtcbiAgaWYgKCFncm91cGluZykgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgY3VycmVudENhdGVnb3J5ID0gdHlwZW9mIHNraWxsID09PSAnb2JqZWN0JyA/IFN0cmluZyhza2lsbC5jYXRlZ29yeSB8fCAnJykudHJpbSgpIDogJyc7XG4gIGNvbnN0IGN1cnJlbnRHcm91cCA9IHR5cGVvZiBza2lsbCA9PT0gJ29iamVjdCcgPyBTdHJpbmcoc2tpbGwuZ3JvdXAgfHwgJycpLnRyaW0oKSA6ICcnO1xuICBjb25zdCBzdWdnZXN0ZWRDYXRlZ29yeSA9IFN0cmluZyhncm91cGluZy5jYXRlZ29yeSB8fCAnJykudHJpbSgpO1xuICBjb25zdCBzdWdnZXN0ZWRHcm91cCA9IFN0cmluZyhncm91cGluZy5ncm91cCB8fCAnJykudHJpbSgpO1xuICBjb25zdCBjYXRlZ29yeUNoYW5nZWQgPSBCb29sZWFuKHN1Z2dlc3RlZENhdGVnb3J5ICYmIHN1Z2dlc3RlZENhdGVnb3J5ICE9PSBjdXJyZW50Q2F0ZWdvcnkpO1xuICBjb25zdCBncm91cENoYW5nZWQgPSBCb29sZWFuKHN1Z2dlc3RlZEdyb3VwICYmIHN1Z2dlc3RlZEdyb3VwICE9PSBjdXJyZW50R3JvdXApO1xuXG4gIGlmICghY2F0ZWdvcnlDaGFuZ2VkICYmICFncm91cENoYW5nZWQpIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IGNoYW5nZVBhcnRzID0gW107XG4gIGlmIChjYXRlZ29yeUNoYW5nZWQpIHtcbiAgICBjaGFuZ2VQYXJ0cy5wdXNoKGBDYXRlZ29yeTogJHtjdXJyZW50Q2F0ZWdvcnkgfHwgJ1VuY2F0ZWdvcml6ZWQnfSAtPiAke3N1Z2dlc3RlZENhdGVnb3J5fWApO1xuICB9XG4gIGlmIChncm91cENoYW5nZWQpIHtcbiAgICBjaGFuZ2VQYXJ0cy5wdXNoKGBHcm91cDogJHtjdXJyZW50R3JvdXAgfHwgJ05vbmUnfSAtPiAke3N1Z2dlc3RlZEdyb3VwfWApO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBjYXRlZ29yeTogc3VnZ2VzdGVkQ2F0ZWdvcnksXG4gICAgZ3JvdXA6IHN1Z2dlc3RlZEdyb3VwLFxuICAgIGNhdGVnb3J5Q2hhbmdlZCxcbiAgICBncm91cENoYW5nZWQsXG4gICAgY2hhbmdlVGV4dDogY2hhbmdlUGFydHMuam9pbignIHwgJyksXG4gICAgcmVhc29uaW5nOiBTdHJpbmcoZ3JvdXBpbmcucmVhc29uaW5nIHx8ICcnKS50cmltKCksXG4gICAgYXRzSW1wYWN0OiBTdHJpbmcoZ3JvdXBpbmcuYXRzX2ltcGFjdCB8fCAnJykudHJpbSgpLFxuICAgIHBhZ2VMZW5ndGhJbXBhY3Q6IFN0cmluZyhncm91cGluZy5wYWdlX2xlbmd0aF9pbXBhY3QgfHwgJycpLnRyaW0oKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gX2Nzc0VzY2FwZSh2YWx1ZSkge1xuICBpZiAoZ2xvYmFsVGhpcy5DU1MgJiYgdHlwZW9mIGdsb2JhbFRoaXMuQ1NTLmVzY2FwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBnbG9iYWxUaGlzLkNTUy5lc2NhcGUoU3RyaW5nKHZhbHVlKSk7XG4gIH1cbiAgcmV0dXJuIFN0cmluZyh2YWx1ZSkucmVwbGFjZSgvXFxcXC9nLCAnXFxcXFxcXFwnKS5yZXBsYWNlKC9cIi9nLCAnXFxcXFwiJyk7XG59XG5cbmZ1bmN0aW9uIF9idWlsZEdyb3VwV2FybmluZ3Moc2tpbGxzKSB7XG4gIGNvbnN0IHdhcm5pbmdNYXAgPSBuZXcgTWFwKCk7XG4gIGNvbnN0IGdyb3VwcyA9IG5ldyBNYXAoKTtcbiAgZm9yIChjb25zdCBza2lsbCBvZiBza2lsbHMgfHwgW10pIHtcbiAgICBpZiAoIXNraWxsIHx8IHR5cGVvZiBza2lsbCAhPT0gJ29iamVjdCcpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHNraWxsTmFtZSA9IF9za2lsbE5hbWUoc2tpbGwpO1xuICAgIGNvbnN0IGdyb3VwTmFtZSA9IFN0cmluZyhza2lsbC5ncm91cCB8fCAnJykudHJpbSgpO1xuICAgIGlmICghc2tpbGxOYW1lIHx8ICFncm91cE5hbWUpIGNvbnRpbnVlO1xuICAgIGlmICghZ3JvdXBzLmhhcyhncm91cE5hbWUpKSBncm91cHMuc2V0KGdyb3VwTmFtZSwgW10pO1xuICAgIGdyb3Vwcy5nZXQoZ3JvdXBOYW1lKS5wdXNoKF9za2lsbElubGluZUxhYmVsKHNraWxsKSk7XG4gIH1cblxuICBncm91cHMuZm9yRWFjaCgobGFiZWxzLCBncm91cE5hbWUpID0+IHtcbiAgICBjb25zdCBwcmV2aWV3ID0gbGFiZWxzLmpvaW4oJywgJyk7XG4gICAgY29uc3QgY3Jvd2RlZCA9IHByZXZpZXcubGVuZ3RoID49IDkwIHx8IGxhYmVscy5sZW5ndGggPj0gNTtcbiAgICBpZiAoIWNyb3dkZWQpIHJldHVybjtcbiAgICB3YXJuaW5nTWFwLnNldChncm91cE5hbWUsIHtcbiAgICAgIHByZXZpZXcsXG4gICAgICBtZW1iZXJDb3VudDogbGFiZWxzLmxlbmd0aCxcbiAgICAgIG1lc3NhZ2U6IGBJbmxpbmUgYnVsbGV0IG1heSBiZSBoYXJkIHRvIHNjYW4gKCR7bGFiZWxzLmxlbmd0aH0gc2tpbGxzLCAke3ByZXZpZXcubGVuZ3RofSBjaGFycykuYCxcbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHdhcm5pbmdNYXA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNhdmVTa2lsbFF1YWxpZmllck92ZXJyaWRlKHNraWxsTmFtZSwgcXVhbGlmaWVycykge1xuICBjb25zdCBub3JtYWxpemVkU2tpbGwgPSBTdHJpbmcoc2tpbGxOYW1lIHx8ICcnKS50cmltKCk7XG4gIGlmICghbm9ybWFsaXplZFNraWxsKSB0aHJvdyBuZXcgRXJyb3IoJ1NraWxsIG5hbWUgaXMgcmVxdWlyZWQnKTtcblxuICBjb25zdCBub3JtYWxpemVkUHJvZmljaWVuY3kgPSBTdHJpbmcocXVhbGlmaWVycz8ucHJvZmljaWVuY3kgfHwgJycpLnRyaW0oKTtcbiAgY29uc3Qgbm9ybWFsaXplZFN1YnNraWxscyA9IF9ub3JtYWxpemVTa2lsbFN1YnNraWxscyhxdWFsaWZpZXJzPy5zdWJza2lsbHMpO1xuICBjb25zdCBub3JtYWxpemVkUGFyZW50aGV0aWNhbCA9IFN0cmluZyhxdWFsaWZpZXJzPy5wYXJlbnRoZXRpY2FsIHx8ICcnKS50cmltKCk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRTa2lsbFR5cGUgPSBTdHJpbmcocXVhbGlmaWVycz8uc2tpbGxfdHlwZSB8fCAnJykudHJpbSgpLnRvTG93ZXJDYXNlKCkgfHwgbnVsbDtcblxuICBjb25zdCBzayA9ICh3aW5kb3cuX3NraWxsc09yZGVyZWQgfHwgW10pLmZpbmQocyA9PiAodHlwZW9mIHMgPT09ICdzdHJpbmcnID8gcyA6IHMubmFtZSB8fCBzKSA9PT0gbm9ybWFsaXplZFNraWxsKTtcbiAgaWYgKHNrICYmIHR5cGVvZiBzayA9PT0gJ29iamVjdCcpIHtcbiAgICBpZiAobm9ybWFsaXplZFByb2ZpY2llbmN5KSBzay5wcm9maWNpZW5jeSA9IG5vcm1hbGl6ZWRQcm9maWNpZW5jeTtcbiAgICBlbHNlIGRlbGV0ZSBzay5wcm9maWNpZW5jeTtcblxuICAgIGlmIChub3JtYWxpemVkU3Vic2tpbGxzLmxlbmd0aCA+IDApIHNrLnN1YnNraWxscyA9IG5vcm1hbGl6ZWRTdWJza2lsbHM7XG4gICAgZWxzZSBkZWxldGUgc2suc3Vic2tpbGxzO1xuXG4gICAgaWYgKG5vcm1hbGl6ZWRQYXJlbnRoZXRpY2FsKSBzay5wYXJlbnRoZXRpY2FsID0gbm9ybWFsaXplZFBhcmVudGhldGljYWw7XG4gICAgZWxzZSBkZWxldGUgc2sucGFyZW50aGV0aWNhbDtcbiAgfVxuXG4gIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgc2tpbGw6IG5vcm1hbGl6ZWRTa2lsbCxcbiAgICBwcm9maWNpZW5jeTogbm9ybWFsaXplZFByb2ZpY2llbmN5LFxuICAgIHN1YnNraWxsczogbm9ybWFsaXplZFN1YnNraWxscyxcbiAgICBwYXJlbnRoZXRpY2FsOiBub3JtYWxpemVkUGFyZW50aGV0aWNhbCxcbiAgfTtcbiAgaWYgKCdza2lsbF90eXBlJyBpbiAocXVhbGlmaWVycyB8fCB7fSkpIHtcbiAgICBwYXlsb2FkLnNraWxsX3R5cGUgPSBub3JtYWxpemVkU2tpbGxUeXBlO1xuICB9XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9yZXZpZXctc2tpbGwtcXVhbGlmaWVycycsIHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeShwYXlsb2FkKSxcbiAgfSk7XG5cbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIGNvbnN0IGVycm9yID0gYXdhaXQgcmVzcG9uc2UuanNvbigpLmNhdGNoKCgpID0+ICh7fSkpO1xuICAgIHRocm93IG5ldyBFcnJvcihlcnJvci5lcnJvciB8fCAnRmFpbGVkIHRvIHNhdmUgc2tpbGwgcXVhbGlmaWVycycpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3BvbnNlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzYXZlVXNlckNyZWF0ZWRTa2lsbChza2lsbCkge1xuICBjb25zdCBwYXlsb2FkID0ge1xuICAgIG5hbWU6IFN0cmluZyhza2lsbD8ubmFtZSB8fCAnJykudHJpbSgpLFxuICAgIGNhdGVnb3J5OiBTdHJpbmcoc2tpbGw/LmNhdGVnb3J5IHx8ICcnKS50cmltKCksXG4gICAgZ3JvdXA6IFN0cmluZyhza2lsbD8uZ3JvdXAgfHwgJycpLnRyaW0oKSxcbiAgICBwcm9maWNpZW5jeTogU3RyaW5nKHNraWxsPy5wcm9maWNpZW5jeSB8fCAnJykudHJpbSgpLFxuICAgIHN1YnNraWxsczogX25vcm1hbGl6ZVNraWxsU3Vic2tpbGxzKHNraWxsPy5zdWJza2lsbHMpLFxuICAgIHBhcmVudGhldGljYWw6IFN0cmluZyhza2lsbD8ucGFyZW50aGV0aWNhbCB8fCAnJykudHJpbSgpLFxuICB9O1xuICBpZiAoIXBheWxvYWQubmFtZSkgdGhyb3cgbmV3IEVycm9yKCdTa2lsbCBuYW1lIGlzIHJlcXVpcmVkJyk7XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9yZXZpZXctc2tpbGwtYWRkJywge1xuICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpLFxuICB9KTtcblxuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgY29uc3QgZXJyb3IgPSBhd2FpdCByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGVycm9yLmVycm9yIHx8ICdGYWlsZWQgdG8gYWRkIHNraWxsJyk7XG4gIH1cblxuICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBfbm9ybWFsaXplRXh0cmFTa2lsbEVudHJ5KHJlc3VsdC5za2lsbCwgeyB1c2VyQ3JlYXRlZDogdHJ1ZSB9KTtcbiAgaWYgKCFub3JtYWxpemVkKSB0aHJvdyBuZXcgRXJyb3IoJ1NlcnZlciBkaWQgbm90IHJldHVybiBhIHNraWxsJyk7XG5cbiAgY29uc3QgY3VycmVudCA9IEFycmF5LmlzQXJyYXkod2luZG93Ll9za2lsbHNPcmRlcmVkKSA/IHdpbmRvdy5fc2tpbGxzT3JkZXJlZCA6IFtdO1xuICB3aW5kb3cuX3NraWxsc09yZGVyZWQgPSBbbm9ybWFsaXplZCwgLi4uY3VycmVudC5maWx0ZXIoc2tpbGwgPT4gX3NraWxsTmFtZShza2lsbCkgIT09IG5vcm1hbGl6ZWQubmFtZSldO1xuXG4gIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMgPSB3aW5kb3cuX3NhdmVkRGVjaXNpb25zIHx8IHt9O1xuICBjb25zdCBleGlzdGluZ0V4dHJhcyA9IEFycmF5LmlzQXJyYXkod2luZG93Ll9zYXZlZERlY2lzaW9ucy5leHRyYV9za2lsbHMpXG4gICAgPyB3aW5kb3cuX3NhdmVkRGVjaXNpb25zLmV4dHJhX3NraWxsc1xuICAgIDogW107XG4gIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMuZXh0cmFfc2tpbGxzID0gW1xuICAgIG5vcm1hbGl6ZWQsXG4gICAgLi4uZXhpc3RpbmdFeHRyYXMuZmlsdGVyKHNraWxsID0+IF9za2lsbE5hbWUoc2tpbGwpICE9PSBub3JtYWxpemVkLm5hbWUpLFxuICBdO1xuXG4gIHVzZXJTZWxlY3Rpb25zLnNraWxsc1tub3JtYWxpemVkLm5hbWVdID0gdXNlclNlbGVjdGlvbnMuc2tpbGxzW25vcm1hbGl6ZWQubmFtZV0gfHwgJ2luY2x1ZGUnO1xuICByZXR1cm4gbm9ybWFsaXplZDtcbn1cblxuZnVuY3Rpb24gX2VmZmVjdGl2ZVNraWxsQ2F0ZWdvcnkoc2tpbGwpIHtcbiAgaWYgKCFza2lsbCB8fCB0eXBlb2Ygc2tpbGwgPT09ICdzdHJpbmcnKSByZXR1cm4gJyc7XG4gIHJldHVybiBTdHJpbmcoc2tpbGwuY2F0ZWdvcnkgfHwgJycpLnRyaW0oKSB8fCAnR2VuZXJhbCc7XG59XG5cbmZ1bmN0aW9uIF9zeW5jU2tpbGxDYXRlZ29yeU9yZGVyKCkge1xuICBjb25zdCBza2lsbHMgPSBBcnJheS5pc0FycmF5KHdpbmRvdy5fc2tpbGxzT3JkZXJlZCkgPyB3aW5kb3cuX3NraWxsc09yZGVyZWQgOiBbXTtcbiAgY29uc3Qgb3JkZXJlZCA9IFtdO1xuICBmb3IgKGNvbnN0IHNraWxsIG9mIHNraWxscykge1xuICAgIGNvbnN0IGNhdGVnb3J5ID0gX2VmZmVjdGl2ZVNraWxsQ2F0ZWdvcnkoc2tpbGwpO1xuICAgIGlmIChjYXRlZ29yeSAmJiAhb3JkZXJlZC5pbmNsdWRlcyhjYXRlZ29yeSkpIG9yZGVyZWQucHVzaChjYXRlZ29yeSk7XG4gIH1cbiAgd2luZG93Ll9za2lsbENhdGVnb3J5T3JkZXIgPSBvcmRlcmVkO1xuICByZXR1cm4gb3JkZXJlZDtcbn1cblxuZnVuY3Rpb24gX3JlbmFtZVNraWxsQ2F0ZWdvcnlMb2NhbGx5KG9sZENhdGVnb3J5LCBuZXdDYXRlZ29yeSkge1xuICBjb25zdCBub3JtYWxpemVkT2xkID0gU3RyaW5nKG9sZENhdGVnb3J5IHx8ICcnKS50cmltKCk7XG4gIGNvbnN0IG5vcm1hbGl6ZWROZXcgPSBTdHJpbmcobmV3Q2F0ZWdvcnkgfHwgJycpLnRyaW0oKTtcbiAgaWYgKCFub3JtYWxpemVkT2xkIHx8ICFub3JtYWxpemVkTmV3KSByZXR1cm47XG5cbiAgZm9yIChjb25zdCBza2lsbCBvZiAod2luZG93Ll9za2lsbHNPcmRlcmVkIHx8IFtdKSkge1xuICAgIGlmICghc2tpbGwgfHwgdHlwZW9mIHNraWxsICE9PSAnb2JqZWN0JykgY29udGludWU7XG4gICAgaWYgKF9lZmZlY3RpdmVTa2lsbENhdGVnb3J5KHNraWxsKSA9PT0gbm9ybWFsaXplZE9sZCkge1xuICAgICAgc2tpbGwuY2F0ZWdvcnkgPSBub3JtYWxpemVkTmV3O1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGN1cnJlbnRPcmRlciA9IEFycmF5LmlzQXJyYXkod2luZG93Ll9za2lsbENhdGVnb3J5T3JkZXIpXG4gICAgPyB3aW5kb3cuX3NraWxsQ2F0ZWdvcnlPcmRlclxuICAgIDogX3N5bmNTa2lsbENhdGVnb3J5T3JkZXIoKTtcbiAgd2luZG93Ll9za2lsbENhdGVnb3J5T3JkZXIgPSBjdXJyZW50T3JkZXIubWFwKGNhdGVnb3J5ID0+IChcbiAgICBjYXRlZ29yeSA9PT0gbm9ybWFsaXplZE9sZCA/IG5vcm1hbGl6ZWROZXcgOiBjYXRlZ29yeVxuICApKS5maWx0ZXIoKGNhdGVnb3J5LCBpbmRleCwgYXJyKSA9PiBjYXRlZ29yeSAmJiBhcnIuaW5kZXhPZihjYXRlZ29yeSkgPT09IGluZGV4KTtcbn1cblxuZnVuY3Rpb24gX21vdmVTa2lsbENhdGVnb3J5TG9jYWxseShjYXRlZ29yeU5hbWUsIGRpcmVjdGlvbikge1xuICBjb25zdCBub3JtYWxpemVkQ2F0ZWdvcnkgPSBTdHJpbmcoY2F0ZWdvcnlOYW1lIHx8ICcnKS50cmltKCk7XG4gIGNvbnN0IG9yZGVyID0gQXJyYXkuaXNBcnJheSh3aW5kb3cuX3NraWxsQ2F0ZWdvcnlPcmRlcilcbiAgICA/IFsuLi53aW5kb3cuX3NraWxsQ2F0ZWdvcnlPcmRlcl1cbiAgICA6IF9zeW5jU2tpbGxDYXRlZ29yeU9yZGVyKCk7XG4gIGNvbnN0IGluZGV4ID0gb3JkZXIuaW5kZXhPZihub3JtYWxpemVkQ2F0ZWdvcnkpO1xuICBpZiAoaW5kZXggPCAwKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgbmV4dEluZGV4ID0gaW5kZXggKyBkaXJlY3Rpb247XG4gIGlmIChuZXh0SW5kZXggPCAwIHx8IG5leHRJbmRleCA+PSBvcmRlci5sZW5ndGgpIHJldHVybiBudWxsO1xuICBbb3JkZXJbaW5kZXhdLCBvcmRlcltuZXh0SW5kZXhdXSA9IFtvcmRlcltuZXh0SW5kZXhdLCBvcmRlcltpbmRleF1dO1xuICB3aW5kb3cuX3NraWxsQ2F0ZWdvcnlPcmRlciA9IG9yZGVyO1xuICByZXR1cm4gb3JkZXI7XG59XG5cbmZ1bmN0aW9uIF9idWlsZFNraWxsQ2F0ZWdvcnlNYW5hZ2VySHRtbCgpIHtcbiAgY29uc3QgY2F0ZWdvcmllcyA9IEFycmF5LmlzQXJyYXkod2luZG93Ll9za2lsbENhdGVnb3J5T3JkZXIpXG4gICAgPyB3aW5kb3cuX3NraWxsQ2F0ZWdvcnlPcmRlclxuICAgIDogX3N5bmNTa2lsbENhdGVnb3J5T3JkZXIoKTtcbiAgaWYgKGNhdGVnb3JpZXMubGVuZ3RoID09PSAwKSByZXR1cm4gJyc7XG5cbiAgcmV0dXJuIGBcbiAgICA8ZGl2IGNsYXNzPVwic2tpbGwtY2F0ZWdvcnktbWFuYWdlclwiIHN0eWxlPVwibWFyZ2luOjAgMCAxMnB4O3BhZGRpbmc6MTJweDtib3JkZXI6MXB4IHNvbGlkICNlNWU3ZWI7Ym9yZGVyLXJhZGl1czoxMHB4O2JhY2tncm91bmQ6I2Y4ZmFmYztcIj5cbiAgICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo4cHg7XCI+Q2F0ZWdvcnkgTGF5b3V0PC9kaXY+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtnYXA6OHB4O1wiPlxuICAgICAgICAke2NhdGVnb3JpZXMubWFwKChjYXRlZ29yeSwgaW5kZXgpID0+IGBcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2tpbGwtY2F0ZWdvcnktbWFuYWdlci1yb3dcIiBkYXRhLWNhdGVnb3J5PVwiJHtlc2NhcGVIdG1sKGNhdGVnb3J5KX1cIiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6OHB4O2FsaWduLWl0ZW1zOmNlbnRlcjtcIj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwic2tpbGwtY2F0ZWdvcnktbWFuYWdlci1pbnB1dFwiXG4gICAgICAgICAgICAgIHZhbHVlPVwiJHtlc2NhcGVIdG1sKGNhdGVnb3J5KX1cIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiUmVuYW1lIHNraWxsIGNhdGVnb3J5ICR7ZXNjYXBlSHRtbChjYXRlZ29yeSl9XCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJmbGV4OjE7bWluLXdpZHRoOjA7cGFkZGluZzo2cHggOHB4O2JvcmRlcjoxcHggc29saWQgI2QxZDVkYjtib3JkZXItcmFkaXVzOjZweDtcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIGRhdGEtYWN0aW9uPVwiY2F0ZWdvcnktdXBcIiBkYXRhLWNhdGVnb3J5PVwiJHtlc2NhcGVIdG1sKGNhdGVnb3J5KX1cIiBhcmlhLWxhYmVsPVwiTW92ZSAke2VzY2FwZUh0bWwoY2F0ZWdvcnkpfSBjYXRlZ29yeSB1cFwiIHRpdGxlPVwiTW92ZSBjYXRlZ29yeSB1cFwiICR7aW5kZXggPT09IDAgPyAnZGlzYWJsZWQnIDogJyd9Plx1MjE5MTwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgZGF0YS1hY3Rpb249XCJjYXRlZ29yeS1kb3duXCIgZGF0YS1jYXRlZ29yeT1cIiR7ZXNjYXBlSHRtbChjYXRlZ29yeSl9XCIgYXJpYS1sYWJlbD1cIk1vdmUgJHtlc2NhcGVIdG1sKGNhdGVnb3J5KX0gY2F0ZWdvcnkgZG93blwiIHRpdGxlPVwiTW92ZSBjYXRlZ29yeSBkb3duXCIgJHtpbmRleCA9PT0gY2F0ZWdvcmllcy5sZW5ndGggLSAxID8gJ2Rpc2FibGVkJyA6ICcnfT5cdTIxOTM8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgYCkuam9pbignJyl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYDtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFJlcnVuIHNuYXBzaG90IChjaGFuZ2UgYmFkZ2UgZm9yIHNraWxscykgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5mdW5jdGlvbiBfc2tpbGxTbmFwc2hvdEtleSgpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzaWQgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpLmdldCgnc2Vzc2lvbicpO1xuICAgIHJldHVybiBzaWQgPyBgc2tpbGxfc25hcF8ke3NpZH1gIDogbnVsbDtcbiAgfSBjYXRjaCAoXykgeyByZXR1cm4gbnVsbDsgfVxufVxuZnVuY3Rpb24gX3NhdmVTa2lsbFNuYXBzaG90KHJlY29tbWVuZGVkTmFtZXMpIHtcbiAgY29uc3Qga2V5ID0gX3NraWxsU25hcHNob3RLZXkoKTtcbiAgaWYgKCFrZXkpIHJldHVybjtcbiAgdHJ5IHsgbG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCBKU09OLnN0cmluZ2lmeShbLi4ucmVjb21tZW5kZWROYW1lc10pKTsgfSBjYXRjaCAoXykge31cbn1cbmZ1bmN0aW9uIF9nZXRTa2lsbFNuYXBzaG90KCkge1xuICBjb25zdCBrZXkgPSBfc2tpbGxTbmFwc2hvdEtleSgpO1xuICBpZiAoIWtleSkgcmV0dXJuIG51bGw7XG4gIHRyeSB7XG4gICAgY29uc3QgcmF3ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KTtcbiAgICByZXR1cm4gcmF3ID8gbmV3IFNldChKU09OLnBhcnNlKHJhdykpIDogbnVsbDtcbiAgfSBjYXRjaCAoXykgeyByZXR1cm4gbnVsbDsgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgQnVpbGQgcmV2aWV3IHRhYmxlIChmZXRjaCArIGluaXRpYWxpc2UpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBidWlsZFNraWxsc1Jldmlld1RhYmxlKCkge1xuICBjb25zdCBkYXRhID0gd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnM7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbHMtdGFibGUtY29udGFpbmVyJyk7XG5cbiAgLy8gQnVpbGQgc2tpbGwtdHlwZSBsb29rdXAgZnJvbSBqb2IgYW5hbHlzaXMgKGF2YWlsYWJsZSBpbiB0YWJEYXRhLmFuYWx5c2lzKVxuICBjb25zdCBqb2JBbmFseXNpcyA9IHN0YXRlTWFuYWdlci5nZXRUYWJEYXRhKCdhbmFseXNpcycpIHx8IHt9O1xuICBjb25zdCBoYXJkU2tpbGxTZXQgPSBuZXcgU2V0KChqb2JBbmFseXNpcy5yZXF1aXJlZF9za2lsbHMgICAgfHwgW10pLm1hcChzID0+IHMudG9Mb3dlckNhc2UoKSkpO1xuICBjb25zdCBzb2Z0U2tpbGxTZXQgPSBuZXcgU2V0KChqb2JBbmFseXNpcy5uaWNlX3RvX2hhdmVfc2tpbGxzIHx8IFtdKS5tYXAocyA9PiBzLnRvTG93ZXJDYXNlKCkpKTtcblxuICAvLyBHZXQgYWxsIHNraWxscyBmcm9tIHRoZSBBUEkgc3RhdHVzXG4gIGxldCBhbGxTa2lsbHMgPSBbXTtcbiAgbGV0IHBlcnNpc3RlZEV4dHJhU2tpbGxzID0gW107XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdHVzUmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvc3RhdHVzJyk7XG4gICAgY29uc3Qgc3RhdHVzRGF0YSA9IHBhcnNlU3RhdHVzUmVzcG9uc2UoYXdhaXQgc3RhdHVzUmVzLmpzb24oKSk7XG4gICAgYWxsU2tpbGxzID0gc3RhdHVzRGF0YS5hbGxfc2tpbGxzIHx8IFtdO1xuICAgIHBlcnNpc3RlZEV4dHJhU2tpbGxzID0gc3RhdHVzRGF0YS5leHRyYV9za2lsbHMgfHwgW107XG4gICAgd2luZG93Ll9hbGxFeHBlcmllbmNlcyA9IHN0YXR1c0RhdGEuYWxsX2V4cGVyaWVuY2VzIHx8IFtdO1xuICAgIGNvbnN0IHF1YWxPdmVycmlkZXMgPSBzdGF0dXNEYXRhLnNraWxsX3F1YWxpZmllcl9vdmVycmlkZXMgfHwge307XG4gICAgd2luZG93Ll9za2lsbFR5cGVPdmVycmlkZXMgPSB3aW5kb3cuX3NraWxsVHlwZU92ZXJyaWRlcyB8fCB7fTtcbiAgICBmb3IgKGNvbnN0IFtza2lsbE5hbWUsIG92ZXJyaWRlc10gb2YgT2JqZWN0LmVudHJpZXMocXVhbE92ZXJyaWRlcykpIHtcbiAgICAgIGlmIChvdmVycmlkZXMgJiYgb3ZlcnJpZGVzLnNraWxsX3R5cGUpIHtcbiAgICAgICAgd2luZG93Ll9za2lsbFR5cGVPdmVycmlkZXNbc2tpbGxOYW1lLnRvTG93ZXJDYXNlKCldID0gb3ZlcnJpZGVzLnNraWxsX3R5cGU7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy5lcnJvcignRXJyb3IgZmV0Y2hpbmcgYWxsIHNraWxsczonLCBlcnJvcik7XG4gICAgLy8gRmFsbGJhY2sgdG8ganVzdCByZWNvbW1lbmRlZCBza2lsbHNcbiAgICBhbGxTa2lsbHMgPSBkYXRhLnJlY29tbWVuZGVkX3NraWxscyB8fCBbXTtcbiAgICB3aW5kb3cuX2FsbEV4cGVyaWVuY2VzID0gW107XG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkUGVyc2lzdGVkRXh0cmFTa2lsbHMgPSAocGVyc2lzdGVkRXh0cmFTa2lsbHMgfHwgW10pXG4gICAgLm1hcChza2lsbCA9PiBfbm9ybWFsaXplRXh0cmFTa2lsbEVudHJ5KHNraWxsLCB7XG4gICAgICB1c2VyQ3JlYXRlZDogdHlwZW9mIHNraWxsID09PSAnb2JqZWN0JyAmJiAhIXNraWxsPy51c2VyX2NyZWF0ZWQsXG4gICAgfSkpXG4gICAgLmZpbHRlcihCb29sZWFuKTtcbiAgaWYgKG5vcm1hbGl6ZWRQZXJzaXN0ZWRFeHRyYVNraWxscy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgbWVyZ2VkU2tpbGxzID0gW107XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQoKTtcbiAgICBub3JtYWxpemVkUGVyc2lzdGVkRXh0cmFTa2lsbHMuZm9yRWFjaChza2lsbCA9PiB7XG4gICAgICBpZiAoc2Vlbi5oYXMoc2tpbGwubmFtZSkpIHJldHVybjtcbiAgICAgIG1lcmdlZFNraWxscy5wdXNoKHNraWxsKTtcbiAgICAgIHNlZW4uYWRkKHNraWxsLm5hbWUpO1xuICAgIH0pO1xuICAgIGFsbFNraWxscy5mb3JFYWNoKHNraWxsID0+IHtcbiAgICAgIGNvbnN0IHNraWxsTmFtZSA9IF9za2lsbE5hbWUoc2tpbGwpO1xuICAgICAgaWYgKCFza2lsbE5hbWUgfHwgc2Vlbi5oYXMoc2tpbGxOYW1lKSkgcmV0dXJuO1xuICAgICAgbWVyZ2VkU2tpbGxzLnB1c2goc2tpbGwpO1xuICAgICAgc2Vlbi5hZGQoc2tpbGxOYW1lKTtcbiAgICB9KTtcbiAgICBhbGxTa2lsbHMgPSBtZXJnZWRTa2lsbHM7XG4gIH1cblxuICAvLyBEZXRlY3Qgc2tpbGxzIHJlY29tbWVuZGVkIGJ5IExMTSB0aGF0IGFyZW4ndCBpbiBtYXN0ZXIgQ1YgYW5kIHByZXBlbmQgdGhlbVxuICBjb25zdCBtYXN0ZXJTa2lsbE5hbWVzID0gbmV3IFNldChhbGxTa2lsbHMubWFwKHNraWxsID0+IF9za2lsbE5hbWUoc2tpbGwpKSk7XG4gIGNvbnN0IG5ld1NraWxscyA9IChkYXRhLnJlY29tbWVuZGVkX3NraWxscyB8fCBbXSkuZmlsdGVyKHMgPT4gIW1hc3RlclNraWxsTmFtZXMuaGFzKHMpKTtcbiAgd2luZG93Ll9uZXdTa2lsbHNGcm9tTExNID0gbmV3U2tpbGxzO1xuICBpZiAobmV3U2tpbGxzLmxlbmd0aCA+IDApIHtcbiAgICBhbGxTa2lsbHMgPSBbLi4ubmV3U2tpbGxzLm1hcChzID0+ICh7IG5hbWU6IHMsIF9pc05ldzogdHJ1ZSB9KSksIC4uLmFsbFNraWxsc107XG4gIH1cblxuICBpZiAoYWxsU2tpbGxzLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnPHAgc3R5bGU9XCJwYWRkaW5nOjIwcHg7dGV4dC1hbGlnbjpjZW50ZXI7Y29sb3I6IzZiNzI4MDtcIj5ObyBza2lsbHMgZm91bmQgaW4gbWFzdGVyIENWIGRhdGEuPC9wPic7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gT24gZmlyc3QgbG9hZDogc29ydCBieSByZWNvbW1lbmRhdGlvbjsgcHJlc2VydmUgdXNlciBvcmRlciBvbiByZS1yZW5kZXJcbiAgaWYgKCF3aW5kb3cuX3NraWxsc09yZGVyZWQpIHtcbiAgICBjb25zdCByZWNvbW1lbmRhdGlvbk9yZGVyID0geyAnRW1waGFzaXplJzogMCwgJ0luY2x1ZGUnOiAxLCAnRGUtZW1waGFzaXplJzogMiwgJ09taXQnOiAzIH07XG4gICAgY29uc3QgbWFzdGVyU2tpbGxzICA9IGFsbFNraWxscy5maWx0ZXIocyA9PiAhcy5faXNOZXcpO1xuXG4gICAgLy8gUm9sZS1hd2FyZSBjYXRlZ29yeSBzY29yaW5nOiBjYXRlZ29yaWVzIHdpdGggbW9yZSByZXF1aXJlZC9uaWNlLXRvLWhhdmUgam9iIHNraWxscyByYW5rIGhpZ2hlclxuICAgIGNvbnN0IGNhdGVnb3J5U2NvcmVzID0ge307XG4gICAgZm9yIChjb25zdCBza2lsbCBvZiBtYXN0ZXJTa2lsbHMpIHtcbiAgICAgIGNvbnN0IGNhdCAgPSB0eXBlb2Ygc2tpbGwgPT09ICdvYmplY3QnID8gKHNraWxsLmNhdGVnb3J5IHx8ICcnKSA6ICcnO1xuICAgICAgY29uc3QgbmFtZSA9ICh0eXBlb2Ygc2tpbGwgPT09ICdzdHJpbmcnID8gc2tpbGwgOiBza2lsbC5uYW1lIHx8IHNraWxsKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKGNhdCkge1xuICAgICAgICBjYXRlZ29yeVNjb3Jlc1tjYXRdID0gKGNhdGVnb3J5U2NvcmVzW2NhdF0gfHwgMClcbiAgICAgICAgICArIChoYXJkU2tpbGxTZXQuaGFzKG5hbWUpID8gMiA6IHNvZnRTa2lsbFNldC5oYXMobmFtZSkgPyAxIDogMCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc29ydGVkTWFzdGVyICA9IG1hc3RlclNraWxscy5zbGljZSgpLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGNvbnN0IGFOYW1lICA9IHR5cGVvZiBhID09PSAnc3RyaW5nJyA/IGEgOiBhLm5hbWUgfHwgYTtcbiAgICAgIGNvbnN0IGJOYW1lICA9IHR5cGVvZiBiID09PSAnc3RyaW5nJyA/IGIgOiBiLm5hbWUgfHwgYjtcbiAgICAgIGNvbnN0IGFSZWMgICA9IHJlY29tbWVuZGF0aW9uT3JkZXJbZ2V0U2tpbGxSZWNvbW1lbmRhdGlvbihhTmFtZSwgZGF0YSldID8/IDM7XG4gICAgICBjb25zdCBiUmVjICAgPSByZWNvbW1lbmRhdGlvbk9yZGVyW2dldFNraWxsUmVjb21tZW5kYXRpb24oYk5hbWUsIGRhdGEpXSA/PyAzO1xuICAgICAgaWYgKGFSZWMgIT09IGJSZWMpIHJldHVybiBhUmVjIC0gYlJlYztcbiAgICAgIC8vIFdpdGhpbiB0aGUgc2FtZSByZWNvbW1lbmRhdGlvbiB0aWVyLCBzdXJmYWNlIHJvbGUtcmVsZXZhbnQgY2F0ZWdvcmllcyBmaXJzdFxuICAgICAgY29uc3QgYUNhdCAgID0gdHlwZW9mIGEgPT09ICdvYmplY3QnID8gKGEuY2F0ZWdvcnkgfHwgJycpIDogJyc7XG4gICAgICBjb25zdCBiQ2F0ICAgPSB0eXBlb2YgYiA9PT0gJ29iamVjdCcgPyAoYi5jYXRlZ29yeSB8fCAnJykgOiAnJztcbiAgICAgIHJldHVybiAoY2F0ZWdvcnlTY29yZXNbYkNhdF0gfHwgMCkgLSAoY2F0ZWdvcnlTY29yZXNbYUNhdF0gfHwgMCk7XG4gICAgfSk7XG4gICAgd2luZG93Ll9za2lsbHNPcmRlcmVkID0gWy4uLmFsbFNraWxscy5maWx0ZXIocyA9PiBzLl9pc05ldyksIC4uLnNvcnRlZE1hc3Rlcl07XG5cbiAgICAvLyBBcHBseSBqb2ItYW5hbHlzaXMtZGVyaXZlZCBjYXRlZ29yeSBvcmRlciBmcm9tIGJhY2tlbmQgKEdBUC04NilcbiAgICBjb25zdCBiYWNrZW5kT3JkZXIgPSAoc3RhdGVNYW5hZ2VyLmdldFRhYkRhdGEoJ2N1c3RvbWl6YXRpb25zJykgfHwge30pLnNraWxsX2NhdGVnb3J5X29yZGVyO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGJhY2tlbmRPcmRlcikgJiYgYmFja2VuZE9yZGVyLmxlbmd0aCA+IDApIHtcbiAgICAgIHdpbmRvdy5fc2tpbGxDYXRlZ29yeU9yZGVyID0gYmFja2VuZE9yZGVyO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zdCBrbm93bk5hbWVzID0gbmV3IFNldCh3aW5kb3cuX3NraWxsc09yZGVyZWQubWFwKHMgPT4gKHR5cGVvZiBzID09PSAnc3RyaW5nJyA/IHMgOiBzLm5hbWUgfHwgcykpKTtcbiAgICBmb3IgKGNvbnN0IHNrIG9mIGFsbFNraWxscykge1xuICAgICAgY29uc3Qgbm0gPSB0eXBlb2Ygc2sgPT09ICdzdHJpbmcnID8gc2sgOiBzay5uYW1lIHx8IHNrO1xuICAgICAgaWYgKCFrbm93bk5hbWVzLmhhcyhubSkpIHdpbmRvdy5fc2tpbGxzT3JkZXJlZC5wdXNoKHNrKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCByZWNvbW1lbmRlZFNldCA9IG5ldyBTZXQoZGF0YS5yZWNvbW1lbmRlZF9za2lsbHMgfHwgW10pO1xuXG4gIC8vIENvbXB1dGUgd2hpY2ggcmVjb21tZW5kYXRpb25zIGFyZSBuZXcgc2luY2UgbGFzdCByZW5kZXIgKHJlcnVuIGNoYW5nZSBiYWRnZXMpXG4gIGNvbnN0IHByZXZTa2lsbFNuYXAgPSBfZ2V0U2tpbGxTbmFwc2hvdCgpO1xuICBjb25zdCBuZXdSZWNvbW1lbmRlZFNraWxscyA9IHByZXZTa2lsbFNuYXBcbiAgICA/IG5ldyBTZXQoWy4uLnJlY29tbWVuZGVkU2V0XS5maWx0ZXIobmFtZSA9PiAhcHJldlNraWxsU25hcC5oYXMobmFtZSkpKVxuICAgIDogbmV3IFNldCgpO1xuICBfc2F2ZVNraWxsU25hcHNob3QocmVjb21tZW5kZWRTZXQpO1xuXG4gIC8vIEluaXRpYWxpc2Ugc2F2ZWQgZGVjaXNpb25zXG4gIGNvbnN0IHNhdmVkU2tpbGxEZWNzID0gd2luZG93Ll9zYXZlZERlY2lzaW9ucz8uc2tpbGxfZGVjaXNpb25zIHx8IHt9O1xuICBmb3IgKGNvbnN0IHNraWxsIG9mIHdpbmRvdy5fc2tpbGxzT3JkZXJlZCkge1xuICAgIGNvbnN0IHNraWxsTmFtZSAgICAgPSB0eXBlb2Ygc2tpbGwgPT09ICdzdHJpbmcnID8gc2tpbGwgOiBza2lsbC5uYW1lIHx8IHNraWxsO1xuICAgIGNvbnN0IGlzTmV3ICAgICAgICAgPSAoc2tpbGwuX2lzTmV3ID09PSB0cnVlKTtcbiAgICBjb25zdCBpc1JlY29tbWVuZGVkID0gcmVjb21tZW5kZWRTZXQuaGFzKHNraWxsTmFtZSk7XG4gICAgY29uc3QgcmVjb21tZW5kYXRpb24gPSBnZXRTa2lsbFJlY29tbWVuZGF0aW9uKHNraWxsTmFtZSwgZGF0YSk7XG4gICAgbGV0IGRlZmF1bHRBY3Rpb24gPSAnZXhjbHVkZSc7XG4gICAgaWYgICAgICAocmVjb21tZW5kYXRpb24gPT09ICdFbXBoYXNpemUnKSAgICBkZWZhdWx0QWN0aW9uID0gJ2VtcGhhc2l6ZSc7XG4gICAgZWxzZSBpZiAocmVjb21tZW5kYXRpb24gPT09ICdJbmNsdWRlJykgICAgICBkZWZhdWx0QWN0aW9uID0gJ2luY2x1ZGUnO1xuICAgIGVsc2UgaWYgKHJlY29tbWVuZGF0aW9uID09PSAnRGUtZW1waGFzaXplJykgZGVmYXVsdEFjdGlvbiA9ICdkZS1lbXBoYXNpemUnO1xuICAgIGVsc2UgaWYgKHJlY29tbWVuZGF0aW9uID09PSAnT21pdCcpICAgICAgICAgZGVmYXVsdEFjdGlvbiA9ICdleGNsdWRlJztcbiAgICBlbHNlIGlmIChpc1JlY29tbWVuZGVkIHx8IGlzTmV3KSAgICAgICAgICAgIGRlZmF1bHRBY3Rpb24gPSAnaW5jbHVkZSc7XG4gICAgdXNlclNlbGVjdGlvbnMuc2tpbGxzW3NraWxsTmFtZV0gPSBzYXZlZFNraWxsRGVjc1tza2lsbE5hbWVdIHx8IGRlZmF1bHRBY3Rpb247XG4gIH1cblxuICBfcmVuZGVyU2tpbGxzVGFibGUoY29udGFpbmVyLCByZWNvbW1lbmRlZFNldCwgZGF0YSwgaGFyZFNraWxsU2V0LCBzb2Z0U2tpbGxTZXQsIG5ld1JlY29tbWVuZGVkU2tpbGxzKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFJlbmRlciB0YWJsZSBIVE1MIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBfcmVuZGVyU2tpbGxzVGFibGUoY29udGFpbmVyLCByZWNvbW1lbmRlZFNldCwgZGF0YSwgaGFyZFNraWxsU2V0LCBzb2Z0U2tpbGxTZXQsIG5ld1JlY29tbWVuZGVkU2tpbGxzID0gbmV3IFNldCgpKSB7XG4gIGlmICghY29udGFpbmVyKSBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGxzLXRhYmxlLWNvbnRhaW5lcicpO1xuICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuO1xuICBpZiAoIXJlY29tbWVuZGVkU2V0KSByZWNvbW1lbmRlZFNldCA9IG5ldyBTZXQoKHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zPy5yZWNvbW1lbmRlZF9za2lsbHMpIHx8IFtdKTtcbiAgaWYgKCFkYXRhKSBkYXRhID0gd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnM7XG4gIGlmICghaGFyZFNraWxsU2V0KSB7XG4gICAgY29uc3QgamEgPSBzdGF0ZU1hbmFnZXIuZ2V0VGFiRGF0YSgnYW5hbHlzaXMnKSB8fCB7fTtcbiAgICBoYXJkU2tpbGxTZXQgPSBuZXcgU2V0KChqYS5yZXF1aXJlZF9za2lsbHMgICAgIHx8IFtdKS5tYXAocyA9PiBzLnRvTG93ZXJDYXNlKCkpKTtcbiAgICBzb2Z0U2tpbGxTZXQgPSBuZXcgU2V0KChqYS5uaWNlX3RvX2hhdmVfc2tpbGxzIHx8IFtdKS5tYXAocyA9PiBzLnRvTG93ZXJDYXNlKCkpKTtcbiAgfVxuXG4gIGlmICgkLmZuLkRhdGFUYWJsZS5pc0RhdGFUYWJsZSgnI3NraWxscy1yZXZpZXctdGFibGUnKSkge1xuICAgICQoJyNza2lsbHMtcmV2aWV3LXRhYmxlJykuRGF0YVRhYmxlKCkuZGVzdHJveSgpO1xuICB9XG5cbiAgY29uc3Qgc2tpbGxzID0gd2luZG93Ll9za2lsbHNPcmRlcmVkIHx8IFtdO1xuICBjb25zdCBncm91cFdhcm5pbmdzID0gX2J1aWxkR3JvdXBXYXJuaW5ncyhza2lsbHMpO1xuICBjb25zdCBjYXRlZ29yeVN1Z2dlc3Rpb25zID0gQXJyYXkuZnJvbShuZXcgU2V0KFxuICAgIHNraWxsc1xuICAgICAgLm1hcChza2lsbCA9PiAodHlwZW9mIHNraWxsID09PSAnb2JqZWN0JyAmJiBza2lsbC5jYXRlZ29yeSA/IFN0cmluZyhza2lsbC5jYXRlZ29yeSkudHJpbSgpIDogJycpKVxuICAgICAgLmZpbHRlcihCb29sZWFuKSxcbiAgKSkuc29ydCgobGVmdCwgcmlnaHQpID0+IGxlZnQubG9jYWxlQ29tcGFyZShyaWdodCkpO1xuICBfc3luY1NraWxsQ2F0ZWdvcnlPcmRlcigpO1xuICBjb25zdCBjYXRlZ29yeUxpc3RJZCA9ICdza2lsbC1jYXRlZ29yeS1zdWdnZXN0aW9ucyc7XG4gIGxldCB0YWJsZUhUTUwgPSBgXG4gICAgPGRpdiBjbGFzcz1cInNraWxsLWFkZC1wYW5lbFwiIHN0eWxlPVwibWFyZ2luOjAgMCAxMnB4O3BhZGRpbmc6MTJweDtib3JkZXI6MXB4IHNvbGlkICNkYmVhZmU7Ym9yZGVyLXJhZGl1czoxMHB4O2JhY2tncm91bmQ6I2VmZjZmZjtcIj5cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47YWxpZ24taXRlbXM6Y2VudGVyO2dhcDoxMnB4O2ZsZXgtd3JhcDp3cmFwO1wiPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDo2MDA7XCI+U2Vzc2lvbi1Pbmx5IFNraWxsczwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2NvbG9yOiM0NzU1Njk7XCI+QWRkIGEgc2tpbGwgZm9yIHRoaXMgQ1Ygd2l0aG91dCBjaGFuZ2luZyB0aGUgbWFzdGVyIHByb2ZpbGUuPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ1bGstYnRuXCIgaWQ9XCJ0b2dnbGUtYWRkLXNraWxsLWZvcm1cIj4rIEFkZCBTa2lsbDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8Zm9ybSBpZD1cImFkZC1za2lsbC1mb3JtXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7bWFyZ2luLXRvcDoxMnB4O1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpncmlkO2dyaWQtdGVtcGxhdGUtY29sdW1uczpyZXBlYXQoYXV0by1maXQsbWlubWF4KDE4MHB4LDFmcikpO2dhcDo4cHg7XCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cIm5hbWVcIiBwbGFjZWhvbGRlcj1cIlNraWxsIG5hbWVcIiBhcmlhLWxhYmVsPVwiTmV3IHNraWxsIG5hbWVcIiBzdHlsZT1cInBhZGRpbmc6NnB4IDhweDtib3JkZXI6MXB4IHNvbGlkICNiZmRiZmU7Ym9yZGVyLXJhZGl1czo2cHg7XCIgLz5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBuYW1lPVwiY2F0ZWdvcnlcIiBwbGFjZWhvbGRlcj1cIkNhdGVnb3J5XCIgYXJpYS1sYWJlbD1cIk5ldyBza2lsbCBjYXRlZ29yeVwiIGxpc3Q9XCIke2NhdGVnb3J5TGlzdElkfVwiIHN0eWxlPVwicGFkZGluZzo2cHggOHB4O2JvcmRlcjoxcHggc29saWQgI2JmZGJmZTtib3JkZXItcmFkaXVzOjZweDtcIiAvPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG5hbWU9XCJncm91cFwiIHBsYWNlaG9sZGVyPVwiR3JvdXAga2V5XCIgYXJpYS1sYWJlbD1cIk5ldyBza2lsbCBncm91cFwiIHN0eWxlPVwicGFkZGluZzo2cHggOHB4O2JvcmRlcjoxcHggc29saWQgI2JmZGJmZTtib3JkZXItcmFkaXVzOjZweDtcIiAvPlxuICAgICAgICAgIDxzZWxlY3QgbmFtZT1cInByb2ZpY2llbmN5XCIgYXJpYS1sYWJlbD1cIk5ldyBza2lsbCBwcm9maWNpZW5jeVwiIHN0eWxlPVwicGFkZGluZzo2cHggOHB4O2JvcmRlcjoxcHggc29saWQgI2JmZGJmZTtib3JkZXItcmFkaXVzOjZweDtcIj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj5ObyBwcm9maWNpZW5jeSBsYWJlbDwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImJlZ2lubmVyXCI+QmVnaW5uZXI8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJmYW1pbGlhclwiPkZhbWlsaWFyPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiaW50ZXJtZWRpYXRlXCI+SW50ZXJtZWRpYXRlPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiYWR2YW5jZWRcIj5BZHZhbmNlZDwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImV4cGVydFwiPkV4cGVydDwvb3B0aW9uPlxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG5hbWU9XCJzdWJza2lsbHNcIiBwbGFjZWhvbGRlcj1cIlN1Yi1za2lsbHNcIiBhcmlhLWxhYmVsPVwiTmV3IHNraWxsIHN1Yi1za2lsbHNcIiBzdHlsZT1cInBhZGRpbmc6NnB4IDhweDtib3JkZXI6MXB4IHNvbGlkICNiZmRiZmU7Ym9yZGVyLXJhZGl1czo2cHg7XCIgLz5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBuYW1lPVwicGFyZW50aGV0aWNhbFwiIHBsYWNlaG9sZGVyPVwiUGFyZW50aGV0aWNhbCBub3RlXCIgYXJpYS1sYWJlbD1cIk5ldyBza2lsbCBwYXJlbnRoZXRpY2FsXCIgc3R5bGU9XCJwYWRkaW5nOjZweCA4cHg7Ym9yZGVyOjFweCBzb2xpZCAjYmZkYmZlO2JvcmRlci1yYWRpdXM6NnB4O1wiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDo4cHg7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kO21hcmdpbi10b3A6MTBweDtcIj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ1bGstYnRuIGJ1bGstZXhjbHVkZVwiIGlkPVwiY2FuY2VsLWFkZC1za2lsbFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIGNsYXNzPVwiYnVsay1idG4gYnVsay1pbmNsdWRlXCI+U2F2ZSBTa2lsbDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZm9ybT5cbiAgICA8L2Rpdj5cbiAgICAke19idWlsZFNraWxsQ2F0ZWdvcnlNYW5hZ2VySHRtbCgpfVxuICAgIDxkYXRhbGlzdCBpZD1cIiR7Y2F0ZWdvcnlMaXN0SWR9XCI+XG4gICAgICAke2NhdGVnb3J5U3VnZ2VzdGlvbnMubWFwKGNhdGVnb3J5ID0+IGA8b3B0aW9uIHZhbHVlPVwiJHtlc2NhcGVIdG1sKGNhdGVnb3J5KX1cIj48L29wdGlvbj5gKS5qb2luKCcnKX1cbiAgICA8L2RhdGFsaXN0PlxuICAgIDx0YWJsZSBpZD1cInNraWxscy1yZXZpZXctdGFibGVcIiBjbGFzcz1cInJldmlldy10YWJsZVwiPlxuICAgICAgPHRoZWFkPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRoPlNraWxsPC90aD5cbiAgICAgICAgICA8dGg+Q2F0ZWdvcnk8L3RoPlxuICAgICAgICAgIDx0aD5Hcm91cDwvdGg+XG4gICAgICAgICAgPHRoPlByb2ZpY2llbmN5PC90aD5cbiAgICAgICAgICA8dGg+U3ViLXNraWxsczwvdGg+XG4gICAgICAgICAgPHRoPlBhcmVudGhldGljYWw8L3RoPlxuICAgICAgICAgIDx0aD5SZWNvbW1lbmRhdGlvbjwvdGg+XG4gICAgICAgICAgPHRoPkNvbmZpZGVuY2U8L3RoPlxuICAgICAgICAgIDx0aD5SZWFzb25pbmc8L3RoPlxuICAgICAgICAgIDx0aD5NYXRjaGVkIEV4cGVyaWVuY2VzPC90aD5cbiAgICAgICAgICA8dGg+WW91ciBTZWxlY3Rpb248L3RoPlxuICAgICAgICA8L3RyPlxuICAgICAgPC90aGVhZD5cbiAgICAgIDx0Ym9keT5cbiAgYDtcblxuICBjb25zdCBhbGxFeHBlcmllbmNlcyA9IEFycmF5LmlzQXJyYXkod2luZG93Ll9hbGxFeHBlcmllbmNlcykgPyB3aW5kb3cuX2FsbEV4cGVyaWVuY2VzIDogW107XG4gIGNvbnN0IHNhdmVkTWF0Y2hlcyA9ICh3aW5kb3cuX3NhdmVkRGVjaXNpb25zICYmIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMuZXh0cmFfc2tpbGxfbWF0Y2hlcykgfHwge307XG5cbiAgY29uc3QgZGVyaXZlTWF0Y2hlcyA9IChza2lsbE5hbWUpID0+IHtcbiAgICBjb25zdCBuZWVkbGUgPSBza2lsbE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBpZHMgPSBbXTtcbiAgICBhbGxFeHBlcmllbmNlcy5mb3JFYWNoKChleHApID0+IHtcbiAgICAgIGlmICghZXhwIHx8IHR5cGVvZiBleHAgIT09ICdvYmplY3QnKSByZXR1cm47XG4gICAgICBjb25zdCBhY2ggPSBBcnJheS5pc0FycmF5KGV4cC5hY2hpZXZlbWVudHMpID8gZXhwLmFjaGlldmVtZW50cy5qb2luKCcgJykgOiAnJztcbiAgICAgIGNvbnN0IGhheXN0YWNrID0gW2V4cC50aXRsZSB8fCAnJywgZXhwLmNvbXBhbnkgfHwgJycsIGFjaF0uam9pbignICcpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAoaGF5c3RhY2suaW5jbHVkZXMobmVlZGxlKSAmJiBleHAuaWQpIGlkcy5wdXNoKGV4cC5pZCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGlkcztcbiAgfTtcblxuICBza2lsbHMuZm9yRWFjaCgoc2tpbGwsIHJvd0lkeCkgPT4ge1xuICAgIGNvbnN0IHNraWxsTmFtZSAgICAgICAgICAgID0gdHlwZW9mIHNraWxsID09PSAnc3RyaW5nJyA/IHNraWxsIDogc2tpbGwubmFtZSB8fCBza2lsbDtcbiAgICBjb25zdCBpc05ldyAgICAgICAgICAgICAgICA9IChza2lsbC5faXNOZXcgPT09IHRydWUpO1xuICAgIGNvbnN0IGlzQ2FuZGlkYXRlVG9Db25maXJtID0gdHlwZW9mIHNraWxsID09PSAnb2JqZWN0JyAmJiBza2lsbC5jYW5kaWRhdGVfdG9fY29uZmlybSA9PT0gdHJ1ZTtcbiAgICBjb25zdCBpc1JlY29tbWVuZGVkICAgICAgICA9IHJlY29tbWVuZGVkU2V0Lmhhcyhza2lsbE5hbWUpO1xuICAgIGNvbnN0IHJlY29tbWVuZGF0aW9uID0gZ2V0U2tpbGxSZWNvbW1lbmRhdGlvbihza2lsbE5hbWUsIGRhdGEpO1xuICAgIGNvbnN0IGNvbmZpZGVuY2UgICAgID0gZ2V0U2tpbGxDb25maWRlbmNlKHNraWxsTmFtZSwgZGF0YSk7XG4gICAgY29uc3QgcmVhc29uaW5nICAgICAgPSBnZXRTa2lsbFJlYXNvbmluZyhza2lsbE5hbWUsIGRhdGEpO1xuICAgIGNvbnN0IHNraWxsUmVjICAgICAgID0gX2ZpbmRTa2lsbFJlY29tbWVuZGF0aW9uUmVjb3JkKHNraWxsTmFtZSwgZGF0YSk7XG4gICAgY29uc3QgZ3JvdXBpbmdTdWdnZXN0aW9uID0gX2J1aWxkU2tpbGxHcm91cGluZ1N1Z2dlc3Rpb24oc2tpbGxSZWMsIHNraWxsKTtcbiAgICBjb25zdCBkZWZhdWx0QWN0aW9uICA9IHVzZXJTZWxlY3Rpb25zLnNraWxsc1tza2lsbE5hbWVdIHx8ICdpbmNsdWRlJztcbiAgICBjb25zdCBpc0ZpcnN0ICAgICAgICA9IHJvd0lkeCA9PT0gMDtcbiAgICBjb25zdCBpc0xhc3QgICAgICAgICA9IHJvd0lkeCA9PT0gc2tpbGxzLmxlbmd0aCAtIDE7XG4gICAgY29uc3Qgc2tpbGxOYW1lRXNjICAgPSBlc2NhcGVIdG1sKHNraWxsTmFtZSk7XG5cbiAgICBjb25zdCBncm91cEtleSA9IHR5cGVvZiBza2lsbCA9PT0gJ29iamVjdCcgPyAoc2tpbGwuZ3JvdXAgfHwgJycpIDogJyc7XG4gICAgY29uc3QgZ3JvdXBXYXJuaW5nID0gZ3JvdXBXYXJuaW5ncy5nZXQoZ3JvdXBLZXkpO1xuICAgIGNvbnN0IGNhdGVnb3J5S2V5ID0gdHlwZW9mIHNraWxsID09PSAnb2JqZWN0JyA/IChza2lsbC5jYXRlZ29yeSB8fCAnJykgOiAnJztcbiAgICBjb25zdCBwcm9maWNpZW5jeUtleSA9IHR5cGVvZiBza2lsbCA9PT0gJ29iamVjdCcgPyBTdHJpbmcoc2tpbGwucHJvZmljaWVuY3kgfHwgJycpLnRyaW0oKSA6ICcnO1xuICAgIGNvbnN0IHN1YnNraWxscyA9IHR5cGVvZiBza2lsbCA9PT0gJ29iamVjdCdcbiAgICAgID8gQXJyYXkuaXNBcnJheShza2lsbC5zdWJza2lsbHMpXG4gICAgICAgID8gc2tpbGwuc3Vic2tpbGxzXG4gICAgICAgIDogQXJyYXkuaXNBcnJheShza2lsbC5zdWJfc2tpbGxzKVxuICAgICAgICAgID8gc2tpbGwuc3ViX3NraWxsc1xuICAgICAgICAgIDogW11cbiAgICAgIDogW107XG4gICAgY29uc3QgcGFyZW50aGV0aWNhbEtleSA9IHR5cGVvZiBza2lsbCA9PT0gJ29iamVjdCcgPyBTdHJpbmcoc2tpbGwucGFyZW50aGV0aWNhbCB8fCAnJykudHJpbSgpIDogJyc7XG5cbiAgICBjb25zdCBuZXdCYWRnZSA9IGlzTmV3XG4gICAgICA/IChza2lsbC5faXNVc2VyQ3JlYXRlZFxuICAgICAgICA/ICc8c3BhbiB0aXRsZT1cIkFkZGVkIGZvciB0aGlzIHNlc3Npb24gb25seVwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6NnB4O2ZvbnQtc2l6ZToxMHB4O2NvbG9yOiMwZjc2NmU7Ym9yZGVyOjFweCBzb2xpZCAjMGY3NjZlO2JvcmRlci1yYWRpdXM6M3B4O3BhZGRpbmc6MXB4IDVweDtjdXJzb3I6aGVscDtcIj5TZXNzaW9uIG9ubHk8L3NwYW4+J1xuICAgICAgICA6ICc8c3BhbiB0aXRsZT1cIkFJIHN1Z2dlc3RlZCBcdTIwMTQgbm90IHlldCBpbiBDViBwcm9maWxlXCIgc3R5bGU9XCJtYXJnaW4tbGVmdDo2cHg7Zm9udC1zaXplOjEwcHg7Y29sb3I6I2RjNzkwMDtib3JkZXI6MXB4IHNvbGlkICNkYzc5MDA7Ym9yZGVyLXJhZGl1czozcHg7cGFkZGluZzoxcHggNXB4O2N1cnNvcjpoZWxwO1wiPlx1MjZBMCBOb3QgaW4gQ1YgcHJvZmlsZTwvc3Bhbj4nKVxuICAgICAgOiAnJztcbiAgICBjb25zdCBfZXZpZGVuY2VUZXh0ID0gaXNDYW5kaWRhdGVUb0NvbmZpcm0gJiYgdHlwZW9mIHNraWxsID09PSAnb2JqZWN0JyA/IFN0cmluZyhza2lsbC5ldmlkZW5jZSB8fCAnJykudHJpbSgpIDogJyc7XG4gICAgY29uc3QgX2V2aWRlbmNlRmFsbGJhY2sgPSAnQ29uZmlybSB0aGlzIHNraWxsIGlzIGdlbnVpbmVseSBkZW1vbnN0cmF0ZWQgaW4geW91ciBleHBlcmllbmNlIGJlZm9yZSBpbmNsdWRpbmcgaXQuJztcbiAgICBjb25zdCBfZXZpZGVuY2VUaXAgPSBfZXZpZGVuY2VUZXh0ID8gYFdlYWsgZXZpZGVuY2UgXHUyMDE0ICR7X2V2aWRlbmNlVGV4dH1gIDogYFdlYWsgZXZpZGVuY2UgXHUyMDE0ICR7X2V2aWRlbmNlRmFsbGJhY2t9YDtcbiAgICBjb25zdCBjYW5kaWRhdGVCYWRnZSA9IGlzQ2FuZGlkYXRlVG9Db25maXJtXG4gICAgICA/IGA8c3BhbiB0aXRsZT1cIiR7ZXNjYXBlSHRtbChfZXZpZGVuY2VUaXApfVwiIGFyaWEtbGFiZWw9XCIke2VzY2FwZUh0bWwoX2V2aWRlbmNlVGlwKX1cIiBzdHlsZT1cIm1hcmdpbi1sZWZ0OjZweDtmb250LXNpemU6MTBweDtjb2xvcjojOWYxMjM5O2JvcmRlcjoxcHggc29saWQgIzlmMTIzOTtib3JkZXItcmFkaXVzOjNweDtwYWRkaW5nOjFweCA1cHg7Y3Vyc29yOmhlbHA7XCI+XHUyNkEwICR7X2V2aWRlbmNlVGV4dCA/ICdXZWFrIGV2aWRlbmNlJyA6ICdWZXJpZnkgZXZpZGVuY2UnfTwvc3Bhbj5gXG4gICAgICA6ICcnO1xuICAgIGNvbnN0IGV2aWRlbmNlTm90ZSA9IGlzQ2FuZGlkYXRlVG9Db25maXJtICYmIF9ldmlkZW5jZVRleHRcbiAgICAgID8gYDxzbWFsbCBzdHlsZT1cImRpc3BsYXk6YmxvY2s7bWFyZ2luLXRvcDozcHg7Zm9udC1zaXplOjAuNzhlbTtjb2xvcjojOWYxMjM5O1wiPiR7ZXNjYXBlSHRtbChfZXZpZGVuY2VUZXh0KX08L3NtYWxsPmBcbiAgICAgIDogJyc7XG4gICAgY29uc3QgcmVydW5OZXdCYWRnZSA9IG5ld1JlY29tbWVuZGVkU2tpbGxzLmhhcyhza2lsbE5hbWUpXG4gICAgICA/ICc8c3BhbiBjbGFzcz1cInJ3LWNoYW5nZS1iYWRnZSBydy1jaGFuZ2UtbmV3XCIgYXJpYS1sYWJlbD1cIk5ldyByZWNvbW1lbmRhdGlvbiBzaW5jZSBwcmV2aW91cyBydW5cIj5cdUQ4M0NcdUREOTUgTmV3PC9zcGFuPidcbiAgICAgIDogJyc7XG4gICAgY29uc3Qgc2tpbGxOYW1lTG93ZXIgID0gc2tpbGxOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgX3R5cGVPdmVycmlkZSAgID0gKHdpbmRvdy5fc2tpbGxUeXBlT3ZlcnJpZGVzIHx8IHt9KVtza2lsbE5hbWVMb3dlcl07XG4gICAgY29uc3QgX2Jhc2VUeXBlICAgICAgID0gaGFyZFNraWxsU2V0Lmhhcyhza2lsbE5hbWVMb3dlcikgPyAnaGFyZCdcbiAgICAgIDogc29mdFNraWxsU2V0Py5oYXMoc2tpbGxOYW1lTG93ZXIpID8gJ3NvZnQnIDogbnVsbDtcbiAgICBjb25zdCBfZWZmZWN0aXZlVHlwZSAgPSBfdHlwZU92ZXJyaWRlIHx8IF9iYXNlVHlwZTtcbiAgICBjb25zdCBfaXNPdmVycmlkZGVuICAgPSAhIV90eXBlT3ZlcnJpZGUgJiYgX3R5cGVPdmVycmlkZSAhPT0gX2Jhc2VUeXBlO1xuICAgIGNvbnN0IF90b2dnbGVUYXJnZXQgICA9IF9lZmZlY3RpdmVUeXBlID09PSAnaGFyZCcgPyAnc29mdCdcbiAgICAgIDogX2VmZmVjdGl2ZVR5cGUgPT09ICdzb2Z0JyA/IG51bGwgOiAnaGFyZCc7XG4gICAgY29uc3QgX2JhZGdlVGl0bGUgICAgID0gX2lzT3ZlcnJpZGRlblxuICAgICAgPyBgVXNlciBvdmVycmlkZTogJHtfZWZmZWN0aXZlVHlwZX0gKG9yaWdpbmFsOiAke19iYXNlVHlwZSB8fCAnbm9uZSd9KSBcdTIwMTQgY2xpY2sgdG8gY3ljbGVgXG4gICAgICA6IF9lZmZlY3RpdmVUeXBlXG4gICAgICAgID8gYCR7X2VmZmVjdGl2ZVR5cGUgPT09ICdoYXJkJyA/ICdSZXF1aXJlZCcgOiAnTmljZS10by1oYXZlJ30gcGVyIGpvYiBkZXNjcmlwdGlvbiBcdTIwMTQgY2xpY2sgdG8gb3ZlcnJpZGVgXG4gICAgICAgIDogJ05vdCBjbGFzc2lmaWVkIFx1MjAxNCBjbGljayB0byBtYXJrIGFzIEhhcmQnO1xuICAgIGNvbnN0IF9iYWRnZVN0eWxlICAgICA9IF9lZmZlY3RpdmVUeXBlID09PSAnaGFyZCdcbiAgICAgID8gYG1hcmdpbi1sZWZ0OjVweDtmb250LXNpemU6MTBweDtmb250LXdlaWdodDo2MDA7Y29sb3I6IzFkNGVkODtiYWNrZ3JvdW5kOiNkYmVhZmU7Ym9yZGVyLXJhZGl1czozcHg7cGFkZGluZzoxcHggNXB4O2N1cnNvcjpwb2ludGVyOyR7X2lzT3ZlcnJpZGRlbiA/ICdvdXRsaW5lOjJweCBzb2xpZCAjMWQ0ZWQ4O291dGxpbmUtb2Zmc2V0OjFweDsnIDogJyd9YFxuICAgICAgOiBfZWZmZWN0aXZlVHlwZSA9PT0gJ3NvZnQnXG4gICAgICAgID8gYG1hcmdpbi1sZWZ0OjVweDtmb250LXNpemU6MTBweDtmb250LXdlaWdodDo2MDA7Y29sb3I6IzZiMjFhODtiYWNrZ3JvdW5kOiNmM2U4ZmY7Ym9yZGVyLXJhZGl1czozcHg7cGFkZGluZzoxcHggNXB4O2N1cnNvcjpwb2ludGVyOyR7X2lzT3ZlcnJpZGRlbiA/ICdvdXRsaW5lOjJweCBzb2xpZCAjNmIyMWE4O291dGxpbmUtb2Zmc2V0OjFweDsnIDogJyd9YFxuICAgICAgICA6ICdtYXJnaW4tbGVmdDo1cHg7Zm9udC1zaXplOjEwcHg7Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOiM2YjcyODA7YmFja2dyb3VuZDojZjNmNGY2O2JvcmRlci1yYWRpdXM6M3B4O3BhZGRpbmc6MXB4IDVweDtjdXJzb3I6cG9pbnRlcjtib3JkZXI6MXB4IGRhc2hlZCAjOWNhM2FmOyc7XG4gICAgY29uc3QgX2JhZGdlTGFiZWwgICAgID0gX2VmZmVjdGl2ZVR5cGUgPyAoX2VmZmVjdGl2ZVR5cGUgPT09ICdoYXJkJyA/ICdIYXJkJyA6ICdTb2Z0JykgOiAnKyBUeXBlJztcbiAgICBjb25zdCBza2lsbFR5cGVCYWRnZSAgPSBgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJza2lsbC10eXBlLXRvZ2dsZVwiIGRhdGEtc2tpbGw9XCIke3NraWxsTmFtZUVzY31cIiBkYXRhLXRvZ2dsZS10bz1cIiR7X3RvZ2dsZVRhcmdldCB8fCAnJ31cIiB0aXRsZT1cIiR7X2JhZGdlVGl0bGV9XCIgc3R5bGU9XCIke19iYWRnZVN0eWxlfVwiIGFyaWEtbGFiZWw9XCJTa2lsbCB0eXBlOiAke19lZmZlY3RpdmVUeXBlIHx8ICd1bmNsYXNzaWZpZWQnfSwgY2xpY2sgdG8gdG9nZ2xlXCI+JHtfYmFkZ2VMYWJlbH08L2J1dHRvbj5gO1xuICAgIGNvbnN0IHJlY29tbWVuZGF0aW9uVGV4dCA9IHJlY29tbWVuZGF0aW9uIHx8IChza2lsbC5faXNVc2VyQ3JlYXRlZCA/ICdJbmNsdWRlIChzZXNzaW9uLWFkZGVkKScgOiAoaXNOZXcgPyAnSW5jbHVkZSAoQUkgc3VnZ2VzdGVkKScgOiAnT21pdCcpKTtcbiAgICBjb25zdCBjb25maWRlbmNlQmFkZ2UgICAgPSBgPHNwYW4gY2xhc3M9XCJjb25maWRlbmNlLWJhZGdlIGNvbmZpZGVuY2UtJHtjb25maWRlbmNlLmxldmVsfVwiPiR7Y29uZmlkZW5jZS50ZXh0fTwvc3Bhbj5gO1xuICAgIGNvbnN0IHJlYXNvbmluZ1RleHQgICAgICA9IHJlYXNvbmluZyB8fCAoc2tpbGwuX2lzVXNlckNyZWF0ZWRcbiAgICAgID8gJ1lvdSBhZGRlZCB0aGlzIHNraWxsIGZvciB0aGUgY3VycmVudCBDViBzZXNzaW9uIG9ubHkuJ1xuICAgICAgOiAoaXNOZXdcbiAgICAgICAgPyAnUmVjb21tZW5kZWQgYnkgQUkgYmFzZWQgb24gam9iIHJlcXVpcmVtZW50cyBidXQgbm90IGN1cnJlbnRseSBpbiB5b3VyIG1hc3RlciBDVi4nXG4gICAgICAgIDogJ1RoaXMgc2tpbGwgd2FzIG5vdCBzcGVjaWZpY2FsbHkgbWVudGlvbmVkIGluIHRoZSBqb2IgcmVxdWlyZW1lbnRzLicpKTtcbiAgICBjb25zdCBncm91cGluZ0NoYW5nZVRleHQgPSBncm91cGluZ1N1Z2dlc3Rpb24/LmNoYW5nZVRleHQgfHwgJyc7XG4gICAgY29uc3QgZ3JvdXBpbmdSZWFzb25UZXh0ID0gZ3JvdXBpbmdTdWdnZXN0aW9uPy5yZWFzb25pbmcgfHwgJyc7XG4gICAgY29uc3QgZ3JvdXBpbmdBdHNJbXBhY3QgPSBncm91cGluZ1N1Z2dlc3Rpb24/LmF0c0ltcGFjdCB8fCAnJztcbiAgICBjb25zdCBncm91cGluZ1BhZ2VJbXBhY3QgPSBncm91cGluZ1N1Z2dlc3Rpb24/LnBhZ2VMZW5ndGhJbXBhY3QgfHwgJyc7XG4gICAgY29uc3QgcmVhc29uaW5nU2VnbWVudHMgPSBbcmVhc29uaW5nVGV4dF07XG4gICAgaWYgKGdyb3VwaW5nQ2hhbmdlVGV4dCkgcmVhc29uaW5nU2VnbWVudHMucHVzaChgQ2hhbmdlOiAke2dyb3VwaW5nQ2hhbmdlVGV4dH1gKTtcbiAgICBpZiAoZ3JvdXBpbmdSZWFzb25UZXh0KSByZWFzb25pbmdTZWdtZW50cy5wdXNoKGdyb3VwaW5nUmVhc29uVGV4dCk7XG4gICAgaWYgKGdyb3VwaW5nQXRzSW1wYWN0KSByZWFzb25pbmdTZWdtZW50cy5wdXNoKGBBVFMgaW1wYWN0OiAke2dyb3VwaW5nQXRzSW1wYWN0fWApO1xuICAgIGlmIChncm91cGluZ1BhZ2VJbXBhY3QpIHJlYXNvbmluZ1NlZ21lbnRzLnB1c2goYFBhZ2UgbGVuZ3RoIGltcGFjdDogJHtncm91cGluZ1BhZ2VJbXBhY3R9YCk7XG4gICAgY29uc3QgZnVsbFJlYXNvbmluZ1RleHQgPSByZWFzb25pbmdTZWdtZW50cy5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuICAgIGNvbnN0IHJvd1N0eWxlICAgICAgICAgICA9IGlzTmV3ID8gJ2JhY2tncm91bmQ6I2ZmZmJlYjsnIDogJyc7XG4gICAgY29uc3QgZGVmYXVsdE1hdGNoZXMgPSBpc05ldyA/IChzYXZlZE1hdGNoZXNbc2tpbGxOYW1lXSB8fCBkZXJpdmVNYXRjaGVzKHNraWxsTmFtZSkpIDogW107XG4gICAgY29uc3QgbWF0Y2hWYWx1ZSA9IGRlZmF1bHRNYXRjaGVzLmpvaW4oJywgJyk7XG4gICAgY29uc3QgbWF0Y2hIZWxwID0gaXNOZXdcbiAgICAgID8gJ0NvbW1hLXNlcGFyYXRlZCBleHBlcmllbmNlIElEcy4gQXV0by1kZXJpdmVkOyB5b3UgY2FuIGVkaXQgYmVmb3JlIHN1Ym1pdC4nXG4gICAgICA6ICdPbmx5IHVzZWQgZm9yIEFJLXN1Z2dlc3RlZCBza2lsbHMuJztcbiAgICBjb25zdCBkZXJpdmVkWWVhcnMgPSBpc05ldyA/IF9jb21wdXRlWWVhcnNGcm9tSWRzKGRlZmF1bHRNYXRjaGVzLCBhbGxFeHBlcmllbmNlcykgOiBudWxsO1xuICAgIGNvbnN0IHllYXJzSGludCA9IGRlcml2ZWRZZWFycyAhPSBudWxsXG4gICAgICA/IGB+JHtkZXJpdmVkWWVhcnN9IHlyJHtkZXJpdmVkWWVhcnMgPT09IDEgPyAnJyA6ICdzJ31gXG4gICAgICA6IChpc05ldyA/ICdubyBtYXRjaCcgOiAnJyk7XG5cbiAgICB0YWJsZUhUTUwgKz0gYFxuICAgICAgPHRyIGRhdGEtc2tpbGw9XCIke3NraWxsTmFtZUVzY31cIiBzdHlsZT1cIiR7cm93U3R5bGV9XCI+XG4gICAgICAgIDx0ZD48c3Ryb25nPiR7c2tpbGxOYW1lRXNjfTwvc3Ryb25nPiR7c2tpbGxUeXBlQmFkZ2V9JHtyZXJ1bk5ld0JhZGdlfSR7bmV3QmFkZ2V9JHtjYW5kaWRhdGVCYWRnZX0ke2V2aWRlbmNlTm90ZX08L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJtaW4td2lkdGg6MTQwcHg7XCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJza2lsbC1jYXRlZ29yeS1pbnB1dFwiIGRhdGEtc2tpbGw9XCIke3NraWxsTmFtZUVzY31cIlxuICAgICAgICAgICAgdmFsdWU9XCIke2VzY2FwZUh0bWwoY2F0ZWdvcnlLZXkpfVwiXG4gICAgICAgICAgICBsaXN0PVwiJHtjYXRlZ29yeUxpc3RJZH1cIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIFByb2dyYW1taW5nXCJcbiAgICAgICAgICAgIHRpdGxlPVwiU2Vzc2lvbi1vbmx5IGNhdGVnb3J5IGxhYmVsIHVzZWQgd2hlbiBncm91cGluZyBza2lsbHMgaW4gdGhlIGdlbmVyYXRlZCBDVlwiXG4gICAgICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Zm9udC1zaXplOjAuOGVtO3BhZGRpbmc6NHB4IDZweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo0cHg7XCIvPlxuICAgICAgICAgICR7Z3JvdXBpbmdTdWdnZXN0aW9uPy5jYXRlZ29yeUNoYW5nZWQgPyBgPGRpdiBjbGFzcz1cInNraWxsLWFpLWhpbnRcIiBzdHlsZT1cIm1hcmdpbi10b3A6NHB4O2ZvbnQtc2l6ZTowLjc1ZW07Y29sb3I6IzQzMzhjYTtcIj5cbiAgICAgICAgICAgIEFJIHN1Z2dlc3Rpb246ICR7ZXNjYXBlSHRtbChncm91cGluZ1N1Z2dlc3Rpb24uY2F0ZWdvcnkpfVxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNraWxsLWFwcGx5LWFpXCIgZGF0YS1za2lsbD1cIiR7c2tpbGxOYW1lRXNjfVwiIGRhdGEtYWktZmllbGQ9XCJjYXRlZ29yeVwiIGRhdGEtYWktdmFsdWU9XCIke2VzY2FwZUh0bWwoZ3JvdXBpbmdTdWdnZXN0aW9uLmNhdGVnb3J5KX1cIiBzdHlsZT1cIm1hcmdpbi1sZWZ0OjZweDtib3JkZXI6MXB4IHNvbGlkICNjN2QyZmU7YmFja2dyb3VuZDojZWVmMmZmO2NvbG9yOiM0MzM4Y2E7Ym9yZGVyLXJhZGl1czo0cHg7cGFkZGluZzoxcHggNnB4O2N1cnNvcjpwb2ludGVyO1wiPkFwcGx5PC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+YCA6ICcnfVxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJtaW4td2lkdGg6MTAwcHg7XCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJza2lsbC1ncm91cC1pbnB1dFwiIGRhdGEtc2tpbGw9XCIke3NraWxsTmFtZUVzY31cIlxuICAgICAgICAgICAgdmFsdWU9XCIke2VzY2FwZUh0bWwoZ3JvdXBLZXkpfVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gY19mYW1pbHlcIlxuICAgICAgICAgICAgdGl0bGU9XCJTa2lsbHMgd2l0aCB0aGUgc2FtZSBncm91cCBrZXkgcmVuZGVyIGFzIG9uZSBjb21tYS1zZXBhcmF0ZWQgYnVsbGV0XCJcbiAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTtmb250LXNpemU6MC44ZW07cGFkZGluZzo0cHggNnB4O2JvcmRlcjoxcHggc29saWQgI2QxZDVkYjtib3JkZXItcmFkaXVzOjRweDtcIi8+XG4gICAgICAgICAgJHtncm91cGluZ1N1Z2dlc3Rpb24/Lmdyb3VwQ2hhbmdlZCA/IGA8ZGl2IGNsYXNzPVwic2tpbGwtYWktaGludFwiIHN0eWxlPVwibWFyZ2luLXRvcDo0cHg7Zm9udC1zaXplOjAuNzVlbTtjb2xvcjojNDMzOGNhO1wiPlxuICAgICAgICAgICAgQUkgc3VnZ2VzdGlvbjogJHtlc2NhcGVIdG1sKGdyb3VwaW5nU3VnZ2VzdGlvbi5ncm91cCl9XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2tpbGwtYXBwbHktYWlcIiBkYXRhLXNraWxsPVwiJHtza2lsbE5hbWVFc2N9XCIgZGF0YS1haS1maWVsZD1cImdyb3VwXCIgZGF0YS1haS12YWx1ZT1cIiR7ZXNjYXBlSHRtbChncm91cGluZ1N1Z2dlc3Rpb24uZ3JvdXApfVwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6NnB4O2JvcmRlcjoxcHggc29saWQgI2M3ZDJmZTtiYWNrZ3JvdW5kOiNlZWYyZmY7Y29sb3I6IzQzMzhjYTtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjFweCA2cHg7Y3Vyc29yOnBvaW50ZXI7XCI+QXBwbHk8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5gIDogJyd9XG4gICAgICAgICAgJHtncm91cFdhcm5pbmcgPyBgPGRpdiBjbGFzcz1cInNraWxsLWdyb3VwLXdhcm5pbmdcIiB0aXRsZT1cIiR7ZXNjYXBlSHRtbChncm91cFdhcm5pbmcucHJldmlldyl9XCIgc3R5bGU9XCJtYXJnaW4tdG9wOjRweDtmb250LXNpemU6MC43NWVtO2NvbG9yOiNiNDUzMDk7XCI+XHUyNkEwICR7ZXNjYXBlSHRtbChncm91cFdhcm5pbmcubWVzc2FnZSl9PC9kaXY+YCA6ICcnfVxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJtaW4td2lkdGg6MTIwcHg7XCI+XG4gICAgICAgICAgPHNlbGVjdCBjbGFzcz1cInNraWxsLXByb2ZpY2llbmN5LWlucHV0XCIgZGF0YS1za2lsbD1cIiR7c2tpbGxOYW1lRXNjfVwiXG4gICAgICAgICAgICB0aXRsZT1cIlNlc3Npb24tb25seSBwcm9maWNpZW5jeSBsYWJlbCB1c2VkIHdoZW4gcmVuZGVyaW5nIGlubGluZSBza2lsbCBidWxsZXRzXCJcbiAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTtmb250LXNpemU6MC44ZW07cGFkZGluZzo0cHggNnB4O2JvcmRlcjoxcHggc29saWQgI2QxZDVkYjtib3JkZXItcmFkaXVzOjRweDtcIj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIiAkeyFwcm9maWNpZW5jeUtleSA/ICdzZWxlY3RlZCcgOiAnJ30+Tm9uZTwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImJlZ2lubmVyXCIgJHtwcm9maWNpZW5jeUtleSA9PT0gJ2JlZ2lubmVyJyA/ICdzZWxlY3RlZCcgOiAnJ30+QmVnaW5uZXI8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJmYW1pbGlhclwiICR7cHJvZmljaWVuY3lLZXkgPT09ICdmYW1pbGlhcicgPyAnc2VsZWN0ZWQnIDogJyd9PkZhbWlsaWFyPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiaW50ZXJtZWRpYXRlXCIgJHtwcm9maWNpZW5jeUtleSA9PT0gJ2ludGVybWVkaWF0ZScgPyAnc2VsZWN0ZWQnIDogJyd9PkludGVybWVkaWF0ZTwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImFkdmFuY2VkXCIgJHtwcm9maWNpZW5jeUtleSA9PT0gJ2FkdmFuY2VkJyA/ICdzZWxlY3RlZCcgOiAnJ30+QWR2YW5jZWQ8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJleHBlcnRcIiAke3Byb2ZpY2llbmN5S2V5ID09PSAnZXhwZXJ0JyA/ICdzZWxlY3RlZCcgOiAnJ30+RXhwZXJ0PC9vcHRpb24+XG4gICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cIm1pbi13aWR0aDoxODBweDtcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cInNraWxsLXN1YnNraWxscy1pbnB1dFwiIGRhdGEtc2tpbGw9XCIke3NraWxsTmFtZUVzY31cIlxuICAgICAgICAgICAgdmFsdWU9XCIke2VzY2FwZUh0bWwoc3Vic2tpbGxzLmpvaW4oJywgJykpfVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gUGFuZGFzLCBOdW1QeVwiXG4gICAgICAgICAgICB0aXRsZT1cIkNvbW1hLXNlcGFyYXRlZCBzdWItc2tpbGxzIHVzZWQgaW4gaW5saW5lIHNraWxsIGJ1bGxldHNcIlxuICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDoxMDAlO2ZvbnQtc2l6ZTowLjhlbTtwYWRkaW5nOjRweCA2cHg7Ym9yZGVyOjFweCBzb2xpZCAjZDFkNWRiO2JvcmRlci1yYWRpdXM6NHB4O1wiLz5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwibWluLXdpZHRoOjE4MHB4O1wiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwic2tpbGwtcGFyZW50aGV0aWNhbC1pbnB1dFwiIGRhdGEtc2tpbGw9XCIke3NraWxsTmFtZUVzY31cIlxuICAgICAgICAgICAgdmFsdWU9XCIke2VzY2FwZUh0bWwocGFyZW50aGV0aWNhbEtleSl9XCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiT3B0aW9uYWwgaW5saW5lIG5vdGVcIlxuICAgICAgICAgICAgdGl0bGU9XCJGcmVlLWZvcm0gcGFyZW50aGV0aWNhbCBvdmVycmlkZSBmb3IgdGhlIHJlbmRlcmVkIGlubGluZSBza2lsbCBsYWJlbFwiXG4gICAgICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Zm9udC1zaXplOjAuOGVtO3BhZGRpbmc6NHB4IDZweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo0cHg7XCIvPlxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQ+PHN0cm9uZz4ke2VzY2FwZUh0bWwocmVjb21tZW5kYXRpb25UZXh0KX08L3N0cm9uZz48L3RkPlxuICAgICAgICA8dGQ+JHtjb25maWRlbmNlQmFkZ2V9PC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwibWF4LXdpZHRoOjMwMHB4O1wiPjxzbWFsbD4ke2VzY2FwZUh0bWwoZnVsbFJlYXNvbmluZ1RleHQpfTwvc21hbGw+PC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwibWluLXdpZHRoOjI2MHB4O1wiPlxuICAgICAgICAgICR7aXNOZXcgPyBgPGlucHV0XG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICBjbGFzcz1cInNraWxsLW1hdGNoLWlucHV0XCJcbiAgICAgICAgICAgIGRhdGEtc2tpbGw9XCIke3NraWxsTmFtZUVzY31cIlxuICAgICAgICAgICAgdmFsdWU9XCIke2VzY2FwZUh0bWwobWF0Y2hWYWx1ZSl9XCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZXhwXzEsIGV4cF8yXCJcbiAgICAgICAgICAgIHRpdGxlPVwiJHtlc2NhcGVIdG1sKG1hdGNoSGVscCl9XCJcbiAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTtmb250LXNpemU6MC44NWVtO3BhZGRpbmc6NnB4IDhweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo2cHg7XCJcbiAgICAgICAgICAvPjxzcGFuIGNsYXNzPVwiZGVyaXZlZC15ZWFycy1oaW50XCIgZGF0YS1za2lsbD1cIiR7c2tpbGxOYW1lRXNjfVwiIHRpdGxlPVwiRXN0aW1hdGVkIHllYXJzIGRlcml2ZWQgZnJvbSBtYXRjaGVkIGV4cGVyaWVuY2UgZW50cmllc1wiIHN0eWxlPVwiZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luLXRvcDo0cHg7Zm9udC1zaXplOjAuOGVtO2NvbG9yOiM2YjcyODA7XCI+JHtlc2NhcGVIdG1sKHllYXJzSGludCl9PC9zcGFuPmAgOiAnPHNwYW4gc3R5bGU9XCJjb2xvcjojOWNhM2FmO1wiPlx1MjAxNDwvc3Bhbj4nfVxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJhY3Rpb24tYnRuc1wiIHN0eWxlPVwid2hpdGUtc3BhY2U6bm93cmFwO1wiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0biAke2RlZmF1bHRBY3Rpb24gPT09ICdlbXBoYXNpemUnICAgID8gJ2FjdGl2ZScgOiAnJ31cIiBkYXRhLWFjdGlvbj1cImVtcGhhc2l6ZVwiICAgIGFyaWEtbGFiZWw9XCJFbXBoYXNpemUgJHtza2lsbE5hbWVFc2N9XCIgICAgYXJpYS1wcmVzc2VkPVwiJHtkZWZhdWx0QWN0aW9uID09PSAnZW1waGFzaXplJ31cIiAgICB0aXRsZT1cIkVtcGhhc2l6ZSBcdTIwMTQgZmVhdHVyZSBwcm9taW5lbnRseVwiIHN0eWxlPVwiY29sb3I6IzEwYjk4MTtcIj5cdTI3OTU8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG4gJHtkZWZhdWx0QWN0aW9uID09PSAnaW5jbHVkZScgICAgICA/ICdhY3RpdmUnIDogJyd9XCIgZGF0YS1hY3Rpb249XCJpbmNsdWRlXCIgICAgICBhcmlhLWxhYmVsPVwiSW5jbHVkZSAke3NraWxsTmFtZUVzY31cIiAgICAgIGFyaWEtcHJlc3NlZD1cIiR7ZGVmYXVsdEFjdGlvbiA9PT0gJ2luY2x1ZGUnfVwiICAgICAgdGl0bGU9XCJJbmNsdWRlIFx1MjAxNCBzdGFuZGFyZCBsaXN0aW5nXCI+XHUyNzEzPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuICR7ZGVmYXVsdEFjdGlvbiA9PT0gJ2RlLWVtcGhhc2l6ZScgPyAnYWN0aXZlJyA6ICcnfVwiIGRhdGEtYWN0aW9uPVwiZGUtZW1waGFzaXplXCIgYXJpYS1sYWJlbD1cIkRlLWVtcGhhc2l6ZSAke3NraWxsTmFtZUVzY31cIiBhcmlhLXByZXNzZWQ9XCIke2RlZmF1bHRBY3Rpb24gPT09ICdkZS1lbXBoYXNpemUnfVwiIHRpdGxlPVwiRGUtZW1waGFzaXplIFx1MjAxNCBicmllZiBtZW50aW9uXCIgICAgc3R5bGU9XCJjb2xvcjojZjU5ZTBiO1wiPlx1Mjc5NjwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0biAke2RlZmF1bHRBY3Rpb24gPT09ICdleGNsdWRlJyAgICAgID8gJ2FjdGl2ZScgOiAnJ31cIiBkYXRhLWFjdGlvbj1cImV4Y2x1ZGVcIiAgICAgIGFyaWEtbGFiZWw9XCJFeGNsdWRlICR7c2tpbGxOYW1lRXNjfVwiICAgICAgYXJpYS1wcmVzc2VkPVwiJHtkZWZhdWx0QWN0aW9uID09PSAnZXhjbHVkZSd9XCIgICAgICB0aXRsZT1cIkV4Y2x1ZGUgXHUyMDE0IG9taXQgZnJvbSBDVlwiICAgICAgICAgIHN0eWxlPVwiY29sb3I6I2VmNDQ0NDtcIj4ke2V5ZVNsYXNoSWNvbigpfTwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIGRhdGEtYWN0aW9uPVwicm93LXVwXCIgICBhcmlhLWxhYmVsPVwiTW92ZSAke3NraWxsTmFtZUVzY30gZWFybGllclwiIHRpdGxlPVwiTW92ZSB1cFwiICAgJHtpc0ZpcnN0ID8gJ2Rpc2FibGVkJyA6ICcnfT5cdTIxOTE8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBkYXRhLWFjdGlvbj1cInJvdy1kb3duXCIgYXJpYS1sYWJlbD1cIk1vdmUgJHtza2lsbE5hbWVFc2N9IGxhdGVyXCIgICB0aXRsZT1cIk1vdmUgZG93blwiICR7aXNMYXN0ICA/ICdkaXNhYmxlZCcgOiAnJ30+XHUyMTkzPC9idXR0b24+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L3RyPlxuICAgIGA7XG4gIH0pO1xuXG4gIHRhYmxlSFRNTCArPSAnPC90Ym9keT48L3RhYmxlPic7XG4gIGNvbnRhaW5lci5pbm5lckhUTUwgPSB0YWJsZUhUTUw7XG5cbiAgLy8gU2F2ZSBncm91cCBrZXkgZm9yIHRoaXMgc2Vzc2lvbiB3aGVuIHVzZXIgZmluaXNoZXMgZWRpdGluZ1xuICBjb250YWluZXIucXVlcnlTZWxlY3RvcignLnNraWxsLWNhdGVnb3J5LW1hbmFnZXInKT8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZSA9PiB7XG4gICAgY29uc3QgY2F0ZWdvcnlNYW5hZ2VySW5wdXQgPSBlLnRhcmdldC5jbG9zZXN0KCcuc2tpbGwtY2F0ZWdvcnktbWFuYWdlci1pbnB1dCcpO1xuICAgIGlmIChjYXRlZ29yeU1hbmFnZXJJbnB1dCkge1xuICAgICAgY29uc3QgbWFuYWdlclJvdyA9IGNhdGVnb3J5TWFuYWdlcklucHV0LmNsb3Nlc3QoJy5za2lsbC1jYXRlZ29yeS1tYW5hZ2VyLXJvdycpO1xuICAgICAgY29uc3Qgb2xkQ2F0ZWdvcnkgPSBtYW5hZ2VyUm93Py5kYXRhc2V0LmNhdGVnb3J5IHx8ICcnO1xuICAgICAgY29uc3QgbmV3Q2F0ZWdvcnkgPSBjYXRlZ29yeU1hbmFnZXJJbnB1dC52YWx1ZS50cmltKCk7XG4gICAgICBpZiAoIW9sZENhdGVnb3J5IHx8ICFuZXdDYXRlZ29yeSB8fCBvbGRDYXRlZ29yeSA9PT0gbmV3Q2F0ZWdvcnkpIHtcbiAgICAgICAgaWYgKG1hbmFnZXJSb3cpIGNhdGVnb3J5TWFuYWdlcklucHV0LnZhbHVlID0gb2xkQ2F0ZWdvcnk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIF9yZW5hbWVTa2lsbENhdGVnb3J5TG9jYWxseShvbGRDYXRlZ29yeSwgbmV3Q2F0ZWdvcnkpO1xuICAgICAgcmVuYW1lU2tpbGxDYXRlZ29yeShvbGRDYXRlZ29yeSwgbmV3Q2F0ZWdvcnkpXG4gICAgICAgIC50aGVuKCgpID0+IF9yZW5kZXJTa2lsbHNUYWJsZShjb250YWluZXIsIHJlY29tbWVuZGVkU2V0LCBkYXRhLCBoYXJkU2tpbGxTZXQsIHNvZnRTa2lsbFNldCkpXG4gICAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgX3JlbmFtZVNraWxsQ2F0ZWdvcnlMb2NhbGx5KG5ld0NhdGVnb3J5LCBvbGRDYXRlZ29yeSk7XG4gICAgICAgICAgaWYgKG1hbmFnZXJSb3cpIGNhdGVnb3J5TWFuYWdlcklucHV0LnZhbHVlID0gb2xkQ2F0ZWdvcnk7XG4gICAgICAgICAgc2hvd1RvYXN0KCdGYWlsZWQgdG8gcmVuYW1lIHNraWxsIGNhdGVnb3J5LicsICdlcnJvcicpO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcjc2tpbGxzLXJldmlldy10YWJsZSB0Ym9keScpPy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBlID0+IHtcbiAgICBjb25zdCBjYXRlZ29yeUlucHV0ID0gZS50YXJnZXQuY2xvc2VzdCgnLnNraWxsLWNhdGVnb3J5LWlucHV0Jyk7XG5cbiAgY29uc3QgYWRkU2tpbGxGb3JtID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJyNhZGQtc2tpbGwtZm9ybScpO1xuICBjb25zdCB0b2dnbGVBZGRTa2lsbEZvcm0gPSAoKSA9PiB7XG4gICAgaWYgKCFhZGRTa2lsbEZvcm0pIHJldHVybjtcbiAgICBhZGRTa2lsbEZvcm0uc3R5bGUuZGlzcGxheSA9IGFkZFNraWxsRm9ybS5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScgPyAnYmxvY2snIDogJ25vbmUnO1xuICB9O1xuICBjb250YWluZXIucXVlcnlTZWxlY3RvcignI3RvZ2dsZS1hZGQtc2tpbGwtZm9ybScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRvZ2dsZUFkZFNraWxsRm9ybSk7XG4gIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcjY2FuY2VsLWFkZC1za2lsbCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBpZiAoIWFkZFNraWxsRm9ybSkgcmV0dXJuO1xuICAgIGFkZFNraWxsRm9ybS5yZXNldCgpO1xuICAgIGFkZFNraWxsRm9ybS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICB9KTtcbiAgYWRkU2tpbGxGb3JtPy5hZGRFdmVudExpc3RlbmVyKCdzdWJtaXQnLCBhc3luYyBlID0+IHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoYWRkU2tpbGxGb3JtKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgc2F2ZVVzZXJDcmVhdGVkU2tpbGwoe1xuICAgICAgICBuYW1lOiBmb3JtRGF0YS5nZXQoJ25hbWUnKSxcbiAgICAgICAgY2F0ZWdvcnk6IGZvcm1EYXRhLmdldCgnY2F0ZWdvcnknKSxcbiAgICAgICAgZ3JvdXA6IGZvcm1EYXRhLmdldCgnZ3JvdXAnKSxcbiAgICAgICAgcHJvZmljaWVuY3k6IGZvcm1EYXRhLmdldCgncHJvZmljaWVuY3knKSxcbiAgICAgICAgc3Vic2tpbGxzOiBmb3JtRGF0YS5nZXQoJ3N1YnNraWxscycpLFxuICAgICAgICBwYXJlbnRoZXRpY2FsOiBmb3JtRGF0YS5nZXQoJ3BhcmVudGhldGljYWwnKSxcbiAgICAgIH0pO1xuICAgICAgc2hvd1RvYXN0KCdTZXNzaW9uLW9ubHkgc2tpbGwgYWRkZWQuJyk7XG4gICAgICBhZGRTa2lsbEZvcm0ucmVzZXQoKTtcbiAgICAgIGFkZFNraWxsRm9ybS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgX3JlbmRlclNraWxsc1RhYmxlKGNvbnRhaW5lciwgcmVjb21tZW5kZWRTZXQsIGRhdGEsIGhhcmRTa2lsbFNldCwgc29mdFNraWxsU2V0KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgc2hvd1RvYXN0KGVycm9yLm1lc3NhZ2UgfHwgJ0ZhaWxlZCB0byBhZGQgc2tpbGwuJywgJ2Vycm9yJyk7XG4gICAgfVxuICB9KTtcbiAgICBpZiAoY2F0ZWdvcnlJbnB1dCkge1xuICAgICAgY29uc3Qgc2tpbGxOYW1lID0gY2F0ZWdvcnlJbnB1dC5kYXRhc2V0LnNraWxsO1xuICAgICAgY29uc3QgbmV3Q2F0ZWdvcnkgPSBjYXRlZ29yeUlucHV0LnZhbHVlLnRyaW0oKTtcbiAgICAgIHNhdmVTa2lsbENhdGVnb3J5T3ZlcnJpZGUoc2tpbGxOYW1lLCBuZXdDYXRlZ29yeSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICBzaG93VG9hc3QoJ0ZhaWxlZCB0byBzYXZlIHNraWxsIGNhdGVnb3J5LicsICdlcnJvcicpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaW5wdXQgPSBlLnRhcmdldC5jbG9zZXN0KCcuc2tpbGwtZ3JvdXAtaW5wdXQnKTtcbiAgICBpZiAoaW5wdXQpIHtcbiAgICAgIGNvbnN0IHNraWxsTmFtZSA9IGlucHV0LmRhdGFzZXQuc2tpbGw7XG4gICAgICBjb25zdCBuZXdHcm91cCA9IGlucHV0LnZhbHVlLnRyaW0oKTtcbiAgICAgIHNhdmVTa2lsbEdyb3VwT3ZlcnJpZGUoc2tpbGxOYW1lLCBuZXdHcm91cCkuY2F0Y2goKCkgPT4ge1xuICAgICAgICBzaG93VG9hc3QoJ0ZhaWxlZCB0byBzYXZlIHNraWxsIGdyb3VwLicsICdlcnJvcicpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcXVhbGlmaWVySW5wdXQgPSBlLnRhcmdldC5jbG9zZXN0KCcuc2tpbGwtcHJvZmljaWVuY3ktaW5wdXQsIC5za2lsbC1zdWJza2lsbHMtaW5wdXQsIC5za2lsbC1wYXJlbnRoZXRpY2FsLWlucHV0Jyk7XG4gICAgaWYgKCFxdWFsaWZpZXJJbnB1dCkgcmV0dXJuO1xuICAgIGNvbnN0IHNraWxsTmFtZSA9IHF1YWxpZmllcklucHV0LmRhdGFzZXQuc2tpbGw7XG4gICAgY29uc3Qgcm93ID0gcXVhbGlmaWVySW5wdXQuY2xvc2VzdCgndHJbZGF0YS1za2lsbF0nKTtcbiAgICBpZiAoIXNraWxsTmFtZSB8fCAhcm93KSByZXR1cm47XG4gICAgY29uc3QgcHJvZmljaWVuY3kgPSByb3cucXVlcnlTZWxlY3RvcignLnNraWxsLXByb2ZpY2llbmN5LWlucHV0Jyk/LnZhbHVlIHx8ICcnO1xuICAgIGNvbnN0IHN1YnNraWxsc1ZhbHVlID0gcm93LnF1ZXJ5U2VsZWN0b3IoJy5za2lsbC1zdWJza2lsbHMtaW5wdXQnKT8udmFsdWUgfHwgJyc7XG4gICAgY29uc3QgcGFyZW50aGV0aWNhbCA9IHJvdy5xdWVyeVNlbGVjdG9yKCcuc2tpbGwtcGFyZW50aGV0aWNhbC1pbnB1dCcpPy52YWx1ZSB8fCAnJztcbiAgICBzYXZlU2tpbGxRdWFsaWZpZXJPdmVycmlkZShza2lsbE5hbWUsIHtcbiAgICAgIHByb2ZpY2llbmN5LFxuICAgICAgc3Vic2tpbGxzOiBzdWJza2lsbHNWYWx1ZSxcbiAgICAgIHBhcmVudGhldGljYWwsXG4gICAgfSkuY2F0Y2goKCkgPT4ge1xuICAgICAgc2hvd1RvYXN0KCdGYWlsZWQgdG8gc2F2ZSBza2lsbCBxdWFsaWZpZXJzLicsICdlcnJvcicpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBVcGRhdGUgZGVyaXZlZC15ZWFycyBoaW50IGxpdmUgYXMgdXNlciBlZGl0cyB0aGUgZXhwZXJpZW5jZSBtYXRjaCBpbnB1dFxuICBjb250YWluZXIucXVlcnlTZWxlY3RvcignI3NraWxscy1yZXZpZXctdGFibGUgdGJvZHknKT8uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBlID0+IHtcbiAgICBjb25zdCBpbnB1dCA9IGUudGFyZ2V0LmNsb3Nlc3QoJy5za2lsbC1tYXRjaC1pbnB1dCcpO1xuICAgIGlmICghaW5wdXQpIHJldHVybjtcbiAgICBjb25zdCBza2lsbE5hbWUgPSBpbnB1dC5kYXRhc2V0LnNraWxsO1xuICAgIGNvbnN0IGlkcyA9IGlucHV0LnZhbHVlLnNwbGl0KCcsJykubWFwKHggPT4geC50cmltKCkpLmZpbHRlcihCb29sZWFuKTtcbiAgICBjb25zdCB5ZWFycyA9IF9jb21wdXRlWWVhcnNGcm9tSWRzKGlkcywgYWxsRXhwZXJpZW5jZXMpO1xuICAgIGNvbnN0IGhpbnQgPSB5ZWFycyAhPSBudWxsID8gYH4ke3llYXJzfSB5ciR7eWVhcnMgPT09IDEgPyAnJyA6ICdzJ31gIDogJ25vIG1hdGNoJztcbiAgICBjb25zdCBzcGFuID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoYC5kZXJpdmVkLXllYXJzLWhpbnRbZGF0YS1za2lsbD1cIiR7Q1NTLmVzY2FwZShza2lsbE5hbWUpfVwiXWApO1xuICAgIGlmIChzcGFuKSBzcGFuLnRleHRDb250ZW50ID0gaGludDtcbiAgfSk7XG5cbiAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJyNza2lsbHMtcmV2aWV3LXRhYmxlIHRib2R5Jyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZSA9PiB7XG4gICAgY29uc3QgdHlwZVRvZ2dsZSA9IGUudGFyZ2V0LmNsb3Nlc3QoJy5za2lsbC10eXBlLXRvZ2dsZScpO1xuICAgIGlmICh0eXBlVG9nZ2xlKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgY29uc3Qgc2tpbGxOYW1lID0gdHlwZVRvZ2dsZS5kYXRhc2V0LnNraWxsO1xuICAgICAgY29uc3QgdG9nZ2xlVG8gPSB0eXBlVG9nZ2xlLmRhdGFzZXQudG9nZ2xlVG8gfHwgbnVsbDtcbiAgICAgIHdpbmRvdy5fc2tpbGxUeXBlT3ZlcnJpZGVzID0gd2luZG93Ll9za2lsbFR5cGVPdmVycmlkZXMgfHwge307XG4gICAgICBpZiAodG9nZ2xlVG8pIHtcbiAgICAgICAgd2luZG93Ll9za2lsbFR5cGVPdmVycmlkZXNbc2tpbGxOYW1lLnRvTG93ZXJDYXNlKCldID0gdG9nZ2xlVG87XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgd2luZG93Ll9za2lsbFR5cGVPdmVycmlkZXNbc2tpbGxOYW1lLnRvTG93ZXJDYXNlKCldO1xuICAgICAgfVxuICAgICAgc2F2ZVNraWxsUXVhbGlmaWVyT3ZlcnJpZGUoc2tpbGxOYW1lLCB7XG4gICAgICAgIHByb2ZpY2llbmN5OiBjb250YWluZXIucXVlcnlTZWxlY3RvcihgLnNraWxsLXByb2ZpY2llbmN5LWlucHV0W2RhdGEtc2tpbGw9XCIke19jc3NFc2NhcGUoc2tpbGxOYW1lKX1cIl1gKT8udmFsdWUgfHwgJycsXG4gICAgICAgIHN1YnNraWxsczogY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoYC5za2lsbC1zdWJza2lsbHMtaW5wdXRbZGF0YS1za2lsbD1cIiR7X2Nzc0VzY2FwZShza2lsbE5hbWUpfVwiXWApPy52YWx1ZSB8fCAnJyxcbiAgICAgICAgcGFyZW50aGV0aWNhbDogY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoYC5za2lsbC1wYXJlbnRoZXRpY2FsLWlucHV0W2RhdGEtc2tpbGw9XCIke19jc3NFc2NhcGUoc2tpbGxOYW1lKX1cIl1gKT8udmFsdWUgfHwgJycsXG4gICAgICAgIHNraWxsX3R5cGU6IHRvZ2dsZVRvIHx8ICcnLFxuICAgICAgfSkudGhlbigoKSA9PiBfcmVuZGVyU2tpbGxzVGFibGUoY29udGFpbmVyLCByZWNvbW1lbmRlZFNldCwgZGF0YSwgaGFyZFNraWxsU2V0LCBzb2Z0U2tpbGxTZXQpKVxuICAgICAgICAuY2F0Y2goKCkgPT4gc2hvd1RvYXN0KCdGYWlsZWQgdG8gc2F2ZSBza2lsbCB0eXBlIG92ZXJyaWRlLicsICdlcnJvcicpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBhaUJ0biA9IGUudGFyZ2V0LmNsb3Nlc3QoJy5za2lsbC1hcHBseS1haScpO1xuICAgIGlmIChhaUJ0bikge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGNvbnN0IHNraWxsTmFtZSA9IGFpQnRuLmRhdGFzZXQuc2tpbGw7XG4gICAgICBjb25zdCBmaWVsZCA9IGFpQnRuLmRhdGFzZXQuYWlGaWVsZDtcbiAgICAgIGNvbnN0IHZhbHVlID0gYWlCdG4uZGF0YXNldC5haVZhbHVlIHx8ICcnO1xuICAgICAgaWYgKGZpZWxkID09PSAnY2F0ZWdvcnknKSB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoYC5za2lsbC1jYXRlZ29yeS1pbnB1dFtkYXRhLXNraWxsPVwiJHtfY3NzRXNjYXBlKHNraWxsTmFtZSl9XCJdYCk7XG4gICAgICAgIGlmIChpbnB1dCkgaW5wdXQudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgc2F2ZVNraWxsQ2F0ZWdvcnlPdmVycmlkZShza2lsbE5hbWUsIHZhbHVlKVxuICAgICAgICAgIC50aGVuKCgpID0+IF9yZW5kZXJTa2lsbHNUYWJsZShjb250YWluZXIsIHJlY29tbWVuZGVkU2V0LCBkYXRhLCBoYXJkU2tpbGxTZXQsIHNvZnRTa2lsbFNldCkpXG4gICAgICAgICAgLmNhdGNoKCgpID0+IHNob3dUb2FzdCgnRmFpbGVkIHRvIGFwcGx5IEFJIGNhdGVnb3J5IHN1Z2dlc3Rpb24uJywgJ2Vycm9yJykpO1xuICAgICAgfSBlbHNlIGlmIChmaWVsZCA9PT0gJ2dyb3VwJykge1xuICAgICAgICBjb25zdCBpbnB1dCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKGAuc2tpbGwtZ3JvdXAtaW5wdXRbZGF0YS1za2lsbD1cIiR7X2Nzc0VzY2FwZShza2lsbE5hbWUpfVwiXWApO1xuICAgICAgICBpZiAoaW5wdXQpIGlucHV0LnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHNhdmVTa2lsbEdyb3VwT3ZlcnJpZGUoc2tpbGxOYW1lLCB2YWx1ZSlcbiAgICAgICAgICAudGhlbigoKSA9PiBfcmVuZGVyU2tpbGxzVGFibGUoY29udGFpbmVyLCByZWNvbW1lbmRlZFNldCwgZGF0YSwgaGFyZFNraWxsU2V0LCBzb2Z0U2tpbGxTZXQpKVxuICAgICAgICAgIC5jYXRjaCgoKSA9PiBzaG93VG9hc3QoJ0ZhaWxlZCB0byBhcHBseSBBSSBncm91cCBzdWdnZXN0aW9uLicsICdlcnJvcicpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgYnRuID0gZS50YXJnZXQuY2xvc2VzdCgnLmljb24tYnRuJyk7XG4gICAgaWYgKCFidG4pIHJldHVybjtcbiAgICBjb25zdCB0ciA9IGJ0bi5jbG9zZXN0KCd0cltkYXRhLXNraWxsXScpO1xuICAgIGlmICghdHIpIHJldHVybjtcbiAgICBjb25zdCBza2lsbE5hbWUgPSB0ci5kYXRhc2V0LnNraWxsO1xuICAgIGNvbnN0IGFjdGlvbiAgICA9IGJ0bi5kYXRhc2V0LmFjdGlvbjtcbiAgICBpZiAoYWN0aW9uID09PSAncm93LXVwJykge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIG1vdmVTa2lsbFJvdyhza2lsbE5hbWUsIC0xKTtcbiAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PT0gJ3Jvdy1kb3duJykge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIG1vdmVTa2lsbFJvdyhza2lsbE5hbWUsICsxKTtcbiAgICB9IGVsc2UgaWYgKGFjdGlvbikge1xuICAgICAgaGFuZGxlQWN0aW9uQ2xpY2soc2tpbGxOYW1lLCBhY3Rpb24sICdza2lsbCcpO1xuICAgIH1cbiAgfSk7XG5cbiAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5za2lsbC1jYXRlZ29yeS1tYW5hZ2VyJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZSA9PiB7XG4gICAgY29uc3QgYnRuID0gZS50YXJnZXQuY2xvc2VzdCgnLmljb24tYnRuW2RhdGEtYWN0aW9uXj1cImNhdGVnb3J5LVwiXScpO1xuICAgIGlmICghYnRuKSByZXR1cm47XG4gICAgY29uc3QgY2F0ZWdvcnlOYW1lID0gYnRuLmRhdGFzZXQuY2F0ZWdvcnkgfHwgJyc7XG4gICAgY29uc3QgZGlyZWN0aW9uID0gYnRuLmRhdGFzZXQuYWN0aW9uID09PSAnY2F0ZWdvcnktdXAnID8gLTEgOiAxO1xuICAgIGNvbnN0IHVwZGF0ZWRPcmRlciA9IF9tb3ZlU2tpbGxDYXRlZ29yeUxvY2FsbHkoY2F0ZWdvcnlOYW1lLCBkaXJlY3Rpb24pO1xuICAgIGlmICghdXBkYXRlZE9yZGVyKSByZXR1cm47XG4gICAgc2F2ZVNraWxsQ2F0ZWdvcnlPcmRlcih1cGRhdGVkT3JkZXIpXG4gICAgICAudGhlbigoKSA9PiBfcmVuZGVyU2tpbGxzVGFibGUoY29udGFpbmVyLCByZWNvbW1lbmRlZFNldCwgZGF0YSwgaGFyZFNraWxsU2V0LCBzb2Z0U2tpbGxTZXQpKVxuICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgX21vdmVTa2lsbENhdGVnb3J5TG9jYWxseShjYXRlZ29yeU5hbWUsIC1kaXJlY3Rpb24pO1xuICAgICAgICBzaG93VG9hc3QoJ0ZhaWxlZCB0byBzYXZlIHNraWxsIGNhdGVnb3J5IG9yZGVyLicsICdlcnJvcicpO1xuICAgICAgfSk7XG4gIH0pO1xuXG4gIGNvbnN0IHNraWxsVG9vbGJhciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBza2lsbFRvb2xiYXIuY2xhc3NOYW1lID0gJ2J1bGstdG9vbGJhcic7XG4gIHNraWxsVG9vbGJhci5pbm5lckhUTUwgPSBgXG4gICAgPHNwYW4+QnVsazo8L3NwYW4+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImJ1bGstYnRuIGJ1bGstcmVjb21tZW5kZWRcIiBvbmNsaWNrPVwiYnVsa0FjdGlvbigncmVjb21tZW5kZWQnLCdza2lsbCcpXCIgdGl0bGU9XCJTZXQgYWxsIHRvIHRoZSBMTE0gcmVjb21tZW5kYXRpb25cIj5cdTI3MjggQWNjZXB0IEFsbCBSZWNvbW1lbmRlZDwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJidWxrLWJ0biBidWxrLWVtcGhhc2l6ZVwiICAgb25jbGljaz1cImJ1bGtBY3Rpb24oJ2VtcGhhc2l6ZScsJ3NraWxsJylcIj5cdTI3OTUgRW1waGFzaXplIEFsbDwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJidWxrLWJ0biBidWxrLWluY2x1ZGVcIiAgICAgb25jbGljaz1cImJ1bGtBY3Rpb24oJ2luY2x1ZGUnLCdza2lsbCcpXCI+XHUyNzEzIEluY2x1ZGUgQWxsPC9idXR0b24+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImJ1bGstYnRuIGJ1bGstZXhjbHVkZVwiICAgICBvbmNsaWNrPVwiYnVsa0FjdGlvbignZXhjbHVkZScsJ3NraWxsJylcIj4ke2V5ZVNsYXNoSWNvbigpfSBFeGNsdWRlIEFsbDwvYnV0dG9uPlxuICBgO1xuICBjb250YWluZXIuaW5zZXJ0QmVmb3JlKHNraWxsVG9vbGJhciwgY29udGFpbmVyLmZpcnN0Q2hpbGQpO1xuXG4gICQoJyNza2lsbHMtcmV2aWV3LXRhYmxlJykuRGF0YVRhYmxlKHtcbiAgICBwYWdpbmc6IGZhbHNlLFxuICAgIG9yZGVyOiBbXSxcbiAgICBsYW5ndWFnZTogeyBzZWFyY2g6ICdGaWx0ZXIgc2tpbGxzOicgfVxuICB9KTtcbiAgX3VwZGF0ZVBhZ2VFc3RpbWF0ZSgpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgUm93IHJlb3JkZXIgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIG1vdmVTa2lsbFJvdyhza2lsbE5hbWUsIGRpcmVjdGlvbikge1xuICBjb25zdCBhcnIgPSB3aW5kb3cuX3NraWxsc09yZGVyZWQ7XG4gIGlmICghYXJyKSByZXR1cm47XG4gIGNvbnN0IGlkeCA9IGFyci5maW5kSW5kZXgocyA9PiAodHlwZW9mIHMgPT09ICdzdHJpbmcnID8gcyA6IHMubmFtZSB8fCBzKSA9PT0gc2tpbGxOYW1lKTtcbiAgaWYgKGlkeCA8IDApIHJldHVybjtcbiAgY29uc3QgbmV3SWR4ID0gaWR4ICsgZGlyZWN0aW9uO1xuICBpZiAobmV3SWR4IDwgMCB8fCBuZXdJZHggPj0gYXJyLmxlbmd0aCkgcmV0dXJuO1xuICBbYXJyW2lkeF0sIGFycltuZXdJZHhdXSA9IFthcnJbbmV3SWR4XSwgYXJyW2lkeF1dO1xuICB3aW5kb3cuX3NraWxsc09yZGVyZWQgPSBhcnI7XG4gIF9yZW5kZXJTa2lsbHNUYWJsZShudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTtcbiAgZmV0Y2goJy9hcGkvcmVvcmRlci1yb3dzJywge1xuICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgdHlwZTogJ3NraWxsJywgb3JkZXJlZF9pZHM6IGFyci5tYXAocyA9PiAodHlwZW9mIHMgPT09ICdzdHJpbmcnID8gcyA6IHMubmFtZSB8fCBzKSkgfSlcbiAgfSkuY2F0Y2goKCkgPT4ge30pO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgTGVnYWN5IGludGVyYWN0aXZlLW1vZGUgcmVzcG9uc2UgaGFuZGxlciBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gaGFuZGxlU2tpbGxzUmVzcG9uc2UobWVzc2FnZSkge1xuICB3aW5kb3cud2FpdGluZ0ZvclNraWxsc1Jlc3BvbnNlID0gZmFsc2U7XG4gIGNvbnN0IHJlc3BvbnNlID0gbWVzc2FnZS50b0xvd2VyQ2FzZSgpO1xuXG4gIGlmIChyZXNwb25zZS5pbmNsdWRlcygneWVzJykpIHtcbiAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCAnRXhjZWxsZW50ISBJXFwnbGwgdXNlIHRoaXMgc2tpbGxzIHN0cmF0ZWd5IGluIHlvdXIgQ1YuJyk7XG4gIH0gZWxzZSBpZiAocmVzcG9uc2UuaW5jbHVkZXMoJ25vJykgfHwgcmVzcG9uc2UuaW5jbHVkZXMoJ21vZGlmeScpKSB7XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ0kgdW5kZXJzdGFuZC4gV2hhdCBjaGFuZ2VzIHdvdWxkIHlvdSBsaWtlIG1lIHRvIG1ha2UgdG8gdGhlIHNraWxscyBlbXBoYXNpcz8nKTtcbiAgfSBlbHNlIHtcbiAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCAnSVxcJ2xsIG5vdGUgeW91ciBmZWVkYmFjayBvbiB0aGUgc2tpbGxzIHN0cmF0ZWd5LicpO1xuICB9XG5cbiAgZmluaXNoSW50ZXJhY3RpdmVSZXZpZXcoKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFN1Ym1pdCBkZWNpc2lvbnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIHN1Ym1pdFNraWxsRGVjaXNpb25zKCkge1xuICAvKiBkdWNrZmxvdzpcbiAgICogICBpZDogc2tpbGxzX3VpX3N1Ym1pdF9saXZlXG4gICAqICAga2luZDogdWlcbiAgICogICB0aW1lc3RhbXA6ICcyMDI2LTAzLTI1VDIxOjM5OjQ4WidcbiAgICogICBzdGF0dXM6IGxpdmVcbiAgICogICBoYW5kbGVzOlxuICAgKiAgIC0gdWk6c2tpbGxzLXJldmlldy5zdWJtaXRcbiAgICogICBjYWxsczpcbiAgICogICAtIFBPU1QgL2FwaS9yZXZpZXctZGVjaXNpb25zXG4gICAqICAgLSBQT1NUIC9hcGkvY3YvbGF5b3V0LWVzdGltYXRlXG4gICAqICAgcmVhZHM6XG4gICAqICAgLSB3aW5kb3c6dXNlclNlbGVjdGlvbnMuc2tpbGxzXG4gICAqICAgLSB3aW5kb3c6X3NraWxsc09yZGVyZWRcbiAgICogICAtIGRvbTouc2tpbGwtbWF0Y2gtaW5wdXQudmFsdWVcbiAgICogICB3cml0ZXM6XG4gICAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9yZXZpZXctZGVjaXNpb25zLmRlY2lzaW9uc1xuICAgKiAgIC0gcmVxdWVzdDpQT1NUIC9hcGkvcmV2aWV3LWRlY2lzaW9ucy5leHRyYV9za2lsbHNcbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL3Jldmlldy1kZWNpc2lvbnMuZXh0cmFfc2tpbGxfbWF0Y2hlc1xuICAgKiAgIC0gd2luZG93Ol9zYXZlZERlY2lzaW9ucy5za2lsbF9kZWNpc2lvbnNcbiAgICogICAtIHdpbmRvdzpfc2F2ZWREZWNpc2lvbnMuZXh0cmFfc2tpbGxzXG4gICAqICAgLSB3aW5kb3c6X3NhdmVkRGVjaXNpb25zLmV4dHJhX3NraWxsX21hdGNoZXNcbiAgICogICBub3RlczogU3VibWl0cyBza2lsbCBpbmNsdXNpb24gZGVjaXNpb25zIHRvZ2V0aGVyIHdpdGggc2Vzc2lvbi1vbmx5IGV4dHJhIHNraWxscyBhbmQgZXhwZXJpZW5jZS1tYXRjaCBldmlkZW5jZSBzbyBiYWNrZW5kIGdlbmVyYXRpb24gY2FuIG1hdGVyaWFsaXplIHRoZSBzYW1lIG92ZXJsYXkgc3RhdGUuXG4gICAqL1xuICBjb25zdCBkZWNpc2lvbnMgPSB1c2VyU2VsZWN0aW9ucy5za2lsbHM7XG4gIGNvbnN0IGNvdW50ID0gT2JqZWN0LmtleXMoZGVjaXNpb25zKS5sZW5ndGg7XG5cbiAgaWYgKGNvdW50ID09PSAwKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ05vIFNlbGVjdGlvbnMnLCAnUGxlYXNlIHNlbGVjdCBhY3Rpb25zIGZvciBhdCBsZWFzdCBvbmUgc2tpbGwgYmVmb3JlIHN1Ym1pdHRpbmcuJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBleHRyYVNraWxscyA9ICh3aW5kb3cuX3NraWxsc09yZGVyZWQgfHwgW10pXG4gICAgICAuZmlsdGVyKHNraWxsID0+IHNraWxsICYmIHR5cGVvZiBza2lsbCA9PT0gJ29iamVjdCcgJiYgc2tpbGwuX2lzTmV3KVxuICAgICAgLmZpbHRlcihza2lsbCA9PiB7XG4gICAgICAgIGNvbnN0IGFjdGlvbiA9IGRlY2lzaW9uc1tfc2tpbGxOYW1lKHNraWxsKV07XG4gICAgICAgIHJldHVybiBhY3Rpb24gPT09ICdpbmNsdWRlJyB8fCBhY3Rpb24gPT09ICdlbXBoYXNpemUnIHx8IGFjdGlvbiA9PT0gJ2RlLWVtcGhhc2l6ZSc7XG4gICAgICB9KVxuICAgICAgLm1hcChza2lsbCA9PiB7XG4gICAgICAgIGlmIChza2lsbC5faXNVc2VyQ3JlYXRlZCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiBfc2tpbGxOYW1lKHNraWxsKSxcbiAgICAgICAgICAgIGNhdGVnb3J5OiBTdHJpbmcoc2tpbGwuY2F0ZWdvcnkgfHwgJycpLnRyaW0oKSxcbiAgICAgICAgICAgIGdyb3VwOiBTdHJpbmcoc2tpbGwuZ3JvdXAgfHwgJycpLnRyaW0oKSxcbiAgICAgICAgICAgIHByb2ZpY2llbmN5OiBTdHJpbmcoc2tpbGwucHJvZmljaWVuY3kgfHwgJycpLnRyaW0oKSxcbiAgICAgICAgICAgIHN1YnNraWxsczogX25vcm1hbGl6ZVNraWxsU3Vic2tpbGxzKHNraWxsLnN1YnNraWxscyB8fCBza2lsbC5zdWJfc2tpbGxzIHx8IFtdKSxcbiAgICAgICAgICAgIHBhcmVudGhldGljYWw6IFN0cmluZyhza2lsbC5wYXJlbnRoZXRpY2FsIHx8ICcnKS50cmltKCksXG4gICAgICAgICAgICB1c2VyX2NyZWF0ZWQ6IHRydWUsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX3NraWxsTmFtZShza2lsbCk7XG4gICAgICB9KTtcbiAgICBjb25zdCBleHRyYVNraWxsTmFtZXMgPSBleHRyYVNraWxscy5tYXAoc2tpbGwgPT4gdHlwZW9mIHNraWxsID09PSAnc3RyaW5nJyA/IHNraWxsIDogc2tpbGwubmFtZSk7XG5cbiAgICBjb25zdCBtYXRjaElucHV0cyA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnNraWxsLW1hdGNoLWlucHV0JykpO1xuICAgIGNvbnN0IGFsbG93ZWQgPSBuZXcgU2V0KCh3aW5kb3cuX2FsbEV4cGVyaWVuY2VzIHx8IFtdKS5tYXAoZSA9PiBlLmlkKS5maWx0ZXIoQm9vbGVhbikpO1xuICAgIGNvbnN0IGV4dHJhU2tpbGxNYXRjaGVzID0ge307XG4gICAgZm9yIChjb25zdCBpbnB1dCBvZiBtYXRjaElucHV0cykge1xuICAgICAgY29uc3Qgc2tpbGxOYW1lID0gaW5wdXQuZGF0YXNldC5za2lsbDtcbiAgICAgIGlmICghc2tpbGxOYW1lIHx8ICFleHRyYVNraWxsTmFtZXMuaW5jbHVkZXMoc2tpbGxOYW1lKSkgY29udGludWU7XG4gICAgICBjb25zdCBpZHMgPSBTdHJpbmcoaW5wdXQudmFsdWUgfHwgJycpXG4gICAgICAgIC5zcGxpdCgnLCcpXG4gICAgICAgIC5tYXAoKHgpID0+IHgudHJpbSgpKVxuICAgICAgICAuZmlsdGVyKCh4KSA9PiB4ICYmIGFsbG93ZWQuaGFzKHgpKTtcbiAgICAgIGlmIChpZHMubGVuZ3RoID4gMCkgZXh0cmFTa2lsbE1hdGNoZXNbc2tpbGxOYW1lXSA9IGlkcztcbiAgICB9XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3Jldmlldy1kZWNpc2lvbnMnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICB0eXBlOiAnc2tpbGxzJyxcbiAgICAgICAgZGVjaXNpb25zOiBkZWNpc2lvbnMsXG4gICAgICAgIGV4dHJhX3NraWxsczogZXh0cmFTa2lsbHMsXG4gICAgICAgIGV4dHJhX3NraWxsX21hdGNoZXM6IGV4dHJhU2tpbGxNYXRjaGVzLFxuICAgICAgfSlcbiAgICB9KTtcblxuICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgc3RhdGVNYW5hZ2VyLm1hcmtDb250ZW50Q2hhbmdlZCgpO1xuICAgICAgY29uc3QgZXh0cmFOb3RlID0gZXh0cmFTa2lsbHMubGVuZ3RoID4gMFxuICAgICAgICA/IGAgKCR7ZXh0cmFTa2lsbHMubGVuZ3RofSBuZXcgc2tpbGwocykgYWRkZWQgXHUyMDE0IGF2YWlsYWJsZSBmb3Igd3JpdGUtYmFjayB0byBtYXN0ZXIgQ1YgaW4gdGhlIEhhcnZlc3QgdGFiKWBcbiAgICAgICAgOiAnJztcbiAgICAgIHNob3dUb2FzdChgU2tpbGwgZGVjaXNpb25zIHNhdmVkICgke2NvdW50fSBpdGVtcykke2V4dHJhTm90ZX1gKTtcbiAgICAgIHNjaGVkdWxlQXRzUmVmcmVzaCgpO1xuICAgICAgLy8gUGVyc2lzdCBzYXZlZCBkZWNpc2lvbnMgbG9jYWxseSBzbyB0aGUgVUkgcmVmbGVjdHMgdGhlbSBpbW1lZGlhdGVseVxuICAgICAgd2luZG93Ll9zYXZlZERlY2lzaW9ucyA9IHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMgfHwge307XG4gICAgICB3aW5kb3cuX3NhdmVkRGVjaXNpb25zLnNraWxsX2RlY2lzaW9ucyA9IGRlY2lzaW9ucztcbiAgICAgIGlmICghd2luZG93Ll9zYXZlZERlY2lzaW9ucy5leHRyYV9za2lsbHMpIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMuZXh0cmFfc2tpbGxzID0gW107XG4gICAgICBpZiAoZXh0cmFTa2lsbHMubGVuZ3RoID4gMCkgd2luZG93Ll9zYXZlZERlY2lzaW9ucy5leHRyYV9za2lsbHMgPSBleHRyYVNraWxscztcbiAgICAgIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMuZXh0cmFfc2tpbGxfbWF0Y2hlcyA9IGV4dHJhU2tpbGxNYXRjaGVzO1xuICAgICAgdXNlclNlbGVjdGlvbnMuc2tpbGxzID0geyAuLi5kZWNpc2lvbnMgfTtcbiAgICAgIGlmICh0eXBlb2YgdXBkYXRlSW5jbHVzaW9uQ291bnRzID09PSAnZnVuY3Rpb24nKSB1cGRhdGVJbmNsdXNpb25Db3VudHMoKTtcbiAgICAgIHN3aXRjaFRhYignYWNoaWV2ZW1lbnRzLXJldmlldycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBlcnJvciA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIHNob3dUb2FzdChgRXJyb3I6ICR7ZXJyb3IuZXJyb3IgfHwgJ0ZhaWxlZCB0byBzYXZlIGRlY2lzaW9ucyd9YCwgJ2Vycm9yJyk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy5lcnJvcignRXJyb3Igc3VibWl0dGluZyBza2lsbCBkZWNpc2lvbnM6JywgZXJyb3IpO1xuICAgIHNob3dUb2FzdCgnRmFpbGVkIHRvIHNhdmUgZGVjaXNpb25zLiBQbGVhc2UgdHJ5IGFnYWluLicsICdlcnJvcicpO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFeHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5leHBvcnQge1xuICBfcGFyc2VZZWFyRnJvbVN0cixcbiAgX2NvbXB1dGVZZWFyc0Zyb21JZHMsXG4gIHNhdmVTa2lsbEdyb3VwT3ZlcnJpZGUsXG4gIHNhdmVTa2lsbENhdGVnb3J5T3ZlcnJpZGUsXG4gIHJlbmFtZVNraWxsQ2F0ZWdvcnksXG4gIHNhdmVTa2lsbENhdGVnb3J5T3JkZXIsXG4gIHNhdmVTa2lsbFF1YWxpZmllck92ZXJyaWRlLFxuICBzYXZlVXNlckNyZWF0ZWRTa2lsbCxcbiAgYnVpbGRTa2lsbHNSZXZpZXdUYWJsZSxcbiAgX3JlbmRlclNraWxsc1RhYmxlLFxuICBtb3ZlU2tpbGxSb3csXG4gIGhhbmRsZVNraWxsc1Jlc3BvbnNlLFxuICBzdWJtaXRTa2lsbERlY2lzaW9ucyxcbn07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIGFjaGlldmVtZW50cy1yZXZpZXcuanNcbiAqIEVTIG1vZHVsZSBcdTIwMTQgQWNoaWV2ZW1lbnRzIHJldmlldyB0YWJsZSwgYWNoaWV2ZW1lbnRzIGVkaXRvciwgYW5kIEFJIHJld3JpdGUgbW9kYWwuXG4gKlxuICogRGVwZW5kZW5jaWVzIHJlc29sdmVkIHRocm91Z2ggZ2xvYmFsVGhpcyBhdCBydW50aW1lOlxuICogICAtIHBlbmRpbmdSZWNvbW1lbmRhdGlvbnMgICAgICAgICh3aW5kb3cpXG4gKiAgIC0gYWNoaWV2ZW1lbnREZWNpc2lvbnMgICAgICAgICAgKHdpbmRvdyBcdTIwMTQgYWxzbyBpbml0aWFsaXNlZCBoZXJlKVxuICogICAtIF9hY2hpZXZlbWVudHNPcmRlcmVkICAgICAgICAgICh3aW5kb3cgXHUyMDE0IGFsc28gaW5pdGlhbGlzZWQgaGVyZSlcbiAqICAgLSBfc3VnZ2VzdGVkQWNoc09yZGVyZWQgICAgICAgICAod2luZG93KVxuICogICAtIF9zYXZlZERlY2lzaW9ucyAgICAgICAgICAgICAgICh3aW5kb3cpXG4gKiAgIC0gYWNoaWV2ZW1lbnRFZGl0cyAgICAgICAgICAgICAgKHdpbmRvdylcbiAqICAgLSB1c2VyU2VsZWN0aW9ucyAgICAgICAgICAgICAgICAod2luZG93KVxuICogICAtIGdldEFjaGlldmVtZW50UmVjb21tZW5kYXRpb24gIChnbG9iYWxUaGlzIGZ1bmN0aW9uKVxuICogICAtIGdldEFjaGlldmVtZW50Q29uZmlkZW5jZSAgICAgIChnbG9iYWxUaGlzIGZ1bmN0aW9uKVxuICogICAtIGdldEFjaGlldmVtZW50UmVhc29uaW5nICAgICAgIChnbG9iYWxUaGlzIGZ1bmN0aW9uKVxuICogICAtIGVzY2FwZUh0bWwgICAgICAgICAgICAgICAgICAgIChnbG9iYWxUaGlzIGZ1bmN0aW9uKVxuICogICAtIGhhbmRsZUFjaGlldmVtZW50QWN0aW9uICAgICAgIChnbG9iYWxUaGlzIC8gdGhpcyBtb2R1bGUpXG4gKiAgIC0gYnVsa0FjaGlldmVtZW50QWN0aW9uICAgICAgICAgKGdsb2JhbFRoaXMgLyB0aGlzIG1vZHVsZSlcbiAqICAgLSBtb3ZlQWNoaWV2ZW1lbnRSb3cgICAgICAgICAgICAoZ2xvYmFsVGhpcyAvIHRoaXMgbW9kdWxlKVxuICogICAtIG1vdmVTdWdnZXN0ZWRBY2hpZXZlbWVudFJvdyAgIChnbG9iYWxUaGlzIC8gdGhpcyBtb2R1bGUpXG4gKiAgIC0gc2F2ZVRvcExldmVsQWNoaWV2ZW1lbnRGaWVsZCAgKGdsb2JhbFRoaXMgLyB0aGlzIG1vZHVsZSlcbiAqICAgLSBzYXZlU3VnZ2VzdGVkQWNoaWV2ZW1lbnRGaWVsZCAoZ2xvYmFsVGhpcyAvIHRoaXMgbW9kdWxlKVxuICogICAtIGFpUmV3cml0ZVRvcExldmVsQWNoaWV2ZW1lbnQgIChnbG9iYWxUaGlzIC8gdGhpcyBtb2R1bGUpXG4gKiAgIC0gYWlSZXdyaXRlU3VnZ2VzdGVkQWNoaWV2ZW1lbnQgKGdsb2JhbFRoaXMgLyB0aGlzIG1vZHVsZSlcbiAqICAgLSBkZWxldGVUb3BMZXZlbEFjaGlldmVtZW50ICAgICAoZ2xvYmFsVGhpcyAvIHRoaXMgbW9kdWxlKVxuICogICAtIGRlbGV0ZVN1Z2dlc3RlZEFjaGlldmVtZW50ICAgIChnbG9iYWxUaGlzIC8gdGhpcyBtb2R1bGUpXG4gKiAgIC0gc2hvd1RvYXN0ICAgICAgICAgICAgICAgICAgICAgKGdsb2JhbFRoaXMgZnVuY3Rpb24pXG4gKiAgIC0gc2NoZWR1bGVBdHNSZWZyZXNoICAgICAgICAgICAgKGdsb2JhbFRoaXMgZnVuY3Rpb24pXG4gKiAgIC0gdXBkYXRlSW5jbHVzaW9uQ291bnRzICAgICAgICAgKGdsb2JhbFRoaXMgZnVuY3Rpb24pXG4gKiAgIC0gc3dpdGNoVGFiICAgICAgICAgICAgICAgICAgICAgKGdsb2JhbFRoaXMgZnVuY3Rpb24pXG4gKiAgIC0gY29uZmlybURpYWxvZyAgICAgICAgICAgICAgICAgKGdsb2JhbFRoaXMgZnVuY3Rpb24pXG4gKiAgIC0gY2xvc2VBbGVydE1vZGFsICAgICAgICAgICAgICAgKGdsb2JhbFRoaXMgZnVuY3Rpb24pXG4gKiAgIC0gc2V0SW5pdGlhbEZvY3VzICAgICAgICAgICAgICAgKGdsb2JhbFRoaXMgZnVuY3Rpb24pXG4gKiAgIC0gdHJhcEZvY3VzICAgICAgICAgICAgICAgICAgICAgKGdsb2JhbFRoaXMgZnVuY3Rpb24pXG4gKiAgIC0gX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgICAgKGdsb2JhbFRoaXMpXG4gKiAgIC0gQ1NTLmVzY2FwZSAgICAgICAgICAgICAgICAgICAgKGJyb3dzZXIgYnVpbHQtaW4pXG4gKi9cblxuaW1wb3J0IHsgc3RhdGVNYW5hZ2VyIH0gZnJvbSAnLi9zdGF0ZS1tYW5hZ2VyLmpzJztcbmltcG9ydCB7IGV5ZVNsYXNoSWNvbiB9IGZyb20gJy4vcmV2aWV3LWljb25zLmpzJztcblxuLy8gTW9kdWxlLWxldmVsIHN0YXRlXG5sZXQgX3Jld3JpdGVTdWdnZXN0aW9uSGlzdG9yeSA9IFtdO1xubGV0IF9sYXN0UmV3cml0ZUxvZ0lkID0gbnVsbDtcbi8vIENhbGxiYWNrcyBmb3IgdGhlIGFjdGl2ZSByZXdyaXRlIG1vZGFsOiB7IGV4cGVyaWVuY2VJbmRleCwgb25BY2NlcHQgfVxubGV0IF9yZXdyaXRlQ2FsbGJhY2tzID0gbnVsbDtcbi8vIFRyYWNrcyBhY2hpZXZlbWVudHMgdGhhdCBhcmUgbmV3bHkgcmVjb21tZW5kZWQgc2luY2UgdGhlIHByZXZpb3VzIHJlbmRlciAoZm9yIFx1RDgzQ1x1REQ5NSBiYWRnZXMpXG5sZXQgX25ld1JlY29tbWVuZGVkQWNocyA9IG5ldyBTZXQoKTtcblxuZnVuY3Rpb24gX25vcm1hbGl6ZUFjaGlldmVtZW50RWRpdEVudHJ5KGVudHJ5KSB7XG4gIGlmIChlbnRyeSAmJiB0eXBlb2YgZW50cnkgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGVudHJ5KSkge1xuICAgIHJldHVybiB7XG4gICAgICB0ZXh0OiBTdHJpbmcoZW50cnkudGV4dCA/PyBlbnRyeS5kZXNjcmlwdGlvbiA/PyBlbnRyeS5jb250ZW50ID8/ICcnKSxcbiAgICAgIGhpZGRlbjogQm9vbGVhbihlbnRyeS5oaWRkZW4pLFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB0ZXh0OiBTdHJpbmcoZW50cnkgPz8gJycpLFxuICAgIGhpZGRlbjogZmFsc2UsXG4gIH07XG59XG5cbmZ1bmN0aW9uIF9ub3JtYWxpemVBY2hpZXZlbWVudEVkaXRMaXN0KGVudHJpZXMpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGVudHJpZXMpKSByZXR1cm4gW107XG4gIHJldHVybiBlbnRyaWVzLm1hcChfbm9ybWFsaXplQWNoaWV2ZW1lbnRFZGl0RW50cnkpO1xufVxuXG5mdW5jdGlvbiBfYWNoaWV2ZW1lbnRFbnRyeVRleHQoZW50cnkpIHtcbiAgcmV0dXJuIF9ub3JtYWxpemVBY2hpZXZlbWVudEVkaXRFbnRyeShlbnRyeSkudGV4dDtcbn1cblxuZnVuY3Rpb24gX2FjaGlldmVtZW50RW50cnlIaWRkZW4oZW50cnkpIHtcbiAgcmV0dXJuIF9ub3JtYWxpemVBY2hpZXZlbWVudEVkaXRFbnRyeShlbnRyeSkuaGlkZGVuO1xufVxuXG53aW5kb3cuYWNoaWV2ZW1lbnREZWNpc2lvbnMgPSB7fTtcbndpbmRvdy5fYWNoaWV2ZW1lbnRzT3JkZXJlZCA9IG51bGw7XG5cbi8vIFNtYWxsIGZldGNoIGhlbHBlciB3aXRoIHRpbWVvdXQgdG8gYXZvaWQgbGVhdmluZyBsb2FkZXJzIHZpc2libGUgb24gaGFuZ2luZyByZXF1ZXN0c1xuYXN5bmMgZnVuY3Rpb24gZmV0Y2hKc29uV2l0aFRpbWVvdXQodXJsLCBvcHRzID0ge30sIHRpbWVvdXQgPSA3MDAwKSB7XG4gIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIGNvbnN0IHNpZ25hbCA9IGNvbnRyb2xsZXIuc2lnbmFsO1xuICBjb25zdCBpZCA9IHNldFRpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydCgpLCB0aW1lb3V0KTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwsIE9iamVjdC5hc3NpZ24oe30sIG9wdHMsIHsgc2lnbmFsIH0pKTtcbiAgICBjbGVhclRpbWVvdXQoaWQpO1xuICAgIHJldHVybiByZXM7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNsZWFyVGltZW91dChpZCk7XG4gICAgdGhyb3cgZXJyO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9hY2hTbmFwc2hvdEtleSgpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzaWQgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpLmdldCgnc2Vzc2lvbicpO1xuICAgIHJldHVybiBzaWQgPyBgYWNoX3NuYXBfJHtzaWR9YCA6IG51bGw7XG4gIH0gY2F0Y2ggKF8pIHsgcmV0dXJuIG51bGw7IH1cbn1cbmZ1bmN0aW9uIF9zYXZlQWNoU25hcHNob3QocmVjb21tZW5kZWRJZHMpIHtcbiAgY29uc3Qga2V5ID0gX2FjaFNuYXBzaG90S2V5KCk7XG4gIGlmICgha2V5KSByZXR1cm47XG4gIHRyeSB7IGxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgSlNPTi5zdHJpbmdpZnkoWy4uLnJlY29tbWVuZGVkSWRzXSkpOyB9IGNhdGNoIChfKSB7fVxufVxuZnVuY3Rpb24gX2dldEFjaFNuYXBzaG90KCkge1xuICBjb25zdCBrZXkgPSBfYWNoU25hcHNob3RLZXkoKTtcbiAgaWYgKCFrZXkpIHJldHVybiBudWxsO1xuICB0cnkge1xuICAgIGNvbnN0IHJhdyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7XG4gICAgcmV0dXJuIHJhdyA/IG5ldyBTZXQoSlNPTi5wYXJzZShyYXcpKSA6IG51bGw7XG4gIH0gY2F0Y2ggKF8pIHsgcmV0dXJuIG51bGw7IH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gYnVpbGRBY2hpZXZlbWVudHNSZXZpZXdUYWJsZSgpIHtcbiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaGlldmVtZW50cy10YWJsZS1jb250YWluZXInKTtcbiAgaWYgKCFjb250YWluZXIpIHJldHVybjtcblxuICBjb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDoxMnB4O3BhZGRpbmc6MjBweDtjb2xvcjojNmI3MjgwO1wiPjxkaXYgY2xhc3M9XCJsb2FkaW5nLXNwaW5uZXJcIiBzdHlsZT1cIndpZHRoOjIwcHg7aGVpZ2h0OjIwcHg7Ym9yZGVyLXdpZHRoOjJweDtmbGV4LXNocmluazowO1wiPjwvZGl2PjxzcGFuPkxvYWRpbmcgYWNoaWV2ZW1lbnRzXHUyMDI2PC9zcGFuPjwvZGl2Pic7XG5cbiAgLy8gUHJlZmVyIHNlc3Npb24tYXdhcmUgc3RhdHVzIGRhdGEgc28gcmV2aWV3LXRpbWUgb3ZlcmxheXMgYXJlIHJlZmxlY3RlZC5cbiAgbGV0IGFsbEFjaGlldmVtZW50cyA9IFtdO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoSnNvbldpdGhUaW1lb3V0KCcvYXBpL3N0YXR1cycsIHt9LCA3MDAwKTtcbiAgICBpZiAoIXJlcy5vaykgdGhyb3cgbmV3IEVycm9yKCdzdGF0dXMgbm90IG9rJyk7XG4gICAgY29uc3Qgc3RhdHVzRGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgYWxsQWNoaWV2ZW1lbnRzID0gc3RhdHVzRGF0YS5hbGxfYWNoaWV2ZW1lbnRzIHx8IFtdO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBTZWNvbmRhcnkgZmFsbGJhY2s6IHJhdyBtYXN0ZXIgZmllbGRzLlxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMyID0gYXdhaXQgZmV0Y2hKc29uV2l0aFRpbWVvdXQoJy9hcGkvbWFzdGVyLWZpZWxkcycsIHt9LCA3MDAwKTtcbiAgICAgIGlmICghcmVzMi5vaykgdGhyb3cgbmV3IEVycm9yKCdtYXN0ZXItZmllbGRzIG5vdCBvaycpO1xuICAgICAgY29uc3QgbWFzdGVyRGF0YSA9IGF3YWl0IHJlczIuanNvbigpO1xuICAgICAgYWxsQWNoaWV2ZW1lbnRzID0gbWFzdGVyRGF0YS5zZWxlY3RlZF9hY2hpZXZlbWVudHMgfHwgW107XG4gICAgfSBjYXRjaCAoZXJyMikge1xuICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICc8cCBzdHlsZT1cImNvbG9yOiNlZjQ0NDQ7cGFkZGluZzoyMHB4O1wiPkZhaWxlZCB0byBsb2FkIGFjaGlldmVtZW50cy48L3A+JztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBpZiAoYWxsQWNoaWV2ZW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnPHAgc3R5bGU9XCJwYWRkaW5nOjIwcHg7Y29sb3I6IzZiNzI4MDtcIj5ObyBrZXkgYWNoaWV2ZW1lbnRzIGZvdW5kIGluIG1hc3RlciBDViBkYXRhLjwvcD4nO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFdyYXAgaW5pdGlhbGlzYXRpb24gKyByZW5kZXIgc28gYW4gdW5leHBlY3RlZCBleGNlcHRpb24gcmVwbGFjZXMgdGhlXG4gIC8vIHNwaW5uZXIgaW5zdGVhZCBvZiBsZWF2aW5nIGl0IGZyb3plbiBpbmRlZmluaXRlbHkuXG4gIHRyeSB7XG4gICAgY29uc3QgZGF0YSA9IHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zIHx8IHt9O1xuICAgIGNvbnN0IHJlY29tbWVuZGVkU2V0ID0gbmV3IFNldChkYXRhLnJlY29tbWVuZGVkX2FjaGlldmVtZW50cyB8fCBbXSk7XG5cbiAgICAvLyBTb3J0OiByZWNvbW1lbmRlZCBmaXJzdCwgdGhlbiBieSBpbXBvcnRhbmNlIGRlc2NlbmRpbmcgKG9ubHkgb24gZmlyc3QgbG9hZClcbiAgICBpZiAoIXdpbmRvdy5fYWNoaWV2ZW1lbnRzT3JkZXJlZCkge1xuICAgICAgYWxsQWNoaWV2ZW1lbnRzID0gWy4uLmFsbEFjaGlldmVtZW50c10uc29ydCgoYSwgYikgPT4ge1xuICAgICAgICBjb25zdCBhUmVjID0gcmVjb21tZW5kZWRTZXQuaGFzKGEuaWQpID8gMSA6IDA7XG4gICAgICAgIGNvbnN0IGJSZWMgPSByZWNvbW1lbmRlZFNldC5oYXMoYi5pZCkgPyAxIDogMDtcbiAgICAgICAgaWYgKGJSZWMgIT09IGFSZWMpIHJldHVybiBiUmVjIC0gYVJlYztcbiAgICAgICAgcmV0dXJuIChiLmltcG9ydGFuY2UgfHwgMCkgLSAoYS5pbXBvcnRhbmNlIHx8IDApO1xuICAgICAgfSk7XG4gICAgICB3aW5kb3cuX2FjaGlldmVtZW50c09yZGVyZWQgPSBhbGxBY2hpZXZlbWVudHM7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGlzZSBkZWNpc2lvbnNcbiAgICB3aW5kb3cuYWNoaWV2ZW1lbnREZWNpc2lvbnMgPSB7fTtcbiAgICB3aW5kb3cuX2FjaGlldmVtZW50c09yZGVyZWQuZm9yRWFjaChhY2ggPT4ge1xuICAgICAgY29uc3QgcmVjID0gZ2V0QWNoaWV2ZW1lbnRSZWNvbW1lbmRhdGlvbihhY2guaWQsIGRhdGEpO1xuICAgICAgbGV0IGRlZmF1bHRBY3Rpb24gPSAnaW5jbHVkZSc7XG4gICAgICBpZiAocmVjID09PSAnRW1waGFzaXplJykgICAgICAgICBkZWZhdWx0QWN0aW9uID0gJ2VtcGhhc2l6ZSc7XG4gICAgICBlbHNlIGlmIChyZWMgPT09ICdJbmNsdWRlJykgICAgICBkZWZhdWx0QWN0aW9uID0gJ2luY2x1ZGUnO1xuICAgICAgZWxzZSBpZiAocmVjID09PSAnRGUtZW1waGFzaXplJykgZGVmYXVsdEFjdGlvbiA9ICdkZS1lbXBoYXNpemUnO1xuICAgICAgZWxzZSBpZiAocmVjID09PSAnT21pdCcpICAgICAgICAgZGVmYXVsdEFjdGlvbiA9ICdleGNsdWRlJztcbiAgICAgIHdpbmRvdy5hY2hpZXZlbWVudERlY2lzaW9uc1thY2guaWRdID0gZGVmYXVsdEFjdGlvbjtcbiAgICB9KTtcbiAgICAvLyBBcHBseSBhbnkgcHJldmlvdXNseSBzYXZlZCB1c2VyIGRlY2lzaW9ucyBvdmVyIHRoZSBMTE0gZGVmYXVsdHNcbiAgICBjb25zdCBzYXZlZEFjaERlY3MgPSB3aW5kb3cuX3NhdmVkRGVjaXNpb25zPy5hY2hpZXZlbWVudF9kZWNpc2lvbnMgfHwge307XG4gICAgaWYgKE9iamVjdC5rZXlzKHNhdmVkQWNoRGVjcykubGVuZ3RoID4gMCkgT2JqZWN0LmFzc2lnbih3aW5kb3cuYWNoaWV2ZW1lbnREZWNpc2lvbnMsIHNhdmVkQWNoRGVjcyk7XG5cbiAgICAvLyBBbHNvIGhhbmRsZSBBSS1zdWdnZXN0ZWQgYWNoaWV2ZW1lbnRzIFx1MjAxNCBhc3NpZ24gc3RhYmxlIElEcyBvbmNlIG9uIGZpcnN0IGxvYWRcbiAgICAvLyBzbyB0aGF0IHJlb3JkZXIgLyBkZWxldGUgb3BlcmF0aW9ucyBuZXZlciBuZWVkIHRvIHJlbWFwIGRlY2lzaW9uIGtleXMuXG4gICAgaWYgKCF3aW5kb3cuX3N1Z2dlc3RlZEFjaHNPcmRlcmVkKSB7XG4gICAgICBsZXQgY291bnRlciA9IDA7XG4gICAgICB3aW5kb3cuX3N1Z2dlc3RlZEFjaHNPcmRlcmVkID0gKGRhdGEuc3VnZ2VzdGVkX2FjaGlldmVtZW50cyB8fCBbXSkubWFwKHMgPT4ge1xuICAgICAgICBjb25zdCBpdGVtID0gT2JqZWN0LmFzc2lnbih7fSwgcyk7XG4gICAgICAgIGl0ZW0uX3N1Z2dJZCA9IGBzdWdnOjoke2NvdW50ZXIrK31gO1xuICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB3aW5kb3cuX3N1Z2dlc3RlZEFjaHNPcmRlcmVkLmZvckVhY2gocyA9PiB7XG4gICAgICBpZiAoIShzLl9zdWdnSWQgaW4gd2luZG93LmFjaGlldmVtZW50RGVjaXNpb25zKSkgd2luZG93LmFjaGlldmVtZW50RGVjaXNpb25zW3MuX3N1Z2dJZF0gPSAnaW5jbHVkZSc7XG4gICAgfSk7XG5cbiAgICBjb25zdCBwcmV2QWNoU25hcCA9IF9nZXRBY2hTbmFwc2hvdCgpO1xuICAgIF9uZXdSZWNvbW1lbmRlZEFjaHMgPSBwcmV2QWNoU25hcFxuICAgICAgPyBuZXcgU2V0KFsuLi5yZWNvbW1lbmRlZFNldF0uZmlsdGVyKGlkID0+ICFwcmV2QWNoU25hcC5oYXMoaWQpKSlcbiAgICAgIDogbmV3IFNldCgpO1xuICAgIF9zYXZlQWNoU25hcHNob3QocmVjb21tZW5kZWRTZXQpO1xuXG4gICAgX3JlbmRlckFjaGlldmVtZW50c1Jldmlld1RhYmxlKGNvbnRhaW5lcik7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlICovXG4gICAgY29uc29sZS5lcnJvcignYnVpbGRBY2hpZXZlbWVudHNSZXZpZXdUYWJsZTogcmVuZGVyIGVycm9yOicsIGVycik7XG4gICAgY29udGFpbmVyLmlubmVySFRNTCA9ICc8cCBzdHlsZT1cImNvbG9yOiNlZjQ0NDQ7cGFkZGluZzoyMHB4O1wiPkVycm9yIHJlbmRlcmluZyBhY2hpZXZlbWVudHMgdGFibGUuIFBsZWFzZSByZWxvYWQgYW5kIHRyeSBhZ2Fpbi48L3A+JztcbiAgfVxufVxuXG5mdW5jdGlvbiBfcmVuZGVyQWNoaWV2ZW1lbnRzUmV2aWV3VGFibGUoY29udGFpbmVyKSB7XG4gIGlmICghY29udGFpbmVyKSBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoaWV2ZW1lbnRzLXRhYmxlLWNvbnRhaW5lcicpO1xuICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuO1xuXG4gIGNvbnN0IGRhdGEgPSB3aW5kb3cucGVuZGluZ1JlY29tbWVuZGF0aW9ucyB8fCB7fTtcbiAgY29uc3Qgb3JkZXJlZEFjaHMgID0gd2luZG93Ll9hY2hpZXZlbWVudHNPcmRlcmVkIHx8IFtdO1xuICBjb25zdCBzdWdnZXN0ZWRBY2hzID0gd2luZG93Ll9zdWdnZXN0ZWRBY2hzT3JkZXJlZCB8fCBbXTtcblxuICAvLyBCdWlsZCBmaWx0ZXIgKyB0YWJsZSBIVE1MXG4gIGxldCBodG1sID0gYFxuICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjEycHg7YWxpZ24taXRlbXM6Y2VudGVyO21hcmdpbi1ib3R0b206MTJweDtcIj5cbiAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiYWNoLXJldmlldy1maWx0ZXJcIlxuICAgICAgICBwbGFjZWhvbGRlcj1cIkZpbHRlciBhY2hpZXZlbWVudHNcdTIwMjZcIlxuICAgICAgICBvbmlucHV0PVwiX2ZpbHRlckFjaGlldmVtZW50c1RhYmxlKHRoaXMudmFsdWUpXCJcbiAgICAgICAgc3R5bGU9XCJmbGV4OjE7cGFkZGluZzo2cHggMTBweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo2cHg7Zm9udC1zaXplOjAuOWVtO1wiPlxuICAgICAgPHNwYW4gaWQ9XCJhY2gtcmV2aWV3LWNvdW50XCIgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2NvbG9yOiM2YjcyODA7d2hpdGUtc3BhY2U6bm93cmFwO1wiPiR7b3JkZXJlZEFjaHMubGVuZ3RoICsgc3VnZ2VzdGVkQWNocy5sZW5ndGh9IGFjaGlldmVtZW50czwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8dGFibGUgaWQ9XCJhY2hpZXZlbWVudHMtcmV2aWV3LXRhYmxlXCIgY2xhc3M9XCJyZXZpZXctdGFibGVcIiBzdHlsZT1cIndpZHRoOjEwMCU7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlO1wiPlxuICAgICAgPHRoZWFkPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRoPkFjaGlldmVtZW50PC90aD5cbiAgICAgICAgICA8dGg+UmVjb21tZW5kYXRpb248L3RoPlxuICAgICAgICAgIDx0aD5Db25maWRlbmNlPC90aD5cbiAgICAgICAgICA8dGg+UmVhc29uaW5nPC90aD5cbiAgICAgICAgICA8dGg+U2VsZWN0aW9uPC90aD5cbiAgICAgICAgPC90cj5cbiAgICAgIDwvdGhlYWQ+XG4gICAgICA8dGJvZHk+XG4gIGA7XG5cbiAgb3JkZXJlZEFjaHMuZm9yRWFjaCgoYWNoLCByb3dJZHgpID0+IHtcbiAgICBjb25zdCBpZCAgICAgICAgICAgICA9IGFjaC5pZCB8fCBhY2gudGl0bGUgfHwgJyc7XG4gICAgY29uc3QgdGl0bGUgICAgICAgICAgPSBhY2gudGl0bGUgfHwgaWQ7XG4gICAgY29uc3QgZGVzYyAgICAgICAgICAgPSBhY2guZGVzY3JpcHRpb24gfHwgJyc7XG4gICAgY29uc3QgcmVjb21tZW5kYXRpb24gPSBnZXRBY2hpZXZlbWVudFJlY29tbWVuZGF0aW9uKGlkLCBkYXRhKTtcbiAgICBjb25zdCBjb25maWRlbmNlICAgICA9IGdldEFjaGlldmVtZW50Q29uZmlkZW5jZShpZCwgZGF0YSwgYWNoLmltcG9ydGFuY2UpO1xuICAgIGNvbnN0IHJlYXNvbmluZyAgICAgID0gZ2V0QWNoaWV2ZW1lbnRSZWFzb25pbmcoaWQsIGRhdGEsIGFjaCk7XG4gICAgY29uc3QgZGVmYXVsdEFjdGlvbiAgPSB3aW5kb3cuYWNoaWV2ZW1lbnREZWNpc2lvbnNbaWRdIHx8ICdpbmNsdWRlJztcbiAgICBjb25zdCBjb25maWRlbmNlQmFkZ2UgPSBgPHNwYW4gY2xhc3M9XCJjb25maWRlbmNlLWJhZGdlIGNvbmZpZGVuY2UtJHtjb25maWRlbmNlLmxldmVsfVwiPiR7Y29uZmlkZW5jZS50ZXh0fTwvc3Bhbj5gO1xuICAgIGNvbnN0IHJlcnVuTmV3QmFkZ2UgPSBfbmV3UmVjb21tZW5kZWRBY2hzLmhhcyhpZClcbiAgICAgID8gJzxzcGFuIGNsYXNzPVwicnctY2hhbmdlLWJhZGdlIHJ3LWNoYW5nZS1uZXdcIiBhcmlhLWxhYmVsPVwiTmV3IHJlY29tbWVuZGF0aW9uIHNpbmNlIHByZXZpb3VzIHJ1blwiPlx1RDgzQ1x1REQ5NSBOZXc8L3NwYW4+J1xuICAgICAgOiAnJztcbiAgICBjb25zdCBpc0ZpcnN0ID0gcm93SWR4ID09PSAwO1xuICAgIGNvbnN0IGlzTGFzdCAgPSByb3dJZHggPT09IG9yZGVyZWRBY2hzLmxlbmd0aCAtIDE7XG5cbiAgICBodG1sICs9IGBcbiAgICAgIDx0ciBkYXRhLWFjaC1pZD1cIiR7ZXNjYXBlSHRtbChpZCl9XCI+XG4gICAgICAgIDx0ZCBzdHlsZT1cIm1pbi13aWR0aDoyMjBweDtcIj5cbiAgICAgICAgICA8aW5wdXQgaWQ9XCJhY2gtdGl0bGUtJHtlc2NhcGVIdG1sKGlkKX1cIlxuICAgICAgICAgICAgdHlwZT1cInRleHRcIiB2YWx1ZT1cIiR7ZXNjYXBlSHRtbCh0aXRsZSl9XCJcbiAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTtmb250LXdlaWdodDo2MDA7cGFkZGluZzozcHggNnB4O2JvcmRlcjoxcHggc29saWQgI2QxZDVkYjtib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6MC45ZW07Ym94LXNpemluZzpib3JkZXItYm94O1wiXG4gICAgICAgICAgICBvbmJsdXI9XCJzYXZlVG9wTGV2ZWxBY2hpZXZlbWVudEZpZWxkKCcke2VzY2FwZUh0bWwoaWQpfScsICd0aXRsZScsIHRoaXMudmFsdWUpXCJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJBY2hpZXZlbWVudCB0aXRsZVwiPiR7cmVydW5OZXdCYWRnZX1cbiAgICAgICAgICA8dGV4dGFyZWEgaWQ9XCJhY2gtZGVzYy0ke2VzY2FwZUh0bWwoaWQpfVwiXG4gICAgICAgICAgICByb3dzPVwiMlwiXG4gICAgICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7bWFyZ2luLXRvcDo0cHg7cGFkZGluZzozcHggNnB4O2JvcmRlcjoxcHggc29saWQgI2QxZDVkYjtib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6MC44NWVtO3Jlc2l6ZTp2ZXJ0aWNhbDtib3gtc2l6aW5nOmJvcmRlci1ib3g7XCJcbiAgICAgICAgICAgIG9uYmx1cj1cInNhdmVUb3BMZXZlbEFjaGlldmVtZW50RmllbGQoJyR7ZXNjYXBlSHRtbChpZCl9JywgJ2Rlc2NyaXB0aW9uJywgdGhpcy52YWx1ZSlcIlxuICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkFjaGlldmVtZW50IGRlc2NyaXB0aW9uXCJcbiAgICAgICAgICA+JHtlc2NhcGVIdG1sKGRlc2MpfTwvdGV4dGFyZWE+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZD48c3Ryb25nPiR7ZXNjYXBlSHRtbChyZWNvbW1lbmRhdGlvbil9PC9zdHJvbmc+PC90ZD5cbiAgICAgICAgPHRkPiR7Y29uZmlkZW5jZUJhZGdlfTwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cIm1heC13aWR0aDoyMDBweDtcIj48c21hbGw+JHtlc2NhcGVIdG1sKHJlYXNvbmluZyl9PC9zbWFsbD48L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJhY3Rpb24tYnRuc1wiIHN0eWxlPVwid2hpdGUtc3BhY2U6bm93cmFwO1wiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0biAke2RlZmF1bHRBY3Rpb24gPT09ICdlbXBoYXNpemUnICAgID8gJ2FjdGl2ZScgOiAnJ31cIiBkYXRhLWFjdGlvbj1cImVtcGhhc2l6ZVwiICAgIGFyaWEtbGFiZWw9XCJFbXBoYXNpemUgJHtlc2NhcGVIdG1sKHRpdGxlKX1cIiAgICB0aXRsZT1cIkVtcGhhc2l6ZSBcdTIwMTQgZmVhdHVyZSBwcm9taW5lbnRseVwiICBzdHlsZT1cImNvbG9yOiMxMGI5ODE7XCI+XHUyNzk1PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuICR7ZGVmYXVsdEFjdGlvbiA9PT0gJ2luY2x1ZGUnICAgICAgPyAnYWN0aXZlJyA6ICcnfVwiIGRhdGEtYWN0aW9uPVwiaW5jbHVkZVwiICAgICAgYXJpYS1sYWJlbD1cIkluY2x1ZGUgJHtlc2NhcGVIdG1sKHRpdGxlKX1cIiAgICAgIHRpdGxlPVwiSW5jbHVkZSBcdTIwMTQgc3RhbmRhcmQgdHJlYXRtZW50XCI+XHUyNzEzPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuICR7ZGVmYXVsdEFjdGlvbiA9PT0gJ2RlLWVtcGhhc2l6ZScgPyAnYWN0aXZlJyA6ICcnfVwiIGRhdGEtYWN0aW9uPVwiZGUtZW1waGFzaXplXCIgYXJpYS1sYWJlbD1cIkRlLWVtcGhhc2l6ZSAke2VzY2FwZUh0bWwodGl0bGUpfVwiIHRpdGxlPVwiRGUtZW1waGFzaXplIFx1MjAxNCBicmllZiBtZW50aW9uIG9ubHlcIiAgc3R5bGU9XCJjb2xvcjojZjU5ZTBiO1wiPlx1Mjc5NjwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0biAke2RlZmF1bHRBY3Rpb24gPT09ICdleGNsdWRlJyAgICAgID8gJ2FjdGl2ZScgOiAnJ31cIiBkYXRhLWFjdGlvbj1cImV4Y2x1ZGVcIiAgICAgIGFyaWEtbGFiZWw9XCJFeGNsdWRlICR7ZXNjYXBlSHRtbCh0aXRsZSl9XCIgICAgICB0aXRsZT1cIkV4Y2x1ZGUgXHUyMDE0IG9taXQgZnJvbSBDVlwiICAgICAgICAgICAgc3R5bGU9XCJjb2xvcjojZWY0NDQ0O1wiPiR7ZXllU2xhc2hJY29uKCl9PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgYXJpYS1sYWJlbD1cIkFJIHJld3JpdGUgJHtlc2NhcGVIdG1sKHRpdGxlKX1cIiB0aXRsZT1cIkFJIHJld3JpdGUgZGVzY3JpcHRpb25cIiBvbmNsaWNrPVwiYWlSZXdyaXRlVG9wTGV2ZWxBY2hpZXZlbWVudCgnJHtlc2NhcGVIdG1sKGlkKX0nKVwiPlx1MjcyODwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIGFyaWEtbGFiZWw9XCJNb3ZlICR7ZXNjYXBlSHRtbCh0aXRsZSl9IGVhcmxpZXJcIiB0aXRsZT1cIk1vdmUgdXBcIiAgICR7aXNGaXJzdCA/ICdkaXNhYmxlZCcgOiAnJ30gb25jbGljaz1cIm1vdmVBY2hpZXZlbWVudFJvdygnJHtlc2NhcGVIdG1sKGlkKX0nLC0xKVwiPlx1MjE5MTwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIGFyaWEtbGFiZWw9XCJNb3ZlICR7ZXNjYXBlSHRtbCh0aXRsZSl9IGxhdGVyXCIgICB0aXRsZT1cIk1vdmUgZG93blwiICR7aXNMYXN0ICA/ICdkaXNhYmxlZCcgOiAnJ30gb25jbGljaz1cIm1vdmVBY2hpZXZlbWVudFJvdygnJHtlc2NhcGVIdG1sKGlkKX0nLCsxKVwiPlx1MjE5MzwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIGFyaWEtbGFiZWw9XCJEZWxldGUgJHtlc2NhcGVIdG1sKHRpdGxlKX1cIiB0aXRsZT1cIkRlbGV0ZSBhY2hpZXZlbWVudFwiIG9uY2xpY2s9XCJkZWxldGVUb3BMZXZlbEFjaGlldmVtZW50KCcke2VzY2FwZUh0bWwoaWQpfScpXCIgc3R5bGU9XCJjb2xvcjojZWY0NDQ0O1wiPlx1RDgzRFx1REREMTwvYnV0dG9uPlxuICAgICAgICA8L3RkPlxuICAgICAgPC90cj5cbiAgICBgO1xuICB9KTtcblxuICAvLyBBSS1zdWdnZXN0ZWQgYWNoaWV2ZW1lbnRzIFx1MjAxNCBmdWxsIGVkaXRpbmcvY29udHJvbCBwYXJpdHkgd2l0aCB1c2VyIGFjaGlldmVtZW50c1xuICBzdWdnZXN0ZWRBY2hzLmZvckVhY2goKHN1Z2csIHJvd0lkeCkgPT4ge1xuICAgIGNvbnN0IHN1Z2dJZCAgICAgID0gc3VnZy5fc3VnZ0lkO1xuICAgIGNvbnN0IGNvbmZSYXcgICAgID0gKHN1Z2cuY29uZmlkZW5jZSB8fCAnTWVkaXVtJykudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBjb25mTGV2ZWwgICA9IGNvbmZSYXcuaW5jbHVkZXMoJ2hpZ2gnKSA/ICdoaWdoJyA6IGNvbmZSYXcuaW5jbHVkZXMoJ2xvdycpID8gJ2xvdycgOiAnbWVkaXVtJztcbiAgICBjb25zdCBjb25mVGV4dCAgICA9IHN1Z2cuY29uZmlkZW5jZSB8fCAnTWVkaXVtJztcbiAgICBjb25zdCBkZWZhdWx0QWN0aW9uID0gd2luZG93LmFjaGlldmVtZW50RGVjaXNpb25zW3N1Z2dJZF0gfHwgJ2luY2x1ZGUnO1xuICAgIGNvbnN0IGlzRmlyc3QgICAgID0gcm93SWR4ID09PSAwO1xuICAgIGNvbnN0IGlzTGFzdCAgICAgID0gcm93SWR4ID09PSBzdWdnZXN0ZWRBY2hzLmxlbmd0aCAtIDE7XG5cbiAgICBodG1sICs9IGBcbiAgICAgIDx0ciBkYXRhLWFjaC1pZD1cIiR7ZXNjYXBlSHRtbChzdWdnSWQpfVwiIHN0eWxlPVwiYmFja2dyb3VuZDojZmVmY2U4O1wiPlxuICAgICAgICA8dGQgc3R5bGU9XCJtaW4td2lkdGg6MjIwcHg7XCI+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJkaXNwbGF5OmlubGluZS1ibG9jaztiYWNrZ3JvdW5kOiNmNTllMGI7Y29sb3I6I2ZmZjtmb250LXNpemU6MC43ZW07Zm9udC13ZWlnaHQ6NzAwO3BhZGRpbmc6MXB4IDZweDtib3JkZXItcmFkaXVzOjEwcHg7bWFyZ2luLWJvdHRvbTo0cHg7dmVydGljYWwtYWxpZ246bWlkZGxlO1wiPlx1MkI1MCBBSSBTdWdnZXN0ZWQ8L3NwYW4+XG4gICAgICAgICAgPGlucHV0IGlkPVwiYWNoLXRpdGxlLSR7ZXNjYXBlSHRtbChzdWdnSWQpfVwiXG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiIHZhbHVlPVwiJHtlc2NhcGVIdG1sKHN1Z2cudGl0bGUgfHwgJycpfVwiXG4gICAgICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Zm9udC13ZWlnaHQ6NjAwO3BhZGRpbmc6M3B4IDZweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo0cHg7Zm9udC1zaXplOjAuOWVtO2JveC1zaXppbmc6Ym9yZGVyLWJveDtcIlxuICAgICAgICAgICAgb25ibHVyPVwic2F2ZVN1Z2dlc3RlZEFjaGlldmVtZW50RmllbGQoJyR7ZXNjYXBlSHRtbChzdWdnSWQpfScsICd0aXRsZScsIHRoaXMudmFsdWUpXCJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJBY2hpZXZlbWVudCB0aXRsZVwiPlxuICAgICAgICAgIDx0ZXh0YXJlYSBpZD1cImFjaC1kZXNjLSR7ZXNjYXBlSHRtbChzdWdnSWQpfVwiXG4gICAgICAgICAgICByb3dzPVwiMlwiXG4gICAgICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7bWFyZ2luLXRvcDo0cHg7cGFkZGluZzozcHggNnB4O2JvcmRlcjoxcHggc29saWQgI2QxZDVkYjtib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6MC44NWVtO3Jlc2l6ZTp2ZXJ0aWNhbDtib3gtc2l6aW5nOmJvcmRlci1ib3g7XCJcbiAgICAgICAgICAgIG9uYmx1cj1cInNhdmVTdWdnZXN0ZWRBY2hpZXZlbWVudEZpZWxkKCcke2VzY2FwZUh0bWwoc3VnZ0lkKX0nLCAnZGVzY3JpcHRpb24nLCB0aGlzLnZhbHVlKVwiXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiQWNoaWV2ZW1lbnQgZGVzY3JpcHRpb25cIlxuICAgICAgICAgID4ke2VzY2FwZUh0bWwoc3VnZy5kZXNjcmlwdGlvbiB8fCAnJyl9PC90ZXh0YXJlYT5cbiAgICAgICAgICAke3N1Z2cuZXhwZXJpZW5jZV9pZCA/IGA8c21hbGwgc3R5bGU9XCJjb2xvcjojOWNhM2FmO1wiPkV4cGVyaWVuY2U6ICR7ZXNjYXBlSHRtbChzdWdnLmV4cGVyaWVuY2VfaWQpfTwvc21hbGw+YCA6ICcnfVxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQ+PHN0cm9uZz5BZGQgTmV3PC9zdHJvbmc+PC90ZD5cbiAgICAgICAgPHRkPjxzcGFuIGNsYXNzPVwiY29uZmlkZW5jZS1iYWRnZSBjb25maWRlbmNlLSR7Y29uZkxldmVsfVwiPiR7ZXNjYXBlSHRtbChjb25mVGV4dCl9PC9zcGFuPjwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cIm1heC13aWR0aDoyMDBweDtcIj48c21hbGw+JHtlc2NhcGVIdG1sKHN1Z2cucmF0aW9uYWxlIHx8ICcnKX08L3NtYWxsPjwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cImFjdGlvbi1idG5zXCIgc3R5bGU9XCJ3aGl0ZS1zcGFjZTpub3dyYXA7XCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuICR7ZGVmYXVsdEFjdGlvbiA9PT0gJ2VtcGhhc2l6ZScgICAgPyAnYWN0aXZlJyA6ICcnfVwiIGRhdGEtYWN0aW9uPVwiZW1waGFzaXplXCIgICAgYXJpYS1sYWJlbD1cIkVtcGhhc2l6ZVwiICAgIHRpdGxlPVwiRW1waGFzaXplIFx1MjAxNCBmZWF0dXJlIHByb21pbmVudGx5XCIgIHN0eWxlPVwiY29sb3I6IzEwYjk4MTtcIj5cdTI3OTU8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG4gJHtkZWZhdWx0QWN0aW9uID09PSAnaW5jbHVkZScgICAgICA/ICdhY3RpdmUnIDogJyd9XCIgZGF0YS1hY3Rpb249XCJpbmNsdWRlXCIgICAgICBhcmlhLWxhYmVsPVwiSW5jbHVkZVwiICAgICAgdGl0bGU9XCJJbmNsdWRlIFx1MjAxNCBhZGQgdG8gQ1ZcIj5cdTI3MTM8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG4gJHtkZWZhdWx0QWN0aW9uID09PSAnZGUtZW1waGFzaXplJyA/ICdhY3RpdmUnIDogJyd9XCIgZGF0YS1hY3Rpb249XCJkZS1lbXBoYXNpemVcIiBhcmlhLWxhYmVsPVwiRGUtZW1waGFzaXplXCIgdGl0bGU9XCJEZS1lbXBoYXNpemUgXHUyMDE0IGJyaWVmIG1lbnRpb24gb25seVwiICBzdHlsZT1cImNvbG9yOiNmNTllMGI7XCI+XHUyNzk2PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuICR7ZGVmYXVsdEFjdGlvbiA9PT0gJ2V4Y2x1ZGUnICAgICAgPyAnYWN0aXZlJyA6ICcnfVwiIGRhdGEtYWN0aW9uPVwiZXhjbHVkZVwiICAgICAgYXJpYS1sYWJlbD1cIkV4Y2x1ZGVcIiAgICAgIHRpdGxlPVwiU2tpcCBcdTIwMTQgZG8gbm90IGFkZFwiICAgICAgICAgICAgICAgICBzdHlsZT1cImNvbG9yOiNlZjQ0NDQ7XCI+JHtleWVTbGFzaEljb24oKX08L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBhcmlhLWxhYmVsPVwiQUkgcmV3cml0ZVwiIHRpdGxlPVwiQUkgcmV3cml0ZSBkZXNjcmlwdGlvblwiIG9uY2xpY2s9XCJhaVJld3JpdGVTdWdnZXN0ZWRBY2hpZXZlbWVudCgnJHtlc2NhcGVIdG1sKHN1Z2dJZCl9JylcIj5cdTI3Mjg8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBhcmlhLWxhYmVsPVwiTW92ZSBlYXJsaWVyXCIgdGl0bGU9XCJNb3ZlIHVwXCIgICAke2lzRmlyc3QgPyAnZGlzYWJsZWQnIDogJyd9IG9uY2xpY2s9XCJtb3ZlU3VnZ2VzdGVkQWNoaWV2ZW1lbnRSb3coJyR7ZXNjYXBlSHRtbChzdWdnSWQpfScsLTEpXCI+XHUyMTkxPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgYXJpYS1sYWJlbD1cIk1vdmUgbGF0ZXJcIiAgIHRpdGxlPVwiTW92ZSBkb3duXCIgJHtpc0xhc3QgID8gJ2Rpc2FibGVkJyA6ICcnfSBvbmNsaWNrPVwibW92ZVN1Z2dlc3RlZEFjaGlldmVtZW50Um93KCcke2VzY2FwZUh0bWwoc3VnZ0lkKX0nLCsxKVwiPlx1MjE5MzwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIGFyaWEtbGFiZWw9XCJSZW1vdmUgc3VnZ2VzdGlvblwiIHRpdGxlPVwiUmVtb3ZlIHN1Z2dlc3Rpb25cIiBvbmNsaWNrPVwiZGVsZXRlU3VnZ2VzdGVkQWNoaWV2ZW1lbnQoJyR7ZXNjYXBlSHRtbChzdWdnSWQpfScpXCIgc3R5bGU9XCJjb2xvcjojZWY0NDQ0O1wiPlx1RDgzRFx1REREMTwvYnV0dG9uPlxuICAgICAgICA8L3RkPlxuICAgICAgPC90cj5cbiAgICBgO1xuICB9KTtcblxuICBodG1sICs9ICc8L3Rib2R5PjwvdGFibGU+JztcbiAgY29udGFpbmVyLmlubmVySFRNTCA9IGh0bWw7XG5cbiAgLy8gQnVsayB0b29sYmFyIGFib3ZlIHRoZSBmaWx0ZXIgcm93XG4gIGNvbnN0IGFjaFRvb2xiYXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgYWNoVG9vbGJhci5jbGFzc05hbWUgPSAnYnVsay10b29sYmFyJztcbiAgYWNoVG9vbGJhci5pbm5lckhUTUwgPSBgXG4gICAgPHNwYW4+QnVsazo8L3NwYW4+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImJ1bGstYnRuIGJ1bGstcmVjb21tZW5kZWRcIiBvbmNsaWNrPVwiYnVsa0FjaGlldmVtZW50QWN0aW9uKCdyZWNvbW1lbmRlZCcpXCIgdGl0bGU9XCJTZXQgYWxsIHRvIHRoZSBMTE0gcmVjb21tZW5kYXRpb25cIj5cdTI3MjggQWNjZXB0IEFsbCBSZWNvbW1lbmRlZDwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJidWxrLWJ0biBidWxrLWVtcGhhc2l6ZVwiICAgb25jbGljaz1cImJ1bGtBY2hpZXZlbWVudEFjdGlvbignZW1waGFzaXplJylcIj5cdTI3OTUgRW1waGFzaXplIEFsbDwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJidWxrLWJ0biBidWxrLWluY2x1ZGVcIiAgICAgb25jbGljaz1cImJ1bGtBY2hpZXZlbWVudEFjdGlvbignaW5jbHVkZScpXCI+XHUyNzEzIEluY2x1ZGUgQWxsPC9idXR0b24+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImJ1bGstYnRuIGJ1bGstZXhjbHVkZVwiICAgICBvbmNsaWNrPVwiYnVsa0FjaGlldmVtZW50QWN0aW9uKCdleGNsdWRlJylcIj4ke2V5ZVNsYXNoSWNvbigpfSBFeGNsdWRlIEFsbDwvYnV0dG9uPlxuICBgO1xuICBjb250YWluZXIuaW5zZXJ0QmVmb3JlKGFjaFRvb2xiYXIsIGNvbnRhaW5lci5maXJzdENoaWxkKTtcblxuICAvLyBEZWxlZ2F0ZWQgY2xpY2sgaGFuZGxlciBmb3IgZGVjaXNpb24gYnV0dG9uc1xuICBjb250YWluZXIucXVlcnlTZWxlY3RvcigndGJvZHknKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBlID0+IHtcbiAgICBjb25zdCBidG4gPSBlLnRhcmdldC5jbG9zZXN0KCcuaWNvbi1idG5bZGF0YS1hY3Rpb25dJyk7XG4gICAgaWYgKCFidG4pIHJldHVybjtcbiAgICBjb25zdCB0ciA9IGJ0bi5jbG9zZXN0KCd0cltkYXRhLWFjaC1pZF0nKTtcbiAgICBpZiAoIXRyKSByZXR1cm47XG4gICAgY29uc3QgYWN0aW9uID0gYnRuLmRhdGFzZXQuYWN0aW9uO1xuICAgIGlmIChhY3Rpb24pIGhhbmRsZUFjaGlldmVtZW50QWN0aW9uKHRyLmRhdGFzZXQuYWNoSWQsIGFjdGlvbik7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBidWxrQWNoaWV2ZW1lbnRBY3Rpb24oYWN0aW9uKSB7XG4gIGNvbnN0IGRhdGEgPSB3aW5kb3cucGVuZGluZ1JlY29tbWVuZGF0aW9ucyB8fCB7fTtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2FjaGlldmVtZW50cy1yZXZpZXctdGFibGUgdGJvZHkgdHJbZGF0YS1hY2gtaWRdJykuZm9yRWFjaChyb3cgPT4ge1xuICAgIGlmIChyb3cuc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnKSByZXR1cm47ICAgLy8gcmVzcGVjdCBmaWx0ZXJcbiAgICBjb25zdCBhY2hJZCA9IHJvdy5kYXRhc2V0LmFjaElkO1xuICAgIGlmICghYWNoSWQpIHJldHVybjtcbiAgICBsZXQgcmVzb2x2ZWRBY3Rpb24gPSBhY3Rpb247XG4gICAgaWYgKGFjdGlvbiA9PT0gJ3JlY29tbWVuZGVkJykge1xuICAgICAgaWYgKGFjaElkLnN0YXJ0c1dpdGgoJ3N1Z2c6OicpKSB7XG4gICAgICAgIHJlc29sdmVkQWN0aW9uID0gJ2luY2x1ZGUnOyAvLyBBSS1zdWdnZXN0ZWQgaXRlbXMgZGVmYXVsdCB0byBpbmNsdWRlIHdoZW4gYWNjZXB0aW5nIGFsbFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVjID0gZ2V0QWNoaWV2ZW1lbnRSZWNvbW1lbmRhdGlvbihhY2hJZCwgZGF0YSk7XG4gICAgICAgIGlmIChyZWMgPT09ICdFbXBoYXNpemUnKSAgICAgICAgIHJlc29sdmVkQWN0aW9uID0gJ2VtcGhhc2l6ZSc7XG4gICAgICAgIGVsc2UgaWYgKHJlYyA9PT0gJ0luY2x1ZGUnKSAgICAgIHJlc29sdmVkQWN0aW9uID0gJ2luY2x1ZGUnO1xuICAgICAgICBlbHNlIGlmIChyZWMgPT09ICdEZS1lbXBoYXNpemUnKSByZXNvbHZlZEFjdGlvbiA9ICdkZS1lbXBoYXNpemUnO1xuICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlZEFjdGlvbiA9ICdleGNsdWRlJztcbiAgICAgIH1cbiAgICB9XG4gICAgaGFuZGxlQWNoaWV2ZW1lbnRBY3Rpb24oYWNoSWQsIHJlc29sdmVkQWN0aW9uKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZUFjaGlldmVtZW50QWN0aW9uKGFjaElkLCBhY3Rpb24pIHtcbiAgd2luZG93LmFjaGlldmVtZW50RGVjaXNpb25zW2FjaElkXSA9IGFjdGlvbjtcbiAgY29uc3Qgcm93ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgdHJbZGF0YS1hY2gtaWQ9XCIke0NTUy5lc2NhcGUoYWNoSWQpfVwiXWApO1xuICBpZiAoIXJvdykgcmV0dXJuO1xuICByb3cucXVlcnlTZWxlY3RvckFsbCgnLmljb24tYnRuJykuZm9yRWFjaChidG4gPT4gYnRuLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpKTtcbiAgY29uc3QgYWN0aXZlQnRuID0gcm93LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWFjdGlvbj1cIiR7YWN0aW9ufVwiXWApO1xuICBpZiAoYWN0aXZlQnRuKSBhY3RpdmVCdG4uY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN1Ym1pdEFjaGlldmVtZW50RGVjaXNpb25zKCkge1xuICAvKiBkdWNrZmxvdzpcbiAgICogICBpZDogYWNoaWV2ZW1lbnRzX3VpX3N1Ym1pdF9saXZlXG4gICAqICAga2luZDogdWlcbiAgICogICB0aW1lc3RhbXA6ICcyMDI2LTAzLTI1VDIxOjM5OjQ4WidcbiAgICogICBzdGF0dXM6IGxpdmVcbiAgICogICBoYW5kbGVzOlxuICAgKiAgIC0gdWk6YWNoaWV2ZW1lbnRzLXJldmlldy5zdWJtaXRcbiAgICogICBjYWxsczpcbiAgICogICAtIFBPU1QgL2FwaS9yZXZpZXctZGVjaXNpb25zXG4gICAqICAgLSBQT1NUIC9hcGkvY3YvbGF5b3V0LWVzdGltYXRlXG4gICAqICAgcmVhZHM6XG4gICAqICAgLSB3aW5kb3c6YWNoaWV2ZW1lbnREZWNpc2lvbnNcbiAgICogICAtIHdpbmRvdzpfc3VnZ2VzdGVkQWNoc09yZGVyZWRcbiAgICogICB3cml0ZXM6XG4gICAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9yZXZpZXctZGVjaXNpb25zLmRlY2lzaW9uc1xuICAgKiAgIC0gcmVxdWVzdDpQT1NUIC9hcGkvcmV2aWV3LWRlY2lzaW9ucy5hY2NlcHRlZF9zdWdnZXN0aW9uc1xuICAgKiAgIC0gd2luZG93Ol9zYXZlZERlY2lzaW9ucy5hY2hpZXZlbWVudF9kZWNpc2lvbnNcbiAgICogICAtIHdpbmRvdzpfc2F2ZWREZWNpc2lvbnMuYWNjZXB0ZWRfc3VnZ2VzdGVkX2FjaGlldmVtZW50c1xuICAgKiAgIG5vdGVzOiBQZXJzaXN0cyBhY2hpZXZlbWVudCBpbmNsdXNpb24gZGVjaXNpb25zIGFuZCB0aGUgYWNjZXB0ZWQgQUktc3VnZ2VzdGVkIGFjaGlldmVtZW50cyB0aGF0IHNob3VsZCByZW1haW4gc2Vzc2lvbi1vbmx5IHVudGlsIGFuIGV4cGxpY2l0IGhhcnZlc3Qgc3RlcC5cbiAgICovXG4gIGNvbnN0IGFsbERlY2lzaW9ucyA9IHdpbmRvdy5hY2hpZXZlbWVudERlY2lzaW9ucyB8fCB7fTtcbiAgLy8gU2VwYXJhdGUgZXhpc3RpbmcgYWNoaWV2ZW1lbnRzIGZyb20gQUktc3VnZ2VzdGVkIG9uZXNcbiAgY29uc3QgZGVjaXNpb25zID0ge307XG4gIGNvbnN0IHN1Z2dlc3RlZERlY2lzaW9ucyA9IHt9O1xuICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhhbGxEZWNpc2lvbnMpKSB7XG4gICAgaWYgKGsuc3RhcnRzV2l0aCgnc3VnZzo6JykpIHN1Z2dlc3RlZERlY2lzaW9uc1trXSA9IHY7XG4gICAgZWxzZSBkZWNpc2lvbnNba10gPSB2O1xuICB9XG4gIGNvbnN0IGNvdW50ID0gT2JqZWN0LmtleXMoYWxsRGVjaXNpb25zKS5sZW5ndGg7XG4gIGlmIChjb3VudCA9PT0gMCkgcmV0dXJuO1xuICAvLyBSZXNvbHZlIHN1Z2dlc3RlZCBhY2hpZXZlbWVudCBvYmplY3RzIHRoYXQgd2VyZSBhY2NlcHRlZFxuICBjb25zdCBzdWdnZXN0ZWRBY2hzID0gd2luZG93Ll9zdWdnZXN0ZWRBY2hzT3JkZXJlZCB8fCBbXTtcbiAgY29uc3QgYWNjZXB0ZWRTdWdnZXN0aW9ucyA9IHN1Z2dlc3RlZEFjaHNcbiAgICAuZmlsdGVyKHMgPT4ge1xuICAgICAgY29uc3QgYWN0aW9uID0gc3VnZ2VzdGVkRGVjaXNpb25zW3MuX3N1Z2dJZF07XG4gICAgICByZXR1cm4gYWN0aW9uID09PSAnaW5jbHVkZScgfHwgYWN0aW9uID09PSAnZW1waGFzaXplJztcbiAgICB9KVxuICAgIC5tYXAocyA9PiAoeyB0aXRsZTogcy50aXRsZSwgZGVzY3JpcHRpb246IHMuZGVzY3JpcHRpb24sIGV4cGVyaWVuY2VfaWQ6IHMuZXhwZXJpZW5jZV9pZCwgcmF0aW9uYWxlOiBzLnJhdGlvbmFsZSB9KSk7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9yZXZpZXctZGVjaXNpb25zJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgdHlwZTogJ2FjaGlldmVtZW50cycsIGRlY2lzaW9ucywgYWNjZXB0ZWRfc3VnZ2VzdGlvbnM6IGFjY2VwdGVkU3VnZ2VzdGlvbnMgfSlcbiAgICB9KTtcbiAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgIHN0YXRlTWFuYWdlci5tYXJrQ29udGVudENoYW5nZWQoKTtcbiAgICAgIHNob3dUb2FzdChgQWNoaWV2ZW1lbnQgc2VsZWN0aW9ucyBzYXZlZCAoJHtjb3VudH0gaXRlbXMpYCk7XG4gICAgICBzY2hlZHVsZUF0c1JlZnJlc2goKTtcbiAgICAgIC8vIFBlcnNpc3QgbG9jYWxseSBzbyB0aGUgcmV2aWV3IFVJIGltbWVkaWF0ZWx5IHJlZmxlY3RzIHNhdmVkIGNob2ljZXNcbiAgICAgIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMgPSB3aW5kb3cuX3NhdmVkRGVjaXNpb25zIHx8IHt9O1xuICAgICAgd2luZG93Ll9zYXZlZERlY2lzaW9ucy5hY2hpZXZlbWVudF9kZWNpc2lvbnMgPSBkZWNpc2lvbnM7XG4gICAgICBpZiAoYWNjZXB0ZWRTdWdnZXN0aW9ucyAmJiBhY2NlcHRlZFN1Z2dlc3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgd2luZG93Ll9zYXZlZERlY2lzaW9ucy5hY2NlcHRlZF9zdWdnZXN0ZWRfYWNoaWV2ZW1lbnRzID0gYWNjZXB0ZWRTdWdnZXN0aW9ucztcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgdXBkYXRlSW5jbHVzaW9uQ291bnRzID09PSAnZnVuY3Rpb24nKSB1cGRhdGVJbmNsdXNpb25Db3VudHMoKTtcbiAgICAgIHN3aXRjaFRhYigndGFnbGluZS1yZXZpZXcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZXJyID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgc2hvd1RvYXN0KGBFcnJvcjogJHtlcnIuZXJyb3IgfHwgJ0ZhaWxlZCB0byBzYXZlIHNlbGVjdGlvbnMnfWAsICdlcnJvcicpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dUb2FzdCgnRmFpbGVkIHRvIHNhdmUgYWNoaWV2ZW1lbnQgc2VsZWN0aW9ucy4gUGxlYXNlIHRyeSBhZ2Fpbi4nLCAnZXJyb3InKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3ZlQWNoaWV2ZW1lbnRSb3coYWNoSWQsIGRpcmVjdGlvbikge1xuICBjb25zdCBhcnIgPSB3aW5kb3cuX2FjaGlldmVtZW50c09yZGVyZWQ7XG4gIGlmICghYXJyKSByZXR1cm47XG4gIGNvbnN0IGlkeCA9IGFyci5maW5kSW5kZXgoYSA9PiBhLmlkID09PSBhY2hJZCk7XG4gIGlmIChpZHggPCAwKSByZXR1cm47XG4gIGNvbnN0IG5ld0lkeCA9IGlkeCArIGRpcmVjdGlvbjtcbiAgaWYgKG5ld0lkeCA8IDAgfHwgbmV3SWR4ID49IGFyci5sZW5ndGgpIHJldHVybjtcbiAgW2FycltpZHhdLCBhcnJbbmV3SWR4XV0gPSBbYXJyW25ld0lkeF0sIGFycltpZHhdXTtcbiAgd2luZG93Ll9hY2hpZXZlbWVudHNPcmRlcmVkID0gYXJyO1xuICBfcmVuZGVyQWNoaWV2ZW1lbnRzUmV2aWV3VGFibGUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaGlldmVtZW50cy10YWJsZS1jb250YWluZXInKSk7XG59XG5cbi8vID09PT0gQWNoaWV2ZW1lbnRzIEVkaXRvciBUYWIgPT09PVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBwZXItZXhwZXJpZW5jZSBhY2hpZXZlbWVudHMgZWRpdG9yIHRhYi5cbiAqIEVhY2ggZXhwZXJpZW5jZSBnZXRzIGEgY29sbGFwc2libGUgY2FyZCB3aXRoIGl0cyBhY2hpZXZlbWVudHMgbGlzdGVkLlxuICogRWFjaCBhY2hpZXZlbWVudCBzdXBwb3J0czogaW5saW5lIGVkaXQsIHJlb3JkZXIgKFx1MjE5MVx1MjE5MyksIGRlbGV0ZSwgYW5kIExMTSByZXdyaXRlLlxuICovXG5hc3luYyBmdW5jdGlvbiBidWlsZEFjaGlldmVtZW50c0VkaXRvcigpIHtcbiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgaWYgKCFjb250YWluZXIpIHJldHVybjtcblxuICBjb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDoxMnB4O3BhZGRpbmc6MjBweDtjb2xvcjojNmI3MjgwO1wiPjxkaXYgY2xhc3M9XCJsb2FkaW5nLXNwaW5uZXJcIiBzdHlsZT1cIndpZHRoOjIwcHg7aGVpZ2h0OjIwcHg7Ym9yZGVyLXdpZHRoOjJweDtmbGV4LXNocmluazowO1wiPjwvZGl2PjxzcGFuPkxvYWRpbmcgZXhwZXJpZW5jZSBidWxsZXRzIGVkaXRvclx1MjAyNjwvc3Bhbj48L2Rpdj4nO1xuXG4gIC8vIEZldGNoIGV4cGVyaWVuY2VzICsgdGhlaXIgYWNoaWV2ZW1lbnRzIGZyb20gbWFzdGVyIGZpZWxkc1xuICBsZXQgZXhwZXJpZW5jZXMgPSBbXTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZmllbGRzJyk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgZXhwZXJpZW5jZXMgPSBkYXRhLmV4cGVyaWVuY2VzIHx8IFtdO1xuICB9IGNhdGNoIChfKSB7fVxuXG4gIGlmIChleHBlcmllbmNlcy5sZW5ndGggPT09IDApIHtcbiAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJzxwIHN0eWxlPVwicGFkZGluZzoyMHB4O2NvbG9yOiM2YjcyODA7XCI+Tm8gZXhwZXJpZW5jZXMgZm91bmQgaW4gbWFzdGVyIENWLjwvcD4nO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEluaXRpYWxpc2UgZWRpdHMgc3RvcmUgXHUyMDE0IGtleWVkIGJ5IGV4cGVyaWVuY2UgaW5kZXgsIHZhbHVlIGlzIGFycmF5IG9mIHsgdGV4dCwgaGlkZGVuIH1cbiAgd2luZG93LmFjaGlldmVtZW50RWRpdHMgPSB3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0cyB8fCB7fTtcbiAgZXhwZXJpZW5jZXMuZm9yRWFjaCgoZXhwLCBleHBJZHgpID0+IHtcbiAgICBpZiAoIXdpbmRvdy5hY2hpZXZlbWVudEVkaXRzW2V4cElkeF0pIHtcbiAgICAgIHdpbmRvdy5hY2hpZXZlbWVudEVkaXRzW2V4cElkeF0gPSAoZXhwLmtleV9hY2hpZXZlbWVudHMgfHwgZXhwLmFjaGlldmVtZW50cyB8fCBbXSkubWFwKGEgPT5cbiAgICAgICAgX25vcm1hbGl6ZUFjaGlldmVtZW50RWRpdEVudHJ5KFxuICAgICAgICAgIHR5cGVvZiBhID09PSAnc3RyaW5nJyA/IGEgOiAoYSAmJiAoYS50ZXh0IHx8IGEuZGVzY3JpcHRpb24gfHwgYS5jb250ZW50IHx8ICcnKSkgfHwgJydcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2luZG93LmFjaGlldmVtZW50RWRpdHNbZXhwSWR4XSA9IF9ub3JtYWxpemVBY2hpZXZlbWVudEVkaXRMaXN0KHdpbmRvdy5hY2hpZXZlbWVudEVkaXRzW2V4cElkeF0pO1xuICAgIH1cbiAgfSk7XG5cbiAgbGV0IGh0bWwgPSBgXG4gICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6MTZweDtcIj5cbiAgICAgIDxoMiBzdHlsZT1cIm1hcmdpbjowIDAgNHB4O1wiPlx1MjcwRlx1RkUwRiBFeHBlcmllbmNlIEJ1bGxldHM8L2gyPlxuICAgICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO21hcmdpbjowIDAgMTZweDtmb250LXNpemU6MC45ZW07XCI+XG4gICAgICAgIEVkaXQsIHJlb3JkZXIsIGRlbGV0ZSwgb3IgQUktcmV3cml0ZSBpbmRpdmlkdWFsIGV4cGVyaWVuY2UgYnVsbGV0cyBwZXIgcm9sZS5cbiAgICAgICAgQ2hhbmdlcyBhcmUgc2F2ZWQgYXV0b21hdGljYWxseSBhbmQgdXNlZCBkdXJpbmcgQ1YgZ2VuZXJhdGlvbi5cbiAgICAgIDwvcD5cbiAgYDtcblxuICAvLyBGaWx0ZXIgb3V0IGV4cGVyaWVuY2VzIHRoYXQgdXNlciBtYXJrZWQgYXMgZXhjbHVkZWQgKHBlcnNpc3RlZCBkZWNpc2lvbnMpXG4gIGNvbnN0IGV4cERlY2lzaW9ucyA9ICh3aW5kb3cuX3NhdmVkRGVjaXNpb25zICYmIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMuZXhwZXJpZW5jZV9kZWNpc2lvbnMpIHx8IHVzZXJTZWxlY3Rpb25zLmV4cGVyaWVuY2VzIHx8IHt9O1xuICBleHBlcmllbmNlcy5mb3JFYWNoKChleHAsIGV4cElkeCkgPT4ge1xuICAgIGNvbnN0IGV4cElkID0gZXhwLmlkIHx8IGV4cC5leHBlcmllbmNlX2lkIHx8IGBleHA6OiR7ZXhwSWR4fWA7XG4gICAgY29uc3QgZGVjaXNpb24gPSBleHBEZWNpc2lvbnNbZXhwSWRdO1xuICAgIGlmIChkZWNpc2lvbiA9PT0gJ2V4Y2x1ZGUnKSByZXR1cm47IC8vIG9taXQgZXhjbHVkZWQgZXhwZXJpZW5jZXMgZnJvbSBlZGl0b3JcbiAgICBjb25zdCB0aXRsZSAgICA9IGVzY2FwZUh0bWwoZXhwLnRpdGxlIHx8IGV4cC5wb3NpdGlvbiB8fCBgRXhwZXJpZW5jZSAke2V4cElkeCArIDF9YCk7XG4gICAgY29uc3QgY29tcGFueSAgPSBlc2NhcGVIdG1sKGV4cC5jb21wYW55IHx8IGV4cC5vcmdhbml6YXRpb24gfHwgJycpO1xuICAgIGNvbnN0IGFjaENvdW50ID0gd2luZG93LmFjaGlldmVtZW50RWRpdHNbZXhwSWR4XS5sZW5ndGg7XG5cbiAgICBodG1sICs9IGBcbiAgICAgIDxkZXRhaWxzIG9wZW4gc3R5bGU9XCJtYXJnaW4tYm90dG9tOjEycHg7Ym9yZGVyOjFweCBzb2xpZCAjZTVlN2ViO2JvcmRlci1yYWRpdXM6OHB4O292ZXJmbG93OmhpZGRlbjtcIj5cbiAgICAgICAgPHN1bW1hcnkgc3R5bGU9XCJwYWRkaW5nOjEycHggMTZweDtiYWNrZ3JvdW5kOiNmOWZhZmI7Y3Vyc29yOnBvaW50ZXI7Zm9udC13ZWlnaHQ6NjAwO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDtcIj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZsZXg6MTtcIj4ke3RpdGxlfSR7Y29tcGFueSA/IGAgPHNwYW4gc3R5bGU9XCJmb250LXdlaWdodDo0MDA7Y29sb3I6IzZiNzI4MDtcIj5AICR7Y29tcGFueX08L3NwYW4+YCA6ICcnfTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjhlbTtjb2xvcjojOWNhM2FmO1wiPiR7YWNoQ291bnR9IGJ1bGxldCR7YWNoQ291bnQgIT09IDEgPyAncycgOiAnJ308L3NwYW4+XG4gICAgICAgIDwvc3VtbWFyeT5cbiAgICAgICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6MTJweCAxNnB4O1wiIGlkPVwiYWNoLWVkaXRvci1leHAtJHtleHBJZHh9XCI+XG4gICAgICAgICAgPGRpdiBpZD1cImFjaC1saXN0LSR7ZXhwSWR4fVwiPjwvZGl2PlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4tc2Vjb25kYXJ5XCIgc3R5bGU9XCJtYXJnaW4tdG9wOjhweDtmb250LXNpemU6MC44NWVtO1wiXG4gICAgICAgICAgICBvbmNsaWNrPVwiYWRkQWNoaWV2ZW1lbnRSb3coJHtleHBJZHh9KVwiPisgQWRkIEJ1bGxldDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGV0YWlscz5cbiAgICBgO1xuICB9KTtcblxuICBodG1sICs9IGBcbiAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDoyMHB4O2Rpc3BsYXk6ZmxleDtnYXA6MTJweDthbGlnbi1pdGVtczpjZW50ZXI7XCI+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYmFjay1idG5cIiBvbmNsaWNrPVwic3dpdGNoVGFiKCdleHAtcmV2aWV3JylcIj5cdTIxOTAgQmFjayB0byBFeHBlcmllbmNlczwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbnRpbnVlLWJ0blwiIG9uY2xpY2s9XCJzYXZlQWNoaWV2ZW1lbnRFZGl0c0FuZENvbnRpbnVlKClcIj5TYXZlICZhbXA7IENvbnRpbnVlIHRvIFNraWxscyBcdTIxOTI8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYDtcblxuICBjb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDtcblxuICAvLyBSZW5kZXIgYWNoaWV2ZW1lbnQgcm93cyBmb3IgZWFjaCBleHBlcmllbmNlXG4gIGV4cGVyaWVuY2VzLmZvckVhY2goKF8sIGV4cElkeCkgPT4gcmVuZGVyQWNoaWV2ZW1lbnRFZGl0b3JSb3dzKGV4cElkeCkpO1xufVxuXG4vLyBWZXJicyB0aGF0IGdlbmVyYXRlIGEgd2Vhay12ZXJiIHdhcm5pbmcgYmFkZ2UgaW4gdGhlIGJ1bGxldCBlZGl0b3IuXG5jb25zdCBfQUNIX1BBU1NJVkVfU1RBUlRTID0gbmV3IFNldChbJ3dhcycsJ3dlcmUnLCdpcycsJ2FyZScsJ2JlZW4nXSk7XG5jb25zdCBfQUNIX1dFQUtfVkVSQlMgPSBuZXcgU2V0KFtcbiAgJ2Fzc2lzdGVkJywnY29udHJpYnV0ZWQnLCdoZWxwZWQnLCdwYXJ0aWNpcGF0ZWQnLCdzdXBwb3J0ZWQnLFxuICAnc3VwZXJ2aXNlZCcsJ3dvcmtlZCcsJ2NvbGxhYm9yYXRlZCcsJ2Nvb3BlcmF0ZWQnLFxuXSk7XG5jb25zdCBfQUNIX1NUUk9OR19WRVJCUyA9IG5ldyBTZXQoW1xuICAnYWNjZWxlcmF0ZWQnLCdhY2hpZXZlZCcsJ2FyY2hpdGVjdGVkJywnYXV0b21hdGVkJywnYnVpbHQnLFxuICAnY2hhbXBpb25lZCcsJ2NvaW5lZCcsJ2NvbmNlaXZlZCcsJ2NvbmR1Y3RlZCcsJ2NvbnNvbGlkYXRlZCcsXG4gICdjcmVhdGVkJywnY3V0JywnZGVsaXZlcmVkJywnZGVtb25zdHJhdGVkJywnZGVwbG95ZWQnLFxuICAnZGVzaWduZWQnLCdkZXZlbG9wZWQnLCdkaXJlY3RlZCcsJ2RvdWJsZWQnLCdkcm92ZScsXG4gICdlbmFibGVkJywnZXN0YWJsaXNoZWQnLCdleHBhbmRlZCcsJ2ZvdW5kZWQnLCdnZW5lcmF0ZWQnLFxuICAnZ3JldycsJ2ltcGxlbWVudGVkJywnaW1wcm92ZWQnLCdpbmNyZWFzZWQnLCdpbnRlZ3JhdGVkJyxcbiAgJ2ludmVudGVkJywnbGF1bmNoZWQnLCdsZWQnLCdtYW5hZ2VkJywnb3B0aW1pemVkJywncGlvbmVlcmVkJyxcbiAgJ3Byb3ZpZGVkJywncHVibGlzaGVkJywncmFpc2VkJywncmVkdWNlZCcsJ3JlZmFjdG9yZWQnLCdzY2FsZWQnLFxuICAnc2VjdXJlZCcsJ3NoaXBwZWQnLCdzcGVhcmhlYWRlZCcsJ3N0cmVhbWxpbmVkJywndGF1Z2h0JyxcbiAgJ3RyYW5zZm9ybWVkJywndHJhbnNsYXRlZCcsJ3RyaXBsZWQnLFxuXSk7XG5cbmZ1bmN0aW9uIF9hY2hWZXJiV2FybmluZyh0ZXh0KSB7XG4gIGNvbnN0IGZpcnN0V29yZCA9ICh0ZXh0IHx8ICcnKS50cmltKCkuc3BsaXQoL1tcXHMsLjo7XS8pWzBdLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvW15hLXpdL2csICcnKTtcbiAgaWYgKCFmaXJzdFdvcmQpIHJldHVybiBudWxsO1xuICBpZiAoX0FDSF9QQVNTSVZFX1NUQVJUUy5oYXMoZmlyc3RXb3JkKSkgcmV0dXJuIHsgbGV2ZWw6ICdwYXNzaXZlJywgd29yZDogZmlyc3RXb3JkIH07XG4gIGlmIChfQUNIX1dFQUtfVkVSQlMuaGFzKGZpcnN0V29yZCkpIHJldHVybiB7IGxldmVsOiAnd2VhaycsICAgIHdvcmQ6IGZpcnN0V29yZCB9O1xuICBpZiAoIV9BQ0hfU1RST05HX1ZFUkJTLmhhcyhmaXJzdFdvcmQpKSByZXR1cm4geyBsZXZlbDogJ25ldXRyYWwnLCB3b3JkOiBmaXJzdFdvcmQgfTtcbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogUmVuZGVyIHRoZSBlZGl0YWJsZSBhY2hpZXZlbWVudCByb3dzIGZvciBvbmUgZXhwZXJpZW5jZS5cbiAqL1xuZnVuY3Rpb24gcmVuZGVyQWNoaWV2ZW1lbnRFZGl0b3JSb3dzKGV4cElkeCkge1xuICBjb25zdCBsaXN0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgYWNoLWxpc3QtJHtleHBJZHh9YCk7XG4gIGlmICghbGlzdEVsKSByZXR1cm47XG4gIGNvbnN0IGFjaHMgPSBfbm9ybWFsaXplQWNoaWV2ZW1lbnRFZGl0TGlzdCh3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0c1tleHBJZHhdIHx8IFtdKTtcbiAgd2luZG93LmFjaGlldmVtZW50RWRpdHNbZXhwSWR4XSA9IGFjaHM7XG5cbiAgaWYgKGFjaHMubGVuZ3RoID09PSAwKSB7XG4gICAgbGlzdEVsLmlubmVySFRNTCA9ICc8cCBzdHlsZT1cImNvbG9yOiM5Y2EzYWY7Zm9udC1zaXplOjAuODVlbTtwYWRkaW5nOjRweCAwO1wiPk5vIGV4cGVyaWVuY2UgYnVsbGV0cyB5ZXQuPC9wPic7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGlzdEVsLmlubmVySFRNTCA9IGFjaHMubWFwKChlbnRyeSwgYWNoSWR4KSA9PiB7XG4gICAgY29uc3QgdGV4dCA9IF9hY2hpZXZlbWVudEVudHJ5VGV4dChlbnRyeSk7XG4gICAgY29uc3QgaGlkZGVuID0gX2FjaGlldmVtZW50RW50cnlIaWRkZW4oZW50cnkpO1xuICAgIGNvbnN0IHZlcmJXYXJuID0gX2FjaFZlcmJXYXJuaW5nKHRleHQpO1xuICAgIGNvbnN0IHZlcmJCYWRnZSA9IHZlcmJXYXJuXG4gICAgICA/ICh2ZXJiV2Fybi5sZXZlbCA9PT0gJ3Bhc3NpdmUnXG4gICAgICAgICAgPyBgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjc4ZW07Y29sb3I6IzlmMTIzOTtiYWNrZ3JvdW5kOiNmZmYxZjI7Ym9yZGVyOjFweCBzb2xpZCAjZmVjZGQzO2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6MnB4IDZweDttYXJnaW4tdG9wOjNweDtcIiB0aXRsZT1cIkJ1bGxldCBvcGVucyB3aXRoIHBhc3NpdmUgdm9pY2UgKCcke3ZlcmJXYXJuLndvcmR9JykgXHUyMDE0IHJld3JpdGUgd2l0aCBhbiBhY3RpdmUgb3BlbmluZyB2ZXJiXCI+XHUyNkEwIFBhc3NpdmUgdm9pY2UgXHUyMDE0IHJld3JpdGUgd2l0aCBhbiBhY3RpdmUgb3BlbmluZyB2ZXJiPC9kaXY+YFxuICAgICAgICAgIDogdmVyYldhcm4ubGV2ZWwgPT09ICd3ZWFrJ1xuICAgICAgICAgID8gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC43OGVtO2NvbG9yOiNiNDUzMDk7YmFja2dyb3VuZDojZmZmYmViO2JvcmRlcjoxcHggc29saWQgI2ZkZTY4YTtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjJweCA2cHg7bWFyZ2luLXRvcDozcHg7XCIgdGl0bGU9XCJPcGVuaW5nIHZlcmIgJyR7dmVyYldhcm4ud29yZH0nIGlzIHdlYWsgXHUyMDE0IGNvbnNpZGVyIExlZCwgQnVpbHQsIERyb3ZlLCBldGMuXCI+XHUyNkEwIFdlYWsgb3BlbmluZyB2ZXJiIFx1MjAxNCB1c2UgYSBzdHJvbmdlciBhY3Rpb24gdmVyYjwvZGl2PmBcbiAgICAgICAgICA6IGA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuNzhlbTtjb2xvcjojNmI3MjgwO2JhY2tncm91bmQ6I2Y5ZmFmYjtib3JkZXI6MXB4IHNvbGlkICNlNWU3ZWI7Ym9yZGVyLXJhZGl1czo0cHg7cGFkZGluZzoycHggNnB4O21hcmdpbi10b3A6M3B4O1wiIHRpdGxlPVwiJyR7dmVyYldhcm4ud29yZH0nIGlzIG5vdCBpbiB0aGUgc3Ryb25nLXZlcmIgbGlzdCBcdTIwMTQgdmVyaWZ5IGl0IG1ha2VzIGFuIGltcGFjdCBzdGF0ZW1lbnRcIj5cdTIxMzkgT3BlbmluZyB2ZXJiIG5vdCBpbiBzdHJvbmctdmVyYiBsaXN0PC9kaXY+YFxuICAgICAgICApXG4gICAgICA6ICcnO1xuICAgIHJldHVybiBgXG4gICAgPGRpdiBpZD1cImFjaC1yb3ctJHtleHBJZHh9LSR7YWNoSWR4fVwiIGNsYXNzPVwiJHtoaWRkZW4gPyAnYWNoaWV2ZW1lbnQtcm93LWhpZGRlbicgOiAnJ31cIiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6OHB4O2FsaWduLWl0ZW1zOmZsZXgtc3RhcnQ7bWFyZ2luLWJvdHRvbTo4cHg7XCI+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtnYXA6MnB4O3BhZGRpbmctdG9wOjRweDtcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgdGl0bGU9XCJNb3ZlIHVwXCIgICBhcmlhLWxhYmVsPVwiTW92ZSBidWxsZXQgdXBcIiAgIG9uY2xpY2s9XCJtb3ZlQWNoaWV2ZW1lbnQoJHtleHBJZHh9LCR7YWNoSWR4fSwtMSlcIj5cdTI1QjI8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgdGl0bGU9XCJNb3ZlIGRvd25cIiBhcmlhLWxhYmVsPVwiTW92ZSBidWxsZXQgZG93blwiIG9uY2xpY2s9XCJtb3ZlQWNoaWV2ZW1lbnQoJHtleHBJZHh9LCR7YWNoSWR4fSwrMSlcIj5cdTI1QkM8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBzdHlsZT1cImZsZXg6MTtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO1wiPlxuICAgICAgPHRleHRhcmVhIGlkPVwiYWNoLXRleHQtJHtleHBJZHh9LSR7YWNoSWR4fVwiXG4gICAgICAgIHJvd3M9XCIyXCJcbiAgICAgICAgc3R5bGU9XCJ3aWR0aDoxMDAlO3BhZGRpbmc6NnB4IDhweDtib3JkZXI6MXB4IHNvbGlkICR7aGlkZGVuID8gJyNmNTllMGInIDogdmVyYldhcm4/LmxldmVsID09PSAncGFzc2l2ZScgPyAnI2ZlY2RkMycgOiB2ZXJiV2Fybj8ubGV2ZWwgPT09ICd3ZWFrJyA/ICcjZmRlNjhhJyA6ICcjZDFkNWRiJ307Ym9yZGVyLXJhZGl1czo2cHg7Zm9udC1zaXplOjAuOWVtO3Jlc2l6ZTp2ZXJ0aWNhbDtib3gtc2l6aW5nOmJvcmRlci1ib3g7JHtoaWRkZW4gPyAnYmFja2dyb3VuZDojZmZmYmViO2NvbG9yOiM5MjQwMGU7JyA6ICcnfVwiXG4gICAgICAgIG9uY2hhbmdlPVwidXBkYXRlQWNoaWV2ZW1lbnRUZXh0KCR7ZXhwSWR4fSwke2FjaElkeH0sdGhpcy52YWx1ZSlcIlxuICAgICAgICBvbmJsdXI9XCJ1cGRhdGVBY2hpZXZlbWVudFRleHQoJHtleHBJZHh9LCR7YWNoSWR4fSx0aGlzLnZhbHVlKVwiXG4gICAgICA+JHtlc2NhcGVIdG1sKHRleHQpfTwvdGV4dGFyZWE+XG4gICAgICAke3ZlcmJCYWRnZX1cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Z2FwOjRweDtwYWRkaW5nLXRvcDoycHg7XCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0biAke2hpZGRlbiA/ICdhY3RpdmUnIDogJyd9XCIgdGl0bGU9XCIke2hpZGRlbiA/ICdTaG93IGJ1bGxldCBpbiBnZW5lcmF0ZWQgQ1YnIDogJ0hpZGUgYnVsbGV0IGZyb20gZ2VuZXJhdGVkIENWJ31cIlxuICAgICAgICAgIGFyaWEtbGFiZWw9XCIke2hpZGRlbiA/ICdTaG93IGJ1bGxldCBpbiBnZW5lcmF0ZWQgQ1YnIDogJ0hpZGUgYnVsbGV0IGZyb20gZ2VuZXJhdGVkIENWJ31cIiBhcmlhLXByZXNzZWQ9XCIke2hpZGRlbn1cIlxuICAgICAgICAgIG9uY2xpY2s9XCJ0b2dnbGVBY2hpZXZlbWVudEhpZGRlbigke2V4cElkeH0sJHthY2hJZHh9KVwiXG4gICAgICAgICAgc3R5bGU9XCJjb2xvcjoke2hpZGRlbiA/ICcjYjQ1MzA5JyA6ICcjNjQ3NDhiJ307XCI+JHtleWVTbGFzaEljb24oKX08L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgdGl0bGU9XCJBc2sgQUkgdG8gcmV3cml0ZVwiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIkFzayBBSSB0byByZXdyaXRlIHRoaXMgYnVsbGV0XCJcbiAgICAgICAgICBvbmNsaWNrPVwicmV3cml0ZUFjaGlldmVtZW50V2l0aExMTSgke2V4cElkeH0sJHthY2hJZHh9KVwiXG4gICAgICAgICAgPlx1MjcyODwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiB0aXRsZT1cIkRlbGV0ZVwiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIkRlbGV0ZSB0aGlzIGJ1bGxldFwiXG4gICAgICAgICAgb25jbGljaz1cImRlbGV0ZUFjaGlldmVtZW50KCR7ZXhwSWR4fSwke2FjaElkeH0pXCJcbiAgICAgICAgICBzdHlsZT1cImNvbG9yOiNlZjQ0NDQ7XCI+XHVEODNEXHVEREQxPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYDtcbiAgfSkuam9pbignJyk7XG59XG5cbi8vIERlYm91bmNlIHRpbWVyIGZvciBhdXRvLXBlcnNpc3RpbmcgYWNoaWV2ZW1lbnQgdGV4dCBlZGl0cy5cbmxldCBfYWNoUGVyc2lzdFRpbWVyID0gbnVsbDtcblxuZnVuY3Rpb24gdXBkYXRlQWNoaWV2ZW1lbnRUZXh0KGV4cElkeCwgYWNoSWR4LCB2YWx1ZSkge1xuICBpZiAoIXdpbmRvdy5hY2hpZXZlbWVudEVkaXRzW2V4cElkeF0pIHJldHVybjtcbiAgY29uc3QgZXhpc3RpbmcgPSBfbm9ybWFsaXplQWNoaWV2ZW1lbnRFZGl0RW50cnkod2luZG93LmFjaGlldmVtZW50RWRpdHNbZXhwSWR4XVthY2hJZHhdKTtcbiAgZXhpc3RpbmcudGV4dCA9IHZhbHVlO1xuICB3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0c1tleHBJZHhdW2FjaElkeF0gPSBleGlzdGluZztcblxuICAvLyBEZWJvdW5jZS1wZXJzaXN0IHNvIGVkaXRzIHN1cnZpdmUgdGFiIG5hdmlnYXRpb24gYW5kIHN0YXR1cyBwb2xsaW5nLlxuICBjbGVhclRpbWVvdXQoX2FjaFBlcnNpc3RUaW1lcik7XG4gIF9hY2hQZXJzaXN0VGltZXIgPSBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZmV0Y2goJy9hcGkvc2F2ZS1hY2hpZXZlbWVudC1lZGl0cycsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGVkaXRzOiB3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0cyB9KSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKF9lKSB7IC8qIHNpbGVudCBcdTIwMTQgdXNlciBzdGlsbCBoYXMgaW4tbWVtb3J5IHN0YXRlICovIH1cbiAgfSwgNTAwKTtcbn1cblxuZnVuY3Rpb24gdG9nZ2xlQWNoaWV2ZW1lbnRIaWRkZW4oZXhwSWR4LCBhY2hJZHgpIHtcbiAgaWYgKCF3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0c1tleHBJZHhdKSByZXR1cm47XG4gIGNvbnN0IGV4aXN0aW5nID0gX25vcm1hbGl6ZUFjaGlldmVtZW50RWRpdEVudHJ5KHdpbmRvdy5hY2hpZXZlbWVudEVkaXRzW2V4cElkeF1bYWNoSWR4XSk7XG4gIGV4aXN0aW5nLmhpZGRlbiA9ICFleGlzdGluZy5oaWRkZW47XG4gIHdpbmRvdy5hY2hpZXZlbWVudEVkaXRzW2V4cElkeF1bYWNoSWR4XSA9IGV4aXN0aW5nO1xuICByZW5kZXJBY2hpZXZlbWVudEVkaXRvclJvd3MoZXhwSWR4KTtcbn1cblxuZnVuY3Rpb24gbW92ZUFjaGlldmVtZW50KGV4cElkeCwgYWNoSWR4LCBkaXIpIHtcbiAgY29uc3QgYWNocyA9IHdpbmRvdy5hY2hpZXZlbWVudEVkaXRzW2V4cElkeF07XG4gIGlmICghYWNocykgcmV0dXJuO1xuICBjb25zdCBuZXdJZHggPSBhY2hJZHggKyBkaXI7XG4gIGlmIChuZXdJZHggPCAwIHx8IG5ld0lkeCA+PSBhY2hzLmxlbmd0aCkgcmV0dXJuO1xuICAvLyBGbHVzaCBjdXJyZW50IHRleHRhcmVhIHZhbHVlIGJlZm9yZSBtb3ZpbmdcbiAgY29uc3QgdGEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgYWNoLXRleHQtJHtleHBJZHh9LSR7YWNoSWR4fWApO1xuICBpZiAodGEpIHVwZGF0ZUFjaGlldmVtZW50VGV4dChleHBJZHgsIGFjaElkeCwgdGEudmFsdWUpO1xuICBbYWNoc1thY2hJZHhdLCBhY2hzW25ld0lkeF1dID0gW2FjaHNbbmV3SWR4XSwgYWNoc1thY2hJZHhdXTtcbiAgcmVuZGVyQWNoaWV2ZW1lbnRFZGl0b3JSb3dzKGV4cElkeCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUFjaGlldmVtZW50KGV4cElkeCwgYWNoSWR4KSB7XG4gIGNvbnN0IGFjaHMgPSB3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0c1tleHBJZHhdO1xuICBpZiAoIWFjaHMpIHJldHVybjtcbiAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgY29uZmlybURpYWxvZyhcbiAgICAnRGVsZXRlIHRoaXMgYnVsbGV0IGZyb20gdGhpcyBzZXNzaW9uPyBIaWRkZW4gYnVsbGV0cyByZW1haW4gYXZhaWxhYmxlIGZvciBsYXRlciBoYXJ2ZXN0LCBidXQgZGVsZXRlIHJlbW92ZXMgdGhlIGVkaXRlZCByb3cgZW50aXJlbHkuJyxcbiAgICB7IGNvbmZpcm1MYWJlbDogJ0RlbGV0ZScsIGNhbmNlbExhYmVsOiAnQ2FuY2VsJywgZGFuZ2VyOiB0cnVlIH0sXG4gICk7XG4gIGlmICghY29uZmlybWVkKSByZXR1cm47XG4gIGFjaHMuc3BsaWNlKGFjaElkeCwgMSk7XG4gIHJlbmRlckFjaGlldmVtZW50RWRpdG9yUm93cyhleHBJZHgpO1xufVxuXG5mdW5jdGlvbiBhZGRBY2hpZXZlbWVudFJvdyhleHBJZHgpIHtcbiAgaWYgKCF3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0c1tleHBJZHhdKSB3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0c1tleHBJZHhdID0gW107XG4gIHdpbmRvdy5hY2hpZXZlbWVudEVkaXRzW2V4cElkeF0ucHVzaCh7IHRleHQ6ICcnLCBoaWRkZW46IGZhbHNlIH0pO1xuICByZW5kZXJBY2hpZXZlbWVudEVkaXRvclJvd3MoZXhwSWR4KTtcbiAgLy8gRm9jdXMgdGhlIG5ldyB0ZXh0YXJlYVxuICBjb25zdCBuZXdJZHggPSB3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0c1tleHBJZHhdLmxlbmd0aCAtIDE7XG4gIGNvbnN0IHRhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYGFjaC10ZXh0LSR7ZXhwSWR4fS0ke25ld0lkeH1gKTtcbiAgaWYgKHRhKSB0YS5mb2N1cygpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXdyaXRlQWNoaWV2ZW1lbnRXaXRoTExNKGV4cElkeCwgYWNoSWR4KSB7XG4gIGNvbnN0IHRhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYGFjaC10ZXh0LSR7ZXhwSWR4fS0ke2FjaElkeH1gKTtcbiAgaWYgKCF0YSkgcmV0dXJuO1xuICBjb25zdCBvcmlnaW5hbFRleHQgPSB0YS52YWx1ZS50cmltKCk7XG4gIGlmICghb3JpZ2luYWxUZXh0KSB7IHNob3dUb2FzdCgnUGxlYXNlIGVudGVyIGEgYnVsbGV0IGZpcnN0LicsICdlcnJvcicpOyByZXR1cm47IH1cblxuICBfcmV3cml0ZVN1Z2dlc3Rpb25IaXN0b3J5ID0gW107XG4gIF9sYXN0UmV3cml0ZUxvZ0lkID0gbnVsbDtcbiAgX29wZW5SZXdyaXRlTW9kYWwob3JpZ2luYWxUZXh0LCAnJywgbnVsbCwge1xuICAgIGV4cGVyaWVuY2VJbmRleDogZXhwSWR4LFxuICAgIGFjaGlldmVtZW50SW5kZXg6IGFjaElkeCxcbiAgICBvbkFjY2VwdDogYXN5bmMgKHN1Z2dlc3Rpb24pID0+IHtcbiAgICAgIHVwZGF0ZUFjaGlldmVtZW50VGV4dChleHBJZHgsIGFjaElkeCwgc3VnZ2VzdGlvbik7XG4gICAgICBpZiAodGEpIHRhLnZhbHVlID0gc3VnZ2VzdGlvbjtcbiAgICAgIF9yZWNvcmRSZXdyaXRlT3V0Y29tZSgnYWNjZXB0ZWQnLCBzdWdnZXN0aW9uKTtcbiAgICAgIHNob3dUb2FzdCgnQnVsbGV0IHVwZGF0ZWQuJyk7XG4gICAgfSxcbiAgfSk7XG4gIGF3YWl0IF9ydW5SZXdyaXRlKG9yaWdpbmFsVGV4dCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGFpUmV3cml0ZVRvcExldmVsQWNoaWV2ZW1lbnQoYWNoSWQpIHtcbiAgY29uc3QgYWNoID0gKHdpbmRvdy5fYWNoaWV2ZW1lbnRzT3JkZXJlZCB8fCBbXSkuZmluZChhID0+IGEuaWQgPT09IGFjaElkKTtcbiAgaWYgKCFhY2gpIHJldHVybjtcbiAgY29uc3Qgb3JpZ2luYWxUZXh0ID0gYWNoLmRlc2NyaXB0aW9uIHx8ICcnO1xuICBpZiAoIW9yaWdpbmFsVGV4dCkgeyBzaG93VG9hc3QoJ1BsZWFzZSBlbnRlciBhIGRlc2NyaXB0aW9uIGZpcnN0LicsICdlcnJvcicpOyByZXR1cm47IH1cblxuICBfcmV3cml0ZVN1Z2dlc3Rpb25IaXN0b3J5ID0gW107XG4gIF9sYXN0UmV3cml0ZUxvZ0lkID0gbnVsbDtcbiAgX29wZW5SZXdyaXRlTW9kYWwob3JpZ2luYWxUZXh0LCAnJywgbnVsbCwge1xuICAgIGV4cGVyaWVuY2VJbmRleDogbnVsbCxcbiAgICBvbkFjY2VwdDogYXN5bmMgKHN1Z2dlc3Rpb24pID0+IHtcbiAgICAgIGF3YWl0IHNhdmVUb3BMZXZlbEFjaGlldmVtZW50RmllbGQoYWNoSWQsICdkZXNjcmlwdGlvbicsIHN1Z2dlc3Rpb24pO1xuICAgICAgY29uc3QgZGVzY0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYGFjaC1kZXNjLSR7Q1NTLmVzY2FwZShhY2hJZCl9YCk7XG4gICAgICBpZiAoZGVzY0VsKSBkZXNjRWwudmFsdWUgPSBzdWdnZXN0aW9uO1xuICAgICAgX3JlY29yZFJld3JpdGVPdXRjb21lKCdhY2NlcHRlZCcsIHN1Z2dlc3Rpb24pO1xuICAgICAgc2hvd1RvYXN0KCdBY2hpZXZlbWVudCB1cGRhdGVkLicpO1xuICAgIH0sXG4gIH0pO1xuICBhd2FpdCBfcnVuUmV3cml0ZShvcmlnaW5hbFRleHQpO1xufVxuXG5mdW5jdGlvbiBfb3BlblJld3JpdGVNb2RhbChvcmlnaW5hbFRleHQsIGN1cnJlbnRJbnN0cnVjdGlvbnMsIGN1cnJlbnRTdWdnZXN0aW9uLCBjYWxsYmFja3MpIHtcbiAgX3Jld3JpdGVDYWxsYmFja3MgPSBjYWxsYmFja3M7XG5cbiAgY29uc3Qgc3VnZ2VzdGVkSHRtbCA9IGN1cnJlbnRTdWdnZXN0aW9uICE9IG51bGxcbiAgICA/IGA8cCBpZD1cImFjaC1yZXdyaXRlLXN1Z2dlc3Rpb25cIiBzdHlsZT1cIm1hcmdpbjo0cHggMCAwO21pbi1oZWlnaHQ6Mi40ZW07XCI+JHtlc2NhcGVIdG1sKGN1cnJlbnRTdWdnZXN0aW9uKX08L3A+YFxuICAgIDogYDxwIGlkPVwiYWNoLXJld3JpdGUtc3VnZ2VzdGlvblwiIHN0eWxlPVwibWFyZ2luOjRweCAwIDA7bWluLWhlaWdodDoyLjRlbTtjb2xvcjojOWNhM2FmO2ZvbnQtc3R5bGU6aXRhbGljO1wiPlx1MjNGMyBHZW5lcmF0aW5nXHUyMDI2PC9wPmA7XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FsZXJ0LW1vZGFsLXRpdGxlJykudGV4dENvbnRlbnQgPSAnXHUyNzI4IEFJIFJld3JpdGUnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWxlcnQtbW9kYWwtbWVzc2FnZScpLmlubmVySFRNTCA9IGBcbiAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxMHB4O1wiPlxuICAgICAgPHN0cm9uZz5PcmlnaW5hbDo8L3N0cm9uZz5cbiAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDttYXJnaW46NHB4IDAgMDtmb250LXN0eWxlOml0YWxpYztmb250LXNpemU6MC45MmVtO1wiPiR7ZXNjYXBlSHRtbChvcmlnaW5hbFRleHQpfTwvcD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxMnB4O1wiPlxuICAgICAgPHN0cm9uZz5TdWdnZXN0ZWQ6PC9zdHJvbmc+XG4gICAgICAke3N1Z2dlc3RlZEh0bWx9XG4gICAgPC9kaXY+XG4gICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTZweDtcIj5cbiAgICAgIDxsYWJlbCBmb3I9XCJhY2gtcmV3cml0ZS1pbnN0cnVjdGlvbnNcIiBzdHlsZT1cImZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MC45MmVtO2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWJvdHRvbTo0cHg7XCI+SW5zdHJ1Y3Rpb25zIDxzcGFuIHN0eWxlPVwiZm9udC13ZWlnaHQ6NDAwO2NvbG9yOiM2YjcyODA7XCI+KG9wdGlvbmFsKTwvc3Bhbj48L2xhYmVsPlxuICAgICAgPHRleHRhcmVhIGlkPVwiYWNoLXJld3JpdGUtaW5zdHJ1Y3Rpb25zXCJcbiAgICAgICAgcm93cz1cIjJcIlxuICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gbWFrZSBpdCBtb3JlIGNvbmNpc2UsIGVtcGhhc2lzZSBsZWFkZXJzaGlwLCBhZGQgYSBtZXRyaWNcIlxuICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Ym94LXNpemluZzpib3JkZXItYm94O3BhZGRpbmc6NnB4IDhweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo2cHg7Zm9udC1zaXplOjAuOWVtO3Jlc2l6ZTp2ZXJ0aWNhbDtcIlxuICAgICAgPiR7ZXNjYXBlSHRtbChjdXJyZW50SW5zdHJ1Y3Rpb25zKX08L3RleHRhcmVhPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjhweDtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmQ7XCI+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLXNlY29uZGFyeVwiIGlkPVwiYWNoLXJld3JpdGUtcmVqZWN0LWJ0blwiIG9uY2xpY2s9XCJfcmVjb3JkUmV3cml0ZU91dGNvbWUoJ3JlamVjdGVkJyk7IGNsb3NlQWxlcnRNb2RhbCgpXCI+UmVqZWN0PC9idXR0b24+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLXNlY29uZGFyeVwiIGlkPVwiYWNoLXJld3JpdGUtZ2VuZXJhdGUtYnRuXCI+R2VuZXJhdGU8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJjb250aW51ZS1idG5cIiAgaWQ9XCJhY2gtcmV3cml0ZS1hY2NlcHQtYnRuXCI+QWNjZXB0PC9idXR0b24+XG4gICAgPC9kaXY+YDtcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWxlcnQtbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICBfZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIHNldEluaXRpYWxGb2N1cygnYWxlcnQtbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ2FsZXJ0LW1vZGFsLW92ZXJsYXknKTtcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLXJld3JpdGUtZ2VuZXJhdGUtYnRuJykub25jbGljayA9ICgpID0+IF9ydW5SZXdyaXRlKG9yaWdpbmFsVGV4dCk7XG5cbiAgX3VwZGF0ZVJld3JpdGVBY2NlcHRCdG4oY3VycmVudFN1Z2dlc3Rpb24pO1xufVxuXG5mdW5jdGlvbiBfdXBkYXRlUmV3cml0ZUFjY2VwdEJ0bihzdWdnZXN0aW9uKSB7XG4gIGNvbnN0IGFjY2VwdEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhY2gtcmV3cml0ZS1hY2NlcHQtYnRuJyk7XG4gIGlmICghYWNjZXB0QnRuKSByZXR1cm47XG4gIGFjY2VwdEJ0bi5kaXNhYmxlZCA9IHN1Z2dlc3Rpb24gPT0gbnVsbDtcbiAgYWNjZXB0QnRuLm9uY2xpY2sgPSBzdWdnZXN0aW9uID09IG51bGwgPyBudWxsIDogYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IF9yZXdyaXRlQ2FsbGJhY2tzLm9uQWNjZXB0KHN1Z2dlc3Rpb24pO1xuICAgIGNsb3NlQWxlcnRNb2RhbCgpO1xuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBfcmVjb3JkUmV3cml0ZU91dGNvbWUob3V0Y29tZSwgYWNjZXB0ZWRUZXh0KSB7XG4gIGlmICghX2xhc3RSZXdyaXRlTG9nSWQpIHJldHVybjtcbiAgY29uc3QgbG9nSWQgPSBfbGFzdFJld3JpdGVMb2dJZDtcbiAgX2xhc3RSZXdyaXRlTG9nSWQgPSBudWxsO1xuICBjb25zdCBib2R5ID0geyBsb2dfaWQ6IGxvZ0lkLCBvdXRjb21lIH07XG4gIGlmIChhY2NlcHRlZFRleHQgIT0gbnVsbCkgYm9keS5hY2NlcHRlZF90ZXh0ID0gYWNjZXB0ZWRUZXh0O1xuICB0cnkge1xuICAgIGF3YWl0IGZldGNoKCcvYXBpL3Jld3JpdGUtYWNoaWV2ZW1lbnQtb3V0Y29tZScsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSxcbiAgICB9KTtcbiAgfSBjYXRjaCAoXykgeyAvKiBmaXJlLWFuZC1mb3JnZXQgXHUyMDE0IGRvbid0IGRpc3J1cHQgdGhlIFVJICovIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gX3J1blJld3JpdGUob3JpZ2luYWxUZXh0KSB7XG4gIGNvbnN0IGluc3RydWN0aW9uc0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaC1yZXdyaXRlLWluc3RydWN0aW9ucycpO1xuICBjb25zdCB1c2VySW5zdHJ1Y3Rpb25zID0gaW5zdHJ1Y3Rpb25zRWwgPyBpbnN0cnVjdGlvbnNFbC52YWx1ZS50cmltKCkgOiAnJztcblxuICBjb25zdCBnZW5lcmF0ZUJ0biAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLXJld3JpdGUtZ2VuZXJhdGUtYnRuJyk7XG4gIGNvbnN0IGFjY2VwdEJ0biAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhY2gtcmV3cml0ZS1hY2NlcHQtYnRuJyk7XG4gIGNvbnN0IHJlamVjdEJ0biAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhY2gtcmV3cml0ZS1yZWplY3QtYnRuJyk7XG4gIGNvbnN0IHN1Z2dlc3Rpb25FbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhY2gtcmV3cml0ZS1zdWdnZXN0aW9uJyk7XG5cbiAgLy8gQ2FwdHVyZSB0aGUgY3VycmVudCBzdWdnZXN0aW9uIGFzIGEgcHJpb3IgYXR0ZW1wdCBiZWZvcmUgb3ZlcndyaXRpbmdcbiAgaWYgKHN1Z2dlc3Rpb25FbCkge1xuICAgIGNvbnN0IHByZXYgPSBzdWdnZXN0aW9uRWwudGV4dENvbnRlbnQudHJpbSgpO1xuICAgIGlmIChwcmV2ICYmIHByZXYgIT09ICdHZW5lcmF0aW5nXHUyMDI2JyAmJiAhcHJldi5zdGFydHNXaXRoKCdFcnJvcjonKSAmJiAhX3Jld3JpdGVTdWdnZXN0aW9uSGlzdG9yeS5pbmNsdWRlcyhwcmV2KSkge1xuICAgICAgX3Jld3JpdGVTdWdnZXN0aW9uSGlzdG9yeS5wdXNoKHByZXYpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChnZW5lcmF0ZUJ0bikgeyBnZW5lcmF0ZUJ0bi5kaXNhYmxlZCA9IHRydWU7IGdlbmVyYXRlQnRuLmlubmVySFRNTCA9ICc8c3BhbiBjbGFzcz1cImJ0bi1zcGlubmVyXCI+PC9zcGFuPkdlbmVyYXRpbmdcXHUyMDI2JzsgfVxuICBpZiAoYWNjZXB0QnRuKSAgIHsgYWNjZXB0QnRuLmRpc2FibGVkID0gdHJ1ZTsgfVxuICBpZiAoc3VnZ2VzdGlvbkVsKSB7IHN1Z2dlc3Rpb25FbC5zdHlsZS5jb2xvciA9ICcjOWNhM2FmJzsgc3VnZ2VzdGlvbkVsLnN0eWxlLmZvbnRTdHlsZSA9ICdpdGFsaWMnOyBzdWdnZXN0aW9uRWwudGV4dENvbnRlbnQgPSAnR2VuZXJhdGluZ1x1MjAyNic7IH1cblxuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3Jld3JpdGUtYWNoaWV2ZW1lbnQnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBhY2hpZXZlbWVudF90ZXh0OiAgICAgb3JpZ2luYWxUZXh0LFxuICAgICAgICBleHBlcmllbmNlX2luZGV4OiAgICAgX3Jld3JpdGVDYWxsYmFja3M/LmV4cGVyaWVuY2VJbmRleCA/PyBudWxsLFxuICAgICAgICBhY2hpZXZlbWVudF9pbmRleDogICAgX3Jld3JpdGVDYWxsYmFja3M/LmFjaGlldmVtZW50SW5kZXggPz8gbnVsbCxcbiAgICAgICAgdXNlcl9pbnN0cnVjdGlvbnM6ICAgIHVzZXJJbnN0cnVjdGlvbnMsXG4gICAgICAgIHByZXZpb3VzX3N1Z2dlc3Rpb25zOiBfcmV3cml0ZVN1Z2dlc3Rpb25IaXN0b3J5LFxuICAgICAgfSlcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoIXJlcy5vaykgdGhyb3cgbmV3IEVycm9yKGRhdGEuZXJyb3IgfHwgJ1Jld3JpdGUgZmFpbGVkJyk7XG5cbiAgICBjb25zdCByZXdyaXR0ZW4gPSBkYXRhLnJld3JpdHRlbiB8fCAnJztcbiAgICBfbGFzdFJld3JpdGVMb2dJZCA9IGRhdGEubG9nX2lkIHx8IG51bGw7XG4gICAgaWYgKHN1Z2dlc3Rpb25FbCkge1xuICAgICAgc3VnZ2VzdGlvbkVsLnN0eWxlLmNvbG9yID0gJyc7XG4gICAgICBzdWdnZXN0aW9uRWwuc3R5bGUuZm9udFN0eWxlID0gJyc7XG4gICAgICBzdWdnZXN0aW9uRWwudGV4dENvbnRlbnQgPSByZXdyaXR0ZW47XG4gICAgfVxuICAgIF91cGRhdGVSZXdyaXRlQWNjZXB0QnRuKHJld3JpdHRlbik7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChzdWdnZXN0aW9uRWwpIHsgc3VnZ2VzdGlvbkVsLnN0eWxlLmNvbG9yID0gJyNlZjQ0NDQnOyBzdWdnZXN0aW9uRWwuc3R5bGUuZm9udFN0eWxlID0gJyc7IHN1Z2dlc3Rpb25FbC50ZXh0Q29udGVudCA9IGBFcnJvcjogJHtlcnIubWVzc2FnZX1gOyB9XG4gICAgc2hvd1RvYXN0KGBBSSByZXdyaXRlIGZhaWxlZDogJHtlcnIubWVzc2FnZX1gLCAnZXJyb3InKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoZ2VuZXJhdGVCdG4pIHsgZ2VuZXJhdGVCdG4uZGlzYWJsZWQgPSBmYWxzZTsgZ2VuZXJhdGVCdG4udGV4dENvbnRlbnQgPSAnR2VuZXJhdGUnOyB9XG4gICAgaWYgKHJlamVjdEJ0bikgICB7IHJlamVjdEJ0bi5kaXNhYmxlZCA9IGZhbHNlOyB9XG4gIH1cbn1cblxuLyoqXG4gKiBTYXZlIGEgc2luZ2xlIGZpZWxkIG9mIGEgdG9wLWxldmVsIGFjaGlldmVtZW50IGluIHNlc3Npb24gc3RhdGUgYW5kIHVwZGF0ZSB0aGUgbG9jYWwgY2FjaGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNhdmVUb3BMZXZlbEFjaGlldmVtZW50RmllbGQoYWNoSWQsIGZpZWxkLCB2YWx1ZSkge1xuICBjb25zdCBhY2ggPSAod2luZG93Ll9hY2hpZXZlbWVudHNPcmRlcmVkIHx8IFtdKS5maW5kKGEgPT4gYS5pZCA9PT0gYWNoSWQpO1xuICBjb25zdCBwcmV2aW91cyA9IGFjaCA/IGFjaFtmaWVsZF0gOiB1bmRlZmluZWQ7XG4gIGlmIChhY2gpIGFjaFtmaWVsZF0gPSB2YWx1ZTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9yZXZpZXctYWNoaWV2ZW1lbnQnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBpZDogYWNoSWQsIGZpZWxkLCB2YWx1ZSB9KSxcbiAgICB9KTtcbiAgICBpZiAoIXJlcy5vaykgdGhyb3cgbmV3IEVycm9yKChhd2FpdCByZXMuanNvbigpKS5lcnJvciB8fCAnU2F2ZSBmYWlsZWQnKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gUm9sbCBiYWNrIHRoZSBvcHRpbWlzdGljIHVwZGF0ZVxuICAgIGlmIChhY2ggJiYgcHJldmlvdXMgIT09IHVuZGVmaW5lZCkgYWNoW2ZpZWxkXSA9IHByZXZpb3VzO1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZmllbGQgPT09ICd0aXRsZScgPyBgYWNoLXRpdGxlLSR7Q1NTLmVzY2FwZShhY2hJZCl9YCA6IGBhY2gtZGVzYy0ke0NTUy5lc2NhcGUoYWNoSWQpfWApO1xuICAgIGlmIChlbCkgZWwudmFsdWUgPSBwcmV2aW91cyA/PyAnJztcbiAgICBzaG93VG9hc3QoYEZhaWxlZCB0byBzYXZlIGFjaGlldmVtZW50OiAke2Vyci5tZXNzYWdlfWAsICdlcnJvcicpO1xuICB9XG59XG5cbi8qKlxuICogSGlkZSBhIHRvcC1sZXZlbCBhY2hpZXZlbWVudCBmb3IgdGhpcyBzZXNzaW9uIGFmdGVyIGNvbmZpcm1hdGlvbi5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGVsZXRlVG9wTGV2ZWxBY2hpZXZlbWVudChhY2hJZCkge1xuICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCBjb25maXJtRGlhbG9nKFxuICAgICdIaWRlIHRoaXMgYWNoaWV2ZW1lbnQgZm9yIHRoaXMgQ1Ygb25seT8gWW91IGNhbiByZXN0b3JlIGl0IGJ5IHN0YXJ0aW5nIG92ZXIgb3IgY2hhbmdpbmcgdGhlIHNlc3Npb24gc2VsZWN0aW9ucy4nLFxuICAgIHsgY29uZmlybUxhYmVsOiAnSGlkZScsIGNhbmNlbExhYmVsOiAnQ2FuY2VsJywgZGFuZ2VyOiB0cnVlIH0sXG4gICk7XG4gIGlmICghY29uZmlybWVkKSByZXR1cm47XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvcmV2aWV3LWFjaGlldmVtZW50Jywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgaWQ6IGFjaElkLCBhY3Rpb246ICdkZWxldGUnIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICB3aW5kb3cuX2FjaGlldmVtZW50c09yZGVyZWQgPSAod2luZG93Ll9hY2hpZXZlbWVudHNPcmRlcmVkIHx8IFtdKS5maWx0ZXIoYSA9PiBhLmlkICE9PSBhY2hJZCk7XG4gICAgICBkZWxldGUgd2luZG93LmFjaGlldmVtZW50RGVjaXNpb25zW2FjaElkXTtcbiAgICAgIF9yZW5kZXJBY2hpZXZlbWVudHNSZXZpZXdUYWJsZSgpO1xuICAgICAgc2hvd1RvYXN0KCdBY2hpZXZlbWVudCBoaWRkZW4gZm9yIHRoaXMgc2Vzc2lvbi4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2hvd1RvYXN0KGRhdGEuZXJyb3IgfHwgJ0RlbGV0ZSBmYWlsZWQuJywgJ2Vycm9yJyk7XG4gICAgfVxuICB9IGNhdGNoIChfKSB7XG4gICAgc2hvd1RvYXN0KCdGYWlsZWQgdG8gZGVsZXRlIGFjaGlldmVtZW50LicsICdlcnJvcicpO1xuICB9XG59XG5cbi8qKlxuICogU2F2ZSBhbiBlZGl0ZWQgZmllbGQgb24gYW4gQUktc3VnZ2VzdGVkIGFjaGlldmVtZW50IChpbi1tZW1vcnkgb25seTtcbiAqIHN1Z2dlc3Rpb25zIGFyZSBub3QgcGVyc2lzdGVkIHRvIHRoZSBzZXJ2ZXIgdW50aWwgYWNjZXB0ZWQpLlxuICovXG5mdW5jdGlvbiBzYXZlU3VnZ2VzdGVkQWNoaWV2ZW1lbnRGaWVsZChzdWdnSWQsIGZpZWxkLCB2YWx1ZSkge1xuICBjb25zdCBzdWdnID0gKHdpbmRvdy5fc3VnZ2VzdGVkQWNoc09yZGVyZWQgfHwgW10pLmZpbmQocyA9PiBzLl9zdWdnSWQgPT09IHN1Z2dJZCk7XG4gIGlmIChzdWdnKSBzdWdnW2ZpZWxkXSA9IHZhbHVlO1xufVxuXG4vKipcbiAqIE9wZW4gdGhlIEFJIHJld3JpdGUgbW9kYWwgZm9yIGEgc3VnZ2VzdGVkIGFjaGlldmVtZW50IGRlc2NyaXB0aW9uLlxuICovXG5hc3luYyBmdW5jdGlvbiBhaVJld3JpdGVTdWdnZXN0ZWRBY2hpZXZlbWVudChzdWdnSWQpIHtcbiAgY29uc3Qgc3VnZyA9ICh3aW5kb3cuX3N1Z2dlc3RlZEFjaHNPcmRlcmVkIHx8IFtdKS5maW5kKHMgPT4gcy5fc3VnZ0lkID09PSBzdWdnSWQpO1xuICBpZiAoIXN1Z2cpIHJldHVybjtcbiAgY29uc3Qgb3JpZ2luYWxUZXh0ID0gc3VnZy5kZXNjcmlwdGlvbiB8fCAnJztcbiAgaWYgKCFvcmlnaW5hbFRleHQpIHsgc2hvd1RvYXN0KCdQbGVhc2UgZW50ZXIgYSBkZXNjcmlwdGlvbiBmaXJzdC4nLCAnZXJyb3InKTsgcmV0dXJuOyB9XG5cbiAgX3Jld3JpdGVTdWdnZXN0aW9uSGlzdG9yeSA9IFtdO1xuICBfbGFzdFJld3JpdGVMb2dJZCA9IG51bGw7XG4gIF9vcGVuUmV3cml0ZU1vZGFsKG9yaWdpbmFsVGV4dCwgJycsIG51bGwsIHtcbiAgICBleHBlcmllbmNlSW5kZXg6IG51bGwsXG4gICAgb25BY2NlcHQ6IGFzeW5jIChzdWdnZXN0aW9uKSA9PiB7XG4gICAgICBzYXZlU3VnZ2VzdGVkQWNoaWV2ZW1lbnRGaWVsZChzdWdnSWQsICdkZXNjcmlwdGlvbicsIHN1Z2dlc3Rpb24pO1xuICAgICAgY29uc3QgZGVzY0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYGFjaC1kZXNjLSR7c3VnZ0lkfWApO1xuICAgICAgaWYgKGRlc2NFbCkgZGVzY0VsLnZhbHVlID0gc3VnZ2VzdGlvbjtcbiAgICAgIF9yZWNvcmRSZXdyaXRlT3V0Y29tZSgnYWNjZXB0ZWQnLCBzdWdnZXN0aW9uKTtcbiAgICAgIHNob3dUb2FzdCgnQWNoaWV2ZW1lbnQgdXBkYXRlZC4nKTtcbiAgICB9LFxuICB9KTtcbiAgYXdhaXQgX3J1blJld3JpdGUob3JpZ2luYWxUZXh0KTtcbn1cblxuLyoqXG4gKiBNb3ZlIGEgc3VnZ2VzdGVkIGFjaGlldmVtZW50IHVwIG9yIGRvd24gd2l0aGluIHRoZSBkaXNwbGF5IG9yZGVyLlxuICogU3RhYmxlIElEcyBtZWFuIG5vIGRlY2lzaW9uIHJlbWFwcGluZyBpcyBuZWVkZWQuXG4gKi9cbmZ1bmN0aW9uIG1vdmVTdWdnZXN0ZWRBY2hpZXZlbWVudFJvdyhzdWdnSWQsIGRpcmVjdGlvbikge1xuICBjb25zdCBhcnIgPSB3aW5kb3cuX3N1Z2dlc3RlZEFjaHNPcmRlcmVkO1xuICBpZiAoIWFycikgcmV0dXJuO1xuICBjb25zdCBpZHggPSBhcnIuZmluZEluZGV4KHMgPT4gcy5fc3VnZ0lkID09PSBzdWdnSWQpO1xuICBpZiAoaWR4IDwgMCkgcmV0dXJuO1xuICBjb25zdCBuZXdJZHggPSBpZHggKyBkaXJlY3Rpb247XG4gIGlmIChuZXdJZHggPCAwIHx8IG5ld0lkeCA+PSBhcnIubGVuZ3RoKSByZXR1cm47XG4gIFthcnJbaWR4XSwgYXJyW25ld0lkeF1dID0gW2FycltuZXdJZHhdLCBhcnJbaWR4XV07XG4gIF9yZW5kZXJBY2hpZXZlbWVudHNSZXZpZXdUYWJsZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoaWV2ZW1lbnRzLXRhYmxlLWNvbnRhaW5lcicpKTtcbn1cblxuLyoqXG4gKiBSZW1vdmUgYSBzdWdnZXN0ZWQgYWNoaWV2ZW1lbnQgZnJvbSB0aGUgbGlzdCBhZnRlciBjb25maXJtYXRpb24uXG4gKiBTdGFibGUgSURzIG1lYW4gbm8gb3RoZXIgZGVjaXNpb24ga2V5cyBuZWVkIHJlbWFwcGluZy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGVsZXRlU3VnZ2VzdGVkQWNoaWV2ZW1lbnQoc3VnZ0lkKSB7XG4gIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IGNvbmZpcm1EaWFsb2coJ1JlbW92ZSB0aGlzIEFJIHN1Z2dlc3Rpb24/JywgeyBjb25maXJtTGFiZWw6ICdSZW1vdmUnLCBkYW5nZXI6IHRydWUgfSk7XG4gIGlmICghY29uZmlybWVkKSByZXR1cm47XG4gIHdpbmRvdy5fc3VnZ2VzdGVkQWNoc09yZGVyZWQgPSAod2luZG93Ll9zdWdnZXN0ZWRBY2hzT3JkZXJlZCB8fCBbXSkuZmlsdGVyKHMgPT4gcy5fc3VnZ0lkICE9PSBzdWdnSWQpO1xuICBkZWxldGUgd2luZG93LmFjaGlldmVtZW50RGVjaXNpb25zW3N1Z2dJZF07XG4gIF9yZW5kZXJBY2hpZXZlbWVudHNSZXZpZXdUYWJsZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoaWV2ZW1lbnRzLXRhYmxlLWNvbnRhaW5lcicpKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZUFjaGlldmVtZW50RWRpdHNBbmRDb250aW51ZSgpIHtcbiAgdHJ5IHtcbiAgICAvLyBGbHVzaCBhbnkgY3VycmVudGx5LWZvY3VzZWQgdGV4dGFyZWFzXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2lkXj1cImFjaC10ZXh0LVwiXScpLmZvckVhY2godGEgPT4ge1xuICAgICAgY29uc3QgcGFydHMgPSB0YS5pZC5zcGxpdCgnLScpO1xuICAgICAgaWYgKHBhcnRzLmxlbmd0aCA+PSA0KSB7XG4gICAgICAgIGNvbnN0IGV4cElkeCA9IHBhcnNlSW50KHBhcnRzWzJdKTtcbiAgICAgICAgY29uc3QgYWNoSWR4ID0gcGFyc2VJbnQocGFydHNbM10pO1xuICAgICAgICBpZiAoIWlzTmFOKGV4cElkeCkgJiYgIWlzTmFOKGFjaElkeCkgJiYgd2luZG93LmFjaGlldmVtZW50RWRpdHNbZXhwSWR4XSkge1xuICAgICAgICAgIHVwZGF0ZUFjaGlldmVtZW50VGV4dChleHBJZHgsIGFjaElkeCwgdGEudmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9zYXZlLWFjaGlldmVtZW50LWVkaXRzJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgZWRpdHM6IHdpbmRvdy5hY2hpZXZlbWVudEVkaXRzIH0pXG4gICAgfSk7XG4gICAgaWYgKCFyZXMub2spIHtcbiAgICAgIGNvbnN0IGVyciA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBzaG93VG9hc3QoYEVycm9yIHNhdmluZzogJHtlcnIuZXJyb3IgfHwgJ1Vua25vd24gZXJyb3InfWAsICdlcnJvcicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzdGF0ZU1hbmFnZXIubWFya0NvbnRlbnRDaGFuZ2VkKCk7XG4gICAgc2hvd1RvYXN0KCdBY2hpZXZlbWVudCBlZGl0cyBzYXZlZC4nKTtcbiAgICBzd2l0Y2hUYWIoJ3NraWxscy1yZXZpZXcnKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dUb2FzdCgnRmFpbGVkIHRvIHNhdmUgYWNoaWV2ZW1lbnQgZWRpdHMuJywgJ2Vycm9yJyk7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgZmV0Y2hKc29uV2l0aFRpbWVvdXQsXG4gIF9hY2hWZXJiV2FybmluZyxcbiAgX2FjaFNuYXBzaG90S2V5LFxuICBfc2F2ZUFjaFNuYXBzaG90LFxuICBfZ2V0QWNoU25hcHNob3QsXG4gIGJ1aWxkQWNoaWV2ZW1lbnRzUmV2aWV3VGFibGUsXG4gIF9yZW5kZXJBY2hpZXZlbWVudHNSZXZpZXdUYWJsZSxcbiAgYnVsa0FjaGlldmVtZW50QWN0aW9uLFxuICBoYW5kbGVBY2hpZXZlbWVudEFjdGlvbixcbiAgc3VibWl0QWNoaWV2ZW1lbnREZWNpc2lvbnMsXG4gIG1vdmVBY2hpZXZlbWVudFJvdyxcbiAgYnVpbGRBY2hpZXZlbWVudHNFZGl0b3IsXG4gIHJlbmRlckFjaGlldmVtZW50RWRpdG9yUm93cyxcbiAgdXBkYXRlQWNoaWV2ZW1lbnRUZXh0LFxuICB0b2dnbGVBY2hpZXZlbWVudEhpZGRlbixcbiAgbW92ZUFjaGlldmVtZW50LFxuICBkZWxldGVBY2hpZXZlbWVudCxcbiAgYWRkQWNoaWV2ZW1lbnRSb3csXG4gIHJld3JpdGVBY2hpZXZlbWVudFdpdGhMTE0sXG4gIGFpUmV3cml0ZVRvcExldmVsQWNoaWV2ZW1lbnQsXG4gIF9vcGVuUmV3cml0ZU1vZGFsLFxuICBfdXBkYXRlUmV3cml0ZUFjY2VwdEJ0bixcbiAgX3JlY29yZFJld3JpdGVPdXRjb21lLFxuICBfcnVuUmV3cml0ZSxcbiAgc2F2ZVRvcExldmVsQWNoaWV2ZW1lbnRGaWVsZCxcbiAgZGVsZXRlVG9wTGV2ZWxBY2hpZXZlbWVudCxcbiAgc2F2ZVN1Z2dlc3RlZEFjaGlldmVtZW50RmllbGQsXG4gIGFpUmV3cml0ZVN1Z2dlc3RlZEFjaGlldmVtZW50LFxuICBtb3ZlU3VnZ2VzdGVkQWNoaWV2ZW1lbnRSb3csXG4gIGRlbGV0ZVN1Z2dlc3RlZEFjaGlldmVtZW50LFxuICBzYXZlQWNoaWV2ZW1lbnRFZGl0c0FuZENvbnRpbnVlLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL3RhZ2xpbmUtcmV2aWV3LmpzXG4gKiBBcHBsaWNhbnQgdGFnbGluZSAoaGVhZGxpbmUpIHJldmlldzogZGlzcGxheSBBSS1wcm9wb3NlZCB0YWdsaW5lLFxuICogYWxsb3cgZWRpdGluZywgcmVxdWlyZSBleHBsaWNpdCB1c2VyIGNvbmZpcm1hdGlvbiBiZWZvcmUgY29udGludWluZy5cbiAqXG4gKiBUaGUgdGFnbGluZSBpcyB0aGUgb25lLWxpbmUgcHJvZmVzc2lvbmFsIGlkZW50aXR5IHNob3duIHVuZGVyIHRoZVxuICogYXBwbGljYW50J3MgbmFtZSBvbiB0aGUgQ1YuICBJdCBpcyBOT1QgdGhlIHNhbWUgYXMgdGhlIGpvYiB0aXRsZSBcdTIwMTRcbiAqIGl0IGRlc2NyaWJlcyB0aGUgYXBwbGljYW50IChlLmcuIFwiU2VuaW9yIERhdGEgU2NpZW50aXN0IHNwZWNpYWxpc2luZ1xuICogaW4gYmlvc3RhdGlzdGljcyBhbmQgTUxcIiksIG5vdCB0aGUgcm9sZSBiZWluZyBhcHBsaWVkIGZvci5cbiAqXG4gKiBVc2VyIE1VU1QgY2xpY2sgXCJDb25maXJtIFRhZ2xpbmVcIiBiZWZvcmUgZ2VuZXJhdGlvbiBpcyBhbGxvd2VkLlxuICogVGhlIGNvbmZpcm1lZCB0ZXh0IGlzIHN0b3JlZCB2aWEgUE9TVCAvYXBpL3Jldmlldy1kZWNpc2lvbnMgKHR5cGU6ICd0YWdsaW5lJykuXG4gKlxuICogRGVwZW5kZW5jaWVzIChyZXNvbHZlZCB0aHJvdWdoIGdsb2JhbFRoaXMgYXQgcnVudGltZSk6XG4gKiAgIGVzY2FwZUh0bWwsIHNob3dUb2FzdCwgc3dpdGNoVGFiLCBzdGF0ZU1hbmFnZXJcbiAqL1xuXG5pbXBvcnQgeyBzdGF0ZU1hbmFnZXIgfSBmcm9tICcuL3N0YXRlLW1hbmFnZXIuanMnO1xuXG4vLyBcdTI1MDBcdTI1MDAgQnVpbGQgdGFnbGluZS1yZXZpZXcgc2VjdGlvbiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLyoqXG4gKiBkdWNrZmxvdzpcbiAqICAgaWQ6IHRhZ2xpbmVfdWlfYnVpbGRcbiAqICAga2luZDogdWlcbiAqICAgdGltZXN0YW1wOiBcIjIwMjYtMDUtMjhUMDA6MDA6MDBaXCJcbiAqICAgc3RhdHVzOiBsaXZlXG4gKiAgIGhhbmRsZXM6IFtcInVpOnRhZ2xpbmUtcmV2aWV3LmJ1aWxkXCJdXG4gKiAgIHJlYWRzOlxuICogICAgIC0gXCJ3aW5kb3c6cGVuZGluZ1JlY29tbWVuZGF0aW9uc1wiXG4gKiAgICAgLSBcInJlc3BvbnNlOkdFVCAvYXBpL3N0YXR1cy50YWdsaW5lX292ZXJyaWRlXCJcbiAqICAgICAtIFwicmVzcG9uc2U6R0VUIC9hcGkvc3RhdHVzLmRlY2lzaW9uc19jb25maXJtZWRcIlxuICogICB3cml0ZXM6IFtcImRvbTojdGFnbGluZS1yZXZpZXctY29udGFpbmVyXCJdXG4gKiAgIG5vdGVzOiBcIlJlbmRlcnMgcHJvcG9zZWQgdGFnbGluZSAoZnJvbSBMTE0gY3VzdG9taXphdGlvbnMpIHdpdGggYW4gZWRpdGFibGUgaW5wdXQgYW5kIGNvbmZpcm0gYnV0dG9uLlwiXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkVGFnbGluZVJldmlld1NlY3Rpb24oKSB7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWdsaW5lLXJldmlldy1jb250YWluZXInKTtcbiAgaWYgKCFjb250YWluZXIpIHJldHVybjtcblxuICAvLyBGZXRjaCBjdXJyZW50IHN0YXR1cyB0byBnZXQgdGFnbGluZV9vdmVycmlkZSArIHByb3Bvc2VkIHRhZ2xpbmVcbiAgbGV0IHByb3Bvc2VkVGFnbGluZSAgPSAnJztcbiAgbGV0IGNvbmZpcm1lZFRhZ2xpbmUgPSAnJztcbiAgbGV0IGFscmVhZHlDb25maXJtZWQgPSBmYWxzZTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgICA9IGF3YWl0IGZldGNoKCcvYXBpL3N0YXR1cycpO1xuICAgIGNvbnN0IHN0YXR1cyA9IHJlcy5vayA/IGF3YWl0IHJlcy5qc29uKCkgOiB7fTtcblxuICAgIC8vIHRhZ2xpbmVfb3ZlcnJpZGUgaXMgdGhlIHVzZXItY29uZmlybWVkIHZhbHVlIChtYXkgYmUgbnVsbClcbiAgICBjb25maXJtZWRUYWdsaW5lID0gc3RhdHVzLnRhZ2xpbmVfb3ZlcnJpZGUgfHwgJyc7XG4gICAgYWxyZWFkeUNvbmZpcm1lZCA9ICEhKHN0YXR1cy5kZWNpc2lvbnNfY29uZmlybWVkICYmIHN0YXR1cy5kZWNpc2lvbnNfY29uZmlybWVkLnRhZ2xpbmUpO1xuXG4gICAgLy8gUHJvcG9zZWQgdGFnbGluZSBmcm9tIHRoZSBMTE0gcmVjb21tZW5kYXRpb25zXG4gICAgY29uc3QgY3VzdG9taXphdGlvbnMgPSBzdGF0dXMuY3VzdG9taXphdGlvbnMgfHwge307XG4gICAgcHJvcG9zZWRUYWdsaW5lID0gY3VzdG9taXphdGlvbnMuYXBwbGljYW50X3RhZ2xpbmUgfHwgJyc7XG4gIH0gY2F0Y2ggKF9lKSB7XG4gICAgLy8gTmV0d29yayBmYWlsdXJlIFx1MjAxNCBsZWF2ZSBmaWVsZHMgZW1wdHksIHVzZXIgY2FuIHN0aWxsIHR5cGUgbWFudWFsbHlcbiAgfVxuXG4gIGNvbnN0IGluaXRpYWwgICA9IGNvbmZpcm1lZFRhZ2xpbmUgfHwgcHJvcG9zZWRUYWdsaW5lO1xuICBjb25zdCBzdGF0dXNNc2cgPSBhbHJlYWR5Q29uZmlybWVkXG4gICAgPyAnPHNwYW4gc3R5bGU9XCJjb2xvcjojMDY1ZjQ2O2ZvbnQtd2VpZ2h0OjYwMDtcIj5cdTI3MTMgQ29uZmlybWVkPC9zcGFuPidcbiAgICA6ICc8c3BhbiBzdHlsZT1cImNvbG9yOiM5MjQwMGU7XCI+UmVxdWlyZXMgeW91ciBjb25maXJtYXRpb24gYmVmb3JlIGdlbmVyYXRpbmc8L3NwYW4+JztcblxuICBjb250YWluZXIuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE2cHg7XCI+XG4gICAgICA8cCBzdHlsZT1cImNvbG9yOiMzNzQxNTE7Zm9udC1zaXplOjAuOTVlbTtsaW5lLWhlaWdodDoxLjY7bWFyZ2luOjAgMCA4cHg7XCI+XG4gICAgICAgIFRoZSA8c3Ryb25nPnRhZ2xpbmU8L3N0cm9uZz4gYXBwZWFycyBkaXJlY3RseSB1bmRlciB5b3VyIG5hbWUgb24gdGhlIENWLlxuICAgICAgICBJdCBzaG91bGQgZGVzY3JpYmUgPGVtPndobyB5b3UgYXJlPC9lbT4gYXMgYSBwcm9mZXNzaW9uYWwgXHUyMDE0IG5vdCB0aGUgam9iIHRpdGxlIHlvdSBhcmUgYXBwbHlpbmcgZm9yLlxuICAgICAgPC9wPlxuICAgICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO2ZvbnQtc2l6ZTowLjg1ZW07bWFyZ2luOjA7XCI+XG4gICAgICAgIEV4YW1wbGU6IDxlbT5cIlNlbmlvciBEYXRhIFNjaWVudGlzdCBzcGVjaWFsaXNpbmcgaW4gYmlvc3RhdGlzdGljcyBhbmQgbWFjaGluZSBsZWFybmluZ1wiPC9lbT5cbiAgICAgIDwvcD5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgc3R5bGU9XCJib3JkZXI6MXB4IHNvbGlkICNkMWZhZTU7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzoxNnB4O21hcmdpbi1ib3R0b206MjBweDtiYWNrZ3JvdW5kOiNmMGZkZjQ7XCI+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6OHB4O21hcmdpbi1ib3R0b206MTBweDtcIj5cbiAgICAgICAgPHN0cm9uZyBzdHlsZT1cImNvbG9yOiMwNjVmNDY7XCI+QXBwbGljYW50IFRhZ2xpbmU8L3N0cm9uZz5cbiAgICAgICAgPHNwYW4gaWQ9XCJ0YWdsaW5lLWNvbmZpcm0tc3RhdHVzXCIgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO1wiPiR7c3RhdHVzTXNnfTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8bGFiZWwgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjojMzc0MTUxO2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWJvdHRvbTo0cHg7XCJcbiAgICAgICAgICAgICBmb3I9XCJ0YWdsaW5lLWlucHV0XCI+XG4gICAgICAgIEVkaXQgdGFnbGluZSAocmVxdWlyZWQpOlxuICAgICAgPC9sYWJlbD5cbiAgICAgIDxpbnB1dCBpZD1cInRhZ2xpbmUtaW5wdXRcIiB0eXBlPVwidGV4dFwiXG4gICAgICAgIHZhbHVlPVwiJHtlc2NhcGVIdG1sKGluaXRpYWwpfVwiXG4gICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBTZW5pb3IgRGF0YSBTY2llbnRpc3Qgc3BlY2lhbGlzaW5nIGluIGJpb3N0YXRpc3RpY3MgYW5kIE1MXCJcbiAgICAgICAgc3R5bGU9XCJ3aWR0aDoxMDAlO2JveC1zaXppbmc6Ym9yZGVyLWJveDtwYWRkaW5nOjhweCAxMHB4O2JvcmRlcjoxcHggc29saWQgI2QxZDVkYjtib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6MC45NWVtO1wiXG4gICAgICAgIG9uaW5wdXQ9XCJvblRhZ2xpbmVJbnB1dENoYW5nZSgpXCIgLz5cblxuICAgICAgJHtwcm9wb3NlZFRhZ2xpbmUgJiYgcHJvcG9zZWRUYWdsaW5lICE9PSBjb25maXJtZWRUYWdsaW5lID8gYFxuICAgICAgPHAgc3R5bGU9XCJtYXJnaW46NnB4IDAgMDtmb250LXNpemU6MC44ZW07Y29sb3I6IzZiNzI4MDtcIj5cbiAgICAgICAgQUkgcHJvcG9zZWQ6IDxlbT4ke2VzY2FwZUh0bWwocHJvcG9zZWRUYWdsaW5lKX08L2VtPlxuICAgICAgICA8YnV0dG9uIG9uY2xpY2s9XCJyZXNldFRhZ2xpbmVUb1Byb3Bvc2VkKClcIiBzdHlsZT1cImJhY2tncm91bmQ6bm9uZTtib3JkZXI6bm9uZTtjdXJzb3I6cG9pbnRlcjtjb2xvcjojMjU2M2ViO2ZvbnQtc2l6ZTowLjhlbTtwYWRkaW5nOjAgNHB4O3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7XCI+VXNlIHRoaXM8L2J1dHRvbj5cbiAgICAgIDwvcD5gIDogJyd9XG5cbiAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOjEycHg7XCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJ0YWdsaW5lLWNvbmZpcm0tYnRuXCIgY2xhc3M9XCJzdWJtaXQtYnRuXCIgc3R5bGU9XCJmb250LXNpemU6MC45ZW07cGFkZGluZzo4cHggMjBweDtiYWNrZ3JvdW5kOiMxMGI5ODE7XCJcbiAgICAgICAgICBvbmNsaWNrPVwiY29uZmlybVRhZ2xpbmUoKVwiPlxuICAgICAgICAgIFx1MjcxMyBDb25maXJtIFRhZ2xpbmVcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgICR7YWxyZWFkeUNvbmZpcm1lZCA/ICc8c3BhbiBpZD1cInRhZ2xpbmUtY29uZmlybWVkLWJhZGdlXCIgc3R5bGU9XCJtYXJnaW4tbGVmdDoxMHB4O2ZvbnQtc2l6ZTowLjg1ZW07Y29sb3I6IzA2NWY0NjtcIj5TYXZlZCBcdTI3MTM8L3NwYW4+JyA6ICc8c3BhbiBpZD1cInRhZ2xpbmUtY29uZmlybWVkLWJhZGdlXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7bWFyZ2luLWxlZnQ6MTBweDtmb250LXNpemU6MC44NWVtO2NvbG9yOiMwNjVmNDY7XCI+U2F2ZWQgXHUyNzEzPC9zcGFuPid9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJuYXYtYnV0dG9uc1wiIHN0eWxlPVwibWFyZ2luLXRvcDoxNnB4O1wiPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImJhY2stYnRuXCIgb25jbGljaz1cInN3aXRjaFRhYignYWNoaWV2ZW1lbnRzLXJldmlldycpXCI+XHUyMTkwIEJhY2sgdG8gQWNoaWV2ZW1lbnRzPC9idXR0b24+XG4gICAgICA8YnV0dG9uIGlkPVwidGFnbGluZS1jb250aW51ZS1idG5cIiBjbGFzcz1cImNvbnRpbnVlLWJ0blwiXG4gICAgICAgIHN0eWxlPVwiJHthbHJlYWR5Q29uZmlybWVkID8gJycgOiAnb3BhY2l0eTowLjU7Y3Vyc29yOm5vdC1hbGxvd2VkOyd9XCJcbiAgICAgICAgb25jbGljaz1cInRhZ2xpbmVDb250aW51ZSgpXCJcbiAgICAgICAgJHthbHJlYWR5Q29uZmlybWVkID8gJycgOiAndGl0bGU9XCJQbGVhc2UgY29uZmlybSB0aGUgdGFnbGluZSBiZWZvcmUgY29udGludWluZ1wiJ30+XG4gICAgICAgIENvbnRpbnVlIHRvIFN1bW1hcnkgXHUyMTkyXG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5gO1xuXG4gIC8vIEV4cG9zZSBwcm9wb3NlZCB0YWdsaW5lIGZvciB0aGUgcmVzZXQgYnV0dG9uXG4gIHdpbmRvdy5fcHJvcG9zZWRUYWdsaW5lID0gcHJvcG9zZWRUYWdsaW5lO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgSW5wdXQgY2hhbmdlIGhhbmRsZXIgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIG9uVGFnbGluZUlucHV0Q2hhbmdlKCkge1xuICAvLyBXaGVuIHVzZXIgZWRpdHMgdGhlIHRleHQsIHVuLWNvbmZpcm0gdGhlIHByZXZpb3VzIHNhdmUgc28gdGhleSBtdXN0IHJlLWNvbmZpcm1cbiAgY29uc3QgYmFkZ2UgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWdsaW5lLWNvbmZpcm1lZC1iYWRnZScpO1xuICBjb25zdCBzdGF0dXNTcGFuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhZ2xpbmUtY29uZmlybS1zdGF0dXMnKTtcbiAgaWYgKGJhZGdlKSAgICAgIGJhZGdlLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIGlmIChzdGF0dXNTcGFuKSBzdGF0dXNTcGFuLmlubmVySFRNTCA9ICc8c3BhbiBzdHlsZT1cImNvbG9yOiM5MjQwMGU7XCI+UmVxdWlyZXMgeW91ciBjb25maXJtYXRpb24gYmVmb3JlIGdlbmVyYXRpbmc8L3NwYW4+JztcbiAgY29uc3QgY29udGludWVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFnbGluZS1jb250aW51ZS1idG4nKTtcbiAgaWYgKGNvbnRpbnVlQnRuKSB7XG4gICAgY29udGludWVCdG4uc3R5bGUub3BhY2l0eSAgICAgICA9ICcwLjUnO1xuICAgIGNvbnRpbnVlQnRuLnN0eWxlLmN1cnNvciAgICAgICAgPSAnbm90LWFsbG93ZWQnO1xuICAgIGNvbnRpbnVlQnRuLnRpdGxlICAgICAgICAgICAgICAgPSAnUGxlYXNlIGNvbmZpcm0gdGhlIHRhZ2xpbmUgYmVmb3JlIGNvbnRpbnVpbmcnO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBSZXNldCB0byBBSS1wcm9wb3NlZCB0YWdsaW5lIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiByZXNldFRhZ2xpbmVUb1Byb3Bvc2VkKCkge1xuICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWdsaW5lLWlucHV0Jyk7XG4gIGlmIChpbnB1dCAmJiB3aW5kb3cuX3Byb3Bvc2VkVGFnbGluZSkge1xuICAgIGlucHV0LnZhbHVlID0gd2luZG93Ll9wcm9wb3NlZFRhZ2xpbmU7XG4gICAgb25UYWdsaW5lSW5wdXRDaGFuZ2UoKTtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgQ29uZmlybSBhbmQgcGVyc2lzdCB0YWdsaW5lIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4vKipcbiAqIGR1Y2tmbG93OlxuICogICBpZDogdGFnbGluZV91aV9jb25maXJtXG4gKiAgIGtpbmQ6IHVpXG4gKiAgIHRpbWVzdGFtcDogXCIyMDI2LTA1LTI4VDAwOjAwOjAwWlwiXG4gKiAgIHN0YXR1czogbGl2ZVxuICogICBoYW5kbGVzOiBbXCJ1aTp0YWdsaW5lLXJldmlldy5jb25maXJtXCJdXG4gKiAgIGNhbGxzOiBbXCJQT1NUIC9hcGkvcmV2aWV3LWRlY2lzaW9uc1wiXVxuICogICByZWFkczogW1wiZG9tOiN0YWdsaW5lLWlucHV0XCJdXG4gKiAgIHdyaXRlczpcbiAqICAgICAtIFwicmVxdWVzdDpQT1NUIC9hcGkvcmV2aWV3LWRlY2lzaW9ucy50eXBlPXRhZ2xpbmVcIlxuICogICAgIC0gXCJyZXF1ZXN0OlBPU1QgL2FwaS9yZXZpZXctZGVjaXNpb25zLmRlY2lzaW9uc1wiXG4gKiAgIG5vdGVzOiBcIlBPU1RzIHRoZSBjb25maXJtZWQgdGFnbGluZSB0ZXh0OyBlbmFibGVzIHRoZSBjb250aW51ZSBidXR0b24gb24gc3VjY2Vzcy5cIlxuICovXG5hc3luYyBmdW5jdGlvbiBjb25maXJtVGFnbGluZSgpIHtcbiAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFnbGluZS1pbnB1dCcpO1xuICBpZiAoIWlucHV0KSByZXR1cm47XG5cbiAgY29uc3QgdGFnbGluZVRleHQgPSBpbnB1dC52YWx1ZS50cmltKCk7XG4gIGlmICghdGFnbGluZVRleHQpIHtcbiAgICBzaG93VG9hc3QoJ1BsZWFzZSBlbnRlciBhIHRhZ2xpbmUgYmVmb3JlIGNvbmZpcm1pbmcuJywgJ2Vycm9yJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhZ2xpbmUtY29uZmlybS1idG4nKTtcbiAgaWYgKGJ0bikgYnRuLmRpc2FibGVkID0gdHJ1ZTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvcmV2aWV3LWRlY2lzaW9ucycsIHtcbiAgICAgIG1ldGhvZDogICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogICAgSlNPTi5zdHJpbmdpZnkoeyB0eXBlOiAndGFnbGluZScsIGRlY2lzaW9uczogdGFnbGluZVRleHQgfSksXG4gICAgfSk7XG5cbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICBjb25zdCBlcnIgPSBhd2FpdCByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSk7XG4gICAgICBzaG93VG9hc3QoYEZhaWxlZCB0byBzYXZlIHRhZ2xpbmU6ICR7ZXJyLmVycm9yIHx8IHJlc3BvbnNlLnN0YXR1c1RleHR9YCwgJ2Vycm9yJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIFVJIHRvIHNob3cgY29uZmlybWVkIHN0YXRlXG4gICAgY29uc3QgYmFkZ2UgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWdsaW5lLWNvbmZpcm1lZC1iYWRnZScpO1xuICAgIGNvbnN0IHN0YXR1c1NwYW4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFnbGluZS1jb25maXJtLXN0YXR1cycpO1xuICAgIGlmIChiYWRnZSkgICAgICB7IGJhZGdlLnN0eWxlLmRpc3BsYXkgPSAnJzsgfVxuICAgIGlmIChzdGF0dXNTcGFuKSB7IHN0YXR1c1NwYW4uaW5uZXJIVE1MID0gJzxzcGFuIHN0eWxlPVwiY29sb3I6IzA2NWY0Njtmb250LXdlaWdodDo2MDA7XCI+XHUyNzEzIENvbmZpcm1lZDwvc3Bhbj4nOyB9XG5cbiAgICBjb25zdCBjb250aW51ZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWdsaW5lLWNvbnRpbnVlLWJ0bicpO1xuICAgIGlmIChjb250aW51ZUJ0bikge1xuICAgICAgY29udGludWVCdG4uc3R5bGUub3BhY2l0eSA9ICcnO1xuICAgICAgY29udGludWVCdG4uc3R5bGUuY3Vyc29yICA9ICcnO1xuICAgICAgY29udGludWVCdG4udGl0bGUgICAgICAgICA9ICcnO1xuICAgIH1cblxuICAgIHN0YXRlTWFuYWdlci5tYXJrQ29udGVudENoYW5nZWQoKTtcbiAgICBzaG93VG9hc3QoJ1RhZ2xpbmUgY29uZmlybWVkLicpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgc2hvd1RvYXN0KCdOZXR3b3JrIGVycm9yIHNhdmluZyB0YWdsaW5lLicsICdlcnJvcicpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChidG4pIGJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBDb250aW51ZSBuYXZpZ2F0aW9uIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiB0YWdsaW5lQ29udGludWUoKSB7XG4gIC8vIEd1YXJkOiBtdXN0IGJlIGNvbmZpcm1lZCBiZWZvcmUgcHJvY2VlZGluZ1xuICBjb25zdCBjb250aW51ZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWdsaW5lLWNvbnRpbnVlLWJ0bicpO1xuICBpZiAoY29udGludWVCdG4gJiYgY29udGludWVCdG4uc3R5bGUuY3Vyc29yID09PSAnbm90LWFsbG93ZWQnKSB7XG4gICAgc2hvd1RvYXN0KCdQbGVhc2UgY29uZmlybSB0aGUgdGFnbGluZSBiZWZvcmUgY29udGludWluZy4nLCAnZXJyb3InKTtcbiAgICByZXR1cm47XG4gIH1cbiAgc3dpdGNoVGFiKCdzdW1tYXJ5LXJldmlldycpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgRXhwb3J0cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZXhwb3J0IHtcbiAgYnVpbGRUYWdsaW5lUmV2aWV3U2VjdGlvbixcbiAgb25UYWdsaW5lSW5wdXRDaGFuZ2UsXG4gIHJlc2V0VGFnbGluZVRvUHJvcG9zZWQsXG4gIGNvbmZpcm1UYWdsaW5lLFxuICB0YWdsaW5lQ29udGludWUsXG59O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvc3VtbWFyeS1yZXZpZXcuanNcbiAqIFN1bW1hcnktZm9jdXMgc2VsZWN0aW9uOiBBSSBnZW5lcmF0aW9uLCBzdG9yZWQgdmFyaWFudHMsIHN1Ym1pdCBkZWNpc2lvbi5cbiAqXG4gKiBEZXBlbmRlbmNpZXMgKHJlc29sdmVkIHRocm91Z2ggZ2xvYmFsVGhpcyBhdCBydW50aW1lKTpcbiAqICAgcGVuZGluZ1JlY29tbWVuZGF0aW9ucywgc2VsZWN0ZWRTdW1tYXJ5S2V5LCBfYWlHZW5lcmF0ZWRTdW1tYXJ5LFxuICogICBlc2NhcGVIdG1sLCBzaG93VG9hc3QsIHN3aXRjaFRhYiwgc2V0TG9hZGluZywgc2NoZWR1bGVBdHNSZWZyZXNoXG4gKi9cblxuaW1wb3J0IHsgc3RhdGVNYW5hZ2VyIH0gZnJvbSAnLi9zdGF0ZS1tYW5hZ2VyLmpzJztcblxuLy8gXHUyNTAwXHUyNTAwIEJ1aWxkIHN1bW1hcnktZm9jdXMgc2VjdGlvbiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLyoqXG4gKiBkdWNrZmxvdzpcbiAqICAgaWQ6IHN1bW1hcnlfdWlfYnVpbGRcbiAqICAga2luZDogdWlcbiAqICAgdGltZXN0YW1wOiBcIjIwMjYtMDMtMjdUMDE6MjM6MjhaXCJcbiAqICAgc3RhdHVzOiBzaGFyZWRcbiAqICAgaGFuZGxlczogW1widWk6c3VtbWFyeS1yZXZpZXcuYnVpbGRcIl1cbiAqICAgY2FsbHM6IFtcIkdFVCAvYXBpL21hc3Rlci1maWVsZHNcIiwgXCJHRVQgL2FwaS9zdGF0dXNcIiwgXCJ1aTpzdW1tYXJ5LXJldmlldy5nZW5lcmF0ZVwiXVxuICogICByZWFkczpcbiAqICAgICAtIFwid2luZG93OnBlbmRpbmdSZWNvbW1lbmRhdGlvbnNcIlxuICogICAgIC0gXCJyZXNwb25zZTpHRVQgL2FwaS9tYXN0ZXItZmllbGRzLnByb2Zlc3Npb25hbF9zdW1tYXJpZXNcIlxuICogICAgIC0gXCJyZXNwb25zZTpHRVQgL2FwaS9zdGF0dXMucHJvZmVzc2lvbmFsX3N1bW1hcmllc1wiXG4gKiAgICAgLSBcInN0YXRlOnNlc3Npb25fc3VtbWFyaWVzLmFpX2dlbmVyYXRlZFwiXG4gKiAgIHdyaXRlczogW1wiZG9tOiNzdW1tYXJ5LWZvY3VzLWNvbnRhaW5lclwiLCBcIndpbmRvdzpzZWxlY3RlZFN1bW1hcnlLZXlcIl1cbiAqICAgbm90ZXM6IFwiQnVpbGRzIHRoZSBzdW1tYXJ5IHJldmlldyBVSSBmcm9tIG1hc3RlciB2YXJpYW50cyBwbHVzIHNlc3Npb24gb3ZlcnJpZGVzIGFuZCBzZWVkcyB0aGUgc2VsZWN0ZWQga2V5LlwiXG4gKi9cblxuYXN5bmMgZnVuY3Rpb24gYnVpbGRTdW1tYXJ5Rm9jdXNTZWN0aW9uKCkge1xuICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3VtbWFyeS1mb2N1cy1jb250YWluZXInKTtcbiAgaWYgKCFjb250YWluZXIpIHJldHVybjtcblxuICBjb25zdCBkYXRhID0gd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnM7XG5cbiAgLy8gXHUyNTAwXHUyNTAwIExvYWQgYWxsIGtub3duIHN1bW1hcmllcyAobWFzdGVyIGJhc2UgKyBzZXNzaW9uIG92ZXJyaWRlcykgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIC8vIEZldGNoIG1hc3RlciBmaWVsZHMgYW5kIHN0YXR1cyBpbiBwYXJhbGxlbDsgc2Vzc2lvbiBzdW1tYXJpZXMgb3ZlcndyaXRlIG1hc3RlciB2YXJpYW50cy5cbiAgbGV0IHByb2Zlc3Npb25hbFN1bW1hcmllcyA9IHt9O1xuICBjb25zdCBbbWZSZXN1bHQsIHN0YXR1c1Jlc3VsdF0gPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoW1xuICAgIGZldGNoKCcvYXBpL21hc3Rlci1maWVsZHMnKS50aGVuKHIgPT4gci5qc29uKCkpLFxuICAgIGZldGNoKCcvYXBpL3N0YXR1cycpLnRoZW4ociA9PiByLmpzb24oKSksXG4gIF0pO1xuICBpZiAobWZSZXN1bHQuc3RhdHVzID09PSAnZnVsZmlsbGVkJyAmJiBtZlJlc3VsdC52YWx1ZSAmJiBtZlJlc3VsdC52YWx1ZS5vaykge1xuICAgIE9iamVjdC5hc3NpZ24ocHJvZmVzc2lvbmFsU3VtbWFyaWVzLCBtZlJlc3VsdC52YWx1ZS5wcm9mZXNzaW9uYWxfc3VtbWFyaWVzIHx8IHt9KTtcbiAgfVxuICBpZiAoc3RhdHVzUmVzdWx0LnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcgJiYgc3RhdHVzUmVzdWx0LnZhbHVlKSB7XG4gICAgLy8gU2Vzc2lvbiBzdW1tYXJpZXMgKGUuZy4gYWlfZ2VuZXJhdGVkKSBvdmVyd3JpdGUgbWFzdGVyIHZhcmlhbnRzXG4gICAgT2JqZWN0LmFzc2lnbihwcm9mZXNzaW9uYWxTdW1tYXJpZXMsIHN0YXR1c1Jlc3VsdC52YWx1ZS5wcm9mZXNzaW9uYWxfc3VtbWFyaWVzIHx8IHt9KTtcbiAgfVxuXG4gIC8vIFx1MjUwMFx1MjUwMCBTdWdnZXN0ZWQgY29udGVudCByZW9yZGVyaW5nIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICBjb25zdCByZW9yZGVyaW5nVGV4dCA9IChkYXRhICYmIGRhdGEuc3VnZ2VzdGVkX2NvbnRlbnRfcmVvcmRlcmluZykgfHwgJyc7XG4gIGNvbnN0IHJlb3JkZXJpbmdIVE1MID0gcmVvcmRlcmluZ1RleHRcbiAgICA/IGA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZWZmNmZmO2JvcmRlcjoxcHggc29saWQgI2JmZGJmZTtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjEycHg7bWFyZ2luLWJvdHRvbToxNnB4O1wiPlxuICAgICAgICA8c3Ryb25nIHN0eWxlPVwiY29sb3I6IzFlNDBhZjtcIj5cdUQ4M0RcdURDQ0IgU3VnZ2VzdGVkIENvbnRlbnQgT3JkZXI6PC9zdHJvbmc+XG4gICAgICAgIDxwIHN0eWxlPVwibWFyZ2luOjZweCAwIDA7Y29sb3I6IzFlM2E4YTtmb250LXNpemU6MC45ZW07d2hpdGUtc3BhY2U6cHJlLWxpbmU7XCI+JHtlc2NhcGVIdG1sKHJlb3JkZXJpbmdUZXh0KX08L3A+XG4gICAgICAgPC9kaXY+YFxuICAgIDogJyc7XG5cbiAgLy8gXHUyNTAwXHUyNTAwIFJlbmRlciBza2VsZXRvbiB3aGlsZSB3ZSBnZW5lcmF0ZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgY29udGFpbmVyLmlubmVySFRNTCA9IGBcbiAgICAke3Jlb3JkZXJpbmdIVE1MfVxuICAgIDxkaXYgaWQ9XCJhaS1zdW1tYXJ5LXBhbmVsXCIgc3R5bGU9XCJib3JkZXI6MXB4IHNvbGlkICNkMWZhZTU7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzoxNnB4O21hcmdpbi1ib3R0b206MjBweDtiYWNrZ3JvdW5kOiNmMGZkZjQ7XCI+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6OHB4O21hcmdpbi1ib3R0b206MTBweDtcIj5cbiAgICAgICAgPHN0cm9uZyBzdHlsZT1cImNvbG9yOiMwNjVmNDY7XCI+XHVEODNFXHVERDE2IEFJLVByb3Bvc2VkIFN1bW1hcnk8L3N0cm9uZz5cbiAgICAgICAgPHNwYW4gaWQ9XCJhaS1zdW1tYXJ5LXN0YXR1c1wiIHN0eWxlPVwiZm9udC1zaXplOjAuOGVtO2NvbG9yOiM2YjcyODA7XCI+R2VuZXJhdGluZ1x1MjAyNjwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBpZD1cImFpLXN1bW1hcnktbG9hZGluZ1wiIHN0eWxlPVwiZm9udC1zaXplOjAuOWVtO2NvbG9yOiM5Y2EzYWY7bWluLWhlaWdodDo0MHB4O1wiPjxlbT5HZW5lcmF0aW5nIGEgdGFpbG9yZWQgc3VtbWFyeSBmb3IgdGhpcyBhcHBsaWNhdGlvblx1MjAyNjwvZW0+PC9kaXY+XG4gICAgICA8dGV4dGFyZWEgaWQ9XCJhaS1zdW1tYXJ5LXRleHRcIiByb3dzPVwiN1wiIG9uaW5wdXQ9XCJvblN1bW1hcnlUZXh0Q2hhbmdlKClcIlxuICAgICAgICBwbGFjZWhvbGRlcj1cIkdlbmVyYXRpbmdcdTIwMjZcIlxuICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Ym94LXNpemluZzpib3JkZXItYm94O3BhZGRpbmc6OHB4O2JvcmRlcjoxcHggc29saWQgI2QxZDVkYjtib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6MC45ZW07bGluZS1oZWlnaHQ6MS42O3Jlc2l6ZTp2ZXJ0aWNhbDtkaXNwbGF5Om5vbmU7XCI+PC90ZXh0YXJlYT5cbiAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOjEycHg7XCI+XG4gICAgICAgIDxsYWJlbCBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOiMzNzQxNTE7ZGlzcGxheTpibG9jazttYXJnaW4tYm90dG9tOjRweDtcIj5SZXF1ZXN0IGNoYW5nZXMgKG9wdGlvbmFsKTo8L2xhYmVsPlxuICAgICAgICA8dGV4dGFyZWEgaWQ9XCJzdW1tYXJ5LXJlZmluZW1lbnQtaW5wdXRcIiByb3dzPVwiMlwiXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuICdNYWtlIGl0IG1vcmUgY29uY2lzZScsICdFbXBoYXNpc2UgbXkgbGVhZGVyc2hpcCBleHBlcmllbmNlJywgJ1VzZSBhIG1vcmUgZm9ybWFsIHRvbmUnXHUyMDI2XCJcbiAgICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Ym94LXNpemluZzpib3JkZXItYm94O3BhZGRpbmc6OHB4O2JvcmRlcjoxcHggc29saWQgI2QxZDVkYjtib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6MC44NWVtO3Jlc2l6ZTp2ZXJ0aWNhbDtcIj48L3RleHRhcmVhPlxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDo4cHg7ZGlzcGxheTpmbGV4O2dhcDo4cHg7ZmxleC13cmFwOndyYXA7XCI+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImFpLXJlZ2VuZXJhdGUtYnRuXCIgY2xhc3M9XCJzdWJtaXQtYnRuXCIgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO3BhZGRpbmc6NnB4IDE0cHg7XCJcbiAgICAgICAgICAgIG9uY2xpY2s9XCJyZWdlbmVyYXRlQUlTdW1tYXJ5KClcIj5SZWdlbmVyYXRlPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInN1Ym1pdC1idG5cIiBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07cGFkZGluZzo2cHggMTRweDtiYWNrZ3JvdW5kOiMxMGI5ODE7XCJcbiAgICAgICAgICAgIG9uY2xpY2s9XCJ1c2VBSVN1bW1hcnkoKVwiPlVzZSBUaGlzIFN1bW1hcnk8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGlkPVwic3VtbWFyeS1zdG9yZWQtc2VjdGlvblwiPlxuICAgICAgPGRldGFpbHMgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjhweDtcIj5cbiAgICAgICAgPHN1bW1hcnkgc3R5bGU9XCJjdXJzb3I6cG9pbnRlcjtmb250LXNpemU6MC44NWVtO2NvbG9yOiM2YjcyODA7dXNlci1zZWxlY3Q6bm9uZTtcIj5cbiAgICAgICAgICBVc2UgYSBzdG9yZWQgc3VtbWFyeSB2YXJpYW50IGluc3RlYWRcbiAgICAgICAgPC9zdW1tYXJ5PlxuICAgICAgICA8ZGl2IGlkPVwic3VtbWFyeS1yYWRpb3NcIiBzdHlsZT1cIm1hcmdpbi10b3A6MTBweDtcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6OHB4O1wiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzdWJtaXQtYnRuXCIgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO3BhZGRpbmc6NnB4IDE0cHg7XCJcbiAgICAgICAgICAgIG9uY2xpY2s9XCJzdWJtaXRTdW1tYXJ5Rm9jdXNEZWNpc2lvbigpXCI+VXNlIFNlbGVjdGVkIFN0b3JlZCBTdW1tYXJ5PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kZXRhaWxzPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJuYXYtYnV0dG9uc1wiIHN0eWxlPVwibWFyZ2luLXRvcDoxNnB4O1wiPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImJhY2stYnRuXCIgb25jbGljaz1cInN3aXRjaFRhYigndGFnbGluZS1yZXZpZXcnKVwiPlx1MjE5MCBCYWNrIHRvIFRhZ2xpbmU8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJjb250aW51ZS1idG5cIiBvbmNsaWNrPVwic3VibWl0U3VtbWFyeUZvY3VzRGVjaXNpb24oKVwiPkNvbnRpbnVlIHRvIFB1YmxpY2F0aW9ucyBcdTIxOTI8L2J1dHRvbj5cbiAgICA8L2Rpdj5gO1xuXG4gIC8vIFJlbmRlciBzdG9yZWQgc3VtbWFyaWVzIGluIHRoZSBjb2xsYXBzaWJsZSBzZWN0aW9uXG4gIF9yZW5kZXJTdG9yZWRTdW1tYXJ5UmFkaW9zKHByb2Zlc3Npb25hbFN1bW1hcmllcyk7XG5cbiAgLy8gXHUyNTAwXHUyNTAwIEF1dG8tZ2VuZXJhdGUgb3IgbG9hZCBjYWNoZWQgQUkgc3VtbWFyeSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgY29uc3QgY2FjaGVkU3VtbWFyeSA9IHByb2Zlc3Npb25hbFN1bW1hcmllc1snYWlfZ2VuZXJhdGVkJ10gfHwgJyc7XG4gIGlmIChjYWNoZWRTdW1tYXJ5KSB7XG4gICAgX3Nob3dBSVN1bW1hcnkoY2FjaGVkU3VtbWFyeSwgJyhjYWNoZWQgXHUyMDE0IGNsaWNrIFJlZ2VuZXJhdGUgdG8gcmVmcmVzaCknKTtcbiAgICB3aW5kb3cuc2VsZWN0ZWRTdW1tYXJ5S2V5ID0gJ2FpX2dlbmVyYXRlZCc7XG4gICAgYXdhaXQgc2F2ZVN1bW1hcnlGb2N1c1RvQmFja2VuZCgnYWlfZ2VuZXJhdGVkJyk7XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgX2NhbGxHZW5lcmF0ZVN1bW1hcnkobnVsbCwgbnVsbCk7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIFJlbmRlciBzdG9yZWQgc3VtbWFyeSByYWRpbyBidXR0b25zIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBfcmVuZGVyU3RvcmVkU3VtbWFyeVJhZGlvcyhwcm9mZXNzaW9uYWxTdW1tYXJpZXMpIHtcbiAgY29uc3QgcmFkaW9zQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1bW1hcnktcmFkaW9zJyk7XG4gIGlmICghcmFkaW9zQ29udGFpbmVyKSByZXR1cm47XG4gIGNvbnN0IG1hc3RlcktleXMgPSBPYmplY3Qua2V5cyhwcm9mZXNzaW9uYWxTdW1tYXJpZXMpLmZpbHRlcihrID0+IGsgIT09ICdhaV9nZW5lcmF0ZWQnKTtcbiAgaWYgKG1hc3RlcktleXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmFkaW9zQ29udGFpbmVyLmlubmVySFRNTCA9ICc8cCBzdHlsZT1cImNvbG9yOiM5Y2EzYWY7Zm9udC1zaXplOjAuODVlbTtcIj5ObyBzdG9yZWQgc3VtbWFyaWVzIGF2YWlsYWJsZS48L3A+JztcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgY3VycmVudEtleSA9IHdpbmRvdy5zZWxlY3RlZFN1bW1hcnlLZXkgfHwgJyc7XG4gIHJhZGlvc0NvbnRhaW5lci5pbm5lckhUTUwgPSBtYXN0ZXJLZXlzLm1hcChrZXkgPT4ge1xuICAgIGNvbnN0IHByZXZpZXcgPSAocHJvZmVzc2lvbmFsU3VtbWFyaWVzW2tleV0gfHwgJycpLnNsaWNlKDAsIDIwMCk7XG4gICAgY29uc3QgbGFiZWwgPSBrZXkucmVwbGFjZSgvXy9nLCAnICcpLnJlcGxhY2UoL1xcYlxcdy9nLCBjID0+IGMudG9VcHBlckNhc2UoKSk7XG4gICAgY29uc3QgY2hlY2tlZCA9IGtleSA9PT0gY3VycmVudEtleSA/ICdjaGVja2VkJyA6ICcnO1xuICAgIHJldHVybiBgXG4gICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2JvcmRlcjoxcHggc29saWQgI2U1ZTdlYjtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjEycHg7bWFyZ2luLWJvdHRvbTo4cHg7Y3Vyc29yOnBvaW50ZXI7JHtjaGVja2VkID8gJ2JvcmRlci1jb2xvcjojMTBiOTgxO2JhY2tncm91bmQ6I2YwZmRmNDsnIDogJyd9XCI+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwic3VtbWFyeV9rZXlcIiB2YWx1ZT1cIiR7ZXNjYXBlSHRtbChrZXkpfVwiICR7Y2hlY2tlZH1cbiAgICAgICAgICBvbmNoYW5nZT1cInNlbGVjdFN1bW1hcnlLZXkoJyR7ZXNjYXBlSHRtbChrZXkpfScpXCIgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6OHB4O1wiPlxuICAgICAgICA8c3Ryb25nPiR7ZXNjYXBlSHRtbChsYWJlbCl9PC9zdHJvbmc+IDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjAuNzVlbTtwYWRkaW5nOjFweCA2cHg7Ym9yZGVyLXJhZGl1czo5OTlweDtiYWNrZ3JvdW5kOiNlZmY2ZmY7Y29sb3I6IzFkNGVkODtib3JkZXI6MXB4IHNvbGlkICNiZmRiZmU7Zm9udC13ZWlnaHQ6NjAwO1wiPlx1RDgzRFx1RENDNCBGcm9tIHlvdXIgTWFzdGVyIENWPC9zcGFuPlxuICAgICAgICA8cCBzdHlsZT1cIm1hcmdpbjo2cHggMCAwO2ZvbnQtc2l6ZTowLjg1ZW07Y29sb3I6IzZiNzI4MDtcIj4ke2VzY2FwZUh0bWwocHJldmlldyl9JHtwcmV2aWV3Lmxlbmd0aCA9PT0gMjAwID8gJ1x1MjAyNicgOiAnJ308L3A+XG4gICAgICA8L2xhYmVsPmA7XG4gIH0pLmpvaW4oJycpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgU2hvdyBBSS1nZW5lcmF0ZWQgc3VtbWFyeSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gX3Nob3dBSVN1bW1hcnkodGV4dCwgc3RhdHVzTGFiZWwpIHtcbiAgY29uc3QgdGV4dEVsICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FpLXN1bW1hcnktdGV4dCcpO1xuICBjb25zdCBsb2FkaW5nRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWktc3VtbWFyeS1sb2FkaW5nJyk7XG4gIGNvbnN0IHN0YXR1c0VsICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhaS1zdW1tYXJ5LXN0YXR1cycpO1xuICBpZiAodGV4dEVsKSB7XG4gICAgdGV4dEVsLnZhbHVlID0gdGV4dDtcbiAgICB0ZXh0RWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuICB9XG4gIGlmIChsb2FkaW5nRWwpIGxvYWRpbmdFbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBpZiAoc3RhdHVzRWwpICBzdGF0dXNFbC50ZXh0Q29udGVudCA9IHN0YXR1c0xhYmVsIHx8ICcnO1xuICB3aW5kb3cuX2FpR2VuZXJhdGVkU3VtbWFyeSA9IHRleHQ7XG4gIF91cGRhdGVTdW1tYXJ5U3BlY2lmaWNpdHlCYWRnZSh0ZXh0KTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFN1bW1hcnkgc3BlY2lmaWNpdHkgdmFsaWRhdG9yIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBfY2hlY2tTdW1tYXJ5U3BlY2lmaWNpdHkodGV4dCkge1xuICBpZiAoIXRleHQgfHwgIXRleHQudHJpbSgpKSByZXR1cm4gW107XG4gIGNvbnN0IHdhcm5pbmdzID0gW107XG4gIC8vIENoZWNrIDE6IHF1YW50aWZpZWQgY2xhaW0gKG51bWJlciwgcGVyY2VudGFnZSwgb3IgeWVhciByYW5nZSlcbiAgY29uc3QgaGFzUXVhbnRpZmllZCA9IC9cXGJcXGRbXFxkLF0qXFxzKiglfHBlcmNlbnR8eXJzP3x5ZWFycz98bW9udGhzP3x4XFxifFxcK3xrXFxifG1cXGJ8XFwuXFxkKS9pLnRlc3QodGV4dCkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIC9cXGJcXGQrXFwrXFxzKih5ZWFycz98eXJzP3xtb250aHM/KS9pLnRlc3QodGV4dCk7XG4gIGlmICghaGFzUXVhbnRpZmllZCkge1xuICAgIHdhcm5pbmdzLnB1c2goJ05vIHF1YW50aWZpZWQgY2xhaW0gZGV0ZWN0ZWQgKGUuZy4gXCI1KyB5ZWFyc1wiLCBcIjMwJSByZWR1Y3Rpb25cIiwgXCIkMk1cIikuIEFkZGluZyBhIG51bWJlciBzdHJlbmd0aGVucyBjcmVkaWJpbGl0eS4nKTtcbiAgfVxuICAvLyBDaGVjayAyOiB0YXJnZXQgcm9sZSBrZXl3b3JkIHByZXNlbnRcbiAgY29uc3QgYW5hbHlzaXMgPSB3aW5kb3cuX2xhc3RBbmFseXNpc0RhdGEgfHxcbiAgICAod2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnMgJiYgd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnMuam9iX2FuYWx5c2lzKSB8fCB7fTtcbiAgY29uc3Qgcm9sZVRpdGxlID0gKGFuYWx5c2lzLnRpdGxlIHx8IGFuYWx5c2lzLmpvYl90aXRsZSB8fCAnJykudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gIGlmIChyb2xlVGl0bGUgJiYgcm9sZVRpdGxlLmxlbmd0aCA+IDMpIHtcbiAgICBjb25zdCByb2xlUGFydHMgPSByb2xlVGl0bGUuc3BsaXQoL1tcXHMvLF0rLykuZmlsdGVyKHcgPT4gdy5sZW5ndGggPiAzKTtcbiAgICBjb25zdCBpblRleHQgPSByb2xlUGFydHMuc29tZShwYXJ0ID0+IHRleHQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhwYXJ0KSk7XG4gICAgaWYgKCFpblRleHQpIHtcbiAgICAgIHdhcm5pbmdzLnB1c2goYFRhcmdldCByb2xlIChcIiR7ZXNjYXBlSHRtbChyb2xlVGl0bGUpfVwiKSBub3QgbWVudGlvbmVkIFx1MjAxNCBjb25zaWRlciBlY2hvaW5nIHRoZSByb2xlIG9yIGEgc3lub255bS5gKTtcbiAgICB9XG4gIH1cbiAgLy8gQ2hlY2sgMzogZmFsbGJhY2sgZ2VuZXJpYyBwbGFjZWhvbGRlclxuICBjb25zdCBnZW5lcmljUGhyYXNlcyA9IFsnZXhwZXJpZW5jZWQgcHJvZmVzc2lvbmFsJywgJ3RyYWNrIHJlY29yZCBvZiBzdWNjZXNzJywgJ3NlZWtpbmcgYSBjaGFsbGVuZ2luZyddO1xuICBmb3IgKGNvbnN0IHBocmFzZSBvZiBnZW5lcmljUGhyYXNlcykge1xuICAgIGlmICh0ZXh0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocGhyYXNlKSkge1xuICAgICAgd2FybmluZ3MucHVzaChgR2VuZXJpYyBwbGFjZWhvbGRlciBwaHJhc2UgZGV0ZWN0ZWQgKFwiJHtwaHJhc2V9XCIpIFx1MjAxNCByZXBsYWNlIHdpdGggc3BlY2lmaWMgYWNoaWV2ZW1lbnRzLmApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gd2FybmluZ3M7XG59XG5cbmZ1bmN0aW9uIF91cGRhdGVTdW1tYXJ5U3BlY2lmaWNpdHlCYWRnZSh0ZXh0KSB7XG4gIGxldCBiYWRnZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdW1tYXJ5LXNwZWNpZmljaXR5LWJhZGdlJyk7XG4gIGlmICghYmFkZ2UpIHtcbiAgICBjb25zdCB0ZXh0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWktc3VtbWFyeS10ZXh0Jyk7XG4gICAgaWYgKCF0ZXh0RWwgfHwgIXRleHRFbC5wYXJlbnROb2RlKSByZXR1cm47XG4gICAgYmFkZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBiYWRnZS5pZCA9ICdzdW1tYXJ5LXNwZWNpZmljaXR5LWJhZGdlJztcbiAgICBiYWRnZS5zdHlsZS5jc3NUZXh0ID0gJ21hcmdpbi10b3A6NnB4O2ZvbnQtc2l6ZTowLjgyZW07JztcbiAgICB0ZXh0RWwucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYmFkZ2UsIHRleHRFbC5uZXh0U2libGluZyk7XG4gIH1cbiAgY29uc3Qgd2FybmluZ3MgPSBfY2hlY2tTdW1tYXJ5U3BlY2lmaWNpdHkodGV4dCk7XG4gIGlmICh3YXJuaW5ncy5sZW5ndGggPT09IDApIHtcbiAgICBiYWRnZS5pbm5lckhUTUwgPSAnPHNwYW4gc3R5bGU9XCJjb2xvcjojMTBiOTgxO1wiPlx1MjcxMyBTdW1tYXJ5IGhhcyBzcGVjaWZpYywgcXVhbnRpZmllZCBjb250ZW50Ljwvc3Bhbj4nO1xuICB9IGVsc2Uge1xuICAgIGJhZGdlLmlubmVySFRNTCA9IHdhcm5pbmdzLm1hcCh3ID0+XG4gICAgICBgPGRpdiBzdHlsZT1cImNvbG9yOiNiNDUzMDk7bWFyZ2luLXRvcDoycHg7XCI+XHUyNkEwICR7d308L2Rpdj5gXG4gICAgKS5qb2luKCcnKTtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgQ2FsbCBnZW5lcmF0ZS1zdW1tYXJ5IEFQSSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLyoqXG4gKiBkdWNrZmxvdzpcbiAqICAgaWQ6IHN1bW1hcnlfdWlfZ2VuZXJhdGVcbiAqICAga2luZDogdWlcbiAqICAgdGltZXN0YW1wOiBcIjIwMjYtMDMtMjdUMDE6MjM6MjhaXCJcbiAqICAgc3RhdHVzOiBzaGFyZWRcbiAqICAgaGFuZGxlczogW1widWk6c3VtbWFyeS1yZXZpZXcuZ2VuZXJhdGVcIl1cbiAqICAgY2FsbHM6IFtcIlBPU1QgL2FwaS9nZW5lcmF0ZS1zdW1tYXJ5XCIsIFwidWk6c3VtbWFyeS1yZXZpZXcucGVyc2lzdFwiXVxuICogICByZWFkczogW1wicmVzcG9uc2U6UE9TVCAvYXBpL2dlbmVyYXRlLXN1bW1hcnkuc3VtbWFyeVwiLCBcIndpbmRvdzpfYWlHZW5lcmF0ZWRTdW1tYXJ5XCJdXG4gKiAgIHdyaXRlczogW1wiZG9tOiNhaS1zdW1tYXJ5LXRleHRcIiwgXCJkb206I2FpLXN1bW1hcnktc3RhdHVzXCIsIFwid2luZG93Ol9haUdlbmVyYXRlZFN1bW1hcnlcIiwgXCJ3aW5kb3c6c2VsZWN0ZWRTdW1tYXJ5S2V5XCJdXG4gKiAgIG5vdGVzOiBcIlJlcXVlc3RzIGEgZ2VuZXJhdGVkIG9yIHJlZmluZWQgc3VtbWFyeSwgdXBkYXRlcyB0aGUgbG9jYWwgVUksIGFuZCBwZXJzaXN0cyB0aGUgc2VsZWN0ZWQgc3VtbWFyeSBrZXkuXCJcbiAqL1xuXG5hc3luYyBmdW5jdGlvbiBfY2FsbEdlbmVyYXRlU3VtbWFyeShyZWZpbmVtZW50UHJvbXB0LCBwcmV2aW91c1N1bW1hcnkpIHtcbiAgY29uc3QgYnRuICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWktcmVnZW5lcmF0ZS1idG4nKTtcbiAgY29uc3Qgc3RhdHVzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWktc3VtbWFyeS1zdGF0dXMnKTtcbiAgY29uc3QgdGV4dEVsICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWktc3VtbWFyeS10ZXh0Jyk7XG4gIGNvbnN0IGxvYWRpbmdFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhaS1zdW1tYXJ5LWxvYWRpbmcnKTtcbiAgaWYgKGJ0bikgICAgICBidG4uZGlzYWJsZWQgPSB0cnVlO1xuICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJ0dlbmVyYXRpbmdcdTIwMjYnO1xuICAvLyBTaG93IGxvYWRpbmcgaW5kaWNhdG9yOyBoaWRlIHRoZSB0ZXh0YXJlYSB3aGlsZSBnZW5lcmF0aW5nLlxuICBpZiAobG9hZGluZ0VsKSB7IGxvYWRpbmdFbC5pbm5lckhUTUwgPSAnPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjEwcHg7Y29sb3I6IzZiNzI4MDtwYWRkaW5nOjhweCAwO1wiPjxkaXYgY2xhc3M9XCJsb2FkaW5nLXNwaW5uZXJcIiBzdHlsZT1cIndpZHRoOjIwcHg7aGVpZ2h0OjIwcHg7Ym9yZGVyLXdpZHRoOjJweDtcIj48L2Rpdj48ZW0+R2VuZXJhdGluZyBhIHRhaWxvcmVkIHN1bW1hcnlcdTIwMjY8L2VtPjwvZGl2Pic7IGxvYWRpbmdFbC5zdHlsZS5kaXNwbGF5ID0gJyc7IH1cbiAgaWYgKHRleHRFbCkgICB0ZXh0RWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAvLyBVc2UgdGhlIGdsb2JhbCBMTE0gc3RhdHVzIGJhciBmb3IgdmlzaWJpbGl0eVxuICBzZXRMb2FkaW5nKHRydWUsICdHZW5lcmF0aW5nIHN1bW1hcnlcdTIwMjYnKTtcblxuICB0cnkge1xuICAgIGNvbnN0IGJvZHkgPSB7fTtcbiAgICBpZiAocmVmaW5lbWVudFByb21wdCkgYm9keS5yZWZpbmVtZW50X3Byb21wdCA9IHJlZmluZW1lbnRQcm9tcHQ7XG4gICAgaWYgKHByZXZpb3VzU3VtbWFyeSkgIGJvZHkucHJldmlvdXNfc3VtbWFyeSAgPSBwcmV2aW91c1N1bW1hcnk7XG5cbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvZ2VuZXJhdGUtc3VtbWFyeScsIHtcbiAgICAgIG1ldGhvZDogICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogICAgSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG5cbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgX3Nob3dBSVN1bW1hcnkoZGF0YS5zdW1tYXJ5LCAnXHUyNzEzIGdlbmVyYXRlZCcpO1xuICAgICAgd2luZG93LnNlbGVjdGVkU3VtbWFyeUtleSA9ICdhaV9nZW5lcmF0ZWQnO1xuICAgICAgYXdhaXQgc2F2ZVN1bW1hcnlGb2N1c1RvQmFja2VuZCgnYWlfZ2VuZXJhdGVkJyk7XG4gICAgICBzY2hlZHVsZUF0c1JlZnJlc2goJ3Jldmlld19jaGVja3BvaW50Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnXHUyNkEwIGVycm9yJztcbiAgICAgIGlmICh0ZXh0RWwpICAgdGV4dEVsLmlubmVySFRNTCA9IGA8c3BhbiBzdHlsZT1cImNvbG9yOiNlZjQ0NDQ7XCI+JHtlc2NhcGVIdG1sKGRhdGEuZXJyb3IgfHwgJ0dlbmVyYXRpb24gZmFpbGVkLicpfTwvc3Bhbj5gO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKHN0YXR1c0VsKSBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICdcdTI2QTAgbmV0d29yayBlcnJvcic7XG4gICAgaWYgKHRleHRFbCkgICB0ZXh0RWwuaW5uZXJIVE1MID0gJzxzcGFuIHN0eWxlPVwiY29sb3I6I2VmNDQ0NDtcIj5OZXR3b3JrIGVycm9yIFx1MjAxNCBwbGVhc2UgdHJ5IGFnYWluLjwvc3Bhbj4nO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChidG4pIGJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBSZWdlbmVyYXRlIC8gdXNlIEFJIHN1bW1hcnkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIHJlZ2VuZXJhdGVBSVN1bW1hcnkoKSB7XG4gIGNvbnN0IGlucHV0ICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3VtbWFyeS1yZWZpbmVtZW50LWlucHV0Jyk7XG4gIGNvbnN0IHByb21wdCAgPSBpbnB1dCA/IGlucHV0LnZhbHVlLnRyaW0oKSA6ICcnO1xuICBjb25zdCBjdXJyZW50ID0gd2luZG93Ll9haUdlbmVyYXRlZFN1bW1hcnkgfHwgJyc7XG4gIGF3YWl0IF9jYWxsR2VuZXJhdGVTdW1tYXJ5KHByb21wdCB8fCBudWxsLCBjdXJyZW50IHx8IG51bGwpO1xufVxuXG5hc3luYyBmdW5jdGlvbiB1c2VBSVN1bW1hcnkoKSB7XG4gIHdpbmRvdy5zZWxlY3RlZFN1bW1hcnlLZXkgPSAnYWlfZ2VuZXJhdGVkJztcbiAgY29uc3QgdGV4dEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FpLXN1bW1hcnktdGV4dCcpO1xuICBjb25zdCBjdXJyZW50VGV4dCA9IHRleHRFbCA/IHRleHRFbC52YWx1ZS50cmltKCkgOiAod2luZG93Ll9haUdlbmVyYXRlZFN1bW1hcnkgfHwgJycpO1xuICBhd2FpdCBzYXZlU3VtbWFyeUZvY3VzVG9CYWNrZW5kKCdhaV9nZW5lcmF0ZWQnLCBjdXJyZW50VGV4dCk7XG4gIHNjaGVkdWxlQXRzUmVmcmVzaCgncmV2aWV3X2NoZWNrcG9pbnQnKTtcbiAgc2hvd1RvYXN0KCdBSS1nZW5lcmF0ZWQgc3VtbWFyeSBzZWxlY3RlZCBmb3IgeW91ciBDVicpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgU2VsZWN0IHN0b3JlZCBzdW1tYXJ5IGtleSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gc2VsZWN0U3VtbWFyeUtleShrZXkpIHtcbiAgd2luZG93LnNlbGVjdGVkU3VtbWFyeUtleSA9IGtleTtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI3N1bW1hcnktcmFkaW9zIGxhYmVsJykuZm9yRWFjaChsYWJlbCA9PiB7XG4gICAgY29uc3QgcmFkaW8gPSBsYWJlbC5xdWVyeVNlbGVjdG9yKCdpbnB1dFt0eXBlPXJhZGlvXScpO1xuICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSByYWRpbyAmJiByYWRpby52YWx1ZSA9PT0ga2V5O1xuICAgIGxhYmVsLnN0eWxlLmJvcmRlckNvbG9yID0gaXNTZWxlY3RlZCA/ICcjMTBiOTgxJyA6ICcjZTVlN2ViJztcbiAgICBsYWJlbC5zdHlsZS5iYWNrZ3JvdW5kICA9IGlzU2VsZWN0ZWQgPyAnI2YwZmRmNCcgOiAnJztcbiAgfSk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBTYXZlIC8gc3VibWl0IFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4vKipcbiAqIGR1Y2tmbG93OlxuICogICBpZDogc3VtbWFyeV91aV9wZXJzaXN0XG4gKiAgIGtpbmQ6IHVpXG4gKiAgIHRpbWVzdGFtcDogXCIyMDI2LTAzLTI3VDAxOjIzOjI4WlwiXG4gKiAgIHN0YXR1czogc2hhcmVkXG4gKiAgIGhhbmRsZXM6IFtcInVpOnN1bW1hcnktcmV2aWV3LnBlcnNpc3RcIl1cbiAqICAgY2FsbHM6IFtcIlBPU1QgL2FwaS9yZXZpZXctZGVjaXNpb25zXCJdXG4gKiAgIHJlYWRzOiBbXCJ3aW5kb3c6c2VsZWN0ZWRTdW1tYXJ5S2V5XCJdXG4gKiAgIHdyaXRlczogW1wicmVxdWVzdDpQT1NUIC9hcGkvcmV2aWV3LWRlY2lzaW9ucy5zdW1tYXJ5X2ZvY3VzXCJdXG4gKiAgIG5vdGVzOiBcIlBlcnNpc3RzIG9ubHkgdGhlIHNlbGVjdGVkIHN1bW1hcnkga2V5IHNvIGJhY2tlbmQgc3RhdGUgY2FuIHJlc29sdmUgdGhlIGFjdGl2ZSBzdW1tYXJ5IHZhcmlhbnQgbGF0ZXIuXCJcbiAqL1xuXG4vLyBEZWJvdW5jZSB0aW1lciBmb3IgYXV0by1wZXJzaXN0aW5nIGVkaXRzIHRvIHRoZSBzdW1tYXJ5IHRleHQuXG5sZXQgX3N1bW1hcnlQZXJzaXN0VGltZXIgPSBudWxsO1xuXG5mdW5jdGlvbiBvblN1bW1hcnlUZXh0Q2hhbmdlKCkge1xuICBjb25zdCB0ZXh0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWktc3VtbWFyeS10ZXh0Jyk7XG4gIGlmICghdGV4dEVsKSByZXR1cm47XG4gIHdpbmRvdy5fYWlHZW5lcmF0ZWRTdW1tYXJ5ID0gdGV4dEVsLnZhbHVlO1xuICBfdXBkYXRlU3VtbWFyeVNwZWNpZmljaXR5QmFkZ2UodGV4dEVsLnZhbHVlKTtcbiAgY2xlYXJUaW1lb3V0KF9zdW1tYXJ5UGVyc2lzdFRpbWVyKTtcbiAgX3N1bW1hcnlQZXJzaXN0VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICBzYXZlU3VtbWFyeUZvY3VzVG9CYWNrZW5kKCdhaV9nZW5lcmF0ZWQnLCB0ZXh0RWwudmFsdWUudHJpbSgpKTtcbiAgfSwgNTAwKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZVN1bW1hcnlGb2N1c1RvQmFja2VuZChrZXksIHRleHQpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXlsb2FkID0geyB0eXBlOiAnc3VtbWFyeV9mb2N1cycsIGRlY2lzaW9uczoga2V5IH07XG4gICAgaWYgKHRleHQgIT09IHVuZGVmaW5lZCAmJiB0ZXh0ICE9PSBudWxsKSBwYXlsb2FkLnN1bW1hcnlfdGV4dCA9IHRleHQ7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9yZXZpZXctZGVjaXNpb25zJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLm9rO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN1Ym1pdFN1bW1hcnlGb2N1c0RlY2lzaW9uKCkge1xuICBjb25zdCBrZXkgPSB3aW5kb3cuc2VsZWN0ZWRTdW1tYXJ5S2V5O1xuICBpZiAoIWtleSkgcmV0dXJuO1xuICBjb25zdCBzYXZlZCA9IGF3YWl0IHNhdmVTdW1tYXJ5Rm9jdXNUb0JhY2tlbmQoa2V5KTtcbiAgaWYgKCFzYXZlZCkge1xuICAgIHNob3dUb2FzdCgnRmFpbGVkIHRvIHNhdmUgc3VtbWFyeSBzZWxlY3Rpb24uJywgJ2Vycm9yJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHN0YXRlTWFuYWdlci5tYXJrQ29udGVudENoYW5nZWQoKTtcbiAgc2NoZWR1bGVBdHNSZWZyZXNoKCdyZXZpZXdfY2hlY2twb2ludCcpO1xuICBzaG93VG9hc3QoYFN1bW1hcnkgc2VsZWN0aW9uIHNhdmVkOiBcIiR7a2V5LnJlcGxhY2UoL18vZywgJyAnKX1cImApO1xuICBzd2l0Y2hUYWIoJ3B1YmxpY2F0aW9ucy1yZXZpZXcnKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEV4cG9ydHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmV4cG9ydCB7XG4gIGJ1aWxkU3VtbWFyeUZvY3VzU2VjdGlvbixcbiAgX3JlbmRlclN0b3JlZFN1bW1hcnlSYWRpb3MsXG4gIF9zaG93QUlTdW1tYXJ5LFxuICBfY2FsbEdlbmVyYXRlU3VtbWFyeSxcbiAgcmVnZW5lcmF0ZUFJU3VtbWFyeSxcbiAgdXNlQUlTdW1tYXJ5LFxuICBvblN1bW1hcnlUZXh0Q2hhbmdlLFxuICBzZWxlY3RTdW1tYXJ5S2V5LFxuICBzYXZlU3VtbWFyeUZvY3VzVG9CYWNrZW5kLFxuICBfY2hlY2tTdW1tYXJ5U3BlY2lmaWNpdHksXG4gIF91cGRhdGVTdW1tYXJ5U3BlY2lmaWNpdHlCYWRnZSxcbiAgc3VibWl0U3VtbWFyeUZvY3VzRGVjaXNpb24sXG59O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvcHVibGljYXRpb25zLXJldmlldy5qc1xuICogUHVibGljYXRpb25zIHJldmlldyB0YWJsZTogZmV0Y2gsIHJlbmRlciwgdG9nZ2xlIGFjY2VwdC9yZWplY3QsIHN1Ym1pdCBkZWNpc2lvbnMuXG4gKlxuICogRGVwZW5kZW5jaWVzIChyZXNvbHZlZCB0aHJvdWdoIGdsb2JhbFRoaXMgYXQgcnVudGltZSk6XG4gKiAgIHB1YmxpY2F0aW9uRGVjaXNpb25zLCBfc2F2ZWREZWNpc2lvbnMsXG4gKiAgIGVzY2FwZUh0bWwsIHNob3dUb2FzdCwgZmV0Y2hBbmRSZXZpZXdSZXdyaXRlcywgQ1NTXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdwdWJsaWNhdGlvbnMtcmV2aWV3Jyk7XG5cbmltcG9ydCB7IHN0YXRlTWFuYWdlciB9IGZyb20gJy4vc3RhdGUtbWFuYWdlci5qcyc7XG5pbXBvcnQgeyBleWVTbGFzaEljb24gfSBmcm9tICcuL3Jldmlldy1pY29ucy5qcyc7XG5cbi8vIFRyYWNrIHB1YmxpY2F0aW9uIGFjY2VwdC9yZWplY3QgZGVjaXNpb25zOiBjaXRlX2tleSBcdTIxOTIgdHJ1ZSAoYWNjZXB0KSB8IGZhbHNlIChyZWplY3QpXG53aW5kb3cucHVibGljYXRpb25EZWNpc2lvbnMgPSB7fTtcbi8vIE9yZGVyZWQgbGlzdCBvZiBwdWJsaWNhdGlvbiBvYmplY3RzOyBtdXRhdGVkIGJ5IG1vdmVQdWJSb3coKVxud2luZG93Ll9wdWJsaWNhdGlvbnNPcmRlcmVkID0gW107XG5cbi8vIFx1MjUwMFx1MjUwMCBCdWlsZCBwdWJsaWNhdGlvbnMgcmV2aWV3IHRhYmxlIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBidWlsZFB1YmxpY2F0aW9uc1Jldmlld1RhYmxlKCkge1xuICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHVibGljYXRpb25zLXRhYmxlLWNvbnRhaW5lcicpO1xuICAvLyBJbiB0aGUgbmV3IHN1Yi10YWIgbGF5b3V0LCB3ZSB1c2UgdGhlIHBhbmUgd3JhcHBlciBpbnN0ZWFkIG9mIHRoZSBvbGQgc2VjdGlvblxuICBjb25zdCBzZWN0aW9uICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHVibGljYXRpb25zLXJldmlldy1zZWN0aW9uJykgfHxcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jldmlldy1wYW5lLXB1YmxpY2F0aW9ucycpO1xuICBjb25zdCBwdWJUYWJCdG4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucmV2aWV3LXN1YnRhYltkYXRhLXBhbmU9XCJwdWJsaWNhdGlvbnNcIl0nKTtcbiAgaWYgKCFjb250YWluZXIpIHJldHVybjtcblxuICBjb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDoxMnB4O3BhZGRpbmc6MjBweDtjb2xvcjojNmI3MjgwO1wiPjxkaXYgY2xhc3M9XCJsb2FkaW5nLXNwaW5uZXJcIiBzdHlsZT1cIndpZHRoOjIwcHg7aGVpZ2h0OjIwcHg7Ym9yZGVyLXdpZHRoOjJweDtmbGV4LXNocmluazowO1wiPjwvZGl2PjxzcGFuPkxvYWRpbmcgcHVibGljYXRpb24gcmVjb21tZW5kYXRpb25zXFx1MjAyNjwvc3Bhbj48L2Rpdj4nO1xuXG4gIGxldCByZWNvbW1lbmRhdGlvbnMgPSBbXTtcbiAgbGV0IHRvdGFsQ291bnQgPSAwO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9wdWJsaWNhdGlvbi1yZWNvbW1lbmRhdGlvbnMnKTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoIWRhdGEub2spIHsgY29udGFpbmVyLmlubmVySFRNTCA9IGA8cCBjbGFzcz1cImVycm9yLW1lc3NhZ2VcIj4ke2VzY2FwZUh0bWwoZGF0YS5lcnJvciB8fCAnRmFpbGVkIHRvIGxvYWQgcHVibGljYXRpb25zLicpfTwvcD5gOyByZXR1cm47IH1cbiAgICByZWNvbW1lbmRhdGlvbnMgPSBkYXRhLnJlY29tbWVuZGF0aW9ucyB8fCBbXTtcbiAgICB0b3RhbENvdW50ID0gZGF0YS50b3RhbF9jb3VudCB8fCByZWNvbW1lbmRhdGlvbnMubGVuZ3RoO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cuZXJyb3IoJ0Vycm9yIGZldGNoaW5nIHB1YmxpY2F0aW9uIHJlY29tbWVuZGF0aW9uczonLCBlcnIpO1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnPHAgc3R5bGU9XCJjb2xvcjogI2VmNDQ0NDsgcGFkZGluZzogMjBweDtcIj5GYWlsZWQgdG8gbG9hZCBwdWJsaWNhdGlvbiByZWNvbW1lbmRhdGlvbnMuPC9wPic7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHJlY29tbWVuZGF0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAvLyBObyBwdWJsaWNhdGlvbnMgXHUyMDE0IGhpZGUgdGhlIHBhbmUgYW5kIGRpc2FibGUgdGhlIHRhYiBidXR0b25cbiAgICBpZiAoc2VjdGlvbikgc2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGlmIChwdWJUYWJCdG4pIHB1YlRhYkJ0bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnPHAgc3R5bGU9XCJwYWRkaW5nOjIwcHg7Y29sb3I6IzZiNzI4MDtcIj5ObyBwdWJsaWNhdGlvbnMgZm91bmQuPC9wPic7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gU2hvdyBzZWN0aW9uIGFuZCB0YWIgYnV0dG9uXG4gIGlmIChwdWJUYWJCdG4pIHB1YlRhYkJ0bi5zdHlsZS5kaXNwbGF5ID0gJyc7XG5cbiAgLy8gVXBkYXRlIGhlYWRpbmcgY291bnQgKGhhbmRsZSBib3RoIHBhbmUgYXBwcm9hY2ggYW5kIGxlZ2FjeSBzZWN0aW9uIGFwcHJvYWNoKVxuICBjb25zdCBoZWFkaW5nID0gc2VjdGlvbiA/IHNlY3Rpb24ucXVlcnlTZWxlY3RvcignaDInKSA6IG51bGw7XG4gIGlmIChoZWFkaW5nKSB7XG4gICAgaGVhZGluZy50ZXh0Q29udGVudCA9IGBcdUQ4M0RcdURDQzQgU2VsZWN0ZWQgUHVibGljYXRpb25zYDtcbiAgfVxuXG4gIC8vIENvdW50IHJlY29tbWVuZGVkIHZzIHRvdGFsXG4gIGNvbnN0IHJlY29tbWVuZGVkQ291bnQgPSByZWNvbW1lbmRhdGlvbnMuZmlsdGVyKHAgPT4gcC5pc19yZWNvbW1lbmRlZCAhPT0gZmFsc2UpLmxlbmd0aDtcbiAgY29uc3QgY29udGV4dE5vdGUgPSBgPHN0cm9uZz4ke3JlY29tbWVuZGVkQ291bnR9PC9zdHJvbmc+IG9mIDxzdHJvbmc+JHt0b3RhbENvdW50fTwvc3Ryb25nPiBwdWJsaWNhdGlvbnMgcmVjb21tZW5kZWQgZm9yIHRoaXMgcm9sZS4gYCArXG4gICAgYFJlY29tbWVuZGVkIHB1YmxpY2F0aW9ucyAodG9wKSBhcmUgcHJlLXNlbGVjdGVkIGZvciBpbmNsdXNpb247IG90aGVycyAoYmVsb3cgdGhlIGRpdmlkZXIpIGFyZSBwcmUtZXhjbHVkZWQuIEFkanVzdCB1c2luZyB0aGUgdG9nZ2xlcy5gO1xuXG4gIC8vIEluaXRpYWxpc2UgZGVjaXNpb25zIFx1MjAxNCByZWNvbW1lbmRlZD1hY2NlcHQsIG5vdC1yZWNvbW1lbmRlZD1yZWplY3QgYnkgZGVmYXVsdFxuICB3aW5kb3cucHVibGljYXRpb25EZWNpc2lvbnMgPSB7fTtcbiAgcmVjb21tZW5kYXRpb25zLmZvckVhY2gocHViID0+IHtcbiAgICB3aW5kb3cucHVibGljYXRpb25EZWNpc2lvbnNbcHViLmNpdGVfa2V5XSA9IHB1Yi5pc19yZWNvbW1lbmRlZCAhPT0gZmFsc2U7XG4gIH0pO1xuICAvLyBBcHBseSBhbnkgcHJldmlvdXNseSBzYXZlZCB1c2VyIGRlY2lzaW9ucyBvdmVyIHRoZSBBUEkgZGVmYXVsdHNcbiAgY29uc3Qgc2F2ZWRQdWJEZWNzID0gd2luZG93Ll9zYXZlZERlY2lzaW9ucz8ucHVibGljYXRpb25fZGVjaXNpb25zIHx8IHt9O1xuICBpZiAoT2JqZWN0LmtleXMoc2F2ZWRQdWJEZWNzKS5sZW5ndGggPiAwKSBPYmplY3QuYXNzaWduKHdpbmRvdy5wdWJsaWNhdGlvbkRlY2lzaW9ucywgc2F2ZWRQdWJEZWNzKTtcblxuICAvLyBTZWVkIHRoZSBvcmRlcmVkIGxpc3QgZm9yIHJlb3JkZXIgY29udHJvbHNcbiAgd2luZG93Ll9wdWJsaWNhdGlvbnNPcmRlcmVkID0gWy4uLnJlY29tbWVuZGF0aW9uc107XG5cbiAgbGV0IHRhYmxlSFRNTCA9IGBcbiAgICA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7Zm9udC1zaXplOjAuOWVtO21hcmdpbi1ib3R0b206MTJweDtcIj4ke2NvbnRleHROb3RlfTwvcD5cbiAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTJweDtmbGV4LXdyYXA6d3JhcDttYXJnaW4tYm90dG9tOjEwcHg7XCI+XG4gICAgICA8bGFiZWwgc3R5bGU9XCJmb250LXNpemU6MC45ZW07Y29sb3I6IzM3NDE1MTtcIj5GaWx0ZXIgcHVibGljYXRpb25zOlxuICAgICAgICA8aW5wdXQgdHlwZT1cInNlYXJjaFwiIGlkPVwicHViLWZpbHRlci1pbnB1dFwiIHBsYWNlaG9sZGVyPVwiVHlwZSB0byBmaWx0ZXJcdTIwMjZcIlxuICAgICAgICAgIHN0eWxlPVwibWFyZ2luLWxlZnQ6OHB4O3BhZGRpbmc6NHB4IDhweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo0cHg7Zm9udC1zaXplOjAuOWVtO1wiXG4gICAgICAgICAgb25pbnB1dD1cImZpbHRlclB1YmxpY2F0aW9uc1RhYmxlKHRoaXMudmFsdWUpXCI+XG4gICAgICA8L2xhYmVsPlxuICAgICAgPHNwYW4gc3R5bGU9XCJtYXJnaW4tbGVmdDphdXRvO2Rpc3BsYXk6ZmxleDtnYXA6OHB4O2FsaWduLWl0ZW1zOmNlbnRlcjtcIj5cbiAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC44MmVtO2NvbG9yOiM2YjcyODA7XCI+QnVsazo8L3NwYW4+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHNlY29uZGFyeVwiIHN0eWxlPVwiZm9udC1zaXplOjAuOGVtO3BhZGRpbmc6NHB4IDEwcHg7XCJcbiAgICAgICAgICBvbmNsaWNrPVwiYnVsa1B1YkFjdGlvbigncmVjb21tZW5kZWQnKVwiIHRpdGxlPVwiQWNjZXB0IGFsbCByZWNvbW1lbmRlZCBhbmQgcmVqZWN0IHRoZSByZXN0XCI+QWNjZXB0IFJlY29tbWVuZGVkPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHNlY29uZGFyeVwiIHN0eWxlPVwiZm9udC1zaXplOjAuOGVtO3BhZGRpbmc6NHB4IDEwcHg7XCJcbiAgICAgICAgICBvbmNsaWNrPVwiYnVsa1B1YkFjdGlvbignYWNjZXB0LWFsbCcpXCIgdGl0bGU9XCJBY2NlcHQgYWxsIHB1YmxpY2F0aW9uc1wiPkFjY2VwdCBBbGw8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG4gc2Vjb25kYXJ5XCIgc3R5bGU9XCJmb250LXNpemU6MC44ZW07cGFkZGluZzo0cHggMTBweDtcIlxuICAgICAgICAgIG9uY2xpY2s9XCJidWxrUHViQWN0aW9uKCdyZWplY3QtYWxsJylcIiB0aXRsZT1cIlJlamVjdCBhbGwgcHVibGljYXRpb25zXCI+UmVqZWN0IEFsbDwvYnV0dG9uPlxuICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuICAgIDx0YWJsZSBpZD1cInB1YmxpY2F0aW9ucy1yZXZpZXctdGFibGVcIiBjbGFzcz1cInJldmlldy10YWJsZVwiPlxuICAgICAgPHRoZWFkPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6NDBweDtcIj5SYW5rPC90aD5cbiAgICAgICAgICA8dGg+Q2l0YXRpb248L3RoPlxuICAgICAgICAgIDx0aD5ZZWFyPC90aD5cbiAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDozNnB4O3RleHQtYWxpZ246Y2VudGVyO1wiIHRpdGxlPVwiRmlyc3QgYXV0aG9yXCI+MXN0XHUyNjA1PC90aD5cbiAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDo1MHB4O1wiPlNjb3JlPC90aD5cbiAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDo4MHB4O1wiPkNvbmZpZGVuY2U8L3RoPlxuICAgICAgICAgIDx0aD5SZWFzb25pbmc8L3RoPlxuICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOjgwcHg7XCI+SW5jbHVkZT88L3RoPlxuICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOjU2cHg7dGV4dC1hbGlnbjpjZW50ZXI7XCI+T3JkZXI8L3RoPlxuICAgICAgICA8L3RyPlxuICAgICAgPC90aGVhZD5cbiAgICAgIDx0Ym9keT5cbiAgYDtcblxuICBsZXQgZGl2aWRlckluc2VydGVkID0gZmFsc2U7XG4gIHJlY29tbWVuZGF0aW9ucy5mb3JFYWNoKChwdWIsIGlkeCkgPT4ge1xuICAgIC8vIEluc2VydCBhIHNlY3Rpb24gZGl2aWRlciBiZWZvcmUgdGhlIGZpcnN0IG5vbi1yZWNvbW1lbmRlZCBwdWJsaWNhdGlvblxuICAgIGlmICghZGl2aWRlckluc2VydGVkICYmIHB1Yi5pc19yZWNvbW1lbmRlZCA9PT0gZmFsc2UpIHtcbiAgICAgIGRpdmlkZXJJbnNlcnRlZCA9IHRydWU7XG4gICAgICBjb25zdCBkaXZpZGVyU3R5bGUgPSAnYmFja2dyb3VuZDojZjNmNGY2O2JvcmRlci10b3A6MnB4IHNvbGlkICNkMWQ1ZGI7cGFkZGluZzowOyc7XG4gICAgICB0YWJsZUhUTUwgKz0gYFxuICAgICAgICA8dHIgY2xhc3M9XCJwdWItZGl2aWRlci1yb3dcIj5cbiAgICAgICAgICA8dGQgc3R5bGU9XCIke2RpdmlkZXJTdHlsZX1cIj48L3RkPlxuICAgICAgICAgIDx0ZCBzdHlsZT1cIiR7ZGl2aWRlclN0eWxlfWNvbG9yOiM2YjcyODA7Zm9udC1zaXplOjAuODJlbTtmb250LXN0eWxlOml0YWxpYztwYWRkaW5nOjZweCAxMnB4O3RleHQtYWxpZ246Y2VudGVyO1wiPlxuICAgICAgICAgICAgXHUyMDE0IFB1YmxpY2F0aW9ucyBiZWxvdyB3ZXJlIG5vdCByZWNvbW1lbmRlZCBmb3IgdGhpcyByb2xlIChwcmUtZXhjbHVkZWQpIFx1MjAxNFxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPHRkIHN0eWxlPVwiJHtkaXZpZGVyU3R5bGV9XCI+PC90ZD5cbiAgICAgICAgICA8dGQgc3R5bGU9XCIke2RpdmlkZXJTdHlsZX1cIj48L3RkPlxuICAgICAgICAgIDx0ZCBzdHlsZT1cIiR7ZGl2aWRlclN0eWxlfVwiPjwvdGQ+XG4gICAgICAgICAgPHRkIHN0eWxlPVwiJHtkaXZpZGVyU3R5bGV9XCI+PC90ZD5cbiAgICAgICAgICA8dGQgc3R5bGU9XCIke2RpdmlkZXJTdHlsZX1cIj48L3RkPlxuICAgICAgICAgIDx0ZCBzdHlsZT1cIiR7ZGl2aWRlclN0eWxlfVwiPjwvdGQ+XG4gICAgICAgICAgPHRkIHN0eWxlPVwiJHtkaXZpZGVyU3R5bGV9XCI+PC90ZD5cbiAgICAgICAgPC90cj5cbiAgICAgIGA7XG4gICAgfVxuXG4gICAgY29uc3QgcmFuayAgICAgICA9IGlkeCArIDE7XG4gICAgY29uc3QgY2l0YXRpb24gICA9IHB1Yi5mb3JtYXR0ZWRfY2l0YXRpb24gfHwgW3B1Yi50aXRsZSwgcHViLnZlbnVlLCBwdWIueWVhcl0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJy4gJyk7XG4gICAgY29uc3QgeWVhciAgICAgICA9IHB1Yi55ZWFyIHx8ICdcdTIwMTQnO1xuICAgIGNvbnN0IGZpcnN0QXV0aCAgPSBwdWIuaXNfZmlyc3RfYXV0aG9yID8gJzxzcGFuIHN0eWxlPVwiY29sb3I6IzEwYjk4MTtmb250LXdlaWdodDo3MDA7XCIgdGl0bGU9XCJGaXJzdCBhdXRob3JcIj5cdTI2MDU8L3NwYW4+JyA6ICc8c3BhbiBzdHlsZT1cImNvbG9yOiNkMWQ1ZGI7XCI+XHUyNjA2PC9zcGFuPic7XG4gICAgY29uc3Qgc2NvcmUgICAgICA9IHB1Yi5yZWxldmFuY2Vfc2NvcmUgPyBwdWIucmVsZXZhbmNlX3Njb3JlIDogJ1x1MjAxNCc7XG4gICAgY29uc3QgY29uZmlkZW5jZSA9IHB1Yi5jb25maWRlbmNlIHx8ICcnO1xuICAgIGNvbnN0IGNvbmZDb2xvciAgPSBjb25maWRlbmNlID09PSAnSGlnaCcgPyAnIzEwYjk4MScgOiBjb25maWRlbmNlID09PSAnTG93JyA/ICcjZWY0NDQ0JyA6ICcjZjU5ZTBiJztcbiAgICBjb25zdCBjb25mQmFkZ2UgID0gY29uZmlkZW5jZSA/IGA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZToxMXB4O2NvbG9yOiR7Y29uZkNvbG9yfTtmb250LXdlaWdodDo2MDA7XCI+JHtlc2NhcGVIdG1sKGNvbmZpZGVuY2UpfTwvc3Bhbj5gIDogJyc7XG4gICAgY29uc3QgcmVhc29uaW5nICA9IHB1Yi5yYXRpb25hbGUgPyBgPHNtYWxsPiR7ZXNjYXBlSHRtbChwdWIucmF0aW9uYWxlKX08L3NtYWxsPmAgOiAnJztcbiAgICBjb25zdCB2ZW51ZVdhcm4gID0gcHViLnZlbnVlX3dhcm5pbmcgPyBgIDxzcGFuIHRpdGxlPVwiJHtlc2NhcGVIdG1sKHB1Yi52ZW51ZV93YXJuaW5nKX1cIiBzdHlsZT1cImNvbG9yOiNkYzc5MDA7Y3Vyc29yOmhlbHA7XCI+XHUyNkEwPC9zcGFuPmAgOiAnJztcbiAgICBjb25zdCBjaXRlS2V5ICAgID0gcHViLmNpdGVfa2V5IHx8ICcnO1xuICAgIGNvbnN0IGlzQWNjZXB0ZWQgPSB3aW5kb3cucHVibGljYXRpb25EZWNpc2lvbnNbY2l0ZUtleV0gIT09IGZhbHNlO1xuICAgIGNvbnN0IHJvd1N0eWxlICAgPSBwdWIuaXNfcmVjb21tZW5kZWQgPT09IGZhbHNlID8gJ29wYWNpdHk6MC43OycgOiAnJztcblxuICAgIGNvbnN0IGlzRmlyc3QgPSBpZHggPT09IDA7XG4gICAgY29uc3QgaXNMYXN0ICA9IGlkeCA9PT0gcmVjb21tZW5kYXRpb25zLmxlbmd0aCAtIDE7XG4gICAgdGFibGVIVE1MICs9IGBcbiAgICAgIDx0ciBkYXRhLWNpdGUta2V5PVwiJHtlc2NhcGVIdG1sKGNpdGVLZXkpfVwiIHN0eWxlPVwiJHtyb3dTdHlsZX1cIj5cbiAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7Zm9udC13ZWlnaHQ6NzAwO1wiPiR7cmFua308L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJmb250LXNpemU6MC44N2VtO1wiPiR7ZXNjYXBlSHRtbChjaXRhdGlvbil9JHt2ZW51ZVdhcm59PC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7XCI+JHt5ZWFyfTwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO1wiPiR7Zmlyc3RBdXRofTwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO1wiPiR7c2NvcmUgIT09ICdcdTIwMTQnID8gYDxzdHJvbmc+JHtzY29yZX08L3N0cm9uZz4vMTBgIDogJ1x1MjAxNCd9PC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7XCI+JHtjb25mQmFkZ2V9PC90ZD5cbiAgICAgICAgPHRkPiR7cmVhc29uaW5nfTwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cImFjdGlvbi1idG5zXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG4ke2lzQWNjZXB0ZWQgPyAnIGFjdGl2ZScgOiAnJ31cIiBkYXRhLWFjdGlvbj1cImFjY2VwdFwiIGFyaWEtbGFiZWw9XCJJbmNsdWRlIHB1YmxpY2F0aW9uICR7ZXNjYXBlSHRtbChjaXRlS2V5KX1cIiB0aXRsZT1cIkluY2x1ZGUgaW4gQ1ZcIlxuICAgICAgICAgICAgICBzdHlsZT1cImNvbG9yOiMxMGI5ODE7XCIgaWQ9XCJwdWItYWNjZXB0LSR7cmFua31cIj5cdTI3MTM8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0biR7IWlzQWNjZXB0ZWQgPyAnIGFjdGl2ZScgOiAnJ31cIiBkYXRhLWFjdGlvbj1cInJlamVjdFwiIGFyaWEtbGFiZWw9XCJFeGNsdWRlIHB1YmxpY2F0aW9uICR7ZXNjYXBlSHRtbChjaXRlS2V5KX1cIiB0aXRsZT1cIkV4Y2x1ZGUgZnJvbSBDVlwiXG4gICAgICAgICAgICAgIHN0eWxlPVwiY29sb3I6I2VmNDQ0NDtcIiBpZD1cInB1Yi1yZWplY3QtJHtyYW5rfVwiPiR7ZXllU2xhc2hJY29uKCl9PC9idXR0b24+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO3doaXRlLXNwYWNlOm5vd3JhcDtcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBkYXRhLWFjdGlvbj1cInB1Yi11cFwiIGRhdGEtY2l0ZS1rZXk9XCIke2VzY2FwZUh0bWwoY2l0ZUtleSl9XCJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJNb3ZlIHB1YmxpY2F0aW9uIHVwXCIgdGl0bGU9XCJNb3ZlIHVwXCIgJHtpc0ZpcnN0ID8gJ2Rpc2FibGVkIHN0eWxlPVwib3BhY2l0eTowLjM7XCInIDogJyd9Plx1MjE5MTwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIGRhdGEtYWN0aW9uPVwicHViLWRvd25cIiBkYXRhLWNpdGUta2V5PVwiJHtlc2NhcGVIdG1sKGNpdGVLZXkpfVwiXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiTW92ZSBwdWJsaWNhdGlvbiBkb3duXCIgdGl0bGU9XCJNb3ZlIGRvd25cIiAke2lzTGFzdCA/ICdkaXNhYmxlZCBzdHlsZT1cIm9wYWNpdHk6MC4zO1wiJyA6ICcnfT5cdTIxOTM8L2J1dHRvbj5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvdHI+XG4gICAgYDtcbiAgfSk7XG5cbiAgdGFibGVIVE1MICs9ICc8L3Rib2R5PjwvdGFibGU+JztcbiAgY29udGFpbmVyLmlubmVySFRNTCA9IHRhYmxlSFRNTDtcbiAgLy8gRGVsZWdhdGVkIGNsaWNrIGhhbmRsZXIgZm9yIHB1YmxpY2F0aW9uIGFjdGlvbiBidXR0b25zIChkYXRhLWNpdGUta2V5IG9uIDx0cj4gYXZvaWRzIG9uY2xpY2sgaW5qZWN0aW9uKVxuICBjb250YWluZXIucXVlcnlTZWxlY3RvcignI3B1YmxpY2F0aW9ucy1yZXZpZXctdGFibGUgdGJvZHknKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBlID0+IHtcbiAgICBjb25zdCBidG4gPSBlLnRhcmdldC5jbG9zZXN0KCcuaWNvbi1idG4nKTtcbiAgICBpZiAoIWJ0biB8fCBidG4uZGlzYWJsZWQpIHJldHVybjtcbiAgICBjb25zdCB0ciA9IGJ0bi5jbG9zZXN0KCd0cltkYXRhLWNpdGUta2V5XScpO1xuICAgIGlmICghdHIpIHJldHVybjtcbiAgICBjb25zdCBhY3Rpb24gPSBidG4uZGF0YXNldC5hY3Rpb247XG4gICAgaWYgICAgICAoYWN0aW9uID09PSAnYWNjZXB0JykgICBoYW5kbGVQdWJBY3Rpb24odHIuZGF0YXNldC5jaXRlS2V5LCB0cnVlKTtcbiAgICBlbHNlIGlmIChhY3Rpb24gPT09ICdyZWplY3QnKSAgIGhhbmRsZVB1YkFjdGlvbih0ci5kYXRhc2V0LmNpdGVLZXksIGZhbHNlKTtcbiAgICBlbHNlIGlmIChhY3Rpb24gPT09ICdwdWItdXAnKSAgIG1vdmVQdWJSb3coYnRuLmRhdGFzZXQuY2l0ZUtleSwgLTEpO1xuICAgIGVsc2UgaWYgKGFjdGlvbiA9PT0gJ3B1Yi1kb3duJykgbW92ZVB1YlJvdyhidG4uZGF0YXNldC5jaXRlS2V5LCArMSk7XG4gIH0pO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgRmlsdGVyIHRhYmxlIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBmaWx0ZXJQdWJsaWNhdGlvbnNUYWJsZShxdWVyeSkge1xuICBjb25zdCBxID0gcXVlcnkudG9Mb3dlckNhc2UoKTtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI3B1YmxpY2F0aW9ucy1yZXZpZXctdGFibGUgdGJvZHkgdHI6bm90KC5wdWItZGl2aWRlci1yb3cpJykuZm9yRWFjaChyb3cgPT4ge1xuICAgIHJvdy5zdHlsZS5kaXNwbGF5ID0gcSA9PT0gJycgfHwgcm93LnRleHRDb250ZW50LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkgPyAnJyA6ICdub25lJztcbiAgfSk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBSZW9yZGVyIHJvd3MgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIG1vdmVQdWJSb3coY2l0ZUtleSwgZGlyZWN0aW9uKSB7XG4gIGNvbnN0IGFyciA9IHdpbmRvdy5fcHVibGljYXRpb25zT3JkZXJlZDtcbiAgaWYgKCFhcnIgfHwgIWFyci5sZW5ndGgpIHJldHVybjtcbiAgY29uc3QgaWR4ID0gYXJyLmZpbmRJbmRleChwID0+IHAuY2l0ZV9rZXkgPT09IGNpdGVLZXkpO1xuICBpZiAoaWR4IDwgMCkgcmV0dXJuO1xuICBjb25zdCBuZXdJZHggPSBpZHggKyBkaXJlY3Rpb247XG4gIGlmIChuZXdJZHggPCAwIHx8IG5ld0lkeCA+PSBhcnIubGVuZ3RoKSByZXR1cm47XG4gIFthcnJbaWR4XSwgYXJyW25ld0lkeF1dID0gW2FycltuZXdJZHhdLCBhcnJbaWR4XV07XG4gIF9yZWJ1aWxkUHViVGFibGVCb2R5KGFycik7XG4gIC8vIFBlcnNpc3Qgb3JkZXIgdG8gYmFja2VuZCAoZmlyZS1hbmQtZm9yZ2V0KVxuICBmZXRjaCgnL2FwaS9yZW9yZGVyLXJvd3MnLCB7XG4gICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyB0eXBlOiAncHVibGljYXRpb24nLCBvcmRlcmVkX2lkczogYXJyLm1hcChwID0+IHAuY2l0ZV9rZXkpIH0pLFxuICB9KS5jYXRjaCgoKSA9PiB7fSk7XG59XG5cbmZ1bmN0aW9uIF9yZWJ1aWxkUHViVGFibGVCb2R5KHJlY29tbWVuZGF0aW9ucykge1xuICBjb25zdCB0Ym9keSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNwdWJsaWNhdGlvbnMtcmV2aWV3LXRhYmxlIHRib2R5Jyk7XG4gIGlmICghdGJvZHkpIHJldHVybjtcbiAgbGV0IGh0bWwgPSAnJztcbiAgbGV0IGRpdmlkZXJJbnNlcnRlZCA9IGZhbHNlO1xuICByZWNvbW1lbmRhdGlvbnMuZm9yRWFjaCgocHViLCBpZHgpID0+IHtcbiAgICBpZiAoIWRpdmlkZXJJbnNlcnRlZCAmJiBwdWIuaXNfcmVjb21tZW5kZWQgPT09IGZhbHNlKSB7XG4gICAgICBkaXZpZGVySW5zZXJ0ZWQgPSB0cnVlO1xuICAgICAgY29uc3QgZHMgPSAnYmFja2dyb3VuZDojZjNmNGY2O2JvcmRlci10b3A6MnB4IHNvbGlkICNkMWQ1ZGI7cGFkZGluZzowOyc7XG4gICAgICBodG1sICs9IGA8dHIgY2xhc3M9XCJwdWItZGl2aWRlci1yb3dcIj48dGQgc3R5bGU9XCIke2RzfVwiPjwvdGQ+PHRkIHN0eWxlPVwiJHtkc31jb2xvcjojNmI3MjgwO2ZvbnQtc2l6ZTowLjgyZW07Zm9udC1zdHlsZTppdGFsaWM7cGFkZGluZzo2cHggMTJweDt0ZXh0LWFsaWduOmNlbnRlcjtcIj5cdTIwMTQgUHVibGljYXRpb25zIGJlbG93IHdlcmUgbm90IHJlY29tbWVuZGVkIGZvciB0aGlzIHJvbGUgKHByZS1leGNsdWRlZCkgXHUyMDE0PC90ZD48dGQgc3R5bGU9XCIke2RzfVwiPjwvdGQ+PHRkIHN0eWxlPVwiJHtkc31cIj48L3RkPjx0ZCBzdHlsZT1cIiR7ZHN9XCI+PC90ZD48dGQgc3R5bGU9XCIke2RzfVwiPjwvdGQ+PHRkIHN0eWxlPVwiJHtkc31cIj48L3RkPjx0ZCBzdHlsZT1cIiR7ZHN9XCI+PC90ZD48dGQgc3R5bGU9XCIke2RzfVwiPjwvdGQ+PC90cj5gO1xuICAgIH1cbiAgICBjb25zdCByYW5rICAgICAgID0gaWR4ICsgMTtcbiAgICBjb25zdCBjaXRlS2V5ICAgID0gcHViLmNpdGVfa2V5IHx8ICcnO1xuICAgIGNvbnN0IGNpdGF0aW9uICAgPSBwdWIuZm9ybWF0dGVkX2NpdGF0aW9uIHx8IFtwdWIudGl0bGUsIHB1Yi52ZW51ZSwgcHViLnllYXJdLmZpbHRlcihCb29sZWFuKS5qb2luKCcuICcpO1xuICAgIGNvbnN0IHllYXIgICAgICAgPSBwdWIueWVhciB8fCAnXHUyMDE0JztcbiAgICBjb25zdCBmaXJzdEF1dGggID0gcHViLmlzX2ZpcnN0X2F1dGhvciA/ICc8c3BhbiBzdHlsZT1cImNvbG9yOiMxMGI5ODE7Zm9udC13ZWlnaHQ6NzAwO1wiIHRpdGxlPVwiRmlyc3QgYXV0aG9yXCI+XHUyNjA1PC9zcGFuPicgOiAnPHNwYW4gc3R5bGU9XCJjb2xvcjojZDFkNWRiO1wiPlx1MjYwNjwvc3Bhbj4nO1xuICAgIGNvbnN0IHNjb3JlICAgICAgPSBwdWIucmVsZXZhbmNlX3Njb3JlID8gcHViLnJlbGV2YW5jZV9zY29yZSA6ICdcdTIwMTQnO1xuICAgIGNvbnN0IGNvbmZpZGVuY2UgPSBwdWIuY29uZmlkZW5jZSB8fCAnJztcbiAgICBjb25zdCBjb25mQ29sb3IgID0gY29uZmlkZW5jZSA9PT0gJ0hpZ2gnID8gJyMxMGI5ODEnIDogY29uZmlkZW5jZSA9PT0gJ0xvdycgPyAnI2VmNDQ0NCcgOiAnI2Y1OWUwYic7XG4gICAgY29uc3QgY29uZkJhZGdlICA9IGNvbmZpZGVuY2UgPyBgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MTFweDtjb2xvcjoke2NvbmZDb2xvcn07Zm9udC13ZWlnaHQ6NjAwO1wiPiR7ZXNjYXBlSHRtbChjb25maWRlbmNlKX08L3NwYW4+YCA6ICcnO1xuICAgIGNvbnN0IHJlYXNvbmluZyAgPSBwdWIucmF0aW9uYWxlID8gYDxzbWFsbD4ke2VzY2FwZUh0bWwocHViLnJhdGlvbmFsZSl9PC9zbWFsbD5gIDogJyc7XG4gICAgY29uc3QgdmVudWVXYXJuICA9IHB1Yi52ZW51ZV93YXJuaW5nID8gYCA8c3BhbiB0aXRsZT1cIiR7ZXNjYXBlSHRtbChwdWIudmVudWVfd2FybmluZyl9XCIgc3R5bGU9XCJjb2xvcjojZGM3OTAwO2N1cnNvcjpoZWxwO1wiPlx1MjZBMDwvc3Bhbj5gIDogJyc7XG4gICAgY29uc3QgaXNBY2NlcHRlZCA9IHdpbmRvdy5wdWJsaWNhdGlvbkRlY2lzaW9uc1tjaXRlS2V5XSAhPT0gZmFsc2U7XG4gICAgY29uc3Qgcm93U3R5bGUgICA9IHB1Yi5pc19yZWNvbW1lbmRlZCA9PT0gZmFsc2UgPyAnb3BhY2l0eTowLjc7JyA6ICcnO1xuICAgIGNvbnN0IGlzRmlyc3QgICAgPSBpZHggPT09IDA7XG4gICAgY29uc3QgaXNMYXN0ICAgICA9IGlkeCA9PT0gcmVjb21tZW5kYXRpb25zLmxlbmd0aCAtIDE7XG4gICAgaHRtbCArPSBgPHRyIGRhdGEtY2l0ZS1rZXk9XCIke2VzY2FwZUh0bWwoY2l0ZUtleSl9XCIgc3R5bGU9XCIke3Jvd1N0eWxlfVwiPlxuICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7Zm9udC13ZWlnaHQ6NzAwO1wiPiR7cmFua308L3RkPlxuICAgICAgPHRkIHN0eWxlPVwiZm9udC1zaXplOjAuODdlbTtcIj4ke2VzY2FwZUh0bWwoY2l0YXRpb24pfSR7dmVudWVXYXJufTwvdGQ+XG4gICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjtcIj4ke3llYXJ9PC90ZD5cbiAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO1wiPiR7Zmlyc3RBdXRofTwvdGQ+XG4gICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjtcIj4ke3Njb3JlICE9PSAnXHUyMDE0JyA/IGA8c3Ryb25nPiR7c2NvcmV9PC9zdHJvbmc+LzEwYCA6ICdcdTIwMTQnfTwvdGQ+XG4gICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjtcIj4ke2NvbmZCYWRnZX08L3RkPlxuICAgICAgPHRkPiR7cmVhc29uaW5nfTwvdGQ+XG4gICAgICA8dGQgY2xhc3M9XCJhY3Rpb24tYnRuc1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG4ke2lzQWNjZXB0ZWQgPyAnIGFjdGl2ZScgOiAnJ31cIiBkYXRhLWFjdGlvbj1cImFjY2VwdFwiIGFyaWEtbGFiZWw9XCJJbmNsdWRlIHB1YmxpY2F0aW9uICR7ZXNjYXBlSHRtbChjaXRlS2V5KX1cIiB0aXRsZT1cIkluY2x1ZGUgaW4gQ1ZcIiBzdHlsZT1cImNvbG9yOiMxMGI5ODE7XCIgaWQ9XCJwdWItYWNjZXB0LSR7cmFua31cIj5cdTI3MTM8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuJHshaXNBY2NlcHRlZCA/ICcgYWN0aXZlJyA6ICcnfVwiIGRhdGEtYWN0aW9uPVwicmVqZWN0XCIgYXJpYS1sYWJlbD1cIkV4Y2x1ZGUgcHVibGljYXRpb24gJHtlc2NhcGVIdG1sKGNpdGVLZXkpfVwiIHRpdGxlPVwiRXhjbHVkZSBmcm9tIENWXCIgc3R5bGU9XCJjb2xvcjojZWY0NDQ0O1wiIGlkPVwicHViLXJlamVjdC0ke3Jhbmt9XCI+JHtleWVTbGFzaEljb24oKX08L2J1dHRvbj5cbiAgICAgIDwvdGQ+XG4gICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjt3aGl0ZS1zcGFjZTpub3dyYXA7XCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIGRhdGEtYWN0aW9uPVwicHViLXVwXCIgZGF0YS1jaXRlLWtleT1cIiR7ZXNjYXBlSHRtbChjaXRlS2V5KX1cIiBhcmlhLWxhYmVsPVwiTW92ZSBwdWJsaWNhdGlvbiB1cFwiIHRpdGxlPVwiTW92ZSB1cFwiICR7aXNGaXJzdCA/ICdkaXNhYmxlZCBzdHlsZT1cIm9wYWNpdHk6MC4zO1wiJyA6ICcnfT5cdTIxOTE8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgZGF0YS1hY3Rpb249XCJwdWItZG93blwiIGRhdGEtY2l0ZS1rZXk9XCIke2VzY2FwZUh0bWwoY2l0ZUtleSl9XCIgYXJpYS1sYWJlbD1cIk1vdmUgcHVibGljYXRpb24gZG93blwiIHRpdGxlPVwiTW92ZSBkb3duXCIgJHtpc0xhc3QgPyAnZGlzYWJsZWQgc3R5bGU9XCJvcGFjaXR5OjAuMztcIicgOiAnJ30+XHUyMTkzPC9idXR0b24+XG4gICAgICA8L3RkPlxuICAgIDwvdHI+YDtcbiAgfSk7XG4gIHRib2R5LmlubmVySFRNTCA9IGh0bWw7XG4gIC8vIFJlLWFwcGx5IGFueSBhY3RpdmUgZmlsdGVyXG4gIGNvbnN0IGZpbHRlclZhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWItZmlsdGVyLWlucHV0Jyk/LnZhbHVlIHx8ICcnO1xuICBpZiAoZmlsdGVyVmFsKSBmaWx0ZXJQdWJsaWNhdGlvbnNUYWJsZShmaWx0ZXJWYWwpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgVG9nZ2xlIGFjY2VwdCAvIHJlamVjdCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gaGFuZGxlUHViQWN0aW9uKGNpdGVLZXksIGFjY2VwdCkge1xuICB3aW5kb3cucHVibGljYXRpb25EZWNpc2lvbnNbY2l0ZUtleV0gPSBhY2NlcHQ7XG4gIC8vIHVwZGF0ZSBidXR0b24gYWN0aXZlIHN0YXRlcyBpbiB0aGUgcm93XG4gIGNvbnN0IHJvdyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYHRyW2RhdGEtY2l0ZS1rZXk9XCIke0NTUy5lc2NhcGUoY2l0ZUtleSl9XCJdYCk7XG4gIGlmICghcm93KSByZXR1cm47XG4gIHJvdy5xdWVyeVNlbGVjdG9yQWxsKCcuaWNvbi1idG4nKS5mb3JFYWNoKGJ0biA9PiBidG4uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJykpO1xuICBjb25zdCBhY3Rpb24gPSBhY2NlcHQgPyAnYWNjZXB0JyA6ICdyZWplY3QnO1xuICBjb25zdCBidG4gPSByb3cucXVlcnlTZWxlY3RvcihgW2RhdGEtYWN0aW9uPVwiJHthY3Rpb259XCJdYCk7XG4gIGlmIChidG4pIGJ0bi5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEJ1bGsgYWN0aW9ucyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gYnVsa1B1YkFjdGlvbihtb2RlKSB7XG4gIGNvbnN0IHB1YnMgPSB3aW5kb3cuX3B1YmxpY2F0aW9uc09yZGVyZWQgfHwgW107XG4gIGlmICghcHVicy5sZW5ndGgpIHJldHVybjtcblxuICBwdWJzLmZvckVhY2gocHViID0+IHtcbiAgICBjb25zdCBjaXRlS2V5ID0gcHViLmNpdGVfa2V5O1xuICAgIGxldCBhY2NlcHQ7XG4gICAgaWYgKG1vZGUgPT09ICdyZWNvbW1lbmRlZCcpIHtcbiAgICAgIGFjY2VwdCA9IHB1Yi5pc19yZWNvbW1lbmRlZCAhPT0gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChtb2RlID09PSAnYWNjZXB0LWFsbCcpIHtcbiAgICAgIGFjY2VwdCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFjY2VwdCA9IGZhbHNlO1xuICAgIH1cbiAgICB3aW5kb3cucHVibGljYXRpb25EZWNpc2lvbnNbY2l0ZUtleV0gPSBhY2NlcHQ7XG4gICAgLy8gVXBkYXRlIGJ1dHRvbiBzdGF0ZXMgaW4gdGhlIERPTVxuICAgIGNvbnN0IHJvdyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYHRyW2RhdGEtY2l0ZS1rZXk9XCIke0NTUy5lc2NhcGUoY2l0ZUtleSl9XCJdYCk7XG4gICAgaWYgKCFyb3cpIHJldHVybjtcbiAgICByb3cucXVlcnlTZWxlY3RvckFsbCgnLmljb24tYnRuW2RhdGEtYWN0aW9uPVwiYWNjZXB0XCJdLFtkYXRhLWFjdGlvbj1cInJlamVjdFwiXScpLmZvckVhY2goYnRuID0+IGJ0bi5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKSk7XG4gICAgY29uc3QgdGFyZ2V0ID0gcm93LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWFjdGlvbj1cIiR7YWNjZXB0ID8gJ2FjY2VwdCcgOiAncmVqZWN0J31cIl1gKTtcbiAgICBpZiAodGFyZ2V0KSB0YXJnZXQuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gIH0pO1xuXG4gIGNvbnN0IGFjY2VwdGVkID0gT2JqZWN0LnZhbHVlcyh3aW5kb3cucHVibGljYXRpb25EZWNpc2lvbnMpLmZpbHRlcihCb29sZWFuKS5sZW5ndGg7XG4gIHNob3dUb2FzdChgQnVsayBhY3Rpb24gYXBwbGllZDogJHthY2NlcHRlZH0gYWNjZXB0ZWQsICR7cHVicy5sZW5ndGggLSBhY2NlcHRlZH0gZXhjbHVkZWRgKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFN1Ym1pdCBkZWNpc2lvbnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIHN1Ym1pdFB1YmxpY2F0aW9uRGVjaXNpb25zKCkge1xuICAvKiBkdWNrZmxvdzpcbiAgICogICBpZDogcHVibGljYXRpb25zX3VpX3N1Ym1pdF9saXZlXG4gICAqICAga2luZDogdWlcbiAgICogICB0aW1lc3RhbXA6ICcyMDI2LTAzLTI1VDIxOjM5OjQ4WidcbiAgICogICBzdGF0dXM6IGxpdmVcbiAgICogICBoYW5kbGVzOlxuICAgKiAgIC0gdWk6cHVibGljYXRpb25zLXJldmlldy5zdWJtaXRcbiAgICogICBjYWxsczpcbiAgICogICAtIFBPU1QgL2FwaS9yZXZpZXctZGVjaXNpb25zXG4gICAqICAgLSBHRVQgL2FwaS9yZXdyaXRlc1xuICAgKiAgIHJlYWRzOlxuICAgKiAgIC0gd2luZG93OnB1YmxpY2F0aW9uRGVjaXNpb25zXG4gICAqICAgd3JpdGVzOlxuICAgKiAgIC0gcmVxdWVzdDpQT1NUIC9hcGkvcmV2aWV3LWRlY2lzaW9ucy5kZWNpc2lvbnNcbiAgICogICBub3RlczogUGVyc2lzdHMgcHVibGljYXRpb24gaW5jbHVkZS9leGNsdWRlIGRlY2lzaW9ucyBiZWZvcmUgdGhlIHJld3JpdGUgc3RhZ2UgZGVyaXZlcyBkb3duc3RyZWFtIGNvbnRlbnQgcHJvcG9zYWxzIGZyb20gdGhlIGFjY2VwdGVkIHB1YmxpY2F0aW9uIHNldC5cbiAgICovXG4gIGNvbnN0IGRlY2lzaW9ucyA9IHdpbmRvdy5wdWJsaWNhdGlvbkRlY2lzaW9ucyB8fCB7fTtcbiAgY29uc3QgY291bnQgPSBPYmplY3Qua2V5cyhkZWNpc2lvbnMpLmxlbmd0aDtcbiAgaWYgKGNvdW50ID09PSAwKSB7XG4gICAgc2hvd1RvYXN0KCdObyBwdWJsaWNhdGlvbiBkZWNpc2lvbnMgdG8gc2F2ZS4nLCAnZXJyb3InKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBQZXJzaXN0IGFzIGEgc3RydWN0dXJlZCBhbnN3ZXIgaW4gc2Vzc2lvbiBzdGF0ZVxuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvcmV2aWV3LWRlY2lzaW9ucycsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHR5cGU6ICdwdWJsaWNhdGlvbnMnLCBkZWNpc2lvbnM6IHdpbmRvdy5wdWJsaWNhdGlvbkRlY2lzaW9ucyB9KVxuICAgIH0pO1xuXG4gICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICBzdGF0ZU1hbmFnZXIubWFya0NvbnRlbnRDaGFuZ2VkKCk7XG4gICAgICBjb25zdCBhY2NlcHRlZCA9IE9iamVjdC52YWx1ZXMod2luZG93LnB1YmxpY2F0aW9uRGVjaXNpb25zKS5maWx0ZXIoQm9vbGVhbikubGVuZ3RoO1xuICAgICAgY29uc3QgcmVqZWN0ZWQgPSBjb3VudCAtIGFjY2VwdGVkO1xuICAgICAgc2hvd1RvYXN0KGBQdWJsaWNhdGlvbiBzZWxlY3Rpb25zIHNhdmVkOiAke2FjY2VwdGVkfSBrZXB0LCAke3JlamVjdGVkfSBleGNsdWRlZGApO1xuICAgICAgYXdhaXQgZmV0Y2hBbmRSZXZpZXdSZXdyaXRlcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBlcnIgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICBzaG93VG9hc3QoYEVycm9yOiAke2Vyci5lcnJvciB8fCAnRmFpbGVkIHRvIHNhdmUgcHVibGljYXRpb24gc2VsZWN0aW9ucyd9YCwgJ2Vycm9yJyk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cuZXJyb3IoJ0Vycm9yIHNhdmluZyBwdWJsaWNhdGlvbiBkZWNpc2lvbnM6JywgZXJyKTtcbiAgICBzaG93VG9hc3QoJ0ZhaWxlZCB0byBzYXZlIHB1YmxpY2F0aW9uIHNlbGVjdGlvbnMuIFBsZWFzZSB0cnkgYWdhaW4uJywgJ2Vycm9yJyk7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIEV4cG9ydHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmV4cG9ydCB7XG4gIGJ1aWxkUHVibGljYXRpb25zUmV2aWV3VGFibGUsXG4gIGJ1bGtQdWJBY3Rpb24sXG4gIGZpbHRlclB1YmxpY2F0aW9uc1RhYmxlLFxuICBoYW5kbGVQdWJBY3Rpb24sXG4gIHN1Ym1pdFB1YmxpY2F0aW9uRGVjaXNpb25zLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL3Jld3JpdGUtcmV2aWV3LmpzXG4gKiBSZXdyaXRlIHJldmlldyBwYW5lbDogZmV0Y2ggcmV3cml0ZXMsIHJlbmRlciBjYXJkcyB3aXRoIHdvcmQtZGlmZixcbiAqIGFjY2VwdC9lZGl0L3JlamVjdCBkZWNpc2lvbnMsIHN1Ym1pdC5cbiAqXG4gKiBEZXBlbmRlbmNpZXMgKHJlc29sdmVkIHRocm91Z2ggZ2xvYmFsVGhpcyBhdCBydW50aW1lKTpcbiAqICAgYXBwZW5kTG9hZGluZ01lc3NhZ2UsIHJlbW92ZUxvYWRpbmdNZXNzYWdlLCBhcHBlbmRSZXRyeU1lc3NhZ2UsIGFwcGVuZE1lc3NhZ2UsXG4gKiAgIHNldExvYWRpbmcsIHNlbmRBY3Rpb24sIHN3aXRjaFRhYiwgc2NoZWR1bGVBdHNSZWZyZXNoLFxuICogICBlc2NhcGVIdG1sLCBwYXJzZVJld3JpdGVzUmVzcG9uc2UsIFBIQVNFU1xuICovXG5cbmltcG9ydCB7IHN0YXRlTWFuYWdlciB9IGZyb20gJy4vc3RhdGUtbWFuYWdlci5qcyc7XG5cbi8vIE1vZHVsZS1sZXZlbCBzdGF0ZVxubGV0IHJld3JpdGVEZWNpc2lvbnMgPSB7fTtcbmxldCBfcmV3cml0ZVBhbmVsQ2FjaGUgPSBudWxsO1xubGV0IHBlcnN1YXNpb25XYXJuaW5nc0Fja25vd2xlZGdlZCA9IGZhbHNlO1xubGV0IF93YXJuaW5nc0J5UmV3cml0ZUlkID0ge307ICAvLyBNYXAgZnJvbSByZXdyaXRlIGlkIFx1MjE5MiB3YXJuaW5nIGxpc3QgKFBhdGggMSlcbmxldCBfcmVzdG9yZVRvYXN0U2hvd24gPSBmYWxzZTtcblxuZnVuY3Rpb24gc3luY1Jld3JpdGVHbG9iYWxzKCkge1xuICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgd2luZG93LnJld3JpdGVEZWNpc2lvbnMgPSByZXdyaXRlRGVjaXNpb25zO1xuICB3aW5kb3cuX3Jld3JpdGVQYW5lbENhY2hlID0gX3Jld3JpdGVQYW5lbENhY2hlO1xuICB3aW5kb3cuYWNjZXB0QWxsUmV3cml0ZXMgPSBhY2NlcHRBbGxSZXdyaXRlcztcbiAgd2luZG93LnJlamVjdEFsbFJld3JpdGVzID0gcmVqZWN0QWxsUmV3cml0ZXM7XG4gIHdpbmRvdy50b2dnbGVSZXdyaXRlQ29tcGFjdE1vZGUgPSB0b2dnbGVSZXdyaXRlQ29tcGFjdE1vZGU7XG59XG5cbmZ1bmN0aW9uIF9kZWNpc2lvbnNLZXkoKSB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2lkID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKS5nZXQoJ3Nlc3Npb24nKTtcbiAgICByZXR1cm4gc2lkID8gYHJ3X2RlY2lzaW9uc18ke3NpZH1gIDogbnVsbDtcbiAgfSBjYXRjaCAoXykgeyByZXR1cm4gbnVsbDsgfVxufVxuXG5mdW5jdGlvbiBfcGVyc2lzdERlY2lzaW9ucygpIHtcbiAgY29uc3Qga2V5ID0gX2RlY2lzaW9uc0tleSgpO1xuICBpZiAoIWtleSkgcmV0dXJuO1xuICB0cnkgeyBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIEpTT04uc3RyaW5naWZ5KHJld3JpdGVEZWNpc2lvbnMpKTsgfSBjYXRjaCAoXykge31cbn1cblxuLy8gRmFsbGJhY2sgYXVkaXQgZnJvbSB0aGUgbGFzdCAvYXBpL3Jld3JpdGVzIHJlc3BvbnNlIFx1MjAxNCB1c2VkIGZvciBjb2xkLXJlc3RvcmUgKEdBUC0xODYpLlxubGV0IF9iYWNrZW5kUmV3cml0ZUF1ZGl0ID0gW107XG5cbmZ1bmN0aW9uIF9yZXN0b3JlRGVjaXNpb25zKCkge1xuICBjb25zdCBrZXkgPSBfZGVjaXNpb25zS2V5KCk7XG4gIGlmICgha2V5KSByZXR1cm47XG4gIGNvbnN0IGhhZERlY2lzaW9ucyA9IE9iamVjdC5rZXlzKHJld3JpdGVEZWNpc2lvbnMpLmxlbmd0aCA+IDA7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2F2ZWQgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSkgfHwgJ251bGwnKTtcbiAgICBpZiAoc2F2ZWQgJiYgdHlwZW9mIHNhdmVkID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShzYXZlZCkpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24ocmV3cml0ZURlY2lzaW9ucywgc2F2ZWQpO1xuICAgICAgc3luY1Jld3JpdGVHbG9iYWxzKCk7XG4gICAgICBpZiAoIWhhZERlY2lzaW9ucyAmJiAhX3Jlc3RvcmVUb2FzdFNob3duICYmIE9iamVjdC5rZXlzKHJld3JpdGVEZWNpc2lvbnMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgX3Jlc3RvcmVUb2FzdFNob3duID0gdHJ1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBzaG93VG9hc3QoJ1lvdXIgcHJldmlvdXMgcmV3cml0ZSBkZWNpc2lvbnMgaGF2ZSBiZWVuIHJlc3RvcmVkIFx1MjAxNCB5b3UgY2FuIHN0aWxsIGNoYW5nZSB0aGVtLicsICd3YXJuaW5nJywgNjAwMCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH0gY2F0Y2ggKF8pIHt9XG5cbiAgLy8gQ29sZC1yZXN0b3JlIGZhbGxiYWNrOiBzZWVkIGRlY2lzaW9ucyBmcm9tIGJhY2tlbmQgcmV3cml0ZV9hdWRpdCB3aGVuXG4gIC8vIGxvY2FsU3RvcmFnZSBoYXMgbm90aGluZyAoZGlmZmVyZW50IGRldmljZSwgaW5jb2duaXRvLCBjbGVhcmVkIHN0b3JhZ2UpLlxuICBpZiAoX2JhY2tlbmRSZXdyaXRlQXVkaXQubGVuZ3RoID4gMCkge1xuICAgIGZvciAoY29uc3QgZW50cnkgb2YgX2JhY2tlbmRSZXdyaXRlQXVkaXQpIHtcbiAgICAgIGNvbnN0IGlkID0gZW50cnkuaWQ7XG4gICAgICBpZiAoIWlkIHx8ICFlbnRyeS5vdXRjb21lKSBjb250aW51ZTtcbiAgICAgIHJld3JpdGVEZWNpc2lvbnNbaWRdID0ge1xuICAgICAgICBvdXRjb21lOiBlbnRyeS5vdXRjb21lLFxuICAgICAgICBmaW5hbF90ZXh0OiBlbnRyeS5vdXRjb21lID09PSAnZWRpdCcgPyAoZW50cnkuZmluYWwgPz8gbnVsbCkgOiBudWxsLFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKE9iamVjdC5rZXlzKHJld3JpdGVEZWNpc2lvbnMpLmxlbmd0aCA+IDApIHtcbiAgICAgIHN5bmNSZXdyaXRlR2xvYmFscygpO1xuICAgICAgX3BlcnNpc3REZWNpc2lvbnMoKTtcbiAgICAgIGlmICghaGFkRGVjaXNpb25zICYmICFfcmVzdG9yZVRvYXN0U2hvd24pIHtcbiAgICAgICAgX3Jlc3RvcmVUb2FzdFNob3duID0gdHJ1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBzaG93VG9hc3QoJ1lvdXIgcHJldmlvdXMgcmV3cml0ZSBkZWNpc2lvbnMgaGF2ZSBiZWVuIHJlc3RvcmVkIFx1MjAxNCB5b3UgY2FuIHN0aWxsIGNoYW5nZSB0aGVtLicsICd3YXJuaW5nJywgNjAwMCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gX2NsZWFyUGVyc2lzdGVkRGVjaXNpb25zKCkge1xuICBjb25zdCBrZXkgPSBfZGVjaXNpb25zS2V5KCk7XG4gIGlmICgha2V5KSByZXR1cm47XG4gIHRyeSB7IGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7IH0gY2F0Y2ggKF8pIHt9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBSZXdyaXRlIHNuYXBzaG90IChjaGFuZ2VkLWl0ZW0gaGlnaGxpZ2h0aW5nKSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmZ1bmN0aW9uIF9zbmFwc2hvdEtleSgpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzaWQgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpLmdldCgnc2Vzc2lvbicpO1xuICAgIHJldHVybiBzaWQgPyBgcndfc25hcHNob3RfJHtzaWR9YCA6IG51bGw7XG4gIH0gY2F0Y2ggKF8pIHsgcmV0dXJuIG51bGw7IH1cbn1cblxuZnVuY3Rpb24gX3NhdmVSZXdyaXRlU25hcHNob3QocmV3cml0ZXMpIHtcbiAgY29uc3Qga2V5ID0gX3NuYXBzaG90S2V5KCk7XG4gIGlmICgha2V5KSByZXR1cm47XG4gIGNvbnN0IG1hcCA9IHt9O1xuICBmb3IgKGNvbnN0IHIgb2YgcmV3cml0ZXMpIHtcbiAgICBjb25zdCBjYXJkSWQgPSBTdHJpbmcoci5pZCkucmVwbGFjZSgvW15hLXpBLVowLTlfLV0vZywgJ18nKTtcbiAgICBtYXBbY2FyZElkXSA9IHIucHJvcG9zZWQgfHwgJyc7XG4gIH1cbiAgdHJ5IHsgbG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCBKU09OLnN0cmluZ2lmeShtYXApKTsgfSBjYXRjaCAoXykge31cbn1cblxuZnVuY3Rpb24gX2dldFJld3JpdGVTbmFwc2hvdCgpIHtcbiAgY29uc3Qga2V5ID0gX3NuYXBzaG90S2V5KCk7XG4gIGlmICgha2V5KSByZXR1cm4gbnVsbDtcbiAgdHJ5IHsgcmV0dXJuIEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KSB8fCAnbnVsbCcpOyB9IGNhdGNoIChfKSB7IHJldHVybiBudWxsOyB9XG59XG5cbmZ1bmN0aW9uIF9jbGVhclJld3JpdGVTbmFwc2hvdCgpIHtcbiAgY29uc3Qga2V5ID0gX3NuYXBzaG90S2V5KCk7XG4gIGlmICgha2V5KSByZXR1cm47XG4gIHRyeSB7IGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7IH0gY2F0Y2ggKF8pIHt9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoQW5kUmV2aWV3UmV3cml0ZXMoKSB7XG4gIGNvbnN0IGxvYWRpbmdNc2cgPSBhcHBlbmRMb2FkaW5nTWVzc2FnZSgnQ2hlY2tpbmcgZm9yIHRleHQgaW1wcm92ZW1lbnRzLi4uJyk7XG4gIHNldExvYWRpbmcodHJ1ZSwgJ1Jldmlld2luZyByZXdyaXRlc1x1MjAyNicpO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3Jld3JpdGVzJyk7XG4gICAgY29uc3QgZGF0YSA9IHBhcnNlUmV3cml0ZXNSZXNwb25zZShhd2FpdCByZXMuanNvbigpKTtcbiAgICByZW1vdmVMb2FkaW5nTWVzc2FnZShsb2FkaW5nTXNnKTtcbiAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICBpZiAoIXJlcy5vaykge1xuICAgICAgYXBwZW5kUmV0cnlNZXNzYWdlKCdcdTI3NEMgRXJyb3IgY2hlY2tpbmcgcmV3cml0ZXM6ICcgKyAoZGF0YS5lcnJvciB8fCAnVW5rbm93biBlcnJvcicpLCBmZXRjaEFuZFJldmlld1Jld3JpdGVzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmV3cml0ZXMgPSBkYXRhLnJld3JpdGVzIHx8IFtdO1xuICAgIGNvbnN0IHdhcm5pbmdzID0gZGF0YS5wZXJzdWFzaW9uX3dhcm5pbmdzIHx8IFtdOyAgLy8gUGhhc2UgMTBcbiAgICBfYmFja2VuZFJld3JpdGVBdWRpdCA9IGRhdGEucmV3cml0ZV9hdWRpdCB8fCBbXTtcblxuICAgIC8vIFNob3cgcGVyc3Vhc2lvbiB3YXJuaW5ncyBmaXJzdCAoUGhhc2UgMTApXG4gICAgcGVyc3Vhc2lvbldhcm5pbmdzQWNrbm93bGVkZ2VkID0gd2FybmluZ3MubGVuZ3RoID09PSAwOyAgLy8gTWFyayBhY2tub3dsZWRnZWQgaWYgbm8gd2FybmluZ3NcbiAgICBpZiAod2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbXNnID0gYFx1MjZBMFx1RkUwRiAqKiR7d2FybmluZ3MubGVuZ3RofSoqIHBlcnN1YXNpb24gY2hlY2ske3dhcm5pbmdzLmxlbmd0aCA+IDEgPyAncycgOiAnJ30gZmxhZ2dlZC4gUmV2aWV3IHRoZXNlIGJlZm9yZSBzdWJtaXR0aW5nLmA7XG4gICAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCBtc2cpO1xuICAgIH1cblxuICAgIC8vIFNob3cgcmV3cml0ZSByZXZpZXcgcGFuZWxcbiAgICByZXdyaXRlRGVjaXNpb25zID0ge307XG4gICAgc3luY1Jld3JpdGVHbG9iYWxzKCk7XG4gICAgcmVuZGVyUmV3cml0ZVBhbmVsKHJld3JpdGVzLCB3YXJuaW5ncyk7ICAvLyBQYXNzIHdhcm5pbmdzIHRvIHBhbmVsXG4gICAgc3dpdGNoVGFiKCdyZXdyaXRlJyk7XG4gICAgY29uc3QgbiA9IHJld3JpdGVzLmxlbmd0aDtcbiAgICBpZiAobiA9PT0gMCkge1xuICAgICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ1x1MjcwRlx1RkUwRiBObyByZXdyaXRlIHN1Z2dlc3Rpb25zIHdlcmUgbmVlZGVkIFx1MjAxNCB5b3VyIHNlbGVjdGVkIGNvbnRlbnQgYWxyZWFkeSB1c2VzIHRoZSBqb2JcXCdzIHRlcm1pbm9sb2d5IHdlbGwuIFRoZSAqKlJld3JpdGVzKiogdGFiIGlzIHN0aWxsIGF2YWlsYWJsZSBzbyB5b3UgY2FuIGNvbmZpcm0gYW5kIGNvbnRpbnVlIHRvICoqU3BlbGwgQ2hlY2sqKiB3aGVuIHJlYWR5LicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCBgXHUyNzBGXHVGRTBGIFlvdSd2ZSBjb25maXJtZWQgeW91ciBleHBlcmllbmNlLCBza2lsbCwgYW5kIGFjaGlldmVtZW50IHNlbGVjdGlvbnMuIEhlcmUgYXJlIHRoZSBBSSdzICoqJHtufSoqIHRleHQgaW1wcm92ZW1lbnQgc3VnZ2VzdGlvbiR7biA+IDEgPyAncycgOiAnJ30gZm9yIHRoZSBpbmNsdWRlZCBidWxsZXRzIFx1MjAxNCBlYWNoIG9uZSBpbnRyb2R1Y2VzIGpvYi1yZWxldmFudCBrZXl3b3JkcyB3aGlsZSBwcmVzZXJ2aW5nIHlvdXIgZmFjdHMuIFJldmlldyBlYWNoIHN1Z2dlc3Rpb24gaW4gdGhlICoqUmV3cml0ZXMqKiB0YWIsIHRoZW4gYWNjZXB0LCBlZGl0LCBvciByZWplY3QgYmVmb3JlIGNvbnRpbnVpbmcgdG8gc3BlbGwgY2hlY2suYCk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZW1vdmVMb2FkaW5nTWVzc2FnZShsb2FkaW5nTXNnKTtcbiAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICBhcHBlbmRSZXRyeU1lc3NhZ2UoJ1x1Mjc0QyBFcnJvcjogJyArIGVyci5tZXNzYWdlLCBmZXRjaEFuZFJldmlld1Jld3JpdGVzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfcmVuZGVyUmV3cml0ZUF1ZGl0TG9nKCkge1xuICBpZiAoIV9iYWNrZW5kUmV3cml0ZUF1ZGl0IHx8IF9iYWNrZW5kUmV3cml0ZUF1ZGl0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuICcnO1xuXG4gIGNvbnN0IE9VVENPTUVfSUNPTiA9IHsgYWNjZXB0OiAnXHUyNzA1JywgcmVqZWN0OiAnXHUyNzRDJywgZWRpdDogJ1x1MjcwRlx1RkUwRicgfTtcbiAgY29uc3QgT1VUQ09NRV9MQUJFTCA9IHsgYWNjZXB0OiAnQWNjZXB0ZWQnLCByZWplY3Q6ICdSZWplY3RlZCcsIGVkaXQ6ICdFZGl0ZWQnIH07XG5cbiAgY29uc3Qgcm93cyA9IF9iYWNrZW5kUmV3cml0ZUF1ZGl0Lm1hcChlbnRyeSA9PiB7XG4gICAgY29uc3QgaWNvbiAgPSBPVVRDT01FX0lDT05bZW50cnkub3V0Y29tZV0gfHwgJ1x1Mjc1Myc7XG4gICAgY29uc3QgbGFiZWwgPSBPVVRDT01FX0xBQkVMW2VudHJ5Lm91dGNvbWVdIHx8IGVudHJ5Lm91dGNvbWU7XG4gICAgY29uc3QgbG9jICAgPSBlc2NhcGVIdG1sKGVudHJ5LmxvY2F0aW9uIHx8IGVudHJ5LmZpZWxkIHx8ICcnKTtcbiAgICBjb25zdCBvcmlnICA9IGVzY2FwZUh0bWwoZW50cnkub3JpZ2luYWwgfHwgJycpO1xuICAgIGNvbnN0IHByb3AgID0gZXNjYXBlSHRtbChlbnRyeS5wcm9wb3NlZCB8fCAnJyk7XG4gICAgY29uc3QgZmluICAgPSBlbnRyeS5vdXRjb21lID09PSAnZWRpdCcgJiYgZW50cnkuZmluYWxcbiAgICAgID8gYDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOjRweDtjb2xvcjojMWQ0ZWQ4O2ZvbnQtc2l6ZTowLjg1ZW07XCI+RmluYWw6ICR7ZXNjYXBlSHRtbChlbnRyeS5maW5hbCl9PC9kaXY+YFxuICAgICAgOiAnJztcbiAgICByZXR1cm4gYFxuICAgICAgPGRpdiBzdHlsZT1cImJvcmRlci1ib3R0b206MXB4IHNvbGlkICNlMmU4ZjA7cGFkZGluZzo4cHggMDtmb250LXNpemU6MC44OGVtO1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6NnB4O21hcmdpbi1ib3R0b206NHB4O1wiPlxuICAgICAgICAgIDxzcGFuIHRpdGxlPVwiJHtsYWJlbH1cIj4ke2ljb259PC9zcGFuPlxuICAgICAgICAgIDxzdHJvbmcgc3R5bGU9XCJjb2xvcjojMzc0MTUxO1wiPiR7bGFiZWx9PC9zdHJvbmc+XG4gICAgICAgICAgJHtsb2MgPyBgPHNwYW4gc3R5bGU9XCJjb2xvcjojOWNhM2FmO2ZvbnQtc2l6ZTowLjg1ZW07XCI+XHUyMDE0ICR7bG9jfTwvc3Bhbj5gIDogJyd9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IHN0eWxlPVwiY29sb3I6IzZiNzI4MDt0ZXh0LWRlY29yYXRpb246bGluZS10aHJvdWdoO2ZvbnQtc2l6ZTowLjg1ZW07XCI+JHtvcmlnfTwvZGl2PlxuICAgICAgICA8ZGl2IHN0eWxlPVwiY29sb3I6IzM3NDE1MTtmb250LXNpemU6MC44NWVtO1wiPiR7cHJvcH08L2Rpdj5cbiAgICAgICAgJHtmaW59XG4gICAgICA8L2Rpdj5gO1xuICB9KS5qb2luKCcnKTtcblxuICByZXR1cm4gYFxuICAgIDxkZXRhaWxzIHN0eWxlPVwibWFyZ2luLXRvcDoyNHB4O2JvcmRlcjoxcHggc29saWQgI2UyZThmMDtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjEycHggMTZweDtcIj5cbiAgICAgIDxzdW1tYXJ5IHN0eWxlPVwiY3Vyc29yOnBvaW50ZXI7Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOiMzNzQxNTE7bGlzdC1zdHlsZTpub25lO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDtcIj5cbiAgICAgICAgPHNwYW4+XHVEODNEXHVEQ0NCPC9zcGFuPlxuICAgICAgICA8c3Bhbj5SZXdyaXRlIEF1ZGl0IExvZyAoJHtfYmFja2VuZFJld3JpdGVBdWRpdC5sZW5ndGh9IGRlY2lzaW9uJHtfYmFja2VuZFJld3JpdGVBdWRpdC5sZW5ndGggPT09IDEgPyAnJyA6ICdzJ30pPC9zcGFuPlxuICAgICAgICA8c3BhbiBzdHlsZT1cIm1hcmdpbi1sZWZ0OmF1dG87Y29sb3I6IzljYTNhZjtmb250LXNpemU6MC44NWVtO1wiPlx1MjVCQyBzaG93PC9zcGFuPlxuICAgICAgPC9zdW1tYXJ5PlxuICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6MTJweDtcIj4ke3Jvd3N9PC9kaXY+XG4gICAgPC9kZXRhaWxzPmA7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclJld3JpdGVQYW5lbChyZXdyaXRlcywgd2FybmluZ3MgPSBbXSkge1xuICBfcmV3cml0ZVBhbmVsQ2FjaGUgPSB7IHJld3JpdGVzLCB3YXJuaW5ncyB9O1xuICAvLyBCdWlsZCBwZXItY2FyZCB3YXJuaW5nIGluZGV4IGZvciBQYXRoIDEgYmFkZ2VzXG4gIF93YXJuaW5nc0J5UmV3cml0ZUlkID0ge307XG4gIGZvciAoY29uc3QgdyBvZiB3YXJuaW5ncykge1xuICAgIGlmICghX3dhcm5pbmdzQnlSZXdyaXRlSWRbdy5pZF0pIF93YXJuaW5nc0J5UmV3cml0ZUlkW3cuaWRdID0gW107XG4gICAgX3dhcm5pbmdzQnlSZXdyaXRlSWRbdy5pZF0ucHVzaCh3KTtcbiAgfVxuICBzeW5jUmV3cml0ZUdsb2JhbHMoKTtcbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIGNvbnN0IGhhc1Jld3JpdGVzID0gcmV3cml0ZXMubGVuZ3RoID4gMDtcblxuICAvLyBCdWlsZCBwZXJzdWFzaW9uIHdhcm5pbmdzIHNlY3Rpb24gKFBoYXNlIDEwKVxuICBsZXQgd2FybmluZ3NIdG1sID0gJyc7XG4gIGlmICh3YXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3Qgd2FybmluZ3NCeVR5cGUgPSB7fTtcbiAgICB3YXJuaW5ncy5mb3JFYWNoKHcgPT4ge1xuICAgICAgaWYgKCF3YXJuaW5nc0J5VHlwZVt3LmZsYWdfdHlwZV0pIHdhcm5pbmdzQnlUeXBlW3cuZmxhZ190eXBlXSA9IDA7XG4gICAgICB3YXJuaW5nc0J5VHlwZVt3LmZsYWdfdHlwZV0rKztcbiAgICB9KTtcbiAgICBjb25zdCB3YXJuaW5nQ291bnRzID0gT2JqZWN0LmVudHJpZXMod2FybmluZ3NCeVR5cGUpXG4gICAgICAubWFwKChbdHlwZSwgY291bnRdKSA9PiBgJHtjb3VudH0gJHt0eXBlLnJlcGxhY2UoL18vZywgJyAnKX1gKVxuICAgICAgLmpvaW4oJywgJyk7XG5cbiAgICB3YXJuaW5nc0h0bWwgPSBgXG4gICAgICA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZmVmMmYyO2JvcmRlcjoxcHggc29saWQgI2ZlY2FjYTtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjE0cHg7bWFyZ2luLWJvdHRvbToyMHB4O1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTBweDttYXJnaW4tYm90dG9tOjEwcHg7Y3Vyc29yOnBvaW50ZXI7XCIgb25jbGljaz1cInRoaXMucGFyZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yKCcjd2FybmluZ3MtZGV0YWlsJykuc3R5bGUuZGlzcGxheSA9IHRoaXMucGFyZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yKCcjd2FybmluZ3MtZGV0YWlsJykuc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnID8gJ2Jsb2NrJyA6ICdub25lJztcIj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZToyMHB4O1wiPlx1MjZBMFx1RkUwRjwvc3Bhbj5cbiAgICAgICAgICA8c3Ryb25nIHN0eWxlPVwiY29sb3I6Izk5MWIxYjtcIj5QZXJzdWFzaW9uIGNoZWNrczogJHt3YXJuaW5nQ291bnRzfTwvc3Ryb25nPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwibWFyZ2luLWxlZnQ6YXV0bztjb2xvcjojN2YxZDFkO1wiPlx1MjVCQzwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJ3YXJuaW5ncy1kZXRhaWxcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTttYXJnaW4tdG9wOjEwcHg7cGFkZGluZy10b3A6MTBweDtib3JkZXItdG9wOjFweCBzb2xpZCAjZmVjYWNhO1wiPlxuICAgICAgICAgICR7d2FybmluZ3MubWFwKHcgPT4gYFxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6OHB4O21hcmdpbi1ib3R0b206OHB4O2JhY2tncm91bmQ6I2ZmZjdlZDtib3JkZXItbGVmdDozcHggc29saWQgI2Y5NzMxNjtib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6MC45ZW07XCI+XG4gICAgICAgICAgICAgIDxzdHJvbmc+JHt3LmZsYWdfdHlwZS5yZXBsYWNlKC9fL2csICcgJyl9PC9zdHJvbmc+IGF0ICR7dy5sb2NhdGlvbn08YnI+XG4gICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6IzdjMmQxMjtcIj4ke3cuZGV0YWlsc308L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBgKS5qb2luKCcnKX1cbiAgICAgICAgICA8YnV0dG9uIHN0eWxlPVwibWFyZ2luLXRvcDoxMHB4O3BhZGRpbmc6OHB4IDEycHg7YmFja2dyb3VuZDojOTkxYjFiO2NvbG9yOndoaXRlO2JvcmRlcjpub25lO2JvcmRlci1yYWRpdXM6NHB4O2N1cnNvcjpwb2ludGVyO1wiIG9uY2xpY2s9XCJzZXRQZXJzdWFzaW9uV2FybmluZ3NBY2tub3dsZWRnZWQodHJ1ZSk7IHRoaXMucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMC42JzsgdXBkYXRlUmV3cml0ZVRhbGx5KCk7XCI+XG4gICAgICAgICAgICBcdTI3MTMgQWNrbm93bGVkZ2VkXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxuXG4gIC8vIENvbXB1dGUgcGVyLWNhcmQgY2hhbmdlIHN0YXR1cyByZWxhdGl2ZSB0byBwcmV2aW91cyByZW5kZXIncyBzbmFwc2hvdC5cbiAgY29uc3QgcHJldlNuYXBzaG90ID0gX2dldFJld3JpdGVTbmFwc2hvdCgpO1xuICBjb25zdCBjaGFuZ2VTdGF0dXNNYXAgPSB7fTtcbiAgaWYgKHByZXZTbmFwc2hvdCkge1xuICAgIGZvciAoY29uc3QgciBvZiByZXdyaXRlcykge1xuICAgICAgY29uc3QgY2FyZElkID0gU3RyaW5nKHIuaWQpLnJlcGxhY2UoL1teYS16QS1aMC05Xy1dL2csICdfJyk7XG4gICAgICBpZiAoIShjYXJkSWQgaW4gcHJldlNuYXBzaG90KSkge1xuICAgICAgICBjaGFuZ2VTdGF0dXNNYXBbY2FyZElkXSA9ICduZXcnO1xuICAgICAgfSBlbHNlIGlmIChwcmV2U25hcHNob3RbY2FyZElkXSAhPT0gKHIucHJvcG9zZWQgfHwgJycpKSB7XG4gICAgICAgIGNoYW5nZVN0YXR1c01hcFtjYXJkSWRdID0gJ3VwZGF0ZWQnO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvLyBTYXZlIGN1cnJlbnQgcmV3cml0ZXMgYXMgc25hcHNob3QgZm9yIG5leHQgcmVuZGVyIGNvbXBhcmlzb24uXG4gIF9zYXZlUmV3cml0ZVNuYXBzaG90KHJld3JpdGVzKTtcblxuICBjb250ZW50LmlubmVySFRNTCA9IHdhcm5pbmdzSHRtbCArIGBcbiAgICA8ZGl2IGlkPVwicmV3cml0ZS1wYW5lbFwiPlxuICAgICAgPGgxPlx1MjcwRlx1RkUwRiBSZXZpZXcgVGV4dCBJbXByb3ZlbWVudHM8L2gxPlxuICAgICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO21hcmdpbi1ib3R0b206MjBweDtcIj5cbiAgICAgICAgJHtoYXNSZXdyaXRlc1xuICAgID8gJ1JldmlldyBlYWNoIHN1Z2dlc3RlZCB0ZXh0IGltcHJvdmVtZW50LiBBY2NlcHQsIGVkaXQsIG9yIHJlamVjdCBhbGwgc3VnZ2VzdGlvbnMgYmVmb3JlIHByb2NlZWRpbmcgdG8gc3BlbGwgY2hlY2suJ1xuICAgIDogJ05vIHRleHQgaW1wcm92ZW1lbnRzIHdlcmUgc3VnZ2VzdGVkIGZvciB0aGlzIENWLiBDb250aW51ZSB3aGVuIHlvdSBhcmUgcmVhZHkgdG8gbW92ZSB0byBzcGVsbCBjaGVjay4nfVxuICAgICAgPC9wPlxuICAgICAgPGRpdiBjbGFzcz1cInJld3JpdGUtdGFsbHktYmFyXCIgaWQ9XCJyZXdyaXRlLXRhbGx5XCIgJHtoYXNSZXdyaXRlcyA/ICcnIDogJ3N0eWxlPVwiZGlzcGxheTpub25lXCInfT5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0YWxseS1hY2NlcHRlZFwiPlx1MjcxMyBBY2NlcHRlZDogPHN0cm9uZyBpZD1cInRhbGx5LWFjY2VwdGVkXCI+MDwvc3Ryb25nPjwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0YWxseS1yZWplY3RlZFwiPlx1MjcxNyBSZWplY3RlZDogPHN0cm9uZyBpZD1cInRhbGx5LXJlamVjdGVkXCI+MDwvc3Ryb25nPjwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0YWxseS1wZW5kaW5nXCI+XHUyM0YzIFBlbmRpbmc6IDxzdHJvbmcgaWQ9XCJ0YWxseS1wZW5kaW5nXCI+JHtyZXdyaXRlcy5sZW5ndGh9PC9zdHJvbmc+PC9zcGFuPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwicnctYnVsay1idG5cIiBvbmNsaWNrPVwiYWNjZXB0QWxsUmV3cml0ZXMoKVwiIHRpdGxlPVwiQWNjZXB0IGFsbCBwZW5kaW5nIHN1Z2dlc3Rpb25zXCI+XHUyNzEzIEFjY2VwdCBBbGw8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInJ3LWJ1bGstYnRuIHJ3LWJ1bGstcmVqZWN0XCIgb25jbGljaz1cInJlamVjdEFsbFJld3JpdGVzKClcIiB0aXRsZT1cIlJlamVjdCBhbGwgcGVuZGluZyBzdWdnZXN0aW9uc1wiPlx1MjcxNyBSZWplY3QgQWxsPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJydy1jb21wYWN0LXRvZ2dsZVwiIGlkPVwicnctY29tcGFjdC1idG5cIiBvbmNsaWNrPVwidG9nZ2xlUmV3cml0ZUNvbXBhY3RNb2RlKClcIiB0aXRsZT1cIlN3aXRjaCB0byBjb21wYWN0IHNpbmdsZS1saW5lIHZpZXcgZm9yIHJhcGlkIHJldmlld1wiPlx1MjI5RSBDb21wYWN0PC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJzdWJtaXQtcmV3cml0ZXMtYnRuXCIgaWQ9XCJzdWJtaXQtcmV3cml0ZXMtYnRuXCIgZGlzYWJsZWRcbiAgICAgICAgICAgICAgICBvbmNsaWNrPVwic3VibWl0UmV3cml0ZURlY2lzaW9ucygpXCI+U3VibWl0IEFsbCBEZWNpc2lvbnM8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBpZD1cInJld3JpdGUtY2FyZHNcIj5cbiAgICAgICAgJHtoYXNSZXdyaXRlc1xuICAgID8gcmV3cml0ZXMubWFwKHIgPT4ge1xuICAgICAgICBjb25zdCBjYXJkSWQgPSBTdHJpbmcoci5pZCkucmVwbGFjZSgvW15hLXpBLVowLTlfLV0vZywgJ18nKTtcbiAgICAgICAgcmV0dXJuIHJlbmRlclJld3JpdGVDYXJkKHIsIF93YXJuaW5nc0J5UmV3cml0ZUlkW3IuaWRdIHx8IFtdLCBjaGFuZ2VTdGF0dXNNYXBbY2FyZElkXSB8fCBudWxsKTtcbiAgICAgIH0pLmpvaW4oJycpXG4gICAgOiBgXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImVtcHR5LXN0YXRlXCIgc3R5bGU9XCJtYXJnaW4tdG9wOjI0cHg7XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWNvblwiPlx1MjcwRlx1RkUwRjwvZGl2PlxuICAgICAgICAgICAgPGgzPk5vIFJld3JpdGUgU3VnZ2VzdGlvbnM8L2gzPlxuICAgICAgICAgICAgPHA+VGhpcyBkcmFmdCBhbHJlYWR5IHBhc3NlcyB0aGUgcmV3cml0ZSBzdGFnZSB3aXRob3V0IHN1Z2dlc3RlZCB3b3JkaW5nIGNoYW5nZXMuPC9wPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInN1Ym1pdC1idG5cIiBpZD1cInN1Ym1pdC1yZXdyaXRlcy1idG5cIiBvbmNsaWNrPVwic3VibWl0UmV3cml0ZURlY2lzaW9ucygpXCI+Q29udGludWUgdG8gU3BlbGwgQ2hlY2s8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgYH1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgICR7X3JlbmRlclJld3JpdGVBdWRpdExvZygpfVxuICBgO1xuXG4gIC8vIFJlc3RvcmUgZGVjaXNpb25zIHBlcnNpc3RlZCBmcm9tIGEgcHJldmlvdXMgcGFnZSBsb2FkIChHQVAtMTY2KS5cbiAgX3Jlc3RvcmVEZWNpc2lvbnMoKTtcbiAgLy8gUmUtYXBwbHkgYW55IGRlY2lzaW9ucyBtYWRlIGJlZm9yZSB0aGUgbGFzdCB0YWIgbmF2aWdhdGlvbi5cbiAgaWYgKE9iamVjdC5rZXlzKHJld3JpdGVEZWNpc2lvbnMpLmxlbmd0aCA+IDApIHtcbiAgICBmb3IgKGNvbnN0IFtpZCwgZGVjXSBvZiBPYmplY3QuZW50cmllcyhyZXdyaXRlRGVjaXNpb25zKSkge1xuICAgICAgaWYgKCFkZWMgfHwgIWRlYy5vdXRjb21lKSBjb250aW51ZTtcbiAgICAgIGlmIChkZWMub3V0Y29tZSA9PT0gJ2VkaXQnICYmIGRlYy5maW5hbF90ZXh0ICE9IG51bGwpIHtcbiAgICAgICAgLy8gRW50ZXIgZWRpdCBtb2RlLCBpbmplY3QgdGhlIHNhdmVkIHRleHQsIHRoZW4gc2F2ZSBzbyB0aGUgY2FyZFxuICAgICAgICAvLyBzaG93cyBhcyBhY2NlcHRlZCB3aXRoIHRoZSBjb3JyZWN0IGRpZmYgcmVuZGVyZWQuXG4gICAgICAgIGFwcGx5UmV3cml0ZUFjdGlvbihpZCwgJ2VkaXQnKTtcbiAgICAgICAgY29uc3QgdGEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcnctdGV4dGFyZWEtJHtpZH1gKTtcbiAgICAgICAgaWYgKHRhKSB7XG4gICAgICAgICAgdGEudmFsdWUgPSBkZWMuZmluYWxfdGV4dDtcbiAgICAgICAgICBzYXZlUmV3cml0ZUVkaXQoaWQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhcHBseVJld3JpdGVBY3Rpb24oaWQsIGRlYy5vdXRjb21lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdXBkYXRlUmV3cml0ZVRhbGx5KCk7XG4gIH1cbn1cblxuLyoqXG4gKiBjb21wdXRlV29yZERpZmYob3JpZ2luYWwsIHByb3Bvc2VkKSBcdTIwMTQgTENTIHdvcmQtbGV2ZWwgZGlmZi5cbiAqXG4gKiBUb2tlbmlzZXMgYm90aCBzdHJpbmdzIGJ5IHNwbGl0dGluZyBvbiB3aGl0ZXNwYWNlIGJvdW5kYXJpZXMgd2hpbGVcbiAqIHByZXNlcnZpbmcgdGhlIHdoaXRlc3BhY2UgdG9rZW5zIHNvIHRoZSByZW5kZXJlZCBkaWZmIGhhcyB0aGUgc2FtZVxuICogc3BhY2luZyBhcyB0aGUgc291cmNlIHRleHQuICBSZXR1cm5zIGFuIGFycmF5IG9mXG4gKiB7dG9rZW46IHN0cmluZywgdHlwZTogJ3VuY2hhbmdlZCd8J3JlbW92ZWQnfCdhZGRlZCd9LlxuICovXG5mdW5jdGlvbiBjb21wdXRlV29yZERpZmYob3JpZ2luYWwsIHByb3Bvc2VkKSB7XG4gIC8vIFNwbGl0IG9uIHdoaXRlc3BhY2UgYnV0IGtlZXAgdGhlIHNlcGFyYXRvcnMgYXMgdG9rZW5zLlxuICBmdW5jdGlvbiB0b2tlbml6ZShzdHIpIHsgcmV0dXJuIChzdHIgfHwgJycpLnNwbGl0KC8oXFxzKykvKTsgfVxuXG4gIGNvbnN0IGEgPSB0b2tlbml6ZShvcmlnaW5hbCk7XG4gIGNvbnN0IGIgPSB0b2tlbml6ZShwcm9wb3NlZCk7XG4gIGNvbnN0IG0gPSBhLmxlbmd0aDtcbiAgY29uc3QgbiA9IGIubGVuZ3RoO1xuXG4gIC8vIEJ1aWxkIExDUyBEUCB0YWJsZSAoTyhtKm4pIFx1MjAxNCBhY2NlcHRhYmxlIGZvciBDViBidWxsZXQgbGVuZ3RocykuXG4gIGNvbnN0IGRwID0gQXJyYXkuZnJvbSh7bGVuZ3RoOiBtICsgMX0sICgpID0+IG5ldyBBcnJheShuICsgMSkuZmlsbCgwKSk7XG4gIGZvciAobGV0IGkgPSAxOyBpIDw9IG07IGkrKykge1xuICAgIGZvciAobGV0IGogPSAxOyBqIDw9IG47IGorKykge1xuICAgICAgZHBbaV1bal0gPSBhW2kgLSAxXSA9PT0gYltqIC0gMV1cbiAgICAgICAgPyBkcFtpIC0gMV1baiAtIDFdICsgMVxuICAgICAgICA6IE1hdGgubWF4KGRwW2kgLSAxXVtqXSwgZHBbaV1baiAtIDFdKTtcbiAgICB9XG4gIH1cblxuICAvLyBCYWNrdHJhY2sgdG8gcHJvZHVjZSB0aGUgZGlmZiBzZXF1ZW5jZS5cbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGxldCBpID0gbSwgaiA9IG47XG4gIHdoaWxlIChpID4gMCB8fCBqID4gMCkge1xuICAgIGlmIChpID4gMCAmJiBqID4gMCAmJiBhW2kgLSAxXSA9PT0gYltqIC0gMV0pIHtcbiAgICAgIHJlc3VsdC51bnNoaWZ0KHt0b2tlbjogYVtpIC0gMV0sIHR5cGU6ICd1bmNoYW5nZWQnfSk7XG4gICAgICBpLS07IGotLTtcbiAgICB9IGVsc2UgaWYgKGogPiAwICYmIChpID09PSAwIHx8IGRwW2ldW2ogLSAxXSA+PSBkcFtpIC0gMV1bal0pKSB7XG4gICAgICByZXN1bHQudW5zaGlmdCh7dG9rZW46IGJbaiAtIDFdLCB0eXBlOiAnYWRkZWQnfSk7XG4gICAgICBqLS07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC51bnNoaWZ0KHt0b2tlbjogYVtpIC0gMV0sIHR5cGU6ICdyZW1vdmVkJ30pO1xuICAgICAgaS0tO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKiogUmVuZGVyIGEge3Rva2VuLCB0eXBlfSBkaWZmIGFycmF5IGludG8gYW4gSFRNTCBzdHJpbmcuICovXG5mdW5jdGlvbiByZW5kZXJEaWZmSHRtbCh0b2tlbnMpIHtcbiAgcmV0dXJuIHRva2Vucy5tYXAodCA9PiB7XG4gICAgaWYgKHQudHlwZSA9PT0gJ3JlbW92ZWQnKSByZXR1cm4gYDxkZWwgY2xhc3M9XCJkaWZmLXJlbW92ZWRcIj4ke2VzY2FwZUh0bWwodC50b2tlbil9PC9kZWw+YDtcbiAgICBpZiAodC50eXBlID09PSAnYWRkZWQnKSAgIHJldHVybiBgPGlucyBjbGFzcz1cImRpZmYtYWRkZWRcIj4ke2VzY2FwZUh0bWwodC50b2tlbil9PC9pbnM+YDtcbiAgICByZXR1cm4gZXNjYXBlSHRtbCh0LnRva2VuKTtcbiAgfSkuam9pbignJyk7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclJld3JpdGVDYXJkKHIsIGNhcmRXYXJuaW5ncyA9IFtdLCBjaGFuZ2VTdGF0dXMgPSBudWxsKSB7XG4gIGNvbnN0IGlzV2Vha1NraWxsQWRkID0gci50eXBlID09PSAnc2tpbGxfYWRkJyAmJiByLmV2aWRlbmNlX3N0cmVuZ3RoID09PSAnd2Vhayc7XG4gIGNvbnN0IHdlYWtCYWRnZSAgICAgPSBpc1dlYWtTa2lsbEFkZFxuICAgID8gYDxzcGFuIGNsYXNzPVwid2Vhay1iYWRnZVwiPlx1MjZBMCBDYW5kaWRhdGUgdG8gY29uZmlybTwvc3Bhbj5gXG4gICAgOiAnJztcbiAgY29uc3QgY2hhbmdlQmFkZ2UgICA9IGNoYW5nZVN0YXR1cyA9PT0gJ25ldydcbiAgICA/IGA8c3BhbiBjbGFzcz1cInJ3LWNoYW5nZS1iYWRnZSBydy1jaGFuZ2UtbmV3XCIgYXJpYS1sYWJlbD1cIk5ldyBzdWdnZXN0aW9uIG5vdCBpbiBwcmV2aW91cyBydW5cIj5cdUQ4M0NcdUREOTUgTmV3PC9zcGFuPmBcbiAgICA6IGNoYW5nZVN0YXR1cyA9PT0gJ3VwZGF0ZWQnXG4gICAgICA/IGA8c3BhbiBjbGFzcz1cInJ3LWNoYW5nZS1iYWRnZSBydy1jaGFuZ2UtdXBkYXRlZFwiIGFyaWEtbGFiZWw9XCJTdWdnZXN0aW9uIGNoYW5nZWQgc2luY2UgcHJldmlvdXMgcnVuXCI+XHUyMUJCIFVwZGF0ZWQ8L3NwYW4+YFxuICAgICAgOiAnJztcbiAgLy8gS2V5d29yZCBwaWxscyB3aXRoIHBvc2l0aW9uLWJhc2VkIHJhbmsgYmFkZ2UgKCMxLCAjMiwgXHUyMDI2KVxuICBjb25zdCBrZXl3b3JkUGlsbHMgID0gKHIua2V5d29yZHNfaW50cm9kdWNlZCB8fCBbXSlcbiAgICAubWFwKChrLCBpZHgpID0+IGA8c3BhbiBjbGFzcz1cInJld3JpdGUta2V5d29yZFwiPjxzcGFuIGNsYXNzPVwia3ctcmFua1wiPiMke2lkeCArIDF9PC9zcGFuPiR7ZXNjYXBlSHRtbChrKX08L3NwYW4+YClcbiAgICAuam9pbignJyk7XG4gIGNvbnN0IHR5cGVMYWJlbCA9IChyLnR5cGUgfHwgJ3Jld3JpdGUnKS5yZXBsYWNlKC9fL2csICcgJyk7XG4gIC8vIFNhbml0aXplIElEOiBrZWVwIG9ubHkgYWxwaGFudW1lcmljLCB1bmRlcnNjb3JlLCBhbmQgaHlwaGVuIHNvIGl0IGlzXG4gIC8vIHNhZmUgYXMgYm90aCBhbiBIVE1MIGF0dHJpYnV0ZSB2YWx1ZSBhbmQgYSBKUyBzdHJpbmcgbGl0ZXJhbCBpbiBvbmNsaWNrLlxuICBjb25zdCBjYXJkSWQgICAgPSBTdHJpbmcoci5pZCkucmVwbGFjZSgvW15hLXpBLVowLTlfLV0vZywgJ18nKTtcblxuICAvLyBDb21wdXRlIHdvcmQtbGV2ZWwgZGlmZiBmb3IgdGhlIGlubGluZSBkaXNwbGF5LlxuICBjb25zdCBkaWZmVG9rZW5zID0gY29tcHV0ZVdvcmREaWZmKHIub3JpZ2luYWwgfHwgJycsIHIucHJvcG9zZWQgfHwgJycpO1xuICBjb25zdCBkaWZmSHRtbCAgID0gcmVuZGVyRGlmZkh0bWwoZGlmZlRva2Vucyk7XG5cbiAgcmV0dXJuIGBcbiAgICA8ZGl2IGNsYXNzPVwicmV3cml0ZS1jYXJkXCIgaWQ9XCJydy1jYXJkLSR7Y2FyZElkfVwiPlxuICAgICAgPGRpdiBjbGFzcz1cInJld3JpdGUtY2FyZC1oZWFkZXJcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXdyaXRlLWNhcmQtdHlwZVwiPiR7ZXNjYXBlSHRtbCh0eXBlTGFiZWwpfTwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXdyaXRlLWNhcmQtdGl0bGVcIj4ke2VzY2FwZUh0bWwoci5sb2NhdGlvbiB8fCByLmlkKX08L3NwYW4+XG4gICAgICAgICR7d2Vha0JhZGdlfSR7Y2hhbmdlQmFkZ2V9XG4gICAgICAgIDxzcGFuIGlkPVwicnctZGVjaXNpb24tYmFkZ2UtJHtjYXJkSWR9XCIgYXJpYS1saXZlPVwicG9saXRlXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7Zm9udC1zaXplOjAuNzhlbTtmb250LXdlaWdodDo2MDA7cGFkZGluZzoxcHggN3B4O2JvcmRlci1yYWRpdXM6OXB4O21hcmdpbi1sZWZ0OmF1dG87XCI+PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwicmV3cml0ZS1jYXJkLWJvZHlcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJld3JpdGUtaW5saW5lLWRpZmZcIiBpZD1cInJ3LWRpZmYtJHtjYXJkSWR9XCJcbiAgICAgICAgICAgICBkYXRhLW9yaWdpbmFsPVwiJHtlc2NhcGVIdG1sKHIub3JpZ2luYWwgfHwgJycpfVwiPiR7ZGlmZkh0bWx9PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyZXdyaXRlLWFmdGVyXCIgaWQ9XCJydy1hZnRlci0ke2NhcmRJZH1cIiBzdHlsZT1cImRpc3BsYXk6bm9uZVwiPlxuICAgICAgICAgIDxzcGFuIGlkPVwicnctYWZ0ZXItdGV4dC0ke2NhcmRJZH1cIj4ke2VzY2FwZUh0bWwoci5wcm9wb3NlZCB8fCAnJyl9PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgJHtrZXl3b3JkUGlsbHMgPyBgPGRpdiBjbGFzcz1cInJld3JpdGUta2V5d29yZHNcIj4ke2tleXdvcmRQaWxsc308L2Rpdj5gIDogJyd9XG4gICAgICAgICR7ci5yYXRpb25hbGUgPyBgXG4gICAgICAgIDxkZXRhaWxzIGNsYXNzPVwicmV3cml0ZS1yYXRpb25hbGVcIj5cbiAgICAgICAgICA8c3VtbWFyeT5SYXRpb25hbGUgJmFtcDsgRXZpZGVuY2U8L3N1bW1hcnk+XG4gICAgICAgICAgPHAgc3R5bGU9XCJtYXJnaW46NnB4IDAgMDtcIj4ke2VzY2FwZUh0bWwoci5yYXRpb25hbGUpfTwvcD5cbiAgICAgICAgICAke3IuZXZpZGVuY2UgPyBgPHAgc3R5bGU9XCJjb2xvcjojOWNhM2FmO2ZvbnQtc2l6ZTowLjg1ZW07bWFyZ2luOjRweCAwIDA7XCI+JHtlc2NhcGVIdG1sKHIuZXZpZGVuY2UpfTwvcD5gIDogJyd9XG4gICAgICAgIDwvZGV0YWlscz5gIDogJyd9XG4gICAgICAgICR7Y2FyZFdhcm5pbmdzLmxlbmd0aCA+IDAgPyBgXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyZXdyaXRlLXBlcnN1YXNpb24tYmFkZ2VzXCI+XG4gICAgICAgICAgJHtjYXJkV2FybmluZ3MubWFwKHcgPT4gYDxzcGFuIGNsYXNzPVwicGVyc3Vhc2lvbi1iYWRnZSBwZXJzdWFzaW9uLWJhZGdlLS0ke3cuc2V2ZXJpdHl9XCIgdGl0bGU9XCIke2VzY2FwZUh0bWwody5kZXRhaWxzKX1cIj5cdTI2QTAgJHtlc2NhcGVIdG1sKHcuZmxhZ190eXBlLnJlcGxhY2UoL18vZywgJyAnKSl9PC9zcGFuPmApLmpvaW4oJycpfVxuICAgICAgICA8L2Rpdj5gIDogJyd9XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyZXdyaXRlLWFjdGlvbnNcIj5cbiAgICAgICAgICA8YSBjbGFzcz1cInJ3LWJhY2stbGlua1wiIGhyZWY9XCIjXCIgb25jbGljaz1cImV2ZW50LnByZXZlbnREZWZhdWx0KCk7IHN3aXRjaFRhYignY3VzdG9taXphdGlvbnMnKVwiIHRpdGxlPVwiR28gYmFjayB0byBDdXN0b21pc2UgdG8gcmVjb25zaWRlciB3aGV0aGVyIHRvIGluY2x1ZGUgdGhpcyBjb250ZW50XCI+XHUyMUE5IFJlY29uc2lkZXIgaW5jbHVzaW9uPC9hPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJydy1idG4gYWNjZXB0XCIgaWQ9XCJydy1hY2NlcHQtJHtjYXJkSWR9XCIgYXJpYS1wcmVzc2VkPVwiZmFsc2VcIiBvbmNsaWNrPVwiYXBwbHlSZXdyaXRlQWN0aW9uKCcke2NhcmRJZH0nLCAnYWNjZXB0JylcIj5cdTI3MTMgQWNjZXB0PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInJ3LWJ0biBlZGl0XCIgICBpZD1cInJ3LWVkaXQtJHtjYXJkSWR9XCIgICBhcmlhLXByZXNzZWQ9XCJmYWxzZVwiIG9uY2xpY2s9XCJhcHBseVJld3JpdGVBY3Rpb24oJyR7Y2FyZElkfScsICdlZGl0JylcIj5cdTI3MEUgRWRpdDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJydy1idG4gcmVqZWN0XCIgaWQ9XCJydy1yZWplY3QtJHtjYXJkSWR9XCIgYXJpYS1wcmVzc2VkPVwiZmFsc2VcIiBvbmNsaWNrPVwiYXBwbHlSZXdyaXRlQWN0aW9uKCcke2NhcmRJZH0nLCAncmVqZWN0JylcIj5cdTI3MTcgUmVqZWN0PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+YDtcbn1cblxuZnVuY3Rpb24gYXBwbHlSZXdyaXRlQWN0aW9uKGlkLCBvdXRjb21lKSB7XG4gIGNvbnN0IGNhcmQgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcnctY2FyZC0ke2lkfWApO1xuICBjb25zdCBhZnRlckVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHJ3LWFmdGVyLSR7aWR9YCk7XG4gIGNvbnN0IGRpZmZFbCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcnctZGlmZi0ke2lkfWApO1xuICBpZiAoIWNhcmQgfHwgIWFmdGVyRWwpIHJldHVybjtcblxuICAvLyBDbGVhciBhbnkgcHJldmlvdXMgb3V0Y29tZSBzdHlsaW5nXG4gIGNhcmQuY2xhc3NMaXN0LnJlbW92ZSgnYWNjZXB0ZWQnLCAncmVqZWN0ZWQnKTtcbiAgWydhY2NlcHQnLCAnZWRpdCcsICdyZWplY3QnXS5mb3JFYWNoKGEgPT4ge1xuICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBydy0ke2F9LSR7aWR9YCk7XG4gICAgYnRuPy5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICBpZiAoYnRuKSBidG4uc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCAnZmFsc2UnKTtcbiAgfSk7XG4gIGNvbnN0IF9kZWNpc2lvbkJhZGdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHJ3LWRlY2lzaW9uLWJhZGdlLSR7aWR9YCk7XG4gIGlmIChfZGVjaXNpb25CYWRnZSkgX2RlY2lzaW9uQmFkZ2Uuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICBpZiAob3V0Y29tZSA9PT0gJ2VkaXQnKSB7XG4gICAgLy8gS2VlcCB0aGUgaW5saW5lIGRpZmYgdmlzaWJsZSBhcyBhIHJlZmVyZW5jZTsgc2hvdyB0aGUgZWRpdGFibGUgdGV4dGFyZWEgYmVsb3cgaXQuXG4gICAgY29uc3QgY3VycmVudFRleHQgPSBhZnRlckVsLnF1ZXJ5U2VsZWN0b3IoYCNydy1hZnRlci10ZXh0LSR7aWR9YCk/LnRleHRDb250ZW50XG4gICAgICAgICAgICAgICAgICAgICA/PyByZXdyaXRlRGVjaXNpb25zW2lkXT8uZmluYWxfdGV4dFxuICAgICAgICAgICAgICAgICAgICAgPz8gJyc7XG4gICAgaWYgKGRpZmZFbCkge1xuICAgICAgZGlmZkVsLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIGRpZmZFbC5zdHlsZS5vcGFjaXR5ID0gJzAuNTUnO1xuICAgICAgZGlmZkVsLnN0eWxlLmJvcmRlckxlZnQgPSAnM3B4IHNvbGlkICM5M2M1ZmQnO1xuICAgIH1cbiAgICBhZnRlckVsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgIGFmdGVyRWwuaW5uZXJIVE1MID0gYFxuICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjc4ZW07Y29sb3I6IzZiNzI4MDttYXJnaW4tYm90dG9tOjRweDtcIj5cdTI3MEUgWW91ciBlZGl0IChBSSBzdWdnZXN0aW9uIHNob3duIGFib3ZlIGZvciByZWZlcmVuY2UpOjwvZGl2PlxuICAgICAgPHRleHRhcmVhIGlkPVwicnctdGV4dGFyZWEtJHtpZH1cIj4ke2VzY2FwZUh0bWwoY3VycmVudFRleHQpfTwvdGV4dGFyZWE+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwicnctc2F2ZS1lZGl0LWJ0blwiIHN0eWxlPVwibWFyZ2luLXRvcDo2cHhcIlxuICAgICAgICAgICAgICBvbmNsaWNrPVwic2F2ZVJld3JpdGVFZGl0KCcke2lkfScpXCI+U2F2ZTwvYnV0dG9uPlxuICAgIGA7XG4gICAgY29uc3QgZWRpdEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBydy1lZGl0LSR7aWR9YCk7XG4gICAgZWRpdEJ0bj8uY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgaWYgKGVkaXRCdG4pIGVkaXRCdG4uc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCAndHJ1ZScpO1xuICAgIC8vIERlY2lzaW9uIGlzIHJlY29yZGVkIG9ubHkgd2hlbiB0aGUgdXNlciBjbGlja3MgU2F2ZVxuICB9IGVsc2Uge1xuICAgIC8vIFJlc3RvcmUgdGhlIGFmdGVyLXRleHQgc3BhbiBpZiB3ZSBwcmV2aW91c2x5IGVudGVyZWQgZWRpdCBtb2RlXG4gICAgY29uc3QgdGV4dGFyZWEgPSBhZnRlckVsLnF1ZXJ5U2VsZWN0b3IoJ3RleHRhcmVhJyk7XG4gICAgaWYgKHRleHRhcmVhKSB7XG4gICAgICBjb25zdCB0eHQgPSB0ZXh0YXJlYS52YWx1ZTtcbiAgICAgIGFmdGVyRWwuaW5uZXJIVE1MID0gYDxzcGFuIGlkPVwicnctYWZ0ZXItdGV4dC0ke2lkfVwiPiR7ZXNjYXBlSHRtbCh0eHQpfTwvc3Bhbj5gO1xuICAgIH1cbiAgICAvLyBSZS1zaG93IHRoZSBpbmxpbmUgZGlmZiBwYW5lbCBhdCBmdWxsIG9wYWNpdHk7IGhpZGUgdGhlIGVkaXQgYXJlYS5cbiAgICBpZiAoZGlmZkVsKSB7IGRpZmZFbC5zdHlsZS5kaXNwbGF5ID0gJyc7IGRpZmZFbC5zdHlsZS5vcGFjaXR5ID0gJyc7IGRpZmZFbC5zdHlsZS5ib3JkZXJMZWZ0ID0gJyc7IH1cbiAgICBhZnRlckVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICByZXdyaXRlRGVjaXNpb25zW2lkXSA9IHsgb3V0Y29tZSwgZmluYWxfdGV4dDogbnVsbCB9O1xuICAgIF9wZXJzaXN0RGVjaXNpb25zKCk7XG4gICAgY2FyZC5jbGFzc0xpc3QuYWRkKG91dGNvbWUgPT09ICdhY2NlcHQnID8gJ2FjY2VwdGVkJyA6ICdyZWplY3RlZCcpO1xuICAgIGNvbnN0IGFjdGl2ZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBydy0ke291dGNvbWV9LSR7aWR9YCk7XG4gICAgYWN0aXZlQnRuPy5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICBpZiAoYWN0aXZlQnRuKSBhY3RpdmVCdG4uc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCAndHJ1ZScpO1xuICAgIGNvbnN0IGRlY0JhZGdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHJ3LWRlY2lzaW9uLWJhZGdlLSR7aWR9YCk7XG4gICAgaWYgKGRlY0JhZGdlKSB7XG4gICAgICBkZWNCYWRnZS50ZXh0Q29udGVudCA9IG91dGNvbWUgPT09ICdhY2NlcHQnID8gJ1x1MjcxMyBBY2NlcHRlZCcgOiAnXHUyNzE3IFJlamVjdGVkJztcbiAgICAgIGRlY0JhZGdlLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIGRlY0JhZGdlLnN0eWxlLmJhY2tncm91bmQgPSBvdXRjb21lID09PSAnYWNjZXB0JyA/ICcjYmJmN2QwJyA6ICcjZmVjYWNhJztcbiAgICAgIGRlY0JhZGdlLnN0eWxlLmNvbG9yICAgICAgPSBvdXRjb21lID09PSAnYWNjZXB0JyA/ICcjMDY1ZjQ2JyA6ICcjOTkxYjFiJztcbiAgICB9XG4gICAgc3luY1Jld3JpdGVHbG9iYWxzKCk7XG4gICAgdXBkYXRlUmV3cml0ZVRhbGx5KCk7XG4gICAgX3Njcm9sbFRvTmV4dFBlbmRpbmdSZXdyaXRlKGlkKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfc2Nyb2xsVG9OZXh0UGVuZGluZ1Jld3JpdGUoYWZ0ZXJJZCkge1xuICBjb25zdCBhbGxDYXJkcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tpZF49XCJydy1jYXJkLVwiXScpO1xuICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBjYXJkIG9mIGFsbENhcmRzKSB7XG4gICAgY29uc3QgaWQgPSBjYXJkLmlkLnJlcGxhY2UoJ3J3LWNhcmQtJywgJycpO1xuICAgIGlmIChpZCA9PT0gYWZ0ZXJJZCkgeyBmb3VuZCA9IHRydWU7IGNvbnRpbnVlOyB9XG4gICAgaWYgKCFmb3VuZCkgY29udGludWU7XG4gICAgaWYgKCFyZXdyaXRlRGVjaXNpb25zW2lkXSkge1xuICAgICAgY2FyZC5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJywgYmxvY2s6ICdjZW50ZXInIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzYXZlUmV3cml0ZUVkaXQoaWQpIHtcbiAgY29uc3QgdGV4dGFyZWEgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBydy10ZXh0YXJlYS0ke2lkfWApO1xuICBjb25zdCBlZGl0ZWRUZXh0ID0gdGV4dGFyZWEgPyB0ZXh0YXJlYS52YWx1ZSA6ICcnO1xuICBjb25zdCBhZnRlckVsICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHJ3LWFmdGVyLSR7aWR9YCk7XG4gIGNvbnN0IGRpZmZFbCAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcnctZGlmZi0ke2lkfWApO1xuICBjb25zdCBjYXJkICAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHJ3LWNhcmQtJHtpZH1gKTtcbiAgaWYgKCFhZnRlckVsIHx8ICFjYXJkKSByZXR1cm47XG5cbiAgLy8gUmVwbGFjZSB0ZXh0YXJlYSB3aXRoIGZpbmFsIHNwYW4gKGhpZGRlbiBcdTIwMTQgcHJlc2VydmVzIHRleHQgZm9yIGZ1dHVyZSBlZGl0cykuXG4gIGFmdGVyRWwuaW5uZXJIVE1MID0gYDxzcGFuIGlkPVwicnctYWZ0ZXItdGV4dC0ke2lkfVwiPiR7ZXNjYXBlSHRtbChlZGl0ZWRUZXh0KX08L3NwYW4+YDtcbiAgYWZ0ZXJFbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gIC8vIFJlZ2VuZXJhdGUgdGhlIGlubGluZSBkaWZmIGFnYWluc3QgdGhlIG9yaWdpbmFsIHRleHQgYW5kIHJlLXNob3cgaXQgKGZ1bGwgb3BhY2l0eSkuXG4gIGlmIChkaWZmRWwpIHtcbiAgICBjb25zdCBvcmlnaW5hbCA9IGRpZmZFbC5kYXRhc2V0Lm9yaWdpbmFsIHx8ICcnO1xuICAgIGRpZmZFbC5pbm5lckhUTUwgPSByZW5kZXJEaWZmSHRtbChjb21wdXRlV29yZERpZmYob3JpZ2luYWwsIGVkaXRlZFRleHQpKTtcbiAgICBkaWZmRWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgIGRpZmZFbC5zdHlsZS5vcGFjaXR5ID0gJyc7XG4gICAgZGlmZkVsLnN0eWxlLmJvcmRlckxlZnQgPSAnJztcbiAgfVxuXG4gIHJld3JpdGVEZWNpc2lvbnNbaWRdID0geyBvdXRjb21lOiAnZWRpdCcsIGZpbmFsX3RleHQ6IGVkaXRlZFRleHQgfTtcbiAgX3BlcnNpc3REZWNpc2lvbnMoKTtcbiAgY2FyZC5jbGFzc0xpc3QucmVtb3ZlKCdyZWplY3RlZCcpO1xuICBjYXJkLmNsYXNzTGlzdC5hZGQoJ2FjY2VwdGVkJyk7XG4gIFsnYWNjZXB0JywgJ3JlamVjdCddLmZvckVhY2goYSA9PiB7XG4gICAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHJ3LSR7YX0tJHtpZH1gKTtcbiAgICBidG4/LmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgIGlmIChidG4pIGJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsICdmYWxzZScpO1xuICB9KTtcbiAgY29uc3Qgc2F2ZUVkaXRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcnctZWRpdC0ke2lkfWApO1xuICBzYXZlRWRpdEJ0bj8uY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gIGlmIChzYXZlRWRpdEJ0bikgc2F2ZUVkaXRCdG4uc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCAndHJ1ZScpO1xuICBjb25zdCBlZGl0RGVjQmFkZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcnctZGVjaXNpb24tYmFkZ2UtJHtpZH1gKTtcbiAgaWYgKGVkaXREZWNCYWRnZSkge1xuICAgIGVkaXREZWNCYWRnZS50ZXh0Q29udGVudCA9ICdcdTI3MTMgQWNjZXB0ZWQgKGVkaXRlZCknO1xuICAgIGVkaXREZWNCYWRnZS5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgZWRpdERlY0JhZGdlLnN0eWxlLmJhY2tncm91bmQgPSAnI2JiZjdkMCc7XG4gICAgZWRpdERlY0JhZGdlLnN0eWxlLmNvbG9yICAgICAgPSAnIzA2NWY0Nic7XG4gIH1cbiAgc3luY1Jld3JpdGVHbG9iYWxzKCk7XG4gIHVwZGF0ZVJld3JpdGVUYWxseSgpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVSZXdyaXRlVGFsbHkoKSB7XG4gIGNvbnN0IGNhcmRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnJld3JpdGUtY2FyZCcpO1xuICBsZXQgYWNjZXB0ZWQgPSAwLCByZWplY3RlZCA9IDAsIHBlbmRpbmcgPSAwO1xuICBjYXJkcy5mb3JFYWNoKGNhcmQgPT4ge1xuICAgIGNvbnN0IGlkICA9IGNhcmQuaWQucmVwbGFjZSgncnctY2FyZC0nLCAnJyk7XG4gICAgY29uc3QgZGVjID0gcmV3cml0ZURlY2lzaW9uc1tpZF07XG4gICAgaWYgICAgICAoIWRlYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZysrO1xuICAgIGVsc2UgaWYgKGRlYy5vdXRjb21lID09PSAnYWNjZXB0JyB8fCBkZWMub3V0Y29tZSA9PT0gJ2VkaXQnKSBhY2NlcHRlZCsrO1xuICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdGVkKys7XG4gIH0pO1xuXG4gIGNvbnN0IGFjY2VwdGVkRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFsbHktYWNjZXB0ZWQnKTtcbiAgY29uc3QgcmVqZWN0ZWRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWxseS1yZWplY3RlZCcpO1xuICBjb25zdCBwZW5kaW5nRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFsbHktcGVuZGluZycpO1xuXG4gIGlmIChhY2NlcHRlZEVsKSBhY2NlcHRlZEVsLnRleHRDb250ZW50ID0gYWNjZXB0ZWQ7XG4gIGlmIChyZWplY3RlZEVsKSByZWplY3RlZEVsLnRleHRDb250ZW50ID0gcmVqZWN0ZWQ7XG4gIGlmIChwZW5kaW5nRWwpIHBlbmRpbmdFbC50ZXh0Q29udGVudCAgPSBwZW5kaW5nO1xuXG4gIGNvbnN0IHN1Ym1pdEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdWJtaXQtcmV3cml0ZXMtYnRuJyk7XG4gIGlmIChzdWJtaXRCdG4pIHtcbiAgICBjb25zdCBuZWVkc0FjayA9ICFwZXJzdWFzaW9uV2FybmluZ3NBY2tub3dsZWRnZWQ7XG4gICAgc3VibWl0QnRuLmRpc2FibGVkID0gKHBlbmRpbmcgPiAwKSB8fCBuZWVkc0FjaztcbiAgICBzdWJtaXRCdG4udGl0bGUgPSBuZWVkc0Fja1xuICAgICAgPyAnQWNrbm93bGVkZ2UgdGhlIHBlcnN1YXNpb24gd2FybmluZ3MgYWJvdmUgYmVmb3JlIHN1Ym1pdHRpbmcnXG4gICAgICA6ICcnO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN1Ym1pdFJld3JpdGVEZWNpc2lvbnMoKSB7XG4gIGlmICghcGVyc3Vhc2lvbldhcm5pbmdzQWNrbm93bGVkZ2VkKSB7XG4gICAgY29uc3QgcHJvY2VlZCA9IGF3YWl0IHNob3dDb25maXJtTW9kYWwoXG4gICAgICAnXHUyNkEwXHVGRTBGIFBlcnN1YXNpb24gQ2hlY2tzJyxcbiAgICAgICdUaGVyZSBhcmUgdW5hY2tub3dsZWRnZWQgcGVyc3Vhc2lvbiB3YXJuaW5ncy4gSXQgaXMgcmVjb21tZW5kZWQgeW91IHJldmlldyBhbmQgYWNrbm93bGVkZ2UgdGhlbSBmaXJzdC5cXG5cXG5Qcm9jZWVkIGFueXdheT8nLFxuICAgICAgJ1N1Ym1pdCBBbnl3YXknXG4gICAgKTtcbiAgICBpZiAoIXByb2NlZWQpIHJldHVybjtcbiAgfVxuICAvKiBkdWNrZmxvdzpcbiAgICogICBpZDogcmV3cml0ZV91aV9zdWJtaXRfbGl2ZVxuICAgKiAgIGtpbmQ6IHVpXG4gICAqICAgdGltZXN0YW1wOiAnMjAyNi0wMy0yNVQyMTozOTo0OFonXG4gICAqICAgc3RhdHVzOiBsaXZlXG4gICAqICAgaGFuZGxlczpcbiAgICogICAtIHVpOnJld3JpdGUtcmV2aWV3LnN1Ym1pdFxuICAgKiAgIGNhbGxzOlxuICAgKiAgIC0gUE9TVCAvYXBpL3Jld3JpdGVzL2FwcHJvdmVcbiAgICogICAtIFBPU1QgL2FwaS9jdi9sYXlvdXQtZXN0aW1hdGVcbiAgICogICByZWFkczpcbiAgICogICAtIHdpbmRvdzpyZXdyaXRlRGVjaXNpb25zXG4gICAqICAgd3JpdGVzOlxuICAgKiAgIC0gcmVxdWVzdDpQT1NUIC9hcGkvcmV3cml0ZXMvYXBwcm92ZS5kZWNpc2lvbnNcbiAgICogICBub3RlczogU3VibWl0cyB0aGUgZmluYWwgcGVyLXJld3JpdGUgb3V0Y29tZXMgYW5kIGVkaXRlZCB0ZXh0IHNvIGJhY2tlbmQgc3RhdGUgY2FuIHBlcnNpc3QgYXBwcm92ZWQgcmV3cml0ZXMgYW5kIHRoZSBmdWxsIHJld3JpdGUgYXVkaXQgYmVmb3JlIHNwZWxsLWNoZWNrLlxuICAgKi9cbiAgY29uc3QgZGVjaXNpb25zID0gT2JqZWN0LmVudHJpZXMocmV3cml0ZURlY2lzaW9ucykubWFwKChbaWQsIGRlY10pID0+ICh7XG4gICAgaWQsXG4gICAgb3V0Y29tZTogICAgZGVjLm91dGNvbWUsXG4gICAgZmluYWxfdGV4dDogZGVjLmZpbmFsX3RleHQgPz8gbnVsbFxuICB9KSk7XG5cbiAgY29uc3QgbG9hZGluZ01zZyA9IGFwcGVuZExvYWRpbmdNZXNzYWdlKCdTdWJtaXR0aW5nIHJld3JpdGUgZGVjaXNpb25zLi4uJyk7XG4gIHNldExvYWRpbmcodHJ1ZSwgJ1N1Ym1pdHRpbmcgcmV3cml0ZSBkZWNpc2lvbnNcdTIwMjYnKTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9yZXdyaXRlcy9hcHByb3ZlJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgZGVjaXNpb25zIH0pXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgcmVtb3ZlTG9hZGluZ01lc3NhZ2UobG9hZGluZ01zZyk7XG4gICAgc2V0TG9hZGluZyhmYWxzZSk7XG5cbiAgICBpZiAoIXJlcy5vaykge1xuICAgICAgYXBwZW5kUmV0cnlNZXNzYWdlKCdcdTI3NEMgRXJyb3I6ICcgKyAoZGF0YS5lcnJvciB8fCAnRmFpbGVkIHRvIHN1Ym1pdCByZXdyaXRlIGRlY2lzaW9ucycpLCBzdWJtaXRSZXdyaXRlRGVjaXNpb25zKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBhY2NlcHRlZCA9IGRhdGEuYXBwcm92ZWRfY291bnQgfHwgMDtcbiAgICBjb25zdCByZWplY3RlZCA9IGRhdGEucmVqZWN0ZWRfY291bnQgfHwgMDtcbiAgICBzdGF0ZU1hbmFnZXIubWFya0NvbnRlbnRDaGFuZ2VkKCk7XG4gICAgX2NsZWFyUGVyc2lzdGVkRGVjaXNpb25zKCk7XG4gICAgX2NsZWFyUmV3cml0ZVNuYXBzaG90KCk7XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgYFx1MjcwNSBSZXdyaXRlIGRlY2lzaW9ucyByZWNvcmRlZDogJHthY2NlcHRlZH0gYWNjZXB0ZWQsICR7cmVqZWN0ZWR9IHJlamVjdGVkLiBTdGFydGluZyBzcGVsbCBjaGVja1x1MjAyNmApO1xuICAgIHNjaGVkdWxlQXRzUmVmcmVzaCgncmV2aWV3X2NoZWNrcG9pbnQnKTtcbiAgICBzd2l0Y2hUYWIoJ3NwZWxsJyk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJlbW92ZUxvYWRpbmdNZXNzYWdlKGxvYWRpbmdNc2cpO1xuICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgIGFwcGVuZFJldHJ5TWVzc2FnZSgnXHUyNzRDIEVycm9yOiAnICsgZXJyLm1lc3NhZ2UsIHN1Ym1pdFJld3JpdGVEZWNpc2lvbnMpO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFeHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuZnVuY3Rpb24gc2V0UGVyc3Vhc2lvbldhcm5pbmdzQWNrbm93bGVkZ2VkKHZhbHVlKSB7XG4gIHBlcnN1YXNpb25XYXJuaW5nc0Fja25vd2xlZGdlZCA9IHZhbHVlO1xufVxuXG4vKiogQnVsay1hY2NlcHQgYWxsIHBlbmRpbmcgcmV3cml0ZSBjYXJkcy4gKi9cbmZ1bmN0aW9uIGFjY2VwdEFsbFJld3JpdGVzKCkge1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucmV3cml0ZS1jYXJkJykuZm9yRWFjaChjYXJkID0+IHtcbiAgICBjb25zdCBpZCA9IGNhcmQuaWQucmVwbGFjZSgncnctY2FyZC0nLCAnJyk7XG4gICAgaWYgKCFyZXdyaXRlRGVjaXNpb25zW2lkXSkgYXBwbHlSZXdyaXRlQWN0aW9uKGlkLCAnYWNjZXB0Jyk7XG4gIH0pO1xuICB1cGRhdGVSZXdyaXRlVGFsbHkoKTtcbn1cblxuLyoqIEJ1bGstcmVqZWN0IGFsbCBwZW5kaW5nIHJld3JpdGUgY2FyZHMuICovXG5mdW5jdGlvbiByZWplY3RBbGxSZXdyaXRlcygpIHtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnJld3JpdGUtY2FyZCcpLmZvckVhY2goY2FyZCA9PiB7XG4gICAgY29uc3QgaWQgPSBjYXJkLmlkLnJlcGxhY2UoJ3J3LWNhcmQtJywgJycpO1xuICAgIGlmICghcmV3cml0ZURlY2lzaW9uc1tpZF0pIGFwcGx5UmV3cml0ZUFjdGlvbihpZCwgJ3JlamVjdCcpO1xuICB9KTtcbiAgdXBkYXRlUmV3cml0ZVRhbGx5KCk7XG59XG5cbi8qKiBUb2dnbGUgY29tcGFjdCAoc2luZ2xlLWxpbmUpIGNhcmQgZGlzcGxheSBmb3IgcmFwaWQgcmV2aWV3LiAqL1xuZnVuY3Rpb24gdG9nZ2xlUmV3cml0ZUNvbXBhY3RNb2RlKCkge1xuICBjb25zdCBjYXJkcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXdyaXRlLWNhcmRzJyk7XG4gIGNvbnN0IGJ0biAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3J3LWNvbXBhY3QtYnRuJyk7XG4gIGlmICghY2FyZHMpIHJldHVybjtcbiAgY29uc3QgaXNDb21wYWN0ID0gY2FyZHMuY2xhc3NMaXN0LnRvZ2dsZSgnY29tcGFjdC1tb2RlJyk7XG4gIGlmIChidG4pIHtcbiAgICBidG4uY2xhc3NMaXN0LnRvZ2dsZSgnYWN0aXZlJywgaXNDb21wYWN0KTtcbiAgICBidG4udGV4dENvbnRlbnQgPSBpc0NvbXBhY3QgPyAnXHUyMjlGIEZ1bGwgVmlldycgOiAnXHUyMjlFIENvbXBhY3QnO1xuICAgIGJ0bi50aXRsZSA9IGlzQ29tcGFjdCA/ICdTd2l0Y2ggdG8gZnVsbCBjYXJkIHZpZXcnIDogJ1N3aXRjaCB0byBjb21wYWN0IHNpbmdsZS1saW5lIHZpZXcgZm9yIHJhcGlkIHJldmlldyc7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgcmV3cml0ZURlY2lzaW9ucyxcbiAgX3Jld3JpdGVQYW5lbENhY2hlLFxuICBwZXJzdWFzaW9uV2FybmluZ3NBY2tub3dsZWRnZWQsXG4gIHNldFBlcnN1YXNpb25XYXJuaW5nc0Fja25vd2xlZGdlZCxcbiAgZmV0Y2hBbmRSZXZpZXdSZXdyaXRlcyxcbiAgcmVuZGVyUmV3cml0ZVBhbmVsLFxuICBjb21wdXRlV29yZERpZmYsXG4gIHJlbmRlckRpZmZIdG1sLFxuICByZW5kZXJSZXdyaXRlQ2FyZCxcbiAgYXBwbHlSZXdyaXRlQWN0aW9uLFxuICBzYXZlUmV3cml0ZUVkaXQsXG4gIHVwZGF0ZVJld3JpdGVUYWxseSxcbiAgc3VibWl0UmV3cml0ZURlY2lzaW9ucyxcbiAgYWNjZXB0QWxsUmV3cml0ZXMsXG4gIHJlamVjdEFsbFJld3JpdGVzLFxuICB0b2dnbGVSZXdyaXRlQ29tcGFjdE1vZGUsXG59O1xuXG5zeW5jUmV3cml0ZUdsb2JhbHMoKTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL3NwZWxsLWNoZWNrLmpzXG4gKiBTcGVsbCAmIGdyYW1tYXIgY2hlY2sgdGFiOiBmZXRjaCBzZWN0aW9ucywgcmVuZGVyIHN1Z2dlc3Rpb25zLFxuICogYXBwbHkvZGlzbWlzcyBjb3JyZWN0aW9ucywgc3VibWl0IGF1ZGl0LlxuICpcbiAqIERlcGVuZGVuY2llcyAocmVzb2x2ZWQgdGhyb3VnaCBnbG9iYWxUaGlzIGF0IHJ1bnRpbWUpOlxuICogICBlc2NhcGVIdG1sLCBhcHBlbmRMb2FkaW5nTWVzc2FnZSwgcmVtb3ZlTG9hZGluZ01lc3NhZ2UsIGFwcGVuZE1lc3NhZ2UsXG4gKiAgIHNob3dBbGVydE1vZGFsLCBzaG93Q29uZmlybU1vZGFsLCBzZXRMb2FkaW5nLCBmZXRjaFN0YXR1cywgc2VuZEFjdGlvbixcbiAqICAgc2NoZWR1bGVBdHNSZWZyZXNoLCBDU1NcbiAqL1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5jb25zdCBsb2cgPSBnZXRMb2dnZXIoJ3NwZWxsLWNoZWNrJyk7XG5cbmltcG9ydCB7IHN0YXRlTWFuYWdlciB9IGZyb20gJy4vc3RhdGUtbWFuYWdlci5qcyc7XG5cbi8vIE1vZHVsZS1sZXZlbCBzdGF0ZVxubGV0IHNwZWxsQXVkaXQgPSBbXTtcbmxldCBfc3BlbGxDaGVja0NhY2hlID0gbnVsbDtcblxuLy8gXHUyNTAwXHUyNTAwIFBvcHVsYXRlIHNwZWxsLWNoZWNrIHRhYiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gcG9wdWxhdGVTcGVsbENoZWNrVGFiKCkge1xuICAvLyBJZiB3ZSBoYXZlIGNhY2hlZCByZXN1bHRzIGZyb20gYSBwcmV2aW91cyBydW4sIHJlLXJlbmRlciBmcm9tIGNhY2hlXG4gIC8vIGluc3RlYWQgb2YgcmUtcnVubmluZyBMYW5ndWFnZVRvb2wgb24gZXZlcnkgYmFjay1uYXZpZ2F0aW9uLlxuICBpZiAod2luZG93Ll9zcGVsbENoZWNrQ2FjaGUpIHtcbiAgICBjb25zdCBjID0gd2luZG93Ll9zcGVsbENoZWNrQ2FjaGU7XG4gICAgaWYgKGMudHlwZSA9PT0gJ3plcm8nKSB7XG4gICAgICByZW5kZXJTcGVsbENoZWNrWmVyb1N0YXRlKGMubWVzc2FnZSwgYy5zdGF0c0xpbmUsIGMuY3VzdG9tRGljdFNpemUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgICAgICA8aDE+XHVEODNEXHVERDI0IFNwZWxsICZhbXA7IEdyYW1tYXIgQ2hlY2s8L2gxPlxuICAgICAgICA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7bWFyZ2luLWJvdHRvbToyNHB4O1wiPlJldmlldyBzcGVsbGluZyBhbmQgZ3JhbW1hciBzdWdnZXN0aW9ucy48L3A+XG4gICAgICAgIDxkaXYgaWQ9XCJzcGVsbC1yZXN1bHRzXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+PC9kaXY+XG4gICAgICBgO1xuICAgICAgcmVuZGVyU3BlbGxTdWdnZXN0aW9ucyhjLmZsYWdnZWRTZWN0aW9ucywgYy50b3RhbFNlY3Rpb25zLCBjLnN0YXRzLCBjLmN1c3RvbURpY3RTaXplKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgIDxoMT5cdUQ4M0RcdUREMjQgU3BlbGwgJmFtcDsgR3JhbW1hciBDaGVjazwvaDE+XG4gICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO21hcmdpbi1ib3R0b206MjRweDtcIj5DaGVja2luZyBDViBzZWN0aW9ucyBmb3Igc3BlbGxpbmcgYW5kIGdyYW1tYXIgaXNzdWVzXHUyMDI2PC9wPlxuICAgIDxkaXYgaWQ9XCJzcGVsbC1sb2FkaW5nXCIgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjtwYWRkaW5nOjQwcHg7XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibG9hZGluZy1zcGlubmVyXCI+PC9kaXY+XG4gICAgICA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7bWFyZ2luLXRvcDoxMnB4O1wiPlJ1bm5pbmcgTGFuZ3VhZ2VUb29sIGNoZWNrc1x1MjAyNjwvcD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGlkPVwic3BlbGwtcmVzdWx0c1wiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPjwvZGl2PlxuICBgO1xuICBzcGVsbEF1ZGl0ID0gW107XG4gIHdpbmRvdy5fc3BlbGxTdWdNYXAgPSB7fTtcblxuICB0cnkge1xuICAgIC8vIEZldGNoIHNlY3Rpb25zIHRvIGNoZWNrXG4gICAgY29uc3Qgc2VjdGlvbnNSZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9zcGVsbC1jaGVjay1zZWN0aW9ucycpO1xuICAgIGNvbnN0IHNlY3Rpb25zRGF0YSA9IGF3YWl0IHNlY3Rpb25zUmVzLmpzb24oKTtcbiAgICBpZiAoIXNlY3Rpb25zRGF0YS5vaykge1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NwZWxsLWxvYWRpbmcnKS5pbm5lckhUTUwgPSBgPHAgY2xhc3M9XCJlcnJvci1tZXNzYWdlXCI+RmFpbGVkIHRvIGxvYWQgc2VjdGlvbnM6ICR7c2VjdGlvbnNEYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yJ308L3A+YDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZWN0aW9ucyA9IHNlY3Rpb25zRGF0YS5zZWN0aW9ucyB8fCBbXTtcbiAgICBpZiAoc2VjdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZW5kZXJTcGVsbENoZWNrWmVyb1N0YXRlKCdObyBDViBzZWN0aW9ucyBhcmUgYXZhaWxhYmxlIHRvIGNoZWNrLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGVhY2ggc2VjdGlvblxuICAgIGNvbnN0IGZsYWdnZWRTZWN0aW9ucyA9IFtdO1xuICAgIGNvbnN0IGFnZ3JlZ2F0ZVN0YXRzID0gc2VjdGlvbnNEYXRhLmFnZ3JlZ2F0ZV9zdGF0cyB8fCB7fTtcbiAgICBsZXQgaW5jb3JyZWN0V29yZHMgPSAwO1xuICAgIGxldCBncmFtbWFySXNzdWVzID0gMDtcbiAgICBsZXQgY3VzdG9tRGljdFNpemUgPSBzZWN0aW9uc0RhdGEuY3VzdG9tX2RpY3Rfc2l6ZSB8fCAwO1xuICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBzZWN0aW9ucykge1xuICAgICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL3NwZWxsLWNoZWNrJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgdGV4dDogc2VjdGlvbi50ZXh0LCBjb250ZXh0OiBzZWN0aW9uLmNvbnRleHQgfSlcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5zdGF0cykge1xuICAgICAgICBpZiAoZGF0YS5jdXN0b21fZGljdF9zaXplKSBjdXN0b21EaWN0U2l6ZSA9IGRhdGEuY3VzdG9tX2RpY3Rfc2l6ZTtcbiAgICAgICAgaW5jb3JyZWN0V29yZHMgKz0gZGF0YS5zdGF0cy51bmtub3duX3dvcmRfY291bnQgfHwgMDtcbiAgICAgICAgZ3JhbW1hcklzc3VlcyArPSBkYXRhLnN0YXRzLmdyYW1tYXJfaXNzdWVfY291bnQgfHwgMDtcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhLm9rICYmIGRhdGEuc3VnZ2VzdGlvbnMgJiYgZGF0YS5zdWdnZXN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZsYWdnZWRTZWN0aW9ucy5wdXNoKHsgc2VjdGlvbiwgc3VnZ2VzdGlvbnM6IGRhdGEuc3VnZ2VzdGlvbnMgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NwZWxsLWxvYWRpbmcnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgaWYgKGZsYWdnZWRTZWN0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJlbmRlclNwZWxsQ2hlY2taZXJvU3RhdGUoXG4gICAgICAgICdTcGVsbCBjaGVjayBwYXNzZWQgXHUyMDE0IG5vIGlzc3VlcyBmb3VuZC4nLFxuICAgICAgICBidWlsZFNwZWxsU3RhdHNTdW1tYXJ5KHtcbiAgICAgICAgICB0b3RhbF9zZWN0aW9uczogc2VjdGlvbnMubGVuZ3RoLFxuICAgICAgICAgIHRvdGFsX3dvcmRzOiBhZ2dyZWdhdGVTdGF0cy53b3JkX2NvdW50IHx8IDAsXG4gICAgICAgICAgdW5pcXVlX3dvcmRzOiBhZ2dyZWdhdGVTdGF0cy51bmlxdWVfd29yZHMgfHwgMCxcbiAgICAgICAgICBjdXN0b21fZGljdF93b3JkczogYWdncmVnYXRlU3RhdHMuY3VzdG9tX2RpY3Rfd29yZHMgfHwgMCxcbiAgICAgICAgICBpbmNvcnJlY3Rfd29yZHM6IGluY29ycmVjdFdvcmRzLFxuICAgICAgICAgIGdyYW1tYXJfaXNzdWVzOiBncmFtbWFySXNzdWVzLFxuICAgICAgICB9KSxcbiAgICAgICAgY3VzdG9tRGljdFNpemUsXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFJlbmRlciBzdWdnZXN0aW9ucyBwYW5lbFxuICAgIHJlbmRlclNwZWxsU3VnZ2VzdGlvbnMoZmxhZ2dlZFNlY3Rpb25zLCBzZWN0aW9ucy5sZW5ndGgsIHtcbiAgICAgIHRvdGFsX3NlY3Rpb25zOiBzZWN0aW9ucy5sZW5ndGgsXG4gICAgICB0b3RhbF93b3JkczogYWdncmVnYXRlU3RhdHMud29yZF9jb3VudCB8fCAwLFxuICAgICAgdW5pcXVlX3dvcmRzOiBhZ2dyZWdhdGVTdGF0cy51bmlxdWVfd29yZHMgfHwgMCxcbiAgICAgIGN1c3RvbV9kaWN0X3dvcmRzOiBhZ2dyZWdhdGVTdGF0cy5jdXN0b21fZGljdF93b3JkcyB8fCAwLFxuICAgICAgaW5jb3JyZWN0X3dvcmRzOiBpbmNvcnJlY3RXb3JkcyxcbiAgICAgIGdyYW1tYXJfaXNzdWVzOiBncmFtbWFySXNzdWVzLFxuICAgIH0sIGN1c3RvbURpY3RTaXplKTtcblxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cuZXJyb3IoJ1NwZWxsIGNoZWNrIGVycm9yOicsIGVycik7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NwZWxsLWxvYWRpbmcnKS5pbm5lckhUTUwgPSBgPHAgc3R5bGU9XCJjb2xvcjojZWY0NDQ0O3BhZGRpbmc6MjBweDtcIj5TcGVsbCBjaGVjayBmYWlsZWQ6ICR7ZXJyLm1lc3NhZ2V9PC9wPmA7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIFplcm8tc3RhdGUgc3BlbGwgc3RhZ2UgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIHJlbmRlclNwZWxsQ2hlY2taZXJvU3RhdGUobWVzc2FnZSwgc3RhdHNMaW5lID0gJycsIGN1c3RvbURpY3RTaXplID0gMCkge1xuICB3aW5kb3cuX3NwZWxsQ2hlY2tDYWNoZSA9IHsgdHlwZTogJ3plcm8nLCBtZXNzYWdlLCBzdGF0c0xpbmUsIGN1c3RvbURpY3RTaXplIH07XG4gIF9zcGVsbENoZWNrQ2FjaGUgPSB3aW5kb3cuX3NwZWxsQ2hlY2tDYWNoZTtcbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIGNvbnN0IHN0YXRzUGFydHMgPSBbXTtcbiAgaWYgKHN0YXRzTGluZSkgc3RhdHNQYXJ0cy5wdXNoKGA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7Zm9udC1zaXplOjAuOTVlbTttYXJnaW46OHB4IDAgMDtcIj4ke2VzY2FwZUh0bWwoc3RhdHNMaW5lKX08L3A+YCk7XG4gIGlmIChjdXN0b21EaWN0U2l6ZSA+IDApIHN0YXRzUGFydHMucHVzaChgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO2ZvbnQtc2l6ZTowLjllbTttYXJnaW46NHB4IDAgMDtcIj5DdXN0b20gZGljdGlvbmFyeTogJHtjdXN0b21EaWN0U2l6ZS50b0xvY2FsZVN0cmluZygpfSB3b3JkJHtjdXN0b21EaWN0U2l6ZSAhPT0gMSA/ICdzJyA6ICcnfTwvcD5gKTtcbiAgY29udGVudC5pbm5lckhUTUwgPSBgXG4gICAgPGRpdiBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO3BhZGRpbmc6NjBweCAyMHB4O1wiPlxuICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTozZW07bWFyZ2luLWJvdHRvbToxNnB4O1wiPlx1MjcwNTwvZGl2PlxuICAgICAgPGgyIHN0eWxlPVwiY29sb3I6IzE2NjUzNDtcIj4ke2VzY2FwZUh0bWwobWVzc2FnZSl9PC9oMj5cbiAgICAgICR7c3RhdHNQYXJ0cy5qb2luKCdcXG4nKX1cbiAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDttYXJnaW46MTZweCAwIDI0cHg7XCI+Q29udGludWUgd2hlbiB5b3UgYXJlIHJlYWR5IHRvIGdlbmVyYXRlIHlvdXIgQ1YuPC9wPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cInN1Ym1pdC1idG5cIiBvbmNsaWNrPVwic3VibWl0RW1wdHlTcGVsbENoZWNrKClcIiB0aXRsZT1cIkdlbmVyYXRlIGFuIEhUTUwgcHJldmlldyBvZiB5b3VyIENWIFx1MjAxNCB5b3Ugd2lsbCByZXZpZXcgdGhlIGxheW91dCBiZWZvcmUgZmluYWwgRE9DWC9QREYgZmlsZXMgYXJlIHByb2R1Y2VkXCI+R2VuZXJhdGUgUHJldmlldyBcdTIxOTI8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgYDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc3VibWl0RW1wdHlTcGVsbENoZWNrKCkge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9zcGVsbC1jaGVjay1jb21wbGV0ZScsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHNwZWxsX2F1ZGl0OiBbXSB9KVxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmICghcmVzLm9rKSB7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgYEZhaWxlZCB0byBzYXZlIHNwZWxsIGNoZWNrOiAke2RhdGEuZXJyb3IgfHwgJ1Vua25vd24gZXJyb3InfWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwcm9jZWVkID0gYXdhaXQgX2NvbmZpcm1Qcm9jZWVkVG9HZW5lcmF0ZSgpO1xuICAgIGlmICghcHJvY2VlZCkgcmV0dXJuO1xuICAgIHN0YXRlTWFuYWdlci5tYXJrQ29udGVudENoYW5nZWQoKTtcbiAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCAnXHUyNzA1IFNwZWxsIGNoZWNrIGNvbXBsZXRlIFx1MjAxNCBubyBpc3N1ZXMgcmVxdWlyZWQgY2hhbmdlcy4gR2VuZXJhdGluZyB5b3VyIENWXHUyMDI2Jyk7XG4gICAgc2NoZWR1bGVBdHNSZWZyZXNoKCdyZXZpZXdfY2hlY2twb2ludCcpO1xuICAgIGF3YWl0IGZldGNoU3RhdHVzKCk7XG4gICAgYXdhaXQgc2VuZEFjdGlvbignZ2VuZXJhdGVfY3YnKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsIGBTcGVsbCBjaGVjayBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgU3RhdHMgc3VtbWFyeSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gYnVpbGRTcGVsbFN0YXRzU3VtbWFyeShzdGF0cyA9IHt9KSB7XG4gIHJldHVybiBbXG4gICAgYCR7KHN0YXRzLnRvdGFsX3NlY3Rpb25zIHx8IDApLnRvTG9jYWxlU3RyaW5nKCl9IHNlY3Rpb24ke3N0YXRzLnRvdGFsX3NlY3Rpb25zID09PSAxID8gJycgOiAncyd9IGNoZWNrZWRgLFxuICAgIGAkeyhzdGF0cy50b3RhbF93b3JkcyB8fCAwKS50b0xvY2FsZVN0cmluZygpfSB3b3Jkc2AsXG4gICAgYCR7KHN0YXRzLnVuaXF1ZV93b3JkcyB8fCAwKS50b0xvY2FsZVN0cmluZygpfSB1bmlxdWVgLFxuICAgIGAkeyhzdGF0cy5jdXN0b21fZGljdF93b3JkcyB8fCAwKS50b0xvY2FsZVN0cmluZygpfSBjdXN0b20gZGljdGlvbmFyeSBtYXRjaCR7c3RhdHMuY3VzdG9tX2RpY3Rfd29yZHMgPT09IDEgPyAnJyA6ICdlcyd9YCxcbiAgICBgJHsoc3RhdHMuaW5jb3JyZWN0X3dvcmRzIHx8IDApLnRvTG9jYWxlU3RyaW5nKCl9IHVua25vd24vaW5jb3JyZWN0YCxcbiAgICBgJHsoc3RhdHMuZ3JhbW1hcl9pc3N1ZXMgfHwgMCkudG9Mb2NhbGVTdHJpbmcoKX0gZ3JhbW1hciBpc3N1ZSR7c3RhdHMuZ3JhbW1hcl9pc3N1ZXMgPT09IDEgPyAnJyA6ICdzJ31gLFxuICBdLmpvaW4oJyBcdTAwQjcgJyk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBSZW5kZXIgc3VnZ2VzdGlvbnMgcGFuZWwgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIHJlbmRlclNwZWxsU3VnZ2VzdGlvbnMoZmxhZ2dlZFNlY3Rpb25zLCB0b3RhbFNlY3Rpb25zLCBzdGF0cyA9IHt9LCBjdXN0b21EaWN0U2l6ZSA9IDApIHtcbiAgd2luZG93Ll9zcGVsbENoZWNrQ2FjaGUgPSB7IHR5cGU6ICdzdWdnZXN0aW9ucycsIGZsYWdnZWRTZWN0aW9ucywgdG90YWxTZWN0aW9ucywgc3RhdHMsIGN1c3RvbURpY3RTaXplIH07XG4gIF9zcGVsbENoZWNrQ2FjaGUgPSB3aW5kb3cuX3NwZWxsQ2hlY2tDYWNoZTtcbiAgY29uc3QgcmVzdWx0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzcGVsbC1yZXN1bHRzJyk7XG4gIHJlc3VsdHMuc3R5bGUuZGlzcGxheSA9ICcnO1xuICBjb25zdCBzdGF0c0xpbmUgPSBidWlsZFNwZWxsU3RhdHNTdW1tYXJ5KHN0YXRzKTtcblxuICBsZXQgaHRtbCA9IGBcbiAgICA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZmVmOWMzO2JvcmRlcjoxcHggc29saWQgI2ZkZTA0Nztib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjEycHggMTZweDttYXJnaW4tYm90dG9tOjI0cHg7XCI+XG4gICAgICA8c3Ryb25nPlx1MjZBMCAke2ZsYWdnZWRTZWN0aW9ucy5yZWR1Y2UoKHQsIGYpID0+IHQgKyBmLnN1Z2dlc3Rpb25zLmxlbmd0aCwgMCl9IGlzc3VlJHtmbGFnZ2VkU2VjdGlvbnMucmVkdWNlKCh0LCBmKSA9PiB0ICsgZi5zdWdnZXN0aW9ucy5sZW5ndGgsIDApICE9PSAxID8gJ3MnIDogJyd9PC9zdHJvbmc+IGZvdW5kXG4gICAgICBhY3Jvc3MgJHtmbGFnZ2VkU2VjdGlvbnMubGVuZ3RofSBvZiAke3RvdGFsU2VjdGlvbnN9IHNlY3Rpb24ke3RvdGFsU2VjdGlvbnMgIT09IDEgPyAncycgOiAnJ30uXG4gICAgICBSZXZpZXcgZWFjaCBzdWdnZXN0aW9uIGJlbG93LCB0aGVuIGNsaWNrIDxzdHJvbmc+RG9uZTwvc3Ryb25nPi5cbiAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOjhweDtmb250LXNpemU6MC45MmVtO2NvbG9yOiM2YjcyODA7XCI+JHtlc2NhcGVIdG1sKHN0YXRzTGluZSl9PC9kaXY+XG4gICAgICAke2N1c3RvbURpY3RTaXplID4gMCA/IGA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDo0cHg7Zm9udC1zaXplOjAuODhlbTtjb2xvcjojNmI3MjgwO1wiPkN1c3RvbSBkaWN0aW9uYXJ5IHNpemU6ICR7Y3VzdG9tRGljdFNpemUudG9Mb2NhbGVTdHJpbmcoKX0gd29yZCR7Y3VzdG9tRGljdFNpemUgIT09IDEgPyAncycgOiAnJ308L2Rpdj5gIDogJyd9XG4gICAgPC9kaXY+XG4gIGA7XG5cbiAgY29uc3QgX3N1Z1NldmVyaXR5ID0gKHN1ZykgPT4ge1xuICAgIGNvbnN0IHJpZCA9IChzdWcucnVsZV9pZCB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBjYXQgPSAoc3VnLmNhdGVnb3J5IHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmICgvc3BlbGx8dHlwb3xtaXNzcGVsbC8udGVzdChyaWQpIHx8IC90eXBvLy50ZXN0KGNhdCkpIHJldHVybiAwO1xuICAgIGlmICgvZ3JhbW1hcnxhZ3JlZW1lbnR8dmVyYnx0ZW5zZXxhcnRpY2xlLy50ZXN0KHJpZCkgfHwgL2dyYW1tYXIvLnRlc3QoY2F0KSkgcmV0dXJuIDE7XG4gICAgaWYgKC9zdHlsZXxyZWR1bmRhbnx3b3JkeS8udGVzdChyaWQpIHx8IC9zdHlsZS8udGVzdChjYXQpKSByZXR1cm4gMjtcbiAgICByZXR1cm4gMztcbiAgfTtcblxuICBmbGFnZ2VkU2VjdGlvbnMuZm9yRWFjaCgoeyBzZWN0aW9uLCBzdWdnZXN0aW9uczogcmF3U3VnZ2VzdGlvbnMgfSkgPT4ge1xuICAgIGNvbnN0IHN1Z2dlc3Rpb25zID0gWy4uLnJhd1N1Z2dlc3Rpb25zXS5zb3J0KChhLCBiKSA9PiBfc3VnU2V2ZXJpdHkoYSkgLSBfc3VnU2V2ZXJpdHkoYikpO1xuICAgIGh0bWwgKz0gYDxkaXYgY2xhc3M9XCJyZXZpZXctc2VjdGlvblwiIHN0eWxlPVwibWFyZ2luLWJvdHRvbToyNHB4O1wiPlxuICAgICAgPGgzIHN0eWxlPVwiZm9udC1zaXplOjFlbTtmb250LXdlaWdodDo3MDA7Y29sb3I6IzM3NDE1MTttYXJnaW4tYm90dG9tOjEycHg7XCI+JHtlc2NhcGVIdG1sKHNlY3Rpb24ubGFiZWwpfTwvaDM+XG4gICAgICA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZjhmYWZjO2JvcmRlcjoxcHggc29saWQgI2UyZThmMDtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjEwcHggMTRweDttYXJnaW4tYm90dG9tOjEwcHg7Zm9udC1zaXplOjAuOWVtO3doaXRlLXNwYWNlOnByZS13cmFwO1wiPiR7ZXNjYXBlSHRtbChzZWN0aW9uLnRleHQpfTwvZGl2PlxuICAgIGA7XG4gICAgc3VnZ2VzdGlvbnMuZm9yRWFjaCgoc3VnLCBpZHgpID0+IHtcbiAgICAgIGNvbnN0IHN1Z0lkID0gYHN1Z18ke3NlY3Rpb24uaWR9XyR7aWR4fWA7XG4gICAgICBjb25zdCByZXBzID0gc3VnLnJlcGxhY2VtZW50cyB8fCBbXTtcbiAgICAgIGh0bWwgKz0gYFxuICAgICAgICA8ZGl2IGNsYXNzPVwic3BlbGwtc3VnZ2VzdGlvblwiIGlkPVwiJHtzdWdJZH1cIiBkYXRhLXNlY3Rpb24taWQ9XCIke2VzY2FwZUh0bWwoc2VjdGlvbi5pZCl9XCIgZGF0YS1pZHg9XCIke2lkeH1cIlxuICAgICAgICAgICAgIHN0eWxlPVwiYm9yZGVyOjFweCBzb2xpZCAjZTJlOGYwO2JvcmRlci1yYWRpdXM6NnB4O3BhZGRpbmc6MTBweCAxNHB4O21hcmdpbi1ib3R0b206OHB4O2JhY2tncm91bmQ6I2ZmZjtcIj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmZsZXgtc3RhcnQ7Z2FwOjEwcHg7XCI+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDoxO1wiPlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuODhlbTtjb2xvcjojNmI3MjgwO21hcmdpbi1ib3R0b206NHB4O1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiYmFja2dyb3VuZDojZmVlMmUyO2NvbG9yOiNkYzI2MjY7Ym9yZGVyLXJhZGl1czo0cHg7cGFkZGluZzoxcHggNnB4O2ZvbnQtd2VpZ2h0OjYwMDtcIj4ke2VzY2FwZUh0bWwoc3VnLmZsYWdnZWQpfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cIm1hcmdpbi1sZWZ0OjhweDtcIj4ke2VzY2FwZUh0bWwoc3VnLm1lc3NhZ2UpfTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXN0eWxlOml0YWxpYztmb250LXNpemU6MC44NWVtO2NvbG9yOiMzNzQxNTE7bWFyZ2luLWJvdHRvbTo4cHg7XCI+JHtlc2NhcGVIdG1sKHN1Zy5zbmlwcGV0KX08L2Rpdj5cbiAgICAgICAgICAgICAgJHtyZXBzLmxlbmd0aCA+IDAgPyBgXG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7ZmxleC13cmFwOndyYXA7Z2FwOjZweDttYXJnaW4tYm90dG9tOjhweDtcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjgyZW07Y29sb3I6IzZiNzI4MDthbGlnbi1zZWxmOmNlbnRlcjtcIj5TdWdnZXN0aW9uczo8L3NwYW4+XG4gICAgICAgICAgICAgICAgJHtyZXBzLm1hcCgociwgcmkpID0+IGA8YnV0dG9uIGNsYXNzPVwicmV3cml0ZS1rZXl3b3JkXCIgb25jbGljaz1cImFwcGx5U3BlbGxSZXBsYWNlbWVudCgnJHtlc2NhcGVIdG1sKHNlY3Rpb24uaWQpfScsICR7aWR4fSwgJHtyaX0pXCJcbiAgICAgICAgICAgICAgICAgIHN0eWxlPVwiY3Vyc29yOnBvaW50ZXI7Ym9yZGVyOjFweCBzb2xpZCAjM2I4MmY2O2JhY2tncm91bmQ6I2RiZWFmZTtcIj4ke2VzY2FwZUh0bWwocil9PC9idXR0b24+YCkuam9pbignJyl9XG4gICAgICAgICAgICAgIDwvZGl2PmAgOiAnJ31cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjZweDttYXJnaW4tYm90dG9tOjhweDtcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImVkaXRfJHtzdWdJZH1cIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJUeXBlIGN1c3RvbSBjb3JyZWN0aW9uXHUyMDI2XCJcbiAgICAgICAgICAgICAgICAgIHZhbHVlPVwiJHtlc2NhcGVIdG1sKHJlcHNbMF0gfHwgJycpfVwiXG4gICAgICAgICAgICAgICAgICBzdHlsZT1cImZsZXg6MTtmb250LXNpemU6MC44OGVtO3BhZGRpbmc6NHB4IDhweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo0cHg7XCJcbiAgICAgICAgICAgICAgICAgIG9ua2V5ZG93bj1cImlmKGV2ZW50LmtleT09PSdFbnRlcicpe2V2ZW50LnByZXZlbnREZWZhdWx0KCk7YXBwbHlDdXN0b21TcGVsbENvcnJlY3Rpb24oJyR7ZXNjYXBlSHRtbChzZWN0aW9uLmlkKX0nLCR7aWR4fSk7fVwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIG9uY2xpY2s9XCJhcHBseUN1c3RvbVNwZWxsQ29ycmVjdGlvbignJHtlc2NhcGVIdG1sKHNlY3Rpb24uaWQpfScsJHtpZHh9KVwiIHRpdGxlPVwiQXBwbHkgY3VzdG9tIGNvcnJlY3Rpb25cIiBhcmlhLWxhYmVsPVwiQXBwbHkgY3VzdG9tIGNvcnJlY3Rpb25cIj5BcHBseTwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6OHB4O2ZsZXgtd3JhcDp3cmFwO1wiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIG9uY2xpY2s9XCJkaXNtaXNzU3BlbGxTdWdnZXN0aW9uKCcke2VzY2FwZUh0bWwoc3VnSWQpfScsICcke2VzY2FwZUh0bWwoc2VjdGlvbi5pZCl9JywgJHtpZHh9LCAnJHtlc2NhcGVIdG1sKHN1Zy5mbGFnZ2VkKX0nKVwiXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiSWdub3JlIHRoaXMgc3VnZ2VzdGlvblwiIGFyaWEtbGFiZWw9XCJJZ25vcmUgdGhpcyBzdWdnZXN0aW9uXCI+SWdub3JlPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgb25jbGljaz1cImFkZFNwZWxsV29yZCgnJHtlc2NhcGVIdG1sKHN1Zy5mbGFnZ2VkKX0nLCAnJHtlc2NhcGVIdG1sKHN1Z0lkKX0nKVwiXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiQWRkIHRvIGN1c3RvbSBkaWN0aW9uYXJ5XCIgYXJpYS1sYWJlbD1cIkFkZCB0byBjdXN0b20gZGljdGlvbmFyeVwiPkFkZCB0byBEaWN0aW9uYXJ5PC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgYDtcbiAgICAgIC8vIFJlZ2lzdGVyIGluIGF1ZGl0IGFzIHBlbmRpbmdcbiAgICAgIGlmICghd2luZG93Ll9zcGVsbFN1Z01hcCkgd2luZG93Ll9zcGVsbFN1Z01hcCA9IHt9O1xuICAgICAgd2luZG93Ll9zcGVsbFN1Z01hcFtgJHtzZWN0aW9uLmlkfV8ke2lkeH1gXSA9IHtcbiAgICAgICAgc2VjdGlvbl9pZDogICAgc2VjdGlvbi5pZCxcbiAgICAgICAgY29udGV4dF90eXBlOiBzZWN0aW9uLmNvbnRleHQsXG4gICAgICAgIGxvY2F0aW9uOiAgICAgc2VjdGlvbi5sYWJlbCxcbiAgICAgICAgb3JpZ2luYWw6ICAgICBzdWcuZmxhZ2dlZCxcbiAgICAgICAgc3VnZ2VzdGlvbjogICAocmVwc1swXSB8fCAnJyksXG4gICAgICAgIG9mZnNldDogICAgICAgc3VnLm9mZnNldCxcbiAgICAgICAgbGVuZ3RoOiAgICAgICBzdWcubGVuZ3RoLFxuICAgICAgICBydWxlOiAgICAgICAgIHN1Zy5ydWxlX2lkIHx8ICcnLFxuICAgICAgICBvdXRjb21lOiAgICAgICdwZW5kaW5nJyxcbiAgICAgICAgZmluYWw6ICAgICAgICBzdWcuZmxhZ2dlZCxcbiAgICAgIH07XG4gICAgfSk7XG4gICAgaHRtbCArPSAnPC9kaXY+JztcbiAgfSk7XG5cbiAgaHRtbCArPSBgXG4gICAgPGRpdiBjbGFzcz1cIm5hdi1idXR0b25zXCIgc3R5bGU9XCJtYXJnaW46MjRweCAwO1wiPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cInN1Ym1pdC1idG5cIiBvbmNsaWNrPVwic3VibWl0U3BlbGxDaGVja0RlY2lzaW9ucygpXCI+R2VuZXJhdGUgUHJldmlldyBcdTIxOTI8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgYDtcbiAgcmVzdWx0cy5pbm5lckhUTUwgPSBodG1sO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgQXBwbHkgLyBkaXNtaXNzIGNvcnJlY3Rpb25zIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBhcHBseUN1c3RvbVNwZWxsQ29ycmVjdGlvbihzZWN0aW9uSWQsIGlkeCkge1xuICBjb25zdCBrZXkgICAgPSBgJHtzZWN0aW9uSWR9XyR7aWR4fWA7XG4gIGNvbnN0IGVudHJ5ICA9ICh3aW5kb3cuX3NwZWxsU3VnTWFwIHx8IHt9KVtrZXldO1xuICBpZiAoIWVudHJ5KSByZXR1cm47XG4gIGNvbnN0IGlucHV0ICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBlZGl0X3N1Z18ke3NlY3Rpb25JZH1fJHtpZHh9YCk7XG4gIGNvbnN0IGN1c3RvbSA9IGlucHV0ID8gaW5wdXQudmFsdWUudHJpbSgpIDogJyc7XG4gIGlmICghY3VzdG9tKSByZXR1cm47XG4gIGVudHJ5Lm91dGNvbWUgPSAnYWNjZXB0JztcbiAgZW50cnkuZmluYWwgICA9IGN1c3RvbTtcbiAgY29uc3Qgc3VnRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuc3BlbGwtc3VnZ2VzdGlvbltkYXRhLXNlY3Rpb24taWQ9XCIke0NTUy5lc2NhcGUoc2VjdGlvbklkKX1cIl1bZGF0YS1pZHg9XCIke2lkeH1cIl1gKTtcbiAgaWYgKCFzdWdFbCkgcmV0dXJuO1xuICBjb25zdCBmbGFnZ2VkU3BhbiA9IHN1Z0VsLnF1ZXJ5U2VsZWN0b3IoJ3NwYW5bc3R5bGUqPVwiYmFja2dyb3VuZDojZmVlMmUyXCJdJyk7XG4gIGlmIChmbGFnZ2VkU3Bhbikge1xuICAgIGZsYWdnZWRTcGFuLm91dGVySFRNTCA9IGA8ZGVsIHN0eWxlPVwiY29sb3I6I2RjMjYyNjtcIj4ke2VzY2FwZUh0bWwoZW50cnkub3JpZ2luYWwpfTwvZGVsPiBcdTIxOTIgPGlucyBzdHlsZT1cImNvbG9yOiMxNjY1MzQ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7XCI+JHtlc2NhcGVIdG1sKGN1c3RvbSl9PC9pbnM+YDtcbiAgfVxuICBzdWdFbC5zdHlsZS5vcGFjaXR5ID0gJzAuNSc7XG59XG5cbmZ1bmN0aW9uIGFwcGx5U3BlbGxSZXBsYWNlbWVudChzZWN0aW9uSWQsIGlkeCwgcmVwSWR4KSB7XG4gIGNvbnN0IGtleSAgPSBgJHtzZWN0aW9uSWR9XyR7aWR4fWA7XG4gIGNvbnN0IGVudHJ5ID0gKHdpbmRvdy5fc3BlbGxTdWdNYXAgfHwge30pW2tleV07XG4gIGlmICghZW50cnkpIHJldHVybjtcbiAgLy8gVGhlIHJlcGxhY2VtZW50cyBsaXN0IGlzIG5vdCBkaXJlY3RseSBhY2Nlc3NpYmxlIGhlcmUgXHUyMDE0IHJlYWQgZnJvbSBET00gc3VnZ2VzdGlvblxuICBjb25zdCBzdWdFbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC5zcGVsbC1zdWdnZXN0aW9uW2RhdGEtc2VjdGlvbi1pZD1cIiR7Q1NTLmVzY2FwZShzZWN0aW9uSWQpfVwiXVtkYXRhLWlkeD1cIiR7aWR4fVwiXWApO1xuICBpZiAoIXN1Z0VsKSByZXR1cm47XG4gIGNvbnN0IGJ1dHRvbnMgPSBzdWdFbC5xdWVyeVNlbGVjdG9yQWxsKCcucmV3cml0ZS1rZXl3b3JkJyk7XG4gIGNvbnN0IHJlcCA9IGJ1dHRvbnNbcmVwSWR4XSA/IGJ1dHRvbnNbcmVwSWR4XS50ZXh0Q29udGVudC50cmltKCkgOiAnJztcbiAgZW50cnkub3V0Y29tZSA9ICdhY2NlcHQnO1xuICBlbnRyeS5maW5hbCAgID0gcmVwO1xuICAvLyBWaXN1YWwgZmVlZGJhY2s6IHN0cmlrZSB0aGUgZmxhZ2dlZCB3b3JkLCBzaG93IHJlcGxhY2VtZW50XG4gIGNvbnN0IGZsYWdnZWRTcGFuID0gc3VnRWwucXVlcnlTZWxlY3Rvcignc3BhbltzdHlsZSo9XCJiYWNrZ3JvdW5kOiNmZWUyZTJcIl0nKTtcbiAgaWYgKGZsYWdnZWRTcGFuKSB7XG4gICAgZmxhZ2dlZFNwYW4ub3V0ZXJIVE1MID0gYDxkZWwgc3R5bGU9XCJjb2xvcjojZGMyNjI2O1wiPiR7ZXNjYXBlSHRtbChlbnRyeS5vcmlnaW5hbCl9PC9kZWw+IFx1MjE5MiA8aW5zIHN0eWxlPVwiY29sb3I6IzE2NjUzNDt0ZXh0LWRlY29yYXRpb246bm9uZTtcIj4ke2VzY2FwZUh0bWwocmVwKX08L2lucz5gO1xuICB9XG4gIHN1Z0VsLnN0eWxlLm9wYWNpdHkgPSAnMC41Jztcbn1cblxuZnVuY3Rpb24gZGlzbWlzc1NwZWxsU3VnZ2VzdGlvbihzdWdJZCwgc2VjdGlvbklkLCBpZHgsIHdvcmQpIHtcbiAgY29uc3Qga2V5ICAgPSBgJHtzZWN0aW9uSWR9XyR7aWR4fWA7XG4gIGNvbnN0IGVudHJ5ID0gKHdpbmRvdy5fc3BlbGxTdWdNYXAgfHwge30pW2tleV07XG4gIGlmIChlbnRyeSkgeyBlbnRyeS5vdXRjb21lID0gJ3JlamVjdCc7IGVudHJ5LmZpbmFsID0gd29yZDsgfVxuICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHN1Z0lkKTtcbiAgaWYgKGVsKSBlbC5zdHlsZS5vcGFjaXR5ID0gJzAuNCc7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGFkZFNwZWxsV29yZCh3b3JkLCBzdWdJZCkge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL2N1c3RvbS1kaWN0aW9uYXJ5Jywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgd29yZCB9KVxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHN1Z0lkKTtcbiAgICAgIGlmIChlbCkge1xuICAgICAgICBlbC5zdHlsZS5vcGFjaXR5ID0gJzAuNCc7XG4gICAgICAgIGNvbnN0IG1zZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBtc2cuc3R5bGUuY3NzVGV4dCA9ICdjb2xvcjojMTY2NTM0O2ZvbnQtc2l6ZTowLjg1ZW07bWFyZ2luLXRvcDo0cHg7JztcbiAgICAgICAgbXNnLnRleHRDb250ZW50ID0gYFwiJHt3b3JkfVwiIGFkZGVkIHRvIGRpY3Rpb25hcnkuYDtcbiAgICAgICAgZWwuYXBwZW5kQ2hpbGQobXNnKTtcbiAgICAgIH1cbiAgICAgIC8vIEFsc28gcmVjb3JkIGluIGF1ZGl0XG4gICAgICBjb25zdCBwYXJ0cyA9IHN1Z0lkLnJlcGxhY2UoL15zdWdfLywgJycpLnNwbGl0KCdfJyk7XG4gICAgICBjb25zdCBpZHggPSBwYXJzZUludChwYXJ0cy5wb3AoKSwgMTApO1xuICAgICAgY29uc3Qgc2VjdGlvbklkID0gcGFydHMuam9pbignXycpO1xuICAgICAgY29uc3Qga2V5ID0gYCR7c2VjdGlvbklkfV8ke2lkeH1gO1xuICAgICAgY29uc3QgZW50cnkgPSAod2luZG93Ll9zcGVsbFN1Z01hcCB8fCB7fSlba2V5XTtcbiAgICAgIGlmIChlbnRyeSkgeyBlbnRyeS5vdXRjb21lID0gJ2FkZF9kaWN0JzsgZW50cnkuZmluYWwgPSB3b3JkOyB9XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cuZXJyb3IoJ0Vycm9yIGFkZGluZyB0byBkaWN0aW9uYXJ5OicsIGVycik7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIFByZS1nZW5lcmF0aW9uIGNvbmZpcm1hdGlvbiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gX2NvbmZpcm1Qcm9jZWVkVG9HZW5lcmF0ZSgpIHtcbiAgLy8gR2F0ZTogdGFnbGluZSBtdXN0IGJlIGV4cGxpY2l0bHkgY29uZmlybWVkIGJlZm9yZSBnZW5lcmF0aW5nXG4gIGNvbnN0IHN0YXR1cyA9IGF3YWl0IGZldGNoU3RhdHVzKCkuY2F0Y2goKCkgPT4gKHt9KSk7XG4gIGlmICghc3RhdHVzPy5kZWNpc2lvbnNfY29uZmlybWVkPy50YWdsaW5lKSB7XG4gICAgYXdhaXQgc2hvd0FsZXJ0TW9kYWwoXG4gICAgICAnXHUyNkEwIFRhZ2xpbmUgTm90IENvbmZpcm1lZCcsXG4gICAgICAnWW91IG11c3QgY29uZmlybSB5b3VyIGFwcGxpY2FudCB0YWdsaW5lIGJlZm9yZSBnZW5lcmF0aW5nLlxcblxcbkdvIHRvIHRoZSBcdUQ4M0NcdURGRjdcdUZFMEYgVGFnbGluZSB0YWIgaW4gQ3VzdG9taXphdGlvbnMgdG8gY29uZmlybSBpdC4nXG4gICAgKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgYXRzU2NvcmUgPSBzdGF0ZU1hbmFnZXIuZ2V0QXRzU2NvcmUoKTtcbiAgY29uc3QgZnJlc2huZXNzID0gc3RhdGVNYW5hZ2VyLmdldExheW91dEZyZXNobmVzcygpO1xuICBjb25zdCBnZW5TdGF0ZSA9IHN0YXRlTWFuYWdlci5nZXRHZW5lcmF0aW9uU3RhdGUoKTtcbiAgY29uc3QgZGVjaXNpb25zQ29uZmlybWVkID0gc3RhdHVzPy5kZWNpc2lvbnNfY29uZmlybWVkIHx8IHt9O1xuICBjb25zdCBsaW5lcyA9IFsnWW91ciBDViBpcyByZWFkeSB0byBnZW5lcmF0ZS4nXTtcbiAgaWYgKGF0c1Njb3JlICE9PSBudWxsICYmIGF0c1Njb3JlICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGF0c1Njb3JlLm92ZXJhbGwgPT09ICdudW1iZXInKSB7XG4gICAgbGluZXMucHVzaChgQ3VycmVudCBBVFMgc2NvcmU6ICR7TWF0aC5yb3VuZChhdHNTY29yZS5vdmVyYWxsKX0lYCk7XG4gIH1cbiAgaWYgKGdlblN0YXRlLnBhZ2VXYXJuaW5nKSB7XG4gICAgY29uc3QgcGMgPSBnZW5TdGF0ZS5wYWdlQ291bnRFeGFjdCA/PyBnZW5TdGF0ZS5wYWdlQ291bnRFc3RpbWF0ZTtcbiAgICBjb25zdCBwY0xhYmVsID0gcGMgIT09IG51bGwgPyAoZ2VuU3RhdGUucGFnZUNvdW50RXhhY3QgIT09IG51bGwgPyBgJHtwY31gIDogYH4ke3BjfWApIDogbnVsbDtcbiAgICBjb25zdCBva1BhZ2UgPSBhd2FpdCBzaG93Q29uZmlybU1vZGFsKFxuICAgICAgJ1x1MjZBMCBQYWdlIENvdW50IE91dCBvZiBSYW5nZScsXG4gICAgICBgVGhlIENWIGlzIGVzdGltYXRlZCBhdCAke3BjTGFiZWwgPyBgJHtwY0xhYmVsfSBwYWdlJHtwYyAhPT0gMSA/ICdzJyA6ICcnfWAgOiAnYW4gdW51c3VhbCBwYWdlIGNvdW50J30sIHdoaWNoIGlzIG91dHNpZGUgdGhlIHJlY29tbWVuZGVkIHJhbmdlIGZvciBhIHNlbmlvciBjYW5kaWRhdGUgKDJcdTIwMTMzIHBhZ2VzKS5cXG5cXG5Db25zaWRlciBhZGp1c3RpbmcgeW91ciBsYXlvdXQgaW5zdHJ1Y3Rpb25zIGJlZm9yZSBnZW5lcmF0aW5nLlxcblxcblByb2NlZWQgYW55d2F5P2AsXG4gICAgICAnR2VuZXJhdGUgQW55d2F5J1xuICAgICk7XG4gICAgaWYgKCFva1BhZ2UpIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoZnJlc2huZXNzLmlzU3RhbGUpIHtcbiAgICBsaW5lcy5wdXNoKGBcdTI2QTAgJHtmcmVzaG5lc3MuYXJpYUxhYmVsfWApO1xuICB9XG4gIGNvbnN0IHJldmlld2VkU2VjdGlvbnMgPSBbJ2V4cGVyaWVuY2VzJywgJ3NraWxscycsICdhY2hpZXZlbWVudHMnXS5maWx0ZXIoayA9PiBkZWNpc2lvbnNDb25maXJtZWRba10pO1xuICBpZiAocmV2aWV3ZWRTZWN0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICBsaW5lcy5wdXNoKCdcdTI2QTAgTm8gY3VzdG9taXNhdGlvbiBzZWN0aW9ucyByZXZpZXdlZCBcdTIwMTQgZXhwZXJpZW5jZSwgc2tpbGwsIGFuZCBhY2hpZXZlbWVudCBzZWxlY3Rpb25zIGFyZSBhbGwgTExNIGRlZmF1bHRzLicpO1xuICB9XG4gIGxldCB3ZWFrQnVsbGV0Q291bnQgPSAwLCBwYXNzaXZlQnVsbGV0Q291bnQgPSAwO1xuICBPYmplY3QudmFsdWVzKHdpbmRvdy5hY2hpZXZlbWVudEVkaXRzIHx8IHt9KS5mb3JFYWNoKGxpc3QgPT4ge1xuICAgIChsaXN0IHx8IFtdKS5mb3JFYWNoKGUgPT4ge1xuICAgICAgY29uc3QgdHh0ID0gdHlwZW9mIGUgPT09ICdzdHJpbmcnID8gZSA6ICgoZSAmJiBlLnRleHQpIHx8ICcnKTtcbiAgICAgIGlmICghdHh0LnRyaW0oKSB8fCAoZSAmJiBlLmhpZGRlbikpIHJldHVybjtcbiAgICAgIGNvbnN0IHdhcm4gPSB0eXBlb2YgX2FjaFZlcmJXYXJuaW5nID09PSAnZnVuY3Rpb24nID8gX2FjaFZlcmJXYXJuaW5nKHR4dCkgOiBudWxsO1xuICAgICAgaWYgKHdhcm4/LmxldmVsID09PSAncGFzc2l2ZScpIHBhc3NpdmVCdWxsZXRDb3VudCsrO1xuICAgICAgZWxzZSBpZiAod2Fybj8ubGV2ZWwgPT09ICd3ZWFrJykgd2Vha0J1bGxldENvdW50Kys7XG4gICAgfSk7XG4gIH0pO1xuICBpZiAod2Vha0J1bGxldENvdW50ID4gMCB8fCBwYXNzaXZlQnVsbGV0Q291bnQgPiAwKSB7XG4gICAgY29uc3QgcGFydHMgPSBbXTtcbiAgICBpZiAocGFzc2l2ZUJ1bGxldENvdW50ID4gMCkgcGFydHMucHVzaChgJHtwYXNzaXZlQnVsbGV0Q291bnR9IHdpdGggcGFzc2l2ZSB2b2ljZWApO1xuICAgIGlmICh3ZWFrQnVsbGV0Q291bnQgPiAwKSBwYXJ0cy5wdXNoKGAke3dlYWtCdWxsZXRDb3VudH0gd2l0aCB3ZWFrIG9wZW5pbmcgdmVyYiR7d2Vha0J1bGxldENvdW50ICE9PSAxID8gJ3MnIDogJyd9YCk7XG4gICAgbGluZXMucHVzaChgXHUyNkEwICR7cGFydHMuam9pbignLCAnKX0gaW4gZXhwZXJpZW5jZSBidWxsZXRzIFx1MjAxNCBjb25zaWRlciBBSSByZXdyaXRlcyBpbiB0aGUgRXhwZXJpZW5jZSBCdWxsZXRzIGVkaXRvci5gKTtcbiAgfVxuICBsaW5lcy5wdXNoKCdcXG5Qcm9jZWVkPycpO1xuICByZXR1cm4gc2hvd0NvbmZpcm1Nb2RhbCgnXHVEODNEXHVEQ0M0IFByb2NlZWQgdG8gR2VuZXJhdGU/JywgbGluZXMuam9pbignXFxuJyksICdHZW5lcmF0ZSBOb3cnKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFN1Ym1pdCBhdWRpdCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gc3VibWl0U3BlbGxDaGVja0RlY2lzaW9ucygpIHtcbiAgLyogZHVja2Zsb3c6XG4gICAqICAgaWQ6IHNwZWxsX3VpX3N1Ym1pdF9saXZlXG4gICAqICAga2luZDogdWlcbiAgICogICB0aW1lc3RhbXA6ICcyMDI2LTA0LTIxVDE4OjAwOjAwWidcbiAgICogICBzdGF0dXM6IGxpdmVcbiAgICogICBoYW5kbGVzOlxuICAgKiAgIC0gdWk6c3BlbGwtY2hlY2suc3VibWl0XG4gICAqICAgY2FsbHM6XG4gICAqICAgLSBQT1NUIC9hcGkvc3BlbGwtY2hlY2stY29tcGxldGVcbiAgICogICAtIFBPU1QgL2FwaS9hY3Rpb25cbiAgICogICByZWFkczpcbiAgICogICAtIHdpbmRvdzpfc3BlbGxTdWdNYXBcbiAgICogICB3cml0ZXM6XG4gICAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9zcGVsbC1jaGVjay1jb21wbGV0ZS5zcGVsbF9hdWRpdFxuICAgKiAgIC0gd2luZG93OnNwZWxsQXVkaXRcbiAgICogICBub3RlczogQ29sbGFwc2VzIHJldmlld2VkIHNwZWxsIHN1Z2dlc3Rpb25zIGludG8gdGhlIGNhbm9uaWNhbCBzcGVsbCBhdWRpdCwgcGVyc2lzdHMgdGhhdCBhdWRpdCBpbiBzZXNzaW9uIHN0YXRlLCBzaG93cyBhIHByZS1nZW5lcmF0aW9uIGNvbmZpcm1hdGlvbiBtb2RhbCwgYW5kIHRoZW4gdHJpZ2dlcnMgZ2VuZXJhdGlvbiB1c2luZyB0aGUgY29ycmVjdGVkIGNvbnRlbnQuXG4gICAqL1xuICAvLyBDb3VudCBpdGVtcyBzdGlsbCBtYXJrZWQgJ3BlbmRpbmcnIChub3QgZXhwbGljaXRseSByZXZpZXdlZClcbiAgY29uc3QgcGVuZGluZ0VudHJpZXMgPSBPYmplY3QudmFsdWVzKHdpbmRvdy5fc3BlbGxTdWdNYXAgfHwge30pLmZpbHRlcihlID0+IGUub3V0Y29tZSA9PT0gJ3BlbmRpbmcnKTtcbiAgaWYgKHBlbmRpbmdFbnRyaWVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBuID0gcGVuZGluZ0VudHJpZXMubGVuZ3RoO1xuICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IHNob3dDb25maXJtTW9kYWwoXG4gICAgICAnXHUyNkEwIFVucmV2aWV3ZWQgSXNzdWVzJyxcbiAgICAgIGAke259IGlzc3VlJHtuICE9PSAxID8gJ3MgaGF2ZScgOiAnIGhhcyd9IG5vdCBiZWVuIHJldmlld2VkIGFuZCB3aWxsIGJlIGlnbm9yZWQuXFxuUHJvY2VlZCBhbnl3YXk/YCxcbiAgICAgICdQcm9jZWVkJ1xuICAgICk7XG4gICAgaWYgKCFjb25maXJtZWQpIHJldHVybjtcbiAgfVxuXG4gIC8vIENvbGxlY3QgYXVkaXQgZnJvbSBfc3BlbGxTdWdNYXBcbiAgY29uc3QgYXVkaXQgPSBPYmplY3QudmFsdWVzKHdpbmRvdy5fc3BlbGxTdWdNYXAgfHwge30pLmZpbHRlcihlID0+IGUub3V0Y29tZSAhPT0gJ3BlbmRpbmcnKTtcbiAgLy8gUmVtYWluaW5nICdwZW5kaW5nJyBpdGVtcyBhcmUgZXhwbGljaXRseSBhdXRvLWlnbm9yZWQgYWZ0ZXIgY29uZmlybWF0aW9uIGFib3ZlXG4gIE9iamVjdC52YWx1ZXMod2luZG93Ll9zcGVsbFN1Z01hcCB8fCB7fSkuZm9yRWFjaChlID0+IHtcbiAgICBpZiAoZS5vdXRjb21lID09PSAncGVuZGluZycpIHsgZS5vdXRjb21lID0gJ2lnbm9yZSc7IGF1ZGl0LnB1c2goZSk7IH1cbiAgfSk7XG4gIHNwZWxsQXVkaXQgPSBhdWRpdDtcblxuICBjb25zdCBsb2FkaW5nTXNnID0gYXBwZW5kTG9hZGluZ01lc3NhZ2UoJ1NhdmluZyBzcGVsbCBjaGVjayBkZWNpc2lvbnNcdTIwMjYnKTtcbiAgc2V0TG9hZGluZyh0cnVlLCAnU2F2aW5nIHNwZWxsLWNoZWNrIGRlY2lzaW9uc1x1MjAyNicpO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9zcGVsbC1jaGVjay1jb21wbGV0ZScsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHNwZWxsX2F1ZGl0OiBzcGVsbEF1ZGl0IH0pXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgcmVtb3ZlTG9hZGluZ01lc3NhZ2UobG9hZGluZ01zZyk7XG4gICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgaWYgKCFyZXMub2spIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCBgRmFpbGVkIHRvIHNhdmUgc3BlbGwgY2hlY2s6ICR7ZGF0YS5lcnJvciB8fCAnVW5rbm93biBlcnJvcid9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN0YXRlTWFuYWdlci5tYXJrQ29udGVudENoYW5nZWQoKTtcbiAgICBjb25zdCBwcm9jZWVkID0gYXdhaXQgX2NvbmZpcm1Qcm9jZWVkVG9HZW5lcmF0ZSgpO1xuICAgIGlmICghcHJvY2VlZCkgcmV0dXJuO1xuICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIGBcdTI3MDUgU3BlbGwgY2hlY2sgY29tcGxldGUgXHUyMDE0ICR7c3BlbGxBdWRpdC5sZW5ndGh9IGl0ZW0ke3NwZWxsQXVkaXQubGVuZ3RoICE9PSAxID8gJ3MnIDogJyd9IHJldmlld2VkLiBHZW5lcmF0aW5nIHlvdXIgQ1ZcdTIwMjZgKTtcbiAgICBzY2hlZHVsZUF0c1JlZnJlc2goJ3Jldmlld19jaGVja3BvaW50Jyk7XG4gICAgYXdhaXQgZmV0Y2hTdGF0dXMoKTtcbiAgICBhd2FpdCBzZW5kQWN0aW9uKCdnZW5lcmF0ZV9jdicpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZW1vdmVMb2FkaW5nTWVzc2FnZShsb2FkaW5nTXNnKTtcbiAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgYFNwZWxsIGNoZWNrIGVycm9yOiAke2Vyci5tZXNzYWdlfWApO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFeHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5leHBvcnQge1xuICBzcGVsbEF1ZGl0LFxuICBwb3B1bGF0ZVNwZWxsQ2hlY2tUYWIsXG4gIHJlbmRlclNwZWxsQ2hlY2taZXJvU3RhdGUsXG4gIHN1Ym1pdEVtcHR5U3BlbGxDaGVjayxcbiAgYnVpbGRTcGVsbFN0YXRzU3VtbWFyeSxcbiAgcmVuZGVyU3BlbGxTdWdnZXN0aW9ucyxcbiAgYXBwbHlDdXN0b21TcGVsbENvcnJlY3Rpb24sXG4gIGFwcGx5U3BlbGxSZXBsYWNlbWVudCxcbiAgZGlzbWlzc1NwZWxsU3VnZ2VzdGlvbixcbiAgYWRkU3BlbGxXb3JkLFxuICBzdWJtaXRTcGVsbENoZWNrRGVjaXNpb25zLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL2Rvd25sb2FkLXRhYi5qc1xuICogRmlsZSBSZXZpZXcgdGFiOiBBVFMgdmFsaWRhdGlvbiwgZ2VuZXJhdGVkLWZpbGUgZG93bmxvYWRzLCBwZXJzdWFzaW9uIGNoZWNrLFxuICogYW5kIHJlZmluZW1lbnQgc2hvcnRjdXRzLlxuICpcbiAqIERlcGVuZGVuY2llcyAocmVzb2x2ZWQgdGhyb3VnaCBnbG9iYWxUaGlzIGF0IHJ1bnRpbWUpOlxuICogICBlc2NhcGVIdG1sLCBiYWNrVG9QaGFzZVxuICovXG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmNvbnN0IGxvZyA9IGdldExvZ2dlcignZG93bmxvYWQtdGFiJyk7XG5cbmltcG9ydCB7IHN0YXRlTWFuYWdlciB9IGZyb20gJy4vc3RhdGUtbWFuYWdlci5qcyc7XG5cbmZ1bmN0aW9uIF9jb2xsZWN0RG93bmxvYWRhYmxlRmlsZXMoY3ZEYXRhID0ge30pIHtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQoKTtcbiAgY29uc3QgZmlsZXMgPSBbXTtcbiAgY29uc3QgcmF3RmlsZXMgPSBBcnJheS5pc0FycmF5KGN2RGF0YS5maWxlcykgPyBjdkRhdGEuZmlsZXMgOiBbXTtcbiAgY29uc3QgY2FuZGlkYXRlRmlsZXMgPSBbXG4gICAgLi4ucmF3RmlsZXMsXG4gICAgY3ZEYXRhLmZpbmFsX2h0bWwsXG4gICAgY3ZEYXRhLmZpbmFsX3BkZixcbiAgICBjdkRhdGEuaHRtbCxcbiAgICBjdkRhdGEucGRmLFxuICAgIGN2RGF0YS5kb2N4LFxuICAgIGN2RGF0YS5hdHNfZG9jeCxcbiAgXS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiBjYW5kaWRhdGVGaWxlcykge1xuICAgIGlmIChzZWVuLmhhcyhmaWxlbmFtZSkpIGNvbnRpbnVlO1xuICAgIHNlZW4uYWRkKGZpbGVuYW1lKTtcblxuICAgIGxldCBpY29uID0gJ1x1RDgzRFx1RENDMSc7XG4gICAgbGV0IGRlc2NyaXB0aW9uID0gJ0dlbmVyYXRlZCBmaWxlJztcbiAgICBsZXQgZm9ybWF0ID0gJ290aGVyJztcblxuICAgIGlmIChmaWxlbmFtZS5lbmRzV2l0aCgnLnBkZicpKSB7XG4gICAgICBpY29uID0gZmlsZW5hbWUuaW5jbHVkZXMoJ0FUUycpID8gJ1x1RDgzRVx1REQxNicgOiAnXHVEODNEXHVEQ0M0JztcbiAgICAgIGRlc2NyaXB0aW9uID0gZmlsZW5hbWUuaW5jbHVkZXMoJ0FUUycpXG4gICAgICAgID8gJ0FUUy1vcHRpbWlzZWQgUERGIFx1MjAxNCBtYWNoaW5lLXJlYWRhYmxlIGZvciBhdXRvbWF0ZWQgc2NyZWVuaW5nJ1xuICAgICAgICA6ICdIdW1hbi1yZWFkYWJsZSBQREYgXHUyMDE0IGZvciBodW1hbiByZXZpZXdlcnMgYW5kIHByaW50aW5nJztcbiAgICAgIGZvcm1hdCA9ICdwZGYnO1xuICAgIH0gZWxzZSBpZiAoZmlsZW5hbWUuZW5kc1dpdGgoJy5kb2N4JykpIHtcbiAgICAgIGljb24gPSAnXHVEODNEXHVEQ0REJztcbiAgICAgIGlmIChmaWxlbmFtZS5zdGFydHNXaXRoKCdDb3ZlckxldHRlcl8nKSkge1xuICAgICAgICBkZXNjcmlwdGlvbiA9ICdDb3ZlciBsZXR0ZXIgXHUyMDE0IFdvcmQgZG9jdW1lbnQgZm9yIHRoZSBhcHBsaWNhdGlvbic7XG4gICAgICB9IGVsc2UgaWYgKGZpbGVuYW1lLnN0YXJ0c1dpdGgoJ1NjcmVlbmluZ18nKSkge1xuICAgICAgICBkZXNjcmlwdGlvbiA9ICdTY3JlZW5pbmcgcXVlc3Rpb24gcmVzcG9uc2VzIFx1MjAxNCBXb3JkIGRvY3VtZW50JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlc2NyaXB0aW9uID0gZmlsZW5hbWUuaW5jbHVkZXMoJ0FUUycpXG4gICAgICAgICAgPyAnQVRTLW9wdGltaXNlZCBXb3JkIGRvY3VtZW50IFx1MjAxNCBrZXl3b3JkLW9wdGltaXNlZCBmb3Igam9iIGFwcGxpY2F0aW9ucydcbiAgICAgICAgICA6ICdIdW1hbi1yZWFkYWJsZSBXb3JkIGRvY3VtZW50IFx1MjAxNCBlZGl0YWJsZSBmb3JtYXQnO1xuICAgICAgfVxuICAgICAgZm9ybWF0ID0gJ2RvY3gnO1xuICAgIH0gZWxzZSBpZiAoZmlsZW5hbWUuZW5kc1dpdGgoJy5odG1sJykpIHtcbiAgICAgIGljb24gPSAnXHVEODNDXHVERjEwJztcbiAgICAgIGNvbnN0IGlzUHJldmlldyA9IC9wcmV2aWV3L2kudGVzdChmaWxlbmFtZSk7XG4gICAgICBkZXNjcmlwdGlvbiA9IGlzUHJldmlld1xuICAgICAgICA/ICdMYXlvdXQgcHJldmlldyBcdTIwMTQgaW50ZXJtZWRpYXRlIHdvcmtpbmcgZmlsZSwgbm90IGZvciBzdWJtaXNzaW9uJ1xuICAgICAgICA6ICdIVE1MIGZvcm1hdCB3aXRoIGVtYmVkZGVkIEpTT04tTEQgc3RydWN0dXJlZCBkYXRhJztcbiAgICAgIGZvcm1hdCA9IGlzUHJldmlldyA/ICdwcmV2aWV3JyA6ICdodG1sJztcbiAgICB9IGVsc2UgaWYgKGZpbGVuYW1lID09PSAnam9iX2Rlc2NyaXB0aW9uLnR4dCcpIHtcbiAgICAgIGljb24gPSAnXHVEODNEXHVEQ0NCJztcbiAgICAgIGRlc2NyaXB0aW9uID0gJ09yaWdpbmFsIGpvYiBkZXNjcmlwdGlvbiByZWZlcmVuY2UnO1xuICAgIH1cblxuICAgIGZpbGVzLnB1c2goeyBmaWxlbmFtZSwgZGVzY3JpcHRpb24sIGljb24sIGZvcm1hdCB9KTtcbiAgfVxuXG4gIHJldHVybiBmaWxlcztcbn1cblxuZnVuY3Rpb24gX3JlbmRlclZhbGlkYXRpb25TdW1tYXJ5KGNoZWNrcywgc3VtbWFyeSwgcGFnZUNvdW50LCBhdHNFcnJvcikge1xuICBsZXQgaHRtbCA9ICcnO1xuXG4gIGlmIChwYWdlQ291bnQgIT09IG51bGwpIHtcbiAgICBjb25zdCBwYWdlV2FybmluZyA9IHBhZ2VDb3VudCA8IDEuNSB8fCBwYWdlQ291bnQgPiAzO1xuICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJkaXNwbGF5OmlubGluZS1mbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6OHB4O1xuICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiR7cGFnZVdhcm5pbmcgPyAnI2ZlZjljMycgOiAnI2YwZmRmNCd9O1xuICAgICAgICAgICAgICBib3JkZXI6MXB4IHNvbGlkICR7cGFnZVdhcm5pbmcgPyAnI2ZkZTA0NycgOiAnI2JiZjdkMCd9O1xuICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjhweCAxNHB4O21hcmdpbi1ib3R0b206MTZweDtcIj5cbiAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjEuM2VtO1wiPlx1RDgzRFx1RENDNDwvc3Bhbj5cbiAgICAgIDxzdHJvbmc+JHtwYWdlQ291bnR9IHBhZ2Uke3BhZ2VDb3VudCAhPT0gMSA/ICdzJyA6ICcnfTwvc3Ryb25nPlxuICAgICAgJHtwYWdlV2FybmluZ1xuICAgICAgICA/ICc8c3BhbiBzdHlsZT1cImNvbG9yOiNkOTc3MDY7Zm9udC1zaXplOjAuODhlbTtcIj5cdTI2QTAgU2VuaW9yIGNhbmRpZGF0ZSB0YXJnZXQgaXMgMlx1MjAxMzMgcGFnZXM8L3NwYW4+J1xuICAgICAgICA6ICc8c3BhbiBzdHlsZT1cImNvbG9yOiMxNjY1MzQ7Zm9udC1zaXplOjAuODhlbTtcIj5cdTI3MTMgR29vZCBsZW5ndGg8L3NwYW4+J31cbiAgICA8L2Rpdj5gO1xuICB9XG5cbiAgaWYgKGF0c0Vycm9yKSB7XG4gICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2ZlZTJlMjtib3JkZXI6MXB4IHNvbGlkICNmY2E1YTU7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzoxMnB4IDE2cHg7bWFyZ2luLWJvdHRvbToyMHB4O1wiPlxuICAgICAgPHN0cm9uZz5cdTI2QTAgQVRTIHZhbGlkYXRpb24gZXJyb3I6PC9zdHJvbmc+ICR7ZXNjYXBlSHRtbChhdHNFcnJvcil9XG4gICAgPC9kaXY+YDtcbiAgICByZXR1cm4gaHRtbDtcbiAgfVxuXG4gIGlmICghY2hlY2tzLmxlbmd0aCkge1xuICAgIHJldHVybiBodG1sO1xuICB9XG5cbiAgY29uc3Qga2V5d29yZEZhaWwgPSBjaGVja3Muc29tZSgoY2hlY2spID0+IGNoZWNrLm5hbWUgPT09ICdhdHNfa2V5d29yZF9wcmVzZW5jZScgJiYgY2hlY2suc3RhdHVzID09PSAnZmFpbCcpO1xuICBjb25zdCBzdGF0dXNDb2xvdXIgPSBzdW1tYXJ5LmZhaWwgPiAwID8gJyNkYzI2MjYnIDogc3VtbWFyeS53YXJuID4gMCA/ICcjZDk3NzA2JyA6ICcjMTY2NTM0JztcbiAgY29uc3Qgc3RhdHVzSWNvbiA9IHN1bW1hcnkuZmFpbCA+IDAgPyAnXHUyNzRDJyA6IHN1bW1hcnkud2FybiA+IDAgPyAnXHUyNkEwJyA6ICdcdTI3MDUnO1xuXG4gIGh0bWwgKz0gYFxuICAgIDxkZXRhaWxzIG9wZW4gc3R5bGU9XCJtYXJnaW4tYm90dG9tOjIwcHg7XCI+XG4gICAgICA8c3VtbWFyeSBzdHlsZT1cImN1cnNvcjpwb2ludGVyO2ZvbnQtd2VpZ2h0OjcwMDtmb250LXNpemU6MWVtO3BhZGRpbmc6OHB4IDA7Y29sb3I6JHtzdGF0dXNDb2xvdXJ9O1wiPlxuICAgICAgICAke3N0YXR1c0ljb259IEFUUyBSZXBvcnQgXHUyMDE0ICR7c3VtbWFyeS5wYXNzfSBwYXNzLCAke3N1bW1hcnkud2Fybn0gd2FybiwgJHtzdW1tYXJ5LmZhaWx9IGZhaWxcbiAgICAgIDwvc3VtbWFyeT5cbiAgICAgIDx0YWJsZSBjbGFzcz1cInJldmlldy10YWJsZVwiIHN0eWxlPVwibWFyZ2luLXRvcDoxMHB4O2ZvbnQtc2l6ZTowLjg3ZW07XCI+XG4gICAgICAgIDx0aGVhZD48dHI+PHRoPkNoZWNrPC90aD48dGg+Rm9ybWF0PC90aD48dGg+U3RhdHVzPC90aD48dGg+RGV0YWlsPC90aD48L3RyPjwvdGhlYWQ+XG4gICAgICAgIDx0Ym9keT5gO1xuXG4gIGZvciAoY29uc3QgY2hlY2sgb2YgY2hlY2tzKSB7XG4gICAgY29uc3QgYmFja2dyb3VuZCA9IGNoZWNrLnN0YXR1cyA9PT0gJ3Bhc3MnID8gJyNmMGZkZjQnIDogY2hlY2suc3RhdHVzID09PSAnd2FybicgPyAnI2ZlZjljMycgOiAnI2ZlZTJlMic7XG4gICAgY29uc3QgaWNvbiA9IGNoZWNrLnN0YXR1cyA9PT0gJ3Bhc3MnID8gJ1x1MjcwNScgOiBjaGVjay5zdGF0dXMgPT09ICd3YXJuJyA/ICdcdTI2QTAnIDogJ1x1Mjc0Qyc7XG4gICAgY29uc3QgZm9ybWF0QmFkZ2UgPSBgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MTFweDtiYWNrZ3JvdW5kOiNlMGU3ZmY7Y29sb3I6IzM3MzBhMztib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjFweCA1cHg7XCI+JHtlc2NhcGVIdG1sKGNoZWNrLmZvcm1hdCl9PC9zcGFuPmA7XG5cbiAgICBodG1sICs9IGA8dHIgc3R5bGU9XCJiYWNrZ3JvdW5kOiR7YmFja2dyb3VuZH07XCI+XG4gICAgICA8dGQgc3R5bGU9XCJmb250LXdlaWdodDo2MDA7XCI+JHtlc2NhcGVIdG1sKGNoZWNrLmxhYmVsKX08L3RkPlxuICAgICAgPHRkPiR7Zm9ybWF0QmFkZ2V9PC90ZD5cbiAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO1wiPiR7aWNvbn08L3RkPlxuICAgICAgPHRkPjxzbWFsbD4ke2VzY2FwZUh0bWwoY2hlY2suZGV0YWlsKX08L3NtYWxsPjwvdGQ+XG4gICAgPC90cj5gO1xuICB9XG5cbiAgaHRtbCArPSAnPC90Ym9keT48L3RhYmxlPjwvZGV0YWlscz4nO1xuXG4gIGlmIChzdW1tYXJ5LmZhaWwgPiAwKSB7XG4gICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2ZlZTJlMjtib3JkZXI6MXB4IHNvbGlkICNmY2E1YTU7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzoxMHB4IDE2cHg7bWFyZ2luLWJvdHRvbToyMHB4O1wiPlxuICAgICAgPHN0cm9uZz5cdTI3NEMgRml4IHJlcXVpcmVkOjwvc3Ryb25nPiBTb21lIGNoZWNrcyBmYWlsZWQuIEJsb2NrZWQgZm9ybWF0cyBhcmUgZ3JleWVkIG91dCBiZWxvdy5cbiAgICAgICR7a2V5d29yZEZhaWxcbiAgICAgICAgPyAnPGJyPjxzdHJvbmc+QVRTIGtleXdvcmQgZmFpbHVyZSBibG9ja3MgYWxsIGRvd25sb2Fkczwvc3Ryb25nPiBcdTIwMTQgcmUtcnVuIGN1c3RvbWlzYXRpb25zIHRvIGltcHJvdmUga2V5d29yZCBjb3ZlcmFnZS4nXG4gICAgICAgIDogJyd9XG4gICAgPC9kaXY+YDtcbiAgfVxuXG4gIHJldHVybiBodG1sO1xufVxuXG4vLyBDaGVja3MgdGhhdCBhcmUgYWR2aXNvcnkgb25seSBcdTIwMTQgdGhleSB3YXJuIGJ1dCBuZXZlciBibG9jayB0aGUgZG93bmxvYWQgYnV0dG9uLlxuLy8gT25seSBnZW51aW5lbHkgY3JpdGljYWwgZmFpbHVyZXMgKGZpbGUgbm90IGZvdW5kLCBQREYgdW5yZWFkYWJsZSwgYnJva2VuIG91dHB1dClcbi8vIHNob3VsZCBwcmV2ZW50IGEgdXNlciBmcm9tIGRvd25sb2FkaW5nLlxuY29uc3QgX05PTl9CTE9DS0lOR19DSEVDS1MgPSBuZXcgU2V0KFtcbiAgJ2N2X3BhZ2VfY291bnQnLCAgICAgICAgICAgICAgIC8vIGFkdmlzb3J5OiBwYWdlIGxlbmd0aCBvdXRzaWRlIGlkZWFsIHJhbmdlXG4gICdwZGZfdXNfbGV0dGVyJywgICAgICAgICAgICAgICAvLyBhZHZpc29yeTogcGFnZSBzaXplXG4gICdkb2N4X3plcm9fc2hhcGVzJywgICAgICAgICAgICAvLyBhZHZpc29yeTogQVRTIGZvcm1hdHRpbmcgaGludFxuICAnZG9jeF9zdGFuZGFyZF9oZWFkaW5ncycsICAgICAgLy8gYWR2aXNvcnk6IEFUUyBoZWFkaW5nIHRleHRcbiAgJ2RvY3hfaGVhZGluZzFfcHJlc2VudCcsICAgICAgIC8vIGFkdmlzb3J5OiBBVFMgaGVhZGluZyBzdHlsZVxuICAnZG9jeF9kYXRlX2Zvcm1hdF9jb25zaXN0ZW50JywgLy8gYWR2aXNvcnk6IGRhdGUgZm9ybWF0IGNvbnNpc3RlbmN5XG4gICdkb2N4X3B1YmxpY2F0aW9uc19oZWFkaW5nJywgICAvLyBhZHZpc29yeTogcHVibGljYXRpb25zIGhlYWRpbmcgdGV4dFxuICAnaHRtbF9qc29ubGRfdmFsaWRfcGVyc29uJywgICAgLy8gYWR2aXNvcnk6IEpTT04tTEQgc2NoZW1hIHR5cGVcbiAgJ2h0bWxfanNvbmxkX2tub3dzX2Fib3V0JywgICAgIC8vIGFkdmlzb3J5OiBKU09OLUxEIHNraWxscyBwb3B1bGF0aW9uXG5dKTtcblxuZnVuY3Rpb24gX3JlbmRlckRvd25sb2FkR3JpZChmaWxlcywgY2hlY2tzLCBzdW1tYXJ5LCBnZW5lcmF0ZWRBdCA9IG51bGwsIGdlbmVyYXRpb25SdW4gPSBudWxsKSB7XG4gIGNvbnN0IGtleXdvcmRGYWlsID0gY2hlY2tzLnNvbWUoKGNoZWNrKSA9PiBjaGVjay5uYW1lID09PSAnYXRzX2tleXdvcmRfcHJlc2VuY2UnICYmIGNoZWNrLnN0YXR1cyA9PT0gJ2ZhaWwnKTtcbiAgY29uc3QgaXNDcml0aWNhbEZhaWwgPSAoY2hlY2spID0+IGNoZWNrLnN0YXR1cyA9PT0gJ2ZhaWwnICYmICFfTk9OX0JMT0NLSU5HX0NIRUNLUy5oYXMoY2hlY2submFtZSk7XG4gIGNvbnN0IGJsb2NrRG9jeCA9IGtleXdvcmRGYWlsIHx8IGNoZWNrcy5zb21lKChjaGVjaykgPT4gY2hlY2suZm9ybWF0ID09PSAnZG9jeCcgJiYgaXNDcml0aWNhbEZhaWwoY2hlY2spKTtcbiAgY29uc3QgYmxvY2tIdG1sID0ga2V5d29yZEZhaWwgfHwgY2hlY2tzLnNvbWUoKGNoZWNrKSA9PiBjaGVjay5mb3JtYXQgPT09ICdodG1sJyAmJiBpc0NyaXRpY2FsRmFpbChjaGVjaykpO1xuICBjb25zdCBibG9ja1BkZiAgPSBrZXl3b3JkRmFpbCB8fCBjaGVja3Muc29tZSgoY2hlY2spID0+IGNoZWNrLmZvcm1hdCA9PT0gJ3BkZicgICYmIGlzQ3JpdGljYWxGYWlsKGNoZWNrKSk7XG5cbiAgbGV0IGdlbmVyYXRlZExhYmVsID0gJyc7XG4gIGlmIChnZW5lcmF0ZWRBdCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkID0gbmV3IERhdGUoZ2VuZXJhdGVkQXQpO1xuICAgICAgY29uc3QgZGF0ZVN0ciA9IGQudG9Mb2NhbGVTdHJpbmcoJ2VuLVVTJywge1xuICAgICAgICBtb250aDogJ3Nob3J0JywgZGF5OiAnbnVtZXJpYycsIHllYXI6ICdudW1lcmljJyxcbiAgICAgICAgaG91cjogJ251bWVyaWMnLCBtaW51dGU6ICcyLWRpZ2l0JyxcbiAgICAgIH0pO1xuICAgICAgZ2VuZXJhdGVkTGFiZWwgPSAoZ2VuZXJhdGlvblJ1biAmJiBnZW5lcmF0aW9uUnVuID4gMSlcbiAgICAgICAgPyBgUnVuICMke2dlbmVyYXRpb25SdW59IFx1MjAxNCAke2RhdGVTdHJ9YFxuICAgICAgICA6IGRhdGVTdHI7XG4gICAgfSBjYXRjaCAoXykgeyAvKiBpZ25vcmUgKi8gfVxuICB9XG5cbiAgbGV0IGh0bWwgPSAnPGRpdiBjbGFzcz1cImRvd25sb2FkLXNlY3Rpb25cIj48ZGl2IGNsYXNzPVwiZG93bmxvYWQtZ3JpZFwiPic7XG4gIGlmICghZmlsZXMubGVuZ3RoKSB7XG4gICAgaHRtbCArPSAnPHA+Tm8gZG93bmxvYWRhYmxlIGZpbGVzIGZvdW5kLiBQbGVhc2UgdHJ5IGdlbmVyYXRpbmcgeW91ciBDViBhZ2Fpbi48L3A+JztcbiAgICBodG1sICs9ICc8L2Rpdj48L2Rpdj4nO1xuICAgIHJldHVybiBodG1sO1xuICB9XG5cbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgY29uc3QgYmxvY2tlZCA9IChmaWxlLmZvcm1hdCA9PT0gJ2RvY3gnICYmIGJsb2NrRG9jeClcbiAgICAgIHx8IChmaWxlLmZvcm1hdCA9PT0gJ2h0bWwnICYmIGJsb2NrSHRtbClcbiAgICAgIHx8IChmaWxlLmZvcm1hdCA9PT0gJ3BkZicgJiYgYmxvY2tQZGYpO1xuICAgIGNvbnN0IGJsb2NrZWRTdHlsZSA9IGJsb2NrZWRcbiAgICAgID8gJ2N1cnNvcjpub3QtYWxsb3dlZDtvcGFjaXR5OjAuNDtiYWNrZ3JvdW5kOiM5Y2EzYWY7Ym9yZGVyLWNvbG9yOiM5Y2EzYWY7J1xuICAgICAgOiAnJztcbiAgICBjb25zdCBibG9ja2VkTWVzc2FnZSA9IGJsb2NrZWRcbiAgICAgID8gJzxkaXYgc3R5bGU9XCJmb250LXNpemU6MC43OGVtO2NvbG9yOiNkYzI2MjY7bWFyZ2luLXRvcDo0cHg7XCI+XHUyNkQ0IEJsb2NrZWQgXHUyMDE0IG91dHB1dCBmaWxlIGNvdWxkIG5vdCBiZSBnZW5lcmF0ZWQ8L2Rpdj4nXG4gICAgICA6ICcnO1xuICAgIGNvbnN0IHRpbWVzdGFtcExpbmUgPSBnZW5lcmF0ZWRMYWJlbFxuICAgICAgPyBgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjc1ZW07Y29sb3I6IzljYTNhZjttYXJnaW4tdG9wOjNweDtcIj5HZW5lcmF0ZWQgJHtnZW5lcmF0ZWRMYWJlbH08L2Rpdj5gXG4gICAgICA6ICc8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuNzVlbTtjb2xvcjojYzBjNGNjO21hcmdpbi10b3A6M3B4O1wiPk5vdCB5ZXQgZ2VuZXJhdGVkPC9kaXY+JztcblxuICAgIGNvbnN0IHByZXZpZXdCYWRnZSA9IGZpbGUuZm9ybWF0ID09PSAncHJldmlldydcbiAgICAgID8gJzxzcGFuIHN0eWxlPVwiZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luLWxlZnQ6NnB4O2ZvbnQtc2l6ZTowLjc1ZW07Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOiM5MjQwMGU7YmFja2dyb3VuZDojZmVmM2M3O2JvcmRlcjoxcHggc29saWQgI2ZjZDM0ZDtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjFweCA1cHg7dmVydGljYWwtYWxpZ246bWlkZGxlO1wiPldvcmtpbmcgZmlsZSBcdTIwMTQgbm90IGZvciBzdWJtaXNzaW9uPC9zcGFuPidcbiAgICAgIDogJyc7XG5cbiAgICBodG1sICs9IGBcbiAgICAgIDxkaXYgY2xhc3M9XCJkb3dubG9hZC1pdGVtXCIgc3R5bGU9XCIke2Jsb2NrZWQgPyAnb3BhY2l0eTowLjc1OycgOiAnJ30ke2ZpbGUuZm9ybWF0ID09PSAncHJldmlldycgPyAnYm9yZGVyLXN0eWxlOmRhc2hlZDsnIDogJyd9XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkb3dubG9hZC1pY29uXCI+JHtmaWxlLmljb259PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkb3dubG9hZC1pbmZvXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRvd25sb2FkLW5hbWVcIj4ke2VzY2FwZUh0bWwoZmlsZS5maWxlbmFtZSl9JHtwcmV2aWV3QmFkZ2V9PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRvd25sb2FkLWRlc2NyaXB0aW9uXCI+JHtlc2NhcGVIdG1sKGZpbGUuZGVzY3JpcHRpb24pfTwvZGl2PlxuICAgICAgICAgICR7dGltZXN0YW1wTGluZX1cbiAgICAgICAgICAke2Jsb2NrZWRNZXNzYWdlfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgJHtibG9ja2VkXG4gICAgICAgICAgPyBgPGJ1dHRvbiBjbGFzcz1cImJ0bi1kb3dubG9hZFwiIGRpc2FibGVkIHN0eWxlPVwiJHtibG9ja2VkU3R5bGV9XCI+QmxvY2tlZDwvYnV0dG9uPmBcbiAgICAgICAgICA6ICgoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IF9zaWQgPSB0eXBlb2YgZ2V0U2Vzc2lvbklkRnJvbVVSTCA9PT0gJ2Z1bmN0aW9uJyA/IGdldFNlc3Npb25JZEZyb21VUkwoKSA6IG51bGw7XG4gICAgICAgICAgICAgIGNvbnN0IF9zcCAgPSBfc2lkID8gYD9zZXNzaW9uX2lkPSR7ZW5jb2RlVVJJQ29tcG9uZW50KF9zaWQpfWAgOiAnJztcbiAgICAgICAgICAgICAgcmV0dXJuIGA8YSBocmVmPVwiL2FwaS9kb3dubG9hZC8ke2VuY29kZVVSSUNvbXBvbmVudChmaWxlLmZpbGVuYW1lKX0ke19zcH1cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuLWRvd25sb2FkIGRvd25sb2FkLWxpbmtcIiBkb3dubG9hZD1cIiR7ZXNjYXBlSHRtbChmaWxlLmZpbGVuYW1lKX1cIlxuICAgICAgICAgICAgICAgIHN0eWxlPVwidGV4dC1kZWNvcmF0aW9uOm5vbmU7ZGlzcGxheTppbmxpbmUtZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjtcIj5Eb3dubG9hZDwvYT5gO1xuICAgICAgICAgICAgfSkoKX1cbiAgICAgIDwvZGl2PmA7XG4gIH1cblxuICBodG1sICs9ICc8L2Rpdj48L2Rpdj4nO1xuICBpZiAoc3VtbWFyeS5mYWlsID4gMCAmJiBmaWxlcy5sZW5ndGgpIHtcbiAgICBodG1sICs9ICc8cCBzdHlsZT1cIm1hcmdpbi10b3A6MTJweDtjb2xvcjojNmI3MjgwO2ZvbnQtc2l6ZTowLjg4ZW07XCI+QmxvY2tlZCBmb3JtYXRzIHJlZmxlY3QgQVRTIHZhbGlkYXRpb24gZmFpbHVyZXMgZm9yIHRoZSBjb3JyZXNwb25kaW5nIG91dHB1dCB0eXBlcy48L3A+JztcbiAgfVxuICByZXR1cm4gaHRtbDtcbn1cblxuZnVuY3Rpb24gX3JlbmRlclJlZmluZW1lbnRQYW5lbCgpIHtcbiAgcmV0dXJuIGA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDoyNHB4O3BhZGRpbmc6MTZweDtiYWNrZ3JvdW5kOiNmOGZhZmM7Ym9yZGVyOjFweCBzb2xpZCAjZTJlOGYwO1xuICAgICAgICAgICAgYm9yZGVyLXJhZGl1czo4cHg7XCI+XG4gICAgPGRpdiBzdHlsZT1cImZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjEwcHg7Y29sb3I6IzM3NDE1MTtcIj5cdTIxQkIgSXRlcmF0aXZlIFJlZmluZW1lbnQ8L2Rpdj5cbiAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuOWVtO2NvbG9yOiM2YjcyODA7bWFyZ2luLWJvdHRvbToxMnB4O1wiPlxuICAgICAgR28gYmFjayB0byByZWZpbmUgYW4gZWFybGllciBzdGVwIFx1MjAxNCBhbGwgcHJpb3IgZGVjaXNpb25zIGFuZCBhcHByb3ZhbHMgYXJlIHByZXNlcnZlZC5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDoxMHB4O2ZsZXgtd3JhcDp3cmFwO1wiPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1zZWNvbmRhcnlcIiBvbmNsaWNrPVwiYmFja1RvUGhhc2UoJ2N1c3RvbWl6YXRpb25zJylcIiB0aXRsZT1cIlJldHVybiB0byBDdXN0b21pc2Ugc3RlcFwiPlxuICAgICAgICBcdTIxQkIgUmVmaW5lIEN1c3RvbWlzZVxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLXNlY29uZGFyeVwiIG9uY2xpY2s9XCJiYWNrVG9QaGFzZSgncmV3cml0ZScpXCIgdGl0bGU9XCJSZXR1cm4gdG8gUmV3cml0ZSBSZXZpZXcgc3RlcFwiPlxuICAgICAgICBcdTIxQkIgUmVmaW5lIFJld3JpdGVzXG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJidG4tc2Vjb25kYXJ5XCIgb25jbGljaz1cImJhY2tUb1BoYXNlKCdhbmFseXNpcycpXCIgdGl0bGU9XCJSZXR1cm4gdG8gQW5hbHlzaXMgc3RlcFwiPlxuICAgICAgICBcdTIxQkIgUmUtYW5hbHlzZSBKb2JcbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gO1xufVxuXG5hc3luYyBmdW5jdGlvbiBfZmV0Y2hQZXJzdWFzaW9uSHRtbCgpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3BlcnN1YXNpb24tY2hlY2snKTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgIGlmICghcmVzcG9uc2Uub2sgfHwgIWRhdGEub2spIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBjb25zdCBzdW1tYXJ5ID0gZGF0YS5zdW1tYXJ5IHx8IHsgZmxhZ2dlZDogMCwgc3Ryb25nX2NvdW50OiAwLCB0b3RhbF9idWxsZXRzOiAwIH07XG4gICAgY29uc3QgZmluZGluZ3MgPSBBcnJheS5pc0FycmF5KGRhdGEuZmluZGluZ3MpID8gZGF0YS5maW5kaW5ncyA6IFtdO1xuICAgIGNvbnN0IHNjb3JlQ29sb3IgPSBzdW1tYXJ5LmZsYWdnZWQgPT09IDAgPyAnIzEwYjk4MScgOiBzdW1tYXJ5LmZsYWdnZWQgPD0gMyA/ICcjZjU5ZTBiJyA6ICcjZWY0NDQ0JztcbiAgICBjb25zdCBzY29yZUxhYmVsID0gc3VtbWFyeS5mbGFnZ2VkID09PSAwXG4gICAgICA/ICdFeGNlbGxlbnQnXG4gICAgICA6IHN1bW1hcnkuZmxhZ2dlZCA8PSAzXG4gICAgICAgID8gJ0dvb2QgXHUyMDE0IG1pbm9yIGltcHJvdmVtZW50cyBwb3NzaWJsZSdcbiAgICAgICAgOiAnTmVlZHMgYXR0ZW50aW9uJztcblxuICAgIGxldCBodG1sID0gYDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOjIwcHg7Ym9yZGVyOjFweCBzb2xpZCAjZTJlOGYwO2JvcmRlci1yYWRpdXM6OHB4O292ZXJmbG93OmhpZGRlbjtcIj5cbiAgICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nOjE0cHggMTZweDtiYWNrZ3JvdW5kOiNmOGZhZmM7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2FsaWduLWl0ZW1zOmNlbnRlcjtjdXJzb3I6cG9pbnRlcjtcIlxuICAgICAgICAgICBvbmNsaWNrPVwidGhpcy5uZXh0RWxlbWVudFNpYmxpbmcuc3R5bGUuZGlzcGxheT10aGlzLm5leHRFbGVtZW50U2libGluZy5zdHlsZS5kaXNwbGF5PT09J25vbmUnPydibG9jayc6J25vbmUnXCI+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXdlaWdodDo2MDA7Y29sb3I6IzFmMjkzNztcIj5cdUQ4M0RcdURDQUEgQnVsbGV0IFBlcnN1YXNpdmVuZXNzPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwibWFyZ2luLWxlZnQ6MTJweDtiYWNrZ3JvdW5kOiR7c2NvcmVDb2xvcn07Y29sb3I6I2ZmZjtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjJweCA4cHg7Zm9udC1zaXplOjAuOGVtO1wiPiR7c2NvcmVMYWJlbH08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtjb2xvcjojNmI3MjgwO1wiPlxuICAgICAgICAgICR7c3VtbWFyeS5zdHJvbmdfY291bnR9LyR7c3VtbWFyeS50b3RhbF9idWxsZXRzfSBzdHJvbmcgXHUwMEI3ICR7c3VtbWFyeS5mbGFnZ2VkfSBmbGFnZ2VkIFx1MDBCNyBjbGljayB0byAke3N1bW1hcnkuZmxhZ2dlZCA+IDAgPyAnZXhwYW5kJyA6ICdjb2xsYXBzZSd9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+YDtcblxuICAgIGlmIChmaW5kaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwicGFkZGluZzoxMnB4IDE2cHg7ZGlzcGxheToke3N1bW1hcnkuZmxhZ2dlZCA8PSAzID8gJ2Jsb2NrJyA6ICdub25lJ307XCI+YDtcbiAgICAgIGZvciAoY29uc3QgZmluZGluZyBvZiBmaW5kaW5ncykge1xuICAgICAgICBjb25zdCBzZXZlcml0eSA9IGZpbmRpbmcuc2V2ZXJpdHkgPT09ICd3YXJuaW5nJ1xuICAgICAgICAgID8geyBiYWNrZ3JvdW5kOiAnI2ZmZjdlZCcsIGJvcmRlcjogJyNmNTllMGInLCBsYWJlbDogJ1x1MjZBMCBXYXJuaW5nJyB9XG4gICAgICAgICAgOiB7IGJhY2tncm91bmQ6ICcjZjBmOWZmJywgYm9yZGVyOiAnIzNiODJmNicsIGxhYmVsOiAnXHUyMTM5IEluZm8nIH07XG4gICAgICAgIGNvbnN0IHRydW5jYXRlZFRleHQgPSBmaW5kaW5nLnRleHQgJiYgZmluZGluZy50ZXh0Lmxlbmd0aCA+IDEyMFxuICAgICAgICAgID8gYCR7ZmluZGluZy50ZXh0LnNsaWNlKDAsIDEyMCl9XHUyMDI2YFxuICAgICAgICAgIDogZmluZGluZy50ZXh0IHx8ICcnO1xuICAgICAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxMnB4O3BhZGRpbmc6MTBweCAxMnB4O2JhY2tncm91bmQ6JHtzZXZlcml0eS5iYWNrZ3JvdW5kfTtib3JkZXItbGVmdDozcHggc29saWQgJHtzZXZlcml0eS5ib3JkZXJ9O2JvcmRlci1yYWRpdXM6MCA2cHggNnB4IDA7XCI+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjhlbTtjb2xvcjojNmI3MjgwO21hcmdpbi1ib3R0b206NHB4O1wiPlxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJiYWNrZ3JvdW5kOiR7c2V2ZXJpdHkuYm9yZGVyfTtjb2xvcjojZmZmO2JvcmRlci1yYWRpdXM6M3B4O3BhZGRpbmc6MXB4IDZweDtmb250LXNpemU6MC45ZW07XCI+JHtzZXZlcml0eS5sYWJlbH08L3NwYW4+XG4gICAgICAgICAgICBCdWxsZXQgJHsoZmluZGluZy5idWxsZXRfaW5kZXggPz8gMCkgKyAxfSR7ZmluZGluZy5leHBfaWQgPyBgIFx1MDBCNyAke2VzY2FwZUh0bWwoZmluZGluZy5leHBfaWQpfWAgOiAnJ31cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuOWVtO2NvbG9yOiMzNzQxNTE7bWFyZ2luLWJvdHRvbTo2cHg7XCI+XCIke2VzY2FwZUh0bWwodHJ1bmNhdGVkVGV4dCl9XCI8L2Rpdj5cbiAgICAgICAgICA8dWwgc3R5bGU9XCJtYXJnaW46MDtwYWRkaW5nLWxlZnQ6MThweDtcIj5gO1xuICAgICAgICBmb3IgKGNvbnN0IGlzc3VlIG9mIGZpbmRpbmcuaXNzdWVzIHx8IFtdKSB7XG4gICAgICAgICAgaHRtbCArPSBgPGxpIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtjb2xvcjojNmI3MjgwO21hcmdpbi1ib3R0b206MnB4O1wiPiR7ZXNjYXBlSHRtbChpc3N1ZS5zdWdnZXN0aW9uKX08L2xpPmA7XG4gICAgICAgIH1cbiAgICAgICAgaHRtbCArPSAnPC91bD48L2Rpdj4nO1xuICAgICAgfVxuICAgICAgaHRtbCArPSAnPC9kaXY+JztcbiAgICB9IGVsc2Uge1xuICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cInBhZGRpbmc6MTJweCAxNnB4O2NvbG9yOiMxMGI5ODE7Zm9udC1zaXplOjAuOWVtO1wiPkFsbCBidWxsZXRzIG1lZXQgcGVyc3Vhc2l2ZW5lc3MgY3JpdGVyaWEuPC9kaXY+JztcbiAgICB9XG5cbiAgICAvLyBOYXJyYXRpdmUtdGhyZWFkIGFkdmlzb3J5IChHQVAtMjgxKVxuICAgIGNvbnN0IG50YSA9IHN1bW1hcnkubmFycmF0aXZlX3RocmVhZF9hZHZpc29yeTtcbiAgICBpZiAobnRhKSB7XG4gICAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwicGFkZGluZzoxMHB4IDE2cHg7YmFja2dyb3VuZDojZmVmOWMzO2JvcmRlci10b3A6MXB4IHNvbGlkICNmZGU2OGE7XCI+XG4gICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC13ZWlnaHQ6NjAwO2NvbG9yOiM5MjQwMGU7XCI+XHVEODNFXHVEREY1IE5hcnJhdGl2ZSBmb2N1cyBhZHZpc29yeTo8L3NwYW4+XG4gICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjAuOWVtO2NvbG9yOiM3ODM1MGY7bWFyZ2luLWxlZnQ6NnB4O1wiPiR7ZXNjYXBlSHRtbChudGEuZGV0YWlsKX08L3NwYW4+XG4gICAgICA8L2Rpdj5gO1xuICAgIH1cblxuICAgIC8vIE5hcnJhdGl2ZS1hcmMgYWR2aXNvcnkgKEdBUC0xNyk6IHJlY2VudCByb2xlIHNob3VsZCBzaG93IHN0cm9uZ2VzdCB2ZXJic1xuICAgIGNvbnN0IG5hYSA9IHN1bW1hcnkubmFycmF0aXZlX2FyY19hZHZpc29yeTtcbiAgICBpZiAobmFhKSB7XG4gICAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwicGFkZGluZzoxMHB4IDE2cHg7YmFja2dyb3VuZDojZmZmN2VkO2JvcmRlci10b3A6MXB4IHNvbGlkICNmZWQ3YWE7XCI+XG4gICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC13ZWlnaHQ6NjAwO2NvbG9yOiM5YTM0MTI7XCI+XHVEODNEXHVEQ0M4IE5hcnJhdGl2ZSBhcmMgYWR2aXNvcnk6PC9zcGFuPlxuICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjllbTtjb2xvcjojN2MyZDEyO21hcmdpbi1sZWZ0OjZweDtcIj4ke2VzY2FwZUh0bWwobmFhLmRldGFpbCl9PC9zcGFuPlxuICAgICAgPC9kaXY+YDtcbiAgICB9XG5cbiAgICBodG1sICs9ICc8L2Rpdj4nO1xuICAgIHJldHVybiBodG1sO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy53YXJuKCdQZXJzdWFzaW9uIGNoZWNrIGZhaWxlZDonLCBlcnJvcik7XG4gICAgcmV0dXJuICcnO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHBvcHVsYXRlRG93bmxvYWRUYWIoY3ZEYXRhKSB7XG4gIHN0YXRlTWFuYWdlci5zZXRUYWJEYXRhKCdjdicsIGN2RGF0YSk7XG5cbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIGlmICghY29udGVudCkgcmV0dXJuO1xuXG4gIGlmICghY3ZEYXRhIHx8ICh0eXBlb2YgY3ZEYXRhID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyhjdkRhdGEpLmxlbmd0aCA9PT0gMCkpIHtcbiAgICBjb250ZW50LmlubmVySFRNTCA9ICc8aDE+XHUyQjA3XHVGRTBGIERvd25sb2FkIEdlbmVyYXRlZCBGaWxlczwvaDE+PGRpdiBjbGFzcz1cImVtcHR5LXN0YXRlXCI+PGRpdiBjbGFzcz1cImljb25cIj5cdTJCMDdcdUZFMEY8L2Rpdj48aDM+Tm8gRmlsZXMgQXZhaWxhYmxlPC9oMz48cD5HZW5lcmF0ZSBhIENWIGZpcnN0IHRvIHNlZSBkb3dubG9hZCBvcHRpb25zLjwvcD48L2Rpdj4nO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gJzxoMT5cdTJCMDdcdUZFMEYgRG93bmxvYWQgR2VuZXJhdGVkIEZpbGVzPC9oMT48cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7bWFyZ2luLWJvdHRvbToxNnB4O1wiPlJ1bm5pbmcgQVRTIHZhbGlkYXRpb25cdTIwMjY8L3A+JztcblxuICBsZXQgY2hlY2tzID0gW107XG4gIGxldCBwYWdlQ291bnQgPSBudWxsO1xuICBsZXQgc3VtbWFyeSA9IHsgcGFzczogMCwgd2FybjogMCwgZmFpbDogMCB9O1xuICBsZXQgYXRzRXJyb3IgPSBudWxsO1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvYXRzLXZhbGlkYXRlJyk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgY2hlY2tzID0gZGF0YS5jaGVja3MgfHwgW107XG4gICAgICBwYWdlQ291bnQgPSBkYXRhLnBhZ2VfY291bnQgPz8gbnVsbDtcbiAgICAgIHN1bW1hcnkgPSBkYXRhLnN1bW1hcnkgfHwgc3VtbWFyeTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXRzRXJyb3IgPSBkYXRhLmVycm9yIHx8ICdWYWxpZGF0aW9uIGZhaWxlZCc7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGF0c0Vycm9yID0gYE5ldHdvcmsgZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gO1xuICB9XG5cbiAgY29uc3QgZmlsZXMgPSBfY29sbGVjdERvd25sb2FkYWJsZUZpbGVzKGN2RGF0YSk7XG4gIGxldCBodG1sID0gJzxoMT5cdTJCMDdcdUZFMEYgRmlsZSBSZXZpZXc8L2gxPic7XG4gIGh0bWwgKz0gJzxwIHN0eWxlPVwiZm9udC1zaXplOjAuODNlbTtjb2xvcjojOTRhM2I4O21hcmdpbi1ib3R0b206MTZweDtwYWRkaW5nOjhweCAxMnB4O2JhY2tncm91bmQ6I2Y4ZmFmYztib3JkZXItcmFkaXVzOjZweDtib3JkZXItbGVmdDozcHggc29saWQgI2UyZThmMDtcIj5cdTI3MDUgPGVtPlRoaXMgaXMgdGhlIDxzdHJvbmc+Y29tcGxldGVuZXNzIGNoZWNrPC9zdHJvbmc+IHN0ZXAgXHUyMDE0IEFUUyB2YWxpZGF0aW9uIHJ1bnMgaGVyZSBhbmQgeW91IGNhbiBhcmNoaXZlIHRoZSBhcHBsaWNhdGlvbi4gVG8gZG93bmxvYWQgZmlsZXMgaW1tZWRpYXRlbHkgYWZ0ZXIgZ2VuZXJhdGlvbiwgdXNlIHRoZSA8c3Ryb25nPkdlbmVyYXRlZCBGaWxlczwvc3Ryb25nPiB0YWIuPC9lbT48L3A+JztcbiAgaHRtbCArPSBfcmVuZGVyVmFsaWRhdGlvblN1bW1hcnkoY2hlY2tzLCBzdW1tYXJ5LCBwYWdlQ291bnQsIGF0c0Vycm9yKTtcblxuICBjb25zdCBzdW1tYXJ5V2FybmluZ3MgPSAoY3ZEYXRhLm1ldGFkYXRhPy5zdW1tYXJ5X3dhcm5pbmdzIHx8IFtdKTtcbiAgaWYgKHN1bW1hcnlXYXJuaW5ncy5sZW5ndGgpIHtcbiAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZmVmOWMzO2JvcmRlcjoxcHggc29saWQgI2ZjZDM0ZDtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjEycHggMTZweDttYXJnaW4tYm90dG9tOjE2cHg7XCI+XG4gICAgICA8c3Ryb25nPlx1MjZBMCBQcm9mZXNzaW9uYWwgU3VtbWFyeSBxdWFsaXR5IG5vdGljZXMgKCR7c3VtbWFyeVdhcm5pbmdzLmxlbmd0aH0pOjwvc3Ryb25nPlxuICAgICAgPHVsIHN0eWxlPVwibWFyZ2luOjhweCAwIDAgMDtwYWRkaW5nLWxlZnQ6MThweDtcIj5cbiAgICAgICAgJHtzdW1tYXJ5V2FybmluZ3MubWFwKHcgPT4gYDxsaSBzdHlsZT1cImZvbnQtc2l6ZTowLjllbTtcIj4ke2VzY2FwZUh0bWwodyl9PC9saT5gKS5qb2luKCcnKX1cbiAgICAgIDwvdWw+XG4gICAgICA8cCBzdHlsZT1cIm1hcmdpbjo4cHggMCAwO2ZvbnQtc2l6ZTowLjg3ZW07Y29sb3I6Izc4MzUwZjtcIj5UaGVzZSBhcmUgYWR2aXNvcnkgd2FybmluZ3MgXHUyMDE0IHJldmlldyB0aGUgU3VtbWFyeSB0YWIgaWYgeW91IHdpc2ggdG8gdXBkYXRlIHRoZSBzdW1tYXJ5IGJlZm9yZSBzdWJtaXR0aW5nLjwvcD5cbiAgICA8L2Rpdj5gO1xuICB9XG5cbiAgY29uc3QgcHVibGljYXRpb25XYXJuaW5ncyA9IChjdkRhdGEubWV0YWRhdGE/LnB1YmxpY2F0aW9uX3dhcm5pbmdzIHx8IFtdKTtcbiAgaWYgKHB1YmxpY2F0aW9uV2FybmluZ3MubGVuZ3RoKSB7XG4gICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2ZlZjljMztib3JkZXI6MXB4IHNvbGlkICNmY2QzNGQ7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzoxMnB4IDE2cHg7bWFyZ2luLWJvdHRvbToxNnB4O1wiPlxuICAgICAgPHN0cm9uZz5cdTI2QTAgUHVibGljYXRpb24gdmVudWUgaW5mb3JtYXRpb24gaW5jb21wbGV0ZSAoJHtwdWJsaWNhdGlvbldhcm5pbmdzLmxlbmd0aH0pOjwvc3Ryb25nPlxuICAgICAgPHVsIHN0eWxlPVwibWFyZ2luOjhweCAwIDAgMDtwYWRkaW5nLWxlZnQ6MThweDtcIj5cbiAgICAgICAgJHtwdWJsaWNhdGlvbldhcm5pbmdzLm1hcCh3ID0+IGA8bGkgc3R5bGU9XCJmb250LXNpemU6MC45ZW07XCI+JHtlc2NhcGVIdG1sKHcpfTwvbGk+YCkuam9pbignJyl9XG4gICAgICA8L3VsPlxuICAgICAgPHAgc3R5bGU9XCJtYXJnaW46OHB4IDAgMDtmb250LXNpemU6MC44N2VtO2NvbG9yOiM3ODM1MGY7XCI+QWRkIG1pc3Npbmcgam91cm5hbCBvciBjb25mZXJlbmNlIG5hbWVzIHRvIHlvdXIgTWFzdGVyIENWIGJlZm9yZSBzdWJtaXR0aW5nIFx1MjAxNCBpbmNvbXBsZXRlIHZlbnVlIGRldGFpbHMgd2Vha2VuIGNyZWRpYmlsaXR5LjwvcD5cbiAgICA8L2Rpdj5gO1xuICB9XG5cbiAgY29uc3QgbG9uZ0J1bGxldFdhcm5pbmdzID0gKGN2RGF0YS5tZXRhZGF0YT8ubG9uZ19idWxsZXRfd2FybmluZ3MgfHwgW10pO1xuICBpZiAobG9uZ0J1bGxldFdhcm5pbmdzLmxlbmd0aCkge1xuICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZWY5YzM7Ym9yZGVyOjFweCBzb2xpZCAjZmNkMzRkO2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MTJweCAxNnB4O21hcmdpbi1ib3R0b206MTZweDtcIj5cbiAgICAgIDxzdHJvbmc+XHUyNkEwIExvbmcgYnVsbGV0IHBvaW50cyBkZXRlY3RlZCAoJHtsb25nQnVsbGV0V2FybmluZ3MubGVuZ3RofSkgXHUyMDE0IG1heSBleGNlZWQgMiBsaW5lczo8L3N0cm9uZz5cbiAgICAgIDx1bCBzdHlsZT1cIm1hcmdpbjo4cHggMCAwIDA7cGFkZGluZy1sZWZ0OjE4cHg7bGlzdC1zdHlsZTpub25lO1wiPlxuICAgICAgICAke2xvbmdCdWxsZXRXYXJuaW5ncy5tYXAodyA9PiBgPGxpIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTttYXJnaW4tYm90dG9tOjRweDtcIj48c3Ryb25nPiR7ZXNjYXBlSHRtbCh3LmNvbXBhbnkpfSBcdTAwQjcgJHtlc2NhcGVIdG1sKHcudGl0bGUpfTwvc3Ryb25nPiAoJHt3LmNoYXJfY291bnR9IGNoYXJzKTxicj48c3BhbiBzdHlsZT1cImNvbG9yOiM2YjcyODA7XCI+XCIke2VzY2FwZUh0bWwody5idWxsZXRfdGV4dCl9XCI8L3NwYW4+PC9saT5gKS5qb2luKCcnKX1cbiAgICAgIDwvdWw+XG4gICAgICA8cCBzdHlsZT1cIm1hcmdpbjo4cHggMCAwO2ZvbnQtc2l6ZTowLjg3ZW07Y29sb3I6Izc4MzUwZjtcIj5Db25zaWRlciBzaG9ydGVuaW5nIHRoZXNlIGJ1bGxldHMgXHUyMDE0IGFpbSBmb3IgXHUyMjY0MjAwIGNoYXJhY3RlcnMgZWFjaCBmb3IgY2xlYW4gMi1saW5lIHJlbmRlcmluZyBpbiB0aGUgRE9DWC48L3A+XG4gICAgPC9kaXY+YDtcbiAgfVxuXG4gIGNvbnN0IHNwYXJzZUV4cFdhcm5pbmdzID0gKGN2RGF0YS5tZXRhZGF0YT8uc3BhcnNlX2V4cGVyaWVuY2Vfd2FybmluZ3MgfHwgW10pO1xuICBpZiAoc3BhcnNlRXhwV2FybmluZ3MubGVuZ3RoKSB7XG4gICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2ZlZjljMztib3JkZXI6MXB4IHNvbGlkICNmY2QzNGQ7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzoxMnB4IDE2cHg7bWFyZ2luLWJvdHRvbToxNnB4O1wiPlxuICAgICAgPHN0cm9uZz5cdTI2QTAgU3BhcnNlIGV4cGVyaWVuY2UgZW50cmllcyAoJHtzcGFyc2VFeHBXYXJuaW5ncy5sZW5ndGh9KSBcdTIwMTQgZmV3ZXIgdGhhbiAyIGJ1bGxldHM6PC9zdHJvbmc+XG4gICAgICA8dWwgc3R5bGU9XCJtYXJnaW46OHB4IDAgMCAwO3BhZGRpbmctbGVmdDoxOHB4O2xpc3Qtc3R5bGU6bm9uZTtcIj5cbiAgICAgICAgJHtzcGFyc2VFeHBXYXJuaW5ncy5tYXAodyA9PiBgPGxpIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTttYXJnaW4tYm90dG9tOjJweDtcIj48c3Ryb25nPiR7ZXNjYXBlSHRtbCh3LmNvbXBhbnkpfSBcdTAwQjcgJHtlc2NhcGVIdG1sKHcudGl0bGUpfTwvc3Ryb25nPiBcdTIwMTQgJHt3LmJ1bGxldF9jb3VudCA9PT0gMCA/ICdubyBidWxsZXRzIHNlbGVjdGVkJyA6ICcxIGJ1bGxldCBzZWxlY3RlZCd9PC9saT5gKS5qb2luKCcnKX1cbiAgICAgIDwvdWw+XG4gICAgICA8cCBzdHlsZT1cIm1hcmdpbjo4cHggMCAwO2ZvbnQtc2l6ZTowLjg3ZW07Y29sb3I6Izc4MzUwZjtcIj5JbmNsdWRlIGF0IGxlYXN0IDIgYnVsbGV0cyBwZXIgcm9sZSB0byBkZW1vbnN0cmF0ZSBpbXBhY3QuIFJldHVybiB0byB0aGUgRXhwZXJpZW5jZSB0YWIgdG8gYWRkIG1vcmUuPC9wPlxuICAgIDwvZGl2PmA7XG4gIH1cblxuICBjb25zdCB5ZWFyT25seURhdGVXYXJuaW5ncyA9IChjdkRhdGEubWV0YWRhdGE/LnllYXJfb25seV9kYXRlX3dhcm5pbmdzIHx8IFtdKTtcbiAgaWYgKHllYXJPbmx5RGF0ZVdhcm5pbmdzLmxlbmd0aCkge1xuICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZWY5YzM7Ym9yZGVyOjFweCBzb2xpZCAjZmNkMzRkO2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MTJweCAxNnB4O21hcmdpbi1ib3R0b206MTZweDtcIj5cbiAgICAgIDxzdHJvbmc+XHUyNkEwIFllYXItb25seSBkYXRlcyBkZXRlY3RlZCAoJHt5ZWFyT25seURhdGVXYXJuaW5ncy5sZW5ndGh9KSBcdTIwMTQgbW9udGgveWVhciBmb3JtYXQgcmVjb21tZW5kZWQ6PC9zdHJvbmc+XG4gICAgICA8dWwgc3R5bGU9XCJtYXJnaW46OHB4IDAgMCAwO3BhZGRpbmctbGVmdDoxOHB4O2xpc3Qtc3R5bGU6bm9uZTtcIj5cbiAgICAgICAgJHt5ZWFyT25seURhdGVXYXJuaW5ncy5tYXAodyA9PiBgPGxpIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTttYXJnaW4tYm90dG9tOjJweDtcIj48c3Ryb25nPiR7ZXNjYXBlSHRtbCh3LmNvbXBhbnkpfSBcdTAwQjcgJHtlc2NhcGVIdG1sKHcudGl0bGUpfTwvc3Ryb25nPiBcdTIwMTQgJHt3LmZpZWxkID09PSAnc3RhcnRfZGF0ZScgPyAnc3RhcnQnIDogJ2VuZCd9IGRhdGUgaXMgXCIke2VzY2FwZUh0bWwody5kYXRlX3ZhbHVlKX1cIjwvbGk+YCkuam9pbignJyl9XG4gICAgICA8L3VsPlxuICAgICAgPHAgc3R5bGU9XCJtYXJnaW46OHB4IDAgMDtmb250LXNpemU6MC44N2VtO2NvbG9yOiM3ODM1MGY7XCI+WWVhci1vbmx5IGRhdGVzIHJlZHVjZSBjaHJvbm9sb2dpY2FsIHByZWNpc2lvbi4gVXBkYXRlIHRvIE1vbnRoIFlZWVkgZm9ybWF0IChlLmcuIFwiSmFuIDIwMjBcIikgaW4gdGhlIE1hc3RlciBDViBmb3IgYmVzdCBBVFMgY29tcGF0aWJpbGl0eS48L3A+XG4gICAgPC9kaXY+YDtcbiAgfVxuXG4gIGNvbnN0IHJld3JpdGVBdWRpdE1pc21hdGNoZXMgPSAoY3ZEYXRhLm1ldGFkYXRhPy5yZXdyaXRlX2F1ZGl0X21pc21hdGNoZXMgfHwgW10pO1xuICBpZiAocmV3cml0ZUF1ZGl0TWlzbWF0Y2hlcy5sZW5ndGgpIHtcbiAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZmVmMmYyO2JvcmRlcjoxcHggc29saWQgI2ZjYTVhNTtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjEycHggMTZweDttYXJnaW4tYm90dG9tOjE2cHg7XCI+XG4gICAgICA8c3Ryb25nPlx1MjZBMCBSZXdyaXRlIGNvbnRlbnQgbWlzbWF0Y2ggKCR7cmV3cml0ZUF1ZGl0TWlzbWF0Y2hlcy5sZW5ndGh9KSBcdTIwMTQgYWNjZXB0ZWQgcmV3cml0ZXMgbm90IGZvdW5kIGluIGdlbmVyYXRlZCB0ZXh0Ojwvc3Ryb25nPlxuICAgICAgPHVsIHN0eWxlPVwibWFyZ2luOjhweCAwIDAgMDtwYWRkaW5nLWxlZnQ6MThweDtsaXN0LXN0eWxlOm5vbmU7XCI+XG4gICAgICAgICR7cmV3cml0ZUF1ZGl0TWlzbWF0Y2hlcy5tYXAobSA9PiBgPGxpIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTttYXJnaW4tYm90dG9tOjZweDtcIj48c3Ryb25nPiR7ZXNjYXBlSHRtbChtLmxvY2F0aW9uIHx8IG0udHlwZSl9PC9zdHJvbmc+PGJyPjxzcGFuIHN0eWxlPVwiY29sb3I6IzM3NDE1MTtcIj5FeHBlY3RlZDogPGVtPlwiJHtlc2NhcGVIdG1sKChtLmV4cGVjdGVkIHx8ICcnKS5zbGljZSgwLCAxMjApKX0keyhtLmV4cGVjdGVkIHx8ICcnKS5sZW5ndGggPiAxMjAgPyAnXHUyMDI2JyA6ICcnfVwiPC9lbT48L3NwYW4+PGJyPjxzcGFuIHN0eWxlPVwiY29sb3I6IzljYTNhZjtcIj5BY3R1YWw6IDxlbT5cIiR7ZXNjYXBlSHRtbCgobS5hY3R1YWwgfHwgJycpLnNsaWNlKDAsIDEyMCkpfSR7KG0uYWN0dWFsIHx8ICcnKS5sZW5ndGggPiAxMjAgPyAnXHUyMDI2JyA6ICcnfVwiPC9lbT48L3NwYW4+PC9saT5gKS5qb2luKCcnKX1cbiAgICAgIDwvdWw+XG4gICAgICA8cCBzdHlsZT1cIm1hcmdpbjo4cHggMCAwO2ZvbnQtc2l6ZTowLjg3ZW07Y29sb3I6IzdmMWQxZDtcIj5UaGVzZSBhY2NlcHRlZCByZXdyaXRlcyBtYXkgbm90IGhhdmUgYmVlbiBhcHBsaWVkLiBSZS1nZW5lcmF0ZSB0aGUgQ1Ygb3IgY2hlY2sgdGhlIHJld3JpdGUgcmV2aWV3IHN0ZXAuPC9wPlxuICAgIDwvZGl2PmA7XG4gIH1cblxuICBjb25zdCBvdmVybGFwV2FybmluZ3MgPSAoY3ZEYXRhLmRhdGVfb3ZlcmxhcF93YXJuaW5ncyB8fCBbXSk7XG4gIGlmIChvdmVybGFwV2FybmluZ3MubGVuZ3RoKSB7XG4gICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2ZlZjljMztib3JkZXI6MXB4IHNvbGlkICNmZGUwNDc7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzoxMnB4IDE2cHg7bWFyZ2luLWJvdHRvbToxNnB4O1wiPlxuICAgICAgPHN0cm9uZz5cdTI2QTAgRW1wbG95bWVudCBkYXRlIG92ZXJsYXBzIGRldGVjdGVkICgke292ZXJsYXBXYXJuaW5ncy5sZW5ndGh9KTo8L3N0cm9uZz5cbiAgICAgIDx1bCBzdHlsZT1cIm1hcmdpbjo4cHggMCAwIDA7cGFkZGluZy1sZWZ0OjE4cHg7XCI+XG4gICAgICAgICR7b3ZlcmxhcFdhcm5pbmdzLm1hcCh3ID0+IGA8bGk+PHN0cm9uZz4ke2VzY2FwZUh0bWwody5lbnRyeV9hKX08L3N0cm9uZz4gb3ZlcmxhcHMgd2l0aCA8c3Ryb25nPiR7ZXNjYXBlSHRtbCh3LmVudHJ5X2IpfTwvc3Ryb25nPjxicj48c21hbGwgc3R5bGU9XCJjb2xvcjojOTI0MDBlO1wiPiR7ZXNjYXBlSHRtbCh3Lm92ZXJsYXBfZGVzY3JpcHRpb24pfTwvc21hbGw+PC9saT5gKS5qb2luKCcnKX1cbiAgICAgIDwvdWw+XG4gICAgICA8cCBzdHlsZT1cIm1hcmdpbjo4cHggMCAwO2ZvbnQtc2l6ZTowLjg3ZW07Y29sb3I6Izc4MzUwZjtcIj5SZXZpZXcgdGhlc2UgZW50cmllcyBpbiB0aGUgRXhwZXJpZW5jZSB0YWIgYmVmb3JlIHN1Ym1pdHRpbmcgeW91ciBhcHBsaWNhdGlvbi48L3A+XG4gICAgPC9kaXY+YDtcbiAgfVxuXG4gIGNvbnN0IGdlbmVyYXRlZEF0ID0gY3ZEYXRhLm1ldGFkYXRhPy5nZW5lcmF0aW9uX2RhdGUgPz8gbnVsbDtcbiAgY29uc3QgZ2VuZXJhdGlvblJ1biA9IGN2RGF0YS5tZXRhZGF0YT8uZ2VuZXJhdGlvbl9ydW4gPz8gbnVsbDtcbiAgaHRtbCArPSBfcmVuZGVyRG93bmxvYWRHcmlkKGZpbGVzLCBjaGVja3MsIHN1bW1hcnksIGdlbmVyYXRlZEF0LCBnZW5lcmF0aW9uUnVuKTtcblxuICBpZiAoY3ZEYXRhLm91dHB1dF9kaXIpIHtcbiAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDoyMHB4O3BhZGRpbmc6MTJweDtiYWNrZ3JvdW5kOiNmMWY1Zjk7Ym9yZGVyLXJhZGl1czo2cHg7Zm9udC1zaXplOjE0cHg7Y29sb3I6IzY0NzQ4YjtcIj5cbiAgICAgIDxzdHJvbmc+T3V0cHV0IERpcmVjdG9yeTo8L3N0cm9uZz4gJHtlc2NhcGVIdG1sKGN2RGF0YS5vdXRwdXRfZGlyKX1cbiAgICA8L2Rpdj5gO1xuICB9XG5cbiAgY29udGVudC5pbm5lckhUTUwgPSBgJHtodG1sfTxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDttYXJnaW4tdG9wOjE2cHg7Zm9udC1zaXplOjAuOWVtO1wiPkFuYWx5c2luZyBidWxsZXQgcGVyc3Vhc2l2ZW5lc3NcdTIwMjY8L3A+YDtcbiAgaHRtbCArPSBhd2FpdCBfZmV0Y2hQZXJzdWFzaW9uSHRtbCgpO1xuICBodG1sICs9IF9yZW5kZXJSZWZpbmVtZW50UGFuZWwoKTtcbiAgaHRtbCArPSBgPGRpdiBjbGFzcz1cIm5hdi1idXR0b25zIG5hdi1lbmRcIiBzdHlsZT1cIm1hcmdpbi10b3A6MTZweDtcIj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiY29udGludWUtYnRuXCIgb25jbGljaz1cImhhbmRsZVN0ZXBDbGljaygnY292ZXJfbGV0dGVyJylcIj5cbiAgICAgIFx1RDgzRFx1RENFOSBQcm9jZWVkIHRvIENvdmVyIExldHRlciBcdTIxOTJcbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+YDtcbiAgY29udGVudC5pbm5lckhUTUwgPSBodG1sO1xufVxuXG5leHBvcnQgeyBwb3B1bGF0ZURvd25sb2FkVGFiIH07IiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvZmluYWwtZ2VuZXJhdGUuanNcbiAqIEZpbmFsIGdlbmVyYXRpb24gc3RlcDogc2hvd3MgZG93bmxvYWQgbGlua3MgZm9yIHRoZSBnZW5lcmF0ZWQgZmlsZXNcbiAqIChQREYsIEFUUyBET0NYLCBodW1hbiBET0NYKSBhbmQgYSBcIlByb2NlZWQgdG8gRG93bmxvYWQgUmV2aWV3IFx1MjE5MlwiIGJ1dHRvblxuICogdGhhdCBhZHZhbmNlcyB0aGUgd29ya2Zsb3cgdG8gdGhlIGRvd25sb2FkIHN0ZXAuXG4gKlxuICogRGVwZW5kZW5jaWVzIChyZXNvbHZlZCB0aHJvdWdoIGdsb2JhbFRoaXMgYXQgcnVudGltZSk6XG4gKiAgIGFwaUNhbGwsIGFwcGVuZE1lc3NhZ2UsIGVzY2FwZUh0bWwsIHN0YXRlTWFuYWdlciwgc3dpdGNoVGFiXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdmaW5hbC1nZW5lcmF0ZScpO1xuXG5pbXBvcnQgeyBzdGF0ZU1hbmFnZXIgfSBmcm9tICcuL3N0YXRlLW1hbmFnZXIuanMnO1xuXG4vLyBcdTI1MDBcdTI1MDAgUHJldmlldyBzdGF0ZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxubGV0IF9wcmV2aWV3T3BlbiA9IHRydWU7XG5cbi8vIFx1MjUwMFx1MjUwMCBGaWxlIHR5cGUgaGVscGVycyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gX2ZpbGVMYWJlbChmaWxlbmFtZSkge1xuICBpZiAoIWZpbGVuYW1lKSByZXR1cm4gJyc7XG4gIGNvbnN0IGJhc2UgPSBmaWxlbmFtZS5zcGxpdCgnLycpLnBvcCgpO1xuICBpZiAoYmFzZS5lbmRzV2l0aCgnLnBkZicpICYmIGJhc2UudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnYXRzJykpXG4gICAgcmV0dXJuICdBVFMgUERGJztcbiAgaWYgKGJhc2UuZW5kc1dpdGgoJy5wZGYnKSlcbiAgICByZXR1cm4gJ0h1bWFuIFBERic7XG4gIGlmIChiYXNlLmVuZHNXaXRoKCcuZG9jeCcpICYmIGJhc2UudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnYXRzJykpXG4gICAgcmV0dXJuICdBVFMgV29yZCc7XG4gIGlmIChiYXNlLmVuZHNXaXRoKCcuZG9jeCcpKVxuICAgIHJldHVybiAnSHVtYW4gV29yZCc7XG4gIGlmIChiYXNlLmVuZHNXaXRoKCcuaHRtbCcpKVxuICAgIHJldHVybiAnSFRNTCc7XG4gIHJldHVybiBiYXNlO1xufVxuXG5mdW5jdGlvbiBfZmlsZUljb24oZmlsZW5hbWUpIHtcbiAgaWYgKCFmaWxlbmFtZSkgcmV0dXJuICdcdUQ4M0RcdURDQzEnO1xuICBjb25zdCBmID0gZmlsZW5hbWUudG9Mb3dlckNhc2UoKTtcbiAgaWYgKGYuZW5kc1dpdGgoJy5wZGYnKSkgIHJldHVybiBmLmluY2x1ZGVzKCdhdHMnKSA/ICdcdUQ4M0VcdUREMTYnIDogJ1x1RDgzRFx1RENDNCc7XG4gIGlmIChmLmVuZHNXaXRoKCcuZG9jeCcpKSByZXR1cm4gJ1x1RDgzRFx1RENERCc7XG4gIGlmIChmLmVuZHNXaXRoKCcuaHRtbCcpKSByZXR1cm4gJ1x1RDgzQ1x1REYxMCc7XG4gIHJldHVybiAnXHVEODNEXHVEQ0MxJztcbn1cblxuZnVuY3Rpb24gX2ZpbGVEZXNjcmlwdGlvbihmaWxlbmFtZSkge1xuICBpZiAoIWZpbGVuYW1lKSByZXR1cm4gJyc7XG4gIGNvbnN0IGYgPSBmaWxlbmFtZS50b0xvd2VyQ2FzZSgpO1xuICBpZiAoZi5lbmRzV2l0aCgnLnBkZicpICYmIGYuaW5jbHVkZXMoJ2F0cycpKVxuICAgIHJldHVybiAnQVRTLW9wdGltaXNlZCBQREYgXHUyMDE0IG1hY2hpbmUtcmVhZGFibGUgZm9yIGF1dG9tYXRlZCBzY3JlZW5pbmcnO1xuICBpZiAoZi5lbmRzV2l0aCgnLnBkZicpKVxuICAgIHJldHVybiAnSHVtYW4tcmVhZGFibGUgUERGIFx1MjAxNCBmb3IgaHVtYW4gcmV2aWV3ZXJzIGFuZCBwcmludGluZyc7XG4gIGlmIChmLmVuZHNXaXRoKCcuZG9jeCcpICYmIGYuaW5jbHVkZXMoJ2F0cycpKVxuICAgIHJldHVybiAnQVRTIFdvcmQgZG9jdW1lbnQgXHUyMDE0IGtleXdvcmQtb3B0aW1pc2VkIGZvciBqb2IgYXBwbGljYXRpb25zJztcbiAgaWYgKGYuZW5kc1dpdGgoJy5kb2N4JykpXG4gICAgcmV0dXJuICdIdW1hbi1yZWFkYWJsZSBXb3JkIGRvY3VtZW50IFx1MjAxNCBlZGl0YWJsZSBmb3JtYXQnO1xuICBpZiAoZi5lbmRzV2l0aCgnLmh0bWwnKSlcbiAgICByZXR1cm4gJ0hUTUwgZm9ybWF0IHdpdGggZW1iZWRkZWQgSlNPTi1MRCBzdHJ1Y3R1cmVkIGRhdGEnO1xuICByZXR1cm4gJ0dlbmVyYXRlZCBmaWxlJztcbn1cblxuZnVuY3Rpb24gX2h0bWxQcmV2aWV3RmlsZShmaWxlcykge1xuICAvLyBQcmVmZXIgaHVtYW4tcmVhZGFibGUgSFRNTCAoQ1ZfKi5odG1sLCBub3QgQVRTKVxuICBjb25zdCBodW1hbiA9IGZpbGVzLmZpbmQoZiA9PiBmLmVuZHNXaXRoKCcuaHRtbCcpICYmICFmLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2F0cycpKTtcbiAgcmV0dXJuIGh1bWFuIHx8IGZpbGVzLmZpbmQoZiA9PiBmLmVuZHNXaXRoKCcuaHRtbCcpKSB8fCBudWxsO1xufVxuXG5mdW5jdGlvbiBfcmVuZGVyUHJldmlld1BhbmUoaHRtbEZpbGUpIHtcbiAgaWYgKCFodG1sRmlsZSkgcmV0dXJuICcnO1xuICBjb25zdCBiYXNlID0gaHRtbEZpbGUuc3BsaXQoJy8nKS5wb3AoKTtcbiAgY29uc3Qgc3JjID0gYC9hcGkvZG93bmxvYWQvJHtlbmNvZGVVUklDb21wb25lbnQoYmFzZSl9YDtcbiAgcmV0dXJuIGBcbiAgICA8ZGl2IGlkPVwiZmluYWwtcHJldmlldy1wYW5lXCIgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjI0cHg7Ym9yZGVyOjFweCBzb2xpZCAjZTJlOGYwO2JvcmRlci1yYWRpdXM6MTBweDtvdmVyZmxvdzpoaWRkZW47JHtfcHJldmlld09wZW4gPyAnJyA6ICdkaXNwbGF5Om5vbmU7J31cIj5cbiAgICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nOjEwcHggMTZweDtiYWNrZ3JvdW5kOiNmMWY1Zjk7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTBweDtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZTJlOGYwO1wiPlxuICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjllbTtmb250LXdlaWdodDo2MDA7Y29sb3I6IzFlMjkzYjtcIj5cdUQ4M0NcdURGMTAgSFRNTCBQcmV2aWV3PC9zcGFuPlxuICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjhlbTtjb2xvcjojNjQ3NDhiO2ZsZXg6MTtcIj4ke2VzY2FwZUh0bWwoYmFzZSl9PC9zcGFuPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBpZD1cImZpbmFsLXByZXZpZXctY2xvc2UtYnRuXCJcbiAgICAgICAgICAgICAgICBzdHlsZT1cImZvbnQtc2l6ZTowLjhlbTtwYWRkaW5nOjNweCAxMHB4O2JvcmRlcjoxcHggc29saWQgI2NiZDVlMTtib3JkZXItcmFkaXVzOjVweDtiYWNrZ3JvdW5kOiNmZmY7Y3Vyc29yOnBvaW50ZXI7Y29sb3I6IzQ3NTU2OTtcIlxuICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJIaWRlIHByZXZpZXdcIj5IaWRlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgc3R5bGU9XCJwb3NpdGlvbjpyZWxhdGl2ZTt3aWR0aDoxMDAlO3BhZGRpbmctdG9wOjU2LjI1JTtiYWNrZ3JvdW5kOiNmOGZhZmM7XCI+XG4gICAgICAgIDxpZnJhbWUgaWQ9XCJmaW5hbC1jdi1wcmV2aWV3XCJcbiAgICAgICAgICAgICAgICBzcmM9XCIke3NyY31cIlxuICAgICAgICAgICAgICAgIHRpdGxlPVwiRmluYWwgQ1YgSFRNTCBQcmV2aWV3XCJcbiAgICAgICAgICAgICAgICBzYW5kYm94PVwiYWxsb3ctc2FtZS1vcmlnaW5cIlxuICAgICAgICAgICAgICAgIHJlZmVycmVycG9saWN5PVwibm8tcmVmZXJyZXJcIlxuICAgICAgICAgICAgICAgIHN0eWxlPVwicG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7Ym9yZGVyOm5vbmU7XCJcbiAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiRmluYWwgZ2VuZXJhdGVkIENWIHByZXZpZXdcIj48L2lmcmFtZT5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PmA7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBUYWIgcmVuZGVyZXIgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8qKlxuICogUG9wdWxhdGUgdGhlIFwiR2VuZXJhdGVcIiAoZmluYWxfZ2VuZXJhdGUpIHRhYiBjb250ZW50LlxuICogU2hvd3MgZG93bmxvYWQgbGlua3MgZm9yIGFsbCBmaW5hbC1nZW5lcmF0ZWQgZmlsZXMgYW5kIGEgXCJQcm9jZWVkIHRvIEZpbmFsaXNlXCIgYnV0dG9uLlxuICogQHBhcmFtIHtPYmplY3R9IGN2RGF0YSAtIENWIGRhdGEgb2JqZWN0IGZyb20gc3RhdGVNYW5hZ2VyLmdldFRhYkRhdGEoJ2N2JylcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcG9wdWxhdGVGaW5hbEdlbmVyYXRlVGFiKGN2RGF0YSA9IHt9KSB7XG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9jdW1lbnQtY29udGVudCcpO1xuICBpZiAoIWNvbnRlbnQpIHJldHVybjtcblxuICAvLyBDb2xsZWN0IGNhbmRpZGF0ZSBmaWxlcywgZGVkdXBsaWNhdGVcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQoKTtcbiAgY29uc3QgY2FuZGlkYXRlcyA9IFtcbiAgICBjdkRhdGEuZmluYWxfaHRtbCxcbiAgICBjdkRhdGEuZmluYWxfcGRmLFxuICAgIGN2RGF0YS5odG1sLFxuICAgIGN2RGF0YS5wZGYsXG4gICAgY3ZEYXRhLmRvY3gsXG4gICAgY3ZEYXRhLmF0c19kb2N4LFxuICAgIGN2RGF0YS5odW1hbl9kb2N4LFxuICAgIC4uLihBcnJheS5pc0FycmF5KGN2RGF0YS5maWxlcykgPyBjdkRhdGEuZmlsZXMgOiBbXSksXG4gIF0uZmlsdGVyKEJvb2xlYW4pO1xuXG4gIGNvbnN0IGZpbGVzID0gW107XG4gIGZvciAoY29uc3QgZmlsZW5hbWUgb2YgY2FuZGlkYXRlcykge1xuICAgIGlmIChzZWVuLmhhcyhmaWxlbmFtZSkpIGNvbnRpbnVlO1xuICAgIHNlZW4uYWRkKGZpbGVuYW1lKTtcbiAgICBpZiAoZmlsZW5hbWUuZW5kc1dpdGgoJy50eHQnKSB8fCBmaWxlbmFtZSA9PT0gJ2pvYl9kZXNjcmlwdGlvbi50eHQnKSBjb250aW51ZTtcbiAgICBmaWxlcy5wdXNoKGZpbGVuYW1lKTtcbiAgfVxuXG4gIGNvbnN0IGh0bWxQcmV2aWV3RmlsZSA9IF9odG1sUHJldmlld0ZpbGUoZmlsZXMpO1xuXG4gIGxldCBodG1sID0gJzxoMT5cdUQ4M0RcdURDQzQgR2VuZXJhdGVkIEZpbGVzPC9oMT4nO1xuICBodG1sICs9ICc8cCBzdHlsZT1cImNvbG9yOiM0NzU1Njk7bWFyZ2luLWJvdHRvbTo4cHg7XCI+WW91ciBDViBmaWxlcyBhcmUgcmVhZHkgdG8gZG93bmxvYWQuIFByZXZpZXcgdGhlIEhUTUwgdmVyc2lvbiBiZWxvdywgdGhlbiBjbGljayA8c3Ryb25nPlByb2NlZWQgdG8gRG93bmxvYWQgUmV2aWV3PC9zdHJvbmc+IHRvIHJ1biBBVFMgdmFsaWRhdGlvbiBhbmQgYXJjaGl2ZSB5b3VyIGFwcGxpY2F0aW9uLjwvcD4nO1xuICBodG1sICs9ICc8cCBzdHlsZT1cImZvbnQtc2l6ZTowLjgzZW07Y29sb3I6Izk0YTNiODttYXJnaW4tYm90dG9tOjIwcHg7cGFkZGluZzo4cHggMTJweDtiYWNrZ3JvdW5kOiNmOGZhZmM7Ym9yZGVyLXJhZGl1czo2cHg7Ym9yZGVyLWxlZnQ6M3B4IHNvbGlkICNlMmU4ZjA7XCI+XHVEODNEXHVEQ0ExIDxlbT5UaGlzIHRhYiBsZXRzIHlvdSBkb3dubG9hZCBmaWxlcyBpbW1lZGlhdGVseS4gVGhlIDxzdHJvbmc+RmlsZSBSZXZpZXc8L3N0cm9uZz4gc3ViLXRhYiBpbiBGaW5hbGlzZSBydW5zIEFUUyBjaGVja3MsIGNvbmZpcm1zIHRoZSBwYWNrYWdlIGlzIGNvbXBsZXRlLCBhbmQgbGV0cyB5b3UgYXJjaGl2ZSB0aGUgYXBwbGljYXRpb24uPC9lbT48L3A+JztcblxuICBpZiAoaHRtbFByZXZpZXdGaWxlKSB7XG4gICAgY29uc3Qgc2hvd0hpZGUgPSBfcHJldmlld09wZW4gPyAnSGlkZSBwcmV2aWV3JyA6ICdTaG93IHByZXZpZXcnO1xuICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjEycHg7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6OHB4O1wiPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWQ9XCJmaW5hbC1wcmV2aWV3LXRvZ2dsZS1idG5cIlxuICAgICAgICAgICAgICBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07cGFkZGluZzo1cHggMTRweDtib3JkZXI6MXB4IHNvbGlkICMzYjgyZjY7Ym9yZGVyLXJhZGl1czo2cHg7YmFja2dyb3VuZDoke19wcmV2aWV3T3BlbiA/ICcjZWZmNmZmJyA6ICcjZmZmJ307Y29sb3I6IzNiODJmNjtjdXJzb3I6cG9pbnRlcjtmb250LXdlaWdodDo2MDA7XCJcbiAgICAgICAgICAgICAgYXJpYS1leHBhbmRlZD1cIiR7X3ByZXZpZXdPcGVufVwiXG4gICAgICAgICAgICAgIGFyaWEtY29udHJvbHM9XCJmaW5hbC1wcmV2aWV3LXBhbmVcIj5cbiAgICAgICAgXHVEODNDXHVERjEwICR7c2hvd0hpZGV9XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjAuOGVtO2NvbG9yOiM5NGEzYjg7XCI+SW4tYnJvd3NlciBIVE1MIHByZXZpZXc8L3NwYW4+XG4gICAgPC9kaXY+YDtcbiAgICBodG1sICs9IF9yZW5kZXJQcmV2aWV3UGFuZShodG1sUHJldmlld0ZpbGUpO1xuICB9XG5cbiAgaWYgKGZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIGh0bWwgKz0gJzxwIHN0eWxlPVwiY29sb3I6IzljYTNhZjtwYWRkaW5nOjE2cHg7XCI+Tm8gZmlsZXMgZ2VuZXJhdGVkIHlldC48L3A+JztcbiAgfSBlbHNlIHtcbiAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwiZGlzcGxheTpncmlkO2dhcDoxMnB4O21hcmdpbi1ib3R0b206MjhweDtcIj4nO1xuICAgIGZvciAoY29uc3QgZmlsZW5hbWUgb2YgZmlsZXMpIHtcbiAgICAgIGNvbnN0IGJhc2UgICA9IGZpbGVuYW1lLnNwbGl0KCcvJykucG9wKCk7XG4gICAgICBjb25zdCBpY29uICAgPSBfZmlsZUljb24oZmlsZW5hbWUpO1xuICAgICAgY29uc3QgbGFiZWwgID0gX2ZpbGVMYWJlbChmaWxlbmFtZSk7XG4gICAgICBjb25zdCBkZXNjICAgPSBfZmlsZURlc2NyaXB0aW9uKGZpbGVuYW1lKTtcbiAgICAgIGh0bWwgKz0gYFxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTRweDtcbiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDojZjhmYWZjO2JvcmRlcjoxcHggc29saWQgI2UyZThmMDtcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzoxNHB4IDE4cHg7XCI+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MS44ZW07XCI+JHtpY29ufTwvc3Bhbj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDoxO21pbi13aWR0aDowO1wiPlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MC45NWVtO2NvbG9yOiMxZTI5M2I7XCI+JHtlc2NhcGVIdG1sKGxhYmVsKX08L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC44M2VtO2NvbG9yOiM2NDc0OGI7bWFyZ2luLXRvcDoycHg7XCI+JHtlc2NhcGVIdG1sKGRlc2MpfTwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxhIGhyZWY9XCIvYXBpL2Rvd25sb2FkLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGJhc2UpfVwiXG4gICAgICAgICAgICAgZG93bmxvYWQ9XCIke2VzY2FwZUh0bWwoYmFzZSl9XCJcbiAgICAgICAgICAgICBzdHlsZT1cImRpc3BsYXk6aW5saW5lLWZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDo2cHg7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6IzNiODJmNjtjb2xvcjojZmZmO1xuICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOjdweCAxNnB4O2JvcmRlci1yYWRpdXM6NnB4O1xuICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6MC44OGVtO2ZvbnQtd2VpZ2h0OjYwMDt0ZXh0LWRlY29yYXRpb246bm9uZTtcbiAgICAgICAgICAgICAgICAgICAgd2hpdGUtc3BhY2U6bm93cmFwO1wiPlxuICAgICAgICAgICAgXHUyQjA3XHVGRTBGIERvd25sb2FkXG4gICAgICAgICAgPC9hPlxuICAgICAgICA8L2Rpdj5gO1xuICAgIH1cbiAgICBodG1sICs9ICc8L2Rpdj4nO1xuICB9XG5cbiAgaWYgKGN2RGF0YS5vdXRwdXRfZGlyKSB7XG4gICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MjRweDtwYWRkaW5nOjEwcHggMTRweDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDojZjFmNWY5O2JvcmRlci1yYWRpdXM6NnB4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6MTNweDtjb2xvcjojNjQ3NDhiO1wiPlxuICAgICAgPHN0cm9uZz5PdXRwdXQgZGlyZWN0b3J5Ojwvc3Ryb25nPiAke2VzY2FwZUh0bWwoY3ZEYXRhLm91dHB1dF9kaXIpfVxuICAgIDwvZGl2PmA7XG4gIH1cblxuICBodG1sICs9IGBcbiAgICA8ZGl2IGNsYXNzPVwibmF2LWJ1dHRvbnMgbmF2LWVuZFwiIHN0eWxlPVwibWFyZ2luLXRvcDoyNHB4O1wiPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbnRpbnVlLWJ0blwiIGlkPVwiZmluYWwtZ2VuZXJhdGUtY29udGludWUtYnRuXCJcbiAgICAgICAgICAgICAgb25jbGljaz1cImZpbmFsR2VuZXJhdGlvbkNvbXBsZXRlKClcIlxuICAgICAgICAgICAgICBzdHlsZT1cImZvbnQtc2l6ZToxZW07cGFkZGluZzoxMHB4IDI0cHg7XCI+XG4gICAgICAgIFx1MjcwNSBQcm9jZWVkIHRvIERvd25sb2FkIFJldmlldyBcdTIxOTJcbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PmA7XG5cbiAgY29udGVudC5pbm5lckhUTUwgPSBodG1sO1xuXG4gIC8vIFdpcmUgdXAgcHJldmlldyB0b2dnbGVcbiAgaWYgKGh0bWxQcmV2aWV3RmlsZSkge1xuICAgIGNvbnN0IHRvZ2dsZUJ0biAgPSBjb250ZW50LnF1ZXJ5U2VsZWN0b3IoJyNmaW5hbC1wcmV2aWV3LXRvZ2dsZS1idG4nKTtcbiAgICBjb25zdCBjbG9zZUJ0biAgID0gY29udGVudC5xdWVyeVNlbGVjdG9yKCcjZmluYWwtcHJldmlldy1jbG9zZS1idG4nKTtcbiAgICBjb25zdCBwcmV2aWV3UGFuZSA9IGNvbnRlbnQucXVlcnlTZWxlY3RvcignI2ZpbmFsLXByZXZpZXctcGFuZScpO1xuXG4gICAgY29uc3Qgc2V0UHJldmlld09wZW4gPSAob3BlbikgPT4ge1xuICAgICAgX3ByZXZpZXdPcGVuID0gb3BlbjtcbiAgICAgIGlmIChwcmV2aWV3UGFuZSkgcHJldmlld1BhbmUuc3R5bGUuZGlzcGxheSA9IG9wZW4gPyAnJyA6ICdub25lJztcbiAgICAgIGlmICh0b2dnbGVCdG4pIHtcbiAgICAgICAgdG9nZ2xlQnRuLnRleHRDb250ZW50ID0gb3BlbiA/ICdcdUQ4M0NcdURGMTAgSGlkZSBwcmV2aWV3JyA6ICdcdUQ4M0NcdURGMTAgU2hvdyBwcmV2aWV3JztcbiAgICAgICAgdG9nZ2xlQnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsIFN0cmluZyhvcGVuKSk7XG4gICAgICAgIHRvZ2dsZUJ0bi5zdHlsZS5iYWNrZ3JvdW5kID0gb3BlbiA/ICcjZWZmNmZmJyA6ICcjZmZmJztcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdG9nZ2xlQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHNldFByZXZpZXdPcGVuKCFfcHJldmlld09wZW4pKTtcbiAgICBjbG9zZUJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAgKCkgPT4gc2V0UHJldmlld09wZW4oZmFsc2UpKTtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgUGhhc2UgdHJhbnNpdGlvbiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLyoqXG4gKiBBZHZhbmNlIHdvcmtmbG93IGZyb20gZmluYWxfZ2VuZXJhdGlvbiBcdTIxOTIgcmVmaW5lbWVudC5cbiAqIENhbGxzIFBPU1QgL2FwaS9maW5hbC1nZW5lcmF0aW9uLWNvbXBsZXRlLCB1cGRhdGVzIGZyb250ZW5kIHBoYXNlLCBhbmRcbiAqIHN3aXRjaGVzIHRvIHRoZSBkb3dubG9hZCB0YWIuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZpbmFsR2VuZXJhdGlvbkNvbXBsZXRlKCkge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaUNhbGwoJ1BPU1QnLCAnL2FwaS9maW5hbC1nZW5lcmF0aW9uLWNvbXBsZXRlJywge30pO1xuICAgIGlmICghcmVzPy5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHJlcz8uZXJyb3IgfHwgJ0ZhaWxlZCB0byBhZHZhbmNlIHRvIEZpbGUgUmV2aWV3IHN0ZXAuJyk7XG4gICAgfVxuICAgIHN0YXRlTWFuYWdlci5zZXRQaGFzZSgncmVmaW5lbWVudCcpO1xuICAgIHN3aXRjaFRhYignZG93bmxvYWQnKTtcbiAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCAnXHUyNzA1IEZpbGVzIGdlbmVyYXRlZC4gWW91IGNhbiBub3cgZmluYWxpc2UgeW91ciBhcHBsaWNhdGlvbi4nKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLmVycm9yKCdmaW5hbEdlbmVyYXRpb25Db21wbGV0ZSBlcnJvcjonLCBlcnIpO1xuICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsIGBcdTI3NEMgJHtlcnIubWVzc2FnZX1gKTtcbiAgfVxufVxuXG5leHBvcnQgeyBwb3B1bGF0ZUZpbmFsR2VuZXJhdGVUYWIsIGZpbmFsR2VuZXJhdGlvbkNvbXBsZXRlIH07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIFwiVXBkYXRlIHZpYSBBSVwiIHBhbmVsIChHQVAtMDEpOiBuYXR1cmFsLWxhbmd1YWdlIGluc3RydWN0aW9uIG9yXG4gKiBkb2N1bWVudC1pbmdlc3Rpb24gdXBkYXRlcyB0byBNYXN0ZXJfQ1ZfRGF0YS5qc29uLCBwcm9wb3NlZCBieSBhbiBMTE0sXG4gKiByZXZpZXdlZCBhcyBhIGRpZmYsIGFuZCB3cml0dGVuIG9ubHkgb24gZXhwbGljaXQgY29uZmlybWF0aW9uLlxuICpcbiAqIFJlbmRlcmVkIGluc2lkZSB0aGUgTWFzdGVyIENWIHRhYiAoc2VlIHdlYi9tYXN0ZXItY3YuanMpLCBjb2xsYXBzZWQgYnlcbiAqIGRlZmF1bHQuIFJldXNlcyB3ZWIvcHJvcG9zYWwtcmV2aWV3LmpzJ3Mgcm93IHJlbmRlcmVyIGZvciB0aGUgZGlmZiByZXZpZXdcbiAqIGxpc3QgcmF0aGVyIHRoYW4gZm9ya2luZyBhIHRoaXJkIGNvcHkgb2YgdGhhdCBVSSAoaGFydmVzdC5qcyBhbmRcbiAqIGxheW91dC1pbnN0cnVjdGlvbi5qcydzIHJlbmRlckNvbnRlbnRQcm9wb3NhbHMgYWxyZWFkeSBleGlzdCkuXG4gKlxuICogUHVibGljIGV4cG9ydHMgKGFzc2lnbmVkIHRvIHdpbmRvdyBieSB3ZWIvc3JjL21haW4uanMncyBidW5kbGUpOlxuICogICByZW5kZXJNYXN0ZXJEYXRhQWlVcGRhdGVQYW5lbCgpXG4gKiAgIHRvZ2dsZU1hc3RlckRhdGFBaVBhbmVsKClcbiAqICAgc2V0TWFzdGVyRGF0YUFpTW9kZShtb2RlKVxuICogICBoYW5kbGVNYXN0ZXJEYXRhQWlGaWxlVXBsb2FkKGV2ZW50KVxuICogICBzdWJtaXRNYXN0ZXJEYXRhQWlQcm9wb3NlKClcbiAqICAgZGlzY2FyZE1hc3RlckRhdGFBaVByb3Bvc2FsKClcbiAqICAgY29uZmlybU1hc3RlckRhdGFBaVVwZGF0ZSgpXG4gKlxuICogS2V5Ym9hcmQ6IEN0cmwvQ21kK0VudGVyIG9uIGVpdGhlciBpbnB1dCB0ZXh0YXJlYSBzdWJtaXRzIFwiUHJvcG9zZSBVcGRhdGVcIlxuICogKHdpcmVkIGxvY2FsbHkgdmlhIG9ua2V5ZG93biwgbm90IGtleWJvYXJkLXNob3J0Y3V0cy5qcydzIGdsb2JhbFxuICogX1RBQl9BQ1RJT05fQlROIG1hcCBcdTIwMTQgdGhlIE1hc3RlciBDViB0YWIgaGFzIHNldmVyYWwgaW5kZXBlbmRlbnQgZm9ybXMgd2l0aFxuICogbm8gc2luZ2xlIHByaW1hcnkgYWN0aW9uLCBzbyBjbGFpbWluZyB0aGlzIHBhbmVsIGFzICp0aGUqIHRhYi13aWRlXG4gKiBDdHJsK0VudGVyIHRhcmdldCB3b3VsZCBiZSBtaXNsZWFkaW5nL3JlZ3Jlc3MgdGhlIHRhYidzIG90aGVyIHNhdmVcbiAqIGFjdGlvbnM7IGEgbG9jYWwsIHNjb3BlZCBzaG9ydGN1dCBpcyB0aGUgY29ycmVjdCBmaXQgaGVyZSBpbnN0ZWFkKS5cbiAqL1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBlc2MsIHJlbmRlclByb3Bvc2FsUm93LCBhdHRhY2hQcm9wb3NhbFJvd0xpc3RlbmVycyB9IGZyb20gJy4vcHJvcG9zYWwtcmV2aWV3LmpzJztcblxuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdtYXN0ZXItZGF0YS1haS11cGRhdGUnKTtcblxuLy8gXHUyNTAwXHUyNTAwIFN0YXRlIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuLy8gQ2xvc3VyZS1zY29wZWQsIGNvbnNpc3RlbnQgd2l0aCBob3cgaGFydmVzdC5qcyBtYW5hZ2VzIGl0cyBvd24gbG9jYWwgc3RhdGUgXHUyMDE0XG4vLyB0aGlzIHBhbmVsIGRvZXNuJ3QgbmVlZCB0byBwYXJ0aWNpcGF0ZSBpbiBzdGF0ZS1tYW5hZ2VyLmpzJ3MgZ2xvYmFscy5cblxubGV0IF9tZHVNb2RlID0gJ25sX2luc3RydWN0aW9uJzsgICAgICAgICAgIC8vICdubF9pbnN0cnVjdGlvbicgfCAnZG9jdW1lbnRfaW5nZXN0aW9uJ1xubGV0IF9tZHVQZW5kaW5nUHJvcG9zYWwgPSBudWxsOyAgICAgICAgICAgIC8vIHsgcHJvcG9zYWxJZCwgc291cmNlLCBjaGFuZ2VzIH1cbmxldCBfbWR1UHJpb3JDbGFyaWZpY2F0aW9ucyA9IFtdOyAgICAgICAgICAvLyBbe3F1ZXN0aW9uLCBhbnN3ZXJ9LCAuLi5dXG5cbmZ1bmN0aW9uIF9tZHVSZXNldFN0YXRlKCkge1xuICBfbWR1TW9kZSA9ICdubF9pbnN0cnVjdGlvbic7XG4gIF9tZHVQZW5kaW5nUHJvcG9zYWwgPSBudWxsO1xuICBfbWR1UHJpb3JDbGFyaWZpY2F0aW9ucyA9IFtdO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgUGFuZWwgc2hlbGwgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIHJlbmRlck1hc3RlckRhdGFBaVVwZGF0ZVBhbmVsKCkge1xuICAvLyBSZXNldCBtb2R1bGUgc3RhdGUgb24gZXZlcnkgZnJlc2ggcmVuZGVyIChub3QganVzdCBwYWdlIGxvYWQpIFx1MjAxNCB0aGUgRE9NXG4gIC8vIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbHdheXMgZGVwaWN0cyB0aGUgbmxfaW5zdHJ1Y3Rpb24vbm8tcHJvcG9zYWxcbiAgLy8gZGVmYXVsdCwgc28gYW55IGNhcnJpZWQtb3ZlciBzdGF0ZSBmcm9tIGEgcHJpb3IgcmVuZGVyIChlLmcuIHRoZSB1c2VyXG4gIC8vIHN3aXRjaGVkIHRhYnMgbWlkLXByb3Bvc2FsIGFuZCBwb3B1bGF0ZU1hc3RlclRhYigpIHJlLXJlbmRlcmVkIHRoaXNcbiAgLy8gcGFuZWwpIG11c3QgYmUgZGlzY2FyZGVkIHRvIGF2b2lkIHRoZSB0d28gZ29pbmcgb3V0IG9mIHN5bmMuXG4gIF9tZHVSZXNldFN0YXRlKCk7XG4gIHJldHVybiBgXG4gICAgPGRpdiBpZD1cIm1kdS1wYW5lbFwiIHN0eWxlPVwibWFyZ2luOjE2cHggMDtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWN2LWJvcmRlcik7Ym9yZGVyLXJhZGl1czo4cHg7b3ZlcmZsb3c6aGlkZGVuO1wiPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWQ9XCJtZHUtdG9nZ2xlLWJ0blwiIG9uY2xpY2s9XCJ0b2dnbGVNYXN0ZXJEYXRhQWlQYW5lbCgpXCJcbiAgICAgICAgYXJpYS1leHBhbmRlZD1cImZhbHNlXCIgYXJpYS1jb250cm9scz1cIm1kdS1wYW5lbC1ib2R5XCJcbiAgICAgICAgc3R5bGU9XCJ3aWR0aDoxMDAlO3RleHQtYWxpZ246bGVmdDtiYWNrZ3JvdW5kOnZhcigtLWN2LWJnLWxpZ2h0KTtib3JkZXI6bm9uZTtwYWRkaW5nOjEycHggMTZweDtmb250LXNpemU6MC45NWVtO2ZvbnQtd2VpZ2h0OjcwMDtjb2xvcjp2YXIoLS1jdi10ZXh0LXByaW1hcnkpO2N1cnNvcjpwb2ludGVyO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDtcIj5cbiAgICAgICAgPHNwYW4gaWQ9XCJtZHUtdG9nZ2xlLWljb25cIj5cdTI1Qjg8L3NwYW4+IFx1RDgzRVx1REQxNiBVcGRhdGUgdmlhIEFJXG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxkaXYgaWQ9XCJtZHUtcGFuZWwtYm9keVwiIHN0eWxlPVwiZGlzcGxheTpub25lO3BhZGRpbmc6MTZweDtcIj5cbiAgICAgICAgPHAgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2NvbG9yOnZhcigtLWN2LXRleHQtc2Vjb25kYXJ5KTttYXJnaW46MCAwIDE0cHg7XCI+XG4gICAgICAgICAgUHJlZmVyIHBsYWluIEVuZ2xpc2gsIG9yIGhhdmUgYW4gb2xkIENWIG9yIExpbmtlZEluIGV4cG9ydD8gRGVzY3JpYmUgYSBjaGFuZ2Ugb3IgcGFzdGUvdXBsb2FkIGFcbiAgICAgICAgICBkb2N1bWVudCBhbmQgQUkgd2lsbCBkcmFmdCBpdCBmb3IgeW91IHRvIHJldmlldyBcdTIwMTQgbm90aGluZyBpcyBzYXZlZCB1bnRpbCB5b3UgY29uZmlybS5cbiAgICAgICAgPC9wPlxuXG4gICAgICAgIDxkaXYgcm9sZT1cInRhYmxpc3RcIiBhcmlhLWxhYmVsPVwiVXBkYXRlIG1ldGhvZFwiIHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDo2cHg7bWFyZ2luLWJvdHRvbToxMnB4O1wiPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlkPVwibWR1LW1vZGUtbmxfaW5zdHJ1Y3Rpb24tYnRuXCIgcm9sZT1cInRhYlwiIGFyaWEtc2VsZWN0ZWQ9XCJ0cnVlXCJcbiAgICAgICAgICAgIG9uY2xpY2s9XCJzZXRNYXN0ZXJEYXRhQWlNb2RlKCdubF9pbnN0cnVjdGlvbicpXCJcbiAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZzo2cHggMTRweDtmb250LXNpemU6MC44NWVtO2JvcmRlci1yYWRpdXM6NnB4IDZweCAwIDA7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1jdi1ib3JkZXIpO2JvcmRlci1ib3R0b206bm9uZTtiYWNrZ3JvdW5kOnZhcigtLWN2LXdoaXRlKTtjb2xvcjp2YXIoLS1jdi10ZXh0LXByaW1hcnkpO2ZvbnQtd2VpZ2h0OjYwMDtjdXJzb3I6cG9pbnRlcjtcIj5cbiAgICAgICAgICAgIERlc2NyaWJlIGEgY2hhbmdlXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWQ9XCJtZHUtbW9kZS1kb2N1bWVudF9pbmdlc3Rpb24tYnRuXCIgcm9sZT1cInRhYlwiIGFyaWEtc2VsZWN0ZWQ9XCJmYWxzZVwiXG4gICAgICAgICAgICBvbmNsaWNrPVwic2V0TWFzdGVyRGF0YUFpTW9kZSgnZG9jdW1lbnRfaW5nZXN0aW9uJylcIlxuICAgICAgICAgICAgc3R5bGU9XCJwYWRkaW5nOjZweCAxNHB4O2ZvbnQtc2l6ZTowLjg1ZW07Ym9yZGVyLXJhZGl1czo2cHggNnB4IDAgMDtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWN2LWJvcmRlcik7Ym9yZGVyLWJvdHRvbTpub25lO2JhY2tncm91bmQ6dmFyKC0tY3YtYmctc3VidGxlKTtjb2xvcjp2YXIoLS1jdi10ZXh0LXNlY29uZGFyeSk7Y3Vyc29yOnBvaW50ZXI7XCI+XG4gICAgICAgICAgICBQYXN0ZSBvciB1cGxvYWQgYSBkb2N1bWVudFxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGlkPVwibWR1LW5sX2luc3RydWN0aW9uLWlucHV0LWFyZWFcIj5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwibWR1LW5sLXRleHRhcmVhXCIgc3R5bGU9XCJmb250LXNpemU6MC44MmVtO2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjp2YXIoLS1jdi10ZXh0LW11dGVkKTtkaXNwbGF5OmJsb2NrO21hcmdpbi1ib3R0b206NHB4O1wiPlxuICAgICAgICAgICAgRGVzY3JpYmUgdGhlIGNoYW5nZVxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPHRleHRhcmVhIGlkPVwibWR1LW5sLXRleHRhcmVhXCIgcm93cz1cIjNcIiBtYXhsZW5ndGg9XCI0MDAwXCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiAmcXVvdDtJIGp1c3QgZmluaXNoZWQgYSBwcm9qZWN0IGF0IEFjbWUgdXNpbmcgS3ViZXJuZXRlcyBcdTIwMTQgYWRkIGl0IHRvIHRoYXQgcm9sZSdzIGFjaGlldmVtZW50cy4mcXVvdDtcIlxuICAgICAgICAgICAgb25rZXlkb3duPVwiaWYoKGV2ZW50LmN0cmxLZXl8fGV2ZW50Lm1ldGFLZXkpJiZldmVudC5rZXk9PT0nRW50ZXInKXtldmVudC5wcmV2ZW50RGVmYXVsdCgpO3N1Ym1pdE1hc3RlckRhdGFBaVByb3Bvc2UoKTt9XCJcbiAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTtib3gtc2l6aW5nOmJvcmRlci1ib3g7cGFkZGluZzo4cHg7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1jdi1ib3JkZXIpO2JvcmRlci1yYWRpdXM6NHB4O2ZvbnQtc2l6ZTowLjg4ZW07cmVzaXplOnZlcnRpY2FsO1wiPjwvdGV4dGFyZWE+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgaWQ9XCJtZHUtZG9jdW1lbnRfaW5nZXN0aW9uLWlucHV0LWFyZWFcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwibWR1LWRvYy10ZXh0YXJlYVwiIHN0eWxlPVwiZm9udC1zaXplOjAuODJlbTtmb250LXdlaWdodDo2MDA7Y29sb3I6dmFyKC0tY3YtdGV4dC1tdXRlZCk7ZGlzcGxheTpibG9jazttYXJnaW4tYm90dG9tOjRweDtcIj5cbiAgICAgICAgICAgIFBhc3RlIGRvY3VtZW50IHRleHQsIG9yIHVwbG9hZCBhIGZpbGVcbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDx0ZXh0YXJlYSBpZD1cIm1kdS1kb2MtdGV4dGFyZWFcIiByb3dzPVwiNFwiIG1heGxlbmd0aD1cIjYwMDAwXCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiUGFzdGUgYW4gb2xkIENWIG9yIExpbmtlZEluIGV4cG9ydC4uLlwiXG4gICAgICAgICAgICBvbmtleWRvd249XCJpZigoZXZlbnQuY3RybEtleXx8ZXZlbnQubWV0YUtleSkmJmV2ZW50LmtleT09PSdFbnRlcicpe2V2ZW50LnByZXZlbnREZWZhdWx0KCk7c3VibWl0TWFzdGVyRGF0YUFpUHJvcG9zZSgpO31cIlxuICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDoxMDAlO2JveC1zaXppbmc6Ym9yZGVyLWJveDtwYWRkaW5nOjhweDtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWN2LWJvcmRlcik7Ym9yZGVyLXJhZGl1czo0cHg7Zm9udC1zaXplOjAuODhlbTtyZXNpemU6dmVydGljYWw7bWFyZ2luLWJvdHRvbTo4cHg7XCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiBpZD1cIm1kdS1kb2MtZmlsZS1pbnB1dFwiIGFjY2VwdD1cIi50eHQsLm1kLC5yc3QsLmh0bWwsLmh0bSwucGRmLC5kb2N4LC5ydGZcIlxuICAgICAgICAgICAgb25jaGFuZ2U9XCJoYW5kbGVNYXN0ZXJEYXRhQWlGaWxlVXBsb2FkKGV2ZW50KVwiIGFyaWEtZGVzY3JpYmVkYnk9XCJtZHUtdXBsb2FkLWRpc2Nsb3N1cmVcIlxuICAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6MC44MmVtO1wiPlxuICAgICAgICAgIDxwIGlkPVwibWR1LXVwbG9hZC1kaXNjbG9zdXJlXCIgc3R5bGU9XCJmb250LXNpemU6MC43OGVtO2NvbG9yOnZhcigtLWN2LXRleHQtc2Vjb25kYXJ5KTttYXJnaW46NnB4IDAgMDtcIj5cbiAgICAgICAgICAgIFRoaXMgZG9jdW1lbnQgd2lsbCBiZSBzZW50IHRvIHlvdXIgY29uZmlndXJlZCBBSSBwcm92aWRlciBcdTIwMTQgc2VlIHRoZSBkYXRhIGhhbmRsaW5nIGJhZGdlIGFib3ZlLlxuICAgICAgICAgICAgQW4gb2xkIENWIG9yIExpbmtlZEluIGV4cG9ydCBjYW4gY2FycnkgbW9yZSBwZXJzb25hbCBpbmZvcm1hdGlvbiB0aGFuIGEgam9iIGRlc2NyaXB0aW9uLlxuICAgICAgICAgIDwvcD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6OHB4O2FsaWduLWl0ZW1zOmNlbnRlcjttYXJnaW4tdG9wOjEycHg7XCI+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWQ9XCJtZHUtcHJvcG9zZS1idG5cIiBvbmNsaWNrPVwic3VibWl0TWFzdGVyRGF0YUFpUHJvcG9zZSgpXCJcbiAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZzo4cHggMThweDtmb250LXNpemU6MC44OGVtO2ZvbnQtd2VpZ2h0OjYwMDtjdXJzb3I6cG9pbnRlcjtiYWNrZ3JvdW5kOnZhcigtLWN2LWFjY2VudCk7Y29sb3I6dmFyKC0tY3Ytd2hpdGUpO2JvcmRlcjpub25lO2JvcmRlci1yYWRpdXM6NnB4O1wiPlxuICAgICAgICAgICAgUHJvcG9zZSBVcGRhdGVcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBpZD1cIm1kdS1kaXNjYXJkLWJ0blwiIG9uY2xpY2s9XCJkaXNjYXJkTWFzdGVyRGF0YUFpUHJvcG9zYWwoKVwiIHN0eWxlPVwiZGlzcGxheTpub25lO3BhZGRpbmc6OHB4IDE0cHg7Zm9udC1zaXplOjAuODVlbTtjdXJzb3I6cG9pbnRlcjtiYWNrZ3JvdW5kOnZhcigtLWN2LXdoaXRlKTtjb2xvcjp2YXIoLS1jdi10ZXh0LXNlY29uZGFyeSk7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1jdi1ib3JkZXIpO2JvcmRlci1yYWRpdXM6NnB4O1wiPlxuICAgICAgICAgICAgRGlzY2FyZFxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGlkPVwibWR1LXN0YXR1c1wiIHJvbGU9XCJzdGF0dXNcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIiBzdHlsZT1cIm1hcmdpbi10b3A6MTBweDtmb250LXNpemU6MC44NWVtO2NvbG9yOnZhcigtLWN2LXRleHQtc2Vjb25kYXJ5KTtcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cIm1kdS1jbGFyaWZpY2F0aW9uLWNvbnRhaW5lclwiPjwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwibWR1LXJldmlldy1hcmVhXCIgc3R5bGU9XCJtYXJnaW4tdG9wOjEycHg7XCI+PC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJtZHUtcmVzdWx0XCIgc3R5bGU9XCJtYXJnaW4tdG9wOjEycHg7XCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xufVxuXG5mdW5jdGlvbiByZW5kZXJNYXN0ZXJEYXRhQWlVcGRhdGVEaXNhYmxlZE5vdGUoKSB7XG4gIHJldHVybiBgXG4gICAgPGRpdiBzdHlsZT1cIm1hcmdpbjoxNnB4IDA7cGFkZGluZzoxMHB4IDE0cHg7YmFja2dyb3VuZDp2YXIoLS1jdi1iZy1zdWJ0bGUpO2JvcmRlcjoxcHggc29saWQgdmFyKC0tY3YtYm9yZGVyKTtib3JkZXItcmFkaXVzOjZweDtmb250LXNpemU6MC44NWVtO2NvbG9yOnZhcigtLWN2LXRleHQtc2Vjb25kYXJ5KTtcIj5cbiAgICAgIFx1RDgzRVx1REQxNiBVcGRhdGUgdmlhIEFJIGlzIGF2YWlsYWJsZSBiZWZvcmUgYW5hbHlzaXMgc3RhcnRzIG9yIGR1cmluZyByZWZpbmVtZW50LlxuICAgIDwvZGl2PmA7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBQYW5lbCBleHBhbmQvY29sbGFwc2UgKyBtb2RlIHRvZ2dsZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gdG9nZ2xlTWFzdGVyRGF0YUFpUGFuZWwoKSB7XG4gIGNvbnN0IGJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWR1LXBhbmVsLWJvZHknKTtcbiAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS10b2dnbGUtYnRuJyk7XG4gIGNvbnN0IGljb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWR1LXRvZ2dsZS1pY29uJyk7XG4gIGlmICghYm9keSB8fCAhYnRuKSByZXR1cm47XG4gIGNvbnN0IGV4cGFuZGVkID0gYm9keS5zdHlsZS5kaXNwbGF5ICE9PSAnbm9uZSc7XG4gIGJvZHkuc3R5bGUuZGlzcGxheSA9IGV4cGFuZGVkID8gJ25vbmUnIDogJ2Jsb2NrJztcbiAgYnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsIFN0cmluZyghZXhwYW5kZWQpKTtcbiAgaWYgKGljb24pIGljb24udGV4dENvbnRlbnQgPSBleHBhbmRlZCA/ICdcdTI1QjgnIDogJ1x1MjVCRSc7XG59XG5cbmZ1bmN0aW9uIHNldE1hc3RlckRhdGFBaU1vZGUobW9kZSkge1xuICBfbWR1TW9kZSA9IG1vZGU7XG4gIGZvciAoY29uc3QgbSBvZiBbJ25sX2luc3RydWN0aW9uJywgJ2RvY3VtZW50X2luZ2VzdGlvbiddKSB7XG4gICAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYG1kdS1tb2RlLSR7bX0tYnRuYCk7XG4gICAgY29uc3QgYXJlYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBtZHUtJHttfS1pbnB1dC1hcmVhYCk7XG4gICAgY29uc3QgYWN0aXZlID0gbSA9PT0gbW9kZTtcbiAgICBpZiAoYnRuKSB7XG4gICAgICBidG4uc2V0QXR0cmlidXRlKCdhcmlhLXNlbGVjdGVkJywgU3RyaW5nKGFjdGl2ZSkpO1xuICAgICAgYnRuLnN0eWxlLmJhY2tncm91bmQgPSBhY3RpdmUgPyAndmFyKC0tY3Ytd2hpdGUpJyA6ICd2YXIoLS1jdi1iZy1zdWJ0bGUpJztcbiAgICAgIGJ0bi5zdHlsZS5jb2xvciA9IGFjdGl2ZSA/ICd2YXIoLS1jdi10ZXh0LXByaW1hcnkpJyA6ICd2YXIoLS1jdi10ZXh0LXNlY29uZGFyeSknO1xuICAgICAgYnRuLnN0eWxlLmZvbnRXZWlnaHQgPSBhY3RpdmUgPyAnNjAwJyA6ICc0MDAnO1xuICAgIH1cbiAgICBpZiAoYXJlYSkgYXJlYS5zdHlsZS5kaXNwbGF5ID0gYWN0aXZlID8gJ2Jsb2NrJyA6ICdub25lJztcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgRG9jdW1lbnQgdXBsb2FkIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVNYXN0ZXJEYXRhQWlGaWxlVXBsb2FkKGV2ZW50KSB7XG4gIGNvbnN0IGZpbGUgPSBldmVudC50YXJnZXQuZmlsZXMgJiYgZXZlbnQudGFyZ2V0LmZpbGVzWzBdO1xuICBpZiAoIWZpbGUpIHJldHVybjtcbiAgY29uc3Qgc3RhdHVzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWR1LXN0YXR1cycpO1xuICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gYFJlYWRpbmcgJHtmaWxlLm5hbWV9XHUyMDI2YDtcbiAgdHJ5IHtcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZScsIGZpbGUpO1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaCgnL2FwaS91cGxvYWQtZmlsZScsIHsgbWV0aG9kOiAnUE9TVCcsIGJvZHk6IGZvcm1EYXRhIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwLmpzb24oKTtcbiAgICBpZiAoIXJlc3Aub2sgfHwgZGF0YS5lcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGRhdGEubWVzc2FnZSB8fCBkYXRhLmVycm9yIHx8IGBTZXJ2ZXIgZXJyb3IgJHtyZXNwLnN0YXR1c31gKTtcbiAgICB9XG4gICAgY29uc3QgdGV4dGFyZWEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWR1LWRvYy10ZXh0YXJlYScpO1xuICAgIGlmICh0ZXh0YXJlYSkgdGV4dGFyZWEudmFsdWUgPSBkYXRhLnRleHQ7XG4gICAgaWYgKHN0YXR1c0VsKSBzdGF0dXNFbC50ZXh0Q29udGVudCA9IGBMb2FkZWQgJHtkYXRhLmNvbnRlbnRfbGVuZ3RoLnRvTG9jYWxlU3RyaW5nKCl9IGNoYXJhY3RlcnMgZnJvbSBcIiR7ZGF0YS5maWxlbmFtZX1cIi5gO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cuZXJyb3IoJ2hhbmRsZU1hc3RlckRhdGFBaUZpbGVVcGxvYWQ6IGZhaWxlZCcsIGVycik7XG4gICAgaWYgKHN0YXR1c0VsKSBzdGF0dXNFbC50ZXh0Q29udGVudCA9IGBFcnJvciByZWFkaW5nIGZpbGU6ICR7ZXJyLm1lc3NhZ2V9YDtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgUHJvcG9zZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gX21kdUVuZHBvaW50Rm9yTW9kZShtb2RlKSB7XG4gIHJldHVybiBtb2RlID09PSAnbmxfaW5zdHJ1Y3Rpb24nID8gJy9hcGkvbWFzdGVyLWRhdGEvbmwtdXBkYXRlL3Byb3Bvc2UnIDogJy9hcGkvbWFzdGVyLWRhdGEvaW5nZXN0LWRvY3VtZW50L3Byb3Bvc2UnO1xufVxuXG5mdW5jdGlvbiBfbWR1SW5wdXRGb3JNb2RlKG1vZGUpIHtcbiAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChtb2RlID09PSAnbmxfaW5zdHJ1Y3Rpb24nID8gJ21kdS1ubC10ZXh0YXJlYScgOiAnbWR1LWRvYy10ZXh0YXJlYScpO1xuICByZXR1cm4gZWwgPyBlbC52YWx1ZS50cmltKCkgOiAnJztcbn1cblxuYXN5bmMgZnVuY3Rpb24gc3VibWl0TWFzdGVyRGF0YUFpUHJvcG9zZSgpIHtcbiAgY29uc3QgaW5wdXQgPSBfbWR1SW5wdXRGb3JNb2RlKF9tZHVNb2RlKTtcbiAgY29uc3Qgc3RhdHVzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWR1LXN0YXR1cycpO1xuICBjb25zdCByZXZpZXdBcmVhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1yZXZpZXctYXJlYScpO1xuICBjb25zdCByZXN1bHRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtcmVzdWx0Jyk7XG4gIGNvbnN0IHByb3Bvc2VCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWR1LXByb3Bvc2UtYnRuJyk7XG5cbiAgaWYgKCFpbnB1dCkge1xuICAgIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSBfbWR1TW9kZSA9PT0gJ25sX2luc3RydWN0aW9uJ1xuICAgICAgPyAnUGxlYXNlIGRlc2NyaWJlIHRoZSBjaGFuZ2UgZmlyc3QuJ1xuICAgICAgOiAnUGxlYXNlIHBhc3RlIG9yIHVwbG9hZCBkb2N1bWVudCB0ZXh0IGZpcnN0Lic7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHJldmlld0FyZWEpIHJldmlld0FyZWEuaW5uZXJIVE1MID0gJyc7XG4gIGlmIChyZXN1bHRFbCkgcmVzdWx0RWwuaW5uZXJIVE1MID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtY2xhcmlmaWNhdGlvbi1jb250YWluZXInKS5pbm5lckhUTUwgPSAnJztcbiAgaWYgKHByb3Bvc2VCdG4pIHsgcHJvcG9zZUJ0bi5kaXNhYmxlZCA9IHRydWU7IHByb3Bvc2VCdG4udGV4dENvbnRlbnQgPSAnQW5hbHl6aW5nXHUyMDI2JzsgfVxuICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJ0FuYWx5emluZ1x1MjAyNic7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBib2R5ID0geyBwcmlvcl9jbGFyaWZpY2F0aW9uczogX21kdVByaW9yQ2xhcmlmaWNhdGlvbnMgfTtcbiAgICBib2R5W19tZHVNb2RlID09PSAnbmxfaW5zdHJ1Y3Rpb24nID8gJ2luc3RydWN0aW9uJyA6ICd0ZXh0J10gPSBpbnB1dDtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2goX21kdUVuZHBvaW50Rm9yTW9kZShfbWR1TW9kZSksIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcC5qc29uKCk7XG5cbiAgICBpZiAoIXJlc3Aub2sgfHwgZGF0YS5vayA9PT0gZmFsc2UpIHtcbiAgICAgIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSBgRXJyb3I6ICR7ZXNjKGRhdGEuZXJyb3IgfHwgJ1Vua25vd24gZXJyb3InKX1gO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChkYXRhLnJlcXVpcmVzX2NsYXJpZmljYXRpb24pIHtcbiAgICAgIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnJztcbiAgICAgIF9tZHVTaG93Q2xhcmlmaWNhdGlvbkRpYWxvZyhkYXRhLmNsYXJpZmljYXRpb25fcXVlc3Rpb24sIGlucHV0KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBfbWR1UHJpb3JDbGFyaWZpY2F0aW9ucyA9IFtdO1xuICAgIGNvbnN0IGNoYW5nZXMgPSBkYXRhLmNoYW5nZXMgfHwgW107XG4gICAgaWYgKHN0YXR1c0VsKSBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICcnO1xuXG4gICAgaWYgKGNoYW5nZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBpZiAocmV2aWV3QXJlYSkgcmV2aWV3QXJlYS5pbm5lckhUTUwgPSBgPHAgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2NvbG9yOnZhcigtLWN2LXRleHQtc2Vjb25kYXJ5KTtcIj5ObyBjaGFuZ2VzIGNvdWxkIGJlIHByb3Bvc2VkIGZyb20gdGhhdCBcdTIwMTQgdHJ5IGFkZGluZyBtb3JlIGRldGFpbC48L3A+YDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBfbWR1UGVuZGluZ1Byb3Bvc2FsID0geyBwcm9wb3NhbElkOiBkYXRhLnByb3Bvc2FsX2lkLCBzb3VyY2U6IF9tZHVNb2RlLCBjaGFuZ2VzIH07XG4gICAgX21kdVJlbmRlclJldmlld0FyZWEoKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLmVycm9yKCdzdWJtaXRNYXN0ZXJEYXRhQWlQcm9wb3NlOiBmYWlsZWQnLCBlcnIpO1xuICAgIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSBgTmV0d29yayBlcnJvcjogJHtlc2MoZXJyLm1lc3NhZ2UpfWA7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKHByb3Bvc2VCdG4pIHsgcHJvcG9zZUJ0bi5kaXNhYmxlZCA9IGZhbHNlOyBwcm9wb3NlQnRuLnRleHRDb250ZW50ID0gJ1Byb3Bvc2UgVXBkYXRlJzsgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGRpc2NhcmRNYXN0ZXJEYXRhQWlQcm9wb3NhbCgpIHtcbiAgX21kdVBlbmRpbmdQcm9wb3NhbCA9IG51bGw7XG4gIF9tZHVQcmlvckNsYXJpZmljYXRpb25zID0gW107XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtcmV2aWV3LWFyZWEnKS5pbm5lckhUTUwgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1yZXN1bHQnKS5pbm5lckhUTUwgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1kaXNjYXJkLWJ0bicpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIGNvbnN0IHN0YXR1c0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1zdGF0dXMnKTtcbiAgaWYgKHN0YXR1c0VsKSBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICdEaXNjYXJkZWQuJztcbn1cblxuLy8gXHUyNTAwXHUyNTAwIENsYXJpZmljYXRpb24gZGlhbG9nIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuLy8gTW9kZWxlZCBvbiBzaG93Q2xhcmlmaWNhdGlvbkRpYWxvZygpIGluIHdlYi9sYXlvdXQtaW5zdHJ1Y3Rpb24uanMsIG5vdCBhXG4vLyBsaXRlcmFsIGNvcHktcGFzdGUgcG9ydDogdGhhdCB2ZXJzaW9uIGhhcmQtY29kZXMgaXRzIG1vdW50IHBvaW50IGFuZCB1c2VzXG4vLyBub24tbmFtZXNwYWNlZCBlbGVtZW50IGlkcyAobGF5b3V0LWNsYXJpZmljYXRpb24tKiksIHdoaWNoIHdvdWxkIGNvbGxpZGVcbi8vIHdpdGggdGhpcyBwYW5lbCdzIG93biBpZHMgaWYgYm90aCB0YWJzIGFyZSBwcmVzZW50IGluIHRoZSBET00gYXQgb25jZVxuLy8gKENTUy1oaWRkZW4gdGFicyBhcmVuJ3QgdW5tb3VudGVkKS4gVGhpcyB2ZXJzaW9uIG1vdW50cyBpbnRvIHRoZSBwYW5lbCdzXG4vLyBvd24gI21kdS1jbGFyaWZpY2F0aW9uLWNvbnRhaW5lciBhbmQgdXNlcyBhbiBtZHUtKiBpZCBuYW1lc3BhY2UgdGhyb3VnaG91dC5cblxuZnVuY3Rpb24gX21kdVNob3dDbGFyaWZpY2F0aW9uRGlhbG9nKHF1ZXN0aW9uLCBvcmlnaW5hbEluc3RydWN0aW9uKSB7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtY2xhcmlmaWNhdGlvbi1jb250YWluZXInKTtcbiAgaWYgKCFjb250YWluZXIpIHtcbiAgICBsb2cud2FybignX21kdVNob3dDbGFyaWZpY2F0aW9uRGlhbG9nOiAjbWR1LWNsYXJpZmljYXRpb24tY29udGFpbmVyIG5vdCBmb3VuZCcpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG9yaWdpbmF0aW5nQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1wcm9wb3NlLWJ0bicpO1xuXG4gIGNvbnN0IHBhbmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHBhbmVsLmlkID0gJ21kdS1jbGFyaWZpY2F0aW9uLXBhbmVsJztcbiAgcGFuZWwuc2V0QXR0cmlidXRlKCdyb2xlJywgJ2FsZXJ0Jyk7XG4gIHBhbmVsLnN0eWxlLmNzc1RleHQgPSAnYmFja2dyb3VuZDp2YXIoLS1jdi13YXJuLWJnKTtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWN2LXdhcm4tbGlnaHQpO2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MTRweDttYXJnaW4tdG9wOjEwcHg7JztcbiAgcGFuZWwuaW5uZXJIVE1MID0gYFxuICAgIDxwIHN0eWxlPVwibWFyZ2luOjAgMCA2cHg7Zm9udC1zaXplOjAuODVlbTtjb2xvcjp2YXIoLS1jdi13YXJuLXRleHQpO2ZvbnQtd2VpZ2h0OjYwMDtcIj5cbiAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlx1Mjc1Mzwvc3Bhbj4gQWxtb3N0IHRoZXJlIFx1MjAxNCBhIGJpdCBtb3JlIGRldGFpbCB3b3VsZCBoZWxwOlxuICAgIDwvcD5cbiAgICA8cCBzdHlsZT1cIm1hcmdpbjowIDAgMTBweDtmb250LXNpemU6MC44OGVtO2NvbG9yOnZhcigtLWN2LXdhcm4tdGV4dCk7XCI+JHtlc2MocXVlc3Rpb24pfTwvcD5cbiAgICA8bGFiZWwgZm9yPVwibWR1LWNsYXJpZmljYXRpb24taW5wdXRcIiBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOnZhcigtLWN2LXRleHQtbXV0ZWQpO2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWJvdHRvbTo0cHg7XCI+XG4gICAgICBZb3VyIGNsYXJpZmljYXRpb246XG4gICAgPC9sYWJlbD5cbiAgICA8dGV4dGFyZWEgaWQ9XCJtZHUtY2xhcmlmaWNhdGlvbi1pbnB1dFwiIHJvd3M9XCIyXCJcbiAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTtib3gtc2l6aW5nOmJvcmRlci1ib3g7cGFkZGluZzo4cHg7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1jdi13YXJuLWxpZ2h0KTtib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6MC44OGVtO3Jlc2l6ZTp2ZXJ0aWNhbDtcIlxuICAgICAgYXJpYS1sYWJlbD1cIkNsYXJpZmljYXRpb24gZm9yIG1hc3RlciBkYXRhIHVwZGF0ZVwiPiR7ZXNjKG9yaWdpbmFsSW5zdHJ1Y3Rpb24pfTwvdGV4dGFyZWE+XG4gICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6OHB4O21hcmdpbi10b3A6OHB4O1wiPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWQ9XCJtZHUtY2xhcmlmaWNhdGlvbi1zdWJtaXRcIlxuICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6dmFyKC0tY3Ytd2Fybik7Y29sb3I6dmFyKC0tY3Ytd2hpdGUpO2JvcmRlcjpub25lO2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6NnB4IDE0cHg7Zm9udC1zaXplOjAuODVlbTtjdXJzb3I6cG9pbnRlcjtmb250LXdlaWdodDo2MDA7XCI+XG4gICAgICAgIFN1Ym1pdCBjbGFyaWZpY2F0aW9uXG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlkPVwibWR1LWNsYXJpZmljYXRpb24tY2FuY2VsXCJcbiAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1jdi13YXJuKTtjb2xvcjp2YXIoLS1jdi13YXJuLXRleHQpO2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6NnB4IDE0cHg7Zm9udC1zaXplOjAuODVlbTtjdXJzb3I6cG9pbnRlcjtcIj5cbiAgICAgICAgQ2FuY2VsXG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5gO1xuXG4gIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcbiAgY29udGFpbmVyLmFwcGVuZENoaWxkKHBhbmVsKTtcblxuICBjb25zdCBjbGFySW5wdXQgPSBwYW5lbC5xdWVyeVNlbGVjdG9yKCcjbWR1LWNsYXJpZmljYXRpb24taW5wdXQnKTtcbiAgY29uc3Qgc3VibWl0QnRuID0gcGFuZWwucXVlcnlTZWxlY3RvcignI21kdS1jbGFyaWZpY2F0aW9uLXN1Ym1pdCcpO1xuICBjb25zdCBjYW5jZWxCdG4gPSBwYW5lbC5xdWVyeVNlbGVjdG9yKCcjbWR1LWNsYXJpZmljYXRpb24tY2FuY2VsJyk7XG5cbiAgY2xhcklucHV0LmZvY3VzKCk7XG4gIGNsYXJJbnB1dC5zZXRTZWxlY3Rpb25SYW5nZShjbGFySW5wdXQudmFsdWUubGVuZ3RoLCBjbGFySW5wdXQudmFsdWUubGVuZ3RoKTtcblxuICBjb25zdCBjbG9zZUFuZFJlc3RvcmVGb2N1cyA9ICgpID0+IHtcbiAgICBwYW5lbC5yZW1vdmUoKTtcbiAgICBpZiAob3JpZ2luYXRpbmdCdG4pIG9yaWdpbmF0aW5nQnRuLmZvY3VzKCk7XG4gIH07XG5cbiAgc3VibWl0QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGNvbnN0IHJlZmluZWQgPSBjbGFySW5wdXQudmFsdWUudHJpbSgpO1xuICAgIGlmIChyZWZpbmVkKSB7XG4gICAgICBfbWR1UHJpb3JDbGFyaWZpY2F0aW9ucyA9IFsuLi5fbWR1UHJpb3JDbGFyaWZpY2F0aW9ucywgeyBxdWVzdGlvbiwgYW5zd2VyOiByZWZpbmVkIH1dO1xuICAgICAgY29uc3QgaW5wdXRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKF9tZHVNb2RlID09PSAnbmxfaW5zdHJ1Y3Rpb24nID8gJ21kdS1ubC10ZXh0YXJlYScgOiAnbWR1LWRvYy10ZXh0YXJlYScpO1xuICAgICAgaWYgKGlucHV0RWwpIGlucHV0RWwudmFsdWUgPSByZWZpbmVkO1xuICAgIH1cbiAgICBjbG9zZUFuZFJlc3RvcmVGb2N1cygpO1xuICAgIGlmIChyZWZpbmVkKSBzdWJtaXRNYXN0ZXJEYXRhQWlQcm9wb3NlKCk7XG4gIH0pO1xuICBjYW5jZWxCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjbG9zZUFuZFJlc3RvcmVGb2N1cyk7XG4gIGNsYXJJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGUpID0+IHtcbiAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicgJiYgIWUuc2hpZnRLZXkpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyBzdWJtaXRCdG4uY2xpY2soKTsgfVxuICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIGNhbmNlbEJ0bi5jbGljaygpO1xuICB9KTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFJldmlldyBhcmVhIChwcm9wb3NhbCByb3dzKSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gX21kdUNoYW5nZURpc3BsYXlUZXh0KGNoYW5nZSkge1xuICBjb25zdCBwcm9wb3NlZCA9IGNoYW5nZS5wcm9wb3NlZDtcbiAgaWYgKHR5cGVvZiBwcm9wb3NlZCA9PT0gJ3N0cmluZycpIHJldHVybiBwcm9wb3NlZDtcbiAgaWYgKHByb3Bvc2VkICYmIHR5cGVvZiBwcm9wb3NlZCA9PT0gJ29iamVjdCcpIHtcbiAgICBpZiAoJ3RleHQnIGluIHByb3Bvc2VkKSByZXR1cm4gcHJvcG9zZWQudGV4dDtcbiAgICBpZiAoJ25hbWUnIGluIHByb3Bvc2VkKSByZXR1cm4gcHJvcG9zZWQubmFtZTtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocHJvcG9zZWQpO1xuICB9XG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gX21kdUZsYWdIdG1sKGNoYW5nZSkge1xuICBpZiAoY2hhbmdlLnBvc3NpYmxlX2R1cGxpY2F0ZV9vZikge1xuICAgIHJldHVybiBgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206NnB4O3BhZGRpbmc6NnB4IDhweDtiYWNrZ3JvdW5kOnZhcigtLWN2LXdhcm4tYmcpO2JvcmRlcjoxcHggc29saWQgdmFyKC0tY3Ytd2Fybi1ib3JkZXIpO2JvcmRlci1yYWRpdXM6NHB4O2ZvbnQtc2l6ZTowLjhlbTtjb2xvcjp2YXIoLS1jdi13YXJuLXRleHQpO1wiPlxuICAgICAgXHUyNkEwIHBvc3NpYmxlIGR1cGxpY2F0ZSBvZiAke2VzYyhjaGFuZ2UucG9zc2libGVfZHVwbGljYXRlX29mKX1cbiAgICA8L2Rpdj5gO1xuICB9XG4gIGlmIChjaGFuZ2UucGVyc3Vhc2lvbl9mbGFncyAmJiBjaGFuZ2UucGVyc3Vhc2lvbl9mbGFncy5sZW5ndGgpIHtcbiAgICByZXR1cm4gYDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjZweDtwYWRkaW5nOjZweCA4cHg7YmFja2dyb3VuZDp2YXIoLS1jdi13YXJuLWJnKTtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWN2LXdhcm4tYm9yZGVyKTtib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6MC44ZW07Y29sb3I6dmFyKC0tY3Ytd2Fybi10ZXh0KTtcIj5cbiAgICAgIFx1MjZBMCBxdWFsaXR5IGFkdmlzb3J5OiAke2VzYyhjaGFuZ2UucGVyc3Vhc2lvbl9mbGFncy5qb2luKCcsICcpKX1cbiAgICA8L2Rpdj5gO1xuICB9XG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gX21kdUFyaWFTdWZmaXgoY2hhbmdlKSB7XG4gIGNvbnN0IHBhcnRzID0gW107XG4gIGlmIChjaGFuZ2UucG9zc2libGVfZHVwbGljYXRlX29mKSBwYXJ0cy5wdXNoKGBwb3NzaWJsZSBkdXBsaWNhdGUgb2YgJHtjaGFuZ2UucG9zc2libGVfZHVwbGljYXRlX29mfWApO1xuICBpZiAoY2hhbmdlLnBlcnN1YXNpb25fZmxhZ3MgJiYgY2hhbmdlLnBlcnN1YXNpb25fZmxhZ3MubGVuZ3RoKSBwYXJ0cy5wdXNoKGBxdWFsaXR5IGFkdmlzb3J5OiAke2NoYW5nZS5wZXJzdWFzaW9uX2ZsYWdzLmpvaW4oJywgJyl9YCk7XG4gIHJldHVybiBwYXJ0cy5sZW5ndGggPyBgLCAke3BhcnRzLmpvaW4oJywgJyl9YCA6ICcnO1xufVxuXG5mdW5jdGlvbiBfbWR1UmVuZGVyUmV2aWV3QXJlYSgpIHtcbiAgY29uc3QgcmV2aWV3QXJlYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtcmV2aWV3LWFyZWEnKTtcbiAgY29uc3QgZGlzY2FyZEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtZGlzY2FyZC1idG4nKTtcbiAgaWYgKCFyZXZpZXdBcmVhIHx8ICFfbWR1UGVuZGluZ1Byb3Bvc2FsKSByZXR1cm47XG5cbiAgY29uc3QgY2hhbmdlcyA9IF9tZHVQZW5kaW5nUHJvcG9zYWwuY2hhbmdlcztcbiAgY29uc3Qgcm93c0h0bWwgPSBjaGFuZ2VzLm1hcCgoYykgPT4gcmVuZGVyUHJvcG9zYWxSb3coe1xuICAgIGlkOiBjLmlkLFxuICAgIHR5cGVMYWJlbDogYy5zZWN0aW9uLFxuICAgIGxhYmVsOiBjLmxhYmVsLFxuICAgIHByb3Bvc2VkOiBfbWR1Q2hhbmdlRGlzcGxheVRleHQoYyksXG4gICAgZGV0YWlsVGV4dDogYy5yYXRpb25hbGUsXG4gICAgZmxhZ0h0bWw6IF9tZHVGbGFnSHRtbChjKSxcbiAgICBjaGVja2VkOiBmYWxzZSxcbiAgfSwge1xuICAgIGlkUHJlZml4OiAnbWR1JyxcbiAgICBjaGVja2JveERhdGFBdHRyOiAnbWR1LWlkJyxcbiAgICBhcmlhTGFiZWxTdWZmaXg6IF9tZHVBcmlhU3VmZml4KGMpLFxuICB9KSkuam9pbignJyk7XG5cbiAgY29uc3QgZmxhZ2dlZENvdW50ID0gY2hhbmdlcy5maWx0ZXIoYyA9PiBjLnBvc3NpYmxlX2R1cGxpY2F0ZV9vZiB8fCAoYy5wZXJzdWFzaW9uX2ZsYWdzICYmIGMucGVyc3Vhc2lvbl9mbGFncy5sZW5ndGgpKS5sZW5ndGg7XG5cbiAgcmV2aWV3QXJlYS5pbm5lckhUTUwgPSBgXG4gICAgPGRpdiByb2xlPVwiZ3JvdXBcIiBhcmlhLWxhYmVsPVwiUHJvcG9zZWQgY2hhbmdlcywgJHtjaGFuZ2VzLmxlbmd0aH0gaXRlbXMsIDAgc2VsZWN0ZWRcIiBpZD1cIm1kdS1yb3ctZ3JvdXBcIj5cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47YWxpZ24taXRlbXM6Y2VudGVyO21hcmdpbi1ib3R0b206OHB4O1wiPlxuICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07Y29sb3I6dmFyKC0tY3YtdGV4dC1zZWNvbmRhcnkpO1wiPiR7Y2hhbmdlcy5sZW5ndGh9IHByb3Bvc2VkIGNoYW5nZSR7Y2hhbmdlcy5sZW5ndGggPT09IDEgPyAnJyA6ICdzJ308L3NwYW4+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG9uY2xpY2s9XCJzZWxlY3RNYXN0ZXJEYXRhQWlOb25GbGFnZ2VkKClcIiBzdHlsZT1cImZvbnQtc2l6ZTowLjhlbTtwYWRkaW5nOjRweCAxMHB4O2JvcmRlcjoxcHggc29saWQgdmFyKC0tY3YtYm9yZGVyKTtib3JkZXItcmFkaXVzOjRweDtiYWNrZ3JvdW5kOnZhcigtLWN2LXdoaXRlKTtjb2xvcjp2YXIoLS1jdi10ZXh0LXByaW1hcnkpO2N1cnNvcjpwb2ludGVyO1wiPlxuICAgICAgICAgIFNlbGVjdCBhbGwgbm9uLWZsYWdnZWRcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDx0YWJsZSBzdHlsZT1cIndpZHRoOjEwMCU7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlO1wiPiR7cm93c0h0bWx9PC90YWJsZT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGlkPVwibWR1LXNlbGVjdGlvbi1saXZlXCIgYXJpYS1saXZlPVwicG9saXRlXCIgY2xhc3M9XCJzci1vbmx5XCIgc3R5bGU9XCJwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxcHg7aGVpZ2h0OjFweDtvdmVyZmxvdzpoaWRkZW47XCI+PC9kaXY+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWQ9XCJtZHUtY29uZmlybS1idG5cIiBvbmNsaWNrPVwiY29uZmlybU1hc3RlckRhdGFBaVVwZGF0ZSgpXCIgZGlzYWJsZWRcbiAgICAgIHN0eWxlPVwibWFyZ2luLXRvcDoxMHB4O3BhZGRpbmc6OXB4IDIwcHg7Zm9udC1zaXplOjAuOWVtO2ZvbnQtd2VpZ2h0OjYwMDtjdXJzb3I6bm90LWFsbG93ZWQ7YmFja2dyb3VuZDp2YXIoLS1jdi1zbGF0ZS0zMDApO2NvbG9yOnZhcigtLWN2LXdoaXRlKTtib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjZweDtcIj5cbiAgICAgIENvbmZpcm0gYW5kIFdyaXRlXG4gICAgPC9idXR0b24+XG4gICAgJHtmbGFnZ2VkQ291bnQgPyBgPHAgc3R5bGU9XCJmb250LXNpemU6MC43OGVtO2NvbG9yOnZhcigtLWN2LXdhcm4tdGV4dCk7bWFyZ2luLXRvcDo2cHg7XCI+JHtmbGFnZ2VkQ291bnR9IGl0ZW0ke2ZsYWdnZWRDb3VudCA9PT0gMSA/ICcnIDogJ3MnfSBmbGFnZ2VkIGZvciByZXZpZXcgYWJvdmUuPC9wPmAgOiAnJ31gO1xuXG4gIGlmIChkaXNjYXJkQnRuKSBkaXNjYXJkQnRuLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lLWJsb2NrJztcblxuICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWR1LXJldmlldy1hcmVhJyk7XG4gIGF0dGFjaFByb3Bvc2FsUm93TGlzdGVuZXJzKGNvbnRhaW5lciwgJ21kdScpO1xuICBjb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbZGF0YS1tZHUtaWRdJykuZm9yRWFjaCgoY2IpID0+IHtcbiAgICBjYi5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBfbWR1VXBkYXRlQ29uZmlybUJ1dHRvblN0YXRlKTtcbiAgfSk7XG4gIF9tZHVVcGRhdGVDb25maXJtQnV0dG9uU3RhdGUoKTtcbn1cblxuZnVuY3Rpb24gX21kdVVwZGF0ZUNvbmZpcm1CdXR0b25TdGF0ZSgpIHtcbiAgY29uc3QgY2hlY2tlZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W2RhdGEtbWR1LWlkXTpjaGVja2VkJyk7XG4gIGNvbnN0IGNvbmZpcm1CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWR1LWNvbmZpcm0tYnRuJyk7XG4gIGNvbnN0IGdyb3VwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1yb3ctZ3JvdXAnKTtcbiAgY29uc3QgbGl2ZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1zZWxlY3Rpb24tbGl2ZScpO1xuICBjb25zdCB0b3RhbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W2RhdGEtbWR1LWlkXScpLmxlbmd0aDtcbiAgaWYgKGNvbmZpcm1CdG4pIHtcbiAgICBjb25maXJtQnRuLmRpc2FibGVkID0gY2hlY2tlZC5sZW5ndGggPT09IDA7XG4gICAgY29uZmlybUJ0bi5zdHlsZS5jdXJzb3IgPSBjaGVja2VkLmxlbmd0aCA9PT0gMCA/ICdub3QtYWxsb3dlZCcgOiAncG9pbnRlcic7XG4gICAgY29uZmlybUJ0bi5zdHlsZS5iYWNrZ3JvdW5kID0gY2hlY2tlZC5sZW5ndGggPT09IDAgPyAndmFyKC0tY3Ytc2xhdGUtMzAwKScgOiAndmFyKC0tY3Ytc3VjY2Vzcy1tZCknO1xuICB9XG4gIGlmIChncm91cCkgZ3JvdXAuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgYFByb3Bvc2VkIGNoYW5nZXMsICR7dG90YWx9IGl0ZW1zLCAke2NoZWNrZWQubGVuZ3RofSBzZWxlY3RlZGApO1xuICBpZiAobGl2ZUVsKSBsaXZlRWwudGV4dENvbnRlbnQgPSBgJHtjaGVja2VkLmxlbmd0aH0gb2YgJHt0b3RhbH0gc2VsZWN0ZWRgO1xufVxuXG5mdW5jdGlvbiBzZWxlY3RNYXN0ZXJEYXRhQWlOb25GbGFnZ2VkKCkge1xuICBpZiAoIV9tZHVQZW5kaW5nUHJvcG9zYWwpIHJldHVybjtcbiAgY29uc3QgZmxhZ2dlZElkcyA9IG5ldyBTZXQoXG4gICAgX21kdVBlbmRpbmdQcm9wb3NhbC5jaGFuZ2VzXG4gICAgICAuZmlsdGVyKGMgPT4gYy5wb3NzaWJsZV9kdXBsaWNhdGVfb2YgfHwgKGMucGVyc3Vhc2lvbl9mbGFncyAmJiBjLnBlcnN1YXNpb25fZmxhZ3MubGVuZ3RoKSlcbiAgICAgIC5tYXAoYyA9PiBjLmlkKSxcbiAgKTtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbZGF0YS1tZHUtaWRdJykuZm9yRWFjaCgoY2IpID0+IHtcbiAgICBpZiAoIWZsYWdnZWRJZHMuaGFzKGNiLmRhdGFzZXQubWR1SWQpKSBjYi5jaGVja2VkID0gdHJ1ZTtcbiAgfSk7XG4gIF9tZHVVcGRhdGVDb25maXJtQnV0dG9uU3RhdGUoKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIENvbmZpcm0gYW5kIHdyaXRlIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBjb25maXJtTWFzdGVyRGF0YUFpVXBkYXRlKCkge1xuICBpZiAoIV9tZHVQZW5kaW5nUHJvcG9zYWwpIHJldHVybjtcbiAgY29uc3Qgc2VsZWN0ZWRJZHMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W2RhdGEtbWR1LWlkXTpjaGVja2VkJykpLm1hcChjYiA9PiBjYi5kYXRhc2V0Lm1kdUlkKTtcbiAgaWYgKHNlbGVjdGVkSWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIGNvbnN0IHNvdXJjZUxhYmVsID0gX21kdVBlbmRpbmdQcm9wb3NhbC5zb3VyY2UgPT09ICdubF9pbnN0cnVjdGlvbicgPyAneW91ciBpbnN0cnVjdGlvbicgOiAndGhlIHVwbG9hZGVkIGRvY3VtZW50JztcbiAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgKHR5cGVvZiBzaG93Q29uZmlybU1vZGFsID09PSAnZnVuY3Rpb24nXG4gICAgPyBzaG93Q29uZmlybU1vZGFsKFxuICAgICAgICBgV3JpdGUgJHtzZWxlY3RlZElkcy5sZW5ndGh9IGNoYW5nZSR7c2VsZWN0ZWRJZHMubGVuZ3RoID09PSAxID8gJycgOiAncyd9IHRvIE1hc3RlciBDVj9gLFxuICAgICAgICBgVGhlc2UgJHtzZWxlY3RlZElkcy5sZW5ndGh9IGNoYW5nZSR7c2VsZWN0ZWRJZHMubGVuZ3RoID09PSAxID8gJycgOiAncyd9IHdlcmUgcHJvcG9zZWQgYnkgQUkgZnJvbSAke3NvdXJjZUxhYmVsfSBhbmQgaGF2ZSBub3QgYmVlbiBwcmV2aW91c2x5IHJldmlld2VkLiBgICtcbiAgICAgICAgYENvbmZpcm1pbmcgd2lsbCBwZXJtYW5lbnRseSB3cml0ZSB0aGVtIHRvIE1hc3Rlcl9DVl9EYXRhLmpzb24uIEEgYmFja3VwIHdpbGwgYmUgY3JlYXRlZCBmaXJzdCBcdTIwMTQgc2VlIFx1RDgzRFx1REQ1MCBCYWNrdXBzIGFib3ZlIHRvIHJlc3RvcmUgaXQgaWYgbmVlZGVkLmAsXG4gICAgICApXG4gICAgOiBQcm9taXNlLnJlc29sdmUod2luZG93LmNvbmZpcm0oYFdyaXRlICR7c2VsZWN0ZWRJZHMubGVuZ3RofSBjaGFuZ2UocykgdG8gTWFzdGVyIENWPyBUaGlzIHdpbGwgcGVybWFuZW50bHkgd3JpdGUgY2hhbmdlcyB0byBNYXN0ZXJfQ1ZfRGF0YS5qc29uLmApKSk7XG5cbiAgaWYgKCFjb25maXJtZWQpIHJldHVybjtcblxuICBjb25zdCBjb25maXJtQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1jb25maXJtLWJ0bicpO1xuICBjb25zdCByZXN1bHRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtcmVzdWx0Jyk7XG4gIGlmIChjb25maXJtQnRuKSB7IGNvbmZpcm1CdG4uZGlzYWJsZWQgPSB0cnVlOyBjb25maXJtQnRuLnRleHRDb250ZW50ID0gJ1dyaXRpbmdcdTIwMjYnOyB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvY29uZmlybS11cGRhdGUnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBwcm9wb3NhbF9pZDogX21kdVBlbmRpbmdQcm9wb3NhbC5wcm9wb3NhbElkLCBzZWxlY3RlZF9pZHM6IHNlbGVjdGVkSWRzIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwLmpzb24oKTtcblxuICAgIGlmIChkYXRhLm9rID09PSBmYWxzZSAmJiBkYXRhLnN0YWxlX2NoYW5nZXMpIHtcbiAgICAgIF9tZHVIYW5kbGVTdGFsZUNoYW5nZXMoZGF0YS5zdGFsZV9jaGFuZ2VzLCBkYXRhLmFwcGxpY2FibGVfY2hhbmdlcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghZGF0YS5vaykge1xuICAgICAgaWYgKHJlc3VsdEVsKSByZXN1bHRFbC5pbm5lckhUTUwgPSBgPHAgY2xhc3M9XCJlcnJvci1tZXNzYWdlXCI+Q29uZmlybSBmYWlsZWQ6ICR7ZXNjKGRhdGEuZXJyb3IgfHwgJ1Vua25vd24gZXJyb3InKX08L3A+YDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjaGFuZ2VzQnlJZCA9IE9iamVjdC5mcm9tRW50cmllcyhfbWR1UGVuZGluZ1Byb3Bvc2FsLmNoYW5nZXMubWFwKGMgPT4gW2MuaWQsIGNdKSk7XG4gICAgY29uc3Qgd3JpdHRlbkxpbmVzID0gKGRhdGEuZGlmZl9zdW1tYXJ5IHx8IFtdKVxuICAgICAgLmZpbHRlcihkID0+IGQuYXBwbGllZClcbiAgICAgIC5tYXAoZCA9PiBgPGxpPiR7ZXNjKGQubGFiZWwgfHwgZC5pZCl9JHtjaGFuZ2VzQnlJZFtkLmlkXT8ucmF0aW9uYWxlID8gYCBcdTIwMTQgJHtlc2MoY2hhbmdlc0J5SWRbZC5pZF0ucmF0aW9uYWxlKX1gIDogJyd9PC9saT5gKVxuICAgICAgLmpvaW4oJycpO1xuXG4gICAgY29uc3QgY29tbWl0SW5mbyA9IGRhdGEuY29tbWl0X2hhc2ggPyBgIChjb21taXQgJHtlc2MoZGF0YS5jb21taXRfaGFzaCl9KWAgOiAnJztcbiAgICBjb25zdCBnaXRXYXJuaW5nID0gZGF0YS5naXRfZXJyb3JcbiAgICAgID8gYDxwIHN0eWxlPVwiY29sb3I6dmFyKC0tY3Ytd2Fybi10ZXh0KTtmb250LXNpemU6MC44N2VtO1wiPlx1MjZBMFx1RkUwRiBHaXQgY29tbWl0IHNraXBwZWQ6ICR7ZXNjKGRhdGEuZ2l0X2Vycm9yPy5tZXNzYWdlIHx8IGRhdGEuZ2l0X2Vycm9yKX08L3A+YFxuICAgICAgOiAnJztcbiAgICBjb25zdCBwdXNoV2FybmluZyA9IGRhdGEucHVzaF9lcnJvclxuICAgICAgPyBgPHAgc3R5bGU9XCJjb2xvcjp2YXIoLS1jdi13YXJuLXRleHQpO2ZvbnQtc2l6ZTowLjg3ZW07XCI+XHUyNkEwXHVGRTBGIEdpdCBwdXNoIHNraXBwZWQ6ICR7ZXNjKGRhdGEucHVzaF9lcnJvcil9PC9wPmBcbiAgICAgIDogJyc7XG5cbiAgICBpZiAocmVzdWx0RWwpIHtcbiAgICAgIHJlc3VsdEVsLmlubmVySFRNTCA9IGBcbiAgICAgICAgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6dmFyKC0tY3Ytc3VjY2Vzcy1iZyk7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1jdi1zdWNjZXNzLWJvcmRlcik7Ym9yZGVyLXJhZGl1czo2cHg7cGFkZGluZzoxMnB4IDE2cHg7XCI+XG4gICAgICAgICAgPHAgc3R5bGU9XCJjb2xvcjp2YXIoLS1jdi1zdWNjZXNzLXRleHQpO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW46MCAwIDZweDtcIj5cbiAgICAgICAgICAgIFx1MjcwNSAke2RhdGEud3JpdHRlbl9jb3VudH0gaXRlbSR7ZGF0YS53cml0dGVuX2NvdW50ID09PSAxID8gJycgOiAncyd9IHdyaXR0ZW4gdG8gbWFzdGVyIENWJHtjb21taXRJbmZvfS5cbiAgICAgICAgICA8L3A+XG4gICAgICAgICAgJHt3cml0dGVuTGluZXMgPyBgPHVsIHN0eWxlPVwiZm9udC1zaXplOjAuODJlbTtjb2xvcjp2YXIoLS1jdi10ZXh0LW11dGVkKTttYXJnaW46NHB4IDAgMDtwYWRkaW5nLWxlZnQ6MThweDtcIj4ke3dyaXR0ZW5MaW5lc308L3VsPmAgOiAnJ31cbiAgICAgICAgICAke2dpdFdhcm5pbmd9JHtwdXNoV2FybmluZ31cbiAgICAgICAgPC9kaXY+YDtcbiAgICB9XG5cbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWR1LXJldmlldy1hcmVhJykuaW5uZXJIVE1MID0gJyc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1kaXNjYXJkLWJ0bicpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgX21kdVBlbmRpbmdQcm9wb3NhbCA9IG51bGw7XG4gICAgX21kdVByaW9yQ2xhcmlmaWNhdGlvbnMgPSBbXTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLmVycm9yKCdjb25maXJtTWFzdGVyRGF0YUFpVXBkYXRlOiBmYWlsZWQnLCBlcnIpO1xuICAgIGlmIChyZXN1bHRFbCkgcmVzdWx0RWwuaW5uZXJIVE1MID0gYDxwIGNsYXNzPVwiZXJyb3ItbWVzc2FnZVwiPk5ldHdvcmsgZXJyb3I6ICR7ZXNjKGVyci5tZXNzYWdlKX08L3A+YDtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoY29uZmlybUJ0bikgeyBjb25maXJtQnRuLmRpc2FibGVkID0gZmFsc2U7IGNvbmZpcm1CdG4udGV4dENvbnRlbnQgPSAnQ29uZmlybSBhbmQgV3JpdGUnOyB9XG4gIH1cbn1cblxuZnVuY3Rpb24gX21kdUhhbmRsZVN0YWxlQ2hhbmdlcyhzdGFsZUNoYW5nZXMsIGFwcGxpY2FibGVDaGFuZ2VzKSB7XG4gIGNvbnN0IHJlc3VsdEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1yZXN1bHQnKTtcbiAgY29uc3Qgc3RhbGVJZHMgPSBuZXcgU2V0KHN0YWxlQ2hhbmdlcy5tYXAocyA9PiBzLmlkKSk7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbZGF0YS1tZHUtaWRdJykuZm9yRWFjaCgoY2IpID0+IHtcbiAgICBpZiAoc3RhbGVJZHMuaGFzKGNiLmRhdGFzZXQubWR1SWQpKSB7XG4gICAgICBjYi5jaGVja2VkID0gZmFsc2U7XG4gICAgICBjYi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICBjb25zdCByb3cgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgbWR1LXJvdy0ke2NiLmRhdGFzZXQubWR1SWR9YCk7XG4gICAgICBpZiAocm93KSByb3cuc3R5bGUub3BhY2l0eSA9ICcwLjUnO1xuICAgIH1cbiAgfSk7XG4gIF9tZHVVcGRhdGVDb25maXJtQnV0dG9uU3RhdGUoKTtcblxuICBjb25zdCBsaXZlRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWR1LXNlbGVjdGlvbi1saXZlJyk7XG4gIGNvbnN0IHN1bW1hcnkgPSBgJHtzdGFsZUNoYW5nZXMubGVuZ3RofSBpdGVtJHtzdGFsZUNoYW5nZXMubGVuZ3RoID09PSAxID8gJyBpcycgOiAncyBhcmUnfSBubyBsb25nZXIgdmFsaWQgYW5kICR7c3RhbGVDaGFuZ2VzLmxlbmd0aCA9PT0gMSA/ICd3YXMnIDogJ3dlcmUnfSBkZXNlbGVjdGVkOyByZXZpZXcgYW5kIGNvbmZpcm0gYWdhaW4uYDtcbiAgaWYgKGxpdmVFbCkgbGl2ZUVsLnRleHRDb250ZW50ID0gc3VtbWFyeTtcblxuICBjb25zdCBzdGFsZUxpc3QgPSBzdGFsZUNoYW5nZXMubWFwKHMgPT4gYDxsaT4ke2VzYyhzLmxhYmVsIHx8IHMuaWQpfSBcdTIwMTQgJHtlc2Mocy5yZWFzb24pfTwvbGk+YCkuam9pbignJyk7XG4gIGlmIChyZXN1bHRFbCkge1xuICAgIHJlc3VsdEVsLmlubmVySFRNTCA9IGBcbiAgICAgIDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOnZhcigtLWN2LWJnLXN1YnRsZSk7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1jdi1zbGF0ZS0zMDApO2JvcmRlci1yYWRpdXM6NnB4O3BhZGRpbmc6MTJweCAxNnB4O1wiPlxuICAgICAgICA8cCBzdHlsZT1cImNvbG9yOnZhcigtLWN2LXRleHQtbXV0ZWQpO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW46MCAwIDZweDtcIj5Ob3RoaW5nIHdhcyB3cml0dGVuIFx1MjAxNCAke3N1bW1hcnl9PC9wPlxuICAgICAgICA8dWwgc3R5bGU9XCJmb250LXNpemU6MC44MmVtO2NvbG9yOnZhcigtLWN2LXRleHQtbXV0ZWQpO21hcmdpbjo0cHggMCAwO3BhZGRpbmctbGVmdDoxOHB4O1wiPiR7c3RhbGVMaXN0fTwvdWw+XG4gICAgICAgIDxwIHN0eWxlPVwiZm9udC1zaXplOjAuODJlbTtjb2xvcjp2YXIoLS1jdi10ZXh0LXNlY29uZGFyeSk7bWFyZ2luLXRvcDo4cHg7XCI+JHthcHBsaWNhYmxlQ2hhbmdlcy5sZW5ndGh9IGl0ZW0ke2FwcGxpY2FibGVDaGFuZ2VzLmxlbmd0aCA9PT0gMSA/ICcnIDogJ3MnfSAke2FwcGxpY2FibGVDaGFuZ2VzLmxlbmd0aCA9PT0gMSA/ICdpcycgOiAnYXJlJ30gc3RpbGwgdmFsaWQgXHUyMDE0IGNsaWNrIFwiQ29uZmlybSBhbmQgV3JpdGVcIiBhZ2FpbiB0byBhcHBseSBqdXN0IHRob3NlLjwvcD5cbiAgICAgIDwvZGl2PmA7XG4gIH1cbn1cblxuLy8gTm90ZTogbm8gY2xpZW50LXNpZGUgXCJyZXN1bWUgYW4gaW4tcHJvZ3Jlc3MgcHJvcG9zYWxcIiBhZmZvcmRhbmNlIFx1MjAxNCB0aGVcbi8vIHBhbmVsIHJlc2V0cyBpdHMgc3RhdGUgb24gZXZlcnkgcmVuZGVyIChzZWUgX21kdVJlc2V0U3RhdGUsIGNhbGxlZCBmcm9tXG4vLyByZW5kZXJNYXN0ZXJEYXRhQWlVcGRhdGVQYW5lbCksIGFuZCBwZW5kaW5nIHByb3Bvc2FscyBsaXZlIHNlcnZlci1zaWRlXG4vLyBrZXllZCBieSBwcm9wb3NhbF9pZCB3aXRoIHRoZWlyIG93biBUVEwgKHNlZSBtYXN0ZXJfZGF0YV9yb3V0ZXMucHkpLlxuLy8gUmVzdW1pbmcgd291bGQgcmVxdWlyZSBhIHNlc3Npb24tc3RhdHVzLWRyaXZlbiBjaGVjayBmb3IgYW4gZXhpc3Rpbmdcbi8vIHBlbmRpbmcgcHJvcG9zYWwgYmVmb3JlIHRoZSBwYW5lbCBmaXJzdCByZW5kZXJzOyB0cmFja2VkIGFzIGEga25vd24gdjFcbi8vIGxpbWl0YXRpb24sIG5vdCBzaWxlbnRseSBhYnNlbnQuXG5cbmV4cG9ydCB7XG4gIHJlbmRlck1hc3RlckRhdGFBaVVwZGF0ZVBhbmVsLFxuICByZW5kZXJNYXN0ZXJEYXRhQWlVcGRhdGVEaXNhYmxlZE5vdGUsXG4gIHRvZ2dsZU1hc3RlckRhdGFBaVBhbmVsLFxuICBzZXRNYXN0ZXJEYXRhQWlNb2RlLFxuICBoYW5kbGVNYXN0ZXJEYXRhQWlGaWxlVXBsb2FkLFxuICBzdWJtaXRNYXN0ZXJEYXRhQWlQcm9wb3NlLFxuICBkaXNjYXJkTWFzdGVyRGF0YUFpUHJvcG9zYWwsXG4gIHNlbGVjdE1hc3RlckRhdGFBaU5vbkZsYWdnZWQsXG4gIGNvbmZpcm1NYXN0ZXJEYXRhQWlVcGRhdGUsXG59O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvbWFzdGVyLWN2LmpzXG4gKiBNYXN0ZXIgQ1YgbWFuYWdlbWVudCB0YWI6IGZldGNoLCByZW5kZXIsIGFuZCBDUlVEIGZvciBwZXJzb25hbCBpbmZvLFxuICogZXhwZXJpZW5jZXMsIHNraWxscywgZWR1Y2F0aW9uLCBhd2FyZHMsIGFjaGlldmVtZW50cywgc3VtbWFyaWVzLlxuICpcbiAqIERlcGVuZGVuY2llcyAocmVzb2x2ZWQgdGhyb3VnaCBnbG9iYWxUaGlzIGF0IHJ1bnRpbWUpOlxuICogICBlc2NhcGVIdG1sLCBzaG93VG9hc3QsIHNob3dBbGVydE1vZGFsLCBjb25maXJtRGlhbG9nLFxuICogICBhcHBlbmRMb2FkaW5nTWVzc2FnZSwgcmVtb3ZlTG9hZGluZ01lc3NhZ2UsXG4gKiAgIHNldExvYWRpbmcsIHN3aXRjaFRhYiwgYXBwZW5kTWVzc2FnZSxcbiAqICAgcmVuZGVyTWFzdGVyRGF0YUFpVXBkYXRlUGFuZWwsIHJlbmRlck1hc3RlckRhdGFBaVVwZGF0ZURpc2FibGVkTm90ZVxuICogICAgIChmcm9tIHdlYi9tYXN0ZXItZGF0YS1haS11cGRhdGUuanMsIEdBUC0wMSlcbiAqL1xuXG5sZXQgX21hc3RlckNoYW5nZU5vdGljZSA9ICcnO1xuXG4vLyBUcmFja3MgdGhlIGFjdGl2ZSByZW5kZXIgdGFyZ2V0OiBtb2RhbCBib2R5IGRpdiB3aGVuIG9wZW5lZCBmcm9tIGhlYWRlcixcbi8vIG51bGwgd2hlbiByZW5kZXJlZCBpbnRvIHRoZSBub3JtYWwgdGFiIHZpZXdlci5cbmxldCBfbWFzdGVyQ3ZBY3RpdmVDb250YWluZXIgPSBudWxsO1xuXG4vLyBGaWxlbmFtZSBvZiB0aGUgc2FmZXR5IGJhY2t1cCBjcmVhdGVkIGJ5IHRoZSBtb3N0IHJlY2VudCB1bmRvLCByZXN0b3JhYmxlXG4vLyB2aWEgcmVkby4gU2luZ2xlLWxldmVsIGJ5IGRlc2lnbiAoR0FQLTE5IDE2LjcgdjEgc2NvcGUpIFx1MjAxNCBmdXJ0aGVyLWJhY2tcbi8vIHJlY292ZXJ5IHJlbWFpbnMgYXZhaWxhYmxlIHZpYSB0aGUgZnVsbCBcIlx1RDgzRFx1REQ1MCBCYWNrdXBzXCIgaGlzdG9yeSBtb2RhbC5cbi8vIFJlc2V0IHRvIG51bGwgYXQgdGhlIHRvcCBvZiBldmVyeSBwb3B1bGF0ZU1hc3RlclRhYigpIHJlLXJlbmRlciBzbyBhbnlcbi8vIG90aGVyIHNhdmUgYWN0aW9uIChzdHJ1Y3R1cmVkIGVkaXQsIEFJLXVwZGF0ZSBjb25maXJtLCBoYXJ2ZXN0IGFwcGx5KVxuLy8gaW52YWxpZGF0ZXMgYSBzdGFsZSByZWRvIHRhcmdldC4gdW5kb01hc3RlckRhdGFDaGFuZ2UoKSBzZXRzXG4vLyBfbWFzdGVyQ3ZTdXBwcmVzc1JlZG9SZXNldCBiZWZvcmUgaXRzIG93biBwb3B1bGF0ZU1hc3RlclRhYigpIGNhbGwgc28gaXRzXG4vLyBmcmVzaGx5LXNldCByZWRvIHRhcmdldCBzdXJ2aXZlcyB0aGF0IG9uZSByZW5kZXIuXG5sZXQgX21hc3RlckN2UmVkb0JhY2t1cCA9IG51bGw7XG5sZXQgX21hc3RlckN2U3VwcHJlc3NSZWRvUmVzZXQgPSBmYWxzZTtcblxuZnVuY3Rpb24gX3NldE1hc3RlckNoYW5nZU5vdGljZShzZWN0aW9uLCBhY3Rpb24pIHtcbiAgY29uc3QgY2xlYW5TZWN0aW9uID0gU3RyaW5nKHNlY3Rpb24gfHwgJ01hc3RlciBDVicpLnRyaW0oKTtcbiAgY29uc3QgY2xlYW5BY3Rpb24gPSBTdHJpbmcoYWN0aW9uIHx8ICd1cGRhdGVkJykudHJpbSgpO1xuICBfbWFzdGVyQ2hhbmdlTm90aWNlID0gYCR7Y2xlYW5TZWN0aW9ufSAke2NsZWFuQWN0aW9ufS5gO1xufVxuXG5mdW5jdGlvbiBfcmVuZGVyTWFzdGVyQ2hhbmdlTm90aWNlKCkge1xuICBpZiAoIV9tYXN0ZXJDaGFuZ2VOb3RpY2UpIHJldHVybiAnJztcbiAgcmV0dXJuIGBcbiAgICA8ZGl2IHN0eWxlPVwibWFyZ2luOjEycHggMCAxOHB4O3BhZGRpbmc6MTBweCAxMnB4O2JvcmRlcjoxcHggc29saWQgI2JiZjdkMDtiYWNrZ3JvdW5kOiNmMGZkZjQ7Ym9yZGVyLXJhZGl1czo4cHg7Y29sb3I6IzE0NTMyZDtcIj5cbiAgICAgIDxzdHJvbmc+TGFzdCBzYXZlZCBjaGFuZ2U6PC9zdHJvbmc+ICR7ZXNjYXBlSHRtbChfbWFzdGVyQ2hhbmdlTm90aWNlKX1cbiAgICA8L2Rpdj5cbiAgYDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcG9wdWxhdGVNYXN0ZXJUYWIoY29udGFpbmVyID0gbnVsbCkge1xuICBpZiAoY29udGFpbmVyICE9PSBudWxsKSBfbWFzdGVyQ3ZBY3RpdmVDb250YWluZXIgPSBjb250YWluZXI7XG4gIGlmIChfbWFzdGVyQ3ZTdXBwcmVzc1JlZG9SZXNldCkge1xuICAgIF9tYXN0ZXJDdlN1cHByZXNzUmVkb1Jlc2V0ID0gZmFsc2U7XG4gIH0gZWxzZSB7XG4gICAgX21hc3RlckN2UmVkb0JhY2t1cCA9IG51bGw7XG4gIH1cbiAgY29uc3QgY29udGVudCA9IF9tYXN0ZXJDdkFjdGl2ZUNvbnRhaW5lciB8fCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9jdW1lbnQtY29udGVudCcpO1xuICBjb250ZW50LmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwiZW1wdHktc3RhdGVcIj48ZGl2IGNsYXNzPVwibG9hZGluZy1zcGlubmVyXCI+PC9kaXY+PHAgc3R5bGU9XCJtYXJnaW4tdG9wOjEycHg7Y29sb3I6IzY0NzQ4YjtcIj5Mb2FkaW5nIG1hc3RlciBDViBkYXRhXHUyMDI2PC9wPjwvZGl2Pic7XG5cbiAgbGV0IG92ZXJ2aWV3ID0ge307XG4gIGxldCBmdWxsRGF0YSAgPSB7fTtcblxuICB0cnkge1xuICAgIGNvbnN0IFtvdlJlcywgZmRSZXNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvb3ZlcnZpZXcnKSxcbiAgICAgIGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL2Z1bGwnKSxcbiAgICBdKTtcbiAgICBvdmVydmlldyA9IChhd2FpdCBvdlJlcy5qc29uKCkpIHx8IHt9O1xuICAgIGZ1bGxEYXRhICA9IChhd2FpdCBmZFJlcy5qc29uKCkpIHx8IHt9O1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjb250ZW50LmlubmVySFRNTCA9ICc8cCBzdHlsZT1cImNvbG9yOiNlZjQ0NDQ7cGFkZGluZzoyMHB4O1wiPkZhaWxlZCB0byBsb2FkIG1hc3RlciBDViBkYXRhLjwvcD4nO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHBlcnNvbmFsSW5mbyA9IGZ1bGxEYXRhLnBlcnNvbmFsX2luZm8gfHwge307XG4gIGNvbnN0IGV4cGVyaWVuY2VzICAgICA9IGZ1bGxEYXRhLmV4cGVyaWVuY2UgfHwgW107XG4gIHdpbmRvdy5fbWFzdGVyRXhwZXJpZW5jZU9wdGlvbnMgPSBleHBlcmllbmNlc1xuICAgIC5tYXAoKGV4cCkgPT4gKHtcbiAgICAgIGlkOiBleHAuaWQgfHwgJycsXG4gICAgICBsYWJlbDogYCR7ZXhwLnRpdGxlIHx8ICdSb2xlJ30gQCAke2V4cC5jb21wYW55IHx8ICdDb21wYW55J31gLFxuICAgIH0pKVxuICAgIC5maWx0ZXIoKHgpID0+IHguaWQpO1xuICAvLyBGdWxsIGV4cGVyaWVuY2Ugb2JqZWN0cyAoaW5jbHVkaW5nIGFjaGlldmVtZW50cyksIGtleWVkIGJ5IGlkLCBzb1xuICAvLyBlZGl0TWFzdGVyRXhwZXJpZW5jZSgpIGNhbiBsb29rIHVwIG5lc3RlZCBhY2hpZXZlbWVudHMgd2l0aG91dFxuICAvLyBlbWJlZGRpbmcgYXJiaXRyYXJ5IGFjaGlldmVtZW50IHRleHQgaW5zaWRlIGFuIGlubGluZSBvbmNsaWNrIGF0dHJpYnV0ZS5cbiAgd2luZG93Ll9tYXN0ZXJFeHBlcmllbmNlRnVsbERhdGEgPSBleHBlcmllbmNlcztcbiAgY29uc3Qgc2tpbGxzICAgICAgICAgID0gZnVsbERhdGEuc2tpbGxzIHx8IFtdO1xuICBjb25zdCBlZHVjYXRpb24gICAgICAgPSBmdWxsRGF0YS5lZHVjYXRpb24gfHwgW107XG4gIGNvbnN0IGF3YXJkcyAgICAgICAgICA9IGZ1bGxEYXRhLmF3YXJkcyB8fCBbXTtcbiAgY29uc3QgY2VydGlmaWNhdGlvbnMgID0gZnVsbERhdGEuY2VydGlmaWNhdGlvbnMgfHwgW107XG4gIGNvbnN0IGFjaGlldmVtZW50cyAgICA9IGZ1bGxEYXRhLnNlbGVjdGVkX2FjaGlldmVtZW50cyB8fCBbXTtcbiAgY29uc3Qgc3VtbWFyaWVzICAgICAgID0gZnVsbERhdGEucHJvZmVzc2lvbmFsX3N1bW1hcmllcyB8fCB7fTtcblxuICBjb25zdCBjdXJyZW50UGhhc2UgPSAodHlwZW9mIHN0YXRlTWFuYWdlciAhPT0gJ3VuZGVmaW5lZCcgJiYgc3RhdGVNYW5hZ2VyLmdldFBoYXNlKVxuICAgID8gc3RhdGVNYW5hZ2VyLmdldFBoYXNlKClcbiAgICA6IG51bGw7XG4gIGNvbnN0IEVESVRBQkxFX1BIQVNFUyA9IG5ldyBTZXQoWydpbml0JywgJ3JlZmluZW1lbnQnLCBudWxsLCB1bmRlZmluZWQsICcnXSk7XG4gIGNvbnN0IGlzRWRpdGFibGUgPSBFRElUQUJMRV9QSEFTRVMuaGFzKGN1cnJlbnRQaGFzZSk7XG5cbiAgY29uc3QgcGhhc2VMb2NrQmFubmVyID0gaXNFZGl0YWJsZSA/ICcnIDogYFxuICAgIDxkaXYgcm9sZT1cInN0YXR1c1wiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiXG4gICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6I2ZlZjJmMjtib3JkZXI6MXB4IHNvbGlkICNmY2E1YTU7Ym9yZGVyLXJhZGl1czo2cHg7XG4gICAgICAgICAgICAgICAgcGFkZGluZzoxMHB4IDE0cHg7bWFyZ2luLWJvdHRvbToxNnB4O2ZvbnQtc2l6ZTowLjg4ZW07Y29sb3I6Izk5MWIxYjtcIj5cbiAgICAgIDxzdHJvbmc+XHVEODNEXHVERDEyIFJlYWQtb25seSBcdTIwMTQgZWRpdGluZyBsb2NrZWQ8L3N0cm9uZz48YnI+XG4gICAgICBNYXN0ZXIgQ1YgZWRpdGluZyBpcyBvbmx5IGF2YWlsYWJsZSBiZWZvcmUgam9iIGFuYWx5c2lzIGJlZ2lucyBvciBkdXJpbmcgdGhlXG4gICAgICBSZWZpbmVtZW50IHN0YWdlLiBUaGUgY3VycmVudCBzdGFnZSBpcyA8c3Ryb25nPiR7ZXNjYXBlSHRtbChjdXJyZW50UGhhc2UgfHwgJ3Vua25vd24nKX08L3N0cm9uZz4uXG4gICAgICBTYXZlIG9yIGNvbXBsZXRlIHRoZSBjdXJyZW50IHN0YWdlIHRvIHJlLWVuYWJsZSBlZGl0aW5nLlxuICAgIDwvZGl2PmA7XG5cbiAgY29udGVudC5pbm5lckhUTUwgPSBgXG4gICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47ZmxleC13cmFwOndyYXA7Z2FwOjhweDttYXJnaW4tYm90dG9tOjRweDtcIj5cbiAgICAgIDxoMSBzdHlsZT1cIm1hcmdpbjowO1wiPlx1RDgzRFx1RENEQSBNYXN0ZXIgQ1YgUHJvZmlsZTwvaDE+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDo4cHg7ZmxleC13cmFwOndyYXA7XCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJtYXN0ZXItY3YtdW5kby1idG5cIiBjbGFzcz1cImFjdGlvbi1idG4gc2Vjb25kYXJ5XCIgb25jbGljaz1cInVuZG9NYXN0ZXJEYXRhQ2hhbmdlKClcIlxuICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlVuZG8gdGhlIG1vc3QgcmVjZW50IE1hc3RlciBDViBjaGFuZ2VcIiB0aXRsZT1cIlVuZG8gKEN0cmwrWilcIj5cbiAgICAgICAgICBcdTIxQTkgVW5kb1xuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cIm1hc3Rlci1jdi1yZWRvLWJ0blwiIGNsYXNzPVwiYWN0aW9uLWJ0biBzZWNvbmRhcnlcIiBvbmNsaWNrPVwicmVkb01hc3RlckRhdGFDaGFuZ2UoKVwiXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiUmVkbyB0aGUgcHJldmlvdXNseSB1bmRvbmUgTWFzdGVyIENWIGNoYW5nZVwiIHRpdGxlPVwiUmVkbyAoQ3RybCtTaGlmdCtaKVwiJHshX21hc3RlckN2UmVkb0JhY2t1cCA/ICcgZGlzYWJsZWQnIDogJyd9PlxuICAgICAgICAgIFx1MjFBQSBSZWRvXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBzZWNvbmRhcnlcIiBvbmNsaWNrPVwib3BlbkJhY2t1cEhpc3RvcnlNb2RhbCgpXCIgYXJpYS1sYWJlbD1cIlZpZXcgYmFja3VwIGhpc3RvcnlcIj5cbiAgICAgICAgICBcdUQ4M0RcdURENTAgQmFja3Vwc1xuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG4gc2Vjb25kYXJ5XCIgb25jbGljaz1cIm9wZW5GdWxsRGF0YVByZXZpZXdNb2RhbCgpXCIgYXJpYS1sYWJlbD1cIlByZXZpZXcgZnVsbCBtYXN0ZXIgQ1YgZGF0YVwiPlxuICAgICAgICAgIFx1RDgzRFx1REM0MSBQcmV2aWV3IEZ1bGwgRGF0YVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG4gc2Vjb25kYXJ5XCIgb25jbGljaz1cImV4cG9ydE1hc3RlckNWKClcIiBhcmlhLWxhYmVsPVwiRG93bmxvYWQgTWFzdGVyX0NWX0RhdGEuanNvblwiPlxuICAgICAgICAgIFx1MkIwN1x1RkUwRiBFeHBvcnQgSlNPTlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG4gc2Vjb25kYXJ5XCIgb25jbGljaz1cInRyaWdnZXJNYXN0ZXJDdkltcG9ydCgpXCIgYXJpYS1sYWJlbD1cIkltcG9ydCBhIGZ1bGwgTWFzdGVyX0NWX0RhdGEuanNvbiBmaWxlXCIke2lzRWRpdGFibGUgPyAnJyA6ICcgZGlzYWJsZWQnfT5cbiAgICAgICAgICBcdTJCMDZcdUZFMEYgSW1wb3J0IEpTT05cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIGlkPVwibWFzdGVyLWN2LWltcG9ydC1maWxlLWlucHV0XCIgYWNjZXB0PVwiYXBwbGljYXRpb24vanNvbiwuanNvblwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiXG4gICAgICAgICAgICBvbmNoYW5nZT1cImhhbmRsZU1hc3RlckN2SW1wb3J0RmlsZShldmVudClcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO21hcmdpbi1ib3R0b206MTJweDtcIj5cbiAgICAgIFRoaXMgaXMgeW91ciBwZXJzaXN0ZW50IG1hc3RlciBDViBwcm9maWxlLiBDaGFuZ2VzIGhlcmUgdXBkYXRlXG4gICAgICA8Y29kZT5NYXN0ZXJfQ1ZfRGF0YS5qc29uPC9jb2RlPiBkaXJlY3RseSBhbmQgcGVyc2lzdCBhY3Jvc3MgYWxsIHNlc3Npb25zLlxuICAgIDwvcD5cblxuICAgICR7cGhhc2VMb2NrQmFubmVyfVxuXG4gICAgPCEtLSBHb3Zlcm5hbmNlIGJhbm5lciAtLT5cbiAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLWdvdmVybmFuY2Utbm90ZVwiIHN0eWxlPVwiYmFja2dyb3VuZDojZmZmYmViO2JvcmRlcjoxcHggc29saWQgI2ZjZDM0ZDtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjEwcHggMTRweDttYXJnaW4tYm90dG9tOjE2cHg7Zm9udC1zaXplOjAuODhlbTtjb2xvcjojNzgzNTBmO1wiPlxuICAgICAgPHN0cm9uZz5cdTI2QTBcdUZFMEYgUGVyc2lzdGVudCBzdG9yYWdlIFx1MjAxNCB0aGlzIHRhYiBvbmx5Ojwvc3Ryb25nPiBFZGl0cyBtYWRlIGhlcmUgKHRoZSBzdHJ1Y3R1cmVkXG4gICAgICBlZGl0b3JzIGJlbG93LCBhbmQgXCJVcGRhdGUgdmlhIEFJXCIpIHdyaXRlIGRpcmVjdGx5IHRvIDxjb2RlPk1hc3Rlcl9DVl9EYXRhLmpzb248L2NvZGU+XG4gICAgICBpbW1lZGlhdGVseSBhbmQgcGVyc2lzdCBhY3Jvc3MgZXZlcnkgZnV0dXJlIGpvYiBhcHBsaWNhdGlvbi5cbiAgICAgIEpvYi1zcGVjaWZpYyBjaG9pY2VzIHlvdSBtYWtlIGVsc2V3aGVyZSBpbiB0aGUgYXBwIFx1MjAxNCB3aGljaCBza2lsbHMvZXhwZXJpZW5jZXMgdG8gZmVhdHVyZSxcbiAgICAgIHJld3JpdHRlbiBidWxsZXQgdGV4dCwgY292ZXItbGV0dGVyIHRvbmUgXHUyMDE0IGxpdmUgb25seSBpbiB0aGUgY3VycmVudCBzZXNzaW9uIGFuZCBhcmVcbiAgICAgIDxlbT5uZXZlcjwvZW0+IHdyaXR0ZW4gaGVyZSBhdXRvbWF0aWNhbGx5LiBUbyBjYXJyeSBhIHNlc3Npb24ncyBpbXByb3ZlbWVudHMgaW50byB5b3VyXG4gICAgICBwZXJtYW5lbnQgcHJvZmlsZSwgdXNlIFwiXHVEODNEXHVEQ0U1IFVwZGF0ZSBNYXN0ZXIgQ1YgRGF0YVwiIG9uIHRoZSBGaW5hbGlzZSBzdGVwLlxuICAgIDwvZGl2PlxuXG4gICAgJHtpc0VkaXRhYmxlID8gcmVuZGVyTWFzdGVyRGF0YUFpVXBkYXRlUGFuZWwoKSA6IHJlbmRlck1hc3RlckRhdGFBaVVwZGF0ZURpc2FibGVkTm90ZSgpfVxuXG4gICAgJHtfcmVuZGVyTWFzdGVyQ2hhbmdlTm90aWNlKCl9XG5cbiAgICA8IS0tIFByb2ZpbGUgb3ZlcnZpZXcgY2FyZCAtLT5cbiAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXByb2ZpbGUtY2FyZFwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1wcm9maWxlLW5hbWVcIj4ke2VzY2FwZUh0bWwob3ZlcnZpZXcubmFtZSB8fCAnWW91ciBQcm9maWxlJyl9PC9kaXY+XG4gICAgICAke292ZXJ2aWV3LmhlYWRsaW5lID8gYDxkaXYgY2xhc3M9XCJtYXN0ZXItcHJvZmlsZS1oZWFkbGluZVwiPiR7ZXNjYXBlSHRtbChvdmVydmlldy5oZWFkbGluZSl9PC9kaXY+YCA6ICcnfVxuICAgICAgJHtvdmVydmlldy5lbWFpbCAgICA/IGA8ZGl2IGNsYXNzPVwibWFzdGVyLXByb2ZpbGUtZW1haWxcIj5cdTI3MDlcdUZFMEYgJHtlc2NhcGVIdG1sKG92ZXJ2aWV3LmVtYWlsKX08L2Rpdj5gIDogJyd9XG4gICAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXN0YXRzXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc3RhdFwiPjxzcGFuIGNsYXNzPVwibWFzdGVyLXN0YXQtdmFsdWVcIj4ke292ZXJ2aWV3LmV4cGVyaWVuY2VfY291bnQgPz8gJ1x1MjAxNCd9PC9zcGFuPjxzcGFuIGNsYXNzPVwibWFzdGVyLXN0YXQtbGFiZWxcIj5FeHBlcmllbmNlczwvc3Bhbj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1zdGF0XCI+PHNwYW4gY2xhc3M9XCJtYXN0ZXItc3RhdC12YWx1ZVwiPiR7b3ZlcnZpZXcuc2tpbGxfY291bnQgPz8gJ1x1MjAxNCd9PC9zcGFuPjxzcGFuIGNsYXNzPVwibWFzdGVyLXN0YXQtbGFiZWxcIj5Ta2lsbHM8L3NwYW4+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc3RhdFwiPjxzcGFuIGNsYXNzPVwibWFzdGVyLXN0YXQtdmFsdWVcIj4ke292ZXJ2aWV3LmFjaGlldmVtZW50X2NvdW50ID8/ICdcdTIwMTQnfTwvc3Bhbj48c3BhbiBjbGFzcz1cIm1hc3Rlci1zdGF0LWxhYmVsXCI+QWNoaWV2ZW1lbnRzPC9zcGFuPjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXN0YXRcIj48c3BhbiBjbGFzcz1cIm1hc3Rlci1zdGF0LXZhbHVlXCI+JHtvdmVydmlldy5zdW1tYXJ5X2NvdW50ID8/ICdcdTIwMTQnfTwvc3Bhbj48c3BhbiBjbGFzcz1cIm1hc3Rlci1zdGF0LWxhYmVsXCI+U3VtbWFyaWVzPC9zcGFuPjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXN0YXRcIj48c3BhbiBjbGFzcz1cIm1hc3Rlci1zdGF0LXZhbHVlXCI+JHtvdmVydmlldy5lZHVjYXRpb25fY291bnQgPz8gJ1x1MjAxNCd9PC9zcGFuPjxzcGFuIGNsYXNzPVwibWFzdGVyLXN0YXQtbGFiZWxcIj5FZHVjYXRpb248L3NwYW4+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc3RhdFwiPjxzcGFuIGNsYXNzPVwibWFzdGVyLXN0YXQtdmFsdWVcIj4ke292ZXJ2aWV3LnB1YmxpY2F0aW9uX2NvdW50ID8/ICdcdTIwMTQnfTwvc3Bhbj48c3BhbiBjbGFzcz1cIm1hc3Rlci1zdGF0LWxhYmVsXCI+UHVibGljYXRpb25zPC9zcGFuPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFBlcnNvbmFsIEluZm8gc2VjdGlvbiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXNlY3Rpb25cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc2VjdGlvbi1oZWFkZXJcIj5cbiAgICAgICAgPGgyPlx1RDgzRFx1REM2NCBQZXJzb25hbCBJbmZvcm1hdGlvbjwvaDI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgb25jbGljaz1cInNob3dFZGl0UGVyc29uYWxJbmZvTW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJFZGl0IHBlcnNvbmFsIGluZm9ybWF0aW9uXCI+XG4gICAgICAgICAgXHUyNzBGXHVGRTBGIEVkaXRcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgaWQ9XCJtYXN0ZXItcGVyc29uYWwtaW5mby1jb250YWluZXJcIj5cbiAgICAgICAgJHtfcmVuZGVyUGVyc29uYWxJbmZvQ2FyZChwZXJzb25hbEluZm8pfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEV4cGVyaWVuY2VzIHNlY3Rpb24gLS0+XG4gICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1zZWN0aW9uXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXNlY3Rpb24taGVhZGVyXCI+XG4gICAgICAgIDxoMj5cdUQ4M0RcdURDQkMgV29yayBFeHBlcmllbmNlPC9oMj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwic2hvd0FkZEV4cGVyaWVuY2VNb2RhbCgpXCIgYXJpYS1sYWJlbD1cIkFkZCBuZXcgd29yayBleHBlcmllbmNlXCI+XG4gICAgICAgICAgKyBBZGQgRXhwZXJpZW5jZVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBpZD1cIm1hc3Rlci1leHBlcmllbmNlcy1jb250YWluZXJcIj5cbiAgICAgICAgJHtfcmVuZGVyRXhwZXJpZW5jZXNMaXN0KGV4cGVyaWVuY2VzKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBTa2lsbHMgc2VjdGlvbiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXNlY3Rpb25cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc2VjdGlvbi1oZWFkZXJcIj5cbiAgICAgICAgPGgyPlx1RDgzRFx1REVFMFx1RkUwRiBTa2lsbHM8L2gyPlxuICAgICAgICAke0FycmF5LmlzQXJyYXkoc2tpbGxzKSA/IGA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0blwiIG9uY2xpY2s9XCJzaG93QWRkU2tpbGxNb2RhbCgnJywgdHJ1ZSlcIiBhcmlhLWxhYmVsPVwiQWRkIG5ldyBza2lsbFwiPisgQWRkIFNraWxsPC9idXR0b24+YCA6ICcnfVxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGlkPVwibWFzdGVyLXNraWxscy1jb250YWluZXJcIj5cbiAgICAgICAgJHtfcmVuZGVyU2tpbGxzU2VjdGlvbihza2lsbHMpfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEVkdWNhdGlvbiBzZWN0aW9uIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc2VjdGlvblwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1zZWN0aW9uLWhlYWRlclwiPlxuICAgICAgICA8aDI+XHVEODNDXHVERjkzIEVkdWNhdGlvbjwvaDI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgb25jbGljaz1cInNob3dBZGRFZHVjYXRpb25Nb2RhbCgpXCIgYXJpYS1sYWJlbD1cIkFkZCBlZHVjYXRpb24gZW50cnlcIj5cbiAgICAgICAgICArIEFkZCBFZHVjYXRpb25cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgaWQ9XCJtYXN0ZXItZWR1Y2F0aW9uLWNvbnRhaW5lclwiPlxuICAgICAgICAke19yZW5kZXJFZHVjYXRpb25MaXN0KGVkdWNhdGlvbil9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gUHVibGljYXRpb25zIHNlY3Rpb24gLS0+XG4gICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1zZWN0aW9uXCIgaWQ9XCJtYXN0ZXItcHVibGljYXRpb25zLXNlY3Rpb25cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc2VjdGlvbi1oZWFkZXJcIj5cbiAgICAgICAgPGgyPlx1RDgzRFx1RENENiBQdWJsaWNhdGlvbnM8L2gyPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6OHB4O1wiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHNlY29uZGFyeVwiIGlkPVwibWFzdGVyLXB1Yi1pbXBvcnQtYnRuXCJcbiAgICAgICAgICAgICAgb25jbGljaz1cInNob3dJbXBvcnRQdWJsaWNhdGlvbnNNb2RhbCgpXCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkltcG9ydCBCaWJUZVggcHVibGljYXRpb25zXCI+XG4gICAgICAgICAgICBcdTJCMDZcdUZFMEYgSW1wb3J0IEJpYlRlWFxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHNlY29uZGFyeVwiIGlkPVwibWFzdGVyLXB1Yi1jb252ZXJ0LWJ0blwiXG4gICAgICAgICAgICAgIG9uY2xpY2s9XCJzaG93Q29udmVydFB1YmxpY2F0aW9uc01vZGFsKClcIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiQ29udmVydCBjaXRhdGlvbiB0ZXh0IHRvIEJpYlRlWFwiPlxuICAgICAgICAgICAgXHVEODNFXHVERTg0IENvbnZlcnQgVGV4dFxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHNlY29uZGFyeVwiIGlkPVwibWFzdGVyLXB1Yi10b2dnbGUtYnRuXCJcbiAgICAgICAgICAgICAgb25jbGljaz1cInRvZ2dsZVB1YmxpY2F0aW9uc1ZpZXcoKVwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJUb2dnbGUgYmV0d2VlbiBzdHJ1Y3R1cmVkIENSVUQgdmlldyBhbmQgcmF3IEJpYlRlWCBlZGl0b3JcIj5cbiAgICAgICAgICAgIFx1MjcwRlx1RkUwRiBSYXcgQmliVGVYXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBpZD1cIm1hc3Rlci1wdWItYWRkLWJ0blwiXG4gICAgICAgICAgICAgIG9uY2xpY2s9XCJzaG93QWRkUHVibGljYXRpb25Nb2RhbCgpXCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkFkZCBwdWJsaWNhdGlvblwiPlxuICAgICAgICAgICAgKyBBZGQgUHVibGljYXRpb25cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDwhLS0gQ1JVRCBzdHJ1Y3R1cmVkIHZpZXcgKGRlZmF1bHQpIC0tPlxuICAgICAgPGRpdiBpZD1cIm1hc3Rlci1wdWItY3J1ZC12aWV3XCI+XG4gICAgICAgIDxkaXYgaWQ9XCJtYXN0ZXItcHViLWNydWQtY29udGFpbmVyXCI+XG4gICAgICAgICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO3BhZGRpbmc6MTJweCAwO1wiPkxvYWRpbmcgcHVibGljYXRpb25zXHUyMDI2PC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPCEtLSBSYXcgQmliVGVYIGVkaXRvciAoaGlkZGVuIGJ5IGRlZmF1bHQpIC0tPlxuICAgICAgPGRpdiBpZD1cIm1hc3Rlci1wdWItcmF3LXZpZXdcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj5cbiAgICAgICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO2ZvbnQtc2l6ZTowLjllbTttYXJnaW4tYm90dG9tOjEwcHg7XCI+XG4gICAgICAgICAgRWRpdCB5b3VyIEJpYlRlWCBiaWJsaW9ncmFwaHkgZmlsZSBkaXJlY3RseS4gQ2hhbmdlcyBhcmUgc2F2ZWQgdG9cbiAgICAgICAgICA8Y29kZT5wdWJsaWNhdGlvbnMuYmliPC9jb2RlPiBhbmQgYSB0aW1lc3RhbXBlZCBiYWNrdXAgaXMgY3JlYXRlZFxuICAgICAgICAgIGF1dG9tYXRpY2FsbHkuIENvbnRlbnQgaXMgdmFsaWRhdGVkIGJlZm9yZSB3cml0aW5nLlxuICAgICAgICA8L3A+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDo4cHg7bWFyZ2luLWJvdHRvbTo4cHg7XCI+XG4gICAgICAgICAgPHNwYW4gaWQ9XCJtYXN0ZXItcHViLWNvdW50XCIgc3R5bGU9XCJjb2xvcjojNmI3MjgwO2ZvbnQtc2l6ZTowLjllbTtcIj48L3NwYW4+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJmbGV4OjE7XCI+PC9zcGFuPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHNlY29uZGFyeVwiIG9uY2xpY2s9XCJ2YWxpZGF0ZVB1YmxpY2F0aW9uc0JpYigpXCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlZhbGlkYXRlIEJpYlRlWCB3aXRob3V0IHNhdmluZ1wiPlx1RDgzRFx1REQwRCBWYWxpZGF0ZTwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHNlY29uZGFyeVwiIG9uY2xpY2s9XCJsb2FkUHVibGljYXRpb25zQmliKClcIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiUmVsb2FkIHB1YmxpY2F0aW9ucy5iaWIgZnJvbSBkaXNrXCI+XHVEODNEXHVERDA0IFJlbG9hZDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHByaW1hcnlcIiBpZD1cIm1hc3Rlci1wdWItc2F2ZS1idG5cIlxuICAgICAgICAgICAgICBvbmNsaWNrPVwic2F2ZVB1YmxpY2F0aW9uc0JpYigpXCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlNhdmUgQmliVGVYIHRvIGRpc2tcIj5cdUQ4M0RcdURDQkUgU2F2ZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHRleHRhcmVhIGlkPVwibWFzdGVyLXB1Yi10ZXh0YXJlYVwiXG4gICAgICAgICAgY2xhc3M9XCJlZGl0LWlucHV0XCJcbiAgICAgICAgICByb3dzPVwiMjBcIlxuICAgICAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTtmb250LWZhbWlseTptb25vc3BhY2U7Zm9udC1zaXplOjAuODVlbTtyZXNpemU6dmVydGljYWw7XCJcbiAgICAgICAgICBwbGFjZWhvbGRlcj1cIkxvYWRpbmdcdTIwMjZcIlxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJCaWJUZVggYmlibGlvZ3JhcGh5IGNvbnRlbnRcIlxuICAgICAgICAgIHNwZWxsY2hlY2s9XCJmYWxzZVwiXG4gICAgICAgID48L3RleHRhcmVhPlxuICAgICAgICA8ZGl2IGlkPVwibWFzdGVyLXB1Yi1zdGF0dXNcIlxuICAgICAgICAgICAgc3R5bGU9XCJtYXJnaW4tdG9wOjZweDtmb250LXNpemU6MC44NWVtO2NvbG9yOiM2YjcyODA7XCJcbiAgICAgICAgICAgIGFyaWEtbGl2ZT1cInBvbGl0ZVwiPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEF3YXJkcyBzZWN0aW9uIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc2VjdGlvblwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1zZWN0aW9uLWhlYWRlclwiPlxuICAgICAgICA8aDI+XHVEODNDXHVERkM1IEF3YXJkcyAmYW1wOyBIb25vdXJzPC9oMj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwic2hvd0FkZEF3YXJkTW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJBZGQgYXdhcmRcIj5cbiAgICAgICAgICArIEFkZCBBd2FyZFxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBpZD1cIm1hc3Rlci1hd2FyZHMtY29udGFpbmVyXCI+XG4gICAgICAgICR7X3JlbmRlckF3YXJkc0xpc3QoYXdhcmRzKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBDZXJ0aWZpY2F0aW9ucyBzZWN0aW9uIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc2VjdGlvblwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1zZWN0aW9uLWhlYWRlclwiPlxuICAgICAgICA8aDI+XHVEODNDXHVERjkzIENlcnRpZmljYXRpb25zPC9oMj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwic2hvd0FkZENlcnRpZmljYXRpb25Nb2RhbCgpXCIgYXJpYS1sYWJlbD1cIkFkZCBjZXJ0aWZpY2F0aW9uXCI+XG4gICAgICAgICAgKyBBZGQgQ2VydGlmaWNhdGlvblxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBpZD1cIm1hc3Rlci1jZXJ0aWZpY2F0aW9ucy1jb250YWluZXJcIj5cbiAgICAgICAgJHtfcmVuZGVyQ2VydGlmaWNhdGlvbnNMaXN0KGNlcnRpZmljYXRpb25zKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBTZWxlY3RlZCBBY2hpZXZlbWVudHMgc2VjdGlvbiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXNlY3Rpb25cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc2VjdGlvbi1oZWFkZXJcIj5cbiAgICAgICAgPGgyPlx1RDgzQ1x1REZDNiBTZWxlY3RlZCBBY2hpZXZlbWVudHM8L2gyPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0blwiIG9uY2xpY2s9XCJzaG93QWRkQWNoaWV2ZW1lbnRNb2RhbCgpXCIgYXJpYS1sYWJlbD1cIkFkZCBuZXcgYWNoaWV2ZW1lbnQgdG8gbWFzdGVyIENWXCI+XG4gICAgICAgICAgKyBBZGQgQWNoaWV2ZW1lbnRcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtmb250LXNpemU6MC45ZW07bWFyZ2luLWJvdHRvbToxMnB4O1wiPlxuICAgICAgICBUaGVzZSBhcmUgY3Jvc3Mtcm9sZSBoaWdobGlnaHRzIHNob3duIGluIHRoZSBBY2hpZXZlbWVudHMgcmV2aWV3IGR1cmluZyBjdXN0b21pc2F0aW9uLlxuICAgICAgICBUaGUgSGFydmVzdCBmZWF0dXJlIChIYXJ2ZXN0IHRhYikgY2FuIGFkZCBuZXcgb25lcyBmcm9tIHlvdXIgY3VycmVudCBzZXNzaW9uLlxuICAgICAgPC9wPlxuICAgICAgPGRpdiBpZD1cIm1hc3Rlci1hY2hpZXZlbWVudHMtY29udGFpbmVyXCI+XG4gICAgICAgICR7X3JlbmRlck1hc3RlckFjaGlldmVtZW50c1RhYmxlKGFjaGlldmVtZW50cyl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gUHJvZmVzc2lvbmFsIFN1bW1hcmllcyBzZWN0aW9uIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc2VjdGlvblwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1zZWN0aW9uLWhlYWRlclwiPlxuICAgICAgICA8aDI+XHVEODNEXHVEQ0REIFByb2Zlc3Npb25hbCBTdW1tYXJpZXM8L2gyPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0blwiIG9uY2xpY2s9XCJzaG93QWRkU3VtbWFyeU1vZGFsKClcIiBhcmlhLWxhYmVsPVwiQWRkIG5ldyBwcm9mZXNzaW9uYWwgc3VtbWFyeSB2YXJpYW50XCI+XG4gICAgICAgICAgKyBBZGQgU3VtbWFyeVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO2ZvbnQtc2l6ZTowLjllbTttYXJnaW4tYm90dG9tOjEycHg7XCI+XG4gICAgICAgIE5hbWVkIHN1bW1hcnkgdmFyaWFudHMgbGV0IHlvdSB0YWlsb3IgeW91ciBwcm9mZXNzaW9uYWwgc3RhdGVtZW50IGZvciBkaWZmZXJlbnQgcm9sZSB0eXBlc1xuICAgICAgICB3aXRob3V0IHJlZ2VuZXJhdGluZyBmcm9tIHNjcmF0Y2guIFRoZSBBSSB3aWxsIHJlY29tbWVuZCB0aGUgbW9zdCByZWxldmFudCB2YXJpYW50XG4gICAgICAgIGR1cmluZyB0aGUgU3VtbWFyeSBGb2N1cyBzdGVwLlxuICAgICAgPC9wPlxuICAgICAgPGRpdiBpZD1cIm1hc3Rlci1zdW1tYXJpZXMtY29udGFpbmVyXCI+XG4gICAgICAgICR7X3JlbmRlclN1bW1hcmllc0xpc3Qoc3VtbWFyaWVzKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBQdWJsaWNhdGlvbiBhZGQvZWRpdCBtb2RhbCAtLT5cbiAgICA8ZGl2IGlkPVwibWFzdGVyLXB1Yi1tb2RhbC1vdmVybGF5XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCIgcm9sZT1cImRpYWxvZ1wiIGFyaWEtbW9kYWw9XCJ0cnVlXCJcbiAgICAgICAgYXJpYS1sYWJlbGxlZGJ5PVwibWFzdGVyLXB1Yi1tb2RhbC10aXRsZVwiIGNsYXNzPVwibW9kYWwtb3ZlcmxheVwiXG4gICAgICAgIG9uY2xpY2s9XCJpZihldmVudC50YXJnZXQ9PT10aGlzKWNsb3NlUHVibGljYXRpb25Nb2RhbCgpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWxcIiBzdHlsZT1cIm1heC13aWR0aDo1ODBweDtcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuICAgICAgICAgIDxoMiBpZD1cIm1hc3Rlci1wdWItbW9kYWwtdGl0bGUtaGVhZGluZ1wiIGlkPVwicHViLW1vZGFsLXRpdGxlLWhlYWRpbmdcIj5BZGQgUHVibGljYXRpb248L2gyPlxuICAgICAgICAgIDxidXR0b24gb25jbGljaz1cImNsb3NlUHVibGljYXRpb25Nb2RhbCgpXCIgYXJpYS1sYWJlbD1cIkNsb3NlIHB1YmxpY2F0aW9uIGVkaXRvclwiXG4gICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDpub25lO2JvcmRlcjpub25lO2ZvbnQtc2l6ZToxLjRlbTtjdXJzb3I6cG9pbnRlcjtjb2xvcjojNjQ3NDhiO1wiPiZ0aW1lczs8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCIgc3R5bGU9XCJwYWRkaW5nOjIwcHg7XCI+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTJweDtcIj5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwdWItbW9kYWwta2V5XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5DaXRlIEtleSA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4qPC9zcGFuPjwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInB1Yi1tb2RhbC1rZXlcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgYXJpYS1yZXF1aXJlZD1cInRydWVcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBzbWl0aDIwMjRtbFwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTJweDtcIj5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwdWItbW9kYWwtdHlwZVwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+RW50cnkgVHlwZSA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4qPC9zcGFuPjwvbGFiZWw+XG4gICAgICAgICAgICA8c2VsZWN0IGlkPVwicHViLW1vZGFsLXR5cGVcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCI+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJhcnRpY2xlXCI+YXJ0aWNsZTwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiaW5wcm9jZWVkaW5nc1wiPmlucHJvY2VlZGluZ3M8L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImJvb2tcIj5ib29rPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJpbmNvbGxlY3Rpb25cIj5pbmNvbGxlY3Rpb248L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInRlY2hyZXBvcnRcIj50ZWNocmVwb3J0PC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJwaGR0aGVzaXNcIj5waGR0aGVzaXM8L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIm1hc3RlcnN0aGVzaXNcIj5tYXN0ZXJzdGhlc2lzPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJtaXNjXCI+bWlzYzwvb3B0aW9uPlxuICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTJweDtcIj5cbiAgICAgICAgICAgIDxsYWJlbCBpZD1cInB1Yi1tb2RhbC1hdXRob3ItbGFiZWxcIiBmb3I9XCJwdWItbW9kYWwtYXV0aG9yXCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5BdXRob3IocykgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+Kjwvc3Bhbj48L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJwdWItbW9kYWwtYXV0aG9yXCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJMYXN0LCBGaXJzdCBhbmQgTGFzdDIsIEZpcnN0MlwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTJweDtcIj5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwdWItbW9kYWwtdGl0bGVcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPlRpdGxlIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPio8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwicHViLW1vZGFsLXRpdGxlXCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiIGFyaWEtcmVxdWlyZWQ9XCJ0cnVlXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDoxMnB4O21hcmdpbi1ib3R0b206MTJweDtcIj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmbGV4OjAgMCAxMDBweDtcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInB1Yi1tb2RhbC15ZWFyXCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5ZZWFyIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPio8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cInB1Yi1tb2RhbC15ZWFyXCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDBweDtcIlxuICAgICAgICAgICAgICAgICAgbWluPVwiMTkwMFwiIG1heD1cIjIxMDBcIiBhcmlhLXJlcXVpcmVkPVwidHJ1ZVwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmbGV4OjE7XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwdWItbW9kYWwtam91cm5hbFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+Sm91cm5hbCAvIEJvb2t0aXRsZTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwicHViLW1vZGFsLWpvdXJuYWxcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjEycHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwicHViLW1vZGFsLWRvaVwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+RE9JIC8gVVJMPC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwicHViLW1vZGFsLWRvaVwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiMTAueHh4eC94eHh4eFwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206NHB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cInB1Yi1tb2RhbC1leHRyYVwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+RXh0cmEgZmllbGRzIDxzcGFuIHN0eWxlPVwiZm9udC13ZWlnaHQ6NDAwO2NvbG9yOiM2YjcyODA7XCI+KGtleT12YWx1ZSwgb25lIHBlciBsaW5lKTwvc3Bhbj48L2xhYmVsPlxuICAgICAgICAgICAgPHRleHRhcmVhIGlkPVwicHViLW1vZGFsLWV4dHJhXCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgcm93cz1cIjNcIiBzdHlsZT1cIndpZHRoOjEwMCU7cmVzaXplOnZlcnRpY2FsO2ZvbnQtZmFtaWx5Om1vbm9zcGFjZTtmb250LXNpemU6MC44NWVtO1wiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ2b2x1bWU9MTImIzEwO3BhZ2VzPTEtLTIwXCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIiBzdHlsZT1cImRpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmQ7Z2FwOjhweDtwYWRkaW5nOjE2cHggMjBweDtcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0blwiIG9uY2xpY2s9XCJjbG9zZVB1YmxpY2F0aW9uTW9kYWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHByaW1hcnlcIiBvbmNsaWNrPVwic2F2ZU1hc3RlclB1YmxpY2F0aW9uKClcIj5TYXZlPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGlkPVwibWFzdGVyLXB1Yi1pbXBvcnQtbW9kYWwtb3ZlcmxheVwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLW1vZGFsPVwidHJ1ZVwiXG4gICAgICAgIGFyaWEtbGFiZWxsZWRieT1cIm1hc3Rlci1wdWItaW1wb3J0LW1vZGFsLXRpdGxlXCIgY2xhc3M9XCJtb2RhbC1vdmVybGF5XCJcbiAgICAgICAgb25jbGljaz1cImlmKGV2ZW50LnRhcmdldD09PXRoaXMpY2xvc2VJbXBvcnRQdWJsaWNhdGlvbnNNb2RhbCgpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWxcIiBzdHlsZT1cIm1heC13aWR0aDo2ODBweDtcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuICAgICAgICAgIDxoMiBpZD1cIm1hc3Rlci1wdWItaW1wb3J0LW1vZGFsLXRpdGxlXCI+SW1wb3J0IEJpYlRlWCBQdWJsaWNhdGlvbnM8L2gyPlxuICAgICAgICAgIDxidXR0b24gb25jbGljaz1cImNsb3NlSW1wb3J0UHVibGljYXRpb25zTW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJDbG9zZSBCaWJUZVggaW1wb3J0IGRpYWxvZ1wiXG4gICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDpub25lO2JvcmRlcjpub25lO2ZvbnQtc2l6ZToxLjRlbTtjdXJzb3I6cG9pbnRlcjtjb2xvcjojNjQ3NDhiO1wiPiZ0aW1lczs8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCIgc3R5bGU9XCJwYWRkaW5nOjIwcHg7XCI+XG4gICAgICAgICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO2ZvbnQtc2l6ZTowLjllbTttYXJnaW46MCAwIDEycHg7XCI+XG4gICAgICAgICAgICBQYXN0ZSBvbmUgb3IgbW9yZSBCaWJUZVggZW50cmllcyB0byBtZXJnZSB0aGVtIGludG8gPGNvZGU+cHVibGljYXRpb25zLmJpYjwvY29kZT4uXG4gICAgICAgICAgPC9wPlxuICAgICAgICAgIDx0ZXh0YXJlYSBpZD1cIm1hc3Rlci1wdWItaW1wb3J0LXRleHRhcmVhXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJlZGl0LWlucHV0XCJcbiAgICAgICAgICAgICAgcm93cz1cIjEyXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDoxMDAlO2ZvbnQtZmFtaWx5Om1vbm9zcGFjZTtmb250LXNpemU6MC44NWVtO3Jlc2l6ZTp2ZXJ0aWNhbDtcIlxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkBhcnRpY2xle3NtaXRoMjAyNSwuLi59XCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkJpYlRlWCBpbXBvcnQgY29udGVudFwiXG4gICAgICAgICAgICAgIHNwZWxsY2hlY2s9XCJmYWxzZVwiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgPGxhYmVsIHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6OHB4O21hcmdpbi10b3A6MTJweDtjb2xvcjojMzM0MTU1O1wiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwibWFzdGVyLXB1Yi1pbXBvcnQtb3ZlcndyaXRlXCIgLz5cbiAgICAgICAgICAgIE92ZXJ3cml0ZSBleGlzdGluZyBlbnRyaWVzIHdoZW4gY2l0ZSBrZXlzIGFscmVhZHkgZXhpc3RcbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxkaXYgaWQ9XCJtYXN0ZXItcHViLWltcG9ydC1zdGF0dXNcIlxuICAgICAgICAgICAgICBzdHlsZT1cIm1hcmdpbi10b3A6MTBweDtmb250LXNpemU6MC44NWVtO2NvbG9yOiM2YjcyODA7XCJcbiAgICAgICAgICAgICAgYXJpYS1saXZlPVwicG9saXRlXCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCIgc3R5bGU9XCJkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kO2dhcDo4cHg7cGFkZGluZzoxNnB4IDIwcHg7XCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwiY2xvc2VJbXBvcnRQdWJsaWNhdGlvbnNNb2RhbCgpXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG4gcHJpbWFyeVwiIGlkPVwibWFzdGVyLXB1Yi1pbXBvcnQtc3VibWl0LWJ0blwiXG4gICAgICAgICAgICAgIG9uY2xpY2s9XCJpbXBvcnRQdWJsaWNhdGlvbnNCaWIoKVwiPkltcG9ydDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBpZD1cIm1hc3Rlci1wdWItY29udmVydC1tb2RhbC1vdmVybGF5XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCIgcm9sZT1cImRpYWxvZ1wiIGFyaWEtbW9kYWw9XCJ0cnVlXCJcbiAgICAgICAgYXJpYS1sYWJlbGxlZGJ5PVwibWFzdGVyLXB1Yi1jb252ZXJ0LW1vZGFsLXRpdGxlXCIgY2xhc3M9XCJtb2RhbC1vdmVybGF5XCJcbiAgICAgICAgb25jbGljaz1cImlmKGV2ZW50LnRhcmdldD09PXRoaXMpY2xvc2VDb252ZXJ0UHVibGljYXRpb25zTW9kYWwoKVwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsXCIgc3R5bGU9XCJtYXgtd2lkdGg6NzYwcHg7XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cbiAgICAgICAgICA8aDIgaWQ9XCJtYXN0ZXItcHViLWNvbnZlcnQtbW9kYWwtdGl0bGVcIj5Db252ZXJ0IENpdGF0aW9uIFRleHQgdG8gQmliVGVYPC9oMj5cbiAgICAgICAgICA8YnV0dG9uIG9uY2xpY2s9XCJjbG9zZUNvbnZlcnRQdWJsaWNhdGlvbnNNb2RhbCgpXCIgYXJpYS1sYWJlbD1cIkNsb3NlIGNpdGF0aW9uIGNvbnZlcnNpb24gZGlhbG9nXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOm5vbmU7Zm9udC1zaXplOjEuNGVtO2N1cnNvcjpwb2ludGVyO2NvbG9yOiM2NDc0OGI7XCI+JnRpbWVzOzwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIiBzdHlsZT1cInBhZGRpbmc6MjBweDtcIj5cbiAgICAgICAgICA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7Zm9udC1zaXplOjAuOWVtO21hcmdpbjowIDAgMTJweDtcIj5cbiAgICAgICAgICAgIFBhc3RlIGZyZWUtZm9ybSBjaXRhdGlvbiB0ZXh0LCByZXZpZXcgdGhlIGdlbmVyYXRlZCBCaWJUZVgsIHRoZW4gaW1wb3J0IGl0IHdoZW4gaXQgbG9va3MgY29ycmVjdC5cbiAgICAgICAgICA8L3A+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6MWZyO2dhcDoxNHB4O1wiPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cIm1hc3Rlci1wdWItY29udmVydC1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+Q2l0YXRpb24gVGV4dDwvbGFiZWw+XG4gICAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD1cIm1hc3Rlci1wdWItY29udmVydC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImVkaXQtaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgcm93cz1cIjdcIlxuICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDoxMDAlO3Jlc2l6ZTp2ZXJ0aWNhbDtcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJEb2UsIEouICgyMDI1KS4gQXJ0aWNsZSB0aXRsZS4gSm91cm5hbCBOYW1lLCAxMigzKSwgMS0xMC5cIlxuICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkNpdGF0aW9uIHRleHQgdG8gY29udmVydFwiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJtYXN0ZXItcHViLWNvbnZlcnQtb3V0cHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5HZW5lcmF0ZWQgQmliVGVYIFByZXZpZXc8L2xhYmVsPlxuICAgICAgICAgICAgICA8dGV4dGFyZWEgaWQ9XCJtYXN0ZXItcHViLWNvbnZlcnQtb3V0cHV0XCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZWRpdC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICByb3dzPVwiMTBcIlxuICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDoxMDAlO2ZvbnQtZmFtaWx5Om1vbm9zcGFjZTtmb250LXNpemU6MC44NWVtO3Jlc2l6ZTp2ZXJ0aWNhbDtcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJDb252ZXJ0ZWQgQmliVGVYIHdpbGwgYXBwZWFyIGhlcmVcIlxuICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkdlbmVyYXRlZCBCaWJUZVggcHJldmlld1wiXG4gICAgICAgICAgICAgICAgICBzcGVsbGNoZWNrPVwiZmFsc2VcIj48L3RleHRhcmVhPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGxhYmVsIHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6OHB4O21hcmdpbi10b3A6MTJweDtjb2xvcjojMzM0MTU1O1wiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwibWFzdGVyLXB1Yi1jb252ZXJ0LW92ZXJ3cml0ZVwiIC8+XG4gICAgICAgICAgICBPdmVyd3JpdGUgZXhpc3RpbmcgZW50cmllcyB3aGVuIGltcG9ydGluZyB0aGUgZ2VuZXJhdGVkIEJpYlRlWFxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGRpdiBpZD1cIm1hc3Rlci1wdWItY29udmVydC1zdGF0dXNcIlxuICAgICAgICAgICAgICBzdHlsZT1cIm1hcmdpbi10b3A6MTBweDtmb250LXNpemU6MC44NWVtO2NvbG9yOiM2YjcyODA7XCJcbiAgICAgICAgICAgICAgYXJpYS1saXZlPVwicG9saXRlXCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCIgc3R5bGU9XCJkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kO2dhcDo4cHg7cGFkZGluZzoxNnB4IDIwcHg7XCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwiY2xvc2VDb252ZXJ0UHVibGljYXRpb25zTW9kYWwoKVwiPkNsb3NlPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG4gc2Vjb25kYXJ5XCIgaWQ9XCJtYXN0ZXItcHViLWNvbnZlcnQtc3VibWl0LWJ0blwiXG4gICAgICAgICAgICAgIG9uY2xpY2s9XCJjb252ZXJ0UHVibGljYXRpb25UZXh0KClcIj5HZW5lcmF0ZSBCaWJUZVg8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBwcmltYXJ5XCIgaWQ9XCJtYXN0ZXItcHViLWNvbnZlcnQtaW1wb3J0LWJ0blwiXG4gICAgICAgICAgICAgIG9uY2xpY2s9XCJpbXBvcnRDb252ZXJ0ZWRQdWJsaWNhdGlvblRleHQoKVwiPkltcG9ydCBQcmV2aWV3PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFBlcnNvbmFsIEluZm8gbW9kYWwgLS0+XG4gICAgPGRpdiBpZD1cIm1hc3Rlci1waS1tb2RhbC1vdmVybGF5XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCIgcm9sZT1cImRpYWxvZ1wiIGFyaWEtbW9kYWw9XCJ0cnVlXCJcbiAgICAgICAgYXJpYS1sYWJlbGxlZGJ5PVwibWFzdGVyLXBpLW1vZGFsLXRpdGxlXCIgY2xhc3M9XCJtb2RhbC1vdmVybGF5XCJcbiAgICAgICAgb25jbGljaz1cImlmKGV2ZW50LnRhcmdldD09PXRoaXMpY2xvc2VQZXJzb25hbEluZm9Nb2RhbCgpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWxcIiBzdHlsZT1cIm1heC13aWR0aDo2MjBweDtcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuICAgICAgICAgIDxoMiBpZD1cIm1hc3Rlci1waS1tb2RhbC10aXRsZVwiPkVkaXQgUGVyc29uYWwgSW5mb3JtYXRpb248L2gyPlxuICAgICAgICAgIDxidXR0b24gb25jbGljaz1cImNsb3NlUGVyc29uYWxJbmZvTW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJDbG9zZSBwZXJzb25hbCBpbmZvIGVkaXRvclwiXG4gICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDpub25lO2JvcmRlcjpub25lO2ZvbnQtc2l6ZToxLjRlbTtjdXJzb3I6cG9pbnRlcjtjb2xvcjojNjQ3NDhiO1wiPiZ0aW1lczs8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCIgc3R5bGU9XCJwYWRkaW5nOjIwcHg7XCI+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6MWZyIDFmcjtnYXA6MTRweDtcIj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJncmlkLWNvbHVtbjoxLy0xO1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicGktbmFtZS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+RnVsbCBOYW1lPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJwaS1uYW1lLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiIHBsYWNlaG9sZGVyPVwiZS5nLiBKYW5lIFNtaXRoLCBQaC5ELlwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJncmlkLWNvbHVtbjoxLy0xO1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicGktdGl0bGUtaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPlByb2Zlc3Npb25hbCBUaXRsZSAvIEhlYWRsaW5lPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJwaS10aXRsZS1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIiBwbGFjZWhvbGRlcj1cImUuZy4gU2VuaW9yIERhdGEgU2NpZW50aXN0XCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBpLWVtYWlsLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5FbWFpbDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZW1haWxcIiBpZD1cInBpLWVtYWlsLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiIHBsYWNlaG9sZGVyPVwieW91QGV4YW1wbGUuY29tXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBpLXBob25lLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5QaG9uZTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGVsXCIgaWQ9XCJwaS1waG9uZS1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIiBwbGFjZWhvbGRlcj1cIjU1NS0xMjMtNDU2N1wiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwaS1saW5rZWRpbi1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+TGlua2VkSW4gVVJMPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ1cmxcIiBpZD1cInBpLWxpbmtlZGluLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiIHBsYWNlaG9sZGVyPVwiaHR0cHM6Ly9saW5rZWRpbi5jb20vaW4veW91XCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBpLXdlYnNpdGUtaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPldlYnNpdGU8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInVybFwiIGlkPVwicGktd2Vic2l0ZS1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIiBwbGFjZWhvbGRlcj1cImh0dHBzOi8veW91cnNpdGUuY29tXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBpLWNpdHktaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkNpdHk8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInBpLWNpdHktaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgcGxhY2Vob2xkZXI9XCJSb2NoZXN0ZXJcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicGktc3RhdGUtaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPlN0YXRlIC8gUmVnaW9uPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJwaS1zdGF0ZS1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIiBwbGFjZWhvbGRlcj1cIk5ZXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgb25jbGljaz1cImNsb3NlUGVyc29uYWxJbmZvTW9kYWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHByaW1hcnlcIiBvbmNsaWNrPVwic2F2ZVBlcnNvbmFsSW5mbygpXCI+U2F2ZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBFeHBlcmllbmNlIG1vZGFsIC0tPlxuICAgIDxkaXYgaWQ9XCJtYXN0ZXItZXhwLW1vZGFsLW92ZXJsYXlcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1tb2RhbD1cInRydWVcIlxuICAgICAgICBhcmlhLWxhYmVsbGVkYnk9XCJtYXN0ZXItZXhwLW1vZGFsLXRpdGxlXCIgY2xhc3M9XCJtb2RhbC1vdmVybGF5XCJcbiAgICAgICAgb25jbGljaz1cImlmKGV2ZW50LnRhcmdldD09PXRoaXMpY2xvc2VFeHBlcmllbmNlTW9kYWwoKVwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsXCIgc3R5bGU9XCJtYXgtd2lkdGg6NjQwcHg7XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cbiAgICAgICAgICA8aDIgaWQ9XCJtYXN0ZXItZXhwLW1vZGFsLXRpdGxlXCI+V29yayBFeHBlcmllbmNlPC9oMj5cbiAgICAgICAgICA8YnV0dG9uIG9uY2xpY2s9XCJjbG9zZUV4cGVyaWVuY2VNb2RhbCgpXCIgYXJpYS1sYWJlbD1cIkNsb3NlIGV4cGVyaWVuY2UgZWRpdG9yXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOm5vbmU7Zm9udC1zaXplOjEuNGVtO2N1cnNvcjpwb2ludGVyO2NvbG9yOiM2NDc0OGI7XCI+JnRpbWVzOzwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIiBzdHlsZT1cInBhZGRpbmc6MjBweDtcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImhpZGRlblwiIGlkPVwiZXhwLW1vZGFsLWlkXCIgLz5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpncmlkO2dyaWQtdGVtcGxhdGUtY29sdW1uczoxZnIgMWZyO2dhcDoxNHB4O1wiPlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImdyaWQtY29sdW1uOjEvLTE7XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJleHAtdGl0bGUtaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkpvYiBUaXRsZSA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4qPC9zcGFuPjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZXhwLXRpdGxlLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiIGFyaWEtcmVxdWlyZWQ9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBTZW5pb3IgRGF0YSBTY2llbnRpc3RcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZ3JpZC1jb2x1bW46MS8tMTtcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImV4cC1jb21wYW55LWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5Db21wYW55IDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPio8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJleHAtY29tcGFueS1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIiBhcmlhLXJlcXVpcmVkPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gQWNtZSBDb3JwXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImV4cC1jaXR5LWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5DaXR5PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJleHAtY2l0eS1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIiBwbGFjZWhvbGRlcj1cIkJvc3RvblwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJleHAtc3RhdGUtaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPlN0YXRlIC8gUmVnaW9uPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJleHAtc3RhdGUtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgcGxhY2Vob2xkZXI9XCJNQVwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJleHAtc3RhcnQtaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPlN0YXJ0IERhdGU8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImV4cC1zdGFydC1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIiBwbGFjZWhvbGRlcj1cIjIwMjAtMDFcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZXhwLWVuZC1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+RW5kIERhdGUgKGJsYW5rID0gcHJlc2VudCk8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImV4cC1lbmQtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgcGxhY2Vob2xkZXI9XCIyMDI0LTA2IG9yIGxlYXZlIGJsYW5rXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImV4cC10eXBlLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5FbXBsb3ltZW50IFR5cGU8L2xhYmVsPlxuICAgICAgICAgICAgICA8c2VsZWN0IGlkPVwiZXhwLXR5cGUtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCI+XG4gICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImZ1bGxfdGltZVwiPkZ1bGwtdGltZTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJwYXJ0X3RpbWVcIj5QYXJ0LXRpbWU8L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiY29udHJhY3RcIj5Db250cmFjdDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJjb25zdWx0aW5nXCI+Q29uc3VsdGluZzwvb3B0aW9uPlxuICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJpbnRlcm5zaGlwXCI+SW50ZXJuc2hpcDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJzZWxmX2VtcGxveWVkXCI+U2VsZi1lbXBsb3llZDwvb3B0aW9uPlxuICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImV4cC1pbXBvcnRhbmNlLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5JbXBvcnRhbmNlICgxXHUyMDEzMTApPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cImV4cC1pbXBvcnRhbmNlLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDo4MHB4O1wiXG4gICAgICAgICAgICAgICAgICBtaW49XCIxXCIgbWF4PVwiMTBcIiB2YWx1ZT1cIjVcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZ3JpZC1jb2x1bW46MS8tMTtcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImV4cC10YWdzLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5UYWdzIChjb21tYS1zZXBhcmF0ZWQpPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJleHAtdGFncy1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIG1sLCBsZWFkZXJzaGlwLCBweXRob25cIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZ3JpZC1jb2x1bW46MS8tMTtib3JkZXItdG9wOjFweCBzb2xpZCB2YXIoLS1jdi1ib3JkZXIpO3BhZGRpbmctdG9wOjE0cHg7bWFyZ2luLXRvcDo0cHg7XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NnB4O1wiPkFjaGlldmVtZW50czwvbGFiZWw+XG4gICAgICAgICAgICAgIDxkaXYgaWQ9XCJleHAtYWNoaWV2ZW1lbnRzLWVkaXRvci1saXN0XCI+PC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjZweDttYXJnaW4tdG9wOjZweDtcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImV4cC1hY2gtbmV3LWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJmbGV4OjE7XCJcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJBZGQgYW4gYWNoaWV2ZW1lbnQgb3IgYnVsbGV0XHUyMDI2XCJcbiAgICAgICAgICAgICAgICAgICAgb25rZXlkb3duPVwiaWYoZXZlbnQua2V5PT09J0VudGVyJyl7ZXZlbnQucHJldmVudERlZmF1bHQoKTtfYWRkRXhwQWNoaWV2ZW1lbnQoKTt9XCIgLz5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImFjdGlvbi1idG4gc2Vjb25kYXJ5XCIgb25jbGljaz1cIl9hZGRFeHBBY2hpZXZlbWVudCgpXCI+KyBBZGQ8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0blwiIG9uY2xpY2s9XCJjbG9zZUV4cGVyaWVuY2VNb2RhbCgpXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG4gcHJpbWFyeVwiIG9uY2xpY2s9XCJzYXZlTWFzdGVyRXhwZXJpZW5jZSgpXCI+U2F2ZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBTa2lsbCBhZGQgbW9kYWwgLS0+XG4gICAgPGRpdiBpZD1cIm1hc3Rlci1za2lsbC1tb2RhbC1vdmVybGF5XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCIgcm9sZT1cImRpYWxvZ1wiIGFyaWEtbW9kYWw9XCJ0cnVlXCJcbiAgICAgICAgYXJpYS1sYWJlbGxlZGJ5PVwibWFzdGVyLXNraWxsLW1vZGFsLXRpdGxlXCIgY2xhc3M9XCJtb2RhbC1vdmVybGF5XCJcbiAgICAgICAgb25jbGljaz1cImlmKGV2ZW50LnRhcmdldD09PXRoaXMpY2xvc2VTa2lsbE1vZGFsKClcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbFwiIHN0eWxlPVwibWF4LXdpZHRoOjQ4MHB4O1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XG4gICAgICAgICAgPGgyIGlkPVwibWFzdGVyLXNraWxsLW1vZGFsLXRpdGxlXCI+QWRkIFNraWxsPC9oMj5cbiAgICAgICAgICA8YnV0dG9uIG9uY2xpY2s9XCJjbG9zZVNraWxsTW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJDbG9zZSBza2lsbCBlZGl0b3JcIlxuICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6bm9uZTtib3JkZXI6bm9uZTtmb250LXNpemU6MS40ZW07Y3Vyc29yOnBvaW50ZXI7Y29sb3I6IzY0NzQ4YjtcIj4mdGltZXM7PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiIHN0eWxlPVwicGFkZGluZzoyMHB4O1wiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJza2lsbC1tb2RhbC1jYXRlZ29yeVwiIC8+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBpZD1cInNraWxsLW1vZGFsLWlzLWZsYXRcIiAvPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJza2lsbC1tb2RhbC1vcmlnaW5hbC1uYW1lXCIgLz5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNHB4O1wiIGlkPVwic2tpbGwtY2F0ZWdvcnktcm93XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwic2tpbGwtY2F0ZWdvcnktZGlzcGxheVwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+Q2F0ZWdvcnk8L2xhYmVsPlxuICAgICAgICAgICAgPHNwYW4gaWQ9XCJza2lsbC1jYXRlZ29yeS1kaXNwbGF5XCIgc3R5bGU9XCJmb250LXdlaWdodDo1MDA7Y29sb3I6IzMzNDE1NTtcIj48L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTRweDtcIj5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJza2lsbC1uYW1lLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5Ta2lsbCBOYW1lIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPio8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwic2tpbGwtbmFtZS1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIiBhcmlhLXJlcXVpcmVkPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIFB5dGhvblwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTRweDtcIj5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJza2lsbC1leHBlcmllbmNlcy1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+QXNzb2NpYXRlZCBFeHBlcmllbmNlIElEcyAob3B0aW9uYWwpPC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwic2tpbGwtZXhwZXJpZW5jZXMtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gZXhwXzEyMywgZXhwXzQ1NlwiIC8+XG4gICAgICAgICAgICA8c21hbGwgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO21hcmdpbi10b3A6NHB4O2NvbG9yOiM2NDc0OGI7XCI+Q29tbWEtc2VwYXJhdGVkIElEcy4gQSBza2lsbCBjYW4gYmUgbGlua2VkIHRvIG11bHRpcGxlIGV4cGVyaWVuY2VzLjwvc21hbGw+XG4gICAgICAgICAgICA8ZGl2IGlkPVwic2tpbGwtZXhwZXJpZW5jZS1oaW50c1wiIHN0eWxlPVwibWFyZ2luLXRvcDo2cHg7Zm9udC1zaXplOjAuOGVtO2NvbG9yOiM5NGEzYjg7XCI+PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTRweDtcIj5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJza2lsbC1hbGlhc2VzLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5BbGlhc2VzIChjb21tYS1zZXBhcmF0ZWQsIG9wdGlvbmFsKTwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInNraWxsLWFsaWFzZXMtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gSlMsIEVDTUFTY3JpcHRcIiAvPlxuICAgICAgICAgICAgPHNtYWxsIHN0eWxlPVwiZGlzcGxheTpibG9jazttYXJnaW4tdG9wOjRweDtjb2xvcjojNjQ3NDhiO1wiPkFsdGVybmF0ZSBuYW1lcyBhbiBBVFMgb3IgcmV2aWV3ZXIgbWlnaHQgc2VhcmNoIGZvci48L3NtYWxsPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwic2tpbGwteWVhcnMtaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPlllYXJzIG9mIEV4cGVyaWVuY2UgKG9wdGlvbmFsKTwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwic2tpbGwteWVhcnMtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEyMHB4O1wiIG1pbj1cIjBcIiBzdGVwPVwiMC41XCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0blwiIG9uY2xpY2s9XCJjbG9zZVNraWxsTW9kYWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHByaW1hcnlcIiBpZD1cIm1hc3Rlci1za2lsbC1zYXZlLWJ0blwiIG9uY2xpY2s9XCJzYXZlTWFzdGVyU2tpbGwoKVwiPkFkZCBTa2lsbDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBFZHVjYXRpb24gbW9kYWwgLS0+XG4gICAgPGRpdiBpZD1cIm1hc3Rlci1lZHUtbW9kYWwtb3ZlcmxheVwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLW1vZGFsPVwidHJ1ZVwiXG4gICAgICAgIGFyaWEtbGFiZWxsZWRieT1cIm1hc3Rlci1lZHUtbW9kYWwtdGl0bGVcIiBjbGFzcz1cIm1vZGFsLW92ZXJsYXlcIlxuICAgICAgICBvbmNsaWNrPVwiaWYoZXZlbnQudGFyZ2V0PT09dGhpcyljbG9zZUVkdWNhdGlvbk1vZGFsKClcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbFwiIHN0eWxlPVwibWF4LXdpZHRoOjU4MHB4O1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XG4gICAgICAgICAgPGgyIGlkPVwibWFzdGVyLWVkdS1tb2RhbC10aXRsZVwiPkVkdWNhdGlvbjwvaDI+XG4gICAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPVwiY2xvc2VFZHVjYXRpb25Nb2RhbCgpXCIgYXJpYS1sYWJlbD1cIkNsb3NlIGVkdWNhdGlvbiBlZGl0b3JcIlxuICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6bm9uZTtib3JkZXI6bm9uZTtmb250LXNpemU6MS40ZW07Y3Vyc29yOnBvaW50ZXI7Y29sb3I6IzY0NzQ4YjtcIj4mdGltZXM7PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiIHN0eWxlPVwicGFkZGluZzoyMHB4O1wiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJlZHUtbW9kYWwtaWR4XCIgdmFsdWU9XCItMVwiIC8+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6MWZyIDFmcjtnYXA6MTRweDtcIj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJlZHUtZGVncmVlLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5EZWdyZWUgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+Kjwvc3Bhbj48L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImVkdS1kZWdyZWUtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgYXJpYS1yZXF1aXJlZD1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIFBoLkQuXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImVkdS1maWVsZC1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+RmllbGQgb2YgU3R1ZHk8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImVkdS1maWVsZC1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIEJpb3N0YXRpc3RpY3NcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZ3JpZC1jb2x1bW46MS8tMTtcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImVkdS1pbnN0aXR1dGlvbi1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+SW5zdGl0dXRpb24gPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+Kjwvc3Bhbj48L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImVkdS1pbnN0aXR1dGlvbi1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIiBhcmlhLXJlcXVpcmVkPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gVW5pdmVyc2l0eSBvZiBXYXNoaW5ndG9uXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImVkdS1jaXR5LWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5DaXR5PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJlZHUtY2l0eS1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIiBwbGFjZWhvbGRlcj1cIlNlYXR0bGVcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZWR1LXN0YXRlLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5TdGF0ZTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZWR1LXN0YXRlLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiIHBsYWNlaG9sZGVyPVwiV0FcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZWR1LXN0YXJ0LXllYXItaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPlN0YXJ0IFllYXI8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiZWR1LXN0YXJ0LXllYXItaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCJcbiAgICAgICAgICAgICAgICAgIG1pbj1cIjE5NTBcIiBtYXg9XCIyMDk5XCIgcGxhY2Vob2xkZXI9XCIxOTk1XCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImVkdS1lbmQteWVhci1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+RW5kIFllYXI8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiZWR1LWVuZC15ZWFyLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiXG4gICAgICAgICAgICAgICAgICBtaW49XCIxOTUwXCIgbWF4PVwiMjA5OVwiIHBsYWNlaG9sZGVyPVwiMjAwMFwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0blwiIG9uY2xpY2s9XCJjbG9zZUVkdWNhdGlvbk1vZGFsKClcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBwcmltYXJ5XCIgb25jbGljaz1cInNhdmVNYXN0ZXJFZHVjYXRpb24oKVwiPlNhdmU8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gQXdhcmQgbW9kYWwgLS0+XG4gICAgPGRpdiBpZD1cIm1hc3Rlci1hd2FyZC1tb2RhbC1vdmVybGF5XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCIgcm9sZT1cImRpYWxvZ1wiIGFyaWEtbW9kYWw9XCJ0cnVlXCJcbiAgICAgICAgYXJpYS1sYWJlbGxlZGJ5PVwibWFzdGVyLWF3YXJkLW1vZGFsLXRpdGxlXCIgY2xhc3M9XCJtb2RhbC1vdmVybGF5XCJcbiAgICAgICAgb25jbGljaz1cImlmKGV2ZW50LnRhcmdldD09PXRoaXMpY2xvc2VBd2FyZE1vZGFsKClcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbFwiIHN0eWxlPVwibWF4LXdpZHRoOjU4MHB4O1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XG4gICAgICAgICAgPGgyIGlkPVwibWFzdGVyLWF3YXJkLW1vZGFsLXRpdGxlXCI+QXdhcmQgLyBIb25vdXI8L2gyPlxuICAgICAgICAgIDxidXR0b24gb25jbGljaz1cImNsb3NlQXdhcmRNb2RhbCgpXCIgYXJpYS1sYWJlbD1cIkNsb3NlIGF3YXJkIGVkaXRvclwiXG4gICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDpub25lO2JvcmRlcjpub25lO2ZvbnQtc2l6ZToxLjRlbTtjdXJzb3I6cG9pbnRlcjtjb2xvcjojNjQ3NDhiO1wiPiZ0aW1lczs8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCIgc3R5bGU9XCJwYWRkaW5nOjIwcHg7XCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBpZD1cImF3YXJkLW1vZGFsLWlkeFwiIHZhbHVlPVwiLTFcIiAvPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwiYXdhcmQtdGl0bGUtaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPlRpdGxlIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPio8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiYXdhcmQtdGl0bGUtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgYXJpYS1yZXF1aXJlZD1cInRydWVcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBFbXBsb3llZSBvZiB0aGUgWWVhclwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTRweDtcIj5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJhd2FyZC15ZWFyLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5ZZWFyPC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJhd2FyZC15ZWFyLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDBweDtcIlxuICAgICAgICAgICAgICAgIG1pbj1cIjE5NTBcIiBtYXg9XCIyMDk5XCIgcGxhY2Vob2xkZXI9XCIyMDIyXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cImF3YXJkLWRlc2MtaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkRlc2NyaXB0aW9uPC9sYWJlbD5cbiAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD1cImF3YXJkLWRlc2MtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiByb3dzPVwiM1wiIHN0eWxlPVwid2lkdGg6MTAwJTtyZXNpemU6dmVydGljYWw7XCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkJyaWVmIGNvbnRleHQgb3IgYWNoaWV2ZW1lbnQgZGVzY3JpcHRpb25cIj48L3RleHRhcmVhPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwiYXdhcmQtcmVsZXZhbnQtaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPlJlbGV2YW50IGZvciAoY29tbWEtc2VwYXJhdGVkKTwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImF3YXJkLXJlbGV2YW50LWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIGxlYWRlcnNoaXAsIHBoYXJtYVwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwiY2xvc2VBd2FyZE1vZGFsKClcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBwcmltYXJ5XCIgb25jbGljaz1cInNhdmVNYXN0ZXJBd2FyZCgpXCI+U2F2ZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBDZXJ0aWZpY2F0aW9uIG1vZGFsIC0tPlxuICAgIDxkaXYgaWQ9XCJtYXN0ZXItY2VydC1tb2RhbC1vdmVybGF5XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCIgcm9sZT1cImRpYWxvZ1wiIGFyaWEtbW9kYWw9XCJ0cnVlXCJcbiAgICAgICAgYXJpYS1sYWJlbGxlZGJ5PVwibWFzdGVyLWNlcnQtbW9kYWwtdGl0bGVcIiBjbGFzcz1cIm1vZGFsLW92ZXJsYXlcIlxuICAgICAgICBvbmNsaWNrPVwiaWYoZXZlbnQudGFyZ2V0PT09dGhpcyljbG9zZUNlcnRpZmljYXRpb25Nb2RhbCgpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWxcIiBzdHlsZT1cIm1heC13aWR0aDo1MDBweDtcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuICAgICAgICAgIDxoMiBpZD1cIm1hc3Rlci1jZXJ0LW1vZGFsLXRpdGxlXCI+Q2VydGlmaWNhdGlvbjwvaDI+XG4gICAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPVwiY2xvc2VDZXJ0aWZpY2F0aW9uTW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJDbG9zZSBjZXJ0aWZpY2F0aW9uIGVkaXRvclwiXG4gICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDpub25lO2JvcmRlcjpub25lO2ZvbnQtc2l6ZToxLjRlbTtjdXJzb3I6cG9pbnRlcjtjb2xvcjojNjQ3NDhiO1wiPiZ0aW1lczs8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCIgc3R5bGU9XCJwYWRkaW5nOjIwcHg7XCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBpZD1cImNlcnQtbW9kYWwtaWR4XCIgdmFsdWU9XCItMVwiIC8+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTRweDtcIj5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJjZXJ0LW5hbWUtaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPk5hbWUgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+Kjwvc3Bhbj48L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJjZXJ0LW5hbWUtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgYXJpYS1yZXF1aXJlZD1cInRydWVcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBBV1MgQ2VydGlmaWVkIFNvbHV0aW9ucyBBcmNoaXRlY3RcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwiY2VydC1pc3N1ZXItaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPklzc3VlcjwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImNlcnQtaXNzdWVyLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIEFtYXpvbiBXZWIgU2VydmljZXNcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwiY2VydC15ZWFyLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5ZZWFyPC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJjZXJ0LXllYXItaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMHB4O1wiXG4gICAgICAgICAgICAgICAgbWluPVwiMTk1MFwiIG1heD1cIjIwOTlcIiBwbGFjZWhvbGRlcj1cIjIwMjNcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgb25jbGljaz1cImNsb3NlQ2VydGlmaWNhdGlvbk1vZGFsKClcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBwcmltYXJ5XCIgb25jbGljaz1cInNhdmVNYXN0ZXJDZXJ0aWZpY2F0aW9uKClcIj5TYXZlPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEFjaGlldmVtZW50IGVkaXQgbW9kYWwgLS0+XG4gICAgPGRpdiBpZD1cIm1hc3Rlci1hY2gtbW9kYWwtb3ZlcmxheVwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLW1vZGFsPVwidHJ1ZVwiXG4gICAgICAgIGFyaWEtbGFiZWxsZWRieT1cIm1hc3Rlci1hY2gtbW9kYWwtdGl0bGVcIiBjbGFzcz1cIm1vZGFsLW92ZXJsYXlcIlxuICAgICAgICBvbmNsaWNrPVwiaWYoZXZlbnQudGFyZ2V0PT09dGhpcyljbG9zZU1hc3RlckFjaE1vZGFsKClcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbFwiIHN0eWxlPVwibWF4LXdpZHRoOjYwMHB4O1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XG4gICAgICAgICAgPGgyIGlkPVwibWFzdGVyLWFjaC1tb2RhbC10aXRsZVwiPkFjaGlldmVtZW50PC9oMj5cbiAgICAgICAgICA8YnV0dG9uIG9uY2xpY2s9XCJjbG9zZU1hc3RlckFjaE1vZGFsKClcIiBhcmlhLWxhYmVsPVwiQ2xvc2UgYWNoaWV2ZW1lbnQgZWRpdG9yXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOm5vbmU7Zm9udC1zaXplOjEuNGVtO2N1cnNvcjpwb2ludGVyO2NvbG9yOiM2NDc0OGI7XCI+JnRpbWVzOzwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIiBzdHlsZT1cInBhZGRpbmc6MjBweDtcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImhpZGRlblwiIGlkPVwiYWNoLW1vZGFsLWlkXCIgLz5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cImFjaC1tb2RhbC10aXRsZS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+VGl0bGUgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+Kjwvc3Bhbj48L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJhY2gtbW9kYWwtdGl0bGUtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgYXJpYS1yZXF1aXJlZD1cInRydWVcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBMZWQgM1x1MDBENyByZXZlbnVlIGdyb3d0aCBpbml0aWF0aXZlXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cImFjaC1tb2RhbC1kZXNjLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5EZXNjcmlwdGlvbjwvbGFiZWw+XG4gICAgICAgICAgICA8dGV4dGFyZWEgaWQ9XCJhY2gtbW9kYWwtZGVzYy1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHJvd3M9XCIzXCIgc3R5bGU9XCJ3aWR0aDoxMDAlO3Jlc2l6ZTp2ZXJ0aWNhbDtcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiT3B0aW9uYWwgZGV0YWlsIG9yIG1ldHJpY1wiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTRweDtcIj5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJhY2gtbW9kYWwtcmVsZXZhbnQtaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPlJlbGV2YW50IGZvciAoY29tbWEtc2VwYXJhdGVkIHJvbGVzL2RvbWFpbnMpPC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiYWNoLW1vZGFsLXJlbGV2YW50LWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIGxlYWRlcnNoaXAsIE1MIGVuZ2luZWVyaW5nLCBkYXRhIHNjaWVuY2VcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwiYWNoLW1vZGFsLWltcG9ydGFuY2UtaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkltcG9ydGFuY2UgKDFcdTIwMTMxMCk8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cImFjaC1tb2RhbC1pbXBvcnRhbmNlLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDo4MHB4O1wiXG4gICAgICAgICAgICAgICAgbWluPVwiMVwiIG1heD1cIjEwXCIgdmFsdWU9XCI3XCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0blwiIG9uY2xpY2s9XCJjbG9zZU1hc3RlckFjaE1vZGFsKClcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBwcmltYXJ5XCIgb25jbGljaz1cInNhdmVNYXN0ZXJBY2hpZXZlbWVudCgpXCI+U2F2ZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBTdW1tYXJ5IGVkaXQgbW9kYWwgLS0+XG4gICAgPGRpdiBpZD1cIm1hc3Rlci1zdW0tbW9kYWwtb3ZlcmxheVwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLW1vZGFsPVwidHJ1ZVwiXG4gICAgICAgIGFyaWEtbGFiZWxsZWRieT1cIm1hc3Rlci1zdW0tbW9kYWwtdGl0bGVcIiBjbGFzcz1cIm1vZGFsLW92ZXJsYXlcIlxuICAgICAgICBvbmNsaWNrPVwiaWYoZXZlbnQudGFyZ2V0PT09dGhpcyljbG9zZU1hc3RlclN1bU1vZGFsKClcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbFwiIHN0eWxlPVwibWF4LXdpZHRoOjYwMHB4O1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XG4gICAgICAgICAgPGgyIGlkPVwibWFzdGVyLXN1bS1tb2RhbC10aXRsZVwiPlByb2Zlc3Npb25hbCBTdW1tYXJ5PC9oMj5cbiAgICAgICAgICA8YnV0dG9uIG9uY2xpY2s9XCJjbG9zZU1hc3RlclN1bU1vZGFsKClcIiBhcmlhLWxhYmVsPVwiQ2xvc2Ugc3VtbWFyeSBlZGl0b3JcIlxuICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6bm9uZTtib3JkZXI6bm9uZTtmb250LXNpemU6MS40ZW07Y3Vyc29yOnBvaW50ZXI7Y29sb3I6IzY0NzQ4YjtcIj4mdGltZXM7PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiIHN0eWxlPVwicGFkZGluZzoyMHB4O1wiPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwic3VtLW1vZGFsLWtleS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+S2V5L25hbWUgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+Kjwvc3Bhbj48L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJzdW0tbW9kYWwta2V5LWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiIGFyaWEtcmVxdWlyZWQ9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gbWxfZW5naW5lZXJpbmcgb3IgbGVhZGVyc2hpcFwiIC8+XG4gICAgICAgICAgICA8cCBzdHlsZT1cImZvbnQtc2l6ZTowLjgyZW07Y29sb3I6IzZiNzI4MDttYXJnaW46NHB4IDAgMDtcIj5Vc2UgbG93ZXJjYXNlX3VuZGVyc2NvcmUgXHUyMDE0IHRoaXMgaXMgdGhlIGtleSB1c2VkIGludGVybmFsbHkgYW5kIHNob3duIGluIHRoZSBTdW1tYXJ5IEZvY3VzIHN0ZXAuPC9wPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwic3VtLW1vZGFsLXRleHQtaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPlN1bW1hcnkgdGV4dCA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4qPC9zcGFuPjwvbGFiZWw+XG4gICAgICAgICAgICA8dGV4dGFyZWEgaWQ9XCJzdW0tbW9kYWwtdGV4dC1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHJvd3M9XCI1XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO3Jlc2l6ZTp2ZXJ0aWNhbDtcIiBhcmlhLXJlcXVpcmVkPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJXcml0ZSB5b3VyIHByb2Zlc3Npb25hbCBzdW1tYXJ5IHZhcmlhbnQgaGVyZVx1MjAyNlwiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwiY2xvc2VNYXN0ZXJTdW1Nb2RhbCgpXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG4gcHJpbWFyeVwiIG9uY2xpY2s9XCJzYXZlTWFzdGVyU3VtbWFyeSgpXCI+U2F2ZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgO1xuICAvLyBEaXNhYmxlIHdyaXRlIGNvbnRyb2xzIHdoZW4gdGhlIHdvcmtmbG93IHBoYXNlIGRvZXMgbm90IHBlcm1pdCBNYXN0ZXIgQ1YgZWRpdHMuXG4gIGlmICghaXNFZGl0YWJsZSkge1xuICAgIGNvbnN0IFNBRkVfT05DTElDSyA9IC9eKGV4cG9ydE1hc3RlckNWfHZhbGlkYXRlUHVibGljYXRpb25zQmlifG9wZW5CYWNrdXBIaXN0b3J5TW9kYWx8cmVzdG9yZUJhY2t1cHxvcGVuRnVsbERhdGFQcmV2aWV3TW9kYWwpXFwoLztcbiAgICBjb250ZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2J1dHRvbicpLmZvckVhY2goYnRuID0+IHtcbiAgICAgIGNvbnN0IG9uY2xpY2sgPSAoYnRuLmdldEF0dHJpYnV0ZSgnb25jbGljaycpIHx8ICcnKS50cmltKCk7XG4gICAgICBpZiAoU0FGRV9PTkNMSUNLLnRlc3Qob25jbGljaykpIHJldHVybjtcbiAgICAgIGJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICBidG4uc3R5bGUub3BhY2l0eSA9ICcwLjQ1JztcbiAgICAgIGJ0bi5zdHlsZS5jdXJzb3IgPSAnbm90LWFsbG93ZWQnO1xuICAgICAgYnRuLnNldEF0dHJpYnV0ZSgndGl0bGUnLCAnRWRpdGluZyBsb2NrZWQgXHUyMDE0IGNvbXBsZXRlIHRoZSBjdXJyZW50IHN0YWdlIHRvIHJlLWVuYWJsZScpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gTG9hZCBwdWJsaWNhdGlvbnMgYXN5bmNocm9ub3VzbHkgYWZ0ZXIgdGhlIERPTSBpcyByZWFkeS5cbiAgbG9hZFB1YmxpY2F0aW9ucygpO1xufVxuXG5mdW5jdGlvbiBfcmVuZGVyUGVyc29uYWxJbmZvQ2FyZChwaSkge1xuICBjb25zdCBjb250YWN0ID0gcGkuY29udGFjdCB8fCB7fTtcbiAgY29uc3QgYWRkcmVzcyA9IGNvbnRhY3QuYWRkcmVzcyB8fCB7fTtcbiAgY29uc3Qgcm93cyA9IFtcbiAgICBbJ05hbWUnLCAgICAgIHBpLm5hbWUgfHwgJyddLFxuICAgIFsnVGl0bGUnLCAgICAgcGkudGl0bGUgfHwgcGkuaGVhZGxpbmUgfHwgJyddLFxuICAgIFsnRW1haWwnLCAgICAgY29udGFjdC5lbWFpbCB8fCBwaS5lbWFpbCB8fCAnJ10sXG4gICAgWydQaG9uZScsICAgICBjb250YWN0LnBob25lIHx8ICcnXSxcbiAgICBbJ0xpbmtlZEluJywgIGNvbnRhY3QubGlua2VkaW4gfHwgJyddLFxuICAgIFsnV2Vic2l0ZScsICAgY29udGFjdC53ZWJzaXRlIHx8ICcnXSxcbiAgICBbJ0xvY2F0aW9uJywgIFthZGRyZXNzLmNpdHksIGFkZHJlc3Muc3RhdGVdLmZpbHRlcihCb29sZWFuKS5qb2luKCcsICcpXSxcbiAgXS5maWx0ZXIoKFssIHZdKSA9PiB2KTtcbiAgaWYgKCFyb3dzLmxlbmd0aCkge1xuICAgIHJldHVybiAnPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO3BhZGRpbmc6MTJweCAwO1wiPk5vIHBlcnNvbmFsIGluZm9ybWF0aW9uIG9uIGZpbGUuIENsaWNrIFwiXHUyNzBGXHVGRTBGIEVkaXRcIiBhYm92ZSB0byBhZGQgeW91ciBkZXRhaWxzLjwvcD4nO1xuICB9XG4gIHJldHVybiBgPGRsIGNsYXNzPVwibWFzdGVyLWluZm8tZ3JpZFwiPiR7cm93cy5tYXAoKFtsYWJlbCwgdmFsdWVdKSA9PlxuICAgIGA8ZGl2IGNsYXNzPVwibWFzdGVyLWluZm8tcm93XCI+PGR0PiR7ZXNjYXBlSHRtbChsYWJlbCl9PC9kdD48ZGQ+JHtlc2NhcGVIdG1sKHZhbHVlKX08L2RkPjwvZGl2PmBcbiAgKS5qb2luKCcnKX08L2RsPmA7XG59XG5cbmZ1bmN0aW9uIF9yZW5kZXJFeHBlcmllbmNlc0xpc3QoZXhwZXJpZW5jZXMpIHtcbiAgaWYgKCFleHBlcmllbmNlcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gJzxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtwYWRkaW5nOjEycHggMDtcIj5ObyBleHBlcmllbmNlIGVudHJpZXMgeWV0LiBDbGljayBcIisgQWRkIEV4cGVyaWVuY2VcIiBhYm92ZS48L3A+JztcbiAgfVxuICBjb25zdCByb3dzID0gZXhwZXJpZW5jZXMubWFwKChleHAsIGlkeCkgPT4ge1xuICAgIGNvbnN0IHRpdGxlICAgPSBlc2NhcGVIdG1sKGV4cC50aXRsZSB8fCAnJyk7XG4gICAgY29uc3QgY29tcGFueSA9IGVzY2FwZUh0bWwoZXhwLmNvbXBhbnkgfHwgJycpO1xuICAgIGNvbnN0IGxvYyAgICAgPSBleHAubG9jYXRpb24gfHwge307XG4gICAgY29uc3QgbG9jYXRpb24gPSBlc2NhcGVIdG1sKFtsb2MuY2l0eSwgbG9jLnN0YXRlXS5maWx0ZXIoQm9vbGVhbikuam9pbignLCAnKSk7XG4gICAgY29uc3QgZGF0ZXMgICA9IGVzY2FwZUh0bWwoW2V4cC5zdGFydF9kYXRlLCBleHAuZW5kX2RhdGUgfHwgJ1ByZXNlbnQnXS5maWx0ZXIoQm9vbGVhbikuam9pbignIFx1MjAxMyAnKSk7XG4gICAgY29uc3QgYWNoQ291bnQgPSAoZXhwLmFjaGlldmVtZW50cyB8fCBbXSkubGVuZ3RoO1xuICAgIGNvbnN0IGV4cElkID0gZXNjYXBlSHRtbChleHAuaWQgfHwgJycpO1xuICAgIHJldHVybiBgXG4gICAgICA8dHI+XG4gICAgICAgIDx0ZD5cbiAgICAgICAgICA8c3Ryb25nPiR7dGl0bGV9PC9zdHJvbmc+PGJyPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6IzQ3NTU2OTtcIj4ke2NvbXBhbnl9PC9zcGFuPlxuICAgICAgICAgICR7bG9jYXRpb24gPyBgPHNwYW4gc3R5bGU9XCJjb2xvcjojOTRhM2I4O2ZvbnQtc2l6ZTowLjg1ZW07XCI+IFx1MDBCNyAke2xvY2F0aW9ufTwvc3Bhbj5gIDogJyd9XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07Y29sb3I6IzQ3NTU2OTt3aGl0ZS1zcGFjZTpub3dyYXA7XCI+JHtkYXRlc308L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjtjb2xvcjojOTRhM2I4O2ZvbnQtc2l6ZTowLjg1ZW07XCI+JHthY2hDb3VudH08L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJhY3Rpb24tYnRuc1wiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIG9uY2xpY2s9XCJlZGl0TWFzdGVyRXhwZXJpZW5jZSgnJHtleHBJZH0nKVwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJFZGl0IGV4cGVyaWVuY2U6ICR7dGl0bGV9XCIgdGl0bGU9XCJFZGl0XCI+XHUyNzBGXHVGRTBGPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgb25jbGljaz1cImRlbGV0ZU1hc3RlckV4cGVyaWVuY2UoJyR7ZXNjYXBlSHRtbChleHAuaWQgfHwgJycpfScsICcke3RpdGxlfScpXCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkRlbGV0ZSBleHBlcmllbmNlOiAke3RpdGxlfVwiIHRpdGxlPVwiRGVsZXRlXCI+XHVEODNEXHVEREQxXHVGRTBGPC9idXR0b24+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L3RyPmA7XG4gIH0pLmpvaW4oJycpO1xuICByZXR1cm4gYFxuICAgIDx0YWJsZSBjbGFzcz1cInJldmlldy10YWJsZVwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIj5cbiAgICAgIDx0aGVhZD5cbiAgICAgICAgPHRyPlxuICAgICAgICAgIDx0aD5Sb2xlIC8gQ29tcGFueTwvdGg+XG4gICAgICAgICAgPHRoPkRhdGVzPC90aD5cbiAgICAgICAgICA8dGggc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjt3aWR0aDo2MHB4O1wiPkJ1bGxldHM8L3RoPlxuICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOjgwcHg7XCI+QWN0aW9uczwvdGg+XG4gICAgICAgIDwvdHI+XG4gICAgICA8L3RoZWFkPlxuICAgICAgPHRib2R5PiR7cm93c308L3Rib2R5PlxuICAgIDwvdGFibGU+YDtcbn1cblxuZnVuY3Rpb24gX3JlbmRlclNraWxsc1NlY3Rpb24oc2tpbGxzKSB7XG4gIGNvbnN0IG5vcm1hbGl6ZVNraWxsID0gKHMpID0+IHtcbiAgICBpZiAodHlwZW9mIHMgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4geyBuYW1lOiBzLCBleHBlcmllbmNlczogW10gfTtcbiAgICB9XG4gICAgaWYgKHMgJiYgdHlwZW9mIHMgPT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBzLm5hbWUgfHwgJycsXG4gICAgICAgIGV4cGVyaWVuY2VzOiBBcnJheS5pc0FycmF5KHMuZXhwZXJpZW5jZXMpID8gcy5leHBlcmllbmNlcyA6IFtdLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgbmFtZTogU3RyaW5nKHMgfHwgJycpLCBleHBlcmllbmNlczogW10gfTtcbiAgfTtcblxuICBpZiAoQXJyYXkuaXNBcnJheShza2lsbHMpKSB7XG4gICAgaWYgKCFza2lsbHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gJzxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtwYWRkaW5nOjEycHggMDtcIj5ObyBza2lsbHMgb24gZmlsZS4gQ2xpY2sgXCIrIEFkZCBTa2lsbFwiIGFib3ZlLjwvcD4nO1xuICAgIH1cbiAgICBjb25zdCBjaGlwcyA9IHNraWxscy5tYXAocyA9PiB7XG4gICAgICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplU2tpbGwocyk7XG4gICAgICBjb25zdCBuYW1lID0gZXNjYXBlSHRtbChub3JtYWxpemVkLm5hbWUpO1xuICAgICAgY29uc3QgcmF3ID0gZXNjYXBlSHRtbChub3JtYWxpemVkLm5hbWUpO1xuICAgICAgY29uc3QgYmFkZ2UgPSBub3JtYWxpemVkLmV4cGVyaWVuY2VzLmxlbmd0aFxuICAgICAgICA/IGA8c21hbGwgc3R5bGU9XCJjb2xvcjojNjQ3NDhiO21hcmdpbi1sZWZ0OjZweDtcIj4oJHtub3JtYWxpemVkLmV4cGVyaWVuY2VzLmxlbmd0aH0gZXhwKTwvc21hbGw+YFxuICAgICAgICA6ICcnO1xuICAgICAgY29uc3Qgc2tpbGxKc29uID0gZXNjYXBlSHRtbChKU09OLnN0cmluZ2lmeSh7IG5hbWU6IG5vcm1hbGl6ZWQubmFtZSwgZXhwZXJpZW5jZXM6IG5vcm1hbGl6ZWQuZXhwZXJpZW5jZXMgfSkpO1xuICAgICAgcmV0dXJuIGA8c3BhbiBjbGFzcz1cInNraWxsLWNoaXBcIj4ke25hbWV9JHtiYWRnZX08YnV0dG9uIGNsYXNzPVwic2tpbGwtY2hpcC1kZWxcIiBvbmNsaWNrPVwiZWRpdE1hc3RlclNraWxsKCR7c2tpbGxKc29ufSwgJycsIHRydWUpXCIgYXJpYS1sYWJlbD1cIkVkaXQgc2tpbGwgJHtuYW1lfVwiIHRpdGxlPVwiRWRpdFwiPlx1MjcwRlx1RkUwRjwvYnV0dG9uPjxidXR0b24gY2xhc3M9XCJza2lsbC1jaGlwLWRlbFwiIG9uY2xpY2s9XCJkZWxldGVNYXN0ZXJTa2lsbCgnJHtyYXd9JywgJycsIHRydWUpXCIgYXJpYS1sYWJlbD1cIlJlbW92ZSBza2lsbCAke25hbWV9XCIgdGl0bGU9XCJSZW1vdmVcIj5cdTAwRDc8L2J1dHRvbj48L3NwYW4+YDtcbiAgICB9KS5qb2luKCcnKTtcbiAgICByZXR1cm4gYDxkaXYgY2xhc3M9XCJza2lsbC1jaGlwcy1jb250YWluZXJcIj4ke2NoaXBzfTwvZGl2PmA7XG4gIH1cbiAgaWYgKHR5cGVvZiBza2lsbHMgPT09ICdvYmplY3QnICYmIHNraWxscyAhPT0gbnVsbCkge1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhza2lsbHMpO1xuICAgIGlmICgha2V5cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAnPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO3BhZGRpbmc6MTJweCAwO1wiPk5vIHNraWxsIGNhdGVnb3JpZXMgb24gZmlsZS48L3A+JztcbiAgICB9XG4gICAgcmV0dXJuIGtleXMubWFwKGNhdEtleSA9PiB7XG4gICAgICBjb25zdCBjYXRWYWwgID0gc2tpbGxzW2NhdEtleV07XG4gICAgICBjb25zdCBjYXROYW1lICA9IHR5cGVvZiBjYXRWYWwgPT09ICdvYmplY3QnICYmIGNhdFZhbC5jYXRlZ29yeSA/IGNhdFZhbC5jYXRlZ29yeSA6IGNhdEtleTtcbiAgICAgIGNvbnN0IGNhdExpc3QgID0gQXJyYXkuaXNBcnJheShjYXRWYWwpID8gY2F0VmFsXG4gICAgICAgICAgICAgICAgICAgICA6IEFycmF5LmlzQXJyYXkoY2F0VmFsPy5za2lsbHMpID8gY2F0VmFsLnNraWxscyA6IFtdO1xuICAgICAgY29uc3QgY2hpcHMgICA9IGNhdExpc3QubWFwKHMgPT4ge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplU2tpbGwocyk7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBlc2NhcGVIdG1sKG5vcm1hbGl6ZWQubmFtZSk7XG4gICAgICAgIGNvbnN0IGJhZGdlID0gbm9ybWFsaXplZC5leHBlcmllbmNlcy5sZW5ndGhcbiAgICAgICAgICA/IGA8c21hbGwgc3R5bGU9XCJjb2xvcjojNjQ3NDhiO21hcmdpbi1sZWZ0OjZweDtcIj4oJHtub3JtYWxpemVkLmV4cGVyaWVuY2VzLmxlbmd0aH0gZXhwKTwvc21hbGw+YFxuICAgICAgICAgIDogJyc7XG4gICAgICAgIGNvbnN0IHNraWxsSnNvbiA9IGVzY2FwZUh0bWwoSlNPTi5zdHJpbmdpZnkoeyBuYW1lOiBub3JtYWxpemVkLm5hbWUsIGV4cGVyaWVuY2VzOiBub3JtYWxpemVkLmV4cGVyaWVuY2VzIH0pKTtcbiAgICAgICAgcmV0dXJuIGA8c3BhbiBjbGFzcz1cInNraWxsLWNoaXBcIj4ke25hbWV9JHtiYWRnZX08YnV0dG9uIGNsYXNzPVwic2tpbGwtY2hpcC1kZWxcIiBvbmNsaWNrPVwiZWRpdE1hc3RlclNraWxsKCR7c2tpbGxKc29ufSwgJyR7ZXNjYXBlSHRtbChjYXRLZXkpfScsIGZhbHNlKVwiIGFyaWEtbGFiZWw9XCJFZGl0ICR7bmFtZX1cIiB0aXRsZT1cIkVkaXRcIj5cdTI3MEZcdUZFMEY8L2J1dHRvbj48YnV0dG9uIGNsYXNzPVwic2tpbGwtY2hpcC1kZWxcIiBvbmNsaWNrPVwiZGVsZXRlTWFzdGVyU2tpbGwoJyR7bmFtZX0nLCAnJHtlc2NhcGVIdG1sKGNhdEtleSl9JywgZmFsc2UpXCIgYXJpYS1sYWJlbD1cIlJlbW92ZSAke25hbWV9XCIgdGl0bGU9XCJSZW1vdmVcIj5cdTAwRDc8L2J1dHRvbj48L3NwYW4+YDtcbiAgICAgIH0pLmpvaW4oJycpO1xuICAgICAgY29uc3QgY2F0S2V5RXNjICA9IGVzY2FwZUh0bWwoY2F0S2V5KTtcbiAgICAgIGNvbnN0IGNhdE5hbWVFc2MgPSBlc2NhcGVIdG1sKGNhdE5hbWUpO1xuICAgICAgcmV0dXJuIGBcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1za2lsbC1jYXRlZ29yeVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc2tpbGwtY2F0LWhlYWRlclwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXN0ZXItc2tpbGwtY2F0LW5hbWVcIj4ke2NhdE5hbWVFc2N9PC9zcGFuPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG4tc21cIiBvbmNsaWNrPVwic2hvd0FkZFNraWxsTW9kYWwoJyR7Y2F0S2V5RXNjfScsIGZhbHNlKVwiXG4gICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkFkZCBza2lsbCB0byAke2NhdE5hbWVFc2N9XCI+KyBBZGQ8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2tpbGwtY2hpcHMtY29udGFpbmVyXCI+JHtjaGlwcyB8fCAnPHNwYW4gc3R5bGU9XCJjb2xvcjojOTRhM2I4O2ZvbnQtc2l6ZTowLjg1ZW07XCI+Tm8gc2tpbGxzIGluIHRoaXMgY2F0ZWdvcnk8L3NwYW4+J308L2Rpdj5cbiAgICAgICAgPC9kaXY+YDtcbiAgICB9KS5qb2luKCcnKTtcbiAgfVxuICByZXR1cm4gJzxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtcIj5Ta2lsbHMgZGF0YSBmb3JtYXQgbm90IHJlY29nbmlzZWQuPC9wPic7XG59XG5cbmZ1bmN0aW9uIF9yZW5kZXJFZHVjYXRpb25MaXN0KGVkdWNhdGlvbikge1xuICBpZiAoIWVkdWNhdGlvbi5sZW5ndGgpIHtcbiAgICByZXR1cm4gJzxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtwYWRkaW5nOjEycHggMDtcIj5ObyBlZHVjYXRpb24gZW50cmllcyB5ZXQuIENsaWNrIFwiKyBBZGQgRWR1Y2F0aW9uXCIgYWJvdmUuPC9wPic7XG4gIH1cbiAgY29uc3Qgcm93cyA9IGVkdWNhdGlvbi5tYXAoKGVkdSwgaWR4KSA9PiB7XG4gICAgY29uc3QgZGVncmVlICAgICAgPSBlc2NhcGVIdG1sKGVkdS5kZWdyZWUgfHwgJycpO1xuICAgIGNvbnN0IGZpZWxkICAgICAgID0gZXNjYXBlSHRtbChlZHUuZmllbGQgfHwgJycpO1xuICAgIGNvbnN0IGluc3RpdHV0aW9uID0gZXNjYXBlSHRtbChlZHUuaW5zdGl0dXRpb24gfHwgJycpO1xuICAgIGNvbnN0IGxvYyAgICAgICAgID0gZWR1LmxvY2F0aW9uIHx8IHt9O1xuICAgIGNvbnN0IGxvY2F0aW9uICAgID0gZXNjYXBlSHRtbChbbG9jLmNpdHksIGxvYy5zdGF0ZV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJywgJykpO1xuICAgIGNvbnN0IHllYXJzICAgICAgID0gW2VkdS5zdGFydF95ZWFyLCBlZHUuZW5kX3llYXJdLmZpbHRlcihCb29sZWFuKS5qb2luKCdcdTIwMTMnKTtcbiAgICBjb25zdCBlZHVKc29uID0gZXNjYXBlSHRtbChKU09OLnN0cmluZ2lmeSh7XG4gICAgICBkZWdyZWU6IGVkdS5kZWdyZWUgfHwgJycsIGZpZWxkOiBlZHUuZmllbGQgfHwgJycsIGluc3RpdHV0aW9uOiBlZHUuaW5zdGl0dXRpb24gfHwgJycsXG4gICAgICBjaXR5OiBsb2MuY2l0eSB8fCAnJywgc3RhdGU6IGxvYy5zdGF0ZSB8fCAnJyxcbiAgICAgIHN0YXJ0X3llYXI6IGVkdS5zdGFydF95ZWFyIHx8ICcnLCBlbmRfeWVhcjogZWR1LmVuZF95ZWFyIHx8ICcnLFxuICAgIH0pKTtcbiAgICByZXR1cm4gYFxuICAgICAgPHRyPlxuICAgICAgICA8dGQ+XG4gICAgICAgICAgPHN0cm9uZz4ke2RlZ3JlZX0ke2ZpZWxkID8gYCwgJHtmaWVsZH1gIDogJyd9PC9zdHJvbmc+PGJyPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6IzQ3NTU2OTtcIj4ke2luc3RpdHV0aW9ufTwvc3Bhbj5cbiAgICAgICAgICAke2xvY2F0aW9uID8gYDxzcGFuIHN0eWxlPVwiY29sb3I6Izk0YTNiODtmb250LXNpemU6MC44NWVtO1wiPiBcdTAwQjcgJHtsb2NhdGlvbn08L3NwYW4+YCA6ICcnfVxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2NvbG9yOiM0NzU1Njk7d2hpdGUtc3BhY2U6bm93cmFwO1wiPiR7eWVhcnMgfHwgJ1x1MjAxNCd9PC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwiYWN0aW9uLWJ0bnNcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBvbmNsaWNrPVwiZWRpdE1hc3RlckVkdWNhdGlvbigke2VkdUpzb259LCAke2lkeH0pXCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkVkaXQgZWR1Y2F0aW9uOiAke2luc3RpdHV0aW9ufVwiIHRpdGxlPVwiRWRpdFwiPlx1MjcwRlx1RkUwRjwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIG9uY2xpY2s9XCJkZWxldGVNYXN0ZXJFZHVjYXRpb24oJHtpZHh9LCAnJHtpbnN0aXR1dGlvbn0nKVwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJEZWxldGUgZWR1Y2F0aW9uOiAke2luc3RpdHV0aW9ufVwiIHRpdGxlPVwiRGVsZXRlXCI+XHVEODNEXHVEREQxXHVGRTBGPC9idXR0b24+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L3RyPmA7XG4gIH0pLmpvaW4oJycpO1xuICByZXR1cm4gYFxuICAgIDx0YWJsZSBjbGFzcz1cInJldmlldy10YWJsZVwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIj5cbiAgICAgIDx0aGVhZD5cbiAgICAgICAgPHRyPlxuICAgICAgICAgIDx0aD5EZWdyZWUgLyBJbnN0aXR1dGlvbjwvdGg+XG4gICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6MTAwcHg7XCI+WWVhcnM8L3RoPlxuICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOjgwcHg7XCI+QWN0aW9uczwvdGg+XG4gICAgICAgIDwvdHI+XG4gICAgICA8L3RoZWFkPlxuICAgICAgPHRib2R5PiR7cm93c308L3Rib2R5PlxuICAgIDwvdGFibGU+YDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBQdWJsaWNhdGlvbnMgXHUyMDE0IENSVUQgKyByYXcgQmliVGVYIHRvZ2dsZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBDdXJyZW50IHZpZXcgbW9kZTogJ2NydWQnIHwgJ3JhdycgKi9cbmxldCBfcHViVmlld01vZGUgPSAnY3J1ZCc7XG5sZXQgX3B1YlNvcnRNb2RlID0gJ3llYXJfZGVzYyc7XG5sZXQgX3B1Ykdyb3VwTW9kZSA9ICdub25lJztcbi8qKiBUcnVlIHdoZW4gdGhlIGVudHJ5IGJlaW5nIGVkaXRlZCBoYWQgYW4gYGVkaXRvcmAgZmllbGQgYnV0IG5vIGBhdXRob3JgLiAqL1xubGV0IF9wdWJNb2RhbFVzZXNFZGl0b3JGaWVsZCA9IGZhbHNlO1xuXG5mdW5jdGlvbiB0b2dnbGVQdWJsaWNhdGlvbnNWaWV3KCkge1xuICBfcHViVmlld01vZGUgPSBfcHViVmlld01vZGUgPT09ICdjcnVkJyA/ICdyYXcnIDogJ2NydWQnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1jcnVkLXZpZXcnKS5zdHlsZS5kaXNwbGF5ID0gX3B1YlZpZXdNb2RlID09PSAnY3J1ZCcgPyAnJyA6ICdub25lJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItcmF3LXZpZXcnKS5zdHlsZS5kaXNwbGF5ICA9IF9wdWJWaWV3TW9kZSA9PT0gJ3JhdycgID8gJycgOiAnbm9uZSc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWFkZC1idG4nKS5zdHlsZS5kaXNwbGF5ICAgPSBfcHViVmlld01vZGUgPT09ICdjcnVkJyA/ICcnIDogJ25vbmUnO1xuICBjb25zdCBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi10b2dnbGUtYnRuJyk7XG4gIGlmIChidG4pIGJ0bi50ZXh0Q29udGVudCA9IF9wdWJWaWV3TW9kZSA9PT0gJ2NydWQnID8gJ1x1MjcwRlx1RkUwRiBSYXcgQmliVGVYJyA6ICdcdUQ4M0RcdURDQ0IgU3RydWN0dXJlZCBWaWV3JztcbiAgaWYgKF9wdWJWaWV3TW9kZSA9PT0gJ3JhdycpIGxvYWRQdWJsaWNhdGlvbnNCaWIoKTtcbn1cblxuLyoqIExvYWQgYm90aCBzdHJ1Y3R1cmVkIGxpc3QgYW5kIHJhdyBjb250ZW50IGZyb20gYSBzaW5nbGUgQVBJIGNhbGwuICovXG5hc3luYyBmdW5jdGlvbiBsb2FkUHVibGljYXRpb25zKCkge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS9wdWJsaWNhdGlvbnMnKTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgX3JlbmRlclB1YmxpY2F0aW9uc0NydWRMaXN0KGRhdGEucHVibGljYXRpb25zIHx8IFtdKTtcbiAgICAgIGNvbnN0IHRhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItdGV4dGFyZWEnKTtcbiAgICAgIGlmICh0YSkgdGEudmFsdWUgPSBkYXRhLmNvbnRlbnQgfHwgJyc7XG4gICAgICBfdXBkYXRlUHViQ291bnQoZGF0YS5jb3VudCA/PyAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItY3J1ZC1jb250YWluZXInKS5pbm5lckhUTUwgPVxuICAgICAgICBgPHAgc3R5bGU9XCJjb2xvcjojZWY0NDQ0O3BhZGRpbmc6MTJweCAwO1wiPlx1MjZBMFx1RkUwRiAke2VzY2FwZUh0bWwoZGF0YS5lcnJvciB8fCAnRmFpbGVkIHRvIGxvYWQnKX08L3A+YDtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNydWQtY29udGFpbmVyJykuaW5uZXJIVE1MID1cbiAgICAgIGA8cCBzdHlsZT1cImNvbG9yOiNlZjQ0NDQ7cGFkZGluZzoxMnB4IDA7XCI+XHUyNkEwXHVGRTBGIEZhaWxlZCB0byBsb2FkOiAke2VzY2FwZUh0bWwoZXJyLm1lc3NhZ2UpfTwvcD5gO1xuICB9XG59XG5cbi8qKiBSZWxvYWQgb25seSB0aGUgcmF3IHRleHRhcmVhIGNvbnRlbnQgKGNhbGxlZCB3aGVuIHN3aXRjaGluZyB0byByYXcgdmlldykuICovXG5hc3luYyBmdW5jdGlvbiBsb2FkUHVibGljYXRpb25zQmliKCkge1xuICBjb25zdCB0YSAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi10ZXh0YXJlYScpO1xuICBjb25zdCBzdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1zdGF0dXMnKTtcbiAgaWYgKCF0YSkgcmV0dXJuO1xuICB0YS5kaXNhYmxlZCAgICA9IHRydWU7XG4gIHRhLnBsYWNlaG9sZGVyID0gJ0xvYWRpbmdcdTIwMjYnO1xuICBpZiAoc3RhdHVzKSBzdGF0dXMudGV4dENvbnRlbnQgPSAnJztcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvcHVibGljYXRpb25zJyk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEub2spIHtcbiAgICAgIHRhLnZhbHVlID0gZGF0YS5jb250ZW50IHx8ICcnO1xuICAgICAgX3VwZGF0ZVB1YkNvdW50KGRhdGEuY291bnQgPz8gMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChzdGF0dXMpIHN0YXR1cy50ZXh0Q29udGVudCA9ICdcdTI2QTBcdUZFMEYgJyArIChkYXRhLmVycm9yIHx8ICdGYWlsZWQgdG8gbG9hZCcpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKHN0YXR1cykgc3RhdHVzLnRleHRDb250ZW50ID0gJ1x1MjZBMFx1RkUwRiBGYWlsZWQgdG8gbG9hZDogJyArIGVyci5tZXNzYWdlO1xuICB9IGZpbmFsbHkge1xuICAgIHRhLmRpc2FibGVkICAgID0gZmFsc2U7XG4gICAgdGEucGxhY2Vob2xkZXIgPSAnJztcbiAgfVxufVxuXG5mdW5jdGlvbiBfdXBkYXRlUHViQ291bnQobikge1xuICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNvdW50Jyk7XG4gIGlmIChlbCkgZWwudGV4dENvbnRlbnQgPSBgJHtufSBwdWJsaWNhdGlvbiR7biAhPT0gMSA/ICdzJyA6ICcnfSBvbiBmaWxlYDtcbn1cblxuZnVuY3Rpb24gX3NldFB1YmxpY2F0aW9uU3RhdHVzKGVsZW1lbnRJZCwgdGV4dCwgY29sb3IgPSAnIzZiNzI4MCcpIHtcbiAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtZW50SWQpO1xuICBpZiAoIWVsKSByZXR1cm47XG4gIGVsLnRleHRDb250ZW50ID0gdGV4dDtcbiAgZWwuc3R5bGUuY29sb3IgPSBjb2xvcjtcbn1cblxuZnVuY3Rpb24gc2V0UHVibGljYXRpb25Tb3J0TW9kZShtb2RlKSB7XG4gIF9wdWJTb3J0TW9kZSA9IG1vZGUgfHwgJ3llYXJfZGVzYyc7XG4gIHZvaWQgbG9hZFB1YmxpY2F0aW9ucygpO1xufVxuXG5mdW5jdGlvbiBzZXRQdWJsaWNhdGlvbkdyb3VwTW9kZShtb2RlKSB7XG4gIF9wdWJHcm91cE1vZGUgPSBtb2RlIHx8ICdub25lJztcbiAgdm9pZCBsb2FkUHVibGljYXRpb25zKCk7XG59XG5cbmZ1bmN0aW9uIF9nZXRQdWJsaWNhdGlvblllYXIocHViKSB7XG4gIGNvbnN0IHJhd1llYXIgPSBwdWI/LmZpZWxkcz8ueWVhciA/PyBwdWI/LnllYXIgPz8gJyc7XG4gIGNvbnN0IG1hdGNoID0gU3RyaW5nKHJhd1llYXIpLm1hdGNoKC9cXGR7NH0vKTtcbiAgcmV0dXJuIG1hdGNoID8gTnVtYmVyKG1hdGNoWzBdKSA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIF9jb21wYXJlUHVibGljYXRpb25zKGxlZnQsIHJpZ2h0KSB7XG4gIGNvbnN0IGxlZnRZZWFyID0gX2dldFB1YmxpY2F0aW9uWWVhcihsZWZ0KSA/PyAtSW5maW5pdHk7XG4gIGNvbnN0IHJpZ2h0WWVhciA9IF9nZXRQdWJsaWNhdGlvblllYXIocmlnaHQpID8/IC1JbmZpbml0eTtcbiAgY29uc3QgbGVmdFR5cGUgPSBTdHJpbmcobGVmdD8udHlwZSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgcmlnaHRUeXBlID0gU3RyaW5nKHJpZ2h0Py50eXBlIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBsZWZ0S2V5ID0gU3RyaW5nKGxlZnQ/LmtleSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgcmlnaHRLZXkgPSBTdHJpbmcocmlnaHQ/LmtleSB8fCAnJykudG9Mb3dlckNhc2UoKTtcblxuICBzd2l0Y2ggKF9wdWJTb3J0TW9kZSkge1xuICAgIGNhc2UgJ3llYXJfYXNjJzpcbiAgICAgIHJldHVybiAobGVmdFllYXIgLSByaWdodFllYXIpIHx8IGxlZnRUeXBlLmxvY2FsZUNvbXBhcmUocmlnaHRUeXBlKSB8fCBsZWZ0S2V5LmxvY2FsZUNvbXBhcmUocmlnaHRLZXkpO1xuICAgIGNhc2UgJ3R5cGVfYXNjJzpcbiAgICAgIHJldHVybiBsZWZ0VHlwZS5sb2NhbGVDb21wYXJlKHJpZ2h0VHlwZSkgfHwgKHJpZ2h0WWVhciAtIGxlZnRZZWFyKSB8fCBsZWZ0S2V5LmxvY2FsZUNvbXBhcmUocmlnaHRLZXkpO1xuICAgIGNhc2UgJ3R5cGVfZGVzYyc6XG4gICAgICByZXR1cm4gcmlnaHRUeXBlLmxvY2FsZUNvbXBhcmUobGVmdFR5cGUpIHx8IChyaWdodFllYXIgLSBsZWZ0WWVhcikgfHwgbGVmdEtleS5sb2NhbGVDb21wYXJlKHJpZ2h0S2V5KTtcbiAgICBjYXNlICd5ZWFyX2Rlc2MnOlxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gKHJpZ2h0WWVhciAtIGxlZnRZZWFyKSB8fCBsZWZ0VHlwZS5sb2NhbGVDb21wYXJlKHJpZ2h0VHlwZSkgfHwgbGVmdEtleS5sb2NhbGVDb21wYXJlKHJpZ2h0S2V5KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfZ3JvdXBQdWJsaWNhdGlvbkxhYmVsKHB1Yikge1xuICBpZiAoX3B1Ykdyb3VwTW9kZSA9PT0gJ3llYXInKSB7XG4gICAgcmV0dXJuIFN0cmluZyhfZ2V0UHVibGljYXRpb25ZZWFyKHB1YikgPz8gJ1Vua25vd24geWVhcicpO1xuICB9XG4gIGlmIChfcHViR3JvdXBNb2RlID09PSAndHlwZScpIHtcbiAgICByZXR1cm4gcHViPy50eXBlID8gU3RyaW5nKHB1Yi50eXBlKSA6ICdVbmtub3duIHR5cGUnO1xuICB9XG4gIHJldHVybiAnUHVibGljYXRpb25zJztcbn1cblxuZnVuY3Rpb24gX3JlbmRlclB1YmxpY2F0aW9uc0NydWRMaXN0KHB1YnMpIHtcbiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItY3J1ZC1jb250YWluZXInKTtcbiAgaWYgKCFjb250YWluZXIpIHJldHVybjtcbiAgY29uc3QgY29udHJvbHNIdG1sID0gYFxuICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7ZmxleC13cmFwOndyYXA7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDoxMnB4O21hcmdpbi1ib3R0b206MTJweDtcIj5cbiAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjZweDtjb2xvcjojNDc1NTY5O2ZvbnQtc2l6ZTowLjllbTtcIj5cbiAgICAgICAgU29ydFxuICAgICAgICA8c2VsZWN0IGlkPVwibWFzdGVyLXB1Yi1zb3J0LXNlbGVjdFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6YXV0bzttaW4td2lkdGg6MTUwcHg7XCIgb25jaGFuZ2U9XCJzZXRQdWJsaWNhdGlvblNvcnRNb2RlKHRoaXMudmFsdWUpXCI+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInllYXJfZGVzY1wiICR7X3B1YlNvcnRNb2RlID09PSAneWVhcl9kZXNjJyA/ICdzZWxlY3RlZCcgOiAnJ30+WWVhciBuZXdlc3QgZmlyc3Q8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwieWVhcl9hc2NcIiAke19wdWJTb3J0TW9kZSA9PT0gJ3llYXJfYXNjJyA/ICdzZWxlY3RlZCcgOiAnJ30+WWVhciBvbGRlc3QgZmlyc3Q8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwidHlwZV9hc2NcIiAke19wdWJTb3J0TW9kZSA9PT0gJ3R5cGVfYXNjJyA/ICdzZWxlY3RlZCcgOiAnJ30+VHlwZSBBXHUyMDEzWjwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ0eXBlX2Rlc2NcIiAke19wdWJTb3J0TW9kZSA9PT0gJ3R5cGVfZGVzYycgPyAnc2VsZWN0ZWQnIDogJyd9PlR5cGUgWlx1MjAxM0E8L29wdGlvbj5cbiAgICAgICAgPC9zZWxlY3Q+XG4gICAgICA8L2xhYmVsPlxuICAgICAgPGxhYmVsIHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6NnB4O2NvbG9yOiM0NzU1Njk7Zm9udC1zaXplOjAuOWVtO1wiPlxuICAgICAgICBHcm91cFxuICAgICAgICA8c2VsZWN0IGlkPVwibWFzdGVyLXB1Yi1ncm91cC1zZWxlY3RcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOmF1dG87bWluLXdpZHRoOjE0MHB4O1wiIG9uY2hhbmdlPVwic2V0UHVibGljYXRpb25Hcm91cE1vZGUodGhpcy52YWx1ZSlcIj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwibm9uZVwiICR7X3B1Ykdyb3VwTW9kZSA9PT0gJ25vbmUnID8gJ3NlbGVjdGVkJyA6ICcnfT5ObyBncm91cGluZzwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ5ZWFyXCIgJHtfcHViR3JvdXBNb2RlID09PSAneWVhcicgPyAnc2VsZWN0ZWQnIDogJyd9PkJ5IHllYXI8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwidHlwZVwiICR7X3B1Ykdyb3VwTW9kZSA9PT0gJ3R5cGUnID8gJ3NlbGVjdGVkJyA6ICcnfT5CeSB0eXBlPC9vcHRpb24+XG4gICAgICAgIDwvc2VsZWN0PlxuICAgICAgPC9sYWJlbD5cbiAgICA8L2Rpdj5gO1xuICBpZiAoIXB1YnMubGVuZ3RoKSB7XG4gICAgY29udGFpbmVyLmlubmVySFRNTCA9IGAke2NvbnRyb2xzSHRtbH08cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7cGFkZGluZzoxMnB4IDA7XCI+Tm8gcHVibGljYXRpb25zIG9uIGZpbGUuIENsaWNrIFwiKyBBZGQgUHVibGljYXRpb25cIiBhYm92ZSwgb3Igc3dpdGNoIHRvIFJhdyBCaWJUZVggdG8gcGFzdGUvaW1wb3J0IGVudHJpZXMuPC9wPmA7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHNvcnRlZCA9IFsuLi5wdWJzXS5zb3J0KF9jb21wYXJlUHVibGljYXRpb25zKTtcbiAgY29uc3QgZ3JvdXBzID0gW107XG4gIGZvciAoY29uc3QgcHViIG9mIHNvcnRlZCkge1xuICAgIGNvbnN0IGxhYmVsID0gX2dyb3VwUHVibGljYXRpb25MYWJlbChwdWIpO1xuICAgIGxldCBncm91cCA9IGdyb3Vwcy5maW5kKChlbnRyeSkgPT4gZW50cnkubGFiZWwgPT09IGxhYmVsKTtcbiAgICBpZiAoIWdyb3VwKSB7XG4gICAgICBncm91cCA9IHsgbGFiZWwsIGl0ZW1zOiBbXSB9O1xuICAgICAgZ3JvdXBzLnB1c2goZ3JvdXApO1xuICAgIH1cbiAgICBncm91cC5pdGVtcy5wdXNoKHB1Yik7XG4gIH1cbiAgY29uc3Qgc2VjdGlvbkh0bWwgPSBncm91cHMubWFwKCh7IGxhYmVsLCBpdGVtcyB9KSA9PiB7XG4gICAgY29uc3QgaGVhZGluZ0h0bWwgPSBfcHViR3JvdXBNb2RlID09PSAnbm9uZSdcbiAgICAgID8gJydcbiAgICAgIDogYDxkaXYgc3R5bGU9XCJtYXJnaW46MTZweCAwIDhweDtmb250LXNpemU6MC45ZW07Zm9udC13ZWlnaHQ6NzAwO2NvbG9yOiMzMzQxNTU7XCI+JHtlc2NhcGVIdG1sKGxhYmVsKX08L2Rpdj5gO1xuICAgIGNvbnN0IHJvd3MgPSBpdGVtcy5tYXAocHViID0+IHtcbiAgICBjb25zdCBrZXkgICAgICA9IGVzY2FwZUh0bWwocHViLmtleSB8fCAnJyk7XG4gICAgY29uc3QgdHlwZSAgICAgPSBlc2NhcGVIdG1sKHB1Yi50eXBlIHx8ICcnKTtcbiAgICBjb25zdCBjaXRhdGlvbiA9IGVzY2FwZUh0bWwoKHB1Yi5mb3JtYXR0ZWRfY2l0YXRpb24gfHwgJycpLnNsaWNlKDAsIDE2MCkpO1xuICAgIGNvbnN0IGZ1bGwgICAgID0gcHViLmZvcm1hdHRlZF9jaXRhdGlvbiB8fCAnJztcbiAgICBjb25zdCBwdWJKc29uICA9IGVzY2FwZUh0bWwoSlNPTi5zdHJpbmdpZnkocHViKSk7XG4gICAgcmV0dXJuIGBcbiAgICAgIDx0cj5cbiAgICAgICAgPHRkPlxuICAgICAgICAgIDxjb2RlIHN0eWxlPVwiZm9udC1zaXplOjAuOGVtO2NvbG9yOiM0NzU1Njk7XCI+JHtrZXl9PC9jb2RlPlxuICAgICAgICAgICR7Y2l0YXRpb24gPyBgPGJyPjxzbWFsbCBzdHlsZT1cImNvbG9yOiM2YjcyODA7XCI+JHtjaXRhdGlvbn0ke2Z1bGwubGVuZ3RoID4gMTYwID8gJ1x1MjAyNicgOiAnJ308L3NtYWxsPmAgOiAnJ31cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7Y29sb3I6IzQ3NTU2OTtmb250LXNpemU6MC44NWVtO1wiPiR7dHlwZX08L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJhY3Rpb24tYnRuc1wiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIG9uY2xpY2s9XCJlZGl0TWFzdGVyUHVibGljYXRpb24oJHtwdWJKc29ufSlcIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiRWRpdCBwdWJsaWNhdGlvbjogJHtrZXl9XCIgdGl0bGU9XCJFZGl0XCI+XHUyNzBGXHVGRTBGPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgb25jbGljaz1cImRlbGV0ZU1hc3RlclB1YmxpY2F0aW9uKCcke2tleX0nKVwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJEZWxldGUgcHVibGljYXRpb246ICR7a2V5fVwiIHRpdGxlPVwiRGVsZXRlXCI+XHVEODNEXHVEREQxXHVGRTBGPC9idXR0b24+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L3RyPmA7XG4gICAgfSkuam9pbignJyk7XG4gICAgcmV0dXJuIGAke2hlYWRpbmdIdG1sfVxuICAgIDx0YWJsZSBjbGFzcz1cInJldmlldy10YWJsZVwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIj5cbiAgICAgIDx0aGVhZD5cbiAgICAgICAgPHRyPlxuICAgICAgICAgIDx0aD5QdWJsaWNhdGlvbjwvdGg+XG4gICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6MTEwcHg7dGV4dC1hbGlnbjpjZW50ZXI7XCI+VHlwZTwvdGg+XG4gICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6ODBweDtcIj5BY3Rpb25zPC90aD5cbiAgICAgICAgPC90cj5cbiAgICAgIDwvdGhlYWQ+XG4gICAgICA8dGJvZHk+JHtyb3dzfTwvdGJvZHk+XG4gICAgPC90YWJsZT5gO1xuICB9KS5qb2luKCcnKTtcbiAgY29udGFpbmVyLmlubmVySFRNTCA9IGAke2NvbnRyb2xzSHRtbH0ke3NlY3Rpb25IdG1sfWA7XG59XG5cbi8qKiBWYWxpZGF0ZSBCaWJUZVggaW4gdGhlIHRleHRhcmVhIHdpdGhvdXQgc2F2aW5nLiAqL1xuYXN5bmMgZnVuY3Rpb24gdmFsaWRhdGVQdWJsaWNhdGlvbnNCaWIoKSB7XG4gIGNvbnN0IHRhICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLXRleHRhcmVhJyk7XG4gIGNvbnN0IHN0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLXN0YXR1cycpO1xuICBpZiAoIXRhIHx8ICFzdGF0dXMpIHJldHVybjtcbiAgY29uc3QgdGV4dCA9IHRhLnZhbHVlO1xuICBpZiAoIXRleHQudHJpbSgpKSB7XG4gICAgc3RhdHVzLnRleHRDb250ZW50ID0gJ1x1MjEzOVx1RkUwRiBFbXB0eSBcdTIwMTQgbm90aGluZyB0byB2YWxpZGF0ZS4nO1xuICAgIHN0YXR1cy5zdHlsZS5jb2xvciA9ICcjNmI3MjgwJztcbiAgICByZXR1cm47XG4gIH1cbiAgc3RhdHVzLnRleHRDb250ZW50ID0gJ1x1RDgzRFx1REQwRCBWYWxpZGF0aW5nXHUyMDI2JztcbiAgc3RhdHVzLnN0eWxlLmNvbG9yID0gJyM2YjcyODAnO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS9wdWJsaWNhdGlvbnMvdmFsaWRhdGUnLCB7XG4gICAgICBtZXRob2Q6ICAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6ICAgIEpTT04uc3RyaW5naWZ5KHsgYmlidGV4X3RleHQ6IHRleHQgfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEub2spIHtcbiAgICAgIGNvbnN0IG4gPSBkYXRhLmNvdW50ID8/IDA7XG4gICAgICBzdGF0dXMudGV4dENvbnRlbnQgPSBgXHUyNzA1IFZhbGlkIFx1MjAxNCAke259IGVudHIke24gIT09IDEgPyAnaWVzJyA6ICd5J30gZm91bmQuYDtcbiAgICAgIHN0YXR1cy5zdHlsZS5jb2xvciA9ICcjMTU4MDNkJztcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdHVzLnRleHRDb250ZW50ID0gJ1x1Mjc0QyAnICsgKGRhdGEuZXJyb3IgfHwgJ1ZhbGlkYXRpb24gZmFpbGVkJyk7XG4gICAgICBzdGF0dXMuc3R5bGUuY29sb3IgPSAnI2RjMjYyNic7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBzdGF0dXMudGV4dENvbnRlbnQgPSAnXHUyNzRDICcgKyBlcnIubWVzc2FnZTtcbiAgICBzdGF0dXMuc3R5bGUuY29sb3IgPSAnI2RjMjYyNic7XG4gIH1cbn1cblxuLyoqIFNhdmUgcmF3IEJpYlRlWCAodmFsaWRhdGVzIHNlcnZlci1zaWRlIGJlZm9yZSB3cml0aW5nKS4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNhdmVQdWJsaWNhdGlvbnNCaWIoKSB7XG4gIGNvbnN0IHRhICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLXRleHRhcmVhJyk7XG4gIGNvbnN0IHN0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLXN0YXR1cycpO1xuICBjb25zdCBidG4gICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1zYXZlLWJ0bicpO1xuICBpZiAoIXRhKSByZXR1cm47XG4gIGNvbnN0IGNvbnRlbnQgPSB0YS52YWx1ZTtcbiAgaWYgKGJ0bikgeyBidG4uZGlzYWJsZWQgPSB0cnVlOyBidG4udGV4dENvbnRlbnQgPSAnXHUyM0YzIFNhdmluZ1x1MjAyNic7IH1cbiAgaWYgKHN0YXR1cykgeyBzdGF0dXMudGV4dENvbnRlbnQgPSAnJzsgc3RhdHVzLnN0eWxlLmNvbG9yID0gJyM2YjcyODAnOyB9XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL3B1YmxpY2F0aW9ucycsIHtcbiAgICAgIG1ldGhvZDogICdQVVQnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiAgICBKU09OLnN0cmluZ2lmeSh7IGNvbnRlbnQgfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEub2spIHtcbiAgICAgIGNvbnN0IG4gPSBkYXRhLmNvdW50ID8/IDA7XG4gICAgICBpZiAoc3RhdHVzKSB7XG4gICAgICAgIHN0YXR1cy50ZXh0Q29udGVudCA9IGBcdTI3MDUgU2F2ZWQgXHUyMDE0ICR7bn0gZW50ciR7biAhPT0gMSA/ICdpZXMnIDogJ3knfSBwYXJzZWQuYDtcbiAgICAgICAgc3RhdHVzLnN0eWxlLmNvbG9yID0gJyMxNTgwM2QnO1xuICAgICAgfVxuICAgICAgX3VwZGF0ZVB1YkNvdW50KG4pO1xuICAgICAgX3NldE1hc3RlckNoYW5nZU5vdGljZSgnUHVibGljYXRpb25zJywgJ3VwZGF0ZWQnKTtcbiAgICAgIC8vIFJlZnJlc2ggQ1JVRCBsaXN0IHRvIHN0YXkgaW4gc3luY1xuICAgICAgYXdhaXQgbG9hZFB1YmxpY2F0aW9ucygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc3RhdHVzKSB7XG4gICAgICAgIHN0YXR1cy50ZXh0Q29udGVudCA9ICdcdTI3NEMgJyArIChkYXRhLmVycm9yIHx8ICdTYXZlIGZhaWxlZCcpO1xuICAgICAgICBzdGF0dXMuc3R5bGUuY29sb3IgPSAnI2RjMjYyNic7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoc3RhdHVzKSB7XG4gICAgICBzdGF0dXMudGV4dENvbnRlbnQgPSAnXHUyNzRDICcgKyBlcnIubWVzc2FnZTtcbiAgICAgIHN0YXR1cy5zdHlsZS5jb2xvciA9ICcjZGMyNjI2JztcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKGJ0bikgeyBidG4uZGlzYWJsZWQgPSBmYWxzZTsgYnRuLnRleHRDb250ZW50ID0gJ1x1RDgzRFx1RENCRSBTYXZlJzsgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNob3dJbXBvcnRQdWJsaWNhdGlvbnNNb2RhbCgpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItaW1wb3J0LXRleHRhcmVhJykudmFsdWUgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItaW1wb3J0LW92ZXJ3cml0ZScpLmNoZWNrZWQgPSBmYWxzZTtcbiAgX3NldFB1YmxpY2F0aW9uU3RhdHVzKCdtYXN0ZXItcHViLWltcG9ydC1zdGF0dXMnLCAnJyk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWltcG9ydC1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBzZXRJbml0aWFsRm9jdXMoJ21hc3Rlci1wdWItaW1wb3J0LW1vZGFsLW92ZXJsYXknKTtcbiAgdHJhcEZvY3VzKCdtYXN0ZXItcHViLWltcG9ydC1tb2RhbC1vdmVybGF5Jyk7XG59XG5cbmZ1bmN0aW9uIGNsb3NlSW1wb3J0UHVibGljYXRpb25zTW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWltcG9ydC1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgcmVzdG9yZUZvY3VzKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGltcG9ydFB1YmxpY2F0aW9uc0JpYigpIHtcbiAgY29uc3QgdGV4dGFyZWEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1pbXBvcnQtdGV4dGFyZWEnKTtcbiAgY29uc3Qgb3ZlcndyaXRlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItaW1wb3J0LW92ZXJ3cml0ZScpO1xuICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1pbXBvcnQtc3VibWl0LWJ0bicpO1xuICBpZiAoIXRleHRhcmVhKSByZXR1cm47XG4gIGNvbnN0IGJpYnRleFRleHQgPSB0ZXh0YXJlYS52YWx1ZS50cmltKCk7XG4gIGlmICghYmlidGV4VGV4dCkge1xuICAgIF9zZXRQdWJsaWNhdGlvblN0YXR1cygnbWFzdGVyLXB1Yi1pbXBvcnQtc3RhdHVzJywgJ1x1MjZBMFx1RkUwRiBQYXN0ZSBCaWJUZVggZW50cmllcyB0byBpbXBvcnQuJywgJyNkYzI2MjYnKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGJ1dHRvbikge1xuICAgIGJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7XG4gICAgYnV0dG9uLnRleHRDb250ZW50ID0gJ1x1MjNGMyBJbXBvcnRpbmdcdTIwMjYnO1xuICB9XG4gIF9zZXRQdWJsaWNhdGlvblN0YXR1cygnbWFzdGVyLXB1Yi1pbXBvcnQtc3RhdHVzJywgJ0ltcG9ydGluZyBCaWJUZVhcdTIwMjYnKTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS9wdWJsaWNhdGlvbnMvaW1wb3J0Jywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgYmlidGV4X3RleHQ6IGJpYnRleFRleHQsXG4gICAgICAgIG92ZXJ3cml0ZTogQm9vbGVhbihvdmVyd3JpdGU/LmNoZWNrZWQpLFxuICAgICAgfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEub2spIHtcbiAgICAgIGNvbnN0IHBhcnRzID0gW1xuICAgICAgICBgJHtkYXRhLmFkZGVkIHx8IDB9IGFkZGVkYCxcbiAgICAgICAgYCR7ZGF0YS51cGRhdGVkIHx8IDB9IHVwZGF0ZWRgLFxuICAgICAgICBgJHtkYXRhLnNraXBwZWQgfHwgMH0gc2tpcHBlZGAsXG4gICAgICBdO1xuICAgICAgaWYgKGRhdGEuaW52YWxpZCkgcGFydHMucHVzaChgJHtkYXRhLmludmFsaWR9IHJlamVjdGVkIChtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcylgKTtcbiAgICAgIGNvbnN0IHNraXBwZWREZXRhaWwgPSAoZGF0YS5za2lwcGVkX2tleXM/Lmxlbmd0aClcbiAgICAgICAgPyBgXFxuXFxuU2tpcHBlZCAoYWxyZWFkeSBleGlzdCBcdTIwMTQgZW5hYmxlIFwiT3ZlcndyaXRlXCIgdG8gdXBkYXRlKTpcXG5cdTIwMjIgJHtkYXRhLnNraXBwZWRfa2V5cy5qb2luKCdcXG5cdTIwMjIgJyl9YFxuICAgICAgICA6ICcnO1xuICAgICAgY29uc3QgaW52YWxpZERldGFpbCA9IChkYXRhLmludmFsaWRfa2V5cz8ubGVuZ3RoKVxuICAgICAgICA/IGBcXG5cXG5SZWplY3RlZCAobWlzc2luZyB0aXRsZSwgeWVhciwgb3IgYXV0aG9yKTpcXG5cdTIwMjIgJHtkYXRhLmludmFsaWRfa2V5cy5qb2luKCdcXG5cdTIwMjIgJyl9YFxuICAgICAgICA6ICcnO1xuICAgICAgX3NldFB1YmxpY2F0aW9uU3RhdHVzKCdtYXN0ZXItcHViLWltcG9ydC1zdGF0dXMnLCBgXHUyNzA1IEltcG9ydGVkOiAke3BhcnRzLmpvaW4oJywgJyl9LmAsICcjMTU4MDNkJyk7XG4gICAgICBfc2V0TWFzdGVyQ2hhbmdlTm90aWNlKCdQdWJsaWNhdGlvbnMnLCAnaW1wb3J0ZWQnKTtcbiAgICAgIGF3YWl0IGxvYWRQdWJsaWNhdGlvbnMoKTtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3MDUgSW1wb3J0ZWQnLCBgSW1wb3J0ZWQgQmliVGVYIGVudHJpZXM6ICR7cGFydHMuam9pbignLCAnKX0uJHtza2lwcGVkRGV0YWlsfSR7aW52YWxpZERldGFpbH1gKTtcbiAgICAgIGNsb3NlSW1wb3J0UHVibGljYXRpb25zTW9kYWwoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgX3NldFB1YmxpY2F0aW9uU3RhdHVzKCdtYXN0ZXItcHViLWltcG9ydC1zdGF0dXMnLCBgXHUyNzRDICR7ZGF0YS5lcnJvciB8fCAnSW1wb3J0IGZhaWxlZCd9YCwgJyNkYzI2MjYnKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIF9zZXRQdWJsaWNhdGlvblN0YXR1cygnbWFzdGVyLXB1Yi1pbXBvcnQtc3RhdHVzJywgYFx1Mjc0QyAke2Vyci5tZXNzYWdlfWAsICcjZGMyNjI2Jyk7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKGJ1dHRvbikge1xuICAgICAgYnV0dG9uLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICBidXR0b24udGV4dENvbnRlbnQgPSAnSW1wb3J0JztcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvd0NvbnZlcnRQdWJsaWNhdGlvbnNNb2RhbCgpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItY29udmVydC1pbnB1dCcpLnZhbHVlID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNvbnZlcnQtb3V0cHV0JykudmFsdWUgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItY29udmVydC1vdmVyd3JpdGUnKS5jaGVja2VkID0gZmFsc2U7XG4gIF9zZXRQdWJsaWNhdGlvblN0YXR1cygnbWFzdGVyLXB1Yi1jb252ZXJ0LXN0YXR1cycsICcnKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItY29udmVydC1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBzZXRJbml0aWFsRm9jdXMoJ21hc3Rlci1wdWItY29udmVydC1tb2RhbC1vdmVybGF5Jyk7XG4gIHRyYXBGb2N1cygnbWFzdGVyLXB1Yi1jb252ZXJ0LW1vZGFsLW92ZXJsYXknKTtcbn1cblxuZnVuY3Rpb24gY2xvc2VDb252ZXJ0UHVibGljYXRpb25zTW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNvbnZlcnQtbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHJlc3RvcmVGb2N1cygpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb252ZXJ0UHVibGljYXRpb25UZXh0KCkge1xuICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNvbnZlcnQtaW5wdXQnKTtcbiAgY29uc3Qgb3V0cHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItY29udmVydC1vdXRwdXQnKTtcbiAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItY29udmVydC1zdWJtaXQtYnRuJyk7XG4gIGlmICghaW5wdXQgfHwgIW91dHB1dCkgcmV0dXJuO1xuICBjb25zdCB0ZXh0ID0gaW5wdXQudmFsdWUudHJpbSgpO1xuICBpZiAoIXRleHQpIHtcbiAgICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItY29udmVydC1zdGF0dXMnLCAnXHUyNkEwXHVGRTBGIFBhc3RlIGNpdGF0aW9uIHRleHQgdG8gY29udmVydC4nLCAnI2RjMjYyNicpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoYnV0dG9uKSB7XG4gICAgYnV0dG9uLmRpc2FibGVkID0gdHJ1ZTtcbiAgICBidXR0b24udGV4dENvbnRlbnQgPSAnXHUyM0YzIEdlbmVyYXRpbmdcdTIwMjYnO1xuICB9XG4gIF9zZXRQdWJsaWNhdGlvblN0YXR1cygnbWFzdGVyLXB1Yi1jb252ZXJ0LXN0YXR1cycsICdHZW5lcmF0aW5nIEJpYlRlWCBwcmV2aWV3XHUyMDI2Jyk7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvcHVibGljYXRpb25zL2NvbnZlcnQnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyB0ZXh0IH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBvdXRwdXQudmFsdWUgPSBkYXRhLmJpYnRleCB8fCAnJztcbiAgICAgIF9zZXRQdWJsaWNhdGlvblN0YXR1cygnbWFzdGVyLXB1Yi1jb252ZXJ0LXN0YXR1cycsICdcdTI3MDUgUmV2aWV3IHRoZSBnZW5lcmF0ZWQgQmliVGVYLCB0aGVuIGltcG9ydCBpdCBpZiBpdCBsb29rcyBjb3JyZWN0LicsICcjMTU4MDNkJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIF9zZXRQdWJsaWNhdGlvblN0YXR1cygnbWFzdGVyLXB1Yi1jb252ZXJ0LXN0YXR1cycsIGBcdTI3NEMgJHtkYXRhLmVycm9yIHx8ICdDb252ZXJzaW9uIGZhaWxlZCd9YCwgJyNkYzI2MjYnKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIF9zZXRQdWJsaWNhdGlvblN0YXR1cygnbWFzdGVyLXB1Yi1jb252ZXJ0LXN0YXR1cycsIGBcdTI3NEMgJHtlcnIubWVzc2FnZX1gLCAnI2RjMjYyNicpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChidXR0b24pIHtcbiAgICAgIGJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgYnV0dG9uLnRleHRDb250ZW50ID0gJ0dlbmVyYXRlIEJpYlRlWCc7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGltcG9ydENvbnZlcnRlZFB1YmxpY2F0aW9uVGV4dCgpIHtcbiAgY29uc3Qgb3V0cHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItY29udmVydC1vdXRwdXQnKTtcbiAgY29uc3Qgb3ZlcndyaXRlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItY29udmVydC1vdmVyd3JpdGUnKTtcbiAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItY29udmVydC1pbXBvcnQtYnRuJyk7XG4gIGlmICghb3V0cHV0KSByZXR1cm47XG4gIGNvbnN0IGJpYnRleFRleHQgPSBvdXRwdXQudmFsdWUudHJpbSgpO1xuICBpZiAoIWJpYnRleFRleHQpIHtcbiAgICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItY29udmVydC1zdGF0dXMnLCAnXHUyNkEwXHVGRTBGIEdlbmVyYXRlIG9yIGVkaXQgQmliVGVYIGJlZm9yZSBpbXBvcnRpbmcuJywgJyNkYzI2MjYnKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGJ1dHRvbikge1xuICAgIGJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7XG4gICAgYnV0dG9uLnRleHRDb250ZW50ID0gJ1x1MjNGMyBJbXBvcnRpbmdcdTIwMjYnO1xuICB9XG4gIF9zZXRQdWJsaWNhdGlvblN0YXR1cygnbWFzdGVyLXB1Yi1jb252ZXJ0LXN0YXR1cycsICdJbXBvcnRpbmcgcmV2aWV3ZWQgQmliVGVYXHUyMDI2Jyk7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvcHVibGljYXRpb25zL2ltcG9ydCcsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGJpYnRleF90ZXh0OiBiaWJ0ZXhUZXh0LFxuICAgICAgICBvdmVyd3JpdGU6IEJvb2xlYW4ob3ZlcndyaXRlPy5jaGVja2VkKSxcbiAgICAgIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBjb25zdCBwYXJ0cyA9IFtcbiAgICAgICAgYCR7ZGF0YS5hZGRlZCB8fCAwfSBhZGRlZGAsXG4gICAgICAgIGAke2RhdGEudXBkYXRlZCB8fCAwfSB1cGRhdGVkYCxcbiAgICAgICAgYCR7ZGF0YS5za2lwcGVkIHx8IDB9IHNraXBwZWRgLFxuICAgICAgXTtcbiAgICAgIGlmIChkYXRhLmludmFsaWQpIHBhcnRzLnB1c2goYCR7ZGF0YS5pbnZhbGlkfSByZWplY3RlZCAobWlzc2luZyByZXF1aXJlZCBmaWVsZHMpYCk7XG4gICAgICBjb25zdCBza2lwcGVkRGV0YWlsID0gKGRhdGEuc2tpcHBlZF9rZXlzPy5sZW5ndGgpXG4gICAgICAgID8gYFxcblxcblNraXBwZWQgKGFscmVhZHkgZXhpc3QgXHUyMDE0IGVuYWJsZSBcIk92ZXJ3cml0ZVwiIHRvIHVwZGF0ZSk6XFxuXHUyMDIyICR7ZGF0YS5za2lwcGVkX2tleXMuam9pbignXFxuXHUyMDIyICcpfWBcbiAgICAgICAgOiAnJztcbiAgICAgIGNvbnN0IGludmFsaWREZXRhaWwgPSAoZGF0YS5pbnZhbGlkX2tleXM/Lmxlbmd0aClcbiAgICAgICAgPyBgXFxuXFxuUmVqZWN0ZWQgKG1pc3NpbmcgdGl0bGUsIHllYXIsIG9yIGF1dGhvcik6XFxuXHUyMDIyICR7ZGF0YS5pbnZhbGlkX2tleXMuam9pbignXFxuXHUyMDIyICcpfWBcbiAgICAgICAgOiAnJztcbiAgICAgIF9zZXRQdWJsaWNhdGlvblN0YXR1cygnbWFzdGVyLXB1Yi1jb252ZXJ0LXN0YXR1cycsIGBcdTI3MDUgSW1wb3J0ZWQgcHJldmlldzogJHtwYXJ0cy5qb2luKCcsICcpfS5gLCAnIzE1ODAzZCcpO1xuICAgICAgX3NldE1hc3RlckNoYW5nZU5vdGljZSgnUHVibGljYXRpb25zJywgJ2ltcG9ydGVkJyk7XG4gICAgICBhd2FpdCBsb2FkUHVibGljYXRpb25zKCk7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzA1IEltcG9ydGVkJywgYEltcG9ydGVkIGdlbmVyYXRlZCBCaWJUZVg6ICR7cGFydHMuam9pbignLCAnKX0uJHtza2lwcGVkRGV0YWlsfSR7aW52YWxpZERldGFpbH1gKTtcbiAgICAgIGNsb3NlQ29udmVydFB1YmxpY2F0aW9uc01vZGFsKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIF9zZXRQdWJsaWNhdGlvblN0YXR1cygnbWFzdGVyLXB1Yi1jb252ZXJ0LXN0YXR1cycsIGBcdTI3NEMgJHtkYXRhLmVycm9yIHx8ICdJbXBvcnQgZmFpbGVkJ31gLCAnI2RjMjYyNicpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgX3NldFB1YmxpY2F0aW9uU3RhdHVzKCdtYXN0ZXItcHViLWNvbnZlcnQtc3RhdHVzJywgYFx1Mjc0QyAke2Vyci5tZXNzYWdlfWAsICcjZGMyNjI2Jyk7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKGJ1dHRvbikge1xuICAgICAgYnV0dG9uLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICBidXR0b24udGV4dENvbnRlbnQgPSAnSW1wb3J0IFByZXZpZXcnO1xuICAgIH1cbiAgfVxufVxuXG4vLyAtLS0tIFB1YmxpY2F0aW9uIGFkZC9lZGl0IG1vZGFsIC0tLS1cblxuZnVuY3Rpb24gc2hvd0FkZFB1YmxpY2F0aW9uTW9kYWwoKSB7XG4gIF9wdWJNb2RhbFVzZXNFZGl0b3JGaWVsZCA9IGZhbHNlO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLW1vZGFsLWtleScpLnZhbHVlICAgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWItbW9kYWwtdHlwZScpLnZhbHVlICAgPSAnYXJ0aWNsZSc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWItbW9kYWwtYXV0aG9yJykudmFsdWUgPSAnJztcbiAgY29uc3QgYXV0aG9yTGFiZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLW1vZGFsLWF1dGhvci1sYWJlbCcpO1xuICBpZiAoYXV0aG9yTGFiZWwpIGF1dGhvckxhYmVsLnRleHRDb250ZW50ID0gJ0F1dGhvcihzKSc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWItbW9kYWwtdGl0bGUnKS52YWx1ZSAgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC15ZWFyJykudmFsdWUgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLW1vZGFsLWpvdXJuYWwnKS52YWx1ZSA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLW1vZGFsLWRvaScpLnZhbHVlICAgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWItbW9kYWwtZXh0cmEnKS52YWx1ZSAgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1rZXknKS5kaXNhYmxlZCA9IGZhbHNlO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLW1vZGFsLXRpdGxlLWhlYWRpbmcnKS50ZXh0Q29udGVudCA9ICdBZGQgUHVibGljYXRpb24nO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBzZXRJbml0aWFsRm9jdXMoJ21hc3Rlci1wdWItbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ21hc3Rlci1wdWItbW9kYWwtb3ZlcmxheScpO1xufVxuXG5mdW5jdGlvbiBlZGl0TWFzdGVyUHVibGljYXRpb24ocHViKSB7XG4gIGNvbnN0IGZpZWxkcyA9IHB1Yi5maWVsZHMgfHwge307XG4gIC8vIFRyYWNrIHdoZXRoZXIgdGhpcyBlbnRyeSB1c2VzIGBlZGl0b3JgIHNvIHdlIHByZXNlcnZlIGl0IG9uIHNhdmVcbiAgX3B1Yk1vZGFsVXNlc0VkaXRvckZpZWxkID0gIWZpZWxkcy5hdXRob3IgJiYgISFmaWVsZHMuZWRpdG9yO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLW1vZGFsLWtleScpLnZhbHVlICAgICA9IHB1Yi5rZXkgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWItbW9kYWwtdHlwZScpLnZhbHVlICAgID0gcHViLnR5cGUgfHwgJ2FydGljbGUnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLW1vZGFsLWF1dGhvcicpLnZhbHVlICA9IGZpZWxkcy5hdXRob3IgfHwgZmllbGRzLmVkaXRvciB8fCAnJztcbiAgLy8gVXBkYXRlIHRoZSBBdXRob3IvRWRpdG9yIGxhYmVsIHNvIHRoZSB1c2VyIGtub3dzIHdoaWNoIGZpZWxkIGlzIGJlaW5nIGVkaXRlZFxuICBjb25zdCBhdXRob3JMYWJlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWItbW9kYWwtYXV0aG9yLWxhYmVsJyk7XG4gIGlmIChhdXRob3JMYWJlbCkgYXV0aG9yTGFiZWwudGV4dENvbnRlbnQgPSBfcHViTW9kYWxVc2VzRWRpdG9yRmllbGQgPyAnRWRpdG9yKHMpJyA6ICdBdXRob3IocyknO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLW1vZGFsLXRpdGxlJykudmFsdWUgICA9IGZpZWxkcy50aXRsZSB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC15ZWFyJykudmFsdWUgICAgPSBmaWVsZHMueWVhciB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1qb3VybmFsJykudmFsdWUgPSBmaWVsZHMuam91cm5hbCB8fCBmaWVsZHMuYm9va3RpdGxlIHx8ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLW1vZGFsLWRvaScpLnZhbHVlICAgICA9IGZpZWxkcy5kb2kgfHwgJyc7XG4gIC8vIEV4dHJhOiByZW1haW5pbmcgbm9uLXN0YW5kYXJkIGZpZWxkcyBhcyBrZXk9dmFsdWUgbGluZXNcbiAgY29uc3Qga25vd24gPSBuZXcgU2V0KFsnYXV0aG9yJywnZWRpdG9yJywndGl0bGUnLCd5ZWFyJywnam91cm5hbCcsJ2Jvb2t0aXRsZScsJ2RvaSddKTtcbiAgY29uc3QgZXh0cmEgPSBPYmplY3QuZW50cmllcyhmaWVsZHMpXG4gICAgLmZpbHRlcigoW2tdKSA9PiAha25vd24uaGFzKGspKVxuICAgIC5tYXAoKFtrLCB2XSkgPT4gYCR7a309JHt2fWApXG4gICAgLmpvaW4oJ1xcbicpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLW1vZGFsLWV4dHJhJykudmFsdWUgICA9IGV4dHJhO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLW1vZGFsLWtleScpLmRpc2FibGVkICA9IHRydWU7ICAvLyBrZXkgaXMgaW1tdXRhYmxlIG9uIGVkaXRcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC10aXRsZS1oZWFkaW5nJykudGV4dENvbnRlbnQgPSAnRWRpdCBQdWJsaWNhdGlvbic7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICBfZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIHNldEluaXRpYWxGb2N1cygnbWFzdGVyLXB1Yi1tb2RhbC1vdmVybGF5Jyk7XG4gIHRyYXBGb2N1cygnbWFzdGVyLXB1Yi1tb2RhbC1vdmVybGF5Jyk7XG59XG5cbmZ1bmN0aW9uIGNsb3NlUHVibGljYXRpb25Nb2RhbCgpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHJlc3RvcmVGb2N1cygpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzYXZlTWFzdGVyUHVibGljYXRpb24oKSB7XG4gIGNvbnN0IGtleUVsICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWItbW9kYWwta2V5Jyk7XG4gIGNvbnN0IGtleSAgICA9IGtleUVsLnZhbHVlLnRyaW0oKTtcbiAgY29uc3QgYWN0aW9uID0ga2V5RWwuZGlzYWJsZWQgPyAndXBkYXRlJyA6ICdhZGQnO1xuICBpZiAoIWtleSkgeyBzaG93QWxlcnRNb2RhbCgnXHUyNkEwXHVGRTBGIFZhbGlkYXRpb24nLCAnQ2l0ZSBrZXkgaXMgcmVxdWlyZWQuJyk7IHJldHVybjsgfVxuICBjb25zdCB0eXBlICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLW1vZGFsLXR5cGUnKS52YWx1ZS50cmltKCkgfHwgJ2FydGljbGUnO1xuICBjb25zdCBhdXRob3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLW1vZGFsLWF1dGhvcicpLnZhbHVlLnRyaW0oKTtcbiAgY29uc3QgdGl0bGUgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC10aXRsZScpLnZhbHVlLnRyaW0oKTtcbiAgY29uc3QgeWVhciAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC15ZWFyJykudmFsdWUudHJpbSgpO1xuICBpZiAoIXRpdGxlKSAgeyBzaG93QWxlcnRNb2RhbCgnXHUyNkEwXHVGRTBGIFZhbGlkYXRpb24nLCAnVGl0bGUgaXMgcmVxdWlyZWQuJyk7IHJldHVybjsgfVxuICBpZiAoIXllYXIpICAgeyBzaG93QWxlcnRNb2RhbCgnXHUyNkEwXHVGRTBGIFZhbGlkYXRpb24nLCAnWWVhciBpcyByZXF1aXJlZC4nKTsgcmV0dXJuOyB9XG4gIGlmICghYXV0aG9yKSB7IHNob3dBbGVydE1vZGFsKCdcdTI2QTBcdUZFMEYgVmFsaWRhdGlvbicsICdBdXRob3Igb3IgZWRpdG9yIGlzIHJlcXVpcmVkLicpOyByZXR1cm47IH1cbiAgLy8gUHJlc2VydmUgdGhlIG9yaWdpbmFsIGZpZWxkIG5hbWU6IGVkaXRvciBlbnRyaWVzIG11c3Qgbm90IGJlIHNhdmVkIGFzIGF1dGhvclxuICBjb25zdCBmaWVsZHMgPSBfcHViTW9kYWxVc2VzRWRpdG9yRmllbGQgPyB7IGVkaXRvcjogYXV0aG9yLCB0aXRsZSwgeWVhciB9IDogeyBhdXRob3IsIHRpdGxlLCB5ZWFyIH07XG4gIGNvbnN0IGpvdXJuYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLW1vZGFsLWpvdXJuYWwnKS52YWx1ZS50cmltKCk7XG4gIGlmIChqb3VybmFsKSB7XG4gICAgZmllbGRzW3R5cGUgPT09ICdpbnByb2NlZWRpbmdzJyA/ICdib29rdGl0bGUnIDogJ2pvdXJuYWwnXSA9IGpvdXJuYWw7XG4gIH1cbiAgY29uc3QgZG9pID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1kb2knKS52YWx1ZS50cmltKCk7XG4gIGlmIChkb2kpIGZpZWxkcy5kb2kgPSBkb2k7XG4gIC8vIFBhcnNlIGV4dHJhIGZpZWxkcyAoa2V5PXZhbHVlIHBlciBsaW5lKVxuICBjb25zdCBleHRyYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWItbW9kYWwtZXh0cmEnKS52YWx1ZTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGV4dHJhLnNwbGl0KCdcXG4nKSkge1xuICAgIGNvbnN0IGVxID0gbGluZS5pbmRleE9mKCc9Jyk7XG4gICAgaWYgKGVxID4gMCkge1xuICAgICAgY29uc3QgayA9IGxpbmUuc2xpY2UoMCwgZXEpLnRyaW0oKTtcbiAgICAgIGNvbnN0IHYgPSBsaW5lLnNsaWNlKGVxICsgMSkudHJpbSgpO1xuICAgICAgaWYgKGsgJiYgdikgZmllbGRzW2tdID0gdjtcbiAgICB9XG4gIH1cbiAgY29uc3QgYm9keSA9IHsgYWN0aW9uLCBrZXksIHR5cGUsIGZpZWxkcyB9O1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS9wdWJsaWNhdGlvbicsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSwgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEub2spIHtcbiAgICAgIGNsb3NlUHVibGljYXRpb25Nb2RhbCgpO1xuICAgICAgX3NldE1hc3RlckNoYW5nZU5vdGljZSgnUHVibGljYXRpb25zJywgZGF0YS5hY3Rpb24gfHwgJ3VwZGF0ZWQnKTtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3MDUgU2F2ZWQnLCBgUHVibGljYXRpb24gXCIke2tleX1cIiAke2RhdGEuYWN0aW9ufS5gKTtcbiAgICAgIGF3YWl0IGxvYWRQdWJsaWNhdGlvbnMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsIGRhdGEuZXJyb3IgfHwgJ1NhdmUgZmFpbGVkJyk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsICdGYWlsZWQgdG8gc2F2ZSBwdWJsaWNhdGlvbicpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZU1hc3RlclB1YmxpY2F0aW9uKGtleSkge1xuICBzaG93Q29uZmlybU1vZGFsKFxuICAgICdcdUQ4M0RcdURERDFcdUZFMEYgRGVsZXRlIFB1YmxpY2F0aW9uJyxcbiAgICBgRGVsZXRlIFwiJHtrZXl9XCI/IFRoaXMgY2Fubm90IGJlIHVuZG9uZS5gLFxuICAgIGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS9wdWJsaWNhdGlvbicsIHtcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBhY3Rpb246ICdkZWxldGUnLCBrZXkgfSksXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgaWYgKGRhdGEub2spIHtcbiAgICAgICAgICBfc2V0TWFzdGVyQ2hhbmdlTm90aWNlKCdQdWJsaWNhdGlvbnMnLCAnZGVsZXRlZCcpO1xuICAgICAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3MDUgRGVsZXRlZCcsIGBQdWJsaWNhdGlvbiBcIiR7a2V5fVwiIHJlbW92ZWQuYCk7XG4gICAgICAgICAgYXdhaXQgbG9hZFB1YmxpY2F0aW9ucygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCBkYXRhLmVycm9yIHx8ICdEZWxldGUgZmFpbGVkJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsICdGYWlsZWQgdG8gZGVsZXRlIHB1YmxpY2F0aW9uJyk7XG4gICAgICB9XG4gICAgfVxuICApO1xufVxuXG5mdW5jdGlvbiBfcmVuZGVyQXdhcmRzTGlzdChhd2FyZHMpIHtcbiAgaWYgKCFhd2FyZHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuICc8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7cGFkZGluZzoxMnB4IDA7XCI+Tm8gYXdhcmRzIG9uIGZpbGUuIENsaWNrIFwiKyBBZGQgQXdhcmRcIiBhYm92ZS48L3A+JztcbiAgfVxuICBjb25zdCByb3dzID0gYXdhcmRzLm1hcCgoYXdhcmQsIGlkeCkgPT4ge1xuICAgIGNvbnN0IHRpdGxlID0gZXNjYXBlSHRtbChhd2FyZC50aXRsZSB8fCAnJyk7XG4gICAgY29uc3QgeWVhciAgPSBhd2FyZC55ZWFyID8gU3RyaW5nKGF3YXJkLnllYXIpIDogJ1x1MjAxNCc7XG4gICAgY29uc3QgZGVzYyAgPSBlc2NhcGVIdG1sKChhd2FyZC5kZXNjcmlwdGlvbiB8fCAnJykuc2xpY2UoMCwgMTAwKSk7XG4gICAgY29uc3QgYXdhcmRKc29uID0gZXNjYXBlSHRtbChKU09OLnN0cmluZ2lmeSh7XG4gICAgICB0aXRsZTogYXdhcmQudGl0bGUgfHwgJycsIHllYXI6IGF3YXJkLnllYXIgfHwgJycsXG4gICAgICBkZXNjcmlwdGlvbjogYXdhcmQuZGVzY3JpcHRpb24gfHwgJycsXG4gICAgICByZWxldmFudF9mb3I6IChhd2FyZC5yZWxldmFudF9mb3IgfHwgW10pLmpvaW4oJywgJyksXG4gICAgfSkpO1xuICAgIHJldHVybiBgXG4gICAgICA8dHI+XG4gICAgICAgIDx0ZD5cbiAgICAgICAgICA8c3Ryb25nPiR7dGl0bGV9PC9zdHJvbmc+XG4gICAgICAgICAgJHtkZXNjID8gYDxicj48c21hbGwgc3R5bGU9XCJjb2xvcjojNmI3MjgwO1wiPiR7ZGVzY30keyhhd2FyZC5kZXNjcmlwdGlvbnx8JycpLmxlbmd0aCA+IDEwMCA/ICdcdTIwMjYnIDogJyd9PC9zbWFsbD5gIDogJyd9XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO2NvbG9yOiM0NzU1Njk7XCI+JHt5ZWFyfTwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cImFjdGlvbi1idG5zXCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgb25jbGljaz1cImVkaXRNYXN0ZXJBd2FyZCgke2F3YXJkSnNvbn0sICR7aWR4fSlcIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiRWRpdCBhd2FyZDogJHt0aXRsZX1cIiB0aXRsZT1cIkVkaXRcIj5cdTI3MEZcdUZFMEY8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBvbmNsaWNrPVwiZGVsZXRlTWFzdGVyQXdhcmQoJHtpZHh9LCAnJHt0aXRsZX0nKVwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJEZWxldGUgYXdhcmQ6ICR7dGl0bGV9XCIgdGl0bGU9XCJEZWxldGVcIj5cdUQ4M0RcdURERDFcdUZFMEY8L2J1dHRvbj5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvdHI+YDtcbiAgfSkuam9pbignJyk7XG4gIHJldHVybiBgXG4gICAgPHRhYmxlIGNsYXNzPVwicmV2aWV3LXRhYmxlXCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiPlxuICAgICAgPHRoZWFkPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRoPkF3YXJkPC90aD5cbiAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDo3MHB4O3RleHQtYWxpZ246Y2VudGVyO1wiPlllYXI8L3RoPlxuICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOjgwcHg7XCI+QWN0aW9uczwvdGg+XG4gICAgICAgIDwvdHI+XG4gICAgICA8L3RoZWFkPlxuICAgICAgPHRib2R5PiR7cm93c308L3Rib2R5PlxuICAgIDwvdGFibGU+YDtcbn1cblxuXG5mdW5jdGlvbiBfcmVuZGVyQ2VydGlmaWNhdGlvbnNMaXN0KGNlcnRzKSB7XG4gIGlmICghY2VydHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuICc8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7cGFkZGluZzoxMnB4IDA7XCI+Tm8gY2VydGlmaWNhdGlvbnMgb24gZmlsZS4gQ2xpY2sgXCIrIEFkZCBDZXJ0aWZpY2F0aW9uXCIgYWJvdmUuPC9wPic7XG4gIH1cbiAgY29uc3Qgcm93cyA9IGNlcnRzLm1hcCgoY2VydCwgaWR4KSA9PiB7XG4gICAgY29uc3QgbmFtZSAgID0gZXNjYXBlSHRtbChjZXJ0Lm5hbWUgfHwgJycpO1xuICAgIGNvbnN0IGlzc3VlciA9IGVzY2FwZUh0bWwoY2VydC5pc3N1ZXIgfHwgJ1x1MjAxNCcpO1xuICAgIGNvbnN0IHllYXIgICA9IGNlcnQueWVhciA/IFN0cmluZyhjZXJ0LnllYXIpIDogJ1x1MjAxNCc7XG4gICAgY29uc3QgY2VydEpzb24gPSBlc2NhcGVIdG1sKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIG5hbWU6IGNlcnQubmFtZSB8fCAnJywgaXNzdWVyOiBjZXJ0Lmlzc3VlciB8fCAnJywgeWVhcjogY2VydC55ZWFyIHx8ICcnLFxuICAgIH0pKTtcbiAgICByZXR1cm4gYFxuICAgICAgPHRyPlxuICAgICAgICA8dGQ+PHN0cm9uZz4ke25hbWV9PC9zdHJvbmc+PC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwiY29sb3I6IzQ3NTU2OTtcIj4ke2lzc3Vlcn08L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjtjb2xvcjojNDc1NTY5O1wiPiR7eWVhcn08L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJhY3Rpb24tYnRuc1wiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIG9uY2xpY2s9XCJlZGl0TWFzdGVyQ2VydGlmaWNhdGlvbigke2NlcnRKc29ufSwgJHtpZHh9KVwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJFZGl0IGNlcnRpZmljYXRpb246ICR7bmFtZX1cIiB0aXRsZT1cIkVkaXRcIj5cdTI3MEZcdUZFMEY8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBvbmNsaWNrPVwiZGVsZXRlTWFzdGVyQ2VydGlmaWNhdGlvbigke2lkeH0sICcke25hbWV9JylcIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiRGVsZXRlIGNlcnRpZmljYXRpb246ICR7bmFtZX1cIiB0aXRsZT1cIkRlbGV0ZVwiPlx1RDgzRFx1REREMVx1RkUwRjwvYnV0dG9uPlxuICAgICAgICA8L3RkPlxuICAgICAgPC90cj5gO1xuICB9KS5qb2luKCcnKTtcbiAgcmV0dXJuIGBcbiAgICA8dGFibGUgY2xhc3M9XCJyZXZpZXctdGFibGVcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCI+XG4gICAgICA8dGhlYWQ+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8dGg+TmFtZTwvdGg+XG4gICAgICAgICAgPHRoPklzc3VlcjwvdGg+XG4gICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6NzBweDt0ZXh0LWFsaWduOmNlbnRlcjtcIj5ZZWFyPC90aD5cbiAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDo4MHB4O1wiPkFjdGlvbnM8L3RoPlxuICAgICAgICA8L3RyPlxuICAgICAgPC90aGVhZD5cbiAgICAgIDx0Ym9keT4ke3Jvd3N9PC90Ym9keT5cbiAgICA8L3RhYmxlPmA7XG59XG5cblxuZnVuY3Rpb24gX3JlbmRlck1hc3RlckFjaGlldmVtZW50c1RhYmxlKGFjaGlldmVtZW50cykge1xuICBpZiAoIWFjaGlldmVtZW50cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gJzxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtwYWRkaW5nOjEycHggMDtcIj5ObyBzZWxlY3RlZCBhY2hpZXZlbWVudHMgeWV0LiBVc2UgdGhlIEhhcnZlc3QgZmVhdHVyZSB0byBhZGQgYWNoaWV2ZW1lbnRzIGZyb20gYSBjb21wbGV0ZWQgc2Vzc2lvbiwgb3IgY2xpY2sgXCIrIEFkZCBBY2hpZXZlbWVudFwiIGFib3ZlLjwvcD4nO1xuICB9XG4gIGxldCByb3dzID0gYWNoaWV2ZW1lbnRzLm1hcChhY2ggPT4ge1xuICAgIGNvbnN0IGlkICAgICAgPSBlc2NhcGVIdG1sKGFjaC5pZCB8fCAnJyk7XG4gICAgY29uc3QgdGl0bGUgICA9IGVzY2FwZUh0bWwoYWNoLnRpdGxlIHx8ICcnKTtcbiAgICBjb25zdCBkZXNjICAgID0gZXNjYXBlSHRtbCgoYWNoLmRlc2NyaXB0aW9uIHx8ICcnKS5zbGljZSgwLCAxMDApKTtcbiAgICBjb25zdCBpbXAgICAgID0gYWNoLmltcG9ydGFuY2UgPz8gJ1x1MjAxNCc7XG4gICAgY29uc3QgcmVsRm9yICA9IGVzY2FwZUh0bWwoKGFjaC5yZWxldmFudF9mb3IgfHwgW10pLmpvaW4oJywgJykpO1xuICAgIHJldHVybiBgXG4gICAgICA8dHI+XG4gICAgICAgIDx0ZD48c3Ryb25nPiR7dGl0bGV9PC9zdHJvbmc+JHtkZXNjID8gYDxicj48c21hbGwgc3R5bGU9XCJjb2xvcjojNmI3MjgwO1wiPiR7ZGVzY30keyhhY2guZGVzY3JpcHRpb258fCcnKS5sZW5ndGggPiAxMDAgPyAnXHUyMDI2JyA6ICcnfTwvc21hbGw+YCA6ICcnfTwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO1wiPiR7aW1wfTwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07Y29sb3I6IzQ3NTU2OTtcIj4ke3JlbEZvciB8fCAnXHUyMDE0J308L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJhY3Rpb24tYnRuc1wiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIG9uY2xpY2s9XCJlZGl0TWFzdGVyQWNoaWV2ZW1lbnQoJHtlc2NhcGVIdG1sKEpTT04uc3RyaW5naWZ5KHtpZDogYWNoLmlkfHwnJywgdGl0bGU6IGFjaC50aXRsZXx8JycsIGRlc2NyaXB0aW9uOiBhY2guZGVzY3JpcHRpb258fCcnLCByZWxldmFudF9mb3I6IGFjaC5yZWxldmFudF9mb3J8fFtdLCBpbXBvcnRhbmNlOiBhY2guaW1wb3J0YW5jZXx8N30pKX0pXCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkVkaXQgYWNoaWV2ZW1lbnQ6ICR7dGl0bGV9XCIgdGl0bGU9XCJFZGl0XCI+XHUyNzBGXHVGRTBGPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgb25jbGljaz1cImRlbGV0ZU1hc3RlckFjaGlldmVtZW50KCcke2lkfScsICcke3RpdGxlfScpXCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkRlbGV0ZSBhY2hpZXZlbWVudDogJHt0aXRsZX1cIiB0aXRsZT1cIkRlbGV0ZVwiPlx1RDgzRFx1REREMVx1RkUwRjwvYnV0dG9uPlxuICAgICAgICA8L3RkPlxuICAgICAgPC90cj5gO1xuICB9KS5qb2luKCcnKTtcbiAgcmV0dXJuIGBcbiAgICA8dGFibGUgY2xhc3M9XCJyZXZpZXctdGFibGVcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCI+XG4gICAgICA8dGhlYWQ+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8dGg+QWNoaWV2ZW1lbnQ8L3RoPlxuICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOjYwcHg7dGV4dC1hbGlnbjpjZW50ZXI7XCI+SW1wb3J0YW5jZTwvdGg+XG4gICAgICAgICAgPHRoPlJlbGV2YW50IGZvcjwvdGg+XG4gICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6ODBweDtcIj5BY3Rpb25zPC90aD5cbiAgICAgICAgPC90cj5cbiAgICAgIDwvdGhlYWQ+XG4gICAgICA8dGJvZHk+JHtyb3dzfTwvdGJvZHk+XG4gICAgPC90YWJsZT5gO1xufVxuXG5mdW5jdGlvbiBfcmVuZGVyU3VtbWFyaWVzTGlzdChzdW1tYXJpZXMpIHtcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHN1bW1hcmllcyk7XG4gIGlmICgha2V5cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gJzxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtwYWRkaW5nOjEycHggMDtcIj5ObyBwcm9mZXNzaW9uYWwgc3VtbWFyeSB2YXJpYW50cyB5ZXQuIENsaWNrIFwiKyBBZGQgU3VtbWFyeVwiIGFib3ZlIHRvIGNyZWF0ZSB5b3VyIGZpcnN0IG9uZS48L3A+JztcbiAgfVxuICByZXR1cm4ga2V5cy5tYXAoa2V5ID0+IHtcbiAgICBjb25zdCB0ZXh0ICAgID0gdHlwZW9mIHN1bW1hcmllc1trZXldID09PSAnc3RyaW5nJyA/IHN1bW1hcmllc1trZXldIDogSlNPTi5zdHJpbmdpZnkoc3VtbWFyaWVzW2tleV0pO1xuICAgIGNvbnN0IHByZXZpZXcgPSBlc2NhcGVIdG1sKHRleHQuc2xpY2UoMCwgMjAwKSk7XG4gICAgY29uc3Qga2V5RXNjICA9IGVzY2FwZUh0bWwoa2V5KTtcbiAgICByZXR1cm4gYFxuICAgICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1zdW1tYXJ5LWNhcmRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1zdW1tYXJ5LWhlYWRlclwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWFzdGVyLXN1bW1hcnkta2V5XCI+JHtrZXlFc2N9PC9zcGFuPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24tYnRuc1wiIHN0eWxlPVwiZ2FwOjRweDtcIj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIG9uY2xpY2s9XCJlZGl0TWFzdGVyU3VtbWFyeSgke2VzY2FwZUh0bWwoSlNPTi5zdHJpbmdpZnkoe2tleSwgdGV4dH0pKX0pXCJcbiAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiRWRpdCBzdW1tYXJ5OiAke2tleUVzY31cIiB0aXRsZT1cIkVkaXRcIj5cdTI3MEZcdUZFMEY8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIG9uY2xpY2s9XCJkZWxldGVNYXN0ZXJTdW1tYXJ5KCcke2tleUVzY30nKVwiXG4gICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkRlbGV0ZSBzdW1tYXJ5OiAke2tleUVzY31cIiB0aXRsZT1cIkRlbGV0ZVwiPlx1RDgzRFx1REREMVx1RkUwRjwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1zdW1tYXJ5LXByZXZpZXdcIj4ke3ByZXZpZXd9JHt0ZXh0Lmxlbmd0aCA+IDIwMCA/ICdcdTIwMjYnIDogJyd9PC9kaXY+XG4gICAgICA8L2Rpdj5gO1xuICB9KS5qb2luKCcnKTtcbn1cblxuZnVuY3Rpb24gc2hvd0FkZEFjaGlldmVtZW50TW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhY2gtbW9kYWwtaWQnKS52YWx1ZSAgICAgICAgICAgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhY2gtbW9kYWwtdGl0bGUtaW5wdXQnKS52YWx1ZSAgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhY2gtbW9kYWwtZGVzYy1pbnB1dCcpLnZhbHVlICAgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhY2gtbW9kYWwtcmVsZXZhbnQtaW5wdXQnKS52YWx1ZSA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLW1vZGFsLWltcG9ydGFuY2UtaW5wdXQnKS52YWx1ZSA9ICc3JztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1hY2gtbW9kYWwtdGl0bGUnKS50ZXh0Q29udGVudCA9ICdBZGQgQWNoaWV2ZW1lbnQnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWFjaC1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBzZXRJbml0aWFsRm9jdXMoJ21hc3Rlci1hY2gtbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ21hc3Rlci1hY2gtbW9kYWwtb3ZlcmxheScpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLW1vZGFsLXRpdGxlLWlucHV0JykuZm9jdXMoKTtcbn1cblxuZnVuY3Rpb24gZWRpdE1hc3RlckFjaGlldmVtZW50KGFjaCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLW1vZGFsLWlkJykudmFsdWUgICAgICAgICAgICAgID0gYWNoLmlkIHx8ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLW1vZGFsLXRpdGxlLWlucHV0JykudmFsdWUgICAgID0gYWNoLnRpdGxlIHx8ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLW1vZGFsLWRlc2MtaW5wdXQnKS52YWx1ZSAgICAgID0gYWNoLmRlc2NyaXB0aW9uIHx8ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLW1vZGFsLXJlbGV2YW50LWlucHV0JykudmFsdWUgID0gKGFjaC5yZWxldmFudF9mb3IgfHwgW10pLmpvaW4oJywgJyk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhY2gtbW9kYWwtaW1wb3J0YW5jZS1pbnB1dCcpLnZhbHVlID0gYWNoLmltcG9ydGFuY2UgfHwgNztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1hY2gtbW9kYWwtdGl0bGUnKS50ZXh0Q29udGVudCA9ICdFZGl0IEFjaGlldmVtZW50JztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1hY2gtbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgc2V0SW5pdGlhbEZvY3VzKCdtYXN0ZXItYWNoLW1vZGFsLW92ZXJsYXknKTtcbiAgdHJhcEZvY3VzKCdtYXN0ZXItYWNoLW1vZGFsLW92ZXJsYXknKTtcbn1cblxuZnVuY3Rpb24gY2xvc2VNYXN0ZXJBY2hNb2RhbCgpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1hY2gtbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHJlc3RvcmVGb2N1cygpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzYXZlTWFzdGVyQWNoaWV2ZW1lbnQoKSB7XG4gIGNvbnN0IGlkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaC1tb2RhbC1pZCcpLnZhbHVlLnRyaW0oKSB8fFxuICAgICAgICAgICAgICdzYV8nICsgRGF0ZS5ub3coKTtcbiAgY29uc3QgdGl0bGUgICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLW1vZGFsLXRpdGxlLWlucHV0JykudmFsdWUudHJpbSgpO1xuICBjb25zdCBkZXNjcmlwdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhY2gtbW9kYWwtZGVzYy1pbnB1dCcpLnZhbHVlLnRyaW0oKTtcbiAgY29uc3QgcmVsZXZhbnRSYXcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLW1vZGFsLXJlbGV2YW50LWlucHV0JykudmFsdWU7XG4gIGNvbnN0IGltcG9ydGFuY2UgID0gcGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaC1tb2RhbC1pbXBvcnRhbmNlLWlucHV0JykudmFsdWUsIDEwKSB8fCA3O1xuXG4gIGlmICghdGl0bGUpIHtcbiAgICBzaG93QWxlcnRNb2RhbCgnXHUyNkEwXHVGRTBGIFZhbGlkYXRpb24nLCAnVGl0bGUgaXMgcmVxdWlyZWQuJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHJlbGV2YW50X2ZvciA9IHJlbGV2YW50UmF3LnNwbGl0KCcsJykubWFwKHMgPT4gcy50cmltKCkpLmZpbHRlcihCb29sZWFuKTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL3VwZGF0ZS1hY2hpZXZlbWVudCcsIHtcbiAgICAgIG1ldGhvZDogICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogICAgSlNPTi5zdHJpbmdpZnkoeyBpZCwgdGl0bGUsIGRlc2NyaXB0aW9uLCByZWxldmFudF9mb3IsIGltcG9ydGFuY2UgfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEub2spIHtcbiAgICAgIGNsb3NlTWFzdGVyQWNoTW9kYWwoKTtcbiAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ1NlbGVjdGVkIEFjaGlldmVtZW50cycsIGRhdGEuYWN0aW9uIHx8ICd1cGRhdGVkJyk7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzA1IFNhdmVkJywgYEFjaGlldmVtZW50IFwiJHt0aXRsZX1cIiAke2RhdGEuYWN0aW9ufS5gKTtcbiAgICAgIGF3YWl0IHBvcHVsYXRlTWFzdGVyVGFiKCk7ICAvLyByZWZyZXNoXG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCBkYXRhLmVycm9yIHx8ICdTYXZlIGZhaWxlZCcpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIHNhdmUgYWNoaWV2ZW1lbnQnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG93QWRkU3VtbWFyeU1vZGFsKCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3VtLW1vZGFsLWtleS1pbnB1dCcpLnZhbHVlICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3VtLW1vZGFsLXRleHQtaW5wdXQnKS52YWx1ZSA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXN1bS1tb2RhbC10aXRsZScpLnRleHRDb250ZW50ID0gJ0FkZCBQcm9mZXNzaW9uYWwgU3VtbWFyeSc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItc3VtLW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICBfZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIHNldEluaXRpYWxGb2N1cygnbWFzdGVyLXN1bS1tb2RhbC1vdmVybGF5Jyk7XG4gIHRyYXBGb2N1cygnbWFzdGVyLXN1bS1tb2RhbC1vdmVybGF5Jyk7XG59XG5cbmZ1bmN0aW9uIGVkaXRNYXN0ZXJTdW1tYXJ5KG9iaikge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3VtLW1vZGFsLWtleS1pbnB1dCcpLnZhbHVlICA9IG9iai5rZXkgIHx8ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3VtLW1vZGFsLXRleHQtaW5wdXQnKS52YWx1ZSA9IG9iai50ZXh0IHx8ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXN1bS1tb2RhbC10aXRsZScpLnRleHRDb250ZW50ID0gJ0VkaXQgUHJvZmVzc2lvbmFsIFN1bW1hcnknO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXN1bS1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBzZXRJbml0aWFsRm9jdXMoJ21hc3Rlci1zdW0tbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ21hc3Rlci1zdW0tbW9kYWwtb3ZlcmxheScpO1xufVxuXG5mdW5jdGlvbiBjbG9zZU1hc3RlclN1bU1vZGFsKCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXN1bS1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgcmVzdG9yZUZvY3VzKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNhdmVNYXN0ZXJTdW1tYXJ5KCkge1xuICBjb25zdCBrZXkgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1bS1tb2RhbC1rZXktaW5wdXQnKS52YWx1ZS50cmltKCk7XG4gIGNvbnN0IHRleHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3VtLW1vZGFsLXRleHQtaW5wdXQnKS52YWx1ZS50cmltKCk7XG4gIGlmICgha2V5IHx8ICF0ZXh0KSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjZBMFx1RkUwRiBWYWxpZGF0aW9uJywgJ0JvdGggS2V5IGFuZCBTdW1tYXJ5IHRleHQgYXJlIHJlcXVpcmVkLicpO1xuICAgIHJldHVybjtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL3VwZGF0ZS1zdW1tYXJ5Jywge1xuICAgICAgbWV0aG9kOiAgJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiAgICBKU09OLnN0cmluZ2lmeSh7IGtleSwgdGV4dCB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgY2xvc2VNYXN0ZXJTdW1Nb2RhbCgpO1xuICAgICAgX3NldE1hc3RlckNoYW5nZU5vdGljZSgnUHJvZmVzc2lvbmFsIFN1bW1hcmllcycsIGRhdGEuYWN0aW9uIHx8ICd1cGRhdGVkJyk7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzA1IFNhdmVkJywgYFN1bW1hcnkgXCIke2tleX1cIiAke2RhdGEuYWN0aW9ufS5gKTtcbiAgICAgIGF3YWl0IHBvcHVsYXRlTWFzdGVyVGFiKCk7ICAvLyByZWZyZXNoXG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCBkYXRhLmVycm9yIHx8ICdTYXZlIGZhaWxlZCcpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIHNhdmUgc3VtbWFyeScpO1xuICB9XG59XG5cbi8vIC0tLS0gUGVyc29uYWwgSW5mbyBtb2RhbCBoYW5kbGVycyAtLS0tXG5cbmZ1bmN0aW9uIHNob3dFZGl0UGVyc29uYWxJbmZvTW9kYWwoKSB7XG4gIGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL2Z1bGwnKVxuICAgIC50aGVuKHIgPT4gci5qc29uKCkpXG4gICAgLnRoZW4oZGF0YSA9PiB7XG4gICAgICBjb25zdCBwaSAgICAgID0gZGF0YS5wZXJzb25hbF9pbmZvIHx8IHt9O1xuICAgICAgY29uc3QgY29udGFjdCA9IHBpLmNvbnRhY3QgfHwge307XG4gICAgICBjb25zdCBhZGRyZXNzID0gY29udGFjdC5hZGRyZXNzIHx8IHt9O1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BpLW5hbWUtaW5wdXQnKS52YWx1ZSAgICA9IHBpLm5hbWUgfHwgJyc7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGktdGl0bGUtaW5wdXQnKS52YWx1ZSAgID0gcGkudGl0bGUgfHwgcGkuaGVhZGxpbmUgfHwgJyc7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGktZW1haWwtaW5wdXQnKS52YWx1ZSAgID0gY29udGFjdC5lbWFpbCB8fCBwaS5lbWFpbCB8fCAnJztcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwaS1waG9uZS1pbnB1dCcpLnZhbHVlICAgPSBjb250YWN0LnBob25lIHx8ICcnO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BpLWxpbmtlZGluLWlucHV0JykudmFsdWUgPSBjb250YWN0LmxpbmtlZGluIHx8ICcnO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BpLXdlYnNpdGUtaW5wdXQnKS52YWx1ZSAgPSBjb250YWN0LndlYnNpdGUgfHwgJyc7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGktY2l0eS1pbnB1dCcpLnZhbHVlICAgID0gYWRkcmVzcy5jaXR5IHx8ICcnO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BpLXN0YXRlLWlucHV0JykudmFsdWUgICA9IGFkZHJlc3Muc3RhdGUgfHwgJyc7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXBpLW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICAgICAgX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgICAgc2V0SW5pdGlhbEZvY3VzKCdtYXN0ZXItcGktbW9kYWwtb3ZlcmxheScpO1xuICAgICAgdHJhcEZvY3VzKCdtYXN0ZXItcGktbW9kYWwtb3ZlcmxheScpO1xuICAgIH0pXG4gICAgLmNhdGNoKCgpID0+IHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnQ291bGQgbm90IGxvYWQgcGVyc29uYWwgaW5mbycpKTtcbn1cblxuZnVuY3Rpb24gY2xvc2VQZXJzb25hbEluZm9Nb2RhbCgpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1waS1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgcmVzdG9yZUZvY3VzKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNhdmVQZXJzb25hbEluZm8oKSB7XG4gIGNvbnN0IGJvZHkgPSB7XG4gICAgbmFtZTogICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwaS1uYW1lLWlucHV0JykudmFsdWUudHJpbSgpLFxuICAgIHRpdGxlOiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGktdGl0bGUtaW5wdXQnKS52YWx1ZS50cmltKCksXG4gICAgZW1haWw6ICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwaS1lbWFpbC1pbnB1dCcpLnZhbHVlLnRyaW0oKSxcbiAgICBwaG9uZTogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BpLXBob25lLWlucHV0JykudmFsdWUudHJpbSgpLFxuICAgIGxpbmtlZGluOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGktbGlua2VkaW4taW5wdXQnKS52YWx1ZS50cmltKCksXG4gICAgd2Vic2l0ZTogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwaS13ZWJzaXRlLWlucHV0JykudmFsdWUudHJpbSgpLFxuICAgIGNpdHk6ICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGktY2l0eS1pbnB1dCcpLnZhbHVlLnRyaW0oKSxcbiAgICBzdGF0ZTogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BpLXN0YXRlLWlucHV0JykudmFsdWUudHJpbSgpLFxuICB9O1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS9wZXJzb25hbC1pbmZvJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LCBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgY2xvc2VQZXJzb25hbEluZm9Nb2RhbCgpO1xuICAgICAgX3NldE1hc3RlckNoYW5nZU5vdGljZSgnUGVyc29uYWwgSW5mb3JtYXRpb24nLCAndXBkYXRlZCcpO1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjcwNSBTYXZlZCcsICdQZXJzb25hbCBpbmZvcm1hdGlvbiB1cGRhdGVkLicpO1xuICAgICAgYXdhaXQgcG9wdWxhdGVNYXN0ZXJUYWIoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsIGRhdGEuZXJyb3IgfHwgJ1NhdmUgZmFpbGVkJyk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsICdGYWlsZWQgdG8gc2F2ZSBwZXJzb25hbCBpbmZvJyk7XG4gIH1cbn1cblxuLy8gLS0tLSBFeHBlcmllbmNlIG1vZGFsIGhhbmRsZXJzIC0tLS1cblxuZnVuY3Rpb24gc2hvd0FkZEV4cGVyaWVuY2VNb2RhbCgpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC1tb2RhbC1pZCcpLnZhbHVlICAgICAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLXRpdGxlLWlucHV0JykudmFsdWUgICAgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtY29tcGFueS1pbnB1dCcpLnZhbHVlICAgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC1jaXR5LWlucHV0JykudmFsdWUgICAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLXN0YXRlLWlucHV0JykudmFsdWUgICAgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtc3RhcnQtaW5wdXQnKS52YWx1ZSAgICAgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC1lbmQtaW5wdXQnKS52YWx1ZSAgICAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLXR5cGUtaW5wdXQnKS52YWx1ZSAgICAgID0gJ2Z1bGxfdGltZSc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtaW1wb3J0YW5jZS1pbnB1dCcpLnZhbHVlID0gJzUnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLXRhZ3MtaW5wdXQnKS52YWx1ZSAgICAgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItZXhwLW1vZGFsLXRpdGxlJykudGV4dENvbnRlbnQgPSAnQWRkIFdvcmsgRXhwZXJpZW5jZSc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItZXhwLW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICBfbWFzdGVyRXhwTW9kYWxBY2hpZXZlbWVudHMgPSBbXTtcbiAgX3JlbmRlckV4cEFjaGlldmVtZW50c0VkaXRvcigpO1xuICBfZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIHNldEluaXRpYWxGb2N1cygnbWFzdGVyLWV4cC1tb2RhbC1vdmVybGF5Jyk7XG4gIHRyYXBGb2N1cygnbWFzdGVyLWV4cC1tb2RhbC1vdmVybGF5Jyk7XG59XG5cbi8vIFdvcmtpbmcgY29weSBvZiB0aGUgY3VycmVudGx5LWVkaXRlZCBleHBlcmllbmNlJ3MgYWNoaWV2ZW1lbnRzIHdoaWxlIHRoZVxuLy8gbW9kYWwgaXMgb3BlbiAoR0FQLTE5IDE2LjExKS4gZWRpdE1hc3RlckV4cGVyaWVuY2UoKSB0YWtlcyBhbiBpZCAobm90IHRoZVxuLy8gZnVsbCBvYmplY3QpIGFuZCBsb29rcyBpdCB1cCBmcm9tIHdpbmRvdy5fbWFzdGVyRXhwZXJpZW5jZUZ1bGxEYXRhIFx1MjAxNFxuLy8gYWNoaWV2ZW1lbnQgdGV4dCBjYW4gY29udGFpbiBxdW90ZXMvdW5pY29kZSB0aGF0IHdvdWxkIGJlIGZyYWdpbGUgdG9cbi8vIGVtYmVkIGRpcmVjdGx5IGluc2lkZSBhbiBpbmxpbmUgb25jbGljayBhdHRyaWJ1dGUuXG5sZXQgX21hc3RlckV4cE1vZGFsQWNoaWV2ZW1lbnRzID0gW107XG5cbmZ1bmN0aW9uIF9hY2hpZXZlbWVudFRleHQoYSkge1xuICByZXR1cm4gdHlwZW9mIGEgPT09ICdzdHJpbmcnID8gYSA6IChhICYmIGEudGV4dCkgfHwgJyc7XG59XG5cbmZ1bmN0aW9uIF9yZW5kZXJFeHBBY2hpZXZlbWVudHNFZGl0b3IoKSB7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtYWNoaWV2ZW1lbnRzLWVkaXRvci1saXN0Jyk7XG4gIGlmICghY29udGFpbmVyKSByZXR1cm47XG4gIGNvbnN0IGxhc3RJZHggPSBfbWFzdGVyRXhwTW9kYWxBY2hpZXZlbWVudHMubGVuZ3RoIC0gMTtcbiAgY29udGFpbmVyLmlubmVySFRNTCA9IF9tYXN0ZXJFeHBNb2RhbEFjaGlldmVtZW50cy5tYXAoKGFjaCwgaWR4KSA9PiBgXG4gICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6NnB4O2FsaWduLWl0ZW1zOmNlbnRlcjttYXJnaW4tYm90dG9tOjZweDtcIj5cbiAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZWRpdC1pbnB1dCBleHAtYWNoLXRleHQtaW5wdXRcIiBkYXRhLWlkeD1cIiR7aWR4fVwiIHN0eWxlPVwiZmxleDoxO1wiXG4gICAgICAgICAgdmFsdWU9XCIke2VzY2FwZUh0bWwoX2FjaGlldmVtZW50VGV4dChhY2gpKX1cIiBhcmlhLWxhYmVsPVwiQWNoaWV2ZW1lbnQgJHtpZHggKyAxfSB0ZXh0XCIgLz5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiaWNvbi1idG5cIiBvbmNsaWNrPVwiX21vdmVFeHBBY2hpZXZlbWVudCgke2lkeH0sIC0xKVwiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIk1vdmUgYWNoaWV2ZW1lbnQgJHtpZHggKyAxfSB1cFwiIHRpdGxlPVwiTW92ZSB1cFwiICR7aWR4ID09PSAwID8gJ2Rpc2FibGVkJyA6ICcnfT5cdTIxOTE8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiaWNvbi1idG5cIiBvbmNsaWNrPVwiX21vdmVFeHBBY2hpZXZlbWVudCgke2lkeH0sIDEpXCJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiTW92ZSBhY2hpZXZlbWVudCAke2lkeCArIDF9IGRvd25cIiB0aXRsZT1cIk1vdmUgZG93blwiICR7aWR4ID09PSBsYXN0SWR4ID8gJ2Rpc2FibGVkJyA6ICcnfT5cdTIxOTM8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiaWNvbi1idG5cIiBvbmNsaWNrPVwiX2RlbGV0ZUV4cEFjaGlldmVtZW50KCR7aWR4fSlcIlxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJEZWxldGUgYWNoaWV2ZW1lbnQgJHtpZHggKyAxfVwiIHRpdGxlPVwiRGVsZXRlXCI+XHVEODNEXHVEREQxXHVGRTBGPC9idXR0b24+XG4gICAgPC9kaXY+YCkuam9pbignJykgfHwgJzxwIHN0eWxlPVwiY29sb3I6Izk0YTNiODtmb250LXNpemU6MC44NWVtO21hcmdpbjowIDAgNnB4O1wiPk5vIGFjaGlldmVtZW50cyB5ZXQuPC9wPic7XG59XG5cbi8vIFJlYWQgYW55IGluLXByb2dyZXNzIGVkaXRzIG91dCBvZiB0aGUgYWNoaWV2ZW1lbnQgdGV4dCBpbnB1dHMgYmVmb3JlIGFcbi8vIHJlb3JkZXIvZGVsZXRlL3NhdmUgcmVidWlsZHMgdGhlIGxpc3QgZnJvbSBfbWFzdGVyRXhwTW9kYWxBY2hpZXZlbWVudHMgXHUyMDE0XG4vLyBvdGhlcndpc2UgYW4gdW4tc3VibWl0dGVkIHRleHQgZWRpdCB3b3VsZCBiZSBzaWxlbnRseSBsb3N0IG9uIHJlLXJlbmRlci5cbmZ1bmN0aW9uIF9zeW5jRXhwQWNoaWV2ZW1lbnRzRnJvbUlucHV0cygpIHtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmV4cC1hY2gtdGV4dC1pbnB1dCcpLmZvckVhY2goKGlucHV0KSA9PiB7XG4gICAgY29uc3QgaWR4ID0gcGFyc2VJbnQoaW5wdXQuZGF0YXNldC5pZHgsIDEwKTtcbiAgICBjb25zdCBhY2ggPSBfbWFzdGVyRXhwTW9kYWxBY2hpZXZlbWVudHNbaWR4XTtcbiAgICBpZiAodHlwZW9mIGFjaCA9PT0gJ3N0cmluZycgfHwgYWNoID09IG51bGwpIHtcbiAgICAgIF9tYXN0ZXJFeHBNb2RhbEFjaGlldmVtZW50c1tpZHhdID0gaW5wdXQudmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFjaC50ZXh0ID0gaW5wdXQudmFsdWU7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gX2FkZEV4cEFjaGlldmVtZW50KCkge1xuICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtYWNoLW5ldy1pbnB1dCcpO1xuICBjb25zdCB0ZXh0ID0gKGlucHV0LnZhbHVlIHx8ICcnKS50cmltKCk7XG4gIGlmICghdGV4dCkgcmV0dXJuO1xuICBfc3luY0V4cEFjaGlldmVtZW50c0Zyb21JbnB1dHMoKTtcbiAgX21hc3RlckV4cE1vZGFsQWNoaWV2ZW1lbnRzLnB1c2godGV4dCk7XG4gIGlucHV0LnZhbHVlID0gJyc7XG4gIF9yZW5kZXJFeHBBY2hpZXZlbWVudHNFZGl0b3IoKTtcbn1cblxuZnVuY3Rpb24gX21vdmVFeHBBY2hpZXZlbWVudChpZHgsIGRlbHRhKSB7XG4gIF9zeW5jRXhwQWNoaWV2ZW1lbnRzRnJvbUlucHV0cygpO1xuICBjb25zdCB0YXJnZXQgPSBpZHggKyBkZWx0YTtcbiAgaWYgKHRhcmdldCA8IDAgfHwgdGFyZ2V0ID49IF9tYXN0ZXJFeHBNb2RhbEFjaGlldmVtZW50cy5sZW5ndGgpIHJldHVybjtcbiAgY29uc3QgW2l0ZW1dID0gX21hc3RlckV4cE1vZGFsQWNoaWV2ZW1lbnRzLnNwbGljZShpZHgsIDEpO1xuICBfbWFzdGVyRXhwTW9kYWxBY2hpZXZlbWVudHMuc3BsaWNlKHRhcmdldCwgMCwgaXRlbSk7XG4gIF9yZW5kZXJFeHBBY2hpZXZlbWVudHNFZGl0b3IoKTtcbn1cblxuZnVuY3Rpb24gX2RlbGV0ZUV4cEFjaGlldmVtZW50KGlkeCkge1xuICBfc3luY0V4cEFjaGlldmVtZW50c0Zyb21JbnB1dHMoKTtcbiAgX21hc3RlckV4cE1vZGFsQWNoaWV2ZW1lbnRzLnNwbGljZShpZHgsIDEpO1xuICBfcmVuZGVyRXhwQWNoaWV2ZW1lbnRzRWRpdG9yKCk7XG59XG5cbmZ1bmN0aW9uIGVkaXRNYXN0ZXJFeHBlcmllbmNlKGlkKSB7XG4gIGNvbnN0IGV4cCA9ICh3aW5kb3cuX21hc3RlckV4cGVyaWVuY2VGdWxsRGF0YSB8fCBbXSkuZmluZCgoZSkgPT4gZS5pZCA9PT0gaWQpO1xuICBpZiAoIWV4cCkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnQ291bGQgbm90IGZpbmQgdGhhdCBleHBlcmllbmNlIGVudHJ5IFx1MjAxNCB0cnkgcmVmcmVzaGluZyB0aGUgdGFiLicpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBsb2MgPSBleHAubG9jYXRpb24gfHwge307XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtbW9kYWwtaWQnKS52YWx1ZSAgICAgICAgID0gZXhwLmlkIHx8ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLXRpdGxlLWlucHV0JykudmFsdWUgICAgICA9IGV4cC50aXRsZSB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC1jb21wYW55LWlucHV0JykudmFsdWUgICAgPSBleHAuY29tcGFueSB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC1jaXR5LWlucHV0JykudmFsdWUgICAgICAgPSBsb2MuY2l0eSB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC1zdGF0ZS1pbnB1dCcpLnZhbHVlICAgICAgPSBsb2Muc3RhdGUgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtc3RhcnQtaW5wdXQnKS52YWx1ZSAgICAgID0gZXhwLnN0YXJ0X2RhdGUgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtZW5kLWlucHV0JykudmFsdWUgICAgICAgID0gZXhwLmVuZF9kYXRlIHx8ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLXR5cGUtaW5wdXQnKS52YWx1ZSAgICAgICA9IGV4cC5lbXBsb3ltZW50X3R5cGUgfHwgJ2Z1bGxfdGltZSc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtaW1wb3J0YW5jZS1pbnB1dCcpLnZhbHVlICA9IGV4cC5pbXBvcnRhbmNlIHx8IDU7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtdGFncy1pbnB1dCcpLnZhbHVlICAgICAgID0gdHlwZW9mIGV4cC50YWdzID09PSAnc3RyaW5nJyA/IGV4cC50YWdzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChleHAudGFncyB8fCBbXSkuam9pbignLCAnKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1leHAtbW9kYWwtdGl0bGUnKS50ZXh0Q29udGVudCA9ICdFZGl0IFdvcmsgRXhwZXJpZW5jZSc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItZXhwLW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICBfbWFzdGVyRXhwTW9kYWxBY2hpZXZlbWVudHMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGV4cC5hY2hpZXZlbWVudHMgfHwgW10pKTtcbiAgX3JlbmRlckV4cEFjaGlldmVtZW50c0VkaXRvcigpO1xuICBfZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIHNldEluaXRpYWxGb2N1cygnbWFzdGVyLWV4cC1tb2RhbC1vdmVybGF5Jyk7XG4gIHRyYXBGb2N1cygnbWFzdGVyLWV4cC1tb2RhbC1vdmVybGF5Jyk7XG59XG5cbmZ1bmN0aW9uIGNsb3NlRXhwZXJpZW5jZU1vZGFsKCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWV4cC1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgcmVzdG9yZUZvY3VzKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNhdmVNYXN0ZXJFeHBlcmllbmNlKCkge1xuICBjb25zdCBpZCAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLW1vZGFsLWlkJykudmFsdWUudHJpbSgpO1xuICBjb25zdCB0aXRsZSAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLXRpdGxlLWlucHV0JykudmFsdWUudHJpbSgpO1xuICBjb25zdCBjb21wYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC1jb21wYW55LWlucHV0JykudmFsdWUudHJpbSgpO1xuICBpZiAoIXRpdGxlIHx8ICFjb21wYW55KSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjZBMFx1RkUwRiBWYWxpZGF0aW9uJywgJ0pvYiB0aXRsZSBhbmQgY29tcGFueSBhcmUgcmVxdWlyZWQuJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHRhZ3NSYXcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLXRhZ3MtaW5wdXQnKS52YWx1ZTtcbiAgX3N5bmNFeHBBY2hpZXZlbWVudHNGcm9tSW5wdXRzKCk7XG4gIGNvbnN0IGV4cERhdGEgPSB7XG4gICAgdGl0bGUsIGNvbXBhbnksXG4gICAgY2l0eTogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLWNpdHktaW5wdXQnKS52YWx1ZS50cmltKCksXG4gICAgc3RhdGU6ICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLXN0YXRlLWlucHV0JykudmFsdWUudHJpbSgpLFxuICAgIHN0YXJ0X2RhdGU6ICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC1zdGFydC1pbnB1dCcpLnZhbHVlLnRyaW0oKSxcbiAgICBlbmRfZGF0ZTogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtZW5kLWlucHV0JykudmFsdWUudHJpbSgpLFxuICAgIGVtcGxveW1lbnRfdHlwZTogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC10eXBlLWlucHV0JykudmFsdWUsXG4gICAgaW1wb3J0YW5jZTogICAgICBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLWltcG9ydGFuY2UtaW5wdXQnKS52YWx1ZSwgMTApIHx8IDUsXG4gICAgdGFnczogICAgICAgICAgICB0YWdzUmF3LnNwbGl0KCcsJykubWFwKHMgPT4gcy50cmltKCkpLmZpbHRlcihCb29sZWFuKSxcbiAgICBhY2hpZXZlbWVudHM6ICAgIF9tYXN0ZXJFeHBNb2RhbEFjaGlldmVtZW50cyxcbiAgfTtcbiAgY29uc3QgYWN0aW9uID0gaWQgPyAndXBkYXRlJyA6ICdhZGQnO1xuICBjb25zdCBib2R5ICAgPSBhY3Rpb24gPT09ICd1cGRhdGUnID8geyBhY3Rpb24sIGlkLCBleHBlcmllbmNlOiBleHBEYXRhIH0gOiB7IGFjdGlvbiwgZXhwZXJpZW5jZTogZXhwRGF0YSB9O1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS9leHBlcmllbmNlJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LCBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgY2xvc2VFeHBlcmllbmNlTW9kYWwoKTtcbiAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ1dvcmsgRXhwZXJpZW5jZScsIGRhdGEuYWN0aW9uIHx8ICd1cGRhdGVkJyk7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzA1IFNhdmVkJywgYEV4cGVyaWVuY2UgXCIke3RpdGxlfVwiICR7ZGF0YS5hY3Rpb259LmApO1xuICAgICAgYXdhaXQgcG9wdWxhdGVNYXN0ZXJUYWIoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsIGRhdGEuZXJyb3IgfHwgJ1NhdmUgZmFpbGVkJyk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsICdGYWlsZWQgdG8gc2F2ZSBleHBlcmllbmNlJyk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlTWFzdGVyRXhwZXJpZW5jZShpZCwgdGl0bGUpIHtcbiAgc2hvd0NvbmZpcm1Nb2RhbChcbiAgICAnXHVEODNEXHVEREQxXHVGRTBGIERlbGV0ZSBFeHBlcmllbmNlJyxcbiAgICBgRGVsZXRlIFwiJHt0aXRsZX1cIj8gVGhpcyBjYW5ub3QgYmUgdW5kb25lLmAsXG4gICAgYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL2V4cGVyaWVuY2UnLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgYWN0aW9uOiAnZGVsZXRlJywgaWQgfSksXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgaWYgKGRhdGEub2spIHtcbiAgICAgICAgICBfc2V0TWFzdGVyQ2hhbmdlTm90aWNlKCdXb3JrIEV4cGVyaWVuY2UnLCBkYXRhLmFjdGlvbiB8fCAnZGVsZXRlZCcpO1xuICAgICAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3MDUgRGVsZXRlZCcsIGBFeHBlcmllbmNlIFwiJHt0aXRsZX1cIiByZW1vdmVkLmApO1xuICAgICAgICAgIGF3YWl0IHBvcHVsYXRlTWFzdGVyVGFiKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsIGRhdGEuZXJyb3IgfHwgJ0RlbGV0ZSBmYWlsZWQnKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgJ0ZhaWxlZCB0byBkZWxldGUgZXhwZXJpZW5jZScpO1xuICAgICAgfVxuICAgIH1cbiAgKTtcbn1cblxuLy8gLS0tLSBTa2lsbCBtb2RhbCBoYW5kbGVycyAtLS0tXG5cbmZ1bmN0aW9uIHNob3dBZGRTa2lsbE1vZGFsKGNhdGVnb3J5S2V5LCBpc0ZsYXQpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NraWxsLW1vZGFsLWNhdGVnb3J5JykudmFsdWUgPSBjYXRlZ29yeUtleSB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NraWxsLW1vZGFsLWlzLWZsYXQnKS52YWx1ZSAgPSBpc0ZsYXQgPyAnMScgOiAnMCc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1tb2RhbC1vcmlnaW5hbC1uYW1lJykudmFsdWUgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NraWxsLW5hbWUtaW5wdXQnKS52YWx1ZSAgICAgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NraWxsLWV4cGVyaWVuY2VzLWlucHV0JykudmFsdWUgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NraWxsLWFsaWFzZXMtaW5wdXQnKS52YWx1ZSAgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NraWxsLXllYXJzLWlucHV0JykudmFsdWUgICAgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1za2lsbC1tb2RhbC10aXRsZScpLnRleHRDb250ZW50ID0gJ0FkZCBTa2lsbCc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItc2tpbGwtc2F2ZS1idG4nKS50ZXh0Q29udGVudCA9ICdBZGQgU2tpbGwnO1xuICBjb25zdCBoaW50cyA9ICh3aW5kb3cuX21hc3RlckV4cGVyaWVuY2VPcHRpb25zIHx8IFtdKVxuICAgIC5zbGljZSgwLCA4KVxuICAgIC5tYXAoKHgpID0+IGAke3guaWR9ICgke3gubGFiZWx9KWApXG4gICAgLmpvaW4oJyBcdTAwQjcgJyk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1leHBlcmllbmNlLWhpbnRzJykudGV4dENvbnRlbnQgPSBoaW50cyA/IGBBdmFpbGFibGU6ICR7aGludHN9YCA6ICcnO1xuICBjb25zdCBjYXRSb3cgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtY2F0ZWdvcnktcm93Jyk7XG4gIGlmIChjYXRlZ29yeUtleSkge1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1jYXRlZ29yeS1kaXNwbGF5JykudGV4dENvbnRlbnQgPSBjYXRlZ29yeUtleTtcbiAgICBjYXRSb3cuc3R5bGUuZGlzcGxheSA9ICcnO1xuICB9IGVsc2Uge1xuICAgIGNhdFJvdy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICB9XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItc2tpbGwtbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgc2V0SW5pdGlhbEZvY3VzKCdtYXN0ZXItc2tpbGwtbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ21hc3Rlci1za2lsbC1tb2RhbC1vdmVybGF5Jyk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1uYW1lLWlucHV0JykuZm9jdXMoKTtcbn1cblxuZnVuY3Rpb24gZWRpdE1hc3RlclNraWxsKHNraWxsT2JqLCBjYXRlZ29yeUtleSwgaXNGbGF0KSB7XG4gIGNvbnN0IG5hbWUgPSB0eXBlb2Ygc2tpbGxPYmogPT09ICdzdHJpbmcnID8gc2tpbGxPYmogOiAoc2tpbGxPYmo/Lm5hbWUgfHwgJycpO1xuICBjb25zdCBleHBlcmllbmNlcyA9IEFycmF5LmlzQXJyYXkoc2tpbGxPYmo/LmV4cGVyaWVuY2VzKSA/IHNraWxsT2JqLmV4cGVyaWVuY2VzIDogW107XG4gIGNvbnN0IGFsaWFzZXMgPSBBcnJheS5pc0FycmF5KHNraWxsT2JqPy5hbGlhc2VzKSA/IHNraWxsT2JqLmFsaWFzZXMgOiBbXTtcbiAgY29uc3QgeWVhcnMgPSAodHlwZW9mIHNraWxsT2JqID09PSAnb2JqZWN0JyAmJiBza2lsbE9iaj8ueWVhcnMgIT0gbnVsbCkgPyBza2lsbE9iai55ZWFycyA6ICcnO1xuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1tb2RhbC1jYXRlZ29yeScpLnZhbHVlID0gY2F0ZWdvcnlLZXkgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1tb2RhbC1pcy1mbGF0JykudmFsdWUgID0gaXNGbGF0ID8gJzEnIDogJzAnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtbW9kYWwtb3JpZ2luYWwtbmFtZScpLnZhbHVlID0gbmFtZTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NraWxsLW5hbWUtaW5wdXQnKS52YWx1ZSA9IG5hbWU7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1leHBlcmllbmNlcy1pbnB1dCcpLnZhbHVlID0gZXhwZXJpZW5jZXMuam9pbignLCAnKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NraWxsLWFsaWFzZXMtaW5wdXQnKS52YWx1ZSA9IGFsaWFzZXMuam9pbignLCAnKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NraWxsLXllYXJzLWlucHV0JykudmFsdWUgPSB5ZWFycztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1za2lsbC1tb2RhbC10aXRsZScpLnRleHRDb250ZW50ID0gJ0VkaXQgU2tpbGwnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXNraWxsLXNhdmUtYnRuJykudGV4dENvbnRlbnQgPSAnU2F2ZSBTa2lsbCc7XG5cbiAgY29uc3QgaGludHMgPSAod2luZG93Ll9tYXN0ZXJFeHBlcmllbmNlT3B0aW9ucyB8fCBbXSlcbiAgICAuc2xpY2UoMCwgOClcbiAgICAubWFwKCh4KSA9PiBgJHt4LmlkfSAoJHt4LmxhYmVsfSlgKVxuICAgIC5qb2luKCcgXHUwMEI3ICcpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtZXhwZXJpZW5jZS1oaW50cycpLnRleHRDb250ZW50ID0gaGludHMgPyBgQXZhaWxhYmxlOiAke2hpbnRzfWAgOiAnJztcblxuICBjb25zdCBjYXRSb3cgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtY2F0ZWdvcnktcm93Jyk7XG4gIGlmIChjYXRlZ29yeUtleSkge1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1jYXRlZ29yeS1kaXNwbGF5JykudGV4dENvbnRlbnQgPSBjYXRlZ29yeUtleTtcbiAgICBjYXRSb3cuc3R5bGUuZGlzcGxheSA9ICcnO1xuICB9IGVsc2Uge1xuICAgIGNhdFJvdy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICB9XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1za2lsbC1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBzZXRJbml0aWFsRm9jdXMoJ21hc3Rlci1za2lsbC1tb2RhbC1vdmVybGF5Jyk7XG4gIHRyYXBGb2N1cygnbWFzdGVyLXNraWxsLW1vZGFsLW92ZXJsYXknKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NraWxsLW5hbWUtaW5wdXQnKS5mb2N1cygpO1xufVxuXG5mdW5jdGlvbiBjbG9zZVNraWxsTW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItc2tpbGwtbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHJlc3RvcmVGb2N1cygpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzYXZlTWFzdGVyU2tpbGwoKSB7XG4gIGNvbnN0IHNraWxsICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NraWxsLW5hbWUtaW5wdXQnKS52YWx1ZS50cmltKCk7XG4gIGNvbnN0IGNhdGVnb3J5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NraWxsLW1vZGFsLWNhdGVnb3J5JykudmFsdWUudHJpbSgpO1xuICBjb25zdCBpc0ZsYXQgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1tb2RhbC1pcy1mbGF0JykudmFsdWUgPT09ICcxJztcbiAgY29uc3Qgb3JpZ2luYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtbW9kYWwtb3JpZ2luYWwtbmFtZScpLnZhbHVlLnRyaW0oKTtcbiAgY29uc3QgZXhwZXJpZW5jZXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtZXhwZXJpZW5jZXMtaW5wdXQnKS52YWx1ZVxuICAgIC5zcGxpdCgnLCcpXG4gICAgLm1hcCgocykgPT4gcy50cmltKCkpXG4gICAgLmZpbHRlcihCb29sZWFuKTtcbiAgY29uc3QgYWxpYXNlcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1hbGlhc2VzLWlucHV0JykudmFsdWVcbiAgICAuc3BsaXQoJywnKVxuICAgIC5tYXAoKHMpID0+IHMudHJpbSgpKVxuICAgIC5maWx0ZXIoQm9vbGVhbik7XG4gIGNvbnN0IHllYXJzUmF3ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NraWxsLXllYXJzLWlucHV0JykudmFsdWUudHJpbSgpO1xuICBjb25zdCB5ZWFycyA9IHllYXJzUmF3ID09PSAnJyA/IG51bGwgOiBwYXJzZUZsb2F0KHllYXJzUmF3KTtcbiAgaWYgKCFza2lsbCkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI2QTBcdUZFMEYgVmFsaWRhdGlvbicsICdTa2lsbCBuYW1lIGlzIHJlcXVpcmVkLicpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoeWVhcnMgIT09IG51bGwgJiYgIU51bWJlci5pc0Zpbml0ZSh5ZWFycykpIHtcbiAgICBzaG93QWxlcnRNb2RhbCgnXHUyNkEwXHVGRTBGIFZhbGlkYXRpb24nLCAnWWVhcnMgb2YgZXhwZXJpZW5jZSBtdXN0IGJlIGEgZmluaXRlIG51bWJlci4nKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgaXNVcGRhdGUgPSBCb29sZWFuKG9yaWdpbmFsKTtcbiAgY29uc3QgYmFzZUJvZHkgPSB7XG4gICAgYWN0aW9uOiBpc1VwZGF0ZSA/ICd1cGRhdGUnIDogJ2FkZCcsXG4gICAgc2tpbGw6IGlzVXBkYXRlID8gb3JpZ2luYWwgOiBza2lsbCxcbiAgICAuLi4oaXNVcGRhdGUgPyB7IHNraWxsX25ldzogc2tpbGwgfSA6IHt9KSxcbiAgICBleHBlcmllbmNlcyxcbiAgICBhbGlhc2VzLFxuICAgIHllYXJzLFxuICB9O1xuICBjb25zdCBib2R5ID0gaXNGbGF0ID8gYmFzZUJvZHkgOiB7IC4uLmJhc2VCb2R5LCBjYXRlZ29yeSB9O1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS9za2lsbCcsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSwgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEub2spIHtcbiAgICAgIGNsb3NlU2tpbGxNb2RhbCgpO1xuICAgICAgX3NldE1hc3RlckNoYW5nZU5vdGljZSgnU2tpbGxzJywgZGF0YS5hY3Rpb24gfHwgJ3VwZGF0ZWQnKTtcbiAgICAgIGF3YWl0IHBvcHVsYXRlTWFzdGVyVGFiKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCBkYXRhLmVycm9yIHx8ICdDb3VsZCBub3QgYWRkIHNraWxsJyk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsICdGYWlsZWQgdG8gYWRkIHNraWxsJyk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlTWFzdGVyU2tpbGwoc2tpbGwsIGNhdGVnb3J5LCBpc0ZsYXQpIHtcbiAgY29uc3QgYm9keSA9IGlzRmxhdCA/IHsgYWN0aW9uOiAnZGVsZXRlJywgc2tpbGwgfSA6IHsgYWN0aW9uOiAnZGVsZXRlJywgc2tpbGwsIGNhdGVnb3J5IH07XG4gIGNvbnN0IHNjb3BlID0gaXNGbGF0ID8gJ1NraWxscycgOiBgU2tpbGxzIFx1MjE5MiAke2NhdGVnb3J5fWA7XG4gIHNob3dDb25maXJtTW9kYWwoXG4gICAgJ1x1RDgzRFx1REREMVx1RkUwRiBEZWxldGUgU2tpbGwnLFxuICAgIGBEZWxldGUgc2tpbGwgXCIke3NraWxsfVwiIGZyb20gJHtzY29wZX0/IFRoaXMgY2Fubm90IGJlIHVuZG9uZS5gLFxuICAgIGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS9za2lsbCcsIHtcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICAgICAgX3NldE1hc3RlckNoYW5nZU5vdGljZSgnU2tpbGxzJywgZGF0YS5hY3Rpb24gfHwgJ3VwZGF0ZWQnKTtcbiAgICAgICAgICBhd2FpdCBwb3B1bGF0ZU1hc3RlclRhYigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCBkYXRhLmVycm9yIHx8ICdDb3VsZCBub3QgcmVtb3ZlIHNraWxsJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsICdGYWlsZWQgdG8gcmVtb3ZlIHNraWxsJyk7XG4gICAgICB9XG4gICAgfVxuICApO1xufVxuXG4vLyAtLS0tIEVkdWNhdGlvbiBtb2RhbCBoYW5kbGVycyAtLS0tXG5cbmZ1bmN0aW9uIHNob3dBZGRFZHVjYXRpb25Nb2RhbCgpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkdS1tb2RhbC1pZHgnKS52YWx1ZSAgICAgICAgICAgID0gJy0xJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkdS1kZWdyZWUtaW5wdXQnKS52YWx1ZSAgICAgICAgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtZmllbGQtaW5wdXQnKS52YWx1ZSAgICAgICAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LWluc3RpdHV0aW9uLWlucHV0JykudmFsdWUgICAgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkdS1jaXR5LWlucHV0JykudmFsdWUgICAgICAgICAgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtc3RhdGUtaW5wdXQnKS52YWx1ZSAgICAgICAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LXN0YXJ0LXllYXItaW5wdXQnKS52YWx1ZSAgICAgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkdS1lbmQteWVhci1pbnB1dCcpLnZhbHVlICAgICAgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItZWR1LW1vZGFsLXRpdGxlJykudGV4dENvbnRlbnQgPSAnQWRkIEVkdWNhdGlvbic7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItZWR1LW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICBfZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIHNldEluaXRpYWxGb2N1cygnbWFzdGVyLWVkdS1tb2RhbC1vdmVybGF5Jyk7XG4gIHRyYXBGb2N1cygnbWFzdGVyLWVkdS1tb2RhbC1vdmVybGF5Jyk7XG59XG5cbmZ1bmN0aW9uIGVkaXRNYXN0ZXJFZHVjYXRpb24oZWR1LCBpZHgpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkdS1tb2RhbC1pZHgnKS52YWx1ZSAgICAgICAgID0gaWR4O1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LWRlZ3JlZS1pbnB1dCcpLnZhbHVlICAgICAgPSBlZHUuZGVncmVlIHx8ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LWZpZWxkLWlucHV0JykudmFsdWUgICAgICAgPSBlZHUuZmllbGQgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtaW5zdGl0dXRpb24taW5wdXQnKS52YWx1ZSA9IGVkdS5pbnN0aXR1dGlvbiB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkdS1jaXR5LWlucHV0JykudmFsdWUgICAgICAgID0gZWR1LmNpdHkgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtc3RhdGUtaW5wdXQnKS52YWx1ZSAgICAgICA9IGVkdS5zdGF0ZSB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkdS1zdGFydC15ZWFyLWlucHV0JykudmFsdWUgID0gZWR1LnN0YXJ0X3llYXIgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtZW5kLXllYXItaW5wdXQnKS52YWx1ZSAgICA9IGVkdS5lbmRfeWVhciB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1lZHUtbW9kYWwtdGl0bGUnKS50ZXh0Q29udGVudCA9ICdFZGl0IEVkdWNhdGlvbic7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItZWR1LW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICBfZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIHNldEluaXRpYWxGb2N1cygnbWFzdGVyLWVkdS1tb2RhbC1vdmVybGF5Jyk7XG4gIHRyYXBGb2N1cygnbWFzdGVyLWVkdS1tb2RhbC1vdmVybGF5Jyk7XG59XG5cbmZ1bmN0aW9uIGNsb3NlRWR1Y2F0aW9uTW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItZWR1LW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICByZXN0b3JlRm9jdXMoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZU1hc3RlckVkdWNhdGlvbigpIHtcbiAgY29uc3QgaWR4ICAgICA9IHBhcnNlSW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtbW9kYWwtaWR4JykudmFsdWUsIDEwKTtcbiAgY29uc3QgZGVncmVlICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtZGVncmVlLWlucHV0JykudmFsdWUudHJpbSgpO1xuICBjb25zdCBpbnN0aXR1dGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtaW5zdGl0dXRpb24taW5wdXQnKS52YWx1ZS50cmltKCk7XG4gIGlmICghZGVncmVlIHx8ICFpbnN0aXR1dGlvbikge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI2QTBcdUZFMEYgVmFsaWRhdGlvbicsICdEZWdyZWUgYW5kIGluc3RpdHV0aW9uIGFyZSByZXF1aXJlZC4nKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgYWN0aW9uID0gaWR4ID49IDAgPyAndXBkYXRlJyA6ICdhZGQnO1xuICBjb25zdCBib2R5ID0ge1xuICAgIGFjdGlvbixcbiAgICBkZWdyZWUsXG4gICAgZmllbGQ6ICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtZmllbGQtaW5wdXQnKS52YWx1ZS50cmltKCksXG4gICAgaW5zdGl0dXRpb24sXG4gICAgY2l0eTogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtY2l0eS1pbnB1dCcpLnZhbHVlLnRyaW0oKSxcbiAgICBzdGF0ZTogICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkdS1zdGF0ZS1pbnB1dCcpLnZhbHVlLnRyaW0oKSxcbiAgICBzdGFydF95ZWFyOiAgcGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkdS1zdGFydC15ZWFyLWlucHV0JykudmFsdWUsIDEwKSB8fCBudWxsLFxuICAgIGVuZF95ZWFyOiAgICBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LWVuZC15ZWFyLWlucHV0JykudmFsdWUsIDEwKSB8fCBudWxsLFxuICAgIC4uLihhY3Rpb24gPT09ICd1cGRhdGUnID8geyBpZHggfSA6IHt9KSxcbiAgfTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvZWR1Y2F0aW9uJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LCBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgY2xvc2VFZHVjYXRpb25Nb2RhbCgpO1xuICAgICAgX3NldE1hc3RlckNoYW5nZU5vdGljZSgnRWR1Y2F0aW9uJywgZGF0YS5hY3Rpb24gfHwgJ3VwZGF0ZWQnKTtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3MDUgU2F2ZWQnLCBgRWR1Y2F0aW9uIFwiJHtkZWdyZWV9IFx1MjAxMyAke2luc3RpdHV0aW9ufVwiICR7ZGF0YS5hY3Rpb259LmApO1xuICAgICAgYXdhaXQgcG9wdWxhdGVNYXN0ZXJUYWIoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsIGRhdGEuZXJyb3IgfHwgJ1NhdmUgZmFpbGVkJyk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsICdGYWlsZWQgdG8gc2F2ZSBlZHVjYXRpb24nKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVNYXN0ZXJFZHVjYXRpb24oaWR4LCBpbnN0aXR1dGlvbikge1xuICBzaG93Q29uZmlybU1vZGFsKFxuICAgICdcdUQ4M0RcdURERDFcdUZFMEYgRGVsZXRlIEVkdWNhdGlvbicsXG4gICAgYERlbGV0ZSBcIiR7aW5zdGl0dXRpb259XCI/IFRoaXMgY2Fubm90IGJlIHVuZG9uZS5gLFxuICAgIGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS9lZHVjYXRpb24nLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgYWN0aW9uOiAnZGVsZXRlJywgaWR4IH0pLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICAgICAgX3NldE1hc3RlckNoYW5nZU5vdGljZSgnRWR1Y2F0aW9uJywgZGF0YS5hY3Rpb24gfHwgJ2RlbGV0ZWQnKTtcbiAgICAgICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzA1IERlbGV0ZWQnLCBgRWR1Y2F0aW9uIGVudHJ5IHJlbW92ZWQuYCk7XG4gICAgICAgICAgYXdhaXQgcG9wdWxhdGVNYXN0ZXJUYWIoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgZGF0YS5lcnJvciB8fCAnRGVsZXRlIGZhaWxlZCcpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIGRlbGV0ZSBlZHVjYXRpb24gZW50cnknKTtcbiAgICAgIH1cbiAgICB9XG4gICk7XG59XG5cbi8vIC0tLS0gQXdhcmQgbW9kYWwgaGFuZGxlcnMgLS0tLVxuXG5mdW5jdGlvbiBzaG93QWRkQXdhcmRNb2RhbCgpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F3YXJkLW1vZGFsLWlkeCcpLnZhbHVlICAgID0gJy0xJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F3YXJkLXRpdGxlLWlucHV0JykudmFsdWUgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhd2FyZC15ZWFyLWlucHV0JykudmFsdWUgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXdhcmQtZGVzYy1pbnB1dCcpLnZhbHVlICAgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F3YXJkLXJlbGV2YW50LWlucHV0JykudmFsdWUgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1hd2FyZC1tb2RhbC10aXRsZScpLnRleHRDb250ZW50ID0gJ0FkZCBBd2FyZCAvIEhvbm91cic7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItYXdhcmQtbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgc2V0SW5pdGlhbEZvY3VzKCdtYXN0ZXItYXdhcmQtbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ21hc3Rlci1hd2FyZC1tb2RhbC1vdmVybGF5Jyk7XG59XG5cbmZ1bmN0aW9uIGVkaXRNYXN0ZXJBd2FyZChhd2FyZCwgaWR4KSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhd2FyZC1tb2RhbC1pZHgnKS52YWx1ZSAgICAgPSBpZHg7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhd2FyZC10aXRsZS1pbnB1dCcpLnZhbHVlICAgPSBhd2FyZC50aXRsZSB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F3YXJkLXllYXItaW5wdXQnKS52YWx1ZSAgICA9IGF3YXJkLnllYXIgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhd2FyZC1kZXNjLWlucHV0JykudmFsdWUgICAgPSBhd2FyZC5kZXNjcmlwdGlvbiB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F3YXJkLXJlbGV2YW50LWlucHV0JykudmFsdWUgPSB0eXBlb2YgYXdhcmQucmVsZXZhbnRfZm9yID09PSAnc3RyaW5nJ1xuICAgID8gYXdhcmQucmVsZXZhbnRfZm9yIDogKGF3YXJkLnJlbGV2YW50X2ZvciB8fCBbXSkuam9pbignLCAnKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1hd2FyZC1tb2RhbC10aXRsZScpLnRleHRDb250ZW50ID0gJ0VkaXQgQXdhcmQgLyBIb25vdXInO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWF3YXJkLW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICBfZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIHNldEluaXRpYWxGb2N1cygnbWFzdGVyLWF3YXJkLW1vZGFsLW92ZXJsYXknKTtcbiAgdHJhcEZvY3VzKCdtYXN0ZXItYXdhcmQtbW9kYWwtb3ZlcmxheScpO1xufVxuXG5mdW5jdGlvbiBjbG9zZUF3YXJkTW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItYXdhcmQtbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHJlc3RvcmVGb2N1cygpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzYXZlTWFzdGVyQXdhcmQoKSB7XG4gIGNvbnN0IGlkeCAgID0gcGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F3YXJkLW1vZGFsLWlkeCcpLnZhbHVlLCAxMCk7XG4gIGNvbnN0IHRpdGxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F3YXJkLXRpdGxlLWlucHV0JykudmFsdWUudHJpbSgpO1xuICBpZiAoIXRpdGxlKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjZBMFx1RkUwRiBWYWxpZGF0aW9uJywgJ0F3YXJkIHRpdGxlIGlzIHJlcXVpcmVkLicpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBhY3Rpb24gPSBpZHggPj0gMCA/ICd1cGRhdGUnIDogJ2FkZCc7XG4gIGNvbnN0IHJlbGV2YW50UmF3ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F3YXJkLXJlbGV2YW50LWlucHV0JykudmFsdWU7XG4gIGNvbnN0IGJvZHkgPSB7XG4gICAgYWN0aW9uLCB0aXRsZSxcbiAgICB5ZWFyOiAgICAgICAgIHBhcnNlSW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhd2FyZC15ZWFyLWlucHV0JykudmFsdWUsIDEwKSB8fCBudWxsLFxuICAgIGRlc2NyaXB0aW9uOiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F3YXJkLWRlc2MtaW5wdXQnKS52YWx1ZS50cmltKCksXG4gICAgcmVsZXZhbnRfZm9yOiByZWxldmFudFJhdy5zcGxpdCgnLCcpLm1hcChzID0+IHMudHJpbSgpKS5maWx0ZXIoQm9vbGVhbiksXG4gICAgLi4uKGFjdGlvbiA9PT0gJ3VwZGF0ZScgPyB7IGlkeCB9IDoge30pLFxuICB9O1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS9hd2FyZCcsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSwgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEub2spIHtcbiAgICAgIGNsb3NlQXdhcmRNb2RhbCgpO1xuICAgICAgX3NldE1hc3RlckNoYW5nZU5vdGljZSgnQXdhcmRzICYgSG9ub3VycycsIGRhdGEuYWN0aW9uIHx8ICd1cGRhdGVkJyk7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzA1IFNhdmVkJywgYEF3YXJkIFwiJHt0aXRsZX1cIiAke2RhdGEuYWN0aW9ufS5gKTtcbiAgICAgIGF3YWl0IHBvcHVsYXRlTWFzdGVyVGFiKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCBkYXRhLmVycm9yIHx8ICdTYXZlIGZhaWxlZCcpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIHNhdmUgYXdhcmQnKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVNYXN0ZXJBd2FyZChpZHgsIHRpdGxlKSB7XG4gIHNob3dDb25maXJtTW9kYWwoXG4gICAgJ1x1RDgzRFx1REREMVx1RkUwRiBEZWxldGUgQXdhcmQnLFxuICAgIGBEZWxldGUgXCIke3RpdGxlfVwiPyBUaGlzIGNhbm5vdCBiZSB1bmRvbmUuYCxcbiAgICBhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvYXdhcmQnLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgYWN0aW9uOiAnZGVsZXRlJywgaWR4IH0pLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICAgICAgX3NldE1hc3RlckNoYW5nZU5vdGljZSgnQXdhcmRzICYgSG9ub3VycycsIGRhdGEuYWN0aW9uIHx8ICdkZWxldGVkJyk7XG4gICAgICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjcwNSBEZWxldGVkJywgYEF3YXJkIHJlbW92ZWQuYCk7XG4gICAgICAgICAgYXdhaXQgcG9wdWxhdGVNYXN0ZXJUYWIoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgZGF0YS5lcnJvciB8fCAnRGVsZXRlIGZhaWxlZCcpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIGRlbGV0ZSBhd2FyZCcpO1xuICAgICAgfVxuICAgIH1cbiAgKTtcbn1cblxuLy8gLS0tLSBDZXJ0aWZpY2F0aW9uIENSVUQgaGFuZGxlcnMgLS0tLVxuXG5mdW5jdGlvbiBzaG93QWRkQ2VydGlmaWNhdGlvbk1vZGFsKCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2VydC1tb2RhbC1pZHgnKS52YWx1ZSAgICA9ICctMSc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjZXJ0LW5hbWUtaW5wdXQnKS52YWx1ZSAgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjZXJ0LWlzc3Vlci1pbnB1dCcpLnZhbHVlID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjZXJ0LXllYXItaW5wdXQnKS52YWx1ZSAgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItY2VydC1tb2RhbC10aXRsZScpLnRleHRDb250ZW50ID0gJ0FkZCBDZXJ0aWZpY2F0aW9uJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1jZXJ0LW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICBfZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIHNldEluaXRpYWxGb2N1cygnbWFzdGVyLWNlcnQtbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ21hc3Rlci1jZXJ0LW1vZGFsLW92ZXJsYXknKTtcbn1cblxuZnVuY3Rpb24gZWRpdE1hc3RlckNlcnRpZmljYXRpb24oY2VydCwgaWR4KSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjZXJ0LW1vZGFsLWlkeCcpLnZhbHVlICAgID0gaWR4O1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2VydC1uYW1lLWlucHV0JykudmFsdWUgICA9IGNlcnQubmFtZSB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NlcnQtaXNzdWVyLWlucHV0JykudmFsdWUgPSBjZXJ0Lmlzc3VlciB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NlcnQteWVhci1pbnB1dCcpLnZhbHVlICAgPSBjZXJ0LnllYXIgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItY2VydC1tb2RhbC10aXRsZScpLnRleHRDb250ZW50ID0gJ0VkaXQgQ2VydGlmaWNhdGlvbic7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItY2VydC1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBzZXRJbml0aWFsRm9jdXMoJ21hc3Rlci1jZXJ0LW1vZGFsLW92ZXJsYXknKTtcbiAgdHJhcEZvY3VzKCdtYXN0ZXItY2VydC1tb2RhbC1vdmVybGF5Jyk7XG59XG5cbmZ1bmN0aW9uIGNsb3NlQ2VydGlmaWNhdGlvbk1vZGFsKCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWNlcnQtbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHJlc3RvcmVGb2N1cygpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzYXZlTWFzdGVyQ2VydGlmaWNhdGlvbigpIHtcbiAgY29uc3QgaWR4ICA9IHBhcnNlSW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjZXJ0LW1vZGFsLWlkeCcpLnZhbHVlLCAxMCk7XG4gIGNvbnN0IG5hbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2VydC1uYW1lLWlucHV0JykudmFsdWUudHJpbSgpO1xuICBpZiAoIW5hbWUpIHtcbiAgICBzaG93QWxlcnRNb2RhbCgnXHUyNkEwXHVGRTBGIFZhbGlkYXRpb24nLCAnQ2VydGlmaWNhdGlvbiBuYW1lIGlzIHJlcXVpcmVkLicpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBhY3Rpb24gPSBpZHggPj0gMCA/ICd1cGRhdGUnIDogJ2FkZCc7XG4gIGNvbnN0IGJvZHkgPSB7XG4gICAgYWN0aW9uLCBuYW1lLFxuICAgIGlzc3VlcjogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NlcnQtaXNzdWVyLWlucHV0JykudmFsdWUudHJpbSgpLFxuICAgIHllYXI6ICAgcGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NlcnQteWVhci1pbnB1dCcpLnZhbHVlLCAxMCkgfHwgbnVsbCxcbiAgICAuLi4oYWN0aW9uID09PSAndXBkYXRlJyA/IHsgaWR4IH0gOiB7fSksXG4gIH07XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL2NlcnRpZmljYXRpb24nLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBjbG9zZUNlcnRpZmljYXRpb25Nb2RhbCgpO1xuICAgICAgX3NldE1hc3RlckNoYW5nZU5vdGljZSgnQ2VydGlmaWNhdGlvbnMnLCBkYXRhLmFjdGlvbiB8fCAndXBkYXRlZCcpO1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjcwNSBTYXZlZCcsIGBDZXJ0aWZpY2F0aW9uIFwiJHtuYW1lfVwiICR7ZGF0YS5hY3Rpb259LmApO1xuICAgICAgYXdhaXQgcG9wdWxhdGVNYXN0ZXJUYWIoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsIGRhdGEuZXJyb3IgfHwgJ1NhdmUgZmFpbGVkJyk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsICdGYWlsZWQgdG8gc2F2ZSBjZXJ0aWZpY2F0aW9uJyk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlTWFzdGVyQ2VydGlmaWNhdGlvbihpZHgsIG5hbWUpIHtcbiAgc2hvd0NvbmZpcm1Nb2RhbChcbiAgICAnXHVEODNEXHVEREQxXHVGRTBGIERlbGV0ZSBDZXJ0aWZpY2F0aW9uJyxcbiAgICBgRGVsZXRlIFwiJHtuYW1lfVwiPyBUaGlzIGNhbm5vdCBiZSB1bmRvbmUuYCxcbiAgICBhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvY2VydGlmaWNhdGlvbicsIHtcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBhY3Rpb246ICdkZWxldGUnLCBpZHggfSksXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgaWYgKGRhdGEub2spIHtcbiAgICAgICAgICBfc2V0TWFzdGVyQ2hhbmdlTm90aWNlKCdDZXJ0aWZpY2F0aW9ucycsIGRhdGEuYWN0aW9uIHx8ICdkZWxldGVkJyk7XG4gICAgICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjcwNSBEZWxldGVkJywgYENlcnRpZmljYXRpb24gcmVtb3ZlZC5gKTtcbiAgICAgICAgICBhd2FpdCBwb3B1bGF0ZU1hc3RlclRhYigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCBkYXRhLmVycm9yIHx8ICdEZWxldGUgZmFpbGVkJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsICdGYWlsZWQgdG8gZGVsZXRlIGNlcnRpZmljYXRpb24nKTtcbiAgICAgIH1cbiAgICB9XG4gICk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBCYWNrdXAgSGlzdG9yeSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gb3BlbkJhY2t1cEhpc3RvcnlNb2RhbCgpIHtcbiAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBvdmVybGF5LmlkID0gJ2JhY2t1cC1oaXN0b3J5LW92ZXJsYXknO1xuICBvdmVybGF5LnN0eWxlLmNzc1RleHQgPSAncG9zaXRpb246Zml4ZWQ7aW5zZXQ6MDtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsMC41KTt6LWluZGV4OjEwMDAwO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjsnO1xuICBvdmVybGF5LmlubmVySFRNTCA9IGBcbiAgICA8ZGl2IHJvbGU9XCJkaWFsb2dcIiBhcmlhLW1vZGFsPVwidHJ1ZVwiIGFyaWEtbGFiZWxsZWRieT1cImJhY2t1cC1tb2RhbC10aXRsZVwiXG4gICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6I2ZmZjtib3JkZXItcmFkaXVzOjEwcHg7cGFkZGluZzoyNHB4IDI4cHg7bWF4LXdpZHRoOjU2MHB4O3dpZHRoOjk0JTtcbiAgICAgICAgICAgICAgICBtYXgtaGVpZ2h0Ojgwdmg7b3ZlcmZsb3cteTphdXRvO2JveC1zaGFkb3c6MCAyMHB4IDYwcHggcmdiYSgwLDAsMCwwLjMpO1wiPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47bWFyZ2luLWJvdHRvbToxNnB4O1wiPlxuICAgICAgICA8aDMgaWQ9XCJiYWNrdXAtbW9kYWwtdGl0bGVcIiBzdHlsZT1cIm1hcmdpbjowO2ZvbnQtc2l6ZToxLjFlbTtjb2xvcjojMWUyOTNiO1wiPlx1RDgzRFx1REQ1MCBCYWNrdXAgSGlzdG9yeTwvaDM+XG4gICAgICAgIDxidXR0b24gaWQ9XCJiYWNrdXAtbW9kYWwtY2xvc2VcIiBzdHlsZT1cImJhY2tncm91bmQ6bm9uZTtib3JkZXI6bm9uZTtmb250LXNpemU6MS4zZW07Y3Vyc29yOnBvaW50ZXI7Y29sb3I6IzY0NzQ4YjtcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIj5cdTI3MTU8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPHAgc3R5bGU9XCJmb250LXNpemU6MC44OGVtO2NvbG9yOiM2NDc0OGI7bWFyZ2luLWJvdHRvbToxNnB4O1wiPlxuICAgICAgICBBIGJhY2t1cCBpcyBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgYmVmb3JlIGV2ZXJ5IHNhdmUuIFJlc3RvcmluZyB3aWxsIHByZXNlcnZlIHRoZSBjdXJyZW50IHZlcnNpb24gYXMgYSBuZXcgYmFja3VwIGZpcnN0LlxuICAgICAgPC9wPlxuICAgICAgPGRpdiBpZD1cImJhY2t1cC1saXN0LWJvZHlcIiBzdHlsZT1cImZvbnQtc2l6ZTowLjllbTtcIj5Mb2FkaW5nXHUyMDI2PC9kaXY+XG4gICAgPC9kaXY+YDtcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChvdmVybGF5KTtcbiAgaWYgKHR5cGVvZiB0cmFwRm9jdXMgPT09ICdmdW5jdGlvbicpIHRyYXBGb2N1cygnYmFja3VwLWhpc3Rvcnktb3ZlcmxheScpO1xuICBjb25zdCBjbG9zZSA9ICgpID0+IHsgb3ZlcmxheS5yZW1vdmUoKTsgaWYgKHR5cGVvZiByZXN0b3JlRm9jdXMgPT09ICdmdW5jdGlvbicpIHJlc3RvcmVGb2N1cygpOyB9O1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja3VwLW1vZGFsLWNsb3NlJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjbG9zZSk7XG4gIG92ZXJsYXkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBlID0+IHsgaWYgKGUudGFyZ2V0ID09PSBvdmVybGF5KSBjbG9zZSgpOyB9KTtcbiAgb3ZlcmxheS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZSA9PiB7IGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIGNsb3NlKCk7IH0pO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvaGlzdG9yeScpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGNvbnN0IGJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja3VwLWxpc3QtYm9keScpO1xuICAgIGlmICghYm9keSkgcmV0dXJuO1xuICAgIGlmICghZGF0YS5vayB8fCAhZGF0YS5zbmFwc2hvdHM/Lmxlbmd0aCkge1xuICAgICAgYm9keS50ZXh0Q29udGVudCA9ICdObyBiYWNrdXBzIGZvdW5kLic7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJvd3MgPSBkYXRhLnNuYXBzaG90cy5tYXAocyA9PiB7XG4gICAgICBjb25zdCBkdCA9IG5ldyBEYXRlKHMubXRpbWUgKiAxMDAwKS50b0xvY2FsZVN0cmluZygpO1xuICAgICAgY29uc3Qga2IgPSAocy5zaXplIC8gMTAyNCkudG9GaXhlZCgxKTtcbiAgICAgIHJldHVybiBgPHRyPlxuICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOjZweCA4cHg7Y29sb3I6IzFlMjkzYjtcIj4ke2VzY2FwZUh0bWwoZHQpfTwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cInBhZGRpbmc6NnB4IDhweDtjb2xvcjojNjQ3NDhiO3doaXRlLXNwYWNlOm5vd3JhcDtcIj4ke2tifSBLQjwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cInBhZGRpbmc6NnB4IDhweDtcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBzZWNvbmRhcnlcIiBzdHlsZT1cInBhZGRpbmc6M3B4IDEwcHg7Zm9udC1zaXplOjAuODJlbTtcIlxuICAgICAgICAgICAgb25jbGljaz1cInJlc3RvcmVCYWNrdXAoJHtKU09OLnN0cmluZ2lmeShzLmZpbGVuYW1lKX0pXCI+UmVzdG9yZTwvYnV0dG9uPlxuICAgICAgICA8L3RkPlxuICAgICAgPC90cj5gO1xuICAgIH0pLmpvaW4oJycpO1xuICAgIGJvZHkuaW5uZXJIVE1MID0gYDx0YWJsZSBzdHlsZT1cIndpZHRoOjEwMCU7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlO1wiPlxuICAgICAgPHRoZWFkPjx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206MXB4IHNvbGlkICNlMmU4ZjA7XCI+XG4gICAgICAgIDx0aCBzdHlsZT1cInBhZGRpbmc6NHB4IDhweDt0ZXh0LWFsaWduOmxlZnQ7Y29sb3I6IzQ3NTU2OTtmb250LXdlaWdodDo2MDA7XCI+U2F2ZWQ8L3RoPlxuICAgICAgICA8dGggc3R5bGU9XCJwYWRkaW5nOjRweCA4cHg7dGV4dC1hbGlnbjpsZWZ0O2NvbG9yOiM0NzU1Njk7Zm9udC13ZWlnaHQ6NjAwO1wiPlNpemU8L3RoPlxuICAgICAgICA8dGg+PC90aD5cbiAgICAgIDwvdHI+PC90aGVhZD5cbiAgICAgIDx0Ym9keT4ke3Jvd3N9PC90Ym9keT5cbiAgICA8L3RhYmxlPmA7XG4gIH0gY2F0Y2ggKF8pIHtcbiAgICBjb25zdCBib2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhY2t1cC1saXN0LWJvZHknKTtcbiAgICBpZiAoYm9keSkgYm9keS50ZXh0Q29udGVudCA9ICdGYWlsZWQgdG8gbG9hZCBiYWNrdXAgaGlzdG9yeS4nO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc3RvcmVCYWNrdXAoZmlsZW5hbWUpIHtcbiAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgKHR5cGVvZiBjb25maXJtRGlhbG9nID09PSAnZnVuY3Rpb24nXG4gICAgPyBjb25maXJtRGlhbG9nKCdSZXN0b3JlIHRoaXMgYmFja3VwPyBUaGUgY3VycmVudCB2ZXJzaW9uIHdpbGwgYmUgc2F2ZWQgYXMgYSBuZXcgYmFja3VwIGZpcnN0LicpXG4gICAgOiBQcm9taXNlLnJlc29sdmUod2luZG93LmNvbmZpcm0oJ1Jlc3RvcmUgdGhpcyBiYWNrdXA/IFRoZSBjdXJyZW50IHZlcnNpb24gd2lsbCBiZSBzYXZlZCBhcyBhIG5ldyBiYWNrdXAgZmlyc3QuJykpKTtcbiAgaWYgKCFjb25maXJtZWQpIHJldHVybjtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS9yZXN0b3JlJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgZmlsZW5hbWUgfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEub2spIHtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYWNrdXAtaGlzdG9yeS1vdmVybGF5Jyk/LnJlbW92ZSgpO1xuICAgICAgaWYgKHR5cGVvZiByZXN0b3JlRm9jdXMgPT09ICdmdW5jdGlvbicpIHJlc3RvcmVGb2N1cygpO1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjcwNSBSZXN0b3JlZCcsICdNYXN0ZXIgQ1YgcmVzdG9yZWQgZnJvbSBiYWNrdXAuIFJlbG9hZCB0aGUgdGFiIHRvIHNlZSB0aGUgdXBkYXRlZCBkYXRhLicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgZGF0YS5lcnJvciB8fCAnUmVzdG9yZSBmYWlsZWQuJyk7XG4gICAgfVxuICB9IGNhdGNoIChfKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsICdGYWlsZWQgdG8gcmVzdG9yZSBiYWNrdXAuJyk7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIFVuZG8gLyBSZWRvIChHQVAtMTkgMTYuNykgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4vLyBTaW5nbGUtbGV2ZWw6IFVuZG8gcmVzdG9yZXMgdGhlIG1vc3QgcmVjZW50IGJhY2t1cCBzbmFwc2hvdCAoaS5lLiB0aGVcbi8vIHN0YXRlIGJlZm9yZSB0aGUgbGFzdCBzYXZlKTsgUmVkbyByZXN0b3JlcyB0aGUgc2FmZXR5IGJhY2t1cCB0aGUgcmVzdG9yZVxuLy8gZW5kcG9pbnQgdG9vayBvZiB0aGUgcHJlLXVuZG8gc3RhdGUuIEJvdGggcmV1c2UgdGhlIGV4aXN0aW5nXG4vLyAvYXBpL21hc3Rlci1kYXRhL2hpc3RvcnkgKyAvYXBpL21hc3Rlci1kYXRhL3Jlc3RvcmUgZW5kcG9pbnRzIHJhdGhlciB0aGFuXG4vLyBhZGRpbmcgbmV3IGJhY2tlbmQgc3VyZmFjZSBcdTIwMTQgc2VlIF9tYXN0ZXJDdlJlZG9CYWNrdXAgYWJvdmUgZm9yIHRoZSByZXNldFxuLy8gY29udHJhY3Qgd2l0aCBwb3B1bGF0ZU1hc3RlclRhYigpLlxuXG5hc3luYyBmdW5jdGlvbiB1bmRvTWFzdGVyRGF0YUNoYW5nZSgpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS9oaXN0b3J5Jyk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKCFkYXRhLm9rIHx8ICFkYXRhLnNuYXBzaG90cz8ubGVuZ3RoKSB7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyMTM5XHVGRTBGIE5vdGhpbmcgdG8gdW5kbycsICdObyBiYWNrdXAgc25hcHNob3RzIGFyZSBhdmFpbGFibGUgeWV0LicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBtb3N0UmVjZW50ID0gZGF0YS5zbmFwc2hvdHNbMF07IC8vIGhpc3Rvcnkgcm91dGUgcmV0dXJucyBuZXdlc3QtZmlyc3RcbiAgICBjb25zdCB3aGVuID0gbmV3IERhdGUobW9zdFJlY2VudC5tdGltZSAqIDEwMDApLnRvTG9jYWxlU3RyaW5nKCk7XG4gICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgKHR5cGVvZiBjb25maXJtRGlhbG9nID09PSAnZnVuY3Rpb24nXG4gICAgICA/IGNvbmZpcm1EaWFsb2coYFVuZG8gdGhlIG1vc3QgcmVjZW50IGNoYW5nZT8gVGhpcyByZXN0b3JlcyB0aGUgdmVyc2lvbiBzYXZlZCAke3doZW59LiBUaGUgY3VycmVudCB2ZXJzaW9uIHdpbGwgYmUgc2F2ZWQgYXMgYSBuZXcgYmFja3VwIGZpcnN0LmApXG4gICAgICA6IFByb21pc2UucmVzb2x2ZSh3aW5kb3cuY29uZmlybShgVW5kbyB0aGUgbW9zdCByZWNlbnQgY2hhbmdlPyBUaGlzIHJlc3RvcmVzIHRoZSB2ZXJzaW9uIHNhdmVkICR7d2hlbn0uYCkpKTtcbiAgICBpZiAoIWNvbmZpcm1lZCkgcmV0dXJuO1xuXG4gICAgY29uc3QgcmVzdG9yZVJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL3Jlc3RvcmUnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBmaWxlbmFtZTogbW9zdFJlY2VudC5maWxlbmFtZSB9KSxcbiAgICB9KTtcbiAgICBjb25zdCByZXN0b3JlRGF0YSA9IGF3YWl0IHJlc3RvcmVSZXMuanNvbigpO1xuICAgIGlmIChyZXN0b3JlRGF0YS5vaykge1xuICAgICAgLy8gTXVzdCBiZSBzZXQgKmJlZm9yZSogcG9wdWxhdGVNYXN0ZXJUYWIoKSByZW5kZXJzIHRoZSBSZWRvIGJ1dHRvbixcbiAgICAgIC8vIG5vdCBhZnRlciBcdTIwMTQgdGhlIGJ1dHRvbidzIGRpc2FibGVkIHN0YXRlIGlzIGJha2VkIGludG8gdGhhdCByZW5kZXIuXG4gICAgICBfbWFzdGVyQ3ZSZWRvQmFja3VwID0gcmVzdG9yZURhdGEuc2FmZXR5X2JhY2t1cCB8fCBudWxsO1xuICAgICAgX21hc3RlckN2U3VwcHJlc3NSZWRvUmVzZXQgPSB0cnVlO1xuICAgICAgYXdhaXQgcG9wdWxhdGVNYXN0ZXJUYWIoKTtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3MDUgVW5kb25lJywgJ01hc3RlciBDViByZXZlcnRlZCB0byB0aGUgcHJldmlvdXMgc2F2ZWQgdmVyc2lvbi4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsIHJlc3RvcmVEYXRhLmVycm9yIHx8ICdVbmRvIGZhaWxlZC4nKTtcbiAgICB9XG4gIH0gY2F0Y2ggKF8pIHtcbiAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgJ0ZhaWxlZCB0byB1bmRvLicpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlZG9NYXN0ZXJEYXRhQ2hhbmdlKCkge1xuICBpZiAoIV9tYXN0ZXJDdlJlZG9CYWNrdXApIHtcbiAgICBzaG93QWxlcnRNb2RhbCgnXHUyMTM5XHVGRTBGIE5vdGhpbmcgdG8gcmVkbycsICdUaGVyZSBpcyBubyB1bmRvbmUgY2hhbmdlIHRvIHJlc3RvcmUuJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvcmVzdG9yZScsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGZpbGVuYW1lOiBfbWFzdGVyQ3ZSZWRvQmFja3VwIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICAvLyBEZWxpYmVyYXRlbHkgZG8gbm90IHJlLWFybSByZWRvIFx1MjAxNCB0aGlzIHJlc3RvcmUgY29uc3VtZXMgdGhlIHJlZG9cbiAgICAgIC8vIHRhcmdldCwgYW5kIHBvcHVsYXRlTWFzdGVyVGFiKCkncyBkZWZhdWx0IHJlc2V0IGNsZWFycyBpdC5cbiAgICAgIGF3YWl0IHBvcHVsYXRlTWFzdGVyVGFiKCk7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzA1IFJlZG9uZScsICdNYXN0ZXIgQ1YgcmVzdG9yZWQgdG8gdGhlIHZlcnNpb24gYmVmb3JlIHRoZSB1bmRvLicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgZGF0YS5lcnJvciB8fCAnUmVkbyBmYWlsZWQuJyk7XG4gICAgfVxuICB9IGNhdGNoIChfKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsICdGYWlsZWQgdG8gcmVkby4nKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBleHBvcnRNYXN0ZXJDVigpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzZXNzaW9uSWQgPSB3aW5kb3cuX2N1cnJlbnRTZXNzaW9uSWQ7XG4gICAgY29uc3QgdXJsID0gYC9hcGkvbWFzdGVyLWRhdGEvZXhwb3J0JHtzZXNzaW9uSWQgPyBgP3Nlc3Npb25faWQ9JHtzZXNzaW9uSWR9YCA6ICcnfWA7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICBpZiAoIXJlcy5vaykge1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsICdFeHBvcnQgZmFpbGVkJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGJsb2IgPSBhd2FpdCByZXMuYmxvYigpO1xuICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgYS5ocmVmID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICBhLmRvd25sb2FkID0gJ01hc3Rlcl9DVl9EYXRhLmpzb24nO1xuICAgIGEuY2xpY2soKTtcbiAgICBVUkwucmV2b2tlT2JqZWN0VVJMKGEuaHJlZik7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgJ0ZhaWxlZCB0byBleHBvcnQgbWFzdGVyIENWJyk7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIEZ1bGwgZGF0YSBwcmV2aWV3IChHQVAtMTkgMTYuMTUpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBvcGVuRnVsbERhdGFQcmV2aWV3TW9kYWwoKSB7XG4gIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgb3ZlcmxheS5pZCA9ICdtYXN0ZXItY3YtcHJldmlldy1vdmVybGF5JztcbiAgb3ZlcmxheS5zdHlsZS5jc3NUZXh0ID0gJ3Bvc2l0aW9uOmZpeGVkO2luc2V0OjA7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLDAuNSk7ei1pbmRleDoxMDAwMDtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7JztcbiAgb3ZlcmxheS5pbm5lckhUTUwgPSBgXG4gICAgPGRpdiByb2xlPVwiZGlhbG9nXCIgYXJpYS1tb2RhbD1cInRydWVcIiBhcmlhLWxhYmVsbGVkYnk9XCJtYXN0ZXItY3YtcHJldmlldy10aXRsZVwiXG4gICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6I2ZmZjtib3JkZXItcmFkaXVzOjEwcHg7cGFkZGluZzoyNHB4IDI4cHg7bWF4LXdpZHRoOjc2MHB4O3dpZHRoOjk0JTtcbiAgICAgICAgICAgICAgICBtYXgtaGVpZ2h0Ojg1dmg7b3ZlcmZsb3cteTphdXRvO2JveC1zaGFkb3c6MCAyMHB4IDYwcHggcmdiYSgwLDAsMCwwLjMpO1wiPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47bWFyZ2luLWJvdHRvbToxNnB4O1wiPlxuICAgICAgICA8aDMgaWQ9XCJtYXN0ZXItY3YtcHJldmlldy10aXRsZVwiIHN0eWxlPVwibWFyZ2luOjA7Zm9udC1zaXplOjEuMWVtO2NvbG9yOiMxZTI5M2I7XCI+XHVEODNEXHVEQzQxIEZ1bGwgTWFzdGVyIENWIERhdGEgKHJlYWQtb25seSk8L2gzPlxuICAgICAgICA8YnV0dG9uIGlkPVwibWFzdGVyLWN2LXByZXZpZXctY2xvc2VcIiBzdHlsZT1cImJhY2tncm91bmQ6bm9uZTtib3JkZXI6bm9uZTtmb250LXNpemU6MS4zZW07Y3Vyc29yOnBvaW50ZXI7Y29sb3I6IzY0NzQ4YjtcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIj5cdTI3MTU8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPHAgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2NvbG9yOiM2NDc0OGI7bWFyZ2luLWJvdHRvbToxMnB4O1wiPlxuICAgICAgICBUaGUgY29tcGxldGUsIHVuZmlsdGVyZWQgY29udGVudHMgb2YgPGNvZGU+TWFzdGVyX0NWX0RhdGEuanNvbjwvY29kZT4gXHUyMDE0IGluY2x1ZGluZyBhbnkgZmllbGRzIHRoZSBzdHJ1Y3R1cmVkIGVkaXRvcnMgYWJvdmUgZG9uJ3Qgc3VyZmFjZS5cbiAgICAgIDwvcD5cbiAgICAgIDxwcmUgaWQ9XCJtYXN0ZXItY3YtcHJldmlldy1ib2R5XCIgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmOGZhZmM7Ym9yZGVyOjFweCBzb2xpZCAjZTJlOGYwO2JvcmRlci1yYWRpdXM6NnB4O3BhZGRpbmc6MTJweDtmb250LXNpemU6MC44ZW07bGluZS1oZWlnaHQ6MS41O3doaXRlLXNwYWNlOnByZS13cmFwO3dvcmQtYnJlYWs6YnJlYWstd29yZDtcIj5Mb2FkaW5nXHUyMDI2PC9wcmU+XG4gICAgPC9kaXY+YDtcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChvdmVybGF5KTtcbiAgaWYgKHR5cGVvZiB0cmFwRm9jdXMgPT09ICdmdW5jdGlvbicpIHRyYXBGb2N1cygnbWFzdGVyLWN2LXByZXZpZXctb3ZlcmxheScpO1xuICBjb25zdCBjbG9zZSA9ICgpID0+IHsgb3ZlcmxheS5yZW1vdmUoKTsgaWYgKHR5cGVvZiByZXN0b3JlRm9jdXMgPT09ICdmdW5jdGlvbicpIHJlc3RvcmVGb2N1cygpOyB9O1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWN2LXByZXZpZXctY2xvc2UnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNsb3NlKTtcbiAgb3ZlcmxheS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7IGlmIChlLnRhcmdldCA9PT0gb3ZlcmxheSkgY2xvc2UoKTsgfSk7XG4gIG92ZXJsYXkuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChlKSA9PiB7IGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIGNsb3NlKCk7IH0pO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvZnVsbCcpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGNvbnN0IGJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWN2LXByZXZpZXctYm9keScpO1xuICAgIGlmIChib2R5KSBib2R5LnRleHRDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoZGF0YSwgbnVsbCwgMik7XG4gIH0gY2F0Y2ggKF8pIHtcbiAgICBjb25zdCBib2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1jdi1wcmV2aWV3LWJvZHknKTtcbiAgICBpZiAoYm9keSkgYm9keS50ZXh0Q29udGVudCA9ICdGYWlsZWQgdG8gbG9hZCBtYXN0ZXIgQ1YgZGF0YS4nO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBGdWxsLWZpbGUgSlNPTiBpbXBvcnQgd2l0aCBkaWZmIHJldmlldyAoR0FQLTE5IDE2LjE2KSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbi8vXG4vLyBOb3QgYSBtZXJnZTogaW1wb3J0LWNvbmZpcm0gcmVwbGFjZXMgdGhlIGVudGlyZSBmaWxlLiBUaGUgaW1wb3J0LXByZXZpZXdcbi8vIHN0ZXAncyBzZWN0aW9uLWxldmVsIGNoYW5nZWQvY291bnQgc3VtbWFyeSBpcyB0aGUgdXNlcidzIGNoYW5jZSB0byBjYXRjaFxuLy8gYW4gdW5pbnRlbmRlZCBvdmVyd3JpdGUgYmVmb3JlIGNvbmZpcm1pbmcgXHUyMDE0IGZ1bGwgZmllbGQtbGV2ZWwgZGlmZmluZ1xuLy8gd2l0aGluIGEgY2hhbmdlZCBzZWN0aW9uIGlzIGEga25vd24gdjEgbGltaXRhdGlvbiAodGhlIHNhbWUgcG9zdHVyZVxuLy8gYWxyZWFkeSBhY2NlcHRlZCBmb3Igb3RoZXIgYWR2aXNvcnktb25seSByZXZpZXcgc3VyZmFjZXMgaW4gdGhpcyB0YWIpLlxuXG5sZXQgX21hc3RlckN2SW1wb3J0RGF0YSA9IG51bGw7XG5cbmZ1bmN0aW9uIHRyaWdnZXJNYXN0ZXJDdkltcG9ydCgpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1jdi1pbXBvcnQtZmlsZS1pbnB1dCcpPy5jbGljaygpO1xufVxuXG5mdW5jdGlvbiBoYW5kbGVNYXN0ZXJDdkltcG9ydEZpbGUoZXZlbnQpIHtcbiAgY29uc3QgZmlsZSA9IGV2ZW50LnRhcmdldD8uZmlsZXM/LlswXTtcbiAgZXZlbnQudGFyZ2V0LnZhbHVlID0gJyc7IC8vIGFsbG93IHJlLXNlbGVjdGluZyB0aGUgc2FtZSBmaWxlbmFtZSBsYXRlclxuICBpZiAoIWZpbGUpIHJldHVybjtcbiAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgcmVhZGVyLm9ubG9hZCA9IGFzeW5jICgpID0+IHtcbiAgICBsZXQgcGFyc2VkO1xuICAgIHRyeSB7XG4gICAgICBwYXJzZWQgPSBKU09OLnBhcnNlKFN0cmluZyhyZWFkZXIucmVzdWx0KSk7XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsICdUaGF0IGZpbGUgaXMgbm90IHZhbGlkIEpTT04uJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghcGFyc2VkIHx8IHR5cGVvZiBwYXJzZWQgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkocGFyc2VkKSkge1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsICdFeHBlY3RlZCBhIEpTT04gb2JqZWN0IChNYXN0ZXJfQ1ZfRGF0YS5qc29uIHNoYXBlKSwgbm90IGFuIGFycmF5IG9yIHNjYWxhci4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgX3N1Ym1pdE1hc3RlckN2SW1wb3J0UHJldmlldyhwYXJzZWQpO1xuICB9O1xuICByZWFkZXIub25lcnJvciA9ICgpID0+IHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIHJlYWQgdGhlIHNlbGVjdGVkIGZpbGUuJyk7XG4gIHJlYWRlci5yZWFkQXNUZXh0KGZpbGUpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBfc3VibWl0TWFzdGVyQ3ZJbXBvcnRQcmV2aWV3KHBhcnNlZCkge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL2ltcG9ydC1wcmV2aWV3Jywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBkYXRhOiBwYXJzZWQgfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKCFkYXRhLm9rKSB7XG4gICAgICBjb25zdCBkZXRhaWwgPSAoZGF0YS52YWxpZGF0aW9uX2Vycm9ycyB8fCBbXSkuam9pbignOyAnKTtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCBkZXRhaWwgPyBgJHtkYXRhLmVycm9yfTogJHtkZXRhaWx9YCA6IChkYXRhLmVycm9yIHx8ICdJbXBvcnQgcHJldmlldyBmYWlsZWQuJykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBfbWFzdGVyQ3ZJbXBvcnREYXRhID0gcGFyc2VkO1xuICAgIF9zaG93TWFzdGVyQ3ZJbXBvcnRQcmV2aWV3TW9kYWwoZGF0YS5zZWN0aW9ucyB8fCBbXSk7XG4gIH0gY2F0Y2ggKF8pIHtcbiAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgJ0ZhaWxlZCB0byBwcmV2aWV3IHRoZSBpbXBvcnQuJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX3Nob3dNYXN0ZXJDdkltcG9ydFByZXZpZXdNb2RhbChzZWN0aW9ucykge1xuICBjb25zdCBvdmVybGF5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIG92ZXJsYXkuaWQgPSAnbWFzdGVyLWN2LWltcG9ydC1vdmVybGF5JztcbiAgb3ZlcmxheS5zdHlsZS5jc3NUZXh0ID0gJ3Bvc2l0aW9uOmZpeGVkO2luc2V0OjA7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLDAuNSk7ei1pbmRleDoxMDAwMDtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7JztcbiAgY29uc3QgY2hhbmdlZFNlY3Rpb25zID0gc2VjdGlvbnMuZmlsdGVyKChzKSA9PiBzLmNoYW5nZWQpO1xuICBjb25zdCByb3dzID0gc2VjdGlvbnMubWFwKChzKSA9PiBgXG4gICAgPHRyIHN0eWxlPVwiJHtzLmNoYW5nZWQgPyAnYmFja2dyb3VuZDp2YXIoLS1jdi13YXJuaW5nLWJnLCAjZmZmYmViKTsnIDogJyd9XCI+XG4gICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOjZweCA4cHg7Y29sb3I6IzFlMjkzYjtcIj4ke2VzY2FwZUh0bWwocy5zZWN0aW9uKX08L3RkPlxuICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzo2cHggOHB4O3RleHQtYWxpZ246Y2VudGVyO2NvbG9yOiM2NDc0OGI7XCI+JHtzLmN1cnJlbnRfY291bnR9PC90ZD5cbiAgICAgIDx0ZCBzdHlsZT1cInBhZGRpbmc6NnB4IDhweDt0ZXh0LWFsaWduOmNlbnRlcjtjb2xvcjojNjQ3NDhiO1wiPiR7cy5uZXdfY291bnR9PC90ZD5cbiAgICAgIDx0ZCBzdHlsZT1cInBhZGRpbmc6NnB4IDhweDtcIj4ke3MuY2hhbmdlZCA/ICdcdTI2QTAgY2hhbmdlZCcgOiAnXHUyMDE0J308L3RkPlxuICAgIDwvdHI+YCkuam9pbignJyk7XG4gIG92ZXJsYXkuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgcm9sZT1cImRpYWxvZ1wiIGFyaWEtbW9kYWw9XCJ0cnVlXCIgYXJpYS1sYWJlbGxlZGJ5PVwibWFzdGVyLWN2LWltcG9ydC10aXRsZVwiXG4gICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6I2ZmZjtib3JkZXItcmFkaXVzOjEwcHg7cGFkZGluZzoyNHB4IDI4cHg7bWF4LXdpZHRoOjY0MHB4O3dpZHRoOjk0JTtcbiAgICAgICAgICAgICAgICBtYXgtaGVpZ2h0Ojg1dmg7b3ZlcmZsb3cteTphdXRvO2JveC1zaGFkb3c6MCAyMHB4IDYwcHggcmdiYSgwLDAsMCwwLjMpO1wiPlxuICAgICAgPGgzIGlkPVwibWFzdGVyLWN2LWltcG9ydC10aXRsZVwiIHN0eWxlPVwibWFyZ2luOjAgMCAxMnB4O2ZvbnQtc2l6ZToxLjFlbTtjb2xvcjojMWUyOTNiO1wiPlx1MkIwNlx1RkUwRiBJbXBvcnQgTWFzdGVyIENWIERhdGEgXHUyMDE0IFJldmlldzwvaDM+XG4gICAgICA8ZGl2IHJvbGU9XCJhbGVydFwiIHN0eWxlPVwiYmFja2dyb3VuZDojZmVmMmYyO2JvcmRlcjoxcHggc29saWQgI2ZjYTVhNTtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjEwcHggMTRweDttYXJnaW4tYm90dG9tOjE0cHg7Zm9udC1zaXplOjAuODZlbTtjb2xvcjojOTkxYjFiO1wiPlxuICAgICAgICA8c3Ryb25nPlRoaXMgcmVwbGFjZXMgdGhlIGVudGlyZSBmaWxlPC9zdHJvbmc+LCBub3QganVzdCB0aGUgY2hhbmdlZCBzZWN0aW9ucy4gQSBiYWNrdXAgaXMgY3JlYXRlZFxuICAgICAgICBhdXRvbWF0aWNhbGx5IGJlZm9yZSB0aGUgd3JpdGUgXHUyMDE0IHNlZSBcdUQ4M0RcdURENTAgQmFja3VwcyBhYm92ZSB0byByZXN0b3JlIGl0IGlmIG5lZWRlZC5cbiAgICAgIDwvZGl2PlxuICAgICAgPHAgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2NvbG9yOiM2NDc0OGI7bWFyZ2luLWJvdHRvbTo4cHg7XCI+XG4gICAgICAgICR7Y2hhbmdlZFNlY3Rpb25zLmxlbmd0aCA/IGAke2NoYW5nZWRTZWN0aW9ucy5sZW5ndGh9IHNlY3Rpb24ocykgd291bGQgY2hhbmdlOmAgOiAnTm8gc2VjdGlvbnMgd291bGQgY2hhbmdlIFx1MjAxNCB0aGUgdXBsb2FkZWQgZmlsZSBtYXRjaGVzIHRoZSBjdXJyZW50IGRhdGEuJ31cbiAgICAgIDwvcD5cbiAgICAgIDx0YWJsZSBzdHlsZT1cIndpZHRoOjEwMCU7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlO2ZvbnQtc2l6ZTowLjg1ZW07bWFyZ2luLWJvdHRvbToxNnB4O1wiPlxuICAgICAgICA8dGhlYWQ+PHRyIHN0eWxlPVwiYm9yZGVyLWJvdHRvbToxcHggc29saWQgI2UyZThmMDtcIj5cbiAgICAgICAgICA8dGggc3R5bGU9XCJwYWRkaW5nOjRweCA4cHg7dGV4dC1hbGlnbjpsZWZ0O2NvbG9yOiM0NzU1Njk7XCI+U2VjdGlvbjwvdGg+XG4gICAgICAgICAgPHRoIHN0eWxlPVwicGFkZGluZzo0cHggOHB4O2NvbG9yOiM0NzU1Njk7XCI+Q3VycmVudDwvdGg+XG4gICAgICAgICAgPHRoIHN0eWxlPVwicGFkZGluZzo0cHggOHB4O2NvbG9yOiM0NzU1Njk7XCI+TmV3PC90aD5cbiAgICAgICAgICA8dGggc3R5bGU9XCJwYWRkaW5nOjRweCA4cHg7dGV4dC1hbGlnbjpsZWZ0O2NvbG9yOiM0NzU1Njk7XCI+PC90aD5cbiAgICAgICAgPC90cj48L3RoZWFkPlxuICAgICAgICA8dGJvZHk+JHtyb3dzfTwvdGJvZHk+XG4gICAgICA8L3RhYmxlPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmQ7Z2FwOjhweDtcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBpZD1cIm1hc3Rlci1jdi1pbXBvcnQtY2FuY2VsXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHByaW1hcnlcIiBpZD1cIm1hc3Rlci1jdi1pbXBvcnQtY29uZmlybVwiJHtjaGFuZ2VkU2VjdGlvbnMubGVuZ3RoID8gJycgOiAnIGRpc2FibGVkJ30+Q29uZmlybSBJbXBvcnQ8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PmA7XG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQob3ZlcmxheSk7XG4gIGlmICh0eXBlb2YgdHJhcEZvY3VzID09PSAnZnVuY3Rpb24nKSB0cmFwRm9jdXMoJ21hc3Rlci1jdi1pbXBvcnQtb3ZlcmxheScpO1xuICBjb25zdCBjbG9zZSA9ICgpID0+IHsgb3ZlcmxheS5yZW1vdmUoKTsgX21hc3RlckN2SW1wb3J0RGF0YSA9IG51bGw7IGlmICh0eXBlb2YgcmVzdG9yZUZvY3VzID09PSAnZnVuY3Rpb24nKSByZXN0b3JlRm9jdXMoKTsgfTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1jdi1pbXBvcnQtY2FuY2VsJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjbG9zZSk7XG4gIG92ZXJsYXkuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChlKSA9PiB7IGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIGNsb3NlKCk7IH0pO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWN2LWltcG9ydC1jb25maXJtJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBjb25maXJtTWFzdGVyQ3ZJbXBvcnQoKSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvbmZpcm1NYXN0ZXJDdkltcG9ydCgpIHtcbiAgaWYgKCFfbWFzdGVyQ3ZJbXBvcnREYXRhKSByZXR1cm47XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvaW1wb3J0LWNvbmZpcm0nLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGRhdGE6IF9tYXN0ZXJDdkltcG9ydERhdGEgfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1jdi1pbXBvcnQtb3ZlcmxheScpPy5yZW1vdmUoKTtcbiAgICBfbWFzdGVyQ3ZJbXBvcnREYXRhID0gbnVsbDtcbiAgICBpZiAodHlwZW9mIHJlc3RvcmVGb2N1cyA9PT0gJ2Z1bmN0aW9uJykgcmVzdG9yZUZvY3VzKCk7XG4gICAgaWYgKGRhdGEub2spIHtcbiAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ01hc3RlciBDViBEYXRhJywgJ2ltcG9ydGVkJyk7XG4gICAgICBzaG93QWxlcnRNb2RhbChcbiAgICAgICAgJ1x1MjcwNSBJbXBvcnRlZCcsXG4gICAgICAgIGBNYXN0ZXIgQ1YgZGF0YSByZXBsYWNlZC4ke2RhdGEuY29tbWl0X2hhc2ggPyBgIENvbW1pdDogJHtkYXRhLmNvbW1pdF9oYXNoLnNsaWNlKDAsIDEwKX0uYCA6ICcnfSR7ZGF0YS5naXRfZXJyb3IgPyBgIChnaXQgd2FybmluZzogJHtkYXRhLmdpdF9lcnJvcn0pYCA6ICcnfWBcbiAgICAgICk7XG4gICAgICBhd2FpdCBwb3B1bGF0ZU1hc3RlclRhYigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBkZXRhaWwgPSAoZGF0YS52YWxpZGF0aW9uX2Vycm9ycyB8fCBbXSkuam9pbignOyAnKTtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCBkZXRhaWwgPyBgJHtkYXRhLmVycm9yfTogJHtkZXRhaWx9YCA6IChkYXRhLmVycm9yIHx8ICdJbXBvcnQgZmFpbGVkLicpKTtcbiAgICB9XG4gIH0gY2F0Y2ggKF8pIHtcbiAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgJ0ZhaWxlZCB0byBpbXBvcnQgbWFzdGVyIENWIGRhdGEuJyk7XG4gIH1cbn1cblxuLy8gLS0tLSBBY2hpZXZlbWVudC9TdW1tYXJ5IGRlbGV0ZSBoYW5kbGVycyAtLS0tXG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZU1hc3RlckFjaGlldmVtZW50KGlkLCB0aXRsZSkge1xuICBzaG93Q29uZmlybU1vZGFsKFxuICAgICdcdUQ4M0RcdURERDFcdUZFMEYgRGVsZXRlIEFjaGlldmVtZW50JyxcbiAgICBgRGVsZXRlIFwiJHt0aXRsZX1cIj8gVGhpcyBjYW5ub3QgYmUgdW5kb25lLmAsXG4gICAgYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL3VwZGF0ZS1hY2hpZXZlbWVudCcsIHtcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBhY3Rpb246ICdkZWxldGUnLCBpZCB9KSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICBpZiAoZGF0YS5vaykge1xuICAgICAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ1NlbGVjdGVkIEFjaGlldmVtZW50cycsIGRhdGEuYWN0aW9uIHx8ICdkZWxldGVkJyk7XG4gICAgICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjcwNSBEZWxldGVkJywgYEFjaGlldmVtZW50IHJlbW92ZWQuYCk7XG4gICAgICAgICAgYXdhaXQgcG9wdWxhdGVNYXN0ZXJUYWIoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgZGF0YS5lcnJvciB8fCAnRGVsZXRlIGZhaWxlZCcpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIGRlbGV0ZSBhY2hpZXZlbWVudCcpO1xuICAgICAgfVxuICAgIH1cbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlTWFzdGVyU3VtbWFyeShrZXkpIHtcbiAgc2hvd0NvbmZpcm1Nb2RhbChcbiAgICAnXHVEODNEXHVEREQxXHVGRTBGIERlbGV0ZSBTdW1tYXJ5JyxcbiAgICBgRGVsZXRlIHN1bW1hcnkgdmFyaWFudCBcIiR7a2V5fVwiPyBUaGlzIGNhbm5vdCBiZSB1bmRvbmUuYCxcbiAgICBhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvdXBkYXRlLXN1bW1hcnknLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgYWN0aW9uOiAnZGVsZXRlJywga2V5IH0pLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICAgICAgX3NldE1hc3RlckNoYW5nZU5vdGljZSgnUHJvZmVzc2lvbmFsIFN1bW1hcmllcycsIGRhdGEuYWN0aW9uIHx8ICdkZWxldGVkJyk7XG4gICAgICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjcwNSBEZWxldGVkJywgYFN1bW1hcnkgXCIke2tleX1cIiByZW1vdmVkLmApO1xuICAgICAgICAgIGF3YWl0IHBvcHVsYXRlTWFzdGVyVGFiKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsIGRhdGEuZXJyb3IgfHwgJ0RlbGV0ZSBmYWlsZWQnKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgJ0ZhaWxlZCB0byBkZWxldGUgc3VtbWFyeScpO1xuICAgICAgfVxuICAgIH1cbiAgKTtcbn1cblxuZnVuY3Rpb24gb3Blbk1hc3RlckN2TW9kYWwoKSB7XG4gIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWN2LW1vZGFsLW92ZXJsYXknKTtcbiAgaWYgKCFvdmVybGF5KSByZXR1cm47XG4gIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgb3ZlcmxheS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItY3YtbW9kYWwtYm9keScpO1xuICBwb3B1bGF0ZU1hc3RlclRhYihjb250YWluZXIpO1xuICBzZXRJbml0aWFsRm9jdXMoJ21hc3Rlci1jdi1tb2RhbC1vdmVybGF5Jyk7XG4gIHRyYXBGb2N1cygnbWFzdGVyLWN2LW1vZGFsLW92ZXJsYXknKTtcbn1cblxuZnVuY3Rpb24gY2xvc2VNYXN0ZXJDdk1vZGFsKCkge1xuICBjb25zdCBvdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1jdi1tb2RhbC1vdmVybGF5Jyk7XG4gIGlmIChvdmVybGF5KSBvdmVybGF5LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIF9tYXN0ZXJDdkFjdGl2ZUNvbnRhaW5lciA9IG51bGw7XG4gIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnJztcbiAgcmVzdG9yZUZvY3VzKCk7XG59XG5cbmV4cG9ydCB7XG4gIHBvcHVsYXRlTWFzdGVyVGFiLFxuICBvcGVuTWFzdGVyQ3ZNb2RhbCxcbiAgY2xvc2VNYXN0ZXJDdk1vZGFsLFxuICBfcmVuZGVyUGVyc29uYWxJbmZvQ2FyZCxcbiAgX3JlbmRlckV4cGVyaWVuY2VzTGlzdCxcbiAgX3JlbmRlclNraWxsc1NlY3Rpb24sXG4gIF9yZW5kZXJFZHVjYXRpb25MaXN0LFxuICBfcmVuZGVyQXdhcmRzTGlzdCxcbiAgX3JlbmRlckNlcnRpZmljYXRpb25zTGlzdCxcbiAgX3JlbmRlck1hc3RlckFjaGlldmVtZW50c1RhYmxlLFxuICBfcmVuZGVyU3VtbWFyaWVzTGlzdCxcbiAgc2hvd0FkZEFjaGlldmVtZW50TW9kYWwsXG4gIGVkaXRNYXN0ZXJBY2hpZXZlbWVudCxcbiAgY2xvc2VNYXN0ZXJBY2hNb2RhbCxcbiAgc2F2ZU1hc3RlckFjaGlldmVtZW50LFxuICBzaG93QWRkU3VtbWFyeU1vZGFsLFxuICBlZGl0TWFzdGVyU3VtbWFyeSxcbiAgY2xvc2VNYXN0ZXJTdW1Nb2RhbCxcbiAgc2F2ZU1hc3RlclN1bW1hcnksXG4gIHNob3dFZGl0UGVyc29uYWxJbmZvTW9kYWwsXG4gIGNsb3NlUGVyc29uYWxJbmZvTW9kYWwsXG4gIHNhdmVQZXJzb25hbEluZm8sXG4gIHNob3dBZGRFeHBlcmllbmNlTW9kYWwsXG4gIGVkaXRNYXN0ZXJFeHBlcmllbmNlLFxuICBjbG9zZUV4cGVyaWVuY2VNb2RhbCxcbiAgc2F2ZU1hc3RlckV4cGVyaWVuY2UsXG4gIGRlbGV0ZU1hc3RlckV4cGVyaWVuY2UsXG4gIF9hZGRFeHBBY2hpZXZlbWVudCxcbiAgX21vdmVFeHBBY2hpZXZlbWVudCxcbiAgX2RlbGV0ZUV4cEFjaGlldmVtZW50LFxuICBzaG93QWRkU2tpbGxNb2RhbCxcbiAgZWRpdE1hc3RlclNraWxsLFxuICBjbG9zZVNraWxsTW9kYWwsXG4gIHNhdmVNYXN0ZXJTa2lsbCxcbiAgZGVsZXRlTWFzdGVyU2tpbGwsXG4gIHNob3dBZGRFZHVjYXRpb25Nb2RhbCxcbiAgZWRpdE1hc3RlckVkdWNhdGlvbixcbiAgY2xvc2VFZHVjYXRpb25Nb2RhbCxcbiAgc2F2ZU1hc3RlckVkdWNhdGlvbixcbiAgZGVsZXRlTWFzdGVyRWR1Y2F0aW9uLFxuICBzaG93QWRkQXdhcmRNb2RhbCxcbiAgZWRpdE1hc3RlckF3YXJkLFxuICBjbG9zZUF3YXJkTW9kYWwsXG4gIHNhdmVNYXN0ZXJBd2FyZCxcbiAgZGVsZXRlTWFzdGVyQXdhcmQsXG4gIHNob3dBZGRDZXJ0aWZpY2F0aW9uTW9kYWwsXG4gIGVkaXRNYXN0ZXJDZXJ0aWZpY2F0aW9uLFxuICBjbG9zZUNlcnRpZmljYXRpb25Nb2RhbCxcbiAgc2F2ZU1hc3RlckNlcnRpZmljYXRpb24sXG4gIGRlbGV0ZU1hc3RlckNlcnRpZmljYXRpb24sXG4gIGV4cG9ydE1hc3RlckNWLFxuICBvcGVuQmFja3VwSGlzdG9yeU1vZGFsLFxuICByZXN0b3JlQmFja3VwLFxuICB1bmRvTWFzdGVyRGF0YUNoYW5nZSxcbiAgcmVkb01hc3RlckRhdGFDaGFuZ2UsXG4gIG9wZW5GdWxsRGF0YVByZXZpZXdNb2RhbCxcbiAgdHJpZ2dlck1hc3RlckN2SW1wb3J0LFxuICBoYW5kbGVNYXN0ZXJDdkltcG9ydEZpbGUsXG4gIGNvbmZpcm1NYXN0ZXJDdkltcG9ydCxcbiAgZGVsZXRlTWFzdGVyQWNoaWV2ZW1lbnQsXG4gIGRlbGV0ZU1hc3RlclN1bW1hcnksXG4gIGxvYWRQdWJsaWNhdGlvbnMsXG4gIGxvYWRQdWJsaWNhdGlvbnNCaWIsXG4gIHRvZ2dsZVB1YmxpY2F0aW9uc1ZpZXcsXG4gIHNldFB1YmxpY2F0aW9uU29ydE1vZGUsXG4gIHNldFB1YmxpY2F0aW9uR3JvdXBNb2RlLFxuICB2YWxpZGF0ZVB1YmxpY2F0aW9uc0JpYixcbiAgc2F2ZVB1YmxpY2F0aW9uc0JpYixcbiAgc2hvd0ltcG9ydFB1YmxpY2F0aW9uc01vZGFsLFxuICBjbG9zZUltcG9ydFB1YmxpY2F0aW9uc01vZGFsLFxuICBpbXBvcnRQdWJsaWNhdGlvbnNCaWIsXG4gIHNob3dDb252ZXJ0UHVibGljYXRpb25zTW9kYWwsXG4gIGNsb3NlQ29udmVydFB1YmxpY2F0aW9uc01vZGFsLFxuICBjb252ZXJ0UHVibGljYXRpb25UZXh0LFxuICBpbXBvcnRDb252ZXJ0ZWRQdWJsaWNhdGlvblRleHQsXG4gIHNob3dBZGRQdWJsaWNhdGlvbk1vZGFsLFxuICBlZGl0TWFzdGVyUHVibGljYXRpb24sXG4gIGNsb3NlUHVibGljYXRpb25Nb2RhbCxcbiAgc2F2ZU1hc3RlclB1YmxpY2F0aW9uLFxuICBkZWxldGVNYXN0ZXJQdWJsaWNhdGlvbixcbn07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9jb3Zlci1sZXR0ZXIuanNcbiAqIENvdmVyIGxldHRlciB0YWI6IGdlbmVyYXRlLCBzYXZlLCB2YWxpZGF0ZSwgY29uc2lzdGVuY3kgcmVwb3J0LlxuICpcbiAqIERlcGVuZGVuY2llcyAocmVzb2x2ZWQgdGhyb3VnaCBnbG9iYWxUaGlzIGF0IHJ1bnRpbWUpOlxuICogICBlc2NhcGVIdG1sLCBzaG93QWxlcnRNb2RhbCwgdGFiRGF0YSwgcGVuZGluZ1JlY29tbWVuZGF0aW9ucywgQ1NTXG4gKi9cblxuaW1wb3J0IHsgc3RhdGVNYW5hZ2VyIH0gZnJvbSAnLi9zdGF0ZS1tYW5hZ2VyLmpzJztcblxuLy8gXHUyNTAwXHUyNTAwIE1vZHVsZS1sZXZlbCBzdGF0ZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuY29uc3QgQ09WRVJfTEVUVEVSX1RPTkVTID0gW1xuICB7IHZhbHVlOiAnc3RhcnR1cC90ZWNoJywgICBsYWJlbDogJ1N0YXJ0dXAgLyBUZWNoJyAgICB9LFxuICB7IHZhbHVlOiAncGhhcm1hL2Jpb3RlY2gnLCBsYWJlbDogJ1BoYXJtYSAvIEJpb3RlY2gnICB9LFxuICB7IHZhbHVlOiAnYWNhZGVtaWEnLCAgICAgICBsYWJlbDogJ0FjYWRlbWlhJyAgICAgICAgICAgfSxcbiAgeyB2YWx1ZTogJ2ZpbmFuY2lhbCcsICAgICAgbGFiZWw6ICdGaW5hbmNpYWwgU2VydmljZXMnIH0sXG4gIHsgdmFsdWU6ICdsZWFkZXJzaGlwJywgICAgIGxhYmVsOiAnTGVhZGVyc2hpcCAvIEV4ZWMnICB9LFxuXTtcblxuY29uc3QgQ09WRVJfTEVUVEVSX09QRU5JTkdTID0gW1xuICB7IHZhbHVlOiAnZm9ybWFsJywgICAgbGFiZWw6ICdGb3JtYWwgc2FsdXRhdGlvbiBcdTIwMTQgXHUyMDFDRGVhciBbbmFtZV0sXHUyMDFEJyB9LFxuICB7IHZhbHVlOiAnaG9vaycsICAgICAgbGFiZWw6ICdBdHRlbnRpb24gaG9vayBcdTIwMTQgYm9sZCBjbGFpbSBvciBhY2hpZXZlbWVudCcgfSxcbiAgeyB2YWx1ZTogJ25hcnJhdGl2ZScsIGxhYmVsOiAnTmFycmF0aXZlIG9wZW5lciBcdTIwMTQgdml2aWQgc2NlbmUgb3Igc3RvcnknIH0sXG5dO1xuXG5sZXQgX2NvdmVyTGV0dGVyUHJpb3JTZXNzaW9ucyA9IFtdO1xuXG4vKiogU3Vydml2ZXMgdGFiIG5hdmlnYXRpb246IGZvcm0gaW5wdXRzIGFuZCB0aGUgZ2VuZXJhdGVkIGxldHRlciBib2R5LiAqL1xubGV0IF9jb3ZlckxldHRlckZvcm1TdGF0ZSA9IHtcbiAgdG9uZTogICAgICAgICAgICcnLFxuICBvcGVuaW5nU3R5bGU6ICAgJycsXG4gIGhpcmluZ01hbmFnZXI6ICAnJyxcbiAgY29tcGFueUFkZHJlc3M6ICcnLFxuICBoaWdobGlnaHQ6ICAgICAgJycsXG4gIGNvbXBhbnlDb250ZXh0OiAnJyxcbiAgbGV0dGVyVGV4dDogICAgICcnLFxuICBsZXR0ZXJWaXNpYmxlOiAgZmFsc2UsXG59O1xuXG4vLyBcdTI1MDBcdTI1MDAgUG9wdWxhdGUgY292ZXIgbGV0dGVyIHRhYiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gcG9wdWxhdGVDb3ZlckxldHRlclRhYigpIHtcbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJlbXB0eS1zdGF0ZVwiPjxkaXYgY2xhc3M9XCJsb2FkaW5nLXNwaW5uZXJcIj48L2Rpdj48cCBzdHlsZT1cIm1hcmdpbi10b3A6MTJweDtjb2xvcjojNjQ3NDhiO1wiPkxvYWRpbmcgY292ZXIgbGV0dGVyXHUyMDI2PC9wPjwvZGl2Pic7XG5cbiAgLy8gRmV0Y2ggcHJpb3Igc2Vzc2lvbnMgd2l0aCBjb3ZlciBsZXR0ZXJzXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL2NvdmVyLWxldHRlci9wcmlvcicpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIF9jb3ZlckxldHRlclByaW9yU2Vzc2lvbnMgPSAoZGF0YS5zZXNzaW9ucyB8fCBbXSk7XG4gIH0gY2F0Y2ggKF8pIHtcbiAgICBfY292ZXJMZXR0ZXJQcmlvclNlc3Npb25zID0gW107XG4gIH1cblxuICBjb25zdCB0b25lT3B0aW9ucyA9IENPVkVSX0xFVFRFUl9UT05FUy5tYXAodCA9PlxuICAgIGA8b3B0aW9uIHZhbHVlPVwiJHt0LnZhbHVlfVwiPiR7ZXNjYXBlSHRtbCh0LmxhYmVsKX08L29wdGlvbj5gXG4gICkuam9pbignJyk7XG5cbiAgY29uc3Qgb3BlbmluZ09wdGlvbnMgPSBDT1ZFUl9MRVRURVJfT1BFTklOR1MubWFwKG8gPT5cbiAgICBgPG9wdGlvbiB2YWx1ZT1cIiR7by52YWx1ZX1cIj4ke2VzY2FwZUh0bWwoby5sYWJlbCl9PC9vcHRpb24+YFxuICApLmpvaW4oJycpO1xuXG4gIGNvbnN0IHByaW9yU2VjdGlvbiA9IF9jb3ZlckxldHRlclByaW9yU2Vzc2lvbnMubGVuZ3RoID8gYFxuICAgIDxkaXYgY2xhc3M9XCJjbC1wcmlvci1zZWN0aW9uXCI+XG4gICAgICA8aDM+XHVEODNEXHVEQ0NCIFByaW9yIENvdmVyIExldHRlcnM8L2gzPlxuICAgICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO2ZvbnQtc2l6ZTowLjg1ZW07bWFyZ2luLWJvdHRvbToxMHB4O1wiPlxuICAgICAgICBTZWxlY3QgYSBwcmlvciBsZXR0ZXIgdG8gdXNlIGFzIGEgc3RhcnRpbmcgcG9pbnQuXG4gICAgICA8L3A+XG4gICAgICA8ZGl2IGlkPVwiY2wtcHJpb3ItbGlzdFwiPlxuICAgICAgICAke19jb3ZlckxldHRlclByaW9yU2Vzc2lvbnMubWFwKChzLCBpKSA9PiBgXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNsLXByaW9yLWNhcmRcIiBpZD1cImNsLXByaW9yLSR7aX1cIj5cbiAgICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6MTBweDthbGlnbi1pdGVtczpmbGV4LXN0YXJ0O2N1cnNvcjpwb2ludGVyO1wiPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cImNsLXByaW9yXCIgdmFsdWU9XCIke2l9XCIgc3R5bGU9XCJtYXJnaW4tdG9wOjNweDtcIiAvPlxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxzdHJvbmc+JHtlc2NhcGVIdG1sKHMucm9sZSB8fCAnUm9sZScpfSBhdCAke2VzY2FwZUh0bWwocy5jb21wYW55IHx8ICdDb21wYW55Jyl9PC9zdHJvbmc+XG4gICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjojOTRhM2I4O2ZvbnQtc2l6ZTowLjgyZW07bWFyZ2luLWxlZnQ6NnB4O1wiPiR7ZXNjYXBlSHRtbChzLmRhdGUgfHwgJycpfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAke3MudG9uZSA/IGA8c3BhbiBjbGFzcz1cImNsLXRvbmUtYmFkZ2VcIj4ke2VzY2FwZUh0bWwocy50b25lKX08L3NwYW4+YCA6ICcnfVxuICAgICAgICAgICAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzY0NzQ4Yjtmb250LXNpemU6MC44NWVtO21hcmdpbjo0cHggMCAwO1wiPiR7ZXNjYXBlSHRtbCgocy5wcmV2aWV3IHx8ICcnKS5zbGljZSgwLCAxMjApKX1cdTIwMjY8L3A+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8L2Rpdj5gKS5qb2luKCcnKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PmAgOiAnJztcblxuICBjb250ZW50LmlubmVySFRNTCA9IGBcbiAgICA8aDE+XHVEODNEXHVEQ0U5IENvdmVyIExldHRlcjwvaDE+XG4gICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO21hcmdpbi1ib3R0b206MjBweDtcIj5cbiAgICAgIEdlbmVyYXRlIGEgdGFpbG9yZWQgY292ZXIgbGV0dGVyIGZvciB0aGlzIGFwcGxpY2F0aW9uIHVzaW5nIHlvdXIgQ1YgY29udGVudFxuICAgICAgYW5kIGpvYiBhbmFseXNpcyBhcyBjb250ZXh0LlxuICAgIDwvcD5cblxuICAgICR7cHJpb3JTZWN0aW9ufVxuXG4gICAgPGRpdiBjbGFzcz1cImNsLWZvcm0tc2VjdGlvblwiPlxuICAgICAgPGgzPkdlbmVyYXRpb24gT3B0aW9uczwvaDM+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2wtZm9ybS1ncmlkXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjbC1mb3JtLWZpZWxkXCI+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cImNsLXRvbmUtc2VsZWN0XCI+VG9uZSAvIEluZHVzdHJ5PC9sYWJlbD5cbiAgICAgICAgICA8c2VsZWN0IGlkPVwiY2wtdG9uZS1zZWxlY3RcIiBjbGFzcz1cImVkaXQtaW5wdXRcIj4ke3RvbmVPcHRpb25zfTwvc2VsZWN0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNsLWZvcm0tZmllbGRcIj5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwiY2wtb3BlbmluZy1zdHlsZVwiPk9wZW5pbmcgU3R5bGU8L2xhYmVsPlxuICAgICAgICAgIDxzZWxlY3QgaWQ9XCJjbC1vcGVuaW5nLXN0eWxlXCIgY2xhc3M9XCJlZGl0LWlucHV0XCI+JHtvcGVuaW5nT3B0aW9uc308L3NlbGVjdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjbC1mb3JtLWZpZWxkXCI+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cImNsLWhpcmluZy1tYW5hZ2VyXCI+SGlyaW5nIE1hbmFnZXIgTmFtZS9UaXRsZSA8c3BhbiBzdHlsZT1cImNvbG9yOiM5NGEzYjg7Zm9udC13ZWlnaHQ6NDAwO1wiPihvcHRpb25hbCk8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImNsLWhpcmluZy1tYW5hZ2VyXCIgY2xhc3M9XCJlZGl0LWlucHV0XCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIERyLiBKYW5lIFNtaXRoLCBIZWFkIG9mIERhdGEgU2NpZW5jZVwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2wtZm9ybS1maWVsZFwiIHN0eWxlPVwibWFyZ2luLXRvcDoxMnB4O1wiPlxuICAgICAgICA8bGFiZWwgZm9yPVwiY2wtY29tcGFueS1hZGRyZXNzXCI+Q29tcGFueSBBZGRyZXNzIDxzcGFuIHN0eWxlPVwiY29sb3I6Izk0YTNiODtmb250LXdlaWdodDo0MDA7XCI+KG9wdGlvbmFsKTwvc3Bhbj48L2xhYmVsPlxuICAgICAgICA8dGV4dGFyZWEgaWQ9XCJjbC1jb21wYW55LWFkZHJlc3NcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiByb3dzPVwiMlwiXG4gICAgICAgICAgICBzdHlsZT1cInJlc2l6ZTp2ZXJ0aWNhbDtcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIEFjbWUgQ29ycCwgMTIzIE1haW4gU3QsIEJvc3RvbiBNQSAwMjEzNFwiPjwvdGV4dGFyZWE+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjbC1mb3JtLWZpZWxkXCIgc3R5bGU9XCJtYXJnaW4tdG9wOjEycHg7XCI+XG4gICAgICAgIDxsYWJlbCBmb3I9XCJjbC1oaWdobGlnaHRcIj5TcGVjaWZpYyBhY2hpZXZlbWVudCBvciBwcm9qZWN0IHRvIGhpZ2hsaWdodCA8c3BhbiBzdHlsZT1cImNvbG9yOiM5NGEzYjg7Zm9udC13ZWlnaHQ6NDAwO1wiPihvcHRpb25hbCk8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJjbC1oaWdobGlnaHRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIExlZCB0aGUgbWlncmF0aW9uIHRvIEt1YmVybmV0ZXMgc2F2aW5nIDMwJSBpbmZyYSBjb3N0XCIgLz5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNsLWZvcm0tZmllbGRcIiBzdHlsZT1cIm1hcmdpbi10b3A6MTJweDtcIj5cbiAgICAgICAgPGxhYmVsIGZvcj1cImNsLWNvbXBhbnktY29udGV4dFwiPkNvbXBhbnkgY29udGV4dCA8c3BhbiBzdHlsZT1cImNvbG9yOiM5NGEzYjg7Zm9udC13ZWlnaHQ6NDAwO1wiPihvcHRpb25hbCBcdTIwMTQgcGFzdGUgc3BlY2lmaWMgaW5pdGlhdGl2ZXMsIHByb2R1Y3RzLCB2YWx1ZXMsIG9yIHJlY2VudCBuZXdzKTwvc3Bhbj48L2xhYmVsPlxuICAgICAgICA8dGV4dGFyZWEgaWQ9XCJjbC1jb21wYW55LWNvbnRleHRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiByb3dzPVwiM1wiXG4gICAgICAgICAgICBzdHlsZT1cInJlc2l6ZTp2ZXJ0aWNhbDtcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIFRoZXkganVzdCBsYXVuY2hlZCBhIG5ldyBBSSBwbGF0Zm9ybSBmb3IgaGVhbHRoY2FyZTsgdGhlaXIgQ1RPIHdyb3RlIGFib3V0IHByaW9yaXRpc2luZyByZWxpYWJpbGl0eSBvdmVyIHNwZWVkXHUyMDI2XCI+PC90ZXh0YXJlYT5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6MTZweDtcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG4gcHJpbWFyeVwiIGlkPVwiY2wtZ2VuZXJhdGUtYnRuXCIgb25jbGljaz1cImdlbmVyYXRlQ292ZXJMZXR0ZXIoKVwiPlxuICAgICAgICAgIFx1MjcyOCBHZW5lcmF0ZSBDb3ZlciBMZXR0ZXJcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgaWQ9XCJjbC1yZXN1bHQtc2VjdGlvblwiIHN0eWxlPVwiZGlzcGxheTpub25lO21hcmdpbi10b3A6MjRweDtcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjbC1yZXN1bHQtaGVhZGVyXCI+XG4gICAgICAgIDxoMz5HZW5lcmF0ZWQgQ292ZXIgTGV0dGVyPC9oMz5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6OHB4O2ZsZXgtd3JhcDp3cmFwO1wiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgb25jbGljaz1cImdlbmVyYXRlQ292ZXJMZXR0ZXIoKVwiIHRpdGxlPVwiUmVnZW5lcmF0ZVwiPlx1RDgzRFx1REQwNCBSZWdlbmVyYXRlPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG4gcHJpbWFyeVwiIG9uY2xpY2s9XCJzYXZlQ292ZXJMZXR0ZXIoKVwiIGlkPVwiY2wtc2F2ZS1idG5cIj5cdUQ4M0RcdURDQkUgU2F2ZSBDb3ZlciBMZXR0ZXI8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtmb250LXNpemU6MC44NWVtO21hcmdpbi1ib3R0b206OHB4O1wiPlxuICAgICAgICBFZGl0IHRoZSB0ZXh0IGJlbG93IGJlZm9yZSBzYXZpbmcuXG4gICAgICA8L3A+XG4gICAgICA8dGV4dGFyZWEgaWQ9XCJjbC1sZXR0ZXItdGV4dGFyZWFcIiBjbGFzcz1cImNsLWxldHRlci10ZXh0YXJlYVwiIHJvd3M9XCIyMlwiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIkNvdmVyIGxldHRlciB0ZXh0IFx1MjAxNCBlZGl0IGFzIG5lZWRlZFwiXG4gICAgICAgICAgb25pbnB1dD1cIl9kZWJvdW5jZWRWYWxpZGF0ZUNMKCk7IF9jb3ZlckxldHRlckZvcm1TdGF0ZS5sZXR0ZXJUZXh0ID0gdGhpcy52YWx1ZTtcIj48L3RleHRhcmVhPlxuICAgICAgPGRpdiBpZD1cImNsLXZhbGlkYXRpb24tcGFuZWxcIiBjbGFzcz1cImNsLXZhbGlkYXRpb24tcGFuZWxcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj5cbiAgICAgICAgPGg0Plx1RDgzRFx1RENDQSBRdWFsaXR5IENoZWNrczwvaDQ+XG4gICAgICAgIDxkaXYgaWQ9XCJjbC1jaGVja3MtY29udGFpbmVyXCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJuYXYtYnV0dG9ucyBuYXYtZW5kXCIgc3R5bGU9XCJtYXJnaW4tdG9wOjI0cHg7XCI+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiY29udGludWUtYnRuXCIgb25jbGljaz1cImhhbmRsZVN0ZXBDbGljaygnc2NyZWVuaW5nJylcIj5cdUQ4M0RcdURDQ0IgUHJvY2VlZCB0byBTY3JlZW5pbmcgXHUyMTkyPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIGA7XG5cbiAgLy8gUmVzdG9yZSBzYXZlZCBmb3JtIHN0YXRlIGFuZCB3aXJlIHVwIHNhdmUtb24tY2hhbmdlIGxpc3RlbmVycy5cbiAgX3Jlc3RvcmVDb3ZlckxldHRlckZvcm1TdGF0ZSgpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgQ292ZXIgbGV0dGVyIGZvcm0gc3RhdGUgaGVscGVycyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gX3Jlc3RvcmVDb3ZlckxldHRlckZvcm1TdGF0ZSgpIHtcbiAgY29uc3QgdG9uZUVsICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLXRvbmUtc2VsZWN0Jyk7XG4gIGNvbnN0IG9wZW5pbmdFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1vcGVuaW5nLXN0eWxlJyk7XG4gIGNvbnN0IGhtRWwgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1oaXJpbmctbWFuYWdlcicpO1xuICBjb25zdCBhZGRyRWwgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtY29tcGFueS1hZGRyZXNzJyk7XG4gIGNvbnN0IGhsRWwgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1oaWdobGlnaHQnKTtcbiAgY29uc3QgY3R4RWwgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWNvbXBhbnktY29udGV4dCcpO1xuICBjb25zdCByZXN1bHRFbCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtcmVzdWx0LXNlY3Rpb24nKTtcbiAgY29uc3QgbGV0dGVyRWwgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWxldHRlci10ZXh0YXJlYScpO1xuXG4gIGlmICh0b25lRWwgJiYgX2NvdmVyTGV0dGVyRm9ybVN0YXRlLnRvbmUpXG4gICAgdG9uZUVsLnZhbHVlID0gX2NvdmVyTGV0dGVyRm9ybVN0YXRlLnRvbmU7XG4gIGlmIChvcGVuaW5nRWwgJiYgX2NvdmVyTGV0dGVyRm9ybVN0YXRlLm9wZW5pbmdTdHlsZSlcbiAgICBvcGVuaW5nRWwudmFsdWUgPSBfY292ZXJMZXR0ZXJGb3JtU3RhdGUub3BlbmluZ1N0eWxlO1xuICBpZiAoaG1FbCAmJiBfY292ZXJMZXR0ZXJGb3JtU3RhdGUuaGlyaW5nTWFuYWdlcilcbiAgICBobUVsLnZhbHVlID0gX2NvdmVyTGV0dGVyRm9ybVN0YXRlLmhpcmluZ01hbmFnZXI7XG4gIGlmIChhZGRyRWwgJiYgX2NvdmVyTGV0dGVyRm9ybVN0YXRlLmNvbXBhbnlBZGRyZXNzKVxuICAgIGFkZHJFbC52YWx1ZSA9IF9jb3ZlckxldHRlckZvcm1TdGF0ZS5jb21wYW55QWRkcmVzcztcbiAgaWYgKGhsRWwgJiYgX2NvdmVyTGV0dGVyRm9ybVN0YXRlLmhpZ2hsaWdodClcbiAgICBobEVsLnZhbHVlID0gX2NvdmVyTGV0dGVyRm9ybVN0YXRlLmhpZ2hsaWdodDtcbiAgaWYgKGN0eEVsICYmIF9jb3ZlckxldHRlckZvcm1TdGF0ZS5jb21wYW55Q29udGV4dClcbiAgICBjdHhFbC52YWx1ZSA9IF9jb3ZlckxldHRlckZvcm1TdGF0ZS5jb21wYW55Q29udGV4dDtcblxuICBpZiAoX2NvdmVyTGV0dGVyRm9ybVN0YXRlLmxldHRlclZpc2libGUgJiYgX2NvdmVyTGV0dGVyRm9ybVN0YXRlLmxldHRlclRleHQpIHtcbiAgICBpZiAocmVzdWx0RWwpIHJlc3VsdEVsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgIGlmIChsZXR0ZXJFbCkge1xuICAgICAgbGV0dGVyRWwudmFsdWUgPSBfY292ZXJMZXR0ZXJGb3JtU3RhdGUubGV0dGVyVGV4dDtcbiAgICAgIF92YWxpZGF0ZUNvdmVyTGV0dGVyKGxldHRlckVsLnZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvLyBXaXJlIHVwIHNhdmUtb24tY2hhbmdlIGxpc3RlbmVycyAoaW5saW5lIG9uaW5wdXQgYWxyZWFkeSBoYW5kbGVzIGxldHRlclRleHQpLlxuICBpZiAodG9uZUVsKSAgICB0b25lRWwuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgICAoKSA9PiB7IF9jb3ZlckxldHRlckZvcm1TdGF0ZS50b25lID0gdG9uZUVsLnZhbHVlOyB9KTtcbiAgaWYgKG9wZW5pbmdFbCkgb3BlbmluZ0VsLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHsgX2NvdmVyTGV0dGVyRm9ybVN0YXRlLm9wZW5pbmdTdHlsZSA9IG9wZW5pbmdFbC52YWx1ZTsgfSk7XG4gIGlmIChobUVsKSAgICAgIGhtRWwuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAgICAgICgpID0+IHsgX2NvdmVyTGV0dGVyRm9ybVN0YXRlLmhpcmluZ01hbmFnZXIgPSBobUVsLnZhbHVlOyB9KTtcbiAgaWYgKGFkZHJFbCkgICAgYWRkckVsLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgICAgKCkgPT4geyBfY292ZXJMZXR0ZXJGb3JtU3RhdGUuY29tcGFueUFkZHJlc3MgPSBhZGRyRWwudmFsdWU7IH0pO1xuICBpZiAoaGxFbCkgICAgICBobEVsLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgICAgICAoKSA9PiB7IF9jb3ZlckxldHRlckZvcm1TdGF0ZS5oaWdobGlnaHQgPSBobEVsLnZhbHVlOyB9KTtcbiAgaWYgKGN0eEVsKSAgICAgY3R4RWwuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAgICAgKCkgPT4geyBfY292ZXJMZXR0ZXJGb3JtU3RhdGUuY29tcGFueUNvbnRleHQgPSBjdHhFbC52YWx1ZTsgfSk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBHZW5lcmF0ZSBjb3ZlciBsZXR0ZXIgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQ292ZXJMZXR0ZXIoKSB7XG4gIC8qIGR1Y2tmbG93OlxuICAgKiAgIGlkOiBjb3Zlcl9sZXR0ZXJfdWlfZ2VuZXJhdGVfbGl2ZVxuICAgKiAgIGtpbmQ6IHVpXG4gICAqICAgdGltZXN0YW1wOiAnMjAyNi0wNC0yMVQxODowMDowMFonXG4gICAqICAgc3RhdHVzOiBsaXZlXG4gICAqICAgaGFuZGxlczpcbiAgICogICAtIHVpOmNvdmVyLWxldHRlci5nZW5lcmF0ZVxuICAgKiAgIGNhbGxzOlxuICAgKiAgIC0gUE9TVCAvYXBpL2NvdmVyLWxldHRlci9nZW5lcmF0ZVxuICAgKiAgIHJlYWRzOlxuICAgKiAgIC0gZG9tOiNjbC10b25lLXNlbGVjdC52YWx1ZVxuICAgKiAgIC0gZG9tOiNjbC1vcGVuaW5nLXN0eWxlLnZhbHVlXG4gICAqICAgLSBkb206I2NsLWhpcmluZy1tYW5hZ2VyLnZhbHVlXG4gICAqICAgLSBkb206I2NsLWNvbXBhbnktYWRkcmVzcy52YWx1ZVxuICAgKiAgIC0gZG9tOiNjbC1oaWdobGlnaHQudmFsdWVcbiAgICogICAtIGRvbTppbnB1dFtuYW1lPWNsLXByaW9yXS5jaGVja2VkXG4gICAqICAgd3JpdGVzOlxuICAgKiAgIC0gcmVxdWVzdDpQT1NUIC9hcGkvY292ZXItbGV0dGVyL2dlbmVyYXRlLnRvbmVcbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL2NvdmVyLWxldHRlci9nZW5lcmF0ZS5vcGVuaW5nX3N0eWxlXG4gICAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9jb3Zlci1sZXR0ZXIvZ2VuZXJhdGUuaGlyaW5nX21hbmFnZXJcbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL2NvdmVyLWxldHRlci9nZW5lcmF0ZS5jb21wYW55X2FkZHJlc3NcbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL2NvdmVyLWxldHRlci9nZW5lcmF0ZS5oaWdobGlnaHRcbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL2NvdmVyLWxldHRlci9nZW5lcmF0ZS5yZXVzZV9ib2R5XG4gICAqICAgLSBkb206I2NsLWxldHRlci10ZXh0YXJlYS52YWx1ZVxuICAgKiAgIG5vdGVzOiBTdWJtaXRzIGNvdmVyLWxldHRlciBwcm9tcHQgaW5wdXRzIChpbmNsdWRpbmcgY29uZmlndXJhYmxlIG9wZW5pbmcgc3R5bGUpIGFuZCBvcHRpb25hbCByZXVzZSB0ZXh0LCB0aGVuIHdyaXRlcyB0aGUgZ2VuZXJhdGVkIGJvZHkgaW50byB0aGUgZWRpdGFibGUgY292ZXItbGV0dGVyIHRleHRhcmVhLlxuICAgKi9cbiAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWdlbmVyYXRlLWJ0bicpO1xuICBidG4uZGlzYWJsZWQgPSB0cnVlO1xuICBidG4udGV4dENvbnRlbnQgPSAnXHUyM0YzIEdlbmVyYXRpbmdcdTIwMjYnO1xuXG4gIGNvbnN0IHRvbmUgICAgICAgICAgICA9IChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtdG9uZS1zZWxlY3QnKSAgICAgIHx8IHt9KS52YWx1ZSB8fCAnc3RhcnR1cC90ZWNoJztcbiAgY29uc3Qgb3BlbmluZ19zdHlsZSAgID0gKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1vcGVuaW5nLXN0eWxlJykgICAgfHwge30pLnZhbHVlIHx8ICdmb3JtYWwnO1xuICBjb25zdCBoaXJpbmdfbWFuYWdlciAgPSAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWhpcmluZy1tYW5hZ2VyJykgICB8fCB7fSkudmFsdWUgfHwgJyc7XG4gIGNvbnN0IGNvbXBhbnlfYWRkcmVzcyA9IChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtY29tcGFueS1hZGRyZXNzJykgIHx8IHt9KS52YWx1ZSB8fCAnJztcbiAgY29uc3QgaGlnaGxpZ2h0ICAgICAgID0gKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1oaWdobGlnaHQnKSAgICAgICAgIHx8IHt9KS52YWx1ZSB8fCAnJztcbiAgY29uc3QgY29tcGFueV9jb250ZXh0ID0gKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1jb21wYW55LWNvbnRleHQnKSAgfHwge30pLnZhbHVlIHx8ICcnO1xuXG4gIC8vIENoZWNrIGZvciBwcmlvciBsZXR0ZXIgc2VsZWN0aW9uXG4gIGxldCByZXVzZV9ib2R5ID0gJyc7XG4gIGNvbnN0IGNoZWNrZWRQcmlvciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W25hbWU9XCJjbC1wcmlvclwiXTpjaGVja2VkJyk7XG4gIGlmIChjaGVja2VkUHJpb3IpIHtcbiAgICBjb25zdCBpZHggPSBwYXJzZUludChjaGVja2VkUHJpb3IudmFsdWUsIDEwKTtcbiAgICByZXVzZV9ib2R5ID0gKF9jb3ZlckxldHRlclByaW9yU2Vzc2lvbnNbaWR4XSB8fCB7fSkuZnVsbF90ZXh0IHx8ICcnO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvY292ZXItbGV0dGVyL2dlbmVyYXRlJywge1xuICAgICAgbWV0aG9kOiAgJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiAgICBKU09OLnN0cmluZ2lmeSh7IHRvbmUsIG9wZW5pbmdfc3R5bGUsIGhpcmluZ19tYW5hZ2VyLCBjb21wYW55X2FkZHJlc3MsIGhpZ2hsaWdodCwgY29tcGFueV9jb250ZXh0LCByZXVzZV9ib2R5IH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuXG4gICAgaWYgKGRhdGEub2spIHtcbiAgICAgIGNvbnN0IHJlc3VsdFNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtcmVzdWx0LXNlY3Rpb24nKTtcbiAgICAgIGNvbnN0IHRleHRhcmVhICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtbGV0dGVyLXRleHRhcmVhJyk7XG4gICAgICBpZiAocmVzdWx0U2VjdGlvbikgcmVzdWx0U2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgIGlmICh0ZXh0YXJlYSkge1xuICAgICAgICB0ZXh0YXJlYS52YWx1ZSA9IGRhdGEudGV4dDtcbiAgICAgICAgX3ZhbGlkYXRlQ292ZXJMZXR0ZXIodGV4dGFyZWEudmFsdWUpO1xuICAgICAgfVxuICAgICAgX2NvdmVyTGV0dGVyRm9ybVN0YXRlLmxldHRlclRleHQgICAgPSBkYXRhLnRleHQ7XG4gICAgICBfY292ZXJMZXR0ZXJGb3JtU3RhdGUubGV0dGVyVmlzaWJsZSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgR2VuZXJhdGlvbiBGYWlsZWQnLCBkYXRhLmVycm9yIHx8ICdMTE0gZGlkIG5vdCByZXR1cm4gYSBjb3ZlciBsZXR0ZXIuJyk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsICdGYWlsZWQgdG8gY29udGFjdCBzZXJ2ZXIuJyk7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKGJ0bikge1xuICAgICAgYnRuLmRpc2FibGVkICAgID0gZmFsc2U7XG4gICAgICBidG4udGV4dENvbnRlbnQgPSAnXHUyNzI4IEdlbmVyYXRlIENvdmVyIExldHRlcic7XG4gICAgfVxuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBTYXZlIGNvdmVyIGxldHRlciBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gc2F2ZUNvdmVyTGV0dGVyKCkge1xuICAvKiBkdWNrZmxvdzpcbiAgICogICBpZDogY292ZXJfbGV0dGVyX3VpX3NhdmVfbGl2ZVxuICAgKiAgIGtpbmQ6IHVpXG4gICAqICAgdGltZXN0YW1wOiAnMjAyNi0wMy0yNVQyMTozOTo0OFonXG4gICAqICAgc3RhdHVzOiBsaXZlXG4gICAqICAgaGFuZGxlczpcbiAgICogICAtIHVpOmNvdmVyLWxldHRlci5zYXZlXG4gICAqICAgY2FsbHM6XG4gICAqICAgLSBQT1NUIC9hcGkvY292ZXItbGV0dGVyL3NhdmVcbiAgICogICByZWFkczpcbiAgICogICAtIGRvbTojY2wtbGV0dGVyLXRleHRhcmVhLnZhbHVlXG4gICAqICAgd3JpdGVzOlxuICAgKiAgIC0gcmVxdWVzdDpQT1NUIC9hcGkvY292ZXItbGV0dGVyL3NhdmUudGV4dFxuICAgKiAgIG5vdGVzOiBTdWJtaXRzIHRoZSB1c2VyLWVkaXRlZCBjb3Zlci1sZXR0ZXIgYm9keSBmb3Igc2Vzc2lvbiBwZXJzaXN0ZW5jZSwgbWV0YWRhdGEgd3JpdGUtdGhyb3VnaCwgYW5kIGFyY2hpdmUgYXJ0aWZhY3QgZ2VuZXJhdGlvbi5cbiAgICovXG4gIGNvbnN0IHRleHRhcmVhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWxldHRlci10ZXh0YXJlYScpO1xuICBpZiAoIXRleHRhcmVhKSByZXR1cm47XG4gIGNvbnN0IHRleHQgPSB0ZXh0YXJlYS52YWx1ZS50cmltKCk7XG4gIGlmICghdGV4dCkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI2QTBcdUZFMEYgRW1wdHkgTGV0dGVyJywgJ1BsZWFzZSBnZW5lcmF0ZSBvciB0eXBlIGEgY292ZXIgbGV0dGVyIGJlZm9yZSBzYXZpbmcuJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLXNhdmUtYnRuJyk7XG4gIGlmIChidG4pIHsgYnRuLmRpc2FibGVkID0gdHJ1ZTsgYnRuLnRleHRDb250ZW50ID0gJ1x1MjNGMyBTYXZpbmdcdTIwMjYnOyB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvY292ZXItbGV0dGVyL3NhdmUnLCB7XG4gICAgICBtZXRob2Q6ICAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6ICAgIEpTT04uc3RyaW5naWZ5KHsgdGV4dCB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcblxuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzA1IFNhdmVkJywgYENvdmVyIGxldHRlciBzYXZlZCBhcyA8c3Ryb25nPiR7ZXNjYXBlSHRtbChkYXRhLmZpbGVuYW1lKX08L3N0cm9uZz4gaW4geW91ciBhcHBsaWNhdGlvbiBmb2xkZXIuYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgU2F2ZSBGYWlsZWQnLCBkYXRhLmVycm9yIHx8ICdDb3VsZCBub3Qgc2F2ZSBjb3ZlciBsZXR0ZXIuJyk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsICdGYWlsZWQgdG8gY29udGFjdCBzZXJ2ZXIuJyk7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKGJ0bikgeyBidG4uZGlzYWJsZWQgPSBmYWxzZTsgYnRuLnRleHRDb250ZW50ID0gJ1x1RDgzRFx1RENCRSBTYXZlIENvdmVyIExldHRlcic7IH1cbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgQ3Jvc3MtZG9jdW1lbnQgY29uc2lzdGVuY3kgcmVwb3J0IFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4vKipcbiAqIEJ1aWxkIGFuZCByZW5kZXIgdGhlIGNyb3NzLWRvY3VtZW50IGNvbnNpc3RlbmN5IHJlcG9ydCBpbiB0aGUgRmluYWxpc2UgdGFiLlxuICogQ2hlY2tzIGNvbXBhbnkgbmFtZSwgam9iIHRpdGxlLCBBVFMga2V5d29yZHMsIGFuZCBkYXRlIGZvcm1hdHRpbmcgYWNyb3NzXG4gKiB0aGUgQ1YgKHRhYkRhdGEuY3YpIGFuZCBjb3ZlciBsZXR0ZXIgKCNjbC1sZXR0ZXItdGV4dGFyZWEpLlxuICovXG5mdW5jdGlvbiBfcmVuZGVyQ29uc2lzdGVuY3lSZXBvcnQoc3RhdHVzRGF0YSkge1xuICBjb25zdCBwYW5lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb25zaXN0ZW5jeS1yZXBvcnQnKTtcbiAgaWYgKCFwYW5lbCkgcmV0dXJuO1xuXG4gIGNvbnN0IGFuYWx5c2lzICAgID0gc3RhdHVzRGF0YS5qb2JfYW5hbHlzaXMgfHwge307XG4gIGNvbnN0IGNvbXBhbnkgICAgID0gKGFuYWx5c2lzLmNvbXBhbnkgIHx8ICcnKS50cmltKCk7XG4gIGNvbnN0IGpvYlRpdGxlICAgID0gKGFuYWx5c2lzLnRpdGxlICAgIHx8ICcnKS50cmltKCk7XG4gIGNvbnN0IGF0c0tleXdvcmRzID0gKGFuYWx5c2lzLmF0c19rZXl3b3JkcyB8fCBbXSkuZmlsdGVyKEJvb2xlYW4pLnNsaWNlKDAsIDgpO1xuXG4gIC8vIFN0cmlwIEhUTUwgdGFncyBmcm9tIENWIGNvbnRlbnQgZm9yIHRleHQgc2VhcmNoXG4gIGNvbnN0IGN2U3RhdGUgPSBzdGF0ZU1hbmFnZXIuZ2V0VGFiRGF0YSgnY3YnKSB8fCAnJztcbiAgY29uc3QgY3ZIdG1sID0gdHlwZW9mIGN2U3RhdGUgPT09ICdzdHJpbmcnID8gY3ZTdGF0ZSA6IChjdlN0YXRlPy5bJyouaHRtbCddIHx8ICcnKTtcbiAgY29uc3QgY3ZUZXh0ID0gY3ZIdG1sLnJlcGxhY2UoLzxbXj5dKz4vZywgJyAnKS5yZXBsYWNlKC9cXHMrL2csICcgJykudG9Mb3dlckNhc2UoKTtcblxuICAvLyBHZXQgY292ZXIgbGV0dGVyIHRleHQgaWYgcHJlc2VudFxuICBjb25zdCBjbEVsICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtbGV0dGVyLXRleHRhcmVhJyk7XG4gIGNvbnN0IGNsUmF3ICA9IGNsRWwgPyBjbEVsLnZhbHVlIDogJyc7XG4gIGNvbnN0IGNsVGV4dCA9IGNsUmF3LnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IGhhc0NMICA9IGNsUmF3LnRyaW0oKS5sZW5ndGggPiA1MDtcblxuICBpZiAoIWNvbXBhbnkgJiYgIWpvYlRpdGxlICYmICFhdHNLZXl3b3Jkcy5sZW5ndGgpIHtcbiAgICBwYW5lbC5pbm5lckhUTUwgPSAnJztcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBjaGVja3MgPSBbXTtcblxuICAvLyBcdTI1MDBcdTI1MDAgMS4gQ29tcGFueSBuYW1lIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICBpZiAoY29tcGFueSkge1xuICAgIGNvbnN0IGNvbXBMYyA9IGNvbXBhbnkudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBpbkNWICAgPSBjdlRleHQuaW5jbHVkZXMoY29tcExjKTtcbiAgICBjb25zdCBpbkNMICAgPSBoYXNDTCAmJiBjbFRleHQuaW5jbHVkZXMoY29tcExjKTtcbiAgICBjb25zdCBtaXNzaW5nID0gW107XG4gICAgaWYgKCFpbkNWKSAgICAgICAgICBtaXNzaW5nLnB1c2goJ0NWJyk7XG4gICAgaWYgKGhhc0NMICYmICFpbkNMKSBtaXNzaW5nLnB1c2goJ2NvdmVyIGxldHRlcicpO1xuICAgIGNvbnN0IHN0YXR1cyA9IG1pc3NpbmcubGVuZ3RoID09PSAwID8gJ3Bhc3MnIDogbWlzc2luZy5sZW5ndGggPCAyICYmIGhhc0NMID8gJ3dhcm4nIDogJ2ZhaWwnO1xuICAgIGNoZWNrcy5wdXNoKHtcbiAgICAgIHN0YXR1cyxcbiAgICAgIGxhYmVsOiAgJ0NvbXBhbnkgbmFtZScsXG4gICAgICBkZXRhaWw6IHN0YXR1cyA9PT0gJ3Bhc3MnXG4gICAgICAgID8gYFxcdTIwMWMke2VzY2FwZUh0bWwoY29tcGFueSl9XFx1MjAxZCBmb3VuZCBpbiBhbGwgZG9jdW1lbnRzLmBcbiAgICAgICAgOiBgXFx1MjAxYyR7ZXNjYXBlSHRtbChjb21wYW55KX1cXHUyMDFkIG1pc3NpbmcgZnJvbTogJHttaXNzaW5nLmpvaW4oJywgJyl9LmAsXG4gICAgfSk7XG4gIH1cblxuICAvLyBcdTI1MDBcdTI1MDAgMi4gSm9iIHRpdGxlIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICBpZiAoam9iVGl0bGUpIHtcbiAgICBjb25zdCB0aXRsZUxjICAgPSBqb2JUaXRsZS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IHRpdGxlQ29yZSA9IHRpdGxlTGMucmVwbGFjZSgvXihzZW5pb3J8anVuaW9yfGxlYWR8cHJpbmNpcGFsfHN0YWZmfGFzc29jaWF0ZSlcXHMrLywgJycpO1xuICAgIGNvbnN0IGluQ1YgICAgICA9IGN2VGV4dC5pbmNsdWRlcyh0aXRsZUxjKSB8fCBjdlRleHQuaW5jbHVkZXModGl0bGVDb3JlKTtcbiAgICBjb25zdCBpbkNMICAgICAgPSBoYXNDTCAmJiAoY2xUZXh0LmluY2x1ZGVzKHRpdGxlTGMpIHx8IGNsVGV4dC5pbmNsdWRlcyh0aXRsZUNvcmUpKTtcbiAgICBjb25zdCBtaXNzaW5nICAgPSBbXTtcbiAgICBpZiAoIWluQ1YpICAgICAgICAgIG1pc3NpbmcucHVzaCgnQ1YnKTtcbiAgICBpZiAoaGFzQ0wgJiYgIWluQ0wpIG1pc3NpbmcucHVzaCgnY292ZXIgbGV0dGVyJyk7XG4gICAgY29uc3Qgc3RhdHVzID0gbWlzc2luZy5sZW5ndGggPT09IDAgPyAncGFzcycgOiBtaXNzaW5nLmxlbmd0aCA8IDIgJiYgaGFzQ0wgPyAnd2FybicgOiAnZmFpbCc7XG4gICAgY2hlY2tzLnB1c2goe1xuICAgICAgc3RhdHVzLFxuICAgICAgbGFiZWw6ICAnSm9iIHRpdGxlJyxcbiAgICAgIGRldGFpbDogc3RhdHVzID09PSAncGFzcydcbiAgICAgICAgPyBgXFx1MjAxYyR7ZXNjYXBlSHRtbChqb2JUaXRsZSl9XFx1MjAxZCBmb3VuZCBpbiBhbGwgZG9jdW1lbnRzLmBcbiAgICAgICAgOiBgXFx1MjAxYyR7ZXNjYXBlSHRtbChqb2JUaXRsZSl9XFx1MjAxZCBtaXNzaW5nIGZyb206ICR7bWlzc2luZy5qb2luKCcsICcpfS5gLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gXHUyNTAwXHUyNTAwIDMuIEFUUyBrZXl3b3JkcyAodG9wIDgpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICBpZiAoYXRzS2V5d29yZHMubGVuZ3RoKSB7XG4gICAgY29uc3QgbWlzc2luZ0NWID0gYXRzS2V5d29yZHMuZmlsdGVyKGt3ID0+ICFjdlRleHQuaW5jbHVkZXMoa3cudG9Mb3dlckNhc2UoKSkpO1xuICAgIGNvbnN0IG1pc3NpbmdDTCA9IGhhc0NMID8gYXRzS2V5d29yZHMuZmlsdGVyKGt3ID0+ICFjbFRleHQuaW5jbHVkZXMoa3cudG9Mb3dlckNhc2UoKSkpIDogW107XG4gICAgY29uc3QgdG90YWxNaXNzaW5nID0gbmV3IFNldChbLi4ubWlzc2luZ0NWLCAuLi5taXNzaW5nQ0xdKS5zaXplO1xuICAgIGNvbnN0IHN0YXR1cyA9IHRvdGFsTWlzc2luZyA9PT0gMCA/ICdwYXNzJyA6IHRvdGFsTWlzc2luZyA8PSAzID8gJ3dhcm4nIDogJ2ZhaWwnO1xuICAgIGNvbnN0IHBhcnRzICA9IFtdO1xuICAgIGlmIChtaXNzaW5nQ1YubGVuZ3RoKSBwYXJ0cy5wdXNoKGBNaXNzaW5nIGZyb20gQ1Y6ICR7bWlzc2luZ0NWLm1hcChrID0+IGA8ZW0+JHtlc2NhcGVIdG1sKGspfTwvZW0+YCkuam9pbignLCAnKX1gKTtcbiAgICBpZiAobWlzc2luZ0NMLmxlbmd0aCkgcGFydHMucHVzaChgTWlzc2luZyBmcm9tIGNvdmVyIGxldHRlcjogJHttaXNzaW5nQ0wubWFwKGsgPT4gYDxlbT4ke2VzY2FwZUh0bWwoayl9PC9lbT5gKS5qb2luKCcsICcpfWApO1xuICAgIGNoZWNrcy5wdXNoKHtcbiAgICAgIHN0YXR1cyxcbiAgICAgIGxhYmVsOiAgYEFUUyBrZXl3b3JkcyAoJHthdHNLZXl3b3Jkcy5sZW5ndGh9IGNoZWNrZWQpYCxcbiAgICAgIGRldGFpbDogcGFydHMubGVuZ3RoID8gcGFydHMuam9pbignLiAnKSArICcuJyA6IGBBbGwgJHthdHNLZXl3b3Jkcy5sZW5ndGh9IGtleXdvcmRzIHByZXNlbnQgaW4gZG9jdW1lbnRzLmAsXG4gICAgfSk7XG4gIH1cblxuICAvLyBcdTI1MDBcdTI1MDAgNC4gRGF0ZSBmb3JtYXQgY29uc2lzdGVuY3kgKENWKSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgaWYgKGN2VGV4dCkge1xuICAgIGNvbnN0IGhhc1dyaXR0ZW4gPSAvXFxiKGphbnxmZWJ8bWFyfGFwcnxtYXl8anVufGp1bHxhdWd8c2VwfG9jdHxub3Z8ZGVjKVxcdypcXHMrXFxkezR9XFxiL2kudGVzdChjdlRleHQpO1xuICAgIGNvbnN0IGhhc0lTTyAgICAgPSAvXFxiXFxkezR9LVxcZHsyfVxcYi8udGVzdChjdlRleHQpO1xuICAgIGNvbnN0IGhhc1NsYXNoICAgPSAvXFxiXFxkezEsMn1cXC9cXGR7NH1cXGIvLnRlc3QoY3ZUZXh0KTtcbiAgICBjb25zdCBmb3JtYXRDb3VudCA9IFtoYXNXcml0dGVuLCBoYXNJU08sIGhhc1NsYXNoXS5maWx0ZXIoQm9vbGVhbikubGVuZ3RoO1xuICAgIGNoZWNrcy5wdXNoKHtcbiAgICAgIHN0YXR1czogZm9ybWF0Q291bnQgPD0gMSA/ICdwYXNzJyA6ICd3YXJuJyxcbiAgICAgIGxhYmVsOiAgJ0RhdGUgZm9ybWF0cyAoQ1YpJyxcbiAgICAgIGRldGFpbDogZm9ybWF0Q291bnQgPD0gMVxuICAgICAgICA/ICdDb25zaXN0ZW50IGRhdGUgZm9ybWF0IHRocm91Z2hvdXQgQ1YuJ1xuICAgICAgICA6ICdNaXhlZCBkYXRlIGZvcm1hdHMgZGV0ZWN0ZWQgKGUuZy4gXFx1MjAxY0phbiAyMDIwXFx1MjAxZCBhbmQgXFx1MjAxYzIwMjAtMDFcXHUyMDFkKSBcXHUyMDE0IHN0YW5kYXJkaXNlIGZvciBhIHBvbGlzaGVkIGxvb2suJyxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFxcdTI1MDBcXHUyNTAwIDUuIENyb3NzLWRvY3VtZW50IHRlcm1pbm9sb2d5IGNvbnNpc3RlbmN5IFxcdTI1MDBcXHUyNTAwXFx1MjUwMFxcdTI1MDBcXHUyNTAwXFx1MjUwMFxcdTI1MDBcXHUyNTAwXFx1MjUwMFxcdTI1MDBcXHUyNTAwXFx1MjUwMFxcdTI1MDBcXHUyNTAwXFx1MjUwMFxcdTI1MDBcXHUyNTAwXFx1MjUwMFxcdTI1MDBcXHUyNTAwXFx1MjUwMFxuICBjb25zdCBzcVRleHRzID0gWy4uLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RleHRhcmVhW2lkXj1cInNjLXRleHQtXCJdJyldXG4gICAgLm1hcChlbCA9PiBlbC52YWx1ZS50b0xvd2VyQ2FzZSgpKS5maWx0ZXIoQm9vbGVhbik7XG4gIGNvbnN0IGFsbERvY1RleHQgPSBbY3ZUZXh0LCBjbFRleHQsIC4uLnNxVGV4dHNdO1xuXG4gIGNvbnN0IF9URVJNX1BBSVJTID0gW1xuICAgIFsnbWFjaGluZSBsZWFybmluZycsICdtbCddLCBbJ2FydGlmaWNpYWwgaW50ZWxsaWdlbmNlJywgJ2FpJ10sXG4gICAgWyduYXR1cmFsIGxhbmd1YWdlIHByb2Nlc3NpbmcnLCAnbmxwJ10sIFsnZGVlcCBsZWFybmluZycsICdkbCddLFxuICAgIFsnbGFyZ2UgbGFuZ3VhZ2UgbW9kZWwnLCAnbGxtJ10sIFsndXNlciBpbnRlcmZhY2UnLCAndWknXSxcbiAgICBbJ3VzZXIgZXhwZXJpZW5jZScsICd1eCddLCBbJ2FwcGxpY2F0aW9uIHByb2dyYW1taW5nIGludGVyZmFjZScsICdhcGknXSxcbiAgICBbJ2t1YmVybmV0ZXMnLCAnazhzJ10sIFsnY29udGludW91cyBpbnRlZ3JhdGlvbicsICdjaS9jZCddLFxuICBdO1xuICBjb25zdCB0ZXJtTWlzbWF0Y2hlcyA9IFtdO1xuICBmb3IgKGNvbnN0IFtsb25nLCBzaG9ydF0gb2YgX1RFUk1fUEFJUlMpIHtcbiAgICBjb25zdCByZSA9IG5ldyBSZWdFeHAoYFxcXFxiJHtzaG9ydC5yZXBsYWNlKCcvJywgJ1xcXFwvJyl9XFxcXGJgKTtcbiAgICBpZiAoYWxsRG9jVGV4dC5zb21lKHQgPT4gdC5pbmNsdWRlcyhsb25nKSkgJiYgYWxsRG9jVGV4dC5zb21lKHQgPT4gcmUudGVzdCh0KSkpIHtcbiAgICAgIHRlcm1NaXNtYXRjaGVzLnB1c2goYFxcdTIwMWMke2xvbmd9XFx1MjAxZCAvIFxcdTIwMWMke3Nob3J0LnRvVXBwZXJDYXNlKCl9XFx1MjAxZGApO1xuICAgIH1cbiAgfVxuICBpZiAodGVybU1pc21hdGNoZXMubGVuZ3RoID4gMCkge1xuICAgIGNoZWNrcy5wdXNoKHtcbiAgICAgIHN0YXR1czogJ3dhcm4nLFxuICAgICAgbGFiZWw6ICAnVGVybWlub2xvZ3kgY29uc2lzdGVuY3knLFxuICAgICAgZGV0YWlsOiBgTWl4ZWQgZm9ybXMgZGV0ZWN0ZWQgYWNyb3NzIGRvY3VtZW50czogJHt0ZXJtTWlzbWF0Y2hlcy5qb2luKCc7ICcpfS4gU3RhbmRhcmRpc2UgdG8gb25lIGZvcm0gcGVyIGNvbmNlcHQuYCxcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChhbGxEb2NUZXh0LnNvbWUodCA9PiB0Lmxlbmd0aCA+IDUwKSkge1xuICAgIGNoZWNrcy5wdXNoKHtcbiAgICAgIHN0YXR1czogJ3Bhc3MnLFxuICAgICAgbGFiZWw6ICAnVGVybWlub2xvZ3kgY29uc2lzdGVuY3knLFxuICAgICAgZGV0YWlsOiAnTm8gbWl4ZWQgYWJicmV2aWF0aW9uL2V4cGFuc2lvbiBwYWlycyBkZXRlY3RlZCBhY3Jvc3MgQ1YsIGNvdmVyIGxldHRlciwgYW5kIHNjcmVlbmluZyBhbnN3ZXJzLicsXG4gICAgfSk7XG4gIH1cblxuICAvLyBcdTI1MDBcdTI1MDAgUmVuZGVyIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICBjb25zdCBpY29ucyA9IHsgcGFzczogJ1xcdTI3MDUnLCB3YXJuOiAnXFx1MjZhMFxcdWZlMGYnLCBmYWlsOiAnXFx1Mjc0YycgfTtcbiAgY29uc3Qgb3ZlcmFsbEZhaWwgICA9IGNoZWNrcy5zb21lKGMgPT4gYy5zdGF0dXMgPT09ICdmYWlsJyk7XG4gIGNvbnN0IG92ZXJhbGxXYXJuICAgPSBjaGVja3Muc29tZShjID0+IGMuc3RhdHVzID09PSAnd2FybicpO1xuICBjb25zdCBvdmVyYWxsU3RhdHVzID0gb3ZlcmFsbEZhaWwgPyAnZmFpbCcgOiBvdmVyYWxsV2FybiA/ICd3YXJuJyA6ICdwYXNzJztcbiAgY29uc3Qgb3ZlcmFsbE1zZyAgICA9IG92ZXJhbGxGYWlsXG4gICAgPyAnSXNzdWVzIGZvdW5kIFxcdTIwMTQgcmV2aWV3IGJlZm9yZSBzZW5kaW5nJ1xuICAgIDogb3ZlcmFsbFdhcm4gPyAnTWlub3IgaW5jb25zaXN0ZW5jaWVzIGRldGVjdGVkJyA6ICdBbGwgY2hlY2tzIHBhc3NlZCc7XG5cbiAgcGFuZWwuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgY2xhc3M9XCJjb25zaXN0ZW5jeS1yZXBvcnRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjci1oZWFkZXJcIj5cbiAgICAgICAgPGgzIHN0eWxlPVwibWFyZ2luOjA7Zm9udC1zaXplOjFlbTtcIj4ke2ljb25zW292ZXJhbGxTdGF0dXNdfSBDcm9zcy1Eb2N1bWVudCBDb25zaXN0ZW5jeTwvaDM+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3ItYmFkZ2UgY3ItJHtvdmVyYWxsU3RhdHVzfVwiPiR7ZXNjYXBlSHRtbChvdmVyYWxsTXNnKX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtmb250LXNpemU6MC44M2VtO21hcmdpbjowIDAgMTJweDtcIj5cbiAgICAgICAgQ2hlY2tzIGNvbXBhbnkgbmFtZSwgam9iIHRpdGxlLCBBVFMga2V5d29yZHMsIGRhdGUgZm9ybWF0dGluZywgYW5kIHRlcm1pbm9sb2d5IGNvbnNpc3RlbmN5IGFjcm9zcyBDViwgY292ZXIgbGV0dGVyLCBhbmQgc2NyZWVuaW5nIGFuc3dlcnMuXG4gICAgICA8L3A+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3ItY2hlY2tzXCI+XG4gICAgICAgICR7Y2hlY2tzLm1hcChjID0+IGBcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3ItY2hlY2sgY3ItJHtjLnN0YXR1c31cIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3ItaWNvblwiPiR7aWNvbnNbYy5zdGF0dXNdfTwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3ItbGFiZWxcIj4ke2VzY2FwZUh0bWwoYy5sYWJlbCl9PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjci1kZXRhaWxcIj4ke2MuZGV0YWlsfTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5gKS5qb2luKCcnKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PmA7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBEZWJvdW5jZWQgdmFsaWRhdGlvbiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxubGV0IF9jbFZhbGlkYXRlVGltZXIgPSBudWxsO1xuZnVuY3Rpb24gX2RlYm91bmNlZFZhbGlkYXRlQ0woKSB7XG4gIGNsZWFyVGltZW91dChfY2xWYWxpZGF0ZVRpbWVyKTtcbiAgX2NsVmFsaWRhdGVUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIGNvbnN0IHRhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWxldHRlci10ZXh0YXJlYScpO1xuICAgIGlmICh0YSkgX3ZhbGlkYXRlQ292ZXJMZXR0ZXIodGEudmFsdWUpO1xuICB9LCA2MDApO1xufVxuXG4vKipcbiAqIENsaWVudC1zaWRlIGNvdmVyIGxldHRlciBxdWFsaXR5IGNoZWNrcy5cbiAqIDUgcnVsZXM6IG9wZW5pbmcsIEktZmlyc3QgZ2F0ZSwgY29tcGFueSBuYW1lLCB3b3JkIGNvdW50IChyb2xlLWRpZmZlcmVudGlhdGVkKSwgY2FsbC10by1hY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIF92YWxpZGF0ZUNvdmVyTGV0dGVyKHRleHQpIHtcbiAgY29uc3QgcGFuZWwgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLXZhbGlkYXRpb24tcGFuZWwnKTtcbiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWNoZWNrcy1jb250YWluZXInKTtcbiAgaWYgKCFwYW5lbCB8fCAhY29udGFpbmVyIHx8ICF0ZXh0LnRyaW0oKSkgcmV0dXJuO1xuXG4gIC8vIFx1MjUwMFx1MjUwMCBSdWxlIDE6IE9wZW5pbmcgcGF0dGVybiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgY29uc3QgZmlyc3RMaW5lID0gKHRleHQuc3BsaXQoJ1xcbicpLmZpbmQobCA9PiBsLnRyaW0oKSkgfHwgJycpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBnZW5lcmljT3BlbmluZ3MgPSBbXG4gICAgL15kZWFyIGhpcmluZyBtYW5hZ2VyLyxcbiAgICAvXmRlYXIgc2lyIG9yIG1hZGFtLyxcbiAgICAvXnRvIHdob20gaXQgbWF5IGNvbmNlcm4vLFxuICAgIC9eZGVhciByZWNydWl0ZXIvLFxuICAgIC9eZGVhciBodW1hbiByZXNvdXJjZXMvLFxuICAgIC9eZGVhciBoci8sXG4gIF07XG4gIGNvbnN0IGdlbmVyaWNPcGVuaW5nID0gZ2VuZXJpY09wZW5pbmdzLnNvbWUocmUgPT4gcmUudGVzdChmaXJzdExpbmUpKTtcbiAgY29uc3Qgb3BlbmluZ0NoZWNrID0ge1xuICAgIHBhc3M6ICFnZW5lcmljT3BlbmluZyxcbiAgICBsYWJlbDogJ09wZW5pbmcgc2FsdXRhdGlvbicsXG4gICAgZGV0YWlsOiBnZW5lcmljT3BlbmluZ1xuICAgICAgPyAnVXNlcyBhIGdlbmVyaWMgb3BlbmVyIChcIkRlYXIgSGlyaW5nIE1hbmFnZXJcIiBldGMuKSBcdTIwMTQgcGVyc29uYWxpc2Ugd2l0aCBhIG5hbWUgb3Igcm9sZS4nXG4gICAgICA6ICdQZXJzb25hbGlzZWQgb3BlbmVyIFx1MjAxNCBnb29kLicsXG4gIH07XG5cbiAgLy8gXHUyNTAwXHUyNTAwIFJ1bGUgMWI6IEJvZHkgbXVzdCBub3Qgb3BlbiB3aXRoIFwiSVwiIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICBjb25zdCBhbGxMaW5lcyA9IHRleHQuc3BsaXQoJ1xcbicpLm1hcChsID0+IGwudHJpbSgpKS5maWx0ZXIoQm9vbGVhbik7XG4gIGNvbnN0IHNhbHV0YXRpb25JZHggPSBhbGxMaW5lcy5maW5kSW5kZXgoXG4gICAgbCA9PiBsLnRvTG93ZXJDYXNlKCkgPT09IGZpcnN0TGluZS50b0xvd2VyQ2FzZSgpXG4gICk7XG4gIGNvbnN0IGJvZHlMaW5lcyA9IGFsbExpbmVzLnNsaWNlKE1hdGgubWF4KDAsIHNhbHV0YXRpb25JZHggKyAxKSk7XG4gIGNvbnN0IGZpcnN0Qm9keVdvcmQgPSAoYm9keUxpbmVzLmZpbmQobCA9PiBsLnRyaW0oKSkgfHwgJycpLnNwbGl0KC9cXHMrLylbMF0gfHwgJyc7XG4gIC8vIFNwbGl0IG9uIG5vbi1hbHBoYSBzbyBcIkknbVwiIFx1MjE5MiB0b2tlbiBcIklcIiwgXCJJblwiIFx1MjE5MiB0b2tlbiBcIkluXCJcbiAgY29uc3QgZmlyc3RCb2R5VG9rZW4gPSBmaXJzdEJvZHlXb3JkLnNwbGl0KC9bXmEtekEtWl0vKVswXSB8fCAnJztcbiAgY29uc3QgYm9keVN0YXJ0c1dpdGhJID0gZmlyc3RCb2R5VG9rZW4udG9Mb3dlckNhc2UoKSA9PT0gJ2knO1xuICBjb25zdCBpRmlyc3RDaGVjayA9IHtcbiAgICBwYXNzOiAhYm9keVN0YXJ0c1dpdGhJLFxuICAgIGxhYmVsOiAnT3BlbmluZyB3b3JkJyxcbiAgICBkZXRhaWw6IGJvZHlTdGFydHNXaXRoSVxuICAgICAgPyAnQm9keSBvcGVucyB3aXRoIFwiSVwiIFx1MjAxNCBsZWFkIHdpdGggeW91ciB2YWx1ZSwgdGhlIHJvbGUsIG9yIHRoZSBjb21wYW55IGluc3RlYWQuJ1xuICAgICAgOiAnQm9keSBkb2VzIG5vdCBvcGVuIHdpdGggXCJJXCIgXHUyMDE0IGdvb2QuJyxcbiAgfTtcblxuICAvLyBcdTI1MDBcdTI1MDAgUnVsZSAyOiBDb21wYW55LXNwZWNpZmljIHJlZmVyZW5jZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgY29uc3QgY29tcGFueU5hbWUgPSBfZ2V0Q29tcGFueU5hbWVGb3JDTCgpO1xuICBsZXQgY29tcGFueUNoZWNrO1xuICBpZiAoIWNvbXBhbnlOYW1lKSB7XG4gICAgY29tcGFueUNoZWNrID0geyB3YXJuOiB0cnVlLCBsYWJlbDogJ0NvbXBhbnkgcmVmZXJlbmNlJywgZGV0YWlsOiAnQ29tcGFueSBuYW1lIG5vdCBkZXRlY3RlZCBmcm9tIGpvYiBkZXNjcmlwdGlvbiBcdTIwMTQgdmVyaWZ5IG1hbnVhbGx5LicgfTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBtZW50aW9ucyA9ICh0ZXh0LnRvTG93ZXJDYXNlKCkubWF0Y2gobmV3IFJlZ0V4cChjb21wYW55TmFtZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCAnXFxcXCQmJyksICdnJykpIHx8IFtdKS5sZW5ndGg7XG4gICAgY29tcGFueUNoZWNrID0ge1xuICAgICAgcGFzczogbWVudGlvbnMgPj0gMixcbiAgICAgIHdhcm46IG1lbnRpb25zID09PSAxLFxuICAgICAgbGFiZWw6ICdDb21wYW55IHJlZmVyZW5jZScsXG4gICAgICBkZXRhaWw6IG1lbnRpb25zID09PSAwXG4gICAgICAgID8gYFwiJHtlc2NhcGVIdG1sKGNvbXBhbnlOYW1lKX1cIiBub3QgbWVudGlvbmVkIFx1MjAxNCBhZGQgc3BlY2lmaWMgcmVmZXJlbmNlcy5gXG4gICAgICAgIDogbWVudGlvbnMgPT09IDFcbiAgICAgICAgICA/IGBcIiR7ZXNjYXBlSHRtbChjb21wYW55TmFtZSl9XCIgbWVudGlvbmVkIG9uY2UgXHUyMDE0IGEgc2Vjb25kIHNwZWNpZmljIHJlZmVyZW5jZSBzdHJlbmd0aGVucyB0aGUgbGV0dGVyLmBcbiAgICAgICAgICA6IGBcIiR7ZXNjYXBlSHRtbChjb21wYW55TmFtZSl9XCIgbWVudGlvbmVkICR7bWVudGlvbnN9IHRpbWVzIFx1MjAxNCBnb29kIHNwZWNpZmljaXR5LmAsXG4gICAgfTtcbiAgfVxuXG4gIC8vIFx1MjUwMFx1MjUwMCBSdWxlIDM6IFdvcmQgY291bnQgKHJvbGUtZGlmZmVyZW50aWF0ZWQgdGFyZ2V0KSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgY29uc3QgX3JvbGVBbmFseXNpcyA9IHdpbmRvdy5fbGFzdEFuYWx5c2lzRGF0YSB8fFxuICAgICh3aW5kb3cucGVuZGluZ1JlY29tbWVuZGF0aW9ucyAmJiB3aW5kb3cucGVuZGluZ1JlY29tbWVuZGF0aW9ucy5qb2JfYW5hbHlzaXMpIHx8IHt9O1xuICBjb25zdCBfcm9sZUxldmVsICA9IChfcm9sZUFuYWx5c2lzLnJvbGVfbGV2ZWwgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IF9yb2xlRG9tYWluID0gKF9yb2xlQW5hbHlzaXMuZG9tYWluIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBpc0V4ZWMgICAgICA9IC9leGVjfHZwfGMtc3VpdGV8Y2hpZWZ8ZGlyZWN0b3J8cHJlc2lkZW50fHBhcnRuZXIvLnRlc3QoX3JvbGVMZXZlbCk7XG4gIGNvbnN0IGlzQWNhZGVtaWMgID0gL2FjYWRlbWljfHJlc2VhcmNofGZhY3VsdHl8cHJvZmVzc29yfHBvc3Rkb2MvLnRlc3QoX3JvbGVEb21haW4gKyAnICcgKyBfcm9sZUxldmVsKTtcbiAgY29uc3Qgd2NUYXJnZXQgICAgPSBpc0FjYWRlbWljID8geyBsbzogNTAwLCBoaTogNjAwLCB3YXJuTG86IDQwMCwgd2FybkhpOiA2NTAgfVxuICAgICAgICAgICAgICAgICAgICA6IGlzRXhlYyAgICAgPyB7IGxvOiA0MDAsIGhpOiA1MDAsIHdhcm5MbzogMzAwLCB3YXJuSGk6IDU1MCB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHsgbG86IDI1MCwgaGk6IDMwMCwgd2FybkxvOiAyMDAsIHdhcm5IaTogNDAwIH07XG4gIGNvbnN0IHdjTGFiZWwgICAgID0gaXNBY2FkZW1pYyA/IGAke3djVGFyZ2V0LmxvfVx1MjAxMyR7d2NUYXJnZXQuaGl9IChhY2FkZW1pYy9yZXNlYXJjaClgXG4gICAgICAgICAgICAgICAgICAgIDogaXNFeGVjICAgICA/IGAke3djVGFyZ2V0LmxvfVx1MjAxMyR7d2NUYXJnZXQuaGl9IChleGVjdXRpdmUpYFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBgXHUyMjY0JHt3Y1RhcmdldC5oaX0gKHN0YW5kYXJkKWA7XG5cbiAgY29uc3Qgd29yZHMgICAgPSB0ZXh0LnRyaW0oKS5zcGxpdCgvXFxzKy8pLmZpbHRlcihCb29sZWFuKS5sZW5ndGg7XG4gIGNvbnN0IHdjUGN0ICAgID0gTWF0aC5taW4oMTAwLCAod29yZHMgLyB3Y1RhcmdldC5oaSkgKiAxMDApO1xuICBjb25zdCB3Y0NvbG91ciA9IHdvcmRzIDwgd2NUYXJnZXQud2FybkxvID8gJyNlZjQ0NDQnXG4gICAgICAgICAgICAgICAgIDogd29yZHMgPCB3Y1RhcmdldC5sbyAgICAgID8gJyNmNTllMGInXG4gICAgICAgICAgICAgICAgIDogd29yZHMgPD0gd2NUYXJnZXQuaGkgICAgID8gJyMyMmM1NWUnXG4gICAgICAgICAgICAgICAgIDogd29yZHMgPD0gd2NUYXJnZXQud2FybkhpID8gJyNmNTllMGInXG4gICAgICAgICAgICAgICAgIDogJyNlZjQ0NDQnO1xuICBjb25zdCB3Y1N0YXR1cyA9IHdvcmRzID49IHdjVGFyZ2V0LmxvICYmIHdvcmRzIDw9IHdjVGFyZ2V0LmhpID8gJ3Bhc3MnXG4gICAgICAgICAgICAgICAgIDogd29yZHMgPj0gd2NUYXJnZXQud2FybkxvICYmIHdvcmRzIDw9IHdjVGFyZ2V0Lndhcm5IaSA/ICd3YXJuJ1xuICAgICAgICAgICAgICAgICA6ICdmYWlsJztcbiAgY29uc3Qgd2NCYXIgICAgPSBgPHNwYW4gY2xhc3M9XCJjbC13Yy1iYXJcIj48c3BhbiBjbGFzcz1cImNsLXdjLWZpbGxcIiBzdHlsZT1cIndpZHRoOiR7d2NQY3R9JTtiYWNrZ3JvdW5kOiR7d2NDb2xvdXJ9O1wiPjwvc3Bhbj48L3NwYW4+YDtcbiAgY29uc3Qgd29yZENvdW50Q2hlY2sgPSB7XG4gICAgW3djU3RhdHVzXTogdHJ1ZSxcbiAgICBsYWJlbDogYFdvcmQgY291bnQgKCR7d2NMYWJlbH0pYCxcbiAgICBkZXRhaWw6IGAke3dvcmRzfSB3b3JkcyAke3djQmFyfSBcdTIwMTQgJHtcbiAgICAgIHdvcmRzIDwgd2NUYXJnZXQubG8gPyBgdG9vIHNob3J0OyBhaW0gZm9yICR7d2NUYXJnZXQubG99XHUyMDEzJHt3Y1RhcmdldC5oaX0uYFxuICAgICAgOiB3b3JkcyA+IHdjVGFyZ2V0LmhpID8gYHRvbyBsb25nOyB0cmltIHRvICR7d2NUYXJnZXQuaGl9IHdvcmRzLmBcbiAgICAgIDogJ3dpdGhpbiB0YXJnZXQgcmFuZ2UuJ1xuICAgIH1gLFxuICB9O1xuXG4gIC8vIFx1MjUwMFx1MjUwMCBSdWxlIDQ6IENhbGwtdG8tYWN0aW9uIGNsb3NpbmcgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIGNvbnN0IGxhc3RQYXJhID0gdGV4dC5zcGxpdCgvXFxuezIsfS8pLmZpbHRlcihwID0+IHAudHJpbSgpKS5zbGljZSgtMSlbMF0gfHwgJyc7XG4gIC8vIEFzc2VydGl2ZSBDVEFzOiBjYW5kaWRhdGUgdGFrZXMgaW5pdGlhdGl2ZSAocGFzcylcbiAgY29uc3QgYXNzZXJ0aXZlQ3RhUGF0dGVybnMgPSBbXG4gICAgL2ludGVydmlldy9pLCAvZGlzY3Vzcy9pLCAvb3Bwb3J0dW5pdHkgdG8gKHNwZWFrfHRhbGt8bWVldHxjb25uZWN0KS9pLFxuICAgIC9pIHdpbGwgKGNhbGx8Zm9sbG93Lj91cHxyZWFjaCBvdXR8Y29udGFjdHxzZW5kKS9pLFxuICAgIC9pIChwbGFufGludGVuZCkgdG8vaSwgL3dlbGNvbWUgdGhlIGNoYW5jZS9pLFxuICAgIC9hdmFpbGFibGUgKGZvcnx0bykvaSwgL2NvbnRhY3QgbWUvaSxcbiAgXTtcbiAgLy8gUGFzc2l2ZSBDVEFzOiB3YWl0aW5nIGZvciBhIHJlc3BvbnNlIChmYWlsIFx1MjAxNCBzdG9yeSBVUy1QNSByZXF1aXJlcyByZWplY3Rpb24pXG4gIGNvbnN0IHBhc3NpdmVDdGFQYXR0ZXJucyA9IFtcbiAgICAvaGVhciBmcm9tIHlvdS9pLCAvbG9vayBmb3J3YXJkIHRvICh5b3VyfGhlYXJpbmcpL2ksXG4gICAgL2F3YWl0KGluZyk/IHlvdXIvaSwgL2hvcGUgdG8gKGhlYXJ8bWVldCkvaSxcbiAgXTtcbiAgY29uc3QgaGFzQXNzZXJ0aXZlQ3RhID0gYXNzZXJ0aXZlQ3RhUGF0dGVybnMuc29tZShyZSA9PiByZS50ZXN0KGxhc3RQYXJhKSk7XG4gIGNvbnN0IGhhc1Bhc3NpdmVDdGEgICA9IHBhc3NpdmVDdGFQYXR0ZXJucy5zb21lKHJlID0+IHJlLnRlc3QobGFzdFBhcmEpKTtcbiAgY29uc3QgY3RhQ2hlY2sgPSB7XG4gICAgcGFzczogaGFzQXNzZXJ0aXZlQ3RhLFxuICAgIGZhaWw6ICFoYXNBc3NlcnRpdmVDdGEgJiYgaGFzUGFzc2l2ZUN0YSxcbiAgICBsYWJlbDogJ0NhbGwtdG8tYWN0aW9uIGNsb3NpbmcnLFxuICAgIGRldGFpbDogaGFzQXNzZXJ0aXZlQ3RhXG4gICAgICA/ICdBc3NlcnRpdmUgY2FsbC10by1hY3Rpb24gXHUyMDE0IHRha2VzIGluaXRpYXRpdmUuJ1xuICAgICAgOiBoYXNQYXNzaXZlQ3RhXG4gICAgICAgID8gJ1Bhc3NpdmUgY2xvc2luZyByZWplY3RlZCBcdTIwMTQgcGhyYXNlcyBsaWtlIFwiSSBsb29rIGZvcndhcmQgdG8gaGVhcmluZyBmcm9tIHlvdVwiIGFyZSB0b28gcGFzc2l2ZS4gUmVwbGFjZSB3aXRoIGEgZGlyZWN0IGludGVydmlldyByZXF1ZXN0OiBcIkkgd291bGQgd2VsY29tZSB0aGUgb3Bwb3J0dW5pdHkgdG8gaW50ZXJ2aWV3XCIgb3IgXCJJIHdpbGwgZm9sbG93IHVwIG5leHQgd2Vlay5cIidcbiAgICAgICAgOiAnTm8gY2FsbC10by1hY3Rpb24gZm91bmQgXHUyMDE0IGFkZCBhIGRpcmVjdCBpbnRlcnZpZXcgcmVxdWVzdCBvciBwcm9hY3RpdmUgZm9sbG93LXVwIHN0YXRlbWVudC4nLFxuICB9O1xuXG4gIC8vIFx1MjUwMFx1MjUwMCBSdWxlIDU6IE5hbWVkIG9yIHF1YW50aWZpZWQgYWNoaWV2ZW1lbnQgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIGNvbnN0IGFjaGlldmVtZW50UGF0dGVybnMgPSBbXG4gICAgL1xcZCslLywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBlcmNlbnRhZ2VzXG4gICAgL1xcJFtcXGQsXSsvLCAgICAgICAgICAgICAgICAgICAgICAvLyBkb2xsYXIgYW1vdW50c1xuICAgIC9cXGQrICh0aW1lc3x4fGZvbGR8eWVhcnxtb250aHx3ZWVrfGRheXx0ZWFtfHBlb3BsZXxzdGFmZnxjbGllbnR8Y3VzdG9tZXJ8cHJvamVjdHxwcm9kdWN0fHN5c3RlbXxhd2FyZHxwYXRlbnQpL2ksXG4gICAgL3JlZHVjZWR8aW5jcmVhc2VkfGdyZXd8Z3Jld3xkb3VibGVkfHRyaXBsZWR8c2F2ZWR8Z2VuZXJhdGVkfGRlbGl2ZXJlZHxsYXVuY2hlZHxsZWR8YnVpbHR8ZGVzaWduZWR8YXJjaGl0ZWN0ZWR8cGlvbmVlcmVkfHdvbnxhd2FyZGVkfGVhcm5lZHxhY2hpZXZlZC9pLFxuICBdO1xuICBjb25zdCBoYXNBY2hpZXZlbWVudCA9IGFjaGlldmVtZW50UGF0dGVybnMuc29tZShyZSA9PiByZS50ZXN0KHRleHQpKTtcbiAgY29uc3QgYWNoaWV2ZW1lbnRDaGVjayA9IHtcbiAgICBwYXNzOiBoYXNBY2hpZXZlbWVudCxcbiAgICB3YXJuOiAhaGFzQWNoaWV2ZW1lbnQsXG4gICAgbGFiZWw6ICdTcGVjaWZpYyBhY2hpZXZlbWVudCcsXG4gICAgZGV0YWlsOiBoYXNBY2hpZXZlbWVudFxuICAgICAgPyAnQ29udGFpbnMgYSBxdWFudGlmaWVkIG9yIG5hbWVkIGFjaGlldmVtZW50IFx1MjAxNCBnb29kLidcbiAgICAgIDogJ05vIHF1YW50aWZpZWQgYWNoaWV2ZW1lbnQgZGV0ZWN0ZWQgXHUyMDE0IGFkZCBhdCBsZWFzdCBvbmUgc3BlY2lmaWMgcmVzdWx0IChlLmcuLCBcImluY3JlYXNlZCByZXZlbnVlIGJ5IDMwJVwiLCBcImxlZCBhIHRlYW0gb2YgOFwiKS4nLFxuICB9O1xuXG4gIC8vIFx1MjUwMFx1MjUwMCBSdWxlIDc6IEdlbmVyaWMgZmlsbGVyIHBocmFzZXMgKEdBUC0xNykgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIGNvbnN0IF9DTF9GSUxMRVIgPSBbXG4gICAgJ2kgYW0gd3JpdGluZyB0byBhcHBseScsICdpIGFtIGV4Y2l0ZWQgdG8gYXBwbHknLCAnaSBhbSBwbGVhc2VkIHRvIGFwcGx5JyxcbiAgICAncGxlYXNlIGZpbmQgbXknLCAnYXR0YWNoZWQgcGxlYXNlIGZpbmQnLCAnZW5jbG9zZWQgcGxlYXNlIGZpbmQnLFxuICAgICd0aGlzIGxldHRlciBpcyB0byBleHByZXNzJywgJ2kgZmVlbCBpIHdvdWxkIGJlIGEgZ3JlYXQgZml0JyxcbiAgICAnaSBiZWxpZXZlIGkgd291bGQgYmUgYSBwZXJmZWN0IGZpdCcsICdpIGFtIGNvbmZpZGVudCB0aGF0IGknLFxuICAgICdyZXN1bHRzLWRyaXZlbicsICdkZXRhaWwtb3JpZW50ZWQnLCAnc2Vhc29uZWQgcHJvZmVzc2lvbmFsJyxcbiAgICAncGFzc2lvbmF0ZSBhYm91dCcsICdkeW5hbWljIHByb2Zlc3Npb25hbCcsICdoaWdobHkgbW90aXZhdGVkJyxcbiAgICAndGVhbSBwbGF5ZXInLCAnc2VsZi1zdGFydGVyJywgJ2hhcmQgd29ya2luZycsXG4gIF07XG4gIGNvbnN0IF90ZXh0TGMgICAgPSB0ZXh0LnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IGZvdW5kRmlsbCAgPSBfQ0xfRklMTEVSLmZpbHRlcihwID0+IF90ZXh0TGMuaW5jbHVkZXMocCkpO1xuICBjb25zdCBmaWxsZXJDaGVjayA9IHtcbiAgICBwYXNzOiBmb3VuZEZpbGwubGVuZ3RoID09PSAwLFxuICAgIHdhcm46IGZvdW5kRmlsbC5sZW5ndGggPiAwICYmIGZvdW5kRmlsbC5sZW5ndGggPD0gMixcbiAgICBmYWlsOiBmb3VuZEZpbGwubGVuZ3RoID4gMixcbiAgICBsYWJlbDogJ0ZpbGxlciBwaHJhc2VzJyxcbiAgICBkZXRhaWw6IGZvdW5kRmlsbC5sZW5ndGggPT09IDBcbiAgICAgID8gJ05vIGdlbmVyaWMgZmlsbGVyIHBocmFzZXMgZGV0ZWN0ZWQgXHUyMDE0IGdvb2QuJ1xuICAgICAgOiBgR2VuZXJpYyBwaHJhc2Uke2ZvdW5kRmlsbC5sZW5ndGggPiAxID8gJ3MnIDogJyd9IGRldGVjdGVkOiAke2ZvdW5kRmlsbC5zbGljZSgwLCAzKS5tYXAocCA9PiBgXHUyMDFDJHtwfVx1MjAxRGApLmpvaW4oJywgJyl9JHtmb3VuZEZpbGwubGVuZ3RoID4gMyA/ICdcdTIwMjYnIDogJyd9IFx1MjAxNCByZXBsYWNlIHdpdGggc3BlY2lmaWMgdmFsdWUgY2xhaW1zLmAsXG4gIH07XG5cbiAgLy8gXHUyNTAwXHUyNTAwIFJlbmRlciBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgY29uc3QgY2hlY2tzID0gW29wZW5pbmdDaGVjaywgaUZpcnN0Q2hlY2ssIGNvbXBhbnlDaGVjaywgd29yZENvdW50Q2hlY2ssIGN0YUNoZWNrLCBhY2hpZXZlbWVudENoZWNrLCBmaWxsZXJDaGVja107XG4gIGNvbnRhaW5lci5pbm5lckhUTUwgPSBjaGVja3MubWFwKGMgPT4ge1xuICAgIGNvbnN0IHN0YXRlID0gYy5wYXNzID8gJ3Bhc3MnIDogYy53YXJuID8gJ3dhcm4nIDogJ2ZhaWwnO1xuICAgIHJldHVybiBgPGRpdiBjbGFzcz1cImNsLWNoZWNrICR7c3RhdGV9XCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImNjLWljb25cIj48L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cImNjLWxhYmVsXCI+JHtlc2NhcGVIdG1sKGMubGFiZWwpfTwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY2MtZGV0YWlsXCI+JHtjLmRldGFpbH08L3NwYW4+XG4gICAgPC9kaXY+YDtcbiAgfSkuam9pbignJyk7XG5cbiAgcGFuZWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBHZXQgY29tcGFueSBuYW1lIGZvciBjb3ZlciBsZXR0ZXIgdmFsaWRhdGlvbiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gX2dldENvbXBhbnlOYW1lRm9yQ0woKSB7XG4gIC8vIFRyeSBhbmFseXNpcyBkYXRhIGZpcnN0LCB0aGVuIGZhbGwgYmFjayB0byBqb2IgZGVzY3JpcHRpb24gZmlyc3QgbGluZVxuICBjb25zdCBhbmFseXNpcyA9IHdpbmRvdy5fbGFzdEFuYWx5c2lzRGF0YSB8fCAod2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnMgJiYgd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnMuam9iX2FuYWx5c2lzKTtcbiAgaWYgKGFuYWx5c2lzICYmIGFuYWx5c2lzLmNvbXBhbnlfbmFtZSkgcmV0dXJuIGFuYWx5c2lzLmNvbXBhbnlfbmFtZTtcbiAgaWYgKGFuYWx5c2lzICYmIGFuYWx5c2lzLmNvbXBhbnkpICAgICAgcmV0dXJuIGFuYWx5c2lzLmNvbXBhbnk7XG4gIC8vIEZhbGwgYmFjazogZmlyc3Qgbm9uLWVtcHR5IGxpbmUgb2Ygam9iIGRlc2NyaXB0aW9uIGluIHRhYkRhdGFcbiAgY29uc3QgamQgPSBzdGF0ZU1hbmFnZXIuZ2V0VGFiRGF0YSgnam9iJykgfHwgJyc7XG4gIGNvbnN0IGZpcnN0TGluZSA9IGpkLnNwbGl0KCdcXG4nKS5maW5kKGwgPT4gbC50cmltKCkpO1xuICByZXR1cm4gZmlyc3RMaW5lID8gZmlyc3RMaW5lLnRyaW0oKS5zbGljZSgwLCA2MCkgOiAnJztcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEV4cG9ydHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmV4cG9ydCB7XG4gIENPVkVSX0xFVFRFUl9UT05FUyxcbiAgX2NvdmVyTGV0dGVyRm9ybVN0YXRlLFxuICBwb3B1bGF0ZUNvdmVyTGV0dGVyVGFiLFxuICBnZW5lcmF0ZUNvdmVyTGV0dGVyLFxuICBzYXZlQ292ZXJMZXR0ZXIsXG4gIF9yZW5kZXJDb25zaXN0ZW5jeVJlcG9ydCxcbiAgX2RlYm91bmNlZFZhbGlkYXRlQ0wsXG4gIF92YWxpZGF0ZUNvdmVyTGV0dGVyLFxuICBfZ2V0Q29tcGFueU5hbWVGb3JDTCxcbn07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9zY3JlZW5pbmctcXVlc3Rpb25zLmpzXG4gKiBTY3JlZW5pbmcgcXVlc3Rpb25zIHRhYjogcGFyc2UsIHNlYXJjaCwgZ2VuZXJhdGUsIHNhdmUgcmVzcG9uc2VzLlxuICpcbiAqIERlcGVuZGVuY2llcyAocmVzb2x2ZWQgdGhyb3VnaCBnbG9iYWxUaGlzIGF0IHJ1bnRpbWUpOlxuICogICBlc2NhcGVIdG1sLCBzaG93QWxlcnRNb2RhbFxuICovXG5cbi8vIFx1MjUwMFx1MjUwMCBNb2R1bGUtbGV2ZWwgc3RhdGUgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8qKiBQZXItcXVlc3Rpb24gZHJhZnQgc3RhdGU6IHsgZm9ybWF0LCBleHBlcmllbmNlSW5kaWNlcywgcmVzcG9uc2VUZXh0LCB0b3BpY1RhZywgcHJpb3JSZXNwb25zZSB9ICovXG5jb25zdCBfc2NyZWVuaW5nU3RhdGUgPSB7fTtcblxuLyoqIFJhdyB0ZXh0IGZyb20gdGhlIHNjLWlucHV0IHRleHRhcmVhIFx1MjAxNCBzdXJ2aXZlcyB0YWIgbmF2aWdhdGlvbi4gKi9cbmxldCBfc2NyZWVuaW5nSW5wdXRUZXh0ID0gJyc7XG5cbi8qKiBSZXNldCBmdW5jdGlvbiBmb3IgdGVzdGluZyBcdTIwMTQgY2xlYXJzIHNhdmVkIHRleHRhcmVhIHN0YXRlLiAqL1xuZnVuY3Rpb24gX3Jlc2V0U2NyZWVuaW5nSW5wdXRUZXh0KCkgeyBfc2NyZWVuaW5nSW5wdXRUZXh0ID0gJyc7IH1cblxuLy8gXHUyNTAwXHUyNTAwIFBvcHVsYXRlIHNjcmVlbmluZyB0YWIgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIHBvcHVsYXRlU2NyZWVuaW5nVGFiKCkge1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgY29udGVudC5pbm5lckhUTUwgPSBgXG4gICAgPGRpdiBzdHlsZT1cIm1heC13aWR0aDo5MDBweDttYXJnaW46MCBhdXRvO3BhZGRpbmc6MjBweCAxMHB4O1wiPlxuICAgICAgPGgyIHN0eWxlPVwiZm9udC1zaXplOjEuM2VtO2ZvbnQtd2VpZ2h0OjcwMDttYXJnaW4tYm90dG9tOjhweDtcIj5cdUQ4M0RcdURDQ0IgU2NyZWVuaW5nIFF1ZXN0aW9uczwvaDI+XG4gICAgICA8cCBjbGFzcz1cInNjLWludHJvXCI+UGFzdGUgb25lIG9yIG1vcmUgc2NyZWVuaW5nIHF1ZXN0aW9ucyBiZWxvdyBcdTIwMTQgb25lIHBlciBsaW5lLCBvciBzZXBhcmF0ZWQgYnkgYmxhbmsgbGluZXMuIENsaWNrIDxzdHJvbmc+UGFyc2UgUXVlc3Rpb25zPC9zdHJvbmc+IHRvIGdlbmVyYXRlIHRhaWxvcmVkIGRyYWZ0IHJlc3BvbnNlcy48L3A+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDoxMHB4O2FsaWduLWl0ZW1zOmZsZXgtc3RhcnQ7bWFyZ2luLWJvdHRvbToyMHB4O1wiPlxuICAgICAgICA8dGV4dGFyZWEgaWQ9XCJzYy1pbnB1dFwiIHJvd3M9XCI2XCIgc3R5bGU9XCJmbGV4OjE7cGFkZGluZzoxMnB4O2JvcmRlcjoxcHggc29saWQgI2UyZThmMDtib3JkZXItcmFkaXVzOjhweDtmb250LXNpemU6MC45M2VtO3Jlc2l6ZTp2ZXJ0aWNhbDtcIiBwbGFjZWhvbGRlcj1cIlBhc3RlIHNjcmVlbmluZyBxdWVzdGlvbnMgaGVyZVx1MjAyNiYjMTA7JiMxMDtFLmcuJiMxMDtEZXNjcmliZSBhIHRpbWUgeW91IGxlZCBhIGNyb3NzLWZ1bmN0aW9uYWwgcHJvamVjdC4mIzEwOyYjMTA7SG93IGRvIHlvdSBoYW5kbGUgdGlnaHQgZGVhZGxpbmVzP1wiPjwvdGV4dGFyZWE+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4tcHJpbWFyeVwiIG9uY2xpY2s9XCJwYXJzZVNjcmVlbmluZ1F1ZXN0aW9ucygpXCI+UGFyc2UgUXVlc3Rpb25zPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgaWQ9XCJzYy1xdWVzdGlvbnMtY29udGFpbmVyXCI+PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwic2Mtc2F2ZS1iYXJcIiBpZD1cInNjLXNhdmUtYmFyXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJjb250aW51ZS1idG5cIiBpZD1cInNjLXNhdmUtYnRuXCIgb25jbGljaz1cInNhdmVTY3JlZW5pbmdSZXNwb25zZXMoKVwiPlx1RDgzRFx1RENCRSBTYXZlIEFsbCBSZXNwb25zZXM8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cIm5hdi1idXR0b25zIG5hdi1lbmRcIiBzdHlsZT1cIm1hcmdpbi10b3A6MjRweDtcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbnRpbnVlLWJ0blwiIG9uY2xpY2s9XCJoYW5kbGVTdGVwQ2xpY2soJ2ludGVydmlld19wcmVwJylcIj5cdUQ4M0NcdURGQTQgUHJvY2VlZCB0byBJbnRlcnZpZXcgUHJlcCBcdTIxOTI8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PmA7XG5cbiAgLy8gUmVzdG9yZSB0aGUgcmF3IGlucHV0IHRleHQgYW5kIHdpcmUgdXAgc2F2ZS1vbi1pbnB1dCBsaXN0ZW5lci5cbiAgY29uc3Qgc2NJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzYy1pbnB1dCcpO1xuICBpZiAoc2NJbnB1dCkge1xuICAgIGlmIChfc2NyZWVuaW5nSW5wdXRUZXh0KSBzY0lucHV0LnZhbHVlID0gX3NjcmVlbmluZ0lucHV0VGV4dDtcbiAgICBzY0lucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4geyBfc2NyZWVuaW5nSW5wdXRUZXh0ID0gc2NJbnB1dC52YWx1ZTsgfSk7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIFBhcnNlIHF1ZXN0aW9ucyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gcGFyc2VTY3JlZW5pbmdRdWVzdGlvbnMoKSB7XG4gIGNvbnN0IHJhdyA9IChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2MtaW5wdXQnKT8udmFsdWUgfHwgJycpLnRyaW0oKTtcbiAgaWYgKCFyYXcpIHsgc2hvd0FsZXJ0TW9kYWwoJ1x1MjZBMFx1RkUwRiBObyBJbnB1dCcsICdQbGVhc2UgcGFzdGUgYXQgbGVhc3Qgb25lIHNjcmVlbmluZyBxdWVzdGlvbiBmaXJzdC4nKTsgcmV0dXJuOyB9XG5cbiAgLy8gU3BsaXQgb24gYmxhbmsgbGluZXMgKHByZWZlcnJlZCkgb3IgbnVtYmVyZWQgbGlzdCBwYXR0ZXJuczsgZmlsdGVyIGVtcHR5IHJlc3VsdHNcbiAgbGV0IHF1ZXN0aW9ucyA9IHJhdy5zcGxpdCgvXFxuXFxzKlxcbisvKS5tYXAocSA9PiBxLnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pO1xuICBpZiAocXVlc3Rpb25zLmxlbmd0aCA9PT0gMSkge1xuICAgIC8vIFRyeSBudW1iZXJlZCBwYXR0ZXJucyBsaWtlIFwiMS4gXCIgb3IgXCIxKSBcIiBvciBcIlExOlwiIHdpdGhvdXQgcmVxdWlyaW5nIHNwYWNlIGFmdGVyXG4gICAgY29uc3QgbnVtYmVyZWQgPSByYXcuc3BsaXQoL1xcbig/PVxcZCtbLlxcKV1cXHMqKD89W0EtWl0pfFFcXGQrWzpcXC5dP1xccyooPz1bQS1aXSkpLylcbiAgICAgIC5tYXAocSA9PiBxLnRyaW0oKSlcbiAgICAgIC5maWx0ZXIoQm9vbGVhbik7XG4gICAgaWYgKG51bWJlcmVkLmxlbmd0aCA+IDEpIHF1ZXN0aW9ucyA9IG51bWJlcmVkO1xuICB9XG4gIGlmIChxdWVzdGlvbnMubGVuZ3RoID09PSAxKSB7XG4gICAgLy8gTGFzdCByZXNvcnQ6IHNwbGl0IG9uIGFueSBzaW5nbGUgbmV3bGluZSBpZiB3ZSBzdGlsbCBoYXZlIGp1c3Qgb25lIFwicXVlc3Rpb25cIlxuICAgIGNvbnN0IHNpbmdsZUxpbmUgPSByYXcuc3BsaXQoL1xcbisvKS5tYXAocSA9PiBxLnRyaW0oKSkuZmlsdGVyKHEgPT4gcS5sZW5ndGggPiAwKTtcbiAgICBpZiAoc2luZ2xlTGluZS5sZW5ndGggPiAxKSBxdWVzdGlvbnMgPSBzaW5nbGVMaW5lO1xuICB9XG5cbiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NjLXF1ZXN0aW9ucy1jb250YWluZXInKTtcbiAgY29udGFpbmVyLmlubmVySFRNTCA9IHF1ZXN0aW9ucy5tYXAoKHEsIGkpID0+IHJlbmRlclF1ZXN0aW9uQmxvY2socSwgaSkpLmpvaW4oJycpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2Mtc2F2ZS1iYXInKS5zdHlsZS5kaXNwbGF5ID0gcXVlc3Rpb25zLmxlbmd0aCA/ICcnIDogJ25vbmUnO1xuXG4gIC8vIEtpY2sgb2ZmIHNlYXJjaGVzIGluIHBhcmFsbGVsXG4gIHF1ZXN0aW9ucy5mb3JFYWNoKChxLCBpKSA9PiBzZWFyY2hGb3JRdWVzdGlvbihxLCBpKSk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBSZW5kZXIgcXVlc3Rpb24gYmxvY2sgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIHJlbmRlclF1ZXN0aW9uQmxvY2socXVlc3Rpb24sIGlkeCkge1xuICByZXR1cm4gYFxuICAgIDxkaXYgY2xhc3M9XCJzYy1xdWVzdGlvbi1ibG9ja1wiIGlkPVwic2MtYmxvY2stJHtpZHh9XCIgZGF0YS1xdWVzdGlvbj1cIiR7ZXNjYXBlSHRtbChxdWVzdGlvbil9XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwic2MtcXVlc3Rpb24taGVhZGVyXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwic2MtcXVlc3Rpb24tbnVtXCI+JHtpZHggKyAxfTwvc3Bhbj5cbiAgICAgICAgPHNwYW4+JHtlc2NhcGVIdG1sKHF1ZXN0aW9uKX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzYy1xdWVzdGlvbi1ib2R5XCI+XG4gICAgICAgIDxkaXYgaWQ9XCJzYy1wcmlvci0ke2lkeH1cIj48ZW0gc3R5bGU9XCJjb2xvcjojOTRhM2I4O2ZvbnQtc2l6ZTowLjg3ZW07XCI+U2VhcmNoaW5nIHJlc3BvbnNlIGxpYnJhcnlcdTIwMjY8L2VtPjwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwic2MtZXhwLSR7aWR4fVwiPjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2MtZm9ybWF0LXJvd1wiIGlkPVwic2MtZm10LSR7aWR4fVwiPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtmb250LXdlaWdodDo2MDA7Y29sb3I6IzM3NDE1MTthbGlnbi1zZWxmOmNlbnRlcjtcIj5Gb3JtYXQ6PC9zcGFuPlxuICAgICAgICAgICR7WydkaXJlY3QnLCdzdGFyJywndGVjaG5pY2FsJ10ubWFwKGYgPT4gYFxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNjLWZvcm1hdC1idG4ke2YgPT09ICdkaXJlY3QnID8gJyBhY3RpdmUnIDogJyd9XCIgZGF0YS1mbXQ9XCIke2Z9XCIgb25jbGljaz1cInNlbGVjdEZvcm1hdCgke2lkeH0sJyR7Zn0nLHRoaXMpXCI+JHtfZm10TGFiZWwoZil9PC9idXR0b24+YCkuam9pbignJyl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLXByaW1hcnlcIiBpZD1cInNjLWdlbi1idG4tJHtpZHh9XCIgb25jbGljaz1cImdlbmVyYXRlU2NyZWVuaW5nUmVzcG9uc2UoJHtpZHh9KVwiPlx1MjcyOCBHZW5lcmF0ZSBEcmFmdDwvYnV0dG9uPlxuICAgICAgICA8ZGl2IGlkPVwic2MtcmVzdWx0LSR7aWR4fVwiIHN0eWxlPVwibWFyZ2luLXRvcDoxMnB4O1wiPjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2MtdG9waWMtcm93XCIgaWQ9XCJzYy10b3BpYy1yb3ctJHtpZHh9XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cInNjLXRvcGljLSR7aWR4fVwiPlRvcGljIHRhZzo8L2xhYmVsPlxuICAgICAgICAgIDxpbnB1dCBjbGFzcz1cInNjLXRvcGljLWlucHV0XCIgaWQ9XCJzYy10b3BpYy0ke2lkeH1cIiB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiZS5nLiBsZWFkZXJzaGlwLCBjcm9zcy1mdW5jdGlvbmFsLCBkZWFkbGluZS1tYW5hZ2VtZW50XCI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+YDtcbn1cblxuZnVuY3Rpb24gX2ZtdExhYmVsKGZtdCkge1xuICByZXR1cm4geyBkaXJlY3Q6ICdEaXJlY3QvQ29uY2lzZSAoMTUwXHUyMDEzMjAwdyknLCBzdGFyOiAnU1RBUiAoMjUwXHUyMDEzMzUwdyknLCB0ZWNobmljYWw6ICdUZWNobmljYWwgRGV0YWlsICg0MDBcdTIwMTM1MDB3KScgfVtmbXRdIHx8IGZtdDtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEZvcm1hdCBzZWxlY3Rpb24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIHNlbGVjdEZvcm1hdChpZHgsIGZtdCwgYnRuKSB7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYCNzYy1mbXQtJHtpZHh9IC5zYy1mb3JtYXQtYnRuYCkuZm9yRWFjaChiID0+IGIuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJykpO1xuICBidG4uY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gIGlmICghX3NjcmVlbmluZ1N0YXRlW2lkeF0pIF9zY3JlZW5pbmdTdGF0ZVtpZHhdID0ge307XG4gIF9zY3JlZW5pbmdTdGF0ZVtpZHhdLmZvcm1hdCA9IGZtdDtcbn1cblxuZnVuY3Rpb24gX2dldFNlbGVjdGVkRm9ybWF0KGlkeCkge1xuICBjb25zdCBhY3RpdmUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjc2MtZm10LSR7aWR4fSAuc2MtZm9ybWF0LWJ0bi5hY3RpdmVgKTtcbiAgcmV0dXJuIGFjdGl2ZSA/IGFjdGl2ZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtZm10JykgOiAnZGlyZWN0Jztcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFNlYXJjaCBmb3IgcHJpb3IgcmVzcG9uc2VzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBzZWFyY2hGb3JRdWVzdGlvbihxdWVzdGlvbiwgaWR4KSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL3NjcmVlbmluZy9zZWFyY2gnLCB7XG4gICAgICBtZXRob2Q6ICAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6ICAgIEpTT04uc3RyaW5naWZ5KHsgcXVlc3Rpb24gfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKCFkYXRhLm9rKSB7IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzYy1wcmlvci0ke2lkeH1gKS5pbm5lckhUTUwgPSAnJzsgcmV0dXJuOyB9XG5cbiAgICAvLyBSZW5kZXIgcHJpb3IgbWF0Y2hcbiAgICBjb25zdCBwcmlvckVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNjLXByaW9yLSR7aWR4fWApO1xuICAgIGlmIChkYXRhLnByaW9yKSB7XG4gICAgICBjb25zdCBwID0gZGF0YS5wcmlvcjtcbiAgICAgIHByaW9yRWwuaW5uZXJIVE1MID0gYFxuICAgICAgICA8ZGl2IGNsYXNzPVwic2MtcHJpb3ItbWF0Y2hcIj5cbiAgICAgICAgICA8c3Ryb25nPlx1RDgzRFx1RENEQSBTaW1pbGFyIHByaW9yIHJlc3BvbnNlIGZvdW5kPC9zdHJvbmc+IFx1MjAxNCAke2VzY2FwZUh0bWwocC5jb21wYW55IHx8ICcnKX0gKCR7ZXNjYXBlSHRtbChwLmRhdGUgfHwgJycpfSk8YnI+XG4gICAgICAgICAgPGVtIHN0eWxlPVwiY29sb3I6Izc4MzUwZjtcIj5cIiR7ZXNjYXBlSHRtbCgocC5xdWVzdGlvbiB8fCAnJykuc3Vic3RyaW5nKDAsIDEyMCkpfVx1MjAyNlwiPC9lbT5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDo2cHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO1wiPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJzYy11c2UtcHJpb3ItJHtpZHh9XCIgb25jaGFuZ2U9XCJ0b2dnbGVQcmlvclVzZSgke2lkeH0pXCI+IFVzZSBhcyBzdGFydGluZyBwb2ludFxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+YDtcbiAgICAgIGlmICghX3NjcmVlbmluZ1N0YXRlW2lkeF0pIF9zY3JlZW5pbmdTdGF0ZVtpZHhdID0ge307XG4gICAgICBfc2NyZWVuaW5nU3RhdGVbaWR4XS5wcmlvclJlc3BvbnNlID0gcC5yZXNwb25zZV90ZXh0IHx8ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcmlvckVsLmlubmVySFRNTCA9ICcnO1xuICAgIH1cblxuICAgIC8vIFJlbmRlciBleHBlcmllbmNlIGNhcmRzXG4gICAgY29uc3QgZXhwRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc2MtZXhwLSR7aWR4fWApO1xuICAgIGlmIChkYXRhLmV4cGVyaWVuY2VzICYmIGRhdGEuZXhwZXJpZW5jZXMubGVuZ3RoKSB7XG4gICAgICBjb25zdCBjYXJkcyA9IGRhdGEuZXhwZXJpZW5jZXMubWFwKGUgPT4gYFxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJzYy1leHAtY2FyZFwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWlkeD1cIiR7ZS5pZHh9XCIgY2hlY2tlZCBvbmNoYW5nZT1cInVwZGF0ZUV4cFNlbGVjdGlvbigke2lkeH0pXCI+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImZsZXg6MTtcIj5cbiAgICAgICAgICAgIDxzdHJvbmc+JHtlc2NhcGVIdG1sKGUudGl0bGUpfTwvc3Ryb25nPiBcdTAwQjcgJHtlc2NhcGVIdG1sKGUuY29tcGFueSl9XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNjLXNjb3JlLWJhZGdlXCI+JHtNYXRoLnJvdW5kKGUuc2NvcmUgKiAxMDApfSUgbWF0Y2g8L3NwYW4+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiY29sb3I6IzY0NzQ4YjttYXJnaW4tdG9wOjJweDtcIj4ke2VzY2FwZUh0bWwoZS5zdW1tYXJ5KX08L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9sYWJlbD5gKS5qb2luKCcnKTtcbiAgICAgIGV4cEVsLmlubmVySFRNTCA9IGA8cCBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOiMzNzQxNTE7bWFyZ2luLWJvdHRvbTo2cHg7XCI+UmVsZXZhbnQgZXhwZXJpZW5jZTo8L3A+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzYy1leHAtbGlzdFwiPiR7Y2FyZHN9PC9kaXY+YDtcbiAgICAgIGlmICghX3NjcmVlbmluZ1N0YXRlW2lkeF0pIF9zY3JlZW5pbmdTdGF0ZVtpZHhdID0ge307XG4gICAgICBfc2NyZWVuaW5nU3RhdGVbaWR4XS5leHBlcmllbmNlSW5kaWNlcyA9IGRhdGEuZXhwZXJpZW5jZXMubWFwKGUgPT4gZS5pZHgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBleHBFbC5pbm5lckhUTUwgPSAnJztcbiAgICB9XG4gIH0gY2F0Y2ggKF8pIHtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc2MtcHJpb3ItJHtpZHh9YCkuaW5uZXJIVE1MID0gJyc7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIFRvZ2dsZSBwcmlvciB1c2UgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIHRvZ2dsZVByaW9yVXNlKGlkeCkge1xuICBjb25zdCBjYiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzYy11c2UtcHJpb3ItJHtpZHh9YCk7XG4gIGlmICghX3NjcmVlbmluZ1N0YXRlW2lkeF0pIF9zY3JlZW5pbmdTdGF0ZVtpZHhdID0ge307XG4gIF9zY3JlZW5pbmdTdGF0ZVtpZHhdLnVzZVByaW9yID0gY2I/LmNoZWNrZWQgPz8gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUV4cFNlbGVjdGlvbihpZHgpIHtcbiAgY29uc3QgYmxvY2sgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNjLWJsb2NrLSR7aWR4fWApO1xuICBjb25zdCBjaGVja2VkICAgPSBBcnJheS5mcm9tKGJsb2NrLnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W3R5cGU9Y2hlY2tib3hdW2RhdGEtaWR4XScpKVxuICAgIC5maWx0ZXIoY2IgPT4gY2IuY2hlY2tlZClcbiAgICAubWFwKGNiID0+IHBhcnNlSW50KGNiLmdldEF0dHJpYnV0ZSgnZGF0YS1pZHgnKSwgMTApKTtcbiAgaWYgKCFfc2NyZWVuaW5nU3RhdGVbaWR4XSkgX3NjcmVlbmluZ1N0YXRlW2lkeF0gPSB7fTtcbiAgX3NjcmVlbmluZ1N0YXRlW2lkeF0uZXhwZXJpZW5jZUluZGljZXMgPSBjaGVja2VkO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgR2VuZXJhdGUgc2NyZWVuaW5nIHJlc3BvbnNlIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVNjcmVlbmluZ1Jlc3BvbnNlKGlkeCkge1xuICAvKiBkdWNrZmxvdzpcbiAgICogICBpZDogc2NyZWVuaW5nX3VpX2dlbmVyYXRlX2xpdmVcbiAgICogICBraW5kOiB1aVxuICAgKiAgIHRpbWVzdGFtcDogJzIwMjYtMDMtMjVUMjE6Mzk6NDhaJ1xuICAgKiAgIHN0YXR1czogbGl2ZVxuICAgKiAgIGhhbmRsZXM6XG4gICAqICAgLSB1aTpzY3JlZW5pbmcuZ2VuZXJhdGUtcmVzcG9uc2VcbiAgICogICBjYWxsczpcbiAgICogICAtIFBPU1QgL2FwaS9zY3JlZW5pbmcvZ2VuZXJhdGVcbiAgICogICByZWFkczpcbiAgICogICAtIGRvbTpzYy1xdWVzdGlvbi1ibG9jay5xdWVzdGlvblxuICAgKiAgIC0gd2luZG93Ol9zY3JlZW5pbmdTdGF0ZS5mb3JtYXRcbiAgICogICAtIHdpbmRvdzpfc2NyZWVuaW5nU3RhdGUucHJpb3JSZXNwb25zZVxuICAgKiAgIC0gd2luZG93Ol9zY3JlZW5pbmdTdGF0ZS5leHBlcmllbmNlSW5kaWNlc1xuICAgKiAgIHdyaXRlczpcbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL3NjcmVlbmluZy9nZW5lcmF0ZS5xdWVzdGlvblxuICAgKiAgIC0gcmVxdWVzdDpQT1NUIC9hcGkvc2NyZWVuaW5nL2dlbmVyYXRlLmZvcm1hdFxuICAgKiAgIC0gcmVxdWVzdDpQT1NUIC9hcGkvc2NyZWVuaW5nL2dlbmVyYXRlLmV4cGVyaWVuY2VfaW5kaWNlc1xuICAgKiAgIC0gcmVxdWVzdDpQT1NUIC9hcGkvc2NyZWVuaW5nL2dlbmVyYXRlLnByaW9yX3Jlc3BvbnNlXG4gICAqICAgLSB3aW5kb3c6X3NjcmVlbmluZ1N0YXRlLnJlc3BvbnNlVGV4dFxuICAgKiAgIC0gd2luZG93Ol9zY3JlZW5pbmdTdGF0ZS5mb3JtYXRcbiAgICogICBub3RlczogR2VuZXJhdGVzIGEgc2luZ2xlIHNjcmVlbmluZyByZXNwb25zZSBmcm9tIHRoZSBzZWxlY3RlZCBmb3JtYXQsIHByaW9yLXJlc3BvbnNlIHNlZWQsIGFuZCBjaG9zZW4gZXhwZXJpZW5jZSBldmlkZW5jZSwgdGhlbiBzdG9yZXMgdGhlIGRyYWZ0IGJhY2sgaW50byBVSSBzdGF0ZSBmb3IgZWRpdGluZy5cbiAgICovXG4gIGNvbnN0IGJ0biAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNjLWdlbi1idG4tJHtpZHh9YCk7XG4gIGlmIChidG4pIHsgYnRuLmRpc2FibGVkID0gdHJ1ZTsgYnRuLnRleHRDb250ZW50ID0gJ1x1MjNGMyBHZW5lcmF0aW5nXHUyMDI2JzsgfVxuXG4gIGNvbnN0IHF1ZXN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNjLWJsb2NrLSR7aWR4fWApPy5kYXRhc2V0LnF1ZXN0aW9uIHx8ICcnO1xuICBjb25zdCBzdGF0ZSAgICA9IF9zY3JlZW5pbmdTdGF0ZVtpZHhdIHx8IHt9O1xuICBjb25zdCBmbXQgICAgICA9IF9nZXRTZWxlY3RlZEZvcm1hdChpZHgpO1xuICBjb25zdCBwcmlvciAgICA9IChzdGF0ZS51c2VQcmlvciAmJiBzdGF0ZS5wcmlvclJlc3BvbnNlKSA/IHN0YXRlLnByaW9yUmVzcG9uc2UgOiAnJztcbiAgY29uc3QgZXhwSWR4ICAgPSBzdGF0ZS5leHBlcmllbmNlSW5kaWNlcyA/PyBbXTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9zY3JlZW5pbmcvZ2VuZXJhdGUnLCB7XG4gICAgICBtZXRob2Q6ICAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6ICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgcXVlc3Rpb24sXG4gICAgICAgIGZvcm1hdDogICAgICAgICAgICAgIGZtdCxcbiAgICAgICAgZXhwZXJpZW5jZV9pbmRpY2VzOiAgZXhwSWR4LFxuICAgICAgICBwcmlvcl9yZXNwb25zZTogICAgICBwcmlvcixcbiAgICAgIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmICghZGF0YS5vaykgeyBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgZGF0YS5lcnJvciB8fCAnR2VuZXJhdGlvbiBmYWlsZWQuJyk7IHJldHVybjsgfVxuXG4gICAgaWYgKCFfc2NyZWVuaW5nU3RhdGVbaWR4XSkgX3NjcmVlbmluZ1N0YXRlW2lkeF0gPSB7fTtcbiAgICBfc2NyZWVuaW5nU3RhdGVbaWR4XS5yZXNwb25zZVRleHQgPSBkYXRhLnRleHQ7XG4gICAgX3NjcmVlbmluZ1N0YXRlW2lkeF0uZm9ybWF0ICAgICAgID0gZm10O1xuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNjLXJlc3VsdC0ke2lkeH1gKS5pbm5lckhUTUwgPSBgXG4gICAgICA8dGV4dGFyZWEgY2xhc3M9XCJzYy1yZXNwb25zZS10ZXh0YXJlYVwiIGlkPVwic2MtdGV4dC0ke2lkeH1cIiByb3dzPVwiN1wiXG4gICAgICAgIG9uaW5wdXQ9XCJfc2NyZWVuaW5nU3RhdGVbJHtpZHh9XSA9IF9zY3JlZW5pbmdTdGF0ZVske2lkeH1dIHx8IHt9OyBfc2NyZWVuaW5nU3RhdGVbJHtpZHh9XS5yZXNwb25zZVRleHQgPSB0aGlzLnZhbHVlO1wiXG4gICAgICA+JHtlc2NhcGVIdG1sKGRhdGEudGV4dCl9PC90ZXh0YXJlYT5gO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzYy10b3BpYy1yb3ctJHtpZHh9YCkuc3R5bGUuZGlzcGxheSA9ICcnO1xuICB9IGNhdGNoIChlKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsICdGYWlsZWQgdG8gY29udGFjdCBzZXJ2ZXIuJyk7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKGJ0bikgeyBidG4uZGlzYWJsZWQgPSBmYWxzZTsgYnRuLnRleHRDb250ZW50ID0gJ1x1MjcyOCBHZW5lcmF0ZSBEcmFmdCc7IH1cbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgU2F2ZSByZXNwb25zZXMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIHNhdmVTY3JlZW5pbmdSZXNwb25zZXMoKSB7XG4gIC8qIGR1Y2tmbG93OlxuICAgKiAgIGlkOiBzY3JlZW5pbmdfdWlfc2F2ZV9saXZlXG4gICAqICAga2luZDogdWlcbiAgICogICB0aW1lc3RhbXA6ICcyMDI2LTAzLTI1VDIxOjM5OjQ4WidcbiAgICogICBzdGF0dXM6IGxpdmVcbiAgICogICBoYW5kbGVzOlxuICAgKiAgIC0gdWk6c2NyZWVuaW5nLnNhdmUtYWxsXG4gICAqICAgY2FsbHM6XG4gICAqICAgLSBQT1NUIC9hcGkvc2NyZWVuaW5nL3NhdmVcbiAgICogICByZWFkczpcbiAgICogICAtIHdpbmRvdzpfc2NyZWVuaW5nU3RhdGVcbiAgICogICAtIGRvbTouc2MtcXVlc3Rpb24tYmxvY2tcbiAgICogICAtIGRvbTojc2MtdGV4dC0qLnZhbHVlXG4gICAqICAgLSBkb206I3NjLXRvcGljLSoudmFsdWVcbiAgICogICB3cml0ZXM6XG4gICAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9zY3JlZW5pbmcvc2F2ZS5yZXNwb25zZXNcbiAgICogICBub3RlczogQWdncmVnYXRlcyB0aGUgZWRpdGVkIHNjcmVlbmluZyByZXNwb25zZXMgYW5kIHRvcGljIHRhZ3MgZnJvbSB0aGUgVUkgaW50byB0aGUgc3RydWN0dXJlZCBwYXlsb2FkIHRoYXQgYmFja2VuZCBzdGF0ZSwgbWV0YWRhdGEsIGFyY2hpdmUgRE9DWCwgYW5kIHRoZSByZXNwb25zZSBsaWJyYXJ5IGFsbCBwZXJzaXN0LlxuICAgKi9cbiAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NjLXNhdmUtYnRuJyk7XG4gIGlmIChidG4pIHsgYnRuLmRpc2FibGVkID0gdHJ1ZTsgYnRuLnRleHRDb250ZW50ID0gJ1x1MjNGMyBTYXZpbmdcdTIwMjYnOyB9XG5cbiAgY29uc3QgcmVzcG9uc2VzID0gW107XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zYy1xdWVzdGlvbi1ibG9jaycpLmZvckVhY2goKGJsb2NrLCBpKSA9PiB7XG4gICAgY29uc3QgcUVsICAgID0gYmxvY2sucXVlcnlTZWxlY3RvcignLnNjLXF1ZXN0aW9uLWhlYWRlciBzcGFuOmxhc3QtY2hpbGQnKTtcbiAgICBjb25zdCB0ZXh0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc2MtdGV4dC0ke2l9YCk7XG4gICAgY29uc3QgdG9waWNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzYy10b3BpYy0ke2l9YCk7XG4gICAgaWYgKCF0ZXh0RWwpIHJldHVybjsgLy8gbm90IHlldCBnZW5lcmF0ZWQgXHUyMDE0IHNraXBcblxuICAgIGNvbnN0IHF1ZXN0aW9uICAgICA9IHFFbCA/IHFFbC50ZXh0Q29udGVudC50cmltKCkgOiAnJztcbiAgICBjb25zdCByZXNwb25zZVRleHQgPSAoX3NjcmVlbmluZ1N0YXRlW2ldPy5yZXNwb25zZVRleHQpIHx8IHRleHRFbC52YWx1ZSB8fCAnJztcbiAgICBjb25zdCBmbXQgICAgICAgICAgPSBfZ2V0U2VsZWN0ZWRGb3JtYXQoaSk7XG4gICAgY29uc3QgdG9waWNUYWcgICAgID0gdG9waWNFbCA/IHRvcGljRWwudmFsdWUudHJpbSgpIDogJyc7XG5cbiAgICByZXNwb25zZXMucHVzaCh7IHF1ZXN0aW9uLCB0b3BpY190YWc6IHRvcGljVGFnLCBmb3JtYXQ6IGZtdCwgcmVzcG9uc2VfdGV4dDogcmVzcG9uc2VUZXh0IH0pO1xuICB9KTtcblxuICBpZiAoIXJlc3BvbnNlcy5sZW5ndGgpIHtcbiAgICBzaG93QWxlcnRNb2RhbCgnXHUyNkEwXHVGRTBGIE5vdGhpbmcgdG8gU2F2ZScsICdQbGVhc2UgZ2VuZXJhdGUgYXQgbGVhc3Qgb25lIHJlc3BvbnNlIGJlZm9yZSBzYXZpbmcuJyk7XG4gICAgaWYgKGJ0bikgeyBidG4uZGlzYWJsZWQgPSBmYWxzZTsgYnRuLnRleHRDb250ZW50ID0gJ1x1RDgzRFx1RENCRSBTYXZlIEFsbCBSZXNwb25zZXMnOyB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvc2NyZWVuaW5nL3NhdmUnLCB7XG4gICAgICBtZXRob2Q6ICAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6ICAgIEpTT04uc3RyaW5naWZ5KHsgcmVzcG9uc2VzIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzA1IFNhdmVkJywgYCR7ZGF0YS5jb3VudH0gcmVzcG9uc2Uke2RhdGEuY291bnQgIT09IDEgPyAncycgOiAnJ30gc2F2ZWQgYXMgPHN0cm9uZz4ke2VzY2FwZUh0bWwoZGF0YS5maWxlbmFtZSl9PC9zdHJvbmc+IGFuZCBhZGRlZCB0byB5b3VyIHJlc3BvbnNlIGxpYnJhcnkuYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgU2F2ZSBGYWlsZWQnLCBkYXRhLmVycm9yIHx8ICdDb3VsZCBub3Qgc2F2ZSByZXNwb25zZXMuJyk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsICdGYWlsZWQgdG8gY29udGFjdCBzZXJ2ZXIuJyk7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKGJ0bikgeyBidG4uZGlzYWJsZWQgPSBmYWxzZTsgYnRuLnRleHRDb250ZW50ID0gJ1x1RDgzRFx1RENCRSBTYXZlIEFsbCBSZXNwb25zZXMnOyB9XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIEV4cG9ydHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmV4cG9ydCB7XG4gIF9zY3JlZW5pbmdTdGF0ZSxcbiAgX3NjcmVlbmluZ0lucHV0VGV4dCxcbiAgX3Jlc2V0U2NyZWVuaW5nSW5wdXRUZXh0LFxuICBwb3B1bGF0ZVNjcmVlbmluZ1RhYixcbiAgcGFyc2VTY3JlZW5pbmdRdWVzdGlvbnMsXG4gIHJlbmRlclF1ZXN0aW9uQmxvY2ssXG4gIF9mbXRMYWJlbCxcbiAgc2VsZWN0Rm9ybWF0LFxuICBfZ2V0U2VsZWN0ZWRGb3JtYXQsXG4gIHNlYXJjaEZvclF1ZXN0aW9uLFxuICB0b2dnbGVQcmlvclVzZSxcbiAgdXBkYXRlRXhwU2VsZWN0aW9uLFxuICBnZW5lcmF0ZVNjcmVlbmluZ1Jlc3BvbnNlLFxuICBzYXZlU2NyZWVuaW5nUmVzcG9uc2VzLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL2ZpbmFsaXNlLmpzXG4gKiBGaW5hbGlzZSAmIGFyY2hpdmUgdGFiOiBmaW5hbGlzZSBhcHBsaWNhdGlvbiwgaGFydmVzdCBjYW5kaWRhdGVzLFxuICogYXBwbHkgc2VsZWN0ZWQgdXBkYXRlcyB0byBtYXN0ZXIgQ1YgZGF0YS5cbiAqXG4gKiBEZXBlbmRlbmNpZXMgKHJlc29sdmVkIHRocm91Z2ggZ2xvYmFsVGhpcyBhdCBydW50aW1lKTpcbiAqICAgZXNjYXBlSHRtbCwgX3JlbmRlckNvbnNpc3RlbmN5UmVwb3J0XG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZm9ybWF0QXRzU2NvcmVTdW1tYXJ5IH0gZnJvbSAnLi9hdHMtcmVmaW5lbWVudC5qcyc7XG5jb25zdCBsb2cgPSBnZXRMb2dnZXIoJ2ZpbmFsaXNlJyk7XG5cbmZ1bmN0aW9uIF9mb3JtYXREdXJhdGlvbihzZWNzKSB7XG4gIGlmIChzZWNzID09IG51bGwgfHwgc2VjcyA8IDApIHJldHVybiBudWxsO1xuICBjb25zdCBoID0gTWF0aC5mbG9vcihzZWNzIC8gMzYwMCk7XG4gIGNvbnN0IG0gPSBNYXRoLmZsb29yKChzZWNzICUgMzYwMCkgLyA2MCk7XG4gIGNvbnN0IHMgPSBzZWNzICUgNjA7XG4gIGlmIChoID4gMCkgcmV0dXJuIGAke2h9aCAke219bWA7XG4gIGlmIChtID4gMCkgcmV0dXJuIGAke219bSAke3N9c2A7XG4gIHJldHVybiBgJHtzfXNgO1xufVxuXG5mdW5jdGlvbiBfcmVuZGVyRmluYWxpc2VBdHNJdGVtcyhzY29yZSwgYXRzS2V5d29yZHMpIHtcbiAgaWYgKCFzY29yZSB8fCB0eXBlb2Ygc2NvcmUub3ZlcmFsbCAhPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gYDxsaT5BVFMga2V5d29yZHMgdHJhY2tlZDogJHthdHNLZXl3b3Jkcy5sZW5ndGh9PC9saT5gO1xuICB9XG5cbiAgY29uc3Qgc3VtbWFyeSA9IGZvcm1hdEF0c1Njb3JlU3VtbWFyeShzY29yZSk7XG4gIGNvbnN0IGhhcmRTY29yZSA9IHR5cGVvZiBzY29yZS5oYXJkX3JlcXVpcmVtZW50X3Njb3JlID09PSAnbnVtYmVyJ1xuICAgID8gYCR7TWF0aC5yb3VuZChzY29yZS5oYXJkX3JlcXVpcmVtZW50X3Njb3JlKX0lYFxuICAgIDogJ24vYSc7XG4gIGNvbnN0IHNvZnRTY29yZSA9IHR5cGVvZiBzY29yZS5zb2Z0X3JlcXVpcmVtZW50X3Njb3JlID09PSAnbnVtYmVyJ1xuICAgID8gYCR7TWF0aC5yb3VuZChzY29yZS5zb2Z0X3JlcXVpcmVtZW50X3Njb3JlKX0lYFxuICAgIDogJ24vYSc7XG5cbiAgcmV0dXJuIFtcbiAgICBgPGxpPkFUUyBzY29yZTogPHN0cm9uZz4ke3N1bW1hcnkub3ZlcmFsbH0lPC9zdHJvbmc+IDxzcGFuIHN0eWxlPVwiY29sb3I6IzQ3NTU2OTtcIj4oaGFyZCAke2hhcmRTY29yZX0gXHUyMDIyIHNvZnQgJHtzb2Z0U2NvcmV9KTwvc3Bhbj48L2xpPmAsXG4gICAgYDxsaT5BVFMgY292ZXJhZ2U6ICR7ZXNjYXBlSHRtbChzdW1tYXJ5LmxpbmUpfTwvbGk+YCxcbiAgICBgPGxpPkFUUyBkZXRhaWw6ICR7ZXNjYXBlSHRtbChzdW1tYXJ5LmRldGFpbCl9PC9saT5gLFxuICBdLmpvaW4oJycpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgUG9wdWxhdGUgZmluYWxpc2UgdGFiIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBwb3B1bGF0ZUZpbmFsaXNlVGFiKCkge1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcblxuICAvLyBGZXRjaCBjdXJyZW50IHN0YXR1cyB0byBnZXQgZ2VuZXJhdGVkIGZpbGVzIGFuZCBqb2IgYW5hbHlzaXMgZm9yIGNvbnNpc3RlbmN5IGNoZWNrXG4gIGxldCBnZW5lcmF0ZWQgID0gbnVsbDtcbiAgbGV0IHN0YXR1c0RhdGEgPSBudWxsO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9zdGF0dXMnKTtcbiAgICBzdGF0dXNEYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBnZW5lcmF0ZWQgID0gc3RhdHVzRGF0YS5nZW5lcmF0ZWRfZmlsZXMgfHwgbnVsbDtcbiAgfSBjYXRjaCAoZXJyKSB7IGxvZy53YXJuKCdGYWlsZWQgdG8gZmV0Y2ggc3RhdHVzIGZvciBmaW5hbGlzZSB0YWI6JywgZXJyKTsgfVxuXG4gIGlmICghZ2VuZXJhdGVkIHx8ICFnZW5lcmF0ZWQub3V0cHV0X2Rpcikge1xuICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgICAgPGgxPlx1MjcwNSBGaW5hbGlzZSBBcHBsaWNhdGlvbjwvaDE+XG4gICAgICA8ZGl2IGNsYXNzPVwiZW1wdHktc3RhdGVcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImljb25cIj5cdUQ4M0RcdURDQzI8L2Rpdj5cbiAgICAgICAgPGgzPk5vIENWIEdlbmVyYXRlZCBZZXQ8L2gzPlxuICAgICAgICA8cD5QbGVhc2UgZ2VuZXJhdGUgYSBDViBmaXJzdCBiZWZvcmUgZmluYWxpc2luZy48L3A+XG4gICAgICA8L2Rpdj5gO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGZpbGVzID0gZ2VuZXJhdGVkLmZpbGVzIHx8IFtdO1xuXG4gIGxldCBodG1sID0gYFxuICAgIDxoMT5cdTI3MDUgRmluYWxpc2UgQXBwbGljYXRpb248L2gxPlxuICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDttYXJnaW4tYm90dG9tOjI0cHg7XCI+XG4gICAgICBBcmNoaXZlIHRoaXMgYXBwbGljYXRpb24gdG8geW91ciBDViBoaXN0b3J5LCB1cGRhdGUgdGhlIHJlc3BvbnNlIGxpYnJhcnksIGFuZCBvcHRpb25hbGx5XG4gICAgICB3cml0ZSBhbnkgaW1wcm92ZW1lbnRzIGJhY2sgdG8gTWFzdGVyIENWIERhdGEuXG4gICAgPC9wPlxuXG4gICAgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2YwZmRmNDtib3JkZXI6MXB4IHNvbGlkICNiYmY3ZDA7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzoxNnB4O21hcmdpbi1ib3R0b206MjRweDtcIj5cbiAgICAgIDxoMyBzdHlsZT1cIm1hcmdpbjowIDAgMTBweDtcIj5cdUQ4M0RcdURDQzIgR2VuZXJhdGVkIEZpbGVzPC9oMz5cbiAgICAgIDx1bCBzdHlsZT1cIm1hcmdpbjowO3BhZGRpbmctbGVmdDoyMHB4O2xpbmUtaGVpZ2h0OjEuODtcIj5cbiAgICAgICAgJHtmaWxlcy5tYXAoZiA9PiBgPGxpPjxjb2RlIHN0eWxlPVwiZm9udC1zaXplOjAuOWVtO1wiPiR7ZXNjYXBlSHRtbChmKX08L2NvZGU+PC9saT5gKS5qb2luKCcnKSB8fCAnPGxpPihub25lKTwvbGk+J31cbiAgICAgIDwvdWw+XG4gICAgICA8cCBzdHlsZT1cIm1hcmdpbjo4cHggMCAwO2ZvbnQtc2l6ZTowLjg1ZW07Y29sb3I6IzE2NjUzNDtcIj5PdXRwdXQgZGlyOiA8Y29kZT4ke2VzY2FwZUh0bWwoZ2VuZXJhdGVkLm91dHB1dF9kaXIpfTwvY29kZT48L3A+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGlkPVwicmVhZGluZXNzLWNoZWNrbGlzdFwiPjwvZGl2PlxuICAgIDxkaXYgaWQ9XCJjb25zaXN0ZW5jeS1yZXBvcnRcIj48L2Rpdj5cbiAgICA8ZGl2IGlkPVwicmV3cml0ZS1hdWRpdC1sb2dcIj48L2Rpdj5cblxuICAgIDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZmY7Ym9yZGVyOjFweCBzb2xpZCAjZTJlOGYwO2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MjBweDttYXJnaW4tYm90dG9tOjI0cHg7XCI+XG4gICAgICA8aDMgc3R5bGU9XCJtYXJnaW46MCAwIDE2cHg7XCI+XHVEODNEXHVEQ0NCIEFwcGxpY2F0aW9uIFN0YXR1czwvaDM+XG5cbiAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE2cHg7XCI+XG4gICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NnB4O1wiIGZvcj1cImZpbmFsaXNlLXN0YXR1c1wiPlN0YXR1czwvbGFiZWw+XG4gICAgICAgIDxzZWxlY3QgaWQ9XCJmaW5hbGlzZS1zdGF0dXNcIiBzdHlsZT1cIndpZHRoOjIyMHB4O3BhZGRpbmc6OHB4IDEwcHg7Ym9yZGVyOjFweCBzb2xpZCAjY2JkNWUxO2JvcmRlci1yYWRpdXM6NnB4O2ZvbnQtc2l6ZTowLjk1ZW07XCI+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImRyYWZ0XCI+RHJhZnQgXHUyMDE0IG5vdCB5ZXQgc2VudDwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJyZWFkeVwiIHNlbGVjdGVkPlJlYWR5IHRvIHNlbmQ8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwic2VudFwiPlNlbnQ8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiaW50ZXJ2aWV3XCI+SW50ZXJ2aWV3IHNjaGVkdWxlZDwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJyZWplY3RlZFwiPlJlamVjdGVkPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImFjY2VwdGVkXCI+QWNjZXB0ZWQ8L29wdGlvbj5cbiAgICAgICAgPC9zZWxlY3Q+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MjBweDtcIj5cbiAgICAgICAgPGxhYmVsIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo2cHg7XCIgZm9yPVwiZmluYWxpc2Utbm90ZXNcIj5Ob3RlczwvbGFiZWw+XG4gICAgICAgIDx0ZXh0YXJlYSBpZD1cImZpbmFsaXNlLW5vdGVzXCIgcm93cz1cIjRcIiBtYXhsZW5ndGg9XCIyMDAwXCJcbiAgICAgICAgICBvbmlucHV0PVwiZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbmFsaXNlLW5vdGVzLWNvdW50ZXInKS50ZXh0Q29udGVudD10aGlzLnZhbHVlLmxlbmd0aCsnIC8gMjAwMCc7ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbmFsaXNlLW5vdGVzLWNvdW50ZXInKS5zdHlsZS5jb2xvcj10aGlzLnZhbHVlLmxlbmd0aD4xODAwPycjZGMyNjI2Jzp0aGlzLnZhbHVlLmxlbmd0aD4xNjAwPycjZDk3NzA2JzonIzZiNzI4MCdcIlxuICAgICAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTtwYWRkaW5nOjEwcHg7Ym9yZGVyOjFweCBzb2xpZCAjY2JkNWUxO2JvcmRlci1yYWRpdXM6NnB4O1xuICAgICAgICAgICAgICAgICBmb250LXNpemU6MC45MmVtO3Jlc2l6ZTp2ZXJ0aWNhbDtib3gtc2l6aW5nOmJvcmRlci1ib3g7XCJcbiAgICAgICAgICBwbGFjZWhvbGRlcj1cIlJlY3J1aXRlciBuYW1lLCBzYWxhcnkgaW5mbywgZm9sbG93LXVwIGRhdGUsIGludGVydmlldyBub3Rlc1x1MjAyNlwiPjwvdGV4dGFyZWE+XG4gICAgICAgIDxkaXYgaWQ9XCJmaW5hbGlzZS1ub3Rlcy1jb3VudGVyXCIgYXJpYS1saXZlPVwicG9saXRlXCIgc3R5bGU9XCJ0ZXh0LWFsaWduOnJpZ2h0O2ZvbnQtc2l6ZTowLjhlbTtjb2xvcjojNmI3MjgwO21hcmdpbi10b3A6MnB4O1wiPjAgLyAyMDAwPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGJ1dHRvbiBpZD1cImZpbmFsaXNlLWJ0blwiIG9uY2xpY2s9XCJmaW5hbGlzZUFwcGxpY2F0aW9uKClcIlxuICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6IzA1OTY2OTtjb2xvcjojZmZmO2JvcmRlcjpub25lO2JvcmRlci1yYWRpdXM6NnB4O1xuICAgICAgICAgICAgICAgcGFkZGluZzoxMHB4IDI0cHg7Zm9udC1zaXplOjFlbTtmb250LXdlaWdodDo2MDA7Y3Vyc29yOnBvaW50ZXI7XCI+XG4gICAgICAgIFx1MjcwNSBGaW5hbGlzZSAmYW1wOyBBcmNoaXZlXG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgaWQ9XCJmaW5hbGlzZS1yZXN1bHRcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj48L2Rpdj5cbiAgICA8ZGl2IGlkPVwiaGFydmVzdC1zZWN0aW9uXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+PC9kaXY+XG4gIGA7XG5cbiAgY29udGVudC5pbm5lckhUTUwgPSBodG1sO1xuICBfcmVuZGVyUmVhZGluZXNzQ2hlY2tsaXN0KGZpbGVzLCBzdGF0dXNEYXRhKTtcbiAgaWYgKHN0YXR1c0RhdGEpIF9yZW5kZXJDb25zaXN0ZW5jeVJlcG9ydChzdGF0dXNEYXRhKTtcbiAgX3JlbmRlclJld3JpdGVBdWRpdExvZygpO1xuICBfcmVzdG9yZUZpbmFsaXNlTWV0YSgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBfcmVzdG9yZUZpbmFsaXNlTWV0YSgpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9maW5hbGlzZS1tZXRhJyk7XG4gICAgaWYgKCFyZXMub2spIHJldHVybjtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBjb25zdCBzdGF0dXNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaW5hbGlzZS1zdGF0dXMnKTtcbiAgICBjb25zdCBub3Rlc0VsICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaW5hbGlzZS1ub3RlcycpO1xuICAgIGlmIChzdGF0dXNFbCAmJiBkYXRhLmFwcGxpY2F0aW9uX3N0YXR1cykgc3RhdHVzRWwudmFsdWUgPSBkYXRhLmFwcGxpY2F0aW9uX3N0YXR1cztcbiAgICBpZiAobm90ZXNFbCAgJiYgZGF0YS5ub3Rlcykge1xuICAgICAgbm90ZXNFbC52YWx1ZSA9IGRhdGEubm90ZXM7XG4gICAgICBjb25zdCBjb3VudGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbmFsaXNlLW5vdGVzLWNvdW50ZXInKTtcbiAgICAgIGlmIChjb3VudGVyKSB7XG4gICAgICAgIGNvbnN0IGxlbiA9IGRhdGEubm90ZXMubGVuZ3RoO1xuICAgICAgICBjb3VudGVyLnRleHRDb250ZW50ID0gYCR7bGVufSAvIDIwMDBgO1xuICAgICAgICBjb3VudGVyLnN0eWxlLmNvbG9yID0gbGVuID4gMTgwMCA/ICcjZGMyNjI2JyA6IGxlbiA+IDE2MDAgPyAnI2Q5NzcwNicgOiAnIzZiNzI4MCc7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChfKSB7fVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgU3VibWlzc2lvbiByZWFkaW5lc3MgY2hlY2tsaXN0IFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBfcmVuZGVyUmVhZGluZXNzQ2hlY2tsaXN0KGZpbGVzLCBzdGF0dXNEYXRhKSB7XG4gIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlYWRpbmVzcy1jaGVja2xpc3QnKTtcbiAgaWYgKCFlbCkgcmV0dXJuO1xuXG4gIGNvbnN0IGZpbGVTZXQgPSBuZXcgU2V0KChmaWxlcyB8fCBbXSkubWFwKGYgPT4gKGYgfHwgJycpLnRvTG93ZXJDYXNlKCkpKTtcbiAgY29uc3QgaGFzUGRmICA9IFsuLi5maWxlU2V0XS5zb21lKGYgPT4gZi5lbmRzV2l0aCgnLnBkZicpICYmICFmLmluY2x1ZGVzKCdjb3ZlcmxldHRlcicpICYmICFmLmluY2x1ZGVzKCdjb3Zlcl9sZXR0ZXInKSk7XG4gIGNvbnN0IGhhc0RvY3ggPSBbLi4uZmlsZVNldF0uc29tZShmID0+IGYuZW5kc1dpdGgoJy5kb2N4JykgJiYgIWYuaW5jbHVkZXMoJ2NvdmVybGV0dGVyJykgJiYgIWYuaW5jbHVkZXMoJ2NvdmVyX2xldHRlcicpICYmICFmLmluY2x1ZGVzKCdzY3JlZW5pbmcnKSk7XG4gIGNvbnN0IGhhc0h0bWwgPSBbLi4uZmlsZVNldF0uc29tZShmID0+IGYuZW5kc1dpdGgoJy5odG1sJykpO1xuICBjb25zdCBoYXNDbCAgID0gWy4uLmZpbGVTZXRdLnNvbWUoZiA9PiBmLmluY2x1ZGVzKCdjb3ZlcmxldHRlcicpIHx8IGYuaW5jbHVkZXMoJ2NvdmVyX2xldHRlcicpKTtcbiAgY29uc3QgaGFzU2NyICA9IFsuLi5maWxlU2V0XS5zb21lKGYgPT4gZi5pbmNsdWRlcygnc2NyZWVuaW5nJykpO1xuXG4gIGNvbnN0IGF0c0NoZWNrcyAgPSBzdGF0dXNEYXRhPy5hdHNfY2hlY2tzIHx8IFtdO1xuICBjb25zdCBhdHNGYWlscyAgID0gKGF0c0NoZWNrcykuZmlsdGVyKGMgPT4gYy5zdGF0dXMgPT09ICdmYWlsJyB8fCBjLnN0YXR1cyA9PT0gJ2Vycm9yJykubGVuZ3RoO1xuICBjb25zdCBhdHNTY2FubmVkID0gYXRzQ2hlY2tzLmxlbmd0aCA+IDA7XG5cbiAgY29uc3QgbGF5b3V0RnJlc2ggPSBzdGF0dXNEYXRhPy5sYXlvdXRfZnJlc2huZXNzICE9PSAnc3RhbGUnO1xuXG4gIGNvbnN0IGl0ZW1zID0gW1xuICAgIHsgb2s6IGhhc1BkZiwgICBsYWJlbDogJ0NWIFBERiBnZW5lcmF0ZWQnLCAgICAgICAgd2FybjogZmFsc2UgfSxcbiAgICB7IG9rOiBoYXNEb2N4LCAgbGFiZWw6ICdDViBET0NYIGdlbmVyYXRlZCcsICAgICAgIHdhcm46IGZhbHNlIH0sXG4gICAgeyBvazogaGFzSHRtbCwgIGxhYmVsOiAnQ1YgSFRNTCBnZW5lcmF0ZWQnLCAgICAgICB3YXJuOiBmYWxzZSB9LFxuICAgIHsgb2s6IGhhc0NsLCAgICBsYWJlbDogJ0NvdmVyIGxldHRlciBnZW5lcmF0ZWQnLCAgd2FybjogdHJ1ZSAgfSxcbiAgICB7IG9rOiBoYXNTY3IsICAgbGFiZWw6ICdTY3JlZW5pbmcgUSZBIGdlbmVyYXRlZCcsIHdhcm46IHRydWUgIH0sXG4gICAgeyBvazogYXRzU2Nhbm5lZCAmJiBhdHNGYWlscyA9PT0gMCwgd2FybjogdHJ1ZSxcbiAgICAgIGxhYmVsOiBhdHNTY2FubmVkXG4gICAgICAgID8gKGF0c0ZhaWxzID4gMCA/IGBBVFMgdmFsaWRhdGlvbiBcdTIwMTQgJHthdHNGYWlsc30gaXNzdWUke2F0c0ZhaWxzICE9PSAxID8gJ3MnIDogJyd9IGZvdW5kYCA6ICdBVFMgdmFsaWRhdGlvbiBwYXNzZWQnKVxuICAgICAgICA6ICdBVFMgdmFsaWRhdGlvbiBub3QgeWV0IHJ1bicgfSxcbiAgICB7IG9rOiBsYXlvdXRGcmVzaCwgd2FybjogdHJ1ZSwgbGFiZWw6ICdMYXlvdXQgaXMgY3VycmVudCAobm90IHN0YWxlKScgfSxcbiAgXTtcblxuICBjb25zdCByb3dzID0gaXRlbXMubWFwKCh7IG9rLCBsYWJlbCwgd2FybiB9KSA9PiB7XG4gICAgY29uc3QgaWNvbiAgPSBvayA/ICdcdTI3MDUnIDogKHdhcm4gPyAnXHUyNkEwJyA6ICdcdTI3NEMnKTtcbiAgICBjb25zdCBjb2xvciA9IG9rID8gJyMwNjVmNDYnIDogKHdhcm4gPyAnIzkyNDAwZScgOiAnIzk5MWIxYicpO1xuICAgIGNvbnN0IGJnICAgID0gb2sgPyAnI2YwZmRmNCcgOiAod2FybiA/ICcjZmZmYmViJyA6ICcjZmVmMmYyJyk7XG4gICAgcmV0dXJuIGA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTBweDtwYWRkaW5nOjhweCAxMnB4O2JhY2tncm91bmQ6JHtiZ307Ym9yZGVyLXJhZGl1czo2cHg7bWFyZ2luLWJvdHRvbTo2cHg7XCI+XG4gICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIiBzdHlsZT1cImZvbnQtc2l6ZToxLjFlbTtcIj4ke2ljb259PC9zcGFuPlxuICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjoke2NvbG9yfTtmb250LXNpemU6MC45MmVtO1wiPiR7ZXNjYXBlSHRtbChsYWJlbCl9PC9zcGFuPlxuICAgIDwvZGl2PmA7XG4gIH0pLmpvaW4oJycpO1xuXG4gIGNvbnN0IGFsbFJlcXVpcmVkID0gaGFzUGRmICYmIGhhc0RvY3ggJiYgaGFzSHRtbDtcbiAgY29uc3QgaGVhZGVyQ29sb3IgPSBhbGxSZXF1aXJlZCA/ICcjMDY1ZjQ2JyA6ICcjOTI0MDBlJztcbiAgZWwuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZmY7Ym9yZGVyOjFweCBzb2xpZCAjZTJlOGYwO2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MTZweCAyMHB4O21hcmdpbi1ib3R0b206MjRweDtcIj5cbiAgICAgIDxoMyBzdHlsZT1cIm1hcmdpbjowIDAgMTJweDtjb2xvcjoke2hlYWRlckNvbG9yfTtcIj5cdUQ4M0RcdURDQ0IgU3VibWlzc2lvbiBSZWFkaW5lc3M8L2gzPlxuICAgICAgJHtyb3dzfVxuICAgICAgPHAgc3R5bGU9XCJtYXJnaW46MTBweCAwIDA7Zm9udC1zaXplOjAuODJlbTtjb2xvcjojNjQ3NDhiO1wiPlxuICAgICAgICBcdTI2QTAgaXRlbXMgYXJlIG9wdGlvbmFsIFx1MjAxNCB0aGV5IHdhcm4gYnV0IGRvIG5vdCBibG9jayBhcmNoaXZpbmcuXG4gICAgICAgIFx1Mjc0QyBpdGVtcyBtdXN0IGJlIHJlc29sdmVkIGJlZm9yZSBzdWJtaXR0aW5nLlxuICAgICAgPC9wPlxuICAgIDwvZGl2PmA7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBSZXdyaXRlIGF1ZGl0IGxvZyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gX3JlbmRlclJld3JpdGVBdWRpdExvZygpIHtcbiAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmV3cml0ZS1hdWRpdC1sb2cnKTtcbiAgaWYgKCFlbCkgcmV0dXJuO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9yZXdyaXRlcycpO1xuICAgIGlmICghcmVzLm9rKSByZXR1cm47XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgY29uc3QgYXVkaXQgPSBkYXRhLnJld3JpdGVfYXVkaXQgfHwgW107XG4gICAgaWYgKGF1ZGl0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIGNvbnN0IHJvd3MgPSBhdWRpdC5tYXAoZW50cnkgPT4ge1xuICAgICAgY29uc3Qgb3V0Y29tZSA9IGVudHJ5Lm91dGNvbWUgfHwgZW50cnkuZGVjaXNpb24gfHwgJ1x1MjAxNCc7XG4gICAgICBjb25zdCBpY29uID0gb3V0Y29tZSA9PT0gJ2FjY2VwdGVkJyA/ICdcdTI3MDUnIDogb3V0Y29tZSA9PT0gJ2VkaXRlZCcgPyAnXHUyNzBGXHVGRTBGJyA6IG91dGNvbWUgPT09ICdyZWplY3RlZCcgPyAnXHUyNzRDJyA6ICdcdTIwMTQnO1xuICAgICAgY29uc3Qgb3JpZ2luYWwgID0gZXNjYXBlSHRtbCgoZW50cnkub3JpZ2luYWxfdGV4dCB8fCBlbnRyeS5vcmlnaW5hbCB8fCAnJykuc2xpY2UoMCwgMTIwKSk7XG4gICAgICBjb25zdCBmaW5hbCAgICAgPSBlc2NhcGVIdG1sKChlbnRyeS5maW5hbF90ZXh0IHx8IGVudHJ5LnJld3JpdHRlbiB8fCBlbnRyeS5zdWdnZXN0ZWQgfHwgJycpLnNsaWNlKDAsIDEyMCkpO1xuICAgICAgY29uc3QgZmllbGQgICAgID0gZXNjYXBlSHRtbChlbnRyeS5maWVsZCB8fCBlbnRyeS50eXBlIHx8ICdcdTIwMTQnKTtcbiAgICAgIHJldHVybiBgPHRyPlxuICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOjZweCA4cHg7Zm9udC1zaXplOjAuOGVtO2NvbG9yOiM2YjcyODA7XCI+JHtmaWVsZH08L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOjZweCA4cHg7Zm9udC1zaXplOjAuOGVtO2NvbG9yOiMzNzQxNTE7XCI+JHtvcmlnaW5hbH0ke29yaWdpbmFsLmxlbmd0aCA9PT0gMTIwID8gJ1x1MjAyNicgOiAnJ308L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOjZweCA4cHg7Zm9udC1zaXplOjAuOGVtO2NvbG9yOiMzNzQxNTE7XCI+JHtmaW5hbH0ke2ZpbmFsLmxlbmd0aCA9PT0gMTIwID8gJ1x1MjAyNicgOiAnJ308L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOjZweCA4cHg7Zm9udC1zaXplOjAuOGVtO3RleHQtYWxpZ246Y2VudGVyO1wiPiR7aWNvbn0gJHtlc2NhcGVIdG1sKG91dGNvbWUpfTwvdGQ+XG4gICAgICA8L3RyPmA7XG4gICAgfSkuam9pbignJyk7XG4gICAgZWwuaW5uZXJIVE1MID0gYFxuICAgICAgPGRldGFpbHMgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjI0cHg7XCI+XG4gICAgICAgIDxzdW1tYXJ5IHN0eWxlPVwiY3Vyc29yOnBvaW50ZXI7Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZTowLjk1ZW07cGFkZGluZzoxMHB4IDA7Y29sb3I6IzM3NDE1MTt1c2VyLXNlbGVjdDpub25lO1wiPlxuICAgICAgICAgIFx1RDgzRFx1RENDQiBSZXdyaXRlIGF1ZGl0IGxvZyAoJHthdWRpdC5sZW5ndGh9IGRlY2lzaW9uJHthdWRpdC5sZW5ndGggIT09IDEgPyAncycgOiAnJ30pXG4gICAgICAgIDwvc3VtbWFyeT5cbiAgICAgICAgPGRpdiBzdHlsZT1cIm92ZXJmbG93LXg6YXV0bzttYXJnaW4tdG9wOjEwcHg7XCI+XG4gICAgICAgICAgPHRhYmxlIHN0eWxlPVwid2lkdGg6MTAwJTtib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7Zm9udC1zaXplOjAuODVlbTtcIj5cbiAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgPHRyIHN0eWxlPVwiYmFja2dyb3VuZDojZjhmYWZjO2JvcmRlci1ib3R0b206MnB4IHNvbGlkICNlMmU4ZjA7XCI+XG4gICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwicGFkZGluZzo4cHg7dGV4dC1hbGlnbjpsZWZ0O2NvbG9yOiMzNzQxNTE7Zm9udC13ZWlnaHQ6NjAwO1wiPkZpZWxkPC90aD5cbiAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJwYWRkaW5nOjhweDt0ZXh0LWFsaWduOmxlZnQ7Y29sb3I6IzM3NDE1MTtmb250LXdlaWdodDo2MDA7XCI+T3JpZ2luYWw8L3RoPlxuICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cInBhZGRpbmc6OHB4O3RleHQtYWxpZ246bGVmdDtjb2xvcjojMzc0MTUxO2ZvbnQtd2VpZ2h0OjYwMDtcIj5GaW5hbDwvdGg+XG4gICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwicGFkZGluZzo4cHg7dGV4dC1hbGlnbjpjZW50ZXI7Y29sb3I6IzM3NDE1MTtmb250LXdlaWdodDo2MDA7XCI+T3V0Y29tZTwvdGg+XG4gICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgPHRib2R5PiR7cm93c308L3Rib2R5PlxuICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kZXRhaWxzPmA7XG4gIH0gY2F0Y2ggeyAvKiBub24tZmF0YWwgKi8gfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgRmluYWxpc2UgYXBwbGljYXRpb24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIGZpbmFsaXNlQXBwbGljYXRpb24oKSB7XG4gIC8qIGR1Y2tmbG93OlxuICAgKiAgIGlkOiBmaW5hbGlzZV91aV9zdWJtaXRfbGl2ZVxuICAgKiAgIGtpbmQ6IHVpXG4gICAqICAgdGltZXN0YW1wOiAnMjAyNi0wMy0yNVQyMTozOTo0OFonXG4gICAqICAgc3RhdHVzOiBsaXZlXG4gICAqICAgaGFuZGxlczpcbiAgICogICAtIHVpOmZpbmFsaXNlLnN1Ym1pdFxuICAgKiAgIGNhbGxzOlxuICAgKiAgIC0gUE9TVCAvYXBpL2ZpbmFsaXNlXG4gICAqICAgcmVhZHM6XG4gICAqICAgLSBkb206I2ZpbmFsaXNlLXN0YXR1cy52YWx1ZVxuICAgKiAgIC0gZG9tOiNmaW5hbGlzZS1ub3Rlcy52YWx1ZVxuICAgKiAgIHdyaXRlczpcbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL2ZpbmFsaXNlLnN0YXR1c1xuICAgKiAgIC0gcmVxdWVzdDpQT1NUIC9hcGkvZmluYWxpc2Uubm90ZXNcbiAgICogICAtIGRvbTojZmluYWxpc2UtcmVzdWx0XG4gICAqICAgbm90ZXM6IFN1Ym1pdHMgZmluYWwgYXBwbGljYXRpb24gc3RhdHVzIGFuZCBub3RlcyBzbyBiYWNrZW5kIG1ldGFkYXRhLCBhcmNoaXZlIHN0YXRlLCBhbmQgb3B0aW9uYWwgZ2l0IGZpbmFsaXphdGlvbiBjYW4gYmUgd3JpdHRlbiBmcm9tIHRoZSBjdXJyZW50IHNlc3Npb24uXG4gICAqL1xuICBjb25zdCBidG4gICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmluYWxpc2UtYnRuJyk7XG4gIGNvbnN0IHJlc3VsdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaW5hbGlzZS1yZXN1bHQnKTtcbiAgY29uc3Qgc3RhdHVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbmFsaXNlLXN0YXR1cycpLnZhbHVlO1xuICBjb25zdCBub3RlcyAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmluYWxpc2Utbm90ZXMnKS52YWx1ZTtcblxuICBidG4uZGlzYWJsZWQgICAgPSB0cnVlO1xuICBidG4udGV4dENvbnRlbnQgPSAnXHUyM0YzIEZpbmFsaXNpbmdcdTIwMjYnO1xuICByZXN1bHQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgcmVzdWx0LmlubmVySFRNTCAgICAgPSAnJztcblxuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9maW5hbGlzZScsIHtcbiAgICAgIG1ldGhvZDogICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogICAgSlNPTi5zdHJpbmdpZnkoeyBzdGF0dXMsIG5vdGVzIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuXG4gICAgaWYgKCFyZXMub2sgfHwgIWRhdGEub2spIHtcbiAgICAgIHJlc3VsdC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgIHJlc3VsdC5pbm5lckhUTUwgPSBgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2ZlZTJlMjtib3JkZXI6MXB4IHNvbGlkICNmY2E1YTU7Ym9yZGVyLXJhZGl1czo4cHg7XG4gICAgICAgIHBhZGRpbmc6MTRweCAxOHB4O2NvbG9yOiM5OTFiMWI7XCI+XG4gICAgICAgIDxzdHJvbmc+XHUyNzRDIEVycm9yOjwvc3Ryb25nPiAke2VzY2FwZUh0bWwoZGF0YS5lcnJvciB8fCAnRmluYWxpc2UgZmFpbGVkJyl9XG4gICAgICA8L2Rpdj5gO1xuICAgICAgYnRuLmRpc2FibGVkICAgID0gZmFsc2U7XG4gICAgICBidG4udGV4dENvbnRlbnQgPSAnXHUyNzA1IEZpbmFsaXNlICYgQXJjaGl2ZSc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3VtbWFyeSA9IGRhdGEuc3VtbWFyeSB8fCB7fTtcbiAgICBjb25zdCBoYXNoICAgID0gZGF0YS5jb21taXRfaGFzaCA/IGA8Y29kZSBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07XCI+JHtlc2NhcGVIdG1sKGRhdGEuY29tbWl0X2hhc2gpfTwvY29kZT5gIDogJyhubyBjb21taXQpJztcbiAgICBjb25zdCBnaXRXYXJuID0gZGF0YS5naXRfZXJyb3JcbiAgICAgID8gYDxwIHN0eWxlPVwiY29sb3I6I2Q5NzcwNjtmb250LXNpemU6MC44N2VtO21hcmdpbi10b3A6OHB4O1wiPlx1MjZBMCBHaXQ6ICR7ZXNjYXBlSHRtbChkYXRhLmdpdF9lcnJvcil9PC9wPmBcbiAgICAgIDogJyc7XG4gICAgY29uc3QgYXBwcm92ZWRDb3VudCA9IHN1bW1hcnkuYXBwcm92ZWRfcmV3cml0ZXMgPz8gMDtcbiAgICBjb25zdCBhdHNLZXl3b3JkcyAgID0gc3VtbWFyeS5hdHNfa2V5d29yZHMgfHwgW107XG4gICAgY29uc3QgYXRzU2NvcmUgICAgICA9IHN1bW1hcnkuYXRzX3Njb3JlIHx8IG51bGw7XG4gICAgY29uc3QgZHVyYXRpb25TZWNzICA9IHN1bW1hcnkuc2Vzc2lvbl9kdXJhdGlvbl9zZWNzO1xuICAgIGNvbnN0IGR1cmF0aW9uU3RyICAgPSBkdXJhdGlvblNlY3MgIT0gbnVsbCA/IF9mb3JtYXREdXJhdGlvbihkdXJhdGlvblNlY3MpIDogbnVsbDtcblxuICAgIHJlc3VsdC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICByZXN1bHQuaW5uZXJIVE1MID0gYFxuICAgICAgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2YwZmRmNDtib3JkZXI6MXB4IHNvbGlkICM4NmVmYWM7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzoxNnB4IDIwcHg7bWFyZ2luLWJvdHRvbToyMHB4O1wiPlxuICAgICAgICA8c3Ryb25nPlx1MjcwNSBBcHBsaWNhdGlvbiBhcmNoaXZlZCE8L3N0cm9uZz5cbiAgICAgICAgPHVsIHN0eWxlPVwibWFyZ2luOjhweCAwIDA7cGFkZGluZy1sZWZ0OjIwcHg7bGluZS1oZWlnaHQ6MS44O2ZvbnQtc2l6ZTowLjkyZW07XCI+XG4gICAgICAgICAgPGxpPlN0YXR1czogPHN0cm9uZz4ke2VzY2FwZUh0bWwoc3RhdHVzKX08L3N0cm9uZz48L2xpPlxuICAgICAgICAgIDxsaT5BcHByb3ZlZCByZXdyaXRlczogJHthcHByb3ZlZENvdW50fTwvbGk+XG4gICAgICAgICAgJHtfcmVuZGVyRmluYWxpc2VBdHNJdGVtcyhhdHNTY29yZSwgYXRzS2V5d29yZHMpfVxuICAgICAgICAgICR7ZHVyYXRpb25TdHIgPyBgPGxpPlNlc3Npb24gZHVyYXRpb246ICR7ZXNjYXBlSHRtbChkdXJhdGlvblN0cil9PC9saT5gIDogJyd9XG4gICAgICAgICAgPGxpPkdpdCBjb21taXQ6ICR7aGFzaH08L2xpPlxuICAgICAgICA8L3VsPlxuICAgICAgICAke2dpdFdhcm59XG4gICAgICA8L2Rpdj5gO1xuXG4gICAgYnRuLnRleHRDb250ZW50ID0gJ1x1MjcwNSBBcmNoaXZlZCc7XG5cbiAgICAvLyBTaG93IGhhcnZlc3Qgc2VjdGlvblxuICAgIGF3YWl0IHNob3dIYXJ2ZXN0U2VjdGlvbigpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZXN1bHQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgcmVzdWx0LmlubmVySFRNTCA9IGA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZmVlMmUyO2JvcmRlcjoxcHggc29saWQgI2ZjYTVhNTtib3JkZXItcmFkaXVzOjhweDtcbiAgICAgIHBhZGRpbmc6MTRweCAxOHB4O2NvbG9yOiM5OTFiMWI7XCI+XG4gICAgICA8c3Ryb25nPlx1Mjc0QyBOZXR3b3JrIGVycm9yOjwvc3Ryb25nPiAke2VzY2FwZUh0bWwoZXJyLm1lc3NhZ2UpfVxuICAgIDwvZGl2PmA7XG4gICAgYnRuLmRpc2FibGVkICAgID0gZmFsc2U7XG4gICAgYnRuLnRleHRDb250ZW50ID0gJ1x1MjcwNSBGaW5hbGlzZSAmIEFyY2hpdmUnO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBTaG93IGhhcnZlc3Qgc2VjdGlvbiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gc2hvd0hhcnZlc3RTZWN0aW9uKCkge1xuICBjb25zdCBzZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hhcnZlc3Qtc2VjdGlvbicpO1xuICBzZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICBzZWN0aW9uLmlubmVySFRNTCA9IGBcbiAgICA8aDIgc3R5bGU9XCJtYXJnaW4tdG9wOjA7XCI+XHVEODNEXHVEQ0U1IFVwZGF0ZSBNYXN0ZXIgQ1YgRGF0YTwvaDI+XG4gICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO21hcmdpbi1ib3R0b206MTZweDtcIj5Mb2FkaW5nIGltcHJvdmVtZW50IGNhbmRpZGF0ZXMgZnJvbSB0aGlzIHNlc3Npb25cdTIwMjY8L3A+XG4gICAgPGRpdiBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO3BhZGRpbmc6MjRweDtcIj48ZGl2IGNsYXNzPVwibG9hZGluZy1zcGlubmVyXCI+PC9kaXY+PC9kaXY+YDtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9oYXJ2ZXN0L2NhbmRpZGF0ZXMnKTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcblxuICAgIGlmICghZGF0YS5vaykge1xuICAgICAgc2VjdGlvbi5pbm5lckhUTUwgPSBgXG4gICAgICAgIDxoMiBzdHlsZT1cIm1hcmdpbi10b3A6MDtcIj5cdUQ4M0RcdURDRTUgVXBkYXRlIE1hc3RlciBDViBEYXRhPC9oMj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2ZlZTJlMjtib3JkZXI6MXB4IHNvbGlkICNmY2E1YTU7Ym9yZGVyLXJhZGl1czo4cHg7XG4gICAgICAgICAgcGFkZGluZzoxMnB4IDE2cHg7Y29sb3I6Izk5MWIxYjtcIj5cbiAgICAgICAgICBcdTI3NEMgJHtlc2NhcGVIdG1sKGRhdGEuZXJyb3IgfHwgJ0ZhaWxlZCB0byBsb2FkIGNhbmRpZGF0ZXMnKX1cbiAgICAgICAgPC9kaXY+YDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjYW5kaWRhdGVzID0gZGF0YS5jYW5kaWRhdGVzIHx8IFtdO1xuXG4gICAgaWYgKGNhbmRpZGF0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBzZWN0aW9uLmlubmVySFRNTCA9IGBcbiAgICAgICAgPGgyIHN0eWxlPVwibWFyZ2luLXRvcDowO1wiPlx1RDgzRFx1RENFNSBVcGRhdGUgTWFzdGVyIENWIERhdGE8L2gyPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZW1wdHktc3RhdGVcIiBzdHlsZT1cInBhZGRpbmc6MjRweCAwO1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpY29uXCI+XHVEODNEXHVEQ0NCPC9kaXY+XG4gICAgICAgICAgPGgzPk5vIFVwZGF0ZSBDYW5kaWRhdGVzPC9oMz5cbiAgICAgICAgICA8cD5Ob3RoaW5nIGZyb20gdGhpcyBzZXNzaW9uIHdhcnJhbnRzIHdyaXRpbmcgYmFjayB0byB0aGUgbWFzdGVyIENWLjwvcD5cbiAgICAgICAgPC9kaXY+YDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB0eXBlSWNvbnMgPSB7XG4gICAgICBpbXByb3ZlZF9idWxsZXQ6ICAgICdcdTI3MEZcdUZFMEYnLFxuICAgICAgbmV3X3NraWxsOiAgICAgICAgICAnXHVEODNEXHVERUUwJyxcbiAgICAgIHN1bW1hcnlfdmFyaWFudDogICAgJ1x1RDgzRFx1RENERCcsXG4gICAgICBza2lsbF9nYXBfY29uZmlybWVkOidcdTI3MDUnLFxuICAgIH07XG5cbiAgICBsZXQgaHRtbCA9IGBcbiAgICAgIDxoMiBzdHlsZT1cIm1hcmdpbi10b3A6MDtcIj5cdUQ4M0RcdURDRTUgVXBkYXRlIE1hc3RlciBDViBEYXRhPC9oMj5cbiAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDttYXJnaW4tYm90dG9tOjE2cHg7XCI+XG4gICAgICAgIFNlbGVjdCBpbXByb3ZlbWVudHMgZnJvbSB0aGlzIHNlc3Npb24gdG8gd3JpdGUgYmFjayB0byA8Y29kZT5NYXN0ZXJfQ1ZfRGF0YS5qc29uPC9jb2RlPi5cbiAgICAgICAgTm8gaXRlbXMgYXJlIHByZS1zZWxlY3RlZCBcdTIwMTQgY2hvb3NlIG9ubHkgd2hhdCB5b3Ugd2FudCB0byBrZWVwLlxuICAgICAgPC9wPlxuICAgICAgPHRhYmxlIGNsYXNzPVwicmV2aWV3LXRhYmxlXCIgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE2cHg7XCI+XG4gICAgICAgIDx0aGVhZD5cbiAgICAgICAgICA8dHI+XG4gICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDozNnB4O3RleHQtYWxpZ246Y2VudGVyO1wiPkluY2x1ZGU8L3RoPlxuICAgICAgICAgICAgPHRoPlR5cGU8L3RoPlxuICAgICAgICAgICAgPHRoPkNoYW5nZTwvdGg+XG4gICAgICAgICAgICA8dGg+UmF0aW9uYWxlPC90aD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICA8L3RoZWFkPlxuICAgICAgICA8dGJvZHk+YDtcblxuICAgIGZvciAoY29uc3QgYyBvZiBjYW5kaWRhdGVzKSB7XG4gICAgICBjb25zdCBpY29uICAgICA9IHR5cGVJY29uc1tjLnR5cGVdIHx8ICdcdUQ4M0RcdURDQ0MnO1xuICAgICAgY29uc3Qgb3JpZ2luYWwgPSBjLm9yaWdpbmFsICYmIGMub3JpZ2luYWwgIT09ICcobm90IGluIG1hc3RlciBkYXRhKSdcbiAgICAgICAgPyBgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjgyZW07Y29sb3I6IzZiNzI4MDttYXJnaW4tdG9wOjRweDttYXJnaW4tYm90dG9tOjJweDtcbiAgICAgICAgICAgICAgIHRleHQtZGVjb3JhdGlvbjpsaW5lLXRocm91Z2g7XCI+JHtlc2NhcGVIdG1sKGMub3JpZ2luYWwpfTwvZGl2PmBcbiAgICAgICAgOiAnJztcbiAgICAgIGh0bWwgKz0gYFxuICAgICAgICA8dHIgaWQ9XCJoYXJ2ZXN0LXJvdy0ke2VzY2FwZUh0bWwoYy5pZCl9XCI+XG4gICAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7XCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJoYXJ2ZXN0LWNoay0ke2VzY2FwZUh0bWwoYy5pZCl9XCJcbiAgICAgICAgICAgICAgZGF0YS1oYXJ2ZXN0LWlkPVwiJHtlc2NhcGVIdG1sKGMuaWQpfVwiIHN0eWxlPVwid2lkdGg6MTZweDtoZWlnaHQ6MTZweDtjdXJzb3I6cG9pbnRlcjtcIj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgIDxzcGFuIHRpdGxlPVwiJHtlc2NhcGVIdG1sKGMudHlwZSl9XCI+JHtpY29ufTwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtjb2xvcjojNDc1NTY5O21hcmdpbi1sZWZ0OjRweDtcIj4ke2VzY2FwZUh0bWwoYy50eXBlLnJlcGxhY2UoL18vZywnICcpKX08L3NwYW4+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6NTAwO1wiPiR7ZXNjYXBlSHRtbChjLmxhYmVsKX08L2Rpdj5cbiAgICAgICAgICAgICR7b3JpZ2luYWx9XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuODhlbTtjb2xvcjojMWUyOTNiO21hcmdpbi10b3A6MnB4O1wiPiR7ZXNjYXBlSHRtbChjLnByb3Bvc2VkKX08L2Rpdj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICAgIDx0ZCBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07Y29sb3I6IzY0NzQ4YjtcIj4ke2VzY2FwZUh0bWwoYy5yYXRpb25hbGUpfTwvdGQ+XG4gICAgICAgIDwvdHI+YDtcbiAgICB9XG5cbiAgICBodG1sICs9IGBcbiAgICAgICAgPC90Ym9keT5cbiAgICAgIDwvdGFibGU+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDoxMnB4O2FsaWduLWl0ZW1zOmNlbnRlcjtcIj5cbiAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPVwiYXBwbHlIYXJ2ZXN0U2VsZWN0aW9ucygpXCJcbiAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6IzBlYTVlOTtjb2xvcjojZmZmO2JvcmRlcjpub25lO2JvcmRlci1yYWRpdXM6NnB4O1xuICAgICAgICAgICAgICAgICBwYWRkaW5nOjEwcHggMjRweDtmb250LXNpemU6MWVtO2ZvbnQtd2VpZ2h0OjYwMDtjdXJzb3I6cG9pbnRlcjtcIiBpZD1cImhhcnZlc3QtYXBwbHktYnRuXCI+XG4gICAgICAgICAgXHVEODNEXHVEQ0U1IEFwcGx5IFNlbGVjdGVkIFVwZGF0ZXNcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gb25jbGljaz1cImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoYXJ2ZXN0LXNlY3Rpb24nKS5zdHlsZS5kaXNwbGF5PSdub25lJ1wiXG4gICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmMWY1Zjk7Y29sb3I6IzQ3NTU2OTtib3JkZXI6MXB4IHNvbGlkICNjYmQ1ZTE7Ym9yZGVyLXJhZGl1czo2cHg7XG4gICAgICAgICAgICAgICAgIHBhZGRpbmc6MTBweCAyMHB4O2ZvbnQtc2l6ZTowLjk1ZW07Y3Vyc29yOnBvaW50ZXI7XCI+XG4gICAgICAgICAgU2tpcFxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBpZD1cImhhcnZlc3QtcmVzdWx0XCIgc3R5bGU9XCJtYXJnaW4tdG9wOjE2cHg7XCI+PC9kaXY+YDtcblxuICAgIHNlY3Rpb24uaW5uZXJIVE1MID0gaHRtbDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgc2VjdGlvbi5pbm5lckhUTUwgPSBgXG4gICAgICA8aDIgc3R5bGU9XCJtYXJnaW4tdG9wOjA7XCI+XHVEODNEXHVEQ0U1IFVwZGF0ZSBNYXN0ZXIgQ1YgRGF0YTwvaDI+XG4gICAgICA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZmVlMmUyO2JvcmRlcjoxcHggc29saWQgI2ZjYTVhNTtib3JkZXItcmFkaXVzOjhweDtcbiAgICAgICAgcGFkZGluZzoxMnB4IDE2cHg7Y29sb3I6Izk5MWIxYjtcIj5cbiAgICAgICAgXHUyNzRDIE5ldHdvcmsgZXJyb3I6ICR7ZXNjYXBlSHRtbChlcnIubWVzc2FnZSl9XG4gICAgICA8L2Rpdj5gO1xuICB9XG59XG5cbi8vIGFwcGx5SGFydmVzdFNlbGVjdGlvbnMoKSAoYm91bmQgdmlhIHRoZSBidXR0b24ncyBvbmNsaWNrIGFib3ZlKSBsaXZlcyBpblxuLy8gd2ViL2hhcnZlc3QuanMsIG5vdCBoZXJlIFx1MjAxNCB0aGlzIGZpbGUgdXNlZCB0byBjYXJyeSBpdHMgb3duIGRpdmVyZ2VudFxuLy8gZHVwbGljYXRlIChkaWZmZXJlbnQgY29uZmlybS9tZXNzYWdlIGNvcHksIG5vIGNvbmZpcm0tbW9kYWwgc3RlcCksIGJ1dFxuLy8gc2luY2UgYm90aCBmaWxlcyByZW5kZXIgYSBidXR0b24gd2l0aCB0aGUgc2FtZSBvbmNsaWNrIGFuZCB3aW5kb3cgcmVzb2x2ZXNcbi8vIGJhcmUgaWRlbnRpZmllcnMgYXQgY2xpY2sgdGltZSwgaGFydmVzdC5qcydzIHZlcnNpb24gd2FzIGFsd2F5cyB0aGUgb25lXG4vLyBhY3R1YWxseSBpbnZva2VkIGluIHByb2R1Y3Rpb24gcmVnYXJkbGVzczsgdGhpcyBjb3B5IHdhcyB1bnJlYWNoYWJsZSBkZWFkXG4vLyBjb2RlLiBSZW1vdmVkOyBzZWUgd2ViL2hhcnZlc3QuanMuXG5cbi8vIFx1MjUwMFx1MjUwMCBFeHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5leHBvcnQge1xuICBwb3B1bGF0ZUZpbmFsaXNlVGFiLFxuICBmaW5hbGlzZUFwcGxpY2F0aW9uLFxuICBzaG93SGFydmVzdFNlY3Rpb24sXG4gIF9yZW5kZXJSZWFkaW5lc3NDaGVja2xpc3QsXG59O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvaW50ZXJ2aWV3LXByZXAuanNcbiAqIEludGVydmlldyBQcmVwYXJhdGlvbiBwaGFzZSBcdTIwMTQgcGxhY2Vob2xkZXIgY29udGVudCB3aXRoIG5hdmlnYXRpb24uXG4gKlxuICogRGVwZW5kZW5jaWVzIChyZXNvbHZlZCB0aHJvdWdoIGdsb2JhbFRoaXMgYXQgcnVudGltZSk6XG4gKiAgIGhhbmRsZVN0ZXBDbGlja1xuICovXG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmNvbnN0IGxvZyA9IGdldExvZ2dlcignaW50ZXJ2aWV3LXByZXAnKTtcblxuYXN5bmMgZnVuY3Rpb24gcG9wdWxhdGVJbnRlcnZpZXdQcmVwVGFiKCkge1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgaWYgKCFjb250ZW50KSByZXR1cm47XG5cbiAgY29udGVudC5pbm5lckhUTUwgPSBgXG4gICAgPGRpdiBzdHlsZT1cIm1heC13aWR0aDo3MDBweDttYXJnaW46MCBhdXRvO3BhZGRpbmc6NDBweCAyMHB4O3RleHQtYWxpZ246Y2VudGVyO1wiPlxuICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTozZW07bWFyZ2luLWJvdHRvbToxNnB4O1wiPlx1RDgzQ1x1REZBNDwvZGl2PlxuICAgICAgPGgyIHN0eWxlPVwibWFyZ2luLWJvdHRvbToxMnB4O1wiPkludGVydmlldyBQcmVwYXJhdGlvbjwvaDI+XG4gICAgICA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7bWFyZ2luLWJvdHRvbTo4cHg7XCI+XG4gICAgICAgIEFJLWdlbmVyYXRlZCBpbnRlcnZpZXcgcHJlcGFyYXRpb24gYmFzZWQgb24gdGhpcyBqb2IgYW5kIHlvdXIgQ1YgaXMgY29taW5nIHNvb24uXG4gICAgICA8L3A+XG4gICAgICA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7Zm9udC1zaXplOjAuOWVtO1wiPlxuICAgICAgICBUaGlzIHdpbGwgaW5jbHVkZSBsaWtlbHkgaW50ZXJ2aWV3IHF1ZXN0aW9ucywgc3VnZ2VzdGVkIHRhbGtpbmcgcG9pbnRzLCBhbmRcbiAgICAgICAgU1RBUi1mb3JtYXQgYW5zd2VycyBkcmF3biBmcm9tIHlvdXIgZXhwZXJpZW5jZS5cbiAgICAgIDwvcD5cbiAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOjQwcHg7XCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4tcHJpbWFyeVwiIG9uY2xpY2s9XCJoYW5kbGVTdGVwQ2xpY2soJ3RoYW5rX3lvdScpXCJcbiAgICAgICAgICAgICAgICBzdHlsZT1cImZvbnQtc2l6ZToxZW07cGFkZGluZzoxMHB4IDI0cHg7XCI+XG4gICAgICAgICAgUHJvY2VlZCB0byBUaGFuayBZb3UgTGV0dGVyIFx1MjE5MlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PmA7XG5cbiAgbG9nLmRlYnVnKCdJbnRlcnZpZXcgcHJlcCBwbGFjZWhvbGRlciByZW5kZXJlZCcpO1xufVxuXG5leHBvcnQgeyBwb3B1bGF0ZUludGVydmlld1ByZXBUYWIgfTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL3RoYW5rLXlvdS5qc1xuICogVGhhbmsgWW91IExldHRlciBwaGFzZSBcdTIwMTQgcGxhY2Vob2xkZXIgY29udGVudCB3aXRoIG5hdmlnYXRpb24uXG4gKlxuICogRGVwZW5kZW5jaWVzIChyZXNvbHZlZCB0aHJvdWdoIGdsb2JhbFRoaXMgYXQgcnVudGltZSk6XG4gKiAgIGhhbmRsZVN0ZXBDbGlja1xuICovXG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmNvbnN0IGxvZyA9IGdldExvZ2dlcigndGhhbmsteW91Jyk7XG5cbmFzeW5jIGZ1bmN0aW9uIHBvcHVsYXRlVGhhbmtZb3VUYWIoKSB7XG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9jdW1lbnQtY29udGVudCcpO1xuICBpZiAoIWNvbnRlbnQpIHJldHVybjtcblxuICBjb250ZW50LmlubmVySFRNTCA9IGBcbiAgICA8ZGl2IHN0eWxlPVwibWF4LXdpZHRoOjcwMHB4O21hcmdpbjowIGF1dG87cGFkZGluZzo0MHB4IDIwcHg7dGV4dC1hbGlnbjpjZW50ZXI7XCI+XG4gICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjNlbTttYXJnaW4tYm90dG9tOjE2cHg7XCI+XHVEODNEXHVERTRGPC9kaXY+XG4gICAgICA8aDIgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjEycHg7XCI+VGhhbmsgWW91IExldHRlcjwvaDI+XG4gICAgICA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7bWFyZ2luLWJvdHRvbTo4cHg7XCI+XG4gICAgICAgIEFJLWdlbmVyYXRlZCB0aGFuayB5b3UgbGV0dGVyIHRlbXBsYXRlcyBhcmUgY29taW5nIHNvb24uXG4gICAgICA8L3A+XG4gICAgICA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7Zm9udC1zaXplOjAuOWVtO1wiPlxuICAgICAgICBBZnRlciB5b3VyIGludGVydmlldywgdXNlIHRoaXMgdG8gZ2VuZXJhdGUgYSBwZXJzb25hbGlzZWQgdGhhbmsgeW91IG5vdGVcbiAgICAgICAgdGhhdCByZWluZm9yY2VzIHlvdXIgZml0IGZvciB0aGUgcm9sZS5cbiAgICAgIDwvcD5cbiAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOjQwcHg7XCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4tcHJpbWFyeVwiIG9uY2xpY2s9XCJoYW5kbGVTdGVwQ2xpY2soJ2hhcnZlc3QnKVwiXG4gICAgICAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6MWVtO3BhZGRpbmc6MTBweCAyNHB4O1wiPlxuICAgICAgICAgIFByb2NlZWQgdG8gSGFydmVzdCBJbXByb3ZlbWVudHMgXHUyMTkyXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+YDtcblxuICBsb2cuZGVidWcoJ1RoYW5rIHlvdSBsZXR0ZXIgcGxhY2Vob2xkZXIgcmVuZGVyZWQnKTtcbn1cblxuZXhwb3J0IHsgcG9wdWxhdGVUaGFua1lvdVRhYiB9O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiBIYXJ2ZXN0IHRhYjogTExNLXNjb3JlZCBncm91cGVkIHZpZXcgb2YgbWFzdGVyLUNWIGltcHJvdmVtZW50IGNhbmRpZGF0ZXMuXG4gKlxuICogUHVibGljIGV4cG9ydHM6XG4gKiAgIHBvcHVsYXRlSGFydmVzdFRhYigpICAgICAgICBcdTIwMTQgY2FsbGVkIGJ5IHJldmlldy10YWJsZS1iYXNlLmpzIG9uIHRhYiBzd2l0Y2hcbiAqICAgYXBwbHlIYXJ2ZXN0U2VsZWN0aW9ucygpICAgIFx1MjAxNCBjYWxsZWQgYnkgaW5saW5lIG9uY2xpY2sgb24gdGhlIEFwcGx5IGJ1dHRvblxuICogICByZWZyZXNoSGFydmVzdEFuYWx5c2lzKCkgICAgXHUyMDE0IGNhbGxlZCBieSBpbmxpbmUgb25jbGljayBvbiB0aGUgUmVmcmVzaCBidXR0b25cbiAqL1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBlc2MsIHJlbmRlclByb3Bvc2FsUm93LCBhdHRhY2hQcm9wb3NhbFJvd0xpc3RlbmVycyB9IGZyb20gJy4vcHJvcG9zYWwtcmV2aWV3LmpzJztcblxuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdoYXJ2ZXN0Jyk7XG5cbi8vIFx1MjUwMFx1MjUwMCBEaXNwbGF5IGNvbmZpZyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLyoqXG4gKiBNZXJnZWQgZGlzcGxheSB0eXBlIGNvbmZpZy5cbiAqIG5ld19za2lsbCBhbmQgc2tpbGxfZ2FwX2NvbmZpcm1lZCBib3RoIG1hcCB0byB0aGUgJ3NraWxsJyBkaXNwbGF5IGdyb3VwLlxuICovXG5jb25zdCBIQVJWRVNUX1RZUEVfQ09ORklHID0ge1xuICBpbXByb3ZlZF9idWxsZXQ6ICAgICB7IGxhYmVsOiAnRXhwZXJpZW5jZSBCdWxsZXRzJywgICAgIGljb246ICdcdTI3MEZcdUZFMEYnLCAgc29ydDogMSwgZGlzcGxheVR5cGU6ICdpbXByb3ZlZF9idWxsZXQnICAgICB9LFxuICBuZXdfc2tpbGw6ICAgICAgICAgICB7IGxhYmVsOiAnU2tpbGxzJywgICAgICAgICAgICAgICAgIGljb246ICdcdUQ4M0RcdURFRTBcdUZFMEYnLCAgc29ydDogMiwgZGlzcGxheVR5cGU6ICdza2lsbCcgICAgICAgICAgICAgICB9LFxuICBza2lsbF9nYXBfY29uZmlybWVkOiB7IGxhYmVsOiAnU2tpbGxzJywgICAgICAgICAgICAgICAgIGljb246ICdcdUQ4M0RcdURFRTBcdUZFMEYnLCAgc29ydDogMiwgZGlzcGxheVR5cGU6ICdza2lsbCcgICAgICAgICAgICAgICB9LFxuICBzdW1tYXJ5X3ZhcmlhbnQ6ICAgICB7IGxhYmVsOiAnUHJvZmVzc2lvbmFsIFN1bW1hcnknLCAgIGljb246ICdcdUQ4M0RcdURDREQnLCAgc29ydDogMywgZGlzcGxheVR5cGU6ICdzdW1tYXJ5X3ZhcmlhbnQnICAgICB9LFxuICBza2lsbF90eXBlX3VwZGF0ZTogICB7IGxhYmVsOiAnU2tpbGwgQ2xhc3NpZmljYXRpb24nLCAgIGljb246ICdcdUQ4M0NcdURGRjdcdUZFMEYnLCAgc29ydDogNCwgZGlzcGxheVR5cGU6ICdza2lsbF90eXBlX3VwZGF0ZScgIH0sXG59O1xuXG5jb25zdCBIQVJWRVNUX1RZUEVfREVTQ1JJUFRJT05TID0ge1xuICBpbXByb3ZlZF9idWxsZXQ6ICAgICAgJ1Jld3JpdHRlbiBhY2hpZXZlbWVudCBidWxsZXRzIHlvdSBhcHByb3ZlZCBpbiB0aGUgUmV3cml0ZXMgc3RlcC4gUHJvbW90aW5nIHVwZGF0ZXMgdGhlIGJ1bGxldCB0ZXh0IGluIHlvdXIgbWFzdGVyIENWLicsXG4gIHNraWxsOiAgICAgICAgICAgICAgICAnU2tpbGxzIGFic2VudCBmcm9tIHlvdXIgbWFzdGVyIENWIFx1MjAxNCBlaXRoZXIgYWRkZWQgKFx1RDgzQ1x1REQ5NSBBZGRlZCkgZHVyaW5nIHRoZSBTa2lsbHMgUmV2aWV3IG9yIGNvbmZpcm1lZCB3aGVuIGFza2VkIChcdTI3MDUgQ29uZmlybWVkKS4gUHJvbW90aW5nIGFkZHMgdGhlbSB0byB5b3VyIHNraWxscyBzZWN0aW9uLicsXG4gIHN1bW1hcnlfdmFyaWFudDogICAgICAnQSByZXdyaXR0ZW4gdmVyc2lvbiBvZiB5b3VyIHByb2Zlc3Npb25hbCBzdW1tYXJ5LiBQcm9tb3Rpbmcgc3RvcmVzIGl0IGFzIGEgbmFtZWQgdmFyaWFudCBpbiB5b3VyIG1hc3RlciBDVi4nLFxuICBza2lsbF90eXBlX3VwZGF0ZTogICAgJ0hhcmQvc29mdCBza2lsbCBjbGFzc2lmaWNhdGlvbnMgeW91IGNoYW5nZWQgZHVyaW5nIHRoaXMgc2Vzc2lvbi4gUHJvbW90aW5nIHBlcnNpc3RzIHRoZSBuZXcgdHlwZSBzbyBpdCBpcyBub3QgcmUtY2xhc3NpZmllZCBvbiBldmVyeSBhcHBsaWNhdGlvbi4nLFxufTtcblxuY29uc3QgSEFSVkVTVF9TT1VSQ0VfQkFER0UgPSB7XG4gIG5ld19za2lsbDogICAgICAgICAgICc8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjc1ZW07YmFja2dyb3VuZDojZGJlYWZlO2NvbG9yOiMxZDRlZDg7Ym9yZGVyLXJhZGl1czo0cHg7cGFkZGluZzoxcHggNnB4O21hcmdpbi1sZWZ0OjZweDt3aGl0ZS1zcGFjZTpub3dyYXA7XCI+XHVEODNDXHVERDk1IEFkZGVkPC9zcGFuPicsXG4gIHNraWxsX2dhcF9jb25maXJtZWQ6ICc8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjc1ZW07YmFja2dyb3VuZDojZGNmY2U3O2NvbG9yOiMxNjY1MzQ7Ym9yZGVyLXJhZGl1czo0cHg7cGFkZGluZzoxcHggNnB4O21hcmdpbi1sZWZ0OjZweDt3aGl0ZS1zcGFjZTpub3dyYXA7XCI+XHUyNzA1IENvbmZpcm1lZDwvc3Bhbj4nLFxuICBza2lsbF90eXBlX3VwZGF0ZTogICAnPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC43NWVtO2JhY2tncm91bmQ6I2ZlZjljMztjb2xvcjojODU0ZDBlO2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6MXB4IDZweDttYXJnaW4tbGVmdDo2cHg7d2hpdGUtc3BhY2U6bm93cmFwO1wiPlx1RDgzQ1x1REZGN1x1RkUwRiBSZWNsYXNzaWZpZWQ8L3NwYW4+Jyxcbn07XG5cbmNvbnN0IFJFQ19DT05GSUcgPSB7XG4gIHByb21vdGU6IHsgbGFiZWw6ICdQcm9tb3RlJywgICAgICBpY29uOiAnXHUyQjA2XHVGRTBGJywgIGNvbG9yOiAnIzE2NjUzNCcsIGJnOiAnI2YwZmRmNCcsIHNvcnQ6IDAgfSxcbiAgc2tpcDogICAgeyBsYWJlbDogJ1NraXAnLCAgICAgICAgIGljb246ICdcdTIzRURcdUZFMEYnLCAgY29sb3I6ICcjOWEzNDEyJywgYmc6ICcjZmZmN2VkJywgc29ydDogMSB9LFxuICBudWxsOiAgICB7IGxhYmVsOiAnVW5hbmFseXplZCcsICAgaWNvbjogJ1x1Mjc1MycsICBjb2xvcjogJyM0YjU1NjMnLCBiZzogJyNmOWZhZmInLCBzb3J0OiAyIH0sXG59O1xuXG5jb25zdCBDT05GX0NPTkZJRyA9IHtcbiAgaGlnaDogICB7IGxhYmVsOiAnSGlnaCcsICAgY29sb3I6ICcjMTU4MDNkJywgYmc6ICcjZjBmZGY0Jywgc29ydDogMCB9LFxuICBtZWRpdW06IHsgbGFiZWw6ICdNZWRpdW0nLCBjb2xvcjogJyNiNDUzMDknLCBiZzogJyNmZmZiZWInLCBzb3J0OiAxIH0sXG4gIGxvdzogICAgeyBsYWJlbDogJ0xvdycsICAgIGNvbG9yOiAnI2I5MWMxYycsIGJnOiAnI2ZlZjJmMicsIHNvcnQ6IDIgfSxcbiAgbnVsbDogICB7IGxhYmVsOiAnJywgICAgICAgY29sb3I6ICcjNmI3MjgwJywgYmc6ICcjZjlmYWZiJywgc29ydDogMyB9LFxufTtcblxuLy8gXHUyNTAwXHUyNTAwIEdyb3VwaW5nIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBnZXREaXNwbGF5VHlwZShjYW5kaWRhdGUpIHtcbiAgcmV0dXJuIEhBUlZFU1RfVFlQRV9DT05GSUdbY2FuZGlkYXRlLnR5cGVdPy5kaXNwbGF5VHlwZSA/PyBjYW5kaWRhdGUudHlwZTtcbn1cblxuLyoqXG4gKiBHcm91cCBlbnJpY2hlZCBjYW5kaWRhdGVzIGludG8gYSBuZXN0ZWQgc3RydWN0dXJlOlxuICogICB7IGRpc3BsYXlUeXBlIFx1MjE5MiB7IHJlYyBcdTIxOTIgeyBjb25maWRlbmNlIFx1MjE5MiBbY2FuZGlkYXRlLCBcdTIwMjZdIH0gfSB9XG4gKi9cbmZ1bmN0aW9uIGdyb3VwQ2FuZGlkYXRlcyhlbnJpY2hlZCkge1xuICBjb25zdCBncm91cHMgPSB7fTtcbiAgZm9yIChjb25zdCBjIG9mIGVucmljaGVkKSB7XG4gICAgY29uc3QgZHQgICA9IGdldERpc3BsYXlUeXBlKGMpO1xuICAgIGNvbnN0IHJlYyAgPSBjLnJlY29tbWVuZGF0aW9uID8/ICdudWxsJztcbiAgICBjb25zdCBjb25mID0gYy5jb25maWRlbmNlICAgICA/PyAnbnVsbCc7XG4gICAgaWYgKCFncm91cHNbZHRdKSAgICAgICAgICAgICAgICBncm91cHNbZHRdICAgICAgID0ge307XG4gICAgaWYgKCFncm91cHNbZHRdW3JlY10pICAgICAgICAgICBncm91cHNbZHRdW3JlY10gID0ge307XG4gICAgaWYgKCFncm91cHNbZHRdW3JlY11bY29uZl0pICAgICBncm91cHNbZHRdW3JlY11bY29uZl0gPSBbXTtcbiAgICBncm91cHNbZHRdW3JlY11bY29uZl0ucHVzaChjKTtcbiAgfVxuICByZXR1cm4gZ3JvdXBzO1xufVxuXG5mdW5jdGlvbiBzb3J0ZWRLZXlzKG9iaiwgY29uZmlnTWFwKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhvYmopLnNvcnQoKGEsIGIpID0+IHtcbiAgICBjb25zdCBzYSA9IGNvbmZpZ01hcFthXT8uc29ydCA/PyA5OTtcbiAgICBjb25zdCBzYiA9IGNvbmZpZ01hcFtiXT8uc29ydCA/PyA5OTtcbiAgICByZXR1cm4gc2EgLSBzYjtcbiAgfSk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBQcmUtY2hlY2sgbG9naWMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4vLyBBbGwgaGFydmVzdCBpdGVtcyBzdGFydCB1bmNoZWNrZWQgXHUyMDE0IG1hc3RlciBDViB1cGRhdGVzIGFyZSBvcHQtaW4gb25seSAoVVMtQTExKS5cbi8vIEdyb3VwcyB3aXRoIGhpZ2gvbWVkaXVtIGNvbmZpZGVuY2UgcHJvbW90aW9ucyBhcmUgZXhwYW5kZWQgc28gY2FuZGlkYXRlcyBhcmVcbi8vIHByb21pbmVudCwgYnV0IG5vIGNoZWNrYm94IGlzIHByZS1zZWxlY3RlZC5cblxuZnVuY3Rpb24gc2hvdWxkUHJlQ2hlY2soX2NhbmRpZGF0ZSkge1xuICByZXR1cm4gZmFsc2U7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBDb2xsYXBzZSBkZWZhdWx0IGxvZ2ljIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiB0eXBlR3JvdXBFeHBhbmRlZChkdENhbmRpZGF0ZXMpIHtcbiAgcmV0dXJuIGR0Q2FuZGlkYXRlcy5zb21lKGMgPT4gYy5yZWNvbW1lbmRhdGlvbiA9PT0gJ3Byb21vdGUnICYmXG4gICAgKGMuY29uZmlkZW5jZSA9PT0gJ2hpZ2gnIHx8IGMuY29uZmlkZW5jZSA9PT0gJ21lZGl1bScpKTtcbn1cblxuZnVuY3Rpb24gcmVjR3JvdXBFeHBhbmRlZChyZWMsIGNvbmZDYW5kaWRhdGVzKSB7XG4gIGlmIChyZWMgIT09ICdwcm9tb3RlJykgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gY29uZkNhbmRpZGF0ZXMuc29tZShjID0+IGMuY29uZmlkZW5jZSA9PT0gJ2hpZ2gnIHx8IGMuY29uZmlkZW5jZSA9PT0gJ21lZGl1bScpO1xufVxuXG5mdW5jdGlvbiBjb25mVGllckV4cGFuZGVkKHJlYywgY29uZikge1xuICByZXR1cm4gcmVjID09PSAncHJvbW90ZScgJiYgKGNvbmYgPT09ICdoaWdoJyB8fCBjb25mID09PSAnbWVkaXVtJyk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBSZW5kZXJpbmcgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIHJlbmRlckNvbmZpZGVuY2VCYWRnZShjb25mKSB7XG4gIGNvbnN0IGNmZyA9IENPTkZfQ09ORklHW2NvbmZdID8/IENPTkZfQ09ORklHWydudWxsJ107XG4gIGlmICghY2ZnLmxhYmVsKSByZXR1cm4gJyc7XG4gIHJldHVybiBgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC43ZW07Zm9udC13ZWlnaHQ6NjAwO2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6MXB4IDZweDtiYWNrZ3JvdW5kOiR7Y2ZnLmJnfTtjb2xvcjoke2NmZy5jb2xvcn07Ym9yZGVyOjFweCBzb2xpZCAke2NmZy5jb2xvcn0zMDt3aGl0ZS1zcGFjZTpub3dyYXA7XCI+JHtlc2MoY2ZnLmxhYmVsKX08L3NwYW4+YDtcbn1cblxuZnVuY3Rpb24gcmVuZGVyUmVjb21tZW5kYXRpb25CYWRnZShyZWMpIHtcbiAgY29uc3QgY2ZnID0gUkVDX0NPTkZJR1tyZWNdID8/IFJFQ19DT05GSUdbJ251bGwnXTtcbiAgcmV0dXJuIGA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjc1ZW07Zm9udC13ZWlnaHQ6NjAwO2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6MnB4IDhweDtiYWNrZ3JvdW5kOiR7Y2ZnLmJnfTtjb2xvcjoke2NmZy5jb2xvcn07d2hpdGUtc3BhY2U6bm93cmFwO1wiPiR7Y2ZnLmljb259ICR7ZXNjKGNmZy5sYWJlbCl9PC9zcGFuPmA7XG59XG5cbmZ1bmN0aW9uIHJlbmRlckNhbmRpZGF0ZVJvdyhjLCBpZHgpIHtcbiAgY29uc3QgdHlwZUNmZyAgID0gSEFSVkVTVF9UWVBFX0NPTkZJR1tjLnR5cGVdID8/IHt9O1xuICBjb25zdCByZWNCYWRnZSAgPSBjLnJlY29tbWVuZGF0aW9uID8gcmVuZGVyUmVjb21tZW5kYXRpb25CYWRnZShjLnJlY29tbWVuZGF0aW9uKSA6ICcnO1xuICBjb25zdCBjb25mQmFkZ2UgPSBjLmNvbmZpZGVuY2UgPyByZW5kZXJDb25maWRlbmNlQmFkZ2UoYy5jb25maWRlbmNlKSA6ICcnO1xuICBjb25zdCBoYXNSZWFzb25pbmcgPSBjLmFuYWx5c2lzQXZhaWxhYmxlICYmIGMucmVhc29uaW5nO1xuXG4gIHJldHVybiByZW5kZXJQcm9wb3NhbFJvdyh7XG4gICAgaWQ6ICAgICAgICAgICAgICBjLmlkLFxuICAgIHR5cGVMYWJlbDogICAgICAgdHlwZUNmZy5sYWJlbCA/PyBjLnR5cGUsXG4gICAgc291cmNlQmFkZ2VIdG1sOiBIQVJWRVNUX1NPVVJDRV9CQURHRVtjLnR5cGVdID8/ICcnLFxuICAgIGxhYmVsOiAgICAgICAgICAgYy5sYWJlbCxcbiAgICBvcmlnaW5hbDogICAgICAgIGMub3JpZ2luYWwsXG4gICAgcHJvcG9zZWQ6ICAgICAgICBjLnByb3Bvc2VkLFxuICAgIGRldGFpbFRleHQ6ICAgICAgaGFzUmVhc29uaW5nID8gYy5yZWFzb25pbmcgOiBudWxsLFxuICAgIGJhZGdlc0h0bWw6ICAgICAgIGAke3JlY0JhZGdlfSR7Y29uZkJhZGdlfWAsXG4gICAgY2hlY2tlZDogICAgICAgICBzaG91bGRQcmVDaGVjayhjKSxcbiAgfSwge1xuICAgIGlkUHJlZml4OiAgICAgICAgICdoYXJ2ZXN0JyxcbiAgICBjaGVja2JveERhdGFBdHRyOiAnaGFydmVzdC1pZCcsXG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZW5kZXJDb25maWRlbmNlVGllcihyZWMsIGNvbmYsIGNhbmRpZGF0ZXMpIHtcbiAgY29uc3QgY2ZnICAgICAgPSBDT05GX0NPTkZJR1tjb25mXSA/PyBDT05GX0NPTkZJR1snbnVsbCddO1xuICBjb25zdCBleHBhbmRlZCA9IGNvbmZUaWVyRXhwYW5kZWQocmVjLCBjb25mKTtcbiAgY29uc3QgdGllcklkICAgPSBgaGFydmVzdC1jb25mLSR7cmVjfS0ke2NvbmZ9LSR7RGF0ZS5ub3coKX1gO1xuICBjb25zdCBjb3VudCAgICA9IGNhbmRpZGF0ZXMubGVuZ3RoO1xuXG4gIGlmICghY2ZnLmxhYmVsKSB7XG4gICAgLy8gTm8tYW5hbHlzaXMgdGllciBcdTIwMTQgcmVuZGVyIHJvd3MgZGlyZWN0bHkgd2l0aG91dCBhIHN1Yi1oZWFkZXJcbiAgICByZXR1cm4gY2FuZGlkYXRlcy5tYXAoKGMsIGkpID0+IHJlbmRlckNhbmRpZGF0ZVJvdyhjLCBpKSkuam9pbignJyk7XG4gIH1cblxuICBjb25zdCB0b2dnbGVJY29uID0gZXhwYW5kZWQgPyAnXHUyNUJFJyA6ICdcdTI1QjgnO1xuICBjb25zdCBoZWFkZXJIdG1sID0gYFxuICAgIDx0ciBjbGFzcz1cImhhcnZlc3QtY29uZi1oZWFkZXJcIiBzdHlsZT1cImN1cnNvcjpwb2ludGVyO2JhY2tncm91bmQ6I2ZhZmFmYTtcIiBvbmNsaWNrPVwidG9nZ2xlSGFydmVzdFNlY3Rpb24oJyR7dGllcklkfScpXCI+XG4gICAgICA8dGQgY29sc3Bhbj1cIjJcIiBzdHlsZT1cInBhZGRpbmc6NnB4IDEycHggNnB4IDM2cHg7Zm9udC1zaXplOjAuOGVtO2NvbG9yOiR7Y2ZnLmNvbG9yfTtmb250LXdlaWdodDo2MDA7XCI+XG4gICAgICAgIDxzcGFuIGlkPVwiJHt0aWVySWR9LWljb25cIj4ke3RvZ2dsZUljb259PC9zcGFuPlxuICAgICAgICAke2VzYyhjZmcubGFiZWwpfSBjb25maWRlbmNlXG4gICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtmb250LXdlaWdodDo0MDA7Y29sb3I6IzljYTNhZjttYXJnaW4tbGVmdDo2cHg7XCI+KCR7Y291bnR9KTwvc3Bhbj5cbiAgICAgIDwvdGQ+XG4gICAgPC90cj5cbiAgICA8dGJvZHkgaWQ9XCIke3RpZXJJZH1cIiBzdHlsZT1cIiR7ZXhwYW5kZWQgPyAnJyA6ICdkaXNwbGF5Om5vbmU7J31cIj5cbiAgICAgICR7Y2FuZGlkYXRlcy5tYXAoKGMsIGkpID0+IHJlbmRlckNhbmRpZGF0ZVJvdyhjLCBpKSkuam9pbignJyl9XG4gICAgPC90Ym9keT5gO1xuICByZXR1cm4gaGVhZGVySHRtbDtcbn1cblxuZnVuY3Rpb24gcmVuZGVyUmVjR3JvdXAoZHQsIHJlYywgY29uZk1hcCkge1xuICBjb25zdCBjZmcgPSBSRUNfQ09ORklHW3JlY10gPz8gUkVDX0NPTkZJR1snbnVsbCddO1xuICBjb25zdCBhbGxDYW5kcyA9IE9iamVjdC52YWx1ZXMoY29uZk1hcCkuZmxhdCgpO1xuICBjb25zdCBleHBhbmRlZCA9IHJlY0dyb3VwRXhwYW5kZWQocmVjLCBhbGxDYW5kcyk7XG4gIGNvbnN0IGdyb3VwSWQgID0gYGhhcnZlc3QtcmVjLSR7ZHR9LSR7cmVjfS0ke0RhdGUubm93KCl9YDtcbiAgY29uc3QgY291bnQgICAgPSBhbGxDYW5kcy5sZW5ndGg7XG5cbiAgY29uc3QgY29uZnMgICAgPSBzb3J0ZWRLZXlzKGNvbmZNYXAsIENPTkZfQ09ORklHKTtcbiAgY29uc3QgaGFzTXVsdGlwbGVDb25mcyA9IGNvbmZzLmxlbmd0aCA+IDEgfHwgKGNvbmZzLmxlbmd0aCA9PT0gMSAmJiBDT05GX0NPTkZJR1tjb25mc1swXV0/LmxhYmVsKTtcblxuICBjb25zdCBpbm5lclJvd3MgPSBjb25mcy5tYXAoY29uZiA9PiByZW5kZXJDb25maWRlbmNlVGllcihyZWMsIGNvbmYsIGNvbmZNYXBbY29uZl0pKS5qb2luKCcnKTtcblxuICBjb25zdCB0b2dnbGVJY29uID0gZXhwYW5kZWQgPyAnXHUyNUJFJyA6ICdcdTI1QjgnO1xuICByZXR1cm4gYFxuICAgIDx0ciBjbGFzcz1cImhhcnZlc3QtcmVjLWhlYWRlclwiIHN0eWxlPVwiY3Vyc29yOnBvaW50ZXI7YmFja2dyb3VuZDoke2NmZy5iZ307XCIgb25jbGljaz1cInRvZ2dsZUhhcnZlc3RTZWN0aW9uKCcke2dyb3VwSWR9JylcIj5cbiAgICAgIDx0ZCBjb2xzcGFuPVwiMlwiIHN0eWxlPVwicGFkZGluZzo4cHggMTJweCA4cHggMjRweDtmb250LXNpemU6MC44NWVtO2NvbG9yOiR7Y2ZnLmNvbG9yfTtmb250LXdlaWdodDo3MDA7XCI+XG4gICAgICAgIDxzcGFuIGlkPVwiJHtncm91cElkfS1pY29uXCI+JHt0b2dnbGVJY29ufTwvc3Bhbj5cbiAgICAgICAgJHtjZmcuaWNvbn0gJHtlc2MoY2ZnLmxhYmVsKX1cbiAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2ZvbnQtd2VpZ2h0OjQwMDtjb2xvcjojOWNhM2FmO21hcmdpbi1sZWZ0OjZweDtcIj4oJHtjb3VudH0pPC9zcGFuPlxuICAgICAgPC90ZD5cbiAgICA8L3RyPlxuICAgIDx0Ym9keSBpZD1cIiR7Z3JvdXBJZH1cIiBzdHlsZT1cIiR7ZXhwYW5kZWQgPyAnJyA6ICdkaXNwbGF5Om5vbmU7J31cIj5cbiAgICAgICR7aGFzTXVsdGlwbGVDb25mcyA/IGlubmVyUm93cyA6IGFsbENhbmRzLm1hcCgoYywgaSkgPT4gcmVuZGVyQ2FuZGlkYXRlUm93KGMsIGkpKS5qb2luKCcnKX1cbiAgICA8L3Rib2R5PmA7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclR5cGVHcm91cChkdCwgcmVjTWFwLCBhbGxEdENhbmRpZGF0ZXMpIHtcbiAgY29uc3QgY2ZnICAgICAgPSBIQVJWRVNUX1RZUEVfQ09ORklHW2R0XSA/PyB7IGxhYmVsOiBkdCwgaWNvbjogJ1x1RDgzRFx1RENDQicsIHNvcnQ6IDk5IH07XG4gIGNvbnN0IGV4cGFuZGVkID0gdHlwZUdyb3VwRXhwYW5kZWQoYWxsRHRDYW5kaWRhdGVzKTtcbiAgY29uc3QgZ3JvdXBJZCAgPSBgaGFydmVzdC10eXBlLSR7ZHR9LSR7RGF0ZS5ub3coKX1gO1xuICBjb25zdCBjb3VudCAgICA9IGFsbER0Q2FuZGlkYXRlcy5sZW5ndGg7XG4gIGNvbnN0IGRlc2MgICAgID0gSEFSVkVTVF9UWVBFX0RFU0NSSVBUSU9OU1tkdF0gPz8gJyc7XG5cbiAgY29uc3QgcmVjcyAgICAgICAgPSBzb3J0ZWRLZXlzKHJlY01hcCwgUkVDX0NPTkZJRyk7XG4gIGNvbnN0IGhhc011bHRpcGxlUmVjcyA9IHJlY3MubGVuZ3RoID4gMTtcblxuICBjb25zdCBpbm5lckh0bWwgPSByZWNzLm1hcChyZWMgPT4ge1xuICAgIGlmICghaGFzTXVsdGlwbGVSZWNzKSB7XG4gICAgICAvLyBTdXBwcmVzcyB0aGUgcmVjLWxldmVsIGhlYWRlcjsgcmVuZGVyIGNvbmZpZGVuY2UgdGllcnMgZGlyZWN0bHlcbiAgICAgIGNvbnN0IGNvbmZNYXAgID0gcmVjTWFwW3JlY107XG4gICAgICBjb25zdCBjb25mcyAgICA9IHNvcnRlZEtleXMoY29uZk1hcCwgQ09ORl9DT05GSUcpO1xuICAgICAgY29uc3QgaGFzQ29uZnMgPSBjb25mcy5sZW5ndGggPiAxIHx8IChjb25mcy5sZW5ndGggPT09IDEgJiYgQ09ORl9DT05GSUdbY29uZnNbMF1dPy5sYWJlbCk7XG4gICAgICByZXR1cm4gaGFzQ29uZnNcbiAgICAgICAgPyBjb25mcy5tYXAoY29uZiA9PiByZW5kZXJDb25maWRlbmNlVGllcihyZWMsIGNvbmYsIGNvbmZNYXBbY29uZl0pKS5qb2luKCcnKVxuICAgICAgICA6IGNvbmZNYXBbY29uZnNbMF1dLm1hcCgoYywgaSkgPT4gcmVuZGVyQ2FuZGlkYXRlUm93KGMsIGkpKS5qb2luKCcnKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlbmRlclJlY0dyb3VwKGR0LCByZWMsIHJlY01hcFtyZWNdKTtcbiAgfSkuam9pbignJyk7XG5cbiAgY29uc3QgdG9nZ2xlSWNvbiA9IGV4cGFuZGVkID8gJ1x1MjVCRScgOiAnXHUyNUI4JztcbiAgcmV0dXJuIGBcbiAgICA8ZGl2IGNsYXNzPVwiaGFydmVzdC10eXBlLXNlY3Rpb25cIiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MjRweDtib3JkZXI6MXB4IHNvbGlkICNlMmU4ZjA7Ym9yZGVyLXJhZGl1czo4cHg7b3ZlcmZsb3c6aGlkZGVuO1wiPlxuICAgICAgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2Y4ZmFmYztwYWRkaW5nOjEycHggMTZweDtjdXJzb3I6cG9pbnRlcjtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDoxMHB4O2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNlMmU4ZjA7XCJcbiAgICAgICAgICAgb25jbGljaz1cInRvZ2dsZUhhcnZlc3RTZWN0aW9uKCcke2dyb3VwSWR9JylcIj5cbiAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MS4yNWVtO1wiPiR7Y2ZnLmljb259PC9zcGFuPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDoxO1wiPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDo3MDA7Y29sb3I6IzBmMTcyYTtmb250LXNpemU6MC45NWVtO1wiPlxuICAgICAgICAgICAgPHNwYW4gaWQ9XCIke2dyb3VwSWR9LWljb25cIj4ke3RvZ2dsZUljb259PC9zcGFuPlxuICAgICAgICAgICAgJHtlc2MoY2ZnLmxhYmVsKX1cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjAuODJlbTtmb250LXdlaWdodDo0MDA7Y29sb3I6Izk0YTNiODttYXJnaW4tbGVmdDo2cHg7XCI+KCR7Y291bnR9KTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAke2Rlc2MgPyBgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjc4ZW07Y29sb3I6IzY0NzQ4YjttYXJnaW4tdG9wOjJweDtcIj4ke2VzYyhkZXNjKX08L2Rpdj5gIDogJyd9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGlkPVwiJHtncm91cElkfVwiIHN0eWxlPVwiJHtleHBhbmRlZCA/ICcnIDogJ2Rpc3BsYXk6bm9uZTsnfVwiPlxuICAgICAgICA8dGFibGUgc3R5bGU9XCJ3aWR0aDoxMDAlO2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTtcIj5cbiAgICAgICAgICAke2lubmVySHRtbH1cbiAgICAgICAgPC90YWJsZT5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PmA7XG59XG5cbmZ1bmN0aW9uIHJlbmRlckhhcnZlc3RUYWJIdG1sKGVucmljaGVkLCBhbmFseXNpc09rLCBhbmFseXNpc0Vycm9yKSB7XG4gIGNvbnN0IGdyb3VwcyA9IGdyb3VwQ2FuZGlkYXRlcyhlbnJpY2hlZCk7XG4gIGNvbnN0IGR0S2V5cyA9IHNvcnRlZEtleXMoZ3JvdXBzLCBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMoSEFSVkVTVF9UWVBFX0NPTkZJRykubWFwKChbaywgdl0pID0+IFt2LmRpc3BsYXlUeXBlLCB2XSlcbiAgKSk7XG5cbiAgY29uc3QgdG90YWxDb3VudCA9IGVucmljaGVkLmxlbmd0aDtcblxuICBjb25zdCBhbmFseXNpc1dhcm5pbmcgPSAhYW5hbHlzaXNPa1xuICAgID8gYDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZmZiZWI7Ym9yZGVyOjFweCBzb2xpZCAjZmNkMzRkO2JvcmRlci1yYWRpdXM6NnB4O3BhZGRpbmc6MTBweCAxNHB4O21hcmdpbi1ib3R0b206MTZweDtmb250LXNpemU6MC44N2VtO2NvbG9yOiM5MjQwMGU7XCI+XG4gICAgICAgIFx1MjZBMFx1RkUwRiBMTE0gYW5hbHlzaXMgdW5hdmFpbGFibGUke2FuYWx5c2lzRXJyb3IgPyBgOiAke2VzYyhhbmFseXNpc0Vycm9yKX1gIDogJyd9LiBDaGVja2JveGVzIGFyZSB1bmNoZWNrZWQgXHUyMDE0IHJldmlldyBtYW51YWxseS5cbiAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPVwicmVmcmVzaEhhcnZlc3RBbmFseXNpcygpXCIgc3R5bGU9XCJtYXJnaW4tbGVmdDoxMHB4O2ZvbnQtc2l6ZTowLjg1ZW07cGFkZGluZzoycHggMTBweDtib3JkZXI6MXB4IHNvbGlkICNkOTc3MDY7Ym9yZGVyLXJhZGl1czo0cHg7YmFja2dyb3VuZDp3aGl0ZTtjb2xvcjojYjQ1MzA5O2N1cnNvcjpwb2ludGVyO1wiPlJldHJ5IGFuYWx5c2lzPC9idXR0b24+XG4gICAgICA8L2Rpdj5gXG4gICAgOiAnJztcblxuICBjb25zdCBzZWN0aW9uc0h0bWwgPSBkdEtleXMubWFwKGR0ID0+IHtcbiAgICBjb25zdCByZWNNYXAgICAgICA9IGdyb3Vwc1tkdF07XG4gICAgY29uc3QgYWxsRHRDYW5kcyAgPSBPYmplY3QudmFsdWVzKHJlY01hcCkuZmxhdE1hcChjb25mTWFwID0+IE9iamVjdC52YWx1ZXMoY29uZk1hcCkuZmxhdCgpKTtcbiAgICByZXR1cm4gcmVuZGVyVHlwZUdyb3VwKGR0LCByZWNNYXAsIGFsbER0Q2FuZHMpO1xuICB9KS5qb2luKCcnKTtcblxuICByZXR1cm4gYFxuICAgIDxoMT5cdUQ4M0NcdURGM0UgSGFydmVzdCBJbXByb3ZlbWVudHM8L2gxPlxuICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDttYXJnaW4tYm90dG9tOjhweDtcIj5cbiAgICAgIFJldmlldyBMTE0tc2NvcmVkIGNhbmRpZGF0ZXMgZm9yIHByb21vdGlvbiB0byB5b3VyIG1hc3RlciBDVi5cbiAgICAgIENoZWNrIHRoZSBpdGVtcyB5b3Ugd2FudCB0byBhcHBseSAoJHt0b3RhbENvdW50fSBjYW5kaWRhdGUke3RvdGFsQ291bnQgPT09IDEgPyAnJyA6ICdzJ30gZm91bmQpLlxuICAgIDwvcD5cbiAgICAke2FuYWx5c2lzV2FybmluZ31cbiAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDoxMHB4O2FsaWduLWl0ZW1zOmNlbnRlcjttYXJnaW4tYm90dG9tOjIwcHg7ZmxleC13cmFwOndyYXA7XCI+XG4gICAgICA8YnV0dG9uIGlkPVwiaGFydmVzdC1hcHBseS1idG5cIiBvbmNsaWNrPVwiYXBwbHlIYXJ2ZXN0U2VsZWN0aW9ucygpXCJcbiAgICAgICAgc3R5bGU9XCJwYWRkaW5nOjEwcHggMjRweDtmb250LXNpemU6MWVtO2ZvbnQtd2VpZ2h0OjYwMDtjdXJzb3I6cG9pbnRlcjtiYWNrZ3JvdW5kOiMxNmEzNGE7Y29sb3I6d2hpdGU7Ym9yZGVyOm5vbmU7Ym9yZGVyLXJhZGl1czo2cHg7XCI+XG4gICAgICAgIFx1MjcwNSBBcHBseSBTZWxlY3RlZCB0byBNYXN0ZXIgQ1ZcbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiBvbmNsaWNrPVwicmVmcmVzaEhhcnZlc3RBbmFseXNpcygpXCJcbiAgICAgICAgc3R5bGU9XCJwYWRkaW5nOjEwcHggMThweDtmb250LXNpemU6MC45ZW07Y3Vyc29yOnBvaW50ZXI7YmFja2dyb3VuZDp3aGl0ZTtjb2xvcjojNDc1NTY5O2JvcmRlcjoxcHggc29saWQgI2NiZDVlMTtib3JkZXItcmFkaXVzOjZweDtcIj5cbiAgICAgICAgXHVEODNEXHVERDA0IFJlLWFuYWx5c2VcbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2NvbG9yOiM5NGEzYjg7XCI+XG4gICAgICAgICR7dG90YWxDb3VudH0gY2FuZGlkYXRlJHt0b3RhbENvdW50ICE9PSAxID8gJ3MnIDogJyd9XG4gICAgICA8L3NwYW4+XG4gICAgPC9kaXY+XG4gICAgJHtzZWN0aW9uc0h0bWx9XG4gICAgPGRpdiBpZD1cImhhcnZlc3QtcmVzdWx0XCIgc3R5bGU9XCJtYXJnaW4tdG9wOjIwcHg7XCI+PC9kaXY+YDtcbn1cblxuZnVuY3Rpb24gcmVuZGVyRW1wdHlTdGF0ZUh0bWwoKSB7XG4gIHJldHVybiBgXG4gICAgPGgxPlx1RDgzQ1x1REYzRSBIYXJ2ZXN0IEltcHJvdmVtZW50czwvaDE+XG4gICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO1wiPk5vIGhhcnZlc3QgY2FuZGlkYXRlcyBmb3VuZCBmb3IgdGhpcyBzZXNzaW9uLjwvcD5cbiAgICA8cCBzdHlsZT1cImNvbG9yOiM5NGEzYjg7Zm9udC1zaXplOjAuOWVtO1wiPlxuICAgICAgQ2FuZGlkYXRlcyBhcmUgZ2VuZXJhdGVkIGZyb20gYXBwcm92ZWQgcmV3cml0ZXMsIHNraWxscyBhZGRlZCBkdXJpbmcgcmV2aWV3LFxuICAgICAgYW5kIHN1bW1hcnkgdmFyaWFudHMgY3JlYXRlZCBkdXJpbmcgdGhlIHNlc3Npb24uXG4gICAgPC9wPmA7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBBUEkgY2FsbHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoQ2FuZGlkYXRlcygpIHtcbiAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL2hhcnZlc3QvY2FuZGlkYXRlcycpO1xuICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgcmV0dXJuIGRhdGE7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoQW5hbHlzaXMoZm9yY2VSZWZyZXNoID0gZmFsc2UpIHtcbiAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL2hhcnZlc3QvYW5hbHl6ZScsIHtcbiAgICBtZXRob2Q6ICAnUE9TVCcsXG4gICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgYm9keTogICAgSlNPTi5zdHJpbmdpZnkoeyBmb3JjZV9yZWZyZXNoOiBmb3JjZVJlZnJlc2ggfSksXG4gIH0pO1xuICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgcmV0dXJuIGRhdGE7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBUb2dnbGUgaGVscGVycyAoY2FsbGVkIGJ5IGlubGluZSBvbmNsaWNrKSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gdG9nZ2xlSGFydmVzdFNlY3Rpb24oaWQpIHtcbiAgY29uc3QgZWwgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgY29uc3QgaWNvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2lkfS1pY29uYCk7XG4gIGlmICghZWwpIHJldHVybjtcbiAgY29uc3QgaGlkZGVuID0gZWwuc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnO1xuICBlbC5zdHlsZS5kaXNwbGF5ID0gaGlkZGVuID8gJycgOiAnbm9uZSc7XG4gIGlmIChpY29uKSBpY29uLnRleHRDb250ZW50ID0gaGlkZGVuID8gJ1x1MjVCRScgOiAnXHUyNUI4Jztcbn1cblxuLy8gXHUyNTAwXHUyNTAwIE1haW4gZW50cnkgcG9pbnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBwb3B1bGF0ZUhhcnZlc3RUYWIoKSB7XG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9jdW1lbnQtY29udGVudCcpO1xuICBpZiAoIWNvbnRlbnQpIHJldHVybjtcblxuICBjb250ZW50LmlubmVySFRNTCA9IGBcbiAgICA8aDE+XHVEODNDXHVERjNFIEhhcnZlc3QgSW1wcm92ZW1lbnRzPC9oMT5cbiAgICA8ZGl2IHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7cGFkZGluZzo0MHB4O1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImxvYWRpbmctc3Bpbm5lclwiPjwvZGl2PlxuICAgICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO21hcmdpbi10b3A6MTJweDtcIj5Mb2FkaW5nIGNhbmRpZGF0ZXMgYW5kIHJ1bm5pbmcgTExNIGFuYWx5c2lzXHUyMDI2PC9wPlxuICAgIDwvZGl2PmA7XG5cbiAgbGV0IGNhbmRpZGF0ZXMgPSBbXTtcbiAgbGV0IGFuYWx5c2lzT2sgPSBmYWxzZTtcbiAgbGV0IGFuYWx5c2VzICAgPSBbXTtcbiAgbGV0IGFuYWx5c2lzRXJyb3IgPSBudWxsO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgY2FuZERhdGEgPSBhd2FpdCBmZXRjaENhbmRpZGF0ZXMoKTtcbiAgICBpZiAoIWNhbmREYXRhLm9rKSB7XG4gICAgICBjb250ZW50LmlubmVySFRNTCA9IGA8aDE+XHVEODNDXHVERjNFIEhhcnZlc3QgSW1wcm92ZW1lbnRzPC9oMT48cCBjbGFzcz1cImVycm9yLW1lc3NhZ2VcIj5GYWlsZWQgdG8gbG9hZCBjYW5kaWRhdGVzOiAke2VzYyhjYW5kRGF0YS5lcnJvciB8fCAnVW5rbm93biBlcnJvcicpfTwvcD5gO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjYW5kaWRhdGVzID0gY2FuZERhdGEuY2FuZGlkYXRlcyB8fCBbXTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLmVycm9yKCdwb3B1bGF0ZUhhcnZlc3RUYWI6IGNhbmRpZGF0ZXMgZmV0Y2ggZmFpbGVkJywgZXJyKTtcbiAgICBjb250ZW50LmlubmVySFRNTCA9IGA8aDE+XHVEODNDXHVERjNFIEhhcnZlc3QgSW1wcm92ZW1lbnRzPC9oMT48cCBjbGFzcz1cImVycm9yLW1lc3NhZ2VcIj5OZXR3b3JrIGVycm9yIGxvYWRpbmcgY2FuZGlkYXRlcy48L3A+YDtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoY2FuZGlkYXRlcy5sZW5ndGggPT09IDApIHtcbiAgICBjb250ZW50LmlubmVySFRNTCA9IHJlbmRlckVtcHR5U3RhdGVIdG1sKCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBhbmFseXNpc0RhdGEgPSBhd2FpdCBmZXRjaEFuYWx5c2lzKGZhbHNlKTtcbiAgICBpZiAoYW5hbHlzaXNEYXRhLm9rKSB7XG4gICAgICBhbmFseXNpc09rID0gdHJ1ZTtcbiAgICAgIGFuYWx5c2VzICAgPSBhbmFseXNpc0RhdGEuYW5hbHlzZXMgfHwgW107XG4gICAgfSBlbHNlIHtcbiAgICAgIGFuYWx5c2lzRXJyb3IgPSBhbmFseXNpc0RhdGEuZXJyb3IgfHwgJ0FuYWx5c2lzIGZhaWxlZCc7XG4gICAgICBsb2cud2FybigncG9wdWxhdGVIYXJ2ZXN0VGFiOiBhbmFseXNpcyBub3Qgb2snLCBhbmFseXNpc0Vycm9yKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy5lcnJvcigncG9wdWxhdGVIYXJ2ZXN0VGFiOiBhbmFseXNpcyBmZXRjaCBmYWlsZWQnLCBlcnIpO1xuICAgIGFuYWx5c2lzRXJyb3IgPSBlcnIubWVzc2FnZTtcbiAgfVxuXG4gIGNvbnN0IGFuYWx5c2VzQnlJZCA9IE9iamVjdC5mcm9tRW50cmllcyhhbmFseXNlcy5tYXAoYSA9PiBbYS5pZCwgYV0pKTtcbiAgY29uc3QgZW5yaWNoZWQgPSBjYW5kaWRhdGVzLm1hcChjID0+ICh7XG4gICAgLi4uYyxcbiAgICByZWNvbW1lbmRhdGlvbjogICAgYW5hbHlzZXNCeUlkW2MuaWRdPy5yZWNvbW1lbmRhdGlvbiA/PyBudWxsLFxuICAgIGNvbmZpZGVuY2U6ICAgICAgICBhbmFseXNlc0J5SWRbYy5pZF0/LmNvbmZpZGVuY2UgICAgID8/IG51bGwsXG4gICAgcmVhc29uaW5nOiAgICAgICAgIGFuYWx5c2VzQnlJZFtjLmlkXT8ucmVhc29uaW5nICAgICAgPz8gbnVsbCxcbiAgICBhbmFseXNpc0F2YWlsYWJsZTogYW5hbHlzaXNPayxcbiAgfSkpO1xuXG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gcmVuZGVySGFydmVzdFRhYkh0bWwoZW5yaWNoZWQsIGFuYWx5c2lzT2ssIGFuYWx5c2lzRXJyb3IpO1xuICBhdHRhY2hQcm9wb3NhbFJvd0xpc3RlbmVycyhjb250ZW50LCAnaGFydmVzdCcpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWZyZXNoSGFydmVzdEFuYWx5c2lzKCkge1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgaWYgKCFjb250ZW50KSByZXR1cm47XG5cbiAgLy8gU2hvdyBzcGlubmVyIGlubGluZSB3aGlsZSByZS1mZXRjaGluZ1xuICBjb25zdCBhcHBseUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoYXJ2ZXN0LWFwcGx5LWJ0bicpO1xuICBpZiAoYXBwbHlCdG4pIGFwcGx5QnRuLmRpc2FibGVkID0gdHJ1ZTtcblxuICAvLyBSZS1ydW4gZnVsbCBwb3B1bGF0ZSB3aXRoIGZvcmNlIHJlZnJlc2hcbiAgdHJ5IHtcbiAgICBjb25zdCBjYW5kRGF0YSA9IGF3YWl0IGZldGNoQ2FuZGlkYXRlcygpO1xuICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSAoY2FuZERhdGEub2sgJiYgY2FuZERhdGEuY2FuZGlkYXRlcykgPyBjYW5kRGF0YS5jYW5kaWRhdGVzIDogW107XG5cbiAgICBpZiAoY2FuZGlkYXRlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gcmVuZGVyRW1wdHlTdGF0ZUh0bWwoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgYW5hbHlzaXNPayA9IGZhbHNlO1xuICAgIGxldCBhbmFseXNlcyAgID0gW107XG4gICAgbGV0IGFuYWx5c2lzRXJyb3IgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBhbmFseXNpc0RhdGEgPSBhd2FpdCBmZXRjaEFuYWx5c2lzKHRydWUpO1xuICAgICAgaWYgKGFuYWx5c2lzRGF0YS5vaykge1xuICAgICAgICBhbmFseXNpc09rID0gdHJ1ZTtcbiAgICAgICAgYW5hbHlzZXMgICA9IGFuYWx5c2lzRGF0YS5hbmFseXNlcyB8fCBbXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFuYWx5c2lzRXJyb3IgPSBhbmFseXNpc0RhdGEuZXJyb3IgfHwgJ0FuYWx5c2lzIGZhaWxlZCc7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBhbmFseXNpc0Vycm9yID0gZXJyLm1lc3NhZ2U7XG4gICAgfVxuXG4gICAgY29uc3QgYW5hbHlzZXNCeUlkID0gT2JqZWN0LmZyb21FbnRyaWVzKGFuYWx5c2VzLm1hcChhID0+IFthLmlkLCBhXSkpO1xuICAgIGNvbnN0IGVucmljaGVkID0gY2FuZGlkYXRlcy5tYXAoYyA9PiAoe1xuICAgICAgLi4uYyxcbiAgICAgIHJlY29tbWVuZGF0aW9uOiAgICBhbmFseXNlc0J5SWRbYy5pZF0/LnJlY29tbWVuZGF0aW9uID8/IG51bGwsXG4gICAgICBjb25maWRlbmNlOiAgICAgICAgYW5hbHlzZXNCeUlkW2MuaWRdPy5jb25maWRlbmNlICAgICA/PyBudWxsLFxuICAgICAgcmVhc29uaW5nOiAgICAgICAgIGFuYWx5c2VzQnlJZFtjLmlkXT8ucmVhc29uaW5nICAgICAgPz8gbnVsbCxcbiAgICAgIGFuYWx5c2lzQXZhaWxhYmxlOiBhbmFseXNpc09rLFxuICAgIH0pKTtcblxuICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gcmVuZGVySGFydmVzdFRhYkh0bWwoZW5yaWNoZWQsIGFuYWx5c2lzT2ssIGFuYWx5c2lzRXJyb3IpO1xuICAgIGF0dGFjaFByb3Bvc2FsUm93TGlzdGVuZXJzKGNvbnRlbnQsICdoYXJ2ZXN0Jyk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy5lcnJvcigncmVmcmVzaEhhcnZlc3RBbmFseXNpczogZmFpbGVkJywgZXJyKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBhcHBseUhhcnZlc3RTZWxlY3Rpb25zKCkge1xuICBjb25zdCBjaGVja2JveGVzICA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W2RhdGEtaGFydmVzdC1pZF06Y2hlY2tlZCcpO1xuICBjb25zdCBzZWxlY3RlZElkcyA9IEFycmF5LmZyb20oY2hlY2tib3hlcykubWFwKGNiID0+IGNiLmRhdGFzZXQuaGFydmVzdElkKTtcbiAgY29uc3QgcmVzdWx0RGl2ICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGFydmVzdC1yZXN1bHQnKTtcbiAgY29uc3QgYXBwbHlCdG4gICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGFydmVzdC1hcHBseS1idG4nKTtcblxuICBpZiAoc2VsZWN0ZWRJZHMubGVuZ3RoID09PSAwKSB7XG4gICAgaWYgKHJlc3VsdERpdikgcmVzdWx0RGl2LmlubmVySFRNTCA9ICc8cCBzdHlsZT1cImNvbG9yOiNiNDUzMDk7XCI+Tm8gaXRlbXMgc2VsZWN0ZWQuPC9wPic7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgKHR5cGVvZiBzaG93Q29uZmlybU1vZGFsID09PSAnZnVuY3Rpb24nXG4gICAgPyBzaG93Q29uZmlybU1vZGFsKFxuICAgICAgICBgUHJvbW90ZSAke3NlbGVjdGVkSWRzLmxlbmd0aH0gaXRlbSR7c2VsZWN0ZWRJZHMubGVuZ3RoICE9PSAxID8gJ3MnIDogJyd9IHRvIG1hc3RlciBDVj9gLFxuICAgICAgICAnVGhpcyB3aWxsIHBlcm1hbmVudGx5IHdyaXRlIGNoYW5nZXMgdG8geW91ciBNYXN0ZXJfQ1ZfRGF0YS5qc29uLiBBIGJhY2t1cCB3aWxsIGJlIGNyZWF0ZWQgZmlyc3QuJyxcbiAgICAgIClcbiAgICA6IFByb21pc2UucmVzb2x2ZSh3aW5kb3cuY29uZmlybShgUHJvbW90ZSAke3NlbGVjdGVkSWRzLmxlbmd0aH0gaXRlbShzKSB0byBtYXN0ZXIgQ1Y/XFxuXFxuVGhpcyB3aWxsIHBlcm1hbmVudGx5IHdyaXRlIGNoYW5nZXMgdG8geW91ciBNYXN0ZXJfQ1ZfRGF0YS5qc29uLmApKSk7XG5cbiAgaWYgKCFjb25maXJtZWQpIHJldHVybjtcblxuICBpZiAoYXBwbHlCdG4pIHsgYXBwbHlCdG4uZGlzYWJsZWQgPSB0cnVlOyBhcHBseUJ0bi50ZXh0Q29udGVudCA9ICdBcHBseWluZ1x1MjAyNic7IH1cbiAgaWYgKHJlc3VsdERpdikgcmVzdWx0RGl2LmlubmVySFRNTCA9ICcnO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL2hhcnZlc3QvYXBwbHknLCB7XG4gICAgICBtZXRob2Q6ICAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6ICAgIEpTT04uc3RyaW5naWZ5KHsgc2VsZWN0ZWRfaWRzOiBzZWxlY3RlZElkcyB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcblxuICAgIGlmICghZGF0YS5vaykge1xuICAgICAgaWYgKHJlc3VsdERpdikgcmVzdWx0RGl2LmlubmVySFRNTCA9IGA8cCBjbGFzcz1cImVycm9yLW1lc3NhZ2VcIj5BcHBseSBmYWlsZWQ6ICR7ZXNjKGRhdGEuZXJyb3IgfHwgJ1Vua25vd24gZXJyb3InKX08L3A+YDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB3cml0dGVuQ291bnQgPSBkYXRhLndyaXR0ZW5fY291bnQgPz8gMDtcbiAgICBjb25zdCBjb21taXRIYXNoICAgPSBkYXRhLmNvbW1pdF9oYXNoICAgPyBgIChjb21taXQgJHtlc2MoZGF0YS5jb21taXRfaGFzaCl9KWAgOiAnJztcbiAgICBjb25zdCBiYWNrdXBOb3RlICAgPSBkYXRhLmJhY2t1cF9wYXRoICAgPyBgIEJhY2t1cCBzYXZlZCB0byA8Y29kZT4ke2VzYyhkYXRhLmJhY2t1cF9wYXRoKX08L2NvZGU+LmAgOiAnJztcbiAgICBjb25zdCBnaXRXYXJuaW5nICAgPSBkYXRhLmdpdF9lcnJvclxuICAgICAgPyBgPHAgc3R5bGU9XCJjb2xvcjojYjQ1MzA5O2ZvbnQtc2l6ZTowLjg3ZW07XCI+XHUyNkEwXHVGRTBGIEdpdCBjb21taXQgc2tpcHBlZDogJHtlc2MoZGF0YS5naXRfZXJyb3I/Lm1lc3NhZ2UgfHwgZGF0YS5naXRfZXJyb3IpfTwvcD5gXG4gICAgICA6ICcnO1xuXG4gICAgaWYgKHJlc3VsdERpdikge1xuICAgICAgcmVzdWx0RGl2LmlubmVySFRNTCA9IGBcbiAgICAgICAgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2YwZmRmNDtib3JkZXI6MXB4IHNvbGlkICM4NmVmYWM7Ym9yZGVyLXJhZGl1czo2cHg7cGFkZGluZzoxMnB4IDE2cHg7XCI+XG4gICAgICAgICAgPHAgc3R5bGU9XCJjb2xvcjojMTY2NTM0O2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW46MCAwIDRweDtcIj5cbiAgICAgICAgICAgIFx1MjcwNSAke3dyaXR0ZW5Db3VudH0gaXRlbSR7d3JpdHRlbkNvdW50ICE9PSAxID8gJ3MnIDogJyd9IHdyaXR0ZW4gdG8gbWFzdGVyIENWJHtjb21taXRIYXNofS5cbiAgICAgICAgICA8L3A+XG4gICAgICAgICAgJHtiYWNrdXBOb3RlID8gYDxwIHN0eWxlPVwiZm9udC1zaXplOjAuODJlbTtjb2xvcjojNmI3MjgwO21hcmdpbjo0cHggMCAwO1wiPiR7YmFja3VwTm90ZX08L3A+YCA6ICcnfVxuICAgICAgICAgICR7Z2l0V2FybmluZ31cbiAgICAgICAgPC9kaXY+YDtcbiAgICB9XG5cbiAgICAvLyBEaXNhYmxlIGNoZWNrYm94ZXMgZm9yIGFwcGxpZWQgaXRlbXNcbiAgICBmb3IgKGNvbnN0IGlkIG9mIHNlbGVjdGVkSWRzKSB7XG4gICAgICBjb25zdCBjYiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBoYXJ2ZXN0LWNoay0ke2lkfWApO1xuICAgICAgaWYgKGNiKSB7IGNiLmRpc2FibGVkID0gdHJ1ZTsgY2IuY2hlY2tlZCA9IGZhbHNlOyB9XG4gICAgICBjb25zdCByb3cgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgaGFydmVzdC1yb3ctJHtpZH1gKTtcbiAgICAgIGlmIChyb3cpIHJvdy5zdHlsZS5vcGFjaXR5ID0gJzAuNDUnO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLmVycm9yKCdhcHBseUhhcnZlc3RTZWxlY3Rpb25zOiBmYWlsZWQnLCBlcnIpO1xuICAgIGlmIChyZXN1bHREaXYpIHJlc3VsdERpdi5pbm5lckhUTUwgPSBgPHAgY2xhc3M9XCJlcnJvci1tZXNzYWdlXCI+TmV0d29yayBlcnJvcjogJHtlc2MoZXJyLm1lc3NhZ2UpfTwvcD5gO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChhcHBseUJ0bikgeyBhcHBseUJ0bi5kaXNhYmxlZCA9IGZhbHNlOyBhcHBseUJ0bi50ZXh0Q29udGVudCA9ICdcdTI3MDUgQXBwbHkgU2VsZWN0ZWQgdG8gTWFzdGVyIENWJzsgfVxuICB9XG59XG5cbmV4cG9ydCB7IHBvcHVsYXRlSGFydmVzdFRhYiwgYXBwbHlIYXJ2ZXN0U2VsZWN0aW9ucywgcmVmcmVzaEhhcnZlc3RBbmFseXNpcywgdG9nZ2xlSGFydmVzdFNlY3Rpb24gfTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL3Nlc3Npb24tc3dpdGNoZXItdWkuanNcbiAqIFNlc3Npb24gbWFuYWdlbWVudCBtb2RhbCwgdHJhc2ggdmlldywgYW5kIG93bmVyc2hpcCBjb25mbGljdCBkaWFsb2cuXG4gKlxuICogVGhlIHNlc3Npb24tY29uZmxpY3QgcmV0cnkgYmFubmVyIChzaG93U2Vzc2lvbkNvbmZsaWN0QmFubmVyL1xuICogY29uZmxpY3RSZXRyeU5vdy9jb25mbGljdERpc21pc3MpIGxpdmVzIGluIHdlYi9mZXRjaC11dGlscy5qcywgd2hpY2ggb3duc1xuICogaGFuZGxlNDA5Q29uZmxpY3QgKHRoZSBhY3R1YWwgdHJpZ2dlcikgXHUyMDE0IHRoaXMgZmlsZSB1c2VkIHRvIGNhcnJ5IGl0cyBvd25cbiAqIGJ5dGUtZm9yLWJ5dGUgZHVwbGljYXRlIHdpdGggYSBzZXBhcmF0ZSByZXRyeSBxdWV1ZS90aW1lciwgd2hpY2ggbWVhbnRcbiAqIGNsaWNraW5nIFwiUmV0cnkgTm93XCIgY291bGQgc2lsZW50bHkgZHJhaW4gdGhlIHdyb25nIChhbHdheXMtZW1wdHkpIHF1ZXVlXG4gKiBkZXBlbmRpbmcgb24gd2ViL3NyYy9tYWluLmpzJ3MgbW9kdWxlIGxvYWQgb3JkZXIsIG5ldmVyIGFjdHVhbGx5XG4gKiByZXNvbHZpbmcgdGhlIHBlbmRpbmcgcmV0cmllZCByZXF1ZXN0LiBSZW1vdmVkOyBzZWUgd2ViL2ZldGNoLXV0aWxzLmpzLlxuICpcbiAqIERlcGVuZGVuY2llcyAocmVzb2x2ZWQgdGhyb3VnaCBnbG9iYWxUaGlzIGF0IHJ1bnRpbWUpOlxuICogICBlc2NhcGVIdG1sLCBwYXJzZVNlc3Npb25MaXN0UmVzcG9uc2UsIGZvcm1hdFNlc3Npb25QaGFzZUxhYmVsLFxuICogICBmb3JtYXRTZXNzaW9uVGltZXN0YW1wLCBidWlsZFNlc3Npb25Td2l0Y2hlckxhYmVsLFxuICogICBnZXRBY3RpdmVTZXNzaW9uT3duZXJzaGlwTWV0YSwgX2dldEN1cnJlbnRTZXNzaW9uSWRWYWx1ZSxcbiAqICAgbG9hZFNlc3Npb25GaWxlLCBjcmVhdGVOZXdTZXNzaW9uQW5kTmF2aWdhdGUsIGZldGNoU3RhdHVzLFxuICogICBzZXRJbml0aWFsRm9jdXMsIHRyYXBGb2N1cywgcmVzdG9yZUZvY3VzLCBjb25maXJtRGlhbG9nXG4gKi9cblxuLy8gXHUyNTAwXHUyNTAwIFNvcnQgc3RhdGUgJiBzZXNzaW9uIGNhY2hlIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuY29uc3QgX1NNX1NUT1JBR0VfS0VZID0gJ2N2X3NtX3NvcnRfa2V5JztcbmNvbnN0IF9TTV9TVE9SQUdFX0RJUiA9ICdjdl9zbV9zb3J0X2Rpcic7XG5cbmxldCBfc21Tb3J0S2V5ID0gKCgpID0+IHsgdHJ5IHsgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKF9TTV9TVE9SQUdFX0tFWSkgfHwgJ2xhc3RNb2RpZmllZCc7IH0gY2F0Y2ggKF8pIHsgcmV0dXJuICdsYXN0TW9kaWZpZWQnOyB9IH0pKCk7XG5sZXQgX3NtU29ydERpciA9ICgoKSA9PiB7IHRyeSB7IHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShfU01fU1RPUkFHRV9ESVIpIHx8ICdkZXNjJzsgICAgICAgICB9IGNhdGNoIChfKSB7IHJldHVybiAnZGVzYyc7ICAgICAgICAgfSB9KSgpO1xuXG5sZXQgX3NtQWN0aXZlQ2FjaGUgPSBbXTtcbmxldCBfc21TYXZlZENhY2hlICA9IFtdO1xuXG4vLyBcdTI1MDBcdTI1MDAgUmVuZGVyIGhlbHBlcnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIF9yZW5kZXJBY3RpdmVTZXNzaW9uUm93cyhhY3RpdmVTZXNzaW9ucykge1xuICBpZiAoIWFjdGl2ZVNlc3Npb25zLmxlbmd0aCkge1xuICAgIHJldHVybiAnPHAgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLWVtcHR5XCI+Tm8gYWN0aXZlIGluLW1lbW9yeSBzZXNzaW9ucy48L3A+JztcbiAgfVxuXG4gIGNvbnN0IGN1cnJlbnRTZXNzaW9uSWQgPSBfZ2V0Q3VycmVudFNlc3Npb25JZFZhbHVlKCk7XG5cbiAgcmV0dXJuIGA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1saXN0XCI+JHthY3RpdmVTZXNzaW9ucy5tYXAoc2Vzc2lvbiA9PiB7XG4gICAgY29uc3Qgb3duZXJzaGlwID0gZ2V0QWN0aXZlU2Vzc2lvbk93bmVyc2hpcE1ldGEoc2Vzc2lvbiwgeyBjdXJyZW50U2Vzc2lvbklkIH0pO1xuICAgIGNvbnN0IG9wZW5IcmVmID0gYC8/c2Vzc2lvbj0ke2VuY29kZVVSSUNvbXBvbmVudChzZXNzaW9uLnNlc3Npb25faWQgfHwgJycpfWA7XG4gICAgY29uc3QgYWN0aW9uSHRtbCA9IG93bmVyc2hpcC5pc0N1cnJlbnRcbiAgICAgID8gJzxzcGFuIGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1idG5cIiBhcmlhLWRpc2FibGVkPVwidHJ1ZVwiPkN1cnJlbnQ8L3NwYW4+J1xuICAgICAgOiBgPGEgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLWxpbmtcIiBocmVmPVwiJHtvcGVuSHJlZn1cIj5PcGVuPC9hPmA7XG4gICAgcmV0dXJuIGBcbiAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLXJvd1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1yb3ctbWFpblwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLXJvdy10aXRsZVwiPlxuICAgICAgICAgICAgPHN0cm9uZz4ke2VzY2FwZUh0bWwoc2Vzc2lvbi5wb3NpdGlvbl9uYW1lIHx8ICdVbnRpdGxlZCcpfTwvc3Ryb25nPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZXNzaW9uLXN0YXR1cy1waWxsICR7b3duZXJzaGlwLmNsYXNzTmFtZX1cIj48c3BhbiBjbGFzcz1cInNlc3Npb24tc3RhdHVzLWRvdFwiPjwvc3Bhbj4ke2VzY2FwZUh0bWwob3duZXJzaGlwLmxhYmVsKX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNlc3Npb24tc3dpdGNoZXItcm93LW1ldGFcIj5cbiAgICAgICAgICAgICR7ZXNjYXBlSHRtbChmb3JtYXRTZXNzaW9uUGhhc2VMYWJlbChzZXNzaW9uLnBoYXNlKSl9IFx1MDBCNyBDcmVhdGVkICR7ZXNjYXBlSHRtbChmb3JtYXRTZXNzaW9uVGltZXN0YW1wKHNlc3Npb24uY3JlYXRlZCkpfSBcdTAwQjcgTGFzdCBtb2RpZmllZCAke2VzY2FwZUh0bWwoZm9ybWF0U2Vzc2lvblRpbWVzdGFtcChzZXNzaW9uLmxhc3RfbW9kaWZpZWQpKX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLWFjdGlvbnNcIj4ke2FjdGlvbkh0bWx9PC9kaXY+XG4gICAgICA8L2Rpdj5gO1xuICB9KS5qb2luKCcnKX08L2Rpdj5gO1xufVxuXG5mdW5jdGlvbiBfcmVuZGVyU2F2ZWRTZXNzaW9uUm93cyhzYXZlZFNlc3Npb25zLCB7IGluY2x1ZGVNYW5hZ2VtZW50ID0gZmFsc2UgfSA9IHt9KSB7XG4gIGlmICghc2F2ZWRTZXNzaW9ucy5sZW5ndGgpIHtcbiAgICByZXR1cm4gJzxwIGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1lbXB0eVwiPk5vIHNhdmVkIHNlc3Npb25zIGZvdW5kLjwvcD4nO1xuICB9XG5cbiAgZnVuY3Rpb24gX2NyZWF0ZWRJc29Gcm9tU2Vzc2lvblBhdGgoc2Vzc2lvblBhdGgpIHtcbiAgICBpZiAoIXNlc3Npb25QYXRoKSByZXR1cm4gJyc7XG4gICAgY29uc3QgcGF0aFRleHQgPSBTdHJpbmcoc2Vzc2lvblBhdGgpO1xuICAgIGNvbnN0IHBhcnRzID0gcGF0aFRleHQuc3BsaXQoL1tcXFxcL10vKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCA8IDIpIHJldHVybiAnJztcblxuICAgIGNvbnN0IGRpck5hbWUgPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAyXTtcbiAgICBjb25zdCBtYXRjaCA9IGRpck5hbWUubWF0Y2goLyhcXGR7NH0pKFxcZHsyfSkoXFxkezJ9KVtfLV0/KFxcZHsyfSkoXFxkezJ9KShcXGR7Mn0pLyk7XG4gICAgaWYgKCFtYXRjaCkgcmV0dXJuICcnO1xuXG4gICAgY29uc3QgWywgeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmRdID0gbWF0Y2g7XG4gICAgcmV0dXJuIGAke3llYXJ9LSR7bW9udGh9LSR7ZGF5fVQke2hvdXJ9OiR7bWludXRlfToke3NlY29uZH1aYDtcbiAgfVxuXG4gIHJldHVybiBgPGRpdiBjbGFzcz1cInNlc3Npb24tc3dpdGNoZXItbGlzdFwiPiR7c2F2ZWRTZXNzaW9ucy5tYXAoKHNlc3Npb24sIGluZGV4KSA9PiB7XG4gICAgY29uc3QgZXNjYXBlZFBhdGggPSBlc2NhcGVIdG1sKHNlc3Npb24ucGF0aCB8fCAnJyk7XG4gICAgY29uc3QgY3JlYXRlZElzbyA9IF9jcmVhdGVkSXNvRnJvbVNlc3Npb25QYXRoKHNlc3Npb24ucGF0aCk7XG4gICAgY29uc3QgY3JlYXRlZExhYmVsID0gY3JlYXRlZElzbyA/IGZvcm1hdFNlc3Npb25UaW1lc3RhbXAoY3JlYXRlZElzbykgOiAnXHUyMDE0JztcbiAgICBjb25zdCBzYXZlZExhYmVsID0gZm9ybWF0U2Vzc2lvblRpbWVzdGFtcChzZXNzaW9uLnRpbWVzdGFtcCk7XG4gICAgY29uc3Qgc2F2ZWRNZXRhID0gc2F2ZWRMYWJlbCA9PT0gJ1x1MjAxNCcgPyAnJyA6IGAgXHUwMEI3IFNhdmVkICR7ZXNjYXBlSHRtbChzYXZlZExhYmVsKX1gO1xuICAgIGNvbnN0IG1hbmFnZW1lbnRIdG1sID0gaW5jbHVkZU1hbmFnZW1lbnRcbiAgICAgID8gYFxuICAgICAgICA8YnV0dG9uIGRhdGEtc20tYWN0aW9uPVwicmVuYW1lXCIgZGF0YS1zbS1wYXRoPVwiJHtlc2NhcGVkUGF0aH1cIiBkYXRhLXNtLWlkeD1cIiR7aW5kZXh9XCIgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLWJ0blwiIHRpdGxlPVwiUmVuYW1lIHNlc3Npb25cIj5SZW5hbWU8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBkYXRhLXNtLWFjdGlvbj1cImRlbGV0ZVwiIGRhdGEtc20tcGF0aD1cIiR7ZXNjYXBlZFBhdGh9XCIgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLWJ0biBkYW5nZXJcIiB0aXRsZT1cIk1vdmUgc2Vzc2lvbiB0byBUcmFzaFwiPk1vdmUgdG8gVHJhc2g8L2J1dHRvbj5gXG4gICAgICA6ICcnO1xuXG4gICAgcmV0dXJuIGBcbiAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLXJvd1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1yb3ctbWFpblwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLXJvdy10aXRsZVwiPlxuICAgICAgICAgICAgPHN0cm9uZyBpZD1cInNtLW5hbWUtJHtpbmRleH1cIj4ke2VzY2FwZUh0bWwoc2Vzc2lvbi5wb3NpdGlvbl9uYW1lIHx8ICdVbnRpdGxlZCcpfTwvc3Ryb25nPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZXNzaW9uLXN0YXR1cy1waWxsIHNlc3Npb24tc3RhdHVzLXNhdmVkXCI+PHNwYW4gY2xhc3M9XCJzZXNzaW9uLXN0YXR1cy1kb3RcIj48L3NwYW4+U2F2ZWQ8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBpZD1cInNtLXJlbmFtZS0ke2luZGV4fVwiIHN0eWxlPVwiZGlzcGxheTpub25lO2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6NnB4O21hcmdpbjo4cHggMCA0cHg7XCI+XG4gICAgICAgICAgICA8aW5wdXQgaWQ9XCJzbS1pbnB1dC0ke2luZGV4fVwiIHR5cGU9XCJ0ZXh0XCIgdmFsdWU9XCIke2VzY2FwZUh0bWwoc2Vzc2lvbi5wb3NpdGlvbl9uYW1lIHx8ICcnKX1cIiBjbGFzcz1cInNtLWtleS1pbnB1dFwiIGRhdGEtc20tcGF0aD1cIiR7ZXNjYXBlZFBhdGh9XCIgZGF0YS1zbS1pZHg9XCIke2luZGV4fVwiIHN0eWxlPVwiYm9yZGVyOjFweCBzb2xpZCAjM2I4MmY2O2JvcmRlci1yYWRpdXM6NnB4O3BhZGRpbmc6NnB4IDEwcHg7Zm9udC1zaXplOjEzcHg7ZmxleDoxO21pbi13aWR0aDowO1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLXNtLWFjdGlvbj1cInN1Ym1pdC1yZW5hbWVcIiBkYXRhLXNtLXBhdGg9XCIke2VzY2FwZWRQYXRofVwiIGRhdGEtc20taWR4PVwiJHtpbmRleH1cIiBjbGFzcz1cInNlc3Npb24tc3dpdGNoZXItYnRuXCI+U2F2ZTwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLXNtLWFjdGlvbj1cImNhbmNlbC1yZW5hbWVcIiBkYXRhLXNtLWlkeD1cIiR7aW5kZXh9XCIgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLWJ0blwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLXJvdy1tZXRhXCI+XG4gICAgICAgICAgICAke2VzY2FwZUh0bWwoZm9ybWF0U2Vzc2lvblBoYXNlTGFiZWwoc2Vzc2lvbi5waGFzZSkpfSBcdTAwQjcgQ3JlYXRlZCAke2VzY2FwZUh0bWwoY3JlYXRlZExhYmVsKX0ke3NhdmVkTWV0YX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLWFjdGlvbnNcIj5cbiAgICAgICAgICA8YnV0dG9uIGRhdGEtc20tYWN0aW9uPVwibG9hZFwiIGRhdGEtc20tcGF0aD1cIiR7ZXNjYXBlZFBhdGh9XCIgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLWxpbmtcIj5Mb2FkPC9idXR0b24+XG4gICAgICAgICAgJHttYW5hZ2VtZW50SHRtbH1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5gO1xuICB9KS5qb2luKCcnKX08L2Rpdj5gO1xufVxuXG5mdW5jdGlvbiBfcmVuZGVyU2Vzc2lvblN3aXRjaGVyU2VjdGlvbnMoYWN0aXZlU2Vzc2lvbnMsIHNhdmVkU2Vzc2lvbnMsIHsgaW5jbHVkZVNhdmVkTWFuYWdlbWVudCA9IGZhbHNlIH0gPSB7fSkge1xuICBjb25zdCBzYXZlZFNlY3Rpb25Ob3RlID0gaW5jbHVkZVNhdmVkTWFuYWdlbWVudFxuICAgID8gJ0xvYWQgZnJvbSBkaXNrLCByZW5hbWUsIG9yIG1vdmUgc2F2ZWQgd29yayB0byBUcmFzaC4nXG4gICAgOiAnTG9hZCBzYXZlZCB3b3JrIGZyb20gZGlzay4nO1xuXG4gIHJldHVybiBgXG4gICAgPGRpdiBjbGFzcz1cInNlc3Npb24tc3dpdGNoZXItc2VjdGlvbnNcIj5cbiAgICAgIDxzZWN0aW9uIGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1zZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLXNlY3Rpb24taGVhZGVyXCI+XG4gICAgICAgICAgPGgzPkFjdGl2ZSBTZXNzaW9uczwvaDM+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLXNlY3Rpb24tbm90ZVwiPkluLW1lbW9yeSBzZXNzaW9ucyB0aGF0IGNhbiBiZSBvcGVuZWQgZGlyZWN0bHkuPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgJHtfcmVuZGVyQWN0aXZlU2Vzc2lvblJvd3MoYWN0aXZlU2Vzc2lvbnMpfVxuICAgICAgPC9zZWN0aW9uPlxuICAgICAgPHNlY3Rpb24gY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLXNlY3Rpb25cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNlc3Npb24tc3dpdGNoZXItc2VjdGlvbi1oZWFkZXJcIj5cbiAgICAgICAgICA8aDM+U2F2ZWQgU2Vzc2lvbnM8L2gzPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1zZWN0aW9uLW5vdGVcIj4ke3NhdmVkU2VjdGlvbk5vdGV9PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgJHtfcmVuZGVyU2F2ZWRTZXNzaW9uUm93cyhzYXZlZFNlc3Npb25zLCB7IGluY2x1ZGVNYW5hZ2VtZW50OiBpbmNsdWRlU2F2ZWRNYW5hZ2VtZW50IH0pfVxuICAgICAgPC9zZWN0aW9uPlxuICAgIDwvZGl2PmA7XG59XG5cbmZ1bmN0aW9uIF91cGRhdGVTZXNzaW9uU3dpdGNoZXJIZWFkZXIoc3RhdHVzID0ge30pIHtcbiAgY29uc3QgbGFiZWwgPSBidWlsZFNlc3Npb25Td2l0Y2hlckxhYmVsKHN0YXR1cyk7XG4gIGNvbnN0IHN3aXRjaGVyTGFiZWxFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXNzaW9uLXN3aXRjaGVyLWxhYmVsJyk7XG4gIGNvbnN0IHN3aXRjaGVyQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Nlc3Npb24tc3dpdGNoZXItYnRuJyk7XG4gIGNvbnN0IHN1YnRpdGxlRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhZGVyLXNlc3Npb24tbmFtZScpO1xuICBjb25zdCBoYXNTZXNzaW9uID0gQm9vbGVhbihfZ2V0Q3VycmVudFNlc3Npb25JZFZhbHVlKCkpO1xuXG4gIGlmIChzd2l0Y2hlckxhYmVsRWwpIHN3aXRjaGVyTGFiZWxFbC50ZXh0Q29udGVudCA9IGxhYmVsO1xuICBpZiAoc3dpdGNoZXJCdG4pIHN3aXRjaGVyQnRuLmNsYXNzTGlzdC50b2dnbGUoJ2lzLXNlc3Npb24tYWN0aXZlJywgaGFzU2Vzc2lvbik7XG4gIGlmIChzdWJ0aXRsZUVsKSB7XG4gICAgc3VidGl0bGVFbC50ZXh0Q29udGVudCA9IGhhc1Nlc3Npb24gPyBgQ3VycmVudCBzZXNzaW9uOiAke2xhYmVsfWAgOiAnU2VsZWN0IG9yIGNyZWF0ZSBhIHNlc3Npb24nO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBPd25lcnNoaXAgY29uZmxpY3QgZGlhbG9nIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBzaG93T3duZXJzaGlwQ29uZmxpY3REaWFsb2cobWVzc2FnZSA9ICdUaGlzIHNlc3Npb24gaXMgY3VycmVudGx5IGNsYWltZWQgYnkgYW5vdGhlciBicm93c2VyIHRhYi4nKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICBjb25zdCBvdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ293bmVyc2hpcC1jb25mbGljdC1vdmVybGF5Jyk7XG4gICAgY29uc3QgbWVzc2FnZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ293bmVyc2hpcC1jb25mbGljdC1tZXNzYWdlJyk7XG4gICAgY29uc3QgbG9hZERpZmZlcmVudEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvd25lcnNoaXAtbG9hZC1kaWZmZXJlbnQtYnRuJyk7XG4gICAgY29uc3QgbmV3U2Vzc2lvbkJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvd25lcnNoaXAtbmV3LXNlc3Npb24tYnRuJyk7XG4gICAgY29uc3QgdGFrZW92ZXJCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3duZXJzaGlwLXRha2VvdmVyLWJ0bicpO1xuICAgIGlmICghb3ZlcmxheSB8fCAhbWVzc2FnZUVsIHx8ICFsb2FkRGlmZmVyZW50QnRuIHx8ICFuZXdTZXNzaW9uQnRuIHx8ICF0YWtlb3ZlckJ0bikge1xuICAgICAgcmVzb2x2ZSgnZGlmZmVyZW50Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY2xlYW51cCA9IChjaG9pY2UpID0+IHtcbiAgICAgIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIHJlc3RvcmVGb2N1cygpO1xuICAgICAgbG9hZERpZmZlcmVudEJ0bi5vbmNsaWNrID0gbnVsbDtcbiAgICAgIG5ld1Nlc3Npb25CdG4ub25jbGljayA9IG51bGw7XG4gICAgICB0YWtlb3ZlckJ0bi5vbmNsaWNrID0gbnVsbDtcbiAgICAgIHJlc29sdmUoY2hvaWNlKTtcbiAgICB9O1xuXG4gICAgbWVzc2FnZUVsLnRleHRDb250ZW50ID0gbWVzc2FnZTtcbiAgICBvdmVybGF5LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgd2luZG93Ll9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICBzZXRJbml0aWFsRm9jdXMoJ293bmVyc2hpcC1jb25mbGljdC1vdmVybGF5Jyk7XG4gICAgdHJhcEZvY3VzKCdvd25lcnNoaXAtY29uZmxpY3Qtb3ZlcmxheScpO1xuXG4gICAgbG9hZERpZmZlcmVudEJ0bi5vbmNsaWNrID0gKCkgPT4gY2xlYW51cCgnZGlmZmVyZW50Jyk7XG4gICAgbmV3U2Vzc2lvbkJ0bi5vbmNsaWNrID0gKCkgPT4gY2xlYW51cCgnbmV3Jyk7XG4gICAgdGFrZW92ZXJCdG4ub25jbGljayA9ICgpID0+IGNsZWFudXAoJ3Rha2VvdmVyJyk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjbG9zZU93bmVyc2hpcENvbmZsaWN0RGlhbG9nKGNob2ljZSA9ICdkaWZmZXJlbnQnKSB7XG4gIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3duZXJzaGlwLWNvbmZsaWN0LW92ZXJsYXknKTtcbiAgaWYgKG92ZXJsYXkpIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgcmVzdG9yZUZvY3VzKCk7XG4gIGNvbnN0IGxvYWREaWZmZXJlbnRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3duZXJzaGlwLWxvYWQtZGlmZmVyZW50LWJ0bicpO1xuICBpZiAobG9hZERpZmZlcmVudEJ0biAmJiB0eXBlb2YgbG9hZERpZmZlcmVudEJ0bi5vbmNsaWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgbG9hZERpZmZlcmVudEJ0bi5vbmNsaWNrKCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHJldHVybiBjaG9pY2U7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBTZXNzaW9uIGZpbGUtYnJvd3NlciB0YWJsZSBoZWxwZXJzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBfc2V0U21Tb3J0KGtleSkge1xuICBpZiAoX3NtU29ydEtleSA9PT0ga2V5KSB7XG4gICAgX3NtU29ydERpciA9IF9zbVNvcnREaXIgPT09ICdhc2MnID8gJ2Rlc2MnIDogJ2FzYyc7XG4gIH0gZWxzZSB7XG4gICAgX3NtU29ydEtleSA9IGtleTtcbiAgICBfc21Tb3J0RGlyID0ga2V5ID09PSAnbGFzdE1vZGlmaWVkJyA/ICdkZXNjJyA6ICdhc2MnO1xuICB9XG4gIHRyeSB7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oX1NNX1NUT1JBR0VfS0VZLCBfc21Tb3J0S2V5KTtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShfU01fU1RPUkFHRV9ESVIsIF9zbVNvcnREaXIpO1xuICB9IGNhdGNoIChfKSB7IC8qIHN0b3JhZ2UgdW5hdmFpbGFibGUgKi8gfVxuICBfcmVuZGVyU2Vzc2lvblRhYmxlRnJvbUNhY2hlKCk7XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVkSXNvRnJvbVNlc3Npb25QYXRoKHNlc3Npb25QYXRoKSB7XG4gIGlmICghc2Vzc2lvblBhdGgpIHJldHVybiAnJztcbiAgY29uc3QgcGF0aFRleHQgPSBTdHJpbmcoc2Vzc2lvblBhdGgpO1xuICBjb25zdCBwYXJ0cyAgICA9IHBhdGhUZXh0LnNwbGl0KC9bXFxcXC9dLykuZmlsdGVyKEJvb2xlYW4pO1xuICBpZiAocGFydHMubGVuZ3RoIDwgMikgcmV0dXJuICcnO1xuICBjb25zdCBkaXJOYW1lICA9IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDJdO1xuICBjb25zdCBtYXRjaCAgICA9IGRpck5hbWUubWF0Y2goLyhcXGR7NH0pKFxcZHsyfSkoXFxkezJ9KVtfLV0/KFxcZHsyfSkoXFxkezJ9KShcXGR7Mn0pLyk7XG4gIGlmICghbWF0Y2gpIHJldHVybiAnJztcbiAgY29uc3QgWywgeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmRdID0gbWF0Y2g7XG4gIHJldHVybiBgJHt5ZWFyfS0ke21vbnRofS0ke2RheX1UJHtob3VyfToke21pbnV0ZX06JHtzZWNvbmR9WmA7XG59XG5cbmZ1bmN0aW9uIF9ub3JtYWxpemVTZXNzaW9uc0ZvclRhYmxlKGFjdGl2ZVNlc3Npb25zLCBzYXZlZFNlc3Npb25zKSB7XG4gIGNvbnN0IGN1cnJlbnRTZXNzaW9uSWQgPSBfZ2V0Q3VycmVudFNlc3Npb25JZFZhbHVlKCk7XG4gIGNvbnN0IHJvd3MgPSBbXTtcblxuICBmb3IgKGNvbnN0IHMgb2YgYWN0aXZlU2Vzc2lvbnMpIHtcbiAgICBjb25zdCBvd25lcnNoaXAgPSBnZXRBY3RpdmVTZXNzaW9uT3duZXJzaGlwTWV0YShzLCB7IGN1cnJlbnRTZXNzaW9uSWQgfSk7XG4gICAgcm93cy5wdXNoKHtcbiAgICAgIHR5cGU6ICAgICAgICAgICAgICAnYWN0aXZlJyxcbiAgICAgIG5hbWU6ICAgICAgICAgICAgICAgcy5wb3NpdGlvbl9uYW1lIHx8ICdVbnRpdGxlZCcsXG4gICAgICBjb21wYW55OiAgICAgICAgICAgIHMuY29tcGFueSB8fCAnJyxcbiAgICAgIHBoYXNlOiAgICAgICAgICAgICAgcy5waGFzZSAgICAgICAgIHx8ICcnLFxuICAgICAgYXBwbGljYXRpb25TdGF0dXM6ICBzLmFwcGxpY2F0aW9uX3N0YXR1cyB8fCAnJyxcbiAgICAgIGF0c1Njb3JlOiAgICAgICAgICAgcy5hdHNfc2NvcmUgPz8gbnVsbCxcbiAgICAgIGxhc3RNb2RpZmllZDogICAgICAgcy5sYXN0X21vZGlmaWVkICA/IG5ldyBEYXRlKHMubGFzdF9tb2RpZmllZCkgOiBudWxsLFxuICAgICAgY3JlYXRlZDogICAgICAgICAgICBzLmNyZWF0ZWQgICAgICAgID8gbmV3IERhdGUocy5jcmVhdGVkKSAgICAgICA6IG51bGwsXG4gICAgICBvd25lcnNoaXAsXG4gICAgICBzZXNzaW9uSWQ6ICAgICAgICAgIHMuc2Vzc2lvbl9pZCxcbiAgICAgIHBhdGg6ICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgIGlkeDogICAgICAgICAgICAgICAgbnVsbCxcbiAgICB9KTtcbiAgfVxuXG4gIHNhdmVkU2Vzc2lvbnMuZm9yRWFjaCgocywgaWR4KSA9PiB7XG4gICAgY29uc3QgY3JlYXRlZElzbyA9IF9jcmVhdGVkSXNvRnJvbVNlc3Npb25QYXRoKHMucGF0aCk7XG4gICAgcm93cy5wdXNoKHtcbiAgICAgIHR5cGU6ICAgICAgICAgICAgICAnc2F2ZWQnLFxuICAgICAgbmFtZTogICAgICAgICAgICAgICBzLnBvc2l0aW9uX25hbWUgfHwgJ1VudGl0bGVkJyxcbiAgICAgIGNvbXBhbnk6ICAgICAgICAgICAgcy5jb21wYW55IHx8ICcnLFxuICAgICAgcGhhc2U6ICAgICAgICAgICAgICBzLnBoYXNlICAgICAgICAgfHwgJycsXG4gICAgICBhcHBsaWNhdGlvblN0YXR1czogIHMuYXBwbGljYXRpb25fc3RhdHVzIHx8ICcnLFxuICAgICAgbm90ZXM6ICAgICAgICAgICAgICBzLm5vdGVzIHx8ICcnLFxuICAgICAgYXRzU2NvcmU6ICAgICAgICAgICBzLmF0c19zY29yZSA/PyBudWxsLFxuICAgICAgbGFzdE1vZGlmaWVkOiAgICAgICBzLnRpbWVzdGFtcCAgPyBuZXcgRGF0ZShzLnRpbWVzdGFtcCkgIDogbnVsbCxcbiAgICAgIGNyZWF0ZWQ6ICAgICAgICAgICAgY3JlYXRlZElzbyAgID8gbmV3IERhdGUoY3JlYXRlZElzbykgICA6IG51bGwsXG4gICAgICBvd25lcnNoaXA6ICAgICAgICAgIG51bGwsXG4gICAgICBzZXNzaW9uSWQ6ICAgICAgICAgIG51bGwsXG4gICAgICBwYXRoOiAgICAgICAgICAgICAgIHMucGF0aCxcbiAgICAgIGlkeCxcbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHJvd3M7XG59XG5cbmZ1bmN0aW9uIF9zb3J0U2Vzc2lvblJvd3Mocm93cywga2V5LCBkaXIpIHtcbiAgcmV0dXJuIFsuLi5yb3dzXS5zb3J0KChhLCBiKSA9PiB7XG4gICAgbGV0IGF2LCBidjtcbiAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgY2FzZSAnbmFtZSc6XG4gICAgICAgIGF2ID0gKGEubmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgYnYgPSAoYi5uYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICByZXR1cm4gZGlyID09PSAnYXNjJyA/IGF2LmxvY2FsZUNvbXBhcmUoYnYpIDogYnYubG9jYWxlQ29tcGFyZShhdik7XG4gICAgICBjYXNlICdzdGF0dXMnOiB7XG4gICAgICAgIGNvbnN0IHJhbmsgPSByID0+IHIudHlwZSA9PT0gJ2FjdGl2ZScgPyAoci5vd25lcnNoaXA/LmlzQ3VycmVudCA/IDAgOiAxKSA6IDI7XG4gICAgICAgIGF2ID0gcmFuayhhKTsgYnYgPSByYW5rKGIpO1xuICAgICAgICByZXR1cm4gZGlyID09PSAnYXNjJyA/IGF2IC0gYnYgOiBidiAtIGF2O1xuICAgICAgfVxuICAgICAgY2FzZSAncGhhc2UnOlxuICAgICAgICBhdiA9IChhLnBoYXNlIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBidiA9IChiLnBoYXNlIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICByZXR1cm4gZGlyID09PSAnYXNjJyA/IGF2LmxvY2FsZUNvbXBhcmUoYnYpIDogYnYubG9jYWxlQ29tcGFyZShhdik7XG4gICAgICBjYXNlICdsYXN0TW9kaWZpZWQnOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYXYgPSBhLmxhc3RNb2RpZmllZCA/IGEubGFzdE1vZGlmaWVkLmdldFRpbWUoKSA6IDA7XG4gICAgICAgIGJ2ID0gYi5sYXN0TW9kaWZpZWQgPyBiLmxhc3RNb2RpZmllZC5nZXRUaW1lKCkgOiAwO1xuICAgICAgICByZXR1cm4gZGlyID09PSAnYXNjJyA/IGF2IC0gYnYgOiBidiAtIGF2O1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIF9yZW5kZXJTZXNzaW9uVGFibGVIZWFkZXIoKSB7XG4gIGNvbnN0IGNvbHMgPSBbXG4gICAgeyBrZXk6ICduYW1lJywgICAgICAgICBsYWJlbDogJ05hbWUnICAgICB9LFxuICAgIHsga2V5OiAnc3RhdHVzJywgICAgICAgbGFiZWw6ICdTdGF0dXMnICAgfSxcbiAgICB7IGtleTogJ3BoYXNlJywgICAgICAgIGxhYmVsOiAnUGhhc2UnICAgIH0sXG4gICAgeyBrZXk6ICdsYXN0TW9kaWZpZWQnLCBsYWJlbDogJ01vZGlmaWVkJyB9LFxuICBdO1xuICBjb25zdCBjZWxscyA9IGNvbHMubWFwKCh7IGtleSwgbGFiZWwgfSkgPT4ge1xuICAgIGNvbnN0IGFjdGl2ZSA9IF9zbVNvcnRLZXkgPT09IGtleTtcbiAgICBjb25zdCBpY29uICAgPSBhY3RpdmUgPyAoX3NtU29ydERpciA9PT0gJ2FzYycgPyAnXFx1MjViMicgOiAnXFx1MjViYycpIDogJ1xcdTIxYzUnO1xuICAgIHJldHVybiBgPHNwYW4gY2xhc3M9XCJzbS10aCR7YWN0aXZlID8gJyBzbS10aC1zb3J0ZWQnIDogJyd9XCIgZGF0YS1zbS1zb3J0PVwiJHtrZXl9XCIgcm9sZT1cImJ1dHRvblwiIHRhYmluZGV4PVwiMFwiIHRpdGxlPVwiU29ydCBieSAke2xhYmVsfVwiPiR7ZXNjYXBlSHRtbChsYWJlbCl9IDxzcGFuIGNsYXNzPVwic20tc29ydC1pY29uJHthY3RpdmUgPyAnIHNtLXNvcnQtYWN0aXZlJyA6ICcnfVwiPiR7aWNvbn08L3NwYW4+PC9zcGFuPmA7XG4gIH0pO1xuICByZXR1cm4gYDxkaXYgY2xhc3M9XCJzbS10aGVhZFwiPiR7Y2VsbHMuam9pbignJyl9PHNwYW4gY2xhc3M9XCJzbS10aCBzbS10aC1hY3Rpb25zXCI+QWN0aW9uczwvc3Bhbj48L2Rpdj5gO1xufVxuXG5mdW5jdGlvbiBfZm10RGF0ZUNvbXBhY3QoZCkge1xuICBpZiAoIWQpIHJldHVybiAnXFx1MjAxNCc7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGQudG9Mb2NhbGVTdHJpbmcoJ2VuLVVTJywge1xuICAgICAgbW9udGg6ICdudW1lcmljJywgZGF5OiAnbnVtZXJpYycsIHllYXI6ICcyLWRpZ2l0JyxcbiAgICAgIGhvdXI6ICdudW1lcmljJywgbWludXRlOiAnMi1kaWdpdCcsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKF8pIHsgcmV0dXJuICdcXHUyMDE0JzsgfVxufVxuXG5mdW5jdGlvbiBfcmVuZGVyU2Vzc2lvblRhYmxlUm93KHJvdykge1xuICBjb25zdCBwaGFzZUxhYmVsID0gZXNjYXBlSHRtbChmb3JtYXRTZXNzaW9uUGhhc2VMYWJlbChyb3cucGhhc2UpKTtcbiAgY29uc3QgbW9kTGFiZWwgICA9IGVzY2FwZUh0bWwoX2ZtdERhdGVDb21wYWN0KHJvdy5sYXN0TW9kaWZpZWQpKTtcblxuICBjb25zdCBzdGF0dXNQaWxsID0gcm93LnR5cGUgPT09ICdhY3RpdmUnXG4gICAgPyBgPHNwYW4gY2xhc3M9XCJzZXNzaW9uLXN0YXR1cy1waWxsICR7cm93Lm93bmVyc2hpcC5jbGFzc05hbWV9XCI+PHNwYW4gY2xhc3M9XCJzZXNzaW9uLXN0YXR1cy1kb3RcIj48L3NwYW4+JHtlc2NhcGVIdG1sKHJvdy5vd25lcnNoaXAubGFiZWwpfTwvc3Bhbj5gXG4gICAgOiBgPHNwYW4gY2xhc3M9XCJzZXNzaW9uLXN0YXR1cy1waWxsIHNlc3Npb24tc3RhdHVzLXNhdmVkXCI+PHNwYW4gY2xhc3M9XCJzZXNzaW9uLXN0YXR1cy1kb3RcIj48L3NwYW4+U2F2ZWQ8L3NwYW4+YDtcblxuICBsZXQgYWN0aW9uSHRtbDtcbiAgaWYgKHJvdy50eXBlID09PSAnYWN0aXZlJykge1xuICAgIGNvbnN0IGhyZWYgPSBgLz9zZXNzaW9uPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHJvdy5zZXNzaW9uSWQgfHwgJycpfWA7XG4gICAgYWN0aW9uSHRtbCA9IHJvdy5vd25lcnNoaXAuaXNDdXJyZW50XG4gICAgICA/ICc8c3BhbiBjbGFzcz1cInNtLWJ0biBzbS1idG4tZGlzYWJsZWRcIiBhcmlhLWRpc2FibGVkPVwidHJ1ZVwiPkN1cnJlbnQ8L3NwYW4+J1xuICAgICAgOiBgPGEgY2xhc3M9XCJzbS1idG4gc20tYnRuLW9wZW5cIiBocmVmPVwiJHtocmVmfVwiPk9wZW48L2E+YDtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBlcCAgPSBlc2NhcGVIdG1sKHJvdy5wYXRoIHx8ICcnKTtcbiAgICBjb25zdCBpZHggPSByb3cuaWR4O1xuICAgIGFjdGlvbkh0bWwgPVxuICAgICAgYDxidXR0b24gZGF0YS1zbS1hY3Rpb249XCJsb2FkXCIgICBkYXRhLXNtLXBhdGg9XCIke2VwfVwiIGNsYXNzPVwic20tYnRuIHNtLWJ0bi1vcGVuIHNtLWJ0bi1pY29uXCIgdGl0bGU9XCJMb2FkIHNlc3Npb25cIiBhcmlhLWxhYmVsPVwiTG9hZCBzZXNzaW9uXCI+PGkgY2xhc3M9XCJmYS1zb2xpZCBmYS1mb2xkZXItb3BlblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT48L2J1dHRvbj5gICtcbiAgICAgIGA8YnV0dG9uIGRhdGEtc20tYWN0aW9uPVwicmVuYW1lXCIgZGF0YS1zbS1wYXRoPVwiJHtlcH1cIiBkYXRhLXNtLWlkeD1cIiR7aWR4fVwiIGNsYXNzPVwic20tYnRuIHNtLWJ0bi1pY29uXCIgdGl0bGU9XCJSZW5hbWUgc2Vzc2lvblwiIGFyaWEtbGFiZWw9XCJSZW5hbWUgc2Vzc2lvblwiPjxpIGNsYXNzPVwiZmEtc29saWQgZmEtcGVuY2lsXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPjwvYnV0dG9uPmAgK1xuICAgICAgYDxidXR0b24gZGF0YS1zbS1hY3Rpb249XCJkdXBsaWNhdGVcIiBkYXRhLXNtLXBhdGg9XCIke2VwfVwiIGNsYXNzPVwic20tYnRuIHNtLWJ0bi1pY29uXCIgdGl0bGU9XCJEdXBsaWNhdGUgc2Vzc2lvblwiIGFyaWEtbGFiZWw9XCJEdXBsaWNhdGUgc2Vzc2lvblwiPjxpIGNsYXNzPVwiZmEtc29saWQgZmEtY29weVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT48L2J1dHRvbj5gICtcbiAgICAgIGA8YnV0dG9uIGRhdGEtc20tYWN0aW9uPVwiZGVsZXRlXCIgZGF0YS1zbS1wYXRoPVwiJHtlcH1cIiBjbGFzcz1cInNtLWJ0biBzbS1idG4tZGFuZ2VyIHNtLWJ0bi1pY29uXCIgdGl0bGU9XCJNb3ZlIHRvIFRyYXNoXCIgYXJpYS1sYWJlbD1cIk1vdmUgc2Vzc2lvbiB0byBUcmFzaFwiPjxpIGNsYXNzPVwiZmEtc29saWQgZmEtdHJhc2hcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+PC9idXR0b24+YDtcbiAgfVxuXG4gIGNvbnN0IHJvd0NsYXNzID0gKHJvdy50eXBlID09PSAnYWN0aXZlJyAmJiByb3cub3duZXJzaGlwLmlzQ3VycmVudCkgPyAnc20tdHIgc20tdHItY3VycmVudCcgOiAnc20tdHInO1xuXG4gIGNvbnN0IGNvbXBhbnlTdWIgPSByb3cuY29tcGFueVxuICAgID8gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC44ZW07Y29sb3I6Izk0YTNiODttYXJnaW4tdG9wOjFweDtcIj4ke2VzY2FwZUh0bWwocm93LmNvbXBhbnkpfTwvZGl2PmBcbiAgICA6ICcnO1xuICBjb25zdCBuYW1lQ2VsbCA9IHJvdy50eXBlID09PSAnc2F2ZWQnXG4gICAgPyBgPHNwYW4gaWQ9XCJzbS1uYW1lLSR7cm93LmlkeH1cIj4ke2VzY2FwZUh0bWwocm93Lm5hbWUpfTwvc3Bhbj5gICtcbiAgICAgIGAke2NvbXBhbnlTdWJ9YCArXG4gICAgICBgPHNwYW4gaWQ9XCJzbS1yZW5hbWUtJHtyb3cuaWR4fVwiIHN0eWxlPVwiZGlzcGxheTpub25lO2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6NHB4O21hcmdpbi10b3A6M3B4O1wiPmAgK1xuICAgICAgICBgPGlucHV0IGlkPVwic20taW5wdXQtJHtyb3cuaWR4fVwiIHR5cGU9XCJ0ZXh0XCIgdmFsdWU9XCIke2VzY2FwZUh0bWwocm93Lm5hbWUpfVwiIGNsYXNzPVwic20ta2V5LWlucHV0XCJgICtcbiAgICAgICAgICBgIGRhdGEtc20tcGF0aD1cIiR7ZXNjYXBlSHRtbChyb3cucGF0aCB8fCAnJyl9XCIgZGF0YS1zbS1pZHg9XCIke3Jvdy5pZHh9XCJgICtcbiAgICAgICAgICBgIHN0eWxlPVwiYm9yZGVyOjFweCBzb2xpZCAjM2I4MmY2O2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6M3B4IDhweDtmb250LXNpemU6MTJweDtmbGV4OjE7bWluLXdpZHRoOjYwcHg7XCI+YCArXG4gICAgICAgIGA8YnV0dG9uIGRhdGEtc20tYWN0aW9uPVwic3VibWl0LXJlbmFtZVwiIGRhdGEtc20tcGF0aD1cIiR7ZXNjYXBlSHRtbChyb3cucGF0aCB8fCAnJyl9XCIgZGF0YS1zbS1pZHg9XCIke3Jvdy5pZHh9XCIgY2xhc3M9XCJzbS1idG5cIiB0aXRsZT1cIlNhdmUgcmVuYW1lXCIgYXJpYS1sYWJlbD1cIlNhdmUgcmVuYW1lXCI+XFx1MjcxMzwvYnV0dG9uPmAgK1xuICAgICAgICBgPGJ1dHRvbiBkYXRhLXNtLWFjdGlvbj1cImNhbmNlbC1yZW5hbWVcIiBkYXRhLXNtLWlkeD1cIiR7cm93LmlkeH1cIiBjbGFzcz1cInNtLWJ0blwiIHRpdGxlPVwiQ2FuY2VsIHJlbmFtZVwiIGFyaWEtbGFiZWw9XCJDYW5jZWwgcmVuYW1lXCI+XFx1MjcxNTwvYnV0dG9uPmAgK1xuICAgICAgYDwvc3Bhbj5gXG4gICAgOiBgPHNwYW4+JHtlc2NhcGVIdG1sKHJvdy5uYW1lKX08L3NwYW4+JHtjb21wYW55U3VifWA7XG5cbiAgY29uc3QgYXBwU3RhdHVzTGFiZWxzID0ge1xuICAgIGRyYWZ0OiAnRHJhZnQnLCByZWFkeTogJ1JlYWR5Jywgc2VudDogJ1NlbnQnLCBxdWV1ZWQ6ICdRdWV1ZWQnLFxuICAgIGludGVydmlldzogJ0ludGVydmlldycsIHJlamVjdGVkOiAnUmVqZWN0ZWQnLCBhY2NlcHRlZDogJ0FjY2VwdGVkJyxcbiAgICBwYXJrZWQ6ICdQYXJrZWQnLFxuICB9O1xuICBjb25zdCBhcHBTdGF0dXNDb2xvcnMgPSB7XG4gICAgZHJhZnQ6ICcjOTRhM2I4JywgcmVhZHk6ICcjM2I4MmY2Jywgc2VudDogJyMyMmM1NWUnLCBxdWV1ZWQ6ICcjZWFiMzA4JyxcbiAgICBpbnRlcnZpZXc6ICcjYTg1NWY3JywgcmVqZWN0ZWQ6ICcjZWY0NDQ0JywgYWNjZXB0ZWQ6ICcjMDU5NjY5JyxcbiAgICBwYXJrZWQ6ICcjZjk3MzE2JyxcbiAgfTtcbiAgY29uc3QgYXBwU3RhdHVzID0gcm93LmFwcGxpY2F0aW9uU3RhdHVzIHx8ICcnO1xuICBjb25zdCBhcHBTdGF0dXNCYWRnZSA9IGFwcFN0YXR1cyAmJiBhcHBTdGF0dXNMYWJlbHNbYXBwU3RhdHVzXVxuICAgID8gYCA8c3BhbiBpZD1cInNtLXN0YXR1cy1iYWRnZS0ke3Jvdy5pZHh9XCIgc3R5bGU9XCJmb250LXNpemU6MC43NWVtO3BhZGRpbmc6MXB4IDZweDtib3JkZXItcmFkaXVzOjlweDtiYWNrZ3JvdW5kOiR7YXBwU3RhdHVzQ29sb3JzW2FwcFN0YXR1c119O2NvbG9yOiNmZmY7dmVydGljYWwtYWxpZ246bWlkZGxlO1wiPiR7YXBwU3RhdHVzTGFiZWxzW2FwcFN0YXR1c119PC9zcGFuPmBcbiAgICA6IGA8c3BhbiBpZD1cInNtLXN0YXR1cy1iYWRnZS0ke3Jvdy5pZHh9XCI+PC9zcGFuPmA7XG5cbiAgLy8gU3RhdHVzLWVkaXQgaW5saW5lIHdpZGdldCAoc2F2ZWQgcm93cyBvbmx5KVxuICBjb25zdCBzdGF0dXNFZGl0V2lkZ2V0ID0gcm93LnR5cGUgPT09ICdzYXZlZCdcbiAgICA/IGA8c3BhbiBpZD1cInNtLXN0YXR1cy1lZGl0LSR7cm93LmlkeH1cIiBzdHlsZT1cImRpc3BsYXk6bm9uZTthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjRweDttYXJnaW4tdG9wOjJweDtcIj5gICtcbiAgICAgICAgYDxzZWxlY3QgaWQ9XCJzbS1zdGF0dXMtc2VsLSR7cm93LmlkeH1cIiBjbGFzcz1cInNtLWtleS1pbnB1dFwiIHN0eWxlPVwiYm9yZGVyOjFweCBzb2xpZCAjM2I4MmY2O2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6MnB4IDRweDtmb250LXNpemU6MTJweDtcIiBhcmlhLWxhYmVsPVwiU2VsZWN0IGFwcGxpY2F0aW9uIHN0YXR1c1wiPmAgK1xuICAgICAgICAgIGA8b3B0aW9uIHZhbHVlPVwiXCI+LS0gY2xlYXIgLS08L29wdGlvbj5gICtcbiAgICAgICAgICBPYmplY3QuZW50cmllcyhhcHBTdGF0dXNMYWJlbHMpLm1hcCgoW3YsIGxdKSA9PlxuICAgICAgICAgICAgYDxvcHRpb24gdmFsdWU9XCIke3Z9XCIke2FwcFN0YXR1cyA9PT0gdiA/ICcgc2VsZWN0ZWQnIDogJyd9PiR7bH08L29wdGlvbj5gXG4gICAgICAgICAgKS5qb2luKCcnKSArXG4gICAgICAgIGA8L3NlbGVjdD5gICtcbiAgICAgICAgYDxidXR0b24gZGF0YS1zbS1hY3Rpb249XCJzdWJtaXQtc3RhdHVzXCIgZGF0YS1zbS1wYXRoPVwiJHtlc2NhcGVIdG1sKHJvdy5wYXRoIHx8ICcnKX1cIiBkYXRhLXNtLWlkeD1cIiR7cm93LmlkeH1cIiBjbGFzcz1cInNtLWJ0blwiIHRpdGxlPVwiU2F2ZSBzdGF0dXNcIiBhcmlhLWxhYmVsPVwiU2F2ZSBzdGF0dXNcIj4mIzEwMDAzOzwvYnV0dG9uPmAgK1xuICAgICAgICBgPGJ1dHRvbiBkYXRhLXNtLWFjdGlvbj1cImNhbmNlbC1zdGF0dXNcIiBkYXRhLXNtLWlkeD1cIiR7cm93LmlkeH1cIiBjbGFzcz1cInNtLWJ0blwiIHRpdGxlPVwiQ2FuY2VsXCIgYXJpYS1sYWJlbD1cIkNhbmNlbCBzdGF0dXMgZWRpdFwiPiYjMTAwMDU7PC9idXR0b24+YCArXG4gICAgICBgPC9zcGFuPmBcbiAgICA6ICcnO1xuXG4gIC8vIE5vdGVzLWVkaXQgaW5saW5lIHdpZGdldCAoc2F2ZWQgcm93cyBvbmx5KVxuICBjb25zdCBub3Rlc1ByZXZpZXcgPSByb3cubm90ZXNcbiAgICA/IGA8ZGl2IGlkPVwic20tbm90ZXMtcHJldmlldy0ke3Jvdy5pZHh9XCIgc3R5bGU9XCJmb250LXNpemU6MC43OGVtO2NvbG9yOiM5NGEzYjg7bWFyZ2luLXRvcDoycHg7bWF4LXdpZHRoOjI2MHB4O292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3doaXRlLXNwYWNlOm5vd3JhcDtcIiB0aXRsZT1cIiR7ZXNjYXBlSHRtbChyb3cubm90ZXMpfVwiPiR7ZXNjYXBlSHRtbChyb3cubm90ZXMpfTwvZGl2PmBcbiAgICA6IGA8ZGl2IGlkPVwic20tbm90ZXMtcHJldmlldy0ke3Jvdy5pZHh9XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7Zm9udC1zaXplOjAuNzhlbTtjb2xvcjojOTRhM2I4O21hcmdpbi10b3A6MnB4O1wiPjwvZGl2PmA7XG4gIGNvbnN0IG5vdGVzRWRpdFdpZGdldCA9IHJvdy50eXBlID09PSAnc2F2ZWQnXG4gICAgPyBgPHNwYW4gaWQ9XCJzbS1ub3Rlcy1lZGl0LSR7cm93LmlkeH1cIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Z2FwOjRweDttYXJnaW4tdG9wOjRweDt3aWR0aDoxMDAlO1wiPmAgK1xuICAgICAgICBgPHRleHRhcmVhIGlkPVwic20tbm90ZXMtdGEtJHtyb3cuaWR4fVwiIHJvd3M9XCIyXCIgbWF4bGVuZ3RoPVwiMjAwMFwiYCArXG4gICAgICAgICAgYCBzdHlsZT1cIndpZHRoOjEwMCU7Zm9udC1zaXplOjEycHg7cGFkZGluZzo0cHg7Ym9yZGVyOjFweCBzb2xpZCAjM2I4MmY2O2JvcmRlci1yYWRpdXM6NHB4O3Jlc2l6ZTp2ZXJ0aWNhbDtcImAgK1xuICAgICAgICAgIGAgYXJpYS1sYWJlbD1cIlNlc3Npb24gbm90ZXNcIiBwbGFjZWhvbGRlcj1cImUuZy4sIEludGVydmlld2VkIDIwMjUtMDMtMTAsIGF3YWl0aW5nIGNhbGxiYWNrXCI+JHtlc2NhcGVIdG1sKHJvdy5ub3RlcyB8fCAnJyl9PC90ZXh0YXJlYT5gICtcbiAgICAgICAgYDxzcGFuIHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDo0cHg7XCI+YCArXG4gICAgICAgICAgYDxidXR0b24gZGF0YS1zbS1hY3Rpb249XCJzdWJtaXQtbm90ZXNcIiBkYXRhLXNtLXBhdGg9XCIke2VzY2FwZUh0bWwocm93LnBhdGggfHwgJycpfVwiIGRhdGEtc20taWR4PVwiJHtyb3cuaWR4fVwiIGNsYXNzPVwic20tYnRuXCIgdGl0bGU9XCJTYXZlIG5vdGVzXCIgYXJpYS1sYWJlbD1cIlNhdmUgbm90ZXNcIj4mIzEwMDAzOzwvYnV0dG9uPmAgK1xuICAgICAgICAgIGA8YnV0dG9uIGRhdGEtc20tYWN0aW9uPVwiY2FuY2VsLW5vdGVzXCIgZGF0YS1zbS1pZHg9XCIke3Jvdy5pZHh9XCIgY2xhc3M9XCJzbS1idG5cIiB0aXRsZT1cIkNhbmNlbFwiIGFyaWEtbGFiZWw9XCJDYW5jZWwgbm90ZXMgZWRpdFwiPiYjMTAwMDU7PC9idXR0b24+YCArXG4gICAgICAgIGA8L3NwYW4+YCArXG4gICAgICBgPC9zcGFuPmBcbiAgICA6ICcnO1xuXG4gIGlmIChyb3cudHlwZSA9PT0gJ3NhdmVkJykge1xuICAgIGFjdGlvbkh0bWwgKz1cbiAgICAgIGA8YnV0dG9uIGRhdGEtc20tYWN0aW9uPVwiZWRpdC1zdGF0dXNcIiBkYXRhLXNtLXBhdGg9XCIke2VzY2FwZUh0bWwocm93LnBhdGggfHwgJycpfVwiIGRhdGEtc20taWR4PVwiJHtyb3cuaWR4fVwiIGNsYXNzPVwic20tYnRuIHNtLWJ0bi1pY29uXCIgdGl0bGU9XCJVcGRhdGUgYXBwbGljYXRpb24gc3RhdHVzXCIgYXJpYS1sYWJlbD1cIlVwZGF0ZSBhcHBsaWNhdGlvbiBzdGF0dXNcIj48aSBjbGFzcz1cImZhLXNvbGlkIGZhLXRhZ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT48L2J1dHRvbj5gO1xuICAgIGFjdGlvbkh0bWwgKz1cbiAgICAgIGA8YnV0dG9uIGRhdGEtc20tYWN0aW9uPVwiZWRpdC1ub3Rlc1wiIGRhdGEtc20tcGF0aD1cIiR7ZXNjYXBlSHRtbChyb3cucGF0aCB8fCAnJyl9XCIgZGF0YS1zbS1pZHg9XCIke3Jvdy5pZHh9XCIgY2xhc3M9XCJzbS1idG4gc20tYnRuLWljb25cIiB0aXRsZT1cIkVkaXQgbm90ZXNcIiBhcmlhLWxhYmVsPVwiRWRpdCBub3Rlc1wiPjxpIGNsYXNzPVwiZmEtc29saWQgZmEtbm90ZS1zdGlja3lcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+PC9idXR0b24+YDtcbiAgfVxuXG4gIGNvbnN0IGF0c1Njb3JlTGFiZWwgPSByb3cuYXRzU2NvcmUgIT0gbnVsbFxuICAgID8gKCgpID0+IHtcbiAgICAgICAgY29uc3QgcyA9IE51bWJlcihyb3cuYXRzU2NvcmUpO1xuICAgICAgICBjb25zdCBjb2xvciA9IHMgPj0gNzUgPyAnIzA1OTY2OScgOiBzID49IDUwID8gJyNkOTc3MDYnIDogJyNkYzI2MjYnO1xuICAgICAgICByZXR1cm4gYCA8c3BhbiB0aXRsZT1cIkFUUyBtYXRjaCBzY29yZVwiIHN0eWxlPVwiZm9udC1zaXplOjAuNzhlbTtwYWRkaW5nOjFweCA1cHg7Ym9yZGVyLXJhZGl1czo5cHg7YmFja2dyb3VuZDoke2NvbG9yfTtjb2xvcjojZmZmO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtmb250LXdlaWdodDo2MDA7XCI+JHtzfSU8L3NwYW4+YDtcbiAgICAgIH0pKClcbiAgICA6ICcnO1xuXG4gIHJldHVybiBgPGRpdiBjbGFzcz1cIiR7cm93Q2xhc3N9XCI+YCArXG4gICAgYDxzcGFuIGNsYXNzPVwic20tdGQgc20tdGQtbmFtZVwiPiR7bmFtZUNlbGx9PC9zcGFuPmAgK1xuICAgIGA8c3BhbiBjbGFzcz1cInNtLXRkIHNtLXRkLXN0YXR1c1wiPiR7c3RhdHVzUGlsbH08L3NwYW4+YCArXG4gICAgYDxzcGFuIGNsYXNzPVwic20tdGQgc20tdGQtcGhhc2VcIj48c3BhbiBpZD1cInNtLXBoYXNlLSR7cm93LmlkeH1cIj4ke3BoYXNlTGFiZWx9JHthdHNTY29yZUxhYmVsfSR7YXBwU3RhdHVzQmFkZ2V9PC9zcGFuPiR7c3RhdHVzRWRpdFdpZGdldH0ke25vdGVzUHJldmlld30ke25vdGVzRWRpdFdpZGdldH08L3NwYW4+YCArXG4gICAgYDxzcGFuIGNsYXNzPVwic20tdGQgc20tdGQtZGF0ZVwiPiR7bW9kTGFiZWx9PC9zcGFuPmAgK1xuICAgIGA8c3BhbiBjbGFzcz1cInNtLXRkIHNtLXRkLWFjdGlvbnNcIj4ke2FjdGlvbkh0bWx9PC9zcGFuPmAgK1xuICAgIGA8L2Rpdj5gO1xufVxuXG5mdW5jdGlvbiBfcmVuZGVyUmVjZW50c1N0cmlwKHJlY2VudFJvd3MpIHtcbiAgaWYgKCFyZWNlbnRSb3dzLmxlbmd0aCkgcmV0dXJuICcnO1xuICBjb25zdCBpdGVtcyA9IHJlY2VudFJvd3MubWFwKHJvdyA9PiB7XG4gICAgY29uc3QgbGFiZWwgICAgPSBlc2NhcGVIdG1sKHJvdy5uYW1lKTtcbiAgICBjb25zdCBkb3RDbGFzcyA9IHJvdy50eXBlID09PSAnYWN0aXZlJ1xuICAgICAgPyAocm93Lm93bmVyc2hpcC5pc0N1cnJlbnQgPyAnc20tcmVjZW50LWRvdC1jdXJyZW50JyA6ICdzbS1yZWNlbnQtZG90LW90aGVyJylcbiAgICAgIDogJ3NtLXJlY2VudC1kb3Qtc2F2ZWQnO1xuICAgIGNvbnN0IGRvdCA9IGA8c3BhbiBjbGFzcz1cInNtLXJlY2VudC1kb3QgJHtkb3RDbGFzc31cIj48L3NwYW4+YDtcbiAgICBpZiAocm93LnR5cGUgPT09ICdhY3RpdmUnKSB7XG4gICAgICBjb25zdCBocmVmICA9IGAvP3Nlc3Npb249JHtlbmNvZGVVUklDb21wb25lbnQocm93LnNlc3Npb25JZCB8fCAnJyl9YDtcbiAgICAgIGNvbnN0IGV4dHJhID0gcm93Lm93bmVyc2hpcC5pc0N1cnJlbnQgPyAnIHNtLXJlY2VudC1jdXJyZW50JyA6ICcnO1xuICAgICAgcmV0dXJuIGA8YSBjbGFzcz1cInNtLXJlY2VudC1pdGVtJHtleHRyYX1cIiBocmVmPVwiJHtocmVmfVwiPiR7ZG90fSR7bGFiZWx9PC9hPmA7XG4gICAgfVxuICAgIHJldHVybiBgPGJ1dHRvbiBjbGFzcz1cInNtLXJlY2VudC1pdGVtXCIgZGF0YS1zbS1hY3Rpb249XCJsb2FkXCIgZGF0YS1zbS1wYXRoPVwiJHtlc2NhcGVIdG1sKHJvdy5wYXRoIHx8ICcnKX1cIj4ke2RvdH0ke2xhYmVsfTwvYnV0dG9uPmA7XG4gIH0pLmpvaW4oJycpO1xuICByZXR1cm4gYDxkaXYgY2xhc3M9XCJzbS1yZWNlbnRzXCI+PGRpdiBjbGFzcz1cInNtLXJlY2VudHMtbGFiZWxcIj5SZWNlbnQ8L2Rpdj48ZGl2IGNsYXNzPVwic20tcmVjZW50cy1saXN0XCI+JHtpdGVtc308L2Rpdj48L2Rpdj5gO1xufVxuXG5mdW5jdGlvbiBfcmVuZGVyU2Vzc2lvblRhYmxlRnJvbUNhY2hlKCkge1xuICBjb25zdCBib2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Nlc3Npb25zLW1vZGFsLWJvZHknKTtcbiAgaWYgKCFib2R5KSByZXR1cm47XG5cbiAgY29uc3Qgcm93cyAgID0gX25vcm1hbGl6ZVNlc3Npb25zRm9yVGFibGUoX3NtQWN0aXZlQ2FjaGUsIF9zbVNhdmVkQ2FjaGUpO1xuICBjb25zdCBieURhdGUgPSBfc29ydFNlc3Npb25Sb3dzKHJvd3MsICdsYXN0TW9kaWZpZWQnLCAnZGVzYycpO1xuICBjb25zdCBzb3J0ZWQgPSBfc29ydFNlc3Npb25Sb3dzKHJvd3MsIF9zbVNvcnRLZXksIF9zbVNvcnREaXIpO1xuXG4gIGlmIChzb3J0ZWQubGVuZ3RoID09PSAwKSB7XG4gICAgYm9keS5pbm5lckhUTUwgPSAnPHAgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLWVtcHR5XCIgc3R5bGU9XCJwYWRkaW5nOjI0cHggMTZweDtcIj5ObyBzZXNzaW9ucyBmb3VuZC4gQ3JlYXRlIG9uZSB0byBnZXQgc3RhcnRlZC48L3A+JztcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwYXJ0cyA9IFtcbiAgICBfc21BY3RpdmVDYWNoZS5sZW5ndGggPyBgJHtfc21BY3RpdmVDYWNoZS5sZW5ndGh9IGFjdGl2ZWAgOiAnJyxcbiAgICBfc21TYXZlZENhY2hlLmxlbmd0aCAgPyBgJHtfc21TYXZlZENhY2hlLmxlbmd0aH0gc2F2ZWRgICAgOiAnJyxcbiAgXS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgYm9keS5pbm5lckhUTUwgPVxuICAgIF9yZW5kZXJSZWNlbnRzU3RyaXAoYnlEYXRlLnNsaWNlKDAsIDUpKSArXG4gICAgYDxkaXYgY2xhc3M9XCJzbS10YWJsZS13cmFwXCI+YCArXG4gICAgICBgPGRpdiBjbGFzcz1cInNtLXRhYmxlLWluZm9cIj4ke3BhcnRzLmpvaW4oJyBcXHUwMGI3ICcpfTwvZGl2PmAgK1xuICAgICAgX3JlbmRlclNlc3Npb25UYWJsZUhlYWRlcigpICtcbiAgICAgIGA8ZGl2IGNsYXNzPVwic20tdGJvZHlcIj4ke3NvcnRlZC5tYXAoX3JlbmRlclNlc3Npb25UYWJsZVJvdykuam9pbignJyl9PC9kaXY+YCArXG4gICAgYDwvZGl2PmA7XG59XG5cbmZ1bmN0aW9uIF9oYW5kbGVTZXNzaW9uTW9kYWxDbGljayhlKSB7XG4gIGNvbnN0IHNvcnRCdG4gPSBlLnRhcmdldC5jbG9zZXN0KCdbZGF0YS1zbS1zb3J0XScpO1xuICBpZiAoc29ydEJ0bikgeyBfc2V0U21Tb3J0KHNvcnRCdG4uZGF0YXNldC5zbVNvcnQpOyByZXR1cm47IH1cblxuICBjb25zdCBidG4gPSBlLnRhcmdldC5jbG9zZXN0KCdbZGF0YS1zbS1hY3Rpb25dJyk7XG4gIGlmICghYnRuKSByZXR1cm47XG4gIGNvbnN0IHBhdGggICA9IGJ0bi5kYXRhc2V0LnNtUGF0aDtcbiAgY29uc3QgaWR4ICAgID0gcGFyc2VJbnQoYnRuLmRhdGFzZXQuc21JZHggPz8gJy0xJywgMTApO1xuICBjb25zdCBhY3Rpb24gPSBidG4uZGF0YXNldC5zbUFjdGlvbjtcbiAgaWYgICAgICAoYWN0aW9uID09PSAncmVuYW1lJykgICAgICAgIHN0YXJ0U2Vzc2lvbk1vZGFsUmVuYW1lKHBhdGgsIGlkeCk7XG4gIGVsc2UgaWYgKGFjdGlvbiA9PT0gJ3N1Ym1pdC1yZW5hbWUnKSBzdWJtaXRTZXNzaW9uTW9kYWxSZW5hbWUocGF0aCwgaWR4KTtcbiAgZWxzZSBpZiAoYWN0aW9uID09PSAnY2FuY2VsLXJlbmFtZScpIGNhbmNlbFNlc3Npb25Nb2RhbFJlbmFtZShpZHgpO1xuICBlbHNlIGlmIChhY3Rpb24gPT09ICdlZGl0LXN0YXR1cycpICAgc3RhcnRTZXNzaW9uU3RhdHVzRWRpdChpZHgpO1xuICBlbHNlIGlmIChhY3Rpb24gPT09ICdzdWJtaXQtc3RhdHVzJykgc3VibWl0U2Vzc2lvblN0YXR1c0VkaXQocGF0aCwgaWR4KTtcbiAgZWxzZSBpZiAoYWN0aW9uID09PSAnY2FuY2VsLXN0YXR1cycpIGNhbmNlbFNlc3Npb25TdGF0dXNFZGl0KGlkeCk7XG4gIGVsc2UgaWYgKGFjdGlvbiA9PT0gJ2VkaXQtbm90ZXMnKSAgICBzdGFydFNlc3Npb25Ob3Rlc0VkaXQoaWR4KTtcbiAgZWxzZSBpZiAoYWN0aW9uID09PSAnc3VibWl0LW5vdGVzJykgIHN1Ym1pdFNlc3Npb25Ob3Rlc0VkaXQocGF0aCwgaWR4KTtcbiAgZWxzZSBpZiAoYWN0aW9uID09PSAnY2FuY2VsLW5vdGVzJykgIGNhbmNlbFNlc3Npb25Ob3Rlc0VkaXQoaWR4KTtcbiAgZWxzZSBpZiAoYWN0aW9uID09PSAnbG9hZCcpICAgICAgICAgIGxvYWRTZXNzaW9uQW5kQ2xvc2VNb2RhbChwYXRoKTtcbiAgZWxzZSBpZiAoYWN0aW9uID09PSAnZHVwbGljYXRlJykgICAgIF9kdXBsaWNhdGVTZXNzaW9uRnJvbU1vZGFsKHBhdGgpO1xuICBlbHNlIGlmIChhY3Rpb24gPT09ICdkZWxldGUnKSAgICAgICAgX2RlbGV0ZVNlc3Npb25Gcm9tTW9kYWwocGF0aCwgZSk7XG59XG5cbmZ1bmN0aW9uIF9oYW5kbGVTZXNzaW9uTW9kYWxLZXlkb3duKGUpIHtcbiAgaWYgKChlLmtleSA9PT0gJ0VudGVyJyB8fCBlLmtleSA9PT0gJyAnKSAmJiBlLnRhcmdldC5jbG9zZXN0KCdbZGF0YS1zbS1zb3J0XScpKSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIF9zZXRTbVNvcnQoZS50YXJnZXQuY2xvc2VzdCgnW2RhdGEtc20tc29ydF0nKS5kYXRhc2V0LnNtU29ydCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGlucHV0ID0gZS50YXJnZXQuY2xvc2VzdCgnLnNtLWtleS1pbnB1dCcpO1xuICBpZiAoIWlucHV0KSByZXR1cm47XG4gIGNvbnN0IHBhdGggPSBpbnB1dC5kYXRhc2V0LnNtUGF0aDtcbiAgY29uc3QgaWR4ICA9IHBhcnNlSW50KGlucHV0LmRhdGFzZXQuc21JZHgsIDEwKTtcbiAgaWYgICAgICAoZS5rZXkgPT09ICdFbnRlcicpICBzdWJtaXRTZXNzaW9uTW9kYWxSZW5hbWUocGF0aCwgaWR4KTtcbiAgZWxzZSBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSBjYW5jZWxTZXNzaW9uTW9kYWxSZW5hbWUoaWR4KTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFNlc3Npb25zIG1vZGFsIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBvcGVuU2Vzc2lvbnNNb2RhbCh7IHJlcXVpcmVkID0gZmFsc2UgfSA9IHt9KSB7XG4gIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2Vzc2lvbnMtbW9kYWwtb3ZlcmxheScpO1xuICBpZiAoIW92ZXJsYXkpIHJldHVybjtcbiAgb3ZlcmxheS5kYXRhc2V0LmRpc21pc3NEaXNhYmxlZCA9IHJlcXVpcmVkID8gJzEnIDogJyc7XG4gIGNvbnN0IGNsb3NlWCAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Nlc3Npb25zLW1vZGFsLWNsb3NlLXgnKTtcbiAgY29uc3QgY2xvc2VGb290ZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2Vzc2lvbnMtbW9kYWwtY2xvc2UtZm9vdGVyJyk7XG4gIGlmIChjbG9zZVgpICAgICAgY2xvc2VYLnN0eWxlLmRpc3BsYXkgICAgICA9IHJlcXVpcmVkID8gJ25vbmUnIDogJyc7XG4gIGlmIChjbG9zZUZvb3RlcikgY2xvc2VGb290ZXIuc3R5bGUuZGlzcGxheSA9IHJlcXVpcmVkID8gJ25vbmUnIDogJyc7XG4gIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgd2luZG93Ll9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgYXdhaXQgX3JlbmRlclNlc3Npb25zTW9kYWxCb2R5KCk7XG4gIF9yZWZyZXNoVHJhc2hCYWRnZSgpO1xuICB0cmFwRm9jdXMoJ3Nlc3Npb25zLW1vZGFsLW92ZXJsYXknKTtcbiAgc2V0SW5pdGlhbEZvY3VzKCdzZXNzaW9ucy1tb2RhbC1vdmVybGF5Jyk7XG59XG5cbmZ1bmN0aW9uIGNsb3NlU2Vzc2lvbnNNb2RhbCgpIHtcbiAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXNzaW9ucy1tb2RhbC1vdmVybGF5Jyk7XG4gIGlmICghb3ZlcmxheSkgcmV0dXJuO1xuICBpZiAob3ZlcmxheS5kYXRhc2V0LmRpc21pc3NEaXNhYmxlZCA9PT0gJzEnKSByZXR1cm47XG4gIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgcmVzdG9yZUZvY3VzKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9yZW5kZXJTZXNzaW9uc01vZGFsQm9keSgpIHtcbiAgY29uc3QgYm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXNzaW9ucy1tb2RhbC1ib2R5Jyk7XG4gIGlmICghYm9keSkgcmV0dXJuO1xuICBib2R5LmlubmVySFRNTCA9ICc8ZGl2IHN0eWxlPVwicGFkZGluZzoyNHB4O2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjtnYXA6MTBweDtjb2xvcjojNmI3MjgwO1wiPjxzcGFuIGNsYXNzPVwibG9hZGluZy1zcGlubmVyXCI+PC9zcGFuPiBMb2FkaW5nIHNlc3Npb25zXFx1MjAyNjwvZGl2Pic7XG4gIHRyeSB7XG4gICAgY29uc3QgW2FjdGl2ZVJlcywgc2F2ZWRSZXNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgZmV0Y2goJy9hcGkvc2Vzc2lvbnMvYWN0aXZlJyksXG4gICAgICBmZXRjaCgnL2FwaS9zZXNzaW9ucycpLFxuICAgIF0pO1xuICAgIF9zbUFjdGl2ZUNhY2hlID0gYWN0aXZlUmVzLm9rID8gKChhd2FpdCBhY3RpdmVSZXMuanNvbigpKS5zZXNzaW9ucyB8fCBbXSkgOiBbXTtcbiAgICBjb25zdCBzYXZlZERhdGEgPSBzYXZlZFJlcy5vayA/IHBhcnNlU2Vzc2lvbkxpc3RSZXNwb25zZShhd2FpdCBzYXZlZFJlcy5qc29uKCkpIDogeyBzZXNzaW9uczogW10gfTtcbiAgICBfc21TYXZlZENhY2hlICAgPSBzYXZlZERhdGEuc2Vzc2lvbnMgfHwgW107XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBib2R5LmlubmVySFRNTCA9IGA8cCBzdHlsZT1cInBhZGRpbmc6MjBweDtjb2xvcjojZWY0NDQ0O1wiPkNvdWxkIG5vdCBsb2FkIHNlc3Npb25zOiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX08L3A+YDtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gV2lyZSBldmVudCBkZWxlZ2F0aW9uIG9uY2U7IHBlcnNpc3RzIGFjcm9zcyByZS1yZW5kZXJzIHNpbmNlIGJvZHkgZWxlbWVudCBpcyBzdGFibGVcbiAgaWYgKCFib2R5Ll9zbUxpc3RlbmVyQXR0YWNoZWQpIHtcbiAgICBib2R5Ll9zbUxpc3RlbmVyQXR0YWNoZWQgPSB0cnVlO1xuICAgIGJvZHkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAgIF9oYW5kbGVTZXNzaW9uTW9kYWxDbGljayk7XG4gICAgYm9keS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgX2hhbmRsZVNlc3Npb25Nb2RhbEtleWRvd24pO1xuICB9XG4gIF9yZW5kZXJTZXNzaW9uVGFibGVGcm9tQ2FjaGUoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9hZFNlc3Npb25BbmRDbG9zZU1vZGFsKHBhdGgpIHtcbiAgLy8gQ2xlYXIgZGlzbWlzc0Rpc2FibGVkIHNvIGxvYWRpbmcgYSBzZXNzaW9uIGFsd2F5cyBjbG9zZXMgdGhlIG1vZGFsLFxuICAvLyBldmVuIHdoZW4gaXQgd2FzIG9wZW5lZCBpbiByZXF1aXJlZCAoc3RhcnR1cCkgbW9kZS5cbiAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXNzaW9ucy1tb2RhbC1vdmVybGF5Jyk7XG4gIGlmIChvdmVybGF5KSBvdmVybGF5LmRhdGFzZXQuZGlzbWlzc0Rpc2FibGVkID0gJyc7XG4gIGNsb3NlU2Vzc2lvbnNNb2RhbCgpO1xuICBhd2FpdCBsb2FkU2Vzc2lvbkZpbGUocGF0aCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG5ld1Nlc3Npb25Gcm9tTW9kYWwoKSB7XG4gIGNsb3NlU2Vzc2lvbnNNb2RhbCgpO1xuICBhd2FpdCBjcmVhdGVOZXdTZXNzaW9uQW5kTmF2aWdhdGUoKTtcbn1cblxuZnVuY3Rpb24gc3RhcnRTZXNzaW9uTW9kYWxSZW5hbWUocGF0aCwgaWR4KSB7XG4gIGNvbnN0IG5hbWVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzbS1uYW1lLSR7aWR4fWApO1xuICBjb25zdCBmb3JtICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc20tcmVuYW1lLSR7aWR4fWApO1xuICBpZiAobmFtZUVsKSBuYW1lRWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgaWYgKGZvcm0pICAgZm9ybS5zdHlsZS5kaXNwbGF5ICAgPSAnZmxleCc7XG4gIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNtLWlucHV0LSR7aWR4fWApO1xuICBpZiAoaW5wdXQpIHsgaW5wdXQuZm9jdXMoKTsgaW5wdXQuc2VsZWN0KCk7IH1cbn1cblxuZnVuY3Rpb24gY2FuY2VsU2Vzc2lvbk1vZGFsUmVuYW1lKGlkeCkge1xuICBjb25zdCBuYW1lRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc20tbmFtZS0ke2lkeH1gKTtcbiAgY29uc3QgZm9ybSAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNtLXJlbmFtZS0ke2lkeH1gKTtcbiAgaWYgKGZvcm0pICAgZm9ybS5zdHlsZS5kaXNwbGF5ICAgPSAnbm9uZSc7XG4gIGlmIChuYW1lRWwpIG5hbWVFbC5zdHlsZS5kaXNwbGF5ID0gJyc7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN1Ym1pdFNlc3Npb25Nb2RhbFJlbmFtZShwYXRoLCBpZHgpIHtcbiAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc20taW5wdXQtJHtpZHh9YCk7XG4gIGlmICghaW5wdXQpIHJldHVybjtcbiAgY29uc3QgbmV3TmFtZSA9IGlucHV0LnZhbHVlLnRyaW0oKTtcbiAgaWYgKCFuZXdOYW1lKSByZXR1cm47XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL3JlbmFtZS1zZXNzaW9uJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBwYXRoLCBuZXdfbmFtZTogbmV3TmFtZSB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgY29uc3QgbmFtZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNtLW5hbWUtJHtpZHh9YCk7XG4gICAgICBpZiAobmFtZUVsKSBuYW1lRWwudGV4dENvbnRlbnQgPSBuZXdOYW1lO1xuICAgICAgY2FuY2VsU2Vzc2lvbk1vZGFsUmVuYW1lKGlkeCk7XG4gICAgICBhd2FpdCBmZXRjaFN0YXR1cygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHlwZW9mIHNob3dUb2FzdCA9PT0gJ2Z1bmN0aW9uJykgc2hvd1RvYXN0KGBSZW5hbWUgZmFpbGVkOiAke2RhdGEuZXJyb3J9YCwgJ2Vycm9yJyk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7IGlmICh0eXBlb2Ygc2hvd1RvYXN0ID09PSAnZnVuY3Rpb24nKSBzaG93VG9hc3QoYFJlbmFtZSBlcnJvcjogJHtlLm1lc3NhZ2V9YCwgJ2Vycm9yJyk7IH1cbn1cblxuZnVuY3Rpb24gc3RhcnRTZXNzaW9uU3RhdHVzRWRpdChpZHgpIHtcbiAgY29uc3QgcGhhc2VFbCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc20tcGhhc2UtJHtpZHh9YCk7XG4gIGNvbnN0IGVkaXRXaWRnZXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc20tc3RhdHVzLWVkaXQtJHtpZHh9YCk7XG4gIGlmIChwaGFzZUVsKSAgICBwaGFzZUVsLnN0eWxlLmRpc3BsYXkgICAgPSAnbm9uZSc7XG4gIGlmIChlZGl0V2lkZ2V0KSBlZGl0V2lkZ2V0LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIGNvbnN0IHNlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzbS1zdGF0dXMtc2VsLSR7aWR4fWApO1xuICBpZiAoc2VsKSBzZWwuZm9jdXMoKTtcbn1cblxuZnVuY3Rpb24gY2FuY2VsU2Vzc2lvblN0YXR1c0VkaXQoaWR4KSB7XG4gIGNvbnN0IHBoYXNlRWwgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc20tcGhhc2UtJHtpZHh9YCk7XG4gIGNvbnN0IGVkaXRXaWRnZXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc20tc3RhdHVzLWVkaXQtJHtpZHh9YCk7XG4gIGlmIChlZGl0V2lkZ2V0KSBlZGl0V2lkZ2V0LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIGlmIChwaGFzZUVsKSAgICBwaGFzZUVsLnN0eWxlLmRpc3BsYXkgICAgPSAnJztcbn1cblxuYXN5bmMgZnVuY3Rpb24gc3VibWl0U2Vzc2lvblN0YXR1c0VkaXQocGF0aCwgaWR4KSB7XG4gIGNvbnN0IHNlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzbS1zdGF0dXMtc2VsLSR7aWR4fWApO1xuICBpZiAoIXNlbCkgcmV0dXJuO1xuICBjb25zdCBuZXdTdGF0dXMgPSBzZWwudmFsdWU7XG4gIGNvbnN0IF9hcHBTdGF0dXNMYWJlbHMgPSB7XG4gICAgZHJhZnQ6ICdEcmFmdCcsIHJlYWR5OiAnUmVhZHknLCBzZW50OiAnU2VudCcsIHF1ZXVlZDogJ1F1ZXVlZCcsXG4gICAgaW50ZXJ2aWV3OiAnSW50ZXJ2aWV3JywgcmVqZWN0ZWQ6ICdSZWplY3RlZCcsIGFjY2VwdGVkOiAnQWNjZXB0ZWQnLFxuICAgIHBhcmtlZDogJ1BhcmtlZCcsXG4gIH07XG4gIGNvbnN0IF9hcHBTdGF0dXNDb2xvcnMgPSB7XG4gICAgZHJhZnQ6ICcjOTRhM2I4JywgcmVhZHk6ICcjM2I4MmY2Jywgc2VudDogJyMyMmM1NWUnLCBxdWV1ZWQ6ICcjZWFiMzA4JyxcbiAgICBpbnRlcnZpZXc6ICcjYTg1NWY3JywgcmVqZWN0ZWQ6ICcjZWY0NDQ0JywgYWNjZXB0ZWQ6ICcjMDU5NjY5JyxcbiAgICBwYXJrZWQ6ICcjZjk3MzE2JyxcbiAgfTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvc2Vzc2lvbnMvbWV0YWRhdGEnLCB7XG4gICAgICBtZXRob2Q6ICdQQVRDSCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBwYXRoLCBhcHBsaWNhdGlvbl9zdGF0dXM6IG5ld1N0YXR1cyB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgY29uc3QgYmFkZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc20tc3RhdHVzLWJhZGdlLSR7aWR4fWApO1xuICAgICAgaWYgKGJhZGdlKSB7XG4gICAgICAgIGlmIChuZXdTdGF0dXMgJiYgX2FwcFN0YXR1c0xhYmVsc1tuZXdTdGF0dXNdKSB7XG4gICAgICAgICAgYmFkZ2UudGV4dENvbnRlbnQgPSBfYXBwU3RhdHVzTGFiZWxzW25ld1N0YXR1c107XG4gICAgICAgICAgYmFkZ2Uuc3R5bGUuY3NzVGV4dCA9IGBmb250LXNpemU6MC43NWVtO3BhZGRpbmc6MXB4IDZweDtib3JkZXItcmFkaXVzOjlweDtiYWNrZ3JvdW5kOiR7X2FwcFN0YXR1c0NvbG9yc1tuZXdTdGF0dXNdfTtjb2xvcjojZmZmO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtgO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJhZGdlLnRleHRDb250ZW50ID0gJyc7XG4gICAgICAgICAgYmFkZ2Uuc3R5bGUuY3NzVGV4dCA9ICcnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjYW5jZWxTZXNzaW9uU3RhdHVzRWRpdChpZHgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHlwZW9mIHNob3dUb2FzdCA9PT0gJ2Z1bmN0aW9uJykgc2hvd1RvYXN0KGBTdGF0dXMgdXBkYXRlIGZhaWxlZDogJHtkYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yJ31gLCAnZXJyb3InKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAodHlwZW9mIHNob3dUb2FzdCA9PT0gJ2Z1bmN0aW9uJykgc2hvd1RvYXN0KGBTdGF0dXMgdXBkYXRlIGVycm9yOiAke2UubWVzc2FnZX1gLCAnZXJyb3InKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzdGFydFNlc3Npb25Ob3Rlc0VkaXQoaWR4KSB7XG4gIGNvbnN0IGVkaXRXaWRnZXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc20tbm90ZXMtZWRpdC0ke2lkeH1gKTtcbiAgY29uc3QgcHJldmlldyAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzbS1ub3Rlcy1wcmV2aWV3LSR7aWR4fWApO1xuICBpZiAocHJldmlldykgICAgcHJldmlldy5zdHlsZS5kaXNwbGF5ICAgID0gJ25vbmUnO1xuICBpZiAoZWRpdFdpZGdldCkgZWRpdFdpZGdldC5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICBjb25zdCB0YSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzbS1ub3Rlcy10YS0ke2lkeH1gKTtcbiAgaWYgKHRhKSB7IHRhLmZvY3VzKCk7IHRhLnNlbGVjdGlvblN0YXJ0ID0gdGEuc2VsZWN0aW9uRW5kID0gdGEudmFsdWUubGVuZ3RoOyB9XG59XG5cbmZ1bmN0aW9uIGNhbmNlbFNlc3Npb25Ob3Rlc0VkaXQoaWR4KSB7XG4gIGNvbnN0IGVkaXRXaWRnZXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc20tbm90ZXMtZWRpdC0ke2lkeH1gKTtcbiAgY29uc3QgcHJldmlldyAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzbS1ub3Rlcy1wcmV2aWV3LSR7aWR4fWApO1xuICBpZiAoZWRpdFdpZGdldCkgZWRpdFdpZGdldC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBpZiAocHJldmlldykgICAgcHJldmlldy5zdHlsZS5kaXNwbGF5ICAgID0gJyc7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN1Ym1pdFNlc3Npb25Ob3Rlc0VkaXQocGF0aCwgaWR4KSB7XG4gIGNvbnN0IHRhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNtLW5vdGVzLXRhLSR7aWR4fWApO1xuICBpZiAoIXRhKSByZXR1cm47XG4gIGNvbnN0IG5ld05vdGVzID0gdGEudmFsdWU7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL3Nlc3Npb25zL21ldGFkYXRhJywge1xuICAgICAgbWV0aG9kOiAnUEFUQ0gnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcGF0aCwgbm90ZXM6IG5ld05vdGVzIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBjb25zdCBwcmV2aWV3ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNtLW5vdGVzLXByZXZpZXctJHtpZHh9YCk7XG4gICAgICBpZiAocHJldmlldykge1xuICAgICAgICBwcmV2aWV3LnRleHRDb250ZW50ID0gbmV3Tm90ZXM7XG4gICAgICAgIHByZXZpZXcudGl0bGUgICAgICAgPSBuZXdOb3RlcztcbiAgICAgICAgcHJldmlldy5zdHlsZS5kaXNwbGF5ID0gbmV3Tm90ZXMgPyAnJyA6ICdub25lJztcbiAgICAgIH1cbiAgICAgIGNhbmNlbFNlc3Npb25Ob3Rlc0VkaXQoaWR4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHNob3dUb2FzdChgTm90ZXMgdXBkYXRlIGZhaWxlZDogJHtkYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yJ31gLCAnZXJyb3InKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAodHlwZW9mIHNob3dUb2FzdCA9PT0gJ2Z1bmN0aW9uJykgc2hvd1RvYXN0KGBOb3RlcyB1cGRhdGUgZXJyb3I6ICR7ZS5tZXNzYWdlfWAsICdlcnJvcicpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9kZWxldGVTZXNzaW9uRnJvbU1vZGFsKHBhdGgsIGV2ZW50KSB7XG4gIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICBpZiAodHlwZW9mIGNvbmZpcm1EaWFsb2cgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25zdCBvayA9IGF3YWl0IGNvbmZpcm1EaWFsb2coJ01vdmUgdGhpcyBzZXNzaW9uIHRvIFRyYXNoPyBZb3UgY2FuIHJlc3RvcmUgaXQgZnJvbSB0aGUgVHJhc2ggdmlldy4nKTtcbiAgICBpZiAoIW9rKSByZXR1cm47XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvZGVsZXRlLXNlc3Npb24nLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHBhdGggfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgYXdhaXQgX3JlbmRlclNlc3Npb25zTW9kYWxCb2R5KCk7XG4gICAgICBhd2FpdCBfcmVmcmVzaFRyYXNoQmFkZ2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHNob3dUb2FzdChgRmFpbGVkIHRvIG1vdmUgc2Vzc2lvbiB0byBUcmFzaDogJHtkYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yJ31gLCAnZXJyb3InKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHsgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHNob3dUb2FzdChgRXJyb3I6ICR7ZS5tZXNzYWdlfWAsICdlcnJvcicpOyB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBEdXBsaWNhdGUgc2Vzc2lvbiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gX2R1cGxpY2F0ZVNlc3Npb25Gcm9tTW9kYWwocGF0aCkge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9zZXNzaW9ucy9kdXBsaWNhdGUnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHBhdGggfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEub2spIHtcbiAgICAgIGF3YWl0IF9yZW5kZXJTZXNzaW9uc01vZGFsQm9keSgpO1xuICAgICAgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHNob3dUb2FzdChgU2Vzc2lvbiBkdXBsaWNhdGVkOiBcIiR7ZGF0YS5uZXdfbmFtZX1cImApO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHlwZW9mIHNob3dUb2FzdCA9PT0gJ2Z1bmN0aW9uJykgc2hvd1RvYXN0KGBGYWlsZWQgdG8gZHVwbGljYXRlIHNlc3Npb246ICR7ZGF0YS5lcnJvciB8fCAnVW5rbm93biBlcnJvcid9YCwgJ2Vycm9yJyk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7IGlmICh0eXBlb2Ygc2hvd1RvYXN0ID09PSAnZnVuY3Rpb24nKSBzaG93VG9hc3QoYEVycm9yOiAke2UubWVzc2FnZX1gLCAnZXJyb3InKTsgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgVHJhc2ggYmFkZ2UgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIF9yZWZyZXNoVHJhc2hCYWRnZSgpIHtcbiAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Nlc3Npb25zLXRyYXNoLWJ0bicpO1xuICBpZiAoIWJ0bikgcmV0dXJuO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS90cmFzaCcpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGNvbnN0IG4gPSAoZGF0YS5pdGVtcyB8fCBbXSkubGVuZ3RoO1xuICAgIGJ0bi50ZXh0Q29udGVudCA9IG4gPiAwID8gYFx1RDgzRFx1REREMSBUcmFzaCAoJHtufSlgIDogJ1x1RDgzRFx1REREMSBUcmFzaCc7XG4gIH0gY2F0Y2ggKF8pIHsgLyogaWdub3JlICovIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIFRyYXNoIHZpZXcgKGlubGluZSBpbiBzZXNzaW9ucyBtb2RhbCkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIG9wZW5UcmFzaFZpZXcoKSB7XG4gIGNvbnN0IGJvZHkgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXNzaW9ucy1tb2RhbC1ib2R5Jyk7XG4gIGNvbnN0IGZvb3RlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzZXNzaW9ucy1tb2RhbC1vdmVybGF5IC5tb2RhbC1mb290ZXInKTtcbiAgaWYgKCFib2R5KSByZXR1cm47XG5cbiAgYm9keS5pbm5lckhUTUwgPSAnPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjEycHg7cGFkZGluZzoyNHB4O2NvbG9yOiM2YjcyODA7XCI+PGRpdiBjbGFzcz1cImxvYWRpbmctc3Bpbm5lclwiIHN0eWxlPVwid2lkdGg6MjBweDtoZWlnaHQ6MjBweDtib3JkZXItd2lkdGg6MnB4O2ZsZXgtc2hyaW5rOjA7XCI+PC9kaXY+PHNwYW4+TG9hZGluZyB0cmFzaFx1MjAyNjwvc3Bhbj48L2Rpdj4nO1xuXG4gIGlmIChmb290ZXIpIHtcbiAgICBmb290ZXIuaW5uZXJIVE1MID0gYFxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwiZW1wdHlUcmFzaCgpXCJcbiAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZWUyZTI7Y29sb3I6I2RjMjYyNjtib3JkZXItY29sb3I6I2ZlY2FjYTtcIj5FbXB0eSBUcmFzaDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwiY2xvc2VUcmFzaFZpZXcoKVwiPlx1MjE5MCBCYWNrPC9idXR0b24+YDtcbiAgfVxuXG4gIGF3YWl0IF9yZW5kZXJUcmFzaFZpZXcoKTtcbn1cblxuZnVuY3Rpb24gY2xvc2VUcmFzaFZpZXcoKSB7XG4gIGNvbnN0IGZvb3RlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzZXNzaW9ucy1tb2RhbC1vdmVybGF5IC5tb2RhbC1mb290ZXInKTtcbiAgaWYgKGZvb3Rlcikge1xuICAgIGZvb3Rlci5pbm5lckhUTUwgPSBgXG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0blwiIG9uY2xpY2s9XCJuZXdTZXNzaW9uRnJvbU1vZGFsKClcIlxuICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6IzEwYjk4MTtjb2xvcjojZmZmO2JvcmRlci1jb2xvcjojMTBiOTgxO1wiPlx1RkYwQiBOZXcgU2Vzc2lvbjwvYnV0dG9uPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6OHB4O2FsaWduLWl0ZW1zOmNlbnRlcjtcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInNlc3Npb25zLXRyYXNoLWJ0blwiIGNsYXNzPVwiYWN0aW9uLWJ0blwiXG4gICAgICAgICAgb25jbGljaz1cIm9wZW5UcmFzaFZpZXcoKVwiXG4gICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmMWY1Zjk7Y29sb3I6IzY0NzQ4Yjtib3JkZXItY29sb3I6I2UyZThmMDtcIj5cdUQ4M0RcdURERDEgVHJhc2g8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwiY2xvc2VTZXNzaW9uc01vZGFsKClcIj5DbG9zZTwvYnV0dG9uPlxuICAgICAgPC9kaXY+YDtcbiAgfVxuICBfcmVuZGVyU2Vzc2lvbnNNb2RhbEJvZHkoKTtcbiAgX3JlZnJlc2hUcmFzaEJhZGdlKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9yZW5kZXJUcmFzaFZpZXcoKSB7XG4gIGNvbnN0IGJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2Vzc2lvbnMtbW9kYWwtYm9keScpO1xuICBpZiAoIWJvZHkpIHJldHVybjtcbiAgbGV0IGl0ZW1zID0gW107XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL3RyYXNoJyk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaXRlbXMgPSBkYXRhLml0ZW1zIHx8IFtdO1xuICB9IGNhdGNoIChlKSB7XG4gICAgYm9keS5pbm5lckhUTUwgPSBgPHAgc3R5bGU9XCJwYWRkaW5nOjIwcHg7Y29sb3I6I2VmNDQ0NDtcIj5Db3VsZCBub3QgbG9hZCB0cmFzaDogJHtlc2NhcGVIdG1sKGUubWVzc2FnZSl9PC9wPmA7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChpdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICBib2R5LmlubmVySFRNTCA9ICc8cCBzdHlsZT1cInBhZGRpbmc6MjRweDt0ZXh0LWFsaWduOmNlbnRlcjtjb2xvcjojNmI3MjgwO1wiPlRyYXNoIGlzIGVtcHR5LjwvcD4nO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZtdERhdGUodHMpIHtcbiAgICBpZiAoIXRzKSByZXR1cm4gJyc7XG4gICAgdHJ5IHsgcmV0dXJuIG5ldyBEYXRlKHRzKS50b0xvY2FsZURhdGVTdHJpbmcoJ2VuLVVTJywgeyBtb250aDogJ3Nob3J0JywgZGF5OiAnbnVtZXJpYycsIHllYXI6ICdudW1lcmljJyB9KTsgfVxuICAgIGNhdGNoIHsgcmV0dXJuIHRzLnNsaWNlKDAsIDEwKTsgfVxuICB9XG5cbiAgbGV0IGh0bWwgPSAnPHRhYmxlIHN0eWxlPVwid2lkdGg6MTAwJTtib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7XCI+JztcbiAgaXRlbXMuZm9yRWFjaChzID0+IHtcbiAgICBjb25zdCBlcCA9IGVzY2FwZUh0bWwocy5wYXRoKTtcbiAgICBodG1sICs9IGBcbiAgICAgIDx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206MXB4IHNvbGlkICNmMWY1Zjk7dmVydGljYWwtYWxpZ246dG9wO1wiPlxuICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOjEycHggMTZweDtcIj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6NjAwO2NvbG9yOiMxZTI5M2I7XCI+JHtlc2NhcGVIdG1sKHMucG9zaXRpb25fbmFtZSB8fCAnVW50aXRsZWQnKX08L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjEycHg7Y29sb3I6Izk0YTNiODttYXJnaW4tdG9wOjJweDtcIj4ke2ZtdERhdGUocy50aW1lc3RhbXApfSR7cy5waGFzZSA/ICcgXHUwMEI3ICcgKyBlc2NhcGVIdG1sKHMucGhhc2UpIDogJyd9PC9kaXY+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cInBhZGRpbmc6MTJweCAxNnB4O3doaXRlLXNwYWNlOm5vd3JhcDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7XCI+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6NnB4O1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLXRyYXNoLWFjdGlvbj1cInJlc3RvcmVcIiBkYXRhLXRyYXNoLXBhdGg9XCIke2VwfVwiXG4gICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDojZGJlYWZlO2NvbG9yOiMxZDRlZDg7Ym9yZGVyOjFweCBzb2xpZCAjYmZkYmZlO2JvcmRlci1yYWRpdXM6NnB4O3BhZGRpbmc6NnB4IDEycHg7Zm9udC1zaXplOjEzcHg7Zm9udC13ZWlnaHQ6NjAwO2N1cnNvcjpwb2ludGVyO1wiPlJlc3RvcmU8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gZGF0YS10cmFzaC1hY3Rpb249XCJkZWxldGUtZm9yZXZlclwiIGRhdGEtdHJhc2gtcGF0aD1cIiR7ZXB9XCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZWUyZTI7Y29sb3I6I2RjMjYyNjtib3JkZXI6MXB4IHNvbGlkICNmZWNhY2E7Ym9yZGVyLXJhZGl1czo2cHg7cGFkZGluZzo2cHggOHB4O2ZvbnQtc2l6ZToxM3B4O2N1cnNvcjpwb2ludGVyO1wiIHRpdGxlPVwiRGVsZXRlIHBlcm1hbmVudGx5XCIgYXJpYS1sYWJlbD1cIkRlbGV0ZSBwZXJtYW5lbnRseVwiPlx1MjcxNTwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3RkPlxuICAgICAgPC90cj5gO1xuICB9KTtcbiAgaHRtbCArPSAnPC90YWJsZT4nO1xuICBjb25zdCB0cmFzaFdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgdHJhc2hXcmFwcGVyLmlubmVySFRNTCA9IGh0bWw7XG4gIGJvZHkuaW5uZXJIVE1MID0gJyc7XG4gIGJvZHkuYXBwZW5kQ2hpbGQodHJhc2hXcmFwcGVyKTtcbiAgLy8gV2lyZSB1cCB0cmFzaCBhY3Rpb24gYnV0dG9ucyB2aWEgZXZlbnQgZGVsZWdhdGlvblxuICB0cmFzaFdyYXBwZXIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBlID0+IHtcbiAgICBjb25zdCBidG4gPSBlLnRhcmdldC5jbG9zZXN0KCdbZGF0YS10cmFzaC1hY3Rpb25dJyk7XG4gICAgaWYgKCFidG4pIHJldHVybjtcbiAgICBjb25zdCBwYXRoICAgPSBidG4uZGF0YXNldC50cmFzaFBhdGg7XG4gICAgY29uc3QgYWN0aW9uID0gYnRuLmRhdGFzZXQudHJhc2hBY3Rpb247XG4gICAgaWYgICAgICAoYWN0aW9uID09PSAncmVzdG9yZScpICAgICAgICByZXN0b3JlRnJvbVRyYXNoKHBhdGgpO1xuICAgIGVsc2UgaWYgKGFjdGlvbiA9PT0gJ2RlbGV0ZS1mb3JldmVyJykgZGVsZXRlRm9yZXZlcihwYXRoKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc3RvcmVGcm9tVHJhc2gocGF0aCkge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS90cmFzaC9yZXN0b3JlJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBwYXRoIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHsgYXdhaXQgX3JlbmRlclRyYXNoVmlldygpOyBhd2FpdCBfcmVmcmVzaFRyYXNoQmFkZ2UoKTsgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHNob3dUb2FzdChgUmVzdG9yZSBmYWlsZWQ6ICR7ZGF0YS5lcnJvciB8fCAnVW5rbm93biBlcnJvcid9YCwgJ2Vycm9yJyk7XG4gIH0gY2F0Y2ggKGUpIHsgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHNob3dUb2FzdChgRXJyb3I6ICR7ZS5tZXNzYWdlfWAsICdlcnJvcicpOyB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUZvcmV2ZXIocGF0aCkge1xuICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCBjb25maXJtRGlhbG9nKFxuICAgICdQZXJtYW5lbnRseSBkZWxldGUgdGhpcyBzZXNzaW9uPyBUaGlzIGNhbm5vdCBiZSB1bmRvbmUuJyxcbiAgICB7IGNvbmZpcm1MYWJlbDogJ0RlbGV0ZSBGb3JldmVyJywgY2FuY2VsTGFiZWw6ICdDYW5jZWwnLCBkYW5nZXI6IHRydWUgfVxuICApO1xuICBpZiAoIWNvbmZpcm1lZCkgcmV0dXJuO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS90cmFzaC9kZWxldGUnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHBhdGggfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEuc3VjY2VzcykgeyBhd2FpdCBfcmVuZGVyVHJhc2hWaWV3KCk7IGF3YWl0IF9yZWZyZXNoVHJhc2hCYWRnZSgpOyB9XG4gICAgZWxzZSBpZiAodHlwZW9mIHNob3dUb2FzdCA9PT0gJ2Z1bmN0aW9uJykgc2hvd1RvYXN0KGBEZWxldGUgZmFpbGVkOiAke2RhdGEuZXJyb3IgfHwgJ1Vua25vd24gZXJyb3InfWAsICdlcnJvcicpO1xuICB9IGNhdGNoIChlKSB7IGlmICh0eXBlb2Ygc2hvd1RvYXN0ID09PSAnZnVuY3Rpb24nKSBzaG93VG9hc3QoYEVycm9yOiAke2UubWVzc2FnZX1gLCAnZXJyb3InKTsgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBlbXB0eVRyYXNoKCkge1xuICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCBjb25maXJtRGlhbG9nKFxuICAgICdQZXJtYW5lbnRseSBkZWxldGUgYWxsIGl0ZW1zIGluIFRyYXNoPyBUaGlzIGNhbm5vdCBiZSB1bmRvbmUuJyxcbiAgICB7IGNvbmZpcm1MYWJlbDogJ0VtcHR5IFRyYXNoJywgY2FuY2VsTGFiZWw6ICdDYW5jZWwnLCBkYW5nZXI6IHRydWUgfVxuICApO1xuICBpZiAoIWNvbmZpcm1lZCkgcmV0dXJuO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS90cmFzaC9lbXB0eScsIHsgbWV0aG9kOiAnUE9TVCcgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEuc3VjY2VzcykgeyBhd2FpdCBfcmVuZGVyVHJhc2hWaWV3KCk7IGF3YWl0IF9yZWZyZXNoVHJhc2hCYWRnZSgpOyB9XG4gICAgZWxzZSBpZiAodHlwZW9mIHNob3dUb2FzdCA9PT0gJ2Z1bmN0aW9uJykgc2hvd1RvYXN0KGBGYWlsZWQgdG8gZW1wdHkgdHJhc2g6ICR7ZGF0YS5lcnJvciB8fCAnVW5rbm93biBlcnJvcid9YCwgJ2Vycm9yJyk7XG4gIH0gY2F0Y2ggKGUpIHsgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHNob3dUb2FzdChgRXJyb3I6ICR7ZS5tZXNzYWdlfWAsICdlcnJvcicpOyB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFeHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5leHBvcnQge1xuICBfcmVuZGVyQWN0aXZlU2Vzc2lvblJvd3MsXG4gIF9yZW5kZXJTYXZlZFNlc3Npb25Sb3dzLFxuICBfcmVuZGVyU2Vzc2lvblN3aXRjaGVyU2VjdGlvbnMsXG4gIF91cGRhdGVTZXNzaW9uU3dpdGNoZXJIZWFkZXIsXG4gIHNob3dPd25lcnNoaXBDb25mbGljdERpYWxvZyxcbiAgY2xvc2VPd25lcnNoaXBDb25mbGljdERpYWxvZyxcbiAgb3BlblNlc3Npb25zTW9kYWwsXG4gIGNsb3NlU2Vzc2lvbnNNb2RhbCxcbiAgX3JlbmRlclNlc3Npb25zTW9kYWxCb2R5LFxuICBsb2FkU2Vzc2lvbkFuZENsb3NlTW9kYWwsXG4gIG5ld1Nlc3Npb25Gcm9tTW9kYWwsXG4gIHN0YXJ0U2Vzc2lvbk1vZGFsUmVuYW1lLFxuICBjYW5jZWxTZXNzaW9uTW9kYWxSZW5hbWUsXG4gIHN1Ym1pdFNlc3Npb25Nb2RhbFJlbmFtZSxcbiAgX2RlbGV0ZVNlc3Npb25Gcm9tTW9kYWwsXG4gIF9kdXBsaWNhdGVTZXNzaW9uRnJvbU1vZGFsLFxuICBfcmVmcmVzaFRyYXNoQmFkZ2UsXG4gIG9wZW5UcmFzaFZpZXcsXG4gIGNsb3NlVHJhc2hWaWV3LFxuICBfcmVuZGVyVHJhc2hWaWV3LFxuICByZXN0b3JlRnJvbVRyYXNoLFxuICBkZWxldGVGb3JldmVyLFxuICBlbXB0eVRyYXNoLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL2tleWJvYXJkLXNob3J0Y3V0cy5qcyBcdTIwMTQgR2xvYmFsIGtleWJvYXJkIHNob3J0Y3V0cyBmb3Igd29ya2Zsb3cgbmF2aWdhdGlvbi5cbiAqXG4gKiBTaG9ydGN1dHMgaW1wbGVtZW50ZWQ6XG4gKiAgIEN0cmwrRW50ZXIgICAgICAgVHJpZ2dlciB0aGUgcHJpbWFyeSBhY3Rpb24gYnV0dG9uIG9uIHRoZSBjdXJyZW50IHRhYlxuICogICBDdHJsK1NoaWZ0K1IgICAgIFJlLXJ1biB0aGUgY3VycmVudCB3b3JrZmxvdyBwaGFzZSAoY2FsbHMgY29uZmlybVJlUnVuUGhhc2UpXG4gKiAgIEEgICAgICAgICAgICAgICAgQWNjZXB0IHRoZSBmb2N1c2VkIHJldmlldyBjYXJkIChyZXdyaXRlIC8gc3BlbGwtY2hlY2sgdGFicylcbiAqICAgUiAgICAgICAgICAgICAgICBSZWplY3QgdGhlIGZvY3VzZWQgcmV2aWV3IGNhcmQgKHJld3JpdGUgLyBzcGVsbC1jaGVjayB0YWJzKVxuICogICBcdTIxOTEgLyBcdTIxOTMgICAgICAgICAgICBOYXZpZ2F0ZSBiZXR3ZWVuIHJldmlldyBjYXJkcyBvbiByZXZpZXcgdGFic1xuICogICBDdHJsK1ogICAgICAgICAgIFVuZG8gdGhlIG1vc3QgcmVjZW50IE1hc3RlciBDViBkYXRhIGNoYW5nZSAoTWFzdGVyIENWIG1vZGFsIG9ubHkpXG4gKiAgIEN0cmwrU2hpZnQrWiAgICAgUmVkbyB0aGUgcHJldmlvdXNseSB1bmRvbmUgTWFzdGVyIENWIGRhdGEgY2hhbmdlIChNYXN0ZXIgQ1YgbW9kYWwgb25seSlcbiAqICAgPyAgICAgICAgICAgICAgICBUb2dnbGUga2V5Ym9hcmQgc2hvcnRjdXQgaGVscCBwYW5lbFxuICovXG5cbi8qKiBUcmFjayB3aGljaCBjYXJkIGlzIGtleWJvYXJkLWZvY3VzZWQgb24gdGhlIGN1cnJlbnQgcmV2aWV3IHRhYi4gKi9cbmxldCBfZm9jdXNlZENhcmRJbmRleCA9IC0xO1xuXG4vKiogUmV0dXJucyB0cnVlIGlmIGZvY3VzIGlzIGluc2lkZSBhIHRleHQgaW5wdXQsIHNvIEEvUi9cdTIxOTEvXHUyMTkzIHNob3VsZCBub3QgZmlyZS4gKi9cbmZ1bmN0aW9uIF9pblRleHRJbnB1dCgpIHtcbiAgY29uc3QgZWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBpZiAoIWVsKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHRhZyA9IGVsLnRhZ05hbWU7XG4gIHJldHVybiB0YWcgPT09ICdJTlBVVCcgfHwgdGFnID09PSAnVEVYVEFSRUEnIHx8IHRhZyA9PT0gJ1NFTEVDVCcgfHwgZWwuaXNDb250ZW50RWRpdGFibGU7XG59XG5cbi8qKiBSZXR1cm5zIHRydWUgaWYgYW55IG1vZGFsIG92ZXJsYXkgaXMgY3VycmVudGx5IHZpc2libGUuICovXG5mdW5jdGlvbiBfbW9kYWxPcGVuKCkge1xuICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW3JvbGU9XCJkaWFsb2dcIl06bm90KFtzdHlsZSo9XCJkaXNwbGF5OiBub25lXCJdKTpub3QoW3N0eWxlKj1cImRpc3BsYXk6bm9uZVwiXSknKSAhPT0gbnVsbDtcbn1cblxuLyoqIFJldHVybnMgdHJ1ZSBpZiB0aGUgTWFzdGVyIENWIG1vZGFsICh3ZWIvaW5kZXguaHRtbCNtYXN0ZXItY3YtbW9kYWwtb3ZlcmxheSkgaXMgb3Blbi4gKi9cbmZ1bmN0aW9uIF9tYXN0ZXJDdk1vZGFsT3BlbigpIHtcbiAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWN2LW1vZGFsLW92ZXJsYXknKTtcbiAgcmV0dXJuICEhZWwgJiYgZWwuc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnO1xufVxuXG4vKipcbiAqIE1hcCB0YWIgSURzIHRvIHRoZWlyIHByaW1hcnkgYWN0aW9uIGJ1dHRvbiBJRHMuXG4gKiBCdXR0b25zIHRoYXQgbWlnaHQgYmUgZGlzYWJsZWQgYXQgcnVudGltZSBhcmUgc3RpbGwgY2xpY2tlZCBcdTIwMTQgdGhlIGJ1dHRvbidzXG4gKiBvd24gZGlzYWJsZWQgY2hlY2sgcHJldmVudHMgYWNjaWRlbnRhbCBzdWJtaXNzaW9uLlxuICovXG5jb25zdCBfVEFCX0FDVElPTl9CVE4gPSB7XG4gICdqb2InOiAgICAgICAgICAgICAgICAgICAnc2VuZC1idG4nLFxuICAnYW5hbHlzaXMnOiAgICAgICAgICAgICAgJ2FuYWx5emUtYnRuJyxcbiAgJ2dvYWxzJzogICAgICAgICAgICAgICAgICdyZWNvbW1lbmQtYnRuJyxcbiAgJ3Jld3JpdGUnOiAgICAgICAgICAgICAgICdyZXdyaXRlLWJ0bicsXG4gICdzcGVsbCc6ICAgICAgICAgICAgICAgICAnc3BlbGwtYnRuJyxcbiAgJ2ZpbmFsX2dlbmVyYXRlJzogICAgICAgICdnZW5lcmF0ZS1idG4nLFxuICAnbGF5b3V0JzogICAgICAgICAgICAgICAgJ2xheW91dC1idG4nLFxuICAnZG93bmxvYWQnOiAgICAgICAgICAgICAgJ2ZpbmFsLWdlbmVyYXRlLXByb2NlZWQtYnRuJyxcbiAgJ2ZpbmFsaXNlJzogICAgICAgICAgICAgICdmaW5hbGlzZS1hY3Rpb24tYnRuJyxcbn07XG5cbi8qKiBDbGljayB0aGUgcHJpbWFyeSBhY3Rpb24gYnV0dG9uIGZvciB0aGUgY3VycmVudCB0YWIgKEN0cmwrRW50ZXIpLiAqL1xuZnVuY3Rpb24gX3RyaWdnZXJQcmltYXJ5QWN0aW9uKCkge1xuICBjb25zdCB0YWIgPSB0eXBlb2Ygc3RhdGVNYW5hZ2VyICE9PSAndW5kZWZpbmVkJyA/IHN0YXRlTWFuYWdlci5nZXRDdXJyZW50VGFiKCkgOiBudWxsO1xuICBpZiAoIXRhYikgcmV0dXJuO1xuICBjb25zdCBidG5JZCA9IF9UQUJfQUNUSU9OX0JUTlt0YWJdO1xuICBpZiAoIWJ0bklkKSByZXR1cm47XG4gIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJ0bklkKTtcbiAgaWYgKGJ0biAmJiAhYnRuLmRpc2FibGVkKSBidG4uY2xpY2soKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIENhcmQgbmF2aWdhdGlvbiBoZWxwZXJzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4vKiogUmV0dXJuIHZpc2libGUgcmV2aWV3IGNhcmRzIGZvciB0aGUgY3VycmVudCB0YWIuICovXG5mdW5jdGlvbiBfZ2V0Q2FyZHMoKSB7XG4gIGNvbnN0IHRhYiA9IHR5cGVvZiBzdGF0ZU1hbmFnZXIgIT09ICd1bmRlZmluZWQnID8gc3RhdGVNYW5hZ2VyLmdldEN1cnJlbnRUYWIoKSA6IG51bGw7XG4gIGlmICh0YWIgPT09ICdyZXdyaXRlJykgcmV0dXJuIFsuLi5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucmV3cml0ZS1jYXJkJyldO1xuICBpZiAodGFiID09PSAnc3BlbGwnKSAgIHJldHVybiBbLi4uZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnNwZWxsLWNhcmQnKV07XG4gIHJldHVybiBbXTtcbn1cblxuLyoqIFZpc3VhbGx5IGhpZ2hsaWdodCBhIGNhcmQgYXMga2V5Ym9hcmQtZm9jdXNlZC4gKi9cbmZ1bmN0aW9uIF9oaWdobGlnaHRDYXJkKGNhcmRzLCBpZHgpIHtcbiAgY2FyZHMuZm9yRWFjaCgoYywgaSkgPT4ge1xuICAgIGlmIChpID09PSBpZHgpIHtcbiAgICAgIGMuY2xhc3NMaXN0LmFkZCgna2ItZm9jdXNlZCcpO1xuICAgICAgYy5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnbmVhcmVzdCcsIGJlaGF2aW9yOiAnc21vb3RoJyB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYy5jbGFzc0xpc3QucmVtb3ZlKCdrYi1mb2N1c2VkJyk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqIE1vdmUgdGhlIGtleWJvYXJkIGZvY3VzIHRvIGNhcmQgYXQgZGVsdGEgb2Zmc2V0IGZyb20gY3VycmVudC4gKi9cbmZ1bmN0aW9uIF9tb3ZlQ2FyZEZvY3VzKGRlbHRhKSB7XG4gIGNvbnN0IGNhcmRzID0gX2dldENhcmRzKCk7XG4gIGlmICghY2FyZHMubGVuZ3RoKSByZXR1cm47XG4gIF9mb2N1c2VkQ2FyZEluZGV4ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oY2FyZHMubGVuZ3RoIC0gMSwgX2ZvY3VzZWRDYXJkSW5kZXggKyBkZWx0YSkpO1xuICBfaGlnaGxpZ2h0Q2FyZChjYXJkcywgX2ZvY3VzZWRDYXJkSW5kZXgpO1xufVxuXG4vKiogQWNjZXB0IHRoZSBjdXJyZW50bHkga2V5Ym9hcmQtZm9jdXNlZCByZXdyaXRlIGNhcmQuICovXG5mdW5jdGlvbiBfYWNjZXB0Rm9jdXNlZENhcmQoKSB7XG4gIGNvbnN0IHRhYiA9IHR5cGVvZiBzdGF0ZU1hbmFnZXIgIT09ICd1bmRlZmluZWQnID8gc3RhdGVNYW5hZ2VyLmdldEN1cnJlbnRUYWIoKSA6IG51bGw7XG4gIGlmICh0YWIgPT09ICdyZXdyaXRlJykge1xuICAgIGNvbnN0IGNhcmRzID0gX2dldENhcmRzKCk7XG4gICAgaWYgKF9mb2N1c2VkQ2FyZEluZGV4IDwgMCB8fCBfZm9jdXNlZENhcmRJbmRleCA+PSBjYXJkcy5sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCBjYXJkID0gY2FyZHNbX2ZvY3VzZWRDYXJkSW5kZXhdO1xuICAgIGNvbnN0IGlkID0gY2FyZC5pZC5yZXBsYWNlKCdydy1jYXJkLScsICcnKTtcbiAgICBpZiAodHlwZW9mIGFwcGx5UmV3cml0ZUFjdGlvbiA9PT0gJ2Z1bmN0aW9uJykgYXBwbHlSZXdyaXRlQWN0aW9uKGlkLCAnYWNjZXB0Jyk7XG4gIH0gZWxzZSBpZiAodGFiID09PSAnc3BlbGwnKSB7XG4gICAgY29uc3QgY2FyZHMgPSBfZ2V0Q2FyZHMoKTtcbiAgICBpZiAoX2ZvY3VzZWRDYXJkSW5kZXggPCAwIHx8IF9mb2N1c2VkQ2FyZEluZGV4ID49IGNhcmRzLmxlbmd0aCkgcmV0dXJuO1xuICAgIC8vIHNwZWxsIGNhcmRzOiBmaW5kIHRoZSBhY2NlcHQgYnV0dG9uIHdpdGhpbiB0aGUgZm9jdXNlZCBjYXJkXG4gICAgY29uc3QgYnRuID0gY2FyZHNbX2ZvY3VzZWRDYXJkSW5kZXhdLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWFjdGlvbj1cImtlZXBcIl0sIC5zcGVsbC1rZWVwLWJ0bicpO1xuICAgIGlmIChidG4pIGJ0bi5jbGljaygpO1xuICB9XG59XG5cbi8qKiBSZWplY3QgdGhlIGN1cnJlbnRseSBrZXlib2FyZC1mb2N1c2VkIHJldmlldyBjYXJkLiAqL1xuZnVuY3Rpb24gX3JlamVjdEZvY3VzZWRDYXJkKCkge1xuICBjb25zdCB0YWIgPSB0eXBlb2Ygc3RhdGVNYW5hZ2VyICE9PSAndW5kZWZpbmVkJyA/IHN0YXRlTWFuYWdlci5nZXRDdXJyZW50VGFiKCkgOiBudWxsO1xuICBpZiAodGFiID09PSAncmV3cml0ZScpIHtcbiAgICBjb25zdCBjYXJkcyA9IF9nZXRDYXJkcygpO1xuICAgIGlmIChfZm9jdXNlZENhcmRJbmRleCA8IDAgfHwgX2ZvY3VzZWRDYXJkSW5kZXggPj0gY2FyZHMubGVuZ3RoKSByZXR1cm47XG4gICAgY29uc3QgY2FyZCA9IGNhcmRzW19mb2N1c2VkQ2FyZEluZGV4XTtcbiAgICBjb25zdCBpZCA9IGNhcmQuaWQucmVwbGFjZSgncnctY2FyZC0nLCAnJyk7XG4gICAgaWYgKHR5cGVvZiBhcHBseVJld3JpdGVBY3Rpb24gPT09ICdmdW5jdGlvbicpIGFwcGx5UmV3cml0ZUFjdGlvbihpZCwgJ3JlamVjdCcpO1xuICB9IGVsc2UgaWYgKHRhYiA9PT0gJ3NwZWxsJykge1xuICAgIGNvbnN0IGNhcmRzID0gX2dldENhcmRzKCk7XG4gICAgaWYgKF9mb2N1c2VkQ2FyZEluZGV4IDwgMCB8fCBfZm9jdXNlZENhcmRJbmRleCA+PSBjYXJkcy5sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCBidG4gPSBjYXJkc1tfZm9jdXNlZENhcmRJbmRleF0ucXVlcnlTZWxlY3RvcignW2RhdGEtYWN0aW9uPVwiYXBwbHlcIl0sIC5zcGVsbC1hcHBseS1idG4nKTtcbiAgICBpZiAoYnRuKSBidG4uY2xpY2soKTtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgU2hvcnRjdXQgaGVscCBwYW5lbCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuY29uc3QgX1BBTkVMX0lEID0gJ2tiLXNob3J0Y3V0cy1wYW5lbCc7XG5cbi8qKiBUb2dnbGUgdGhlIGtleWJvYXJkIHNob3J0Y3V0IGhlbHAgcGFuZWwuICovXG5leHBvcnQgZnVuY3Rpb24gc2hvd0tleWJvYXJkU2hvcnRjdXRzUGFuZWwoKSB7XG4gIGNvbnN0IGV4aXN0aW5nID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoX1BBTkVMX0lEKTtcbiAgaWYgKGV4aXN0aW5nKSB7IGV4aXN0aW5nLnJlbW92ZSgpOyByZXR1cm47IH1cblxuICBjb25zdCBwYW5lbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBwYW5lbC5pZCA9IF9QQU5FTF9JRDtcbiAgcGFuZWwuc2V0QXR0cmlidXRlKCdyb2xlJywgJ2RpYWxvZycpO1xuICBwYW5lbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbW9kYWwnLCAndHJ1ZScpO1xuICBwYW5lbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnS2V5Ym9hcmQgc2hvcnRjdXRzJyk7XG4gIHBhbmVsLmlubmVySFRNTCA9IGBcbiAgICA8ZGl2IGlkPVwia2Itc2hvcnRjdXRzLWlubmVyXCI+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2FsaWduLWl0ZW1zOmNlbnRlcjttYXJnaW4tYm90dG9tOjEycHhcIj5cbiAgICAgICAgPHN0cm9uZz5LZXlib2FyZCBTaG9ydGN1dHM8L3N0cm9uZz5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImtiLXNob3J0Y3V0cy1jbG9zZVwiIGFyaWEtbGFiZWw9XCJDbG9zZSBrZXlib2FyZCBzaG9ydGN1dHNcIiBzdHlsZT1cImJhY2tncm91bmQ6bm9uZTtib3JkZXI6bm9uZTtmb250LXNpemU6MS4yZW07Y3Vyc29yOnBvaW50ZXI7cGFkZGluZzoycHggNnB4XCI+XHUyNzE1PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDx0YWJsZSBzdHlsZT1cImJvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTt3aWR0aDoxMDAlXCI+XG4gICAgICAgIDx0Ym9keT5cbiAgICAgICAgICA8dHI+PHRkIHN0eWxlPVwicGFkZGluZzo0cHggMTJweCA0cHggMFwiPjxrYmQ+Q3RybDwva2JkPis8a2JkPkVudGVyPC9rYmQ+PC90ZD48dGQ+VHJpZ2dlciBwcmltYXJ5IGFjdGlvbiBvbiBjdXJyZW50IHN0ZXA8L3RkPjwvdHI+XG4gICAgICAgICAgPHRyPjx0ZCBzdHlsZT1cInBhZGRpbmc6NHB4IDEycHggNHB4IDBcIj48a2JkPkN0cmw8L2tiZD4rPGtiZD5TaGlmdDwva2JkPis8a2JkPlI8L2tiZD48L3RkPjx0ZD5SZS1ydW4gY3VycmVudCB3b3JrZmxvdyBwaGFzZTwvdGQ+PC90cj5cbiAgICAgICAgICA8dHI+PHRkIHN0eWxlPVwicGFkZGluZzo0cHggMTJweCA0cHggMFwiPjxrYmQ+XHUyMTkxPC9rYmQ+IC8gPGtiZD5cdTIxOTM8L2tiZD48L3RkPjx0ZD5OYXZpZ2F0ZSBiZXR3ZWVuIHJldmlldyBjYXJkczwvdGQ+PC90cj5cbiAgICAgICAgICA8dHI+PHRkIHN0eWxlPVwicGFkZGluZzo0cHggMTJweCA0cHggMFwiPjxrYmQ+QTwva2JkPjwvdGQ+PHRkPkFjY2VwdCBmb2N1c2VkIGNhcmQgKHJld3JpdGUgLyBzcGVsbCk8L3RkPjwvdHI+XG4gICAgICAgICAgPHRyPjx0ZCBzdHlsZT1cInBhZGRpbmc6NHB4IDEycHggNHB4IDBcIj48a2JkPlI8L2tiZD48L3RkPjx0ZD5SZWplY3QgZm9jdXNlZCBjYXJkIChyZXdyaXRlIC8gc3BlbGwpPC90ZD48L3RyPlxuICAgICAgICAgIDx0cj48dGQgc3R5bGU9XCJwYWRkaW5nOjRweCAxMnB4IDRweCAwXCI+PGtiZD5DdHJsPC9rYmQ+KzxrYmQ+Wjwva2JkPjwvdGQ+PHRkPlVuZG8gTWFzdGVyIENWIGNoYW5nZSAoTWFzdGVyIENWIG1vZGFsKTwvdGQ+PC90cj5cbiAgICAgICAgICA8dHI+PHRkIHN0eWxlPVwicGFkZGluZzo0cHggMTJweCA0cHggMFwiPjxrYmQ+Q3RybDwva2JkPis8a2JkPlNoaWZ0PC9rYmQ+KzxrYmQ+Wjwva2JkPjwvdGQ+PHRkPlJlZG8gTWFzdGVyIENWIGNoYW5nZSAoTWFzdGVyIENWIG1vZGFsKTwvdGQ+PC90cj5cbiAgICAgICAgICA8dHI+PHRkIHN0eWxlPVwicGFkZGluZzo0cHggMTJweCA0cHggMFwiPjxrYmQ+Pzwva2JkPjwvdGQ+PHRkPlRvZ2dsZSB0aGlzIGhlbHAgcGFuZWw8L3RkPjwvdHI+XG4gICAgICAgICAgPHRyPjx0ZCBzdHlsZT1cInBhZGRpbmc6NHB4IDEycHggNHB4IDBcIj48a2JkPkVzYzwva2JkPjwvdGQ+PHRkPkNsb3NlIG1vZGFscyAvIHRoaXMgcGFuZWw8L3RkPjwvdHI+XG4gICAgICAgIDwvdGJvZHk+XG4gICAgICA8L3RhYmxlPlxuICAgIDwvZGl2PmA7XG4gIE9iamVjdC5hc3NpZ24ocGFuZWwuc3R5bGUsIHtcbiAgICBwb3NpdGlvbjogICAnZml4ZWQnLFxuICAgIGJvdHRvbTogICAgICc4MHB4JyxcbiAgICByaWdodDogICAgICAnMjRweCcsXG4gICAgYmFja2dyb3VuZDogJyMxZjI5MzcnLFxuICAgIGNvbG9yOiAgICAgICcjZjlmYWZiJyxcbiAgICBib3JkZXI6ICAgICAnMXB4IHNvbGlkICMzNzQxNTEnLFxuICAgIGJvcmRlclJhZGl1czogJzhweCcsXG4gICAgcGFkZGluZzogICAgJzE2cHggMjBweCcsXG4gICAgekluZGV4OiAgICAgJzEwMDAwJyxcbiAgICBmb250U2l6ZTogICAnMC44NWVtJyxcbiAgICBtaW5XaWR0aDogICAnMzQwcHgnLFxuICAgIGJveFNoYWRvdzogICcwIDRweCAyMHB4IHJnYmEoMCwwLDAsMC41KScsXG4gIH0pO1xuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHBhbmVsKTtcbiAgcGFuZWwucXVlcnlTZWxlY3RvcignI2tiLXNob3J0Y3V0cy1jbG9zZScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gcGFuZWwucmVtb3ZlKCkpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgUmVzZXQgY2FyZCBmb2N1cyB3aGVuIHRhYiBjaGFuZ2VzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4vKiogQ2FsbGVkIHdoZW5ldmVyIHRoZSBhY3RpdmUgdGFiIGNoYW5nZXMgc28gY2FyZCBmb2N1cyByZXNldHMuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzZXRDYXJkRm9jdXMoKSB7XG4gIF9mb2N1c2VkQ2FyZEluZGV4ID0gLTE7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5rYi1mb2N1c2VkJykuZm9yRWFjaChlbCA9PiBlbC5jbGFzc0xpc3QucmVtb3ZlKCdrYi1mb2N1c2VkJykpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgR2xvYmFsIGtleWRvd24gaGFuZGxlciBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gX29uS2V5RG93bihlKSB7XG4gIC8vIEN0cmwrRW50ZXIgXHUyMTkyIHByaW1hcnkgYWN0aW9uIChhbHdheXMsIGV2ZW4gaW4gdGV4dCBpbnB1dHMgd2hlbiB0aGUgbWFpblxuICAvLyBzZW5kLWJveCBpcyBmb2N1c2VkLCB0byBtYXRjaCB0aGUgZXhpc3RpbmcgRW50ZXIgYmVoYXZpb3VyIHRoZXJlKS5cbiAgaWYgKGUuY3RybEtleSAmJiBlLmtleSA9PT0gJ0VudGVyJykge1xuICAgIF90cmlnZ2VyUHJpbWFyeUFjdGlvbigpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEN0cmwrU2hpZnQrUiBcdTIxOTIgcmUtcnVuIGN1cnJlbnQgcGhhc2VcbiAgaWYgKGUuY3RybEtleSAmJiBlLnNoaWZ0S2V5ICYmIGUua2V5ID09PSAnUicpIHtcbiAgICBjb25zdCBhY3RpdmVFbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tpZF49XCJzdGVwLVwiXS5hY3RpdmUnKTtcbiAgICBjb25zdCBzdGVwID0gYWN0aXZlRWwgPyBhY3RpdmVFbC5pZC5yZXBsYWNlKCdzdGVwLScsICcnKSA6IG51bGw7XG4gICAgaWYgKHN0ZXAgJiYgdHlwZW9mIGNvbmZpcm1SZVJ1blBoYXNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBjb25maXJtUmVSdW5QaGFzZShzdGVwKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gQ3RybCtaIC8gQ3RybCtTaGlmdCtaIFx1MjE5MiB1bmRvL3JlZG8gdGhlIG1vc3QgcmVjZW50IE1hc3RlciBDViBkYXRhIGNoYW5nZS5cbiAgLy8gU2NvcGVkIHRvIHdoZW4gdGhlIE1hc3RlciBDViBtb2RhbCBpcyBvcGVuIFx1MjAxNCBhbmQgbm8gbmVzdGVkIHN1Yi1tb2RhbFxuICAvLyAoZS5nLiB0aGUgYmFja3VwLWhpc3RvcnkgYnJvd3NlcikgaXMgc3RhY2tlZCBvbiB0b3Agb2YgaXQgXHUyMDE0IGFuZCBmb2N1c1xuICAvLyBpc24ndCBpbiBhIHRleHQgZmllbGQsIHNpbmNlIEN0cmwrWiBpbnNpZGUgYSB0ZXh0YXJlYSBtdXN0IHN0aWxsIHBlcmZvcm1cbiAgLy8gbmF0aXZlIHRleHQtdW5kbyByYXRoZXIgdGhhbiBiZWluZyBoaWphY2tlZCBieSB0aGlzIHNob3J0Y3V0LlxuICBpZiAoZS5jdHJsS2V5ICYmICFlLmFsdEtleSAmJiAoZS5rZXkgPT09ICd6JyB8fCBlLmtleSA9PT0gJ1onKVxuICAgICAgJiYgX21hc3RlckN2TW9kYWxPcGVuKCkgJiYgIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYWNrdXAtaGlzdG9yeS1vdmVybGF5JylcbiAgICAgICYmICFfaW5UZXh0SW5wdXQoKSkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBpZiAoZS5zaGlmdEtleSkge1xuICAgICAgaWYgKHR5cGVvZiByZWRvTWFzdGVyRGF0YUNoYW5nZSA9PT0gJ2Z1bmN0aW9uJykgcmVkb01hc3RlckRhdGFDaGFuZ2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR5cGVvZiB1bmRvTWFzdGVyRGF0YUNoYW5nZSA9PT0gJ2Z1bmN0aW9uJykgdW5kb01hc3RlckRhdGFDaGFuZ2UoKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gQWxsIHNpbmdsZS1rZXkgc2hvcnRjdXRzIGFyZSBzdXBwcmVzc2VkIHdoZW4gdHlwaW5nIGludG8gYW4gaW5wdXQuXG4gIGlmIChfaW5UZXh0SW5wdXQoKSkgcmV0dXJuO1xuICAvLyBBbGwgc2luZ2xlLWtleSBzaG9ydGN1dHMgYXJlIHN1cHByZXNzZWQgd2hlbiBhIG1vZGFsIGRpYWxvZyBpcyBvcGVuLFxuICAvLyBleGNlcHQgRXNjYXBlIChoYW5kbGVkIGJ5IHVpLWNvcmUuanMpLlxuICBpZiAoX21vZGFsT3BlbigpKSByZXR1cm47XG5cbiAgc3dpdGNoIChlLmtleSkge1xuICAgIGNhc2UgJz8nOlxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgc2hvd0tleWJvYXJkU2hvcnRjdXRzUGFuZWwoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgX21vdmVDYXJkRm9jdXMoLTEpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIF9tb3ZlQ2FyZEZvY3VzKDEpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYSc6XG4gICAgY2FzZSAnQSc6XG4gICAgICBfYWNjZXB0Rm9jdXNlZENhcmQoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3InOlxuICAgIGNhc2UgJ1InOlxuICAgICAgX3JlamVjdEZvY3VzZWRDYXJkKCk7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgYnJlYWs7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIEluaXRpYWxpc2F0aW9uIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4vKipcbiAqIEF0dGFjaCB0aGUgZ2xvYmFsIGtleWJvYXJkLXNob3J0Y3V0IGxpc3RlbmVyLlxuICogQ2FsbGVkIG9uY2UgZnJvbSBhcHAuanMgYWZ0ZXIgRE9NQ29udGVudExvYWRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRLZXlib2FyZFNob3J0Y3V0cygpIHtcbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIF9vbktleURvd24pO1xufVxuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLy8gT3JjaGVzdHJhdG9yIGVudHJ5LXBvaW50IFx1MjAxNCBhbGwgbW9kdWxlIGZ1bmN0aW9ucyBhcmUgZXhwb3NlZCBhcyBnbG9iYWxzIGJ5IGJ1bmRsZS5qcy5cbi8vIE5vdGU6IGFwcC5qcyBpcyBhIHBsYWluIGxlZ2FjeSBzY3JpcHQgKG5vdCBidW5kbGVkKS4gbG9nbGV2ZWwgaXMgYXZhaWxhYmxlXG4vLyB2aWEgZ2xvYmFsVGhpcy5sb2dsZXZlbCAoc2V0IGJ5IGJ1bmRsZS5qcyB3aGljaCBpbmNsdWRlcyB3ZWIvbG9nZ2VyLmpzKS5cbmNvbnN0IF9hcHBMb2cgPSAodHlwZW9mIGxvZ2xldmVsICE9PSAndW5kZWZpbmVkJykgPyBsb2dsZXZlbC5nZXRMb2dnZXIoJ2FwcCcpIDogY29uc29sZTtcbi8vIFRoaXMgZmlsZSBjb250YWlucyBvbmx5IGluaXQoKSBhbmQgdG9wLWxldmVsIGV2ZW50LXdpcmluZyAoXHUyMjY0IDMwMCBsaW5lcykuXG5cbmxldCBfbGlzdGVuZXJzUmVnaXN0ZXJlZCA9IGZhbHNlO1xuXG5mdW5jdGlvbiBfc2V0Q29ubmVjdGlvbk1lc3NhZ2UobWVzc2FnZU5vZGUsIHRleHQsIGtpbmQgPSAnaW5mbycpIHtcbiAgaWYgKCFtZXNzYWdlTm9kZSkgcmV0dXJuO1xuICBjb25zdCBjb250ZW50ID0gbWVzc2FnZU5vZGUucXVlcnlTZWxlY3RvcignLmNvbnRlbnQnKTtcbiAgaWYgKCFjb250ZW50KSByZXR1cm47XG4gIGNvbnRlbnQudGV4dENvbnRlbnQgPSB0ZXh0O1xuICBjb250ZW50LnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lLWJsb2NrJztcbiAgY29udGVudC5zdHlsZS5wYWRkaW5nID0gJzZweCAxMHB4JztcbiAgY29udGVudC5zdHlsZS5ib3JkZXJSYWRpdXMgPSAnOTk5cHgnO1xuICBjb250ZW50LnN0eWxlLmZvbnRXZWlnaHQgPSAnNjAwJztcbiAgY29udGVudC5zdHlsZS5mb250U2l6ZSA9ICcwLjg4ZW0nO1xuICBjb250ZW50LnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgI2NiZDVlMSc7XG4gIGlmIChraW5kID09PSAnc3VjY2VzcycpIHtcbiAgICBjb250ZW50LnN0eWxlLmNvbG9yID0gJyMxNjY1MzQnO1xuICAgIGNvbnRlbnQuc3R5bGUuYmFja2dyb3VuZCA9ICcjZWNmZGY1JztcbiAgICBjb250ZW50LnN0eWxlLmJvcmRlckNvbG9yID0gJyM4NmVmYWMnO1xuICB9IGVsc2UgaWYgKGtpbmQgPT09ICdlcnJvcicpIHtcbiAgICBjb250ZW50LnN0eWxlLmNvbG9yID0gJyNiOTFjMWMnO1xuICAgIGNvbnRlbnQuc3R5bGUuYmFja2dyb3VuZCA9ICcjZmVmMmYyJztcbiAgICBjb250ZW50LnN0eWxlLmJvcmRlckNvbG9yID0gJyNmZWNhY2EnO1xuICB9IGVsc2Uge1xuICAgIGNvbnRlbnQuc3R5bGUuY29sb3IgPSAnIzFlNDBhZic7XG4gICAgY29udGVudC5zdHlsZS5iYWNrZ3JvdW5kID0gJyNlZmY2ZmYnO1xuICAgIGNvbnRlbnQuc3R5bGUuYm9yZGVyQ29sb3IgPSAnI2JmZGJmZSc7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gaW5pdCgpIHtcbiAgLy8gSW5pdGlhbGl6ZSBhYm9ydCBjb250cm9sbGVyIHRvIG51bGwgKHNldCB0byBuZXcgQWJvcnRDb250cm9sbGVyIGJ5IHNldExvYWRpbmcodHJ1ZSkpXG4gIHdpbmRvdy5fY3VycmVudEFib3J0Q29udHJvbGxlciA9IG51bGw7XG5cbiAgLy8gRmx1c2ggYW55IG1lc3NhZ2VzIHRoYXQgd2VyZSBxdWV1ZWQgYmVmb3JlIERPTUNvbnRlbnRMb2FkZWQgKGRlZmVuc2l2ZSBcdTIwMTQgc2hvdWxkIGJlIGVtcHR5IGluIHByYWN0aWNlKS5cbiAgX2ZsdXNoTWVzc2FnZVF1ZXVlKCk7XG5cbiAgY29uc3QgaGFzQWN0aXZlU2Vzc2lvbiA9IGF3YWl0IGVuc3VyZVNlc3Npb25Db250ZXh0KCk7XG4gIGlmICghaGFzQWN0aXZlU2Vzc2lvbikge1xuICAgIGNvbnN0IGZhaWxlZE1lc3NhZ2UgPSBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnXHUyNkEwXHVGRTBGIENvdWxkIG5vdCBlc3RhYmxpc2ggYSBzZXNzaW9uLiBDcmVhdGUgb3IgbG9hZCBhIHNlc3Npb24gdG8gY29udGludWUuJyk7XG4gICAgX3NldENvbm5lY3Rpb25NZXNzYWdlKGZhaWxlZE1lc3NhZ2UsICdcdTI2QTBcdUZFMEYgQ291bGQgbm90IGVzdGFibGlzaCBhIHNlc3Npb24uIENyZWF0ZSBvciBsb2FkIGEgc2Vzc2lvbiB0byBjb250aW51ZS4nLCAnZXJyb3InKTtcbiAgICBzZXR1cEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gU2hvdyB3ZWxjb21lL29uYm9hcmRpbmcgbW9kYWwgb24gZXZlcnkgc3RhcnR1cCB1bnRpbCB1c2VyIGRpc21pc3NlcyBpdC5cbiAgYXdhaXQgbWF5YmVTaG93V2VsY29tZU1vZGFsKCk7XG5cbiAgLy8gUmVzdG9yZSBzZXNzaW9uIHN0YXRlIGZpcnN0XG4gIGF3YWl0IHJlc3RvcmVTZXNzaW9uKCk7XG5cbiAgLy8gU2hvdyBjb25uZWN0aW9uIHN0YXR1cyBhZnRlciByZXN0b3JlU2Vzc2lvbiBzbyBpdCBpcyBub3QgcmVtb3ZlZCBieSBoaXN0b3J5IHJlc3RvcmUuXG4gIGNvbnN0IGNvbm5lY3Rpb25NZXNzYWdlID0gYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgJ1x1RDgzRFx1REQwNCBDb25uZWN0aW5nIHRvIENWIEJ1aWxkZXIuLi4nKTtcbiAgX3NldENvbm5lY3Rpb25NZXNzYWdlKGNvbm5lY3Rpb25NZXNzYWdlLCAnXHVEODNEXHVERDA0IENvbm5lY3RpbmcgdG8gQ1YgQnVpbGRlci4uLicsICdpbmZvJyk7XG5cbiAgLy8gUmVzdG9yZSBBVFMgYmFkZ2UgZnJvbSBjYWNoZWQgc2NvcmUgKGlmIGFueSlcbiAgdXBkYXRlQXRzQmFkZ2Uoc3RhdGVNYW5hZ2VyLmdldEF0c1Njb3JlKCkpO1xuXG4gIC8vIEluaXRpYWxpemUgdGhlIHJlc3RcbiAgYXdhaXQgZmV0Y2hTdGF0dXMoKTtcbiAgY29uc3QgY29ubmVjdGVkTWVzc2FnZSA9IGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsICdcdTI3MDUgQ29ubmVjdGlvbiBzdWNjZXNzZnVsLicpO1xuICBfc2V0Q29ubmVjdGlvbk1lc3NhZ2UoY29ubmVjdGVkTWVzc2FnZSwgJ1x1MjcwNSBDb25uZWN0aW9uIHN1Y2Nlc3NmdWwuJywgJ3N1Y2Nlc3MnKTtcbiAgaWYgKHN0YXRlTWFuYWdlci5nZXRDdXJyZW50VGFiKCkgPT09ICdqb2InKSBhd2FpdCBwb3B1bGF0ZUpvYlRhYigpO1xuICBzZXR1cEV2ZW50TGlzdGVuZXJzKCk7XG5cbiAgLy8gU2V0IHVwIHBlcmlvZGljIHN0YXRlIHNhdmluZ1xuICBzZXRJbnRlcnZhbChzYXZlVGFiRGF0YSwgNTAwMCk7IC8vIFNhdmUgZXZlcnkgNSBzZWNvbmRzXG5cbiAgLy8gU2F2ZSBzdGF0ZSBiZWZvcmUgcGFnZSB1bmxvYWRcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsICgpID0+IHtcbiAgICBzYXZlVGFiRGF0YSgpO1xuICAgIGNvbnN0IGFjdGl2ZVNlc3Npb25JZCA9IHN0YXRlTWFuYWdlci5nZXRTZXNzaW9uSWQoKTtcbiAgICBpZiAoYWN0aXZlU2Vzc2lvbklkKSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShTdG9yYWdlS2V5cy5TRVNTSU9OX0lELCBhY3RpdmVTZXNzaW9uSWQpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gUHJvbXB0IHVzZXIgdG8gYW5hbHl6ZSBpZiBhIGpvYiBkZXNjcmlwdGlvbiBpcyBsb2FkZWQgYnV0IG5vdCB5ZXQgYW5hbHl6ZWQuXG4gIC8vIERvIE5PVCBhdXRvLWZpcmUgXHUyMDE0IGEgcmV0dXJuaW5nIHVzZXIgbWF5IGhhdmUgaW50ZW50aW9uYWxseSBsZWZ0IGl0IHVuYW5hbHl6ZWRcbiAgLy8gKGUuZy4gbWlkLWVkaXQpLiBMZXQgdGhlbSBjbGljayBBbmFseXNlIEpvYiBleHBsaWNpdGx5IChHQVAtMjQ4KS5cbiAgaWYgKCFzdGF0ZU1hbmFnZXIuaXNSZWNvbm5lY3RpbmcoKSkge1xuICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IGZldGNoU3RhdHVzKCk7XG4gICAgaWYgKCFzdGF0dXMuX2Vycm9yICYmIHN0YXR1cy5qb2JfZGVzY3JpcHRpb24gJiYgIXN0YXR1cy5qb2JfYW5hbHlzaXMpIHtcbiAgICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsICdcdUQ4M0RcdURDQ0IgSm9iIGRlc2NyaXB0aW9uIGRldGVjdGVkIFx1MjAxNCBjbGljayA8c3Ryb25nPkFuYWx5c2UgSm9iPC9zdHJvbmc+IHdoZW4gcmVhZHkgdG8gYmVnaW4uJyk7XG4gICAgICBjb25zdCBhbmFseXplQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FuYWx5emUtYnRuJyk7XG4gICAgICBpZiAoYW5hbHl6ZUJ0bikge1xuICAgICAgICBhbmFseXplQnRuLnN0eWxlLm91dGxpbmUgPSAnMnB4IHNvbGlkICMzYjgyZjYnO1xuICAgICAgICBhbmFseXplQnRuLnN0eWxlLm91dGxpbmVPZmZzZXQgPSAnMnB4JztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHN0YXR1cy5qb2JfYW5hbHlzaXMpIHtcbiAgICAgIF9hcHBMb2cuaW5mbygnSm9iIGFuYWx5c2lzIGFscmVhZHkgY29tcGxldGUsIHNraXBwaW5nIGF1dG8tYW5hbHlzaXMnKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgX2FwcExvZy5pbmZvKCdSZWNvbm5lY3RpbmcgdG8gZXhpc3Rpbmcgc2Vzc2lvbiwgc2tpcHBpbmcgYXV0by1hbmFseXNpcycpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNldHVwRXZlbnRMaXN0ZW5lcnMoKSB7XG4gIGlmIChfbGlzdGVuZXJzUmVnaXN0ZXJlZCkgcmV0dXJuO1xuICBfbGlzdGVuZXJzUmVnaXN0ZXJlZCA9IHRydWU7XG5cbiAgLy8gVGFiIHN3aXRjaGluZ1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudGFiJykuZm9yRWFjaCh0YWIgPT4ge1xuICAgIHRhYi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHN3aXRjaFRhYih0YWIuZGF0YXNldC50YWIpKTtcbiAgfSk7XG5cbiAgLy8gTWVzc2FnZSBzZW5kaW5nXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZW5kLWJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc2VuZE1lc3NhZ2UpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWVzc2FnZS1pbnB1dCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2tleXByZXNzJywgKGUpID0+IHtcbiAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicpIHNlbmRNZXNzYWdlKCk7XG4gIH0pO1xuXG4gIC8vIEFjdGlvbiBidXR0b25zIFx1MjAxNCBvbmUgcGVyIHdvcmtmbG93IHN0YWdlXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhbmFseXplLWJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYW5hbHl6ZUpvYik7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWNvbW1lbmQtYnRuJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBzZW5kQWN0aW9uKCdyZWNvbW1lbmRfY3VzdG9taXphdGlvbnMnKSk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnZW5lcmF0ZS1idG4nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICAvLyBTb2Z0IGdhdGU6IHdhcm4gaWYgY3VzdG9taXNhdGlvbiBpdGVtcyBoYXZlIG5ldmVyIGJlZW4gaW5kaXZpZHVhbGx5IHJldmlld2VkIChHQVAtMTE2KVxuICAgIGNvbnN0IHJldmlld2VkID0gd2luZG93Ll9leHBsaWNpdGx5UmV2aWV3ZWQgfHwgeyBleHBlcmllbmNlczogbmV3IFNldCgpLCBza2lsbHM6IG5ldyBTZXQoKSB9O1xuICAgIGNvbnN0IHRvdGFsRXhwID0gKHdpbmRvdy5fZXhwZXJpZW5jZXNPcmRlcmVkIHx8IFtdKS5sZW5ndGg7XG4gICAgY29uc3QgdG90YWxTa2lsbCA9IE9iamVjdC5rZXlzKHVzZXJTZWxlY3Rpb25zPy5za2lsbHMgfHwge30pLmxlbmd0aDtcbiAgICBjb25zdCB1bnJldmlld2VkRXhwID0gdG90YWxFeHAgLSByZXZpZXdlZC5leHBlcmllbmNlcy5zaXplO1xuICAgIGNvbnN0IHVucmV2aWV3ZWRTa2lsbCA9IHRvdGFsU2tpbGwgLSByZXZpZXdlZC5za2lsbHMuc2l6ZTtcbiAgICBjb25zdCB1bnJldmlld2VkVG90YWwgPSBNYXRoLm1heCgwLCB1bnJldmlld2VkRXhwKSArIE1hdGgubWF4KDAsIHVucmV2aWV3ZWRTa2lsbCk7XG4gICAgaWYgKHVucmV2aWV3ZWRUb3RhbCA+IDApIHtcbiAgICAgIGNvbnN0IHBhcnRzID0gW107XG4gICAgICBpZiAodW5yZXZpZXdlZEV4cCA+IDApIHBhcnRzLnB1c2goYCR7dW5yZXZpZXdlZEV4cH0gZXhwZXJpZW5jZSBlbnRyJHt1bnJldmlld2VkRXhwID09PSAxID8gJ3knIDogJ2llcyd9YCk7XG4gICAgICBpZiAodW5yZXZpZXdlZFNraWxsID4gMCkgcGFydHMucHVzaChgJHt1bnJldmlld2VkU2tpbGx9IHNraWxsJHt1bnJldmlld2VkU2tpbGwgPT09IDEgPyAnJyA6ICdzJ31gKTtcbiAgICAgIGNvbnN0IG9rID0gd2luZG93LmNvbmZpcm0oXG4gICAgICAgIGAke3BhcnRzLmpvaW4oJyBhbmQgJyl9IG5vdCBpbmRpdmlkdWFsbHkgcmV2aWV3ZWQgXHUyMDE0IHRoZSBBSSdzIHJlY29tbWVuZGF0aW9uIHdpbGwgYmUgdXNlZCBmb3IgdGhlc2UuXFxuXFxuUHJvY2VlZCBhbnl3YXk/YFxuICAgICAgKTtcbiAgICAgIGlmICghb2spIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHVzZXJTZWxlY3Rpb25zICYmIChPYmplY3Qua2V5cyh1c2VyU2VsZWN0aW9ucy5leHBlcmllbmNlcykubGVuZ3RoID4gMCB8fCBPYmplY3Qua2V5cyh1c2VyU2VsZWN0aW9ucy5za2lsbHMpLmxlbmd0aCA+IDApKSB7XG4gICAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnQXBwbHlpbmcgeW91ciByZXZpZXcgZGVjaXNpb25zLi4uJyk7XG4gICAgICAvLyBEZWNpc2lvbnMgd2VyZSBhbHJlYWR5IHN1Ym1pdHRlZCB2aWEgc3VibWl0RXhwZXJpZW5jZURlY2lzaW9ucy9zdWJtaXRTa2lsbERlY2lzaW9uc1xuICAgICAgLy8gQmFja2VuZCBoYXMgdGhlbSBpbiBjb252ZXJzYXRpb24uc3RhdGVbJ2V4cGVyaWVuY2VfZGVjaXNpb25zJ10gYW5kIFsnc2tpbGxfZGVjaXNpb25zJ11cbiAgICB9XG4gICAgYXdhaXQgZmV0Y2hBbmRSZXZpZXdSZXdyaXRlcygpO1xuICB9KTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jld3JpdGUtYnRuJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzdWJtaXRSZXdyaXRlRGVjaXNpb25zKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NwZWxsLWJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc3VibWl0U3BlbGxDaGVja0RlY2lzaW9ucyk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnZW5lcmF0ZS1wcm9jZWVkLWJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gc3dpdGNoVGFiKCdsYXlvdXQnKSk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYXlvdXQtYnRuJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVMYXlvdXRQcmltYXJ5QWN0aW9uKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbmFsLWdlbmVyYXRlLXByb2NlZWQtYnRuJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmaW5hbEdlbmVyYXRpb25Db21wbGV0ZSk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaW5hbGlzZS1hY3Rpb24tYnRuJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBzd2l0Y2hUYWIoJ2ZpbmFsaXNlJykpO1xuXG4gIGlmICh0eXBlb2YgaW5pdEtleWJvYXJkU2hvcnRjdXRzID09PSAnZnVuY3Rpb24nKSBpbml0S2V5Ym9hcmRTaG9ydGN1dHMoKTtcbn1cblxuLy8gVGVzdHMgbm93IGltcG9ydCBoZWxwZXIgZnVuY3Rpb25zIGZyb20gdGhlaXIgY2Fub25pY2FsIEVTIG1vZHVsZXMgZGlyZWN0bHkuXG5cbmV4cG9ydCB7IGluaXQsIHNldHVwRXZlbnRMaXN0ZW5lcnMgfTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL3NyYy9tYWluLmpzIFx1MjAxNCBlc2J1aWxkIGVudHJ5IHBvaW50IGZvciB0aGUgZnVsbCBicm93c2VyIGJ1bmRsZS5cbiAqXG4gKiBQaGFzZSAyIG1vZHVsZXM6IHV0aWxzLCBhcGktY2xpZW50LCBzdGF0ZS1tYW5hZ2VyLCB1aS1jb3JlLCBsYXlvdXQtaW5zdHJ1Y3Rpb25cbiAqIFBoYXNlIDMgbW9kdWxlczogYWxsIGRvbWFpbiBzcGxpdCBtb2R1bGVzIChUaWVyIDBcdTIwMTM3KSBmcm9tIHRoZSBhcHAuanMgbW9kdWxhcmlzYXRpb24uXG4gKlxuICogRXZlcnkgZXhwb3J0IGlzIGFzc2lnbmVkIHRvIGB3aW5kb3dgIHNvIHRoYXQgbGVnYWN5IGlubGluZSBvbmNsaWNrPVwiZm4oKVwiXG4gKiBoYW5kbGVycyBhbmQgYXBwLmpzIGNvbnRpbnVlIHRvIHdvcmsgdW5jaGFuZ2VkLlxuICpcbiAqIEJ1aWxkOiAgbnBtIHJ1biBidWlsZCAgICAgICAgICBcdTIxOTIgd2ViL2J1bmRsZS5qcyAoZGV2ZWxvcG1lbnQsIHVubWluaWZpZWQpXG4gKiAgICAgICAgIG5wbSBydW4gYnVpbGQ6cHJvZCAgICAgXHUyMTkyIHdlYi9idW5kbGUuanMgKG1pbmlmaWVkKVxuICogICAgICAgICBucG0gcnVuIGJ1aWxkOndhdGNoICAgIFx1MjE5MiByZWJ1aWxkIG9uIGV2ZXJ5IHNvdXJjZSBjaGFuZ2VcbiAqL1xuXG4vLyBcdTI1MDBcdTI1MDAgTG9nZ2VyIChtdXN0IGJlIGZpcnN0IHNvIG5hbWVkIGxvZ2dlcnMgYXJlIGF2YWlsYWJsZSB0byBhbGwgbW9kdWxlcykgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5pbXBvcnQgKiBhcyBMb2dnZXIgZnJvbSAnLi4vbG9nZ2VyLmpzJztcblxuLy8gXHUyNTAwXHUyNTAwIFBoYXNlIDIgKG9yaWdpbmFsIGJ1bmRsZSkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5pbXBvcnQgKiBhcyBVdGlscyAgICAgICAgICAgICBmcm9tICcuLi91dGlscy5qcyc7XG5pbXBvcnQgKiBhcyBBcGlDbGllbnQgICAgICAgICBmcm9tICcuLi9hcGktY2xpZW50LmpzJztcbmltcG9ydCAqIGFzIFN0YXRlICAgICAgICAgICAgIGZyb20gJy4uL3N0YXRlLW1hbmFnZXIuanMnO1xuaW1wb3J0ICogYXMgUHJvdmlkZXJJbmZvICAgICAgZnJvbSAnLi4vcHJvdmlkZXItaW5mby5qcyc7XG5pbXBvcnQgKiBhcyBVaUNvcmUgICAgICAgICAgICBmcm9tICcuLi91aS1jb3JlLmpzJztcbmltcG9ydCAqIGFzIExheW91dEluc3RydWN0aW9uIGZyb20gJy4uL2xheW91dC1pbnN0cnVjdGlvbi5qcyc7XG5cbi8vIFx1MjUwMFx1MjUwMCBUaWVyIDAgXHUyMDE0IG5vIGRlcGVuZGVuY2llcyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmltcG9ydCAqIGFzIFZhbGlkYXRvcnMgICAgICAgICAgICBmcm9tICcuLi92YWxpZGF0b3JzLmpzJztcbmltcG9ydCAqIGFzIFJlY29tbWVuZGF0aW9uSGVscGVycyBmcm9tICcuLi9yZWNvbW1lbmRhdGlvbi1oZWxwZXJzLmpzJztcbmltcG9ydCAqIGFzIFVpSGVscGVycyAgICAgICAgICAgICBmcm9tICcuLi91aS1oZWxwZXJzLmpzJztcbmltcG9ydCAqIGFzIFByb3Bvc2FsUmV2aWV3ICAgICAgICBmcm9tICcuLi9wcm9wb3NhbC1yZXZpZXcuanMnO1xuXG4vLyBcdTI1MDBcdTI1MDAgVGllciAxIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuaW1wb3J0ICogYXMgRmV0Y2hVdGlscyAgIGZyb20gJy4uL2ZldGNoLXV0aWxzLmpzJztcbmltcG9ydCAqIGFzIE1lc3NhZ2VRdWV1ZSBmcm9tICcuLi9tZXNzYWdlLXF1ZXVlLmpzJztcbmltcG9ydCAqIGFzIExsbUxvZyAgICAgICBmcm9tICcuLi9sbG0tbG9nLmpzJztcblxuLy8gXHUyNTAwXHUyNTAwIFRpZXIgMiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmltcG9ydCAqIGFzIEF1dGhQcm92aWRlciAgIGZyb20gJy4uL2F1dGgtcHJvdmlkZXIuanMnO1xuaW1wb3J0ICogYXMgQXRzUmVmaW5lbWVudCAgZnJvbSAnLi4vYXRzLXJlZmluZW1lbnQuanMnO1xuaW1wb3J0ICogYXMgQXRzTW9kYWxzICAgICAgZnJvbSAnLi4vYXRzLW1vZGFscy5qcyc7XG5pbXBvcnQgKiBhcyBTZXNzaW9uQWN0aW9ucyBmcm9tICcuLi9zZXNzaW9uLWFjdGlvbnMuanMnO1xuaW1wb3J0ICogYXMgSm9iQW5hbHlzaXMgICAgZnJvbSAnLi4vam9iLWFuYWx5c2lzLmpzJztcblxuLy8gXHUyNTAwXHUyNTAwIFRpZXIgMyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmltcG9ydCAqIGFzIEdvYWxzICAgICAgICAgICBmcm9tICcuLi9nb2Fscy5qcyc7XG5pbXBvcnQgKiBhcyBTZXNzaW9uTWFuYWdlciAgZnJvbSAnLi4vc2Vzc2lvbi1tYW5hZ2VyLmpzJztcbmltcG9ydCAqIGFzIEpvYklucHV0ICAgICAgICBmcm9tICcuLi9qb2ItaW5wdXQuanMnO1xuaW1wb3J0ICogYXMgTWVzc2FnZURpc3BhdGNoIGZyb20gJy4uL21lc3NhZ2UtZGlzcGF0Y2guanMnO1xuaW1wb3J0ICogYXMgUXVlc3Rpb25zUGFuZWwgIGZyb20gJy4uL3F1ZXN0aW9ucy1wYW5lbC5qcyc7XG5cbi8vIFx1MjUwMFx1MjUwMCBUaWVyIDQgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5pbXBvcnQgKiBhcyBSZXZpZXdJY29ucyAgICBmcm9tICcuLi9yZXZpZXctaWNvbnMuanMnO1xuaW1wb3J0ICogYXMgUmV2aWV3VGFibGVCYXNlIGZyb20gJy4uL3Jldmlldy10YWJsZS1iYXNlLmpzJztcblxuLy8gXHUyNTAwXHUyNTAwIFRpZXIgNSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmltcG9ydCAqIGFzIEV4cGVyaWVuY2VSZXZpZXcgICBmcm9tICcuLi9leHBlcmllbmNlLXJldmlldy5qcyc7XG5pbXBvcnQgKiBhcyBTa2lsbHNSZXZpZXcgICAgICAgZnJvbSAnLi4vc2tpbGxzLXJldmlldy5qcyc7XG5pbXBvcnQgKiBhcyBBY2hpZXZlbWVudHNSZXZpZXcgZnJvbSAnLi4vYWNoaWV2ZW1lbnRzLXJldmlldy5qcyc7XG5pbXBvcnQgKiBhcyBUYWdsaW5lUmV2aWV3ICAgICAgZnJvbSAnLi4vdGFnbGluZS1yZXZpZXcuanMnO1xuaW1wb3J0ICogYXMgU3VtbWFyeVJldmlldyAgICAgIGZyb20gJy4uL3N1bW1hcnktcmV2aWV3LmpzJztcbmltcG9ydCAqIGFzIFB1YmxpY2F0aW9uc1JldmlldyBmcm9tICcuLi9wdWJsaWNhdGlvbnMtcmV2aWV3LmpzJztcblxuLy8gXHUyNTAwXHUyNTAwIFRpZXIgNiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmltcG9ydCAqIGFzIFJld3JpdGVSZXZpZXcgICAgICBmcm9tICcuLi9yZXdyaXRlLXJldmlldy5qcyc7XG5pbXBvcnQgKiBhcyBTcGVsbENoZWNrICAgICAgICAgZnJvbSAnLi4vc3BlbGwtY2hlY2suanMnO1xuaW1wb3J0ICogYXMgRG93bmxvYWRUYWIgICAgICAgIGZyb20gJy4uL2Rvd25sb2FkLXRhYi5qcyc7XG5pbXBvcnQgKiBhcyBGaW5hbEdlbmVyYXRlICAgICAgZnJvbSAnLi4vZmluYWwtZ2VuZXJhdGUuanMnO1xuaW1wb3J0ICogYXMgV29ya2Zsb3dTdGVwcyAgICAgIGZyb20gJy4uL3dvcmtmbG93LXN0ZXBzLmpzJztcbmltcG9ydCAqIGFzIE1hc3RlckRhdGFBaVVwZGF0ZSBmcm9tICcuLi9tYXN0ZXItZGF0YS1haS11cGRhdGUuanMnO1xuaW1wb3J0ICogYXMgTWFzdGVyQ3YgICAgICAgICAgIGZyb20gJy4uL21hc3Rlci1jdi5qcyc7XG5pbXBvcnQgKiBhcyBDb3ZlckxldHRlciAgICAgICAgZnJvbSAnLi4vY292ZXItbGV0dGVyLmpzJztcbmltcG9ydCAqIGFzIFNjcmVlbmluZ1F1ZXN0aW9ucyBmcm9tICcuLi9zY3JlZW5pbmctcXVlc3Rpb25zLmpzJztcbmltcG9ydCAqIGFzIEZpbmFsaXNlICAgICAgICAgICBmcm9tICcuLi9maW5hbGlzZS5qcyc7XG5pbXBvcnQgKiBhcyBJbnRlcnZpZXdQcmVwICAgICAgZnJvbSAnLi4vaW50ZXJ2aWV3LXByZXAuanMnO1xuaW1wb3J0ICogYXMgVGhhbmtZb3UgICAgICAgICAgIGZyb20gJy4uL3RoYW5rLXlvdS5qcyc7XG5pbXBvcnQgKiBhcyBIYXJ2ZXN0ICAgICAgICAgICAgZnJvbSAnLi4vaGFydmVzdC5qcyc7XG5cbi8vIFx1MjUwMFx1MjUwMCBUaWVyIDcgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5pbXBvcnQgKiBhcyBTZXNzaW9uU3dpdGNoZXJVaSAgZnJvbSAnLi4vc2Vzc2lvbi1zd2l0Y2hlci11aS5qcyc7XG5pbXBvcnQgKiBhcyBLZXlib2FyZFNob3J0Y3V0cyAgZnJvbSAnLi4va2V5Ym9hcmQtc2hvcnRjdXRzLmpzJztcblxuLy8gXHUyNTAwXHUyNTAwIEFwcCBvcmNoZXN0cmF0b3IgKGZvbGRlZCBpbnRvIGJ1bmRsZSBcdTIwMTQgR0FQLTY0KSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmltcG9ydCAqIGFzIEFwcCBmcm9tICcuLi9hcHAuanMnO1xuXG4vLyBcdTI1MDBcdTI1MDAgQXNzaWduIGFsbCBleHBvcnRzIHRvIGdsb2JhbFRoaXMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4vLyBQaGFzZSAyIG1vZHVsZXMgZmlyc3Q7IHBoYXNlIDMgZG9tYWluIG1vZHVsZXMgZm9sbG93IHNvIGZ1bGx5LWZlYXR1cmVkXG4vLyBpbXBsZW1lbnRhdGlvbnMgb3ZlcnJpZGUgYW55IHBsYWNlaG9sZGVyIHN0dWJzIChlLmcuIHNob3dTZXNzaW9uQ29uZmxpY3RCYW5uZXJcbi8vIGluIHNlc3Npb24tc3dpdGNoZXItdWkgb3ZlcnJpZGVzIHRoZSBzaW1wbGUgc3R1YiBpbiB1aS1jb3JlKS5cbk9iamVjdC5hc3NpZ24oZ2xvYmFsVGhpcyxcbiAgTG9nZ2VyLCBVdGlscywgQXBpQ2xpZW50LCBTdGF0ZSwgUHJvdmlkZXJJbmZvLCBVaUNvcmUsIExheW91dEluc3RydWN0aW9uLFxuICBWYWxpZGF0b3JzLCBSZWNvbW1lbmRhdGlvbkhlbHBlcnMsIFVpSGVscGVycywgUHJvcG9zYWxSZXZpZXcsXG4gIEZldGNoVXRpbHMsIE1lc3NhZ2VRdWV1ZSwgTGxtTG9nLFxuICBBdXRoUHJvdmlkZXIsIEF0c1JlZmluZW1lbnQsIEF0c01vZGFscywgU2Vzc2lvbkFjdGlvbnMsIEpvYkFuYWx5c2lzLFxuICBHb2FscyxcbiAgU2Vzc2lvbk1hbmFnZXIsIEpvYklucHV0LCBNZXNzYWdlRGlzcGF0Y2gsIFF1ZXN0aW9uc1BhbmVsLFxuICBSZXZpZXdUYWJsZUJhc2UsXG4gIEV4cGVyaWVuY2VSZXZpZXcsIFNraWxsc1JldmlldywgQWNoaWV2ZW1lbnRzUmV2aWV3LCBUYWdsaW5lUmV2aWV3LCBTdW1tYXJ5UmV2aWV3LCBQdWJsaWNhdGlvbnNSZXZpZXcsIFJldmlld0ljb25zLFxuICBSZXdyaXRlUmV2aWV3LCBTcGVsbENoZWNrLCBEb3dubG9hZFRhYiwgRmluYWxHZW5lcmF0ZSwgV29ya2Zsb3dTdGVwcywgTWFzdGVyRGF0YUFpVXBkYXRlLCBNYXN0ZXJDdixcbiAgQ292ZXJMZXR0ZXIsIFNjcmVlbmluZ1F1ZXN0aW9ucywgRmluYWxpc2UsIEludGVydmlld1ByZXAsIFRoYW5rWW91LCBIYXJ2ZXN0LFxuICBTZXNzaW9uU3dpdGNoZXJVaSwgS2V5Ym9hcmRTaG9ydGN1dHMsXG4gIEFwcCxcbik7XG5cbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBBcHAuaW5pdCk7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFNQSxPQUFDLFNBQVUsTUFBTSxZQUFZO0FBQ3pCO0FBQ0EsWUFBSSxPQUFPLFdBQVcsY0FBYyxPQUFPLEtBQUs7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O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsVUFhekIsMEJBQTBCLGNBQWMsQ0FBQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsVUFpQnpDLCtCQUErQixZQUFZLENBQUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsVUFrQjVDLHFCQUFxQixTQUFTLENBQUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFB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QUFBLElBQWU7QUFBQSxJQUFXO0FBQUEsSUFBZ0I7QUFBQSxJQUN4RDtBQUFBLElBQ0E7QUFBQSxJQUFnQjtBQUFBLElBQVU7QUFBQSxJQUFpQjtBQUFBLElBQzNDO0FBQUEsSUFDQTtBQUFBLElBQWtCO0FBQUEsSUFBYztBQUFBLElBQW9CO0FBQUEsSUFBZTtBQUFBLElBQWU7QUFBQSxJQUFvQjtBQUFBLElBQ3RHO0FBQUEsSUFBZTtBQUFBLElBQVk7QUFBQSxJQUFhO0FBQUEsSUFBZTtBQUFBLElBQWU7QUFBQSxJQUFvQjtBQUFBLElBQzFGO0FBQUEsSUFBYTtBQUFBLElBQW9CO0FBQUEsSUFBVTtBQUFBLElBQWU7QUFBQSxJQUFVO0FBQUEsSUFDcEU7QUFBQSxJQUFtQjtBQUFBLElBQ25CO0FBQUEsRUFDRjtBQUVBLFdBQVMsaUJBQWlCLG9CQUF3QixJQUFJOyIsCiAgIm5hbWVzIjogWyJnZXRMb2dnZXIiLCAibG9nZ2VyIiwgImxvZ2xldmVsIiwgImNsZWFuSnNvblJlc3BvbnNlIiwgImVzY2FwZUh0bWwiLCAiZXh0cmFjdEZpcnN0SnNvbk9iamVjdCIsICJleHRyYWN0VGl0bGVBbmRDb21wYW55RnJvbUpvYlRleHQiLCAiZm9ybWF0U2Vzc2lvblBoYXNlTGFiZWwiLCAibm9ybWFsaXplUG9zaXRpb25MYWJlbCIsICJub3JtYWxpemVUZXh0IiwgInRleHQiLCAibSIsICJodG1sIiwgInYiLCAiU3RvcmFnZUtleXMiLCAiYXBpQ2FsbCIsICJjcmVhdGVTZXNzaW9uIiwgImZldGNoU3RhdHVzIiwgImdldE93bmVyVG9rZW4iLCAiZ2V0U2NvcGVkVGFiRGF0YVN0b3JhZ2VLZXkiLCAiZ2V0U2Vzc2lvbklkRnJvbVVSTCIsICJfdXBkYXRlTExNU3RhdHVzQmFyIiwgImxsbUZldGNoIiwgInNldExvYWRpbmciLCAiXyIsICJpbml0IiwgImNoYXRBcmVhIiwgIlN0b3JhZ2VLZXlzIiwgImdldFNlc3Npb25JZEZyb21VUkwiLCAiZ2V0T3duZXJUb2tlbiIsICJnZXRTY29wZWRUYWJEYXRhU3RvcmFnZUtleSIsICJzZXNzaW9uSWQiLCAiaW5pdCIsICJfIiwgImFwaUNhbGwiLCAiY3JlYXRlU2Vzc2lvbiIsICJmZXRjaFN0YXR1cyIsICJQSEFTRVMiLCAic3RhdGVNYW5hZ2VyIiwgImxvZyIsICJQSEFTRVMiLCAic3RhdGVNYW5hZ2VyIiwgIlN0b3JhZ2VLZXlzIiwgImdldFByb3ZpZGVySW5mbyIsICJsb2FkUHJvdmlkZXJJbmZvIiwgInByb3ZpZGVySW5mb1BvcG92ZXJDb250ZW50IiwgImxvYWRQcm92aWRlckluZm8iLCAiZ2V0UHJvdmlkZXJJbmZvIiwgInByb3ZpZGVySW5mb1BvcG92ZXJDb250ZW50IiwgImVzY2FwZUh0bWwiLCAiX3VwZGF0ZUxsbVN0YXR1c1BpbGwiLCAiY2xvc2VNb2RlbE1vZGFsIiwgImNvbmZpcm1EaWFsb2ciLCAiZ2V0U3RhZ2VGb3JUYWIiLCAicHVzaEZvY3VzU3RhY2siLCAicmVzdG9yZUZvY3VzIiwgInNldEluaXRpYWxGb2N1cyIsICJ0cmFwRm9jdXMiLCAidXBkYXRlVGFiQmFyRm9yU3RhZ2UiLCAiX3VwZGF0ZVZpZXdpbmdJbmRpY2F0b3IiLCAiY29uZmlybVJlUnVuUGhhc2UiLCAic2hvd0J1bGxldFJlb3JkZXIiLCAibG9nIiwgInN0YXRlTWFuYWdlciIsICJnZW5lcmF0aW9uU3RhdGUiLCAiY29uZmlybVJlUnVuUGhhc2UiLCAiX3VwZGF0ZVZpZXdpbmdJbmRpY2F0b3IiLCAicSIsICJjbG9zZU1vZGFsIiwgIl9lIiwgInNob3dCdWxsZXRSZW9yZGVyIiwgIl8iLCAidGV4dCIsICJsb2ciLCAiZmV0Y2hTdGF0dXMiLCAiYXBpQ2FsbCIsICJfIiwgInNldEluaXRpYWxGb2N1cyIsICJ0cmFwRm9jdXMiLCAicmVzdG9yZUZvY3VzIiwgInB1c2hGb2N1c1N0YWNrIiwgImNvbmZpcm1EaWFsb2ciLCAiZ2V0U3RhZ2VGb3JUYWIiLCAic3RhdGVNYW5hZ2VyIiwgInVwZGF0ZVRhYkJhckZvclN0YWdlIiwgIlN0b3JhZ2VLZXlzIiwgIl91cGRhdGVMbG1TdGF0dXNQaWxsIiwgInRleHQiLCAiYiIsICJlc2NhcGVIdG1sIiwgImNsb3NlTW9kZWxNb2RhbCIsICJ2IiwgIm0iLCAiZXZlbnQiLCAidXBkYXRlV29ya2Zsb3dTdGVwc0NsaWNrYWJsZSIsICJoYW5kbGVMYXlvdXRQcmltYXJ5QWN0aW9uIiwgImluaXRpYXRlTGF5b3V0SW5zdHJ1Y3Rpb25zIiwgInJlZnJlc2hBdHNTY29yZSIsICJzY2hlZHVsZUF0c1JlZnJlc2giLCAidXBkYXRlQXRzQmFkZ2UiLCAidGV4dCIsICJnZW5lcmF0aW9uU3RhdGUiLCAic2Vzc2lvbklkIiwgIl9lIiwgIl9mbHVzaE1lc3NhZ2VRdWV1ZSIsICJhcHBlbmRGb3JtYXR0ZWRBbmFseXNpcyIsICJhcHBlbmRMb2FkaW5nTWVzc2FnZSIsICJhcHBlbmRNZXNzYWdlIiwgImFwcGVuZFJhd0h0bWwiLCAiYXBwZW5kUmV0cnlNZXNzYWdlIiwgInJlbW92ZUxvYWRpbmdNZXNzYWdlIiwgImxvZyIsICJfZmx1c2hNZXNzYWdlUXVldWUiLCAidGV4dCIsICJhcHBlbmRNZXNzYWdlIiwgImFwcGVuZExvYWRpbmdNZXNzYWdlIiwgInJlbW92ZUxvYWRpbmdNZXNzYWdlIiwgImh0bWwiLCAiZXNjYXBlSHRtbCIsICJhcHBlbmRSZXRyeU1lc3NhZ2UiLCAiYXBwZW5kRm9ybWF0dGVkQW5hbHlzaXMiLCAiY2xlYW5Kc29uUmVzcG9uc2UiLCAiYXBwZW5kUmF3SHRtbCIsICJfdXBkYXRlUGFnZUVzdGltYXRlIiwgImhhbmRsZUFjdGlvbkNsaWNrIiwgImhhbmRsZUN1c3RvbWl6YXRpb25SZXNwb25zZSIsICJzaG93VGFibGVCYXNlZFJldmlldyIsICJzd2l0Y2hUYWIiLCAidXBkYXRlSW5jbHVzaW9uQ291bnRzIiwgInVzZXJTZWxlY3Rpb25zIiwgImxvZyIsICJ1c2VyU2VsZWN0aW9ucyIsICJzdGF0ZU1hbmFnZXIiLCAidXBkYXRlSW5jbHVzaW9uQ291bnRzIiwgInYiLCAic3dpdGNoVGFiIiwgInRhYkRhdGEiLCAic2hvd1RhYmxlQmFzZWRSZXZpZXciLCAic2Vzc2lvbklkIiwgIl8iLCAiaHRtbCIsICJoYW5kbGVDdXN0b21pemF0aW9uUmVzcG9uc2UiLCAic3RhdGVNYW5hZ2VyIiwgIl91cGRhdGVQYWdlRXN0aW1hdGUiLCAidXNlclNlbGVjdGlvbnMiLCAiaGFuZGxlQWN0aW9uQ2xpY2siLCAibG9nIiwgInN0YXRlTWFuYWdlciIsICJodG1sIiwgInNlc3Npb25JZCIsICJlc2NhcGVIdG1sIiwgInRleHQiLCAiZ2VuZXJhdGlvblN0YXRlIiwgImluaXRpYXRlTGF5b3V0SW5zdHJ1Y3Rpb25zIiwgIl8iLCAiYXBwZW5kTWVzc2FnZSIsICJjb25maXJtUmVSdW5QaGFzZSIsICJhcGlDYWxsIiwgInciLCAiX2UiLCAic2NoZWR1bGVBdHNSZWZyZXNoIiwgInN3aXRjaFRhYiIsICJoYW5kbGVMYXlvdXRQcmltYXJ5QWN0aW9uIiwgInBhcnNlTWVzc2FnZVJlc3BvbnNlIiwgInBhcnNlUmV3cml0ZXNSZXNwb25zZSIsICJwYXJzZVNlc3Npb25MaXN0UmVzcG9uc2UiLCAicGFyc2VTdGF0dXNSZXNwb25zZSIsICJsb2ciLCAicGFyc2VTdGF0dXNSZXNwb25zZSIsICJrIiwgInBhcnNlU2Vzc2lvbkxpc3RSZXNwb25zZSIsICJwYXJzZVJld3JpdGVzUmVzcG9uc2UiLCAicGFyc2VNZXNzYWdlUmVzcG9uc2UiLCAiYnVpbGRGYWxsYmFja1Bvc3RBbmFseXNpc1F1ZXN0aW9ucyIsICJnZXRBY2hpZXZlbWVudENvbmZpZGVuY2UiLCAiZ2V0QWNoaWV2ZW1lbnRSZWFzb25pbmciLCAiZ2V0QWNoaWV2ZW1lbnRSZWNvbW1lbmRhdGlvbiIsICJnZXRDb25maWRlbmNlTGV2ZWwiLCAiZ2V0RXhwZXJpZW5jZVJlYXNvbmluZyIsICJnZXRFeHBlcmllbmNlUmVjb21tZW5kYXRpb24iLCAiZ2V0U2tpbGxDb25maWRlbmNlIiwgImdldFNraWxsUmVhc29uaW5nIiwgImdldFNraWxsUmVjb21tZW5kYXRpb24iLCAibG9nIiwgImdldEV4cGVyaWVuY2VSZWNvbW1lbmRhdGlvbiIsICJnZXRDb25maWRlbmNlTGV2ZWwiLCAiZ2V0RXhwZXJpZW5jZVJlYXNvbmluZyIsICJnZXRTa2lsbFJlY29tbWVuZGF0aW9uIiwgImdldFNraWxsQ29uZmlkZW5jZSIsICJnZXRTa2lsbFJlYXNvbmluZyIsICJnZXRBY2hpZXZlbWVudFJlY29tbWVuZGF0aW9uIiwgImdldEFjaGlldmVtZW50Q29uZmlkZW5jZSIsICJnZXRBY2hpZXZlbWVudFJlYXNvbmluZyIsICJidWlsZEZhbGxiYWNrUG9zdEFuYWx5c2lzUXVlc3Rpb25zIiwgImNsb3NlQWxlcnRNb2RhbCIsICJzaG93QWxlcnRNb2RhbCIsICJzaG93Q29uZmlybU1vZGFsIiwgInNob3dUb2FzdCIsICJ1cGRhdGVBY3Rpb25CdXR0b25zIiwgInNob3dBbGVydE1vZGFsIiwgImNsb3NlQWxlcnRNb2RhbCIsICJzaG93Q29uZmlybU1vZGFsIiwgInNob3dUb2FzdCIsICJzdGF0ZU1hbmFnZXIiLCAiZ2VuZXJhdGlvblN0YXRlIiwgInVwZGF0ZUFjdGlvbkJ1dHRvbnMiLCAiZXZlbnQiLCAiZmV0Y2hBbmREaXNwbGF5TGxtTG9nIiwgImxvZyIsICJ0ZXh0IiwgImVzY2FwZUh0bWwiLCAibSIsICJodG1sIiwgImZldGNoQW5kRGlzcGxheUxsbUxvZyIsICJzZXNzaW9uSWQiLCAiZ2V0U2Vzc2lvbklkRnJvbVVSTCIsICJ1cGRhdGVBdXRoQmFkZ2UiLCAidXBkYXRlQXV0aEJhZGdlIiwgInRleHQiLCAiZ2V0UHJvdmlkZXJJbmZvIiwgInBvcHVsYXRlQXRzU2NvcmVUYWIiLCAic2Vzc2lvbklkIiwgInN0YXRlTWFuYWdlciIsICJfIiwgImVzY2FwZUh0bWwiLCAicHVzaEZvY3VzU3RhY2siLCAidHJhcEZvY3VzIiwgInVwZGF0ZUF0c0JhZGdlIiwgInJlc3RvcmVGb2N1cyIsICJrIiwgInBvcHVsYXRlQXRzU2NvcmVUYWIiLCAiX0FDVElPTl9MQUJFTFMiLCAic2VuZEFjdGlvbiIsICJ1cGRhdGVQb3NpdGlvblRpdGxlIiwgImxvZyIsICJfQUNUSU9OX0xBQkVMUyIsICJzZW5kQWN0aW9uIiwgInN0YXRlTWFuYWdlciIsICJfZSIsICJTdG9yYWdlS2V5cyIsICJ0ZXh0IiwgInVwZGF0ZVBvc2l0aW9uVGl0bGUiLCAiYW5hbHl6ZUpvYiIsICJtZXJnZVBvc3RBbmFseXNpc1F1ZXN0aW9ucyIsICJub3JtYWxpemVQb3N0QW5hbHlzaXNRdWVzdGlvbnMiLCAibG9nIiwgIm5vcm1hbGl6ZVBvc3RBbmFseXNpc1F1ZXN0aW9ucyIsICJxIiwgInRleHQiLCAibWVyZ2VQb3N0QW5hbHlzaXNRdWVzdGlvbnMiLCAiYW5hbHl6ZUpvYiIsICJzdGF0ZU1hbmFnZXIiLCAiU3RvcmFnZUtleXMiLCAiX2UiLCAicG9wdWxhdGVHb2Fsc1RhYiIsICJsb2ciLCAicG9wdWxhdGVHb2Fsc1RhYiIsICJfZ2V0Q3VycmVudFNlc3Npb25JZFZhbHVlIiwgImJ1aWxkU2Vzc2lvblN3aXRjaGVyTGFiZWwiLCAiY3JlYXRlTmV3U2Vzc2lvbkFuZE5hdmlnYXRlIiwgImVuc3VyZVNlc3Npb25Db250ZXh0IiwgImZvcm1hdFNlc3Npb25QaGFzZUxhYmVsIiwgImZvcm1hdFNlc3Npb25UaW1lc3RhbXAiLCAiZ2V0QWN0aXZlU2Vzc2lvbk93bmVyc2hpcE1ldGEiLCAibG9hZFNlc3Npb25GaWxlIiwgIm1heWJlU2hvd1dlbGNvbWVNb2RhbCIsICJyZXN0b3JlU2Vzc2lvbiIsICJzYXZlVGFiRGF0YSIsICJsb2ciLCAiZm9ybWF0U2Vzc2lvblBoYXNlTGFiZWwiLCAiX2dldEN1cnJlbnRTZXNzaW9uSWRWYWx1ZSIsICJfIiwgImJ1aWxkU2Vzc2lvblN3aXRjaGVyTGFiZWwiLCAiZ2V0QWN0aXZlU2Vzc2lvbk93bmVyc2hpcE1ldGEiLCAiZm9ybWF0U2Vzc2lvblRpbWVzdGFtcCIsICJtYXliZVNob3dXZWxjb21lTW9kYWwiLCAiY3JlYXRlTmV3U2Vzc2lvbkFuZE5hdmlnYXRlIiwgInN0YXRlTWFuYWdlciIsICJQSEFTRVMiLCAiZW5zdXJlU2Vzc2lvbkNvbnRleHQiLCAicmVzdG9yZVNlc3Npb24iLCAiayIsICJ2IiwgIl9lIiwgImxvYWRTZXNzaW9uRmlsZSIsICJzYXZlVGFiRGF0YSIsICJwb3B1bGF0ZUpvYlRhYiIsICJzaG93TG9hZEpvYlBhbmVsIiwgIl9nZXREZWZhdWx0cyIsICJfZGVmYXVsdHMiLCAiY2hhbmdlRGVmYXVsdHMiLCAibmV3RGVmYXVsdHMiLCAibm9vcFRlc3QiLCAiZWRpdCIsICJyZWdleCIsICJvcHQiLCAic291cmNlIiwgIm9iaiIsICJuYW1lIiwgInZhbCIsICJ2YWxTb3VyY2UiLCAib3RoZXIiLCAic3VwcG9ydHNMb29rYmVoaW5kIiwgImJ1bGwiLCAiaW5kZW50IiwgIm5ld2xpbmUiLCAiYmxvY2tDb2RlIiwgImZlbmNlcyIsICJociIsICJoZWFkaW5nIiwgImJ1bGxldCIsICJsaGVhZGluZ0NvcmUiLCAibGhlYWRpbmciLCAibGhlYWRpbmdHZm0iLCAiX3BhcmFncmFwaCIsICJibG9ja1RleHQiLCAiX2Jsb2NrTGFiZWwiLCAiZGVmIiwgImxpc3QiLCAiX3RhZyIsICJfY29tbWVudCIsICJodG1sIiwgInBhcmFncmFwaCIsICJibG9ja3F1b3RlIiwgImJsb2NrTm9ybWFsIiwgImdmbVRhYmxlIiwgImJsb2NrR2ZtIiwgImJsb2NrUGVkYW50aWMiLCAiZXNjYXBlIiwgImlubGluZUNvZGUiLCAiYnIiLCAiaW5saW5lVGV4dCIsICJfcHVuY3R1YXRpb24iLCAiX3B1bmN0dWF0aW9uT3JTcGFjZSIsICJfbm90UHVuY3R1YXRpb25PclNwYWNlIiwgInB1bmN0dWF0aW9uIiwgIl9wdW5jdHVhdGlvbkdmbVN0cm9uZ0VtIiwgIl9wdW5jdHVhdGlvbk9yU3BhY2VHZm1TdHJvbmdFbSIsICJfbm90UHVuY3R1YXRpb25PclNwYWNlR2ZtU3Ryb25nRW0iLCAiYmxvY2tTa2lwIiwgImVtU3Ryb25nTERlbGltQ29yZSIsICJlbVN0cm9uZ0xEZWxpbSIsICJlbVN0cm9uZ0xEZWxpbUdmbSIsICJlbVN0cm9uZ1JEZWxpbUFzdENvcmUiLCAiZW1TdHJvbmdSRGVsaW1Bc3QiLCAiZW1TdHJvbmdSRGVsaW1Bc3RHZm0iLCAiZW1TdHJvbmdSRGVsaW1VbmQiLCAiZGVsTERlbGltIiwgImRlbFJEZWxpbUNvcmUiLCAiZGVsUkRlbGltIiwgImFueVB1bmN0dWF0aW9uIiwgImF1dG9saW5rIiwgIl9pbmxpbmVDb21tZW50IiwgInRhZyIsICJfaW5saW5lTGFiZWwiLCAibGluayIsICJyZWZsaW5rIiwgIm5vbGluayIsICJyZWZsaW5rU2VhcmNoIiwgIl9jYXNlSW5zZW5zaXRpdmVQcm90b2NvbCIsICJpbmxpbmVOb3JtYWwiLCAiaW5saW5lUGVkYW50aWMiLCAiaW5saW5lR2ZtIiwgImlubGluZUJyZWFrcyIsICJibG9jayIsICJpbmxpbmUiLCAiZXNjYXBlUmVwbGFjZW1lbnRzIiwgImdldEVzY2FwZVJlcGxhY2VtZW50IiwgImNoIiwgImVzY2FwZUh0bWxFbnRpdGllcyIsICJlbmNvZGUiLCAiY2xlYW5VcmwiLCAiaHJlZiIsICJzcGxpdENlbGxzIiwgInRhYmxlUm93IiwgImNvdW50IiwgInJvdyIsICJtYXRjaCIsICJvZmZzZXQiLCAic3RyIiwgImVzY2FwZWQiLCAiY3VyciIsICJjZWxscyIsICJpIiwgInJ0cmltIiwgImMiLCAiaW52ZXJ0IiwgImwiLCAic3VmZkxlbiIsICJjdXJyQ2hhciIsICJmaW5kQ2xvc2luZ0JyYWNrZXQiLCAiYiIsICJsZXZlbCIsICJleHBhbmRUYWJzIiwgImxpbmUiLCAiY29sIiwgImV4cGFuZGVkIiwgImNoYXIiLCAiYWRkZWQiLCAib3V0cHV0TGluayIsICJjYXAiLCAicmF3IiwgImxleGVyIiwgInJ1bGVzIiwgInRpdGxlIiwgInRleHQiLCAidG9rZW4iLCAiaW5kZW50Q29kZUNvbXBlbnNhdGlvbiIsICJtYXRjaEluZGVudFRvQ29kZSIsICJpbmRlbnRUb0NvZGUiLCAibm9kZSIsICJtYXRjaEluZGVudEluTm9kZSIsICJpbmRlbnRJbk5vZGUiLCAiX1Rva2VuaXplciIsICJvcHRpb25zIiwgInNyYyIsICJ0cmltbWVkIiwgImxpbmVzIiwgInRva2VucyIsICJpbkJsb2NrcXVvdGUiLCAiY3VycmVudExpbmVzIiwgImN1cnJlbnRSYXciLCAiY3VycmVudFRleHQiLCAidG9wIiwgImxhc3RUb2tlbiIsICJvbGRUb2tlbiIsICJuZXdUZXh0IiwgIm5ld1Rva2VuIiwgImlzb3JkZXJlZCIsICJpdGVtUmVnZXgiLCAiZW5kc1dpdGhCbGFua0xpbmUiLCAiZW5kRWFybHkiLCAiaXRlbUNvbnRlbnRzIiwgIm5leHRMaW5lIiwgImJsYW5rTGluZSIsICJuZXh0QnVsbGV0UmVnZXgiLCAiaHJSZWdleCIsICJmZW5jZXNCZWdpblJlZ2V4IiwgImhlYWRpbmdCZWdpblJlZ2V4IiwgImh0bWxCZWdpblJlZ2V4IiwgImJsb2NrcXVvdGVCZWdpblJlZ2V4IiwgInJhd0xpbmUiLCAibmV4dExpbmVXaXRob3V0VGFicyIsICJsYXN0SXRlbSIsICJpdGVtIiwgInRhc2tSYXciLCAiY2hlY2tib3hUb2tlbiIsICJzcGFjZXJzIiwgInQiLCAiaGFzTXVsdGlwbGVMaW5lQnJlYWtzIiwgImhlYWRlcnMiLCAiYWxpZ25zIiwgInJvd3MiLCAiYWxpZ24iLCAiY2VsbCIsICJ0cmltbWVkVXJsIiwgInJ0cmltU2xhc2giLCAibGFzdFBhcmVuSW5kZXgiLCAibGlua0xlbiIsICJsaW5rcyIsICJsaW5rU3RyaW5nIiwgIm1hc2tlZFNyYyIsICJwcmV2Q2hhciIsICJsTGVuZ3RoIiwgInJEZWxpbSIsICJyTGVuZ3RoIiwgImRlbGltVG90YWwiLCAibWlkRGVsaW1Ub3RhbCIsICJlbmRSZWciLCAibGFzdENoYXJMZW5ndGgiLCAiaGFzTm9uU3BhY2VDaGFycyIsICJoYXNTcGFjZUNoYXJzT25Cb3RoRW5kcyIsICJwcmV2Q2FwWmVybyIsICJfTGV4ZXIiLCAiX19MZXhlciIsICJuZXh0IiwgImxhc3RQYXJhZ3JhcGhDbGlwcGVkIiwgImV4dFRva2VuaXplciIsICJjdXRTcmMiLCAic3RhcnRJbmRleCIsICJ0ZW1wU3JjIiwgInRlbXBTdGFydCIsICJnZXRTdGFydEluZGV4IiwgImVyck1zZyIsICJrZWVwUHJldkNoYXIiLCAiX1JlbmRlcmVyIiwgImxhbmciLCAibGFuZ1N0cmluZyIsICJjb2RlIiwgImRlcHRoIiwgIm9yZGVyZWQiLCAic3RhcnQiLCAiYm9keSIsICJqIiwgInR5cGUiLCAic3RhcnRBdHRyIiwgImNoZWNrZWQiLCAiaGVhZGVyIiwgImsiLCAiY29udGVudCIsICJjbGVhbkhyZWYiLCAib3V0IiwgIl9UZXh0UmVuZGVyZXIiLCAiX1BhcnNlciIsICJfX1BhcnNlciIsICJhbnlUb2tlbiIsICJnZW5lcmljVG9rZW4iLCAicmV0IiwgInJlbmRlcmVyIiwgIl9Ib29rcyIsICJtYXJrZG93biIsICJNYXJrZWQiLCAiYXJncyIsICJjYWxsYmFjayIsICJ2YWx1ZXMiLCAidGFibGVUb2tlbiIsICJsaXN0VG9rZW4iLCAiY2hpbGRUb2tlbnMiLCAiZXh0ZW5zaW9ucyIsICJwYWNrIiwgIm9wdHMiLCAiZXh0IiwgInByZXZSZW5kZXJlciIsICJleHRMZXZlbCIsICJwcm9wIiwgInJlbmRlcmVyUHJvcCIsICJyZW5kZXJlckZ1bmMiLCAidG9rZW5pemVyIiwgInRva2VuaXplclByb3AiLCAidG9rZW5pemVyRnVuYyIsICJwcmV2VG9rZW5pemVyIiwgImhvb2tzIiwgImhvb2tzUHJvcCIsICJob29rc0Z1bmMiLCAicHJldkhvb2siLCAiYXJnIiwgIndhbGtUb2tlbnMiLCAicGFja1dhbGt0b2tlbnMiLCAiYmxvY2tUeXBlIiwgIm9yaWdPcHQiLCAidGhyb3dFcnJvciIsICJwcm9jZXNzZWRTcmMiLCAicHJvY2Vzc2VkVG9rZW5zIiwgImUiLCAic2lsZW50IiwgImFzeW5jIiwgIm1zZyIsICJtYXJrZWRJbnN0YW5jZSIsICJtYXJrZWQiLCAic2V0T3B0aW9ucyIsICJ1c2UiLCAicGFyc2VJbmxpbmUiLCAicGFyc2VyIiwgIl9QYXJzZXIiLCAibGV4ZXIiLCAiX0xleGVyIiwgImVudHJpZXMiLCAic2V0UHJvdG90eXBlT2YiLCAiaXNGcm96ZW4iLCAiZ2V0UHJvdG90eXBlT2YiLCAiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwgIk9iamVjdCIsICJmcmVlemUiLCAic2VhbCIsICJjcmVhdGUiLCAiYXBwbHkiLCAiY29uc3RydWN0IiwgIlJlZmxlY3QiLCAieCIsICJmdW5jIiwgInRoaXNBcmciLCAiX2xlbiIsICJhcmd1bWVudHMiLCAibGVuZ3RoIiwgImFyZ3MiLCAiQXJyYXkiLCAiX2tleSIsICJGdW5jIiwgIl9sZW4yIiwgIl9rZXkyIiwgImFycmF5Rm9yRWFjaCIsICJ1bmFwcGx5IiwgInByb3RvdHlwZSIsICJmb3JFYWNoIiwgImFycmF5TGFzdEluZGV4T2YiLCAibGFzdEluZGV4T2YiLCAiYXJyYXlQb3AiLCAicG9wIiwgImFycmF5UHVzaCIsICJwdXNoIiwgImFycmF5U3BsaWNlIiwgInNwbGljZSIsICJzdHJpbmdUb0xvd2VyQ2FzZSIsICJTdHJpbmciLCAidG9Mb3dlckNhc2UiLCAic3RyaW5nVG9TdHJpbmciLCAidG9TdHJpbmciLCAic3RyaW5nTWF0Y2giLCAibWF0Y2giLCAic3RyaW5nUmVwbGFjZSIsICJyZXBsYWNlIiwgInN0cmluZ0luZGV4T2YiLCAiaW5kZXhPZiIsICJzdHJpbmdUcmltIiwgInRyaW0iLCAib2JqZWN0SGFzT3duUHJvcGVydHkiLCAiaGFzT3duUHJvcGVydHkiLCAicmVnRXhwVGVzdCIsICJSZWdFeHAiLCAidGVzdCIsICJ0eXBlRXJyb3JDcmVhdGUiLCAidW5jb25zdHJ1Y3QiLCAiVHlwZUVycm9yIiwgImxhc3RJbmRleCIsICJfbGVuMyIsICJfa2V5MyIsICJfbGVuNCIsICJfa2V5NCIsICJhZGRUb1NldCIsICJzZXQiLCAiYXJyYXkiLCAidHJhbnNmb3JtQ2FzZUZ1bmMiLCAibCIsICJlbGVtZW50IiwgImxjRWxlbWVudCIsICJjbGVhbkFycmF5IiwgImluZGV4IiwgImlzUHJvcGVydHlFeGlzdCIsICJjbG9uZSIsICJvYmplY3QiLCAibmV3T2JqZWN0IiwgInByb3BlcnR5IiwgInZhbHVlIiwgImlzQXJyYXkiLCAiY29uc3RydWN0b3IiLCAibG9va3VwR2V0dGVyIiwgInByb3AiLCAiZGVzYyIsICJnZXQiLCAiZmFsbGJhY2tWYWx1ZSIsICJodG1sIiwgInN2ZyIsICJzdmdGaWx0ZXJzIiwgInN2Z0Rpc2FsbG93ZWQiLCAibWF0aE1sIiwgIm1hdGhNbERpc2FsbG93ZWQiLCAidGV4dCIsICJ4bWwiLCAiTVVTVEFDSEVfRVhQUiIsICJFUkJfRVhQUiIsICJUTVBMSVRfRVhQUiIsICJEQVRBX0FUVFIiLCAiQVJJQV9BVFRSIiwgIklTX0FMTE9XRURfVVJJIiwgIklTX1NDUklQVF9PUl9EQVRBIiwgIkFUVFJfV0hJVEVTUEFDRSIsICJET0NUWVBFX05BTUUiLCAiQ1VTVE9NX0VMRU1FTlQiLCAiTk9ERV9UWVBFIiwgImF0dHJpYnV0ZSIsICJjZGF0YVNlY3Rpb24iLCAiZW50aXR5UmVmZXJlbmNlIiwgImVudGl0eU5vZGUiLCAicHJvZ3Jlc3NpbmdJbnN0cnVjdGlvbiIsICJjb21tZW50IiwgImRvY3VtZW50IiwgImRvY3VtZW50VHlwZSIsICJkb2N1bWVudEZyYWdtZW50IiwgIm5vdGF0aW9uIiwgImdldEdsb2JhbCIsICJ3aW5kb3ciLCAiX2NyZWF0ZVRydXN0ZWRUeXBlc1BvbGljeSIsICJ0cnVzdGVkVHlwZXMiLCAicHVyaWZ5SG9zdEVsZW1lbnQiLCAiY3JlYXRlUG9saWN5IiwgInN1ZmZpeCIsICJBVFRSX05BTUUiLCAiaGFzQXR0cmlidXRlIiwgImdldEF0dHJpYnV0ZSIsICJwb2xpY3lOYW1lIiwgImNyZWF0ZUhUTUwiLCAiY3JlYXRlU2NyaXB0VVJMIiwgInNjcmlwdFVybCIsICJfIiwgImNvbnNvbGUiLCAid2FybiIsICJfY3JlYXRlSG9va3NNYXAiLCAiYWZ0ZXJTYW5pdGl6ZUF0dHJpYnV0ZXMiLCAiYWZ0ZXJTYW5pdGl6ZUVsZW1lbnRzIiwgImFmdGVyU2FuaXRpemVTaGFkb3dET00iLCAiYmVmb3JlU2FuaXRpemVBdHRyaWJ1dGVzIiwgImJlZm9yZVNhbml0aXplRWxlbWVudHMiLCAiYmVmb3JlU2FuaXRpemVTaGFkb3dET00iLCAidXBvblNhbml0aXplQXR0cmlidXRlIiwgInVwb25TYW5pdGl6ZUVsZW1lbnQiLCAidXBvblNhbml0aXplU2hhZG93Tm9kZSIsICJjcmVhdGVET01QdXJpZnkiLCAidW5kZWZpbmVkIiwgIkRPTVB1cmlmeSIsICJyb290IiwgInZlcnNpb24iLCAiVkVSU0lPTiIsICJyZW1vdmVkIiwgIm5vZGVUeXBlIiwgIkVsZW1lbnQiLCAiaXNTdXBwb3J0ZWQiLCAib3JpZ2luYWxEb2N1bWVudCIsICJjdXJyZW50U2NyaXB0IiwgIkRvY3VtZW50RnJhZ21lbnQiLCAiSFRNTFRlbXBsYXRlRWxlbWVudCIsICJOb2RlIiwgIk5vZGVGaWx0ZXIiLCAiTmFtZWROb2RlTWFwIiwgIk1vek5hbWVkQXR0ck1hcCIsICJIVE1MRm9ybUVsZW1lbnQiLCAiRE9NUGFyc2VyIiwgIkVsZW1lbnRQcm90b3R5cGUiLCAiY2xvbmVOb2RlIiwgInJlbW92ZSIsICJnZXROZXh0U2libGluZyIsICJnZXRDaGlsZE5vZGVzIiwgImdldFBhcmVudE5vZGUiLCAidGVtcGxhdGUiLCAiY3JlYXRlRWxlbWVudCIsICJjb250ZW50IiwgIm93bmVyRG9jdW1lbnQiLCAidHJ1c3RlZFR5cGVzUG9saWN5IiwgImVtcHR5SFRNTCIsICJpbXBsZW1lbnRhdGlvbiIsICJjcmVhdGVOb2RlSXRlcmF0b3IiLCAiY3JlYXRlRG9jdW1lbnRGcmFnbWVudCIsICJnZXRFbGVtZW50c0J5VGFnTmFtZSIsICJpbXBvcnROb2RlIiwgImhvb2tzIiwgImNyZWF0ZUhUTUxEb2N1bWVudCIsICJFWFBSRVNTSU9OUyIsICJBTExPV0VEX1RBR1MiLCAiREVGQVVMVF9BTExPV0VEX1RBR1MiLCAiVEFHUyIsICJBTExPV0VEX0FUVFIiLCAiREVGQVVMVF9BTExPV0VEX0FUVFIiLCAiQVRUUlMiLCAiQ1VTVE9NX0VMRU1FTlRfSEFORExJTkciLCAidGFnTmFtZUNoZWNrIiwgIndyaXRhYmxlIiwgImNvbmZpZ3VyYWJsZSIsICJlbnVtZXJhYmxlIiwgImF0dHJpYnV0ZU5hbWVDaGVjayIsICJhbGxvd0N1c3RvbWl6ZWRCdWlsdEluRWxlbWVudHMiLCAiRk9SQklEX1RBR1MiLCAiRk9SQklEX0FUVFIiLCAiRVhUUkFfRUxFTUVOVF9IQU5ETElORyIsICJ0YWdDaGVjayIsICJhdHRyaWJ1dGVDaGVjayIsICJBTExPV19BUklBX0FUVFIiLCAiQUxMT1dfREFUQV9BVFRSIiwgIkFMTE9XX1VOS05PV05fUFJPVE9DT0xTIiwgIkFMTE9XX1NFTEZfQ0xPU0VfSU5fQVRUUiIsICJTQUZFX0ZPUl9URU1QTEFURVMiLCAiU0FGRV9GT1JfWE1MIiwgIldIT0xFX0RPQ1VNRU5UIiwgIlNFVF9DT05GSUciLCAiRk9SQ0VfQk9EWSIsICJSRVRVUk5fRE9NIiwgIlJFVFVSTl9ET01fRlJBR01FTlQiLCAiUkVUVVJOX1RSVVNURURfVFlQRSIsICJTQU5JVElaRV9ET00iLCAiU0FOSVRJWkVfTkFNRURfUFJPUFMiLCAiU0FOSVRJWkVfTkFNRURfUFJPUFNfUFJFRklYIiwgIktFRVBfQ09OVEVOVCIsICJJTl9QTEFDRSIsICJVU0VfUFJPRklMRVMiLCAiRk9SQklEX0NPTlRFTlRTIiwgIkRFRkFVTFRfRk9SQklEX0NPTlRFTlRTIiwgIkRBVEFfVVJJX1RBR1MiLCAiREVGQVVMVF9EQVRBX1VSSV9UQUdTIiwgIlVSSV9TQUZFX0FUVFJJQlVURVMiLCAiREVGQVVMVF9VUklfU0FGRV9BVFRSSUJVVEVTIiwgIk1BVEhNTF9OQU1FU1BBQ0UiLCAiU1ZHX05BTUVTUEFDRSIsICJIVE1MX05BTUVTUEFDRSIsICJOQU1FU1BBQ0UiLCAiSVNfRU1QVFlfSU5QVVQiLCAiQUxMT1dFRF9OQU1FU1BBQ0VTIiwgIkRFRkFVTFRfQUxMT1dFRF9OQU1FU1BBQ0VTIiwgIk1BVEhNTF9URVhUX0lOVEVHUkFUSU9OX1BPSU5UUyIsICJIVE1MX0lOVEVHUkFUSU9OX1BPSU5UUyIsICJDT01NT05fU1ZHX0FORF9IVE1MX0VMRU1FTlRTIiwgIlBBUlNFUl9NRURJQV9UWVBFIiwgIlNVUFBPUlRFRF9QQVJTRVJfTUVESUFfVFlQRVMiLCAiREVGQVVMVF9QQVJTRVJfTUVESUFfVFlQRSIsICJDT05GSUciLCAiZm9ybUVsZW1lbnQiLCAiaXNSZWdleE9yRnVuY3Rpb24iLCAidGVzdFZhbHVlIiwgIkZ1bmN0aW9uIiwgIl9wYXJzZUNvbmZpZyIsICJjZmciLCAiQUREX1VSSV9TQUZFX0FUVFIiLCAiQUREX0RBVEFfVVJJX1RBR1MiLCAiQUxMT1dFRF9VUklfUkVHRVhQIiwgIkFERF9UQUdTIiwgIkFERF9BVFRSIiwgIkFERF9GT1JCSURfQ09OVEVOVFMiLCAidGFibGUiLCAidGJvZHkiLCAiVFJVU1RFRF9UWVBFU19QT0xJQ1kiLCAiQUxMX1NWR19UQUdTIiwgIkFMTF9NQVRITUxfVEFHUyIsICJfY2hlY2tWYWxpZE5hbWVzcGFjZSIsICJwYXJlbnQiLCAidGFnTmFtZSIsICJuYW1lc3BhY2VVUkkiLCAicGFyZW50VGFnTmFtZSIsICJCb29sZWFuIiwgIl9mb3JjZVJlbW92ZSIsICJub2RlIiwgInJlbW92ZUNoaWxkIiwgIl9yZW1vdmVBdHRyaWJ1dGUiLCAibmFtZSIsICJnZXRBdHRyaWJ1dGVOb2RlIiwgImZyb20iLCAicmVtb3ZlQXR0cmlidXRlIiwgInNldEF0dHJpYnV0ZSIsICJfaW5pdERvY3VtZW50IiwgImRpcnR5IiwgImRvYyIsICJsZWFkaW5nV2hpdGVzcGFjZSIsICJtYXRjaGVzIiwgImRpcnR5UGF5bG9hZCIsICJwYXJzZUZyb21TdHJpbmciLCAiZG9jdW1lbnRFbGVtZW50IiwgImNyZWF0ZURvY3VtZW50IiwgImlubmVySFRNTCIsICJib2R5IiwgImluc2VydEJlZm9yZSIsICJjcmVhdGVUZXh0Tm9kZSIsICJjaGlsZE5vZGVzIiwgImNhbGwiLCAiX2NyZWF0ZU5vZGVJdGVyYXRvciIsICJTSE9XX0VMRU1FTlQiLCAiU0hPV19DT01NRU5UIiwgIlNIT1dfVEVYVCIsICJTSE9XX1BST0NFU1NJTkdfSU5TVFJVQ1RJT04iLCAiU0hPV19DREFUQV9TRUNUSU9OIiwgIl9pc0Nsb2JiZXJlZCIsICJub2RlTmFtZSIsICJ0ZXh0Q29udGVudCIsICJhdHRyaWJ1dGVzIiwgImhhc0NoaWxkTm9kZXMiLCAiX2lzTm9kZSIsICJfZXhlY3V0ZUhvb2tzIiwgImN1cnJlbnROb2RlIiwgImRhdGEiLCAiaG9vayIsICJfc2FuaXRpemVFbGVtZW50cyIsICJhbGxvd2VkVGFncyIsICJmaXJzdEVsZW1lbnRDaGlsZCIsICJfaXNCYXNpY0N1c3RvbUVsZW1lbnQiLCAicGFyZW50Tm9kZSIsICJjaGlsZENvdW50IiwgImkiLCAiY2hpbGRDbG9uZSIsICJfX3JlbW92YWxDb3VudCIsICJleHByIiwgIl9pc1ZhbGlkQXR0cmlidXRlIiwgImxjVGFnIiwgImxjTmFtZSIsICJfc2FuaXRpemVBdHRyaWJ1dGVzIiwgImhvb2tFdmVudCIsICJhdHRyTmFtZSIsICJhdHRyVmFsdWUiLCAia2VlcEF0dHIiLCAiYWxsb3dlZEF0dHJpYnV0ZXMiLCAiZm9yY2VLZWVwQXR0ciIsICJhdHRyIiwgImluaXRWYWx1ZSIsICJnZXRBdHRyaWJ1dGVUeXBlIiwgInNldEF0dHJpYnV0ZU5TIiwgIl9zYW5pdGl6ZVNoYWRvd0RPTSIsICJmcmFnbWVudCIsICJzaGFkb3dOb2RlIiwgInNoYWRvd0l0ZXJhdG9yIiwgIm5leHROb2RlIiwgInNhbml0aXplIiwgImltcG9ydGVkTm9kZSIsICJyZXR1cm5Ob2RlIiwgImFwcGVuZENoaWxkIiwgImZpcnN0Q2hpbGQiLCAibm9kZUl0ZXJhdG9yIiwgInNoYWRvd3Jvb3QiLCAic2hhZG93cm9vdG1vZGUiLCAic2VyaWFsaXplZEhUTUwiLCAib3V0ZXJIVE1MIiwgImRvY3R5cGUiLCAic2V0Q29uZmlnIiwgImNsZWFyQ29uZmlnIiwgImlzVmFsaWRBdHRyaWJ1dGUiLCAidGFnIiwgImFkZEhvb2siLCAiZW50cnlQb2ludCIsICJob29rRnVuY3Rpb24iLCAicmVtb3ZlSG9vayIsICJyZW1vdmVIb29rcyIsICJyZW1vdmVBbGxIb29rcyIsICJsb2ciLCAidGV4dCIsICJwb3B1bGF0ZUpvYlRhYiIsICJodG1sIiwgIlBIQVNFUyIsICJzaG93TG9hZEpvYlBhbmVsIiwgInN0YXRlTWFuYWdlciIsICJldmVudCIsICJtIiwgInUiLCAiX3Byb2NlZWRBZnRlckludGFrZSIsICJfc2hvd0ludGFrZUNvbmZpcm1DYXJkIiwgInNlbmRNZXNzYWdlIiwgImxvZyIsICJSRVRSWV9QT0xJQ1lfU1RPUkFHRV9LRVkiLCAidGV4dCIsICJzZW5kTWVzc2FnZSIsICJzdGF0ZU1hbmFnZXIiLCAiZ2V0U2Vzc2lvbklkRnJvbVVSTCIsICJfc2hvd0ludGFrZUNvbmZpcm1DYXJkIiwgIl9wcm9jZWVkQWZ0ZXJJbnRha2UiLCAiX2UiLCAiYXNrUG9zdEFuYWx5c2lzUXVlc3Rpb25zIiwgImhhbmRsZVF1ZXN0aW9uUmVzcG9uc2UiLCAicG9wdWxhdGVRdWVzdGlvbnNUYWIiLCAibG9nIiwgImFza1Bvc3RBbmFseXNpc1F1ZXN0aW9ucyIsICJwb3B1bGF0ZVF1ZXN0aW9uc1RhYiIsICJzdGF0ZU1hbmFnZXIiLCAicSIsICJfIiwgImhhbmRsZVF1ZXN0aW9uUmVzcG9uc2UiLCAiYnVpbGRFeHBlcmllbmNlUmV2aWV3VGFibGUiLCAiaGFuZGxlRXhwZXJpZW5jZVJlc3BvbnNlIiwgImxvZyIsICJfZmluZEV4cGVyaWVuY2VSZWNvbW1lbmRhdGlvblJlY29yZCIsICJfIiwgImJ1aWxkRXhwZXJpZW5jZVJldmlld1RhYmxlIiwgImIiLCAiaGFuZGxlRXhwZXJpZW5jZVJlc3BvbnNlIiwgInN0YXRlTWFuYWdlciIsICJidWlsZFNraWxsc1Jldmlld1RhYmxlIiwgImhhbmRsZVNraWxsc1Jlc3BvbnNlIiwgImxvZyIsICJtIiwgIngiLCAibmFtZSIsICJza2lsbCIsICJfIiwgImJ1aWxkU2tpbGxzUmV2aWV3VGFibGUiLCAic3RhdGVNYW5hZ2VyIiwgImIiLCAiZSIsICJza2lsbE5hbWUiLCAiaGFuZGxlU2tpbGxzUmVzcG9uc2UiLCAiX2FjaFZlcmJXYXJuaW5nIiwgImJ1aWxkQWNoaWV2ZW1lbnRzRWRpdG9yIiwgImJ1aWxkQWNoaWV2ZW1lbnRzUmV2aWV3VGFibGUiLCAiZW50cmllcyIsICJfIiwgImJ1aWxkQWNoaWV2ZW1lbnRzUmV2aWV3VGFibGUiLCAiYiIsICJodG1sIiwgImsiLCAidiIsICJzdGF0ZU1hbmFnZXIiLCAiYnVpbGRBY2hpZXZlbWVudHNFZGl0b3IiLCAiX2FjaFZlcmJXYXJuaW5nIiwgInRleHQiLCAiX2UiLCAiYnVpbGRUYWdsaW5lUmV2aWV3U2VjdGlvbiIsICJidWlsZFRhZ2xpbmVSZXZpZXdTZWN0aW9uIiwgIl9lIiwgInN0YXRlTWFuYWdlciIsICJidWlsZFN1bW1hcnlGb2N1c1NlY3Rpb24iLCAiYnVpbGRTdW1tYXJ5Rm9jdXNTZWN0aW9uIiwgImsiLCAidGV4dCIsICJ3IiwgInN0YXRlTWFuYWdlciIsICJidWlsZFB1YmxpY2F0aW9uc1Jldmlld1RhYmxlIiwgImxvZyIsICJidWlsZFB1YmxpY2F0aW9uc1Jldmlld1RhYmxlIiwgInEiLCAiaHRtbCIsICJidG4iLCAic3RhdGVNYW5hZ2VyIiwgImFwcGx5UmV3cml0ZUFjdGlvbiIsICJmZXRjaEFuZFJldmlld1Jld3JpdGVzIiwgInJlbmRlclJld3JpdGVQYW5lbCIsICJyZXdyaXRlRGVjaXNpb25zIiwgInN1Ym1pdFJld3JpdGVEZWNpc2lvbnMiLCAicmV3cml0ZURlY2lzaW9ucyIsICJfIiwgImZldGNoQW5kUmV2aWV3UmV3cml0ZXMiLCAicmVuZGVyUmV3cml0ZVBhbmVsIiwgInciLCAiYXBwbHlSZXdyaXRlQWN0aW9uIiwgImIiLCAibSIsICJpIiwgImoiLCAiayIsICJzdWJtaXRSZXdyaXRlRGVjaXNpb25zIiwgInN0YXRlTWFuYWdlciIsICJwb3B1bGF0ZVNwZWxsQ2hlY2tUYWIiLCAic3VibWl0U3BlbGxDaGVja0RlY2lzaW9ucyIsICJsb2ciLCAicG9wdWxhdGVTcGVsbENoZWNrVGFiIiwgImNvbnRlbnQiLCAic3RhdGVNYW5hZ2VyIiwgImh0bWwiLCAiYiIsICJhdHNTY29yZSIsICJrIiwgInN1Ym1pdFNwZWxsQ2hlY2tEZWNpc2lvbnMiLCAicG9wdWxhdGVEb3dubG9hZFRhYiIsICJsb2ciLCAiaHRtbCIsICJfIiwgInBvcHVsYXRlRG93bmxvYWRUYWIiLCAic3RhdGVNYW5hZ2VyIiwgInciLCAibSIsICJmaW5hbEdlbmVyYXRpb25Db21wbGV0ZSIsICJsb2ciLCAiaHRtbCIsICJmaW5hbEdlbmVyYXRpb25Db21wbGV0ZSIsICJzdGF0ZU1hbmFnZXIiLCAicmVuZGVyTWFzdGVyRGF0YUFpVXBkYXRlRGlzYWJsZWROb3RlIiwgInJlbmRlck1hc3RlckRhdGFBaVVwZGF0ZVBhbmVsIiwgImxvZyIsICJyZW5kZXJNYXN0ZXJEYXRhQWlVcGRhdGVQYW5lbCIsICJyZW5kZXJNYXN0ZXJEYXRhQWlVcGRhdGVEaXNhYmxlZE5vdGUiLCAibSIsICJldmVudCIsICJvcGVuTWFzdGVyQ3ZNb2RhbCIsICJwb3B1bGF0ZU1hc3RlclRhYiIsICJyZWRvTWFzdGVyRGF0YUNoYW5nZSIsICJ1bmRvTWFzdGVyRGF0YUNoYW5nZSIsICJ4IiwgInYiLCAidGV4dCIsICJrIiwgIl8iLCAic2Vzc2lvbklkIiwgImV2ZW50IiwgIl9yZW5kZXJDb25zaXN0ZW5jeVJlcG9ydCIsICJwb3B1bGF0ZUNvdmVyTGV0dGVyVGFiIiwgInBvcHVsYXRlQ292ZXJMZXR0ZXJUYWIiLCAiXyIsICJ0ZXh0IiwgIl9yZW5kZXJDb25zaXN0ZW5jeVJlcG9ydCIsICJzdGF0ZU1hbmFnZXIiLCAiayIsICJyZSIsICJwb3B1bGF0ZVNjcmVlbmluZ1RhYiIsICJxIiwgImIiLCAiXyIsICJwb3B1bGF0ZUZpbmFsaXNlVGFiIiwgImxvZyIsICJtIiwgInBvcHVsYXRlRmluYWxpc2VUYWIiLCAiaHRtbCIsICJfcmVuZGVyUmV3cml0ZUF1ZGl0TG9nIiwgIl8iLCAiYXRzU2NvcmUiLCAicG9wdWxhdGVJbnRlcnZpZXdQcmVwVGFiIiwgImxvZyIsICJwb3B1bGF0ZUludGVydmlld1ByZXBUYWIiLCAicG9wdWxhdGVUaGFua1lvdVRhYiIsICJsb2ciLCAicG9wdWxhdGVUaGFua1lvdVRhYiIsICJwb3B1bGF0ZUhhcnZlc3RUYWIiLCAibG9nIiwgImIiLCAiayIsICJ2IiwgInBvcHVsYXRlSGFydmVzdFRhYiIsICJfdXBkYXRlU2Vzc2lvblN3aXRjaGVySGVhZGVyIiwgIm9wZW5TZXNzaW9uc01vZGFsIiwgInNob3dPd25lcnNoaXBDb25mbGljdERpYWxvZyIsICJfIiwgIl9jcmVhdGVkSXNvRnJvbVNlc3Npb25QYXRoIiwgImIiLCAidiIsICJldmVudCIsICJmbXREYXRlIiwgImh0bWwiLCAiaW5pdEtleWJvYXJkU2hvcnRjdXRzIiwgInJlc2V0Q2FyZEZvY3VzIiwgInNldHVwRXZlbnRMaXN0ZW5lcnMiLCAidGV4dCJdCn0K +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbm9kZV9tb2R1bGVzL2xvZ2xldmVsL2xpYi9sb2dsZXZlbC5qcyIsICJsb2dnZXIuanMiLCAidXRpbHMuanMiLCAiYXBpLWNsaWVudC5qcyIsICJmZXRjaC11dGlscy5qcyIsICJzdGF0ZS1tYW5hZ2VyLmpzIiwgInByb3ZpZGVyLWluZm8uanMiLCAidWktY29yZS5qcyIsICJ3b3JrZmxvdy1zdGVwcy5qcyIsICJsYXlvdXQtaW5zdHJ1Y3Rpb24uanMiLCAiYXRzLXJlZmluZW1lbnQuanMiLCAibWVzc2FnZS1xdWV1ZS5qcyIsICJyZXZpZXctdGFibGUtYmFzZS5qcyIsICJwcmV2aWV3LXJlbmRlci5qcyIsICJ2YWxpZGF0b3JzLmpzIiwgInJlY29tbWVuZGF0aW9uLWhlbHBlcnMuanMiLCAidWktaGVscGVycy5qcyIsICJwcm9wb3NhbC1yZXZpZXcuanMiLCAibGxtLWxvZy5qcyIsICJhdXRoLXByb3ZpZGVyLmpzIiwgImF0cy1tb2RhbHMuanMiLCAic2Vzc2lvbi1hY3Rpb25zLmpzIiwgImpvYi1hbmFseXNpcy5qcyIsICJnb2Fscy5qcyIsICJzZXNzaW9uLW1hbmFnZXIuanMiLCAiam9iLWlucHV0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tYXJrZWQvc3JjL2RlZmF1bHRzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9tYXJrZWQvc3JjL3J1bGVzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9tYXJrZWQvc3JjL2hlbHBlcnMudHMiLCAiLi4vbm9kZV9tb2R1bGVzL21hcmtlZC9zcmMvVG9rZW5pemVyLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9tYXJrZWQvc3JjL0xleGVyLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9tYXJrZWQvc3JjL1JlbmRlcmVyLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9tYXJrZWQvc3JjL1RleHRSZW5kZXJlci50cyIsICIuLi9ub2RlX21vZHVsZXMvbWFya2VkL3NyYy9QYXJzZXIudHMiLCAiLi4vbm9kZV9tb2R1bGVzL21hcmtlZC9zcmMvSG9va3MudHMiLCAiLi4vbm9kZV9tb2R1bGVzL21hcmtlZC9zcmMvSW5zdGFuY2UudHMiLCAiLi4vbm9kZV9tb2R1bGVzL21hcmtlZC9zcmMvbWFya2VkLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9kb21wdXJpZnkvc3JjL3V0aWxzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9kb21wdXJpZnkvc3JjL3RhZ3MudHMiLCAiLi4vbm9kZV9tb2R1bGVzL2RvbXB1cmlmeS9zcmMvYXR0cnMudHMiLCAiLi4vbm9kZV9tb2R1bGVzL2RvbXB1cmlmeS9zcmMvcmVnZXhwLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9kb21wdXJpZnkvc3JjL3B1cmlmeS50cyIsICJtZXNzYWdlLWRpc3BhdGNoLmpzIiwgInF1ZXN0aW9ucy1wYW5lbC5qcyIsICJyZXZpZXctaWNvbnMuanMiLCAiZXhwZXJpZW5jZS1yZXZpZXcuanMiLCAic2tpbGxzLXJldmlldy5qcyIsICJhY2hpZXZlbWVudHMtcmV2aWV3LmpzIiwgInRhZ2xpbmUtcmV2aWV3LmpzIiwgInN1bW1hcnktcmV2aWV3LmpzIiwgInB1YmxpY2F0aW9ucy1yZXZpZXcuanMiLCAicmV3cml0ZS1yZXZpZXcuanMiLCAic3BlbGwtY2hlY2suanMiLCAiZG93bmxvYWQtdGFiLmpzIiwgImZpbmFsLWdlbmVyYXRlLmpzIiwgIm1hc3Rlci1kYXRhLWFpLXVwZGF0ZS5qcyIsICJtYXN0ZXItY3YuanMiLCAiY292ZXItbGV0dGVyLmpzIiwgInNjcmVlbmluZy1xdWVzdGlvbnMuanMiLCAiZmluYWxpc2UuanMiLCAiaW50ZXJ2aWV3LXByZXAuanMiLCAidGhhbmsteW91LmpzIiwgImhhcnZlc3QuanMiLCAiZWFybHktcHJldmlldy1wYW5lbC5qcyIsICJzZXNzaW9uLXN3aXRjaGVyLXVpLmpzIiwgImtleWJvYXJkLXNob3J0Y3V0cy5qcyIsICJhcHAuanMiLCAic3JjL21haW4uanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qXG4qIGxvZ2xldmVsIC0gaHR0cHM6Ly9naXRodWIuY29tL3BpbXRlcnJ5L2xvZ2xldmVsXG4qXG4qIENvcHlyaWdodCAoYykgMjAxMyBUaW0gUGVycnlcbiogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuKi9cbihmdW5jdGlvbiAocm9vdCwgZGVmaW5pdGlvbikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcbiAgICAgICAgZGVmaW5lKGRlZmluaXRpb24pO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBkZWZpbml0aW9uKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcm9vdC5sb2cgPSBkZWZpbml0aW9uKCk7XG4gICAgfVxufSh0aGlzLCBmdW5jdGlvbiAoKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAvLyBTbGlnaHRseSBkdWJpb3VzIHRyaWNrcyB0byBjdXQgZG93biBtaW5pbWl6ZWQgZmlsZSBzaXplXG4gICAgdmFyIG5vb3AgPSBmdW5jdGlvbigpIHt9O1xuICAgIHZhciB1bmRlZmluZWRUeXBlID0gXCJ1bmRlZmluZWRcIjtcbiAgICB2YXIgaXNJRSA9ICh0eXBlb2Ygd2luZG93ICE9PSB1bmRlZmluZWRUeXBlKSAmJiAodHlwZW9mIHdpbmRvdy5uYXZpZ2F0b3IgIT09IHVuZGVmaW5lZFR5cGUpICYmIChcbiAgICAgICAgL1RyaWRlbnRcXC98TVNJRSAvLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpXG4gICAgKTtcblxuICAgIHZhciBsb2dNZXRob2RzID0gW1xuICAgICAgICBcInRyYWNlXCIsXG4gICAgICAgIFwiZGVidWdcIixcbiAgICAgICAgXCJpbmZvXCIsXG4gICAgICAgIFwid2FyblwiLFxuICAgICAgICBcImVycm9yXCJcbiAgICBdO1xuXG4gICAgdmFyIF9sb2dnZXJzQnlOYW1lID0ge307XG4gICAgdmFyIGRlZmF1bHRMb2dnZXIgPSBudWxsO1xuXG4gICAgLy8gQ3Jvc3MtYnJvd3NlciBiaW5kIGVxdWl2YWxlbnQgdGhhdCB3b3JrcyBhdCBsZWFzdCBiYWNrIHRvIElFNlxuICAgIGZ1bmN0aW9uIGJpbmRNZXRob2Qob2JqLCBtZXRob2ROYW1lKSB7XG4gICAgICAgIHZhciBtZXRob2QgPSBvYmpbbWV0aG9kTmFtZV07XG4gICAgICAgIGlmICh0eXBlb2YgbWV0aG9kLmJpbmQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBtZXRob2QuYmluZChvYmopO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQuY2FsbChtZXRob2QsIG9iaik7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgLy8gTWlzc2luZyBiaW5kIHNoaW0gb3IgSUU4ICsgTW9kZXJuaXpyLCBmYWxsYmFjayB0byB3cmFwcGluZ1xuICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5hcHBseShtZXRob2QsIFtvYmosIGFyZ3VtZW50c10pO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUcmFjZSgpIGRvZXNuJ3QgcHJpbnQgdGhlIG1lc3NhZ2UgaW4gSUUsIHNvIGZvciB0aGF0IGNhc2Ugd2UgbmVlZCB0byB3cmFwIGl0XG4gICAgZnVuY3Rpb24gdHJhY2VGb3JJRSgpIHtcbiAgICAgICAgaWYgKGNvbnNvbGUubG9nKSB7XG4gICAgICAgICAgICBpZiAoY29uc29sZS5sb2cuYXBwbHkpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZy5hcHBseShjb25zb2xlLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBJbiBvbGQgSUUsIG5hdGl2ZSBjb25zb2xlIG1ldGhvZHMgdGhlbXNlbHZlcyBkb24ndCBoYXZlIGFwcGx5KCkuXG4gICAgICAgICAgICAgICAgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmFwcGx5KGNvbnNvbGUubG9nLCBbY29uc29sZSwgYXJndW1lbnRzXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnNvbGUudHJhY2UpIGNvbnNvbGUudHJhY2UoKTtcbiAgICB9XG5cbiAgICAvLyBCdWlsZCB0aGUgYmVzdCBsb2dnaW5nIG1ldGhvZCBwb3NzaWJsZSBmb3IgdGhpcyBlbnZcbiAgICAvLyBXaGVyZXZlciBwb3NzaWJsZSB3ZSB3YW50IHRvIGJpbmQsIG5vdCB3cmFwLCB0byBwcmVzZXJ2ZSBzdGFjayB0cmFjZXNcbiAgICBmdW5jdGlvbiByZWFsTWV0aG9kKG1ldGhvZE5hbWUpIHtcbiAgICAgICAgaWYgKG1ldGhvZE5hbWUgPT09ICdkZWJ1ZycpIHtcbiAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAnbG9nJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgY29uc29sZSA9PT0gdW5kZWZpbmVkVHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBObyBtZXRob2QgcG9zc2libGUsIGZvciBub3cgLSBmaXhlZCBsYXRlciBieSBlbmFibGVMb2dnaW5nV2hlbkNvbnNvbGVBcnJpdmVzXG4gICAgICAgIH0gZWxzZSBpZiAobWV0aG9kTmFtZSA9PT0gJ3RyYWNlJyAmJiBpc0lFKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJhY2VGb3JJRTtcbiAgICAgICAgfSBlbHNlIGlmIChjb25zb2xlW21ldGhvZE5hbWVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBiaW5kTWV0aG9kKGNvbnNvbGUsIG1ldGhvZE5hbWUpO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnNvbGUubG9nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBiaW5kTWV0aG9kKGNvbnNvbGUsICdsb2cnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBub29wO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhlc2UgcHJpdmF0ZSBmdW5jdGlvbnMgYWx3YXlzIG5lZWQgYHRoaXNgIHRvIGJlIHNldCBwcm9wZXJseVxuXG4gICAgZnVuY3Rpb24gcmVwbGFjZUxvZ2dpbmdNZXRob2RzKCkge1xuICAgICAgICAvKmpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqL1xuICAgICAgICB2YXIgbGV2ZWwgPSB0aGlzLmdldExldmVsKCk7XG5cbiAgICAgICAgLy8gUmVwbGFjZSB0aGUgYWN0dWFsIG1ldGhvZHMuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbG9nTWV0aG9kcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIG1ldGhvZE5hbWUgPSBsb2dNZXRob2RzW2ldO1xuICAgICAgICAgICAgdGhpc1ttZXRob2ROYW1lXSA9IChpIDwgbGV2ZWwpID9cbiAgICAgICAgICAgICAgICBub29wIDpcbiAgICAgICAgICAgICAgICB0aGlzLm1ldGhvZEZhY3RvcnkobWV0aG9kTmFtZSwgbGV2ZWwsIHRoaXMubmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWZpbmUgbG9nLmxvZyBhcyBhbiBhbGlhcyBmb3IgbG9nLmRlYnVnXG4gICAgICAgIHRoaXMubG9nID0gdGhpcy5kZWJ1ZztcblxuICAgICAgICAvLyBSZXR1cm4gYW55IGltcG9ydGFudCB3YXJuaW5ncy5cbiAgICAgICAgaWYgKHR5cGVvZiBjb25zb2xlID09PSB1bmRlZmluZWRUeXBlICYmIGxldmVsIDwgdGhpcy5sZXZlbHMuU0lMRU5UKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJObyBjb25zb2xlIGF2YWlsYWJsZSBmb3IgbG9nZ2luZ1wiO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gSW4gb2xkIElFIHZlcnNpb25zLCB0aGUgY29uc29sZSBpc24ndCBwcmVzZW50IHVudGlsIHlvdSBmaXJzdCBvcGVuIGl0LlxuICAgIC8vIFdlIGJ1aWxkIHJlYWxNZXRob2QoKSByZXBsYWNlbWVudHMgaGVyZSB0aGF0IHJlZ2VuZXJhdGUgbG9nZ2luZyBtZXRob2RzXG4gICAgZnVuY3Rpb24gZW5hYmxlTG9nZ2luZ1doZW5Db25zb2xlQXJyaXZlcyhtZXRob2ROYW1lKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09IHVuZGVmaW5lZFR5cGUpIHtcbiAgICAgICAgICAgICAgICByZXBsYWNlTG9nZ2luZ01ldGhvZHMuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgICAgICB0aGlzW21ldGhvZE5hbWVdLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQnkgZGVmYXVsdCwgd2UgdXNlIGNsb3NlbHkgYm91bmQgcmVhbCBtZXRob2RzIHdoZXJldmVyIHBvc3NpYmxlLCBhbmRcbiAgICAvLyBvdGhlcndpc2Ugd2Ugd2FpdCBmb3IgYSBjb25zb2xlIHRvIGFwcGVhciwgYW5kIHRoZW4gdHJ5IGFnYWluLlxuICAgIGZ1bmN0aW9uIGRlZmF1bHRNZXRob2RGYWN0b3J5KG1ldGhvZE5hbWUsIF9sZXZlbCwgX2xvZ2dlck5hbWUpIHtcbiAgICAgICAgLypqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi9cbiAgICAgICAgcmV0dXJuIHJlYWxNZXRob2QobWV0aG9kTmFtZSkgfHxcbiAgICAgICAgICAgICAgIGVuYWJsZUxvZ2dpbmdXaGVuQ29uc29sZUFycml2ZXMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBMb2dnZXIobmFtZSwgZmFjdG9yeSkge1xuICAgICAgLy8gUHJpdmF0ZSBpbnN0YW5jZSB2YXJpYWJsZXMuXG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAvKipcbiAgICAgICAqIFRoZSBsZXZlbCBpbmhlcml0ZWQgZnJvbSBhIHBhcmVudCBsb2dnZXIgKG9yIGEgZ2xvYmFsIGRlZmF1bHQpLiBXZVxuICAgICAgICogY2FjaGUgdGhpcyBoZXJlIHJhdGhlciB0aGFuIGRlbGVnYXRpbmcgdG8gdGhlIHBhcmVudCBzbyB0aGF0IGl0IHN0YXlzXG4gICAgICAgKiBpbiBzeW5jIHdpdGggdGhlIGFjdHVhbCBsb2dnaW5nIG1ldGhvZHMgdGhhdCB3ZSBoYXZlIGluc3RhbGxlZCAodGhlXG4gICAgICAgKiBwYXJlbnQgY291bGQgY2hhbmdlIGxldmVscyBidXQgd2UgbWlnaHQgbm90IGhhdmUgcmVidWlsdCB0aGUgbG9nZ2Vyc1xuICAgICAgICogaW4gdGhpcyBjaGlsZCB5ZXQpLlxuICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAqL1xuICAgICAgdmFyIGluaGVyaXRlZExldmVsO1xuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBsZXZlbCBmb3IgdGhpcyBsb2dnZXIsIGlmIGFueS4gSWYgc2V0LCB0aGlzIG92ZXJyaWRlc1xuICAgICAgICogYGluaGVyaXRlZExldmVsYC5cbiAgICAgICAqIEB0eXBlIHtudW1iZXJ8bnVsbH1cbiAgICAgICAqL1xuICAgICAgdmFyIGRlZmF1bHRMZXZlbDtcbiAgICAgIC8qKlxuICAgICAgICogQSB1c2VyLXNwZWNpZmljIGxldmVsIGZvciB0aGlzIGxvZ2dlci4gSWYgc2V0LCB0aGlzIG92ZXJyaWRlc1xuICAgICAgICogYGRlZmF1bHRMZXZlbGAuXG4gICAgICAgKiBAdHlwZSB7bnVtYmVyfG51bGx9XG4gICAgICAgKi9cbiAgICAgIHZhciB1c2VyTGV2ZWw7XG5cbiAgICAgIHZhciBzdG9yYWdlS2V5ID0gXCJsb2dsZXZlbFwiO1xuICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHN0b3JhZ2VLZXkgKz0gXCI6XCIgKyBuYW1lO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzeW1ib2xcIikge1xuICAgICAgICBzdG9yYWdlS2V5ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBwZXJzaXN0TGV2ZWxJZlBvc3NpYmxlKGxldmVsTnVtKSB7XG4gICAgICAgICAgdmFyIGxldmVsTmFtZSA9IChsb2dNZXRob2RzW2xldmVsTnVtXSB8fCAnc2lsZW50JykudG9VcHBlckNhc2UoKTtcblxuICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSB1bmRlZmluZWRUeXBlIHx8ICFzdG9yYWdlS2V5KSByZXR1cm47XG5cbiAgICAgICAgICAvLyBVc2UgbG9jYWxTdG9yYWdlIGlmIGF2YWlsYWJsZVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Vbc3RvcmFnZUtleV0gPSBsZXZlbE5hbWU7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG5cbiAgICAgICAgICAvLyBVc2Ugc2Vzc2lvbiBjb29raWUgYXMgZmFsbGJhY2tcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuY29va2llID1cbiAgICAgICAgICAgICAgICBlbmNvZGVVUklDb21wb25lbnQoc3RvcmFnZUtleSkgKyBcIj1cIiArIGxldmVsTmFtZSArIFwiO1wiO1xuICAgICAgICAgIH0gY2F0Y2ggKGlnbm9yZSkge31cbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gZ2V0UGVyc2lzdGVkTGV2ZWwoKSB7XG4gICAgICAgICAgdmFyIHN0b3JlZExldmVsO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IHVuZGVmaW5lZFR5cGUgfHwgIXN0b3JhZ2VLZXkpIHJldHVybjtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHN0b3JlZExldmVsID0gd2luZG93LmxvY2FsU3RvcmFnZVtzdG9yYWdlS2V5XTtcbiAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG5cbiAgICAgICAgICAvLyBGYWxsYmFjayB0byBjb29raWVzIGlmIGxvY2FsIHN0b3JhZ2UgZ2l2ZXMgdXMgbm90aGluZ1xuICAgICAgICAgIGlmICh0eXBlb2Ygc3RvcmVkTGV2ZWwgPT09IHVuZGVmaW5lZFR5cGUpIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIHZhciBjb29raWUgPSB3aW5kb3cuZG9jdW1lbnQuY29va2llO1xuICAgICAgICAgICAgICAgICAgdmFyIGNvb2tpZU5hbWUgPSBlbmNvZGVVUklDb21wb25lbnQoc3RvcmFnZUtleSk7XG4gICAgICAgICAgICAgICAgICB2YXIgbG9jYXRpb24gPSBjb29raWUuaW5kZXhPZihjb29raWVOYW1lICsgXCI9XCIpO1xuICAgICAgICAgICAgICAgICAgaWYgKGxvY2F0aW9uICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgIHN0b3JlZExldmVsID0gL14oW147XSspLy5leGVjKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb29raWUuc2xpY2UobG9jYXRpb24gKyBjb29raWVOYW1lLmxlbmd0aCArIDEpXG4gICAgICAgICAgICAgICAgICAgICAgKVsxXTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBjYXRjaCAoaWdub3JlKSB7fVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIElmIHRoZSBzdG9yZWQgbGV2ZWwgaXMgbm90IHZhbGlkLCB0cmVhdCBpdCBhcyBpZiBub3RoaW5nIHdhcyBzdG9yZWQuXG4gICAgICAgICAgaWYgKHNlbGYubGV2ZWxzW3N0b3JlZExldmVsXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHN0b3JlZExldmVsID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBzdG9yZWRMZXZlbDtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gY2xlYXJQZXJzaXN0ZWRMZXZlbCgpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gdW5kZWZpbmVkVHlwZSB8fCAhc3RvcmFnZUtleSkgcmV0dXJuO1xuXG4gICAgICAgICAgLy8gVXNlIGxvY2FsU3RvcmFnZSBpZiBhdmFpbGFibGVcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oc3RvcmFnZUtleSk7XG4gICAgICAgICAgfSBjYXRjaCAoaWdub3JlKSB7fVxuXG4gICAgICAgICAgLy8gVXNlIHNlc3Npb24gY29va2llIGFzIGZhbGxiYWNrXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgd2luZG93LmRvY3VtZW50LmNvb2tpZSA9XG4gICAgICAgICAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KHN0b3JhZ2VLZXkpICsgXCI9OyBleHBpcmVzPVRodSwgMDEgSmFuIDE5NzAgMDA6MDA6MDAgVVRDXCI7XG4gICAgICAgICAgfSBjYXRjaCAoaWdub3JlKSB7fVxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBub3JtYWxpemVMZXZlbChpbnB1dCkge1xuICAgICAgICAgIHZhciBsZXZlbCA9IGlucHV0O1xuICAgICAgICAgIGlmICh0eXBlb2YgbGV2ZWwgPT09IFwic3RyaW5nXCIgJiYgc2VsZi5sZXZlbHNbbGV2ZWwudG9VcHBlckNhc2UoKV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBsZXZlbCA9IHNlbGYubGV2ZWxzW2xldmVsLnRvVXBwZXJDYXNlKCldO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHlwZW9mIGxldmVsID09PSBcIm51bWJlclwiICYmIGxldmVsID49IDAgJiYgbGV2ZWwgPD0gc2VsZi5sZXZlbHMuU0lMRU5UKSB7XG4gICAgICAgICAgICAgIHJldHVybiBsZXZlbDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwibG9nLnNldExldmVsKCkgY2FsbGVkIHdpdGggaW52YWxpZCBsZXZlbDogXCIgKyBpbnB1dCk7XG4gICAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvKlxuICAgICAgICpcbiAgICAgICAqIFB1YmxpYyBsb2dnZXIgQVBJIC0gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9waW10ZXJyeS9sb2dsZXZlbCBmb3IgZGV0YWlsc1xuICAgICAgICpcbiAgICAgICAqL1xuXG4gICAgICBzZWxmLm5hbWUgPSBuYW1lO1xuXG4gICAgICBzZWxmLmxldmVscyA9IHsgXCJUUkFDRVwiOiAwLCBcIkRFQlVHXCI6IDEsIFwiSU5GT1wiOiAyLCBcIldBUk5cIjogMyxcbiAgICAgICAgICBcIkVSUk9SXCI6IDQsIFwiU0lMRU5UXCI6IDV9O1xuXG4gICAgICBzZWxmLm1ldGhvZEZhY3RvcnkgPSBmYWN0b3J5IHx8IGRlZmF1bHRNZXRob2RGYWN0b3J5O1xuXG4gICAgICBzZWxmLmdldExldmVsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICh1c2VyTGV2ZWwgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHVzZXJMZXZlbDtcbiAgICAgICAgICB9IGVsc2UgaWYgKGRlZmF1bHRMZXZlbCAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmYXVsdExldmVsO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gaW5oZXJpdGVkTGV2ZWw7XG4gICAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgc2VsZi5zZXRMZXZlbCA9IGZ1bmN0aW9uIChsZXZlbCwgcGVyc2lzdCkge1xuICAgICAgICAgIHVzZXJMZXZlbCA9IG5vcm1hbGl6ZUxldmVsKGxldmVsKTtcbiAgICAgICAgICBpZiAocGVyc2lzdCAhPT0gZmFsc2UpIHsgIC8vIGRlZmF1bHRzIHRvIHRydWVcbiAgICAgICAgICAgICAgcGVyc2lzdExldmVsSWZQb3NzaWJsZSh1c2VyTGV2ZWwpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIE5PVEU6IGluIHYyLCB0aGlzIHNob3VsZCBjYWxsIHJlYnVpbGQoKSwgd2hpY2ggdXBkYXRlcyBjaGlsZHJlbi5cbiAgICAgICAgICByZXR1cm4gcmVwbGFjZUxvZ2dpbmdNZXRob2RzLmNhbGwoc2VsZik7XG4gICAgICB9O1xuXG4gICAgICBzZWxmLnNldERlZmF1bHRMZXZlbCA9IGZ1bmN0aW9uIChsZXZlbCkge1xuICAgICAgICAgIGRlZmF1bHRMZXZlbCA9IG5vcm1hbGl6ZUxldmVsKGxldmVsKTtcbiAgICAgICAgICBpZiAoIWdldFBlcnNpc3RlZExldmVsKCkpIHtcbiAgICAgICAgICAgICAgc2VsZi5zZXRMZXZlbChsZXZlbCwgZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHNlbGYucmVzZXRMZXZlbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB1c2VyTGV2ZWwgPSBudWxsO1xuICAgICAgICAgIGNsZWFyUGVyc2lzdGVkTGV2ZWwoKTtcbiAgICAgICAgICByZXBsYWNlTG9nZ2luZ01ldGhvZHMuY2FsbChzZWxmKTtcbiAgICAgIH07XG5cbiAgICAgIHNlbGYuZW5hYmxlQWxsID0gZnVuY3Rpb24ocGVyc2lzdCkge1xuICAgICAgICAgIHNlbGYuc2V0TGV2ZWwoc2VsZi5sZXZlbHMuVFJBQ0UsIHBlcnNpc3QpO1xuICAgICAgfTtcblxuICAgICAgc2VsZi5kaXNhYmxlQWxsID0gZnVuY3Rpb24ocGVyc2lzdCkge1xuICAgICAgICAgIHNlbGYuc2V0TGV2ZWwoc2VsZi5sZXZlbHMuU0lMRU5ULCBwZXJzaXN0KTtcbiAgICAgIH07XG5cbiAgICAgIHNlbGYucmVidWlsZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoZGVmYXVsdExvZ2dlciAhPT0gc2VsZikge1xuICAgICAgICAgICAgICBpbmhlcml0ZWRMZXZlbCA9IG5vcm1hbGl6ZUxldmVsKGRlZmF1bHRMb2dnZXIuZ2V0TGV2ZWwoKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlcGxhY2VMb2dnaW5nTWV0aG9kcy5jYWxsKHNlbGYpO1xuXG4gICAgICAgICAgaWYgKGRlZmF1bHRMb2dnZXIgPT09IHNlbGYpIHtcbiAgICAgICAgICAgICAgZm9yICh2YXIgY2hpbGROYW1lIGluIF9sb2dnZXJzQnlOYW1lKSB7XG4gICAgICAgICAgICAgICAgX2xvZ2dlcnNCeU5hbWVbY2hpbGROYW1lXS5yZWJ1aWxkKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICAvLyBJbml0aWFsaXplIGFsbCB0aGUgaW50ZXJuYWwgbGV2ZWxzLlxuICAgICAgaW5oZXJpdGVkTGV2ZWwgPSBub3JtYWxpemVMZXZlbChcbiAgICAgICAgICBkZWZhdWx0TG9nZ2VyID8gZGVmYXVsdExvZ2dlci5nZXRMZXZlbCgpIDogXCJXQVJOXCJcbiAgICAgICk7XG4gICAgICB2YXIgaW5pdGlhbExldmVsID0gZ2V0UGVyc2lzdGVkTGV2ZWwoKTtcbiAgICAgIGlmIChpbml0aWFsTGV2ZWwgIT0gbnVsbCkge1xuICAgICAgICAgIHVzZXJMZXZlbCA9IG5vcm1hbGl6ZUxldmVsKGluaXRpYWxMZXZlbCk7XG4gICAgICB9XG4gICAgICByZXBsYWNlTG9nZ2luZ01ldGhvZHMuY2FsbChzZWxmKTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqXG4gICAgICogVG9wLWxldmVsIEFQSVxuICAgICAqXG4gICAgICovXG5cbiAgICBkZWZhdWx0TG9nZ2VyID0gbmV3IExvZ2dlcigpO1xuXG4gICAgZGVmYXVsdExvZ2dlci5nZXRMb2dnZXIgPSBmdW5jdGlvbiBnZXRMb2dnZXIobmFtZSkge1xuICAgICAgICBpZiAoKHR5cGVvZiBuYW1lICE9PSBcInN5bWJvbFwiICYmIHR5cGVvZiBuYW1lICE9PSBcInN0cmluZ1wiKSB8fCBuYW1lID09PSBcIlwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiWW91IG11c3Qgc3VwcGx5IGEgbmFtZSB3aGVuIGNyZWF0aW5nIGEgbG9nZ2VyLlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBsb2dnZXIgPSBfbG9nZ2Vyc0J5TmFtZVtuYW1lXTtcbiAgICAgICAgaWYgKCFsb2dnZXIpIHtcbiAgICAgICAgICAgIGxvZ2dlciA9IF9sb2dnZXJzQnlOYW1lW25hbWVdID0gbmV3IExvZ2dlcihcbiAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgIGRlZmF1bHRMb2dnZXIubWV0aG9kRmFjdG9yeVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbG9nZ2VyO1xuICAgIH07XG5cbiAgICAvLyBHcmFiIHRoZSBjdXJyZW50IGdsb2JhbCBsb2cgdmFyaWFibGUgaW4gY2FzZSBvZiBvdmVyd3JpdGVcbiAgICB2YXIgX2xvZyA9ICh0eXBlb2Ygd2luZG93ICE9PSB1bmRlZmluZWRUeXBlKSA/IHdpbmRvdy5sb2cgOiB1bmRlZmluZWQ7XG4gICAgZGVmYXVsdExvZ2dlci5ub0NvbmZsaWN0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSB1bmRlZmluZWRUeXBlICYmXG4gICAgICAgICAgICAgICB3aW5kb3cubG9nID09PSBkZWZhdWx0TG9nZ2VyKSB7XG4gICAgICAgICAgICB3aW5kb3cubG9nID0gX2xvZztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkZWZhdWx0TG9nZ2VyO1xuICAgIH07XG5cbiAgICBkZWZhdWx0TG9nZ2VyLmdldExvZ2dlcnMgPSBmdW5jdGlvbiBnZXRMb2dnZXJzKCkge1xuICAgICAgICByZXR1cm4gX2xvZ2dlcnNCeU5hbWU7XG4gICAgfTtcblxuICAgIC8vIEVTNiBkZWZhdWx0IGV4cG9ydCwgZm9yIGNvbXBhdGliaWxpdHlcbiAgICBkZWZhdWx0TG9nZ2VyWydkZWZhdWx0J10gPSBkZWZhdWx0TG9nZ2VyO1xuXG4gICAgcmV0dXJuIGRlZmF1bHRMb2dnZXI7XG59KSk7XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9sb2dnZXIuanNcbiAqIENlbnRyYWxpc2VkIGxvZ2dpbmcgdXNpbmcgdGhlIGxvZ2xldmVsIGxpYnJhcnkuXG4gKlxuICogVXNhZ2UgKHBlci1tb2R1bGUgbmFtZWQgbG9nZ2Vycyk6XG4gKiAgIGltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbiAqICAgY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdhcGktY2xpZW50Jyk7XG4gKiAgIGxvZy5pbmZvKCdyZXF1ZXN0IHN0YXJ0ZWQnLCBlbmRwb2ludCk7XG4gKiAgIGxvZy53YXJuKCdzZXNzaW9uIGNvbmZsaWN0Jyk7XG4gKiAgIGxvZy5lcnJvcignZmF0YWwnLCBlcnJvcik7XG4gKlxuICogUm9vdCBsb2dnZXIgKHVuY2hhbmdlZCBnbG9iYWwgbGV2ZWwpOlxuICogICBpbXBvcnQgbG9nIGZyb20gJy4vbG9nZ2VyLmpzJztcbiAqICAgbG9nLnNldExldmVsKCdkZWJ1ZycpOyAgIC8vIGxvd2VyIHRoZSBnbG9iYWwgbWluaW11bVxuICpcbiAqIFRoZSBkZWZhdWx0IGxldmVsIGlzICd3YXJuJyBpbiBwcm9kdWN0aW9uIGJ1aWxkcyAoTk9ERV9FTlY9cHJvZHVjdGlvbikgYW5kXG4gKiAnZGVidWcnIGluIGRldmVsb3BtZW50LiAgSW5kaXZpZHVhbCBtb2R1bGUgbGV2ZWxzIGNhbiBiZSBvdmVycmlkZGVuIGF0XG4gKiBydW50aW1lIHZpYSB0aGUgYnJvd3NlciBjb25zb2xlOlxuICogICBsb2dsZXZlbC5nZXRMb2dnZXIoJ2FwaS1jbGllbnQnKS5zZXRMZXZlbCgndHJhY2UnKTtcbiAqXG4gKiBERVBFTkRFTkNJRVM6IGxvZ2xldmVsIChucG0pXG4gKi9cblxuaW1wb3J0IGxvZ2xldmVsIGZyb20gJ2xvZ2xldmVsJztcblxuLy8gRGVmYXVsdCBsZXZlbDogZGVidWcgaW4gZGV2LCB3YXJuIGluIHByb2QuXG5jb25zdCBERUZBVUxUX0xFVkVMID0gKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLmVudiAmJiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKVxuICA/ICd3YXJuJ1xuICA6ICdkZWJ1Zyc7XG5cbmxvZ2xldmVsLnNldERlZmF1bHRMZXZlbChERUZBVUxUX0xFVkVMKTtcblxuLyoqXG4gKiBHZXQgKG9yIGNyZWF0ZSkgYSBuYW1lZCBjaGlsZCBsb2dnZXIuXG4gKiBOYW1lZCBsb2dnZXJzIGluaGVyaXQgdGhlIHJvb3QgZGVmYXVsdCBsZXZlbCBidXQgY2FuIGJlIHR1bmVkIGluZGVwZW5kZW50bHkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBNb2R1bGUgbmFtZSwgZS5nLiAnYXBpLWNsaWVudCdcbiAqIEByZXR1cm5zIHtpbXBvcnQoJ2xvZ2xldmVsJykuTG9nZ2VyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TG9nZ2VyKG5hbWUpIHtcbiAgcmV0dXJuIGxvZ2xldmVsLmdldExvZ2dlcihuYW1lKTtcbn1cblxuLy8gRXhwb3NlIHJvb3QgbG9nbGV2ZWwgaW5zdGFuY2Ugb24gZ2xvYmFsVGhpcyBzbyB0aGUgYnJvd3NlciBjb25zb2xlIGNhblxuLy8gYWRqdXN0IGxldmVscyBhdCBydW50aW1lIHdpdGhvdXQgYSBidWlsZCBzdGVwOlxuLy8gICBsb2dsZXZlbC5zZXRMZXZlbCgnZGVidWcnKTtcbi8vICAgbG9nbGV2ZWwuZ2V0TG9nZ2VyKCdhcGktY2xpZW50Jykuc2V0TGV2ZWwoJ3RyYWNlJyk7XG5pZiAodHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnKSB7XG4gIGdsb2JhbFRoaXMubG9nbGV2ZWwgPSBsb2dsZXZlbDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgbG9nbGV2ZWw7XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHV0aWxzLmpzXG4gKiBVdGlsaXR5IGZ1bmN0aW9ucyBmb3IgdGV4dCBwcm9jZXNzaW5nLCBmb3JtYXR0aW5nLCBhbmQgZGF0YSBtYW5pcHVsYXRpb24uXG4gKiBObyBkZXBlbmRlbmNpZXMgb24gRE9NIG9yIGNvbXBsZXggc3RhdGUuIFB1cmUgZnVuY3Rpb25zLlxuICovXG5cbi8qKlxuICogTm9ybWFsaXplIHdoaXRlc3BhY2UgaW4gdGV4dDpcbiAqIC0gUmVtb3ZlIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZVxuICogLSBDb2xsYXBzZSBpbnRlcm5hbCB3aGl0ZXNwYWNlIHRvIHNpbmdsZSBzcGFjZXNcbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplVGV4dCh0ZXh0KSB7XG4gIHJldHVybiB0ZXh0XG4gICAgLnRyaW0oKSAgLy8gUmVtb3ZlIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZVxuICAgIC5yZXBsYWNlKC9cXHMrL2csICcgJykgIC8vIENvbGxhcHNlIGludGVybmFsIHdoaXRlc3BhY2VcbiAgICAudHJpbSgpO1xufVxuXG4vKipcbiAqIEZvcm1hdCBhIFVuaXggdGltZXN0YW1wIGFzIGh1bWFuLXJlYWRhYmxlIGRhdGUgc3RyaW5nLlxuICogRXhhbXBsZTogMTcwOTIzNjgwMCBcdTIxOTIgXCJNYXIgMSwgMjAyNFwiXG4gKi9cbmZ1bmN0aW9uIGZtdERhdGUodHMpIHtcbiAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHRzICogMTAwMCk7XG4gIHJldHVybiBkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZygnZW4tVVMnLCB7IG1vbnRoOiAnc2hvcnQnLCBkYXk6ICdudW1lcmljJywgeWVhcjogJ251bWVyaWMnIH0pO1xufVxuXG4vKipcbiAqIENsZWFuIEpTT04gcmVzcG9uc2UgYnkgcmVtb3ZpbmcgbWFya2Rvd24gY29kZSBibG9ja3MuXG4gKiBIYW5kbGVzIGNvbW1vbiBwYXR0ZXJuczpcbiAqIC0gYGBganNvbiAuLi4gYGBgXG4gKiAtIGBgYFxuICogICAuLi5cbiAqIGBgYFxuICovXG5mdW5jdGlvbiBjbGVhbkpzb25SZXNwb25zZSh0ZXh0KSB7XG4gIGlmICh0eXBlb2YgdGV4dCAhPT0gJ3N0cmluZycpIHJldHVybiB0ZXh0O1xuICBsZXQgY2xlYW5lZCA9IHRleHQ7XG4gIC8vIFJlbW92ZSBgYGBqc29uIHdyYXBwZXJcbiAgY2xlYW5lZCA9IGNsZWFuZWQucmVwbGFjZSgvXmBgYGpzb25cXHMqL2ksICcnKS5yZXBsYWNlKC9gYGBcXHMqJC9pLCAnJyk7XG4gIC8vIFJlbW92ZSBgYGAgd3JhcHBlclxuICBjbGVhbmVkID0gY2xlYW5lZC5yZXBsYWNlKC9eYGBgXFxzKi9pLCAnJykucmVwbGFjZSgvYGBgXFxzKiQvaSwgJycpO1xuICByZXR1cm4gY2xlYW5lZC50cmltKCk7XG59XG5cbi8qKlxuICogRXh0cmFjdCBhbmQgcGFyc2UgdGhlIGZpcnN0IHZhbGlkIEpTT04gb2JqZWN0IGVtYmVkZGVkIGluIGZyZWUtZm9ybSB0ZXh0LlxuICogUmV0dXJucyBudWxsIHdoZW4gbm8gY29tcGxldGUgcGFyc2VhYmxlIG9iamVjdCBpcyBmb3VuZC5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdEZpcnN0SnNvbk9iamVjdCh0ZXh0KSB7XG4gIGlmICh0ZXh0ID09IG51bGwgfHwgdHlwZW9mIHRleHQgIT09ICdzdHJpbmcnKSByZXR1cm4gbnVsbDtcblxuICBjb25zdCBjbGVhbmVkID0gY2xlYW5Kc29uUmVzcG9uc2UodGV4dCk7XG5cbiAgZm9yIChsZXQgc3RhcnQgPSAwOyBzdGFydCA8IGNsZWFuZWQubGVuZ3RoOyBzdGFydCArPSAxKSB7XG4gICAgaWYgKGNsZWFuZWRbc3RhcnRdICE9PSAneycpIGNvbnRpbnVlO1xuXG4gICAgbGV0IGRlcHRoID0gMDtcbiAgICBsZXQgaW5TdHJpbmcgPSBmYWxzZTtcbiAgICBsZXQgaXNFc2NhcGVkID0gZmFsc2U7XG5cbiAgICBmb3IgKGxldCBpbmRleCA9IHN0YXJ0OyBpbmRleCA8IGNsZWFuZWQubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICBjb25zdCBjaGFyID0gY2xlYW5lZFtpbmRleF07XG5cbiAgICAgIGlmIChpblN0cmluZykge1xuICAgICAgICBpZiAoaXNFc2NhcGVkKSB7XG4gICAgICAgICAgaXNFc2NhcGVkID0gZmFsc2U7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYXIgPT09ICdcXFxcJykge1xuICAgICAgICAgIGlzRXNjYXBlZCA9IHRydWU7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYXIgPT09ICdcIicpIHtcbiAgICAgICAgICBpblN0cmluZyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hhciA9PT0gJ1wiJykge1xuICAgICAgICBpblN0cmluZyA9IHRydWU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hhciA9PT0gJ3snKSB7XG4gICAgICAgIGRlcHRoICs9IDE7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hhciAhPT0gJ30nKSBjb250aW51ZTtcblxuICAgICAgZGVwdGggLT0gMTtcbiAgICAgIGlmIChkZXB0aCAhPT0gMCkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IGNsZWFuZWQuc2xpY2Uoc3RhcnQsIGluZGV4ICsgMSk7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShjYW5kaWRhdGUpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIEVzY2FwZSBIVE1MIHNwZWNpYWwgY2hhcmFjdGVycyB0byBwcmV2ZW50IGluamVjdGlvbi5cbiAqIENvbnZlcnRzOiAmIDwgPiBcIiAnXG4gKi9cbmZ1bmN0aW9uIGVzY2FwZUh0bWwodGV4dCkge1xuICBpZiAodGV4dCA9PSBudWxsKSByZXR1cm4gJyc7XG4gIGlmICh0eXBlb2YgdGV4dCAhPT0gJ3N0cmluZycpIHJldHVybiBlc2NhcGVIdG1sKFN0cmluZyh0ZXh0KSk7XG4gIGNvbnN0IG1hcCA9IHtcbiAgICAnJic6ICcmYW1wOycsXG4gICAgJzwnOiAnJmx0OycsXG4gICAgJz4nOiAnJmd0OycsXG4gICAgJ1wiJzogJyZxdW90OycsXG4gICAgXCInXCI6ICcmIzAzOTsnXG4gIH07XG4gIHJldHVybiB0ZXh0LnJlcGxhY2UoL1smPD5cIiddL2csIG0gPT4gbWFwW21dKTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0IHRpdGxlIGFuZCBjb21wYW55IGZyb20gam9iIGRlc2NyaXB0aW9uIHRleHQuXG4gKiBQYXR0ZXJuczpcbiAqIC0gXCJUaXRsZSB8IENvbXBhbnlcIlxuICogLSBcIlRpdGxlIGF0IENvbXBhbnlcIlxuICogLSBGaXJzdCBsaW5lIGNvbnRhaW5pbmcgXCJ0aXRsZVwiLCBcInBvc2l0aW9uXCIsIFwicm9sZVwiLCBcImFyY2hpdGVjdFwiLCBldGMuXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RUaXRsZUFuZENvbXBhbnlGcm9tSm9iVGV4dChqb2JUZXh0KSB7XG4gIGNvbnN0IGxpbmVzID0gam9iVGV4dC5zcGxpdCgnXFxuJykubWFwKGwgPT4gbC50cmltKCkpLmZpbHRlcihsID0+IGwubGVuZ3RoID4gMCk7XG5cbiAgLy8gTG9vayBmb3IgcGF0dGVybnM6IFwiVGl0bGUgfCBDb21wYW55XCIgb3IgXCJUaXRsZSBhdCBDb21wYW55XCJcbiAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgaWYgKGxpbmUuaW5jbHVkZXMoJ3wnKSkge1xuICAgICAgY29uc3QgW3RpdGxlLCBjb21wYW55XSA9IGxpbmUuc3BsaXQoJ3wnKS5tYXAocyA9PiBzLnRyaW0oKSk7XG4gICAgICBpZiAodGl0bGUgJiYgY29tcGFueSkge1xuICAgICAgICByZXR1cm4geyB0aXRsZSwgY29tcGFueSB9O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobGluZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCcgYXQgJykpIHtcbiAgICAgIGNvbnN0IFt0aXRsZSwgY29tcGFueV0gPSBsaW5lLnNwbGl0KC9cXHMrYXRcXHMrL2kpLm1hcChzID0+IHMudHJpbSgpKTtcbiAgICAgIGlmICh0aXRsZSAmJiBjb21wYW55KSB7XG4gICAgICAgIHJldHVybiB7IHRpdGxlLCBjb21wYW55IH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gRmFsbGJhY2s6IHVzZSBmaXJzdCBub24tZW1wdHkgbGluZSBhcyB0aXRsZVxuICBjb25zdCB0aXRsZUxpbmUgPSBsaW5lc1swXTtcbiAgcmV0dXJuIHtcbiAgICB0aXRsZTogdGl0bGVMaW5lIHx8ICdVbnRpdGxlZCBQb3NpdGlvbicsXG4gICAgY29tcGFueTogbGluZXMuZmluZChsID0+IGwudG9Mb3dlckNhc2UoKSAhPT0gdGl0bGVMaW5lLnRvTG93ZXJDYXNlKCkpIHx8ICdVbmtub3duIENvbXBhbnknXG4gIH07XG59XG5cbi8qKlxuICogTm9ybWFsaXplIHBvc2l0aW9uIGxhYmVsOlxuICogLSBDYXBpdGFsaXplIGVhY2ggd29yZFxuICogLSBSZW1vdmUgdHJhaWxpbmcgXCJyb2xlXCIsIFwicG9zaXRpb25cIiwgXCJ0aXRsZVwiLCBcImpvYlwiXG4gKiBFeGFtcGxlczpcbiAqIC0gXCJzZW5pb3IgZGF0YSBzY2llbnRpc3RcIiBcdTIxOTIgXCJTZW5pb3IgRGF0YSBTY2llbnRpc3RcIlxuICogLSBcImRpcmVjdG9yIG9mIGVuZ2luZWVyaW5nXCIgXHUyMTkyIFwiRGlyZWN0b3Igb2YgRW5naW5lZXJpbmdcIlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVQb3NpdGlvbkxhYmVsKHRpdGxlLCBjb21wYW55KSB7XG4gIGxldCBub3JtYWxpemVkID0gdGl0bGVcbiAgICAuc3BsaXQoJyAnKVxuICAgIC5tYXAod29yZCA9PiB3b3JkLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgd29yZC5zbGljZSgxKS50b0xvd2VyQ2FzZSgpKVxuICAgIC5qb2luKCcgJyk7XG5cbiAgLy8gUmVtb3ZlIGNvbW1vbiBzdWZmaXhlc1xuICBub3JtYWxpemVkID0gbm9ybWFsaXplZFxuICAgIC5yZXBsYWNlKC9cXHMrKHJvbGV8cG9zaXRpb258dGl0bGV8am9iKVxccyokL2ksICcnKVxuICAgIC50cmltKCk7XG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWQgfHwgJ1Byb2Zlc3Npb25hbCBSb2xlJztcbn1cblxuLyoqXG4gKiBTdHJpcCBIVE1MIHRhZ3MgZnJvbSBzdHJpbmcuXG4gKiBVc2VzIGFuIGluZXJ0IHRlbXBsYXRlIGVsZW1lbnQsIHRoZW4gcmVtb3ZlcyBleGVjdXRhYmxlL25vbi12aXNpYmxlIG5vZGVzLlxuICovXG5mdW5jdGlvbiBzdHJpcEh0bWwoaHRtbCkge1xuICBjb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7XG4gIHRlbXBsYXRlLmlubmVySFRNTCA9IFN0cmluZyhodG1sID8/ICcnKTtcbiAgdGVtcGxhdGUuY29udGVudC5xdWVyeVNlbGVjdG9yQWxsKCdzY3JpcHQsIHN0eWxlLCBub3NjcmlwdCwgdGVtcGxhdGUnKS5mb3JFYWNoKG5vZGUgPT4gbm9kZS5yZW1vdmUoKSk7XG4gIHJldHVybiB0ZW1wbGF0ZS5jb250ZW50LnRleHRDb250ZW50IHx8ICcnO1xufVxuXG4vKipcbiAqIFRydW5jYXRlIHRleHQgdG8gbWF4IGxlbmd0aCB3aXRoIGVsbGlwc2lzLlxuICogUHJlc2VydmVzIHdvcmQgYm91bmRhcmllcyB3aGVuIHBvc3NpYmxlLlxuICovXG5mdW5jdGlvbiB0cnVuY2F0ZVRleHQodGV4dCwgbWF4TGVuZ3RoID0gMTAwKSB7XG4gIGlmICh0ZXh0Lmxlbmd0aCA8PSBtYXhMZW5ndGgpIHJldHVybiB0ZXh0O1xuXG4gIC8vIFRydW5jYXRlIGF0IG1heCBsZW5ndGhcbiAgbGV0IHRydW5jYXRlZCA9IHRleHQuc3Vic3RyaW5nKDAsIG1heExlbmd0aCk7XG5cbiAgLy8gVHJ5IHRvIGZpbmQgdGhlIGxhc3Qgc3BhY2UgdG8gYXZvaWQgY3V0dGluZyB3b3Jkc1xuICBjb25zdCBsYXN0U3BhY2UgPSB0cnVuY2F0ZWQubGFzdEluZGV4T2YoJyAnKTtcbiAgaWYgKGxhc3RTcGFjZSA+IE1hdGguZmxvb3IobWF4TGVuZ3RoICogMC43NSkpIHtcbiAgICB0cnVuY2F0ZWQgPSB0cnVuY2F0ZWQuc3Vic3RyaW5nKDAsIGxhc3RTcGFjZSk7XG4gIH1cblxuICByZXR1cm4gdHJ1bmNhdGVkICsgJ1x1MjAyNic7XG59XG5cbi8qKlxuICogQ2FwaXRhbGl6ZSBmaXJzdCBsZXR0ZXIgb2YgZWFjaCB3b3JkLlxuICovXG5mdW5jdGlvbiBjYXBpdGFsaXplV29yZHModGV4dCkge1xuICByZXR1cm4gdGV4dFxuICAgIC5zcGxpdCgnICcpXG4gICAgLm1hcCh3b3JkID0+IHdvcmQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB3b3JkLnNsaWNlKDEpLnRvTG93ZXJDYXNlKCkpXG4gICAgLmpvaW4oJyAnKTtcbn1cblxuLyoqXG4gKiBDb25kaXRpb25hbCBwbHVyYWxpemF0aW9uIGhlbHBlci5cbiAqIEV4YW1wbGU6IHBsdXJhbGl6ZSgxLCAnaXRlbScsICdpdGVtcycpIFx1MjE5MiAnaXRlbSdcbiAqICAgICAgICAgIHBsdXJhbGl6ZSgzLCAnaXRlbScsICdpdGVtcycpIFx1MjE5MiAnaXRlbXMnXG4gKi9cbmZ1bmN0aW9uIHBsdXJhbGl6ZShjb3VudCwgc2luZ3VsYXIsIHBsdXJhbCkge1xuICByZXR1cm4gY291bnQgPT09IDEgPyBzaW5ndWxhciA6IHBsdXJhbDtcbn1cblxuLyoqXG4gKiBIdW1hbi1yZWFkYWJsZSB0aW1lIGR1cmF0aW9uLlxuICogRXhhbXBsZTogNTAwMCBcdTIxOTIgXCI1IHNlY29uZHNcIiwgNjUwMDAgXHUyMTkyIFwiMSBtaW51dGVcIlxuICovXG5mdW5jdGlvbiBmb3JtYXREdXJhdGlvbihtcykge1xuICBjb25zdCBzZWNvbmRzID0gTWF0aC5mbG9vcihtcyAvIDEwMDApO1xuICBjb25zdCBtaW51dGVzID0gTWF0aC5mbG9vcihzZWNvbmRzIC8gNjApO1xuICBjb25zdCBob3VycyA9IE1hdGguZmxvb3IobWludXRlcyAvIDYwKTtcblxuICBpZiAoaG91cnMgPiAwKSByZXR1cm4gYCR7aG91cnN9aCAke21pbnV0ZXMgJSA2MH1tYDtcbiAgaWYgKG1pbnV0ZXMgPiAwKSByZXR1cm4gYCR7bWludXRlc31tICR7c2Vjb25kcyAlIDYwfXNgO1xuICByZXR1cm4gYCR7c2Vjb25kc31zYDtcbn1cblxuLyoqXG4gKiBPcmRpbmFsIG51bWJlciBzdWZmaXguXG4gKiBFeGFtcGxlOiAxIFx1MjE5MiBcIjFzdFwiLCAyIFx1MjE5MiBcIjJuZFwiLCAzIFx1MjE5MiBcIjNyZFwiLCA0IFx1MjE5MiBcIjR0aFwiXG4gKi9cbmZ1bmN0aW9uIG9yZGluYWwobikge1xuICBjb25zdCBzID0gWyd0aCcsICdzdCcsICduZCcsICdyZCddO1xuICBjb25zdCB2ID0gbiAlIDEwMDtcbiAgcmV0dXJuIG4gKyAoc1sodiAtIDIwKSAlIDEwXSB8fCBzW3ZdIHx8IHNbMF0pO1xufVxuXG4vLyBVdGlsaXR5IGZ1bmN0aW9ucyBmb3Igc2Vzc2lvbiBtYW5hZ2VtZW50IGFuZCBmb3JtYXR0aW5nXG5cbi8vIEZ1bGwtbGVuZ3RoIHBoYXNlIGxhYmVscyBcdTIwMTQgdXNlZCBieSB3b3JrZmxvdyBzdGVwIGRpc3BsYXksIHN0YXR1cyB0ZXh0LCBldGMuXG5jb25zdCBTRVNTSU9OX1BIQVNFX0xBQkVMUyA9IHtcbiAgaW5pdDogICAgICAgICAgICAgJ0dldHRpbmcgU3RhcnRlZCcsXG4gIGpvYl9hbmFseXNpczogICAgICdKb2IgQW5hbHlzaXMnLFxuICBjdXN0b21pemF0aW9uOiAgICAnQ3VzdG9taXNhdGlvbicsXG4gIHJld3JpdGVfcmV2aWV3OiAgICdSZXdyaXRlIFJldmlldycsXG4gIHNwZWxsX2NoZWNrOiAgICAgICdTcGVsbCBDaGVjaycsXG4gIGdlbmVyYXRpb246ICAgICAgICdHZW5lcmF0aW9uJyxcbiAgbGF5b3V0X3JldmlldzogICAgJ0xheW91dCBSZXZpZXcnLFxuICByZWZpbmVtZW50OiAgICAgICAnRmluYWxpc2UnLFxuICBmaW5hbF9nZW5lcmF0aW9uOiAnRmluYWwgR2VuZXJhdGlvbicsXG59O1xuXG4vLyBBYmJyZXZpYXRlZCBwaGFzZSBsYWJlbHMgXHUyMDE0IHVzZWQgYnkgdGhlIGNvbXBhY3Qgc2Vzc2lvbi1zd2l0Y2hlciBVSS5cbi8vIEludGVudGlvbmFsbHkgc2VwYXJhdGUgZnJvbSBTRVNTSU9OX1BIQVNFX0xBQkVMUzogdGhlIHR3byBzZXRzIHNlcnZlIGRpZmZlcmVudFxuLy8gVUkgY29udGV4dHMgKHNwYWNlLWNvbnN0cmFpbmVkIGhlYWRlciBjaGlwIHZzLiBmdWxsIHdvcmtmbG93IHN0ZXAgbGFiZWwpLlxuY29uc3QgU0VTU0lPTl9QSEFTRV9MQUJFTFNfU0hPUlQgPSB7XG4gIGluaXQ6ICAgICAgICAgICAgICdTZXR1cCcsXG4gIGpvYl9hbmFseXNpczogICAgICdBbmFseXNpcycsXG4gIGN1c3RvbWl6YXRpb246ICAgICdDdXN0b21pc2luZycsXG4gIHJld3JpdGVfcmV2aWV3OiAgICdSZXdyaXRlcycsXG4gIHNwZWxsX2NoZWNrOiAgICAgICdTcGVsbCBDaGVjaycsXG4gIGdlbmVyYXRpb246ICAgICAgICdHZW5lcmF0ZScsXG4gIGxheW91dF9yZXZpZXc6ICAgICdMYXlvdXQnLFxuICByZWZpbmVtZW50OiAgICAgICAnRmluYWxpc2UnLFxuICBmaW5hbF9nZW5lcmF0aW9uOiAnRmluYWwgR2VuJyxcbn07XG5cbi8qKlxuICogRm9ybWF0IHNlc3Npb24gcGhhc2UgbGFiZWxzIChmdWxsIGZvcm0pLlxuICogQHBhcmFtIHtzdHJpbmd9IHBoYXNlIC0gVGhlIHBoYXNlIHN0cmluZyB0byBmb3JtYXQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSBmb3JtYXR0ZWQgcGhhc2UgbGFiZWwuXG4gKi9cbmZ1bmN0aW9uIGZvcm1hdFNlc3Npb25QaGFzZUxhYmVsKHBoYXNlKSB7XG4gIGlmICghcGhhc2UpIHJldHVybiAnaW5pdCc7XG4gIHJldHVybiBTRVNTSU9OX1BIQVNFX0xBQkVMU1twaGFzZV0gfHwgU3RyaW5nKHBoYXNlKS5yZXBsYWNlKC9fL2csICcgJyk7XG59XG5cbi8qKlxuICogRm9ybWF0IHNlc3Npb24gdGltZXN0YW1wcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0aW1lc3RhbXAgLSBUaGUgdGltZXN0YW1wIHRvIGZvcm1hdC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIC0gRm9ybWF0dGluZyBvcHRpb25zLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5pbmNsdWRlVGltZT10cnVlXSAtIFdoZXRoZXIgdG8gaW5jbHVkZSB0aW1lIGluIHRoZSBvdXRwdXQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICovXG5mdW5jdGlvbiBmb3JtYXRTZXNzaW9uVGltZXN0YW1wKHRpbWVzdGFtcCwgeyBpbmNsdWRlVGltZSA9IHRydWUgfSA9IHt9KSB7XG4gIGlmICghdGltZXN0YW1wKSByZXR1cm4gJ1x1MjAxNCc7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHRpbWVzdGFtcCkudG9Mb2NhbGVTdHJpbmcoJ2VuLVVTJywge1xuICAgICAgbW9udGg6ICdzaG9ydCcsIGRheTogJ251bWVyaWMnLCB5ZWFyOiAnbnVtZXJpYycsXG4gICAgICAuLi4oaW5jbHVkZVRpbWUgPyB7IGhvdXI6ICdudW1lcmljJywgbWludXRlOiAnMi1kaWdpdCcgfSA6IHt9KSxcbiAgICB9KTtcbiAgfSBjYXRjaCAoXykge1xuICAgIHJldHVybiBTdHJpbmcodGltZXN0YW1wKS5yZXBsYWNlKCdUJywgJyAnKS5zbGljZSgwLCBpbmNsdWRlVGltZSA/IDE2IDogMTApO1xuICB9XG59XG5cbi8vIFN0cnVjdHVyZWQgbG9nZ2luZyBoZWxwZXIgKGdsb2JhbCBhbmQgdGVzdC1mcmllbmRseSkuXG5jb25zdCBMT0dfTEVWRUxTID0geyBkZWJ1ZzogMTAsIGluZm86IDIwLCB3YXJuOiAzMCwgZXJyb3I6IDQwIH07XG5jb25zdCBERUZBVUxUX0xPR19MRVZFTCA9ICdpbmZvJztcblxuZnVuY3Rpb24gY3JlYXRlTG9nRW50cnkobGV2ZWwsIG1lc3NhZ2UsIG1ldGFkYXRhID0ge30pIHtcbiAgY29uc3QgZW50cnkgPSB7XG4gICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgbGV2ZWwsXG4gICAgbWVzc2FnZTogU3RyaW5nKG1lc3NhZ2UpLFxuICAgIC4uLm1ldGFkYXRhLFxuICB9O1xuICByZXR1cm4gZW50cnk7XG59XG5cbmNvbnN0IGxvZ2dlciA9IHtcbiAgbGV2ZWw6IERFRkFVTFRfTE9HX0xFVkVMLFxuXG4gIHNldExldmVsKG5ld0xldmVsKSB7XG4gICAgaWYgKExPR19MRVZFTFNbbmV3TGV2ZWxdICE9IG51bGwpIHtcbiAgICAgIHRoaXMubGV2ZWwgPSBuZXdMZXZlbDtcbiAgICB9XG4gIH0sXG5cbiAgc2hvdWxkTG9nKGxldmVsKSB7XG4gICAgaWYgKExPR19MRVZFTFNbbGV2ZWxdID09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gTE9HX0xFVkVMU1tsZXZlbF0gPj0gTE9HX0xFVkVMU1t0aGlzLmxldmVsXTtcbiAgfSxcblxuICBsb2cobGV2ZWwsIG1lc3NhZ2UsIG1ldGFkYXRhID0ge30pIHtcbiAgICBpZiAoIXRoaXMuc2hvdWxkTG9nKGxldmVsKSkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBlbnRyeSA9IGNyZWF0ZUxvZ0VudHJ5KGxldmVsLCBtZXNzYWdlLCBtZXRhZGF0YSk7XG4gICAgY29uc3QgZm9ybWF0dGVkID0gSlNPTi5zdHJpbmdpZnkoZW50cnkpO1xuXG4gICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgaWYgKGxldmVsID09PSAnZXJyb3InKSBjb25zb2xlLmVycm9yKGZvcm1hdHRlZCk7XG4gICAgICBlbHNlIGlmIChsZXZlbCA9PT0gJ3dhcm4nKSBjb25zb2xlLndhcm4oZm9ybWF0dGVkKTtcbiAgICAgIGVsc2UgY29uc29sZS5sb2coZm9ybWF0dGVkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZW50cnk7XG4gIH0sXG5cbiAgZGVidWcobWVzc2FnZSwgbWV0YWRhdGEgPSB7fSkgeyByZXR1cm4gdGhpcy5sb2coJ2RlYnVnJywgbWVzc2FnZSwgbWV0YWRhdGEpOyB9LFxuICBpbmZvKG1lc3NhZ2UsIG1ldGFkYXRhID0ge30pIHsgcmV0dXJuIHRoaXMubG9nKCdpbmZvJywgbWVzc2FnZSwgbWV0YWRhdGEpOyB9LFxuICB3YXJuKG1lc3NhZ2UsIG1ldGFkYXRhID0ge30pIHsgcmV0dXJuIHRoaXMubG9nKCd3YXJuJywgbWVzc2FnZSwgbWV0YWRhdGEpOyB9LFxuICBlcnJvcihtZXNzYWdlLCBtZXRhZGF0YSA9IHt9KSB7IHJldHVybiB0aGlzLmxvZygnZXJyb3InLCBtZXNzYWdlLCBtZXRhZGF0YSk7IH0sXG5cbiAgZXZlbnQoYWN0aW9uLCBtZXRhZGF0YSA9IHt9KSB7XG4gICAgcmV0dXJuIHRoaXMuaW5mbyhgZXZlbnQ6JHthY3Rpb259YCwgeyBhY3Rpb24sIC4uLm1ldGFkYXRhIH0pO1xuICB9LFxufTtcblxuaWYgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJykge1xuICBnbG9iYWxUaGlzLmxvZ2dlciA9IGxvZ2dlcjtcbn1cblxuZXhwb3J0IHtcbiAgbm9ybWFsaXplVGV4dCwgZm10RGF0ZSwgY2xlYW5Kc29uUmVzcG9uc2UsIGV4dHJhY3RGaXJzdEpzb25PYmplY3QsIGVzY2FwZUh0bWwsXG4gIGV4dHJhY3RUaXRsZUFuZENvbXBhbnlGcm9tSm9iVGV4dCwgbm9ybWFsaXplUG9zaXRpb25MYWJlbCxcbiAgc3RyaXBIdG1sLCB0cnVuY2F0ZVRleHQsIGNhcGl0YWxpemVXb3JkcywgcGx1cmFsaXplLFxuICBmb3JtYXREdXJhdGlvbiwgb3JkaW5hbCxcbiAgU0VTU0lPTl9QSEFTRV9MQUJFTFMsIFNFU1NJT05fUEhBU0VfTEFCRUxTX1NIT1JULFxuICBmb3JtYXRTZXNzaW9uUGhhc2VMYWJlbCxcbiAgbG9nZ2VyLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogYXBpLWNsaWVudC5qc1xuICogQ2VudHJhbGl6ZWQgSFRUUCBjb21tdW5pY2F0aW9uIGxheWVyLiBBbGwgQVBJIGNhbGxzIGdvIHRocm91Z2ggYXBpQ2FsbCgpLlxuICogUHJvdmlkZXMgZXJyb3IgaGFuZGxpbmcsIGxvZ2dpbmcsIGFuZCByZXRyeSBsb2dpYy5cbiAqL1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBoYW5kbGU0MDlDb25mbGljdCB9IGZyb20gJy4vZmV0Y2gtdXRpbHMuanMnO1xuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdhcGktY2xpZW50Jyk7XG5cbi8qKlxuICogQ2VudHJhbGl6ZWQgbG9jYWxTdG9yYWdlIGtleSBtYW5hZ2VtZW50IHRvIGF2b2lkIGR1cGxpY2F0aW9uXG4gKi9cbmNvbnN0IFN0b3JhZ2VLZXlzID0ge1xuICBTRVNTSU9OX0lEOiAgICAgICAgICAgICAgJ2N2LWJ1aWxkZXItc2Vzc2lvbi1pZCcsXG4gIFNFU1NJT05fUEFUSDogICAgICAgICAgICAnY3YtYnVpbGRlci1zZXNzaW9uLXBhdGgnLFxuICBUQUJfREFUQTogICAgICAgICAgICAgICAgJ2N2LWJ1aWxkZXItdGFiLWRhdGEnLFxuICBDVVJSRU5UX1RBQjogICAgICAgICAgICAgJ2N2LWJ1aWxkZXItY3VycmVudC10YWInLFxuICBDSEFUX0NPTExBUFNFRDogICAgICAgICAgJ2N2LWJ1aWxkZXItY2hhdC1jb2xsYXBzZWQnLFxuICBMTE1fRElTQ0xPU1VSRV9TSE9XTjogICAgJ2N2LWJ1aWxkZXItbGxtLWRpc2Nsb3N1cmUtc2hvd24nLFxuICBFQVJMWV9QUkVWSUVXX0NPTExBUFNFRDogJ2N2LWJ1aWxkZXItZWFybHktcHJldmlldy1jb2xsYXBzZWQnLFxufTtcblxuY29uc3QgT1dORVJfVE9LRU5fS0VZID0gJ2N2LWJ1aWxkZXItb3duZXItdG9rZW4nO1xuXG5mdW5jdGlvbiBnZXRTZXNzaW9uSWRGcm9tVVJMKCkge1xuICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIXdpbmRvdy5sb2NhdGlvbikgcmV0dXJuIG51bGw7XG4gIHJldHVybiBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpLmdldCgnc2Vzc2lvbicpO1xufVxuXG5mdW5jdGlvbiBnZXRPd25lclRva2VuKCkge1xuICBpZiAodHlwZW9mIHNlc3Npb25TdG9yYWdlID09PSAndW5kZWZpbmVkJykgcmV0dXJuIG51bGw7XG4gIGxldCB0b2tlbiA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oT1dORVJfVE9LRU5fS0VZKTtcbiAgaWYgKCF0b2tlbikge1xuICAgIGlmICh0eXBlb2YgY3J5cHRvICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgY3J5cHRvLnJhbmRvbVVVSUQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRva2VuID0gY3J5cHRvLnJhbmRvbVVVSUQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdG9rZW4gPSBgdGFiLSR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDE2KS5zbGljZSgyLCAxMCl9YDtcbiAgICB9XG4gICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShPV05FUl9UT0tFTl9LRVksIHRva2VuKTtcbiAgfVxuICByZXR1cm4gdG9rZW47XG59XG5cbmZ1bmN0aW9uIGdldFNjb3BlZFRhYkRhdGFTdG9yYWdlS2V5KHNlc3Npb25JZCA9IG51bGwpIHtcbiAgY29uc3Qgc2NvcGVkU2Vzc2lvbklkID0gc2Vzc2lvbklkIHx8IGdldFNlc3Npb25JZEZyb21VUkwoKTtcbiAgcmV0dXJuIHNjb3BlZFNlc3Npb25JZFxuICAgID8gYCR7U3RvcmFnZUtleXMuVEFCX0RBVEF9LSR7c2NvcGVkU2Vzc2lvbklkfWBcbiAgICA6IFN0b3JhZ2VLZXlzLlRBQl9EQVRBO1xufVxuXG5mdW5jdGlvbiBfaXNTZXNzaW9uTWFuYWdlbWVudFBhdGgocGF0aG5hbWUpIHtcbiAgcmV0dXJuIHBhdGhuYW1lID09PSAnL2FwaS9zZXNzaW9ucy9uZXcnXG4gICAgfHwgcGF0aG5hbWUgPT09ICcvYXBpL3Nlc3Npb25zL2NsYWltJ1xuICAgIHx8IHBhdGhuYW1lID09PSAnL2FwaS9zZXNzaW9ucy90YWtlb3Zlcic7XG59XG5cbmZ1bmN0aW9uIF9idWlsZFNlc3Npb25Bd2FyZVJlcXVlc3QoaW5wdXQsIGluaXQgPSB7fSkge1xuICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIXdpbmRvdy5sb2NhdGlvbikge1xuICAgIHJldHVybiBbaW5wdXQsIGluaXRdO1xuICB9XG5cbiAgY29uc3QgdXJsID0gbmV3IFVSTCh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnID8gaW5wdXQgOiBpbnB1dC51cmwsIHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4pO1xuICBpZiAoIXVybC5wYXRobmFtZS5zdGFydHNXaXRoKCcvYXBpLycpKSB7XG4gICAgcmV0dXJuIFtpbnB1dCwgaW5pdF07XG4gIH1cblxuICBjb25zdCBvd25lclRva2VuID0gZ2V0T3duZXJUb2tlbigpO1xuICBpZiAoIXVybC5zZWFyY2hQYXJhbXMuaGFzKCdvd25lcl90b2tlbicpICYmICFfaXNTZXNzaW9uTWFuYWdlbWVudFBhdGgodXJsLnBhdGhuYW1lKSAmJiBvd25lclRva2VuKSB7XG4gICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ293bmVyX3Rva2VuJywgb3duZXJUb2tlbik7XG4gIH1cblxuICBjb25zdCBzZXNzaW9uSWQgPSBnZXRTZXNzaW9uSWRGcm9tVVJMKCk7XG4gIGlmICghc2Vzc2lvbklkKSB7XG4gICAgcmV0dXJuIFt1cmwudG9TdHJpbmcoKSwgaW5pdF07XG4gIH1cblxuICBjb25zdCBtZXRob2QgPSAoaW5pdC5tZXRob2QgfHwgJ0dFVCcpLnRvVXBwZXJDYXNlKCk7XG4gIGNvbnN0IG5leHRJbml0ID0geyAuLi5pbml0IH07XG4gIGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycyhpbml0LmhlYWRlcnMgfHwge30pO1xuXG4gIGlmICghdXJsLnNlYXJjaFBhcmFtcy5oYXMoJ3Nlc3Npb25faWQnKSAmJiAhX2lzU2Vzc2lvbk1hbmFnZW1lbnRQYXRoKHVybC5wYXRobmFtZSkpIHtcbiAgICB1cmwuc2VhcmNoUGFyYW1zLnNldCgnc2Vzc2lvbl9pZCcsIHNlc3Npb25JZCk7XG4gIH1cblxuICBjb25zdCBuZWVkc0JvZHlDb250ZXh0ID0gIVsnR0VUJywgJ0hFQUQnXS5pbmNsdWRlcyhtZXRob2QpO1xuICBjb25zdCBib2R5ID0gbmV4dEluaXQuYm9keTtcbiAgY29uc3QgaXNGb3JtRGF0YSA9IHR5cGVvZiBGb3JtRGF0YSAhPT0gJ3VuZGVmaW5lZCcgJiYgYm9keSBpbnN0YW5jZW9mIEZvcm1EYXRhO1xuICBjb25zdCBpc1VSTFNlYXJjaFBhcmFtcyA9IHR5cGVvZiBVUkxTZWFyY2hQYXJhbXMgIT09ICd1bmRlZmluZWQnICYmIGJvZHkgaW5zdGFuY2VvZiBVUkxTZWFyY2hQYXJhbXM7XG4gIGNvbnN0IGNvbnRlbnRUeXBlID0gaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpIHx8ICcnO1xuXG4gIGlmIChuZWVkc0JvZHlDb250ZXh0ICYmICFpc0Zvcm1EYXRhICYmICFpc1VSTFNlYXJjaFBhcmFtcykge1xuICAgIGxldCBwYXlsb2FkID0ge307XG4gICAgaWYgKHR5cGVvZiBib2R5ID09PSAnc3RyaW5nJyAmJiBib2R5LnRyaW0oKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcGF5bG9hZCA9IEpTT04ucGFyc2UoYm9keSk7XG4gICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgIHJldHVybiBbdXJsLnRvU3RyaW5nKCksIG5leHRJbml0XTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGJvZHkgPT0gbnVsbCkge1xuICAgICAgcGF5bG9hZCA9IHt9O1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGJvZHkgPT09ICdvYmplY3QnKSB7XG4gICAgICBwYXlsb2FkID0geyAuLi5ib2R5IH07XG4gICAgfVxuXG4gICAgaWYgKHBheWxvYWQuc2Vzc2lvbl9pZCA9PSBudWxsICYmICFfaXNTZXNzaW9uTWFuYWdlbWVudFBhdGgodXJsLnBhdGhuYW1lKSkge1xuICAgICAgcGF5bG9hZC5zZXNzaW9uX2lkID0gc2Vzc2lvbklkO1xuICAgIH1cbiAgICBpZiAocGF5bG9hZC5vd25lcl90b2tlbiA9PSBudWxsICYmICFfaXNTZXNzaW9uTWFuYWdlbWVudFBhdGgodXJsLnBhdGhuYW1lKSkge1xuICAgICAgaWYgKG93bmVyVG9rZW4pIHBheWxvYWQub3duZXJfdG9rZW4gPSBvd25lclRva2VuO1xuICAgIH1cblxuICAgIG5leHRJbml0LmJvZHkgPSBKU09OLnN0cmluZ2lmeShwYXlsb2FkKTtcbiAgICBpZiAoIWNvbnRlbnRUeXBlKSB7XG4gICAgICBoZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL2pzb24nKTtcbiAgICB9XG4gIH1cblxuICBuZXh0SW5pdC5oZWFkZXJzID0gaGVhZGVycztcbiAgcmV0dXJuIFt1cmwudG9TdHJpbmcoKSwgbmV4dEluaXRdO1xufVxuXG5jb25zdCBfbmF0aXZlRmV0Y2ggPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93LmZldGNoID09PSAnZnVuY3Rpb24nXG4gID8gd2luZG93LmZldGNoLmJpbmQod2luZG93KVxuICA6ICh0eXBlb2YgZ2xvYmFsVGhpcy5mZXRjaCA9PT0gJ2Z1bmN0aW9uJyA/IGdsb2JhbFRoaXMuZmV0Y2guYmluZChnbG9iYWxUaGlzKSA6IG51bGwpO1xuXG5hc3luYyBmdW5jdGlvbiBzZXNzaW9uQXdhcmVGZXRjaChpbnB1dCwgaW5pdCA9IHt9KSB7XG4gIGlmIChfbmF0aXZlRmV0Y2ggPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignZmV0Y2ggaXMgbm90IGF2YWlsYWJsZScpO1xuICB9XG4gIGNvbnN0IFtuZXh0SW5wdXQsIG5leHRJbml0XSA9IF9idWlsZFNlc3Npb25Bd2FyZVJlcXVlc3QoaW5wdXQsIGluaXQpO1xuICBsZXQgcmVzcCA9IGF3YWl0IF9uYXRpdmVGZXRjaChuZXh0SW5wdXQsIG5leHRJbml0KTtcbiAgaWYgKHJlc3Auc3RhdHVzID09PSA0MDkpIHtcbiAgICBjb25zdCBzaG91bGRSZXRyeSA9IGF3YWl0IGhhbmRsZTQwOUNvbmZsaWN0KG5leHRJbnB1dCwgbmV4dEluaXQsIHJlc3ApO1xuICAgIGlmIChzaG91bGRSZXRyeSkgcmVzcCA9IGF3YWl0IF9uYXRpdmVGZXRjaChuZXh0SW5wdXQsIG5leHRJbml0KTtcbiAgfVxuICByZXR1cm4gcmVzcDtcbn1cblxuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuZmV0Y2ggPT09ICdmdW5jdGlvbicpIHtcbiAgd2luZG93LmZldGNoID0gc2Vzc2lvbkF3YXJlRmV0Y2g7XG59XG5cbi8qKlxuICogQmFzZSBBUEkgY2FsbCBmdW5jdGlvbiB3aXRoIGVycm9yIGhhbmRsaW5nIGFuZCBsb2dnaW5nLlxuICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZCAtIEhUVFAgbWV0aG9kIChHRVQsIFBPU1QsIGV0Yy4pXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5kcG9pbnQgLSBBUEkgZW5kcG9pbnQgKGUuZy4sICcvYXBpL3N0YXR1cycpXG4gKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIFJlcXVlc3QgYm9keSBkYXRhIChmb3IgUE9TVC9QVVQpXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxvYmplY3Q+fSBQYXJzZWQgSlNPTiByZXNwb25zZVxuICovXG5hc3luYyBmdW5jdGlvbiBhcGlDYWxsKG1ldGhvZCwgZW5kcG9pbnQsIGRhdGEgPSBudWxsKSB7XG4gIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgbWV0aG9kLFxuICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9XG4gIH07XG5cbiAgaWYgKGRhdGEgJiYgKG1ldGhvZCA9PT0gJ1BPU1QnIHx8IG1ldGhvZCA9PT0gJ1BVVCcpKSB7XG4gICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2Vzc2lvbkF3YXJlRmV0Y2goZW5kcG9pbnQsIG9wdGlvbnMpO1xuXG4gICAgLy8gSGFuZGxlIDQwOSBDb25mbGljdCAoc2Vzc2lvbiBhbHJlYWR5IGFjdGl2ZSlcbiAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDkpIHtcbiAgICAgIGxvZy53YXJuKGBTZXNzaW9uIGNvbmZsaWN0IG9uICR7ZW5kcG9pbnR9YCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Nlc3Npb24gYWxyZWFkeSBhY3RpdmUgaW4gYW5vdGhlciB0YWInKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICBsb2cuZXJyb3IoYEFQSSBlcnJvciBvbiAke21ldGhvZH0gJHtlbmRwb2ludH06YCwgcmVzcG9uc2Uuc3RhdHVzLCByZXNwb25zZS5zdGF0dXNUZXh0KTtcbiAgICAgIGxldCBlcnJvck1lc3NhZ2UgPSByZXNwb25zZS5zdGF0dXNUZXh0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZXJyb3JKc29uID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICBpZiAoZXJyb3JKc29uICYmIHR5cGVvZiBlcnJvckpzb24gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgZXJyb3JNZXNzYWdlID0gZXJyb3JKc29uLmVycm9yIHx8IGVycm9ySnNvbi5tZXNzYWdlIHx8IGVycm9yTWVzc2FnZTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAvLyBGYWxsIGJhY2sgdG8gc3RhdHVzIHRleHQgd2hlbiByZXNwb25zZSBpcyBub3QgSlNPTi5cbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtyZXNwb25zZS5zdGF0dXN9OiAke2Vycm9yTWVzc2FnZX1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgIHJldHVybiBqc29uO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy5lcnJvcihgQVBJIGNhbGwgZmFpbGVkOiAke21ldGhvZH0gJHtlbmRwb2ludH1gLCBlcnJvcik7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT1cbi8vIFNlc3Npb24gTWFuYWdlbWVudFxuLy8gPT09PT09PT09PT09PT09PT09PT1cblxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlU2Vzc2lvbigpIHtcbiAgcmV0dXJuIGFwaUNhbGwoJ1BPU1QnLCAnL2FwaS9zZXNzaW9ucy9uZXcnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hTdGF0dXMoKSB7XG4gIGNvbnN0IHN0YXR1cyA9IGF3YWl0IGFwaUNhbGwoJ0dFVCcsICcvYXBpL3N0YXR1cycpO1xuXG4gIC8vIEtlZXAgcHJvdmlkZXIvYXV0aCBVSSBpbiBzeW5jIHdoZW5ldmVyIHN0YXR1cyBpcyBmZXRjaGVkLlxuICBjb25zdCBwcm92aWRlciA9IHN0YXR1cz8ubGxtX3Byb3ZpZGVyIHx8IG51bGw7XG4gIGlmIChwcm92aWRlcikge1xuICAgIGdsb2JhbFRoaXMuY3VycmVudFByb3ZpZGVyID0gcHJvdmlkZXI7XG4gIH1cbiAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzLnVwZGF0ZUF1dGhCYWRnZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGdsb2JhbFRoaXMudXBkYXRlQXV0aEJhZGdlKHN0YXR1cz8uY29waWxvdF9hdXRoIHx8IHt9LCBwcm92aWRlcik7XG4gIH1cblxuICAvLyBVcGRhdGUgd29ya2Zsb3cgc3RlcCBiYXIgKGNsaWNrYWJsZS9jb21wbGV0ZWQvYWN0aXZlIHN0YXRlKSBvbiBldmVyeSBzdGF0dXMgZmV0Y2guXG4gIGlmICh0eXBlb2YgZ2xvYmFsVGhpcy51cGRhdGVXb3JrZmxvd1N0ZXBzID09PSAnZnVuY3Rpb24nICYmIHN0YXR1cyAmJiAhc3RhdHVzLl9lcnJvcikge1xuICAgIGdsb2JhbFRoaXMudXBkYXRlV29ya2Zsb3dTdGVwcyhzdGF0dXMpO1xuICB9XG5cbiAgcmV0dXJuIHN0YXR1cztcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT1cbi8vIFNldHRpbmdzXG4vLyA9PT09PT09PT09PT09PT09PT09PVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaFNldHRpbmdzKCkge1xuICByZXR1cm4gYXBpQ2FsbCgnR0VUJywgJy9hcGkvc2V0dGluZ3MnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlU2V0dGluZ3Moc2V0dGluZ3MpIHtcbiAgcmV0dXJuIGFwaUNhbGwoJ1BVVCcsICcvYXBpL3NldHRpbmdzJywgeyBzZXR0aW5ncyB9KTtcbn1cblxuZXhwb3J0IHtcbiAgU3RvcmFnZUtleXMsXG4gIE9XTkVSX1RPS0VOX0tFWSxcbiAgYXBpQ2FsbCxcbiAgZ2V0U2Vzc2lvbklkRnJvbVVSTCxcbiAgZ2V0T3duZXJUb2tlbixcbiAgZ2V0U2NvcGVkVGFiRGF0YVN0b3JhZ2VLZXksXG4gIHNlc3Npb25Bd2FyZUZldGNoLFxuICBjcmVhdGVTZXNzaW9uLFxuICBmZXRjaFN0YXR1cyxcbiAgZmV0Y2hTZXR0aW5ncywgdXBkYXRlU2V0dGluZ3MsXG59O1xuXG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9mZXRjaC11dGlscy5qc1xuICogR2xvYmFsIGZldGNoIGludGVyY2VwdG9yLCA0MDktY29uZmxpY3QgcmV0cnkgcXVldWUsIExMTSBidXN5IG92ZXJsYXksIGFuZFxuICogdGhlIHNldExvYWRpbmcgaGVscGVyIHRoYXQgZHJpdmVzIGJ1dHRvbnMvcHJvZ3Jlc3MgYmFyL2Fib3J0IGNvbnRyb2xsZXIuXG4gKlxuICogREVQRU5ERU5DSUVTOiB1aS1jb3JlLmpzIGV4cG9ydHMgKHRyYXBGb2N1cyBldGMuKSBhdmFpbGFibGUgb24gZ2xvYmFsVGhpcy5cbiAqICAgICAgICAgICAgICAgc2V0TG9hZGluZyBjYWxscyBfdXBkYXRlTExNT3ZlcmxheSAoZGVmaW5lZCBoZXJlKSBhbmRcbiAqICAgICAgICAgICAgICAgYXBwZW5kTWVzc2FnZSAoZGVmaW5lZCBpbiBtZXNzYWdlLXF1ZXVlLmpzLCBvbiBnbG9iYWxUaGlzKS5cbiAqL1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIDQwOSBDb25mbGljdCByZXRyeSBxdWV1ZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IF9jb25mbGljdFJldHJ5UXVldWUgPSBbXTtcbmxldCAgIF9jb25mbGljdFRpbWVySWQgICAgPSBudWxsO1xubGV0ICAgX2NvbmZsaWN0Q291bnRkb3duICA9IDA7XG5cbi8qKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHJlcXVlc3Qgc2hvdWxkIGJlIGludGVyY2VwdGVkIGJ5IHRoZSA0MDkgaGFuZGxlci4gKi9cbmZ1bmN0aW9uIF9zaG91bGRIYW5kbGVCdXN5Q29uZmxpY3QoYXJncykge1xuICB0cnkge1xuICAgIGNvbnN0IHJhd1VybCA9IHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJyA/IGFyZ3NbMF0gOiBhcmdzWzBdPy51cmw7XG4gICAgaWYgKCFyYXdVcmwpIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocmF3VXJsLCB3aW5kb3cubG9jYXRpb24ub3JpZ2luKTtcbiAgICByZXR1cm4gdXJsLnBhdGhuYW1lICE9PSAnL2FwaS9zZXNzaW9ucy9jbGFpbScgJiYgdXJsLnBhdGhuYW1lICE9PSAnL2FwaS9zZXNzaW9ucy90YWtlb3Zlcic7XG4gIH0gY2F0Y2ggKF8pIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG4vKipcbiAqIEhhbmRsZSBhIDQwOSBDb25mbGljdCByZXNwb25zZTogc2hvdyB0aGUgYW1iZXIgYmFubmVyIGFuZCBhd2FpdCB1c2VyIGNob2ljZS5cbiAqIFJldHVybnMgYSBQcm9taXNlPGJvb2xlYW4+IFx1MjAxNCB0cnVlIG1lYW5zIFwicmV0cnlcIiwgZmFsc2UgbWVhbnMgXCJkaXNtaXNzXCIuXG4gKiBDYWxsZWQgZnJvbSBhcGktY2xpZW50LmpzIGluc2lkZSBzZXNzaW9uQXdhcmVGZXRjaCBzbyB0aGUgZnVsbCBmZXRjaCBwaXBlbGluZVxuICogaXMgb3duZWQgYnkgYSBzaW5nbGUgbW9kdWxlLWxldmVsIHdpbmRvdy5mZXRjaCBhc3NpZ25tZW50IHRoZXJlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfFJlcXVlc3R9IGlucHV0IC0gVGhlIHJlcXVlc3QgVVJML29iamVjdCAodXNlZCBmb3IgcGF0aCBmaWx0ZXJpbmcpLlxuICogQHBhcmFtIHtvYmplY3R9IGluaXQgLSBUaGUgZmV0Y2ggaW5pdCBvcHRpb25zLlxuICogQHBhcmFtIHtSZXNwb25zZX0gW3Jlc3BvbnNlXSAtIFRoZSA0MDkgcmVzcG9uc2UgKHVzZWQgdG8gY2hlY2sgY29uZmxpY3RfdHlwZSkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZTQwOUNvbmZsaWN0KGlucHV0LCBpbml0LCByZXNwb25zZSkge1xuICBpZiAoIV9zaG91bGRIYW5kbGVCdXN5Q29uZmxpY3QoW2lucHV0LCBpbml0XSkpIHJldHVybiBmYWxzZTtcbiAgaWYgKHJlc3BvbnNlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCByZXNwb25zZS5jbG9uZSgpLmpzb24oKTtcbiAgICAgIGlmIChib2R5ICYmIGJvZHkuY29uZmxpY3RfdHlwZSAmJiBib2R5LmNvbmZsaWN0X3R5cGUgIT09ICdzZXNzaW9uX293bmVyc2hpcCcpIHJldHVybiBmYWxzZTtcbiAgICB9IGNhdGNoIChfKSB7IC8qIG5vbi1KU09OIGJvZHkgXHUyMDE0IHByb2NlZWQgdG8gYmFubmVyICovIH1cbiAgfVxuICBzaG93U2Vzc2lvbkNvbmZsaWN0QmFubmVyKCk7XG4gIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IF9jb25mbGljdFJldHJ5UXVldWUucHVzaChyZXNvbHZlKSk7XG59XG5cbmZ1bmN0aW9uIHNob3dTZXNzaW9uQ29uZmxpY3RCYW5uZXIoKSB7XG4gIGNvbnN0IGJhbm5lciAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Nlc3Npb24tY29uZmxpY3QtYmFubmVyJyk7XG4gIGNvbnN0IGJhbm5lclRleHQgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbmZsaWN0LWJhbm5lci10ZXh0Jyk7XG4gIGNvbnN0IGNvdW50ZG93bkVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbmZsaWN0LWNvdW50ZG93bicpO1xuICBpZiAoIWJhbm5lcikgcmV0dXJuO1xuICBiYW5uZXIuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gIGlmIChfY29uZmxpY3RUaW1lcklkKSB7IGNsZWFySW50ZXJ2YWwoX2NvbmZsaWN0VGltZXJJZCk7IF9jb25mbGljdFRpbWVySWQgPSBudWxsOyB9XG4gIF9jb25mbGljdENvdW50ZG93biA9IDMwO1xuICBpZiAoYmFubmVyVGV4dCkgIGJhbm5lclRleHQudGV4dENvbnRlbnQgID0gJ1x1MjZBMCBBbm90aGVyIG9wZXJhdGlvbiBpcyBpbiBwcm9ncmVzcy4gQXV0by1yZXRyeWluZyBpbiAnO1xuICBpZiAoY291bnRkb3duRWwpIGNvdW50ZG93bkVsLnRleHRDb250ZW50ID0gYCR7X2NvbmZsaWN0Q291bnRkb3dufXNcdTIwMjZgO1xuICBfY29uZmxpY3RUaW1lcklkID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgIF9jb25mbGljdENvdW50ZG93bi0tO1xuICAgIGlmIChfY29uZmxpY3RDb3VudGRvd24gPD0gMCkge1xuICAgICAgY2xlYXJJbnRlcnZhbChfY29uZmxpY3RUaW1lcklkKTsgX2NvbmZsaWN0VGltZXJJZCA9IG51bGw7XG4gICAgICBjb25mbGljdFJldHJ5Tm93KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChjb3VudGRvd25FbCkgY291bnRkb3duRWwudGV4dENvbnRlbnQgPSBgJHtfY29uZmxpY3RDb3VudGRvd259c1x1MjAyNmA7XG4gICAgfVxuICB9LCAxMDAwKTtcbn1cblxuZnVuY3Rpb24gY29uZmxpY3RSZXRyeU5vdygpIHtcbiAgaWYgKF9jb25mbGljdFRpbWVySWQpIHsgY2xlYXJJbnRlcnZhbChfY29uZmxpY3RUaW1lcklkKTsgX2NvbmZsaWN0VGltZXJJZCA9IG51bGw7IH1cbiAgY29uc3QgYmFubmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Nlc3Npb24tY29uZmxpY3QtYmFubmVyJyk7XG4gIGlmIChiYW5uZXIpIGJhbm5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICB3aGlsZSAoX2NvbmZsaWN0UmV0cnlRdWV1ZS5sZW5ndGgpIF9jb25mbGljdFJldHJ5UXVldWUuc2hpZnQoKSh0cnVlKTtcbn1cblxuZnVuY3Rpb24gY29uZmxpY3REaXNtaXNzKCkge1xuICBpZiAoX2NvbmZsaWN0VGltZXJJZCkgeyBjbGVhckludGVydmFsKF9jb25mbGljdFRpbWVySWQpOyBfY29uZmxpY3RUaW1lcklkID0gbnVsbDsgfVxuICBjb25zdCBiYW5uZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2Vzc2lvbi1jb25mbGljdC1iYW5uZXInKTtcbiAgaWYgKGJhbm5lcikgYmFubmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHdoaWxlIChfY29uZmxpY3RSZXRyeVF1ZXVlLmxlbmd0aCkgX2NvbmZsaWN0UmV0cnlRdWV1ZS5zaGlmdCgpKGZhbHNlKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBMTE0gZmV0Y2ggd3JhcHBlciAoYXR0YWNoZXMgYWJvcnQgc2lnbmFsKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIGxsbUZldGNoKHVybCwgb3B0aW9ucyA9IHt9KSB7XG4gIGlmICh3aW5kb3cuX2N1cnJlbnRBYm9ydENvbnRyb2xsZXIpIHtcbiAgICBvcHRpb25zLnNpZ25hbCA9IHdpbmRvdy5fY3VycmVudEFib3J0Q29udHJvbGxlci5zaWduYWw7XG4gIH1cbiAgcmV0dXJuIGZldGNoKHVybCwgb3B0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIGFib3J0Q3VycmVudFJlcXVlc3QoKSB7XG4gIGlmICh3aW5kb3cuX2N1cnJlbnRBYm9ydENvbnRyb2xsZXIpIHtcbiAgICB3aW5kb3cuX2N1cnJlbnRBYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICB3aW5kb3cuX2N1cnJlbnRBYm9ydENvbnRyb2xsZXIgPSBudWxsO1xuICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgIGlmICh0eXBlb2YgYXBwZW5kTWVzc2FnZSA9PT0gJ2Z1bmN0aW9uJykgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgJ1x1MjNGOSBSZXF1ZXN0IHN0b3BwZWQuJyk7XG4gIH1cbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBMTE0gYnVzeSBvdmVybGF5XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxubGV0IF9sbG1FbGFwc2VkVGltZXIgPSBudWxsO1xubGV0IF9sbG1TdGFydFRpbWUgICAgPSBudWxsO1xuXG5mdW5jdGlvbiBfdXBkYXRlTExNT3ZlcmxheShsb2FkaW5nLCBsYWJlbCkge1xuICBjb25zdCBvdmVybGF5ICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG0tYnVzeS1vdmVybGF5Jyk7XG4gIGNvbnN0IGxhYmVsRWwgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbS1idXN5LWxhYmVsJyk7XG4gIGNvbnN0IGVsYXBzZWQgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbS1idXN5LWVsYXBzZWQnKTtcbiAgaWYgKCFvdmVybGF5KSByZXR1cm47XG5cbiAgaWYgKGxvYWRpbmcpIHtcbiAgICBvdmVybGF5LmNsYXNzTGlzdC5hZGQoJ3Zpc2libGUnKTtcbiAgICBvdmVybGF5LmNsYXNzTGlzdC5yZW1vdmUoJ3Nsb3cnKTtcbiAgICBpZiAobGFiZWxFbCkgbGFiZWxFbC50ZXh0Q29udGVudCA9IGxhYmVsIHx8ICdSZWFzb25pbmdcdTIwMjYnO1xuICAgIGlmIChlbGFwc2VkKSAgZWxhcHNlZC50ZXh0Q29udGVudCA9ICcwOjAwJztcblxuICAgIF9sbG1TdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGNsZWFySW50ZXJ2YWwoX2xsbUVsYXBzZWRUaW1lcik7XG4gICAgX2xsbUVsYXBzZWRUaW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIGNvbnN0IHNlY3MgPSBNYXRoLmZsb29yKChEYXRlLm5vdygpIC0gX2xsbVN0YXJ0VGltZSkgLyAxMDAwKTtcbiAgICAgIGNvbnN0IG1tID0gU3RyaW5nKE1hdGguZmxvb3Ioc2VjcyAvIDYwKSkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICAgIGNvbnN0IHNzID0gU3RyaW5nKHNlY3MgJSA2MCkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICAgIGlmIChlbGFwc2VkKSBlbGFwc2VkLnRleHRDb250ZW50ID0gYCR7bW19OiR7c3N9YDtcbiAgICAgIGlmIChzZWNzID49IDMwICYmICFvdmVybGF5LmNsYXNzTGlzdC5jb250YWlucygnc2xvdycpKSB7XG4gICAgICAgIG92ZXJsYXkuY2xhc3NMaXN0LmFkZCgnc2xvdycpO1xuICAgICAgfVxuICAgIH0sIDEwMDApO1xuICB9IGVsc2Uge1xuICAgIGNsZWFySW50ZXJ2YWwoX2xsbUVsYXBzZWRUaW1lcik7XG4gICAgX2xsbUVsYXBzZWRUaW1lciA9IG51bGw7XG4gICAgX2xsbVN0YXJ0VGltZSAgICA9IG51bGw7XG4gICAgb3ZlcmxheS5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJywgJ3Nsb3cnKTtcbiAgICBpZiAobGFiZWxFbCkgbGFiZWxFbC50ZXh0Q29udGVudCA9ICdSZWFzb25pbmdcdTIwMjYnO1xuICAgIGlmIChlbGFwc2VkKSAgZWxhcHNlZC50ZXh0Q29udGVudCA9ICcwOjAwJztcbiAgICBfcmVmcmVzaENvbnRleHRTdGF0cygpO1xuICB9XG59XG5cbi8vIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkgZm9yIHRlc3RzL2ltcG9ydHMgdGhhdCBzdGlsbCByZWZlcmVuY2UgdGhlIG9sZCBuYW1lLlxuZnVuY3Rpb24gX3VwZGF0ZUxMTVN0YXR1c0Jhcihsb2FkaW5nLCBsYWJlbCkge1xuICBfdXBkYXRlTExNT3ZlcmxheShsb2FkaW5nLCBsYWJlbCk7XG5cbiAgY29uc3QgYmFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbS1zdGF0dXMtYmFyJyk7XG4gIGNvbnN0IHRoaW5raW5nID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbS10aGlua2luZycpO1xuICBjb25zdCBzdGVwTGFiZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtLXN0ZXAtbGFiZWwnKTtcbiAgY29uc3QgYWJvcnRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtLWFib3J0LWJ0bicpO1xuICBpZiAoIWJhcikgcmV0dXJuO1xuXG4gIGlmIChsb2FkaW5nKSB7XG4gICAgYmFyLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgaWYgKHRoaW5raW5nKSB0aGlua2luZy5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICAgIGlmIChzdGVwTGFiZWwpIHN0ZXBMYWJlbC50ZXh0Q29udGVudCA9IGxhYmVsIHx8ICdSZWFzb25pbmdcdTIwMjYnO1xuICAgIGlmIChhYm9ydEJ0bikge1xuICAgICAgYWJvcnRCdG4uc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgYWJvcnRCdG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKHRoaW5raW5nKSB0aGlua2luZy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGlmIChhYm9ydEJ0bikgYWJvcnRCdG4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBiYXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBfcmVmcmVzaENvbnRleHRTdGF0cygpIHtcbiAgY29uc3QgdG9rZW5FbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG0tdG9rZW4tY291bnQnKTtcbiAgaWYgKCF0b2tlbkVsKSByZXR1cm47XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL2NvbnRleHQtc3RhdHMnKTtcbiAgICBpZiAoIXJlcy5vaykgcmV0dXJuO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmICghZGF0YS5vaykgcmV0dXJuO1xuICAgIGNvbnN0IGVzdCAgICA9IGRhdGEuZXN0aW1hdGVkX3Rva2VucyB8fCAwO1xuICAgIGNvbnN0IHdpbiAgICA9IGRhdGEuY29udGV4dF93aW5kb3cgICB8fCAxMjhfMDAwO1xuICAgIGNvbnN0IGV4YWN0ICA9IGRhdGEudG9rZW5fc291cmNlID09PSAnZXhhY3QnO1xuICAgIGNvbnN0IHBjdCAgICA9IE1hdGgucm91bmQoKGVzdCAvIHdpbikgKiAxMDApO1xuICAgIGNvbnN0IGVzdFN0ciA9IGVzdCA+PSAxMDAwID8gYCR7KGVzdCAvIDEwMDApLnRvRml4ZWQoMSl9S2AgOiBgJHtlc3R9YDtcbiAgICBjb25zdCB3aW5TdHIgPSB3aW4gPj0gMTAwMCA/IGAke01hdGgucm91bmQod2luIC8gMTAwMCl9S2AgIDogYCR7d2lufWA7XG4gICAgdG9rZW5FbC50ZXh0Q29udGVudCA9IGAke2V4YWN0ID8gJycgOiAnfid9JHtlc3RTdHJ9IC8gJHt3aW5TdHJ9ICgke3BjdH0lKWA7XG4gIH0gY2F0Y2ggKF8pIHsgLyogc2lsZW50bHkgaWdub3JlICovIH1cbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBMb2FkaW5nIHN0YXRlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gc2V0TG9hZGluZyhsb2FkaW5nLCBsYWJlbCkge1xuICBpZiAodHlwZW9mIHN0YXRlTWFuYWdlciAhPT0gJ3VuZGVmaW5lZCcgJiYgc3RhdGVNYW5hZ2VyPy5zZXRMb2FkaW5nKSB7XG4gICAgc3RhdGVNYW5hZ2VyLnNldExvYWRpbmcobG9hZGluZyk7XG4gIH1cblxuICBpZiAobG9hZGluZykge1xuICAgIHdpbmRvdy5fY3VycmVudEFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAvLyBFeHBhbmQgY2hhdCBwYW5lbCBpZiBjb2xsYXBzZWRcbiAgICBjb25zdCBjaGF0QXJlYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaGF0LWFyZWEnKTtcbiAgICBjb25zdCB2aWV3ZXJBcmVhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ZpZXdlci1hcmVhJyk7XG4gICAgY29uc3QgdG9nZ2xlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvZ2dsZS1jaGF0Jyk7XG4gICAgaWYgKGNoYXRBcmVhPy5jbGFzc0xpc3QuY29udGFpbnMoJ2NvbGxhcHNlZCcpKSB7XG4gICAgICBjaGF0QXJlYS5jbGFzc0xpc3QucmVtb3ZlKCdjb2xsYXBzZWQnKTtcbiAgICAgIHZpZXdlckFyZWE/LmNsYXNzTGlzdC5yZW1vdmUoJ2V4cGFuZGVkJyk7XG4gICAgICBpZiAodG9nZ2xlQnRuKSB0b2dnbGVCdG4udGV4dENvbnRlbnQgPSAnXHUyNUMwJztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgd2luZG93Ll9jdXJyZW50QWJvcnRDb250cm9sbGVyID0gbnVsbDtcbiAgfVxuXG4gIF91cGRhdGVMTE1TdGF0dXNCYXIobG9hZGluZywgbGFiZWwpO1xuXG4gIC8vIE9ubHkgZGlzYWJsZSBidXR0b25zIGluc2lkZSB0aGUgY2hhdC9pbnRlcmFjdGlvbiBhcmVhIFx1MjAxNCBub3QgdGhlIHdob2xlIHBhZ2UuXG4gIGNvbnN0IGNoYXRBcmVhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NoYXQtYXJlYScpO1xuICBjb25zdCBzY29wZSA9IGNoYXRBcmVhIHx8IGRvY3VtZW50O1xuICBzY29wZS5xdWVyeVNlbGVjdG9yQWxsKCdidXR0b24nKS5mb3JFYWNoKGJ0biA9PiB7IGJ0bi5kaXNhYmxlZCA9IGxvYWRpbmc7IH0pO1xuICBjb25zdCBzdG9wQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbS1idXN5LXN0b3AnKTtcbiAgaWYgKHN0b3BCdG4pIHN0b3BCdG4uZGlzYWJsZWQgPSBmYWxzZTtcblxuICBsZXQgYmFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvYWRpbmctcHJvZ3Jlc3MtYmFyJyk7XG4gIGlmIChsb2FkaW5nKSB7XG4gICAgaWYgKCFiYXIpIHtcbiAgICAgIGJhciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgYmFyLmlkID0gJ2xvYWRpbmctcHJvZ3Jlc3MtYmFyJztcbiAgICAgIGRvY3VtZW50LmJvZHkucHJlcGVuZChiYXIpO1xuICAgIH1cbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4geyBiYXIuc3R5bGUud2lkdGggPSAnNzAlJzsgfSk7XG4gICAgaWYgKGxhYmVsKSBiYXIudGl0bGUgPSBsYWJlbDtcbiAgfSBlbHNlIHtcbiAgICBpZiAoYmFyKSB7XG4gICAgICBiYXIuc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IGJhci5yZW1vdmUoKSwgNDAwKTtcbiAgICB9XG4gIH1cblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc3RlcC5hY3RpdmUnKS5mb3JFYWNoKGVsID0+IHtcbiAgICBlbC5jbGFzc0xpc3QudG9nZ2xlKCdsb2FkaW5nLXN0ZXAnLCBsb2FkaW5nKTtcbiAgfSk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFUyBtb2R1bGUgZXhwb3J0cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmV4cG9ydCB7XG4gIGhhbmRsZTQwOUNvbmZsaWN0LFxuICBzaG93U2Vzc2lvbkNvbmZsaWN0QmFubmVyLCBjb25mbGljdFJldHJ5Tm93LCBjb25mbGljdERpc21pc3MsXG4gIGxsbUZldGNoLCBhYm9ydEN1cnJlbnRSZXF1ZXN0LFxuICBfdXBkYXRlTExNU3RhdHVzQmFyLFxuICBfdXBkYXRlTExNT3ZlcmxheSwgX3JlZnJlc2hDb250ZXh0U3RhdHMsXG4gIHNldExvYWRpbmcsXG59O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiBzdGF0ZS1tYW5hZ2VyLmpzXG4gKiBNYW5hZ2VzIHNlc3Npb24gc3RhdGUsIGxvY2FsU3RvcmFnZSBwZXJzaXN0ZW5jZSwgYW5kIHN0YXRlIGluaXRpYWxpemF0aW9uLlxuICogQ2VudHJhbGl6ZXMgYWxsIHN0YXRlIG1hbmFnZW1lbnQgbG9naWMgKGN1cnJlbnRUYWIsIGludGVyYWN0aXZlU3RhdGUsIHNlc3Npb25JZCwgZXRjLilcbiAqL1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5jb25zdCBsb2cgPSBnZXRMb2dnZXIoJ3N0YXRlLW1hbmFnZXInKTtcblxuaW1wb3J0IHsgU3RvcmFnZUtleXMgfSBmcm9tICcuL2FwaS1jbGllbnQuanMnO1xuXG4vKipcbiAqIE1pcnJvciBvZiB0aGUgUHl0aG9uIFBoYXNlIGVudW0gaW4gc2NyaXB0cy91dGlscy9jb252ZXJzYXRpb25fbWFuYWdlci5weS5cbiAqIFB5dGhvbiBpcyB0aGUgU09VUkNFIE9GIFRSVVRIIFx1MjAxNCB1cGRhdGUgYm90aCBmaWxlcyB0b2dldGhlciB3aGVuZXZlciBhZGRpbmdcbiAqIG9yIHJlbmFtaW5nIGEgcGhhc2UuXG4gKi9cbmNvbnN0IFBIQVNFUyA9IHtcbiAgSU5JVDogICAgICAgICAgICAgJ2luaXQnLFxuICBKT0JfQU5BTFlTSVM6ICAgICAnam9iX2FuYWx5c2lzJyxcbiAgQ1VTVE9NSVpBVElPTjogICAgJ2N1c3RvbWl6YXRpb24nLFxuICBSRVdSSVRFX1JFVklFVzogICAncmV3cml0ZV9yZXZpZXcnLFxuICBTUEVMTF9DSEVDSzogICAgICAnc3BlbGxfY2hlY2snLFxuICBHRU5FUkFUSU9OOiAgICAgICAnZ2VuZXJhdGlvbicsXG4gIExBWU9VVF9SRVZJRVc6ICAgICdsYXlvdXRfcmV2aWV3JyxcbiAgRklOQUxfR0VORVJBVElPTjogJ2ZpbmFsX2dlbmVyYXRpb24nLFxuICBSRUZJTkVNRU5UOiAgICAgICAncmVmaW5lbWVudCcsXG59O1xuXG5jb25zdCBQSEFTRV9UT19TVEVQID0ge1xuICBbUEhBU0VTLklOSVRdOiAgICAgICAgICAgICAnam9iJyxcbiAgW1BIQVNFUy5KT0JfQU5BTFlTSVNdOiAgICAgJ2FuYWx5c2lzJyxcbiAgW1BIQVNFUy5DVVNUT01JWkFUSU9OXTogICAgJ2N1c3RvbWl6YXRpb25zJyxcbiAgW1BIQVNFUy5SRVdSSVRFX1JFVklFV106ICAgJ3Jld3JpdGUnLFxuICBbUEhBU0VTLlNQRUxMX0NIRUNLXTogICAgICAnc3BlbGwnLFxuICBbUEhBU0VTLkdFTkVSQVRJT05dOiAgICAgICAnbGF5b3V0JyxcbiAgW1BIQVNFUy5MQVlPVVRfUkVWSUVXXTogICAgJ2xheW91dCcsXG4gIFtQSEFTRVMuRklOQUxfR0VORVJBVElPTl06ICdkb3dubG9hZCcsXG4gIFtQSEFTRVMuUkVGSU5FTUVOVF06ICAgICAgICdkb3dubG9hZCcsXG59O1xuXG5mdW5jdGlvbiBnZXRXb3JrZmxvd1N0ZXBGb3JQaGFzZShwaGFzZSkge1xuICByZXR1cm4gUEhBU0VfVE9fU1RFUFtwaGFzZV0gfHwgJ2pvYic7XG59XG5cbi8qKlxuICogU3RhZ2VkIGdlbmVyYXRpb24gd29ya2Zsb3cgcGhhc2VzIChHQVAtMjAgaW1wbGVtZW50YXRpb24pLlxuICogVGhlc2UgdHJhY2sgdGhlIHByZXZpZXcvbGF5b3V0IHJldmlldyBcdTIxOTIgY29uZmlybWVkIFx1MjE5MiBmaW5hbCBwaXBlbGluZVxuICogaW5kZXBlbmRlbnRseSBvZiB0aGUgbWFpbiBjb252ZXJzYXRpb24gUEhBU0VTIGFib3ZlLlxuICogQmFja2VuZCBzb3VyY2Ugb2YgdHJ1dGggaXMgc2Vzc2lvbl9kYXRhWydnZW5lcmF0aW9uX3N0YXRlJ11bJ3BoYXNlJ10uXG4gKi9cbmNvbnN0IEdFTkVSQVRJT05fUEhBU0VTID0ge1xuICBJRExFOiAgICAgICAgICAgJ2lkbGUnLFxuICBMQVlPVVRfUkVWSUVXOiAgJ2xheW91dF9yZXZpZXcnLFxuICBDT05GSVJNRUQ6ICAgICAgJ2NvbmZpcm1lZCcsXG4gIEZJTkFMX0NPTVBMRVRFOiAnZmluYWxfY29tcGxldGUnLFxufTtcblxuY29uc3QgR0VORVJBVElPTl9TVEFURV9FVkVOVCA9ICdjdmJ1aWxkZXI6Z2VuZXJhdGlvbi1zdGF0ZS1jaGFuZ2VkJztcblxuZnVuY3Rpb24gY3JlYXRlRGVmYXVsdEdlbmVyYXRpb25TdGF0ZSgpIHtcbiAgcmV0dXJuIHtcbiAgICBwaGFzZTogR0VORVJBVElPTl9QSEFTRVMuSURMRSxcbiAgICBwcmV2aWV3QXZhaWxhYmxlOiBmYWxzZSxcbiAgICBwcmV2aWV3T3V0cHV0czogbnVsbCxcbiAgICBsYXlvdXRDb25maXJtZWQ6IGZhbHNlLFxuICAgIHBhZ2VDb3VudEVzdGltYXRlOiBudWxsLFxuICAgIHBhZ2VDb3VudEV4YWN0OiBudWxsLFxuICAgIHBhZ2VDb3VudENvbmZpZGVuY2U6IG51bGwsXG4gICAgcGFnZUNvdW50U291cmNlOiBudWxsLFxuICAgIHBhZ2VOZWVkc0V4YWN0UmVjaGVjazogZmFsc2UsXG4gICAgcGFnZVdhcm5pbmc6IGZhbHNlLFxuICAgIGxheW91dEluc3RydWN0aW9uc0NvdW50OiAwLFxuICAgIGZpbmFsR2VuZXJhdGVkQXQ6IG51bGwsXG4gICAgcHJldmlld0dlbmVyYXRlZEF0OiBudWxsLFxuICAgIHByZXZpZXdSZXF1ZXN0SWQ6IG51bGwsXG4gICAgY29uZmlybWVkQXQ6IG51bGwsXG4gICAgY29udGVudFJldmlzaW9uOiAwLFxuICAgIGxhc3RQcmV2aWV3Q29udGVudFJldmlzaW9uOiBudWxsLFxuICAgIGxhc3RGaW5hbENvbnRlbnRSZXZpc2lvbjogbnVsbCxcbiAgICBkaXJ0eVBoYXNlczogW10sXG4gICAgZWFybGllc3REaXJ0eVN0ZXA6IG51bGwsXG4gIH07XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJldmlzaW9uKHZhbHVlKSB7XG4gIHJldHVybiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpID8gdmFsdWUgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBnZXRMYXN0UmVuZGVyZWRDb250ZW50UmV2aXNpb24oc3RhdGUpIHtcbiAgY29uc3QgcmV2aXNpb25zID0gW1xuICAgIG5vcm1hbGl6ZVJldmlzaW9uKHN0YXRlLmxhc3RQcmV2aWV3Q29udGVudFJldmlzaW9uKSxcbiAgICBub3JtYWxpemVSZXZpc2lvbihzdGF0ZS5sYXN0RmluYWxDb250ZW50UmV2aXNpb24pLFxuICBdLmZpbHRlcih2YWx1ZSA9PiB2YWx1ZSAhPT0gbnVsbCk7XG4gIHJldHVybiByZXZpc2lvbnMubGVuZ3RoID4gMCA/IE1hdGgubWF4KC4uLnJldmlzaW9ucykgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZVNlc3Npb25JZCgpIHtcbiAgY29uc3QgY3J5cHRvQXBpID0gZ2xvYmFsVGhpcy5jcnlwdG87XG4gIGlmIChjcnlwdG9BcGk/LnJhbmRvbVVVSUQpIHtcbiAgICByZXR1cm4gYHNlc3Npb24tJHtjcnlwdG9BcGkucmFuZG9tVVVJRCgpfWA7XG4gIH1cblxuICBpZiAoY3J5cHRvQXBpPy5nZXRSYW5kb21WYWx1ZXMpIHtcbiAgICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KDE2KTtcbiAgICBjcnlwdG9BcGkuZ2V0UmFuZG9tVmFsdWVzKGJ5dGVzKTtcbiAgICBjb25zdCB0b2tlbiA9IEFycmF5LmZyb20oYnl0ZXMsIGJ5dGUgPT4gYnl0ZS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKSkuam9pbignJyk7XG4gICAgcmV0dXJuIGBzZXNzaW9uLSR7dG9rZW59YDtcbiAgfVxuXG4gIGxvZy53YXJuKCdXZWIgQ3J5cHRvIEFQSSB1bmF2YWlsYWJsZTsgZmFsbGluZyBiYWNrIHRvIHRpbWVzdGFtcC1wbHVzLXJhbmRvbSBzZXNzaW9uIGlkIGdlbmVyYXRpb24uJyk7XG4gIHJldHVybiBgc2Vzc2lvbi0ke0RhdGUubm93KCkudG9TdHJpbmcoMzYpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDExKX1gO1xufVxuXG5mdW5jdGlvbiBnZXRMYXlvdXRGcmVzaG5lc3NGcm9tU3RhdGUoc3RhdGUpIHtcbiAgY29uc3QgcHJldmlld0F2YWlsYWJsZSA9IEJvb2xlYW4oc3RhdGUucHJldmlld0F2YWlsYWJsZSk7XG4gIGNvbnN0IGhhc0ZpbmFsT3V0cHV0cyA9IEJvb2xlYW4oXG4gICAgc3RhdGUuZmluYWxHZW5lcmF0ZWRBdFxuICAgICAgfHwgc3RhdGUucGhhc2UgPT09IEdFTkVSQVRJT05fUEhBU0VTLkZJTkFMX0NPTVBMRVRFXG4gICAgICB8fCBub3JtYWxpemVSZXZpc2lvbihzdGF0ZS5sYXN0RmluYWxDb250ZW50UmV2aXNpb24pICE9PSBudWxsXG4gICk7XG5cbiAgaWYgKCFwcmV2aWV3QXZhaWxhYmxlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNob3dDaGlwOiBmYWxzZSxcbiAgICAgIGlzU3RhbGU6IGZhbHNlLFxuICAgICAgaXNDcml0aWNhbDogZmFsc2UsXG4gICAgICBoYXNGaW5hbE91dHB1dHMsXG4gICAgICBsYWJlbDogJycsXG4gICAgICBhcmlhTGFiZWw6ICcnLFxuICAgICAgdG9uZTogJ2hpZGRlbicsXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IGNvbnRlbnRSZXZpc2lvbiA9IG5vcm1hbGl6ZVJldmlzaW9uKHN0YXRlLmNvbnRlbnRSZXZpc2lvbikgPz8gMDtcbiAgY29uc3QgbGFzdFJlbmRlcmVkUmV2aXNpb24gPSBnZXRMYXN0UmVuZGVyZWRDb250ZW50UmV2aXNpb24oc3RhdGUpO1xuICBjb25zdCBpc1N0YWxlID0gbGFzdFJlbmRlcmVkUmV2aXNpb24gIT09IG51bGwgJiYgY29udGVudFJldmlzaW9uID4gbGFzdFJlbmRlcmVkUmV2aXNpb247XG4gIGNvbnN0IGlzQ3JpdGljYWwgPSBpc1N0YWxlICYmIGhhc0ZpbmFsT3V0cHV0cztcblxuICBpZiAoaXNDcml0aWNhbCkge1xuICAgIHJldHVybiB7XG4gICAgICBzaG93Q2hpcDogdHJ1ZSxcbiAgICAgIGlzU3RhbGUsXG4gICAgICBpc0NyaXRpY2FsLFxuICAgICAgaGFzRmluYWxPdXRwdXRzLFxuICAgICAgbGFiZWw6ICdGaWxlcyBvdXRkYXRlZCcsXG4gICAgICBhcmlhTGFiZWw6ICdGaWxlcyBvdXRkYXRlZC4gQWN0aXZhdGUgdG8gcmV2aWV3IGxheW91dCBhbmQgcmVnZW5lcmF0ZSBvdXRwdXRzLicsXG4gICAgICB0b25lOiAnY3JpdGljYWwnLFxuICAgIH07XG4gIH1cblxuICBpZiAoaXNTdGFsZSkge1xuICAgIHJldHVybiB7XG4gICAgICBzaG93Q2hpcDogdHJ1ZSxcbiAgICAgIGlzU3RhbGUsXG4gICAgICBpc0NyaXRpY2FsLFxuICAgICAgaGFzRmluYWxPdXRwdXRzLFxuICAgICAgbGFiZWw6ICdMYXlvdXQgb3V0ZGF0ZWQnLFxuICAgICAgYXJpYUxhYmVsOiAnTGF5b3V0IG91dGRhdGVkLiBBY3RpdmF0ZSB0byByZXZpZXcgYW5kIHJlZ2VuZXJhdGUgcHJldmlldy4nLFxuICAgICAgdG9uZTogJ3N0YWxlJyxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzaG93Q2hpcDogdHJ1ZSxcbiAgICBpc1N0YWxlLFxuICAgIGlzQ3JpdGljYWwsXG4gICAgaGFzRmluYWxPdXRwdXRzLFxuICAgIGxhYmVsOiAnTGF5b3V0IGN1cnJlbnQnLFxuICAgIGFyaWFMYWJlbDogJ0xheW91dCBjdXJyZW50LiBQcmV2aWV3IG1hdGNoZXMgbGF0ZXN0IGNvbnRlbnQuJyxcbiAgICB0b25lOiAnZnJlc2gnLFxuICB9O1xufVxuXG5mdW5jdGlvbiBlbWl0R2VuZXJhdGlvblN0YXRlQ2hhbmdlZCgpIHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiB3aW5kb3cuZGlzcGF0Y2hFdmVudCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybjtcbiAgfVxuICB3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoR0VORVJBVElPTl9TVEFURV9FVkVOVCwge1xuICAgIGRldGFpbDoge1xuICAgICAgZ2VuZXJhdGlvblN0YXRlOiB7IC4uLmdlbmVyYXRpb25TdGF0ZSB9LFxuICAgICAgbGF5b3V0RnJlc2huZXNzOiBnZXRMYXlvdXRGcmVzaG5lc3NGcm9tU3RhdGUoZ2VuZXJhdGlvblN0YXRlKSxcbiAgICB9LFxuICB9KSk7XG59XG5cbi8vIEdsb2JhbCBzdGF0ZSB2YXJpYWJsZXMgKG1vdmVkIGludG8gbW9kdWxlIGZvciBjbGFyaXR5KVxubGV0IGN1cnJlbnRUYWIgPSAnam9iJztcbmxldCBpc0xvYWRpbmcgPSBmYWxzZTtcbmxldCB0YWJEYXRhID0ge1xuICBhbmFseXNpczogbnVsbCxcbiAgY3VzdG9taXphdGlvbnM6IG51bGwsXG4gIGN2OiBudWxsXG59O1xubGV0IGludGVyYWN0aXZlU3RhdGUgPSB7XG4gIGlzUmV2aWV3aW5nOiBmYWxzZSxcbiAgY3VycmVudEluZGV4OiAwLFxuICB0eXBlOiBudWxsLCAvLyAnZXhwZXJpZW5jZXMnIG9yICdza2lsbHMnXG4gIGRhdGE6IG51bGxcbn07XG5sZXQgc2Vzc2lvbklkID0gbnVsbDtcbmxldCBsYXN0S25vd25QaGFzZSA9IFBIQVNFUy5JTklUO1xubGV0IGlzUmVjb25uZWN0aW5nID0gZmFsc2U7XG5jb25zdCBfcGhhc2VDaGFuZ2VMaXN0ZW5lcnMgPSBbXTtcbi8vIEN1cnJlbnQgbW9kZWwvcHJvdmlkZXIgc2VsZWN0aW9uIChwZXJzaXN0ZWQgdG8gbG9jYWxTdG9yYWdlKVxubGV0IGN1cnJlbnRNb2RlbFByb3ZpZGVyID0gbnVsbDtcbmxldCBjdXJyZW50TW9kZWxOYW1lID0gbnVsbDtcblxuXG4vLyBTdGFnZWQgZ2VuZXJhdGlvbiBzdGF0ZSAoR0FQLTIwKTogdHJhY2tzIHByZXZpZXcgXHUyMTkyIGNvbmZpcm0gXHUyMTkyIGZpbmFsIHBpcGVsaW5lLlxuLy8gU3luY2VkIGZyb20gL2FwaS9jdi9nZW5lcmF0aW9uLXN0YXRlIG9uIHBhZ2UgbG9hZCBhbmQgYWZ0ZXIga2V5IHRyYW5zaXRpb25zLlxubGV0IGdlbmVyYXRpb25TdGF0ZSA9IGNyZWF0ZURlZmF1bHRHZW5lcmF0aW9uU3RhdGUoKTtcblxuLy8gQVRTIHNjb3JlIHN0YXRlIChHQVAtMjEpOiBjYWNoZWQgc2NvcmUgZnJvbSAvYXBpL2N2L2F0cy1zY29yZS5cbi8vIE51bGwgdW50aWwgZmlyc3Qgc2NvcmUgaXMgZmV0Y2hlZC5cbmxldCBhdHNTY29yZSA9IG51bGw7XG5cbi8vIEV4cG9ydCBzdGF0ZSBnZXR0ZXJzL3NldHRlcnNcbmNvbnN0IHN0YXRlTWFuYWdlciA9IHtcbiAgLy8gVGFiIHN0YXRlXG4gIGdldEN1cnJlbnRUYWI6ICgpID0+IGN1cnJlbnRUYWIsXG4gIHNldEN1cnJlbnRUYWI6ICh0YWIpID0+IHsgY3VycmVudFRhYiA9IHRhYjsgc2F2ZVN0YXRlVG9Mb2NhbFN0b3JhZ2UoKTsgfSxcbiAgZ2V0Q3VycmVudFN0YWdlOiAoKSA9PiBnZXRXb3JrZmxvd1N0ZXBGb3JQaGFzZShsYXN0S25vd25QaGFzZSksXG5cbiAgLy8gTG9hZGluZyBzdGF0ZVxuICBpc0xvYWRpbmc6ICgpID0+IGlzTG9hZGluZyxcbiAgc2V0TG9hZGluZzogKGxvYWRpbmcpID0+IHtcbiAgICBpc0xvYWRpbmcgPSBsb2FkaW5nO1xuICB9LFxuXG4gIC8vIFRhYiBkYXRhIChhbmFseXNpcywgY3VzdG9taXphdGlvbnMsIENWKVxuICBnZXRUYWJEYXRhOiAodGFiKSA9PiB0YWJEYXRhW3RhYl0sXG4gIGdldEFsbFRhYkRhdGE6ICgpID0+ICh7IC4uLnRhYkRhdGEgfSksXG4gIHNldFRhYkRhdGE6ICh0YWIsIGRhdGEpID0+IHsgdGFiRGF0YVt0YWJdID0gZGF0YTsgc2F2ZVN0YXRlVG9Mb2NhbFN0b3JhZ2UoKTsgfSxcblxuICAvLyBJbnRlcmFjdGl2ZSBzdGF0ZSAoZm9yIGV4cGVyaWVuY2Uvc2tpbGwgc2VsZWN0aW9uIHJldmlldylcbiAgZ2V0SW50ZXJhY3RpdmVTdGF0ZTogKCkgPT4gaW50ZXJhY3RpdmVTdGF0ZSxcbiAgc2V0SW50ZXJhY3RpdmVTdGF0ZTogKHN0YXRlKSA9PiB7IGludGVyYWN0aXZlU3RhdGUgPSB7IC4uLmludGVyYWN0aXZlU3RhdGUsIC4uLnN0YXRlIH07IHNhdmVTdGF0ZVRvTG9jYWxTdG9yYWdlKCk7IH0sXG5cbiAgLy8gUmVjb25uZWN0IHN0YXRlXG4gIGlzUmVjb25uZWN0aW5nOiAoKSA9PiBpc1JlY29ubmVjdGluZyxcbiAgc2V0SXNSZWNvbm5lY3Rpbmc6IChyZWNvbm5lY3RpbmcpID0+IHsgaXNSZWNvbm5lY3RpbmcgPSBCb29sZWFuKHJlY29ubmVjdGluZyk7IH0sXG5cbiAgLy8gU2Vzc2lvbiBtYW5hZ2VtZW50XG4gIGdldFNlc3Npb25JZDogKCkgPT4gc2Vzc2lvbklkLFxuICBzZXRTZXNzaW9uSWQ6IChpZCkgPT4geyBzZXNzaW9uSWQgPSBpZDsgbG9jYWxTdG9yYWdlLnNldEl0ZW0oU3RvcmFnZUtleXMuU0VTU0lPTl9JRCwgaWQpOyB9LFxuXG4gIC8vIE1vZGVsL3Byb3ZpZGVyIHNlbGVjdGlvblxuICBnZXRDdXJyZW50TW9kZWxQcm92aWRlcjogKCkgPT4gY3VycmVudE1vZGVsUHJvdmlkZXIsXG4gIGdldEN1cnJlbnRNb2RlbE5hbWU6ICgpID0+IGN1cnJlbnRNb2RlbE5hbWUsXG4gIHNldEN1cnJlbnRNb2RlbDogKHByb3ZpZGVyLCBtb2RlbCkgPT4geyBjdXJyZW50TW9kZWxQcm92aWRlciA9IHByb3ZpZGVyIHx8IG51bGw7IGN1cnJlbnRNb2RlbE5hbWUgPSBtb2RlbCB8fCBudWxsOyBzYXZlU3RhdGVUb0xvY2FsU3RvcmFnZSgpOyB9LFxuXG4gIC8vIFBoYXNlIHRyYWNraW5nXG4gIGdldFBoYXNlOiAoKSA9PiBsYXN0S25vd25QaGFzZSxcbiAgc2V0UGhhc2U6IChwaGFzZSkgPT4ge1xuICAgIGxhc3RLbm93blBoYXNlID0gcGhhc2U7XG4gICAgc2F2ZVN0YXRlVG9Mb2NhbFN0b3JhZ2UoKTtcbiAgICBfcGhhc2VDaGFuZ2VMaXN0ZW5lcnMuZm9yRWFjaChmbiA9PiB7IHRyeSB7IGZuKHBoYXNlKTsgfSBjYXRjaCAoZSkgeyAvKiBpZ25vcmUgKi8gfSB9KTtcbiAgfSxcbiAgb25QaGFzZUNoYW5nZTogKGZuKSA9PiB7IGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIF9waGFzZUNoYW5nZUxpc3RlbmVycy5wdXNoKGZuKTsgfSxcbiAgZ2V0V29ya2Zsb3dTdGVwOiAoKSA9PiBnZXRXb3JrZmxvd1N0ZXBGb3JQaGFzZShsYXN0S25vd25QaGFzZSksXG5cbiAgLy8gUG9zdC1hbmFseXNpcyBxdWVzdGlvbnNcbiAgZ2V0UG9zdEFuYWx5c2lzUXVlc3Rpb25zOiAoKSA9PiB3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zIHx8IFtdLFxuICBzZXRQb3N0QW5hbHlzaXNRdWVzdGlvbnM6IChxdWVzdGlvbnMpID0+IHsgd2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucyA9IHF1ZXN0aW9uczsgfSxcblxuICAvLyBRdWVzdGlvbiBhbnN3ZXJzXG4gIGdldFF1ZXN0aW9uQW5zd2VyczogKCkgPT4gd2luZG93LnF1ZXN0aW9uQW5zd2VycyB8fCB7fSxcbiAgc2V0UXVlc3Rpb25BbnN3ZXJzOiAoYW5zd2VycykgPT4geyB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzID0gYW5zd2VyczsgfSxcblxuICAvLyBQZW5kaW5nIHJlY29tbWVuZGF0aW9uc1xuICBnZXRQZW5kaW5nUmVjb21tZW5kYXRpb25zOiAoKSA9PiB3aW5kb3cucGVuZGluZ1JlY29tbWVuZGF0aW9ucyB8fCBudWxsLFxuICBzZXRQZW5kaW5nUmVjb21tZW5kYXRpb25zOiAocmVjKSA9PiB7IHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zID0gcmVjOyBzYXZlU3RhdGVUb0xvY2FsU3RvcmFnZSgpOyB9LFxuXG4gIC8vIEFUUyBzY29yZSBzdGF0ZSAoR0FQLTIxKVxuICBnZXRBdHNTY29yZTogKCkgPT4gYXRzU2NvcmUsXG4gIHNldEF0c1Njb3JlOiAoc2NvcmUpID0+IHsgYXRzU2NvcmUgPSBzY29yZTsgc2F2ZVN0YXRlVG9Mb2NhbFN0b3JhZ2UoKTsgfSxcbiAgY2xlYXJBdHNTY29yZTogKCkgPT4geyBhdHNTY29yZSA9IG51bGw7IHNhdmVTdGF0ZVRvTG9jYWxTdG9yYWdlKCk7IH0sXG5cbiAgLy8gU3RhZ2VkIGdlbmVyYXRpb24gc3RhdGUgKEdBUC0yMClcbiAgZ2V0R2VuZXJhdGlvblN0YXRlOiAoKSA9PiBnZW5lcmF0aW9uU3RhdGUsXG4gIGdldExheW91dEZyZXNobmVzczogKCkgPT4gZ2V0TGF5b3V0RnJlc2huZXNzRnJvbVN0YXRlKGdlbmVyYXRpb25TdGF0ZSksXG4gIHNldEdlbmVyYXRpb25TdGF0ZTogKHVwZGF0ZSkgPT4ge1xuICAgIGdlbmVyYXRpb25TdGF0ZSA9IHsgLi4uZ2VuZXJhdGlvblN0YXRlLCAuLi51cGRhdGUgfTtcbiAgICBzYXZlU3RhdGVUb0xvY2FsU3RvcmFnZSgpO1xuICAgIGVtaXRHZW5lcmF0aW9uU3RhdGVDaGFuZ2VkKCk7XG4gIH0sXG4gIG1hcmtDb250ZW50Q2hhbmdlZDogKCkgPT4ge1xuICAgIGdlbmVyYXRpb25TdGF0ZSA9IHtcbiAgICAgIC4uLmdlbmVyYXRpb25TdGF0ZSxcbiAgICAgIGNvbnRlbnRSZXZpc2lvbjogKG5vcm1hbGl6ZVJldmlzaW9uKGdlbmVyYXRpb25TdGF0ZS5jb250ZW50UmV2aXNpb24pID8/IDApICsgMSxcbiAgICB9O1xuICAgIHNhdmVTdGF0ZVRvTG9jYWxTdG9yYWdlKCk7XG4gICAgZW1pdEdlbmVyYXRpb25TdGF0ZUNoYW5nZWQoKTtcbiAgfSxcbiAgbWFya1ByZXZpZXdHZW5lcmF0ZWQ6ICh1cGRhdGUgPSB7fSkgPT4ge1xuICAgIGNvbnN0IGNvbnRlbnRSZXZpc2lvbiA9IG5vcm1hbGl6ZVJldmlzaW9uKGdlbmVyYXRpb25TdGF0ZS5jb250ZW50UmV2aXNpb24pID8/IDA7XG4gICAgZ2VuZXJhdGlvblN0YXRlID0ge1xuICAgICAgLi4uZ2VuZXJhdGlvblN0YXRlLFxuICAgICAgLi4udXBkYXRlLFxuICAgICAgcGhhc2U6IEdFTkVSQVRJT05fUEhBU0VTLkxBWU9VVF9SRVZJRVcsXG4gICAgICBwcmV2aWV3QXZhaWxhYmxlOiB0cnVlLFxuICAgICAgbGF5b3V0Q29uZmlybWVkOiBmYWxzZSxcbiAgICAgIGxhc3RQcmV2aWV3Q29udGVudFJldmlzaW9uOiBjb250ZW50UmV2aXNpb24sXG4gICAgfTtcbiAgICBzYXZlU3RhdGVUb0xvY2FsU3RvcmFnZSgpO1xuICAgIGVtaXRHZW5lcmF0aW9uU3RhdGVDaGFuZ2VkKCk7XG4gIH0sXG4gIG1hcmtMYXlvdXRDb25maXJtZWQ6ICh1cGRhdGUgPSB7fSkgPT4ge1xuICAgIGdlbmVyYXRpb25TdGF0ZSA9IHtcbiAgICAgIC4uLmdlbmVyYXRpb25TdGF0ZSxcbiAgICAgIC4uLnVwZGF0ZSxcbiAgICAgIHBoYXNlOiBHRU5FUkFUSU9OX1BIQVNFUy5DT05GSVJNRUQsXG4gICAgICBsYXlvdXRDb25maXJtZWQ6IHRydWUsXG4gICAgfTtcbiAgICBzYXZlU3RhdGVUb0xvY2FsU3RvcmFnZSgpO1xuICAgIGVtaXRHZW5lcmF0aW9uU3RhdGVDaGFuZ2VkKCk7XG4gIH0sXG4gIG1hcmtGaW5hbEdlbmVyYXRlZDogKGdlbmVyYXRlZEF0ID0gbnVsbCwgdXBkYXRlID0ge30pID0+IHtcbiAgICBjb25zdCBjb250ZW50UmV2aXNpb24gPSBub3JtYWxpemVSZXZpc2lvbihnZW5lcmF0aW9uU3RhdGUuY29udGVudFJldmlzaW9uKSA/PyAwO1xuICAgIGdlbmVyYXRpb25TdGF0ZSA9IHtcbiAgICAgIC4uLmdlbmVyYXRpb25TdGF0ZSxcbiAgICAgIC4uLnVwZGF0ZSxcbiAgICAgIHBoYXNlOiBHRU5FUkFUSU9OX1BIQVNFUy5GSU5BTF9DT01QTEVURSxcbiAgICAgIGxheW91dENvbmZpcm1lZDogdHJ1ZSxcbiAgICAgIGZpbmFsR2VuZXJhdGVkQXQ6IGdlbmVyYXRlZEF0IHx8IHVwZGF0ZS5maW5hbEdlbmVyYXRlZEF0IHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIGxhc3RGaW5hbENvbnRlbnRSZXZpc2lvbjogY29udGVudFJldmlzaW9uLFxuICAgIH07XG4gICAgc2F2ZVN0YXRlVG9Mb2NhbFN0b3JhZ2UoKTtcbiAgICBlbWl0R2VuZXJhdGlvblN0YXRlQ2hhbmdlZCgpO1xuICB9LFxuICByZXNldEdlbmVyYXRpb25TdGF0ZTogKCkgPT4ge1xuICAgIGdlbmVyYXRpb25TdGF0ZSA9IGNyZWF0ZURlZmF1bHRHZW5lcmF0aW9uU3RhdGUoKTtcbiAgICBzYXZlU3RhdGVUb0xvY2FsU3RvcmFnZSgpO1xuICAgIGVtaXRHZW5lcmF0aW9uU3RhdGVDaGFuZ2VkKCk7XG4gIH0sXG4gIHNldERpcnR5UGhhc2VzOiAocGhhc2VzLCBlYXJsaWVzdFN0ZXApID0+IHtcbiAgICBnZW5lcmF0aW9uU3RhdGUgPSB7XG4gICAgICAuLi5nZW5lcmF0aW9uU3RhdGUsXG4gICAgICBkaXJ0eVBoYXNlczogICAgICAgQXJyYXkuaXNBcnJheShwaGFzZXMpID8gcGhhc2VzIDogW10sXG4gICAgICBlYXJsaWVzdERpcnR5U3RlcDogZWFybGllc3RTdGVwIHx8IG51bGwsXG4gICAgfTtcbiAgICBzYXZlU3RhdGVUb0xvY2FsU3RvcmFnZSgpO1xuICAgIGVtaXRHZW5lcmF0aW9uU3RhdGVDaGFuZ2VkKCk7XG4gIH0sXG4gIGNsZWFyRGlydHlQaGFzZXM6ICgpID0+IHtcbiAgICBnZW5lcmF0aW9uU3RhdGUgPSB7XG4gICAgICAuLi5nZW5lcmF0aW9uU3RhdGUsXG4gICAgICBkaXJ0eVBoYXNlczogICAgICAgW10sXG4gICAgICBlYXJsaWVzdERpcnR5U3RlcDogbnVsbCxcbiAgICB9O1xuICAgIHNhdmVTdGF0ZVRvTG9jYWxTdG9yYWdlKCk7XG4gICAgZW1pdEdlbmVyYXRpb25TdGF0ZUNoYW5nZWQoKTtcbiAgfSxcbiAgZ2V0RGlydHlQaGFzZXM6ICAgICAgICgpID0+IGdlbmVyYXRpb25TdGF0ZS5kaXJ0eVBoYXNlcyB8fCBbXSxcbiAgZ2V0RWFybGllc3REaXJ0eVN0ZXA6ICgpID0+IGdlbmVyYXRpb25TdGF0ZS5lYXJsaWVzdERpcnR5U3RlcCB8fCBudWxsLFxufTtcblxuLyoqXG4gKiBJbml0aWFsaXplIGZyZXNoIHN0YXRlIG9iamVjdCB3aXRoIGFsbCBkZWZhdWx0IHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gaW5pdGlhbGl6ZVN0YXRlKCkge1xuICBjdXJyZW50VGFiID0gJ2pvYic7XG4gIGlzTG9hZGluZyA9IGZhbHNlO1xuICB0YWJEYXRhID0ge1xuICAgIGFuYWx5c2lzOiBudWxsLFxuICAgIGN1c3RvbWl6YXRpb25zOiBudWxsLFxuICAgIGN2OiBudWxsXG4gIH07XG4gIGludGVyYWN0aXZlU3RhdGUgPSB7XG4gICAgaXNSZXZpZXdpbmc6IGZhbHNlLFxuICAgIGN1cnJlbnRJbmRleDogMCxcbiAgICB0eXBlOiBudWxsLFxuICAgIGRhdGE6IG51bGxcbiAgfTtcbiAgd2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucyA9IFtdO1xuICB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzID0ge307XG4gIGxhc3RLbm93blBoYXNlID0gUEhBU0VTLklOSVQ7XG4gIGdlbmVyYXRpb25TdGF0ZSA9IGNyZWF0ZURlZmF1bHRHZW5lcmF0aW9uU3RhdGUoKTtcblxuICAvLyBHZXQgb3IgZ2VuZXJhdGUgc2Vzc2lvbiBJRFxuICBsZXQgc3RvcmVkSWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShTdG9yYWdlS2V5cy5TRVNTSU9OX0lEKTtcbiAgaWYgKCFzdG9yZWRJZCkge1xuICAgIHN0b3JlZElkID0gZ2VuZXJhdGVTZXNzaW9uSWQoKTtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShTdG9yYWdlS2V5cy5TRVNTSU9OX0lELCBzdG9yZWRJZCk7XG4gIH1cbiAgc2Vzc2lvbklkID0gc3RvcmVkSWQ7XG5cbiAgc2F2ZVN0YXRlVG9Mb2NhbFN0b3JhZ2UoKTtcbiAgZW1pdEdlbmVyYXRpb25TdGF0ZUNoYW5nZWQoKTtcbn1cblxuLyoqXG4gKiBMb2FkIHN0YXRlIGZyb20gYnJvd3NlciBsb2NhbFN0b3JhZ2UuXG4gKi9cbmZ1bmN0aW9uIGxvYWRTdGF0ZUZyb21Mb2NhbFN0b3JhZ2UoKSB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2F2ZWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShTdG9yYWdlS2V5cy5UQUJfREFUQSk7XG4gICAgaWYgKCFzYXZlZCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2Uoc2F2ZWQpO1xuXG4gICAgLy8gT25seSByZXN0b3JlIGlmIGRhdGEgaXMgcmVjZW50ICh3aXRoaW4gMjQgaG91cnMpXG4gICAgY29uc3QgYWdlID0gRGF0ZS5ub3coKSAtIChkYXRhLnRpbWVzdGFtcCB8fCAwKTtcbiAgICBpZiAoYWdlID4gMjQgKiA2MCAqIDYwICogMTAwMCkge1xuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oU3RvcmFnZUtleXMuVEFCX0RBVEEpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFJlc3RvcmUgdGFiIGRhdGFcbiAgICBpZiAoZGF0YS50YWJEYXRhKSB7XG4gICAgICB0YWJEYXRhID0geyAuLi50YWJEYXRhLCAuLi5kYXRhLnRhYkRhdGEgfTtcbiAgICB9XG5cbiAgICBpZiAoZGF0YS5jdXJyZW50VGFiKSB7XG4gICAgICBjdXJyZW50VGFiID0gZGF0YS5jdXJyZW50VGFiO1xuICAgIH1cblxuICAgIC8vIFJlc3RvcmUgaW50ZXJhY3RpdmUgc3RhdGVcbiAgICBpZiAoZGF0YS5pbnRlcmFjdGl2ZVN0YXRlKSB7XG4gICAgICBpbnRlcmFjdGl2ZVN0YXRlID0geyAuLi5pbnRlcmFjdGl2ZVN0YXRlLCAuLi5kYXRhLmludGVyYWN0aXZlU3RhdGUgfTtcbiAgICB9XG5cbiAgICAvLyBSZXN0b3JlIHBlbmRpbmcgcmVjb21tZW5kYXRpb25zXG4gICAgaWYgKGRhdGEucGVuZGluZ1JlY29tbWVuZGF0aW9ucykge1xuICAgICAgd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnMgPSBkYXRhLnBlbmRpbmdSZWNvbW1lbmRhdGlvbnM7XG4gICAgfVxuXG4gICAgLy8gUmVzdG9yZSBzYXZlZCBtb2RlbC9wcm92aWRlciBzZWxlY3Rpb25cbiAgICBpZiAoZGF0YS5jdXJyZW50TW9kZWxQcm92aWRlcikge1xuICAgICAgY3VycmVudE1vZGVsUHJvdmlkZXIgPSBkYXRhLmN1cnJlbnRNb2RlbFByb3ZpZGVyO1xuICAgIH1cbiAgICBpZiAoZGF0YS5jdXJyZW50TW9kZWxOYW1lKSB7XG4gICAgICBjdXJyZW50TW9kZWxOYW1lID0gZGF0YS5jdXJyZW50TW9kZWxOYW1lO1xuICAgIH1cblxuICAgIC8vIFJlc3RvcmUgcG9zdC1hbmFseXNpcyBzdGF0ZVxuICAgIGlmIChkYXRhLnBvc3RBbmFseXNpc1F1ZXN0aW9ucykge1xuICAgICAgd2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucyA9IGRhdGEucG9zdEFuYWx5c2lzUXVlc3Rpb25zO1xuICAgIH1cbiAgICBpZiAoZGF0YS5xdWVzdGlvbkFuc3dlcnMpIHtcbiAgICAgIHdpbmRvdy5xdWVzdGlvbkFuc3dlcnMgPSBkYXRhLnF1ZXN0aW9uQW5zd2VycztcbiAgICB9XG5cbiAgICAvLyBSZXN0b3JlIHBoYXNlXG4gICAgaWYgKGRhdGEubGFzdEtub3duUGhhc2UpIHtcbiAgICAgIGxhc3RLbm93blBoYXNlID0gZGF0YS5sYXN0S25vd25QaGFzZTtcbiAgICB9XG5cbiAgICAvLyBSZXN0b3JlIHN0YWdlZCBnZW5lcmF0aW9uIHN0YXRlXG4gICAgaWYgKGRhdGEuZ2VuZXJhdGlvblN0YXRlKSB7XG4gICAgICBnZW5lcmF0aW9uU3RhdGUgPSB7IC4uLmdlbmVyYXRpb25TdGF0ZSwgLi4uZGF0YS5nZW5lcmF0aW9uU3RhdGUgfTtcbiAgICB9XG5cbiAgICAvLyBSZXN0b3JlIEFUUyBzY29yZVxuICAgIGlmIChkYXRhLmF0c1Njb3JlKSB7XG4gICAgICBhdHNTY29yZSA9IGRhdGEuYXRzU2NvcmU7XG4gICAgfVxuXG4gICAgZW1pdEdlbmVyYXRpb25TdGF0ZUNoYW5nZWQoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cud2FybignRmFpbGVkIHRvIGxvYWQgc3RhdGUgZnJvbSBsb2NhbFN0b3JhZ2U6JywgZXJyb3IpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFNhdmUgY3VycmVudCBzdGF0ZSB0byBicm93c2VyIGxvY2FsU3RvcmFnZS5cbiAqL1xuZnVuY3Rpb24gc2F2ZVN0YXRlVG9Mb2NhbFN0b3JhZ2UoKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgZGF0YVRvU2F2ZSA9IHtcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIHRhYkRhdGEsXG4gICAgICBpbnRlcmFjdGl2ZVN0YXRlLFxuICAgICAgcGVuZGluZ1JlY29tbWVuZGF0aW9uczogd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnMsXG4gICAgICBwb3N0QW5hbHlzaXNRdWVzdGlvbnM6IHdpbmRvdy5wb3N0QW5hbHlzaXNRdWVzdGlvbnMsXG4gICAgICBxdWVzdGlvbkFuc3dlcnM6IHdpbmRvdy5xdWVzdGlvbkFuc3dlcnMsXG4gICAgICBsYXN0S25vd25QaGFzZSxcbiAgICAgIGN1cnJlbnRUYWIsXG4gICAgICAvLyBQZXJzaXN0IGxhc3Qtc2VsZWN0ZWQgbW9kZWwvcHJvdmlkZXIgc28gVUkgc2VsZWN0aW9ucyBzdXJ2aXZlIHJlbG9hZHNcbiAgICAgIGN1cnJlbnRNb2RlbFByb3ZpZGVyLFxuICAgICAgY3VycmVudE1vZGVsTmFtZSxcbiAgICAgIGdlbmVyYXRpb25TdGF0ZSxcbiAgICAgIGF0c1Njb3JlLFxuICAgIH07XG5cbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShTdG9yYWdlS2V5cy5UQUJfREFUQSwgSlNPTi5zdHJpbmdpZnkoZGF0YVRvU2F2ZSkpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy53YXJuKCdGYWlsZWQgdG8gc2F2ZSBzdGF0ZSB0byBsb2NhbFN0b3JhZ2U6JywgZXJyb3IpO1xuICB9XG59XG5cbi8qKlxuICogQ2xlYXIgYWxsIHN0YXRlIChvbiBuZXcgc2Vzc2lvbiBvciByZXNldCBhY3Rpb24pLlxuICovXG5mdW5jdGlvbiBjbGVhclN0YXRlKCkge1xuICBpbml0aWFsaXplU3RhdGUoKTtcbiAgT2JqZWN0LnZhbHVlcyhTdG9yYWdlS2V5cykuZm9yRWFjaChrZXkgPT4gbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KSk7XG59XG5cbi8vIFRoZSBhdXRob3JpdGF0aXZlIHJlc3RvcmVTZXNzaW9uL3Jlc3RvcmVCYWNrZW5kU3RhdGUvbG9hZFNlc3Npb25GaWxlXG4vLyBpbXBsZW1lbnRhdGlvbnMgbGl2ZSBpbiBgd2ViL2FwcC5qc2AuIFJlbW92ZSBkdXBsaWNhdGUgaW1wbGVtZW50YXRpb25zXG4vLyBmcm9tIHRoaXMgbW9kdWxlIHRvIGF2b2lkIGNvbmZsaWN0aW5nIGJlaGF2aW9yIGFuZCBlbnN1cmUgYSBzaW5nbGVcbi8vIHJlc3RvcmUgcGF0aCBpcyB1c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbi5cblxuZXhwb3J0IHtcbiAgUEhBU0VTLFxuICBQSEFTRV9UT19TVEVQLFxuICBHRU5FUkFUSU9OX1BIQVNFUyxcbiAgR0VORVJBVElPTl9TVEFURV9FVkVOVCxcbiAgc3RhdGVNYW5hZ2VyLFxuICBnZXRXb3JrZmxvd1N0ZXBGb3JQaGFzZSxcbiAgaW5pdGlhbGl6ZVN0YXRlLCBsb2FkU3RhdGVGcm9tTG9jYWxTdG9yYWdlLCBzYXZlU3RhdGVUb0xvY2FsU3RvcmFnZSxcbiAgY2xlYXJTdGF0ZSxcbn07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9wcm92aWRlci1pbmZvLmpzIFx1MjAxNCBMTE0gcHJvdmlkZXIgZGlzcGxheSBtZXRhZGF0YSBjbGllbnQuXG4gKlxuICogUHJvdmlkZXIgZGF0YSBpcyBub3cgdGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggaW4gc2NyaXB0cy91dGlscy9wcm92aWRlcl9yZWdpc3RyeS5weVxuICogYW5kIHNlcnZlZCBieSBHRVQgL2FwaS9wcm92aWRlcnMuIFRoaXMgbW9kdWxlIGZldGNoZXMgYW5kIGNhY2hlcyB0aGF0IGRhdGEuXG4gKlxuICogQWxsIHByb3ZpZGVyIGRlc2NyaXB0aW9ucywgVVJMcywgYW5kIHRpZXIvcHJpdmFjeSBmbGFncyBzaG91bGQgYmUgZWRpdGVkIGluXG4gKiBwcm92aWRlcl9yZWdpc3RyeS5weSByYXRoZXIgdGhhbiBoZXJlLlxuICpcbiAqIFNlcnZlciBmaWVsZCBuYW1lcyAoc25ha2VfY2FzZSwgbWF0Y2hpbmcgUHl0aG9uKTpcbiAqICAgZnJlZV90aWVyICAgXHUyMDE0IHdoZXRoZXIgYSBuby1jb3N0IEFQSSBlbnRyeSB0aWVyIGlzIGF2YWlsYWJsZVxuICogICBjb25maWRlbnRpYWwgXHUyMDE0IHdoZXRoZXIgdGhlIHByb3ZpZGVyIGNvbW1pdHMgbm90IHRvIHRyYWluIG9uIEFQSSByZXF1ZXN0IGRhdGFcbiAqICAgbm90ZSAgICAgICAgXHUyMDE0IG9uZS1zZW50ZW5jZSBwbGFpbi10ZXh0IGRlc2NyaXB0aW9uXG4gKiAgIGhvbWVwYWdlICAgIFx1MjAxNCBwcm92aWRlciBsYW5kaW5nIHBhZ2UgVVJMIChudWxsIGlmIG5vdCBhcHBsaWNhYmxlKVxuICogICBwcmljaW5nX3VybCBcdTIwMTQgcHJpY2luZyAvIHBsYW5zIHBhZ2UgVVJMIChudWxsIGlmIG5vdCBhcHBsaWNhYmxlKVxuICogICBwcml2YWN5X3VybCBcdTIwMTQgcHJpdmFjeSBwb2xpY3kgb3IgZGF0YS11c2UgcG9saWN5IFVSTCAobnVsbCBpZiBub3QgYXBwbGljYWJsZSlcbiAqL1xuXG5pbXBvcnQgeyBlc2NhcGVIdG1sIH0gZnJvbSAnLi91dGlscy5qcyc7XG5cbi8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgb2JqZWN0PnxudWxsfSAqL1xubGV0IF9jYWNoZSA9IG51bGw7XG5cbi8qKlxuICogRmV0Y2ggcHJvdmlkZXIgZGlzcGxheSBtZXRhZGF0YSBmcm9tIHRoZSBzZXJ2ZXIgYW5kIGNhY2hlIGl0LlxuICogU2FmZSB0byBjYWxsIG11bHRpcGxlIHRpbWVzIFx1MjAxNCByZXR1cm5zIHRoZSBjYWNoZSBpZiBwb3B1bGF0ZWQsIHJldHJpZXMgaWZcbiAqIHRoZSBpbml0aWFsIGZldGNoIGZhaWxlZCAobm9uLWZhdGFsLCBwb3BvdmVycyB3aWxsIGp1c3Qgbm90IGFwcGVhcikuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBvYmplY3Q+fG51bGw+fVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFByb3ZpZGVySW5mbygpIHtcbiAgaWYgKF9jYWNoZSAhPT0gbnVsbCkgcmV0dXJuIF9jYWNoZTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2goJy9hcGkvcHJvdmlkZXJzJyk7XG4gICAgaWYgKHJlc3Aub2spIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwLmpzb24oKTtcbiAgICAgIF9jYWNoZSA9IGRhdGEucHJvdmlkZXJzIHx8IHt9O1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gTm9uLWZhdGFsOiBwb3BvdmVycyBzaW1wbHkgd29uJ3QgYXBwZWFyLlxuICB9XG4gIHJldHVybiBfY2FjaGU7XG59XG5cbi8qKlxuICogUmV0dXJuIGNhY2hlZCBkaXNwbGF5IGluZm8gZm9yIGEgcHJvdmlkZXIsIG9yIG51bGwgaWYgbm90IGxvYWRlZCAvIHVua25vd24uXG4gKiBDYWxsIGxvYWRQcm92aWRlckluZm8oKSBmaXJzdCAoZS5nLiBpbiBvcGVuTW9kZWxNb2RhbCkuXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvdmlkZXJcbiAqIEByZXR1cm5zIHtvYmplY3R8bnVsbH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFByb3ZpZGVySW5mbyhwcm92aWRlcikge1xuICByZXR1cm4gX2NhY2hlID8gKF9jYWNoZVtwcm92aWRlcl0gfHwgbnVsbCkgOiBudWxsO1xufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBIVE1MIGNvbnRlbnQgc3RyaW5nIGZvciBhIHByb3ZpZGVyIGluZm8gQm9vdHN0cmFwIDUgcG9wb3Zlci5cbiAqIFVzZXMgc25ha2VfY2FzZSBmaWVsZCBuYW1lcyBhcyByZXR1cm5lZCBieSBHRVQgL2FwaS9wcm92aWRlcnMuXG4gKiBAcGFyYW0ge29iamVjdH0gaW5mbyAtIFByb3ZpZGVyIGluZm8gZW50cnkgZnJvbSBnZXRQcm92aWRlckluZm8oKVxuICogQHJldHVybnMge3N0cmluZ30gSFRNTCBzdHJpbmcgKHNhZmUgdG8gcGFzcyB0byBCUzUgUG9wb3ZlciB3aXRoIHNhbml0aXplOmZhbHNlKVxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZXJJbmZvUG9wb3ZlckNvbnRlbnQoaW5mbykge1xuICBjb25zdCB0aWVySWNvbiAgPSBpbmZvLmZyZWVfdGllciAgICA/ICcmIzEwMDAzOyBGcmVlIHRpZXIgYXZhaWxhYmxlJyAgICA6ICcmIzEwMDA3OyBQYWlkIG9ubHkgKG5vIGZyZWUgQVBJIHRpZXIpJztcbiAgY29uc3QgcHJpdkljb24gID0gaW5mby5jb25maWRlbnRpYWwgPyAnJiMxMjgyNzQ7IERhdGEgY29uZmlkZW50aWFsJyAgICAgOiAnJiM5ODg4OyYjNjUwMzk7IERhdGEgbWF5IGJlIHJldmlld2VkL3JldGFpbmVkJztcbiAgY29uc3QgdGllckNvbG9yID0gaW5mby5mcmVlX3RpZXIgICAgPyAnIzA2NWY0NicgOiAnIzkyNDAwZSc7XG4gIGNvbnN0IHByaXZDb2xvciA9IGluZm8uY29uZmlkZW50aWFsID8gJyMxZTQwYWYnIDogJyM5MjQwMGUnO1xuXG4gIGNvbnN0IGxpbmtzID0gW1xuICAgIGluZm8uaG9tZXBhZ2UgICAgPyBgPGEgaHJlZj1cIiR7ZXNjYXBlSHRtbChpbmZvLmhvbWVwYWdlKX1cIiAgICB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCI+SG9tZXBhZ2U8L2E+YCAgICAgICAgICAgOiAnJyxcbiAgICBpbmZvLnByaWNpbmdfdXJsID8gYDxhIGhyZWY9XCIke2VzY2FwZUh0bWwoaW5mby5wcmljaW5nX3VybCl9XCIgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiPlByaWNpbmcgJmFtcDsgcGxhbnM8L2E+YCA6ICcnLFxuICAgIGluZm8ucHJpdmFjeV91cmwgPyBgPGEgaHJlZj1cIiR7ZXNjYXBlSHRtbChpbmZvLnByaXZhY3lfdXJsKX1cIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCI+UHJpdmFjeSBwb2xpY3k8L2E+YCAgICAgIDogJycsXG4gIF0uZmlsdGVyKEJvb2xlYW4pO1xuXG4gIHJldHVybiAnPGRpdiBzdHlsZT1cIm1pbi13aWR0aDoyMjBweDttYXgtd2lkdGg6MzAwcHg7Zm9udC1zaXplOjAuODJlbTtsaW5lLWhlaWdodDoxLjU7XCI+J1xuICAgICsgYDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjZweDtcIj48c3BhbiBzdHlsZT1cImNvbG9yOiR7dGllckNvbG9yfTtcIj4ke3RpZXJJY29ufTwvc3Bhbj48L2Rpdj5gXG4gICAgKyBgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206OHB4O1wiPjxzcGFuIHN0eWxlPVwiY29sb3I6JHtwcml2Q29sb3J9O1wiPiR7cHJpdkljb259PC9zcGFuPjwvZGl2PmBcbiAgICArIGA8cCBzdHlsZT1cIm1hcmdpbjowIDAgOHB4O2NvbG9yOiMzNzQxNTE7XCI+JHtlc2NhcGVIdG1sKGluZm8ubm90ZSl9PC9wPmBcbiAgICArIChsaW5rcy5sZW5ndGggPyAnPHVsIHN0eWxlPVwibWFyZ2luOjA7cGFkZGluZy1sZWZ0OjE2cHg7XCI+JyArIGxpbmtzLm1hcChsID0+IGA8bGk+JHtsfTwvbGk+YCkuam9pbignJykgKyAnPC91bD4nIDogJycpXG4gICAgKyAnPC9kaXY+Jztcbn1cbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogdWktY29yZS5qc1xuICogQ29yZSBVSSByb3V0aW5nLCB0YWIgbWFuYWdlbWVudCwgbW9kYWwgbWFuYWdlbWVudCwgYW5kIHBhZ2UgaW5pdGlhbGl6YXRpb24uXG4gKiBFbnRyeSBwb2ludCBmb3IgdGhlIGFwcGxpY2F0aW9uIC0gbG9hZHMgb24gRE9NQ29udGVudExvYWRlZC5cbiAqL1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5jb25zdCBsb2cgPSBnZXRMb2dnZXIoJ3VpLWNvcmUnKTtcblxuaW1wb3J0IHsgZXNjYXBlSHRtbCB9IGZyb20gJy4vdXRpbHMuanMnO1xuaW1wb3J0IHsgU3RvcmFnZUtleXMsIGFwaUNhbGwsIGZldGNoU3RhdHVzLCBmZXRjaFNldHRpbmdzLCB1cGRhdGVTZXR0aW5ncyB9IGZyb20gJy4vYXBpLWNsaWVudC5qcyc7XG5pbXBvcnQge1xuICBnZXRXb3JrZmxvd1N0ZXBGb3JQaGFzZSxcbiAgaW5pdGlhbGl6ZVN0YXRlLFxuICBsb2FkU3RhdGVGcm9tTG9jYWxTdG9yYWdlLFxuICBzdGF0ZU1hbmFnZXIsXG59IGZyb20gJy4vc3RhdGUtbWFuYWdlci5qcyc7XG5pbXBvcnQgeyBfU1RFUF9ESVNQTEFZIH0gZnJvbSAnLi93b3JrZmxvdy1zdGVwcy5qcyc7XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuLy8gQWNjZXNzaWJpbGl0eTogRm9jdXMgTWFuYWdlbWVudCBmb3IgTW9kYWxzXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLyoqIFN0YWNrIG9mIGVsZW1lbnRzIHRoYXQgb3BlbmVkIGVhY2ggbW9kYWwgKHN1cHBvcnRzIG5lc3RlZCBtb2RhbHMpLiAqL1xuY29uc3QgX2ZvY3VzU3RhY2sgPSBbXTtcblxuLyoqIFN0YWNrIG9mIGZvY3VzLXRyYXAgbGlzdGVuZXJzIChvbmUgcGVyIG9wZW4gbW9kYWwpLiAqL1xuY29uc3QgX2ZvY3VzVHJhcFN0YWNrID0gW107XG5sZXQgX3NldHRpbmdzRGF0YSA9IG51bGw7XG5jb25zdCBSRVRSWV9QT0xJQ1lfU1RPUkFHRV9LRVkgPSAnY3YtYnVpbGRlci1yZXRyeS1wb2xpY3knO1xuXG5mdW5jdGlvbiBfZ2V0UmV0cnlQb2xpY3lGcm9tU3RvcmFnZSgpIHtcbiAgY29uc3QgZGVmYXVsdHMgPSB7XG4gICAgYmFzZU1zOiAxNTAwLFxuICAgIGNhcE1zOiA2MDAwMCxcbiAgICBtYXhBdHRlbXB0czogNixcbiAgICBhdXRvUmV0cnk6IHRydWUsXG4gIH07XG4gIHRyeSB7XG4gICAgY29uc3QgcmF3ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oUkVUUllfUE9MSUNZX1NUT1JBR0VfS0VZKTtcbiAgICBpZiAoIXJhdykgcmV0dXJuIGRlZmF1bHRzO1xuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UocmF3KTtcbiAgICByZXR1cm4ge1xuICAgICAgYmFzZU1zOiBNYXRoLm1heCgyMDAsIE51bWJlcihwYXJzZWQuYmFzZU1zIHx8IGRlZmF1bHRzLmJhc2VNcykpLFxuICAgICAgY2FwTXM6IE1hdGgubWF4KDEwMDAsIE51bWJlcihwYXJzZWQuY2FwTXMgfHwgZGVmYXVsdHMuY2FwTXMpKSxcbiAgICAgIG1heEF0dGVtcHRzOiBNYXRoLm1heCgxLCBOdW1iZXIocGFyc2VkLm1heEF0dGVtcHRzIHx8IGRlZmF1bHRzLm1heEF0dGVtcHRzKSksXG4gICAgICBhdXRvUmV0cnk6IHBhcnNlZC5hdXRvUmV0cnkgIT09IGZhbHNlLFxuICAgIH07XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBkZWZhdWx0cztcbiAgfVxufVxuXG5mdW5jdGlvbiBfc2F2ZVJldHJ5UG9saWN5VG9TdG9yYWdlKHBvbGljeSkge1xuICB0cnkge1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFJFVFJZX1BPTElDWV9TVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkocG9saWN5KSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nLndhcm4oJ0NvdWxkIG5vdCBzYXZlIHJldHJ5IHBvbGljeSBwcmVmZXJlbmNlOicsIGVycm9yKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfc2V0dGluZ3NTb3VyY2VMYWJlbChtZXRhLCBrZXksIHJ1bnRpbWVPdmVycmlkZXMgPSBudWxsKSB7XG4gIGlmIChydW50aW1lT3ZlcnJpZGVzICYmIGtleSBpbiBydW50aW1lT3ZlcnJpZGVzKSB7XG4gICAgcmV0dXJuICdTb3VyY2U6IHJ1bnRpbWUgc2VsZWN0aW9uJztcbiAgfVxuICBjb25zdCBzb3VyY2UgPSBtZXRhPy5zb3VyY2VzPy5ba2V5XSB8fCAnZGVmYXVsdCc7XG4gIGNvbnN0IGVudktleSA9IG1ldGE/LmVudl9rZXlzPy5ba2V5XSB8fCBudWxsO1xuICBpZiAoc291cmNlID09PSAnZW52JykgcmV0dXJuIGBTb3VyY2U6IGVudmlyb25tZW50IHZhcmlhYmxlICgke2VudktleSB8fCAnbG9ja2VkJ30pYDtcbiAgaWYgKHNvdXJjZSA9PT0gJ2RvdGVudicpIHJldHVybiBgU291cmNlOiAuZW52ICgke2VudktleSB8fCAnbG9ja2VkJ30pYDtcbiAgaWYgKHNvdXJjZSA9PT0gJ2NvbmZpZycpIHJldHVybiAnU291cmNlOiBjb25maWcueWFtbCc7XG4gIHJldHVybiAnU291cmNlOiBidWlsdC1pbiBkZWZhdWx0Jztcbn1cblxuZnVuY3Rpb24gX3JlbmRlclNldHRpbmdzU291cmNlcyhtZXRhLCBydW50aW1lT3ZlcnJpZGVzID0gbnVsbCkge1xuICBjb25zdCBzb3VyY2VUYXJnZXRzID0gW1xuICAgICdsbG0uZGVmYXVsdF9wcm92aWRlcicsXG4gICAgJ2xsbS5kZWZhdWx0X21vZGVsJyxcbiAgICAnbGxtLnJlcXVlc3RfdGltZW91dF9zZWNvbmRzJyxcbiAgICAnbGxtLnRlbXBlcmF0dXJlJyxcbiAgICAnZ2VuZXJhdGlvbi5tYXhfc2tpbGxzJyxcbiAgICAnZ2VuZXJhdGlvbi5tYXhfYWNoaWV2ZW1lbnRzJyxcbiAgICAnZ2VuZXJhdGlvbi5tYXhfcHVibGljYXRpb25zJyxcbiAgICAnZ2VuZXJhdGlvbi5za2lsbHNfc2VjdGlvbl90aXRsZScsXG4gICAgJ2dlbmVyYXRpb24uZm9ybWF0cy5hdHNfZG9jeCcsXG4gICAgJ2dlbmVyYXRpb24uZm9ybWF0cy5odW1hbl9wZGYnLFxuICAgICdnZW5lcmF0aW9uLmZvcm1hdHMuaHVtYW5fZG9jeCcsXG4gIF07XG4gIHNvdXJjZVRhcmdldHMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc291cmNlLSR7a2V5fWApO1xuICAgIGlmICghZWwpIHJldHVybjtcbiAgICBlbC50ZXh0Q29udGVudCA9IF9zZXR0aW5nc1NvdXJjZUxhYmVsKG1ldGEsIGtleSwgcnVudGltZU92ZXJyaWRlcyk7XG4gICAgY29uc3QgcnVudGltZUtleSA9IHJ1bnRpbWVPdmVycmlkZXMgJiYga2V5IGluIHJ1bnRpbWVPdmVycmlkZXM7XG4gICAgY29uc3QgaXNMb2NrZWQgPSBCb29sZWFuKG1ldGE/LmxvY2tlZD8uW2tleV0pO1xuICAgIGVsLnN0eWxlLmNvbG9yID0gcnVudGltZUtleSA/ICcjMWU0MGFmJyA6IChpc0xvY2tlZCA/ICcjYjQ1MzA5JyA6ICcjNjQ3NDhiJyk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBfc2V0U2V0dGluZ3NTdGF0dXMobWVzc2FnZSwga2luZCA9ICdpbmZvJykge1xuICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR0aW5ncy1zdGF0dXMtbXNnJyk7XG4gIGlmICghZWwpIHJldHVybjtcbiAgZWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuICBpZiAoa2luZCA9PT0gJ3N1Y2Nlc3MnKSB7XG4gICAgZWwuc3R5bGUuYmFja2dyb3VuZCA9ICcjZWNmZGY1JztcbiAgICBlbC5zdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkICM4NmVmYWMnO1xuICAgIGVsLnN0eWxlLmNvbG9yID0gJyMxNjY1MzQnO1xuICB9IGVsc2UgaWYgKGtpbmQgPT09ICdlcnJvcicpIHtcbiAgICBlbC5zdHlsZS5iYWNrZ3JvdW5kID0gJyNmZWYyZjInO1xuICAgIGVsLnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgI2ZlY2FjYSc7XG4gICAgZWwuc3R5bGUuY29sb3IgPSAnIzk5MWIxYic7XG4gIH0gZWxzZSB7XG4gICAgZWwuc3R5bGUuYmFja2dyb3VuZCA9ICcjZWZmNmZmJztcbiAgICBlbC5zdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkICNiZmRiZmUnO1xuICAgIGVsLnN0eWxlLmNvbG9yID0gJyMxZTQwYWYnO1xuICB9XG4gIGVsLnRleHRDb250ZW50ID0gbWVzc2FnZTtcbn1cblxuZnVuY3Rpb24gX2NvbGxlY3RTZXR0aW5nc1BheWxvYWRGcm9tRm9ybSgpIHtcbiAgcmV0dXJuIHtcbiAgICBsbG06IHtcbiAgICAgIGRlZmF1bHRfcHJvdmlkZXI6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR0aW5ncy1sbG0tZGVmYXVsdC1wcm92aWRlcicpPy52YWx1ZT8udHJpbSgpIHx8IG51bGwsXG4gICAgICBkZWZhdWx0X21vZGVsOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dGluZ3MtbGxtLWRlZmF1bHQtbW9kZWwnKT8udmFsdWU/LnRyaW0oKSB8fCBudWxsLFxuICAgICAgcmVxdWVzdF90aW1lb3V0X3NlY29uZHM6IE51bWJlcihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dGluZ3MtbGxtLXJlcXVlc3QtdGltZW91dCcpPy52YWx1ZSB8fCAxMjApLFxuICAgICAgdGVtcGVyYXR1cmU6IE51bWJlcihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dGluZ3MtbGxtLXRlbXBlcmF0dXJlJyk/LnZhbHVlIHx8IDAuNyksXG4gICAgfSxcbiAgICBnZW5lcmF0aW9uOiB7XG4gICAgICBtYXhfc2tpbGxzOiBOdW1iZXIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHRpbmdzLWdlbi1tYXgtc2tpbGxzJyk/LnZhbHVlIHx8IDIwKSxcbiAgICAgIG1heF9hY2hpZXZlbWVudHM6IE51bWJlcihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dGluZ3MtZ2VuLW1heC1hY2hpZXZlbWVudHMnKT8udmFsdWUgfHwgNSksXG4gICAgICBtYXhfcHVibGljYXRpb25zOiBOdW1iZXIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHRpbmdzLWdlbi1tYXgtcHVibGljYXRpb25zJyk/LnZhbHVlIHx8IDEwKSxcbiAgICAgIHNraWxsc19zZWN0aW9uX3RpdGxlOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dGluZ3MtZ2VuLXNraWxscy10aXRsZScpPy52YWx1ZT8udHJpbSgpIHx8ICdTa2lsbHMnLFxuICAgICAgZm9ybWF0czoge1xuICAgICAgICBhdHNfZG9jeDogQm9vbGVhbihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dGluZ3MtZm9ybWF0LWF0cy1kb2N4Jyk/LmNoZWNrZWQpLFxuICAgICAgICBodW1hbl9wZGY6IEJvb2xlYW4oZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHRpbmdzLWZvcm1hdC1odW1hbi1wZGYnKT8uY2hlY2tlZCksXG4gICAgICAgIGh1bWFuX2RvY3g6IEJvb2xlYW4oZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHRpbmdzLWZvcm1hdC1odW1hbi1kb2N4Jyk/LmNoZWNrZWQpLFxuICAgICAgfSxcbiAgICAgIGFpX2F0dHJpYnV0aW9uOiBCb29sZWFuKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR0aW5ncy1nZW4tYWktYXR0cmlidXRpb24nKT8uY2hlY2tlZCksXG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gX2NvbGxlY3RSZXRyeVBvbGljeUZyb21Gb3JtKCkge1xuICByZXR1cm4ge1xuICAgIGJhc2VNczogTnVtYmVyKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR0aW5ncy1yZXRyeS1iYXNlLW1zJyk/LnZhbHVlIHx8IDE1MDApLFxuICAgIGNhcE1zOiBOdW1iZXIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHRpbmdzLXJldHJ5LWNhcC1tcycpPy52YWx1ZSB8fCA2MDAwMCksXG4gICAgbWF4QXR0ZW1wdHM6IE51bWJlcihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dGluZ3MtcmV0cnktbWF4LWF0dGVtcHRzJyk/LnZhbHVlIHx8IDYpLFxuICAgIGF1dG9SZXRyeTogQm9vbGVhbihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dGluZ3MtcmV0cnktYXV0bycpPy5jaGVja2VkKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gX3JlbmRlclNldHRpbmdzVG9Gb3JtKHBheWxvYWQpIHtcbiAgY29uc3Qgc2V0dGluZ3MgPSBwYXlsb2FkPy5zZXR0aW5ncyB8fCB7fTtcbiAgY29uc3QgbGxtID0gc2V0dGluZ3MubGxtIHx8IHt9O1xuICBjb25zdCBnZW5lcmF0aW9uID0gc2V0dGluZ3MuZ2VuZXJhdGlvbiB8fCB7fTtcbiAgY29uc3QgZm9ybWF0cyA9IGdlbmVyYXRpb24uZm9ybWF0cyB8fCB7fTtcbiAgY29uc3QgcnVudGltZVByb3ZpZGVyID0gcGF5bG9hZD8ucnVudGltZT8ubGxtPy5wcm92aWRlciB8fCBudWxsO1xuICBjb25zdCBydW50aW1lTW9kZWwgPSBwYXlsb2FkPy5ydW50aW1lPy5sbG0/Lm1vZGVsIHx8IG51bGw7XG4gIGNvbnN0IHJ1bnRpbWVPdmVycmlkZXMgPSB7fTtcbiAgaWYgKHJ1bnRpbWVQcm92aWRlcikgcnVudGltZU92ZXJyaWRlc1snbGxtLmRlZmF1bHRfcHJvdmlkZXInXSA9IHJ1bnRpbWVQcm92aWRlcjtcbiAgaWYgKHJ1bnRpbWVNb2RlbCkgcnVudGltZU92ZXJyaWRlc1snbGxtLmRlZmF1bHRfbW9kZWwnXSA9IHJ1bnRpbWVNb2RlbDtcblxuICBjb25zdCBzZXRWYWx1ZSA9IChpZCwgdmFsdWUpID0+IHtcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICBpZiAoZWwpIGVsLnZhbHVlID0gdmFsdWUgPz8gJyc7XG4gIH07XG4gIGNvbnN0IHNldENoZWNrZWQgPSAoaWQsIHZhbHVlKSA9PiB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgaWYgKGVsKSBlbC5jaGVja2VkID0gQm9vbGVhbih2YWx1ZSk7XG4gIH07XG5cbiAgc2V0VmFsdWUoJ3NldHRpbmdzLWxsbS1kZWZhdWx0LXByb3ZpZGVyJywgcnVudGltZVByb3ZpZGVyIHx8IGxsbS5kZWZhdWx0X3Byb3ZpZGVyIHx8ICcnKTtcbiAgc2V0VmFsdWUoJ3NldHRpbmdzLWxsbS1kZWZhdWx0LW1vZGVsJywgcnVudGltZU1vZGVsIHx8IGxsbS5kZWZhdWx0X21vZGVsIHx8ICcnKTtcbiAgc2V0VmFsdWUoJ3NldHRpbmdzLWxsbS1yZXF1ZXN0LXRpbWVvdXQnLCBsbG0ucmVxdWVzdF90aW1lb3V0X3NlY29uZHMgPz8gMTIwKTtcbiAgc2V0VmFsdWUoJ3NldHRpbmdzLWxsbS10ZW1wZXJhdHVyZScsIGxsbS50ZW1wZXJhdHVyZSA/PyAwLjcpO1xuXG4gIHNldFZhbHVlKCdzZXR0aW5ncy1nZW4tbWF4LXNraWxscycsIGdlbmVyYXRpb24ubWF4X3NraWxscyA/PyAyMCk7XG4gIHNldFZhbHVlKCdzZXR0aW5ncy1nZW4tbWF4LWFjaGlldmVtZW50cycsIGdlbmVyYXRpb24ubWF4X2FjaGlldmVtZW50cyA/PyA1KTtcbiAgc2V0VmFsdWUoJ3NldHRpbmdzLWdlbi1tYXgtcHVibGljYXRpb25zJywgZ2VuZXJhdGlvbi5tYXhfcHVibGljYXRpb25zID8/IDEwKTtcbiAgc2V0VmFsdWUoJ3NldHRpbmdzLWdlbi1za2lsbHMtdGl0bGUnLCBnZW5lcmF0aW9uLnNraWxsc19zZWN0aW9uX3RpdGxlIHx8ICdTa2lsbHMnKTtcblxuICBzZXRDaGVja2VkKCdzZXR0aW5ncy1mb3JtYXQtYXRzLWRvY3gnLCBmb3JtYXRzLmF0c19kb2N4KTtcbiAgc2V0Q2hlY2tlZCgnc2V0dGluZ3MtZm9ybWF0LWh1bWFuLXBkZicsIGZvcm1hdHMuaHVtYW5fcGRmKTtcbiAgc2V0Q2hlY2tlZCgnc2V0dGluZ3MtZm9ybWF0LWh1bWFuLWRvY3gnLCBmb3JtYXRzLmh1bWFuX2RvY3gpO1xuICBzZXRDaGVja2VkKCdzZXR0aW5ncy1nZW4tYWktYXR0cmlidXRpb24nLCBnZW5lcmF0aW9uLmFpX2F0dHJpYnV0aW9uKTtcblxuICBjb25zdCByZXRyeVBvbGljeSA9IF9nZXRSZXRyeVBvbGljeUZyb21TdG9yYWdlKCk7XG4gIHNldFZhbHVlKCdzZXR0aW5ncy1yZXRyeS1iYXNlLW1zJywgcmV0cnlQb2xpY3kuYmFzZU1zKTtcbiAgc2V0VmFsdWUoJ3NldHRpbmdzLXJldHJ5LWNhcC1tcycsIHJldHJ5UG9saWN5LmNhcE1zKTtcbiAgc2V0VmFsdWUoJ3NldHRpbmdzLXJldHJ5LW1heC1hdHRlbXB0cycsIHJldHJ5UG9saWN5Lm1heEF0dGVtcHRzKTtcbiAgc2V0Q2hlY2tlZCgnc2V0dGluZ3MtcmV0cnktYXV0bycsIHJldHJ5UG9saWN5LmF1dG9SZXRyeSk7XG5cbiAgX3JlbmRlclNldHRpbmdzU291cmNlcyhwYXlsb2FkLm1ldGEgfHwge30sIHJ1bnRpbWVPdmVycmlkZXMpO1xuXG4gIGNvbnN0IHBhdGhFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR0aW5ncy1jb25maWctcGF0aCcpO1xuICBpZiAocGF0aEVsKSB7XG4gICAgcGF0aEVsLnRleHRDb250ZW50ID0gcGF5bG9hZD8ubWV0YT8uY29uZmlnX3BhdGhcbiAgICAgID8gYENvbmZpZyBmaWxlOiAke3BheWxvYWQubWV0YS5jb25maWdfcGF0aH1gXG4gICAgICA6ICcnO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbG9hZFNldHRpbmdzTW9kYWwoKSB7XG4gIHRyeSB7XG4gICAgX3NldFNldHRpbmdzU3RhdHVzKCdMb2FkaW5nIHNldHRpbmdzLi4uJywgJ2luZm8nKTtcbiAgICBjb25zdCBbcmVzdWx0LCBzdGF0dXNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW2ZldGNoU2V0dGluZ3MoKSwgZmV0Y2hTdGF0dXMoKS5jYXRjaCgoKSA9PiBudWxsKV0pO1xuICAgIF9yZW5kZXJTZXR0aW5nc1RvRm9ybShyZXN1bHQpO1xuICAgIC8vIGFpX2F0dHJpYnV0aW9uIGlzIHBlci1zZXNzaW9uLCBub3QgaW4gY29uZmlnLnlhbWwgXHUyMDE0IHJlYWQgZnJvbSBzZXNzaW9uIHN0YXR1c1xuICAgIGNvbnN0IGF0dHJFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR0aW5ncy1nZW4tYWktYXR0cmlidXRpb24nKTtcbiAgICBpZiAoYXR0ckVsICYmIHN0YXR1cykgYXR0ckVsLmNoZWNrZWQgPSBCb29sZWFuKHN0YXR1cy5haV9hdHRyaWJ1dGlvbik7XG4gICAgX3NldFNldHRpbmdzU3RhdHVzKCdTZXR0aW5ncyBsb2FkZWQuJywgJ3N1Y2Nlc3MnKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBfc2V0U2V0dGluZ3NTdGF0dXMoYEZhaWxlZCB0byBsb2FkIHNldHRpbmdzOiAke2Vycm9yLm1lc3NhZ2UgfHwgZXJyb3J9YCwgJ2Vycm9yJyk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZVNldHRpbmdzTW9kYWwoKSB7XG4gIGNvbnN0IHNhdmVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dGluZ3Mtc2F2ZS1idG4nKTtcbiAgdHJ5IHtcbiAgICBpZiAoc2F2ZUJ0bikge1xuICAgICAgc2F2ZUJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICBzYXZlQnRuLnRleHRDb250ZW50ID0gJ1NhdmluZy4uLic7XG4gICAgfVxuICAgIF9zZXRTZXR0aW5nc1N0YXR1cygnU2F2aW5nIHNldHRpbmdzLi4uJywgJ2luZm8nKTtcbiAgICBjb25zdCBwYXlsb2FkID0gX2NvbGxlY3RTZXR0aW5nc1BheWxvYWRGcm9tRm9ybSgpO1xuICAgIGNvbnN0IGFpQXR0cmlidXRpb24gPSBCb29sZWFuKHBheWxvYWQuZ2VuZXJhdGlvbj8uYWlfYXR0cmlidXRpb24pO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHVwZGF0ZVNldHRpbmdzKHBheWxvYWQpO1xuICAgIF9zYXZlUmV0cnlQb2xpY3lUb1N0b3JhZ2UoX2NvbGxlY3RSZXRyeVBvbGljeUZyb21Gb3JtKCkpO1xuICAgIF9zZXR0aW5nc0RhdGEgPSByZXN1bHQ7XG4gICAgX3JlbmRlclNldHRpbmdzVG9Gb3JtKHJlc3VsdCk7XG4gICAgLy8gYWlfYXR0cmlidXRpb24gaXMgcGVyLXNlc3Npb24gc3RhdGUsIG5vdCBhIGNvbmZpZy55YW1sIGtleSBcdTIwMTQgc2F2ZSBpdCBzZXBhcmF0ZWx5XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGFwaUNhbGwoJ1BPU1QnLCAnL2FwaS9nZW5lcmF0aW9uLXNldHRpbmdzJywgeyBhaV9hdHRyaWJ1dGlvbjogYWlBdHRyaWJ1dGlvbiB9KTtcbiAgICB9IGNhdGNoIChfKSB7IC8qIG5vbi1mYXRhbCAqLyB9XG4gICAgX3NldFNldHRpbmdzU3RhdHVzKCdTZXR0aW5ncyBzYXZlZCBzdWNjZXNzZnVsbHkuJywgJ3N1Y2Nlc3MnKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBfc2V0U2V0dGluZ3NTdGF0dXMoYEZhaWxlZCB0byBzYXZlIHNldHRpbmdzOiAke2Vycm9yLm1lc3NhZ2UgfHwgZXJyb3J9YCwgJ2Vycm9yJyk7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKHNhdmVCdG4pIHtcbiAgICAgIHNhdmVCdG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIHNhdmVCdG4udGV4dENvbnRlbnQgPSAnU2F2ZSBTZXR0aW5ncyc7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG9wZW5TZXR0aW5nc01vZGFsKCkge1xuICBjb25zdCBvdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHRpbmdzLW1vZGFsLW92ZXJsYXknKTtcbiAgaWYgKCFvdmVybGF5KSByZXR1cm47XG4gIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgX2ZvY3VzU3RhY2sucHVzaChkb2N1bWVudC5hY3RpdmVFbGVtZW50KTtcbiAgc2V0SW5pdGlhbEZvY3VzKCdzZXR0aW5ncy1tb2RhbC1vdmVybGF5Jyk7XG4gIHRyYXBGb2N1cygnc2V0dGluZ3MtbW9kYWwtb3ZlcmxheScpO1xuICBhd2FpdCByZWxvYWRTZXR0aW5nc01vZGFsKCk7XG59XG5cbmZ1bmN0aW9uIGNsb3NlU2V0dGluZ3NNb2RhbCgpIHtcbiAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR0aW5ncy1tb2RhbC1vdmVybGF5Jyk7XG4gIGlmIChvdmVybGF5KSBvdmVybGF5LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHJlc3RvcmVGb2N1cygpO1xufVxuXG4vKipcbiAqIEdldCBhbGwgZm9jdXNhYmxlIGVsZW1lbnRzIHdpdGhpbiBhIGNvbnRhaW5lci5cbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGNvbnRhaW5lciAtIFRoZSBtb2RhbCBvciBjb250YWluZXIgZWxlbWVudFxuICogQHJldHVybnMge0hUTUxFbGVtZW50W119IEFycmF5IG9mIGZvY3VzYWJsZSBlbGVtZW50c1xuICovXG5mdW5jdGlvbiBnZXRGb2N1c2FibGVFbGVtZW50cyhjb250YWluZXIpIHtcbiAgY29uc3QgZm9jdXNhYmxlU2VsZWN0b3JzID0gW1xuICAgICdhW2hyZWZdJywgJ2J1dHRvbjpub3QoW2Rpc2FibGVkXSknLCAnaW5wdXQ6bm90KFtkaXNhYmxlZF0pJyxcbiAgICAndGV4dGFyZWE6bm90KFtkaXNhYmxlZF0pJywgJ3NlbGVjdDpub3QoW2Rpc2FibGVkXSknLFxuICAgICdbdGFiaW5kZXhdOm5vdChbdGFiaW5kZXg9XCItMVwiXSknLFxuICBdLmpvaW4oJywgJyk7XG4gIHJldHVybiBBcnJheS5mcm9tKGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKGZvY3VzYWJsZVNlbGVjdG9ycykpO1xufVxuXG4vKipcbiAqIFNldCBpbml0aWFsIGZvY3VzIHRvIHRoZSBmaXJzdCBmb2N1c2FibGUgZWxlbWVudCBpbiBhIG1vZGFsLlxuICogUHJpb3JpdGl6ZXMgZWxlbWVudHMgd2l0aCBpZD1cIlttb2RhbElkXS1mb2N1cy10YXJnZXRcIiBpZiBwcmVzZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGFsSWQgLSBJRCBvZiB0aGUgbW9kYWxcbiAqL1xuZnVuY3Rpb24gc2V0SW5pdGlhbEZvY3VzKG1vZGFsSWQpIHtcbiAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChtb2RhbElkKTtcbiAgaWYgKCFtb2RhbCkgcmV0dXJuO1xuXG4gIC8vIFRyeSB0byBmb2N1cyBhbiBleHBsaWNpdCB0YXJnZXQgKGUuZy4sIGlucHV0IGZpZWxkIHdpdGggY2xhc3MvaWQpXG4gIGNvbnN0IGZvY3VzVGFyZ2V0ID0gbW9kYWwucXVlcnlTZWxlY3RvcignW2RhdGEtZm9jdXMtdGFyZ2V0PVwidHJ1ZVwiXScpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgbW9kYWwucXVlcnlTZWxlY3RvcignaW5wdXRbdHlwZT1cInRleHRcIl0nKSB8fFxuICAgICAgICAgICAgICAgICAgICAgIG1vZGFsLnF1ZXJ5U2VsZWN0b3IoJ2J1dHRvbicpO1xuXG4gIGlmIChmb2N1c1RhcmdldCkge1xuICAgIC8vIFNtYWxsIGRlbGF5IHRvIGVuc3VyZSBtb2RhbCByZW5kZXIgKyBhY3R1YWwgZGlzcGxheVxuICAgIHNldFRpbWVvdXQoKCkgPT4gZm9jdXNUYXJnZXQuZm9jdXMoKSwgNTApO1xuICB9XG59XG5cbi8qKlxuICogVHJhcCBmb2N1cyB3aXRoaW4gYSBtb2RhbCB1c2luZyBUYWIvU2hpZnQrVGFiLlxuICogUHJldmVudHMgdXNlciB0YWJiaW5nIHRvIGVsZW1lbnRzIG91dHNpZGUgdGhlIG1vZGFsLlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGFsSWQgLSBJRCBvZiB0aGUgbW9kYWxcbiAqL1xuZnVuY3Rpb24gdHJhcEZvY3VzKG1vZGFsSWQpIHtcbiAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChtb2RhbElkKTtcbiAgaWYgKCFtb2RhbCkgcmV0dXJuO1xuXG4gIGNvbnN0IGZvY3VzYWJsZUVsZW1lbnRzID0gZ2V0Rm9jdXNhYmxlRWxlbWVudHMobW9kYWwpO1xuICBpZiAoZm9jdXNhYmxlRWxlbWVudHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgY29uc3QgZmlyc3RFbGVtZW50ID0gZm9jdXNhYmxlRWxlbWVudHNbMF07XG4gIGNvbnN0IGxhc3RFbGVtZW50ID0gZm9jdXNhYmxlRWxlbWVudHNbZm9jdXNhYmxlRWxlbWVudHMubGVuZ3RoIC0gMV07XG5cbiAgY29uc3QgbGlzdGVuZXIgPSAoZSkgPT4ge1xuICAgIGlmIChlLmtleSAhPT0gJ1RhYicpIHJldHVybjtcblxuICAgIGNvbnN0IGlzU2hpZnQgPSBlLnNoaWZ0S2V5O1xuICAgIGNvbnN0IGFjdGl2ZUVsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcblxuICAgIGlmIChpc1NoaWZ0KSB7XG4gICAgICBpZiAoYWN0aXZlRWwgPT09IGZpcnN0RWxlbWVudCkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGxhc3RFbGVtZW50LmZvY3VzKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChhY3RpdmVFbCA9PT0gbGFzdEVsZW1lbnQpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBmaXJzdEVsZW1lbnQuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGxpc3RlbmVyKTtcbiAgX2ZvY3VzVHJhcFN0YWNrLnB1c2gobGlzdGVuZXIpO1xufVxuXG4vKipcbiAqIFJlc3RvcmUgZm9jdXMgdG8gdGhlIGVsZW1lbnQgdGhhdCBvcGVuZWQgdGhlIG1vZGFsLlxuICovXG5mdW5jdGlvbiByZXN0b3JlRm9jdXMoKSB7XG4gIGNvbnN0IGVsID0gX2ZvY3VzU3RhY2sucG9wKCk7XG4gIGlmIChlbCAmJiB0eXBlb2YgZWwuZm9jdXMgPT09ICdmdW5jdGlvbicpIGVsLmZvY3VzKCk7XG5cbiAgY29uc3QgbGlzdGVuZXIgPSBfZm9jdXNUcmFwU3RhY2sucG9wKCk7XG4gIGlmIChsaXN0ZW5lcikgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGxpc3RlbmVyKTtcbn1cblxuZnVuY3Rpb24gcHVzaEZvY3VzU3RhY2soZWwpIHtcbiAgX2ZvY3VzU3RhY2sucHVzaChlbCB8fCBkb2N1bWVudC5hY3RpdmVFbGVtZW50KTtcbn1cblxuLyoqIE1hcHMgZWFjaCB3b3JrZmxvdyBzdGFnZSAodG9wIGJhcikgdG8gdGhlIHRhYnMgc2hvd24gaW4gdGhlIHNlY29uZCBuYXYgYmFyLiAqL1xuY29uc3QgU1RBR0VfVEFCUyA9IHtcbiAgam9iOiAgICAgICAgICAgIFsnam9iJywgJ21hc3RlciddLFxuICBhbmFseXNpczogICAgICAgWydhbmFseXNpcyddLFxuICBjdXN0b21pemF0aW9uczogWydnb2FscycsICdxdWVzdGlvbnMnLCAnZXhwLXJldmlldycsICdhY2gtZWRpdG9yJywgJ3NraWxscy1yZXZpZXcnLCAnYWNoaWV2ZW1lbnRzLXJldmlldycsICd0YWdsaW5lLXJldmlldycsICdzdW1tYXJ5LXJldmlldycsICdwdWJsaWNhdGlvbnMtcmV2aWV3JywgJ2F0cy1zY29yZSddLFxuICByZXdyaXRlOiAgICAgICAgWydyZXdyaXRlJ10sXG4gIHNwZWxsOiAgICAgICAgICBbJ3NwZWxsJ10sXG4gIGxheW91dDogICAgICAgICBbJ2xheW91dCddLFxuICBkb3dubG9hZDogICAgICAgWydmaW5hbF9nZW5lcmF0ZScsICdkb3dubG9hZCddLFxuICBjb3Zlcl9sZXR0ZXI6ICAgWydjb3Zlci1sZXR0ZXInXSxcbiAgc2NyZWVuaW5nOiAgICAgIFsnc2NyZWVuaW5nJ10sXG4gIGludGVydmlld19wcmVwOiBbJ2ludGVydmlldy1wcmVwJ10sXG4gIHRoYW5rX3lvdTogICAgICBbJ3RoYW5rLXlvdSddLFxuICBoYXJ2ZXN0OiAgICAgICAgWydoYXJ2ZXN0J10sXG59O1xuXG4vKipcbiAqIEN1c3RvbSBjb25maXJtIGRpYWxvZyBcdTIwMTQgcmV0dXJucyBhIFByb21pc2U8Ym9vbGVhbj4uXG4gKiBSZXBsYWNlcyBicm93c2VyIGNvbmZpcm0oKSB3aGljaCBjYW4gYmUgc2lsZW50bHkgc3VwcHJlc3NlZCBvbmNlIHRoZSB1c2VyXG4gKiBjaGVja3MgXCJQcmV2ZW50IHRoaXMgcGFnZSBmcm9tIGNyZWF0aW5nIGFkZGl0aW9uYWwgZGlhbG9nc1wiLlxuICpcbiAqIFVzYWdlOiAgaWYgKGF3YWl0IGNvbmZpcm1EaWFsb2coJ0FyZSB5b3Ugc3VyZT8nKSkgeyAuLi4gfVxuICovXG5mdW5jdGlvbiBjb25maXJtRGlhbG9nKG1lc3NhZ2UsIHsgY29uZmlybUxhYmVsID0gJ09LJywgY2FuY2VsTGFiZWwgPSAnQ2FuY2VsJywgZGFuZ2VyID0gZmFsc2UgfSA9IHt9KSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICBjb25zdCBwcmV2aW91c0ZvY3VzID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcblxuICAgIC8vIFJldXNlIG9yIGNyZWF0ZSB0aGUgc2hhcmVkIG92ZXJsYXkgZWxlbWVudFxuICAgIGxldCBvdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbmZpcm0tZGlhbG9nLW92ZXJsYXknKTtcbiAgICBpZiAoIW92ZXJsYXkpIHtcbiAgICAgIG92ZXJsYXkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIG92ZXJsYXkuaWQgPSAnY29uZmlybS1kaWFsb2ctb3ZlcmxheSc7XG4gICAgICBvdmVybGF5LnN0eWxlLmNzc1RleHQgPVxuICAgICAgICAnZGlzcGxheTpub25lOyBwb3NpdGlvbjpmaXhlZDsgaW5zZXQ6MDsgYmFja2dyb3VuZDpyZ2JhKDAsMCwwLDAuNDUpOyB6LWluZGV4Ojk5OTk7JyArXG4gICAgICAgICdhbGlnbi1pdGVtczpjZW50ZXI7IGp1c3RpZnktY29udGVudDpjZW50ZXI7JztcbiAgICAgIG92ZXJsYXkuaW5uZXJIVE1MID1cbiAgICAgICAgJzxkaXYgaWQ9XCJjb25maXJtLWRpYWxvZy1ib3hcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1tb2RhbD1cInRydWVcIicgK1xuICAgICAgICAnIGFyaWEtbGFiZWxsZWRieT1cImNvbmZpcm0tZGlhbG9nLW1zZ1wiJyArXG4gICAgICAgICcgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZmY7IGJvcmRlci1yYWRpdXM6OHB4OyBwYWRkaW5nOjI0cHggMjhweDsnICtcbiAgICAgICAgJ21heC13aWR0aDo0MDBweDsgd2lkdGg6OTAlOyBib3gtc2hhZG93OjAgOHB4IDMycHggcmdiYSgwLDAsMCwwLjE4KTsgZm9udC1mYW1pbHk6aW5oZXJpdDtcIj4nICtcbiAgICAgICAgJzxwIGlkPVwiY29uZmlybS1kaWFsb2ctbXNnXCIgc3R5bGU9XCJtYXJnaW46MCAwIDIwcHg7IGZvbnQtc2l6ZTowLjk1ZW07IGNvbG9yOiMxZTI5M2I7IHdoaXRlLXNwYWNlOnByZS13cmFwO1wiPjwvcD4nICtcbiAgICAgICAgJzxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7IGdhcDo4cHg7IGp1c3RpZnktY29udGVudDpmbGV4LWVuZDtcIj4nICtcbiAgICAgICAgJzxidXR0b24gaWQ9XCJjb25maXJtLWRpYWxvZy1jYW5jZWxcIiBzdHlsZT1cInBhZGRpbmc6NnB4IDE2cHg7IGJvcmRlcjoxcHggc29saWQgI2NiZDVlMTsnICtcbiAgICAgICAgJ2JvcmRlci1yYWRpdXM6NXB4OyBiYWNrZ3JvdW5kOiNmOGZhZmM7IGN1cnNvcjpwb2ludGVyOyBjb2xvcjojNDc1NTY5O1wiPjwvYnV0dG9uPicgK1xuICAgICAgICAnPGJ1dHRvbiBpZD1cImNvbmZpcm0tZGlhbG9nLW9rXCIgc3R5bGU9XCJwYWRkaW5nOjZweCAxNnB4OyBib3JkZXI6bm9uZTsnICtcbiAgICAgICAgJ2JvcmRlci1yYWRpdXM6NXB4OyBjdXJzb3I6cG9pbnRlcjsgY29sb3I6I2ZmZjsgZm9udC13ZWlnaHQ6NjAwO1wiPjwvYnV0dG9uPicgK1xuICAgICAgICAnPC9kaXY+PC9kaXY+JztcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQob3ZlcmxheSk7XG4gICAgfVxuXG4gICAgY29uc3Qgb2tCdG4gICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbmZpcm0tZGlhbG9nLW9rJyk7XG4gICAgY29uc3QgY2FuY2VsQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbmZpcm0tZGlhbG9nLWNhbmNlbCcpO1xuICAgIGNvbnN0IG1zZ0VsICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb25maXJtLWRpYWxvZy1tc2cnKTtcblxuICAgIG1zZ0VsLnRleHRDb250ZW50ICAgICAgICAgID0gbWVzc2FnZTtcbiAgICBva0J0bi50ZXh0Q29udGVudCAgICAgICAgICA9IGNvbmZpcm1MYWJlbDtcbiAgICBjYW5jZWxCdG4udGV4dENvbnRlbnQgICAgICA9IGNhbmNlbExhYmVsO1xuICAgIG9rQnRuLnN0eWxlLmJhY2tncm91bmQgICAgID0gZGFuZ2VyID8gJyNkYzI2MjYnIDogJyMzYjgyZjYnO1xuXG4gICAgb3ZlcmxheS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICAgIG9rQnRuLmZvY3VzKCk7XG5cbiAgICAvLyBGb2N1cyB0cmFwIFx1MjAxNCBrZWVwIFRhYi9TaGlmdCtUYWIgaW5zaWRlIHRoZSB0d28gYnV0dG9uc1xuICAgIGNvbnN0IHRyYXBGb2N1cyA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5rZXkgIT09ICdUYWInKSByZXR1cm47XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBjb25zdCBmb2N1c2VkID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICAgIGlmIChlLnNoaWZ0S2V5KSB7XG4gICAgICAgIChmb2N1c2VkID09PSBjYW5jZWxCdG4gPyBva0J0biA6IGNhbmNlbEJ0bikuZm9jdXMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIChmb2N1c2VkID09PSBva0J0biA/IGNhbmNlbEJ0biA6IG9rQnRuKS5mb2N1cygpO1xuICAgICAgfVxuICAgIH07XG4gICAgb3ZlcmxheS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdHJhcEZvY3VzKTtcblxuICAgIGNvbnN0IGZpbmlzaCA9IChyZXN1bHQpID0+IHtcbiAgICAgIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIG92ZXJsYXkucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRyYXBGb2N1cyk7XG4gICAgICAvLyBSZW1vdmUgbGlzdGVuZXJzIHRvIGF2b2lkIHN0YWNraW5nIGhhbmRsZXJzXG4gICAgICBva0J0bi5yZXBsYWNlV2l0aChva0J0bi5jbG9uZU5vZGUodHJ1ZSkpO1xuICAgICAgY2FuY2VsQnRuLnJlcGxhY2VXaXRoKGNhbmNlbEJ0bi5jbG9uZU5vZGUodHJ1ZSkpO1xuICAgICAgaWYgKHByZXZpb3VzRm9jdXMgJiYgdHlwZW9mIHByZXZpb3VzRm9jdXMuZm9jdXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcHJldmlvdXNGb2N1cy5mb2N1cygpO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgIH07XG5cbiAgICAvLyBFc2NhcGUga2V5IGNhbmNlbHNcbiAgICBvdmVybGF5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4geyBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSBmaW5pc2goZmFsc2UpOyB9LCB7IG9uY2U6IHRydWUgfSk7XG5cbiAgICAvLyBSZWJpbmQgY2xvbmVkIGJ1dHRvbnNcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29uZmlybS1kaWFsb2ctb2snKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICAgICAoKSA9PiBmaW5pc2godHJ1ZSksICB7IG9uY2U6IHRydWUgfSk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbmZpcm0tZGlhbG9nLWNhbmNlbCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gZmluaXNoKGZhbHNlKSwgeyBvbmNlOiB0cnVlIH0pO1xuICAgIG92ZXJsYXkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBlID0+IHsgaWYgKGUudGFyZ2V0ID09PSBvdmVybGF5KSBmaW5pc2goZmFsc2UpOyB9LCB7IG9uY2U6IHRydWUgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEluaXRpYWxpemUgdGhlIGFwcGxpY2F0aW9uIG9uIERPTSByZWFkeS5cbiAqIFNldHMgdXAgZXZlbnQgbGlzdGVuZXJzLCByZXN0b3JlcyBzZXNzaW9uLCBhbmQgbG9hZHMgaW5pdGlhbCB0YWIuXG4gKi9cbi8qKlxuICogU2V0IHVwIGFsbCBnbG9iYWwgZXZlbnQgbGlzdGVuZXJzLlxuICovXG5mdW5jdGlvbiBzZXR1cEV2ZW50TGlzdGVuZXJzKCkge1xuICAvLyBUYWIgYnV0dG9uc1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudGFiJykuZm9yRWFjaCh0YWIgPT4ge1xuICAgIHRhYi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICBjb25zdCB0YWJOYW1lID0gZS50YXJnZXQuaWQucmVwbGFjZSgndGFiLScsICcnKTtcbiAgICAgIHN3aXRjaFRhYih0YWJOYW1lKTtcbiAgICB9KTtcblxuICAgIC8vIEtleWJvYXJkIG5hdmlnYXRpb24gZm9yIHRhYnMgKFdDQUcgMi4xIEFBIHRhYmxpc3QgcGF0dGVybilcbiAgICB0YWIuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChlKSA9PiB7XG4gICAgICAvLyBFbnRlci9TcGFjZSBhY3RpdmF0ZSB0aGUgZm9jdXNlZCB0YWJcbiAgICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJyB8fCBlLmtleSA9PT0gJyAnKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS50YXJnZXQuY2xpY2soKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gQXJyb3cvSG9tZS9FbmQgbmF2aWdhdGUgYW5kIGFjdGl2YXRlXG4gICAgICBpZiAoWydBcnJvd0xlZnQnLCAnQXJyb3dSaWdodCcsICdIb21lJywgJ0VuZCddLmluY2x1ZGVzKGUua2V5KSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGNvbnN0IHRhYnMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50YWI6bm90KFtzdHlsZSo9XCJkaXNwbGF5OiBub25lXCJdKScpKTtcbiAgICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gdGFicy5pbmRleE9mKGUudGFyZ2V0KTtcblxuICAgICAgICBsZXQgbmV4dFRhYjtcbiAgICAgICAgaWYgKGUua2V5ID09PSAnQXJyb3dMZWZ0JyB8fCBlLmtleSA9PT0gJ0hvbWUnKSB7XG4gICAgICAgICAgbmV4dFRhYiA9IGUua2V5ID09PSAnSG9tZScgPyB0YWJzWzBdIDogdGFic1soY3VycmVudEluZGV4IC0gMSArIHRhYnMubGVuZ3RoKSAlIHRhYnMubGVuZ3RoXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXh0VGFiID0gZS5rZXkgPT09ICdFbmQnID8gdGFic1t0YWJzLmxlbmd0aCAtIDFdIDogdGFic1soY3VycmVudEluZGV4ICsgMSkgJSB0YWJzLmxlbmd0aF07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV4dFRhYikge1xuICAgICAgICAgIG5leHRUYWIuZm9jdXMoKTtcbiAgICAgICAgICBuZXh0VGFiLmNsaWNrKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gTWVzc2FnZSBpbnB1dCAoRW50ZXIga2V5IHRvIHNlbmQpXG4gIGNvbnN0IG1lc3NhZ2VJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZXNzYWdlLWlucHV0Jyk7XG4gIGlmIChtZXNzYWdlSW5wdXQpIHtcbiAgICBtZXNzYWdlSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5cHJlc3MnLCAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSAnRW50ZXInICYmICFlLnNoaWZ0S2V5KSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzLnNlbmRNZXNzYWdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgZ2xvYmFsVGhpcy5zZW5kTWVzc2FnZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBNb2RhbCBjbG9zZSBvbiBFU0Mga2V5XG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4ge1xuICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgIGNsb3NlQWxsTW9kYWxzKCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBDbG9zZSBtb2RhbHMgb24gYmFja2dyb3VuZCBjbGlja1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbcm9sZT1cImRpYWxvZ1wiXScpLmZvckVhY2gobW9kYWwgPT4ge1xuICAgIG1vZGFsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgIGlmIChlLnRhcmdldCA9PT0gbW9kYWwpIHtcbiAgICAgICAgY2xvc2VNb2RhbChtb2RhbC5pZCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJldHVybiB0aGUgc3RhZ2UgdGhhdCBvd25zIGEgZ2l2ZW4gdGFiLCBvciBudWxsIGlmIHVubWFwcGVkLlxuICogQHBhcmFtIHtzdHJpbmd9IHRhYlxuICogQHJldHVybnMge3N0cmluZ3xudWxsfVxuICovXG5mdW5jdGlvbiBnZXRTdGFnZUZvclRhYih0YWIpIHtcbiAgZm9yIChjb25zdCBbc3RhZ2UsIHRhYnNdIG9mIE9iamVjdC5lbnRyaWVzKFNUQUdFX1RBQlMpKSB7XG4gICAgaWYgKHRhYnMuaW5jbHVkZXModGFiKSkgcmV0dXJuIHN0YWdlO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBnZXRWaXNpYmxlU3RhZ2UoKSB7XG4gIGNvbnN0IGFjdGl2ZVRhYiA9IHN0YXRlTWFuYWdlci5nZXRDdXJyZW50VGFiKCk7XG4gIHJldHVybiBnZXRTdGFnZUZvclRhYihhY3RpdmVUYWIpIHx8IGdldFdvcmtmbG93U3RlcEZvclBoYXNlKHN0YXRlTWFuYWdlci5nZXRQaGFzZSgpKTtcbn1cblxuLyoqXG4gKiBTaG93L2hpZGUgdGhlIHNjcm9sbCBhcnJvdyBidXR0b25zIGJhc2VkIG9uIHdoZXRoZXIgdGhlIHRhYiBiYXIgaXMgc2Nyb2xsYWJsZS5cbiAqL1xuZnVuY3Rpb24gdXBkYXRlVGFiU2Nyb2xsQnV0dG9ucygpIHtcbiAgY29uc3QgdGFiQmFyICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWItYmFyJyk7XG4gIGNvbnN0IGxlZnRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFiLXNjcm9sbC1sZWZ0Jyk7XG4gIGNvbnN0IHJpZ2h0QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYi1zY3JvbGwtcmlnaHQnKTtcbiAgaWYgKCF0YWJCYXIgfHwgIWxlZnRCdG4gfHwgIXJpZ2h0QnRuKSByZXR1cm47XG4gIGxlZnRCdG4uc3R5bGUuZGlzcGxheSAgPSB0YWJCYXIuc2Nyb2xsTGVmdCA+IDAgPyAnJyA6ICdub25lJztcbiAgcmlnaHRCdG4uc3R5bGUuZGlzcGxheSA9IHRhYkJhci5zY3JvbGxMZWZ0IDwgdGFiQmFyLnNjcm9sbFdpZHRoIC0gdGFiQmFyLmNsaWVudFdpZHRoIC0gMSA/ICcnIDogJ25vbmUnO1xufVxuXG4vKipcbiAqIFNob3cgb25seSB0aGUgdGFicyB0aGF0IGJlbG9uZyB0byB0aGUgZ2l2ZW4gc3RhZ2UgaW4gdGhlIHNlY29uZCBuYXYgYmFyLlxuICogQHBhcmFtIHtzdHJpbmd9IHN0YWdlIC0gS2V5IGZyb20gU1RBR0VfVEFCU1xuICovXG5mdW5jdGlvbiB1cGRhdGVUYWJCYXJGb3JTdGFnZShzdGFnZSkge1xuICBjb25zdCBzdGFnZVRhYnMgPSBTVEFHRV9UQUJTW3N0YWdlXSB8fCBbXTtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnRhYicpLmZvckVhY2godGFiID0+IHtcbiAgICB0YWIuc3R5bGUuZGlzcGxheSA9IHN0YWdlVGFicy5pbmNsdWRlcyh0YWIuZGF0YXNldC50YWIpID8gJycgOiAnbm9uZSc7XG4gIH0pO1xuICAvLyBSZXNldCBzY3JvbGwgcG9zaXRpb24gdG8gc2hvdyBhY3RpdmUgdGFiLCB0aGVuIHJlZnJlc2ggYXJyb3cgdmlzaWJpbGl0eVxuICBjb25zdCB0YWJCYXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFiLWJhcicpO1xuICBpZiAodGFiQmFyKSB0YWJCYXIuc2Nyb2xsTGVmdCA9IDA7XG4gIHVwZGF0ZVRhYlNjcm9sbEJ1dHRvbnMoKTtcblxuICAvLyBHQVAtMTYgKFBhcnQgQSk6IHN1cmZhY2Ugd2hpY2ggd29ya2Zsb3cgc3RlcCdzIHN1Yi10YWJzIGFyZSBjdXJyZW50bHlcbiAgLy8gc2hvd24uIFZpc2libGUtb25seSBsYWJlbCBcdTIwMTQgbm8gYXJpYS1saXZlIGhlcmU7IHN3aXRjaFRhYigpIGluXG4gIC8vIHJldmlldy10YWJsZS1iYXNlLmpzIGlzIHRoZSBzb2xlIGxpdmUtc3BlZWNoIHNvdXJjZSBmb3IgdGhpcyBldmVudCwgdG9cbiAgLy8gYXZvaWQgYSBkb3VibGUtYW5ub3VuY2UgZnJvbSB0d28gaW5kZXBlbmRlbnQgbGl2ZSByZWdpb25zLlxuICBjb25zdCBsYWJlbEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYi1zdGFnZS1sYWJlbCcpO1xuICBpZiAobGFiZWxFbCkge1xuICAgIGNvbnN0IHN0ZXBMYWJlbCA9IF9TVEVQX0RJU1BMQVlbc3RhZ2VdIHx8IHN0YWdlO1xuICAgIGxhYmVsRWwudGV4dENvbnRlbnQgPSBzdGVwTGFiZWwgPyBgTm93IHZpZXdpbmc6ICR7c3RlcExhYmVsfWAgOiAnJztcbiAgfVxufVxuXG4vLyBsb2FkVGFiQ29udGVudCgpIGxpdmVzIGluIHdlYi9yZXZpZXctdGFibGUtYmFzZS5qcywgd2hpY2ggb3ducyB0aGVcbi8vIGZ1bGwgfjIwLWNhc2UgdGFiIGRpc3BhdGNoICh0aGlzIGZpbGUncyBjb3B5IG9ubHkgZXZlciBoYW5kbGVkIDUgb2YgdGhlbVxuLy8gYW5kIHdhcyBuZXZlciBjYWxsZWQgaW50ZXJuYWxseSBcdTIwMTQgZGVhZCBjb2RlLCBzdXBlcnNlZGVkIG9uY2UgdGhlIHRhYlxuLy8gc3lzdGVtIGdyZXcpLiByZXZpZXctdGFibGUtYmFzZS5qcydzIHZlcnNpb24gbm93IGNhcnJpZXMgdGhlIHNhbWVcbi8vIHNhZmUgdGV4dENvbnRlbnQtYmFzZWQgZXJyb3IgcmVuZGVyaW5nIHRoaXMgY29weSBoYWQ7IHNlZSBpdHMgb3duXG4vLyB0cnkvY2F0Y2guIFJlbW92ZWQgaGVyZSByYXRoZXIgdGhhbiBsZWZ0IHRvIGRyaWZ0IGZ1cnRoZXIgb3V0IG9mIHN5bmMuXG5cbi8qKlxuICogVG9nZ2xlIGNvbGxhcHNpYmxlIGNoYXQgcGFuZWwgKGludGVyYWN0aW9uIGFyZWEpLlxuICovXG5mdW5jdGlvbiB0b2dnbGVDaGF0KCkge1xuICBjb25zdCBpbnRlcmFjdGlvbkFyZWEgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaW50ZXJhY3Rpb24tYXJlYScpO1xuICBjb25zdCB2aWV3ZXJBcmVhID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnZpZXdlci1hcmVhJyk7XG5cbiAgaWYgKGludGVyYWN0aW9uQXJlYSkge1xuICAgIGNvbnN0IGlzQ29sbGFwc2VkID0gaW50ZXJhY3Rpb25BcmVhLmNsYXNzTGlzdC50b2dnbGUoJ2NvbGxhcHNlZCcpO1xuICAgIGlmICh2aWV3ZXJBcmVhKSB7XG4gICAgICB2aWV3ZXJBcmVhLnN0eWxlLmZsZXggPSBpc0NvbGxhcHNlZCA/ICcxIDEgMTAwJScgOiAnMCAxIDYwJSc7XG4gICAgfVxuICAgIC8vIEtlZXAgYXJpYS1sYWJlbCBhbmQgYXJpYS1leHBhbmRlZCBpbiBzeW5jIHdpdGggY29sbGFwc2VkIHN0YXRlXG4gICAgY29uc3QgdG9nZ2xlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvZ2dsZS1jaGF0Jyk7XG4gICAgaWYgKHRvZ2dsZUJ0bikge1xuICAgICAgdG9nZ2xlQnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsIFN0cmluZyghaXNDb2xsYXBzZWQpKTtcbiAgICAgIHRvZ2dsZUJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCBpc0NvbGxhcHNlZCA/ICdFeHBhbmQgY2hhdCBwYW5lbCcgOiAnQ29sbGFwc2UgY2hhdCBwYW5lbCcpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oU3RvcmFnZUtleXMuQ0hBVF9DT0xMQVBTRUQsIGlzQ29sbGFwc2VkKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2cud2FybignQ291bGQgbm90IHNhdmUgY2hhdCBzdGF0ZScpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIE9wZW4gYSBtb2RhbCBieSBJRC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RhbElkIC0gSUQgb2YgbW9kYWwgZWxlbWVudFxuICovXG5mdW5jdGlvbiBvcGVuTW9kYWwobW9kYWxJZCkge1xuICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG1vZGFsSWQpO1xuICBpZiAobW9kYWwpIHtcbiAgICAvLyBTYXZlIGZvY3VzIGJlZm9yZSBvcGVuaW5nIG1vZGFsXG4gICAgX2ZvY3VzU3RhY2sucHVzaChkb2N1bWVudC5hY3RpdmVFbGVtZW50KTtcblxuICAgIG1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Zpc2libGUnKTtcbiAgICBtb2RhbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ2ZhbHNlJyk7XG4gICAgLy8gTG9jayBib2R5IHNjcm9sbFxuICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcblxuICAgIC8vIFNldCBpbml0aWFsIGZvY3VzIGFuZCB0cmFwIGZvY3VzIHdpdGhpbiBtb2RhbFxuICAgIHNldEluaXRpYWxGb2N1cyhtb2RhbElkKTtcbiAgICB0cmFwRm9jdXMobW9kYWxJZCk7XG4gIH1cbn1cblxuLyoqXG4gKiBDbG9zZSBhIG1vZGFsIGJ5IElELlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGFsSWQgLSBJRCBvZiBtb2RhbCBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIGNsb3NlTW9kYWwobW9kYWxJZCkge1xuICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG1vZGFsSWQpO1xuICBpZiAobW9kYWwpIHtcbiAgICBpZiAobW9kYWwuZGF0YXNldC5kaXNtaXNzRGlzYWJsZWQgPT09ICcxJykgcmV0dXJuO1xuICAgIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Zpc2libGUnKTtcbiAgICBtb2RhbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTtcbiAgICAvLyBSZXN0b3JlIGJvZHkgc2Nyb2xsXG4gICAgaWYgKCFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbcm9sZT1cImRpYWxvZ1wiXS52aXNpYmxlJykpIHtcbiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnJztcbiAgICB9XG4gICAgLy8gUmVzdG9yZSBmb2N1c1xuICAgIHJlc3RvcmVGb2N1cygpO1xuICB9XG59XG5cbi8qKlxuICogQ2xvc2UgYWxsIG9wZW4gbW9kYWxzLlxuICovXG5mdW5jdGlvbiBjbG9zZUFsbE1vZGFscygpIHtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW3JvbGU9XCJkaWFsb2dcIl0nKS5mb3JFYWNoKG1vZGFsID0+IHtcbiAgICBpZiAobW9kYWwuZGF0YXNldC5kaXNtaXNzRGlzYWJsZWQgPT09ICcxJykgcmV0dXJuO1xuICAgIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Zpc2libGUnKTtcbiAgICBtb2RhbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTtcbiAgICBpZiAobW9kYWwuc3R5bGUuZGlzcGxheSAmJiBtb2RhbC5zdHlsZS5kaXNwbGF5ICE9PSAnbm9uZScpIHtcbiAgICAgIG1vZGFsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgfVxuICB9KTtcbiAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICcnO1xuICAvLyBSZXN0b3JlIGZvY3VzXG4gIHJlc3RvcmVGb2N1cygpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgTW9kZWwgc2VsZWN0b3IgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmxldCBfbW9kZWxEYXRhID0gbnVsbDsgLy8gY2FjaGVkIGZyb20gbGFzdCBsb2FkTW9kZWxTZWxlY3RvcigpIGNhbGxcbmxldCBfbW9kZWxEYXRhVGFibGUgPSBudWxsO1xubGV0IF9zZWxlY3RlZE1vZGVsUHJvdmlkZXJzID0gbmV3IFNldCgpO1xubGV0IF9tb2RlbFNlbGVjdG9yTG9hZGluZyA9IGZhbHNlOyAgIC8vIGd1YXJkOiBsb2FkTW9kZWxTZWxlY3RvcigpIGluIGZsaWdodFxubGV0IF9jYXRhbG9nUmVmcmVzaGluZyA9IGZhbHNlOyAgICAgIC8vIGd1YXJkOiBfcmVmcmVzaE1vZGVsQ2F0YWxvZ0ZvclNlbGVjdGlvbigpIGluIGZsaWdodFxubGV0IF9jYXRhbG9nUmVmcmVzaFBlbmRpbmcgPSBmYWxzZTsgIC8vIHF1ZXVlIG9uZSByZXJ1biB3aGVuIHRvZ2dsZXMgaGFwcGVuIG1pZC1yZWZyZXNoXG5sZXQgX3Nob3dGdWxsTW9kZWxDYXRhbG9nID0gZmFsc2U7XG5sZXQgX2NvcGlsb3RBdXRoUG9sbFRpbWVyID0gbnVsbDtcbmxldCBfbW9kZWxXaXphcmRTdGVwID0gMTtcbmxldCBfbW9kZWxXaXphcmRTZWxlY3RlZFByb3ZpZGVyID0gbnVsbDtcblxuXG5mdW5jdGlvbiBfZ2V0TW9kZWxQcmVmc0Zyb21TdG9yYWdlKCkge1xuICB0cnkge1xuICAgIGNvbnN0IHNhdmVkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oU3RvcmFnZUtleXMuVEFCX0RBVEEpO1xuICAgIHJldHVybiBzYXZlZCA/IChKU09OLnBhcnNlKHNhdmVkKSB8fCB7fSkgOiB7fTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG59XG5cbmZ1bmN0aW9uIF9zYXZlTW9kZWxQcmVmc1RvU3RvcmFnZShwYXRjaCkge1xuICB0cnkge1xuICAgIGNvbnN0IHBhcnNlZCA9IF9nZXRNb2RlbFByZWZzRnJvbVN0b3JhZ2UoKTtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShTdG9yYWdlS2V5cy5UQUJfREFUQSwgSlNPTi5zdHJpbmdpZnkoeyAuLi5wYXJzZWQsIC4uLnBhdGNoIH0pKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZy53YXJuKCdGYWlsZWQgdG8gcGVyc2lzdCBtb2RlbCBwcmVmZXJlbmNlcyBsb2NhbGx5OicsIGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9hcHBlbmRSZWNlbnRNb2RlbChwcm92aWRlciwgbW9kZWwpIHtcbiAgaWYgKCFwcm92aWRlciB8fCAhbW9kZWwpIHJldHVybjtcbiAgY29uc3QgcGFyc2VkID0gX2dldE1vZGVsUHJlZnNGcm9tU3RvcmFnZSgpO1xuICBjb25zdCBleGlzdGluZyA9IEFycmF5LmlzQXJyYXkocGFyc2VkLnJlY2VudE1vZGVscykgPyBwYXJzZWQucmVjZW50TW9kZWxzIDogW107XG4gIGNvbnN0IGZpbHRlcmVkID0gZXhpc3RpbmcuZmlsdGVyKChpdGVtKSA9PiAhKGl0ZW0ucHJvdmlkZXIgPT09IHByb3ZpZGVyICYmIGl0ZW0ubW9kZWwgPT09IG1vZGVsKSk7XG4gIGZpbHRlcmVkLnVuc2hpZnQoeyBwcm92aWRlciwgbW9kZWwgfSk7XG4gIF9zYXZlTW9kZWxQcmVmc1RvU3RvcmFnZSh7IHJlY2VudE1vZGVsczogZmlsdGVyZWQuc2xpY2UoMCwgNikgfSk7XG59XG5cbmZ1bmN0aW9uIF91cGRhdGVMbG1TdGF0dXNQaWxsKGtpbmQsIHRleHQsIGljb24gPSAnJywgdG9vbHRpcCA9ICcnKSB7XG4gIGNvbnN0IHBpbGwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtLXN0YXR1cy1waWxsJyk7XG4gIGNvbnN0IGxhYmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbS1zdGF0dXMtbGFiZWwnKTtcbiAgY29uc3QgaWNvbkVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbS1zdGF0dXMtaWNvbicpO1xuICBpZiAoIXBpbGwgfHwgIWxhYmVsKSByZXR1cm47XG5cbiAgY29uc3QgYWxpYXNlcyA9IHtcbiAgICBhdXRoZW50aWNhdGVkOiAnY29ubmVjdGVkJyxcbiAgICB1bmF1dGhlbnRpY2F0ZWQ6ICd1bmNvbmZpZ3VyZWQnLFxuICAgIHBvbGxpbmc6ICdjb25uZWN0aW5nJyxcbiAgfTtcbiAgY29uc3Qgbm9ybWFsaXplZEtpbmQgPSBhbGlhc2VzW2tpbmRdIHx8IGtpbmQgfHwgJ3VuY29uZmlndXJlZCc7XG4gIGNvbnN0IGRlZmF1bHRUb29sdGlwID0ge1xuICAgIHVuY29uZmlndXJlZDogJ05vIHByb3ZpZGVyL21vZGVsIGlzIGNvbmZpZ3VyZWQgeWV0LicsXG4gICAgY29uZmlndXJlZDogJ1Byb3ZpZGVyL21vZGVsIGlzIGNvbmZpZ3VyZWQuIENvbm5lY3Rpdml0eSBub3QgeWV0IHZlcmlmaWVkLicsXG4gICAgY29ubmVjdGluZzogJ1Rlc3Rpbmcgb3IgY29ubmVjdGluZyB0byB0aGUgc2VsZWN0ZWQgcHJvdmlkZXIuJyxcbiAgICBjb25uZWN0ZWQ6ICdQcm92aWRlciByZXNwb25kZWQgc3VjY2Vzc2Z1bGx5IHRvIGEgbGl2ZSByZXF1ZXN0LicsXG4gICAgJ2F1dGgtcmVxdWlyZWQnOiAnQXV0aGVudGljYXRpb24gaXMgcmVxdWlyZWQuIENoZWNrIEFQSSBrZXkgb3Igc2lnbiBpbi4nLFxuICAgICdyYXRlLWxpbWl0ZWQnOiAnUmF0ZSBsaW1pdCByZWFjaGVkLiBXYWl0IGJlZm9yZSByZXRyeWluZyByZXF1ZXN0cy4nLFxuICAgIHVuYXZhaWxhYmxlOiAnUHJvdmlkZXIgaXMgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGUgb3IgdW5yZWFjaGFibGUuJyxcbiAgICBlcnJvcjogJ0Nvbm5lY3Rpb24gZmFpbGVkLiBPcGVuIG1vZGVsIHNldHRpbmdzIGZvciBkZXRhaWxzLicsXG4gIH07XG4gIHBpbGwuY2xhc3NMaXN0LnJlbW92ZSgnYXV0aGVudGljYXRlZCcsICd1bmF1dGhlbnRpY2F0ZWQnLCAncG9sbGluZycsICd1bmNvbmZpZ3VyZWQnLCAnY29uZmlndXJlZCcsICdjb25uZWN0aW5nJywgJ2Nvbm5lY3RlZCcsICdhdXRoLXJlcXVpcmVkJywgJ3JhdGUtbGltaXRlZCcsICd1bmF2YWlsYWJsZScsICdlcnJvcicpO1xuICBpZiAobm9ybWFsaXplZEtpbmQpIHBpbGwuY2xhc3NMaXN0LmFkZChub3JtYWxpemVkS2luZCk7XG4gIGxhYmVsLnRleHRDb250ZW50ID0gdGV4dDtcbiAgY29uc3QgaWNvbkJ5S2luZCA9IHtcbiAgICB1bmNvbmZpZ3VyZWQ6ICdcdTI1Q0InLFxuICAgIGNvbmZpZ3VyZWQ6ICdcdTI1RDQnLFxuICAgIGNvbm5lY3Rpbmc6ICdcdTI5RDcnLFxuICAgIGNvbm5lY3RlZDogJ1x1MjcxMycsXG4gICAgJ2F1dGgtcmVxdWlyZWQnOiAnXHVEODNEXHVERDExJyxcbiAgICAncmF0ZS1saW1pdGVkJzogJ1x1MjNGMycsXG4gICAgdW5hdmFpbGFibGU6ICdcdTI2MDEnLFxuICAgIGVycm9yOiAnXHUyNkEwJyxcbiAgfTtcbiAgY29uc3QgaWNvblRleHQgPSBpY29uIHx8IGljb25CeUtpbmRbbm9ybWFsaXplZEtpbmRdIHx8ICdcdTI2QTAnO1xuICBpZiAoaWNvbkVsKSBpY29uRWwudGV4dENvbnRlbnQgPSBpY29uVGV4dDtcbiAgY29uc3QgdG9vbHRpcFRleHQgPSB0b29sdGlwIHx8IGRlZmF1bHRUb29sdGlwW25vcm1hbGl6ZWRLaW5kXSB8fCAnJztcbiAgcGlsbC50aXRsZSA9IHRvb2x0aXBUZXh0O1xuICBpZiAoaWNvbkVsKSBpY29uRWwudGl0bGUgPSB0b29sdGlwVGV4dDtcbiAgbGFiZWwudGl0bGUgPSB0b29sdGlwVGV4dDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9hZE1vZGVsU2VsZWN0b3IoKSB7XG4gIGlmIChfbW9kZWxTZWxlY3RvckxvYWRpbmcpIHJldHVybjtcbiAgX21vZGVsU2VsZWN0b3JMb2FkaW5nID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICBfbW9kZWxEYXRhID0gYXdhaXQgYXBpQ2FsbCgnR0VUJywgJy9hcGkvbW9kZWwnKTtcbiAgICAvLyBJZiBiYWNrZW5kIGRpZG4ndCByZXR1cm4gYSBwZXJzaXN0ZW50IHNlbGVjdGlvbiwgcHJlZmVyIGEgbG9jYWxseS1zYXZlZCBjaG9pY2VcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2F2ZWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShTdG9yYWdlS2V5cy5UQUJfREFUQSk7XG4gICAgICBpZiAoc2F2ZWQpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShzYXZlZCk7XG4gICAgICAgIGlmIChwYXJzZWQgJiYgIShfbW9kZWxEYXRhICYmIF9tb2RlbERhdGEucHJvdmlkZXIpICYmIHBhcnNlZC5jdXJyZW50TW9kZWxQcm92aWRlcikge1xuICAgICAgICAgIF9tb2RlbERhdGEgPSBfbW9kZWxEYXRhIHx8IHt9O1xuICAgICAgICAgIF9tb2RlbERhdGEucHJvdmlkZXIgPSBwYXJzZWQuY3VycmVudE1vZGVsUHJvdmlkZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcnNlZCAmJiAhKF9tb2RlbERhdGEgJiYgX21vZGVsRGF0YS5tb2RlbCkgJiYgcGFyc2VkLmN1cnJlbnRNb2RlbE5hbWUpIHtcbiAgICAgICAgICBfbW9kZWxEYXRhID0gX21vZGVsRGF0YSB8fCB7fTtcbiAgICAgICAgICBfbW9kZWxEYXRhLm1vZGVsID0gcGFyc2VkLmN1cnJlbnRNb2RlbE5hbWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2cud2FybignQ291bGQgbm90IHJlYWQgc2F2ZWQgbW9kZWwgZnJvbSBsb2NhbFN0b3JhZ2U6JywgZSk7XG4gICAgfVxuICAgIGNvbnN0IGxhYmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLWN1cnJlbnQtbGFiZWwnKTtcbiAgICBpZiAobGFiZWwpIHtcbiAgICAgIGNvbnN0IHByb3YgID0gX21vZGVsRGF0YS5wcm92aWRlcjtcbiAgICAgIGNvbnN0IG1vZGVsID0gX21vZGVsRGF0YS5tb2RlbCB8fCAnXHUyMDE0JztcbiAgICAgIGxhYmVsLnRleHRDb250ZW50ID0gcHJvdiA/IGAke3Byb3Z9IFx1MDBCNyAke21vZGVsfWAgOiBtb2RlbDtcbiAgICB9XG4gICAgaWYgKF9tb2RlbERhdGEgJiYgX21vZGVsRGF0YS5wcm92aWRlcikge1xuICAgICAgX3NlbGVjdGVkTW9kZWxQcm92aWRlcnMgPSBuZXcgU2V0KFtfbW9kZWxEYXRhLnByb3ZpZGVyXSk7XG4gICAgICBfdXBkYXRlTGxtU3RhdHVzUGlsbCgnY29uZmlndXJlZCcsIGAke19tb2RlbERhdGEucHJvdmlkZXJ9IGNvbmZpZ3VyZWRgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgX3VwZGF0ZUxsbVN0YXR1c1BpbGwoJ3VuY29uZmlndXJlZCcsICdOb3QgY29uZmlndXJlZCcpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZy53YXJuKCdDb3VsZCBub3QgbG9hZCBtb2RlbCBsaXN0OicsIGUpO1xuICB9IGZpbmFsbHkge1xuICAgIF9tb2RlbFNlbGVjdG9yTG9hZGluZyA9IGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9wcm92aWRlclN0YWdlTGFiZWwocHJvdmlkZXIsIGNhcGFibGVTZXQpIHtcbiAgY29uc3QgaXNDYXBhYmxlID0gY2FwYWJsZVNldC5oYXMocHJvdmlkZXIpO1xuICByZXR1cm4gaXNDYXBhYmxlID8gJ2xpc3RfbW9kZWxzJyA6ICdmYWxsYmFjayc7XG59XG5cbmZ1bmN0aW9uIF9wcm92aWRlckRpc3BsYXlMYWJlbChwcm92aWRlcikge1xuICBjb25zdCBkZXByZWNhdGVkID0ge1xuICAgICdjb3BpbG90LW9hdXRoJzogJ0NvcGlsb3QgT0F1dGggKGRlcHJlY2F0ZWQpJyxcbiAgICBjb3BpbG90OiAnQ29waWxvdCAoZGVwcmVjYXRlZCknLFxuICAgIGdpdGh1YjogJ0dpdEh1YiBNb2RlbHMgKGRlcHJlY2F0ZWQpJyxcbiAgICAnY29waWxvdC1zZGsnOiAnQ29waWxvdCBTREsgKHJlY29tbWVuZGVkKScsXG4gIH07XG4gIGlmIChkZXByZWNhdGVkW3Byb3ZpZGVyXSkgcmV0dXJuIGRlcHJlY2F0ZWRbcHJvdmlkZXJdO1xuICByZXR1cm4gcHJvdmlkZXI7XG59XG5cbmZ1bmN0aW9uIF9nZXRRdWlja01vZGVsQ2FuZGlkYXRlcyhyb3dzKSB7XG4gIGNvbnN0IHBhcnNlZCA9IF9nZXRNb2RlbFByZWZzRnJvbVN0b3JhZ2UoKTtcbiAgY29uc3QgcmVjZW50cyA9IEFycmF5LmlzQXJyYXkocGFyc2VkLnJlY2VudE1vZGVscykgPyBwYXJzZWQucmVjZW50TW9kZWxzIDogW107XG4gIGNvbnN0IHJhbmtlZCA9IFtdO1xuXG4gIGZvciAoY29uc3QgcmVjZW50IG9mIHJlY2VudHMpIHtcbiAgICBjb25zdCBoaXQgPSByb3dzLmZpbmQoKHJvdykgPT4gcm93LnByb3ZpZGVyID09PSByZWNlbnQucHJvdmlkZXIgJiYgcm93Lm1vZGVsID09PSByZWNlbnQubW9kZWwpO1xuICAgIGlmIChoaXQpIHJhbmtlZC5wdXNoKGhpdCk7XG4gIH1cblxuICBjb25zdCBwb3B1bGFyID0gWy4uLnJvd3NdXG4gICAgLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGNvbnN0IGFtID0gTnVtYmVyKGEuY29waWxvdF9tdWx0aXBsaWVyID8/IDk5OSk7XG4gICAgICBjb25zdCBibSA9IE51bWJlcihiLmNvcGlsb3RfbXVsdGlwbGllciA/PyA5OTkpO1xuICAgICAgaWYgKGFtICE9PSBibSkgcmV0dXJuIGFtIC0gYm07XG4gICAgICBjb25zdCBhYyA9IE51bWJlcihhLmNvbnRleHRfd2luZG93IHx8IDApO1xuICAgICAgY29uc3QgYmMgPSBOdW1iZXIoYi5jb250ZXh0X3dpbmRvdyB8fCAwKTtcbiAgICAgIHJldHVybiBiYyAtIGFjO1xuICAgIH0pO1xuXG4gIGZvciAoY29uc3QgaXRlbSBvZiBwb3B1bGFyKSB7XG4gICAgaWYgKCFyYW5rZWQuc29tZSgocikgPT4gci5wcm92aWRlciA9PT0gaXRlbS5wcm92aWRlciAmJiByLm1vZGVsID09PSBpdGVtLm1vZGVsKSkge1xuICAgICAgcmFua2VkLnB1c2goaXRlbSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJhbmtlZC5zbGljZSgwLCA4KTtcbn1cblxuZnVuY3Rpb24gX3JlbmRlclF1aWNrTW9kZWxMaXN0KHJvd3MpIHtcbiAgY29uc3QgcXVpY2tFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1xdWljay1saXN0Jyk7XG4gIGlmICghcXVpY2tFbCkgcmV0dXJuO1xuICBxdWlja0VsLmlubmVySFRNTCA9ICcnO1xuXG4gIGNvbnN0IGNhbmRpZGF0ZXMgPSBfZ2V0UXVpY2tNb2RlbENhbmRpZGF0ZXMocm93cyB8fCBbXSk7XG4gIGZvciAoY29uc3QgaXRlbSBvZiBjYW5kaWRhdGVzKSB7XG4gICAgY29uc3QgaXNBY3RpdmUgPSBpdGVtLnByb3ZpZGVyID09PSBfbW9kZWxEYXRhPy5wcm92aWRlciAmJiBpdGVtLm1vZGVsID09PSBfbW9kZWxEYXRhPy5tb2RlbDtcbiAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICBidXR0b24uY2xhc3NOYW1lID0gJ2hlYWRlci1waWxsLWJ0bic7XG4gICAgYnV0dG9uLnN0eWxlLnBhZGRpbmcgPSAnNXB4IDEwcHgnO1xuICAgIGJ1dHRvbi5zdHlsZS5mb250U2l6ZSA9ICcwLjgyZW0nO1xuICAgIGJ1dHRvbi5zdHlsZS5iYWNrZ3JvdW5kID0gaXNBY3RpdmUgPyAnI2RiZWFmZScgOiAnI2Y4ZmFmYyc7XG4gICAgYnV0dG9uLnN0eWxlLmNvbG9yID0gaXNBY3RpdmUgPyAnIzFlM2E4YScgOiAnIzMzNDE1NSc7XG4gICAgYnV0dG9uLnN0eWxlLmJvcmRlckNvbG9yID0gaXNBY3RpdmUgPyAnIzkzYzVmZCcgOiAnI2NiZDVlMSc7XG4gICAgYnV0dG9uLnRpdGxlID0gYCR7aXRlbS5wcm92aWRlcn0gXHUwMEI3ICR7aXRlbS5tb2RlbH1gO1xuICAgIGJ1dHRvbi50ZXh0Q29udGVudCA9IGAke2l0ZW0ucHJvdmlkZXJ9IFx1MDBCNyAke2l0ZW0ubW9kZWx9YDtcbiAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBzZXRNb2RlbChpdGVtLm1vZGVsLCBpdGVtLnByb3ZpZGVyKTtcbiAgICB9KTtcbiAgICBxdWlja0VsLmFwcGVuZENoaWxkKGJ1dHRvbik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX3N5bmNDYXRhbG9nVmlzaWJpbGl0eSgpIHtcbiAgY29uc3Qgd3JhcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1mdWxsLXRhYmxlLXdyYXAnKTtcbiAgY29uc3Qgc2VhcmNoID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLWdsb2JhbC1zZWFyY2gnKTtcbiAgY29uc3QgdG9nZ2xlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLXNob3ctYWxsLWJ0bicpO1xuICBpZiAod3JhcCkgd3JhcC5zdHlsZS5kaXNwbGF5ID0gX3Nob3dGdWxsTW9kZWxDYXRhbG9nID8gJycgOiAnbm9uZSc7XG4gIGlmIChzZWFyY2gpIHNlYXJjaC5zdHlsZS5kaXNwbGF5ID0gX3Nob3dGdWxsTW9kZWxDYXRhbG9nID8gJycgOiAnbm9uZSc7XG4gIGlmICh0b2dnbGUpIHRvZ2dsZS50ZXh0Q29udGVudCA9IF9zaG93RnVsbE1vZGVsQ2F0YWxvZyA/ICdIaWRlIEZ1bGwgQ2F0YWxvZycgOiAnU2hvdyBGdWxsIENhdGFsb2cnO1xufVxuXG5mdW5jdGlvbiB0b2dnbGVNb2RlbENhdGFsb2dWaXNpYmlsaXR5KCkge1xuICBfc2hvd0Z1bGxNb2RlbENhdGFsb2cgPSAhX3Nob3dGdWxsTW9kZWxDYXRhbG9nO1xuICBfc3luY0NhdGFsb2dWaXNpYmlsaXR5KCk7XG59XG5cbi8vIF9yZW5kZXJBdXRoU3RlcCBcdTIwMTQgY2FsbGVkIGJ5IF9zZXRNb2RlbFdpemFyZFN0ZXAgd2hlbiBlbnRlcmluZyBTdGVwIDIuXG4vLyBSZW5kZXJzIHByb3ZpZGVyLXNwZWNpZmljIGNvbnRlbnQgaW50byAjbW9kZWwtYXV0aC1zdGVwLWNvbnRlbnQgYW5kIHNob3dzXG4vLyB0aGUgYXBwcm9wcmlhdGUgc3ViLXBhbmVsIChrZXkgaW5wdXQsIGRldmljZS1mbG93LCBDTEkgbm90aWNlLCBvciBub25lKS5cbmFzeW5jIGZ1bmN0aW9uIF9yZW5kZXJBdXRoU3RlcChwcm92aWRlcikge1xuICBjb25zdCBjb250ZW50ICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLWF1dGgtc3RlcC1jb250ZW50Jyk7XG4gIGNvbnN0IGtleVBhbmVsICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtYXV0aC1rZXktcGFuZWwnKTtcbiAgY29uc3QgZGV2UGFuZWwgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1hdXRoLWRldmljZS1wYW5lbCcpO1xuICBjb25zdCBrZXlJbnB1dCAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLWF1dGgta2V5LWlucHV0Jyk7XG4gIGNvbnN0IGtleVN0YXR1cyAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtYXV0aC1rZXktc3RhdHVzJyk7XG5cbiAgaWYgKCFjb250ZW50KSByZXR1cm47XG5cbiAgLy8gUmVzZXQgc3ViLXBhbmVsc1xuICBpZiAoa2V5UGFuZWwpICBrZXlQYW5lbC5zdHlsZS5kaXNwbGF5ICA9ICdub25lJztcbiAgaWYgKGRldlBhbmVsKSAgZGV2UGFuZWwuc3R5bGUuZGlzcGxheSAgPSAnbm9uZSc7XG4gIGlmIChrZXlJbnB1dCkgIGtleUlucHV0LnZhbHVlID0gJyc7XG4gIGlmIChrZXlTdGF0dXMpIGtleVN0YXR1cy50ZXh0Q29udGVudCA9ICcnO1xuXG4gIGlmICghcHJvdmlkZXIpIHtcbiAgICBjb250ZW50LmlubmVySFRNTCA9ICc8cCBzdHlsZT1cImNvbG9yOiM2NDc0OGI7XCI+U2VsZWN0IGEgcHJvdmlkZXIgaW4gU3RlcCAxIGZpcnN0LjwvcD4nO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBjcmVkRGF0YSA9IG51bGw7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKCcvYXBpL3NldHRpbmdzL2NyZWRlbnRpYWxzL3N0YXR1cycpO1xuICAgIGlmIChyZXNwLm9rKSB7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcC5qc29uKCk7XG4gICAgICBjcmVkRGF0YSA9IChkYXRhLnByb3ZpZGVycyB8fCB7fSlbcHJvdmlkZXJdIHx8IG51bGw7XG4gICAgfVxuICB9IGNhdGNoIHsgLyogbm9uLWZhdGFsICovIH1cblxuICBjb25zdCBhdXRoVHlwZSAgID0gY3JlZERhdGE/LmF1dGhfdHlwZSAgfHwgJ2FwaV9rZXknO1xuICBjb25zdCBsYWJlbCAgICAgID0gY3JlZERhdGE/LmxhYmVsICAgICAgfHwgcHJvdmlkZXI7XG4gIGNvbnN0IGhlbHBUZXh0ICAgPSBjcmVkRGF0YT8uaGVscF90ZXh0ICB8fCAnJztcbiAgY29uc3QgZ2V0S2V5VXJsICA9IGNyZWREYXRhPy5nZXRfa2V5X3VybCB8fCAnJztcbiAgY29uc3QgaXNTZXQgICAgICA9IGNyZWREYXRhPy5pc19zZXQgICAgIHx8IGZhbHNlO1xuICBjb25zdCBzb3VyY2UgICAgID0gY3JlZERhdGE/LnNvdXJjZSAgICAgfHwgJ3Vuc2V0JztcbiAgY29uc3QgZW52VmFyICAgICA9IGNyZWREYXRhPy5lbnZfdmFyICAgIHx8IG51bGw7XG4gIGNvbnN0IGlzTG9ja2VkICAgPSBjcmVkRGF0YT8ubG9ja2VkICAgICB8fCBmYWxzZTtcblxuICBjb25zdCBpc1NldEJhZGdlID0gaXNTZXRcbiAgICA/ICc8c3BhbiBzdHlsZT1cImRpc3BsYXk6aW5saW5lLWJsb2NrO3BhZGRpbmc6MnB4IDhweDtib3JkZXItcmFkaXVzOjk5OXB4O2JhY2tncm91bmQ6I2QxZmFlNTtjb2xvcjojMDY1ZjQ2O2ZvbnQtc2l6ZTowLjhlbTtmb250LXdlaWdodDo2MDA7XCI+JiMxMDAwMzsgS2V5IHNhdmVkPC9zcGFuPidcbiAgICA6ICc8c3BhbiBzdHlsZT1cImRpc3BsYXk6aW5saW5lLWJsb2NrO3BhZGRpbmc6MnB4IDhweDtib3JkZXItcmFkaXVzOjk5OXB4O2JhY2tncm91bmQ6I2ZlZTJlMjtjb2xvcjojOTkxYjFiO2ZvbnQtc2l6ZTowLjhlbTtmb250LXdlaWdodDo2MDA7XCI+Tm90IGNvbmZpZ3VyZWQ8L3NwYW4+JztcblxuICAvLyBTb3VyY2UgbGFiZWwgKyBcdTI0RDggdG9vbHRpcCBcdTIwMTQgbWlycm9ycyB0aGUgc2V0dGluZ3MgZGlhbG9nIHBhdHRlcm4uXG4gIGxldCBzb3VyY2VMYWJlbCA9ICcnO1xuICBsZXQgdG9vbHRpcFRleHQgPSAnJztcbiAgaWYgKHNvdXJjZSA9PT0gJ2VudicpIHtcbiAgICBzb3VyY2VMYWJlbCA9IGBTb3VyY2U6IGVudmlyb25tZW50IHZhcmlhYmxlICgke2VudlZhciB8fCAnbG9ja2VkJ30pYDtcbiAgICB0b29sdGlwVGV4dCA9IGBDdXJyZW50bHkgbG9hZGVkIGZyb20gdGhlICR7ZW52VmFyfSBlbnZpcm9ubWVudCB2YXJpYWJsZS4gYCArXG4gICAgICBgVG8gY2hhbmdlIGl0IHBlcm1hbmVudGx5LCB1cGRhdGUgeW91ciBzaGVsbCBjb25maWcgKGUuZy4gfi8uenNocmMpIGFuZCByZXN0YXJ0IHRoZSBzZXJ2ZXIuIGAgK1xuICAgICAgYFlvdSBjYW4gc3RpbGwgc2F2ZSBhIHZhbHVlIGJlbG93IFx1MjAxNCBpdCB0YWtlcyBlZmZlY3QgaW1tZWRpYXRlbHkgYnV0IHdpbGwgYmUgb3ZlcnJpZGRlbiBieSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgb24gbmV4dCByZXN0YXJ0LmA7XG4gIH0gZWxzZSBpZiAoc291cmNlID09PSAnZG90ZW52Jykge1xuICAgIHNvdXJjZUxhYmVsID0gYFNvdXJjZTogLmVudiBmaWxlICgke2VudlZhciB8fCAnbG9ja2VkJ30pYDtcbiAgICB0b29sdGlwVGV4dCA9IGBDdXJyZW50bHkgbG9hZGVkIGZyb20gJHtlbnZWYXJ9IGluIHlvdXIgLmVudiBmaWxlLiBgICtcbiAgICAgIGBUbyBjaGFuZ2UgaXQgcGVybWFuZW50bHksIGVkaXQgdGhlIC5lbnYgZmlsZSBpbiB0aGUgcHJvamVjdCBkaXJlY3RvcnkgYW5kIHJlc3RhcnQgdGhlIHNlcnZlci4gYCArXG4gICAgICBgWW91IGNhbiBzdGlsbCBzYXZlIGEgdmFsdWUgYmVsb3cgXHUyMDE0IGl0IHRha2VzIGVmZmVjdCBpbW1lZGlhdGVseSBidXQgd2lsbCBiZSBvdmVycmlkZGVuIGJ5IC5lbnYgb24gbmV4dCByZXN0YXJ0LmA7XG4gIH0gZWxzZSBpZiAoc291cmNlID09PSAnY29uZmlnJykge1xuICAgIHNvdXJjZUxhYmVsID0gJ1NvdXJjZTogY29uZmlnLnlhbWwnO1xuICAgIHRvb2x0aXBUZXh0ID0gJ1N0b3JlZCBpbiBjb25maWcueWFtbC4gVXBkYXRlIGl0IHVzaW5nIHRoZSBpbnB1dCBiZWxvdy4nO1xuICB9XG5cbiAgY29uc3QgaW5mb0ljb24gPSB0b29sdGlwVGV4dFxuICAgID8gYCA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiB0aXRsZT1cIiR7ZXNjYXBlSHRtbCh0b29sdGlwVGV4dCl9XCIgYXJpYS1sYWJlbD1cIldoZXJlIGlzIHRoaXMga2V5IHN0b3JlZD9cIiBgICtcbiAgICAgIGBzdHlsZT1cImJhY2tncm91bmQ6bm9uZTtib3JkZXI6bm9uZTtjdXJzb3I6aGVscDtjb2xvcjojNjQ3NDhiO2ZvbnQtc2l6ZTowLjg1ZW07cGFkZGluZzowIDJweDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7bGluZS1oZWlnaHQ6MTtcIj5cdTI0RDg8L2J1dHRvbj5gXG4gICAgOiAnJztcblxuICBjb25zdCBzb3VyY2VMYWJlbEh0bWwgPSBzb3VyY2VMYWJlbFxuICAgID8gYDxzcGFuIHN0eWxlPVwibWFyZ2luLWxlZnQ6MTBweDtmb250LXNpemU6MC44ZW07Y29sb3I6JHtpc0xvY2tlZCA/ICcjYjQ1MzA5JyA6ICcjNjQ3NDhiJ307XCI+JHtlc2NhcGVIdG1sKHNvdXJjZUxhYmVsKX0ke2luZm9JY29ufTwvc3Bhbj5gXG4gICAgOiAnJztcblxuICAvLyBBbWJlciB3YXJuaW5nIHdoZW4gYSBsb2NrZWQgc291cmNlIGV4aXN0cyBcdTIwMTQgaW5wdXQgcmVtYWlucyBlbmFibGVkIHNvIHRoZVxuICAvLyB1c2VyIGNhbiBzYXZlIGEgc2Vzc2lvbi9jb25maWcgb3ZlcnJpZGUsIGJ1dCB0aGUgcHJlY2VkZW5jZSBydWxlIGlzIGNsZWFyLlxuICBjb25zdCBzb3VyY2VEZXNjID0gc291cmNlID09PSAnZW52JyA/ICdlbnZpcm9ubWVudCB2YXJpYWJsZScgOiAnLmVudiBmaWxlJztcbiAgY29uc3Qgc291cmNlUmVmICA9IGVudlZhclxuICAgID8gYCR7c291cmNlRGVzY30gPGNvZGU+JHtlc2NhcGVIdG1sKGVudlZhcil9PC9jb2RlPmBcbiAgICA6IHNvdXJjZURlc2M7XG4gIGNvbnN0IGxvY2tlZFdhcm5IdG1sID0gaXNMb2NrZWRcbiAgICA/IGA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZmVmM2M3O2JvcmRlcjoxcHggc29saWQgI2Y1OWUwYjtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjhweCAxMnB4O21hcmdpbjo4cHggMDtmb250LXNpemU6MC44NWVtO2NvbG9yOiM5MjQwMGU7XCI+YCArXG4gICAgICBgXHUyNkEwIFRoaXMga2V5IGlzIGxvYWRlZCBmcm9tIHRoZSA8c3Ryb25nPiR7c291cmNlUmVmfTwvc3Ryb25nPi4gYCArXG4gICAgICBgQW55IHZhbHVlIHNhdmVkIGJlbG93IHRha2VzIGVmZmVjdCBpbW1lZGlhdGVseSBmb3IgdGhlIGN1cnJlbnQgc2Vzc2lvbiwgYnV0IHdpbGwgYmUgYCArXG4gICAgICBgPHN0cm9uZz5vdmVycmlkZGVuIGJ5IHRoZSAke3NvdXJjZURlc2N9IHdoZW4gdGhlIHNlcnZlciByZXN0YXJ0cyBvciByZWxvYWRzPC9zdHJvbmc+LjwvZGl2PmBcbiAgICA6ICcnO1xuXG4gIGNvbnN0IGdldEtleUxpbmsgPSBnZXRLZXlVcmxcbiAgICA/IGA8YSBocmVmPVwiJHtlc2NhcGVIdG1sKGdldEtleVVybCl9XCIgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiIHN0eWxlPVwiY29sb3I6IzI1NjNlYjtcIj5HZXQgeW91ciBrZXkgJiM4NTk5OzwvYT5gXG4gICAgOiAnJztcblxuICBjb250ZW50LmlubmVySFRNTCA9XG4gICAgYDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjEwcHg7XCI+YCArXG4gICAgYCAgPHN0cm9uZz4ke2VzY2FwZUh0bWwobGFiZWwpfTwvc3Ryb25nPiAke2lzU2V0QmFkZ2V9JHtzb3VyY2VMYWJlbEh0bWx9YCArXG4gICAgKGdldEtleUxpbmsgPyBgICA8c3BhbiBzdHlsZT1cIm1hcmdpbi1sZWZ0OjEwcHg7XCI+JHtnZXRLZXlMaW5rfTwvc3Bhbj5gIDogJycpICtcbiAgICBgPC9kaXY+YCArXG4gICAgKGhlbHBUZXh0ID8gYDxwIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtjb2xvcjojNDc1NTY5O21hcmdpbjowIDAgMTJweDtcIj4ke2VzY2FwZUh0bWwoaGVscFRleHQpfTwvcD5gIDogJycpICtcbiAgICBsb2NrZWRXYXJuSHRtbDtcblxuICBpZiAoYXV0aFR5cGUgPT09ICdhcGlfa2V5Jykge1xuICAgIGlmIChrZXlQYW5lbCkge1xuICAgICAga2V5UGFuZWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgaWYgKGtleUlucHV0KSB7XG4gICAgICAgIC8vIEFsd2F5cyBlbmFibGUgaW5wdXQgXHUyMDE0IHVzZXIgY2FuIHNhdmUgYSBuZXcgdmFsdWUgZXZlbiB3aGVuIGVudi9kb3RlbnYgaXMgdGhlIGN1cnJlbnRcbiAgICAgICAgLy8gc291cmNlLiBUaGUgd2FybmluZyBiYW5uZXIgYWJvdmUgY29tbXVuaWNhdGVzIHRoZSByZXN0YXJ0LXByZWNlZGVuY2UgYmVoYXZpb3VyLlxuICAgICAgICBrZXlJbnB1dC5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICBrZXlJbnB1dC5zdHlsZS5vcGFjaXR5ID0gJyc7XG4gICAgICAgIGtleUlucHV0LnBsYWNlaG9sZGVyID0gaXNTZXQgPyAnRW50ZXIgbmV3IGtleSB0byByZXBsYWNlIHRoZSBzYXZlZCBvbmUnIDogJ1Bhc3RlIHlvdXIgQVBJIGtleSBoZXJlJztcbiAgICAgICAga2V5SW5wdXQuZGF0YXNldC5wcm92aWRlciA9IHByb3ZpZGVyO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChhdXRoVHlwZSA9PT0gJ2RldmljZV9mbG93Jykge1xuICAgIGlmIChkZXZQYW5lbCkge1xuICAgICAgZGV2UGFuZWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgYXdhaXQgX3JlZnJlc2hDb3BpbG90QXV0aFN0YXR1cygpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChhdXRoVHlwZSA9PT0gJ2NsaScpIHtcbiAgICBjb250ZW50LmlubmVySFRNTCArPVxuICAgICAgYDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmMGZkZjQ7Ym9yZGVyOjFweCBzb2xpZCAjYmJmN2QwO2JvcmRlci1yYWRpdXM6NnB4O3BhZGRpbmc6MTBweCAxNHB4O2ZvbnQtc2l6ZTowLjg4ZW07XCI+YCArXG4gICAgICBgPHAgc3R5bGU9XCJtYXJnaW46MCAwIDZweDtcIj5SdW4gdGhpcyBjb21tYW5kIGluIGEgdGVybWluYWwsIHRoZW4gcmV0dXJuIGhlcmUgYW5kIGNsaWNrIDxzdHJvbmc+TmV4dDwvc3Ryb25nPjo8L3A+YCArXG4gICAgICBgPGNvZGUgc3R5bGU9XCJmb250LXNpemU6MWVtO1wiPmdoIGF1dGggbG9naW48L2NvZGU+PC9kaXY+YDtcbiAgfSBlbHNlIHtcbiAgICBjb250ZW50LmlubmVySFRNTCArPVxuICAgICAgYDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmOGZhZmM7Ym9yZGVyOjFweCBzb2xpZCAjZTJlOGYwO2JvcmRlci1yYWRpdXM6NnB4O3BhZGRpbmc6MTBweCAxNHB4O2ZvbnQtc2l6ZTowLjg4ZW07Y29sb3I6IzQ3NTU2OTtcIj5gICtcbiAgICAgIGBObyBhdXRoZW50aWNhdGlvbiByZXF1aXJlZCBmb3IgdGhpcyBwcm92aWRlci48L2Rpdj5gO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9yZWZyZXNoQ29waWxvdEF1dGhTdGF0dXMoKSB7XG4gIGNvbnN0IHN0YXR1c0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLWF1dGgtc3RhdHVzJyk7XG4gIGNvbnN0IHN0YXJ0QnRuICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1hdXRoLXN0YXJ0LWJ0bicpO1xuICBjb25zdCBsb2dvdXRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtYXV0aC1sb2dvdXQtYnRuJyk7XG4gIGNvbnN0IGNvZGVFbCAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1hdXRoLWNvZGUnKTtcbiAgY29uc3QgbGlua0VsICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLWF1dGgtbGluaycpO1xuICBpZiAoIXN0YXR1c0VsKSByZXR1cm47XG5cbiAgaWYgKGNvZGVFbCkgIGNvZGVFbC50ZXh0Q29udGVudCA9ICcnO1xuICBpZiAobGlua0VsKSAgbGlua0VsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBzdCA9IGF3YWl0IGZldGNoKCcvYXBpL2NvcGlsb3QtYXV0aC9zdGF0dXMnKS50aGVuKChyZXMpID0+IHJlcy5qc29uKCkpO1xuICAgIGlmIChzdC5hdXRoZW50aWNhdGVkKSB7XG4gICAgICBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICdBdXRoZW50aWNhdGVkIHdpdGggR2l0SHViIENvcGlsb3QuJztcbiAgICAgIGlmIChzdGFydEJ0bikgc3RhcnRCdG4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIGlmIChsb2dvdXRCdG4pIGxvZ291dEJ0bi5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICBfdXBkYXRlTGxtU3RhdHVzUGlsbCgnYXV0aGVudGljYXRlZCcsICdDb3BpbG90IHJlYWR5Jyk7XG4gICAgfSBlbHNlIGlmIChzdC5wb2xsaW5nKSB7XG4gICAgICBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICdXYWl0aW5nIGZvciBkZXZpY2UgYXBwcm92YWxcdTIwMjYnO1xuICAgICAgaWYgKHN0YXJ0QnRuKSBzdGFydEJ0bi5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICBpZiAobG9nb3V0QnRuKSBsb2dvdXRCdG4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIF91cGRhdGVMbG1TdGF0dXNQaWxsKCdwb2xsaW5nJywgJ0NvcGlsb3QgYXV0aCBwZW5kaW5nJywgJ1x1MjlENycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICdOb3QgYXV0aGVudGljYXRlZC4gU3RhcnQgc2lnbi1pbiB0byBlbmFibGUgQ29waWxvdCBPQXV0aC4nO1xuICAgICAgaWYgKHN0YXJ0QnRuKSBzdGFydEJ0bi5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICBpZiAobG9nb3V0QnRuKSBsb2dvdXRCdG4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIF91cGRhdGVMbG1TdGF0dXNQaWxsKCd1bmF1dGhlbnRpY2F0ZWQnLCAnQ29waWxvdCBub3QgYXV0aGVudGljYXRlZCcpO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnVW5hYmxlIHRvIGxvYWQgYXV0aCBzdGF0dXMuJztcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBzYXZlUHJvdmlkZXJBcGlLZXkoKSB7XG4gIGNvbnN0IGtleUlucHV0ICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1hdXRoLWtleS1pbnB1dCcpO1xuICBjb25zdCBrZXlTdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtYXV0aC1rZXktc3RhdHVzJyk7XG4gIGNvbnN0IHByb3ZpZGVyICA9IGtleUlucHV0Py5kYXRhc2V0Py5wcm92aWRlciB8fCBfbW9kZWxXaXphcmRTZWxlY3RlZFByb3ZpZGVyO1xuICBjb25zdCB2YWx1ZSAgICAgPSAoa2V5SW5wdXQ/LnZhbHVlIHx8ICcnKS50cmltKCk7XG5cbiAgaWYgKCF2YWx1ZSkge1xuICAgIGlmIChrZXlTdGF0dXMpIHsga2V5U3RhdHVzLnRleHRDb250ZW50ID0gJ1BsZWFzZSBlbnRlciBhIGtleSB2YWx1ZS4nOyBrZXlTdGF0dXMuc3R5bGUuY29sb3IgPSAnI2I5MWMxYyc7IH1cbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCFwcm92aWRlcikge1xuICAgIGlmIChrZXlTdGF0dXMpIHsga2V5U3RhdHVzLnRleHRDb250ZW50ID0gJ05vIHByb3ZpZGVyIHNlbGVjdGVkLic7IGtleVN0YXR1cy5zdHlsZS5jb2xvciA9ICcjYjkxYzFjJzsgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChrZXlTdGF0dXMpIHsga2V5U3RhdHVzLnRleHRDb250ZW50ID0gJ1NhdmluZ1x1MjAyNic7IGtleVN0YXR1cy5zdHlsZS5jb2xvciA9ICcjNDc1NTY5JzsgfVxuICB0cnkge1xuICAgIGF3YWl0IGFwaUNhbGwoJ1BPU1QnLCAnL2FwaS9zZXR0aW5ncy9jcmVkZW50aWFscycsIHsgcHJvdmlkZXIsIGtleV92YWx1ZTogdmFsdWUgfSk7XG4gICAgaWYgKGtleUlucHV0KSAga2V5SW5wdXQudmFsdWUgPSAnJztcbiAgICBpZiAoa2V5U3RhdHVzKSB7XG4gICAgICBrZXlTdGF0dXMudGV4dENvbnRlbnQgPSAnS2V5IHNhdmVkIHN1Y2Nlc3NmdWxseS4nO1xuICAgICAga2V5U3RhdHVzLnN0eWxlLmNvbG9yID0gJyMwNjVmNDYnO1xuICAgIH1cbiAgICAvLyBSZS1yZW5kZXIgYmFkZ2UgdG8gc2hvdyBrZXkgaXMgbm93IHNldFxuICAgIGF3YWl0IF9yZW5kZXJBdXRoU3RlcChwcm92aWRlcik7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoa2V5U3RhdHVzKSB7IGtleVN0YXR1cy50ZXh0Q29udGVudCA9IGBFcnJvcjogJHtlLm1lc3NhZ2UgfHwgZX1gOyBrZXlTdGF0dXMuc3R5bGUuY29sb3IgPSAnI2I5MWMxYyc7IH1cbiAgfVxufVxuXG5mdW5jdGlvbiB0b2dnbGVBcGlLZXlWaXNpYmlsaXR5KCkge1xuICBjb25zdCBpbnB1dCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtYXV0aC1rZXktaW5wdXQnKTtcbiAgY29uc3QgdG9nZ2xlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLWF1dGgta2V5LXRvZ2dsZScpO1xuICBpZiAoIWlucHV0KSByZXR1cm47XG4gIGNvbnN0IGlzSGlkZGVuID0gaW5wdXQudHlwZSA9PT0gJ3Bhc3N3b3JkJztcbiAgaW5wdXQudHlwZSA9IGlzSGlkZGVuID8gJ3RleHQnIDogJ3Bhc3N3b3JkJztcbiAgaWYgKHRvZ2dsZSkgdG9nZ2xlLnRleHRDb250ZW50ID0gaXNIaWRkZW4gPyAnXHVEODNEXHVERTQ4JyA6ICdcdUQ4M0RcdURDNDEnO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzdGFydENvcGlsb3RBdXRoRnJvbVdpemFyZCgpIHtcbiAgY29uc3Qgc3RhdHVzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtYXV0aC1zdGF0dXMnKTtcbiAgY29uc3QgY29kZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLWF1dGgtY29kZScpO1xuICBjb25zdCBsaW5rRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtYXV0aC1saW5rJyk7XG4gIGlmICghc3RhdHVzRWwgfHwgIWNvZGVFbCB8fCAhbGlua0VsKSByZXR1cm47XG5cbiAgX3Nob3dNb2RlbFdpemFyZEJ1c3koJ1N0YXJ0aW5nIEdpdEh1YiBkZXZpY2UgYXV0aG9yaXphdGlvbi4uLicpO1xuICB0cnkge1xuICAgIGNvbnN0IGZsb3dSZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9jb3BpbG90LWF1dGgvc3RhcnQnLCB7IG1ldGhvZDogJ1BPU1QnIH0pO1xuICAgIGlmICghZmxvd1Jlcy5vaykgdGhyb3cgbmV3IEVycm9yKGF3YWl0IGZsb3dSZXMudGV4dCgpKTtcbiAgICBjb25zdCBmbG93ID0gYXdhaXQgZmxvd1Jlcy5qc29uKCk7XG5cbiAgICBjb2RlRWwudGV4dENvbnRlbnQgPSBmbG93LnVzZXJfY29kZSB8fCAnJztcbiAgICBsaW5rRWwuaHJlZiA9IGZsb3cudmVyaWZpY2F0aW9uX3VyaSB8fCAnaHR0cHM6Ly9naXRodWIuY29tL2xvZ2luL2RldmljZSc7XG4gICAgbGlua0VsLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICdPcGVuIEdpdEh1YiwgZW50ZXIgdGhlIGNvZGUsIHRoZW4gcmV0dXJuIGhlcmUuJztcbiAgICB3aW5kb3cub3BlbihsaW5rRWwuaHJlZiwgJ19ibGFuaycpO1xuXG4gICAgYXdhaXQgZmV0Y2goJy9hcGkvY29waWxvdC1hdXRoL3BvbGwnLCB7IG1ldGhvZDogJ1BPU1QnIH0pO1xuICAgIF91cGRhdGVMbG1TdGF0dXNQaWxsKCdwb2xsaW5nJywgJ0NvcGlsb3QgYXV0aCBwZW5kaW5nJywgJ1x1MjlENycpO1xuICAgIGlmIChfY29waWxvdEF1dGhQb2xsVGltZXIpIGNsZWFySW50ZXJ2YWwoX2NvcGlsb3RBdXRoUG9sbFRpbWVyKTtcbiAgICBfY29waWxvdEF1dGhQb2xsVGltZXIgPSBzZXRJbnRlcnZhbChhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzdCA9IGF3YWl0IGZldGNoKCcvYXBpL2NvcGlsb3QtYXV0aC9zdGF0dXMnKS50aGVuKChyZXMpID0+IHJlcy5qc29uKCkpO1xuICAgICAgICBpZiAoc3QuYXV0aGVudGljYXRlZCkge1xuICAgICAgICAgIGNsZWFySW50ZXJ2YWwoX2NvcGlsb3RBdXRoUG9sbFRpbWVyKTtcbiAgICAgICAgICBfY29waWxvdEF1dGhQb2xsVGltZXIgPSBudWxsO1xuICAgICAgICAgIGF3YWl0IF9yZWZyZXNoQ29waWxvdEF1dGhTdGF0dXMoKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIGtlZXAgcG9sbGluZyBzaWxlbnRseSB1bnRpbCBjbG9zZVxuICAgICAgfVxuICAgIH0sIDUwMDApO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHN0YXR1c0VsLnRleHRDb250ZW50ID0gYEF1dGggc3RhcnQgZmFpbGVkOiAke2Vycm9yLm1lc3NhZ2UgfHwgZXJyb3J9YDtcbiAgfSBmaW5hbGx5IHtcbiAgICBfaGlkZU1vZGVsV2l6YXJkQnVzeSgpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxvZ291dENvcGlsb3RBdXRoRnJvbVdpemFyZCgpIHtcbiAgYXdhaXQgZmV0Y2goJy9hcGkvY29waWxvdC1hdXRoL2xvZ291dCcsIHsgbWV0aG9kOiAnUE9TVCcgfSk7XG4gIGF3YWl0IF9yZWZyZXNoQ29waWxvdEF1dGhTdGF0dXMoKTtcbn1cblxuZnVuY3Rpb24gX3dpcmVHbG9iYWxNb2RlbFNlYXJjaCgpIHtcbiAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtZ2xvYmFsLXNlYXJjaCcpO1xuICBpZiAoIWlucHV0KSByZXR1cm47XG4gIGlucHV0Lm9uaW5wdXQgPSAoKSA9PiB7XG4gICAgaWYgKF9tb2RlbERhdGFUYWJsZSAmJiB0eXBlb2YgX21vZGVsRGF0YVRhYmxlLnNlYXJjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgX21vZGVsRGF0YVRhYmxlLnNlYXJjaChpbnB1dC52YWx1ZSB8fCAnJykuZHJhdygpO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gX3JlbmRlclByb3ZpZGVyU2VsZWN0b3IoKSB7XG4gIGNvbnN0IGxpc3RFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1wcm92aWRlci1saXN0Jyk7XG4gIGlmICghbGlzdEVsIHx8ICFfbW9kZWxEYXRhKSByZXR1cm47XG5cbiAgY29uc3QgcHJvdmlkZXJzID0gQXJyYXkuaXNBcnJheShfbW9kZWxEYXRhLnByb3ZpZGVycylcbiAgICA/IF9tb2RlbERhdGEucHJvdmlkZXJzXG4gICAgOiBBcnJheS5mcm9tKG5ldyBTZXQoKF9tb2RlbERhdGEuYWxsX21vZGVscyB8fCBbXSkubWFwKHIgPT4gci5wcm92aWRlcikuZmlsdGVyKEJvb2xlYW4pKSkuc29ydCgpO1xuICBjb25zdCBjYXBhYmxlU2V0ID0gbmV3IFNldChfbW9kZWxEYXRhLmxpc3RfbW9kZWxzX2NhcGFibGUgfHwgW10pO1xuXG4gIGlmICghX21vZGVsV2l6YXJkU2VsZWN0ZWRQcm92aWRlcikge1xuICAgIF9tb2RlbFdpemFyZFNlbGVjdGVkUHJvdmlkZXIgPSBfbW9kZWxEYXRhLnByb3ZpZGVyIHx8IHByb3ZpZGVyc1swXSB8fCBudWxsO1xuICB9XG4gIGlmIChfbW9kZWxXaXphcmRTZWxlY3RlZFByb3ZpZGVyKSB7XG4gICAgX3NlbGVjdGVkTW9kZWxQcm92aWRlcnMgPSBuZXcgU2V0KFtfbW9kZWxXaXphcmRTZWxlY3RlZFByb3ZpZGVyXSk7XG4gIH1cblxuICAvLyBEaXNwb3NlIGFueSBleGlzdGluZyBCUzUgcG9wb3ZlcnMgYmVmb3JlIGNsZWFyaW5nIHRoZSBsaXN0LlxuICBsaXN0RWwucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtYnMtdG9nZ2xlPVwicG9wb3ZlclwiXScpLmZvckVhY2goZWwgPT4ge1xuICAgIHdpbmRvdy5ib290c3RyYXA/LlBvcG92ZXI/LmdldEluc3RhbmNlKGVsKT8uZGlzcG9zZSgpO1xuICB9KTtcblxuICBsaXN0RWwuaW5uZXJIVE1MID0gJyc7XG4gIHByb3ZpZGVycy5mb3JFYWNoKHByb3ZpZGVyID0+IHtcbiAgICBjb25zdCBjaGVja2VkID0gcHJvdmlkZXIgPT09IF9tb2RlbFdpemFyZFNlbGVjdGVkUHJvdmlkZXI7XG4gICAgY29uc3Qgc291cmNlTGFiZWwgPSBfcHJvdmlkZXJTdGFnZUxhYmVsKHByb3ZpZGVyLCBjYXBhYmxlU2V0KTtcbiAgICBjb25zdCBpbmZvID0gZ2V0UHJvdmlkZXJJbmZvKHByb3ZpZGVyKTtcblxuICAgIGNvbnN0IGxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGFiZWwnKTtcbiAgICBsYWJlbC5zdHlsZS5jc3NUZXh0ID0gJ2Rpc3BsYXk6ZmxleDsgYWxpZ24taXRlbXM6Y2VudGVyOyBnYXA6NnB4OyBwYWRkaW5nOjRweCA4cHg7IGJvcmRlcjoxcHggc29saWQgI2NiZDVlMTsgYm9yZGVyLXJhZGl1czo5OTlweDsgZm9udC1zaXplOjAuODJlbTsgYmFja2dyb3VuZDojZmZmOyBjdXJzb3I6cG9pbnRlcjsnO1xuICAgIGxhYmVsLmlubmVySFRNTCA9XG4gICAgICBgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJtb2RlbC1wcm92aWRlci1jaG9pY2VcIiB2YWx1ZT1cIiR7ZXNjYXBlSHRtbChwcm92aWRlcil9XCIgJHtjaGVja2VkID8gJ2NoZWNrZWQnIDogJyd9IHN0eWxlPVwibWFyZ2luOjA7XCIgLz5gICtcbiAgICAgIGA8c3Bhbj4ke2VzY2FwZUh0bWwoX3Byb3ZpZGVyRGlzcGxheUxhYmVsKHByb3ZpZGVyKSl9PC9zcGFuPmAgK1xuICAgICAgYDxzcGFuIHN0eWxlPVwiY29sb3I6IzY0NzQ4YjsgZm9udC1zaXplOjAuOGVtO1wiPigke2VzY2FwZUh0bWwoc291cmNlTGFiZWwpfSk8L3NwYW4+YDtcblxuICAgIC8vIEFwcGVuZCBhIFx1MjREOCBidXR0b24gd2lyZWQgdG8gYSBCUzUgSFRNTCBwb3BvdmVyIHNvIGxpbmtzIGluc2lkZSBhcmUgY2xpY2thYmxlLlxuICAgIGlmIChpbmZvKSB7XG4gICAgICBjb25zdCBidG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICAgIGJ0bi50eXBlID0gJ2J1dHRvbic7XG4gICAgICBidG4uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgJ1Byb3ZpZGVyIGluZm8nKTtcbiAgICAgIGJ0bi5zZXRBdHRyaWJ1dGUoJ2RhdGEtYnMtdG9nZ2xlJywgJ3BvcG92ZXInKTtcbiAgICAgIGJ0bi5zZXRBdHRyaWJ1dGUoJ2RhdGEtYnMtdHJpZ2dlcicsICdjbGljaycpO1xuICAgICAgYnRuLnNldEF0dHJpYnV0ZSgnZGF0YS1icy1wbGFjZW1lbnQnLCAncmlnaHQnKTtcbiAgICAgIGJ0bi5zZXRBdHRyaWJ1dGUoJ2RhdGEtYnMtaHRtbCcsICd0cnVlJyk7XG4gICAgICBidG4uc2V0QXR0cmlidXRlKCdkYXRhLWJzLWNvbnRhaW5lcicsICdib2R5Jyk7XG4gICAgICBidG4uc2V0QXR0cmlidXRlKCdkYXRhLWJzLWNvbnRlbnQnLCBwcm92aWRlckluZm9Qb3BvdmVyQ29udGVudChpbmZvKSk7XG4gICAgICBidG4uc3R5bGUuY3NzVGV4dCA9ICdiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOm5vbmU7Y3Vyc29yOnBvaW50ZXI7Y29sb3I6IzY0NzQ4Yjtmb250LXNpemU6MC45ZW07cGFkZGluZzowIDFweDtsaW5lLWhlaWdodDoxO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTsnO1xuICAgICAgYnRuLnRleHRDb250ZW50ID0gJ1x1MjREOCc7XG4gICAgICAvLyBQcmV2ZW50IHRoZSByYWRpby1sYWJlbCBjbGljayBmcm9tIHByb3BhZ2F0aW5nIHRvIHRoZSByYWRpbyBidXR0b24uXG4gICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBlID0+IGUuc3RvcFByb3BhZ2F0aW9uKCkpO1xuICAgICAgbGFiZWwuYXBwZW5kQ2hpbGQoYnRuKTtcblxuICAgICAgLy8gSW5pdGlhbGlzZSBhZnRlciBhcHBlbmQgXHUyMDE0IEJTNSBtdXN0IGZpbmQgdGhlIGVsZW1lbnQgaW4gdGhlIERPTS5cbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIGlmICh3aW5kb3cuYm9vdHN0cmFwPy5Qb3BvdmVyKSB7XG4gICAgICAgICAgbmV3IHdpbmRvdy5ib290c3RyYXAuUG9wb3ZlcihidG4sIHsgc2FuaXRpemU6IGZhbHNlIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBjaGVja2JveCA9IGxhYmVsLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7XG4gICAgY2hlY2tib3guYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgaWYgKCFjaGVja2JveC5jaGVja2VkKSByZXR1cm47XG4gICAgICBfbW9kZWxXaXphcmRTZWxlY3RlZFByb3ZpZGVyID0gcHJvdmlkZXI7XG4gICAgICBfc2VsZWN0ZWRNb2RlbFByb3ZpZGVycyA9IG5ldyBTZXQoW3Byb3ZpZGVyXSk7XG4gICAgICBfdXBkYXRlTW9kZWxXaXphcmROYXYoKTtcbiAgICB9KTtcblxuICAgIGxpc3RFbC5hcHBlbmRDaGlsZChsYWJlbCk7XG4gIH0pO1xuXG4gIF91cGRhdGVNb2RlbFdpemFyZE5hdigpO1xufVxuXG5mdW5jdGlvbiBfc2hvd01vZGVsV2l6YXJkQnVzeShtZXNzYWdlKSB7XG4gIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtd2l6YXJkLWJ1c3ktb3ZlcmxheScpO1xuICBjb25zdCBtZXNzYWdlRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtd2l6YXJkLWJ1c3ktbWVzc2FnZScpO1xuICBpZiAobWVzc2FnZUVsKSBtZXNzYWdlRWwudGV4dENvbnRlbnQgPSBtZXNzYWdlIHx8ICdXb3JraW5nLi4uJztcbiAgaWYgKG92ZXJsYXkpIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICdmbGV4Jztcbn1cblxuZnVuY3Rpb24gX2hpZGVNb2RlbFdpemFyZEJ1c3koKSB7XG4gIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtd2l6YXJkLWJ1c3ktb3ZlcmxheScpO1xuICBpZiAob3ZlcmxheSkgb3ZlcmxheS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xufVxuXG5mdW5jdGlvbiBfc2V0TW9kZWxXaXphcmRTdGVwKHN0ZXApIHtcbiAgX21vZGVsV2l6YXJkU3RlcCA9IFsxLCAyLCAzLCA0XS5pbmNsdWRlcyhzdGVwKSA/IHN0ZXAgOiAxO1xuICBjb25zdCBwYW5lcyA9IHtcbiAgICAxOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtc3RlcC1wcm92aWRlcicpLFxuICAgIDI6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1zdGVwLWF1dGgnKSxcbiAgICAzOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtc3RlcC1tb2RlbHMnKSxcbiAgICA0OiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtc3RlcC1zdWNjZXNzJyksXG4gIH07XG4gIE9iamVjdC5lbnRyaWVzKHBhbmVzKS5mb3JFYWNoKChbbnVtLCBlbF0pID0+IHtcbiAgICBpZiAoZWwpIGVsLnN0eWxlLmRpc3BsYXkgPSBOdW1iZXIobnVtKSA9PT0gX21vZGVsV2l6YXJkU3RlcCA/ICcnIDogJ25vbmUnO1xuICB9KTtcbiAgaWYgKF9tb2RlbFdpemFyZFN0ZXAgPT09IDIpIHtcbiAgICBfcmVuZGVyQXV0aFN0ZXAoX21vZGVsV2l6YXJkU2VsZWN0ZWRQcm92aWRlcik7XG4gIH1cbiAgX3VwZGF0ZU1vZGVsV2l6YXJkTmF2KCk7XG59XG5cbmZ1bmN0aW9uIF91cGRhdGVNb2RlbFdpemFyZFByb2dyZXNzQmFyKCkge1xuICBbMSwgMiwgMywgNF0uZm9yRWFjaCgoc3RlcE51bSkgPT4ge1xuICAgIGNvbnN0IHN0ZXBFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBtb2RlbC1wcm9ncmVzcy1zdGVwLSR7c3RlcE51bX1gKTtcbiAgICBpZiAoIXN0ZXBFbCkgcmV0dXJuO1xuICAgIGNvbnN0IGJhZGdlRWwgPSBzdGVwRWwucXVlcnlTZWxlY3RvcignLm1vZGVsLXByb2dyZXNzLWJhZGdlJyk7XG4gICAgc3RlcEVsLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWFjdGl2ZScsICdpcy1jb21wbGV0ZScsICdpcy11cGNvbWluZycpO1xuICAgIGlmIChzdGVwTnVtIDwgX21vZGVsV2l6YXJkU3RlcCkge1xuICAgICAgc3RlcEVsLmNsYXNzTGlzdC5hZGQoJ2lzLWNvbXBsZXRlJyk7XG4gICAgICBzdGVwRWwuc2V0QXR0cmlidXRlKCdhcmlhLWN1cnJlbnQnLCAnZmFsc2UnKTtcbiAgICAgIGlmIChiYWRnZUVsKSBiYWRnZUVsLnRleHRDb250ZW50ID0gJ1x1MjcxMyc7XG4gICAgfSBlbHNlIGlmIChzdGVwTnVtID09PSBfbW9kZWxXaXphcmRTdGVwKSB7XG4gICAgICBzdGVwRWwuY2xhc3NMaXN0LmFkZCgnaXMtYWN0aXZlJyk7XG4gICAgICBzdGVwRWwuc2V0QXR0cmlidXRlKCdhcmlhLWN1cnJlbnQnLCAnc3RlcCcpO1xuICAgICAgaWYgKGJhZGdlRWwpIGJhZGdlRWwudGV4dENvbnRlbnQgPSBTdHJpbmcoc3RlcE51bSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ZXBFbC5jbGFzc0xpc3QuYWRkKCdpcy11cGNvbWluZycpO1xuICAgICAgc3RlcEVsLnNldEF0dHJpYnV0ZSgnYXJpYS1jdXJyZW50JywgJ2ZhbHNlJyk7XG4gICAgICBpZiAoYmFkZ2VFbCkgYmFkZ2VFbC50ZXh0Q29udGVudCA9IFN0cmluZyhzdGVwTnVtKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBfdXBkYXRlTW9kZWxXaXphcmROYXYoKSB7XG4gIGNvbnN0IHN0ZXBMYWJlbCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtd2l6YXJkLXN0ZXAtbGFiZWwnKTtcbiAgY29uc3QgYmFja0J0biAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC13aXphcmQtYmFjay1idG4nKTtcbiAgY29uc3QgbmV4dEJ0biAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC13aXphcmQtbmV4dC1idG4nKTtcbiAgY29uc3QgdGVzdEJ0biAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC10ZXN0LWJ0bicpO1xuICBjb25zdCByZWZyZXNoQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ByaWNpbmctcmVmcmVzaC1idG4nKTtcbiAgY29uc3QgZm9vdGVyICAgICA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5tb2RlbC13aXphcmQtZm9vdGVyJyk7XG5cbiAgX3VwZGF0ZU1vZGVsV2l6YXJkUHJvZ3Jlc3NCYXIoKTtcblxuICBpZiAoc3RlcExhYmVsKSB7XG4gICAgY29uc3QgbGFiZWxzID0ge1xuICAgICAgMTogJ1N0ZXAgMSBvZiA0OiBDaG9vc2UgcHJvdmlkZXInLFxuICAgICAgMjogJ1N0ZXAgMiBvZiA0OiBTZXQgdXAgYXV0aGVudGljYXRpb24nLFxuICAgICAgMzogJ1N0ZXAgMyBvZiA0OiBDaG9vc2UgbW9kZWwgYW5kIHRlc3QgY29ubmVjdGlvbicsXG4gICAgICA0OiAnU3RlcCA0IG9mIDQ6IENvbXBsZXRlJyxcbiAgICB9O1xuICAgIHN0ZXBMYWJlbC50ZXh0Q29udGVudCA9IGxhYmVsc1tfbW9kZWxXaXphcmRTdGVwXSB8fCAnJztcbiAgfVxuXG4gIGlmIChiYWNrQnRuKSB7XG4gICAgYmFja0J0bi5kaXNhYmxlZCA9IF9tb2RlbFdpemFyZFN0ZXAgPT09IDE7XG4gICAgYmFja0J0bi5zdHlsZS5kaXNwbGF5ID0gX21vZGVsV2l6YXJkU3RlcCA9PT0gNCA/ICdub25lJyA6ICcnO1xuICB9XG4gIC8vIE5leHQgYnV0dG9uOiB2aXNpYmxlIG9uIHN0ZXBzIDEgYW5kIDJcbiAgaWYgKG5leHRCdG4pIHtcbiAgICBuZXh0QnRuLnN0eWxlLmRpc3BsYXkgPSAoX21vZGVsV2l6YXJkU3RlcCA9PT0gMSB8fCBfbW9kZWxXaXphcmRTdGVwID09PSAyKSA/ICcnIDogJ25vbmUnO1xuICAgIG5leHRCdG4uZGlzYWJsZWQgPSBfbW9kZWxXaXphcmRTdGVwID09PSAxICYmICFfbW9kZWxXaXphcmRTZWxlY3RlZFByb3ZpZGVyO1xuICAgIG5leHRCdG4udGV4dENvbnRlbnQgPSBfbW9kZWxXaXphcmRTdGVwID09PSAyID8gJ05leHQnIDogJ05leHQnO1xuICB9XG4gIGlmICh0ZXN0QnRuKSAgICB0ZXN0QnRuLnN0eWxlLmRpc3BsYXkgICAgPSBfbW9kZWxXaXphcmRTdGVwID09PSAzID8gJycgOiAnbm9uZSc7XG4gIGlmIChyZWZyZXNoQnRuKSByZWZyZXNoQnRuLnN0eWxlLmRpc3BsYXkgPSBfbW9kZWxXaXphcmRTdGVwID09PSAzID8gJycgOiAnbm9uZSc7XG4gIGlmIChmb290ZXIpIGZvb3Rlci5zdHlsZS5qdXN0aWZ5Q29udGVudCAgPSBfbW9kZWxXaXphcmRTdGVwID09PSA0ID8gJ2NlbnRlcicgOiAnc3BhY2UtYmV0d2Vlbic7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9sb2FkTW9kZWxzRm9yU2VsZWN0ZWRQcm92aWRlcigpIHtcbiAgaWYgKCFfbW9kZWxXaXphcmRTZWxlY3RlZFByb3ZpZGVyKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgbG9hZGluZ0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLW1vZGVscy1sb2FkaW5nJyk7XG4gIGlmIChsb2FkaW5nRWwpIHtcbiAgICBsb2FkaW5nRWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgIGxvYWRpbmdFbC5zdHlsZS5jb2xvciA9ICcjNDc1NTY5JztcbiAgICBsb2FkaW5nRWwuaW5uZXJIVE1MID0gJzxzcGFuIGNsYXNzPVwibG9hZGluZy1zcGlubmVyXCIgc3R5bGU9XCJ3aWR0aDoxNHB4O2hlaWdodDoxNHB4O2JvcmRlci13aWR0aDoycHg7dmVydGljYWwtYWxpZ246bWlkZGxlO21hcmdpbi1yaWdodDo2cHg7XCI+PC9zcGFuPkxvYWRpbmcgbW9kZWxzIGZvciBzZWxlY3RlZCBwcm92aWRlci4uLic7XG4gIH1cblxuICBfc2hvd01vZGVsV2l6YXJkQnVzeSgnUXVlcnlpbmcgYXZhaWxhYmxlIG1vZGVscy4uLicpO1xuICB0cnkge1xuICAgIF9zZWxlY3RlZE1vZGVsUHJvdmlkZXJzID0gbmV3IFNldChbX21vZGVsV2l6YXJkU2VsZWN0ZWRQcm92aWRlcl0pO1xuICAgIF9tb2RlbERhdGEucHJvdmlkZXIgPSBfbW9kZWxXaXphcmRTZWxlY3RlZFByb3ZpZGVyO1xuICAgIGF3YWl0IF9yZWZyZXNoTW9kZWxDYXRhbG9nRm9yU2VsZWN0aW9uKCk7XG4gICAgaWYgKGxvYWRpbmdFbCkge1xuICAgICAgbG9hZGluZ0VsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICBsb2FkaW5nRWwudGV4dENvbnRlbnQgPSAnJztcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nLndhcm4oJ0NvdWxkIG5vdCBsb2FkIG1vZGVscyBmb3Igc2VsZWN0ZWQgcHJvdmlkZXI6JywgZXJyb3IpO1xuICAgIGlmIChsb2FkaW5nRWwpIHtcbiAgICAgIGxvYWRpbmdFbC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICBsb2FkaW5nRWwudGV4dENvbnRlbnQgPSAnRmFpbGVkIHRvIGxvYWQgbW9kZWxzIGZvciBzZWxlY3RlZCBwcm92aWRlci4nO1xuICAgICAgbG9hZGluZ0VsLnN0eWxlLmNvbG9yID0gJyNiOTFjMWMnO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZmluYWxseSB7XG4gICAgX2hpZGVNb2RlbFdpemFyZEJ1c3koKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBuZXh0V2l6YXJkU3RlcCgpIHtcbiAgaWYgKF9tb2RlbFdpemFyZFN0ZXAgPT09IDEpIHtcbiAgICBpZiAoIV9tb2RlbFdpemFyZFNlbGVjdGVkUHJvdmlkZXIpIHJldHVybjtcbiAgICBfc2V0TW9kZWxXaXphcmRTdGVwKDIpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoX21vZGVsV2l6YXJkU3RlcCA9PT0gMikge1xuICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IF9sb2FkTW9kZWxzRm9yU2VsZWN0ZWRQcm92aWRlcigpO1xuICAgIGlmICghbG9hZGVkKSByZXR1cm47XG4gICAgX3NldE1vZGVsV2l6YXJkU3RlcCgzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmV2aW91c1dpemFyZFN0ZXAoKSB7XG4gIGlmIChfbW9kZWxXaXphcmRTdGVwID09PSAyKSB7IF9zZXRNb2RlbFdpemFyZFN0ZXAoMSk7IHJldHVybjsgfVxuICBpZiAoX21vZGVsV2l6YXJkU3RlcCA9PT0gMykgeyBfc2V0TW9kZWxXaXphcmRTdGVwKDIpOyByZXR1cm47IH1cbiAgaWYgKF9tb2RlbFdpemFyZFN0ZXAgPT09IDQpIHsgX3NldE1vZGVsV2l6YXJkU3RlcCgzKTsgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBfcmVmcmVzaE1vZGVsQ2F0YWxvZ0ZvclNlbGVjdGlvbigpIHtcbiAgaWYgKCFfbW9kZWxEYXRhKSByZXR1cm47XG4gIGlmIChfY2F0YWxvZ1JlZnJlc2hpbmcpIHtcbiAgICBfY2F0YWxvZ1JlZnJlc2hQZW5kaW5nID0gdHJ1ZTtcbiAgICByZXR1cm47XG4gIH1cbiAgX2NhdGFsb2dSZWZyZXNoaW5nID0gdHJ1ZTtcblxuICB0cnkge1xuICAgIGNvbnN0IHNlbGVjdGVkID0gQXJyYXkuZnJvbShfc2VsZWN0ZWRNb2RlbFByb3ZpZGVycyk7XG4gICAgaWYgKCFzZWxlY3RlZC5sZW5ndGgpIHtcbiAgICAgIF9zZWxlY3RlZE1vZGVsUHJvdmlkZXJzID0gbmV3IFNldChbX21vZGVsRGF0YS5wcm92aWRlcl0pO1xuICAgIH1cblxuICAgIGNvbnN0IHByb3ZpZGVyc1BhcmFtID0gZW5jb2RlVVJJQ29tcG9uZW50KEFycmF5LmZyb20oX3NlbGVjdGVkTW9kZWxQcm92aWRlcnMpLmpvaW4oJywnKSk7XG4gICAgY29uc3QgY2F0YWxvZyA9IGF3YWl0IGFwaUNhbGwoJ0dFVCcsIGAvYXBpL21vZGVsLWNhdGFsb2c/cHJvdmlkZXJzPSR7cHJvdmlkZXJzUGFyYW19YCk7XG4gICAgX21vZGVsRGF0YS5hbGxfbW9kZWxzID0gY2F0YWxvZy5hbGxfbW9kZWxzIHx8IFtdO1xuICAgIF9tb2RlbERhdGEucHJpY2luZ191cGRhdGVkX2F0ID0gY2F0YWxvZy5wcmljaW5nX3VwZGF0ZWRfYXQgfHwgX21vZGVsRGF0YS5wcmljaW5nX3VwZGF0ZWRfYXQ7XG4gICAgX21vZGVsRGF0YS5wcmljaW5nX3NvdXJjZSA9IGNhdGFsb2cucHJpY2luZ19zb3VyY2UgfHwgX21vZGVsRGF0YS5wcmljaW5nX3NvdXJjZTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjYXRhbG9nLnByb3ZpZGVycykgJiYgY2F0YWxvZy5wcm92aWRlcnMubGVuZ3RoKSB7XG4gICAgICBfbW9kZWxEYXRhLnByb3ZpZGVycyA9IGNhdGFsb2cucHJvdmlkZXJzO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShjYXRhbG9nLmxpc3RfbW9kZWxzX2NhcGFibGUpKSB7XG4gICAgICBfbW9kZWxEYXRhLmxpc3RfbW9kZWxzX2NhcGFibGUgPSBjYXRhbG9nLmxpc3RfbW9kZWxzX2NhcGFibGU7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy53YXJuKCdDb3VsZCBub3QgcmVmcmVzaCBtb2RlbCBjYXRhbG9nIGZvciBzZWxlY3RlZCBwcm92aWRlcnM6JywgZXJyb3IpO1xuICB9IGZpbmFsbHkge1xuICAgIF9jYXRhbG9nUmVmcmVzaGluZyA9IGZhbHNlO1xuICB9XG5cbiAgX3JlbmRlclByb3ZpZGVyU2VsZWN0b3IoKTtcbiAgX2J1aWxkTW9kZWxUYWJsZSgpO1xuXG4gIGlmIChfY2F0YWxvZ1JlZnJlc2hQZW5kaW5nKSB7XG4gICAgX2NhdGFsb2dSZWZyZXNoUGVuZGluZyA9IGZhbHNlO1xuICAgIGF3YWl0IF9yZWZyZXNoTW9kZWxDYXRhbG9nRm9yU2VsZWN0aW9uKCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gb3Blbk1vZGVsTW9kYWwoKSB7XG4gIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtbW9kYWwtb3ZlcmxheScpO1xuICBpZiAoIW92ZXJsYXkpIHJldHVybjtcblxuICBpZiAoIV9tb2RlbERhdGEpIHtcbiAgICBhd2FpdCBsb2FkTW9kZWxTZWxlY3RvcigpO1xuICB9XG4gIGF3YWl0IGxvYWRQcm92aWRlckluZm8oKTtcbiAgaWYgKCFfbW9kZWxXaXphcmRTZWxlY3RlZFByb3ZpZGVyKSB7XG4gICAgX21vZGVsV2l6YXJkU2VsZWN0ZWRQcm92aWRlciA9IF9tb2RlbERhdGE/LnByb3ZpZGVyIHx8IG51bGw7XG4gIH1cbiAgY29uc3Qgc3VjY2Vzc1N1bW1hcnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtc3VjY2Vzcy1zdW1tYXJ5Jyk7XG4gIGlmIChzdWNjZXNzU3VtbWFyeSkge1xuICAgIHN1Y2Nlc3NTdW1tYXJ5LnRleHRDb250ZW50ID0gJ1Byb3ZpZGVyIGFuZCBtb2RlbCBhcmUgY29uZmlndXJlZCBhbmQgdGhlIGNvbm5lY3Rpb24gY2hlY2sgc3VjY2VlZGVkLic7XG4gIH1cbiAgX3JlbmRlclByb3ZpZGVyU2VsZWN0b3IoKTtcbiAgX3N5bmNDYXRhbG9nVmlzaWJpbGl0eSgpO1xuICBfd2lyZUdsb2JhbE1vZGVsU2VhcmNoKCk7XG4gIF9zZXRNb2RlbFdpemFyZFN0ZXAoMSk7XG4gIF9oaWRlTW9kZWxXaXphcmRCdXN5KCk7XG4gIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgX2ZvY3VzU3RhY2sucHVzaChkb2N1bWVudC5hY3RpdmVFbGVtZW50KTtcbiAgc2V0SW5pdGlhbEZvY3VzKCdtb2RlbC1tb2RhbC1vdmVybGF5Jyk7XG4gIHRyYXBGb2N1cygnbW9kZWwtbW9kYWwtb3ZlcmxheScpO1xufVxuXG5mdW5jdGlvbiBjbG9zZU1vZGVsTW9kYWwoKSB7XG4gIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtbW9kYWwtb3ZlcmxheScpO1xuICBpZiAob3ZlcmxheSkgb3ZlcmxheS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBfc2V0TW9kZWxXaXphcmRTdGVwKDEpO1xuICBfaGlkZU1vZGVsV2l6YXJkQnVzeSgpO1xuICBpZiAoX2NvcGlsb3RBdXRoUG9sbFRpbWVyKSB7XG4gICAgY2xlYXJJbnRlcnZhbChfY29waWxvdEF1dGhQb2xsVGltZXIpO1xuICAgIF9jb3BpbG90QXV0aFBvbGxUaW1lciA9IG51bGw7XG4gIH1cbiAgcmVzdG9yZUZvY3VzKCk7XG59XG5cbmZ1bmN0aW9uIF9hcHBseU1vZGVsUm93VmlzdWFsU3RhdGUodHIsIGlzQWN0aXZlKSB7XG4gIHRyLmNsYXNzTGlzdC50b2dnbGUoJ21vZGVsLXJvdy1hY3RpdmUnLCBpc0FjdGl2ZSk7XG4gIHRyLnN0eWxlLmNzc1RleHQgPSBpc0FjdGl2ZVxuICAgID8gJ2JhY2tncm91bmQ6I2VmZjZmZjsgZm9udC13ZWlnaHQ6NjAwOyBjdXJzb3I6cG9pbnRlcjsnXG4gICAgOiAnY3Vyc29yOnBvaW50ZXI7JztcblxuICBjb25zdCBtb2RlbCA9IHRyLmdldEF0dHJpYnV0ZSgnZGF0YS1tb2RlbCcpIHx8ICcnO1xuICBjb25zdCBtb2RlbENlbGwgPSB0ci5jZWxscyAmJiB0ci5jZWxsc1sxXTtcbiAgaWYgKG1vZGVsQ2VsbCkge1xuICAgIG1vZGVsQ2VsbC5pbm5lckhUTUwgPSBgJHtlc2NhcGVIdG1sKG1vZGVsKX1gICtcbiAgICAgIChpc0FjdGl2ZSA/ICcgPHNwYW4gc3R5bGU9XCJjb2xvcjojM2I4MmY2OyBmb250LXNpemU6MC43NWVtO1wiPiYjMTAwMDM7IGFjdGl2ZTwvc3Bhbj4nIDogJycpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9zeW5jTW9kZWxUYWJsZVNlbGVjdGlvbigpIHtcbiAgY29uc3QgdGJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtdGFibGUtYm9keScpO1xuICBpZiAoIXRib2R5IHx8ICFfbW9kZWxEYXRhKSByZXR1cm47XG5cbiAgY29uc3QgYWN0aXZlUHJvdmlkZXIgPSBfbW9kZWxEYXRhLnByb3ZpZGVyO1xuICBjb25zdCBhY3RpdmVNb2RlbCA9IF9tb2RlbERhdGEubW9kZWw7XG4gIHRib2R5LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RyJykuZm9yRWFjaCh0ciA9PiB7XG4gICAgY29uc3QgaXNBY3RpdmUgPSAoXG4gICAgICB0ci5nZXRBdHRyaWJ1dGUoJ2RhdGEtcHJvdmlkZXInKSA9PT0gYWN0aXZlUHJvdmlkZXIgJiZcbiAgICAgIHRyLmdldEF0dHJpYnV0ZSgnZGF0YS1tb2RlbCcpID09PSBhY3RpdmVNb2RlbFxuICAgICk7XG4gICAgX2FwcGx5TW9kZWxSb3dWaXN1YWxTdGF0ZSh0ciwgaXNBY3RpdmUpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gX2J1aWxkTW9kZWxUYWJsZSgpIHtcbiAgY29uc3QgdGJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtdGFibGUtYm9keScpO1xuICBjb25zdCB0aGVhZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC10YWJsZS1oZWFkJyk7XG4gIGlmICghdGJvZHkgfHwgIV9tb2RlbERhdGEpIHJldHVybjtcblxuICBjb25zdCBjdXJyZW50UHJvdmlkZXIgPSBfbW9kZWxEYXRhLnByb3ZpZGVyO1xuICBjb25zdCBjdXJyZW50TW9kZWwgICAgPSBfbW9kZWxEYXRhLm1vZGVsO1xuXG4gIC8vIEZpeGVkIDctY29sdW1uIGhlYWRlcnMgXHUyMDE0IG5vIGR5bmFtaWMgcmVidWlsZGluZyBuZWVkZWRcbiAgaWYgKHRoZWFkKSB7XG4gICAgY29uc3QgdGhTID0gJ3BhZGRpbmc6MTBweCAxNHB4OyB3aGl0ZS1zcGFjZTpub3dyYXA7JztcbiAgICB0aGVhZC5pbm5lckhUTUwgPVxuICAgICAgYDx0ciBzdHlsZT1cImJhY2tncm91bmQ6I2YxZjVmOTsgdGV4dC1hbGlnbjpsZWZ0O1wiPmAgK1xuICAgICAgICBgPHRoIHN0eWxlPVwiJHt0aFN9XCI+UHJvdmlkZXI8L3RoPmAgK1xuICAgICAgICBgPHRoIHN0eWxlPVwiJHt0aFN9XCI+TW9kZWw8L3RoPmAgK1xuICAgICAgICBgPHRoIHN0eWxlPVwiJHt0aFN9IHRleHQtYWxpZ246cmlnaHQ7XCI+Q29udGV4dDwvdGg+YCArXG4gICAgICAgIGA8dGggc3R5bGU9XCIke3RoU30gdGV4dC1hbGlnbjpyaWdodDtcIiB0aXRsZT1cIlVTRCBwZXIgMU0gaW5wdXQgdG9rZW5zIChkaXJlY3QgQVBJIGJpbGxpbmcpXCI+JC8xTSBpbjwvdGg+YCArXG4gICAgICAgIGA8dGggc3R5bGU9XCIke3RoU30gdGV4dC1hbGlnbjpyaWdodDtcIiB0aXRsZT1cIlVTRCBwZXIgMU0gb3V0cHV0IHRva2VucyAoZGlyZWN0IEFQSSBiaWxsaW5nKVwiPiQvMU0gb3V0PC90aD5gICtcbiAgICAgICAgYDx0aCBzdHlsZT1cIiR7dGhTfSB0ZXh0LWFsaWduOnJpZ2h0O1wiIHRpdGxlPVwiR2l0SHViIENvcGlsb3QgcHJlbWl1bS1yZXF1ZXN0IG11bHRpcGxpZXIgKDAgPSBmcmVlIGZvciBwYWlkIHN1YnNjcmliZXJzKVwiPkNvcGlsb3Q8L3RoPmAgK1xuICAgICAgICBgPHRoIHN0eWxlPVwiJHt0aFN9XCI+U291cmNlPC90aD5gICtcbiAgICAgICAgYDx0aCBzdHlsZT1cIiR7dGhTfVwiPk5vdGVzPC90aD5gICtcbiAgICAgIGA8L3RyPmA7XG4gIH1cblxuICAvLyBUZWFyIGRvd24gYW55IGV4aXN0aW5nIERhdGFUYWJsZSBiZWZvcmUgcmVidWlsZGluZyByb3dzLlxuICBpZiAod2luZG93LiQgJiYgJC5mbiAmJiAkLmZuLkRhdGFUYWJsZSAmJiAkLmZuLkRhdGFUYWJsZS5pc0RhdGFUYWJsZSgnI21vZGVsLXRhYmxlJykpIHtcbiAgICB0cnkge1xuICAgICAgX21vZGVsRGF0YVRhYmxlID0gJCgnI21vZGVsLXRhYmxlJykuRGF0YVRhYmxlKCk7XG4gICAgICBfbW9kZWxEYXRhVGFibGUuZGVzdHJveSgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZy53YXJuKCdEYXRhVGFibGUuZGVzdHJveSgpIGZhaWxlZCAodGFibGUgbWF5IGFscmVhZHkgYmUgdG9ybiBkb3duKTonLCBlKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgX21vZGVsRGF0YVRhYmxlID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvLyBQcmVmZXIgY3Jvc3MtcHJvdmlkZXIgbGlzdDsgZmFsbCBiYWNrIHRvIGN1cnJlbnQtcHJvdmlkZXIgYXZhaWxhYmxlIGxpc3RcbiAgbGV0IHJvd3MgPSAoX21vZGVsRGF0YS5hbGxfbW9kZWxzICYmIF9tb2RlbERhdGEuYWxsX21vZGVscy5sZW5ndGgpXG4gICAgPyBfbW9kZWxEYXRhLmFsbF9tb2RlbHMuZmlsdGVyKHIgPT4gci5tb2RlbClcbiAgICA6IChfbW9kZWxEYXRhLmF2YWlsYWJsZSB8fCBbXSkubWFwKHIgPT5cbiAgICAgICAgdHlwZW9mIHIgPT09ICdvYmplY3QnXG4gICAgICAgICAgPyB7IC4uLnIsIHByb3ZpZGVyOiBjdXJyZW50UHJvdmlkZXIgfVxuICAgICAgICAgIDogeyBtb2RlbDogciwgcHJvdmlkZXI6IGN1cnJlbnRQcm92aWRlciB9XG4gICAgICApO1xuXG4gIF9yZW5kZXJRdWlja01vZGVsTGlzdChyb3dzKTtcbiAgdGJvZHkuaW5uZXJIVE1MID0gJyc7XG4gIGNvbnN0IHRkQmFzZSAgPSAncGFkZGluZzo5cHggMTRweDsgYm9yZGVyLWJvdHRvbToxcHggc29saWQgI2UyZThmMDsnO1xuICBjb25zdCBmbXRDb3N0ID0gdiA9PiAodiAhPSBudWxsKSA/ICckJyArIE51bWJlcih2KS50b0ZpeGVkKHYgPCAxID8gMyA6IDIpIDogJ1x1MjAxNCc7XG4gIGNvbnN0IGZtdFByaWNlSGludCA9IHNvdXJjZSA9PiB7XG4gICAgaWYgKHNvdXJjZSA9PT0gJ3J1bnRpbWVfY2FjaGUnKSB7XG4gICAgICByZXR1cm4gJzxzcGFuIHRpdGxlPVwiUHJpY2UgZnJvbSBydW50aW1lIGNhY2hlXCIgc3R5bGU9XCJtYXJnaW4tbGVmdDo2cHg7IGRpc3BsYXk6aW5saW5lLWJsb2NrOyBwYWRkaW5nOjFweCA1cHg7IGJvcmRlci1yYWRpdXM6OTk5cHg7IGJhY2tncm91bmQ6I2VjZmVmZjsgY29sb3I6IzBmNzY2ZTsgZm9udC1zaXplOjAuNzJlbTsgZm9udC13ZWlnaHQ6NjAwOyB2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7XCI+Y2FjaGU8L3NwYW4+JztcbiAgICB9XG4gICAgcmV0dXJuICc8c3BhbiB0aXRsZT1cIlByaWNlIGZyb20gc3RhdGljIGJhc2VsaW5lXCIgc3R5bGU9XCJtYXJnaW4tbGVmdDo2cHg7IGRpc3BsYXk6aW5saW5lLWJsb2NrOyBwYWRkaW5nOjFweCA1cHg7IGJvcmRlci1yYWRpdXM6OTk5cHg7IGJhY2tncm91bmQ6I2Y4ZmFmYzsgY29sb3I6IzY0NzQ4YjsgZm9udC1zaXplOjAuNzJlbTsgZm9udC13ZWlnaHQ6NjAwOyB2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7XCI+c3RhdGljPC9zcGFuPic7XG4gIH07XG4gIGNvbnN0IGZtdFNvdXJjZSA9IHMgPT4ge1xuICAgIGlmIChzID09PSAnbGlzdF9tb2RlbHMnKSB7XG4gICAgICByZXR1cm4gJzxzcGFuIHN0eWxlPVwiZGlzcGxheTppbmxpbmUtYmxvY2s7IHBhZGRpbmc6MnB4IDZweDsgYm9yZGVyLXJhZGl1czo5OTlweDsgYmFja2dyb3VuZDojZWNmZWZmOyBjb2xvcjojMGY3NjZlOyBmb250LXNpemU6MC43OGVtOyBmb250LXdlaWdodDo2MDA7XCI+bGlzdF9tb2RlbHM8L3NwYW4+JztcbiAgICB9XG4gICAgcmV0dXJuICc8c3BhbiBzdHlsZT1cImRpc3BsYXk6aW5saW5lLWJsb2NrOyBwYWRkaW5nOjJweCA2cHg7IGJvcmRlci1yYWRpdXM6OTk5cHg7IGJhY2tncm91bmQ6I2YxZjVmOTsgY29sb3I6IzQ3NTU2OTsgZm9udC1zaXplOjAuNzhlbTsgZm9udC13ZWlnaHQ6NjAwO1wiPmZhbGxiYWNrX3N0YXRpYzwvc3Bhbj4nO1xuICB9O1xuICBjb25zdCBmbXRNdWx0ID0gdiA9PiB7XG4gICAgaWYgKHYgPT0gbnVsbCkgcmV0dXJuICdcdTIwMTQnO1xuICAgIGlmICh2ID09PSAwKSAgIHJldHVybiAnPHNwYW4gc3R5bGU9XCJjb2xvcjojMTZhMzRhOyBmb250LXdlaWdodDo2MDA7XCI+ZnJlZTwvc3Bhbj4nO1xuICAgIHJldHVybiBOdW1iZXIodikudG9GaXhlZCh2ICUgMSA9PT0gMCA/IDAgOiAyKSArICcmdGltZXM7JztcbiAgfTtcblxuICByb3dzLmZvckVhY2goaXRlbSA9PiB7XG4gICAgY29uc3QgcHJvdmlkZXIgICA9IGl0ZW0ucHJvdmlkZXIgfHwgY3VycmVudFByb3ZpZGVyO1xuICAgIGNvbnN0IG0gICAgICAgICAgPSBpdGVtLm1vZGVsO1xuICAgIGNvbnN0IGN0eCAgICAgICAgPSBpdGVtLmNvbnRleHRfd2luZG93ID8gTnVtYmVyKGl0ZW0uY29udGV4dF93aW5kb3cpLnRvTG9jYWxlU3RyaW5nKCkgOiAnXHUyMDE0JztcbiAgICBjb25zdCBzb3VyY2UgICAgID0gaXRlbS5zb3VyY2UgfHwgJ2ZhbGxiYWNrX3N0YXRpYyc7XG4gICAgY29uc3QgcHJpY2VTb3VyY2UgPSBpdGVtLnByaWNlX3NvdXJjZSB8fCAnc3RhdGljX2Jhc2VsaW5lJztcbiAgICBjb25zdCBub3RlcyAgICAgID0gaXRlbS5ub3RlcyB8fCAnJztcbiAgICBjb25zdCBpc1NlbGVjdGVkID0gKHByb3ZpZGVyID09PSBjdXJyZW50UHJvdmlkZXIgJiYgbSA9PT0gY3VycmVudE1vZGVsKTtcblxuICAgIGNvbnN0IHRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTtcbiAgICB0ci5zZXRBdHRyaWJ1dGUoJ2RhdGEtcHJvdmlkZXInLCBwcm92aWRlcik7XG4gICAgdHIuc2V0QXR0cmlidXRlKCdkYXRhLW1vZGVsJywgbSk7XG4gICAgX2FwcGx5TW9kZWxSb3dWaXN1YWxTdGF0ZSh0ciwgaXNTZWxlY3RlZCk7XG4gICAgdHIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgKCkgPT4ge1xuICAgICAgaWYgKCF0ci5jbGFzc0xpc3QuY29udGFpbnMoJ21vZGVsLXJvdy1hY3RpdmUnKSkgdHIuc3R5bGUuYmFja2dyb3VuZCA9ICcjZjhmYWZjJztcbiAgICB9KTtcbiAgICB0ci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsICgpID0+IHtcbiAgICAgIGlmICghdHIuY2xhc3NMaXN0LmNvbnRhaW5zKCdtb2RlbC1yb3ctYWN0aXZlJykpIHRyLnN0eWxlLmJhY2tncm91bmQgPSAnJztcbiAgICB9KTtcblxuICAgIHRyLmlubmVySFRNTCA9XG4gICAgICBgPHRkIHN0eWxlPVwiJHt0ZEJhc2V9IGNvbG9yOiM2NDc0OGI7IHdoaXRlLXNwYWNlOm5vd3JhcDtcIj4ke2VzY2FwZUh0bWwoX3Byb3ZpZGVyRGlzcGxheUxhYmVsKHByb3ZpZGVyKSl9PC90ZD5gICtcbiAgICAgIGA8dGQgc3R5bGU9XCIke3RkQmFzZX1cIj4ke2VzY2FwZUh0bWwobSl9PC90ZD5gICtcbiAgICAgIGA8dGQgc3R5bGU9XCIke3RkQmFzZX0gd2hpdGUtc3BhY2U6bm93cmFwOyB0ZXh0LWFsaWduOnJpZ2h0OyBmb250LXZhcmlhbnQtbnVtZXJpYzp0YWJ1bGFyLW51bXM7XCI+JHtjdHh9PC90ZD5gICtcbiAgICAgIGA8dGQgc3R5bGU9XCIke3RkQmFzZX0gdGV4dC1hbGlnbjpyaWdodDsgZm9udC12YXJpYW50LW51bWVyaWM6dGFidWxhci1udW1zOyB3aGl0ZS1zcGFjZTpub3dyYXA7XCI+JHtmbXRDb3N0KGl0ZW0uY29zdF9pbnB1dCl9JHtmbXRQcmljZUhpbnQocHJpY2VTb3VyY2UpfTwvdGQ+YCArXG4gICAgICBgPHRkIHN0eWxlPVwiJHt0ZEJhc2V9IHRleHQtYWxpZ246cmlnaHQ7IGZvbnQtdmFyaWFudC1udW1lcmljOnRhYnVsYXItbnVtczsgd2hpdGUtc3BhY2U6bm93cmFwO1wiPiR7Zm10Q29zdChpdGVtLmNvc3Rfb3V0cHV0KX0ke2ZtdFByaWNlSGludChwcmljZVNvdXJjZSl9PC90ZD5gICtcbiAgICAgIGA8dGQgc3R5bGU9XCIke3RkQmFzZX0gdGV4dC1hbGlnbjpyaWdodDsgZm9udC12YXJpYW50LW51bWVyaWM6dGFidWxhci1udW1zOyB3aGl0ZS1zcGFjZTpub3dyYXA7XCI+JHtmbXRNdWx0KGl0ZW0uY29waWxvdF9tdWx0aXBsaWVyKX08L3RkPmAgK1xuICAgICAgYDx0ZCBzdHlsZT1cIiR7dGRCYXNlfSB3aGl0ZS1zcGFjZTpub3dyYXA7XCI+JHtmbXRTb3VyY2Uoc291cmNlKX08L3RkPmAgK1xuICAgICAgYDx0ZCBzdHlsZT1cIiR7dGRCYXNlfSBjb2xvcjojNjQ3NDhiO1wiPiR7ZXNjYXBlSHRtbChub3Rlcyl9PC90ZD5gO1xuICAgIHRib2R5LmFwcGVuZENoaWxkKHRyKTtcbiAgfSk7XG5cbiAgLy8gUmViaW5kIHJvdyBjbGljayB1c2luZyBkZWxlZ2F0aW9uIHNvIHNvcnRpbmcvZmlsdGVyIHJlZHJhd3Mgc3RpbGwgd29yay5cbiAgdGJvZHkub25jbGljayA9IGFzeW5jIChldmVudCkgPT4ge1xuICAgIGNvbnN0IHRyID0gZXZlbnQudGFyZ2V0LmNsb3Nlc3QoJ3RyJyk7XG4gICAgaWYgKCF0cikgcmV0dXJuO1xuICAgIGNvbnN0IHByb3ZpZGVyID0gdHIuZ2V0QXR0cmlidXRlKCdkYXRhLXByb3ZpZGVyJyk7XG4gICAgY29uc3QgbW9kZWwgPSB0ci5nZXRBdHRyaWJ1dGUoJ2RhdGEtbW9kZWwnKTtcbiAgICBpZiAoIW1vZGVsKSByZXR1cm47XG5cbiAgICAvLyBJbW1lZGlhdGUgZmVlZGJhY2sgd2hpbGUgdGhlIEFQSSBjYWxsIGlzIGluLWZsaWdodFxuICAgIHRyLnN0eWxlLmNzc1RleHQgPSAnYmFja2dyb3VuZDojZmVmM2M3OyBjdXJzb3I6d2FpdDsgb3BhY2l0eTowLjg1Oyc7XG4gICAgY29uc3QgbW9kZWxDZWxsID0gdHIuY2VsbHMgJiYgdHIuY2VsbHNbMV07XG4gICAgaWYgKG1vZGVsQ2VsbCkge1xuICAgICAgbW9kZWxDZWxsLmlubmVySFRNTCA9XG4gICAgICAgIGA8c3BhbiBjbGFzcz1cImxvYWRpbmctc3Bpbm5lclwiIHN0eWxlPVwid2lkdGg6MTRweDtoZWlnaHQ6MTRweDtib3JkZXItd2lkdGg6MnB4O3ZlcnRpY2FsLWFsaWduOm1pZGRsZTttYXJnaW4tcmlnaHQ6NnB4O1wiPjwvc3Bhbj4ke2VzY2FwZUh0bWwobW9kZWwpfWA7XG4gICAgfVxuICAgIGNvbnN0IHN0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC10ZXN0LXN0YXR1cycpO1xuICAgIGlmIChzdGF0dXMpIHtcbiAgICAgIHN0YXR1cy5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICBzdGF0dXMuc3R5bGUuY29sb3IgICA9ICcjOTI0MDBlJztcbiAgICAgIHN0YXR1cy5pbm5lckhUTUwgICAgID1cbiAgICAgICAgYDxzcGFuIGNsYXNzPVwibG9hZGluZy1zcGlubmVyXCIgc3R5bGU9XCJ3aWR0aDoxNHB4O2hlaWdodDoxNHB4O2JvcmRlci13aWR0aDoycHg7dmVydGljYWwtYWxpZ246bWlkZGxlO21hcmdpbi1yaWdodDo2cHg7XCI+PC9zcGFuPiBTd2l0Y2hpbmcgdG8gJHtlc2NhcGVIdG1sKG1vZGVsKX1cXHUyMDI2YDtcbiAgICB9XG5cbiAgICBhd2FpdCBzZXRNb2RlbChtb2RlbCwgcHJvdmlkZXIpO1xuICB9O1xuXG4gIC8vIEVuaGFuY2Ugd2l0aCBEYXRhVGFibGVzIGZvciBzb3J0aW5nL3NlYXJjaGluZzsga2VlcCBwYWdpbmcgZGlzYWJsZWQuXG4gIGlmICh3aW5kb3cuJCAmJiAkLmZuICYmICQuZm4uRGF0YVRhYmxlKSB7XG4gICAgX21vZGVsRGF0YVRhYmxlID0gJCgnI21vZGVsLXRhYmxlJykuRGF0YVRhYmxlKHtcbiAgICAgIHBhZ2luZzogZmFsc2UsXG4gICAgICBzZWFyY2hpbmc6IHRydWUsXG4gICAgICBpbmZvOiBmYWxzZSxcbiAgICAgIG9yZGVyQ2VsbHNUb3A6IHRydWUsXG4gICAgICBvcmRlcjogW1swLCAnYXNjJ10sIFsxLCAnYXNjJ11dLFxuICAgICAgYXV0b1dpZHRoOiBmYWxzZSxcbiAgICAgIGxhbmd1YWdlOiB7IHNlYXJjaDogJ0ZpbHRlcjonIH0sXG4gICAgICBpbml0Q29tcGxldGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICBjb25zdCBhcGkgPSB0aGlzLmFwaSgpO1xuICAgICAgICBjb25zdCAkdGhlYWQgPSAkKCcjbW9kZWwtdGFibGUgdGhlYWQnKTtcbiAgICAgICAgY29uc3QgaGFzRmlsdGVyUm93ID0gJHRoZWFkLmZpbmQoJ3RyLm1vZGVsLWZpbHRlci1yb3cnKS5sZW5ndGggPiAwO1xuICAgICAgICBpZiAoIWhhc0ZpbHRlclJvdykge1xuICAgICAgICAgIGNvbnN0ICRmaWx0ZXJSb3cgPSAkKCc8dHIgY2xhc3M9XCJtb2RlbC1maWx0ZXItcm93XCI+PC90cj4nKTtcbiAgICAgICAgICBhcGkuY29sdW1ucygpLmV2ZXJ5KGZ1bmN0aW9uKGNvbElkeCkge1xuICAgICAgICAgICAgY29uc3QgdGl0bGUgPSAkKGFwaS5jb2x1bW4oY29sSWR4KS5oZWFkZXIoKSkudGV4dCgpLnRyaW0oKTtcbiAgICAgICAgICAgIGNvbnN0ICR0aCA9ICQoJzx0aCBzdHlsZT1cInBhZGRpbmc6NnB4IDEwcHg7IGJhY2tncm91bmQ6I2Y4ZmFmYzsgYm9yZGVyLXRvcDoxcHggc29saWQgI2UyZThmMDtcIj48L3RoPicpO1xuICAgICAgICAgICAgY29uc3QgJGlucHV0ID0gJCgnPGlucHV0PicsIHtcbiAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogdGl0bGUsXG4gICAgICAgICAgICAgIHN0eWxlOiAnd2lkdGg6MTAwJTsgcGFkZGluZzo0cHggNnB4OyBib3JkZXI6MXB4IHNvbGlkICNjYmQ1ZTE7IGJvcmRlci1yYWRpdXM6NHB4OyBmb250LXNpemU6MC44MmVtOycsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICR0aC5hcHBlbmQoJGlucHV0KTtcbiAgICAgICAgICAgICRmaWx0ZXJSb3cuYXBwZW5kKCR0aCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgJHRoZWFkLmFwcGVuZCgkZmlsdGVyUm93KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFwaS5jb2x1bW5zKCkuZXZlcnkoZnVuY3Rpb24oY29sSWR4KSB7XG4gICAgICAgICAgY29uc3QgJGlucHV0ID0gJCgnI21vZGVsLXRhYmxlIHRoZWFkIHRyLm1vZGVsLWZpbHRlci1yb3cgdGgnKS5lcShjb2xJZHgpLmZpbmQoJ2lucHV0Jyk7XG4gICAgICAgICAgaWYgKCEkaW5wdXQubGVuZ3RoKSByZXR1cm47XG4gICAgICAgICAgJGlucHV0Lm9mZignY2xpY2subW9kZWxGaWx0ZXIga2V5dXAubW9kZWxGaWx0ZXIgY2hhbmdlLm1vZGVsRmlsdGVyJyk7XG4gICAgICAgICAgJGlucHV0Lm9uKCdjbGljay5tb2RlbEZpbHRlcicsIGZ1bmN0aW9uKGV2ZW50KSB7IGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyB9KTtcbiAgICAgICAgICAkaW5wdXQub24oJ2tleXVwLm1vZGVsRmlsdGVyIGNoYW5nZS5tb2RlbEZpbHRlcicsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgICAgICAgICAgaWYgKGFwaS5jb2x1bW4oY29sSWR4KS5zZWFyY2goKSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgICAgYXBpLmNvbHVtbihjb2xJZHgpLnNlYXJjaCh2YWx1ZSkuZHJhdygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBfc3luY01vZGVsVGFibGVTZWxlY3Rpb24oKTtcblxuICAvLyBVcGRhdGUgcHJpY2luZyBmcmVzaG5lc3MgZm9vdGVyXG4gIF91cGRhdGVQcmljaW5nRm9vdGVyKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldE1vZGVsKG1vZGVsLCBwcm92aWRlcikge1xuICBpZiAoIW1vZGVsKSByZXR1cm47XG4gIF9zaG93TW9kZWxXaXphcmRCdXN5KGBBcHBseWluZyBtb2RlbCAke21vZGVsfS4uLmApO1xuICB0cnkge1xuICAgIGNvbnN0IHBheWxvYWQgPSBwcm92aWRlciA/IHsgbW9kZWwsIHByb3ZpZGVyIH0gOiB7IG1vZGVsIH07XG4gICAgYXdhaXQgYXBpQ2FsbCgnUE9TVCcsICcvYXBpL21vZGVsJywgcGF5bG9hZCk7XG4gICAgaWYgKF9tb2RlbERhdGEpIHtcbiAgICAgIF9tb2RlbERhdGEubW9kZWwgPSBtb2RlbDtcbiAgICAgIGlmIChwcm92aWRlcikgX21vZGVsRGF0YS5wcm92aWRlciA9IHByb3ZpZGVyO1xuICAgIH1cbiAgICBjb25zdCBlZmZlY3RpdmVQcm92aWRlciA9IChfbW9kZWxEYXRhICYmIF9tb2RlbERhdGEucHJvdmlkZXIpIHx8IHByb3ZpZGVyO1xuICAgIGNvbnN0IGxhYmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLWN1cnJlbnQtbGFiZWwnKTtcbiAgICBpZiAobGFiZWwpIHtcbiAgICAgIGxhYmVsLnRleHRDb250ZW50ID0gZWZmZWN0aXZlUHJvdmlkZXIgPyBgJHtlZmZlY3RpdmVQcm92aWRlcn0gXHUwMEI3ICR7bW9kZWx9YCA6IG1vZGVsO1xuICAgIH1cbiAgICBfYXBwZW5kUmVjZW50TW9kZWwoZWZmZWN0aXZlUHJvdmlkZXIsIG1vZGVsKTtcbiAgICBfc3luY01vZGVsVGFibGVTZWxlY3Rpb24oKTtcbiAgICBfcmVuZGVyUXVpY2tNb2RlbExpc3QoKF9tb2RlbERhdGEgJiYgX21vZGVsRGF0YS5hbGxfbW9kZWxzKSB8fCBbXSk7XG4gICAgX3VwZGF0ZUxsbVN0YXR1c1BpbGwoJ2NvbmZpZ3VyZWQnLCBgJHtlZmZlY3RpdmVQcm92aWRlciB8fCAnUHJvdmlkZXInfSBjb25maWd1cmVkYCk7XG5cbiAgICBfc2F2ZU1vZGVsUHJlZnNUb1N0b3JhZ2Uoe1xuICAgICAgY3VycmVudE1vZGVsUHJvdmlkZXI6IGVmZmVjdGl2ZVByb3ZpZGVyIHx8IG51bGwsXG4gICAgICBjdXJyZW50TW9kZWxOYW1lOiBtb2RlbCB8fCBudWxsLFxuICAgIH0pO1xuICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcy51cGRhdGVBdXRoQmFkZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGdsb2JhbFRoaXMudXBkYXRlQXV0aEJhZGdlKHt9LCBlZmZlY3RpdmVQcm92aWRlciB8fCBudWxsKTtcbiAgICB9XG4gICAgYXdhaXQgX3JlZnJlc2hDb3BpbG90QXV0aFN0YXR1cygpO1xuICAgIGF3YWl0IHRlc3RDdXJyZW50TW9kZWwoKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZy5lcnJvcignRmFpbGVkIHRvIHN3aXRjaCBtb2RlbDonLCBlKTtcbiAgICBjb25zdCBtc2cgPSBlLm1lc3NhZ2UgfHwgU3RyaW5nKGUpO1xuICAgIF9zeW5jTW9kZWxUYWJsZVNlbGVjdGlvbigpO1xuICAgIGNvbnN0IHN0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC10ZXN0LXN0YXR1cycpO1xuICAgIGlmIChzdGF0dXMpIHtcbiAgICAgIHN0YXR1cy5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICBzdGF0dXMuc3R5bGUuY29sb3IgPSAnI2RjMjYyNic7XG4gICAgICBzdGF0dXMudGV4dENvbnRlbnQgPSBgXHUyNzRDICR7bXNnfWA7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgYXBwZW5kTWVzc2FnZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgYFx1Mjc0QyBNb2RlbCBzd2l0Y2ggZmFpbGVkOiAke21zZ31gKTtcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgX2hpZGVNb2RlbFdpemFyZEJ1c3koKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiB0ZXN0Q3VycmVudE1vZGVsKCkge1xuICAvLyBVcGRhdGUgYm90aCB0aGUgaGVhZGVyIGJhZGdlIGFuZCB0aGUgbW9kYWwgc3RhdHVzIGxpbmVcbiAgY29uc3QgYmFkZ2UgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLXRlc3QtYmFkZ2UnKTtcbiAgY29uc3Qgc3RhdHVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLXRlc3Qtc3RhdHVzJyk7XG4gIGNvbnN0IGJ0biAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC10ZXN0LWJ0bicpO1xuXG4gIGNvbnN0IFNQSU4gPSAnXHUyM0YzJztcbiAgY29uc3QgT0sgICA9ICdcdTI3MDUnO1xuICBjb25zdCBGQUlMID0gJ1x1Mjc0Qyc7XG5cbiAgY29uc3Qgc2V0UnVubmluZyA9ICgpID0+IHtcbiAgICBpZiAoYmFkZ2UpICB7IGJhZGdlLnRleHRDb250ZW50ICA9IFNQSU47IGJhZGdlLnN0eWxlLmRpc3BsYXkgID0gJyc7IGJhZGdlLnRpdGxlICA9ICdUZXN0aW5nXHUyMDI2JzsgfVxuICAgIGlmIChzdGF0dXMpIHsgc3RhdHVzLmlubmVySFRNTCAgID0gYCR7U1BJTn0gVGVzdGluZyBjb25uZWN0aW9uXHUyMDI2YDsgc3RhdHVzLnN0eWxlLmRpc3BsYXkgPSAnJzsgfVxuICAgIGlmIChidG4pICAgIHsgYnRuLmRpc2FibGVkID0gdHJ1ZTsgYnRuLnRleHRDb250ZW50ID0gJ1x1MjNGMyBUZXN0aW5nXHUyMDI2JzsgfVxuICAgIF91cGRhdGVMbG1TdGF0dXNQaWxsKCdjb25uZWN0aW5nJywgJ0Nvbm5lY3RpbmdcdTIwMjYnLCAnXHUyOUQ3Jyk7XG4gIH07XG5cbiAgY29uc3Qgc2V0T2sgPSAobGF0ZW5jeU1zKSA9PiB7XG4gICAgY29uc3QgdGlwID0gYENvbm5lY3RlZCBcdTIwMTQgJHtsYXRlbmN5TXN9bXNgO1xuICAgIGlmIChiYWRnZSkgIHsgYmFkZ2UudGV4dENvbnRlbnQgID0gT0s7ICBiYWRnZS5zdHlsZS5kaXNwbGF5ICA9ICcnOyBiYWRnZS50aXRsZSAgPSB0aXA7IH1cbiAgICBpZiAoc3RhdHVzKSB7IHN0YXR1cy5pbm5lckhUTUwgICA9IGAke09LfSAke3RpcH1gOyBzdGF0dXMuc3R5bGUuY29sb3IgPSAnIzE2YTM0YSc7IHN0YXR1cy5zdHlsZS5kaXNwbGF5ID0gJyc7IH1cbiAgICBpZiAoYnRuKSAgICB7IGJ0bi5kaXNhYmxlZCA9IGZhbHNlOyBidG4uaW5uZXJIVE1MID0gJyYjMTAwMDM7IFRlc3QgY29ubmVjdGlvbic7IH1cbiAgICBfdXBkYXRlTGxtU3RhdHVzUGlsbCgnY29ubmVjdGVkJywgYEhlYWx0aHkgKCR7bGF0ZW5jeU1zfW1zKWAsICdcdTI3MTMnKTtcbiAgICBjb25zdCBzdWNjZXNzU3VtbWFyeSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1zdWNjZXNzLXN1bW1hcnknKTtcbiAgICBpZiAoc3VjY2Vzc1N1bW1hcnkpIHtcbiAgICAgIHN1Y2Nlc3NTdW1tYXJ5LnRleHRDb250ZW50ID0gYENvbm5lY3Rpb24gdmVyaWZpZWQgaW4gJHtsYXRlbmN5TXN9bXMuIFlvdSBjYW4gY2xvc2UgdGhlIHdpemFyZCBhbmQgY29udGludWUuYDtcbiAgICB9XG4gICAgX3NldE1vZGVsV2l6YXJkU3RlcCg0KTtcbiAgfTtcblxuICBjb25zdCBzZXRGYWlsID0gKGVyck1zZykgPT4ge1xuICAgIGlmIChiYWRnZSkgIHsgYmFkZ2UudGV4dENvbnRlbnQgID0gRkFJTDsgYmFkZ2Uuc3R5bGUuZGlzcGxheSAgPSAnJzsgYmFkZ2UudGl0bGUgID0gZXJyTXNnOyB9XG4gICAgaWYgKHN0YXR1cykge1xuICAgICAgc3RhdHVzLmlubmVySFRNTCAgID0gYCR7RkFJTH0gPHNwYW4gdGl0bGU9XCIke2Vyck1zZy5yZXBsYWNlKC9cIi9nLCAnJnF1b3Q7Jyl9XCIgc3R5bGU9XCJjdXJzb3I6aGVscDsgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZSBkb3R0ZWQ7XCI+Q29ubmVjdGlvbiBmYWlsZWQ8L3NwYW4+YDtcbiAgICAgIHN0YXR1cy5zdHlsZS5jb2xvciA9ICcjZGMyNjI2JztcbiAgICAgIHN0YXR1cy5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgfVxuICAgIGlmIChidG4pICAgIHsgYnRuLmRpc2FibGVkID0gZmFsc2U7IGJ0bi5pbm5lckhUTUwgPSAnJiMxMDAwMzsgVGVzdCBjb25uZWN0aW9uJzsgfVxuICAgIF91cGRhdGVMbG1TdGF0dXNQaWxsKCdlcnJvcicsICdDb25uZWN0aW9uIGZhaWxlZCcsICdcdTI2QTAnLCBlcnJNc2cpO1xuICAgIGlmIChfbW9kZWxXaXphcmRTdGVwID09PSAzKSB7XG4gICAgICBfc2V0TW9kZWxXaXphcmRTdGVwKDIpO1xuICAgIH1cbiAgfTtcblxuICBzZXRSdW5uaW5nKCk7XG4gIF9zaG93TW9kZWxXaXphcmRCdXN5KCdUZXN0aW5nIG1vZGVsIGNvbm5lY3Rpb24uLi4nKTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhcGlDYWxsKCdQT1NUJywgJy9hcGkvbW9kZWwvdGVzdCcpO1xuICAgIGlmIChyZXN1bHQub2spIHtcbiAgICAgIHNldE9rKHJlc3VsdC5sYXRlbmN5X21zKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBzZXRGYWlsKHJlc3VsdC5lcnJvciB8fCAnVW5rbm93biBlcnJvcicpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHNldEZhaWwoZS5tZXNzYWdlIHx8IFN0cmluZyhlKSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGZpbmFsbHkge1xuICAgIF9oaWRlTW9kZWxXaXphcmRCdXN5KCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX3VwZGF0ZVByaWNpbmdGb290ZXIoKSB7XG4gIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ByaWNpbmctdXBkYXRlZC1sYWJlbCcpO1xuICBpZiAoIWVsIHx8ICFfbW9kZWxEYXRhKSByZXR1cm47XG4gIGNvbnN0IHRzICAgICA9IF9tb2RlbERhdGEucHJpY2luZ191cGRhdGVkX2F0O1xuICBjb25zdCBzb3VyY2UgPSBfbW9kZWxEYXRhLnByaWNpbmdfc291cmNlO1xuXG4gIGNvbnN0IHNvdXJjZUxhYmVsID0gKHNvdXJjZSA9PT0gJ29wZW5yb3V0ZXInKVxuICAgID8gJzxhIGhyZWY9XCJodHRwczovL29wZW5yb3V0ZXIuYWlcIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lclwiICcgK1xuICAgICAgJ3N0eWxlPVwiY29sb3I6aW5oZXJpdDsgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZSBkb3R0ZWQ7XCI+T3BlblJvdXRlcjwvYT4nXG4gICAgOiAnc3RhdGljIGJhc2VsaW5lIChNYXJjaCAyMDI2KSc7XG5cbiAgaWYgKCF0cykgeyBlbC5pbm5lckhUTUwgPSBgUHJpY2VzOiAke3NvdXJjZUxhYmVsfWA7IHJldHVybjsgfVxuICB0cnkge1xuICAgIGNvbnN0IGQgICA9IG5ldyBEYXRlKHRzKTtcbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgIGNvbnN0IGggICA9IE1hdGgucm91bmQoKG5vdyAtIGQpIC8gM182MDBfMDAwKTtcbiAgICBjb25zdCBhZ2UgPSBoIDwgMSA/ICdqdXN0IG5vdycgOiBoIDwgMjQgPyBgJHtofWggYWdvYCA6IGAke01hdGgucm91bmQoaCAvIDI0KX1kIGFnb2A7XG4gICAgZWwuaW5uZXJIVE1MID0gYFByaWNlcyB2aWEgJHtzb3VyY2VMYWJlbH0gJm1pZGRvdDsgdXBkYXRlZCAke2FnZX1gO1xuICB9IGNhdGNoIHsgZWwuaW5uZXJIVE1MID0gYFByaWNlczogJHtzb3VyY2VMYWJlbH1gOyB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlZnJlc2hNb2RlbFByaWNpbmcoKSB7XG4gIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcmljaW5nLXJlZnJlc2gtYnRuJyk7XG4gIGNvbnN0IGxibCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcmljaW5nLXVwZGF0ZWQtbGFiZWwnKTtcbiAgaWYgKGJ0bikgeyBidG4uZGlzYWJsZWQgPSB0cnVlOyBidG4udGV4dENvbnRlbnQgPSAnUmVmcmVzaGluZ1x1MjAyNic7IH1cbiAgX3Nob3dNb2RlbFdpemFyZEJ1c3koJ1JlZnJlc2hpbmcgbW9kZWwgcHJpY2luZy4uLicpO1xuICB0cnkge1xuICAgIGF3YWl0IGFwaUNhbGwoJ1BPU1QnLCAnL2FwaS9tb2RlbC1wcmljaW5nL3JlZnJlc2gnKTtcbiAgICAvLyBSZS1mZXRjaCBtb2RlbCBkYXRhIHNvIHRoZSB0YWJsZSBnZXRzIGZyZXNoIHByaWNlc1xuICAgIF9tb2RlbERhdGEgPSBhd2FpdCBhcGlDYWxsKCdHRVQnLCAnL2FwaS9tb2RlbCcpO1xuICAgIF9idWlsZE1vZGVsVGFibGUoKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmIChsYmwpIGxibC50ZXh0Q29udGVudCA9ICdSZWZyZXNoIGZhaWxlZCc7XG4gICAgbG9nLmVycm9yKCdQcmljaW5nIHJlZnJlc2ggZmFpbGVkOicsIGUpO1xuICB9IGZpbmFsbHkge1xuICAgIF9oaWRlTW9kZWxXaXphcmRCdXN5KCk7XG4gICAgaWYgKGJ0bikgeyBidG4uZGlzYWJsZWQgPSBmYWxzZTsgYnRuLnRleHRDb250ZW50ID0gJ1x1MjFCQiBSZWZyZXNoIHByaWNlcyc7IH1cbiAgfVxufVxuXG5cbi8vIEhlbHBlcjogdXBkYXRlIHdvcmtmbG93IHN0ZXAgYmFyIGNsaWNrYWJsZSBzdGF0ZVxuZnVuY3Rpb24gdXBkYXRlV29ya2Zsb3dTdGVwc0NsaWNrYWJsZShjdXJyZW50UGhhc2UpIHtcbiAgLy8gU2VxdWVudGlhbCBwcmUtbGF5b3V0IHN0ZXBzIHVubG9jayBvbmUtYnktb25lIGFzIHRoZSB1c2VyIHByb2dyZXNzZXMuXG4gIGNvbnN0IHNlcXVlbnRpYWxTdGVwcyA9IFtcbiAgICAnc3RlcC1qb2InLFxuICAgICdzdGVwLWFuYWx5c2lzJyxcbiAgICAnc3RlcC1jdXN0b21pemF0aW9ucycsXG4gICAgJ3N0ZXAtcmV3cml0ZScsXG4gICAgJ3N0ZXAtc3BlbGwnLFxuICAgICdzdGVwLWxheW91dCcsXG4gIF07XG4gIC8vIFBvc3QtbGF5b3V0IHN0ZXBzIGFsbCB1bmxvY2sgc2ltdWx0YW5lb3VzbHkgb25jZSBsYXlvdXQgaXMgY29uZmlybWVkLlxuICBjb25zdCBwb3N0TGF5b3V0U3RlcHMgPSBbXG4gICAgJ3N0ZXAtZG93bmxvYWQnLFxuICAgICdzdGVwLWNvdmVyX2xldHRlcicsXG4gICAgJ3N0ZXAtc2NyZWVuaW5nJyxcbiAgICAnc3RlcC1pbnRlcnZpZXdfcHJlcCcsXG4gICAgJ3N0ZXAtdGhhbmtfeW91JyxcbiAgICAnc3RlcC1oYXJ2ZXN0JyxcbiAgXTtcbiAgLy8gTWFwIGJhY2tlbmQgcGhhc2Ugc3RyaW5ncyB0byBob3cgbWFueSBzZXF1ZW50aWFsIHN0ZXBzIGFyZSB1bmxvY2tlZCAoMC1iYXNlZCBpbmRleCkuXG4gIGNvbnN0IHBoYXNlVG9JbmRleCA9IHtcbiAgICAnaW5pdCc6ICAgICAgICAgICAgIDAsXG4gICAgJ2pvYl9hbmFseXNpcyc6ICAgICAxLFxuICAgICdjdXN0b21pemF0aW9uJzogICAgMixcbiAgICAncmV3cml0ZV9yZXZpZXcnOiAgIDMsXG4gICAgJ3NwZWxsX2NoZWNrJzogICAgICA0LFxuICAgICdnZW5lcmF0aW9uJzogICAgICAgNSxcbiAgICAnbGF5b3V0X3Jldmlldyc6ICAgIDUsXG4gICAgJ2ZpbmFsX2dlbmVyYXRpb24nOiA1LFxuICAgICdyZWZpbmVtZW50JzogICAgICAgNSxcbiAgICAvLyBMZWdhY3kgZmFsbGJhY2tzIChzdGVwIG5hbWVzIHNvbWV0aW1lcyBwYXNzZWQgb24gRE9NQ29udGVudExvYWRlZClcbiAgICAnam9iJzogICAgICAgICAgICAgIDAsXG4gICAgJ2xheW91dCc6ICAgICAgICAgICA1LFxuICAgICdmaW5hbGlzZSc6ICAgICAgICAgNSxcbiAgfTtcbiAgY29uc3QgcG9zdExheW91dFVubG9ja2VkID0gWydmaW5hbF9nZW5lcmF0aW9uJywgJ3JlZmluZW1lbnQnXS5pbmNsdWRlcyhjdXJyZW50UGhhc2UpO1xuICBjb25zdCBjdXJyZW50SWR4ID0gcGhhc2VUb0luZGV4W2N1cnJlbnRQaGFzZV0gPz8gMDtcblxuICBmdW5jdGlvbiBfbWFrZVN0ZXBDbGlja2FibGUoZWwpIHtcbiAgICBpZiAoIWVsIHx8IGVsLmNsYXNzTGlzdC5jb250YWlucygnY2xpY2thYmxlJykpIHJldHVybjtcbiAgICBlbC5jbGFzc0xpc3QuYWRkKCdjbGlja2FibGUnKTtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnYnV0dG9uJyk7XG4gICAgZWwuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICcwJyk7XG4gICAgaWYgKCFlbC5fc3RlcEtleUhhbmRsZXIpIHtcbiAgICAgIGVsLl9zdGVwS2V5SGFuZGxlciA9IChlKSA9PiB7XG4gICAgICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJyB8fCBlLmtleSA9PT0gJyAnKSB7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGVsLmNsaWNrKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZWwuX3N0ZXBLZXlIYW5kbGVyKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBfbWFrZVN0ZXBJbmVydChlbCkge1xuICAgIGlmICghZWwpIHJldHVybjtcbiAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCdjbGlja2FibGUnKTtcbiAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoJ3JvbGUnKTtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJy0xJyk7XG4gICAgaWYgKGVsLl9zdGVwS2V5SGFuZGxlcikge1xuICAgICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGVsLl9zdGVwS2V5SGFuZGxlcik7XG4gICAgICBkZWxldGUgZWwuX3N0ZXBLZXlIYW5kbGVyO1xuICAgIH1cbiAgfVxuXG4gIHNlcXVlbnRpYWxTdGVwcy5mb3JFYWNoKChpZCwgaWR4KSA9PiB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIGlmIChpZHggPD0gY3VycmVudElkeCB8fCBwb3N0TGF5b3V0VW5sb2NrZWQpIHtcbiAgICAgIF9tYWtlU3RlcENsaWNrYWJsZShlbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIF9tYWtlU3RlcEluZXJ0KGVsKTtcbiAgICB9XG4gIH0pO1xuXG4gIHBvc3RMYXlvdXRTdGVwcy5mb3JFYWNoKGlkID0+IHtcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICBpZiAoIWVsKSByZXR1cm47XG4gICAgaWYgKHBvc3RMYXlvdXRVbmxvY2tlZCkge1xuICAgICAgX21ha2VTdGVwQ2xpY2thYmxlKGVsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgX21ha2VTdGVwSW5lcnQoZWwpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gTWFyayB0aGUgY3VycmVudGx5IGFjdGl2ZSBzdGVwIGZvciBzY3JlZW4gcmVhZGVycy5cbiAgY29uc3QgYWxsU3RlcElkcyA9IFsuLi5zZXF1ZW50aWFsU3RlcHMsIC4uLnBvc3RMYXlvdXRTdGVwc107XG4gIGFsbFN0ZXBJZHMuZm9yRWFjaChpZCA9PiB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgaWYgKGVsKSBlbC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtY3VycmVudCcpO1xuICB9KTtcbiAgLy8gRm9yIHBvc3QtbGF5b3V0IHBoYXNlcywgbWFyayBzdGVwLWRvd25sb2FkIGFzIHRoZSBhY3RpdmUgc3RlcCBzbyBzY3JlZW4gcmVhZGVyc1xuICAvLyBoYXZlIGEgcHJvZ3JhbW1hdGljIGN1cnJlbnQtcG9zaXRpb24gaW5kaWNhdG9yLlxuICBjb25zdCBhY3RpdmVTdGVwSWQgPSBwb3N0TGF5b3V0VW5sb2NrZWQgPyAnc3RlcC1kb3dubG9hZCcgOiBzZXF1ZW50aWFsU3RlcHNbY3VycmVudElkeF07XG4gIGlmIChhY3RpdmVTdGVwSWQpIHtcbiAgICBjb25zdCBhY3RpdmVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFjdGl2ZVN0ZXBJZCk7XG4gICAgaWYgKGFjdGl2ZUVsKSBhY3RpdmVFbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtY3VycmVudCcsICdzdGVwJyk7XG4gIH1cbn1cblxuLy8gSW5pdGlhbGl6ZSBvbiBwYWdlIGxvYWQgXHUyMDE0IGRlbGVnYXRlcyB0byBhcHAuanMgaW5pdCgpIHdoaWNoIGlzIGxvYWRlZCBhZnRlciB0aGlzIGZpbGVcbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB7XG4gIGxvYWRNb2RlbFNlbGVjdG9yKCk7XG5cbiAgLy8gV2lyZSB1cCB0YWIgc2Nyb2xsIGFycm93IGJ1dHRvbnNcbiAgY29uc3QgdGFiQmFyICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFiLWJhcicpO1xuICBjb25zdCBsZWZ0QnRuICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWItc2Nyb2xsLWxlZnQnKTtcbiAgY29uc3QgcmlnaHRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFiLXNjcm9sbC1yaWdodCcpO1xuICBpZiAodGFiQmFyICYmIGxlZnRCdG4gJiYgcmlnaHRCdG4pIHtcbiAgICBsZWZ0QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgICgpID0+IHsgdGFiQmFyLnNjcm9sbEJ5KHsgbGVmdDogLTE2MCwgYmVoYXZpb3I6ICdzbW9vdGgnIH0pOyB9KTtcbiAgICByaWdodEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHsgdGFiQmFyLnNjcm9sbEJ5KHsgbGVmdDogIDE2MCwgYmVoYXZpb3I6ICdzbW9vdGgnIH0pOyB9KTtcbiAgICB0YWJCYXIuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdXBkYXRlVGFiU2Nyb2xsQnV0dG9ucyk7XG4gICAgbmV3IFJlc2l6ZU9ic2VydmVyKHVwZGF0ZVRhYlNjcm9sbEJ1dHRvbnMpLm9ic2VydmUodGFiQmFyKTtcbiAgfVxuXG4gIC8vIFNob3cgb25seSB0aGUgSm9iIHRhYiB1bnRpbCBmZXRjaFN0YXR1cyByZXNvbHZlcyB0aGUgYWN0dWFsIHN0YWdlXG4gIHVwZGF0ZVRhYkJhckZvclN0YWdlKCdqb2InKTtcbiAgdXBkYXRlV29ya2Zsb3dTdGVwc0NsaWNrYWJsZSgnam9iJyk7XG5cbiAgLy8gTGlzdGVuIGZvciBwaGFzZSBjaGFuZ2VzIHRvIHVwZGF0ZSBjbGlja2FibGUgc3RlcHNcbiAgaWYgKHR5cGVvZiBzdGF0ZU1hbmFnZXI/Lm9uUGhhc2VDaGFuZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICBzdGF0ZU1hbmFnZXIub25QaGFzZUNoYW5nZSgocGhhc2UpID0+IHtcbiAgICAgIHVwZGF0ZVdvcmtmbG93U3RlcHNDbGlja2FibGUocGhhc2UpO1xuICAgIH0pO1xuICB9XG5cbn0pO1xuXG4vLyBcdTI1MDBcdTI1MDAgRVMgbW9kdWxlIGV4cG9ydHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5leHBvcnQge1xuICAvLyBGb2N1cyAvIGFjY2Vzc2liaWxpdHlcbiAgc2V0SW5pdGlhbEZvY3VzLCB0cmFwRm9jdXMsIHJlc3RvcmVGb2N1cywgcHVzaEZvY3VzU3RhY2ssXG4gIC8vIERpYWxvZ3MgJiBtb2RhbHNcbiAgY29uZmlybURpYWxvZywgb3Blbk1vZGFsLCBjbG9zZU1vZGFsLCBjbG9zZUFsbE1vZGFscyxcbiAgLy8gVGFiICYgc3RhZ2UgbWFuYWdlbWVudFxuICBzZXR1cEV2ZW50TGlzdGVuZXJzLCBnZXRTdGFnZUZvclRhYiwgZ2V0VmlzaWJsZVN0YWdlLCB1cGRhdGVUYWJCYXJGb3JTdGFnZSxcbiAgLy8gQ2hhdFxuICB0b2dnbGVDaGF0LFxuICAvLyBNb2RlbCBzZWxlY3RvclxuICBsb2FkTW9kZWxTZWxlY3Rvciwgb3Blbk1vZGVsTW9kYWwsIGNsb3NlTW9kZWxNb2RhbCwgc2V0TW9kZWwsIHRlc3RDdXJyZW50TW9kZWwsIHJlZnJlc2hNb2RlbFByaWNpbmcsXG4gIHRvZ2dsZU1vZGVsQ2F0YWxvZ1Zpc2liaWxpdHksIHN0YXJ0Q29waWxvdEF1dGhGcm9tV2l6YXJkLCBsb2dvdXRDb3BpbG90QXV0aEZyb21XaXphcmQsXG4gIG5leHRXaXphcmRTdGVwLCBwcmV2aW91c1dpemFyZFN0ZXAsXG4gIHNhdmVQcm92aWRlckFwaUtleSwgdG9nZ2xlQXBpS2V5VmlzaWJpbGl0eSxcbiAgX3VwZGF0ZUxsbVN0YXR1c1BpbGwsXG4gIC8vIFNldHRpbmdzIG1vZGFsXG4gIG9wZW5TZXR0aW5nc01vZGFsLCBjbG9zZVNldHRpbmdzTW9kYWwsIHNhdmVTZXR0aW5nc01vZGFsLCByZWxvYWRTZXR0aW5nc01vZGFsLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL3dvcmtmbG93LXN0ZXBzLmpzXG4gKiBXb3JrZmxvdyBwcm9ncmVzcyBiYXIsIHBoYXNlIHJlLXJ1bi9iYWNrLW5hdiwgYW5kIGJ1bGxldCByZW9yZGVyIG1vZGFsLlxuICpcbiAqIERlcGVuZGVuY2llcyAocmVzb2x2ZWQgdGhyb3VnaCBnbG9iYWxUaGlzIGF0IHJ1bnRpbWUpOlxuICogICBQSEFTRVMsIGVzY2FwZUh0bWwsXG4gKiAgIGFwcGVuZExvYWRpbmdNZXNzYWdlLCByZW1vdmVMb2FkaW5nTWVzc2FnZSwgYXBwZW5kUmV0cnlNZXNzYWdlLCBhcHBlbmRNZXNzYWdlLFxuICogICBzZXRMb2FkaW5nLCBmZXRjaFN0YXR1cywgc3dpdGNoVGFiLCBzZW5kQWN0aW9uLFxuICogICBzaG93TG9hZEpvYlBhbmVsLCB1cGRhdGVBY3Rpb25CdXR0b25zLCB1cGRhdGVUYWJCYXJGb3JTdGFnZSxcbiAqICAgdHJhcEZvY3VzLCByZXN0b3JlRm9jdXMsIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsLFxuICogICBwb3N0QW5hbHlzaXNRdWVzdGlvbnMsIHF1ZXN0aW9uQW5zd2VycywgQ1NTXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCd3b3JrZmxvdy1zdGVwcycpO1xuXG5pbXBvcnQgeyBzdGF0ZU1hbmFnZXIsIEdFTkVSQVRJT05fU1RBVEVfRVZFTlQgfSBmcm9tICcuL3N0YXRlLW1hbmFnZXIuanMnO1xuXG5mdW5jdGlvbiBfZmluZEV4cGVyaWVuY2VSZWNvbW1lbmRhdGlvblJlY29yZChleHBJZCkge1xuICBjb25zdCBkYXRhID0gZ2xvYmFsVGhpcy53aW5kb3c/LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnM7XG4gIGlmICghZGF0YSB8fCAhQXJyYXkuaXNBcnJheShkYXRhLmV4cGVyaWVuY2VfcmVjb21tZW5kYXRpb25zKSkgcmV0dXJuIG51bGw7XG4gIHJldHVybiBkYXRhLmV4cGVyaWVuY2VfcmVjb21tZW5kYXRpb25zLmZpbmQoKHJlYykgPT4gU3RyaW5nKHJlYz8uaWQgfHwgcmVjPy5leHBlcmllbmNlX2lkIHx8ICcnKSA9PT0gU3RyaW5nKGV4cElkKSkgfHwgbnVsbDtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFN0ZXAtb3JkZXIgY29uc3RhbnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5jb25zdCBfU1RFUF9PUkRFUiA9IFtcbiAgJ2pvYicsICdhbmFseXNpcycsICdjdXN0b21pemF0aW9ucycsICdyZXdyaXRlJywgJ3NwZWxsJywgJ2xheW91dCcsXG4gICdkb3dubG9hZCcsICdjb3Zlcl9sZXR0ZXInLCAnc2NyZWVuaW5nJywgJ2ludGVydmlld19wcmVwJywgJ3RoYW5rX3lvdScsICdoYXJ2ZXN0Jyxcbl07XG5jb25zdCBfU1RFUF9ESVNQTEFZID0ge1xuICBqb2I6ICAgICAgICAgICAgJ0pvYiBJbnB1dCcsXG4gIGFuYWx5c2lzOiAgICAgICAnSm9iIEFuYWx5c2lzJyxcbiAgY3VzdG9taXphdGlvbnM6ICdDdXN0b21pc2UnLFxuICByZXdyaXRlOiAgICAgICAgJ1Jld3JpdGUgUmV2aWV3JyxcbiAgc3BlbGw6ICAgICAgICAgICdTcGVsbCBDaGVjaycsXG4gIGxheW91dDogICAgICAgICAnTGF5b3V0IFJldmlldycsXG4gIGRvd25sb2FkOiAgICAgICAnRmlsZSBSZXZpZXcnLFxuICBjb3Zlcl9sZXR0ZXI6ICAgJ0NvdmVyIExldHRlcicsXG4gIHNjcmVlbmluZzogICAgICAnU2NyZWVuaW5nJyxcbiAgaW50ZXJ2aWV3X3ByZXA6ICdJbnRlcnZpZXcgUHJlcCcsXG4gIHRoYW5rX3lvdTogICAgICAnVGhhbmsgWW91JyxcbiAgaGFydmVzdDogICAgICAgICdIYXJ2ZXN0Jyxcbn07XG5jb25zdCBfQUNUSU9OX0xBQkVMUyA9IHtcbiAgcmVjb21tZW5kX2N1c3RvbWl6YXRpb25zOiAnU2VsZWN0aW5nIGV4cGVyaWVuY2VzICYgc2tpbGxzXHUyMDI2JyxcbiAgZ2VuZXJhdGVfY3Y6ICdHZW5lcmF0aW5nIENWXHUyMDI2Jyxcbn07XG5cbmNvbnN0IF9OQVZfVEFCX0xBQkVMUyA9IHtcbiAgZG93bmxvYWQ6ICdcdTJCMDdcdUZFMEYgRmlsZSBSZXZpZXcnLFxufTtcblxuZnVuY3Rpb24gYXBwbHlMYXlvdXRGcmVzaG5lc3NOYXZpZ2F0aW9uU3RhdGUoKSB7XG4gIGNvbnN0IGZyZXNobmVzcyA9IHN0YXRlTWFuYWdlci5nZXRMYXlvdXRGcmVzaG5lc3MoKTtcbiAgY29uc3QgZ2VuZXJhdGlvblN0YXRlID0gc3RhdGVNYW5hZ2VyLmdldEdlbmVyYXRpb25TdGF0ZSgpO1xuICBjb25zdCBsYXlvdXRTdGVwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0ZXAtbGF5b3V0Jyk7XG5cbiAgaWYgKGxheW91dFN0ZXApIHtcbiAgICBsYXlvdXRTdGVwLmNsYXNzTGlzdC5yZW1vdmUoJ3N0YWxlJywgJ3N0YWxlLWNyaXRpY2FsJyk7XG4gICAgY29uc3QgcmVydW4gPSBsYXlvdXRTdGVwLnF1ZXJ5U2VsZWN0b3IoJy5zdGVwLXJlcnVuJyk/Lm91dGVySFRNTCB8fCAnJztcbiAgICBjb25zdCByZWZpbmVCYWRnZSA9IGxheW91dFN0ZXAucXVlcnlTZWxlY3RvcignLnN0ZXAtaW5saW5lLWJhZGdlJyk/Lm91dGVySFRNTCB8fCAnJztcbiAgICBjb25zdCBzdGFsZUJhZGdlID0gZnJlc2huZXNzLmlzU3RhbGVcbiAgICAgID8gJyA8c3BhbiBjbGFzcz1cInN0ZXAtaW5saW5lLWJhZGdlIHN0ZXAtc3RhbGUtYmFkZ2VcIj5PdXRkYXRlZDwvc3Bhbj4nXG4gICAgICA6ICcnO1xuICAgIGlmIChmcmVzaG5lc3MuaXNTdGFsZSkge1xuICAgICAgbGF5b3V0U3RlcC5jbGFzc0xpc3QuYWRkKCdzdGFsZScpO1xuICAgICAgaWYgKGZyZXNobmVzcy5pc0NyaXRpY2FsKSBsYXlvdXRTdGVwLmNsYXNzTGlzdC5hZGQoJ3N0YWxlLWNyaXRpY2FsJyk7XG4gICAgfVxuICAgIGxheW91dFN0ZXAuaW5uZXJIVE1MID0gYFx1RDgzQ1x1REZBOCBMYXlvdXQgUmV2aWV3JHtzdGFsZUJhZGdlfSR7cmVmaW5lQmFkZ2UgPyBgICR7cmVmaW5lQmFkZ2V9YCA6ICcnfSR7cmVydW4gPyBgICR7cmVydW59YCA6ICcnfWA7XG4gIH1cblxuICBjb25zdCBzaG93RG93bnN0cmVhbUJhZGdlID0gZnJlc2huZXNzLmlzU3RhbGUgJiYgQm9vbGVhbihcbiAgICBnZW5lcmF0aW9uU3RhdGUuZmluYWxHZW5lcmF0ZWRBdCB8fCBnZW5lcmF0aW9uU3RhdGUucGhhc2UgPT09ICdmaW5hbF9jb21wbGV0ZSdcbiAgKTtcbiAgT2JqZWN0LmVudHJpZXMoX05BVl9UQUJfTEFCRUxTKS5mb3JFYWNoKChbdGFiLCBsYWJlbF0pID0+IHtcbiAgICBjb25zdCB0YWJFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGB0YWItJHt0YWJ9YCk7XG4gICAgaWYgKCF0YWJFbCkgcmV0dXJuO1xuICAgIHRhYkVsLmNsYXNzTGlzdC5yZW1vdmUoJ3RhYi1zdGFsZScsICd0YWItc3RhbGUtY3JpdGljYWwnKTtcbiAgICBpZiAoc2hvd0Rvd25zdHJlYW1CYWRnZSkge1xuICAgICAgdGFiRWwuY2xhc3NMaXN0LmFkZCgndGFiLXN0YWxlJyk7XG4gICAgICBpZiAoZnJlc2huZXNzLmlzQ3JpdGljYWwpIHRhYkVsLmNsYXNzTGlzdC5hZGQoJ3RhYi1zdGFsZS1jcml0aWNhbCcpO1xuICAgICAgdGFiRWwuaW5uZXJIVE1MID0gYCR7bGFiZWx9IDxzcGFuIGNsYXNzPVwidGFiLXN0YWxlLWJhZGdlXCI+T3V0ZGF0ZWQ8L3NwYW4+YDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGFiRWwudGV4dENvbnRlbnQgPSBsYWJlbDtcbiAgICB9XG4gIH0pO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgQmFjayB0byBwaGFzZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gYmFja1RvUGhhc2Uoc3RlcCwgZmVlZGJhY2spIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBib2R5ID0gZmVlZGJhY2sgPyB7cGhhc2U6IHN0ZXAsIGZlZWRiYWNrfSA6IHtwaGFzZTogc3RlcH07XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL2JhY2stdG8tcGhhc2UnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmICghcmVzLm9rIHx8ICFkYXRhLm9rKSB7XG4gICAgICBhcHBlbmRSZXRyeU1lc3NhZ2UoJ1x1MjZBMCBDb3VsZCBub3QgbmF2aWdhdGUgYmFjazogJyArIChkYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yJyksICgpID0+IGJhY2tUb1BoYXNlKHN0ZXAsIGZlZWRiYWNrKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIGBcdTIxQkIgTmF2aWdhdGluZyBiYWNrIHRvICR7c3RlcH0uIFByaW9yIGRlY2lzaW9ucyBhbmQgYXBwcm92YWxzIGFyZSBwcmVzZXJ2ZWQuYCk7XG4gICAgaWYgKGZlZWRiYWNrKSBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCBgUmVmaW5lbWVudCBmZWVkYmFjayBxdWV1ZWQ6IFwiJHtmZWVkYmFja31cImApO1xuICAgIGF3YWl0IGZldGNoU3RhdHVzKCk7XG5cbiAgICAvLyBTd2l0Y2ggdG8gdGhlIGFwcHJvcHJpYXRlIHZpZXdlciB0YWJcbiAgICBjb25zdCB0YWJNYXAgPSB7XG4gICAgICBqb2I6ICAgICAgICAgICAgbnVsbCxcbiAgICAgIGFuYWx5c2lzOiAgICAgICAnYW5hbHlzaXMnLFxuICAgICAgY3VzdG9taXphdGlvbnM6ICdnb2FscycsXG4gICAgICByZXdyaXRlOiAgICAgICAgJ3Jld3JpdGUnLFxuICAgICAgc3BlbGw6ICAgICAgICAgICdzcGVsbCcsXG4gICAgfTtcbiAgICBjb25zdCByZXNvbHZlZFRhYiA9IHRhYk1hcFtzdGVwXSB8fCB0YWJNYXBbZGF0YS5waGFzZV0gfHwgbnVsbDtcbiAgICBpZiAocmVzb2x2ZWRUYWIpIHN3aXRjaFRhYihyZXNvbHZlZFRhYik7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGFwcGVuZFJldHJ5TWVzc2FnZSgnXHUyNkEwIE5ldHdvcmsgZXJyb3IgaW4gYmFja1RvUGhhc2U6ICcgKyBlcnIubWVzc2FnZSwgKCkgPT4gYmFja1RvUGhhc2Uoc3RlcCkpO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBSZS1ydW4gY29uZmlybSBtb2RhbCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLyoqXG4gKiBTaG93IGEgZG93bnN0cmVhbS1hd2FyZSBjb25maXJtYXRpb24gbW9kYWwgYmVmb3JlIHJlLXJ1bm5pbmcgb3IgYmFjay1uYXZpZ2F0aW5nLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgc3RlcCAgICAgIC0gVGhlIHRhcmdldCBzdGVwIGtleVxuICogQHBhcmFtIHsncmVydW4nfCdiYWNrLW5hdid9IG1vZGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IG9uQ29uZmlybSAtIENhbGxlZCBpZiB0aGUgdXNlciBjbGlja3MgUHJvY2VlZFxuICovXG5mdW5jdGlvbiBfc2hvd1JlUnVuQ29uZmlybU1vZGFsKHN0ZXAsIG1vZGUsIG9uQ29uZmlybSkge1xuICBjb25zdCBzdGVwSWR4ICAgID0gX1NURVBfT1JERVIuaW5kZXhPZihzdGVwKTtcbiAgLy8gT25seSBzaG93IGRvd25zdHJlYW0gc3RhZ2VzIHRoYXQgaGF2ZSBhY3R1YWxseSBiZWVuIGNvbXBsZXRlZFxuICBjb25zdCBkb3duc3RyZWFtID0gX1NURVBfT1JERVIuc2xpY2Uoc3RlcElkeCArIDEpLmZpbHRlcihzID0+IHtcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzdGVwLSR7c31gKTtcbiAgICByZXR1cm4gZWwgJiYgZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdjb21wbGV0ZWQnKTtcbiAgfSk7XG4gIGNvbnN0IHN0ZXBMYWJlbCAgPSBfU1RFUF9ESVNQTEFZW3N0ZXBdIHx8IHN0ZXA7XG5cbiAgY29uc3QgdGl0bGUgPSBtb2RlID09PSAncmVydW4nXG4gICAgPyBgXHUyMUJCIFJlLXJ1biAke3N0ZXBMYWJlbH0/YFxuICAgIDogYFx1MjE5MCBOYXZpZ2F0ZSBiYWNrIHRvICR7c3RlcExhYmVsfT9gO1xuICBjb25zdCBib2R5VGV4dCA9IG1vZGUgPT09ICdyZXJ1bidcbiAgICA/ICdUaGUgZm9sbG93aW5nIHN0YWdlcyB3aWxsIHNlZSB1cGRhdGVkIGlucHV0cyBhbmQgbWF5IHNob3cgY2hhbmdlZCByZWNvbW1lbmRhdGlvbnM6J1xuICAgIDogJ1lvdSBhcmUgbmF2aWdhdGluZyBiYWNrIHBhc3QgdGhlIGZvbGxvd2luZyBjb21wbGV0ZWQgc3RhZ2VzOic7XG4gIGNvbnN0IG5vdGUgPSAnQWxsIGV4aXN0aW5nIGFwcHJvdmFscyBhbmQgcmV3cml0ZXMgYXJlIHByZXNlcnZlZCBhcyBjb250ZXh0Lic7XG5cbiAgY29uc3QgbGlzdEh0bWwgPSBkb3duc3RyZWFtXG4gICAgLm1hcChzID0+IGA8bGkgc3R5bGU9XCJwYWRkaW5nOjJweCAwO1wiPiR7X1NURVBfRElTUExBWVtzXSB8fCBzfTwvbGk+YClcbiAgICAuam9pbignJyk7XG5cbiAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBvdmVybGF5LmlkID0gJ3JlcnVuLWNvbmZpcm0tb3ZlcmxheSc7XG4gIG92ZXJsYXkuc3R5bGUuY3NzVGV4dCA9IGBwb3NpdGlvbjpmaXhlZDtpbnNldDowO2JhY2tncm91bmQ6cmdiYSgwLDAsMCwwLjUpO1xuICAgIHotaW5kZXg6MTAwMDA7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2A7XG4gIG92ZXJsYXkuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgcm9sZT1cImRpYWxvZ1wiIGFyaWEtbW9kYWw9XCJ0cnVlXCIgYXJpYS1sYWJlbGxlZGJ5PVwicmVydW4tY29uZmlybS10aXRsZVwiXG4gICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6I2ZmZjtib3JkZXItcmFkaXVzOjEwcHg7cGFkZGluZzoyNHB4IDI4cHg7bWF4LXdpZHRoOjQ0MHB4O1xuICAgICAgICAgICAgICAgIHdpZHRoOjkyJTtib3gtc2hhZG93OjAgMjBweCA2MHB4IHJnYmEoMCwwLDAsMC4zKTtcIj5cbiAgICAgIDxoMyBpZD1cInJlcnVuLWNvbmZpcm0tdGl0bGVcIiBzdHlsZT1cIm1hcmdpbjowIDAgMTBweDtmb250LXNpemU6MS4xZW07Y29sb3I6IzFlMjkzYjtcIj5cbiAgICAgICAgJHtlc2NhcGVIdG1sKHRpdGxlKX08L2gzPlxuICAgICAgPHAgc3R5bGU9XCJtYXJnaW46MCAwIDhweDtmb250LXNpemU6MC45ZW07Y29sb3I6IzQ3NTU2OTtcIj4ke2VzY2FwZUh0bWwoYm9keVRleHQpfTwvcD5cbiAgICAgIDx1bCBzdHlsZT1cIm1hcmdpbjowIDAgMTJweDtwYWRkaW5nLWxlZnQ6MjBweDtmb250LXNpemU6MC45ZW07Y29sb3I6IzM3NDE1MTtcIj4ke2xpc3RIdG1sfTwvdWw+XG4gICAgICA8cCBzdHlsZT1cIm1hcmdpbjowIDAgMThweDtmb250LXNpemU6MC44NWVtO2NvbG9yOiM2YjcyODA7XCI+JHtlc2NhcGVIdG1sKG5vdGUpfTwvcD5cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjEwcHg7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kO1wiPlxuICAgICAgICA8YnV0dG9uIGlkPVwicmVydW4tY2FuY2VsLWJ0blwiIGNsYXNzPVwiYnRuLXNlY29uZGFyeVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwicmVydW4tcHJvY2VlZC1idG5cIiBjbGFzcz1cImJ0bi1wcmltYXJ5XCI+UHJvY2VlZDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+YDtcblxuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG92ZXJsYXkpO1xuICBfZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIGlmICh0eXBlb2YgdHJhcEZvY3VzID09PSAnZnVuY3Rpb24nKSB0cmFwRm9jdXMoJ3JlcnVuLWNvbmZpcm0tb3ZlcmxheScpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVydW4tcHJvY2VlZC1idG4nKS5mb2N1cygpO1xuXG4gIGNvbnN0IGNsb3NlID0gKCkgPT4geyBvdmVybGF5LnJlbW92ZSgpOyByZXN0b3JlRm9jdXMoKTsgfTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlcnVuLWNhbmNlbC1idG4nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNsb3NlKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlcnVuLXByb2NlZWQtYnRuJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7IGNsb3NlKCk7IG9uQ29uZmlybSgpOyB9KTtcbiAgb3ZlcmxheS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGUgPT4geyBpZiAoZS50YXJnZXQgPT09IG92ZXJsYXkpIGNsb3NlKCk7IH0pO1xuICBvdmVybGF5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBlID0+IHsgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgY2xvc2UoKTsgfSk7XG59XG5cbmZ1bmN0aW9uIGNvbmZpcm1SZVJ1blBoYXNlKHN0ZXApIHtcbiAgX3Nob3dSZVJ1bkNvbmZpcm1Nb2RhbChzdGVwLCAncmVydW4nLCAoKSA9PiBiYWNrVG9QaGFzZShzdGVwKSk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBWaWV3LWN1cnNvciBpbmRpY2F0b3IgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8qKlxuICogUmV0dXJuIGEgdG9vbHRpcCBzdHJpbmcgZm9yIGEgc3RlcCBwaWxsIGJhc2VkIG9uIGl0cyBjb21iaW5lZCBzdGF0ZS5cbiAqL1xuZnVuY3Rpb24gX2dldFN0ZXBUb29sdGlwKHN0ZXAsIGlzQWN0aXZlLCBpc1ZpZXdpbmcsIGlzQnJvd3NpbmdBd2F5LCBpc0NvbXBsZXRlZCwgaXNTdGFsZSwgaXNTdGFsZUNyaXRpY2FsKSB7XG4gIGlmIChpc1N0YWxlQ3JpdGljYWwpIHJldHVybiBpc1ZpZXdpbmcgPyAnQ3JpdGljYWwgY2hhbmdlcyBcdTIwMTQgcmV2aWV3IHJlcXVpcmVkLiBDbGljayBcdTIxQkIgdG8gcmVydW4uJyA6ICdDcml0aWNhbCBjaGFuZ2VzIFx1MjAxNCByZXZpZXcgcmVxdWlyZWQuJztcbiAgaWYgKGlzU3RhbGUpICAgICAgICAgcmV0dXJuIGlzVmlld2luZyA/ICdSZXN1bHRzIG1heSBiZSBvdXRkYXRlZC4gQ2xpY2sgXHUyMUJCIHRvIHJlcnVuLicgICAgICAgICAgIDogJ1Jlc3VsdHMgbWF5IGJlIG91dGRhdGVkLic7XG4gIGlmIChpc0Jyb3dzaW5nQXdheSkgIHJldHVybiAnQWN0aXZlIHN0ZXAgXHUyMDE0IGNsaWNrIHRvIHJldHVybic7XG4gIGlmIChpc0FjdGl2ZSAmJiBpc1ZpZXdpbmcpICAgIHJldHVybiAnQ3VycmVudCBzdGVwJztcbiAgaWYgKGlzQ29tcGxldGVkICYmIGlzVmlld2luZykgcmV0dXJuICdDbGljayBcdTIxQkIgdG8gcmVydW4gZnJvbSBoZXJlJztcbiAgaWYgKGlzQ29tcGxldGVkKSAgICAgICAgICAgICAgcmV0dXJuICdDbGljayB0byB2aWV3JztcbiAgcmV0dXJuICcnO1xufVxuXG4vKipcbiAqIFN5bmMgdGhlIGJsdWUgcmluZyAodmlldyBjdXJzb3IpIGFuZCBhbWJlciBwdWxzaW5nIHJpbmcgKGJyb3dzaW5nLWF3YXkpXG4gKiB0byB0aGUgY3VycmVudGx5IHZpc2libGUgdGFiLiBDYWxsZWQgYWZ0ZXIgZXZlcnkgdGFiIHN3aXRjaCBhbmQgc3RhdHVzIHVwZGF0ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWJOYW1lIC0gVGhlIGN1cnJlbnRseSB2aXNpYmxlIHRhYiBpZCAoZS5nLiAnYW5hbHlzaXMnLCAnZXhwLXJldmlldycpXG4gKi9cbmZ1bmN0aW9uIF91cGRhdGVWaWV3aW5nSW5kaWNhdG9yKHRhYk5hbWUpIHtcbiAgY29uc3QgdGFiVG9TdGVwID0ge1xuICAgICdqb2InOiAgICAgICAgICAgJ2pvYicsXG4gICAgJ2FuYWx5c2lzJzogICAgICAnYW5hbHlzaXMnLFxuICAgICdxdWVzdGlvbnMnOiAgICAgJ2FuYWx5c2lzJyxcbiAgICAnZXhwLXJldmlldyc6ICAgICdjdXN0b21pemF0aW9ucycsXG4gICAgJ3Jld3JpdGUnOiAgICAgICAncmV3cml0ZScsXG4gICAgJ3NwZWxsJzogICAgICAgICAnc3BlbGwnLFxuICAgICdsYXlvdXQnOiAgICAgICAgJ2xheW91dCcsXG4gICAgJ2ZpbmFsX2dlbmVyYXRlJzonZG93bmxvYWQnLFxuICAgICdkb3dubG9hZCc6ICAgICAgJ2Rvd25sb2FkJyxcbiAgICAnY292ZXItbGV0dGVyJzogICdjb3Zlcl9sZXR0ZXInLFxuICAgICdzY3JlZW5pbmcnOiAgICAgJ3NjcmVlbmluZycsXG4gICAgJ2ludGVydmlldy1wcmVwJzonaW50ZXJ2aWV3X3ByZXAnLFxuICAgICd0aGFuay15b3UnOiAgICAgJ3RoYW5rX3lvdScsXG4gICAgJ2hhcnZlc3QnOiAgICAgICAnaGFydmVzdCcsXG4gIH07XG4gIGNvbnN0IHZpZXdlZFN0ZXAgPSB0YWJUb1N0ZXBbdGFiTmFtZV0gfHwgbnVsbDtcblxuICBsZXQgYWN0aXZlU3RlcCA9IG51bGw7XG4gIF9TVEVQX09SREVSLmZvckVhY2goc3RlcCA9PiB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc3RlcC0ke3N0ZXB9YCk7XG4gICAgaWYgKGVsICYmIGVsLmNsYXNzTGlzdC5jb250YWlucygnYWN0aXZlJykpIGFjdGl2ZVN0ZXAgPSBzdGVwO1xuICB9KTtcblxuICBfU1RFUF9PUkRFUi5mb3JFYWNoKHN0ZXAgPT4ge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHN0ZXAtJHtzdGVwfWApO1xuICAgIGlmICghZWwpIHJldHVybjtcblxuICAgIGNvbnN0IGlzVmlld2luZyAgICAgID0gc3RlcCA9PT0gdmlld2VkU3RlcDtcbiAgICBjb25zdCBpc0FjdGl2ZSAgICAgICA9IHN0ZXAgPT09IGFjdGl2ZVN0ZXA7XG4gICAgY29uc3QgaXNCcm93c2luZ0F3YXkgPSBpc0FjdGl2ZSAmJiAhIXZpZXdlZFN0ZXAgJiYgdmlld2VkU3RlcCAhPT0gYWN0aXZlU3RlcDtcbiAgICBjb25zdCBpc0NvbXBsZXRlZCAgICA9IGVsLmNsYXNzTGlzdC5jb250YWlucygnY29tcGxldGVkJyk7XG4gICAgY29uc3QgaXNTdGFsZSAgICAgICAgPSBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ3N0YWxlJyk7XG4gICAgY29uc3QgaXNTdGFsZUNyaXRpY2FsID0gZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdzdGFsZS1jcml0aWNhbCcpO1xuXG4gICAgZWwuY2xhc3NMaXN0LnRvZ2dsZSgndmlld2luZycsICAgICAgIGlzVmlld2luZyk7XG4gICAgZWwuY2xhc3NMaXN0LnRvZ2dsZSgnYnJvd3NpbmctYXdheScsIGlzQnJvd3NpbmdBd2F5KTtcblxuICAgIGNvbnN0IHRvb2x0aXBUZXh0ID0gX2dldFN0ZXBUb29sdGlwKHN0ZXAsIGlzQWN0aXZlLCBpc1ZpZXdpbmcsIGlzQnJvd3NpbmdBd2F5LCBpc0NvbXBsZXRlZCwgaXNTdGFsZSwgaXNTdGFsZUNyaXRpY2FsKTtcbiAgICBpZiAodG9vbHRpcFRleHQpIHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZSgnZGF0YS1icy10b2dnbGUnLCAgICAndG9vbHRpcCcpO1xuICAgICAgZWwuc2V0QXR0cmlidXRlKCdkYXRhLWJzLXBsYWNlbWVudCcsICdib3R0b20nKTtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZSgnZGF0YS1icy10aXRsZScsICAgICB0b29sdGlwVGV4dCk7XG4gICAgICBpZiAodHlwZW9mIGJvb3RzdHJhcCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY29uc3QgdGlwID0gYm9vdHN0cmFwLlRvb2x0aXAuZ2V0SW5zdGFuY2UoZWwpO1xuICAgICAgICBpZiAodGlwKSB0aXAuc2V0Q29udGVudCh7ICcudG9vbHRpcC1pbm5lcic6IHRvb2x0aXBUZXh0IH0pO1xuICAgICAgICBlbHNlICAgICBuZXcgYm9vdHN0cmFwLlRvb2x0aXAoZWwpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtYnMtdG9nZ2xlJyk7XG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtYnMtdGl0bGUnKTtcbiAgICAgIGlmICh0eXBlb2YgYm9vdHN0cmFwICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBjb25zdCB0aXAgPSBib290c3RyYXAuVG9vbHRpcC5nZXRJbnN0YW5jZShlbCk7XG4gICAgICAgIGlmICh0aXApIHRpcC5kaXNwb3NlKCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFJlLXJ1biBwaGFzZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLyoqXG4gKiBTaG93IGFuIGFtZW5kLWNsYXJpZmljYXRpb25zIG1vZGFsIGJlZm9yZSByZS1ydW5uaW5nIHRoZSBhbmFseXNpcyBwaGFzZS5cbiAqIENhbGxzIG9uUHJvY2VlZCgpIGlmIHRoZSB1c2VyIGNvbmZpcm1zICh3aXRoIG9yIHdpdGhvdXQgdXBkYXRpbmcgYW5zd2VycykuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIF9zaG93QW5hbHlzaXNDbGFyaWZpY2F0aW9uQW1lbmRNb2RhbChvblByb2NlZWQpIHtcbiAgY29uc3QgcXVlc3Rpb25zID0gd2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucyB8fCBbXTtcbiAgY29uc3QgYW5zd2VycyAgID0gd2luZG93LnF1ZXN0aW9uQW5zd2VycyB8fCB7fTtcblxuICAvLyBObyBwcmlvciBxdWVzdGlvbnMgXHUyMDE0IHNraXAgdGhlIG1vZGFsIGFuZCBwcm9jZWVkIGRpcmVjdGx5LlxuICBpZiAoIXF1ZXN0aW9ucy5sZW5ndGgpIHsgYXdhaXQgb25Qcm9jZWVkKCk7IHJldHVybjsgfVxuXG4gIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgb3ZlcmxheS5pZCA9ICdjbGFyLWFtZW5kLW92ZXJsYXknO1xuICBvdmVybGF5LnN0eWxlLmNzc1RleHQgPSAncG9zaXRpb246Zml4ZWQ7aW5zZXQ6MDtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsMC41KTt6LWluZGV4OjEwMDAwO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjtvdmVyZmxvdy15OmF1dG87JztcblxuICBjb25zdCBmb3JtUm93cyA9IHF1ZXN0aW9ucy5tYXAoKHEsIGkpID0+IHtcbiAgICBjb25zdCBxdHlwZSAgPSBxLnR5cGUgfHwgYGNsYXJpZmljYXRpb25fJHtpICsgMX1gO1xuICAgIGNvbnN0IHF0ZXh0ICA9IGVzY2FwZUh0bWwocS5xdWVzdGlvbiB8fCAnJyk7XG4gICAgY29uc3QgY3VyQW5zID0gZXNjYXBlSHRtbChhbnN3ZXJzW3F0eXBlXSB8fCAnJyk7XG4gICAgY29uc3QgY2hvaWNlcyA9IEFycmF5LmlzQXJyYXkocS5jaG9pY2VzKSA/IHEuY2hvaWNlcyA6IFtdO1xuXG4gICAgaWYgKGNob2ljZXMubGVuZ3RoKSB7XG4gICAgICBjb25zdCByYWRpb3MgPSBjaG9pY2VzLm1hcChjID0+IGBcbiAgICAgICAgPGxhYmVsIHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6NnB4O21hcmdpbi1ib3R0b206NHB4O2N1cnNvcjpwb2ludGVyO1wiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwiY2xhci0ke2VzY2FwZUh0bWwocXR5cGUpfVwiIHZhbHVlPVwiJHtlc2NhcGVIdG1sKGMpfVwiXG4gICAgICAgICAgICAke2Fuc3dlcnNbcXR5cGVdID09PSBjID8gJ2NoZWNrZWQnIDogJyd9IHN0eWxlPVwiZmxleC1zaHJpbms6MDtcIj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjllbTtcIj4ke2VzY2FwZUh0bWwoYyl9PC9zcGFuPlxuICAgICAgICA8L2xhYmVsPmApLmpvaW4oJycpO1xuICAgICAgcmV0dXJuIGBcbiAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTRweDtcIj5cbiAgICAgICAgICA8bGFiZWwgc3R5bGU9XCJmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjAuOWVtO2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWJvdHRvbTo2cHg7XCI+JHtxdGV4dH08L2xhYmVsPlxuICAgICAgICAgICR7cmFkaW9zfVxuICAgICAgICA8L2Rpdj5gO1xuICAgIH1cbiAgICByZXR1cm4gYFxuICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTRweDtcIj5cbiAgICAgICAgPGxhYmVsIGZvcj1cImNsYXItYW5zLSR7ZXNjYXBlSHRtbChxdHlwZSl9XCIgc3R5bGU9XCJmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjAuOWVtO2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWJvdHRvbTo0cHg7XCI+JHtxdGV4dH08L2xhYmVsPlxuICAgICAgICA8dGV4dGFyZWEgaWQ9XCJjbGFyLWFucy0ke2VzY2FwZUh0bWwocXR5cGUpfVwiIG5hbWU9XCJjbGFyLSR7ZXNjYXBlSHRtbChxdHlwZSl9XCIgcm93cz1cIjJcIlxuICAgICAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTtib3gtc2l6aW5nOmJvcmRlci1ib3g7cGFkZGluZzo2cHggOHB4O2JvcmRlcjoxcHggc29saWQgI2QxZDVkYjtib3JkZXItcmFkaXVzOjZweDtmb250LXNpemU6MC45ZW07cmVzaXplOnZlcnRpY2FsO1wiXG4gICAgICAgID4ke2N1ckFuc308L3RleHRhcmVhPlxuICAgICAgPC9kaXY+YDtcbiAgfSkuam9pbignJyk7XG5cbiAgb3ZlcmxheS5pbm5lckhUTUwgPSBgXG4gICAgPGRpdiByb2xlPVwiZGlhbG9nXCIgYXJpYS1tb2RhbD1cInRydWVcIiBhcmlhLWxhYmVsbGVkYnk9XCJjbGFyLWFtZW5kLXRpdGxlXCJcbiAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDojZmZmO2JvcmRlci1yYWRpdXM6MTBweDtwYWRkaW5nOjI0cHggMjhweDttYXgtd2lkdGg6NTAwcHg7d2lkdGg6OTQlO1xuICAgICAgICAgICAgICAgIGJveC1zaGFkb3c6MCAyMHB4IDYwcHggcmdiYSgwLDAsMCwwLjMpO21hcmdpbjoyMHB4IGF1dG87XCI+XG4gICAgICA8aDMgaWQ9XCJjbGFyLWFtZW5kLXRpdGxlXCIgc3R5bGU9XCJtYXJnaW46MCAwIDZweDtmb250LXNpemU6MS4xZW07Y29sb3I6IzFlMjkzYjtcIj5cdTIxQkIgQW1lbmQgQ2xhcmlmaWNhdGlvbiBBbnN3ZXJzPC9oMz5cbiAgICAgIDxwIHN0eWxlPVwibWFyZ2luOjAgMCAxNnB4O2ZvbnQtc2l6ZTowLjg1ZW07Y29sb3I6IzZiNzI4MDtcIj5cbiAgICAgICAgVXBkYXRlIHlvdXIgYW5zd2VycyBiZWZvcmUgcmVydW5uaW5nIGFuYWx5c2lzLCBvciBrZWVwIHRoZW0gYXMtaXMuXG4gICAgICA8L3A+XG4gICAgICA8Zm9ybSBpZD1cImNsYXItYW1lbmQtZm9ybVwiIG9uc3VibWl0PVwicmV0dXJuIGZhbHNlO1wiPlxuICAgICAgICAke2Zvcm1Sb3dzfVxuICAgICAgPC9mb3JtPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6MTBweDtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmQ7bWFyZ2luLXRvcDo4cHg7ZmxleC13cmFwOndyYXA7XCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJjbGFyLWFtZW5kLWNhbmNlbFwiIGNsYXNzPVwiYnRuLXNlY29uZGFyeVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwiY2xhci1hbWVuZC1rZWVwXCIgICBjbGFzcz1cImJ0bi1zZWNvbmRhcnlcIj5LZWVwIEV4aXN0aW5nIEFuc3dlcnM8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImNsYXItYW1lbmQtc2F2ZVwiICAgY2xhc3M9XCJidG4tcHJpbWFyeVwiPlVwZGF0ZSAmYW1wOyBSZXJ1bjwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+YDtcblxuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG92ZXJsYXkpO1xuICBpZiAodHlwZW9mIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsICE9PSAndW5kZWZpbmVkJykgd2luZG93Ll9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgaWYgKHR5cGVvZiB0cmFwRm9jdXMgPT09ICdmdW5jdGlvbicpIHRyYXBGb2N1cygnY2xhci1hbWVuZC1vdmVybGF5Jyk7XG4gIG92ZXJsYXkucXVlcnlTZWxlY3RvcignI2NsYXItYW1lbmQtc2F2ZScpLmZvY3VzKCk7XG5cbiAgZnVuY3Rpb24gY2xvc2VNb2RhbCgpIHtcbiAgICBvdmVybGF5LnJlbW92ZSgpO1xuICAgIGlmICh0eXBlb2YgcmVzdG9yZUZvY3VzID09PSAnZnVuY3Rpb24nKSByZXN0b3JlRm9jdXMoKTtcbiAgfVxuXG4gIG92ZXJsYXkucXVlcnlTZWxlY3RvcignI2NsYXItYW1lbmQtY2FuY2VsJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjbG9zZU1vZGFsKTtcbiAgb3ZlcmxheS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGUgPT4geyBpZiAoZS50YXJnZXQgPT09IG92ZXJsYXkpIGNsb3NlTW9kYWwoKTsgfSk7XG4gIG92ZXJsYXkuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGUgPT4geyBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSBjbG9zZU1vZGFsKCk7IH0pO1xuXG4gIG92ZXJsYXkucXVlcnlTZWxlY3RvcignI2NsYXItYW1lbmQta2VlcCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGNsb3NlTW9kYWwoKTtcbiAgICBvblByb2NlZWQoKTtcbiAgfSk7XG5cbiAgb3ZlcmxheS5xdWVyeVNlbGVjdG9yKCcjY2xhci1hbWVuZC1zYXZlJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZm9ybSAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbGFyLWFtZW5kLWZvcm0nKTtcbiAgICBjb25zdCB1cGRhdGVkID0ge307XG4gICAgcXVlc3Rpb25zLmZvckVhY2goKHEsIGkpID0+IHtcbiAgICAgIGNvbnN0IHF0eXBlID0gcS50eXBlIHx8IGBjbGFyaWZpY2F0aW9uXyR7aSArIDF9YDtcbiAgICAgIGNvbnN0IGVsICAgID0gZm9ybS5xdWVyeVNlbGVjdG9yKGBbbmFtZT1cImNsYXItJHtxdHlwZX1cIl1gKTtcbiAgICAgIGlmICghZWwpIHJldHVybjtcbiAgICAgIGlmIChlbC50eXBlID09PSAncmFkaW8nKSB7XG4gICAgICAgIGNvbnN0IGNoZWNrZWQgPSBmb3JtLnF1ZXJ5U2VsZWN0b3IoYFtuYW1lPVwiY2xhci0ke3F0eXBlfVwiXTpjaGVja2VkYCk7XG4gICAgICAgIGlmIChjaGVja2VkKSB1cGRhdGVkW3F0eXBlXSA9IGNoZWNrZWQudmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB2YWwgPSBlbC52YWx1ZS50cmltKCk7XG4gICAgICAgIGlmICh2YWwpIHVwZGF0ZWRbcXR5cGVdID0gdmFsO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY2xvc2VNb2RhbCgpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmZXRjaCgnL2FwaS9wb3N0LWFuYWx5c2lzLXJlc3BvbnNlcycsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHF1ZXN0aW9ucywgYW5zd2VyczogdXBkYXRlZCB9KSxcbiAgICAgIH0pO1xuICAgICAgd2luZG93LnF1ZXN0aW9uQW5zd2VycyA9IHVwZGF0ZWQ7XG4gICAgfSBjYXRjaCAoX2UpIHsgLyogc2lsZW50IFx1MjAxNCBwcm9jZWVkIHdpdGggd2hhdGV2ZXIgdGhlIGJhY2tlbmQgYWxyZWFkeSBoYXMgKi8gfVxuICAgIGF3YWl0IG9uUHJvY2VlZCgpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVSdW5QaGFzZShzdGVwKSB7XG4gIC8vIEludGVyY2VwdCBhbmFseXNpcyByZXJ1bnMgdG8gbGV0IHRoZSB1c2VyIGFtZW5kIHByaW9yIGNsYXJpZmljYXRpb24gYW5zd2Vycy5cbiAgaWYgKHN0ZXAgPT09ICdhbmFseXNpcycpIHtcbiAgICBhd2FpdCBfc2hvd0FuYWx5c2lzQ2xhcmlmaWNhdGlvbkFtZW5kTW9kYWwoKCkgPT4gX2V4ZWN1dGVSZVJ1blBoYXNlKCdhbmFseXNpcycpKTtcbiAgICByZXR1cm47XG4gIH1cbiAgYXdhaXQgX2V4ZWN1dGVSZVJ1blBoYXNlKHN0ZXApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBfZXhlY3V0ZVJlUnVuUGhhc2Uoc3RlcCkge1xuICBjb25zdCBsb2FkaW5nTXNnID0gYXBwZW5kTG9hZGluZ01lc3NhZ2UoYFx1MjFCQiBSZS1ydW5uaW5nICR7c3RlcH1cdTIwMjZgKTtcbiAgc2V0TG9hZGluZyh0cnVlLCBgUmUtcnVubmluZyAke3N0ZXB9XHUyMDI2YCk7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL3JlLXJ1bi1waGFzZScsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeydDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbid9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe3BoYXNlOiBzdGVwfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgcmVtb3ZlTG9hZGluZ01lc3NhZ2UobG9hZGluZ01zZyk7XG4gICAgc2V0TG9hZGluZyhmYWxzZSk7XG5cbiAgICBpZiAoIXJlcy5vayB8fCAhZGF0YS5vaykge1xuICAgICAgYXBwZW5kUmV0cnlNZXNzYWdlKCdcdTI2QTAgUmUtcnVuIGZhaWxlZDogJyArIChkYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yJyksICgpID0+IHJlUnVuUGhhc2Uoc3RlcCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIGBcdTI3MDUgJHtzdGVwfSByZS1ydW4gY29tcGxldGUuIFJldmlldyB0aGUgdXBkYXRlZCByZXN1bHRzIFx1MjAxNCBjaGFuZ2VkIGl0ZW1zIGFyZSBoaWdobGlnaHRlZC5gKTtcbiAgICBhd2FpdCBmZXRjaFN0YXR1cygpO1xuXG4gICAgLy8gQ2xlYXIgcGVyLXBoYXNlIGNhY2hlcyBzbyBiYWNrLW5hdmlnYXRpb24gZmV0Y2hlcyBmcmVzaCByZXN1bHRzXG4gICAgaWYgKHN0ZXAgPT09ICdzcGVsbCcpICAgd2luZG93Ll9zcGVsbENoZWNrQ2FjaGUgID0gbnVsbDtcbiAgICBpZiAoc3RlcCA9PT0gJ3Jld3JpdGUnKSB3aW5kb3cuX3Jld3JpdGVQYW5lbENhY2hlID0gbnVsbDtcblxuICAgIC8vIE5hdmlnYXRlIHRvIHRoZSBzdGVwJ3Mgdmlld2VyIHRhYlxuICAgIGNvbnN0IHRhYk1hcCA9IHtcbiAgICAgIGFuYWx5c2lzOiAgICAgICAnYW5hbHlzaXMnLFxuICAgICAgY3VzdG9taXphdGlvbnM6ICdnb2FscycsXG4gICAgICByZXdyaXRlOiAgICAgICAgJ3Jld3JpdGUnLFxuICAgICAgc3BlbGw6ICAgICAgICAgICdzcGVsbCcsXG4gICAgfTtcbiAgICBpZiAodGFiTWFwW3N0ZXBdKSBzd2l0Y2hUYWIodGFiTWFwW3N0ZXBdKTtcblxuICAgIC8vIENvbXB1dGUgY2hhbmdlZC1pdGVtIElEcyBmcm9tIHByaW9yIHZzIG5ldyBvdXRwdXQgYW5kIGhpZ2hsaWdodCB0aGVtLlxuICAgIGlmIChkYXRhLnByaW9yX291dHB1dCAmJiBkYXRhLm5ld19vdXRwdXQpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gX2hpZ2hsaWdodENoYW5nZWRJdGVtcyhzdGVwLCBkYXRhLnByaW9yX291dHB1dCwgZGF0YS5uZXdfb3V0cHV0KSwgMzAwKTtcbiAgICB9XG5cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmVtb3ZlTG9hZGluZ01lc3NhZ2UobG9hZGluZ01zZyk7XG4gICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgYXBwZW5kUmV0cnlNZXNzYWdlKCdcdTI2QTAgTmV0d29yayBlcnJvciBpbiByZVJ1blBoYXNlOiAnICsgZXJyLm1lc3NhZ2UsICgpID0+IHJlUnVuUGhhc2Uoc3RlcCkpO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBIaWdobGlnaHQgY2hhbmdlZCBpdGVtcyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLyoqXG4gKiBDb21wYXJlIHByaW9yIGFuZCBuZXcgcmUtcnVuIG91dHB1dHM7IG1hcmsgRE9NIGVsZW1lbnRzIGZvciBjaGFuZ2VkIGVudGl0aWVzLlxuICpcbiAqIFN0cmF0ZWdpZXMgYnkgc3RlcDpcbiAqICAgcmV3cml0ZSAgICAgICAgXHUyMDE0IGNvbXBhcmUgcmV3cml0ZSBJRHM7IG1hcmsgcnctY2FyZC08aWQ+XG4gKiAgIGN1c3RvbWl6YXRpb25zIFx1MjAxNCBjb21wYXJlIGV4cGVyaWVuY2UgSURzOyBtYXJrIHRyW2RhdGEtZXhwLWlkXSBhbmQgdHJbZGF0YS1za2lsbF1cbiAqICAgYW5hbHlzaXMgICAgICAgXHUyMDE0IG5vIHBlci1lbnRpdHkgRE9NIHRhcmdldGluZzsgc2tpcFxuICovXG5mdW5jdGlvbiBfaGlnaGxpZ2h0Q2hhbmdlZEl0ZW1zKHN0ZXAsIHByaW9yT3V0cHV0LCBuZXdPdXRwdXQpIHtcbiAgaWYgKHN0ZXAgPT09ICdyZXdyaXRlJykge1xuICAgIGNvbnN0IHByaW9ySWRzID0gbmV3IFNldCgocHJpb3JPdXRwdXQucGVuZGluZ19yZXdyaXRlcyB8fCBbXSkubWFwKHIgPT4gU3RyaW5nKHIuaWQpKSk7XG4gICAgY29uc3QgbmV3SXRlbXMgID0gbmV3T3V0cHV0LnBlbmRpbmdfcmV3cml0ZXMgIHx8IFtdO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBuZXdJdGVtcykge1xuICAgICAgY29uc3QgaWQgICAgICA9IFN0cmluZyhpdGVtLmlkIHx8ICcnKTtcbiAgICAgIGNvbnN0IGNhcmRJZCAgPSBpZC5yZXBsYWNlKC9bXmEtekEtWjAtOV8tXS9nLCAnXycpO1xuICAgICAgY29uc3QgZWwgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBydy1jYXJkLSR7Y2FyZElkfWApO1xuICAgICAgaWYgKCFlbCkgY29udGludWU7XG4gICAgICBjb25zdCBpc05ldyAgICAgPSAhcHJpb3JJZHMuaGFzKGlkKTtcbiAgICAgIGNvbnN0IHByaW9ySXRlbSA9IChwcmlvck91dHB1dC5wZW5kaW5nX3Jld3JpdGVzIHx8IFtdKS5maW5kKHIgPT4gU3RyaW5nKHIuaWQpID09PSBpZCk7XG4gICAgICBjb25zdCBjaGFuZ2VkICAgPSBpc05ldyB8fCAocHJpb3JJdGVtICYmIHByaW9ySXRlbS5wcm9wb3NlZCAhPT0gaXRlbS5wcm9wb3NlZCk7XG4gICAgICBpZiAoY2hhbmdlZCkgX21hcmtDaGFuZ2VkKGVsKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHN0ZXAgPT09ICdjdXN0b21pemF0aW9ucycpIHtcbiAgICBjb25zdCBwcmlvckV4cElkcyA9IG5ldyBTZXQoXG4gICAgICAocHJpb3JPdXRwdXQuY3VzdG9taXphdGlvbnM/LmV4cGVyaWVuY2VfcmVjb21tZW5kYXRpb25zIHx8IFtdKS5tYXAociA9PiBTdHJpbmcoci5pZCkpXG4gICAgKTtcbiAgICBjb25zdCBuZXdFeHBSZWNzICA9IG5ld091dHB1dC5jdXN0b21pemF0aW9ucz8uZXhwZXJpZW5jZV9yZWNvbW1lbmRhdGlvbnMgfHwgW107XG4gICAgZm9yIChjb25zdCByZWMgb2YgbmV3RXhwUmVjcykge1xuICAgICAgY29uc3QgaWQgICA9IFN0cmluZyhyZWMuaWQgfHwgJycpO1xuICAgICAgY29uc3QgZWwgICA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYHRyW2RhdGEtZXhwLWlkPVwiJHtDU1MuZXNjYXBlKGlkKX1cIl1gKTtcbiAgICAgIGlmICghZWwpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgcHJpb3IgPSAocHJpb3JPdXRwdXQuY3VzdG9taXphdGlvbnM/LmV4cGVyaWVuY2VfcmVjb21tZW5kYXRpb25zIHx8IFtdKS5maW5kKHIgPT4gU3RyaW5nKHIuaWQpID09PSBpZCk7XG4gICAgICBpZiAoIXByaW9yRXhwSWRzLmhhcyhpZCkgfHwgKHByaW9yICYmIHByaW9yLnJlY29tbWVuZGF0aW9uICE9PSByZWMucmVjb21tZW5kYXRpb24pKSB7XG4gICAgICAgIF9tYXJrQ2hhbmdlZChlbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcHJpb3JTa2lsbHMgPSBuZXcgU2V0KFxuICAgICAgKHByaW9yT3V0cHV0LmN1c3RvbWl6YXRpb25zPy5za2lsbF9yZWNvbW1lbmRhdGlvbnMgfHwgW10pLm1hcChyID0+IChyLnNraWxsIHx8ICcnKS50b0xvd2VyQ2FzZSgpKVxuICAgICk7XG4gICAgY29uc3QgbmV3U2tpbGxSZWNzID0gbmV3T3V0cHV0LmN1c3RvbWl6YXRpb25zPy5za2lsbF9yZWNvbW1lbmRhdGlvbnMgfHwgW107XG4gICAgZm9yIChjb25zdCByZWMgb2YgbmV3U2tpbGxSZWNzKSB7XG4gICAgICBjb25zdCBuYW1lID0gKHJlYy5za2lsbCB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IGVsICAgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGB0cltkYXRhLXNraWxsPVwiJHtDU1MuZXNjYXBlKG5hbWUpfVwiXWApO1xuICAgICAgaWYgKCFlbCkgY29udGludWU7XG4gICAgICBjb25zdCBwcmlvciA9IChwcmlvck91dHB1dC5jdXN0b21pemF0aW9ucz8uc2tpbGxfcmVjb21tZW5kYXRpb25zIHx8IFtdKS5maW5kKFxuICAgICAgICByID0+IChyLnNraWxsIHx8ICcnKS50b0xvd2VyQ2FzZSgpID09PSBuYW1lXG4gICAgICApO1xuICAgICAgaWYgKCFwcmlvclNraWxscy5oYXMobmFtZSkgfHwgKHByaW9yICYmIHByaW9yLnJlY29tbWVuZGF0aW9uICE9PSByZWMucmVjb21tZW5kYXRpb24pKSB7XG4gICAgICAgIF9tYXJrQ2hhbmdlZChlbCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxufVxuXG4vKiogQXBwbHkgZGF0YS1jaGFuZ2VkIGF0dHJpYnV0ZSBhbmQgdHJpZ2dlciBoaWdobGlnaHQgYW5pbWF0aW9uIG9uIGFuIGVsZW1lbnQuICovXG5mdW5jdGlvbiBfbWFya0NoYW5nZWQoZWwpIHtcbiAgZWwuc2V0QXR0cmlidXRlKCdkYXRhLWNoYW5nZWQnLCAndHJ1ZScpO1xuICAvLyBSZW1vdmUgdGhlIGF0dHJpYnV0ZSBhZnRlciB0aGUgYW5pbWF0aW9uIGNvbXBsZXRlcyBzbyBpdCBjYW4gYmUgcmUtdHJpZ2dlcmVkIG9uIGEgc2Vjb25kIHJlcnVuLlxuICBzZXRUaW1lb3V0KCgpID0+IGVsLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1jaGFuZ2VkJyksIDI1MDApO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgQnVsbGV0IHJlb3JkZXIgbW9kYWwgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIHNob3dCdWxsZXRSZW9yZGVyKGV4cElkLCBleHBUaXRsZSkge1xuICAvLyBGZXRjaCBhY2hpZXZlbWVudHMgKHJlcXVpcmVkKSBhbmQgc3VnZ2VzdGVkIG9yZGVyIChiZXN0LWVmZm9ydCkuXG4gIGxldCBhY2hpZXZlbWVudHMgPSBbXTtcbiAgbGV0IHByb3Bvc2VkT3JkZXIgPSBudWxsO1xuICBsZXQgaGFzSm9iQW5hbHlzaXMgPSBmYWxzZTtcbiAgbGV0IHByb3Bvc2VkUmVhc29uaW5nID0gJyc7XG4gIGxldCBwcm9wb3NlZEF0c0ltcGFjdCA9ICcnO1xuICBsZXQgcHJvcG9zZWRQYWdlSW1wYWN0ID0gJyc7XG4gIHRyeSB7XG4gICAgY29uc3QgZGV0YWlsc1JlcyA9IGF3YWl0IGZldGNoKCcvYXBpL2V4cGVyaWVuY2UtZGV0YWlscycsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7J0NvbnRlbnQtVHlwZSc6J2FwcGxpY2F0aW9uL2pzb24nfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtleHBlcmllbmNlX2lkOiBleHBJZH0pLFxuICAgIH0pO1xuICAgIGlmICghZGV0YWlsc1Jlcy5vaykge1xuICAgICAgbGV0IGRldGFpbHNFcnIgPSBgSFRUUCAke2RldGFpbHNSZXMuc3RhdHVzfWA7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXlsb2FkID0gYXdhaXQgZGV0YWlsc1Jlcy5qc29uKCk7XG4gICAgICAgIGRldGFpbHNFcnIgPSBwYXlsb2FkLmVycm9yIHx8IHBheWxvYWQubWVzc2FnZSB8fCBkZXRhaWxzRXJyO1xuICAgICAgfSBjYXRjaCAoXykgeyAvKiBrZWVwIHN0YXR1cy1iYXNlZCBlcnJvciAqLyB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZGV0YWlsc0Vycik7XG4gICAgfVxuXG4gICAgY29uc3QgZGV0YWlsc0RhdGEgPSBhd2FpdCBkZXRhaWxzUmVzLmpzb24oKTtcbiAgICBhY2hpZXZlbWVudHMgID0gKGRldGFpbHNEYXRhLmV4cGVyaWVuY2UgJiYgZGV0YWlsc0RhdGEuZXhwZXJpZW5jZS5hY2hpZXZlbWVudHMpIHx8IFtdO1xuXG4gICAgY29uc3QgcmVjUmVjb3JkID0gX2ZpbmRFeHBlcmllbmNlUmVjb21tZW5kYXRpb25SZWNvcmQoZXhwSWQpO1xuICAgIGNvbnN0IGxsbUJ1bGxldE9yZGVyID0gcmVjUmVjb3JkICYmIHR5cGVvZiByZWNSZWNvcmQuYnVsbGV0X29yZGVyID09PSAnb2JqZWN0J1xuICAgICAgPyByZWNSZWNvcmQuYnVsbGV0X29yZGVyXG4gICAgICA6IG51bGw7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkobGxtQnVsbGV0T3JkZXI/Lm9yZGVyKSAmJiBsbG1CdWxsZXRPcmRlci5vcmRlci5sZW5ndGggPiAxKSB7XG4gICAgICBwcm9wb3NlZE9yZGVyID0gbGxtQnVsbGV0T3JkZXIub3JkZXI7XG4gICAgICBoYXNKb2JBbmFseXNpcyA9IHRydWU7XG4gICAgICBwcm9wb3NlZFJlYXNvbmluZyA9IFN0cmluZyhsbG1CdWxsZXRPcmRlci5yZWFzb25pbmcgfHwgJycpLnRyaW0oKTtcbiAgICAgIHByb3Bvc2VkQXRzSW1wYWN0ID0gU3RyaW5nKGxsbUJ1bGxldE9yZGVyLmF0c19pbXBhY3QgfHwgJycpLnRyaW0oKTtcbiAgICAgIHByb3Bvc2VkUGFnZUltcGFjdCA9IFN0cmluZyhsbG1CdWxsZXRPcmRlci5wYWdlX2xlbmd0aF9pbXBhY3QgfHwgJycpLnRyaW0oKTtcbiAgICB9XG5cbiAgICAvLyBTdWdnZXN0ZWQgb3JkZXIgaXMgb3B0aW9uYWw7IGZhaWx1cmVzIHNob3VsZCBub3QgYmxvY2sgb3BlbmluZyB0aGUgbW9kYWwuXG4gICAgaWYgKCFwcm9wb3NlZE9yZGVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwcm9wb3NlZFJlcyA9IGF3YWl0IGZldGNoKGAvYXBpL3Byb3Bvc2VkLWJ1bGxldC1vcmRlcj9leHBlcmllbmNlX2lkPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGV4cElkKX1gKTtcbiAgICAgICAgaWYgKHByb3Bvc2VkUmVzLm9rKSB7XG4gICAgICAgICAgY29uc3QgcHJvcG9zZWREYXRhID0gYXdhaXQgcHJvcG9zZWRSZXMuanNvbigpO1xuICAgICAgICAgIHByb3Bvc2VkT3JkZXIgPSBwcm9wb3NlZERhdGEucHJvcG9zZWRfb3JkZXIgfHwgbnVsbDtcbiAgICAgICAgICBoYXNKb2JBbmFseXNpcyA9IHByb3Bvc2VkRGF0YS5oYXNfam9iX2FuYWx5c2lzIHx8IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvZy53YXJuKCdDb3VsZCBub3QgbG9hZCBzdWdnZXN0ZWQgYnVsbGV0IG9yZGVyOicsIHByb3Bvc2VkUmVzLnN0YXR1cyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nLndhcm4oJ0NvdWxkIG5vdCBsb2FkIHN1Z2dlc3RlZCBidWxsZXQgb3JkZXI6JywgZSk7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc3QgZXJyb3JUZXh0ID0gZS5tZXNzYWdlID09PSAnRmFpbGVkIHRvIGZldGNoJ1xuICAgICAgPyAnRmFpbGVkIHRvIGZldGNoIChzZXJ2ZXIgdW5hdmFpbGFibGUpLidcbiAgICAgIDogZS5tZXNzYWdlO1xuICAgIGFwcGVuZFJldHJ5TWVzc2FnZSgnXHUyNkEwIENvdWxkIG5vdCBsb2FkIGJ1bGxldHM6ICcgKyBlcnJvclRleHQsICgpID0+IHNob3dCdWxsZXRSZW9yZGVyKGV4cElkLCBleHBUaXRsZSkpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIWFjaGlldmVtZW50cy5sZW5ndGgpIHtcbiAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnTm8gYnVsbGV0IHBvaW50cyBmb3VuZCBmb3IgdGhpcyBleHBlcmllbmNlLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFNhdmUgZm9jdXMgb3JpZ2luIGZvciByZXN0b3JhdGlvbiBvbiBjbG9zZSAoR0FQLTE3NilcbiAgaWYgKHR5cGVvZiBfZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBfZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIH1cblxuICAvLyBCdWlsZCBtb2RhbCBjb250ZW50XG4gIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIG1vZGFsLmlkID0gJ2J1bGxldC1yZW9yZGVyLW1vZGFsJztcbiAgbW9kYWwuc2V0QXR0cmlidXRlKCdyb2xlJywgJ2RpYWxvZycpO1xuICBtb2RhbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbW9kYWwnLCAndHJ1ZScpO1xuICBtb2RhbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWxsZWRieScsICdidWxsZXQtcmVvcmRlci10aXRsZScpO1xuICBtb2RhbC5zdHlsZS5jc3NUZXh0ID0gYFxuICAgIHBvc2l0aW9uOmZpeGVkO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JhY2tncm91bmQ6cmdiYSgwLDAsMCwwLjUpO1xuICAgIHotaW5kZXg6OTk5OTtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7YDtcblxuICBjb25zdCBzdWdnZXN0ZWRCdG4gPSBoYXNKb2JBbmFseXNpc1xuICAgID8gYDxidXR0b24gY2xhc3M9XCJidG4tc2Vjb25kYXJ5XCIgaWQ9XCJ1c2UtbGxtLW9yZGVyLWJ0blwiIHRpdGxlPVwiQXBwbHkgam9iLXJlbGV2YW5jZSByYW5raW5nIGZyb20geW91ciBqb2IgYW5hbHlzaXNcIlxuICAgICAgICAgc3R5bGU9XCJjb2xvcjojNjM2NmYxO2JvcmRlci1jb2xvcjojNjM2NmYxO1wiPlx1MjcyOCBVc2UgU3VnZ2VzdGVkIE9yZGVyPC9idXR0b24+YFxuICAgIDogJyc7XG4gIGNvbnN0IHN1Z2dlc3Rpb25NZXRhID0gcHJvcG9zZWRSZWFzb25pbmcgfHwgcHJvcG9zZWRBdHNJbXBhY3QgfHwgcHJvcG9zZWRQYWdlSW1wYWN0XG4gICAgPyBgPGRpdiBpZD1cImJ1bGxldC1vcmRlci1haS1ub3RlXCIgc3R5bGU9XCJmb250LXNpemU6MC44MmVtO2NvbG9yOiM0MzM4Y2E7YmFja2dyb3VuZDojZWVmMmZmO2JvcmRlcjoxcHggc29saWQgI2M3ZDJmZTtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjEwcHggMTJweDttYXJnaW4tYm90dG9tOjEycHg7XCI+XG4gICAgICAgICR7cHJvcG9zZWRSZWFzb25pbmcgPyBgPGRpdj48c3Ryb25nPkFJIHJhdGlvbmFsZTo8L3N0cm9uZz4gJHtlc2NhcGVIdG1sKHByb3Bvc2VkUmVhc29uaW5nKX08L2Rpdj5gIDogJyd9XG4gICAgICAgICR7cHJvcG9zZWRBdHNJbXBhY3QgPyBgPGRpdj48c3Ryb25nPkFUUyBpbXBhY3Q6PC9zdHJvbmc+ICR7ZXNjYXBlSHRtbChwcm9wb3NlZEF0c0ltcGFjdCl9PC9kaXY+YCA6ICcnfVxuICAgICAgICAke3Byb3Bvc2VkUGFnZUltcGFjdCA/IGA8ZGl2PjxzdHJvbmc+UGFnZSBsZW5ndGggaW1wYWN0Ojwvc3Ryb25nPiAke2VzY2FwZUh0bWwocHJvcG9zZWRQYWdlSW1wYWN0KX08L2Rpdj5gIDogJyd9XG4gICAgICA8L2Rpdj5gXG4gICAgOiAnJztcblxuICBtb2RhbC5pbm5lckhUTUwgPSBgXG4gICAgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2ZmZjtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjI0cHg7bWF4LXdpZHRoOjY0MHB4O3dpZHRoOjkyJTtcbiAgICAgICAgICAgICAgICBtYXgtaGVpZ2h0Ojgwdmg7b3ZlcmZsb3cteTphdXRvO2JveC1zaGFkb3c6MCAyMHB4IDYwcHggcmdiYSgwLDAsMCwwLjMpO1wiPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjthbGlnbi1pdGVtczpmbGV4LXN0YXJ0O21hcmdpbi1ib3R0b206MTZweDtcIj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8aDMgaWQ9XCJidWxsZXQtcmVvcmRlci10aXRsZVwiIHN0eWxlPVwibWFyZ2luOjA7Y29sb3I6IzFmMjkzNztcIj5cdTIxOTUgUmVvcmRlciBCdWxsZXRzPC9oMz5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiY29sb3I6IzZiNzI4MDtmb250LXNpemU6MC45ZW07bWFyZ2luLXRvcDo0cHg7XCI+JHtleHBUaXRsZX08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxidXR0b24gYXJpYS1sYWJlbD1cIkNsb3NlIHJlb3JkZXIgZGlhbG9nXCJcbiAgICAgICAgICBvbmNsaWNrPVwicmVzdG9yZUZvY3VzKCk7ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J1bGxldC1yZW9yZGVyLW1vZGFsJykucmVtb3ZlKClcIlxuICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDpub25lO2JvcmRlcjpub25lO2ZvbnQtc2l6ZToxLjRlbTtjdXJzb3I6cG9pbnRlcjtjb2xvcjojNmI3MjgwO1wiPlx1MjcxNTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtjb2xvcjojNmI3MjgwO21hcmdpbi1ib3R0b206MTJweDtcIj5cbiAgICAgICAgVXNlIFx1MjE5MSBcdTIxOTMgdG8gcmVvcmRlci4gQnVsbGV0cyBoaWdoZXIgaW4gdGhlIGxpc3QgYXBwZWFyIGZpcnN0IG9uIHlvdXIgQ1YuXG4gICAgICAgIFRoZSBtb3N0IHJlbGV2YW50IGJ1bGxldCB3aWxsIGJlIGF1dG8tcmFua2VkIGhpZ2hlc3QgaWYgeW91IHJlc2V0LlxuICAgICAgPC9kaXY+XG4gICAgICAke3N1Z2dlc3Rpb25NZXRhfVxuICAgICAgPG9sIGlkPVwiYnVsbGV0LXJlb3JkZXItbGlzdFwiIHN0eWxlPVwicGFkZGluZzowO21hcmdpbjowO2xpc3Qtc3R5bGU6bm9uZTtcIj5cbiAgICAgIDwvb2w+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDoxMHB4O21hcmdpbi10b3A6MThweDtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmQ7XCI+XG4gICAgICAgICR7c3VnZ2VzdGVkQnRufVxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLXNlY29uZGFyeVwiIG9uY2xpY2s9XCJyZXNldEJ1bGxldE9yZGVyKCcke2V4cElkfScpXCI+XHUyMUJBIFJlc2V0IHRvIEF1dG88L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1wcmltYXJ5XCIgICBvbmNsaWNrPVwic2F2ZUJ1bGxldE9yZGVyKCcke2V4cElkfScpO3Jlc3RvcmVGb2N1cygpXCI+U2F2ZSBPcmRlcjwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+YDtcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChtb2RhbCk7XG4gIGlmICh0eXBlb2YgdHJhcEZvY3VzID09PSAnZnVuY3Rpb24nKSB0cmFwRm9jdXMoJ2J1bGxldC1yZW9yZGVyLW1vZGFsJyk7XG4gIGlmICh0eXBlb2Ygc2V0SW5pdGlhbEZvY3VzID09PSAnZnVuY3Rpb24nKSBzZXRJbml0aWFsRm9jdXMoJ2J1bGxldC1yZW9yZGVyLW1vZGFsJyk7XG5cbiAgLy8gQ2xvc2Ugb24gRXNjYXBlXG4gIGNvbnN0IGVzY0hhbmRsZXIgPSAoZSkgPT4ge1xuICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHJlc3RvcmVGb2N1cygpO1xuICAgICAgbW9kYWwucmVtb3ZlKCk7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZXNjSGFuZGxlcik7XG4gICAgfVxuICB9O1xuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZXNjSGFuZGxlcik7XG5cbiAgLy8gUG9wdWxhdGUgbGlzdCBpdGVtc1xuICBjb25zdCBsaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J1bGxldC1yZW9yZGVyLWxpc3QnKTtcbiAgYWNoaWV2ZW1lbnRzLmZvckVhY2goKGFjaCwgaWR4KSA9PiB7XG4gICAgY29uc3QgdGV4dCA9ICh0eXBlb2YgYWNoID09PSAnb2JqZWN0JyA/IChhY2gudGV4dCB8fCAnJykgOiBTdHJpbmcoYWNoKSk7XG4gICAgY29uc3QgbGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpO1xuICAgIGxpLmRhdGFzZXQub3JpZ0luZGV4ID0gaWR4O1xuICAgIGxpLnN0eWxlLmNzc1RleHQgPSBgZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmZsZXgtc3RhcnQ7Z2FwOjhweDtwYWRkaW5nOjhweDttYXJnaW4tYm90dG9tOjZweDtcbiAgICAgIGJhY2tncm91bmQ6I2Y4ZmFmYztib3JkZXI6MXB4IHNvbGlkICNlMmU4ZjA7Ym9yZGVyLXJhZGl1czo2cHg7YDtcbiAgICBsaS5pbm5lckhUTUwgPSBgXG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtnYXA6MnB4O2ZsZXgtc2hyaW5rOjA7XCI+XG4gICAgICAgIDxidXR0b24gdGl0bGU9XCJNb3ZlIHVwXCIgYXJpYS1sYWJlbD1cIk1vdmUgYnVsbGV0IHVwXCJcbiAgICAgICAgICBvbmNsaWNrPVwibW92ZUJ1bGxldCh0aGlzLC0xKVwiXG4gICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOjFweCBzb2xpZCAjZDFkNWRiO2JvcmRlci1yYWRpdXM6M3B4O1xuICAgICAgICAgICAgICAgICBjdXJzb3I6cG9pbnRlcjtwYWRkaW5nOjFweCA1cHg7bGluZS1oZWlnaHQ6MS4yO2ZvbnQtc2l6ZTowLjllbTtcIj5cdTIxOTE8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiB0aXRsZT1cIk1vdmUgZG93blwiIGFyaWEtbGFiZWw9XCJNb3ZlIGJ1bGxldCBkb3duXCJcbiAgICAgICAgICBvbmNsaWNrPVwibW92ZUJ1bGxldCh0aGlzLCsxKVwiXG4gICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOjFweCBzb2xpZCAjZDFkNWRiO2JvcmRlci1yYWRpdXM6M3B4O1xuICAgICAgICAgICAgICAgICBjdXJzb3I6cG9pbnRlcjtwYWRkaW5nOjFweCA1cHg7bGluZS1oZWlnaHQ6MS4yO2ZvbnQtc2l6ZTowLjllbTtcIj5cdTIxOTM8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPHNwYW4gc3R5bGU9XCJmbGV4OjE7Zm9udC1zaXplOjAuOWVtO1wiPiR7dGV4dH08L3NwYW4+YDtcbiAgICBsaXN0LmFwcGVuZENoaWxkKGxpKTtcbiAgfSk7XG4gIF91cGRhdGVCdWxsZXRBcnJvd3MoKTtcblxuICAvLyBXaXJlIHVwIFwiVXNlIFN1Z2dlc3RlZCBPcmRlclwiIGJ1dHRvbiBpZiBqb2IgYW5hbHlzaXMgaXMgYXZhaWxhYmxlXG4gIGlmIChoYXNKb2JBbmFseXNpcyAmJiBwcm9wb3NlZE9yZGVyKSB7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VzZS1sbG0tb3JkZXItYnRuJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgX2FwcGx5QnVsbGV0T3JkZXIocHJvcG9zZWRPcmRlcik7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2FwcGx5QnVsbGV0T3JkZXIob3JkZXIpIHtcbiAgY29uc3QgbGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidWxsZXQtcmVvcmRlci1saXN0Jyk7XG4gIGlmICghbGlzdCkgcmV0dXJuO1xuICBjb25zdCBpdGVtcyA9IEFycmF5LmZyb20obGlzdC5xdWVyeVNlbGVjdG9yQWxsKCdsaScpKTtcbiAgLy8gQnVpbGQgYSBtYXAgZnJvbSBvcmlnSW5kZXggXHUyMTkyIGxpIGVsZW1lbnRcbiAgY29uc3QgYnlPcmlnID0ge307XG4gIGl0ZW1zLmZvckVhY2gobGkgPT4geyBieU9yaWdbcGFyc2VJbnQobGkuZGF0YXNldC5vcmlnSW5kZXgsIDEwKV0gPSBsaTsgfSk7XG4gIC8vIFJlLWFwcGVuZCBpbiBwcm9wb3NlZCBvcmRlciwgdGhlbiBhbnkgbm90IGxpc3RlZFxuICBjb25zdCBsaXN0ZWQgPSBuZXcgU2V0KG9yZGVyLm1hcChOdW1iZXIpKTtcbiAgb3JkZXIuZm9yRWFjaChpZHggPT4geyBpZiAoYnlPcmlnW2lkeF0pIGxpc3QuYXBwZW5kQ2hpbGQoYnlPcmlnW2lkeF0pOyB9KTtcbiAgaXRlbXMuZm9yRWFjaChsaSA9PiB7XG4gICAgaWYgKCFsaXN0ZWQuaGFzKHBhcnNlSW50KGxpLmRhdGFzZXQub3JpZ0luZGV4LCAxMCkpKSBsaXN0LmFwcGVuZENoaWxkKGxpKTtcbiAgfSk7XG4gIF91cGRhdGVCdWxsZXRBcnJvd3MoKTtcbn1cblxuZnVuY3Rpb24gbW92ZUJ1bGxldChidG4sIGRpcmVjdGlvbikge1xuICBjb25zdCBsaSAgID0gYnRuLmNsb3Nlc3QoJ2xpJyk7XG4gIGNvbnN0IGxpc3QgPSBsaS5wYXJlbnROb2RlO1xuICBpZiAoZGlyZWN0aW9uID09PSAtMSAmJiBsaS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nKSB7XG4gICAgbGlzdC5pbnNlcnRCZWZvcmUobGksIGxpLnByZXZpb3VzRWxlbWVudFNpYmxpbmcpO1xuICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gKzEgJiYgbGkubmV4dEVsZW1lbnRTaWJsaW5nKSB7XG4gICAgbGlzdC5pbnNlcnRCZWZvcmUobGkubmV4dEVsZW1lbnRTaWJsaW5nLCBsaSk7XG4gIH1cbiAgX3VwZGF0ZUJ1bGxldEFycm93cygpO1xufVxuXG5mdW5jdGlvbiBfdXBkYXRlQnVsbGV0QXJyb3dzKCkge1xuICBjb25zdCBsaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J1bGxldC1yZW9yZGVyLWxpc3QnKTtcbiAgaWYgKCFsaXN0KSByZXR1cm47XG4gIGNvbnN0IGl0ZW1zID0gbGlzdC5xdWVyeVNlbGVjdG9yQWxsKCdsaScpO1xuICBpdGVtcy5mb3JFYWNoKChsaSwgaWR4KSA9PiB7XG4gICAgY29uc3QgW3VwQnRuLCBkb3duQnRuXSA9IGxpLnF1ZXJ5U2VsZWN0b3JBbGwoJ2J1dHRvbicpO1xuICAgIHVwQnRuLmRpc2FibGVkICAgPSBpZHggPT09IDA7XG4gICAgZG93bkJ0bi5kaXNhYmxlZCA9IGlkeCA9PT0gaXRlbXMubGVuZ3RoIC0gMTtcbiAgICB1cEJ0bi5zdHlsZS5vcGFjaXR5ICAgPSB1cEJ0bi5kaXNhYmxlZCAgID8gJzAuMycgOiAnMSc7XG4gICAgZG93bkJ0bi5zdHlsZS5vcGFjaXR5ID0gZG93bkJ0bi5kaXNhYmxlZCA/ICcwLjMnIDogJzEnO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZUJ1bGxldE9yZGVyKGV4cElkKSB7XG4gIGNvbnN0IGxpc3QgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J1bGxldC1yZW9yZGVyLWxpc3QnKTtcbiAgY29uc3QgaXRlbXMgPSBsaXN0ID8gbGlzdC5xdWVyeVNlbGVjdG9yQWxsKCdsaScpIDogW107XG4gIGNvbnN0IG9yZGVyID0gQXJyYXkuZnJvbShpdGVtcykubWFwKGxpID0+IHBhcnNlSW50KGxpLmRhdGFzZXQub3JpZ0luZGV4LCAxMCkpO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9yZW9yZGVyLWJ1bGxldHMnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeydDb250ZW50LVR5cGUnOidhcHBsaWNhdGlvbi9qc29uJ30sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7ZXhwZXJpZW5jZV9pZDogZXhwSWQsIG9yZGVyfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKCFyZXMub2sgfHwgIWRhdGEub2spIHtcbiAgICAgIGFwcGVuZFJldHJ5TWVzc2FnZSgnXHUyNkEwIENvdWxkIG5vdCBzYXZlIGJ1bGxldCBvcmRlcjogJyArIChkYXRhLmVycm9yfHwnVW5rbm93bicpLCAoKSA9PiBzYXZlQnVsbGV0T3JkZXIoZXhwSWQpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ1x1MjE5NSBCdWxsZXQgb3JkZXIgc2F2ZWQuIEl0IHdpbGwgYXBwbHkgd2hlbiB5b3UgZ2VuZXJhdGUgdGhlIENWLicpO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidWxsZXQtcmVvcmRlci1tb2RhbCcpPy5yZW1vdmUoKTtcbiAgfSBjYXRjaChlKSB7XG4gICAgYXBwZW5kUmV0cnlNZXNzYWdlKCdcdTI2QTAgTmV0d29yayBlcnJvciBzYXZpbmcgYnVsbGV0IG9yZGVyOiAnICsgZS5tZXNzYWdlLCAoKSA9PiBzYXZlQnVsbGV0T3JkZXIoZXhwSWQpKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZXNldEJ1bGxldE9yZGVyKGV4cElkKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL3Jlb3JkZXItYnVsbGV0cycsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7J0NvbnRlbnQtVHlwZSc6J2FwcGxpY2F0aW9uL2pzb24nfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtleHBlcmllbmNlX2lkOiBleHBJZCwgb3JkZXI6IFtdfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKCFyZXMub2sgfHwgIWRhdGEub2spIHtcbiAgICAgIGFwcGVuZFJldHJ5TWVzc2FnZSgnXHUyNkEwIENvdWxkIG5vdCByZXNldCBidWxsZXQgb3JkZXI6ICcgKyAoZGF0YS5lcnJvcnx8J1Vua25vd24nKSwgKCkgPT4gcmVzZXRCdWxsZXRPcmRlcihleHBJZCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCAnXHUyMUJBIEJ1bGxldCBvcmRlciByZXNldC4gUmVsZXZhbmNlLWJhc2VkIG9yZGVyaW5nIHdpbGwgYXBwbHkuJyk7XG4gICAgcmVzdG9yZUZvY3VzKCk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J1bGxldC1yZW9yZGVyLW1vZGFsJyk/LnJlbW92ZSgpO1xuICB9IGNhdGNoKGUpIHtcbiAgICBhcHBlbmRSZXRyeU1lc3NhZ2UoJ1x1MjZBMCBOZXR3b3JrIGVycm9yIHJlc2V0dGluZyBidWxsZXQgb3JkZXI6ICcgKyBlLm1lc3NhZ2UsICgpID0+IHJlc2V0QnVsbGV0T3JkZXIoZXhwSWQpKTtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgRm9yd2FyZC1za2lwIHBoYXNlIHdhdGVybWFyayAoR0FQLTEwMSkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8vIEJhY2tlbmQgcGhhc2Ugb3JkZXJpbmcgKG1hdGNoZXMgY29udmVyc2F0aW9uX21hbmFnZXIucHkgX1BIQVNFX09SREVSKS5cbmNvbnN0IF9QSEFTRV9QUk9HUkVTU0lPTiA9IFtcbiAgJ2luaXQnLCAnam9iX2FuYWx5c2lzJywgJ2N1c3RvbWl6YXRpb24nLCAncmV3cml0ZV9yZXZpZXcnLFxuICAnc3BlbGxfY2hlY2snLCAnZ2VuZXJhdGlvbicsICdsYXlvdXRfcmV2aWV3JywgJ2ZpbmFsX2dlbmVyYXRpb24nLCAncmVmaW5lbWVudCcsXG5dO1xuXG4vLyBNaW5pbXVtIGhpZ2hlc3RQaGFzZSBpbmRleCByZXF1aXJlZCBmb3IgZWFjaCBzdGVwIHRvIGJlIGZvcndhcmQtc2tpcHBhYmxlLlxuY29uc3QgX1NURVBfRldEX1BIQVNFX01JTiA9IHtcbiAgYW5hbHlzaXM6ICAgICAgIDEsICAgLy8gam9iX2FuYWx5c2lzXG4gIGN1c3RvbWl6YXRpb25zOiAyLCAgIC8vIGN1c3RvbWl6YXRpb25cbiAgcmV3cml0ZTogICAgICAgIDMsICAgLy8gcmV3cml0ZV9yZXZpZXdcbiAgc3BlbGw6ICAgICAgICAgIDQsICAgLy8gc3BlbGxfY2hlY2tcbiAgbGF5b3V0OiAgICAgICAgIDUsICAgLy8gZ2VuZXJhdGlvblxuICBkb3dubG9hZDogICAgICAgNywgICAvLyBmaW5hbF9nZW5lcmF0aW9uXG4gIGNvdmVyX2xldHRlcjogICA3LFxuICBzY3JlZW5pbmc6ICAgICAgNyxcbiAgaW50ZXJ2aWV3X3ByZXA6IDcsXG4gIHRoYW5rX3lvdTogICAgICA3LFxuICBoYXJ2ZXN0OiAgICAgICAgNyxcbn07XG5cbi8vIFx1MjUwMFx1MjUwMCBXb3JrZmxvdyBzdGVwIGJhciBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gdXBkYXRlV29ya2Zsb3dTdGVwcyhzdGF0dXMpIHtcbiAgLy8gMTItc3RlcCB3b3JrZmxvdyBiYXI6IEpvYiBJbnB1dCBcdTIxOTIgQW5hbHlzaXMgXHUyMTkyIEN1c3RvbWlzZSBcdTIxOTIgUmV3cml0ZXMgXHUyMTkyXG4gIC8vICAgU3BlbGwgQ2hlY2sgXHUyMTkyIExheW91dCBSZXZpZXcgXHUyMTkyIERvd25sb2FkIFx1MjE5MiBDb3ZlciBMZXR0ZXIgXHUyMTkyIFNjcmVlbmluZyBcdTIxOTJcbiAgLy8gICBJbnRlcnZpZXcgUHJlcCBcdTIxOTIgVGhhbmsgWW91IFx1MjE5MiBIYXJ2ZXN0XG4gIC8vXG4gIGNvbnN0IFVQQ09NSU5HID0gbmV3IFNldCgpO1xuXG4gIC8vIFN0ZXBzIHRoYXQgc3VwcG9ydCBMTE0gcmUtZXhlY3V0aW9uIHZpYSAvYXBpL3JlLXJ1bi1waGFzZVxuICBjb25zdCBSRV9SVU5fU1RFUFMgPSBuZXcgU2V0KFsnYW5hbHlzaXMnLCAnY3VzdG9taXphdGlvbnMnLCAncmV3cml0ZScsICdzcGVsbCcsICdsYXlvdXQnXSk7XG5cbiAgLy8gQmFzZSBsYWJlbCBmb3IgZWFjaCBzdGVwICh1c2VkIHdoZW4gaW5qZWN0aW5nIFx1MjFCQiBidXR0b24pXG4gIGNvbnN0IFNURVBfTEFCRUxTID0ge1xuICAgIGpvYjogICAgICAgICAgICAnXHVEODNEXHVEQ0U1IEpvYiBJbnB1dCcsXG4gICAgYW5hbHlzaXM6ICAgICAgICdcdUQ4M0RcdUREMEQgQW5hbHlzaXMnLFxuICAgIGN1c3RvbWl6YXRpb25zOiAnXHUyNjk5XHVGRTBGIEN1c3RvbWlzZScsXG4gICAgcmV3cml0ZTogICAgICAgICdcdTI3MEZcdUZFMEYgUmV3cml0ZXMnLFxuICAgIHNwZWxsOiAgICAgICAgICAnXHVEODNEXHVERDI0IFNwZWxsIENoZWNrJyxcbiAgICBsYXlvdXQ6ICAgICAgICAgJ1x1RDgzQ1x1REZBOCBMYXlvdXQgUmV2aWV3JyxcbiAgICBkb3dubG9hZDogICAgICAgJ1x1MkIwN1x1RkUwRiBEb3dubG9hZCBGaWxlcycsXG4gICAgY292ZXJfbGV0dGVyOiAgICdcdUQ4M0RcdURDRTkgQ292ZXIgTGV0dGVyJyxcbiAgICBzY3JlZW5pbmc6ICAgICAgJ1x1RDgzRFx1RENDQiBTY3JlZW5pbmcnLFxuICAgIGludGVydmlld19wcmVwOiAnXHVEODNDXHVERkE0IEludGVydmlldyBQcmVwJyxcbiAgICB0aGFua195b3U6ICAgICAgJ1x1RDgzRFx1REU0RiBUaGFuayBZb3UnLFxuICAgIGhhcnZlc3Q6ICAgICAgICAnXHVEODNDXHVERjNFIEhhcnZlc3QnLFxuICB9O1xuXG4gIC8vIERldGVybWluZSB3aGljaCBzdGVwcyBhcmUgZG9uZSBiYXNlZCBvbiBzZXNzaW9uIHN0YXRlIGZpZWxkcy5cbiAgY29uc3QgcGhhc2UgPSBzdGF0dXMucGhhc2UgfHwgJyc7XG4gIC8vIEFsbCBwb3N0LWxheW91dCBwaGFzZXMgdW5sb2NrIHNpbXVsdGFuZW91c2x5IG9uY2UgbGF5b3V0IGlzIGNvbmZpcm1lZC5cbiAgY29uc3QgcG9zdExheW91dCA9IHBoYXNlID09PSBQSEFTRVMuRklOQUxfR0VORVJBVElPTiB8fCBwaGFzZSA9PT0gUEhBU0VTLlJFRklORU1FTlQ7XG4gIGNvbnN0IGRvbmUgPSB7XG4gICAgam9iOiAgICAgICAgICAgICEhc3RhdHVzLmpvYl9kZXNjcmlwdGlvbixcbiAgICBhbmFseXNpczogICAgICAgISFzdGF0dXMuam9iX2FuYWx5c2lzLFxuICAgIGN1c3RvbWl6YXRpb25zOiAhIXN0YXR1cy5jdXN0b21pemF0aW9ucyxcbiAgICByZXdyaXRlOiAgICAgICAgcGhhc2UgIT09IFBIQVNFUy5SRVdSSVRFX1JFVklFVyAmJiAoISFzdGF0dXMuY3VzdG9taXphdGlvbnMpLFxuICAgIHNwZWxsOiAgICAgICAgICBwaGFzZSA9PT0gUEhBU0VTLkdFTkVSQVRJT04gfHwgcGhhc2UgPT09IFBIQVNFUy5MQVlPVVRfUkVWSUVXIHx8XG4gICAgICAgICAgICAgICAgICAgIHBoYXNlID09PSBQSEFTRVMuRklOQUxfR0VORVJBVElPTiB8fCBwaGFzZSA9PT0gUEhBU0VTLlJFRklORU1FTlQsXG4gICAgbGF5b3V0OiAgICAgICAgIHBvc3RMYXlvdXQsXG4gICAgZG93bmxvYWQ6ICAgICAgIHBvc3RMYXlvdXQsXG4gICAgY292ZXJfbGV0dGVyOiAgIHBvc3RMYXlvdXQsXG4gICAgc2NyZWVuaW5nOiAgICAgIHBvc3RMYXlvdXQsXG4gICAgaW50ZXJ2aWV3X3ByZXA6IHBvc3RMYXlvdXQsXG4gICAgdGhhbmtfeW91OiAgICAgIHBvc3RMYXlvdXQsXG4gICAgaGFydmVzdDogICAgICAgIHBvc3RMYXlvdXQsXG4gIH07XG5cbiAgLy8gRm9yd2FyZC1za2lwIHdhdGVybWFyayAoR0FQLTEwMSk6IHN0ZXBzIHByZXZpb3VzbHkgcmVhY2hlZCBidXQgbm90IGN1cnJlbnRseVxuICAvLyBcImRvbmVcIiBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgcGhhc2UgYXJlIHN0aWxsIG5hdmlnYWJsZSB3aXRoIGEgY29uZmlybWF0aW9uLlxuICBjb25zdCBoaWdoZXN0UGhhc2VJZHggPSBfUEhBU0VfUFJPR1JFU1NJT04uaW5kZXhPZihzdGF0dXMuaGlnaGVzdF9waGFzZSB8fCAnJyk7XG4gIGNvbnN0IGN1cnJlbnRQaGFzZUlkeCA9IF9QSEFTRV9QUk9HUkVTU0lPTi5pbmRleE9mKHBoYXNlKTtcblxuICAvLyBEZXRlcm1pbmUgdGhlIGFjdGl2ZSBzdGVwIGZyb20gdGhlIGJhY2tlbmQgcGhhc2Ugc3RyaW5nLlxuICBjb25zdCBwaGFzZVRvU3RlcCA9IHtcbiAgICAnaW5pdCc6ICAgICAgICAgICAgICdqb2InLFxuICAgICdqb2JfYW5hbHlzaXMnOiAgICAgJ2FuYWx5c2lzJyxcbiAgICAnY3VzdG9taXphdGlvbic6ICAgICdjdXN0b21pemF0aW9ucycsXG4gICAgJ3Jld3JpdGVfcmV2aWV3JzogICAncmV3cml0ZScsXG4gICAgJ3NwZWxsX2NoZWNrJzogICAgICAnc3BlbGwnLFxuICAgICdnZW5lcmF0aW9uJzogICAgICAgJ2xheW91dCcsXG4gICAgJ2xheW91dF9yZXZpZXcnOiAgICAnbGF5b3V0JyxcbiAgICAnZmluYWxfZ2VuZXJhdGlvbic6ICdkb3dubG9hZCcsXG4gICAgJ3JlZmluZW1lbnQnOiAgICAgICAnZG93bmxvYWQnLFxuICB9O1xuICBjb25zdCBhY3RpdmVTdGVwID0gcGhhc2VUb1N0ZXBbcGhhc2VdIHx8ICdqb2InO1xuXG4gIC8vIFJlc29sdmUgdGhlIHJlZW50cnkgc3RlcCBmb3IgdGhlIFwiUmVmaW5pbmdcIiBiYWRnZVxuICBjb25zdCBfcGhhc2VUb1N0ZXAyID0gT2JqZWN0LmFzc2lnbih7J2luaXQnOiAnam9iJ30sIHBoYXNlVG9TdGVwKTtcbiAgY29uc3QgcmVlbnRyeVN0ZXAgPSBzdGF0dXMuaXRlcmF0aW5nXG4gICAgPyAoX3BoYXNlVG9TdGVwMltzdGF0dXMucmVlbnRyeV9waGFzZV0gfHwgc3RhdHVzLnJlZW50cnlfcGhhc2UgfHwgbnVsbClcbiAgICA6IG51bGw7XG5cbiAgY29uc3Qgc3RlcElkcyA9IFtcbiAgICAnam9iJywgJ2FuYWx5c2lzJywgJ2N1c3RvbWl6YXRpb25zJywgJ3Jld3JpdGUnLCAnc3BlbGwnLCAnbGF5b3V0JyxcbiAgICAnZG93bmxvYWQnLCAnY292ZXJfbGV0dGVyJywgJ3NjcmVlbmluZycsICdpbnRlcnZpZXdfcHJlcCcsICd0aGFua195b3UnLCAnaGFydmVzdCcsXG4gIF07XG4gIGNvbnN0IHN0YWxlU3RlcHMgPSBuZXcgU2V0KHN0YXR1cy5zdGFsZV9zdGVwcyB8fCBbXSk7XG4gIHN0ZXBJZHMuZm9yRWFjaChzdGVwID0+IHtcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzdGVwLSR7c3RlcH1gKTtcbiAgICBpZiAoIWVsKSByZXR1cm47XG4gICAgLy8gVXBjb21pbmcgc3RlcHMgYXJlIGZpeGVkIFx1MjAxNCBuZXZlciBjaGFuZ2UgdGhlaXIgY2xhc3MuXG4gICAgaWYgKFVQQ09NSU5HLmhhcyhzdGVwKSkgcmV0dXJuO1xuICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScsICdjb21wbGV0ZWQnLCAnY2xpY2thYmxlJywgJ3VwY29taW5nJywgJ3N0YWxlJywgJ2ZvcndhcmQtc2tpcCcpO1xuXG4gICAgbGV0IGxhYmVsID0gU1RFUF9MQUJFTFNbc3RlcF0gfHwgc3RlcDtcblxuICAgIGlmIChzdGVwID09PSBhY3RpdmVTdGVwKSB7XG4gICAgICBlbC5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICAgIC8vIFwiXHUyMUJCIFJlZmluaW5nXCIgYmFkZ2Ugc2hvd24gb24gdGhlIGFjdGl2ZSBzdGVwIHdoZW4gaXRlcmF0aW5nXG4gICAgICBpZiAoc3RhdHVzLml0ZXJhdGluZyAmJiByZWVudHJ5U3RlcCA9PT0gc3RlcCkge1xuICAgICAgICBsYWJlbCArPSAnIDxzcGFuIGNsYXNzPVwic3RlcC1pbmxpbmUtYmFkZ2VcIj5cdTIxQkIgUmVmaW5pbmc8L3NwYW4+JztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGRvbmVbc3RlcF0pIHtcbiAgICAgIGVsLmNsYXNzTGlzdC5hZGQoJ2NvbXBsZXRlZCcpO1xuICAgICAgLy8gQ29tcGxldGVkIHN0ZXBzIGFyZSBjbGlja2FibGUgZm9yIGJhY2stbmF2aWdhdGlvbi5cbiAgICAgIGVsLmNsYXNzTGlzdC5hZGQoJ2NsaWNrYWJsZScpO1xuICAgICAgLy8gQWRkIFx1MjFCQiByZS1ydW4gYnV0dG9uIGZvciBzdGVwcyB0aGF0IHN1cHBvcnQgTExNIHJlLWV4ZWN1dGlvblxuICAgICAgaWYgKFJFX1JVTl9TVEVQUy5oYXMoc3RlcCkpIHtcbiAgICAgICAgY29uc3QgcmVydW5MYWJlbCA9IF9TVEVQX0RJU1BMQVlbc3RlcF0gfHwgc3RlcDtcbiAgICAgICAgbGFiZWwgKz0gYCA8YnV0dG9uIGNsYXNzPVwic3RlcC1yZXJ1blwiIGFyaWEtbGFiZWw9XCJSZS1ydW4gJHtyZXJ1bkxhYmVsfVwiXG4gICAgICAgICAgdGl0bGU9XCJSZS1ydW4gJHtzdGVwfSB3aXRoIHVwZGF0ZWQgaW5wdXRzXCJcbiAgICAgICAgICBvbmNsaWNrPVwiZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7Y29uZmlybVJlUnVuUGhhc2UoJyR7c3RlcH0nKVwiXG4gICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6MC44ZW07b3BhY2l0eTowLjM1O3RyYW5zaXRpb246b3BhY2l0eSAwLjE1czttYXJnaW4tbGVmdDoycHg7Y3Vyc29yOnBvaW50ZXI7YmFja2dyb3VuZDpub25lO2JvcmRlcjpub25lO3BhZGRpbmc6MDtjb2xvcjppbmhlcml0O2xpbmUtaGVpZ2h0OjE7XCI+XHUyMUJCPC9idXR0b24+YDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGhpZ2hlc3RQaGFzZUlkeCA+PSAwICYmIChfU1RFUF9GV0RfUEhBU0VfTUlOW3N0ZXBdID8/IEluZmluaXR5KSA8PSBoaWdoZXN0UGhhc2VJZHhcbiAgICAgICAgICAgICAgICYmIGhpZ2hlc3RQaGFzZUlkeCA+IGN1cnJlbnRQaGFzZUlkeCkge1xuICAgICAgLy8gRm9yd2FyZC1za2lwOiBzdGVwIHdhcyBjb21wbGV0ZWQgaW4gYSBwcmlvciBpdGVyYXRpb24gYnV0IGlzIGFoZWFkIG9mIGN1cnJlbnQgcGhhc2UuXG4gICAgICBlbC5jbGFzc0xpc3QuYWRkKCdmb3J3YXJkLXNraXAnLCAnY2xpY2thYmxlJyk7XG4gICAgICBsYWJlbCArPSAnIDxzcGFuIGNsYXNzPVwic3RlcC1pbmxpbmUtYmFkZ2Ugc3RlcC1md2QtYmFkZ2VcIiB0aXRsZT1cIlByZXZpb3VzbHkgY29tcGxldGVkIFx1MjAxNCBjbGljayB0byBqdW1wIGFoZWFkXCI+XHUyM0U5PC9zcGFuPic7XG4gICAgfVxuXG4gICAgLy8gQXBwbHkgc3RhbGUgY2xhc3MgZm9yIHN0ZXBzIGRvd25zdHJlYW0gb2YgYSByZS1ydW5cbiAgICBpZiAoc3RhbGVTdGVwcy5oYXMoc3RlcCkpIGVsLmNsYXNzTGlzdC5hZGQoJ3N0YWxlJyk7XG5cbiAgICAvLyBBcHBlbmQgc3Itb25seSBzdGF0ZSBkZXNjcmlwdGlvbiBmb3Igc2NyZWVuIHJlYWRlciB1c2Vyc1xuICAgIGNvbnN0IGlzU3RhbGUgICAgICAgICA9IHN0YWxlU3RlcHMuaGFzKHN0ZXApO1xuICAgIGNvbnN0IGlzU3RhbGVDcml0aWNhbCA9IGVsLmNsYXNzTGlzdC5jb250YWlucygnc3RhbGUtY3JpdGljYWwnKTtcbiAgICBjb25zdCBpc0FjdGl2ZSAgICAgICAgPSBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2FjdGl2ZScpO1xuICAgIGNvbnN0IGlzQ29tcGxldGVkICAgICA9IGVsLmNsYXNzTGlzdC5jb250YWlucygnY29tcGxldGVkJyk7XG4gICAgY29uc3QgaXNGd2RTa2lwICAgICAgID0gZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdmb3J3YXJkLXNraXAnKTtcbiAgICBjb25zdCBzclN0YXRlID0gaXNTdGFsZUNyaXRpY2FsID8gJyAoY3JpdGljYWwgXHUyMDE0IHJldmlldyByZXF1aXJlZCknXG4gICAgICA6IGlzU3RhbGUgICAgID8gJyAoc3RhbGUgXHUyMDE0IHJlc3VsdHMgbWF5IGJlIG91dGRhdGVkKSdcbiAgICAgIDogaXNBY3RpdmUgICAgPyAnIChjdXJyZW50IHN0ZXApJ1xuICAgICAgOiBpc0NvbXBsZXRlZCA/ICcgKGNvbXBsZXRlZCknXG4gICAgICA6IGlzRndkU2tpcCAgID8gJyAocHJldmlvdXNseSBjb21wbGV0ZWQgXHUyMDE0IGNsaWNrIHRvIGp1bXAgYWhlYWQpJ1xuICAgICAgOiAnJztcbiAgICBpZiAoc3JTdGF0ZSkgbGFiZWwgKz0gYDxzcGFuIGNsYXNzPVwic3Itb25seVwiPiR7c3JTdGF0ZX08L3NwYW4+YDtcblxuICAgIGVsLmlubmVySFRNTCA9IGxhYmVsO1xuICB9KTtcblxuICBhcHBseUxheW91dEZyZXNobmVzc05hdmlnYXRpb25TdGF0ZSgpO1xuXG4gIC8vIFNob3cgXHUyMUJCIGljb25zIHZpYSBDU1MgOmhvdmVyIG9uIHRoZSBwYXJlbnQgLmNvbXBsZXRlZCBzdGVwXG4gIC8vIChpbmplY3QgYSA8c3R5bGU+IG9ubHkgb25jZSlcbiAgaWYgKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RlcC1yZXJ1bi1zdHlsZScpKSB7XG4gICAgY29uc3QgcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgcy5pZCA9ICdzdGVwLXJlcnVuLXN0eWxlJztcbiAgICBzLnRleHRDb250ZW50ID0gJy5zdGVwLmNvbXBsZXRlZDpob3ZlciAuc3RlcC1yZXJ1biwgLnN0ZXAuY29tcGxldGVkOmZvY3VzLXdpdGhpbiAuc3RlcC1yZXJ1biB7IG9wYWNpdHk6IDEgIWltcG9ydGFudDsgfSAuc3RlcC1yZXJ1bjpmb2N1cy12aXNpYmxlIHsgb3V0bGluZTogMnB4IHNvbGlkICMzYjgyZjY7IG91dGxpbmUtb2Zmc2V0OiAycHg7IG9wYWNpdHk6IDEgIWltcG9ydGFudDsgfSc7XG4gICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzKTtcbiAgfVxuXG4gIC8vIFN5bmMgc2Vjb25kLWJhciB0YWIgdmlzaWJpbGl0eSBhbmQgYWN0aW9uIGJ1dHRvbnMgdG8gdGhlIGFjdGl2ZSB3b3JrZmxvdyBzdGVwXG4gIGlmICh0eXBlb2YgdXBkYXRlVGFiQmFyRm9yU3RhZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICB1cGRhdGVUYWJCYXJGb3JTdGFnZShhY3RpdmVTdGVwKTtcbiAgfVxuICB1cGRhdGVBY3Rpb25CdXR0b25zKGFjdGl2ZVN0ZXApO1xuXG4gIC8vIFN5bmMgdmlldy1jdXJzb3IgcmluZyB0byB0aGUgY3VycmVudGx5IHZpc2libGUgdGFiXG4gIF91cGRhdGVWaWV3aW5nSW5kaWNhdG9yKHN0YXRlTWFuYWdlci5nZXRDdXJyZW50VGFiKCkpO1xufVxuXG5pZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoR0VORVJBVElPTl9TVEFURV9FVkVOVCwgYXBwbHlMYXlvdXRGcmVzaG5lc3NOYXZpZ2F0aW9uU3RhdGUpO1xuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihHRU5FUkFUSU9OX1NUQVRFX0VWRU5ULCBhcHBseURpcnR5UGhhc2VOYXZpZ2F0aW9uU3RhdGUpO1xufVxuXG4vKipcbiAqIE1hcmsgb3IgdW5tYXJrIHdvcmtmbG93IHN0ZXAgcGlsbHMgYXMgc3RhbGUgYmFzZWQgb24gZGlydHkgcGhhc2VzIHNldCBieVxuICogbGF5b3V0LXBoYXNlIGNvbnRlbnQgZWRpdHMgKFBPU1QgL2FwaS9jdi9hcHBseS1jb250ZW50LWNoYW5nZXMpLlxuICpcbiAqIE9ubHkgYWZmZWN0cyBzdGVwcyBsaXN0ZWQgaW4gc3RhdGVNYW5hZ2VyLmdldERpcnR5UGhhc2VzKCkgdGhhdCBhcmUgTk9UXG4gKiBhbHJlYWR5IGhhbmRsZWQgYnkgYXBwbHlMYXlvdXRGcmVzaG5lc3NOYXZpZ2F0aW9uU3RhdGUgKGkuZS4gbm90ICdsYXlvdXQnKS5cbiAqL1xuZnVuY3Rpb24gYXBwbHlEaXJ0eVBoYXNlTmF2aWdhdGlvblN0YXRlKCkge1xuICBjb25zdCBkaXJ0eVBoYXNlcyA9IHN0YXRlTWFuYWdlci5nZXREaXJ0eVBoYXNlcygpO1xuICBjb25zdCBzdGVwc1RvQ2xlYXIgPSBbXTsgICAgLy8gc3RlcHMgd2UgbWFuYWdlIGhlcmUgKG5vdCAnbGF5b3V0JylcblxuICBzdGVwc1RvQ2xlYXIuZm9yRWFjaChzdGVwID0+IHtcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzdGVwLSR7c3RlcH1gKTtcbiAgICBpZiAoIWVsKSByZXR1cm47XG5cbiAgICBjb25zdCBpc0RpcnR5ID0gZGlydHlQaGFzZXMuaW5jbHVkZXMoc3RlcCk7XG4gICAgZWwuY2xhc3NMaXN0LnRvZ2dsZSgnc3RhbGUnLCBpc0RpcnR5KTtcblxuICAgIC8vIFByZXNlcnZlIGV4aXN0aW5nIHJlcnVuIGJ1dHRvbiBtYXJrdXAsIHVwZGF0ZSB0ZXh0ICsgYmFkZ2VcbiAgICBjb25zdCByZXJ1bkh0bWwgPSBlbC5xdWVyeVNlbGVjdG9yKCcuc3RlcC1yZXJ1bicpPy5vdXRlckhUTUwgfHwgJyc7XG4gICAgY29uc3QgbGFiZWwgICAgID0gX1NURVBfRElTUExBWVtzdGVwXSB8fCBzdGVwO1xuICAgIGNvbnN0IGJhZGdlICAgICA9IGlzRGlydHlcbiAgICAgID8gJyA8c3BhbiBjbGFzcz1cInN0ZXAtaW5saW5lLWJhZGdlIHN0ZXAtc3RhbGUtYmFkZ2VcIj5Db250ZW50IGNoYW5nZWQ8L3NwYW4+J1xuICAgICAgOiAnJztcbiAgICBlbC5pbm5lckhUTUwgPSBgJHtsYWJlbH0ke2JhZGdlfSR7cmVydW5IdG1sID8gYCAke3JlcnVuSHRtbH1gIDogJyd9YDtcbiAgfSk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBTdGVwIG5hdmlnYXRpb24gaGVscGVyIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBfZG9TdGVwTmF2aWdhdGUoc3RlcCkge1xuICBjb25zdCBzdGVwVG9UYWIgPSB7XG4gICAgYW5hbHlzaXM6ICAgICAgICdhbmFseXNpcycsXG4gICAgY3VzdG9taXphdGlvbnM6ICdnb2FscycsXG4gICAgcmV3cml0ZTogICAgICAgICdyZXdyaXRlJyxcbiAgICBzcGVsbDogICAgICAgICAgJ3NwZWxsJyxcbiAgICBsYXlvdXQ6ICAgICAgICAgJ2xheW91dCcsXG4gICAgZG93bmxvYWQ6ICAgICAgICdmaW5hbF9nZW5lcmF0ZScsXG4gICAgY292ZXJfbGV0dGVyOiAgICdjb3Zlci1sZXR0ZXInLFxuICAgIHNjcmVlbmluZzogICAgICAnc2NyZWVuaW5nJyxcbiAgICBpbnRlcnZpZXdfcHJlcDogJ2ludGVydmlldy1wcmVwJyxcbiAgICB0aGFua195b3U6ICAgICAgJ3RoYW5rLXlvdScsXG4gICAgaGFydmVzdDogICAgICAgICdoYXJ2ZXN0JyxcbiAgfTtcbiAgY29uc3QgdGFiTmFtZSA9IHN0ZXBUb1RhYltzdGVwXTtcbiAgaWYgKCF0YWJOYW1lKSByZXR1cm47XG4gIGlmICh0eXBlb2YgdXBkYXRlVGFiQmFyRm9yU3RhZ2UgPT09ICdmdW5jdGlvbicpIHVwZGF0ZVRhYkJhckZvclN0YWdlKHN0ZXApO1xuICBzd2l0Y2hUYWIodGFiTmFtZSk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBTdGVwIGNsaWNrIChiYWNrLW5hdikgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8vIEJhY2stbmF2aWdhdGlvbjogY2xpY2tpbmcgYSBjb21wbGV0ZWQgd29ya2Zsb3cgc3RlcCBuYXZpZ2F0ZXMgdG8gaXRzIHZpZXdlciB0YWIuXG4vLyBDbGlja2luZyB0aGUgam9iIHN0ZXAgYWx3YXlzIG9wZW5zIHRoZSBsb2FkLWpvYiBwYW5lbC5cbmZ1bmN0aW9uIGhhbmRsZVN0ZXBDbGljayhzdGVwKSB7XG4gIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHN0ZXAtJHtzdGVwfWApO1xuICBpZiAoIWVsKSByZXR1cm47XG5cbiAgLy8gSm9iIHN0ZXA6IHNob3cgam9iIGNvbnRlbnQgaWYgYSBqb2IgaXMgbG9hZGVkLCBvdGhlcndpc2Ugb3BlbiB0aGUgbG9hZCBwYW5lbC5cbiAgaWYgKHN0ZXAgPT09ICdqb2InKSB7XG4gICAgaWYgKGVsLmNsYXNzTGlzdC5jb250YWlucygnY29tcGxldGVkJykgfHwgZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdhY3RpdmUnKSkge1xuICAgICAgc3dpdGNoVGFiKCdqb2InKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2hvd0xvYWRKb2JQYW5lbCgpO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBGb3J3YXJkLXNraXA6IHByZXZpb3VzbHkgcmVhY2hlZCBzdGFnZSB0aGF0IGlzIGFoZWFkIG9mIGN1cnJlbnQgcGhhc2UuXG4gIGlmIChlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2ZvcndhcmQtc2tpcCcpKSB7XG4gICAgY29uc3QgbGFiZWwgPSBfU1RFUF9ESVNQTEFZW3N0ZXBdIHx8IHN0ZXA7XG4gICAgaWYgKHR5cGVvZiBjb25maXJtRGlhbG9nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25maXJtRGlhbG9nKFxuICAgICAgICBgSnVtcCBhaGVhZCB0byAke2xhYmVsfT9cXG5cXG5JbnRlcm1lZGlhdGUgc3RhZ2VzIG1heSBuZWVkIHJlLXJ1bm5pbmcgaWYgeW91IG1ha2UgY2hhbmdlcyBoZXJlLmAsXG4gICAgICAgIHsgY29uZmlybUxhYmVsOiAnSnVtcCBhaGVhZCcsIGNhbmNlbExhYmVsOiAnU3RheSBoZXJlJyB9XG4gICAgICApLnRoZW4oY29uZmlybWVkID0+IHsgaWYgKGNvbmZpcm1lZCkgX2RvU3RlcE5hdmlnYXRlKHN0ZXApOyB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgX2RvU3RlcE5hdmlnYXRlKHN0ZXApO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBPbmx5IG5hdmlnYXRlIGlmIHRoZSBzdGVwIGlzIGNvbXBsZXRlZCAoYmFjay1uYXYpIG9yIGFjdGl2ZS5cbiAgaWYgKCFlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2NvbXBsZXRlZCcpICYmICFlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2FjdGl2ZScpKSByZXR1cm47XG5cbiAgY29uc3QgaGFzVW5hbnN3ZXJlZFBvc3RBbmFseXNpc1F1ZXN0aW9ucyA9ICgpID0+IHtcbiAgICBjb25zdCBxcyA9IEFycmF5LmlzQXJyYXkod2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucykgPyB3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zIDogW107XG4gICAgaWYgKHFzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGFuc3dlcnMgPSAod2luZG93LnF1ZXN0aW9uQW5zd2VycyAmJiB0eXBlb2Ygd2luZG93LnF1ZXN0aW9uQW5zd2VycyA9PT0gJ29iamVjdCcpXG4gICAgICA/IHdpbmRvdy5xdWVzdGlvbkFuc3dlcnNcbiAgICAgIDoge307XG4gICAgcmV0dXJuIHFzLnNvbWUocSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGFuc3dlcnNbcS50eXBlXTtcbiAgICAgIHJldHVybiAhdmFsdWUgfHwgIVN0cmluZyh2YWx1ZSkudHJpbSgpO1xuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IHN0ZXBUb1RhYiA9IHtcbiAgICBhbmFseXNpczogICAgICAgaGFzVW5hbnN3ZXJlZFBvc3RBbmFseXNpc1F1ZXN0aW9ucygpID8gJ3F1ZXN0aW9ucycgOiAnYW5hbHlzaXMnLFxuICAgIGN1c3RvbWl6YXRpb25zOiAnZ29hbHMnLFxuICAgIHJld3JpdGU6ICAgICAgICAncmV3cml0ZScsXG4gICAgc3BlbGw6ICAgICAgICAgICdzcGVsbCcsXG4gICAgbGF5b3V0OiAgICAgICAgICdsYXlvdXQnLFxuICAgIGRvd25sb2FkOiAgICAgICAnZmluYWxfZ2VuZXJhdGUnLFxuICAgIGNvdmVyX2xldHRlcjogICAnY292ZXItbGV0dGVyJyxcbiAgICBzY3JlZW5pbmc6ICAgICAgJ3NjcmVlbmluZycsXG4gICAgaW50ZXJ2aWV3X3ByZXA6ICdpbnRlcnZpZXctcHJlcCcsXG4gICAgdGhhbmtfeW91OiAgICAgICd0aGFuay15b3UnLFxuICAgIGhhcnZlc3Q6ICAgICAgICAnaGFydmVzdCcsXG4gIH07XG4gIGNvbnN0IHRhYk5hbWUgPSBzdGVwVG9UYWJbc3RlcF07XG4gIGlmICghdGFiTmFtZSkgcmV0dXJuO1xuXG4gIGNvbnN0IGRvTmF2aWdhdGUgPSAoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB1cGRhdGVUYWJCYXJGb3JTdGFnZSA9PT0gJ2Z1bmN0aW9uJykgdXBkYXRlVGFiQmFyRm9yU3RhZ2Uoc3RlcCk7XG4gICAgc3dpdGNoVGFiKHRhYk5hbWUpO1xuICB9O1xuXG4gIC8vIFNob3cgYSBkb3duc3RyZWFtLWF3YXJlbmVzcyBkaWFsb2cgd2hlbiBiYWNrLW5hdmlnYXRpbmcgdG8gYSBjb21wbGV0ZWQgc3RlcFxuICAvLyB0aGF0IGhhcyBkb3duc3RyZWFtIGNvbXBsZXRlZCBzdGVwcyAobm90IHdoZW4gdGhlIHN0ZXAgaXMgYWN0aXZlKS5cbiAgaWYgKGVsLmNsYXNzTGlzdC5jb250YWlucygnY29tcGxldGVkJykgJiYgIWVsLmNsYXNzTGlzdC5jb250YWlucygnYWN0aXZlJykpIHtcbiAgICBjb25zdCBzdGVwSWR4ID0gX1NURVBfT1JERVIuaW5kZXhPZihzdGVwKTtcbiAgICBjb25zdCBoYXNEb3duc3RyZWFtQ29tcGxldGVkID0gX1NURVBfT1JERVIuc2xpY2Uoc3RlcElkeCArIDEpLnNvbWUocyA9PiB7XG4gICAgICBjb25zdCBkb3duc3RyZWFtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHN0ZXAtJHtzfWApO1xuICAgICAgcmV0dXJuIGRvd25zdHJlYW0gJiYgZG93bnN0cmVhbS5jbGFzc0xpc3QuY29udGFpbnMoJ2NvbXBsZXRlZCcpO1xuICAgIH0pO1xuICAgIGlmIChoYXNEb3duc3RyZWFtQ29tcGxldGVkKSB7XG4gICAgICBfc2hvd1JlUnVuQ29uZmlybU1vZGFsKHN0ZXAsICdiYWNrLW5hdicsIGRvTmF2aWdhdGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGRvTmF2aWdhdGUoKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEV4cG9ydHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmV4cG9ydCB7XG4gIF9TVEVQX09SREVSLFxuICBfU1RFUF9ESVNQTEFZLFxuICBiYWNrVG9QaGFzZSxcbiAgX3Nob3dSZVJ1bkNvbmZpcm1Nb2RhbCxcbiAgX3Nob3dBbmFseXNpc0NsYXJpZmljYXRpb25BbWVuZE1vZGFsLFxuICBjb25maXJtUmVSdW5QaGFzZSxcbiAgcmVSdW5QaGFzZSxcbiAgX2V4ZWN1dGVSZVJ1blBoYXNlLFxuICBfZ2V0U3RlcFRvb2x0aXAsXG4gIF91cGRhdGVWaWV3aW5nSW5kaWNhdG9yLFxuICBfaGlnaGxpZ2h0Q2hhbmdlZEl0ZW1zLFxuICBfbWFya0NoYW5nZWQsXG4gIGFwcGx5TGF5b3V0RnJlc2huZXNzTmF2aWdhdGlvblN0YXRlLFxuICBhcHBseURpcnR5UGhhc2VOYXZpZ2F0aW9uU3RhdGUsXG4gIHNob3dCdWxsZXRSZW9yZGVyLFxuICBfYXBwbHlCdWxsZXRPcmRlcixcbiAgbW92ZUJ1bGxldCxcbiAgX3VwZGF0ZUJ1bGxldEFycm93cyxcbiAgc2F2ZUJ1bGxldE9yZGVyLFxuICByZXNldEJ1bGxldE9yZGVyLFxuICB1cGRhdGVXb3JrZmxvd1N0ZXBzLFxuICBoYW5kbGVTdGVwQ2xpY2ssXG4gIF9BQ1RJT05fTEFCRUxTLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogbGF5b3V0LWluc3RydWN0aW9uLmpzXG4gKiBGcm9udGVuZCBVSSBmb3IgbmF0dXJhbC1sYW5ndWFnZSBsYXlvdXQgaW5zdHJ1Y3Rpb24gd29ya2Zsb3cuXG4gKiBIYW5kbGVzIGluc3RydWN0aW9uIHN1Ym1pc3Npb24sIHByZXZpZXcgdXBkYXRlcywgYW5kIGluc3RydWN0aW9uIGhpc3RvcnkuXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdsYXlvdXQtaW5zdHJ1Y3Rpb24nKTtcblxuaW1wb3J0IHsgYXBpQ2FsbCB9IGZyb20gJy4vYXBpLWNsaWVudC5qcyc7XG5pbXBvcnQgeyBzY2hlZHVsZUF0c1JlZnJlc2ggfSBmcm9tICcuL2F0cy1yZWZpbmVtZW50LmpzJztcbmltcG9ydCB7IGFwcGVuZE1lc3NhZ2UsIGFwcGVuZE1lc3NhZ2VIdG1sIH0gZnJvbSAnLi9tZXNzYWdlLXF1ZXVlLmpzJztcbmltcG9ydCB7IHN3aXRjaFRhYiB9IGZyb20gJy4vcmV2aWV3LXRhYmxlLWJhc2UuanMnO1xuaW1wb3J0IHsgc3RhdGVNYW5hZ2VyLCBHRU5FUkFUSU9OX1NUQVRFX0VWRU5ULCBHRU5FUkFUSU9OX1BIQVNFUyB9IGZyb20gJy4vc3RhdGUtbWFuYWdlci5qcyc7XG5pbXBvcnQgeyBlc2NhcGVIdG1sIH0gZnJvbSAnLi91dGlscy5qcyc7XG5pbXBvcnQgeyBjb25maXJtUmVSdW5QaGFzZSB9IGZyb20gJy4vd29ya2Zsb3ctc3RlcHMuanMnO1xuaW1wb3J0IHsgcmVuZGVySHRtbEludG9JZnJhbWUgfSBmcm9tICcuL3ByZXZpZXctcmVuZGVyLmpzJztcblxubGV0IGRpc21pc3NlZFN0YWxlQ2FsbG91dFJldmlzaW9uID0gbnVsbDtcblxuLyoqXG4gKiBDb252ZXJ0IGEgQ1NTIHBpeGVsIHZhbHVlIHRvIGl0cyB0eXBvZ3JhcGhpYyBwb2ludCBlcXVpdmFsZW50LlxuICogQXNzdW1lcyB0aGUgc3RhbmRhcmQgc2NyZWVuIHJlc29sdXRpb24gY29udmVudGlvbjogOTYgcHgvaW4sIDcyIHB0L2luLFxuICogc28gMXB4ID0gMC43NSBwdC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBweFxuICogQHJldHVybnMge251bWJlcn0gcHQgdmFsdWUgcm91bmRlZCB0byBvbmUgZGVjaW1hbCBwbGFjZVxuICovXG5leHBvcnQgZnVuY3Rpb24gcHhUb1B0KHB4KSB7XG4gIHJldHVybiBNYXRoLnJvdW5kKHB4ICogMC43NSAqIDEwKSAvIDEwO1xufVxuXG5mdW5jdGlvbiBjb2VyY2VCb29sZWFuKHZhbHVlLCBkZWZhdWx0VmFsdWUgPSBmYWxzZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHJldHVybiB2YWx1ZTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCBub3JtYWxpemVkID0gdmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKFsnMScsICd0cnVlJywgJ3llcycsICdvbiddLmluY2x1ZGVzKG5vcm1hbGl6ZWQpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoWycwJywgJ2ZhbHNlJywgJ25vJywgJ29mZiddLmluY2x1ZGVzKG5vcm1hbGl6ZWQpKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gIHJldHVybiBCb29sZWFuKHZhbHVlKTtcbn1cblxuLy8gVW5kbyBzdGFjayBcdTIwMTQgZWFjaCBlbnRyeSBpcyB7IGh0bWwsIGluc3RydWN0aW9ucyB9IHNuYXBzaG90dGVkIGJlZm9yZSBhXG4vLyBsYXlvdXQgaW5zdHJ1Y3Rpb24gaXMgYXBwbGllZC4gIENhcCBhdCAyMCBlbnRyaWVzIHRvIGJvdW5kIG1lbW9yeS5cbmNvbnN0IF9sYXlvdXRVbmRvU3RhY2sgPSBbXTtcbmNvbnN0IF9VTkRPX1NUQUNLX01BWCA9IDIwO1xuXG5mdW5jdGlvbiBnZXRDdkFydGlmYWN0cygpIHtcbiAgcmV0dXJuIHN0YXRlTWFuYWdlci5nZXRUYWJEYXRhKCdjdicpIHx8IHt9O1xufVxuXG5mdW5jdGlvbiB1cGRhdGVDdkFydGlmYWN0cyhuZXh0Q3ZBcnRpZmFjdHMpIHtcbiAgc3RhdGVNYW5hZ2VyLnNldFRhYkRhdGEoJ2N2JywgbmV4dEN2QXJ0aWZhY3RzKTtcbn1cblxuZnVuY3Rpb24gc2V0UHJldmlld0h0bWwoaHRtbCkge1xuICB1cGRhdGVDdkFydGlmYWN0cyh7IC4uLmdldEN2QXJ0aWZhY3RzKCksICcqLmh0bWwnOiBodG1sIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRQcmV2aWV3T3V0cHV0cygpIHtcbiAgcmV0dXJuIHN0YXRlTWFuYWdlcj8uZ2V0R2VuZXJhdGlvblN0YXRlPy4oKT8ucHJldmlld091dHB1dHMgfHwgbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0UHJldmlld091dHB1dFVybChyZW5kZXJlcikge1xuICBjb25zdCBzZXNzaW9uSWQgPSBzdGF0ZU1hbmFnZXI/LmdldFNlc3Npb25JZD8uKCk7XG4gIGNvbnN0IHN1ZmZpeCA9IHNlc3Npb25JZFxuICAgID8gYD9zZXNzaW9uX2lkPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHNlc3Npb25JZCl9YFxuICAgIDogJyc7XG4gIHJldHVybiBgL2FwaS9jdi9wcmV2aWV3LW91dHB1dC8ke2VuY29kZVVSSUNvbXBvbmVudChyZW5kZXJlcil9JHtzdWZmaXh9YDtcbn1cblxuZnVuY3Rpb24gcmVuZGVyUHJldmlld091dHB1dFN0YXR1cyhwcmV2aWV3T3V0cHV0cyA9IG51bGwpIHtcbiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ByZXZpZXctb3V0cHV0LXN0YXR1cycpO1xuICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuO1xuXG4gIGNvbnN0IHBkZnMgPSBwcmV2aWV3T3V0cHV0cz8ucGRmcyB8fCB7fTtcbiAgY29uc3QgcmVuZGVyZXJPcmRlciA9IFsnY2hyb21lJywgJ3dlYXN5cHJpbnQnXTtcbiAgY29uc3QgYXZhaWxhYmxlUmVuZGVyZXJzID0gcmVuZGVyZXJPcmRlci5maWx0ZXIoKHJlbmRlcmVyS2V5KSA9PiByZW5kZXJlcktleSBpbiBwZGZzKTtcblxuICBpZiAoYXZhaWxhYmxlUmVuZGVyZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBgXG4gICAgICA8ZGl2IGNsYXNzPVwicHJldmlldy1vdXRwdXQtZW1wdHlcIj5cbiAgICAgICAgUHJldmlldyBQREZzIHdpbGwgYXBwZWFyIGhlcmUgYWZ0ZXIgdGhlIGN1cnJlbnQgbGF5b3V0IGlzIHJlbmRlcmVkLlxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCByZW5kZXJlckxhYmVscyA9IHtcbiAgICBjaHJvbWU6ICdDaHJvbWUnLFxuICAgIHdlYXN5cHJpbnQ6ICdXZWFzeVByaW50JyxcbiAgfTtcblxuICBjb250YWluZXIuaW5uZXJIVE1MID0gYXZhaWxhYmxlUmVuZGVyZXJzLm1hcCgocmVuZGVyZXJLZXkpID0+IHtcbiAgICBjb25zdCByZW5kZXJlciA9IHBkZnNbcmVuZGVyZXJLZXldIHx8IHt9O1xuICAgIGNvbnN0IG9rID0gQm9vbGVhbihyZW5kZXJlci5vayk7XG4gICAgY29uc3QgZGV0YWlsID0gcmVuZGVyZXIucmVuZGVyZXJfZGV0YWlsIHx8IHJlbmRlcmVyLmVycm9yIHx8ICdObyBkZXRhaWwgYXZhaWxhYmxlJztcbiAgICBjb25zdCByZW5kZXJlckxhYmVsID0gcmVuZGVyZXJMYWJlbHNbcmVuZGVyZXJLZXldIHx8IHJlbmRlcmVyS2V5O1xuICAgIGNvbnN0IGJhZGdlTWFya3VwID0gb2tcbiAgICAgID8gYDxhIGNsYXNzPVwicHJldmlldy1vdXRwdXQtYmFkZ2UgcHJldmlldy1vdXRwdXQtYmFkZ2UtbGluayBpcy1yZWFkeVwiIGhyZWY9XCIke2dldFByZXZpZXdPdXRwdXRVcmwocmVuZGVyZXJLZXkpfVwiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyXCI+JHtyZW5kZXJlckxhYmVsfSBSZWFkeTwvYT5gXG4gICAgICA6IGA8c3BhbiBjbGFzcz1cInByZXZpZXctb3V0cHV0LWJhZGdlIGlzLWZhaWxlZFwiPiR7cmVuZGVyZXJMYWJlbH0gRmFpbGVkPC9zcGFuPmA7XG5cbiAgICByZXR1cm4gYFxuICAgICAgPGRpdiBjbGFzcz1cInByZXZpZXctb3V0cHV0LXJvdyAke29rID8gJ2lzLXJlYWR5JyA6ICdpcy1mYWlsZWQnfVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHJldmlldy1vdXRwdXQtY29weVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcmV2aWV3LW91dHB1dC10aXRsZS1yb3dcIj5cbiAgICAgICAgICAgICR7YmFkZ2VNYXJrdXB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInByZXZpZXctb3V0cHV0LWRldGFpbFwiPiR7ZXNjYXBlSHRtbChkZXRhaWwpfTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIGA7XG4gIH0pLmpvaW4oJycpO1xufVxuXG5mdW5jdGlvbiBhcHBlbmRMYXlvdXRTYWZldHlBbGVydChzYWZldHlBbGVydCkge1xuICBpZiAoIXNhZmV0eUFsZXJ0Py5mbGFnZ2VkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgaXNzdWVzID0gKHNhZmV0eUFsZXJ0Lmlzc3VlcyB8fCBbXSlcbiAgICAubWFwKGlzc3VlID0+IHtcbiAgICAgIGNvbnN0IHRleHQgPSB0eXBlb2YgaXNzdWUgPT09ICdzdHJpbmcnXG4gICAgICAgID8gaXNzdWVcbiAgICAgICAgOiAoaXNzdWU/LmRldGFpbCB8fCBpc3N1ZT8uaXNzdWUgfHwgSlNPTi5zdHJpbmdpZnkoaXNzdWUpKTtcbiAgICAgIHJldHVybiBgPGxpPiR7ZXNjYXBlSHRtbCh0ZXh0KX08L2xpPmA7XG4gICAgfSlcbiAgICAuam9pbignJyk7XG5cbiAgYXBwZW5kTWVzc2FnZUh0bWwoXG4gICAgJ3N5c3RlbScsXG4gICAgYDxzdHJvbmc+XHUyNkEwXHVGRTBGIExheW91dCBzYWZldHkgc2FuaXRpemF0aW9uIGFwcGxpZWQuPC9zdHJvbmc+PGJyPiR7ZXNjYXBlSHRtbChzYWZldHlBbGVydC5tZXNzYWdlIHx8ICdQb3RlbnRpYWwgcHJvbXB0IHBheWxvYWRzIG9yIHVuc2FmZSBIVE1MIHdlcmUgcmVtb3ZlZCBiZWZvcmUgYXBwbHlpbmcgdGhlIGNoYW5nZS4nKX08YnI+PHVsIHN0eWxlPVwibWFyZ2luOjZweCAwIDAgMThweFwiPiR7aXNzdWVzfTwvdWw+YCxcbiAgKTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTGF5b3V0SW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb24gPSB7fSkge1xuICByZXR1cm4ge1xuICAgIHRpbWVzdGFtcDogaW5zdHJ1Y3Rpb24udGltZXN0YW1wIHx8ICcnLFxuICAgIGluc3RydWN0aW9uX3RleHQ6IGluc3RydWN0aW9uLmluc3RydWN0aW9uX3RleHQgfHwgaW5zdHJ1Y3Rpb24uaW5zdHJ1Y3Rpb24gfHwgJycsXG4gICAgY2hhbmdlX3N1bW1hcnk6IGluc3RydWN0aW9uLmNoYW5nZV9zdW1tYXJ5IHx8IGluc3RydWN0aW9uLnN1bW1hcnkgfHwgJycsXG4gICAgY29uZmlybWF0aW9uOiBpbnN0cnVjdGlvbi5jb25maXJtYXRpb24gIT09IGZhbHNlLFxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRDdXJyZW50Q29udGVudFJldmlzaW9uKCkge1xuICByZXR1cm4gc3RhdGVNYW5hZ2VyLmdldEdlbmVyYXRpb25TdGF0ZSgpLmNvbnRlbnRSZXZpc2lvbiA/PyAwO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRHZW5lcmF0aW9uVGltZXN0YW1wKHRpbWVzdGFtcCkge1xuICBpZiAoIXRpbWVzdGFtcCkgcmV0dXJuICcnO1xuICBjb25zdCBwYXJzZWQgPSBuZXcgRGF0ZSh0aW1lc3RhbXApO1xuICBpZiAoTnVtYmVyLmlzTmFOKHBhcnNlZC5nZXRUaW1lKCkpKSByZXR1cm4gJyc7XG4gIHJldHVybiBwYXJzZWQudG9Mb2NhbGVTdHJpbmcoW10sIHsgbW9udGg6ICdzaG9ydCcsIGRheTogJ251bWVyaWMnLCBob3VyOiAnbnVtZXJpYycsIG1pbnV0ZTogJzItZGlnaXQnIH0pO1xufVxuXG5mdW5jdGlvbiBidWlsZExheW91dEZyZXNobmVzc0NoaXBNYXJrdXAoZnJlc2huZXNzKSB7XG4gIGlmICghZnJlc2huZXNzPy5zaG93Q2hpcCkgcmV0dXJuICcnO1xuICBjb25zdCBpY29uID0gZnJlc2huZXNzLmlzQ3JpdGljYWwgPyAnXHUyMUJCJyA6IChmcmVzaG5lc3MuaXNTdGFsZSA/ICchJyA6ICdcdTI3MTMnKTtcbiAgcmV0dXJuIGA8c3BhbiBjbGFzcz1cImxheW91dC1mcmVzaG5lc3MtY2hpcCAke2ZyZXNobmVzcy50b25lfSBsYXlvdXQtcGFuZS1mcmVzaG5lc3MtY2hpcFwiXG4gICAgYXJpYS1sYWJlbD1cIiR7ZXNjYXBlSHRtbChmcmVzaG5lc3MuYXJpYUxhYmVsIHx8ICcnKX1cIj5cbiAgICA8c3BhbiBjbGFzcz1cImxheW91dC1mcmVzaG5lc3MtaWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiR7aWNvbn08L3NwYW4+XG4gICAgPHNwYW4gY2xhc3M9XCJsYXlvdXQtZnJlc2huZXNzLWxhYmVsXCI+JHtlc2NhcGVIdG1sKGZyZXNobmVzcy5sYWJlbCB8fCAnJyl9PC9zcGFuPlxuICA8L3NwYW4+YDtcbn1cblxuZnVuY3Rpb24gcmVuZGVyTGF5b3V0UHJldmlld1N0YXR1cygpIHtcbiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xheW91dC1wcmV2aWV3LXN0YXR1cycpO1xuICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuO1xuICBjb25zdCBmcmVzaG5lc3MgPSBzdGF0ZU1hbmFnZXIuZ2V0TGF5b3V0RnJlc2huZXNzKCk7XG4gIGNvbnN0IGdlbmVyYXRpb25TdGF0ZSA9IHN0YXRlTWFuYWdlci5nZXRHZW5lcmF0aW9uU3RhdGUoKTtcbiAgaWYgKCFnZW5lcmF0aW9uU3RhdGUucHJldmlld0F2YWlsYWJsZSkge1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcbiAgICBjb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgbGFzdFByZXZpZXdSZXZpc2lvbiA9IE51bWJlci5pc0Zpbml0ZShnZW5lcmF0aW9uU3RhdGUubGFzdFByZXZpZXdDb250ZW50UmV2aXNpb24pXG4gICAgPyBnZW5lcmF0aW9uU3RhdGUubGFzdFByZXZpZXdDb250ZW50UmV2aXNpb24gOiBudWxsO1xuICBjb25zdCBjdXJyZW50UmV2aXNpb24gPSBOdW1iZXIuaXNGaW5pdGUoZ2VuZXJhdGlvblN0YXRlLmNvbnRlbnRSZXZpc2lvbilcbiAgICA/IGdlbmVyYXRpb25TdGF0ZS5jb250ZW50UmV2aXNpb24gOiBudWxsO1xuICBjb25zdCBwZW5kaW5nUmV2aXNpb25Db3VudCA9IGxhc3RQcmV2aWV3UmV2aXNpb24gIT09IG51bGwgJiYgY3VycmVudFJldmlzaW9uICE9PSBudWxsXG4gICAgPyBNYXRoLm1heCgwLCBjdXJyZW50UmV2aXNpb24gLSBsYXN0UHJldmlld1JldmlzaW9uKSA6IDA7XG4gIGNvbnN0IHRpbWVzdGFtcExhYmVsID0gZm9ybWF0R2VuZXJhdGlvblRpbWVzdGFtcChnZW5lcmF0aW9uU3RhdGUucHJldmlld0dlbmVyYXRlZEF0KTtcbiAgY29uc3QgZGV0YWlsTGluZXMgPSBbXTtcbiAgaWYgKHRpbWVzdGFtcExhYmVsKSBkZXRhaWxMaW5lcy5wdXNoKGBQcmV2aWV3IGdlbmVyYXRlZCAke3RpbWVzdGFtcExhYmVsfWApO1xuICBpZiAoZ2VuZXJhdGlvblN0YXRlLmxheW91dENvbmZpcm1lZCAmJiBnZW5lcmF0aW9uU3RhdGUuY29uZmlybWVkQXQpIHtcbiAgICBjb25zdCBjb25maXJtZWRMYWJlbCA9IGZvcm1hdEdlbmVyYXRpb25UaW1lc3RhbXAoZ2VuZXJhdGlvblN0YXRlLmNvbmZpcm1lZEF0KTtcbiAgICBpZiAoY29uZmlybWVkTGFiZWwpIGRldGFpbExpbmVzLnB1c2goYExheW91dCBjb25maXJtZWQgJHtjb25maXJtZWRMYWJlbH1gKTtcbiAgfVxuICBpZiAoZnJlc2huZXNzLmlzU3RhbGUpIHtcbiAgICBpZiAocGVuZGluZ1JldmlzaW9uQ291bnQgPiAwKSB7XG4gICAgICBkZXRhaWxMaW5lcy5wdXNoKGAke3BlbmRpbmdSZXZpc2lvbkNvdW50fSBjb250ZW50IGNoYW5nZSR7cGVuZGluZ1JldmlzaW9uQ291bnQgPT09IDEgPyAnJyA6ICdzJ30gc2luY2UgdGhpcyBwcmV2aWV3YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRldGFpbExpbmVzLnB1c2goJ0NvbnRlbnQgY2hhbmdlZCBhZnRlciB0aGlzIHByZXZpZXcgd2FzIGdlbmVyYXRlZCcpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChnZW5lcmF0aW9uU3RhdGUubGF5b3V0Q29uZmlybWVkIHx8IGdlbmVyYXRpb25TdGF0ZS5waGFzZSA9PT0gJ2NvbmZpcm1lZCcpIHtcbiAgICBkZXRhaWxMaW5lcy5wdXNoKCdDb25maXJtZWQgcHJldmlldyBtYXRjaGVzIHRoZSBsYXRlc3QgYXBwcm92ZWQgY29udGVudCcpO1xuICB9IGVsc2Uge1xuICAgIGRldGFpbExpbmVzLnB1c2goJ1ByZXZpZXcgbWF0Y2hlcyB0aGUgbGF0ZXN0IGFwcHJvdmVkIGNvbnRlbnQnKTtcbiAgfVxuICBjb25zdCBzdGFnZUxhYmVsID0gZ2VuZXJhdGlvblN0YXRlLmxheW91dENvbmZpcm1lZCB8fCBnZW5lcmF0aW9uU3RhdGUucGhhc2UgPT09ICdjb25maXJtZWQnXG4gICAgPyAnUmVhZHkgZm9yIGZpbmFsIGZpbGVzJyA6ICdSZWFkeSBmb3IgbGF5b3V0IHJldmlldyc7XG4gIC8vIFBhZ2UgY291bnQgYmFkZ2U6IHNob3duIHdoZW4gYSBwYWdlIGNvdW50IGlzIGF2YWlsYWJsZSBmcm9tIHRoZSBwcmV2aWV3XG4gIGNvbnN0IHBjID0gZ2VuZXJhdGlvblN0YXRlLnBhZ2VDb3VudEV4YWN0ID8/IGdlbmVyYXRpb25TdGF0ZS5wYWdlQ291bnRFc3RpbWF0ZTtcbiAgbGV0IHBhZ2VDb3VudEJhZGdlID0gJyc7XG4gIGlmIChwYyAhPT0gbnVsbCAmJiBwYyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgcGNMYWJlbCAgPSBnZW5lcmF0aW9uU3RhdGUucGFnZUNvdW50RXhhY3QgIT09IG51bGwgPyBgJHtwY30gcGFnZSR7cGMgIT09IDEgPyAncycgOiAnJ31gIDogYH4ke3BjfSBwYWdlJHtwYyAhPT0gMSA/ICdzJyA6ICcnfWA7XG4gICAgY29uc3QgcGNXYXJuICAgPSBnZW5lcmF0aW9uU3RhdGUucGFnZVdhcm5pbmc7XG4gICAgcGFnZUNvdW50QmFkZ2UgPSBgPHNwYW4gY2xhc3M9XCJsYXlvdXQtcGFnZS1jb3VudC1iYWRnZSR7cGNXYXJuID8gJyB3YXJuJyA6ICcnfVwiIHRpdGxlPVwiJHtwY1dhcm4gPyAnUGFnZSBjb3VudCBvdXRzaWRlIHJlY29tbWVuZGVkIHJhbmdlJyA6ICdQYWdlIGNvdW50IHdpdGhpbiByYW5nZSd9XCI+JHtwY1dhcm4gPyAnXHUyNkEwICcgOiAnXHVEODNEXHVEQ0M0ICd9JHtlc2NhcGVIdG1sKHBjTGFiZWwpfTwvc3Bhbj5gO1xuICB9XG4gIGNvbnRhaW5lci5pbm5lckhUTUwgPSBgXG4gICAgPGRpdiBjbGFzcz1cImxheW91dC1wcmV2aWV3LXN0YXR1cy1jYXJkICR7ZnJlc2huZXNzLnRvbmV9XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibGF5b3V0LXByZXZpZXctc3RhdHVzLWhlYWRlclwiPlxuICAgICAgICAke2J1aWxkTGF5b3V0RnJlc2huZXNzQ2hpcE1hcmt1cChmcmVzaG5lc3MpfVxuICAgICAgICA8c3BhbiBjbGFzcz1cImxheW91dC1wcmV2aWV3LXN0YXR1cy1zdGFnZVwiPiR7ZXNjYXBlSHRtbChzdGFnZUxhYmVsKX08L3NwYW4+XG4gICAgICAgICR7cGFnZUNvdW50QmFkZ2V9XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJsYXlvdXQtcHJldmlldy1zdGF0dXMtZGV0YWlsc1wiPlxuICAgICAgICAke2RldGFpbExpbmVzLm1hcCgobGluZSkgPT4gYDxkaXY+JHtlc2NhcGVIdG1sKGxpbmUpfTwvZGl2PmApLmpvaW4oJycpfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+YDtcbiAgY29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xufVxuXG5mdW5jdGlvbiByZW5kZXJMYXlvdXRTdGFsZUNhbGxvdXQoKSB7XG4gIGNvbnN0IGNhbGxvdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGF5b3V0LXN0YWxlLWNhbGxvdXQnKTtcbiAgaWYgKCFjYWxsb3V0KSByZXR1cm47XG5cbiAgY29uc3QgZnJlc2huZXNzID0gc3RhdGVNYW5hZ2VyLmdldExheW91dEZyZXNobmVzcygpO1xuICBjb25zdCBjb250ZW50UmV2aXNpb24gPSBnZXRDdXJyZW50Q29udGVudFJldmlzaW9uKCk7XG4gIGNvbnN0IGlzRGlzbWlzc2VkID0gZGlzbWlzc2VkU3RhbGVDYWxsb3V0UmV2aXNpb24gPT09IGNvbnRlbnRSZXZpc2lvbjtcblxuICBpZiAoIWZyZXNobmVzcy5pc1N0YWxlIHx8IGlzRGlzbWlzc2VkKSB7XG4gICAgaWYgKCFmcmVzaG5lc3MuaXNTdGFsZSkgZGlzbWlzc2VkU3RhbGVDYWxsb3V0UmV2aXNpb24gPSBudWxsO1xuICAgIGNhbGxvdXQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICByZXR1cm47XG4gIH1cblxuICBjYWxsb3V0LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xufVxuXG5mdW5jdGlvbiByZWZyZXNoTGF5b3V0UmV2aWV3U3RhdGUoKSB7XG4gIGNvbnN0IGZyZXNobmVzcyA9IHN0YXRlTWFuYWdlci5nZXRMYXlvdXRGcmVzaG5lc3MoKTtcbiAgY29uc3QgZ2VuZXJhdGlvblN0YXRlID0gc3RhdGVNYW5hZ2VyLmdldEdlbmVyYXRpb25TdGF0ZSgpO1xuICBjb25zdCBjb25maXJtQnRuICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb25maXJtLWxheW91dC1idG4nKTtcbiAgY29uc3QgZmluYWxCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJvY2VlZC10by1maW5hbGlzZS1idG4nKTtcblxuICByZW5kZXJMYXlvdXRQcmV2aWV3U3RhdHVzKCk7XG4gIHJlbmRlckxheW91dFN0YWxlQ2FsbG91dCgpO1xuICByZW5kZXJEaXJ0eVBoYXNlc0NhbGxvdXQoKTtcblxuICBjb25zdCBkaXJ0eVBoYXNlcyA9IHN0YXRlTWFuYWdlci5nZXREaXJ0eVBoYXNlcygpO1xuICBjb25zdCBoYXNEaXJ0eSA9IGRpcnR5UGhhc2VzLmxlbmd0aCA+IDA7XG5cbiAgY29uc3Qgc2hvd0NvbmZpcm0gPSBnZW5lcmF0aW9uU3RhdGUucHJldmlld0F2YWlsYWJsZSAmJiAhZnJlc2huZXNzLmlzU3RhbGUgJiYgIWdlbmVyYXRpb25TdGF0ZS5sYXlvdXRDb25maXJtZWQgJiYgIWhhc0RpcnR5XG4gICAgPyAnYmxvY2snXG4gICAgOiAnbm9uZSc7XG5cbiAgaWYgKGNvbmZpcm1CdG4pICBjb25maXJtQnRuLnN0eWxlLmRpc3BsYXkgID0gc2hvd0NvbmZpcm07XG4gIGNvbnN0IGhpbnRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYXlvdXQtdHdvLXN0ZXAtaGludCcpO1xuICBpZiAoaGludEVsKSBoaW50RWwuc3R5bGUuZGlzcGxheSA9IHNob3dDb25maXJtO1xuXG4gIGlmIChmaW5hbEJ0bikge1xuICAgIGZpbmFsQnRuLnN0eWxlLmRpc3BsYXkgPSBnZW5lcmF0aW9uU3RhdGUucHJldmlld0F2YWlsYWJsZVxuICAgICAgJiYgIWZyZXNobmVzcy5pc1N0YWxlXG4gICAgICAmJiAhaGFzRGlydHlcbiAgICAgICYmIChnZW5lcmF0aW9uU3RhdGUubGF5b3V0Q29uZmlybWVkIHx8IGdlbmVyYXRpb25TdGF0ZS5waGFzZSA9PT0gJ2NvbmZpcm1lZCcpXG4gICAgICA/ICdibG9jaydcbiAgICAgIDogJ25vbmUnO1xuICB9XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBsYXlvdXQgaW5zdHJ1Y3Rpb24gVUkgYW5kIGV2ZW50IGhhbmRsZXJzLlxuICogQ2FsbGVkIHdoZW4gbGF5b3V0IHRhYiBpcyBhY3RpdmF0ZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGluaXRpYXRlTGF5b3V0SW5zdHJ1Y3Rpb25zKCkge1xuICBjb25zdCBpbnN0cnVjdGlvblRhYiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIGlmICghaW5zdHJ1Y3Rpb25UYWIpIHJldHVybjtcblxuICAvLyBDcmVhdGUgdHdvLWNvbHVtbiBsYXlvdXQgaWYgaXQgZG9lc24ndCBleGlzdFxuICBpZiAoIWluc3RydWN0aW9uVGFiLnF1ZXJ5U2VsZWN0b3IoJy5sYXlvdXQtaW5zdHJ1Y3Rpb24tcGFuZWwnKSkge1xuICAgIGluc3RydWN0aW9uVGFiLmlubmVySFRNTCA9IGBcbiAgICAgIDxkaXYgY2xhc3M9XCJsYXlvdXQtaW5zdHJ1Y3Rpb24tcGFuZWxcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxheW91dC1wcmV2aWV3LXBhbmVcIj5cbiAgICAgICAgICA8aDM+Q3VycmVudCBMYXlvdXQgUHJldmlldzwvaDM+XG4gICAgICAgICAgPGRpdiBpZD1cImxheW91dC1wcmV2aWV3LXN0YXR1c1wiIGNsYXNzPVwibGF5b3V0LXByZXZpZXctc3RhdHVzXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInByZXZpZXctaWZyYW1lLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGRpdiBpZD1cInByZXZpZXctbG9hZGluZy1vdmVybGF5XCIgY2xhc3M9XCJwcmV2aWV3LWxvYWRpbmctb3ZlcmxheVwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Bpbm5lclwiPjwvZGl2PlxuICAgICAgICAgICAgICA8cCBjbGFzcz1cInByZXZpZXctbG9hZGluZy1sYWJlbFwiPlJlbmRlcmluZyBwcmV2aWV3XHUyMDI2PC9wPlxuICAgICAgICAgICAgICA8cCBpZD1cInByZXZpZXctbG9hZGluZy1sb2dcIiBjbGFzcz1cInByZXZpZXctbG9hZGluZy1sb2dcIj48L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxpZnJhbWUgaWQ9XCJsYXlvdXQtcHJldmlld1wiIGNsYXNzPVwibGF5b3V0LXByZXZpZXctaWZyYW1lXCIgdGl0bGU9XCJDViBMYXlvdXQgUHJldmlld1wiIHNhbmRib3g9XCJhbGxvdy1zYW1lLW9yaWdpblwiIHJlZmVycmVycG9saWN5PVwibm8tcmVmZXJyZXJcIj48L2lmcmFtZT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxheW91dC1pbnB1dC1wYW5lXCI+XG4gICAgICAgICAgPGgzPkxheW91dCBSZXZpZXc8L2gzPlxuICAgICAgICAgIDxwIGNsYXNzPVwibGF5b3V0LXNjb3BlLWxhYmVsXCI+XHVEODNEXHVEQ0ExIERlc2NyaWJlIGEgbGF5b3V0IGNoYW5nZSAoc3BhY2luZywgbWFyZ2lucywgY29sdW1uIHdpZHRocywgc2VjdGlvbiBvcmRlcikuIFRleHQgY29udGVudCBpcyBmaW5hbGlzZWQgXHUyMDE0IGNvbnRlbnQgZWRpdHMgYXJlIG5vdCBhcHBsaWVkIGhlcmUuPC9wPlxuICAgICAgICAgIDxkaXYgaWQ9XCJsYXlvdXQtcGFnZS1lc3RpbWF0ZVwiIHN0eWxlPVwiZGlzcGxheTpub25lO21hcmdpbi1ib3R0b206MTBweDtcIj48L2Rpdj5cblxuICAgICAgICAgIDxkaXYgaWQ9XCJsYXlvdXQtc3RhbGUtY2FsbG91dFwiIGNsYXNzPVwibGF5b3V0LXN0YWxlLWNhbGxvdXRcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj5cbiAgICAgICAgICAgIDxoND5MYXlvdXQgcHJldmlldyBpcyBvdXQgb2YgZGF0ZTwvaDQ+XG4gICAgICAgICAgICA8cD5Zb3UgY2hhbmdlZCBDViBjb250ZW50IGFmdGVyIHRoZSBjdXJyZW50IHByZXZpZXcgd2FzIGdlbmVyYXRlZC4gUmVnZW5lcmF0ZSB0aGUgcHJldmlldyBiZWZvcmUgdHJ1c3RpbmcgcGFnZSBjb3VudCwgbGF5b3V0IGZlZWRiYWNrLCBvciBmaW5hbCBmaWxlcy48L3A+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGF5b3V0LXN0YWxlLWNhbGxvdXQtYWN0aW9uc1wiPlxuICAgICAgICAgICAgICA8YnV0dG9uIGlkPVwicmVnZW5lcmF0ZS1sYXlvdXQtcHJldmlldy1idG5cIiBjbGFzcz1cImJ0bi13YXJuaW5nIGxheW91dC1hY3Rpb24tYnRuXCI+UmVnZW5lcmF0ZSBwcmV2aWV3PC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b24gaWQ9XCJkaXNtaXNzLWxheW91dC1zdGFsZS1idG5cIiBjbGFzcz1cImJ0bi1zZWNvbmRhcnkgbGF5b3V0LWFjdGlvbi1idG5cIj5LZWVwIHJldmlld2luZyBjdXJyZW50IHByZXZpZXc8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInByZXZpZXctb3V0cHV0LWNhcmRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcmV2aWV3LW91dHB1dC1jYXJkLWhlYWRlclwiPlxuICAgICAgICAgICAgICA8aDQ+UHJldmlldyBQREZzPC9oND5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwcmV2aWV3LW91dHB1dC1jYXJkLW5vdGVcIj5DaHJvbWUgYW5kIFdlYXN5UHJpbnQgcmVuZGVyIGluIHBhcmFsbGVsPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGlkPVwicHJldmlldy1vdXRwdXQtc3RhdHVzXCIgY2xhc3M9XCJwcmV2aWV3LW91dHB1dC1zdGF0dXNcIj48L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYXlvdXQtc2V0dGluZ3Mtcm93XCIgc3R5bGU9XCJkaXNwbGF5OmZsZXg7IGZsZXgtd3JhcDp3cmFwOyBhbGlnbi1pdGVtczpjZW50ZXI7IGdhcDoxMHB4OyBtYXJnaW4tYm90dG9tOjE0cHg7IHBhZGRpbmc6OHB4IDEwcHg7IGJhY2tncm91bmQ6I2Y4ZmFmYzsgYm9yZGVyOjFweCBzb2xpZCAjZTJlOGYwOyBib3JkZXItcmFkaXVzOjZweDtcIj5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJiYXNlLWZvbnQtc2l6ZS1pbnB1dFwiIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTsgZm9udC13ZWlnaHQ6NjAwOyBjb2xvcjojNDc1NTY5OyB3aGl0ZS1zcGFjZTpub3dyYXA7XCI+QmFzZSBmb250IHNpemU6PC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBpZD1cImJhc2UtZm9udC1zaXplLWlucHV0XCJcbiAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgIG1pbj1cIjZcIiBtYXg9XCIxNlwiIHN0ZXA9XCIwLjVcIlxuICAgICAgICAgICAgICB2YWx1ZT1cIjEzXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDo2MHB4OyBwYWRkaW5nOjNweCA2cHg7IGJvcmRlcjoxcHggc29saWQgI2NiZDVlMTsgYm9yZGVyLXJhZGl1czo0cHg7IGZvbnQtc2l6ZTowLjllbTtcIlxuICAgICAgICAgICAgICB0aXRsZT1cIkNvbnRyb2xzIHRoZSByb290IGZvbnQgc2l6ZSBmb3IgdGhlIENWLiBBbGwgcmVtLWJhc2VkIHNpemVzIHNjYWxlIHdpdGggdGhpcyB2YWx1ZS5cIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxzcGFuIGlkPVwiZm9udC1zaXplLXB0LWRpc3BsYXlcIiBzdHlsZT1cImZvbnQtc2l6ZTowLjgyZW07IGNvbG9yOiM2NDc0OGI7IHdoaXRlLXNwYWNlOm5vd3JhcDtcIj5weCZuYnNwOyg5LjgmbmJzcDtwdCk8L3NwYW4+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwicGFnZS1tYXJnaW4taW5wdXRcIiBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07IGZvbnQtd2VpZ2h0OjYwMDsgY29sb3I6IzQ3NTU2OTsgd2hpdGUtc3BhY2U6bm93cmFwOyBtYXJnaW4tbGVmdDo4cHg7XCI+UGFnZSBtYXJnaW4gKGluKTo8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIGlkPVwicGFnZS1tYXJnaW4taW5wdXRcIlxuICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgbWluPVwiMC41XCIgbWF4PVwiMS41XCIgc3RlcD1cIjAuMDVcIlxuICAgICAgICAgICAgICB2YWx1ZT1cIjAuNVwiXG4gICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6NzJweDsgcGFkZGluZzozcHggNnB4OyBib3JkZXI6MXB4IHNvbGlkICNjYmQ1ZTE7IGJvcmRlci1yYWRpdXM6NHB4OyBmb250LXNpemU6MC45ZW07XCJcbiAgICAgICAgICAgICAgdGl0bGU9XCJDb250cm9scyB0aGUgcHJpbnQgcGFnZSBtYXJnaW5zIGZvciBhbGwgUERGIHBhZ2VzLlwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cInB1YmxpY2F0aW9ucy1zdGFydC1uZXctcGFnZS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTppbmxpbmUtZmxleDsgYWxpZ24taXRlbXM6Y2VudGVyOyBnYXA6NnB4OyBmb250LXNpemU6MC44M2VtOyBjb2xvcjojMzM0MTU1OyBtYXJnaW4tbGVmdDo4cHg7XCI+XG4gICAgICAgICAgICAgIDxpbnB1dCBpZD1cInB1YmxpY2F0aW9ucy1zdGFydC1uZXctcGFnZS1pbnB1dFwiIHR5cGU9XCJjaGVja2JveFwiIC8+XG4gICAgICAgICAgICAgIFN0YXJ0IFB1YmxpY2F0aW9ucyBvbiBuZXcgcGFnZVxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJza2lsbHMtc2hvdy1leHBlcmllbmNlLXNlbGVjdFwiIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTsgZm9udC13ZWlnaHQ6NjAwOyBjb2xvcjojNDc1NTY5OyB3aGl0ZS1zcGFjZTpub3dyYXA7IG1hcmdpbi1sZWZ0OjhweDtcIj5Ta2lsbCBleHBlcmllbmNlIGxldmVsOjwvbGFiZWw+XG4gICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgIGlkPVwic2tpbGxzLXNob3ctZXhwZXJpZW5jZS1zZWxlY3RcIlxuICAgICAgICAgICAgICBzdHlsZT1cInBhZGRpbmc6M3B4IDZweDsgYm9yZGVyOjFweCBzb2xpZCAjY2JkNWUxOyBib3JkZXItcmFkaXVzOjRweDsgZm9udC1zaXplOjAuOWVtO1wiXG4gICAgICAgICAgICAgIHRpdGxlPVwiQ29udHJvbHMgd2hldGhlciB5ZWFycyBvZiBleHBlcmllbmNlIGFyZSBzaG93biBuZXh0IHRvIGVhY2ggc2tpbGwuXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImluZGl2aWR1YWxcIj5JbmRpdmlkdWFsIHNldHRpbmc8L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImFsd2F5c1wiPkFsd2F5czwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwibmV2ZXJcIj5OZXZlcjwvb3B0aW9uPlxuICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwiYXBwbHktbGF5b3V0LXNldHRpbmdzLWJ0blwiIGNsYXNzPVwiYnRuLXNlY29uZGFyeVwiIHN0eWxlPVwicGFkZGluZzozcHggMTBweDsgZm9udC1zaXplOjAuODVlbTtcIj5BcHBseTwvYnV0dG9uPlxuICAgICAgICAgICAgPHNwYW4gaWQ9XCJsYXlvdXQtc2V0dGluZ3Mtc3RhdHVzXCIgc3R5bGU9XCJmb250LXNpemU6MC44ZW07IGNvbG9yOiM2NDc0OGI7XCI+PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPHRleHRhcmVhXG4gICAgICAgICAgICBpZD1cImluc3RydWN0aW9uLWlucHV0XCJcbiAgICAgICAgICAgIGNsYXNzPVwibGF5b3V0LWluc3RydWN0aW9uLXRleHRhcmVhXCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiwgTW92ZSBQdWJsaWNhdGlvbnMgc2VjdGlvbiBhZnRlciBTa2lsbHMmIzEwO29yOiBTaG9ydGVuIHRoZSBzZWNvbmQgYnVsbGV0IHVuZGVyIEdlbmVudGVjaCB0byBmb2N1cyBvbiBpbXBhY3QmIzEwO29yOiBLZWVwIHRoZSBHZW5lbnRlY2ggZW50cnkgb24gb25lIHBhZ2VcIlxuICAgICAgICAgICAgcm93cz1cIjZcIj48L3RleHRhcmVhPlxuXG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImFwcGx5LWluc3RydWN0aW9uLWJ0blwiIGNsYXNzPVwiYnRuLXByaW1hcnkgbGF5b3V0LWFjdGlvbi1idG5cIj5cbiAgICAgICAgICAgIEFwcGx5XG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiY29uZmlybS1sYXlvdXQtYnRuXCIgY2xhc3M9XCJjb250aW51ZS1idG4gbGF5b3V0LWFjdGlvbi1idG5cIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj5cbiAgICAgICAgICAgIENvbmZpcm0gTGF5b3V0XG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8cCBpZD1cImxheW91dC10d28tc3RlcC1oaW50XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7Zm9udC1zaXplOjAuODJlbTtjb2xvcjojNmI3MjgwO21hcmdpbjo2cHggMCAycHg7XCI+XG4gICAgICAgICAgICBPbmNlIHRoZSBwcmV2aWV3IGxvb2tzIHJpZ2h0LCBjb25maXJtIHRoZSBsYXlvdXQgXHUyMDE0IHRoZW4gZ2VuZXJhdGUgeW91ciBmaW5hbCBzdWJtaXNzaW9uIGZpbGVzLlxuICAgICAgICAgIDwvcD5cblxuICAgICAgICAgIDxkaXYgaWQ9XCJwcm9jZXNzaW5nLWluZGljYXRvclwiIGNsYXNzPVwicHJvY2Vzc2luZy1pbmRpY2F0b3JcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Bpbm5lclwiPjwvZGl2PlxuICAgICAgICAgICAgPHA+QXBwbHlpbmcgaW5zdHJ1Y3Rpb24uLi48L3A+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGlkPVwiY29uZmlybWF0aW9uLW1lc3NhZ2VcIiBjbGFzcz1cImNvbmZpcm1hdGlvbi1tZXNzYWdlXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPjwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImxheW91dC1oaXN0b3J5LXNlY3Rpb25cIj5cbiAgICAgICAgICAgIDxoND5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoaXN0b3J5LXRvZ2dsZVwiPlx1MjVCQzwvc3Bhbj5cbiAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gSGlzdG9yeSAoPHNwYW4gaWQ9XCJpbnN0cnVjdGlvbi1jb3VudFwiPjA8L3NwYW4+KVxuICAgICAgICAgICAgPC9oND5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJpbnN0cnVjdGlvbi1oaXN0b3J5XCIgY2xhc3M9XCJpbnN0cnVjdGlvbi1oaXN0b3J5LWxpc3RcIj48L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxidXR0b24gaWQ9XCJwcm9jZWVkLXRvLWZpbmFsaXNlLWJ0blwiIGNsYXNzPVwiY29udGludWUtYnRuIGxheW91dC1hY3Rpb24tYnRuXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxuICAgICAgICAgICAgR2VuZXJhdGUgRmluYWwgRmlsZXNcbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDxkaXYgaWQ9XCJjb250ZW50LXByb3Bvc2FsLXByb2Nlc3NpbmdcIiBjbGFzcz1cInByb2Nlc3NpbmctaW5kaWNhdG9yXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Bpbm5lclwiPjwvZGl2PlxuICAgICAgICAgICAgPHA+R2VuZXJhdGluZyBjb250ZW50IHByb3Bvc2Fsc1x1MjAyNjwvcD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGlkPVwiY29udGVudC1wcm9wb3NhbHMtcGFuZWxcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj48L2Rpdj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiYXBwbHktY29udGVudC1jaGFuZ2VzLWJ0blwiIGNsYXNzPVwiYnRuLXdhcm5pbmcgbGF5b3V0LWFjdGlvbi1idG5cIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj5cbiAgICAgICAgICAgIEFwcGx5IEFwcHJvdmVkIENoYW5nZXNcbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDxkaXYgaWQ9XCJkaXJ0eS1waGFzZXMtY2FsbG91dFwiIGNsYXNzPVwiZGlydHktcGhhc2VzLWNhbGxvdXRcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj5cbiAgICAgICAgICAgIDxoND5cdTI2QTAgQ29udGVudCBDaGFuZ2VkIFx1MjAxNCBSZS1ydW4gUmVxdWlyZWQ8L2g0PlxuICAgICAgICAgICAgPHA+VGV4dCBlZGl0cyBoYXZlIGJlZW4gc3RhZ2VkLiBUaGUgY3VycmVudCBwcmV2aWV3IG5vIGxvbmdlciByZWZsZWN0cyB0aGUgdXBkYXRlZCBjb250ZW50LjwvcD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYXlvdXQtc3RhbGUtY2FsbG91dC1hY3Rpb25zXCI+XG4gICAgICAgICAgICAgIDxidXR0b24gaWQ9XCJyZXR1cm4tdG8tZWFybGllc3QtZGlydHktYnRuXCIgY2xhc3M9XCJidG4td2FybmluZyBsYXlvdXQtYWN0aW9uLWJ0blwiPlx1MjFCQiBSZXR1cm4gdG8gR2VuZXJhdGUgQ1Y8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIGA7XG5cbiAgICAvLyBXaXJlIHVwIGV2ZW50IGxpc3RlbmVyc1xuICAgIHNldHVwTGF5b3V0SW5zdHJ1Y3Rpb25MaXN0ZW5lcnMoKTtcbiAgfVxuXG4gIC8vIFJlc3RvcmUgc2F2ZWQgZm9udCBzaXplIGZyb20gc2Vzc2lvbiBzdGF0ZSBpZiBhdmFpbGFibGVcbiAgY29uc3Qgc2F2ZWRGb250U2l6ZSA9IHN0YXRlTWFuYWdlcj8uZ2V0U2Vzc2lvblN0YXRlPy4oKT8uYmFzZV9mb250X3NpemU7XG4gIGlmIChzYXZlZEZvbnRTaXplKSB7XG4gICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFzZS1mb250LXNpemUtaW5wdXQnKTtcbiAgICBpZiAoaW5wdXQpIHtcbiAgICAgIGNvbnN0IHB4ID0gcGFyc2VGbG9hdChzYXZlZEZvbnRTaXplKSB8fCAxMztcbiAgICAgIGlucHV0LnZhbHVlID0gcHg7XG4gICAgICBjb25zdCBwdERpc3BsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZm9udC1zaXplLXB0LWRpc3BsYXknKTtcbiAgICAgIGlmIChwdERpc3BsYXkpIHB0RGlzcGxheS50ZXh0Q29udGVudCA9IGBweFxcdTAwYTAoJHtweFRvUHQocHgpfVxcdTAwYTBwdClgO1xuICAgIH1cbiAgfVxuICBjb25zdCBzYXZlZFBhZ2VNYXJnaW4gPSBzdGF0ZU1hbmFnZXI/LmdldFNlc3Npb25TdGF0ZT8uKCk/LnBhZ2VfbWFyZ2luO1xuICBpZiAoc2F2ZWRQYWdlTWFyZ2luKSB7XG4gICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGFnZS1tYXJnaW4taW5wdXQnKTtcbiAgICBpZiAoaW5wdXQpIGlucHV0LnZhbHVlID0gcGFyc2VGbG9hdChzYXZlZFBhZ2VNYXJnaW4pIHx8IDAuNTtcbiAgfVxuICBjb25zdCBwdWJsaWNhdGlvbnNTdGFydElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1YmxpY2F0aW9ucy1zdGFydC1uZXctcGFnZS1pbnB1dCcpO1xuICBpZiAocHVibGljYXRpb25zU3RhcnRJbnB1dCkge1xuICAgIGNvbnN0IHNlc3Npb25TdGF0ZSA9IHN0YXRlTWFuYWdlcj8uZ2V0U2Vzc2lvblN0YXRlPy4oKSB8fCB7fTtcbiAgICBjb25zdCBjdXN0b21pemF0aW9uU3RhdGUgPSBzdGF0ZU1hbmFnZXI/LmdldFRhYkRhdGE/LignY3VzdG9taXphdGlvbnMnKSB8fCB7fTtcbiAgICBjb25zdCBzYXZlZFB1YmxpY2F0aW9uc1N0YXJ0ID1cbiAgICAgIHNlc3Npb25TdGF0ZS5wdWJsaWNhdGlvbnNfc3RhcnRfbmV3X3BhZ2VcbiAgICAgID8/IHNlc3Npb25TdGF0ZT8uY3VzdG9taXphdGlvbnM/LnB1YmxpY2F0aW9uc19zdGFydF9uZXdfcGFnZVxuICAgICAgPz8gY3VzdG9taXphdGlvblN0YXRlLnB1YmxpY2F0aW9uc19zdGFydF9uZXdfcGFnZVxuICAgICAgPz8gY3VzdG9taXphdGlvblN0YXRlLnB1YmxpY2F0aW9uc19wYWdlX2JyZWFrXG4gICAgICA/PyBjdXN0b21pemF0aW9uU3RhdGUuc3RhcnRfcHVibGljYXRpb25zX29uX25ld19wYWdlXG4gICAgICA/PyBmYWxzZTtcbiAgICBwdWJsaWNhdGlvbnNTdGFydElucHV0LmNoZWNrZWQgPSBjb2VyY2VCb29sZWFuKHNhdmVkUHVibGljYXRpb25zU3RhcnQsIGZhbHNlKTtcbiAgfVxuICBjb25zdCBza2lsbHNTaG93RXhwZXJpZW5jZVNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbHMtc2hvdy1leHBlcmllbmNlLXNlbGVjdCcpO1xuICBpZiAoc2tpbGxzU2hvd0V4cGVyaWVuY2VTZWxlY3QpIHtcbiAgICBjb25zdCBzZXNzaW9uU3RhdGUgPSBzdGF0ZU1hbmFnZXI/LmdldFNlc3Npb25TdGF0ZT8uKCkgfHwge307XG4gICAgY29uc3QgY3VzdG9taXphdGlvblN0YXRlID0gc3RhdGVNYW5hZ2VyPy5nZXRUYWJEYXRhPy4oJ2N1c3RvbWl6YXRpb25zJykgfHwge307XG4gICAgY29uc3Qgc2F2ZWRTa2lsbHNFeHAgPVxuICAgICAgc2Vzc2lvblN0YXRlLnNraWxsc19zaG93X2V4cGVyaWVuY2VcbiAgICAgID8/IHNlc3Npb25TdGF0ZT8uY3VzdG9taXphdGlvbnM/LnNraWxsc19zaG93X2V4cGVyaWVuY2VcbiAgICAgID8/IGN1c3RvbWl6YXRpb25TdGF0ZS5za2lsbHNfc2hvd19leHBlcmllbmNlXG4gICAgICA/PyAnaW5kaXZpZHVhbCc7XG4gICAgY29uc3QgdmFsaWQgPSBbJ2Fsd2F5cycsICduZXZlcicsICdpbmRpdmlkdWFsJ107XG4gICAgc2tpbGxzU2hvd0V4cGVyaWVuY2VTZWxlY3QudmFsdWUgPSB2YWxpZC5pbmNsdWRlcyhzYXZlZFNraWxsc0V4cCkgPyBzYXZlZFNraWxsc0V4cCA6ICdpbmRpdmlkdWFsJztcbiAgfVxuXG4gIHJlbmRlclByZXZpZXdPdXRwdXRTdGF0dXMoZ2V0UHJldmlld091dHB1dHMoKSk7XG5cbiAgLy8gTG9hZCBhbmQgZGlzcGxheSBjdXJyZW50IEhUTUwgcHJldmlldyB2aWEgdGhlIHN0YWdlZCBnZW5lcmF0aW9uIGNvbnRyYWN0LlxuICAvLyAvYXBpL2N2L2dlbmVyYXRlLXByZXZpZXcgZ2VuZXJhdGVzIGZyZXNoIEhUTUwgYW5kIHN0b3JlcyBpdCBpbiBzZXNzaW9uIHN0YXRlLlxuICAvLyBGYWxsIGJhY2sgdG8gdGhlIGxlZ2FjeSAvYXBpL2xheW91dC1odG1sIGVuZHBvaW50IGlmIHRoZSBzZXNzaW9uIGhhcyBub1xuICAvLyBjdXN0b21pemF0aW9uIGRhdGEgeWV0IChlLmcuIHNlc3Npb24gcmVzdG9yZWQgYWZ0ZXIgZnVsbCBnZW5lcmF0aW9uKS5cbiAgY29uc3QgY2FjaGVkSHRtbCA9IGdldEN2QXJ0aWZhY3RzKClbJyouaHRtbCddIHx8ICcnO1xuICBpZiAoY2FjaGVkSHRtbCkge1xuICAgIGRpc3BsYXlMYXlvdXRQcmV2aWV3KGNhY2hlZEh0bWwpO1xuICB9IGVsc2Uge1xuICAgIF9mZXRjaEFuZERpc3BsYXlMYXlvdXRQcmV2aWV3KCk7XG4gIH1cblxuICAvLyBSZXN0b3JlIGFueSBwcmlvciBpbnN0cnVjdGlvbnMgZnJvbSBzZXNzaW9uXG4gIGF3YWl0IHJlc3RvcmVJbnN0cnVjdGlvbkhpc3RvcnkoKTtcbiAgcmVmcmVzaExheW91dFJldmlld1N0YXRlKCk7XG5cbiAgLy8gU2hvdyBhIHByb2FjdGl2ZSBwYWdlLWxlbmd0aCBlc3RpbWF0ZSBzbyB1c2VycyBjYW4gYWRqdXN0IGNvbnRlbnQgYmVmb3JlIGdlbmVyYXRpbmdcbiAgX2ZldGNoUGFnZUVzdGltYXRlKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9mZXRjaFBhZ2VFc3RpbWF0ZSgpIHtcbiAgY29uc3QgYmFubmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xheW91dC1wYWdlLWVzdGltYXRlJyk7XG4gIGlmICghYmFubmVyKSByZXR1cm47XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvZXN0aW1hdGUtcGFnZXMnKTtcbiAgICBpZiAoIXJlcy5vaykgcmV0dXJuO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmICghZGF0YS5vayB8fCAhZGF0YS5lc3RpbWF0ZWRfcGFnZXMpIHJldHVybjtcbiAgICBjb25zdCBwYWdlcyA9IGRhdGEuZXN0aW1hdGVkX3BhZ2VzO1xuICAgIGNvbnN0IGlzT3ZlciA9IHBhZ2VzID4gMztcbiAgICBjb25zdCBjb2xvciA9IGlzT3ZlciA/ICcjOTI0MDBlJyA6ICcjMTY2NTM0JztcbiAgICBjb25zdCBiZyAgICA9IGlzT3ZlciA/ICcjZmVmM2M3JyA6ICcjZjBmZGY0JztcbiAgICBjb25zdCBib3JkZXIgPSBpc092ZXIgPyAnI2ZjZDM0ZCcgOiAnI2JiZjdkMCc7XG4gICAgY29uc3QgbXNnICAgPSBpc092ZXJcbiAgICAgID8gYFx1MjZBMCBFc3RpbWF0ZWQgfiR7cGFnZXN9IHBhZ2VzIFx1MjAxNCBzZW5pb3IgY2FuZGlkYXRlIHRhcmdldCBpcyAyXHUyMDEzMyBwYWdlcy4gQ29uc2lkZXIgcmVkdWNpbmcgc2VsZWN0ZWQgYnVsbGV0IHBvaW50cyBiZWZvcmUgZ2VuZXJhdGluZy5gXG4gICAgICA6IGBcdTI3MTMgRXN0aW1hdGVkIH4ke3BhZ2VzfSBwYWdlcyBcdTIwMTQgd2l0aGluIHRoZSAyXHUyMDEzMyBwYWdlIHRhcmdldCBmb3Igc2VuaW9yIGNhbmRpZGF0ZXMuYDtcbiAgICBiYW5uZXIuc3R5bGUuY3NzVGV4dCA9IGBkaXNwbGF5OmJsb2NrO3BhZGRpbmc6OHB4IDEycHg7Ym9yZGVyLXJhZGl1czo2cHg7Ym9yZGVyOjFweCBzb2xpZCAke2JvcmRlcn07YmFja2dyb3VuZDoke2JnfTtjb2xvcjoke2NvbG9yfTtmb250LXNpemU6MC44N2VtO2A7XG4gICAgYmFubmVyLnRleHRDb250ZW50ID0gbXNnO1xuICB9IGNhdGNoIChfKSB7IC8qIHNpbGVudCBcdTIwMTQgbm9uLWNyaXRpY2FsICovIH1cbn1cblxuLyoqXG4gKiBTZXQgdXAgZXZlbnQgbGlzdGVuZXJzIGZvciBsYXlvdXQgaW5zdHJ1Y3Rpb24gVUkuXG4gKi9cbmZ1bmN0aW9uIHNldHVwTGF5b3V0SW5zdHJ1Y3Rpb25MaXN0ZW5lcnMoKSB7XG4gIGNvbnN0IGFwcGx5QnRuICAgICAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FwcGx5LWluc3RydWN0aW9uLWJ0bicpO1xuICBjb25zdCBjb25maXJtQnRuICAgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb25maXJtLWxheW91dC1idG4nKTtcbiAgY29uc3QgcHJvY2VlZEJ0biAgICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJvY2VlZC10by1maW5hbGlzZS1idG4nKTtcbiAgY29uc3QgcmVnZW5lcmF0ZUJ0biAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVnZW5lcmF0ZS1sYXlvdXQtcHJldmlldy1idG4nKTtcbiAgY29uc3QgZGlzbWlzc0NhbGxvdXRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGlzbWlzcy1sYXlvdXQtc3RhbGUtYnRuJyk7XG4gIGNvbnN0IGluc3RydWN0aW9uSW5wdXQgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2luc3RydWN0aW9uLWlucHV0Jyk7XG4gIGNvbnN0IGhpc3RvcnlUb2dnbGUgICAgID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmhpc3RvcnktdG9nZ2xlJyk7XG4gIGNvbnN0IGFwcGx5U2V0dGluZ3NCdG4gID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FwcGx5LWxheW91dC1zZXR0aW5ncy1idG4nKTtcbiAgY29uc3QgZm9udFNpemVJbnB1dCAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFzZS1mb250LXNpemUtaW5wdXQnKTtcbiAgY29uc3QgcGFnZU1hcmdpbklucHV0ICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGFnZS1tYXJnaW4taW5wdXQnKTtcbiAgY29uc3QgcHVibGljYXRpb25zU3RhcnRJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWJsaWNhdGlvbnMtc3RhcnQtbmV3LXBhZ2UtaW5wdXQnKTtcbiAgY29uc3Qgc2tpbGxzU2hvd0V4cGVyaWVuY2VTZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGxzLXNob3ctZXhwZXJpZW5jZS1zZWxlY3QnKTtcblxuICBpZiAoYXBwbHlTZXR0aW5nc0J0biAmJiBmb250U2l6ZUlucHV0ICYmIHBhZ2VNYXJnaW5JbnB1dCAmJiBwdWJsaWNhdGlvbnNTdGFydElucHV0KSB7XG4gICAgYXBwbHlTZXR0aW5nc0J0bi5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgJ2NsaWNrJyxcbiAgICAgICgpID0+IGFwcGx5TGF5b3V0U2V0dGluZ3MoXG4gICAgICAgIGZvbnRTaXplSW5wdXQudmFsdWUsXG4gICAgICAgIHBhZ2VNYXJnaW5JbnB1dC52YWx1ZSxcbiAgICAgICAgcHVibGljYXRpb25zU3RhcnRJbnB1dC5jaGVja2VkLFxuICAgICAgICBza2lsbHNTaG93RXhwZXJpZW5jZVNlbGVjdD8udmFsdWUgfHwgJ2luZGl2aWR1YWwnLFxuICAgICAgKSxcbiAgICApO1xuICAgIGZvbnRTaXplSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwdERpc3BsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZm9udC1zaXplLXB0LWRpc3BsYXknKTtcbiAgICAgIGlmIChwdERpc3BsYXkpIHtcbiAgICAgICAgY29uc3QgcHggPSBwYXJzZUZsb2F0KGZvbnRTaXplSW5wdXQudmFsdWUpO1xuICAgICAgICBwdERpc3BsYXkudGV4dENvbnRlbnQgPSBpc05hTihweCkgPyAncHgnIDogYHB4XFx1MDBhMCgke3B4VG9QdChweCl9XFx1MDBhMHB0KWA7XG4gICAgICB9XG4gICAgfSk7XG4gICAgZm9udFNpemVJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdrZXlwcmVzcycsIChlKSA9PiB7XG4gICAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicpIHtcbiAgICAgICAgYXBwbHlMYXlvdXRTZXR0aW5ncyhcbiAgICAgICAgICBmb250U2l6ZUlucHV0LnZhbHVlLFxuICAgICAgICAgIHBhZ2VNYXJnaW5JbnB1dC52YWx1ZSxcbiAgICAgICAgICBwdWJsaWNhdGlvbnNTdGFydElucHV0LmNoZWNrZWQsXG4gICAgICAgICAgc2tpbGxzU2hvd0V4cGVyaWVuY2VTZWxlY3Q/LnZhbHVlIHx8ICdpbmRpdmlkdWFsJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBwYWdlTWFyZ2luSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5cHJlc3MnLCAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSAnRW50ZXInKSB7XG4gICAgICAgIGFwcGx5TGF5b3V0U2V0dGluZ3MoXG4gICAgICAgICAgZm9udFNpemVJbnB1dC52YWx1ZSxcbiAgICAgICAgICBwYWdlTWFyZ2luSW5wdXQudmFsdWUsXG4gICAgICAgICAgcHVibGljYXRpb25zU3RhcnRJbnB1dC5jaGVja2VkLFxuICAgICAgICAgIHNraWxsc1Nob3dFeHBlcmllbmNlU2VsZWN0Py52YWx1ZSB8fCAnaW5kaXZpZHVhbCcsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBpZiAoYXBwbHlCdG4pIHtcbiAgICBhcHBseUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IGluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb25JbnB1dC52YWx1ZS50cmltKCk7XG4gICAgICBpZiAoIWluc3RydWN0aW9uKSB7XG4gICAgICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsICdcdTI2QTBcdUZFMEYgUGxlYXNlIGVudGVyIGFuIGluc3RydWN0aW9uIGJlZm9yZSBzdWJtaXR0aW5nLicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzdWJtaXRTbWFydEluc3RydWN0aW9uKGluc3RydWN0aW9uKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChjb25maXJtQnRuKSB7XG4gICAgY29uZmlybUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNvbmZpcm1MYXlvdXRSZXZpZXcpO1xuICB9XG5cbiAgaWYgKHByb2NlZWRCdG4pIHtcbiAgICBwcm9jZWVkQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZ2VuZXJhdGVGaW5hbE91dHB1dHMpO1xuICB9XG5cbiAgaWYgKHJlZ2VuZXJhdGVCdG4pIHtcbiAgICByZWdlbmVyYXRlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlUmVnZW5lcmF0ZVByZXZpZXdBY3Rpb24pO1xuICB9XG5cbiAgaWYgKGRpc21pc3NDYWxsb3V0QnRuKSB7XG4gICAgZGlzbWlzc0NhbGxvdXRCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBkaXNtaXNzZWRTdGFsZUNhbGxvdXRSZXZpc2lvbiA9IGdldEN1cnJlbnRDb250ZW50UmV2aXNpb24oKTtcbiAgICAgIHJlbmRlckxheW91dFN0YWxlQ2FsbG91dCgpO1xuICAgIH0pO1xuICB9XG5cbiAgaWYgKGhpc3RvcnlUb2dnbGUpIHtcbiAgICBoaXN0b3J5VG9nZ2xlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgIGUudGFyZ2V0LnRleHRDb250ZW50ID0gZS50YXJnZXQudGV4dENvbnRlbnQgPT09ICdcdTI1QkMnID8gJ1x1MjVCNicgOiAnXHUyNUJDJztcbiAgICAgIGNvbnN0IGhpc3RvcnlMaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2luc3RydWN0aW9uLWhpc3RvcnknKTtcbiAgICAgIGlmIChoaXN0b3J5TGlzdCkge1xuICAgICAgICBoaXN0b3J5TGlzdC5jbGFzc0xpc3QudG9nZ2xlKCdjb2xsYXBzZWQnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIEFsbG93IEVudGVyIGtleSB0byBzdWJtaXQgaW4gdGV4dGFyZWEgKFNoaWZ0K0VudGVyIGZvciBuZXcgbGluZSlcbiAgaWYgKGluc3RydWN0aW9uSW5wdXQpIHtcbiAgICBpbnN0cnVjdGlvbklucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXByZXNzJywgKGUpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJyAmJiAhZS5zaGlmdEtleSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGFwcGx5QnRuPy5jbGljaygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gQ29udGVudCBwcm9wb3NhbCBhbmQgZGlydHktcGhhc2UgYnV0dG9uc1xuICBjb25zdCBhcHBseUNvbnRlbnRDaGFuZ2VzQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FwcGx5LWNvbnRlbnQtY2hhbmdlcy1idG4nKTtcbiAgY29uc3QgcmV0dXJuVG9EaXJ0eUJ0biAgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXR1cm4tdG8tZWFybGllc3QtZGlydHktYnRuJyk7XG5cbiAgaWYgKGFwcGx5Q29udGVudENoYW5nZXNCdG4pIHtcbiAgICBhcHBseUNvbnRlbnRDaGFuZ2VzQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXBwbHlBY2NlcHRlZFByb3Bvc2Fscyk7XG4gIH1cblxuICBpZiAocmV0dXJuVG9EaXJ0eUJ0bikge1xuICAgIHJldHVyblRvRGlydHlCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBzdGVwID0gc3RhdGVNYW5hZ2VyLmdldEVhcmxpZXN0RGlydHlTdGVwKCkgfHwgJ2dlbmVyYXRlJztcbiAgICAgIGNvbmZpcm1SZVJ1blBoYXNlKHN0ZXApO1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogU2F2ZSBsYXlvdXQgZGlzcGxheSBzZXR0aW5ncyB0byBzZXNzaW9uIHN0YXRlLCB0aGVuIHJlLXJlbmRlciB0aGUgcHJldmlldy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYXBwbHlMYXlvdXRTZXR0aW5ncyhmb250U2l6ZVZhbHVlLCBwYWdlTWFyZ2luVmFsdWUsIHB1YmxpY2F0aW9uc1N0YXJ0TmV3UGFnZSA9IGZhbHNlLCBza2lsbHNTaG93RXhwZXJpZW5jZSA9ICdpbmRpdmlkdWFsJykge1xuICBjb25zdCBzdGF0dXNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYXlvdXQtc2V0dGluZ3Mtc3RhdHVzJyk7XG4gIGNvbnN0IHBhcnNlZEZvbnRTaXplID0gcGFyc2VGbG9hdChmb250U2l6ZVZhbHVlKTtcbiAgY29uc3QgcGFyc2VkUGFnZU1hcmdpbiA9IHBhcnNlRmxvYXQocGFnZU1hcmdpblZhbHVlKTtcbiAgaWYgKGlzTmFOKHBhcnNlZEZvbnRTaXplKSB8fCBwYXJzZWRGb250U2l6ZSA8IDYgfHwgcGFyc2VkRm9udFNpemUgPiAxNikge1xuICAgIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnXHUyNkEwXHVGRTBGIEZvbnQgbXVzdCBiZSA2XHUyMDEzMTYnO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoaXNOYU4ocGFyc2VkUGFnZU1hcmdpbikgfHwgcGFyc2VkUGFnZU1hcmdpbiA8IDAuNSB8fCBwYXJzZWRQYWdlTWFyZ2luID4gMS41KSB7XG4gICAgaWYgKHN0YXR1c0VsKSBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICdcdTI2QTBcdUZFMEYgTWFyZ2luIG11c3QgYmUgMC41XHUyMDEzMS41JztcbiAgICByZXR1cm47XG4gIH1cbiAgdHJ5IHtcbiAgICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJ1NhdmluZ1x1MjAyNic7XG4gICAgY29uc3Qgc2F2ZVJlcyA9IGF3YWl0IGFwaUNhbGwoJ1BPU1QnLCAnL2FwaS9sYXlvdXQtc2V0dGluZ3MnLCB7XG4gICAgICBiYXNlX2ZvbnRfc2l6ZTogYCR7cGFyc2VkRm9udFNpemV9cHhgLFxuICAgICAgcGFnZV9tYXJnaW46IGAke3BhcnNlZFBhZ2VNYXJnaW59aW5gLFxuICAgICAgcHVibGljYXRpb25zX3N0YXJ0X25ld19wYWdlOiBCb29sZWFuKHB1YmxpY2F0aW9uc1N0YXJ0TmV3UGFnZSksXG4gICAgICBza2lsbHNfc2hvd19leHBlcmllbmNlOiBza2lsbHNTaG93RXhwZXJpZW5jZSxcbiAgICB9KTtcbiAgICBpZiAoIXNhdmVSZXMub2spIHRocm93IG5ldyBFcnJvcihzYXZlUmVzLmVycm9yIHx8ICdzYXZlIGZhaWxlZCcpO1xuXG4gICAgaWYgKHN0YXR1c0VsKSBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICdSZS1yZW5kZXJpbmdcdTIwMjYnO1xuICAgIGNvbnN0IHByZXZpZXdSZXMgPSBhd2FpdCBhcGlDYWxsKCdQT1NUJywgJy9hcGkvY3YvZ2VuZXJhdGUtcHJldmlldycsIHsgY29udGVudF9yZXZpc2lvbjogZ2V0Q3VycmVudENvbnRlbnRSZXZpc2lvbigpIH0pO1xuICAgIGlmIChwcmV2aWV3UmVzLm9rICYmIHByZXZpZXdSZXMuaHRtbCkge1xuICAgICAgZGlzcGxheUxheW91dFByZXZpZXcocHJldmlld1Jlcy5odG1sKTtcbiAgICAgIHNldFByZXZpZXdIdG1sKHByZXZpZXdSZXMuaHRtbCk7XG4gICAgICBkaXNtaXNzZWRTdGFsZUNhbGxvdXRSZXZpc2lvbiA9IG51bGw7XG4gICAgICBzdGF0ZU1hbmFnZXI/Lm1hcmtQcmV2aWV3R2VuZXJhdGVkPy4oe1xuICAgICAgICBwcmV2aWV3QXZhaWxhYmxlOiB0cnVlLFxuICAgICAgICBwcmV2aWV3T3V0cHV0czogcHJldmlld1Jlcy5wcmV2aWV3X291dHB1dHMgfHwgbnVsbCxcbiAgICAgICAgcGFnZUNvdW50RXN0aW1hdGU6IHByZXZpZXdSZXMucGFnZV9jb3VudF9lc3RpbWF0ZSA/PyBudWxsLFxuICAgICAgICBwYWdlQ291bnRFeGFjdDogcHJldmlld1Jlcy5wYWdlX2NvdW50X2V4YWN0ID8/IG51bGwsXG4gICAgICAgIHBhZ2VDb3VudENvbmZpZGVuY2U6IHByZXZpZXdSZXMucGFnZV9jb3VudF9jb25maWRlbmNlID8/IG51bGwsXG4gICAgICAgIHBhZ2VDb3VudFNvdXJjZTogcHJldmlld1Jlcy5wYWdlX2NvdW50X3NvdXJjZSB8fCBudWxsLFxuICAgICAgICBwYWdlV2FybmluZzogQm9vbGVhbihwcmV2aWV3UmVzLnBhZ2VfbGVuZ3RoX3dhcm5pbmcpLFxuICAgICAgICBwcmV2aWV3R2VuZXJhdGVkQXQ6IHByZXZpZXdSZXMucHJldmlld19nZW5lcmF0ZWRfYXQgfHwgbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICBwcmV2aWV3UmVxdWVzdElkOiBwcmV2aWV3UmVzLnByZXZpZXdfcmVxdWVzdF9pZCB8fCBudWxsLFxuICAgICAgfSk7XG4gICAgICByZW5kZXJQcmV2aWV3T3V0cHV0U3RhdHVzKHByZXZpZXdSZXMucHJldmlld19vdXRwdXRzIHx8IG51bGwpO1xuICAgICAgcmVmcmVzaExheW91dFJldmlld1N0YXRlKCk7XG4gICAgICAocHJldmlld1Jlcy5jb250ZW50X3dhcm5pbmdzIHx8IFtdKS5mb3JFYWNoKHcgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHNob3dUb2FzdCA9PT0gJ2Z1bmN0aW9uJykgc2hvd1RvYXN0KHcubWVzc2FnZSwgJ3dhcm5pbmcnLCA4MDAwKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoc3RhdHVzRWwpIHsgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnXHUyNzA1IEFwcGxpZWQnOyBzZXRUaW1lb3V0KCgpID0+IHsgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnJzsgfSwgMjAwMCk7IH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKHN0YXR1c0VsKSBzdGF0dXNFbC50ZXh0Q29udGVudCA9IGBcdTI3NEMgRmFpbGVkIHRvIGFwcGx5IFx1MjAxNCB0cnkgYWdhaW4gb3IgcmVmcmVzaC5gO1xuICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsIGBcdTI3NEMgQ291bGQgbm90IGFwcGx5IHRoZSBpbnN0cnVjdGlvbi4gVHJ5IHJlcGhyYXNpbmcgaXQgb3IgcmVmcmVzaCB0aGUgcGFnZSBpZiB0aGUgcHJvYmxlbSBwZXJzaXN0cy5gKTtcbiAgfVxufVxuXG4vKipcbiAqIFN1Ym1pdCBhbiBpbnN0cnVjdGlvbiB0aHJvdWdoIHRoZSB1bmlmaWVkIHNtYXJ0LWluc3RydWN0aW9uIGVuZHBvaW50LlxuICogVGhlIGJhY2tlbmQgY2xhc3NpZmllcyB0aGUgaW5zdHJ1Y3Rpb24gYXMgbGF5b3V0IG9yIGNvbnRlbnQgYW5kIGRlbGVnYXRlc1xuICogdG8gdGhlIGFwcHJvcHJpYXRlIGhhbmRsZXIuIFRoZSByZXNwb25zZSBpcyByb3V0ZWQgYWNjb3JkaW5nbHkgaGVyZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3VibWl0U21hcnRJbnN0cnVjdGlvbihpbnN0cnVjdGlvblRleHQpIHtcbiAgY29uc3QgY3VycmVudEh0bWwgPSBnZXRDdkFydGlmYWN0cygpWycqLmh0bWwnXSB8fCAnJztcbiAgLy8gU25hcHNob3Qgc3RhdGUgZm9yIHVuZG8gYmVmb3JlIGFwcGx5aW5nLlxuICBfbGF5b3V0VW5kb1N0YWNrLnB1c2goe1xuICAgIGh0bWw6IGN1cnJlbnRIdG1sLFxuICAgIGluc3RydWN0aW9uczogKHdpbmRvdy5sYXlvdXRJbnN0cnVjdGlvbnMgfHwgW10pLm1hcChpID0+ICh7IC4uLmkgfSkpLFxuICB9KTtcbiAgaWYgKF9sYXlvdXRVbmRvU3RhY2subGVuZ3RoID4gX1VORE9fU1RBQ0tfTUFYKSB7XG4gICAgX2xheW91dFVuZG9TdGFjay5zaGlmdCgpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBzaG93UHJvY2Vzc2luZyh0cnVlKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGFwaUNhbGwoJ1BPU1QnLCAnL2FwaS9jdi9zbWFydC1pbnN0cnVjdGlvbicsIHsgaW5zdHJ1Y3Rpb246IGluc3RydWN0aW9uVGV4dCB9KTtcblxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIGlmIChyZXNwb25zZS5lcnJvciA9PT0gJ2NsYXJpZnknKSB7XG4gICAgICAgIHNob3dDbGFyaWZpY2F0aW9uRGlhbG9nKHJlc3BvbnNlLnF1ZXN0aW9uLCBpbnN0cnVjdGlvblRleHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXBwZW5kTGF5b3V0U2FmZXR5QWxlcnQocmVzcG9uc2Uuc2FmZXR5X2FsZXJ0KTtcbiAgICAgICAgbGV0IGVycm9ySHRtbCA9IGBcdTI2QTBcdUZFMEYgRXJyb3I6ICR7ZXNjYXBlSHRtbChyZXNwb25zZS5lcnJvcil9IFx1MjAxNCAke2VzY2FwZUh0bWwocmVzcG9uc2UuZGV0YWlscyB8fCAnJyl9YDtcbiAgICAgICAgaWYgKHJlc3BvbnNlLnJhd19yZXNwb25zZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZXJyb3JIdG1sICs9IGA8YnI+PGRldGFpbHMgc3R5bGU9XCJtYXJnaW4tdG9wOjZweFwiPjxzdW1tYXJ5IHN0eWxlPVwiY3Vyc29yOnBvaW50ZXI7Zm9udC1zaXplOjAuODVlbTtjb2xvcjojNjQ3NDhiXCI+UmF3IExMTSByZXNwb25zZTwvc3VtbWFyeT48cHJlIHN0eWxlPVwiZm9udC1zaXplOjAuNzVlbTt3aGl0ZS1zcGFjZTpwcmUtd3JhcDt3b3JkLWJyZWFrOmJyZWFrLWFsbDttYXgtaGVpZ2h0OjIwMHB4O292ZXJmbG93LXk6YXV0bztiYWNrZ3JvdW5kOiNmOGZhZmM7Ym9yZGVyOjFweCBzb2xpZCAjZTJlOGYwO2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6OHB4O21hcmdpbi10b3A6NHB4XCI+JHtlc2NhcGVIdG1sKHJlc3BvbnNlLnJhd19yZXNwb25zZSB8fCAnKGVtcHR5KScpfTwvcHJlPjwvZGV0YWlscz5gO1xuICAgICAgICB9XG4gICAgICAgIGFwcGVuZE1lc3NhZ2VIdG1sKCdzeXN0ZW0nLCBlcnJvckh0bWwpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGluc3RydWN0aW9uVHlwZSA9IHJlc3BvbnNlLmluc3RydWN0aW9uX3R5cGUgfHwgJ2xheW91dCc7XG5cbiAgICBpZiAoaW5zdHJ1Y3Rpb25UeXBlID09PSAnY29udGVudCcpIHtcbiAgICAgIC8vIENvbnRlbnQgcGF0aDogcmVuZGVyIHByb3Bvc2FscyBmb3IgcmV2aWV3XG4gICAgICBjb25zdCBwcm9wb3NhbHMgPSByZXNwb25zZS5wcm9wb3NhbHMgfHwgW107XG4gICAgICBpZiAocHJvcG9zYWxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnXHUyNkEwXHVGRTBGIE5vIGNvbnRlbnQgcHJvcG9zYWxzIHdlcmUgZ2VuZXJhdGVkLiBUcnkgcmVwaHJhc2luZyB5b3VyIGluc3RydWN0aW9uLicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVuZGVyQ29udGVudFByb3Bvc2Fscyhwcm9wb3NhbHMpO1xuICAgICAgICBjb25zdCBwYW5lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb250ZW50LXByb3Bvc2Fscy1wYW5lbCcpO1xuICAgICAgICBpZiAocGFuZWwpIHBhbmVsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgfVxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2luc3RydWN0aW9uLWlucHV0JykudmFsdWUgPSAnJztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBMYXlvdXQgcGF0aDogdXBkYXRlIHByZXZpZXdcbiAgICBjb25zdCBuZXdIdG1sID0gcmVzcG9uc2UuaHRtbDtcbiAgICBkaXNwbGF5TGF5b3V0UHJldmlldyhuZXdIdG1sKTtcbiAgICBhcHBlbmRMYXlvdXRTYWZldHlBbGVydChyZXNwb25zZS5zYWZldHlfYWxlcnQpO1xuICAgIHNldFByZXZpZXdIdG1sKG5ld0h0bWwpO1xuICAgIGRpc21pc3NlZFN0YWxlQ2FsbG91dFJldmlzaW9uID0gbnVsbDtcbiAgICBzdGF0ZU1hbmFnZXI/Lm1hcmtQcmV2aWV3R2VuZXJhdGVkPy4oe1xuICAgICAgcHJldmlld0F2YWlsYWJsZTogdHJ1ZSxcbiAgICAgIHByZXZpZXdPdXRwdXRzOiByZXNwb25zZS5wcmV2aWV3X291dHB1dHMgfHwgbnVsbCxcbiAgICAgIGxheW91dENvbmZpcm1lZDogZmFsc2UsXG4gICAgICBwYWdlQ291bnRFc3RpbWF0ZTogcmVzcG9uc2UucGFnZV9jb3VudF9lc3RpbWF0ZSA/PyBudWxsLFxuICAgICAgcGFnZUNvdW50RXhhY3Q6IHJlc3BvbnNlLnBhZ2VfY291bnRfZXhhY3QgPz8gbnVsbCxcbiAgICAgIHBhZ2VDb3VudENvbmZpZGVuY2U6IHJlc3BvbnNlLnBhZ2VfY291bnRfY29uZmlkZW5jZSA/PyBudWxsLFxuICAgICAgcGFnZUNvdW50U291cmNlOiByZXNwb25zZS5wYWdlX2NvdW50X3NvdXJjZSB8fCBudWxsLFxuICAgICAgcGFnZVdhcm5pbmc6IEJvb2xlYW4ocmVzcG9uc2UucGFnZV9sZW5ndGhfd2FybmluZyksXG4gICAgICBwcmV2aWV3R2VuZXJhdGVkQXQ6IHJlc3BvbnNlLnByZXZpZXdfZ2VuZXJhdGVkX2F0IHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHByZXZpZXdSZXF1ZXN0SWQ6IHJlc3BvbnNlLnByZXZpZXdfcmVxdWVzdF9pZCB8fCBudWxsLFxuICAgIH0pO1xuICAgIHJlbmRlclByZXZpZXdPdXRwdXRTdGF0dXMocmVzcG9uc2UucHJldmlld19vdXRwdXRzIHx8IG51bGwpO1xuXG4gICAgY29uc3QgaW5zdHJ1Y3Rpb24gPSB7XG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9Mb2NhbGVUaW1lU3RyaW5nKCksXG4gICAgICBpbnN0cnVjdGlvbl90ZXh0OiBpbnN0cnVjdGlvblRleHQsXG4gICAgICBjaGFuZ2Vfc3VtbWFyeTogcmVzcG9uc2Uuc3VtbWFyeSxcbiAgICAgIGNvbmZpcm1hdGlvbjogdHJ1ZSxcbiAgICB9O1xuICAgIGFkZFRvSW5zdHJ1Y3Rpb25IaXN0b3J5KGluc3RydWN0aW9uKTtcbiAgICBzaG93Q29uZmlybWF0aW9uTWVzc2FnZShgJHtyZXNwb25zZS5zYWZldHlfYWxlcnQ/LmZsYWdnZWQgPyAnXHUyNkEwXHVGRTBGICcgOiAnXHUyNzA1ICd9JHtyZXNwb25zZS5zdW1tYXJ5fWApO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnN0cnVjdGlvbi1pbnB1dCcpLnZhbHVlID0gJyc7XG4gICAgcmVmcmVzaExheW91dFJldmlld1N0YXRlKCk7XG5cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCBgXHUyNzRDIENvdWxkIG5vdCBhcHBseSB0aGUgaW5zdHJ1Y3Rpb24uIFRyeSByZXBocmFzaW5nIGl0LCBvciBjbGljayBcIlJlZ2VuZXJhdGUgUHJldmlld1wiIHRvIHJlc2V0IHRoZSBwcmV2aWV3IGFuZCB0cnkgYWdhaW4uYCk7XG4gIH0gZmluYWxseSB7XG4gICAgc2hvd1Byb2Nlc3NpbmcoZmFsc2UpO1xuICB9XG59XG5cbi8qKlxuICogU3VibWl0IGxheW91dCBpbnN0cnVjdGlvbiB0byBiYWNrZW5kIGZvciBwcm9jZXNzaW5nLlxuICpcbiAqIFVzZXMgUE9TVCAvYXBpL2N2L2xheW91dC1yZWZpbmUgKHN0YWdlZCBnZW5lcmF0aW9uIGNvbnRyYWN0KSB3aGVuIGFcbiAqIHNlc3Npb24tc3RvcmVkIHByZXZpZXcgaXMgYXZhaWxhYmxlLiAgRmFsbHMgYmFjayB0byB0aGUgbGVnYWN5XG4gKiBQT1NUIC9hcGkvbGF5b3V0LWluc3RydWN0aW9uIGVuZHBvaW50ICh3aGljaCByZXF1aXJlcyB0aGUgSFRNTCBpbiB0aGVcbiAqIHJlcXVlc3QgYm9keSkgd2hlbiBubyBzZXNzaW9uIHByZXZpZXcgZXhpc3RzLlxuICovXG5hc3luYyBmdW5jdGlvbiBzdWJtaXRMYXlvdXRJbnN0cnVjdGlvbihpbnN0cnVjdGlvblRleHQpIHtcbiAgLyogZHVja2Zsb3c6XG4gICAqICAgaWQ6IGxheW91dF91aV9yZWZpbmVfbGl2ZVxuICAgKiAgIGtpbmQ6IHVpXG4gICAqICAgdGltZXN0YW1wOiAnMjAyNi0wMy0yNlQwMDoyNDowMFonXG4gICAqICAgc3RhdHVzOiBsaXZlXG4gICAqICAgaGFuZGxlczpcbiAgICogICAtIHVpOmxheW91dC5zdWJtaXQtaW5zdHJ1Y3Rpb25cbiAgICogICBjYWxsczpcbiAgICogICAtIFBPU1QgL2FwaS9jdi9sYXlvdXQtcmVmaW5lXG4gICAqICAgLSBQT1NUIC9hcGkvbGF5b3V0LWluc3RydWN0aW9uXG4gICAqICAgcmVhZHM6XG4gICAqICAgLSBkb206I2luc3RydWN0aW9uLWlucHV0LnZhbHVlXG4gICAqICAgLSBzdGF0ZTpnZW5lcmF0aW9uX3N0YXRlLnByZXZpZXdBdmFpbGFibGVcbiAgICogICAtIHN0YXRlOmdlbmVyYXRpb25fc3RhdGUucGhhc2VcbiAgICogICAtIHdpbmRvdzpsYXlvdXRJbnN0cnVjdGlvbnNcbiAgICogICB3cml0ZXM6XG4gICAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9jdi9sYXlvdXQtcmVmaW5lLmluc3RydWN0aW9uXG4gICAqICAgLSBkb206I2xheW91dC1wcmV2aWV3XG4gICAqICAgLSB3aW5kb3c6bGF5b3V0SW5zdHJ1Y3Rpb25zXG4gICAqICAgLSBzdGF0ZTpnZW5lcmF0aW9uX3N0YXRlLnByZXZpZXdfb3V0cHV0c1xuICAgKiAgIG5vdGVzOiBTdWJtaXRzIGEgbmF0dXJhbC1sYW5ndWFnZSBsYXlvdXQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCB0aGUgc3RhZ2VkIHByZXZpZXcgd2hlbiBhdmFpbGFibGUsIHRoZW4gcmVmcmVzaGVzIHRoZSBwcmV2aWV3IGFuZCBsb2NhbCBpbnN0cnVjdGlvbiBoaXN0b3J5IGZyb20gdGhlIHJldHVybmVkIEhUTUwuXG4gICAqL1xuICBjb25zdCBjdXJyZW50SHRtbCA9IGdldEN2QXJ0aWZhY3RzKClbJyouaHRtbCddIHx8ICcnO1xuICBjb25zdCBwcmlvckluc3RydWN0aW9ucyA9IHdpbmRvdy5sYXlvdXRJbnN0cnVjdGlvbnMgfHwgW107XG5cbiAgLy8gU25hcHNob3Qgc3RhdGUgYmVmb3JlIGFwcGx5aW5nIHNvIFVuZG8gY2FuIHJlc3RvcmUgaXQuXG4gIF9sYXlvdXRVbmRvU3RhY2sucHVzaCh7XG4gICAgaHRtbDogY3VycmVudEh0bWwsXG4gICAgaW5zdHJ1Y3Rpb25zOiAod2luZG93LmxheW91dEluc3RydWN0aW9ucyB8fCBbXSkubWFwKGkgPT4gKHsgLi4uaSB9KSksXG4gIH0pO1xuICBpZiAoX2xheW91dFVuZG9TdGFjay5sZW5ndGggPiBfVU5ET19TVEFDS19NQVgpIHtcbiAgICBfbGF5b3V0VW5kb1N0YWNrLnNoaWZ0KCk7XG4gIH1cblxuICB0cnkge1xuICAgIHNob3dQcm9jZXNzaW5nKHRydWUpO1xuXG4gICAgLy8gUHJlZmVyIHRoZSBzZXNzaW9uLWJhY2tlZCBlbmRwb2ludDsgaXQgbWFuYWdlcyBIVE1MIHNlcnZlci1zaWRlLlxuICAgIGxldCByZXNwb25zZTtcbiAgICBjb25zdCBnZW5TdGF0ZSA9IHN0YXRlTWFuYWdlcj8uZ2V0R2VuZXJhdGlvblN0YXRlPy4oKSB8fCB7fTtcbiAgICBjb25zdCB1c2VTZXNzaW9uRW5kcG9pbnQgPSBnZW5TdGF0ZS5wcmV2aWV3QXZhaWxhYmxlIHx8IGdlblN0YXRlLnBoYXNlID09PSAnbGF5b3V0X3Jldmlldyc7XG5cbiAgICBpZiAodXNlU2Vzc2lvbkVuZHBvaW50KSB7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IGFwaUNhbGwoJ1BPU1QnLCAnL2FwaS9jdi9sYXlvdXQtcmVmaW5lJywge1xuICAgICAgICBpbnN0cnVjdGlvbjogaW5zdHJ1Y3Rpb25UZXh0LFxuICAgICAgICBjb250ZW50X3JldmlzaW9uOiBnZXRDdXJyZW50Q29udGVudFJldmlzaW9uKCksXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCBhcGlDYWxsKCdQT1NUJywgJy9hcGkvbGF5b3V0LWluc3RydWN0aW9uJywge1xuICAgICAgICBpbnN0cnVjdGlvbjogaW5zdHJ1Y3Rpb25UZXh0LFxuICAgICAgICBjdXJyZW50X2h0bWw6IGN1cnJlbnRIdG1sLFxuICAgICAgICBwcmlvcl9pbnN0cnVjdGlvbnM6IHByaW9ySW5zdHJ1Y3Rpb25zLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgaWYgKHJlc3BvbnNlLmVycm9yID09PSAnY2xhcmlmeScpIHtcbiAgICAgICAgc2hvd0NsYXJpZmljYXRpb25EaWFsb2cocmVzcG9uc2UucXVlc3Rpb24sIGluc3RydWN0aW9uVGV4dCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhcHBlbmRMYXlvdXRTYWZldHlBbGVydChyZXNwb25zZS5zYWZldHlfYWxlcnQpO1xuICAgICAgICBsZXQgZXJyb3JIdG1sID0gYFx1MjZBMFx1RkUwRiBFcnJvcjogJHtlc2NhcGVIdG1sKHJlc3BvbnNlLmVycm9yKX0gXHUyMDE0ICR7ZXNjYXBlSHRtbChyZXNwb25zZS5kZXRhaWxzIHx8ICcnKX1gO1xuICAgICAgICBpZiAocmVzcG9uc2UucmF3X3Jlc3BvbnNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBlcnJvckh0bWwgKz0gYDxicj48ZGV0YWlscyBzdHlsZT1cIm1hcmdpbi10b3A6NnB4XCI+PHN1bW1hcnkgc3R5bGU9XCJjdXJzb3I6cG9pbnRlcjtmb250LXNpemU6MC44NWVtO2NvbG9yOiM2NDc0OGJcIj5SYXcgTExNIHJlc3BvbnNlPC9zdW1tYXJ5PjxwcmUgc3R5bGU9XCJmb250LXNpemU6MC43NWVtO3doaXRlLXNwYWNlOnByZS13cmFwO3dvcmQtYnJlYWs6YnJlYWstYWxsO21heC1oZWlnaHQ6MjAwcHg7b3ZlcmZsb3cteTphdXRvO2JhY2tncm91bmQ6I2Y4ZmFmYztib3JkZXI6MXB4IHNvbGlkICNlMmU4ZjA7Ym9yZGVyLXJhZGl1czo0cHg7cGFkZGluZzo4cHg7bWFyZ2luLXRvcDo0cHhcIj4ke2VzY2FwZUh0bWwocmVzcG9uc2UucmF3X3Jlc3BvbnNlIHx8ICcoZW1wdHkpJyl9PC9wcmU+PC9kZXRhaWxzPmA7XG4gICAgICAgIH1cbiAgICAgICAgYXBwZW5kTWVzc2FnZUh0bWwoJ3N5c3RlbScsIGVycm9ySHRtbCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHByZXZpZXcgd2l0aCBuZXcgSFRNTFxuICAgIGNvbnN0IG5ld0h0bWwgPSByZXNwb25zZS5odG1sO1xuICAgIGRpc3BsYXlMYXlvdXRQcmV2aWV3KG5ld0h0bWwpO1xuXG4gICAgYXBwZW5kTGF5b3V0U2FmZXR5QWxlcnQocmVzcG9uc2Uuc2FmZXR5X2FsZXJ0KTtcblxuICAgIC8vIFVwZGF0ZSBzdGF0ZVxuICAgIHNldFByZXZpZXdIdG1sKG5ld0h0bWwpO1xuICAgIGRpc21pc3NlZFN0YWxlQ2FsbG91dFJldmlzaW9uID0gbnVsbDtcbiAgICBzdGF0ZU1hbmFnZXI/Lm1hcmtQcmV2aWV3R2VuZXJhdGVkPy4oe1xuICAgICAgcHJldmlld0F2YWlsYWJsZTogdHJ1ZSxcbiAgICAgIHByZXZpZXdPdXRwdXRzOiByZXNwb25zZS5wcmV2aWV3X291dHB1dHMgfHwgbnVsbCxcbiAgICAgIGxheW91dENvbmZpcm1lZDogZmFsc2UsXG4gICAgICBwYWdlQ291bnRFc3RpbWF0ZTogcmVzcG9uc2UucGFnZV9jb3VudF9lc3RpbWF0ZSA/PyBudWxsLFxuICAgICAgcGFnZUNvdW50RXhhY3Q6IHJlc3BvbnNlLnBhZ2VfY291bnRfZXhhY3QgPz8gbnVsbCxcbiAgICAgIHBhZ2VDb3VudENvbmZpZGVuY2U6IHJlc3BvbnNlLnBhZ2VfY291bnRfY29uZmlkZW5jZSA/PyBudWxsLFxuICAgICAgcGFnZUNvdW50U291cmNlOiByZXNwb25zZS5wYWdlX2NvdW50X3NvdXJjZSB8fCBudWxsLFxuICAgICAgcGFnZVdhcm5pbmc6IEJvb2xlYW4ocmVzcG9uc2UucGFnZV9sZW5ndGhfd2FybmluZyksXG4gICAgICBwcmV2aWV3R2VuZXJhdGVkQXQ6IHJlc3BvbnNlLnByZXZpZXdfZ2VuZXJhdGVkX2F0IHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHByZXZpZXdSZXF1ZXN0SWQ6IHJlc3BvbnNlLnByZXZpZXdfcmVxdWVzdF9pZCB8fCBudWxsLFxuICAgIH0pO1xuICAgIHJlbmRlclByZXZpZXdPdXRwdXRTdGF0dXMocmVzcG9uc2UucHJldmlld19vdXRwdXRzIHx8IG51bGwpO1xuXG4gICAgLy8gQWRkIHRvIGluc3RydWN0aW9uIGhpc3RvcnlcbiAgICBjb25zdCBpbnN0cnVjdGlvbiA9IHtcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0xvY2FsZVRpbWVTdHJpbmcoKSxcbiAgICAgIGluc3RydWN0aW9uX3RleHQ6IGluc3RydWN0aW9uVGV4dCxcbiAgICAgIGNoYW5nZV9zdW1tYXJ5OiByZXNwb25zZS5zdW1tYXJ5LFxuICAgICAgY29uZmlybWF0aW9uOiB0cnVlXG4gICAgfTtcbiAgICBhZGRUb0luc3RydWN0aW9uSGlzdG9yeShpbnN0cnVjdGlvbik7XG5cbiAgICAvLyBTaG93IGNvbmZpcm1hdGlvblxuICAgIHNob3dDb25maXJtYXRpb25NZXNzYWdlKGAke3Jlc3BvbnNlLnNhZmV0eV9hbGVydD8uZmxhZ2dlZCA/ICdcdTI2QTBcdUZFMEYgJyA6ICdcdTI3MDUgJ30ke3Jlc3BvbnNlLnN1bW1hcnl9YCk7XG5cbiAgICAvLyBDbGVhciBpbnB1dCBhbmQgcmVmcmVzaCB0aGUgc3RhZ2VkIGNvbnRyb2xzLlxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnN0cnVjdGlvbi1pbnB1dCcpLnZhbHVlID0gJyc7XG4gICAgcmVmcmVzaExheW91dFJldmlld1N0YXRlKCk7XG5cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCBgXHUyNzRDIENvdWxkIG5vdCBhcHBseSB0aGUgbGF5b3V0IGluc3RydWN0aW9uLiBUcnkgcmVwaHJhc2luZyBpdCwgb3IgY2xpY2sgXCJSZWdlbmVyYXRlIFByZXZpZXdcIiB0byByZXNldCBhbmQgdHJ5IGFnYWluLmApO1xuICB9IGZpbmFsbHkge1xuICAgIHNob3dQcm9jZXNzaW5nKGZhbHNlKTtcbiAgfVxufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBtYXJrUHJldmlld0dlbmVyYXRlZCBwYXlsb2FkIGZyb20gYSAvYXBpL2N2L2dlbmVyYXRlLXByZXZpZXcgcmVzcG9uc2UuXG4gKiBAcGFyYW0ge09iamVjdH0gZGF0YSAtIFJlc3BvbnNlIGZyb20gdGhlIGdlbmVyYXRlLXByZXZpZXcgZW5kcG9pbnQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBQYXlsb2FkIHN1aXRhYmxlIGZvciBzdGF0ZU1hbmFnZXIubWFya1ByZXZpZXdHZW5lcmF0ZWQoKS5cbiAqL1xuZnVuY3Rpb24gX2J1aWxkUHJldmlld1BheWxvYWQoZGF0YSkge1xuICByZXR1cm4ge1xuICAgIHByZXZpZXdBdmFpbGFibGU6ICAgIHRydWUsXG4gICAgcHJldmlld091dHB1dHM6ICAgICAgZGF0YS5wcmV2aWV3X291dHB1dHMgICAgICB8fCBudWxsLFxuICAgIHBhZ2VDb3VudEVzdGltYXRlOiAgIGRhdGEucGFnZV9jb3VudF9lc3RpbWF0ZSAgPz8gbnVsbCxcbiAgICBwYWdlQ291bnRFeGFjdDogICAgICBkYXRhLnBhZ2VfY291bnRfZXhhY3QgICAgICA/PyBudWxsLFxuICAgIHBhZ2VDb3VudENvbmZpZGVuY2U6IGRhdGEucGFnZV9jb3VudF9jb25maWRlbmNlID8/IG51bGwsXG4gICAgcGFnZUNvdW50U291cmNlOiAgICAgZGF0YS5wYWdlX2NvdW50X3NvdXJjZSAgICAgfHwgbnVsbCxcbiAgICBwYWdlV2FybmluZzogICAgICAgICBCb29sZWFuKGRhdGEucGFnZV9sZW5ndGhfd2FybmluZyksXG4gICAgcHJldmlld0dlbmVyYXRlZEF0OiAgZGF0YS5wcmV2aWV3X2dlbmVyYXRlZF9hdCAgfHwgbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIHByZXZpZXdSZXF1ZXN0SWQ6ICAgIGRhdGEucHJldmlld19yZXF1ZXN0X2lkICAgIHx8IG51bGwsXG4gIH07XG59XG5cbi8qKlxuICogRmV0Y2ggdGhlIENWIEhUTUwgcHJldmlldyB2aWEgdGhlIHN0YWdlZCBnZW5lcmF0aW9uIGNvbnRyYWN0LlxuICpcbiAqIFN0cmF0ZWd5IGRlcGVuZHMgb24gdGhlIGN1cnJlbnQgZ2VuZXJhdGlvbiBzdGF0ZTpcbiAqXG4gKiAtIHBoYXNlIGlzIG5vdCBjb25maXJtZWQvZmluYWxfY29tcGxldGU6XG4gKiAgIEFsd2F5cyBjYWxscyBQT1NUIC9hcGkvY3YvZ2VuZXJhdGUtcHJldmlldywgd2hpY2ggc3RvcmVzIHByZXZpZXdfaHRtbCBpblxuICogICBnZW5lcmF0aW9uX3N0YXRlIChyZXF1aXJlZCBmb3IgY29uZmlybS1sYXlvdXQpIGFuZCBjYWxscyBtYXJrUHJldmlld0dlbmVyYXRlZC5cbiAqICAgVGhpcyBib290c3RyYXBzIHRoZSBzdGFnZWQgc3RhdGUgZXZlbiBhZnRlciBsZWdhY3kgZ2VuZXJhdGVfY3YgYWN0aW9ucyB0aGF0XG4gKiAgIHdyaXRlIGZpbGVzIHRvIGRpc2sgd2l0aG91dCBwb3B1bGF0aW5nIGdlbmVyYXRpb25fc3RhdGUucHJldmlld19odG1sLlxuICogICBGYWxscyBiYWNrIHRvIEdFVCAvYXBpL2xheW91dC1odG1sIChwYXNzaXZlLCBubyBzdGF0ZSBjaGFuZ2UpIHdoZW5cbiAqICAgZ2VuZXJhdGUtcHJldmlldyBpcyB1bmF2YWlsYWJsZSAoZS5nLiBzZXNzaW9uIGhhcyBubyBqb2JfYW5hbHlzaXMgeWV0KS5cbiAqXG4gKiAtIHBoYXNlIGlzIGNvbmZpcm1lZC9maW5hbF9jb21wbGV0ZSAocGFzc2l2ZSByZXN0b3JlKTpcbiAqICAgUmVhZHMgSFRNTCBmcm9tIGRpc2sgdmlhIEdFVCAvYXBpL2xheW91dC1odG1sIHdpdGhvdXQgdG91Y2hpbmcgc2Vzc2lvbiBzdGF0ZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gX2ZldGNoQW5kRGlzcGxheUxheW91dFByZXZpZXcoKSB7XG4gIGNvbnN0IGdlblN0YXRlICAgID0gc3RhdGVNYW5hZ2VyPy5nZXRHZW5lcmF0aW9uU3RhdGU/LigpIHx8IHt9O1xuICBjb25zdCBpc0NvbmZpcm1lZCA9IGdlblN0YXRlLnBoYXNlID09PSBHRU5FUkFUSU9OX1BIQVNFUy5DT05GSVJNRURcbiAgICAgICAgICAgICAgICAgICB8fCBnZW5TdGF0ZS5waGFzZSA9PT0gR0VORVJBVElPTl9QSEFTRVMuRklOQUxfQ09NUExFVEU7XG5cbiAgc2hvd1ByZXZpZXdMb2FkaW5nKHRydWUsIGlzQ29uZmlybWVkID8gJ0xvYWRpbmcgc2F2ZWQgbGF5b3V0XHUyMDI2JyA6ICdHZW5lcmF0aW5nIHByZXZpZXdcdTIwMjYnKTtcbiAgdHJ5IHtcbiAgICAvLyBGcmVzaC1yZW5kZXIgcGF0aDogYWx3YXlzIHBvcHVsYXRlIGdlbmVyYXRpb25fc3RhdGUucHJldmlld19odG1sIG9uIHRoZSBiYWNrZW5kXG4gICAgLy8gc28gdGhhdCBjb25maXJtLWxheW91dCBzdWNjZWVkcy4gQ292ZXJzIGJvdGggdGhlIG5vcm1hbCBzdGFnZWQgcGF0aCBhbmQgdGhlXG4gICAgLy8gbGVnYWN5IGdlbmVyYXRlX2N2IHBhdGggdGhhdCBkb2VzIG5vdCBjYWxsIGdlbmVyYXRlLXByZXZpZXcgaXRzZWxmLlxuICAgIGlmICghaXNDb25maXJtZWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBhcGlDYWxsKCdQT1NUJywgJy9hcGkvY3YvZ2VuZXJhdGUtcHJldmlldycsIHt9KTtcbiAgICAgICAgaWYgKGRhdGEub2sgJiYgZGF0YS5odG1sKSB7XG4gICAgICAgICAgZGlzcGxheUxheW91dFByZXZpZXcoZGF0YS5odG1sKTtcbiAgICAgICAgICBzZXRQcmV2aWV3SHRtbChkYXRhLmh0bWwpO1xuICAgICAgICAgIGRpc21pc3NlZFN0YWxlQ2FsbG91dFJldmlzaW9uID0gbnVsbDtcbiAgICAgICAgICBzdGF0ZU1hbmFnZXI/Lm1hcmtQcmV2aWV3R2VuZXJhdGVkPy4oX2J1aWxkUHJldmlld1BheWxvYWQoZGF0YSkpO1xuICAgICAgICAgIHJlbmRlclByZXZpZXdPdXRwdXRTdGF0dXMoZGF0YS5wcmV2aWV3X291dHB1dHMgfHwgbnVsbCk7XG4gICAgICAgICAgcmVmcmVzaExheW91dFJldmlld1N0YXRlKCk7XG4gICAgICAgICAgKGRhdGEuY29udGVudF93YXJuaW5ncyB8fCBbXSkuZm9yRWFjaCh3ID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc2hvd1RvYXN0ID09PSAnZnVuY3Rpb24nKSBzaG93VG9hc3Qody5tZXNzYWdlLCAnd2FybmluZycsIDgwMDApO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoX2UpIHtcbiAgICAgICAgLy8gZmFsbCB0aHJvdWdoIHRvIGxlZ2FjeSBkaXNrIHJlYWRcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQYXNzaXZlIHJlc3RvcmUgcGF0aDogbG9hZCBzdG9yZWQgSFRNTCBmcm9tIGRpc2sgd2l0aG91dCB0b3VjaGluZyBnZW5lcmF0aW9uIHN0YXRlLlxuICAgIC8vIFVzZWQgZm9yIGNvbmZpcm1lZC9maW5hbF9jb21wbGV0ZSBsYXlvdXRzLCBvciBhcyBmYWxsYmFjayB3aGVuIGdlbmVyYXRlLXByZXZpZXdcbiAgICAvLyBpcyB1bmF2YWlsYWJsZSAoZS5nLiBzZXNzaW9uIGhhcyBubyBqb2JfYW5hbHlzaXMgeWV0KS5cbiAgICB0cnkge1xuICAgICAgc2hvd1ByZXZpZXdMb2FkaW5nKHRydWUsICdMb2FkaW5nIHN0b3JlZCBsYXlvdXRcdTIwMjYnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBhcGlDYWxsKCdHRVQnLCAnL2FwaS9sYXlvdXQtaHRtbCcpO1xuICAgICAgaWYgKGRhdGEub2sgJiYgZGF0YS5odG1sKSB7XG4gICAgICAgIGRpc3BsYXlMYXlvdXRQcmV2aWV3KGRhdGEuaHRtbCk7XG4gICAgICAgIHNldFByZXZpZXdIdG1sKGRhdGEuaHRtbCk7XG4gICAgICAgIHJlZnJlc2hMYXlvdXRSZXZpZXdTdGF0ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsb2cud2FybignTGF5b3V0IHByZXZpZXcgbm90IGF2YWlsYWJsZTonLCBkYXRhLmVycm9yIHx8ICdubyBIVE1MIHJldHVybmVkJyk7XG4gICAgfSBjYXRjaCAoX2UpIHtcbiAgICAgIC8vIG5vIHByZXZpZXcgYXZhaWxhYmxlXG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIHNob3dQcmV2aWV3TG9hZGluZyhmYWxzZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBEaXNwbGF5IEhUTUwgcHJldmlldyBpbiBpZnJhbWUuXG4gKi9cbmZ1bmN0aW9uIGRpc3BsYXlMYXlvdXRQcmV2aWV3KGh0bWwpIHtcbiAgY29uc3QgcHJldmlldyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYXlvdXQtcHJldmlldycpO1xuICBpZiAoIXByZXZpZXcpIHJldHVybjtcblxuICBzaG93UHJldmlld0xvYWRpbmcoZmFsc2UpO1xuICBwcmV2aWV3Lm9ubG9hZCA9ICgpID0+IGZpdExheW91dFByZXZpZXdUb1BhbmUocHJldmlldyk7XG4gIHJlbmRlckh0bWxJbnRvSWZyYW1lKHByZXZpZXcsIGh0bWwpO1xuXG4gIGNvbnN0IGRvYyA9IHByZXZpZXcuY29udGVudERvY3VtZW50IHx8IHByZXZpZXcuY29udGVudFdpbmRvdz8uZG9jdW1lbnQ7XG4gIGlmIChkb2M/LnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScpIHtcbiAgICBmaXRMYXlvdXRQcmV2aWV3VG9QYW5lKHByZXZpZXcpO1xuICB9XG59XG5cbi8qKlxuICogU2NhbGUgdGhlIHByZXZpZXcgc28gYW4gZW50aXJlIENWIHBhZ2Ugd2lkdGggZml0cyB3aXRoaW4gdGhlIHByZXZpZXcgcGFuZS5cbiAqL1xuZnVuY3Rpb24gZml0TGF5b3V0UHJldmlld1RvUGFuZShwcmV2aWV3KSB7XG4gIGNvbnN0IGRvYyA9IHByZXZpZXc/LmNvbnRlbnREb2N1bWVudCB8fCBwcmV2aWV3Py5jb250ZW50V2luZG93Py5kb2N1bWVudDtcbiAgY29uc3QgY29udGFpbmVyID0gcHJldmlldz8uY2xvc2VzdCgnLnByZXZpZXctaWZyYW1lLWNvbnRhaW5lcicpO1xuICBpZiAoIWRvYyB8fCAhY29udGFpbmVyKSByZXR1cm47XG5cbiAgY29uc3QgcGFnZUNvbnRhaW5lciA9IGRvYy5xdWVyeVNlbGVjdG9yKCcucGFnZS1jb250YWluZXInKSB8fCBkb2MuYm9keTtcbiAgaWYgKCFwYWdlQ29udGFpbmVyKSByZXR1cm47XG5cbiAgY29uc3QgY29udGFpbmVyV2lkdGggPSBNYXRoLm1heChjb250YWluZXIuY2xpZW50V2lkdGggLSAyNCwgMSk7XG4gIGNvbnN0IGNvbnRlbnRXaWR0aCA9IE1hdGgubWF4KFxuICAgIE1hdGguY2VpbChwYWdlQ29udGFpbmVyLnNjcm9sbFdpZHRoIHx8IDApLFxuICAgIE1hdGguY2VpbChwYWdlQ29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoIHx8IDApLFxuICAgIDFcbiAgKTtcbiAgY29uc3Qgc2NhbGUgPSBNYXRoLm1pbigxLCBjb250YWluZXJXaWR0aCAvIGNvbnRlbnRXaWR0aCk7XG5cbiAgZG9jLmRvY3VtZW50RWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kID0gJyNmOGZhZmMnO1xuICBkb2MuYm9keS5zdHlsZS5tYXJnaW4gPSAnMCc7XG4gIGRvYy5ib2R5LnN0eWxlLnBhZGRpbmcgPSAnMCc7XG4gIGRvYy5ib2R5LnN0eWxlLmJhY2tncm91bmQgPSAnI2Y4ZmFmYyc7XG4gIGRvYy5ib2R5LnN0eWxlLm92ZXJmbG93WCA9ICdhdXRvJztcblxuICBwYWdlQ29udGFpbmVyLnN0eWxlLnpvb20gPSBgJHtzY2FsZX1gO1xuICBwYWdlQ29udGFpbmVyLnN0eWxlLnRyYW5zZm9ybSA9ICcnO1xuICBwYWdlQ29udGFpbmVyLnN0eWxlLnRyYW5zZm9ybU9yaWdpbiA9ICcnO1xuICBwYWdlQ29udGFpbmVyLnN0eWxlLm1hcmdpbiA9ICcxMnB4JztcbiAgcHJldmlldy5zdHlsZS5taW5XaWR0aCA9ICcnO1xufVxuXG4vKipcbiAqIEFkZCBpbnN0cnVjdGlvbiB0byBoaXN0b3J5IHBhbmVsLlxuICovXG5mdW5jdGlvbiBhZGRUb0luc3RydWN0aW9uSGlzdG9yeShpbnN0cnVjdGlvbikge1xuICAvLyBJbml0aWFsaXplIGdsb2JhbCBpbnN0cnVjdGlvbiBsaXN0IGlmIG5lZWRlZFxuICBpZiAoIXdpbmRvdy5sYXlvdXRJbnN0cnVjdGlvbnMpIHtcbiAgICB3aW5kb3cubGF5b3V0SW5zdHJ1Y3Rpb25zID0gW107XG4gIH1cblxuICB3aW5kb3cubGF5b3V0SW5zdHJ1Y3Rpb25zLnB1c2gobm9ybWFsaXplTGF5b3V0SW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb24pKTtcbiAgcmVuZGVySW5zdHJ1Y3Rpb25IaXN0b3J5KCk7XG59XG5cbi8qKlxuICogUmVuZGVyIGluc3RydWN0aW9uIGhpc3RvcnkgZnJvbSBjdXJyZW50IHN0YXRlIHdpdGhvdXQgbXV0YXRpbmcgaXQuXG4gKi9cbmZ1bmN0aW9uIHJlbmRlckluc3RydWN0aW9uSGlzdG9yeSgpIHtcbiAgY29uc3QgaGlzdG9yeUxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5zdHJ1Y3Rpb24taGlzdG9yeScpO1xuICBpZiAoIWhpc3RvcnlMaXN0KSByZXR1cm47XG5cbiAgY29uc3QgaW5zdHJ1Y3Rpb25zID0gd2luZG93LmxheW91dEluc3RydWN0aW9ucyB8fCBbXTtcbiAgaGlzdG9yeUxpc3QuaW5uZXJIVE1MID0gJyc7XG4gIGNvbnN0IGxhc3RJZHggPSBpbnN0cnVjdGlvbnMubGVuZ3RoIC0gMTtcbiAgaW5zdHJ1Y3Rpb25zLmZvckVhY2goKGluc3RydWN0aW9uLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IGVudHJ5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZW50cnkuY2xhc3NOYW1lID0gJ2luc3RydWN0aW9uLWhpc3RvcnktZW50cnknO1xuICAgIGNvbnN0IGlzTGFzdCA9IGluZGV4ID09PSBsYXN0SWR4O1xuICAgIGNvbnN0IHVuZG9IdG1sID0gaXNMYXN0XG4gICAgICA/IGA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0bi1zbVwiIG9uY2xpY2s9XCJ1bmRvSW5zdHJ1Y3Rpb24oJHtpbmRleH0pXCI+XHUyMUE5IFVuZG88L2J1dHRvbj5gXG4gICAgICA6IGA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0bi1zbVwiIGRpc2FibGVkIHRpdGxlPVwiVW5kbyBpcyBzZXF1ZW50aWFsIFx1MjAxNCB1bmRvIHRoZSBtb3N0IHJlY2VudCBpbnN0cnVjdGlvbiBmaXJzdFwiXG4gICAgICAgICAgIHN0eWxlPVwib3BhY2l0eTowLjM7Y3Vyc29yOm5vdC1hbGxvd2VkO1wiPlx1MjFBOSBVbmRvPC9idXR0b24+YDtcbiAgICBlbnRyeS5pbm5lckhUTUwgPSBgXG4gICAgICA8ZGl2IGNsYXNzPVwiaW5zdHJ1Y3Rpb24tdGltZVwiPiR7aW5zdHJ1Y3Rpb24udGltZXN0YW1wIHx8ICcnfTwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImluc3RydWN0aW9uLXRleHRcIj4ke2VzY2FwZUh0bWwoaW5zdHJ1Y3Rpb24uaW5zdHJ1Y3Rpb25fdGV4dCB8fCAnJyl9PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiaW5zdHJ1Y3Rpb24tc3VtbWFyeVwiPjxlbT4ke2VzY2FwZUh0bWwoaW5zdHJ1Y3Rpb24uY2hhbmdlX3N1bW1hcnkgfHwgJycpfTwvZW0+PC9kaXY+XG4gICAgICAke3VuZG9IdG1sfVxuICAgIGA7XG4gICAgaGlzdG9yeUxpc3QuYXBwZW5kQ2hpbGQoZW50cnkpO1xuICB9KTtcblxuICAvLyBVcGRhdGUgY291bnRcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2luc3RydWN0aW9uLWNvdW50JykudGV4dENvbnRlbnQgPSAod2luZG93LmxheW91dEluc3RydWN0aW9ucyB8fCBbXSkubGVuZ3RoO1xufVxuXG4vKipcbiAqIFJlc3RvcmUgaW5zdHJ1Y3Rpb24gaGlzdG9yeSBmcm9tIHNlc3Npb24gc3RhdGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxvYWRMYXlvdXRJbnN0cnVjdGlvbkhpc3RvcnkoKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBhcGlDYWxsKCdHRVQnLCAnL2FwaS9sYXlvdXQtaGlzdG9yeScpO1xuICAgIGlmICghcmVzcG9uc2U/Lmluc3RydWN0aW9ucyB8fCAhQXJyYXkuaXNBcnJheShyZXNwb25zZS5pbnN0cnVjdGlvbnMpKSB7XG4gICAgICByZXR1cm4gd2luZG93LmxheW91dEluc3RydWN0aW9ucyB8fCBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzcG9uc2UuaW5zdHJ1Y3Rpb25zLm1hcCgoaW5zdHJ1Y3Rpb24pID0+IG5vcm1hbGl6ZUxheW91dEluc3RydWN0aW9uKGluc3RydWN0aW9uKSk7XG4gIH0gY2F0Y2ggKF9lcnJvcikge1xuICAgIHJldHVybiB3aW5kb3cubGF5b3V0SW5zdHJ1Y3Rpb25zIHx8IFtdO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc3RvcmVJbnN0cnVjdGlvbkhpc3RvcnkoKSB7XG4gIHdpbmRvdy5sYXlvdXRJbnN0cnVjdGlvbnMgPSBhd2FpdCBsb2FkTGF5b3V0SW5zdHJ1Y3Rpb25IaXN0b3J5KCk7XG4gIHJlbmRlckluc3RydWN0aW9uSGlzdG9yeSgpO1xuICByZWZyZXNoTGF5b3V0UmV2aWV3U3RhdGUoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaGFuZGxlUmVnZW5lcmF0ZVByZXZpZXdBY3Rpb24oKSB7XG4gIHRyeSB7XG4gICAgc2hvd1Byb2Nlc3NpbmcodHJ1ZSk7XG4gICAgYXdhaXQgX2ZldGNoQW5kRGlzcGxheUxheW91dFByZXZpZXcoKTtcbiAgICBzaG93Q29uZmlybWF0aW9uTWVzc2FnZSgnXHUyNzA1IFByZXZpZXcgcmVnZW5lcmF0ZWQgZnJvbSB0aGUgbGF0ZXN0IGNvbnRlbnQuJyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgYFx1Mjc0QyBDb3VsZCBub3QgcmVnZW5lcmF0ZSB0aGUgcHJldmlldy4gQ2hlY2sgdGhhdCB5b3VyIHNlc3Npb24gaXMgYWN0aXZlIGFuZCB0cnkgYWdhaW4uIElmIHRoZSBwcm9ibGVtIHBlcnNpc3RzLCByZWxvYWQgdGhlIHBhZ2UuYCk7XG4gICAgc2hvd1ByZXZpZXdMb2FkaW5nKGZhbHNlKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBzaG93UHJvY2Vzc2luZyhmYWxzZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBTaG93IHByb2Nlc3Npbmcgc3Bpbm5lciAocmlnaHQtcGFuZSBpbmRpY2F0b3IgZm9yIGxheW91dC1pbnN0cnVjdGlvbiBhcHBseSkuXG4gKi9cbmZ1bmN0aW9uIHNob3dQcm9jZXNzaW5nKHNob3cpIHtcbiAgY29uc3QgaW5kaWNhdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Byb2Nlc3NpbmctaW5kaWNhdG9yJyk7XG4gIGlmIChpbmRpY2F0b3IpIHtcbiAgICBpbmRpY2F0b3Iuc3R5bGUuZGlzcGxheSA9IHNob3cgPyAnYmxvY2snIDogJ25vbmUnO1xuICB9XG59XG5cbi8qKlxuICogU2hvdyBvciBoaWRlIHRoZSBwcmV2aWV3LWFyZWEgbG9hZGluZyBvdmVybGF5LlxuICogQHBhcmFtIHtib29sZWFufSBzaG93XG4gKiBAcGFyYW0ge3N0cmluZ30gW2xvZ1RleHRdIE9wdGlvbmFsIHN0YXR1cyBsaW5lIHNob3duIGJlbG93IHRoZSBzcGlubmVyLlxuICovXG5mdW5jdGlvbiBzaG93UHJldmlld0xvYWRpbmcoc2hvdywgbG9nVGV4dCA9ICcnKSB7XG4gIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJldmlldy1sb2FkaW5nLW92ZXJsYXknKTtcbiAgaWYgKCFvdmVybGF5KSByZXR1cm47XG4gIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9IHNob3cgPyAnZmxleCcgOiAnbm9uZSc7XG4gIGNvbnN0IGxvZ0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ByZXZpZXctbG9hZGluZy1sb2cnKTtcbiAgaWYgKGxvZ0VsKSBsb2dFbC50ZXh0Q29udGVudCA9IGxvZ1RleHQ7XG59XG5cbi8qKlxuICogU2hvdyBjb25maXJtYXRpb24gbWVzc2FnZS5cbiAqL1xuZnVuY3Rpb24gc2hvd0NvbmZpcm1hdGlvbk1lc3NhZ2UobWVzc2FnZSkge1xuICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbmZpcm1hdGlvbi1tZXNzYWdlJyk7XG4gIGlmICghZWxlbWVudCkgcmV0dXJuO1xuXG4gIGVsZW1lbnQudGV4dENvbnRlbnQgPSBtZXNzYWdlO1xuICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuXG4gIC8vIEF1dG8taGlkZSBhZnRlciAzIHNlY29uZHNcbiAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICB9LCAzMDAwKTtcbn1cblxuLyoqXG4gKiBTaG93IGlubGluZSBjbGFyaWZpY2F0aW9uIHBhbmVsIHdoZW4gTExNIG5lZWRzIG1vcmUgaW5mby5cbiAqIFJlcGxhY2VzIHdpbmRvdy5wcm9tcHQoKSB3aXRoIGFuIGFjY2Vzc2libGUgaW5saW5lIGZvcm0uXG4gKi9cbmZ1bmN0aW9uIHNob3dDbGFyaWZpY2F0aW9uRGlhbG9nKHF1ZXN0aW9uLCBvcmlnaW5hbEluc3RydWN0aW9uKSB7XG4gIGNvbnN0IGlucHV0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5zdHJ1Y3Rpb24taW5wdXQnKTtcbiAgY29uc3QgY29udGFpbmVyID0gaW5wdXRFbCA/IGlucHV0RWwuY2xvc2VzdCgnZGl2JykgfHwgaW5wdXRFbC5wYXJlbnROb2RlIDogbnVsbDtcbiAgaWYgKCFjb250YWluZXIpIHJldHVybjtcblxuICBjb25zdCBleGlzdGluZ1BhbmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xheW91dC1jbGFyaWZpY2F0aW9uLXBhbmVsJyk7XG4gIGlmIChleGlzdGluZ1BhbmVsKSBleGlzdGluZ1BhbmVsLnJlbW92ZSgpO1xuXG4gIGNvbnN0IHBhbmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHBhbmVsLmlkID0gJ2xheW91dC1jbGFyaWZpY2F0aW9uLXBhbmVsJztcbiAgcGFuZWwuc2V0QXR0cmlidXRlKCdyb2xlJywgJ2FsZXJ0Jyk7XG4gIHBhbmVsLnN0eWxlLmNzc1RleHQgPSAnYmFja2dyb3VuZDojZmVmOWMzO2JvcmRlcjoxcHggc29saWQgI2ZkZTA0Nztib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjE0cHg7bWFyZ2luLXRvcDoxMHB4Oyc7XG4gIHBhbmVsLmlubmVySFRNTCA9IGBcbiAgICA8cCBzdHlsZT1cIm1hcmdpbjowIDAgOHB4O2ZvbnQtc2l6ZTowLjllbTtjb2xvcjojOTI0MDBlO2ZvbnQtd2VpZ2h0OjYwMDtcIj5cbiAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlx1Mjc1Mzwvc3Bhbj4gQ2xhcmlmaWNhdGlvbiBuZWVkZWRcbiAgICA8L3A+XG4gICAgPHAgc3R5bGU9XCJtYXJnaW46MCAwIDEwcHg7Zm9udC1zaXplOjAuODhlbTtjb2xvcjojNzgzNTBmO1wiPiR7ZXNjYXBlSHRtbChxdWVzdGlvbil9PC9wPlxuICAgIDxsYWJlbCBmb3I9XCJsYXlvdXQtY2xhcmlmaWNhdGlvbi1pbnB1dFwiIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtmb250LXdlaWdodDo2MDA7Y29sb3I6IzM3NDE1MTtkaXNwbGF5OmJsb2NrO21hcmdpbi1ib3R0b206NHB4O1wiPlxuICAgICAgWW91ciBjbGFyaWZpY2F0aW9uOlxuICAgIDwvbGFiZWw+XG4gICAgPHRleHRhcmVhIGlkPVwibGF5b3V0LWNsYXJpZmljYXRpb24taW5wdXRcIiByb3dzPVwiMlwiXG4gICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Ym94LXNpemluZzpib3JkZXItYm94O3BhZGRpbmc6OHB4O2JvcmRlcjoxcHggc29saWQgI2ZkZTA0Nztib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6MC44OGVtO3Jlc2l6ZTp2ZXJ0aWNhbDtcIlxuICAgICAgYXJpYS1sYWJlbD1cIkNsYXJpZmljYXRpb24gZm9yIGxheW91dCBpbnN0cnVjdGlvblwiPiR7ZXNjYXBlSHRtbChvcmlnaW5hbEluc3RydWN0aW9uKX08L3RleHRhcmVhPlxuICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjhweDttYXJnaW4tdG9wOjhweDtcIj5cbiAgICAgIDxidXR0b24gaWQ9XCJsYXlvdXQtY2xhcmlmaWNhdGlvbi1zdWJtaXRcIlxuICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6I2Q5NzcwNjtjb2xvcjojZmZmO2JvcmRlcjpub25lO2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6NnB4IDE0cHg7Zm9udC1zaXplOjAuODVlbTtjdXJzb3I6cG9pbnRlcjtmb250LXdlaWdodDo2MDA7XCI+XG4gICAgICAgIFN1Ym1pdCBjbGFyaWZpY2F0aW9uXG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gaWQ9XCJsYXlvdXQtY2xhcmlmaWNhdGlvbi1jYW5jZWxcIlxuICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6bm9uZTtib3JkZXI6MXB4IHNvbGlkICNkOTc3MDY7Y29sb3I6IzkyNDAwZTtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjZweCAxNHB4O2ZvbnQtc2l6ZTowLjg1ZW07Y3Vyc29yOnBvaW50ZXI7XCI+XG4gICAgICAgIENhbmNlbFxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+YDtcblxuICBjb250YWluZXIuYXBwZW5kQ2hpbGQocGFuZWwpO1xuXG4gIGNvbnN0IGNsYXJJbnB1dCAgPSBwYW5lbC5xdWVyeVNlbGVjdG9yKCcjbGF5b3V0LWNsYXJpZmljYXRpb24taW5wdXQnKTtcbiAgY29uc3Qgc3VibWl0QnRuICA9IHBhbmVsLnF1ZXJ5U2VsZWN0b3IoJyNsYXlvdXQtY2xhcmlmaWNhdGlvbi1zdWJtaXQnKTtcbiAgY29uc3QgY2FuY2VsQnRuICA9IHBhbmVsLnF1ZXJ5U2VsZWN0b3IoJyNsYXlvdXQtY2xhcmlmaWNhdGlvbi1jYW5jZWwnKTtcblxuICBjbGFySW5wdXQuZm9jdXMoKTtcbiAgY2xhcklucHV0LnNldFNlbGVjdGlvblJhbmdlKGNsYXJJbnB1dC52YWx1ZS5sZW5ndGgsIGNsYXJJbnB1dC52YWx1ZS5sZW5ndGgpO1xuXG4gIHN1Ym1pdEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBjb25zdCBjbGFyaWZpZWQgPSBjbGFySW5wdXQudmFsdWUudHJpbSgpO1xuICAgIHBhbmVsLnJlbW92ZSgpO1xuICAgIGlmIChjbGFyaWZpZWQgJiYgY2xhcmlmaWVkICE9PSBvcmlnaW5hbEluc3RydWN0aW9uKSB7XG4gICAgICBzdWJtaXRMYXlvdXRJbnN0cnVjdGlvbihjbGFyaWZpZWQpO1xuICAgIH1cbiAgfSk7XG4gIGNhbmNlbEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHBhbmVsLnJlbW92ZSgpKTtcbiAgY2xhcklucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBlID0+IHtcbiAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicgJiYgIWUuc2hpZnRLZXkpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyBzdWJtaXRCdG4uY2xpY2soKTsgfVxuICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIGNhbmNlbEJ0bi5jbGljaygpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBVbmRvIHRoZSBsYXN0IGxheW91dCBpbnN0cnVjdGlvbiBieSByZXN0b3JpbmcgdGhlIHByZXZpb3VzIHNuYXBzaG90LlxuICogVGhlIGluZGV4IHBhcmFtZXRlciBpcyBhY2NlcHRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBidXQgaXMgaWdub3JlZCBcdTIwMTRcbiAqIHRoZSB1bmRvIHN0YWNrIGFsd2F5cyByZXN0b3JlcyB0aGUgbW9zdCByZWNlbnQgcHJlLWluc3RydWN0aW9uIHN0YXRlLlxuICovXG5mdW5jdGlvbiB1bmRvSW5zdHJ1Y3Rpb24oX2luZGV4KSB7XG4gIGlmIChfbGF5b3V0VW5kb1N0YWNrLmxlbmd0aCA9PT0gMCkge1xuICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsICdcdTIxMzlcdUZFMEYgTm90aGluZyB0byB1bmRvLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHNuYXBzaG90ID0gX2xheW91dFVuZG9TdGFjay5wb3AoKTtcbiAgd2luZG93LmxheW91dEluc3RydWN0aW9ucyA9IHNuYXBzaG90Lmluc3RydWN0aW9ucztcblxuICBkaXNwbGF5TGF5b3V0UHJldmlldyhzbmFwc2hvdC5odG1sKTtcbiAgc2V0UHJldmlld0h0bWwoc25hcHNob3QuaHRtbCk7XG4gIHJlbmRlckluc3RydWN0aW9uSGlzdG9yeSgpO1xuICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnXHUyMUE5XHVGRTBGIExhc3QgbGF5b3V0IGluc3RydWN0aW9uIHVuZG9uZS4nKTtcbn1cblxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsICgpID0+IHtcbiAgY29uc3QgcHJldmlldyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYXlvdXQtcHJldmlldycpO1xuICBpZiAocHJldmlldykge1xuICAgIGZpdExheW91dFByZXZpZXdUb1BhbmUocHJldmlldyk7XG4gIH1cbn0pO1xuXG5hc3luYyBmdW5jdGlvbiBjb25maXJtTGF5b3V0UmV2aWV3KCkge1xuICB0cnkge1xuICAgIHNob3dQcm9jZXNzaW5nKHRydWUpO1xuXG4gICAgY29uc3QgZnJlc2huZXNzID0gc3RhdGVNYW5hZ2VyLmdldExheW91dEZyZXNobmVzcygpO1xuICAgIGlmIChmcmVzaG5lc3MuaXNTdGFsZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQcmV2aWV3IGlzIG91dGRhdGVkLiBSZWdlbmVyYXRlIHRoZSBwcmV2aWV3IGJlZm9yZSBjb25maXJtaW5nIGxheW91dC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb25maXJtUmVzID0gYXdhaXQgYXBpQ2FsbCgnUE9TVCcsICcvYXBpL2N2L2NvbmZpcm0tbGF5b3V0JywgeyBjb250ZW50X3JldmlzaW9uOiBnZXRDdXJyZW50Q29udGVudFJldmlzaW9uKCkgfSk7XG4gICAgaWYgKCFjb25maXJtUmVzPy5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGNvbmZpcm1SZXM/LmVycm9yIHx8ICdGYWlsZWQgdG8gY29uZmlybSBsYXlvdXQuJyk7XG4gICAgfVxuXG4gICAgc3RhdGVNYW5hZ2VyLm1hcmtMYXlvdXRDb25maXJtZWQoe1xuICAgICAgY29uZmlybWVkQXQ6IGNvbmZpcm1SZXMuY29uZmlybWVkX2F0IHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICB9KTtcbiAgICBzaG93Q29uZmlybWF0aW9uTWVzc2FnZSgnXHUyNzA1IExheW91dCBjb25maXJtZWQuIEdlbmVyYXRlIGZpbmFsIGZpbGVzIHdoZW4geW91IGFyZSByZWFkeS4nKTtcbiAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCAnXHUyNzA1IExheW91dCBjb25maXJtZWQuIFJldmlldyB0aGUgcHJldmlldyBpZiBuZWVkZWQsIHRoZW4gZ2VuZXJhdGUgdGhlIGZpbmFsIGZpbGVzLicpO1xuICAgIHJlZnJlc2hMYXlvdXRSZXZpZXdTdGF0ZSgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsIGBcdTI3NEMgQ291bGQgbm90IGNvbmZpcm0gdGhlIGxheW91dC4gVHJ5IGNsaWNraW5nIENvbmZpcm0gYWdhaW4uIElmIHRoZSBwcm9ibGVtIHBlcnNpc3RzLCByZWxvYWQgdGhlIHBhZ2UuYCk7XG4gIH0gZmluYWxseSB7XG4gICAgc2hvd1Byb2Nlc3NpbmcoZmFsc2UpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRmluYWxPdXRwdXRzKCkge1xuICAvKiBkdWNrZmxvdzpcbiAgICogICBpZDogbGF5b3V0X3VpX2dlbmVyYXRlX2ZpbmFsX2xpdmVcbiAgICogICBraW5kOiB1aVxuICAgKiAgIHRpbWVzdGFtcDogJzIwMjYtMDMtMjZUMDA6MjQ6MDBaJ1xuICAgKiAgIHN0YXR1czogbGl2ZVxuICAgKiAgIGhhbmRsZXM6XG4gICAqICAgLSB1aTpsYXlvdXQuZ2VuZXJhdGUtZmluYWxcbiAgICogICBjYWxsczpcbiAgICogICAtIFBPU1QgL2FwaS9jdi9nZW5lcmF0ZS1maW5hbFxuICAgKiAgIC0gUE9TVCAvYXBpL2xheW91dC1jb21wbGV0ZVxuICAgKiAgIHJlYWRzOlxuICAgKiAgIC0gc3RhdGU6Z2VuZXJhdGlvbl9zdGF0ZS5sYXlvdXRDb25maXJtZWRcbiAgICogICAtIHN0YXRlOmdlbmVyYXRpb25fc3RhdGUucGhhc2VcbiAgICogICAtIHN0YXRlOmxheW91dF9mcmVzaG5lc3NcbiAgICogICB3cml0ZXM6XG4gICAqICAgLSB0YWI6Y3ZBcnRpZmFjdHNcbiAgICogICAtIHN0YXRlOmdlbmVyYXRpb25fc3RhdGUuZmluYWxfZ2VuZXJhdGVkX2F0XG4gICAqICAgLSB1aTp3b3JrZmxvdy5yZWZpbmVtZW50XG4gICAqICAgbm90ZXM6IEdlbmVyYXRlcyB0aGUgZmluYWwgaHVtYW4tcmVhZGFibGUgb3V0cHV0cyBmcm9tIHRoZSBjb25maXJtZWQgcHJldmlldyBhbmQgYWR2YW5jZXMgdGhlIFVJIGludG8gZmlsZSByZXZpZXcvZmluYWxpc2Ugd2l0aCB0aGUgbmV3IGFydGlmYWN0IHNldC5cbiAgICovXG4gIHRyeSB7XG4gICAgc2hvd1Byb2Nlc3NpbmcodHJ1ZSk7XG5cbiAgICBjb25zdCBmcmVzaG5lc3MgPSBzdGF0ZU1hbmFnZXIuZ2V0TGF5b3V0RnJlc2huZXNzKCk7XG4gICAgY29uc3QgZ2VuZXJhdGlvblN0YXRlID0gc3RhdGVNYW5hZ2VyLmdldEdlbmVyYXRpb25TdGF0ZSgpO1xuICAgIGlmIChmcmVzaG5lc3MuaXNTdGFsZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQcmV2aWV3IGlzIG91dGRhdGVkLiBSZWdlbmVyYXRlIHRoZSBwcmV2aWV3IGJlZm9yZSBnZW5lcmF0aW5nIGZpbmFsIGZpbGVzLicpO1xuICAgIH1cbiAgICBpZiAoIWdlbmVyYXRpb25TdGF0ZS5sYXlvdXRDb25maXJtZWQgJiYgZ2VuZXJhdGlvblN0YXRlLnBoYXNlICE9PSAnY29uZmlybWVkJykge1xuICAgICAgY29uc3QgaGFzSW5zdHJ1Y3Rpb25zID0gKHdpbmRvdy5sYXlvdXRJbnN0cnVjdGlvbnMgfHwgW10pLmxlbmd0aCA+IDA7XG4gICAgICBpZiAoaGFzSW5zdHJ1Y3Rpb25zKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ29uZmlybSBsYXlvdXQgYmVmb3JlIGdlbmVyYXRpbmcgZmluYWwgZmlsZXMuJyk7XG4gICAgICB9XG4gICAgICAvLyBObyBpbnN0cnVjdGlvbnMgYWRkZWQgXHUyMDE0IGF1dG8tY29uZmlybSBzbyB1c2VycyBhcmVuJ3QgYmxvY2tlZCBieSBhIHJlZHVuZGFudCBjbGljay5cbiAgICAgIGNvbnN0IGNvbmZpcm1SZXMgPSBhd2FpdCBhcGlDYWxsKCdQT1NUJywgJy9hcGkvY3YvY29uZmlybS1sYXlvdXQnLCB7IGNvbnRlbnRfcmV2aXNpb246IGdldEN1cnJlbnRDb250ZW50UmV2aXNpb24oKSB9KTtcbiAgICAgIGlmICghY29uZmlybVJlcz8ub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGNvbmZpcm1SZXM/LmVycm9yIHx8ICdGYWlsZWQgdG8gYXV0by1jb25maXJtIGxheW91dC4nKTtcbiAgICAgIH1cbiAgICAgIHN0YXRlTWFuYWdlci5tYXJrTGF5b3V0Q29uZmlybWVkKHsgY29uZmlybWVkQXQ6IGNvbmZpcm1SZXMuY29uZmlybWVkX2F0IHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBmaW5hbFJlcyA9IGF3YWl0IGFwaUNhbGwoJ1BPU1QnLCAnL2FwaS9jdi9nZW5lcmF0ZS1maW5hbCcsIHt9KTtcbiAgICBpZiAoIWZpbmFsUmVzPy5vayB8fCAhZmluYWxSZXMub3V0cHV0cykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGZpbmFsUmVzPy5lcnJvciB8fCAnRmFpbGVkIHRvIGdlbmVyYXRlIGZpbmFsIENWIG91dHB1dC4nKTtcbiAgICB9XG5cbiAgICB1cGRhdGVDdkFydGlmYWN0cyhmaW5hbFJlcy5vdXRwdXRzKTtcbiAgICBzdGF0ZU1hbmFnZXIubWFya0ZpbmFsR2VuZXJhdGVkKGZpbmFsUmVzLmdlbmVyYXRlZF9hdCB8fCBudWxsLCB7XG4gICAgICBwYWdlQ291bnRFc3RpbWF0ZTogZmluYWxSZXMucGFnZV9jb3VudF9lc3RpbWF0ZSA/PyBudWxsLFxuICAgICAgcGFnZUNvdW50RXhhY3Q6IGZpbmFsUmVzLnBhZ2VfY291bnRfZXhhY3QgPz8gbnVsbCxcbiAgICB9KTtcblxuICAgIHNjaGVkdWxlQXRzUmVmcmVzaCgncG9zdF9nZW5lcmF0aW9uJyk7XG5cbiAgICBzdGF0ZU1hbmFnZXIuc2V0UGhhc2UoJ2ZpbmFsX2dlbmVyYXRpb24nKTtcbiAgICBzd2l0Y2hUYWIoJ2ZpbmFsX2dlbmVyYXRlJyk7XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ1x1MjcwNSBGaW5hbCBmaWxlcyBnZW5lcmF0ZWQgZnJvbSB0aGUgY29uZmlybWVkIGxheW91dC4nKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCBgXHUyNzRDIENvdWxkIG5vdCBnZW5lcmF0ZSBmaW5hbCBmaWxlczogJHtlcnJvci5tZXNzYWdlfSBUcnkgY2xpY2tpbmcgR2VuZXJhdGUgYWdhaW4uIElmIGxheW91dCBjb25maXJtYXRpb24gaXMgbmVlZGVkIGZpcnN0LCBjbGljayBDb25maXJtIExheW91dCwgdGhlbiB0cnkgYWdhaW4uYCk7XG4gIH0gZmluYWxseSB7XG4gICAgc2hvd1Byb2Nlc3NpbmcoZmFsc2UpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZUxheW91dFByaW1hcnlBY3Rpb24oKSB7XG4gIGNvbnN0IGZyZXNobmVzcyA9IHN0YXRlTWFuYWdlci5nZXRMYXlvdXRGcmVzaG5lc3MoKTtcbiAgY29uc3QgZ2VuZXJhdGlvblN0YXRlID0gc3RhdGVNYW5hZ2VyLmdldEdlbmVyYXRpb25TdGF0ZSgpO1xuICBpZiAoZnJlc2huZXNzLmlzU3RhbGUpIHJldHVybiBoYW5kbGVSZWdlbmVyYXRlUHJldmlld0FjdGlvbigpO1xuICBpZiAoZ2VuZXJhdGlvblN0YXRlLmxheW91dENvbmZpcm1lZCB8fCBnZW5lcmF0aW9uU3RhdGUucGhhc2UgPT09ICdjb25maXJtZWQnKSB7XG4gICAgcmV0dXJuIGdlbmVyYXRlRmluYWxPdXRwdXRzKCk7XG4gIH1cbiAgcmV0dXJuIGNvbmZpcm1MYXlvdXRSZXZpZXcoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29tcGxldGVMYXlvdXRSZXZpZXcoKSB7XG4gIHJldHVybiBoYW5kbGVMYXlvdXRQcmltYXJ5QWN0aW9uKCk7XG59XG5cbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihHRU5FUkFUSU9OX1NUQVRFX0VWRU5ULCByZWZyZXNoTGF5b3V0UmV2aWV3U3RhdGUpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgQ29udGVudCBwcm9wb3NhbCBmdW5jdGlvbnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8qKlxuICogU3VibWl0IGEgbmF0dXJhbC1sYW5ndWFnZSBjb250ZW50IGVkaXQgcmVxdWVzdCB0byB0aGUgYmFja2VuZCBhbmQgcmVuZGVyIHByb3Bvc2Fscy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3VibWl0Q29udGVudFByb3Bvc2FsKCkge1xuICBjb25zdCBpbnB1dCAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2luc3RydWN0aW9uLWlucHV0Jyk7XG4gIGNvbnN0IHByb2Nlc3NpbmcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGVudC1wcm9wb3NhbC1wcm9jZXNzaW5nJyk7XG4gIGNvbnN0IHBhbmVsICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGVudC1wcm9wb3NhbHMtcGFuZWwnKTtcblxuICBjb25zdCBpbnN0cnVjdGlvbiA9IGlucHV0Py52YWx1ZS50cmltKCk7XG4gIGlmICghaW5zdHJ1Y3Rpb24pIHtcbiAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnXHUyNkEwXHVGRTBGIFBsZWFzZSBkZXNjcmliZSB0aGUgY29udGVudCBjaGFuZ2UgeW91IHdhbnQgYmVmb3JlIHN1Ym1pdHRpbmcuJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHByb2Nlc3NpbmcpIHByb2Nlc3Npbmcuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgaWYgKHBhbmVsKSAgICAgICBwYW5lbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpQ2FsbCgnUE9TVCcsICcvYXBpL2N2L3Byb3Bvc2UtY29udGVudC1jaGFuZ2UnLCB7IGluc3RydWN0aW9uIH0pO1xuICAgIGlmICghcmVzPy5vaykge1xuICAgICAgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgYFx1Mjc0QyBDb3VsZCBub3QgZ2VuZXJhdGUgY29udGVudCBwcm9wb3NhbHMuIFRyeSByZXBocmFzaW5nIHlvdXIgaW5zdHJ1Y3Rpb24gb3IgY2hlY2sgdGhlIHNlc3Npb24gaXMgc3RpbGwgYWN0aXZlLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwcm9wb3NhbHMgPSByZXMucHJvcG9zYWxzIHx8IFtdO1xuICAgIGlmIChwcm9wb3NhbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnXHUyNkEwXHVGRTBGIE5vIHByb3Bvc2FscyB3ZXJlIGdlbmVyYXRlZC4gVHJ5IHJlcGhyYXNpbmcgeW91ciBpbnN0cnVjdGlvbi4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmVuZGVyQ29udGVudFByb3Bvc2Fscyhwcm9wb3NhbHMpO1xuICAgIGlmIChwYW5lbCkgcGFuZWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsIGBcdTI3NEMgQ291bGQgbm90IHN1Ym1pdCB0aGUgY29udGVudCBwcm9wb3NhbC4gQ2hlY2sgeW91ciBjb25uZWN0aW9uIGFuZCB0cnkgYWdhaW4uYCk7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKHByb2Nlc3NpbmcpIHByb2Nlc3Npbmcuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgfVxufVxuXG4vKipcbiAqIFJlbmRlciBhIGxpc3Qgb2YgY29udGVudCBwcm9wb3NhbHMgYXMgcmV2aWV3YWJsZSBjYXJkcyBpbnNpZGUgI2NvbnRlbnQtcHJvcG9zYWxzLXBhbmVsLlxuICogQHBhcmFtIHtBcnJheTx7aWQsIHR5cGUsIGxvY2F0aW9uLCBvcmlnaW5hbCwgcHJvcG9zZWQsIHJlYXNvbn0+fSBwcm9wb3NhbHNcbiAqL1xuZnVuY3Rpb24gcmVuZGVyQ29udGVudFByb3Bvc2Fscyhwcm9wb3NhbHMpIHtcbiAgY29uc3QgcGFuZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGVudC1wcm9wb3NhbHMtcGFuZWwnKTtcbiAgaWYgKCFwYW5lbCkgcmV0dXJuO1xuXG4gIGNvbnN0IGFwcGx5QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FwcGx5LWNvbnRlbnQtY2hhbmdlcy1idG4nKTtcblxuICBwYW5lbC5pbm5lckhUTUwgPSBgXG4gICAgPHAgY2xhc3M9XCJjb250ZW50LXByb3Bvc2Fscy1oZWFkaW5nXCI+JHtwcm9wb3NhbHMubGVuZ3RofSBwcm9wb3NhbCR7cHJvcG9zYWxzLmxlbmd0aCAhPT0gMSA/ICdzJyA6ICcnfSBcdTIwMTQgYXBwcm92ZSB0aGUgY2hhbmdlcyB5b3Ugd2FudCB0byBhcHBseTo8L3A+XG4gICAgJHtwcm9wb3NhbHMubWFwKChwLCBpKSA9PiBgXG4gICAgICA8ZGl2IGNsYXNzPVwiY29udGVudC1wcm9wb3NhbC1jYXJkXCIgZGF0YS1wcm9wb3NhbC1pZD1cIiR7ZXNjYXBlSHRtbChwLmlkKX1cIiBkYXRhLXByb3Bvc2FsLWluZGV4PVwiJHtpfVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHJvcG9zYWwtbWV0YVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwicHJvcG9zYWwtdHlwZS1iYWRnZVwiPiR7cC50eXBlID09PSAnc3VtbWFyeScgPyAnU3VtbWFyeScgOiAnQnVsbGV0J308L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJwcm9wb3NhbC1sb2NhdGlvblwiPiR7ZXNjYXBlSHRtbChwLmxvY2F0aW9uKX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHJvcG9zYWwtZGlmZlwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9wb3NhbC1vcmlnaW5hbFwiPjxzdHJvbmc+QmVmb3JlOjwvc3Ryb25nPiAke2VzY2FwZUh0bWwocC5vcmlnaW5hbCl9PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInByb3Bvc2FsLXByb3Bvc2VkXCI+PHN0cm9uZz5BZnRlcjo8L3N0cm9uZz4gJHtlc2NhcGVIdG1sKHAucHJvcG9zZWQpfTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgJHtwLnJlYXNvbiA/IGA8ZGl2IGNsYXNzPVwicHJvcG9zYWwtcmVhc29uXCI+PGVtPiR7ZXNjYXBlSHRtbChwLnJlYXNvbil9PC9lbT48L2Rpdj5gIDogJyd9XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwcm9wb3NhbC1hY3Rpb25zXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwicHJvcG9zYWwtYXBwcm92ZS1sYWJlbFwiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwicHJvcG9zYWwtYXBwcm92ZS1jaGVja2JveFwiIGNoZWNrZWQ+XG4gICAgICAgICAgICBBcHByb3ZlIHRoaXMgY2hhbmdlXG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5gKS5qb2luKCcnKX1cbiAgYDtcblxuICAvLyBTdG9yZSBwcm9wb3NhbHMgZm9yIGxhdGVyIHJldHJpZXZhbFxuICBwYW5lbC5kYXRhc2V0LnByb3Bvc2FscyA9IEpTT04uc3RyaW5naWZ5KHByb3Bvc2Fscyk7XG5cbiAgaWYgKGFwcGx5QnRuKSBhcHBseUJ0bi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbn1cblxuLyoqXG4gKiBDb2xsZWN0IGFwcHJvdmVkIHByb3Bvc2FscyBhbmQgUE9TVCB0aGVtIHRvIC9hcGkvY3YvYXBwbHktY29udGVudC1jaGFuZ2VzLlxuICogVXBkYXRlcyBkaXJ0eS1waGFzZSBzdGF0ZSBhbmQgc2hvd3MgdGhlIHJldHVybiBjYWxsb3V0LlxuICovXG5hc3luYyBmdW5jdGlvbiBhcHBseUFjY2VwdGVkUHJvcG9zYWxzKCkge1xuICBjb25zdCBwYW5lbCAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb250ZW50LXByb3Bvc2Fscy1wYW5lbCcpO1xuICBjb25zdCBhcHBseUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHBseS1jb250ZW50LWNoYW5nZXMtYnRuJyk7XG5cbiAgY29uc3QgYWxsUHJvcG9zYWxzID0gSlNPTi5wYXJzZShwYW5lbD8uZGF0YXNldC5wcm9wb3NhbHMgfHwgJ1tdJyk7XG4gIGNvbnN0IGNoZWNrYm94ZXMgICA9IHBhbmVsPy5xdWVyeVNlbGVjdG9yQWxsKCcucHJvcG9zYWwtYXBwcm92ZS1jaGVja2JveCcpIHx8IFtdO1xuXG4gIGNvbnN0IGFjY2VwdGVkID0gYWxsUHJvcG9zYWxzLmZpbHRlcigoXywgaSkgPT4gY2hlY2tib3hlc1tpXT8uY2hlY2tlZCk7XG4gIGlmIChhY2NlcHRlZC5sZW5ndGggPT09IDApIHtcbiAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnXHUyNkEwXHVGRTBGIE5vIHByb3Bvc2FscyBhcHByb3ZlZC4gVGljayBhdCBsZWFzdCBvbmUgY2hhbmdlIHRvIGFwcGx5LicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChhcHBseUJ0bikgYXBwbHlCdG4uZGlzYWJsZWQgPSB0cnVlO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpQ2FsbCgnUE9TVCcsICcvYXBpL2N2L2FwcGx5LWNvbnRlbnQtY2hhbmdlcycsIHsgYWNjZXB0ZWQgfSk7XG4gICAgaWYgKCFyZXM/Lm9rKSB7XG4gICAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCBgXHUyNzRDIEZhaWxlZCB0byBhcHBseSBjb250ZW50IGNoYW5nZXM6ICR7cmVzPy5lcnJvciB8fCAnVW5rbm93biBlcnJvcid9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3RhdGVNYW5hZ2VyLnNldERpcnR5UGhhc2VzKFxuICAgICAgcmVzLmRpcnR5X3BoYXNlcyB8fCBbJ2dlbmVyYXRlJywgJ2xheW91dCddLFxuICAgICAgcmVzLmVhcmxpZXN0X2RpcnR5X3N0ZXAgfHwgJ2dlbmVyYXRlJyxcbiAgICApO1xuXG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgYFx1MjcwNSAke3Jlcy5hcHBsaWVkX2NvdW50fSBjb250ZW50IGNoYW5nZSR7cmVzLmFwcGxpZWRfY291bnQgIT09IDEgPyAncycgOiAnJ30gc3RhZ2VkLiBSZXR1cm4gdG8gR2VuZXJhdGUgQ1YgdG8gYXBwbHkgdGhlbS5gKTtcblxuICAgIC8vIENsZWFyIHRoZSBwcm9wb3NhbCBwYW5lbFxuICAgIGlmIChwYW5lbCkgeyBwYW5lbC5pbm5lckhUTUwgPSAnJzsgcGFuZWwuc3R5bGUuZGlzcGxheSA9ICdub25lJzsgcGFuZWwuZGF0YXNldC5wcm9wb3NhbHMgPSAnW10nOyB9XG4gICAgaWYgKGFwcGx5QnRuKSBhcHBseUJ0bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgcmVmcmVzaExheW91dFJldmlld1N0YXRlKCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsIGBcdTI3NEMgQ291bGQgbm90IGFwcGx5IGNvbnRlbnQgY2hhbmdlcy4gQ2hlY2sgeW91ciBjb25uZWN0aW9uIGFuZCB0cnkgYWdhaW4uYCk7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKGFwcGx5QnRuKSBhcHBseUJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogU2hvdyBvciBoaWRlIHRoZSBkaXJ0eS1waGFzZXMgY2FsbG91dCBiYXNlZCBvbiBzdGF0ZU1hbmFnZXIuZ2V0RGlydHlQaGFzZXMoKS5cbiAqL1xuZnVuY3Rpb24gcmVuZGVyRGlydHlQaGFzZXNDYWxsb3V0KCkge1xuICBjb25zdCBjYWxsb3V0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RpcnR5LXBoYXNlcy1jYWxsb3V0Jyk7XG4gIGlmICghY2FsbG91dCkgcmV0dXJuO1xuICBjb25zdCBkaXJ0eSA9IHN0YXRlTWFuYWdlci5nZXREaXJ0eVBoYXNlcygpO1xuICBjYWxsb3V0LnN0eWxlLmRpc3BsYXkgPSBkaXJ0eS5sZW5ndGggPiAwID8gJ2Jsb2NrJyA6ICdub25lJztcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEVTIG1vZHVsZSBleHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuZXhwb3J0IHtcbiAgaW5pdGlhdGVMYXlvdXRJbnN0cnVjdGlvbnMsXG4gIGNvbXBsZXRlTGF5b3V0UmV2aWV3LFxuICBjb25maXJtTGF5b3V0UmV2aWV3LFxuICBnZW5lcmF0ZUZpbmFsT3V0cHV0cyxcbiAgaGFuZGxlTGF5b3V0UHJpbWFyeUFjdGlvbixcbiAgbG9hZExheW91dEluc3RydWN0aW9uSGlzdG9yeSxcbiAgcmVuZGVyUHJldmlld091dHB1dFN0YXR1cyxcbiAgcmVuZGVyTGF5b3V0UHJldmlld1N0YXR1cyxcbiAgZGlzcGxheUxheW91dFByZXZpZXcsXG4gIHN1Ym1pdExheW91dEluc3RydWN0aW9uLFxuICBzdWJtaXRTbWFydEluc3RydWN0aW9uLFxuICAvLyBoZWxwZXJzIGV4cG9ydGVkIGZvciB1bml0IHRlc3RzXG4gIHNob3dQcm9jZXNzaW5nLFxuICBzaG93Q29uZmlybWF0aW9uTWVzc2FnZSxcbiAgcmVuZGVySW5zdHJ1Y3Rpb25IaXN0b3J5LFxuICBhZGRUb0luc3RydWN0aW9uSGlzdG9yeSxcbiAgdW5kb0luc3RydWN0aW9uLFxuICAvLyBjb250ZW50IHByb3Bvc2FsXG4gIHN1Ym1pdENvbnRlbnRQcm9wb3NhbCxcbiAgcmVuZGVyQ29udGVudFByb3Bvc2FscyxcbiAgYXBwbHlBY2NlcHRlZFByb3Bvc2FscyxcbiAgcmVuZGVyRGlydHlQaGFzZXNDYWxsb3V0LFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL2F0cy1yZWZpbmVtZW50LmpzXG4gKiBBVFMgc2NvcmUgYmFkZ2UgZGlzcGxheSBhbmQgZGVib3VuY2VkIHJlZnJlc2ggc2NoZWR1bGluZy5cbiAqXG4gKiBERVBFTkRFTkNJRVM6XG4gKiAgIC0gZ2xvYmFsVGhpcy5zdGF0ZU1hbmFnZXIgZnJvbSBzdGF0ZS1tYW5hZ2VyLmpzIChhY2Nlc3NlZCB2aWEgZ2xvYmFsVGhpcyB0aHJvdWdob3V0KVxuICovXG5cbmZ1bmN0aW9uIF9kaXNwYXRjaEF0c1Njb3JlVXBkYXRlZCgpIHtcbiAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2F0cy1zY29yZS11cGRhdGVkJykpO1xufVxuXG5mdW5jdGlvbiBfc2FmZVRleHQodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZS50cmltKCkgOiAnJztcbn1cblxuZnVuY3Rpb24gX2NvZXJjZU9iamVjdCh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyA/IHZhbHVlIDoge307XG59XG5cbmZ1bmN0aW9uIF9mb3JtYXREYXRlTGFiZWwodmFsdWUpIHtcbiAgY29uc3QgdGV4dCA9IF9zYWZlVGV4dCh2YWx1ZSk7XG4gIGlmICghdGV4dCkgcmV0dXJuICcnO1xuXG4gIGlmICgvXlxcZHs0fS1cXGR7Mn0tXFxkezJ9JC8udGVzdCh0ZXh0KSkge1xuICAgIGNvbnN0IFt5ZWFyLCBtb250aCwgZGF5XSA9IHRleHQuc3BsaXQoJy0nKTtcbiAgICByZXR1cm4gYCR7bW9udGh9LyR7ZGF5fS8ke3llYXJ9YDtcbiAgfVxuXG4gIGNvbnN0IHBhcnNlZCA9IG5ldyBEYXRlKHRleHQpO1xuICBpZiAoIU51bWJlci5pc05hTihwYXJzZWQuZ2V0VGltZSgpKSkge1xuICAgIHJldHVybiBwYXJzZWQudG9JU09TdHJpbmcoKS5zbGljZSgwLCAxMCk7XG4gIH1cbiAgcmV0dXJuIHRleHQ7XG59XG5cbmZ1bmN0aW9uIF9nZXRQYWdlTGVuZ3RoTGFiZWwoKSB7XG4gIGNvbnN0IGdlbmVyYXRpb25TdGF0ZSA9IF9jb2VyY2VPYmplY3QoZ2xvYmFsVGhpcy5zdGF0ZU1hbmFnZXI/LmdldEdlbmVyYXRpb25TdGF0ZT8uKCkpO1xuICBjb25zdCBleGFjdCA9IE51bWJlcihnZW5lcmF0aW9uU3RhdGUucGFnZUNvdW50RXhhY3QpO1xuICBpZiAoTnVtYmVyLmlzRmluaXRlKGV4YWN0KSAmJiBleGFjdCA+IDApIHtcbiAgICByZXR1cm4gYExlbmd0aCAke2V4YWN0fSBwYWdlJHtleGFjdCA9PT0gMSA/ICcnIDogJ3MnfWA7XG4gIH1cblxuICBjb25zdCBlc3RpbWF0ZSA9IE51bWJlcihnZW5lcmF0aW9uU3RhdGUucGFnZUNvdW50RXN0aW1hdGUpO1xuICBpZiAoTnVtYmVyLmlzRmluaXRlKGVzdGltYXRlKSAmJiBlc3RpbWF0ZSA+IDApIHtcbiAgICByZXR1cm4gYExlbmd0aCAke2VzdGltYXRlLnRvRml4ZWQoMSl9IHBhZ2VzIGVzdGA7XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIF9nZXRKb2JTdW1tYXJ5TGFiZWwoKSB7XG4gIGNvbnN0IGludGFrZSA9IF9jb2VyY2VPYmplY3Qod2luZG93Ll9zdGF0dXNJbnRha2UpO1xuICBjb25zdCBhbmFseXNpcyA9IF9jb2VyY2VPYmplY3QoZ2xvYmFsVGhpcy5zdGF0ZU1hbmFnZXI/LmdldFRhYkRhdGE/LignYW5hbHlzaXMnKSk7XG4gIGNvbnN0IHBvc2l0aW9uRmFsbGJhY2sgPSBfc2FmZVRleHQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Bvc2l0aW9uLXRpdGxlJyk/LnRleHRDb250ZW50IHx8ICcnKTtcblxuICBjb25zdCByb2xlID0gX3NhZmVUZXh0KFxuICAgIGludGFrZS5yb2xlXG4gICAgICB8fCBhbmFseXNpcy5qb2JfdGl0bGVcbiAgICAgIHx8IGFuYWx5c2lzLnRpdGxlXG4gICAgICB8fCBhbmFseXNpcy5wb3NpdGlvbl9uYW1lXG4gICAgICB8fCAnJ1xuICApO1xuICBjb25zdCBjb21wYW55ID0gX3NhZmVUZXh0KGludGFrZS5jb21wYW55IHx8IGFuYWx5c2lzLmNvbXBhbnlfbmFtZSB8fCBhbmFseXNpcy5jb21wYW55IHx8ICcnKTtcbiAgY29uc3QgZGF0ZUFwcGxpZWQgPSBfZm9ybWF0RGF0ZUxhYmVsKFxuICAgIGludGFrZS5kYXRlX2FwcGxpZWRcbiAgICAgIHx8IGFuYWx5c2lzLmRhdGVfYXBwbGllZFxuICAgICAgfHwgYW5hbHlzaXMuYXBwbGljYXRpb25fZGF0ZVxuICAgICAgfHwgJydcbiAgKTtcblxuICBjb25zdCBwcmltYXJ5ID0gcm9sZSAmJiBjb21wYW55XG4gICAgPyBgJHtyb2xlfSBAICR7Y29tcGFueX1gXG4gICAgOiAocm9sZSB8fCBjb21wYW55IHx8IHBvc2l0aW9uRmFsbGJhY2spO1xuICBpZiAoIXByaW1hcnkpIHJldHVybiAnJztcbiAgaWYgKCFkYXRlQXBwbGllZCkgcmV0dXJuIHByaW1hcnk7XG4gIHJldHVybiBgJHtwcmltYXJ5fSAoJHtkYXRlQXBwbGllZH0pYDtcbn1cblxuZnVuY3Rpb24gX2tleXdvcmRDb3VudChrZXl3b3JkcywgdHlwZSwgc3RhdHVzZXMgPSBbJ21hdGNoZWQnLCAncGFydGlhbCddKSB7XG4gIHJldHVybiBrZXl3b3Jkcy5maWx0ZXIoa2V5d29yZCA9PiBrZXl3b3JkLnR5cGUgPT09IHR5cGUgJiYgc3RhdHVzZXMuaW5jbHVkZXMoa2V5d29yZC5zdGF0dXMpKS5sZW5ndGg7XG59XG5cbmZ1bmN0aW9uIF9idWlsZFN1bW1hcnlEZXRhaWwoc2NvcmUsIGtleXdvcmRzKSB7XG4gIGNvbnN0IG1pc3NpbmdIYXJkID0ga2V5d29yZHNcbiAgICAuZmlsdGVyKGtleXdvcmQgPT4ga2V5d29yZC50eXBlID09PSAnaGFyZCcgJiYga2V5d29yZC5zdGF0dXMgPT09ICdtaXNzaW5nJylcbiAgICAubWFwKGtleXdvcmQgPT4ga2V5d29yZC5rZXl3b3JkKVxuICAgIC5maWx0ZXIoQm9vbGVhbik7XG5cbiAgaWYgKG1pc3NpbmdIYXJkLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBwcmV2aWV3ID0gbWlzc2luZ0hhcmQuc2xpY2UoMCwgMikuam9pbignLCAnKTtcbiAgICBjb25zdCBzdWZmaXggPSBtaXNzaW5nSGFyZC5sZW5ndGggPiAyID8gYCArJHttaXNzaW5nSGFyZC5sZW5ndGggLSAyfSBtb3JlYCA6ICcnO1xuICAgIHJldHVybiBgTWlzc2luZyBoYXJkOiAke3ByZXZpZXd9JHtzdWZmaXh9YDtcbiAgfVxuXG4gIGNvbnN0IGV4YWN0ID0ga2V5d29yZHMuZmlsdGVyKGtleXdvcmQgPT4ga2V5d29yZC5tYXRjaF90eXBlID09PSAnZXhhY3QnIHx8IGtleXdvcmQubWF0Y2hfdHlwZSA9PT0gJ3N5bm9ueW0nKS5sZW5ndGg7XG4gIGNvbnN0IHBhcnRpYWwgPSBrZXl3b3Jkcy5maWx0ZXIoa2V5d29yZCA9PiBrZXl3b3JkLm1hdGNoX3R5cGUgPT09ICdwYXJ0aWFsJykubGVuZ3RoO1xuICBjb25zdCB0b3BTZWN0aW9ucyA9IE9iamVjdC5lbnRyaWVzKHNjb3JlLnNlY3Rpb25fc2NvcmVzIHx8IHt9KVxuICAgIC5maWx0ZXIoKFssIHZhbHVlXSkgPT4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiB2YWx1ZSA+IDApXG4gICAgLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiByaWdodFsxXSAtIGxlZnRbMV0pXG4gICAgLnNsaWNlKDAsIDIpXG4gICAgLm1hcCgoW3NlY3Rpb24sIHZhbHVlXSkgPT4gYCR7c2VjdGlvbn0gJHtNYXRoLnJvdW5kKHZhbHVlKX0lYCk7XG5cbiAgaWYgKHRvcFNlY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gYFRvcCBzZWN0aW9uczogJHt0b3BTZWN0aW9ucy5qb2luKCcgXHUyMDIyICcpfWA7XG4gIH1cblxuICBpZiAoZXhhY3QgPiAwIHx8IHBhcnRpYWwgPiAwKSB7XG4gICAgcmV0dXJuIGBNYXRjaCBxdWFsaXR5OiAke2V4YWN0fSBleGFjdCBcdTIwMjIgJHtwYXJ0aWFsfSBwYXJ0aWFsYDtcbiAgfVxuXG4gIHJldHVybiBgQmFzaXM6ICR7c2NvcmUuYmFzaXMgfHwgJ3Jldmlldyd9YDtcbn1cblxuZnVuY3Rpb24gZm9ybWF0QXRzU2NvcmVTdW1tYXJ5KHNjb3JlKSB7XG4gIGNvbnN0IGtleXdvcmRzID0gQXJyYXkuaXNBcnJheShzY29yZT8ua2V5d29yZF9zdGF0dXMpID8gc2NvcmUua2V5d29yZF9zdGF0dXMgOiBbXTtcbiAgY29uc3Qgb3ZlcmFsbCA9IHR5cGVvZiBzY29yZT8ub3ZlcmFsbCA9PT0gJ251bWJlcicgPyBNYXRoLnJvdW5kKHNjb3JlLm92ZXJhbGwpIDogbnVsbDtcblxuICBpZiAob3ZlcmFsbCA9PT0gbnVsbCkge1xuICAgIHJldHVybiB7IG92ZXJhbGw6IG51bGwsIGxpbmU6ICcnLCBkZXRhaWw6ICcnLCBrZXl3b3JkcyB9O1xuICB9XG5cbiAgaWYgKGtleXdvcmRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB7XG4gICAgICBvdmVyYWxsLFxuICAgICAgbGluZTogYE92ZXJhbGwgJHtvdmVyYWxsfSVgLFxuICAgICAgZGV0YWlsOiBgQmFzaXM6ICR7c2NvcmUuYmFzaXMgfHwgJ3Jldmlldyd9YCxcbiAgICAgIGtleXdvcmRzLFxuICAgIH07XG4gIH1cblxuICBjb25zdCBoYXJkVG90YWwgPSBrZXl3b3Jkcy5maWx0ZXIoa2V5d29yZCA9PiBrZXl3b3JkLnR5cGUgPT09ICdoYXJkJykubGVuZ3RoO1xuICBjb25zdCBzb2Z0VG90YWwgPSBrZXl3b3Jkcy5maWx0ZXIoa2V5d29yZCA9PiBrZXl3b3JkLnR5cGUgPT09ICdzb2Z0JykubGVuZ3RoO1xuICBjb25zdCBib251c1RvdGFsID0ga2V5d29yZHMuZmlsdGVyKGtleXdvcmQgPT4ga2V5d29yZC50eXBlID09PSAnYm9udXMnKS5sZW5ndGg7XG4gIGNvbnN0IHN1bW1hcnlQYXJ0cyA9IFtdO1xuXG4gIGlmIChoYXJkVG90YWwgPiAwKSB7XG4gICAgc3VtbWFyeVBhcnRzLnB1c2goYEhhcmQgJHtfa2V5d29yZENvdW50KGtleXdvcmRzLCAnaGFyZCcpfS8ke2hhcmRUb3RhbH1gKTtcbiAgfVxuICBpZiAoc29mdFRvdGFsID4gMCkge1xuICAgIHN1bW1hcnlQYXJ0cy5wdXNoKGBTb2Z0ICR7X2tleXdvcmRDb3VudChrZXl3b3JkcywgJ3NvZnQnKX0vJHtzb2Z0VG90YWx9YCk7XG4gIH1cbiAgaWYgKGJvbnVzVG90YWwgPiAwKSB7XG4gICAgc3VtbWFyeVBhcnRzLnB1c2goYEJvbnVzICR7X2tleXdvcmRDb3VudChrZXl3b3JkcywgJ2JvbnVzJyl9LyR7Ym9udXNUb3RhbH1gKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgb3ZlcmFsbCxcbiAgICBsaW5lOiBzdW1tYXJ5UGFydHMuam9pbignIFx1MjAyMiAnKSB8fCBgT3ZlcmFsbCAke292ZXJhbGx9JWAsXG4gICAgZGV0YWlsOiBfYnVpbGRTdW1tYXJ5RGV0YWlsKHNjb3JlLCBrZXl3b3JkcyksXG4gICAga2V5d29yZHMsXG4gIH07XG59XG5cbmZ1bmN0aW9uIF91cGRhdGVBdHNTdW1tYXJ5KHNjb3JlKSB7XG4gIGNvbnN0IGhlYWRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdHMtc2NvcmUtaGVhZGVyJyk7XG4gIGNvbnN0IHN1bW1hcnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXRzLXNjb3JlLXN1bW1hcnknKTtcbiAgY29uc3Qgc3VtbWFyeUxpbmUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXRzLXNjb3JlLXN1bW1hcnktbGluZScpO1xuICBjb25zdCBzdW1tYXJ5RGV0YWlsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F0cy1zY29yZS1zdW1tYXJ5LWRldGFpbCcpO1xuXG4gIGlmICghaGVhZGVyIHx8ICFzdW1tYXJ5IHx8ICFzdW1tYXJ5TGluZSB8fCAhc3VtbWFyeURldGFpbCkgcmV0dXJuO1xuXG4gIGNvbnN0IGtleXdvcmRzID0gQXJyYXkuaXNBcnJheShzY29yZT8ua2V5d29yZF9zdGF0dXMpID8gc2NvcmUua2V5d29yZF9zdGF0dXMgOiBbXTtcbiAgY29uc3QgaGFzU2NvcmUgPSBzY29yZSAmJiB0eXBlb2Ygc2NvcmUub3ZlcmFsbCA9PT0gJ251bWJlcic7XG4gIGNvbnN0IHBhZ2VMZW5ndGhMYWJlbCA9IF9nZXRQYWdlTGVuZ3RoTGFiZWwoKTtcbiAgY29uc3Qgam9iU3VtbWFyeUxhYmVsID0gX2dldEpvYlN1bW1hcnlMYWJlbCgpO1xuXG4gIGlmICghaGFzU2NvcmUpIHtcbiAgICBoZWFkZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBzdW1tYXJ5LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgc3VtbWFyeUxpbmUudGV4dENvbnRlbnQgPSAnJztcbiAgICBzdW1tYXJ5RGV0YWlsLnRleHRDb250ZW50ID0gJyc7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaGVhZGVyLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG5cbiAgY29uc3Qgc3VtbWFyeUNvbnRlbnQgPSBmb3JtYXRBdHNTY29yZVN1bW1hcnkoc2NvcmUpO1xuICBjb25zdCBsaW5lUGFydHMgPSBbc3VtbWFyeUNvbnRlbnQubGluZSwgcGFnZUxlbmd0aExhYmVsXS5maWx0ZXIoQm9vbGVhbik7XG4gIGNvbnN0IGRldGFpbFBhcnRzID0gW2pvYlN1bW1hcnlMYWJlbCwgc3VtbWFyeUNvbnRlbnQuZGV0YWlsXS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgaWYgKGxpbmVQYXJ0cy5sZW5ndGggPT09IDAgJiYgZGV0YWlsUGFydHMubGVuZ3RoID09PSAwICYmIGtleXdvcmRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHN1bW1hcnkuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBzdW1tYXJ5TGluZS50ZXh0Q29udGVudCA9ICcnO1xuICAgIHN1bW1hcnlEZXRhaWwudGV4dENvbnRlbnQgPSAnJztcbiAgICByZXR1cm47XG4gIH1cblxuICBzdW1tYXJ5TGluZS50ZXh0Q29udGVudCA9IGxpbmVQYXJ0cy5qb2luKCcgXHUyMDIyICcpO1xuICBzdW1tYXJ5RGV0YWlsLnRleHRDb250ZW50ID0gZGV0YWlsUGFydHMuam9pbignIFx1MjAyMiAnKTtcbiAgc3VtbWFyeS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVBdHNCYWRnZShzY29yZSkge1xuICBfdXBkYXRlQXRzU3VtbWFyeShzY29yZSk7XG5cbiAgY29uc3QgYmFkZ2UgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdHMtc2NvcmUtYmFkZ2UnKTtcbiAgY29uc3QgdmFsdWVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdHMtc2NvcmUtdmFsdWUnKTtcbiAgaWYgKCFiYWRnZSB8fCAhdmFsdWVFbCkge1xuICAgIF9kaXNwYXRjaEF0c1Njb3JlVXBkYXRlZCgpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICghc2NvcmUgfHwgdHlwZW9mIHNjb3JlLm92ZXJhbGwgIT09ICdudW1iZXInKSB7XG4gICAgYmFkZ2Uuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBfZGlzcGF0Y2hBdHNTY29yZVVwZGF0ZWQoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBvdmVyYWxsID0gTWF0aC5yb3VuZChzY29yZS5vdmVyYWxsKTtcbiAgdmFsdWVFbC50ZXh0Q29udGVudCA9IGAke292ZXJhbGx9JWA7XG4gIGJhZGdlLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG5cbiAgYmFkZ2UuY2xhc3NMaXN0LnJlbW92ZSgnc2NvcmUtaGlnaCcsICdzY29yZS1tZWRpdW0nLCAnc2NvcmUtbG93Jyk7XG4gIGlmIChvdmVyYWxsID49IDc1KSB7XG4gICAgYmFkZ2UuY2xhc3NMaXN0LmFkZCgnc2NvcmUtaGlnaCcpO1xuICB9IGVsc2UgaWYgKG92ZXJhbGwgPj0gNTApIHtcbiAgICBiYWRnZS5jbGFzc0xpc3QuYWRkKCdzY29yZS1tZWRpdW0nKTtcbiAgfSBlbHNlIHtcbiAgICBiYWRnZS5jbGFzc0xpc3QuYWRkKCdzY29yZS1sb3cnKTtcbiAgfVxuXG4gIGJhZGdlLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIGBBVFMgbWF0Y2ggc2NvcmU6ICR7b3ZlcmFsbH0lICgke3Njb3JlLmJhc2lzIHx8ICdyZXZpZXcnfSlgKTtcbiAgX2Rpc3BhdGNoQXRzU2NvcmVVcGRhdGVkKCk7XG59XG5cbi8qKlxuICogRmV0Y2ggQVRTIHNjb3JlIGZyb20gYmFja2VuZCBhbmQgdXBkYXRlIGJhZGdlICsgc3RhdGVNYW5hZ2VyLlxuICogU2FmZSB0byBjYWxsIGF0IGFueSBwaGFzZSBcdTIwMTQgZG9lcyBub3RoaW5nIHdoZW4gbm8gc2Vzc2lvbi9hbmFseXNpcyBhdmFpbGFibGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFtiYXNpc10gIFwiYW5hbHlzaXNcIiB8IFwicmV2aWV3X2NoZWNrcG9pbnRcIiB8IFwicG9zdF9nZW5lcmF0aW9uXCJcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVmcmVzaEF0c1Njb3JlKGJhc2lzID0gJ3Jldmlld19jaGVja3BvaW50Jykge1xuICBjb25zdCBzZXNzaW9uSWQgPSBnbG9iYWxUaGlzLnN0YXRlTWFuYWdlcj8uZ2V0U2Vzc2lvbklkPy4oKTtcbiAgaWYgKCFzZXNzaW9uSWQpIHJldHVybjtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9jdi9hdHMtc2NvcmUnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBzZXNzaW9uX2lkOiBzZXNzaW9uSWQsIGJhc2lzIH0pLFxuICAgIH0pO1xuICAgIGlmICghcmVzLm9rKSByZXR1cm47XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEub2sgJiYgZGF0YS5hdHNfc2NvcmUpIHtcbiAgICAgIGdsb2JhbFRoaXMuc3RhdGVNYW5hZ2VyPy5zZXRBdHNTY29yZT8uKGRhdGEuYXRzX3Njb3JlKTtcbiAgICAgIHVwZGF0ZUF0c0JhZGdlKGRhdGEuYXRzX3Njb3JlKTtcbiAgICB9XG4gIH0gY2F0Y2ggKF9lKSB7XG4gICAgLy8gTm9uLWZhdGFsIFx1MjAxNCBiYWRnZSBzdGF5cyBoaWRkZW4gb3Igc2hvd3Mgc3RhbGUgdmFsdWVcbiAgfVxufVxuXG4vKiogRGVib3VuY2VkOiBkZWZlcnMgcmVmcmVzaCA2MDBtcyBhZnRlciB0aGUgbGFzdCBjYWxsLiAqL1xubGV0IF9hdHNSZWZyZXNoVGltZXIgPSBudWxsO1xuZnVuY3Rpb24gc2NoZWR1bGVBdHNSZWZyZXNoKGJhc2lzID0gJ3Jldmlld19jaGVja3BvaW50Jykge1xuICBjbGVhclRpbWVvdXQoX2F0c1JlZnJlc2hUaW1lcik7XG4gIF9hdHNSZWZyZXNoVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHJlZnJlc2hBdHNTY29yZShiYXNpcyksIDYwMCk7XG59XG5cbmZ1bmN0aW9uIF9yZWZyZXNoU3VtbWFyeUZyb21TdGF0ZSgpIHtcbiAgY29uc3Qgc2NvcmUgPSBnbG9iYWxUaGlzLnN0YXRlTWFuYWdlcj8uZ2V0QXRzU2NvcmU/LigpO1xuICBpZiAoc2NvcmUgJiYgdHlwZW9mIHNjb3JlLm92ZXJhbGwgPT09ICdudW1iZXInKSB7XG4gICAgX3VwZGF0ZUF0c1N1bW1hcnkoc2NvcmUpO1xuICB9XG59XG5cbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignY3ZidWlsZGVyOmdlbmVyYXRpb24tc3RhdGUtY2hhbmdlZCcsICgpID0+IHtcbiAgICBfcmVmcmVzaFN1bW1hcnlGcm9tU3RhdGUoKTtcbiAgfSk7XG59XG5cbmlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gIGNvbnN0IHBvc2l0aW9uVGl0bGVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwb3NpdGlvbi10aXRsZScpO1xuICBpZiAocG9zaXRpb25UaXRsZUVsICYmIHR5cGVvZiBNdXRhdGlvbk9ic2VydmVyICE9PSAndW5kZWZpbmVkJykge1xuICAgIGNvbnN0IHRpdGxlT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7XG4gICAgICBfcmVmcmVzaFN1bW1hcnlGcm9tU3RhdGUoKTtcbiAgICB9KTtcbiAgICB0aXRsZU9ic2VydmVyLm9ic2VydmUocG9zaXRpb25UaXRsZUVsLCB7XG4gICAgICBjaGlsZExpc3Q6IHRydWUsXG4gICAgICBjaGFyYWN0ZXJEYXRhOiB0cnVlLFxuICAgICAgc3VidHJlZTogdHJ1ZSxcbiAgICB9KTtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgRVMgbW9kdWxlIGV4cG9ydHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5leHBvcnQgeyB1cGRhdGVBdHNCYWRnZSwgcmVmcmVzaEF0c1Njb3JlLCBzY2hlZHVsZUF0c1JlZnJlc2gsIGZvcm1hdEF0c1Njb3JlU3VtbWFyeSB9O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvbWVzc2FnZS1xdWV1ZS5qc1xuICogQ29udmVyc2F0aW9uIG1lc3NhZ2UgYXBwZW5kaW5nLCBsb2FkaW5nIG1lc3NhZ2VzLCBhbmQgdGhlIHByZS1ET00gYnVmZmVyXG4gKiBxdWV1ZSB0aGF0IGhvbGRzIG1lc3NhZ2VzIGVtaXR0ZWQgYmVmb3JlICNjb252ZXJzYXRpb24gZXhpc3RzLlxuICpcbiAqIERFUEVOREVOQ0lFUzpcbiAqICAgLSBjbGVhbkpzb25SZXNwb25zZSwgZXNjYXBlSHRtbCBmcm9tIHV0aWxzLmpzXG4gKiAgIC0gc2VuZE1lc3NhZ2UgZnJvbSBtZXNzYWdlLWRpc3BhdGNoLmpzIChvbiBnbG9iYWxUaGlzLCBmb3IgaW5saW5lIGJ1dHRvbnMpXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgY2xlYW5Kc29uUmVzcG9uc2UsIGVzY2FwZUh0bWwgfSBmcm9tICcuL3V0aWxzLmpzJztcbmNvbnN0IGxvZyA9IGdldExvZ2dlcignbWVzc2FnZS1xdWV1ZScpO1xuXG4vLyBCdWZmZXIgZm9yIG1lc3NhZ2VzIGVtaXR0ZWQgYmVmb3JlIHRoZSAjY29udmVyc2F0aW9uIGRpdiBleGlzdHMuXG4vLyBGbHVzaGVkIGF0IHRoZSBzdGFydCBvZiBpbml0KCkgb25jZSB0aGUgRE9NIGlzIGZ1bGx5IHJlYWR5LlxuY29uc3QgX21lc3NhZ2VRdWV1ZSA9IFtdO1xuXG5mdW5jdGlvbiBfZmx1c2hNZXNzYWdlUXVldWUoKSB7XG4gIHdoaWxlIChfbWVzc2FnZVF1ZXVlLmxlbmd0aCkge1xuICAgIGNvbnN0IHsgdHlwZSwgdGV4dCB9ID0gX21lc3NhZ2VRdWV1ZS5zaGlmdCgpO1xuICAgIGFwcGVuZE1lc3NhZ2UodHlwZSwgdGV4dCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYXBwZW5kTG9hZGluZ01lc3NhZ2UodGV4dCkge1xuICBjb25zdCBjb252ZXJzYXRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udmVyc2F0aW9uJyk7XG4gIGNvbnN0IG1lc3NhZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgbWVzc2FnZS5jbGFzc05hbWUgPSAnbWVzc2FnZSBzeXN0ZW0nO1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGNvbnRlbnQuY2xhc3NOYW1lID0gJ2NvbnRlbnQgbG9hZGluZy1tZXNzYWdlJztcbiAgY29udGVudC5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz1cImxvYWRpbmctc3Bpbm5lclwiPjwvZGl2PjxzcGFuPiR7dGV4dH08L3NwYW4+YDtcbiAgbWVzc2FnZS5hcHBlbmRDaGlsZChjb250ZW50KTtcbiAgY29udmVyc2F0aW9uLmFwcGVuZENoaWxkKG1lc3NhZ2UpO1xuICBjb252ZXJzYXRpb24uc2Nyb2xsVG9wID0gY29udmVyc2F0aW9uLnNjcm9sbEhlaWdodDtcbiAgcmV0dXJuIG1lc3NhZ2U7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUxvYWRpbmdNZXNzYWdlKG1lc3NhZ2VFbGVtZW50KSB7XG4gIGlmIChtZXNzYWdlRWxlbWVudCAmJiBtZXNzYWdlRWxlbWVudC5wYXJlbnROb2RlKSB7XG4gICAgbWVzc2FnZUVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChtZXNzYWdlRWxlbWVudCk7XG4gIH1cbn1cblxuLyoqIFJlc3RvcmVzIGEgcHJldmlvdXNseS1zYXZlZCBtZXNzYWdlIHdob3NlIGNvbnRlbnQgaXMgYWxyZWFkeSBIVE1MIChzYXZlZCB2aWEgaW5uZXJIVE1MKS4gKi9cbmZ1bmN0aW9uIGFwcGVuZE1lc3NhZ2VIdG1sKHR5cGUsIGh0bWwpIHtcbiAgY29uc3QgY29udmVyc2F0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbnZlcnNhdGlvbicpO1xuICBjb25zdCBtZXNzYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIG1lc3NhZ2UuY2xhc3NOYW1lID0gYG1lc3NhZ2UgJHt0eXBlfWA7XG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgY29udGVudC5jbGFzc05hbWUgPSAnY29udGVudCc7XG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gaHRtbDtcbiAgbWVzc2FnZS5hcHBlbmRDaGlsZChjb250ZW50KTtcbiAgY29udmVyc2F0aW9uLmFwcGVuZENoaWxkKG1lc3NhZ2UpO1xuICBjb252ZXJzYXRpb24uc2Nyb2xsVG9wID0gY29udmVyc2F0aW9uLnNjcm9sbEhlaWdodDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDb2xsYXBzaWJsZSBsb25nLWNvbnRlbnQgaGVscGVyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY29uc3QgQ09MTEFQU0VfTElORV9USFJFU0hPTEQgPSA4OyAgLy8gbGluZXMgYmVmb3JlIGNvbGxhcHNpbmdcbmNvbnN0IENPTExBUFNFX0NIQVJfVEhSRVNIT0xEID0gNDgwOyAvLyBjaGFycyBiZWZvcmUgY29sbGFwc2luZ1xuXG4vKipcbiAqIFdyYXAgcmVuZGVyZWQgSFRNTCBpbiBhIGNvbGxhcHNpYmxlIGNvbnRhaW5lciB3aGVuIHRoZSBjb250ZW50IGV4Y2VlZHMgdGhlXG4gKiB0aHJlc2hvbGQsIHNob3dpbmcgdGhlIGZpcnN0IGZldyBsaW5lcyB3aXRoIGEgdG9nZ2xlIGJ1dHRvbi5cbiAqL1xuZnVuY3Rpb24gX21ha2VDb2xsYXBzaWJsZUNvbnRlbnQoaHRtbCwgdGV4dFN0cikge1xuICBjb25zdCBsaW5lcyA9IHRleHRTdHIuc3BsaXQoJ1xcbicpO1xuICBpZiAobGluZXMubGVuZ3RoIDw9IENPTExBUFNFX0xJTkVfVEhSRVNIT0xEICYmIHRleHRTdHIubGVuZ3RoIDw9IENPTExBUFNFX0NIQVJfVEhSRVNIT0xEKSB7XG4gICAgcmV0dXJuIHsgaHRtbCwgY29sbGFwc2libGU6IGZhbHNlIH07XG4gIH1cblxuICAvLyBCdWlsZCBwcmV2aWV3OiBmaXJzdCBDT0xMQVBTRV9MSU5FX1RIUkVTSE9MRCBsaW5lcyB3b3J0aCBvZiBlc2NhcGVkIHRleHRcbiAgY29uc3QgcHJldmlld0xpbmVzID0gbGluZXMuc2xpY2UoMCwgQ09MTEFQU0VfTElORV9USFJFU0hPTEQpO1xuICBjb25zdCBwcmV2aWV3SHRtbCA9IGVzY2FwZUh0bWwocHJldmlld0xpbmVzLmpvaW4oJ1xcbicpKVxuICAgIC5yZXBsYWNlKC9cXCpcXCooLis/KVxcKlxcKi9nLCAnPHN0cm9uZz4kMTwvc3Ryb25nPicpXG4gICAgLnJlcGxhY2UoL1xcKiguKz8pXFwqL2csICc8ZW0+JDE8L2VtPicpXG4gICAgLnJlcGxhY2UoL2AoW15gXSspYC9nLCAnPGNvZGU+JDE8L2NvZGU+JylcbiAgICAucmVwbGFjZSgvXFxuL2csICc8YnI+Jyk7XG5cbiAgY29uc3Qgb3ZlcmZsb3cgPSBsaW5lcy5sZW5ndGggLSBDT0xMQVBTRV9MSU5FX1RIUkVTSE9MRDtcbiAgY29uc3QgaWQgPSBgY29sbGFwc2libGUtJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDcpfWA7XG5cbiAgY29uc3Qgd3JhcHBlZCA9IGBcbiAgICA8ZGl2IGNsYXNzPVwibXNnLXByZXZpZXdcIiBpZD1cIiR7aWR9LXByZXZpZXdcIj4ke3ByZXZpZXdIdG1sfTwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJtc2ctZnVsbFwiIGlkPVwiJHtpZH0tZnVsbFwiIHN0eWxlPVwiZGlzcGxheTpub25lXCI+JHtodG1sfTwvZGl2PlxuICAgIDxidXR0b24gY2xhc3M9XCJtc2ctdG9nZ2xlLWJ0blwiIG9uY2xpY2s9XCIoZnVuY3Rpb24oYnRuKXtcbiAgICAgIHZhciBwPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCcke2lkfS1wcmV2aWV3JyksXG4gICAgICAgICAgZj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnJHtpZH0tZnVsbCcpO1xuICAgICAgaWYoZi5zdHlsZS5kaXNwbGF5PT09J25vbmUnKXtcbiAgICAgICAgcC5zdHlsZS5kaXNwbGF5PSdub25lJzsgZi5zdHlsZS5kaXNwbGF5PSdibG9jayc7IGJ0bi50ZXh0Q29udGVudD0nU2hvdyBsZXNzJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHAuc3R5bGUuZGlzcGxheT0nJzsgZi5zdHlsZS5kaXNwbGF5PSdub25lJzsgYnRuLnRleHRDb250ZW50PSdTaG93ICR7b3ZlcmZsb3d9IG1vcmUgbGluZSR7b3ZlcmZsb3cgPT09IDEgPyAnJyA6ICdzJ31cdTIwMjYnO1xuICAgICAgfVxuICAgIH0pKHRoaXMpXCIgdHlwZT1cImJ1dHRvblwiPlNob3cgJHtvdmVyZmxvd30gbW9yZSBsaW5lJHtvdmVyZmxvdyA9PT0gMSA/ICcnIDogJ3MnfVx1MjAyNjwvYnV0dG9uPmA7XG5cbiAgcmV0dXJuIHsgaHRtbDogd3JhcHBlZCwgY29sbGFwc2libGU6IHRydWUgfTtcbn1cblxuZnVuY3Rpb24gYXBwZW5kTWVzc2FnZSh0eXBlLCB0ZXh0KSB7XG4gIGNvbnN0IGNvbnZlcnNhdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb252ZXJzYXRpb24nKTtcbiAgaWYgKCFjb252ZXJzYXRpb24pIHtcbiAgICAvLyBET00gbm90IHJlYWR5IHlldCBcdTIwMTQgYnVmZmVyIHVudGlsIF9mbHVzaE1lc3NhZ2VRdWV1ZSgpIGlzIGNhbGxlZCBmcm9tIGluaXQoKVxuICAgIF9tZXNzYWdlUXVldWUucHVzaCh7IHR5cGUsIHRleHQgfSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgbWVzc2FnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBtZXNzYWdlLmNsYXNzTmFtZSA9IGBtZXNzYWdlICR7dHlwZX1gO1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGNvbnRlbnQuY2xhc3NOYW1lID0gJ2NvbnRlbnQnO1xuXG4gIC8vIFNpbXBsZSBtYXJrZG93biByZW5kZXJpbmc6IGNvbnZlcnQgKip0ZXh0KiogdG8gPHN0cm9uZz4gYW5kIHByZXNlcnZlIG5ld2xpbmVzXG4gIGNvbnN0IHRleHRTdHIgPSB0eXBlb2YgdGV4dCA9PT0gJ3N0cmluZycgPyB0ZXh0IDogSlNPTi5zdHJpbmdpZnkodGV4dCwgbnVsbCwgMik7XG4gIGNvbnN0IHJlbmRlcmVkSHRtbCA9IGVzY2FwZUh0bWwodGV4dFN0cilcbiAgICAucmVwbGFjZSgvXFwqXFwqKC4rPylcXCpcXCovZywgJzxzdHJvbmc+JDE8L3N0cm9uZz4nKVxuICAgIC5yZXBsYWNlKC9cXCooLis/KVxcKi9nLCAnPGVtPiQxPC9lbT4nKVxuICAgIC5yZXBsYWNlKC9gKFteYF0rKWAvZywgJzxjb2RlPiQxPC9jb2RlPicpXG4gICAgLnJlcGxhY2UoL1xcbi9nLCAnPGJyPicpO1xuXG4gIC8vIEFwcGx5IGNvbGxhcHNpYmxlIHdyYXBwZXIgZm9yIGxvbmcgdXNlci9hc3Npc3RhbnQgbWVzc2FnZXNcbiAgaWYgKHR5cGUgPT09ICd1c2VyJyB8fCB0eXBlID09PSAnYXNzaXN0YW50Jykge1xuICAgIGNvbnN0IHsgaHRtbCwgY29sbGFwc2libGUgfSA9IF9tYWtlQ29sbGFwc2libGVDb250ZW50KHJlbmRlcmVkSHRtbCwgdGV4dFN0cik7XG4gICAgY29udGVudC5pbm5lckhUTUwgPSBodG1sO1xuICAgIGlmIChjb2xsYXBzaWJsZSkgY29udGVudC5jbGFzc0xpc3QuYWRkKCdjb2xsYXBzaWJsZS1tc2cnKTtcbiAgfSBlbHNlIHtcbiAgICBjb250ZW50LmlubmVySFRNTCA9IHJlbmRlcmVkSHRtbDtcbiAgfVxuICBtZXNzYWdlLmFwcGVuZENoaWxkKGNvbnRlbnQpO1xuXG4gIC8vIENoZWNrIGlmIG1lc3NhZ2UgZW5kcyB3aXRoIHJlc3BvbnNlIG9wdGlvbnMgbGlrZSAoeWVzL25vL21heWJlKVxuICBjb25zdCBvcHRpb25zTWF0Y2ggPSB0ZXh0U3RyLm1hdGNoKC9cXCgoW14pXStcXC9bXildKylcXClcXHMqJC8pO1xuICBpZiAob3B0aW9uc01hdGNoICYmIHR5cGUgPT09ICdhc3Npc3RhbnQnKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IG9wdGlvbnNNYXRjaFsxXS5zcGxpdCgnLycpLm1hcChvcHQgPT4gb3B0LnRyaW0oKSk7XG4gICAgY29uc3QgYnV0dG9uQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgYnV0dG9uQ29udGFpbmVyLnN0eWxlLmNzc1RleHQgPSAnbWFyZ2luLXRvcDogMTJweDsgZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IGZsZXgtd3JhcDogd3JhcDsnO1xuICAgIG9wdGlvbnMuZm9yRWFjaChvcHRpb24gPT4ge1xuICAgICAgY29uc3QgYnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgICBidG4udGV4dENvbnRlbnQgPSBvcHRpb247XG4gICAgICBidG4uY2xhc3NOYW1lID0gJ2FjdGlvbi1idG4nO1xuICAgICAgYnRuLnN0eWxlLmNzc1RleHQgPSAncGFkZGluZzogOHB4IDE2cHg7IGJhY2tncm91bmQ6ICMzYjgyZjY7IGNvbG9yOiB3aGl0ZTsgYm9yZGVyOiBub25lOyBib3JkZXItcmFkaXVzOiA2cHg7IGN1cnNvcjogcG9pbnRlcjsnO1xuICAgICAgYnRuLm9uY2xpY2sgPSAoKSA9PiB7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZXNzYWdlLWlucHV0JykudmFsdWUgPSBvcHRpb247XG4gICAgICAgIGlmICh0eXBlb2Ygc2VuZE1lc3NhZ2UgPT09ICdmdW5jdGlvbicpIHNlbmRNZXNzYWdlKCk7XG4gICAgICB9O1xuICAgICAgYnV0dG9uQ29udGFpbmVyLmFwcGVuZENoaWxkKGJ0bik7XG4gICAgfSk7XG4gICAgbWVzc2FnZS5hcHBlbmRDaGlsZChidXR0b25Db250YWluZXIpO1xuICB9XG5cbiAgY29udmVyc2F0aW9uLmFwcGVuZENoaWxkKG1lc3NhZ2UpO1xuICBjb252ZXJzYXRpb24uc2Nyb2xsVG9wID0gY29udmVyc2F0aW9uLnNjcm9sbEhlaWdodDtcbiAgcmV0dXJuIG1lc3NhZ2U7XG59XG5cbi8qKlxuICogQXBwZW5kcyBhIHN5c3RlbSBlcnJvciBtZXNzYWdlIHdpdGggYW4gb3B0aW9uYWwgUmV0cnkgYnV0dG9uLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgdGV4dCAgICAgICAtIEVycm9yIG1lc3NhZ2UgdGV4dCAoc3VwcG9ydHMgKipib2xkKiogbWFya2Rvd24pXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcmV0cnlGbl0gIC0gQ2FsbGVkIHdoZW4gUmV0cnkgaXMgY2xpY2tlZDsgb21pdCBmb3Igbm9uLXJldHJ5YWJsZSBlcnJvcnNcbiAqIEBwYXJhbSB7c3RyaW5nfSAgIFtyZXRyeUxhYmVsXSAtIFJldHJ5IGJ1dHRvbiBsYWJlbCAoZGVmYXVsdCAnUmV0cnknKVxuICovXG5mdW5jdGlvbiBhcHBlbmRSZXRyeU1lc3NhZ2UodGV4dCwgcmV0cnlGbiwgcmV0cnlMYWJlbCA9ICdSZXRyeScsIGNhbmNlbEZuID0gbnVsbCkge1xuICBjb25zdCBjb252ZXJzYXRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udmVyc2F0aW9uJyk7XG4gIGNvbnN0IG1lc3NhZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgbWVzc2FnZS5jbGFzc05hbWUgPSAnbWVzc2FnZSBzeXN0ZW0nO1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGNvbnRlbnQuY2xhc3NOYW1lID0gJ2NvbnRlbnQnO1xuICBjb25zdCBlc2NhcGVkID0gZXNjYXBlSHRtbCh0ZXh0KTtcbiAgY29udGVudC5pbm5lckhUTUwgPSBlc2NhcGVkXG4gICAgLnJlcGxhY2UoL1xcKlxcKiguKz8pXFwqXFwqL2csICc8c3Ryb25nPiQxPC9zdHJvbmc+JylcbiAgICAucmVwbGFjZSgvXFxuL2csICc8YnI+Jyk7XG4gIG1lc3NhZ2UuYXBwZW5kQ2hpbGQoY29udGVudCk7XG4gIGlmICh0eXBlb2YgcmV0cnlGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgIGJ0bi50ZXh0Q29udGVudCA9IHJldHJ5TGFiZWw7XG4gICAgYnRuLnN0eWxlLmNzc1RleHQgPSAnbWFyZ2luLXRvcDo4cHg7cGFkZGluZzo2cHggMTRweDtiYWNrZ3JvdW5kOiMzYjgyZjY7Y29sb3I6I2ZmZjtib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjZweDtjdXJzb3I6cG9pbnRlcjtmb250LXNpemU6MC44NXJlbTtkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW4tcmlnaHQ6OHB4Oyc7XG4gICAgYnRuLm9uY2xpY2sgPSAoKSA9PiB7IG1lc3NhZ2UucmVtb3ZlKCk7IHJldHJ5Rm4oKTsgfTtcbiAgICBtZXNzYWdlLmFwcGVuZENoaWxkKGJ0bik7XG4gIH1cbiAgaWYgKHR5cGVvZiBjYW5jZWxGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnN0IGNhbmNlbEJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgIGNhbmNlbEJ0bi50ZXh0Q29udGVudCA9ICdTdG9wIHJldHJpZXMnO1xuICAgIGNhbmNlbEJ0bi5zdHlsZS5jc3NUZXh0ID0gJ21hcmdpbi10b3A6OHB4O3BhZGRpbmc6NnB4IDE0cHg7YmFja2dyb3VuZDojNmI3MjgwO2NvbG9yOiNmZmY7Ym9yZGVyOm5vbmU7Ym9yZGVyLXJhZGl1czo2cHg7Y3Vyc29yOnBvaW50ZXI7Zm9udC1zaXplOjAuODVyZW07ZGlzcGxheTppbmxpbmUtYmxvY2s7JztcbiAgICBjYW5jZWxCdG4ub25jbGljayA9ICgpID0+IHsgbWVzc2FnZS5yZW1vdmUoKTsgY2FuY2VsRm4oKTsgfTtcbiAgICBtZXNzYWdlLmFwcGVuZENoaWxkKGNhbmNlbEJ0bik7XG4gIH1cbiAgY29udmVyc2F0aW9uLmFwcGVuZENoaWxkKG1lc3NhZ2UpO1xuICBjb252ZXJzYXRpb24uc2Nyb2xsVG9wID0gY29udmVyc2F0aW9uLnNjcm9sbEhlaWdodDtcbiAgcmV0dXJuIG1lc3NhZ2U7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZEZvcm1hdHRlZEFuYWx5c2lzKHJlc3VsdCkge1xuICB0cnkge1xuICAgIGNvbnN0IGNsZWFuUmVzdWx0ID0gY2xlYW5Kc29uUmVzcG9uc2UocmVzdWx0KTtcbiAgICBjb25zdCBkYXRhID0gdHlwZW9mIGNsZWFuUmVzdWx0ID09PSAnc3RyaW5nJyA/IEpTT04ucGFyc2UoY2xlYW5SZXN1bHQpIDogY2xlYW5SZXN1bHQ7XG5cbiAgICBpZiAoZGF0YSAmJiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiYgKGRhdGEudGl0bGUgfHwgZGF0YS5yZXF1aXJlZF9za2lsbHMpKSB7XG4gICAgICBjb25zdCBjb252ZXJzYXRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udmVyc2F0aW9uJyk7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBtZXNzYWdlLmNsYXNzTmFtZSA9ICdtZXNzYWdlIGFzc2lzdGFudCc7XG4gICAgICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBjb250ZW50LmNsYXNzTmFtZSA9ICdjb250ZW50IGpvYi1hbmFseXNpcyc7XG5cbiAgICAgIGxldCBodG1sID0gJzxoMz5cdUQ4M0RcdURDQ0IgSm9iIEFuYWx5c2lzIENvbXBsZXRlPC9oMz4nO1xuICAgICAgaWYgKGRhdGEudGl0bGUpICBodG1sICs9IGA8cD48c3Ryb25nPlBvc2l0aW9uOjwvc3Ryb25nPiAke2RhdGEudGl0bGV9IGF0ICR7ZGF0YS5jb21wYW55IHx8ICdDb21wYW55J308L3A+YDtcbiAgICAgIGlmIChkYXRhLmRvbWFpbikgaHRtbCArPSBgPHA+PHN0cm9uZz5Eb21haW46PC9zdHJvbmc+ICR7ZGF0YS5kb21haW59PC9wPmA7XG5cbiAgICAgIGlmIChkYXRhLnJlcXVpcmVkX3NraWxscz8ubGVuZ3RoKSB7XG4gICAgICAgIGh0bWwgKz0gJzxoND5cdUQ4M0NcdURGQUYgUmVxdWlyZWQgU2tpbGxzOjwvaDQ+PHVsPic7XG4gICAgICAgIGRhdGEucmVxdWlyZWRfc2tpbGxzLmZvckVhY2gocyA9PiB7IGh0bWwgKz0gYDxsaT4ke3N9PC9saT5gOyB9KTtcbiAgICAgICAgaHRtbCArPSAnPC91bD4nO1xuICAgICAgfVxuICAgICAgaWYgKGRhdGEucHJlZmVycmVkX3NraWxscz8ubGVuZ3RoKSB7XG4gICAgICAgIGh0bWwgKz0gJzxoND5cdTJCNTAgUHJlZmVycmVkIFNraWxsczo8L2g0Pjx1bD4nO1xuICAgICAgICBkYXRhLnByZWZlcnJlZF9za2lsbHMuZm9yRWFjaChzID0+IHsgaHRtbCArPSBgPGxpPiR7c308L2xpPmA7IH0pO1xuICAgICAgICBodG1sICs9ICc8L3VsPic7XG4gICAgICB9XG4gICAgICBpZiAoZGF0YS5uaWNlX3RvX2hhdmVfcmVxdWlyZW1lbnRzPy5sZW5ndGgpIHtcbiAgICAgICAgaHRtbCArPSAnPGg0Plx1MjcyOCBOaWNlIHRvIEhhdmU6PC9oND48dWw+JztcbiAgICAgICAgZGF0YS5uaWNlX3RvX2hhdmVfcmVxdWlyZW1lbnRzLmZvckVhY2gociA9PiB7IGh0bWwgKz0gYDxsaT4ke3J9PC9saT5gOyB9KTtcbiAgICAgICAgaHRtbCArPSAnPC91bD4nO1xuICAgICAgfVxuICAgICAgaWYgKGRhdGEuYXRzX2tleXdvcmRzPy5sZW5ndGgpIHtcbiAgICAgICAgaHRtbCArPSAnPGg0Plx1RDgzRFx1REQxMSBBVFMgS2V5d29yZHM6PC9oND48cCBzdHlsZT1cImxpbmUtaGVpZ2h0OiAyO1wiPic7XG4gICAgICAgIGRhdGEuYXRzX2tleXdvcmRzLmZvckVhY2goa3cgPT4ge1xuICAgICAgICAgIGh0bWwgKz0gYDxzcGFuIHN0eWxlPVwiZGlzcGxheTppbmxpbmUtYmxvY2s7YmFja2dyb3VuZDojZGJlYWZlO2NvbG9yOiMxZTQwYWY7Ym9yZGVyLXJhZGl1czo0cHg7cGFkZGluZzoycHggOHB4O21hcmdpbjoycHg7Zm9udC1zaXplOjAuODVlbTtcIj4ke2t3fTwvc3Bhbj5gO1xuICAgICAgICB9KTtcbiAgICAgICAgaHRtbCArPSAnPC9wPic7XG4gICAgICB9XG5cbiAgICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgIG1lc3NhZ2UuYXBwZW5kQ2hpbGQoY29udGVudCk7XG4gICAgICBjb252ZXJzYXRpb24uYXBwZW5kQ2hpbGQobWVzc2FnZSk7XG4gICAgICBjb252ZXJzYXRpb24uc2Nyb2xsVG9wID0gY29udmVyc2F0aW9uLnNjcm9sbEhlaWdodDtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgcmVzdWx0KTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2cuZXJyb3IoJ0FuYWx5c2lzIGRpc3BsYXkgZXJyb3I6JywgZSk7XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgcmVzdWx0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhcHBlbmRGb3JtYXR0ZWRSZXNwb25zZShyZXNwb25zZSkge1xuICB0cnkge1xuICAgIGNvbnN0IGRhdGEgPSB0eXBlb2YgcmVzcG9uc2UgPT09ICdzdHJpbmcnID8gSlNPTi5wYXJzZShyZXNwb25zZSkgOiByZXNwb25zZTtcbiAgICBpZiAoZGF0YSAmJiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiYgKGRhdGEudGl0bGUgfHwgZGF0YS5yZXF1aXJlZF9za2lsbHMpKSB7XG4gICAgICBhcHBlbmRGb3JtYXR0ZWRBbmFseXNpcyhyZXNwb25zZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIHJlc3BvbnNlKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCByZXNwb25zZSk7XG4gIH1cbn1cblxuLy8gYXBwZW5kUmF3SHRtbCBpcyBuZWVkZWQgYnkgbWVzc2FnZS1kaXNwYXRjaDsgZGVmaW5lZCBoZXJlIHNpbmNlIGl0IHVzZXMgdGhlXG4vLyBjb252ZXJzYXRpb24gZWxlbWVudCBwYXR0ZXJuLlxuZnVuY3Rpb24gYXBwZW5kUmF3SHRtbChodG1sKSB7XG4gIGNvbnN0IGNvbnZlcnNhdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb252ZXJzYXRpb24nKTtcbiAgaWYgKCFjb252ZXJzYXRpb24pIHJldHVybjtcbiAgY29udmVyc2F0aW9uLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJywgaHRtbCk7XG4gIGNvbnZlcnNhdGlvbi5zY3JvbGxUb3AgPSBjb252ZXJzYXRpb24uc2Nyb2xsSGVpZ2h0O1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgRVMgbW9kdWxlIGV4cG9ydHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5leHBvcnQge1xuICBfbWVzc2FnZVF1ZXVlLCBfZmx1c2hNZXNzYWdlUXVldWUsXG4gIGFwcGVuZExvYWRpbmdNZXNzYWdlLCByZW1vdmVMb2FkaW5nTWVzc2FnZSxcbiAgYXBwZW5kTWVzc2FnZUh0bWwsIGFwcGVuZE1lc3NhZ2UsXG4gIGFwcGVuZFJldHJ5TWVzc2FnZSxcbiAgYXBwZW5kRm9ybWF0dGVkQW5hbHlzaXMsIGFwcGVuZEZvcm1hdHRlZFJlc3BvbnNlLFxuICBhcHBlbmRSYXdIdG1sLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL3Jldmlldy10YWJsZS1iYXNlLmpzXG4gKiBUYWIgc3dpdGNoaW5nLCBhbmFseXNpcyB0YWIsIGN1c3RvbWl6YXRpb24gcmVzcG9uc2UgaGFuZGxlciwgcmV2aWV3LXBhbmVcbiAqIGNvb3JkaW5hdGlvbiwgYW5kIHRoZSBwYWdlLWVzdGltYXRlIHdpZGdldC5cbiAqXG4gKiBEZXBlbmRlbmNpZXMgKGFsbCByZXNvbHZlZCB0aHJvdWdoIGdsb2JhbFRoaXMgYXQgcnVudGltZSk6XG4gKiAgIGFwcGVuZE1lc3NhZ2UsIHNhdmVUYWJEYXRhLCBjbGVhbkpzb25SZXNwb25zZSwgZXNjYXBlSHRtbCxcbiAqICAgZ2V0U3RhZ2VGb3JUYWIsIHVwZGF0ZVRhYkJhckZvclN0YWdlLCB1cGRhdGVBY3Rpb25CdXR0b25zLFxuICogICBwb3B1bGF0ZUpvYlRhYiwgcG9wdWxhdGVRdWVzdGlvbnNUYWIsIGJ1aWxkQWNoaWV2ZW1lbnRzRWRpdG9yLFxuICogICByZW5kZXJSZXdyaXRlUGFuZWwsIHBvcHVsYXRlQ1ZFZGl0b3JUYWIsXG4gKiAgIHBvcHVsYXRlRG93bmxvYWRUYWIsIHBvcHVsYXRlU3BlbGxDaGVja1RhYiwgaW5pdGlhdGVMYXlvdXRJbnN0cnVjdGlvbnMsXG4gKiAgIHBvcHVsYXRlRmluYWxpc2VUYWIsIHBvcHVsYXRlTWFzdGVyVGFiLCBwb3B1bGF0ZUNvdmVyTGV0dGVyVGFiLFxuICogICBwb3B1bGF0ZVNjcmVlbmluZ1RhYiwgZXh0cmFjdEZpcnN0SnNvbk9iamVjdCxcbiAqICAgZmV0Y2hTdGF0dXMsIGFwaUNhbGwsXG4gKiAgIGJ1aWxkRXhwZXJpZW5jZVJldmlld1RhYmxlLCBidWlsZFNraWxsc1Jldmlld1RhYmxlLFxuICogICBidWlsZEFjaGlldmVtZW50c1Jldmlld1RhYmxlLCBidWlsZFN1bW1hcnlGb2N1c1NlY3Rpb24sXG4gKiAgIGJ1aWxkUHVibGljYXRpb25zUmV2aWV3VGFibGUsIGdldEV4cGVyaWVuY2VEZXRhaWxzLFxuICogICBnZXRFeHBlcmllbmNlUmVjb21tZW5kYXRpb24sIGFjaGlldmVtZW50RGVjaXNpb25zXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdyZXZpZXctdGFibGUtYmFzZScpO1xuXG5pbXBvcnQgeyBzdGF0ZU1hbmFnZXIgfSBmcm9tICcuL3N0YXRlLW1hbmFnZXIuanMnO1xuaW1wb3J0IHsgX1NURVBfRElTUExBWSB9IGZyb20gJy4vd29ya2Zsb3ctc3RlcHMuanMnO1xuXG4vLyBcdTI1MDBcdTI1MDAgTW9kdWxlLWxldmVsIHN0YXRlIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5sZXQgdXNlclNlbGVjdGlvbnMgPSB7XG4gIGV4cGVyaWVuY2VzOiB7fSwgIC8vIGV4cF9pZCAtPiAnZW1waGFzaXplJ3wnaW5jbHVkZSd8J2RlLWVtcGhhc2l6ZSd8J2V4Y2x1ZGUnXG4gIHNraWxsczoge30gICAgICAgIC8vIHNraWxsX25hbWUgLT4gJ2VtcGhhc2l6ZSd8J2luY2x1ZGUnfCdkZS1lbXBoYXNpemUnfCdleGNsdWRlJ1xufTtcbmxldCBwYWdlRXN0aW1hdGVUaW1lciA9IG51bGw7XG5sZXQgcGFnZUVzdGltYXRlUmVxdWVzdElkID0gMDtcblxuLy8gRHJhZnQgaW5wdXQgY2FjaGUgXHUyMDEzIHByZXNlcnZlcyB1c2VyLXR5cGVkIHZhbHVlcyBhY3Jvc3MgdGFiIHN3aXRjaGVzXG5jb25zdCBfZHJhZnRJbnB1dHMgPSB7fTtcblxuZnVuY3Rpb24gX3NhdmVEcmFmdElucHV0c0ZvclRhYih0YWJOYW1lKSB7XG4gIGlmICghdGFiTmFtZSkgcmV0dXJuO1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgaWYgKCFjb250ZW50KSByZXR1cm47XG4gIGNvbnN0IHNhdmVkID0ge307XG4gIGNvbnRlbnQucXVlcnlTZWxlY3RvckFsbCgndGV4dGFyZWEsIGlucHV0LCBzZWxlY3QnKS5mb3JFYWNoKGVsID0+IHtcbiAgICBpZiAoIWVsLmlkIHx8IGVsLnR5cGUgPT09ICdmaWxlJykgcmV0dXJuO1xuICAgIHNhdmVkW2VsLmlkXSA9IChlbC50eXBlID09PSAnY2hlY2tib3gnIHx8IGVsLnR5cGUgPT09ICdyYWRpbycpID8gZWwuY2hlY2tlZCA6IGVsLnZhbHVlO1xuICB9KTtcbiAgaWYgKE9iamVjdC5rZXlzKHNhdmVkKS5sZW5ndGggPiAwKSB7XG4gICAgX2RyYWZ0SW5wdXRzW3RhYk5hbWVdID0gc2F2ZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gX3Jlc3RvcmVEcmFmdElucHV0c0ZvclRhYih0YWJOYW1lKSB7XG4gIGNvbnN0IGNhY2hlZCA9IF9kcmFmdElucHV0c1t0YWJOYW1lXTtcbiAgaWYgKCFjYWNoZWQpIHJldHVybjtcbiAgT2JqZWN0LmVudHJpZXMoY2FjaGVkKS5mb3JFYWNoKChbaWQsIHZhbHVlXSkgPT4ge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgIGlmICghZWwgfHwgZWwucmVhZE9ubHkgfHwgZWwuZGlzYWJsZWQgfHwgZWwudHlwZSA9PT0gJ2ZpbGUnKSByZXR1cm47XG4gICAgaWYgKGVsLnR5cGUgPT09ICdjaGVja2JveCcgfHwgZWwudHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgZWwuY2hlY2tlZCA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbC52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGVuc3VyZVRhYkRhdGFTdGF0ZSgpIHtcbiAgcmV0dXJuIHN0YXRlTWFuYWdlci5nZXRBbGxUYWJEYXRhKCk7XG59XG5cbmZ1bmN0aW9uIGlzUmVjb25uZWN0SW5Qcm9ncmVzcygpIHtcbiAgcmV0dXJuIHN0YXRlTWFuYWdlci5pc1JlY29ubmVjdGluZygpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgSW5jbHVzaW9uIGNvdW50cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gdXBkYXRlSW5jbHVzaW9uQ291bnRzKCkge1xuICB0cnkge1xuICAgIGNvbnN0IGV4cERlY3MgPSAod2luZG93Ll9zYXZlZERlY2lzaW9ucyAmJiB3aW5kb3cuX3NhdmVkRGVjaXNpb25zLmV4cGVyaWVuY2VfZGVjaXNpb25zKSB8fCB1c2VyU2VsZWN0aW9ucy5leHBlcmllbmNlcyB8fCB7fTtcbiAgICBjb25zdCBza2lsbERlY3MgPSAod2luZG93Ll9zYXZlZERlY2lzaW9ucyAmJiB3aW5kb3cuX3NhdmVkRGVjaXNpb25zLnNraWxsX2RlY2lzaW9ucykgfHwgdXNlclNlbGVjdGlvbnMuc2tpbGxzIHx8IHt9O1xuICAgIGNvbnN0IGFjaERlY3MgPSAod2luZG93Ll9zYXZlZERlY2lzaW9ucyAmJiB3aW5kb3cuX3NhdmVkRGVjaXNpb25zLmFjaGlldmVtZW50X2RlY2lzaW9ucykgfHwgd2luZG93LmFjaGlldmVtZW50RGVjaXNpb25zIHx8IHt9O1xuXG4gICAgY29uc3QgZXhwSW5jbHVkZWQgPSBPYmplY3QudmFsdWVzKGV4cERlY3MpLmZpbHRlcih2ID0+IHYgIT09ICdleGNsdWRlJykubGVuZ3RoO1xuICAgIGNvbnN0IHNraWxsSW5jbHVkZWQgPSBPYmplY3QudmFsdWVzKHNraWxsRGVjcykuZmlsdGVyKHYgPT4gdiAhPT0gJ2V4Y2x1ZGUnKS5sZW5ndGg7XG4gICAgY29uc3QgYWNoSW5jbHVkZWQgPSBPYmplY3QudmFsdWVzKGFjaERlY3MpLmZpbHRlcih2ID0+IHYgIT09ICdleGNsdWRlJykubGVuZ3RoO1xuXG4gICAgY29uc3QgZXhwVGFiID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYi1leHAtcmV2aWV3Jyk7XG4gICAgY29uc3Qgc2tpbGxUYWIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFiLXNraWxscy1yZXZpZXcnKTtcbiAgICBjb25zdCBhY2hUYWIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFiLWFjaGlldmVtZW50cy1yZXZpZXcnKTtcblxuICAgIGlmIChleHBUYWIpIGV4cFRhYi50ZXh0Q29udGVudCA9IGBcdUQ4M0RcdURDQ0EgRXhwZXJpZW5jZXMke2V4cEluY2x1ZGVkID8gJyAoJyArIGV4cEluY2x1ZGVkICsgJyknIDogJyd9YDtcbiAgICBpZiAoc2tpbGxUYWIpIHNraWxsVGFiLnRleHRDb250ZW50ID0gYFx1RDgzRFx1REVFMFx1RkUwRiBTa2lsbHMke3NraWxsSW5jbHVkZWQgPyAnICgnICsgc2tpbGxJbmNsdWRlZCArICcpJyA6ICcnfWA7XG4gICAgaWYgKGFjaFRhYikgYWNoVGFiLnRleHRDb250ZW50ID0gYFx1RDgzQ1x1REZDNiBBY2hpZXZlbWVudHMke2FjaEluY2x1ZGVkID8gJyAoJyArIGFjaEluY2x1ZGVkICsgJyknIDogJyd9YDtcbiAgfSBjYXRjaCAoZSkgeyBsb2cud2FybignRmFpbGVkIHRvIHVwZGF0ZSBpbmNsdXNpb24gY291bnRzOicsIGUpOyB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBHZW5lcmF0ZSBDViB0YWIgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIF9wb3B1bGF0ZUdlbmVyYXRlVGFiKGN2RGF0YSwgY29udGVudCkge1xuICBpZiAoIWN2RGF0YSB8fCAhY3ZEYXRhLmZpbGVzIHx8ICFjdkRhdGEuZmlsZXMubGVuZ3RoKSB7XG4gICAgY29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImVtcHR5LXN0YXRlXCI+PGRpdiBjbGFzcz1cImljb25cIj5cdUQ4M0RcdURDQzQ8L2Rpdj48aDM+R2VuZXJhdGVkIENWPC9oMz48cD5HZW5lcmF0ZSBDViB0byBzZWUgcHJldmlldzwvcD48L2Rpdj4nO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG1ldGEgICAgID0gY3ZEYXRhLm1ldGFkYXRhIHx8IHt9O1xuICBjb25zdCByb2xlICAgICA9IG1ldGEucm9sZSAgICAgfHwgbWV0YS5wb3NpdGlvbiB8fCAnJztcbiAgY29uc3QgY29tcGFueSAgPSBtZXRhLmNvbXBhbnkgIHx8ICcnO1xuICBjb25zdCBzdWJ0aXRsZSA9IHJvbGUgJiYgY29tcGFueSA/IGAke3JvbGV9IFx1MjAxNCAke2NvbXBhbnl9YCA6IHJvbGUgfHwgY29tcGFueSB8fCAnQ1YgZ2VuZXJhdGVkJztcblxuICBjb25zdCBJQ09OUyA9IHsgJy5wZGYnOiAnXHVEODNEXHVEQ0M0JywgJy5kb2N4JzogJ1x1RDgzRFx1RENERCcsICcuaHRtbCc6ICdcdUQ4M0NcdURGMTAnIH07XG4gIGNvbnN0IExBQkVMUyA9IHtcbiAgICAnLnBkZic6ICBmID0+IGYuaW5jbHVkZXMoJ0FUUycpID8gJ0FUUyBQREYnICA6ICdIdW1hbiBQREYnLFxuICAgICcuZG9jeCc6IGYgPT4gZi5pbmNsdWRlcygnQVRTJykgPyAnQVRTIERPQ1gnIDogZi5zdGFydHNXaXRoKCdDb3ZlckxldHRlcl8nKSA/ICdDb3ZlciBMZXR0ZXInIDogJ0h1bWFuIERPQ1gnLFxuICAgICcuaHRtbCc6ICgpID0+ICdIVE1MJyxcbiAgfTtcblxuICBjb25zdCBkb3dubG9hZGFibGVFeHRzID0gbmV3IFNldChbJy5wZGYnLCAnLmRvY3gnLCAnLmh0bWwnXSk7XG4gIGNvbnN0IGZpbGVzID0gKGN2RGF0YS5maWxlcyB8fCBbXSkuZmlsdGVyKGYgPT4ge1xuICAgIGNvbnN0IGV4dCA9IGYuc2xpY2UoZi5sYXN0SW5kZXhPZignLicpKS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiBkb3dubG9hZGFibGVFeHRzLmhhcyhleHQpICYmIGYgIT09ICdqb2JfZGVzY3JpcHRpb24udHh0JztcbiAgfSk7XG5cbiAgY29uc3Qgc2lkID0gdHlwZW9mIGdldFNlc3Npb25JZEZyb21VUkwgPT09ICdmdW5jdGlvbicgPyBnZXRTZXNzaW9uSWRGcm9tVVJMKCkgOiBudWxsO1xuICBjb25zdCBzZXNzaW9uUGFyYW0gPSBzaWQgPyBgP3Nlc3Npb25faWQ9JHtlbmNvZGVVUklDb21wb25lbnQoc2lkKX1gIDogJyc7XG5cbiAgbGV0IGZpbGVSb3dzID0gJyc7XG4gIGZvciAoY29uc3QgZiBvZiBmaWxlcykge1xuICAgIGNvbnN0IGV4dCAgID0gZi5zbGljZShmLmxhc3RJbmRleE9mKCcuJykpLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgaWNvbiAgPSBJQ09OU1tleHRdICB8fCAnXHVEODNEXHVEQ0MxJztcbiAgICBjb25zdCBsYWJlbCA9IExBQkVMU1tleHRdID8gTEFCRUxTW2V4dF0oZikgOiBmO1xuICAgIGZpbGVSb3dzICs9IGBcbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDoxMnB4O3BhZGRpbmc6MTBweCAwO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNmMWY1Zjk7XCI+XG4gICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjEuNGVtO1wiPiR7aWNvbn08L3NwYW4+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJmbGV4OjE7bWluLXdpZHRoOjA7XCI+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOiMzNzQxNTE7XCI+JHtsYWJlbH08L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuNzhlbTtjb2xvcjojOWNhM2FmO3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztcIj4ke2VzY2FwZUh0bWwoZil9PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8YSBocmVmPVwiL2FwaS9kb3dubG9hZC8ke2VuY29kZVVSSUNvbXBvbmVudChmKX0ke3Nlc3Npb25QYXJhbX1cIiBkb3dubG9hZD1cIiR7ZXNjYXBlSHRtbChmKX1cIlxuICAgICAgICAgICBjbGFzcz1cImJ0bi1zZWNvbmRhcnlcIiBzdHlsZT1cInBhZGRpbmc6NnB4IDE0cHg7Zm9udC1zaXplOjAuODVlbTt0ZXh0LWRlY29yYXRpb246bm9uZTtkaXNwbGF5OmlubGluZS1ibG9jaztcIj5Eb3dubG9hZDwvYT5cbiAgICAgIDwvZGl2PmA7XG4gIH1cblxuICBjb250ZW50LmlubmVySFRNTCA9IGBcbiAgICA8ZGl2IHN0eWxlPVwibWF4LXdpZHRoOjY0MHB4O21hcmdpbjowIGF1dG87cGFkZGluZzoyNHB4IDA7XCI+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTJweDttYXJnaW4tYm90dG9tOjI0cHg7XCI+XG4gICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjJlbTtcIj5cdTI3MDU8L3NwYW4+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGgyIHN0eWxlPVwibWFyZ2luOjA7Zm9udC1zaXplOjEuMmVtO2NvbG9yOiMxMTE4Mjc7XCI+Q1YgR2VuZXJhdGVkPC9oMj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuOWVtO2NvbG9yOiM2YjcyODA7XCI+JHtlc2NhcGVIdG1sKHN1YnRpdGxlKX08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZmY7Ym9yZGVyOjFweCBzb2xpZCAjZTJlOGYwO2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MCAxNnB4O21hcmdpbi1ib3R0b206MjRweDtcIj5cbiAgICAgICAgJHtmaWxlUm93c31cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cIm5hdi1idXR0b25zIG5hdi1lbmRcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbnRpbnVlLWJ0blwiIG9uY2xpY2s9XCJzd2l0Y2hUYWIoJ2xheW91dCcpXCI+T3BlbiBMYXlvdXQgUmV2aWV3IFx1MjE5MjwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+YDtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFRhYiBzd2l0Y2hpbmcgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8vIFRyYWNrcyB3aGljaCBjdXN0b21pc2Utc3RhZ2Ugc3ViLXRhYnMgaGF2ZSBiZWVuIHZpZXdlZCB0aGlzIHNlc3Npb24gKEdBUC0yNjkpLlxuY29uc3QgX3Zpc2l0ZWRDdXN0b21pc2VUYWJzID0gbmV3IFNldCgpO1xuY29uc3QgX0NVU1RPTUlTRV9UQUJTID0gbmV3IFNldChbJ2dvYWxzJywgJ3F1ZXN0aW9ucycsICdleHAtcmV2aWV3JywgJ2FjaC1lZGl0b3InLCAnc2tpbGxzLXJldmlldycsICdhY2hpZXZlbWVudHMtcmV2aWV3JywgJ3RhZ2xpbmUtcmV2aWV3JywgJ3N1bW1hcnktcmV2aWV3JywgJ3B1YmxpY2F0aW9ucy1yZXZpZXcnLCAnYXRzLXNjb3JlJ10pO1xuXG5mdW5jdGlvbiBfdXBkYXRlVmlzaXRlZFRhYkluZGljYXRvcnMoKSB7XG4gIF92aXNpdGVkQ3VzdG9taXNlVGFicy5mb3JFYWNoKG5hbWUgPT4ge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHRhYi0ke25hbWV9YCk7XG4gICAgaWYgKGVsKSBlbC5jbGFzc0xpc3QuYWRkKCd0YWItLXZpc2l0ZWQnKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHN3aXRjaFRhYih0YWIpIHtcbiAgLy8gQ2xlYXIga2V5Ym9hcmQtZm9jdXNlZCBjYXJkIHN0YXRlIHdoZW4gbGVhdmluZyBhIHJldmlldyB0YWJcbiAgaWYgKHR5cGVvZiByZXNldENhcmRGb2N1cyA9PT0gJ2Z1bmN0aW9uJykgcmVzZXRDYXJkRm9jdXMoKTtcblxuICAvLyBTYXZlIHVuc2F2ZWQgdXNlciBpbnB1dCBmcm9tIHRoZSB0YWIgd2UgYXJlIGxlYXZpbmdcbiAgX3NhdmVEcmFmdElucHV0c0ZvclRhYihzdGF0ZU1hbmFnZXIuZ2V0Q3VycmVudFRhYigpKTtcblxuICAvLyBTeW5jIHNlY29uZC1iYXIgdmlzaWJpbGl0eSB0byB0aGlzIHRhYidzIHN0YWdlXG4gIGxldCBfc3dpdGNoVGFiU3RhZ2UgPSBudWxsO1xuICBpZiAodHlwZW9mIGdldFN0YWdlRm9yVGFiID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB1cGRhdGVUYWJCYXJGb3JTdGFnZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIF9zd2l0Y2hUYWJTdGFnZSA9IGdldFN0YWdlRm9yVGFiKHRhYik7XG4gICAgaWYgKF9zd2l0Y2hUYWJTdGFnZSkge1xuICAgICAgdXBkYXRlVGFiQmFyRm9yU3RhZ2UoX3N3aXRjaFRhYlN0YWdlKTtcbiAgICAgIHVwZGF0ZUFjdGlvbkJ1dHRvbnMoX3N3aXRjaFRhYlN0YWdlKTtcbiAgICB9XG4gIH1cbiAgLy8gQWx3YXlzIHVwZGF0ZSB3b3JrZmxvdyBjbGlja2FibGUgc3RhdGUgdXNpbmcgY3VycmVudCBwaGFzZVxuICBpZiAodHlwZW9mIHN0YXRlTWFuYWdlcj8uZ2V0UGhhc2UgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHVwZGF0ZVdvcmtmbG93U3RlcHNDbGlja2FibGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICB1cGRhdGVXb3JrZmxvd1N0ZXBzQ2xpY2thYmxlKHN0YXRlTWFuYWdlci5nZXRQaGFzZSgpKTtcbiAgfVxuXG4gIC8vIEdBUC0xNiBQYXJ0IEI6IHNob3cvaGlkZSBhbmQgKHJlKXJlbmRlciB0aGUgZWFybHkgQ1YgcHJldmlldyBwYW5lbCBmb3JcbiAgLy8gdGhpcyB0YWIuIHRvZ2dsZUVhcmx5UHJldmlld1BhbmVsJ3Mgb3duIGluLXNjb3BlIGNoZWNrIGRlY2lkZXMgdmlzaWJpbGl0eS5cbiAgaWYgKHR5cGVvZiB0b2dnbGVFYXJseVByZXZpZXdQYW5lbCA9PT0gJ2Z1bmN0aW9uJykgdG9nZ2xlRWFybHlQcmV2aWV3UGFuZWwodGFiKTtcblxuICAvLyBVcGRhdGUgYWN0aXZlIHRhYiwgQVJJQSBzdGF0ZSwgYW5kIHJvdmluZyB0YWJpbmRleCAoV0NBRyAyLjEgdGFibGlzdCBwYXR0ZXJuKVxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudGFiJykuZm9yRWFjaCh0ID0+IHtcbiAgICB0LmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgIHQuc2V0QXR0cmlidXRlKCdhcmlhLXNlbGVjdGVkJywgJ2ZhbHNlJyk7XG4gICAgdC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJy0xJyk7XG4gIH0pO1xuICBjb25zdCBhY3RpdmVUYWIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgdGFiLSR7dGFifWApO1xuICBpZiAoYWN0aXZlVGFiKSB7XG4gICAgYWN0aXZlVGFiLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgIGFjdGl2ZVRhYi5zZXRBdHRyaWJ1dGUoJ2FyaWEtc2VsZWN0ZWQnLCAndHJ1ZScpO1xuICAgIGFjdGl2ZVRhYi5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTtcbiAgICBjb25zdCB0YWJwYW5lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gICAgaWYgKHRhYnBhbmVsKSB0YWJwYW5lbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWxsZWRieScsIGB0YWItJHt0YWJ9YCk7XG4gIH1cbiAgc3RhdGVNYW5hZ2VyLnNldEN1cnJlbnRUYWIodGFiKTtcblxuICAvLyBNYXJrIHRoaXMgdGFiIGFzIHZpc2l0ZWQgYW5kIHJlZnJlc2ggdGhlIHZpc2l0ZWQgaW5kaWNhdG9ycyAoR0FQLTI2OSlcbiAgaWYgKF9DVVNUT01JU0VfVEFCUy5oYXModGFiKSkge1xuICAgIF92aXNpdGVkQ3VzdG9taXNlVGFicy5hZGQodGFiKTtcbiAgICBfdXBkYXRlVmlzaXRlZFRhYkluZGljYXRvcnMoKTtcbiAgfVxuXG4gIC8vIEFubm91bmNlIHRoZSB0YWIgY2hhbmdlIHRvIHNjcmVlbiByZWFkZXJzIChHQVAtNzMpLiBDb21iaW5lZCB3aXRoIHRoZVxuICAvLyBzdGFnZSBuYW1lIChHQVAtMTYgUGFydCBBKSBpbnRvIGEgc2luZ2xlIG1lc3NhZ2UgZnJvbSB0aGlzIG9uZSBjYWxsIHNpdGVcbiAgLy8gXHUyMDE0ICN0YWItc3RhZ2UtbGFiZWwgaXMgYSB2aXNpYmxlLW9ubHkgbGFiZWwsIG5vdCBhIHNlY29uZCBsaXZlIHJlZ2lvbiwgdG9cbiAgLy8gYXZvaWQgYSBkb3VibGUtYW5ub3VuY2Ugb2YgdGhlIHNhbWUgbmF2aWdhdGlvbiBldmVudC5cbiAgY29uc3QgYW5ub3VuY2VyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3dvcmtmbG93LXN0YWdlLWFubm91bmNlcicpO1xuICBpZiAoYW5ub3VuY2VyICYmIGFjdGl2ZVRhYikge1xuICAgIGNvbnN0IHN0YWdlTGFiZWwgPSBfc3dpdGNoVGFiU3RhZ2UgPyBfU1RFUF9ESVNQTEFZW19zd2l0Y2hUYWJTdGFnZV0gOiBudWxsO1xuICAgIGNvbnN0IHRhYkxhYmVsID0gYWN0aXZlVGFiLnRleHRDb250ZW50LnRyaW0oKTtcbiAgICBjb25zdCBtZXNzYWdlID0gc3RhZ2VMYWJlbCA/IGBOb3cgdmlld2luZzogJHtzdGFnZUxhYmVsfSBcdTIwMTQgJHt0YWJMYWJlbH1gIDogYE5vdyB2aWV3aW5nOiAke3RhYkxhYmVsfWA7XG4gICAgYW5ub3VuY2VyLnRleHRDb250ZW50ID0gJyc7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7IGFubm91bmNlci50ZXh0Q29udGVudCA9IG1lc3NhZ2U7IH0sIDUwKTtcbiAgfVxuXG4gIC8vIFN5bmMgdmlldy1jdXJzb3IgcmluZyB0byB0aGUgbmV3bHkgdmlzaWJsZSB0YWJcbiAgaWYgKHR5cGVvZiBfdXBkYXRlVmlld2luZ0luZGljYXRvciA9PT0gJ2Z1bmN0aW9uJykgX3VwZGF0ZVZpZXdpbmdJbmRpY2F0b3IodGFiKTtcblxuICAvLyBBbGwgdGFicyBleGNlcHQgJ2N2JyB1c2UgZnVsbC13aWR0aCBsYXlvdXQgKG5vIHBhcGVyLXNpemVkIGNlbnRlcmluZylcbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIGNvbnRlbnQuY2xhc3NMaXN0LnRvZ2dsZSgnZnVsbC13aWR0aCcsIHRhYiAhPT0gJ2dlbmVyYXRlJyk7XG5cbiAgLy8gTG9hZCBjb250ZW50IGZvciB0YWJcbiAgbG9hZFRhYkNvbnRlbnQodGFiKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9hZFRhYkNvbnRlbnQodGFiKSB7XG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9jdW1lbnQtY29udGVudCcpO1xuICBjb25zdCB0YWJEYXRhID0gZW5zdXJlVGFiRGF0YVN0YXRlKCk7XG5cbiAgdHJ5IHtcbiAgc3dpdGNoICh0YWIpIHtcbiAgICBjYXNlICdqb2InOlxuICAgICAgYXdhaXQgcG9wdWxhdGVKb2JUYWIoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2dvYWxzJzpcbiAgICAgIGlmICh0eXBlb2YgcG9wdWxhdGVHb2Fsc1RhYiA9PT0gJ2Z1bmN0aW9uJykgYXdhaXQgcG9wdWxhdGVHb2Fsc1RhYigpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYW5hbHlzaXMnOlxuICAgICAgaWYgKHRhYkRhdGEuYW5hbHlzaXMpIHtcbiAgICAgICAgcG9wdWxhdGVBbmFseXNpc1RhYih0YWJEYXRhLmFuYWx5c2lzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJlbXB0eS1zdGF0ZVwiPjxkaXYgY2xhc3M9XCJpY29uXCI+XHVEODNEXHVERDBEPC9kaXY+PGgzPkpvYiBBbmFseXNpczwvaDM+PHA+Q2xpY2sgXCJBbmFseXplIEpvYlwiIHRvIGdlbmVyYXRlIGFuYWx5c2lzPC9wPjwvZGl2Pic7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdxdWVzdGlvbnMnOlxuICAgICAgcG9wdWxhdGVRdWVzdGlvbnNUYWIoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2N1c3RvbWl6YXRpb25zJzpcbiAgICAgIHN3aXRjaFRhYignZXhwLXJldmlldycpO1xuICAgICAgcmV0dXJuO1xuICAgIGNhc2UgJ2V4cC1yZXZpZXcnOlxuICAgICAgYXdhaXQgcG9wdWxhdGVSZXZpZXdUYWIoJ2V4cGVyaWVuY2VzJyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdhY2gtZWRpdG9yJzpcbiAgICAgIGF3YWl0IGJ1aWxkQWNoaWV2ZW1lbnRzRWRpdG9yKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdza2lsbHMtcmV2aWV3JzpcbiAgICAgIGF3YWl0IHBvcHVsYXRlUmV2aWV3VGFiKCdza2lsbHMnKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2FjaGlldmVtZW50cy1yZXZpZXcnOlxuICAgICAgYXdhaXQgcG9wdWxhdGVSZXZpZXdUYWIoJ2FjaGlldmVtZW50cycpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndGFnbGluZS1yZXZpZXcnOlxuICAgICAgYXdhaXQgcG9wdWxhdGVUYWdsaW5lUmV2aWV3VGFiKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdzdW1tYXJ5LXJldmlldyc6XG4gICAgICBhd2FpdCBwb3B1bGF0ZVJldmlld1RhYignc3VtbWFyeScpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAncHVibGljYXRpb25zLXJldmlldyc6XG4gICAgICBhd2FpdCBwb3B1bGF0ZVJldmlld1RhYigncHVibGljYXRpb25zJyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdhdHMtc2NvcmUnOlxuICAgICAgaWYgKHR5cGVvZiBwb3B1bGF0ZUF0c1Njb3JlVGFiID09PSAnZnVuY3Rpb24nKSBhd2FpdCBwb3B1bGF0ZUF0c1Njb3JlVGFiKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdyZXdyaXRlJzpcbiAgICAgIGlmICh3aW5kb3cuX3Jld3JpdGVQYW5lbENhY2hlKSB7XG4gICAgICAgIHJlbmRlclJld3JpdGVQYW5lbChcbiAgICAgICAgICB3aW5kb3cuX3Jld3JpdGVQYW5lbENhY2hlLnJld3JpdGVzLFxuICAgICAgICAgIHdpbmRvdy5fcmV3cml0ZVBhbmVsQ2FjaGUud2FybmluZ3MsXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250ZW50LmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwiZW1wdHktc3RhdGVcIj48ZGl2IGNsYXNzPVwiaWNvblwiPlx1MjcwRlx1RkUwRjwvZGl2PjxoMz5SZXdyaXRlczwvaDM+PHA+TG9hZGluZyByZXdyaXRlc1x1MjAyNjwvcD48L2Rpdj4nO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBhcGlDYWxsKCdHRVQnLCAnL2FwaS9yZXdyaXRlcycpO1xuICAgICAgICAgIGlmIChkYXRhLnJld3JpdGVzKSB7XG4gICAgICAgICAgICByZW5kZXJSZXdyaXRlUGFuZWwoZGF0YS5yZXdyaXRlcywgZGF0YS5wZXJzdWFzaW9uX3dhcm5pbmdzIHx8IFtdKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImVtcHR5LXN0YXRlXCI+PGRpdiBjbGFzcz1cImljb25cIj5cdTI3MEZcdUZFMEY8L2Rpdj48aDM+UmV3cml0ZXM8L2gzPjxwPkNvbXBsZXRlIGN1c3RvbWl6YXRpb25zIHRvIHJlYWNoIHRoaXMgc3RlcDwvcD48L2Rpdj4nO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJlbXB0eS1zdGF0ZVwiPjxkaXYgY2xhc3M9XCJpY29uXCI+XHUyNzBGXHVGRTBGPC9kaXY+PGgzPlJld3JpdGVzPC9oMz48cD5Db21wbGV0ZSBjdXN0b21pemF0aW9ucyB0byByZWFjaCB0aGlzIHN0ZXA8L3A+PC9kaXY+JztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZWRpdG9yJzpcbiAgICAgIGF3YWl0IHBvcHVsYXRlQ1ZFZGl0b3JUYWIoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2dlbmVyYXRlJzpcbiAgICAgIF9wb3B1bGF0ZUdlbmVyYXRlVGFiKHRhYkRhdGEuY3YsIGNvbnRlbnQpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZG93bmxvYWQnOlxuICAgICAgaWYgKHRhYkRhdGEuY3YgJiYgT2JqZWN0LmtleXModGFiRGF0YS5jdikubGVuZ3RoID4gMCkge1xuICAgICAgICBhd2FpdCBwb3B1bGF0ZURvd25sb2FkVGFiKHRhYkRhdGEuY3YpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImVtcHR5LXN0YXRlXCI+PGRpdiBjbGFzcz1cImljb25cIj5cdTJCMDdcdUZFMEY8L2Rpdj48aDM+RG93bmxvYWQ8L2gzPjxwPkdlbmVyYXRlIENWIHRvIGVuYWJsZSBkb3dubG9hZHM8L3A+PC9kaXY+JztcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3NwZWxsJzpcbiAgICAgIGF3YWl0IHBvcHVsYXRlU3BlbGxDaGVja1RhYigpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnbGF5b3V0JzpcbiAgICAgIGluaXRpYXRlTGF5b3V0SW5zdHJ1Y3Rpb25zKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdmaW5hbGlzZSc6XG4gICAgICBhd2FpdCBwb3B1bGF0ZUZpbmFsaXNlVGFiKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdoYXJ2ZXN0JzpcbiAgICAgIGlmICh0eXBlb2YgcG9wdWxhdGVIYXJ2ZXN0VGFiID09PSAnZnVuY3Rpb24nKSBhd2FpdCBwb3B1bGF0ZUhhcnZlc3RUYWIoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2ludGVydmlldy1wcmVwJzpcbiAgICAgIGlmICh0eXBlb2YgcG9wdWxhdGVJbnRlcnZpZXdQcmVwVGFiID09PSAnZnVuY3Rpb24nKSBhd2FpdCBwb3B1bGF0ZUludGVydmlld1ByZXBUYWIoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3RoYW5rLXlvdSc6XG4gICAgICBpZiAodHlwZW9mIHBvcHVsYXRlVGhhbmtZb3VUYWIgPT09ICdmdW5jdGlvbicpIGF3YWl0IHBvcHVsYXRlVGhhbmtZb3VUYWIoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ21hc3Rlcic6XG4gICAgICBhd2FpdCBwb3B1bGF0ZU1hc3RlclRhYigpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnY292ZXItbGV0dGVyJzpcbiAgICAgIGF3YWl0IHBvcHVsYXRlQ292ZXJMZXR0ZXJUYWIoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3NjcmVlbmluZyc6XG4gICAgICBhd2FpdCBwb3B1bGF0ZVNjcmVlbmluZ1RhYigpO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cuZXJyb3IoYEVycm9yIGxvYWRpbmcgdGFiICR7dGFifTpgLCBlcnJvcik7XG4gICAgLy8gdGV4dENvbnRlbnQsIG5vdCBpbm5lckhUTUwgXHUyMDE0IGEgdGhyb3duIGVycm9yIG1lc3NhZ2UgbXVzdCBuZXZlciBiZVxuICAgIC8vIGludGVycHJldGVkIGFzIEhUTUwgKGUuZy4gYW4gZXJyb3Igc3RyaW5nIGNvbnRhaW5pbmcgYSBzdHJheSA8aW1nPikuXG4gICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpO1xuICAgIGVycm9yTWVzc2FnZS5zdHlsZS5jc3NUZXh0ID0gJ3BhZGRpbmc6IDIwcHg7IGNvbG9yOiAjYzQxZTNhOyc7XG4gICAgZXJyb3JNZXNzYWdlLnRleHRDb250ZW50ID0gYEVycm9yIGxvYWRpbmcgY29udGVudDogJHtlcnJvci5tZXNzYWdlfWA7XG4gICAgY29udGVudC5hcHBlbmRDaGlsZChlcnJvck1lc3NhZ2UpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFJlc3RvcmUgdW5zYXZlZCB1c2VyIGlucHV0IGZvciB0aGUgbmV3bHkgbG9hZGVkIHRhYlxuICBfcmVzdG9yZURyYWZ0SW5wdXRzRm9yVGFiKHRhYik7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBSZXZpZXcgdGFiIChmbGF0LCBvbmUgcGFuZSBwZXIgdG9wLWxldmVsIHRhYikgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIHNob3dUYWJsZUJhc2VkUmV2aWV3KCkge1xuICBpZiAoIXdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zKSB7XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ05vIHJlY29tbWVuZGF0aW9ucyB0byByZXZpZXcuIFBsZWFzZSBnZW5lcmF0ZSBjdXN0b21pemF0aW9ucyBmaXJzdC4nKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBzd2l0Y2hUYWIoJ2V4cC1yZXZpZXcnKTtcbiAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ1x1MjcwNSBDdXN0b21pemF0aW9ucyBnZW5lcmF0ZWQhIFBsZWFzZSByZXZpZXcgZWFjaCBzZWN0aW9uIGluIHRoZSAqKkN1c3RvbWl6YXRpb25zKiogdGFiIFx1MjAxNCBFeHBlcmllbmNlcywgQWNoaWV2ZW1lbnRzLCBTa2lsbHMsIFN1bW1hcnksIGFuZCBQdWJsaWNhdGlvbnMuIFNlbGVjdCB5b3VyIHByZWZlcmVuY2VzIHVzaW5nIHRoZSBhY3Rpb24gYnV0dG9ucywgdGhlbiBzdWJtaXQgeW91ciBkZWNpc2lvbnMuJyk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBBbmFseXNpcyB0YWIgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8vIENhY2hlZCBzeW5vbnltIG1hcDogYWxpYXMgKGxvd2VyKSBcdTIxOTIgY2Fub25pY2FsLCBhbmQgY2Fub25pY2FsIChsb3dlcikgXHUyMTkyIFthbGlhc2VzXVxubGV0IF9zeW5vbnltTWFwQ2FjaGUgPSBudWxsO1xuYXN5bmMgZnVuY3Rpb24gX2xvYWRTeW5vbnltTWFwKCkge1xuICBpZiAoX3N5bm9ueW1NYXBDYWNoZSkgcmV0dXJuIF9zeW5vbnltTWFwQ2FjaGU7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2Vzc2lvbklkID0gc3RhdGVNYW5hZ2VyLmdldFNlc3Npb25JZCAmJiBzdGF0ZU1hbmFnZXIuZ2V0U2Vzc2lvbklkKCk7XG4gICAgY29uc3QgdXJsID0gc2Vzc2lvbklkID8gYC9hcGkvc3lub255bS1tYXA/c2Vzc2lvbl9pZD0ke2VuY29kZVVSSUNvbXBvbmVudChzZXNzaW9uSWQpfWAgOiAnL2FwaS9zeW5vbnltLW1hcCc7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgaWYgKCFyZXMub2spIHJldHVybiAoX3N5bm9ueW1NYXBDYWNoZSA9IHt9KTtcbiAgICBjb25zdCByYXcgID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBjb25zdCBhbGlhc1RvQ2Fub24gPSB7fTtcbiAgICBjb25zdCBjYW5vblRvQWxpYXNlcyA9IHt9O1xuICAgIE9iamVjdC5lbnRyaWVzKHJhdykuZm9yRWFjaCgoW2FsaWFzLCBjYW5vbl0pID0+IHtcbiAgICAgIGFsaWFzVG9DYW5vblthbGlhcy50b0xvd2VyQ2FzZSgpXSA9IGNhbm9uO1xuICAgICAgY29uc3QgY2wgPSBjYW5vbi50b0xvd2VyQ2FzZSgpO1xuICAgICAgKGNhbm9uVG9BbGlhc2VzW2NsXSA9IGNhbm9uVG9BbGlhc2VzW2NsXSB8fCBbXSkucHVzaChhbGlhcyk7XG4gICAgfSk7XG4gICAgX3N5bm9ueW1NYXBDYWNoZSA9IHsgYWxpYXNUb0Nhbm9uLCBjYW5vblRvQWxpYXNlcyB9O1xuICB9IGNhdGNoIChfKSB7IF9zeW5vbnltTWFwQ2FjaGUgPSB7fTsgfVxuICByZXR1cm4gX3N5bm9ueW1NYXBDYWNoZTtcbn1cblxuZnVuY3Rpb24gX2t3U3lub255bUFubm90YXRpb24oa3csIHN5bk1hcCkge1xuICBpZiAoIXN5bk1hcCB8fCAoIXN5bk1hcC5hbGlhc1RvQ2Fub24gJiYgIXN5bk1hcC5jYW5vblRvQWxpYXNlcykpIHJldHVybiAnJztcbiAgY29uc3Qga2wgPSBrdy50b0xvd2VyQ2FzZSgpO1xuICAvLyBJcyBrdyBhbiBhbGlhcz8gU2hvdyBjYW5vbmljYWwgZm9ybS5cbiAgaWYgKHN5bk1hcC5hbGlhc1RvQ2Fub25ba2xdKSByZXR1cm4gYCA9ICR7c3luTWFwLmFsaWFzVG9DYW5vbltrbF19YDtcbiAgLy8gSXMga3cgYSBjYW5vbmljYWwgZm9ybT8gU2hvdyBhbGlhc2VzLlxuICBjb25zdCBhbGlhc2VzID0gc3luTWFwLmNhbm9uVG9BbGlhc2VzICYmIHN5bk1hcC5jYW5vblRvQWxpYXNlc1trbF07XG4gIGlmIChhbGlhc2VzICYmIGFsaWFzZXMubGVuZ3RoKSByZXR1cm4gYCAoJHthbGlhc2VzLmpvaW4oJywgJyl9KWA7XG4gIHJldHVybiAnJztcbn1cblxuYXN5bmMgZnVuY3Rpb24gcG9wdWxhdGVBbmFseXNpc1RhYihyZXN1bHQpIHtcbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIHRyeSB7XG4gICAgLy8gcmVzdWx0IG1heSBhbHJlYWR5IGJlIGEgcGFyc2VkIG9iamVjdCAoZS5nLiBjb21pbmcgZnJvbSBzdGF0ZU1hbmFnZXIpIG9yIGFcbiAgICAvLyByYXcgSlNPTiBzdHJpbmcuICBjbGVhbkpzb25SZXNwb25zZSBvbmx5IGhhbmRsZXMgc3RyaW5ncywgc28gc2tpcCBpdCB3aGVuXG4gICAgLy8gdGhlIHZhbHVlIGlzIGFscmVhZHkgYW4gb2JqZWN0IHRvIGF2b2lkIFwiY2xlYW5lZC5yZXBsYWNlIGlzIG5vdCBhIGZ1bmN0aW9uXCIuXG4gICAgbGV0IGRhdGE7XG4gICAgaWYgKHJlc3VsdCAhPT0gbnVsbCAmJiB0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0Jykge1xuICAgICAgZGF0YSA9IHJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY2xlYW5SZXN1bHQgPSBjbGVhbkpzb25SZXNwb25zZShyZXN1bHQpO1xuICAgICAgZGF0YSA9IHR5cGVvZiBjbGVhblJlc3VsdCA9PT0gJ3N0cmluZycgPyBKU09OLnBhcnNlKGNsZWFuUmVzdWx0KSA6IGNsZWFuUmVzdWx0O1xuICAgIH1cblxuICAgIC8vIFBlcnNpc3Qgb25seSBhZnRlciB0aGUgYW5hbHlzaXMgcGF5bG9hZCBoYXMgYmVlbiB2YWxpZGF0ZWQuXG4gICAgc3RhdGVNYW5hZ2VyLnNldFRhYkRhdGEoJ2FuYWx5c2lzJywgcmVzdWx0KTtcbiAgICBzYXZlVGFiRGF0YSgpO1xuXG4gICAgLy8gXHUyNTAwXHUyNTAwIFNlY3Rpb24gMTogUm9sZSAmIERvbWFpbiBjYXJkIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIGxldCBodG1sID0gJzxkaXYgY2xhc3M9XCJhbmFseXNpcy1wYWdlXCI+JztcbiAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwiYW5hbHlzaXMtcm9sZS1jYXJkXCI+JztcbiAgICBodG1sICs9IGA8aDE+JHtkYXRhLnRpdGxlIHx8ICdSb2xlJ308L2gxPmA7XG4gICAgaWYgKGRhdGEuY29tcGFueSkgaHRtbCArPSBgPHAgY2xhc3M9XCJjb21wYW55XCI+XHVEODNDXHVERkUyICR7ZGF0YS5jb21wYW55fTwvcD5gO1xuICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJtZXRhXCI+JztcbiAgICBpZiAoZGF0YS5kb21haW4pIHtcbiAgICAgIGNvbnN0IGNvbmYgPSBkYXRhLmRvbWFpbl9jb25maWRlbmNlO1xuICAgICAgbGV0IGNvbmZMYWJlbCA9ICcnO1xuICAgICAgbGV0IGNvbmZUaXRsZSA9ICcnO1xuICAgICAgaWYgKHR5cGVvZiBjb25mID09PSAnbnVtYmVyJykge1xuICAgICAgICBpZiAoY29uZiA+PSAwLjgpIHsgY29uZkxhYmVsID0gJyc7IGNvbmZUaXRsZSA9IGBEb21haW4gY29uZmlkZW5jZTogSGlnaCAoJHtNYXRoLnJvdW5kKGNvbmYgKiAxMDApfSUpYDsgfVxuICAgICAgICBlbHNlIGlmIChjb25mID49IDAuNikgeyBjb25mTGFiZWwgPSAnIFx1MjZBMCc7IGNvbmZUaXRsZSA9IGBEb21haW4gY29uZmlkZW5jZTogTWVkaXVtICgke01hdGgucm91bmQoY29uZiAqIDEwMCl9JSkgXHUyMDE0IHZlcmlmeSB0aGlzIGlzIGNvcnJlY3RgOyB9XG4gICAgICAgIGVsc2UgeyBjb25mTGFiZWwgPSAnIFx1MjZBMCc7IGNvbmZUaXRsZSA9IGBEb21haW4gY29uZmlkZW5jZTogTG93ICgke01hdGgucm91bmQoY29uZiAqIDEwMCl9JSkgXHUyMDE0IHRoZSBKRCBzcGFucyBtdWx0aXBsZSBkb21haW5zOyBjb25zaWRlciBvdmVycmlkaW5nYDsgfVxuICAgICAgfVxuICAgICAgaHRtbCArPSBgPHNwYW4gY2xhc3M9XCJtZXRhLWNoaXBcIiB0aXRsZT1cIiR7ZXNjYXBlSHRtbChjb25mVGl0bGUgfHwgJ0luZmVycmVkIHRlY2huaWNhbCBkb21haW4nKX1cIj5cdUQ4M0RcdUREMkMgJHtlc2NhcGVIdG1sKGRhdGEuZG9tYWluKX0ke2NvbmZMYWJlbH08L3NwYW4+YDtcbiAgICB9XG4gICAgaWYgKGRhdGEucm9sZV9sZXZlbCkgaHRtbCArPSBgPHNwYW4gY2xhc3M9XCJtZXRhLWNoaXBcIj5cdUQ4M0RcdURDQ0EgJHtkYXRhLnJvbGVfbGV2ZWx9PC9zcGFuPmA7XG4gICAgaWYgKGRhdGEuc3VnZ2VzdGVkX3N1bW1hcnkpIGh0bWwgKz0gYDxzcGFuIGNsYXNzPVwibWV0YS1jaGlwXCI+XHVEODNEXHVEQ0FDICR7ZGF0YS5zdWdnZXN0ZWRfc3VtbWFyeX08L3NwYW4+YDtcbiAgICBodG1sICs9ICc8L2Rpdj48L2Rpdj4nO1xuXG4gICAgLy8gXHUyNTAwXHUyNTAwIE1pc21hdGNoIGNhbGxvdXQgKGNvbXB1dGVkIGZyb20gbWFzdGVyIHNraWxscykgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgY29uc3QgcmVxdWlyZWRTa2lsbHMgPSBBcnJheS5pc0FycmF5KGRhdGEucmVxdWlyZWRfc2tpbGxzKSA/IGRhdGEucmVxdWlyZWRfc2tpbGxzIDogW107XG4gICAgY29uc3QgbWFzdGVyU2tpbGxzID0gd2luZG93Ll9tYXN0ZXJTa2lsbHMgfHwgW107XG4gICAgaWYgKHJlcXVpcmVkU2tpbGxzLmxlbmd0aCA+IDAgJiYgbWFzdGVyU2tpbGxzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG1pc3NpbmcgPSByZXF1aXJlZFNraWxscy5maWx0ZXIoc2tpbGwgPT5cbiAgICAgICAgIW1hc3RlclNraWxscy5zb21lKG1zID0+IG1zLmluY2x1ZGVzKHNraWxsLnRvTG93ZXJDYXNlKCkpIHx8IHNraWxsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobXMpKVxuICAgICAgKTtcbiAgICAgIGlmIChtaXNzaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaHRtbCArPSBgPGRpdiBjbGFzcz1cIm1pc21hdGNoLWNhbGxvdXRcIj5cdTI2QTAgPHN0cm9uZz4ke21pc3NpbmcubGVuZ3RofSByZXF1aXJlZCBza2lsbCR7bWlzc2luZy5sZW5ndGggPiAxID8gJ3MnIDogJyd9IG5vdCBmb3VuZCBpbiB5b3VyIG1hc3RlciBDVjo8L3N0cm9uZz4gJHttaXNzaW5nLmpvaW4oJywgJyl9PC9kaXY+YDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgU2VjdGlvbiAyOiBSZXF1aXJlZCBTa2lsbHMgZ3JpZCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICBpZiAocmVxdWlyZWRTa2lsbHMubGVuZ3RoID4gMCkge1xuICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cImFuYWx5c2lzLXNlY3Rpb25cIj48aDI+XHVEODNDXHVERkFGIFJlcXVpcmVkIFNraWxsczwvaDI+PGRpdiBjbGFzcz1cInNraWxsLWdyaWRcIj4nO1xuICAgICAgcmVxdWlyZWRTa2lsbHMuZm9yRWFjaChza2lsbCA9PiB7XG4gICAgICAgIGNvbnN0IGlzTWlzc2luZyA9IG1hc3RlclNraWxscy5sZW5ndGggPiAwICYmICFtYXN0ZXJTa2lsbHMuc29tZShcbiAgICAgICAgICBtcyA9PiBtcy5pbmNsdWRlcyhza2lsbC50b0xvd2VyQ2FzZSgpKSB8fCBza2lsbC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKG1zKVxuICAgICAgICApO1xuICAgICAgICBodG1sICs9IGA8c3BhbiBjbGFzcz1cInNraWxsLWJhZGdlJHtpc01pc3NpbmcgPyAnIG1pc3NpbmcnIDogJyd9XCIgdGl0bGU9XCIke2lzTWlzc2luZyA/ICdOb3QgaW4gbWFzdGVyIENWJyA6ICdGb3VuZCBpbiBtYXN0ZXIgQ1YnfVwiPiR7c2tpbGx9JHtpc01pc3NpbmcgPyAnPHNwYW4gY2xhc3M9XCJzci1vbmx5XCI+IChub3QgaW4gbWFzdGVyIENWKTwvc3Bhbj4nIDogJyd9PC9zcGFuPmA7XG4gICAgICB9KTtcbiAgICAgIGh0bWwgKz0gJzwvZGl2PjwvZGl2Pic7XG4gICAgfVxuXG4gICAgLy8gXHUyNTAwXHUyNTAwIFNlY3Rpb24gMzogUHJlZmVycmVkIC8gTmljZS10by1IYXZlIGxpc3QgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgY29uc3QgcHJlZmVycmVkID0gW1xuICAgICAgLi4uKEFycmF5LmlzQXJyYXkoZGF0YS5wcmVmZXJyZWRfc2tpbGxzKSA/IGRhdGEucHJlZmVycmVkX3NraWxscyA6IFtdKSxcbiAgICAgIC4uLihBcnJheS5pc0FycmF5KGRhdGEubmljZV90b19oYXZlX3JlcXVpcmVtZW50cykgPyBkYXRhLm5pY2VfdG9faGF2ZV9yZXF1aXJlbWVudHMgOiBbXSksXG4gICAgXTtcbiAgICBpZiAocHJlZmVycmVkLmxlbmd0aCA+IDApIHtcbiAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJhbmFseXNpcy1zZWN0aW9uXCI+PGgyPlx1MkI1MCBQcmVmZXJyZWQgLyBOaWNlLXRvLUhhdmU8L2gyPjx1bCBjbGFzcz1cInByZWZlcnJlZC1saXN0XCI+JztcbiAgICAgIHByZWZlcnJlZC5mb3JFYWNoKGl0ZW0gPT4geyBodG1sICs9IGA8bGk+JHtpdGVtfTwvbGk+YDsgfSk7XG4gICAgICBodG1sICs9ICc8L3VsPjwvZGl2Pic7XG4gICAgfVxuXG4gICAgLy8gXHUyNTAwXHUyNTAwIFNlY3Rpb24gNDogQVRTIEtleXdvcmRzIHdpdGggcmFuayBiYWRnZXMgYW5kIHN5bm9ueW0gYW5ub3RhdGlvbnMgXHUyNTAwXHUyNTAwXG4gICAgY29uc3QgYXRzS3dzID0gQXJyYXkuaXNBcnJheShkYXRhLmF0c19rZXl3b3JkcykgPyBkYXRhLmF0c19rZXl3b3JkcyA6IFtdO1xuICAgIGlmIChhdHNLd3MubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgc3luTWFwID0gYXdhaXQgX2xvYWRTeW5vbnltTWFwKCk7XG4gICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwiYW5hbHlzaXMtc2VjdGlvblwiPjxoMj5cdUQ4M0RcdUREMTEgQVRTIEtleXdvcmRzIDxzbWFsbCBzdHlsZT1cImZvbnQtd2VpZ2h0OjQwMDtjb2xvcjojNjQ3NDhiO2ZvbnQtc2l6ZToxMnB4O1wiPihoaWdoZXIgcmFuayA9IGhpZ2hlciBwcmlvcml0eSk8L3NtYWxsPjwvaDI+PGRpdiBjbGFzcz1cImt3LWJhZGdlc1wiPic7XG4gICAgICBhdHNLd3MuZm9yRWFjaCgoa3csIGlkeCkgPT4ge1xuICAgICAgICBjb25zdCBhbm5vdGF0aW9uID0gX2t3U3lub255bUFubm90YXRpb24oa3csIHN5bk1hcCk7XG4gICAgICAgIGNvbnN0IHRpdGxlQXR0ciAgPSBhbm5vdGF0aW9uID8gYCB0aXRsZT1cIlN5bm9ueW06ICR7ZXNjYXBlSHRtbChrdyArIGFubm90YXRpb24pfVwiYCA6ICcnO1xuICAgICAgICBjb25zdCBhbm5vdEh0bWwgID0gYW5ub3RhdGlvbiA/IGA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZToxMHB4O2NvbG9yOiM2NDc0OGI7bWFyZ2luLWxlZnQ6M3B4O1wiPiR7ZXNjYXBlSHRtbChhbm5vdGF0aW9uKX08L3NwYW4+YCA6ICcnO1xuICAgICAgICBodG1sICs9IGA8c3BhbiBjbGFzcz1cImt3LWJhZGdlXCIke3RpdGxlQXR0cn0+PHNwYW4gY2xhc3M9XCJrdy1yYW5rXCI+IyR7aWR4ICsgMX08L3NwYW4+JHtlc2NhcGVIdG1sKGt3KX0ke2Fubm90SHRtbH08L3NwYW4+YDtcbiAgICAgIH0pO1xuICAgICAgaHRtbCArPSAnPC9kaXY+PC9kaXY+JztcbiAgICB9XG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgQ3VsdHVyZSBpbmRpY2F0b3JzIChvcHRpb25hbCkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgY29uc3QgY3VsdHVyZSA9IEFycmF5LmlzQXJyYXkoZGF0YS5jdWx0dXJlX2luZGljYXRvcnMpID8gZGF0YS5jdWx0dXJlX2luZGljYXRvcnMgOiBbXTtcbiAgICBpZiAoY3VsdHVyZS5sZW5ndGggPiAwKSB7XG4gICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwiYW5hbHlzaXMtc2VjdGlvblwiPjxoMj5cdUQ4M0NcdURGRTIgQ3VsdHVyZSBJbmRpY2F0b3JzPC9oMj48dWwgY2xhc3M9XCJwcmVmZXJyZWQtbGlzdFwiPic7XG4gICAgICBjdWx0dXJlLmZvckVhY2goYyA9PiB7IGh0bWwgKz0gYDxsaT4ke2N9PC9saT5gOyB9KTtcbiAgICAgIGh0bWwgKz0gJzwvdWw+PC9kaXY+JztcbiAgICB9XG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgTXVzdC1oYXZlIHJlcXVpcmVtZW50cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICBjb25zdCBtdXN0SGF2ZSA9IEFycmF5LmlzQXJyYXkoZGF0YS5tdXN0X2hhdmVfcmVxdWlyZW1lbnRzKSA/IGRhdGEubXVzdF9oYXZlX3JlcXVpcmVtZW50cyA6IFtdO1xuICAgIGlmIChtdXN0SGF2ZS5sZW5ndGggPiAwKSB7XG4gICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwiYW5hbHlzaXMtc2VjdGlvblwiPjxoMj5cdTI3MDUgTXVzdC1IYXZlIFJlcXVpcmVtZW50czwvaDI+PHVsIGNsYXNzPVwicHJlZmVycmVkLWxpc3RcIj4nO1xuICAgICAgbXVzdEhhdmUuZm9yRWFjaChyID0+IHsgaHRtbCArPSBgPGxpPiR7cn08L2xpPmA7IH0pO1xuICAgICAgaHRtbCArPSAnPC91bD48L2Rpdj4nO1xuICAgIH1cblxuICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJuYXYtYnV0dG9ucyBuYXYtZW5kXCI+PGJ1dHRvbiBjbGFzcz1cImNvbnRpbnVlLWJ0blwiIG9uY2xpY2s9XCJzZW5kQWN0aW9uKFxcdTAwMjdyZWNvbW1lbmRfY3VzdG9taXphdGlvbnNcXHUwMDI3KVwiPkNvbnRpbnVlIHRvIEN1c3RvbWl6YXRpb25zIFx1MjE5MjwvYnV0dG9uPjwvZGl2Pic7XG4gICAgaHRtbCArPSAnPC9kaXY+JzsgLy8gLmFuYWx5c2lzLXBhZ2VcbiAgICBjb250ZW50LmlubmVySFRNTCA9IGh0bWw7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2cuZXJyb3IoJ0FuYWx5c2lzIHBhcnNpbmcgZXJyb3I6JywgZSwgJ09yaWdpbmFsIHJlc3VsdDonLCByZXN1bHQpO1xuICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJlbXB0eS1zdGF0ZVwiPjxkaXYgY2xhc3M9XCJpY29uXCI+XHUyNzRDPC9kaXY+PGgzPkFuYWx5c2lzIEVycm9yPC9oMz48cD5Db3VsZCBub3QgcGFyc2UgYW5hbHlzaXMgcmVzdWx0czogJHtlc2NhcGVIdG1sKGUubWVzc2FnZSl9PC9wPjxkZXRhaWxzPjxzdW1tYXJ5PkRlYnVnIEluZm88L3N1bW1hcnk+PHByZT4ke2VzY2FwZUh0bWwoSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKSl9PC9wcmU+PC9kZXRhaWxzPjwvZGl2PmA7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIEN1c3RvbWl6YXRpb24gcmVzcG9uc2UgaGFuZGxlciBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gaGFuZGxlQ3VzdG9taXphdGlvblJlc3BvbnNlKHJlc3BvbnNlKSB7XG4gIHRyeSB7XG4gICAgLy8gQWNjZXB0IGEgcHJlLXBhcnNlZCBvYmplY3Qgb3IgYSByYXcgc3RyaW5nIChwYXJzZSBhdCBib3VuZGFyeSkuXG4gICAgY29uc3QgZGF0YSA9IChyZXNwb25zZSAhPT0gbnVsbCAmJiB0eXBlb2YgcmVzcG9uc2UgPT09ICdvYmplY3QnKVxuICAgICAgPyByZXNwb25zZVxuICAgICAgOiBleHRyYWN0Rmlyc3RKc29uT2JqZWN0KHJlc3BvbnNlKTtcbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIHR5cGVvZiByZXNwb25zZSA9PT0gJ3N0cmluZycgPyByZXNwb25zZSA6ICcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZGF0YSAmJiAoZGF0YS5yZWNvbW1lbmRlZF9leHBlcmllbmNlcyB8fCBkYXRhLnJlY29tbWVuZGVkX3NraWxscykpIHtcbiAgICAgIHN0YXRlTWFuYWdlci5zZXRUYWJEYXRhKCdjdXN0b21pemF0aW9ucycsIGRhdGEpO1xuICAgICAgd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnMgPSBkYXRhO1xuICAgICAgc2F2ZVRhYkRhdGEoKTtcblxuICAgICAgaWYgKCFpc1JlY29ubmVjdEluUHJvZ3Jlc3MoKSkge1xuICAgICAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCAnXHUyNzA1IEN1c3RvbWl6YXRpb25zIGdlbmVyYXRlZCEgUGxlYXNlIHJldmlldyBlYWNoIHNlY3Rpb24gaW4gdGhlICoqQ3VzdG9taXphdGlvbnMqKiB0YWIgXHUyMDE0IEV4cGVyaWVuY2VzLCBBY2hpZXZlbWVudHMsIFNraWxscywgU3VtbWFyeSwgYW5kIFB1YmxpY2F0aW9ucy4gU2VsZWN0IHlvdXIgcHJlZmVyZW5jZXMgdXNpbmcgdGhlIGFjdGlvbiBidXR0b25zLCB0aGVuIHN1Ym1pdCB5b3VyIGRlY2lzaW9ucy4nKTtcbiAgICAgICAgc3dpdGNoVGFiKCdleHAtcmV2aWV3Jyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghaXNSZWNvbm5lY3RJblByb2dyZXNzKCkpIHtcbiAgICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIHJlc3BvbnNlKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2cuZXJyb3IoJ0N1c3RvbWl6YXRpb24gcmVzcG9uc2UgZXJyb3I6JywgZSk7XG4gICAgaWYgKCFpc1JlY29ubmVjdEluUHJvZ3Jlc3MoKSkge1xuICAgICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgcmVzcG9uc2UpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFN5bmMgdGhlIHNraWxscy10aXRsZSBzZWxlY3QvY3VzdG9tLWlucHV0IGNvbnRyb2xzIHRvIGEgZ2l2ZW4gdGl0bGUgdmFsdWUsXG4gKiBhbmQgYXR0YWNoIGNoYW5nZSBsaXN0ZW5lcnMgc28gdXBkYXRlcyBhcmUgc2F2ZWQgdmlhIHRoZSBBUEkuXG4gKiBkdWNrZmxvdzpcbiAqICAgaWQ6IGdlbmVyYXRpb25fc2V0dGluZ3Mud2ViX3Jldmlld190YWJsZV9iYXNlLkwzMzBcbiAqICAga2luZDogdWlcbiAqICAgdGltZXN0YW1wOiAnMjAyNi0wMy0yN1QwMToyMzoyOFonXG4gKiAgIHN0YXR1czogbGl2ZVxuICogICBoYW5kbGVzOlxuICogICAtIHVpOmdlbmVyYXRpb24tc2V0dGluZ3Muc3luYy1za2lsbHMtdGl0bGVcbiAqICAgY2FsbHM6XG4gKiAgIC0gUE9TVCAvYXBpL2dlbmVyYXRpb24tc2V0dGluZ3NcbiAqICAgcmVhZHM6XG4gKiAgIC0gcmVzcG9uc2U6R0VUIC9hcGkvc3RhdHVzLnNraWxsc19zZWN0aW9uX3RpdGxlXG4gKiAgIHdyaXRlczpcbiAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9nZW5lcmF0aW9uLXNldHRpbmdzLnNraWxsc19zZWN0aW9uX3RpdGxlXG4gKiAgIG5vdGVzOiBLZWVwcyB0aGUgVUkgc2tpbGxzLXRpdGxlIGNvbnRyb2xzIGluIHN5bmMgd2l0aCBzdGF0dXMgZGF0YSBhbmQgcGVyc2lzdHMgdGl0bGUgY2hhbmdlcyBiYWNrIHRvIHRoZSBzZXNzaW9uIHNldHRpbmdzIHJvdXRlLlxuICovXG5mdW5jdGlvbiBfc3luY1NraWxsc1RpdGxlQ29udHJvbHMoY3VycmVudFRpdGxlKSB7XG4gIGNvbnN0IGtub3duT3B0aW9ucyA9IFsnU2tpbGxzJywgJ1RlY2huaWNhbCBTa2lsbHMnLCAnS2V5IFNraWxscycsICdDb3JlIFNraWxscyddO1xuICBjb25zdCBzZWwgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NraWxscy10aXRsZS1zZWxlY3QnKTtcbiAgY29uc3QgY3VzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbHMtdGl0bGUtY3VzdG9tJyk7XG4gIGlmICghc2VsKSByZXR1cm47XG5cbiAgY29uc3QgaXNLbm93biA9IGtub3duT3B0aW9ucy5pbmNsdWRlcyhjdXJyZW50VGl0bGUpO1xuICBpZiAoaXNLbm93bikge1xuICAgIHNlbC52YWx1ZSA9IGN1cnJlbnRUaXRsZTtcbiAgICBpZiAoY3VzdCkgY3VzdC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICB9IGVsc2Uge1xuICAgIHNlbC52YWx1ZSA9ICdfX2N1c3RvbV9fJztcbiAgICBpZiAoY3VzdCkge1xuICAgICAgY3VzdC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICBjdXN0LnZhbHVlID0gY3VycmVudFRpdGxlO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHNhdmVUaXRsZSA9IGFzeW5jICh0aXRsZSkgPT4ge1xuICAgIHRyeSB7IGF3YWl0IGFwaUNhbGwoJ1BPU1QnLCAnL2FwaS9nZW5lcmF0aW9uLXNldHRpbmdzJywgeyBza2lsbHNfc2VjdGlvbl90aXRsZTogdGl0bGUgfSk7IH1cbiAgICBjYXRjaCAoZSkgeyBsb2cud2FybignRmFpbGVkIHRvIHNhdmUgc2tpbGxzX3NlY3Rpb25fdGl0bGUgc2V0dGluZzonLCBlKTsgfVxuICB9O1xuXG4gIHNlbC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgaWYgKHNlbC52YWx1ZSA9PT0gJ19fY3VzdG9tX18nKSB7XG4gICAgICBpZiAoY3VzdCkgeyBjdXN0LnN0eWxlLmRpc3BsYXkgPSAnJzsgY3VzdC5mb2N1cygpOyB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChjdXN0KSBjdXN0LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICBzYXZlVGl0bGUoc2VsLnZhbHVlKTtcbiAgICB9XG4gIH0pO1xuXG4gIGlmIChjdXN0KSB7XG4gICAgY3VzdC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCB2ID0gY3VzdC52YWx1ZS50cmltKCk7XG4gICAgICBpZiAodikgc2F2ZVRpdGxlKHYpO1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogUmVuZGVycyBvbmUgb2YgdGhlIDUgcmV2aWV3IHBhbmVzIGFzIGEgdG9wLWxldmVsIHRhYi5cbiAqIFJlcGxhY2VzIHRoZSBvbGQgc3ViLXRhYiBhcHByb2FjaCB3aXRoIGEgZmxhdCBzaW5nbGUtbGV2ZWwgdGFiIHN0cnVjdHVyZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcG9wdWxhdGVSZXZpZXdUYWIocGFuZSkge1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgY29uc3QgY3VzdG9taXphdGlvbnMgPSBzdGF0ZU1hbmFnZXIuZ2V0VGFiRGF0YSgnY3VzdG9taXphdGlvbnMnKTtcblxuICBpZiAoIXdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zIHx8ICFjdXN0b21pemF0aW9ucykge1xuICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJlbXB0eS1zdGF0ZVwiPjxkaXYgY2xhc3M9XCJpY29uXCI+XHUyNjk5XHVGRTBGPC9kaXY+PGgzPlJldmlldyBDdXN0b21pemF0aW9uczwvaDM+PHA+Q2xpY2sgXCJSZWNvbW1lbmQgQ3VzdG9taXphdGlvbnNcIiB0byBnZW5lcmF0ZSByZWNvbW1lbmRhdGlvbnMuPC9wPjwvZGl2Pic7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcGFuZUNvbmZpZyA9IHtcbiAgICBleHBlcmllbmNlczogICB7IHRpdGxlOiAnJywgZGVzYzogJ1NvcnRlZCBieSBkYXRlIChtb3N0IHJlY2VudCBmaXJzdCkuIENsaWNrIGFjdGlvbiBidXR0b25zIHRvIG92ZXJyaWRlIHJlY29tbWVuZGF0aW9ucy4nLCAgICAgICAgIGNvbnRhaW5lcjogJ2V4cGVyaWVuY2UtdGFibGUtY29udGFpbmVyJyAgIH0sXG4gICAgc2tpbGxzOiAgICAgICAgeyB0aXRsZTogJ1x1RDgzRFx1REVFMFx1RkUwRiBTa2lsbHMnLCAgICAgICAgICAgZGVzYzogJ1NvcnRlZCBieSByZWxldmFuY2UuIFNlbGVjdCBob3cgdG8gZmVhdHVyZSBlYWNoIHNraWxsLicsICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXI6ICdza2lsbHMtdGFibGUtY29udGFpbmVyJyAgICAgICB9LFxuICAgIGFjaGlldmVtZW50czogIHsgdGl0bGU6ICdcdUQ4M0NcdURGQzYgQWNoaWV2ZW1lbnRzJywgICAgICBkZXNjOiAnU2VsZWN0IGhvdyB0byBmZWF0dXJlIGVhY2gga2V5IGFjaGlldmVtZW50LiBBSSByZWNvbW1lbmRhdGlvbnMgYXJlIHByZS1zZWxlY3RlZC4nLCAgY29udGFpbmVyOiAnYWNoaWV2ZW1lbnRzLXRhYmxlLWNvbnRhaW5lcicgIH0sXG4gICAgc3VtbWFyeTogICAgICAgeyB0aXRsZTogJ1x1RDgzRFx1RENERCBQcm9mZXNzaW9uYWwgU3VtbWFyeScsIGRlc2M6ICdTZWxlY3Qgd2hpY2ggcHJvZmVzc2lvbmFsIHN1bW1hcnkgdG8gdXNlLiBUaGUgQUlcXCdzIHJlY29tbWVuZGF0aW9uIGlzIHByZS1zZWxlY3RlZC4nLCBjb250YWluZXI6ICdzdW1tYXJ5LWZvY3VzLWNvbnRhaW5lcicgICAgfSxcbiAgICBwdWJsaWNhdGlvbnM6ICB7IHRpdGxlOiAnXHVEODNEXHVEQ0M0IFB1YmxpY2F0aW9ucycsICAgICAgZGVzYzogJ0FsbCBwdWJsaWNhdGlvbnMgcmFua2VkIGJ5IHJlbGV2YW5jZS4gQWNjZXB0IG9yIHJlamVjdCBlYWNoIGZvciB5b3VyIENWLicsICAgICAgICAgIGNvbnRhaW5lcjogJ3B1YmxpY2F0aW9ucy10YWJsZS1jb250YWluZXInIH0sXG4gIH07XG4gIGNvbnN0IGNmZyA9IHBhbmVDb25maWdbcGFuZV0gfHwge307XG5cbiAgY29uc3QgaGVhZGVySHRtbCA9IHBhbmUgPT09ICdleHBlcmllbmNlcycgPyBgXG4gICAgPGgxPlx1MjY5OVx1RkUwRiBSZXZpZXcgQ3VzdG9taXphdGlvbiBSZWNvbW1lbmRhdGlvbnM8L2gxPlxuICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDttYXJnaW4tYm90dG9tOjE2cHg7XCI+UmV2aWV3IHRoZSBBSSdzIHJlY29tbWVuZGF0aW9ucy4gVXNlIHRoZSBhY3Rpb24gYnV0dG9ucyB0byBhZGp1c3QgZWFjaCBpdGVtLCB0aGVuIHNhdmUgeW91ciBkZWNpc2lvbnMgYmVmb3JlIGdlbmVyYXRpbmcgdGhlIENWLjwvcD5cbiAgICA8ZGl2IGlkPVwicGFnZS1lc3RpbWF0ZS13aWRnZXRcIiBjbGFzcz1cInBhZ2UtZXN0aW1hdGUgb2tcIj5cbiAgICAgIDxzcGFuIGlkPVwicGUtaWNvblwiPlx1RDgzRFx1RENDNDwvc3Bhbj5cbiAgICAgIDxzcGFuIGlkPVwicGUtbGFiZWxcIj5Fc3RpbWF0ZWQgbGVuZ3RoOiBjYWxjdWxhdGluZ1x1MjAyNjwvc3Bhbj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwZS1iYXJcIj48ZGl2IGNsYXNzPVwicGUtZmlsbFwiIGlkPVwicGUtZmlsbFwiIHN0eWxlPVwid2lkdGg6MCU7YmFja2dyb3VuZDojODZlZmFjO1wiPjwvZGl2PjwvZGl2PlxuICAgIDwvZGl2PlxuICBgIDogKGNmZy50aXRsZSA/IGA8aDIgc3R5bGU9XCJtYXJnaW46MCAwIDEycHg7XCI+JHtjZmcudGl0bGV9PC9oMj5gIDogJycpO1xuXG4gIGNvbnN0IG5hdkJhY2sgPSB7XG4gICAgc2tpbGxzOiAgICAgICBgPGJ1dHRvbiBjbGFzcz1cImJhY2stYnRuXCIgb25jbGljaz1cInN3aXRjaFRhYignYWNoLWVkaXRvcicpXCI+XHUyMTkwIEJhY2sgdG8gRXhwZXJpZW5jZSBCdWxsZXRzPC9idXR0b24+YCxcbiAgICBhY2hpZXZlbWVudHM6IGA8YnV0dG9uIGNsYXNzPVwiYmFjay1idG5cIiBvbmNsaWNrPVwic3dpdGNoVGFiKCdza2lsbHMtcmV2aWV3JylcIj5cdTIxOTAgQmFjayB0byBTa2lsbHM8L2J1dHRvbj5gLFxuICAgIHB1YmxpY2F0aW9uczogYDxidXR0b24gY2xhc3M9XCJiYWNrLWJ0blwiIG9uY2xpY2s9XCJzd2l0Y2hUYWIoJ3N1bW1hcnktcmV2aWV3JylcIj5cdTIxOTAgQmFjayB0byBTdW1tYXJ5PC9idXR0b24+YCxcbiAgfTtcbiAgY29uc3QgbmF2Q29udGludWUgPSB7XG4gICAgZXhwZXJpZW5jZXM6ICBgPGJ1dHRvbiBjbGFzcz1cImNvbnRpbnVlLWJ0blwiIG9uY2xpY2s9XCJzdWJtaXRFeHBlcmllbmNlRGVjaXNpb25zKClcIj5Db250aW51ZSB0byBFeHBlcmllbmNlIEJ1bGxldHMgXHUyMTkyPC9idXR0b24+YCxcbiAgICBza2lsbHM6ICAgICAgIGA8YnV0dG9uIGNsYXNzPVwiY29udGludWUtYnRuXCIgb25jbGljaz1cInN1Ym1pdFNraWxsRGVjaXNpb25zKClcIj5Db250aW51ZSB0byBBY2hpZXZlbWVudHMgXHUyMTkyPC9idXR0b24+YCxcbiAgICBhY2hpZXZlbWVudHM6IGA8YnV0dG9uIGNsYXNzPVwiY29udGludWUtYnRuXCIgb25jbGljaz1cInN1Ym1pdEFjaGlldmVtZW50RGVjaXNpb25zKClcIj5Db250aW51ZSB0byBUYWdsaW5lIFx1MjE5MjwvYnV0dG9uPmAsXG4gICAgcHVibGljYXRpb25zOiBgPGJ1dHRvbiBjbGFzcz1cImNvbnRpbnVlLWJ0blwiIG9uY2xpY2s9XCJzdWJtaXRQdWJsaWNhdGlvbkRlY2lzaW9ucygpXCI+Q29udGludWUgdG8gUmV3cml0ZSBcdTIxOTI8L2J1dHRvbj5gLFxuICB9O1xuICBjb25zdCBuYXZIdG1sID0gcGFuZSA9PT0gJ3N1bW1hcnknID8gJycgOiBgXG4gICAgPGRpdiBjbGFzcz1cIm5hdi1idXR0b25zJHtwYW5lID09PSAnZXhwZXJpZW5jZXMnID8gJyBuYXYtZW5kJyA6ICcnfVwiIHN0eWxlPVwibWFyZ2luOjE2cHggMDtcIj5cbiAgICAgICR7bmF2QmFja1twYW5lXSB8fCAnJ31cbiAgICAgICR7bmF2Q29udGludWVbcGFuZV0gfHwgJyd9XG4gICAgPC9kaXY+YDtcblxuICBjb250ZW50LmlubmVySFRNTCA9IGBcbiAgICAke2hlYWRlckh0bWx9XG4gICAgJHtjZmcuZGVzYyA/IGA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7Zm9udC1zaXplOjAuOTVlbTttYXJnaW4tYm90dG9tOjE2cHg7XCI+JHtlc2NhcGVIdG1sKGNmZy5kZXNjKX08L3A+YCA6ICcnfVxuICAgIDxkaXYgaWQ9XCIke2NmZy5jb250YWluZXJ9XCI+PC9kaXY+XG4gICAgJHtuYXZIdG1sfVxuICBgO1xuXG4gIHdpbmRvdy5fYWN0aXZlUmV2aWV3UGFuZSA9IHBhbmU7XG4gIHN3aXRjaCAocGFuZSkge1xuICAgIGNhc2UgJ2V4cGVyaWVuY2VzJzpcbiAgICAgIGF3YWl0IGJ1aWxkRXhwZXJpZW5jZVJldmlld1RhYmxlKCk7XG4gICAgICBfdXBkYXRlUGFnZUVzdGltYXRlKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdza2lsbHMnOlxuICAgICAgYXdhaXQgYnVpbGRTa2lsbHNSZXZpZXdUYWJsZSgpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYWNoaWV2ZW1lbnRzJzpcbiAgICAgIGF3YWl0IGJ1aWxkQWNoaWV2ZW1lbnRzUmV2aWV3VGFibGUoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3N1bW1hcnknOlxuICAgICAgYXdhaXQgYnVpbGRTdW1tYXJ5Rm9jdXNTZWN0aW9uKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdwdWJsaWNhdGlvbnMnOlxuICAgICAgYXdhaXQgYnVpbGRQdWJsaWNhdGlvbnNSZXZpZXdUYWJsZSgpO1xuICAgICAgYnJlYWs7XG4gIH1cbn1cblxuLy8gVHJhY2sgd2hpY2ggcGFuZSBpcyBjdXJyZW50bHkgYWN0aXZlXG53aW5kb3cuX2FjdGl2ZVJldmlld1BhbmUgPSAnZXhwZXJpZW5jZXMnO1xuXG5hc3luYyBmdW5jdGlvbiBzd2l0Y2hSZXZpZXdTdWJ0YWIocGFuZSkge1xuICAvLyBVcGRhdGUgYnV0dG9uIHN0YXRlc1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucmV2aWV3LXN1YnRhYicpLmZvckVhY2goYnRuID0+IHtcbiAgICBidG4uY2xhc3NMaXN0LnRvZ2dsZSgnYWN0aXZlJywgYnRuLmRhdGFzZXQucGFuZSA9PT0gcGFuZSk7XG4gIH0pO1xuXG4gIC8vIEhpZGUgYWxsIHBhbmVzLCBzaG93IHRoZSBzZWxlY3RlZCBvbmVcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnJldmlldy1wYW5lJykuZm9yRWFjaChwID0+IHAuc3R5bGUuZGlzcGxheSA9ICdub25lJyk7XG4gIGNvbnN0IHRhcmdldCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGByZXZpZXctcGFuZS0ke3BhbmV9YCk7XG4gIGlmICh0YXJnZXQpIHRhcmdldC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcblxuICB3aW5kb3cuX2FjdGl2ZVJldmlld1BhbmUgPSBwYW5lO1xuXG4gIC8vIExhenktbG9hZCBwYW5lIGNvbnRlbnQgb24gZmlyc3QgdmlzaXRcbiAgaWYgKCF3aW5kb3cuX3Jldmlld1BhbmVMb2FkZWQgfHwgIXdpbmRvdy5fcmV2aWV3UGFuZUxvYWRlZFtwYW5lXSkge1xuICAgIGF3YWl0IF9sb2FkUmV2aWV3UGFuZShwYW5lKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBfbG9hZFJldmlld1BhbmUocGFuZSkge1xuICBpZiAoIXdpbmRvdy5fcmV2aWV3UGFuZUxvYWRlZCkgd2luZG93Ll9yZXZpZXdQYW5lTG9hZGVkID0ge307XG4gIHRyeSB7XG4gICAgc3dpdGNoIChwYW5lKSB7XG4gICAgICBjYXNlICdleHBlcmllbmNlcyc6ICAgYXdhaXQgYnVpbGRFeHBlcmllbmNlUmV2aWV3VGFibGUoKTsgIGJyZWFrO1xuICAgICAgY2FzZSAnc2tpbGxzJzogICAgICAgIGF3YWl0IGJ1aWxkU2tpbGxzUmV2aWV3VGFibGUoKTsgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdhY2hpZXZlbWVudHMnOiAgYXdhaXQgYnVpbGRBY2hpZXZlbWVudHNSZXZpZXdUYWJsZSgpOyBicmVhaztcbiAgICAgIGNhc2UgJ3N1bW1hcnknOiAgICAgICBhd2FpdCBidWlsZFN1bW1hcnlGb2N1c1NlY3Rpb24oKTsgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncHVibGljYXRpb25zJzogIGF3YWl0IGJ1aWxkUHVibGljYXRpb25zUmV2aWV3VGFibGUoKTsgYnJlYWs7XG4gICAgICBkZWZhdWx0OiByZXR1cm47XG4gICAgfVxuICAgIHdpbmRvdy5fcmV2aWV3UGFuZUxvYWRlZFtwYW5lXSA9IHRydWU7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgZGVsZXRlIHdpbmRvdy5fcmV2aWV3UGFuZUxvYWRlZFtwYW5lXTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgUGFnZS1lc3RpbWF0ZSB3aWRnZXQgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIF91cGRhdGVQYWdlRXN0aW1hdGUoKSB7XG4gIGNvbnN0IHdpZGdldCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYWdlLWVzdGltYXRlLXdpZGdldCcpO1xuICBpZiAoIXdpZGdldCkgcmV0dXJuO1xuXG4gIGNvbnN0IGxhYmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BlLWxhYmVsJyk7XG4gIGNvbnN0IGZpbGwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGUtZmlsbCcpO1xuICBjb25zdCBpY29uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BlLWljb24nKTtcblxuICBpZiAobGFiZWwpIGxhYmVsLnRleHRDb250ZW50ID0gJ1VwZGF0aW5nIHNlcnZlciBsYXlvdXQgZXN0aW1hdGVcdTIwMjYnO1xuICBpZiAoZmlsbCkgZmlsbC5zdHlsZS53aWR0aCA9ICcwJSc7XG4gIGlmIChpY29uKSBpY29uLnRleHRDb250ZW50ID0gJ1x1MjNGMyc7XG5cbiAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICBleHBlcmllbmNlX2RlY2lzaW9uczoge1xuICAgICAgLi4uKCh3aW5kb3cuX3NhdmVkRGVjaXNpb25zICYmIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMuZXhwZXJpZW5jZV9kZWNpc2lvbnMpIHx8IHt9KSxcbiAgICAgIC4uLih1c2VyU2VsZWN0aW9ucy5leHBlcmllbmNlcyB8fCB7fSksXG4gICAgfSxcbiAgICBza2lsbF9kZWNpc2lvbnM6IHtcbiAgICAgIC4uLigod2luZG93Ll9zYXZlZERlY2lzaW9ucyAmJiB3aW5kb3cuX3NhdmVkRGVjaXNpb25zLnNraWxsX2RlY2lzaW9ucykgfHwge30pLFxuICAgICAgLi4uKHVzZXJTZWxlY3Rpb25zLnNraWxscyB8fCB7fSksXG4gICAgfSxcbiAgICBhY2hpZXZlbWVudF9kZWNpc2lvbnM6IChcbiAgICAgICh3aW5kb3cuX3NhdmVkRGVjaXNpb25zICYmIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMuYWNoaWV2ZW1lbnRfZGVjaXNpb25zKVxuICAgICAgfHwgd2luZG93LmFjaGlldmVtZW50RGVjaXNpb25zXG4gICAgICB8fCB7fVxuICAgICksXG4gICAgcHVibGljYXRpb25fZGVjaXNpb25zOiAoXG4gICAgICAod2luZG93Ll9zYXZlZERlY2lzaW9ucyAmJiB3aW5kb3cuX3NhdmVkRGVjaXNpb25zLnB1YmxpY2F0aW9uX2RlY2lzaW9ucylcbiAgICAgIHx8IHdpbmRvdy5wdWJsaWNhdGlvbkRlY2lzaW9uc1xuICAgICAgfHwge31cbiAgICApLFxuICAgIHN1bW1hcnlfZm9jdXNfb3ZlcnJpZGU6IHdpbmRvdy5zZWxlY3RlZFN1bW1hcnlLZXkgfHwgbnVsbCxcbiAgfTtcblxuICBjb25zdCByZXF1ZXN0SWQgPSArK3BhZ2VFc3RpbWF0ZVJlcXVlc3RJZDtcbiAgY2xlYXJUaW1lb3V0KHBhZ2VFc3RpbWF0ZVRpbWVyKTtcbiAgcGFnZUVzdGltYXRlVGltZXIgPSBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBhcGlDYWxsKCdQT1NUJywgJy9hcGkvY3YvbGF5b3V0LWVzdGltYXRlJywgcGF5bG9hZCk7XG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB0aHJvdyBuZXcgRXJyb3IocmVzcG9uc2UuZXJyb3IgfHwgJ2VzdGltYXRlIGZhaWxlZCcpO1xuICAgICAgaWYgKHJlcXVlc3RJZCAhPT0gcGFnZUVzdGltYXRlUmVxdWVzdElkKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHBhZ2VzID0gTnVtYmVyKHJlc3BvbnNlLnBhZ2VfY291bnRfZXN0aW1hdGUgfHwgMCk7XG4gICAgICBjb25zdCBwY3QgPSBNYXRoLm1pbigxMDAsIChwYWdlcyAvIDMpICogMTAwKTtcbiAgICAgIGNvbnN0IGNvbmZpZGVuY2UgPSBOdW1iZXIocmVzcG9uc2UucGFnZV9jb3VudF9jb25maWRlbmNlIHx8IDApO1xuXG4gICAgICBsZXQgY2xzID0gJ29rJztcbiAgICAgIGxldCBjb2xvdXIgPSAnIzIyYzU1ZSc7XG4gICAgICBsZXQgaWNvblRleHQgPSByZXNwb25zZS5wYWdlX2NvdW50X2V4YWN0ICE9IG51bGwgPyAnXHUyNzA1JyA6ICdcdUQ4M0RcdURDQzQnO1xuICAgICAgaWYgKHJlc3BvbnNlLnBhZ2VfbGVuZ3RoX3dhcm5pbmcpIHtcbiAgICAgICAgY2xzID0gcGFnZXMgPiAzID8gJ292ZXInIDogJ3dhcm4nO1xuICAgICAgICBjb2xvdXIgPSBwYWdlcyA+IDMgPyAnI2VmNDQ0NCcgOiAnI2Y1OWUwYic7XG4gICAgICAgIGljb25UZXh0ID0gcGFnZXMgPiAzID8gJ1x1RDgzRFx1REVBOCcgOiAnXHUyNkEwXHVGRTBGJztcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc291cmNlTGFiZWwgPSByZXNwb25zZS5wYWdlX2NvdW50X2V4YWN0ICE9IG51bGxcbiAgICAgICAgPyBgRXhhY3Q6ICR7cmVzcG9uc2UucGFnZV9jb3VudF9leGFjdH0gcGFnZSR7cmVzcG9uc2UucGFnZV9jb3VudF9leGFjdCA9PT0gMSA/ICcnIDogJ3MnfWBcbiAgICAgICAgOiBgRXN0aW1hdGVkOiAke3BhZ2VzLnRvRml4ZWQoMSl9IHBhZ2VzYDtcbiAgICAgIGNvbnN0IGNvbmZpZGVuY2VMYWJlbCA9IHJlc3BvbnNlLnBhZ2VfY291bnRfZXhhY3QgIT0gbnVsbFxuICAgICAgICA/ICcnXG4gICAgICAgIDogYCAoJHtNYXRoLnJvdW5kKGNvbmZpZGVuY2UgKiAxMDApfSUgY29uZmlkZW5jZSlgO1xuICAgICAgY29uc3QgY29udHJpYnV0b3JUZXh0ID0gQXJyYXkuaXNBcnJheShyZXNwb25zZS5jb250cmlidXRvcnMpICYmIHJlc3BvbnNlLmNvbnRyaWJ1dG9ycy5sZW5ndGggPiAwXG4gICAgICAgID8gYCAke3Jlc3BvbnNlLmNvbnRyaWJ1dG9yc1swXX0uYFxuICAgICAgICA6ICcnO1xuICAgICAgY29uc3QgcmVjaGVja1RleHQgPSByZXNwb25zZS5wYWdlX2NvdW50X25lZWRzX2V4YWN0X3JlY2hlY2sgJiYgcmVzcG9uc2UucGFnZV9jb3VudF9leGFjdCA9PSBudWxsXG4gICAgICAgID8gJyBFeGFjdCByZWNoZWNrIHJlY29tbWVuZGVkLidcbiAgICAgICAgOiAnJztcblxuICAgICAgd2lkZ2V0LmNsYXNzTmFtZSA9IGBwYWdlLWVzdGltYXRlICR7Y2xzfWA7XG4gICAgICBpZiAobGFiZWwpIHtcbiAgICAgICAgbGFiZWwudGV4dENvbnRlbnQgPSBgJHtzb3VyY2VMYWJlbH0ke2NvbmZpZGVuY2VMYWJlbH0uJHtjb250cmlidXRvclRleHR9JHtyZWNoZWNrVGV4dH1gLnRyaW0oKTtcbiAgICAgIH1cbiAgICAgIGlmIChmaWxsKSB7XG4gICAgICAgIGZpbGwuc3R5bGUud2lkdGggPSBgJHtwY3R9JWA7XG4gICAgICAgIGZpbGwuc3R5bGUuYmFja2dyb3VuZCA9IGNvbG91cjtcbiAgICAgIH1cbiAgICAgIGlmIChpY29uKSBpY29uLnRleHRDb250ZW50ID0gaWNvblRleHQ7XG5cbiAgICAgIHN0YXRlTWFuYWdlci5zZXRHZW5lcmF0aW9uU3RhdGUoe1xuICAgICAgICBwYWdlQ291bnRFc3RpbWF0ZTogcmVzcG9uc2UucGFnZV9jb3VudF9lc3RpbWF0ZSA/PyBudWxsLFxuICAgICAgICBwYWdlQ291bnRFeGFjdDogcmVzcG9uc2UucGFnZV9jb3VudF9leGFjdCA/PyBudWxsLFxuICAgICAgICBwYWdlQ291bnRDb25maWRlbmNlOiByZXNwb25zZS5wYWdlX2NvdW50X2NvbmZpZGVuY2UgPz8gbnVsbCxcbiAgICAgICAgcGFnZUNvdW50U291cmNlOiByZXNwb25zZS5wYWdlX2NvdW50X3NvdXJjZSB8fCBudWxsLFxuICAgICAgICBwYWdlTmVlZHNFeGFjdFJlY2hlY2s6IEJvb2xlYW4ocmVzcG9uc2UucGFnZV9jb3VudF9uZWVkc19leGFjdF9yZWNoZWNrKSxcbiAgICAgICAgcGFnZVdhcm5pbmc6IEJvb2xlYW4ocmVzcG9uc2UucGFnZV9sZW5ndGhfd2FybmluZyksXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKHJlcXVlc3RJZCAhPT0gcGFnZUVzdGltYXRlUmVxdWVzdElkKSByZXR1cm47XG4gICAgICB3aWRnZXQuY2xhc3NOYW1lID0gJ3BhZ2UtZXN0aW1hdGUgd2Fybic7XG4gICAgICBpZiAobGFiZWwpIGxhYmVsLnRleHRDb250ZW50ID0gYExheW91dCBlc3RpbWF0ZSB1bmF2YWlsYWJsZTogJHtlcnJvci5tZXNzYWdlfWA7XG4gICAgICBpZiAoZmlsbCkge1xuICAgICAgICBmaWxsLnN0eWxlLndpZHRoID0gJzAlJztcbiAgICAgICAgZmlsbC5zdHlsZS5iYWNrZ3JvdW5kID0gJyNmNTllMGInO1xuICAgICAgfVxuICAgICAgaWYgKGljb24pIGljb24udGV4dENvbnRlbnQgPSAnXHUyNkEwXHVGRTBGJztcbiAgICB9XG4gIH0sIDI1MCk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBTaGFyZWQgYWN0aW9uIGNsaWNrIGhhbmRsZXJzIChleHBlcmllbmNlICsgc2tpbGxzIHRhYmxlcykgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIGhhbmRsZUFjdGlvbkNsaWNrKGl0ZW1JZCwgYWN0aW9uLCB0eXBlKSB7XG4gIC8vIFJlbW92ZSBhY3RpdmUgY2xhc3MgZnJvbSBhbGwgYnV0dG9ucyBpbiB0aGlzIHJvd1xuICBjb25zdCByb3cgPSB0eXBlID09PSAnZXhwZXJpZW5jZSdcbiAgICA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYHRyW2RhdGEtZXhwLWlkPVwiJHtpdGVtSWR9XCJdYClcbiAgICA6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYHRyW2RhdGEtc2tpbGw9XCIke2l0ZW1JZH1cIl1gKTtcblxuICBjb25zdCBidXR0b25zID0gcm93LnF1ZXJ5U2VsZWN0b3JBbGwoJy5pY29uLWJ0bicpO1xuICBidXR0b25zLmZvckVhY2goYnRuID0+IHtcbiAgICBidG4uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gICAgaWYgKGJ0bi5oYXNBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcpKSBidG4uc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCAnZmFsc2UnKTtcbiAgfSk7XG5cbiAgLy8gQWRkIGFjdGl2ZSBjbGFzcyB0byBjbGlja2VkIGJ1dHRvblxuICBjb25zdCBjbGlja2VkQnRuID0gcm93LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWFjdGlvbj1cIiR7YWN0aW9ufVwiXWApO1xuICBjbGlja2VkQnRuLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICBpZiAoY2xpY2tlZEJ0bi5oYXNBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcpKSBjbGlja2VkQnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJywgJ3RydWUnKTtcblxuICAvLyBTdG9yZSBzZWxlY3Rpb24gYW5kIHJlY29yZCBleHBsaWNpdCByZXZpZXdcbiAgaWYgKHR5cGUgPT09ICdleHBlcmllbmNlJykge1xuICAgIHVzZXJTZWxlY3Rpb25zLmV4cGVyaWVuY2VzW2l0ZW1JZF0gPSBhY3Rpb247XG4gICAgd2luZG93Ll9leHBsaWNpdGx5UmV2aWV3ZWQgPSB3aW5kb3cuX2V4cGxpY2l0bHlSZXZpZXdlZCB8fCB7IGV4cGVyaWVuY2VzOiBuZXcgU2V0KCksIHNraWxsczogbmV3IFNldCgpIH07XG4gICAgd2luZG93Ll9leHBsaWNpdGx5UmV2aWV3ZWQuZXhwZXJpZW5jZXMuYWRkKGl0ZW1JZCk7XG4gIH0gZWxzZSB7XG4gICAgdXNlclNlbGVjdGlvbnMuc2tpbGxzW2l0ZW1JZF0gPSBhY3Rpb247XG4gICAgd2luZG93Ll9leHBsaWNpdGx5UmV2aWV3ZWQgPSB3aW5kb3cuX2V4cGxpY2l0bHlSZXZpZXdlZCB8fCB7IGV4cGVyaWVuY2VzOiBuZXcgU2V0KCksIHNraWxsczogbmV3IFNldCgpIH07XG4gICAgd2luZG93Ll9leHBsaWNpdGx5UmV2aWV3ZWQuc2tpbGxzLmFkZChpdGVtSWQpO1xuICB9XG4gIF91cGRhdGVQYWdlRXN0aW1hdGUoKTtcbn1cblxuLyoqXG4gKiBBcHBseSBhIGJ1bGsgYWN0aW9uIHRvIGFsbCB2aXNpYmxlIChEYXRhVGFibGUtZmlsdGVyZWQpIHJvd3MgaW4gb25lIHRhYmxlLlxuICogYWN0aW9uOiAnZW1waGFzaXplJyB8ICdpbmNsdWRlJyB8ICdkZS1lbXBoYXNpemUnIHwgJ2V4Y2x1ZGUnIHwgJ3JlY29tbWVuZGVkJ1xuICogdHlwZTogICAnZXhwZXJpZW5jZScgfCAnc2tpbGwnXG4gKi9cbmZ1bmN0aW9uIGJ1bGtBY3Rpb24oYWN0aW9uLCB0eXBlKSB7XG4gIGNvbnN0IHRhYmxlSWQgID0gdHlwZSA9PT0gJ2V4cGVyaWVuY2UnID8gJyNleHBlcmllbmNlLXJldmlldy10YWJsZScgOiAnI3NraWxscy1yZXZpZXctdGFibGUnO1xuICBjb25zdCBkYXRhICAgICA9IHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zIHx8IHt9O1xuICBjb25zdCBkdCAgICAgICA9ICQuZm4uRGF0YVRhYmxlLmlzRGF0YVRhYmxlKHRhYmxlSWQpID8gJCh0YWJsZUlkKS5EYXRhVGFibGUoKSA6IG51bGw7XG5cbiAgLy8gSXRlcmF0ZSBvbmx5IHRoZSByb3dzIHRoYXQgRGF0YVRhYmxlIGN1cnJlbnRseSBzaG93cyAocmVzcGVjdHMgc2VhcmNoIGZpbHRlcilcbiAgY29uc3Qgcm93cyA9IGR0XG4gICAgPyBkdC5yb3dzKHsgc2VhcmNoOiAnYXBwbGllZCcgfSkubm9kZXMoKS50b0FycmF5KClcbiAgICA6IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgJHt0YWJsZUlkfSB0Ym9keSB0cmApKTtcblxuICByb3dzLmZvckVhY2gocm93ID0+IHtcbiAgICBjb25zdCBleHBJZCAgICA9IHJvdy5kYXRhc2V0LmV4cElkO1xuICAgIGNvbnN0IHNraWxsSWQgID0gcm93LmRhdGFzZXQuc2tpbGw7XG4gICAgY29uc3QgaXRlbUlkICAgPSBleHBJZCB8fCBza2lsbElkO1xuICAgIGlmICghaXRlbUlkKSByZXR1cm47XG5cbiAgICBsZXQgcmVzb2x2ZWRBY3Rpb24gPSBhY3Rpb247XG4gICAgaWYgKGFjdGlvbiA9PT0gJ3JlY29tbWVuZGVkJykge1xuICAgICAgcmVzb2x2ZWRBY3Rpb24gPSB0eXBlID09PSAnZXhwZXJpZW5jZSdcbiAgICAgICAgPyBfcmVzb2x2ZWRFeHBBY3Rpb24oaXRlbUlkLCBkYXRhKVxuICAgICAgICA6IF9yZXNvbHZlZFNraWxsQWN0aW9uKGl0ZW1JZCwgZGF0YSk7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIGJ1dHRvbiBzdGF0ZXNcbiAgICByb3cucXVlcnlTZWxlY3RvckFsbCgnLmljb24tYnRuJykuZm9yRWFjaChidG4gPT4ge1xuICAgICAgYnRuLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgICAgaWYgKGJ0bi5oYXNBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcpKSBidG4uc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCAnZmFsc2UnKTtcbiAgICB9KTtcbiAgICBjb25zdCB0YXJnZXQgPSByb3cucXVlcnlTZWxlY3RvcihgW2RhdGEtYWN0aW9uPVwiJHtyZXNvbHZlZEFjdGlvbn1cIl1gKTtcbiAgICBpZiAodGFyZ2V0KSB7XG4gICAgICB0YXJnZXQuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgICBpZiAodGFyZ2V0Lmhhc0F0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJykpIHRhcmdldC5zZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsICd0cnVlJyk7XG4gICAgfVxuXG4gICAgLy8gU3RvcmUgc2VsZWN0aW9uXG4gICAgaWYgKHR5cGUgPT09ICdleHBlcmllbmNlJykge1xuICAgICAgdXNlclNlbGVjdGlvbnMuZXhwZXJpZW5jZXNbaXRlbUlkXSA9IHJlc29sdmVkQWN0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICB1c2VyU2VsZWN0aW9ucy5za2lsbHNbaXRlbUlkXSA9IHJlc29sdmVkQWN0aW9uO1xuICAgIH1cbiAgfSk7XG4gIF91cGRhdGVQYWdlRXN0aW1hdGUoKTtcbn1cblxuZnVuY3Rpb24gX3Jlc29sdmVkRXhwQWN0aW9uKGV4cElkLCBkYXRhKSB7XG4gIGNvbnN0IHJlYyA9IGdldEV4cGVyaWVuY2VSZWNvbW1lbmRhdGlvbihleHBJZCwgZGF0YSk7XG4gIGlmIChyZWMgPT09ICdFbXBoYXNpemUnKSAgICByZXR1cm4gJ2VtcGhhc2l6ZSc7XG4gIGlmIChyZWMgPT09ICdJbmNsdWRlJykgICAgICByZXR1cm4gJ2luY2x1ZGUnO1xuICBpZiAocmVjID09PSAnRGUtZW1waGFzaXplJykgcmV0dXJuICdkZS1lbXBoYXNpemUnO1xuICByZXR1cm4gJ2V4Y2x1ZGUnO1xufVxuXG5mdW5jdGlvbiBfcmVzb2x2ZWRTa2lsbEFjdGlvbihza2lsbE5hbWUsIGRhdGEpIHtcbiAgY29uc3QgcmVjID0gZ2V0U2tpbGxSZWNvbW1lbmRhdGlvbihza2lsbE5hbWUsIGRhdGEpO1xuICBpZiAocmVjID09PSAnRW1waGFzaXplJykgICAgcmV0dXJuICdlbXBoYXNpemUnO1xuICBpZiAocmVjID09PSAnSW5jbHVkZScpICAgICAgcmV0dXJuICdpbmNsdWRlJztcbiAgaWYgKHJlYyA9PT0gJ0RlLWVtcGhhc2l6ZScpIHJldHVybiAnZGUtZW1waGFzaXplJztcbiAgcmV0dXJuICdleGNsdWRlJztcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFRhZ2xpbmUgcmV2aWV3IHRhYiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gcG9wdWxhdGVUYWdsaW5lUmV2aWV3VGFiKCkge1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgaWYgKCFjb250ZW50KSByZXR1cm47XG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgIDxoMiBzdHlsZT1cIm1hcmdpbjowIDAgMTZweDtcIj5cdUQ4M0NcdURGRjdcdUZFMEYgQXBwbGljYW50IFRhZ2xpbmU8L2gyPlxuICAgIDxkaXYgaWQ9XCJ0YWdsaW5lLXJldmlldy1jb250YWluZXJcIj48L2Rpdj5cbiAgYDtcbiAgaWYgKHR5cGVvZiBidWlsZFRhZ2xpbmVSZXZpZXdTZWN0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgYXdhaXQgYnVpbGRUYWdsaW5lUmV2aWV3U2VjdGlvbigpO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFeHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5leHBvcnQge1xuICB1c2VyU2VsZWN0aW9ucyxcbiAgdXBkYXRlSW5jbHVzaW9uQ291bnRzLFxuICBzd2l0Y2hUYWIsXG4gIGxvYWRUYWJDb250ZW50LFxuICBwb3B1bGF0ZUFuYWx5c2lzVGFiLFxuICBoYW5kbGVDdXN0b21pemF0aW9uUmVzcG9uc2UsXG4gIHNob3dUYWJsZUJhc2VkUmV2aWV3LFxuICBwb3B1bGF0ZVJldmlld1RhYixcbiAgcG9wdWxhdGVUYWdsaW5lUmV2aWV3VGFiLFxuICBzd2l0Y2hSZXZpZXdTdWJ0YWIsXG4gIF9sb2FkUmV2aWV3UGFuZSxcbiAgX3VwZGF0ZVBhZ2VFc3RpbWF0ZSxcbiAgaGFuZGxlQWN0aW9uQ2xpY2ssXG4gIGJ1bGtBY3Rpb24sXG4gIF9yZXNvbHZlZEV4cEFjdGlvbixcbiAgX3Jlc29sdmVkU2tpbGxBY3Rpb24sXG59O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvcHJldmlldy1yZW5kZXIuanNcbiAqIFNoYXJlZCwgc2lkZS1lZmZlY3QtZnJlZSBoZWxwZXIgZm9yIHNhZmVseSByZW5kZXJpbmcgQ1YgSFRNTCBpbnRvIGFcbiAqIHNhbmRib3hlZCBpZnJhbWUuIERlbGliZXJhdGVseSBoYXMgbm8gcmVmZXJlbmNlIHRvIHN0YXRlTWFuYWdlciwgYXBpQ2FsbCxcbiAqIG9yIGFueSBmZXRjaCBsb2dpYyBcdTIwMTQgaXQgb25seSB0b3VjaGVzIHRoZSBET00gXHUyMDE0IHNvIGl0IGNhbiBiZSBzYWZlbHlcbiAqIGltcG9ydGVkIGJ5IGJvdGggdGhlIG11dGF0aW5nIGxheW91dC1yZXZpZXcgZmxvdyAobGF5b3V0LWluc3RydWN0aW9uLmpzKVxuICogYW5kIHRoZSByZWFkLW9ubHkgZWFybHktcHJldmlldyBwYW5lbCAoZWFybHktcHJldmlldy1wYW5lbC5qcykgd2l0aG91dFxuICogY3JlYXRpbmcgYSBzaGFyZWQgaW1wb3J0IHBhdGggYmFjayB0byBhbnkgbXV0YXRpbmcgZW5kcG9pbnQuXG4gKi9cblxuLyoqXG4gKiBSZW5kZXIgYW4gSFRNTCBzdHJpbmcgaW50byBhbiBpZnJhbWUgdmlhIHNyY2RvYywgd2l0aCB0aGUgc2FuZGJveFxuICogYXR0cmlidXRlcyBhbHJlYWR5IGVzdGFibGlzaGVkIGZvciBDViBwcmV2aWV3cyBlbHNld2hlcmUgaW4gdGhlIGFwcC5cbiAqIEBwYXJhbSB7SFRNTElGcmFtZUVsZW1lbnR9IGlmcmFtZUVsXG4gKiBAcGFyYW0ge3N0cmluZ30gaHRtbFxuICovXG5mdW5jdGlvbiByZW5kZXJIdG1sSW50b0lmcmFtZShpZnJhbWVFbCwgaHRtbCkge1xuICBpZiAoIWlmcmFtZUVsKSByZXR1cm47XG4gIGlmcmFtZUVsLnNldEF0dHJpYnV0ZSgnc2FuZGJveCcsICdhbGxvdy1zYW1lLW9yaWdpbicpO1xuICBpZnJhbWVFbC5zZXRBdHRyaWJ1dGUoJ3JlZmVycmVycG9saWN5JywgJ25vLXJlZmVycmVyJyk7XG4gIGlmcmFtZUVsLnNyY2RvYyA9IGh0bWw7XG59XG5cbmV4cG9ydCB7IHJlbmRlckh0bWxJbnRvSWZyYW1lIH07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi92YWxpZGF0b3JzLmpzXG4gKiBBUEkgcmVzcG9uc2UgdmFsaWRhdG9ycyBcdTIwMTQgRFRPIG1pcnJvcnMgb2YgUHl0aG9uIGRhdGFjbGFzc2VzIGluIHdlYl9hcHAucHkuXG4gKlxuICogRWFjaCBmdW5jdGlvbiBjaGVja3MgdGhhdCByZXF1aXJlZCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gYW4gQVBJIHJlc3BvbnNlIGFuZFxuICogbG9ncyBhIGNvbnNvbGUud2FybiBpZiBhbnkgYXJlIG1pc3Npbmcgb3IgaGF2ZSBhbiB1bmV4cGVjdGVkIHR5cGUuICBWYWxpZGF0b3JzXG4gKiByZXR1cm4gdGhlIG9yaWdpbmFsIGRhdGEgb2JqZWN0IHVuY2hhbmdlZCBzbyB0aGV5IGNhbiBiZSB1c2VkIGlubGluZS5cbiAqXG4gKiBVcGRhdGUgYm90aCB0aGlzIGZpbGUgYW5kIHRoZSBQeXRob24gZGF0YWNsYXNzZXMgaW4gd2ViX2FwcC5weSB0b2dldGhlclxuICogd2hlbmV2ZXIgYWRkaW5nIG9yIHJlbW92aW5nIHJlc3BvbnNlIGZpZWxkcy5cbiAqXG4gKiBERVBFTkRFTkNJRVM6IG5vbmVcbiAqL1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5jb25zdCBsb2cgPSBnZXRMb2dnZXIoJ3ZhbGlkYXRvcnMnKTtcblxuLyoqIFZhbGlkYXRlIEdFVCAvYXBpL3N0YXR1cyByZXNwb25zZS4gKi9cbmZ1bmN0aW9uIHBhcnNlU3RhdHVzUmVzcG9uc2UoZGF0YSkge1xuICBjb25zdCByZXF1aXJlZCA9IFtcbiAgICAncGhhc2UnLCAnbGxtX3Byb3ZpZGVyJywgJ2pvYl9kZXNjcmlwdGlvbicsXG4gICAgJ3Bvc3RfYW5hbHlzaXNfcXVlc3Rpb25zJywgJ3Bvc3RfYW5hbHlzaXNfYW5zd2VycycsXG4gICAgJ2FsbF9leHBlcmllbmNlX2lkcycsICdhbGxfZXhwZXJpZW5jZXMnLCAnYWxsX3NraWxscycsICdhbGxfYWNoaWV2ZW1lbnRzJyxcbiAgICAncHJvZmVzc2lvbmFsX3N1bW1hcmllcycsICdjb3BpbG90X2F1dGgnLCAnaXRlcmF0aW5nJyxcbiAgICAnZXhwZXJpZW5jZV9kZWNpc2lvbnMnLCAnc2tpbGxfZGVjaXNpb25zJyxcbiAgICAnYWNoaWV2ZW1lbnRfZGVjaXNpb25zJywgJ3B1YmxpY2F0aW9uX2RlY2lzaW9ucycsXG4gICAgJ2V4dHJhX3NraWxscycsICdleHRyYV9za2lsbF9tYXRjaGVzJywgJ3Nlc3Npb25fZmlsZScsXG4gIF07XG4gIGNvbnN0IG1pc3NpbmcgPSByZXF1aXJlZC5maWx0ZXIoayA9PiAhKGsgaW4gZGF0YSkpO1xuICBpZiAobWlzc2luZy5sZW5ndGgpIHtcbiAgICBsb2cud2FybignW3BhcnNlU3RhdHVzUmVzcG9uc2VdIE1pc3NpbmcgZmllbGRzOicsIG1pc3NpbmcsIGRhdGEpO1xuICB9XG4gIGlmICgncG9zdF9hbmFseXNpc19xdWVzdGlvbnMnIGluIGRhdGEgJiYgIUFycmF5LmlzQXJyYXkoZGF0YS5wb3N0X2FuYWx5c2lzX3F1ZXN0aW9ucykpIHtcbiAgICBsb2cud2FybignW3BhcnNlU3RhdHVzUmVzcG9uc2VdIHBvc3RfYW5hbHlzaXNfcXVlc3Rpb25zIHNob3VsZCBiZSBhbiBhcnJheTonLCBkYXRhLnBvc3RfYW5hbHlzaXNfcXVlc3Rpb25zKTtcbiAgfVxuICBpZiAoJ2FsbF9leHBlcmllbmNlX2lkcycgaW4gZGF0YSAmJiAhQXJyYXkuaXNBcnJheShkYXRhLmFsbF9leHBlcmllbmNlX2lkcykpIHtcbiAgICBsb2cud2FybignW3BhcnNlU3RhdHVzUmVzcG9uc2VdIGFsbF9leHBlcmllbmNlX2lkcyBzaG91bGQgYmUgYW4gYXJyYXk6JywgZGF0YS5hbGxfZXhwZXJpZW5jZV9pZHMpO1xuICB9XG4gIHJldHVybiBkYXRhO1xufVxuXG4vKiogVmFsaWRhdGUgR0VUIC9hcGkvc2Vzc2lvbnMgcmVzcG9uc2UuICovXG5mdW5jdGlvbiBwYXJzZVNlc3Npb25MaXN0UmVzcG9uc2UoZGF0YSkge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YS5zZXNzaW9ucykpIHtcbiAgICBsb2cud2FybignW3BhcnNlU2Vzc2lvbkxpc3RSZXNwb25zZV0gc2Vzc2lvbnMgc2hvdWxkIGJlIGFuIGFycmF5OicsIGRhdGEpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGl0ZW1SZXF1aXJlZCA9IFsncGF0aCcsICdwb3NpdGlvbl9uYW1lJywgJ3RpbWVzdGFtcCcsICdwaGFzZScsICdoYXNfam9iJywgJ2hhc19hbmFseXNpcycsICdoYXNfY3VzdG9taXphdGlvbnMnXTtcbiAgICBkYXRhLnNlc3Npb25zLmZvckVhY2goKHMsIGkpID0+IHtcbiAgICAgIGNvbnN0IG1pc3NpbmcgPSBpdGVtUmVxdWlyZWQuZmlsdGVyKGsgPT4gIShrIGluIHMpKTtcbiAgICAgIGlmIChtaXNzaW5nLmxlbmd0aCkgbG9nLndhcm4oYFtwYXJzZVNlc3Npb25MaXN0UmVzcG9uc2VdIHNlc3Npb25zWyR7aX1dIG1pc3NpbmcgZmllbGRzOmAsIG1pc3NpbmcsIHMpO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBkYXRhO1xufVxuXG4vKiogVmFsaWRhdGUgR0VUIC9hcGkvcmV3cml0ZXMgcmVzcG9uc2UuICovXG5mdW5jdGlvbiBwYXJzZVJld3JpdGVzUmVzcG9uc2UoZGF0YSkge1xuICBjb25zdCByZXF1aXJlZCA9IFsnb2snLCAncmV3cml0ZXMnLCAncGVyc3Vhc2lvbl93YXJuaW5ncycsICdwaGFzZSddO1xuICBjb25zdCBtaXNzaW5nID0gcmVxdWlyZWQuZmlsdGVyKGsgPT4gIShrIGluIGRhdGEpKTtcbiAgaWYgKG1pc3NpbmcubGVuZ3RoKSBsb2cud2FybignW3BhcnNlUmV3cml0ZXNSZXNwb25zZV0gTWlzc2luZyBmaWVsZHM6JywgbWlzc2luZywgZGF0YSk7XG4gIGlmICgncmV3cml0ZXMnIGluIGRhdGEgJiYgIUFycmF5LmlzQXJyYXkoZGF0YS5yZXdyaXRlcykpIHtcbiAgICBsb2cud2FybignW3BhcnNlUmV3cml0ZXNSZXNwb25zZV0gcmV3cml0ZXMgc2hvdWxkIGJlIGFuIGFycmF5OicsIGRhdGEucmV3cml0ZXMpO1xuICB9XG4gIHJldHVybiBkYXRhO1xufVxuXG4vKiogVmFsaWRhdGUgUE9TVCAvYXBpL21lc3NhZ2UgYW5kIFBPU1QgL2FwaS9hY3Rpb24gcmVzcG9uc2VzLiAqL1xuZnVuY3Rpb24gcGFyc2VNZXNzYWdlUmVzcG9uc2UoZGF0YSkge1xuICBpZiAoIWRhdGEub2sgJiYgIWRhdGEuZXJyb3IpIHtcbiAgICBsb2cud2FybignW3BhcnNlTWVzc2FnZVJlc3BvbnNlXSBSZXNwb25zZSBoYXMgbmVpdGhlciBvayBub3IgZXJyb3I6JywgZGF0YSk7XG4gIH1cbiAgcmV0dXJuIGRhdGE7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFUyBtb2R1bGUgZXhwb3J0cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmV4cG9ydCB7XG4gIHBhcnNlU3RhdHVzUmVzcG9uc2UsXG4gIHBhcnNlU2Vzc2lvbkxpc3RSZXNwb25zZSxcbiAgcGFyc2VSZXdyaXRlc1Jlc3BvbnNlLFxuICBwYXJzZU1lc3NhZ2VSZXNwb25zZSxcbn07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9yZWNvbW1lbmRhdGlvbi1oZWxwZXJzLmpzXG4gKiBQdXJlIGhlbHBlciBmdW5jdGlvbnMgZm9yIGxvb2tpbmcgdXAgTExNIHJlY29tbWVuZGF0aW9uIGRhdGEgZnJvbSB0aGVcbiAqIC9hcGkvc3RhdHVzIHJlc3BvbnNlIG9iamVjdC4gIFN1cHBvcnRzIGV4cGVyaWVuY2UsIHNraWxsLCBhbmQgYWNoaWV2ZW1lbnRcbiAqIHJlY29tbWVuZGF0aW9ucyB3aXRoIGJhY2t3YXJkcy1jb21wYXRpYmxlIGZsYXQtbGlzdCBmYWxsYmFja3MgZm9yIG9sZFxuICogc2Vzc2lvbiBkYXRhLlxuICpcbiAqIERFUEVOREVOQ0lFUzogbm9uZVxuICovXG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmNvbnN0IGxvZyA9IGdldExvZ2dlcigncmVjb21tZW5kYXRpb24taGVscGVycycpO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEludGVybmFsIGxvb2t1cCBoZWxwZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIExvb2sgdXAgYSBzaW5nbGUgZXhwZXJpZW5jZSBlbnRyeSBpbiBleHBlcmllbmNlX3JlY29tbWVuZGF0aW9ucy4gKi9cbmZ1bmN0aW9uIF9maW5kRXhwUmVjKGV4cElkLCBkYXRhKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShkYXRhLmV4cGVyaWVuY2VfcmVjb21tZW5kYXRpb25zKSkge1xuICAgIGxvZy53YXJuKCdbcmVjb21tZW5kYXRpb25dIGV4cGVyaWVuY2VfcmVjb21tZW5kYXRpb25zIG1pc3Npbmc7IHVzaW5nIGZsYXQtbGlzdCBmYWxsYmFjayBmb3InLCBleHBJZCk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIGRhdGEuZXhwZXJpZW5jZV9yZWNvbW1lbmRhdGlvbnMuZmluZChyID0+IHIuaWQgPT09IGV4cElkIHx8IHIuZXhwZXJpZW5jZV9pZCA9PT0gZXhwSWQpIHx8IG51bGw7XG59XG5cbi8qKiBMb29rIHVwIGEgc2luZ2xlIHNraWxsIGVudHJ5IGluIHNraWxsX3JlY29tbWVuZGF0aW9ucy4gKi9cbmZ1bmN0aW9uIF9maW5kU2tpbGxSZWMoc2tpbGwsIGRhdGEpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEuc2tpbGxfcmVjb21tZW5kYXRpb25zKSkge1xuICAgIGxvZy53YXJuKCdbcmVjb21tZW5kYXRpb25dIHNraWxsX3JlY29tbWVuZGF0aW9ucyBtaXNzaW5nOyB1c2luZyBmbGF0LWxpc3QgZmFsbGJhY2sgZm9yJywgc2tpbGwpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBkYXRhLnNraWxsX3JlY29tbWVuZGF0aW9ucy5maW5kKHIgPT4gci5za2lsbCA9PT0gc2tpbGwgfHwgci5uYW1lID09PSBza2lsbCkgfHwgbnVsbDtcbn1cblxuLyoqIFBhcnNlIGEgcmF3IGNvbmZpZGVuY2Ugc3RyaW5nIHRvIGEge2xldmVsLCB0ZXh0fSBvYmplY3QsIG9yIG51bGwgaWYgdW5yZWNvZ25pc2VkLiAqL1xuZnVuY3Rpb24gX3BhcnNlQ29uZmlkZW5jZShjb25mKSB7XG4gIGNvbnN0IGMgPSAoY29uZiB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgaWYgKGMuaW5jbHVkZXMoJ3ZlcnkgaGlnaCcpKSByZXR1cm4geyBsZXZlbDogJ3ZlcnktaGlnaCcsIHRleHQ6ICdWZXJ5IEhpZ2ggQ29uZmlkZW5jZScgfTtcbiAgaWYgKGMuaW5jbHVkZXMoJ3ZlcnkgbG93JykpICByZXR1cm4geyBsZXZlbDogJ3ZlcnktbG93JywgIHRleHQ6ICdWZXJ5IExvdyBDb25maWRlbmNlJyAgfTtcbiAgaWYgKGMuaW5jbHVkZXMoJ2hpZ2gnKSkgICAgICByZXR1cm4geyBsZXZlbDogJ2hpZ2gnLCAgICAgIHRleHQ6ICdIaWdoIENvbmZpZGVuY2UnICAgICAgfTtcbiAgaWYgKGMuaW5jbHVkZXMoJ21lZGl1bScpKSAgICByZXR1cm4geyBsZXZlbDogJ21lZGl1bScsICAgIHRleHQ6ICdNZWRpdW0gQ29uZmlkZW5jZScgICAgfTtcbiAgaWYgKGMuaW5jbHVkZXMoJ2xvdycpKSAgICAgICByZXR1cm4geyBsZXZlbDogJ2xvdycsICAgICAgIHRleHQ6ICdMb3cgQ29uZmlkZW5jZScgICAgICAgfTtcbiAgcmV0dXJuIG51bGw7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRXhwZXJpZW5jZSByZWNvbW1lbmRhdGlvbnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiBnZXRFeHBlcmllbmNlUmVjb21tZW5kYXRpb24oZXhwSWQsIGRhdGEpIHtcbiAgY29uc3QgcmVjID0gX2ZpbmRFeHBSZWMoZXhwSWQsIGRhdGEpO1xuICBpZiAocmVjICYmIHJlYy5yZWNvbW1lbmRhdGlvbikgcmV0dXJuIHJlYy5yZWNvbW1lbmRhdGlvbjtcbiAgLy8gQmFja3dhcmRzLWNvbXBhdCBmbGF0LWxpc3QgZmFsbGJhY2tcbiAgaWYgKGRhdGEub21pdHRlZF9leHBlcmllbmNlcyAgICAgJiYgZGF0YS5vbWl0dGVkX2V4cGVyaWVuY2VzLmluY2x1ZGVzKGV4cElkKSkgICAgIHJldHVybiAnT21pdCc7XG4gIGlmIChkYXRhLnJlY29tbWVuZGVkX2V4cGVyaWVuY2VzICYmIGRhdGEucmVjb21tZW5kZWRfZXhwZXJpZW5jZXMuaW5jbHVkZXMoZXhwSWQpKSByZXR1cm4gJ0VtcGhhc2l6ZSc7XG4gIHJldHVybiAnSW5jbHVkZSc7XG59XG5cbmZ1bmN0aW9uIGdldENvbmZpZGVuY2VMZXZlbChleHBJZCwgZGF0YSkge1xuICBjb25zdCByZWMgPSBfZmluZEV4cFJlYyhleHBJZCwgZGF0YSk7XG4gIHJldHVybiAocmVjICYmIF9wYXJzZUNvbmZpZGVuY2UocmVjLmNvbmZpZGVuY2UpKSB8fCB7IGxldmVsOiAnbWVkaXVtJywgdGV4dDogJ01lZGl1bSBDb25maWRlbmNlJyB9O1xufVxuXG5mdW5jdGlvbiBnZXRFeHBlcmllbmNlUmVhc29uaW5nKGV4cElkLCBkYXRhKSB7XG4gIGNvbnN0IHJlYyA9IF9maW5kRXhwUmVjKGV4cElkLCBkYXRhKTtcbiAgcmV0dXJuIChyZWMgJiYgcmVjLnJlYXNvbmluZykgfHwgJ1RoaXMgZXhwZXJpZW5jZSB3YXMgc2VsZWN0ZWQgYmFzZWQgb24gaXRzIHJlbGV2YW5jZSB0byB0aGUgcG9zaXRpb24gcmVxdWlyZW1lbnRzLic7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU2tpbGwgcmVjb21tZW5kYXRpb25zXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gZ2V0U2tpbGxSZWNvbW1lbmRhdGlvbihza2lsbCwgZGF0YSkge1xuICBjb25zdCByZWMgPSBfZmluZFNraWxsUmVjKHNraWxsLCBkYXRhKTtcbiAgaWYgKHJlYyAmJiByZWMucmVjb21tZW5kYXRpb24pIHJldHVybiByZWMucmVjb21tZW5kYXRpb247XG4gIGlmIChkYXRhLnJlY29tbWVuZGVkX3NraWxscyAmJiBkYXRhLnJlY29tbWVuZGVkX3NraWxscy5pbmNsdWRlcyhza2lsbCkpIHJldHVybiAnSW5jbHVkZSc7XG4gIHJldHVybiAnT21pdCc7XG59XG5cbmZ1bmN0aW9uIGdldFNraWxsQ29uZmlkZW5jZShza2lsbCwgZGF0YSkge1xuICBjb25zdCByZWMgPSBfZmluZFNraWxsUmVjKHNraWxsLCBkYXRhKTtcbiAgaWYgKHJlYykge1xuICAgIGNvbnN0IHBhcnNlZCA9IF9wYXJzZUNvbmZpZGVuY2UocmVjLmNvbmZpZGVuY2UpO1xuICAgIGlmIChwYXJzZWQpIHJldHVybiBwYXJzZWQ7XG4gIH1cbiAgaWYgKGRhdGEucmVjb21tZW5kZWRfc2tpbGxzICYmIGRhdGEucmVjb21tZW5kZWRfc2tpbGxzLmluY2x1ZGVzKHNraWxsKSkge1xuICAgIHJldHVybiB7IGxldmVsOiAnbWVkaXVtJywgdGV4dDogJ01lZGl1bSBDb25maWRlbmNlJyB9O1xuICB9XG4gIHJldHVybiB7IGxldmVsOiAnbG93JywgdGV4dDogJ0xvdyBDb25maWRlbmNlJyB9O1xufVxuXG5mdW5jdGlvbiBnZXRTa2lsbFJlYXNvbmluZyhza2lsbCwgZGF0YSkge1xuICBjb25zdCByZWMgPSBfZmluZFNraWxsUmVjKHNraWxsLCBkYXRhKTtcbiAgaWYgKHJlYyAmJiByZWMucmVhc29uaW5nKSByZXR1cm4gcmVjLnJlYXNvbmluZztcbiAgaWYgKGRhdGEucmVjb21tZW5kZWRfc2tpbGxzICYmIGRhdGEucmVjb21tZW5kZWRfc2tpbGxzLmluY2x1ZGVzKHNraWxsKSkge1xuICAgIHJldHVybiAnVGhpcyBza2lsbCB3YXMgaWRlbnRpZmllZCBhcyByZWxldmFudCB0byB0aGUgcG9zaXRpb24gcmVxdWlyZW1lbnRzLic7XG4gIH1cbiAgcmV0dXJuICdUaGlzIHNraWxsIHdhcyBub3Qgc3BlY2lmaWNhbGx5IG1lbnRpb25lZCBpbiB0aGUgam9iIHJlcXVpcmVtZW50cy4nO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEFjaGlldmVtZW50IHJlY29tbWVuZGF0aW9uc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIGdldEFjaGlldmVtZW50UmVjb21tZW5kYXRpb24oYWNoSWQsIGRhdGEpIHtcbiAgaWYgKGRhdGEuYWNoaWV2ZW1lbnRfcmVjb21tZW5kYXRpb25zICYmIEFycmF5LmlzQXJyYXkoZGF0YS5hY2hpZXZlbWVudF9yZWNvbW1lbmRhdGlvbnMpKSB7XG4gICAgY29uc3QgcmVjID0gZGF0YS5hY2hpZXZlbWVudF9yZWNvbW1lbmRhdGlvbnMuZmluZChyID0+IHIuaWQgPT09IGFjaElkKTtcbiAgICBpZiAocmVjICYmIHJlYy5yZWNvbW1lbmRhdGlvbikgcmV0dXJuIHJlYy5yZWNvbW1lbmRhdGlvbjtcbiAgfVxuICBpZiAoZGF0YS5yZWNvbW1lbmRlZF9hY2hpZXZlbWVudHMgJiYgZGF0YS5yZWNvbW1lbmRlZF9hY2hpZXZlbWVudHMuaW5jbHVkZXMoYWNoSWQpKSB7XG4gICAgcmV0dXJuICdJbmNsdWRlJztcbiAgfVxuICByZXR1cm4gJ0RlLWVtcGhhc2l6ZSc7XG59XG5cbmZ1bmN0aW9uIGdldEFjaGlldmVtZW50Q29uZmlkZW5jZShhY2hJZCwgZGF0YSwgYWNoSW1wb3J0YW5jZSkge1xuICBpZiAoZGF0YS5hY2hpZXZlbWVudF9yZWNvbW1lbmRhdGlvbnMgJiYgQXJyYXkuaXNBcnJheShkYXRhLmFjaGlldmVtZW50X3JlY29tbWVuZGF0aW9ucykpIHtcbiAgICBjb25zdCByZWMgPSBkYXRhLmFjaGlldmVtZW50X3JlY29tbWVuZGF0aW9ucy5maW5kKHIgPT4gci5pZCA9PT0gYWNoSWQpO1xuICAgIGlmIChyZWMgJiYgcmVjLmNvbmZpZGVuY2UpIHtcbiAgICAgIGNvbnN0IGNvbmYgPSByZWMuY29uZmlkZW5jZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKGNvbmYuaW5jbHVkZXMoJ3ZlcnkgaGlnaCcpKSByZXR1cm4geyBsZXZlbDogJ3ZlcnktaGlnaCcsIHRleHQ6ICdWZXJ5IEhpZ2gnIH07XG4gICAgICBpZiAoY29uZi5pbmNsdWRlcygnaGlnaCcpKSAgICAgIHJldHVybiB7IGxldmVsOiAnaGlnaCcsICAgICAgdGV4dDogJ0hpZ2gnICAgICAgfTtcbiAgICAgIGlmIChjb25mLmluY2x1ZGVzKCdtZWRpdW0nKSkgICAgcmV0dXJuIHsgbGV2ZWw6ICdtZWRpdW0nLCAgICB0ZXh0OiAnTWVkaXVtJyAgICB9O1xuICAgICAgaWYgKGNvbmYuaW5jbHVkZXMoJ3ZlcnkgbG93JykpICByZXR1cm4geyBsZXZlbDogJ3ZlcnktbG93JywgIHRleHQ6ICdWZXJ5IExvdycgIH07XG4gICAgICBpZiAoY29uZi5pbmNsdWRlcygnbG93JykpICAgICAgIHJldHVybiB7IGxldmVsOiAnbG93JywgICAgICAgdGV4dDogJ0xvdycgICAgICAgfTtcbiAgICB9XG4gIH1cbiAgY29uc3QgaW1wID0gYWNoSW1wb3J0YW5jZSB8fCA1O1xuICBpZiAoaW1wID49IDkpIHJldHVybiB7IGxldmVsOiAndmVyeS1oaWdoJywgdGV4dDogJ1ZlcnkgSGlnaCcgfTtcbiAgaWYgKGltcCA+PSA3KSByZXR1cm4geyBsZXZlbDogJ2hpZ2gnLCAgICAgIHRleHQ6ICdIaWdoJyAgICAgIH07XG4gIGlmIChpbXAgPj0gNSkgcmV0dXJuIHsgbGV2ZWw6ICdtZWRpdW0nLCAgICB0ZXh0OiAnTWVkaXVtJyAgICB9O1xuICBpZiAoaW1wID49IDMpIHJldHVybiB7IGxldmVsOiAnbG93JywgICAgICAgdGV4dDogJ0xvdycgICAgICAgfTtcbiAgcmV0dXJuIHsgbGV2ZWw6ICd2ZXJ5LWxvdycsIHRleHQ6ICdWZXJ5IExvdycgfTtcbn1cblxuZnVuY3Rpb24gZ2V0QWNoaWV2ZW1lbnRSZWFzb25pbmcoYWNoSWQsIGRhdGEsIGFjaCkge1xuICBpZiAoZGF0YS5hY2hpZXZlbWVudF9yZWNvbW1lbmRhdGlvbnMgJiYgQXJyYXkuaXNBcnJheShkYXRhLmFjaGlldmVtZW50X3JlY29tbWVuZGF0aW9ucykpIHtcbiAgICBjb25zdCByZWMgPSBkYXRhLmFjaGlldmVtZW50X3JlY29tbWVuZGF0aW9ucy5maW5kKHIgPT4gci5pZCA9PT0gYWNoSWQpO1xuICAgIGlmIChyZWMgJiYgcmVjLnJlYXNvbmluZykgcmV0dXJuIHJlYy5yZWFzb25pbmc7XG4gIH1cbiAgY29uc3QgcmVsZXZhbnRGb3IgPSAoYWNoLnJlbGV2YW50X2ZvciB8fCBbXSkuam9pbignLCAnKTtcbiAgaWYgKGRhdGEucmVjb21tZW5kZWRfYWNoaWV2ZW1lbnRzICYmIGRhdGEucmVjb21tZW5kZWRfYWNoaWV2ZW1lbnRzLmluY2x1ZGVzKGFjaElkKSkge1xuICAgIHJldHVybiByZWxldmFudEZvclxuICAgICAgPyBgUmVjb21tZW5kZWQgZm9yIHRoaXMgcm9sZS4gUmVsZXZhbnQgZm9yOiAke3JlbGV2YW50Rm9yfS5gXG4gICAgICA6ICdSZWNvbW1lbmRlZCBieSBBSSBhcyByZWxldmFudCB0byB0aGlzIHJvbGUuJztcbiAgfVxuICByZXR1cm4gcmVsZXZhbnRGb3JcbiAgICA/IGBSZWxldmFudCBmb3I6ICR7cmVsZXZhbnRGb3J9LiBOb3Qgc3BlY2lmaWNhbGx5IGhpZ2hsaWdodGVkIGZvciB0aGlzIHJvbGUuYFxuICAgIDogJ05vdCBzcGVjaWZpY2FsbHkgaGlnaGxpZ2h0ZWQgZm9yIHRoaXMgcm9sZSBiYXNlZCBvbiBqb2IgcmVxdWlyZW1lbnRzLic7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRmFsbGJhY2sgcXVlc3Rpb24gZ2VuZXJhdGlvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIGJ1aWxkRmFsbGJhY2tQb3N0QW5hbHlzaXNRdWVzdGlvbnMoZGF0YSkge1xuICBjb25zdCBxdWVzdGlvbnMgPSBbXTtcblxuICBpZiAoZGF0YS5yb2xlX2xldmVsKSB7XG4gICAgcXVlc3Rpb25zLnB1c2goe1xuICAgICAgcXVlc3Rpb246IGBUaGlzIHJvbGUgYXBwZWFycyB0byBiZSBhdCAke2RhdGEucm9sZV9sZXZlbH0gbGV2ZWwuIFNob3VsZCBJIGVtcGhhc2l6ZSB5b3VyIG1vc3Qgc2VuaW9yIGV4cGVyaWVuY2VzIG9yIGluY2x1ZGUgYSBicm9hZGVyIHJhbmdlIHRvIHNob3cgY2FyZWVyIHByb2dyZXNzaW9uP2AsXG4gICAgICB0eXBlOiAnZXhwZXJpZW5jZV9sZXZlbCcsXG4gICAgICBjaG9pY2VzOiBbJ0VtcGhhc2l6ZSBtb3N0IHNlbmlvcicsICdCcm9hZGVyIGNhcmVlciBwcm9ncmVzc2lvbicsICdMZXQgeW91IGRlY2lkZSBiYXNlZCBvbiBhbmFseXNpcyddLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKGRhdGEucmVxdWlyZWRfc2tpbGxzICYmIGRhdGEucmVxdWlyZWRfc2tpbGxzLnNvbWUoc2tpbGwgPT5cbiAgICAgIHNraWxsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2xlYWRlcnNoaXAnKSB8fFxuICAgICAgc2tpbGwudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnbWFuYWdlbWVudCcpIHx8XG4gICAgICBza2lsbC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCd0ZWFtJykpKSB7XG4gICAgcXVlc3Rpb25zLnB1c2goe1xuICAgICAgcXVlc3Rpb246ICdUaGlzIHJvbGUgaGFzIGxlYWRlcnNoaXAgY29tcG9uZW50cy4gV291bGQgeW91IHByZWZlciBtZSB0byBlbXBoYXNpemUgeW91ciBtYW5hZ2VtZW50IGV4cGVyaWVuY2Ugb3IgZm9jdXMgbW9yZSBvbiB5b3VyIHRlY2huaWNhbCBjb250cmlidXRpb25zPycsXG4gICAgICB0eXBlOiAnbGVhZGVyc2hpcF9mb2N1cycsXG4gICAgICBjaG9pY2VzOiBbJ0VtcGhhc2l6ZSBtYW5hZ2VtZW50JywgJ0ZvY3VzIG9uIHRlY2huaWNhbCcsICdCYWxhbmNlIGJvdGggZXF1YWxseSddLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKGRhdGEuZG9tYWluKSB7XG4gICAgcXVlc3Rpb25zLnB1c2goe1xuICAgICAgcXVlc3Rpb246IGBUaGUgcm9sZSBpcyBpbiAke2RhdGEuZG9tYWlufS4gRG8geW91IGhhdmUgcGFydGljdWxhciBwcm9qZWN0cyBvciBhY2hpZXZlbWVudHMgaW4gdGhpcyBkb21haW4gdGhhdCB5b3UnZCBsaWtlIG1lIHRvIGhpZ2hsaWdodD9gLFxuICAgICAgdHlwZTogJ2RvbWFpbl9leHBlcnRpc2UnLFxuICAgICAgY2hvaWNlczogWydIaWdobGlnaHQgZG9tYWluLXNwZWNpZmljIGFjaGlldmVtZW50cycsICdVc2UgYWxsIGF2YWlsYWJsZSBleHBlcmllbmNlJywgJ1ByaW9yaXRpemUgbW9zdCByZWNlbnQgd29yayddLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKGRhdGEuY29tcGFueSkge1xuICAgIHF1ZXN0aW9ucy5wdXNoKHtcbiAgICAgIHF1ZXN0aW9uOiBgRm9yICR7ZGF0YS5jb21wYW55fSwgd291bGQgeW91IGxpa2UgbWUgdG8gdGFpbG9yIGVtcGhhc2lzIHRvd2FyZCB0aGVpciBjdWx0dXJlIGFuZCB2YWx1ZXM/IElmIHNvLCB3aGF0IHNob3VsZCBJIHByaW9yaXRpemU/YCxcbiAgICAgIHR5cGU6ICdjb21wYW55X2N1bHR1cmUnLFxuICAgICAgY2hvaWNlczogWydSZXNlYXJjaC1kcml2ZW4gLyBhY2FkZW1pYycsICdJbmR1c3RyeSAvIGNvbW1lcmNpYWwgaW1wYWN0JywgJ0lubm92YXRpb24gLyBzdGFydHVwJywgJ1VzZSBjdWx0dXJhbCBpbmRpY2F0b3JzIGZyb20gam9iIGRlc2NyaXB0aW9uJ10sXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gcXVlc3Rpb25zO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgRVMgbW9kdWxlIGV4cG9ydHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5leHBvcnQge1xuICBnZXRFeHBlcmllbmNlUmVjb21tZW5kYXRpb24sIGdldENvbmZpZGVuY2VMZXZlbCwgZ2V0RXhwZXJpZW5jZVJlYXNvbmluZyxcbiAgZ2V0U2tpbGxSZWNvbW1lbmRhdGlvbiwgZ2V0U2tpbGxDb25maWRlbmNlLCBnZXRTa2lsbFJlYXNvbmluZyxcbiAgZ2V0QWNoaWV2ZW1lbnRSZWNvbW1lbmRhdGlvbiwgZ2V0QWNoaWV2ZW1lbnRDb25maWRlbmNlLCBnZXRBY2hpZXZlbWVudFJlYXNvbmluZyxcbiAgYnVpbGRGYWxsYmFja1Bvc3RBbmFseXNpc1F1ZXN0aW9ucyxcbn07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi91aS1oZWxwZXJzLmpzXG4gKiBMaWdodHdlaWdodCBET00gaGVscGVyczogdG9hc3RzLCBhbGVydC9jb25maXJtIG1vZGFscywgY2hhdCB0b2dnbGUsIGFuZFxuICogd29ya2Zsb3ctc3RhZ2UgYWN0aW9uLWJ1dHRvbiBtYW5hZ2VtZW50LlxuICpcbiAqIERFUEVOREVOQ0lFUzogdWktY29yZS5qcyBleHBvcnRzICh0cmFwRm9jdXMsIHJlc3RvcmVGb2N1cywgc2V0SW5pdGlhbEZvY3VzLFxuICogICAgICAgICAgICAgICBwdXNoRm9jdXNTdGFjaykgYXZhaWxhYmxlIG9uIGdsb2JhbFRoaXMgYXQgcnVudGltZS5cbiAqL1xuXG5pbXBvcnQgeyBzdGF0ZU1hbmFnZXIsIEdFTkVSQVRJT05fU1RBVEVfRVZFTlQgfSBmcm9tICcuL3N0YXRlLW1hbmFnZXIuanMnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEFsZXJ0IG1vZGFsIChpbmZvcm1hdGlvbmFsIFx1MjAxNCBzaW5nbGUgT0sgYnV0dG9uKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIF9zZXRNb2RhbFRleHQoZWwsIG1lc3NhZ2UpIHtcbiAgZWwudGV4dENvbnRlbnQgPSAnJztcbiAgY29uc3QgcGFydHMgPSBTdHJpbmcobWVzc2FnZSB8fCAnJykuc3BsaXQoJ1xcbicpO1xuICBwYXJ0cy5mb3JFYWNoKChwYXJ0LCBpKSA9PiB7XG4gICAgZWwuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUocGFydCkpO1xuICAgIGlmIChpIDwgcGFydHMubGVuZ3RoIC0gMSkgZWwuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnInKSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzaG93QWxlcnRNb2RhbCh0aXRsZSwgbWVzc2FnZSkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWxlcnQtbW9kYWwtdGl0bGUnKS50ZXh0Q29udGVudCA9IHRpdGxlO1xuICBfc2V0TW9kYWxUZXh0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhbGVydC1tb2RhbC1tZXNzYWdlJyksIG1lc3NhZ2UpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWxlcnQtbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAvLyBwdXNoRm9jdXNTdGFjayAoR0FQLTE5NykgcGFpcnMgd2l0aCB0cmFwRm9jdXMvcmVzdG9yZUZvY3VzIGJlbG93IFx1MjAxNCB1c2luZ1xuICAvLyB0aGUgc2hhcmVkIGZvY3VzLXN0YWNrIG1lY2hhbmlzbSwgbm90IGEgbG9jYWwgdmFyaWFibGUsIHNvIGNsb3NlQWxlcnRNb2RhbFxuICAvLyBhbHNvIHBvcHMgdGhlIGtleWRvd24gbGlzdGVuZXIgdHJhcEZvY3VzIHJlZ2lzdGVycyBvbiBkb2N1bWVudC4gQSBwcmlvclxuICAvLyB2ZXJzaW9uIHRyYWNrZWQgaXRzIG93biBgX2FsZXJ0UHJldmlvdXNGb2N1c2AgYW5kIG5ldmVyIGNhbGxlZFxuICAvLyByZXN0b3JlRm9jdXMoKSwgd2hpY2ggbGVmdCB0aGF0IHRyYXBGb2N1cyBsaXN0ZW5lciBwZXJtYW5lbnRseSBhdHRhY2hlZFxuICAvLyBhZnRlciBldmVyeSBhbGVydCBtb2RhbCBjbG9zZS5cbiAgaWYgKHR5cGVvZiBwdXNoRm9jdXNTdGFjayA9PT0gJ2Z1bmN0aW9uJykgcHVzaEZvY3VzU3RhY2soZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7XG4gIGlmICh0eXBlb2Ygc2V0SW5pdGlhbEZvY3VzID09PSAnZnVuY3Rpb24nKSBzZXRJbml0aWFsRm9jdXMoJ2FsZXJ0LW1vZGFsLW92ZXJsYXknKTtcbiAgaWYgKHR5cGVvZiB0cmFwRm9jdXMgPT09ICdmdW5jdGlvbicpIHRyYXBGb2N1cygnYWxlcnQtbW9kYWwtb3ZlcmxheScpO1xufVxuXG5mdW5jdGlvbiBjbG9zZUFsZXJ0TW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhbGVydC1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgaWYgKHR5cGVvZiByZXN0b3JlRm9jdXMgPT09ICdmdW5jdGlvbicpIHJlc3RvcmVGb2N1cygpO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIENvbmZpcm0gbW9kYWwgKHJldHVybnMgYSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdHJ1ZS9mYWxzZSlcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5sZXQgX2NvbmZpcm1SZXNvbHZlID0gbnVsbDtcbmxldCBfY29uZmlybVByZXZpb3VzRm9jdXMgPSBudWxsO1xuXG5mdW5jdGlvbiBzaG93Q29uZmlybU1vZGFsKHRpdGxlLCBtZXNzYWdlLCBva0xhYmVsID0gJ09LJykge1xuICBfY29uZmlybVByZXZpb3VzRm9jdXMgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29uZmlybS1tb2RhbC10aXRsZScpLnRleHRDb250ZW50ID0gdGl0bGU7XG4gIF9zZXRNb2RhbFRleHQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbmZpcm0tbW9kYWwtbWVzc2FnZScpLCBtZXNzYWdlKTtcbiAgY29uc3Qgb2tCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29uZmlybS1tb2RhbC1vaycpO1xuICBpZiAob2tCdG4pIG9rQnRuLnRleHRDb250ZW50ID0gb2tMYWJlbDtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbmZpcm0tbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICBpZiAob2tCdG4pIG9rQnRuLmZvY3VzKCk7XG4gIGlmICh0eXBlb2YgdHJhcEZvY3VzID09PSAnZnVuY3Rpb24nKSB0cmFwRm9jdXMoJ2NvbmZpcm0tbW9kYWwtb3ZlcmxheScpO1xuICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7IF9jb25maXJtUmVzb2x2ZSA9IHJlc29sdmU7IH0pO1xufVxuXG5mdW5jdGlvbiBjbG9zZUNvbmZpcm1Nb2RhbChyZXN1bHQpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbmZpcm0tbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIGlmICh0eXBlb2YgcmVzdG9yZUZvY3VzID09PSAnZnVuY3Rpb24nKSByZXN0b3JlRm9jdXMoKTtcbiAgaWYgKF9jb25maXJtUmVzb2x2ZSkgeyBfY29uZmlybVJlc29sdmUocmVzdWx0KTsgX2NvbmZpcm1SZXNvbHZlID0gbnVsbDsgfVxuICBpZiAoX2NvbmZpcm1QcmV2aW91c0ZvY3VzICYmIHR5cGVvZiBfY29uZmlybVByZXZpb3VzRm9jdXMuZm9jdXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBfY29uZmlybVByZXZpb3VzRm9jdXMuZm9jdXMoKTtcbiAgfVxuICBfY29uZmlybVByZXZpb3VzRm9jdXMgPSBudWxsO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFRvYXN0IG5vdGlmaWNhdGlvbnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiBzaG93VG9hc3QobWVzc2FnZSwgdHlwZSA9ICdzdWNjZXNzJywgZHVyYXRpb24gPSAzMDAwKSB7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2FzdC1jb250YWluZXInKTtcbiAgaWYgKCFjb250YWluZXIpIHJldHVybjtcbiAgY29uc3QgdG9hc3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgdG9hc3QuY2xhc3NOYW1lID0gYHRvYXN0IHRvYXN0LSR7dHlwZX1gO1xuICB0b2FzdC50ZXh0Q29udGVudCA9IG1lc3NhZ2U7XG4gIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0b2FzdCk7XG4gIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7IHRvYXN0LmNsYXNzTGlzdC5hZGQoJ3RvYXN0LXNob3cnKTsgfSk7IH0pO1xuICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICB0b2FzdC5jbGFzc0xpc3QucmVtb3ZlKCd0b2FzdC1zaG93Jyk7XG4gICAgdG9hc3QuYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsICgpID0+IHRvYXN0LnJlbW92ZSgpLCB7IG9uY2U6IHRydWUgfSk7XG4gIH0sIGR1cmF0aW9uKTtcbn1cblxuZnVuY3Rpb24gcmVmcmVzaExheW91dFN0YXR1c1VJKCkge1xuICBjb25zdCBsYXlvdXRDaGlwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xheW91dC1mcmVzaG5lc3MtY2hpcCcpO1xuICBjb25zdCBsYXlvdXRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGF5b3V0LWJ0bicpO1xuICBjb25zdCBmcmVzaG5lc3MgPSBzdGF0ZU1hbmFnZXIuZ2V0TGF5b3V0RnJlc2huZXNzKCk7XG4gIGNvbnN0IGdlbmVyYXRpb25TdGF0ZSA9IHN0YXRlTWFuYWdlci5nZXRHZW5lcmF0aW9uU3RhdGUoKTtcblxuICBpZiAobGF5b3V0Q2hpcCkge1xuICAgIGxheW91dENoaXAuc3R5bGUuZGlzcGxheSA9IGZyZXNobmVzcy5zaG93Q2hpcCA/ICcnIDogJ25vbmUnO1xuICAgIGxheW91dENoaXAuY2xhc3NOYW1lID0gYGxheW91dC1mcmVzaG5lc3MtY2hpcCAke2ZyZXNobmVzcy50b25lfWA7XG4gICAgbGF5b3V0Q2hpcC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCBmcmVzaG5lc3MuYXJpYUxhYmVsIHx8ICcnKTtcbiAgICBsYXlvdXRDaGlwLmlubmVySFRNTCA9IGZyZXNobmVzcy5zaG93Q2hpcFxuICAgICAgPyBgPHNwYW4gY2xhc3M9XCJsYXlvdXQtZnJlc2huZXNzLWljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj4ke2ZyZXNobmVzcy5pc0NyaXRpY2FsID8gJ1x1MjFCQicgOiAoZnJlc2huZXNzLmlzU3RhbGUgPyAnIScgOiAnXHUyNzEzJyl9PC9zcGFuPjxzcGFuIGNsYXNzPVwibGF5b3V0LWZyZXNobmVzcy1sYWJlbFwiPiR7ZnJlc2huZXNzLmxhYmVsfTwvc3Bhbj5gXG4gICAgICA6ICcnO1xuICB9XG5cbiAgaWYgKGxheW91dEJ0bikge1xuICAgIGlmIChmcmVzaG5lc3MuaXNTdGFsZSkge1xuICAgICAgbGF5b3V0QnRuLnRleHRDb250ZW50ID0gJ1x1MjFCQiBSZWdlbmVyYXRlIFByZXZpZXcnO1xuICAgICAgbGF5b3V0QnRuLnRpdGxlID0gJ1ByZXZpZXcgaXMgb3V0IG9mIGRhdGUgXHUyMDE0IHJlZ2VuZXJhdGUgYmVmb3JlIGNvbmZpcm1pbmcgbGF5b3V0JztcbiAgICB9IGVsc2UgaWYgKGdlbmVyYXRpb25TdGF0ZS5sYXlvdXRDb25maXJtZWQgfHwgZ2VuZXJhdGlvblN0YXRlLnBoYXNlID09PSAnY29uZmlybWVkJykge1xuICAgICAgbGF5b3V0QnRuLnRleHRDb250ZW50ID0gJ1x1MkIwN1x1RkUwRiBHZW5lcmF0ZSBGaW5hbCBGaWxlcyc7XG4gICAgICBsYXlvdXRCdG4udGl0bGUgPSAnTGF5b3V0IGNvbmZpcm1lZCBcdTIwMTQgcHJvZHVjZSBmaW5hbCBzdWJtaXNzaW9uLXJlYWR5IERPQ1ggYW5kIFBERiBmaWxlcyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxheW91dEJ0bi50ZXh0Q29udGVudCA9ICdcdTI3MDUgQ29uZmlybSBMYXlvdXQnO1xuICAgICAgbGF5b3V0QnRuLnRpdGxlID0gJ1N0ZXAgMiBvZiAzOiBDb25maXJtIHRoZSBsYXlvdXQgbG9va3MgcmlnaHQgYmVmb3JlIGdlbmVyYXRpbmcgZmluYWwgZmlsZXMnO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVMYXlvdXRGcmVzaG5lc3NDaGlwQ2xpY2soKSB7XG4gIGlmICh0eXBlb2YgdXBkYXRlVGFiQmFyRm9yU3RhZ2UgPT09ICdmdW5jdGlvbicpIHVwZGF0ZVRhYkJhckZvclN0YWdlKCdsYXlvdXQnKTtcbiAgaWYgKHR5cGVvZiB1cGRhdGVBY3Rpb25CdXR0b25zID09PSAnZnVuY3Rpb24nKSB1cGRhdGVBY3Rpb25CdXR0b25zKCdsYXlvdXQnKTtcbiAgaWYgKHR5cGVvZiBzd2l0Y2hUYWIgPT09ICdmdW5jdGlvbicpIHN3aXRjaFRhYignbGF5b3V0Jyk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gV29ya2Zsb3ctc3RhZ2UgcHJpbWFyeSBhY3Rpb24gYnV0dG9uc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBBbGwgc3RhZ2Utc3BlY2lmaWMgcHJpbWFyeSBhY3Rpb24gYnV0dG9uIElEcyAoZXhjbHVkZXMgcmVzZXQgd2hpY2ggaXMgYWx3YXlzIHZpc2libGUpLiAqL1xuY29uc3QgX1NUQUdFX0JVVFRPTlMgPSBbXG4gICdhbmFseXplLWJ0bicsICdyZWNvbW1lbmQtYnRuJywgJ2dlbmVyYXRlLWJ0bicsXG4gICdyZXdyaXRlLWJ0bicsICdzcGVsbC1idG4nLCAnZ2VuZXJhdGUtcHJvY2VlZC1idG4nLFxuICAnbGF5b3V0LWJ0bicsICdmaW5hbC1nZW5lcmF0ZS1wcm9jZWVkLWJ0bicsICdmaW5hbGlzZS1hY3Rpb24tYnRuJyxcbl07XG5cbi8qKiBNYXBzIGVhY2ggd29ya2Zsb3cgc3RhZ2UgdG8gaXRzIG9uZSBwcmltYXJ5IGFjdGlvbiBidXR0b24uICovXG5jb25zdCBfU1RBR0VfQlVUVE9OX01BUCA9IHtcbiAgam9iOiAgICAgICAgICAgICdhbmFseXplLWJ0bicsXG4gIGFuYWx5c2lzOiAgICAgICAncmVjb21tZW5kLWJ0bicsXG4gIGN1c3RvbWl6YXRpb25zOiAnZ2VuZXJhdGUtYnRuJyxcbiAgcmV3cml0ZTogICAgICAgICdyZXdyaXRlLWJ0bicsXG4gIHNwZWxsOiAgICAgICAgICAnc3BlbGwtYnRuJyxcbiAgZ2VuZXJhdGU6ICAgICAgICdnZW5lcmF0ZS1wcm9jZWVkLWJ0bicsXG4gIGxheW91dDogICAgICAgICAnbGF5b3V0LWJ0bicsXG4gIGZpbmFsX2dlbmVyYXRlOiAnZmluYWwtZ2VuZXJhdGUtcHJvY2VlZC1idG4nLFxuICBmaW5hbGlzZTogICAgICAgJ2ZpbmFsaXNlLWFjdGlvbi1idG4nLFxufTtcblxuLyoqXG4gKiBTaG93IG9ubHkgdGhlIHByaW1hcnkgYWN0aW9uIGJ1dHRvbiBmb3IgdGhlIGdpdmVuIHdvcmtmbG93IHN0YWdlLlxuICogUmVzZXQgaXMgYWx3YXlzIHZpc2libGUuICBBbGwgb3RoZXIgc3RhZ2UgYnV0dG9ucyBhcmUgaGlkZGVuLlxuICovXG5mdW5jdGlvbiB1cGRhdGVBY3Rpb25CdXR0b25zKHN0YWdlKSB7XG4gIGNvbnN0IGFjdGl2ZUlkID0gX1NUQUdFX0JVVFRPTl9NQVBbc3RhZ2VdIHx8IG51bGw7XG4gIF9TVEFHRV9CVVRUT05TLmZvckVhY2goaWQgPT4ge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgIGlmIChlbCkgZWwuc3R5bGUuZGlzcGxheSA9IChpZCA9PT0gYWN0aXZlSWQpID8gJycgOiAnbm9uZSc7XG4gIH0pO1xuICByZWZyZXNoTGF5b3V0U3RhdHVzVUkoKTtcbn1cblxuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEdFTkVSQVRJT05fU1RBVEVfRVZFTlQsIHJlZnJlc2hMYXlvdXRTdGF0dXNVSSk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFUyBtb2R1bGUgZXhwb3J0cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmV4cG9ydCB7XG4gIHNob3dBbGVydE1vZGFsLCBjbG9zZUFsZXJ0TW9kYWwsXG4gIHNob3dDb25maXJtTW9kYWwsIGNsb3NlQ29uZmlybU1vZGFsLFxuICBzaG93VG9hc3QsXG4gIHJlZnJlc2hMYXlvdXRTdGF0dXNVSSxcbiAgaGFuZGxlTGF5b3V0RnJlc2huZXNzQ2hpcENsaWNrLFxuICB1cGRhdGVBY3Rpb25CdXR0b25zLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogU2hhcmVkIHByb3Bvc2FsLXJldmlldyByb3cgcmVuZGVyZXIsIGV4dHJhY3RlZCBmcm9tIHdlYi9oYXJ2ZXN0LmpzIHNvIHRoZVxuICogR0FQLTAxIFwiVXBkYXRlIHZpYSBBSVwiIHBhbmVsICh3ZWIvbWFzdGVyLWRhdGEtYWktdXBkYXRlLmpzKSBkb2Vzbid0XG4gKiBkdXBsaWNhdGUgb3IgZm9yayB0aGUgc2FtZSBiZWZvcmUvYWZ0ZXIgZGlmZi1yb3cgVUkgYSB0aGlyZCB0aW1lLlxuICpcbiAqIFJvdyBtYXJrdXAgdXNlcyBgZGF0YS10b2dnbGUtcmVhc29uaW5nPVwiSURcImAgYXR0cmlidXRlcyBpbnN0ZWFkIG9mIGlubGluZVxuICogYG9uY2xpY2s9XCIuLi5cImAgaGFuZGxlcnMgXHUyMDE0IHRoZSBjYWxsZXIgYXR0YWNoZXMgT05FIGRlbGVnYXRlZCBjbGlja1xuICogbGlzdGVuZXIgKGF0dGFjaFByb3Bvc2FsUm93TGlzdGVuZXJzKSByYXRoZXIgdGhhbiBlYWNoIHJvdyB3aXJpbmcgaXRzIG93blxuICogaW5saW5lIGhhbmRsZXIuIFRoaXMgbWF0dGVycyBiZWNhdXNlIGhhcnZlc3QuanMncyBvcmlnaW5hbCBpbmxpbmUtb25jbGlja1xuICogdmVyc2lvbiBjYWxsZWQgaGFydmVzdC5qcy1zcGVjaWZpYyBnbG9iYWwgZnVuY3Rpb25zIGRpcmVjdGx5OyBhIHJvd1xuICogcmVuZGVyZWQgYnkgYSBkaWZmZXJlbnQgbW9kdWxlIChtYXN0ZXItZGF0YS1haS11cGRhdGUuanMpIG11c3Qgbm90XG4gKiBzaWxlbnRseSByZWZlcmVuY2UgZnVuY3Rpb25zIHRoYXQgZG9uJ3QgZXhpc3QgdGhlcmUuXG4gKlxuICogYGlkUHJlZml4YCBrZWVwcyBlYWNoIGNhbGxlcidzIGV4aXN0aW5nIERPTS1pZCBjb252ZW50aW9uIGludGFjdCAoZS5nLlxuICogaGFydmVzdC5qcydzIGBoYXJ2ZXN0LXJvdy0qYC9gaGFydmVzdC1jaGstKmAsIHJlZmVyZW5jZWQgZWxzZXdoZXJlIGluIHRoYXRcbiAqIGZpbGUsIG5vdGFibHkgYXBwbHlIYXJ2ZXN0U2VsZWN0aW9ucykgcmF0aGVyIHRoYW4gZm9yY2luZyBhIHJlbmFtZS5cbiAqXG4gKiBQdWJsaWMgZXhwb3J0czpcbiAqICAgZXNjKHN0cilcbiAqICAgcmVuZGVyUHJvcG9zYWxSb3coaXRlbSwgb3B0cylcbiAqICAgYXR0YWNoUHJvcG9zYWxSb3dMaXN0ZW5lcnMoY29udGFpbmVyRWwsIGlkUHJlZml4LCBoYW5kbGVycylcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXNjKHN0cikge1xuICByZXR1cm4gU3RyaW5nKHN0ciA/PyAnJylcbiAgICAucmVwbGFjZSgvJi9nLCAnJmFtcDsnKVxuICAgIC5yZXBsYWNlKC88L2csICcmbHQ7JylcbiAgICAucmVwbGFjZSgvPi9nLCAnJmd0OycpXG4gICAgLnJlcGxhY2UoL1wiL2csICcmcXVvdDsnKTtcbn1cblxuLyoqXG4gKiBSZW5kZXIgb25lIHByb3Bvc2FsLXJldmlldyByb3cgKGNoZWNrYm94ICsgYmVmb3JlL2FmdGVyICsgb3B0aW9uYWxcbiAqIGNvbGxhcHNpYmxlIGRldGFpbCArIG9wdGlvbmFsIGJhZGdlcy9mbGFnIGJhbm5lcikuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGl0ZW1cbiAqIEBwYXJhbSB7c3RyaW5nfSBpdGVtLmlkXG4gKiBAcGFyYW0ge3N0cmluZ30gaXRlbS50eXBlTGFiZWwgICAgIC0gc21hbGwgY2FwcyBsYWJlbCBhYm92ZSB0aGUgcm93IChlLmcuIHNlY3Rpb24gbmFtZSlcbiAqIEBwYXJhbSB7c3RyaW5nfSBbaXRlbS5zb3VyY2VCYWRnZUh0bWxdXG4gKiBAcGFyYW0ge3N0cmluZ30gaXRlbS5sYWJlbCAgICAgICAgIC0gc2Vjb25kYXJ5IHN1bW1hcnkgbGluZVxuICogQHBhcmFtIHtzdHJpbmd9IFtpdGVtLm9yaWdpbmFsXSAgICAtIFwiQmVmb3JlXCIgYmxvY2sgdGV4dCAob21pdCBmb3IgYWRkLW9ubHkgcHJvcG9zYWxzKVxuICogQHBhcmFtIHtzdHJpbmd9IFtpdGVtLnByb3Bvc2VkXSAgICAtIFwiQWZ0ZXJcIiBibG9jayB0ZXh0IChhbHJlYWR5IGRpc3BsYXktcmVhZHksIG5vdCBhIHJhdyBvYmplY3QpXG4gKiBAcGFyYW0ge3N0cmluZ30gW2l0ZW0uZGV0YWlsVGV4dF0gIC0gY29sbGFwc2libGUgZGV0YWlsIChoYXJ2ZXN0OiByZWFzb25pbmc7IEdBUC0wMTogcmF0aW9uYWxlKVxuICogQHBhcmFtIHtzdHJpbmd9IFtpdGVtLmJhZGdlc0h0bWxdICAtIHByZS1yZW5kZXJlZCByaWdodC1zaWRlIGJhZGdlIEhUTUwgKGNhbGxlci1zcGVjaWZpYylcbiAqIEBwYXJhbSB7c3RyaW5nfSBbaXRlbS5mbGFnSHRtbF0gICAgLSBwcmUtcmVuZGVyZWQgYWR2aXNvcnkvd2FybmluZyBiYW5uZXIgKGUuZy4gcG9zc2libGUtZHVwbGljYXRlLCBzdGFsZSlcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2l0ZW0uY2hlY2tlZF1cbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5pZFByZWZpeCAgICAgICAgICAtIHNoYXJlZCBwcmVmaXggZm9yIHJvdy9yZWFzb24vY2hlY2tib3ggaWRzLCBlLmcuICdoYXJ2ZXN0JyBvciAnbWR1J1xuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmNoZWNrYm94RGF0YUF0dHJdIC0ga2ViYWItY2FzZSBkYXRhLWF0dHJpYnV0ZSBzdWZmaXgsIGUuZy4gJ2hhcnZlc3QtaWQnIG9yICdtZHUtaWQnXG4gKiAgIChOT1QgY2FtZWxDYXNlIFx1MjAxNCB0aGlzIGlzIGludGVycG9sYXRlZCB2ZXJiYXRpbSBpbnRvIGBkYXRhLSR7Y2hlY2tib3hEYXRhQXR0cn1gIGluIHRoZSBIVE1MIHN0cmluZztcbiAqICAgYSBjYW1lbENhc2UgdmFsdWUgbGlrZSAnaGFydmVzdElkJyBwcm9kdWNlcyB0aGUgbGl0ZXJhbCBhdHRyaWJ1dGUgYGRhdGEtaGFydmVzdElkYCwgd2hpY2ggdGhlIEhUTUxcbiAqICAgcGFyc2VyIGxvd2VyY2FzZXMgdG8gYGRhdGEtaGFydmVzdGlkYCBvbiBpbnNlcnRpb24sIHNpbGVudGx5IGJyZWFraW5nIGAuZGF0YXNldC5oYXJ2ZXN0SWRgIC9cbiAqICAgYFtkYXRhLWhhcnZlc3QtaWRdYCBsb29rdXBzIGVsc2V3aGVyZS4gVGhpcyBiaXQgbWFzdGVyLWRhdGEtYWktdXBkYXRlLmpzJ3Mgb3duIGZpcnN0IGRyYWZ0LilcbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5hcmlhTGFiZWxTdWZmaXhdICAtIGFwcGVuZGVkIHRvIHRoZSBjaGVja2JveCdzIGFyaWEtbGFiZWwgYWZ0ZXIgYGxhYmVsYCAoZS5nLiBkdXBsaWNhdGUvZmxhZyB0ZXh0KVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyUHJvcG9zYWxSb3coaXRlbSwgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBpZFByZWZpeCA9ICdwcm9wb3NhbCcsXG4gICAgY2hlY2tib3hEYXRhQXR0ciA9ICdwcm9wb3NhbC1pZCcsXG4gICAgYXJpYUxhYmVsU3VmZml4ID0gJycsXG4gIH0gPSBvcHRzO1xuXG4gIGNvbnN0IGNoZWNrZWQgPSBpdGVtLmNoZWNrZWQgPyAnIGNoZWNrZWQnIDogJyc7XG4gIGNvbnN0IHJvd0lkID0gYCR7aWRQcmVmaXh9LXJvdy0ke2VzYyhpdGVtLmlkKX1gO1xuICBjb25zdCByZWFzb25JZCA9IGAke2lkUHJlZml4fS1yZWFzb24tJHtlc2MoaXRlbS5pZCl9YDtcbiAgY29uc3QgY2hlY2tib3hJZCA9IGAke2lkUHJlZml4fS1jaGstJHtlc2MoaXRlbS5pZCl9YDtcbiAgY29uc3QgYXJpYUxhYmVsID0gZXNjKGAke2l0ZW0ubGFiZWwgfHwgJyd9JHthcmlhTGFiZWxTdWZmaXh9YCk7XG5cbiAgY29uc3QgaGFzRGV0YWlsID0gQm9vbGVhbihpdGVtLmRldGFpbFRleHQpO1xuICBjb25zdCBkZXRhaWxUb2dnbGUgPSBoYXNEZXRhaWxcbiAgICA/IGA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLXRvZ2dsZS1yZWFzb25pbmc9XCIke2VzYyhpdGVtLmlkKX1cIiBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIiBhcmlhLWNvbnRyb2xzPVwiJHtyZWFzb25JZH1cIiBzdHlsZT1cImZvbnQtc2l6ZTowLjc1ZW07YmFja2dyb3VuZDpub25lO2JvcmRlcjpub25lO2NvbG9yOnZhcigtLWN2LWdyYXktNTAwKTtjdXJzb3I6cG9pbnRlcjtwYWRkaW5nOjAgNHB4O3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtcIiB0aXRsZT1cIlRvZ2dsZSBkZXRhaWxzXCI+XHVEODNEXHVEQ0FDPC9idXR0b24+YFxuICAgIDogJyc7XG4gIGNvbnN0IGRldGFpbEJsb2NrID0gaGFzRGV0YWlsXG4gICAgPyBgPGRpdiBpZD1cIiR7cmVhc29uSWR9XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7bWFyZ2luLXRvcDo2cHg7cGFkZGluZzo4cHggMTBweDtiYWNrZ3JvdW5kOnZhcigtLWN2LWJnLWxpZ2h0KTtib3JkZXItbGVmdDozcHggc29saWQgdmFyKC0tY3Ytc2xhdGUtNDAwKTtib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6MC44MmVtO2NvbG9yOnZhcigtLWN2LXRleHQtbXV0ZWQpO2xpbmUtaGVpZ2h0OjEuNTtcIj4ke2VzYyhpdGVtLmRldGFpbFRleHQpfTwvZGl2PmBcbiAgICA6ICcnO1xuXG4gIHJldHVybiBgXG4gICAgPHRyIGlkPVwiJHtyb3dJZH1cIiBzdHlsZT1cImJvcmRlci1ib3R0b206MXB4IHNvbGlkIHZhcigtLWN2LWJnLXN1YnRsZSk7XCI+XG4gICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOjEwcHggMTJweDt3aWR0aDozNnB4O3ZlcnRpY2FsLWFsaWduOnRvcDtcIj5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiJHtjaGVja2JveElkfVwiIGRhdGEtJHtjaGVja2JveERhdGFBdHRyfT1cIiR7ZXNjKGl0ZW0uaWQpfVwiJHtjaGVja2VkfVxuICAgICAgICAgIGFyaWEtbGFiZWw9XCIke2FyaWFMYWJlbH1cIlxuICAgICAgICAgIHN0eWxlPVwid2lkdGg6MTZweDtoZWlnaHQ6MTZweDtjdXJzb3I6cG9pbnRlcjttYXJnaW4tdG9wOjJweDtcIj5cbiAgICAgIDwvdGQ+XG4gICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOjEwcHggMTJweDtcIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpmbGV4LXN0YXJ0O2dhcDo4cHg7ZmxleC13cmFwOndyYXA7XCI+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImZsZXg6MTttaW4td2lkdGg6MjAwcHg7XCI+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuNzhlbTtmb250LXdlaWdodDo2MDA7Y29sb3I6dmFyKC0tY3YtdGV4dC1zZWNvbmRhcnkpO3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTtsZXR0ZXItc3BhY2luZzowLjA0ZW07bWFyZ2luLWJvdHRvbTo0cHg7XCI+XG4gICAgICAgICAgICAgICR7ZXNjKGl0ZW0udHlwZUxhYmVsIHx8ICcnKX0ke2l0ZW0uc291cmNlQmFkZ2VIdG1sIHx8ICcnfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuODdlbTtjb2xvcjp2YXIoLS1jdi1zbGF0ZS00MDApO21hcmdpbi1ib3R0b206NnB4O1wiPiR7ZXNjKGl0ZW0ubGFiZWwgfHwgJycpfTwvZGl2PlxuICAgICAgICAgICAgJHtpdGVtLmZsYWdIdG1sIHx8ICcnfVxuICAgICAgICAgICAgJHtpdGVtLm9yaWdpbmFsID8gYFxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206NnB4O1wiPlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuNzJlbTtmb250LXdlaWdodDo2MDA7Y29sb3I6dmFyKC0tY3YtZ3JheS01MDApO3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTtsZXR0ZXItc3BhY2luZzowLjAzZW07bWFyZ2luLWJvdHRvbToycHg7XCI+QmVmb3JlPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2NvbG9yOnZhcigtLWN2LWdyYXktNTAwKTtiYWNrZ3JvdW5kOnZhcigtLWN2LWJnLWxpZ2h0KTtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjZweCA4cHg7Ym9yZGVyLWxlZnQ6M3B4IHNvbGlkIHZhcigtLWN2LWdyYXktMzAwKTtsaW5lLWhlaWdodDoxLjU7XCI+JHtlc2MoaXRlbS5vcmlnaW5hbCl9PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5gIDogJyd9XG4gICAgICAgICAgICAke2l0ZW0ucHJvcG9zZWQgPyBgXG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTo0cHg7XCI+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC43MmVtO2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjp2YXIoLS1jdi1ncmF5LTUwMCk7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO2xldHRlci1zcGFjaW5nOjAuMDNlbTttYXJnaW4tYm90dG9tOjJweDtcIj5BZnRlcjwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtjb2xvcjp2YXIoLS1jdi10ZXh0LXByaW1hcnkpO2JhY2tncm91bmQ6dmFyKC0tY3Ytc3VjY2Vzcy1iZyk7Ym9yZGVyLXJhZGl1czo0cHg7cGFkZGluZzo2cHggOHB4O2JvcmRlci1sZWZ0OjNweCBzb2xpZCB2YXIoLS1jdi1zdWNjZXNzLWJvcmRlcik7bGluZS1oZWlnaHQ6MS41O1wiPiR7ZXNjKGl0ZW0ucHJvcG9zZWQpfTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+YCA6ICcnfVxuICAgICAgICAgICAgJHtkZXRhaWxCbG9ja31cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtnYXA6NHB4O2FsaWduLWl0ZW1zOmZsZXgtZW5kO2ZsZXgtc2hyaW5rOjA7XCI+XG4gICAgICAgICAgICAke2l0ZW0uYmFkZ2VzSHRtbCB8fCAnJ31cbiAgICAgICAgICAgICR7ZGV0YWlsVG9nZ2xlfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvdGQ+XG4gICAgPC90cj5gO1xufVxuXG4vKipcbiAqIEF0dGFjaCBvbmUgZGVsZWdhdGVkIGNsaWNrIGxpc3RlbmVyIHRvIGBjb250YWluZXJFbGAgY292ZXJpbmcgZXZlcnlcbiAqIGBbZGF0YS10b2dnbGUtcmVhc29uaW5nXWAgZWxlbWVudCByZW5kZXJlZCBieSByZW5kZXJQcm9wb3NhbFJvdyB3aXRoIHRoZVxuICogbWF0Y2hpbmcgYGlkUHJlZml4YC4gR3VhcmRzIGFnYWluc3QgZG91YmxlLWF0dGFjaGluZyBhY3Jvc3MgcmVwZWF0ZWRcbiAqIGNhbGxzIChlLmcuIGEgdGFiIGJlaW5nIHJlLXBvcHVsYXRlZCkgdmlhIGEgbWFya2VyIG9uIGBjb250YWluZXJFbGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhdHRhY2hQcm9wb3NhbFJvd0xpc3RlbmVycyhjb250YWluZXJFbCwgaWRQcmVmaXgsIGhhbmRsZXJzID0ge30pIHtcbiAgaWYgKCFjb250YWluZXJFbCkgcmV0dXJuO1xuICBjb25zdCBndWFyZEtleSA9IGBwcm9wb3NhbExpc3RlbmVyc0F0dGFjaGVkXyR7aWRQcmVmaXh9YDtcbiAgaWYgKGNvbnRhaW5lckVsLmRhdGFzZXRbZ3VhcmRLZXldKSByZXR1cm47XG4gIGNvbnRhaW5lckVsLmRhdGFzZXRbZ3VhcmRLZXldID0gJzEnO1xuXG4gIGNvbnRhaW5lckVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB7XG4gICAgY29uc3QgdG9nZ2xlID0gZXZlbnQudGFyZ2V0LmNsb3Nlc3QoJ1tkYXRhLXRvZ2dsZS1yZWFzb25pbmddJyk7XG4gICAgaWYgKCF0b2dnbGUpIHJldHVybjtcbiAgICBjb25zdCBpZCA9IHRvZ2dsZS5kYXRhc2V0LnRvZ2dsZVJlYXNvbmluZztcbiAgICBjb25zdCByZWFzb25FbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2lkUHJlZml4fS1yZWFzb24tJHtpZH1gKTtcbiAgICBpZiAocmVhc29uRWwpIHtcbiAgICAgIGNvbnN0IG5vd1Zpc2libGUgPSByZWFzb25FbC5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZSc7XG4gICAgICByZWFzb25FbC5zdHlsZS5kaXNwbGF5ID0gbm93VmlzaWJsZSA/ICdibG9jaycgOiAnbm9uZSc7XG4gICAgICB0b2dnbGUuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgU3RyaW5nKG5vd1Zpc2libGUpKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBoYW5kbGVycy5vblRvZ2dsZVJlYXNvbmluZyA9PT0gJ2Z1bmN0aW9uJykgaGFuZGxlcnMub25Ub2dnbGVSZWFzb25pbmcoaWQpO1xuICB9KTtcbn1cbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL2xsbS1sb2cuanNcbiAqIEZldGNoZXMgcmF3IExMTSBpbnRlcmFjdGlvbiBsb2cgZW50cmllcyBmcm9tIC9hcGkvbGxtLWxvZyBhbmQgZGlzcGxheXNcbiAqIHRoZW0gaW4gdGhlIENvbnZlcnNhdGlvbiBwYW5lbCBhcyBjb2xsYXBzaWJsZSB0cmFuc2NyaXB0IGVudHJpZXMuXG4gKlxuICogRWFjaCBMTE0gY2FsbCBzaG93czpcbiAqICAgLSBIZWFkZXI6IHRpbWVzdGFtcCBhbmQgbWVzc2FnZS1jb3VudCBzdW1tYXJ5XG4gKiAgIC0gUHJvbXB0IHNlY3Rpb246IGFsbCBtZXNzYWdlcyBzZW50IChyb2xlLXByZWZpeGVkKSwgY29sbGFwc2libGUgd2hlbiBsb25nXG4gKiAgIC0gUmVzcG9uc2Ugc2VjdGlvbjogcmF3IExMTSByZXNwb25zZSwgY29sbGFwc2libGUgd2hlbiBsb25nXG4gKlxuICogREVQRU5ERU5DSUVTIChnbG9iYWxUaGlzKTpcbiAqICAgLSBhcHBlbmRNZXNzYWdlSHRtbCAgKG1lc3NhZ2UtcXVldWUuanMpXG4gKiAgIC0gZ2V0U2Vzc2lvbklkRnJvbVVSTCAoYXBpLWNsaWVudC5qcylcbiAqL1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBlc2NhcGVIdG1sIH0gZnJvbSAnLi91dGlscy5qcyc7XG5pbXBvcnQgeyBnZXRTZXNzaW9uSWRGcm9tVVJMIH0gZnJvbSAnLi9hcGktY2xpZW50LmpzJztcblxuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdsbG0tbG9nJyk7XG5cbi8vIEN1cnNvciB0cmFja3MgdGhlIG5leHQgaW5kZXggdG8gZmV0Y2ggZnJvbSAvYXBpL2xsbS1sb2cuXG4vLyBJbmNyZW1lbnQgYWZ0ZXIgZWFjaCBzdWNjZXNzZnVsIGZldGNoIGJ5IGB0b3RhbGAgcmV0dXJuZWQgZnJvbSB0aGUgc2VydmVyLlxubGV0IF9sbG1Mb2dDdXJzb3IgPSAwO1xuXG4vKiogUmVzZXQgdGhlIGN1cnNvciB0byAwIChjYWxsIHdoZW4gYSBuZXcgc2Vzc2lvbiBpcyBsb2FkZWQpLiAqL1xuZnVuY3Rpb24gcmVzZXRMbG1Mb2dDdXJzb3IoKSB7XG4gIF9sbG1Mb2dDdXJzb3IgPSAwO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIENvbGxhcHNpYmxlIEhUTUwgYnVpbGRlciAobWlycm9ycyBfbWFrZUNvbGxhcHNpYmxlQ29udGVudCBpbiBtZXNzYWdlLXF1ZXVlLmpzKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IF9MT0dfQ09MTEFQU0VfTElORVMgPSA4O1xuY29uc3QgX0xPR19DT0xMQVBTRV9DSEFSUyA9IDQ4MDtcblxuLyoqXG4gKiBXcmFwIGB0ZXh0YCBpbiBhIGNvbGxhcHNpYmxlIDxwcmU+IGJsb2NrIHdoZW4gaXQgZXhjZWVkcyB0aGUgdGhyZXNob2xkLlxuICogUmV0dXJucyBhbiBIVE1MIHN0cmluZyByZWFkeSBmb3IgaW5zZXJ0aW9uIHZpYSBpbm5lckhUTUwuXG4gKi9cbmZ1bmN0aW9uIF9jb2xsYXBzaWJsZVByZSh0ZXh0KSB7XG4gIGNvbnN0IGVzY2FwZWQgPSBlc2NhcGVIdG1sKHRleHQpO1xuICBjb25zdCBsaW5lcyAgID0gdGV4dC5zcGxpdCgnXFxuJyk7XG5cbiAgaWYgKGxpbmVzLmxlbmd0aCA8PSBfTE9HX0NPTExBUFNFX0xJTkVTICYmIHRleHQubGVuZ3RoIDw9IF9MT0dfQ09MTEFQU0VfQ0hBUlMpIHtcbiAgICByZXR1cm4gYDxwcmUgY2xhc3M9XCJsbG0tbG9nLXRleHRcIj4ke2VzY2FwZWR9PC9wcmU+YDtcbiAgfVxuXG4gIGNvbnN0IHByZXZpZXdUZXh0ID0gbGluZXMuc2xpY2UoMCwgX0xPR19DT0xMQVBTRV9MSU5FUykuam9pbignXFxuJyk7XG4gIGNvbnN0IG92ZXJmbG93ICAgID0gbGluZXMubGVuZ3RoIC0gX0xPR19DT0xMQVBTRV9MSU5FUztcbiAgY29uc3QgaWQgICAgICAgICAgPSBgbGxtbG9nLSR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCA3KX1gO1xuICBjb25zdCBsYWJlbCAgICAgICA9IGBTaG93ICR7b3ZlcmZsb3d9IG1vcmUgbGluZSR7b3ZlcmZsb3cgPT09IDEgPyAnJyA6ICdzJ31cdTIwMjZgO1xuXG4gIHJldHVybiBgXG4gICAgPHByZSBjbGFzcz1cImxsbS1sb2ctdGV4dCBtc2ctcHJldmlld1wiIGlkPVwiJHtpZH0tcHJldmlld1wiPiR7ZXNjYXBlSHRtbChwcmV2aWV3VGV4dCl9XHUyMDI2PC9wcmU+XG4gICAgPHByZSBjbGFzcz1cImxsbS1sb2ctdGV4dCBtc2ctZnVsbFwiICAgIGlkPVwiJHtpZH0tZnVsbFwiIHN0eWxlPVwiZGlzcGxheTpub25lXCI+JHtlc2NhcGVkfTwvcHJlPlxuICAgIDxidXR0b24gY2xhc3M9XCJtc2ctdG9nZ2xlLWJ0blwiIHR5cGU9XCJidXR0b25cIlxuICAgICAgb25jbGljaz1cIihmdW5jdGlvbihidG4pe1xuICAgICAgICB2YXIgcD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnJHtpZH0tcHJldmlldycpLFxuICAgICAgICAgICAgZj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnJHtpZH0tZnVsbCcpO1xuICAgICAgICBpZihmLnN0eWxlLmRpc3BsYXk9PT0nbm9uZScpe1xuICAgICAgICAgIHAuc3R5bGUuZGlzcGxheT0nbm9uZSc7IGYuc3R5bGUuZGlzcGxheT0nYmxvY2snOyBidG4udGV4dENvbnRlbnQ9J1Nob3cgbGVzcyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcC5zdHlsZS5kaXNwbGF5PScnOyBmLnN0eWxlLmRpc3BsYXk9J25vbmUnOyBidG4udGV4dENvbnRlbnQ9JyR7bGFiZWx9JztcbiAgICAgICAgfVxuICAgICAgfSkodGhpcylcIj4ke2xhYmVsfTwvYnV0dG9uPmA7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUmVuZGVyIG9uZSBpbnRlcmFjdGlvbiBpbnRvIHRoZSBjb252ZXJzYXRpb24gcGFuZWxcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiBfcmVuZGVySW50ZXJhY3Rpb24oaXgpIHtcbiAgY29uc3QgY29udmVyc2F0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbnZlcnNhdGlvbicpO1xuICBpZiAoIWNvbnZlcnNhdGlvbikgcmV0dXJuO1xuXG4gIGNvbnN0IHRzID0gaXgudGltZXN0YW1wXG4gICAgPyBuZXcgRGF0ZShpeC50aW1lc3RhbXApLnRvTG9jYWxlVGltZVN0cmluZyhbXSwgeyBob3VyOiAnMi1kaWdpdCcsIG1pbnV0ZTogJzItZGlnaXQnLCBzZWNvbmQ6ICcyLWRpZ2l0JyB9KVxuICAgIDogJyc7XG5cbiAgY29uc3QgbXNncyAgICAgPSBBcnJheS5pc0FycmF5KGl4Lm1lc3NhZ2VzKSA/IGl4Lm1lc3NhZ2VzIDogW107XG4gIGNvbnN0IG1zZ0NvdW50ID0gbXNncy5sZW5ndGg7XG5cbiAgLy8gQnVpbGQgZm9ybWF0dGVkIHByb21wdCB0ZXh0OiBlYWNoIG1lc3NhZ2Ugb24gaXRzIG93biBsYWJlbGxlZCBibG9ja1xuICBjb25zdCBwcm9tcHRUZXh0ID0gbXNnc1xuICAgIC5tYXAobSA9PiBgWyR7KG0ucm9sZSB8fCAndW5rbm93bicpLnRvVXBwZXJDYXNlKCl9XVxcbiR7bS5jb250ZW50IHx8ICcnfWApXG4gICAgLmpvaW4oJ1xcblxcblx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxcblxcbicpO1xuXG4gIGNvbnN0IHJlc3BvbnNlVGV4dCA9IHR5cGVvZiBpeC5yZXNwb25zZSA9PT0gJ3N0cmluZycgPyBpeC5yZXNwb25zZSA6ICcnO1xuXG4gIGNvbnN0IGh0bWwgPSBgXG4gICAgPGRpdiBjbGFzcz1cImxsbS1sb2ctaGVhZGVyXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImxsbS1sb2ctaWNvblwiPlx1RDgzRVx1REQxNjwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwibGxtLWxvZy1sYWJlbFwiPkxMTSBJbnRlcmFjdGlvbjwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwibGxtLWxvZy1tZXRhXCI+JHttc2dDb3VudH0gbWVzc2FnZSR7bXNnQ291bnQgPT09IDEgPyAnJyA6ICdzJ308L3NwYW4+XG4gICAgICAke3RzID8gYDxzcGFuIGNsYXNzPVwibGxtLWxvZy10c1wiPiR7ZXNjYXBlSHRtbCh0cyl9PC9zcGFuPmAgOiAnJ31cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibGxtLWxvZy1zZWN0aW9uXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibGxtLWxvZy1zZWN0aW9uLWxhYmVsXCI+UHJvbXB0PC9kaXY+XG4gICAgICAke19jb2xsYXBzaWJsZVByZShwcm9tcHRUZXh0KX1cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibGxtLWxvZy1zZWN0aW9uXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibGxtLWxvZy1zZWN0aW9uLWxhYmVsXCI+UmVzcG9uc2U8L2Rpdj5cbiAgICAgICR7X2NvbGxhcHNpYmxlUHJlKHJlc3BvbnNlVGV4dCl9XG4gICAgPC9kaXY+YDtcblxuICBjb25zdCBtZXNzYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIG1lc3NhZ2UuY2xhc3NOYW1lID0gJ21lc3NhZ2UgbGxtLXJhdyc7XG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgY29udGVudC5jbGFzc05hbWUgPSAnY29udGVudCc7XG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gaHRtbDtcbiAgbWVzc2FnZS5hcHBlbmRDaGlsZChjb250ZW50KTtcbiAgY29udmVyc2F0aW9uLmFwcGVuZENoaWxkKG1lc3NhZ2UpO1xuICBjb252ZXJzYXRpb24uc2Nyb2xsVG9wID0gY29udmVyc2F0aW9uLnNjcm9sbEhlaWdodDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBQdWJsaWMgQVBJXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBGZXRjaCBMTE0gaW50ZXJhY3Rpb24gbG9nIGVudHJpZXMgYWRkZWQgc2luY2UgdGhlIGxhc3QgY2FsbCBhbmQgZGlzcGxheVxuICogZWFjaCBvbmUgaW4gdGhlIENvbnZlcnNhdGlvbiBwYW5lbC4gIFNhZmUgdG8gY2FsbCBhZnRlciBldmVyeSBiYWNrZW5kXG4gKiBvcGVyYXRpb24gdGhhdCBtYXkgdHJpZ2dlciBMTE0gY2FsbHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZldGNoQW5kRGlzcGxheUxsbUxvZygpIHtcbiAgY29uc3Qgc2Vzc2lvbklkID0gZ2V0U2Vzc2lvbklkRnJvbVVSTCgpO1xuICBpZiAoIXNlc3Npb25JZCkgcmV0dXJuO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goXG4gICAgICBgL2FwaS9sbG0tbG9nP3Nlc3Npb25faWQ9JHtlbmNvZGVVUklDb21wb25lbnQoc2Vzc2lvbklkKX0mc2luY2U9JHtfbGxtTG9nQ3Vyc29yfWAsXG4gICAgKTtcbiAgICBpZiAoIXJlcy5vaykge1xuICAgICAgbG9nLndhcm4oJ2xsbS1sb2cgZmV0Y2ggZmFpbGVkJywgcmVzLnN0YXR1cyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGRhdGEgICAgICAgICA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgY29uc3QgaW50ZXJhY3Rpb25zID0gQXJyYXkuaXNBcnJheShkYXRhLmludGVyYWN0aW9ucykgPyBkYXRhLmludGVyYWN0aW9ucyA6IFtdO1xuXG4gICAgZm9yIChjb25zdCBpeCBvZiBpbnRlcmFjdGlvbnMpIHtcbiAgICAgIF9yZW5kZXJJbnRlcmFjdGlvbihpeCk7XG4gICAgfVxuXG4gICAgLy8gQWR2YW5jZSBjdXJzb3IgdG8gdGhlIG5ldyB0b3RhbCBzbyB0aGUgbmV4dCBjYWxsIGZldGNoZXMgb25seSBuZXcgZW50cmllcy5cbiAgICBpZiAodHlwZW9mIGRhdGEudG90YWwgPT09ICdudW1iZXInKSB7XG4gICAgICBfbGxtTG9nQ3Vyc29yID0gZGF0YS50b3RhbDtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy5lcnJvcignZmV0Y2hBbmREaXNwbGF5TGxtTG9nIGVycm9yOicsIGVycik7XG4gIH1cbn1cblxuZXhwb3J0IHsgZmV0Y2hBbmREaXNwbGF5TGxtTG9nLCByZXNldExsbUxvZ0N1cnNvciB9O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvYXV0aC1wcm92aWRlci5qc1xuICogQ29waWxvdCAvIEdpdEh1YiBPQXV0aCBhdXRoIGZsb3csIGJhZGdlIHVwZGF0ZXMsIGFuZCBwcm92aWRlciBsYWJlbCBmb3JtYXR0aW5nLlxuICpcbiAqIERFUEVOREVOQ0lFUzpcbiAqICAgLSBjb25maXJtRGlhbG9nIGZyb20gdWktY29yZS5qcyAob24gZ2xvYmFsVGhpcylcbiAqICAgLSBzZXRJbml0aWFsRm9jdXMsIHRyYXBGb2N1cywgcmVzdG9yZUZvY3VzIGZyb20gdWktY29yZS5qcyAob24gZ2xvYmFsVGhpcylcbiAqICAgLSB1cGRhdGVBdXRoQmFkZ2UgKHNlbGYtcmVmZXJlbmNlOyBleHBvcnRlZCB0byBnbG9iYWxUaGlzKVxuICogICAtIGdldFByb3ZpZGVySW5mbyBmcm9tIHByb3ZpZGVyLWluZm8uanMgKGltcG9ydGVkIGRpcmVjdGx5KVxuICovXG5cbmltcG9ydCB7IGdldFByb3ZpZGVySW5mbyB9IGZyb20gJy4vcHJvdmlkZXItaW5mby5qcyc7XG5cbmxldCBfYXV0aFBvbGxUaW1lciA9IG51bGw7XG5cbmZ1bmN0aW9uIGZvcm1hdFByb3ZpZGVyTGFiZWwocHJvdmlkZXIpIHtcbiAgaWYgKCFwcm92aWRlciB8fCB0eXBlb2YgcHJvdmlkZXIgIT09ICdzdHJpbmcnKSByZXR1cm4gJ1Byb3ZpZGVyJztcbiAgY29uc3QgYWxpYXNlcyA9IHtcbiAgICBvcGVuYWk6ICdPcGVuQUknLFxuICAgICdjb3BpbG90LW9hdXRoJzogJ0NvcGlsb3QgT0F1dGggKGRlcHJlY2F0ZWQpJyxcbiAgICBjb3BpbG90OiAnQ29waWxvdCAoZGVwcmVjYXRlZCknLFxuICAgIGdpdGh1YjogJ0dpdEh1YiBNb2RlbHMgKGRlcHJlY2F0ZWQpJyxcbiAgICAnY29waWxvdC1zZGsnOiAnQ29waWxvdCBTREsgKHJlY29tbWVuZGVkKScsXG4gIH07XG4gIGlmIChhbGlhc2VzW3Byb3ZpZGVyXSkgcmV0dXJuIGFsaWFzZXNbcHJvdmlkZXJdO1xuICByZXR1cm4gcHJvdmlkZXJcbiAgICAuc3BsaXQoL1stX1xcc10rLylcbiAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgLm1hcChwYXJ0ID0+IHBhcnQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBwYXJ0LnNsaWNlKDEpLnRvTG93ZXJDYXNlKCkpXG4gICAgLmpvaW4oJyAnKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlQXV0aEJhZGdlKGF1dGhTdGF0dXMsIHByb3ZpZGVyID0gbnVsbCkge1xuICBjb25zdCBsZWdhY3lCYWRnZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb3BpbG90LWF1dGgtYmFkZ2UnKTtcbiAgY29uc3QgbGVnYWN5SWNvbiAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXV0aC1iYWRnZS1pY29uJyk7XG4gIGNvbnN0IGxlZ2FjeUxhYmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F1dGgtYmFkZ2UtbGFiZWwnKTtcblxuICBjb25zdCBwaWxsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbS1zdGF0dXMtcGlsbCcpO1xuICBjb25zdCBwaWxsSWNvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG0tc3RhdHVzLWljb24nKTtcbiAgY29uc3QgcGlsbExhYmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbS1zdGF0dXMtbGFiZWwnKTtcblxuICBjb25zdCBhcHBseVN0YXRlID0gKGtpbmQsIHRleHQsIGljb25UZXh0KSA9PiB7XG4gICAgaWYgKGxlZ2FjeUJhZGdlICYmIGxlZ2FjeUljb24gJiYgbGVnYWN5TGFiZWwpIHtcbiAgICAgIGxlZ2FjeUJhZGdlLmNsYXNzTGlzdC5yZW1vdmUoJ2F1dGhlbnRpY2F0ZWQnLCAndW5hdXRoZW50aWNhdGVkJywgJ3BvbGxpbmcnKTtcbiAgICAgIGxlZ2FjeUJhZGdlLmNsYXNzTGlzdC5hZGQoa2luZCk7XG4gICAgICBpZiAoa2luZCA9PT0gJ2Nvbm5lY3RlZCcgfHwga2luZCA9PT0gJ2NvbmZpZ3VyZWQnKSBsZWdhY3lCYWRnZS5jbGFzc0xpc3QuYWRkKCdhdXRoZW50aWNhdGVkJyk7XG4gICAgICBpZiAoa2luZCA9PT0gJ2Nvbm5lY3RpbmcnKSBsZWdhY3lCYWRnZS5jbGFzc0xpc3QuYWRkKCdwb2xsaW5nJyk7XG4gICAgICBpZiAoa2luZCA9PT0gJ3VuY29uZmlndXJlZCcgfHwga2luZCA9PT0gJ2F1dGgtcmVxdWlyZWQnIHx8IGtpbmQgPT09ICdyYXRlLWxpbWl0ZWQnIHx8IGtpbmQgPT09ICd1bmF2YWlsYWJsZScgfHwga2luZCA9PT0gJ2Vycm9yJykgbGVnYWN5QmFkZ2UuY2xhc3NMaXN0LmFkZCgndW5hdXRoZW50aWNhdGVkJyk7XG4gICAgICBsZWdhY3lJY29uLnRleHRDb250ZW50ID0gaWNvblRleHQ7XG4gICAgICBsZWdhY3lMYWJlbC50ZXh0Q29udGVudCA9IHRleHQ7XG4gICAgfVxuICAgIGlmIChwaWxsICYmIHBpbGxJY29uICYmIHBpbGxMYWJlbCkge1xuICAgICAgcGlsbC5jbGFzc0xpc3QucmVtb3ZlKCdhdXRoZW50aWNhdGVkJywgJ3VuYXV0aGVudGljYXRlZCcsICdwb2xsaW5nJywgJ3VuY29uZmlndXJlZCcsICdjb25maWd1cmVkJywgJ2Nvbm5lY3RpbmcnLCAnY29ubmVjdGVkJywgJ2F1dGgtcmVxdWlyZWQnLCAncmF0ZS1saW1pdGVkJywgJ3VuYXZhaWxhYmxlJywgJ2Vycm9yJyk7XG4gICAgICBwaWxsLmNsYXNzTGlzdC5hZGQoa2luZCk7XG4gICAgICBpZiAoa2luZCA9PT0gJ2Nvbm5lY3RlZCcgfHwga2luZCA9PT0gJ2NvbmZpZ3VyZWQnKSBwaWxsLmNsYXNzTGlzdC5hZGQoJ2F1dGhlbnRpY2F0ZWQnKTtcbiAgICAgIGlmIChraW5kID09PSAnY29ubmVjdGluZycpIHBpbGwuY2xhc3NMaXN0LmFkZCgncG9sbGluZycpO1xuICAgICAgaWYgKGtpbmQgPT09ICd1bmNvbmZpZ3VyZWQnIHx8IGtpbmQgPT09ICdhdXRoLXJlcXVpcmVkJyB8fCBraW5kID09PSAncmF0ZS1saW1pdGVkJyB8fCBraW5kID09PSAndW5hdmFpbGFibGUnIHx8IGtpbmQgPT09ICdlcnJvcicpIHBpbGwuY2xhc3NMaXN0LmFkZCgndW5hdXRoZW50aWNhdGVkJyk7XG4gICAgICBwaWxsSWNvbi50ZXh0Q29udGVudCA9IGljb25UZXh0O1xuICAgICAgcGlsbExhYmVsLnRleHRDb250ZW50ID0gdGV4dDtcbiAgICAgIGNvbnN0IHRvb2x0aXBNYXAgPSB7XG4gICAgICAgIHVuY29uZmlndXJlZDogJ05vIHByb3ZpZGVyL21vZGVsIGlzIGNvbmZpZ3VyZWQgeWV0LicsXG4gICAgICAgIGNvbmZpZ3VyZWQ6ICdQcm92aWRlci9tb2RlbCBpcyBjb25maWd1cmVkLiBDb25uZWN0aXZpdHkgbm90IHlldCB2ZXJpZmllZC4nLFxuICAgICAgICBjb25uZWN0aW5nOiAnVGVzdGluZyBvciBjb25uZWN0aW5nIHRvIHRoZSBzZWxlY3RlZCBwcm92aWRlci4nLFxuICAgICAgICBjb25uZWN0ZWQ6ICdQcm92aWRlciByZXNwb25kZWQgc3VjY2Vzc2Z1bGx5IHRvIGEgbGl2ZSByZXF1ZXN0LicsXG4gICAgICAgICdhdXRoLXJlcXVpcmVkJzogJ0F1dGhlbnRpY2F0aW9uIGlzIHJlcXVpcmVkLiBDaGVjayBBUEkga2V5IG9yIHNpZ24gaW4uJyxcbiAgICAgICAgJ3JhdGUtbGltaXRlZCc6ICdSYXRlIGxpbWl0IHJlYWNoZWQuIFdhaXQgYmVmb3JlIHJldHJ5aW5nIHJlcXVlc3RzLicsXG4gICAgICAgIHVuYXZhaWxhYmxlOiAnUHJvdmlkZXIgaXMgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGUgb3IgdW5yZWFjaGFibGUuJyxcbiAgICAgICAgZXJyb3I6ICdDb25uZWN0aW9uIGZhaWxlZC4gT3BlbiBtb2RlbCBzZXR0aW5ncyBmb3IgZGV0YWlscy4nLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHRpcCA9IHRvb2x0aXBNYXBba2luZF0gfHwgJyc7XG4gICAgICBwaWxsLnRpdGxlID0gdGlwO1xuICAgICAgcGlsbEljb24udGl0bGUgPSB0aXA7XG4gICAgICBwaWxsTGFiZWwudGl0bGUgPSB0aXA7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGFjdGl2ZVByb3ZpZGVyID0gcHJvdmlkZXIgfHwgd2luZG93LmN1cnJlbnRQcm92aWRlciB8fCBudWxsO1xuICBjb25zdCBpc0NvcGlsb3RPQXV0aCA9IGFjdGl2ZVByb3ZpZGVyID09PSAnY29waWxvdC1vYXV0aCc7XG5cbiAgLy8gTm9uLWNvbmZpZGVudGlhbCBiYWRnZTogc2hvdyB1bmxlc3MgdGhlIHByb3ZpZGVyIGV4cGxpY2l0bHkgbWFya3MgY29uZmlkZW50aWFsOnRydWUuXG4gIC8vIERlZmF1bHQgaXMgbm9uLWNvbmZpZGVudGlhbCAoZmFpbC1zYWZlIFx1MjAxNCBtb3N0IHByb3ZpZGVycyByZXRhaW4vcmV2aWV3IEFQSSBkYXRhKS5cbiAgY29uc3QgbmNCYWRnZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG0tbm9uLWNvbmZpZGVudGlhbC1iYWRnZScpO1xuICBpZiAobmNCYWRnZSAmJiBhY3RpdmVQcm92aWRlcikge1xuICAgIGNvbnN0IGluZm8gPSBnZXRQcm92aWRlckluZm8oYWN0aXZlUHJvdmlkZXIpO1xuICAgIG5jQmFkZ2Uuc3R5bGUuZGlzcGxheSA9IChpbmZvICYmIGluZm8uY29uZmlkZW50aWFsICE9PSB0cnVlKSA/ICcnIDogJ25vbmUnO1xuICB9XG5cbiAgaWYgKGFjdGl2ZVByb3ZpZGVyICYmICFpc0NvcGlsb3RPQXV0aCkge1xuICAgIGFwcGx5U3RhdGUoJ2NvbmZpZ3VyZWQnLCBgJHtmb3JtYXRQcm92aWRlckxhYmVsKGFjdGl2ZVByb3ZpZGVyKX0gY29uZmlndXJlZGAsICdcdTI1RDQnKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoYXV0aFN0YXR1cy5hdXRoZW50aWNhdGVkKSB7XG4gICAgYXBwbHlTdGF0ZSgnY29ubmVjdGVkJywgJ0NvcGlsb3QgcmVhZHknLCAnXHUyNzEzJyk7XG4gIH0gZWxzZSBpZiAoYXV0aFN0YXR1cy5wb2xsaW5nKSB7XG4gICAgYXBwbHlTdGF0ZSgnY29ubmVjdGluZycsICdXYWl0aW5nIGZvciBhcHByb3ZhbFx1MjAyNicsICdcdTI5RDcnKTtcbiAgfSBlbHNlIHtcbiAgICBhcHBseVN0YXRlKCdhdXRoLXJlcXVpcmVkJywgJ05vdCBhdXRoZW50aWNhdGVkJywgJ1x1RDgzRFx1REQxMScpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNsb3NlQ29waWxvdEF1dGhNb2RhbCgpIHtcbiAgaWYgKF9hdXRoUG9sbFRpbWVyKSB7IGNsZWFySW50ZXJ2YWwoX2F1dGhQb2xsVGltZXIpOyBfYXV0aFBvbGxUaW1lciA9IG51bGw7IH1cbiAgaWYgKHR5cGVvZiBjbG9zZU1vZGVsTW9kYWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjbG9zZU1vZGVsTW9kYWwoKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgbGVnYWN5T3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdXRoLW1vZGFsLW92ZXJsYXknKTtcbiAgaWYgKGxlZ2FjeU92ZXJsYXkpIGxlZ2FjeU92ZXJsYXkuY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZScpO1xuICBpZiAodHlwZW9mIHJlc3RvcmVGb2N1cyA9PT0gJ2Z1bmN0aW9uJykgcmVzdG9yZUZvY3VzKCk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFUyBtb2R1bGUgZXhwb3J0cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmV4cG9ydCB7XG4gIGZvcm1hdFByb3ZpZGVyTGFiZWwsIHVwZGF0ZUF1dGhCYWRnZSxcbiAgY2xvc2VDb3BpbG90QXV0aE1vZGFsLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogYXRzLW1vZGFscy5qc1xuICogQVRTIFJlcG9ydCBhbmQgSm9iIEFuYWx5c2lzIG1vZGFsIGRpYWxvZ3MgKyBBVFMgU2NvcmUgdGFiIHJlbmRlcmVyLlxuICpcbiAqIERFUEVOREVOQ0lFUzpcbiAqIC0gc3RhdGUtbWFuYWdlci5qcyBmb3IgcGVyc2lzdGVkIEFUUyBzY29yZSArIGFuYWx5c2lzIGRhdGFcbiAqIC0gdXRpbHMuanMgZm9yIEhUTUwgZXNjYXBpbmdcbiAqIC0gYXRzLXJlZmluZW1lbnQuanMgZm9yIEFUUyBmZXRjaC9iYWRnZSB1cGRhdGVzXG4gKiAtIGluZGV4Lmh0bWwgbW9kYWwgb3ZlcmxheXM6ICNhdHMtcmVwb3J0LW1vZGFsLW92ZXJsYXksICNqb2ItYW5hbHlzaXMtbW9kYWwtb3ZlcmxheVxuICovXG5cbmltcG9ydCB7IHJlZnJlc2hBdHNTY29yZSwgdXBkYXRlQXRzQmFkZ2UgfSBmcm9tICcuL2F0cy1yZWZpbmVtZW50LmpzJztcbmltcG9ydCB7IHN0YXRlTWFuYWdlciB9IGZyb20gJy4vc3RhdGUtbWFuYWdlci5qcyc7XG5pbXBvcnQgeyBlc2NhcGVIdG1sIH0gZnJvbSAnLi91dGlscy5qcyc7XG5pbXBvcnQgeyB0cmFwRm9jdXMsIHJlc3RvcmVGb2N1cywgcHVzaEZvY3VzU3RhY2sgfSBmcm9tICcuL3VpLWNvcmUuanMnO1xuXG5sZXQgX2F0c1N5bm9ueW1NYXBDYWNoZSA9IG51bGw7XG5cbmFzeW5jIGZ1bmN0aW9uIF9sb2FkQXRzU3lub255bU1hcCgpIHtcbiAgaWYgKF9hdHNTeW5vbnltTWFwQ2FjaGUpIHJldHVybiBfYXRzU3lub255bU1hcENhY2hlO1xuICB0cnkge1xuICAgIGNvbnN0IHNlc3Npb25JZCA9IHN0YXRlTWFuYWdlcj8uZ2V0U2Vzc2lvbklkPy4oKTtcbiAgICBjb25zdCB1cmwgPSBzZXNzaW9uSWQgPyBgL2FwaS9zeW5vbnltLW1hcD9zZXNzaW9uX2lkPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHNlc3Npb25JZCl9YCA6ICcvYXBpL3N5bm9ueW0tbWFwJztcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICAgIGlmICghcmVzLm9rKSByZXR1cm4gKF9hdHNTeW5vbnltTWFwQ2FjaGUgPSB7fSk7XG4gICAgY29uc3QgcmF3ID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBjb25zdCBhbGlhc1RvQ2Fub24gPSB7fTtcbiAgICBjb25zdCBjYW5vblRvQWxpYXNlcyA9IHt9O1xuICAgIE9iamVjdC5lbnRyaWVzKHJhdykuZm9yRWFjaCgoW2FsaWFzLCBjYW5vbl0pID0+IHtcbiAgICAgIGFsaWFzVG9DYW5vblthbGlhcy50b0xvd2VyQ2FzZSgpXSA9IGNhbm9uO1xuICAgICAgY29uc3QgY2wgPSBjYW5vbi50b0xvd2VyQ2FzZSgpO1xuICAgICAgKGNhbm9uVG9BbGlhc2VzW2NsXSA9IGNhbm9uVG9BbGlhc2VzW2NsXSB8fCBbXSkucHVzaChhbGlhcyk7XG4gICAgfSk7XG4gICAgX2F0c1N5bm9ueW1NYXBDYWNoZSA9IHsgYWxpYXNUb0Nhbm9uLCBjYW5vblRvQWxpYXNlcyB9O1xuICB9IGNhdGNoIChfKSB7IF9hdHNTeW5vbnltTWFwQ2FjaGUgPSB7fTsgfVxuICByZXR1cm4gX2F0c1N5bm9ueW1NYXBDYWNoZTtcbn1cblxuZnVuY3Rpb24gX2t3U3luQW5ub3RhdGlvbihrdywgc3luTWFwKSB7XG4gIGlmICghc3luTWFwIHx8ICghc3luTWFwLmFsaWFzVG9DYW5vbiAmJiAhc3luTWFwLmNhbm9uVG9BbGlhc2VzKSkgcmV0dXJuICcnO1xuICBjb25zdCBrbCA9IChrdyB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgaWYgKHN5bk1hcC5hbGlhc1RvQ2Fub24gJiYgc3luTWFwLmFsaWFzVG9DYW5vbltrbF0pIHJldHVybiBgPSAke3N5bk1hcC5hbGlhc1RvQ2Fub25ba2xdfWA7XG4gIGNvbnN0IGFsaWFzZXMgPSBzeW5NYXAuY2Fub25Ub0FsaWFzZXMgJiYgc3luTWFwLmNhbm9uVG9BbGlhc2VzW2tsXTtcbiAgaWYgKGFsaWFzZXMgJiYgYWxpYXNlcy5sZW5ndGgpIHJldHVybiBgYWxzbzogJHthbGlhc2VzLmpvaW4oJywgJyl9YDtcbiAgcmV0dXJuICcnO1xufVxuXG5jb25zdCBBVFNfR1JPVVBTID0gW1xuICBbJ2hhcmQnLCAnSGFyZCBSZXF1aXJlbWVudHMnXSxcbiAgWydzb2Z0JywgJ1ByZWZlcnJlZCBTa2lsbHMnXSxcbiAgWydib251cycsICdcdTI2MDUgQm9udXMgS2V5d29yZHMnXSxcbl07XG5cbmZ1bmN0aW9uIF9rZXl3b3JkU3RhdHVzKGtleXdvcmQpIHtcbiAgcmV0dXJuIGtleXdvcmQ/LnN0YXR1cyB8fCAoa2V5d29yZD8uZm91bmQgPyAnbWF0Y2hlZCcgOiAnbWlzc2luZycpO1xufVxuXG5mdW5jdGlvbiBfa2V5d29yZFR5cGUoa2V5d29yZCkge1xuICByZXR1cm4ga2V5d29yZD8udHlwZSB8fCAnb3RoZXInO1xufVxuXG5mdW5jdGlvbiBfaXNFeGFjdE1hdGNoKGtleXdvcmQpIHtcbiAgcmV0dXJuIF9rZXl3b3JkU3RhdHVzKGtleXdvcmQpID09PSAnbWF0Y2hlZCcgJiYga2V5d29yZD8ubWF0Y2hfdHlwZSAhPT0gJ3BhcnRpYWwnO1xufVxuXG5mdW5jdGlvbiBfaXNQYXJ0aWFsTWF0Y2goa2V5d29yZCkge1xuICByZXR1cm4gX2tleXdvcmRTdGF0dXMoa2V5d29yZCkgPT09ICdwYXJ0aWFsJyB8fCBrZXl3b3JkPy5tYXRjaF90eXBlID09PSAncGFydGlhbCc7XG59XG5cbmZ1bmN0aW9uIF9rZXl3b3JkU29ydFZhbHVlKGtleXdvcmQpIHtcbiAgaWYgKF9rZXl3b3JkU3RhdHVzKGtleXdvcmQpID09PSAnbWlzc2luZycpIHJldHVybiAwO1xuICBpZiAoX2lzUGFydGlhbE1hdGNoKGtleXdvcmQpKSByZXR1cm4gMTtcbiAgcmV0dXJuIDI7XG59XG5cbmZ1bmN0aW9uIF9rZXl3b3JkU3RhdHVzQmFkZ2Uoa2V5d29yZCkge1xuICBpZiAoX2tleXdvcmRTdGF0dXMoa2V5d29yZCkgPT09ICdtaXNzaW5nJykge1xuICAgIHJldHVybiAnPHNwYW4gc3R5bGU9XCJkaXNwbGF5OmlubGluZS1ibG9jaztwYWRkaW5nOjJweCA4cHg7Ym9yZGVyLXJhZGl1czo5OTlweDtiYWNrZ3JvdW5kOiNmZWUyZTI7Y29sb3I6Izk5MWIxYjtmb250LXNpemU6MC44ZW07Zm9udC13ZWlnaHQ6NjAwO1wiPlx1Mjc0QyBNaXNzaW5nPC9zcGFuPic7XG4gIH1cbiAgaWYgKF9pc1BhcnRpYWxNYXRjaChrZXl3b3JkKSkge1xuICAgIHJldHVybiAnPHNwYW4gc3R5bGU9XCJkaXNwbGF5OmlubGluZS1ibG9jaztwYWRkaW5nOjJweCA4cHg7Ym9yZGVyLXJhZGl1czo5OTlweDtiYWNrZ3JvdW5kOiNmZWYzYzc7Y29sb3I6IzkyNDAwZTtmb250LXNpemU6MC44ZW07Zm9udC13ZWlnaHQ6NjAwO1wiPlx1MjZBMCBQYXJ0aWFsPC9zcGFuPic7XG4gIH1cbiAgcmV0dXJuICc8c3BhbiBzdHlsZT1cImRpc3BsYXk6aW5saW5lLWJsb2NrO3BhZGRpbmc6MnB4IDhweDtib3JkZXItcmFkaXVzOjk5OXB4O2JhY2tncm91bmQ6I2RjZmNlNztjb2xvcjojMTY2NTM0O2ZvbnQtc2l6ZTowLjhlbTtmb250LXdlaWdodDo2MDA7XCI+XHUyNzA1IE1hdGNoZWQ8L3NwYW4+Jztcbn1cblxuZnVuY3Rpb24gX3JlbmRlcktleXdvcmRHcm91cCh0aXRsZSwga2V5d29yZHMsIHN5bk1hcCkge1xuICBpZiAoa2V5d29yZHMubGVuZ3RoID09PSAwKSByZXR1cm4gJyc7XG5cbiAgY29uc3QgZXhhY3RDb3VudCA9IGtleXdvcmRzLmZpbHRlcihfaXNFeGFjdE1hdGNoKS5sZW5ndGg7XG4gIGNvbnN0IHBhcnRpYWxDb3VudCA9IGtleXdvcmRzLmZpbHRlcihfaXNQYXJ0aWFsTWF0Y2gpLmxlbmd0aDtcbiAgY29uc3QgbWlzc2luZ0NvdW50ID0ga2V5d29yZHMuZmlsdGVyKGtleXdvcmQgPT4gX2tleXdvcmRTdGF0dXMoa2V5d29yZCkgPT09ICdtaXNzaW5nJykubGVuZ3RoO1xuICBjb25zdCBzb3J0ZWQgPSBbLi4ua2V5d29yZHNdLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiB7XG4gICAgY29uc3QgcHJpb3JpdHkgPSBfa2V5d29yZFNvcnRWYWx1ZShsZWZ0KSAtIF9rZXl3b3JkU29ydFZhbHVlKHJpZ2h0KTtcbiAgICBpZiAocHJpb3JpdHkgIT09IDApIHJldHVybiBwcmlvcml0eTtcbiAgICByZXR1cm4gU3RyaW5nKGxlZnQua2V5d29yZCB8fCBsZWZ0LnRlcm0gfHwgJycpLmxvY2FsZUNvbXBhcmUoU3RyaW5nKHJpZ2h0LmtleXdvcmQgfHwgcmlnaHQudGVybSB8fCAnJykpO1xuICB9KTtcblxuICByZXR1cm4gYFxuICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOjE2cHg7XCI+XG4gICAgICA8aDQgc3R5bGU9XCJtYXJnaW46MCAwIDhweDtmb250LXNpemU6MXJlbTtjb2xvcjojMzM0MTU1O1wiPiR7ZXNjYXBlSHRtbCh0aXRsZSl9PC9oND5cbiAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC44MmVtO2NvbG9yOiM2NDc0OGI7bWFyZ2luLWJvdHRvbTo4cHg7XCI+JHtleGFjdENvdW50fSBleGFjdCBcdTIwMjIgJHtwYXJ0aWFsQ291bnR9IHBhcnRpYWwgXHUyMDIyICR7bWlzc2luZ0NvdW50fSBtaXNzaW5nPC9kaXY+XG4gICAgICA8dGFibGUgc3R5bGU9XCJ3aWR0aDoxMDAlO2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTtmb250LXNpemU6MC45ZW07XCI+XG4gICAgICAgIDx0aGVhZD5cbiAgICAgICAgICA8dHIgc3R5bGU9XCJ0ZXh0LWFsaWduOmxlZnQ7Y29sb3I6IzY0NzQ4Yjtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZTJlOGYwO1wiPlxuICAgICAgICAgICAgPHRoIHN0eWxlPVwicGFkZGluZzo2cHggOHB4O1wiPktleXdvcmQ8L3RoPlxuICAgICAgICAgICAgPHRoIHN0eWxlPVwicGFkZGluZzo2cHggOHB4O1wiPkNvdmVyYWdlPC90aD5cbiAgICAgICAgICAgIDx0aCBzdHlsZT1cInBhZGRpbmc6NnB4IDhweDtcIj5TZWN0aW9uczwvdGg+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgPC90aGVhZD5cbiAgICAgICAgPHRib2R5PlxuICAgICAgICAgICR7c29ydGVkLm1hcChrZXl3b3JkID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGt3ID0ga2V5d29yZC5rZXl3b3JkIHx8IGtleXdvcmQudGVybSB8fCAnJztcbiAgICAgICAgICAgIGNvbnN0IHNlY3Rpb25zID0gQXJyYXkuaXNBcnJheShrZXl3b3JkLm1hdGNoZWRfaW5fc2VjdGlvbnMpICYmIGtleXdvcmQubWF0Y2hlZF9pbl9zZWN0aW9ucy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgID8ga2V5d29yZC5tYXRjaGVkX2luX3NlY3Rpb25zLmpvaW4oJywgJylcbiAgICAgICAgICAgICAgOiAnTm90IGZvdW5kJztcbiAgICAgICAgICAgIGNvbnN0IHN5bkFubm90ID0gX2t3U3luQW5ub3RhdGlvbihrdywgc3luTWFwKTtcbiAgICAgICAgICAgIGNvbnN0IHN5bkh0bWwgPSBzeW5Bbm5vdFxuICAgICAgICAgICAgICA/IGA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuNzhlbTtjb2xvcjojNjQ3NDhiO21hcmdpbi10b3A6MnB4O1wiIHRpdGxlPVwiU3lub255bSBncm91cGluZ1wiPiR7ZXNjYXBlSHRtbChzeW5Bbm5vdCl9PC9kaXY+YFxuICAgICAgICAgICAgICA6ICcnO1xuICAgICAgICAgICAgcmV0dXJuIGBcbiAgICAgICAgICAgICAgPHRyIHN0eWxlPVwiYm9yZGVyLWJvdHRvbToxcHggc29saWQgI2YxZjVmOTt2ZXJ0aWNhbC1hbGlnbjp0b3A7XCI+XG4gICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzo4cHg7XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6NjAwO2NvbG9yOiMxZTI5M2I7XCI+JHtlc2NhcGVIdG1sKGt3KX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC44ZW07Y29sb3I6Izk0YTNiODt0ZXh0LXRyYW5zZm9ybTpjYXBpdGFsaXplO1wiPiR7ZXNjYXBlSHRtbChfa2V5d29yZFR5cGUoa2V5d29yZCkpfTwvZGl2PlxuICAgICAgICAgICAgICAgICAgJHtzeW5IdG1sfVxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzo4cHg7XCI+JHtfa2V5d29yZFN0YXR1c0JhZGdlKGtleXdvcmQpfTwvdGQ+XG4gICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzo4cHg7Y29sb3I6IzQ3NTU2OTtcIj4ke2VzY2FwZUh0bWwoc2VjdGlvbnMpfTwvdGQ+XG4gICAgICAgICAgICAgIDwvdHI+YDtcbiAgICAgICAgICB9KS5qb2luKCcnKX1cbiAgICAgICAgPC90Ym9keT5cbiAgICAgIDwvdGFibGU+XG4gICAgPC9kaXY+YDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBBVFMgUmVwb3J0IE1vZGFsXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBPcGVuIHRoZSBBVFMgUmVwb3J0IG1vZGFsLiBSZW5kZXJzIHRoZSBjYWNoZWQgQVRTIHNjb3JlIGZyb20gc3RhdGUsIG9yXG4gKiBmZXRjaGVzIGEgZnJlc2ggc2NvcmUgaWYgbm9uZSBpcyBjYWNoZWQuXG4gKi9cbmZ1bmN0aW9uIF9hdHNFc2NhcGVIYW5kbGVyKGUpIHtcbiAgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgY2xvc2VBdHNSZXBvcnRNb2RhbCgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBvcGVuQXRzUmVwb3J0TW9kYWwoKSB7XG4gIHB1c2hGb2N1c1N0YWNrKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpO1xuICBjb25zdCBvdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F0cy1yZXBvcnQtbW9kYWwtb3ZlcmxheScpO1xuICBvdmVybGF5LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBfYXRzRXNjYXBlSGFuZGxlcik7XG4gIC8vIE1vdmUgZm9jdXMgdG8gdGhlIENsb3NlIGJ1dHRvbiBpbiB0aGUgbW9kYWwgZm9vdGVyXG4gIGNvbnN0IGNsb3NlQnRuID0gb3ZlcmxheS5xdWVyeVNlbGVjdG9yKCcubW9kYWwtZm9vdGVyIC5hY3Rpb24tYnRuJyk7XG4gIGlmIChjbG9zZUJ0bikgY2xvc2VCdG4uZm9jdXMoKTtcbiAgdHJhcEZvY3VzKCdhdHMtcmVwb3J0LW1vZGFsLW92ZXJsYXknKTtcbiAgY29uc3QgYm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdHMtcmVwb3J0LW1vZGFsLWJvZHknKTtcblxuICAvLyBBIGNhY2hlZCBzY29yZSByZW5kZXJzIGltbWVkaWF0ZWx5IHVzaW5nIHdoYXRldmVyIHN5bm9ueW0gbWFwIGlzIGFscmVhZHlcbiAgLy8gY2FjaGVkIChvciBub25lKSByYXRoZXIgdGhhbiBibG9ja2luZyBvbiBhIG5ldHdvcmsgcm91bmQtdHJpcCBmb3IgaXQgXHUyMDE0XG4gIC8vIHRoZSBhbm5vdGF0aW9ucyBhcmUgYW4gZW5yaWNobWVudCwgbm90IHJlcXVpcmVkIGZvciBfcmVuZGVyQXRzUmVwb3J0IHRvXG4gIC8vIHdvcmssIGFuZCBhIGNhY2hlZC1zY29yZSBvcGVuIHNob3VsZCBiZSBpbnN0YW50LlxuICBjb25zdCBjYWNoZWQgPSBzdGF0ZU1hbmFnZXI/LmdldEF0c1Njb3JlPy4oKTtcbiAgaWYgKGNhY2hlZCkge1xuICAgIGJvZHkuaW5uZXJIVE1MID0gX3JlbmRlckF0c1JlcG9ydChjYWNoZWQsIF9hdHNTeW5vbnltTWFwQ2FjaGUgfHwge30pO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGJvZHkuaW5uZXJIVE1MID0gJzxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDoxMnB4O3BhZGRpbmc6MjRweDtjb2xvcjojNmI3MjgwO1wiPjxkaXYgY2xhc3M9XCJsb2FkaW5nLXNwaW5uZXJcIiBzdHlsZT1cIndpZHRoOjIwcHg7aGVpZ2h0OjIwcHg7Ym9yZGVyLXdpZHRoOjJweDtmbGV4LXNocmluazowO1wiPjwvZGl2PjxzcGFuPkZldGNoaW5nIEFUUyBzY29yZVx1MjAyNjwvc3Bhbj48L2Rpdj4nO1xuICB0cnkge1xuICAgIGNvbnN0IHNlc3Npb25JZCA9IHN0YXRlTWFuYWdlcj8uZ2V0U2Vzc2lvbklkPy4oKTtcbiAgICBjb25zdCBbc3luTWFwLCByZXNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgX2xvYWRBdHNTeW5vbnltTWFwKCksXG4gICAgICBmZXRjaCgnL2FwaS9jdi9hdHMtc2NvcmUnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBzZXNzaW9uX2lkOiBzZXNzaW9uSWQsIGJhc2lzOiAncmV2aWV3X2NoZWNrcG9pbnQnIH0pLFxuICAgICAgfSksXG4gICAgXSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEub2sgJiYgZGF0YS5hdHNfc2NvcmUpIHtcbiAgICAgIHN0YXRlTWFuYWdlcj8uc2V0QXRzU2NvcmU/LihkYXRhLmF0c19zY29yZSk7XG4gICAgICB1cGRhdGVBdHNCYWRnZShkYXRhLmF0c19zY29yZSk7XG4gICAgICBib2R5LmlubmVySFRNTCA9IF9yZW5kZXJBdHNSZXBvcnQoZGF0YS5hdHNfc2NvcmUsIHN5bk1hcCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJvZHkuaW5uZXJIVE1MID0gYDxwIHN0eWxlPVwicGFkZGluZzoyNHB4O2NvbG9yOiNlZjQ0NDQ7XCI+Q291bGQgbm90IGxvYWQgQVRTIHJlcG9ydDogJHtlc2NhcGVIdG1sKGRhdGEuZXJyb3IgfHwgJ3Vua25vd24gZXJyb3InKX08L3A+YDtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBib2R5LmlubmVySFRNTCA9IGA8cCBzdHlsZT1cInBhZGRpbmc6MjRweDtjb2xvcjojZWY0NDQ0O1wiPkVycm9yOiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX08L3A+YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBjbG9zZUF0c1JlcG9ydE1vZGFsKCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXRzLXJlcG9ydC1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIF9hdHNFc2NhcGVIYW5kbGVyKTtcbiAgcmVzdG9yZUZvY3VzKCk7XG59XG5cbi8qKlxuICogUmVuZGVyIGFuIEFUUyBzY29yZSBvYmplY3QgaW50byBIVE1MIGZvciB0aGUgbW9kYWwgYm9keS5cbiAqL1xuZnVuY3Rpb24gX3JlbmRlckF0c1JlcG9ydChzY29yZSwgc3luTWFwKSB7XG4gIGNvbnN0IG92ZXJhbGwgPSBNYXRoLnJvdW5kKHNjb3JlLm92ZXJhbGwgPz8gMCk7XG4gIGNvbnN0IGhhcmQgPSBNYXRoLnJvdW5kKHNjb3JlLmhhcmRfcmVxdWlyZW1lbnRfc2NvcmUgPz8gMCk7XG4gIGNvbnN0IHNvZnQgPSBNYXRoLnJvdW5kKHNjb3JlLnNvZnRfcmVxdWlyZW1lbnRfc2NvcmUgPz8gMCk7XG5cbiAgY29uc3Qgc2NvcmVDb2xvciA9IG92ZXJhbGwgPj0gNzUgPyAnIzEwYjk4MScgOiBvdmVyYWxsID49IDUwID8gJyNmNTllMGInIDogJyNlZjQ0NDQnO1xuXG4gIGNvbnN0IGtleXdvcmRzID0gc2NvcmUua2V5d29yZF9zdGF0dXMgfHwgW107XG4gIGNvbnN0IG1pc3NpbmdLdyA9IGtleXdvcmRzLmZpbHRlcihrZXl3b3JkID0+IF9rZXl3b3JkU3RhdHVzKGtleXdvcmQpID09PSAnbWlzc2luZycpO1xuICBjb25zdCBtaXNzaW5nSGFyZCA9IG1pc3NpbmdLdy5maWx0ZXIoa2V5d29yZCA9PiBfa2V5d29yZFR5cGUoa2V5d29yZCkgPT09ICdoYXJkJyk7XG4gIGNvbnN0IGtleXdvcmRHcm91cHMgPSBBVFNfR1JPVVBTXG4gICAgLm1hcCgoW3R5cGUsIHRpdGxlXSkgPT4gX3JlbmRlcktleXdvcmRHcm91cCh0aXRsZSwga2V5d29yZHMuZmlsdGVyKGtleXdvcmQgPT4gX2tleXdvcmRUeXBlKGtleXdvcmQpID09PSB0eXBlKSwgc3luTWFwKSlcbiAgICAuam9pbignJyk7XG5cbiAgY29uc3Qgc2VjdGlvblNjb3JlcyA9IHNjb3JlLnNlY3Rpb25fc2NvcmVzIHx8IHt9O1xuICBjb25zdCBzZWN0SHRtbCA9IE9iamVjdC5rZXlzKHNlY3Rpb25TY29yZXMpLmxlbmd0aCA9PT0gMCA/ICcnIDogYFxuICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOjE2cHg7XCI+XG4gICAgICA8aDQgc3R5bGU9XCJtYXJnaW46MCAwIDhweDtmb250LXNpemU6MXJlbTtjb2xvcjojMzM0MTU1O1wiPlNlY3Rpb24gU2NvcmVzPC9oND5cbiAgICAgIDx0YWJsZSBzdHlsZT1cIndpZHRoOjEwMCU7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlO2ZvbnQtc2l6ZTowLjllbTtcIj5cbiAgICAgICAgJHtPYmplY3QuZW50cmllcyhzZWN0aW9uU2NvcmVzKS5tYXAoKFtzZWMsIHZhbF0pID0+IGBcbiAgICAgICAgICA8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZjFmNWY5O1wiPlxuICAgICAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzo0cHggOHB4O3RleHQtdHJhbnNmb3JtOmNhcGl0YWxpemU7Y29sb3I6IzQ3NTU2OTtcIj4ke2VzY2FwZUh0bWwoc2VjKX08L3RkPlxuICAgICAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzo0cHggOHB4O2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjojMWUyOTNiO1wiPiR7TWF0aC5yb3VuZCh2YWwpfSU8L3RkPlxuICAgICAgICAgIDwvdHI+YCkuam9pbignJyl9XG4gICAgICA8L3RhYmxlPlxuICAgIDwvZGl2PmA7XG5cbiAgcmV0dXJuIGBcbiAgICA8ZGl2IHN0eWxlPVwicGFkZGluZzoyMHB4O1wiPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjI0cHg7bWFyZ2luLWJvdHRvbToyMHB4O1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjIuNGVtO2ZvbnQtd2VpZ2h0OjcwMDtjb2xvcjoke3Njb3JlQ29sb3J9O1wiPiR7b3ZlcmFsbH0lPC9kaXY+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjllbTtjb2xvcjojNDc1NTY5O1wiPkhhcmQgcmVxdWlyZW1lbnRzOiA8c3Ryb25nPiR7aGFyZH0lPC9zdHJvbmc+PC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjllbTtjb2xvcjojNDc1NTY5O1wiPlByZWZlcnJlZCBza2lsbHM6IDxzdHJvbmc+JHtzb2Z0fSU8L3N0cm9uZz48L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuNzVlbTtjb2xvcjojOTRhM2I4O21hcmdpbi10b3A6MnB4O1wiPkJhc2lzOiAke2VzY2FwZUh0bWwoc2NvcmUuYmFzaXMgfHwgJ3JldmlldycpfTwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC43NWVtO2NvbG9yOiM5NGEzYjg7bWFyZ2luLXRvcDo0cHg7XCIgdGl0bGU9XCJTY29yZSB0aHJlc2hvbGRzXCI+XG4gICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIiBzdHlsZT1cImNvbG9yOiMxMGI5ODE7XCI+XHUyNUNGPC9zcGFuPiBcdTIyNjU3NSUgU3Ryb25nIG1hdGNoICZuYnNwO1xuICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCIgc3R5bGU9XCJjb2xvcjojZjU5ZTBiO1wiPlx1MjVDRjwvc3Bhbj4gNTBcdTIwMTM3NCUgUGFydGlhbCBtYXRjaCAmbmJzcDtcbiAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIHN0eWxlPVwiY29sb3I6I2VmNDQ0NDtcIj5cdTI1Q0Y8L3NwYW4+ICZsdDs1MCUgTG93IG1hdGNoXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICAke2tleXdvcmRHcm91cHN9XG4gICAgICAke3NlY3RIdG1sfVxuICAgICAgJHttaXNzaW5nSGFyZC5sZW5ndGggPiAwID8gYFxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDoxNnB4O3BhZGRpbmc6MTJweDtiYWNrZ3JvdW5kOiNmZmY3ZWQ7Ym9yZGVyOjFweCBzb2xpZCAjZmVkN2FhO2JvcmRlci1yYWRpdXM6NnB4O1wiPlxuICAgICAgICAgIDxzdHJvbmcgc3R5bGU9XCJjb2xvcjojOWEzNDEyO1wiPk1pc3NpbmcgaGFyZCByZXF1aXJlbWVudHMgKCR7bWlzc2luZ0hhcmQubGVuZ3RofSk6PC9zdHJvbmc+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjojN2MyZDEyO2ZvbnQtc2l6ZTowLjllbTtcIj4gJHttaXNzaW5nSGFyZC5tYXAoa2V5d29yZCA9PiBlc2NhcGVIdG1sKGtleXdvcmQua2V5d29yZCB8fCBrZXl3b3JkLnRlcm0gfHwgJycpKS5qb2luKCcsICcpfTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+YCA6ICcnfVxuICAgICAgJHttaXNzaW5nS3cubGVuZ3RoID4gbWlzc2luZ0hhcmQubGVuZ3RoID8gYFxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDoxNnB4O3BhZGRpbmc6MTJweDtiYWNrZ3JvdW5kOiNmZmY3ZWQ7Ym9yZGVyOjFweCBzb2xpZCAjZmVkN2FhO2JvcmRlci1yYWRpdXM6NnB4O1wiPlxuICAgICAgICAgIDxzdHJvbmcgc3R5bGU9XCJjb2xvcjojOWEzNDEyO1wiPlJlbWFpbmluZyBrZXl3b3JkIGdhcHMgKCR7bWlzc2luZ0t3Lmxlbmd0aCAtIG1pc3NpbmdIYXJkLmxlbmd0aH0pOjwvc3Ryb25nPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6IzdjMmQxMjtmb250LXNpemU6MC45ZW07XCI+ICR7bWlzc2luZ0t3LmZpbHRlcihrZXl3b3JkID0+IF9rZXl3b3JkVHlwZShrZXl3b3JkKSAhPT0gJ2hhcmQnKS5tYXAoa2V5d29yZCA9PiBlc2NhcGVIdG1sKGtleXdvcmQua2V5d29yZCB8fCBrZXl3b3JkLnRlcm0gfHwgJycpKS5qb2luKCcsICcpfTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+YCA6ICcnfVxuICAgIDwvZGl2PmA7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gSm9iIEFuYWx5c2lzIE1vZGFsXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBPcGVuIHRoZSBKb2IgQW5hbHlzaXMgbW9kYWwuIFJldXNlcyB0YWJEYXRhLmFuYWx5c2lzIGlmIGF2YWlsYWJsZS5cbiAqL1xuZnVuY3Rpb24gX2pvYkFuYWx5c2lzRXNjYXBlSGFuZGxlcihlKSB7XG4gIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIGNsb3NlSm9iQW5hbHlzaXNNb2RhbCgpO1xufVxuXG5mdW5jdGlvbiBvcGVuSm9iQW5hbHlzaXNNb2RhbCgpIHtcbiAgcHVzaEZvY3VzU3RhY2soZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7XG4gIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnam9iLWFuYWx5c2lzLW1vZGFsLW92ZXJsYXknKTtcbiAgb3ZlcmxheS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgX2pvYkFuYWx5c2lzRXNjYXBlSGFuZGxlcik7XG4gIGNvbnN0IGNsb3NlQnRuID0gb3ZlcmxheS5xdWVyeVNlbGVjdG9yKCcubW9kYWwtZm9vdGVyIC5hY3Rpb24tYnRuJyk7XG4gIGlmIChjbG9zZUJ0bikgY2xvc2VCdG4uZm9jdXMoKTtcbiAgdHJhcEZvY3VzKCdqb2ItYW5hbHlzaXMtbW9kYWwtb3ZlcmxheScpO1xuICBjb25zdCBib2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pvYi1hbmFseXNpcy1tb2RhbC1ib2R5Jyk7XG5cbiAgY29uc3QgYW5hbHlzaXMgPSBzdGF0ZU1hbmFnZXIuZ2V0VGFiRGF0YSgnYW5hbHlzaXMnKTtcbiAgaWYgKGFuYWx5c2lzKSB7XG4gICAgLy8gUmVuZGVyIGludG8gYSB0ZW1wIGRpdiB1c2luZyBwb3B1bGF0ZUFuYWx5c2lzVGFiJ3Mgb3V0cHV0IHBhdHRlcm5cbiAgICBjb25zdCB0bXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0bXAuc3R5bGUucGFkZGluZyA9ICcyMHB4JztcbiAgICBib2R5LmlubmVySFRNTCA9ICcnO1xuICAgIGJvZHkuYXBwZW5kQ2hpbGQodG1wKTtcbiAgICAvLyBwb3B1bGF0ZUFuYWx5c2lzVGFiIHdyaXRlcyB0byAjZG9jdW1lbnQtY29udGVudDsgdXNlIGEgc2hpbVxuICAgIF9yZW5kZXJBbmFseXNpc0ludG9FbCh0bXAsIGFuYWx5c2lzKTtcbiAgfSBlbHNlIHtcbiAgICBib2R5LmlubmVySFRNTCA9ICc8cCBzdHlsZT1cInBhZGRpbmc6MjRweDt0ZXh0LWFsaWduOmNlbnRlcjtjb2xvcjojNmI3MjgwO1wiPk5vIGpvYiBhbmFseXNpcyBhdmFpbGFibGUuIFJ1biBqb2IgYW5hbHlzaXMgZmlyc3QuPC9wPic7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2xvc2VKb2JBbmFseXNpc01vZGFsKCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnam9iLWFuYWx5c2lzLW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgX2pvYkFuYWx5c2lzRXNjYXBlSGFuZGxlcik7XG4gIHJlc3RvcmVGb2N1cygpO1xufVxuXG4vKipcbiAqIFJlbmRlciBqb2IgYW5hbHlzaXMgZGF0YSBpbnRvIGFuIGFyYml0cmFyeSBjb250YWluZXIgZWxlbWVudC5cbiAqIE1pcnJvcnMgdGhlIHN0cnVjdHVyZSBmcm9tIHBvcHVsYXRlQW5hbHlzaXNUYWIgaW4gYXBwLmpzLlxuICovXG5mdW5jdGlvbiBfcmVuZGVyQW5hbHlzaXNJbnRvRWwoZWwsIHJlc3VsdCkge1xuICBpZiAoIXJlc3VsdCkge1xuICAgIGVsLmlubmVySFRNTCA9ICc8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7XCI+Tm8gYW5hbHlzaXMgZGF0YS48L3A+JztcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBEZWR1cGxpY2F0ZSBsaXN0czogY2FzZS1pbnNlbnNpdGl2ZSwga2VlcCBmaXJzdCBvY2N1cnJlbmNlIG9mIGVhY2ggbm9ybWFsaXNlZCBmb3JtLlxuICBjb25zdCBfZGVkdXAgPSAoYXJyKSA9PiB7XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQoKTtcbiAgICByZXR1cm4gKGFyciB8fCBbXSkuZmlsdGVyKGl0ZW0gPT4ge1xuICAgICAgY29uc3Qga2V5ID0gU3RyaW5nKHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJyA/IGl0ZW0gOiBpdGVtLmtleXdvcmQgfHwgaXRlbS50ZXJtIHx8ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmICgha2V5IHx8IHNlZW4uaGFzKGtleSkpIHJldHVybiBmYWxzZTtcbiAgICAgIHNlZW4uYWRkKGtleSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgfTtcbiAgY29uc3QgcmVxID0gX2RlZHVwKHJlc3VsdC5yZXF1aXJlZF9za2lsbHMpO1xuICBjb25zdCBwcmVmID0gX2RlZHVwKHJlc3VsdC5wcmVmZXJyZWRfc2tpbGxzIHx8IHJlc3VsdC5uaWNlX3RvX2hhdmUpO1xuICBjb25zdCBrZXl3b3JkcyA9IF9kZWR1cChyZXN1bHQuYXRzX2tleXdvcmRzKTtcbiAgY29uc3QgY3VsdHVyZSA9IHJlc3VsdC5jdWx0dXJlX2luZGljYXRvcnMgfHwgW107XG4gIGNvbnN0IG11c3RIYXZlID0gcmVzdWx0Lm11c3RfaGF2ZV9yZXF1aXJlbWVudHMgfHwgW107XG4gIGNvbnN0IG1pc3NpbmcgPSByZXN1bHQubWlzc2luZ19yZXF1aXJlZCB8fCBbXTtcblxuICBlbC5pbm5lckhUTUwgPSBgXG4gICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjk1ZW07bGluZS1oZWlnaHQ6MS42O1wiPlxuICAgICAgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2Y4ZmFmYztib3JkZXI6MXB4IHNvbGlkICNlMmU4ZjA7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzoxNHB4IDE2cHg7bWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjEuMWVtO2ZvbnQtd2VpZ2h0OjcwMDtjb2xvcjojMWUyOTNiO1wiPiR7ZXNjYXBlSHRtbChyZXN1bHQuam9iX3RpdGxlIHx8IHJlc3VsdC50aXRsZSB8fCAnUm9sZScpfTwvZGl2PlxuICAgICAgICAke3Jlc3VsdC5jb21wYW55ID8gYDxkaXYgc3R5bGU9XCJjb2xvcjojNDc1NTY5O1wiPiR7ZXNjYXBlSHRtbChyZXN1bHQuY29tcGFueSl9PC9kaXY+YCA6ICcnfVxuICAgICAgICAke3Jlc3VsdC5kb21haW4gPyBgPHNwYW4gc3R5bGU9XCJkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW4tdG9wOjZweDtwYWRkaW5nOjJweCA4cHg7YmFja2dyb3VuZDojZGJlYWZlO2NvbG9yOiMxZTQwYWY7Ym9yZGVyLXJhZGl1czoxMHB4O2ZvbnQtc2l6ZTowLjhlbTtcIj4ke2VzY2FwZUh0bWwocmVzdWx0LmRvbWFpbil9PC9zcGFuPmAgOiAnJ31cbiAgICAgIDwvZGl2PlxuXG4gICAgICAke21pc3NpbmcubGVuZ3RoID4gMCA/IGBcbiAgICAgICAgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2ZmZjdlZDtib3JkZXI6MXB4IHNvbGlkICNmZWQ3YWE7Ym9yZGVyLXJhZGl1czo2cHg7cGFkZGluZzoxMHB4IDE0cHg7bWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgIDxzdHJvbmcgc3R5bGU9XCJjb2xvcjojOWEzNDEyO1wiPlx1MjZBMCBNaXNzaW5nIHJlcXVpcmVkIHNraWxsczo8L3N0cm9uZz5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiY29sb3I6IzdjMmQxMjttYXJnaW4tdG9wOjRweDtcIj4ke21pc3NpbmcubWFwKHMgPT4gZXNjYXBlSHRtbChzKSkuam9pbignIFx1MDBCNyAnKX08L2Rpdj5cbiAgICAgICAgPC9kaXY+YCA6ICcnfVxuXG4gICAgICAke3JlcS5sZW5ndGggPiAwID8gYFxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgIDxoNCBzdHlsZT1cIm1hcmdpbjowIDAgOHB4O2ZvbnQtc2l6ZTowLjk1ZW07dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO2xldHRlci1zcGFjaW5nOi41cHg7Y29sb3I6IzMzNDE1NTtcIj5SZXF1aXJlZCBTa2lsbHM8L2g0PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7ZmxleC13cmFwOndyYXA7Z2FwOjZweDtcIj5cbiAgICAgICAgICAgICR7cmVxLm1hcChzID0+IGA8c3BhbiBzdHlsZT1cInBhZGRpbmc6MnB4IDEwcHg7Ym9yZGVyLXJhZGl1czoxMnB4O2JhY2tncm91bmQ6JHttaXNzaW5nLmluY2x1ZGVzKHMpPycjZmVlMmUyJzonI2RjZmNlNyd9O2NvbG9yOiR7bWlzc2luZy5pbmNsdWRlcyhzKT8nIzk5MWIxYic6JyMxNjY1MzQnfTtmb250LXNpemU6MC44NWVtO1wiPiR7ZXNjYXBlSHRtbChzKX08L3NwYW4+YCkuam9pbignJyl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PmAgOiAnJ31cblxuICAgICAgJHtwcmVmLmxlbmd0aCA+IDAgPyBgXG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgICAgPGg0IHN0eWxlPVwibWFyZ2luOjAgMCA4cHg7Zm9udC1zaXplOjAuOTVlbTt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7bGV0dGVyLXNwYWNpbmc6LjVweDtjb2xvcjojMzM0MTU1O1wiPlByZWZlcnJlZCAvIE5pY2UtdG8taGF2ZTwvaDQ+XG4gICAgICAgICAgPHVsIHN0eWxlPVwibWFyZ2luOjA7cGFkZGluZy1sZWZ0OjE4cHg7Y29sb3I6IzQ3NTU2OTtcIj4ke3ByZWYubWFwKHMgPT4gYDxsaT4ke2VzY2FwZUh0bWwocyl9PC9saT5gKS5qb2luKCcnKX08L3VsPlxuICAgICAgICA8L2Rpdj5gIDogJyd9XG5cbiAgICAgICR7a2V5d29yZHMubGVuZ3RoID4gMCA/IGBcbiAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTRweDtcIj5cbiAgICAgICAgICA8aDQgc3R5bGU9XCJtYXJnaW46MCAwIDhweDtmb250LXNpemU6MC45NWVtO3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTtsZXR0ZXItc3BhY2luZzouNXB4O2NvbG9yOiMzMzQxNTU7XCI+QVRTIEtleXdvcmRzPC9oND5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2ZsZXgtd3JhcDp3cmFwO2dhcDo2cHg7XCI+XG4gICAgICAgICAgICAke2tleXdvcmRzLm1hcCgoaywgaSkgPT4gYDxzcGFuIHN0eWxlPVwicGFkZGluZzoycHggOHB4O2JvcmRlci1yYWRpdXM6MTJweDtiYWNrZ3JvdW5kOiNmMGY5ZmY7Ym9yZGVyOjFweCBzb2xpZCAjYmFlNmZkO2NvbG9yOiMwMzY5YTE7Zm9udC1zaXplOjAuODJlbTtcIj4ke2kgPCA1ID8gYDxzdHJvbmc+IyR7aSsxfTwvc3Ryb25nPiBgIDogJyd9JHtlc2NhcGVIdG1sKHR5cGVvZiBrID09PSAnc3RyaW5nJyA/IGsgOiBrLmtleXdvcmQgfHwgay50ZXJtIHx8ICcnKX08L3NwYW4+YCkuam9pbignJyl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PmAgOiAnJ31cblxuICAgICAgJHttdXN0SGF2ZS5sZW5ndGggPiAwID8gYFxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgIDxoNCBzdHlsZT1cIm1hcmdpbjowIDAgOHB4O2ZvbnQtc2l6ZTowLjk1ZW07dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO2xldHRlci1zcGFjaW5nOi41cHg7Y29sb3I6IzMzNDE1NTtcIj5NdXN0LWhhdmUgUmVxdWlyZW1lbnRzPC9oND5cbiAgICAgICAgICA8dWwgc3R5bGU9XCJtYXJnaW46MDtwYWRkaW5nLWxlZnQ6MThweDtjb2xvcjojNDc1NTY5O1wiPiR7bXVzdEhhdmUubWFwKHMgPT4gYDxsaT4ke2VzY2FwZUh0bWwocyl9PC9saT5gKS5qb2luKCcnKX08L3VsPlxuICAgICAgICA8L2Rpdj5gIDogJyd9XG5cbiAgICAgICR7Y3VsdHVyZS5sZW5ndGggPiAwID8gYFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxoNCBzdHlsZT1cIm1hcmdpbjowIDAgOHB4O2ZvbnQtc2l6ZTowLjk1ZW07dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO2xldHRlci1zcGFjaW5nOi41cHg7Y29sb3I6IzMzNDE1NTtcIj5DdWx0dXJlIEluZGljYXRvcnM8L2g0PlxuICAgICAgICAgIDx1bCBzdHlsZT1cIm1hcmdpbjowO3BhZGRpbmctbGVmdDoxOHB4O2NvbG9yOiM0NzU1Njk7XCI+JHtjdWx0dXJlLm1hcChzID0+IGA8bGk+JHtlc2NhcGVIdG1sKHMpfTwvbGk+YCkuam9pbignJyl9PC91bD5cbiAgICAgICAgPC9kaXY+YCA6ICcnfVxuICAgIDwvZGl2PmA7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQVRTIFNjb3JlIFRhYiAoaW4gY3VzdG9taXplIHBoYXNlKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogUG9wdWxhdGUgdGhlIEFUUyBTY29yZSB0YWIgY29udGVudCBhcmVhLlxuICogQ2FsbGVkIGJ5IGFwcC5qcyBzd2l0Y2hUYWIgd2hlbiBjYXNlICdhdHMtc2NvcmUnIGlzIHNlbGVjdGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBwb3B1bGF0ZUF0c1Njb3JlVGFiKCkge1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgaWYgKCFjb250ZW50KSByZXR1cm47XG5cbiAgY29uc3QgY2FjaGVkID0gc3RhdGVNYW5hZ2VyPy5nZXRBdHNTY29yZT8uKCk7XG4gIGlmIChjYWNoZWQpIHtcbiAgICBjb250ZW50LmlubmVySFRNTCA9IGA8ZGl2IHN0eWxlPVwibWF4LXdpZHRoOjY4MHB4O21hcmdpbjowIGF1dG87XCI+JHtfcmVuZGVyQXRzUmVwb3J0KGNhY2hlZCl9PC9kaXY+YDtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb250ZW50LmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwiZW1wdHktc3RhdGVcIj48ZGl2IGNsYXNzPVwiaWNvblwiPlx1RDgzRFx1RENDQTwvZGl2PjxoMz5BVFMgU2NvcmU8L2gzPjxwPkNvbXBsZXRlIGpvYiBhbmFseXNpcyBhbmQgc2tpbGxzIHJldmlldyB0byBzZWUgeW91ciBBVFMgc2NvcmU8L3A+PGJ1dHRvbiBjbGFzcz1cImJ0bi1wcmltYXJ5XCIgb25jbGljaz1cInJlZnJlc2hBdHNTY29yZShcXCdyZXZpZXdfY2hlY2twb2ludFxcJykudGhlbigoKT0+cG9wdWxhdGVBdHNTY29yZVRhYigpKVwiPkNvbXB1dGUgQVRTIFNjb3JlPC9idXR0b24+PC9kaXY+Jztcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTaG93L2hpZGUgdGhlIG1vZGFsIHNob3J0Y3V0IGJ1dHRvbnMgd2hlbiBBVFMgYmFkZ2UgYmVjb21lcyB2aXNpYmxlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBTaG93IG9yIGhpZGUgdGhlIEFUUyBSZXBvcnQgYW5kIEpvYiBBbmFseXNpcyBzaG9ydGN1dCBidXR0b25zLlxuICogRHJpdmVuIGJ5IHRoZSAnYXRzLXNjb3JlLXVwZGF0ZWQnIGN1c3RvbSBldmVudCBkaXNwYXRjaGVkIGJ5IGFwcC5qc1xuICogd2hlbmV2ZXIgdXBkYXRlQXRzQmFkZ2UoKSBydW5zLiBObyBtb25rZXktcGF0Y2hpbmcgcmVxdWlyZWQuXG4gKi9cbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2F0cy1zY29yZS11cGRhdGVkJywgKCkgPT4ge1xuICBjb25zdCBiYWRnZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdHMtc2NvcmUtYmFkZ2UnKTtcbiAgY29uc3QgdmlzaWJsZSA9IGJhZGdlICYmIGJhZGdlLnN0eWxlLmRpc3BsYXkgIT09ICdub25lJztcbiAgY29uc3QgcmVwb3J0QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F0cy1yZXBvcnQtYnRuJyk7XG4gIGNvbnN0IGFuYWx5c2lzQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pvYi1hbmFseXNpcy1idG4nKTtcbiAgaWYgKHJlcG9ydEJ0bikgcmVwb3J0QnRuLnN0eWxlLmRpc3BsYXkgPSB2aXNpYmxlID8gJ2lubGluZS1ibG9jaycgOiAnbm9uZSc7XG4gIGlmIChhbmFseXNpc0J0bikgYW5hbHlzaXNCdG4uc3R5bGUuZGlzcGxheSA9IHZpc2libGUgPyAnaW5saW5lLWJsb2NrJyA6ICdub25lJztcbn0pO1xuXG5leHBvcnQge1xuICBvcGVuQXRzUmVwb3J0TW9kYWwsXG4gIGNsb3NlQXRzUmVwb3J0TW9kYWwsXG4gIF9yZW5kZXJBdHNSZXBvcnQsXG4gIG9wZW5Kb2JBbmFseXNpc01vZGFsLFxuICBjbG9zZUpvYkFuYWx5c2lzTW9kYWwsXG4gIF9yZW5kZXJBbmFseXNpc0ludG9FbCxcbiAgcG9wdWxhdGVBdHNTY29yZVRhYixcbn07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9zZXNzaW9uLWFjdGlvbnMuanNcbiAqIFNlc3Npb24tbGV2ZWwgZGlzcGF0Y2ggKHNlbmRBY3Rpb24pLCBzYXZlLCBhbmQgcG9zaXRpb24gdGl0bGUgdXBkYXRlcy5cbiAqXG4gKiBERVBFTkRFTkNJRVMgKGFsbCBvbiBnbG9iYWxUaGlzIGF0IHJ1bnRpbWUpOlxuICogICAtIHN0YXRlTWFuYWdlciAoc3RhdGUtbWFuYWdlci5qcyBcdTIwMTQgaXNMb2FkaW5nKCkvc2V0VGFiRGF0YSgpKVxuICogICAtIHVzZXJTZWxlY3Rpb25zICh3aW5kb3cgZ2xvYmFsIGZyb20gYXBwKVxuICogICAtIGFwcGVuZExvYWRpbmdNZXNzYWdlLCByZW1vdmVMb2FkaW5nTWVzc2FnZSwgYXBwZW5kTWVzc2FnZSwgYXBwZW5kUmV0cnlNZXNzYWdlXG4gKiAgIC0gc2V0TG9hZGluZywgbGxtRmV0Y2ggKGZldGNoLXV0aWxzLmpzKVxuICogICAtIHBhcnNlTWVzc2FnZVJlc3BvbnNlLCBwYXJzZVN0YXR1c1Jlc3BvbnNlICh2YWxpZGF0b3JzLmpzKVxuICogICAtIGhhbmRsZUN1c3RvbWl6YXRpb25SZXNwb25zZSAocmV2aWV3LXRhYmxlLWJhc2UuanMsIFRpZXIgNClcbiAqICAgLSByZWZyZXNoQXRzU2NvcmUsIHN3aXRjaFRhYiwgZmV0Y2hTdGF0dXMgKGdsb2JhbFRoaXMpXG4gKiAgIC0gY2xlYXJTdGF0ZSwgU3RvcmFnZUtleXMgKHN0YXRlLW1hbmFnZXIuanMgLyBhcGktY2xpZW50LmpzKVxuICogICAtIHNob3dMb2FkSm9iUGFuZWwsIGNsZWFySm9iSW5wdXQsIGNsZWFyVVJMSW5wdXQsIF9jbGVhckZpZWxkRXJyb3IsXG4gKiAgICAgX3VwZGF0ZVBhc3RlQ2hhckNvdW50IChqb2ItaW5wdXQuanMsIFRpZXIgMylcbiAqICAgLSBub3JtYWxpemVQb3NpdGlvbkxhYmVsLCBleHRyYWN0VGl0bGVBbmRDb21wYW55RnJvbUpvYlRleHQsXG4gKiAgICAgY2xlYW5Kc29uUmVzcG9uc2UgKHV0aWxzLmpzKVxuICogICAtIF91cGRhdGVTZXNzaW9uU3dpdGNoZXJIZWFkZXIgKHNlc3Npb24tc3dpdGNoZXItdWkuanMsIFRpZXIgNylcbiAqL1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5jb25zdCBsb2cgPSBnZXRMb2dnZXIoJ3Nlc3Npb24tYWN0aW9ucycpO1xuXG5pbXBvcnQgeyBTdG9yYWdlS2V5cyB9IGZyb20gJy4vYXBpLWNsaWVudC5qcyc7XG5pbXBvcnQgeyBzdGF0ZU1hbmFnZXIgfSBmcm9tICcuL3N0YXRlLW1hbmFnZXIuanMnO1xuXG4vKiogTWFwcyBhY3Rpb24gaWRlbnRpZmllcnMgdG8gaHVtYW4tcmVhZGFibGUgTExNIHN0YXR1cyBiYXIgbGFiZWxzLiAqL1xuY29uc3QgX0FDVElPTl9MQUJFTFMgPSB7XG4gIGFuYWx5emVfam9iOiAgICAgICAgICAgICAgJ0FuYWx5c2luZyBqb2IgZGVzY3JpcHRpb25cdTIwMjYnLFxuICByZWNvbW1lbmRfY3VzdG9taXphdGlvbnM6ICdHZW5lcmF0aW5nIGN1c3RvbWlzYXRpb24gcmVjb21tZW5kYXRpb25zXHUyMDI2JyxcbiAgZ2VuZXJhdGVfY3Y6ICAgICAgICAgICAgICAnR2VuZXJhdGluZyBDViBmaWxlc1x1MjAyNicsXG59O1xuXG5hc3luYyBmdW5jdGlvbiBzZW5kQWN0aW9uKGFjdGlvbikge1xuICBpZiAoc3RhdGVNYW5hZ2VyLmlzTG9hZGluZygpKSByZXR1cm47XG5cbiAgY29uc3QgbG9hZGluZ01zZyA9IGFwcGVuZExvYWRpbmdNZXNzYWdlKGBFeGVjdXRpbmcgJHthY3Rpb259Li4uYCk7XG4gIHNldExvYWRpbmcodHJ1ZSwgX0FDVElPTl9MQUJFTFNbYWN0aW9uXSB8fCBgJHthY3Rpb24ucmVwbGFjZSgvXy9nLCAnICcpfVx1MjAyNmApO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcGF5bG9hZCA9IHsgYWN0aW9uIH07XG4gICAgaWYgKGFjdGlvbiA9PT0gJ3JlY29tbWVuZF9jdXN0b21pemF0aW9ucycgJiYgd2luZG93LnF1ZXN0aW9uQW5zd2Vycykge1xuICAgICAgcGF5bG9hZC51c2VyX3ByZWZlcmVuY2VzID0gd2luZG93LnF1ZXN0aW9uQW5zd2VycztcbiAgICB9XG5cbiAgICBjb25zdCByZXMgPSBhd2FpdCBsbG1GZXRjaCgnL2FwaS9hY3Rpb24nLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocGF5bG9hZCksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IHBhcnNlTWVzc2FnZVJlc3BvbnNlKGF3YWl0IHJlcy5qc29uKCkpO1xuXG4gICAgcmVtb3ZlTG9hZGluZ01lc3NhZ2UobG9hZGluZ01zZyk7XG5cbiAgICBpZiAoZGF0YS5lcnJvcikge1xuICAgICAgYXBwZW5kUmV0cnlNZXNzYWdlKCdcdTI3NEMgRXJyb3I6ICcgKyBkYXRhLmVycm9yLCAoKSA9PiBzZW5kQWN0aW9uKGFjdGlvbikpO1xuICAgIH0gZWxzZSBpZiAoYWN0aW9uID09PSAncmVjb21tZW5kX2N1c3RvbWl6YXRpb25zJykge1xuICAgICAgY29uc3QgY3VzdG9taXphdGlvbkRhdGEgPSBkYXRhLnJlc3VsdD8uY29udGV4dF9kYXRhPy5jdXN0b21pemF0aW9ucyA/PyBkYXRhLnJlc3VsdDtcbiAgICAgIGF3YWl0IGhhbmRsZUN1c3RvbWl6YXRpb25SZXNwb25zZShjdXN0b21pemF0aW9uRGF0YSk7XG4gICAgfSBlbHNlIGlmIChhY3Rpb24gPT09ICdnZW5lcmF0ZV9jdicpIHtcbiAgICAgIGNvbnN0IGdlbmVyYXRpb25Nc2cgPSBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCAnXHUyM0YzIEdlbmVyYXRpbmcgQ1YgZmlsZXMgKEFUUyBET0NYIFx1MjE5MiBIVE1MIFx1MjE5MiBIdW1hbiBET0NYKS4uLicpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMjA7IGkrKykge1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgNTAwKSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qgc3RhdHVzUmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL3N0YXR1cycpO1xuICAgICAgICAgIGNvbnN0IHN0YXR1c0RhdGEgPSBwYXJzZVN0YXR1c1Jlc3BvbnNlKGF3YWl0IHN0YXR1c1Jlcy5qc29uKCkpO1xuICAgICAgICAgIGNvbnN0IHByb2dyZXNzICAgPSBzdGF0dXNEYXRhLmdlbmVyYXRpb25fcHJvZ3Jlc3MgfHwgW107XG4gICAgICAgICAgaWYgKHByb2dyZXNzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHRvdGFsID0gcHJvZ3Jlc3MubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgZG9uZUNvdW50ID0gcHJvZ3Jlc3MuZmlsdGVyKHAgPT4gcC5zdGF0dXMgPT09ICdjb21wbGV0ZScpLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IGFjdGl2ZSA9IHByb2dyZXNzLmZpbmQocCA9PiBwLnN0YXR1cyAhPT0gJ2NvbXBsZXRlJyk7XG4gICAgICAgICAgICBjb25zdCBzdGVwTGFiZWwgPSBhY3RpdmVcbiAgICAgICAgICAgICAgPyBgJHthY3RpdmUuc3RlcC5yZXBsYWNlKC9fL2csICcgJyl9ICgke2RvbmVDb3VudCArIDF9IG9mICR7dG90YWx9KWBcbiAgICAgICAgICAgICAgOiBgJHt0b3RhbH0gb2YgJHt0b3RhbH0gY29tcGxldGVgO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBfdXBkYXRlTExNU3RhdHVzQmFyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgIF91cGRhdGVMTE1TdGF0dXNCYXIodHJ1ZSwgYEdlbmVyYXRpbmcgQ1Y6ICR7c3RlcExhYmVsfVx1MjAyNmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc3RlcHMgPSBwcm9ncmVzcy5tYXAocCA9PlxuICAgICAgICAgICAgICBgJHtwLnN0YXR1cyA9PT0gJ2NvbXBsZXRlJyA/ICdcdTI3MTMnIDogJ1x1MjNGMyd9ICR7cC5zdGVwLnJlcGxhY2UoL18vZywgJyAnKX0gJHtwLmVsYXBzZWRfbXMgPyBgKCR7cC5lbGFwc2VkX21zfW1zKWAgOiAnJ31gXG4gICAgICAgICAgICApLmpvaW4oJyBcdTIwMjIgJyk7XG4gICAgICAgICAgICBpZiAoZ2VuZXJhdGlvbk1zZykgZ2VuZXJhdGlvbk1zZy5xdWVyeVNlbGVjdG9yKCcuY29udGVudCcpLnRleHRDb250ZW50ID0gYEdlbmVyYXRpbmcgQ1Y6ICR7c3RlcHN9YDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHByb2dyZXNzLmV2ZXJ5KHAgPT4gcC5zdGF0dXMgPT09ICdjb21wbGV0ZScpICYmIHByb2dyZXNzLmxlbmd0aCA+IDApIGJyZWFrO1xuICAgICAgICB9IGNhdGNoIChfZSkgeyAvKiBwb2xsaW5nIGVycm9yIFx1MjAxNCBjb250aW51ZSAqLyB9XG4gICAgICB9XG4gICAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCAnQ1YgZ2VuZXJhdGVkIHN1Y2Nlc3NmdWxseSEgUmV2aWV3IHlvdXIgbGF5b3V0IGJlbG93LicpO1xuICAgICAgc3RhdGVNYW5hZ2VyLnNldFRhYkRhdGEoJ2N2JywgZGF0YS5yZXN1bHQpO1xuICAgICAgcmVmcmVzaEF0c1Njb3JlKCdwb3N0X2dlbmVyYXRpb24nKTtcbiAgICAgIHN3aXRjaFRhYignbGF5b3V0Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIGRhdGEucmVzdWx0KTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nLmVycm9yKCc9PT0gU0VORCBBQ1RJT04gRVJST1IgPT09JywgYWN0aW9uLCBlcnJvcik7XG4gICAgcmVtb3ZlTG9hZGluZ01lc3NhZ2UobG9hZGluZ01zZyk7XG4gICAgaWYgKGVycm9yLm5hbWUgIT09ICdBYm9ydEVycm9yJykge1xuICAgICAgYXBwZW5kUmV0cnlNZXNzYWdlKCdcdTI3NEMgRXJyb3I6ICcgKyBlcnJvci5tZXNzYWdlLCAoKSA9PiBzZW5kQWN0aW9uKGFjdGlvbikpO1xuICAgIH1cbiAgfVxuXG4gIHNldExvYWRpbmcoZmFsc2UpO1xuICBhd2FpdCBmZXRjaFN0YXR1cygpO1xuICBpZiAodHlwZW9mIGZldGNoQW5kRGlzcGxheUxsbUxvZyA9PT0gJ2Z1bmN0aW9uJykgZmV0Y2hBbmREaXNwbGF5TGxtTG9nKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNhdmVTZXNzaW9uKCkge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9zYXZlJywgeyBtZXRob2Q6ICdQT1NUJyB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgaWYgKGRhdGEuc2Vzc2lvbl9maWxlKSBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShTdG9yYWdlS2V5cy5TRVNTSU9OX1BBVEgsIGRhdGEuc2Vzc2lvbl9maWxlKTtcbiAgICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsICdTZXNzaW9uIHNhdmVkIHN1Y2Nlc3NmdWxseS4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwZW5kUmV0cnlNZXNzYWdlKCdcdTI3NEMgRXJyb3Igc2F2aW5nIHNlc3Npb246ICcgKyBkYXRhLmVycm9yLCBzYXZlU2Vzc2lvbik7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy5lcnJvcignPT09IFNBVkUgU0VTU0lPTiBFUlJPUiA9PT0nLCBlcnJvcik7XG4gICAgYXBwZW5kUmV0cnlNZXNzYWdlKCdcdTI3NEMgRXJyb3I6ICcgKyBlcnJvci5tZXNzYWdlLCBzYXZlU2Vzc2lvbik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2Zvcm1hdEJhckRhdGUodmFsdWUpIHtcbiAgY29uc3QgdGV4dCA9IFN0cmluZyh2YWx1ZSB8fCAnJykudHJpbSgpO1xuICBpZiAoIXRleHQpIHJldHVybiAnJztcbiAgaWYgKC9eXFxkezR9LVxcZHsyfS1cXGR7Mn0kLy50ZXN0KHRleHQpKSB7XG4gICAgY29uc3QgW3llYXIsIG1vbnRoLCBkYXldID0gdGV4dC5zcGxpdCgnLScpO1xuICAgIHJldHVybiBgJHttb250aH0vJHtkYXl9LyR7eWVhcn1gO1xuICB9XG4gIGNvbnN0IHBhcnNlZCA9IG5ldyBEYXRlKHRleHQpO1xuICBpZiAoIU51bWJlci5pc05hTihwYXJzZWQuZ2V0VGltZSgpKSkge1xuICAgIHJldHVybiBwYXJzZWQudG9JU09TdHJpbmcoKS5zbGljZSgwLCAxMCk7XG4gIH1cbiAgcmV0dXJuIHRleHQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVBvc2l0aW9uVGl0bGUoc3RhdHVzID0ge30pIHtcbiAgY29uc3QgcG9zaXRpb25FbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwb3NpdGlvbi10aXRsZScpO1xuICBpZiAoIXBvc2l0aW9uRWwpIHJldHVybjtcblxuICBjb25zdCBmYWxsYmFja0Jyb3dzZXJUaXRsZSA9ICdDViBCdWlsZGVyIFx1MjAxNCBQcm9mZXNzaW9uYWwgV2ViIFVJJztcbiAgbGV0IGxhYmVsID0gKHN0YXR1cy5wb3NpdGlvbl9uYW1lIHx8ICcnKS50b1N0cmluZygpLnRyaW0oKTtcbiAgbGV0IGNvbXBhbnkgPSAnJztcbiAgbGV0IGRhdGVBcHBsaWVkID0gJyc7XG5cbiAgaWYgKCFsYWJlbCAmJiBzdGF0dXMuam9iX2FuYWx5c2lzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGFuYWx5c2lzID0gdHlwZW9mIHN0YXR1cy5qb2JfYW5hbHlzaXMgPT09ICdzdHJpbmcnXG4gICAgICAgID8gSlNPTi5wYXJzZShjbGVhbkpzb25SZXNwb25zZShzdGF0dXMuam9iX2FuYWx5c2lzKSlcbiAgICAgICAgOiBzdGF0dXMuam9iX2FuYWx5c2lzO1xuICAgICAgY29uc3QgdGl0bGUgPSBhbmFseXNpcz8uam9iX3RpdGxlIHx8IGFuYWx5c2lzPy50aXRsZSB8fCBhbmFseXNpcz8ucG9zaXRpb25fbmFtZSB8fCAnJztcbiAgICAgIGxhYmVsID0gbm9ybWFsaXplUG9zaXRpb25MYWJlbCh0aXRsZSwgYW5hbHlzaXM/LmNvbXBhbnkpO1xuICAgICAgY29tcGFueSA9IChhbmFseXNpcz8uY29tcGFueV9uYW1lIHx8IGFuYWx5c2lzPy5jb21wYW55IHx8ICcnKS50cmltKCk7XG4gICAgICBkYXRlQXBwbGllZCA9IF9mb3JtYXRCYXJEYXRlKGFuYWx5c2lzPy5kYXRlX2FwcGxpZWQgfHwgYW5hbHlzaXM/LmFwcGxpY2F0aW9uX2RhdGUgfHwgJycpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2cud2FybignRmFpbGVkIHRvIHBhcnNlIGpvYl9hbmFseXNpcyBmb3IgdGl0bGU6JywgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIGlmICghbGFiZWwgJiYgc3RhdHVzLmpvYl9kZXNjcmlwdGlvbl90ZXh0KSB7XG4gICAgY29uc3QgcGFyc2VkID0gZXh0cmFjdFRpdGxlQW5kQ29tcGFueUZyb21Kb2JUZXh0KHN0YXR1cy5qb2JfZGVzY3JpcHRpb25fdGV4dCk7XG4gICAgbGFiZWwgPSBub3JtYWxpemVQb3NpdGlvbkxhYmVsKHBhcnNlZC50aXRsZSwgcGFyc2VkLmNvbXBhbnkpO1xuICAgIGlmICghY29tcGFueSkgY29tcGFueSA9IChwYXJzZWQuY29tcGFueSB8fCAnJykudHJpbSgpO1xuICB9XG5cbiAgcG9zaXRpb25FbC50ZXh0Q29udGVudCA9IGxhYmVsO1xuICBkb2N1bWVudC50aXRsZSA9IGxhYmVsID8gYCR7bGFiZWx9IFx1MjAxNCBDViBCdWlsZGVyYCA6IGZhbGxiYWNrQnJvd3NlclRpdGxlO1xuXG4gIGNvbnN0IHBvc2l0aW9uQ29tcGFueUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Bvc2l0aW9uLWNvbXBhbnknKTtcbiAgaWYgKHBvc2l0aW9uQ29tcGFueUVsKSB7XG4gICAgY29uc3QgaW50YWtlID0gd2luZG93Ll9zdGF0dXNJbnRha2UgfHwge307XG4gICAgY29uc3QgZmluYWxDb21wYW55ID0gKGludGFrZS5jb21wYW55IHx8ICcnKS50cmltKCkgfHwgY29tcGFueTtcbiAgICBjb25zdCBmaW5hbERhdGUgPSBkYXRlQXBwbGllZCB8fCBfZm9ybWF0QmFyRGF0ZShpbnRha2UuZGF0ZV9hcHBsaWVkIHx8ICcnKTtcbiAgICBjb25zdCBzdWJ0aXRsZSA9IFtmaW5hbENvbXBhbnksIGZpbmFsRGF0ZV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAgXHUwMEI3ICAnKTtcbiAgICBwb3NpdGlvbkNvbXBhbnlFbC50ZXh0Q29udGVudCA9IHN1YnRpdGxlO1xuICAgIHBvc2l0aW9uQ29tcGFueUVsLnN0eWxlLmRpc3BsYXkgPSBzdWJ0aXRsZSA/ICcnIDogJ25vbmUnO1xuICB9XG5cbiAgY29uc3QgcmVuYW1lQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlbmFtZS1zZXNzaW9uLWJ0bicpO1xuICBpZiAocmVuYW1lQnRuKSByZW5hbWVCdG4uc3R5bGUuZGlzcGxheSA9IGxhYmVsID8gJycgOiAnbm9uZSc7XG4gIGlmICh0eXBlb2YgX3VwZGF0ZVNlc3Npb25Td2l0Y2hlckhlYWRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIF91cGRhdGVTZXNzaW9uU3dpdGNoZXJIZWFkZXIoeyBwb3NpdGlvbl9uYW1lOiBsYWJlbCwgcGhhc2U6IHN0YXR1cy5waGFzZSB8fCBudWxsIH0pO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFUyBtb2R1bGUgZXhwb3J0cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmV4cG9ydCB7IHNlbmRBY3Rpb24sIHNhdmVTZXNzaW9uLCB1cGRhdGVQb3NpdGlvblRpdGxlLCBfQUNUSU9OX0xBQkVMUyB9O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvam9iLWFuYWx5c2lzLmpzXG4gKiBKb2IgYW5hbHlzaXMgb3JjaGVzdHJhdGlvbjogZmlyZXMgYW5hbHl6ZV9qb2IgYWN0aW9uLCBtZXJnZXMgcG9zdC1hbmFseXNpc1xuICogcXVlc3Rpb25zLCBhbmQgdHJhbnNpdGlvbnMgdGhlIFVJIHRvIHRoZSBhbmFseXNpcyB0YWIuXG4gKlxuICogREVQRU5ERU5DSUVTIChhbGwgb24gZ2xvYmFsVGhpcyBhdCBydW50aW1lKTpcbiAqICAgLSBzdGF0ZU1hbmFnZXIgKHN0YXRlLW1hbmFnZXIuanMgXHUyMDE0IGlzTG9hZGluZygpL3NldFRhYkRhdGEoKSlcbiAqICAgLSBsbG1GZXRjaCwgc2V0TG9hZGluZyAoZmV0Y2gtdXRpbHMuanMpXG4gKiAgIC0gYXBwZW5kTG9hZGluZ01lc3NhZ2UsIHJlbW92ZUxvYWRpbmdNZXNzYWdlLCBhcHBlbmRNZXNzYWdlLFxuICogICAgIGFwcGVuZFJldHJ5TWVzc2FnZSwgYXBwZW5kRm9ybWF0dGVkQW5hbHlzaXMgKG1lc3NhZ2UtcXVldWUuanMpXG4gKiAgIC0gcGFyc2VNZXNzYWdlUmVzcG9uc2UgKHZhbGlkYXRvcnMuanMpXG4gKiAgIC0gYXNrUG9zdEFuYWx5c2lzUXVlc3Rpb25zIChxdWVzdGlvbnMtcGFuZWwuanMpXG4gKiAgIC0gcmVmcmVzaEF0c1Njb3JlIChhdHMtcmVmaW5lbWVudC5qcylcbiAqICAgLSBzd2l0Y2hUYWIgKHJldmlldy10YWJsZS1iYXNlLmpzLCBUaWVyIDQpXG4gKiAgIC0gZmV0Y2hTdGF0dXMgKGFwcC5qcyBvcmNoZXN0cmF0b3IsIFRpZXIgOClcbiAqICAgLSBfc2hvd0ludGFrZUNvbmZpcm1DYXJkLCBfcHJvY2VlZEFmdGVySW50YWtlIChtZXNzYWdlLWRpc3BhdGNoLmpzLCBUaWVyIDMpXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdqb2ItYW5hbHlzaXMnKTtcblxuaW1wb3J0IHsgU3RvcmFnZUtleXMgfSBmcm9tICcuL2FwaS1jbGllbnQuanMnO1xuaW1wb3J0IHsgc3RhdGVNYW5hZ2VyIH0gZnJvbSAnLi9zdGF0ZS1tYW5hZ2VyLmpzJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBQb3N0LWFuYWx5c2lzIHF1ZXN0aW9uIGhlbHBlcnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogTm9ybWFsaXNlIGEgcmF3IHF1ZXN0aW9ucyBhcnJheSB0byBbe3F1ZXN0aW9uLCB0eXBlLCBjaG9pY2VzfV0uICovXG5mdW5jdGlvbiBub3JtYWxpemVQb3N0QW5hbHlzaXNRdWVzdGlvbnMocmF3UXVlc3Rpb25zKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShyYXdRdWVzdGlvbnMpKSByZXR1cm4gW107XG4gIHJldHVybiByYXdRdWVzdGlvbnNcbiAgICAuZmlsdGVyKHEgPT4gcSAmJiB0eXBlb2YgcS5xdWVzdGlvbiA9PT0gJ3N0cmluZycgJiYgcS5xdWVzdGlvbi50cmltKCkpXG4gICAgLm1hcCgocSwgaWR4KSA9PiAoe1xuICAgICAgcXVlc3Rpb246IHEucXVlc3Rpb24udHJpbSgpLFxuICAgICAgdHlwZTogICAgIChxLnR5cGUgfHwgYGNsYXJpZmljYXRpb25fJHtpZHggKyAxfWApLnRvU3RyaW5nKCksXG4gICAgICBjaG9pY2VzOiAgQXJyYXkuaXNBcnJheShxLmNob2ljZXMpID8gcS5jaG9pY2VzIDogW10sXG4gICAgfSkpO1xufVxuXG4vKipcbiAqIEV4dHJhY3QgbnVtYmVyZWQtbGlzdCBxdWVzdGlvbnMgZnJvbSB1bnN0cnVjdHVyZWQgYXNzaXN0YW50IHRleHQuXG4gKiBSZXR1cm5zIGF0IG1vc3QgNCBxdWVzdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RTdHJ1Y3R1cmVkUXVlc3Rpb25zRnJvbUFzc2lzdGFudFRleHQodGV4dCkge1xuICBpZiAodHlwZW9mIHRleHQgIT09ICdzdHJpbmcnIHx8ICF0ZXh0LnRyaW0oKSkgcmV0dXJuIFtdO1xuICBjb25zdCBub3JtYWxpemVkID0gdGV4dC5yZXBsYWNlKC9cXHJcXG4vZywgJ1xcbicpO1xuICBjb25zdCBibG9ja3MgPSBub3JtYWxpemVkLnNwbGl0KC9eXFxzKlxcZCtcXC5cXHMrL20pO1xuICBpZiAoYmxvY2tzLmxlbmd0aCA8PSAxKSByZXR1cm4gW107XG4gIHJldHVybiBibG9ja3NcbiAgICAuc2xpY2UoMSlcbiAgICAubWFwKChibG9jaywgaWR4KSA9PiB7XG4gICAgICBjb25zdCBxdWVzdGlvbiA9IGJsb2NrLnRyaW0oKTtcbiAgICAgIGlmICghcXVlc3Rpb24pIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIHsgcXVlc3Rpb246IHF1ZXN0aW9uLnNsaWNlKDAsIDQwMDApLCB0eXBlOiBgY2xhcmlmaWNhdGlvbl8ke2lkeCArIDF9YCwgY2hvaWNlczogW10gfTtcbiAgICB9KVxuICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAuc2xpY2UoMCwgNCk7XG59XG5cbi8qKlxuICogTWVyZ2Ugc2VydmVyLXByb3ZpZGVkIHF1ZXN0aW9ucyB3aXRoIHRob3NlIGV4dHJhY3RlZCBmcm9tIHRoZSBhc3Npc3RhbnQgdGV4dCxcbiAqIGRlLWR1cGxpY2F0aW5nIGJ5IHF1ZXN0aW9uIHRleHQgYW5kIHR5cGUuXG4gKi9cbmZ1bmN0aW9uIG1lcmdlUG9zdEFuYWx5c2lzUXVlc3Rpb25zKGV4aXN0aW5nUXVlc3Rpb25zLCBpbmNvbWluZ1F1ZXN0aW9ucykge1xuICBjb25zdCBleGlzdGluZyA9IG5vcm1hbGl6ZVBvc3RBbmFseXNpc1F1ZXN0aW9ucyhleGlzdGluZ1F1ZXN0aW9ucyk7XG4gIGNvbnN0IGluY29taW5nID0gbm9ybWFsaXplUG9zdEFuYWx5c2lzUXVlc3Rpb25zKGluY29taW5nUXVlc3Rpb25zKTtcblxuICBjb25zdCBtZXJnZWQgICAgICAgID0gWy4uLmV4aXN0aW5nXTtcbiAgY29uc3Qgc2VlbkJ5UXVlc3Rpb24gPSBuZXcgU2V0KGV4aXN0aW5nLm1hcChxID0+IHEucXVlc3Rpb24udG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXHMrL2csICcgJykudHJpbSgpKSk7XG4gIGNvbnN0IHVzZWRUeXBlcyAgICAgID0gbmV3IFNldChleGlzdGluZy5tYXAocSA9PiBxLnR5cGUpKTtcblxuICBpbmNvbWluZy5mb3JFYWNoKChxLCBpZHgpID0+IHtcbiAgICBjb25zdCBrZXkgPSBxLnF1ZXN0aW9uLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpLnRyaW0oKTtcbiAgICBpZiAoIWtleSB8fCBzZWVuQnlRdWVzdGlvbi5oYXMoa2V5KSkgcmV0dXJuO1xuICAgIGxldCB0eXBlID0gcS50eXBlIHx8IGBjbGFyaWZpY2F0aW9uXyR7bWVyZ2VkLmxlbmd0aCArIGlkeCArIDF9YDtcbiAgICBpZiAodXNlZFR5cGVzLmhhcyh0eXBlKSkgdHlwZSA9IGAke3R5cGV9XyR7bWVyZ2VkLmxlbmd0aCArIGlkeCArIDF9YDtcbiAgICBtZXJnZWQucHVzaCh7IHF1ZXN0aW9uOiBxLnF1ZXN0aW9uLCB0eXBlLCBjaG9pY2VzOiBBcnJheS5pc0FycmF5KHEuY2hvaWNlcykgPyBxLmNob2ljZXMgOiBbXSB9KTtcbiAgICBzZWVuQnlRdWVzdGlvbi5hZGQoa2V5KTtcbiAgICB1c2VkVHlwZXMuYWRkKHR5cGUpO1xuICB9KTtcblxuICByZXR1cm4gbWVyZ2VkO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIGFuYWx5emVKb2Jcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5hc3luYyBmdW5jdGlvbiBhbmFseXplSm9iKCkge1xuICBpZiAoc3RhdGVNYW5hZ2VyLmlzTG9hZGluZygpKSByZXR1cm47XG5cbiAgaWYgKCFsb2NhbFN0b3JhZ2UuZ2V0SXRlbShTdG9yYWdlS2V5cy5MTE1fRElTQ0xPU1VSRV9TSE9XTikpIHtcbiAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnXHUyMTM5XHVGRTBGIENvbnRlbnQgeW91IHN1Ym1pdCBpcyBzZW50IHRvIHRoZSBjb25maWd1cmVkIExMTSBwcm92aWRlciBmb3IgYW5hbHlzaXMuIFJldmlldyB5b3VyIHByb3ZpZGVyXFwncyBkYXRhIHBvbGljeSBmb3IgZGV0YWlscy4nKTtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShTdG9yYWdlS2V5cy5MTE1fRElTQ0xPU1VSRV9TSE9XTiwgJzEnKTtcbiAgfVxuXG4gIGNvbnN0IGxvYWRpbmdNc2cgPSBhcHBlbmRMb2FkaW5nTWVzc2FnZSgnQW5hbHl6aW5nIGpvYiBkZXNjcmlwdGlvbi4uLicpO1xuICBzZXRMb2FkaW5nKHRydWUsICdBbmFseXNpbmcgam9iIGRlc2NyaXB0aW9uXHUyMDI2Jyk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgbGxtRmV0Y2goJy9hcGkvYWN0aW9uJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgYWN0aW9uOiAnYW5hbHl6ZV9qb2InIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBwYXJzZU1lc3NhZ2VSZXNwb25zZShhd2FpdCByZXMuanNvbigpKTtcblxuICAgIHJlbW92ZUxvYWRpbmdNZXNzYWdlKGxvYWRpbmdNc2cpO1xuXG4gICAgaWYgKGRhdGEuZXJyb3IpIHtcbiAgICAgIGFwcGVuZFJldHJ5TWVzc2FnZSgnXHUyNzRDIEVycm9yOiAnICsgZGF0YS5lcnJvciwgYW5hbHl6ZUpvYik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJlc3VsdCAgICAgICA9IGRhdGEucmVzdWx0O1xuICAgICAgY29uc3QgYW5hbHlzaXNUZXh0ID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycgPyByZXN1bHQgOiAocmVzdWx0Py50ZXh0KSB8fCBudWxsO1xuICAgICAgY29uc3QgYW5hbHlzaXNEYXRhID0gdHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcgJiYgcmVzdWx0ICE9PSBudWxsXG4gICAgICAgID8gKHJlc3VsdC5jb250ZXh0X2RhdGE/LmpvYl9hbmFseXNpcyA/PyByZXN1bHQpXG4gICAgICAgIDogcmVzdWx0O1xuICAgICAgY29uc3QgY29udGV4dFF1ZXN0aW9ucyA9ICh0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0JyAmJiByZXN1bHQgIT09IG51bGwpXG4gICAgICAgID8gcmVzdWx0LmNvbnRleHRfZGF0YT8ucG9zdF9hbmFseXNpc19xdWVzdGlvbnNcbiAgICAgICAgOiBudWxsO1xuICAgICAgY29uc3Qgc3RydWN0dXJlZFF1ZXN0aW9ucyA9IG1lcmdlUG9zdEFuYWx5c2lzUXVlc3Rpb25zKFxuICAgICAgICBjb250ZXh0UXVlc3Rpb25zLFxuICAgICAgICAoY29udGV4dFF1ZXN0aW9ucyAmJiBjb250ZXh0UXVlc3Rpb25zLmxlbmd0aCA+IDApXG4gICAgICAgICAgPyBbXVxuICAgICAgICAgIDogZXh0cmFjdFN0cnVjdHVyZWRRdWVzdGlvbnNGcm9tQXNzaXN0YW50VGV4dChhbmFseXNpc1RleHQpLFxuICAgICAgKTtcblxuICAgICAgaWYgKGFuYWx5c2lzVGV4dCkgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgYW5hbHlzaXNUZXh0KTtcbiAgICAgIGFwcGVuZEZvcm1hdHRlZEFuYWx5c2lzKGFuYWx5c2lzRGF0YSk7XG4gICAgICBzdGF0ZU1hbmFnZXIuc2V0VGFiRGF0YSgnYW5hbHlzaXMnLCBhbmFseXNpc0RhdGEpO1xuICAgICAgcmVmcmVzaEF0c1Njb3JlKCdhbmFseXNpcycpO1xuICAgICAgc3dpdGNoVGFiKCdhbmFseXNpcycpO1xuXG4gICAgICBjb25zdCBjb250aW51ZUFmdGVySW50YWtlID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBhc2tQb3N0QW5hbHlzaXNRdWVzdGlvbnMoYW5hbHlzaXNEYXRhLCBzdHJ1Y3R1cmVkUXVlc3Rpb25zKTtcbiAgICAgIH07XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGludGFrZVJlcyAgPSBhd2FpdCBsbG1GZXRjaCgnL2FwaS9pbnRha2UtbWV0YWRhdGEnKTtcbiAgICAgICAgY29uc3QgaW50YWtlRGF0YSA9IGF3YWl0IGludGFrZVJlcy5qc29uKCk7XG4gICAgICAgIGlmIChpbnRha2VEYXRhLmNvbmZpcm1lZCkge1xuICAgICAgICAgIGF3YWl0IF9wcm9jZWVkQWZ0ZXJJbnRha2UoY29udGludWVBZnRlckludGFrZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgX3Nob3dJbnRha2VDb25maXJtQ2FyZChjb250aW51ZUFmdGVySW50YWtlKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoX2UpIHtcbiAgICAgICAgYXdhaXQgY29udGludWVBZnRlckludGFrZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cuZXJyb3IoJz09PSBBTkFMWVpFIEpPQiBFUlJPUiA9PT0nLCBlcnJvcik7XG4gICAgcmVtb3ZlTG9hZGluZ01lc3NhZ2UobG9hZGluZ01zZyk7XG4gICAgaWYgKGVycm9yLm5hbWUgIT09ICdBYm9ydEVycm9yJykge1xuICAgICAgYXBwZW5kUmV0cnlNZXNzYWdlKCdcdTI3NEMgRXJyb3I6ICcgKyBlcnJvci5tZXNzYWdlLCBhbmFseXplSm9iKTtcbiAgICB9XG4gIH1cblxuICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgLy8gVXBkYXRlIHRoZSBwb3NpdGlvbi10aXRsZSBiYXIgd2l0aCB0aGUgbGF0ZXN0IHNlc3Npb24gbmFtZSBhZnRlciBhbmFseXNpcy5cbiAgdHJ5IHtcbiAgICBjb25zdCBsYXRlc3RTdGF0dXMgPSBhd2FpdCBmZXRjaFN0YXR1cygpO1xuICAgIGlmIChsYXRlc3RTdGF0dXMgJiYgdHlwZW9mIHVwZGF0ZVBvc2l0aW9uVGl0bGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHVwZGF0ZVBvc2l0aW9uVGl0bGUobGF0ZXN0U3RhdHVzKTtcbiAgICB9XG4gIH0gY2F0Y2ggKF9lKSB7IC8qIG5vbi1mYXRhbCAqLyB9XG4gIGlmICh0eXBlb2YgZmV0Y2hBbmREaXNwbGF5TGxtTG9nID09PSAnZnVuY3Rpb24nKSBmZXRjaEFuZERpc3BsYXlMbG1Mb2coKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEVTIG1vZHVsZSBleHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuZXhwb3J0IHtcbiAgbm9ybWFsaXplUG9zdEFuYWx5c2lzUXVlc3Rpb25zLFxuICBleHRyYWN0U3RydWN0dXJlZFF1ZXN0aW9uc0Zyb21Bc3Npc3RhbnRUZXh0LFxuICBtZXJnZVBvc3RBbmFseXNpc1F1ZXN0aW9ucyxcbiAgYW5hbHl6ZUpvYixcbn07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9nb2Fscy5qcyBcdTIwMTQgR2VuZXJhdGlvbiBHb2FscyBjb25maWd1cmF0aW9uIHRhYi5cbiAqXG4gKiBBbGxvd3MgdGhlIHVzZXIgdG8gc2V0IGRvY3VtZW50LWxlbmd0aCBhbmQgY2hhcmFjdGVyLWNvdW50IGNvbnN0cmFpbnRzIHRoYXRcbiAqIGFyZSBpbmplY3RlZCBpbnRvIGV2ZXJ5IExMTSBwcm9tcHQgYW5kIHVzZWQgdG8gY29udHJvbCB0aGUgZmluYWwgUERGIGxlbmd0aC5cbiAqXG4gKiBGaWVsZHM6XG4gKiAgIHBkZl9wYWdlc19lbmFibGVkICAgIFx1MjAxNCB3aGV0aGVyIHRoZSBQREYgcGFnZSBnb2FsIGlzIGFjdGl2ZVxuICogICBtYXhfcGRmX3BhZ2VzX21vZGUgICBcdTIwMTQgJ2NvbWJpbmVkJyB8ICdzcGxpdCdcbiAqICAgbWF4X3BkZl9wYWdlcyAgICAgICAgXHUyMDE0IGNvbWJpbmVkIHRvdGFsIFBERiBwYWdlIGdvYWwgKG1vZGU9Y29tYmluZWQpXG4gKiAgIG1heF9wZGZfcmVzdW1lX3BhZ2VzIFx1MjAxNCByZXN1bWUtcG9ydGlvbiBwYWdlIGdvYWwgKG1vZGU9c3BsaXQpXG4gKiAgIG1heF9wZGZfY3ZfcGFnZXMgICAgIFx1MjAxNCBDVi9wdWJsaWNhdGlvbnMgcG9ydGlvbiBwYWdlIGdvYWwgKG1vZGU9c3BsaXQpXG4gKiAgIGF0c19wYWdlc19lbmFibGVkICAgIFx1MjAxNCB3aGV0aGVyIHRoZSBBVFMgcGFnZSBnb2FsIGlzIGFjdGl2ZVxuICogICBtYXhfYXRzX3BhZ2VzICAgICAgICBcdTIwMTQgdGFyZ2V0IHBhZ2UgY291bnQgZm9yIEFUUyBwbGFpbi10ZXh0IG91dHB1dFxuICogICBhdHNfY2hhcnNfZW5hYmxlZCAgICBcdTIwMTQgd2hldGhlciB0aGUgQVRTIGNoYXJhY3RlciBsaW1pdCBpcyBhY3RpdmUgKGRlZmF1bHQgZmFsc2UpXG4gKiAgIG1heF9hdHNfY2hhcnMgICAgICAgIFx1MjAxNCBtYXhpbXVtIGNoYXJhY3RlcnMgKGluY2x1ZGluZyBzcGFjZXMpIGZvciBBVFMgdGV4dFxuICpcbiAqIEVhY2ggZ29hbCBoYXMgYSBjaGVja2JveCB0byBlbmFibGUgb3IgZGlzYWJsZSBpdDsgZGlzYWJsZWQgZ29hbHMgYXJlIG5vdFxuICogc2VudCB0byB0aGUgYmFja2VuZCBhbmQgYXJlIG5vdCBpbmplY3RlZCBpbnRvIHByb21wdHMuXG4gKlxuICogREVQRU5ERU5DSUVTIChhdmFpbGFibGUgb24gZ2xvYmFsVGhpcyB2aWEgbWFpbi5qcyk6XG4gKiAgIGFwaUNhbGwgKGFwaS1jbGllbnQuanMpXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuXG5jb25zdCBsb2cgPSBnZXRMb2dnZXIoJ2dvYWxzJyk7XG5cbmNvbnN0IEdPQUxTX0RFRkFVTFRTID0ge1xuICBwZGZfcGFnZXNfZW5hYmxlZDogICAgdHJ1ZSxcbiAgbWF4X3BkZl9wYWdlc19tb2RlOiAgICdjb21iaW5lZCcsXG4gIG1heF9wZGZfcGFnZXM6ICAgICAgICAyLFxuICBtYXhfcGRmX3Jlc3VtZV9wYWdlczogMixcbiAgbWF4X3BkZl9jdl9wYWdlczogICAgIDEsXG4gIGF0c19wYWdlc19lbmFibGVkOiAgICB0cnVlLFxuICBtYXhfYXRzX3BhZ2VzOiAgICAgICAgMSxcbiAgYXRzX2NoYXJzX2VuYWJsZWQ6ICAgIGZhbHNlLFxuICBtYXhfYXRzX2NoYXJzOiAgICAgICAgNTAwMCxcbn07XG5cbi8qKiBTaGFyZWQgaW5saW5lIHN0eWxlcyAqL1xuY29uc3QgUyA9IHtcbiAgc2VjdGlvbjogICAgJ21hcmdpbi1ib3R0b206MjBweDtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJvcmRlciwjZTBlMGUwKTtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjE2cHgnLFxuICBoZWFkZXI6ICAgICAnZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTBweDttYXJnaW4tYm90dG9tOjEycHgnLFxuICBjaGVja2JveDogICAnd2lkdGg6MTZweDtoZWlnaHQ6MTZweDtjdXJzb3I6cG9pbnRlcjtmbGV4LXNocmluazowJyxcbiAgbGFiZWw6ICAgICAgJ2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MXJlbTtjdXJzb3I6cG9pbnRlcjttYXJnaW46MCcsXG4gIGhpbnQ6ICAgICAgICdmb250LXNpemU6MC44NzVyZW07Y29sb3I6dmFyKC0tdGV4dC1zZWNvbmRhcnksIzU1NSk7bWFyZ2luOjAgMCA4cHgnLFxuICBudW1JbnB1dDogICAncGFkZGluZzo2cHggMTBweDtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJvcmRlciwjY2NjKTtib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6MXJlbScsXG4gIHJvdzogICAgICAgICdkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDo4cHgnLFxuICBtdXRlZDogICAgICAnY29sb3I6dmFyKC0tdGV4dC1zZWNvbmRhcnksIzU1NSknLFxuICByYWRpb0xhYmVsOiAnZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmZsZXgtc3RhcnQ7Z2FwOjhweDtjdXJzb3I6cG9pbnRlcicsXG4gIHJhZGlvSW5wdXQ6ICdtYXJnaW4tdG9wOjNweCcsXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcG9wdWxhdGVHb2Fsc1RhYigpIHtcbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIGlmICghY29udGVudCkgcmV0dXJuO1xuXG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgY2xhc3M9XCJnb2Fscy1wYW5lbFwiIHN0eWxlPVwibWF4LXdpZHRoOjY0MHB4O21hcmdpbjowIGF1dG87cGFkZGluZzoyOHB4IDI0cHhcIj5cbiAgICAgIDxoMiBzdHlsZT1cIm1hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjhweFwiPlx1RDgzQ1x1REZBRiBHZW5lcmF0aW9uIEdvYWxzPC9oMj5cbiAgICAgIDxwIHN0eWxlPVwiJHtTLm11dGVkfTttYXJnaW4tYm90dG9tOjI0cHg7bGluZS1oZWlnaHQ6MS41XCI+XG4gICAgICAgIFNldCBvcHRpb25hbCBsZW5ndGggY29uc3RyYWludHMgZm9yIHRoZSBnZW5lcmF0ZWQgQ1YuXG4gICAgICAgIENoZWNrIGVhY2ggZ29hbCB5b3Ugd2FudCB0byBlbmZvcmNlOyB1bmNoZWNrZWQgZ29hbHMgYXJlIGlnbm9yZWQuXG4gICAgICAgIFRoZXNlIGd1aWRlIHRoZSBBSSBhdCBldmVyeSBlZGl0aW5nIHN0YWdlIGFuZCBjb250cm9sIHRoZSBmaW5hbCBkb2N1bWVudCBsZW5ndGguXG4gICAgICA8L3A+XG5cbiAgICAgIDwhLS0gXHUyNTAwXHUyNTAwIFBERiBQYWdlIExlbmd0aCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDAgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiZ29hbHMtc2VjdGlvblwiIHN0eWxlPVwiJHtTLnNlY3Rpb259XCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCIke1MuaGVhZGVyfVwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImdvYWxzLXBkZi1lbmFibGVkXCJcbiAgICAgICAgICAgICAgICAgb25jaGFuZ2U9XCJnb2Fsc1RvZ2dsZVNlY3Rpb24oJ3BkZicpXCJcbiAgICAgICAgICAgICAgICAgY2hlY2tlZCBzdHlsZT1cIiR7Uy5jaGVja2JveH1cIj5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwiZ29hbHMtcGRmLWVuYWJsZWRcIiBzdHlsZT1cIiR7Uy5sYWJlbH1cIj5QREYgUGFnZSBMZW5ndGg8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cImdvYWxzLXBkZi1ib2R5XCI+XG4gICAgICAgICAgPHAgc3R5bGU9XCIke1MuaGludH1cIj5cbiAgICAgICAgICAgIFRhcmdldCBwYWdlIGNvdW50IGZvciB0aGUgaHVtYW4tcmVhZGFibGUgUERGIChlLmcuIDFcdTIwMTMzKS5cbiAgICAgICAgICA8L3A+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Z2FwOjEycHhcIj5cblxuICAgICAgICAgICAgPCEtLSBcdTI1MDBcdTI1MDAgU2luZ2xlIHRvdGFsIG9wdGlvbiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDAgLS0+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgc3R5bGU9XCIke1MucmFkaW9MYWJlbH1cIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cImdvYWxzLXBkZi1tb2RlXCIgdmFsdWU9XCJjb21iaW5lZFwiXG4gICAgICAgICAgICAgICAgICAgICAgIGlkPVwiZ29hbHMtcGRmLW1vZGUtY29tYmluZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICBvbmNoYW5nZT1cImdvYWxzVXBkYXRlUGRmTW9kZSgpXCIgY2hlY2tlZFxuICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIiR7Uy5yYWRpb0lucHV0fVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICAgICAgPHN0cm9uZz5TaW5nbGUgdG90YWw8L3N0cm9uZz5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXNpemU6MC44NzVyZW07JHtTLm11dGVkfTttYXJnaW4tdG9wOjJweFwiPlxuICAgICAgICAgICAgICAgICAgICBPbmUgcGFnZSBnb2FsIGNvdmVyaW5nIHRoZSBlbnRpcmUgZG9jdW1lbnQsIGluY2x1ZGluZ1xuICAgICAgICAgICAgICAgICAgICBwdWJsaWNhdGlvbnMgYW5kIGNpdGF0aW9ucy5cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxkaXYgaWQ9XCJnb2Fscy1wZGYtY29tYmluZWRcIlxuICAgICAgICAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZy1sZWZ0OjI0cHg7bWFyZ2luLXRvcDo4cHg7JHtTLnJvd31cIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiZ29hbHMtbWF4LXBkZi1wYWdlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgIG1pbj1cIjFcIiBtYXg9XCIxMFwiIHN0ZXA9XCIxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCIke0dPQUxTX0RFRkFVTFRTLm1heF9wZGZfcGFnZXN9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDo5MHB4OyR7Uy5udW1JbnB1dH1cIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cIiR7Uy5tdXRlZH1cIj5wYWdlcyB0b3RhbDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBcdTI1MDBcdTI1MDAgU3BsaXQgcG9ydGlvbnMgb3B0aW9uIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMCAtLT5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBzdHlsZT1cIiR7Uy5yYWRpb0xhYmVsfVwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwiZ29hbHMtcGRmLW1vZGVcIiB2YWx1ZT1cInNwbGl0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJnb2Fscy1wZGYtbW9kZS1zcGxpdFwiXG4gICAgICAgICAgICAgICAgICAgICAgIG9uY2hhbmdlPVwiZ29hbHNVcGRhdGVQZGZNb2RlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIiR7Uy5yYWRpb0lucHV0fVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICAgICAgPHN0cm9uZz5TcGxpdCBwb3J0aW9uczwvc3Ryb25nPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtc2l6ZTowLjg3NXJlbTske1MubXV0ZWR9O21hcmdpbi10b3A6MnB4XCI+XG4gICAgICAgICAgICAgICAgICAgIFNlcGFyYXRlIHBhZ2UgZ29hbHMgZm9yIHRoZSByZXN1bWUgcG9ydGlvbiAoZXhwZXJpZW5jZSwgc2tpbGxzKVxuICAgICAgICAgICAgICAgICAgICBhbmQgdGhlIENWL3B1YmxpY2F0aW9ucyBwb3J0aW9uIChjaXRhdGlvbnMsIHB1YmxpY2F0aW9ucykuXG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICA8ZGl2IGlkPVwiZ29hbHMtcGRmLXNwbGl0XCJcbiAgICAgICAgICAgICAgICAgICBzdHlsZT1cInBhZGRpbmctbGVmdDoyNHB4O21hcmdpbi10b3A6OHB4O2Rpc3BsYXk6bm9uZTtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Z2FwOjhweFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCIke1Mucm93fVwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIHN0eWxlPVwibWluLXdpZHRoOjE4NXB4O2ZvbnQtc2l6ZTowLjlyZW1cIj5SZXN1bWUgcG9ydGlvbjo8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cImdvYWxzLW1heC1wZGYtcmVzdW1lLXBhZ2VzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICBtaW49XCIxXCIgbWF4PVwiMTBcIiBzdGVwPVwiMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCIke0dPQUxTX0RFRkFVTFRTLm1heF9wZGZfcmVzdW1lX3BhZ2VzfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDo5MHB4OyR7Uy5udW1JbnB1dH1cIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiJHtTLm11dGVkfVwiPnBhZ2VzPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCIke1Mucm93fVwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIHN0eWxlPVwibWluLXdpZHRoOjE4NXB4O2ZvbnQtc2l6ZTowLjlyZW1cIj5DViAvIFB1YmxpY2F0aW9ucyBwb3J0aW9uOjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiZ29hbHMtbWF4LXBkZi1jdi1wYWdlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgbWluPVwiMVwiIG1heD1cIjEwXCIgc3RlcD1cIjFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPVwiJHtHT0FMU19ERUZBVUxUUy5tYXhfcGRmX2N2X3BhZ2VzfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDo5MHB4OyR7Uy5udW1JbnB1dH1cIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiJHtTLm11dGVkfVwiPnBhZ2VzPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPC9kaXY+PCEtLSBlbmQgbW9kZSBvcHRpb25zIGNvbHVtbiAtLT5cbiAgICAgICAgPC9kaXY+PCEtLSBlbmQgZ29hbHMtcGRmLWJvZHkgLS0+XG4gICAgICA8L2Rpdj48IS0tIGVuZCBQREYgc2VjdGlvbiAtLT5cblxuICAgICAgPCEtLSBcdTI1MDBcdTI1MDAgQVRTIFBsYWluLVRleHQgUGFnZSBMZW5ndGggXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImdvYWxzLXNlY3Rpb25cIiBzdHlsZT1cIiR7Uy5zZWN0aW9ufVwiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiJHtTLmhlYWRlcn1cIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJnb2Fscy1hdHMtcGFnZXMtZW5hYmxlZFwiXG4gICAgICAgICAgICAgICAgIG9uY2hhbmdlPVwiZ29hbHNUb2dnbGVTZWN0aW9uKCdhdHMtcGFnZXMnKVwiXG4gICAgICAgICAgICAgICAgIGNoZWNrZWQgc3R5bGU9XCIke1MuY2hlY2tib3h9XCI+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cImdvYWxzLWF0cy1wYWdlcy1lbmFibGVkXCIgc3R5bGU9XCIke1MubGFiZWx9XCI+QVRTIFBsYWluLVRleHQgUGFnZSBMZW5ndGg8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cImdvYWxzLWF0cy1wYWdlcy1ib2R5XCI+XG4gICAgICAgICAgPHAgc3R5bGU9XCIke1MuaGludH1cIj5cbiAgICAgICAgICAgIFRhcmdldCBudW1iZXIgb2YgcGFnZXMgZm9yIHRoZSBBVFMtb3B0aW1pc2VkIHBsYWluLXRleHQgb3V0cHV0ICh0eXBpY2FsbHkgMVx1MjAxMzIpLlxuICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiJHtTLnJvd31cIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJnb2Fscy1tYXgtYXRzLXBhZ2VzXCJcbiAgICAgICAgICAgICAgICAgICBtaW49XCIxXCIgbWF4PVwiNVwiIHN0ZXA9XCIxXCJcbiAgICAgICAgICAgICAgICAgICB2YWx1ZT1cIiR7R09BTFNfREVGQVVMVFMubWF4X2F0c19wYWdlc31cIlxuICAgICAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6OTBweDske1MubnVtSW5wdXR9XCI+XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cIiR7Uy5tdXRlZH1cIj5wYWdlczwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBcdTI1MDBcdTI1MDAgQVRTIENoYXJhY3RlciBDb3VudCAoZGlzYWJsZWQgYnkgZGVmYXVsdCkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImdvYWxzLXNlY3Rpb25cIiBzdHlsZT1cIiR7Uy5zZWN0aW9ufTttYXJnaW4tYm90dG9tOjI4cHhcIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cIiR7Uy5oZWFkZXJ9XCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiZ29hbHMtYXRzLWNoYXJzLWVuYWJsZWRcIlxuICAgICAgICAgICAgICAgICBvbmNoYW5nZT1cImdvYWxzVG9nZ2xlU2VjdGlvbignYXRzLWNoYXJzJylcIlxuICAgICAgICAgICAgICAgICBzdHlsZT1cIiR7Uy5jaGVja2JveH1cIj5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwiZ29hbHMtYXRzLWNoYXJzLWVuYWJsZWRcIiBzdHlsZT1cIiR7Uy5sYWJlbH1cIj5BVFMgQ2hhcmFjdGVyIENvdW50IExpbWl0PC9sYWJlbD5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjhyZW07JHtTLm11dGVkfTtmb250LXN0eWxlOml0YWxpY1wiPihvcHRpb25hbCBcdTIwMTQgdW5jb21tb24pPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cImdvYWxzLWF0cy1jaGFycy1ib2R5XCIgc3R5bGU9XCJvcGFjaXR5OjAuNDtwb2ludGVyLWV2ZW50czpub25lXCI+XG4gICAgICAgICAgPHAgc3R5bGU9XCIke1MuaGludH1cIj5cbiAgICAgICAgICAgIE1heGltdW0gY2hhcmFjdGVycyAoaW5jbHVkaW5nIHNwYWNlcykgaW4gdGhlIEFUUyBwbGFpbi10ZXh0IG91dHB1dC5cbiAgICAgICAgICA8L3A+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cIiR7Uy5yb3d9XCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiZ29hbHMtbWF4LWF0cy1jaGFyc1wiXG4gICAgICAgICAgICAgICAgICAgbWluPVwiNTAwXCIgbWF4PVwiMjAwMDBcIiBzdGVwPVwiMTAwXCJcbiAgICAgICAgICAgICAgICAgICB2YWx1ZT1cIiR7R09BTFNfREVGQVVMVFMubWF4X2F0c19jaGFyc31cIlxuICAgICAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6MTEwcHg7JHtTLm51bUlucHV0fVwiPlxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCIke1MubXV0ZWR9XCI+Y2hhcmFjdGVyczwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBcdTI1MDBcdTI1MDAgR2VuZXJhdGlvbiBTZXR0aW5ncyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDAgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiZ29hbHMtc2VjdGlvblwiIHN0eWxlPVwiJHtTLnNlY3Rpb259O21hcmdpbi1ib3R0b206MjhweFwiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiJHtTLmhlYWRlcn1cIj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZToxLjFyZW1cIj5cdTI2OTlcdUZFMEY8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCIke1MubGFiZWx9XCI+R2VuZXJhdGlvbiBTZXR0aW5nczwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxwIHN0eWxlPVwiJHtTLmhpbnR9XCI+XG4gICAgICAgICAgQ29udHJvbHMgdGhlIHNoYXBlIG9mIHRoZSBnZW5lcmF0ZWQgQ1YgXHUyMDE0IGFwcGxpZWQgZHVyaW5nIGN1c3RvbWl6YXRpb24gYW5kIHJld3JpdGUgc3RlcHMuXG4gICAgICAgIDwvcD5cblxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtnYXA6MTRweFwiPlxuICAgICAgICAgIDwhLS0gTWF4IHNraWxscyAtLT5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTJweDtmbGV4LXdyYXA6d3JhcFwiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cImdvYWxzLW1heC1za2lsbHMtaW5wdXRcIiBzdHlsZT1cImZvbnQtc2l6ZTowLjlyZW07Y29sb3I6IzRiNTU2Mzt3aGl0ZS1zcGFjZTpub3dyYXA7bWluLXdpZHRoOjE2MHB4XCI+XG4gICAgICAgICAgICAgIE1heCBza2lsbHMgaW4gQ1Y6XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYW5nZVwiIGlkPVwiZ29hbHMtbWF4LXNraWxscy1pbnB1dFwiIG1pbj1cIjFcIiBtYXg9XCI2MFwiIHN0ZXA9XCIxXCIgdmFsdWU9XCIyMFwiXG4gICAgICAgICAgICAgICAgICAgb25pbnB1dD1cImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb2Fscy1tYXgtc2tpbGxzLXZhbHVlJykudGV4dENvbnRlbnQ9dGhpcy52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgb25jaGFuZ2U9XCJnb2Fsc0F1dG9TYXZlU2V0dGluZ3MoKVwiXG4gICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmbGV4OjE7bWluLXdpZHRoOjEyMHB4O2FjY2VudC1jb2xvcjojM2I4MmY2XCI+XG4gICAgICAgICAgICA8c3BhbiBpZD1cImdvYWxzLW1heC1za2lsbHMtdmFsdWVcIiBzdHlsZT1cImZvbnQtd2VpZ2h0OjYwMDtjb2xvcjojMWUyOTNiO21pbi13aWR0aDoyZW07dGV4dC1hbGlnbjpyaWdodFwiPjIwPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC44MmVtOyR7Uy5tdXRlZH1cIj4oZGVmYXVsdDogMjApPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBTa2lsbHMgc2VjdGlvbiB0aXRsZSAtLT5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTJweDtmbGV4LXdyYXA6d3JhcFwiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cImdvYWxzLXNraWxscy10aXRsZS1zZWxlY3RcIiBzdHlsZT1cImZvbnQtc2l6ZTowLjlyZW07Y29sb3I6IzRiNTU2Mzt3aGl0ZS1zcGFjZTpub3dyYXA7bWluLXdpZHRoOjE2MHB4XCI+XG4gICAgICAgICAgICAgIFNraWxscyBzZWN0aW9uIHRpdGxlOlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJnb2Fscy1za2lsbHMtdGl0bGUtc2VsZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgb25jaGFuZ2U9XCJnb2Fsc09uU2tpbGxzVGl0bGVTZWxlY3QoKVwiXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZm9udC1zaXplOjAuOWVtO2JvcmRlcjoxcHggc29saWQgI2QxZDVkYjtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjRweCA4cHg7Y29sb3I6IzFlMjkzYlwiPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiU2tpbGxzXCI+U2tpbGxzPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJUZWNobmljYWwgU2tpbGxzXCI+VGVjaG5pY2FsIFNraWxsczwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiS2V5IFNraWxsc1wiPktleSBTa2lsbHM8L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIkNvcmUgU2tpbGxzXCI+Q29yZSBTa2lsbHM8L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIl9fY3VzdG9tX19cIj5DdXN0b21cdTIwMjY8L29wdGlvbj5cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJnb2Fscy1za2lsbHMtdGl0bGUtY3VzdG9tXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBjdXN0b20gdGl0bGVcIlxuICAgICAgICAgICAgICAgICAgIG9uY2hhbmdlPVwiZ29hbHNBdXRvU2F2ZVNldHRpbmdzKClcIlxuICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZGlzcGxheTpub25lO2ZvbnQtc2l6ZTowLjllbTtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo0cHg7cGFkZGluZzo0cHggOHB4O2NvbG9yOiMxZTI5M2I7bWluLXdpZHRoOjE2MHB4XCI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8c3BhbiBpZD1cImdvYWxzLXNldHRpbmdzLXN0YXR1c1wiIHN0eWxlPVwiZGlzcGxheTpibG9jazttYXJnaW4tdG9wOjhweDtmb250LXNpemU6MC44MnJlbTt0cmFuc2l0aW9uOmNvbG9yIDAuMnNcIj48L3NwYW4+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBzdHlsZT1cIiR7Uy5yb3d9O2dhcDoxNHB4XCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJzYXZlLWdvYWxzLWJ0blwiXG4gICAgICAgICAgICAgICAgb25jbGljaz1cInNhdmVHZW5lcmF0aW9uR29hbHMoKVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4tcHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgc3R5bGU9XCJwYWRkaW5nOjhweCAyMnB4O2ZvbnQtc2l6ZTowLjk1cmVtXCI+XG4gICAgICAgICAgU2F2ZSBHb2Fsc1xuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPHNwYW4gaWQ9XCJnb2Fscy1zdGF0dXNcIlxuICAgICAgICAgICAgICBzdHlsZT1cImZvbnQtc2l6ZTowLjg3NXJlbTt0cmFuc2l0aW9uOmNvbG9yIDAuMnNcIj48L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYDtcblxuICAvLyBSZXN0b3JlIHNhdmVkIGdvYWxzIGZyb20gdGhlIGJhY2tlbmQgc2Vzc2lvbiBzdGF0ZS5cbiAgYXdhaXQgX2xvYWRHb2Fsc0Zyb21TdGF0dXMoKTtcbn1cblxuLyoqXG4gKiBUb2dnbGUgdGhlIGVuYWJsZWQvZGlzYWJsZWQgYXBwZWFyYW5jZSBvZiBhIGdvYWwgc2VjdGlvbi5cbiAqIEV4cG9ydGVkIHNvIHRoZSBpbmxpbmUgb25jaGFuZ2U9XCJnb2Fsc1RvZ2dsZVNlY3Rpb24oLi4uKVwiIGhhbmRsZXJzIHdvcmsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnb2Fsc1RvZ2dsZVNlY3Rpb24oc2VjdGlvbikge1xuICBjb25zdCBNQVAgPSB7XG4gICAgJ3BkZic6ICAgICAgIHsgY2I6ICdnb2Fscy1wZGYtZW5hYmxlZCcsICAgICAgIGJvZHk6ICdnb2Fscy1wZGYtYm9keScgICAgICAgfSxcbiAgICAnYXRzLXBhZ2VzJzogeyBjYjogJ2dvYWxzLWF0cy1wYWdlcy1lbmFibGVkJywgYm9keTogJ2dvYWxzLWF0cy1wYWdlcy1ib2R5JyB9LFxuICAgICdhdHMtY2hhcnMnOiB7IGNiOiAnZ29hbHMtYXRzLWNoYXJzLWVuYWJsZWQnLCBib2R5OiAnZ29hbHMtYXRzLWNoYXJzLWJvZHknIH0sXG4gIH07XG4gIGNvbnN0IHNlbCA9IE1BUFtzZWN0aW9uXTtcbiAgaWYgKCFzZWwpIHJldHVybjtcbiAgY29uc3QgY2IgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHNlbC5jYik7XG4gIGNvbnN0IGJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzZWwuYm9keSk7XG4gIGlmICghY2IgfHwgIWJvZHkpIHJldHVybjtcbiAgYm9keS5zdHlsZS5vcGFjaXR5ICAgICAgID0gY2IuY2hlY2tlZCA/ICcxJyAgICA6ICcwLjQnO1xuICBib2R5LnN0eWxlLnBvaW50ZXJFdmVudHMgPSBjYi5jaGVja2VkID8gJ2F1dG8nIDogJ25vbmUnO1xufVxuXG4vKipcbiAqIFNob3cvaGlkZSBjb21iaW5lZCB2cyBzcGxpdCBQREYgcGFnZSBpbnB1dHMgd2hlbiB0aGUgbW9kZSByYWRpbyBjaGFuZ2VzLlxuICogRXhwb3J0ZWQgc28gdGhlIGlubGluZSBvbmNoYW5nZT1cImdvYWxzVXBkYXRlUGRmTW9kZSgpXCIgaGFuZGxlciB3b3Jrcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdvYWxzVXBkYXRlUGRmTW9kZSgpIHtcbiAgY29uc3QgY29tYmluZWRSYWRpbyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb2Fscy1wZGYtbW9kZS1jb21iaW5lZCcpO1xuICBjb25zdCBpc0NvbWJpbmVkICAgID0gY29tYmluZWRSYWRpbz8uY2hlY2tlZCA/PyB0cnVlO1xuICBjb25zdCBjb21iaW5lZERpdiAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLXBkZi1jb21iaW5lZCcpO1xuICBjb25zdCBzcGxpdERpdiAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLXBkZi1zcGxpdCcpO1xuICBpZiAoY29tYmluZWREaXYpIGNvbWJpbmVkRGl2LnN0eWxlLmRpc3BsYXkgPSBpc0NvbWJpbmVkID8gJ2ZsZXgnICAgOiAnbm9uZSc7XG4gIGlmIChzcGxpdERpdikgICAgc3BsaXREaXYuc3R5bGUuZGlzcGxheSAgICA9IGlzQ29tYmluZWQgPyAnbm9uZScgICA6ICdmbGV4Jztcbn1cblxuLyoqXG4gKiBGZXRjaCBjdXJyZW50IGdlbmVyYXRpb24gZ29hbHMgZnJvbSB0aGUgc2Vzc2lvbiBhbmQgcG9wdWxhdGUgdGhlIGZvcm0gaW5wdXRzLlxuICogQHByaXZhdGVcbiAqL1xuYXN5bmMgZnVuY3Rpb24gX2xvYWRHb2Fsc0Zyb21TdGF0dXMoKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgZGF0YSAgPSBhd2FpdCBhcGlDYWxsKCdHRVQnLCAnL2FwaS9zdGF0dXMnKTtcbiAgICBjb25zdCBnb2FscyA9IGRhdGE/LmdlbmVyYXRpb25fZ29hbHM7XG4gICAgaWYgKCFnb2FscykgcmV0dXJuO1xuXG4gICAgLy8gXHUyNTAwXHUyNTAwIEVuYWJsZWQgY2hlY2tib3hlcyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICBjb25zdCBwZGZFbmFibGVkQ2IgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb2Fscy1wZGYtZW5hYmxlZCcpO1xuICAgIGNvbnN0IGF0c1BhZ2VFbmFibGVkQ2IgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLWF0cy1wYWdlcy1lbmFibGVkJyk7XG4gICAgY29uc3QgYXRzQ2hhcnNFbmFibGVkQ2IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtYXRzLWNoYXJzLWVuYWJsZWQnKTtcblxuICAgIGlmIChwZGZFbmFibGVkQ2IgICAgICAmJiBnb2Fscy5wZGZfcGFnZXNfZW5hYmxlZCAgIT0gbnVsbCkgcGRmRW5hYmxlZENiLmNoZWNrZWQgICAgICA9IGdvYWxzLnBkZl9wYWdlc19lbmFibGVkO1xuICAgIGlmIChhdHNQYWdlRW5hYmxlZENiICAmJiBnb2Fscy5hdHNfcGFnZXNfZW5hYmxlZCAgIT0gbnVsbCkgYXRzUGFnZUVuYWJsZWRDYi5jaGVja2VkICA9IGdvYWxzLmF0c19wYWdlc19lbmFibGVkO1xuICAgIGlmIChhdHNDaGFyc0VuYWJsZWRDYiAmJiBnb2Fscy5hdHNfY2hhcnNfZW5hYmxlZCAgIT0gbnVsbCkgYXRzQ2hhcnNFbmFibGVkQ2IuY2hlY2tlZCA9IGdvYWxzLmF0c19jaGFyc19lbmFibGVkO1xuXG4gICAgZ29hbHNUb2dnbGVTZWN0aW9uKCdwZGYnKTtcbiAgICBnb2Fsc1RvZ2dsZVNlY3Rpb24oJ2F0cy1wYWdlcycpO1xuICAgIGdvYWxzVG9nZ2xlU2VjdGlvbignYXRzLWNoYXJzJyk7XG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgUERGIG1vZGUgcmFkaW8gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgaWYgKGdvYWxzLm1heF9wZGZfcGFnZXNfbW9kZSkge1xuICAgICAgY29uc3QgcmFkaW8gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICBgaW5wdXRbbmFtZT1cImdvYWxzLXBkZi1tb2RlXCJdW3ZhbHVlPVwiJHtnb2Fscy5tYXhfcGRmX3BhZ2VzX21vZGV9XCJdYCk7XG4gICAgICBpZiAocmFkaW8pIHJhZGlvLmNoZWNrZWQgPSB0cnVlO1xuICAgICAgZ29hbHNVcGRhdGVQZGZNb2RlKCk7XG4gICAgfVxuXG4gICAgLy8gXHUyNTAwXHUyNTAwIE51bWVyaWMgdmFsdWVzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIGNvbnN0IHBkZklucHV0ICAgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb2Fscy1tYXgtcGRmLXBhZ2VzJyk7XG4gICAgY29uc3QgcGRmUmVzdW1lSW5wdXQgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLW1heC1wZGYtcmVzdW1lLXBhZ2VzJyk7XG4gICAgY29uc3QgcGRmQ3ZJbnB1dCAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLW1heC1wZGYtY3YtcGFnZXMnKTtcbiAgICBjb25zdCBhdHNQYWdlSW5wdXQgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtbWF4LWF0cy1wYWdlcycpO1xuICAgIGNvbnN0IGF0c0NoYXJJbnB1dCAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb2Fscy1tYXgtYXRzLWNoYXJzJyk7XG5cbiAgICBpZiAocGRmSW5wdXQgICAgICAgJiYgZ29hbHMubWF4X3BkZl9wYWdlcyAgICAgICAgICE9IG51bGwpIHBkZklucHV0LnZhbHVlICAgICAgID0gZ29hbHMubWF4X3BkZl9wYWdlcztcbiAgICBpZiAocGRmUmVzdW1lSW5wdXQgJiYgZ29hbHMubWF4X3BkZl9yZXN1bWVfcGFnZXMgICE9IG51bGwpIHBkZlJlc3VtZUlucHV0LnZhbHVlID0gZ29hbHMubWF4X3BkZl9yZXN1bWVfcGFnZXM7XG4gICAgaWYgKHBkZkN2SW5wdXQgICAgICYmIGdvYWxzLm1heF9wZGZfY3ZfcGFnZXMgICAgICAhPSBudWxsKSBwZGZDdklucHV0LnZhbHVlICAgICA9IGdvYWxzLm1heF9wZGZfY3ZfcGFnZXM7XG4gICAgaWYgKGF0c1BhZ2VJbnB1dCAgICYmIGdvYWxzLm1heF9hdHNfcGFnZXMgICAgICAgICAhPSBudWxsKSBhdHNQYWdlSW5wdXQudmFsdWUgICA9IGdvYWxzLm1heF9hdHNfcGFnZXM7XG4gICAgaWYgKGF0c0NoYXJJbnB1dCAgICYmIGdvYWxzLm1heF9hdHNfY2hhcnMgICAgICAgICAhPSBudWxsKSBhdHNDaGFySW5wdXQudmFsdWUgICA9IGdvYWxzLm1heF9hdHNfY2hhcnM7XG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgR2VuZXJhdGlvbiBTZXR0aW5ncyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICBjb25zdCBtYXhTa2lsbHNTbGlkZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtbWF4LXNraWxscy1pbnB1dCcpO1xuICAgIGNvbnN0IG1heFNraWxsc0xhYmVsICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb2Fscy1tYXgtc2tpbGxzLXZhbHVlJyk7XG4gICAgaWYgKG1heFNraWxsc1NsaWRlciAmJiBkYXRhLm1heF9za2lsbHMgIT0gbnVsbCkge1xuICAgICAgbWF4U2tpbGxzU2xpZGVyLnZhbHVlID0gZGF0YS5tYXhfc2tpbGxzO1xuICAgICAgaWYgKG1heFNraWxsc0xhYmVsKSBtYXhTa2lsbHNMYWJlbC50ZXh0Q29udGVudCA9IGRhdGEubWF4X3NraWxscztcbiAgICB9XG4gICAgY29uc3Qga25vd25UaXRsZXMgPSBbJ1NraWxscycsICdUZWNobmljYWwgU2tpbGxzJywgJ0tleSBTa2lsbHMnLCAnQ29yZSBTa2lsbHMnXTtcbiAgICBjb25zdCBjdXJyZW50VGl0bGUgPSBkYXRhLnNraWxsc19zZWN0aW9uX3RpdGxlIHx8ICdTa2lsbHMnO1xuICAgIGNvbnN0IHRpdGxlU2VsZWN0ICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb2Fscy1za2lsbHMtdGl0bGUtc2VsZWN0Jyk7XG4gICAgY29uc3QgdGl0bGVDdXN0b20gID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLXNraWxscy10aXRsZS1jdXN0b20nKTtcbiAgICBpZiAodGl0bGVTZWxlY3QpIHtcbiAgICAgIGNvbnN0IGlzS25vd24gPSBrbm93blRpdGxlcy5pbmNsdWRlcyhjdXJyZW50VGl0bGUpO1xuICAgICAgdGl0bGVTZWxlY3QudmFsdWUgPSBpc0tub3duID8gY3VycmVudFRpdGxlIDogJ19fY3VzdG9tX18nO1xuICAgICAgaWYgKHRpdGxlQ3VzdG9tKSB7XG4gICAgICAgIHRpdGxlQ3VzdG9tLnN0eWxlLmRpc3BsYXkgPSBpc0tub3duID8gJ25vbmUnIDogJyc7XG4gICAgICAgIGlmICghaXNLbm93bikgdGl0bGVDdXN0b20udmFsdWUgPSBjdXJyZW50VGl0bGU7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cud2FybignRmFpbGVkIHRvIGxvYWQgZ2VuZXJhdGlvbiBnb2FscyBmcm9tIGJhY2tlbmQ6JywgZXJyKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlYWQgdGhlIGZvcm0gaW5wdXRzLCB2YWxpZGF0ZSwgYW5kIFBPU1QgdG8gL2FwaS9nZW5lcmF0aW9uLWdvYWxzLlxuICogRXhwb3NlZCBvbiBnbG9iYWxUaGlzIHNvIHRoZSBpbmxpbmUgb25jbGljaz1cInNhdmVHZW5lcmF0aW9uR29hbHMoKVwiIHdvcmtzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2F2ZUdlbmVyYXRpb25Hb2FscygpIHtcbiAgY29uc3Qgc3RhdHVzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtc3RhdHVzJyk7XG5cbiAgLy8gXHUyNTAwXHUyNTAwIFJlYWQgZW5hYmxlZCBmbGFncyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgY29uc3QgcGRmRW5hYmxlZCAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLXBkZi1lbmFibGVkJyk/LmNoZWNrZWQgICAgICA/PyB0cnVlO1xuICBjb25zdCBhdHNQYWdlRW5hYmxlZCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtYXRzLXBhZ2VzLWVuYWJsZWQnKT8uY2hlY2tlZCA/PyB0cnVlO1xuICBjb25zdCBhdHNDaGFyc0VuYWJsZWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtYXRzLWNoYXJzLWVuYWJsZWQnKT8uY2hlY2tlZCA/PyBmYWxzZTtcblxuICAvLyBcdTI1MDBcdTI1MDAgUmVhZCBQREYgbW9kZSBhbmQgdmFsdWVzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICBjb25zdCBwZGZNb2RlICAgICAgICA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W25hbWU9XCJnb2Fscy1wZGYtbW9kZVwiXTpjaGVja2VkJyk/LnZhbHVlID8/ICdjb21iaW5lZCc7XG4gIGNvbnN0IHBkZlBhZ2VzICAgICAgID0gcGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLW1heC1wZGYtcGFnZXMnKT8udmFsdWUsICAgICAgICAxMCk7XG4gIGNvbnN0IHBkZlJlc3VtZVBhZ2VzID0gcGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLW1heC1wZGYtcmVzdW1lLXBhZ2VzJyk/LnZhbHVlLCAxMCk7XG4gIGNvbnN0IHBkZkN2UGFnZXMgICAgID0gcGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLW1heC1wZGYtY3YtcGFnZXMnKT8udmFsdWUsICAgICAxMCk7XG4gIGNvbnN0IGF0c1BhZ2VzICAgICAgID0gcGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLW1heC1hdHMtcGFnZXMnKT8udmFsdWUsICAgICAgICAxMCk7XG4gIGNvbnN0IGF0c0NoYXJzICAgICAgID0gcGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLW1heC1hdHMtY2hhcnMnKT8udmFsdWUsICAgICAgICAxMCk7XG5cbiAgLy8gXHUyNTAwXHUyNTAwIFZhbGlkYXRlIG9ubHkgZW5hYmxlZCBmaWVsZHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIGlmIChwZGZFbmFibGVkKSB7XG4gICAgaWYgKHBkZk1vZGUgPT09ICdjb21iaW5lZCcpIHtcbiAgICAgIGlmICghcGRmUGFnZXMgfHwgcGRmUGFnZXMgPCAxIHx8IHBkZlBhZ2VzID4gMTApIHtcbiAgICAgICAgX3NldFN0YXR1cyhzdGF0dXNFbCwgJ1x1MjZBMFx1RkUwRiBQREYgcGFnZXMgbXVzdCBiZSAxXHUyMDEzMTAuJywgJ3dhcm4nKTsgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIXBkZlJlc3VtZVBhZ2VzIHx8IHBkZlJlc3VtZVBhZ2VzIDwgMSB8fCBwZGZSZXN1bWVQYWdlcyA+IDEwKSB7XG4gICAgICAgIF9zZXRTdGF0dXMoc3RhdHVzRWwsICdcdTI2QTBcdUZFMEYgUmVzdW1lIHBvcnRpb24gcGFnZXMgbXVzdCBiZSAxXHUyMDEzMTAuJywgJ3dhcm4nKTsgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCFwZGZDdlBhZ2VzIHx8IHBkZkN2UGFnZXMgPCAxIHx8IHBkZkN2UGFnZXMgPiAxMCkge1xuICAgICAgICBfc2V0U3RhdHVzKHN0YXR1c0VsLCAnXHUyNkEwXHVGRTBGIENWIC8gUHVibGljYXRpb25zIHBvcnRpb24gcGFnZXMgbXVzdCBiZSAxXHUyMDEzMTAuJywgJ3dhcm4nKTsgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoYXRzUGFnZUVuYWJsZWQgICYmICghYXRzUGFnZXMgIHx8IGF0c1BhZ2VzICA8IDEgIHx8IGF0c1BhZ2VzICA+IDUpKSAgICAgeyBfc2V0U3RhdHVzKHN0YXR1c0VsLCAnXHUyNkEwXHVGRTBGIEFUUyBwYWdlcyBtdXN0IGJlIDFcdTIwMTM1LicsICAgICAgICAgICd3YXJuJyk7IHJldHVybjsgfVxuICBpZiAoYXRzQ2hhcnNFbmFibGVkICYmICghYXRzQ2hhcnMgIHx8IGF0c0NoYXJzICA8IDUwMCB8fCBhdHNDaGFycyA+IDIwMDAwKSkgeyBfc2V0U3RhdHVzKHN0YXR1c0VsLCAnXHUyNkEwXHVGRTBGIENoYXJhY3RlcnMgbXVzdCBiZSA1MDBcdTIwMTMyMCAwMDAuJywgJ3dhcm4nKTsgcmV0dXJuOyB9XG5cbiAgLy8gXHUyNTAwXHUyNTAwIEJ1aWxkIHBheWxvYWQgKGluY2x1ZGUgZW5hYmxlZCBmbGFncyArIGFjdGl2ZSB2YWx1ZXMgb25seSkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgcGRmX3BhZ2VzX2VuYWJsZWQ6ICBwZGZFbmFibGVkLFxuICAgIGF0c19wYWdlc19lbmFibGVkOiAgYXRzUGFnZUVuYWJsZWQsXG4gICAgYXRzX2NoYXJzX2VuYWJsZWQ6ICBhdHNDaGFyc0VuYWJsZWQsXG4gICAgbWF4X3BkZl9wYWdlc19tb2RlOiBwZGZNb2RlLFxuICB9O1xuXG4gIGlmIChwZGZFbmFibGVkKSB7XG4gICAgaWYgKHBkZk1vZGUgPT09ICdjb21iaW5lZCcpIHtcbiAgICAgIHBheWxvYWQubWF4X3BkZl9wYWdlcyA9IHBkZlBhZ2VzO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXlsb2FkLm1heF9wZGZfcmVzdW1lX3BhZ2VzID0gcGRmUmVzdW1lUGFnZXM7XG4gICAgICBwYXlsb2FkLm1heF9wZGZfY3ZfcGFnZXMgICAgID0gcGRmQ3ZQYWdlcztcbiAgICB9XG4gIH1cbiAgaWYgKGF0c1BhZ2VFbmFibGVkKSAgcGF5bG9hZC5tYXhfYXRzX3BhZ2VzID0gYXRzUGFnZXM7XG4gIGlmIChhdHNDaGFyc0VuYWJsZWQpIHBheWxvYWQubWF4X2F0c19jaGFycyA9IGF0c0NoYXJzO1xuXG4gIF9zZXRTdGF0dXMoc3RhdHVzRWwsICdTYXZpbmdcdTIwMjYnLCAnaW5mbycpO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgYXBpQ2FsbCgnUE9TVCcsICcvYXBpL2dlbmVyYXRpb24tZ29hbHMnLCBwYXlsb2FkKTtcbiAgICBfc2V0U3RhdHVzKHN0YXR1c0VsLCAnXHUyNzEzIFNhdmVkJywgJ29rJyk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7IGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnJzsgfSwgMzAwMCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy5lcnJvcignRmFpbGVkIHRvIHNhdmUgZ2VuZXJhdGlvbiBnb2FsczonLCBlcnIpO1xuICAgIF9zZXRTdGF0dXMoc3RhdHVzRWwsICdTYXZlIGZhaWxlZC4gUGxlYXNlIHRyeSBhZ2Fpbi4nLCAnZXJyb3InKTtcbiAgfVxufVxuXG4vKipcbiAqIFNob3cvaGlkZSB0aGUgY3VzdG9tLXRpdGxlIGlucHV0IHdoZW4gdGhlIHNraWxscy10aXRsZSBzZWxlY3QgY2hhbmdlcy5cbiAqIEV4cG9ydGVkIHNvIHRoZSBpbmxpbmUgb25jaGFuZ2U9XCJnb2Fsc09uU2tpbGxzVGl0bGVTZWxlY3QoKVwiIGhhbmRsZXIgd29ya3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnb2Fsc09uU2tpbGxzVGl0bGVTZWxlY3QoKSB7XG4gIGNvbnN0IHNlbCAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb2Fscy1za2lsbHMtdGl0bGUtc2VsZWN0Jyk7XG4gIGNvbnN0IGN1c3RvbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb2Fscy1za2lsbHMtdGl0bGUtY3VzdG9tJyk7XG4gIGlmICghc2VsKSByZXR1cm47XG4gIGlmIChzZWwudmFsdWUgPT09ICdfX2N1c3RvbV9fJykge1xuICAgIGlmIChjdXN0b20pIHsgY3VzdG9tLnN0eWxlLmRpc3BsYXkgPSAnJzsgY3VzdG9tLmZvY3VzKCk7IH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoY3VzdG9tKSBjdXN0b20uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBnb2Fsc0F1dG9TYXZlU2V0dGluZ3MoKTtcbiAgfVxufVxuXG4vKipcbiAqIEF1dG8tc2F2ZSB0aGUgZ2VuZXJhdGlvbiBzZXR0aW5ncyAobWF4X3NraWxscyArIHNraWxsc19zZWN0aW9uX3RpdGxlKVxuICogdmlhIFBPU1QgL2FwaS9nZW5lcmF0aW9uLXNldHRpbmdzIHdpdGhvdXQgYmxvY2tpbmcuXG4gKiBFeHBvcnRlZCBzbyBpbmxpbmUgb25jaGFuZ2U9XCJnb2Fsc0F1dG9TYXZlU2V0dGluZ3MoKVwiIGhhbmRsZXJzIHdvcmsuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnb2Fsc0F1dG9TYXZlU2V0dGluZ3MoKSB7XG4gIGNvbnN0IHN0YXR1c0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLXNldHRpbmdzLXN0YXR1cycpO1xuICBjb25zdCBzbGlkZXIgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb2Fscy1tYXgtc2tpbGxzLWlucHV0Jyk7XG4gIGNvbnN0IHNlbCAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLXNraWxscy10aXRsZS1zZWxlY3QnKTtcbiAgY29uc3QgY3VzdG9tICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtc2tpbGxzLXRpdGxlLWN1c3RvbScpO1xuXG4gIGNvbnN0IG1heFNraWxscyA9IHNsaWRlciA/IHBhcnNlSW50KHNsaWRlci52YWx1ZSwgMTApIDogbnVsbDtcbiAgY29uc3QgdGl0bGUgICAgID0gc2VsPy52YWx1ZSA9PT0gJ19fY3VzdG9tX18nXG4gICAgPyAoY3VzdG9tPy52YWx1ZT8udHJpbSgpIHx8IG51bGwpXG4gICAgOiAoc2VsPy52YWx1ZSB8fCBudWxsKTtcblxuICBpZiAoIW1heFNraWxscyAmJiAhdGl0bGUpIHJldHVybjtcblxuICBjb25zdCBwYXlsb2FkID0ge307XG4gIGlmIChtYXhTa2lsbHMgJiYgbWF4U2tpbGxzID49IDEpIHBheWxvYWQubWF4X3NraWxscyAgICAgICAgICA9IG1heFNraWxscztcbiAgaWYgKHRpdGxlKSAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZC5za2lsbHNfc2VjdGlvbl90aXRsZSA9IHRpdGxlO1xuXG4gIF9zZXRTdGF0dXMoc3RhdHVzRWwsICdTYXZpbmdcdTIwMjYnLCAnaW5mbycpO1xuICB0cnkge1xuICAgIGF3YWl0IGFwaUNhbGwoJ1BPU1QnLCAnL2FwaS9nZW5lcmF0aW9uLXNldHRpbmdzJywgcGF5bG9hZCk7XG4gICAgX3NldFN0YXR1cyhzdGF0dXNFbCwgJ1x1MjcxMyBTYXZlZCcsICdvaycpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4geyBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJyc7IH0sIDIwMDApO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cud2FybignRmFpbGVkIHRvIHNhdmUgZ2VuZXJhdGlvbiBzZXR0aW5nczonLCBlcnIpO1xuICAgIF9zZXRTdGF0dXMoc3RhdHVzRWwsICdTYXZlIGZhaWxlZCcsICdlcnJvcicpO1xuICB9XG59XG5cbi8qKiBAcHJpdmF0ZSAqL1xuZnVuY3Rpb24gX3NldFN0YXR1cyhlbCwgbWVzc2FnZSwgbGV2ZWwpIHtcbiAgaWYgKCFlbCkgcmV0dXJuO1xuICBjb25zdCBjb2xvdXJzID0ge1xuICAgIG9rOiAgICAndmFyKC0tc3VjY2VzcywjMmU3ZDMyKScsXG4gICAgZXJyb3I6ICd2YXIoLS1kYW5nZXIsI2M2MjgyOCknLFxuICAgIHdhcm46ICAndmFyKC0td2FybmluZywjZTY1MTAwKScsXG4gICAgaW5mbzogICd2YXIoLS10ZXh0LXNlY29uZGFyeSwjNTU1KScsXG4gIH07XG4gIGVsLnN0eWxlLmNvbG9yICA9IGNvbG91cnNbbGV2ZWxdIHx8IGNvbG91cnMuaW5mbztcbiAgZWwudGV4dENvbnRlbnQgID0gbWVzc2FnZTtcbn1cbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL3Nlc3Npb24tbWFuYWdlci5qc1xuICogU2Vzc2lvbiBsaWZlY3ljbGU6IGNyZWF0ZSwgY2xhaW0sIHJlc3RvcmUsIHNhdmUsIGxvYWQuXG4gKiBBbHNvIG93bnMgZm9ybWF0U2Vzc2lvblBoYXNlTGFiZWwgYW5kIHJlbGF0ZWQgc2Vzc2lvbi1sYWJlbCBoZWxwZXJzLlxuICpcbiAqIERFUEVOREVOQ0lFUyAoYWxsIG9uIGdsb2JhbFRoaXMgYXQgcnVudGltZSk6XG4gKiAgIC0gY3JlYXRlU2Vzc2lvbiwgZmV0Y2hTdGF0dXMgKGFwaS1jbGllbnQuanMpXG4gKiAgIC0gZ2V0U2Vzc2lvbklkRnJvbVVSTCwgZ2V0T3duZXJUb2tlbiwgU3RvcmFnZUtleXMsIGdldFNjb3BlZFRhYkRhdGFTdG9yYWdlS2V5IChzdGF0ZS1tYW5hZ2VyLmpzKVxuICogICAtIGFwcGVuZE1lc3NhZ2UsIGFwcGVuZFJldHJ5TWVzc2FnZSAobWVzc2FnZS1xdWV1ZS5qcylcbiAqICAgLSBwYXJzZVN0YXR1c1Jlc3BvbnNlLCBwYXJzZVJld3JpdGVzUmVzcG9uc2UgKHZhbGlkYXRvcnMuanMpXG4gKiAgIC0gcmVmcmVzaEF0c1Njb3JlIChhdHMtcmVmaW5lbWVudC5qcylcbiAqICAgLSB1cGRhdGVJbmNsdXNpb25Db3VudHMgKHJldmlldy10YWJsZS1iYXNlLmpzLCBUaWVyIDQpXG4gKiAgIC0gc3dpdGNoVGFiIChyZXZpZXctdGFibGUtYmFzZS5qcywgVGllciA0KVxuICogICAtIHJlbmRlclJld3JpdGVQYW5lbCAocmV3cml0ZS1yZXZpZXcuanMsIFRpZXIgNilcbiAqICAgLSBzaG93T3duZXJzaGlwQ29uZmxpY3REaWFsb2csIG9wZW5TZXNzaW9uc01vZGFsIChzZXNzaW9uLXN3aXRjaGVyLXVpLmpzLCBUaWVyIDcpXG4gKiAgIC0gdXBkYXRlQWN0aW9uQnV0dG9ucyAodWktaGVscGVycy5qcylcbiAqICAgLSB1cGRhdGVQb3NpdGlvblRpdGxlIChzZXNzaW9uLWFjdGlvbnMuanMpXG4gKiAgIC0gZXNjYXBlSHRtbCwgU0VTU0lPTl9QSEFTRV9MQUJFTFNfU0hPUlQgKHV0aWxzLmpzKVxuICogICAtIHN0YXRlTWFuYWdlciAoc3RhdGUtbWFuYWdlci5qcyBcdTIwMTQgZ2V0QWxsVGFiRGF0YSgpL2dldEN1cnJlbnRUYWIoKS9zZXRUYWJEYXRhKCkvc2V0Q3VycmVudFRhYigpKVxuICogICAtIHNlc3Npb25JZCwgaXNSZWNvbm5lY3RpbmcsIGxhc3RLbm93blBoYXNlLCBpbnRlcmFjdGl2ZVN0YXRlLFxuICogICAgIHJld3JpdGVEZWNpc2lvbnMsIFBIQVNFUyAod2luZG93IGdsb2JhbHMpXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdzZXNzaW9uLW1hbmFnZXInKTtcblxuaW1wb3J0IHsgU0VTU0lPTl9QSEFTRV9MQUJFTFNfU0hPUlQsIFNFU1NJT05fUEhBU0VfTEFCRUxTIH0gZnJvbSAnLi91dGlscy5qcyc7XG5pbXBvcnQgeyBQSEFTRVMsIHN0YXRlTWFuYWdlciB9IGZyb20gJy4vc3RhdGUtbWFuYWdlci5qcyc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU2Vzc2lvbiBwaGFzZSBsYWJlbHMgKGFiYnJldmlhdGVkIGZvcm0gXHUyMDE0IGZvciBjb21wYWN0IHNlc3Npb24tc3dpdGNoZXIgVUkpXG4vLyBGdWxsLWxlbmd0aCBsYWJlbHMgbGl2ZSBpbiB1dGlscy5qcyBTRVNTSU9OX1BIQVNFX0xBQkVMUy5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiBmb3JtYXRTZXNzaW9uUGhhc2VMYWJlbChwaGFzZSkge1xuICBpZiAoIXBoYXNlKSByZXR1cm4gJ2luaXQnO1xuICByZXR1cm4gU0VTU0lPTl9QSEFTRV9MQUJFTFNfU0hPUlRbcGhhc2VdIHx8IFN0cmluZyhwaGFzZSkucmVwbGFjZSgvXy9nLCAnICcpO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEN1cnJlbnQgc2Vzc2lvbiBpZGVudGl0eSBoZWxwZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gX2dldEN1cnJlbnRTZXNzaW9uSWRWYWx1ZSgpIHtcbiAgaWYgKHR5cGVvZiBnZXRTZXNzaW9uSWRGcm9tVVJMID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGdldFNlc3Npb25JZEZyb21VUkwoKTtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpLmdldCgnc2Vzc2lvbicpO1xuICB9IGNhdGNoIChfKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2dldEN1cnJlbnRPd25lclRva2VuVmFsdWUoKSB7XG4gIGlmICh0eXBlb2YgZ2V0T3duZXJUb2tlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBnZXRPd25lclRva2VuKCk7XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnY3YtYnVpbGRlci1vd25lci10b2tlbicpO1xuICB9IGNhdGNoIChfKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gYnVpbGRTZXNzaW9uU3dpdGNoZXJMYWJlbChzdGF0dXMgPSB7fSkge1xuICBjb25zdCBwb3NpdGlvbk5hbWUgPSAoc3RhdHVzLnBvc2l0aW9uX25hbWUgfHwgJycpLnRvU3RyaW5nKCkudHJpbSgpO1xuICBjb25zdCBwaGFzZSA9IGZvcm1hdFNlc3Npb25QaGFzZUxhYmVsKHN0YXR1cy5waGFzZSk7XG4gIGlmIChwb3NpdGlvbk5hbWUpIHtcbiAgICByZXR1cm4gYCR7cG9zaXRpb25OYW1lfSBcdTAwQjcgJHtwaGFzZX1gO1xuICB9XG4gIHJldHVybiBfZ2V0Q3VycmVudFNlc3Npb25JZFZhbHVlKCkgPyBgU2Vzc2lvbiBcdTAwQjcgJHtwaGFzZX1gIDogJ1x1RDgzRFx1RENDMiBTZXNzaW9ucyc7XG59XG5cbmZ1bmN0aW9uIGdldEFjdGl2ZVNlc3Npb25Pd25lcnNoaXBNZXRhKHNlc3Npb24sIHtcbiAgY3VycmVudFNlc3Npb25JZCA9IF9nZXRDdXJyZW50U2Vzc2lvbklkVmFsdWUoKSxcbn0gPSB7fSkge1xuICBpZiAoIXNlc3Npb24gfHwgdHlwZW9mIHNlc3Npb24gIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHsgbGFiZWw6ICdVbmtub3duJywgY2xhc3NOYW1lOiAnc2Vzc2lvbi1zdGF0dXMtdW5jbGFpbWVkJywgaXNDdXJyZW50OiBmYWxzZSB9O1xuICB9XG5cbiAgY29uc3QgaXNDdXJyZW50U2Vzc2lvbiA9IEJvb2xlYW4oY3VycmVudFNlc3Npb25JZCkgJiYgc2Vzc2lvbi5zZXNzaW9uX2lkID09PSBjdXJyZW50U2Vzc2lvbklkO1xuICBjb25zdCBzYW1lT3duZXIgPSBCb29sZWFuKHNlc3Npb24ub3duZWRfYnlfcmVxdWVzdGVyKTtcblxuICBpZiAoaXNDdXJyZW50U2Vzc2lvbikge1xuICAgIHJldHVybiB7IGxhYmVsOiAnQ3VycmVudCB0YWInLCBjbGFzc05hbWU6ICdzZXNzaW9uLXN0YXR1cy1jdXJyZW50JywgaXNDdXJyZW50OiB0cnVlIH07XG4gIH1cbiAgaWYgKHNhbWVPd25lcikge1xuICAgIHJldHVybiB7IGxhYmVsOiAnT3duZWQgYnkgdGhpcyB0YWInLCBjbGFzc05hbWU6ICdzZXNzaW9uLXN0YXR1cy1jdXJyZW50JywgaXNDdXJyZW50OiBmYWxzZSB9O1xuICB9XG4gIGlmIChzZXNzaW9uLmNsYWltZWQpIHtcbiAgICByZXR1cm4geyBsYWJlbDogJ093bmVkIGJ5IGFub3RoZXIgdGFiJywgY2xhc3NOYW1lOiAnc2Vzc2lvbi1zdGF0dXMtb3duZWQnLCBpc0N1cnJlbnQ6IGZhbHNlIH07XG4gIH1cbiAgcmV0dXJuIHsgbGFiZWw6ICdVbmNsYWltZWQnLCBjbGFzc05hbWU6ICdzZXNzaW9uLXN0YXR1cy11bmNsYWltZWQnLCBpc0N1cnJlbnQ6IGZhbHNlIH07XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFNlc3Npb25UaW1lc3RhbXAodGltZXN0YW1wLCB7IGluY2x1ZGVUaW1lID0gdHJ1ZSB9ID0ge30pIHtcbiAgaWYgKCF0aW1lc3RhbXApIHJldHVybiAnXHUyMDE0JztcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IERhdGUodGltZXN0YW1wKS50b0xvY2FsZVN0cmluZygnZW4tVVMnLCB7XG4gICAgICBtb250aDogJ3Nob3J0JywgZGF5OiAnbnVtZXJpYycsIHllYXI6ICdudW1lcmljJyxcbiAgICAgIC4uLihpbmNsdWRlVGltZSA/IHsgaG91cjogJ251bWVyaWMnLCBtaW51dGU6ICcyLWRpZ2l0JyB9IDoge30pLFxuICAgIH0pO1xuICB9IGNhdGNoIChfKSB7XG4gICAgcmV0dXJuIFN0cmluZyh0aW1lc3RhbXApLnJlcGxhY2UoJ1QnLCAnICcpLnNsaWNlKDAsIGluY2x1ZGVUaW1lID8gMTYgOiAxMCk7XG4gIH1cbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBXZWxjb21lIC8gb25ib2FyZGluZyBtb2RhbCAoR0FQLTM2IC8gR0FQLTM3KVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IF9XRUxDT01FX0RJU01JU1NFRF9LRVkgPSAnY3YtYnVpbGRlci13ZWxjb21lLWRpc21pc3NlZCc7XG5cbi8qKlxuICogU3dpdGNoIHdoaWNoIGNvbnRlbnQgc2VjdGlvbiBpcyB2aXNpYmxlIGluc2lkZSB0aGUgd2VsY29tZSBtb2RhbC5cbiAqIEBwYXJhbSB7J3ByZXNlbnQnfCdtaXNzaW5nJ30gc2VjdGlvblxuICovXG5mdW5jdGlvbiBfc2V0V2VsY29tZVNlY3Rpb24oc2VjdGlvbikge1xuICBjb25zdCBzUHJlc2VudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd3ZWxjb21lLXNlY3Rpb24tcHJlc2VudCcpO1xuICBjb25zdCBzRW1wdHkgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd3ZWxjb21lLXNlY3Rpb24tZW1wdHknKTtcbiAgY29uc3Qgc01pc3NpbmcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnd2VsY29tZS1zZWN0aW9uLW1pc3NpbmcnKTtcbiAgY29uc3QgZlByZXNlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnd2VsY29tZS1mb290ZXItcHJlc2VudCcpO1xuICBjb25zdCBmTWlzc2luZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd3ZWxjb21lLWZvb3Rlci1taXNzaW5nJyk7XG4gIGlmIChzUHJlc2VudCkgc1ByZXNlbnQuc3R5bGUuZGlzcGxheSA9IHNlY3Rpb24gPT09ICdwcmVzZW50JyA/ICcnIDogJ25vbmUnO1xuICBpZiAoc0VtcHR5KSAgIHNFbXB0eS5zdHlsZS5kaXNwbGF5ICAgPSBzZWN0aW9uID09PSAnZW1wdHknICAgPyAnJyA6ICdub25lJztcbiAgaWYgKHNNaXNzaW5nKSBzTWlzc2luZy5zdHlsZS5kaXNwbGF5ID0gc2VjdGlvbiA9PT0gJ21pc3NpbmcnID8gJycgOiAnbm9uZSc7XG4gIC8vIEVtcHR5IHNrZWxldG9uOiBzaG93IFwicHJlc2VudFwiIGZvb3RlciAoQ2xvc2UvZGlzbWlzcykgbm90IFwibWlzc2luZ1wiIGZvb3RlciAoQ3JlYXRlL1JlbG9hZClcbiAgaWYgKGZQcmVzZW50KSBmUHJlc2VudC5zdHlsZS5kaXNwbGF5ID0gKHNlY3Rpb24gPT09ICdwcmVzZW50JyB8fCBzZWN0aW9uID09PSAnZW1wdHknKSA/ICdmbGV4JyA6ICdub25lJztcbiAgaWYgKGZNaXNzaW5nKSBmTWlzc2luZy5zdHlsZS5kaXNwbGF5ID0gc2VjdGlvbiA9PT0gJ21pc3NpbmcnID8gJ2ZsZXgnIDogJ25vbmUnO1xuICAvLyBGb3IgZW1wdHkgc3RhdGU6IGNoYW5nZSBDVEEgdG8gbmF2aWdhdGUgdG8gTWFzdGVyIENWIGluc3RlYWQgb2YganVzdCBjbG9zaW5nXG4gIGNvbnN0IGdldFN0YXJ0ZWRCdG4gPSBmUHJlc2VudCA/IGZQcmVzZW50LnF1ZXJ5U2VsZWN0b3IoJ2J1dHRvbi5wcmltYXJ5JykgOiBudWxsO1xuICBpZiAoZ2V0U3RhcnRlZEJ0bikge1xuICAgIGlmIChzZWN0aW9uID09PSAnZW1wdHknKSB7XG4gICAgICBnZXRTdGFydGVkQnRuLnRleHRDb250ZW50ID0gJ09wZW4gTWFzdGVyIENWJztcbiAgICAgIGdldFN0YXJ0ZWRCdG4ub25jbGljayA9ICgpID0+IHsgY2xvc2VXZWxjb21lTW9kYWwoKTsgaWYgKHR5cGVvZiBvcGVuTWFzdGVyQ3ZNb2RhbCA9PT0gJ2Z1bmN0aW9uJykgb3Blbk1hc3RlckN2TW9kYWwoKTsgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2V0U3RhcnRlZEJ0bi50ZXh0Q29udGVudCA9ICdHZXQgU3RhcnRlZCc7XG4gICAgICBnZXRTdGFydGVkQnRuLm9uY2xpY2sgPSAoKSA9PiB7XG4gICAgICAgIGNsb3NlV2VsY29tZU1vZGFsKCk7XG4gICAgICAgIGlmICh0eXBlb2Ygc3dpdGNoVGFiID09PSAnZnVuY3Rpb24nKSBzd2l0Y2hUYWIoJ2pvYicpO1xuICAgICAgfTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBTaG93IHRoZSBvbmJvYXJkaW5nIG1vZGFsIGluIHRoZSBcIm1pc3NpbmcgbWFzdGVyIENWXCIgc3RhdGUuXG4gKiBDYWxsZWQgZnJvbSBjcmVhdGVOZXdTZXNzaW9uQW5kTmF2aWdhdGUoKSB3aGVuIHRoZSBiYWNrZW5kIHJldHVybnMgbWFzdGVyX2N2X21pc3NpbmcuXG4gKiBAcGFyYW0ge3N0cmluZ30gbWFzdGVyQ3ZQYXRoIC0gU2VydmVyLXJlcG9ydGVkIGV4cGVjdGVkIGZpbGUgcGF0aC5cbiAqL1xuZnVuY3Rpb24gc2hvd09uYm9hcmRpbmdNb2RhbChtYXN0ZXJDdlBhdGgpIHtcbiAgY29uc3Qgb3ZlcmxheSAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb25ib2FyZGluZy1tb2RhbC1vdmVybGF5Jyk7XG4gIGNvbnN0IHBhdGhFbCAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ29uYm9hcmRpbmctbWFzdGVyLWN2LXBhdGgnKTtcbiAgY29uc3Qgc3RhdHVzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb25ib2FyZGluZy1tb2RhbC1zdGF0dXMnKTtcbiAgaWYgKHBhdGhFbCkgICBwYXRoRWwudGV4dENvbnRlbnQgICA9IG1hc3RlckN2UGF0aCB8fCAnKHVua25vd24pJztcbiAgaWYgKHN0YXR1c0VsKSBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICcnO1xuICBfc2V0V2VsY29tZVNlY3Rpb24oJ21pc3NpbmcnKTtcbiAgaWYgKG92ZXJsYXkpIHtcbiAgICBvdmVybGF5LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgX29wZW5PbmJvYXJkaW5nRm9jdXNUcmFwKG92ZXJsYXkpO1xuICB9XG59XG5cbi8qKlxuICogU2hvdyB0aGUgd2VsY29tZSBtb2RhbCB1bmxlc3MgdGhlIHVzZXIgaGFzIGRpc21pc3NlZCBpdC5cbiAqIENhbGxzIC9hcGkvc2V0dXAvbWFzdGVyLWN2LXN0YXR1cyB0byBjaG9vc2Ugd2hpY2ggc2VjdGlvbiB0byBkaXNwbGF5LlxuICogU2FmZSB0byBjYWxsIG9uIGV2ZXJ5IHN0YXJ0dXAgXHUyMDE0IG5vLW9wcyBpbW1lZGlhdGVseSBpZiBkaXNtaXNzZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG1heWJlU2hvd1dlbGNvbWVNb2RhbCgpIHtcbiAgdHJ5IHtcbiAgICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0oX1dFTENPTUVfRElTTUlTU0VEX0tFWSkpIHJldHVybjtcbiAgfSBjYXRjaCAoXykge31cbiAgbGV0IHNlY3Rpb24gPSAncHJlc2VudCc7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvc2V0dXAvbWFzdGVyLWN2LXN0YXR1cycpO1xuICAgIGlmIChyZXMub2spIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpLmNhdGNoKCgpID0+ICh7fSkpO1xuICAgICAgaWYgKCFkYXRhLmV4aXN0cykge1xuICAgICAgICBjb25zdCBwYXRoRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb25ib2FyZGluZy1tYXN0ZXItY3YtcGF0aCcpO1xuICAgICAgICBpZiAocGF0aEVsKSBwYXRoRWwudGV4dENvbnRlbnQgPSBkYXRhLnBhdGggfHwgJyh1bmtub3duKSc7XG4gICAgICAgIHNlY3Rpb24gPSAnbWlzc2luZyc7XG4gICAgICB9IGVsc2UgaWYgKGRhdGEuaXNfZW1wdHkpIHtcbiAgICAgICAgc2VjdGlvbiA9ICdlbXB0eSc7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChfKSB7fVxuICBjb25zdCBzdGF0dXNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvbmJvYXJkaW5nLW1vZGFsLXN0YXR1cycpO1xuICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJyc7XG4gIF9zZXRXZWxjb21lU2VjdGlvbihzZWN0aW9uKTtcbiAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvbmJvYXJkaW5nLW1vZGFsLW92ZXJsYXknKTtcbiAgaWYgKG92ZXJsYXkpIHtcbiAgICBvdmVybGF5LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgX29wZW5PbmJvYXJkaW5nRm9jdXNUcmFwKG92ZXJsYXkpO1xuICB9XG59XG5cbi8qKiBXaXJlIGZvY3VzIHRyYXAgYW5kIEVzY2FwZSBoYW5kbGVyIGZvciB0aGUgb25ib2FyZGluZyBvdmVybGF5IChXQ0FHIDIuMS4yKS4gKi9cbmZ1bmN0aW9uIF9vcGVuT25ib2FyZGluZ0ZvY3VzVHJhcChvdmVybGF5KSB7XG4gIGlmICh0eXBlb2YgZ2xvYmFsVGhpcy5zZXRJbml0aWFsRm9jdXMgPT09ICdmdW5jdGlvbicpIGdsb2JhbFRoaXMuc2V0SW5pdGlhbEZvY3VzKCdvbmJvYXJkaW5nLW1vZGFsLW92ZXJsYXknKTtcbiAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzLnRyYXBGb2N1cyA9PT0gJ2Z1bmN0aW9uJykgICAgICAgZ2xvYmFsVGhpcy50cmFwRm9jdXMoJ29uYm9hcmRpbmctbW9kYWwtb3ZlcmxheScpO1xuICBpZiAoIW92ZXJsYXkuX29uYm9hcmRpbmdFc2NIYW5kbGVyKSB7XG4gICAgb3ZlcmxheS5fb25ib2FyZGluZ0VzY0hhbmRsZXIgPSAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgY2xvc2VXZWxjb21lTW9kYWwoKTtcbiAgICB9O1xuICAgIG92ZXJsYXkuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIG92ZXJsYXkuX29uYm9hcmRpbmdFc2NIYW5kbGVyKTtcbiAgfVxufVxuXG4vKipcbiAqIFNob3cgdGhlIHdlbGNvbWUgbW9kYWwgdW5jb25kaXRpb25hbGx5IChpZ25vcmVzIHRoZSBcImRvbid0IHNob3cgYWdhaW5cIiBmbGFnKS5cbiAqIFVzZWQgYnkgdGhlIEhlbHAgYnV0dG9uIHNvIHVzZXJzIGNhbiBhbHdheXMgcmVvcGVuIG9uYm9hcmRpbmcgbWlkLXNlc3Npb24uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNob3dXZWxjb21lTW9kYWwoKSB7XG4gIGxldCBzZWN0aW9uID0gJ3ByZXNlbnQnO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3NldHVwL21hc3Rlci1jdi1zdGF0dXMnKTtcbiAgICBpZiAocmVzLm9rKSB7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKTtcbiAgICAgIGlmICghZGF0YS5leGlzdHMpIHtcbiAgICAgICAgY29uc3QgcGF0aEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ29uYm9hcmRpbmctbWFzdGVyLWN2LXBhdGgnKTtcbiAgICAgICAgaWYgKHBhdGhFbCkgcGF0aEVsLnRleHRDb250ZW50ID0gZGF0YS5wYXRoIHx8ICcodW5rbm93biknO1xuICAgICAgICBzZWN0aW9uID0gJ21pc3NpbmcnO1xuICAgICAgfSBlbHNlIGlmIChkYXRhLmlzX2VtcHR5KSB7XG4gICAgICAgIHNlY3Rpb24gPSAnZW1wdHknO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoXykge31cbiAgY29uc3Qgc3RhdHVzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb25ib2FyZGluZy1tb2RhbC1zdGF0dXMnKTtcbiAgaWYgKHN0YXR1c0VsKSBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICcnO1xuICBfc2V0V2VsY29tZVNlY3Rpb24oc2VjdGlvbik7XG4gIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb25ib2FyZGluZy1tb2RhbC1vdmVybGF5Jyk7XG4gIGlmIChvdmVybGF5KSB7XG4gICAgb3ZlcmxheS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICAgIF9vcGVuT25ib2FyZGluZ0ZvY3VzVHJhcChvdmVybGF5KTtcbiAgfVxufVxuXG4vKipcbiAqIENsb3NlIHRoZSB3ZWxjb21lIG1vZGFsLlxuICogSWYgXCJEb24ndCBzaG93IGFnYWluXCIgaXMgY2hlY2tlZCwgcGVyc2lzdHMgdGhlIGRpc21pc3NhbCBpbiBsb2NhbFN0b3JhZ2UuXG4gKi9cbmZ1bmN0aW9uIGNsb3NlV2VsY29tZU1vZGFsKCkge1xuICBjb25zdCBvdmVybGF5ICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvbmJvYXJkaW5nLW1vZGFsLW92ZXJsYXknKTtcbiAgY29uc3QgY2hlY2tib3ggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnd2VsY29tZS1kb250LXNob3ctYWdhaW4nKTtcbiAgaWYgKG92ZXJsYXkpIHtcbiAgICBvdmVybGF5LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgaWYgKG92ZXJsYXkuX29uYm9hcmRpbmdFc2NIYW5kbGVyKSB7XG4gICAgICBvdmVybGF5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBvdmVybGF5Ll9vbmJvYXJkaW5nRXNjSGFuZGxlcik7XG4gICAgICBkZWxldGUgb3ZlcmxheS5fb25ib2FyZGluZ0VzY0hhbmRsZXI7XG4gICAgfVxuICB9XG4gIGlmIChjaGVja2JveCAmJiBjaGVja2JveC5jaGVja2VkKSB7XG4gICAgdHJ5IHsgbG9jYWxTdG9yYWdlLnNldEl0ZW0oX1dFTENPTUVfRElTTUlTU0VEX0tFWSwgJzEnKTsgfSBjYXRjaCAoXykge31cbiAgfVxuICBpZiAodHlwZW9mIGdsb2JhbFRoaXMucmVzdG9yZUZvY3VzID09PSAnZnVuY3Rpb24nKSBnbG9iYWxUaGlzLnJlc3RvcmVGb2N1cygpO1xufVxuXG4vKipcbiAqIENhbGxlZCBieSB0aGUgb25ib2FyZGluZyBtb2RhbCBcIkNyZWF0ZSBlbXB0eSBwcm9maWxlXCIgYnV0dG9uLlxuICogUE9TVHMgdG8gL2FwaS9zZXR1cC9jcmVhdGUtbWFzdGVyLWN2LCB0aGVuIG5hdmlnYXRlcyB0byBhIG5ldyBzZXNzaW9uLlxuICovXG5hc3luYyBmdW5jdGlvbiBvbmJvYXJkaW5nQ3JlYXRlRW1wdHlQcm9maWxlKCkge1xuICBjb25zdCBidG4gICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvbmJvYXJkaW5nLWNyZWF0ZS1idG4nKTtcbiAgY29uc3Qgc3RhdHVzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb25ib2FyZGluZy1tb2RhbC1zdGF0dXMnKTtcbiAgaWYgKGJ0bikgYnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgaWYgKHN0YXR1c0VsKSBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICdDcmVhdGluZyBwcm9maWxlXHUyMDI2JztcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvc2V0dXAvY3JlYXRlLW1hc3Rlci1jdicsIHsgbWV0aG9kOiAnUE9TVCcgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSk7XG4gICAgaWYgKCFyZXMub2spIHtcbiAgICAgIGNvbnN0IG1zZyA9IGRhdGEuZXJyb3IgPT09ICdhbHJlYWR5X2V4aXN0cydcbiAgICAgICAgPyAnRmlsZSBhbHJlYWR5IGV4aXN0cyBcdTIwMTQgcGxlYXNlIHJlbG9hZCB0aGUgcGFnZS4nXG4gICAgICAgIDogKGRhdGEuZXJyb3IgfHwgYFNlcnZlciBlcnJvciAke3Jlcy5zdGF0dXN9YCk7XG4gICAgICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gbXNnO1xuICAgICAgaWYgKGJ0bikgYnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEZpbGUgY3JlYXRlZCBcdTIwMTQgbm93IG5hdmlnYXRlIHRvIGEgbmV3IHNlc3Npb25cbiAgICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJ1Byb2ZpbGUgY3JlYXRlZCEgU3RhcnRpbmcgc2Vzc2lvblx1MjAyNic7XG4gICAgYXdhaXQgY3JlYXRlTmV3U2Vzc2lvbkFuZE5hdmlnYXRlKCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSBgRXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YDtcbiAgICBpZiAoYnRuKSBidG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNlc3Npb24gY3JlYXRpb25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVOZXdTZXNzaW9uQW5kTmF2aWdhdGUoKSB7XG4gIGNvbnN0IGRhdGEgPSBhd2FpdCBjcmVhdGVTZXNzaW9uKCk7XG4gIGlmIChkYXRhLmVycm9yID09PSAnbWFzdGVyX2N2X21pc3NpbmcnKSB7XG4gICAgc2hvd09uYm9hcmRpbmdNb2RhbChkYXRhLm1hc3Rlcl9jdl9wYXRoIHx8ICcnKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCFkYXRhLnNlc3Npb25faWQpIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGNyZWF0ZSBzZXNzaW9uJyk7XG4gIC8vIENsZWFyIGFueSBzdGFsZSBzZXNzaW9uIHBhdGggXHUyMDE0IHRoZSBuZXcgc2Vzc2lvbiBoYXMgbm8gc2F2ZWQgZmlsZSB5ZXQuXG4gIC8vIElmIFNFU1NJT05fUEFUSCB3ZXJlIGxlZnQgcG9pbnRpbmcgYXQgYSBwcmV2aW91cyBzZXNzaW9uJ3MgZmlsZSwgdGhlXG4gIC8vIGRpc2stcmVzdG9yZSBndWFyZCBpbiByZXN0b3JlQmFja2VuZFN0YXRlIGNvdWxkIGxvYWQgdGhlIHdyb25nIHNlc3Npb25cbiAgLy8gb24gdGhlIG5leHQgdmlzaXQgb25jZSBTRVNTSU9OX0lEIGlzIHVwZGF0ZWQgYnkgdGhlIGJlZm9yZXVubG9hZCBoYW5kbGVyLlxuICB0cnkgeyBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnY3YtYnVpbGRlci1zZXNzaW9uLXBhdGgnKTsgfSBjYXRjaCAoXykge31cbiAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihkYXRhLnJlZGlyZWN0X3VybCB8fCBgLz9zZXNzaW9uPSR7ZGF0YS5zZXNzaW9uX2lkfWApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVOZXdTZXNzaW9uSW5OZXdUYWIoKSB7XG4gIGNvbnN0IGRhdGEgPSBhd2FpdCBjcmVhdGVTZXNzaW9uKCk7XG4gIGlmIChkYXRhLmVycm9yID09PSAnbWFzdGVyX2N2X21pc3NpbmcnKSB7XG4gICAgc2hvd09uYm9hcmRpbmdNb2RhbChkYXRhLm1hc3Rlcl9jdl9wYXRoIHx8ICcnKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCFkYXRhLnNlc3Npb25faWQpIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGNyZWF0ZSBzZXNzaW9uJyk7XG4gIHdpbmRvdy5vcGVuKGRhdGEucmVkaXJlY3RfdXJsIHx8IGAvP3Nlc3Npb249JHtkYXRhLnNlc3Npb25faWR9YCwgJ19ibGFuaycsICdub29wZW5lcicpO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNlc3Npb24gY2xhaW0gLyBvd25lcnNoaXBcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5hc3luYyBmdW5jdGlvbiBfY2xhaW1DdXJyZW50U2Vzc2lvbihzZXNzaW9uSWRUb0NsYWltKSB7XG4gIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3Nlc3Npb25zL2NsYWltJywge1xuICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIHNlc3Npb25faWQ6IHNlc3Npb25JZFRvQ2xhaW0sXG4gICAgICBvd25lcl90b2tlbjogZ2V0T3duZXJUb2tlbigpLFxuICAgIH0pLFxuICB9KTtcblxuICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKTtcbiAgaWYgKHJlcy5vayAmJiBkYXRhLm9rICE9PSBmYWxzZSkgcmV0dXJuIHRydWU7XG5cbiAgaWYgKHJlcy5zdGF0dXMgPT09IDQwOSAmJiBkYXRhLmVycm9yID09PSAnc2Vzc2lvbl9vd25lZCcpIHtcbiAgICBjb25zdCBhY3Rpb24gPSBhd2FpdCBzaG93T3duZXJzaGlwQ29uZmxpY3REaWFsb2coXG4gICAgICAnVGhpcyBzZXNzaW9uIGlzIGN1cnJlbnRseSBjbGFpbWVkIGJ5IGFub3RoZXIgYnJvd3NlciB0YWIuIFlvdSBjYW4gdGFrZSBpdCBvdmVyLCBzdGFydCBhIG5ldyBzZXNzaW9uLCBvciBsb2FkIGEgZGlmZmVyZW50IG9uZS4nXG4gICAgKTtcbiAgICBpZiAoYWN0aW9uID09PSAnbmV3Jykge1xuICAgICAgYXdhaXQgY3JlYXRlTmV3U2Vzc2lvbkFuZE5hdmlnYXRlKCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChhY3Rpb24gIT09ICd0YWtlb3ZlcicpIHtcbiAgICAgIHNob3dTZXNzaW9uc0xhbmRpbmdQYW5lbCgnU2VsZWN0IGEgZGlmZmVyZW50IHNlc3Npb24gb3IgY3JlYXRlIGEgbmV3IG9uZS4nKTtcbiAgICAgIG9wZW5TZXNzaW9uc01vZGFsKHsgcmVxdWlyZWQ6IHRydWUgfSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgdGFrZW92ZXJSZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9zZXNzaW9ucy90YWtlb3ZlcicsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIHNlc3Npb25faWQ6IHNlc3Npb25JZFRvQ2xhaW0sXG4gICAgICAgIG93bmVyX3Rva2VuOiBnZXRPd25lclRva2VuKCksXG4gICAgICB9KSxcbiAgICB9KTtcbiAgICBjb25zdCB0YWtlb3ZlckRhdGEgPSBhd2FpdCB0YWtlb3ZlclJlcy5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSk7XG4gICAgaWYgKCF0YWtlb3ZlclJlcy5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHRha2VvdmVyRGF0YS5lcnJvciB8fCAnRmFpbGVkIHRvIHRha2Ugb3ZlciBzZXNzaW9uJyk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHJlcy5zdGF0dXMgPT09IDQwNCB8fCBkYXRhLmVycm9yID09PSAnc2Vzc2lvbl9ub3RfZm91bmQnKSB7XG4gICAgc2hvd1Nlc3Npb25zTGFuZGluZ1BhbmVsKCdUaGF0IHNlc3Npb24gaXMgbm8gbG9uZ2VyIGFjdGl2ZS4gTG9hZCBpdCBmcm9tIGRpc2sgb3IgY3JlYXRlIGEgbmV3IG9uZS4nKTtcbiAgICBvcGVuU2Vzc2lvbnNNb2RhbCh7IHJlcXVpcmVkOiB0cnVlIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihkYXRhLmVycm9yIHx8IGBGYWlsZWQgdG8gY2xhaW0gc2Vzc2lvbiAoJHtyZXMuc3RhdHVzfSlgKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTZXNzaW9uIG5hdmlnYXRpb24gZnJvbSBsYW5kaW5nIHBhZ2Vcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiBzaG93U2Vzc2lvbnNMYW5kaW5nUGFuZWwobWVzc2FnZSA9ICcnKSB7XG4gIHN0YXRlTWFuYWdlci5zZXRDdXJyZW50VGFiKCdqb2InKTtcbiAgc3RhdGVNYW5hZ2VyLnNldFBoYXNlKFBIQVNFUy5JTklUKTtcbiAgdXBkYXRlQWN0aW9uQnV0dG9ucygnam9iJyk7XG4gIHVwZGF0ZVBvc2l0aW9uVGl0bGUoe30pO1xuXG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9jdW1lbnQtY29udGVudCcpO1xuICBpZiAoIWNvbnRlbnQpIHJldHVybjtcblxuICBjb250ZW50LmlubmVySFRNTCA9IGBcbiAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1sYW5kaW5nLXNoZWxsXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1sYW5kaW5nLWhlYWRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1sYW5kaW5nLWNvcHlcIj5cbiAgICAgICAgICA8aDI+U2VsZWN0IGEgU2Vzc2lvbjwvaDI+XG4gICAgICAgICAgPHA+RWFjaCBicm93c2VyIHRhYiBub3cgd29ya3MgYWdhaW5zdCBpdHMgb3duIFVSTC1zY29wZWQgc2Vzc2lvbi48L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1sYW5kaW5nLWFjdGlvbnNcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0blwiIG9uY2xpY2s9XCJjcmVhdGVOZXdTZXNzaW9uSW5OZXdUYWIoKVwiPlx1RkYwQiBOZXcgU2Vzc2lvbiBpbiBOZXcgVGFiPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICAke21lc3NhZ2UgPyBgPHAgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjIwcHg7Y29sb3I6I2I0NTMwOTtmb250LXdlaWdodDo2MDA7XCI+JHtlc2NhcGVIdG1sKG1lc3NhZ2UpfTwvcD5gIDogJyd9XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDoxMnB4O21hcmdpbi1ib3R0b206MjRweDtmbGV4LXdyYXA6d3JhcDtcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG4gcHJpbWFyeVwiIG9uY2xpY2s9XCJjcmVhdGVOZXdTZXNzaW9uQW5kTmF2aWdhdGUoKVwiPisgTmV3IFNlc3Npb248L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgO1xufVxuXG5mdW5jdGlvbiBfcmVzdG9yZVRhYkZvclBoYXNlKHNlc3Npb25QaGFzZSkge1xuICBjb25zdCBwaGFzZVRhYk1hcCA9IHtcbiAgICBbUEhBU0VTLklOSVRdOiAgICAgICAgICAgICAnam9iJyxcbiAgICBbUEhBU0VTLkpPQl9BTkFMWVNJU106ICAgICAnYW5hbHlzaXMnLFxuICAgIFtQSEFTRVMuQ1VTVE9NSVpBVElPTl06ICAgICdleHAtcmV2aWV3JyxcbiAgICBbUEhBU0VTLlJFV1JJVEVfUkVWSUVXXTogICAncmV3cml0ZScsXG4gICAgW1BIQVNFUy5TUEVMTF9DSEVDS106ICAgICAgJ3NwZWxsJyxcbiAgICBbUEhBU0VTLkdFTkVSQVRJT05dOiAgICAgICAnbGF5b3V0JyxcbiAgICBbUEhBU0VTLkxBWU9VVF9SRVZJRVddOiAgICAnbGF5b3V0JyxcbiAgICBbUEhBU0VTLkZJTkFMX0dFTkVSQVRJT05dOiAnZmluYWxfZ2VuZXJhdGUnLFxuICAgIFtQSEFTRVMuUkVGSU5FTUVOVF06ICAgICAgICdkb3dubG9hZCcsXG4gIH07XG4gIGNvbnN0IHRhcmdldFRhYiA9IHBoYXNlVGFiTWFwW3Nlc3Npb25QaGFzZV0gfHwgJ2pvYic7XG5cbiAgaWYgKHR5cGVvZiBzd2l0Y2hUYWIgPT09ICdmdW5jdGlvbicpIHtcbiAgICBzd2l0Y2hUYWIodGFyZ2V0VGFiKTtcbiAgfSBlbHNlIHtcbiAgICBzdGF0ZU1hbmFnZXIuc2V0Q3VycmVudFRhYih0YXJnZXRUYWIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9yZXNvbHZlUmVzdG9yZWRQaGFzZShzdGF0dXNEYXRhKSB7XG4gIGNvbnN0IHBoYXNlID0gc3RhdHVzRGF0YT8ucGhhc2UgfHwgUEhBU0VTLklOSVQ7XG5cbiAgLy8gR3VhcmQ6IG5vIGpvYl9hbmFseXNpcyBtZWFucyB3ZSBjYW5ub3QgYmUgcGFzdCB0aGUgaW5pdGlhbCBpbnB1dCBzdGVwLlxuICBpZiAoIXN0YXR1c0RhdGE/LmpvYl9hbmFseXNpcykge1xuICAgIHJldHVybiBQSEFTRVMuSU5JVDtcbiAgfVxuXG4gIC8vIEd1YXJkOiBwaGFzZSBjbGFpbXMgY3VzdG9taXphdGlvbnMgd2VyZSByZXZpZXdlZCwgYnV0IHRoZXkgd2VyZSBuZXZlclxuICAvLyBnZW5lcmF0ZWQgKGUuZy4gYmFja2VuZCByZXN0YXJ0ZWQgYWZ0ZXIgYW5hbHl6ZV9qb2IgYnV0IGJlZm9yZVxuICAvLyByZWNvbW1lbmRfY3VzdG9taXphdGlvbnMgcmFuLCBvciBsZWdhY3kgc2Vzc2lvbnMgc2F2ZWQgd2l0aCB0aGUgb2xkXG4gIC8vIHByZW1hdHVyZS1DVVNUT01JWkFUSU9OIGJ1ZykuIEZhbGwgYmFjayBzbyB0aGUgdXNlciBzZWVzIHRoZSBBbmFseXNpc1xuICAvLyBzdGVwIGFuZCBjYW4gcnVuIFJlY29tbWVuZCBDdXN0b21pemF0aW9ucyBmcm9tIHRoZXJlLlxuICBpZiAoXG4gICAgKHBoYXNlID09PSBQSEFTRVMuQ1VTVE9NSVpBVElPTiB8fCBwaGFzZSA9PT0gUEhBU0VTLlJFV1JJVEVfUkVWSUVXKVxuICAgICYmICFzdGF0dXNEYXRhPy5jdXN0b21pemF0aW9uc1xuICApIHtcbiAgICByZXR1cm4gUEhBU0VTLkpPQl9BTkFMWVNJUztcbiAgfVxuXG4gIHJldHVybiBwaGFzZTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTZXNzaW9uIGNvbnRleHQgLyByZXN0b3JlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuYXN5bmMgZnVuY3Rpb24gZW5zdXJlU2Vzc2lvbkNvbnRleHQoKSB7XG4gIGNvbnN0IHVybFNlc3Npb25JZCA9IGdldFNlc3Npb25JZEZyb21VUkwoKTtcbiAgaWYgKCF1cmxTZXNzaW9uSWQpIHtcbiAgICBzaG93U2Vzc2lvbnNMYW5kaW5nUGFuZWwoKTtcbiAgICBvcGVuU2Vzc2lvbnNNb2RhbCh7IHJlcXVpcmVkOiB0cnVlIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHN0YXRlTWFuYWdlci5zZXRTZXNzaW9uSWQodXJsU2Vzc2lvbklkKTtcbiAgcmV0dXJuIF9jbGFpbUN1cnJlbnRTZXNzaW9uKHVybFNlc3Npb25JZCk7XG59XG5cbmZ1bmN0aW9uIF9hcHBlbmRSZXN0b3JlZERlY2lzaW9uc1N1bW1hcnkoKSB7XG4gIGNvbnN0IHBoYXNlID0gc3RhdGVNYW5hZ2VyLmdldFBoYXNlKCk7XG4gIGNvbnN0IGN1c3RvbWl6YXRpb25zID0gc3RhdGVNYW5hZ2VyLmdldFRhYkRhdGEoJ2N1c3RvbWl6YXRpb25zJykgfHwgd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnM7XG4gIGNvbnN0IHBhcnRzID0gW107XG5cbiAgaWYgKGN1c3RvbWl6YXRpb25zKSB7XG4gICAgY29uc3QgZXhwQ291bnQgPSAoY3VzdG9taXphdGlvbnMucmVjb21tZW5kZWRfZXhwZXJpZW5jZXMgfHwgW10pLmxlbmd0aDtcbiAgICBpZiAoZXhwQ291bnQgPiAwKSBwYXJ0cy5wdXNoKGAke2V4cENvdW50fSBleHBlcmllbmNlJHtleHBDb3VudCAhPT0gMSA/ICdzJyA6ICcnfSByZWNvbW1lbmRlZGApO1xuICAgIGNvbnN0IHNraWxsQ291bnQgPSAoY3VzdG9taXphdGlvbnMucmVjb21tZW5kZWRfc2tpbGxzIHx8IFtdKS5sZW5ndGg7XG4gICAgaWYgKHNraWxsQ291bnQgPiAwKSBwYXJ0cy5wdXNoKGAke3NraWxsQ291bnR9IHNraWxsJHtza2lsbENvdW50ICE9PSAxID8gJ3MnIDogJyd9IHJlY29tbWVuZGVkYCk7XG4gIH1cblxuICBjb25zdCBkZWNpc2lvbnMgPSB3aW5kb3cuX3NhdmVkRGVjaXNpb25zIHx8IHt9O1xuICBjb25zdCBhcHByb3ZlZFJld3JpdGVzID0gQXJyYXkuaXNBcnJheSh3aW5kb3cuYXBwcm92ZWRSZXdyaXRlcykgPyB3aW5kb3cuYXBwcm92ZWRSZXdyaXRlcy5sZW5ndGhcbiAgICA6IE9iamVjdC5rZXlzKGRlY2lzaW9ucy5leHBlcmllbmNlX2RlY2lzaW9ucyB8fCB7fSkubGVuZ3RoO1xuICBpZiAoYXBwcm92ZWRSZXdyaXRlcyA+IDApIHBhcnRzLnB1c2goYCR7YXBwcm92ZWRSZXdyaXRlc30gcmV3cml0ZSR7YXBwcm92ZWRSZXdyaXRlcyAhPT0gMSA/ICdzJyA6ICcnfSBhcHByb3ZlZGApO1xuXG4gIGNvbnN0IGF0cyA9IHN0YXRlTWFuYWdlci5nZXRBdHNTY29yZSgpO1xuICBpZiAoYXRzICYmIHR5cGVvZiBhdHMub3ZlcmFsbCA9PT0gJ251bWJlcicpIHtcbiAgICBwYXJ0cy5wdXNoKGBBVFMgc2NvcmUgJHtNYXRoLnJvdW5kKGF0cy5vdmVyYWxsKX0lYCk7XG4gIH1cblxuICBpZiAocGFydHMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IHBoYXNlTGFiZWwgPSBTRVNTSU9OX1BIQVNFX0xBQkVMU19TSE9SVFtwaGFzZV0gfHwgU3RyaW5nKHBoYXNlKS5yZXBsYWNlKC9fL2csICcgJyk7XG4gICAgY29uc3QgcG9zaXRpb25DdHggPSB3aW5kb3cuX3Jlc3RvcmVkUG9zaXRpb25OYW1lID8gYCBmb3IgJHt3aW5kb3cuX3Jlc3RvcmVkUG9zaXRpb25OYW1lfWAgOiAnJztcbiAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCBgXHVEODNEXHVEQ0NCIFJlc3RvcmVkJHtwb3NpdGlvbkN0eH0gYXQgc3RhZ2U6ICR7cGhhc2VMYWJlbH0gXHUyMDE0ICR7cGFydHMuam9pbignLCAnKX0uYCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVzdG9yZVNlc3Npb24oKSB7XG4gIHRyeSB7XG4gICAgc3RhdGVNYW5hZ2VyLnNldElzUmVjb25uZWN0aW5nKHRydWUpO1xuXG4gICAgY29uc3Qgc3RvcmVkU2Vzc2lvbklkID0gZ2V0U2Vzc2lvbklkRnJvbVVSTCgpIHx8IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFN0b3JhZ2VLZXlzLlNFU1NJT05fSUQpO1xuICAgIGlmICghc3RvcmVkU2Vzc2lvbklkKSB7XG4gICAgICBzdGF0ZU1hbmFnZXIuc2V0SXNSZWNvbm5lY3RpbmcoZmFsc2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzdGF0ZU1hbmFnZXIuc2V0U2Vzc2lvbklkKHN0b3JlZFNlc3Npb25JZCk7XG5cbiAgICAvLyBUcnkgdG8gcmVzdG9yZSBjb252ZXJzYXRpb24gaGlzdG9yeSBmcm9tIGJhY2tlbmRcbiAgICBjb25zdCBoaXN0b3J5UmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvaGlzdG9yeScpO1xuICAgIGlmIChoaXN0b3J5UmVzLm9rKSB7XG4gICAgICBjb25zdCBoaXN0b3J5RGF0YSA9IGF3YWl0IGhpc3RvcnlSZXMuanNvbigpO1xuXG4gICAgICAvLyBBbHdheXMgY2xlYXIgcGxhY2Vob2xkZXIgSFRNTCBjb250ZW50IG5vdyB0aGF0IHdlIGhhdmUgYSBsaXZlIHNlc3Npb24gcmVzcG9uc2UuXG4gICAgICBjb25zdCBjb252ZXJzYXRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udmVyc2F0aW9uJyk7XG4gICAgICBjb252ZXJzYXRpb24uaW5uZXJIVE1MID0gJyc7XG5cbiAgICAgIC8vIEFsd2F5cyByZXN0b3JlIGZyb20gdGhlIHNlcnZlciBzZXNzaW9uIGZpbGUgKGF1dGhvcml0YXRpdmUgaGlzdG9yeSBzb3VyY2UpLlxuICAgICAgaWYgKGhpc3RvcnlEYXRhLmhpc3RvcnkgJiYgaGlzdG9yeURhdGEuaGlzdG9yeS5sZW5ndGggPiAwKSB7XG5cbiAgICAgICAgaGlzdG9yeURhdGEuaGlzdG9yeS5mb3JFYWNoKG1zZyA9PiB7XG4gICAgICAgICAgaWYgKG1zZy5yb2xlID09PSAndXNlcicpIHtcbiAgICAgICAgICAgIGFwcGVuZE1lc3NhZ2UoJ3VzZXInLCBtc2cuY29udGVudCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChtc2cucm9sZSA9PT0gJ2Fzc2lzdGFudCcpIHtcbiAgICAgICAgICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIG1zZy5jb250ZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsICdcdUQ4M0RcdUREMDQgU2Vzc2lvbiByZXN0b3JlZCBmcm9tIHNlcnZlci4nKTtcbiAgICAgICAgbG9nLmluZm8oYFJlc3RvcmVkICR7aGlzdG9yeURhdGEuaGlzdG9yeS5sZW5ndGh9IG1lc3NhZ2VzIGZyb20gYmFja2VuZGApO1xuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgcGhhc2VcbiAgICAgIGlmIChoaXN0b3J5RGF0YS5waGFzZSkge1xuICAgICAgICBzdGF0ZU1hbmFnZXIuc2V0UGhhc2UoaGlzdG9yeURhdGEucGhhc2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRyeSB0byByZXN0b3JlIGJhY2tlbmQgc3RhdGUuXG4gICAgLy8gUmV0dXJucyB0cnVlIHdoZW4gc2VydmVyIGhhZCBsaXZlIHNlc3Npb24gZGF0YSAoaW4gbWVtb3J5IG9yIGxvYWRlZCBmcm9tIGRpc2spLlxuICAgIGNvbnN0IHNlcnZlckhhc0RhdGEgPSBhd2FpdCByZXN0b3JlQmFja2VuZFN0YXRlKCk7XG5cbiAgICAvLyBSZXN0b3JlIFVJLW9ubHkgcHJlZnMgKGFjdGl2ZVJldmlld1BhbmUpIGZyb20gbG9jYWxTdG9yYWdlLlxuICAgIHJlc3RvcmVUYWJEYXRhKHsgdWlQcmVmc09ubHk6IHNlcnZlckhhc0RhdGEgfSk7XG5cbiAgICAvLyBTaG93IGEgcmVzdG9yZWQtZGVjaXNpb25zIHN1bW1hcnkgd2hlbiB0aGUgYmFja2VuZCBoYWQgbGl2ZSBzZXNzaW9uIGRhdGEuXG4gICAgaWYgKHNlcnZlckhhc0RhdGEpIHtcbiAgICAgIF9hcHBlbmRSZXN0b3JlZERlY2lzaW9uc1N1bW1hcnkoKTtcbiAgICB9XG5cbiAgICBzdGF0ZU1hbmFnZXIuc2V0SXNSZWNvbm5lY3RpbmcoZmFsc2UpO1xuXG4gICAgLy8gUnVuIGEgYmFja2dyb3VuZCBoZWFsdGggY2hlY2sgc28gdGhlIHN0YXR1cyBwaWxsIHJlZmxlY3RzIGxpdmUgY29ubmVjdGl2aXR5LlxuICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcy50ZXN0Q3VycmVudE1vZGVsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBnbG9iYWxUaGlzLnRlc3RDdXJyZW50TW9kZWwoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgfVxuXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nLndhcm4oJ1Nlc3Npb24gcmVzdG9yYXRpb24gZmFpbGVkOicsIGVycm9yKTtcbiAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCBgXHUyNkEwXHVGRTBGIENvdWxkIG5vdCByZXN0b3JlIHByZXZpb3VzIHNlc3Npb24uIFN0YXJ0aW5nIGZyZXNoLiAoJHtlcnJvci5tZXNzYWdlfSlgKTtcbiAgICBzdGF0ZU1hbmFnZXIuc2V0SXNSZWNvbm5lY3RpbmcoZmFsc2UpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9oeWRyYXRlU3RhdHVzRGVyaXZlZFN0YXRlKHN0YXR1c0RhdGEpIHtcbiAgd2luZG93LmFjaGlldmVtZW50RWRpdHMgPSB7fTtcbiAgdHJ5IHtcbiAgICBpZiAoc3RhdHVzRGF0YS5hY2hpZXZlbWVudF9lZGl0cyAmJiBPYmplY3Qua2V5cyhzdGF0dXNEYXRhLmFjaGlldmVtZW50X2VkaXRzKS5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhzdGF0dXNEYXRhLmFjaGlldmVtZW50X2VkaXRzKSkge1xuICAgICAgICBjb25zdCBpZHggPSBwYXJzZUludChrLCAxMCk7XG4gICAgICAgIGNvbnN0IHJhd0l0ZW1zID0gQXJyYXkuaXNBcnJheSh2KSA/IHYgOiBbdl07XG4gICAgICAgIHdpbmRvdy5hY2hpZXZlbWVudEVkaXRzW2lkeF0gPSByYXdJdGVtcy5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgaWYgKGl0ZW0gJiYgdHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGl0ZW0pKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICB0ZXh0OiBTdHJpbmcoaXRlbS50ZXh0ID8/IGl0ZW0uZGVzY3JpcHRpb24gPz8gaXRlbS5jb250ZW50ID8/ICcnKSxcbiAgICAgICAgICAgICAgaGlkZGVuOiBCb29sZWFuKGl0ZW0uaGlkZGVuKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0ZXh0OiBTdHJpbmcoaXRlbSA/PyAnJyksXG4gICAgICAgICAgICBoaWRkZW46IGZhbHNlLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoX2UpIHsgLyogbm9uLWZhdGFsICovIH1cblxuICB3aW5kb3cuX3NhdmVkRGVjaXNpb25zID0ge1xuICAgIGV4cGVyaWVuY2VfZGVjaXNpb25zOiBzdGF0dXNEYXRhLmV4cGVyaWVuY2VfZGVjaXNpb25zIHx8IHt9LFxuICAgIHNraWxsX2RlY2lzaW9uczogICAgICBzdGF0dXNEYXRhLnNraWxsX2RlY2lzaW9ucyAgICAgIHx8IHt9LFxuICAgIGFjaGlldmVtZW50X2RlY2lzaW9uczpzdGF0dXNEYXRhLmFjaGlldmVtZW50X2RlY2lzaW9ucyB8fCB7fSxcbiAgICBwdWJsaWNhdGlvbl9kZWNpc2lvbnM6c3RhdHVzRGF0YS5wdWJsaWNhdGlvbl9kZWNpc2lvbnMgfHwge30sXG4gICAgc3VtbWFyeV9mb2N1c19vdmVycmlkZTogc3RhdHVzRGF0YS5zdW1tYXJ5X2ZvY3VzX292ZXJyaWRlIHx8IG51bGwsXG4gICAgZXh0cmFfc2tpbGxzOiAgICAgICAgICAgc3RhdHVzRGF0YS5leHRyYV9za2lsbHMgfHwgW10sXG4gICAgZXh0cmFfc2tpbGxfbWF0Y2hlczogICAgc3RhdHVzRGF0YS5leHRyYV9za2lsbF9tYXRjaGVzIHx8IHt9LFxuICB9O1xuICB3aW5kb3cuX2FsbEV4cGVyaWVuY2VzID0gc3RhdHVzRGF0YS5hbGxfZXhwZXJpZW5jZXMgfHwgW107XG4gIHdpbmRvdy5zZWxlY3RlZFN1bW1hcnlLZXkgPSBzdGF0dXNEYXRhLnN1bW1hcnlfZm9jdXNfb3ZlcnJpZGUgfHwgc3RhdHVzRGF0YS5zZWxlY3RlZF9zdW1tYXJ5X2tleSB8fCBudWxsO1xuICB3aW5kb3cuX25ld1NraWxsc0Zyb21MTE0gPSBzdGF0dXNEYXRhLm5ld19za2lsbHNfZnJvbV9sbG0gfHwgW107XG4gIHdpbmRvdy5fc3RhdHVzSW50YWtlID0gc3RhdHVzRGF0YS5pbnRha2UgJiYgdHlwZW9mIHN0YXR1c0RhdGEuaW50YWtlID09PSAnb2JqZWN0J1xuICAgID8gc3RhdHVzRGF0YS5pbnRha2VcbiAgICA6IHt9O1xuICB3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zID0gQXJyYXkuaXNBcnJheShzdGF0dXNEYXRhLnBvc3RfYW5hbHlzaXNfcXVlc3Rpb25zKVxuICAgID8gc3RhdHVzRGF0YS5wb3N0X2FuYWx5c2lzX3F1ZXN0aW9uc1xuICAgIDogW107XG4gIHdpbmRvdy5xdWVzdGlvbkFuc3dlcnMgPSAoc3RhdHVzRGF0YS5wb3N0X2FuYWx5c2lzX2Fuc3dlcnMgJiYgdHlwZW9mIHN0YXR1c0RhdGEucG9zdF9hbmFseXNpc19hbnN3ZXJzID09PSAnb2JqZWN0JylcbiAgICA/IHN0YXR1c0RhdGEucG9zdF9hbmFseXNpc19hbnN3ZXJzXG4gICAgOiB7fTtcbiAgd2luZG93Ll9yZXN0b3JlZFBvc2l0aW9uTmFtZSA9IHN0YXR1c0RhdGEucG9zaXRpb25fbmFtZSB8fCBudWxsO1xufVxuXG5mdW5jdGlvbiBfaHlkcmF0ZVN0YXR1c1RhYlN0YXRlKHN0YXR1c0RhdGEpIHtcbiAgY29uc3QgaGFzQW5hbHlzaXMgPSBzdGF0dXNEYXRhLmpvYl9hbmFseXNpcyAhPT0gdW5kZWZpbmVkICYmIHN0YXR1c0RhdGEuam9iX2FuYWx5c2lzICE9PSBudWxsO1xuICBjb25zdCBoYXNDdXN0b21pemF0aW9ucyA9IHN0YXR1c0RhdGEuY3VzdG9taXphdGlvbnMgIT09IHVuZGVmaW5lZCAmJiBzdGF0dXNEYXRhLmN1c3RvbWl6YXRpb25zICE9PSBudWxsO1xuICBjb25zdCBoYXNHZW5lcmF0ZWRGaWxlcyA9IHN0YXR1c0RhdGEuZ2VuZXJhdGVkX2ZpbGVzICE9PSB1bmRlZmluZWQgJiYgc3RhdHVzRGF0YS5nZW5lcmF0ZWRfZmlsZXMgIT09IG51bGw7XG5cbiAgc3RhdGVNYW5hZ2VyLnNldFRhYkRhdGEoJ2FuYWx5c2lzJywgaGFzQW5hbHlzaXMgPyBzdGF0dXNEYXRhLmpvYl9hbmFseXNpcyA6IG51bGwpO1xuICBzdGF0ZU1hbmFnZXIuc2V0VGFiRGF0YSgnY3VzdG9taXphdGlvbnMnLCBoYXNDdXN0b21pemF0aW9ucyA/IHN0YXR1c0RhdGEuY3VzdG9taXphdGlvbnMgOiBudWxsKTtcbiAgc3RhdGVNYW5hZ2VyLnNldFRhYkRhdGEoJ2N2JywgaGFzR2VuZXJhdGVkRmlsZXMgPyBzdGF0dXNEYXRhLmdlbmVyYXRlZF9maWxlcyA6IG51bGwpO1xuICB3aW5kb3cucGVuZGluZ1JlY29tbWVuZGF0aW9ucyA9IGhhc0N1c3RvbWl6YXRpb25zID8gc3RhdHVzRGF0YS5jdXN0b21pemF0aW9ucyA6IG51bGw7XG5cbiAgaWYgKGhhc0FuYWx5c2lzKSB7XG4gICAgcmVmcmVzaEF0c1Njb3JlKCdhbmFseXNpcycpO1xuICB9XG5cbiAgcmV0dXJuIGhhc0FuYWx5c2lzIHx8IGhhc0N1c3RvbWl6YXRpb25zIHx8IGhhc0dlbmVyYXRlZEZpbGVzO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXN0b3JlQmFja2VuZFN0YXRlKCkge1xuICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIHNlcnZlciBoYWQgYW55IGxpdmUgc2Vzc2lvbiBkYXRhLlxuICB0cnkge1xuICAgIGNvbnN0IHN0YXR1c1JlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3N0YXR1cycpO1xuICAgIGlmICghc3RhdHVzUmVzLm9rKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3Qgc3RhdHVzRGF0YSA9IHBhcnNlU3RhdHVzUmVzcG9uc2UoYXdhaXQgc3RhdHVzUmVzLmpzb24oKSk7XG5cbiAgICBpZiAodHlwZW9mIHVwZGF0ZUF1dGhCYWRnZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdXBkYXRlQXV0aEJhZGdlKHN0YXR1c0RhdGEuY29waWxvdF9hdXRoIHx8IHt9LCBzdGF0dXNEYXRhLmxsbV9wcm92aWRlciB8fCBudWxsKTtcbiAgICB9XG5cbiAgICBfaHlkcmF0ZVN0YXR1c0Rlcml2ZWRTdGF0ZShzdGF0dXNEYXRhKTtcblxuICAgIGxldCBzZXJ2ZXJIYXNEYXRhID0gX2h5ZHJhdGVTdGF0dXNUYWJTdGF0ZShzdGF0dXNEYXRhKTtcblxuICAgIGlmIChzdGF0dXNEYXRhLmpvYl9hbmFseXNpcyAhPT0gdW5kZWZpbmVkICYmIHN0YXR1c0RhdGEuam9iX2FuYWx5c2lzICE9PSBudWxsKSB7XG4gICAgICBsb2cuaW5mbygnUmVzdG9yZWQgYW5hbHlzaXMgZGF0YSBmcm9tIGJhY2tlbmQgbWVtb3J5Jyk7XG4gICAgfVxuICAgIGlmIChzdGF0dXNEYXRhLmN1c3RvbWl6YXRpb25zICE9PSB1bmRlZmluZWQgJiYgc3RhdHVzRGF0YS5jdXN0b21pemF0aW9ucyAhPT0gbnVsbCkge1xuICAgICAgbG9nLmluZm8oJ1Jlc3RvcmVkIGN1c3RvbWl6YXRpb25zIGRhdGEgZnJvbSBiYWNrZW5kIG1lbW9yeScpO1xuICAgIH1cbiAgICBpZiAoc3RhdHVzRGF0YS5nZW5lcmF0ZWRfZmlsZXMgIT09IHVuZGVmaW5lZCAmJiBzdGF0dXNEYXRhLmdlbmVyYXRlZF9maWxlcyAhPT0gbnVsbCkge1xuICAgICAgbG9nLmluZm8oJ1Jlc3RvcmVkIENWIGRhdGEgZnJvbSBiYWNrZW5kIG1lbW9yeScpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBnZW5lcmF0aW9uUmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvY3YvZ2VuZXJhdGlvbi1zdGF0ZScpO1xuICAgICAgaWYgKGdlbmVyYXRpb25SZXMub2spIHtcbiAgICAgICAgY29uc3QgZ2VuZXJhdGlvbkRhdGEgPSBhd2FpdCBnZW5lcmF0aW9uUmVzLmpzb24oKTtcbiAgICAgICAgaWYgKGdlbmVyYXRpb25EYXRhPy5vaykge1xuICAgICAgICAgIGNvbnN0IGhhc0NhY2hlZEF0c1Njb3JlID0gQm9vbGVhbihnZW5lcmF0aW9uRGF0YS5hdHNfc2NvcmUpO1xuICAgICAgICAgIGNvbnN0IGhhc1BlcnNpc3RlZEdlbmVyYXRpb25EYXRhID0gQm9vbGVhbihcbiAgICAgICAgICAgIGdlbmVyYXRpb25EYXRhLnByZXZpZXdfYXZhaWxhYmxlXG4gICAgICAgICAgICAgIHx8IGdlbmVyYXRpb25EYXRhLmZpbmFsX2dlbmVyYXRlZF9hdFxuICAgICAgICAgICAgICB8fCBoYXNDYWNoZWRBdHNTY29yZVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBzdGF0ZU1hbmFnZXIuc2V0R2VuZXJhdGlvblN0YXRlKHtcbiAgICAgICAgICAgIHBoYXNlOiBnZW5lcmF0aW9uRGF0YS5waGFzZSB8fCAnaWRsZScsXG4gICAgICAgICAgICBwcmV2aWV3QXZhaWxhYmxlOiBCb29sZWFuKGdlbmVyYXRpb25EYXRhLnByZXZpZXdfYXZhaWxhYmxlKSxcbiAgICAgICAgICAgIHByZXZpZXdPdXRwdXRzOiBnZW5lcmF0aW9uRGF0YS5wcmV2aWV3X291dHB1dHMgfHwgbnVsbCxcbiAgICAgICAgICAgIGxheW91dENvbmZpcm1lZDogQm9vbGVhbihnZW5lcmF0aW9uRGF0YS5sYXlvdXRfY29uZmlybWVkKSxcbiAgICAgICAgICAgIHBhZ2VDb3VudEVzdGltYXRlOiBnZW5lcmF0aW9uRGF0YS5wYWdlX2NvdW50X2VzdGltYXRlID8/IG51bGwsXG4gICAgICAgICAgICBwYWdlQ291bnRFeGFjdDogZ2VuZXJhdGlvbkRhdGEucGFnZV9jb3VudF9leGFjdCA/PyBudWxsLFxuICAgICAgICAgICAgcGFnZUNvdW50Q29uZmlkZW5jZTogZ2VuZXJhdGlvbkRhdGEucGFnZV9jb3VudF9jb25maWRlbmNlID8/IG51bGwsXG4gICAgICAgICAgICBwYWdlQ291bnRTb3VyY2U6IGdlbmVyYXRpb25EYXRhLnBhZ2VfY291bnRfc291cmNlIHx8IG51bGwsXG4gICAgICAgICAgICBwYWdlTmVlZHNFeGFjdFJlY2hlY2s6IEJvb2xlYW4oXG4gICAgICAgICAgICAgIGdlbmVyYXRpb25EYXRhLnBhZ2VfY291bnRfbmVlZHNfZXhhY3RfcmVjaGVjayxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBwYWdlV2FybmluZzogQm9vbGVhbihnZW5lcmF0aW9uRGF0YS5wYWdlX2xlbmd0aF93YXJuaW5nKSxcbiAgICAgICAgICAgIGxheW91dEluc3RydWN0aW9uc0NvdW50OiBnZW5lcmF0aW9uRGF0YS5sYXlvdXRfaW5zdHJ1Y3Rpb25zX2NvdW50IHx8IDAsXG4gICAgICAgICAgICBmaW5hbEdlbmVyYXRlZEF0OiBnZW5lcmF0aW9uRGF0YS5maW5hbF9nZW5lcmF0ZWRfYXQgfHwgbnVsbCxcbiAgICAgICAgICAgIHByZXZpZXdHZW5lcmF0ZWRBdDogZ2VuZXJhdGlvbkRhdGEucHJldmlld19nZW5lcmF0ZWRfYXQgfHwgbnVsbCxcbiAgICAgICAgICAgIHByZXZpZXdSZXF1ZXN0SWQ6IGdlbmVyYXRpb25EYXRhLnByZXZpZXdfcmVxdWVzdF9pZCB8fCBudWxsLFxuICAgICAgICAgICAgY29uZmlybWVkQXQ6IGdlbmVyYXRpb25EYXRhLmNvbmZpcm1lZF9hdCB8fCBudWxsLFxuICAgICAgICAgICAgLy8gT3B0aW9uYWwgc2VydmVyLXByb3ZpZGVkIHJldmlzaW9uIG1ldGFkYXRhIChpZiBiYWNrZW5kIGV4cG9zZXMgdGhlbSlcbiAgICAgICAgICAgIGNvbnRlbnRSZXZpc2lvbjogKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBjb25zdCB2ID0gZ2VuZXJhdGlvbkRhdGEuY29udGVudF9yZXZpc2lvbiA/PyBnZW5lcmF0aW9uRGF0YS5jb250ZW50UmV2aXNpb247XG4gICAgICAgICAgICAgIHJldHVybiAodiA9PT0gdW5kZWZpbmVkIHx8IHYgPT09IG51bGwpID8gMCA6IChOdW1iZXIuaXNGaW5pdGUoTnVtYmVyKHYpKSA/IE51bWJlcih2KSA6IDApO1xuICAgICAgICAgICAgfSkoKSxcbiAgICAgICAgICAgIGxhc3RQcmV2aWV3Q29udGVudFJldmlzaW9uOiBnZW5lcmF0aW9uRGF0YS5sYXN0X3ByZXZpZXdfY29udGVudF9yZXZpc2lvbiA/PyBnZW5lcmF0aW9uRGF0YS5sYXN0UHJldmlld0NvbnRlbnRSZXZpc2lvbiA/PyBudWxsLFxuICAgICAgICAgICAgbGFzdEZpbmFsQ29udGVudFJldmlzaW9uOiBnZW5lcmF0aW9uRGF0YS5sYXN0X2ZpbmFsX2NvbnRlbnRfcmV2aXNpb24gPz8gZ2VuZXJhdGlvbkRhdGEubGFzdEZpbmFsQ29udGVudFJldmlzaW9uID8/IG51bGwsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAoaGFzQ2FjaGVkQXRzU2NvcmUpIHtcbiAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zZXRBdHNTY29yZShnZW5lcmF0aW9uRGF0YS5hdHNfc2NvcmUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdGF0ZU1hbmFnZXIuY2xlYXJBdHNTY29yZSgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChoYXNQZXJzaXN0ZWRHZW5lcmF0aW9uRGF0YSkge1xuICAgICAgICAgICAgc2VydmVySGFzRGF0YSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoX2UpIHsgLyogbm9uLWZhdGFsICovIH1cblxuICAgIGNvbnN0IHJlc3RvcmVkUGhhc2UgPSBfcmVzb2x2ZVJlc3RvcmVkUGhhc2Uoc3RhdHVzRGF0YSk7XG4gICAgc3RhdGVNYW5hZ2VyLnNldFBoYXNlKHJlc3RvcmVkUGhhc2UpO1xuICAgIF9yZXN0b3JlVGFiRm9yUGhhc2UocmVzdG9yZWRQaGFzZSk7XG5cbiAgICAvLyBLZWVwIHRoZSBwb3NpdGlvbi10aXRsZSBlbGVtZW50IGluIHN5bmMgd2hlbmV2ZXIgd2UgcmVzdG9yZSBzdGF0dXMgZGF0YS5cbiAgICBpZiAodHlwZW9mIHVwZGF0ZVBvc2l0aW9uVGl0bGUgPT09ICdmdW5jdGlvbicpIHVwZGF0ZVBvc2l0aW9uVGl0bGUoc3RhdHVzRGF0YSk7XG5cbiAgICBpZiAodHlwZW9mIHVwZGF0ZUluY2x1c2lvbkNvdW50cyA9PT0gJ2Z1bmN0aW9uJykgdXBkYXRlSW5jbHVzaW9uQ291bnRzKCk7XG5cbiAgICBpZiAoIXN0YXR1c0RhdGEucG9zaXRpb25fbmFtZSAmJiAhc3RhdHVzRGF0YS5qb2JfYW5hbHlzaXMpIHtcbiAgICAgIGNvbnN0IHN0b3JlZFBhdGggICAgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShTdG9yYWdlS2V5cy5TRVNTSU9OX1BBVEgpO1xuICAgICAgY29uc3Qgc3RvcmVkU2Vzc2lvbiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFN0b3JhZ2VLZXlzLlNFU1NJT05fSUQpO1xuICAgICAgY29uc3QgY3VycmVudFNlc3Npb24gPSBnZXRTZXNzaW9uSWRGcm9tVVJMID8gZ2V0U2Vzc2lvbklkRnJvbVVSTCgpIDogbnVsbDtcbiAgICAgIC8vIE9ubHkgYXV0by1yZXN0b3JlIGZyb20gZGlzayB3aGVuIHJlY29ubmVjdGluZyB0byB0aGUgU0FNRSBzZXNzaW9uXG4gICAgICAvLyAoc3RvcmVkU2Vzc2lvbiBtYXRjaGVzIHRoZSBjdXJyZW50IFVSTCBzZXNzaW9uX2lkKS4gIEEgZnJlc2ggbmV3IHNlc3Npb25cbiAgICAgIC8vIHdpbGwgaGF2ZSBhIGRpZmZlcmVudCBJRCwgc28gdGhpcyBndWFyZCBwcmV2ZW50cyB0aGUgbmV3IHNlc3Npb24gZnJvbVxuICAgICAgLy8gc2lsZW50bHkgbG9hZGluZyB0aGUgcHJldmlvdXMgc2Vzc2lvbidzIGRhdGEgb2ZmIGRpc2suXG4gICAgICBpZiAoc3RvcmVkUGF0aCAmJiBzdG9yZWRTZXNzaW9uICYmIHN0b3JlZFNlc3Npb24gPT09IGN1cnJlbnRTZXNzaW9uKSB7XG4gICAgICAgIC8vIFBhc3MgcmVkaXJlY3RPbk1pc21hdGNoOmZhbHNlIHNvIHRoYXQgaWYgdGhlIGZpbGUgb24gZGlzayBiZWxvbmdzIHRvIGFcbiAgICAgICAgLy8gZGlmZmVyZW50IHNlc3Npb24gKGUuZy4gU0VTU0lPTl9QQVRIIHdhcyBuZXZlciB1cGRhdGVkIGFmdGVyIGEgbmV3XG4gICAgICAgIC8vIHNlc3Npb24gd2FzIGNyZWF0ZWQpLCB3ZSBzaWxlbnRseSBza2lwIHRoZSByZXN0b3JlIHJhdGhlciB0aGFuXG4gICAgICAgIC8vIG5hdmlnYXRpbmcgdGhlIGJyb3dzZXIgdG8gYSBzZXNzaW9uIHRoZSB1c2VyIGRpZG4ndCBhc2sgZm9yLlxuICAgICAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCBsb2FkU2Vzc2lvbkZpbGUoc3RvcmVkUGF0aCwgeyByZWRpcmVjdE9uTWlzbWF0Y2g6IGZhbHNlIH0pO1xuICAgICAgICBpZiAobG9hZGVkKSByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2VydmVySGFzRGF0YTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cud2FybignRmFpbGVkIHRvIHJlc3RvcmUgYmFja2VuZCBzdGF0ZTonLCBlcnJvcik7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxvYWRTZXNzaW9uRmlsZShwYXRoLCB7IHJlZGlyZWN0T25NaXNtYXRjaCA9IHRydWUgfSA9IHt9KSB7XG4gIHRyeSB7XG4gICAgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgJ1x1RDgzRFx1REQwNCBSZXN0b3Jpbmcgc2Vzc2lvbiBmcm9tIGZpbGUuLi4nKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9sb2FkLXNlc3Npb24nLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBwYXRoIH0pXG4gICAgfSk7XG4gICAgaWYgKCFyZXMub2spIHtcbiAgICAgIGNvbnN0IGVyciA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCBgXHUyNzRDIEZhaWxlZCB0byByZXN0b3JlIHNlc3Npb246ICR7ZXJyLmVycm9yfWApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcblxuICAgIGlmIChkYXRhLnJlZGlyZWN0X3VybCAmJiBnZXRTZXNzaW9uSWRGcm9tVVJMKCkgIT09IGRhdGEuc2Vzc2lvbl9pZCkge1xuICAgICAgaWYgKCFyZWRpcmVjdE9uTWlzbWF0Y2gpIHtcbiAgICAgICAgLy8gVGhlIGZpbGUgb24gZGlzayBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IHNlc3Npb24gdGhhbiB0aGUgb25lIGluIHRoZVxuICAgICAgICAvLyBVUkwuICBTaWxlbnRseSBhYm9ydCByYXRoZXIgdGhhbiByZWRpcmVjdGluZyB0aGUgYnJvd3NlciBcdTIwMTQgdGhlIGNhbGxlclxuICAgICAgICAvLyAocmVzdG9yZUJhY2tlbmRTdGF0ZSkgb25seSB3YW50cyB0byByZXN0b3JlIFRISVMgc2Vzc2lvbiwgbm90IGxvYWQgYVxuICAgICAgICAvLyBkaWZmZXJlbnQgb25lLlxuICAgICAgICBsb2cud2FybihcbiAgICAgICAgICAnbG9hZFNlc3Npb25GaWxlOiBzZXNzaW9uX2lkIG1pc21hdGNoICh1cmw9JXMsIGZpbGU9JXMpOyBza2lwcGluZyByZXN0b3JlJyxcbiAgICAgICAgICBnZXRTZXNzaW9uSWRGcm9tVVJMKCksIGRhdGEuc2Vzc2lvbl9pZCxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihkYXRhLnJlZGlyZWN0X3VybCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShTdG9yYWdlS2V5cy5TRVNTSU9OX1BBVEgsIGRhdGEuc2Vzc2lvbl9maWxlIHx8IHBhdGgpO1xuXG4gICAgLy8gUmVzZXQgc2Vzc2lvbi1zY29wZWQgc3VnZ2VzdGlvbiBzdGF0ZVxuICAgIHdpbmRvdy5fc3VnZ2VzdGVkQWNoc09yZGVyZWQgPSBudWxsO1xuXG4gICAgLy8gUmVsb2FkIGNvbnZlcnNhdGlvbiBoaXN0b3J5IGZyb20gdGhlIGZyZXNobHktbG9hZGVkIGJhY2tlbmRcbiAgICBjb25zdCBoaXN0b3J5UmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvaGlzdG9yeScpO1xuICAgIGlmIChoaXN0b3J5UmVzLm9rKSB7XG4gICAgICBjb25zdCBoaXN0b3J5RGF0YSA9IGF3YWl0IGhpc3RvcnlSZXMuanNvbigpO1xuICAgICAgY29uc3QgY29udiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb252ZXJzYXRpb24nKTtcbiAgICAgIGNvbnYuaW5uZXJIVE1MID0gJyc7XG4gICAgICAoaGlzdG9yeURhdGEuaGlzdG9yeSB8fCBbXSkuZm9yRWFjaChtc2cgPT4ge1xuICAgICAgICBpZiAobXNnLnJvbGUgIT09ICdzeXN0ZW0nKSBhcHBlbmRNZXNzYWdlKG1zZy5yb2xlLCBtc2cuY29udGVudCk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgJ1x1MjZBMCBDb3VsZCBub3QgcmVzdG9yZSBjb252ZXJzYXRpb24gaGlzdG9yeS4nKTtcbiAgICB9XG5cbiAgICBhd2FpdCBmZXRjaFN0YXR1cygpO1xuXG4gICAgLy8gUnVuIGEgYmFja2dyb3VuZCBoZWFsdGggY2hlY2sgc28gdGhlIHN0YXR1cyBwaWxsIHJlZmxlY3RzIGxpdmUgY29ubmVjdGl2aXR5LlxuICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcy50ZXN0Q3VycmVudE1vZGVsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBnbG9iYWxUaGlzLnRlc3RDdXJyZW50TW9kZWwoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgfVxuXG4gICAgLy8gUmVoeWRyYXRlIHRhYkRhdGEgYW5kIHN3aXRjaCB0byB0aGUgY29ycmVjdCB0YWIgZm9yIHRoZSByZXN0b3JlZCBwaGFzZVxuICAgIGNvbnN0IHNlc3Npb25QaGFzZSA9IGRhdGEucGhhc2UgfHwgUEhBU0VTLklOSVQ7XG4gICAgY29uc3QgcGhhc2VUYWJNYXAgPSB7XG4gICAgICBbUEhBU0VTLklOSVRdOiAgICAgICAgICAgICAnam9iJyxcbiAgICAgIFtQSEFTRVMuSk9CX0FOQUxZU0lTXTogICAgICdhbmFseXNpcycsXG4gICAgICBbUEhBU0VTLkNVU1RPTUlaQVRJT05dOiAgICAnZXhwLXJldmlldycsXG4gICAgICBbUEhBU0VTLlJFV1JJVEVfUkVWSUVXXTogICAncmV3cml0ZScsXG4gICAgICBbUEhBU0VTLlNQRUxMX0NIRUNLXTogICAgICAnc3BlbGwnLFxuICAgICAgW1BIQVNFUy5HRU5FUkFUSU9OXTogICAgICAgJ2xheW91dCcsXG4gICAgICBbUEhBU0VTLkxBWU9VVF9SRVZJRVddOiAgICAnbGF5b3V0JyxcbiAgICAgIFtQSEFTRVMuRklOQUxfR0VORVJBVElPTl06ICdmaW5hbF9nZW5lcmF0ZScsXG4gICAgICBbUEhBU0VTLlJFRklORU1FTlRdOiAgICAgICAnZG93bmxvYWQnLFxuICAgIH07XG4gICAgY29uc3QgdGFyZ2V0VGFiID0gcGhhc2VUYWJNYXBbc2Vzc2lvblBoYXNlXSB8fCAnam9iJztcblxuICAgIGNvbnN0IGN1c3RvbWl6YXRpb25QaGFzZXMgPSBbXG4gICAgICBQSEFTRVMuQ1VTVE9NSVpBVElPTiwgUEhBU0VTLlJFV1JJVEVfUkVWSUVXLCBQSEFTRVMuU1BFTExfQ0hFQ0ssXG4gICAgICBQSEFTRVMuR0VORVJBVElPTiwgUEhBU0VTLkxBWU9VVF9SRVZJRVcsIFBIQVNFUy5GSU5BTF9HRU5FUkFUSU9OLCBQSEFTRVMuUkVGSU5FTUVOVCxcbiAgICBdO1xuICAgIGlmIChjdXN0b21pemF0aW9uUGhhc2VzLmluY2x1ZGVzKHNlc3Npb25QaGFzZSkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHMyID0gYXdhaXQgZmV0Y2goJy9hcGkvc3RhdHVzJyk7XG4gICAgICAgIGNvbnN0IHNkID0gcGFyc2VTdGF0dXNSZXNwb25zZShhd2FpdCBzMi5qc29uKCkpO1xuICAgICAgICBfaHlkcmF0ZVN0YXR1c0Rlcml2ZWRTdGF0ZShzZCk7XG4gICAgICAgIF9oeWRyYXRlU3RhdHVzVGFiU3RhdGUoc2QpO1xuICAgICAgfSBjYXRjaCAoXykgeyAvKiBub24tZmF0YWwgKi8gfVxuICAgIH1cblxuICAgIC8vIEZvciByZXdyaXRlX3JldmlldyBwaGFzZSwgcHJlLXBvcHVsYXRlIHRoZSByZXdyaXRlIHBhbmVsIGNhY2hlXG4gICAgaWYgKHNlc3Npb25QaGFzZSA9PT0gUEhBU0VTLlJFV1JJVEVfUkVWSUVXKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByciA9IGF3YWl0IGZldGNoKCcvYXBpL3Jld3JpdGVzJyk7XG4gICAgICAgIGlmIChyci5vaykge1xuICAgICAgICAgIGNvbnN0IHJkID0gcGFyc2VSZXdyaXRlc1Jlc3BvbnNlKGF3YWl0IHJyLmpzb24oKSk7XG4gICAgICAgICAgY29uc3QgcmV3cml0ZXMgPSByZC5yZXdyaXRlcyB8fCBbXTtcbiAgICAgICAgICBjb25zdCB3YXJuaW5ncyA9IHJkLnBlcnN1YXNpb25fd2FybmluZ3MgfHwgW107XG4gICAgICAgICAgcmV3cml0ZURlY2lzaW9ucyA9IHt9O1xuICAgICAgICAgIHJlbmRlclJld3JpdGVQYW5lbChyZXdyaXRlcywgd2FybmluZ3MpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChfKSB7IC8qIG5vbi1mYXRhbCAqLyB9XG4gICAgfVxuXG4gICAgc3dpdGNoVGFiKHRhcmdldFRhYik7XG4gICAgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgYFx1MjcwNSBTZXNzaW9uIHJlc3RvcmVkOiAke2RhdGEucG9zaXRpb25fbmFtZSB8fCAnVW5uYW1lZCd9ICgke1NFU1NJT05fUEhBU0VfTEFCRUxTW2RhdGEucGhhc2VdIHx8IFN0cmluZyhkYXRhLnBoYXNlIHx8IFBIQVNFUy5JTklUKS5yZXBsYWNlKC9fL2csICcgJyl9KWApO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCBgXHUyNzRDIEVycm9yIHJlc3RvcmluZyBzZXNzaW9uOiAke2Vyci5tZXNzYWdlfWApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFJlbmFtZSAvIHRhYiBkYXRhIHBlcnNpc3RlbmNlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuYXN5bmMgZnVuY3Rpb24gcHJvbXB0UmVuYW1lQ3VycmVudFNlc3Npb24oKSB7XG4gIGNvbnN0IHRpdGxlRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncG9zaXRpb24tdGl0bGUnKTtcbiAgY29uc3QgcmVuYW1lQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlbmFtZS1zZXNzaW9uLWJ0bicpO1xuICBjb25zdCBjdXJyZW50ID0gKHRpdGxlRWw/LnRleHRDb250ZW50IHx8ICcnKS50cmltKCk7XG5cbiAgLy8gQnVpbGQgaW5saW5lIGlucHV0IHdpZGdldCBzbyB3ZSBuZXZlciBjYWxsIHdpbmRvdy5wcm9tcHQoKVxuICBjb25zdCB3cmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICB3cmFwcGVyLnN0eWxlLmNzc1RleHQgPSAnZGlzcGxheTppbmxpbmUtZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjRweDsnO1xuICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gIGlucHV0LnR5cGUgPSAndGV4dCc7XG4gIGlucHV0LnZhbHVlID0gY3VycmVudDtcbiAgaW5wdXQuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgJ05ldyBzZXNzaW9uIG5hbWUnKTtcbiAgaW5wdXQuc3R5bGUuY3NzVGV4dCA9ICdmb250LXNpemU6aW5oZXJpdDtwYWRkaW5nOjFweCA0cHg7Ym9yZGVyOjFweCBzb2xpZCAjOTRhM2I4O2JvcmRlci1yYWRpdXM6M3B4O3dpZHRoOjIyMHB4Oyc7XG4gIGNvbnN0IG9rQnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gIG9rQnRuLnRleHRDb250ZW50ID0gJ1x1MjcxMyc7XG4gIG9rQnRuLnRpdGxlID0gJ1NhdmUgcmVuYW1lJztcbiAgb2tCdG4uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgJ1NhdmUgcmVuYW1lJyk7XG4gIG9rQnRuLnN0eWxlLmNzc1RleHQgPSAnYmFja2dyb3VuZDojMTBiOTgxO2NvbG9yOiNmZmY7Ym9yZGVyOm5vbmU7Ym9yZGVyLXJhZGl1czozcHg7Y3Vyc29yOnBvaW50ZXI7cGFkZGluZzoxcHggNnB4O2ZvbnQtc2l6ZToxZW07JztcbiAgY29uc3QgY2FuY2VsQnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gIGNhbmNlbEJ0bi50ZXh0Q29udGVudCA9ICdcdTI3MTUnO1xuICBjYW5jZWxCdG4udGl0bGUgPSAnQ2FuY2VsIHJlbmFtZSc7XG4gIGNhbmNlbEJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnQ2FuY2VsIHJlbmFtZScpO1xuICBjYW5jZWxCdG4uc3R5bGUuY3NzVGV4dCA9ICdiYWNrZ3JvdW5kOiM2YjcyODA7Y29sb3I6I2ZmZjtib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjNweDtjdXJzb3I6cG9pbnRlcjtwYWRkaW5nOjFweCA2cHg7Zm9udC1zaXplOjFlbTsnO1xuICB3cmFwcGVyLmFwcGVuZChpbnB1dCwgb2tCdG4sIGNhbmNlbEJ0bik7XG5cbiAgaWYgKHRpdGxlRWwpIHRpdGxlRWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgaWYgKHJlbmFtZUJ0bikgcmVuYW1lQnRuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHRpdGxlRWw/LnBhcmVudEVsZW1lbnQ/Lmluc2VydEJlZm9yZSh3cmFwcGVyLCB0aXRsZUVsKTtcbiAgaW5wdXQuZm9jdXMoKTtcbiAgaW5wdXQuc2VsZWN0KCk7XG5cbiAgYXN5bmMgZnVuY3Rpb24gZG9SZW5hbWUoKSB7XG4gICAgY29uc3QgbmV3TmFtZSA9IGlucHV0LnZhbHVlLnRyaW0oKTtcbiAgICBjbGVhbnVwKCk7XG4gICAgaWYgKCFuZXdOYW1lIHx8IG5ld05hbWUgPT09IGN1cnJlbnQpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL3JlbmFtZS1jdXJyZW50LXNlc3Npb24nLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBuZXdfbmFtZTogbmV3TmFtZSB9KSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5vaykgYXdhaXQgZmV0Y2hTdGF0dXMoKTtcbiAgICAgIGVsc2UgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHNob3dUb2FzdChgUmVuYW1lIGZhaWxlZDogJHtkYXRhLmVycm9yfWAsICdlcnJvcicpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmICh0eXBlb2Ygc2hvd1RvYXN0ID09PSAnZnVuY3Rpb24nKSBzaG93VG9hc3QoYFJlbmFtZSBlcnJvcjogJHtlLm1lc3NhZ2V9YCwgJ2Vycm9yJyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY2xlYW51cCgpIHtcbiAgICB3cmFwcGVyLnJlbW92ZSgpO1xuICAgIGlmICh0aXRsZUVsKSB0aXRsZUVsLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICBpZiAocmVuYW1lQnRuKSByZW5hbWVCdG4uc3R5bGUuZGlzcGxheSA9ICcnO1xuICB9XG5cbiAgb2tCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBkb1JlbmFtZSk7XG4gIGNhbmNlbEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNsZWFudXApO1xuICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZSA9PiB7XG4gICAgaWYgKGUua2V5ID09PSAnRW50ZXInKSBkb1JlbmFtZSgpO1xuICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIGNsZWFudXAoKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHNhdmVUYWJEYXRhKCkge1xuICB0cnkge1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGdldFNjb3BlZFRhYkRhdGFTdG9yYWdlS2V5KHN0YXRlTWFuYWdlci5nZXRTZXNzaW9uSWQoKSksIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIHRhYkRhdGE6IHN0YXRlTWFuYWdlci5nZXRBbGxUYWJEYXRhKCksXG4gICAgICBjdXJyZW50VGFiOiBzdGF0ZU1hbmFnZXIuZ2V0Q3VycmVudFRhYigpLFxuICAgICAgcGVuZGluZ1JlY29tbWVuZGF0aW9uczogd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnMgfHwgbnVsbCxcbiAgICAgIGludGVyYWN0aXZlU3RhdGU6IHN0YXRlTWFuYWdlci5nZXRJbnRlcmFjdGl2ZVN0YXRlKCksXG4gICAgICBhY3RpdmVSZXZpZXdQYW5lOiB3aW5kb3cuX2FjdGl2ZVJldmlld1BhbmUgfHwgJ2V4cGVyaWVuY2VzJyxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKVxuICAgIH0pKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cud2FybignRmFpbGVkIHRvIHNhdmUgdGFiIGRhdGE6JywgZXJyb3IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc3RvcmVUYWJEYXRhKHsgdWlQcmVmc09ubHkgPSBmYWxzZSB9ID0ge30pIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzYXZlZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGdldFNjb3BlZFRhYkRhdGFTdG9yYWdlS2V5KHN0YXRlTWFuYWdlci5nZXRTZXNzaW9uSWQoKSkpO1xuICAgIGlmIChzYXZlZCkge1xuICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2Uoc2F2ZWQpO1xuXG4gICAgICBjb25zdCBhZ2UgPSBEYXRlLm5vdygpIC0gKGRhdGEudGltZXN0YW1wIHx8IDApO1xuICAgICAgaWYgKGFnZSA8IDI0ICogNjAgKiA2MCAqIDEwMDApIHtcbiAgICAgICAgaWYgKCF1aVByZWZzT25seSkge1xuICAgICAgICAgIGlmIChkYXRhLnRhYkRhdGEpIHtcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGRhdGEudGFiRGF0YSkuZm9yRWFjaCgoW3RhYiwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zZXRUYWJEYXRhKHRhYiwgdmFsdWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChkYXRhLnBlbmRpbmdSZWNvbW1lbmRhdGlvbnMpIHtcbiAgICAgICAgICAgIHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zID0gZGF0YS5wZW5kaW5nUmVjb21tZW5kYXRpb25zO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZGF0YS5pbnRlcmFjdGl2ZVN0YXRlKSB7XG4gICAgICAgICAgICBzdGF0ZU1hbmFnZXIuc2V0SW50ZXJhY3RpdmVTdGF0ZShkYXRhLmludGVyYWN0aXZlU3RhdGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YS5hY3RpdmVSZXZpZXdQYW5lKSB7XG4gICAgICAgICAgd2luZG93Ll9hY3RpdmVSZXZpZXdQYW5lID0gZGF0YS5hY3RpdmVSZXZpZXdQYW5lO1xuICAgICAgICB9XG5cbiAgICAgICAgbG9nLmluZm8oYFJlc3RvcmVkIHRhYiBkYXRhIGZyb20gbG9jYWxTdG9yYWdlICh1aVByZWZzT25seT0ke3VpUHJlZnNPbmx5fSlgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGdldFNjb3BlZFRhYkRhdGFTdG9yYWdlS2V5KHN0YXRlTWFuYWdlci5nZXRTZXNzaW9uSWQoKSkpO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cud2FybignRmFpbGVkIHRvIHJlc3RvcmUgdGFiIGRhdGE6JywgZXJyb3IpO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFUyBtb2R1bGUgZXhwb3J0cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmV4cG9ydCB7XG4gIGZvcm1hdFNlc3Npb25QaGFzZUxhYmVsLFxuICBfZ2V0Q3VycmVudFNlc3Npb25JZFZhbHVlLFxuICBfZ2V0Q3VycmVudE93bmVyVG9rZW5WYWx1ZSxcbiAgYnVpbGRTZXNzaW9uU3dpdGNoZXJMYWJlbCxcbiAgZ2V0QWN0aXZlU2Vzc2lvbk93bmVyc2hpcE1ldGEsXG4gIGZvcm1hdFNlc3Npb25UaW1lc3RhbXAsXG4gIGNyZWF0ZU5ld1Nlc3Npb25BbmROYXZpZ2F0ZSxcbiAgY3JlYXRlTmV3U2Vzc2lvbkluTmV3VGFiLFxuICBvbmJvYXJkaW5nQ3JlYXRlRW1wdHlQcm9maWxlLFxuICBzaG93T25ib2FyZGluZ01vZGFsLFxuICBtYXliZVNob3dXZWxjb21lTW9kYWwsXG4gIHNob3dXZWxjb21lTW9kYWwsXG4gIGNsb3NlV2VsY29tZU1vZGFsLFxuICBfY2xhaW1DdXJyZW50U2Vzc2lvbixcbiAgX3Jlc29sdmVSZXN0b3JlZFBoYXNlLFxuICBzaG93U2Vzc2lvbnNMYW5kaW5nUGFuZWwsXG4gIGVuc3VyZVNlc3Npb25Db250ZXh0LFxuICByZXN0b3JlU2Vzc2lvbixcbiAgcmVzdG9yZUJhY2tlbmRTdGF0ZSxcbiAgbG9hZFNlc3Npb25GaWxlLFxuICBwcm9tcHRSZW5hbWVDdXJyZW50U2Vzc2lvbixcbiAgc2F2ZVRhYkRhdGEsXG4gIHJlc3RvcmVUYWJEYXRhLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL2pvYi1pbnB1dC5qc1xuICogSm9iIGRlc2NyaXB0aW9uIGlucHV0IHBhbmVsOiBwYXN0ZSwgVVJMIGZldGNoLCBmaWxlIHVwbG9hZCwgbG9hZC1pdGVtcyB0YWJsZS5cbiAqXG4gKiBERVBFTkRFTkNJRVMgKGFsbCBvbiBnbG9iYWxUaGlzIGF0IHJ1bnRpbWUpOlxuICogICAtIG1hcmtlZCwgZG9tcHVyaWZ5IChucG0gXHUyMDE0IGJ1bmRsZWQ7IHVzZWQgaW50ZXJuYWxseSBmb3Igc2FmZSBtYXJrZG93biByZW5kZXJpbmcpXG4gKiAgIC0gZXNjYXBlSHRtbCAodXRpbHMuanMpXG4gKiAgIC0gYXBwZW5kTWVzc2FnZSwgYXBwZW5kUmV0cnlNZXNzYWdlIChtZXNzYWdlLXF1ZXVlLmpzKVxuICogICAtIHNldExvYWRpbmcgKGZldGNoLXV0aWxzLmpzKVxuICogICAtIHNhdmVUYWJEYXRhIChzZXNzaW9uLW1hbmFnZXIuanMpXG4gKiAgIC0gc3dpdGNoVGFiIChyZXZpZXctdGFibGUtYmFzZS5qcywgVGllciA0KVxuICogICAtIGFuYWx5emVKb2IgKGpvYi1hbmFseXNpcy5qcylcbiAqICAgLSBmZXRjaFN0YXR1cyAoYXBpLWNsaWVudC5qcylcbiAqICAgLSBzaG93QWxlcnRNb2RhbCAodWktaGVscGVycy5qcylcbiAqICAgLSBzdGF0ZU1hbmFnZXIgKHN0YXRlLW1hbmFnZXIuanMgXHUyMDE0IGdldEN1cnJlbnRUYWIoKS9zZXRUYWJEYXRhKCkpXG4gKiAgIC0gUEhBU0VTICh3aW5kb3cgZ2xvYmFsKVxuICpcbiAqIEdBUC0yMyBpbnRha2UgY29uZmlybWF0aW9uOlxuICogICBBbGwgam9iLXRleHQgc3VibWlzc2lvbnMgKHBhc3RlLCBVUkwsIGZpbGUpIHJvdXRlIGRpcmVjdGx5IHRvIGFuYWx5emVKb2IoKVxuICogICBzbyBldmVyeSBzb3VyY2UgZm9sbG93cyB0aGUgc2FtZSBwb3N0LWFuYWx5c2lzIGludGFrZSBwYXRoLlxuICovXG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmNvbnN0IGxvZyA9IGdldExvZ2dlcignam9iLWlucHV0Jyk7XG5cbmltcG9ydCB7IFBIQVNFUywgc3RhdGVNYW5hZ2VyIH0gZnJvbSAnLi9zdGF0ZS1tYW5hZ2VyLmpzJztcbmltcG9ydCB7IG1hcmtlZCB9IGZyb20gJ21hcmtlZCc7XG5pbXBvcnQgRE9NUHVyaWZ5IGZyb20gJ2RvbXB1cmlmeSc7XG5cbi8vIFJlbmRlciBqb2IgZGVzY3JpcHRpb24gdGV4dCBzYWZlbHk6IG1hcmtlZCBwYXJzZXMgR0ZNIChpbmNsdWRpbmcgZW1iZWRkZWQgSFRNTFxuLy8gYW5kIGF1dG9saW5rcyksIERPTVB1cmlmeSBzYW5pdGl6ZXMgdGhlIG91dHB1dCBiZWZvcmUgd3JpdGluZyB0byBpbm5lckhUTUwuXG4vLyBGT1JCSURfQVRUUjogWydzdHlsZSddIHN0cmlwcyBpbmxpbmUgQ1NTIGZyb20gSFRNTCBlbWJlZGRlZCBpbiB0aGUgam9iIHRleHRcbi8vIChlLmcuIFdvcmQtc3R5bGUgZm9udC1zaXplL2ZvbnQtZmFtaWx5IGZyb20gSlNPTi1MRCBkZXNjcmlwdGlvbiBmaWVsZHMpLFxuLy8gc28gdGhlIHBhZ2UncyBvd24gc3R5bGVzaGVldCBjb250cm9scyBmb250IHJlbmRlcmluZyBjb25zaXN0ZW50bHkuXG5mdW5jdGlvbiBfcmVuZGVySm9iVGV4dCh0ZXh0KSB7XG4gIGNvbnN0IHJhdyA9IG1hcmtlZC5wYXJzZSh0ZXh0LCB7IGdmbTogdHJ1ZSwgYnJlYWtzOiB0cnVlIH0pO1xuICByZXR1cm4gRE9NUHVyaWZ5LnNhbml0aXplKHJhdywgeyBGT1JCSURfQVRUUjogWydzdHlsZSddIH0pO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEpvYiB0YWIgZGlzcGxheVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmFzeW5jIGZ1bmN0aW9uIHBvcHVsYXRlSm9iVGFiKCkge1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9zdGF0dXMnKTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcblxuICAgIGlmIChkYXRhLmpvYl9kZXNjcmlwdGlvbl90ZXh0KSB7XG4gICAgICBjb25zdCBqb2JUZXh0ID0gZGF0YS5qb2JfZGVzY3JpcHRpb25fdGV4dDtcbiAgICAgIGNvbnN0IHBvc2l0aW9uTmFtZSA9IGRhdGEucG9zaXRpb25fbmFtZSB8fCBudWxsO1xuICAgICAgY29uc3Qgam9iVXJsID0gZGF0YS5qb2JfdXJsIHx8IG51bGw7XG4gICAgICBjb25zdCB0aXRsZVRleHQgPSBwb3NpdGlvbk5hbWVcbiAgICAgICAgPyBlc2NhcGVIdG1sKHBvc2l0aW9uTmFtZSlcbiAgICAgICAgOiAnPGVtIHN0eWxlPVwiY29sb3I6IzljYTNhZjtcIj5Qb3NpdGlvbiB0aXRsZSBub3QgeWV0IGV4dHJhY3RlZFx1MjAyNjwvZW0+JztcbiAgICAgIGNvbnN0IHRpdGxlQ29udGVudCA9IChwb3NpdGlvbk5hbWUgJiYgam9iVXJsKVxuICAgICAgICA/IGA8YSBocmVmPVwiJHtlc2NhcGVIdG1sKGpvYlVybCl9XCIgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiIHN0eWxlPVwiY29sb3I6aW5oZXJpdDt0ZXh0LWRlY29yYXRpb246bm9uZTtcIj4ke3RpdGxlVGV4dH08L2E+YFxuICAgICAgICA6IHRpdGxlVGV4dDtcbiAgICAgIGxldCBodG1sID0gJzxoMT4nICsgdGl0bGVDb250ZW50ICsgJzwvaDE+JztcbiAgICAgIGlmIChqb2JVcmwpIHtcbiAgICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cIm1heC13aWR0aDoxMDAlO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3doaXRlLXNwYWNlOm5vd3JhcDtjb2xvcjojNjQ3NDhiO2ZvbnQtc2l6ZTowLjg1ZW07bWFyZ2luOi04cHggMCA4cHggMDtcIiB0aXRsZT1cIiR7ZXNjYXBlSHRtbChqb2JVcmwpfVwiPjxhIGhyZWY9XCIke2VzY2FwZUh0bWwoam9iVXJsKX1cIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCIgc3R5bGU9XCJjb2xvcjojM2I4MmY2O3RleHQtZGVjb3JhdGlvbjpub25lO1wiPiR7ZXNjYXBlSHRtbChqb2JVcmwpfTwvYT48L2Rpdj5gO1xuICAgICAgfVxuXG4gICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwibGluZS1oZWlnaHQ6IDEuNjsgYmFja2dyb3VuZDogI2Y4ZjlmYTsgcGFkZGluZzogMjBweDsgYm9yZGVyLXJhZGl1czogOHB4OyBtYXJnaW46IDIwcHggMDtcIj4nICsgX3JlbmRlckpvYlRleHQoam9iVGV4dCkgKyAnPC9kaXY+JztcblxuICAgICAgY29uc3QgYW5hbHl6ZUJ0biA9IGRhdGEucGhhc2UgPT09IFBIQVNFUy5JTklUXG4gICAgICAgID8gJzxidXR0b24gb25jbGljaz1cImFuYWx5emVKb2IoKVwiIGNsYXNzPVwiYnRuLXByaW1hcnlcIiBzdHlsZT1cIm1hcmdpbi1yaWdodDo4cHg7XCI+XHVEODNEXHVERDBEIEFuYWx5c2UgSm9iPC9idXR0b24+J1xuICAgICAgICA6ICcnO1xuICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6MjBweDtcIj4nICsgYW5hbHl6ZUJ0biArICc8YnV0dG9uIG9uY2xpY2s9XCJzaG93TG9hZEpvYlBhbmVsKClcIiBjbGFzcz1cImJ0bi1zZWNvbmRhcnlcIj5cdUQ4M0RcdURDRTUgTG9hZCBEaWZmZXJlbnQgSm9iPC9idXR0b24+PC9kaXY+JztcbiAgICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gaHRtbDtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgc2hvd0xvYWRKb2JQYW5lbCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cuZXJyb3IoJ0Vycm9yIGxvYWRpbmcgam9iIGRlc2NyaXB0aW9uOicsIGVycm9yKTtcbiAgICBhd2FpdCBzaG93TG9hZEpvYlBhbmVsKCk7XG4gIH1cbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBMb2FkLWpvYiBwYW5lbCAoc2Vzc2lvbnMgKyBzZXJ2ZXIgZmlsZXMgdGFibGUgKyBpbnB1dCBtZXRob2RzKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmFzeW5jIGZ1bmN0aW9uIHNob3dMb2FkSm9iUGFuZWwoKSB7XG4gIGlmIChzdGF0ZU1hbmFnZXIuZ2V0Q3VycmVudFRhYigpICE9PSAnam9iJykge1xuICAgIHN3aXRjaFRhYignam9iJyk7XG4gIH1cblxuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgY29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImVtcHR5LXN0YXRlXCI+PGRpdiBjbGFzcz1cImxvYWRpbmctc3Bpbm5lclwiPjwvZGl2PjxwIHN0eWxlPVwibWFyZ2luLXRvcDoxMnB4O2NvbG9yOiM2NDc0OGI7XCI+TG9hZGluZ1x1MjAyNjwvcD48L2Rpdj4nO1xuXG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgc3R5bGU9XCJtYXgtd2lkdGg6ODIwcHg7bWFyZ2luOjAgYXV0bztwYWRkaW5nOjI0cHg7XCI+XG4gICAgICA8aDEgc3R5bGU9XCJmb250LXNpemU6MjJweDtmb250LXdlaWdodDo3MDA7Y29sb3I6IzFlMjkzYjttYXJnaW4tYm90dG9tOjZweDtcIj5cdUQ4M0RcdURDRTUgQWRkIEpvYiBEZXNjcmlwdGlvbjwvaDE+XG5cbiAgICAgIDxkaXYgc3R5bGU9XCJib3JkZXI6MXB4IHNvbGlkICNlMmU4ZjA7Ym9yZGVyLXJhZGl1czo4cHg7b3ZlcmZsb3c6dmlzaWJsZTtcIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2Y4ZmFmYztwYWRkaW5nOjEwcHggMTZweDtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZTJlOGYwO2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTNweDtjb2xvcjojNDc1NTY5O1wiPkFkZCBOZXcgSm9iIERlc2NyaXB0aW9uPC9kaXY+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nOjIwcHg7XCI+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtbWV0aG9kLXRhYnNcIiBzdHlsZT1cIm1hcmdpbi10b3A6MDtcIj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpbnB1dC10YWIgYWN0aXZlXCIgb25jbGljaz1cInN3aXRjaElucHV0TWV0aG9kKCdwYXN0ZScpXCI+XHVEODNEXHVEQ0REIFBhc3RlIFRleHQ8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpbnB1dC10YWJcIiBvbmNsaWNrPVwic3dpdGNoSW5wdXRNZXRob2QoJ3VybCcpXCI+XHVEODNEXHVERDE3IEZyb20gVVJMPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaW5wdXQtdGFiXCIgb25jbGljaz1cInN3aXRjaElucHV0TWV0aG9kKCdmaWxlJylcIj5cdUQ4M0RcdURDQzEgVXBsb2FkIEZpbGU8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1tZXRob2QgYWN0aXZlXCIgaWQ9XCJwYXN0ZS1tZXRob2RcIj5cbiAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD1cImpvYi10ZXh0LWlucHV0XCIgcGxhY2Vob2xkZXI9XCJQYXN0ZSB0aGUgam9iIGRlc2NyaXB0aW9uIGhlcmVcdTIwMjZcIiByb3dzPVwiMTJcIlxuICAgICAgICAgICAgICBhcmlhLXJlcXVpcmVkPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIGFyaWEtZGVzY3JpYmVkYnk9XCJwYXN0ZS1jaGFyLWNvdW50IHBhc3RlLWVycm9yXCJcbiAgICAgICAgICAgICAgb25ibHVyPVwiX3ZhbGlkYXRlUGFzdGVGaWVsZCgpXCIgb25pbnB1dD1cIl91cGRhdGVQYXN0ZUNoYXJDb3VudCgpXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDoxMDAlO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOjE0cHg7cGFkZGluZzoxMnB4O2JvcmRlcjoxcHggc29saWQgI2QxZDVkYjtib3JkZXItcmFkaXVzOjZweDtyZXNpemU6dmVydGljYWw7bWFyZ2luLXRvcDo4cHg7XCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJwYXN0ZS1jaGFyLWNvdW50XCIgYXJpYS1saXZlPVwicG9saXRlXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6MTJweDtjb2xvcjojOTRhM2I4O21hcmdpbi10b3A6NHB4O21pbi1oZWlnaHQ6MThweDtcIj48L2Rpdj5cbiAgICAgICAgICAgIDxzcGFuIGlkPVwicGFzdGUtZXJyb3JcIiBjbGFzcz1cImZpZWxkLWVycm9yXCIgYXJpYS1saXZlPVwicG9saXRlXCI+PC9zcGFuPlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6MTBweDtkaXNwbGF5OmZsZXg7Z2FwOjEycHg7XCI+XG4gICAgICAgICAgICAgIDxidXR0b24gb25jbGljaz1cInN1Ym1pdEpvYlRleHQoKVwiIGNsYXNzPVwiYnRuLXByaW1hcnlcIj5TdWJtaXQgSm9iIERlc2NyaXB0aW9uPC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b24gb25jbGljaz1cImNsZWFySm9iSW5wdXQoKVwiIGNsYXNzPVwiYnRuLXNlY29uZGFyeVwiPkNsZWFyPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1tZXRob2RcIiBpZD1cInVybC1tZXRob2RcIj5cbiAgICAgICAgICAgIDxwIHN0eWxlPVwibWFyZ2luOjhweCAwIDEwcHg7XCI+RW50ZXIgYSBVUkwgdG8gYXV0b21hdGljYWxseSBleHRyYWN0IHRoZSBqb2IgZGVzY3JpcHRpb246PC9wPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ1cmxcIiBpZD1cImpvYi11cmwtaW5wdXRcIiBwbGFjZWhvbGRlcj1cImh0dHBzOi8vY29tcGFueS5jb20vam9iLXBvc3RpbmdcIlxuICAgICAgICAgICAgICBhcmlhLXJlcXVpcmVkPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIGFyaWEtZGVzY3JpYmVkYnk9XCJ1cmwtZXJyb3JcIlxuICAgICAgICAgICAgICBvbmJsdXI9XCJfdmFsaWRhdGVVUkxGaWVsZCgpXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDoxMDAlO3BhZGRpbmc6MTJweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo2cHg7XCIgLz5cbiAgICAgICAgICAgIDxzcGFuIGlkPVwidXJsLWVycm9yXCIgY2xhc3M9XCJmaWVsZC1lcnJvclwiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOjEwcHg7ZGlzcGxheTpmbGV4O2dhcDoxMnB4O1wiPlxuICAgICAgICAgICAgICA8YnV0dG9uIG9uY2xpY2s9XCJmZXRjaEpvYkZyb21VUkwoKVwiIGNsYXNzPVwiYnRuLXByaW1hcnlcIj5GZXRjaCBKb2IgRGVzY3JpcHRpb248L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPVwiY2xlYXJVUkxJbnB1dCgpXCIgY2xhc3M9XCJidG4tc2Vjb25kYXJ5XCI+Q2xlYXI8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6MTRweDtkaXNwbGF5OmdyaWQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmciAxZnI7Z2FwOjEwcHg7Zm9udC1zaXplOjEzcHg7XCI+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmMGY5ZmY7Ym9yZGVyOjFweCBzb2xpZCAjMGVhNWU5O2JvcmRlci1yYWRpdXM6NnB4O3BhZGRpbmc6MTBweDtcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6NjAwO2NvbG9yOiMwMzY5YTE7bWFyZ2luLWJvdHRvbTo0cHg7XCI+XHUyNzA1IFdvcmtzIHdlbGwgd2l0aDo8L2Rpdj5cbiAgICAgICAgICAgICAgICA8dWwgc3R5bGU9XCJtYXJnaW46MDtwYWRkaW5nLWxlZnQ6MTZweDtjb2xvcjojMDM2OWExO2xpbmUtaGVpZ2h0OjEuNztcIj48bGk+Q29tcGFueSBjYXJlZXIgcGFnZXM8L2xpPjxsaT5BbmdlbExpc3QsIFJlbW90ZU9LPC9saT48bGk+R292ZXJubWVudCAmYW1wOyB1bml2ZXJzaXR5IHNpdGVzPC9saT48L3VsPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2ZlZjNjNztib3JkZXI6MXB4IHNvbGlkICNmNTllMGI7Ym9yZGVyLXJhZGl1czo2cHg7cGFkZGluZzoxMHB4O1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDo2MDA7Y29sb3I6IzkyNDAwZTttYXJnaW4tYm90dG9tOjRweDtcIj5cdTI2QTBcdUZFMEYgQ29weSBtYW51YWxseSBmcm9tOjwvZGl2PlxuICAgICAgICAgICAgICAgIDx1bCBzdHlsZT1cIm1hcmdpbjowO3BhZGRpbmctbGVmdDoxNnB4O2NvbG9yOiM5MjQwMGU7bGluZS1oZWlnaHQ6MS43O1wiPjxsaT48c3Ryb25nPkxpbmtlZEluPC9zdHJvbmc+IChsb2dpbiByZXF1aXJlZCk8L2xpPjxsaT48c3Ryb25nPkluZGVlZDwvc3Ryb25nPiAoYW50aS1ib3QpPC9saT48bGk+PHN0cm9uZz5HbGFzc2Rvb3I8L3N0cm9uZz4gKGF1dGggcmVxdWlyZWQpPC9saT48L3VsPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LW1ldGhvZFwiIGlkPVwiZmlsZS1tZXRob2RcIj5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJmaWxlLWRyb3Atem9uZVwiXG4gICAgICAgICAgICAgICAgIG9uZHJhZ292ZXI9XCJldmVudC5wcmV2ZW50RGVmYXVsdCgpOyB0aGlzLmNsYXNzTGlzdC5hZGQoJ2RyYWctb3ZlcicpXCJcbiAgICAgICAgICAgICAgICAgb25kcmFnbGVhdmU9XCJ0aGlzLmNsYXNzTGlzdC5yZW1vdmUoJ2RyYWctb3ZlcicpXCJcbiAgICAgICAgICAgICAgICAgb25kcm9wPVwiaGFuZGxlRmlsZURyb3AoZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgb25jbGljaz1cImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqb2ItZmlsZS1pbnB1dCcpLmNsaWNrKClcIlxuICAgICAgICAgICAgICAgICBzdHlsZT1cImJvcmRlcjoycHggZGFzaGVkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzozMnB4IDE2cHg7dGV4dC1hbGlnbjpjZW50ZXI7Y3Vyc29yOnBvaW50ZXI7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kIDAuMnMsYm9yZGVyLWNvbG9yIDAuMnM7bWFyZ2luOjhweCAwO1wiPlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjJyZW07bWFyZ2luLWJvdHRvbTo4cHg7XCI+XHVEODNEXHVEQ0M0PC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+RHJvcCBhIGZpbGUgaGVyZSwgb3IgY2xpY2sgdG8gYnJvd3NlPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC44NXJlbTtjb2xvcjojNjQ3NDhiO1wiPi50eHQgJm5ic3A7XHUwMEI3Jm5ic3A7IC5tZCAmbmJzcDtcdTAwQjcmbmJzcDsgLmh0bWwgJm5ic3A7XHUwMEI3Jm5ic3A7IC5wZGYgJm5ic3A7XHUwMEI3Jm5ic3A7IC5kb2N4ICZuYnNwO1x1MDBCNyZuYnNwOyAucnRmPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIGlkPVwiam9iLWZpbGUtaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6bm9uZVwiXG4gICAgICAgICAgICAgICAgICAgYWNjZXB0PVwiLnR4dCwubWQsLnJzdCwudGV4dCwuaHRtbCwuaHRtLC5wZGYsLmRvY3gsLmRvYywucnRmXCJcbiAgICAgICAgICAgICAgICAgICBhcmlhLWRlc2NyaWJlZGJ5PVwiZmlsZS11cGxvYWQtZXJyb3JcIlxuICAgICAgICAgICAgICAgICAgIG9uY2hhbmdlPVwiaGFuZGxlRmlsZVNlbGVjdGVkKHRoaXMuZmlsZXNbMF0pXCI+XG4gICAgICAgICAgICA8ZGl2IGlkPVwiZmlsZS1zZWxlY3RlZC1pbmZvXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7bWFyZ2luOjhweCAwO1wiPlxuICAgICAgICAgICAgICA8c3BhbiBpZD1cImZpbGUtc2VsZWN0ZWQtbmFtZVwiIHN0eWxlPVwiZm9udC13ZWlnaHQ6NjAwO1wiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gaWQ9XCJmaWxlLXNlbGVjdGVkLXNpemVcIiBzdHlsZT1cImNvbG9yOiM2NDc0OGI7bWFyZ2luLWxlZnQ6OHB4O1wiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPVwiY2xlYXJTZWxlY3RlZEZpbGUoKVwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6OHB4O2JhY2tncm91bmQ6bm9uZTtib3JkZXI6bm9uZTtjdXJzb3I6cG9pbnRlcjtjb2xvcjojNjQ3NDhiO1wiPlx1MjcxNTwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGlkPVwiZmlsZS11cGxvYWQtZXJyb3JcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtjb2xvcjojYzAzOTJiO21hcmdpbjo4cHggMDtmb250LXNpemU6MC44NXJlbTtcIj48L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJmaWxlLXNpemUtd2FybmluZ1wiIHN0eWxlPVwiZGlzcGxheTpub25lO2NvbG9yOiM5MjQwMGU7YmFja2dyb3VuZDojZmVmM2M3O2JvcmRlcjoxcHggc29saWQgI2ZjZDM0ZDtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjRweCA4cHg7bWFyZ2luOjRweCAwO2ZvbnQtc2l6ZTowLjg1cmVtO1wiPjwvZGl2PlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6OHB4O21hcmdpbi10b3A6NHB4O2FsaWduLWl0ZW1zOmNlbnRlcjtcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImZpbGUtdXBsb2FkLWJ0blwiIG9uY2xpY2s9XCJ1cGxvYWRKb2JGaWxlKClcIiBjbGFzcz1cImJ0bi1wcmltYXJ5XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+XHVEODNEXHVEQ0U0IFVzZSBUaGlzIEZpbGU8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGRpdiBpZD1cImZpbGUtdXBsb2FkLXNwaW5uZXJcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtmb250LXNpemU6MC44NXJlbTtjb2xvcjojNjQ3NDhiO1wiPlx1MjNGMyBQYXJzaW5nXHUyMDI2PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgO1xuICAvLyBTaG93IG1pbmltdW0tbGVuZ3RoIGhpbnQgaW1tZWRpYXRlbHkgb24gZmlyc3QgcmVuZGVyIChHQVAtMjg4KS5cbiAgX3VwZGF0ZVBhc3RlQ2hhckNvdW50KCk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gSW5wdXQgbWV0aG9kIHN3aXRjaGluZ1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIHN3aXRjaElucHV0TWV0aG9kKG1ldGhvZCkge1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuaW5wdXQtdGFiJykuZm9yRWFjaCh0YWIgPT4gdGFiLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpKTtcbiAgZXZlbnQudGFyZ2V0LmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5pbnB1dC1tZXRob2QnKS5mb3JFYWNoKHBhbmVsID0+IHBhbmVsLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobWV0aG9kICsgJy1tZXRob2QnKS5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBGaWxlIHVwbG9hZFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmxldCBfcGVuZGluZ1VwbG9hZEZpbGUgPSBudWxsO1xuXG5mdW5jdGlvbiBoYW5kbGVGaWxlRHJvcChldmVudCkge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmlsZS1kcm9wLXpvbmUnKS5jbGFzc0xpc3QucmVtb3ZlKCdkcmFnLW92ZXInKTtcbiAgY29uc3QgZmlsZSA9IGV2ZW50LmRhdGFUcmFuc2Zlci5maWxlc1swXTtcbiAgaWYgKGZpbGUpIGhhbmRsZUZpbGVTZWxlY3RlZChmaWxlKTtcbn1cblxuZnVuY3Rpb24gaGFuZGxlRmlsZVNlbGVjdGVkKGZpbGUpIHtcbiAgaWYgKCFmaWxlKSByZXR1cm47XG5cbiAgY29uc3Qgc2l6ZU1iICA9IChmaWxlLnNpemUgLyAoMTAyNCAqIDEwMjQpKS50b0ZpeGVkKDEpO1xuICBjb25zdCBzaXplU3RyID0gZmlsZS5zaXplID4gMTAyNCAqIDEwMjQgPyBgJHtzaXplTWJ9IE1CYCA6IGAkeyhmaWxlLnNpemUgLyAxMDI0KS50b0ZpeGVkKDEpfSBLQmA7XG4gIGNvbnN0IGVyckVsICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmlsZS11cGxvYWQtZXJyb3InKTtcbiAgY29uc3Qgd2FybkVsICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlLXNpemUtd2FybmluZycpO1xuXG4gIGNvbnN0IGFsbG93ZWRNaW1lcyA9IFsnYXBwbGljYXRpb24vcGRmJywgJ2FwcGxpY2F0aW9uL21zd29yZCcsXG4gICAgJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC53b3JkcHJvY2Vzc2luZ21sLmRvY3VtZW50JyxcbiAgICAndGV4dC9wbGFpbicsICd0ZXh0L2h0bWwnXTtcbiAgY29uc3QgYWxsb3dlZEV4dHMgID0gWycucGRmJywgJy5kb2MnLCAnLmRvY3gnLCAnLnR4dCcsICcuaHRtbCcsICcuaHRtJ107XG4gIGNvbnN0IGV4dCA9ICcuJyArIChmaWxlLm5hbWUuc3BsaXQoJy4nKS5wb3AoKSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgbWltZU9rID0gYWxsb3dlZE1pbWVzLnNvbWUobSA9PiBmaWxlLnR5cGUuc3RhcnRzV2l0aChtKSkgfHwgZmlsZS50eXBlID09PSAnJztcbiAgY29uc3QgZXh0T2sgID0gYWxsb3dlZEV4dHMuaW5jbHVkZXMoZXh0KTtcbiAgaWYgKCFtaW1lT2sgJiYgIWV4dE9rKSB7XG4gICAgZXJyRWwudGV4dENvbnRlbnQgICA9IGBVbnN1cHBvcnRlZCBmaWxlIHR5cGUgXCIke2V4dCB8fCBmaWxlLnR5cGV9XCIuIFN1cHBvcnRlZCBmb3JtYXRzOiBQREYsIFdvcmQgKC5kb2MvLmRvY3gpLCBwbGFpbiB0ZXh0LCBIVE1MLmA7XG4gICAgZXJyRWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgaWYgKHdhcm5FbCkgd2FybkVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGUtdXBsb2FkLWJ0bicpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGZpbGUuc2l6ZSA+IDIwICogMTAyNCAqIDEwMjQpIHtcbiAgICBlcnJFbC50ZXh0Q29udGVudCAgID0gYEZpbGUgaXMgdG9vIGxhcmdlICgke3NpemVNYn0gTUIpLiBNYXhpbXVtIGFsbG93ZWQgc2l6ZSBpcyAyMCBNQi5gO1xuICAgIGVyckVsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgIGlmICh3YXJuRWwpIHdhcm5FbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlLXVwbG9hZC1idG4nKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIF9wZW5kaW5nVXBsb2FkRmlsZSA9IGZpbGU7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlLXNlbGVjdGVkLW5hbWUnKS50ZXh0Q29udGVudCAgPSBmaWxlLm5hbWU7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlLXNlbGVjdGVkLXNpemUnKS50ZXh0Q29udGVudCAgPSBgKCR7c2l6ZVN0cn0pYDtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGUtc2VsZWN0ZWQtaW5mbycpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmlsZS11cGxvYWQtYnRuJykuc3R5bGUuZGlzcGxheSAgICA9ICdpbmxpbmUtYmxvY2snO1xuICBlcnJFbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gIGlmICh3YXJuRWwpIHtcbiAgICBpZiAoZmlsZS5zaXplID4gNSAqIDEwMjQgKiAxMDI0KSB7XG4gICAgICB3YXJuRWwudGV4dENvbnRlbnQgICA9IGBcdTI2QTAgTGFyZ2UgZmlsZSAoJHtzaXplTWJ9IE1CKSBcdTIwMTQgcGFyc2luZyBtYXkgdGFrZSBhIG1vbWVudC5gO1xuICAgICAgd2FybkVsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgIH0gZWxzZSB7XG4gICAgICB3YXJuRWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY2xlYXJTZWxlY3RlZEZpbGUoKSB7XG4gIF9wZW5kaW5nVXBsb2FkRmlsZSA9IG51bGw7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqb2ItZmlsZS1pbnB1dCcpLnZhbHVlID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlLXNlbGVjdGVkLWluZm8nKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmlsZS11cGxvYWQtYnRuJykuc3R5bGUuZGlzcGxheSAgID0gJ25vbmUnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmlsZS11cGxvYWQtZXJyb3InKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBjb25zdCB3YXJuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGUtc2l6ZS13YXJuaW5nJyk7XG4gIGlmICh3YXJuKSB3YXJuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwbG9hZEpvYkZpbGUoKSB7XG4gIGlmICghX3BlbmRpbmdVcGxvYWRGaWxlKSByZXR1cm47XG5cbiAgY29uc3QgZXJyRWwgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlLXVwbG9hZC1lcnJvcicpO1xuICBjb25zdCBzcGlubmVyICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGUtdXBsb2FkLXNwaW5uZXInKTtcbiAgY29uc3QgdXBsb2FkQnRuICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlLXVwbG9hZC1idG4nKTtcblxuICBlcnJFbC5zdHlsZS5kaXNwbGF5ICAgID0gJ25vbmUnO1xuICBzcGlubmVyLnN0eWxlLmRpc3BsYXkgID0gJ2lubGluZSc7XG4gIHVwbG9hZEJ0bi5kaXNhYmxlZCAgICAgPSB0cnVlO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ2ZpbGUnLCBfcGVuZGluZ1VwbG9hZEZpbGUpO1xuXG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKCcvYXBpL3VwbG9hZC1maWxlJywgeyBtZXRob2Q6ICdQT1NUJywgYm9keTogZm9ybURhdGEgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3AuanNvbigpO1xuXG4gICAgaWYgKCFyZXNwLm9rIHx8IGRhdGEuZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihkYXRhLm1lc3NhZ2UgfHwgZGF0YS5lcnJvciB8fCBgU2VydmVyIGVycm9yICR7cmVzcC5zdGF0dXN9YCk7XG4gICAgfVxuXG4gICAgY29uc3Qgam9iUmVzcCA9IGF3YWl0IGZldGNoKCcvYXBpL2pvYicsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGpvYl90ZXh0OiBkYXRhLnRleHQgfSlcbiAgICB9KTtcbiAgICBjb25zdCBqb2JEYXRhID0gYXdhaXQgam9iUmVzcC5qc29uKCk7XG4gICAgaWYgKCFqb2JSZXNwLm9rKSB0aHJvdyBuZXcgRXJyb3Ioam9iRGF0YS5lcnJvciB8fCAnRmFpbGVkIHRvIHByb2Nlc3Mgam9iIGRlc2NyaXB0aW9uJyk7XG5cbiAgICBpZiAoam9iRGF0YS5lcnJvcikge1xuICAgICAgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgJ0Vycm9yOiAnICsgam9iRGF0YS5lcnJvcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlTWFuYWdlci5zZXRUYWJEYXRhKCdqb2InLCBkYXRhLnRleHQpO1xuICAgICAgc2F2ZVRhYkRhdGEoKTtcbiAgICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIGBcdTI3MDUgSm9iIGRlc2NyaXB0aW9uIGxvYWRlZCBmcm9tIFwiJHtkYXRhLmZpbGVuYW1lfVwiICgke2RhdGEuY29udGVudF9sZW5ndGgudG9Mb2NhbGVTdHJpbmcoKX0gY2hhcnMpLmApO1xuICAgICAgYXdhaXQgYW5hbHl6ZUpvYigpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZXJyRWwudGV4dENvbnRlbnQgICA9IGVyci5tZXNzYWdlO1xuICAgIGVyckVsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICB9IGZpbmFsbHkge1xuICAgIHNwaW5uZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB1cGxvYWRCdG4uZGlzYWJsZWQgICAgPSBmYWxzZTtcbiAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFBhc3RlIHRleHQgc3VibWlzc2lvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IFBBU1RFX01JTl9DSEFSUyA9IDIwMDtcblxuZnVuY3Rpb24gX3VwZGF0ZVBhc3RlQ2hhckNvdW50KCkge1xuICBjb25zdCB2YWwgPSAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pvYi10ZXh0LWlucHV0Jyk/LnZhbHVlIHx8ICcnKS50cmltKCk7XG4gIGNvbnN0IGNvdW50RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGFzdGUtY2hhci1jb3VudCcpO1xuICBpZiAoIWNvdW50RWwpIHJldHVybjtcbiAgY29uc3QgbiA9IHZhbC5sZW5ndGg7XG4gIGlmIChuID09PSAwKSB7XG4gICAgY291bnRFbC5zdHlsZS5jb2xvciA9ICcjOTRhM2I4JztcbiAgICBjb3VudEVsLnRleHRDb250ZW50ID0gYFBhc3RlIHRoZSBmdWxsIGpvYiBkZXNjcmlwdGlvbiAobWluaW11bSAke1BBU1RFX01JTl9DSEFSU30gY2hhcmFjdGVycyBmb3IgYmVzdCByZXN1bHRzKWA7XG4gIH0gZWxzZSBpZiAobiA8IFBBU1RFX01JTl9DSEFSUykge1xuICAgIGNvdW50RWwuc3R5bGUuY29sb3IgPSAnI2VmNDQ0NCc7XG4gICAgY291bnRFbC50ZXh0Q29udGVudCA9IGAke259IC8gJHtQQVNURV9NSU5fQ0hBUlN9IG1pbmltdW0gXHUyMDE0IFRvbyBzaG9ydCwgYWltIGZvciBhdCBsZWFzdCAke1BBU1RFX01JTl9DSEFSU30gY2hhcmFjdGVyc2A7XG4gIH0gZWxzZSB7XG4gICAgY291bnRFbC5zdHlsZS5jb2xvciA9ICcjMTZhMzRhJztcbiAgICBjb3VudEVsLnRleHRDb250ZW50ID0gYCR7bn0gLyAke1BBU1RFX01JTl9DSEFSU30gbWluaW11bSBcdTI3MTNgO1xuICB9XG59XG5cbmZ1bmN0aW9uIF92YWxpZGF0ZVBhc3RlRmllbGQoKSB7XG4gIGNvbnN0IHZhbCA9IChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnam9iLXRleHQtaW5wdXQnKT8udmFsdWUgfHwgJycpLnRyaW0oKTtcbiAgX3VwZGF0ZVBhc3RlQ2hhckNvdW50KCk7XG4gIGlmICh2YWwubGVuZ3RoID4gMCAmJiB2YWwubGVuZ3RoIDwgUEFTVEVfTUlOX0NIQVJTKSB7XG4gICAgX3Nob3dGaWVsZEVycm9yKCdqb2ItdGV4dC1pbnB1dCcsICdwYXN0ZS1lcnJvcicsIGBKb2IgZGVzY3JpcHRpb24gaXMgdG9vIHNob3J0IFx1MjAxNCBwbGVhc2UgcGFzdGUgYXQgbGVhc3QgJHtQQVNURV9NSU5fQ0hBUlN9IGNoYXJhY3RlcnMuYCk7XG4gIH0gZWxzZSB7XG4gICAgX2NsZWFyRmllbGRFcnJvcignam9iLXRleHQtaW5wdXQnLCAncGFzdGUtZXJyb3InKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBzdWJtaXRKb2JUZXh0KCkge1xuICAvKiBkdWNrZmxvdzpcbiAgICogICBpZDogam9iX3VpX3N1Ym1pdF9saXZlXG4gICAqICAga2luZDogdWlcbiAgICogICB0aW1lc3RhbXA6ICcyMDI2LTAzLTMxVDEyOjQ5OjQ3WidcbiAgICogICBzdGF0dXM6IGxpdmVcbiAgICogICBoYW5kbGVzOlxuICAgKiAgIC0gdWk6am9iLWlucHV0LnN1Ym1pdC10ZXh0XG4gICAqICAgY2FsbHM6XG4gICAqICAgLSBQT1NUIC9hcGkvam9iXG4gICAqICAgLSBhbmFseXplSm9iXG4gICAqICAgcmVhZHM6XG4gICAqICAgLSBkb206I2pvYi10ZXh0LWlucHV0LnZhbHVlXG4gICAqICAgd3JpdGVzOlxuICAgKiAgIC0gcmVxdWVzdDpQT1NUIC9hcGkvam9iLmpvYl90ZXh0XG4gICAqICAgLSB0YWI6am9iXG4gICAqICAgLSB1aTp3b3JrZmxvdy5qb2JcbiAgICogICBub3RlczogU3VibWl0cyBwYXN0ZWQgam9iIHRleHQgdG8gdGhlIGJhY2tlbmQsIGNhY2hlcyB0aGUgc2FtZSB0ZXh0IGluIHRhYiBzdGF0ZSwgdGhlbiBydW5zIGFuYWx5emVKb2IoKSBzbyBhbGwgam9iIHNvdXJjZXMgc2hhcmUgdGhlIHNhbWUgYW5hbHlzaXMgYW5kIGludGFrZSBmbG93LlxuICAgKi9cbiAgY29uc3QgdGV4dElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pvYi10ZXh0LWlucHV0Jyk7XG4gIGNvbnN0IGpvYlRleHQgPSB0ZXh0SW5wdXQudmFsdWUudHJpbSgpO1xuXG4gIGlmICgham9iVGV4dCkge1xuICAgIF9zaG93RmllbGRFcnJvcignam9iLXRleHQtaW5wdXQnLCAncGFzdGUtZXJyb3InLCAnUGxlYXNlIGVudGVyIGEgam9iIGRlc2NyaXB0aW9uIGJlZm9yZSBzdWJtaXR0aW5nLicpO1xuICAgIHRleHRJbnB1dC5mb2N1cygpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoam9iVGV4dC5sZW5ndGggPCBQQVNURV9NSU5fQ0hBUlMpIHtcbiAgICBfc2hvd0ZpZWxkRXJyb3IoJ2pvYi10ZXh0LWlucHV0JywgJ3Bhc3RlLWVycm9yJywgYEpvYiBkZXNjcmlwdGlvbiBpcyB0b28gc2hvcnQgXHUyMDE0IHBsZWFzZSBwYXN0ZSBhdCBsZWFzdCAke1BBU1RFX01JTl9DSEFSU30gY2hhcmFjdGVycy5gKTtcbiAgICB0ZXh0SW5wdXQuZm9jdXMoKTtcbiAgICByZXR1cm47XG4gIH1cbiAgX2NsZWFyRmllbGRFcnJvcignam9iLXRleHQtaW5wdXQnLCAncGFzdGUtZXJyb3InKTtcblxuICBzZXRMb2FkaW5nKHRydWUsICdBbmFseXNpbmcgam9iIGRlc2NyaXB0aW9uXHUyMDI2Jyk7XG4gIGFwcGVuZE1lc3NhZ2UoJ3VzZXInLCAnU3VibWl0dGluZyBqb2IgZGVzY3JpcHRpb24uLi4nKTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvam9iJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgam9iX3RleHQ6IGpvYlRleHQgfSlcbiAgICB9KTtcblxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICBpZiAoZGF0YS5lcnJvcikge1xuICAgICAgX3Nob3dGaWVsZEVycm9yKCdqb2ItdGV4dC1pbnB1dCcsICdwYXN0ZS1lcnJvcicsIGRhdGEuZXJyb3IpO1xuICAgICAgYXBwZW5kUmV0cnlNZXNzYWdlKCdcdTI3NEMgRXJyb3I6ICcgKyBkYXRhLmVycm9yLCBzdWJtaXRKb2JUZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgX2NsZWFyRmllbGRFcnJvcignam9iLXRleHQtaW5wdXQnLCAncGFzdGUtZXJyb3InKTtcbiAgICAgIHN0YXRlTWFuYWdlci5zZXRUYWJEYXRhKCdqb2InLCBqb2JUZXh0KTtcbiAgICAgIHNhdmVUYWJEYXRhKCk7XG4gICAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCAnXHUyNzA1IEpvYiBkZXNjcmlwdGlvbiBzdWJtaXR0ZWQgc3VjY2Vzc2Z1bGx5LicpO1xuXG4gICAgICBpZiAodHlwZW9mIHVwZGF0ZVRhYkJhckZvclN0YWdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHVwZGF0ZVRhYkJhckZvclN0YWdlKCdqb2InKTtcbiAgICAgIH1cbiAgICAgIHN3aXRjaFRhYignam9iJyk7XG4gICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICAgIGF3YWl0IGFuYWx5emVKb2IoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nLmVycm9yKCdFcnJvciBzdWJtaXR0aW5nIGpvYjonLCBlcnJvcik7XG4gICAgYXBwZW5kUmV0cnlNZXNzYWdlKCdcdTI3NEMgRXJyb3Igc3VibWl0dGluZyBqb2IgZGVzY3JpcHRpb246ICcgKyBlcnJvci5tZXNzYWdlLCBzdWJtaXRKb2JUZXh0KTtcbiAgfVxuXG4gIHNldExvYWRpbmcoZmFsc2UpO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFVSTCBmZXRjaFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIF92YWxpZGF0ZVVSTEZpZWxkKCkge1xuICBjb25zdCB2YWwgPSAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pvYi11cmwtaW5wdXQnKT8udmFsdWUgfHwgJycpLnRyaW0oKTtcbiAgaWYgKCF2YWwpIHsgX2NsZWFyRmllbGRFcnJvcignam9iLXVybC1pbnB1dCcsICd1cmwtZXJyb3InKTsgcmV0dXJuOyB9XG4gIHRyeSB7XG4gICAgY29uc3QgdSA9IG5ldyBVUkwodmFsKTtcbiAgICBpZiAoIVsnaHR0cDonLCAnaHR0cHM6J10uaW5jbHVkZXModS5wcm90b2NvbCkpIHRocm93IG5ldyBFcnJvcignUHJvdG9jb2wgbm90IGh0dHAvaHR0cHMnKTtcbiAgICBfY2xlYXJGaWVsZEVycm9yKCdqb2ItdXJsLWlucHV0JywgJ3VybC1lcnJvcicpO1xuICB9IGNhdGNoIHtcbiAgICBfc2hvd0ZpZWxkRXJyb3IoJ2pvYi11cmwtaW5wdXQnLCAndXJsLWVycm9yJywgJ1BsZWFzZSBlbnRlciBhIHZhbGlkIFVSTCBzdGFydGluZyB3aXRoIGh0dHBzOi8vIG9yIGh0dHA6Ly8nKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaEpvYkZyb21VUkwoKSB7XG4gIGNvbnN0IHVybElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pvYi11cmwtaW5wdXQnKTtcbiAgY29uc3QgdXJsID0gdXJsSW5wdXQudmFsdWUudHJpbSgpO1xuXG4gIGlmICghdXJsKSB7XG4gICAgX3Nob3dGaWVsZEVycm9yKCdqb2ItdXJsLWlucHV0JywgJ3VybC1lcnJvcicsICdQbGVhc2UgZW50ZXIgYSBVUkwgYmVmb3JlIGZldGNoaW5nLicpO1xuICAgIHVybElucHV0LmZvY3VzKCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgdSA9IG5ldyBVUkwodXJsKTtcbiAgICBpZiAoIVsnaHR0cDonLCAnaHR0cHM6J10uaW5jbHVkZXModS5wcm90b2NvbCkpIHRocm93IG5ldyBFcnJvcigpO1xuICAgIF9jbGVhckZpZWxkRXJyb3IoJ2pvYi11cmwtaW5wdXQnLCAndXJsLWVycm9yJyk7XG4gIH0gY2F0Y2gge1xuICAgIF9zaG93RmllbGRFcnJvcignam9iLXVybC1pbnB1dCcsICd1cmwtZXJyb3InLCAnUGxlYXNlIGVudGVyIGEgdmFsaWQgVVJMIHN0YXJ0aW5nIHdpdGggaHR0cHM6Ly8gb3IgaHR0cDovLycpO1xuICAgIHVybElucHV0LmZvY3VzKCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgc2V0TG9hZGluZyh0cnVlLCAnRmV0Y2hpbmcgam9iIGZyb20gVVJMXHUyMDI2Jyk7XG4gIGFwcGVuZE1lc3NhZ2UoJ3VzZXInLCBgRmV0Y2hpbmcgam9iIGRlc2NyaXB0aW9uIGZyb20gVVJMOiAke3VybH1gKTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvZmV0Y2gtam9iLXVybCcsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHVybDogdXJsIH0pXG4gICAgfSk7XG5cbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXG4gICAgaWYgKGRhdGEuZXJyb3IpIHtcbiAgICAgIGxldCBlcnJvck1lc3NhZ2UgPSBkYXRhLmVycm9yO1xuICAgICAgbGV0IGhlbHBNZXNzYWdlID0gZGF0YS5tZXNzYWdlIHx8ICcnO1xuXG4gICAgICBpZiAoZGF0YS5wcm90ZWN0ZWRfc2l0ZSkge1xuICAgICAgICBlcnJvck1lc3NhZ2UgPSBgJHtkYXRhLnNpdGVfbmFtZX0gUHJvdGVjdGlvbiBEZXRlY3RlZGA7XG4gICAgICAgIGhlbHBNZXNzYWdlID0gZGF0YS5tZXNzYWdlO1xuXG4gICAgICAgIGlmIChkYXRhLmluc3RydWN0aW9ucyAmJiBkYXRhLmluc3RydWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgaGVscE1lc3NhZ2UgKz0gJ1xcblxcbkhvdyB0byBwcm9jZWVkOlxcbicgKyBkYXRhLmluc3RydWN0aW9ucy5tYXAoKGluc3QsIGkpID0+IGAke2kgKyAxfS4gJHtpbnN0fWApLmpvaW4oJ1xcbicpO1xuICAgICAgICB9XG5cbiAgICAgICAgc2hvd1Byb3RlY3RlZFNpdGVNb2RhbChkYXRhLnNpdGVfbmFtZSwgZGF0YS5tZXNzYWdlLCBkYXRhLmluc3RydWN0aW9ucyk7XG4gICAgICB9IGVsc2UgaWYgKGRhdGEuaW5zdHJ1Y3Rpb25zKSB7XG4gICAgICAgIGhlbHBNZXNzYWdlICs9ICdcXG5cXG5TdWdnZXN0ZWQgc29sdXRpb25zOlxcbicgKyBkYXRhLmluc3RydWN0aW9ucy5tYXAoKGluc3QsIGkpID0+IGAke2kgKyAxfS4gJHtpbnN0fWApLmpvaW4oJ1xcbicpO1xuICAgICAgICBzaG93QWxlcnRNb2RhbCgnVVJMIEZldGNoIEVycm9yJywgYCR7ZXJyb3JNZXNzYWdlfVxcblxcbiR7aGVscE1lc3NhZ2V9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfc2hvd0ZpZWxkRXJyb3IoJ2pvYi11cmwtaW5wdXQnLCAndXJsLWVycm9yJywgZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgc2hvd0FsZXJ0TW9kYWwoJ0Vycm9yJywgYCR7ZXJyb3JNZXNzYWdlfSR7aGVscE1lc3NhZ2UgPyAnXFxuXFxuJyArIGhlbHBNZXNzYWdlIDogJyd9YCk7XG4gICAgICB9XG5cbiAgICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsIGBcdTI3NEMgJHtlcnJvck1lc3NhZ2V9OiAke2RhdGEubWVzc2FnZSB8fCAnUGxlYXNlIHRyeSBtYW51YWwgaW5wdXQuJ31gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGVNYW5hZ2VyLnNldFRhYkRhdGEoJ2pvYicsIGRhdGEuam9iX3RleHQpO1xuICAgICAgc2F2ZVRhYkRhdGEoKTtcbiAgICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIGBcdTI3MDUgJHtkYXRhLm1lc3NhZ2V9ISBGZXRjaGVkICR7ZGF0YS5jb250ZW50X2xlbmd0aCB8fCAnY29udGVudCd9IGNoYXJhY3RlcnMuIFJldmlldyB0aGUgam9iIGRlc2NyaXB0aW9uIGJlbG93LCB0aGVuIGNsaWNrIFwiXHVEODNEXHVERDBEIEFuYWx5c2UgSm9iXCIgdG8gY29udGludWUuYCk7XG4gICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICAgIHN3aXRjaFRhYignam9iJyk7XG4gICAgICBhd2FpdCBwb3B1bGF0ZUpvYlRhYigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cuZXJyb3IoJ0Vycm9yIGZldGNoaW5nIFVSTDonLCBlcnJvcik7XG4gICAgX3Nob3dGaWVsZEVycm9yKCdqb2ItdXJsLWlucHV0JywgJ3VybC1lcnJvcicsIGBOZXR3b3JrIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgYXBwZW5kUmV0cnlNZXNzYWdlKGBOZXR3b3JrIGVycm9yIG9jY3VycmVkOiAke2Vycm9yLm1lc3NhZ2V9LiBQbGVhc2UgY2hlY2sgeW91ciBjb25uZWN0aW9uIG9yIHRyeSBtYW51YWwgaW5wdXQuYCwgZmV0Y2hKb2JGcm9tVVJMKTtcbiAgICBzaG93QWxlcnRNb2RhbCgnTmV0d29yayBFcnJvcicsICdVbmFibGUgdG8gY29ubmVjdCB0byB0aGUgc2VydmVyLiBQbGVhc2UgdHJ5IGFnYWluIG9yIHVzZSB0aGUgXCJQYXN0ZSBUZXh0XCIgb3B0aW9uIHRvIGlucHV0IHRoZSBqb2IgZGVzY3JpcHRpb24gbWFudWFsbHkuJyk7XG4gIH1cblxuICBzZXRMb2FkaW5nKGZhbHNlKTtcbn1cblxuZnVuY3Rpb24gc2hvd1Byb3RlY3RlZFNpdGVNb2RhbChzaXRlTmFtZSwgbWVzc2FnZSwgaW5zdHJ1Y3Rpb25zKSB7XG4gIGxldCBpbnN0cnVjdGlvbnNMaXN0ID0gJyc7XG4gIGlmIChpbnN0cnVjdGlvbnMgJiYgaW5zdHJ1Y3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICBpbnN0cnVjdGlvbnNMaXN0ID0gJzxvbCBzdHlsZT1cIm1hcmdpbjogMTZweCAwOyBwYWRkaW5nLWxlZnQ6IDIwcHg7XCI+JyArXG4gICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zLm1hcChpbnN0ID0+IGA8bGkgc3R5bGU9XCJtYXJnaW46IDhweCAwO1wiPiR7aW5zdH08L2xpPmApLmpvaW4oJycpICtcbiAgICAgICAgICAgICAgICAgICAgICAnPC9vbD4nO1xuICB9XG5cbiAgY29uc3Qgc2FmZU5hbWUgPSBlc2NhcGVIdG1sKHNpdGVOYW1lKTtcbiAgY29uc3Qgc2FmZU1lc3NhZ2UgPSBlc2NhcGVIdG1sKG1lc3NhZ2UpO1xuICBjb25zdCBtb2RhbENvbnRlbnQgPSBgXG4gICAgPGRpdiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjsgbWFyZ2luLWJvdHRvbTogMTZweDtcIj5cbiAgICAgIFx1RDgzRFx1REQxMiA8c3Ryb25nPiR7c2FmZU5hbWV9IHJlcXVpcmVzIG1hbnVhbCBpbnB1dDwvc3Ryb25nPlxuICAgIDwvZGl2PlxuICAgIDxwPiR7c2FmZU1lc3NhZ2V9PC9wPlxuICAgICR7aW5zdHJ1Y3Rpb25zTGlzdH1cbiAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMjBweDsgcGFkZGluZzogMTJweDsgYmFja2dyb3VuZDogI2YwZjlmZjsgYm9yZGVyOiAxcHggc29saWQgIzBlYTVlOTsgYm9yZGVyLXJhZGl1czogNnB4O1wiPlxuICAgICAgPHN0cm9uZz5cdUQ4M0RcdURDQTEgVGlwOjwvc3Ryb25nPiBBZnRlciBjb3B5aW5nIHRoZSBqb2IgZGVzY3JpcHRpb24sIGNsaWNrIHRoZSBcIlBhc3RlIFRleHRcIiB0YWIgYWJvdmUgdG8gc3VibWl0IGl0IGRpcmVjdGx5LlxuICAgIDwvZGl2PlxuICBgO1xuXG4gIHNob3dBbGVydE1vZGFsKGAke3NhZmVOYW1lfSBJbnB1dCBSZXF1aXJlZGAsIG1vZGFsQ29udGVudCk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ2xlYXIgaGVscGVyc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIGNsZWFySm9iSW5wdXQoKSB7XG4gIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pvYi10ZXh0LWlucHV0Jyk7XG4gIGlmIChlbCkgZWwudmFsdWUgPSAnJztcbn1cblxuZnVuY3Rpb24gY2xlYXJVUkxJbnB1dCgpIHtcbiAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnam9iLXVybC1pbnB1dCcpO1xuICBpZiAoZWwpIGVsLnZhbHVlID0gJyc7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRmllbGQgZXJyb3IgaGVscGVyc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIF9zaG93RmllbGRFcnJvcihpbnB1dElkLCBlcnJvcklkLCBtc2cpIHtcbiAgY29uc3QgaW5wICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlucHV0SWQpO1xuICBjb25zdCBzcGFuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZXJyb3JJZCk7XG4gIGlmIChzcGFuKSAgeyBzcGFuLnRleHRDb250ZW50ID0gbXNnOyBzcGFuLmNsYXNzTGlzdC5hZGQoJ3Zpc2libGUnKTsgfVxuICBpZiAoaW5wKSAgIHtcbiAgICBpbnAuY2xhc3NMaXN0LmFkZCgnZmllbGQtaW52YWxpZCcpO1xuICAgIGlucC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaW52YWxpZCcsICd0cnVlJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2NsZWFyRmllbGRFcnJvcihpbnB1dElkLCBlcnJvcklkKSB7XG4gIGNvbnN0IGlucCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpbnB1dElkKTtcbiAgY29uc3Qgc3BhbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVycm9ySWQpO1xuICBpZiAoc3BhbikgIHsgc3Bhbi50ZXh0Q29udGVudCA9ICcnOyBzcGFuLmNsYXNzTGlzdC5yZW1vdmUoJ3Zpc2libGUnKTsgfVxuICBpZiAoaW5wKSAgIHtcbiAgICBpbnAuY2xhc3NMaXN0LnJlbW92ZSgnZmllbGQtaW52YWxpZCcpO1xuICAgIGlucC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaW52YWxpZCcsICdmYWxzZScpO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFUyBtb2R1bGUgZXhwb3J0cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmV4cG9ydCB7XG4gIHBvcHVsYXRlSm9iVGFiLFxuICBzaG93TG9hZEpvYlBhbmVsLFxuICBzd2l0Y2hJbnB1dE1ldGhvZCxcbiAgX3BlbmRpbmdVcGxvYWRGaWxlLFxuICBoYW5kbGVGaWxlRHJvcCxcbiAgaGFuZGxlRmlsZVNlbGVjdGVkLFxuICBjbGVhclNlbGVjdGVkRmlsZSxcbiAgdXBsb2FkSm9iRmlsZSxcbiAgUEFTVEVfTUlOX0NIQVJTLFxuICBfdXBkYXRlUGFzdGVDaGFyQ291bnQsXG4gIF92YWxpZGF0ZVBhc3RlRmllbGQsXG4gIHN1Ym1pdEpvYlRleHQsXG4gIF92YWxpZGF0ZVVSTEZpZWxkLFxuICBmZXRjaEpvYkZyb21VUkwsXG4gIHNob3dQcm90ZWN0ZWRTaXRlTW9kYWwsXG4gIGNsZWFySm9iSW5wdXQsXG4gIGNsZWFyVVJMSW5wdXQsXG4gIF9zaG93RmllbGRFcnJvcixcbiAgX2NsZWFyRmllbGRFcnJvcixcbn07XG4iLCAiaW1wb3J0IHR5cGUgeyBNYXJrZWRPcHRpb25zIH0gZnJvbSAnLi9NYXJrZWRPcHRpb25zLnRzJztcblxuLyoqXG4gKiBHZXRzIHRoZSBvcmlnaW5hbCBtYXJrZWQgZGVmYXVsdCBvcHRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gX2dldERlZmF1bHRzPFBhcnNlck91dHB1dCA9IHN0cmluZywgUmVuZGVyZXJPdXRwdXQgPSBzdHJpbmc+KCk6IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4ge1xuICByZXR1cm4ge1xuICAgIGFzeW5jOiBmYWxzZSxcbiAgICBicmVha3M6IGZhbHNlLFxuICAgIGV4dGVuc2lvbnM6IG51bGwsXG4gICAgZ2ZtOiB0cnVlLFxuICAgIGhvb2tzOiBudWxsLFxuICAgIHBlZGFudGljOiBmYWxzZSxcbiAgICByZW5kZXJlcjogbnVsbCxcbiAgICBzaWxlbnQ6IGZhbHNlLFxuICAgIHRva2VuaXplcjogbnVsbCxcbiAgICB3YWxrVG9rZW5zOiBudWxsLFxuICB9O1xufVxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBsZXQgX2RlZmF1bHRzOiBNYXJrZWRPcHRpb25zPGFueSwgYW55PiA9IF9nZXREZWZhdWx0cygpO1xuXG5leHBvcnQgZnVuY3Rpb24gY2hhbmdlRGVmYXVsdHM8UGFyc2VyT3V0cHV0ID0gc3RyaW5nLCBSZW5kZXJlck91dHB1dCA9IHN0cmluZz4obmV3RGVmYXVsdHM6IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4pIHtcbiAgX2RlZmF1bHRzID0gbmV3RGVmYXVsdHM7XG59XG4iLCAiY29uc3Qgbm9vcFRlc3QgPSB7IGV4ZWM6ICgpID0+IG51bGwgfSBhcyB1bmtub3duIGFzIFJlZ0V4cDtcblxuZnVuY3Rpb24gZWRpdChyZWdleDogc3RyaW5nIHwgUmVnRXhwLCBvcHQgPSAnJykge1xuICBsZXQgc291cmNlID0gdHlwZW9mIHJlZ2V4ID09PSAnc3RyaW5nJyA/IHJlZ2V4IDogcmVnZXguc291cmNlO1xuICBjb25zdCBvYmogPSB7XG4gICAgcmVwbGFjZTogKG5hbWU6IHN0cmluZyB8IFJlZ0V4cCwgdmFsOiBzdHJpbmcgfCBSZWdFeHApID0+IHtcbiAgICAgIGxldCB2YWxTb3VyY2UgPSB0eXBlb2YgdmFsID09PSAnc3RyaW5nJyA/IHZhbCA6IHZhbC5zb3VyY2U7XG4gICAgICB2YWxTb3VyY2UgPSB2YWxTb3VyY2UucmVwbGFjZShvdGhlci5jYXJldCwgJyQxJyk7XG4gICAgICBzb3VyY2UgPSBzb3VyY2UucmVwbGFjZShuYW1lLCB2YWxTb3VyY2UpO1xuICAgICAgcmV0dXJuIG9iajtcbiAgICB9LFxuICAgIGdldFJlZ2V4OiAoKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IFJlZ0V4cChzb3VyY2UsIG9wdCk7XG4gICAgfSxcbiAgfTtcbiAgcmV0dXJuIG9iajtcbn1cblxuY29uc3Qgc3VwcG9ydHNMb29rYmVoaW5kID0gKCgpID0+IHtcbnRyeSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItcmVnZXgtbGl0ZXJhbHNcbiAgcmV0dXJuICEhbmV3IFJlZ0V4cCgnKD88PTEpKD88ITEpJyk7XG59IGNhdGNoIHtcbiAgLy8gU2VlIGJyb3dzZXIgc3VwcG9ydCBoZXJlOlxuICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9SZWd1bGFyX2V4cHJlc3Npb25zL0xvb2tiZWhpbmRfYXNzZXJ0aW9uXG4gIHJldHVybiBmYWxzZTtcbn1cbn0pKCk7XG5cbmV4cG9ydCBjb25zdCBvdGhlciA9IHtcbiAgY29kZVJlbW92ZUluZGVudDogL14oPzogezEsNH18IHswLDN9XFx0KS9nbSxcbiAgb3V0cHV0TGlua1JlcGxhY2U6IC9cXFxcKFtcXFtcXF1dKS9nLFxuICBpbmRlbnRDb2RlQ29tcGVuc2F0aW9uOiAvXihcXHMrKSg/OmBgYCkvLFxuICBiZWdpbm5pbmdTcGFjZTogL15cXHMrLyxcbiAgZW5kaW5nSGFzaDogLyMkLyxcbiAgc3RhcnRpbmdTcGFjZUNoYXI6IC9eIC8sXG4gIGVuZGluZ1NwYWNlQ2hhcjogLyAkLyxcbiAgbm9uU3BhY2VDaGFyOiAvW14gXS8sXG4gIG5ld0xpbmVDaGFyR2xvYmFsOiAvXFxuL2csXG4gIHRhYkNoYXJHbG9iYWw6IC9cXHQvZyxcbiAgbXVsdGlwbGVTcGFjZUdsb2JhbDogL1xccysvZyxcbiAgYmxhbmtMaW5lOiAvXlsgXFx0XSokLyxcbiAgZG91YmxlQmxhbmtMaW5lOiAvXFxuWyBcXHRdKlxcblsgXFx0XSokLyxcbiAgYmxvY2txdW90ZVN0YXJ0OiAvXiB7MCwzfT4vLFxuICBibG9ja3F1b3RlU2V0ZXh0UmVwbGFjZTogL1xcbiB7MCwzfSgoPzo9K3wtKykgKikoPz1cXG58JCkvZyxcbiAgYmxvY2txdW90ZVNldGV4dFJlcGxhY2UyOiAvXiB7MCwzfT5bIFxcdF0/L2dtLFxuICBsaXN0UmVwbGFjZU5lc3Rpbmc6IC9eIHsxLDR9KD89KCB7NH0pKlteIF0pL2csXG4gIGxpc3RJc1Rhc2s6IC9eXFxbWyB4WF1cXF0gK1xcUy8sXG4gIGxpc3RSZXBsYWNlVGFzazogL15cXFtbIHhYXVxcXSArLyxcbiAgbGlzdFRhc2tDaGVja2JveDogL1xcW1sgeFhdXFxdLyxcbiAgYW55TGluZTogL1xcbi4qXFxuLyxcbiAgaHJlZkJyYWNrZXRzOiAvXjwoLiopPiQvLFxuICB0YWJsZURlbGltaXRlcjogL1s6fF0vLFxuICB0YWJsZUFsaWduQ2hhcnM6IC9eXFx8fFxcfCAqJC9nLFxuICB0YWJsZVJvd0JsYW5rTGluZTogL1xcblsgXFx0XSokLyxcbiAgdGFibGVBbGlnblJpZ2h0OiAvXiAqLSs6ICokLyxcbiAgdGFibGVBbGlnbkNlbnRlcjogL14gKjotKzogKiQvLFxuICB0YWJsZUFsaWduTGVmdDogL14gKjotKyAqJC8sXG4gIHN0YXJ0QVRhZzogL148YSAvaSxcbiAgZW5kQVRhZzogL148XFwvYT4vaSxcbiAgc3RhcnRQcmVTY3JpcHRUYWc6IC9ePChwcmV8Y29kZXxrYmR8c2NyaXB0KShcXHN8PikvaSxcbiAgZW5kUHJlU2NyaXB0VGFnOiAvXjxcXC8ocHJlfGNvZGV8a2JkfHNjcmlwdCkoXFxzfD4pL2ksXG4gIHN0YXJ0QW5nbGVCcmFja2V0OiAvXjwvLFxuICBlbmRBbmdsZUJyYWNrZXQ6IC8+JC8sXG4gIHBlZGFudGljSHJlZlRpdGxlOiAvXihbXidcIl0qW15cXHNdKVxccysoWydcIl0pKC4qKVxcMi8sXG4gIHVuaWNvZGVBbHBoYU51bWVyaWM6IC9bXFxwe0x9XFxwe059XS91LFxuICBlc2NhcGVUZXN0OiAvWyY8PlwiJ10vLFxuICBlc2NhcGVSZXBsYWNlOiAvWyY8PlwiJ10vZyxcbiAgZXNjYXBlVGVzdE5vRW5jb2RlOiAvWzw+XCInXXwmKD8hKCNcXGR7MSw3fXwjW1h4XVthLWZBLUYwLTldezEsNn18XFx3Kyk7KS8sXG4gIGVzY2FwZVJlcGxhY2VOb0VuY29kZTogL1s8PlwiJ118Jig/ISgjXFxkezEsN318I1tYeF1bYS1mQS1GMC05XXsxLDZ9fFxcdyspOykvZyxcbiAgY2FyZXQ6IC8oXnxbXlxcW10pXFxeL2csXG4gIHBlcmNlbnREZWNvZGU6IC8lMjUvZyxcbiAgZmluZFBpcGU6IC9cXHwvZyxcbiAgc3BsaXRQaXBlOiAvIFxcfC8sXG4gIHNsYXNoUGlwZTogL1xcXFxcXHwvZyxcbiAgY2FycmlhZ2VSZXR1cm46IC9cXHJcXG58XFxyL2csXG4gIHNwYWNlTGluZTogL14gKyQvZ20sXG4gIG5vdFNwYWNlU3RhcnQ6IC9eXFxTKi8sXG4gIGVuZGluZ05ld2xpbmU6IC9cXG4kLyxcbiAgbGlzdEl0ZW1SZWdleDogKGJ1bGw6IHN0cmluZykgPT4gbmV3IFJlZ0V4cChgXiggezAsM30ke2J1bGx9KSgoPzpbXFx0IF1bXlxcXFxuXSopPyg/OlxcXFxufCQpKWApLFxuICBuZXh0QnVsbGV0UmVnZXg6IChpbmRlbnQ6IG51bWJlcikgPT4gbmV3IFJlZ0V4cChgXiB7MCwke01hdGgubWluKDMsIGluZGVudCAtIDEpfX0oPzpbKistXXxcXFxcZHsxLDl9Wy4pXSkoKD86WyBcXHRdW15cXFxcbl0qKT8oPzpcXFxcbnwkKSlgKSxcbiAgaHJSZWdleDogKGluZGVudDogbnVtYmVyKSA9PiBuZXcgUmVnRXhwKGBeIHswLCR7TWF0aC5taW4oMywgaW5kZW50IC0gMSl9fSgoPzotICopezMsfXwoPzpfICopezMsfXwoPzpcXFxcKiAqKXszLH0pKD86XFxcXG4rfCQpYCksXG4gIGZlbmNlc0JlZ2luUmVnZXg6IChpbmRlbnQ6IG51bWJlcikgPT4gbmV3IFJlZ0V4cChgXiB7MCwke01hdGgubWluKDMsIGluZGVudCAtIDEpfX0oPzpcXGBcXGBcXGB8fn5+KWApLFxuICBoZWFkaW5nQmVnaW5SZWdleDogKGluZGVudDogbnVtYmVyKSA9PiBuZXcgUmVnRXhwKGBeIHswLCR7TWF0aC5taW4oMywgaW5kZW50IC0gMSl9fSNgKSxcbiAgaHRtbEJlZ2luUmVnZXg6IChpbmRlbnQ6IG51bWJlcikgPT4gbmV3IFJlZ0V4cChgXiB7MCwke01hdGgubWluKDMsIGluZGVudCAtIDEpfX08KD86W2Etel0uKj58IS0tKWAsICdpJyksXG4gIGJsb2NrcXVvdGVCZWdpblJlZ2V4OiAoaW5kZW50OiBudW1iZXIpID0+IG5ldyBSZWdFeHAoYF4gezAsJHtNYXRoLm1pbigzLCBpbmRlbnQgLSAxKX19PmApLFxufTtcblxuLyoqXG4gKiBCbG9jay1MZXZlbCBHcmFtbWFyXG4gKi9cblxuY29uc3QgbmV3bGluZSA9IC9eKD86WyBcXHRdKig/OlxcbnwkKSkrLztcbmNvbnN0IGJsb2NrQ29kZSA9IC9eKCg/OiB7NH18IHswLDN9XFx0KVteXFxuXSsoPzpcXG4oPzpbIFxcdF0qKD86XFxufCQpKSopPykrLztcbmNvbnN0IGZlbmNlcyA9IC9eIHswLDN9KGB7Myx9KD89W15gXFxuXSooPzpcXG58JCkpfH57Myx9KShbXlxcbl0qKSg/OlxcbnwkKSg/OnwoW1xcc1xcU10qPykoPzpcXG58JCkpKD86IHswLDN9XFwxW35gXSogKig/PVxcbnwkKXwkKS87XG5jb25zdCBociA9IC9eIHswLDN9KCg/Oi1bXFx0IF0qKXszLH18KD86X1sgXFx0XSopezMsfXwoPzpcXCpbIFxcdF0qKXszLH0pKD86XFxuK3wkKS87XG5jb25zdCBoZWFkaW5nID0gL14gezAsM30oI3sxLDZ9KSg/PVxcc3wkKSguKikoPzpcXG4rfCQpLztcbmNvbnN0IGJ1bGxldCA9IC8gezAsM30oPzpbKistXXxcXGR7MSw5fVsuKV0pLztcbmNvbnN0IGxoZWFkaW5nQ29yZSA9IC9eKD8hYnVsbCB8YmxvY2tDb2RlfGZlbmNlc3xibG9ja3F1b3RlfGhlYWRpbmd8aHRtbHx0YWJsZSkoKD86LnxcXG4oPyFcXHMqP1xcbnxidWxsIHxibG9ja0NvZGV8ZmVuY2VzfGJsb2NrcXVvdGV8aGVhZGluZ3xodG1sfHRhYmxlKSkrPylcXG4gezAsM30oPSt8LSspICooPzpcXG4rfCQpLztcbmNvbnN0IGxoZWFkaW5nID0gZWRpdChsaGVhZGluZ0NvcmUpXG4gIC5yZXBsYWNlKC9idWxsL2csIGJ1bGxldCkgLy8gbGlzdHMgY2FuIGludGVycnVwdFxuICAucmVwbGFjZSgvYmxvY2tDb2RlL2csIC8oPzogezR9fCB7MCwzfVxcdCkvKSAvLyBpbmRlbnRlZCBjb2RlIGJsb2NrcyBjYW4gaW50ZXJydXB0XG4gIC5yZXBsYWNlKC9mZW5jZXMvZywgLyB7MCwzfSg/OmB7Myx9fH57Myx9KS8pIC8vIGZlbmNlZCBjb2RlIGJsb2NrcyBjYW4gaW50ZXJydXB0XG4gIC5yZXBsYWNlKC9ibG9ja3F1b3RlL2csIC8gezAsM30+LykgLy8gYmxvY2txdW90ZSBjYW4gaW50ZXJydXB0XG4gIC5yZXBsYWNlKC9oZWFkaW5nL2csIC8gezAsM30jezEsNn0vKSAvLyBBVFggaGVhZGluZyBjYW4gaW50ZXJydXB0XG4gIC5yZXBsYWNlKC9odG1sL2csIC8gezAsM308W15cXG4+XSs+XFxuLykgLy8gYmxvY2sgaHRtbCBjYW4gaW50ZXJydXB0XG4gIC5yZXBsYWNlKC9cXHx0YWJsZS9nLCAnJykgLy8gdGFibGUgbm90IGluIGNvbW1vbm1hcmtcbiAgLmdldFJlZ2V4KCk7XG5jb25zdCBsaGVhZGluZ0dmbSA9IGVkaXQobGhlYWRpbmdDb3JlKVxuICAucmVwbGFjZSgvYnVsbC9nLCBidWxsZXQpIC8vIGxpc3RzIGNhbiBpbnRlcnJ1cHRcbiAgLnJlcGxhY2UoL2Jsb2NrQ29kZS9nLCAvKD86IHs0fXwgezAsM31cXHQpLykgLy8gaW5kZW50ZWQgY29kZSBibG9ja3MgY2FuIGludGVycnVwdFxuICAucmVwbGFjZSgvZmVuY2VzL2csIC8gezAsM30oPzpgezMsfXx+ezMsfSkvKSAvLyBmZW5jZWQgY29kZSBibG9ja3MgY2FuIGludGVycnVwdFxuICAucmVwbGFjZSgvYmxvY2txdW90ZS9nLCAvIHswLDN9Pi8pIC8vIGJsb2NrcXVvdGUgY2FuIGludGVycnVwdFxuICAucmVwbGFjZSgvaGVhZGluZy9nLCAvIHswLDN9I3sxLDZ9LykgLy8gQVRYIGhlYWRpbmcgY2FuIGludGVycnVwdFxuICAucmVwbGFjZSgvaHRtbC9nLCAvIHswLDN9PFteXFxuPl0rPlxcbi8pIC8vIGJsb2NrIGh0bWwgY2FuIGludGVycnVwdFxuICAucmVwbGFjZSgvdGFibGUvZywgLyB7MCwzfVxcfD8oPzpbOlxcLSBdKlxcfCkrW1xcOlxcLSBdKlxcbi8pIC8vIHRhYmxlIGNhbiBpbnRlcnJ1cHRcbiAgLmdldFJlZ2V4KCk7XG5jb25zdCBfcGFyYWdyYXBoID0gL14oW15cXG5dKyg/Olxcbig/IWhyfGhlYWRpbmd8bGhlYWRpbmd8YmxvY2txdW90ZXxmZW5jZXN8bGlzdHxodG1sfHRhYmxlfCArXFxuKVteXFxuXSspKikvO1xuY29uc3QgYmxvY2tUZXh0ID0gL15bXlxcbl0rLztcbmNvbnN0IF9ibG9ja0xhYmVsID0gLyg/IVxccypcXF0pKD86XFxcXFtcXHNcXFNdfFteXFxbXFxdXFxcXF0pKy87XG5jb25zdCBkZWYgPSBlZGl0KC9eIHswLDN9XFxbKGxhYmVsKVxcXTogKig/OlxcblsgXFx0XSopPyhbXjxcXHNdW15cXHNdKnw8Lio/PikoPzooPzogKyg/OlxcblsgXFx0XSopP3wgKlxcblsgXFx0XSopKHRpdGxlKSk/ICooPzpcXG4rfCQpLylcbiAgLnJlcGxhY2UoJ2xhYmVsJywgX2Jsb2NrTGFiZWwpXG4gIC5yZXBsYWNlKCd0aXRsZScsIC8oPzpcIig/OlxcXFxcIj98W15cIlxcXFxdKSpcInwnW14nXFxuXSooPzpcXG5bXidcXG5dKykqXFxuPyd8XFwoW14oKV0qXFwpKS8pXG4gIC5nZXRSZWdleCgpO1xuXG5jb25zdCBsaXN0ID0gZWRpdCgvXihidWxsKShbIFxcdF1bXlxcbl0rPyk/KD86XFxufCQpLylcbiAgLnJlcGxhY2UoL2J1bGwvZywgYnVsbGV0KVxuICAuZ2V0UmVnZXgoKTtcblxuY29uc3QgX3RhZyA9ICdhZGRyZXNzfGFydGljbGV8YXNpZGV8YmFzZXxiYXNlZm9udHxibG9ja3F1b3RlfGJvZHl8Y2FwdGlvbidcbiAgKyAnfGNlbnRlcnxjb2x8Y29sZ3JvdXB8ZGR8ZGV0YWlsc3xkaWFsb2d8ZGlyfGRpdnxkbHxkdHxmaWVsZHNldHxmaWdjYXB0aW9uJ1xuICArICd8ZmlndXJlfGZvb3Rlcnxmb3JtfGZyYW1lfGZyYW1lc2V0fGhbMS02XXxoZWFkfGhlYWRlcnxocnxodG1sfGlmcmFtZSdcbiAgKyAnfGxlZ2VuZHxsaXxsaW5rfG1haW58bWVudXxtZW51aXRlbXxtZXRhfG5hdnxub2ZyYW1lc3xvbHxvcHRncm91cHxvcHRpb24nXG4gICsgJ3xwfHBhcmFtfHNlYXJjaHxzZWN0aW9ufHN1bW1hcnl8dGFibGV8dGJvZHl8dGR8dGZvb3R8dGh8dGhlYWR8dGl0bGUnXG4gICsgJ3x0cnx0cmFja3x1bCc7XG5jb25zdCBfY29tbWVudCA9IC88IS0tKD86LT8+fFtcXHNcXFNdKj8oPzotLT58JCkpLztcbmNvbnN0IGh0bWwgPSBlZGl0KFxuICAnXiB7MCwzfSg/OicgLy8gb3B0aW9uYWwgaW5kZW50YXRpb25cbisgJzwoc2NyaXB0fHByZXxzdHlsZXx0ZXh0YXJlYSlbXFxcXHM+XVtcXFxcc1xcXFxTXSo/KD86PC9cXFxcMT5bXlxcXFxuXSpcXFxcbit8JCknIC8vICgxKVxuKyAnfGNvbW1lbnRbXlxcXFxuXSooXFxcXG4rfCQpJyAvLyAoMilcbisgJ3w8XFxcXD9bXFxcXHNcXFxcU10qPyg/OlxcXFw/PlxcXFxuKnwkKScgLy8gKDMpXG4rICd8PCFbQS1aXVtcXFxcc1xcXFxTXSo/KD86PlxcXFxuKnwkKScgLy8gKDQpXG4rICd8PCFcXFxcW0NEQVRBXFxcXFtbXFxcXHNcXFxcU10qPyg/OlxcXFxdXFxcXF0+XFxcXG4qfCQpJyAvLyAoNSlcbisgJ3w8Lz8odGFnKSg/OiArfFxcXFxufC8/PilbXFxcXHNcXFxcU10qPyg/Oig/OlxcXFxuWyBcXHRdKikrXFxcXG58JCknIC8vICg2KVxuKyAnfDwoPyFzY3JpcHR8cHJlfHN0eWxlfHRleHRhcmVhKShbYS16XVtcXFxcdy1dKikoPzphdHRyaWJ1dGUpKj8gKi8/Pig/PVsgXFxcXHRdKig/OlxcXFxufCQpKVtcXFxcc1xcXFxTXSo/KD86KD86XFxcXG5bIFxcdF0qKStcXFxcbnwkKScgLy8gKDcpIG9wZW4gdGFnXG4rICd8PC8oPyFzY3JpcHR8cHJlfHN0eWxlfHRleHRhcmVhKVthLXpdW1xcXFx3LV0qXFxcXHMqPig/PVsgXFxcXHRdKig/OlxcXFxufCQpKVtcXFxcc1xcXFxTXSo/KD86KD86XFxcXG5bIFxcdF0qKStcXFxcbnwkKScgLy8gKDcpIGNsb3NpbmcgdGFnXG4rICcpJywgJ2knKVxuICAucmVwbGFjZSgnY29tbWVudCcsIF9jb21tZW50KVxuICAucmVwbGFjZSgndGFnJywgX3RhZylcbiAgLnJlcGxhY2UoJ2F0dHJpYnV0ZScsIC8gK1thLXpBLVo6X11bXFx3LjotXSooPzogKj0gKlwiW15cIlxcbl0qXCJ8ICo9IConW14nXFxuXSonfCAqPSAqW15cXHNcIic9PD5gXSspPy8pXG4gIC5nZXRSZWdleCgpO1xuXG5jb25zdCBwYXJhZ3JhcGggPSBlZGl0KF9wYXJhZ3JhcGgpXG4gIC5yZXBsYWNlKCdocicsIGhyKVxuICAucmVwbGFjZSgnaGVhZGluZycsICcgezAsM30jezEsNn0oPzpcXFxcc3wkKScpXG4gIC5yZXBsYWNlKCd8bGhlYWRpbmcnLCAnJykgLy8gc2V0ZXh0IGhlYWRpbmdzIGRvbid0IGludGVycnVwdCBjb21tb25tYXJrIHBhcmFncmFwaHNcbiAgLnJlcGxhY2UoJ3x0YWJsZScsICcnKVxuICAucmVwbGFjZSgnYmxvY2txdW90ZScsICcgezAsM30+JylcbiAgLnJlcGxhY2UoJ2ZlbmNlcycsICcgezAsM30oPzpgezMsfSg/PVteYFxcXFxuXSpcXFxcbil8fnszLH0pW15cXFxcbl0qXFxcXG4nKVxuICAucmVwbGFjZSgnbGlzdCcsICcgezAsM30oPzpbKistXXwxWy4pXSlbIFxcXFx0XScpIC8vIG9ubHkgbGlzdHMgc3RhcnRpbmcgZnJvbSAxIGNhbiBpbnRlcnJ1cHRcbiAgLnJlcGxhY2UoJ2h0bWwnLCAnPC8/KD86dGFnKSg/OiArfFxcXFxufC8/Pil8PCg/OnNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWF8IS0tKScpXG4gIC5yZXBsYWNlKCd0YWcnLCBfdGFnKSAvLyBwYXJzIGNhbiBiZSBpbnRlcnJ1cHRlZCBieSB0eXBlICg2KSBodG1sIGJsb2Nrc1xuICAuZ2V0UmVnZXgoKTtcblxuY29uc3QgYmxvY2txdW90ZSA9IGVkaXQoL14oIHswLDN9PiA/KHBhcmFncmFwaHxbXlxcbl0qKSg/OlxcbnwkKSkrLylcbiAgLnJlcGxhY2UoJ3BhcmFncmFwaCcsIHBhcmFncmFwaClcbiAgLmdldFJlZ2V4KCk7XG5cbi8qKlxuICogTm9ybWFsIEJsb2NrIEdyYW1tYXJcbiAqL1xuXG5jb25zdCBibG9ja05vcm1hbCA9IHtcbiAgYmxvY2txdW90ZSxcbiAgY29kZTogYmxvY2tDb2RlLFxuICBkZWYsXG4gIGZlbmNlcyxcbiAgaGVhZGluZyxcbiAgaHIsXG4gIGh0bWwsXG4gIGxoZWFkaW5nLFxuICBsaXN0LFxuICBuZXdsaW5lLFxuICBwYXJhZ3JhcGgsXG4gIHRhYmxlOiBub29wVGVzdCxcbiAgdGV4dDogYmxvY2tUZXh0LFxufTtcblxudHlwZSBCbG9ja0tleXMgPSBrZXlvZiB0eXBlb2YgYmxvY2tOb3JtYWw7XG5cbi8qKlxuICogR0ZNIEJsb2NrIEdyYW1tYXJcbiAqL1xuXG5jb25zdCBnZm1UYWJsZSA9IGVkaXQoXG4gICdeICooW15cXFxcbiBdLiopXFxcXG4nIC8vIEhlYWRlclxuKyAnIHswLDN9KCg/OlxcXFx8ICopPzo/LSs6PyAqKD86XFxcXHwgKjo/LSs6PyAqKSooPzpcXFxcfCAqKT8pJyAvLyBBbGlnblxuKyAnKD86XFxcXG4oKD86KD8hICpcXFxcbnxocnxoZWFkaW5nfGJsb2NrcXVvdGV8Y29kZXxmZW5jZXN8bGlzdHxodG1sKS4qKD86XFxcXG58JCkpKilcXFxcbip8JCknKSAvLyBDZWxsc1xuICAucmVwbGFjZSgnaHInLCBocilcbiAgLnJlcGxhY2UoJ2hlYWRpbmcnLCAnIHswLDN9I3sxLDZ9KD86XFxcXHN8JCknKVxuICAucmVwbGFjZSgnYmxvY2txdW90ZScsICcgezAsM30+JylcbiAgLnJlcGxhY2UoJ2NvZGUnLCAnKD86IHs0fXwgezAsM31cXHQpW15cXFxcbl0nKVxuICAucmVwbGFjZSgnZmVuY2VzJywgJyB7MCwzfSg/OmB7Myx9KD89W15gXFxcXG5dKlxcXFxuKXx+ezMsfSlbXlxcXFxuXSpcXFxcbicpXG4gIC5yZXBsYWNlKCdsaXN0JywgJyB7MCwzfSg/OlsqKy1dfDFbLildKVsgXFxcXHRdJykgLy8gb25seSBsaXN0cyBzdGFydGluZyBmcm9tIDEgY2FuIGludGVycnVwdFxuICAucmVwbGFjZSgnaHRtbCcsICc8Lz8oPzp0YWcpKD86ICt8XFxcXG58Lz8+KXw8KD86c2NyaXB0fHByZXxzdHlsZXx0ZXh0YXJlYXwhLS0pJylcbiAgLnJlcGxhY2UoJ3RhZycsIF90YWcpIC8vIHRhYmxlcyBjYW4gYmUgaW50ZXJydXB0ZWQgYnkgdHlwZSAoNikgaHRtbCBibG9ja3NcbiAgLmdldFJlZ2V4KCk7XG5cbmNvbnN0IGJsb2NrR2ZtOiBSZWNvcmQ8QmxvY2tLZXlzLCBSZWdFeHA+ID0ge1xuICAuLi5ibG9ja05vcm1hbCxcbiAgbGhlYWRpbmc6IGxoZWFkaW5nR2ZtLFxuICB0YWJsZTogZ2ZtVGFibGUsXG4gIHBhcmFncmFwaDogZWRpdChfcGFyYWdyYXBoKVxuICAgIC5yZXBsYWNlKCdocicsIGhyKVxuICAgIC5yZXBsYWNlKCdoZWFkaW5nJywgJyB7MCwzfSN7MSw2fSg/OlxcXFxzfCQpJylcbiAgICAucmVwbGFjZSgnfGxoZWFkaW5nJywgJycpIC8vIHNldGV4dCBoZWFkaW5ncyBkb24ndCBpbnRlcnJ1cHQgY29tbW9ubWFyayBwYXJhZ3JhcGhzXG4gICAgLnJlcGxhY2UoJ3RhYmxlJywgZ2ZtVGFibGUpIC8vIGludGVycnVwdCBwYXJhZ3JhcGhzIHdpdGggdGFibGVcbiAgICAucmVwbGFjZSgnYmxvY2txdW90ZScsICcgezAsM30+JylcbiAgICAucmVwbGFjZSgnZmVuY2VzJywgJyB7MCwzfSg/OmB7Myx9KD89W15gXFxcXG5dKlxcXFxuKXx+ezMsfSlbXlxcXFxuXSpcXFxcbicpXG4gICAgLnJlcGxhY2UoJ2xpc3QnLCAnIHswLDN9KD86WyorLV18MVsuKV0pWyBcXFxcdF0nKSAvLyBvbmx5IGxpc3RzIHN0YXJ0aW5nIGZyb20gMSBjYW4gaW50ZXJydXB0XG4gICAgLnJlcGxhY2UoJ2h0bWwnLCAnPC8/KD86dGFnKSg/OiArfFxcXFxufC8/Pil8PCg/OnNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWF8IS0tKScpXG4gICAgLnJlcGxhY2UoJ3RhZycsIF90YWcpIC8vIHBhcnMgY2FuIGJlIGludGVycnVwdGVkIGJ5IHR5cGUgKDYpIGh0bWwgYmxvY2tzXG4gICAgLmdldFJlZ2V4KCksXG59O1xuXG4vKipcbiAqIFBlZGFudGljIGdyYW1tYXIgKG9yaWdpbmFsIEpvaG4gR3J1YmVyJ3MgbG9vc2UgbWFya2Rvd24gc3BlY2lmaWNhdGlvbilcbiAqL1xuXG5jb25zdCBibG9ja1BlZGFudGljOiBSZWNvcmQ8QmxvY2tLZXlzLCBSZWdFeHA+ID0ge1xuICAuLi5ibG9ja05vcm1hbCxcbiAgaHRtbDogZWRpdChcbiAgICAnXiAqKD86Y29tbWVudCAqKD86XFxcXG58XFxcXHMqJCknXG4gICAgKyAnfDwodGFnKVtcXFxcc1xcXFxTXSs/PC9cXFxcMT4gKig/OlxcXFxuezIsfXxcXFxccyokKScgLy8gY2xvc2VkIHRhZ1xuICAgICsgJ3w8dGFnKD86XCJbXlwiXSpcInxcXCdbXlxcJ10qXFwnfFxcXFxzW15cXCdcIi8+XFxcXHNdKikqPy8/PiAqKD86XFxcXG57Mix9fFxcXFxzKiQpKScpXG4gICAgLnJlcGxhY2UoJ2NvbW1lbnQnLCBfY29tbWVudClcbiAgICAucmVwbGFjZSgvdGFnL2csICcoPyEoPzonXG4gICAgICArICdhfGVtfHN0cm9uZ3xzbWFsbHxzfGNpdGV8cXxkZm58YWJicnxkYXRhfHRpbWV8Y29kZXx2YXJ8c2FtcHxrYmR8c3ViJ1xuICAgICAgKyAnfHN1cHxpfGJ8dXxtYXJrfHJ1Ynl8cnR8cnB8YmRpfGJkb3xzcGFufGJyfHdicnxpbnN8ZGVsfGltZyknXG4gICAgICArICdcXFxcYilcXFxcdysoPyE6fFteXFxcXHdcXFxcc0BdKkApXFxcXGInKVxuICAgIC5nZXRSZWdleCgpLFxuICBkZWY6IC9eICpcXFsoW15cXF1dKylcXF06ICo8PyhbXlxccz5dKyk+Pyg/OiArKFtcIihdW15cXG5dK1tcIildKSk/ICooPzpcXG4rfCQpLyxcbiAgaGVhZGluZzogL14oI3sxLDZ9KSguKikoPzpcXG4rfCQpLyxcbiAgZmVuY2VzOiBub29wVGVzdCwgLy8gZmVuY2VzIG5vdCBzdXBwb3J0ZWRcbiAgbGhlYWRpbmc6IC9eKC4rPylcXG4gezAsM30oPSt8LSspICooPzpcXG4rfCQpLyxcbiAgcGFyYWdyYXBoOiBlZGl0KF9wYXJhZ3JhcGgpXG4gICAgLnJlcGxhY2UoJ2hyJywgaHIpXG4gICAgLnJlcGxhY2UoJ2hlYWRpbmcnLCAnICojezEsNn0gKlteXFxuXScpXG4gICAgLnJlcGxhY2UoJ2xoZWFkaW5nJywgbGhlYWRpbmcpXG4gICAgLnJlcGxhY2UoJ3x0YWJsZScsICcnKVxuICAgIC5yZXBsYWNlKCdibG9ja3F1b3RlJywgJyB7MCwzfT4nKVxuICAgIC5yZXBsYWNlKCd8ZmVuY2VzJywgJycpXG4gICAgLnJlcGxhY2UoJ3xsaXN0JywgJycpXG4gICAgLnJlcGxhY2UoJ3xodG1sJywgJycpXG4gICAgLnJlcGxhY2UoJ3x0YWcnLCAnJylcbiAgICAuZ2V0UmVnZXgoKSxcbn07XG5cbi8qKlxuICogSW5saW5lLUxldmVsIEdyYW1tYXJcbiAqL1xuXG5jb25zdCBlc2NhcGUgPSAvXlxcXFwoWyFcIiMkJSYnKCkqKyxcXC0uLzo7PD0+P0BcXFtcXF1cXFxcXl9ge3x9fl0pLztcbmNvbnN0IGlubGluZUNvZGUgPSAvXihgKykoW15gXXxbXmBdW1xcc1xcU10qP1teYF0pXFwxKD8hYCkvO1xuY29uc3QgYnIgPSAvXiggezIsfXxcXFxcKVxcbig/IVxccyokKS87XG5jb25zdCBpbmxpbmVUZXh0ID0gL14oYCt8W15gXSkoPzooPz0gezIsfVxcbil8W1xcc1xcU10qPyg/Oig/PVtcXFxcPCFcXFtgKl9dfFxcYl98JCl8W14gXSg/PSB7Mix9XFxuKSkpLztcblxuLy8gbGlzdCBvZiB1bmljb2RlIHB1bmN0dWF0aW9uIG1hcmtzLCBwbHVzIGFueSBtaXNzaW5nIGNoYXJhY3RlcnMgZnJvbSBDb21tb25NYXJrIHNwZWNcbmNvbnN0IF9wdW5jdHVhdGlvbiA9IC9bXFxwe1B9XFxwe1N9XS91O1xuY29uc3QgX3B1bmN0dWF0aW9uT3JTcGFjZSA9IC9bXFxzXFxwe1B9XFxwe1N9XS91O1xuY29uc3QgX25vdFB1bmN0dWF0aW9uT3JTcGFjZSA9IC9bXlxcc1xccHtQfVxccHtTfV0vdTtcbmNvbnN0IHB1bmN0dWF0aW9uID0gZWRpdCgvXigoPyFbKl9dKXB1bmN0U3BhY2UpLywgJ3UnKVxuICAucmVwbGFjZSgvcHVuY3RTcGFjZS9nLCBfcHVuY3R1YXRpb25PclNwYWNlKS5nZXRSZWdleCgpO1xuXG4vLyBHRk0gYWxsb3dzIH4gaW5zaWRlIHN0cm9uZyBhbmQgZW0gZm9yIHN0cmlrZXRocm91Z2hcbmNvbnN0IF9wdW5jdHVhdGlvbkdmbVN0cm9uZ0VtID0gLyg/IX4pW1xccHtQfVxccHtTfV0vdTtcbmNvbnN0IF9wdW5jdHVhdGlvbk9yU3BhY2VHZm1TdHJvbmdFbSA9IC8oPyF+KVtcXHNcXHB7UH1cXHB7U31dL3U7XG5jb25zdCBfbm90UHVuY3R1YXRpb25PclNwYWNlR2ZtU3Ryb25nRW0gPSAvKD86W15cXHNcXHB7UH1cXHB7U31dfH4pL3U7XG5cbi8vIHNlcXVlbmNlcyBlbSBzaG91bGQgc2tpcCBvdmVyIFt0aXRsZV0obGluayksIGBjb2RlYCwgPGh0bWw+XG5jb25zdCBibG9ja1NraXAgPSBlZGl0KC9saW5rfHByZWNvZGUtY29kZXxodG1sLywgJ2cnKVxuICAucmVwbGFjZSgnbGluaycsIC9cXFsoPzpbXlxcW1xcXWBdfCg/PGE+YCspW15gXStcXGs8YT4oPyFgKSkqP1xcXVxcKCg/OlxcXFxbXFxzXFxTXXxbXlxcXFxcXChcXCldfFxcKCg/OlxcXFxbXFxzXFxTXXxbXlxcXFxcXChcXCldKSpcXCkpKlxcKS8pXG4gIC5yZXBsYWNlKCdwcmVjb2RlLScsIHN1cHBvcnRzTG9va2JlaGluZCA/ICcoPzwhYCkoKScgOiAnKF5efFteYF0pJylcbiAgLnJlcGxhY2UoJ2NvZGUnLCAvKD88Yj5gKylbXmBdK1xcazxiPig/IWApLylcbiAgLnJlcGxhY2UoJ2h0bWwnLCAvPCg/ISApW148Pl0qPz4vKVxuICAuZ2V0UmVnZXgoKTtcblxuY29uc3QgZW1TdHJvbmdMRGVsaW1Db3JlID0gL14oPzpcXCorKD86KCg/IVxcKilwdW5jdCl8KFteXFxzKl0pKT8pfF5fKyg/OigoPyFfKXB1bmN0KXwoW15cXHNfXSkpPy87XG5cbmNvbnN0IGVtU3Ryb25nTERlbGltID0gZWRpdChlbVN0cm9uZ0xEZWxpbUNvcmUsICd1JylcbiAgLnJlcGxhY2UoL3B1bmN0L2csIF9wdW5jdHVhdGlvbilcbiAgLmdldFJlZ2V4KCk7XG5cbmNvbnN0IGVtU3Ryb25nTERlbGltR2ZtID0gZWRpdChlbVN0cm9uZ0xEZWxpbUNvcmUsICd1JylcbiAgLnJlcGxhY2UoL3B1bmN0L2csIF9wdW5jdHVhdGlvbkdmbVN0cm9uZ0VtKVxuICAuZ2V0UmVnZXgoKTtcblxuY29uc3QgZW1TdHJvbmdSRGVsaW1Bc3RDb3JlID1cbiAgJ15bXl8qXSo/X19bXl8qXSo/XFxcXCpbXl8qXSo/KD89X18pJyAvLyBTa2lwIG9ycGhhbiBpbnNpZGUgc3Ryb25nXG4rICd8W14qXSsoPz1bXipdKScgLy8gQ29uc3VtZSB0byBkZWxpbVxuKyAnfCg/IVxcXFwqKXB1bmN0KFxcXFwqKykoPz1bXFxcXHNdfCQpJyAvLyAoMSkgIyoqKiBjYW4gb25seSBiZSBhIFJpZ2h0IERlbGltaXRlclxuKyAnfG5vdFB1bmN0U3BhY2UoXFxcXCorKSg/IVxcXFwqKSg/PXB1bmN0U3BhY2V8JCknIC8vICgyKSBhKioqIywgYSoqKiBjYW4gb25seSBiZSBhIFJpZ2h0IERlbGltaXRlclxuKyAnfCg/IVxcXFwqKXB1bmN0U3BhY2UoXFxcXCorKSg/PW5vdFB1bmN0U3BhY2UpJyAvLyAoMykgIyoqKmEsICoqKmEgY2FuIG9ubHkgYmUgTGVmdCBEZWxpbWl0ZXJcbisgJ3xbXFxcXHNdKFxcXFwqKykoPyFcXFxcKikoPz1wdW5jdCknIC8vICg0KSAqKiojIGNhbiBvbmx5IGJlIExlZnQgRGVsaW1pdGVyXG4rICd8KD8hXFxcXCopcHVuY3QoXFxcXCorKSg/IVxcXFwqKSg/PXB1bmN0KScgLy8gKDUpICMqKiojIGNhbiBiZSBlaXRoZXIgTGVmdCBvciBSaWdodCBEZWxpbWl0ZXJcbisgJ3xub3RQdW5jdFNwYWNlKFxcXFwqKykoPz1ub3RQdW5jdFNwYWNlKSc7IC8vICg2KSBhKioqYSBjYW4gYmUgZWl0aGVyIExlZnQgb3IgUmlnaHQgRGVsaW1pdGVyXG5cbmNvbnN0IGVtU3Ryb25nUkRlbGltQXN0ID0gZWRpdChlbVN0cm9uZ1JEZWxpbUFzdENvcmUsICdndScpXG4gIC5yZXBsYWNlKC9ub3RQdW5jdFNwYWNlL2csIF9ub3RQdW5jdHVhdGlvbk9yU3BhY2UpXG4gIC5yZXBsYWNlKC9wdW5jdFNwYWNlL2csIF9wdW5jdHVhdGlvbk9yU3BhY2UpXG4gIC5yZXBsYWNlKC9wdW5jdC9nLCBfcHVuY3R1YXRpb24pXG4gIC5nZXRSZWdleCgpO1xuXG5jb25zdCBlbVN0cm9uZ1JEZWxpbUFzdEdmbSA9IGVkaXQoZW1TdHJvbmdSRGVsaW1Bc3RDb3JlLCAnZ3UnKVxuICAucmVwbGFjZSgvbm90UHVuY3RTcGFjZS9nLCBfbm90UHVuY3R1YXRpb25PclNwYWNlR2ZtU3Ryb25nRW0pXG4gIC5yZXBsYWNlKC9wdW5jdFNwYWNlL2csIF9wdW5jdHVhdGlvbk9yU3BhY2VHZm1TdHJvbmdFbSlcbiAgLnJlcGxhY2UoL3B1bmN0L2csIF9wdW5jdHVhdGlvbkdmbVN0cm9uZ0VtKVxuICAuZ2V0UmVnZXgoKTtcblxuLy8gKDYpIE5vdCBhbGxvd2VkIGZvciBfXG5jb25zdCBlbVN0cm9uZ1JEZWxpbVVuZCA9IGVkaXQoXG4gICdeW15fKl0qP1xcXFwqXFxcXCpbXl8qXSo/X1teXypdKj8oPz1cXFxcKlxcXFwqKScgLy8gU2tpcCBvcnBoYW4gaW5zaWRlIHN0cm9uZ1xuKyAnfFteX10rKD89W15fXSknIC8vIENvbnN1bWUgdG8gZGVsaW1cbisgJ3woPyFfKXB1bmN0KF8rKSg/PVtcXFxcc118JCknIC8vICgxKSAjX19fIGNhbiBvbmx5IGJlIGEgUmlnaHQgRGVsaW1pdGVyXG4rICd8bm90UHVuY3RTcGFjZShfKykoPyFfKSg/PXB1bmN0U3BhY2V8JCknIC8vICgyKSBhX19fIywgYV9fXyBjYW4gb25seSBiZSBhIFJpZ2h0IERlbGltaXRlclxuKyAnfCg/IV8pcHVuY3RTcGFjZShfKykoPz1ub3RQdW5jdFNwYWNlKScgLy8gKDMpICNfX19hLCBfX19hIGNhbiBvbmx5IGJlIExlZnQgRGVsaW1pdGVyXG4rICd8W1xcXFxzXShfKykoPyFfKSg/PXB1bmN0KScgLy8gKDQpIF9fXyMgY2FuIG9ubHkgYmUgTGVmdCBEZWxpbWl0ZXJcbisgJ3woPyFfKXB1bmN0KF8rKSg/IV8pKD89cHVuY3QpJywgJ2d1JykgLy8gKDUpICNfX18jIGNhbiBiZSBlaXRoZXIgTGVmdCBvciBSaWdodCBEZWxpbWl0ZXJcbiAgLnJlcGxhY2UoL25vdFB1bmN0U3BhY2UvZywgX25vdFB1bmN0dWF0aW9uT3JTcGFjZSlcbiAgLnJlcGxhY2UoL3B1bmN0U3BhY2UvZywgX3B1bmN0dWF0aW9uT3JTcGFjZSlcbiAgLnJlcGxhY2UoL3B1bmN0L2csIF9wdW5jdHVhdGlvbilcbiAgLmdldFJlZ2V4KCk7XG5cbi8vIFRpbGRlIGxlZnQgZGVsaW1pdGVyIGZvciBzdHJpa2V0aHJvdWdoIChzaW1pbGFyIHRvIGVtU3Ryb25nTERlbGltIGZvciBhc3RlcmlzaylcbmNvbnN0IGRlbExEZWxpbSA9IGVkaXQoL15+fj8oPzooKD8hfilwdW5jdCl8W15cXHN+XSkvLCAndScpXG4gIC5yZXBsYWNlKC9wdW5jdC9nLCBfcHVuY3R1YXRpb24pXG4gIC5nZXRSZWdleCgpO1xuXG4vLyBUaWxkZSBkZWxpbWl0ZXIgcGF0dGVybnMgZm9yIHN0cmlrZXRocm91Z2ggKHNpbWlsYXIgdG8gYXN0ZXJpc2spXG5jb25zdCBkZWxSRGVsaW1Db3JlID1cbiAgJ15bXn5dKyg/PVtefl0pJyAvLyBDb25zdW1lIHRvIGRlbGltXG4rICd8KD8hfilwdW5jdCh+fj8pKD89W1xcXFxzXXwkKScgLy8gKDEpICN+fiBjYW4gb25seSBiZSBhIFJpZ2h0IERlbGltaXRlclxuKyAnfG5vdFB1bmN0U3BhY2Uofn4/KSg/IX4pKD89cHVuY3RTcGFjZXwkKScgLy8gKDIpIGF+fiMsIGF+fiBjYW4gb25seSBiZSBhIFJpZ2h0IERlbGltaXRlclxuKyAnfCg/IX4pcHVuY3RTcGFjZSh+fj8pKD89bm90UHVuY3RTcGFjZSknIC8vICgzKSAjfn5hLCB+fmEgY2FuIG9ubHkgYmUgTGVmdCBEZWxpbWl0ZXJcbisgJ3xbXFxcXHNdKH5+PykoPyF+KSg/PXB1bmN0KScgLy8gKDQpIH5+IyBjYW4gb25seSBiZSBMZWZ0IERlbGltaXRlclxuKyAnfCg/IX4pcHVuY3Qofn4/KSg/IX4pKD89cHVuY3QpJyAvLyAoNSkgI35+IyBjYW4gYmUgZWl0aGVyIExlZnQgb3IgUmlnaHQgRGVsaW1pdGVyXG4rICd8bm90UHVuY3RTcGFjZSh+fj8pKD89bm90UHVuY3RTcGFjZSknOyAvLyAoNikgYX5+YSBjYW4gYmUgZWl0aGVyIExlZnQgb3IgUmlnaHQgRGVsaW1pdGVyXG5cbmNvbnN0IGRlbFJEZWxpbSA9IGVkaXQoZGVsUkRlbGltQ29yZSwgJ2d1JylcbiAgLnJlcGxhY2UoL25vdFB1bmN0U3BhY2UvZywgX25vdFB1bmN0dWF0aW9uT3JTcGFjZSlcbiAgLnJlcGxhY2UoL3B1bmN0U3BhY2UvZywgX3B1bmN0dWF0aW9uT3JTcGFjZSlcbiAgLnJlcGxhY2UoL3B1bmN0L2csIF9wdW5jdHVhdGlvbilcbiAgLmdldFJlZ2V4KCk7XG5cbmNvbnN0IGFueVB1bmN0dWF0aW9uID0gZWRpdCgvXFxcXChwdW5jdCkvLCAnZ3UnKVxuICAucmVwbGFjZSgvcHVuY3QvZywgX3B1bmN0dWF0aW9uKVxuICAuZ2V0UmVnZXgoKTtcblxuY29uc3QgYXV0b2xpbmsgPSBlZGl0KC9ePChzY2hlbWU6W15cXHNcXHgwMC1cXHgxZjw+XSp8ZW1haWwpPi8pXG4gIC5yZXBsYWNlKCdzY2hlbWUnLCAvW2EtekEtWl1bYS16QS1aMC05Ky4tXXsxLDMxfS8pXG4gIC5yZXBsYWNlKCdlbWFpbCcsIC9bYS16QS1aMC05LiEjJCUmJyorLz0/Xl9ge3x9fi1dKyhAKVthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPyg/OlxcLlthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPykrKD8hWy1fXSkvKVxuICAuZ2V0UmVnZXgoKTtcblxuY29uc3QgX2lubGluZUNvbW1lbnQgPSBlZGl0KF9jb21tZW50KS5yZXBsYWNlKCcoPzotLT58JCknLCAnLS0+JykuZ2V0UmVnZXgoKTtcbmNvbnN0IHRhZyA9IGVkaXQoXG4gICdeY29tbWVudCdcbiAgICArICd8XjwvW2EtekEtWl1bXFxcXHc6LV0qXFxcXHMqPicgLy8gc2VsZi1jbG9zaW5nIHRhZ1xuICAgICsgJ3xePFthLXpBLVpdW1xcXFx3LV0qKD86YXR0cmlidXRlKSo/XFxcXHMqLz8+JyAvLyBvcGVuIHRhZ1xuICAgICsgJ3xePFxcXFw/W1xcXFxzXFxcXFNdKj9cXFxcPz4nIC8vIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24sIGUuZy4gPD9waHAgPz5cbiAgICArICd8XjwhW2EtekEtWl0rXFxcXHNbXFxcXHNcXFxcU10qPz4nIC8vIGRlY2xhcmF0aW9uLCBlLmcuIDwhRE9DVFlQRSBodG1sPlxuICAgICsgJ3xePCFcXFxcW0NEQVRBXFxcXFtbXFxcXHNcXFxcU10qP1xcXFxdXFxcXF0+JykgLy8gQ0RBVEEgc2VjdGlvblxuICAucmVwbGFjZSgnY29tbWVudCcsIF9pbmxpbmVDb21tZW50KVxuICAucmVwbGFjZSgnYXR0cmlidXRlJywgL1xccytbYS16QS1aOl9dW1xcdy46LV0qKD86XFxzKj1cXHMqXCJbXlwiXSpcInxcXHMqPVxccyonW14nXSonfFxccyo9XFxzKlteXFxzXCInPTw+YF0rKT8vKVxuICAuZ2V0UmVnZXgoKTtcblxuY29uc3QgX2lubGluZUxhYmVsID0gLyg/OlxcWyg/OlxcXFxbXFxzXFxTXXxbXlxcW1xcXVxcXFxdKSpcXF18XFxcXFtcXHNcXFNdfGArKD8hYClbXmBdKj9gKyg/IWApfGBgKyg/PVxcXSl8W15cXFtcXF1cXFxcYF0pKj8vO1xuXG5jb25zdCBsaW5rID0gZWRpdCgvXiE/XFxbKGxhYmVsKVxcXVxcKFxccyooaHJlZikoPzooPzpbIFxcdF0rKD86XFxuWyBcXHRdKik/fFxcblsgXFx0XSopKHRpdGxlKSk/XFxzKlxcKS8pXG4gIC5yZXBsYWNlKCdsYWJlbCcsIF9pbmxpbmVMYWJlbClcbiAgLnJlcGxhY2UoJ2hyZWYnLCAvPCg/OlxcXFwufFteXFxuPD5cXFxcXSkrPnxbXiBcXHRcXG5cXHgwMC1cXHgxZl0qLylcbiAgLnJlcGxhY2UoJ3RpdGxlJywgL1wiKD86XFxcXFwiP3xbXlwiXFxcXF0pKlwifCcoPzpcXFxcJz98W14nXFxcXF0pKid8XFwoKD86XFxcXFxcKT98W14pXFxcXF0pKlxcKS8pXG4gIC5nZXRSZWdleCgpO1xuXG5jb25zdCByZWZsaW5rID0gZWRpdCgvXiE/XFxbKGxhYmVsKVxcXVxcWyhyZWYpXFxdLylcbiAgLnJlcGxhY2UoJ2xhYmVsJywgX2lubGluZUxhYmVsKVxuICAucmVwbGFjZSgncmVmJywgX2Jsb2NrTGFiZWwpXG4gIC5nZXRSZWdleCgpO1xuXG5jb25zdCBub2xpbmsgPSBlZGl0KC9eIT9cXFsocmVmKVxcXSg/OlxcW1xcXSk/LylcbiAgLnJlcGxhY2UoJ3JlZicsIF9ibG9ja0xhYmVsKVxuICAuZ2V0UmVnZXgoKTtcblxuY29uc3QgcmVmbGlua1NlYXJjaCA9IGVkaXQoJ3JlZmxpbmt8bm9saW5rKD8hXFxcXCgpJywgJ2cnKVxuICAucmVwbGFjZSgncmVmbGluaycsIHJlZmxpbmspXG4gIC5yZXBsYWNlKCdub2xpbmsnLCBub2xpbmspXG4gIC5nZXRSZWdleCgpO1xuXG5jb25zdCBfY2FzZUluc2Vuc2l0aXZlUHJvdG9jb2wgPSAvW2hIXVt0VF1bdFRdW3BQXVtzU10/fFtmRl1bdFRdW3BQXS87XG5cbi8qKlxuICogTm9ybWFsIElubGluZSBHcmFtbWFyXG4gKi9cblxuY29uc3QgaW5saW5lTm9ybWFsID0ge1xuICBfYmFja3BlZGFsOiBub29wVGVzdCwgLy8gb25seSB1c2VkIGZvciBHRk0gdXJsXG4gIGFueVB1bmN0dWF0aW9uLFxuICBhdXRvbGluayxcbiAgYmxvY2tTa2lwLFxuICBicixcbiAgY29kZTogaW5saW5lQ29kZSxcbiAgZGVsOiBub29wVGVzdCxcbiAgZGVsTERlbGltOiBub29wVGVzdCxcbiAgZGVsUkRlbGltOiBub29wVGVzdCxcbiAgZW1TdHJvbmdMRGVsaW0sXG4gIGVtU3Ryb25nUkRlbGltQXN0LFxuICBlbVN0cm9uZ1JEZWxpbVVuZCxcbiAgZXNjYXBlLFxuICBsaW5rLFxuICBub2xpbmssXG4gIHB1bmN0dWF0aW9uLFxuICByZWZsaW5rLFxuICByZWZsaW5rU2VhcmNoLFxuICB0YWcsXG4gIHRleHQ6IGlubGluZVRleHQsXG4gIHVybDogbm9vcFRlc3QsXG59O1xuXG50eXBlIElubGluZUtleXMgPSBrZXlvZiB0eXBlb2YgaW5saW5lTm9ybWFsO1xuXG4vKipcbiAqIFBlZGFudGljIElubGluZSBHcmFtbWFyXG4gKi9cblxuY29uc3QgaW5saW5lUGVkYW50aWM6IFJlY29yZDxJbmxpbmVLZXlzLCBSZWdFeHA+ID0ge1xuICAuLi5pbmxpbmVOb3JtYWwsXG4gIGxpbms6IGVkaXQoL14hP1xcWyhsYWJlbClcXF1cXCgoLio/KVxcKS8pXG4gICAgLnJlcGxhY2UoJ2xhYmVsJywgX2lubGluZUxhYmVsKVxuICAgIC5nZXRSZWdleCgpLFxuICByZWZsaW5rOiBlZGl0KC9eIT9cXFsobGFiZWwpXFxdXFxzKlxcWyhbXlxcXV0qKVxcXS8pXG4gICAgLnJlcGxhY2UoJ2xhYmVsJywgX2lubGluZUxhYmVsKVxuICAgIC5nZXRSZWdleCgpLFxufTtcblxuLyoqXG4gKiBHRk0gSW5saW5lIEdyYW1tYXJcbiAqL1xuXG5jb25zdCBpbmxpbmVHZm06IFJlY29yZDxJbmxpbmVLZXlzLCBSZWdFeHA+ID0ge1xuICAuLi5pbmxpbmVOb3JtYWwsXG4gIGVtU3Ryb25nUkRlbGltQXN0OiBlbVN0cm9uZ1JEZWxpbUFzdEdmbSxcbiAgZW1TdHJvbmdMRGVsaW06IGVtU3Ryb25nTERlbGltR2ZtLFxuICBkZWxMRGVsaW0sXG4gIGRlbFJEZWxpbSxcbiAgdXJsOiBlZGl0KC9eKCg/OnByb3RvY29sKTpcXC9cXC98d3d3XFwuKSg/OlthLXpBLVowLTlcXC1dK1xcLj8pK1teXFxzPF0qfF5lbWFpbC8pXG4gICAgLnJlcGxhY2UoJ3Byb3RvY29sJywgX2Nhc2VJbnNlbnNpdGl2ZVByb3RvY29sKVxuICAgIC5yZXBsYWNlKCdlbWFpbCcsIC9bQS1aYS16MC05Ll8rLV0rKEApW2EtekEtWjAtOS1fXSsoPzpcXC5bYS16QS1aMC05LV9dKlthLXpBLVowLTldKSsoPyFbLV9dKS8pXG4gICAgLmdldFJlZ2V4KCksXG4gIF9iYWNrcGVkYWw6IC8oPzpbXj8hLiw6OypfJ1wifigpJl0rfFxcKFteKV0qXFwpfCYoPyFbYS16QS1aMC05XSs7JCl8Wz8hLiw6OypfJ1wifildKyg/ISQpKSsvLFxuICBkZWw6IC9eKH5+PykoPz1bXlxcc35dKSgoPzpcXFxcW1xcc1xcU118W15cXFxcXSkqPyg/OlxcXFxbXFxzXFxTXXxbXlxcc35cXFxcXSkpXFwxKD89W15+XXwkKS8sXG4gIHRleHQ6IGVkaXQoL14oW2B+XSt8W15gfl0pKD86KD89IHsyLH1cXG4pfCg/PVthLXpBLVowLTkuISMkJSYnKitcXC89P19ge1xcfH1+LV0rQCl8W1xcc1xcU10qPyg/Oig/PVtcXFxcPCFcXFtgKn5fXXxcXGJffHByb3RvY29sOlxcL1xcL3x3d3dcXC58JCl8W14gXSg/PSB7Mix9XFxuKXxbXmEtekEtWjAtOS4hIyQlJicqK1xcLz0/X2B7XFx8fX4tXSg/PVthLXpBLVowLTkuISMkJSYnKitcXC89P19ge1xcfH1+LV0rQCkpKS8pXG4gICAgLnJlcGxhY2UoJ3Byb3RvY29sJywgX2Nhc2VJbnNlbnNpdGl2ZVByb3RvY29sKVxuICAgIC5nZXRSZWdleCgpLFxufTtcblxuLyoqXG4gKiBHRk0gKyBMaW5lIEJyZWFrcyBJbmxpbmUgR3JhbW1hclxuICovXG5cbmNvbnN0IGlubGluZUJyZWFrczogUmVjb3JkPElubGluZUtleXMsIFJlZ0V4cD4gPSB7XG4gIC4uLmlubGluZUdmbSxcbiAgYnI6IGVkaXQoYnIpLnJlcGxhY2UoJ3syLH0nLCAnKicpLmdldFJlZ2V4KCksXG4gIHRleHQ6IGVkaXQoaW5saW5lR2ZtLnRleHQpXG4gICAgLnJlcGxhY2UoJ1xcXFxiXycsICdcXFxcYl98IHsyLH1cXFxcbicpXG4gICAgLnJlcGxhY2UoL1xcezIsXFx9L2csICcqJylcbiAgICAuZ2V0UmVnZXgoKSxcbn07XG5cbi8qKlxuICogZXhwb3J0c1xuICovXG5cbmV4cG9ydCBjb25zdCBibG9jayA9IHtcbiAgbm9ybWFsOiBibG9ja05vcm1hbCxcbiAgZ2ZtOiBibG9ja0dmbSxcbiAgcGVkYW50aWM6IGJsb2NrUGVkYW50aWMsXG59O1xuXG5leHBvcnQgY29uc3QgaW5saW5lID0ge1xuICBub3JtYWw6IGlubGluZU5vcm1hbCxcbiAgZ2ZtOiBpbmxpbmVHZm0sXG4gIGJyZWFrczogaW5saW5lQnJlYWtzLFxuICBwZWRhbnRpYzogaW5saW5lUGVkYW50aWMsXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFJ1bGVzIHtcbiAgb3RoZXI6IHR5cGVvZiBvdGhlclxuICBibG9jazogUmVjb3JkPEJsb2NrS2V5cywgUmVnRXhwPlxuICBpbmxpbmU6IFJlY29yZDxJbmxpbmVLZXlzLCBSZWdFeHA+XG59XG4iLCAiaW1wb3J0IHsgb3RoZXIgfSBmcm9tICcuL3J1bGVzLnRzJztcblxuLyoqXG4gKiBIZWxwZXJzXG4gKi9cbmNvbnN0IGVzY2FwZVJlcGxhY2VtZW50czogeyBbaW5kZXg6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAnJic6ICcmYW1wOycsXG4gICc8JzogJyZsdDsnLFxuICAnPic6ICcmZ3Q7JyxcbiAgJ1wiJzogJyZxdW90OycsXG4gIFwiJ1wiOiAnJiMzOTsnLFxufTtcbmNvbnN0IGdldEVzY2FwZVJlcGxhY2VtZW50ID0gKGNoOiBzdHJpbmcpID0+IGVzY2FwZVJlcGxhY2VtZW50c1tjaF07XG5cbmV4cG9ydCBmdW5jdGlvbiBlc2NhcGVIdG1sRW50aXRpZXMoaHRtbDogc3RyaW5nLCBlbmNvZGU/OiBib29sZWFuKSB7XG4gIGlmIChlbmNvZGUpIHtcbiAgICBpZiAob3RoZXIuZXNjYXBlVGVzdC50ZXN0KGh0bWwpKSB7XG4gICAgICByZXR1cm4gaHRtbC5yZXBsYWNlKG90aGVyLmVzY2FwZVJlcGxhY2UsIGdldEVzY2FwZVJlcGxhY2VtZW50KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKG90aGVyLmVzY2FwZVRlc3ROb0VuY29kZS50ZXN0KGh0bWwpKSB7XG4gICAgICByZXR1cm4gaHRtbC5yZXBsYWNlKG90aGVyLmVzY2FwZVJlcGxhY2VOb0VuY29kZSwgZ2V0RXNjYXBlUmVwbGFjZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBodG1sO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYW5VcmwoaHJlZjogc3RyaW5nKSB7XG4gIHRyeSB7XG4gICAgaHJlZiA9IGVuY29kZVVSSShocmVmKS5yZXBsYWNlKG90aGVyLnBlcmNlbnREZWNvZGUsICclJyk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBocmVmO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRDZWxscyh0YWJsZVJvdzogc3RyaW5nLCBjb3VudD86IG51bWJlcikge1xuICAvLyBlbnN1cmUgdGhhdCBldmVyeSBjZWxsLWRlbGltaXRpbmcgcGlwZSBoYXMgYSBzcGFjZVxuICAvLyBiZWZvcmUgaXQgdG8gZGlzdGluZ3Vpc2ggaXQgZnJvbSBhbiBlc2NhcGVkIHBpcGVcbiAgY29uc3Qgcm93ID0gdGFibGVSb3cucmVwbGFjZShvdGhlci5maW5kUGlwZSwgKG1hdGNoLCBvZmZzZXQsIHN0cikgPT4ge1xuICAgICAgbGV0IGVzY2FwZWQgPSBmYWxzZTtcbiAgICAgIGxldCBjdXJyID0gb2Zmc2V0O1xuICAgICAgd2hpbGUgKC0tY3VyciA+PSAwICYmIHN0cltjdXJyXSA9PT0gJ1xcXFwnKSBlc2NhcGVkID0gIWVzY2FwZWQ7XG4gICAgICBpZiAoZXNjYXBlZCkge1xuICAgICAgICAvLyBvZGQgbnVtYmVyIG9mIHNsYXNoZXMgbWVhbnMgfCBpcyBlc2NhcGVkXG4gICAgICAgIC8vIHNvIHdlIGxlYXZlIGl0IGFsb25lXG4gICAgICAgIHJldHVybiAnfCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBhZGQgc3BhY2UgYmVmb3JlIHVuZXNjYXBlZCB8XG4gICAgICAgIHJldHVybiAnIHwnO1xuICAgICAgfVxuICAgIH0pLFxuICAgIGNlbGxzID0gcm93LnNwbGl0KG90aGVyLnNwbGl0UGlwZSk7XG4gIGxldCBpID0gMDtcblxuICAvLyBGaXJzdC9sYXN0IGNlbGwgaW4gYSByb3cgY2Fubm90IGJlIGVtcHR5IGlmIGl0IGhhcyBubyBsZWFkaW5nL3RyYWlsaW5nIHBpcGVcbiAgaWYgKCFjZWxsc1swXS50cmltKCkpIHtcbiAgICBjZWxscy5zaGlmdCgpO1xuICB9XG4gIGlmIChjZWxscy5sZW5ndGggPiAwICYmICFjZWxscy5hdCgtMSk/LnRyaW0oKSkge1xuICAgIGNlbGxzLnBvcCgpO1xuICB9XG5cbiAgaWYgKGNvdW50KSB7XG4gICAgaWYgKGNlbGxzLmxlbmd0aCA+IGNvdW50KSB7XG4gICAgICBjZWxscy5zcGxpY2UoY291bnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB3aGlsZSAoY2VsbHMubGVuZ3RoIDwgY291bnQpIGNlbGxzLnB1c2goJycpO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoOyBpIDwgY2VsbHMubGVuZ3RoOyBpKyspIHtcbiAgICAvLyBsZWFkaW5nIG9yIHRyYWlsaW5nIHdoaXRlc3BhY2UgaXMgaWdub3JlZCBwZXIgdGhlIGdmbSBzcGVjXG4gICAgY2VsbHNbaV0gPSBjZWxsc1tpXS50cmltKCkucmVwbGFjZShvdGhlci5zbGFzaFBpcGUsICd8Jyk7XG4gIH1cbiAgcmV0dXJuIGNlbGxzO1xufVxuXG4vKipcbiAqIFJlbW92ZSB0cmFpbGluZyAnYydzLiBFcXVpdmFsZW50IHRvIHN0ci5yZXBsYWNlKC9jKiQvLCAnJykuXG4gKiAvYyokLyBpcyB2dWxuZXJhYmxlIHRvIFJFRE9TLlxuICpcbiAqIEBwYXJhbSBzdHJcbiAqIEBwYXJhbSBjXG4gKiBAcGFyYW0gaW52ZXJ0IFJlbW92ZSBzdWZmaXggb2Ygbm9uLWMgY2hhcnMgaW5zdGVhZC4gRGVmYXVsdCBmYWxzZXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydHJpbShzdHI6IHN0cmluZywgYzogc3RyaW5nLCBpbnZlcnQ/OiBib29sZWFuKSB7XG4gIGNvbnN0IGwgPSBzdHIubGVuZ3RoO1xuICBpZiAobCA9PT0gMCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIC8vIExlbmd0aCBvZiBzdWZmaXggbWF0Y2hpbmcgdGhlIGludmVydCBjb25kaXRpb24uXG4gIGxldCBzdWZmTGVuID0gMDtcblxuICAvLyBTdGVwIGxlZnQgdW50aWwgd2UgZmFpbCB0byBtYXRjaCB0aGUgaW52ZXJ0IGNvbmRpdGlvbi5cbiAgd2hpbGUgKHN1ZmZMZW4gPCBsKSB7XG4gICAgY29uc3QgY3VyckNoYXIgPSBzdHIuY2hhckF0KGwgLSBzdWZmTGVuIC0gMSk7XG4gICAgaWYgKGN1cnJDaGFyID09PSBjICYmICFpbnZlcnQpIHtcbiAgICAgIHN1ZmZMZW4rKztcbiAgICB9IGVsc2UgaWYgKGN1cnJDaGFyICE9PSBjICYmIGludmVydCkge1xuICAgICAgc3VmZkxlbisrO1xuICAgIH0gZWxzZSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3RyLnNsaWNlKDAsIGwgLSBzdWZmTGVuKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRDbG9zaW5nQnJhY2tldChzdHI6IHN0cmluZywgYjogc3RyaW5nKSB7XG4gIGlmIChzdHIuaW5kZXhPZihiWzFdKSA9PT0gLTEpIHtcbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICBsZXQgbGV2ZWwgPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgIGlmIChzdHJbaV0gPT09ICdcXFxcJykge1xuICAgICAgaSsrO1xuICAgIH0gZWxzZSBpZiAoc3RyW2ldID09PSBiWzBdKSB7XG4gICAgICBsZXZlbCsrO1xuICAgIH0gZWxzZSBpZiAoc3RyW2ldID09PSBiWzFdKSB7XG4gICAgICBsZXZlbC0tO1xuICAgICAgaWYgKGxldmVsIDwgMCkge1xuICAgICAgICByZXR1cm4gaTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKGxldmVsID4gMCkge1xuICAgIHJldHVybiAtMjtcbiAgfVxuXG4gIHJldHVybiAtMTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4cGFuZFRhYnMobGluZTogc3RyaW5nLCBpbmRlbnQgPSAwKSB7XG4gIGxldCBjb2wgPSBpbmRlbnQ7XG4gIGxldCBleHBhbmRlZCA9ICcnO1xuICBmb3IgKGNvbnN0IGNoYXIgb2YgbGluZSkge1xuICAgIGlmIChjaGFyID09PSAnXFx0Jykge1xuICAgICAgY29uc3QgYWRkZWQgPSA0IC0gKGNvbCAlIDQpO1xuICAgICAgZXhwYW5kZWQgKz0gJyAnLnJlcGVhdChhZGRlZCk7XG4gICAgICBjb2wgKz0gYWRkZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGV4cGFuZGVkICs9IGNoYXI7XG4gICAgICBjb2wrKztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXhwYW5kZWQ7XG59XG4iLCAiaW1wb3J0IHsgX2RlZmF1bHRzIH0gZnJvbSAnLi9kZWZhdWx0cy50cyc7XG5pbXBvcnQge1xuICBydHJpbSxcbiAgc3BsaXRDZWxscyxcbiAgZmluZENsb3NpbmdCcmFja2V0LFxuICBleHBhbmRUYWJzLFxufSBmcm9tICcuL2hlbHBlcnMudHMnO1xuaW1wb3J0IHR5cGUgeyBSdWxlcyB9IGZyb20gJy4vcnVsZXMudHMnO1xuaW1wb3J0IHR5cGUgeyBfTGV4ZXIgfSBmcm9tICcuL0xleGVyLnRzJztcbmltcG9ydCB0eXBlIHsgTGlua3MsIFRva2VucywgVG9rZW4gfSBmcm9tICcuL1Rva2Vucy50cyc7XG5pbXBvcnQgdHlwZSB7IE1hcmtlZE9wdGlvbnMgfSBmcm9tICcuL01hcmtlZE9wdGlvbnMudHMnO1xuXG5mdW5jdGlvbiBvdXRwdXRMaW5rKGNhcDogc3RyaW5nW10sIGxpbms6IFBpY2s8VG9rZW5zLkxpbmssICdocmVmJyB8ICd0aXRsZSc+LCByYXc6IHN0cmluZywgbGV4ZXI6IF9MZXhlciwgcnVsZXM6IFJ1bGVzKTogVG9rZW5zLkxpbmsgfCBUb2tlbnMuSW1hZ2Uge1xuICBjb25zdCBocmVmID0gbGluay5ocmVmO1xuICBjb25zdCB0aXRsZSA9IGxpbmsudGl0bGUgfHwgbnVsbDtcbiAgY29uc3QgdGV4dCA9IGNhcFsxXS5yZXBsYWNlKHJ1bGVzLm90aGVyLm91dHB1dExpbmtSZXBsYWNlLCAnJDEnKTtcblxuICBsZXhlci5zdGF0ZS5pbkxpbmsgPSB0cnVlO1xuICBjb25zdCB0b2tlbjogVG9rZW5zLkxpbmsgfCBUb2tlbnMuSW1hZ2UgPSB7XG4gICAgdHlwZTogY2FwWzBdLmNoYXJBdCgwKSA9PT0gJyEnID8gJ2ltYWdlJyA6ICdsaW5rJyxcbiAgICByYXcsXG4gICAgaHJlZixcbiAgICB0aXRsZSxcbiAgICB0ZXh0LFxuICAgIHRva2VuczogbGV4ZXIuaW5saW5lVG9rZW5zKHRleHQpLFxuICB9O1xuICBsZXhlci5zdGF0ZS5pbkxpbmsgPSBmYWxzZTtcbiAgcmV0dXJuIHRva2VuO1xufVxuXG5mdW5jdGlvbiBpbmRlbnRDb2RlQ29tcGVuc2F0aW9uKHJhdzogc3RyaW5nLCB0ZXh0OiBzdHJpbmcsIHJ1bGVzOiBSdWxlcykge1xuICBjb25zdCBtYXRjaEluZGVudFRvQ29kZSA9IHJhdy5tYXRjaChydWxlcy5vdGhlci5pbmRlbnRDb2RlQ29tcGVuc2F0aW9uKTtcblxuICBpZiAobWF0Y2hJbmRlbnRUb0NvZGUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gdGV4dDtcbiAgfVxuXG4gIGNvbnN0IGluZGVudFRvQ29kZSA9IG1hdGNoSW5kZW50VG9Db2RlWzFdO1xuXG4gIHJldHVybiB0ZXh0XG4gICAgLnNwbGl0KCdcXG4nKVxuICAgIC5tYXAobm9kZSA9PiB7XG4gICAgICBjb25zdCBtYXRjaEluZGVudEluTm9kZSA9IG5vZGUubWF0Y2gocnVsZXMub3RoZXIuYmVnaW5uaW5nU3BhY2UpO1xuICAgICAgaWYgKG1hdGNoSW5kZW50SW5Ob2RlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBbaW5kZW50SW5Ob2RlXSA9IG1hdGNoSW5kZW50SW5Ob2RlO1xuXG4gICAgICBpZiAoaW5kZW50SW5Ob2RlLmxlbmd0aCA+PSBpbmRlbnRUb0NvZGUubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBub2RlLnNsaWNlKGluZGVudFRvQ29kZS5sZW5ndGgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9KVxuICAgIC5qb2luKCdcXG4nKTtcbn1cblxuLyoqXG4gKiBUb2tlbml6ZXJcbiAqL1xuZXhwb3J0IGNsYXNzIF9Ub2tlbml6ZXI8UGFyc2VyT3V0cHV0ID0gc3RyaW5nLCBSZW5kZXJlck91dHB1dCA9IHN0cmluZz4ge1xuICBvcHRpb25zOiBNYXJrZWRPcHRpb25zPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+O1xuICBydWxlcyE6IFJ1bGVzOyAvLyBzZXQgYnkgdGhlIGxleGVyXG4gIGxleGVyITogX0xleGVyPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+OyAvLyBzZXQgYnkgdGhlIGxleGVyXG5cbiAgY29uc3RydWN0b3Iob3B0aW9ucz86IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4pIHtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IF9kZWZhdWx0cztcbiAgfVxuXG4gIHNwYWNlKHNyYzogc3RyaW5nKTogVG9rZW5zLlNwYWNlIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjYXAgPSB0aGlzLnJ1bGVzLmJsb2NrLm5ld2xpbmUuZXhlYyhzcmMpO1xuICAgIGlmIChjYXAgJiYgY2FwWzBdLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdzcGFjZScsXG4gICAgICAgIHJhdzogY2FwWzBdLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBjb2RlKHNyYzogc3RyaW5nKTogVG9rZW5zLkNvZGUgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuYmxvY2suY29kZS5leGVjKHNyYyk7XG4gICAgaWYgKGNhcCkge1xuICAgICAgY29uc3QgdGV4dCA9IGNhcFswXS5yZXBsYWNlKHRoaXMucnVsZXMub3RoZXIuY29kZVJlbW92ZUluZGVudCwgJycpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ2NvZGUnLFxuICAgICAgICByYXc6IGNhcFswXSxcbiAgICAgICAgY29kZUJsb2NrU3R5bGU6ICdpbmRlbnRlZCcsXG4gICAgICAgIHRleHQ6ICF0aGlzLm9wdGlvbnMucGVkYW50aWNcbiAgICAgICAgICA/IHJ0cmltKHRleHQsICdcXG4nKVxuICAgICAgICAgIDogdGV4dCxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgZmVuY2VzKHNyYzogc3RyaW5nKTogVG9rZW5zLkNvZGUgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuYmxvY2suZmVuY2VzLmV4ZWMoc3JjKTtcbiAgICBpZiAoY2FwKSB7XG4gICAgICBjb25zdCByYXcgPSBjYXBbMF07XG4gICAgICBjb25zdCB0ZXh0ID0gaW5kZW50Q29kZUNvbXBlbnNhdGlvbihyYXcsIGNhcFszXSB8fCAnJywgdGhpcy5ydWxlcyk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdjb2RlJyxcbiAgICAgICAgcmF3LFxuICAgICAgICBsYW5nOiBjYXBbMl0gPyBjYXBbMl0udHJpbSgpLnJlcGxhY2UodGhpcy5ydWxlcy5pbmxpbmUuYW55UHVuY3R1YXRpb24sICckMScpIDogY2FwWzJdLFxuICAgICAgICB0ZXh0LFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBoZWFkaW5nKHNyYzogc3RyaW5nKTogVG9rZW5zLkhlYWRpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuYmxvY2suaGVhZGluZy5leGVjKHNyYyk7XG4gICAgaWYgKGNhcCkge1xuICAgICAgbGV0IHRleHQgPSBjYXBbMl0udHJpbSgpO1xuXG4gICAgICAvLyByZW1vdmUgdHJhaWxpbmcgI3NcbiAgICAgIGlmICh0aGlzLnJ1bGVzLm90aGVyLmVuZGluZ0hhc2gudGVzdCh0ZXh0KSkge1xuICAgICAgICBjb25zdCB0cmltbWVkID0gcnRyaW0odGV4dCwgJyMnKTtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5wZWRhbnRpYykge1xuICAgICAgICAgIHRleHQgPSB0cmltbWVkLnRyaW0oKTtcbiAgICAgICAgfSBlbHNlIGlmICghdHJpbW1lZCB8fCB0aGlzLnJ1bGVzLm90aGVyLmVuZGluZ1NwYWNlQ2hhci50ZXN0KHRyaW1tZWQpKSB7XG4gICAgICAgICAgLy8gQ29tbW9uTWFyayByZXF1aXJlcyBzcGFjZSBiZWZvcmUgdHJhaWxpbmcgI3NcbiAgICAgICAgICB0ZXh0ID0gdHJpbW1lZC50cmltKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ2hlYWRpbmcnLFxuICAgICAgICByYXc6IGNhcFswXSxcbiAgICAgICAgZGVwdGg6IGNhcFsxXS5sZW5ndGgsXG4gICAgICAgIHRleHQsXG4gICAgICAgIHRva2VuczogdGhpcy5sZXhlci5pbmxpbmUodGV4dCksXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGhyKHNyYzogc3RyaW5nKTogVG9rZW5zLkhyIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjYXAgPSB0aGlzLnJ1bGVzLmJsb2NrLmhyLmV4ZWMoc3JjKTtcbiAgICBpZiAoY2FwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAnaHInLFxuICAgICAgICByYXc6IHJ0cmltKGNhcFswXSwgJ1xcbicpLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBibG9ja3F1b3RlKHNyYzogc3RyaW5nKTogVG9rZW5zLkJsb2NrcXVvdGUgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuYmxvY2suYmxvY2txdW90ZS5leGVjKHNyYyk7XG4gICAgaWYgKGNhcCkge1xuICAgICAgbGV0IGxpbmVzID0gcnRyaW0oY2FwWzBdLCAnXFxuJykuc3BsaXQoJ1xcbicpO1xuICAgICAgbGV0IHJhdyA9ICcnO1xuICAgICAgbGV0IHRleHQgPSAnJztcbiAgICAgIGNvbnN0IHRva2VuczogVG9rZW5bXSA9IFtdO1xuXG4gICAgICB3aGlsZSAobGluZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBsZXQgaW5CbG9ja3F1b3RlID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRMaW5lcyA9IFtdO1xuXG4gICAgICAgIGxldCBpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAvLyBnZXQgbGluZXMgdXAgdG8gYSBjb250aW51YXRpb25cbiAgICAgICAgICBpZiAodGhpcy5ydWxlcy5vdGhlci5ibG9ja3F1b3RlU3RhcnQudGVzdChsaW5lc1tpXSkpIHtcbiAgICAgICAgICAgIGN1cnJlbnRMaW5lcy5wdXNoKGxpbmVzW2ldKTtcbiAgICAgICAgICAgIGluQmxvY2txdW90ZSA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmICghaW5CbG9ja3F1b3RlKSB7XG4gICAgICAgICAgICBjdXJyZW50TGluZXMucHVzaChsaW5lc1tpXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsaW5lcyA9IGxpbmVzLnNsaWNlKGkpO1xuXG4gICAgICAgIGNvbnN0IGN1cnJlbnRSYXcgPSBjdXJyZW50TGluZXMuam9pbignXFxuJyk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRUZXh0ID0gY3VycmVudFJhd1xuICAgICAgICAgIC8vIHByZWNlZGUgc2V0ZXh0IGNvbnRpbnVhdGlvbiB3aXRoIDQgc3BhY2VzIHNvIGl0IGlzbid0IGEgc2V0ZXh0XG4gICAgICAgICAgLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5ibG9ja3F1b3RlU2V0ZXh0UmVwbGFjZSwgJ1xcbiAgICAkMScpXG4gICAgICAgICAgLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5ibG9ja3F1b3RlU2V0ZXh0UmVwbGFjZTIsICcnKTtcbiAgICAgICAgcmF3ID0gcmF3ID8gYCR7cmF3fVxcbiR7Y3VycmVudFJhd31gIDogY3VycmVudFJhdztcbiAgICAgICAgdGV4dCA9IHRleHQgPyBgJHt0ZXh0fVxcbiR7Y3VycmVudFRleHR9YCA6IGN1cnJlbnRUZXh0O1xuXG4gICAgICAgIC8vIHBhcnNlIGJsb2NrcXVvdGUgbGluZXMgYXMgdG9wIGxldmVsIHRva2Vuc1xuICAgICAgICAvLyBtZXJnZSBwYXJhZ3JhcGhzIGlmIHRoaXMgaXMgYSBjb250aW51YXRpb25cbiAgICAgICAgY29uc3QgdG9wID0gdGhpcy5sZXhlci5zdGF0ZS50b3A7XG4gICAgICAgIHRoaXMubGV4ZXIuc3RhdGUudG9wID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5sZXhlci5ibG9ja1Rva2VucyhjdXJyZW50VGV4dCwgdG9rZW5zLCB0cnVlKTtcbiAgICAgICAgdGhpcy5sZXhlci5zdGF0ZS50b3AgPSB0b3A7XG5cbiAgICAgICAgLy8gaWYgdGhlcmUgaXMgbm8gY29udGludWF0aW9uIHRoZW4gd2UgYXJlIGRvbmVcbiAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGFzdFRva2VuID0gdG9rZW5zLmF0KC0xKTtcblxuICAgICAgICBpZiAobGFzdFRva2VuPy50eXBlID09PSAnY29kZScpIHtcbiAgICAgICAgICAvLyBibG9ja3F1b3RlIGNvbnRpbnVhdGlvbiBjYW5ub3QgYmUgcHJlY2VkZWQgYnkgYSBjb2RlIGJsb2NrXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSBpZiAobGFzdFRva2VuPy50eXBlID09PSAnYmxvY2txdW90ZScpIHtcbiAgICAgICAgICAvLyBpbmNsdWRlIGNvbnRpbnVhdGlvbiBpbiBuZXN0ZWQgYmxvY2txdW90ZVxuICAgICAgICAgIGNvbnN0IG9sZFRva2VuID0gbGFzdFRva2VuIGFzIFRva2Vucy5CbG9ja3F1b3RlO1xuICAgICAgICAgIGNvbnN0IG5ld1RleHQgPSBvbGRUb2tlbi5yYXcgKyAnXFxuJyArIGxpbmVzLmpvaW4oJ1xcbicpO1xuICAgICAgICAgIGNvbnN0IG5ld1Rva2VuID0gdGhpcy5ibG9ja3F1b3RlKG5ld1RleHQpITtcbiAgICAgICAgICB0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdID0gbmV3VG9rZW47XG5cbiAgICAgICAgICByYXcgPSByYXcuc3Vic3RyaW5nKDAsIHJhdy5sZW5ndGggLSBvbGRUb2tlbi5yYXcubGVuZ3RoKSArIG5ld1Rva2VuLnJhdztcbiAgICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMCwgdGV4dC5sZW5ndGggLSBvbGRUb2tlbi50ZXh0Lmxlbmd0aCkgKyBuZXdUb2tlbi50ZXh0O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2UgaWYgKGxhc3RUb2tlbj8udHlwZSA9PT0gJ2xpc3QnKSB7XG4gICAgICAgICAgLy8gaW5jbHVkZSBjb250aW51YXRpb24gaW4gbmVzdGVkIGxpc3RcbiAgICAgICAgICBjb25zdCBvbGRUb2tlbiA9IGxhc3RUb2tlbiBhcyBUb2tlbnMuTGlzdDtcbiAgICAgICAgICBjb25zdCBuZXdUZXh0ID0gb2xkVG9rZW4ucmF3ICsgJ1xcbicgKyBsaW5lcy5qb2luKCdcXG4nKTtcbiAgICAgICAgICBjb25zdCBuZXdUb2tlbiA9IHRoaXMubGlzdChuZXdUZXh0KSE7XG4gICAgICAgICAgdG9rZW5zW3Rva2Vucy5sZW5ndGggLSAxXSA9IG5ld1Rva2VuO1xuXG4gICAgICAgICAgcmF3ID0gcmF3LnN1YnN0cmluZygwLCByYXcubGVuZ3RoIC0gbGFzdFRva2VuLnJhdy5sZW5ndGgpICsgbmV3VG9rZW4ucmF3O1xuICAgICAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cmluZygwLCB0ZXh0Lmxlbmd0aCAtIG9sZFRva2VuLnJhdy5sZW5ndGgpICsgbmV3VG9rZW4ucmF3O1xuICAgICAgICAgIGxpbmVzID0gbmV3VGV4dC5zdWJzdHJpbmcodG9rZW5zLmF0KC0xKSEucmF3Lmxlbmd0aCkuc3BsaXQoJ1xcbicpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdibG9ja3F1b3RlJyxcbiAgICAgICAgcmF3LFxuICAgICAgICB0b2tlbnMsXG4gICAgICAgIHRleHQsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGxpc3Qoc3JjOiBzdHJpbmcpOiBUb2tlbnMuTGlzdCB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGNhcCA9IHRoaXMucnVsZXMuYmxvY2subGlzdC5leGVjKHNyYyk7XG4gICAgaWYgKGNhcCkge1xuICAgICAgbGV0IGJ1bGwgPSBjYXBbMV0udHJpbSgpO1xuICAgICAgY29uc3QgaXNvcmRlcmVkID0gYnVsbC5sZW5ndGggPiAxO1xuXG4gICAgICBjb25zdCBsaXN0OiBUb2tlbnMuTGlzdCA9IHtcbiAgICAgICAgdHlwZTogJ2xpc3QnLFxuICAgICAgICByYXc6ICcnLFxuICAgICAgICBvcmRlcmVkOiBpc29yZGVyZWQsXG4gICAgICAgIHN0YXJ0OiBpc29yZGVyZWQgPyArYnVsbC5zbGljZSgwLCAtMSkgOiAnJyxcbiAgICAgICAgbG9vc2U6IGZhbHNlLFxuICAgICAgICBpdGVtczogW10sXG4gICAgICB9O1xuXG4gICAgICBidWxsID0gaXNvcmRlcmVkID8gYFxcXFxkezEsOX1cXFxcJHtidWxsLnNsaWNlKC0xKX1gIDogYFxcXFwke2J1bGx9YDtcblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5wZWRhbnRpYykge1xuICAgICAgICBidWxsID0gaXNvcmRlcmVkID8gYnVsbCA6ICdbKistXSc7XG4gICAgICB9XG5cbiAgICAgIC8vIEdldCBuZXh0IGxpc3QgaXRlbVxuICAgICAgY29uc3QgaXRlbVJlZ2V4ID0gdGhpcy5ydWxlcy5vdGhlci5saXN0SXRlbVJlZ2V4KGJ1bGwpO1xuICAgICAgbGV0IGVuZHNXaXRoQmxhbmtMaW5lID0gZmFsc2U7XG4gICAgICAvLyBDaGVjayBpZiBjdXJyZW50IGJ1bGxldCBwb2ludCBjYW4gc3RhcnQgYSBuZXcgTGlzdCBJdGVtXG4gICAgICB3aGlsZSAoc3JjKSB7XG4gICAgICAgIGxldCBlbmRFYXJseSA9IGZhbHNlO1xuICAgICAgICBsZXQgcmF3ID0gJyc7XG4gICAgICAgIGxldCBpdGVtQ29udGVudHMgPSAnJztcbiAgICAgICAgaWYgKCEoY2FwID0gaXRlbVJlZ2V4LmV4ZWMoc3JjKSkpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnJ1bGVzLmJsb2NrLmhyLnRlc3Qoc3JjKSkgeyAvLyBFbmQgbGlzdCBpZiBidWxsZXQgd2FzIGFjdHVhbGx5IEhSIChwb3NzaWJseSBtb3ZlIGludG8gaXRlbVJlZ2V4PylcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJhdyA9IGNhcFswXTtcbiAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyhyYXcubGVuZ3RoKTtcblxuICAgICAgICBsZXQgbGluZSA9IGV4cGFuZFRhYnMoY2FwWzJdLnNwbGl0KCdcXG4nLCAxKVswXSwgY2FwWzFdLmxlbmd0aCk7XG4gICAgICAgIGxldCBuZXh0TGluZSA9IHNyYy5zcGxpdCgnXFxuJywgMSlbMF07XG4gICAgICAgIGxldCBibGFua0xpbmUgPSAhbGluZS50cmltKCk7XG5cbiAgICAgICAgbGV0IGluZGVudCA9IDA7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMucGVkYW50aWMpIHtcbiAgICAgICAgICBpbmRlbnQgPSAyO1xuICAgICAgICAgIGl0ZW1Db250ZW50cyA9IGxpbmUudHJpbVN0YXJ0KCk7XG4gICAgICAgIH0gZWxzZSBpZiAoYmxhbmtMaW5lKSB7XG4gICAgICAgICAgaW5kZW50ID0gY2FwWzFdLmxlbmd0aCArIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaW5kZW50ID0gbGluZS5zZWFyY2godGhpcy5ydWxlcy5vdGhlci5ub25TcGFjZUNoYXIpOyAvLyBGaW5kIGZpcnN0IG5vbi1zcGFjZSBjaGFyXG4gICAgICAgICAgaW5kZW50ID0gaW5kZW50ID4gNCA/IDEgOiBpbmRlbnQ7IC8vIFRyZWF0IGluZGVudGVkIGNvZGUgYmxvY2tzICg+IDQgc3BhY2VzKSBhcyBoYXZpbmcgb25seSAxIGluZGVudFxuICAgICAgICAgIGl0ZW1Db250ZW50cyA9IGxpbmUuc2xpY2UoaW5kZW50KTtcbiAgICAgICAgICBpbmRlbnQgKz0gY2FwWzFdLmxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChibGFua0xpbmUgJiYgdGhpcy5ydWxlcy5vdGhlci5ibGFua0xpbmUudGVzdChuZXh0TGluZSkpIHsgLy8gSXRlbXMgYmVnaW4gd2l0aCBhdCBtb3N0IG9uZSBibGFuayBsaW5lXG4gICAgICAgICAgcmF3ICs9IG5leHRMaW5lICsgJ1xcbic7XG4gICAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyhuZXh0TGluZS5sZW5ndGggKyAxKTtcbiAgICAgICAgICBlbmRFYXJseSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWVuZEVhcmx5KSB7XG4gICAgICAgICAgY29uc3QgbmV4dEJ1bGxldFJlZ2V4ID0gdGhpcy5ydWxlcy5vdGhlci5uZXh0QnVsbGV0UmVnZXgoaW5kZW50KTtcbiAgICAgICAgICBjb25zdCBoclJlZ2V4ID0gdGhpcy5ydWxlcy5vdGhlci5oclJlZ2V4KGluZGVudCk7XG4gICAgICAgICAgY29uc3QgZmVuY2VzQmVnaW5SZWdleCA9IHRoaXMucnVsZXMub3RoZXIuZmVuY2VzQmVnaW5SZWdleChpbmRlbnQpO1xuICAgICAgICAgIGNvbnN0IGhlYWRpbmdCZWdpblJlZ2V4ID0gdGhpcy5ydWxlcy5vdGhlci5oZWFkaW5nQmVnaW5SZWdleChpbmRlbnQpO1xuICAgICAgICAgIGNvbnN0IGh0bWxCZWdpblJlZ2V4ID0gdGhpcy5ydWxlcy5vdGhlci5odG1sQmVnaW5SZWdleChpbmRlbnQpO1xuICAgICAgICAgIGNvbnN0IGJsb2NrcXVvdGVCZWdpblJlZ2V4ID0gdGhpcy5ydWxlcy5vdGhlci5ibG9ja3F1b3RlQmVnaW5SZWdleChpbmRlbnQpO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgZm9sbG93aW5nIGxpbmVzIHNob3VsZCBiZSBpbmNsdWRlZCBpbiBMaXN0IEl0ZW1cbiAgICAgICAgICB3aGlsZSAoc3JjKSB7XG4gICAgICAgICAgICBjb25zdCByYXdMaW5lID0gc3JjLnNwbGl0KCdcXG4nLCAxKVswXTtcbiAgICAgICAgICAgIGxldCBuZXh0TGluZVdpdGhvdXRUYWJzO1xuICAgICAgICAgICAgbmV4dExpbmUgPSByYXdMaW5lO1xuXG4gICAgICAgICAgICAvLyBSZS1hbGlnbiB0byBmb2xsb3cgY29tbW9ubWFyayBuZXN0aW5nIHJ1bGVzXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnBlZGFudGljKSB7XG4gICAgICAgICAgICAgIG5leHRMaW5lID0gbmV4dExpbmUucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLmxpc3RSZXBsYWNlTmVzdGluZywgJyAgJyk7XG4gICAgICAgICAgICAgIG5leHRMaW5lV2l0aG91dFRhYnMgPSBuZXh0TGluZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG5leHRMaW5lV2l0aG91dFRhYnMgPSBuZXh0TGluZS5yZXBsYWNlKHRoaXMucnVsZXMub3RoZXIudGFiQ2hhckdsb2JhbCwgJyAgICAnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRW5kIGxpc3QgaXRlbSBpZiBmb3VuZCBjb2RlIGZlbmNlc1xuICAgICAgICAgICAgaWYgKGZlbmNlc0JlZ2luUmVnZXgudGVzdChuZXh0TGluZSkpIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEVuZCBsaXN0IGl0ZW0gaWYgZm91bmQgc3RhcnQgb2YgbmV3IGhlYWRpbmdcbiAgICAgICAgICAgIGlmIChoZWFkaW5nQmVnaW5SZWdleC50ZXN0KG5leHRMaW5lKSkge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRW5kIGxpc3QgaXRlbSBpZiBmb3VuZCBzdGFydCBvZiBodG1sIGJsb2NrXG4gICAgICAgICAgICBpZiAoaHRtbEJlZ2luUmVnZXgudGVzdChuZXh0TGluZSkpIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEVuZCBsaXN0IGl0ZW0gaWYgZm91bmQgc3RhcnQgb2YgYmxvY2txdW90ZVxuICAgICAgICAgICAgaWYgKGJsb2NrcXVvdGVCZWdpblJlZ2V4LnRlc3QobmV4dExpbmUpKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBFbmQgbGlzdCBpdGVtIGlmIGZvdW5kIHN0YXJ0IG9mIG5ldyBidWxsZXRcbiAgICAgICAgICAgIGlmIChuZXh0QnVsbGV0UmVnZXgudGVzdChuZXh0TGluZSkpIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEhvcml6b250YWwgcnVsZSBmb3VuZFxuICAgICAgICAgICAgaWYgKGhyUmVnZXgudGVzdChuZXh0TGluZSkpIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChuZXh0TGluZVdpdGhvdXRUYWJzLnNlYXJjaCh0aGlzLnJ1bGVzLm90aGVyLm5vblNwYWNlQ2hhcikgPj0gaW5kZW50IHx8ICFuZXh0TGluZS50cmltKCkpIHsgLy8gRGVkZW50IGlmIHBvc3NpYmxlXG4gICAgICAgICAgICAgIGl0ZW1Db250ZW50cyArPSAnXFxuJyArIG5leHRMaW5lV2l0aG91dFRhYnMuc2xpY2UoaW5kZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIG5vdCBlbm91Z2ggaW5kZW50YXRpb25cbiAgICAgICAgICAgICAgaWYgKGJsYW5rTGluZSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gcGFyYWdyYXBoIGNvbnRpbnVhdGlvbiB1bmxlc3MgbGFzdCBsaW5lIHdhcyBhIGRpZmZlcmVudCBibG9jayBsZXZlbCBlbGVtZW50XG4gICAgICAgICAgICAgIGlmIChsaW5lLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci50YWJDaGFyR2xvYmFsLCAnICAgICcpLnNlYXJjaCh0aGlzLnJ1bGVzLm90aGVyLm5vblNwYWNlQ2hhcikgPj0gNCkgeyAvLyBpbmRlbnRlZCBjb2RlIGJsb2NrXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGZlbmNlc0JlZ2luUmVnZXgudGVzdChsaW5lKSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChoZWFkaW5nQmVnaW5SZWdleC50ZXN0KGxpbmUpKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGhyUmVnZXgudGVzdChsaW5lKSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaXRlbUNvbnRlbnRzICs9ICdcXG4nICsgbmV4dExpbmU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJsYW5rTGluZSA9ICFuZXh0TGluZS50cmltKCk7XG5cbiAgICAgICAgICAgIHJhdyArPSByYXdMaW5lICsgJ1xcbic7XG4gICAgICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHJhd0xpbmUubGVuZ3RoICsgMSk7XG4gICAgICAgICAgICBsaW5lID0gbmV4dExpbmVXaXRob3V0VGFicy5zbGljZShpbmRlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbGlzdC5sb29zZSkge1xuICAgICAgICAgIC8vIElmIHRoZSBwcmV2aW91cyBpdGVtIGVuZGVkIHdpdGggYSBibGFuayBsaW5lLCB0aGUgbGlzdCBpcyBsb29zZVxuICAgICAgICAgIGlmIChlbmRzV2l0aEJsYW5rTGluZSkge1xuICAgICAgICAgICAgbGlzdC5sb29zZSA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJ1bGVzLm90aGVyLmRvdWJsZUJsYW5rTGluZS50ZXN0KHJhdykpIHtcbiAgICAgICAgICAgIGVuZHNXaXRoQmxhbmtMaW5lID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsaXN0Lml0ZW1zLnB1c2goe1xuICAgICAgICAgIHR5cGU6ICdsaXN0X2l0ZW0nLFxuICAgICAgICAgIHJhdyxcbiAgICAgICAgICB0YXNrOiAhIXRoaXMub3B0aW9ucy5nZm0gJiYgdGhpcy5ydWxlcy5vdGhlci5saXN0SXNUYXNrLnRlc3QoaXRlbUNvbnRlbnRzKSxcbiAgICAgICAgICBsb29zZTogZmFsc2UsXG4gICAgICAgICAgdGV4dDogaXRlbUNvbnRlbnRzLFxuICAgICAgICAgIHRva2VuczogW10sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxpc3QucmF3ICs9IHJhdztcbiAgICAgIH1cblxuICAgICAgLy8gRG8gbm90IGNvbnN1bWUgbmV3bGluZXMgYXQgZW5kIG9mIGZpbmFsIGl0ZW0uIEFsdGVybmF0aXZlbHksIG1ha2UgaXRlbVJlZ2V4ICpzdGFydCogd2l0aCBhbnkgbmV3bGluZXMgdG8gc2ltcGxpZnkvc3BlZWQgdXAgZW5kc1dpdGhCbGFua0xpbmUgbG9naWNcbiAgICAgIGNvbnN0IGxhc3RJdGVtID0gbGlzdC5pdGVtcy5hdCgtMSk7XG4gICAgICBpZiAobGFzdEl0ZW0pIHtcbiAgICAgICAgbGFzdEl0ZW0ucmF3ID0gbGFzdEl0ZW0ucmF3LnRyaW1FbmQoKTtcbiAgICAgICAgbGFzdEl0ZW0udGV4dCA9IGxhc3RJdGVtLnRleHQudHJpbUVuZCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gbm90IGEgbGlzdCBzaW5jZSB0aGVyZSB3ZXJlIG5vIGl0ZW1zXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxpc3QucmF3ID0gbGlzdC5yYXcudHJpbUVuZCgpO1xuXG4gICAgICAvLyBJdGVtIGNoaWxkIHRva2VucyBoYW5kbGVkIGhlcmUgYXQgZW5kIGJlY2F1c2Ugd2UgbmVlZGVkIHRvIGhhdmUgdGhlIGZpbmFsIGl0ZW0gdG8gdHJpbSBpdCBmaXJzdFxuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGxpc3QuaXRlbXMpIHtcbiAgICAgICAgdGhpcy5sZXhlci5zdGF0ZS50b3AgPSBmYWxzZTtcbiAgICAgICAgaXRlbS50b2tlbnMgPSB0aGlzLmxleGVyLmJsb2NrVG9rZW5zKGl0ZW0udGV4dCwgW10pO1xuICAgICAgICBpZiAoaXRlbS50YXNrKSB7XG4gICAgICAgICAgLy8gUmVtb3ZlIGNoZWNrYm94IG1hcmtkb3duIGZyb20gaXRlbSB0b2tlbnNcbiAgICAgICAgICBpdGVtLnRleHQgPSBpdGVtLnRleHQucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLmxpc3RSZXBsYWNlVGFzaywgJycpO1xuICAgICAgICAgIGlmIChpdGVtLnRva2Vuc1swXT8udHlwZSA9PT0gJ3RleHQnIHx8IGl0ZW0udG9rZW5zWzBdPy50eXBlID09PSAncGFyYWdyYXBoJykge1xuICAgICAgICAgICAgaXRlbS50b2tlbnNbMF0ucmF3ID0gaXRlbS50b2tlbnNbMF0ucmF3LnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5saXN0UmVwbGFjZVRhc2ssICcnKTtcbiAgICAgICAgICAgIGl0ZW0udG9rZW5zWzBdLnRleHQgPSBpdGVtLnRva2Vuc1swXS50ZXh0LnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5saXN0UmVwbGFjZVRhc2ssICcnKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmxleGVyLmlubGluZVF1ZXVlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLnJ1bGVzLm90aGVyLmxpc3RJc1Rhc2sudGVzdCh0aGlzLmxleGVyLmlubGluZVF1ZXVlW2ldLnNyYykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxleGVyLmlubGluZVF1ZXVlW2ldLnNyYyA9IHRoaXMubGV4ZXIuaW5saW5lUXVldWVbaV0uc3JjLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5saXN0UmVwbGFjZVRhc2ssICcnKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHRhc2tSYXcgPSB0aGlzLnJ1bGVzLm90aGVyLmxpc3RUYXNrQ2hlY2tib3guZXhlYyhpdGVtLnJhdyk7XG4gICAgICAgICAgaWYgKHRhc2tSYXcpIHtcbiAgICAgICAgICAgIGNvbnN0IGNoZWNrYm94VG9rZW46IFRva2Vucy5DaGVja2JveCA9IHtcbiAgICAgICAgICAgICAgdHlwZTogJ2NoZWNrYm94JyxcbiAgICAgICAgICAgICAgcmF3OiB0YXNrUmF3WzBdICsgJyAnLFxuICAgICAgICAgICAgICBjaGVja2VkOiB0YXNrUmF3WzBdICE9PSAnWyBdJyxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpdGVtLmNoZWNrZWQgPSBjaGVja2JveFRva2VuLmNoZWNrZWQ7XG4gICAgICAgICAgICBpZiAobGlzdC5sb29zZSkge1xuICAgICAgICAgICAgICBpZiAoaXRlbS50b2tlbnNbMF0gJiYgWydwYXJhZ3JhcGgnLCAndGV4dCddLmluY2x1ZGVzKGl0ZW0udG9rZW5zWzBdLnR5cGUpICYmICd0b2tlbnMnIGluIGl0ZW0udG9rZW5zWzBdICYmIGl0ZW0udG9rZW5zWzBdLnRva2Vucykge1xuICAgICAgICAgICAgICAgIGl0ZW0udG9rZW5zWzBdLnJhdyA9IGNoZWNrYm94VG9rZW4ucmF3ICsgaXRlbS50b2tlbnNbMF0ucmF3O1xuICAgICAgICAgICAgICAgIGl0ZW0udG9rZW5zWzBdLnRleHQgPSBjaGVja2JveFRva2VuLnJhdyArIGl0ZW0udG9rZW5zWzBdLnRleHQ7XG4gICAgICAgICAgICAgICAgaXRlbS50b2tlbnNbMF0udG9rZW5zLnVuc2hpZnQoY2hlY2tib3hUb2tlbik7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaXRlbS50b2tlbnMudW5zaGlmdCh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiAncGFyYWdyYXBoJyxcbiAgICAgICAgICAgICAgICAgIHJhdzogY2hlY2tib3hUb2tlbi5yYXcsXG4gICAgICAgICAgICAgICAgICB0ZXh0OiBjaGVja2JveFRva2VuLnJhdyxcbiAgICAgICAgICAgICAgICAgIHRva2VuczogW2NoZWNrYm94VG9rZW5dLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpdGVtLnRva2Vucy51bnNoaWZ0KGNoZWNrYm94VG9rZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbGlzdC5sb29zZSkge1xuICAgICAgICAgIC8vIENoZWNrIGlmIGxpc3Qgc2hvdWxkIGJlIGxvb3NlXG4gICAgICAgICAgY29uc3Qgc3BhY2VycyA9IGl0ZW0udG9rZW5zLmZpbHRlcih0ID0+IHQudHlwZSA9PT0gJ3NwYWNlJyk7XG4gICAgICAgICAgY29uc3QgaGFzTXVsdGlwbGVMaW5lQnJlYWtzID0gc3BhY2Vycy5sZW5ndGggPiAwICYmIHNwYWNlcnMuc29tZSh0ID0+IHRoaXMucnVsZXMub3RoZXIuYW55TGluZS50ZXN0KHQucmF3KSk7XG5cbiAgICAgICAgICBsaXN0Lmxvb3NlID0gaGFzTXVsdGlwbGVMaW5lQnJlYWtzO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCBhbGwgaXRlbXMgdG8gbG9vc2UgaWYgbGlzdCBpcyBsb29zZVxuICAgICAgaWYgKGxpc3QubG9vc2UpIHtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGxpc3QuaXRlbXMpIHtcbiAgICAgICAgICBpdGVtLmxvb3NlID0gdHJ1ZTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHRva2VuIG9mIGl0ZW0udG9rZW5zKSB7XG4gICAgICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICAgICAgICAgIHRva2VuLnR5cGUgPSAncGFyYWdyYXBoJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGxpc3Q7XG4gICAgfVxuICB9XG5cbiAgaHRtbChzcmM6IHN0cmluZyk6IFRva2Vucy5IVE1MIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjYXAgPSB0aGlzLnJ1bGVzLmJsb2NrLmh0bWwuZXhlYyhzcmMpO1xuICAgIGlmIChjYXApIHtcbiAgICAgIGNvbnN0IHRva2VuOiBUb2tlbnMuSFRNTCA9IHtcbiAgICAgICAgdHlwZTogJ2h0bWwnLFxuICAgICAgICBibG9jazogdHJ1ZSxcbiAgICAgICAgcmF3OiBjYXBbMF0sXG4gICAgICAgIHByZTogY2FwWzFdID09PSAncHJlJyB8fCBjYXBbMV0gPT09ICdzY3JpcHQnIHx8IGNhcFsxXSA9PT0gJ3N0eWxlJyxcbiAgICAgICAgdGV4dDogY2FwWzBdLFxuICAgICAgfTtcbiAgICAgIHJldHVybiB0b2tlbjtcbiAgICB9XG4gIH1cblxuICBkZWYoc3JjOiBzdHJpbmcpOiBUb2tlbnMuRGVmIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjYXAgPSB0aGlzLnJ1bGVzLmJsb2NrLmRlZi5leGVjKHNyYyk7XG4gICAgaWYgKGNhcCkge1xuICAgICAgY29uc3QgdGFnID0gY2FwWzFdLnRvTG93ZXJDYXNlKCkucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLm11bHRpcGxlU3BhY2VHbG9iYWwsICcgJyk7XG4gICAgICBjb25zdCBocmVmID0gY2FwWzJdID8gY2FwWzJdLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5ocmVmQnJhY2tldHMsICckMScpLnJlcGxhY2UodGhpcy5ydWxlcy5pbmxpbmUuYW55UHVuY3R1YXRpb24sICckMScpIDogJyc7XG4gICAgICBjb25zdCB0aXRsZSA9IGNhcFszXSA/IGNhcFszXS5zdWJzdHJpbmcoMSwgY2FwWzNdLmxlbmd0aCAtIDEpLnJlcGxhY2UodGhpcy5ydWxlcy5pbmxpbmUuYW55UHVuY3R1YXRpb24sICckMScpIDogY2FwWzNdO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ2RlZicsXG4gICAgICAgIHRhZyxcbiAgICAgICAgcmF3OiBjYXBbMF0sXG4gICAgICAgIGhyZWYsXG4gICAgICAgIHRpdGxlLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICB0YWJsZShzcmM6IHN0cmluZyk6IFRva2Vucy5UYWJsZSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5ibG9jay50YWJsZS5leGVjKHNyYyk7XG4gICAgaWYgKCFjYXApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMucnVsZXMub3RoZXIudGFibGVEZWxpbWl0ZXIudGVzdChjYXBbMl0pKSB7XG4gICAgICAvLyBkZWxpbWl0ZXIgcm93IG11c3QgaGF2ZSBhIHBpcGUgKHwpIG9yIGNvbG9uICg6KSBvdGhlcndpc2UgaXQgaXMgYSBzZXRleHQgaGVhZGluZ1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGhlYWRlcnMgPSBzcGxpdENlbGxzKGNhcFsxXSk7XG4gICAgY29uc3QgYWxpZ25zID0gY2FwWzJdLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci50YWJsZUFsaWduQ2hhcnMsICcnKS5zcGxpdCgnfCcpO1xuICAgIGNvbnN0IHJvd3MgPSBjYXBbM10/LnRyaW0oKSA/IGNhcFszXS5yZXBsYWNlKHRoaXMucnVsZXMub3RoZXIudGFibGVSb3dCbGFua0xpbmUsICcnKS5zcGxpdCgnXFxuJykgOiBbXTtcblxuICAgIGNvbnN0IGl0ZW06IFRva2Vucy5UYWJsZSA9IHtcbiAgICAgIHR5cGU6ICd0YWJsZScsXG4gICAgICByYXc6IGNhcFswXSxcbiAgICAgIGhlYWRlcjogW10sXG4gICAgICBhbGlnbjogW10sXG4gICAgICByb3dzOiBbXSxcbiAgICB9O1xuXG4gICAgaWYgKGhlYWRlcnMubGVuZ3RoICE9PSBhbGlnbnMubGVuZ3RoKSB7XG4gICAgICAvLyBoZWFkZXIgYW5kIGFsaWduIGNvbHVtbnMgbXVzdCBiZSBlcXVhbCwgcm93cyBjYW4gYmUgZGlmZmVyZW50LlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgYWxpZ24gb2YgYWxpZ25zKSB7XG4gICAgICBpZiAodGhpcy5ydWxlcy5vdGhlci50YWJsZUFsaWduUmlnaHQudGVzdChhbGlnbikpIHtcbiAgICAgICAgaXRlbS5hbGlnbi5wdXNoKCdyaWdodCcpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnJ1bGVzLm90aGVyLnRhYmxlQWxpZ25DZW50ZXIudGVzdChhbGlnbikpIHtcbiAgICAgICAgaXRlbS5hbGlnbi5wdXNoKCdjZW50ZXInKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5ydWxlcy5vdGhlci50YWJsZUFsaWduTGVmdC50ZXN0KGFsaWduKSkge1xuICAgICAgICBpdGVtLmFsaWduLnB1c2goJ2xlZnQnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGl0ZW0uYWxpZ24ucHVzaChudWxsKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlYWRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGl0ZW0uaGVhZGVyLnB1c2goe1xuICAgICAgICB0ZXh0OiBoZWFkZXJzW2ldLFxuICAgICAgICB0b2tlbnM6IHRoaXMubGV4ZXIuaW5saW5lKGhlYWRlcnNbaV0pLFxuICAgICAgICBoZWFkZXI6IHRydWUsXG4gICAgICAgIGFsaWduOiBpdGVtLmFsaWduW2ldLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgICAgaXRlbS5yb3dzLnB1c2goc3BsaXRDZWxscyhyb3csIGl0ZW0uaGVhZGVyLmxlbmd0aCkubWFwKChjZWxsLCBpKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdGV4dDogY2VsbCxcbiAgICAgICAgICB0b2tlbnM6IHRoaXMubGV4ZXIuaW5saW5lKGNlbGwpLFxuICAgICAgICAgIGhlYWRlcjogZmFsc2UsXG4gICAgICAgICAgYWxpZ246IGl0ZW0uYWxpZ25baV0sXG4gICAgICAgIH07XG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGl0ZW07XG4gIH1cblxuICBsaGVhZGluZyhzcmM6IHN0cmluZyk6IFRva2Vucy5IZWFkaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjYXAgPSB0aGlzLnJ1bGVzLmJsb2NrLmxoZWFkaW5nLmV4ZWMoc3JjKTtcbiAgICBpZiAoY2FwKSB7XG4gICAgICBjb25zdCB0ZXh0ID0gY2FwWzFdLnRyaW0oKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdoZWFkaW5nJyxcbiAgICAgICAgcmF3OiBjYXBbMF0sXG4gICAgICAgIGRlcHRoOiBjYXBbMl0uY2hhckF0KDApID09PSAnPScgPyAxIDogMixcbiAgICAgICAgdGV4dCxcbiAgICAgICAgdG9rZW5zOiB0aGlzLmxleGVyLmlubGluZSh0ZXh0KSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcGFyYWdyYXBoKHNyYzogc3RyaW5nKTogVG9rZW5zLlBhcmFncmFwaCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5ibG9jay5wYXJhZ3JhcGguZXhlYyhzcmMpO1xuICAgIGlmIChjYXApIHtcbiAgICAgIGNvbnN0IHRleHQgPSBjYXBbMV0uY2hhckF0KGNhcFsxXS5sZW5ndGggLSAxKSA9PT0gJ1xcbidcbiAgICAgICAgPyBjYXBbMV0uc2xpY2UoMCwgLTEpXG4gICAgICAgIDogY2FwWzFdO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ3BhcmFncmFwaCcsXG4gICAgICAgIHJhdzogY2FwWzBdLFxuICAgICAgICB0ZXh0LFxuICAgICAgICB0b2tlbnM6IHRoaXMubGV4ZXIuaW5saW5lKHRleHQpLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICB0ZXh0KHNyYzogc3RyaW5nKTogVG9rZW5zLlRleHQgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuYmxvY2sudGV4dC5leGVjKHNyYyk7XG4gICAgaWYgKGNhcCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICByYXc6IGNhcFswXSxcbiAgICAgICAgdGV4dDogY2FwWzBdLFxuICAgICAgICB0b2tlbnM6IHRoaXMubGV4ZXIuaW5saW5lKGNhcFswXSksXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGVzY2FwZShzcmM6IHN0cmluZyk6IFRva2Vucy5Fc2NhcGUgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuaW5saW5lLmVzY2FwZS5leGVjKHNyYyk7XG4gICAgaWYgKGNhcCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ2VzY2FwZScsXG4gICAgICAgIHJhdzogY2FwWzBdLFxuICAgICAgICB0ZXh0OiBjYXBbMV0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHRhZyhzcmM6IHN0cmluZyk6IFRva2Vucy5UYWcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuaW5saW5lLnRhZy5leGVjKHNyYyk7XG4gICAgaWYgKGNhcCkge1xuICAgICAgaWYgKCF0aGlzLmxleGVyLnN0YXRlLmluTGluayAmJiB0aGlzLnJ1bGVzLm90aGVyLnN0YXJ0QVRhZy50ZXN0KGNhcFswXSkpIHtcbiAgICAgICAgdGhpcy5sZXhlci5zdGF0ZS5pbkxpbmsgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmxleGVyLnN0YXRlLmluTGluayAmJiB0aGlzLnJ1bGVzLm90aGVyLmVuZEFUYWcudGVzdChjYXBbMF0pKSB7XG4gICAgICAgIHRoaXMubGV4ZXIuc3RhdGUuaW5MaW5rID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMubGV4ZXIuc3RhdGUuaW5SYXdCbG9jayAmJiB0aGlzLnJ1bGVzLm90aGVyLnN0YXJ0UHJlU2NyaXB0VGFnLnRlc3QoY2FwWzBdKSkge1xuICAgICAgICB0aGlzLmxleGVyLnN0YXRlLmluUmF3QmxvY2sgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmxleGVyLnN0YXRlLmluUmF3QmxvY2sgJiYgdGhpcy5ydWxlcy5vdGhlci5lbmRQcmVTY3JpcHRUYWcudGVzdChjYXBbMF0pKSB7XG4gICAgICAgIHRoaXMubGV4ZXIuc3RhdGUuaW5SYXdCbG9jayA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAnaHRtbCcsXG4gICAgICAgIHJhdzogY2FwWzBdLFxuICAgICAgICBpbkxpbms6IHRoaXMubGV4ZXIuc3RhdGUuaW5MaW5rLFxuICAgICAgICBpblJhd0Jsb2NrOiB0aGlzLmxleGVyLnN0YXRlLmluUmF3QmxvY2ssXG4gICAgICAgIGJsb2NrOiBmYWxzZSxcbiAgICAgICAgdGV4dDogY2FwWzBdLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBsaW5rKHNyYzogc3RyaW5nKTogVG9rZW5zLkxpbmsgfCBUb2tlbnMuSW1hZ2UgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuaW5saW5lLmxpbmsuZXhlYyhzcmMpO1xuICAgIGlmIChjYXApIHtcbiAgICAgIGNvbnN0IHRyaW1tZWRVcmwgPSBjYXBbMl0udHJpbSgpO1xuICAgICAgaWYgKCF0aGlzLm9wdGlvbnMucGVkYW50aWMgJiYgdGhpcy5ydWxlcy5vdGhlci5zdGFydEFuZ2xlQnJhY2tldC50ZXN0KHRyaW1tZWRVcmwpKSB7XG4gICAgICAgIC8vIGNvbW1vbm1hcmsgcmVxdWlyZXMgbWF0Y2hpbmcgYW5nbGUgYnJhY2tldHNcbiAgICAgICAgaWYgKCEodGhpcy5ydWxlcy5vdGhlci5lbmRBbmdsZUJyYWNrZXQudGVzdCh0cmltbWVkVXJsKSkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlbmRpbmcgYW5nbGUgYnJhY2tldCBjYW5ub3QgYmUgZXNjYXBlZFxuICAgICAgICBjb25zdCBydHJpbVNsYXNoID0gcnRyaW0odHJpbW1lZFVybC5zbGljZSgwLCAtMSksICdcXFxcJyk7XG4gICAgICAgIGlmICgodHJpbW1lZFVybC5sZW5ndGggLSBydHJpbVNsYXNoLmxlbmd0aCkgJSAyID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBmaW5kIGNsb3NpbmcgcGFyZW50aGVzaXNcbiAgICAgICAgY29uc3QgbGFzdFBhcmVuSW5kZXggPSBmaW5kQ2xvc2luZ0JyYWNrZXQoY2FwWzJdLCAnKCknKTtcbiAgICAgICAgaWYgKGxhc3RQYXJlbkluZGV4ID09PSAtMikge1xuICAgICAgICAgIC8vIG1vcmUgb3BlbiBwYXJlbnMgdGhhbiBjbG9zZWRcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGFzdFBhcmVuSW5kZXggPiAtMSkge1xuICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gY2FwWzBdLmluZGV4T2YoJyEnKSA9PT0gMCA/IDUgOiA0O1xuICAgICAgICAgIGNvbnN0IGxpbmtMZW4gPSBzdGFydCArIGNhcFsxXS5sZW5ndGggKyBsYXN0UGFyZW5JbmRleDtcbiAgICAgICAgICBjYXBbMl0gPSBjYXBbMl0uc3Vic3RyaW5nKDAsIGxhc3RQYXJlbkluZGV4KTtcbiAgICAgICAgICBjYXBbMF0gPSBjYXBbMF0uc3Vic3RyaW5nKDAsIGxpbmtMZW4pLnRyaW0oKTtcbiAgICAgICAgICBjYXBbM10gPSAnJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGV0IGhyZWYgPSBjYXBbMl07XG4gICAgICBsZXQgdGl0bGUgPSAnJztcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMucGVkYW50aWMpIHtcbiAgICAgICAgLy8gc3BsaXQgcGVkYW50aWMgaHJlZiBhbmQgdGl0bGVcbiAgICAgICAgY29uc3QgbGluayA9IHRoaXMucnVsZXMub3RoZXIucGVkYW50aWNIcmVmVGl0bGUuZXhlYyhocmVmKTtcblxuICAgICAgICBpZiAobGluaykge1xuICAgICAgICAgIGhyZWYgPSBsaW5rWzFdO1xuICAgICAgICAgIHRpdGxlID0gbGlua1szXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGl0bGUgPSBjYXBbM10gPyBjYXBbM10uc2xpY2UoMSwgLTEpIDogJyc7XG4gICAgICB9XG5cbiAgICAgIGhyZWYgPSBocmVmLnRyaW0oKTtcbiAgICAgIGlmICh0aGlzLnJ1bGVzLm90aGVyLnN0YXJ0QW5nbGVCcmFja2V0LnRlc3QoaHJlZikpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5wZWRhbnRpYyAmJiAhKHRoaXMucnVsZXMub3RoZXIuZW5kQW5nbGVCcmFja2V0LnRlc3QodHJpbW1lZFVybCkpKSB7XG4gICAgICAgICAgLy8gcGVkYW50aWMgYWxsb3dzIHN0YXJ0aW5nIGFuZ2xlIGJyYWNrZXQgd2l0aG91dCBlbmRpbmcgYW5nbGUgYnJhY2tldFxuICAgICAgICAgIGhyZWYgPSBocmVmLnNsaWNlKDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGhyZWYgPSBocmVmLnNsaWNlKDEsIC0xKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG91dHB1dExpbmsoY2FwLCB7XG4gICAgICAgIGhyZWY6IGhyZWYgPyBocmVmLnJlcGxhY2UodGhpcy5ydWxlcy5pbmxpbmUuYW55UHVuY3R1YXRpb24sICckMScpIDogaHJlZixcbiAgICAgICAgdGl0bGU6IHRpdGxlID8gdGl0bGUucmVwbGFjZSh0aGlzLnJ1bGVzLmlubGluZS5hbnlQdW5jdHVhdGlvbiwgJyQxJykgOiB0aXRsZSxcbiAgICAgIH0sIGNhcFswXSwgdGhpcy5sZXhlciwgdGhpcy5ydWxlcyk7XG4gICAgfVxuICB9XG5cbiAgcmVmbGluayhzcmM6IHN0cmluZywgbGlua3M6IExpbmtzKTogVG9rZW5zLkxpbmsgfCBUb2tlbnMuSW1hZ2UgfCBUb2tlbnMuVGV4dCB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGNhcDtcbiAgICBpZiAoKGNhcCA9IHRoaXMucnVsZXMuaW5saW5lLnJlZmxpbmsuZXhlYyhzcmMpKVxuICAgICAgfHwgKGNhcCA9IHRoaXMucnVsZXMuaW5saW5lLm5vbGluay5leGVjKHNyYykpKSB7XG4gICAgICBjb25zdCBsaW5rU3RyaW5nID0gKGNhcFsyXSB8fCBjYXBbMV0pLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5tdWx0aXBsZVNwYWNlR2xvYmFsLCAnICcpO1xuICAgICAgY29uc3QgbGluayA9IGxpbmtzW2xpbmtTdHJpbmcudG9Mb3dlckNhc2UoKV07XG4gICAgICBpZiAoIWxpbmspIHtcbiAgICAgICAgY29uc3QgdGV4dCA9IGNhcFswXS5jaGFyQXQoMCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgIHJhdzogdGV4dCxcbiAgICAgICAgICB0ZXh0LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG91dHB1dExpbmsoY2FwLCBsaW5rLCBjYXBbMF0sIHRoaXMubGV4ZXIsIHRoaXMucnVsZXMpO1xuICAgIH1cbiAgfVxuXG4gIGVtU3Ryb25nKHNyYzogc3RyaW5nLCBtYXNrZWRTcmM6IHN0cmluZywgcHJldkNoYXIgPSAnJyk6IFRva2Vucy5FbSB8IFRva2Vucy5TdHJvbmcgfCB1bmRlZmluZWQge1xuICAgIGxldCBtYXRjaCA9IHRoaXMucnVsZXMuaW5saW5lLmVtU3Ryb25nTERlbGltLmV4ZWMoc3JjKTtcbiAgICBpZiAoIW1hdGNoKSByZXR1cm47XG4gICAgaWYgKCFtYXRjaFsxXSAmJiAhbWF0Y2hbMl0gJiYgIW1hdGNoWzNdICYmICFtYXRjaFs0XSkgcmV0dXJuO1xuXG4gICAgLy8gXyBjYW4ndCBiZSBiZXR3ZWVuIHR3byBhbHBoYW51bWVyaWNzLiBcXHB7TH1cXHB7Tn0gaW5jbHVkZXMgbm9uLWVuZ2xpc2ggYWxwaGFiZXQvbnVtYmVycyBhcyB3ZWxsXG4gICAgaWYgKG1hdGNoWzRdICYmIHByZXZDaGFyLm1hdGNoKHRoaXMucnVsZXMub3RoZXIudW5pY29kZUFscGhhTnVtZXJpYykpIHJldHVybjtcblxuICAgIGNvbnN0IG5leHRDaGFyID0gbWF0Y2hbMV0gfHwgbWF0Y2hbM10gfHwgJyc7XG5cbiAgICBpZiAoIW5leHRDaGFyIHx8ICFwcmV2Q2hhciB8fCB0aGlzLnJ1bGVzLmlubGluZS5wdW5jdHVhdGlvbi5leGVjKHByZXZDaGFyKSkge1xuICAgICAgLy8gdW5pY29kZSBSZWdleCBjb3VudHMgZW1vamkgYXMgMSBjaGFyOyBzcHJlYWQgaW50byBhcnJheSBmb3IgcHJvcGVyIGNvdW50ICh1c2VkIG11bHRpcGxlIHRpbWVzIGJlbG93KVxuICAgICAgY29uc3QgbExlbmd0aCA9IFsuLi5tYXRjaFswXV0ubGVuZ3RoIC0gMTtcbiAgICAgIGxldCByRGVsaW0sIHJMZW5ndGgsIGRlbGltVG90YWwgPSBsTGVuZ3RoLCBtaWREZWxpbVRvdGFsID0gMDtcblxuICAgICAgY29uc3QgZW5kUmVnID0gbWF0Y2hbMF1bMF0gPT09ICcqJyA/IHRoaXMucnVsZXMuaW5saW5lLmVtU3Ryb25nUkRlbGltQXN0IDogdGhpcy5ydWxlcy5pbmxpbmUuZW1TdHJvbmdSRGVsaW1VbmQ7XG4gICAgICBlbmRSZWcubGFzdEluZGV4ID0gMDtcblxuICAgICAgLy8gQ2xpcCBtYXNrZWRTcmMgdG8gc2FtZSBzZWN0aW9uIG9mIHN0cmluZyBhcyBzcmMgKG1vdmUgdG8gbGV4ZXI/KVxuICAgICAgbWFza2VkU3JjID0gbWFza2VkU3JjLnNsaWNlKC0xICogc3JjLmxlbmd0aCArIGxMZW5ndGgpO1xuXG4gICAgICB3aGlsZSAoKG1hdGNoID0gZW5kUmVnLmV4ZWMobWFza2VkU3JjKSkgIT0gbnVsbCkge1xuICAgICAgICByRGVsaW0gPSBtYXRjaFsxXSB8fCBtYXRjaFsyXSB8fCBtYXRjaFszXSB8fCBtYXRjaFs0XSB8fCBtYXRjaFs1XSB8fCBtYXRjaFs2XTtcblxuICAgICAgICBpZiAoIXJEZWxpbSkgY29udGludWU7IC8vIHNraXAgc2luZ2xlICogaW4gX19hYmMqYWJjX19cblxuICAgICAgICByTGVuZ3RoID0gWy4uLnJEZWxpbV0ubGVuZ3RoO1xuXG4gICAgICAgIGlmIChtYXRjaFszXSB8fCBtYXRjaFs0XSkgeyAvLyBmb3VuZCBhbm90aGVyIExlZnQgRGVsaW1cbiAgICAgICAgICBkZWxpbVRvdGFsICs9IHJMZW5ndGg7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSBpZiAobWF0Y2hbNV0gfHwgbWF0Y2hbNl0pIHsgLy8gZWl0aGVyIExlZnQgb3IgUmlnaHQgRGVsaW1cbiAgICAgICAgICBpZiAobExlbmd0aCAlIDMgJiYgISgobExlbmd0aCArIHJMZW5ndGgpICUgMykpIHtcbiAgICAgICAgICAgIG1pZERlbGltVG90YWwgKz0gckxlbmd0aDtcbiAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBDb21tb25NYXJrIEVtcGhhc2lzIFJ1bGVzIDktMTBcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBkZWxpbVRvdGFsIC09IHJMZW5ndGg7XG5cbiAgICAgICAgaWYgKGRlbGltVG90YWwgPiAwKSBjb250aW51ZTsgLy8gSGF2ZW4ndCBmb3VuZCBlbm91Z2ggY2xvc2luZyBkZWxpbWl0ZXJzXG5cbiAgICAgICAgLy8gUmVtb3ZlIGV4dHJhIGNoYXJhY3RlcnMuICphKioqIC0+ICphKlxuICAgICAgICByTGVuZ3RoID0gTWF0aC5taW4ockxlbmd0aCwgckxlbmd0aCArIGRlbGltVG90YWwgKyBtaWREZWxpbVRvdGFsKTtcbiAgICAgICAgLy8gY2hhciBsZW5ndGggY2FuIGJlID4xIGZvciB1bmljb2RlIGNoYXJhY3RlcnM7XG4gICAgICAgIGNvbnN0IGxhc3RDaGFyTGVuZ3RoID0gWy4uLm1hdGNoWzBdXVswXS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IHJhdyA9IHNyYy5zbGljZSgwLCBsTGVuZ3RoICsgbWF0Y2guaW5kZXggKyBsYXN0Q2hhckxlbmd0aCArIHJMZW5ndGgpO1xuXG4gICAgICAgIC8vIENyZWF0ZSBgZW1gIGlmIHNtYWxsZXN0IGRlbGltaXRlciBoYXMgb2RkIGNoYXIgY291bnQuICphKioqXG4gICAgICAgIGlmIChNYXRoLm1pbihsTGVuZ3RoLCByTGVuZ3RoKSAlIDIpIHtcbiAgICAgICAgICBjb25zdCB0ZXh0ID0gcmF3LnNsaWNlKDEsIC0xKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogJ2VtJyxcbiAgICAgICAgICAgIHJhdyxcbiAgICAgICAgICAgIHRleHQsXG4gICAgICAgICAgICB0b2tlbnM6IHRoaXMubGV4ZXIuaW5saW5lVG9rZW5zKHRleHQpLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDcmVhdGUgJ3N0cm9uZycgaWYgc21hbGxlc3QgZGVsaW1pdGVyIGhhcyBldmVuIGNoYXIgY291bnQuICoqYSoqKlxuICAgICAgICBjb25zdCB0ZXh0ID0gcmF3LnNsaWNlKDIsIC0yKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiAnc3Ryb25nJyxcbiAgICAgICAgICByYXcsXG4gICAgICAgICAgdGV4dCxcbiAgICAgICAgICB0b2tlbnM6IHRoaXMubGV4ZXIuaW5saW5lVG9rZW5zKHRleHQpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvZGVzcGFuKHNyYzogc3RyaW5nKTogVG9rZW5zLkNvZGVzcGFuIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjYXAgPSB0aGlzLnJ1bGVzLmlubGluZS5jb2RlLmV4ZWMoc3JjKTtcbiAgICBpZiAoY2FwKSB7XG4gICAgICBsZXQgdGV4dCA9IGNhcFsyXS5yZXBsYWNlKHRoaXMucnVsZXMub3RoZXIubmV3TGluZUNoYXJHbG9iYWwsICcgJyk7XG4gICAgICBjb25zdCBoYXNOb25TcGFjZUNoYXJzID0gdGhpcy5ydWxlcy5vdGhlci5ub25TcGFjZUNoYXIudGVzdCh0ZXh0KTtcbiAgICAgIGNvbnN0IGhhc1NwYWNlQ2hhcnNPbkJvdGhFbmRzID0gdGhpcy5ydWxlcy5vdGhlci5zdGFydGluZ1NwYWNlQ2hhci50ZXN0KHRleHQpICYmIHRoaXMucnVsZXMub3RoZXIuZW5kaW5nU3BhY2VDaGFyLnRlc3QodGV4dCk7XG4gICAgICBpZiAoaGFzTm9uU3BhY2VDaGFycyAmJiBoYXNTcGFjZUNoYXJzT25Cb3RoRW5kcykge1xuICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMSwgdGV4dC5sZW5ndGggLSAxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdjb2Rlc3BhbicsXG4gICAgICAgIHJhdzogY2FwWzBdLFxuICAgICAgICB0ZXh0LFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBicihzcmM6IHN0cmluZyk6IFRva2Vucy5CciB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5pbmxpbmUuYnIuZXhlYyhzcmMpO1xuICAgIGlmIChjYXApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdicicsXG4gICAgICAgIHJhdzogY2FwWzBdLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBkZWwoc3JjOiBzdHJpbmcsIG1hc2tlZFNyYzogc3RyaW5nLCBwcmV2Q2hhciA9ICcnKTogVG9rZW5zLkRlbCB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IG1hdGNoID0gdGhpcy5ydWxlcy5pbmxpbmUuZGVsTERlbGltLmV4ZWMoc3JjKTtcbiAgICBpZiAoIW1hdGNoKSByZXR1cm47XG5cbiAgICBjb25zdCBuZXh0Q2hhciA9IG1hdGNoWzFdIHx8ICcnO1xuXG4gICAgaWYgKCFuZXh0Q2hhciB8fCAhcHJldkNoYXIgfHwgdGhpcy5ydWxlcy5pbmxpbmUucHVuY3R1YXRpb24uZXhlYyhwcmV2Q2hhcikpIHtcbiAgICAgIC8vIHVuaWNvZGUgUmVnZXggY291bnRzIGVtb2ppIGFzIDEgY2hhcjsgc3ByZWFkIGludG8gYXJyYXkgZm9yIHByb3BlciBjb3VudFxuICAgICAgY29uc3QgbExlbmd0aCA9IFsuLi5tYXRjaFswXV0ubGVuZ3RoIC0gMTtcbiAgICAgIGxldCByRGVsaW0sIHJMZW5ndGgsIGRlbGltVG90YWwgPSBsTGVuZ3RoO1xuXG4gICAgICBjb25zdCBlbmRSZWcgPSB0aGlzLnJ1bGVzLmlubGluZS5kZWxSRGVsaW07XG4gICAgICBlbmRSZWcubGFzdEluZGV4ID0gMDtcblxuICAgICAgLy8gQ2xpcCBtYXNrZWRTcmMgdG8gc2FtZSBzZWN0aW9uIG9mIHN0cmluZyBhcyBzcmNcbiAgICAgIG1hc2tlZFNyYyA9IG1hc2tlZFNyYy5zbGljZSgtMSAqIHNyYy5sZW5ndGggKyBsTGVuZ3RoKTtcblxuICAgICAgd2hpbGUgKChtYXRjaCA9IGVuZFJlZy5leGVjKG1hc2tlZFNyYykpICE9IG51bGwpIHtcbiAgICAgICAgckRlbGltID0gbWF0Y2hbMV0gfHwgbWF0Y2hbMl0gfHwgbWF0Y2hbM10gfHwgbWF0Y2hbNF0gfHwgbWF0Y2hbNV0gfHwgbWF0Y2hbNl07XG5cbiAgICAgICAgaWYgKCFyRGVsaW0pIGNvbnRpbnVlO1xuXG4gICAgICAgIHJMZW5ndGggPSBbLi4uckRlbGltXS5sZW5ndGg7XG5cbiAgICAgICAgaWYgKHJMZW5ndGggIT09IGxMZW5ndGgpIGNvbnRpbnVlO1xuXG4gICAgICAgIGlmIChtYXRjaFszXSB8fCBtYXRjaFs0XSkgeyAvLyBmb3VuZCBhbm90aGVyIExlZnQgRGVsaW1cbiAgICAgICAgICBkZWxpbVRvdGFsICs9IHJMZW5ndGg7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBkZWxpbVRvdGFsIC09IHJMZW5ndGg7XG5cbiAgICAgICAgaWYgKGRlbGltVG90YWwgPiAwKSBjb250aW51ZTsgLy8gSGF2ZW4ndCBmb3VuZCBlbm91Z2ggY2xvc2luZyBkZWxpbWl0ZXJzXG5cbiAgICAgICAgLy8gUmVtb3ZlIGV4dHJhIGNoYXJhY3RlcnNcbiAgICAgICAgckxlbmd0aCA9IE1hdGgubWluKHJMZW5ndGgsIHJMZW5ndGggKyBkZWxpbVRvdGFsKTtcbiAgICAgICAgLy8gY2hhciBsZW5ndGggY2FuIGJlID4xIGZvciB1bmljb2RlIGNoYXJhY3RlcnNcbiAgICAgICAgY29uc3QgbGFzdENoYXJMZW5ndGggPSBbLi4ubWF0Y2hbMF1dWzBdLmxlbmd0aDtcbiAgICAgICAgY29uc3QgcmF3ID0gc3JjLnNsaWNlKDAsIGxMZW5ndGggKyBtYXRjaC5pbmRleCArIGxhc3RDaGFyTGVuZ3RoICsgckxlbmd0aCk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGRlbCB0b2tlbiAtIG9ubHkgc2luZ2xlIH4gb3IgZG91YmxlIH5+IHN1cHBvcnRlZFxuICAgICAgICBjb25zdCB0ZXh0ID0gcmF3LnNsaWNlKGxMZW5ndGgsIC1sTGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiAnZGVsJyxcbiAgICAgICAgICByYXcsXG4gICAgICAgICAgdGV4dCxcbiAgICAgICAgICB0b2tlbnM6IHRoaXMubGV4ZXIuaW5saW5lVG9rZW5zKHRleHQpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGF1dG9saW5rKHNyYzogc3RyaW5nKTogVG9rZW5zLkxpbmsgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuaW5saW5lLmF1dG9saW5rLmV4ZWMoc3JjKTtcbiAgICBpZiAoY2FwKSB7XG4gICAgICBsZXQgdGV4dCwgaHJlZjtcbiAgICAgIGlmIChjYXBbMl0gPT09ICdAJykge1xuICAgICAgICB0ZXh0ID0gY2FwWzFdO1xuICAgICAgICBocmVmID0gJ21haWx0bzonICsgdGV4dDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRleHQgPSBjYXBbMV07XG4gICAgICAgIGhyZWYgPSB0ZXh0O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAnbGluaycsXG4gICAgICAgIHJhdzogY2FwWzBdLFxuICAgICAgICB0ZXh0LFxuICAgICAgICBocmVmLFxuICAgICAgICB0b2tlbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICByYXc6IHRleHQsXG4gICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHVybChzcmM6IHN0cmluZyk6IFRva2Vucy5MaW5rIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgY2FwO1xuICAgIGlmIChjYXAgPSB0aGlzLnJ1bGVzLmlubGluZS51cmwuZXhlYyhzcmMpKSB7XG4gICAgICBsZXQgdGV4dCwgaHJlZjtcbiAgICAgIGlmIChjYXBbMl0gPT09ICdAJykge1xuICAgICAgICB0ZXh0ID0gY2FwWzBdO1xuICAgICAgICBocmVmID0gJ21haWx0bzonICsgdGV4dDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGRvIGV4dGVuZGVkIGF1dG9saW5rIHBhdGggdmFsaWRhdGlvblxuICAgICAgICBsZXQgcHJldkNhcFplcm87XG4gICAgICAgIGRvIHtcbiAgICAgICAgICBwcmV2Q2FwWmVybyA9IGNhcFswXTtcbiAgICAgICAgICBjYXBbMF0gPSB0aGlzLnJ1bGVzLmlubGluZS5fYmFja3BlZGFsLmV4ZWMoY2FwWzBdKT8uWzBdID8/ICcnO1xuICAgICAgICB9IHdoaWxlIChwcmV2Q2FwWmVybyAhPT0gY2FwWzBdKTtcbiAgICAgICAgdGV4dCA9IGNhcFswXTtcbiAgICAgICAgaWYgKGNhcFsxXSA9PT0gJ3d3dy4nKSB7XG4gICAgICAgICAgaHJlZiA9ICdodHRwOi8vJyArIGNhcFswXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBocmVmID0gY2FwWzBdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAnbGluaycsXG4gICAgICAgIHJhdzogY2FwWzBdLFxuICAgICAgICB0ZXh0LFxuICAgICAgICBocmVmLFxuICAgICAgICB0b2tlbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICByYXc6IHRleHQsXG4gICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGlubGluZVRleHQoc3JjOiBzdHJpbmcpOiBUb2tlbnMuVGV4dCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5pbmxpbmUudGV4dC5leGVjKHNyYyk7XG4gICAgaWYgKGNhcCkge1xuICAgICAgY29uc3QgZXNjYXBlZCA9IHRoaXMubGV4ZXIuc3RhdGUuaW5SYXdCbG9jaztcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgcmF3OiBjYXBbMF0sXG4gICAgICAgIHRleHQ6IGNhcFswXSxcbiAgICAgICAgZXNjYXBlZCxcbiAgICAgIH07XG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IHsgX1Rva2VuaXplciB9IGZyb20gJy4vVG9rZW5pemVyLnRzJztcbmltcG9ydCB7IF9kZWZhdWx0cyB9IGZyb20gJy4vZGVmYXVsdHMudHMnO1xuaW1wb3J0IHsgb3RoZXIsIGJsb2NrLCBpbmxpbmUgfSBmcm9tICcuL3J1bGVzLnRzJztcbmltcG9ydCB0eXBlIHsgVG9rZW4sIFRva2Vuc0xpc3QsIFRva2VucyB9IGZyb20gJy4vVG9rZW5zLnRzJztcbmltcG9ydCB0eXBlIHsgTWFya2VkT3B0aW9ucyB9IGZyb20gJy4vTWFya2VkT3B0aW9ucy50cyc7XG5cbi8qKlxuICogQmxvY2sgTGV4ZXJcbiAqL1xuZXhwb3J0IGNsYXNzIF9MZXhlcjxQYXJzZXJPdXRwdXQgPSBzdHJpbmcsIFJlbmRlcmVyT3V0cHV0ID0gc3RyaW5nPiB7XG4gIHRva2VuczogVG9rZW5zTGlzdDtcbiAgb3B0aW9uczogTWFya2VkT3B0aW9uczxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0PjtcbiAgc3RhdGU6IHtcbiAgICBpbkxpbms6IGJvb2xlYW47XG4gICAgaW5SYXdCbG9jazogYm9vbGVhbjtcbiAgICB0b3A6IGJvb2xlYW47XG4gIH07XG5cbiAgcHVibGljIGlubGluZVF1ZXVlOiB7IHNyYzogc3RyaW5nLCB0b2tlbnM6IFRva2VuW10gfVtdO1xuXG4gIHByaXZhdGUgdG9rZW5pemVyOiBfVG9rZW5pemVyPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+O1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBNYXJrZWRPcHRpb25zPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+KSB7XG4gICAgLy8gVG9rZW5MaXN0IGNhbm5vdCBiZSBjcmVhdGVkIGluIG9uZSBnb1xuICAgIHRoaXMudG9rZW5zID0gW10gYXMgdW5rbm93biBhcyBUb2tlbnNMaXN0O1xuICAgIHRoaXMudG9rZW5zLmxpbmtzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IF9kZWZhdWx0cztcbiAgICB0aGlzLm9wdGlvbnMudG9rZW5pemVyID0gdGhpcy5vcHRpb25zLnRva2VuaXplciB8fCBuZXcgX1Rva2VuaXplcjxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0PigpO1xuICAgIHRoaXMudG9rZW5pemVyID0gdGhpcy5vcHRpb25zLnRva2VuaXplcjtcbiAgICB0aGlzLnRva2VuaXplci5vcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgIHRoaXMudG9rZW5pemVyLmxleGVyID0gdGhpcztcbiAgICB0aGlzLmlubGluZVF1ZXVlID0gW107XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGluTGluazogZmFsc2UsXG4gICAgICBpblJhd0Jsb2NrOiBmYWxzZSxcbiAgICAgIHRvcDogdHJ1ZSxcbiAgICB9O1xuXG4gICAgY29uc3QgcnVsZXMgPSB7XG4gICAgICBvdGhlcixcbiAgICAgIGJsb2NrOiBibG9jay5ub3JtYWwsXG4gICAgICBpbmxpbmU6IGlubGluZS5ub3JtYWwsXG4gICAgfTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMucGVkYW50aWMpIHtcbiAgICAgIHJ1bGVzLmJsb2NrID0gYmxvY2sucGVkYW50aWM7XG4gICAgICBydWxlcy5pbmxpbmUgPSBpbmxpbmUucGVkYW50aWM7XG4gICAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbnMuZ2ZtKSB7XG4gICAgICBydWxlcy5ibG9jayA9IGJsb2NrLmdmbTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuYnJlYWtzKSB7XG4gICAgICAgIHJ1bGVzLmlubGluZSA9IGlubGluZS5icmVha3M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBydWxlcy5pbmxpbmUgPSBpbmxpbmUuZ2ZtO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnRva2VuaXplci5ydWxlcyA9IHJ1bGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9zZSBSdWxlc1xuICAgKi9cbiAgc3RhdGljIGdldCBydWxlcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYmxvY2ssXG4gICAgICBpbmxpbmUsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0aWMgTGV4IE1ldGhvZFxuICAgKi9cbiAgc3RhdGljIGxleDxQYXJzZXJPdXRwdXQgPSBzdHJpbmcsIFJlbmRlcmVyT3V0cHV0ID0gc3RyaW5nPihzcmM6IHN0cmluZywgb3B0aW9ucz86IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4pIHtcbiAgICBjb25zdCBsZXhlciA9IG5ldyBfTGV4ZXI8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4ob3B0aW9ucyk7XG4gICAgcmV0dXJuIGxleGVyLmxleChzcmMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXRpYyBMZXggSW5saW5lIE1ldGhvZFxuICAgKi9cbiAgc3RhdGljIGxleElubGluZTxQYXJzZXJPdXRwdXQgPSBzdHJpbmcsIFJlbmRlcmVyT3V0cHV0ID0gc3RyaW5nPihzcmM6IHN0cmluZywgb3B0aW9ucz86IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4pIHtcbiAgICBjb25zdCBsZXhlciA9IG5ldyBfTGV4ZXI8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4ob3B0aW9ucyk7XG4gICAgcmV0dXJuIGxleGVyLmlubGluZVRva2VucyhzcmMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXByb2Nlc3NpbmdcbiAgICovXG4gIGxleChzcmM6IHN0cmluZykge1xuICAgIHNyYyA9IHNyYy5yZXBsYWNlKG90aGVyLmNhcnJpYWdlUmV0dXJuLCAnXFxuJyk7XG5cbiAgICB0aGlzLmJsb2NrVG9rZW5zKHNyYywgdGhpcy50b2tlbnMpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmlubGluZVF1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBuZXh0ID0gdGhpcy5pbmxpbmVRdWV1ZVtpXTtcbiAgICAgIHRoaXMuaW5saW5lVG9rZW5zKG5leHQuc3JjLCBuZXh0LnRva2Vucyk7XG4gICAgfVxuICAgIHRoaXMuaW5saW5lUXVldWUgPSBbXTtcblxuICAgIHJldHVybiB0aGlzLnRva2VucztcbiAgfVxuXG4gIC8qKlxuICAgKiBMZXhpbmdcbiAgICovXG4gIGJsb2NrVG9rZW5zKHNyYzogc3RyaW5nLCB0b2tlbnM/OiBUb2tlbltdLCBsYXN0UGFyYWdyYXBoQ2xpcHBlZD86IGJvb2xlYW4pOiBUb2tlbltdO1xuICBibG9ja1Rva2VucyhzcmM6IHN0cmluZywgdG9rZW5zPzogVG9rZW5zTGlzdCwgbGFzdFBhcmFncmFwaENsaXBwZWQ/OiBib29sZWFuKTogVG9rZW5zTGlzdDtcbiAgYmxvY2tUb2tlbnMoc3JjOiBzdHJpbmcsIHRva2VuczogVG9rZW5bXSA9IFtdLCBsYXN0UGFyYWdyYXBoQ2xpcHBlZCA9IGZhbHNlKSB7XG4gICAgdGhpcy50b2tlbml6ZXIubGV4ZXIgPSB0aGlzO1xuICAgIGlmICh0aGlzLm9wdGlvbnMucGVkYW50aWMpIHtcbiAgICAgIHNyYyA9IHNyYy5yZXBsYWNlKG90aGVyLnRhYkNoYXJHbG9iYWwsICcgICAgJykucmVwbGFjZShvdGhlci5zcGFjZUxpbmUsICcnKTtcbiAgICB9XG5cbiAgICB3aGlsZSAoc3JjKSB7XG4gICAgICBsZXQgdG9rZW46IFRva2Vucy5HZW5lcmljIHwgdW5kZWZpbmVkO1xuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmV4dGVuc2lvbnM/LmJsb2NrPy5zb21lKChleHRUb2tlbml6ZXIpID0+IHtcbiAgICAgICAgaWYgKHRva2VuID0gZXh0VG9rZW5pemVyLmNhbGwoeyBsZXhlcjogdGhpcyB9LCBzcmMsIHRva2VucykpIHtcbiAgICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gbmV3bGluZVxuICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIuc3BhY2Uoc3JjKSkge1xuICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICBjb25zdCBsYXN0VG9rZW4gPSB0b2tlbnMuYXQoLTEpO1xuICAgICAgICBpZiAodG9rZW4ucmF3Lmxlbmd0aCA9PT0gMSAmJiBsYXN0VG9rZW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIGlmIHRoZXJlJ3MgYSBzaW5nbGUgXFxuIGFzIGEgc3BhY2VyLCBpdCdzIHRlcm1pbmF0aW5nIHRoZSBsYXN0IGxpbmUsXG4gICAgICAgICAgLy8gc28gbW92ZSBpdCB0aGVyZSBzbyB0aGF0IHdlIGRvbid0IGdldCB1bm5lY2Vzc2FyeSBwYXJhZ3JhcGggdGFnc1xuICAgICAgICAgIGxhc3RUb2tlbi5yYXcgKz0gJ1xcbic7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBjb2RlXG4gICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5jb2RlKHNyYykpIHtcbiAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgbGFzdFRva2VuID0gdG9rZW5zLmF0KC0xKTtcbiAgICAgICAgLy8gQW4gaW5kZW50ZWQgY29kZSBibG9jayBjYW5ub3QgaW50ZXJydXB0IGEgcGFyYWdyYXBoLlxuICAgICAgICBpZiAobGFzdFRva2VuPy50eXBlID09PSAncGFyYWdyYXBoJyB8fCBsYXN0VG9rZW4/LnR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgICAgIGxhc3RUb2tlbi5yYXcgKz0gKGxhc3RUb2tlbi5yYXcuZW5kc1dpdGgoJ1xcbicpID8gJycgOiAnXFxuJykgKyB0b2tlbi5yYXc7XG4gICAgICAgICAgbGFzdFRva2VuLnRleHQgKz0gJ1xcbicgKyB0b2tlbi50ZXh0O1xuICAgICAgICAgIHRoaXMuaW5saW5lUXVldWUuYXQoLTEpIS5zcmMgPSBsYXN0VG9rZW4udGV4dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGZlbmNlc1xuICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIuZmVuY2VzKHNyYykpIHtcbiAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gaGVhZGluZ1xuICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIuaGVhZGluZyhzcmMpKSB7XG4gICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGhyXG4gICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5ocihzcmMpKSB7XG4gICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGJsb2NrcXVvdGVcbiAgICAgIGlmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLmJsb2NrcXVvdGUoc3JjKSkge1xuICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBsaXN0XG4gICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5saXN0KHNyYykpIHtcbiAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gaHRtbFxuICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIuaHRtbChzcmMpKSB7XG4gICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGRlZlxuICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIuZGVmKHNyYykpIHtcbiAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgbGFzdFRva2VuID0gdG9rZW5zLmF0KC0xKTtcbiAgICAgICAgaWYgKGxhc3RUb2tlbj8udHlwZSA9PT0gJ3BhcmFncmFwaCcgfHwgbGFzdFRva2VuPy50eXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgICBsYXN0VG9rZW4ucmF3ICs9IChsYXN0VG9rZW4ucmF3LmVuZHNXaXRoKCdcXG4nKSA/ICcnIDogJ1xcbicpICsgdG9rZW4ucmF3O1xuICAgICAgICAgIGxhc3RUb2tlbi50ZXh0ICs9ICdcXG4nICsgdG9rZW4ucmF3O1xuICAgICAgICAgIHRoaXMuaW5saW5lUXVldWUuYXQoLTEpIS5zcmMgPSBsYXN0VG9rZW4udGV4dDtcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy50b2tlbnMubGlua3NbdG9rZW4udGFnXSkge1xuICAgICAgICAgIHRoaXMudG9rZW5zLmxpbmtzW3Rva2VuLnRhZ10gPSB7XG4gICAgICAgICAgICBocmVmOiB0b2tlbi5ocmVmLFxuICAgICAgICAgICAgdGl0bGU6IHRva2VuLnRpdGxlLFxuICAgICAgICAgIH07XG4gICAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyB0YWJsZSAoZ2ZtKVxuICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIudGFibGUoc3JjKSkge1xuICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBsaGVhZGluZ1xuICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIubGhlYWRpbmcoc3JjKSkge1xuICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyB0b3AtbGV2ZWwgcGFyYWdyYXBoXG4gICAgICAvLyBwcmV2ZW50IHBhcmFncmFwaCBjb25zdW1pbmcgZXh0ZW5zaW9ucyBieSBjbGlwcGluZyAnc3JjJyB0byBleHRlbnNpb24gc3RhcnRcbiAgICAgIGxldCBjdXRTcmMgPSBzcmM7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLmV4dGVuc2lvbnM/LnN0YXJ0QmxvY2spIHtcbiAgICAgICAgbGV0IHN0YXJ0SW5kZXggPSBJbmZpbml0eTtcbiAgICAgICAgY29uc3QgdGVtcFNyYyA9IHNyYy5zbGljZSgxKTtcbiAgICAgICAgbGV0IHRlbXBTdGFydDtcbiAgICAgICAgdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMuc3RhcnRCbG9jay5mb3JFYWNoKChnZXRTdGFydEluZGV4KSA9PiB7XG4gICAgICAgICAgdGVtcFN0YXJ0ID0gZ2V0U3RhcnRJbmRleC5jYWxsKHsgbGV4ZXI6IHRoaXMgfSwgdGVtcFNyYyk7XG4gICAgICAgICAgaWYgKHR5cGVvZiB0ZW1wU3RhcnQgPT09ICdudW1iZXInICYmIHRlbXBTdGFydCA+PSAwKSB7XG4gICAgICAgICAgICBzdGFydEluZGV4ID0gTWF0aC5taW4oc3RhcnRJbmRleCwgdGVtcFN0YXJ0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoc3RhcnRJbmRleCA8IEluZmluaXR5ICYmIHN0YXJ0SW5kZXggPj0gMCkge1xuICAgICAgICAgIGN1dFNyYyA9IHNyYy5zdWJzdHJpbmcoMCwgc3RhcnRJbmRleCArIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5zdGF0ZS50b3AgJiYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIucGFyYWdyYXBoKGN1dFNyYykpKSB7XG4gICAgICAgIGNvbnN0IGxhc3RUb2tlbiA9IHRva2Vucy5hdCgtMSk7XG4gICAgICAgIGlmIChsYXN0UGFyYWdyYXBoQ2xpcHBlZCAmJiBsYXN0VG9rZW4/LnR5cGUgPT09ICdwYXJhZ3JhcGgnKSB7XG4gICAgICAgICAgbGFzdFRva2VuLnJhdyArPSAobGFzdFRva2VuLnJhdy5lbmRzV2l0aCgnXFxuJykgPyAnJyA6ICdcXG4nKSArIHRva2VuLnJhdztcbiAgICAgICAgICBsYXN0VG9rZW4udGV4dCArPSAnXFxuJyArIHRva2VuLnRleHQ7XG4gICAgICAgICAgdGhpcy5pbmxpbmVRdWV1ZS5wb3AoKTtcbiAgICAgICAgICB0aGlzLmlubGluZVF1ZXVlLmF0KC0xKSEuc3JjID0gbGFzdFRva2VuLnRleHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICB9XG4gICAgICAgIGxhc3RQYXJhZ3JhcGhDbGlwcGVkID0gY3V0U3JjLmxlbmd0aCAhPT0gc3JjLmxlbmd0aDtcbiAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIHRleHRcbiAgICAgIGlmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLnRleHQoc3JjKSkge1xuICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICBjb25zdCBsYXN0VG9rZW4gPSB0b2tlbnMuYXQoLTEpO1xuICAgICAgICBpZiAobGFzdFRva2VuPy50eXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgICBsYXN0VG9rZW4ucmF3ICs9IChsYXN0VG9rZW4ucmF3LmVuZHNXaXRoKCdcXG4nKSA/ICcnIDogJ1xcbicpICsgdG9rZW4ucmF3O1xuICAgICAgICAgIGxhc3RUb2tlbi50ZXh0ICs9ICdcXG4nICsgdG9rZW4udGV4dDtcbiAgICAgICAgICB0aGlzLmlubGluZVF1ZXVlLnBvcCgpO1xuICAgICAgICAgIHRoaXMuaW5saW5lUXVldWUuYXQoLTEpIS5zcmMgPSBsYXN0VG9rZW4udGV4dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChzcmMpIHtcbiAgICAgICAgY29uc3QgZXJyTXNnID0gJ0luZmluaXRlIGxvb3Agb24gYnl0ZTogJyArIHNyYy5jaGFyQ29kZUF0KDApO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNpbGVudCkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyTXNnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyTXNnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc3RhdGUudG9wID0gdHJ1ZTtcbiAgICByZXR1cm4gdG9rZW5zO1xuICB9XG5cbiAgaW5saW5lKHNyYzogc3RyaW5nLCB0b2tlbnM6IFRva2VuW10gPSBbXSkge1xuICAgIHRoaXMuaW5saW5lUXVldWUucHVzaCh7IHNyYywgdG9rZW5zIH0pO1xuICAgIHJldHVybiB0b2tlbnM7XG4gIH1cblxuICAvKipcbiAgICogTGV4aW5nL0NvbXBpbGluZ1xuICAgKi9cbiAgaW5saW5lVG9rZW5zKHNyYzogc3RyaW5nLCB0b2tlbnM6IFRva2VuW10gPSBbXSk6IFRva2VuW10ge1xuICAgIHRoaXMudG9rZW5pemVyLmxleGVyID0gdGhpcztcbiAgICAvLyBTdHJpbmcgd2l0aCBsaW5rcyBtYXNrZWQgdG8gYXZvaWQgaW50ZXJmZXJlbmNlIHdpdGggZW0gYW5kIHN0cm9uZ1xuICAgIGxldCBtYXNrZWRTcmMgPSBzcmM7XG4gICAgbGV0IG1hdGNoOiBSZWdFeHBFeGVjQXJyYXkgfCBudWxsID0gbnVsbDtcblxuICAgIC8vIE1hc2sgb3V0IHJlZmxpbmtzXG4gICAgaWYgKHRoaXMudG9rZW5zLmxpbmtzKSB7XG4gICAgICBjb25zdCBsaW5rcyA9IE9iamVjdC5rZXlzKHRoaXMudG9rZW5zLmxpbmtzKTtcbiAgICAgIGlmIChsaW5rcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHdoaWxlICgobWF0Y2ggPSB0aGlzLnRva2VuaXplci5ydWxlcy5pbmxpbmUucmVmbGlua1NlYXJjaC5leGVjKG1hc2tlZFNyYykpICE9IG51bGwpIHtcbiAgICAgICAgICBpZiAobGlua3MuaW5jbHVkZXMobWF0Y2hbMF0uc2xpY2UobWF0Y2hbMF0ubGFzdEluZGV4T2YoJ1snKSArIDEsIC0xKSkpIHtcbiAgICAgICAgICAgIG1hc2tlZFNyYyA9IG1hc2tlZFNyYy5zbGljZSgwLCBtYXRjaC5pbmRleClcbiAgICAgICAgICAgICAgKyAnWycgKyAnYScucmVwZWF0KG1hdGNoWzBdLmxlbmd0aCAtIDIpICsgJ10nXG4gICAgICAgICAgICAgICsgbWFza2VkU3JjLnNsaWNlKHRoaXMudG9rZW5pemVyLnJ1bGVzLmlubGluZS5yZWZsaW5rU2VhcmNoLmxhc3RJbmRleCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTWFzayBvdXQgZXNjYXBlZCBjaGFyYWN0ZXJzXG4gICAgd2hpbGUgKChtYXRjaCA9IHRoaXMudG9rZW5pemVyLnJ1bGVzLmlubGluZS5hbnlQdW5jdHVhdGlvbi5leGVjKG1hc2tlZFNyYykpICE9IG51bGwpIHtcbiAgICAgIG1hc2tlZFNyYyA9IG1hc2tlZFNyYy5zbGljZSgwLCBtYXRjaC5pbmRleCkgKyAnKysnICsgbWFza2VkU3JjLnNsaWNlKHRoaXMudG9rZW5pemVyLnJ1bGVzLmlubGluZS5hbnlQdW5jdHVhdGlvbi5sYXN0SW5kZXgpO1xuICAgIH1cblxuICAgIC8vIE1hc2sgb3V0IG90aGVyIGJsb2Nrc1xuICAgIGxldCBvZmZzZXQ7XG4gICAgd2hpbGUgKChtYXRjaCA9IHRoaXMudG9rZW5pemVyLnJ1bGVzLmlubGluZS5ibG9ja1NraXAuZXhlYyhtYXNrZWRTcmMpKSAhPSBudWxsKSB7XG4gICAgICBvZmZzZXQgPSBtYXRjaFsyXSA/IG1hdGNoWzJdLmxlbmd0aCA6IDA7XG4gICAgICBtYXNrZWRTcmMgPSBtYXNrZWRTcmMuc2xpY2UoMCwgbWF0Y2guaW5kZXggKyBvZmZzZXQpICsgJ1snICsgJ2EnLnJlcGVhdChtYXRjaFswXS5sZW5ndGggLSBvZmZzZXQgLSAyKSArICddJyArIG1hc2tlZFNyYy5zbGljZSh0aGlzLnRva2VuaXplci5ydWxlcy5pbmxpbmUuYmxvY2tTa2lwLmxhc3RJbmRleCk7XG4gICAgfVxuXG4gICAgLy8gTWFzayBvdXQgYmxvY2tzIGZyb20gZXh0ZW5zaW9uc1xuICAgIG1hc2tlZFNyYyA9IHRoaXMub3B0aW9ucy5ob29rcz8uZW1TdHJvbmdNYXNrPy5jYWxsKHsgbGV4ZXI6IHRoaXMgfSwgbWFza2VkU3JjKSA/PyBtYXNrZWRTcmM7XG5cbiAgICBsZXQga2VlcFByZXZDaGFyID0gZmFsc2U7XG4gICAgbGV0IHByZXZDaGFyID0gJyc7XG4gICAgd2hpbGUgKHNyYykge1xuICAgICAgaWYgKCFrZWVwUHJldkNoYXIpIHtcbiAgICAgICAgcHJldkNoYXIgPSAnJztcbiAgICAgIH1cbiAgICAgIGtlZXBQcmV2Q2hhciA9IGZhbHNlO1xuXG4gICAgICBsZXQgdG9rZW46IFRva2Vucy5HZW5lcmljIHwgdW5kZWZpbmVkO1xuXG4gICAgICAvLyBleHRlbnNpb25zXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmV4dGVuc2lvbnM/LmlubGluZT8uc29tZSgoZXh0VG9rZW5pemVyKSA9PiB7XG4gICAgICAgIGlmICh0b2tlbiA9IGV4dFRva2VuaXplci5jYWxsKHsgbGV4ZXI6IHRoaXMgfSwgc3JjLCB0b2tlbnMpKSB7XG4gICAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGVzY2FwZVxuICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIuZXNjYXBlKHNyYykpIHtcbiAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gdGFnXG4gICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci50YWcoc3JjKSkge1xuICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBsaW5rXG4gICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5saW5rKHNyYykpIHtcbiAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gcmVmbGluaywgbm9saW5rXG4gICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5yZWZsaW5rKHNyYywgdGhpcy50b2tlbnMubGlua3MpKSB7XG4gICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IGxhc3RUb2tlbiA9IHRva2Vucy5hdCgtMSk7XG4gICAgICAgIGlmICh0b2tlbi50eXBlID09PSAndGV4dCcgJiYgbGFzdFRva2VuPy50eXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgICBsYXN0VG9rZW4ucmF3ICs9IHRva2VuLnJhdztcbiAgICAgICAgICBsYXN0VG9rZW4udGV4dCArPSB0b2tlbi50ZXh0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gZW0gJiBzdHJvbmdcbiAgICAgIGlmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLmVtU3Ryb25nKHNyYywgbWFza2VkU3JjLCBwcmV2Q2hhcikpIHtcbiAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gY29kZVxuICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIuY29kZXNwYW4oc3JjKSkge1xuICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBiclxuICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIuYnIoc3JjKSkge1xuICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBkZWwgKGdmbSlcbiAgICAgIGlmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLmRlbChzcmMsIG1hc2tlZFNyYywgcHJldkNoYXIpKSB7XG4gICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGF1dG9saW5rXG4gICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5hdXRvbGluayhzcmMpKSB7XG4gICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIHVybCAoZ2ZtKVxuICAgICAgaWYgKCF0aGlzLnN0YXRlLmluTGluayAmJiAodG9rZW4gPSB0aGlzLnRva2VuaXplci51cmwoc3JjKSkpIHtcbiAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gdGV4dFxuICAgICAgLy8gcHJldmVudCBpbmxpbmVUZXh0IGNvbnN1bWluZyBleHRlbnNpb25zIGJ5IGNsaXBwaW5nICdzcmMnIHRvIGV4dGVuc2lvbiBzdGFydFxuICAgICAgbGV0IGN1dFNyYyA9IHNyYztcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucz8uc3RhcnRJbmxpbmUpIHtcbiAgICAgICAgbGV0IHN0YXJ0SW5kZXggPSBJbmZpbml0eTtcbiAgICAgICAgY29uc3QgdGVtcFNyYyA9IHNyYy5zbGljZSgxKTtcbiAgICAgICAgbGV0IHRlbXBTdGFydDtcbiAgICAgICAgdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMuc3RhcnRJbmxpbmUuZm9yRWFjaCgoZ2V0U3RhcnRJbmRleCkgPT4ge1xuICAgICAgICAgIHRlbXBTdGFydCA9IGdldFN0YXJ0SW5kZXguY2FsbCh7IGxleGVyOiB0aGlzIH0sIHRlbXBTcmMpO1xuICAgICAgICAgIGlmICh0eXBlb2YgdGVtcFN0YXJ0ID09PSAnbnVtYmVyJyAmJiB0ZW1wU3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgc3RhcnRJbmRleCA9IE1hdGgubWluKHN0YXJ0SW5kZXgsIHRlbXBTdGFydCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHN0YXJ0SW5kZXggPCBJbmZpbml0eSAmJiBzdGFydEluZGV4ID49IDApIHtcbiAgICAgICAgICBjdXRTcmMgPSBzcmMuc3Vic3RyaW5nKDAsIHN0YXJ0SW5kZXggKyAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIuaW5saW5lVGV4dChjdXRTcmMpKSB7XG4gICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgIGlmICh0b2tlbi5yYXcuc2xpY2UoLTEpICE9PSAnXycpIHsgLy8gVHJhY2sgcHJldkNoYXIgYmVmb3JlIHN0cmluZyBvZiBfX19fIHN0YXJ0ZWRcbiAgICAgICAgICBwcmV2Q2hhciA9IHRva2VuLnJhdy5zbGljZSgtMSk7XG4gICAgICAgIH1cbiAgICAgICAga2VlcFByZXZDaGFyID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgbGFzdFRva2VuID0gdG9rZW5zLmF0KC0xKTtcbiAgICAgICAgaWYgKGxhc3RUb2tlbj8udHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICAgICAgbGFzdFRva2VuLnJhdyArPSB0b2tlbi5yYXc7XG4gICAgICAgICAgbGFzdFRva2VuLnRleHQgKz0gdG9rZW4udGV4dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChzcmMpIHtcbiAgICAgICAgY29uc3QgZXJyTXNnID0gJ0luZmluaXRlIGxvb3Agb24gYnl0ZTogJyArIHNyYy5jaGFyQ29kZUF0KDApO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNpbGVudCkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyTXNnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyTXNnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0b2tlbnM7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBfZGVmYXVsdHMgfSBmcm9tICcuL2RlZmF1bHRzLnRzJztcbmltcG9ydCB7XG4gIGNsZWFuVXJsLFxuICBlc2NhcGVIdG1sRW50aXRpZXMsXG59IGZyb20gJy4vaGVscGVycy50cyc7XG5pbXBvcnQgeyBvdGhlciB9IGZyb20gJy4vcnVsZXMudHMnO1xuaW1wb3J0IHR5cGUgeyBNYXJrZWRPcHRpb25zIH0gZnJvbSAnLi9NYXJrZWRPcHRpb25zLnRzJztcbmltcG9ydCB0eXBlIHsgVG9rZW5zIH0gZnJvbSAnLi9Ub2tlbnMudHMnO1xuaW1wb3J0IHR5cGUgeyBfUGFyc2VyIH0gZnJvbSAnLi9QYXJzZXIudHMnO1xuXG4vKipcbiAqIFJlbmRlcmVyXG4gKi9cbmV4cG9ydCBjbGFzcyBfUmVuZGVyZXI8UGFyc2VyT3V0cHV0ID0gc3RyaW5nLCBSZW5kZXJlck91dHB1dCA9IHN0cmluZz4ge1xuICBvcHRpb25zOiBNYXJrZWRPcHRpb25zPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+O1xuICBwYXJzZXIhOiBfUGFyc2VyPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+OyAvLyBzZXQgYnkgdGhlIHBhcnNlclxuICBjb25zdHJ1Y3RvcihvcHRpb25zPzogTWFya2VkT3B0aW9uczxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0Pikge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwgX2RlZmF1bHRzO1xuICB9XG5cbiAgc3BhY2UodG9rZW46IFRva2Vucy5TcGFjZSk6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICByZXR1cm4gJycgYXMgUmVuZGVyZXJPdXRwdXQ7XG4gIH1cblxuICBjb2RlKHsgdGV4dCwgbGFuZywgZXNjYXBlZCB9OiBUb2tlbnMuQ29kZSk6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICBjb25zdCBsYW5nU3RyaW5nID0gKGxhbmcgfHwgJycpLm1hdGNoKG90aGVyLm5vdFNwYWNlU3RhcnQpPy5bMF07XG5cbiAgICBjb25zdCBjb2RlID0gdGV4dC5yZXBsYWNlKG90aGVyLmVuZGluZ05ld2xpbmUsICcnKSArICdcXG4nO1xuXG4gICAgaWYgKCFsYW5nU3RyaW5nKSB7XG4gICAgICByZXR1cm4gJzxwcmU+PGNvZGU+J1xuICAgICAgICArIChlc2NhcGVkID8gY29kZSA6IGVzY2FwZUh0bWxFbnRpdGllcyhjb2RlLCB0cnVlKSlcbiAgICAgICAgKyAnPC9jb2RlPjwvcHJlPlxcbicgYXMgUmVuZGVyZXJPdXRwdXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuICc8cHJlPjxjb2RlIGNsYXNzPVwibGFuZ3VhZ2UtJ1xuICAgICAgKyBlc2NhcGVIdG1sRW50aXRpZXMobGFuZ1N0cmluZylcbiAgICAgICsgJ1wiPidcbiAgICAgICsgKGVzY2FwZWQgPyBjb2RlIDogZXNjYXBlSHRtbEVudGl0aWVzKGNvZGUsIHRydWUpKVxuICAgICAgKyAnPC9jb2RlPjwvcHJlPlxcbicgYXMgUmVuZGVyZXJPdXRwdXQ7XG4gIH1cblxuICBibG9ja3F1b3RlKHsgdG9rZW5zIH06IFRva2Vucy5CbG9ja3F1b3RlKTogUmVuZGVyZXJPdXRwdXQge1xuICAgIGNvbnN0IGJvZHkgPSB0aGlzLnBhcnNlci5wYXJzZSh0b2tlbnMpO1xuICAgIHJldHVybiBgPGJsb2NrcXVvdGU+XFxuJHtib2R5fTwvYmxvY2txdW90ZT5cXG5gIGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgaHRtbCh7IHRleHQgfTogVG9rZW5zLkhUTUwgfCBUb2tlbnMuVGFnKTogUmVuZGVyZXJPdXRwdXQge1xuICAgIHJldHVybiB0ZXh0IGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgZGVmKHRva2VuOiBUb2tlbnMuRGVmKTogUmVuZGVyZXJPdXRwdXQge1xuICAgIHJldHVybiAnJyBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIGhlYWRpbmcoeyB0b2tlbnMsIGRlcHRoIH06IFRva2Vucy5IZWFkaW5nKTogUmVuZGVyZXJPdXRwdXQge1xuICAgIHJldHVybiBgPGgke2RlcHRofT4ke3RoaXMucGFyc2VyLnBhcnNlSW5saW5lKHRva2Vucyl9PC9oJHtkZXB0aH0+XFxuYCBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIGhyKHRva2VuOiBUb2tlbnMuSHIpOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuICc8aHI+XFxuJyBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIGxpc3QodG9rZW46IFRva2Vucy5MaXN0KTogUmVuZGVyZXJPdXRwdXQge1xuICAgIGNvbnN0IG9yZGVyZWQgPSB0b2tlbi5vcmRlcmVkO1xuICAgIGNvbnN0IHN0YXJ0ID0gdG9rZW4uc3RhcnQ7XG5cbiAgICBsZXQgYm9keSA9ICcnO1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgdG9rZW4uaXRlbXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSB0b2tlbi5pdGVtc1tqXTtcbiAgICAgIGJvZHkgKz0gdGhpcy5saXN0aXRlbShpdGVtKTtcbiAgICB9XG5cbiAgICBjb25zdCB0eXBlID0gb3JkZXJlZCA/ICdvbCcgOiAndWwnO1xuICAgIGNvbnN0IHN0YXJ0QXR0ciA9IChvcmRlcmVkICYmIHN0YXJ0ICE9PSAxKSA/ICgnIHN0YXJ0PVwiJyArIHN0YXJ0ICsgJ1wiJykgOiAnJztcbiAgICByZXR1cm4gJzwnICsgdHlwZSArIHN0YXJ0QXR0ciArICc+XFxuJyArIGJvZHkgKyAnPC8nICsgdHlwZSArICc+XFxuJyBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIGxpc3RpdGVtKGl0ZW06IFRva2Vucy5MaXN0SXRlbSk6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICByZXR1cm4gYDxsaT4ke3RoaXMucGFyc2VyLnBhcnNlKGl0ZW0udG9rZW5zKX08L2xpPlxcbmAgYXMgUmVuZGVyZXJPdXRwdXQ7XG4gIH1cblxuICBjaGVja2JveCh7IGNoZWNrZWQgfTogVG9rZW5zLkNoZWNrYm94KTogUmVuZGVyZXJPdXRwdXQge1xuICAgIHJldHVybiAnPGlucHV0ICdcbiAgICAgICsgKGNoZWNrZWQgPyAnY2hlY2tlZD1cIlwiICcgOiAnJylcbiAgICAgICsgJ2Rpc2FibGVkPVwiXCIgdHlwZT1cImNoZWNrYm94XCI+ICcgYXMgUmVuZGVyZXJPdXRwdXQ7XG4gIH1cblxuICBwYXJhZ3JhcGgoeyB0b2tlbnMgfTogVG9rZW5zLlBhcmFncmFwaCk6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICByZXR1cm4gYDxwPiR7dGhpcy5wYXJzZXIucGFyc2VJbmxpbmUodG9rZW5zKX08L3A+XFxuYCBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIHRhYmxlKHRva2VuOiBUb2tlbnMuVGFibGUpOiBSZW5kZXJlck91dHB1dCB7XG4gICAgbGV0IGhlYWRlciA9ICcnO1xuXG4gICAgLy8gaGVhZGVyXG4gICAgbGV0IGNlbGwgPSAnJztcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRva2VuLmhlYWRlci5sZW5ndGg7IGorKykge1xuICAgICAgY2VsbCArPSB0aGlzLnRhYmxlY2VsbCh0b2tlbi5oZWFkZXJbal0pO1xuICAgIH1cbiAgICBoZWFkZXIgKz0gdGhpcy50YWJsZXJvdyh7IHRleHQ6IGNlbGwgYXMgUGFyc2VyT3V0cHV0IH0pO1xuXG4gICAgbGV0IGJvZHkgPSAnJztcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRva2VuLnJvd3MubGVuZ3RoOyBqKyspIHtcbiAgICAgIGNvbnN0IHJvdyA9IHRva2VuLnJvd3Nbal07XG5cbiAgICAgIGNlbGwgPSAnJztcbiAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgcm93Lmxlbmd0aDsgaysrKSB7XG4gICAgICAgIGNlbGwgKz0gdGhpcy50YWJsZWNlbGwocm93W2tdKTtcbiAgICAgIH1cblxuICAgICAgYm9keSArPSB0aGlzLnRhYmxlcm93KHsgdGV4dDogY2VsbCBhcyBQYXJzZXJPdXRwdXQgfSk7XG4gICAgfVxuICAgIGlmIChib2R5KSBib2R5ID0gYDx0Ym9keT4ke2JvZHl9PC90Ym9keT5gO1xuXG4gICAgcmV0dXJuICc8dGFibGU+XFxuJ1xuICAgICAgKyAnPHRoZWFkPlxcbidcbiAgICAgICsgaGVhZGVyXG4gICAgICArICc8L3RoZWFkPlxcbidcbiAgICAgICsgYm9keVxuICAgICAgKyAnPC90YWJsZT5cXG4nIGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgdGFibGVyb3coeyB0ZXh0IH06IFRva2Vucy5UYWJsZVJvdzxQYXJzZXJPdXRwdXQ+KTogUmVuZGVyZXJPdXRwdXQge1xuICAgIHJldHVybiBgPHRyPlxcbiR7dGV4dH08L3RyPlxcbmAgYXMgUmVuZGVyZXJPdXRwdXQ7XG4gIH1cblxuICB0YWJsZWNlbGwodG9rZW46IFRva2Vucy5UYWJsZUNlbGwpOiBSZW5kZXJlck91dHB1dCB7XG4gICAgY29uc3QgY29udGVudCA9IHRoaXMucGFyc2VyLnBhcnNlSW5saW5lKHRva2VuLnRva2Vucyk7XG4gICAgY29uc3QgdHlwZSA9IHRva2VuLmhlYWRlciA/ICd0aCcgOiAndGQnO1xuICAgIGNvbnN0IHRhZyA9IHRva2VuLmFsaWduXG4gICAgICA/IGA8JHt0eXBlfSBhbGlnbj1cIiR7dG9rZW4uYWxpZ259XCI+YFxuICAgICAgOiBgPCR7dHlwZX0+YDtcbiAgICByZXR1cm4gdGFnICsgY29udGVudCArIGA8LyR7dHlwZX0+XFxuYCBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBzcGFuIGxldmVsIHJlbmRlcmVyXG4gICAqL1xuICBzdHJvbmcoeyB0b2tlbnMgfTogVG9rZW5zLlN0cm9uZyk6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICByZXR1cm4gYDxzdHJvbmc+JHt0aGlzLnBhcnNlci5wYXJzZUlubGluZSh0b2tlbnMpfTwvc3Ryb25nPmAgYXMgUmVuZGVyZXJPdXRwdXQ7XG4gIH1cblxuICBlbSh7IHRva2VucyB9OiBUb2tlbnMuRW0pOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuIGA8ZW0+JHt0aGlzLnBhcnNlci5wYXJzZUlubGluZSh0b2tlbnMpfTwvZW0+YCBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIGNvZGVzcGFuKHsgdGV4dCB9OiBUb2tlbnMuQ29kZXNwYW4pOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuIGA8Y29kZT4ke2VzY2FwZUh0bWxFbnRpdGllcyh0ZXh0LCB0cnVlKX08L2NvZGU+YCBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIGJyKHRva2VuOiBUb2tlbnMuQnIpOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuICc8YnI+JyBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIGRlbCh7IHRva2VucyB9OiBUb2tlbnMuRGVsKTogUmVuZGVyZXJPdXRwdXQge1xuICAgIHJldHVybiBgPGRlbD4ke3RoaXMucGFyc2VyLnBhcnNlSW5saW5lKHRva2Vucyl9PC9kZWw+YCBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIGxpbmsoeyBocmVmLCB0aXRsZSwgdG9rZW5zIH06IFRva2Vucy5MaW5rKTogUmVuZGVyZXJPdXRwdXQge1xuICAgIGNvbnN0IHRleHQgPSB0aGlzLnBhcnNlci5wYXJzZUlubGluZSh0b2tlbnMpIGFzIHN0cmluZztcbiAgICBjb25zdCBjbGVhbkhyZWYgPSBjbGVhblVybChocmVmKTtcbiAgICBpZiAoY2xlYW5IcmVmID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gdGV4dCBhcyBSZW5kZXJlck91dHB1dDtcbiAgICB9XG4gICAgaHJlZiA9IGNsZWFuSHJlZjtcbiAgICBsZXQgb3V0ID0gJzxhIGhyZWY9XCInICsgaHJlZiArICdcIic7XG4gICAgaWYgKHRpdGxlKSB7XG4gICAgICBvdXQgKz0gJyB0aXRsZT1cIicgKyAoZXNjYXBlSHRtbEVudGl0aWVzKHRpdGxlKSkgKyAnXCInO1xuICAgIH1cbiAgICBvdXQgKz0gJz4nICsgdGV4dCArICc8L2E+JztcbiAgICByZXR1cm4gb3V0IGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgaW1hZ2UoeyBocmVmLCB0aXRsZSwgdGV4dCwgdG9rZW5zIH06IFRva2Vucy5JbWFnZSk6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICBpZiAodG9rZW5zKSB7XG4gICAgICB0ZXh0ID0gdGhpcy5wYXJzZXIucGFyc2VJbmxpbmUodG9rZW5zLCB0aGlzLnBhcnNlci50ZXh0UmVuZGVyZXIpIGFzIHN0cmluZztcbiAgICB9XG4gICAgY29uc3QgY2xlYW5IcmVmID0gY2xlYW5VcmwoaHJlZik7XG4gICAgaWYgKGNsZWFuSHJlZiA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGVzY2FwZUh0bWxFbnRpdGllcyh0ZXh0KSBhcyBSZW5kZXJlck91dHB1dDtcbiAgICB9XG4gICAgaHJlZiA9IGNsZWFuSHJlZjtcblxuICAgIGxldCBvdXQgPSBgPGltZyBzcmM9XCIke2hyZWZ9XCIgYWx0PVwiJHtlc2NhcGVIdG1sRW50aXRpZXModGV4dCl9XCJgO1xuICAgIGlmICh0aXRsZSkge1xuICAgICAgb3V0ICs9IGAgdGl0bGU9XCIke2VzY2FwZUh0bWxFbnRpdGllcyh0aXRsZSl9XCJgO1xuICAgIH1cbiAgICBvdXQgKz0gJz4nO1xuICAgIHJldHVybiBvdXQgYXMgUmVuZGVyZXJPdXRwdXQ7XG4gIH1cblxuICB0ZXh0KHRva2VuOiBUb2tlbnMuVGV4dCB8IFRva2Vucy5Fc2NhcGUpOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuICd0b2tlbnMnIGluIHRva2VuICYmIHRva2VuLnRva2Vuc1xuICAgICAgPyB0aGlzLnBhcnNlci5wYXJzZUlubGluZSh0b2tlbi50b2tlbnMpIGFzIHVua25vd24gYXMgUmVuZGVyZXJPdXRwdXRcbiAgICAgIDogKCdlc2NhcGVkJyBpbiB0b2tlbiAmJiB0b2tlbi5lc2NhcGVkID8gdG9rZW4udGV4dCBhcyBSZW5kZXJlck91dHB1dCA6IGVzY2FwZUh0bWxFbnRpdGllcyh0b2tlbi50ZXh0KSBhcyBSZW5kZXJlck91dHB1dCk7XG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IFRva2VucyB9IGZyb20gJy4vVG9rZW5zLnRzJztcblxuLyoqXG4gKiBUZXh0UmVuZGVyZXJcbiAqIHJldHVybnMgb25seSB0aGUgdGV4dHVhbCBwYXJ0IG9mIHRoZSB0b2tlblxuICovXG5leHBvcnQgY2xhc3MgX1RleHRSZW5kZXJlcjxSZW5kZXJlck91dHB1dCA9IHN0cmluZz4ge1xuICAvLyBubyBuZWVkIGZvciBibG9jayBsZXZlbCByZW5kZXJlcnNcbiAgc3Ryb25nKHsgdGV4dCB9OiBUb2tlbnMuU3Ryb25nKTogUmVuZGVyZXJPdXRwdXQge1xuICAgIHJldHVybiB0ZXh0IGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgZW0oeyB0ZXh0IH06IFRva2Vucy5FbSk6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICByZXR1cm4gdGV4dCBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIGNvZGVzcGFuKHsgdGV4dCB9OiBUb2tlbnMuQ29kZXNwYW4pOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuIHRleHQgYXMgUmVuZGVyZXJPdXRwdXQ7XG4gIH1cblxuICBkZWwoeyB0ZXh0IH06IFRva2Vucy5EZWwpOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuIHRleHQgYXMgUmVuZGVyZXJPdXRwdXQ7XG4gIH1cblxuICBodG1sKHsgdGV4dCB9OiBUb2tlbnMuSFRNTCB8IFRva2Vucy5UYWcpOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuIHRleHQgYXMgUmVuZGVyZXJPdXRwdXQ7XG4gIH1cblxuICB0ZXh0KHsgdGV4dCB9OiBUb2tlbnMuVGV4dCB8IFRva2Vucy5Fc2NhcGUgfCBUb2tlbnMuVGFnKTogUmVuZGVyZXJPdXRwdXQge1xuICAgIHJldHVybiB0ZXh0IGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgbGluayh7IHRleHQgfTogVG9rZW5zLkxpbmspOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuICcnICsgdGV4dCBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIGltYWdlKHsgdGV4dCB9OiBUb2tlbnMuSW1hZ2UpOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuICcnICsgdGV4dCBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIGJyKCk6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICByZXR1cm4gJycgYXMgUmVuZGVyZXJPdXRwdXQ7XG4gIH1cblxuICBjaGVja2JveCh7IHJhdyB9OiBUb2tlbnMuQ2hlY2tib3gpOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuIHJhdyBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxufVxuIiwgImltcG9ydCB7IF9SZW5kZXJlciB9IGZyb20gJy4vUmVuZGVyZXIudHMnO1xuaW1wb3J0IHsgX1RleHRSZW5kZXJlciB9IGZyb20gJy4vVGV4dFJlbmRlcmVyLnRzJztcbmltcG9ydCB7IF9kZWZhdWx0cyB9IGZyb20gJy4vZGVmYXVsdHMudHMnO1xuaW1wb3J0IHR5cGUgeyBNYXJrZWRUb2tlbiwgVG9rZW4sIFRva2VucyB9IGZyb20gJy4vVG9rZW5zLnRzJztcbmltcG9ydCB0eXBlIHsgTWFya2VkT3B0aW9ucyB9IGZyb20gJy4vTWFya2VkT3B0aW9ucy50cyc7XG5cbi8qKlxuICogUGFyc2luZyAmIENvbXBpbGluZ1xuICovXG5leHBvcnQgY2xhc3MgX1BhcnNlcjxQYXJzZXJPdXRwdXQgPSBzdHJpbmcsIFJlbmRlcmVyT3V0cHV0ID0gc3RyaW5nPiB7XG4gIG9wdGlvbnM6IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD47XG4gIHJlbmRlcmVyOiBfUmVuZGVyZXI8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD47XG4gIHRleHRSZW5kZXJlcjogX1RleHRSZW5kZXJlcjxSZW5kZXJlck91dHB1dD47XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBNYXJrZWRPcHRpb25zPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+KSB7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCBfZGVmYXVsdHM7XG4gICAgdGhpcy5vcHRpb25zLnJlbmRlcmVyID0gdGhpcy5vcHRpb25zLnJlbmRlcmVyIHx8IG5ldyBfUmVuZGVyZXI8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4oKTtcbiAgICB0aGlzLnJlbmRlcmVyID0gdGhpcy5vcHRpb25zLnJlbmRlcmVyO1xuICAgIHRoaXMucmVuZGVyZXIub3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICB0aGlzLnJlbmRlcmVyLnBhcnNlciA9IHRoaXM7XG4gICAgdGhpcy50ZXh0UmVuZGVyZXIgPSBuZXcgX1RleHRSZW5kZXJlcjxSZW5kZXJlck91dHB1dD4oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0aWMgUGFyc2UgTWV0aG9kXG4gICAqL1xuICBzdGF0aWMgcGFyc2U8UGFyc2VyT3V0cHV0ID0gc3RyaW5nLCBSZW5kZXJlck91dHB1dCA9IHN0cmluZz4odG9rZW5zOiBUb2tlbltdLCBvcHRpb25zPzogTWFya2VkT3B0aW9uczxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0Pikge1xuICAgIGNvbnN0IHBhcnNlciA9IG5ldyBfUGFyc2VyPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+KG9wdGlvbnMpO1xuICAgIHJldHVybiBwYXJzZXIucGFyc2UodG9rZW5zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0aWMgUGFyc2UgSW5saW5lIE1ldGhvZFxuICAgKi9cbiAgc3RhdGljIHBhcnNlSW5saW5lPFBhcnNlck91dHB1dCA9IHN0cmluZywgUmVuZGVyZXJPdXRwdXQgPSBzdHJpbmc+KHRva2VuczogVG9rZW5bXSwgb3B0aW9ucz86IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4pIHtcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgX1BhcnNlcjxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0PihvcHRpb25zKTtcbiAgICByZXR1cm4gcGFyc2VyLnBhcnNlSW5saW5lKHRva2Vucyk7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgTG9vcFxuICAgKi9cbiAgcGFyc2UodG9rZW5zOiBUb2tlbltdKTogUGFyc2VyT3V0cHV0IHtcbiAgICB0aGlzLnJlbmRlcmVyLnBhcnNlciA9IHRoaXM7XG4gICAgbGV0IG91dCA9ICcnO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGFueVRva2VuID0gdG9rZW5zW2ldO1xuXG4gICAgICAvLyBSdW4gYW55IHJlbmRlcmVyIGV4dGVuc2lvbnNcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucz8ucmVuZGVyZXJzPy5bYW55VG9rZW4udHlwZV0pIHtcbiAgICAgICAgY29uc3QgZ2VuZXJpY1Rva2VuID0gYW55VG9rZW4gYXMgVG9rZW5zLkdlbmVyaWM7XG4gICAgICAgIGNvbnN0IHJldCA9IHRoaXMub3B0aW9ucy5leHRlbnNpb25zLnJlbmRlcmVyc1tnZW5lcmljVG9rZW4udHlwZV0uY2FsbCh7IHBhcnNlcjogdGhpcyB9LCBnZW5lcmljVG9rZW4pO1xuICAgICAgICBpZiAocmV0ICE9PSBmYWxzZSB8fCAhWydzcGFjZScsICdocicsICdoZWFkaW5nJywgJ2NvZGUnLCAndGFibGUnLCAnYmxvY2txdW90ZScsICdsaXN0JywgJ2h0bWwnLCAnZGVmJywgJ3BhcmFncmFwaCcsICd0ZXh0J10uaW5jbHVkZXMoZ2VuZXJpY1Rva2VuLnR5cGUpKSB7XG4gICAgICAgICAgb3V0ICs9IHJldCB8fCAnJztcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCB0b2tlbiA9IGFueVRva2VuIGFzIE1hcmtlZFRva2VuO1xuXG4gICAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnc3BhY2UnOiB7XG4gICAgICAgICAgb3V0ICs9IHRoaXMucmVuZGVyZXIuc3BhY2UodG9rZW4pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2hyJzoge1xuICAgICAgICAgIG91dCArPSB0aGlzLnJlbmRlcmVyLmhyKHRva2VuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdoZWFkaW5nJzoge1xuICAgICAgICAgIG91dCArPSB0aGlzLnJlbmRlcmVyLmhlYWRpbmcodG9rZW4pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2NvZGUnOiB7XG4gICAgICAgICAgb3V0ICs9IHRoaXMucmVuZGVyZXIuY29kZSh0b2tlbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndGFibGUnOiB7XG4gICAgICAgICAgb3V0ICs9IHRoaXMucmVuZGVyZXIudGFibGUodG9rZW4pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2Jsb2NrcXVvdGUnOiB7XG4gICAgICAgICAgb3V0ICs9IHRoaXMucmVuZGVyZXIuYmxvY2txdW90ZSh0b2tlbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnbGlzdCc6IHtcbiAgICAgICAgICBvdXQgKz0gdGhpcy5yZW5kZXJlci5saXN0KHRva2VuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdjaGVja2JveCc6IHtcbiAgICAgICAgICBvdXQgKz0gdGhpcy5yZW5kZXJlci5jaGVja2JveCh0b2tlbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnaHRtbCc6IHtcbiAgICAgICAgICBvdXQgKz0gdGhpcy5yZW5kZXJlci5odG1sKHRva2VuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkZWYnOiB7XG4gICAgICAgICAgb3V0ICs9IHRoaXMucmVuZGVyZXIuZGVmKHRva2VuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdwYXJhZ3JhcGgnOiB7XG4gICAgICAgICAgb3V0ICs9IHRoaXMucmVuZGVyZXIucGFyYWdyYXBoKHRva2VuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0ZXh0Jzoge1xuICAgICAgICAgIG91dCArPSB0aGlzLnJlbmRlcmVyLnRleHQodG9rZW4pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIGNvbnN0IGVyck1zZyA9ICdUb2tlbiB3aXRoIFwiJyArIHRva2VuLnR5cGUgKyAnXCIgdHlwZSB3YXMgbm90IGZvdW5kLic7XG4gICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyTXNnKTtcbiAgICAgICAgICAgIHJldHVybiAnJyBhcyBQYXJzZXJPdXRwdXQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJNc2cpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvdXQgYXMgUGFyc2VyT3V0cHV0O1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIElubGluZSBUb2tlbnNcbiAgICovXG4gIHBhcnNlSW5saW5lKHRva2VuczogVG9rZW5bXSwgcmVuZGVyZXI6IF9SZW5kZXJlcjxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0PiB8IF9UZXh0UmVuZGVyZXI8UmVuZGVyZXJPdXRwdXQ+ID0gdGhpcy5yZW5kZXJlcik6IFBhcnNlck91dHB1dCB7XG4gICAgdGhpcy5yZW5kZXJlci5wYXJzZXIgPSB0aGlzO1xuICAgIGxldCBvdXQgPSAnJztcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBhbnlUb2tlbiA9IHRva2Vuc1tpXTtcblxuICAgICAgLy8gUnVuIGFueSByZW5kZXJlciBleHRlbnNpb25zXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmV4dGVuc2lvbnM/LnJlbmRlcmVycz8uW2FueVRva2VuLnR5cGVdKSB7XG4gICAgICAgIGNvbnN0IHJldCA9IHRoaXMub3B0aW9ucy5leHRlbnNpb25zLnJlbmRlcmVyc1thbnlUb2tlbi50eXBlXS5jYWxsKHsgcGFyc2VyOiB0aGlzIH0sIGFueVRva2VuKTtcbiAgICAgICAgaWYgKHJldCAhPT0gZmFsc2UgfHwgIVsnZXNjYXBlJywgJ2h0bWwnLCAnbGluaycsICdpbWFnZScsICdzdHJvbmcnLCAnZW0nLCAnY29kZXNwYW4nLCAnYnInLCAnZGVsJywgJ3RleHQnXS5pbmNsdWRlcyhhbnlUb2tlbi50eXBlKSkge1xuICAgICAgICAgIG91dCArPSByZXQgfHwgJyc7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgdG9rZW4gPSBhbnlUb2tlbiBhcyBNYXJrZWRUb2tlbjtcblxuICAgICAgc3dpdGNoICh0b2tlbi50eXBlKSB7XG4gICAgICAgIGNhc2UgJ2VzY2FwZSc6IHtcbiAgICAgICAgICBvdXQgKz0gcmVuZGVyZXIudGV4dCh0b2tlbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnaHRtbCc6IHtcbiAgICAgICAgICBvdXQgKz0gcmVuZGVyZXIuaHRtbCh0b2tlbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnbGluayc6IHtcbiAgICAgICAgICBvdXQgKz0gcmVuZGVyZXIubGluayh0b2tlbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnaW1hZ2UnOiB7XG4gICAgICAgICAgb3V0ICs9IHJlbmRlcmVyLmltYWdlKHRva2VuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdjaGVja2JveCc6IHtcbiAgICAgICAgICBvdXQgKz0gcmVuZGVyZXIuY2hlY2tib3godG9rZW4pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3N0cm9uZyc6IHtcbiAgICAgICAgICBvdXQgKz0gcmVuZGVyZXIuc3Ryb25nKHRva2VuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdlbSc6IHtcbiAgICAgICAgICBvdXQgKz0gcmVuZGVyZXIuZW0odG9rZW4pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2NvZGVzcGFuJzoge1xuICAgICAgICAgIG91dCArPSByZW5kZXJlci5jb2Rlc3Bhbih0b2tlbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnYnInOiB7XG4gICAgICAgICAgb3V0ICs9IHJlbmRlcmVyLmJyKHRva2VuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkZWwnOiB7XG4gICAgICAgICAgb3V0ICs9IHJlbmRlcmVyLmRlbCh0b2tlbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndGV4dCc6IHtcbiAgICAgICAgICBvdXQgKz0gcmVuZGVyZXIudGV4dCh0b2tlbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIGNvbnN0IGVyck1zZyA9ICdUb2tlbiB3aXRoIFwiJyArIHRva2VuLnR5cGUgKyAnXCIgdHlwZSB3YXMgbm90IGZvdW5kLic7XG4gICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyTXNnKTtcbiAgICAgICAgICAgIHJldHVybiAnJyBhcyBQYXJzZXJPdXRwdXQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJNc2cpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0IGFzIFBhcnNlck91dHB1dDtcbiAgfVxufVxuIiwgImltcG9ydCB7IF9kZWZhdWx0cyB9IGZyb20gJy4vZGVmYXVsdHMudHMnO1xuaW1wb3J0IHsgX0xleGVyIH0gZnJvbSAnLi9MZXhlci50cyc7XG5pbXBvcnQgeyBfUGFyc2VyIH0gZnJvbSAnLi9QYXJzZXIudHMnO1xuaW1wb3J0IHR5cGUgeyBNYXJrZWRPcHRpb25zIH0gZnJvbSAnLi9NYXJrZWRPcHRpb25zLnRzJztcbmltcG9ydCB0eXBlIHsgVG9rZW4sIFRva2Vuc0xpc3QgfSBmcm9tICcuL1Rva2Vucy50cyc7XG5cbmV4cG9ydCBjbGFzcyBfSG9va3M8UGFyc2VyT3V0cHV0ID0gc3RyaW5nLCBSZW5kZXJlck91dHB1dCA9IHN0cmluZz4ge1xuICBvcHRpb25zOiBNYXJrZWRPcHRpb25zPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+O1xuICBibG9jaz86IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3Iob3B0aW9ucz86IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4pIHtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IF9kZWZhdWx0cztcbiAgfVxuXG4gIHN0YXRpYyBwYXNzVGhyb3VnaEhvb2tzID0gbmV3IFNldChbXG4gICAgJ3ByZXByb2Nlc3MnLFxuICAgICdwb3N0cHJvY2VzcycsXG4gICAgJ3Byb2Nlc3NBbGxUb2tlbnMnLFxuICAgICdlbVN0cm9uZ01hc2snLFxuICBdKTtcblxuICBzdGF0aWMgcGFzc1Rocm91Z2hIb29rc1Jlc3BlY3RBc3luYyA9IG5ldyBTZXQoW1xuICAgICdwcmVwcm9jZXNzJyxcbiAgICAncG9zdHByb2Nlc3MnLFxuICAgICdwcm9jZXNzQWxsVG9rZW5zJyxcbiAgXSk7XG5cbiAgLyoqXG4gICAqIFByb2Nlc3MgbWFya2Rvd24gYmVmb3JlIG1hcmtlZFxuICAgKi9cbiAgcHJlcHJvY2VzcyhtYXJrZG93bjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIG1hcmtkb3duO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3MgSFRNTCBhZnRlciBtYXJrZWQgaXMgZmluaXNoZWRcbiAgICovXG4gIHBvc3Rwcm9jZXNzKGh0bWw6IFBhcnNlck91dHB1dCkge1xuICAgIHJldHVybiBodG1sO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3MgYWxsIHRva2VucyBiZWZvcmUgd2FsayB0b2tlbnNcbiAgICovXG4gIHByb2Nlc3NBbGxUb2tlbnModG9rZW5zOiBUb2tlbltdIHwgVG9rZW5zTGlzdCkge1xuICAgIHJldHVybiB0b2tlbnM7XG4gIH1cblxuICAvKipcbiAgICogTWFzayBjb250ZW50cyB0aGF0IHNob3VsZCBub3QgYmUgaW50ZXJwcmV0ZWQgYXMgZW0vc3Ryb25nIGRlbGltaXRlcnNcbiAgICovXG4gIGVtU3Ryb25nTWFzayhzcmM6IHN0cmluZykge1xuICAgIHJldHVybiBzcmM7XG4gIH1cblxuICAvKipcbiAgICogUHJvdmlkZSBmdW5jdGlvbiB0byB0b2tlbml6ZSBtYXJrZG93blxuICAgKi9cbiAgcHJvdmlkZUxleGVyKCkge1xuICAgIHJldHVybiB0aGlzLmJsb2NrID8gX0xleGVyLmxleCA6IF9MZXhlci5sZXhJbmxpbmU7XG4gIH1cblxuICAvKipcbiAgICogUHJvdmlkZSBmdW5jdGlvbiB0byBwYXJzZSB0b2tlbnNcbiAgICovXG4gIHByb3ZpZGVQYXJzZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuYmxvY2sgPyBfUGFyc2VyLnBhcnNlPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+IDogX1BhcnNlci5wYXJzZUlubGluZTxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0PjtcbiAgfVxufVxuIiwgImltcG9ydCB7IF9nZXREZWZhdWx0cyB9IGZyb20gJy4vZGVmYXVsdHMudHMnO1xuaW1wb3J0IHsgX0xleGVyIH0gZnJvbSAnLi9MZXhlci50cyc7XG5pbXBvcnQgeyBfUGFyc2VyIH0gZnJvbSAnLi9QYXJzZXIudHMnO1xuaW1wb3J0IHsgX0hvb2tzIH0gZnJvbSAnLi9Ib29rcy50cyc7XG5pbXBvcnQgeyBfUmVuZGVyZXIgfSBmcm9tICcuL1JlbmRlcmVyLnRzJztcbmltcG9ydCB7IF9Ub2tlbml6ZXIgfSBmcm9tICcuL1Rva2VuaXplci50cyc7XG5pbXBvcnQgeyBfVGV4dFJlbmRlcmVyIH0gZnJvbSAnLi9UZXh0UmVuZGVyZXIudHMnO1xuaW1wb3J0IHsgZXNjYXBlSHRtbEVudGl0aWVzIH0gZnJvbSAnLi9oZWxwZXJzLnRzJztcbmltcG9ydCB0eXBlIHsgTWFya2VkRXh0ZW5zaW9uLCBNYXJrZWRPcHRpb25zIH0gZnJvbSAnLi9NYXJrZWRPcHRpb25zLnRzJztcbmltcG9ydCB0eXBlIHsgVG9rZW4sIFRva2VucywgVG9rZW5zTGlzdCB9IGZyb20gJy4vVG9rZW5zLnRzJztcblxuZXhwb3J0IHR5cGUgTWF5YmVQcm9taXNlID0gdm9pZCB8IFByb21pc2U8dm9pZD47XG5cbnR5cGUgVW5rbm93bkZ1bmN0aW9uID0gKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdW5rbm93bjtcbnR5cGUgR2VuZXJpY1JlbmRlcmVyRnVuY3Rpb24gPSAoLi4uYXJnczogdW5rbm93bltdKSA9PiBzdHJpbmcgfCBmYWxzZTtcblxuZXhwb3J0IGNsYXNzIE1hcmtlZDxQYXJzZXJPdXRwdXQgPSBzdHJpbmcsIFJlbmRlcmVyT3V0cHV0ID0gc3RyaW5nPiB7XG4gIGRlZmF1bHRzID0gX2dldERlZmF1bHRzPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+KCk7XG4gIG9wdGlvbnMgPSB0aGlzLnNldE9wdGlvbnM7XG5cbiAgcGFyc2UgPSB0aGlzLnBhcnNlTWFya2Rvd24odHJ1ZSk7XG4gIHBhcnNlSW5saW5lID0gdGhpcy5wYXJzZU1hcmtkb3duKGZhbHNlKTtcblxuICBQYXJzZXIgPSBfUGFyc2VyPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+O1xuICBSZW5kZXJlciA9IF9SZW5kZXJlcjxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0PjtcbiAgVGV4dFJlbmRlcmVyID0gX1RleHRSZW5kZXJlcjxSZW5kZXJlck91dHB1dD47XG4gIExleGVyID0gX0xleGVyO1xuICBUb2tlbml6ZXIgPSBfVG9rZW5pemVyPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+O1xuICBIb29rcyA9IF9Ib29rczxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0PjtcblxuICBjb25zdHJ1Y3RvciguLi5hcmdzOiBNYXJrZWRFeHRlbnNpb248UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD5bXSkge1xuICAgIHRoaXMudXNlKC4uLmFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1biBjYWxsYmFjayBmb3IgZXZlcnkgdG9rZW5cbiAgICovXG4gIHdhbGtUb2tlbnModG9rZW5zOiBUb2tlbltdIHwgVG9rZW5zTGlzdCwgY2FsbGJhY2s6ICh0b2tlbjogVG9rZW4pID0+IE1heWJlUHJvbWlzZSB8IE1heWJlUHJvbWlzZVtdKSB7XG4gICAgbGV0IHZhbHVlczogTWF5YmVQcm9taXNlW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHRva2Vucykge1xuICAgICAgdmFsdWVzID0gdmFsdWVzLmNvbmNhdChjYWxsYmFjay5jYWxsKHRoaXMsIHRva2VuKSk7XG4gICAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcbiAgICAgICAgY2FzZSAndGFibGUnOiB7XG4gICAgICAgICAgY29uc3QgdGFibGVUb2tlbiA9IHRva2VuIGFzIFRva2Vucy5UYWJsZTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGNlbGwgb2YgdGFibGVUb2tlbi5oZWFkZXIpIHtcbiAgICAgICAgICAgIHZhbHVlcyA9IHZhbHVlcy5jb25jYXQodGhpcy53YWxrVG9rZW5zKGNlbGwudG9rZW5zLCBjYWxsYmFjaykpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKGNvbnN0IHJvdyBvZiB0YWJsZVRva2VuLnJvd3MpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2VsbCBvZiByb3cpIHtcbiAgICAgICAgICAgICAgdmFsdWVzID0gdmFsdWVzLmNvbmNhdCh0aGlzLndhbGtUb2tlbnMoY2VsbC50b2tlbnMsIGNhbGxiYWNrKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2xpc3QnOiB7XG4gICAgICAgICAgY29uc3QgbGlzdFRva2VuID0gdG9rZW4gYXMgVG9rZW5zLkxpc3Q7XG4gICAgICAgICAgdmFsdWVzID0gdmFsdWVzLmNvbmNhdCh0aGlzLndhbGtUb2tlbnMobGlzdFRva2VuLml0ZW1zLCBjYWxsYmFjaykpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBjb25zdCBnZW5lcmljVG9rZW4gPSB0b2tlbiBhcyBUb2tlbnMuR2VuZXJpYztcbiAgICAgICAgICBpZiAodGhpcy5kZWZhdWx0cy5leHRlbnNpb25zPy5jaGlsZFRva2Vucz8uW2dlbmVyaWNUb2tlbi50eXBlXSkge1xuICAgICAgICAgICAgdGhpcy5kZWZhdWx0cy5leHRlbnNpb25zLmNoaWxkVG9rZW5zW2dlbmVyaWNUb2tlbi50eXBlXS5mb3JFYWNoKChjaGlsZFRva2VucykgPT4ge1xuICAgICAgICAgICAgICBjb25zdCB0b2tlbnMgPSBnZW5lcmljVG9rZW5bY2hpbGRUb2tlbnNdLmZsYXQoSW5maW5pdHkpIGFzIFRva2VuW10gfCBUb2tlbnNMaXN0O1xuICAgICAgICAgICAgICB2YWx1ZXMgPSB2YWx1ZXMuY29uY2F0KHRoaXMud2Fsa1Rva2Vucyh0b2tlbnMsIGNhbGxiYWNrKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGdlbmVyaWNUb2tlbi50b2tlbnMpIHtcbiAgICAgICAgICAgIHZhbHVlcyA9IHZhbHVlcy5jb25jYXQodGhpcy53YWxrVG9rZW5zKGdlbmVyaWNUb2tlbi50b2tlbnMsIGNhbGxiYWNrKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZXM7XG4gIH1cblxuICB1c2UoLi4uYXJnczogTWFya2VkRXh0ZW5zaW9uPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+W10pIHtcbiAgICBjb25zdCBleHRlbnNpb25zOiBNYXJrZWRPcHRpb25zPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+WydleHRlbnNpb25zJ10gPSB0aGlzLmRlZmF1bHRzLmV4dGVuc2lvbnMgfHwgeyByZW5kZXJlcnM6IHt9LCBjaGlsZFRva2Vuczoge30gfTtcblxuICAgIGFyZ3MuZm9yRWFjaCgocGFjaykgPT4ge1xuICAgICAgLy8gY29weSBvcHRpb25zIHRvIG5ldyBvYmplY3RcbiAgICAgIGNvbnN0IG9wdHMgPSB7IC4uLnBhY2sgfSBhcyBNYXJrZWRPcHRpb25zPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+O1xuXG4gICAgICAvLyBzZXQgYXN5bmMgdG8gdHJ1ZSBpZiBpdCB3YXMgc2V0IHRvIHRydWUgYmVmb3JlXG4gICAgICBvcHRzLmFzeW5jID0gdGhpcy5kZWZhdWx0cy5hc3luYyB8fCBvcHRzLmFzeW5jIHx8IGZhbHNlO1xuXG4gICAgICAvLyA9PS0tIFBhcnNlIFwiYWRkb25cIiBleHRlbnNpb25zIC0tPT0gLy9cbiAgICAgIGlmIChwYWNrLmV4dGVuc2lvbnMpIHtcbiAgICAgICAgcGFjay5leHRlbnNpb25zLmZvckVhY2goKGV4dCkgPT4ge1xuICAgICAgICAgIGlmICghZXh0Lm5hbWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZXh0ZW5zaW9uIG5hbWUgcmVxdWlyZWQnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCdyZW5kZXJlcicgaW4gZXh0KSB7IC8vIFJlbmRlcmVyIGV4dGVuc2lvbnNcbiAgICAgICAgICAgIGNvbnN0IHByZXZSZW5kZXJlciA9IGV4dGVuc2lvbnMucmVuZGVyZXJzW2V4dC5uYW1lXTtcbiAgICAgICAgICAgIGlmIChwcmV2UmVuZGVyZXIpIHtcbiAgICAgICAgICAgICAgLy8gUmVwbGFjZSBleHRlbnNpb24gd2l0aCBmdW5jIHRvIHJ1biBuZXcgZXh0ZW5zaW9uIGJ1dCBmYWxsIGJhY2sgaWYgZmFsc2VcbiAgICAgICAgICAgICAgZXh0ZW5zaW9ucy5yZW5kZXJlcnNbZXh0Lm5hbWVdID0gZnVuY3Rpb24oLi4uYXJncykge1xuICAgICAgICAgICAgICAgIGxldCByZXQgPSBleHQucmVuZGVyZXIuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgICAgICAgICAgaWYgKHJldCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgIHJldCA9IHByZXZSZW5kZXJlci5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGV4dGVuc2lvbnMucmVuZGVyZXJzW2V4dC5uYW1lXSA9IGV4dC5yZW5kZXJlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCd0b2tlbml6ZXInIGluIGV4dCkgeyAvLyBUb2tlbml6ZXIgRXh0ZW5zaW9uc1xuICAgICAgICAgICAgaWYgKCFleHQubGV2ZWwgfHwgKGV4dC5sZXZlbCAhPT0gJ2Jsb2NrJyAmJiBleHQubGV2ZWwgIT09ICdpbmxpbmUnKSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJleHRlbnNpb24gbGV2ZWwgbXVzdCBiZSAnYmxvY2snIG9yICdpbmxpbmUnXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZXh0TGV2ZWwgPSBleHRlbnNpb25zW2V4dC5sZXZlbF07XG4gICAgICAgICAgICBpZiAoZXh0TGV2ZWwpIHtcbiAgICAgICAgICAgICAgZXh0TGV2ZWwudW5zaGlmdChleHQudG9rZW5pemVyKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGV4dGVuc2lvbnNbZXh0LmxldmVsXSA9IFtleHQudG9rZW5pemVyXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChleHQuc3RhcnQpIHsgLy8gRnVuY3Rpb24gdG8gY2hlY2sgZm9yIHN0YXJ0IG9mIHRva2VuXG4gICAgICAgICAgICAgIGlmIChleHQubGV2ZWwgPT09ICdibG9jaycpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXh0ZW5zaW9ucy5zdGFydEJsb2NrKSB7XG4gICAgICAgICAgICAgICAgICBleHRlbnNpb25zLnN0YXJ0QmxvY2sucHVzaChleHQuc3RhcnQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBleHRlbnNpb25zLnN0YXJ0QmxvY2sgPSBbZXh0LnN0YXJ0XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXh0LmxldmVsID09PSAnaW5saW5lJykge1xuICAgICAgICAgICAgICAgIGlmIChleHRlbnNpb25zLnN0YXJ0SW5saW5lKSB7XG4gICAgICAgICAgICAgICAgICBleHRlbnNpb25zLnN0YXJ0SW5saW5lLnB1c2goZXh0LnN0YXJ0KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9ucy5zdGFydElubGluZSA9IFtleHQuc3RhcnRdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoJ2NoaWxkVG9rZW5zJyBpbiBleHQgJiYgZXh0LmNoaWxkVG9rZW5zKSB7IC8vIENoaWxkIHRva2VucyB0byBiZSB2aXNpdGVkIGJ5IHdhbGtUb2tlbnNcbiAgICAgICAgICAgIGV4dGVuc2lvbnMuY2hpbGRUb2tlbnNbZXh0Lm5hbWVdID0gZXh0LmNoaWxkVG9rZW5zO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIG9wdHMuZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnM7XG4gICAgICB9XG5cbiAgICAgIC8vID09LS0gUGFyc2UgXCJvdmVyd3JpdGVcIiBleHRlbnNpb25zIC0tPT0gLy9cbiAgICAgIGlmIChwYWNrLnJlbmRlcmVyKSB7XG4gICAgICAgIGNvbnN0IHJlbmRlcmVyID0gdGhpcy5kZWZhdWx0cy5yZW5kZXJlciB8fCBuZXcgX1JlbmRlcmVyPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+KHRoaXMuZGVmYXVsdHMpO1xuICAgICAgICBmb3IgKGNvbnN0IHByb3AgaW4gcGFjay5yZW5kZXJlcikge1xuICAgICAgICAgIGlmICghKHByb3AgaW4gcmVuZGVyZXIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHJlbmRlcmVyICcke3Byb3B9JyBkb2VzIG5vdCBleGlzdGApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoWydvcHRpb25zJywgJ3BhcnNlciddLmluY2x1ZGVzKHByb3ApKSB7XG4gICAgICAgICAgICAvLyBpZ25vcmUgb3B0aW9ucyBwcm9wZXJ0eVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHJlbmRlcmVyUHJvcCA9IHByb3AgYXMgRXhjbHVkZTxrZXlvZiBfUmVuZGVyZXI8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4sICdvcHRpb25zJyB8ICdwYXJzZXInPjtcbiAgICAgICAgICBjb25zdCByZW5kZXJlckZ1bmMgPSBwYWNrLnJlbmRlcmVyW3JlbmRlcmVyUHJvcF0gYXMgR2VuZXJpY1JlbmRlcmVyRnVuY3Rpb247XG4gICAgICAgICAgY29uc3QgcHJldlJlbmRlcmVyID0gcmVuZGVyZXJbcmVuZGVyZXJQcm9wXSBhcyBHZW5lcmljUmVuZGVyZXJGdW5jdGlvbjtcbiAgICAgICAgICAvLyBSZXBsYWNlIHJlbmRlcmVyIHdpdGggZnVuYyB0byBydW4gZXh0ZW5zaW9uLCBidXQgZmFsbCBiYWNrIGlmIGZhbHNlXG4gICAgICAgICAgcmVuZGVyZXJbcmVuZGVyZXJQcm9wXSA9ICguLi5hcmdzOiB1bmtub3duW10pID0+IHtcbiAgICAgICAgICAgIGxldCByZXQgPSByZW5kZXJlckZ1bmMuYXBwbHkocmVuZGVyZXIsIGFyZ3MpO1xuICAgICAgICAgICAgaWYgKHJldCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgcmV0ID0gcHJldlJlbmRlcmVyLmFwcGx5KHJlbmRlcmVyLCBhcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAocmV0IHx8ICcnKSBhcyBSZW5kZXJlck91dHB1dDtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIG9wdHMucmVuZGVyZXIgPSByZW5kZXJlcjtcbiAgICAgIH1cbiAgICAgIGlmIChwYWNrLnRva2VuaXplcikge1xuICAgICAgICBjb25zdCB0b2tlbml6ZXIgPSB0aGlzLmRlZmF1bHRzLnRva2VuaXplciB8fCBuZXcgX1Rva2VuaXplcjxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0Pih0aGlzLmRlZmF1bHRzKTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wIGluIHBhY2sudG9rZW5pemVyKSB7XG4gICAgICAgICAgaWYgKCEocHJvcCBpbiB0b2tlbml6ZXIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHRva2VuaXplciAnJHtwcm9wfScgZG9lcyBub3QgZXhpc3RgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKFsnb3B0aW9ucycsICdydWxlcycsICdsZXhlciddLmluY2x1ZGVzKHByb3ApKSB7XG4gICAgICAgICAgICAvLyBpZ25vcmUgb3B0aW9ucywgcnVsZXMsIGFuZCBsZXhlciBwcm9wZXJ0aWVzXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgdG9rZW5pemVyUHJvcCA9IHByb3AgYXMgRXhjbHVkZTxrZXlvZiBfVG9rZW5pemVyPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+LCAnb3B0aW9ucycgfCAncnVsZXMnIHwgJ2xleGVyJz47XG4gICAgICAgICAgY29uc3QgdG9rZW5pemVyRnVuYyA9IHBhY2sudG9rZW5pemVyW3Rva2VuaXplclByb3BdIGFzIFVua25vd25GdW5jdGlvbjtcbiAgICAgICAgICBjb25zdCBwcmV2VG9rZW5pemVyID0gdG9rZW5pemVyW3Rva2VuaXplclByb3BdIGFzIFVua25vd25GdW5jdGlvbjtcbiAgICAgICAgICAvLyBSZXBsYWNlIHRva2VuaXplciB3aXRoIGZ1bmMgdG8gcnVuIGV4dGVuc2lvbiwgYnV0IGZhbGwgYmFjayBpZiBmYWxzZVxuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgY2Fubm90IHR5cGUgdG9rZW5pemVyIGZ1bmN0aW9uIGR5bmFtaWNhbGx5XG4gICAgICAgICAgdG9rZW5pemVyW3Rva2VuaXplclByb3BdID0gKC4uLmFyZ3M6IHVua25vd25bXSkgPT4ge1xuICAgICAgICAgICAgbGV0IHJldCA9IHRva2VuaXplckZ1bmMuYXBwbHkodG9rZW5pemVyLCBhcmdzKTtcbiAgICAgICAgICAgIGlmIChyZXQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgIHJldCA9IHByZXZUb2tlbml6ZXIuYXBwbHkodG9rZW5pemVyLCBhcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBvcHRzLnRva2VuaXplciA9IHRva2VuaXplcjtcbiAgICAgIH1cblxuICAgICAgLy8gPT0tLSBQYXJzZSBIb29rcyBleHRlbnNpb25zIC0tPT0gLy9cbiAgICAgIGlmIChwYWNrLmhvb2tzKSB7XG4gICAgICAgIGNvbnN0IGhvb2tzID0gdGhpcy5kZWZhdWx0cy5ob29rcyB8fCBuZXcgX0hvb2tzPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+KCk7XG4gICAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBwYWNrLmhvb2tzKSB7XG4gICAgICAgICAgaWYgKCEocHJvcCBpbiBob29rcykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgaG9vayAnJHtwcm9wfScgZG9lcyBub3QgZXhpc3RgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKFsnb3B0aW9ucycsICdibG9jayddLmluY2x1ZGVzKHByb3ApKSB7XG4gICAgICAgICAgICAvLyBpZ25vcmUgb3B0aW9ucyBhbmQgYmxvY2sgcHJvcGVydGllc1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGhvb2tzUHJvcCA9IHByb3AgYXMgRXhjbHVkZTxrZXlvZiBfSG9va3M8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4sICdvcHRpb25zJyB8ICdibG9jayc+O1xuICAgICAgICAgIGNvbnN0IGhvb2tzRnVuYyA9IHBhY2suaG9va3NbaG9va3NQcm9wXSBhcyBVbmtub3duRnVuY3Rpb247XG4gICAgICAgICAgY29uc3QgcHJldkhvb2sgPSBob29rc1tob29rc1Byb3BdIGFzIFVua25vd25GdW5jdGlvbjtcbiAgICAgICAgICBpZiAoX0hvb2tzLnBhc3NUaHJvdWdoSG9va3MuaGFzKHByb3ApKSB7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGNhbm5vdCB0eXBlIGhvb2sgZnVuY3Rpb24gZHluYW1pY2FsbHlcbiAgICAgICAgICAgIGhvb2tzW2hvb2tzUHJvcF0gPSAoYXJnOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLmRlZmF1bHRzLmFzeW5jICYmIF9Ib29rcy5wYXNzVGhyb3VnaEhvb2tzUmVzcGVjdEFzeW5jLmhhcyhwcm9wKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAoYXN5bmMoKSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCByZXQgPSBhd2FpdCBob29rc0Z1bmMuY2FsbChob29rcywgYXJnKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBwcmV2SG9vay5jYWxsKGhvb2tzLCByZXQpO1xuICAgICAgICAgICAgICAgIH0pKCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjb25zdCByZXQgPSBob29rc0Z1bmMuY2FsbChob29rcywgYXJnKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHByZXZIb29rLmNhbGwoaG9va3MsIHJldCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGNhbm5vdCB0eXBlIGhvb2sgZnVuY3Rpb24gZHluYW1pY2FsbHlcbiAgICAgICAgICAgIGhvb2tzW2hvb2tzUHJvcF0gPSAoLi4uYXJnczogdW5rbm93bltdKSA9PiB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLmRlZmF1bHRzLmFzeW5jKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChhc3luYygpID0+IHtcbiAgICAgICAgICAgICAgICAgIGxldCByZXQgPSBhd2FpdCBob29rc0Z1bmMuYXBwbHkoaG9va3MsIGFyZ3MpO1xuICAgICAgICAgICAgICAgICAgaWYgKHJldCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0ID0gYXdhaXQgcHJldkhvb2suYXBwbHkoaG9va3MsIGFyZ3MpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgICAgICAgICB9KSgpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgbGV0IHJldCA9IGhvb2tzRnVuYy5hcHBseShob29rcywgYXJncyk7XG4gICAgICAgICAgICAgIGlmIChyZXQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0ID0gcHJldkhvb2suYXBwbHkoaG9va3MsIGFyZ3MpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBvcHRzLmhvb2tzID0gaG9va3M7XG4gICAgICB9XG5cbiAgICAgIC8vID09LS0gUGFyc2UgV2Fsa1Rva2VucyBleHRlbnNpb25zIC0tPT0gLy9cbiAgICAgIGlmIChwYWNrLndhbGtUb2tlbnMpIHtcbiAgICAgICAgY29uc3Qgd2Fsa1Rva2VucyA9IHRoaXMuZGVmYXVsdHMud2Fsa1Rva2VucztcbiAgICAgICAgY29uc3QgcGFja1dhbGt0b2tlbnMgPSBwYWNrLndhbGtUb2tlbnM7XG4gICAgICAgIG9wdHMud2Fsa1Rva2VucyA9IGZ1bmN0aW9uKHRva2VuKSB7XG4gICAgICAgICAgbGV0IHZhbHVlczogTWF5YmVQcm9taXNlW10gPSBbXTtcbiAgICAgICAgICB2YWx1ZXMucHVzaChwYWNrV2Fsa3Rva2Vucy5jYWxsKHRoaXMsIHRva2VuKSk7XG4gICAgICAgICAgaWYgKHdhbGtUb2tlbnMpIHtcbiAgICAgICAgICAgIHZhbHVlcyA9IHZhbHVlcy5jb25jYXQod2Fsa1Rva2Vucy5jYWxsKHRoaXMsIHRva2VuKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB2YWx1ZXM7XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZGVmYXVsdHMgPSB7IC4uLnRoaXMuZGVmYXVsdHMsIC4uLm9wdHMgfTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0T3B0aW9ucyhvcHQ6IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4pIHtcbiAgICB0aGlzLmRlZmF1bHRzID0geyAuLi50aGlzLmRlZmF1bHRzLCAuLi5vcHQgfTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGxleGVyKHNyYzogc3RyaW5nLCBvcHRpb25zPzogTWFya2VkT3B0aW9uczxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0Pikge1xuICAgIHJldHVybiBfTGV4ZXIubGV4KHNyYywgb3B0aW9ucyA/PyB0aGlzLmRlZmF1bHRzKTtcbiAgfVxuXG4gIHBhcnNlcih0b2tlbnM6IFRva2VuW10sIG9wdGlvbnM/OiBNYXJrZWRPcHRpb25zPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+KSB7XG4gICAgcmV0dXJuIF9QYXJzZXIucGFyc2U8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4odG9rZW5zLCBvcHRpb25zID8/IHRoaXMuZGVmYXVsdHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZU1hcmtkb3duKGJsb2NrVHlwZTogYm9vbGVhbikge1xuICAgIHR5cGUgb3ZlcmxvYWRlZFBhcnNlID0ge1xuICAgICAgKHNyYzogc3RyaW5nLCBvcHRpb25zOiBNYXJrZWRPcHRpb25zPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+ICYgeyBhc3luYzogdHJ1ZSB9KTogUHJvbWlzZTxQYXJzZXJPdXRwdXQ+O1xuICAgICAgKHNyYzogc3RyaW5nLCBvcHRpb25zOiBNYXJrZWRPcHRpb25zPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+ICYgeyBhc3luYzogZmFsc2UgfSk6IFBhcnNlck91dHB1dDtcbiAgICAgIChzcmM6IHN0cmluZywgb3B0aW9ucz86IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4gfCBudWxsKTogUGFyc2VyT3V0cHV0IHwgUHJvbWlzZTxQYXJzZXJPdXRwdXQ+O1xuICAgIH07XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IHBhcnNlOiBvdmVybG9hZGVkUGFyc2UgPSAoc3JjOiBzdHJpbmcsIG9wdGlvbnM/OiBNYXJrZWRPcHRpb25zPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+IHwgbnVsbCk6IGFueSA9PiB7XG4gICAgICBjb25zdCBvcmlnT3B0ID0geyAuLi5vcHRpb25zIH07XG4gICAgICBjb25zdCBvcHQgPSB7IC4uLnRoaXMuZGVmYXVsdHMsIC4uLm9yaWdPcHQgfTtcblxuICAgICAgY29uc3QgdGhyb3dFcnJvciA9IHRoaXMub25FcnJvcighIW9wdC5zaWxlbnQsICEhb3B0LmFzeW5jKTtcblxuICAgICAgLy8gdGhyb3cgZXJyb3IgaWYgYW4gZXh0ZW5zaW9uIHNldCBhc3luYyB0byB0cnVlIGJ1dCBwYXJzZSB3YXMgY2FsbGVkIHdpdGggYXN5bmM6IGZhbHNlXG4gICAgICBpZiAodGhpcy5kZWZhdWx0cy5hc3luYyA9PT0gdHJ1ZSAmJiBvcmlnT3B0LmFzeW5jID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihuZXcgRXJyb3IoJ21hcmtlZCgpOiBUaGUgYXN5bmMgb3B0aW9uIHdhcyBzZXQgdG8gdHJ1ZSBieSBhbiBleHRlbnNpb24uIFJlbW92ZSBhc3luYzogZmFsc2UgZnJvbSB0aGUgcGFyc2Ugb3B0aW9ucyBvYmplY3QgdG8gcmV0dXJuIGEgUHJvbWlzZS4nKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIHRocm93IGVycm9yIGluIGNhc2Ugb2Ygbm9uIHN0cmluZyBpbnB1dFxuICAgICAgaWYgKHR5cGVvZiBzcmMgPT09ICd1bmRlZmluZWQnIHx8IHNyYyA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihuZXcgRXJyb3IoJ21hcmtlZCgpOiBpbnB1dCBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkIG9yIG51bGwnKSk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHNyYyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IobmV3IEVycm9yKCdtYXJrZWQoKTogaW5wdXQgcGFyYW1ldGVyIGlzIG9mIHR5cGUgJ1xuICAgICAgICAgICsgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHNyYykgKyAnLCBzdHJpbmcgZXhwZWN0ZWQnKSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHQuaG9va3MpIHtcbiAgICAgICAgb3B0Lmhvb2tzLm9wdGlvbnMgPSBvcHQ7XG4gICAgICAgIG9wdC5ob29rcy5ibG9jayA9IGJsb2NrVHlwZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdC5hc3luYykge1xuICAgICAgICByZXR1cm4gKGFzeW5jKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHByb2Nlc3NlZFNyYyA9IG9wdC5ob29rcyA/IGF3YWl0IG9wdC5ob29rcy5wcmVwcm9jZXNzKHNyYykgOiBzcmM7XG4gICAgICAgICAgY29uc3QgbGV4ZXIgPSBvcHQuaG9va3MgPyBhd2FpdCBvcHQuaG9va3MucHJvdmlkZUxleGVyKCkgOiAoYmxvY2tUeXBlID8gX0xleGVyLmxleCA6IF9MZXhlci5sZXhJbmxpbmUpO1xuICAgICAgICAgIGNvbnN0IHRva2VucyA9IGF3YWl0IGxleGVyKHByb2Nlc3NlZFNyYywgb3B0KTtcbiAgICAgICAgICBjb25zdCBwcm9jZXNzZWRUb2tlbnMgPSBvcHQuaG9va3MgPyBhd2FpdCBvcHQuaG9va3MucHJvY2Vzc0FsbFRva2Vucyh0b2tlbnMpIDogdG9rZW5zO1xuICAgICAgICAgIGlmIChvcHQud2Fsa1Rva2Vucykge1xuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwodGhpcy53YWxrVG9rZW5zKHByb2Nlc3NlZFRva2Vucywgb3B0LndhbGtUb2tlbnMpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcGFyc2VyID0gb3B0Lmhvb2tzID8gYXdhaXQgb3B0Lmhvb2tzLnByb3ZpZGVQYXJzZXIoKSA6IChibG9ja1R5cGUgPyBfUGFyc2VyLnBhcnNlIDogX1BhcnNlci5wYXJzZUlubGluZSk7XG4gICAgICAgICAgY29uc3QgaHRtbCA9IGF3YWl0IHBhcnNlcihwcm9jZXNzZWRUb2tlbnMsIG9wdCk7XG4gICAgICAgICAgcmV0dXJuIG9wdC5ob29rcyA/IGF3YWl0IG9wdC5ob29rcy5wb3N0cHJvY2VzcyhodG1sKSA6IGh0bWw7XG4gICAgICAgIH0pKCkuY2F0Y2godGhyb3dFcnJvcik7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChvcHQuaG9va3MpIHtcbiAgICAgICAgICBzcmMgPSBvcHQuaG9va3MucHJlcHJvY2VzcyhzcmMpIGFzIHN0cmluZztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsZXhlciA9IG9wdC5ob29rcyA/IG9wdC5ob29rcy5wcm92aWRlTGV4ZXIoKSA6IChibG9ja1R5cGUgPyBfTGV4ZXIubGV4IDogX0xleGVyLmxleElubGluZSk7XG4gICAgICAgIGxldCB0b2tlbnMgPSBsZXhlcihzcmMsIG9wdCk7XG4gICAgICAgIGlmIChvcHQuaG9va3MpIHtcbiAgICAgICAgICB0b2tlbnMgPSBvcHQuaG9va3MucHJvY2Vzc0FsbFRva2Vucyh0b2tlbnMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHQud2Fsa1Rva2Vucykge1xuICAgICAgICAgIHRoaXMud2Fsa1Rva2Vucyh0b2tlbnMsIG9wdC53YWxrVG9rZW5zKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJzZXIgPSBvcHQuaG9va3MgPyBvcHQuaG9va3MucHJvdmlkZVBhcnNlcigpIDogKGJsb2NrVHlwZSA/IF9QYXJzZXIucGFyc2UgOiBfUGFyc2VyLnBhcnNlSW5saW5lKTtcbiAgICAgICAgbGV0IGh0bWwgPSBwYXJzZXIodG9rZW5zLCBvcHQpO1xuICAgICAgICBpZiAob3B0Lmhvb2tzKSB7XG4gICAgICAgICAgaHRtbCA9IG9wdC5ob29rcy5wb3N0cHJvY2VzcyhodG1sKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaHRtbDtcbiAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihlIGFzIEVycm9yKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIHBhcnNlO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkVycm9yKHNpbGVudDogYm9vbGVhbiwgYXN5bmM6IGJvb2xlYW4pIHtcbiAgICByZXR1cm4gKGU6IEVycm9yKTogc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgICAgIGUubWVzc2FnZSArPSAnXFxuUGxlYXNlIHJlcG9ydCB0aGlzIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJrZWRqcy9tYXJrZWQuJztcblxuICAgICAgaWYgKHNpbGVudCkge1xuICAgICAgICBjb25zdCBtc2cgPSAnPHA+QW4gZXJyb3Igb2NjdXJyZWQ6PC9wPjxwcmU+J1xuICAgICAgICAgICsgZXNjYXBlSHRtbEVudGl0aWVzKGUubWVzc2FnZSArICcnLCB0cnVlKVxuICAgICAgICAgICsgJzwvcHJlPic7XG4gICAgICAgIGlmIChhc3luYykge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobXNnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbXNnO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXN5bmMpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgX0xleGVyIH0gZnJvbSAnLi9MZXhlci50cyc7XG5pbXBvcnQgeyBfUGFyc2VyIH0gZnJvbSAnLi9QYXJzZXIudHMnO1xuaW1wb3J0IHsgX1Rva2VuaXplciB9IGZyb20gJy4vVG9rZW5pemVyLnRzJztcbmltcG9ydCB7IF9SZW5kZXJlciB9IGZyb20gJy4vUmVuZGVyZXIudHMnO1xuaW1wb3J0IHsgX1RleHRSZW5kZXJlciB9IGZyb20gJy4vVGV4dFJlbmRlcmVyLnRzJztcbmltcG9ydCB7IF9Ib29rcyB9IGZyb20gJy4vSG9va3MudHMnO1xuaW1wb3J0IHsgTWFya2VkIH0gZnJvbSAnLi9JbnN0YW5jZS50cyc7XG5pbXBvcnQge1xuICBfZ2V0RGVmYXVsdHMsXG4gIGNoYW5nZURlZmF1bHRzLFxuICBfZGVmYXVsdHMsXG59IGZyb20gJy4vZGVmYXVsdHMudHMnO1xuaW1wb3J0IHR5cGUgeyBNYXJrZWRFeHRlbnNpb24sIE1hcmtlZE9wdGlvbnMgfSBmcm9tICcuL01hcmtlZE9wdGlvbnMudHMnO1xuaW1wb3J0IHR5cGUgeyBUb2tlbiwgVG9rZW5zTGlzdCB9IGZyb20gJy4vVG9rZW5zLnRzJztcbmltcG9ydCB0eXBlIHsgTWF5YmVQcm9taXNlIH0gZnJvbSAnLi9JbnN0YW5jZS50cyc7XG5cbmNvbnN0IG1hcmtlZEluc3RhbmNlID0gbmV3IE1hcmtlZCgpO1xuXG4vKipcbiAqIENvbXBpbGVzIG1hcmtkb3duIHRvIEhUTUwgYXN5bmNocm9ub3VzbHkuXG4gKlxuICogQHBhcmFtIHNyYyBTdHJpbmcgb2YgbWFya2Rvd24gc291cmNlIHRvIGJlIGNvbXBpbGVkXG4gKiBAcGFyYW0gb3B0aW9ucyBIYXNoIG9mIG9wdGlvbnMsIGhhdmluZyBhc3luYzogdHJ1ZVxuICogQHJldHVybiBQcm9taXNlIG9mIHN0cmluZyBvZiBjb21waWxlZCBIVE1MXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXJrZWQoc3JjOiBzdHJpbmcsIG9wdGlvbnM6IE1hcmtlZE9wdGlvbnMgJiB7IGFzeW5jOiB0cnVlIH0pOiBQcm9taXNlPHN0cmluZz47XG5cbi8qKlxuICogQ29tcGlsZXMgbWFya2Rvd24gdG8gSFRNTC5cbiAqXG4gKiBAcGFyYW0gc3JjIFN0cmluZyBvZiBtYXJrZG93biBzb3VyY2UgdG8gYmUgY29tcGlsZWRcbiAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbmFsIGhhc2ggb2Ygb3B0aW9uc1xuICogQHJldHVybiBTdHJpbmcgb2YgY29tcGlsZWQgSFRNTC4gV2lsbCBiZSBhIFByb21pc2Ugb2Ygc3RyaW5nIGlmIGFzeW5jIGlzIHNldCB0byB0cnVlIGJ5IGFueSBleHRlbnNpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFya2VkKHNyYzogc3RyaW5nLCBvcHRpb25zOiBNYXJrZWRPcHRpb25zICYgeyBhc3luYzogZmFsc2UgfSk6IHN0cmluZztcbmV4cG9ydCBmdW5jdGlvbiBtYXJrZWQoc3JjOiBzdHJpbmcsIG9wdGlvbnM6IE1hcmtlZE9wdGlvbnMgJiB7IGFzeW5jOiB0cnVlIH0pOiBQcm9taXNlPHN0cmluZz47XG5leHBvcnQgZnVuY3Rpb24gbWFya2VkKHNyYzogc3RyaW5nLCBvcHRpb25zPzogTWFya2VkT3B0aW9ucyB8IG51bGwpOiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz47XG5leHBvcnQgZnVuY3Rpb24gbWFya2VkKHNyYzogc3RyaW5nLCBvcHQ/OiBNYXJrZWRPcHRpb25zIHwgbnVsbCk6IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPiB7XG4gIHJldHVybiBtYXJrZWRJbnN0YW5jZS5wYXJzZShzcmMsIG9wdCk7XG59XG5cbi8qKlxuICogU2V0cyB0aGUgZGVmYXVsdCBvcHRpb25zLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIEhhc2ggb2Ygb3B0aW9uc1xuICovXG5tYXJrZWQub3B0aW9ucyA9XG4gIG1hcmtlZC5zZXRPcHRpb25zID0gZnVuY3Rpb24ob3B0aW9uczogTWFya2VkT3B0aW9ucykge1xuICAgIG1hcmtlZEluc3RhbmNlLnNldE9wdGlvbnMob3B0aW9ucyk7XG4gICAgbWFya2VkLmRlZmF1bHRzID0gbWFya2VkSW5zdGFuY2UuZGVmYXVsdHM7XG4gICAgY2hhbmdlRGVmYXVsdHMobWFya2VkLmRlZmF1bHRzKTtcbiAgICByZXR1cm4gbWFya2VkO1xuICB9O1xuXG4vKipcbiAqIEdldHMgdGhlIG9yaWdpbmFsIG1hcmtlZCBkZWZhdWx0IG9wdGlvbnMuXG4gKi9cbm1hcmtlZC5nZXREZWZhdWx0cyA9IF9nZXREZWZhdWx0cztcblxubWFya2VkLmRlZmF1bHRzID0gX2RlZmF1bHRzO1xuXG4vKipcbiAqIFVzZSBFeHRlbnNpb25cbiAqL1xuXG5tYXJrZWQudXNlID0gZnVuY3Rpb24oLi4uYXJnczogTWFya2VkRXh0ZW5zaW9uW10pIHtcbiAgbWFya2VkSW5zdGFuY2UudXNlKC4uLmFyZ3MpO1xuICBtYXJrZWQuZGVmYXVsdHMgPSBtYXJrZWRJbnN0YW5jZS5kZWZhdWx0cztcbiAgY2hhbmdlRGVmYXVsdHMobWFya2VkLmRlZmF1bHRzKTtcbiAgcmV0dXJuIG1hcmtlZDtcbn07XG5cbi8qKlxuICogUnVuIGNhbGxiYWNrIGZvciBldmVyeSB0b2tlblxuICovXG5cbm1hcmtlZC53YWxrVG9rZW5zID0gZnVuY3Rpb24odG9rZW5zOiBUb2tlbltdIHwgVG9rZW5zTGlzdCwgY2FsbGJhY2s6ICh0b2tlbjogVG9rZW4pID0+IE1heWJlUHJvbWlzZSB8IE1heWJlUHJvbWlzZVtdKSB7XG4gIHJldHVybiBtYXJrZWRJbnN0YW5jZS53YWxrVG9rZW5zKHRva2VucywgY2FsbGJhY2spO1xufTtcblxuLyoqXG4gKiBDb21waWxlcyBtYXJrZG93biB0byBIVE1MIHdpdGhvdXQgZW5jbG9zaW5nIGBwYCB0YWcuXG4gKlxuICogQHBhcmFtIHNyYyBTdHJpbmcgb2YgbWFya2Rvd24gc291cmNlIHRvIGJlIGNvbXBpbGVkXG4gKiBAcGFyYW0gb3B0aW9ucyBIYXNoIG9mIG9wdGlvbnNcbiAqIEByZXR1cm4gU3RyaW5nIG9mIGNvbXBpbGVkIEhUTUxcbiAqL1xubWFya2VkLnBhcnNlSW5saW5lID0gbWFya2VkSW5zdGFuY2UucGFyc2VJbmxpbmU7XG5cbi8qKlxuICogRXhwb3NlXG4gKi9cbm1hcmtlZC5QYXJzZXIgPSBfUGFyc2VyO1xubWFya2VkLnBhcnNlciA9IF9QYXJzZXIucGFyc2U7XG5tYXJrZWQuUmVuZGVyZXIgPSBfUmVuZGVyZXI7XG5tYXJrZWQuVGV4dFJlbmRlcmVyID0gX1RleHRSZW5kZXJlcjtcbm1hcmtlZC5MZXhlciA9IF9MZXhlcjtcbm1hcmtlZC5sZXhlciA9IF9MZXhlci5sZXg7XG5tYXJrZWQuVG9rZW5pemVyID0gX1Rva2VuaXplcjtcbm1hcmtlZC5Ib29rcyA9IF9Ib29rcztcbm1hcmtlZC5wYXJzZSA9IG1hcmtlZDtcblxuZXhwb3J0IGNvbnN0IG9wdGlvbnMgPSBtYXJrZWQub3B0aW9ucztcbmV4cG9ydCBjb25zdCBzZXRPcHRpb25zID0gbWFya2VkLnNldE9wdGlvbnM7XG5leHBvcnQgY29uc3QgdXNlID0gbWFya2VkLnVzZTtcbmV4cG9ydCBjb25zdCB3YWxrVG9rZW5zID0gbWFya2VkLndhbGtUb2tlbnM7XG5leHBvcnQgY29uc3QgcGFyc2VJbmxpbmUgPSBtYXJrZWQucGFyc2VJbmxpbmU7XG5leHBvcnQgY29uc3QgcGFyc2UgPSBtYXJrZWQ7XG5leHBvcnQgY29uc3QgcGFyc2VyID0gX1BhcnNlci5wYXJzZTtcbmV4cG9ydCBjb25zdCBsZXhlciA9IF9MZXhlci5sZXg7XG5leHBvcnQgeyBfZGVmYXVsdHMgYXMgZGVmYXVsdHMsIF9nZXREZWZhdWx0cyBhcyBnZXREZWZhdWx0cyB9IGZyb20gJy4vZGVmYXVsdHMudHMnO1xuZXhwb3J0IHsgX0xleGVyIGFzIExleGVyIH0gZnJvbSAnLi9MZXhlci50cyc7XG5leHBvcnQgeyBfUGFyc2VyIGFzIFBhcnNlciB9IGZyb20gJy4vUGFyc2VyLnRzJztcbmV4cG9ydCB7IF9Ub2tlbml6ZXIgYXMgVG9rZW5pemVyIH0gZnJvbSAnLi9Ub2tlbml6ZXIudHMnO1xuZXhwb3J0IHsgX1JlbmRlcmVyIGFzIFJlbmRlcmVyIH0gZnJvbSAnLi9SZW5kZXJlci50cyc7XG5leHBvcnQgeyBfVGV4dFJlbmRlcmVyIGFzIFRleHRSZW5kZXJlciB9IGZyb20gJy4vVGV4dFJlbmRlcmVyLnRzJztcbmV4cG9ydCB7IF9Ib29rcyBhcyBIb29rcyB9IGZyb20gJy4vSG9va3MudHMnO1xuZXhwb3J0IHsgTWFya2VkIH0gZnJvbSAnLi9JbnN0YW5jZS50cyc7XG5leHBvcnQgdHlwZSAqIGZyb20gJy4vTWFya2VkT3B0aW9ucy50cyc7XG5leHBvcnQgdHlwZSAqIGZyb20gJy4vVG9rZW5zLnRzJztcbiIsICJjb25zdCB7XG4gIGVudHJpZXMsXG4gIHNldFByb3RvdHlwZU9mLFxuICBpc0Zyb3plbixcbiAgZ2V0UHJvdG90eXBlT2YsXG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcixcbn0gPSBPYmplY3Q7XG5cbmxldCB7IGZyZWV6ZSwgc2VhbCwgY3JlYXRlIH0gPSBPYmplY3Q7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgaW1wb3J0L25vLW11dGFibGUtZXhwb3J0c1xubGV0IHsgYXBwbHksIGNvbnN0cnVjdCB9ID0gdHlwZW9mIFJlZmxlY3QgIT09ICd1bmRlZmluZWQnICYmIFJlZmxlY3Q7XG5cbmlmICghZnJlZXplKSB7XG4gIGZyZWV6ZSA9IGZ1bmN0aW9uIDxUPih4OiBUKTogVCB7XG4gICAgcmV0dXJuIHg7XG4gIH07XG59XG5cbmlmICghc2VhbCkge1xuICBzZWFsID0gZnVuY3Rpb24gPFQ+KHg6IFQpOiBUIHtcbiAgICByZXR1cm4geDtcbiAgfTtcbn1cblxuaWYgKCFhcHBseSkge1xuICBhcHBseSA9IGZ1bmN0aW9uIDxUPihcbiAgICBmdW5jOiAodGhpc0FyZzogYW55LCAuLi5hcmdzOiBhbnlbXSkgPT4gVCxcbiAgICB0aGlzQXJnOiBhbnksXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogVCB7XG4gICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyk7XG4gIH07XG59XG5cbmlmICghY29uc3RydWN0KSB7XG4gIGNvbnN0cnVjdCA9IGZ1bmN0aW9uIDxUPihGdW5jOiBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBULCAuLi5hcmdzOiBhbnlbXSk6IFQge1xuICAgIHJldHVybiBuZXcgRnVuYyguLi5hcmdzKTtcbiAgfTtcbn1cblxuY29uc3QgYXJyYXlGb3JFYWNoID0gdW5hcHBseShBcnJheS5wcm90b3R5cGUuZm9yRWFjaCk7XG5jb25zdCBhcnJheUluZGV4T2YgPSB1bmFwcGx5KEFycmF5LnByb3RvdHlwZS5pbmRleE9mKTtcbmNvbnN0IGFycmF5TGFzdEluZGV4T2YgPSB1bmFwcGx5KEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZik7XG5jb25zdCBhcnJheVBvcCA9IHVuYXBwbHkoQXJyYXkucHJvdG90eXBlLnBvcCk7XG5jb25zdCBhcnJheVB1c2ggPSB1bmFwcGx5KEFycmF5LnByb3RvdHlwZS5wdXNoKTtcbmNvbnN0IGFycmF5U2xpY2UgPSB1bmFwcGx5KEFycmF5LnByb3RvdHlwZS5zbGljZSk7XG5jb25zdCBhcnJheVNwbGljZSA9IHVuYXBwbHkoQXJyYXkucHJvdG90eXBlLnNwbGljZSk7XG5cbmNvbnN0IHN0cmluZ1RvTG93ZXJDYXNlID0gdW5hcHBseShTdHJpbmcucHJvdG90eXBlLnRvTG93ZXJDYXNlKTtcbmNvbnN0IHN0cmluZ1RvU3RyaW5nID0gdW5hcHBseShTdHJpbmcucHJvdG90eXBlLnRvU3RyaW5nKTtcbmNvbnN0IHN0cmluZ01hdGNoID0gdW5hcHBseShTdHJpbmcucHJvdG90eXBlLm1hdGNoKTtcbmNvbnN0IHN0cmluZ1JlcGxhY2UgPSB1bmFwcGx5KFN0cmluZy5wcm90b3R5cGUucmVwbGFjZSk7XG5jb25zdCBzdHJpbmdJbmRleE9mID0gdW5hcHBseShTdHJpbmcucHJvdG90eXBlLmluZGV4T2YpO1xuY29uc3Qgc3RyaW5nVHJpbSA9IHVuYXBwbHkoU3RyaW5nLnByb3RvdHlwZS50cmltKTtcblxuY29uc3Qgb2JqZWN0SGFzT3duUHJvcGVydHkgPSB1bmFwcGx5KE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkpO1xuXG5jb25zdCByZWdFeHBUZXN0ID0gdW5hcHBseShSZWdFeHAucHJvdG90eXBlLnRlc3QpO1xuXG5jb25zdCB0eXBlRXJyb3JDcmVhdGUgPSB1bmNvbnN0cnVjdChUeXBlRXJyb3IpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgZnVuY3Rpb24gdGhhdCBjYWxscyB0aGUgZ2l2ZW4gZnVuY3Rpb24gd2l0aCBhIHNwZWNpZmllZCB0aGlzQXJnIGFuZCBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIGZ1bmMgLSBUaGUgZnVuY3Rpb24gdG8gYmUgd3JhcHBlZCBhbmQgY2FsbGVkLlxuICogQHJldHVybnMgQSBuZXcgZnVuY3Rpb24gdGhhdCBjYWxscyB0aGUgZ2l2ZW4gZnVuY3Rpb24gd2l0aCBhIHNwZWNpZmllZCB0aGlzQXJnIGFuZCBhcmd1bWVudHMuXG4gKi9cbmZ1bmN0aW9uIHVuYXBwbHk8VD4oXG4gIGZ1bmM6ICh0aGlzQXJnOiBhbnksIC4uLmFyZ3M6IGFueVtdKSA9PiBUXG4pOiAodGhpc0FyZzogYW55LCAuLi5hcmdzOiBhbnlbXSkgPT4gVCB7XG4gIHJldHVybiAodGhpc0FyZzogYW55LCAuLi5hcmdzOiBhbnlbXSk6IFQgPT4ge1xuICAgIGlmICh0aGlzQXJnIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICB0aGlzQXJnLmxhc3RJbmRleCA9IDA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFwcGx5KGZ1bmMsIHRoaXNBcmcsIGFyZ3MpO1xuICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgZnVuY3Rpb24gdGhhdCBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIG9mIHRoZSBnaXZlbiBjb25zdHJ1Y3RvciBmdW5jdGlvbiB3aXRoIHRoZSBwcm92aWRlZCBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIGZ1bmMgLSBUaGUgY29uc3RydWN0b3IgZnVuY3Rpb24gdG8gYmUgd3JhcHBlZCBhbmQgY2FsbGVkLlxuICogQHJldHVybnMgQSBuZXcgZnVuY3Rpb24gdGhhdCBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIG9mIHRoZSBnaXZlbiBjb25zdHJ1Y3RvciBmdW5jdGlvbiB3aXRoIHRoZSBwcm92aWRlZCBhcmd1bWVudHMuXG4gKi9cbmZ1bmN0aW9uIHVuY29uc3RydWN0PFQ+KFxuICBGdW5jOiBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUXG4pOiAoLi4uYXJnczogYW55W10pID0+IFQge1xuICByZXR1cm4gKC4uLmFyZ3M6IGFueVtdKTogVCA9PiBjb25zdHJ1Y3QoRnVuYywgYXJncyk7XG59XG5cbi8qKlxuICogQWRkIHByb3BlcnRpZXMgdG8gYSBsb29rdXAgdGFibGVcbiAqXG4gKiBAcGFyYW0gc2V0IC0gVGhlIHNldCB0byB3aGljaCBlbGVtZW50cyB3aWxsIGJlIGFkZGVkLlxuICogQHBhcmFtIGFycmF5IC0gVGhlIGFycmF5IGNvbnRhaW5pbmcgZWxlbWVudHMgdG8gYmUgYWRkZWQgdG8gdGhlIHNldC5cbiAqIEBwYXJhbSB0cmFuc2Zvcm1DYXNlRnVuYyAtIEFuIG9wdGlvbmFsIGZ1bmN0aW9uIHRvIHRyYW5zZm9ybSB0aGUgY2FzZSBvZiBlYWNoIGVsZW1lbnQgYmVmb3JlIGFkZGluZyB0byB0aGUgc2V0LlxuICogQHJldHVybnMgVGhlIG1vZGlmaWVkIHNldCB3aXRoIGFkZGVkIGVsZW1lbnRzLlxuICovXG5mdW5jdGlvbiBhZGRUb1NldChcbiAgc2V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBhcnJheTogcmVhZG9ubHkgYW55W10sXG4gIHRyYW5zZm9ybUNhc2VGdW5jOiBSZXR1cm5UeXBlPHR5cGVvZiB1bmFwcGx5PHN0cmluZz4+ID0gc3RyaW5nVG9Mb3dlckNhc2Vcbik6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICBpZiAoc2V0UHJvdG90eXBlT2YpIHtcbiAgICAvLyBNYWtlICdpbicgYW5kIHRydXRoeSBjaGVja3MgbGlrZSBCb29sZWFuKHNldC5jb25zdHJ1Y3RvcilcbiAgICAvLyBpbmRlcGVuZGVudCBvZiBhbnkgcHJvcGVydGllcyBkZWZpbmVkIG9uIE9iamVjdC5wcm90b3R5cGUuXG4gICAgLy8gUHJldmVudCBwcm90b3R5cGUgc2V0dGVycyBmcm9tIGludGVyY2VwdGluZyBzZXQgYXMgYSB0aGlzIHZhbHVlLlxuICAgIHNldFByb3RvdHlwZU9mKHNldCwgbnVsbCk7XG4gIH1cblxuICBsZXQgbCA9IGFycmF5Lmxlbmd0aDtcbiAgd2hpbGUgKGwtLSkge1xuICAgIGxldCBlbGVtZW50ID0gYXJyYXlbbF07XG4gICAgaWYgKHR5cGVvZiBlbGVtZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgbGNFbGVtZW50ID0gdHJhbnNmb3JtQ2FzZUZ1bmMoZWxlbWVudCk7XG4gICAgICBpZiAobGNFbGVtZW50ICE9PSBlbGVtZW50KSB7XG4gICAgICAgIC8vIENvbmZpZyBwcmVzZXRzIChlLmcuIHRhZ3MuanMsIGF0dHJzLmpzKSBhcmUgaW1tdXRhYmxlLlxuICAgICAgICBpZiAoIWlzRnJvemVuKGFycmF5KSkge1xuICAgICAgICAgIChhcnJheSBhcyBhbnlbXSlbbF0gPSBsY0VsZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBlbGVtZW50ID0gbGNFbGVtZW50O1xuICAgICAgfVxuICAgIH1cblxuICAgIHNldFtlbGVtZW50XSA9IHRydWU7XG4gIH1cblxuICByZXR1cm4gc2V0O1xufVxuXG4vKipcbiAqIENsZWFuIHVwIGFuIGFycmF5IHRvIGhhcmRlbiBhZ2FpbnN0IENTUFBcbiAqXG4gKiBAcGFyYW0gYXJyYXkgLSBUaGUgYXJyYXkgdG8gYmUgY2xlYW5lZC5cbiAqIEByZXR1cm5zIFRoZSBjbGVhbmVkIHZlcnNpb24gb2YgdGhlIGFycmF5XG4gKi9cbmZ1bmN0aW9uIGNsZWFuQXJyYXk8VD4oYXJyYXk6IFRbXSk6IEFycmF5PFQgfCBudWxsPiB7XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBhcnJheS5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBpc1Byb3BlcnR5RXhpc3QgPSBvYmplY3RIYXNPd25Qcm9wZXJ0eShhcnJheSwgaW5kZXgpO1xuXG4gICAgaWYgKCFpc1Byb3BlcnR5RXhpc3QpIHtcbiAgICAgIGFycmF5W2luZGV4XSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFycmF5O1xufVxuXG4vKipcbiAqIFNoYWxsb3cgY2xvbmUgYW4gb2JqZWN0XG4gKlxuICogQHBhcmFtIG9iamVjdCAtIFRoZSBvYmplY3QgdG8gYmUgY2xvbmVkLlxuICogQHJldHVybnMgQSBuZXcgb2JqZWN0IHRoYXQgY29waWVzIHRoZSBvcmlnaW5hbC5cbiAqL1xuZnVuY3Rpb24gY2xvbmU8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+KG9iamVjdDogVCk6IFQge1xuICBjb25zdCBuZXdPYmplY3QgPSBjcmVhdGUobnVsbCk7XG5cbiAgZm9yIChjb25zdCBbcHJvcGVydHksIHZhbHVlXSBvZiBlbnRyaWVzKG9iamVjdCkpIHtcbiAgICBjb25zdCBpc1Byb3BlcnR5RXhpc3QgPSBvYmplY3RIYXNPd25Qcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5KTtcblxuICAgIGlmIChpc1Byb3BlcnR5RXhpc3QpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBuZXdPYmplY3RbcHJvcGVydHldID0gY2xlYW5BcnJheSh2YWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICB2YWx1ZSAmJlxuICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgICAgIHZhbHVlLmNvbnN0cnVjdG9yID09PSBPYmplY3RcbiAgICAgICkge1xuICAgICAgICBuZXdPYmplY3RbcHJvcGVydHldID0gY2xvbmUodmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3T2JqZWN0W3Byb3BlcnR5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXdPYmplY3Q7XG59XG5cbi8qKlxuICogVGhpcyBtZXRob2QgYXV0b21hdGljYWxseSBjaGVja3MgaWYgdGhlIHByb3AgaXMgZnVuY3Rpb24gb3IgZ2V0dGVyIGFuZCBiZWhhdmVzIGFjY29yZGluZ2x5LlxuICpcbiAqIEBwYXJhbSBvYmplY3QgLSBUaGUgb2JqZWN0IHRvIGxvb2sgdXAgdGhlIGdldHRlciBmdW5jdGlvbiBpbiBpdHMgcHJvdG90eXBlIGNoYWluLlxuICogQHBhcmFtIHByb3AgLSBUaGUgcHJvcGVydHkgbmFtZSBmb3Igd2hpY2ggdG8gZmluZCB0aGUgZ2V0dGVyIGZ1bmN0aW9uLlxuICogQHJldHVybnMgVGhlIGdldHRlciBmdW5jdGlvbiBmb3VuZCBpbiB0aGUgcHJvdG90eXBlIGNoYWluIG9yIGEgZmFsbGJhY2sgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGxvb2t1cEdldHRlcjxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4oXG4gIG9iamVjdDogVCxcbiAgcHJvcDogc3RyaW5nXG4pOiBSZXR1cm5UeXBlPHR5cGVvZiB1bmFwcGx5PGFueT4+IHwgKCgpID0+IG51bGwpIHtcbiAgd2hpbGUgKG9iamVjdCAhPT0gbnVsbCkge1xuICAgIGNvbnN0IGRlc2MgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wKTtcblxuICAgIGlmIChkZXNjKSB7XG4gICAgICBpZiAoZGVzYy5nZXQpIHtcbiAgICAgICAgcmV0dXJuIHVuYXBwbHkoZGVzYy5nZXQpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGRlc2MudmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIHVuYXBwbHkoZGVzYy52YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgb2JqZWN0ID0gZ2V0UHJvdG90eXBlT2Yob2JqZWN0KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZhbGxiYWNrVmFsdWUoKTogbnVsbCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gZmFsbGJhY2tWYWx1ZTtcbn1cblxuZXhwb3J0IHtcbiAgLy8gQXJyYXlcbiAgYXJyYXlGb3JFYWNoLFxuICBhcnJheUluZGV4T2YsXG4gIGFycmF5TGFzdEluZGV4T2YsXG4gIGFycmF5UG9wLFxuICBhcnJheVB1c2gsXG4gIGFycmF5U2xpY2UsXG4gIGFycmF5U3BsaWNlLFxuICAvLyBPYmplY3RcbiAgZW50cmllcyxcbiAgZnJlZXplLFxuICBnZXRQcm90b3R5cGVPZixcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxuICBpc0Zyb3plbixcbiAgc2V0UHJvdG90eXBlT2YsXG4gIHNlYWwsXG4gIGNsb25lLFxuICBjcmVhdGUsXG4gIG9iamVjdEhhc093blByb3BlcnR5LFxuICAvLyBSZWdFeHBcbiAgcmVnRXhwVGVzdCxcbiAgLy8gU3RyaW5nXG4gIHN0cmluZ0luZGV4T2YsXG4gIHN0cmluZ01hdGNoLFxuICBzdHJpbmdSZXBsYWNlLFxuICBzdHJpbmdUb0xvd2VyQ2FzZSxcbiAgc3RyaW5nVG9TdHJpbmcsXG4gIHN0cmluZ1RyaW0sXG4gIC8vIEVycm9yc1xuICB0eXBlRXJyb3JDcmVhdGUsXG4gIC8vIE90aGVyXG4gIGxvb2t1cEdldHRlcixcbiAgYWRkVG9TZXQsXG4gIC8vIFJlZmxlY3RcbiAgdW5hcHBseSxcbiAgdW5jb25zdHJ1Y3QsXG59O1xuIiwgImltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4vdXRpbHMuanMnO1xuXG5leHBvcnQgY29uc3QgaHRtbCA9IGZyZWV6ZShbXG4gICdhJyxcbiAgJ2FiYnInLFxuICAnYWNyb255bScsXG4gICdhZGRyZXNzJyxcbiAgJ2FyZWEnLFxuICAnYXJ0aWNsZScsXG4gICdhc2lkZScsXG4gICdhdWRpbycsXG4gICdiJyxcbiAgJ2JkaScsXG4gICdiZG8nLFxuICAnYmlnJyxcbiAgJ2JsaW5rJyxcbiAgJ2Jsb2NrcXVvdGUnLFxuICAnYm9keScsXG4gICdicicsXG4gICdidXR0b24nLFxuICAnY2FudmFzJyxcbiAgJ2NhcHRpb24nLFxuICAnY2VudGVyJyxcbiAgJ2NpdGUnLFxuICAnY29kZScsXG4gICdjb2wnLFxuICAnY29sZ3JvdXAnLFxuICAnY29udGVudCcsXG4gICdkYXRhJyxcbiAgJ2RhdGFsaXN0JyxcbiAgJ2RkJyxcbiAgJ2RlY29yYXRvcicsXG4gICdkZWwnLFxuICAnZGV0YWlscycsXG4gICdkZm4nLFxuICAnZGlhbG9nJyxcbiAgJ2RpcicsXG4gICdkaXYnLFxuICAnZGwnLFxuICAnZHQnLFxuICAnZWxlbWVudCcsXG4gICdlbScsXG4gICdmaWVsZHNldCcsXG4gICdmaWdjYXB0aW9uJyxcbiAgJ2ZpZ3VyZScsXG4gICdmb250JyxcbiAgJ2Zvb3RlcicsXG4gICdmb3JtJyxcbiAgJ2gxJyxcbiAgJ2gyJyxcbiAgJ2gzJyxcbiAgJ2g0JyxcbiAgJ2g1JyxcbiAgJ2g2JyxcbiAgJ2hlYWQnLFxuICAnaGVhZGVyJyxcbiAgJ2hncm91cCcsXG4gICdocicsXG4gICdodG1sJyxcbiAgJ2knLFxuICAnaW1nJyxcbiAgJ2lucHV0JyxcbiAgJ2lucycsXG4gICdrYmQnLFxuICAnbGFiZWwnLFxuICAnbGVnZW5kJyxcbiAgJ2xpJyxcbiAgJ21haW4nLFxuICAnbWFwJyxcbiAgJ21hcmsnLFxuICAnbWFycXVlZScsXG4gICdtZW51JyxcbiAgJ21lbnVpdGVtJyxcbiAgJ21ldGVyJyxcbiAgJ25hdicsXG4gICdub2JyJyxcbiAgJ29sJyxcbiAgJ29wdGdyb3VwJyxcbiAgJ29wdGlvbicsXG4gICdvdXRwdXQnLFxuICAncCcsXG4gICdwaWN0dXJlJyxcbiAgJ3ByZScsXG4gICdwcm9ncmVzcycsXG4gICdxJyxcbiAgJ3JwJyxcbiAgJ3J0JyxcbiAgJ3J1YnknLFxuICAncycsXG4gICdzYW1wJyxcbiAgJ3NlYXJjaCcsXG4gICdzZWN0aW9uJyxcbiAgJ3NlbGVjdCcsXG4gICdzaGFkb3cnLFxuICAnc2xvdCcsXG4gICdzbWFsbCcsXG4gICdzb3VyY2UnLFxuICAnc3BhY2VyJyxcbiAgJ3NwYW4nLFxuICAnc3RyaWtlJyxcbiAgJ3N0cm9uZycsXG4gICdzdHlsZScsXG4gICdzdWInLFxuICAnc3VtbWFyeScsXG4gICdzdXAnLFxuICAndGFibGUnLFxuICAndGJvZHknLFxuICAndGQnLFxuICAndGVtcGxhdGUnLFxuICAndGV4dGFyZWEnLFxuICAndGZvb3QnLFxuICAndGgnLFxuICAndGhlYWQnLFxuICAndGltZScsXG4gICd0cicsXG4gICd0cmFjaycsXG4gICd0dCcsXG4gICd1JyxcbiAgJ3VsJyxcbiAgJ3ZhcicsXG4gICd2aWRlbycsXG4gICd3YnInLFxuXSBhcyBjb25zdCk7XG5cbmV4cG9ydCBjb25zdCBzdmcgPSBmcmVlemUoW1xuICAnc3ZnJyxcbiAgJ2EnLFxuICAnYWx0Z2x5cGgnLFxuICAnYWx0Z2x5cGhkZWYnLFxuICAnYWx0Z2x5cGhpdGVtJyxcbiAgJ2FuaW1hdGVjb2xvcicsXG4gICdhbmltYXRlbW90aW9uJyxcbiAgJ2FuaW1hdGV0cmFuc2Zvcm0nLFxuICAnY2lyY2xlJyxcbiAgJ2NsaXBwYXRoJyxcbiAgJ2RlZnMnLFxuICAnZGVzYycsXG4gICdlbGxpcHNlJyxcbiAgJ2VudGVya2V5aGludCcsXG4gICdleHBvcnRwYXJ0cycsXG4gICdmaWx0ZXInLFxuICAnZm9udCcsXG4gICdnJyxcbiAgJ2dseXBoJyxcbiAgJ2dseXBocmVmJyxcbiAgJ2hrZXJuJyxcbiAgJ2ltYWdlJyxcbiAgJ2lucHV0bW9kZScsXG4gICdsaW5lJyxcbiAgJ2xpbmVhcmdyYWRpZW50JyxcbiAgJ21hcmtlcicsXG4gICdtYXNrJyxcbiAgJ21ldGFkYXRhJyxcbiAgJ21wYXRoJyxcbiAgJ3BhcnQnLFxuICAncGF0aCcsXG4gICdwYXR0ZXJuJyxcbiAgJ3BvbHlnb24nLFxuICAncG9seWxpbmUnLFxuICAncmFkaWFsZ3JhZGllbnQnLFxuICAncmVjdCcsXG4gICdzdG9wJyxcbiAgJ3N0eWxlJyxcbiAgJ3N3aXRjaCcsXG4gICdzeW1ib2wnLFxuICAndGV4dCcsXG4gICd0ZXh0cGF0aCcsXG4gICd0aXRsZScsXG4gICd0cmVmJyxcbiAgJ3RzcGFuJyxcbiAgJ3ZpZXcnLFxuICAndmtlcm4nLFxuXSBhcyBjb25zdCk7XG5cbmV4cG9ydCBjb25zdCBzdmdGaWx0ZXJzID0gZnJlZXplKFtcbiAgJ2ZlQmxlbmQnLFxuICAnZmVDb2xvck1hdHJpeCcsXG4gICdmZUNvbXBvbmVudFRyYW5zZmVyJyxcbiAgJ2ZlQ29tcG9zaXRlJyxcbiAgJ2ZlQ29udm9sdmVNYXRyaXgnLFxuICAnZmVEaWZmdXNlTGlnaHRpbmcnLFxuICAnZmVEaXNwbGFjZW1lbnRNYXAnLFxuICAnZmVEaXN0YW50TGlnaHQnLFxuICAnZmVEcm9wU2hhZG93JyxcbiAgJ2ZlRmxvb2QnLFxuICAnZmVGdW5jQScsXG4gICdmZUZ1bmNCJyxcbiAgJ2ZlRnVuY0cnLFxuICAnZmVGdW5jUicsXG4gICdmZUdhdXNzaWFuQmx1cicsXG4gICdmZUltYWdlJyxcbiAgJ2ZlTWVyZ2UnLFxuICAnZmVNZXJnZU5vZGUnLFxuICAnZmVNb3JwaG9sb2d5JyxcbiAgJ2ZlT2Zmc2V0JyxcbiAgJ2ZlUG9pbnRMaWdodCcsXG4gICdmZVNwZWN1bGFyTGlnaHRpbmcnLFxuICAnZmVTcG90TGlnaHQnLFxuICAnZmVUaWxlJyxcbiAgJ2ZlVHVyYnVsZW5jZScsXG5dIGFzIGNvbnN0KTtcblxuLy8gTGlzdCBvZiBTVkcgZWxlbWVudHMgdGhhdCBhcmUgZGlzYWxsb3dlZCBieSBkZWZhdWx0LlxuLy8gV2Ugc3RpbGwgbmVlZCB0byBrbm93IHRoZW0gc28gdGhhdCB3ZSBjYW4gZG8gbmFtZXNwYWNlXG4vLyBjaGVja3MgcHJvcGVybHkgaW4gY2FzZSBvbmUgd2FudHMgdG8gYWRkIHRoZW0gdG9cbi8vIGFsbG93LWxpc3QuXG5leHBvcnQgY29uc3Qgc3ZnRGlzYWxsb3dlZCA9IGZyZWV6ZShbXG4gICdhbmltYXRlJyxcbiAgJ2NvbG9yLXByb2ZpbGUnLFxuICAnY3Vyc29yJyxcbiAgJ2Rpc2NhcmQnLFxuICAnZm9udC1mYWNlJyxcbiAgJ2ZvbnQtZmFjZS1mb3JtYXQnLFxuICAnZm9udC1mYWNlLW5hbWUnLFxuICAnZm9udC1mYWNlLXNyYycsXG4gICdmb250LWZhY2UtdXJpJyxcbiAgJ2ZvcmVpZ25vYmplY3QnLFxuICAnaGF0Y2gnLFxuICAnaGF0Y2hwYXRoJyxcbiAgJ21lc2gnLFxuICAnbWVzaGdyYWRpZW50JyxcbiAgJ21lc2hwYXRjaCcsXG4gICdtZXNocm93JyxcbiAgJ21pc3NpbmctZ2x5cGgnLFxuICAnc2NyaXB0JyxcbiAgJ3NldCcsXG4gICdzb2xpZGNvbG9yJyxcbiAgJ3Vua25vd24nLFxuICAndXNlJyxcbl0gYXMgY29uc3QpO1xuXG5leHBvcnQgY29uc3QgbWF0aE1sID0gZnJlZXplKFtcbiAgJ21hdGgnLFxuICAnbWVuY2xvc2UnLFxuICAnbWVycm9yJyxcbiAgJ21mZW5jZWQnLFxuICAnbWZyYWMnLFxuICAnbWdseXBoJyxcbiAgJ21pJyxcbiAgJ21sYWJlbGVkdHInLFxuICAnbW11bHRpc2NyaXB0cycsXG4gICdtbicsXG4gICdtbycsXG4gICdtb3ZlcicsXG4gICdtcGFkZGVkJyxcbiAgJ21waGFudG9tJyxcbiAgJ21yb290JyxcbiAgJ21yb3cnLFxuICAnbXMnLFxuICAnbXNwYWNlJyxcbiAgJ21zcXJ0JyxcbiAgJ21zdHlsZScsXG4gICdtc3ViJyxcbiAgJ21zdXAnLFxuICAnbXN1YnN1cCcsXG4gICdtdGFibGUnLFxuICAnbXRkJyxcbiAgJ210ZXh0JyxcbiAgJ210cicsXG4gICdtdW5kZXInLFxuICAnbXVuZGVyb3ZlcicsXG4gICdtcHJlc2NyaXB0cycsXG5dIGFzIGNvbnN0KTtcblxuLy8gU2ltaWxhcmx5IHRvIFNWRywgd2Ugd2FudCB0byBrbm93IGFsbCBNYXRoTUwgZWxlbWVudHMsXG4vLyBldmVuIHRob3NlIHRoYXQgd2UgZGlzYWxsb3cgYnkgZGVmYXVsdC5cbmV4cG9ydCBjb25zdCBtYXRoTWxEaXNhbGxvd2VkID0gZnJlZXplKFtcbiAgJ21hY3Rpb24nLFxuICAnbWFsaWduZ3JvdXAnLFxuICAnbWFsaWdubWFyaycsXG4gICdtbG9uZ2RpdicsXG4gICdtc2NhcnJpZXMnLFxuICAnbXNjYXJyeScsXG4gICdtc2dyb3VwJyxcbiAgJ21zdGFjaycsXG4gICdtc2xpbmUnLFxuICAnbXNyb3cnLFxuICAnc2VtYW50aWNzJyxcbiAgJ2Fubm90YXRpb24nLFxuICAnYW5ub3RhdGlvbi14bWwnLFxuICAnbXByZXNjcmlwdHMnLFxuICAnbm9uZScsXG5dIGFzIGNvbnN0KTtcblxuZXhwb3J0IGNvbnN0IHRleHQgPSBmcmVlemUoWycjdGV4dCddIGFzIGNvbnN0KTtcbiIsICJpbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuL3V0aWxzLmpzJztcblxuZXhwb3J0IGNvbnN0IGh0bWwgPSBmcmVlemUoW1xuICAnYWNjZXB0JyxcbiAgJ2FjdGlvbicsXG4gICdhbGlnbicsXG4gICdhbHQnLFxuICAnYXV0b2NhcGl0YWxpemUnLFxuICAnYXV0b2NvbXBsZXRlJyxcbiAgJ2F1dG9waWN0dXJlaW5waWN0dXJlJyxcbiAgJ2F1dG9wbGF5JyxcbiAgJ2JhY2tncm91bmQnLFxuICAnYmdjb2xvcicsXG4gICdib3JkZXInLFxuICAnY2FwdHVyZScsXG4gICdjZWxscGFkZGluZycsXG4gICdjZWxsc3BhY2luZycsXG4gICdjaGVja2VkJyxcbiAgJ2NpdGUnLFxuICAnY2xhc3MnLFxuICAnY2xlYXInLFxuICAnY29sb3InLFxuICAnY29scycsXG4gICdjb2xzcGFuJyxcbiAgJ2NvbnRyb2xzJyxcbiAgJ2NvbnRyb2xzbGlzdCcsXG4gICdjb29yZHMnLFxuICAnY3Jvc3NvcmlnaW4nLFxuICAnZGF0ZXRpbWUnLFxuICAnZGVjb2RpbmcnLFxuICAnZGVmYXVsdCcsXG4gICdkaXInLFxuICAnZGlzYWJsZWQnLFxuICAnZGlzYWJsZXBpY3R1cmVpbnBpY3R1cmUnLFxuICAnZGlzYWJsZXJlbW90ZXBsYXliYWNrJyxcbiAgJ2Rvd25sb2FkJyxcbiAgJ2RyYWdnYWJsZScsXG4gICdlbmN0eXBlJyxcbiAgJ2VudGVya2V5aGludCcsXG4gICdleHBvcnRwYXJ0cycsXG4gICdmYWNlJyxcbiAgJ2ZvcicsXG4gICdoZWFkZXJzJyxcbiAgJ2hlaWdodCcsXG4gICdoaWRkZW4nLFxuICAnaGlnaCcsXG4gICdocmVmJyxcbiAgJ2hyZWZsYW5nJyxcbiAgJ2lkJyxcbiAgJ2luZXJ0JyxcbiAgJ2lucHV0bW9kZScsXG4gICdpbnRlZ3JpdHknLFxuICAnaXNtYXAnLFxuICAna2luZCcsXG4gICdsYWJlbCcsXG4gICdsYW5nJyxcbiAgJ2xpc3QnLFxuICAnbG9hZGluZycsXG4gICdsb29wJyxcbiAgJ2xvdycsXG4gICdtYXgnLFxuICAnbWF4bGVuZ3RoJyxcbiAgJ21lZGlhJyxcbiAgJ21ldGhvZCcsXG4gICdtaW4nLFxuICAnbWlubGVuZ3RoJyxcbiAgJ211bHRpcGxlJyxcbiAgJ211dGVkJyxcbiAgJ25hbWUnLFxuICAnbm9uY2UnLFxuICAnbm9zaGFkZScsXG4gICdub3ZhbGlkYXRlJyxcbiAgJ25vd3JhcCcsXG4gICdvcGVuJyxcbiAgJ29wdGltdW0nLFxuICAncGFydCcsXG4gICdwYXR0ZXJuJyxcbiAgJ3BsYWNlaG9sZGVyJyxcbiAgJ3BsYXlzaW5saW5lJyxcbiAgJ3BvcG92ZXInLFxuICAncG9wb3ZlcnRhcmdldCcsXG4gICdwb3BvdmVydGFyZ2V0YWN0aW9uJyxcbiAgJ3Bvc3RlcicsXG4gICdwcmVsb2FkJyxcbiAgJ3B1YmRhdGUnLFxuICAncmFkaW9ncm91cCcsXG4gICdyZWFkb25seScsXG4gICdyZWwnLFxuICAncmVxdWlyZWQnLFxuICAncmV2JyxcbiAgJ3JldmVyc2VkJyxcbiAgJ3JvbGUnLFxuICAncm93cycsXG4gICdyb3dzcGFuJyxcbiAgJ3NwZWxsY2hlY2snLFxuICAnc2NvcGUnLFxuICAnc2VsZWN0ZWQnLFxuICAnc2hhcGUnLFxuICAnc2l6ZScsXG4gICdzaXplcycsXG4gICdzbG90JyxcbiAgJ3NwYW4nLFxuICAnc3JjbGFuZycsXG4gICdzdGFydCcsXG4gICdzcmMnLFxuICAnc3Jjc2V0JyxcbiAgJ3N0ZXAnLFxuICAnc3R5bGUnLFxuICAnc3VtbWFyeScsXG4gICd0YWJpbmRleCcsXG4gICd0aXRsZScsXG4gICd0cmFuc2xhdGUnLFxuICAndHlwZScsXG4gICd1c2VtYXAnLFxuICAndmFsaWduJyxcbiAgJ3ZhbHVlJyxcbiAgJ3dpZHRoJyxcbiAgJ3dyYXAnLFxuICAneG1sbnMnLFxuICAnc2xvdCcsXG5dIGFzIGNvbnN0KTtcblxuZXhwb3J0IGNvbnN0IHN2ZyA9IGZyZWV6ZShbXG4gICdhY2NlbnQtaGVpZ2h0JyxcbiAgJ2FjY3VtdWxhdGUnLFxuICAnYWRkaXRpdmUnLFxuICAnYWxpZ25tZW50LWJhc2VsaW5lJyxcbiAgJ2FtcGxpdHVkZScsXG4gICdhc2NlbnQnLFxuICAnYXR0cmlidXRlbmFtZScsXG4gICdhdHRyaWJ1dGV0eXBlJyxcbiAgJ2F6aW11dGgnLFxuICAnYmFzZWZyZXF1ZW5jeScsXG4gICdiYXNlbGluZS1zaGlmdCcsXG4gICdiZWdpbicsXG4gICdiaWFzJyxcbiAgJ2J5JyxcbiAgJ2NsYXNzJyxcbiAgJ2NsaXAnLFxuICAnY2xpcHBhdGh1bml0cycsXG4gICdjbGlwLXBhdGgnLFxuICAnY2xpcC1ydWxlJyxcbiAgJ2NvbG9yJyxcbiAgJ2NvbG9yLWludGVycG9sYXRpb24nLFxuICAnY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzJyxcbiAgJ2NvbG9yLXByb2ZpbGUnLFxuICAnY29sb3ItcmVuZGVyaW5nJyxcbiAgJ2N4JyxcbiAgJ2N5JyxcbiAgJ2QnLFxuICAnZHgnLFxuICAnZHknLFxuICAnZGlmZnVzZWNvbnN0YW50JyxcbiAgJ2RpcmVjdGlvbicsXG4gICdkaXNwbGF5JyxcbiAgJ2Rpdmlzb3InLFxuICAnZHVyJyxcbiAgJ2VkZ2Vtb2RlJyxcbiAgJ2VsZXZhdGlvbicsXG4gICdlbmQnLFxuICAnZXhwb25lbnQnLFxuICAnZmlsbCcsXG4gICdmaWxsLW9wYWNpdHknLFxuICAnZmlsbC1ydWxlJyxcbiAgJ2ZpbHRlcicsXG4gICdmaWx0ZXJ1bml0cycsXG4gICdmbG9vZC1jb2xvcicsXG4gICdmbG9vZC1vcGFjaXR5JyxcbiAgJ2ZvbnQtZmFtaWx5JyxcbiAgJ2ZvbnQtc2l6ZScsXG4gICdmb250LXNpemUtYWRqdXN0JyxcbiAgJ2ZvbnQtc3RyZXRjaCcsXG4gICdmb250LXN0eWxlJyxcbiAgJ2ZvbnQtdmFyaWFudCcsXG4gICdmb250LXdlaWdodCcsXG4gICdmeCcsXG4gICdmeScsXG4gICdnMScsXG4gICdnMicsXG4gICdnbHlwaC1uYW1lJyxcbiAgJ2dseXBocmVmJyxcbiAgJ2dyYWRpZW50dW5pdHMnLFxuICAnZ3JhZGllbnR0cmFuc2Zvcm0nLFxuICAnaGVpZ2h0JyxcbiAgJ2hyZWYnLFxuICAnaWQnLFxuICAnaW1hZ2UtcmVuZGVyaW5nJyxcbiAgJ2luJyxcbiAgJ2luMicsXG4gICdpbnRlcmNlcHQnLFxuICAnaycsXG4gICdrMScsXG4gICdrMicsXG4gICdrMycsXG4gICdrNCcsXG4gICdrZXJuaW5nJyxcbiAgJ2tleXBvaW50cycsXG4gICdrZXlzcGxpbmVzJyxcbiAgJ2tleXRpbWVzJyxcbiAgJ2xhbmcnLFxuICAnbGVuZ3RoYWRqdXN0JyxcbiAgJ2xldHRlci1zcGFjaW5nJyxcbiAgJ2tlcm5lbG1hdHJpeCcsXG4gICdrZXJuZWx1bml0bGVuZ3RoJyxcbiAgJ2xpZ2h0aW5nLWNvbG9yJyxcbiAgJ2xvY2FsJyxcbiAgJ21hcmtlci1lbmQnLFxuICAnbWFya2VyLW1pZCcsXG4gICdtYXJrZXItc3RhcnQnLFxuICAnbWFya2VyaGVpZ2h0JyxcbiAgJ21hcmtlcnVuaXRzJyxcbiAgJ21hcmtlcndpZHRoJyxcbiAgJ21hc2tjb250ZW50dW5pdHMnLFxuICAnbWFza3VuaXRzJyxcbiAgJ21heCcsXG4gICdtYXNrJyxcbiAgJ21hc2stdHlwZScsXG4gICdtZWRpYScsXG4gICdtZXRob2QnLFxuICAnbW9kZScsXG4gICdtaW4nLFxuICAnbmFtZScsXG4gICdudW1vY3RhdmVzJyxcbiAgJ29mZnNldCcsXG4gICdvcGVyYXRvcicsXG4gICdvcGFjaXR5JyxcbiAgJ29yZGVyJyxcbiAgJ29yaWVudCcsXG4gICdvcmllbnRhdGlvbicsXG4gICdvcmlnaW4nLFxuICAnb3ZlcmZsb3cnLFxuICAncGFpbnQtb3JkZXInLFxuICAncGF0aCcsXG4gICdwYXRobGVuZ3RoJyxcbiAgJ3BhdHRlcm5jb250ZW50dW5pdHMnLFxuICAncGF0dGVybnRyYW5zZm9ybScsXG4gICdwYXR0ZXJudW5pdHMnLFxuICAncG9pbnRzJyxcbiAgJ3ByZXNlcnZlYWxwaGEnLFxuICAncHJlc2VydmVhc3BlY3RyYXRpbycsXG4gICdwcmltaXRpdmV1bml0cycsXG4gICdyJyxcbiAgJ3J4JyxcbiAgJ3J5JyxcbiAgJ3JhZGl1cycsXG4gICdyZWZ4JyxcbiAgJ3JlZnknLFxuICAncmVwZWF0Y291bnQnLFxuICAncmVwZWF0ZHVyJyxcbiAgJ3Jlc3RhcnQnLFxuICAncmVzdWx0JyxcbiAgJ3JvdGF0ZScsXG4gICdzY2FsZScsXG4gICdzZWVkJyxcbiAgJ3NoYXBlLXJlbmRlcmluZycsXG4gICdzbG9wZScsXG4gICdzcGVjdWxhcmNvbnN0YW50JyxcbiAgJ3NwZWN1bGFyZXhwb25lbnQnLFxuICAnc3ByZWFkbWV0aG9kJyxcbiAgJ3N0YXJ0b2Zmc2V0JyxcbiAgJ3N0ZGRldmlhdGlvbicsXG4gICdzdGl0Y2h0aWxlcycsXG4gICdzdG9wLWNvbG9yJyxcbiAgJ3N0b3Atb3BhY2l0eScsXG4gICdzdHJva2UtZGFzaGFycmF5JyxcbiAgJ3N0cm9rZS1kYXNob2Zmc2V0JyxcbiAgJ3N0cm9rZS1saW5lY2FwJyxcbiAgJ3N0cm9rZS1saW5lam9pbicsXG4gICdzdHJva2UtbWl0ZXJsaW1pdCcsXG4gICdzdHJva2Utb3BhY2l0eScsXG4gICdzdHJva2UnLFxuICAnc3Ryb2tlLXdpZHRoJyxcbiAgJ3N0eWxlJyxcbiAgJ3N1cmZhY2VzY2FsZScsXG4gICdzeXN0ZW1sYW5ndWFnZScsXG4gICd0YWJpbmRleCcsXG4gICd0YWJsZXZhbHVlcycsXG4gICd0YXJnZXR4JyxcbiAgJ3RhcmdldHknLFxuICAndHJhbnNmb3JtJyxcbiAgJ3RyYW5zZm9ybS1vcmlnaW4nLFxuICAndGV4dC1hbmNob3InLFxuICAndGV4dC1kZWNvcmF0aW9uJyxcbiAgJ3RleHQtcmVuZGVyaW5nJyxcbiAgJ3RleHRsZW5ndGgnLFxuICAndHlwZScsXG4gICd1MScsXG4gICd1MicsXG4gICd1bmljb2RlJyxcbiAgJ3ZhbHVlcycsXG4gICd2aWV3Ym94JyxcbiAgJ3Zpc2liaWxpdHknLFxuICAndmVyc2lvbicsXG4gICd2ZXJ0LWFkdi15JyxcbiAgJ3ZlcnQtb3JpZ2luLXgnLFxuICAndmVydC1vcmlnaW4teScsXG4gICd3aWR0aCcsXG4gICd3b3JkLXNwYWNpbmcnLFxuICAnd3JhcCcsXG4gICd3cml0aW5nLW1vZGUnLFxuICAneGNoYW5uZWxzZWxlY3RvcicsXG4gICd5Y2hhbm5lbHNlbGVjdG9yJyxcbiAgJ3gnLFxuICAneDEnLFxuICAneDInLFxuICAneG1sbnMnLFxuICAneScsXG4gICd5MScsXG4gICd5MicsXG4gICd6JyxcbiAgJ3pvb21hbmRwYW4nLFxuXSBhcyBjb25zdCk7XG5cbmV4cG9ydCBjb25zdCBtYXRoTWwgPSBmcmVlemUoW1xuICAnYWNjZW50JyxcbiAgJ2FjY2VudHVuZGVyJyxcbiAgJ2FsaWduJyxcbiAgJ2JldmVsbGVkJyxcbiAgJ2Nsb3NlJyxcbiAgJ2NvbHVtbnNhbGlnbicsXG4gICdjb2x1bW5saW5lcycsXG4gICdjb2x1bW5zcGFuJyxcbiAgJ2Rlbm9tYWxpZ24nLFxuICAnZGVwdGgnLFxuICAnZGlyJyxcbiAgJ2Rpc3BsYXknLFxuICAnZGlzcGxheXN0eWxlJyxcbiAgJ2VuY29kaW5nJyxcbiAgJ2ZlbmNlJyxcbiAgJ2ZyYW1lJyxcbiAgJ2hlaWdodCcsXG4gICdocmVmJyxcbiAgJ2lkJyxcbiAgJ2xhcmdlb3AnLFxuICAnbGVuZ3RoJyxcbiAgJ2xpbmV0aGlja25lc3MnLFxuICAnbHNwYWNlJyxcbiAgJ2xxdW90ZScsXG4gICdtYXRoYmFja2dyb3VuZCcsXG4gICdtYXRoY29sb3InLFxuICAnbWF0aHNpemUnLFxuICAnbWF0aHZhcmlhbnQnLFxuICAnbWF4c2l6ZScsXG4gICdtaW5zaXplJyxcbiAgJ21vdmFibGVsaW1pdHMnLFxuICAnbm90YXRpb24nLFxuICAnbnVtYWxpZ24nLFxuICAnb3BlbicsXG4gICdyb3dhbGlnbicsXG4gICdyb3dsaW5lcycsXG4gICdyb3dzcGFjaW5nJyxcbiAgJ3Jvd3NwYW4nLFxuICAncnNwYWNlJyxcbiAgJ3JxdW90ZScsXG4gICdzY3JpcHRsZXZlbCcsXG4gICdzY3JpcHRtaW5zaXplJyxcbiAgJ3NjcmlwdHNpemVtdWx0aXBsaWVyJyxcbiAgJ3NlbGVjdGlvbicsXG4gICdzZXBhcmF0b3InLFxuICAnc2VwYXJhdG9ycycsXG4gICdzdHJldGNoeScsXG4gICdzdWJzY3JpcHRzaGlmdCcsXG4gICdzdXBzY3JpcHRzaGlmdCcsXG4gICdzeW1tZXRyaWMnLFxuICAndm9mZnNldCcsXG4gICd3aWR0aCcsXG4gICd4bWxucycsXG5dKTtcblxuZXhwb3J0IGNvbnN0IHhtbCA9IGZyZWV6ZShbXG4gICd4bGluazpocmVmJyxcbiAgJ3htbDppZCcsXG4gICd4bGluazp0aXRsZScsXG4gICd4bWw6c3BhY2UnLFxuICAneG1sbnM6eGxpbmsnLFxuXSBhcyBjb25zdCk7XG4iLCAiaW1wb3J0IHsgc2VhbCB9IGZyb20gJy4vdXRpbHMuanMnO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9iZXR0ZXItcmVnZXhcbmV4cG9ydCBjb25zdCBNVVNUQUNIRV9FWFBSID0gc2VhbCgvXFx7XFx7W1xcd1xcV10qfFtcXHdcXFddKlxcfVxcfS9nbSk7IC8vIFNwZWNpZnkgdGVtcGxhdGUgZGV0ZWN0aW9uIHJlZ2V4IGZvciBTQUZFX0ZPUl9URU1QTEFURVMgbW9kZVxuZXhwb3J0IGNvbnN0IEVSQl9FWFBSID0gc2VhbCgvPCVbXFx3XFxXXSp8W1xcd1xcV10qJT4vZ20pO1xuZXhwb3J0IGNvbnN0IFRNUExJVF9FWFBSID0gc2VhbCgvXFwkXFx7W1xcd1xcV10qL2dtKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSB1bmljb3JuL2JldHRlci1yZWdleFxuZXhwb3J0IGNvbnN0IERBVEFfQVRUUiA9IHNlYWwoL15kYXRhLVtcXC1cXHcuXFx1MDBCNy1cXHVGRkZGXSskLyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdXNlbGVzcy1lc2NhcGVcbmV4cG9ydCBjb25zdCBBUklBX0FUVFIgPSBzZWFsKC9eYXJpYS1bXFwtXFx3XSskLyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdXNlbGVzcy1lc2NhcGVcbmV4cG9ydCBjb25zdCBJU19BTExPV0VEX1VSSSA9IHNlYWwoXG4gIC9eKD86KD86KD86ZnxodCl0cHM/fG1haWx0b3x0ZWx8Y2FsbHRvfHNtc3xjaWR8eG1wcHxtYXRyaXgpOnxbXmEtel18W2EteisuXFwtXSsoPzpbXmEteisuXFwtOl18JCkpL2kgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2VsZXNzLWVzY2FwZVxuKTtcbmV4cG9ydCBjb25zdCBJU19TQ1JJUFRfT1JfREFUQSA9IHNlYWwoL14oPzpcXHcrc2NyaXB0fGRhdGEpOi9pKTtcbmV4cG9ydCBjb25zdCBBVFRSX1dISVRFU1BBQ0UgPSBzZWFsKFxuICAvW1xcdTAwMDAtXFx1MDAyMFxcdTAwQTBcXHUxNjgwXFx1MTgwRVxcdTIwMDAtXFx1MjAyOVxcdTIwNUZcXHUzMDAwXS9nIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29udHJvbC1yZWdleFxuKTtcbmV4cG9ydCBjb25zdCBET0NUWVBFX05BTUUgPSBzZWFsKC9eaHRtbCQvaSk7XG5leHBvcnQgY29uc3QgQ1VTVE9NX0VMRU1FTlQgPSBzZWFsKC9eW2Etel1bLlxcd10qKC1bLlxcd10rKSskL2kpO1xuIiwgIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9pbmRlbnQgKi9cblxuaW1wb3J0IHR5cGUge1xuICBUcnVzdGVkSFRNTCxcbiAgVHJ1c3RlZFR5cGVzV2luZG93LFxufSBmcm9tICd0cnVzdGVkLXR5cGVzL2xpYi9pbmRleC5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbmZpZywgVXNlUHJvZmlsZXNDb25maWcgfSBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQgKiBhcyBUQUdTIGZyb20gJy4vdGFncy5qcyc7XG5pbXBvcnQgKiBhcyBBVFRSUyBmcm9tICcuL2F0dHJzLmpzJztcbmltcG9ydCAqIGFzIEVYUFJFU1NJT05TIGZyb20gJy4vcmVnZXhwLmpzJztcbmltcG9ydCB7XG4gIGFkZFRvU2V0LFxuICBjbG9uZSxcbiAgZW50cmllcyxcbiAgZnJlZXplLFxuICBhcnJheUZvckVhY2gsXG4gIGFycmF5TGFzdEluZGV4T2YsXG4gIGFycmF5UG9wLFxuICBhcnJheVB1c2gsXG4gIGFycmF5U3BsaWNlLFxuICBzdHJpbmdNYXRjaCxcbiAgc3RyaW5nUmVwbGFjZSxcbiAgc3RyaW5nVG9Mb3dlckNhc2UsXG4gIHN0cmluZ1RvU3RyaW5nLFxuICBzdHJpbmdJbmRleE9mLFxuICBzdHJpbmdUcmltLFxuICByZWdFeHBUZXN0LFxuICB0eXBlRXJyb3JDcmVhdGUsXG4gIGxvb2t1cEdldHRlcixcbiAgY3JlYXRlLFxuICBvYmplY3RIYXNPd25Qcm9wZXJ0eSxcbn0gZnJvbSAnLi91dGlscy5qcyc7XG5cbmV4cG9ydCB0eXBlIHsgQ29uZmlnIH0gZnJvbSAnLi9jb25maWcnO1xuXG5kZWNsYXJlIGNvbnN0IFZFUlNJT046IHN0cmluZztcblxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL05vZGUvbm9kZVR5cGVcbmNvbnN0IE5PREVfVFlQRSA9IHtcbiAgZWxlbWVudDogMSxcbiAgYXR0cmlidXRlOiAyLFxuICB0ZXh0OiAzLFxuICBjZGF0YVNlY3Rpb246IDQsXG4gIGVudGl0eVJlZmVyZW5jZTogNSwgLy8gRGVwcmVjYXRlZFxuICBlbnRpdHlOb2RlOiA2LCAvLyBEZXByZWNhdGVkXG4gIHByb2dyZXNzaW5nSW5zdHJ1Y3Rpb246IDcsXG4gIGNvbW1lbnQ6IDgsXG4gIGRvY3VtZW50OiA5LFxuICBkb2N1bWVudFR5cGU6IDEwLFxuICBkb2N1bWVudEZyYWdtZW50OiAxMSxcbiAgbm90YXRpb246IDEyLCAvLyBEZXByZWNhdGVkXG59O1xuXG5jb25zdCBnZXRHbG9iYWwgPSBmdW5jdGlvbiAoKTogV2luZG93TGlrZSB7XG4gIHJldHVybiB0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyA/IG51bGwgOiB3aW5kb3c7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuby1vcCBwb2xpY3kgZm9yIGludGVybmFsIHVzZSBvbmx5LlxuICogRG9uJ3QgZXhwb3J0IHRoaXMgZnVuY3Rpb24gb3V0c2lkZSB0aGlzIG1vZHVsZSFcbiAqIEBwYXJhbSB0cnVzdGVkVHlwZXMgVGhlIHBvbGljeSBmYWN0b3J5LlxuICogQHBhcmFtIHB1cmlmeUhvc3RFbGVtZW50IFRoZSBTY3JpcHQgZWxlbWVudCB1c2VkIHRvIGxvYWQgRE9NUHVyaWZ5ICh0byBkZXRlcm1pbmUgcG9saWN5IG5hbWUgc3VmZml4KS5cbiAqIEByZXR1cm4gVGhlIHBvbGljeSBjcmVhdGVkIChvciBudWxsLCBpZiBUcnVzdGVkIFR5cGVzXG4gKiBhcmUgbm90IHN1cHBvcnRlZCBvciBjcmVhdGluZyB0aGUgcG9saWN5IGZhaWxlZCkuXG4gKi9cbmNvbnN0IF9jcmVhdGVUcnVzdGVkVHlwZXNQb2xpY3kgPSBmdW5jdGlvbiAoXG4gIHRydXN0ZWRUeXBlczogVHJ1c3RlZFR5cGVQb2xpY3lGYWN0b3J5LFxuICBwdXJpZnlIb3N0RWxlbWVudDogSFRNTFNjcmlwdEVsZW1lbnRcbikge1xuICBpZiAoXG4gICAgdHlwZW9mIHRydXN0ZWRUeXBlcyAhPT0gJ29iamVjdCcgfHxcbiAgICB0eXBlb2YgdHJ1c3RlZFR5cGVzLmNyZWF0ZVBvbGljeSAhPT0gJ2Z1bmN0aW9uJ1xuICApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIEFsbG93IHRoZSBjYWxsZXJzIHRvIGNvbnRyb2wgdGhlIHVuaXF1ZSBwb2xpY3kgbmFtZVxuICAvLyBieSBhZGRpbmcgYSBkYXRhLXR0LXBvbGljeS1zdWZmaXggdG8gdGhlIHNjcmlwdCBlbGVtZW50IHdpdGggdGhlIERPTVB1cmlmeS5cbiAgLy8gUG9saWN5IGNyZWF0aW9uIHdpdGggZHVwbGljYXRlIG5hbWVzIHRocm93cyBpbiBUcnVzdGVkIFR5cGVzLlxuICBsZXQgc3VmZml4ID0gbnVsbDtcbiAgY29uc3QgQVRUUl9OQU1FID0gJ2RhdGEtdHQtcG9saWN5LXN1ZmZpeCc7XG4gIGlmIChwdXJpZnlIb3N0RWxlbWVudCAmJiBwdXJpZnlIb3N0RWxlbWVudC5oYXNBdHRyaWJ1dGUoQVRUUl9OQU1FKSkge1xuICAgIHN1ZmZpeCA9IHB1cmlmeUhvc3RFbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSX05BTUUpO1xuICB9XG5cbiAgY29uc3QgcG9saWN5TmFtZSA9ICdkb21wdXJpZnknICsgKHN1ZmZpeCA/ICcjJyArIHN1ZmZpeCA6ICcnKTtcblxuICB0cnkge1xuICAgIHJldHVybiB0cnVzdGVkVHlwZXMuY3JlYXRlUG9saWN5KHBvbGljeU5hbWUsIHtcbiAgICAgIGNyZWF0ZUhUTUwoaHRtbCkge1xuICAgICAgICByZXR1cm4gaHRtbDtcbiAgICAgIH0sXG4gICAgICBjcmVhdGVTY3JpcHRVUkwoc2NyaXB0VXJsKSB7XG4gICAgICAgIHJldHVybiBzY3JpcHRVcmw7XG4gICAgICB9LFxuICAgIH0pO1xuICB9IGNhdGNoIChfKSB7XG4gICAgLy8gUG9saWN5IGNyZWF0aW9uIGZhaWxlZCAobW9zdCBsaWtlbHkgYW5vdGhlciBET01QdXJpZnkgc2NyaXB0IGhhc1xuICAgIC8vIGFscmVhZHkgcnVuKS4gU2tpcCBjcmVhdGluZyB0aGUgcG9saWN5LCBhcyB0aGlzIHdpbGwgb25seSBjYXVzZSBlcnJvcnNcbiAgICAvLyBpZiBUVCBhcmUgZW5mb3JjZWQuXG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ1RydXN0ZWRUeXBlcyBwb2xpY3kgJyArIHBvbGljeU5hbWUgKyAnIGNvdWxkIG5vdCBiZSBjcmVhdGVkLidcbiAgICApO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59O1xuXG5jb25zdCBfY3JlYXRlSG9va3NNYXAgPSBmdW5jdGlvbiAoKTogSG9va3NNYXAge1xuICByZXR1cm4ge1xuICAgIGFmdGVyU2FuaXRpemVBdHRyaWJ1dGVzOiBbXSxcbiAgICBhZnRlclNhbml0aXplRWxlbWVudHM6IFtdLFxuICAgIGFmdGVyU2FuaXRpemVTaGFkb3dET006IFtdLFxuICAgIGJlZm9yZVNhbml0aXplQXR0cmlidXRlczogW10sXG4gICAgYmVmb3JlU2FuaXRpemVFbGVtZW50czogW10sXG4gICAgYmVmb3JlU2FuaXRpemVTaGFkb3dET006IFtdLFxuICAgIHVwb25TYW5pdGl6ZUF0dHJpYnV0ZTogW10sXG4gICAgdXBvblNhbml0aXplRWxlbWVudDogW10sXG4gICAgdXBvblNhbml0aXplU2hhZG93Tm9kZTogW10sXG4gIH07XG59O1xuXG5mdW5jdGlvbiBjcmVhdGVET01QdXJpZnkod2luZG93OiBXaW5kb3dMaWtlID0gZ2V0R2xvYmFsKCkpOiBET01QdXJpZnkge1xuICBjb25zdCBET01QdXJpZnk6IERPTVB1cmlmeSA9IChyb290OiBXaW5kb3dMaWtlKSA9PiBjcmVhdGVET01QdXJpZnkocm9vdCk7XG5cbiAgRE9NUHVyaWZ5LnZlcnNpb24gPSBWRVJTSU9OO1xuXG4gIERPTVB1cmlmeS5yZW1vdmVkID0gW107XG5cbiAgaWYgKFxuICAgICF3aW5kb3cgfHxcbiAgICAhd2luZG93LmRvY3VtZW50IHx8XG4gICAgd2luZG93LmRvY3VtZW50Lm5vZGVUeXBlICE9PSBOT0RFX1RZUEUuZG9jdW1lbnQgfHxcbiAgICAhd2luZG93LkVsZW1lbnRcbiAgKSB7XG4gICAgLy8gTm90IHJ1bm5pbmcgaW4gYSBicm93c2VyLCBwcm92aWRlIGEgZmFjdG9yeSBmdW5jdGlvblxuICAgIC8vIHNvIHRoYXQgeW91IGNhbiBwYXNzIHlvdXIgb3duIFdpbmRvd1xuICAgIERPTVB1cmlmeS5pc1N1cHBvcnRlZCA9IGZhbHNlO1xuXG4gICAgcmV0dXJuIERPTVB1cmlmeTtcbiAgfVxuXG4gIGxldCB7IGRvY3VtZW50IH0gPSB3aW5kb3c7XG5cbiAgY29uc3Qgb3JpZ2luYWxEb2N1bWVudCA9IGRvY3VtZW50O1xuICBjb25zdCBjdXJyZW50U2NyaXB0OiBIVE1MU2NyaXB0RWxlbWVudCA9XG4gICAgb3JpZ2luYWxEb2N1bWVudC5jdXJyZW50U2NyaXB0IGFzIEhUTUxTY3JpcHRFbGVtZW50O1xuICBjb25zdCB7XG4gICAgRG9jdW1lbnRGcmFnbWVudCxcbiAgICBIVE1MVGVtcGxhdGVFbGVtZW50LFxuICAgIE5vZGUsXG4gICAgRWxlbWVudCxcbiAgICBOb2RlRmlsdGVyLFxuICAgIE5hbWVkTm9kZU1hcCA9IHdpbmRvdy5OYW1lZE5vZGVNYXAgfHwgKHdpbmRvdyBhcyBhbnkpLk1vek5hbWVkQXR0ck1hcCxcbiAgICBIVE1MRm9ybUVsZW1lbnQsXG4gICAgRE9NUGFyc2VyLFxuICAgIHRydXN0ZWRUeXBlcyxcbiAgfSA9IHdpbmRvdztcblxuICBjb25zdCBFbGVtZW50UHJvdG90eXBlID0gRWxlbWVudC5wcm90b3R5cGU7XG5cbiAgY29uc3QgY2xvbmVOb2RlID0gbG9va3VwR2V0dGVyKEVsZW1lbnRQcm90b3R5cGUsICdjbG9uZU5vZGUnKTtcbiAgY29uc3QgcmVtb3ZlID0gbG9va3VwR2V0dGVyKEVsZW1lbnRQcm90b3R5cGUsICdyZW1vdmUnKTtcbiAgY29uc3QgZ2V0TmV4dFNpYmxpbmcgPSBsb29rdXBHZXR0ZXIoRWxlbWVudFByb3RvdHlwZSwgJ25leHRTaWJsaW5nJyk7XG4gIGNvbnN0IGdldENoaWxkTm9kZXMgPSBsb29rdXBHZXR0ZXIoRWxlbWVudFByb3RvdHlwZSwgJ2NoaWxkTm9kZXMnKTtcbiAgY29uc3QgZ2V0UGFyZW50Tm9kZSA9IGxvb2t1cEdldHRlcihFbGVtZW50UHJvdG90eXBlLCAncGFyZW50Tm9kZScpO1xuXG4gIC8vIEFzIHBlciBpc3N1ZSAjNDcsIHRoZSB3ZWItY29tcG9uZW50cyByZWdpc3RyeSBpcyBpbmhlcml0ZWQgYnkgYVxuICAvLyBuZXcgZG9jdW1lbnQgY3JlYXRlZCB2aWEgY3JlYXRlSFRNTERvY3VtZW50LiBBcyBwZXIgdGhlIHNwZWNcbiAgLy8gKGh0dHA6Ly93M2MuZ2l0aHViLmlvL3dlYmNvbXBvbmVudHMvc3BlYy9jdXN0b20vI2NyZWF0aW5nLWFuZC1wYXNzaW5nLXJlZ2lzdHJpZXMpXG4gIC8vIGEgbmV3IGVtcHR5IHJlZ2lzdHJ5IGlzIHVzZWQgd2hlbiBjcmVhdGluZyBhIHRlbXBsYXRlIGNvbnRlbnRzIG93bmVyXG4gIC8vIGRvY3VtZW50LCBzbyB3ZSB1c2UgdGhhdCBhcyBvdXIgcGFyZW50IGRvY3VtZW50IHRvIGVuc3VyZSBub3RoaW5nXG4gIC8vIGlzIGluaGVyaXRlZC5cbiAgaWYgKHR5cGVvZiBIVE1MVGVtcGxhdGVFbGVtZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY29uc3QgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpO1xuICAgIGlmICh0ZW1wbGF0ZS5jb250ZW50ICYmIHRlbXBsYXRlLmNvbnRlbnQub3duZXJEb2N1bWVudCkge1xuICAgICAgZG9jdW1lbnQgPSB0ZW1wbGF0ZS5jb250ZW50Lm93bmVyRG9jdW1lbnQ7XG4gICAgfVxuICB9XG5cbiAgbGV0IHRydXN0ZWRUeXBlc1BvbGljeTtcbiAgbGV0IGVtcHR5SFRNTCA9ICcnO1xuXG4gIGNvbnN0IHtcbiAgICBpbXBsZW1lbnRhdGlvbixcbiAgICBjcmVhdGVOb2RlSXRlcmF0b3IsXG4gICAgY3JlYXRlRG9jdW1lbnRGcmFnbWVudCxcbiAgICBnZXRFbGVtZW50c0J5VGFnTmFtZSxcbiAgfSA9IGRvY3VtZW50O1xuICBjb25zdCB7IGltcG9ydE5vZGUgfSA9IG9yaWdpbmFsRG9jdW1lbnQ7XG5cbiAgbGV0IGhvb2tzID0gX2NyZWF0ZUhvb2tzTWFwKCk7XG5cbiAgLyoqXG4gICAqIEV4cG9zZSB3aGV0aGVyIHRoaXMgYnJvd3NlciBzdXBwb3J0cyBydW5uaW5nIHRoZSBmdWxsIERPTVB1cmlmeS5cbiAgICovXG4gIERPTVB1cmlmeS5pc1N1cHBvcnRlZCA9XG4gICAgdHlwZW9mIGVudHJpZXMgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2YgZ2V0UGFyZW50Tm9kZSA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIGltcGxlbWVudGF0aW9uICYmXG4gICAgaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50ICE9PSB1bmRlZmluZWQ7XG5cbiAgY29uc3Qge1xuICAgIE1VU1RBQ0hFX0VYUFIsXG4gICAgRVJCX0VYUFIsXG4gICAgVE1QTElUX0VYUFIsXG4gICAgREFUQV9BVFRSLFxuICAgIEFSSUFfQVRUUixcbiAgICBJU19TQ1JJUFRfT1JfREFUQSxcbiAgICBBVFRSX1dISVRFU1BBQ0UsXG4gICAgQ1VTVE9NX0VMRU1FTlQsXG4gIH0gPSBFWFBSRVNTSU9OUztcblxuICBsZXQgeyBJU19BTExPV0VEX1VSSSB9ID0gRVhQUkVTU0lPTlM7XG5cbiAgLyoqXG4gICAqIFdlIGNvbnNpZGVyIHRoZSBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBiZWxvdyB0byBiZSBzYWZlLiBJZGVhbGx5XG4gICAqIGRvbid0IGFkZCBhbnkgbmV3IG9uZXMgYnV0IGZlZWwgZnJlZSB0byByZW1vdmUgdW53YW50ZWQgb25lcy5cbiAgICovXG5cbiAgLyogYWxsb3dlZCBlbGVtZW50IG5hbWVzICovXG4gIGxldCBBTExPV0VEX1RBR1MgPSBudWxsO1xuICBjb25zdCBERUZBVUxUX0FMTE9XRURfVEFHUyA9IGFkZFRvU2V0KHt9LCBbXG4gICAgLi4uVEFHUy5odG1sLFxuICAgIC4uLlRBR1Muc3ZnLFxuICAgIC4uLlRBR1Muc3ZnRmlsdGVycyxcbiAgICAuLi5UQUdTLm1hdGhNbCxcbiAgICAuLi5UQUdTLnRleHQsXG4gIF0pO1xuXG4gIC8qIEFsbG93ZWQgYXR0cmlidXRlIG5hbWVzICovXG4gIGxldCBBTExPV0VEX0FUVFIgPSBudWxsO1xuICBjb25zdCBERUZBVUxUX0FMTE9XRURfQVRUUiA9IGFkZFRvU2V0KHt9LCBbXG4gICAgLi4uQVRUUlMuaHRtbCxcbiAgICAuLi5BVFRSUy5zdmcsXG4gICAgLi4uQVRUUlMubWF0aE1sLFxuICAgIC4uLkFUVFJTLnhtbCxcbiAgXSk7XG5cbiAgLypcbiAgICogQ29uZmlndXJlIGhvdyBET01QdXJpZnkgc2hvdWxkIGhhbmRsZSBjdXN0b20gZWxlbWVudHMgYW5kIHRoZWlyIGF0dHJpYnV0ZXMgYXMgd2VsbCBhcyBjdXN0b21pemVkIGJ1aWx0LWluIGVsZW1lbnRzLlxuICAgKiBAcHJvcGVydHkge1JlZ0V4cHxGdW5jdGlvbnxudWxsfSB0YWdOYW1lQ2hlY2sgb25lIG9mIFtudWxsLCByZWdleFBhdHRlcm4sIHByZWRpY2F0ZV0uIERlZmF1bHQ6IGBudWxsYCAoZGlzYWxsb3cgYW55IGN1c3RvbSBlbGVtZW50cylcbiAgICogQHByb3BlcnR5IHtSZWdFeHB8RnVuY3Rpb258bnVsbH0gYXR0cmlidXRlTmFtZUNoZWNrIG9uZSBvZiBbbnVsbCwgcmVnZXhQYXR0ZXJuLCBwcmVkaWNhdGVdLiBEZWZhdWx0OiBgbnVsbGAgKGRpc2FsbG93IGFueSBhdHRyaWJ1dGVzIG5vdCBvbiB0aGUgYWxsb3cgbGlzdClcbiAgICogQHByb3BlcnR5IHtib29sZWFufSBhbGxvd0N1c3RvbWl6ZWRCdWlsdEluRWxlbWVudHMgYWxsb3cgY3VzdG9tIGVsZW1lbnRzIGRlcml2ZWQgZnJvbSBidWlsdC1pbnMgaWYgdGhleSBwYXNzIENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVjay4gRGVmYXVsdDogYGZhbHNlYC5cbiAgICovXG4gIGxldCBDVVNUT01fRUxFTUVOVF9IQU5ETElORyA9IE9iamVjdC5zZWFsKFxuICAgIGNyZWF0ZShudWxsLCB7XG4gICAgICB0YWdOYW1lQ2hlY2s6IHtcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgfSxcbiAgICAgIGF0dHJpYnV0ZU5hbWVDaGVjazoge1xuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IG51bGwsXG4gICAgICB9LFxuICAgICAgYWxsb3dDdXN0b21pemVkQnVpbHRJbkVsZW1lbnRzOiB7XG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogZmFsc2UsXG4gICAgICB9LFxuICAgIH0pXG4gICk7XG5cbiAgLyogRXhwbGljaXRseSBmb3JiaWRkZW4gdGFncyAob3ZlcnJpZGVzIEFMTE9XRURfVEFHUy9BRERfVEFHUykgKi9cbiAgbGV0IEZPUkJJRF9UQUdTID0gbnVsbDtcblxuICAvKiBFeHBsaWNpdGx5IGZvcmJpZGRlbiBhdHRyaWJ1dGVzIChvdmVycmlkZXMgQUxMT1dFRF9BVFRSL0FERF9BVFRSKSAqL1xuICBsZXQgRk9SQklEX0FUVFIgPSBudWxsO1xuXG4gIC8qIENvbmZpZyBvYmplY3QgdG8gc3RvcmUgQUREX1RBR1MvQUREX0FUVFIgZnVuY3Rpb25zICh3aGVuIHVzZWQgYXMgZnVuY3Rpb25zKSAqL1xuICBjb25zdCBFWFRSQV9FTEVNRU5UX0hBTkRMSU5HID0gT2JqZWN0LnNlYWwoXG4gICAgY3JlYXRlKG51bGwsIHtcbiAgICAgIHRhZ0NoZWNrOiB7XG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogbnVsbCxcbiAgICAgIH0sXG4gICAgICBhdHRyaWJ1dGVDaGVjazoge1xuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IG51bGwsXG4gICAgICB9LFxuICAgIH0pXG4gICk7XG5cbiAgLyogRGVjaWRlIGlmIEFSSUEgYXR0cmlidXRlcyBhcmUgb2theSAqL1xuICBsZXQgQUxMT1dfQVJJQV9BVFRSID0gdHJ1ZTtcblxuICAvKiBEZWNpZGUgaWYgY3VzdG9tIGRhdGEgYXR0cmlidXRlcyBhcmUgb2theSAqL1xuICBsZXQgQUxMT1dfREFUQV9BVFRSID0gdHJ1ZTtcblxuICAvKiBEZWNpZGUgaWYgdW5rbm93biBwcm90b2NvbHMgYXJlIG9rYXkgKi9cbiAgbGV0IEFMTE9XX1VOS05PV05fUFJPVE9DT0xTID0gZmFsc2U7XG5cbiAgLyogRGVjaWRlIGlmIHNlbGYtY2xvc2luZyB0YWdzIGluIGF0dHJpYnV0ZXMgYXJlIGFsbG93ZWQuXG4gICAqIFVzdWFsbHkgcmVtb3ZlZCBkdWUgdG8gYSBtWFNTIGlzc3VlIGluIGpRdWVyeSAzLjAgKi9cbiAgbGV0IEFMTE9XX1NFTEZfQ0xPU0VfSU5fQVRUUiA9IHRydWU7XG5cbiAgLyogT3V0cHV0IHNob3VsZCBiZSBzYWZlIGZvciBjb21tb24gdGVtcGxhdGUgZW5naW5lcy5cbiAgICogVGhpcyBtZWFucywgRE9NUHVyaWZ5IHJlbW92ZXMgZGF0YSBhdHRyaWJ1dGVzLCBtdXN0YWNoZXMgYW5kIEVSQlxuICAgKi9cbiAgbGV0IFNBRkVfRk9SX1RFTVBMQVRFUyA9IGZhbHNlO1xuXG4gIC8qIE91dHB1dCBzaG91bGQgYmUgc2FmZSBldmVuIGZvciBYTUwgdXNlZCB3aXRoaW4gSFRNTCBhbmQgYWxpa2UuXG4gICAqIFRoaXMgbWVhbnMsIERPTVB1cmlmeSByZW1vdmVzIGNvbW1lbnRzIHdoZW4gY29udGFpbmluZyByaXNreSBjb250ZW50LlxuICAgKi9cbiAgbGV0IFNBRkVfRk9SX1hNTCA9IHRydWU7XG5cbiAgLyogRGVjaWRlIGlmIGRvY3VtZW50IHdpdGggPGh0bWw+Li4uIHNob3VsZCBiZSByZXR1cm5lZCAqL1xuICBsZXQgV0hPTEVfRE9DVU1FTlQgPSBmYWxzZTtcblxuICAvKiBUcmFjayB3aGV0aGVyIGNvbmZpZyBpcyBhbHJlYWR5IHNldCBvbiB0aGlzIGluc3RhbmNlIG9mIERPTVB1cmlmeS4gKi9cbiAgbGV0IFNFVF9DT05GSUcgPSBmYWxzZTtcblxuICAvKiBEZWNpZGUgaWYgYWxsIGVsZW1lbnRzIChlLmcuIHN0eWxlLCBzY3JpcHQpIG11c3QgYmUgY2hpbGRyZW4gb2ZcbiAgICogZG9jdW1lbnQuYm9keS4gQnkgZGVmYXVsdCwgYnJvd3NlcnMgbWlnaHQgbW92ZSB0aGVtIHRvIGRvY3VtZW50LmhlYWQgKi9cbiAgbGV0IEZPUkNFX0JPRFkgPSBmYWxzZTtcblxuICAvKiBEZWNpZGUgaWYgYSBET00gYEhUTUxCb2R5RWxlbWVudGAgc2hvdWxkIGJlIHJldHVybmVkLCBpbnN0ZWFkIG9mIGEgaHRtbFxuICAgKiBzdHJpbmcgKG9yIGEgVHJ1c3RlZEhUTUwgb2JqZWN0IGlmIFRydXN0ZWQgVHlwZXMgYXJlIHN1cHBvcnRlZCkuXG4gICAqIElmIGBXSE9MRV9ET0NVTUVOVGAgaXMgZW5hYmxlZCBhIGBIVE1MSHRtbEVsZW1lbnRgIHdpbGwgYmUgcmV0dXJuZWQgaW5zdGVhZFxuICAgKi9cbiAgbGV0IFJFVFVSTl9ET00gPSBmYWxzZTtcblxuICAvKiBEZWNpZGUgaWYgYSBET00gYERvY3VtZW50RnJhZ21lbnRgIHNob3VsZCBiZSByZXR1cm5lZCwgaW5zdGVhZCBvZiBhIGh0bWxcbiAgICogc3RyaW5nICAob3IgYSBUcnVzdGVkSFRNTCBvYmplY3QgaWYgVHJ1c3RlZCBUeXBlcyBhcmUgc3VwcG9ydGVkKSAqL1xuICBsZXQgUkVUVVJOX0RPTV9GUkFHTUVOVCA9IGZhbHNlO1xuXG4gIC8qIFRyeSB0byByZXR1cm4gYSBUcnVzdGVkIFR5cGUgb2JqZWN0IGluc3RlYWQgb2YgYSBzdHJpbmcsIHJldHVybiBhIHN0cmluZyBpblxuICAgKiBjYXNlIFRydXN0ZWQgVHlwZXMgYXJlIG5vdCBzdXBwb3J0ZWQgICovXG4gIGxldCBSRVRVUk5fVFJVU1RFRF9UWVBFID0gZmFsc2U7XG5cbiAgLyogT3V0cHV0IHNob3VsZCBiZSBmcmVlIGZyb20gRE9NIGNsb2JiZXJpbmcgYXR0YWNrcz9cbiAgICogVGhpcyBzYW5pdGl6ZXMgbWFya3VwcyBuYW1lZCB3aXRoIGNvbGxpZGluZywgY2xvYmJlcmFibGUgYnVpbHQtaW4gRE9NIEFQSXMuXG4gICAqL1xuICBsZXQgU0FOSVRJWkVfRE9NID0gdHJ1ZTtcblxuICAvKiBBY2hpZXZlIGZ1bGwgRE9NIENsb2JiZXJpbmcgcHJvdGVjdGlvbiBieSBpc29sYXRpbmcgdGhlIG5hbWVzcGFjZSBvZiBuYW1lZFxuICAgKiBwcm9wZXJ0aWVzIGFuZCBKUyB2YXJpYWJsZXMsIG1pdGlnYXRpbmcgYXR0YWNrcyB0aGF0IGFidXNlIHRoZSBIVE1ML0RPTSBzcGVjIHJ1bGVzLlxuICAgKlxuICAgKiBIVE1ML0RPTSBzcGVjIHJ1bGVzIHRoYXQgZW5hYmxlIERPTSBDbG9iYmVyaW5nOlxuICAgKiAgIC0gTmFtZWQgQWNjZXNzIG9uIFdpbmRvdyAowqc3LjMuMylcbiAgICogICAtIERPTSBUcmVlIEFjY2Vzc29ycyAowqczLjEuNSlcbiAgICogICAtIEZvcm0gRWxlbWVudCBQYXJlbnQtQ2hpbGQgUmVsYXRpb25zICjCpzQuMTAuMylcbiAgICogICAtIElmcmFtZSBzcmNkb2MgLyBOZXN0ZWQgV2luZG93UHJveGllcyAowqc0LjguNSlcbiAgICogICAtIEhUTUxDb2xsZWN0aW9uICjCpzQuMi4xMC4yKVxuICAgKlxuICAgKiBOYW1lc3BhY2UgaXNvbGF0aW9uIGlzIGltcGxlbWVudGVkIGJ5IHByZWZpeGluZyBgaWRgIGFuZCBgbmFtZWAgYXR0cmlidXRlc1xuICAgKiB3aXRoIGEgY29uc3RhbnQgc3RyaW5nLCBpLmUuLCBgdXNlci1jb250ZW50LWBcbiAgICovXG4gIGxldCBTQU5JVElaRV9OQU1FRF9QUk9QUyA9IGZhbHNlO1xuICBjb25zdCBTQU5JVElaRV9OQU1FRF9QUk9QU19QUkVGSVggPSAndXNlci1jb250ZW50LSc7XG5cbiAgLyogS2VlcCBlbGVtZW50IGNvbnRlbnQgd2hlbiByZW1vdmluZyBlbGVtZW50PyAqL1xuICBsZXQgS0VFUF9DT05URU5UID0gdHJ1ZTtcblxuICAvKiBJZiBhIGBOb2RlYCBpcyBwYXNzZWQgdG8gc2FuaXRpemUoKSwgdGhlbiBwZXJmb3JtcyBzYW5pdGl6YXRpb24gaW4tcGxhY2UgaW5zdGVhZFxuICAgKiBvZiBpbXBvcnRpbmcgaXQgaW50byBhIG5ldyBEb2N1bWVudCBhbmQgcmV0dXJuaW5nIGEgc2FuaXRpemVkIGNvcHkgKi9cbiAgbGV0IElOX1BMQUNFID0gZmFsc2U7XG5cbiAgLyogQWxsb3cgdXNhZ2Ugb2YgcHJvZmlsZXMgbGlrZSBodG1sLCBzdmcgYW5kIG1hdGhNbCAqL1xuICBsZXQgVVNFX1BST0ZJTEVTOiBVc2VQcm9maWxlc0NvbmZpZyB8IGZhbHNlID0ge307XG5cbiAgLyogVGFncyB0byBpZ25vcmUgY29udGVudCBvZiB3aGVuIEtFRVBfQ09OVEVOVCBpcyB0cnVlICovXG4gIGxldCBGT1JCSURfQ09OVEVOVFMgPSBudWxsO1xuICBjb25zdCBERUZBVUxUX0ZPUkJJRF9DT05URU5UUyA9IGFkZFRvU2V0KHt9LCBbXG4gICAgJ2Fubm90YXRpb24teG1sJyxcbiAgICAnYXVkaW8nLFxuICAgICdjb2xncm91cCcsXG4gICAgJ2Rlc2MnLFxuICAgICdmb3JlaWdub2JqZWN0JyxcbiAgICAnaGVhZCcsXG4gICAgJ2lmcmFtZScsXG4gICAgJ21hdGgnLFxuICAgICdtaScsXG4gICAgJ21uJyxcbiAgICAnbW8nLFxuICAgICdtcycsXG4gICAgJ210ZXh0JyxcbiAgICAnbm9lbWJlZCcsXG4gICAgJ25vZnJhbWVzJyxcbiAgICAnbm9zY3JpcHQnLFxuICAgICdwbGFpbnRleHQnLFxuICAgICdzY3JpcHQnLFxuICAgICdzdHlsZScsXG4gICAgJ3N2ZycsXG4gICAgJ3RlbXBsYXRlJyxcbiAgICAndGhlYWQnLFxuICAgICd0aXRsZScsXG4gICAgJ3ZpZGVvJyxcbiAgICAneG1wJyxcbiAgXSk7XG5cbiAgLyogVGFncyB0aGF0IGFyZSBzYWZlIGZvciBkYXRhOiBVUklzICovXG4gIGxldCBEQVRBX1VSSV9UQUdTID0gbnVsbDtcbiAgY29uc3QgREVGQVVMVF9EQVRBX1VSSV9UQUdTID0gYWRkVG9TZXQoe30sIFtcbiAgICAnYXVkaW8nLFxuICAgICd2aWRlbycsXG4gICAgJ2ltZycsXG4gICAgJ3NvdXJjZScsXG4gICAgJ2ltYWdlJyxcbiAgICAndHJhY2snLFxuICBdKTtcblxuICAvKiBBdHRyaWJ1dGVzIHNhZmUgZm9yIHZhbHVlcyBsaWtlIFwiamF2YXNjcmlwdDpcIiAqL1xuICBsZXQgVVJJX1NBRkVfQVRUUklCVVRFUyA9IG51bGw7XG4gIGNvbnN0IERFRkFVTFRfVVJJX1NBRkVfQVRUUklCVVRFUyA9IGFkZFRvU2V0KHt9LCBbXG4gICAgJ2FsdCcsXG4gICAgJ2NsYXNzJyxcbiAgICAnZm9yJyxcbiAgICAnaWQnLFxuICAgICdsYWJlbCcsXG4gICAgJ25hbWUnLFxuICAgICdwYXR0ZXJuJyxcbiAgICAncGxhY2Vob2xkZXInLFxuICAgICdyb2xlJyxcbiAgICAnc3VtbWFyeScsXG4gICAgJ3RpdGxlJyxcbiAgICAndmFsdWUnLFxuICAgICdzdHlsZScsXG4gICAgJ3htbG5zJyxcbiAgXSk7XG5cbiAgY29uc3QgTUFUSE1MX05BTUVTUEFDRSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MJztcbiAgY29uc3QgU1ZHX05BTUVTUEFDRSA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc7XG4gIGNvbnN0IEhUTUxfTkFNRVNQQUNFID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnO1xuICAvKiBEb2N1bWVudCBuYW1lc3BhY2UgKi9cbiAgbGV0IE5BTUVTUEFDRSA9IEhUTUxfTkFNRVNQQUNFO1xuICBsZXQgSVNfRU1QVFlfSU5QVVQgPSBmYWxzZTtcblxuICAvKiBBbGxvd2VkIFhIVE1MK1hNTCBuYW1lc3BhY2VzICovXG4gIGxldCBBTExPV0VEX05BTUVTUEFDRVMgPSBudWxsO1xuICBjb25zdCBERUZBVUxUX0FMTE9XRURfTkFNRVNQQUNFUyA9IGFkZFRvU2V0KFxuICAgIHt9LFxuICAgIFtNQVRITUxfTkFNRVNQQUNFLCBTVkdfTkFNRVNQQUNFLCBIVE1MX05BTUVTUEFDRV0sXG4gICAgc3RyaW5nVG9TdHJpbmdcbiAgKTtcblxuICBsZXQgTUFUSE1MX1RFWFRfSU5URUdSQVRJT05fUE9JTlRTID0gYWRkVG9TZXQoe30sIFtcbiAgICAnbWknLFxuICAgICdtbycsXG4gICAgJ21uJyxcbiAgICAnbXMnLFxuICAgICdtdGV4dCcsXG4gIF0pO1xuXG4gIGxldCBIVE1MX0lOVEVHUkFUSU9OX1BPSU5UUyA9IGFkZFRvU2V0KHt9LCBbJ2Fubm90YXRpb24teG1sJ10pO1xuXG4gIC8vIENlcnRhaW4gZWxlbWVudHMgYXJlIGFsbG93ZWQgaW4gYm90aCBTVkcgYW5kIEhUTUxcbiAgLy8gbmFtZXNwYWNlLiBXZSBuZWVkIHRvIHNwZWNpZnkgdGhlbSBleHBsaWNpdGx5XG4gIC8vIHNvIHRoYXQgdGhleSBkb24ndCBnZXQgZXJyb25lb3VzbHkgZGVsZXRlZCBmcm9tXG4gIC8vIEhUTUwgbmFtZXNwYWNlLlxuICBjb25zdCBDT01NT05fU1ZHX0FORF9IVE1MX0VMRU1FTlRTID0gYWRkVG9TZXQoe30sIFtcbiAgICAndGl0bGUnLFxuICAgICdzdHlsZScsXG4gICAgJ2ZvbnQnLFxuICAgICdhJyxcbiAgICAnc2NyaXB0JyxcbiAgXSk7XG5cbiAgLyogUGFyc2luZyBvZiBzdHJpY3QgWEhUTUwgZG9jdW1lbnRzICovXG4gIGxldCBQQVJTRVJfTUVESUFfVFlQRTogbnVsbCB8IERPTVBhcnNlclN1cHBvcnRlZFR5cGUgPSBudWxsO1xuICBjb25zdCBTVVBQT1JURURfUEFSU0VSX01FRElBX1RZUEVTID0gWydhcHBsaWNhdGlvbi94aHRtbCt4bWwnLCAndGV4dC9odG1sJ107XG4gIGNvbnN0IERFRkFVTFRfUEFSU0VSX01FRElBX1RZUEUgPSAndGV4dC9odG1sJztcbiAgbGV0IHRyYW5zZm9ybUNhc2VGdW5jOiBudWxsIHwgUGFyYW1ldGVyczx0eXBlb2YgYWRkVG9TZXQ+WzJdID0gbnVsbDtcblxuICAvKiBLZWVwIGEgcmVmZXJlbmNlIHRvIGNvbmZpZyB0byBwYXNzIHRvIGhvb2tzICovXG4gIGxldCBDT05GSUc6IENvbmZpZyB8IG51bGwgPSBudWxsO1xuXG4gIC8qIElkZWFsbHksIGRvIG5vdCB0b3VjaCBhbnl0aGluZyBiZWxvdyB0aGlzIGxpbmUgKi9cbiAgLyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqL1xuXG4gIGNvbnN0IGZvcm1FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZm9ybScpO1xuXG4gIGNvbnN0IGlzUmVnZXhPckZ1bmN0aW9uID0gZnVuY3Rpb24gKFxuICAgIHRlc3RWYWx1ZTogdW5rbm93blxuICApOiB0ZXN0VmFsdWUgaXMgRnVuY3Rpb24gfCBSZWdFeHAge1xuICAgIHJldHVybiB0ZXN0VmFsdWUgaW5zdGFuY2VvZiBSZWdFeHAgfHwgdGVzdFZhbHVlIGluc3RhbmNlb2YgRnVuY3Rpb247XG4gIH07XG5cbiAgLyoqXG4gICAqIF9wYXJzZUNvbmZpZ1xuICAgKlxuICAgKiBAcGFyYW0gY2ZnIG9wdGlvbmFsIGNvbmZpZyBsaXRlcmFsXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuICBjb25zdCBfcGFyc2VDb25maWcgPSBmdW5jdGlvbiAoY2ZnOiBDb25maWcgPSB7fSk6IHZvaWQge1xuICAgIGlmIChDT05GSUcgJiYgQ09ORklHID09PSBjZmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvKiBTaGllbGQgY29uZmlndXJhdGlvbiBvYmplY3QgZnJvbSB0YW1wZXJpbmcgKi9cbiAgICBpZiAoIWNmZyB8fCB0eXBlb2YgY2ZnICE9PSAnb2JqZWN0Jykge1xuICAgICAgY2ZnID0ge307XG4gICAgfVxuXG4gICAgLyogU2hpZWxkIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGZyb20gcHJvdG90eXBlIHBvbGx1dGlvbiAqL1xuICAgIGNmZyA9IGNsb25lKGNmZyk7XG5cbiAgICBQQVJTRVJfTUVESUFfVFlQRSA9XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9wcmVmZXItaW5jbHVkZXNcbiAgICAgIFNVUFBPUlRFRF9QQVJTRVJfTUVESUFfVFlQRVMuaW5kZXhPZihjZmcuUEFSU0VSX01FRElBX1RZUEUpID09PSAtMVxuICAgICAgICA/IERFRkFVTFRfUEFSU0VSX01FRElBX1RZUEVcbiAgICAgICAgOiBjZmcuUEFSU0VSX01FRElBX1RZUEU7XG5cbiAgICAvLyBIVE1MIHRhZ3MgYW5kIGF0dHJpYnV0ZXMgYXJlIG5vdCBjYXNlLXNlbnNpdGl2ZSwgY29udmVydGluZyB0byBsb3dlcmNhc2UuIEtlZXBpbmcgWEhUTUwgYXMgaXMuXG4gICAgdHJhbnNmb3JtQ2FzZUZ1bmMgPVxuICAgICAgUEFSU0VSX01FRElBX1RZUEUgPT09ICdhcHBsaWNhdGlvbi94aHRtbCt4bWwnXG4gICAgICAgID8gc3RyaW5nVG9TdHJpbmdcbiAgICAgICAgOiBzdHJpbmdUb0xvd2VyQ2FzZTtcblxuICAgIC8qIFNldCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgKi9cbiAgICBBTExPV0VEX1RBR1MgPSBvYmplY3RIYXNPd25Qcm9wZXJ0eShjZmcsICdBTExPV0VEX1RBR1MnKVxuICAgICAgPyBhZGRUb1NldCh7fSwgY2ZnLkFMTE9XRURfVEFHUywgdHJhbnNmb3JtQ2FzZUZ1bmMpXG4gICAgICA6IERFRkFVTFRfQUxMT1dFRF9UQUdTO1xuICAgIEFMTE9XRURfQVRUUiA9IG9iamVjdEhhc093blByb3BlcnR5KGNmZywgJ0FMTE9XRURfQVRUUicpXG4gICAgICA/IGFkZFRvU2V0KHt9LCBjZmcuQUxMT1dFRF9BVFRSLCB0cmFuc2Zvcm1DYXNlRnVuYylcbiAgICAgIDogREVGQVVMVF9BTExPV0VEX0FUVFI7XG4gICAgQUxMT1dFRF9OQU1FU1BBQ0VTID0gb2JqZWN0SGFzT3duUHJvcGVydHkoY2ZnLCAnQUxMT1dFRF9OQU1FU1BBQ0VTJylcbiAgICAgID8gYWRkVG9TZXQoe30sIGNmZy5BTExPV0VEX05BTUVTUEFDRVMsIHN0cmluZ1RvU3RyaW5nKVxuICAgICAgOiBERUZBVUxUX0FMTE9XRURfTkFNRVNQQUNFUztcbiAgICBVUklfU0FGRV9BVFRSSUJVVEVTID0gb2JqZWN0SGFzT3duUHJvcGVydHkoY2ZnLCAnQUREX1VSSV9TQUZFX0FUVFInKVxuICAgICAgPyBhZGRUb1NldChcbiAgICAgICAgICBjbG9uZShERUZBVUxUX1VSSV9TQUZFX0FUVFJJQlVURVMpLFxuICAgICAgICAgIGNmZy5BRERfVVJJX1NBRkVfQVRUUixcbiAgICAgICAgICB0cmFuc2Zvcm1DYXNlRnVuY1xuICAgICAgICApXG4gICAgICA6IERFRkFVTFRfVVJJX1NBRkVfQVRUUklCVVRFUztcbiAgICBEQVRBX1VSSV9UQUdTID0gb2JqZWN0SGFzT3duUHJvcGVydHkoY2ZnLCAnQUREX0RBVEFfVVJJX1RBR1MnKVxuICAgICAgPyBhZGRUb1NldChcbiAgICAgICAgICBjbG9uZShERUZBVUxUX0RBVEFfVVJJX1RBR1MpLFxuICAgICAgICAgIGNmZy5BRERfREFUQV9VUklfVEFHUyxcbiAgICAgICAgICB0cmFuc2Zvcm1DYXNlRnVuY1xuICAgICAgICApXG4gICAgICA6IERFRkFVTFRfREFUQV9VUklfVEFHUztcbiAgICBGT1JCSURfQ09OVEVOVFMgPSBvYmplY3RIYXNPd25Qcm9wZXJ0eShjZmcsICdGT1JCSURfQ09OVEVOVFMnKVxuICAgICAgPyBhZGRUb1NldCh7fSwgY2ZnLkZPUkJJRF9DT05URU5UUywgdHJhbnNmb3JtQ2FzZUZ1bmMpXG4gICAgICA6IERFRkFVTFRfRk9SQklEX0NPTlRFTlRTO1xuICAgIEZPUkJJRF9UQUdTID0gb2JqZWN0SGFzT3duUHJvcGVydHkoY2ZnLCAnRk9SQklEX1RBR1MnKVxuICAgICAgPyBhZGRUb1NldCh7fSwgY2ZnLkZPUkJJRF9UQUdTLCB0cmFuc2Zvcm1DYXNlRnVuYylcbiAgICAgIDogY2xvbmUoe30pO1xuICAgIEZPUkJJRF9BVFRSID0gb2JqZWN0SGFzT3duUHJvcGVydHkoY2ZnLCAnRk9SQklEX0FUVFInKVxuICAgICAgPyBhZGRUb1NldCh7fSwgY2ZnLkZPUkJJRF9BVFRSLCB0cmFuc2Zvcm1DYXNlRnVuYylcbiAgICAgIDogY2xvbmUoe30pO1xuICAgIFVTRV9QUk9GSUxFUyA9IG9iamVjdEhhc093blByb3BlcnR5KGNmZywgJ1VTRV9QUk9GSUxFUycpXG4gICAgICA/IGNmZy5VU0VfUFJPRklMRVNcbiAgICAgIDogZmFsc2U7XG4gICAgQUxMT1dfQVJJQV9BVFRSID0gY2ZnLkFMTE9XX0FSSUFfQVRUUiAhPT0gZmFsc2U7IC8vIERlZmF1bHQgdHJ1ZVxuICAgIEFMTE9XX0RBVEFfQVRUUiA9IGNmZy5BTExPV19EQVRBX0FUVFIgIT09IGZhbHNlOyAvLyBEZWZhdWx0IHRydWVcbiAgICBBTExPV19VTktOT1dOX1BST1RPQ09MUyA9IGNmZy5BTExPV19VTktOT1dOX1BST1RPQ09MUyB8fCBmYWxzZTsgLy8gRGVmYXVsdCBmYWxzZVxuICAgIEFMTE9XX1NFTEZfQ0xPU0VfSU5fQVRUUiA9IGNmZy5BTExPV19TRUxGX0NMT1NFX0lOX0FUVFIgIT09IGZhbHNlOyAvLyBEZWZhdWx0IHRydWVcbiAgICBTQUZFX0ZPUl9URU1QTEFURVMgPSBjZmcuU0FGRV9GT1JfVEVNUExBVEVTIHx8IGZhbHNlOyAvLyBEZWZhdWx0IGZhbHNlXG4gICAgU0FGRV9GT1JfWE1MID0gY2ZnLlNBRkVfRk9SX1hNTCAhPT0gZmFsc2U7IC8vIERlZmF1bHQgdHJ1ZVxuICAgIFdIT0xFX0RPQ1VNRU5UID0gY2ZnLldIT0xFX0RPQ1VNRU5UIHx8IGZhbHNlOyAvLyBEZWZhdWx0IGZhbHNlXG4gICAgUkVUVVJOX0RPTSA9IGNmZy5SRVRVUk5fRE9NIHx8IGZhbHNlOyAvLyBEZWZhdWx0IGZhbHNlXG4gICAgUkVUVVJOX0RPTV9GUkFHTUVOVCA9IGNmZy5SRVRVUk5fRE9NX0ZSQUdNRU5UIHx8IGZhbHNlOyAvLyBEZWZhdWx0IGZhbHNlXG4gICAgUkVUVVJOX1RSVVNURURfVFlQRSA9IGNmZy5SRVRVUk5fVFJVU1RFRF9UWVBFIHx8IGZhbHNlOyAvLyBEZWZhdWx0IGZhbHNlXG4gICAgRk9SQ0VfQk9EWSA9IGNmZy5GT1JDRV9CT0RZIHx8IGZhbHNlOyAvLyBEZWZhdWx0IGZhbHNlXG4gICAgU0FOSVRJWkVfRE9NID0gY2ZnLlNBTklUSVpFX0RPTSAhPT0gZmFsc2U7IC8vIERlZmF1bHQgdHJ1ZVxuICAgIFNBTklUSVpFX05BTUVEX1BST1BTID0gY2ZnLlNBTklUSVpFX05BTUVEX1BST1BTIHx8IGZhbHNlOyAvLyBEZWZhdWx0IGZhbHNlXG4gICAgS0VFUF9DT05URU5UID0gY2ZnLktFRVBfQ09OVEVOVCAhPT0gZmFsc2U7IC8vIERlZmF1bHQgdHJ1ZVxuICAgIElOX1BMQUNFID0gY2ZnLklOX1BMQUNFIHx8IGZhbHNlOyAvLyBEZWZhdWx0IGZhbHNlXG4gICAgSVNfQUxMT1dFRF9VUkkgPSBjZmcuQUxMT1dFRF9VUklfUkVHRVhQIHx8IEVYUFJFU1NJT05TLklTX0FMTE9XRURfVVJJO1xuICAgIE5BTUVTUEFDRSA9IGNmZy5OQU1FU1BBQ0UgfHwgSFRNTF9OQU1FU1BBQ0U7XG4gICAgTUFUSE1MX1RFWFRfSU5URUdSQVRJT05fUE9JTlRTID1cbiAgICAgIGNmZy5NQVRITUxfVEVYVF9JTlRFR1JBVElPTl9QT0lOVFMgfHwgTUFUSE1MX1RFWFRfSU5URUdSQVRJT05fUE9JTlRTO1xuICAgIEhUTUxfSU5URUdSQVRJT05fUE9JTlRTID1cbiAgICAgIGNmZy5IVE1MX0lOVEVHUkFUSU9OX1BPSU5UUyB8fCBIVE1MX0lOVEVHUkFUSU9OX1BPSU5UUztcblxuICAgIENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HID0gY2ZnLkNVU1RPTV9FTEVNRU5UX0hBTkRMSU5HIHx8IHt9O1xuICAgIGlmIChcbiAgICAgIGNmZy5DVVNUT01fRUxFTUVOVF9IQU5ETElORyAmJlxuICAgICAgaXNSZWdleE9yRnVuY3Rpb24oY2ZnLkNVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVjaylcbiAgICApIHtcbiAgICAgIENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVjayA9XG4gICAgICAgIGNmZy5DVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2s7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgY2ZnLkNVU1RPTV9FTEVNRU5UX0hBTkRMSU5HICYmXG4gICAgICBpc1JlZ2V4T3JGdW5jdGlvbihjZmcuQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcuYXR0cmlidXRlTmFtZUNoZWNrKVxuICAgICkge1xuICAgICAgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcuYXR0cmlidXRlTmFtZUNoZWNrID1cbiAgICAgICAgY2ZnLkNVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLmF0dHJpYnV0ZU5hbWVDaGVjaztcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBjZmcuQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcgJiZcbiAgICAgIHR5cGVvZiBjZmcuQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcuYWxsb3dDdXN0b21pemVkQnVpbHRJbkVsZW1lbnRzID09PVxuICAgICAgICAnYm9vbGVhbidcbiAgICApIHtcbiAgICAgIENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLmFsbG93Q3VzdG9taXplZEJ1aWx0SW5FbGVtZW50cyA9XG4gICAgICAgIGNmZy5DVVNUT01fRUxFTUVOVF9IQU5ETElORy5hbGxvd0N1c3RvbWl6ZWRCdWlsdEluRWxlbWVudHM7XG4gICAgfVxuXG4gICAgaWYgKFNBRkVfRk9SX1RFTVBMQVRFUykge1xuICAgICAgQUxMT1dfREFUQV9BVFRSID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKFJFVFVSTl9ET01fRlJBR01FTlQpIHtcbiAgICAgIFJFVFVSTl9ET00gPSB0cnVlO1xuICAgIH1cblxuICAgIC8qIFBhcnNlIHByb2ZpbGUgaW5mbyAqL1xuICAgIGlmIChVU0VfUFJPRklMRVMpIHtcbiAgICAgIEFMTE9XRURfVEFHUyA9IGFkZFRvU2V0KHt9LCBUQUdTLnRleHQpO1xuICAgICAgQUxMT1dFRF9BVFRSID0gY3JlYXRlKG51bGwpO1xuICAgICAgaWYgKFVTRV9QUk9GSUxFUy5odG1sID09PSB0cnVlKSB7XG4gICAgICAgIGFkZFRvU2V0KEFMTE9XRURfVEFHUywgVEFHUy5odG1sKTtcbiAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9BVFRSLCBBVFRSUy5odG1sKTtcbiAgICAgIH1cblxuICAgICAgaWYgKFVTRV9QUk9GSUxFUy5zdmcgPT09IHRydWUpIHtcbiAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9UQUdTLCBUQUdTLnN2Zyk7XG4gICAgICAgIGFkZFRvU2V0KEFMTE9XRURfQVRUUiwgQVRUUlMuc3ZnKTtcbiAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9BVFRSLCBBVFRSUy54bWwpO1xuICAgICAgfVxuXG4gICAgICBpZiAoVVNFX1BST0ZJTEVTLnN2Z0ZpbHRlcnMgPT09IHRydWUpIHtcbiAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9UQUdTLCBUQUdTLnN2Z0ZpbHRlcnMpO1xuICAgICAgICBhZGRUb1NldChBTExPV0VEX0FUVFIsIEFUVFJTLnN2Zyk7XG4gICAgICAgIGFkZFRvU2V0KEFMTE9XRURfQVRUUiwgQVRUUlMueG1sKTtcbiAgICAgIH1cblxuICAgICAgaWYgKFVTRV9QUk9GSUxFUy5tYXRoTWwgPT09IHRydWUpIHtcbiAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9UQUdTLCBUQUdTLm1hdGhNbCk7XG4gICAgICAgIGFkZFRvU2V0KEFMTE9XRURfQVRUUiwgQVRUUlMubWF0aE1sKTtcbiAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9BVFRSLCBBVFRSUy54bWwpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qIFByZXZlbnQgZnVuY3Rpb24tYmFzZWQgQUREX0FUVFIgLyBBRERfVEFHUyBmcm9tIGxlYWtpbmcgYWNyb3NzIGNhbGxzICovXG4gICAgaWYgKCFvYmplY3RIYXNPd25Qcm9wZXJ0eShjZmcsICdBRERfVEFHUycpKSB7XG4gICAgICBFWFRSQV9FTEVNRU5UX0hBTkRMSU5HLnRhZ0NoZWNrID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoIW9iamVjdEhhc093blByb3BlcnR5KGNmZywgJ0FERF9BVFRSJykpIHtcbiAgICAgIEVYVFJBX0VMRU1FTlRfSEFORExJTkcuYXR0cmlidXRlQ2hlY2sgPSBudWxsO1xuICAgIH1cblxuICAgIC8qIE1lcmdlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyAqL1xuICAgIGlmIChjZmcuQUREX1RBR1MpIHtcbiAgICAgIGlmICh0eXBlb2YgY2ZnLkFERF9UQUdTID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIEVYVFJBX0VMRU1FTlRfSEFORExJTkcudGFnQ2hlY2sgPSBjZmcuQUREX1RBR1M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoQUxMT1dFRF9UQUdTID09PSBERUZBVUxUX0FMTE9XRURfVEFHUykge1xuICAgICAgICAgIEFMTE9XRURfVEFHUyA9IGNsb25lKEFMTE9XRURfVEFHUyk7XG4gICAgICAgIH1cblxuICAgICAgICBhZGRUb1NldChBTExPV0VEX1RBR1MsIGNmZy5BRERfVEFHUywgdHJhbnNmb3JtQ2FzZUZ1bmMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjZmcuQUREX0FUVFIpIHtcbiAgICAgIGlmICh0eXBlb2YgY2ZnLkFERF9BVFRSID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIEVYVFJBX0VMRU1FTlRfSEFORExJTkcuYXR0cmlidXRlQ2hlY2sgPSBjZmcuQUREX0FUVFI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoQUxMT1dFRF9BVFRSID09PSBERUZBVUxUX0FMTE9XRURfQVRUUikge1xuICAgICAgICAgIEFMTE9XRURfQVRUUiA9IGNsb25lKEFMTE9XRURfQVRUUik7XG4gICAgICAgIH1cblxuICAgICAgICBhZGRUb1NldChBTExPV0VEX0FUVFIsIGNmZy5BRERfQVRUUiwgdHJhbnNmb3JtQ2FzZUZ1bmMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjZmcuQUREX1VSSV9TQUZFX0FUVFIpIHtcbiAgICAgIGFkZFRvU2V0KFVSSV9TQUZFX0FUVFJJQlVURVMsIGNmZy5BRERfVVJJX1NBRkVfQVRUUiwgdHJhbnNmb3JtQ2FzZUZ1bmMpO1xuICAgIH1cblxuICAgIGlmIChjZmcuRk9SQklEX0NPTlRFTlRTKSB7XG4gICAgICBpZiAoRk9SQklEX0NPTlRFTlRTID09PSBERUZBVUxUX0ZPUkJJRF9DT05URU5UUykge1xuICAgICAgICBGT1JCSURfQ09OVEVOVFMgPSBjbG9uZShGT1JCSURfQ09OVEVOVFMpO1xuICAgICAgfVxuXG4gICAgICBhZGRUb1NldChGT1JCSURfQ09OVEVOVFMsIGNmZy5GT1JCSURfQ09OVEVOVFMsIHRyYW5zZm9ybUNhc2VGdW5jKTtcbiAgICB9XG5cbiAgICBpZiAoY2ZnLkFERF9GT1JCSURfQ09OVEVOVFMpIHtcbiAgICAgIGlmIChGT1JCSURfQ09OVEVOVFMgPT09IERFRkFVTFRfRk9SQklEX0NPTlRFTlRTKSB7XG4gICAgICAgIEZPUkJJRF9DT05URU5UUyA9IGNsb25lKEZPUkJJRF9DT05URU5UUyk7XG4gICAgICB9XG5cbiAgICAgIGFkZFRvU2V0KEZPUkJJRF9DT05URU5UUywgY2ZnLkFERF9GT1JCSURfQ09OVEVOVFMsIHRyYW5zZm9ybUNhc2VGdW5jKTtcbiAgICB9XG5cbiAgICAvKiBBZGQgI3RleHQgaW4gY2FzZSBLRUVQX0NPTlRFTlQgaXMgc2V0IHRvIHRydWUgKi9cbiAgICBpZiAoS0VFUF9DT05URU5UKSB7XG4gICAgICBBTExPV0VEX1RBR1NbJyN0ZXh0J10gPSB0cnVlO1xuICAgIH1cblxuICAgIC8qIEFkZCBodG1sLCBoZWFkIGFuZCBib2R5IHRvIEFMTE9XRURfVEFHUyBpbiBjYXNlIFdIT0xFX0RPQ1VNRU5UIGlzIHRydWUgKi9cbiAgICBpZiAoV0hPTEVfRE9DVU1FTlQpIHtcbiAgICAgIGFkZFRvU2V0KEFMTE9XRURfVEFHUywgWydodG1sJywgJ2hlYWQnLCAnYm9keSddKTtcbiAgICB9XG5cbiAgICAvKiBBZGQgdGJvZHkgdG8gQUxMT1dFRF9UQUdTIGluIGNhc2UgdGFibGVzIGFyZSBwZXJtaXR0ZWQsIHNlZSAjMjg2LCAjMzY1ICovXG4gICAgaWYgKEFMTE9XRURfVEFHUy50YWJsZSkge1xuICAgICAgYWRkVG9TZXQoQUxMT1dFRF9UQUdTLCBbJ3Rib2R5J10pO1xuICAgICAgZGVsZXRlIEZPUkJJRF9UQUdTLnRib2R5O1xuICAgIH1cblxuICAgIGlmIChjZmcuVFJVU1RFRF9UWVBFU19QT0xJQ1kpIHtcbiAgICAgIGlmICh0eXBlb2YgY2ZnLlRSVVNURURfVFlQRVNfUE9MSUNZLmNyZWF0ZUhUTUwgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgdHlwZUVycm9yQ3JlYXRlKFxuICAgICAgICAgICdUUlVTVEVEX1RZUEVTX1BPTElDWSBjb25maWd1cmF0aW9uIG9wdGlvbiBtdXN0IHByb3ZpZGUgYSBcImNyZWF0ZUhUTUxcIiBob29rLidcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBjZmcuVFJVU1RFRF9UWVBFU19QT0xJQ1kuY3JlYXRlU2NyaXB0VVJMICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IHR5cGVFcnJvckNyZWF0ZShcbiAgICAgICAgICAnVFJVU1RFRF9UWVBFU19QT0xJQ1kgY29uZmlndXJhdGlvbiBvcHRpb24gbXVzdCBwcm92aWRlIGEgXCJjcmVhdGVTY3JpcHRVUkxcIiBob29rLidcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gT3ZlcndyaXRlIGV4aXN0aW5nIFRydXN0ZWRUeXBlcyBwb2xpY3kuXG4gICAgICB0cnVzdGVkVHlwZXNQb2xpY3kgPSBjZmcuVFJVU1RFRF9UWVBFU19QT0xJQ1k7XG5cbiAgICAgIC8vIFNpZ24gbG9jYWwgdmFyaWFibGVzIHJlcXVpcmVkIGJ5IGBzYW5pdGl6ZWAuXG4gICAgICBlbXB0eUhUTUwgPSB0cnVzdGVkVHlwZXNQb2xpY3kuY3JlYXRlSFRNTCgnJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFVuaW5pdGlhbGl6ZWQgcG9saWN5LCBhdHRlbXB0IHRvIGluaXRpYWxpemUgdGhlIGludGVybmFsIGRvbXB1cmlmeSBwb2xpY3kuXG4gICAgICBpZiAodHJ1c3RlZFR5cGVzUG9saWN5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdHJ1c3RlZFR5cGVzUG9saWN5ID0gX2NyZWF0ZVRydXN0ZWRUeXBlc1BvbGljeShcbiAgICAgICAgICB0cnVzdGVkVHlwZXMsXG4gICAgICAgICAgY3VycmVudFNjcmlwdFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiBjcmVhdGluZyB0aGUgaW50ZXJuYWwgcG9saWN5IHN1Y2NlZWRlZCBzaWduIGludGVybmFsIHZhcmlhYmxlcy5cbiAgICAgIGlmICh0cnVzdGVkVHlwZXNQb2xpY3kgIT09IG51bGwgJiYgdHlwZW9mIGVtcHR5SFRNTCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgZW1wdHlIVE1MID0gdHJ1c3RlZFR5cGVzUG9saWN5LmNyZWF0ZUhUTUwoJycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFByZXZlbnQgZnVydGhlciBtYW5pcHVsYXRpb24gb2YgY29uZmlndXJhdGlvbi5cbiAgICAvLyBOb3QgYXZhaWxhYmxlIGluIElFOCwgU2FmYXJpIDUsIGV0Yy5cbiAgICBpZiAoZnJlZXplKSB7XG4gICAgICBmcmVlemUoY2ZnKTtcbiAgICB9XG5cbiAgICBDT05GSUcgPSBjZmc7XG4gIH07XG5cbiAgLyogS2VlcCB0cmFjayBvZiBhbGwgcG9zc2libGUgU1ZHIGFuZCBNYXRoTUwgdGFnc1xuICAgKiBzbyB0aGF0IHdlIGNhbiBwZXJmb3JtIHRoZSBuYW1lc3BhY2UgY2hlY2tzXG4gICAqIGNvcnJlY3RseS4gKi9cbiAgY29uc3QgQUxMX1NWR19UQUdTID0gYWRkVG9TZXQoe30sIFtcbiAgICAuLi5UQUdTLnN2ZyxcbiAgICAuLi5UQUdTLnN2Z0ZpbHRlcnMsXG4gICAgLi4uVEFHUy5zdmdEaXNhbGxvd2VkLFxuICBdKTtcbiAgY29uc3QgQUxMX01BVEhNTF9UQUdTID0gYWRkVG9TZXQoe30sIFtcbiAgICAuLi5UQUdTLm1hdGhNbCxcbiAgICAuLi5UQUdTLm1hdGhNbERpc2FsbG93ZWQsXG4gIF0pO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gZWxlbWVudCBhIERPTSBlbGVtZW50IHdob3NlIG5hbWVzcGFjZSBpcyBiZWluZyBjaGVja2VkXG4gICAqIEByZXR1cm5zIFJldHVybiBmYWxzZSBpZiB0aGUgZWxlbWVudCBoYXMgYVxuICAgKiAgbmFtZXNwYWNlIHRoYXQgYSBzcGVjLWNvbXBsaWFudCBwYXJzZXIgd291bGQgbmV2ZXJcbiAgICogIHJldHVybi4gUmV0dXJuIHRydWUgb3RoZXJ3aXNlLlxuICAgKi9cbiAgY29uc3QgX2NoZWNrVmFsaWROYW1lc3BhY2UgPSBmdW5jdGlvbiAoZWxlbWVudDogRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgIGxldCBwYXJlbnQgPSBnZXRQYXJlbnROb2RlKGVsZW1lbnQpO1xuXG4gICAgLy8gSW4gSlNET00sIGlmIHdlJ3JlIGluc2lkZSBzaGFkb3cgRE9NLCB0aGVuIHBhcmVudE5vZGVcbiAgICAvLyBjYW4gYmUgbnVsbC4gV2UganVzdCBzaW11bGF0ZSBwYXJlbnQgaW4gdGhpcyBjYXNlLlxuICAgIGlmICghcGFyZW50IHx8ICFwYXJlbnQudGFnTmFtZSkge1xuICAgICAgcGFyZW50ID0ge1xuICAgICAgICBuYW1lc3BhY2VVUkk6IE5BTUVTUEFDRSxcbiAgICAgICAgdGFnTmFtZTogJ3RlbXBsYXRlJyxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgdGFnTmFtZSA9IHN0cmluZ1RvTG93ZXJDYXNlKGVsZW1lbnQudGFnTmFtZSk7XG4gICAgY29uc3QgcGFyZW50VGFnTmFtZSA9IHN0cmluZ1RvTG93ZXJDYXNlKHBhcmVudC50YWdOYW1lKTtcblxuICAgIGlmICghQUxMT1dFRF9OQU1FU1BBQ0VTW2VsZW1lbnQubmFtZXNwYWNlVVJJXSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChlbGVtZW50Lm5hbWVzcGFjZVVSSSA9PT0gU1ZHX05BTUVTUEFDRSkge1xuICAgICAgLy8gVGhlIG9ubHkgd2F5IHRvIHN3aXRjaCBmcm9tIEhUTUwgbmFtZXNwYWNlIHRvIFNWR1xuICAgICAgLy8gaXMgdmlhIDxzdmc+LiBJZiBpdCBoYXBwZW5zIHZpYSBhbnkgb3RoZXIgdGFnLCB0aGVuXG4gICAgICAvLyBpdCBzaG91bGQgYmUga2lsbGVkLlxuICAgICAgaWYgKHBhcmVudC5uYW1lc3BhY2VVUkkgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgICAgIHJldHVybiB0YWdOYW1lID09PSAnc3ZnJztcbiAgICAgIH1cblxuICAgICAgLy8gVGhlIG9ubHkgd2F5IHRvIHN3aXRjaCBmcm9tIE1hdGhNTCB0byBTVkcgaXMgdmlhYFxuICAgICAgLy8gc3ZnIGlmIHBhcmVudCBpcyBlaXRoZXIgPGFubm90YXRpb24teG1sPiBvciBNYXRoTUxcbiAgICAgIC8vIHRleHQgaW50ZWdyYXRpb24gcG9pbnRzLlxuICAgICAgaWYgKHBhcmVudC5uYW1lc3BhY2VVUkkgPT09IE1BVEhNTF9OQU1FU1BBQ0UpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICB0YWdOYW1lID09PSAnc3ZnJyAmJlxuICAgICAgICAgIChwYXJlbnRUYWdOYW1lID09PSAnYW5ub3RhdGlvbi14bWwnIHx8XG4gICAgICAgICAgICBNQVRITUxfVEVYVF9JTlRFR1JBVElPTl9QT0lOVFNbcGFyZW50VGFnTmFtZV0pXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFdlIG9ubHkgYWxsb3cgZWxlbWVudHMgdGhhdCBhcmUgZGVmaW5lZCBpbiBTVkdcbiAgICAgIC8vIHNwZWMuIEFsbCBvdGhlcnMgYXJlIGRpc2FsbG93ZWQgaW4gU1ZHIG5hbWVzcGFjZS5cbiAgICAgIHJldHVybiBCb29sZWFuKEFMTF9TVkdfVEFHU1t0YWdOYW1lXSk7XG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnQubmFtZXNwYWNlVVJJID09PSBNQVRITUxfTkFNRVNQQUNFKSB7XG4gICAgICAvLyBUaGUgb25seSB3YXkgdG8gc3dpdGNoIGZyb20gSFRNTCBuYW1lc3BhY2UgdG8gTWF0aE1MXG4gICAgICAvLyBpcyB2aWEgPG1hdGg+LiBJZiBpdCBoYXBwZW5zIHZpYSBhbnkgb3RoZXIgdGFnLCB0aGVuXG4gICAgICAvLyBpdCBzaG91bGQgYmUga2lsbGVkLlxuICAgICAgaWYgKHBhcmVudC5uYW1lc3BhY2VVUkkgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgICAgIHJldHVybiB0YWdOYW1lID09PSAnbWF0aCc7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBvbmx5IHdheSB0byBzd2l0Y2ggZnJvbSBTVkcgdG8gTWF0aE1MIGlzIHZpYVxuICAgICAgLy8gPG1hdGg+IGFuZCBIVE1MIGludGVncmF0aW9uIHBvaW50c1xuICAgICAgaWYgKHBhcmVudC5uYW1lc3BhY2VVUkkgPT09IFNWR19OQU1FU1BBQ0UpIHtcbiAgICAgICAgcmV0dXJuIHRhZ05hbWUgPT09ICdtYXRoJyAmJiBIVE1MX0lOVEVHUkFUSU9OX1BPSU5UU1twYXJlbnRUYWdOYW1lXTtcbiAgICAgIH1cblxuICAgICAgLy8gV2Ugb25seSBhbGxvdyBlbGVtZW50cyB0aGF0IGFyZSBkZWZpbmVkIGluIE1hdGhNTFxuICAgICAgLy8gc3BlYy4gQWxsIG90aGVycyBhcmUgZGlzYWxsb3dlZCBpbiBNYXRoTUwgbmFtZXNwYWNlLlxuICAgICAgcmV0dXJuIEJvb2xlYW4oQUxMX01BVEhNTF9UQUdTW3RhZ05hbWVdKTtcbiAgICB9XG5cbiAgICBpZiAoZWxlbWVudC5uYW1lc3BhY2VVUkkgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgICAvLyBUaGUgb25seSB3YXkgdG8gc3dpdGNoIGZyb20gU1ZHIHRvIEhUTUwgaXMgdmlhXG4gICAgICAvLyBIVE1MIGludGVncmF0aW9uIHBvaW50cywgYW5kIGZyb20gTWF0aE1MIHRvIEhUTUxcbiAgICAgIC8vIGlzIHZpYSBNYXRoTUwgdGV4dCBpbnRlZ3JhdGlvbiBwb2ludHNcbiAgICAgIGlmIChcbiAgICAgICAgcGFyZW50Lm5hbWVzcGFjZVVSSSA9PT0gU1ZHX05BTUVTUEFDRSAmJlxuICAgICAgICAhSFRNTF9JTlRFR1JBVElPTl9QT0lOVFNbcGFyZW50VGFnTmFtZV1cbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgcGFyZW50Lm5hbWVzcGFjZVVSSSA9PT0gTUFUSE1MX05BTUVTUEFDRSAmJlxuICAgICAgICAhTUFUSE1MX1RFWFRfSU5URUdSQVRJT05fUE9JTlRTW3BhcmVudFRhZ05hbWVdXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBXZSBkaXNhbGxvdyB0YWdzIHRoYXQgYXJlIHNwZWNpZmljIGZvciBNYXRoTUxcbiAgICAgIC8vIG9yIFNWRyBhbmQgc2hvdWxkIG5ldmVyIGFwcGVhciBpbiBIVE1MIG5hbWVzcGFjZVxuICAgICAgcmV0dXJuIChcbiAgICAgICAgIUFMTF9NQVRITUxfVEFHU1t0YWdOYW1lXSAmJlxuICAgICAgICAoQ09NTU9OX1NWR19BTkRfSFRNTF9FTEVNRU5UU1t0YWdOYW1lXSB8fCAhQUxMX1NWR19UQUdTW3RhZ05hbWVdKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBGb3IgWEhUTUwgYW5kIFhNTCBkb2N1bWVudHMgdGhhdCBzdXBwb3J0IGN1c3RvbSBuYW1lc3BhY2VzXG4gICAgaWYgKFxuICAgICAgUEFSU0VSX01FRElBX1RZUEUgPT09ICdhcHBsaWNhdGlvbi94aHRtbCt4bWwnICYmXG4gICAgICBBTExPV0VEX05BTUVTUEFDRVNbZWxlbWVudC5uYW1lc3BhY2VVUkldXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBUaGUgY29kZSBzaG91bGQgbmV2ZXIgcmVhY2ggdGhpcyBwbGFjZSAodGhpcyBtZWFuc1xuICAgIC8vIHRoYXQgdGhlIGVsZW1lbnQgc29tZWhvdyBnb3QgbmFtZXNwYWNlIHRoYXQgaXMgbm90XG4gICAgLy8gSFRNTCwgU1ZHLCBNYXRoTUwgb3IgYWxsb3dlZCB2aWEgQUxMT1dFRF9OQU1FU1BBQ0VTKS5cbiAgICAvLyBSZXR1cm4gZmFsc2UganVzdCBpbiBjYXNlLlxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICAvKipcbiAgICogX2ZvcmNlUmVtb3ZlXG4gICAqXG4gICAqIEBwYXJhbSBub2RlIGEgRE9NIG5vZGVcbiAgICovXG4gIGNvbnN0IF9mb3JjZVJlbW92ZSA9IGZ1bmN0aW9uIChub2RlOiBOb2RlKTogdm9pZCB7XG4gICAgYXJyYXlQdXNoKERPTVB1cmlmeS5yZW1vdmVkLCB7IGVsZW1lbnQ6IG5vZGUgfSk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vcHJlZmVyLWRvbS1ub2RlLXJlbW92ZVxuICAgICAgZ2V0UGFyZW50Tm9kZShub2RlKS5yZW1vdmVDaGlsZChub2RlKTtcbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICByZW1vdmUobm9kZSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBfcmVtb3ZlQXR0cmlidXRlXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIGFuIEF0dHJpYnV0ZSBuYW1lXG4gICAqIEBwYXJhbSBlbGVtZW50IGEgRE9NIG5vZGVcbiAgICovXG4gIGNvbnN0IF9yZW1vdmVBdHRyaWJ1dGUgPSBmdW5jdGlvbiAobmFtZTogc3RyaW5nLCBlbGVtZW50OiBFbGVtZW50KTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGFycmF5UHVzaChET01QdXJpZnkucmVtb3ZlZCwge1xuICAgICAgICBhdHRyaWJ1dGU6IGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShuYW1lKSxcbiAgICAgICAgZnJvbTogZWxlbWVudCxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIGFycmF5UHVzaChET01QdXJpZnkucmVtb3ZlZCwge1xuICAgICAgICBhdHRyaWJ1dGU6IG51bGwsXG4gICAgICAgIGZyb206IGVsZW1lbnQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcblxuICAgIC8vIFdlIHZvaWQgYXR0cmlidXRlIHZhbHVlcyBmb3IgdW5yZW1vdmFibGUgXCJpc1wiIGF0dHJpYnV0ZXNcbiAgICBpZiAobmFtZSA9PT0gJ2lzJykge1xuICAgICAgaWYgKFJFVFVSTl9ET00gfHwgUkVUVVJOX0RPTV9GUkFHTUVOVCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIF9mb3JjZVJlbW92ZShlbGVtZW50KTtcbiAgICAgICAgfSBjYXRjaCAoXykge31cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUobmFtZSwgJycpO1xuICAgICAgICB9IGNhdGNoIChfKSB7fVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogX2luaXREb2N1bWVudFxuICAgKlxuICAgKiBAcGFyYW0gZGlydHkgLSBhIHN0cmluZyBvZiBkaXJ0eSBtYXJrdXBcbiAgICogQHJldHVybiBhIERPTSwgZmlsbGVkIHdpdGggdGhlIGRpcnR5IG1hcmt1cFxuICAgKi9cbiAgY29uc3QgX2luaXREb2N1bWVudCA9IGZ1bmN0aW9uIChkaXJ0eTogc3RyaW5nKTogRG9jdW1lbnQge1xuICAgIC8qIENyZWF0ZSBhIEhUTUwgZG9jdW1lbnQgKi9cbiAgICBsZXQgZG9jID0gbnVsbDtcbiAgICBsZXQgbGVhZGluZ1doaXRlc3BhY2UgPSBudWxsO1xuXG4gICAgaWYgKEZPUkNFX0JPRFkpIHtcbiAgICAgIGRpcnR5ID0gJzxyZW1vdmU+PC9yZW1vdmU+JyArIGRpcnR5O1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBJZiBGT1JDRV9CT0RZIGlzbid0IHVzZWQsIGxlYWRpbmcgd2hpdGVzcGFjZSBuZWVkcyB0byBiZSBwcmVzZXJ2ZWQgbWFudWFsbHkgKi9cbiAgICAgIGNvbnN0IG1hdGNoZXMgPSBzdHJpbmdNYXRjaChkaXJ0eSwgL15bXFxyXFxuXFx0IF0rLyk7XG4gICAgICBsZWFkaW5nV2hpdGVzcGFjZSA9IG1hdGNoZXMgJiYgbWF0Y2hlc1swXTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBQQVJTRVJfTUVESUFfVFlQRSA9PT0gJ2FwcGxpY2F0aW9uL3hodG1sK3htbCcgJiZcbiAgICAgIE5BTUVTUEFDRSA9PT0gSFRNTF9OQU1FU1BBQ0VcbiAgICApIHtcbiAgICAgIC8vIFJvb3Qgb2YgWEhUTUwgZG9jIG11c3QgY29udGFpbiB4bWxucyBkZWNsYXJhdGlvbiAoc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvbm9ybWF0aXZlLmh0bWwjc3RyaWN0KVxuICAgICAgZGlydHkgPVxuICAgICAgICAnPGh0bWwgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCI+PGhlYWQ+PC9oZWFkPjxib2R5PicgK1xuICAgICAgICBkaXJ0eSArXG4gICAgICAgICc8L2JvZHk+PC9odG1sPic7XG4gICAgfVxuXG4gICAgY29uc3QgZGlydHlQYXlsb2FkID0gdHJ1c3RlZFR5cGVzUG9saWN5XG4gICAgICA/IHRydXN0ZWRUeXBlc1BvbGljeS5jcmVhdGVIVE1MKGRpcnR5KVxuICAgICAgOiBkaXJ0eTtcbiAgICAvKlxuICAgICAqIFVzZSB0aGUgRE9NUGFyc2VyIEFQSSBieSBkZWZhdWx0LCBmYWxsYmFjayBsYXRlciBpZiBuZWVkcyBiZVxuICAgICAqIERPTVBhcnNlciBub3Qgd29yayBmb3Igc3ZnIHdoZW4gaGFzIG11bHRpcGxlIHJvb3QgZWxlbWVudC5cbiAgICAgKi9cbiAgICBpZiAoTkFNRVNQQUNFID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZG9jID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhkaXJ0eVBheWxvYWQsIFBBUlNFUl9NRURJQV9UWVBFKTtcbiAgICAgIH0gY2F0Y2ggKF8pIHt9XG4gICAgfVxuXG4gICAgLyogVXNlIGNyZWF0ZUhUTUxEb2N1bWVudCBpbiBjYXNlIERPTVBhcnNlciBpcyBub3QgYXZhaWxhYmxlICovXG4gICAgaWYgKCFkb2MgfHwgIWRvYy5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgIGRvYyA9IGltcGxlbWVudGF0aW9uLmNyZWF0ZURvY3VtZW50KE5BTUVTUEFDRSwgJ3RlbXBsYXRlJywgbnVsbCk7XG4gICAgICB0cnkge1xuICAgICAgICBkb2MuZG9jdW1lbnRFbGVtZW50LmlubmVySFRNTCA9IElTX0VNUFRZX0lOUFVUXG4gICAgICAgICAgPyBlbXB0eUhUTUxcbiAgICAgICAgICA6IGRpcnR5UGF5bG9hZDtcbiAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgLy8gU3ludGF4IGVycm9yIGlmIGRpcnR5UGF5bG9hZCBpcyBpbnZhbGlkIHhtbFxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGJvZHkgPSBkb2MuYm9keSB8fCBkb2MuZG9jdW1lbnRFbGVtZW50O1xuXG4gICAgaWYgKGRpcnR5ICYmIGxlYWRpbmdXaGl0ZXNwYWNlKSB7XG4gICAgICBib2R5Lmluc2VydEJlZm9yZShcbiAgICAgICAgZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobGVhZGluZ1doaXRlc3BhY2UpLFxuICAgICAgICBib2R5LmNoaWxkTm9kZXNbMF0gfHwgbnVsbFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvKiBXb3JrIG9uIHdob2xlIGRvY3VtZW50IG9yIGp1c3QgaXRzIGJvZHkgKi9cbiAgICBpZiAoTkFNRVNQQUNFID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgICAgcmV0dXJuIGdldEVsZW1lbnRzQnlUYWdOYW1lLmNhbGwoXG4gICAgICAgIGRvYyxcbiAgICAgICAgV0hPTEVfRE9DVU1FTlQgPyAnaHRtbCcgOiAnYm9keSdcbiAgICAgIClbMF07XG4gICAgfVxuXG4gICAgcmV0dXJuIFdIT0xFX0RPQ1VNRU5UID8gZG9jLmRvY3VtZW50RWxlbWVudCA6IGJvZHk7XG4gIH07XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBOb2RlSXRlcmF0b3Igb2JqZWN0IHRoYXQgeW91IGNhbiB1c2UgdG8gdHJhdmVyc2UgZmlsdGVyZWQgbGlzdHMgb2Ygbm9kZXMgb3IgZWxlbWVudHMgaW4gYSBkb2N1bWVudC5cbiAgICpcbiAgICogQHBhcmFtIHJvb3QgVGhlIHJvb3QgZWxlbWVudCBvciBub2RlIHRvIHN0YXJ0IHRyYXZlcnNpbmcgb24uXG4gICAqIEByZXR1cm4gVGhlIGNyZWF0ZWQgTm9kZUl0ZXJhdG9yXG4gICAqL1xuICBjb25zdCBfY3JlYXRlTm9kZUl0ZXJhdG9yID0gZnVuY3Rpb24gKHJvb3Q6IE5vZGUpOiBOb2RlSXRlcmF0b3Ige1xuICAgIHJldHVybiBjcmVhdGVOb2RlSXRlcmF0b3IuY2FsbChcbiAgICAgIHJvb3Qub3duZXJEb2N1bWVudCB8fCByb290LFxuICAgICAgcm9vdCxcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1iaXR3aXNlXG4gICAgICBOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCB8XG4gICAgICAgIE5vZGVGaWx0ZXIuU0hPV19DT01NRU5UIHxcbiAgICAgICAgTm9kZUZpbHRlci5TSE9XX1RFWFQgfFxuICAgICAgICBOb2RlRmlsdGVyLlNIT1dfUFJPQ0VTU0lOR19JTlNUUlVDVElPTiB8XG4gICAgICAgIE5vZGVGaWx0ZXIuU0hPV19DREFUQV9TRUNUSU9OLFxuICAgICAgbnVsbFxuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIF9pc0Nsb2JiZXJlZFxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCBlbGVtZW50IHRvIGNoZWNrIGZvciBjbG9iYmVyaW5nIGF0dGFja3NcbiAgICogQHJldHVybiB0cnVlIGlmIGNsb2JiZXJlZCwgZmFsc2UgaWYgc2FmZVxuICAgKi9cbiAgY29uc3QgX2lzQ2xvYmJlcmVkID0gZnVuY3Rpb24gKGVsZW1lbnQ6IEVsZW1lbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxGb3JtRWxlbWVudCAmJlxuICAgICAgKHR5cGVvZiBlbGVtZW50Lm5vZGVOYW1lICE9PSAnc3RyaW5nJyB8fFxuICAgICAgICB0eXBlb2YgZWxlbWVudC50ZXh0Q29udGVudCAhPT0gJ3N0cmluZycgfHxcbiAgICAgICAgdHlwZW9mIGVsZW1lbnQucmVtb3ZlQ2hpbGQgIT09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgIShlbGVtZW50LmF0dHJpYnV0ZXMgaW5zdGFuY2VvZiBOYW1lZE5vZGVNYXApIHx8XG4gICAgICAgIHR5cGVvZiBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICB0eXBlb2YgZWxlbWVudC5zZXRBdHRyaWJ1dGUgIT09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgdHlwZW9mIGVsZW1lbnQubmFtZXNwYWNlVVJJICE9PSAnc3RyaW5nJyB8fFxuICAgICAgICB0eXBlb2YgZWxlbWVudC5pbnNlcnRCZWZvcmUgIT09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgdHlwZW9mIGVsZW1lbnQuaGFzQ2hpbGROb2RlcyAhPT0gJ2Z1bmN0aW9uJylcbiAgICApO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGEgRE9NIG5vZGUuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBvYmplY3QgdG8gY2hlY2sgd2hldGhlciBpdCdzIGEgRE9NIG5vZGVcbiAgICogQHJldHVybiB0cnVlIGlzIG9iamVjdCBpcyBhIERPTSBub2RlXG4gICAqL1xuICBjb25zdCBfaXNOb2RlID0gZnVuY3Rpb24gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgTm9kZSB7XG4gICAgcmV0dXJuIHR5cGVvZiBOb2RlID09PSAnZnVuY3Rpb24nICYmIHZhbHVlIGluc3RhbmNlb2YgTm9kZTtcbiAgfTtcblxuICBmdW5jdGlvbiBfZXhlY3V0ZUhvb2tzPFQgZXh0ZW5kcyBIb29rRnVuY3Rpb24+KFxuICAgIGhvb2tzOiBIb29rRnVuY3Rpb25bXSxcbiAgICBjdXJyZW50Tm9kZTogUGFyYW1ldGVyczxUPlswXSxcbiAgICBkYXRhOiBQYXJhbWV0ZXJzPFQ+WzFdXG4gICk6IHZvaWQge1xuICAgIGFycmF5Rm9yRWFjaChob29rcywgKGhvb2s6IFQpID0+IHtcbiAgICAgIGhvb2suY2FsbChET01QdXJpZnksIGN1cnJlbnROb2RlLCBkYXRhLCBDT05GSUcpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIF9zYW5pdGl6ZUVsZW1lbnRzXG4gICAqXG4gICAqIEBwcm90ZWN0IG5vZGVOYW1lXG4gICAqIEBwcm90ZWN0IHRleHRDb250ZW50XG4gICAqIEBwcm90ZWN0IHJlbW92ZUNoaWxkXG4gICAqIEBwYXJhbSBjdXJyZW50Tm9kZSB0byBjaGVjayBmb3IgcGVybWlzc2lvbiB0byBleGlzdFxuICAgKiBAcmV0dXJuIHRydWUgaWYgbm9kZSB3YXMga2lsbGVkLCBmYWxzZSBpZiBsZWZ0IGFsaXZlXG4gICAqL1xuICBjb25zdCBfc2FuaXRpemVFbGVtZW50cyA9IGZ1bmN0aW9uIChjdXJyZW50Tm9kZTogYW55KTogYm9vbGVhbiB7XG4gICAgbGV0IGNvbnRlbnQgPSBudWxsO1xuXG4gICAgLyogRXhlY3V0ZSBhIGhvb2sgaWYgcHJlc2VudCAqL1xuICAgIF9leGVjdXRlSG9va3MoaG9va3MuYmVmb3JlU2FuaXRpemVFbGVtZW50cywgY3VycmVudE5vZGUsIG51bGwpO1xuXG4gICAgLyogQ2hlY2sgaWYgZWxlbWVudCBpcyBjbG9iYmVyZWQgb3IgY2FuIGNsb2JiZXIgKi9cbiAgICBpZiAoX2lzQ2xvYmJlcmVkKGN1cnJlbnROb2RlKSkge1xuICAgICAgX2ZvcmNlUmVtb3ZlKGN1cnJlbnROb2RlKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qIE5vdyBsZXQncyBjaGVjayB0aGUgZWxlbWVudCdzIHR5cGUgYW5kIG5hbWUgKi9cbiAgICBjb25zdCB0YWdOYW1lID0gdHJhbnNmb3JtQ2FzZUZ1bmMoY3VycmVudE5vZGUubm9kZU5hbWUpO1xuXG4gICAgLyogRXhlY3V0ZSBhIGhvb2sgaWYgcHJlc2VudCAqL1xuICAgIF9leGVjdXRlSG9va3MoaG9va3MudXBvblNhbml0aXplRWxlbWVudCwgY3VycmVudE5vZGUsIHtcbiAgICAgIHRhZ05hbWUsXG4gICAgICBhbGxvd2VkVGFnczogQUxMT1dFRF9UQUdTLFxuICAgIH0pO1xuXG4gICAgLyogRGV0ZWN0IG1YU1MgYXR0ZW1wdHMgYWJ1c2luZyBuYW1lc3BhY2UgY29uZnVzaW9uICovXG4gICAgaWYgKFxuICAgICAgU0FGRV9GT1JfWE1MICYmXG4gICAgICBjdXJyZW50Tm9kZS5oYXNDaGlsZE5vZGVzKCkgJiZcbiAgICAgICFfaXNOb2RlKGN1cnJlbnROb2RlLmZpcnN0RWxlbWVudENoaWxkKSAmJlxuICAgICAgcmVnRXhwVGVzdCgvPFsvXFx3IV0vZywgY3VycmVudE5vZGUuaW5uZXJIVE1MKSAmJlxuICAgICAgcmVnRXhwVGVzdCgvPFsvXFx3IV0vZywgY3VycmVudE5vZGUudGV4dENvbnRlbnQpXG4gICAgKSB7XG4gICAgICBfZm9yY2VSZW1vdmUoY3VycmVudE5vZGUpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyogUmVtb3ZlIGFueSBvY2N1cnJlbmNlIG9mIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zICovXG4gICAgaWYgKGN1cnJlbnROb2RlLm5vZGVUeXBlID09PSBOT0RFX1RZUEUucHJvZ3Jlc3NpbmdJbnN0cnVjdGlvbikge1xuICAgICAgX2ZvcmNlUmVtb3ZlKGN1cnJlbnROb2RlKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qIFJlbW92ZSBhbnkga2luZCBvZiBwb3NzaWJseSBoYXJtZnVsIGNvbW1lbnRzICovXG4gICAgaWYgKFxuICAgICAgU0FGRV9GT1JfWE1MICYmXG4gICAgICBjdXJyZW50Tm9kZS5ub2RlVHlwZSA9PT0gTk9ERV9UWVBFLmNvbW1lbnQgJiZcbiAgICAgIHJlZ0V4cFRlc3QoLzxbL1xcd10vZywgY3VycmVudE5vZGUuZGF0YSlcbiAgICApIHtcbiAgICAgIF9mb3JjZVJlbW92ZShjdXJyZW50Tm9kZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKiBSZW1vdmUgZWxlbWVudCBpZiBhbnl0aGluZyBmb3JiaWRzIGl0cyBwcmVzZW5jZSAqL1xuICAgIGlmIChcbiAgICAgICEoXG4gICAgICAgIEVYVFJBX0VMRU1FTlRfSEFORExJTkcudGFnQ2hlY2sgaW5zdGFuY2VvZiBGdW5jdGlvbiAmJlxuICAgICAgICBFWFRSQV9FTEVNRU5UX0hBTkRMSU5HLnRhZ0NoZWNrKHRhZ05hbWUpXG4gICAgICApICYmXG4gICAgICAoIUFMTE9XRURfVEFHU1t0YWdOYW1lXSB8fCBGT1JCSURfVEFHU1t0YWdOYW1lXSlcbiAgICApIHtcbiAgICAgIC8qIENoZWNrIGlmIHdlIGhhdmUgYSBjdXN0b20gZWxlbWVudCB0byBoYW5kbGUgKi9cbiAgICAgIGlmICghRk9SQklEX1RBR1NbdGFnTmFtZV0gJiYgX2lzQmFzaWNDdXN0b21FbGVtZW50KHRhZ05hbWUpKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBDVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2sgaW5zdGFuY2VvZiBSZWdFeHAgJiZcbiAgICAgICAgICByZWdFeHBUZXN0KENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVjaywgdGFnTmFtZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVjayBpbnN0YW5jZW9mIEZ1bmN0aW9uICYmXG4gICAgICAgICAgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrKHRhZ05hbWUpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvKiBLZWVwIGNvbnRlbnQgZXhjZXB0IGZvciBiYWQtbGlzdGVkIGVsZW1lbnRzICovXG4gICAgICBpZiAoS0VFUF9DT05URU5UICYmICFGT1JCSURfQ09OVEVOVFNbdGFnTmFtZV0pIHtcbiAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IGdldFBhcmVudE5vZGUoY3VycmVudE5vZGUpIHx8IGN1cnJlbnROb2RlLnBhcmVudE5vZGU7XG4gICAgICAgIGNvbnN0IGNoaWxkTm9kZXMgPSBnZXRDaGlsZE5vZGVzKGN1cnJlbnROb2RlKSB8fCBjdXJyZW50Tm9kZS5jaGlsZE5vZGVzO1xuXG4gICAgICAgIGlmIChjaGlsZE5vZGVzICYmIHBhcmVudE5vZGUpIHtcbiAgICAgICAgICBjb25zdCBjaGlsZENvdW50ID0gY2hpbGROb2Rlcy5sZW5ndGg7XG5cbiAgICAgICAgICBmb3IgKGxldCBpID0gY2hpbGRDb3VudCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgICAgICBjb25zdCBjaGlsZENsb25lID0gY2xvbmVOb2RlKGNoaWxkTm9kZXNbaV0sIHRydWUpO1xuICAgICAgICAgICAgY2hpbGRDbG9uZS5fX3JlbW92YWxDb3VudCA9IChjdXJyZW50Tm9kZS5fX3JlbW92YWxDb3VudCB8fCAwKSArIDE7XG4gICAgICAgICAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShjaGlsZENsb25lLCBnZXROZXh0U2libGluZyhjdXJyZW50Tm9kZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBfZm9yY2VSZW1vdmUoY3VycmVudE5vZGUpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyogQ2hlY2sgd2hldGhlciBlbGVtZW50IGhhcyBhIHZhbGlkIG5hbWVzcGFjZSAqL1xuICAgIGlmIChjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgIV9jaGVja1ZhbGlkTmFtZXNwYWNlKGN1cnJlbnROb2RlKSkge1xuICAgICAgX2ZvcmNlUmVtb3ZlKGN1cnJlbnROb2RlKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qIE1ha2Ugc3VyZSB0aGF0IG9sZGVyIGJyb3dzZXJzIGRvbid0IGdldCBmYWxsYmFjay10YWcgbVhTUyAqL1xuICAgIGlmIChcbiAgICAgICh0YWdOYW1lID09PSAnbm9zY3JpcHQnIHx8XG4gICAgICAgIHRhZ05hbWUgPT09ICdub2VtYmVkJyB8fFxuICAgICAgICB0YWdOYW1lID09PSAnbm9mcmFtZXMnKSAmJlxuICAgICAgcmVnRXhwVGVzdCgvPFxcL25vKHNjcmlwdHxlbWJlZHxmcmFtZXMpL2ksIGN1cnJlbnROb2RlLmlubmVySFRNTClcbiAgICApIHtcbiAgICAgIF9mb3JjZVJlbW92ZShjdXJyZW50Tm9kZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKiBTYW5pdGl6ZSBlbGVtZW50IGNvbnRlbnQgdG8gYmUgdGVtcGxhdGUtc2FmZSAqL1xuICAgIGlmIChTQUZFX0ZPUl9URU1QTEFURVMgJiYgY3VycmVudE5vZGUubm9kZVR5cGUgPT09IE5PREVfVFlQRS50ZXh0KSB7XG4gICAgICAvKiBHZXQgdGhlIGVsZW1lbnQncyB0ZXh0IGNvbnRlbnQgKi9cbiAgICAgIGNvbnRlbnQgPSBjdXJyZW50Tm9kZS50ZXh0Q29udGVudDtcblxuICAgICAgYXJyYXlGb3JFYWNoKFtNVVNUQUNIRV9FWFBSLCBFUkJfRVhQUiwgVE1QTElUX0VYUFJdLCAoZXhwcjogUmVnRXhwKSA9PiB7XG4gICAgICAgIGNvbnRlbnQgPSBzdHJpbmdSZXBsYWNlKGNvbnRlbnQsIGV4cHIsICcgJyk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKGN1cnJlbnROb2RlLnRleHRDb250ZW50ICE9PSBjb250ZW50KSB7XG4gICAgICAgIGFycmF5UHVzaChET01QdXJpZnkucmVtb3ZlZCwgeyBlbGVtZW50OiBjdXJyZW50Tm9kZS5jbG9uZU5vZGUoKSB9KTtcbiAgICAgICAgY3VycmVudE5vZGUudGV4dENvbnRlbnQgPSBjb250ZW50O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qIEV4ZWN1dGUgYSBob29rIGlmIHByZXNlbnQgKi9cbiAgICBfZXhlY3V0ZUhvb2tzKGhvb2tzLmFmdGVyU2FuaXRpemVFbGVtZW50cywgY3VycmVudE5vZGUsIG51bGwpO1xuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBfaXNWYWxpZEF0dHJpYnV0ZVxuICAgKlxuICAgKiBAcGFyYW0gbGNUYWcgTG93ZXJjYXNlIHRhZyBuYW1lIG9mIGNvbnRhaW5pbmcgZWxlbWVudC5cbiAgICogQHBhcmFtIGxjTmFtZSBMb3dlcmNhc2UgYXR0cmlidXRlIG5hbWUuXG4gICAqIEBwYXJhbSB2YWx1ZSBBdHRyaWJ1dGUgdmFsdWUuXG4gICAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmIGB2YWx1ZWAgaXMgdmFsaWQsIG90aGVyd2lzZSBmYWxzZS5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG4gIGNvbnN0IF9pc1ZhbGlkQXR0cmlidXRlID0gZnVuY3Rpb24gKFxuICAgIGxjVGFnOiBzdHJpbmcsXG4gICAgbGNOYW1lOiBzdHJpbmcsXG4gICAgdmFsdWU6IHN0cmluZ1xuICApOiBib29sZWFuIHtcbiAgICAvKiBGT1JCSURfQVRUUiBtdXN0IGFsd2F5cyB3aW4sIGV2ZW4gaWYgQUREX0FUVFIgcHJlZGljYXRlIHdvdWxkIGFsbG93IGl0ICovXG4gICAgaWYgKEZPUkJJRF9BVFRSW2xjTmFtZV0pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKiBNYWtlIHN1cmUgYXR0cmlidXRlIGNhbm5vdCBjbG9iYmVyICovXG4gICAgaWYgKFxuICAgICAgU0FOSVRJWkVfRE9NICYmXG4gICAgICAobGNOYW1lID09PSAnaWQnIHx8IGxjTmFtZSA9PT0gJ25hbWUnKSAmJlxuICAgICAgKHZhbHVlIGluIGRvY3VtZW50IHx8IHZhbHVlIGluIGZvcm1FbGVtZW50KVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qIEFsbG93IHZhbGlkIGRhdGEtKiBhdHRyaWJ1dGVzOiBBdCBsZWFzdCBvbmUgY2hhcmFjdGVyIGFmdGVyIFwiLVwiXG4gICAgICAgIChodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9kb20uaHRtbCNlbWJlZGRpbmctY3VzdG9tLW5vbi12aXNpYmxlLWRhdGEtd2l0aC10aGUtZGF0YS0qLWF0dHJpYnV0ZXMpXG4gICAgICAgIFhNTC1jb21wYXRpYmxlIChodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9pbmZyYXN0cnVjdHVyZS5odG1sI3htbC1jb21wYXRpYmxlIGFuZCBodHRwOi8vd3d3LnczLm9yZy9UUi94bWwvI2QwZTgwNClcbiAgICAgICAgV2UgZG9uJ3QgbmVlZCB0byBjaGVjayB0aGUgdmFsdWU7IGl0J3MgYWx3YXlzIFVSSSBzYWZlLiAqL1xuICAgIGlmIChcbiAgICAgIEFMTE9XX0RBVEFfQVRUUiAmJlxuICAgICAgIUZPUkJJRF9BVFRSW2xjTmFtZV0gJiZcbiAgICAgIHJlZ0V4cFRlc3QoREFUQV9BVFRSLCBsY05hbWUpXG4gICAgKSB7XG4gICAgICAvLyBUaGlzIGF0dHJpYnV0ZSBpcyBzYWZlXG4gICAgfSBlbHNlIGlmIChBTExPV19BUklBX0FUVFIgJiYgcmVnRXhwVGVzdChBUklBX0FUVFIsIGxjTmFtZSkpIHtcbiAgICAgIC8vIFRoaXMgYXR0cmlidXRlIGlzIHNhZmVcbiAgICAgIC8qIENoZWNrIGlmIEFERF9BVFRSIGZ1bmN0aW9uIGFsbG93cyB0aGlzIGF0dHJpYnV0ZSAqL1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBFWFRSQV9FTEVNRU5UX0hBTkRMSU5HLmF0dHJpYnV0ZUNoZWNrIGluc3RhbmNlb2YgRnVuY3Rpb24gJiZcbiAgICAgIEVYVFJBX0VMRU1FTlRfSEFORExJTkcuYXR0cmlidXRlQ2hlY2sobGNOYW1lLCBsY1RhZylcbiAgICApIHtcbiAgICAgIC8vIFRoaXMgYXR0cmlidXRlIGlzIHNhZmVcbiAgICAgIC8qIE90aGVyd2lzZSwgY2hlY2sgdGhlIG5hbWUgaXMgcGVybWl0dGVkICovXG4gICAgfSBlbHNlIGlmICghQUxMT1dFRF9BVFRSW2xjTmFtZV0gfHwgRk9SQklEX0FUVFJbbGNOYW1lXSkge1xuICAgICAgaWYgKFxuICAgICAgICAvLyBGaXJzdCBjb25kaXRpb24gZG9lcyBhIHZlcnkgYmFzaWMgY2hlY2sgaWYgYSkgaXQncyBiYXNpY2FsbHkgYSB2YWxpZCBjdXN0b20gZWxlbWVudCB0YWduYW1lIEFORFxuICAgICAgICAvLyBiKSBpZiB0aGUgdGFnTmFtZSBwYXNzZXMgd2hhdGV2ZXIgdGhlIHVzZXIgaGFzIGNvbmZpZ3VyZWQgZm9yIENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVja1xuICAgICAgICAvLyBhbmQgYykgaWYgdGhlIGF0dHJpYnV0ZSBuYW1lIHBhc3NlcyB3aGF0ZXZlciB0aGUgdXNlciBoYXMgY29uZmlndXJlZCBmb3IgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcuYXR0cmlidXRlTmFtZUNoZWNrXG4gICAgICAgIChfaXNCYXNpY0N1c3RvbUVsZW1lbnQobGNUYWcpICYmXG4gICAgICAgICAgKChDVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2sgaW5zdGFuY2VvZiBSZWdFeHAgJiZcbiAgICAgICAgICAgIHJlZ0V4cFRlc3QoQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrLCBsY1RhZykpIHx8XG4gICAgICAgICAgICAoQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrIGluc3RhbmNlb2YgRnVuY3Rpb24gJiZcbiAgICAgICAgICAgICAgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrKGxjVGFnKSkpICYmXG4gICAgICAgICAgKChDVVNUT01fRUxFTUVOVF9IQU5ETElORy5hdHRyaWJ1dGVOYW1lQ2hlY2sgaW5zdGFuY2VvZiBSZWdFeHAgJiZcbiAgICAgICAgICAgIHJlZ0V4cFRlc3QoQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcuYXR0cmlidXRlTmFtZUNoZWNrLCBsY05hbWUpKSB8fFxuICAgICAgICAgICAgKENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLmF0dHJpYnV0ZU5hbWVDaGVjayBpbnN0YW5jZW9mIEZ1bmN0aW9uICYmXG4gICAgICAgICAgICAgIENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLmF0dHJpYnV0ZU5hbWVDaGVjayhsY05hbWUsIGxjVGFnKSkpKSB8fFxuICAgICAgICAvLyBBbHRlcm5hdGl2ZSwgc2Vjb25kIGNvbmRpdGlvbiBjaGVja3MgaWYgaXQncyBhbiBgaXNgLWF0dHJpYnV0ZSwgQU5EXG4gICAgICAgIC8vIHRoZSB2YWx1ZSBwYXNzZXMgd2hhdGV2ZXIgdGhlIHVzZXIgaGFzIGNvbmZpZ3VyZWQgZm9yIENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVja1xuICAgICAgICAobGNOYW1lID09PSAnaXMnICYmXG4gICAgICAgICAgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcuYWxsb3dDdXN0b21pemVkQnVpbHRJbkVsZW1lbnRzICYmXG4gICAgICAgICAgKChDVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2sgaW5zdGFuY2VvZiBSZWdFeHAgJiZcbiAgICAgICAgICAgIHJlZ0V4cFRlc3QoQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrLCB2YWx1ZSkpIHx8XG4gICAgICAgICAgICAoQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrIGluc3RhbmNlb2YgRnVuY3Rpb24gJiZcbiAgICAgICAgICAgICAgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrKHZhbHVlKSkpKVxuICAgICAgKSB7XG4gICAgICAgIC8vIElmIHVzZXIgaGFzIHN1cHBsaWVkIGEgcmVnZXhwIG9yIGZ1bmN0aW9uIGluIENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVjaywgd2UgbmVlZCB0byBhbHNvIGFsbG93IGRlcml2ZWQgY3VzdG9tIGVsZW1lbnRzIHVzaW5nIHRoZSBzYW1lIHRhZ05hbWUgdGVzdC5cbiAgICAgICAgLy8gQWRkaXRpb25hbGx5LCB3ZSBuZWVkIHRvIGFsbG93IGF0dHJpYnV0ZXMgcGFzc2luZyB0aGUgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcuYXR0cmlidXRlTmFtZUNoZWNrIHVzZXIgaGFzIGNvbmZpZ3VyZWQsIGFzIGN1c3RvbSBlbGVtZW50cyBjYW4gZGVmaW5lIHRoZXNlIGF0IHRoZWlyIG93biBkaXNjcmV0aW9uLlxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgLyogQ2hlY2sgdmFsdWUgaXMgc2FmZS4gRmlyc3QsIGlzIGF0dHIgaW5lcnQ/IElmIHNvLCBpcyBzYWZlICovXG4gICAgfSBlbHNlIGlmIChVUklfU0FGRV9BVFRSSUJVVEVTW2xjTmFtZV0pIHtcbiAgICAgIC8vIFRoaXMgYXR0cmlidXRlIGlzIHNhZmVcbiAgICAgIC8qIENoZWNrIG5vIHNjcmlwdCwgZGF0YSBvciB1bmtub3duIHBvc3NpYmx5IHVuc2FmZSBVUklcbiAgICAgICAgdW5sZXNzIHdlIGtub3cgVVJJIHZhbHVlcyBhcmUgc2FmZSBmb3IgdGhhdCBhdHRyaWJ1dGUgKi9cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgcmVnRXhwVGVzdChJU19BTExPV0VEX1VSSSwgc3RyaW5nUmVwbGFjZSh2YWx1ZSwgQVRUUl9XSElURVNQQUNFLCAnJykpXG4gICAgKSB7XG4gICAgICAvLyBUaGlzIGF0dHJpYnV0ZSBpcyBzYWZlXG4gICAgICAvKiBLZWVwIGltYWdlIGRhdGEgVVJJcyBhbGl2ZSBpZiBzcmMveGxpbms6aHJlZiBpcyBhbGxvd2VkICovXG4gICAgICAvKiBGdXJ0aGVyIHByZXZlbnQgZ2FkZ2V0IFhTUyBmb3IgZHluYW1pY2FsbHkgYnVpbHQgc2NyaXB0IHRhZ3MgKi9cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgKGxjTmFtZSA9PT0gJ3NyYycgfHwgbGNOYW1lID09PSAneGxpbms6aHJlZicgfHwgbGNOYW1lID09PSAnaHJlZicpICYmXG4gICAgICBsY1RhZyAhPT0gJ3NjcmlwdCcgJiZcbiAgICAgIHN0cmluZ0luZGV4T2YodmFsdWUsICdkYXRhOicpID09PSAwICYmXG4gICAgICBEQVRBX1VSSV9UQUdTW2xjVGFnXVxuICAgICkge1xuICAgICAgLy8gVGhpcyBhdHRyaWJ1dGUgaXMgc2FmZVxuICAgICAgLyogQWxsb3cgdW5rbm93biBwcm90b2NvbHM6IFRoaXMgcHJvdmlkZXMgc3VwcG9ydCBmb3IgbGlua3MgdGhhdFxuICAgICAgICBhcmUgaGFuZGxlZCBieSBwcm90b2NvbCBoYW5kbGVycyB3aGljaCBtYXkgYmUgdW5rbm93biBhaGVhZCBvZlxuICAgICAgICB0aW1lLCBlLmcuIGZiOiwgc3BvdGlmeTogKi9cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgQUxMT1dfVU5LTk9XTl9QUk9UT0NPTFMgJiZcbiAgICAgICFyZWdFeHBUZXN0KElTX1NDUklQVF9PUl9EQVRBLCBzdHJpbmdSZXBsYWNlKHZhbHVlLCBBVFRSX1dISVRFU1BBQ0UsICcnKSlcbiAgICApIHtcbiAgICAgIC8vIFRoaXMgYXR0cmlidXRlIGlzIHNhZmVcbiAgICAgIC8qIENoZWNrIGZvciBiaW5hcnkgYXR0cmlidXRlcyAqL1xuICAgIH0gZWxzZSBpZiAodmFsdWUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQmluYXJ5IGF0dHJpYnV0ZXMgYXJlIHNhZmUgYXQgdGhpcyBwb2ludFxuICAgICAgLyogQW55dGhpbmcgZWxzZSwgcHJlc3VtZSB1bnNhZmUsIGRvIG5vdCBhZGQgaXQgYmFjayAqL1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBfaXNCYXNpY0N1c3RvbUVsZW1lbnRcbiAgICogY2hlY2tzIGlmIGF0IGxlYXN0IG9uZSBkYXNoIGlzIGluY2x1ZGVkIGluIHRhZ05hbWUsIGFuZCBpdCdzIG5vdCB0aGUgZmlyc3QgY2hhclxuICAgKiBmb3IgbW9yZSBzb3BoaXN0aWNhdGVkIGNoZWNraW5nIHNlZSBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL3ZhbGlkYXRlLWVsZW1lbnQtbmFtZVxuICAgKlxuICAgKiBAcGFyYW0gdGFnTmFtZSBuYW1lIG9mIHRoZSB0YWcgb2YgdGhlIG5vZGUgdG8gc2FuaXRpemVcbiAgICogQHJldHVybnMgUmV0dXJucyB0cnVlIGlmIHRoZSB0YWcgbmFtZSBtZWV0cyB0aGUgYmFzaWMgY3JpdGVyaWEgZm9yIGEgY3VzdG9tIGVsZW1lbnQsIG90aGVyd2lzZSBmYWxzZS5cbiAgICovXG4gIGNvbnN0IF9pc0Jhc2ljQ3VzdG9tRWxlbWVudCA9IGZ1bmN0aW9uICh0YWdOYW1lOiBzdHJpbmcpOiBSZWdFeHBNYXRjaEFycmF5IHtcbiAgICByZXR1cm4gdGFnTmFtZSAhPT0gJ2Fubm90YXRpb24teG1sJyAmJiBzdHJpbmdNYXRjaCh0YWdOYW1lLCBDVVNUT01fRUxFTUVOVCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIF9zYW5pdGl6ZUF0dHJpYnV0ZXNcbiAgICpcbiAgICogQHByb3RlY3QgYXR0cmlidXRlc1xuICAgKiBAcHJvdGVjdCBub2RlTmFtZVxuICAgKiBAcHJvdGVjdCByZW1vdmVBdHRyaWJ1dGVcbiAgICogQHByb3RlY3Qgc2V0QXR0cmlidXRlXG4gICAqXG4gICAqIEBwYXJhbSBjdXJyZW50Tm9kZSB0byBzYW5pdGl6ZVxuICAgKi9cbiAgY29uc3QgX3Nhbml0aXplQXR0cmlidXRlcyA9IGZ1bmN0aW9uIChjdXJyZW50Tm9kZTogRWxlbWVudCk6IHZvaWQge1xuICAgIC8qIEV4ZWN1dGUgYSBob29rIGlmIHByZXNlbnQgKi9cbiAgICBfZXhlY3V0ZUhvb2tzKGhvb2tzLmJlZm9yZVNhbml0aXplQXR0cmlidXRlcywgY3VycmVudE5vZGUsIG51bGwpO1xuXG4gICAgY29uc3QgeyBhdHRyaWJ1dGVzIH0gPSBjdXJyZW50Tm9kZTtcblxuICAgIC8qIENoZWNrIGlmIHdlIGhhdmUgYXR0cmlidXRlczsgaWYgbm90IHdlIG1pZ2h0IGhhdmUgYSB0ZXh0IG5vZGUgKi9cbiAgICBpZiAoIWF0dHJpYnV0ZXMgfHwgX2lzQ2xvYmJlcmVkKGN1cnJlbnROb2RlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGhvb2tFdmVudCA9IHtcbiAgICAgIGF0dHJOYW1lOiAnJyxcbiAgICAgIGF0dHJWYWx1ZTogJycsXG4gICAgICBrZWVwQXR0cjogdHJ1ZSxcbiAgICAgIGFsbG93ZWRBdHRyaWJ1dGVzOiBBTExPV0VEX0FUVFIsXG4gICAgICBmb3JjZUtlZXBBdHRyOiB1bmRlZmluZWQsXG4gICAgfTtcbiAgICBsZXQgbCA9IGF0dHJpYnV0ZXMubGVuZ3RoO1xuXG4gICAgLyogR28gYmFja3dhcmRzIG92ZXIgYWxsIGF0dHJpYnV0ZXM7IHNhZmVseSByZW1vdmUgYmFkIG9uZXMgKi9cbiAgICB3aGlsZSAobC0tKSB7XG4gICAgICBjb25zdCBhdHRyID0gYXR0cmlidXRlc1tsXTtcbiAgICAgIGNvbnN0IHsgbmFtZSwgbmFtZXNwYWNlVVJJLCB2YWx1ZTogYXR0clZhbHVlIH0gPSBhdHRyO1xuICAgICAgY29uc3QgbGNOYW1lID0gdHJhbnNmb3JtQ2FzZUZ1bmMobmFtZSk7XG5cbiAgICAgIGNvbnN0IGluaXRWYWx1ZSA9IGF0dHJWYWx1ZTtcbiAgICAgIGxldCB2YWx1ZSA9IG5hbWUgPT09ICd2YWx1ZScgPyBpbml0VmFsdWUgOiBzdHJpbmdUcmltKGluaXRWYWx1ZSk7XG5cbiAgICAgIC8qIEV4ZWN1dGUgYSBob29rIGlmIHByZXNlbnQgKi9cbiAgICAgIGhvb2tFdmVudC5hdHRyTmFtZSA9IGxjTmFtZTtcbiAgICAgIGhvb2tFdmVudC5hdHRyVmFsdWUgPSB2YWx1ZTtcbiAgICAgIGhvb2tFdmVudC5rZWVwQXR0ciA9IHRydWU7XG4gICAgICBob29rRXZlbnQuZm9yY2VLZWVwQXR0ciA9IHVuZGVmaW5lZDsgLy8gQWxsb3dzIGRldmVsb3BlcnMgdG8gc2VlIHRoaXMgaXMgYSBwcm9wZXJ0eSB0aGV5IGNhbiBzZXRcbiAgICAgIF9leGVjdXRlSG9va3MoaG9va3MudXBvblNhbml0aXplQXR0cmlidXRlLCBjdXJyZW50Tm9kZSwgaG9va0V2ZW50KTtcbiAgICAgIHZhbHVlID0gaG9va0V2ZW50LmF0dHJWYWx1ZTtcblxuICAgICAgLyogRnVsbCBET00gQ2xvYmJlcmluZyBwcm90ZWN0aW9uIHZpYSBuYW1lc3BhY2UgaXNvbGF0aW9uLFxuICAgICAgICogUHJlZml4IGlkIGFuZCBuYW1lIGF0dHJpYnV0ZXMgd2l0aCBgdXNlci1jb250ZW50LWBcbiAgICAgICAqL1xuICAgICAgaWYgKFNBTklUSVpFX05BTUVEX1BST1BTICYmIChsY05hbWUgPT09ICdpZCcgfHwgbGNOYW1lID09PSAnbmFtZScpKSB7XG4gICAgICAgIC8vIFJlbW92ZSB0aGUgYXR0cmlidXRlIHdpdGggdGhpcyB2YWx1ZVxuICAgICAgICBfcmVtb3ZlQXR0cmlidXRlKG5hbWUsIGN1cnJlbnROb2RlKTtcblxuICAgICAgICAvLyBQcmVmaXggdGhlIHZhbHVlIGFuZCBsYXRlciByZS1jcmVhdGUgdGhlIGF0dHJpYnV0ZSB3aXRoIHRoZSBzYW5pdGl6ZWQgdmFsdWVcbiAgICAgICAgdmFsdWUgPSBTQU5JVElaRV9OQU1FRF9QUk9QU19QUkVGSVggKyB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgLyogV29yayBhcm91bmQgYSBzZWN1cml0eSBpc3N1ZSB3aXRoIGNvbW1lbnRzIGluc2lkZSBhdHRyaWJ1dGVzICovXG4gICAgICBpZiAoXG4gICAgICAgIFNBRkVfRk9SX1hNTCAmJlxuICAgICAgICByZWdFeHBUZXN0KFxuICAgICAgICAgIC8oKC0tIT98XSk+KXw8XFwvKHN0eWxlfHNjcmlwdHx0aXRsZXx4bXB8dGV4dGFyZWF8bm9zY3JpcHR8aWZyYW1lfG5vZW1iZWR8bm9mcmFtZXMpL2ksXG4gICAgICAgICAgdmFsdWVcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIF9yZW1vdmVBdHRyaWJ1dGUobmFtZSwgY3VycmVudE5vZGUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLyogTWFrZSBzdXJlIHdlIGNhbm5vdCBlYXNpbHkgdXNlIGFuaW1hdGVkIGhyZWZzLCBldmVuIGlmIGFuaW1hdGlvbnMgYXJlIGFsbG93ZWQgKi9cbiAgICAgIGlmIChsY05hbWUgPT09ICdhdHRyaWJ1dGVuYW1lJyAmJiBzdHJpbmdNYXRjaCh2YWx1ZSwgJ2hyZWYnKSkge1xuICAgICAgICBfcmVtb3ZlQXR0cmlidXRlKG5hbWUsIGN1cnJlbnROb2RlKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8qIERpZCB0aGUgaG9va3MgYXBwcm92ZSBvZiB0aGUgYXR0cmlidXRlPyAqL1xuICAgICAgaWYgKGhvb2tFdmVudC5mb3JjZUtlZXBBdHRyKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvKiBEaWQgdGhlIGhvb2tzIGFwcHJvdmUgb2YgdGhlIGF0dHJpYnV0ZT8gKi9cbiAgICAgIGlmICghaG9va0V2ZW50LmtlZXBBdHRyKSB7XG4gICAgICAgIF9yZW1vdmVBdHRyaWJ1dGUobmFtZSwgY3VycmVudE5vZGUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLyogV29yayBhcm91bmQgYSBzZWN1cml0eSBpc3N1ZSBpbiBqUXVlcnkgMy4wICovXG4gICAgICBpZiAoIUFMTE9XX1NFTEZfQ0xPU0VfSU5fQVRUUiAmJiByZWdFeHBUZXN0KC9cXC8+L2ksIHZhbHVlKSkge1xuICAgICAgICBfcmVtb3ZlQXR0cmlidXRlKG5hbWUsIGN1cnJlbnROb2RlKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8qIFNhbml0aXplIGF0dHJpYnV0ZSBjb250ZW50IHRvIGJlIHRlbXBsYXRlLXNhZmUgKi9cbiAgICAgIGlmIChTQUZFX0ZPUl9URU1QTEFURVMpIHtcbiAgICAgICAgYXJyYXlGb3JFYWNoKFtNVVNUQUNIRV9FWFBSLCBFUkJfRVhQUiwgVE1QTElUX0VYUFJdLCAoZXhwcjogUmVnRXhwKSA9PiB7XG4gICAgICAgICAgdmFsdWUgPSBzdHJpbmdSZXBsYWNlKHZhbHVlLCBleHByLCAnICcpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLyogSXMgYHZhbHVlYCB2YWxpZCBmb3IgdGhpcyBhdHRyaWJ1dGU/ICovXG4gICAgICBjb25zdCBsY1RhZyA9IHRyYW5zZm9ybUNhc2VGdW5jKGN1cnJlbnROb2RlLm5vZGVOYW1lKTtcbiAgICAgIGlmICghX2lzVmFsaWRBdHRyaWJ1dGUobGNUYWcsIGxjTmFtZSwgdmFsdWUpKSB7XG4gICAgICAgIF9yZW1vdmVBdHRyaWJ1dGUobmFtZSwgY3VycmVudE5vZGUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLyogSGFuZGxlIGF0dHJpYnV0ZXMgdGhhdCByZXF1aXJlIFRydXN0ZWQgVHlwZXMgKi9cbiAgICAgIGlmIChcbiAgICAgICAgdHJ1c3RlZFR5cGVzUG9saWN5ICYmXG4gICAgICAgIHR5cGVvZiB0cnVzdGVkVHlwZXMgPT09ICdvYmplY3QnICYmXG4gICAgICAgIHR5cGVvZiB0cnVzdGVkVHlwZXMuZ2V0QXR0cmlidXRlVHlwZSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgKSB7XG4gICAgICAgIGlmIChuYW1lc3BhY2VVUkkpIHtcbiAgICAgICAgICAvKiBOYW1lc3BhY2VzIGFyZSBub3QgeWV0IHN1cHBvcnRlZCwgc2VlIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTEzMDUyOTMgKi9cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzd2l0Y2ggKHRydXN0ZWRUeXBlcy5nZXRBdHRyaWJ1dGVUeXBlKGxjVGFnLCBsY05hbWUpKSB7XG4gICAgICAgICAgICBjYXNlICdUcnVzdGVkSFRNTCc6IHtcbiAgICAgICAgICAgICAgdmFsdWUgPSB0cnVzdGVkVHlwZXNQb2xpY3kuY3JlYXRlSFRNTCh2YWx1ZSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlICdUcnVzdGVkU2NyaXB0VVJMJzoge1xuICAgICAgICAgICAgICB2YWx1ZSA9IHRydXN0ZWRUeXBlc1BvbGljeS5jcmVhdGVTY3JpcHRVUkwodmFsdWUpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLyogSGFuZGxlIGludmFsaWQgZGF0YS0qIGF0dHJpYnV0ZSBzZXQgYnkgdHJ5LWNhdGNoaW5nIGl0ICovXG4gICAgICBpZiAodmFsdWUgIT09IGluaXRWYWx1ZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkpIHtcbiAgICAgICAgICAgIGN1cnJlbnROb2RlLnNldEF0dHJpYnV0ZU5TKG5hbWVzcGFjZVVSSSwgbmFtZSwgdmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvKiBGYWxsYmFjayB0byBzZXRBdHRyaWJ1dGUoKSBmb3IgYnJvd3Nlci11bnJlY29nbml6ZWQgbmFtZXNwYWNlcyBlLmcuIFwieC1zY2hlbWFcIi4gKi9cbiAgICAgICAgICAgIGN1cnJlbnROb2RlLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKF9pc0Nsb2JiZXJlZChjdXJyZW50Tm9kZSkpIHtcbiAgICAgICAgICAgIF9mb3JjZVJlbW92ZShjdXJyZW50Tm9kZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFycmF5UG9wKERPTVB1cmlmeS5yZW1vdmVkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgICBfcmVtb3ZlQXR0cmlidXRlKG5hbWUsIGN1cnJlbnROb2RlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qIEV4ZWN1dGUgYSBob29rIGlmIHByZXNlbnQgKi9cbiAgICBfZXhlY3V0ZUhvb2tzKGhvb2tzLmFmdGVyU2FuaXRpemVBdHRyaWJ1dGVzLCBjdXJyZW50Tm9kZSwgbnVsbCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIF9zYW5pdGl6ZVNoYWRvd0RPTVxuICAgKlxuICAgKiBAcGFyYW0gZnJhZ21lbnQgdG8gaXRlcmF0ZSBvdmVyIHJlY3Vyc2l2ZWx5XG4gICAqL1xuICBjb25zdCBfc2FuaXRpemVTaGFkb3dET00gPSBmdW5jdGlvbiAoZnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQpOiB2b2lkIHtcbiAgICBsZXQgc2hhZG93Tm9kZSA9IG51bGw7XG4gICAgY29uc3Qgc2hhZG93SXRlcmF0b3IgPSBfY3JlYXRlTm9kZUl0ZXJhdG9yKGZyYWdtZW50KTtcblxuICAgIC8qIEV4ZWN1dGUgYSBob29rIGlmIHByZXNlbnQgKi9cbiAgICBfZXhlY3V0ZUhvb2tzKGhvb2tzLmJlZm9yZVNhbml0aXplU2hhZG93RE9NLCBmcmFnbWVudCwgbnVsbCk7XG5cbiAgICB3aGlsZSAoKHNoYWRvd05vZGUgPSBzaGFkb3dJdGVyYXRvci5uZXh0Tm9kZSgpKSkge1xuICAgICAgLyogRXhlY3V0ZSBhIGhvb2sgaWYgcHJlc2VudCAqL1xuICAgICAgX2V4ZWN1dGVIb29rcyhob29rcy51cG9uU2FuaXRpemVTaGFkb3dOb2RlLCBzaGFkb3dOb2RlLCBudWxsKTtcblxuICAgICAgLyogU2FuaXRpemUgdGFncyBhbmQgZWxlbWVudHMgKi9cbiAgICAgIF9zYW5pdGl6ZUVsZW1lbnRzKHNoYWRvd05vZGUpO1xuXG4gICAgICAvKiBDaGVjayBhdHRyaWJ1dGVzIG5leHQgKi9cbiAgICAgIF9zYW5pdGl6ZUF0dHJpYnV0ZXMoc2hhZG93Tm9kZSk7XG5cbiAgICAgIC8qIERlZXAgc2hhZG93IERPTSBkZXRlY3RlZCAqL1xuICAgICAgaWYgKHNoYWRvd05vZGUuY29udGVudCBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpIHtcbiAgICAgICAgX3Nhbml0aXplU2hhZG93RE9NKHNoYWRvd05vZGUuY29udGVudCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogRXhlY3V0ZSBhIGhvb2sgaWYgcHJlc2VudCAqL1xuICAgIF9leGVjdXRlSG9va3MoaG9va3MuYWZ0ZXJTYW5pdGl6ZVNoYWRvd0RPTSwgZnJhZ21lbnQsIG51bGwpO1xuICB9O1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG4gIERPTVB1cmlmeS5zYW5pdGl6ZSA9IGZ1bmN0aW9uIChkaXJ0eSwgY2ZnID0ge30pIHtcbiAgICBsZXQgYm9keSA9IG51bGw7XG4gICAgbGV0IGltcG9ydGVkTm9kZSA9IG51bGw7XG4gICAgbGV0IGN1cnJlbnROb2RlID0gbnVsbDtcbiAgICBsZXQgcmV0dXJuTm9kZSA9IG51bGw7XG4gICAgLyogTWFrZSBzdXJlIHdlIGhhdmUgYSBzdHJpbmcgdG8gc2FuaXRpemUuXG4gICAgICBETyBOT1QgcmV0dXJuIGVhcmx5LCBhcyB0aGlzIHdpbGwgcmV0dXJuIHRoZSB3cm9uZyB0eXBlIGlmXG4gICAgICB0aGUgdXNlciBoYXMgcmVxdWVzdGVkIGEgRE9NIG9iamVjdCByYXRoZXIgdGhhbiBhIHN0cmluZyAqL1xuICAgIElTX0VNUFRZX0lOUFVUID0gIWRpcnR5O1xuICAgIGlmIChJU19FTVBUWV9JTlBVVCkge1xuICAgICAgZGlydHkgPSAnPCEtLT4nO1xuICAgIH1cblxuICAgIC8qIFN0cmluZ2lmeSwgaW4gY2FzZSBkaXJ0eSBpcyBhbiBvYmplY3QgKi9cbiAgICBpZiAodHlwZW9mIGRpcnR5ICE9PSAnc3RyaW5nJyAmJiAhX2lzTm9kZShkaXJ0eSkpIHtcbiAgICAgIGlmICh0eXBlb2YgZGlydHkudG9TdHJpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZGlydHkgPSBkaXJ0eS50b1N0cmluZygpO1xuICAgICAgICBpZiAodHlwZW9mIGRpcnR5ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IHR5cGVFcnJvckNyZWF0ZSgnZGlydHkgaXMgbm90IGEgc3RyaW5nLCBhYm9ydGluZycpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyB0eXBlRXJyb3JDcmVhdGUoJ3RvU3RyaW5nIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogUmV0dXJuIGRpcnR5IEhUTUwgaWYgRE9NUHVyaWZ5IGNhbm5vdCBydW4gKi9cbiAgICBpZiAoIURPTVB1cmlmeS5pc1N1cHBvcnRlZCkge1xuICAgICAgcmV0dXJuIGRpcnR5O1xuICAgIH1cblxuICAgIC8qIEFzc2lnbiBjb25maWcgdmFycyAqL1xuICAgIGlmICghU0VUX0NPTkZJRykge1xuICAgICAgX3BhcnNlQ29uZmlnKGNmZyk7XG4gICAgfVxuXG4gICAgLyogQ2xlYW4gdXAgcmVtb3ZlZCBlbGVtZW50cyAqL1xuICAgIERPTVB1cmlmeS5yZW1vdmVkID0gW107XG5cbiAgICAvKiBDaGVjayBpZiBkaXJ0eSBpcyBjb3JyZWN0bHkgdHlwZWQgZm9yIElOX1BMQUNFICovXG4gICAgaWYgKHR5cGVvZiBkaXJ0eSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIElOX1BMQUNFID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKElOX1BMQUNFKSB7XG4gICAgICAvKiBEbyBzb21lIGVhcmx5IHByZS1zYW5pdGl6YXRpb24gdG8gYXZvaWQgdW5zYWZlIHJvb3Qgbm9kZXMgKi9cbiAgICAgIGlmICgoZGlydHkgYXMgTm9kZSkubm9kZU5hbWUpIHtcbiAgICAgICAgY29uc3QgdGFnTmFtZSA9IHRyYW5zZm9ybUNhc2VGdW5jKChkaXJ0eSBhcyBOb2RlKS5ub2RlTmFtZSk7XG4gICAgICAgIGlmICghQUxMT1dFRF9UQUdTW3RhZ05hbWVdIHx8IEZPUkJJRF9UQUdTW3RhZ05hbWVdKSB7XG4gICAgICAgICAgdGhyb3cgdHlwZUVycm9yQ3JlYXRlKFxuICAgICAgICAgICAgJ3Jvb3Qgbm9kZSBpcyBmb3JiaWRkZW4gYW5kIGNhbm5vdCBiZSBzYW5pdGl6ZWQgaW4tcGxhY2UnXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZGlydHkgaW5zdGFuY2VvZiBOb2RlKSB7XG4gICAgICAvKiBJZiBkaXJ0eSBpcyBhIERPTSBlbGVtZW50LCBhcHBlbmQgdG8gYW4gZW1wdHkgZG9jdW1lbnQgdG8gYXZvaWRcbiAgICAgICAgIGVsZW1lbnRzIGJlaW5nIHN0cmlwcGVkIGJ5IHRoZSBwYXJzZXIgKi9cbiAgICAgIGJvZHkgPSBfaW5pdERvY3VtZW50KCc8IS0tLS0+Jyk7XG4gICAgICBpbXBvcnRlZE5vZGUgPSBib2R5Lm93bmVyRG9jdW1lbnQuaW1wb3J0Tm9kZShkaXJ0eSwgdHJ1ZSk7XG4gICAgICBpZiAoXG4gICAgICAgIGltcG9ydGVkTm9kZS5ub2RlVHlwZSA9PT0gTk9ERV9UWVBFLmVsZW1lbnQgJiZcbiAgICAgICAgaW1wb3J0ZWROb2RlLm5vZGVOYW1lID09PSAnQk9EWSdcbiAgICAgICkge1xuICAgICAgICAvKiBOb2RlIGlzIGFscmVhZHkgYSBib2R5LCB1c2UgYXMgaXMgKi9cbiAgICAgICAgYm9keSA9IGltcG9ydGVkTm9kZTtcbiAgICAgIH0gZWxzZSBpZiAoaW1wb3J0ZWROb2RlLm5vZGVOYW1lID09PSAnSFRNTCcpIHtcbiAgICAgICAgYm9keSA9IGltcG9ydGVkTm9kZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL3ByZWZlci1kb20tbm9kZS1hcHBlbmRcbiAgICAgICAgYm9keS5hcHBlbmRDaGlsZChpbXBvcnRlZE5vZGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvKiBFeGl0IGRpcmVjdGx5IGlmIHdlIGhhdmUgbm90aGluZyB0byBkbyAqL1xuICAgICAgaWYgKFxuICAgICAgICAhUkVUVVJOX0RPTSAmJlxuICAgICAgICAhU0FGRV9GT1JfVEVNUExBVEVTICYmXG4gICAgICAgICFXSE9MRV9ET0NVTUVOVCAmJlxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9wcmVmZXItaW5jbHVkZXNcbiAgICAgICAgZGlydHkuaW5kZXhPZignPCcpID09PSAtMVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0cnVzdGVkVHlwZXNQb2xpY3kgJiYgUkVUVVJOX1RSVVNURURfVFlQRVxuICAgICAgICAgID8gdHJ1c3RlZFR5cGVzUG9saWN5LmNyZWF0ZUhUTUwoZGlydHkpXG4gICAgICAgICAgOiBkaXJ0eTtcbiAgICAgIH1cblxuICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgZG9jdW1lbnQgdG8gd29yayBvbiAqL1xuICAgICAgYm9keSA9IF9pbml0RG9jdW1lbnQoZGlydHkpO1xuXG4gICAgICAvKiBDaGVjayB3ZSBoYXZlIGEgRE9NIG5vZGUgZnJvbSB0aGUgZGF0YSAqL1xuICAgICAgaWYgKCFib2R5KSB7XG4gICAgICAgIHJldHVybiBSRVRVUk5fRE9NID8gbnVsbCA6IFJFVFVSTl9UUlVTVEVEX1RZUEUgPyBlbXB0eUhUTUwgOiAnJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBSZW1vdmUgZmlyc3QgZWxlbWVudCBub2RlIChvdXJzKSBpZiBGT1JDRV9CT0RZIGlzIHNldCAqL1xuICAgIGlmIChib2R5ICYmIEZPUkNFX0JPRFkpIHtcbiAgICAgIF9mb3JjZVJlbW92ZShib2R5LmZpcnN0Q2hpbGQpO1xuICAgIH1cblxuICAgIC8qIEdldCBub2RlIGl0ZXJhdG9yICovXG4gICAgY29uc3Qgbm9kZUl0ZXJhdG9yID0gX2NyZWF0ZU5vZGVJdGVyYXRvcihJTl9QTEFDRSA/IGRpcnR5IDogYm9keSk7XG5cbiAgICAvKiBOb3cgc3RhcnQgaXRlcmF0aW5nIG92ZXIgdGhlIGNyZWF0ZWQgZG9jdW1lbnQgKi9cbiAgICB3aGlsZSAoKGN1cnJlbnROb2RlID0gbm9kZUl0ZXJhdG9yLm5leHROb2RlKCkpKSB7XG4gICAgICAvKiBTYW5pdGl6ZSB0YWdzIGFuZCBlbGVtZW50cyAqL1xuICAgICAgX3Nhbml0aXplRWxlbWVudHMoY3VycmVudE5vZGUpO1xuXG4gICAgICAvKiBDaGVjayBhdHRyaWJ1dGVzIG5leHQgKi9cbiAgICAgIF9zYW5pdGl6ZUF0dHJpYnV0ZXMoY3VycmVudE5vZGUpO1xuXG4gICAgICAvKiBTaGFkb3cgRE9NIGRldGVjdGVkLCBzYW5pdGl6ZSBpdCAqL1xuICAgICAgaWYgKGN1cnJlbnROb2RlLmNvbnRlbnQgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KSB7XG4gICAgICAgIF9zYW5pdGl6ZVNoYWRvd0RPTShjdXJyZW50Tm9kZS5jb250ZW50KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBJZiB3ZSBzYW5pdGl6ZWQgYGRpcnR5YCBpbi1wbGFjZSwgcmV0dXJuIGl0LiAqL1xuICAgIGlmIChJTl9QTEFDRSkge1xuICAgICAgcmV0dXJuIGRpcnR5O1xuICAgIH1cblxuICAgIC8qIFJldHVybiBzYW5pdGl6ZWQgc3RyaW5nIG9yIERPTSAqL1xuICAgIGlmIChSRVRVUk5fRE9NKSB7XG4gICAgICBpZiAoUkVUVVJOX0RPTV9GUkFHTUVOVCkge1xuICAgICAgICByZXR1cm5Ob2RlID0gY3JlYXRlRG9jdW1lbnRGcmFnbWVudC5jYWxsKGJvZHkub3duZXJEb2N1bWVudCk7XG5cbiAgICAgICAgd2hpbGUgKGJvZHkuZmlyc3RDaGlsZCkge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL3ByZWZlci1kb20tbm9kZS1hcHBlbmRcbiAgICAgICAgICByZXR1cm5Ob2RlLmFwcGVuZENoaWxkKGJvZHkuZmlyc3RDaGlsZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybk5vZGUgPSBib2R5O1xuICAgICAgfVxuXG4gICAgICBpZiAoQUxMT1dFRF9BVFRSLnNoYWRvd3Jvb3QgfHwgQUxMT1dFRF9BVFRSLnNoYWRvd3Jvb3Rtb2RlKSB7XG4gICAgICAgIC8qXG4gICAgICAgICAgQWRvcHROb2RlKCkgaXMgbm90IHVzZWQgYmVjYXVzZSBpbnRlcm5hbCBzdGF0ZSBpcyBub3QgcmVzZXRcbiAgICAgICAgICAoZS5nLiB0aGUgcGFzdCBuYW1lcyBtYXAgb2YgYSBIVE1MRm9ybUVsZW1lbnQpLCB0aGlzIGlzIHNhZmVcbiAgICAgICAgICBpbiB0aGVvcnkgYnV0IHdlIHdvdWxkIHJhdGhlciBub3QgcmlzayBhbm90aGVyIGF0dGFjayB2ZWN0b3IuXG4gICAgICAgICAgVGhlIHN0YXRlIHRoYXQgaXMgY2xvbmVkIGJ5IGltcG9ydE5vZGUoKSBpcyBleHBsaWNpdGx5IGRlZmluZWRcbiAgICAgICAgICBieSB0aGUgc3BlY3MuXG4gICAgICAgICovXG4gICAgICAgIHJldHVybk5vZGUgPSBpbXBvcnROb2RlLmNhbGwob3JpZ2luYWxEb2N1bWVudCwgcmV0dXJuTm9kZSwgdHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXR1cm5Ob2RlO1xuICAgIH1cblxuICAgIGxldCBzZXJpYWxpemVkSFRNTCA9IFdIT0xFX0RPQ1VNRU5UID8gYm9keS5vdXRlckhUTUwgOiBib2R5LmlubmVySFRNTDtcblxuICAgIC8qIFNlcmlhbGl6ZSBkb2N0eXBlIGlmIGFsbG93ZWQgKi9cbiAgICBpZiAoXG4gICAgICBXSE9MRV9ET0NVTUVOVCAmJlxuICAgICAgQUxMT1dFRF9UQUdTWychZG9jdHlwZSddICYmXG4gICAgICBib2R5Lm93bmVyRG9jdW1lbnQgJiZcbiAgICAgIGJvZHkub3duZXJEb2N1bWVudC5kb2N0eXBlICYmXG4gICAgICBib2R5Lm93bmVyRG9jdW1lbnQuZG9jdHlwZS5uYW1lICYmXG4gICAgICByZWdFeHBUZXN0KEVYUFJFU1NJT05TLkRPQ1RZUEVfTkFNRSwgYm9keS5vd25lckRvY3VtZW50LmRvY3R5cGUubmFtZSlcbiAgICApIHtcbiAgICAgIHNlcmlhbGl6ZWRIVE1MID1cbiAgICAgICAgJzwhRE9DVFlQRSAnICsgYm9keS5vd25lckRvY3VtZW50LmRvY3R5cGUubmFtZSArICc+XFxuJyArIHNlcmlhbGl6ZWRIVE1MO1xuICAgIH1cblxuICAgIC8qIFNhbml0aXplIGZpbmFsIHN0cmluZyB0ZW1wbGF0ZS1zYWZlICovXG4gICAgaWYgKFNBRkVfRk9SX1RFTVBMQVRFUykge1xuICAgICAgYXJyYXlGb3JFYWNoKFtNVVNUQUNIRV9FWFBSLCBFUkJfRVhQUiwgVE1QTElUX0VYUFJdLCAoZXhwcjogUmVnRXhwKSA9PiB7XG4gICAgICAgIHNlcmlhbGl6ZWRIVE1MID0gc3RyaW5nUmVwbGFjZShzZXJpYWxpemVkSFRNTCwgZXhwciwgJyAnKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVzdGVkVHlwZXNQb2xpY3kgJiYgUkVUVVJOX1RSVVNURURfVFlQRVxuICAgICAgPyB0cnVzdGVkVHlwZXNQb2xpY3kuY3JlYXRlSFRNTChzZXJpYWxpemVkSFRNTClcbiAgICAgIDogc2VyaWFsaXplZEhUTUw7XG4gIH07XG5cbiAgRE9NUHVyaWZ5LnNldENvbmZpZyA9IGZ1bmN0aW9uIChjZmcgPSB7fSkge1xuICAgIF9wYXJzZUNvbmZpZyhjZmcpO1xuICAgIFNFVF9DT05GSUcgPSB0cnVlO1xuICB9O1xuXG4gIERPTVB1cmlmeS5jbGVhckNvbmZpZyA9IGZ1bmN0aW9uICgpIHtcbiAgICBDT05GSUcgPSBudWxsO1xuICAgIFNFVF9DT05GSUcgPSBmYWxzZTtcbiAgfTtcblxuICBET01QdXJpZnkuaXNWYWxpZEF0dHJpYnV0ZSA9IGZ1bmN0aW9uICh0YWcsIGF0dHIsIHZhbHVlKSB7XG4gICAgLyogSW5pdGlhbGl6ZSBzaGFyZWQgY29uZmlnIHZhcnMgaWYgbmVjZXNzYXJ5LiAqL1xuICAgIGlmICghQ09ORklHKSB7XG4gICAgICBfcGFyc2VDb25maWcoe30pO1xuICAgIH1cblxuICAgIGNvbnN0IGxjVGFnID0gdHJhbnNmb3JtQ2FzZUZ1bmModGFnKTtcbiAgICBjb25zdCBsY05hbWUgPSB0cmFuc2Zvcm1DYXNlRnVuYyhhdHRyKTtcbiAgICByZXR1cm4gX2lzVmFsaWRBdHRyaWJ1dGUobGNUYWcsIGxjTmFtZSwgdmFsdWUpO1xuICB9O1xuXG4gIERPTVB1cmlmeS5hZGRIb29rID0gZnVuY3Rpb24gKFxuICAgIGVudHJ5UG9pbnQ6IGtleW9mIEhvb2tzTWFwLFxuICAgIGhvb2tGdW5jdGlvbjogSG9va0Z1bmN0aW9uXG4gICkge1xuICAgIGlmICh0eXBlb2YgaG9va0Z1bmN0aW9uICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXJyYXlQdXNoKGhvb2tzW2VudHJ5UG9pbnRdLCBob29rRnVuY3Rpb24pO1xuICB9O1xuXG4gIERPTVB1cmlmeS5yZW1vdmVIb29rID0gZnVuY3Rpb24gKFxuICAgIGVudHJ5UG9pbnQ6IGtleW9mIEhvb2tzTWFwLFxuICAgIGhvb2tGdW5jdGlvbjogSG9va0Z1bmN0aW9uXG4gICkge1xuICAgIGlmIChob29rRnVuY3Rpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgaW5kZXggPSBhcnJheUxhc3RJbmRleE9mKGhvb2tzW2VudHJ5UG9pbnRdLCBob29rRnVuY3Rpb24pO1xuXG4gICAgICByZXR1cm4gaW5kZXggPT09IC0xXG4gICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgIDogYXJyYXlTcGxpY2UoaG9va3NbZW50cnlQb2ludF0sIGluZGV4LCAxKVswXTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJyYXlQb3AoaG9va3NbZW50cnlQb2ludF0pO1xuICB9O1xuXG4gIERPTVB1cmlmeS5yZW1vdmVIb29rcyA9IGZ1bmN0aW9uIChlbnRyeVBvaW50OiBrZXlvZiBIb29rc01hcCkge1xuICAgIGhvb2tzW2VudHJ5UG9pbnRdID0gW107XG4gIH07XG5cbiAgRE9NUHVyaWZ5LnJlbW92ZUFsbEhvb2tzID0gZnVuY3Rpb24gKCkge1xuICAgIGhvb2tzID0gX2NyZWF0ZUhvb2tzTWFwKCk7XG4gIH07XG5cbiAgcmV0dXJuIERPTVB1cmlmeTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlRE9NUHVyaWZ5KCk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRE9NUHVyaWZ5IHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBET01QdXJpZnkgaW5zdGFuY2UgdXNpbmcgdGhlIGdpdmVuIHdpbmRvdy1saWtlIG9iamVjdC4gRGVmYXVsdHMgdG8gYHdpbmRvd2AuXG4gICAqL1xuICAocm9vdD86IFdpbmRvd0xpa2UpOiBET01QdXJpZnk7XG5cbiAgLyoqXG4gICAqIFZlcnNpb24gbGFiZWwsIGV4cG9zZWQgZm9yIGVhc2llciBjaGVja3NcbiAgICogaWYgRE9NUHVyaWZ5IGlzIHVwIHRvIGRhdGUgb3Igbm90XG4gICAqL1xuICB2ZXJzaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFycmF5IG9mIGVsZW1lbnRzIHRoYXQgRE9NUHVyaWZ5IHJlbW92ZWQgZHVyaW5nIHNhbml0YXRpb24uXG4gICAqIEVtcHR5IGlmIG5vdGhpbmcgd2FzIHJlbW92ZWQuXG4gICAqL1xuICByZW1vdmVkOiBBcnJheTxSZW1vdmVkRWxlbWVudCB8IFJlbW92ZWRBdHRyaWJ1dGU+O1xuXG4gIC8qKlxuICAgKiBFeHBvc2Ugd2hldGhlciB0aGlzIGJyb3dzZXIgc3VwcG9ydHMgcnVubmluZyB0aGUgZnVsbCBET01QdXJpZnkuXG4gICAqL1xuICBpc1N1cHBvcnRlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogU2V0IHRoZSBjb25maWd1cmF0aW9uIG9uY2UuXG4gICAqXG4gICAqIEBwYXJhbSBjZmcgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICovXG4gIHNldENvbmZpZyhjZmc/OiBDb25maWcpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHRoZSBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgY2xlYXJDb25maWcoKTogdm9pZDtcblxuICAvKipcbiAgICogUHJvdmlkZXMgY29yZSBzYW5pdGF0aW9uIGZ1bmN0aW9uYWxpdHkuXG4gICAqXG4gICAqIEBwYXJhbSBkaXJ0eSBzdHJpbmcgb3IgRE9NIG5vZGVcbiAgICogQHBhcmFtIGNmZyBvYmplY3RcbiAgICogQHJldHVybnMgU2FuaXRpemVkIFRydXN0ZWRIVE1MLlxuICAgKi9cbiAgc2FuaXRpemUoXG4gICAgZGlydHk6IHN0cmluZyB8IE5vZGUsXG4gICAgY2ZnOiBDb25maWcgJiB7IFJFVFVSTl9UUlVTVEVEX1RZUEU6IHRydWUgfVxuICApOiBUcnVzdGVkSFRNTDtcblxuICAvKipcbiAgICogUHJvdmlkZXMgY29yZSBzYW5pdGF0aW9uIGZ1bmN0aW9uYWxpdHkuXG4gICAqXG4gICAqIEBwYXJhbSBkaXJ0eSBET00gbm9kZVxuICAgKiBAcGFyYW0gY2ZnIG9iamVjdFxuICAgKiBAcmV0dXJucyBTYW5pdGl6ZWQgRE9NIG5vZGUuXG4gICAqL1xuICBzYW5pdGl6ZShkaXJ0eTogTm9kZSwgY2ZnOiBDb25maWcgJiB7IElOX1BMQUNFOiB0cnVlIH0pOiBOb2RlO1xuXG4gIC8qKlxuICAgKiBQcm92aWRlcyBjb3JlIHNhbml0YXRpb24gZnVuY3Rpb25hbGl0eS5cbiAgICpcbiAgICogQHBhcmFtIGRpcnR5IHN0cmluZyBvciBET00gbm9kZVxuICAgKiBAcGFyYW0gY2ZnIG9iamVjdFxuICAgKiBAcmV0dXJucyBTYW5pdGl6ZWQgRE9NIG5vZGUuXG4gICAqL1xuICBzYW5pdGl6ZShkaXJ0eTogc3RyaW5nIHwgTm9kZSwgY2ZnOiBDb25maWcgJiB7IFJFVFVSTl9ET006IHRydWUgfSk6IE5vZGU7XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVzIGNvcmUgc2FuaXRhdGlvbiBmdW5jdGlvbmFsaXR5LlxuICAgKlxuICAgKiBAcGFyYW0gZGlydHkgc3RyaW5nIG9yIERPTSBub2RlXG4gICAqIEBwYXJhbSBjZmcgb2JqZWN0XG4gICAqIEByZXR1cm5zIFNhbml0aXplZCBkb2N1bWVudCBmcmFnbWVudC5cbiAgICovXG4gIHNhbml0aXplKFxuICAgIGRpcnR5OiBzdHJpbmcgfCBOb2RlLFxuICAgIGNmZzogQ29uZmlnICYgeyBSRVRVUk5fRE9NX0ZSQUdNRU5UOiB0cnVlIH1cbiAgKTogRG9jdW1lbnRGcmFnbWVudDtcblxuICAvKipcbiAgICogUHJvdmlkZXMgY29yZSBzYW5pdGF0aW9uIGZ1bmN0aW9uYWxpdHkuXG4gICAqXG4gICAqIEBwYXJhbSBkaXJ0eSBzdHJpbmcgb3IgRE9NIG5vZGVcbiAgICogQHBhcmFtIGNmZyBvYmplY3RcbiAgICogQHJldHVybnMgU2FuaXRpemVkIHN0cmluZy5cbiAgICovXG4gIHNhbml0aXplKGRpcnR5OiBzdHJpbmcgfCBOb2RlLCBjZmc/OiBDb25maWcpOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhbiBhdHRyaWJ1dGUgdmFsdWUgaXMgdmFsaWQuXG4gICAqIFVzZXMgbGFzdCBzZXQgY29uZmlnLCBpZiBhbnkuIE90aGVyd2lzZSwgdXNlcyBjb25maWcgZGVmYXVsdHMuXG4gICAqXG4gICAqIEBwYXJhbSB0YWcgVGFnIG5hbWUgb2YgY29udGFpbmluZyBlbGVtZW50LlxuICAgKiBAcGFyYW0gYXR0ciBBdHRyaWJ1dGUgbmFtZS5cbiAgICogQHBhcmFtIHZhbHVlIEF0dHJpYnV0ZSB2YWx1ZS5cbiAgICogQHJldHVybnMgUmV0dXJucyB0cnVlIGlmIGB2YWx1ZWAgaXMgdmFsaWQuIE90aGVyd2lzZSwgcmV0dXJucyBmYWxzZS5cbiAgICovXG4gIGlzVmFsaWRBdHRyaWJ1dGUodGFnOiBzdHJpbmcsIGF0dHI6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBET01QdXJpZnkgaG9vay5cbiAgICpcbiAgICogQHBhcmFtIGVudHJ5UG9pbnQgZW50cnkgcG9pbnQgZm9yIHRoZSBob29rIHRvIGFkZFxuICAgKiBAcGFyYW0gaG9va0Z1bmN0aW9uIGZ1bmN0aW9uIHRvIGV4ZWN1dGVcbiAgICovXG4gIGFkZEhvb2soZW50cnlQb2ludDogQmFzaWNIb29rTmFtZSwgaG9va0Z1bmN0aW9uOiBOb2RlSG9vayk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBET01QdXJpZnkgaG9vay5cbiAgICpcbiAgICogQHBhcmFtIGVudHJ5UG9pbnQgZW50cnkgcG9pbnQgZm9yIHRoZSBob29rIHRvIGFkZFxuICAgKiBAcGFyYW0gaG9va0Z1bmN0aW9uIGZ1bmN0aW9uIHRvIGV4ZWN1dGVcbiAgICovXG4gIGFkZEhvb2soZW50cnlQb2ludDogRWxlbWVudEhvb2tOYW1lLCBob29rRnVuY3Rpb246IEVsZW1lbnRIb29rKTogdm9pZDtcblxuICAvKipcbiAgICogQWRkcyBhIERPTVB1cmlmeSBob29rLlxuICAgKlxuICAgKiBAcGFyYW0gZW50cnlQb2ludCBlbnRyeSBwb2ludCBmb3IgdGhlIGhvb2sgdG8gYWRkXG4gICAqIEBwYXJhbSBob29rRnVuY3Rpb24gZnVuY3Rpb24gdG8gZXhlY3V0ZVxuICAgKi9cbiAgYWRkSG9vayhcbiAgICBlbnRyeVBvaW50OiBEb2N1bWVudEZyYWdtZW50SG9va05hbWUsXG4gICAgaG9va0Z1bmN0aW9uOiBEb2N1bWVudEZyYWdtZW50SG9va1xuICApOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBBZGRzIGEgRE9NUHVyaWZ5IGhvb2suXG4gICAqXG4gICAqIEBwYXJhbSBlbnRyeVBvaW50IGVudHJ5IHBvaW50IGZvciB0aGUgaG9vayB0byBhZGRcbiAgICogQHBhcmFtIGhvb2tGdW5jdGlvbiBmdW5jdGlvbiB0byBleGVjdXRlXG4gICAqL1xuICBhZGRIb29rKFxuICAgIGVudHJ5UG9pbnQ6ICd1cG9uU2FuaXRpemVFbGVtZW50JyxcbiAgICBob29rRnVuY3Rpb246IFVwb25TYW5pdGl6ZUVsZW1lbnRIb29rXG4gICk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBET01QdXJpZnkgaG9vay5cbiAgICpcbiAgICogQHBhcmFtIGVudHJ5UG9pbnQgZW50cnkgcG9pbnQgZm9yIHRoZSBob29rIHRvIGFkZFxuICAgKiBAcGFyYW0gaG9va0Z1bmN0aW9uIGZ1bmN0aW9uIHRvIGV4ZWN1dGVcbiAgICovXG4gIGFkZEhvb2soXG4gICAgZW50cnlQb2ludDogJ3Vwb25TYW5pdGl6ZUF0dHJpYnV0ZScsXG4gICAgaG9va0Z1bmN0aW9uOiBVcG9uU2FuaXRpemVBdHRyaWJ1dGVIb29rXG4gICk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIERPTVB1cmlmeSBob29rIGF0IGEgZ2l2ZW4gZW50cnlQb2ludFxuICAgKiAocG9wcyBpdCBmcm9tIHRoZSBzdGFjayBvZiBob29rcyBpZiBob29rIG5vdCBzcGVjaWZpZWQpXG4gICAqXG4gICAqIEBwYXJhbSBlbnRyeVBvaW50IGVudHJ5IHBvaW50IGZvciB0aGUgaG9vayB0byByZW1vdmVcbiAgICogQHBhcmFtIGhvb2tGdW5jdGlvbiBvcHRpb25hbCBzcGVjaWZpYyBob29rIHRvIHJlbW92ZVxuICAgKiBAcmV0dXJucyByZW1vdmVkIGhvb2tcbiAgICovXG4gIHJlbW92ZUhvb2soXG4gICAgZW50cnlQb2ludDogQmFzaWNIb29rTmFtZSxcbiAgICBob29rRnVuY3Rpb24/OiBOb2RlSG9va1xuICApOiBOb2RlSG9vayB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogUmVtb3ZlIGEgRE9NUHVyaWZ5IGhvb2sgYXQgYSBnaXZlbiBlbnRyeVBvaW50XG4gICAqIChwb3BzIGl0IGZyb20gdGhlIHN0YWNrIG9mIGhvb2tzIGlmIGhvb2sgbm90IHNwZWNpZmllZClcbiAgICpcbiAgICogQHBhcmFtIGVudHJ5UG9pbnQgZW50cnkgcG9pbnQgZm9yIHRoZSBob29rIHRvIHJlbW92ZVxuICAgKiBAcGFyYW0gaG9va0Z1bmN0aW9uIG9wdGlvbmFsIHNwZWNpZmljIGhvb2sgdG8gcmVtb3ZlXG4gICAqIEByZXR1cm5zIHJlbW92ZWQgaG9va1xuICAgKi9cbiAgcmVtb3ZlSG9vayhcbiAgICBlbnRyeVBvaW50OiBFbGVtZW50SG9va05hbWUsXG4gICAgaG9va0Z1bmN0aW9uPzogRWxlbWVudEhvb2tcbiAgKTogRWxlbWVudEhvb2sgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIERPTVB1cmlmeSBob29rIGF0IGEgZ2l2ZW4gZW50cnlQb2ludFxuICAgKiAocG9wcyBpdCBmcm9tIHRoZSBzdGFjayBvZiBob29rcyBpZiBob29rIG5vdCBzcGVjaWZpZWQpXG4gICAqXG4gICAqIEBwYXJhbSBlbnRyeVBvaW50IGVudHJ5IHBvaW50IGZvciB0aGUgaG9vayB0byByZW1vdmVcbiAgICogQHBhcmFtIGhvb2tGdW5jdGlvbiBvcHRpb25hbCBzcGVjaWZpYyBob29rIHRvIHJlbW92ZVxuICAgKiBAcmV0dXJucyByZW1vdmVkIGhvb2tcbiAgICovXG4gIHJlbW92ZUhvb2soXG4gICAgZW50cnlQb2ludDogRG9jdW1lbnRGcmFnbWVudEhvb2tOYW1lLFxuICAgIGhvb2tGdW5jdGlvbj86IERvY3VtZW50RnJhZ21lbnRIb29rXG4gICk6IERvY3VtZW50RnJhZ21lbnRIb29rIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBET01QdXJpZnkgaG9vayBhdCBhIGdpdmVuIGVudHJ5UG9pbnRcbiAgICogKHBvcHMgaXQgZnJvbSB0aGUgc3RhY2sgb2YgaG9va3MgaWYgaG9vayBub3Qgc3BlY2lmaWVkKVxuICAgKlxuICAgKiBAcGFyYW0gZW50cnlQb2ludCBlbnRyeSBwb2ludCBmb3IgdGhlIGhvb2sgdG8gcmVtb3ZlXG4gICAqIEBwYXJhbSBob29rRnVuY3Rpb24gb3B0aW9uYWwgc3BlY2lmaWMgaG9vayB0byByZW1vdmVcbiAgICogQHJldHVybnMgcmVtb3ZlZCBob29rXG4gICAqL1xuICByZW1vdmVIb29rKFxuICAgIGVudHJ5UG9pbnQ6ICd1cG9uU2FuaXRpemVFbGVtZW50JyxcbiAgICBob29rRnVuY3Rpb24/OiBVcG9uU2FuaXRpemVFbGVtZW50SG9va1xuICApOiBVcG9uU2FuaXRpemVFbGVtZW50SG9vayB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogUmVtb3ZlIGEgRE9NUHVyaWZ5IGhvb2sgYXQgYSBnaXZlbiBlbnRyeVBvaW50XG4gICAqIChwb3BzIGl0IGZyb20gdGhlIHN0YWNrIG9mIGhvb2tzIGlmIGhvb2sgbm90IHNwZWNpZmllZClcbiAgICpcbiAgICogQHBhcmFtIGVudHJ5UG9pbnQgZW50cnkgcG9pbnQgZm9yIHRoZSBob29rIHRvIHJlbW92ZVxuICAgKiBAcGFyYW0gaG9va0Z1bmN0aW9uIG9wdGlvbmFsIHNwZWNpZmljIGhvb2sgdG8gcmVtb3ZlXG4gICAqIEByZXR1cm5zIHJlbW92ZWQgaG9va1xuICAgKi9cbiAgcmVtb3ZlSG9vayhcbiAgICBlbnRyeVBvaW50OiAndXBvblNhbml0aXplQXR0cmlidXRlJyxcbiAgICBob29rRnVuY3Rpb24/OiBVcG9uU2FuaXRpemVBdHRyaWJ1dGVIb29rXG4gICk6IFVwb25TYW5pdGl6ZUF0dHJpYnV0ZUhvb2sgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYWxsIERPTVB1cmlmeSBob29rcyBhdCBhIGdpdmVuIGVudHJ5UG9pbnRcbiAgICpcbiAgICogQHBhcmFtIGVudHJ5UG9pbnQgZW50cnkgcG9pbnQgZm9yIHRoZSBob29rcyB0byByZW1vdmVcbiAgICovXG4gIHJlbW92ZUhvb2tzKGVudHJ5UG9pbnQ6IEhvb2tOYW1lKTogdm9pZDtcblxuICAvKipcbiAgICogUmVtb3ZlcyBhbGwgRE9NUHVyaWZ5IGhvb2tzLlxuICAgKi9cbiAgcmVtb3ZlQWxsSG9va3MoKTogdm9pZDtcbn1cblxuLyoqXG4gKiBBbiBlbGVtZW50IHJlbW92ZWQgYnkgRE9NUHVyaWZ5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbW92ZWRFbGVtZW50IHtcbiAgLyoqXG4gICAqIFRoZSBlbGVtZW50IHRoYXQgd2FzIHJlbW92ZWQuXG4gICAqL1xuICBlbGVtZW50OiBOb2RlO1xufVxuXG4vKipcbiAqIEFuIGVsZW1lbnQgcmVtb3ZlZCBieSBET01QdXJpZnkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVtb3ZlZEF0dHJpYnV0ZSB7XG4gIC8qKlxuICAgKiBUaGUgYXR0cmlidXRlIHRoYXQgd2FzIHJlbW92ZWQuXG4gICAqL1xuICBhdHRyaWJ1dGU6IEF0dHIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgZWxlbWVudCB0aGF0IHRoZSBhdHRyaWJ1dGUgd2FzIHJlbW92ZWQuXG4gICAqL1xuICBmcm9tOiBOb2RlO1xufVxuXG50eXBlIEJhc2ljSG9va05hbWUgPVxuICB8ICdiZWZvcmVTYW5pdGl6ZUVsZW1lbnRzJ1xuICB8ICdhZnRlclNhbml0aXplRWxlbWVudHMnXG4gIHwgJ3Vwb25TYW5pdGl6ZVNoYWRvd05vZGUnO1xudHlwZSBFbGVtZW50SG9va05hbWUgPSAnYmVmb3JlU2FuaXRpemVBdHRyaWJ1dGVzJyB8ICdhZnRlclNhbml0aXplQXR0cmlidXRlcyc7XG50eXBlIERvY3VtZW50RnJhZ21lbnRIb29rTmFtZSA9XG4gIHwgJ2JlZm9yZVNhbml0aXplU2hhZG93RE9NJ1xuICB8ICdhZnRlclNhbml0aXplU2hhZG93RE9NJztcbnR5cGUgVXBvblNhbml0aXplRWxlbWVudEhvb2tOYW1lID0gJ3Vwb25TYW5pdGl6ZUVsZW1lbnQnO1xudHlwZSBVcG9uU2FuaXRpemVBdHRyaWJ1dGVIb29rTmFtZSA9ICd1cG9uU2FuaXRpemVBdHRyaWJ1dGUnO1xuXG5pbnRlcmZhY2UgSG9va3NNYXAge1xuICBiZWZvcmVTYW5pdGl6ZUVsZW1lbnRzOiBOb2RlSG9va1tdO1xuICBhZnRlclNhbml0aXplRWxlbWVudHM6IE5vZGVIb29rW107XG4gIGJlZm9yZVNhbml0aXplU2hhZG93RE9NOiBEb2N1bWVudEZyYWdtZW50SG9va1tdO1xuICB1cG9uU2FuaXRpemVTaGFkb3dOb2RlOiBOb2RlSG9va1tdO1xuICBhZnRlclNhbml0aXplU2hhZG93RE9NOiBEb2N1bWVudEZyYWdtZW50SG9va1tdO1xuICBiZWZvcmVTYW5pdGl6ZUF0dHJpYnV0ZXM6IEVsZW1lbnRIb29rW107XG4gIGFmdGVyU2FuaXRpemVBdHRyaWJ1dGVzOiBFbGVtZW50SG9va1tdO1xuICB1cG9uU2FuaXRpemVFbGVtZW50OiBVcG9uU2FuaXRpemVFbGVtZW50SG9va1tdO1xuICB1cG9uU2FuaXRpemVBdHRyaWJ1dGU6IFVwb25TYW5pdGl6ZUF0dHJpYnV0ZUhvb2tbXTtcbn1cblxudHlwZSBBcnJheUVsZW1lbnQ8VD4gPSBUIGV4dGVuZHMgQXJyYXk8aW5mZXIgVT4gPyBVIDogbmV2ZXI7XG5cbnR5cGUgSG9va0Z1bmN0aW9uID0gQXJyYXlFbGVtZW50PEhvb2tzTWFwW2tleW9mIEhvb2tzTWFwXT47XG5cbmV4cG9ydCB0eXBlIEhvb2tOYW1lID1cbiAgfCBCYXNpY0hvb2tOYW1lXG4gIHwgRWxlbWVudEhvb2tOYW1lXG4gIHwgRG9jdW1lbnRGcmFnbWVudEhvb2tOYW1lXG4gIHwgVXBvblNhbml0aXplRWxlbWVudEhvb2tOYW1lXG4gIHwgVXBvblNhbml0aXplQXR0cmlidXRlSG9va05hbWU7XG5cbmV4cG9ydCB0eXBlIE5vZGVIb29rID0gKFxuICB0aGlzOiBET01QdXJpZnksXG4gIGN1cnJlbnROb2RlOiBOb2RlLFxuICBob29rRXZlbnQ6IG51bGwsXG4gIGNvbmZpZzogQ29uZmlnXG4pID0+IHZvaWQ7XG5cbmV4cG9ydCB0eXBlIEVsZW1lbnRIb29rID0gKFxuICB0aGlzOiBET01QdXJpZnksXG4gIGN1cnJlbnROb2RlOiBFbGVtZW50LFxuICBob29rRXZlbnQ6IG51bGwsXG4gIGNvbmZpZzogQ29uZmlnXG4pID0+IHZvaWQ7XG5cbmV4cG9ydCB0eXBlIERvY3VtZW50RnJhZ21lbnRIb29rID0gKFxuICB0aGlzOiBET01QdXJpZnksXG4gIGN1cnJlbnROb2RlOiBEb2N1bWVudEZyYWdtZW50LFxuICBob29rRXZlbnQ6IG51bGwsXG4gIGNvbmZpZzogQ29uZmlnXG4pID0+IHZvaWQ7XG5cbmV4cG9ydCB0eXBlIFVwb25TYW5pdGl6ZUVsZW1lbnRIb29rID0gKFxuICB0aGlzOiBET01QdXJpZnksXG4gIGN1cnJlbnROb2RlOiBOb2RlLFxuICBob29rRXZlbnQ6IFVwb25TYW5pdGl6ZUVsZW1lbnRIb29rRXZlbnQsXG4gIGNvbmZpZzogQ29uZmlnXG4pID0+IHZvaWQ7XG5cbmV4cG9ydCB0eXBlIFVwb25TYW5pdGl6ZUF0dHJpYnV0ZUhvb2sgPSAoXG4gIHRoaXM6IERPTVB1cmlmeSxcbiAgY3VycmVudE5vZGU6IEVsZW1lbnQsXG4gIGhvb2tFdmVudDogVXBvblNhbml0aXplQXR0cmlidXRlSG9va0V2ZW50LFxuICBjb25maWc6IENvbmZpZ1xuKSA9PiB2b2lkO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVwb25TYW5pdGl6ZUVsZW1lbnRIb29rRXZlbnQge1xuICB0YWdOYW1lOiBzdHJpbmc7XG4gIGFsbG93ZWRUYWdzOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVcG9uU2FuaXRpemVBdHRyaWJ1dGVIb29rRXZlbnQge1xuICBhdHRyTmFtZTogc3RyaW5nO1xuICBhdHRyVmFsdWU6IHN0cmluZztcbiAga2VlcEF0dHI6IGJvb2xlYW47XG4gIGFsbG93ZWRBdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPjtcbiAgZm9yY2VLZWVwQXR0cjogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBBIGBXaW5kb3dgLWxpa2Ugb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHByb3BlcnRpZXMgYW5kIHR5cGVzIHRoYXQgRE9NUHVyaWZ5IHJlcXVpcmVzLlxuICovXG5leHBvcnQgdHlwZSBXaW5kb3dMaWtlID0gUGljazxcbiAgdHlwZW9mIGdsb2JhbFRoaXMsXG4gIHwgJ0RvY3VtZW50RnJhZ21lbnQnXG4gIHwgJ0hUTUxUZW1wbGF0ZUVsZW1lbnQnXG4gIHwgJ05vZGUnXG4gIHwgJ0VsZW1lbnQnXG4gIHwgJ05vZGVGaWx0ZXInXG4gIHwgJ05hbWVkTm9kZU1hcCdcbiAgfCAnSFRNTEZvcm1FbGVtZW50J1xuICB8ICdET01QYXJzZXInXG4+ICYge1xuICBkb2N1bWVudD86IERvY3VtZW50O1xuICBNb3pOYW1lZEF0dHJNYXA/OiB0eXBlb2Ygd2luZG93Lk5hbWVkTm9kZU1hcDtcbn0gJiBQaWNrPFRydXN0ZWRUeXBlc1dpbmRvdywgJ3RydXN0ZWRUeXBlcyc+O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvbWVzc2FnZS1kaXNwYXRjaC5qc1xuICogQ2hhdCBtZXNzYWdlIGRpc3BhdGNoOiBzZW5kTWVzc2FnZSwgaW50YWtlIGNvbmZpcm1hdGlvbiBjYXJkLFxuICogcHJpb3ItY2xhcmlmaWNhdGlvbiBwcmVsb2FkLlxuICpcbiAqIERFUEVOREVOQ0lFUyAoYWxsIG9uIGdsb2JhbFRoaXMgYXQgcnVudGltZSk6XG4gKiAgIC0gcGFyc2VNZXNzYWdlUmVzcG9uc2UgKHZhbGlkYXRvcnMuanMpXG4gKiAgIC0gc2V0TG9hZGluZywgbGxtRmV0Y2ggKGZldGNoLXV0aWxzLmpzKVxuICogICAtIGFwcGVuZE1lc3NhZ2UsIGFwcGVuZFJldHJ5TWVzc2FnZSwgYXBwZW5kUmF3SHRtbCAobWVzc2FnZS1xdWV1ZS5qcylcbiAqICAgLSBub3JtYWxpemVUZXh0LCBlc2NhcGVIdG1sICh1dGlscy5qcylcbiAqICAgLSBmZXRjaFN0YXR1cyAoYXBpLWNsaWVudC5qcylcbiAqICAgLSBhbmFseXplSm9iIChqb2ItYW5hbHlzaXMuanMpXG4gKiAgIC0gc2VuZEFjdGlvbiAoc2Vzc2lvbi1hY3Rpb25zLmpzKVxuICogICAtIHNob3dUYWJsZUJhc2VkUmV2aWV3IChyZXZpZXctdGFibGUtYmFzZS5qcywgVGllciA0KVxuICogICAtIGhhbmRsZUV4cGVyaWVuY2VSZXNwb25zZSAoZXhwZXJpZW5jZS1yZXZpZXcuanMsIFRpZXIgNSlcbiAqICAgLSBoYW5kbGVTa2lsbHNSZXNwb25zZSAoc2tpbGxzLXJldmlldy5qcywgVGllciA1KVxuICogICAtIGhhbmRsZVF1ZXN0aW9uUmVzcG9uc2UgKHF1ZXN0aW9ucy1wYW5lbC5qcylcbiAqICAgLSBleHRyYWN0Rmlyc3RKc29uT2JqZWN0LCBoYW5kbGVDdXN0b21pemF0aW9uUmVzcG9uc2UgKGFwcC5qcyBvcmNoZXN0cmF0b3IpXG4gKiAgIC0gc3RhdGVNYW5hZ2VyIChzdGF0ZS1tYW5hZ2VyLmpzIFx1MjAxNCBpc0xvYWRpbmcoKSlcbiAqICAgLSBxdWVzdGlvbkFuc3dlcnMsIHBlbmRpbmdSZWNvbW1lbmRhdGlvbnMgKHdpbmRvdyBnbG9iYWxzKVxuICovXG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmNvbnN0IGxvZyA9IGdldExvZ2dlcignbWVzc2FnZS1kaXNwYXRjaCcpO1xuXG5pbXBvcnQgeyBzdGF0ZU1hbmFnZXIgfSBmcm9tICcuL3N0YXRlLW1hbmFnZXIuanMnO1xuaW1wb3J0IHsgZ2V0U2Vzc2lvbklkRnJvbVVSTCB9IGZyb20gJy4vYXBpLWNsaWVudC5qcyc7XG5cbmxldCBfcGVuZGluZ1Bvc3RJbnRha2VDb250aW51YXRpb24gPSBudWxsO1xuY29uc3QgUkVUUllfUE9MSUNZX1NUT1JBR0VfS0VZID0gJ2N2LWJ1aWxkZXItcmV0cnktcG9saWN5JztcbmxldCBfcmV0cnlBdHRlbXB0Q291bnQgPSAwO1xubGV0IF9yZXRyeVRpbWVyID0gbnVsbDtcbmxldCBfcmV0cnlJbnRlcnZhbCA9IG51bGw7XG5cbmZ1bmN0aW9uIF9jbGVhclJldHJ5VGltZXJzKCkge1xuICBpZiAoX3JldHJ5VGltZXIpIHtcbiAgICBjbGVhclRpbWVvdXQoX3JldHJ5VGltZXIpO1xuICAgIF9yZXRyeVRpbWVyID0gbnVsbDtcbiAgfVxuICBpZiAoX3JldHJ5SW50ZXJ2YWwpIHtcbiAgICBjbGVhckludGVydmFsKF9yZXRyeUludGVydmFsKTtcbiAgICBfcmV0cnlJbnRlcnZhbCA9IG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2dldFJldHJ5UG9saWN5KCkge1xuICBjb25zdCBkZWZhdWx0cyA9IHtcbiAgICBiYXNlTXM6IDE1MDAsXG4gICAgY2FwTXM6IDYwMDAwLFxuICAgIG1heEF0dGVtcHRzOiA2LFxuICAgIGF1dG9SZXRyeTogdHJ1ZSxcbiAgfTtcbiAgdHJ5IHtcbiAgICBjb25zdCByYXcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShSRVRSWV9QT0xJQ1lfU1RPUkFHRV9LRVkpO1xuICAgIGlmICghcmF3KSByZXR1cm4gZGVmYXVsdHM7XG4gICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShyYXcpO1xuICAgIHJldHVybiB7XG4gICAgICBiYXNlTXM6IE1hdGgubWF4KDIwMCwgTnVtYmVyKHBhcnNlZC5iYXNlTXMgfHwgZGVmYXVsdHMuYmFzZU1zKSksXG4gICAgICBjYXBNczogTWF0aC5tYXgoMTAwMCwgTnVtYmVyKHBhcnNlZC5jYXBNcyB8fCBkZWZhdWx0cy5jYXBNcykpLFxuICAgICAgbWF4QXR0ZW1wdHM6IE1hdGgubWF4KDEsIE51bWJlcihwYXJzZWQubWF4QXR0ZW1wdHMgfHwgZGVmYXVsdHMubWF4QXR0ZW1wdHMpKSxcbiAgICAgIGF1dG9SZXRyeTogcGFyc2VkLmF1dG9SZXRyeSAhPT0gZmFsc2UsXG4gICAgfTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGRlZmF1bHRzO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9jYWxjdWxhdGVSZXRyeURlbGF5TXMoa2luZCwgZXJyb3IpIHtcbiAgY29uc3QgcG9saWN5ID0gX2dldFJldHJ5UG9saWN5KCk7XG4gIGNvbnN0IGV4cCA9IE1hdGgubWluKHBvbGljeS5jYXBNcywgcG9saWN5LmJhc2VNcyAqICgyICoqIF9yZXRyeUF0dGVtcHRDb3VudCkpO1xuICBjb25zdCBqaXR0ZXIgPSBNYXRoLnJvdW5kKGV4cCAqICgwLjEgKyBNYXRoLnJhbmRvbSgpICogMC4xNSkpO1xuICBsZXQgZGVsYXlNcyA9IE1hdGgubWluKHBvbGljeS5jYXBNcywgZXhwICsgaml0dGVyKTtcblxuICBpZiAoa2luZCA9PT0gJ3JhdGUtbGltaXRlZCcpIHtcbiAgICBjb25zdCByZXRyeUFmdGVyU2VjID0gTnVtYmVyKGVycm9yPy5yZXRyeUFmdGVyU2VjIHx8IDApO1xuICAgIGlmIChyZXRyeUFmdGVyU2VjID4gMCkge1xuICAgICAgZGVsYXlNcyA9IE1hdGgubWF4KGRlbGF5TXMsIHJldHJ5QWZ0ZXJTZWMgKiAxMDAwKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlbGF5TXM7XG59XG5cbmZ1bmN0aW9uIF9zY2hlZHVsZVJldHJ5KHRleHQsIGRlcml2ZWQsIGVycm9yKSB7XG4gIF9jbGVhclJldHJ5VGltZXJzKCk7XG4gIGNvbnN0IHBvbGljeSA9IF9nZXRSZXRyeVBvbGljeSgpO1xuXG4gIC8vIENsaWVudCBlcnJvcnMgKDR4eCkgYW5kIGF1dGggZmFpbHVyZXMgYXJlIG5vdCB0cmFuc2llbnQ7IGRvIG5vdCBhdXRvLXJldHJ5LlxuICBjb25zdCBOT05fUkVUUllBQkxFID0gbmV3IFNldChbJ2NsaWVudC1lcnJvcicsICdhdXRoLXJlcXVpcmVkJ10pO1xuICBjb25zdCBjYW5BdXRvUmV0cnkgPSBwb2xpY3kuYXV0b1JldHJ5XG4gICAgJiYgX3JldHJ5QXR0ZW1wdENvdW50IDwgcG9saWN5Lm1heEF0dGVtcHRzXG4gICAgJiYgIU5PTl9SRVRSWUFCTEUuaGFzKGRlcml2ZWQua2luZCk7XG5cbiAgY29uc3QgZGVsYXlNcyA9IF9jYWxjdWxhdGVSZXRyeURlbGF5TXMoZGVyaXZlZC5raW5kLCBlcnJvcik7XG4gIGNvbnN0IHRvdGFsU2Vjb25kcyA9IE1hdGgubWF4KDEsIE1hdGguY2VpbChkZWxheU1zIC8gMTAwMCkpO1xuXG4gIGNvbnN0IHJldHJ5QWN0aW9uID0gKCkgPT4ge1xuICAgIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21lc3NhZ2UtaW5wdXQnKTtcbiAgICBpZiAoaW5wdXQpIGlucHV0LnZhbHVlID0gdGV4dDtcbiAgICBzZW5kTWVzc2FnZSgpO1xuICB9O1xuXG4gIGxldCByZXRyeU1lc3NhZ2U7XG4gIGNvbnN0IGNhbmNlbEZuID0gY2FuQXV0b1JldHJ5ID8gKCkgPT4ge1xuICAgIF9jbGVhclJldHJ5VGltZXJzKCk7XG4gICAgaWYgKHJldHJ5TWVzc2FnZSkgcmV0cnlNZXNzYWdlLnJlbW92ZSgpO1xuICB9IDogbnVsbDtcblxuICByZXRyeU1lc3NhZ2UgPSBhcHBlbmRSZXRyeU1lc3NhZ2UoXG4gICAgYFx1MjZBMFx1RkUwRiAke2Vycm9yLm1lc3NhZ2V9YCxcbiAgICAoKSA9PiB7XG4gICAgICBfY2xlYXJSZXRyeVRpbWVycygpO1xuICAgICAgX3JldHJ5QXR0ZW1wdENvdW50ICs9IDE7XG4gICAgICByZXRyeUFjdGlvbigpO1xuICAgIH0sXG4gICAgY2FuQXV0b1JldHJ5ID8gYFJldHJ5IGluICR7dG90YWxTZWNvbmRzfXNgIDogJ1JldHJ5JyxcbiAgICBjYW5jZWxGbixcbiAgKTtcblxuICBpZiAoIWNhbkF1dG9SZXRyeSkgcmV0dXJuO1xuXG4gIGNvbnN0IHJldHJ5QnRuID0gcmV0cnlNZXNzYWdlPy5xdWVyeVNlbGVjdG9yKCdidXR0b24nKTtcbiAgbGV0IHJlbWFpbmluZyA9IHRvdGFsU2Vjb25kcztcbiAgaWYgKHJldHJ5QnRuKSB7XG4gICAgcmV0cnlCdG4udGV4dENvbnRlbnQgPSBgUmV0cnkgaW4gJHtyZW1haW5pbmd9c2A7XG4gICAgaWYgKGRlcml2ZWQua2luZCA9PT0gJ3JhdGUtbGltaXRlZCcpIHtcbiAgICAgIHJldHJ5QnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIHJldHJ5QnRuLnN0eWxlLm9wYWNpdHkgPSAnMC43JztcbiAgICAgIHJldHJ5QnRuLnN0eWxlLmN1cnNvciA9ICdub3QtYWxsb3dlZCc7XG4gICAgfVxuICB9XG5cbiAgX3JldHJ5SW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgcmVtYWluaW5nIC09IDE7XG4gICAgaWYgKHJldHJ5QnRuICYmIHJlbWFpbmluZyA+IDApIHtcbiAgICAgIHJldHJ5QnRuLnRleHRDb250ZW50ID0gYFJldHJ5IGluICR7cmVtYWluaW5nfXNgO1xuICAgIH1cbiAgICBpZiAocmVtYWluaW5nIDw9IDApIHtcbiAgICAgIGlmIChyZXRyeUJ0bikge1xuICAgICAgICByZXRyeUJ0bi50ZXh0Q29udGVudCA9ICdSZXRyeSBOb3cnO1xuICAgICAgICByZXRyeUJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICByZXRyeUJ0bi5zdHlsZS5vcGFjaXR5ID0gJyc7XG4gICAgICAgIHJldHJ5QnRuLnN0eWxlLmN1cnNvciA9ICcnO1xuICAgICAgfVxuICAgICAgY2xlYXJJbnRlcnZhbChfcmV0cnlJbnRlcnZhbCk7XG4gICAgICBfcmV0cnlJbnRlcnZhbCA9IG51bGw7XG4gICAgfVxuICB9LCAxMDAwKTtcblxuICBfcmV0cnlUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIF9yZXRyeVRpbWVyID0gbnVsbDtcbiAgICBfcmV0cnlBdHRlbXB0Q291bnQgKz0gMTtcbiAgICByZXRyeU1lc3NhZ2U/LnJlbW92ZSgpO1xuICAgIHJldHJ5QWN0aW9uKCk7XG4gIH0sIGRlbGF5TXMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBfcGFyc2VBcGlKc29uUmVzcG9uc2UocmVzcG9uc2UsIGVuZHBvaW50KSB7XG4gIGNvbnN0IHN0YXR1cyA9IE51bWJlcihyZXNwb25zZT8uc3RhdHVzIHx8IDApO1xuICBjb25zdCBzdGF0dXNUZXh0ID0gcmVzcG9uc2U/LnN0YXR1c1RleHQgfHwgJ1Vua25vd24gU3RhdHVzJztcbiAgY29uc3QgY29udGVudFR5cGUgPSAocmVzcG9uc2U/LmhlYWRlcnM/LmdldCgnY29udGVudC10eXBlJykgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IHJhdyA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcblxuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgbGV0IGRldGFpbCA9IHN0YXR1c1RleHQ7XG4gICAgaWYgKGNvbnRlbnRUeXBlLmluY2x1ZGVzKCdhcHBsaWNhdGlvbi9qc29uJykpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSBKU09OLnBhcnNlKHJhdyB8fCAne30nKTtcbiAgICAgICAgZGV0YWlsID0gcGF5bG9hZD8uZXJyb3IgfHwgcGF5bG9hZD8ubWVzc2FnZSB8fCBkZXRhaWw7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gS2VlcCBmYWxsYmFjayBkZXRhaWwgaWYgbWFsZm9ybWVkIEpTT04gZXJyb3IgcGF5bG9hZC5cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKChyYXcgfHwgJycpLnRyaW0oKS5zdGFydHNXaXRoKCc8JykpIHtcbiAgICAgIGRldGFpbCA9ICdzZXJ2ZXIgcmV0dXJuZWQgSFRNTCBpbnN0ZWFkIG9mIEpTT04gKHBvc3NpYmxlIHNlc3Npb24gcmVkaXJlY3Qgb3IgYmFja2VuZCBlcnJvciknO1xuICAgIH0gZWxzZSBpZiAoKHJhdyB8fCAnJykudHJpbSgpKSB7XG4gICAgICBkZXRhaWwgPSByYXcudHJpbSgpLnNsaWNlKDAsIDIyMCk7XG4gICAgfVxuICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKGAke3N0YXR1c306ICR7ZGV0YWlsfWApO1xuICAgIGVycm9yLnN0YXR1cyA9IHN0YXR1cztcbiAgICBlcnJvci5yZXRyeUFmdGVyU2VjID0gTnVtYmVyKHJlc3BvbnNlPy5oZWFkZXJzPy5nZXQoJ3JldHJ5LWFmdGVyJykgfHwgMCk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICBpZiAoIWNvbnRlbnRUeXBlLmluY2x1ZGVzKCdhcHBsaWNhdGlvbi9qc29uJykpIHtcbiAgICBjb25zdCBzbmlwcGV0ID0gKHJhdyB8fCAnJykudHJpbSgpLnNsaWNlKDAsIDgwKTtcbiAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoXG4gICAgICBgRXhwZWN0ZWQgSlNPTiBmcm9tICR7ZW5kcG9pbnR9LCBnb3QgJHtjb250ZW50VHlwZSB8fCAndW5rbm93biBjb250ZW50IHR5cGUnfSR7c25pcHBldCA/IGA6ICR7c25pcHBldH1gIDogJyd9YCxcbiAgICApO1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gcGFyc2VNZXNzYWdlUmVzcG9uc2UoSlNPTi5wYXJzZShyYXcgfHwgJ3t9JykpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgSW52YWxpZCBKU09OIGZyb20gJHtlbmRwb2ludH06ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfc2V0TGl2ZUxsbVN0YXRlKGtpbmQsIHRleHQsIGljb24gPSAnJywgdG9vbHRpcCA9ICcnKSB7XG4gIGlmICh0eXBlb2YgX3VwZGF0ZUxsbVN0YXR1c1BpbGwgPT09ICdmdW5jdGlvbicpIHtcbiAgICBfdXBkYXRlTGxtU3RhdHVzUGlsbChraW5kLCB0ZXh0LCBpY29uLCB0b29sdGlwKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfZGVyaXZlRXJyb3JTdGF0ZShlcnJvcikge1xuICBjb25zdCBtZXNzYWdlID0gU3RyaW5nKGVycm9yPy5tZXNzYWdlIHx8IGVycm9yIHx8ICdVbmtub3duIGVycm9yJyk7XG4gIGNvbnN0IGxvd2VyID0gbWVzc2FnZS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBzdGF0dXMgPSBOdW1iZXIoZXJyb3I/LnN0YXR1cyB8fCAwKTtcblxuICBpZiAoc3RhdHVzID09PSA0MDEgfHwgc3RhdHVzID09PSA0MDMgfHwgbWVzc2FnZS5zdGFydHNXaXRoKCc0MDE6JykgfHwgbWVzc2FnZS5zdGFydHNXaXRoKCc0MDM6JykgfHwgbG93ZXIuaW5jbHVkZXMoJ2F1dGgnKSkge1xuICAgIHJldHVybiB7XG4gICAgICBraW5kOiAnYXV0aC1yZXF1aXJlZCcsXG4gICAgICB0ZXh0OiAnQXV0aGVudGljYXRpb24gcmVxdWlyZWQnLFxuICAgICAgaWNvbjogJ1x1RDgzRFx1REQxMScsXG4gICAgICB0b29sdGlwOiAnQXV0aGVudGljYXRpb24gZmFpbGVkLiBDaGVjayBBUEkga2V5L3Rva2VuIG9yIHNpZ24gaW4gYWdhaW4uJyxcbiAgICB9O1xuICB9XG5cbiAgaWYgKHN0YXR1cyA9PT0gNDI5IHx8IG1lc3NhZ2Uuc3RhcnRzV2l0aCgnNDI5OicpIHx8IGxvd2VyLmluY2x1ZGVzKCdyYXRlIGxpbWl0JykpIHtcbiAgICByZXR1cm4ge1xuICAgICAga2luZDogJ3JhdGUtbGltaXRlZCcsXG4gICAgICB0ZXh0OiAnUmF0ZSBsaW1pdGVkJyxcbiAgICAgIGljb246ICdcdTIzRjMnLFxuICAgICAgdG9vbHRpcDogJ1Byb3ZpZGVyIHJhdGUgbGltaXQgcmVhY2hlZC4gV2FpdCBicmllZmx5IGFuZCByZXRyeS4nLFxuICAgIH07XG4gIH1cblxuICBpZiAoXG4gICAgc3RhdHVzID09PSA1MDIgfHxcbiAgICBzdGF0dXMgPT09IDUwMyB8fFxuICAgIHN0YXR1cyA9PT0gNTA0IHx8XG4gICAgbWVzc2FnZS5zdGFydHNXaXRoKCc1MDI6JykgfHxcbiAgICBtZXNzYWdlLnN0YXJ0c1dpdGgoJzUwMzonKSB8fFxuICAgIG1lc3NhZ2Uuc3RhcnRzV2l0aCgnNTA0OicpIHx8XG4gICAgbG93ZXIuaW5jbHVkZXMoJ3RpbWVvdXQnKSB8fFxuICAgIGxvd2VyLmluY2x1ZGVzKCd1bmF2YWlsYWJsZScpIHx8XG4gICAgbG93ZXIuaW5jbHVkZXMoJ2Nhbm5vdCByZWFjaCcpXG4gICkge1xuICAgIHJldHVybiB7XG4gICAgICBraW5kOiAndW5hdmFpbGFibGUnLFxuICAgICAgdGV4dDogJ1Byb3ZpZGVyIHVuYXZhaWxhYmxlJyxcbiAgICAgIGljb246ICdcdTI2MDEnLFxuICAgICAgdG9vbHRpcDogJ1Byb3ZpZGVyIGlzIGN1cnJlbnRseSB1bmF2YWlsYWJsZSBvciB1bnJlYWNoYWJsZS4gUmV0cnkgc29vbi4nLFxuICAgIH07XG4gIH1cblxuICAvLyA0eHggY2xpZW50IGVycm9ycyBhcmUgbm90IHRyYW5zaWVudCBcdTIwMTQgcmV0cnlpbmcgd2lsbCBub3QgZml4IHRoZW0uXG4gIGlmIChzdGF0dXMgPj0gNDAwICYmIHN0YXR1cyA8IDUwMCkge1xuICAgIHJldHVybiB7XG4gICAgICBraW5kOiAnY2xpZW50LWVycm9yJyxcbiAgICAgIHRleHQ6ICdSZXF1ZXN0IGVycm9yJyxcbiAgICAgIGljb246ICdcdTI2QTAnLFxuICAgICAgdG9vbHRpcDogbWVzc2FnZSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBraW5kOiAnZXJyb3InLFxuICAgIHRleHQ6ICdDb25uZWN0aW9uIGZhaWxlZCcsXG4gICAgaWNvbjogJ1x1MjZBMCcsXG4gICAgdG9vbHRpcDogbWVzc2FnZSxcbiAgfTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBEZWZhdWx0IExMTSBtZXNzYWdlIGhhbmRsZXJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5hc3luYyBmdW5jdGlvbiBfaGFuZGxlTExNTWVzc2FnZSh0ZXh0KSB7XG4gIF9jbGVhclJldHJ5VGltZXJzKCk7XG4gIHNldExvYWRpbmcodHJ1ZSwgJ1RoaW5raW5nXHUyMDI2Jyk7XG4gIF9zZXRMaXZlTGxtU3RhdGUoJ2Nvbm5lY3RpbmcnLCAnQ29ubmVjdGluZ1x1MjAyNicsICdcdTI5RDcnLCAnU2VuZGluZyByZXF1ZXN0IHRvIHByb3ZpZGVyLicpO1xuICBsZXQgdGVybWluYWxTdGF0ZSA9IG51bGw7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgbGxtRmV0Y2goJy9hcGkvbWVzc2FnZScsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IG1lc3NhZ2U6IHRleHQgfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IF9wYXJzZUFwaUpzb25SZXNwb25zZShyZXMsICcvYXBpL21lc3NhZ2UnKTtcblxuICAgIGlmIChkYXRhLmVycm9yKSB7XG4gICAgICBjb25zdCBlcnJvck1zZyA9IGRhdGEuZXJyb3IudG9TdHJpbmcoKTtcbiAgICAgIGNvbnN0IGRlcml2ZWQgPSBfZGVyaXZlRXJyb3JTdGF0ZShuZXcgRXJyb3IoZXJyb3JNc2cpKTtcbiAgICAgIF9zZXRMaXZlTGxtU3RhdGUoZGVyaXZlZC5raW5kLCBkZXJpdmVkLnRleHQsIGRlcml2ZWQuaWNvbiwgZGVyaXZlZC50b29sdGlwKTtcbiAgICAgIF9zY2hlZHVsZVJldHJ5KHRleHQsIGRlcml2ZWQsIG5ldyBFcnJvcihlcnJvck1zZykpO1xuICAgICAgdGVybWluYWxTdGF0ZSA9IGRlcml2ZWQ7XG4gICAgICBsb2cuZXJyb3IoJ1NlcnZlciBlcnJvcjonLCBkYXRhLmVycm9yKTtcbiAgICB9IGVsc2UgaWYgKGRhdGEucmVzcG9uc2UpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNsZWFuUmVzcG9uc2UgPSBkYXRhLnJlc3BvbnNlO1xuICAgICAgICBjb25zdCBwYXJzZWRDdXN0b21pemF0aW9uID0gZXh0cmFjdEZpcnN0SnNvbk9iamVjdChjbGVhblJlc3BvbnNlKTtcbiAgICAgICAgaWYgKHBhcnNlZEN1c3RvbWl6YXRpb24gJiYgKHBhcnNlZEN1c3RvbWl6YXRpb24ucmVjb21tZW5kZWRfZXhwZXJpZW5jZXMgfHwgcGFyc2VkQ3VzdG9taXphdGlvbi5yZWNvbW1lbmRlZF9za2lsbHMpKSB7XG4gICAgICAgICAgY29uc3QganNvblN0YXJ0ID0gY2xlYW5SZXNwb25zZS5pbmRleE9mKCd7Jyk7XG4gICAgICAgICAgY29uc3QgdGV4dEJlZm9yZUpzb24gPSBqc29uU3RhcnQgPiAwID8gY2xlYW5SZXNwb25zZS5zdWJzdHJpbmcoMCwganNvblN0YXJ0KS50cmltKCkgOiAnJztcbiAgICAgICAgICBpZiAodGV4dEJlZm9yZUpzb24gJiYgIXRleHRCZWZvcmVKc29uLmluY2x1ZGVzKCd7XCJhY3Rpb25cIjonKSkge1xuICAgICAgICAgICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgdGV4dEJlZm9yZUpzb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhd2FpdCBoYW5kbGVDdXN0b21pemF0aW9uUmVzcG9uc2UocGFyc2VkQ3VzdG9taXphdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGNsZWFuUmVzcG9uc2UudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIGNsZWFuUmVzcG9uc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZy5lcnJvcignRXJyb3IgcHJvY2Vzc2luZyBtZXNzYWdlIHJlc3BvbnNlOicsIGVyciwgZGF0YS5yZXNwb25zZSk7XG4gICAgICAgIGNvbnN0IGRlcml2ZWQgPSBfZGVyaXZlRXJyb3JTdGF0ZShlcnIpO1xuICAgICAgICBfc2V0TGl2ZUxsbVN0YXRlKGRlcml2ZWQua2luZCwgZGVyaXZlZC50ZXh0LCBkZXJpdmVkLmljb24sIGRlcml2ZWQudG9vbHRpcCk7XG4gICAgICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsIGBcdTI2QTBcdUZFMEYgSSBlbmNvdW50ZXJlZCBhbiBpc3N1ZSBwcm9jZXNzaW5nIHRoYXQgcmVzcG9uc2U6ICR7ZXJyLm1lc3NhZ2V9LiBUaGUgY29udmVyc2F0aW9uIGhhcyBiZWVuIHNhdmVkLmApO1xuICAgICAgICB0ZXJtaW5hbFN0YXRlID0gZGVyaXZlZDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbm5lY3RlZFN0YXRlID0geyBraW5kOiAnY29ubmVjdGVkJywgdGV4dDogJ0Nvbm5lY3RlZCcsIGljb246ICdcdTI3MTMnLCB0b29sdGlwOiAnUHJvdmlkZXIgcmVzcG9uZGVkIHN1Y2Nlc3NmdWxseSB0byBhIGxpdmUgcmVxdWVzdC4nIH07XG4gICAgICBfc2V0TGl2ZUxsbVN0YXRlKGNvbm5lY3RlZFN0YXRlLmtpbmQsIGNvbm5lY3RlZFN0YXRlLnRleHQsIGNvbm5lY3RlZFN0YXRlLmljb24sIGNvbm5lY3RlZFN0YXRlLnRvb2x0aXApO1xuICAgICAgdGVybWluYWxTdGF0ZSA9IGNvbm5lY3RlZFN0YXRlO1xuICAgICAgX3JldHJ5QXR0ZW1wdENvdW50ID0gMDtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nLmVycm9yKCc9PT0gTUVTU0FHRSBFUlJPUiA9PT0nLCBlcnJvci5uYW1lLCBlcnJvci5tZXNzYWdlLCBlcnJvci5zdGFjayk7XG4gICAgaWYgKGVycm9yLm5hbWUgPT09ICdBYm9ydEVycm9yJykge1xuICAgICAgLy8gVXNlciBjbGlja2VkIFN0b3AgXHUyMDE0IG1lc3NhZ2UgYWxyZWFkeSBzaG93biBieSBhYm9ydEN1cnJlbnRSZXF1ZXN0KCkuXG4gICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZGVyaXZlZCA9IF9kZXJpdmVFcnJvclN0YXRlKGVycm9yKTtcbiAgICBfc2V0TGl2ZUxsbVN0YXRlKGRlcml2ZWQua2luZCwgZGVyaXZlZC50ZXh0LCBkZXJpdmVkLmljb24sIGRlcml2ZWQudG9vbHRpcCk7XG4gICAgX3NjaGVkdWxlUmV0cnkodGV4dCwgZGVyaXZlZCwgZXJyb3IpO1xuICAgIHRlcm1pbmFsU3RhdGUgPSBkZXJpdmVkO1xuICB9XG4gIHNldExvYWRpbmcoZmFsc2UpO1xuICBhd2FpdCBmZXRjaFN0YXR1cygpO1xuICBpZiAodGVybWluYWxTdGF0ZSkge1xuICAgIF9zZXRMaXZlTGxtU3RhdGUodGVybWluYWxTdGF0ZS5raW5kLCB0ZXJtaW5hbFN0YXRlLnRleHQsIHRlcm1pbmFsU3RhdGUuaWNvbiwgdGVybWluYWxTdGF0ZS50b29sdGlwKTtcbiAgfVxuICBpZiAodHlwZW9mIGZldGNoQW5kRGlzcGxheUxsbUxvZyA9PT0gJ2Z1bmN0aW9uJykgZmV0Y2hBbmREaXNwbGF5TGxtTG9nKCk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gTWVzc2FnZSBkaXNwYXRjaCB0YWJsZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8vIEhhbmRsZXJzIGNoZWNrZWQgaW4gb3JkZXI7IGZpcnN0IG1hdGNoaW5nIHRlc3QoKSB3aW5zLlxuY29uc3QgX21lc3NhZ2VIYW5kbGVycyA9IFtcbiAge1xuICAgIHRlc3Q6IHQgPT4gdC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdyZXZpZXcgcmVjb21tZW5kYXRpb25zJykgfHwgdC50b0xvd2VyQ2FzZSgpID09PSAncmV2aWV3JyxcbiAgICBoYW5kbGU6IGFzeW5jICgpID0+IHNob3dUYWJsZUJhc2VkUmV2aWV3KCksXG4gIH0sXG4gIHtcbiAgICB0ZXN0OiAoKSA9PiB3aW5kb3cud2FpdGluZ0ZvckV4cGVyaWVuY2VSZXNwb25zZSxcbiAgICBoYW5kbGU6IGFzeW5jIHQgPT4gaGFuZGxlRXhwZXJpZW5jZVJlc3BvbnNlKHQpLFxuICB9LFxuICB7XG4gICAgdGVzdDogKCkgPT4gd2luZG93LndhaXRpbmdGb3JTa2lsbHNSZXNwb25zZSxcbiAgICBoYW5kbGU6IGFzeW5jIHQgPT4gaGFuZGxlU2tpbGxzUmVzcG9uc2UodCksXG4gIH0sXG4gIHtcbiAgICAvLyBQb3N0LWFuYWx5c2lzIHF1ZXN0aW9uIHJlc3BvbnNlIFx1MjAxNCBsb2NhbCBoYW5kbGVyICsgYmFja2VuZCBzYXZlLlxuICAgIHRlc3Q6ICgpID0+IHdpbmRvdy53YWl0aW5nRm9yUXVlc3Rpb25SZXNwb25zZSxcbiAgICBoYW5kbGU6IGFzeW5jIHQgPT4ge1xuICAgICAgY29uc3QgcXVlc3Rpb25IYW5kbGVkID0gaGFuZGxlUXVlc3Rpb25SZXNwb25zZSh0KTtcbiAgICAgIHNldExvYWRpbmcodHJ1ZSwgJ1RoaW5raW5nXHUyMDI2Jyk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBsbG1GZXRjaCgnL2FwaS9tZXNzYWdlJywge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgbWVzc2FnZTogdCB9KSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBfcGFyc2VBcGlKc29uUmVzcG9uc2UocmVzLCAnL2FwaS9tZXNzYWdlJyk7XG4gICAgICAgIGlmIChkYXRhLmVycm9yKSB7XG4gICAgICAgICAgbG9nLmVycm9yKCdCYWNrZW5kIGVycm9yIHNhdmluZyBxdWVzdGlvbiByZXNwb25zZTonLCBkYXRhLmVycm9yKTtcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLnJlc3BvbnNlICYmICFxdWVzdGlvbkhhbmRsZWQpIHtcbiAgICAgICAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCBkYXRhLnJlc3BvbnNlKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChlcnIubmFtZSAhPT0gJ0Fib3J0RXJyb3InKSBsb2cuZXJyb3IoJz09PSBRVUVTVElPTiBSRVNQT05TRSBTQVZFIEVSUk9SID09PScsIGVycik7XG4gICAgICB9XG4gICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICAgIGlmICghcXVlc3Rpb25IYW5kbGVkKSBhd2FpdCBfaGFuZGxlTExNTWVzc2FnZSh0KTtcbiAgICB9LFxuICB9LFxuICB7XG4gICAgdGVzdDogdCA9PiB0LnRvTG93ZXJDYXNlKCkgPT09ICdwcm9jZWVkJyxcbiAgICBoYW5kbGU6IGFzeW5jICgpID0+IHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zXG4gICAgICA/IHNob3dUYWJsZUJhc2VkUmV2aWV3KClcbiAgICAgIDogc2VuZEFjdGlvbigncmVjb21tZW5kX2N1c3RvbWl6YXRpb25zJyksXG4gIH0sXG4gIHtcbiAgICB0ZXN0OiAoKSA9PiB0cnVlLFxuICAgIGhhbmRsZTogX2hhbmRsZUxMTU1lc3NhZ2UsXG4gIH0sXG5dO1xuXG5hc3luYyBmdW5jdGlvbiBzZW5kTWVzc2FnZSgpIHtcbiAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWVzc2FnZS1pbnB1dCcpO1xuICBjb25zdCB0ZXh0ID0gbm9ybWFsaXplVGV4dChpbnB1dC52YWx1ZSk7XG4gIGlmICghdGV4dCB8fCBzdGF0ZU1hbmFnZXIuaXNMb2FkaW5nKCkpIHJldHVybjtcblxuICBpZiAoIWdldFNlc3Npb25JZEZyb21VUkwoKSkge1xuICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsICdcdTI2QTBcdUZFMEYgTm8gYWN0aXZlIHNlc3Npb24uIENyZWF0ZSBvciBsb2FkIGEgc2Vzc2lvbiBiZWZvcmUgc2VuZGluZyBtZXNzYWdlcy4nKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBhcHBlbmRNZXNzYWdlKCd1c2VyJywgdGV4dCk7XG4gIGlucHV0LnZhbHVlID0gJyc7XG5cbiAgZm9yIChjb25zdCBoYW5kbGVyIG9mIF9tZXNzYWdlSGFuZGxlcnMpIHtcbiAgICBpZiAoaGFuZGxlci50ZXN0KHRleHQpKSB7XG4gICAgICBhd2FpdCBoYW5kbGVyLmhhbmRsZSh0ZXh0KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBJbnRha2UgY29uZmlybWF0aW9uIGNhcmQgKEdBUC0yMylcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5hc3luYyBmdW5jdGlvbiBfc2hvd0ludGFrZUNvbmZpcm1DYXJkKGNvbnRpbnVhdGlvbiA9IG51bGwpIHtcbiAgaWYgKHR5cGVvZiBjb250aW51YXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICBfcGVuZGluZ1Bvc3RJbnRha2VDb250aW51YXRpb24gPSBjb250aW51YXRpb247XG4gIH1cblxuICBsZXQgZXh0cmFjdGVkID0ge3JvbGU6ICcnLCBjb21wYW55OiAnJywgZGF0ZV9hcHBsaWVkOiAnJ307XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGxsbUZldGNoKCcvYXBpL2ludGFrZS1tZXRhZGF0YScpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLmNvbmZpcm1lZCkge1xuICAgICAgYXdhaXQgX3Byb2NlZWRBZnRlckludGFrZShjb250aW51YXRpb24pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBleHRyYWN0ZWQgPSBkYXRhO1xuICB9IGNhdGNoIChfZSkgeyAvKiBmYWxsIHRocm91Z2ggd2l0aCBlbXB0eSBkZWZhdWx0cyAqLyB9XG5cbiAgY29uc3QgdG9kYXkgPSBleHRyYWN0ZWQuZGF0ZV9hcHBsaWVkIHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zbGljZSgwLCAxMCk7XG4gIGNvbnN0IGNhcmRIdG1sID0gYFxuICAgIDxkaXYgY2xhc3M9XCJpbnRha2UtY29uZmlybS1jYXJkXCIgaWQ9XCJpbnRha2UtY29uZmlybS1jYXJkXCIgcm9sZT1cImZvcm1cIiBhcmlhLWxhYmVsPVwiQ29uZmlybSBqb2IgZGV0YWlsc1wiPlxuICAgICAgPGgzPlx1RDgzRFx1RENDQiBDb25maXJtIGpvYiBkZXRhaWxzPC9oMz5cbiAgICAgIDxwPlJldmlldyB0aGUgZXh0cmFjdGVkIGRldGFpbHMgYmVmb3JlIGFuYWx5c2lzIGJlZ2lucy4gRWRpdCBhbnkgZmllbGQgaWYgbmVlZGVkLjwvcD5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbnRha2UtZmllbGQtcm93XCI+XG4gICAgICAgIDxsYWJlbCBmb3I9XCJpbnRha2Utcm9sZS1pbnB1dFwiPlJvbGUgLyBKb2IgVGl0bGU8L2xhYmVsPlxuICAgICAgICA8aW5wdXQgaWQ9XCJpbnRha2Utcm9sZS1pbnB1dFwiIHR5cGU9XCJ0ZXh0XCIgdmFsdWU9XCIke2VzY2FwZUh0bWwoZXh0cmFjdGVkLnJvbGUgfHwgJycpfVwiXG4gICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gU2VuaW9yIFNvZnR3YXJlIEVuZ2luZWVyXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbnRha2UtZmllbGQtcm93XCI+XG4gICAgICAgIDxsYWJlbCBmb3I9XCJpbnRha2UtY29tcGFueS1pbnB1dFwiPkNvbXBhbnk8L2xhYmVsPlxuICAgICAgICA8aW5wdXQgaWQ9XCJpbnRha2UtY29tcGFueS1pbnB1dFwiIHR5cGU9XCJ0ZXh0XCIgdmFsdWU9XCIke2VzY2FwZUh0bWwoZXh0cmFjdGVkLmNvbXBhbnkgfHwgJycpfVwiXG4gICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gQWNtZSBDb3JwXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbnRha2UtZmllbGQtcm93XCI+XG4gICAgICAgIDxsYWJlbCBmb3I9XCJpbnRha2UtZGF0ZS1pbnB1dFwiPkRhdGUgQXBwbGllZDwvbGFiZWw+XG4gICAgICAgIDxpbnB1dCBpZD1cImludGFrZS1kYXRlLWlucHV0XCIgdHlwZT1cImRhdGVcIiB2YWx1ZT1cIiR7ZXNjYXBlSHRtbCh0b2RheSl9XCI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbnRha2UtYWN0aW9uc1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLXNlY29uZGFyeVwiIG9uY2xpY2s9XCJfc2tpcEludGFrZUNhcmQoKVwiIHR5cGU9XCJidXR0b25cIj5Ta2lwPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4tcHJpbWFyeVwiICAgb25jbGljaz1cIl9zdWJtaXRJbnRha2VDYXJkKClcIiB0eXBlPVwiYnV0dG9uXCIgaWQ9XCJpbnRha2UtY29uZmlybS1idG5cIj5Db25maXJtICZhbXA7IENvbnRpbnVlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xuICBhcHBlbmRSYXdIdG1sKGNhcmRIdG1sKTtcblxuICBjb25zdCByb2xlSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW50YWtlLXJvbGUtaW5wdXQnKTtcbiAgaWYgKHJvbGVJbnB1dCAmJiAhcm9sZUlucHV0LnZhbHVlLnRyaW0oKSkgcm9sZUlucHV0LmZvY3VzKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9zdWJtaXRJbnRha2VDYXJkKGNvbnRpbnVhdGlvbiA9IG51bGwpIHtcbiAgY29uc3Qgcm9sZSAgICAgICAgID0gKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnRha2Utcm9sZS1pbnB1dCcpPy52YWx1ZSAgICB8fCAnJykudHJpbSgpO1xuICBjb25zdCBjb21wYW55ICAgICAgPSAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ludGFrZS1jb21wYW55LWlucHV0Jyk/LnZhbHVlIHx8ICcnKS50cmltKCk7XG4gIGNvbnN0IGRhdGVfYXBwbGllZCA9IChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW50YWtlLWRhdGUtaW5wdXQnKT8udmFsdWUgICAgfHwgJycpLnRyaW0oKTtcblxuICBjb25zdCBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW50YWtlLWNvbmZpcm0tYnRuJyk7XG4gIGlmIChidG4pIGJ0bi5kaXNhYmxlZCA9IHRydWU7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBsbG1GZXRjaCgnL2FwaS9jb25maXJtLWludGFrZScsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeydDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbid9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe3JvbGUsIGNvbXBhbnksIGRhdGVfYXBwbGllZH0pLFxuICAgIH0pO1xuICB9IGNhdGNoIChfZSkgeyAvKiBub24tZmF0YWwgKi8gfVxuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnRha2UtY29uZmlybS1jYXJkJyk/LnJlbW92ZSgpO1xuICBhd2FpdCBfcHJvY2VlZEFmdGVySW50YWtlKGNvbnRpbnVhdGlvbik7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9za2lwSW50YWtlQ2FyZChjb250aW51YXRpb24gPSBudWxsKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnRha2UtY29uZmlybS1jYXJkJyk/LnJlbW92ZSgpO1xuICBhd2FpdCBfcHJvY2VlZEFmdGVySW50YWtlKGNvbnRpbnVhdGlvbik7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9wcm9jZWVkQWZ0ZXJJbnRha2UoY29udGludWF0aW9uID0gbnVsbCkge1xuICBjb25zdCBlZmZlY3RpdmVDb250aW51YXRpb24gPVxuICAgICh0eXBlb2YgY29udGludWF0aW9uID09PSAnZnVuY3Rpb24nICYmIGNvbnRpbnVhdGlvbilcbiAgICB8fCBfcGVuZGluZ1Bvc3RJbnRha2VDb250aW51YXRpb25cbiAgICB8fCAoYXN5bmMgKCkgPT4gYW5hbHl6ZUpvYigpKTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBsbG1GZXRjaCgnL2FwaS9wcmlvci1jbGFyaWZpY2F0aW9ucycpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLmZvdW5kICYmIGRhdGEubWF0Y2hlcyAmJiBkYXRhLm1hdGNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgYmVzdCA9IGRhdGEubWF0Y2hlc1swXTtcbiAgICAgIF9wZW5kaW5nUG9zdEludGFrZUNvbnRpbnVhdGlvbiA9IGVmZmVjdGl2ZUNvbnRpbnVhdGlvbjtcbiAgICAgIGF3YWl0IF9vZmZlclByaW9yQ2xhcmlmaWNhdGlvbnMoYmVzdCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9IGNhdGNoIChfZSkgeyAvKiBmYWxsIHRocm91Z2ggKi8gfVxuXG4gIF9wZW5kaW5nUG9zdEludGFrZUNvbnRpbnVhdGlvbiA9IG51bGw7XG4gIGF3YWl0IGVmZmVjdGl2ZUNvbnRpbnVhdGlvbigpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBfb2ZmZXJQcmlvckNsYXJpZmljYXRpb25zKG1hdGNoKSB7XG4gIGNvbnN0IHJvbGVOYW1lID0gZXNjYXBlSHRtbChtYXRjaC5yb2xlIHx8IG1hdGNoLnBvc2l0aW9uX25hbWUgfHwgJ2Egc2ltaWxhciByb2xlJyk7XG4gIGNvbnN0IGJhbm5lckh0bWwgPSBgXG4gICAgPGRpdiBjbGFzcz1cInByaW9yLWNsYXJpZmljYXRpb25zLWJhbm5lclwiIGlkPVwicHJpb3ItY2xhci1iYW5uZXJcIiByb2xlPVwic3RhdHVzXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicGNiLXRleHRcIj5cbiAgICAgICAgXHVEODNEXHVEQ0ExIEZvdW5kIHByaW9yIGFuc3dlcnMgZnJvbSA8c3BhbiBjbGFzcz1cInBjYi1yb2xlXCI+JHtyb2xlTmFtZX08L3NwYW4+LlxuICAgICAgICBMb2FkIHRoZW0gYXMgZGVmYXVsdHMgZm9yIHRoZSBjbGFyaWZpY2F0aW9uIHF1ZXN0aW9ucz9cbiAgICAgIDwvZGl2PlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1zZWNvbmRhcnlcIiBvbmNsaWNrPVwiX2Rpc21pc3NQcmlvckNsYXJpZmljYXRpb25zKClcIiB0eXBlPVwiYnV0dG9uXCI+Tm8gdGhhbmtzPC9idXR0b24+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLXByaW1hcnlcIiAgIG9uY2xpY2s9XCJfbG9hZFByaW9yQ2xhcmlmaWNhdGlvbnMoKVwiIHR5cGU9XCJidXR0b25cIiBpZD1cInBjYi1sb2FkLWJ0blwiPkxvYWQgZGVmYXVsdHM8L2J1dHRvbj5cbiAgICA8L2Rpdj5gO1xuICBhcHBlbmRSYXdIdG1sKGJhbm5lckh0bWwpO1xuXG4gIHdpbmRvdy5fcGVuZGluZ1ByaW9yQW5zd2VycyA9IG1hdGNoLmFuc3dlcnMgfHwge307XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9kaXNtaXNzUHJpb3JDbGFyaWZpY2F0aW9ucygpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ByaW9yLWNsYXItYmFubmVyJyk/LnJlbW92ZSgpO1xuICBkZWxldGUgd2luZG93Ll9wZW5kaW5nUHJpb3JBbnN3ZXJzO1xuICBjb25zdCBjb250aW51YXRpb24gPSBfcGVuZGluZ1Bvc3RJbnRha2VDb250aW51YXRpb24gfHwgKGFzeW5jICgpID0+IGFuYWx5emVKb2IoKSk7XG4gIF9wZW5kaW5nUG9zdEludGFrZUNvbnRpbnVhdGlvbiA9IG51bGw7XG4gIGF3YWl0IGNvbnRpbnVhdGlvbigpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBfbG9hZFByaW9yQ2xhcmlmaWNhdGlvbnMoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcmlvci1jbGFyLWJhbm5lcicpPy5yZW1vdmUoKTtcbiAgY29uc3QgYW5zd2VycyA9IHdpbmRvdy5fcGVuZGluZ1ByaW9yQW5zd2VycyB8fCB7fTtcbiAgZGVsZXRlIHdpbmRvdy5fcGVuZGluZ1ByaW9yQW5zd2VycztcbiAgaWYgKHR5cGVvZiBxdWVzdGlvbkFuc3dlcnMgPT09ICdvYmplY3QnICYmIHF1ZXN0aW9uQW5zd2VycyAhPT0gbnVsbCkge1xuICAgIE9iamVjdC5hc3NpZ24ocXVlc3Rpb25BbnN3ZXJzLCBhbnN3ZXJzKTtcbiAgfSBlbHNlIHtcbiAgICB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgYW5zd2Vycyk7XG4gIH1cbiAgY29uc3QgY29udGludWF0aW9uID0gX3BlbmRpbmdQb3N0SW50YWtlQ29udGludWF0aW9uIHx8IChhc3luYyAoKSA9PiBhbmFseXplSm9iKCkpO1xuICBfcGVuZGluZ1Bvc3RJbnRha2VDb250aW51YXRpb24gPSBudWxsO1xuICBhd2FpdCBjb250aW51YXRpb24oKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEVTIG1vZHVsZSBleHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuZXhwb3J0IHtcbiAgX2hhbmRsZUxMTU1lc3NhZ2UsXG4gIF9tZXNzYWdlSGFuZGxlcnMsXG4gIHNlbmRNZXNzYWdlLFxuICBfc2hvd0ludGFrZUNvbmZpcm1DYXJkLFxuICBfc3VibWl0SW50YWtlQ2FyZCxcbiAgX3NraXBJbnRha2VDYXJkLFxuICBfcHJvY2VlZEFmdGVySW50YWtlLFxuICBfb2ZmZXJQcmlvckNsYXJpZmljYXRpb25zLFxuICBfZGlzbWlzc1ByaW9yQ2xhcmlmaWNhdGlvbnMsXG4gIF9sb2FkUHJpb3JDbGFyaWZpY2F0aW9ucyxcbn07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9xdWVzdGlvbnMtcGFuZWwuanNcbiAqIFBvc3QtYW5hbHlzaXMgY2xhcmlmeWluZyBxdWVzdGlvbnMgcGFuZWw6IHJlbmRlciwgZHJhZnQsIHN1Ym1pdC5cbiAqXG4gKiBERVBFTkRFTkNJRVMgKGFsbCBvbiBnbG9iYWxUaGlzIGF0IHJ1bnRpbWUpOlxuICogICAtIGNsZWFuSnNvblJlc3BvbnNlICh1dGlscy5qcylcbiAqICAgLSBtZXJnZVBvc3RBbmFseXNpc1F1ZXN0aW9ucywgbm9ybWFsaXplUG9zdEFuYWx5c2lzUXVlc3Rpb25zIChqb2ItYW5hbHlzaXMuanMpXG4gKiAgIC0gYnVpbGRGYWxsYmFja1Bvc3RBbmFseXNpc1F1ZXN0aW9ucyAocmVjb21tZW5kYXRpb24taGVscGVycy5qcylcbiAqICAgLSBhcHBlbmRNZXNzYWdlIChtZXNzYWdlLXF1ZXVlLmpzKVxuICogICAtIHNlbmRBY3Rpb24gKHNlc3Npb24tYWN0aW9ucy5qcylcbiAqICAgLSBlc2NhcGVIdG1sICh1dGlscy5qcylcbiAqICAgLSBzd2l0Y2hUYWIgKHJldmlldy10YWJsZS1iYXNlLmpzLCBUaWVyIDQpXG4gKiAgIC0gc3RhdGVNYW5hZ2VyIChzdGF0ZS1tYW5hZ2VyLmpzIFx1MjAxNCBnZXRUYWJEYXRhKCkpXG4gKiAgIC0gcG9zdEFuYWx5c2lzUXVlc3Rpb25zLCBxdWVzdGlvbkFuc3dlcnMgKHdpbmRvdyBnbG9iYWxzKVxuICovXG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmNvbnN0IGxvZyA9IGdldExvZ2dlcigncXVlc3Rpb25zLXBhbmVsJyk7XG5cbmltcG9ydCB7IHN0YXRlTWFuYWdlciB9IGZyb20gJy4vc3RhdGUtbWFuYWdlci5qcyc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU3RhdGUgcGVyc2lzdGVuY2UgaGVscGVyc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmFzeW5jIGZ1bmN0aW9uIHBlcnNpc3RQb3N0QW5hbHlzaXNTdGF0ZSgpIHtcbiAgdHJ5IHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkod2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucykpIHtcbiAgICAgIHdpbmRvdy5wb3N0QW5hbHlzaXNRdWVzdGlvbnMgPSBbXTtcbiAgICB9XG4gICAgaWYgKCF3aW5kb3cucXVlc3Rpb25BbnN3ZXJzIHx8IHR5cGVvZiB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzICE9PSAnb2JqZWN0Jykge1xuICAgICAgd2luZG93LnF1ZXN0aW9uQW5zd2VycyA9IHt9O1xuICAgIH1cblxuICAgIGF3YWl0IGZldGNoKCcvYXBpL3Bvc3QtYW5hbHlzaXMtcmVzcG9uc2VzJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgcXVlc3Rpb25zOiB3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zLFxuICAgICAgICBhbnN3ZXJzOiB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzXG4gICAgICB9KVxuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy53YXJuKCdGYWlsZWQgdG8gcGVyc2lzdCBwb3N0LWFuYWx5c2lzIHN0YXRlOicsIGVycm9yKTtcbiAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIE1hcmtkb3duIHJlbmRlcmVyIGZvciBxdWVzdGlvbiB0ZXh0XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gcmVuZGVyUXVlc3Rpb25NYXJrZG93bihtYXJrZG93blRleHQpIHtcbiAgY29uc3Qgc2FmZSA9IGVzY2FwZUh0bWwobWFya2Rvd25UZXh0IHx8ICcnKTtcbiAgcmV0dXJuIHNhZmVcbiAgICAucmVwbGFjZSgvXFwqXFwqKC4rPylcXCpcXCovZywgJzxzdHJvbmc+JDE8L3N0cm9uZz4nKVxuICAgIC5yZXBsYWNlKC9cXCooLis/KVxcKi9nLCAnPGVtPiQxPC9lbT4nKVxuICAgIC5yZXBsYWNlKC9gKFteYF0rKWAvZywgJzxjb2RlPiQxPC9jb2RlPicpXG4gICAgLnJlcGxhY2UoL1xcbi9nLCAnPGJyPicpO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEFQSSBmZXRjaCBmb3IgcXVlc3Rpb25zXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hQb3N0QW5hbHlzaXNRdWVzdGlvbnNGcm9tQXBpKGFuYWx5c2lzRGF0YSkge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3Bvc3QtYW5hbHlzaXMtcXVlc3Rpb25zJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgYW5hbHlzaXM6IGFuYWx5c2lzRGF0YSB9KVxuICAgIH0pO1xuICAgIGlmICghcmVzLm9rKSByZXR1cm4gW107XG4gICAgY29uc3QgcGF5bG9hZCA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZVBvc3RBbmFseXNpc1F1ZXN0aW9ucyhwYXlsb2FkLnF1ZXN0aW9ucyk7XG4gIH0gY2F0Y2ggKGFwaUVycm9yKSB7XG4gICAgbG9nLndhcm4oJ0ZhaWxlZCB0byBmZXRjaCBwb3N0LWFuYWx5c2lzIHF1ZXN0aW9uczonLCBhcGlFcnJvcik7XG4gICAgcmV0dXJuIFtdO1xuICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gTWFpbiBvcmNoZXN0cmF0b3I6IGNhbGxlZCBhZnRlciBhbmFseXplSm9iIGNvbXBsZXRlc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmFzeW5jIGZ1bmN0aW9uIGFza1Bvc3RBbmFseXNpc1F1ZXN0aW9ucyhhbmFseXNpc1Jlc3VsdCwgcHJlZmVycmVkUXVlc3Rpb25zID0gbnVsbCkge1xuICB0cnkge1xuICAgIGxldCBkYXRhO1xuICAgIGlmIChhbmFseXNpc1Jlc3VsdCAhPT0gbnVsbCAmJiB0eXBlb2YgYW5hbHlzaXNSZXN1bHQgPT09ICdvYmplY3QnKSB7XG4gICAgICBkYXRhID0gYW5hbHlzaXNSZXN1bHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNsZWFuUmVzdWx0ID0gY2xlYW5Kc29uUmVzcG9uc2UoYW5hbHlzaXNSZXN1bHQpO1xuICAgICAgZGF0YSA9IHR5cGVvZiBjbGVhblJlc3VsdCA9PT0gJ3N0cmluZycgPyBKU09OLnBhcnNlKGNsZWFuUmVzdWx0KSA6IGNsZWFuUmVzdWx0O1xuICAgIH1cblxuICAgIHdpbmRvdy5wb3N0QW5hbHlzaXNRdWVzdGlvbnMgPSBtZXJnZVBvc3RBbmFseXNpc1F1ZXN0aW9ucyhbXSwgcHJlZmVycmVkUXVlc3Rpb25zKTtcblxuICAgIGlmICh3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgd2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucyA9IGF3YWl0IGZldGNoUG9zdEFuYWx5c2lzUXVlc3Rpb25zRnJvbUFwaShkYXRhKTtcbiAgICB9XG5cbiAgICBpZiAod2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHdpbmRvdy5wb3N0QW5hbHlzaXNRdWVzdGlvbnMgPSBidWlsZEZhbGxiYWNrUG9zdEFuYWx5c2lzUXVlc3Rpb25zKGRhdGEpO1xuICAgIH1cblxuICAgIGlmICghd2luZG93LnF1ZXN0aW9uQW5zd2VycyB8fCB0eXBlb2Ygd2luZG93LnF1ZXN0aW9uQW5zd2VycyAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHdpbmRvdy5xdWVzdGlvbkFuc3dlcnMgPSB7fTtcbiAgICB9XG4gICAgYXdhaXQgcGVyc2lzdFBvc3RBbmFseXNpc1N0YXRlKCk7XG5cbiAgICBpZiAod2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICByZW5kZXJRdWVzdGlvbnNQYW5lbCgpO1xuICAgICAgc3dpdGNoVGFiKCdxdWVzdGlvbnMnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ0FuYWx5c2lzIGNvbXBsZXRlISBObyBjbGFyaWZ5aW5nIHF1ZXN0aW9ucyBuZWVkZWQuIEdlbmVyYXRpbmcgY3VzdG9taXphdGlvbiByZWNvbW1lbmRhdGlvbnNcdTIwMjYnKTtcbiAgICAgIGF3YWl0IHNlbmRBY3Rpb24oJ3JlY29tbWVuZF9jdXN0b21pemF0aW9ucycpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZy5lcnJvcignRXJyb3IgcGFyc2luZyBhbmFseXNpcyBmb3IgcXVlc3Rpb25zOicsIGUpO1xuICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsICdBbmFseXNpcyBjb21wbGV0ZSEgQ2xpY2sgXCJSZWNvbW1lbmQgQ3VzdG9taXphdGlvbnNcIiB3aGVuIHJlYWR5LicpO1xuICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVGFiIHBvcHVsYXRpb25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiBwb3B1bGF0ZVF1ZXN0aW9uc1RhYigpIHtcbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIGlmICghY29udGVudCkgcmV0dXJuO1xuXG4gIGlmICghc3RhdGVNYW5hZ2VyLmdldFRhYkRhdGEoJ2FuYWx5c2lzJykpIHtcbiAgICBjb250ZW50LmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwiZW1wdHktc3RhdGVcIj48ZGl2IGNsYXNzPVwiaWNvblwiPlx1RDgzRFx1RENBQzwvZGl2PjxoMz5ObyBRdWVzdGlvbnMgWWV0PC9oMz48cD5SdW4gXCJBbmFseXNlIEpvYlwiIGZpcnN0IHRvIGdlbmVyYXRlIGNsYXJpZnlpbmcgcXVlc3Rpb25zLjwvcD48L2Rpdj4nO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGhhc1F1ZXN0aW9ucyA9IEFycmF5LmlzQXJyYXkod2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucykgJiYgd2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucy5sZW5ndGggPiAwO1xuICBpZiAoIWhhc1F1ZXN0aW9ucykge1xuICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJlbXB0eS1zdGF0ZVwiPjxkaXYgY2xhc3M9XCJpY29uXCI+XHUyNzA1PC9kaXY+PGgzPlF1ZXN0aW9ucyBDb21wbGV0ZTwvaDM+PHA+Tm8gcGVuZGluZyBjbGFyaWZ5aW5nIHF1ZXN0aW9ucyBcdTIwMTQgY3VzdG9taXphdGlvbiByZWNvbW1lbmRhdGlvbnMgd2lsbCBiZSBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS48L3A+PC9kaXY+JztcbiAgICByZXR1cm47XG4gIH1cblxuICBfY3VycmVudEdyb3VwID0gMDtcbiAgY29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImFuYWx5c2lzLXBhZ2VcIj48ZGl2IGNsYXNzPVwiYW5hbHlzaXMtc2VjdGlvblwiPjxoMj5cdUQ4M0RcdURDQUMgQ2xhcmlmeWluZyBRdWVzdGlvbnM8L2gyPjxwIHN0eWxlPVwiY29sb3I6IzY0NzQ4YjsgbWFyZ2luOiAwO1wiPlBsZWFzZSBhbnN3ZXIgZWFjaCBxdWVzdGlvbiB0byBpbXByb3ZlIHJlY29tbWVuZGF0aW9uIHF1YWxpdHkuPC9wPjwvZGl2PjwvZGl2Pic7XG4gIHJlbmRlclF1ZXN0aW9uc1BhbmVsKCk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUGFuZWwgcmVuZGVyZXJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiByZW5kZXJRdWVzdGlvbnNQYW5lbCgpIHtcbiAgY29uc3QgcXMgPSB3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zIHx8IFtdO1xuICBpZiAocXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIGlmICghY29udGVudCkgcmV0dXJuO1xuXG4gIGNvbnN0IGV4aXN0aW5nID0gY29udGVudC5xdWVyeVNlbGVjdG9yKCcucXVlc3Rpb25zLXBhbmVsJyk7XG4gIGlmIChleGlzdGluZykgZXhpc3RpbmcucmVtb3ZlKCk7XG5cbiAgY29uc3QgdG90YWwgICAgICA9IHFzLmxlbmd0aDtcbiAgY29uc3QgbnVtR3JvdXBzICA9IE1hdGguY2VpbCh0b3RhbCAvIEdST1VQX1NJWkUpO1xuICAvLyBDbGFtcCBncm91cCBpbmRleCBpbiBjYXNlIHFzIHNocmFuayBzaW5jZSBsYXN0IHJlbmRlci5cbiAgX2N1cnJlbnRHcm91cCAgICA9IE1hdGgubWluKF9jdXJyZW50R3JvdXAsIG51bUdyb3VwcyAtIDEpO1xuICBjb25zdCBncm91cFN0YXJ0ID0gX2N1cnJlbnRHcm91cCAqIEdST1VQX1NJWkU7XG4gIGNvbnN0IGdyb3VwRW5kICAgPSBNYXRoLm1pbihncm91cFN0YXJ0ICsgR1JPVVBfU0laRSwgdG90YWwpO1xuICBjb25zdCBncm91cFFzICAgID0gcXMuc2xpY2UoZ3JvdXBTdGFydCwgZ3JvdXBFbmQpO1xuICBjb25zdCBpc0xhc3RHcm91cCA9IF9jdXJyZW50R3JvdXAgPT09IG51bUdyb3VwcyAtIDE7XG5cbiAgY29uc3QgZXhpc3RpbmdBbnN3ZXJzID0gKHdpbmRvdy5xdWVzdGlvbkFuc3dlcnMgJiYgdHlwZW9mIHdpbmRvdy5xdWVzdGlvbkFuc3dlcnMgPT09ICdvYmplY3QnKVxuICAgID8gd2luZG93LnF1ZXN0aW9uQW5zd2VycyA6IHt9O1xuXG4gIGNvbnN0IGdyb3VwTGFiZWwgPSBudW1Hcm91cHMgPiAxXG4gICAgPyBgR3JvdXAgJHtfY3VycmVudEdyb3VwICsgMX0gb2YgJHtudW1Hcm91cHN9YFxuICAgIDogYCR7dG90YWx9IHF1ZXN0aW9uJHt0b3RhbCA+IDEgPyAncycgOiAnJ31gO1xuXG4gIGNvbnN0IGdyb3VwTmF2SHRtbCA9IG51bUdyb3VwcyA+IDEgPyByZW5kZXJRR3JvdXBOYXYobnVtR3JvdXBzLCBxcywgZXhpc3RpbmdBbnN3ZXJzKSA6ICcnO1xuXG4gIGxldCBwYW5lbEh0bWwgPSBgPGRpdiBjbGFzcz1cInF1ZXN0aW9ucy1wYW5lbFwiIGlkPVwicXVlc3Rpb25zLXBhbmVsXCI+XG4gICAgPGgyPlx1RDgzRFx1RENBQyBBIGZldyBxdWljayBxdWVzdGlvbnM8L2gyPlxuICAgIDxwIGNsYXNzPVwicS1wcm9ncmVzc1wiIGlkPVwicS1wcm9ncmVzc1wiPiR7Z3JvdXBMYWJlbH0gXHUyMDE0IGFuc3dlciBlYWNoIHRvIGNvbnRpbnVlLjwvcD5cbiAgICAke2dyb3VwTmF2SHRtbH1gO1xuXG4gIGdyb3VwUXMuZm9yRWFjaCgocSwgbG9jYWxJZHgpID0+IHtcbiAgICBjb25zdCBpZHggPSBncm91cFN0YXJ0ICsgbG9jYWxJZHg7XG4gICAgY29uc3Qgc2F2ZWRBbnN3ZXIgPSAoZXhpc3RpbmdBbnN3ZXJzW3EudHlwZV0gfHwgJycpLnRvU3RyaW5nKCk7XG4gICAgY29uc3QgaXNBbnN3ZXJlZCAgPSBzYXZlZEFuc3dlci50cmltKCkubGVuZ3RoID4gMDtcbiAgICBjb25zdCByZW5kZXJlZFF1ZXN0aW9uID0gcmVuZGVyUXVlc3Rpb25NYXJrZG93bihxLnF1ZXN0aW9uKTtcbiAgICBjb25zdCBjaGlwcyA9IChxLmNob2ljZXMgfHwgW10pLm1hcCgoYywgY2kpID0+XG4gICAgICBgPGJ1dHRvbiBjbGFzcz1cInEtY2hpcFwiIGRhdGEtcWlkeD1cIiR7aWR4fVwiIGRhdGEtY2lkeD1cIiR7Y2l9XCIgb25jbGljaz1cInNlbGVjdFFDaGlwKHRoaXMsICR7aWR4fSlcIj4ke2VzY2FwZUh0bWwoYyl9PC9idXR0b24+YFxuICAgICkuam9pbignJyk7XG4gICAgcGFuZWxIdG1sICs9IGBcbiAgICAgIDxkaXYgY2xhc3M9XCJxdWVzdGlvbi1pdGVtJHtpc0Fuc3dlcmVkID8gJyBhbnN3ZXJlZCcgOiAnJ31cIiBpZD1cInEtaXRlbS0ke2lkeH1cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInEtaGVhZGVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInEtdGV4dFwiPiR7aWR4ICsgMX0uICR7cmVuZGVyZWRRdWVzdGlvbn08L2Rpdj5cbiAgICAgICAgICAke2lzQW5zd2VyZWQgPyAnPHNwYW4gY2xhc3M9XCJxLWFuc3dlcmVkLWJhZGdlXCI+XHUyNzEzIEFuc3dlcmVkPC9zcGFuPicgOiAnJ31cbiAgICAgICAgPC9kaXY+XG4gICAgICAgICR7Y2hpcHMgPyBgPGRpdiBjbGFzcz1cInEtY2hpcHNcIj4ke2NoaXBzfTwvZGl2PmAgOiAnJ31cbiAgICAgICAgPGRpdiBjbGFzcz1cInEtYW5zd2VyLXJvd1wiPlxuICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cInEtaW5wdXRcIiBpZD1cInEtaW5wdXQtJHtpZHh9XCIgcGxhY2Vob2xkZXI9XCJZb3VyIGFuc3dlclx1MjAyNlwiIG9uaW5wdXQ9XCJvblFJbnB1dENoYW5nZSgke2lkeH0pXCI+JHtlc2NhcGVIdG1sKHNhdmVkQW5zd2VyKX08L3RleHRhcmVhPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJxLWRyYWZ0LWJ0blwiIGlkPVwicS1kcmFmdC1idG4tJHtpZHh9XCIgb25jbGljaz1cImRyYWZ0UXVlc3Rpb25SZXNwb25zZSgke2lkeH0pXCIgdGl0bGU9XCJHZW5lcmF0ZSBhIGRyYWZ0IGFuc3dlciB1c2luZyBBSVwiPlx1MjcyOCBEcmFmdDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PmA7XG4gIH0pO1xuXG4gIGlmIChpc0xhc3RHcm91cCkge1xuICAgIHBhbmVsSHRtbCArPSBgPGJ1dHRvbiBjbGFzcz1cInF1ZXN0aW9ucy1zdWJtaXQtYnRuXCIgaWQ9XCJxLXN1Ym1pdC1idG5cIiBvbmNsaWNrPVwic3VibWl0QWxsQW5zd2VycygpXCIgZGlzYWJsZWQ+U3VibWl0IEFuc3dlcnM8L2J1dHRvbj5gO1xuICB9IGVsc2Uge1xuICAgIHBhbmVsSHRtbCArPSBgPGJ1dHRvbiBjbGFzcz1cInF1ZXN0aW9ucy1zdWJtaXQtYnRuXCIgaWQ9XCJxLXN1Ym1pdC1idG5cIiBvbmNsaWNrPVwiYWR2YW5jZVFHcm91cCgpXCIgZGlzYWJsZWQ+Q29udGludWUgXHUyMTkyIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjAuOGVtO2ZvbnQtd2VpZ2h0OjQwMDtcIj4oJHtncm91cEVuZH0gb2YgJHt0b3RhbH0gYW5zd2VyZWQpPC9zcGFuPjwvYnV0dG9uPmA7XG4gIH1cbiAgcGFuZWxIdG1sICs9ICc8L2Rpdj4nO1xuXG4gIGNvbnRlbnQuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCBwYW5lbEh0bWwpO1xuXG4gIC8vIFJlc3RvcmUgY2hpcCBzZWxlY3Rpb24gZm9yIGFueSBxdWVzdGlvbiB3aG9zZSBzYXZlZCBhbnN3ZXIgbWF0Y2hlcyBhIGNoaXAgbGFiZWwuXG4gIGdyb3VwUXMuZm9yRWFjaCgocSwgbG9jYWxJZHgpID0+IHtcbiAgICBjb25zdCBpZHggPSBncm91cFN0YXJ0ICsgbG9jYWxJZHg7XG4gICAgY29uc3Qgc2F2ZWQgPSAoZXhpc3RpbmdBbnN3ZXJzW3EudHlwZV0gfHwgJycpLnRvU3RyaW5nKCkudHJpbSgpO1xuICAgIGlmICghc2F2ZWQpIHJldHVybjtcbiAgICBjb25zdCBpdGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHEtaXRlbS0ke2lkeH1gKTtcbiAgICBpZiAoIWl0ZW0pIHJldHVybjtcbiAgICBpdGVtLnF1ZXJ5U2VsZWN0b3JBbGwoJy5xLWNoaXAnKS5mb3JFYWNoKGNoaXAgPT4ge1xuICAgICAgaWYgKChjaGlwLnRleHRDb250ZW50IHx8ICcnKS50cmltKCkgPT09IHNhdmVkKSBjaGlwLmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHVwZGF0ZVFQcm9ncmVzcygpO1xufVxuXG4vLyBHcm91cC1uYXZpZ2F0aW9uIHN0cmlwIChHQVAtMTYgUGFydCBEKTogbGV0cyB0aGUgdXNlciBqdW1wIGJhY2sgdG8gYW5cbi8vIGVhcmxpZXIgZ3JvdXAgdG8gcmV2aWV3L2VkaXQgaXQgd2l0aG91dCBsb3NpbmcgZm9yd2FyZCBwcm9ncmVzcy4gVGhlc2Vcbi8vIGFyZSBwbGFpbiBidXR0b25zLCBub3QgYW4gQVJJQSB0YWJsaXN0IFx1MjAxNCBubyBhcnJvdy1rZXkgcm92aW5nIGlzIGltcGxlbWVudGVkLFxuLy8gc28gYSB0YWIvdGFibGlzdCByb2xlIHdvdWxkIHNldCBhIGZhbHNlIGV4cGVjdGF0aW9uIGZvciBzY3JlZW4gcmVhZGVycy5cbmZ1bmN0aW9uIF9pc0dyb3VwRnVsbHlBbnN3ZXJlZChncm91cElkeCwgcXMsIGV4aXN0aW5nQW5zd2Vycykge1xuICBjb25zdCBncm91cFN0YXJ0ID0gZ3JvdXBJZHggKiBHUk9VUF9TSVpFO1xuICBjb25zdCBncm91cEVuZCAgICA9IE1hdGgubWluKGdyb3VwU3RhcnQgKyBHUk9VUF9TSVpFLCBxcy5sZW5ndGgpO1xuICBmb3IgKGxldCBpZHggPSBncm91cFN0YXJ0OyBpZHggPCBncm91cEVuZDsgaWR4KyspIHtcbiAgICBjb25zdCBxID0gcXNbaWR4XTtcbiAgICBpZiAoIXEpIGNvbnRpbnVlO1xuICAgIGlmICghKGV4aXN0aW5nQW5zd2Vyc1txLnR5cGVdIHx8ICcnKS50b1N0cmluZygpLnRyaW0oKSkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiByZW5kZXJRR3JvdXBOYXYobnVtR3JvdXBzLCBxcywgZXhpc3RpbmdBbnN3ZXJzKSB7XG4gIGNvbnN0IGRvdHMgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1Hcm91cHM7IGkrKykge1xuICAgIGNvbnN0IGlzQWN0aXZlID0gaSA9PT0gX2N1cnJlbnRHcm91cDtcbiAgICBjb25zdCBpc0RvbmUgICA9ICFpc0FjdGl2ZSAmJiBfaXNHcm91cEZ1bGx5QW5zd2VyZWQoaSwgcXMsIGV4aXN0aW5nQW5zd2Vycyk7XG4gICAgY29uc3QgY2xzID0gWydxLWdyb3VwLWRvdCddO1xuICAgIGlmIChpc0FjdGl2ZSkgY2xzLnB1c2goJ2FjdGl2ZScpO1xuICAgIGlmIChpc0RvbmUpIGNscy5wdXNoKCdkb25lJyk7XG4gICAgY29uc3Qgc3RhdGVMYWJlbCA9IGlzQWN0aXZlID8gJ2N1cnJlbnQnIDogaXNEb25lID8gJ2NvbXBsZXRlZCcgOiAnbm90IHlldCBhbnN3ZXJlZCc7XG4gICAgY29uc3QgYXJpYUxhYmVsID0gYFJldmlldyBhbnN3ZXJzIGZvciBHcm91cCAke2kgKyAxfSwgJHtzdGF0ZUxhYmVsfSBcdTIwMTQgbm8gcmVzdWJtaXNzaW9uYDtcbiAgICBkb3RzLnB1c2goXG4gICAgICBgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCIke2Nscy5qb2luKCcgJyl9XCIgZGF0YS1ncm91cD1cIiR7aX1cImAgK1xuICAgICAgYCR7aXNBY3RpdmUgPyAnIGFyaWEtY3VycmVudD1cInN0ZXBcIicgOiAnJ30gYXJpYS1sYWJlbD1cIiR7ZXNjYXBlSHRtbChhcmlhTGFiZWwpfVwiYCArXG4gICAgICBgIG9uY2xpY2s9XCJqdW1wVG9RR3JvdXAoJHtpfSlcIj4ke2lzRG9uZSA/ICdcdTI3MTMnIDogaSArIDF9PC9idXR0b24+YFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGA8ZGl2IGNsYXNzPVwicS1ncm91cC1uYXZcIiBhcmlhLWxhYmVsPVwiUXVlc3Rpb24gZ3JvdXBzXCI+JHtkb3RzLmpvaW4oJycpfTwvZGl2PmA7XG59XG5cbi8vIEZsdXNoIHRoZSBjdXJyZW50IGdyb3VwJ3MgdGV4dGFyZWEgdmFsdWVzIGludG8gd2luZG93LnF1ZXN0aW9uQW5zd2Vycy5cbi8vIFNoYXJlZCBieSBhZHZhbmNlUUdyb3VwKCkgKGZvcndhcmQgcHJvZ3Jlc3Npb24pIGFuZCBqdW1wVG9RR3JvdXAoKVxuLy8gKGJhY2t3YXJkIG5hdmlnYXRpb24pIHNvIGJvdGggcGVyc2lzdCBpbi1wcm9ncmVzcyBlZGl0cyB0aGUgc2FtZSB3YXkuXG5mdW5jdGlvbiBfZmx1c2hDdXJyZW50R3JvdXBBbnN3ZXJzKCkge1xuICBjb25zdCBxcyA9IHdpbmRvdy5wb3N0QW5hbHlzaXNRdWVzdGlvbnMgfHwgW107XG4gIGNvbnN0IGdyb3VwU3RhcnQgPSBfY3VycmVudEdyb3VwICogR1JPVVBfU0laRTtcbiAgY29uc3QgZ3JvdXBFbmQgICA9IE1hdGgubWluKGdyb3VwU3RhcnQgKyBHUk9VUF9TSVpFLCBxcy5sZW5ndGgpO1xuICBmb3IgKGxldCBpZHggPSBncm91cFN0YXJ0OyBpZHggPCBncm91cEVuZDsgaWR4KyspIHtcbiAgICBjb25zdCBxICA9IHFzW2lkeF07XG4gICAgY29uc3QgdGEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcS1pbnB1dC0ke2lkeH1gKTtcbiAgICBpZiAocSAmJiB0YSAmJiB0YS52YWx1ZS50cmltKCkpIHtcbiAgICAgIGlmICghd2luZG93LnF1ZXN0aW9uQW5zd2Vycykgd2luZG93LnF1ZXN0aW9uQW5zd2VycyA9IHt9O1xuICAgICAgd2luZG93LnF1ZXN0aW9uQW5zd2Vyc1txLnR5cGVdID0gdGEudmFsdWUudHJpbSgpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhZHZhbmNlUUdyb3VwKCkge1xuICBfZmx1c2hDdXJyZW50R3JvdXBBbnN3ZXJzKCk7XG4gIHBlcnNpc3RQb3N0QW5hbHlzaXNTdGF0ZSgpO1xuICBfY3VycmVudEdyb3VwKys7XG4gIHJlbmRlclF1ZXN0aW9uc1BhbmVsKCk7XG59XG5cbi8vIEp1bXAgYmFjayAob3IgZm9yd2FyZCkgdG8gYSBzcGVjaWZpYyBncm91cCB3aXRob3V0IHJlcXVpcmluZyB0aGUgY3VycmVudFxuLy8gZ3JvdXAgdG8gYmUgY29tcGxldGUuIEZsdXNoZXMgaW4tcHJvZ3Jlc3MgYW5zd2VycyBmaXJzdCBzbyBub3RoaW5nIHR5cGVkXG4vLyBzbyBmYXIgaXMgbG9zdCwgYnV0IFx1MjAxNCB1bmxpa2UgYWR2YW5jZVFHcm91cCgpIFx1MjAxNCBkb2VzIG5vdCBnYXRlIG9uIGNvbXBsZXRlbmVzc1xuLy8gYW5kIGRvZXMgbm90IHJlc3VibWl0IGFueXRoaW5nLlxuZnVuY3Rpb24ganVtcFRvUUdyb3VwKHRhcmdldEdyb3VwKSB7XG4gIF9mbHVzaEN1cnJlbnRHcm91cEFuc3dlcnMoKTtcbiAgcGVyc2lzdFBvc3RBbmFseXNpc1N0YXRlKCk7XG4gIF9jdXJyZW50R3JvdXAgPSB0YXJnZXRHcm91cDtcbiAgcmVuZGVyUXVlc3Rpb25zUGFuZWwoKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBJbnRlcmFjdGlvbiBoYW5kbGVyc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmFzeW5jIGZ1bmN0aW9uIGRyYWZ0UXVlc3Rpb25SZXNwb25zZShpZHgpIHtcbiAgY29uc3QgcXMgPSB3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zIHx8IFtdO1xuICBjb25zdCBxICA9IHFzW2lkeF07XG4gIGlmICghcSkgcmV0dXJuO1xuXG4gIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBxLWRyYWZ0LWJ0bi0ke2lkeH1gKTtcbiAgY29uc3QgdGEgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHEtaW5wdXQtJHtpZHh9YCk7XG4gIGlmICghYnRuIHx8ICF0YSkgcmV0dXJuO1xuXG4gIGJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gIGJ0bi5pbm5lckhUTUwgPSAnPHNwYW4gY2xhc3M9XCJzcGlubmVyXCIgc3R5bGU9XCJkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDoxMXB4O2hlaWdodDoxMXB4O2JvcmRlcjoycHggc29saWQgY3VycmVudENvbG9yO2JvcmRlci10b3AtY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyLXJhZGl1czo1MCU7YW5pbWF0aW9uOnNwaW4gMC43cyBsaW5lYXIgaW5maW5pdGU7dmVydGljYWwtYWxpZ246bWlkZGxlO1wiPjwvc3Bhbj4nO1xuXG4gIHRyeSB7XG4gICAgbGV0IGFuYWx5c2lzUGF5bG9hZCA9IG51bGw7XG4gICAgY29uc3QgYW5hbHlzaXNTdGF0ZSA9IHN0YXRlTWFuYWdlci5nZXRUYWJEYXRhKCdhbmFseXNpcycpO1xuICAgIGlmIChhbmFseXNpc1N0YXRlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjbGVhbmVkID0gY2xlYW5Kc29uUmVzcG9uc2UoYW5hbHlzaXNTdGF0ZSk7XG4gICAgICAgIGFuYWx5c2lzUGF5bG9hZCA9IHR5cGVvZiBjbGVhbmVkID09PSAnc3RyaW5nJyA/IEpTT04ucGFyc2UoY2xlYW5lZCkgOiBjbGVhbmVkO1xuICAgICAgfSBjYXRjaCAoXykgeyAvKiB1c2UgbnVsbCAqLyB9XG4gICAgfVxuXG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvcG9zdC1hbmFseXNpcy1kcmFmdC1yZXNwb25zZScsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHF1ZXN0aW9uOiBxLnF1ZXN0aW9uLCBxdWVzdGlvbl90eXBlOiBxLnR5cGUsIGFuYWx5c2lzOiBhbmFseXNpc1BheWxvYWQgfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEub2sgJiYgZGF0YS50ZXh0KSB7XG4gICAgICB0YS52YWx1ZSA9IGRhdGEudGV4dDtcbiAgICAgIHVwZGF0ZVFQcm9ncmVzcygpO1xuICAgICAgY29uc3QgaXRlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBxLWl0ZW0tJHtpZHh9YCk7XG4gICAgICBpZiAoaXRlbSkgaXRlbS5xdWVyeVNlbGVjdG9yQWxsKCcucS1jaGlwJykuZm9yRWFjaChjID0+IGMuY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKSk7XG4gICAgICBzaG93RHJhZnRFcnJvcihpZHgsIG51bGwpO1xuICAgICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgYFx1MjcyOCBEcmFmdCBhbnN3ZXIgZm9yIFEke2lkeCArIDF9OlxcblxcbiR7ZGF0YS50ZXh0fVxcblxcblJldmlldyBhbmQgZWRpdCBpbiB0aGUgZmllbGQgYmVsb3cgYmVmb3JlIHN1Ym1pdHRpbmcuYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZy53YXJuKCdEcmFmdCBnZW5lcmF0aW9uIGZhaWxlZDonLCBkYXRhLmVycm9yKTtcbiAgICAgIHNob3dEcmFmdEVycm9yKGlkeCwgZGF0YS5lcnJvciB8fCAnRHJhZnQgZmFpbGVkIFx1MjAxNCBwbGVhc2UgdHJ5IGFnYWluLicpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLmVycm9yKCdEcmFmdCBmZXRjaCBlcnJvcjonLCBlcnIpO1xuICAgIHNob3dEcmFmdEVycm9yKGlkeCwgJ05ldHdvcmsgZXJyb3IgXHUyMDE0IHBsZWFzZSB0cnkgYWdhaW4uJyk7XG4gIH0gZmluYWxseSB7XG4gICAgYnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgYnRuLmlubmVySFRNTCA9ICdcdTI3MjggRHJhZnQnO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNlbGVjdFFDaGlwKGJ0biwgcUlkeCkge1xuICBjb25zdCBwYW5lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBxLWl0ZW0tJHtxSWR4fWApO1xuICBpZiAocGFuZWwpIHtcbiAgICBwYW5lbC5xdWVyeVNlbGVjdG9yQWxsKCcucS1jaGlwJykuZm9yRWFjaChjID0+IGMuY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKSk7XG4gIH1cbiAgYnRuLmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7XG4gIGNvbnN0IHRleHRhcmVhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHEtaW5wdXQtJHtxSWR4fWApO1xuICBpZiAodGV4dGFyZWEpIHtcbiAgICB0ZXh0YXJlYS52YWx1ZSA9IGJ0bi50ZXh0Q29udGVudDtcbiAgICB1cGRhdGVRUHJvZ3Jlc3MoKTtcbiAgfVxuICAvLyBQZXJzaXN0IHRoZSBjaGlwIGFuc3dlciBpbW1lZGlhdGVseSBzbyBpdCBzdXJ2aXZlcyB0YWIgbmF2aWdhdGlvbi5cbiAgY29uc3QgcSA9ICh3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zIHx8IFtdKVtxSWR4XTtcbiAgaWYgKHEpIHtcbiAgICBpZiAoIXdpbmRvdy5xdWVzdGlvbkFuc3dlcnMgfHwgdHlwZW9mIHdpbmRvdy5xdWVzdGlvbkFuc3dlcnMgIT09ICdvYmplY3QnKSB7XG4gICAgICB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzID0ge307XG4gICAgfVxuICAgIHdpbmRvdy5xdWVzdGlvbkFuc3dlcnNbcS50eXBlXSA9IGJ0bi50ZXh0Q29udGVudDtcbiAgICBwZXJzaXN0UG9zdEFuYWx5c2lzU3RhdGUoKTtcbiAgfVxufVxuXG4vLyBDdXJyZW50IHF1ZXN0aW9uLWdyb3VwIGluZGV4IChcdTIyNjQzLXBlci1ncm91cCBmbG93LCBHQVAtMjAxKS5cbmxldCBfY3VycmVudEdyb3VwID0gMDtcbmNvbnN0IEdST1VQX1NJWkUgPSAzO1xuXG4vLyBEZWJvdW5jZSB0aW1lciBmb3IgcGVyc2lzdGluZyBhbnN3ZXJzIHdoaWxlIHRoZSB1c2VyIHR5cGVzLlxubGV0IF9wZXJzaXN0RGVib3VuY2VUaW1lciA9IG51bGw7XG5cbmZ1bmN0aW9uIG9uUUlucHV0Q2hhbmdlKGlkeCkge1xuICB1cGRhdGVRUHJvZ3Jlc3MoKTtcbiAgY29uc3QgcSA9ICh3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zIHx8IFtdKVtpZHhdO1xuICBpZiAoIXEpIHJldHVybjtcbiAgY29uc3QgdGEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcS1pbnB1dC0ke2lkeH1gKTtcbiAgaWYgKCF0YSkgcmV0dXJuO1xuICBpZiAoIXdpbmRvdy5xdWVzdGlvbkFuc3dlcnMgfHwgdHlwZW9mIHdpbmRvdy5xdWVzdGlvbkFuc3dlcnMgIT09ICdvYmplY3QnKSB7XG4gICAgd2luZG93LnF1ZXN0aW9uQW5zd2VycyA9IHt9O1xuICB9XG4gIHdpbmRvdy5xdWVzdGlvbkFuc3dlcnNbcS50eXBlXSA9IHRhLnZhbHVlO1xuXG4gIC8vIERlYm91bmNlLXBlcnNpc3Qgc28gYW5zd2VycyBzdXJ2aXZlIHRhYiBuYXZpZ2F0aW9uIGFuZCBzdGF0dXMgcG9sbGluZy5cbiAgY2xlYXJUaW1lb3V0KF9wZXJzaXN0RGVib3VuY2VUaW1lcik7XG4gIF9wZXJzaXN0RGVib3VuY2VUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gcGVyc2lzdFBvc3RBbmFseXNpc1N0YXRlKCksIDUwMCk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVFQcm9ncmVzcygpIHtcbiAgY29uc3QgcXMgPSB3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zIHx8IFtdO1xuICBjb25zdCBzdG9yZWRBbnN3ZXJzID0gd2luZG93LnF1ZXN0aW9uQW5zd2VycyB8fCB7fTtcbiAgY29uc3QgZ3JvdXBTdGFydCA9IF9jdXJyZW50R3JvdXAgKiBHUk9VUF9TSVpFO1xuICBjb25zdCBncm91cEVuZCAgID0gTWF0aC5taW4oZ3JvdXBTdGFydCArIEdST1VQX1NJWkUsIHFzLmxlbmd0aCk7XG5cbiAgLy8gQ291bnQgYW5zd2VyczogdXNlIERPTSB2YWx1ZXMgZm9yIHRoZSBjdXJyZW50IGdyb3VwIChsaXZlKSwgc3RvcmVkIGZvciBvdGhlcnMuXG4gIGNvbnN0IGFuc3dlcmVkID0gcXMuZmlsdGVyKChxLCBpZHgpID0+IHtcbiAgICBpZiAoaWR4ID49IGdyb3VwU3RhcnQgJiYgaWR4IDwgZ3JvdXBFbmQpIHtcbiAgICAgIGNvbnN0IHRhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHEtaW5wdXQtJHtpZHh9YCk7XG4gICAgICByZXR1cm4gdGEgPyB0YS52YWx1ZS50cmltKCkubGVuZ3RoID4gMCA6ICEhKHN0b3JlZEFuc3dlcnNbcS50eXBlXSB8fCAnJykudHJpbSgpO1xuICAgIH1cbiAgICByZXR1cm4gISEoc3RvcmVkQW5zd2Vyc1txLnR5cGVdIHx8ICcnKS50cmltKCk7XG4gIH0pLmxlbmd0aDtcblxuICBjb25zdCBncm91cEFuc3dlcmVkID0gcXMuc2xpY2UoZ3JvdXBTdGFydCwgZ3JvdXBFbmQpLmZpbHRlcigocSwgbGkpID0+IHtcbiAgICBjb25zdCB0YSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBxLWlucHV0LSR7Z3JvdXBTdGFydCArIGxpfWApO1xuICAgIHJldHVybiB0YSA/IHRhLnZhbHVlLnRyaW0oKS5sZW5ndGggPiAwIDogISEoc3RvcmVkQW5zd2Vyc1txLnR5cGVdIHx8ICcnKS50cmltKCk7XG4gIH0pLmxlbmd0aDtcblxuICBjb25zdCBudW1Hcm91cHMgID0gTWF0aC5jZWlsKHFzLmxlbmd0aCAvIEdST1VQX1NJWkUpO1xuICBjb25zdCBncm91cExhYmVsID0gbnVtR3JvdXBzID4gMVxuICAgID8gYEdyb3VwICR7X2N1cnJlbnRHcm91cCArIDF9IG9mICR7bnVtR3JvdXBzfWBcbiAgICA6IGAke3FzLmxlbmd0aH0gcXVlc3Rpb24ke3FzLmxlbmd0aCA+IDEgPyAncycgOiAnJ31gO1xuXG4gIGNvbnN0IHByb2dyZXNzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncS1wcm9ncmVzcycpO1xuICBpZiAocHJvZ3Jlc3NFbCkge1xuICAgIHByb2dyZXNzRWwudGV4dENvbnRlbnQgPSBgJHtncm91cExhYmVsfSBcdTIwMTQgJHthbnN3ZXJlZH0gb2YgJHtxcy5sZW5ndGh9IGFuc3dlcmVkYDtcbiAgfVxuICBjb25zdCBzdWJtaXRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncS1zdWJtaXQtYnRuJyk7XG4gIGlmIChzdWJtaXRCdG4pIHtcbiAgICBjb25zdCBjdXJyZW50R3JvdXBTaXplID0gZ3JvdXBFbmQgLSBncm91cFN0YXJ0O1xuICAgIHN1Ym1pdEJ0bi5kaXNhYmxlZCA9IGdyb3VwQW5zd2VyZWQgPCBjdXJyZW50R3JvdXBTaXplO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN1Ym1pdEFsbEFuc3dlcnMoKSB7XG4gIC8qIGR1Y2tmbG93OlxuICAgKiAgIGlkOiBxdWVzdGlvbnNfdWlfc3VibWl0X2xpdmVcbiAgICogICBraW5kOiB1aVxuICAgKiAgIHRpbWVzdGFtcDogJzIwMjYtMDMtMjVUMjE6Mzk6NDhaJ1xuICAgKiAgIHN0YXR1czogbGl2ZVxuICAgKiAgIGhhbmRsZXM6XG4gICAqICAgLSB1aTpxdWVzdGlvbnMuc3VibWl0LWFsbFxuICAgKiAgIGNhbGxzOlxuICAgKiAgIC0gUE9TVCAvYXBpL3Bvc3QtYW5hbHlzaXMtcmVzcG9uc2VzXG4gICAqICAgLSBQT1NUIC9hcGkvYWN0aW9uXG4gICAqICAgcmVhZHM6XG4gICAqICAgLSB3aW5kb3c6cG9zdEFuYWx5c2lzUXVlc3Rpb25zXG4gICAqICAgLSBkb206cS1pbnB1dC0qLnZhbHVlXG4gICAqICAgd3JpdGVzOlxuICAgKiAgIC0gd2luZG93OnF1ZXN0aW9uQW5zd2Vyc1xuICAgKiAgIC0gcmVxdWVzdDpQT1NUIC9hcGkvcG9zdC1hbmFseXNpcy1yZXNwb25zZXMuYW5zd2Vyc1xuICAgKiAgIG5vdGVzOiBDb2xsZWN0cyB0aGUgY2xhcmlmeWluZy1xdWVzdGlvbiBhbnN3ZXJzIGZyb20gdGhlIFVJLCBwZXJzaXN0cyB0aGVtIHRvIHNlc3Npb24gc3RhdGUsIGFuZCB0aGVuIGFkdmFuY2VzIGludG8gY3VzdG9taXphdGlvbiByZWNvbW1lbmRhdGlvbiBnZW5lcmF0aW9uLlxuICAgKi9cbiAgY29uc3QgcXMgPSB3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zIHx8IFtdO1xuICBxcy5mb3JFYWNoKChxLCBpZHgpID0+IHtcbiAgICBjb25zdCB0YSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBxLWlucHV0LSR7aWR4fWApO1xuICAgIGlmICh0YSAmJiB0YS52YWx1ZS50cmltKCkpIHtcbiAgICAgIHdpbmRvdy5xdWVzdGlvbkFuc3dlcnNbcS50eXBlXSA9IHRhLnZhbHVlLnRyaW0oKTtcbiAgICB9XG4gIH0pO1xuICBhd2FpdCBwZXJzaXN0UG9zdEFuYWx5c2lzU3RhdGUoKTtcblxuICBjb25zdCBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncS1zdWJtaXQtYnRuJyk7XG4gIGlmIChidG4pIHtcbiAgICBidG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgIGJ0bi5pbm5lckhUTUwgPSAnPHNwYW4gY2xhc3M9XCJzcGlubmVyXCIgc3R5bGU9XCJkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDoxNHB4O2hlaWdodDoxNHB4O2JvcmRlcjoycHggc29saWQgI2ZmZjtib3JkZXItdG9wLWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlci1yYWRpdXM6NTAlO2FuaW1hdGlvbjpzcGluIDAuN3MgbGluZWFyIGluZmluaXRlO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTttYXJnaW4tcmlnaHQ6NnB4O1wiPjwvc3Bhbj5Qcm9jZXNzaW5nXHUyMDI2JztcbiAgfVxuXG4gIHRyeSB7XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgYFx1MjcxMyBUaGFuayB5b3UhICR7cXMubGVuZ3RofSBhbnN3ZXIke3FzLmxlbmd0aCA+IDEgPyAncycgOiAnJ30gc2F2ZWQuIEdlbmVyYXRpbmcgY3VzdG9taXphdGlvbiByZWNvbW1lbmRhdGlvbnNcdTIwMjZgKTtcbiAgICBhd2FpdCBzZW5kQWN0aW9uKCdyZWNvbW1lbmRfY3VzdG9taXphdGlvbnMnKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoYnRuKSB7XG4gICAgICBidG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIGJ0bi5pbm5lckhUTUwgPSAnU3VibWl0IEFuc3dlcnMnO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzaG93RHJhZnRFcnJvcihpZHgsIG1lc3NhZ2UpIHtcbiAgY29uc3Qgcm93ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgI3EtaXRlbS0ke2lkeH0gLnEtYW5zd2VyLXJvd2ApO1xuICBpZiAoIXJvdykgcmV0dXJuO1xuICBsZXQgZXJyRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcS1kcmFmdC1lcnItJHtpZHh9YCk7XG4gIGlmICghbWVzc2FnZSkge1xuICAgIGlmIChlcnJFbCkgZXJyRWwucmVtb3ZlKCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICghZXJyRWwpIHtcbiAgICBlcnJFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGVyckVsLmlkID0gYHEtZHJhZnQtZXJyLSR7aWR4fWA7XG4gICAgZXJyRWwuY2xhc3NOYW1lID0gJ3EtZHJhZnQtZXJyb3InO1xuICAgIHJvdy5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyZW5kJywgZXJyRWwpO1xuICB9XG4gIGVyckVsLnRleHRDb250ZW50ID0gYFx1MjZBMCAke21lc3NhZ2V9YDtcbn1cblxuLy8gTGVnYWN5IGNvbXBhdGliaWxpdHkgc2hpbVxuZnVuY3Rpb24gc2hvd05leHRRdWVzdGlvbigpIHsgcmVuZGVyUXVlc3Rpb25zUGFuZWwoKTsgfVxuXG5mdW5jdGlvbiBoYW5kbGVRdWVzdGlvblJlc3BvbnNlKG1lc3NhZ2UpIHtcbiAgaWYgKCF3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zIHx8IHdpbmRvdy5wb3N0QW5hbHlzaXNRdWVzdGlvbnMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gIGlmICghd2luZG93LndhaXRpbmdGb3JRdWVzdGlvblJlc3BvbnNlKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGlkeCA9IHdpbmRvdy5jdXJyZW50UXVlc3Rpb25JbmRleCB8fCAwO1xuICBjb25zdCBxID0gd2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9uc1tpZHhdO1xuICBpZiAoIXEpIHJldHVybiBmYWxzZTtcbiAgd2luZG93LnF1ZXN0aW9uQW5zd2Vyc1txLnR5cGVdID0gbWVzc2FnZTtcbiAgd2luZG93LndhaXRpbmdGb3JRdWVzdGlvblJlc3BvbnNlID0gZmFsc2U7XG4gIHdpbmRvdy5jdXJyZW50UXVlc3Rpb25JbmRleCA9IGlkeCArIDE7XG4gIHBlcnNpc3RQb3N0QW5hbHlzaXNTdGF0ZSgpO1xuICByZW5kZXJRdWVzdGlvbnNQYW5lbCgpO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gZmluaXNoUG9zdEFuYWx5c2lzUXVlc3Rpb25zKCkge1xuICB3aW5kb3cud2FpdGluZ0ZvclF1ZXN0aW9uUmVzcG9uc2UgPSBmYWxzZTtcbiAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ1RoYW5rIHlvdSBmb3IgdGhvc2UgaW5zaWdodHMhIENsaWNrIFwiUmVjb21tZW5kIEN1c3RvbWl6YXRpb25zXCIgd2hlbiB5b3VcXCdyZSByZWFkeS4nKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEVTIG1vZHVsZSBleHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuZXhwb3J0IHtcbiAgcGVyc2lzdFBvc3RBbmFseXNpc1N0YXRlLFxuICByZW5kZXJRdWVzdGlvbk1hcmtkb3duLFxuICBmZXRjaFBvc3RBbmFseXNpc1F1ZXN0aW9uc0Zyb21BcGksXG4gIGFza1Bvc3RBbmFseXNpc1F1ZXN0aW9ucyxcbiAgcG9wdWxhdGVRdWVzdGlvbnNUYWIsXG4gIHJlbmRlclF1ZXN0aW9uc1BhbmVsLFxuICBkcmFmdFF1ZXN0aW9uUmVzcG9uc2UsXG4gIHNlbGVjdFFDaGlwLFxuICBvblFJbnB1dENoYW5nZSxcbiAgdXBkYXRlUVByb2dyZXNzLFxuICBzdWJtaXRBbGxBbnN3ZXJzLFxuICBzaG93RHJhZnRFcnJvcixcbiAgc2hvd05leHRRdWVzdGlvbixcbiAgaGFuZGxlUXVlc3Rpb25SZXNwb25zZSxcbiAgZmluaXNoUG9zdEFuYWx5c2lzUXVlc3Rpb25zLFxuICBhZHZhbmNlUUdyb3VwLFxuICBqdW1wVG9RR3JvdXAsXG59O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuZnVuY3Rpb24gZXllU2xhc2hJY29uKCkge1xuICByZXR1cm4gYFxuICAgIDxzdmcgY2xhc3M9XCJpY29uLWdseXBoXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIGZvY3VzYWJsZT1cImZhbHNlXCI+XG4gICAgICA8cGF0aCBkPVwiTTMgM2wxOCAxOFwiPjwvcGF0aD5cbiAgICAgIDxwYXRoIGQ9XCJNMTAuNTggMTAuNThhMiAyIDAgMCAwIDIuODMgMi44M1wiPjwvcGF0aD5cbiAgICAgIDxwYXRoIGQ9XCJNOS44OCA1LjA5QTEwLjk0IDEwLjk0IDAgMCAxIDEyIDVjNSAwIDkuMjcgMy4xMSAxMSA3LTEuMDQgMi4zNS0yLjc4IDQuMzItNC45NiA1LjQ1XCI+PC9wYXRoPlxuICAgICAgPHBhdGggZD1cIk02LjYxIDYuNjFDNC42MiA3LjkgMy4wMyA5Ljc5IDIgMTJjMS43MyAzLjg5IDYgNyAxMCA3IDEuNTIgMCAyLjk4LS4zNiA0LjI5LTFcIj48L3BhdGg+XG4gICAgPC9zdmc+XG4gIGA7XG59XG5cbmV4cG9ydCB7IGV5ZVNsYXNoSWNvbiB9O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvZXhwZXJpZW5jZS1yZXZpZXcuanNcbiAqIEV4cGVyaWVuY2UtcmV2aWV3IHRhYmxlOiBmZXRjaCwgcmVuZGVyLCByb3ctcmVvcmRlciwgYW5kIHN1Ym1pdCBkZWNpc2lvbnMuXG4gKlxuICogRGVwZW5kZW5jaWVzIChyZXNvbHZlZCB0aHJvdWdoIGdsb2JhbFRoaXMgYXQgcnVudGltZSk6XG4gKiAgIHVzZXJTZWxlY3Rpb25zLCBwZW5kaW5nUmVjb21tZW5kYXRpb25zLCBfc2F2ZWREZWNpc2lvbnMsIF9leHBlcmllbmNlc09yZGVyZWQsXG4gKiAgIHBhcnNlU3RhdHVzUmVzcG9uc2UsIGdldEV4cGVyaWVuY2VSZWNvbW1lbmRhdGlvbiwgZ2V0Q29uZmlkZW5jZUxldmVsLFxuICogICBnZXRFeHBlcmllbmNlUmVhc29uaW5nLCBlc2NhcGVIdG1sLCBzaG93QnVsbGV0UmVvcmRlcixcbiAqICAgaGFuZGxlQWN0aW9uQ2xpY2ssIGJ1bGtBY3Rpb24sIF91cGRhdGVQYWdlRXN0aW1hdGUsXG4gKiAgIHVwZGF0ZUluY2x1c2lvbkNvdW50cywgc3dpdGNoVGFiLFxuICogICBzaG93QWxlcnRNb2RhbCwgc2hvd1RvYXN0LCBzY2hlZHVsZUF0c1JlZnJlc2gsXG4gKiAgICQsICQuZm4uRGF0YVRhYmxlIChqUXVlcnkgKyBEYXRhVGFibGVzKVxuICovXG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmNvbnN0IGxvZyA9IGdldExvZ2dlcignZXhwZXJpZW5jZS1yZXZpZXcnKTtcblxuaW1wb3J0IHsgc3RhdGVNYW5hZ2VyIH0gZnJvbSAnLi9zdGF0ZS1tYW5hZ2VyLmpzJztcbmltcG9ydCB7IGV5ZVNsYXNoSWNvbiB9IGZyb20gJy4vcmV2aWV3LWljb25zLmpzJztcblxuZnVuY3Rpb24gX2ZpbmRFeHBlcmllbmNlUmVjb21tZW5kYXRpb25SZWNvcmQoZXhwSWQsIGRhdGEpIHtcbiAgaWYgKCFkYXRhIHx8ICFBcnJheS5pc0FycmF5KGRhdGEuZXhwZXJpZW5jZV9yZWNvbW1lbmRhdGlvbnMpKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIGRhdGEuZXhwZXJpZW5jZV9yZWNvbW1lbmRhdGlvbnMuZmluZCgocmVjKSA9PiBTdHJpbmcocmVjPy5pZCB8fCByZWM/LmV4cGVyaWVuY2VfaWQgfHwgJycpID09PSBTdHJpbmcoZXhwSWQpKSB8fCBudWxsO1xufVxuXG5mdW5jdGlvbiBfZm9ybWF0U3VnZ2VzdGVkT3JkZXJTdW1tYXJ5KG9yZGVyKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShvcmRlcikgfHwgb3JkZXIubGVuZ3RoIDwgMikgcmV0dXJuICcnO1xuICByZXR1cm4gb3JkZXIubWFwKChpZHgpID0+IFN0cmluZyhOdW1iZXIoaWR4KSArIDEpKS5qb2luKCcgLT4gJyk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFeHBlcmllbmNlIGRldGFpbHMgZmV0Y2ggXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIGdldEV4cGVyaWVuY2VEZXRhaWxzKGV4cElkKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvZXhwZXJpZW5jZS1kZXRhaWxzJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgZXhwZXJpZW5jZV9pZDogZXhwSWQgfSlcbiAgICB9KTtcblxuICAgIGlmIChyZXMub2spIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgcmV0dXJuIGRhdGEuZXhwZXJpZW5jZSB8fCBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2cud2FybignQ291bGQgbm90IGZldGNoIGV4cGVyaWVuY2UgZGV0YWlscyBmb3InLCBleHBJZCk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nLndhcm4oJ0Vycm9yIGZldGNoaW5nIGV4cGVyaWVuY2UgZGV0YWlsczonLCBlcnJvcik7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIFJlcnVuIHNuYXBzaG90IChjaGFuZ2UgYmFkZ2UgZm9yIGV4cGVyaWVuY2VzKSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmZ1bmN0aW9uIF9leHBTbmFwc2hvdEtleSgpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzaWQgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpLmdldCgnc2Vzc2lvbicpO1xuICAgIHJldHVybiBzaWQgPyBgZXhwX3NuYXBfJHtzaWR9YCA6IG51bGw7XG4gIH0gY2F0Y2ggKF8pIHsgcmV0dXJuIG51bGw7IH1cbn1cbmZ1bmN0aW9uIF9zYXZlRXhwU25hcHNob3QocmVjb21tZW5kZWRJZHMpIHtcbiAgY29uc3Qga2V5ID0gX2V4cFNuYXBzaG90S2V5KCk7XG4gIGlmICgha2V5KSByZXR1cm47XG4gIHRyeSB7IGxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgSlNPTi5zdHJpbmdpZnkoWy4uLnJlY29tbWVuZGVkSWRzXSkpOyB9IGNhdGNoIChfKSB7fVxufVxuZnVuY3Rpb24gX2dldEV4cFNuYXBzaG90KCkge1xuICBjb25zdCBrZXkgPSBfZXhwU25hcHNob3RLZXkoKTtcbiAgaWYgKCFrZXkpIHJldHVybiBudWxsO1xuICB0cnkge1xuICAgIGNvbnN0IHJhdyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7XG4gICAgcmV0dXJuIHJhdyA/IG5ldyBTZXQoSlNPTi5wYXJzZShyYXcpKSA6IG51bGw7XG4gIH0gY2F0Y2ggKF8pIHsgcmV0dXJuIG51bGw7IH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIEJ1aWxkIHJldmlldyB0YWJsZSAoZmV0Y2ggKyBpbml0aWFsaXNlKSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gYnVpbGRFeHBlcmllbmNlUmV2aWV3VGFibGUoKSB7XG4gIGNvbnN0IGRhdGEgPSB3aW5kb3cucGVuZGluZ1JlY29tbWVuZGF0aW9ucztcbiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cGVyaWVuY2UtdGFibGUtY29udGFpbmVyJyk7XG4gIGlmICghY29udGFpbmVyKSByZXR1cm47XG5cbiAgY29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwiZW1wdHktc3RhdGVcIj48ZGl2IGNsYXNzPVwibG9hZGluZy1zcGlubmVyXCI+PC9kaXY+PHAgc3R5bGU9XCJtYXJnaW4tdG9wOjEycHg7Y29sb3I6IzY0NzQ4YjtcIj5Mb2FkaW5nIGV4cGVyaWVuY2UgcmVjb21tZW5kYXRpb25zXHUyMDI2PC9wPjwvZGl2Pic7XG5cbiAgbGV0IGFsbEV4cGVyaWVuY2VJZHMgPSBbXTtcbiAgbGV0IHNhdmVkUm93T3JkZXIgPSBbXTtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0dXNSZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9zdGF0dXMnKTtcbiAgICBjb25zdCBzdGF0dXNEYXRhID0gcGFyc2VTdGF0dXNSZXNwb25zZShhd2FpdCBzdGF0dXNSZXMuanNvbigpKTtcbiAgICBhbGxFeHBlcmllbmNlSWRzID0gc3RhdHVzRGF0YS5hbGxfZXhwZXJpZW5jZV9pZHMgfHwgZGF0YS5yZWNvbW1lbmRlZF9leHBlcmllbmNlcyB8fCBbXTtcbiAgICBzYXZlZFJvd09yZGVyICAgID0gQXJyYXkuaXNBcnJheShzdGF0dXNEYXRhLmV4cGVyaWVuY2Vfcm93X29yZGVyKSA/IHN0YXR1c0RhdGEuZXhwZXJpZW5jZV9yb3dfb3JkZXIgOiBbXTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBhbGxFeHBlcmllbmNlSWRzID0gZGF0YS5yZWNvbW1lbmRlZF9leHBlcmllbmNlcyB8fCBbXTtcbiAgfVxuXG4gIGNvbnN0IHJlY29tbWVuZGVkU2V0ID0gbmV3IFNldChkYXRhLnJlY29tbWVuZGVkX2V4cGVyaWVuY2VzIHx8IFtdKTtcblxuICAvLyBGZXRjaCBhbGwgZXhwZXJpZW5jZSBkZXRhaWxzXG4gIGNvbnN0IGV4cGVyaWVuY2VzV2l0aERldGFpbHMgPSBbXTtcbiAgZm9yIChjb25zdCBleHBJZCBvZiBhbGxFeHBlcmllbmNlSWRzKSB7XG4gICAgY29uc3QgZGV0YWlscyA9IGF3YWl0IGdldEV4cGVyaWVuY2VEZXRhaWxzKGV4cElkKTtcbiAgICBleHBlcmllbmNlc1dpdGhEZXRhaWxzLnB1c2goeyBpZDogZXhwSWQsIGRldGFpbHMgfSk7XG4gIH1cblxuICAvLyBPbiBmaXJzdCBsb2FkOiByZXN0b3JlIHVzZXIncyBzYXZlZCBvcmRlciBpZiBwcmVzZW50OyBvdGhlcndpc2UgZGVmYXVsdC1zb3J0XG4gIC8vIHdpdGggcHJlc2VudC9jdXJyZW50IHBvc2l0aW9ucyBmaXJzdCwgdGhlbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgYnkgZW5kIGRhdGUuXG4gIC8vIE9uIHJlLXJlbmRlciwgcHJlc2VydmUgdGhlIGluLW1lbW9yeSB1c2VyIG9yZGVyLlxuICBpZiAoIXdpbmRvdy5fZXhwZXJpZW5jZXNPcmRlcmVkKSB7XG4gICAgaWYgKHNhdmVkUm93T3JkZXIubGVuZ3RoID4gMCkge1xuICAgICAgLy8gUmVzdG9yZSB1c2VyJ3MgZXhwbGljaXRseSBzYXZlZCBvcmRlcmluZyBmcm9tIHRoZSBzZXNzaW9uXG4gICAgICBjb25zdCBvcmRlck1hcCA9IE9iamVjdC5mcm9tRW50cmllcyhzYXZlZFJvd09yZGVyLm1hcCgoaWQsIGkpID0+IFtpZCwgaV0pKTtcbiAgICAgIGV4cGVyaWVuY2VzV2l0aERldGFpbHMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICBjb25zdCBhaSA9IG9yZGVyTWFwW2EuaWRdID8/IHNhdmVkUm93T3JkZXIubGVuZ3RoO1xuICAgICAgICBjb25zdCBiaSA9IG9yZGVyTWFwW2IuaWRdID8/IHNhdmVkUm93T3JkZXIubGVuZ3RoO1xuICAgICAgICByZXR1cm4gYWkgLSBiaTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEZWZhdWx0OiBzb3J0IGJ5IExMTSByZWNvbW1lbmRhdGlvbiBzdHJlbmd0aCBmaXJzdCwgdGhlbiByZXZlcnNlLWNocm9ub2xvZ2ljYWxcbiAgICAgIGNvbnN0IF9BQ1RJT05fUkFOSyA9IHsgZW1waGFzaXplOiAwLCBpbmNsdWRlOiAxLCAnZGUtZW1waGFzaXplJzogMiwgZXhjbHVkZTogMyB9O1xuICAgICAgY29uc3QgX3BhcnNlRW5kS2V5ID0gKGV4cCkgPT4ge1xuICAgICAgICBjb25zdCByYXcgPSAoZXhwLmRldGFpbHM/LmVuZF9kYXRlIHx8IGV4cC5kZXRhaWxzPy5lbmQgfHwgJycpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoIXJhdyB8fCBbJ3ByZXNlbnQnLCAnY3VycmVudCcsICdub3cnLCAnb25nb2luZyddLmluY2x1ZGVzKHJhdykpIHJldHVybiAnOTk5OS0xMic7XG4gICAgICAgIGlmICgvXlxcZHs0fSQvLnRlc3QocmF3KSkgcmV0dXJuIHJhdyArICctMTInO1xuICAgICAgICByZXR1cm4gcmF3O1xuICAgICAgfTtcbiAgICAgIGNvbnN0IF9nZXRBY3Rpb25SYW5rID0gKGV4cCkgPT4ge1xuICAgICAgICBjb25zdCByZWMgPSBnZXRFeHBlcmllbmNlUmVjb21tZW5kYXRpb24oZXhwLmlkLCBkYXRhKTtcbiAgICAgICAgaWYgKCFyZWMpIHJldHVybiAxOyAvLyBkZWZhdWx0IHRvICdpbmNsdWRlJyByYW5rIHdoZW4gbm8gcmVjb21tZW5kYXRpb25cbiAgICAgICAgaWYgKHJlYyA9PT0gJ0VtcGhhc2l6ZScpICAgIHJldHVybiAwO1xuICAgICAgICBpZiAocmVjID09PSAnSW5jbHVkZScpICAgICAgcmV0dXJuIDE7XG4gICAgICAgIGlmIChyZWMgPT09ICdEZS1lbXBoYXNpemUnKSByZXR1cm4gMjtcbiAgICAgICAgaWYgKHJlYyA9PT0gJ09taXQnKSAgICAgICAgIHJldHVybiAzO1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH07XG4gICAgICBleHBlcmllbmNlc1dpdGhEZXRhaWxzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgY29uc3QgcmFua0RpZmYgPSBfZ2V0QWN0aW9uUmFuayhhKSAtIF9nZXRBY3Rpb25SYW5rKGIpO1xuICAgICAgICBpZiAocmFua0RpZmYgIT09IDApIHJldHVybiByYW5rRGlmZjtcbiAgICAgICAgcmV0dXJuIF9wYXJzZUVuZEtleShiKS5sb2NhbGVDb21wYXJlKF9wYXJzZUVuZEtleShhKSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgd2luZG93Ll9leHBlcmllbmNlc09yZGVyZWQgPSBleHBlcmllbmNlc1dpdGhEZXRhaWxzO1xuICB9IGVsc2Uge1xuICAgIC8vIE1lcmdlIGFueSBuZXdseSBkaXNjb3ZlcmVkIGV4cGVyaWVuY2VzIGludG8gdGhlIGNhY2hlZCBvcmRlclxuICAgIGNvbnN0IGtub3duSWRzID0gbmV3IFNldCh3aW5kb3cuX2V4cGVyaWVuY2VzT3JkZXJlZC5tYXAoZSA9PiBlLmlkKSk7XG4gICAgZm9yIChjb25zdCBleHAgb2YgZXhwZXJpZW5jZXNXaXRoRGV0YWlscykge1xuICAgICAgaWYgKCFrbm93bklkcy5oYXMoZXhwLmlkKSkgd2luZG93Ll9leHBlcmllbmNlc09yZGVyZWQucHVzaChleHApO1xuICAgIH1cbiAgfVxuXG4gIC8vIENvbXB1dGUgd2hpY2ggcmVjb21tZW5kYXRpb25zIGFyZSBuZXcgc2luY2UgbGFzdCByZW5kZXIgKHJlcnVuIGNoYW5nZSBiYWRnZXMpXG4gIGNvbnN0IHByZXZFeHBTbmFwID0gX2dldEV4cFNuYXBzaG90KCk7XG4gIGNvbnN0IG5ld1JlY29tbWVuZGVkRXhwcyA9IHByZXZFeHBTbmFwXG4gICAgPyBuZXcgU2V0KFsuLi5yZWNvbW1lbmRlZFNldF0uZmlsdGVyKGlkID0+ICFwcmV2RXhwU25hcC5oYXMoaWQpKSlcbiAgICA6IG5ldyBTZXQoKTtcbiAgX3NhdmVFeHBTbmFwc2hvdChyZWNvbW1lbmRlZFNldCk7XG5cbiAgLy8gSW5pdGlhbGlzZSBzYXZlZCBkZWNpc2lvbnNcbiAgY29uc3Qgc2F2ZWRFeHBEZWNzID0gd2luZG93Ll9zYXZlZERlY2lzaW9ucz8uZXhwZXJpZW5jZV9kZWNpc2lvbnMgfHwge307XG4gIGZvciAoY29uc3QgeyBpZDogZXhwSWQgfSBvZiB3aW5kb3cuX2V4cGVyaWVuY2VzT3JkZXJlZCkge1xuICAgIGNvbnN0IHJlY29tbWVuZGF0aW9uID0gZ2V0RXhwZXJpZW5jZVJlY29tbWVuZGF0aW9uKGV4cElkLCBkYXRhKTtcbiAgICBjb25zdCBpc1JlY29tbWVuZGVkICA9IHJlY29tbWVuZGVkU2V0LmhhcyhleHBJZCk7XG4gICAgbGV0IGRlZmF1bHRBY3Rpb24gPSAnZXhjbHVkZSc7XG4gICAgaWYgICAgICAocmVjb21tZW5kYXRpb24gPT09ICdFbXBoYXNpemUnKSAgICBkZWZhdWx0QWN0aW9uID0gJ2VtcGhhc2l6ZSc7XG4gICAgZWxzZSBpZiAocmVjb21tZW5kYXRpb24gPT09ICdJbmNsdWRlJykgICAgICBkZWZhdWx0QWN0aW9uID0gJ2luY2x1ZGUnO1xuICAgIGVsc2UgaWYgKHJlY29tbWVuZGF0aW9uID09PSAnRGUtZW1waGFzaXplJykgZGVmYXVsdEFjdGlvbiA9ICdkZS1lbXBoYXNpemUnO1xuICAgIGVsc2UgaWYgKHJlY29tbWVuZGF0aW9uID09PSAnT21pdCcpICAgICAgICAgZGVmYXVsdEFjdGlvbiA9ICdleGNsdWRlJztcbiAgICBlbHNlIGlmIChpc1JlY29tbWVuZGVkKSAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRBY3Rpb24gPSAnaW5jbHVkZSc7XG4gICAgdXNlclNlbGVjdGlvbnMuZXhwZXJpZW5jZXNbZXhwSWRdID0gc2F2ZWRFeHBEZWNzW2V4cElkXSB8fCBkZWZhdWx0QWN0aW9uO1xuICB9XG5cbiAgX3JlbmRlckV4cGVyaWVuY2VUYWJsZShjb250YWluZXIsIHJlY29tbWVuZGVkU2V0LCBkYXRhLCBuZXdSZWNvbW1lbmRlZEV4cHMpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgUmVuZGVyIHRhYmxlIEhUTUwgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIF9yZW5kZXJFeHBlcmllbmNlVGFibGUoY29udGFpbmVyLCByZWNvbW1lbmRlZFNldCwgZGF0YSwgbmV3UmVjb21tZW5kZWRFeHBzID0gbmV3IFNldCgpKSB7XG4gIGlmICghY29udGFpbmVyKSBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwZXJpZW5jZS10YWJsZS1jb250YWluZXInKTtcbiAgaWYgKCFjb250YWluZXIpIHJldHVybjtcbiAgaWYgKCFyZWNvbW1lbmRlZFNldCkgcmVjb21tZW5kZWRTZXQgPSBuZXcgU2V0KCh3aW5kb3cucGVuZGluZ1JlY29tbWVuZGF0aW9ucz8ucmVjb21tZW5kZWRfZXhwZXJpZW5jZXMpIHx8IFtdKTtcbiAgaWYgKCFkYXRhKSBkYXRhID0gd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnM7XG5cbiAgLy8gRGVzdHJveSBhbnkgZXhpc3RpbmcgRGF0YVRhYmxlIGJlZm9yZSByZWJ1aWxkaW5nXG4gIGlmICgkLmZuLkRhdGFUYWJsZS5pc0RhdGFUYWJsZSgnI2V4cGVyaWVuY2UtcmV2aWV3LXRhYmxlJykpIHtcbiAgICAkKCcjZXhwZXJpZW5jZS1yZXZpZXctdGFibGUnKS5EYXRhVGFibGUoKS5kZXN0cm95KCk7XG4gIH1cblxuICBjb25zdCBleHBzID0gd2luZG93Ll9leHBlcmllbmNlc09yZGVyZWQgfHwgW107XG4gIGxldCB0YWJsZUhUTUwgPSBgXG4gICAgPHRhYmxlIGlkPVwiZXhwZXJpZW5jZS1yZXZpZXctdGFibGVcIiBjbGFzcz1cInJldmlldy10YWJsZVwiPlxuICAgICAgPHRoZWFkPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRoPkV4cGVyaWVuY2U8L3RoPlxuICAgICAgICAgIDx0aD5EYXRlczwvdGg+XG4gICAgICAgICAgPHRoPlJlY29tbWVuZGF0aW9uPC90aD5cbiAgICAgICAgICA8dGg+Q29uZmlkZW5jZTwvdGg+XG4gICAgICAgICAgPHRoPlJlYXNvbmluZzwvdGg+XG4gICAgICAgICAgPHRoPllvdXIgU2VsZWN0aW9uPC90aD5cbiAgICAgICAgPC90cj5cbiAgICAgIDwvdGhlYWQ+XG4gICAgICA8dGJvZHk+XG4gIGA7XG5cbiAgZXhwcy5mb3JFYWNoKCh7IGlkOiBleHBJZCwgZGV0YWlscyB9LCByb3dJZHgpID0+IHtcbiAgICBjb25zdCByZWNvbW1lbmRhdGlvbiAgICA9IGdldEV4cGVyaWVuY2VSZWNvbW1lbmRhdGlvbihleHBJZCwgZGF0YSk7XG4gICAgY29uc3QgY29uZmlkZW5jZSAgICAgICAgPSBnZXRDb25maWRlbmNlTGV2ZWwoZXhwSWQsIGRhdGEpO1xuICAgIGNvbnN0IHJlYXNvbmluZyAgICAgICAgID0gZ2V0RXhwZXJpZW5jZVJlYXNvbmluZyhleHBJZCwgZGF0YSk7XG4gICAgY29uc3QgcmVjUmVjb3JkICAgICAgICAgPSBfZmluZEV4cGVyaWVuY2VSZWNvbW1lbmRhdGlvblJlY29yZChleHBJZCwgZGF0YSk7XG4gICAgY29uc3QgYnVsbGV0T3JkZXIgICAgICAgPSByZWNSZWNvcmQgJiYgdHlwZW9mIHJlY1JlY29yZC5idWxsZXRfb3JkZXIgPT09ICdvYmplY3QnID8gcmVjUmVjb3JkLmJ1bGxldF9vcmRlciA6IG51bGw7XG4gICAgY29uc3QgYnVsbGV0T3JkZXJTdW1tYXJ5ID0gX2Zvcm1hdFN1Z2dlc3RlZE9yZGVyU3VtbWFyeShidWxsZXRPcmRlcj8ub3JkZXIpO1xuICAgIGNvbnN0IHRpdGxlICAgICAgICAgICAgID0gZGV0YWlscyA/IGRldGFpbHMudGl0bGUgICA6IGV4cElkO1xuICAgIGNvbnN0IGNvbXBhbnkgICAgICAgICAgID0gZGV0YWlscyA/IGRldGFpbHMuY29tcGFueSA6ICcnO1xuICAgIGNvbnN0IHN0YXJ0RGF0ZSAgICAgICAgID0gZGV0YWlscz8uc3RhcnRfZGF0ZSB8fCAnJztcbiAgICBjb25zdCBlbmREYXRlICAgICAgICAgICA9IGRldGFpbHM/LmVuZF9kYXRlICAgfHwgJ3ByZXNlbnQnO1xuICAgIGNvbnN0IGR1cmF0aW9uICAgICAgICAgID0gc3RhcnREYXRlID8gYCR7c3RhcnREYXRlfSAtICR7ZW5kRGF0ZX1gIDogKGRldGFpbHM/LmR1cmF0aW9uIHx8ICcnKTtcbiAgICBjb25zdCBkZWZhdWx0QWN0aW9uICAgICA9IHVzZXJTZWxlY3Rpb25zLmV4cGVyaWVuY2VzW2V4cElkXSB8fCAnaW5jbHVkZSc7XG4gICAgY29uc3QgcmVjb21tZW5kYXRpb25UZXh0ID0gcmVjb21tZW5kYXRpb24gfHwgJ0luY2x1ZGUnO1xuICAgIGNvbnN0IGNvbmZpZGVuY2VCYWRnZSAgID0gYDxzcGFuIGNsYXNzPVwiY29uZmlkZW5jZS1iYWRnZSBjb25maWRlbmNlLSR7Y29uZmlkZW5jZS5sZXZlbH1cIj4ke2NvbmZpZGVuY2UudGV4dH08L3NwYW4+YDtcbiAgICBjb25zdCByZWFzb25pbmdTZWdtZW50cyA9IFtyZWFzb25pbmcgfHwgJ1RoaXMgZXhwZXJpZW5jZSB3YXMgc2VsZWN0ZWQgYmFzZWQgb24gaXRzIHJlbGV2YW5jZSB0byB0aGUgcG9zaXRpb24gcmVxdWlyZW1lbnRzLiddO1xuICAgIGlmIChidWxsZXRPcmRlclN1bW1hcnkpIHJlYXNvbmluZ1NlZ21lbnRzLnB1c2goYFN1Z2dlc3RlZCBidWxsZXQgb3JkZXI6ICR7YnVsbGV0T3JkZXJTdW1tYXJ5fS5gKTtcbiAgICBpZiAoYnVsbGV0T3JkZXI/LnJlYXNvbmluZykgcmVhc29uaW5nU2VnbWVudHMucHVzaChTdHJpbmcoYnVsbGV0T3JkZXIucmVhc29uaW5nKSk7XG4gICAgaWYgKGJ1bGxldE9yZGVyPy5hdHNfaW1wYWN0KSByZWFzb25pbmdTZWdtZW50cy5wdXNoKGBBVFMgaW1wYWN0OiAke2J1bGxldE9yZGVyLmF0c19pbXBhY3R9YCk7XG4gICAgaWYgKGJ1bGxldE9yZGVyPy5wYWdlX2xlbmd0aF9pbXBhY3QpIHJlYXNvbmluZ1NlZ21lbnRzLnB1c2goYFBhZ2UgbGVuZ3RoIGltcGFjdDogJHtidWxsZXRPcmRlci5wYWdlX2xlbmd0aF9pbXBhY3R9YCk7XG4gICAgY29uc3QgcmVhc29uaW5nVGV4dCAgICAgPSByZWFzb25pbmdTZWdtZW50cy5qb2luKCcgJyk7XG4gICAgY29uc3QgaXNGaXJzdCAgICAgICAgICAgPSByb3dJZHggPT09IDA7XG4gICAgY29uc3QgaXNMYXN0ICAgICAgICAgICAgPSByb3dJZHggPT09IGV4cHMubGVuZ3RoIC0gMTtcbiAgICBjb25zdCB0aXRsZUVzYyAgICAgICAgICA9IGVzY2FwZUh0bWwodGl0bGUpO1xuICAgIGNvbnN0IHJlcnVuTmV3QmFkZ2UgPSBuZXdSZWNvbW1lbmRlZEV4cHMuaGFzKGV4cElkKVxuICAgICAgPyAnPHNwYW4gY2xhc3M9XCJydy1jaGFuZ2UtYmFkZ2UgcnctY2hhbmdlLW5ld1wiIGFyaWEtbGFiZWw9XCJOZXcgcmVjb21tZW5kYXRpb24gc2luY2UgcHJldmlvdXMgcnVuXCI+XHVEODNDXHVERDk1IE5ldzwvc3Bhbj4nXG4gICAgICA6ICcnO1xuXG4gICAgdGFibGVIVE1MICs9IGBcbiAgICAgIDx0ciBkYXRhLWV4cC1pZD1cIiR7ZXhwSWR9XCIgZGF0YS1zdGFydC1kYXRlPVwiJHtzdGFydERhdGV9XCI+XG4gICAgICAgIDx0ZD5cbiAgICAgICAgICA8c3Ryb25nPiR7dGl0bGVFc2N9PC9zdHJvbmc+JHtyZXJ1bk5ld0JhZGdlfTxicj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiM2YjcyODA7XCI+JHtlc2NhcGVIdG1sKGNvbXBhbnkpfTwvc3Bhbj5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwid2hpdGUtc3BhY2U6bm93cmFwO1wiPiR7ZXNjYXBlSHRtbChkdXJhdGlvbil9PC90ZD5cbiAgICAgICAgPHRkPjxzdHJvbmc+JHtlc2NhcGVIdG1sKHJlY29tbWVuZGF0aW9uVGV4dCl9PC9zdHJvbmc+PC90ZD5cbiAgICAgICAgPHRkPiR7Y29uZmlkZW5jZUJhZGdlfTwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cIm1heC13aWR0aDozMDBweDtcIj48c21hbGw+JHtlc2NhcGVIdG1sKHJlYXNvbmluZ1RleHQpfTwvc21hbGw+PC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwiYWN0aW9uLWJ0bnNcIiBzdHlsZT1cIndoaXRlLXNwYWNlOm5vd3JhcDtcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG4gJHtkZWZhdWx0QWN0aW9uID09PSAnZW1waGFzaXplJyAgICA/ICdhY3RpdmUnIDogJyd9XCIgZGF0YS1hY3Rpb249XCJlbXBoYXNpemVcIiAgICBhcmlhLWxhYmVsPVwiRW1waGFzaXplICR7dGl0bGVFc2N9XCIgICAgICAgYXJpYS1wcmVzc2VkPVwiJHtkZWZhdWx0QWN0aW9uID09PSAnZW1waGFzaXplJ31cIiAgICB0aXRsZT1cIkVtcGhhc2l6ZSBcdTIwMTQgZmVhdHVyZSBwcm9taW5lbnRseVwiIHN0eWxlPVwiY29sb3I6IzEwYjk4MTtcIj5cdTI3OTU8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG4gJHtkZWZhdWx0QWN0aW9uID09PSAnaW5jbHVkZScgICAgICA/ICdhY3RpdmUnIDogJyd9XCIgZGF0YS1hY3Rpb249XCJpbmNsdWRlXCIgICAgICBhcmlhLWxhYmVsPVwiSW5jbHVkZSAke3RpdGxlRXNjfVwiICAgICAgICAgYXJpYS1wcmVzc2VkPVwiJHtkZWZhdWx0QWN0aW9uID09PSAnaW5jbHVkZSd9XCIgICAgICB0aXRsZT1cIkluY2x1ZGUgXHUyMDE0IHN0YW5kYXJkIHRyZWF0bWVudFwiPlx1MjcxMzwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0biAke2RlZmF1bHRBY3Rpb24gPT09ICdkZS1lbXBoYXNpemUnID8gJ2FjdGl2ZScgOiAnJ31cIiBkYXRhLWFjdGlvbj1cImRlLWVtcGhhc2l6ZVwiIGFyaWEtbGFiZWw9XCJEZS1lbXBoYXNpemUgJHt0aXRsZUVzY31cIiAgICBhcmlhLXByZXNzZWQ9XCIke2RlZmF1bHRBY3Rpb24gPT09ICdkZS1lbXBoYXNpemUnfVwiIHRpdGxlPVwiRGUtZW1waGFzaXplIFx1MjAxNCBicmllZiBtZW50aW9uXCIgICAgc3R5bGU9XCJjb2xvcjojZjU5ZTBiO1wiPlx1Mjc5NjwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0biAke2RlZmF1bHRBY3Rpb24gPT09ICdleGNsdWRlJyAgICAgID8gJ2FjdGl2ZScgOiAnJ31cIiBkYXRhLWFjdGlvbj1cImV4Y2x1ZGVcIiAgICAgIGFyaWEtbGFiZWw9XCJFeGNsdWRlICR7dGl0bGVFc2N9XCIgICAgICAgICBhcmlhLXByZXNzZWQ9XCIke2RlZmF1bHRBY3Rpb24gPT09ICdleGNsdWRlJ31cIiAgICAgIHRpdGxlPVwiRXhjbHVkZSBcdTIwMTQgb21pdCBmcm9tIENWXCIgICAgICAgICAgc3R5bGU9XCJjb2xvcjojZWY0NDQ0O1wiPiR7ZXllU2xhc2hJY29uKCl9PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgZGF0YS1hY3Rpb249XCJyZW9yZGVyXCIgYXJpYS1sYWJlbD1cIlJlb3JkZXIgYnVsbGV0cyBmb3IgJHt0aXRsZUVzY31cIiB0aXRsZT1cIiR7YnVsbGV0T3JkZXJTdW1tYXJ5ID8gYFJlb3JkZXIgYnVsbGV0IHBvaW50cyAoQUkgc3VnZ2VzdGVkIG9yZGVyICR7YnVsbGV0T3JkZXJTdW1tYXJ5fSlgIDogJ1Jlb3JkZXIgYnVsbGV0IHBvaW50cyd9XCIgc3R5bGU9XCJjb2xvcjojNjM2NmYxO1wiPlx1MjE5NTwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIGRhdGEtYWN0aW9uPVwicm93LXVwXCIgICBhcmlhLWxhYmVsPVwiTW92ZSAke3RpdGxlRXNjfSBlYXJsaWVyIGluIENWXCIgdGl0bGU9XCJNb3ZlIHVwIGluIENWXCIgICAke2lzRmlyc3QgPyAnZGlzYWJsZWQnIDogJyd9Plx1MjE5MTwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIGRhdGEtYWN0aW9uPVwicm93LWRvd25cIiBhcmlhLWxhYmVsPVwiTW92ZSAke3RpdGxlRXNjfSBsYXRlciBpbiBDVlwiICAgdGl0bGU9XCJNb3ZlIGRvd24gaW4gQ1ZcIiAke2lzTGFzdCAgPyAnZGlzYWJsZWQnIDogJyd9Plx1MjE5MzwvYnV0dG9uPlxuICAgICAgICA8L3RkPlxuICAgICAgPC90cj5cbiAgICBgO1xuICB9KTtcblxuICB0YWJsZUhUTUwgKz0gJzwvdGJvZHk+PC90YWJsZT4nO1xuICBjb250YWluZXIuaW5uZXJIVE1MID0gdGFibGVIVE1MO1xuXG4gIC8vIERlbGVnYXRlZCBjbGljayBoYW5kbGVyXG4gIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcjZXhwZXJpZW5jZS1yZXZpZXctdGFibGUgdGJvZHknKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBlID0+IHtcbiAgICBjb25zdCBidG4gPSBlLnRhcmdldC5jbG9zZXN0KCcuaWNvbi1idG4nKTtcbiAgICBpZiAoIWJ0bikgcmV0dXJuO1xuICAgIGNvbnN0IHRyID0gYnRuLmNsb3Nlc3QoJ3RyW2RhdGEtZXhwLWlkXScpO1xuICAgIGlmICghdHIpIHJldHVybjtcbiAgICBjb25zdCBleHBJZCAgPSB0ci5kYXRhc2V0LmV4cElkO1xuICAgIGNvbnN0IGFjdGlvbiA9IGJ0bi5kYXRhc2V0LmFjdGlvbjtcbiAgICBpZiAoYWN0aW9uID09PSAncmVvcmRlcicpIHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBjb25zdCB0aXRsZUVsID0gdHIucXVlcnlTZWxlY3Rvcignc3Ryb25nJyk7XG4gICAgICBzaG93QnVsbGV0UmVvcmRlcihleHBJZCwgdGl0bGVFbCA/IHRpdGxlRWwudGV4dENvbnRlbnQgOiAnJyk7XG4gICAgfSBlbHNlIGlmIChhY3Rpb24gPT09ICdyb3ctdXAnKSB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgbW92ZUV4cGVyaWVuY2VSb3coZXhwSWQsIC0xKTtcbiAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PT0gJ3Jvdy1kb3duJykge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIG1vdmVFeHBlcmllbmNlUm93KGV4cElkLCArMSk7XG4gICAgfSBlbHNlIGlmIChhY3Rpb24pIHtcbiAgICAgIGhhbmRsZUFjdGlvbkNsaWNrKGV4cElkLCBhY3Rpb24sICdleHBlcmllbmNlJyk7XG4gICAgfVxuICB9KTtcblxuICAvLyBCdWxrIHRvb2xiYXJcbiAgY29uc3QgZXhwVG9vbGJhciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBleHBUb29sYmFyLmNsYXNzTmFtZSA9ICdidWxrLXRvb2xiYXInO1xuICBleHBUb29sYmFyLmlubmVySFRNTCA9IGBcbiAgICA8c3Bhbj5CdWxrOjwvc3Bhbj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnVsay1idG4gYnVsay1yZWNvbW1lbmRlZFwiIG9uY2xpY2s9XCJidWxrQWN0aW9uKCdyZWNvbW1lbmRlZCcsJ2V4cGVyaWVuY2UnKVwiIHRpdGxlPVwiU2V0IGFsbCB0byB0aGUgTExNIHJlY29tbWVuZGF0aW9uXCI+XHUyNzI4IEFjY2VwdCBBbGwgUmVjb21tZW5kZWQ8L2J1dHRvbj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnVsay1idG4gYnVsay1lbXBoYXNpemVcIiAgIG9uY2xpY2s9XCJidWxrQWN0aW9uKCdlbXBoYXNpemUnLCdleHBlcmllbmNlJylcIj5cdTI3OTUgRW1waGFzaXplIEFsbDwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJidWxrLWJ0biBidWxrLWluY2x1ZGVcIiAgICAgb25jbGljaz1cImJ1bGtBY3Rpb24oJ2luY2x1ZGUnLCdleHBlcmllbmNlJylcIj5cdTI3MTMgSW5jbHVkZSBBbGw8L2J1dHRvbj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnVsay1idG4gYnVsay1leGNsdWRlXCIgICAgIG9uY2xpY2s9XCJidWxrQWN0aW9uKCdleGNsdWRlJywnZXhwZXJpZW5jZScpXCI+JHtleWVTbGFzaEljb24oKX0gRXhjbHVkZSBBbGw8L2J1dHRvbj5cbiAgYDtcbiAgY29udGFpbmVyLmluc2VydEJlZm9yZShleHBUb29sYmFyLCBjb250YWluZXIuZmlyc3RDaGlsZCk7XG5cbiAgLy8gSW5pdGlhbGl6ZSBEYXRhVGFibGUgd2l0aCBubyBhdXRvLXNvcnQgKHJvd3Mgc3RheSBpbiB1c2VyLXNwZWNpZmllZCBvcmRlcilcbiAgJCgnI2V4cGVyaWVuY2UtcmV2aWV3LXRhYmxlJykuRGF0YVRhYmxlKHtcbiAgICBwYWdpbmc6IGZhbHNlLFxuICAgIG9yZGVyOiBbXSxcbiAgICBsYW5ndWFnZTogeyBzZWFyY2g6ICdGaWx0ZXIgZXhwZXJpZW5jZXM6JyB9XG4gIH0pO1xuICBfdXBkYXRlUGFnZUVzdGltYXRlKCk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBSb3cgcmVvcmRlciBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gbW92ZUV4cGVyaWVuY2VSb3coZXhwSWQsIGRpcmVjdGlvbikge1xuICBjb25zdCBhcnIgPSB3aW5kb3cuX2V4cGVyaWVuY2VzT3JkZXJlZDtcbiAgaWYgKCFhcnIpIHJldHVybjtcbiAgY29uc3QgaWR4ID0gYXJyLmZpbmRJbmRleChlID0+IGUuaWQgPT09IGV4cElkKTtcbiAgaWYgKGlkeCA8IDApIHJldHVybjtcbiAgY29uc3QgbmV3SWR4ID0gaWR4ICsgZGlyZWN0aW9uO1xuICBpZiAobmV3SWR4IDwgMCB8fCBuZXdJZHggPj0gYXJyLmxlbmd0aCkgcmV0dXJuO1xuICBbYXJyW2lkeF0sIGFycltuZXdJZHhdXSA9IFthcnJbbmV3SWR4XSwgYXJyW2lkeF1dO1xuICB3aW5kb3cuX2V4cGVyaWVuY2VzT3JkZXJlZCA9IGFycjtcbiAgX3JlbmRlckV4cGVyaWVuY2VUYWJsZShudWxsLCBudWxsLCBudWxsKTtcbiAgLy8gUGVyc2lzdCB0aGUgbmV3IG9yZGVyIHRvIHRoZSBiYWNrZW5kIChmaXJlLWFuZC1mb3JnZXQ7IG5vIFVJIGJsb2NrKVxuICBmZXRjaCgnL2FwaS9yZW9yZGVyLXJvd3MnLCB7XG4gICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyB0eXBlOiAnZXhwZXJpZW5jZScsIG9yZGVyZWRfaWRzOiBhcnIubWFwKGUgPT4gZS5pZCkgfSlcbiAgfSkuY2F0Y2goKCkgPT4ge30pO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgTGVnYWN5IGludGVyYWN0aXZlLW1vZGUgcmVzcG9uc2UgaGFuZGxlciBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gaGFuZGxlRXhwZXJpZW5jZVJlc3BvbnNlKG1lc3NhZ2UpIHtcbiAgd2luZG93LndhaXRpbmdGb3JFeHBlcmllbmNlUmVzcG9uc2UgPSBmYWxzZTtcbiAgY29uc3QgcmVzcG9uc2UgPSBtZXNzYWdlLnRvTG93ZXJDYXNlKCk7XG5cbiAgaWYgKHJlc3BvbnNlLmluY2x1ZGVzKCd5ZXMnKSkge1xuICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsICdHcmVhdCEgSVxcJ2xsIGluY2x1ZGUgdGhpcyBleHBlcmllbmNlIHByb21pbmVudGx5LicpO1xuICB9IGVsc2UgaWYgKHJlc3BvbnNlLmluY2x1ZGVzKCdubycpKSB7XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ1VuZGVyc3Rvb2QuIElcXCdsbCBleGNsdWRlIHRoaXMgZXhwZXJpZW5jZSBmcm9tIHRoZSBmaW5hbCBDVi4nKTtcbiAgfSBlbHNlIGlmIChyZXNwb25zZS5pbmNsdWRlcygnbWF5YmUnKSkge1xuICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsICdJXFwnbGwgaW5jbHVkZSBpdCBidXQgd2l0aCBsZXNzIGVtcGhhc2lzLicpO1xuICB9IGVsc2Uge1xuICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsICdJXFwnbGwgbm90ZSB5b3VyIGZlZWRiYWNrIG9uIHRoaXMgZXhwZXJpZW5jZS4nKTtcbiAgfVxuXG4gIC8vIE1vdmUgdG8gbmV4dCBleHBlcmllbmNlIChjdXJyZW50SW5kZXggYWxyZWFkeSBpbmNyZW1lbnRlZCBpbiBzaG93TmV4dEV4cGVyaWVuY2UpXG4gIHNldFRpbWVvdXQoKCkgPT4gc2hvd05leHRFeHBlcmllbmNlKCksIDgwMCk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBTdWJtaXQgZGVjaXNpb25zIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBzdWJtaXRFeHBlcmllbmNlRGVjaXNpb25zKCkge1xuICAvKiBkdWNrZmxvdzpcbiAgICogICBpZDogZXhwZXJpZW5jZV91aV9zdWJtaXRfbGl2ZVxuICAgKiAgIGtpbmQ6IHVpXG4gICAqICAgdGltZXN0YW1wOiAnMjAyNi0wMy0yNVQyMTozOTo0OFonXG4gICAqICAgc3RhdHVzOiBsaXZlXG4gICAqICAgaGFuZGxlczpcbiAgICogICAtIHVpOmV4cGVyaWVuY2UtcmV2aWV3LnN1Ym1pdFxuICAgKiAgIGNhbGxzOlxuICAgKiAgIC0gUE9TVCAvYXBpL3Jldmlldy1kZWNpc2lvbnNcbiAgICogICAtIFBPU1QgL2FwaS9jdi9sYXlvdXQtZXN0aW1hdGVcbiAgICogICByZWFkczpcbiAgICogICAtIHdpbmRvdzp1c2VyU2VsZWN0aW9ucy5leHBlcmllbmNlc1xuICAgKiAgIHdyaXRlczpcbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL3Jldmlldy1kZWNpc2lvbnMuZGVjaXNpb25zXG4gICAqICAgLSB3aW5kb3c6X3NhdmVkRGVjaXNpb25zLmV4cGVyaWVuY2VfZGVjaXNpb25zXG4gICAqICAgbm90ZXM6IFBlcnNpc3RzIHBlci1leHBlcmllbmNlIGluY2x1c2lvbiBkZWNpc2lvbnMgYW5kIHRyaWdnZXJzIGRvd25zdHJlYW0gQVRTL2xheW91dCByZWZyZXNoZXMgdGhhdCBkZXBlbmQgb24gdGhlIHNhbWUgcmV2aWV3IGNob2ljZXMuXG4gICAqL1xuICBjb25zdCBkZWNpc2lvbnMgPSB1c2VyU2VsZWN0aW9ucy5leHBlcmllbmNlcztcbiAgY29uc3QgY291bnQgPSBPYmplY3Qua2V5cyhkZWNpc2lvbnMpLmxlbmd0aDtcblxuICBpZiAoY291bnQgPT09IDApIHtcbiAgICBzaG93QWxlcnRNb2RhbCgnTm8gU2VsZWN0aW9ucycsICdQbGVhc2Ugc2VsZWN0IGFjdGlvbnMgZm9yIGF0IGxlYXN0IG9uZSBleHBlcmllbmNlIGJlZm9yZSBzdWJtaXR0aW5nLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9yZXZpZXctZGVjaXNpb25zJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgdHlwZTogJ2V4cGVyaWVuY2VzJyxcbiAgICAgICAgZGVjaXNpb25zOiBkZWNpc2lvbnNcbiAgICAgIH0pXG4gICAgfSk7XG5cbiAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgIHN0YXRlTWFuYWdlci5tYXJrQ29udGVudENoYW5nZWQoKTtcbiAgICAgIHNob3dUb2FzdChgRXhwZXJpZW5jZSBkZWNpc2lvbnMgc2F2ZWQgKCR7Y291bnR9IGl0ZW1zKWApO1xuICAgICAgc2NoZWR1bGVBdHNSZWZyZXNoKCk7XG4gICAgICAvLyBQZXJzaXN0IHNhdmVkIGRlY2lzaW9ucyBsb2NhbGx5IHNvIHRoZSBVSSByZWZsZWN0cyB0aGVtIGltbWVkaWF0ZWx5XG4gICAgICB3aW5kb3cuX3NhdmVkRGVjaXNpb25zID0gd2luZG93Ll9zYXZlZERlY2lzaW9ucyB8fCB7fTtcbiAgICAgIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMuZXhwZXJpZW5jZV9kZWNpc2lvbnMgPSBkZWNpc2lvbnM7XG4gICAgICB1c2VyU2VsZWN0aW9ucy5leHBlcmllbmNlcyA9IHsgLi4uZGVjaXNpb25zIH07XG4gICAgICBpZiAodHlwZW9mIHVwZGF0ZUluY2x1c2lvbkNvdW50cyA9PT0gJ2Z1bmN0aW9uJykgdXBkYXRlSW5jbHVzaW9uQ291bnRzKCk7XG4gICAgICBzd2l0Y2hUYWIoJ2FjaC1lZGl0b3InKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZXJyb3IgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICBzaG93VG9hc3QoYEVycm9yOiAke2Vycm9yLmVycm9yIHx8ICdGYWlsZWQgdG8gc2F2ZSBkZWNpc2lvbnMnfWAsICdlcnJvcicpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cuZXJyb3IoJ0Vycm9yIHN1Ym1pdHRpbmcgZXhwZXJpZW5jZSBkZWNpc2lvbnM6JywgZXJyb3IpO1xuICAgIHNob3dUb2FzdCgnRmFpbGVkIHRvIHNhdmUgZGVjaXNpb25zLiBQbGVhc2UgdHJ5IGFnYWluLicsICdlcnJvcicpO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFeHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5leHBvcnQge1xuICBnZXRFeHBlcmllbmNlRGV0YWlscyxcbiAgYnVpbGRFeHBlcmllbmNlUmV2aWV3VGFibGUsXG4gIF9yZW5kZXJFeHBlcmllbmNlVGFibGUsXG4gIG1vdmVFeHBlcmllbmNlUm93LFxuICBoYW5kbGVFeHBlcmllbmNlUmVzcG9uc2UsXG4gIHN1Ym1pdEV4cGVyaWVuY2VEZWNpc2lvbnMsXG59O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvc2tpbGxzLXJldmlldy5qc1xuICogU2tpbGxzLXJldmlldyB0YWJsZTogZmV0Y2gsIHJlbmRlciwgcm93LXJlb3JkZXIsIGFuZCBzdWJtaXQgZGVjaXNpb25zLlxuICpcbiAqIERlcGVuZGVuY2llcyAocmVzb2x2ZWQgdGhyb3VnaCBnbG9iYWxUaGlzIGF0IHJ1bnRpbWUpOlxuICogICB1c2VyU2VsZWN0aW9ucywgcGVuZGluZ1JlY29tbWVuZGF0aW9ucywgX3NhdmVkRGVjaXNpb25zLCBfc2tpbGxzT3JkZXJlZCxcbiAqICAgX25ld1NraWxsc0Zyb21MTE0sIHRhYkRhdGEsIHBhcnNlU3RhdHVzUmVzcG9uc2UsXG4gKiAgIGdldFNraWxsUmVjb21tZW5kYXRpb24sIGdldFNraWxsQ29uZmlkZW5jZSwgZ2V0U2tpbGxSZWFzb25pbmcsXG4gKiAgIGVzY2FwZUh0bWwsIGhhbmRsZUFjdGlvbkNsaWNrLCBidWxrQWN0aW9uLCBfdXBkYXRlUGFnZUVzdGltYXRlLFxuICogICB1cGRhdGVJbmNsdXNpb25Db3VudHMsIHN3aXRjaFRhYixcbiAqICAgc2hvd0FsZXJ0TW9kYWwsIHNob3dUb2FzdCwgc2NoZWR1bGVBdHNSZWZyZXNoLFxuICogICAkLCAkLmZuLkRhdGFUYWJsZSAoalF1ZXJ5ICsgRGF0YVRhYmxlcylcbiAqL1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5jb25zdCBsb2cgPSBnZXRMb2dnZXIoJ3NraWxscy1yZXZpZXcnKTtcblxuaW1wb3J0IHsgc3RhdGVNYW5hZ2VyIH0gZnJvbSAnLi9zdGF0ZS1tYW5hZ2VyLmpzJztcbmltcG9ydCB7IGV5ZVNsYXNoSWNvbiB9IGZyb20gJy4vcmV2aWV3LWljb25zLmpzJztcblxuLy8gXHUyNTAwXHUyNTAwIFllYXJzLWZyb20tZXhwZXJpZW5jZSBoZWxwZXJzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBfcGFyc2VZZWFyRnJvbVN0cihzdHIpIHtcbiAgaWYgKCFzdHIpIHJldHVybiBudWxsO1xuICBjb25zdCBzID0gU3RyaW5nKHN0cikudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gIGlmIChbJ2N1cnJlbnQnLCAncHJlc2VudCcsICdub3cnLCAnb25nb2luZyddLmluY2x1ZGVzKHMpKSByZXR1cm4gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpO1xuICBjb25zdCBtID0gcy5tYXRjaCgvXFxiKDE5fDIwKVxcZHsyfVxcYi8pO1xuICByZXR1cm4gbSA/IHBhcnNlSW50KG1bMF0sIDEwKSA6IG51bGw7XG59XG5cbi8qKlxuICogR2l2ZW4gYSBsaXN0IG9mIGV4cGVyaWVuY2UgSURzIGFuZCB0aGUgZnVsbCBleHBlcmllbmNlcyBhcnJheSwgcmV0dXJuXG4gKiB0aGUgdG90YWwgeWVhcnMgb2YgZXhwZXJpZW5jZSAoc3VtIG9mIGR1cmF0aW9uIG9mIG1hdGNoZWQgZW50cmllcykuXG4gKiBSZXR1cm5zIG51bGwgaWYgbm8gbWF0Y2hpbmcgZW50cmllcyBmb3VuZC5cbiAqL1xuZnVuY3Rpb24gX2NvbXB1dGVZZWFyc0Zyb21JZHMoaWRzLCBhbGxFeHBlcmllbmNlcykge1xuICBjb25zdCBpZFNldCA9IG5ldyBTZXQoKGlkcyB8fCBbXSkubWFwKHggPT4gU3RyaW5nKHgpLnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pKTtcbiAgaWYgKGlkU2V0LnNpemUgPT09IDApIHJldHVybiBudWxsO1xuICBsZXQgdG90YWwgPSAwO1xuICBjb25zdCBjdXJyZW50WWVhciA9IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKTtcbiAgZm9yIChjb25zdCBleHAgb2YgKGFsbEV4cGVyaWVuY2VzIHx8IFtdKSkge1xuICAgIGlmICghZXhwIHx8IHR5cGVvZiBleHAgIT09ICdvYmplY3QnKSBjb250aW51ZTtcbiAgICBjb25zdCBleHBJZCA9IFN0cmluZyhleHAuaWQgfHwgJycpLnRyaW0oKTtcbiAgICBpZiAoIWlkU2V0LmhhcyhleHBJZCkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHN0YXJ0WWVhciA9IF9wYXJzZVllYXJGcm9tU3RyKGV4cC5zdGFydF9kYXRlIHx8IGV4cC5zdGFydCk7XG4gICAgY29uc3QgZW5kWWVhciAgID0gX3BhcnNlWWVhckZyb21TdHIoZXhwLmVuZF9kYXRlICAgfHwgZXhwLmVuZCkgPz8gY3VycmVudFllYXI7XG4gICAgdG90YWwgKz0gc3RhcnRZZWFyID09IG51bGwgPyAxIDogTWF0aC5tYXgoMSwgZW5kWWVhciAtIHN0YXJ0WWVhciArIDEpO1xuICB9XG4gIHJldHVybiB0b3RhbCA+IDAgPyB0b3RhbCA6IG51bGw7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNhdmVTa2lsbEdyb3VwT3ZlcnJpZGUoc2tpbGxOYW1lLCBncm91cE5hbWUpIHtcbiAgY29uc3Qgbm9ybWFsaXplZEdyb3VwID0gZ3JvdXBOYW1lID09IG51bGwgPyBudWxsIDogU3RyaW5nKGdyb3VwTmFtZSkudHJpbSgpIHx8IG51bGw7XG4gIGNvbnN0IHNrID0gKHdpbmRvdy5fc2tpbGxzT3JkZXJlZCB8fCBbXSkuZmluZChzID0+ICh0eXBlb2YgcyA9PT0gJ3N0cmluZycgPyBzIDogcy5uYW1lIHx8IHMpID09PSBza2lsbE5hbWUpO1xuICBpZiAoc2sgJiYgdHlwZW9mIHNrID09PSAnb2JqZWN0Jykgc2suZ3JvdXAgPSBub3JtYWxpemVkR3JvdXAgfHwgJyc7XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9yZXZpZXctc2tpbGwtZ3JvdXAnLCB7XG4gICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBza2lsbDogc2tpbGxOYW1lLCBncm91cDogbm9ybWFsaXplZEdyb3VwIH0pLFxuICB9KTtcblxuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgY29uc3QgZXJyb3IgPSBhd2FpdCByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGVycm9yLmVycm9yIHx8ICdGYWlsZWQgdG8gc2F2ZSBza2lsbCBncm91cCcpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3BvbnNlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzYXZlU2tpbGxDYXRlZ29yeU92ZXJyaWRlKHNraWxsTmFtZSwgY2F0ZWdvcnlOYW1lKSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRDYXRlZ29yeSA9IGNhdGVnb3J5TmFtZSA9PSBudWxsID8gbnVsbCA6IFN0cmluZyhjYXRlZ29yeU5hbWUpLnRyaW0oKSB8fCBudWxsO1xuICBjb25zdCBzayA9ICh3aW5kb3cuX3NraWxsc09yZGVyZWQgfHwgW10pLmZpbmQocyA9PiAodHlwZW9mIHMgPT09ICdzdHJpbmcnID8gcyA6IHMubmFtZSB8fCBzKSA9PT0gc2tpbGxOYW1lKTtcbiAgaWYgKHNrICYmIHR5cGVvZiBzayA9PT0gJ29iamVjdCcpIHtcbiAgICBpZiAobm9ybWFsaXplZENhdGVnb3J5KSBzay5jYXRlZ29yeSA9IG5vcm1hbGl6ZWRDYXRlZ29yeTtcbiAgICBlbHNlIGRlbGV0ZSBzay5jYXRlZ29yeTtcbiAgfVxuXG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvcmV2aWV3LXNraWxsLWNhdGVnb3J5Jywge1xuICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgc2tpbGw6IHNraWxsTmFtZSwgY2F0ZWdvcnk6IG5vcm1hbGl6ZWRDYXRlZ29yeSB9KSxcbiAgfSk7XG5cbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIGNvbnN0IGVycm9yID0gYXdhaXQgcmVzcG9uc2UuanNvbigpLmNhdGNoKCgpID0+ICh7fSkpO1xuICAgIHRocm93IG5ldyBFcnJvcihlcnJvci5lcnJvciB8fCAnRmFpbGVkIHRvIHNhdmUgc2tpbGwgY2F0ZWdvcnknKTtcbiAgfVxuXG4gIHJldHVybiByZXNwb25zZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVuYW1lU2tpbGxDYXRlZ29yeShvbGRDYXRlZ29yeSwgbmV3Q2F0ZWdvcnkpIHtcbiAgY29uc3Qgbm9ybWFsaXplZE9sZCA9IFN0cmluZyhvbGRDYXRlZ29yeSB8fCAnJykudHJpbSgpO1xuICBjb25zdCBub3JtYWxpemVkTmV3ID0gU3RyaW5nKG5ld0NhdGVnb3J5IHx8ICcnKS50cmltKCk7XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9yZXZpZXctc2tpbGwtY2F0ZWdvcmllcycsIHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBhY3Rpb246ICdyZW5hbWUnLFxuICAgICAgb2xkX2NhdGVnb3J5OiBub3JtYWxpemVkT2xkLFxuICAgICAgbmV3X2NhdGVnb3J5OiBub3JtYWxpemVkTmV3LFxuICAgIH0pLFxuICB9KTtcblxuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgY29uc3QgZXJyb3IgPSBhd2FpdCByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGVycm9yLmVycm9yIHx8ICdGYWlsZWQgdG8gcmVuYW1lIHNraWxsIGNhdGVnb3J5Jyk7XG4gIH1cblxuICByZXR1cm4gcmVzcG9uc2U7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNhdmVTa2lsbENhdGVnb3J5T3JkZXIob3JkZXJlZENhdGVnb3JpZXMpIHtcbiAgY29uc3Qgbm9ybWFsaXplZE9yZGVyID0gQXJyYXkuZnJvbShuZXcgU2V0KFxuICAgIChvcmRlcmVkQ2F0ZWdvcmllcyB8fCBbXSlcbiAgICAgIC5tYXAoY2F0ZWdvcnkgPT4gU3RyaW5nKGNhdGVnb3J5IHx8ICcnKS50cmltKCkpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pLFxuICApKTtcblxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3Jldmlldy1za2lsbC1jYXRlZ29yaWVzJywge1xuICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGFjdGlvbjogJ3Jlb3JkZXInLFxuICAgICAgb3JkZXJlZF9jYXRlZ29yaWVzOiBub3JtYWxpemVkT3JkZXIsXG4gICAgfSksXG4gIH0pO1xuXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICBjb25zdCBlcnJvciA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3IuZXJyb3IgfHwgJ0ZhaWxlZCB0byBzYXZlIHNraWxsIGNhdGVnb3J5IG9yZGVyJyk7XG4gIH1cblxuICByZXR1cm4gcmVzcG9uc2U7XG59XG5cbmZ1bmN0aW9uIF9ub3JtYWxpemVTa2lsbFN1YnNraWxscyh2YWx1ZSkge1xuICBjb25zdCByYXdWYWx1ZXMgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogU3RyaW5nKHZhbHVlIHx8ICcnKS5zcGxpdCgnLCcpO1xuICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KFxuICAgIHJhd1ZhbHVlc1xuICAgICAgLm1hcChpdGVtID0+IFN0cmluZyhpdGVtIHx8ICcnKS50cmltKCkpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pLFxuICApKTtcbn1cblxuZnVuY3Rpb24gX3NraWxsTmFtZShza2lsbCkge1xuICByZXR1cm4gdHlwZW9mIHNraWxsID09PSAnc3RyaW5nJyA/IHNraWxsIDogU3RyaW5nKHNraWxsPy5uYW1lIHx8IHNraWxsIHx8ICcnKS50cmltKCk7XG59XG5cbmZ1bmN0aW9uIF9ub3JtYWxpemVFeHRyYVNraWxsRW50cnkocmF3U2tpbGwsIHsgdXNlckNyZWF0ZWQgPSBmYWxzZSB9ID0ge30pIHtcbiAgaWYgKHR5cGVvZiByYXdTa2lsbCA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCBuYW1lID0gcmF3U2tpbGwudHJpbSgpO1xuICAgIHJldHVybiBuYW1lID8geyBuYW1lLCBfaXNOZXc6IHRydWUgfSA6IG51bGw7XG4gIH1cbiAgaWYgKCFyYXdTa2lsbCB8fCB0eXBlb2YgcmF3U2tpbGwgIT09ICdvYmplY3QnKSByZXR1cm4gbnVsbDtcblxuICBjb25zdCBuYW1lID0gU3RyaW5nKHJhd1NraWxsLm5hbWUgfHwgJycpLnRyaW0oKTtcbiAgaWYgKCFuYW1lKSByZXR1cm4gbnVsbDtcblxuICBjb25zdCBub3JtYWxpemVkID0ge1xuICAgIC4uLnJhd1NraWxsLFxuICAgIG5hbWUsXG4gICAgX2lzTmV3OiB0cnVlLFxuICB9O1xuICBjb25zdCBzdWJza2lsbHMgPSBfbm9ybWFsaXplU2tpbGxTdWJza2lsbHMocmF3U2tpbGwuc3Vic2tpbGxzIHx8IHJhd1NraWxsLnN1Yl9za2lsbHMgfHwgW10pO1xuICBpZiAoc3Vic2tpbGxzLmxlbmd0aCA+IDApIG5vcm1hbGl6ZWQuc3Vic2tpbGxzID0gc3Vic2tpbGxzO1xuICBlbHNlIGRlbGV0ZSBub3JtYWxpemVkLnN1YnNraWxscztcblxuICBpZiAodXNlckNyZWF0ZWQgfHwgcmF3U2tpbGwudXNlcl9jcmVhdGVkIHx8IHJhd1NraWxsLl9pc1VzZXJDcmVhdGVkKSB7XG4gICAgbm9ybWFsaXplZC51c2VyX2NyZWF0ZWQgPSB0cnVlO1xuICAgIG5vcm1hbGl6ZWQuX2lzVXNlckNyZWF0ZWQgPSB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG59XG5cbmZ1bmN0aW9uIF9za2lsbElubGluZUxhYmVsKHNraWxsKSB7XG4gIGlmICghc2tpbGwgfHwgdHlwZW9mIHNraWxsID09PSAnc3RyaW5nJykgcmV0dXJuIF9za2lsbE5hbWUoc2tpbGwpO1xuICBjb25zdCBuYW1lID0gX3NraWxsTmFtZShza2lsbCk7XG4gIGNvbnN0IHBhcmVudGhldGljYWwgPSBTdHJpbmcoc2tpbGwucGFyZW50aGV0aWNhbCB8fCAnJykudHJpbSgpO1xuICBpZiAocGFyZW50aGV0aWNhbCkgcmV0dXJuIGAke25hbWV9ICgke3BhcmVudGhldGljYWx9KWA7XG5cbiAgY29uc3QgcXVhbGlmaWVyUGFydHMgPSBbXTtcbiAgY29uc3QgcHJvZmljaWVuY3kgPSBTdHJpbmcoc2tpbGwucHJvZmljaWVuY3kgfHwgJycpLnRyaW0oKTtcbiAgaWYgKHByb2ZpY2llbmN5KSBxdWFsaWZpZXJQYXJ0cy5wdXNoKHByb2ZpY2llbmN5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcHJvZmljaWVuY3kuc2xpY2UoMSkpO1xuICBfbm9ybWFsaXplU2tpbGxTdWJza2lsbHMoc2tpbGwuc3Vic2tpbGxzIHx8IHNraWxsLnN1Yl9za2lsbHMgfHwgW10pLmZvckVhY2goaXRlbSA9PiBxdWFsaWZpZXJQYXJ0cy5wdXNoKGl0ZW0pKTtcbiAgaWYgKHF1YWxpZmllclBhcnRzLmxlbmd0aCA+IDApIHJldHVybiBgJHtuYW1lfSAoJHtxdWFsaWZpZXJQYXJ0cy5qb2luKCcsICcpfSlgO1xuICByZXR1cm4gbmFtZTtcbn1cblxuZnVuY3Rpb24gX2ZpbmRTa2lsbFJlY29tbWVuZGF0aW9uUmVjb3JkKHNraWxsTmFtZSwgZGF0YSkge1xuICBpZiAoIWRhdGEgfHwgIUFycmF5LmlzQXJyYXkoZGF0YS5za2lsbF9yZWNvbW1lbmRhdGlvbnMpKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIGRhdGEuc2tpbGxfcmVjb21tZW5kYXRpb25zLmZpbmQoKHJlYykgPT4ge1xuICAgIGNvbnN0IHJlY05hbWUgPSBTdHJpbmcocmVjPy5za2lsbCB8fCByZWM/Lm5hbWUgfHwgJycpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiByZWNOYW1lID09PSBTdHJpbmcoc2tpbGxOYW1lIHx8ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgfSkgfHwgbnVsbDtcbn1cblxuZnVuY3Rpb24gX2J1aWxkU2tpbGxHcm91cGluZ1N1Z2dlc3Rpb24ocmVjLCBza2lsbCkge1xuICBjb25zdCBncm91cGluZyA9IHJlYyAmJiB0eXBlb2YgcmVjLmdyb3VwaW5nID09PSAnb2JqZWN0JyA/IHJlYy5ncm91cGluZyA6IG51bGw7XG4gIGlmICghZ3JvdXBpbmcpIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IGN1cnJlbnRDYXRlZ29yeSA9IHR5cGVvZiBza2lsbCA9PT0gJ29iamVjdCcgPyBTdHJpbmcoc2tpbGwuY2F0ZWdvcnkgfHwgJycpLnRyaW0oKSA6ICcnO1xuICBjb25zdCBjdXJyZW50R3JvdXAgPSB0eXBlb2Ygc2tpbGwgPT09ICdvYmplY3QnID8gU3RyaW5nKHNraWxsLmdyb3VwIHx8ICcnKS50cmltKCkgOiAnJztcbiAgY29uc3Qgc3VnZ2VzdGVkQ2F0ZWdvcnkgPSBTdHJpbmcoZ3JvdXBpbmcuY2F0ZWdvcnkgfHwgJycpLnRyaW0oKTtcbiAgY29uc3Qgc3VnZ2VzdGVkR3JvdXAgPSBTdHJpbmcoZ3JvdXBpbmcuZ3JvdXAgfHwgJycpLnRyaW0oKTtcbiAgY29uc3QgY2F0ZWdvcnlDaGFuZ2VkID0gQm9vbGVhbihzdWdnZXN0ZWRDYXRlZ29yeSAmJiBzdWdnZXN0ZWRDYXRlZ29yeSAhPT0gY3VycmVudENhdGVnb3J5KTtcbiAgY29uc3QgZ3JvdXBDaGFuZ2VkID0gQm9vbGVhbihzdWdnZXN0ZWRHcm91cCAmJiBzdWdnZXN0ZWRHcm91cCAhPT0gY3VycmVudEdyb3VwKTtcblxuICBpZiAoIWNhdGVnb3J5Q2hhbmdlZCAmJiAhZ3JvdXBDaGFuZ2VkKSByZXR1cm4gbnVsbDtcblxuICBjb25zdCBjaGFuZ2VQYXJ0cyA9IFtdO1xuICBpZiAoY2F0ZWdvcnlDaGFuZ2VkKSB7XG4gICAgY2hhbmdlUGFydHMucHVzaChgQ2F0ZWdvcnk6ICR7Y3VycmVudENhdGVnb3J5IHx8ICdVbmNhdGVnb3JpemVkJ30gLT4gJHtzdWdnZXN0ZWRDYXRlZ29yeX1gKTtcbiAgfVxuICBpZiAoZ3JvdXBDaGFuZ2VkKSB7XG4gICAgY2hhbmdlUGFydHMucHVzaChgR3JvdXA6ICR7Y3VycmVudEdyb3VwIHx8ICdOb25lJ30gLT4gJHtzdWdnZXN0ZWRHcm91cH1gKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY2F0ZWdvcnk6IHN1Z2dlc3RlZENhdGVnb3J5LFxuICAgIGdyb3VwOiBzdWdnZXN0ZWRHcm91cCxcbiAgICBjYXRlZ29yeUNoYW5nZWQsXG4gICAgZ3JvdXBDaGFuZ2VkLFxuICAgIGNoYW5nZVRleHQ6IGNoYW5nZVBhcnRzLmpvaW4oJyB8ICcpLFxuICAgIHJlYXNvbmluZzogU3RyaW5nKGdyb3VwaW5nLnJlYXNvbmluZyB8fCAnJykudHJpbSgpLFxuICAgIGF0c0ltcGFjdDogU3RyaW5nKGdyb3VwaW5nLmF0c19pbXBhY3QgfHwgJycpLnRyaW0oKSxcbiAgICBwYWdlTGVuZ3RoSW1wYWN0OiBTdHJpbmcoZ3JvdXBpbmcucGFnZV9sZW5ndGhfaW1wYWN0IHx8ICcnKS50cmltKCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIF9jc3NFc2NhcGUodmFsdWUpIHtcbiAgaWYgKGdsb2JhbFRoaXMuQ1NTICYmIHR5cGVvZiBnbG9iYWxUaGlzLkNTUy5lc2NhcGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZ2xvYmFsVGhpcy5DU1MuZXNjYXBlKFN0cmluZyh2YWx1ZSkpO1xuICB9XG4gIHJldHVybiBTdHJpbmcodmFsdWUpLnJlcGxhY2UoL1xcXFwvZywgJ1xcXFxcXFxcJykucmVwbGFjZSgvXCIvZywgJ1xcXFxcIicpO1xufVxuXG5mdW5jdGlvbiBfYnVpbGRHcm91cFdhcm5pbmdzKHNraWxscykge1xuICBjb25zdCB3YXJuaW5nTWFwID0gbmV3IE1hcCgpO1xuICBjb25zdCBncm91cHMgPSBuZXcgTWFwKCk7XG4gIGZvciAoY29uc3Qgc2tpbGwgb2Ygc2tpbGxzIHx8IFtdKSB7XG4gICAgaWYgKCFza2lsbCB8fCB0eXBlb2Ygc2tpbGwgIT09ICdvYmplY3QnKSBjb250aW51ZTtcbiAgICBjb25zdCBza2lsbE5hbWUgPSBfc2tpbGxOYW1lKHNraWxsKTtcbiAgICBjb25zdCBncm91cE5hbWUgPSBTdHJpbmcoc2tpbGwuZ3JvdXAgfHwgJycpLnRyaW0oKTtcbiAgICBpZiAoIXNraWxsTmFtZSB8fCAhZ3JvdXBOYW1lKSBjb250aW51ZTtcbiAgICBpZiAoIWdyb3Vwcy5oYXMoZ3JvdXBOYW1lKSkgZ3JvdXBzLnNldChncm91cE5hbWUsIFtdKTtcbiAgICBncm91cHMuZ2V0KGdyb3VwTmFtZSkucHVzaChfc2tpbGxJbmxpbmVMYWJlbChza2lsbCkpO1xuICB9XG5cbiAgZ3JvdXBzLmZvckVhY2goKGxhYmVscywgZ3JvdXBOYW1lKSA9PiB7XG4gICAgY29uc3QgcHJldmlldyA9IGxhYmVscy5qb2luKCcsICcpO1xuICAgIGNvbnN0IGNyb3dkZWQgPSBwcmV2aWV3Lmxlbmd0aCA+PSA5MCB8fCBsYWJlbHMubGVuZ3RoID49IDU7XG4gICAgaWYgKCFjcm93ZGVkKSByZXR1cm47XG4gICAgd2FybmluZ01hcC5zZXQoZ3JvdXBOYW1lLCB7XG4gICAgICBwcmV2aWV3LFxuICAgICAgbWVtYmVyQ291bnQ6IGxhYmVscy5sZW5ndGgsXG4gICAgICBtZXNzYWdlOiBgSW5saW5lIGJ1bGxldCBtYXkgYmUgaGFyZCB0byBzY2FuICgke2xhYmVscy5sZW5ndGh9IHNraWxscywgJHtwcmV2aWV3Lmxlbmd0aH0gY2hhcnMpLmAsXG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiB3YXJuaW5nTWFwO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzYXZlU2tpbGxRdWFsaWZpZXJPdmVycmlkZShza2lsbE5hbWUsIHF1YWxpZmllcnMpIHtcbiAgY29uc3Qgbm9ybWFsaXplZFNraWxsID0gU3RyaW5nKHNraWxsTmFtZSB8fCAnJykudHJpbSgpO1xuICBpZiAoIW5vcm1hbGl6ZWRTa2lsbCkgdGhyb3cgbmV3IEVycm9yKCdTa2lsbCBuYW1lIGlzIHJlcXVpcmVkJyk7XG5cbiAgY29uc3Qgbm9ybWFsaXplZFByb2ZpY2llbmN5ID0gU3RyaW5nKHF1YWxpZmllcnM/LnByb2ZpY2llbmN5IHx8ICcnKS50cmltKCk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRTdWJza2lsbHMgPSBfbm9ybWFsaXplU2tpbGxTdWJza2lsbHMocXVhbGlmaWVycz8uc3Vic2tpbGxzKTtcbiAgY29uc3Qgbm9ybWFsaXplZFBhcmVudGhldGljYWwgPSBTdHJpbmcocXVhbGlmaWVycz8ucGFyZW50aGV0aWNhbCB8fCAnJykudHJpbSgpO1xuICBjb25zdCBub3JtYWxpemVkU2tpbGxUeXBlID0gU3RyaW5nKHF1YWxpZmllcnM/LnNraWxsX3R5cGUgfHwgJycpLnRyaW0oKS50b0xvd2VyQ2FzZSgpIHx8IG51bGw7XG5cbiAgY29uc3Qgc2sgPSAod2luZG93Ll9za2lsbHNPcmRlcmVkIHx8IFtdKS5maW5kKHMgPT4gKHR5cGVvZiBzID09PSAnc3RyaW5nJyA/IHMgOiBzLm5hbWUgfHwgcykgPT09IG5vcm1hbGl6ZWRTa2lsbCk7XG4gIGlmIChzayAmJiB0eXBlb2Ygc2sgPT09ICdvYmplY3QnKSB7XG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9maWNpZW5jeSkgc2sucHJvZmljaWVuY3kgPSBub3JtYWxpemVkUHJvZmljaWVuY3k7XG4gICAgZWxzZSBkZWxldGUgc2sucHJvZmljaWVuY3k7XG5cbiAgICBpZiAobm9ybWFsaXplZFN1YnNraWxscy5sZW5ndGggPiAwKSBzay5zdWJza2lsbHMgPSBub3JtYWxpemVkU3Vic2tpbGxzO1xuICAgIGVsc2UgZGVsZXRlIHNrLnN1YnNraWxscztcblxuICAgIGlmIChub3JtYWxpemVkUGFyZW50aGV0aWNhbCkgc2sucGFyZW50aGV0aWNhbCA9IG5vcm1hbGl6ZWRQYXJlbnRoZXRpY2FsO1xuICAgIGVsc2UgZGVsZXRlIHNrLnBhcmVudGhldGljYWw7XG4gIH1cblxuICBjb25zdCBwYXlsb2FkID0ge1xuICAgIHNraWxsOiBub3JtYWxpemVkU2tpbGwsXG4gICAgcHJvZmljaWVuY3k6IG5vcm1hbGl6ZWRQcm9maWNpZW5jeSxcbiAgICBzdWJza2lsbHM6IG5vcm1hbGl6ZWRTdWJza2lsbHMsXG4gICAgcGFyZW50aGV0aWNhbDogbm9ybWFsaXplZFBhcmVudGhldGljYWwsXG4gIH07XG4gIGlmICgnc2tpbGxfdHlwZScgaW4gKHF1YWxpZmllcnMgfHwge30pKSB7XG4gICAgcGF5bG9hZC5za2lsbF90eXBlID0gbm9ybWFsaXplZFNraWxsVHlwZTtcbiAgfVxuXG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvcmV2aWV3LXNraWxsLXF1YWxpZmllcnMnLCB7XG4gICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkocGF5bG9hZCksXG4gIH0pO1xuXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICBjb25zdCBlcnJvciA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3IuZXJyb3IgfHwgJ0ZhaWxlZCB0byBzYXZlIHNraWxsIHF1YWxpZmllcnMnKTtcbiAgfVxuXG4gIHJldHVybiByZXNwb25zZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZVVzZXJDcmVhdGVkU2tpbGwoc2tpbGwpIHtcbiAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICBuYW1lOiBTdHJpbmcoc2tpbGw/Lm5hbWUgfHwgJycpLnRyaW0oKSxcbiAgICBjYXRlZ29yeTogU3RyaW5nKHNraWxsPy5jYXRlZ29yeSB8fCAnJykudHJpbSgpLFxuICAgIGdyb3VwOiBTdHJpbmcoc2tpbGw/Lmdyb3VwIHx8ICcnKS50cmltKCksXG4gICAgcHJvZmljaWVuY3k6IFN0cmluZyhza2lsbD8ucHJvZmljaWVuY3kgfHwgJycpLnRyaW0oKSxcbiAgICBzdWJza2lsbHM6IF9ub3JtYWxpemVTa2lsbFN1YnNraWxscyhza2lsbD8uc3Vic2tpbGxzKSxcbiAgICBwYXJlbnRoZXRpY2FsOiBTdHJpbmcoc2tpbGw/LnBhcmVudGhldGljYWwgfHwgJycpLnRyaW0oKSxcbiAgfTtcbiAgaWYgKCFwYXlsb2FkLm5hbWUpIHRocm93IG5ldyBFcnJvcignU2tpbGwgbmFtZSBpcyByZXF1aXJlZCcpO1xuXG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvcmV2aWV3LXNraWxsLWFkZCcsIHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeShwYXlsb2FkKSxcbiAgfSk7XG5cbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIGNvbnN0IGVycm9yID0gYXdhaXQgcmVzcG9uc2UuanNvbigpLmNhdGNoKCgpID0+ICh7fSkpO1xuICAgIHRocm93IG5ldyBFcnJvcihlcnJvci5lcnJvciB8fCAnRmFpbGVkIHRvIGFkZCBza2lsbCcpO1xuICB9XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICBjb25zdCBub3JtYWxpemVkID0gX25vcm1hbGl6ZUV4dHJhU2tpbGxFbnRyeShyZXN1bHQuc2tpbGwsIHsgdXNlckNyZWF0ZWQ6IHRydWUgfSk7XG4gIGlmICghbm9ybWFsaXplZCkgdGhyb3cgbmV3IEVycm9yKCdTZXJ2ZXIgZGlkIG5vdCByZXR1cm4gYSBza2lsbCcpO1xuXG4gIGNvbnN0IGN1cnJlbnQgPSBBcnJheS5pc0FycmF5KHdpbmRvdy5fc2tpbGxzT3JkZXJlZCkgPyB3aW5kb3cuX3NraWxsc09yZGVyZWQgOiBbXTtcbiAgd2luZG93Ll9za2lsbHNPcmRlcmVkID0gW25vcm1hbGl6ZWQsIC4uLmN1cnJlbnQuZmlsdGVyKHNraWxsID0+IF9za2lsbE5hbWUoc2tpbGwpICE9PSBub3JtYWxpemVkLm5hbWUpXTtcblxuICB3aW5kb3cuX3NhdmVkRGVjaXNpb25zID0gd2luZG93Ll9zYXZlZERlY2lzaW9ucyB8fCB7fTtcbiAgY29uc3QgZXhpc3RpbmdFeHRyYXMgPSBBcnJheS5pc0FycmF5KHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMuZXh0cmFfc2tpbGxzKVxuICAgID8gd2luZG93Ll9zYXZlZERlY2lzaW9ucy5leHRyYV9za2lsbHNcbiAgICA6IFtdO1xuICB3aW5kb3cuX3NhdmVkRGVjaXNpb25zLmV4dHJhX3NraWxscyA9IFtcbiAgICBub3JtYWxpemVkLFxuICAgIC4uLmV4aXN0aW5nRXh0cmFzLmZpbHRlcihza2lsbCA9PiBfc2tpbGxOYW1lKHNraWxsKSAhPT0gbm9ybWFsaXplZC5uYW1lKSxcbiAgXTtcblxuICB1c2VyU2VsZWN0aW9ucy5za2lsbHNbbm9ybWFsaXplZC5uYW1lXSA9IHVzZXJTZWxlY3Rpb25zLnNraWxsc1tub3JtYWxpemVkLm5hbWVdIHx8ICdpbmNsdWRlJztcbiAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG59XG5cbmZ1bmN0aW9uIF9lZmZlY3RpdmVTa2lsbENhdGVnb3J5KHNraWxsKSB7XG4gIGlmICghc2tpbGwgfHwgdHlwZW9mIHNraWxsID09PSAnc3RyaW5nJykgcmV0dXJuICcnO1xuICByZXR1cm4gU3RyaW5nKHNraWxsLmNhdGVnb3J5IHx8ICcnKS50cmltKCkgfHwgJ0dlbmVyYWwnO1xufVxuXG5mdW5jdGlvbiBfc3luY1NraWxsQ2F0ZWdvcnlPcmRlcigpIHtcbiAgY29uc3Qgc2tpbGxzID0gQXJyYXkuaXNBcnJheSh3aW5kb3cuX3NraWxsc09yZGVyZWQpID8gd2luZG93Ll9za2lsbHNPcmRlcmVkIDogW107XG4gIGNvbnN0IG9yZGVyZWQgPSBbXTtcbiAgZm9yIChjb25zdCBza2lsbCBvZiBza2lsbHMpIHtcbiAgICBjb25zdCBjYXRlZ29yeSA9IF9lZmZlY3RpdmVTa2lsbENhdGVnb3J5KHNraWxsKTtcbiAgICBpZiAoY2F0ZWdvcnkgJiYgIW9yZGVyZWQuaW5jbHVkZXMoY2F0ZWdvcnkpKSBvcmRlcmVkLnB1c2goY2F0ZWdvcnkpO1xuICB9XG4gIHdpbmRvdy5fc2tpbGxDYXRlZ29yeU9yZGVyID0gb3JkZXJlZDtcbiAgcmV0dXJuIG9yZGVyZWQ7XG59XG5cbmZ1bmN0aW9uIF9yZW5hbWVTa2lsbENhdGVnb3J5TG9jYWxseShvbGRDYXRlZ29yeSwgbmV3Q2F0ZWdvcnkpIHtcbiAgY29uc3Qgbm9ybWFsaXplZE9sZCA9IFN0cmluZyhvbGRDYXRlZ29yeSB8fCAnJykudHJpbSgpO1xuICBjb25zdCBub3JtYWxpemVkTmV3ID0gU3RyaW5nKG5ld0NhdGVnb3J5IHx8ICcnKS50cmltKCk7XG4gIGlmICghbm9ybWFsaXplZE9sZCB8fCAhbm9ybWFsaXplZE5ldykgcmV0dXJuO1xuXG4gIGZvciAoY29uc3Qgc2tpbGwgb2YgKHdpbmRvdy5fc2tpbGxzT3JkZXJlZCB8fCBbXSkpIHtcbiAgICBpZiAoIXNraWxsIHx8IHR5cGVvZiBza2lsbCAhPT0gJ29iamVjdCcpIGNvbnRpbnVlO1xuICAgIGlmIChfZWZmZWN0aXZlU2tpbGxDYXRlZ29yeShza2lsbCkgPT09IG5vcm1hbGl6ZWRPbGQpIHtcbiAgICAgIHNraWxsLmNhdGVnb3J5ID0gbm9ybWFsaXplZE5ldztcbiAgICB9XG4gIH1cblxuICBjb25zdCBjdXJyZW50T3JkZXIgPSBBcnJheS5pc0FycmF5KHdpbmRvdy5fc2tpbGxDYXRlZ29yeU9yZGVyKVxuICAgID8gd2luZG93Ll9za2lsbENhdGVnb3J5T3JkZXJcbiAgICA6IF9zeW5jU2tpbGxDYXRlZ29yeU9yZGVyKCk7XG4gIHdpbmRvdy5fc2tpbGxDYXRlZ29yeU9yZGVyID0gY3VycmVudE9yZGVyLm1hcChjYXRlZ29yeSA9PiAoXG4gICAgY2F0ZWdvcnkgPT09IG5vcm1hbGl6ZWRPbGQgPyBub3JtYWxpemVkTmV3IDogY2F0ZWdvcnlcbiAgKSkuZmlsdGVyKChjYXRlZ29yeSwgaW5kZXgsIGFycikgPT4gY2F0ZWdvcnkgJiYgYXJyLmluZGV4T2YoY2F0ZWdvcnkpID09PSBpbmRleCk7XG59XG5cbmZ1bmN0aW9uIF9tb3ZlU2tpbGxDYXRlZ29yeUxvY2FsbHkoY2F0ZWdvcnlOYW1lLCBkaXJlY3Rpb24pIHtcbiAgY29uc3Qgbm9ybWFsaXplZENhdGVnb3J5ID0gU3RyaW5nKGNhdGVnb3J5TmFtZSB8fCAnJykudHJpbSgpO1xuICBjb25zdCBvcmRlciA9IEFycmF5LmlzQXJyYXkod2luZG93Ll9za2lsbENhdGVnb3J5T3JkZXIpXG4gICAgPyBbLi4ud2luZG93Ll9za2lsbENhdGVnb3J5T3JkZXJdXG4gICAgOiBfc3luY1NraWxsQ2F0ZWdvcnlPcmRlcigpO1xuICBjb25zdCBpbmRleCA9IG9yZGVyLmluZGV4T2Yobm9ybWFsaXplZENhdGVnb3J5KTtcbiAgaWYgKGluZGV4IDwgMCkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IG5leHRJbmRleCA9IGluZGV4ICsgZGlyZWN0aW9uO1xuICBpZiAobmV4dEluZGV4IDwgMCB8fCBuZXh0SW5kZXggPj0gb3JkZXIubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgW29yZGVyW2luZGV4XSwgb3JkZXJbbmV4dEluZGV4XV0gPSBbb3JkZXJbbmV4dEluZGV4XSwgb3JkZXJbaW5kZXhdXTtcbiAgd2luZG93Ll9za2lsbENhdGVnb3J5T3JkZXIgPSBvcmRlcjtcbiAgcmV0dXJuIG9yZGVyO1xufVxuXG5mdW5jdGlvbiBfYnVpbGRTa2lsbENhdGVnb3J5TWFuYWdlckh0bWwoKSB7XG4gIGNvbnN0IGNhdGVnb3JpZXMgPSBBcnJheS5pc0FycmF5KHdpbmRvdy5fc2tpbGxDYXRlZ29yeU9yZGVyKVxuICAgID8gd2luZG93Ll9za2lsbENhdGVnb3J5T3JkZXJcbiAgICA6IF9zeW5jU2tpbGxDYXRlZ29yeU9yZGVyKCk7XG4gIGlmIChjYXRlZ29yaWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuICcnO1xuXG4gIHJldHVybiBgXG4gICAgPGRpdiBjbGFzcz1cInNraWxsLWNhdGVnb3J5LW1hbmFnZXJcIiBzdHlsZT1cIm1hcmdpbjowIDAgMTJweDtwYWRkaW5nOjEycHg7Ym9yZGVyOjFweCBzb2xpZCAjZTVlN2ViO2JvcmRlci1yYWRpdXM6MTBweDtiYWNrZ3JvdW5kOiNmOGZhZmM7XCI+XG4gICAgICA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206OHB4O1wiPkNhdGVnb3J5IExheW91dDwvZGl2PlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Z2FwOjhweDtcIj5cbiAgICAgICAgJHtjYXRlZ29yaWVzLm1hcCgoY2F0ZWdvcnksIGluZGV4KSA9PiBgXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNraWxsLWNhdGVnb3J5LW1hbmFnZXItcm93XCIgZGF0YS1jYXRlZ29yeT1cIiR7ZXNjYXBlSHRtbChjYXRlZ29yeSl9XCIgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjhweDthbGlnbi1pdGVtczpjZW50ZXI7XCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICBjbGFzcz1cInNraWxsLWNhdGVnb3J5LW1hbmFnZXItaW5wdXRcIlxuICAgICAgICAgICAgICB2YWx1ZT1cIiR7ZXNjYXBlSHRtbChjYXRlZ29yeSl9XCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlJlbmFtZSBza2lsbCBjYXRlZ29yeSAke2VzY2FwZUh0bWwoY2F0ZWdvcnkpfVwiXG4gICAgICAgICAgICAgIHN0eWxlPVwiZmxleDoxO21pbi13aWR0aDowO3BhZGRpbmc6NnB4IDhweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo2cHg7XCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBkYXRhLWFjdGlvbj1cImNhdGVnb3J5LXVwXCIgZGF0YS1jYXRlZ29yeT1cIiR7ZXNjYXBlSHRtbChjYXRlZ29yeSl9XCIgYXJpYS1sYWJlbD1cIk1vdmUgJHtlc2NhcGVIdG1sKGNhdGVnb3J5KX0gY2F0ZWdvcnkgdXBcIiB0aXRsZT1cIk1vdmUgY2F0ZWdvcnkgdXBcIiAke2luZGV4ID09PSAwID8gJ2Rpc2FibGVkJyA6ICcnfT5cdTIxOTE8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIGRhdGEtYWN0aW9uPVwiY2F0ZWdvcnktZG93blwiIGRhdGEtY2F0ZWdvcnk9XCIke2VzY2FwZUh0bWwoY2F0ZWdvcnkpfVwiIGFyaWEtbGFiZWw9XCJNb3ZlICR7ZXNjYXBlSHRtbChjYXRlZ29yeSl9IGNhdGVnb3J5IGRvd25cIiB0aXRsZT1cIk1vdmUgY2F0ZWdvcnkgZG93blwiICR7aW5kZXggPT09IGNhdGVnb3JpZXMubGVuZ3RoIC0gMSA/ICdkaXNhYmxlZCcgOiAnJ30+XHUyMTkzPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIGApLmpvaW4oJycpfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGA7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBSZXJ1biBzbmFwc2hvdCAoY2hhbmdlIGJhZGdlIGZvciBza2lsbHMpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuZnVuY3Rpb24gX3NraWxsU25hcHNob3RLZXkoKSB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2lkID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKS5nZXQoJ3Nlc3Npb24nKTtcbiAgICByZXR1cm4gc2lkID8gYHNraWxsX3NuYXBfJHtzaWR9YCA6IG51bGw7XG4gIH0gY2F0Y2ggKF8pIHsgcmV0dXJuIG51bGw7IH1cbn1cbmZ1bmN0aW9uIF9zYXZlU2tpbGxTbmFwc2hvdChyZWNvbW1lbmRlZE5hbWVzKSB7XG4gIGNvbnN0IGtleSA9IF9za2lsbFNuYXBzaG90S2V5KCk7XG4gIGlmICgha2V5KSByZXR1cm47XG4gIHRyeSB7IGxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgSlNPTi5zdHJpbmdpZnkoWy4uLnJlY29tbWVuZGVkTmFtZXNdKSk7IH0gY2F0Y2ggKF8pIHt9XG59XG5mdW5jdGlvbiBfZ2V0U2tpbGxTbmFwc2hvdCgpIHtcbiAgY29uc3Qga2V5ID0gX3NraWxsU25hcHNob3RLZXkoKTtcbiAgaWYgKCFrZXkpIHJldHVybiBudWxsO1xuICB0cnkge1xuICAgIGNvbnN0IHJhdyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7XG4gICAgcmV0dXJuIHJhdyA/IG5ldyBTZXQoSlNPTi5wYXJzZShyYXcpKSA6IG51bGw7XG4gIH0gY2F0Y2ggKF8pIHsgcmV0dXJuIG51bGw7IH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIEJ1aWxkIHJldmlldyB0YWJsZSAoZmV0Y2ggKyBpbml0aWFsaXNlKSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gYnVpbGRTa2lsbHNSZXZpZXdUYWJsZSgpIHtcbiAgY29uc3QgZGF0YSA9IHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zO1xuICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGxzLXRhYmxlLWNvbnRhaW5lcicpO1xuXG4gIC8vIEJ1aWxkIHNraWxsLXR5cGUgbG9va3VwIGZyb20gam9iIGFuYWx5c2lzIChhdmFpbGFibGUgaW4gdGFiRGF0YS5hbmFseXNpcylcbiAgY29uc3Qgam9iQW5hbHlzaXMgPSBzdGF0ZU1hbmFnZXIuZ2V0VGFiRGF0YSgnYW5hbHlzaXMnKSB8fCB7fTtcbiAgY29uc3QgaGFyZFNraWxsU2V0ID0gbmV3IFNldCgoam9iQW5hbHlzaXMucmVxdWlyZWRfc2tpbGxzICAgIHx8IFtdKS5tYXAocyA9PiBzLnRvTG93ZXJDYXNlKCkpKTtcbiAgY29uc3Qgc29mdFNraWxsU2V0ID0gbmV3IFNldCgoam9iQW5hbHlzaXMubmljZV90b19oYXZlX3NraWxscyB8fCBbXSkubWFwKHMgPT4gcy50b0xvd2VyQ2FzZSgpKSk7XG5cbiAgLy8gR2V0IGFsbCBza2lsbHMgZnJvbSB0aGUgQVBJIHN0YXR1c1xuICBsZXQgYWxsU2tpbGxzID0gW107XG4gIGxldCBwZXJzaXN0ZWRFeHRyYVNraWxscyA9IFtdO1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXR1c1JlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3N0YXR1cycpO1xuICAgIGNvbnN0IHN0YXR1c0RhdGEgPSBwYXJzZVN0YXR1c1Jlc3BvbnNlKGF3YWl0IHN0YXR1c1Jlcy5qc29uKCkpO1xuICAgIGFsbFNraWxscyA9IHN0YXR1c0RhdGEuYWxsX3NraWxscyB8fCBbXTtcbiAgICBwZXJzaXN0ZWRFeHRyYVNraWxscyA9IHN0YXR1c0RhdGEuZXh0cmFfc2tpbGxzIHx8IFtdO1xuICAgIHdpbmRvdy5fYWxsRXhwZXJpZW5jZXMgPSBzdGF0dXNEYXRhLmFsbF9leHBlcmllbmNlcyB8fCBbXTtcbiAgICBjb25zdCBxdWFsT3ZlcnJpZGVzID0gc3RhdHVzRGF0YS5za2lsbF9xdWFsaWZpZXJfb3ZlcnJpZGVzIHx8IHt9O1xuICAgIHdpbmRvdy5fc2tpbGxUeXBlT3ZlcnJpZGVzID0gd2luZG93Ll9za2lsbFR5cGVPdmVycmlkZXMgfHwge307XG4gICAgZm9yIChjb25zdCBbc2tpbGxOYW1lLCBvdmVycmlkZXNdIG9mIE9iamVjdC5lbnRyaWVzKHF1YWxPdmVycmlkZXMpKSB7XG4gICAgICBpZiAob3ZlcnJpZGVzICYmIG92ZXJyaWRlcy5za2lsbF90eXBlKSB7XG4gICAgICAgIHdpbmRvdy5fc2tpbGxUeXBlT3ZlcnJpZGVzW3NraWxsTmFtZS50b0xvd2VyQ2FzZSgpXSA9IG92ZXJyaWRlcy5za2lsbF90eXBlO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cuZXJyb3IoJ0Vycm9yIGZldGNoaW5nIGFsbCBza2lsbHM6JywgZXJyb3IpO1xuICAgIC8vIEZhbGxiYWNrIHRvIGp1c3QgcmVjb21tZW5kZWQgc2tpbGxzXG4gICAgYWxsU2tpbGxzID0gZGF0YS5yZWNvbW1lbmRlZF9za2lsbHMgfHwgW107XG4gICAgd2luZG93Ll9hbGxFeHBlcmllbmNlcyA9IFtdO1xuICB9XG5cbiAgY29uc3Qgbm9ybWFsaXplZFBlcnNpc3RlZEV4dHJhU2tpbGxzID0gKHBlcnNpc3RlZEV4dHJhU2tpbGxzIHx8IFtdKVxuICAgIC5tYXAoc2tpbGwgPT4gX25vcm1hbGl6ZUV4dHJhU2tpbGxFbnRyeShza2lsbCwge1xuICAgICAgdXNlckNyZWF0ZWQ6IHR5cGVvZiBza2lsbCA9PT0gJ29iamVjdCcgJiYgISFza2lsbD8udXNlcl9jcmVhdGVkLFxuICAgIH0pKVxuICAgIC5maWx0ZXIoQm9vbGVhbik7XG4gIGlmIChub3JtYWxpemVkUGVyc2lzdGVkRXh0cmFTa2lsbHMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IG1lcmdlZFNraWxscyA9IFtdO1xuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0KCk7XG4gICAgbm9ybWFsaXplZFBlcnNpc3RlZEV4dHJhU2tpbGxzLmZvckVhY2goc2tpbGwgPT4ge1xuICAgICAgaWYgKHNlZW4uaGFzKHNraWxsLm5hbWUpKSByZXR1cm47XG4gICAgICBtZXJnZWRTa2lsbHMucHVzaChza2lsbCk7XG4gICAgICBzZWVuLmFkZChza2lsbC5uYW1lKTtcbiAgICB9KTtcbiAgICBhbGxTa2lsbHMuZm9yRWFjaChza2lsbCA9PiB7XG4gICAgICBjb25zdCBza2lsbE5hbWUgPSBfc2tpbGxOYW1lKHNraWxsKTtcbiAgICAgIGlmICghc2tpbGxOYW1lIHx8IHNlZW4uaGFzKHNraWxsTmFtZSkpIHJldHVybjtcbiAgICAgIG1lcmdlZFNraWxscy5wdXNoKHNraWxsKTtcbiAgICAgIHNlZW4uYWRkKHNraWxsTmFtZSk7XG4gICAgfSk7XG4gICAgYWxsU2tpbGxzID0gbWVyZ2VkU2tpbGxzO1xuICB9XG5cbiAgLy8gRGV0ZWN0IHNraWxscyByZWNvbW1lbmRlZCBieSBMTE0gdGhhdCBhcmVuJ3QgaW4gbWFzdGVyIENWIGFuZCBwcmVwZW5kIHRoZW1cbiAgY29uc3QgbWFzdGVyU2tpbGxOYW1lcyA9IG5ldyBTZXQoYWxsU2tpbGxzLm1hcChza2lsbCA9PiBfc2tpbGxOYW1lKHNraWxsKSkpO1xuICBjb25zdCBuZXdTa2lsbHMgPSAoZGF0YS5yZWNvbW1lbmRlZF9za2lsbHMgfHwgW10pLmZpbHRlcihzID0+ICFtYXN0ZXJTa2lsbE5hbWVzLmhhcyhzKSk7XG4gIHdpbmRvdy5fbmV3U2tpbGxzRnJvbUxMTSA9IG5ld1NraWxscztcbiAgaWYgKG5ld1NraWxscy5sZW5ndGggPiAwKSB7XG4gICAgYWxsU2tpbGxzID0gWy4uLm5ld1NraWxscy5tYXAocyA9PiAoeyBuYW1lOiBzLCBfaXNOZXc6IHRydWUgfSkpLCAuLi5hbGxTa2lsbHNdO1xuICB9XG5cbiAgaWYgKGFsbFNraWxscy5sZW5ndGggPT09IDApIHtcbiAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJzxwIHN0eWxlPVwicGFkZGluZzoyMHB4O3RleHQtYWxpZ246Y2VudGVyO2NvbG9yOiM2YjcyODA7XCI+Tm8gc2tpbGxzIGZvdW5kIGluIG1hc3RlciBDViBkYXRhLjwvcD4nO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIE9uIGZpcnN0IGxvYWQ6IHNvcnQgYnkgcmVjb21tZW5kYXRpb247IHByZXNlcnZlIHVzZXIgb3JkZXIgb24gcmUtcmVuZGVyXG4gIGlmICghd2luZG93Ll9za2lsbHNPcmRlcmVkKSB7XG4gICAgY29uc3QgcmVjb21tZW5kYXRpb25PcmRlciA9IHsgJ0VtcGhhc2l6ZSc6IDAsICdJbmNsdWRlJzogMSwgJ0RlLWVtcGhhc2l6ZSc6IDIsICdPbWl0JzogMyB9O1xuICAgIGNvbnN0IG1hc3RlclNraWxscyAgPSBhbGxTa2lsbHMuZmlsdGVyKHMgPT4gIXMuX2lzTmV3KTtcblxuICAgIC8vIFJvbGUtYXdhcmUgY2F0ZWdvcnkgc2NvcmluZzogY2F0ZWdvcmllcyB3aXRoIG1vcmUgcmVxdWlyZWQvbmljZS10by1oYXZlIGpvYiBza2lsbHMgcmFuayBoaWdoZXJcbiAgICBjb25zdCBjYXRlZ29yeVNjb3JlcyA9IHt9O1xuICAgIGZvciAoY29uc3Qgc2tpbGwgb2YgbWFzdGVyU2tpbGxzKSB7XG4gICAgICBjb25zdCBjYXQgID0gdHlwZW9mIHNraWxsID09PSAnb2JqZWN0JyA/IChza2lsbC5jYXRlZ29yeSB8fCAnJykgOiAnJztcbiAgICAgIGNvbnN0IG5hbWUgPSAodHlwZW9mIHNraWxsID09PSAnc3RyaW5nJyA/IHNraWxsIDogc2tpbGwubmFtZSB8fCBza2lsbCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmIChjYXQpIHtcbiAgICAgICAgY2F0ZWdvcnlTY29yZXNbY2F0XSA9IChjYXRlZ29yeVNjb3Jlc1tjYXRdIHx8IDApXG4gICAgICAgICAgKyAoaGFyZFNraWxsU2V0LmhhcyhuYW1lKSA/IDIgOiBzb2Z0U2tpbGxTZXQuaGFzKG5hbWUpID8gMSA6IDApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHNvcnRlZE1hc3RlciAgPSBtYXN0ZXJTa2lsbHMuc2xpY2UoKS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBjb25zdCBhTmFtZSAgPSB0eXBlb2YgYSA9PT0gJ3N0cmluZycgPyBhIDogYS5uYW1lIHx8IGE7XG4gICAgICBjb25zdCBiTmFtZSAgPSB0eXBlb2YgYiA9PT0gJ3N0cmluZycgPyBiIDogYi5uYW1lIHx8IGI7XG4gICAgICBjb25zdCBhUmVjICAgPSByZWNvbW1lbmRhdGlvbk9yZGVyW2dldFNraWxsUmVjb21tZW5kYXRpb24oYU5hbWUsIGRhdGEpXSA/PyAzO1xuICAgICAgY29uc3QgYlJlYyAgID0gcmVjb21tZW5kYXRpb25PcmRlcltnZXRTa2lsbFJlY29tbWVuZGF0aW9uKGJOYW1lLCBkYXRhKV0gPz8gMztcbiAgICAgIGlmIChhUmVjICE9PSBiUmVjKSByZXR1cm4gYVJlYyAtIGJSZWM7XG4gICAgICAvLyBXaXRoaW4gdGhlIHNhbWUgcmVjb21tZW5kYXRpb24gdGllciwgc3VyZmFjZSByb2xlLXJlbGV2YW50IGNhdGVnb3JpZXMgZmlyc3RcbiAgICAgIGNvbnN0IGFDYXQgICA9IHR5cGVvZiBhID09PSAnb2JqZWN0JyA/IChhLmNhdGVnb3J5IHx8ICcnKSA6ICcnO1xuICAgICAgY29uc3QgYkNhdCAgID0gdHlwZW9mIGIgPT09ICdvYmplY3QnID8gKGIuY2F0ZWdvcnkgfHwgJycpIDogJyc7XG4gICAgICByZXR1cm4gKGNhdGVnb3J5U2NvcmVzW2JDYXRdIHx8IDApIC0gKGNhdGVnb3J5U2NvcmVzW2FDYXRdIHx8IDApO1xuICAgIH0pO1xuICAgIHdpbmRvdy5fc2tpbGxzT3JkZXJlZCA9IFsuLi5hbGxTa2lsbHMuZmlsdGVyKHMgPT4gcy5faXNOZXcpLCAuLi5zb3J0ZWRNYXN0ZXJdO1xuXG4gICAgLy8gQXBwbHkgam9iLWFuYWx5c2lzLWRlcml2ZWQgY2F0ZWdvcnkgb3JkZXIgZnJvbSBiYWNrZW5kIChHQVAtODYpXG4gICAgY29uc3QgYmFja2VuZE9yZGVyID0gKHN0YXRlTWFuYWdlci5nZXRUYWJEYXRhKCdjdXN0b21pemF0aW9ucycpIHx8IHt9KS5za2lsbF9jYXRlZ29yeV9vcmRlcjtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShiYWNrZW5kT3JkZXIpICYmIGJhY2tlbmRPcmRlci5sZW5ndGggPiAwKSB7XG4gICAgICB3aW5kb3cuX3NraWxsQ2F0ZWdvcnlPcmRlciA9IGJhY2tlbmRPcmRlcjtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc3Qga25vd25OYW1lcyA9IG5ldyBTZXQod2luZG93Ll9za2lsbHNPcmRlcmVkLm1hcChzID0+ICh0eXBlb2YgcyA9PT0gJ3N0cmluZycgPyBzIDogcy5uYW1lIHx8IHMpKSk7XG4gICAgZm9yIChjb25zdCBzayBvZiBhbGxTa2lsbHMpIHtcbiAgICAgIGNvbnN0IG5tID0gdHlwZW9mIHNrID09PSAnc3RyaW5nJyA/IHNrIDogc2submFtZSB8fCBzaztcbiAgICAgIGlmICgha25vd25OYW1lcy5oYXMobm0pKSB3aW5kb3cuX3NraWxsc09yZGVyZWQucHVzaChzayk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcmVjb21tZW5kZWRTZXQgPSBuZXcgU2V0KGRhdGEucmVjb21tZW5kZWRfc2tpbGxzIHx8IFtdKTtcblxuICAvLyBDb21wdXRlIHdoaWNoIHJlY29tbWVuZGF0aW9ucyBhcmUgbmV3IHNpbmNlIGxhc3QgcmVuZGVyIChyZXJ1biBjaGFuZ2UgYmFkZ2VzKVxuICBjb25zdCBwcmV2U2tpbGxTbmFwID0gX2dldFNraWxsU25hcHNob3QoKTtcbiAgY29uc3QgbmV3UmVjb21tZW5kZWRTa2lsbHMgPSBwcmV2U2tpbGxTbmFwXG4gICAgPyBuZXcgU2V0KFsuLi5yZWNvbW1lbmRlZFNldF0uZmlsdGVyKG5hbWUgPT4gIXByZXZTa2lsbFNuYXAuaGFzKG5hbWUpKSlcbiAgICA6IG5ldyBTZXQoKTtcbiAgX3NhdmVTa2lsbFNuYXBzaG90KHJlY29tbWVuZGVkU2V0KTtcblxuICAvLyBJbml0aWFsaXNlIHNhdmVkIGRlY2lzaW9uc1xuICBjb25zdCBzYXZlZFNraWxsRGVjcyA9IHdpbmRvdy5fc2F2ZWREZWNpc2lvbnM/LnNraWxsX2RlY2lzaW9ucyB8fCB7fTtcbiAgZm9yIChjb25zdCBza2lsbCBvZiB3aW5kb3cuX3NraWxsc09yZGVyZWQpIHtcbiAgICBjb25zdCBza2lsbE5hbWUgICAgID0gdHlwZW9mIHNraWxsID09PSAnc3RyaW5nJyA/IHNraWxsIDogc2tpbGwubmFtZSB8fCBza2lsbDtcbiAgICBjb25zdCBpc05ldyAgICAgICAgID0gKHNraWxsLl9pc05ldyA9PT0gdHJ1ZSk7XG4gICAgY29uc3QgaXNSZWNvbW1lbmRlZCA9IHJlY29tbWVuZGVkU2V0Lmhhcyhza2lsbE5hbWUpO1xuICAgIGNvbnN0IHJlY29tbWVuZGF0aW9uID0gZ2V0U2tpbGxSZWNvbW1lbmRhdGlvbihza2lsbE5hbWUsIGRhdGEpO1xuICAgIGxldCBkZWZhdWx0QWN0aW9uID0gJ2V4Y2x1ZGUnO1xuICAgIGlmICAgICAgKHJlY29tbWVuZGF0aW9uID09PSAnRW1waGFzaXplJykgICAgZGVmYXVsdEFjdGlvbiA9ICdlbXBoYXNpemUnO1xuICAgIGVsc2UgaWYgKHJlY29tbWVuZGF0aW9uID09PSAnSW5jbHVkZScpICAgICAgZGVmYXVsdEFjdGlvbiA9ICdpbmNsdWRlJztcbiAgICBlbHNlIGlmIChyZWNvbW1lbmRhdGlvbiA9PT0gJ0RlLWVtcGhhc2l6ZScpIGRlZmF1bHRBY3Rpb24gPSAnZGUtZW1waGFzaXplJztcbiAgICBlbHNlIGlmIChyZWNvbW1lbmRhdGlvbiA9PT0gJ09taXQnKSAgICAgICAgIGRlZmF1bHRBY3Rpb24gPSAnZXhjbHVkZSc7XG4gICAgZWxzZSBpZiAoaXNSZWNvbW1lbmRlZCB8fCBpc05ldykgICAgICAgICAgICBkZWZhdWx0QWN0aW9uID0gJ2luY2x1ZGUnO1xuICAgIHVzZXJTZWxlY3Rpb25zLnNraWxsc1tza2lsbE5hbWVdID0gc2F2ZWRTa2lsbERlY3Nbc2tpbGxOYW1lXSB8fCBkZWZhdWx0QWN0aW9uO1xuICB9XG5cbiAgX3JlbmRlclNraWxsc1RhYmxlKGNvbnRhaW5lciwgcmVjb21tZW5kZWRTZXQsIGRhdGEsIGhhcmRTa2lsbFNldCwgc29mdFNraWxsU2V0LCBuZXdSZWNvbW1lbmRlZFNraWxscyk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBSZW5kZXIgdGFibGUgSFRNTCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gX3JlbmRlclNraWxsc1RhYmxlKGNvbnRhaW5lciwgcmVjb21tZW5kZWRTZXQsIGRhdGEsIGhhcmRTa2lsbFNldCwgc29mdFNraWxsU2V0LCBuZXdSZWNvbW1lbmRlZFNraWxscyA9IG5ldyBTZXQoKSkge1xuICBpZiAoIWNvbnRhaW5lcikgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NraWxscy10YWJsZS1jb250YWluZXInKTtcbiAgaWYgKCFjb250YWluZXIpIHJldHVybjtcbiAgaWYgKCFyZWNvbW1lbmRlZFNldCkgcmVjb21tZW5kZWRTZXQgPSBuZXcgU2V0KCh3aW5kb3cucGVuZGluZ1JlY29tbWVuZGF0aW9ucz8ucmVjb21tZW5kZWRfc2tpbGxzKSB8fCBbXSk7XG4gIGlmICghZGF0YSkgZGF0YSA9IHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zO1xuICBpZiAoIWhhcmRTa2lsbFNldCkge1xuICAgIGNvbnN0IGphID0gc3RhdGVNYW5hZ2VyLmdldFRhYkRhdGEoJ2FuYWx5c2lzJykgfHwge307XG4gICAgaGFyZFNraWxsU2V0ID0gbmV3IFNldCgoamEucmVxdWlyZWRfc2tpbGxzICAgICB8fCBbXSkubWFwKHMgPT4gcy50b0xvd2VyQ2FzZSgpKSk7XG4gICAgc29mdFNraWxsU2V0ID0gbmV3IFNldCgoamEubmljZV90b19oYXZlX3NraWxscyB8fCBbXSkubWFwKHMgPT4gcy50b0xvd2VyQ2FzZSgpKSk7XG4gIH1cblxuICBpZiAoJC5mbi5EYXRhVGFibGUuaXNEYXRhVGFibGUoJyNza2lsbHMtcmV2aWV3LXRhYmxlJykpIHtcbiAgICAkKCcjc2tpbGxzLXJldmlldy10YWJsZScpLkRhdGFUYWJsZSgpLmRlc3Ryb3koKTtcbiAgfVxuXG4gIGNvbnN0IHNraWxscyA9IHdpbmRvdy5fc2tpbGxzT3JkZXJlZCB8fCBbXTtcbiAgY29uc3QgZ3JvdXBXYXJuaW5ncyA9IF9idWlsZEdyb3VwV2FybmluZ3Moc2tpbGxzKTtcbiAgY29uc3QgY2F0ZWdvcnlTdWdnZXN0aW9ucyA9IEFycmF5LmZyb20obmV3IFNldChcbiAgICBza2lsbHNcbiAgICAgIC5tYXAoc2tpbGwgPT4gKHR5cGVvZiBza2lsbCA9PT0gJ29iamVjdCcgJiYgc2tpbGwuY2F0ZWdvcnkgPyBTdHJpbmcoc2tpbGwuY2F0ZWdvcnkpLnRyaW0oKSA6ICcnKSlcbiAgICAgIC5maWx0ZXIoQm9vbGVhbiksXG4gICkpLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiBsZWZ0LmxvY2FsZUNvbXBhcmUocmlnaHQpKTtcbiAgX3N5bmNTa2lsbENhdGVnb3J5T3JkZXIoKTtcbiAgY29uc3QgY2F0ZWdvcnlMaXN0SWQgPSAnc2tpbGwtY2F0ZWdvcnktc3VnZ2VzdGlvbnMnO1xuICBsZXQgdGFibGVIVE1MID0gYFxuICAgIDxkaXYgY2xhc3M9XCJza2lsbC1hZGQtcGFuZWxcIiBzdHlsZT1cIm1hcmdpbjowIDAgMTJweDtwYWRkaW5nOjEycHg7Ym9yZGVyOjFweCBzb2xpZCAjZGJlYWZlO2JvcmRlci1yYWRpdXM6MTBweDtiYWNrZ3JvdW5kOiNlZmY2ZmY7XCI+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTJweDtmbGV4LXdyYXA6d3JhcDtcIj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6NjAwO1wiPlNlc3Npb24tT25seSBTa2lsbHM8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtjb2xvcjojNDc1NTY5O1wiPkFkZCBhIHNraWxsIGZvciB0aGlzIENWIHdpdGhvdXQgY2hhbmdpbmcgdGhlIG1hc3RlciBwcm9maWxlLjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidWxrLWJ0blwiIGlkPVwidG9nZ2xlLWFkZC1za2lsbC1mb3JtXCI+KyBBZGQgU2tpbGw8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGZvcm0gaWQ9XCJhZGQtc2tpbGwtZm9ybVwiIHN0eWxlPVwiZGlzcGxheTpub25lO21hcmdpbi10b3A6MTJweDtcIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6cmVwZWF0KGF1dG8tZml0LG1pbm1heCgxODBweCwxZnIpKTtnYXA6OHB4O1wiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG5hbWU9XCJuYW1lXCIgcGxhY2Vob2xkZXI9XCJTa2lsbCBuYW1lXCIgYXJpYS1sYWJlbD1cIk5ldyBza2lsbCBuYW1lXCIgc3R5bGU9XCJwYWRkaW5nOjZweCA4cHg7Ym9yZGVyOjFweCBzb2xpZCAjYmZkYmZlO2JvcmRlci1yYWRpdXM6NnB4O1wiIC8+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cImNhdGVnb3J5XCIgcGxhY2Vob2xkZXI9XCJDYXRlZ29yeVwiIGFyaWEtbGFiZWw9XCJOZXcgc2tpbGwgY2F0ZWdvcnlcIiBsaXN0PVwiJHtjYXRlZ29yeUxpc3RJZH1cIiBzdHlsZT1cInBhZGRpbmc6NnB4IDhweDtib3JkZXI6MXB4IHNvbGlkICNiZmRiZmU7Ym9yZGVyLXJhZGl1czo2cHg7XCIgLz5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBuYW1lPVwiZ3JvdXBcIiBwbGFjZWhvbGRlcj1cIkdyb3VwIGtleVwiIGFyaWEtbGFiZWw9XCJOZXcgc2tpbGwgZ3JvdXBcIiBzdHlsZT1cInBhZGRpbmc6NnB4IDhweDtib3JkZXI6MXB4IHNvbGlkICNiZmRiZmU7Ym9yZGVyLXJhZGl1czo2cHg7XCIgLz5cbiAgICAgICAgICA8c2VsZWN0IG5hbWU9XCJwcm9maWNpZW5jeVwiIGFyaWEtbGFiZWw9XCJOZXcgc2tpbGwgcHJvZmljaWVuY3lcIiBzdHlsZT1cInBhZGRpbmc6NnB4IDhweDtib3JkZXI6MXB4IHNvbGlkICNiZmRiZmU7Ym9yZGVyLXJhZGl1czo2cHg7XCI+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+Tm8gcHJvZmljaWVuY3kgbGFiZWw8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJiZWdpbm5lclwiPkJlZ2lubmVyPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiZmFtaWxpYXJcIj5GYW1pbGlhcjwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImludGVybWVkaWF0ZVwiPkludGVybWVkaWF0ZTwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImFkdmFuY2VkXCI+QWR2YW5jZWQ8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJleHBlcnRcIj5FeHBlcnQ8L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBuYW1lPVwic3Vic2tpbGxzXCIgcGxhY2Vob2xkZXI9XCJTdWItc2tpbGxzXCIgYXJpYS1sYWJlbD1cIk5ldyBza2lsbCBzdWItc2tpbGxzXCIgc3R5bGU9XCJwYWRkaW5nOjZweCA4cHg7Ym9yZGVyOjFweCBzb2xpZCAjYmZkYmZlO2JvcmRlci1yYWRpdXM6NnB4O1wiIC8+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cInBhcmVudGhldGljYWxcIiBwbGFjZWhvbGRlcj1cIlBhcmVudGhldGljYWwgbm90ZVwiIGFyaWEtbGFiZWw9XCJOZXcgc2tpbGwgcGFyZW50aGV0aWNhbFwiIHN0eWxlPVwicGFkZGluZzo2cHggOHB4O2JvcmRlcjoxcHggc29saWQgI2JmZGJmZTtib3JkZXItcmFkaXVzOjZweDtcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6OHB4O2p1c3RpZnktY29udGVudDpmbGV4LWVuZDttYXJnaW4tdG9wOjEwcHg7XCI+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidWxrLWJ0biBidWxrLWV4Y2x1ZGVcIiBpZD1cImNhbmNlbC1hZGQtc2tpbGxcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBjbGFzcz1cImJ1bGstYnRuIGJ1bGstaW5jbHVkZVwiPlNhdmUgU2tpbGw8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Zvcm0+XG4gICAgPC9kaXY+XG4gICAgJHtfYnVpbGRTa2lsbENhdGVnb3J5TWFuYWdlckh0bWwoKX1cbiAgICA8ZGF0YWxpc3QgaWQ9XCIke2NhdGVnb3J5TGlzdElkfVwiPlxuICAgICAgJHtjYXRlZ29yeVN1Z2dlc3Rpb25zLm1hcChjYXRlZ29yeSA9PiBgPG9wdGlvbiB2YWx1ZT1cIiR7ZXNjYXBlSHRtbChjYXRlZ29yeSl9XCI+PC9vcHRpb24+YCkuam9pbignJyl9XG4gICAgPC9kYXRhbGlzdD5cbiAgICA8dGFibGUgaWQ9XCJza2lsbHMtcmV2aWV3LXRhYmxlXCIgY2xhc3M9XCJyZXZpZXctdGFibGVcIj5cbiAgICAgIDx0aGVhZD5cbiAgICAgICAgPHRyPlxuICAgICAgICAgIDx0aD5Ta2lsbDwvdGg+XG4gICAgICAgICAgPHRoPkNhdGVnb3J5PC90aD5cbiAgICAgICAgICA8dGg+R3JvdXA8L3RoPlxuICAgICAgICAgIDx0aD5Qcm9maWNpZW5jeTwvdGg+XG4gICAgICAgICAgPHRoPlN1Yi1za2lsbHM8L3RoPlxuICAgICAgICAgIDx0aD5QYXJlbnRoZXRpY2FsPC90aD5cbiAgICAgICAgICA8dGg+UmVjb21tZW5kYXRpb248L3RoPlxuICAgICAgICAgIDx0aD5Db25maWRlbmNlPC90aD5cbiAgICAgICAgICA8dGg+UmVhc29uaW5nPC90aD5cbiAgICAgICAgICA8dGg+TWF0Y2hlZCBFeHBlcmllbmNlczwvdGg+XG4gICAgICAgICAgPHRoPllvdXIgU2VsZWN0aW9uPC90aD5cbiAgICAgICAgPC90cj5cbiAgICAgIDwvdGhlYWQ+XG4gICAgICA8dGJvZHk+XG4gIGA7XG5cbiAgY29uc3QgYWxsRXhwZXJpZW5jZXMgPSBBcnJheS5pc0FycmF5KHdpbmRvdy5fYWxsRXhwZXJpZW5jZXMpID8gd2luZG93Ll9hbGxFeHBlcmllbmNlcyA6IFtdO1xuICBjb25zdCBzYXZlZE1hdGNoZXMgPSAod2luZG93Ll9zYXZlZERlY2lzaW9ucyAmJiB3aW5kb3cuX3NhdmVkRGVjaXNpb25zLmV4dHJhX3NraWxsX21hdGNoZXMpIHx8IHt9O1xuXG4gIGNvbnN0IGRlcml2ZU1hdGNoZXMgPSAoc2tpbGxOYW1lKSA9PiB7XG4gICAgY29uc3QgbmVlZGxlID0gc2tpbGxOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgaWRzID0gW107XG4gICAgYWxsRXhwZXJpZW5jZXMuZm9yRWFjaCgoZXhwKSA9PiB7XG4gICAgICBpZiAoIWV4cCB8fCB0eXBlb2YgZXhwICE9PSAnb2JqZWN0JykgcmV0dXJuO1xuICAgICAgY29uc3QgYWNoID0gQXJyYXkuaXNBcnJheShleHAuYWNoaWV2ZW1lbnRzKSA/IGV4cC5hY2hpZXZlbWVudHMuam9pbignICcpIDogJyc7XG4gICAgICBjb25zdCBoYXlzdGFjayA9IFtleHAudGl0bGUgfHwgJycsIGV4cC5jb21wYW55IHx8ICcnLCBhY2hdLmpvaW4oJyAnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKGhheXN0YWNrLmluY2x1ZGVzKG5lZWRsZSkgJiYgZXhwLmlkKSBpZHMucHVzaChleHAuaWQpO1xuICAgIH0pO1xuICAgIHJldHVybiBpZHM7XG4gIH07XG5cbiAgc2tpbGxzLmZvckVhY2goKHNraWxsLCByb3dJZHgpID0+IHtcbiAgICBjb25zdCBza2lsbE5hbWUgICAgICAgICAgICA9IHR5cGVvZiBza2lsbCA9PT0gJ3N0cmluZycgPyBza2lsbCA6IHNraWxsLm5hbWUgfHwgc2tpbGw7XG4gICAgY29uc3QgaXNOZXcgICAgICAgICAgICAgICAgPSAoc2tpbGwuX2lzTmV3ID09PSB0cnVlKTtcbiAgICBjb25zdCBpc0NhbmRpZGF0ZVRvQ29uZmlybSA9IHR5cGVvZiBza2lsbCA9PT0gJ29iamVjdCcgJiYgc2tpbGwuY2FuZGlkYXRlX3RvX2NvbmZpcm0gPT09IHRydWU7XG4gICAgY29uc3QgaXNSZWNvbW1lbmRlZCAgICAgICAgPSByZWNvbW1lbmRlZFNldC5oYXMoc2tpbGxOYW1lKTtcbiAgICBjb25zdCByZWNvbW1lbmRhdGlvbiA9IGdldFNraWxsUmVjb21tZW5kYXRpb24oc2tpbGxOYW1lLCBkYXRhKTtcbiAgICBjb25zdCBjb25maWRlbmNlICAgICA9IGdldFNraWxsQ29uZmlkZW5jZShza2lsbE5hbWUsIGRhdGEpO1xuICAgIGNvbnN0IHJlYXNvbmluZyAgICAgID0gZ2V0U2tpbGxSZWFzb25pbmcoc2tpbGxOYW1lLCBkYXRhKTtcbiAgICBjb25zdCBza2lsbFJlYyAgICAgICA9IF9maW5kU2tpbGxSZWNvbW1lbmRhdGlvblJlY29yZChza2lsbE5hbWUsIGRhdGEpO1xuICAgIGNvbnN0IGdyb3VwaW5nU3VnZ2VzdGlvbiA9IF9idWlsZFNraWxsR3JvdXBpbmdTdWdnZXN0aW9uKHNraWxsUmVjLCBza2lsbCk7XG4gICAgY29uc3QgZGVmYXVsdEFjdGlvbiAgPSB1c2VyU2VsZWN0aW9ucy5za2lsbHNbc2tpbGxOYW1lXSB8fCAnaW5jbHVkZSc7XG4gICAgY29uc3QgaXNGaXJzdCAgICAgICAgPSByb3dJZHggPT09IDA7XG4gICAgY29uc3QgaXNMYXN0ICAgICAgICAgPSByb3dJZHggPT09IHNraWxscy5sZW5ndGggLSAxO1xuICAgIGNvbnN0IHNraWxsTmFtZUVzYyAgID0gZXNjYXBlSHRtbChza2lsbE5hbWUpO1xuXG4gICAgY29uc3QgZ3JvdXBLZXkgPSB0eXBlb2Ygc2tpbGwgPT09ICdvYmplY3QnID8gKHNraWxsLmdyb3VwIHx8ICcnKSA6ICcnO1xuICAgIGNvbnN0IGdyb3VwV2FybmluZyA9IGdyb3VwV2FybmluZ3MuZ2V0KGdyb3VwS2V5KTtcbiAgICBjb25zdCBjYXRlZ29yeUtleSA9IHR5cGVvZiBza2lsbCA9PT0gJ29iamVjdCcgPyAoc2tpbGwuY2F0ZWdvcnkgfHwgJycpIDogJyc7XG4gICAgY29uc3QgcHJvZmljaWVuY3lLZXkgPSB0eXBlb2Ygc2tpbGwgPT09ICdvYmplY3QnID8gU3RyaW5nKHNraWxsLnByb2ZpY2llbmN5IHx8ICcnKS50cmltKCkgOiAnJztcbiAgICBjb25zdCBzdWJza2lsbHMgPSB0eXBlb2Ygc2tpbGwgPT09ICdvYmplY3QnXG4gICAgICA/IEFycmF5LmlzQXJyYXkoc2tpbGwuc3Vic2tpbGxzKVxuICAgICAgICA/IHNraWxsLnN1YnNraWxsc1xuICAgICAgICA6IEFycmF5LmlzQXJyYXkoc2tpbGwuc3ViX3NraWxscylcbiAgICAgICAgICA/IHNraWxsLnN1Yl9za2lsbHNcbiAgICAgICAgICA6IFtdXG4gICAgICA6IFtdO1xuICAgIGNvbnN0IHBhcmVudGhldGljYWxLZXkgPSB0eXBlb2Ygc2tpbGwgPT09ICdvYmplY3QnID8gU3RyaW5nKHNraWxsLnBhcmVudGhldGljYWwgfHwgJycpLnRyaW0oKSA6ICcnO1xuXG4gICAgY29uc3QgbmV3QmFkZ2UgPSBpc05ld1xuICAgICAgPyAoc2tpbGwuX2lzVXNlckNyZWF0ZWRcbiAgICAgICAgPyAnPHNwYW4gdGl0bGU9XCJBZGRlZCBmb3IgdGhpcyBzZXNzaW9uIG9ubHlcIiBzdHlsZT1cIm1hcmdpbi1sZWZ0OjZweDtmb250LXNpemU6MTBweDtjb2xvcjojMGY3NjZlO2JvcmRlcjoxcHggc29saWQgIzBmNzY2ZTtib3JkZXItcmFkaXVzOjNweDtwYWRkaW5nOjFweCA1cHg7Y3Vyc29yOmhlbHA7XCI+U2Vzc2lvbiBvbmx5PC9zcGFuPidcbiAgICAgICAgOiAnPHNwYW4gdGl0bGU9XCJBSSBzdWdnZXN0ZWQgXHUyMDE0IG5vdCB5ZXQgaW4gQ1YgcHJvZmlsZVwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6NnB4O2ZvbnQtc2l6ZToxMHB4O2NvbG9yOiNkYzc5MDA7Ym9yZGVyOjFweCBzb2xpZCAjZGM3OTAwO2JvcmRlci1yYWRpdXM6M3B4O3BhZGRpbmc6MXB4IDVweDtjdXJzb3I6aGVscDtcIj5cdTI2QTAgTm90IGluIENWIHByb2ZpbGU8L3NwYW4+JylcbiAgICAgIDogJyc7XG4gICAgY29uc3QgX2V2aWRlbmNlVGV4dCA9IGlzQ2FuZGlkYXRlVG9Db25maXJtICYmIHR5cGVvZiBza2lsbCA9PT0gJ29iamVjdCcgPyBTdHJpbmcoc2tpbGwuZXZpZGVuY2UgfHwgJycpLnRyaW0oKSA6ICcnO1xuICAgIGNvbnN0IF9ldmlkZW5jZUZhbGxiYWNrID0gJ0NvbmZpcm0gdGhpcyBza2lsbCBpcyBnZW51aW5lbHkgZGVtb25zdHJhdGVkIGluIHlvdXIgZXhwZXJpZW5jZSBiZWZvcmUgaW5jbHVkaW5nIGl0Lic7XG4gICAgY29uc3QgX2V2aWRlbmNlVGlwID0gX2V2aWRlbmNlVGV4dCA/IGBXZWFrIGV2aWRlbmNlIFx1MjAxNCAke19ldmlkZW5jZVRleHR9YCA6IGBXZWFrIGV2aWRlbmNlIFx1MjAxNCAke19ldmlkZW5jZUZhbGxiYWNrfWA7XG4gICAgY29uc3QgY2FuZGlkYXRlQmFkZ2UgPSBpc0NhbmRpZGF0ZVRvQ29uZmlybVxuICAgICAgPyBgPHNwYW4gdGl0bGU9XCIke2VzY2FwZUh0bWwoX2V2aWRlbmNlVGlwKX1cIiBhcmlhLWxhYmVsPVwiJHtlc2NhcGVIdG1sKF9ldmlkZW5jZVRpcCl9XCIgc3R5bGU9XCJtYXJnaW4tbGVmdDo2cHg7Zm9udC1zaXplOjEwcHg7Y29sb3I6IzlmMTIzOTtib3JkZXI6MXB4IHNvbGlkICM5ZjEyMzk7Ym9yZGVyLXJhZGl1czozcHg7cGFkZGluZzoxcHggNXB4O2N1cnNvcjpoZWxwO1wiPlx1MjZBMCAke19ldmlkZW5jZVRleHQgPyAnV2VhayBldmlkZW5jZScgOiAnVmVyaWZ5IGV2aWRlbmNlJ308L3NwYW4+YFxuICAgICAgOiAnJztcbiAgICBjb25zdCBldmlkZW5jZU5vdGUgPSBpc0NhbmRpZGF0ZVRvQ29uZmlybSAmJiBfZXZpZGVuY2VUZXh0XG4gICAgICA/IGA8c21hbGwgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO21hcmdpbi10b3A6M3B4O2ZvbnQtc2l6ZTowLjc4ZW07Y29sb3I6IzlmMTIzOTtcIj4ke2VzY2FwZUh0bWwoX2V2aWRlbmNlVGV4dCl9PC9zbWFsbD5gXG4gICAgICA6ICcnO1xuICAgIGNvbnN0IHJlcnVuTmV3QmFkZ2UgPSBuZXdSZWNvbW1lbmRlZFNraWxscy5oYXMoc2tpbGxOYW1lKVxuICAgICAgPyAnPHNwYW4gY2xhc3M9XCJydy1jaGFuZ2UtYmFkZ2UgcnctY2hhbmdlLW5ld1wiIGFyaWEtbGFiZWw9XCJOZXcgcmVjb21tZW5kYXRpb24gc2luY2UgcHJldmlvdXMgcnVuXCI+XHVEODNDXHVERDk1IE5ldzwvc3Bhbj4nXG4gICAgICA6ICcnO1xuICAgIGNvbnN0IHNraWxsTmFtZUxvd2VyICA9IHNraWxsTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IF90eXBlT3ZlcnJpZGUgICA9ICh3aW5kb3cuX3NraWxsVHlwZU92ZXJyaWRlcyB8fCB7fSlbc2tpbGxOYW1lTG93ZXJdO1xuICAgIGNvbnN0IF9iYXNlVHlwZSAgICAgICA9IGhhcmRTa2lsbFNldC5oYXMoc2tpbGxOYW1lTG93ZXIpID8gJ2hhcmQnXG4gICAgICA6IHNvZnRTa2lsbFNldD8uaGFzKHNraWxsTmFtZUxvd2VyKSA/ICdzb2Z0JyA6IG51bGw7XG4gICAgY29uc3QgX2VmZmVjdGl2ZVR5cGUgID0gX3R5cGVPdmVycmlkZSB8fCBfYmFzZVR5cGU7XG4gICAgY29uc3QgX2lzT3ZlcnJpZGRlbiAgID0gISFfdHlwZU92ZXJyaWRlICYmIF90eXBlT3ZlcnJpZGUgIT09IF9iYXNlVHlwZTtcbiAgICBjb25zdCBfdG9nZ2xlVGFyZ2V0ICAgPSBfZWZmZWN0aXZlVHlwZSA9PT0gJ2hhcmQnID8gJ3NvZnQnXG4gICAgICA6IF9lZmZlY3RpdmVUeXBlID09PSAnc29mdCcgPyBudWxsIDogJ2hhcmQnO1xuICAgIGNvbnN0IF9iYWRnZVRpdGxlICAgICA9IF9pc092ZXJyaWRkZW5cbiAgICAgID8gYFVzZXIgb3ZlcnJpZGU6ICR7X2VmZmVjdGl2ZVR5cGV9IChvcmlnaW5hbDogJHtfYmFzZVR5cGUgfHwgJ25vbmUnfSkgXHUyMDE0IGNsaWNrIHRvIGN5Y2xlYFxuICAgICAgOiBfZWZmZWN0aXZlVHlwZVxuICAgICAgICA/IGAke19lZmZlY3RpdmVUeXBlID09PSAnaGFyZCcgPyAnUmVxdWlyZWQnIDogJ05pY2UtdG8taGF2ZSd9IHBlciBqb2IgZGVzY3JpcHRpb24gXHUyMDE0IGNsaWNrIHRvIG92ZXJyaWRlYFxuICAgICAgICA6ICdOb3QgY2xhc3NpZmllZCBcdTIwMTQgY2xpY2sgdG8gbWFyayBhcyBIYXJkJztcbiAgICBjb25zdCBfYmFkZ2VTdHlsZSAgICAgPSBfZWZmZWN0aXZlVHlwZSA9PT0gJ2hhcmQnXG4gICAgICA/IGBtYXJnaW4tbGVmdDo1cHg7Zm9udC1zaXplOjEwcHg7Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOiMxZDRlZDg7YmFja2dyb3VuZDojZGJlYWZlO2JvcmRlci1yYWRpdXM6M3B4O3BhZGRpbmc6MXB4IDVweDtjdXJzb3I6cG9pbnRlcjske19pc092ZXJyaWRkZW4gPyAnb3V0bGluZToycHggc29saWQgIzFkNGVkODtvdXRsaW5lLW9mZnNldDoxcHg7JyA6ICcnfWBcbiAgICAgIDogX2VmZmVjdGl2ZVR5cGUgPT09ICdzb2Z0J1xuICAgICAgICA/IGBtYXJnaW4tbGVmdDo1cHg7Zm9udC1zaXplOjEwcHg7Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOiM2YjIxYTg7YmFja2dyb3VuZDojZjNlOGZmO2JvcmRlci1yYWRpdXM6M3B4O3BhZGRpbmc6MXB4IDVweDtjdXJzb3I6cG9pbnRlcjske19pc092ZXJyaWRkZW4gPyAnb3V0bGluZToycHggc29saWQgIzZiMjFhODtvdXRsaW5lLW9mZnNldDoxcHg7JyA6ICcnfWBcbiAgICAgICAgOiAnbWFyZ2luLWxlZnQ6NXB4O2ZvbnQtc2l6ZToxMHB4O2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjojNmI3MjgwO2JhY2tncm91bmQ6I2YzZjRmNjtib3JkZXItcmFkaXVzOjNweDtwYWRkaW5nOjFweCA1cHg7Y3Vyc29yOnBvaW50ZXI7Ym9yZGVyOjFweCBkYXNoZWQgIzljYTNhZjsnO1xuICAgIGNvbnN0IF9iYWRnZUxhYmVsICAgICA9IF9lZmZlY3RpdmVUeXBlID8gKF9lZmZlY3RpdmVUeXBlID09PSAnaGFyZCcgPyAnSGFyZCcgOiAnU29mdCcpIDogJysgVHlwZSc7XG4gICAgY29uc3Qgc2tpbGxUeXBlQmFkZ2UgID0gYDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2tpbGwtdHlwZS10b2dnbGVcIiBkYXRhLXNraWxsPVwiJHtza2lsbE5hbWVFc2N9XCIgZGF0YS10b2dnbGUtdG89XCIke190b2dnbGVUYXJnZXQgfHwgJyd9XCIgdGl0bGU9XCIke19iYWRnZVRpdGxlfVwiIHN0eWxlPVwiJHtfYmFkZ2VTdHlsZX1cIiBhcmlhLWxhYmVsPVwiU2tpbGwgdHlwZTogJHtfZWZmZWN0aXZlVHlwZSB8fCAndW5jbGFzc2lmaWVkJ30sIGNsaWNrIHRvIHRvZ2dsZVwiPiR7X2JhZGdlTGFiZWx9PC9idXR0b24+YDtcbiAgICBjb25zdCByZWNvbW1lbmRhdGlvblRleHQgPSByZWNvbW1lbmRhdGlvbiB8fCAoc2tpbGwuX2lzVXNlckNyZWF0ZWQgPyAnSW5jbHVkZSAoc2Vzc2lvbi1hZGRlZCknIDogKGlzTmV3ID8gJ0luY2x1ZGUgKEFJIHN1Z2dlc3RlZCknIDogJ09taXQnKSk7XG4gICAgY29uc3QgY29uZmlkZW5jZUJhZGdlICAgID0gYDxzcGFuIGNsYXNzPVwiY29uZmlkZW5jZS1iYWRnZSBjb25maWRlbmNlLSR7Y29uZmlkZW5jZS5sZXZlbH1cIj4ke2NvbmZpZGVuY2UudGV4dH08L3NwYW4+YDtcbiAgICBjb25zdCByZWFzb25pbmdUZXh0ICAgICAgPSByZWFzb25pbmcgfHwgKHNraWxsLl9pc1VzZXJDcmVhdGVkXG4gICAgICA/ICdZb3UgYWRkZWQgdGhpcyBza2lsbCBmb3IgdGhlIGN1cnJlbnQgQ1Ygc2Vzc2lvbiBvbmx5LidcbiAgICAgIDogKGlzTmV3XG4gICAgICAgID8gJ1JlY29tbWVuZGVkIGJ5IEFJIGJhc2VkIG9uIGpvYiByZXF1aXJlbWVudHMgYnV0IG5vdCBjdXJyZW50bHkgaW4geW91ciBtYXN0ZXIgQ1YuJ1xuICAgICAgICA6ICdUaGlzIHNraWxsIHdhcyBub3Qgc3BlY2lmaWNhbGx5IG1lbnRpb25lZCBpbiB0aGUgam9iIHJlcXVpcmVtZW50cy4nKSk7XG4gICAgY29uc3QgZ3JvdXBpbmdDaGFuZ2VUZXh0ID0gZ3JvdXBpbmdTdWdnZXN0aW9uPy5jaGFuZ2VUZXh0IHx8ICcnO1xuICAgIGNvbnN0IGdyb3VwaW5nUmVhc29uVGV4dCA9IGdyb3VwaW5nU3VnZ2VzdGlvbj8ucmVhc29uaW5nIHx8ICcnO1xuICAgIGNvbnN0IGdyb3VwaW5nQXRzSW1wYWN0ID0gZ3JvdXBpbmdTdWdnZXN0aW9uPy5hdHNJbXBhY3QgfHwgJyc7XG4gICAgY29uc3QgZ3JvdXBpbmdQYWdlSW1wYWN0ID0gZ3JvdXBpbmdTdWdnZXN0aW9uPy5wYWdlTGVuZ3RoSW1wYWN0IHx8ICcnO1xuICAgIGNvbnN0IHJlYXNvbmluZ1NlZ21lbnRzID0gW3JlYXNvbmluZ1RleHRdO1xuICAgIGlmIChncm91cGluZ0NoYW5nZVRleHQpIHJlYXNvbmluZ1NlZ21lbnRzLnB1c2goYENoYW5nZTogJHtncm91cGluZ0NoYW5nZVRleHR9YCk7XG4gICAgaWYgKGdyb3VwaW5nUmVhc29uVGV4dCkgcmVhc29uaW5nU2VnbWVudHMucHVzaChncm91cGluZ1JlYXNvblRleHQpO1xuICAgIGlmIChncm91cGluZ0F0c0ltcGFjdCkgcmVhc29uaW5nU2VnbWVudHMucHVzaChgQVRTIGltcGFjdDogJHtncm91cGluZ0F0c0ltcGFjdH1gKTtcbiAgICBpZiAoZ3JvdXBpbmdQYWdlSW1wYWN0KSByZWFzb25pbmdTZWdtZW50cy5wdXNoKGBQYWdlIGxlbmd0aCBpbXBhY3Q6ICR7Z3JvdXBpbmdQYWdlSW1wYWN0fWApO1xuICAgIGNvbnN0IGZ1bGxSZWFzb25pbmdUZXh0ID0gcmVhc29uaW5nU2VnbWVudHMuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgICBjb25zdCByb3dTdHlsZSAgICAgICAgICAgPSBpc05ldyA/ICdiYWNrZ3JvdW5kOiNmZmZiZWI7JyA6ICcnO1xuICAgIGNvbnN0IGRlZmF1bHRNYXRjaGVzID0gaXNOZXcgPyAoc2F2ZWRNYXRjaGVzW3NraWxsTmFtZV0gfHwgZGVyaXZlTWF0Y2hlcyhza2lsbE5hbWUpKSA6IFtdO1xuICAgIGNvbnN0IG1hdGNoVmFsdWUgPSBkZWZhdWx0TWF0Y2hlcy5qb2luKCcsICcpO1xuICAgIGNvbnN0IG1hdGNoSGVscCA9IGlzTmV3XG4gICAgICA/ICdDb21tYS1zZXBhcmF0ZWQgZXhwZXJpZW5jZSBJRHMuIEF1dG8tZGVyaXZlZDsgeW91IGNhbiBlZGl0IGJlZm9yZSBzdWJtaXQuJ1xuICAgICAgOiAnT25seSB1c2VkIGZvciBBSS1zdWdnZXN0ZWQgc2tpbGxzLic7XG4gICAgY29uc3QgZGVyaXZlZFllYXJzID0gaXNOZXcgPyBfY29tcHV0ZVllYXJzRnJvbUlkcyhkZWZhdWx0TWF0Y2hlcywgYWxsRXhwZXJpZW5jZXMpIDogbnVsbDtcbiAgICBjb25zdCB5ZWFyc0hpbnQgPSBkZXJpdmVkWWVhcnMgIT0gbnVsbFxuICAgICAgPyBgfiR7ZGVyaXZlZFllYXJzfSB5ciR7ZGVyaXZlZFllYXJzID09PSAxID8gJycgOiAncyd9YFxuICAgICAgOiAoaXNOZXcgPyAnbm8gbWF0Y2gnIDogJycpO1xuXG4gICAgdGFibGVIVE1MICs9IGBcbiAgICAgIDx0ciBkYXRhLXNraWxsPVwiJHtza2lsbE5hbWVFc2N9XCIgc3R5bGU9XCIke3Jvd1N0eWxlfVwiPlxuICAgICAgICA8dGQ+PHN0cm9uZz4ke3NraWxsTmFtZUVzY308L3N0cm9uZz4ke3NraWxsVHlwZUJhZGdlfSR7cmVydW5OZXdCYWRnZX0ke25ld0JhZGdlfSR7Y2FuZGlkYXRlQmFkZ2V9JHtldmlkZW5jZU5vdGV9PC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwibWluLXdpZHRoOjE0MHB4O1wiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwic2tpbGwtY2F0ZWdvcnktaW5wdXRcIiBkYXRhLXNraWxsPVwiJHtza2lsbE5hbWVFc2N9XCJcbiAgICAgICAgICAgIHZhbHVlPVwiJHtlc2NhcGVIdG1sKGNhdGVnb3J5S2V5KX1cIlxuICAgICAgICAgICAgbGlzdD1cIiR7Y2F0ZWdvcnlMaXN0SWR9XCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBQcm9ncmFtbWluZ1wiXG4gICAgICAgICAgICB0aXRsZT1cIlNlc3Npb24tb25seSBjYXRlZ29yeSBsYWJlbCB1c2VkIHdoZW4gZ3JvdXBpbmcgc2tpbGxzIGluIHRoZSBnZW5lcmF0ZWQgQ1ZcIlxuICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDoxMDAlO2ZvbnQtc2l6ZTowLjhlbTtwYWRkaW5nOjRweCA2cHg7Ym9yZGVyOjFweCBzb2xpZCAjZDFkNWRiO2JvcmRlci1yYWRpdXM6NHB4O1wiLz5cbiAgICAgICAgICAke2dyb3VwaW5nU3VnZ2VzdGlvbj8uY2F0ZWdvcnlDaGFuZ2VkID8gYDxkaXYgY2xhc3M9XCJza2lsbC1haS1oaW50XCIgc3R5bGU9XCJtYXJnaW4tdG9wOjRweDtmb250LXNpemU6MC43NWVtO2NvbG9yOiM0MzM4Y2E7XCI+XG4gICAgICAgICAgICBBSSBzdWdnZXN0aW9uOiAke2VzY2FwZUh0bWwoZ3JvdXBpbmdTdWdnZXN0aW9uLmNhdGVnb3J5KX1cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJza2lsbC1hcHBseS1haVwiIGRhdGEtc2tpbGw9XCIke3NraWxsTmFtZUVzY31cIiBkYXRhLWFpLWZpZWxkPVwiY2F0ZWdvcnlcIiBkYXRhLWFpLXZhbHVlPVwiJHtlc2NhcGVIdG1sKGdyb3VwaW5nU3VnZ2VzdGlvbi5jYXRlZ29yeSl9XCIgc3R5bGU9XCJtYXJnaW4tbGVmdDo2cHg7Ym9yZGVyOjFweCBzb2xpZCAjYzdkMmZlO2JhY2tncm91bmQ6I2VlZjJmZjtjb2xvcjojNDMzOGNhO2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6MXB4IDZweDtjdXJzb3I6cG9pbnRlcjtcIj5BcHBseTwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PmAgOiAnJ31cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwibWluLXdpZHRoOjEwMHB4O1wiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwic2tpbGwtZ3JvdXAtaW5wdXRcIiBkYXRhLXNraWxsPVwiJHtza2lsbE5hbWVFc2N9XCJcbiAgICAgICAgICAgIHZhbHVlPVwiJHtlc2NhcGVIdG1sKGdyb3VwS2V5KX1cIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIGNfZmFtaWx5XCJcbiAgICAgICAgICAgIHRpdGxlPVwiU2tpbGxzIHdpdGggdGhlIHNhbWUgZ3JvdXAga2V5IHJlbmRlciBhcyBvbmUgY29tbWEtc2VwYXJhdGVkIGJ1bGxldFwiXG4gICAgICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Zm9udC1zaXplOjAuOGVtO3BhZGRpbmc6NHB4IDZweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo0cHg7XCIvPlxuICAgICAgICAgICR7Z3JvdXBpbmdTdWdnZXN0aW9uPy5ncm91cENoYW5nZWQgPyBgPGRpdiBjbGFzcz1cInNraWxsLWFpLWhpbnRcIiBzdHlsZT1cIm1hcmdpbi10b3A6NHB4O2ZvbnQtc2l6ZTowLjc1ZW07Y29sb3I6IzQzMzhjYTtcIj5cbiAgICAgICAgICAgIEFJIHN1Z2dlc3Rpb246ICR7ZXNjYXBlSHRtbChncm91cGluZ1N1Z2dlc3Rpb24uZ3JvdXApfVxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNraWxsLWFwcGx5LWFpXCIgZGF0YS1za2lsbD1cIiR7c2tpbGxOYW1lRXNjfVwiIGRhdGEtYWktZmllbGQ9XCJncm91cFwiIGRhdGEtYWktdmFsdWU9XCIke2VzY2FwZUh0bWwoZ3JvdXBpbmdTdWdnZXN0aW9uLmdyb3VwKX1cIiBzdHlsZT1cIm1hcmdpbi1sZWZ0OjZweDtib3JkZXI6MXB4IHNvbGlkICNjN2QyZmU7YmFja2dyb3VuZDojZWVmMmZmO2NvbG9yOiM0MzM4Y2E7Ym9yZGVyLXJhZGl1czo0cHg7cGFkZGluZzoxcHggNnB4O2N1cnNvcjpwb2ludGVyO1wiPkFwcGx5PC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+YCA6ICcnfVxuICAgICAgICAgICR7Z3JvdXBXYXJuaW5nID8gYDxkaXYgY2xhc3M9XCJza2lsbC1ncm91cC13YXJuaW5nXCIgdGl0bGU9XCIke2VzY2FwZUh0bWwoZ3JvdXBXYXJuaW5nLnByZXZpZXcpfVwiIHN0eWxlPVwibWFyZ2luLXRvcDo0cHg7Zm9udC1zaXplOjAuNzVlbTtjb2xvcjojYjQ1MzA5O1wiPlx1MjZBMCAke2VzY2FwZUh0bWwoZ3JvdXBXYXJuaW5nLm1lc3NhZ2UpfTwvZGl2PmAgOiAnJ31cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwibWluLXdpZHRoOjEyMHB4O1wiPlxuICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJza2lsbC1wcm9maWNpZW5jeS1pbnB1dFwiIGRhdGEtc2tpbGw9XCIke3NraWxsTmFtZUVzY31cIlxuICAgICAgICAgICAgdGl0bGU9XCJTZXNzaW9uLW9ubHkgcHJvZmljaWVuY3kgbGFiZWwgdXNlZCB3aGVuIHJlbmRlcmluZyBpbmxpbmUgc2tpbGwgYnVsbGV0c1wiXG4gICAgICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Zm9udC1zaXplOjAuOGVtO3BhZGRpbmc6NHB4IDZweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo0cHg7XCI+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCIgJHshcHJvZmljaWVuY3lLZXkgPyAnc2VsZWN0ZWQnIDogJyd9Pk5vbmU8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJiZWdpbm5lclwiICR7cHJvZmljaWVuY3lLZXkgPT09ICdiZWdpbm5lcicgPyAnc2VsZWN0ZWQnIDogJyd9PkJlZ2lubmVyPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiZmFtaWxpYXJcIiAke3Byb2ZpY2llbmN5S2V5ID09PSAnZmFtaWxpYXInID8gJ3NlbGVjdGVkJyA6ICcnfT5GYW1pbGlhcjwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImludGVybWVkaWF0ZVwiICR7cHJvZmljaWVuY3lLZXkgPT09ICdpbnRlcm1lZGlhdGUnID8gJ3NlbGVjdGVkJyA6ICcnfT5JbnRlcm1lZGlhdGU8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJhZHZhbmNlZFwiICR7cHJvZmljaWVuY3lLZXkgPT09ICdhZHZhbmNlZCcgPyAnc2VsZWN0ZWQnIDogJyd9PkFkdmFuY2VkPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiZXhwZXJ0XCIgJHtwcm9maWNpZW5jeUtleSA9PT0gJ2V4cGVydCcgPyAnc2VsZWN0ZWQnIDogJyd9PkV4cGVydDwvb3B0aW9uPlxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJtaW4td2lkdGg6MTgwcHg7XCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJza2lsbC1zdWJza2lsbHMtaW5wdXRcIiBkYXRhLXNraWxsPVwiJHtza2lsbE5hbWVFc2N9XCJcbiAgICAgICAgICAgIHZhbHVlPVwiJHtlc2NhcGVIdG1sKHN1YnNraWxscy5qb2luKCcsICcpKX1cIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIFBhbmRhcywgTnVtUHlcIlxuICAgICAgICAgICAgdGl0bGU9XCJDb21tYS1zZXBhcmF0ZWQgc3ViLXNraWxscyB1c2VkIGluIGlubGluZSBza2lsbCBidWxsZXRzXCJcbiAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTtmb250LXNpemU6MC44ZW07cGFkZGluZzo0cHggNnB4O2JvcmRlcjoxcHggc29saWQgI2QxZDVkYjtib3JkZXItcmFkaXVzOjRweDtcIi8+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cIm1pbi13aWR0aDoxODBweDtcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cInNraWxsLXBhcmVudGhldGljYWwtaW5wdXRcIiBkYXRhLXNraWxsPVwiJHtza2lsbE5hbWVFc2N9XCJcbiAgICAgICAgICAgIHZhbHVlPVwiJHtlc2NhcGVIdG1sKHBhcmVudGhldGljYWxLZXkpfVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIk9wdGlvbmFsIGlubGluZSBub3RlXCJcbiAgICAgICAgICAgIHRpdGxlPVwiRnJlZS1mb3JtIHBhcmVudGhldGljYWwgb3ZlcnJpZGUgZm9yIHRoZSByZW5kZXJlZCBpbmxpbmUgc2tpbGwgbGFiZWxcIlxuICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDoxMDAlO2ZvbnQtc2l6ZTowLjhlbTtwYWRkaW5nOjRweCA2cHg7Ym9yZGVyOjFweCBzb2xpZCAjZDFkNWRiO2JvcmRlci1yYWRpdXM6NHB4O1wiLz5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkPjxzdHJvbmc+JHtlc2NhcGVIdG1sKHJlY29tbWVuZGF0aW9uVGV4dCl9PC9zdHJvbmc+PC90ZD5cbiAgICAgICAgPHRkPiR7Y29uZmlkZW5jZUJhZGdlfTwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cIm1heC13aWR0aDozMDBweDtcIj48c21hbGw+JHtlc2NhcGVIdG1sKGZ1bGxSZWFzb25pbmdUZXh0KX08L3NtYWxsPjwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cIm1pbi13aWR0aDoyNjBweDtcIj5cbiAgICAgICAgICAke2lzTmV3ID8gYDxpbnB1dFxuICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgY2xhc3M9XCJza2lsbC1tYXRjaC1pbnB1dFwiXG4gICAgICAgICAgICBkYXRhLXNraWxsPVwiJHtza2lsbE5hbWVFc2N9XCJcbiAgICAgICAgICAgIHZhbHVlPVwiJHtlc2NhcGVIdG1sKG1hdGNoVmFsdWUpfVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cImV4cF8xLCBleHBfMlwiXG4gICAgICAgICAgICB0aXRsZT1cIiR7ZXNjYXBlSHRtbChtYXRjaEhlbHApfVwiXG4gICAgICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Zm9udC1zaXplOjAuODVlbTtwYWRkaW5nOjZweCA4cHg7Ym9yZGVyOjFweCBzb2xpZCAjZDFkNWRiO2JvcmRlci1yYWRpdXM6NnB4O1wiXG4gICAgICAgICAgLz48c3BhbiBjbGFzcz1cImRlcml2ZWQteWVhcnMtaGludFwiIGRhdGEtc2tpbGw9XCIke3NraWxsTmFtZUVzY31cIiB0aXRsZT1cIkVzdGltYXRlZCB5ZWFycyBkZXJpdmVkIGZyb20gbWF0Y2hlZCBleHBlcmllbmNlIGVudHJpZXNcIiBzdHlsZT1cImRpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbi10b3A6NHB4O2ZvbnQtc2l6ZTowLjhlbTtjb2xvcjojNmI3MjgwO1wiPiR7ZXNjYXBlSHRtbCh5ZWFyc0hpbnQpfTwvc3Bhbj5gIDogJzxzcGFuIHN0eWxlPVwiY29sb3I6IzljYTNhZjtcIj5cdTIwMTQ8L3NwYW4+J31cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwiYWN0aW9uLWJ0bnNcIiBzdHlsZT1cIndoaXRlLXNwYWNlOm5vd3JhcDtcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG4gJHtkZWZhdWx0QWN0aW9uID09PSAnZW1waGFzaXplJyAgICA/ICdhY3RpdmUnIDogJyd9XCIgZGF0YS1hY3Rpb249XCJlbXBoYXNpemVcIiAgICBhcmlhLWxhYmVsPVwiRW1waGFzaXplICR7c2tpbGxOYW1lRXNjfVwiICAgIGFyaWEtcHJlc3NlZD1cIiR7ZGVmYXVsdEFjdGlvbiA9PT0gJ2VtcGhhc2l6ZSd9XCIgICAgdGl0bGU9XCJFbXBoYXNpemUgXHUyMDE0IGZlYXR1cmUgcHJvbWluZW50bHlcIiBzdHlsZT1cImNvbG9yOiMxMGI5ODE7XCI+XHUyNzk1PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuICR7ZGVmYXVsdEFjdGlvbiA9PT0gJ2luY2x1ZGUnICAgICAgPyAnYWN0aXZlJyA6ICcnfVwiIGRhdGEtYWN0aW9uPVwiaW5jbHVkZVwiICAgICAgYXJpYS1sYWJlbD1cIkluY2x1ZGUgJHtza2lsbE5hbWVFc2N9XCIgICAgICBhcmlhLXByZXNzZWQ9XCIke2RlZmF1bHRBY3Rpb24gPT09ICdpbmNsdWRlJ31cIiAgICAgIHRpdGxlPVwiSW5jbHVkZSBcdTIwMTQgc3RhbmRhcmQgbGlzdGluZ1wiPlx1MjcxMzwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0biAke2RlZmF1bHRBY3Rpb24gPT09ICdkZS1lbXBoYXNpemUnID8gJ2FjdGl2ZScgOiAnJ31cIiBkYXRhLWFjdGlvbj1cImRlLWVtcGhhc2l6ZVwiIGFyaWEtbGFiZWw9XCJEZS1lbXBoYXNpemUgJHtza2lsbE5hbWVFc2N9XCIgYXJpYS1wcmVzc2VkPVwiJHtkZWZhdWx0QWN0aW9uID09PSAnZGUtZW1waGFzaXplJ31cIiB0aXRsZT1cIkRlLWVtcGhhc2l6ZSBcdTIwMTQgYnJpZWYgbWVudGlvblwiICAgIHN0eWxlPVwiY29sb3I6I2Y1OWUwYjtcIj5cdTI3OTY8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG4gJHtkZWZhdWx0QWN0aW9uID09PSAnZXhjbHVkZScgICAgICA/ICdhY3RpdmUnIDogJyd9XCIgZGF0YS1hY3Rpb249XCJleGNsdWRlXCIgICAgICBhcmlhLWxhYmVsPVwiRXhjbHVkZSAke3NraWxsTmFtZUVzY31cIiAgICAgIGFyaWEtcHJlc3NlZD1cIiR7ZGVmYXVsdEFjdGlvbiA9PT0gJ2V4Y2x1ZGUnfVwiICAgICAgdGl0bGU9XCJFeGNsdWRlIFx1MjAxNCBvbWl0IGZyb20gQ1ZcIiAgICAgICAgICBzdHlsZT1cImNvbG9yOiNlZjQ0NDQ7XCI+JHtleWVTbGFzaEljb24oKX08L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBkYXRhLWFjdGlvbj1cInJvdy11cFwiICAgYXJpYS1sYWJlbD1cIk1vdmUgJHtza2lsbE5hbWVFc2N9IGVhcmxpZXJcIiB0aXRsZT1cIk1vdmUgdXBcIiAgICR7aXNGaXJzdCA/ICdkaXNhYmxlZCcgOiAnJ30+XHUyMTkxPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgZGF0YS1hY3Rpb249XCJyb3ctZG93blwiIGFyaWEtbGFiZWw9XCJNb3ZlICR7c2tpbGxOYW1lRXNjfSBsYXRlclwiICAgdGl0bGU9XCJNb3ZlIGRvd25cIiAke2lzTGFzdCAgPyAnZGlzYWJsZWQnIDogJyd9Plx1MjE5MzwvYnV0dG9uPlxuICAgICAgICA8L3RkPlxuICAgICAgPC90cj5cbiAgICBgO1xuICB9KTtcblxuICB0YWJsZUhUTUwgKz0gJzwvdGJvZHk+PC90YWJsZT4nO1xuICBjb250YWluZXIuaW5uZXJIVE1MID0gdGFibGVIVE1MO1xuXG4gIC8vIFNhdmUgZ3JvdXAga2V5IGZvciB0aGlzIHNlc3Npb24gd2hlbiB1c2VyIGZpbmlzaGVzIGVkaXRpbmdcbiAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5za2lsbC1jYXRlZ29yeS1tYW5hZ2VyJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGUgPT4ge1xuICAgIGNvbnN0IGNhdGVnb3J5TWFuYWdlcklucHV0ID0gZS50YXJnZXQuY2xvc2VzdCgnLnNraWxsLWNhdGVnb3J5LW1hbmFnZXItaW5wdXQnKTtcbiAgICBpZiAoY2F0ZWdvcnlNYW5hZ2VySW5wdXQpIHtcbiAgICAgIGNvbnN0IG1hbmFnZXJSb3cgPSBjYXRlZ29yeU1hbmFnZXJJbnB1dC5jbG9zZXN0KCcuc2tpbGwtY2F0ZWdvcnktbWFuYWdlci1yb3cnKTtcbiAgICAgIGNvbnN0IG9sZENhdGVnb3J5ID0gbWFuYWdlclJvdz8uZGF0YXNldC5jYXRlZ29yeSB8fCAnJztcbiAgICAgIGNvbnN0IG5ld0NhdGVnb3J5ID0gY2F0ZWdvcnlNYW5hZ2VySW5wdXQudmFsdWUudHJpbSgpO1xuICAgICAgaWYgKCFvbGRDYXRlZ29yeSB8fCAhbmV3Q2F0ZWdvcnkgfHwgb2xkQ2F0ZWdvcnkgPT09IG5ld0NhdGVnb3J5KSB7XG4gICAgICAgIGlmIChtYW5hZ2VyUm93KSBjYXRlZ29yeU1hbmFnZXJJbnB1dC52YWx1ZSA9IG9sZENhdGVnb3J5O1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBfcmVuYW1lU2tpbGxDYXRlZ29yeUxvY2FsbHkob2xkQ2F0ZWdvcnksIG5ld0NhdGVnb3J5KTtcbiAgICAgIHJlbmFtZVNraWxsQ2F0ZWdvcnkob2xkQ2F0ZWdvcnksIG5ld0NhdGVnb3J5KVxuICAgICAgICAudGhlbigoKSA9PiBfcmVuZGVyU2tpbGxzVGFibGUoY29udGFpbmVyLCByZWNvbW1lbmRlZFNldCwgZGF0YSwgaGFyZFNraWxsU2V0LCBzb2Z0U2tpbGxTZXQpKVxuICAgICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgIF9yZW5hbWVTa2lsbENhdGVnb3J5TG9jYWxseShuZXdDYXRlZ29yeSwgb2xkQ2F0ZWdvcnkpO1xuICAgICAgICAgIGlmIChtYW5hZ2VyUm93KSBjYXRlZ29yeU1hbmFnZXJJbnB1dC52YWx1ZSA9IG9sZENhdGVnb3J5O1xuICAgICAgICAgIHNob3dUb2FzdCgnRmFpbGVkIHRvIHJlbmFtZSBza2lsbCBjYXRlZ29yeS4nLCAnZXJyb3InKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9KTtcblxuICBjb250YWluZXIucXVlcnlTZWxlY3RvcignI3NraWxscy1yZXZpZXctdGFibGUgdGJvZHknKT8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZSA9PiB7XG4gICAgY29uc3QgY2F0ZWdvcnlJbnB1dCA9IGUudGFyZ2V0LmNsb3Nlc3QoJy5za2lsbC1jYXRlZ29yeS1pbnB1dCcpO1xuXG4gIGNvbnN0IGFkZFNraWxsRm9ybSA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcjYWRkLXNraWxsLWZvcm0nKTtcbiAgY29uc3QgdG9nZ2xlQWRkU2tpbGxGb3JtID0gKCkgPT4ge1xuICAgIGlmICghYWRkU2tpbGxGb3JtKSByZXR1cm47XG4gICAgYWRkU2tpbGxGb3JtLnN0eWxlLmRpc3BsYXkgPSBhZGRTa2lsbEZvcm0uc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnID8gJ2Jsb2NrJyA6ICdub25lJztcbiAgfTtcbiAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJyN0b2dnbGUtYWRkLXNraWxsLWZvcm0nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0b2dnbGVBZGRTa2lsbEZvcm0pO1xuICBjb250YWluZXIucXVlcnlTZWxlY3RvcignI2NhbmNlbC1hZGQtc2tpbGwnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgaWYgKCFhZGRTa2lsbEZvcm0pIHJldHVybjtcbiAgICBhZGRTa2lsbEZvcm0ucmVzZXQoKTtcbiAgICBhZGRTa2lsbEZvcm0uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgfSk7XG4gIGFkZFNraWxsRm9ybT8uYWRkRXZlbnRMaXN0ZW5lcignc3VibWl0JywgYXN5bmMgZSA9PiB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKGFkZFNraWxsRm9ybSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHNhdmVVc2VyQ3JlYXRlZFNraWxsKHtcbiAgICAgICAgbmFtZTogZm9ybURhdGEuZ2V0KCduYW1lJyksXG4gICAgICAgIGNhdGVnb3J5OiBmb3JtRGF0YS5nZXQoJ2NhdGVnb3J5JyksXG4gICAgICAgIGdyb3VwOiBmb3JtRGF0YS5nZXQoJ2dyb3VwJyksXG4gICAgICAgIHByb2ZpY2llbmN5OiBmb3JtRGF0YS5nZXQoJ3Byb2ZpY2llbmN5JyksXG4gICAgICAgIHN1YnNraWxsczogZm9ybURhdGEuZ2V0KCdzdWJza2lsbHMnKSxcbiAgICAgICAgcGFyZW50aGV0aWNhbDogZm9ybURhdGEuZ2V0KCdwYXJlbnRoZXRpY2FsJyksXG4gICAgICB9KTtcbiAgICAgIHNob3dUb2FzdCgnU2Vzc2lvbi1vbmx5IHNraWxsIGFkZGVkLicpO1xuICAgICAgYWRkU2tpbGxGb3JtLnJlc2V0KCk7XG4gICAgICBhZGRTa2lsbEZvcm0uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIF9yZW5kZXJTa2lsbHNUYWJsZShjb250YWluZXIsIHJlY29tbWVuZGVkU2V0LCBkYXRhLCBoYXJkU2tpbGxTZXQsIHNvZnRTa2lsbFNldCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHNob3dUb2FzdChlcnJvci5tZXNzYWdlIHx8ICdGYWlsZWQgdG8gYWRkIHNraWxsLicsICdlcnJvcicpO1xuICAgIH1cbiAgfSk7XG4gICAgaWYgKGNhdGVnb3J5SW5wdXQpIHtcbiAgICAgIGNvbnN0IHNraWxsTmFtZSA9IGNhdGVnb3J5SW5wdXQuZGF0YXNldC5za2lsbDtcbiAgICAgIGNvbnN0IG5ld0NhdGVnb3J5ID0gY2F0ZWdvcnlJbnB1dC52YWx1ZS50cmltKCk7XG4gICAgICBzYXZlU2tpbGxDYXRlZ29yeU92ZXJyaWRlKHNraWxsTmFtZSwgbmV3Q2F0ZWdvcnkpLmNhdGNoKCgpID0+IHtcbiAgICAgICAgc2hvd1RvYXN0KCdGYWlsZWQgdG8gc2F2ZSBza2lsbCBjYXRlZ29yeS4nLCAnZXJyb3InKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGlucHV0ID0gZS50YXJnZXQuY2xvc2VzdCgnLnNraWxsLWdyb3VwLWlucHV0Jyk7XG4gICAgaWYgKGlucHV0KSB7XG4gICAgICBjb25zdCBza2lsbE5hbWUgPSBpbnB1dC5kYXRhc2V0LnNraWxsO1xuICAgICAgY29uc3QgbmV3R3JvdXAgPSBpbnB1dC52YWx1ZS50cmltKCk7XG4gICAgICBzYXZlU2tpbGxHcm91cE92ZXJyaWRlKHNraWxsTmFtZSwgbmV3R3JvdXApLmNhdGNoKCgpID0+IHtcbiAgICAgICAgc2hvd1RvYXN0KCdGYWlsZWQgdG8gc2F2ZSBza2lsbCBncm91cC4nLCAnZXJyb3InKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHF1YWxpZmllcklucHV0ID0gZS50YXJnZXQuY2xvc2VzdCgnLnNraWxsLXByb2ZpY2llbmN5LWlucHV0LCAuc2tpbGwtc3Vic2tpbGxzLWlucHV0LCAuc2tpbGwtcGFyZW50aGV0aWNhbC1pbnB1dCcpO1xuICAgIGlmICghcXVhbGlmaWVySW5wdXQpIHJldHVybjtcbiAgICBjb25zdCBza2lsbE5hbWUgPSBxdWFsaWZpZXJJbnB1dC5kYXRhc2V0LnNraWxsO1xuICAgIGNvbnN0IHJvdyA9IHF1YWxpZmllcklucHV0LmNsb3Nlc3QoJ3RyW2RhdGEtc2tpbGxdJyk7XG4gICAgaWYgKCFza2lsbE5hbWUgfHwgIXJvdykgcmV0dXJuO1xuICAgIGNvbnN0IHByb2ZpY2llbmN5ID0gcm93LnF1ZXJ5U2VsZWN0b3IoJy5za2lsbC1wcm9maWNpZW5jeS1pbnB1dCcpPy52YWx1ZSB8fCAnJztcbiAgICBjb25zdCBzdWJza2lsbHNWYWx1ZSA9IHJvdy5xdWVyeVNlbGVjdG9yKCcuc2tpbGwtc3Vic2tpbGxzLWlucHV0Jyk/LnZhbHVlIHx8ICcnO1xuICAgIGNvbnN0IHBhcmVudGhldGljYWwgPSByb3cucXVlcnlTZWxlY3RvcignLnNraWxsLXBhcmVudGhldGljYWwtaW5wdXQnKT8udmFsdWUgfHwgJyc7XG4gICAgc2F2ZVNraWxsUXVhbGlmaWVyT3ZlcnJpZGUoc2tpbGxOYW1lLCB7XG4gICAgICBwcm9maWNpZW5jeSxcbiAgICAgIHN1YnNraWxsczogc3Vic2tpbGxzVmFsdWUsXG4gICAgICBwYXJlbnRoZXRpY2FsLFxuICAgIH0pLmNhdGNoKCgpID0+IHtcbiAgICAgIHNob3dUb2FzdCgnRmFpbGVkIHRvIHNhdmUgc2tpbGwgcXVhbGlmaWVycy4nLCAnZXJyb3InKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gVXBkYXRlIGRlcml2ZWQteWVhcnMgaGludCBsaXZlIGFzIHVzZXIgZWRpdHMgdGhlIGV4cGVyaWVuY2UgbWF0Y2ggaW5wdXRcbiAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJyNza2lsbHMtcmV2aWV3LXRhYmxlIHRib2R5Jyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgZSA9PiB7XG4gICAgY29uc3QgaW5wdXQgPSBlLnRhcmdldC5jbG9zZXN0KCcuc2tpbGwtbWF0Y2gtaW5wdXQnKTtcbiAgICBpZiAoIWlucHV0KSByZXR1cm47XG4gICAgY29uc3Qgc2tpbGxOYW1lID0gaW5wdXQuZGF0YXNldC5za2lsbDtcbiAgICBjb25zdCBpZHMgPSBpbnB1dC52YWx1ZS5zcGxpdCgnLCcpLm1hcCh4ID0+IHgudHJpbSgpKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgY29uc3QgeWVhcnMgPSBfY29tcHV0ZVllYXJzRnJvbUlkcyhpZHMsIGFsbEV4cGVyaWVuY2VzKTtcbiAgICBjb25zdCBoaW50ID0geWVhcnMgIT0gbnVsbCA/IGB+JHt5ZWFyc30geXIke3llYXJzID09PSAxID8gJycgOiAncyd9YCA6ICdubyBtYXRjaCc7XG4gICAgY29uc3Qgc3BhbiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKGAuZGVyaXZlZC15ZWFycy1oaW50W2RhdGEtc2tpbGw9XCIke0NTUy5lc2NhcGUoc2tpbGxOYW1lKX1cIl1gKTtcbiAgICBpZiAoc3Bhbikgc3Bhbi50ZXh0Q29udGVudCA9IGhpbnQ7XG4gIH0pO1xuXG4gIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcjc2tpbGxzLXJldmlldy10YWJsZSB0Ym9keScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGUgPT4ge1xuICAgIGNvbnN0IHR5cGVUb2dnbGUgPSBlLnRhcmdldC5jbG9zZXN0KCcuc2tpbGwtdHlwZS10b2dnbGUnKTtcbiAgICBpZiAodHlwZVRvZ2dsZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGNvbnN0IHNraWxsTmFtZSA9IHR5cGVUb2dnbGUuZGF0YXNldC5za2lsbDtcbiAgICAgIGNvbnN0IHRvZ2dsZVRvID0gdHlwZVRvZ2dsZS5kYXRhc2V0LnRvZ2dsZVRvIHx8IG51bGw7XG4gICAgICB3aW5kb3cuX3NraWxsVHlwZU92ZXJyaWRlcyA9IHdpbmRvdy5fc2tpbGxUeXBlT3ZlcnJpZGVzIHx8IHt9O1xuICAgICAgaWYgKHRvZ2dsZVRvKSB7XG4gICAgICAgIHdpbmRvdy5fc2tpbGxUeXBlT3ZlcnJpZGVzW3NraWxsTmFtZS50b0xvd2VyQ2FzZSgpXSA9IHRvZ2dsZVRvO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHdpbmRvdy5fc2tpbGxUeXBlT3ZlcnJpZGVzW3NraWxsTmFtZS50b0xvd2VyQ2FzZSgpXTtcbiAgICAgIH1cbiAgICAgIHNhdmVTa2lsbFF1YWxpZmllck92ZXJyaWRlKHNraWxsTmFtZSwge1xuICAgICAgICBwcm9maWNpZW5jeTogY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoYC5za2lsbC1wcm9maWNpZW5jeS1pbnB1dFtkYXRhLXNraWxsPVwiJHtfY3NzRXNjYXBlKHNraWxsTmFtZSl9XCJdYCk/LnZhbHVlIHx8ICcnLFxuICAgICAgICBzdWJza2lsbHM6IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKGAuc2tpbGwtc3Vic2tpbGxzLWlucHV0W2RhdGEtc2tpbGw9XCIke19jc3NFc2NhcGUoc2tpbGxOYW1lKX1cIl1gKT8udmFsdWUgfHwgJycsXG4gICAgICAgIHBhcmVudGhldGljYWw6IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKGAuc2tpbGwtcGFyZW50aGV0aWNhbC1pbnB1dFtkYXRhLXNraWxsPVwiJHtfY3NzRXNjYXBlKHNraWxsTmFtZSl9XCJdYCk/LnZhbHVlIHx8ICcnLFxuICAgICAgICBza2lsbF90eXBlOiB0b2dnbGVUbyB8fCAnJyxcbiAgICAgIH0pLnRoZW4oKCkgPT4gX3JlbmRlclNraWxsc1RhYmxlKGNvbnRhaW5lciwgcmVjb21tZW5kZWRTZXQsIGRhdGEsIGhhcmRTa2lsbFNldCwgc29mdFNraWxsU2V0KSlcbiAgICAgICAgLmNhdGNoKCgpID0+IHNob3dUb2FzdCgnRmFpbGVkIHRvIHNhdmUgc2tpbGwgdHlwZSBvdmVycmlkZS4nLCAnZXJyb3InKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYWlCdG4gPSBlLnRhcmdldC5jbG9zZXN0KCcuc2tpbGwtYXBwbHktYWknKTtcbiAgICBpZiAoYWlCdG4pIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBjb25zdCBza2lsbE5hbWUgPSBhaUJ0bi5kYXRhc2V0LnNraWxsO1xuICAgICAgY29uc3QgZmllbGQgPSBhaUJ0bi5kYXRhc2V0LmFpRmllbGQ7XG4gICAgICBjb25zdCB2YWx1ZSA9IGFpQnRuLmRhdGFzZXQuYWlWYWx1ZSB8fCAnJztcbiAgICAgIGlmIChmaWVsZCA9PT0gJ2NhdGVnb3J5Jykge1xuICAgICAgICBjb25zdCBpbnB1dCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKGAuc2tpbGwtY2F0ZWdvcnktaW5wdXRbZGF0YS1za2lsbD1cIiR7X2Nzc0VzY2FwZShza2lsbE5hbWUpfVwiXWApO1xuICAgICAgICBpZiAoaW5wdXQpIGlucHV0LnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHNhdmVTa2lsbENhdGVnb3J5T3ZlcnJpZGUoc2tpbGxOYW1lLCB2YWx1ZSlcbiAgICAgICAgICAudGhlbigoKSA9PiBfcmVuZGVyU2tpbGxzVGFibGUoY29udGFpbmVyLCByZWNvbW1lbmRlZFNldCwgZGF0YSwgaGFyZFNraWxsU2V0LCBzb2Z0U2tpbGxTZXQpKVxuICAgICAgICAgIC5jYXRjaCgoKSA9PiBzaG93VG9hc3QoJ0ZhaWxlZCB0byBhcHBseSBBSSBjYXRlZ29yeSBzdWdnZXN0aW9uLicsICdlcnJvcicpKTtcbiAgICAgIH0gZWxzZSBpZiAoZmllbGQgPT09ICdncm91cCcpIHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcihgLnNraWxsLWdyb3VwLWlucHV0W2RhdGEtc2tpbGw9XCIke19jc3NFc2NhcGUoc2tpbGxOYW1lKX1cIl1gKTtcbiAgICAgICAgaWYgKGlucHV0KSBpbnB1dC52YWx1ZSA9IHZhbHVlO1xuICAgICAgICBzYXZlU2tpbGxHcm91cE92ZXJyaWRlKHNraWxsTmFtZSwgdmFsdWUpXG4gICAgICAgICAgLnRoZW4oKCkgPT4gX3JlbmRlclNraWxsc1RhYmxlKGNvbnRhaW5lciwgcmVjb21tZW5kZWRTZXQsIGRhdGEsIGhhcmRTa2lsbFNldCwgc29mdFNraWxsU2V0KSlcbiAgICAgICAgICAuY2F0Y2goKCkgPT4gc2hvd1RvYXN0KCdGYWlsZWQgdG8gYXBwbHkgQUkgZ3JvdXAgc3VnZ2VzdGlvbi4nLCAnZXJyb3InKSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGJ0biA9IGUudGFyZ2V0LmNsb3Nlc3QoJy5pY29uLWJ0bicpO1xuICAgIGlmICghYnRuKSByZXR1cm47XG4gICAgY29uc3QgdHIgPSBidG4uY2xvc2VzdCgndHJbZGF0YS1za2lsbF0nKTtcbiAgICBpZiAoIXRyKSByZXR1cm47XG4gICAgY29uc3Qgc2tpbGxOYW1lID0gdHIuZGF0YXNldC5za2lsbDtcbiAgICBjb25zdCBhY3Rpb24gICAgPSBidG4uZGF0YXNldC5hY3Rpb247XG4gICAgaWYgKGFjdGlvbiA9PT0gJ3Jvdy11cCcpIHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBtb3ZlU2tpbGxSb3coc2tpbGxOYW1lLCAtMSk7XG4gICAgfSBlbHNlIGlmIChhY3Rpb24gPT09ICdyb3ctZG93bicpIHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBtb3ZlU2tpbGxSb3coc2tpbGxOYW1lLCArMSk7XG4gICAgfSBlbHNlIGlmIChhY3Rpb24pIHtcbiAgICAgIGhhbmRsZUFjdGlvbkNsaWNrKHNraWxsTmFtZSwgYWN0aW9uLCAnc2tpbGwnKTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcuc2tpbGwtY2F0ZWdvcnktbWFuYWdlcicpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGUgPT4ge1xuICAgIGNvbnN0IGJ0biA9IGUudGFyZ2V0LmNsb3Nlc3QoJy5pY29uLWJ0bltkYXRhLWFjdGlvbl49XCJjYXRlZ29yeS1cIl0nKTtcbiAgICBpZiAoIWJ0bikgcmV0dXJuO1xuICAgIGNvbnN0IGNhdGVnb3J5TmFtZSA9IGJ0bi5kYXRhc2V0LmNhdGVnb3J5IHx8ICcnO1xuICAgIGNvbnN0IGRpcmVjdGlvbiA9IGJ0bi5kYXRhc2V0LmFjdGlvbiA9PT0gJ2NhdGVnb3J5LXVwJyA/IC0xIDogMTtcbiAgICBjb25zdCB1cGRhdGVkT3JkZXIgPSBfbW92ZVNraWxsQ2F0ZWdvcnlMb2NhbGx5KGNhdGVnb3J5TmFtZSwgZGlyZWN0aW9uKTtcbiAgICBpZiAoIXVwZGF0ZWRPcmRlcikgcmV0dXJuO1xuICAgIHNhdmVTa2lsbENhdGVnb3J5T3JkZXIodXBkYXRlZE9yZGVyKVxuICAgICAgLnRoZW4oKCkgPT4gX3JlbmRlclNraWxsc1RhYmxlKGNvbnRhaW5lciwgcmVjb21tZW5kZWRTZXQsIGRhdGEsIGhhcmRTa2lsbFNldCwgc29mdFNraWxsU2V0KSlcbiAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgIF9tb3ZlU2tpbGxDYXRlZ29yeUxvY2FsbHkoY2F0ZWdvcnlOYW1lLCAtZGlyZWN0aW9uKTtcbiAgICAgICAgc2hvd1RvYXN0KCdGYWlsZWQgdG8gc2F2ZSBza2lsbCBjYXRlZ29yeSBvcmRlci4nLCAnZXJyb3InKTtcbiAgICAgIH0pO1xuICB9KTtcblxuICBjb25zdCBza2lsbFRvb2xiYXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgc2tpbGxUb29sYmFyLmNsYXNzTmFtZSA9ICdidWxrLXRvb2xiYXInO1xuICBza2lsbFRvb2xiYXIuaW5uZXJIVE1MID0gYFxuICAgIDxzcGFuPkJ1bGs6PC9zcGFuPlxuICAgIDxidXR0b24gY2xhc3M9XCJidWxrLWJ0biBidWxrLXJlY29tbWVuZGVkXCIgb25jbGljaz1cImJ1bGtBY3Rpb24oJ3JlY29tbWVuZGVkJywnc2tpbGwnKVwiIHRpdGxlPVwiU2V0IGFsbCB0byB0aGUgTExNIHJlY29tbWVuZGF0aW9uXCI+XHUyNzI4IEFjY2VwdCBBbGwgUmVjb21tZW5kZWQ8L2J1dHRvbj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnVsay1idG4gYnVsay1lbXBoYXNpemVcIiAgIG9uY2xpY2s9XCJidWxrQWN0aW9uKCdlbXBoYXNpemUnLCdza2lsbCcpXCI+XHUyNzk1IEVtcGhhc2l6ZSBBbGw8L2J1dHRvbj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnVsay1idG4gYnVsay1pbmNsdWRlXCIgICAgIG9uY2xpY2s9XCJidWxrQWN0aW9uKCdpbmNsdWRlJywnc2tpbGwnKVwiPlx1MjcxMyBJbmNsdWRlIEFsbDwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJidWxrLWJ0biBidWxrLWV4Y2x1ZGVcIiAgICAgb25jbGljaz1cImJ1bGtBY3Rpb24oJ2V4Y2x1ZGUnLCdza2lsbCcpXCI+JHtleWVTbGFzaEljb24oKX0gRXhjbHVkZSBBbGw8L2J1dHRvbj5cbiAgYDtcbiAgY29udGFpbmVyLmluc2VydEJlZm9yZShza2lsbFRvb2xiYXIsIGNvbnRhaW5lci5maXJzdENoaWxkKTtcblxuICAkKCcjc2tpbGxzLXJldmlldy10YWJsZScpLkRhdGFUYWJsZSh7XG4gICAgcGFnaW5nOiBmYWxzZSxcbiAgICBvcmRlcjogW10sXG4gICAgbGFuZ3VhZ2U6IHsgc2VhcmNoOiAnRmlsdGVyIHNraWxsczonIH1cbiAgfSk7XG4gIF91cGRhdGVQYWdlRXN0aW1hdGUoKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFJvdyByZW9yZGVyIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBtb3ZlU2tpbGxSb3coc2tpbGxOYW1lLCBkaXJlY3Rpb24pIHtcbiAgY29uc3QgYXJyID0gd2luZG93Ll9za2lsbHNPcmRlcmVkO1xuICBpZiAoIWFycikgcmV0dXJuO1xuICBjb25zdCBpZHggPSBhcnIuZmluZEluZGV4KHMgPT4gKHR5cGVvZiBzID09PSAnc3RyaW5nJyA/IHMgOiBzLm5hbWUgfHwgcykgPT09IHNraWxsTmFtZSk7XG4gIGlmIChpZHggPCAwKSByZXR1cm47XG4gIGNvbnN0IG5ld0lkeCA9IGlkeCArIGRpcmVjdGlvbjtcbiAgaWYgKG5ld0lkeCA8IDAgfHwgbmV3SWR4ID49IGFyci5sZW5ndGgpIHJldHVybjtcbiAgW2FycltpZHhdLCBhcnJbbmV3SWR4XV0gPSBbYXJyW25ld0lkeF0sIGFycltpZHhdXTtcbiAgd2luZG93Ll9za2lsbHNPcmRlcmVkID0gYXJyO1xuICBfcmVuZGVyU2tpbGxzVGFibGUobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7XG4gIGZldGNoKCcvYXBpL3Jlb3JkZXItcm93cycsIHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHR5cGU6ICdza2lsbCcsIG9yZGVyZWRfaWRzOiBhcnIubWFwKHMgPT4gKHR5cGVvZiBzID09PSAnc3RyaW5nJyA/IHMgOiBzLm5hbWUgfHwgcykpIH0pXG4gIH0pLmNhdGNoKCgpID0+IHt9KTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIExlZ2FjeSBpbnRlcmFjdGl2ZS1tb2RlIHJlc3BvbnNlIGhhbmRsZXIgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZVNraWxsc1Jlc3BvbnNlKG1lc3NhZ2UpIHtcbiAgd2luZG93LndhaXRpbmdGb3JTa2lsbHNSZXNwb25zZSA9IGZhbHNlO1xuICBjb25zdCByZXNwb25zZSA9IG1lc3NhZ2UudG9Mb3dlckNhc2UoKTtcblxuICBpZiAocmVzcG9uc2UuaW5jbHVkZXMoJ3llcycpKSB7XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ0V4Y2VsbGVudCEgSVxcJ2xsIHVzZSB0aGlzIHNraWxscyBzdHJhdGVneSBpbiB5b3VyIENWLicpO1xuICB9IGVsc2UgaWYgKHJlc3BvbnNlLmluY2x1ZGVzKCdubycpIHx8IHJlc3BvbnNlLmluY2x1ZGVzKCdtb2RpZnknKSkge1xuICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsICdJIHVuZGVyc3RhbmQuIFdoYXQgY2hhbmdlcyB3b3VsZCB5b3UgbGlrZSBtZSB0byBtYWtlIHRvIHRoZSBza2lsbHMgZW1waGFzaXM/Jyk7XG4gIH0gZWxzZSB7XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ0lcXCdsbCBub3RlIHlvdXIgZmVlZGJhY2sgb24gdGhlIHNraWxscyBzdHJhdGVneS4nKTtcbiAgfVxuXG4gIGZpbmlzaEludGVyYWN0aXZlUmV2aWV3KCk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBTdWJtaXQgZGVjaXNpb25zIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBzdWJtaXRTa2lsbERlY2lzaW9ucygpIHtcbiAgLyogZHVja2Zsb3c6XG4gICAqICAgaWQ6IHNraWxsc191aV9zdWJtaXRfbGl2ZVxuICAgKiAgIGtpbmQ6IHVpXG4gICAqICAgdGltZXN0YW1wOiAnMjAyNi0wMy0yNVQyMTozOTo0OFonXG4gICAqICAgc3RhdHVzOiBsaXZlXG4gICAqICAgaGFuZGxlczpcbiAgICogICAtIHVpOnNraWxscy1yZXZpZXcuc3VibWl0XG4gICAqICAgY2FsbHM6XG4gICAqICAgLSBQT1NUIC9hcGkvcmV2aWV3LWRlY2lzaW9uc1xuICAgKiAgIC0gUE9TVCAvYXBpL2N2L2xheW91dC1lc3RpbWF0ZVxuICAgKiAgIHJlYWRzOlxuICAgKiAgIC0gd2luZG93OnVzZXJTZWxlY3Rpb25zLnNraWxsc1xuICAgKiAgIC0gd2luZG93Ol9za2lsbHNPcmRlcmVkXG4gICAqICAgLSBkb206LnNraWxsLW1hdGNoLWlucHV0LnZhbHVlXG4gICAqICAgd3JpdGVzOlxuICAgKiAgIC0gcmVxdWVzdDpQT1NUIC9hcGkvcmV2aWV3LWRlY2lzaW9ucy5kZWNpc2lvbnNcbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL3Jldmlldy1kZWNpc2lvbnMuZXh0cmFfc2tpbGxzXG4gICAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9yZXZpZXctZGVjaXNpb25zLmV4dHJhX3NraWxsX21hdGNoZXNcbiAgICogICAtIHdpbmRvdzpfc2F2ZWREZWNpc2lvbnMuc2tpbGxfZGVjaXNpb25zXG4gICAqICAgLSB3aW5kb3c6X3NhdmVkRGVjaXNpb25zLmV4dHJhX3NraWxsc1xuICAgKiAgIC0gd2luZG93Ol9zYXZlZERlY2lzaW9ucy5leHRyYV9za2lsbF9tYXRjaGVzXG4gICAqICAgbm90ZXM6IFN1Ym1pdHMgc2tpbGwgaW5jbHVzaW9uIGRlY2lzaW9ucyB0b2dldGhlciB3aXRoIHNlc3Npb24tb25seSBleHRyYSBza2lsbHMgYW5kIGV4cGVyaWVuY2UtbWF0Y2ggZXZpZGVuY2Ugc28gYmFja2VuZCBnZW5lcmF0aW9uIGNhbiBtYXRlcmlhbGl6ZSB0aGUgc2FtZSBvdmVybGF5IHN0YXRlLlxuICAgKi9cbiAgY29uc3QgZGVjaXNpb25zID0gdXNlclNlbGVjdGlvbnMuc2tpbGxzO1xuICBjb25zdCBjb3VudCA9IE9iamVjdC5rZXlzKGRlY2lzaW9ucykubGVuZ3RoO1xuXG4gIGlmIChjb3VudCA9PT0gMCkge1xuICAgIHNob3dBbGVydE1vZGFsKCdObyBTZWxlY3Rpb25zJywgJ1BsZWFzZSBzZWxlY3QgYWN0aW9ucyBmb3IgYXQgbGVhc3Qgb25lIHNraWxsIGJlZm9yZSBzdWJtaXR0aW5nLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgZXh0cmFTa2lsbHMgPSAod2luZG93Ll9za2lsbHNPcmRlcmVkIHx8IFtdKVxuICAgICAgLmZpbHRlcihza2lsbCA9PiBza2lsbCAmJiB0eXBlb2Ygc2tpbGwgPT09ICdvYmplY3QnICYmIHNraWxsLl9pc05ldylcbiAgICAgIC5maWx0ZXIoc2tpbGwgPT4ge1xuICAgICAgICBjb25zdCBhY3Rpb24gPSBkZWNpc2lvbnNbX3NraWxsTmFtZShza2lsbCldO1xuICAgICAgICByZXR1cm4gYWN0aW9uID09PSAnaW5jbHVkZScgfHwgYWN0aW9uID09PSAnZW1waGFzaXplJyB8fCBhY3Rpb24gPT09ICdkZS1lbXBoYXNpemUnO1xuICAgICAgfSlcbiAgICAgIC5tYXAoc2tpbGwgPT4ge1xuICAgICAgICBpZiAoc2tpbGwuX2lzVXNlckNyZWF0ZWQpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogX3NraWxsTmFtZShza2lsbCksXG4gICAgICAgICAgICBjYXRlZ29yeTogU3RyaW5nKHNraWxsLmNhdGVnb3J5IHx8ICcnKS50cmltKCksXG4gICAgICAgICAgICBncm91cDogU3RyaW5nKHNraWxsLmdyb3VwIHx8ICcnKS50cmltKCksXG4gICAgICAgICAgICBwcm9maWNpZW5jeTogU3RyaW5nKHNraWxsLnByb2ZpY2llbmN5IHx8ICcnKS50cmltKCksXG4gICAgICAgICAgICBzdWJza2lsbHM6IF9ub3JtYWxpemVTa2lsbFN1YnNraWxscyhza2lsbC5zdWJza2lsbHMgfHwgc2tpbGwuc3ViX3NraWxscyB8fCBbXSksXG4gICAgICAgICAgICBwYXJlbnRoZXRpY2FsOiBTdHJpbmcoc2tpbGwucGFyZW50aGV0aWNhbCB8fCAnJykudHJpbSgpLFxuICAgICAgICAgICAgdXNlcl9jcmVhdGVkOiB0cnVlLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9za2lsbE5hbWUoc2tpbGwpO1xuICAgICAgfSk7XG4gICAgY29uc3QgZXh0cmFTa2lsbE5hbWVzID0gZXh0cmFTa2lsbHMubWFwKHNraWxsID0+IHR5cGVvZiBza2lsbCA9PT0gJ3N0cmluZycgPyBza2lsbCA6IHNraWxsLm5hbWUpO1xuXG4gICAgY29uc3QgbWF0Y2hJbnB1dHMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5za2lsbC1tYXRjaC1pbnB1dCcpKTtcbiAgICBjb25zdCBhbGxvd2VkID0gbmV3IFNldCgod2luZG93Ll9hbGxFeHBlcmllbmNlcyB8fCBbXSkubWFwKGUgPT4gZS5pZCkuZmlsdGVyKEJvb2xlYW4pKTtcbiAgICBjb25zdCBleHRyYVNraWxsTWF0Y2hlcyA9IHt9O1xuICAgIGZvciAoY29uc3QgaW5wdXQgb2YgbWF0Y2hJbnB1dHMpIHtcbiAgICAgIGNvbnN0IHNraWxsTmFtZSA9IGlucHV0LmRhdGFzZXQuc2tpbGw7XG4gICAgICBpZiAoIXNraWxsTmFtZSB8fCAhZXh0cmFTa2lsbE5hbWVzLmluY2x1ZGVzKHNraWxsTmFtZSkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgaWRzID0gU3RyaW5nKGlucHV0LnZhbHVlIHx8ICcnKVxuICAgICAgICAuc3BsaXQoJywnKVxuICAgICAgICAubWFwKCh4KSA9PiB4LnRyaW0oKSlcbiAgICAgICAgLmZpbHRlcigoeCkgPT4geCAmJiBhbGxvd2VkLmhhcyh4KSk7XG4gICAgICBpZiAoaWRzLmxlbmd0aCA+IDApIGV4dHJhU2tpbGxNYXRjaGVzW3NraWxsTmFtZV0gPSBpZHM7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9yZXZpZXctZGVjaXNpb25zJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgdHlwZTogJ3NraWxscycsXG4gICAgICAgIGRlY2lzaW9uczogZGVjaXNpb25zLFxuICAgICAgICBleHRyYV9za2lsbHM6IGV4dHJhU2tpbGxzLFxuICAgICAgICBleHRyYV9za2lsbF9tYXRjaGVzOiBleHRyYVNraWxsTWF0Y2hlcyxcbiAgICAgIH0pXG4gICAgfSk7XG5cbiAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgIHN0YXRlTWFuYWdlci5tYXJrQ29udGVudENoYW5nZWQoKTtcbiAgICAgIGNvbnN0IGV4dHJhTm90ZSA9IGV4dHJhU2tpbGxzLmxlbmd0aCA+IDBcbiAgICAgICAgPyBgICgke2V4dHJhU2tpbGxzLmxlbmd0aH0gbmV3IHNraWxsKHMpIGFkZGVkIFx1MjAxNCBhdmFpbGFibGUgZm9yIHdyaXRlLWJhY2sgdG8gbWFzdGVyIENWIGluIHRoZSBIYXJ2ZXN0IHRhYilgXG4gICAgICAgIDogJyc7XG4gICAgICBzaG93VG9hc3QoYFNraWxsIGRlY2lzaW9ucyBzYXZlZCAoJHtjb3VudH0gaXRlbXMpJHtleHRyYU5vdGV9YCk7XG4gICAgICBzY2hlZHVsZUF0c1JlZnJlc2goKTtcbiAgICAgIC8vIFBlcnNpc3Qgc2F2ZWQgZGVjaXNpb25zIGxvY2FsbHkgc28gdGhlIFVJIHJlZmxlY3RzIHRoZW0gaW1tZWRpYXRlbHlcbiAgICAgIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMgPSB3aW5kb3cuX3NhdmVkRGVjaXNpb25zIHx8IHt9O1xuICAgICAgd2luZG93Ll9zYXZlZERlY2lzaW9ucy5za2lsbF9kZWNpc2lvbnMgPSBkZWNpc2lvbnM7XG4gICAgICBpZiAoIXdpbmRvdy5fc2F2ZWREZWNpc2lvbnMuZXh0cmFfc2tpbGxzKSB3aW5kb3cuX3NhdmVkRGVjaXNpb25zLmV4dHJhX3NraWxscyA9IFtdO1xuICAgICAgaWYgKGV4dHJhU2tpbGxzLmxlbmd0aCA+IDApIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMuZXh0cmFfc2tpbGxzID0gZXh0cmFTa2lsbHM7XG4gICAgICB3aW5kb3cuX3NhdmVkRGVjaXNpb25zLmV4dHJhX3NraWxsX21hdGNoZXMgPSBleHRyYVNraWxsTWF0Y2hlcztcbiAgICAgIHVzZXJTZWxlY3Rpb25zLnNraWxscyA9IHsgLi4uZGVjaXNpb25zIH07XG4gICAgICBpZiAodHlwZW9mIHVwZGF0ZUluY2x1c2lvbkNvdW50cyA9PT0gJ2Z1bmN0aW9uJykgdXBkYXRlSW5jbHVzaW9uQ291bnRzKCk7XG4gICAgICBzd2l0Y2hUYWIoJ2FjaGlldmVtZW50cy1yZXZpZXcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZXJyb3IgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICBzaG93VG9hc3QoYEVycm9yOiAke2Vycm9yLmVycm9yIHx8ICdGYWlsZWQgdG8gc2F2ZSBkZWNpc2lvbnMnfWAsICdlcnJvcicpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cuZXJyb3IoJ0Vycm9yIHN1Ym1pdHRpbmcgc2tpbGwgZGVjaXNpb25zOicsIGVycm9yKTtcbiAgICBzaG93VG9hc3QoJ0ZhaWxlZCB0byBzYXZlIGRlY2lzaW9ucy4gUGxlYXNlIHRyeSBhZ2Fpbi4nLCAnZXJyb3InKTtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgRXhwb3J0cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZXhwb3J0IHtcbiAgX3BhcnNlWWVhckZyb21TdHIsXG4gIF9jb21wdXRlWWVhcnNGcm9tSWRzLFxuICBzYXZlU2tpbGxHcm91cE92ZXJyaWRlLFxuICBzYXZlU2tpbGxDYXRlZ29yeU92ZXJyaWRlLFxuICByZW5hbWVTa2lsbENhdGVnb3J5LFxuICBzYXZlU2tpbGxDYXRlZ29yeU9yZGVyLFxuICBzYXZlU2tpbGxRdWFsaWZpZXJPdmVycmlkZSxcbiAgc2F2ZVVzZXJDcmVhdGVkU2tpbGwsXG4gIGJ1aWxkU2tpbGxzUmV2aWV3VGFibGUsXG4gIF9yZW5kZXJTa2lsbHNUYWJsZSxcbiAgbW92ZVNraWxsUm93LFxuICBoYW5kbGVTa2lsbHNSZXNwb25zZSxcbiAgc3VibWl0U2tpbGxEZWNpc2lvbnMsXG59O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiBhY2hpZXZlbWVudHMtcmV2aWV3LmpzXG4gKiBFUyBtb2R1bGUgXHUyMDE0IEFjaGlldmVtZW50cyByZXZpZXcgdGFibGUsIGFjaGlldmVtZW50cyBlZGl0b3IsIGFuZCBBSSByZXdyaXRlIG1vZGFsLlxuICpcbiAqIERlcGVuZGVuY2llcyByZXNvbHZlZCB0aHJvdWdoIGdsb2JhbFRoaXMgYXQgcnVudGltZTpcbiAqICAgLSBwZW5kaW5nUmVjb21tZW5kYXRpb25zICAgICAgICAod2luZG93KVxuICogICAtIGFjaGlldmVtZW50RGVjaXNpb25zICAgICAgICAgICh3aW5kb3cgXHUyMDE0IGFsc28gaW5pdGlhbGlzZWQgaGVyZSlcbiAqICAgLSBfYWNoaWV2ZW1lbnRzT3JkZXJlZCAgICAgICAgICAod2luZG93IFx1MjAxNCBhbHNvIGluaXRpYWxpc2VkIGhlcmUpXG4gKiAgIC0gX3N1Z2dlc3RlZEFjaHNPcmRlcmVkICAgICAgICAgKHdpbmRvdylcbiAqICAgLSBfc2F2ZWREZWNpc2lvbnMgICAgICAgICAgICAgICAod2luZG93KVxuICogICAtIGFjaGlldmVtZW50RWRpdHMgICAgICAgICAgICAgICh3aW5kb3cpXG4gKiAgIC0gdXNlclNlbGVjdGlvbnMgICAgICAgICAgICAgICAgKHdpbmRvdylcbiAqICAgLSBnZXRBY2hpZXZlbWVudFJlY29tbWVuZGF0aW9uICAoZ2xvYmFsVGhpcyBmdW5jdGlvbilcbiAqICAgLSBnZXRBY2hpZXZlbWVudENvbmZpZGVuY2UgICAgICAoZ2xvYmFsVGhpcyBmdW5jdGlvbilcbiAqICAgLSBnZXRBY2hpZXZlbWVudFJlYXNvbmluZyAgICAgICAoZ2xvYmFsVGhpcyBmdW5jdGlvbilcbiAqICAgLSBlc2NhcGVIdG1sICAgICAgICAgICAgICAgICAgICAoZ2xvYmFsVGhpcyBmdW5jdGlvbilcbiAqICAgLSBoYW5kbGVBY2hpZXZlbWVudEFjdGlvbiAgICAgICAoZ2xvYmFsVGhpcyAvIHRoaXMgbW9kdWxlKVxuICogICAtIGJ1bGtBY2hpZXZlbWVudEFjdGlvbiAgICAgICAgIChnbG9iYWxUaGlzIC8gdGhpcyBtb2R1bGUpXG4gKiAgIC0gbW92ZUFjaGlldmVtZW50Um93ICAgICAgICAgICAgKGdsb2JhbFRoaXMgLyB0aGlzIG1vZHVsZSlcbiAqICAgLSBtb3ZlU3VnZ2VzdGVkQWNoaWV2ZW1lbnRSb3cgICAoZ2xvYmFsVGhpcyAvIHRoaXMgbW9kdWxlKVxuICogICAtIHNhdmVUb3BMZXZlbEFjaGlldmVtZW50RmllbGQgIChnbG9iYWxUaGlzIC8gdGhpcyBtb2R1bGUpXG4gKiAgIC0gc2F2ZVN1Z2dlc3RlZEFjaGlldmVtZW50RmllbGQgKGdsb2JhbFRoaXMgLyB0aGlzIG1vZHVsZSlcbiAqICAgLSBhaVJld3JpdGVUb3BMZXZlbEFjaGlldmVtZW50ICAoZ2xvYmFsVGhpcyAvIHRoaXMgbW9kdWxlKVxuICogICAtIGFpUmV3cml0ZVN1Z2dlc3RlZEFjaGlldmVtZW50IChnbG9iYWxUaGlzIC8gdGhpcyBtb2R1bGUpXG4gKiAgIC0gZGVsZXRlVG9wTGV2ZWxBY2hpZXZlbWVudCAgICAgKGdsb2JhbFRoaXMgLyB0aGlzIG1vZHVsZSlcbiAqICAgLSBkZWxldGVTdWdnZXN0ZWRBY2hpZXZlbWVudCAgICAoZ2xvYmFsVGhpcyAvIHRoaXMgbW9kdWxlKVxuICogICAtIHNob3dUb2FzdCAgICAgICAgICAgICAgICAgICAgIChnbG9iYWxUaGlzIGZ1bmN0aW9uKVxuICogICAtIHNjaGVkdWxlQXRzUmVmcmVzaCAgICAgICAgICAgIChnbG9iYWxUaGlzIGZ1bmN0aW9uKVxuICogICAtIHVwZGF0ZUluY2x1c2lvbkNvdW50cyAgICAgICAgIChnbG9iYWxUaGlzIGZ1bmN0aW9uKVxuICogICAtIHN3aXRjaFRhYiAgICAgICAgICAgICAgICAgICAgIChnbG9iYWxUaGlzIGZ1bmN0aW9uKVxuICogICAtIGNvbmZpcm1EaWFsb2cgICAgICAgICAgICAgICAgIChnbG9iYWxUaGlzIGZ1bmN0aW9uKVxuICogICAtIGNsb3NlQWxlcnRNb2RhbCAgICAgICAgICAgICAgIChnbG9iYWxUaGlzIGZ1bmN0aW9uKVxuICogICAtIHNldEluaXRpYWxGb2N1cyAgICAgICAgICAgICAgIChnbG9iYWxUaGlzIGZ1bmN0aW9uKVxuICogICAtIHRyYXBGb2N1cyAgICAgICAgICAgICAgICAgICAgIChnbG9iYWxUaGlzIGZ1bmN0aW9uKVxuICogICAtIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsICAgIChnbG9iYWxUaGlzKVxuICogICAtIENTUy5lc2NhcGUgICAgICAgICAgICAgICAgICAgIChicm93c2VyIGJ1aWx0LWluKVxuICovXG5cbmltcG9ydCB7IHN0YXRlTWFuYWdlciB9IGZyb20gJy4vc3RhdGUtbWFuYWdlci5qcyc7XG5pbXBvcnQgeyBleWVTbGFzaEljb24gfSBmcm9tICcuL3Jldmlldy1pY29ucy5qcyc7XG5cbi8vIE1vZHVsZS1sZXZlbCBzdGF0ZVxubGV0IF9yZXdyaXRlU3VnZ2VzdGlvbkhpc3RvcnkgPSBbXTtcbmxldCBfbGFzdFJld3JpdGVMb2dJZCA9IG51bGw7XG4vLyBDYWxsYmFja3MgZm9yIHRoZSBhY3RpdmUgcmV3cml0ZSBtb2RhbDogeyBleHBlcmllbmNlSW5kZXgsIG9uQWNjZXB0IH1cbmxldCBfcmV3cml0ZUNhbGxiYWNrcyA9IG51bGw7XG4vLyBUcmFja3MgYWNoaWV2ZW1lbnRzIHRoYXQgYXJlIG5ld2x5IHJlY29tbWVuZGVkIHNpbmNlIHRoZSBwcmV2aW91cyByZW5kZXIgKGZvciBcdUQ4M0NcdUREOTUgYmFkZ2VzKVxubGV0IF9uZXdSZWNvbW1lbmRlZEFjaHMgPSBuZXcgU2V0KCk7XG5cbmZ1bmN0aW9uIF9ub3JtYWxpemVBY2hpZXZlbWVudEVkaXRFbnRyeShlbnRyeSkge1xuICBpZiAoZW50cnkgJiYgdHlwZW9mIGVudHJ5ID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShlbnRyeSkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdGV4dDogU3RyaW5nKGVudHJ5LnRleHQgPz8gZW50cnkuZGVzY3JpcHRpb24gPz8gZW50cnkuY29udGVudCA/PyAnJyksXG4gICAgICBoaWRkZW46IEJvb2xlYW4oZW50cnkuaGlkZGVuKSxcbiAgICB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgdGV4dDogU3RyaW5nKGVudHJ5ID8/ICcnKSxcbiAgICBoaWRkZW46IGZhbHNlLFxuICB9O1xufVxuXG5mdW5jdGlvbiBfbm9ybWFsaXplQWNoaWV2ZW1lbnRFZGl0TGlzdChlbnRyaWVzKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShlbnRyaWVzKSkgcmV0dXJuIFtdO1xuICByZXR1cm4gZW50cmllcy5tYXAoX25vcm1hbGl6ZUFjaGlldmVtZW50RWRpdEVudHJ5KTtcbn1cblxuZnVuY3Rpb24gX2FjaGlldmVtZW50RW50cnlUZXh0KGVudHJ5KSB7XG4gIHJldHVybiBfbm9ybWFsaXplQWNoaWV2ZW1lbnRFZGl0RW50cnkoZW50cnkpLnRleHQ7XG59XG5cbmZ1bmN0aW9uIF9hY2hpZXZlbWVudEVudHJ5SGlkZGVuKGVudHJ5KSB7XG4gIHJldHVybiBfbm9ybWFsaXplQWNoaWV2ZW1lbnRFZGl0RW50cnkoZW50cnkpLmhpZGRlbjtcbn1cblxud2luZG93LmFjaGlldmVtZW50RGVjaXNpb25zID0ge307XG53aW5kb3cuX2FjaGlldmVtZW50c09yZGVyZWQgPSBudWxsO1xuXG4vLyBTbWFsbCBmZXRjaCBoZWxwZXIgd2l0aCB0aW1lb3V0IHRvIGF2b2lkIGxlYXZpbmcgbG9hZGVycyB2aXNpYmxlIG9uIGhhbmdpbmcgcmVxdWVzdHNcbmFzeW5jIGZ1bmN0aW9uIGZldGNoSnNvbldpdGhUaW1lb3V0KHVybCwgb3B0cyA9IHt9LCB0aW1lb3V0ID0gNzAwMCkge1xuICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICBjb25zdCBzaWduYWwgPSBjb250cm9sbGVyLnNpZ25hbDtcbiAgY29uc3QgaWQgPSBzZXRUaW1lb3V0KCgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKSwgdGltZW91dCk7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2godXJsLCBPYmplY3QuYXNzaWduKHt9LCBvcHRzLCB7IHNpZ25hbCB9KSk7XG4gICAgY2xlYXJUaW1lb3V0KGlkKTtcbiAgICByZXR1cm4gcmVzO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjbGVhclRpbWVvdXQoaWQpO1xuICAgIHRocm93IGVycjtcbiAgfVxufVxuXG5mdW5jdGlvbiBfYWNoU25hcHNob3RLZXkoKSB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2lkID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKS5nZXQoJ3Nlc3Npb24nKTtcbiAgICByZXR1cm4gc2lkID8gYGFjaF9zbmFwXyR7c2lkfWAgOiBudWxsO1xuICB9IGNhdGNoIChfKSB7IHJldHVybiBudWxsOyB9XG59XG5mdW5jdGlvbiBfc2F2ZUFjaFNuYXBzaG90KHJlY29tbWVuZGVkSWRzKSB7XG4gIGNvbnN0IGtleSA9IF9hY2hTbmFwc2hvdEtleSgpO1xuICBpZiAoIWtleSkgcmV0dXJuO1xuICB0cnkgeyBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIEpTT04uc3RyaW5naWZ5KFsuLi5yZWNvbW1lbmRlZElkc10pKTsgfSBjYXRjaCAoXykge31cbn1cbmZ1bmN0aW9uIF9nZXRBY2hTbmFwc2hvdCgpIHtcbiAgY29uc3Qga2V5ID0gX2FjaFNuYXBzaG90S2V5KCk7XG4gIGlmICgha2V5KSByZXR1cm4gbnVsbDtcbiAgdHJ5IHtcbiAgICBjb25zdCByYXcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuICAgIHJldHVybiByYXcgPyBuZXcgU2V0KEpTT04ucGFyc2UocmF3KSkgOiBudWxsO1xuICB9IGNhdGNoIChfKSB7IHJldHVybiBudWxsOyB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkQWNoaWV2ZW1lbnRzUmV2aWV3VGFibGUoKSB7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhY2hpZXZlbWVudHMtdGFibGUtY29udGFpbmVyJyk7XG4gIGlmICghY29udGFpbmVyKSByZXR1cm47XG5cbiAgY29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTJweDtwYWRkaW5nOjIwcHg7Y29sb3I6IzZiNzI4MDtcIj48ZGl2IGNsYXNzPVwibG9hZGluZy1zcGlubmVyXCIgc3R5bGU9XCJ3aWR0aDoyMHB4O2hlaWdodDoyMHB4O2JvcmRlci13aWR0aDoycHg7ZmxleC1zaHJpbms6MDtcIj48L2Rpdj48c3Bhbj5Mb2FkaW5nIGFjaGlldmVtZW50c1x1MjAyNjwvc3Bhbj48L2Rpdj4nO1xuXG4gIC8vIFByZWZlciBzZXNzaW9uLWF3YXJlIHN0YXR1cyBkYXRhIHNvIHJldmlldy10aW1lIG92ZXJsYXlzIGFyZSByZWZsZWN0ZWQuXG4gIGxldCBhbGxBY2hpZXZlbWVudHMgPSBbXTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaEpzb25XaXRoVGltZW91dCgnL2FwaS9zdGF0dXMnLCB7fSwgNzAwMCk7XG4gICAgaWYgKCFyZXMub2spIHRocm93IG5ldyBFcnJvcignc3RhdHVzIG5vdCBvaycpO1xuICAgIGNvbnN0IHN0YXR1c0RhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGFsbEFjaGlldmVtZW50cyA9IHN0YXR1c0RhdGEuYWxsX2FjaGlldmVtZW50cyB8fCBbXTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gU2Vjb25kYXJ5IGZhbGxiYWNrOiByYXcgbWFzdGVyIGZpZWxkcy5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzMiA9IGF3YWl0IGZldGNoSnNvbldpdGhUaW1lb3V0KCcvYXBpL21hc3Rlci1maWVsZHMnLCB7fSwgNzAwMCk7XG4gICAgICBpZiAoIXJlczIub2spIHRocm93IG5ldyBFcnJvcignbWFzdGVyLWZpZWxkcyBub3Qgb2snKTtcbiAgICAgIGNvbnN0IG1hc3RlckRhdGEgPSBhd2FpdCByZXMyLmpzb24oKTtcbiAgICAgIGFsbEFjaGlldmVtZW50cyA9IG1hc3RlckRhdGEuc2VsZWN0ZWRfYWNoaWV2ZW1lbnRzIHx8IFtdO1xuICAgIH0gY2F0Y2ggKGVycjIpIHtcbiAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnPHAgc3R5bGU9XCJjb2xvcjojZWY0NDQ0O3BhZGRpbmc6MjBweDtcIj5GYWlsZWQgdG8gbG9hZCBhY2hpZXZlbWVudHMuPC9wPic7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaWYgKGFsbEFjaGlldmVtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJzxwIHN0eWxlPVwicGFkZGluZzoyMHB4O2NvbG9yOiM2YjcyODA7XCI+Tm8ga2V5IGFjaGlldmVtZW50cyBmb3VuZCBpbiBtYXN0ZXIgQ1YgZGF0YS48L3A+JztcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBXcmFwIGluaXRpYWxpc2F0aW9uICsgcmVuZGVyIHNvIGFuIHVuZXhwZWN0ZWQgZXhjZXB0aW9uIHJlcGxhY2VzIHRoZVxuICAvLyBzcGlubmVyIGluc3RlYWQgb2YgbGVhdmluZyBpdCBmcm96ZW4gaW5kZWZpbml0ZWx5LlxuICB0cnkge1xuICAgIGNvbnN0IGRhdGEgPSB3aW5kb3cucGVuZGluZ1JlY29tbWVuZGF0aW9ucyB8fCB7fTtcbiAgICBjb25zdCByZWNvbW1lbmRlZFNldCA9IG5ldyBTZXQoZGF0YS5yZWNvbW1lbmRlZF9hY2hpZXZlbWVudHMgfHwgW10pO1xuXG4gICAgLy8gU29ydDogcmVjb21tZW5kZWQgZmlyc3QsIHRoZW4gYnkgaW1wb3J0YW5jZSBkZXNjZW5kaW5nIChvbmx5IG9uIGZpcnN0IGxvYWQpXG4gICAgaWYgKCF3aW5kb3cuX2FjaGlldmVtZW50c09yZGVyZWQpIHtcbiAgICAgIGFsbEFjaGlldmVtZW50cyA9IFsuLi5hbGxBY2hpZXZlbWVudHNdLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgY29uc3QgYVJlYyA9IHJlY29tbWVuZGVkU2V0LmhhcyhhLmlkKSA/IDEgOiAwO1xuICAgICAgICBjb25zdCBiUmVjID0gcmVjb21tZW5kZWRTZXQuaGFzKGIuaWQpID8gMSA6IDA7XG4gICAgICAgIGlmIChiUmVjICE9PSBhUmVjKSByZXR1cm4gYlJlYyAtIGFSZWM7XG4gICAgICAgIHJldHVybiAoYi5pbXBvcnRhbmNlIHx8IDApIC0gKGEuaW1wb3J0YW5jZSB8fCAwKTtcbiAgICAgIH0pO1xuICAgICAgd2luZG93Ll9hY2hpZXZlbWVudHNPcmRlcmVkID0gYWxsQWNoaWV2ZW1lbnRzO1xuICAgIH1cblxuICAgIC8vIEluaXRpYWxpc2UgZGVjaXNpb25zXG4gICAgd2luZG93LmFjaGlldmVtZW50RGVjaXNpb25zID0ge307XG4gICAgd2luZG93Ll9hY2hpZXZlbWVudHNPcmRlcmVkLmZvckVhY2goYWNoID0+IHtcbiAgICAgIGNvbnN0IHJlYyA9IGdldEFjaGlldmVtZW50UmVjb21tZW5kYXRpb24oYWNoLmlkLCBkYXRhKTtcbiAgICAgIGxldCBkZWZhdWx0QWN0aW9uID0gJ2luY2x1ZGUnO1xuICAgICAgaWYgKHJlYyA9PT0gJ0VtcGhhc2l6ZScpICAgICAgICAgZGVmYXVsdEFjdGlvbiA9ICdlbXBoYXNpemUnO1xuICAgICAgZWxzZSBpZiAocmVjID09PSAnSW5jbHVkZScpICAgICAgZGVmYXVsdEFjdGlvbiA9ICdpbmNsdWRlJztcbiAgICAgIGVsc2UgaWYgKHJlYyA9PT0gJ0RlLWVtcGhhc2l6ZScpIGRlZmF1bHRBY3Rpb24gPSAnZGUtZW1waGFzaXplJztcbiAgICAgIGVsc2UgaWYgKHJlYyA9PT0gJ09taXQnKSAgICAgICAgIGRlZmF1bHRBY3Rpb24gPSAnZXhjbHVkZSc7XG4gICAgICB3aW5kb3cuYWNoaWV2ZW1lbnREZWNpc2lvbnNbYWNoLmlkXSA9IGRlZmF1bHRBY3Rpb247XG4gICAgfSk7XG4gICAgLy8gQXBwbHkgYW55IHByZXZpb3VzbHkgc2F2ZWQgdXNlciBkZWNpc2lvbnMgb3ZlciB0aGUgTExNIGRlZmF1bHRzXG4gICAgY29uc3Qgc2F2ZWRBY2hEZWNzID0gd2luZG93Ll9zYXZlZERlY2lzaW9ucz8uYWNoaWV2ZW1lbnRfZGVjaXNpb25zIHx8IHt9O1xuICAgIGlmIChPYmplY3Qua2V5cyhzYXZlZEFjaERlY3MpLmxlbmd0aCA+IDApIE9iamVjdC5hc3NpZ24od2luZG93LmFjaGlldmVtZW50RGVjaXNpb25zLCBzYXZlZEFjaERlY3MpO1xuXG4gICAgLy8gQWxzbyBoYW5kbGUgQUktc3VnZ2VzdGVkIGFjaGlldmVtZW50cyBcdTIwMTQgYXNzaWduIHN0YWJsZSBJRHMgb25jZSBvbiBmaXJzdCBsb2FkXG4gICAgLy8gc28gdGhhdCByZW9yZGVyIC8gZGVsZXRlIG9wZXJhdGlvbnMgbmV2ZXIgbmVlZCB0byByZW1hcCBkZWNpc2lvbiBrZXlzLlxuICAgIGlmICghd2luZG93Ll9zdWdnZXN0ZWRBY2hzT3JkZXJlZCkge1xuICAgICAgbGV0IGNvdW50ZXIgPSAwO1xuICAgICAgd2luZG93Ll9zdWdnZXN0ZWRBY2hzT3JkZXJlZCA9IChkYXRhLnN1Z2dlc3RlZF9hY2hpZXZlbWVudHMgfHwgW10pLm1hcChzID0+IHtcbiAgICAgICAgY29uc3QgaXRlbSA9IE9iamVjdC5hc3NpZ24oe30sIHMpO1xuICAgICAgICBpdGVtLl9zdWdnSWQgPSBgc3VnZzo6JHtjb3VudGVyKyt9YDtcbiAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICB9KTtcbiAgICB9XG4gICAgd2luZG93Ll9zdWdnZXN0ZWRBY2hzT3JkZXJlZC5mb3JFYWNoKHMgPT4ge1xuICAgICAgaWYgKCEocy5fc3VnZ0lkIGluIHdpbmRvdy5hY2hpZXZlbWVudERlY2lzaW9ucykpIHdpbmRvdy5hY2hpZXZlbWVudERlY2lzaW9uc1tzLl9zdWdnSWRdID0gJ2luY2x1ZGUnO1xuICAgIH0pO1xuXG4gICAgY29uc3QgcHJldkFjaFNuYXAgPSBfZ2V0QWNoU25hcHNob3QoKTtcbiAgICBfbmV3UmVjb21tZW5kZWRBY2hzID0gcHJldkFjaFNuYXBcbiAgICAgID8gbmV3IFNldChbLi4ucmVjb21tZW5kZWRTZXRdLmZpbHRlcihpZCA9PiAhcHJldkFjaFNuYXAuaGFzKGlkKSkpXG4gICAgICA6IG5ldyBTZXQoKTtcbiAgICBfc2F2ZUFjaFNuYXBzaG90KHJlY29tbWVuZGVkU2V0KTtcblxuICAgIF9yZW5kZXJBY2hpZXZlbWVudHNSZXZpZXdUYWJsZShjb250YWluZXIpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZSAqL1xuICAgIGNvbnNvbGUuZXJyb3IoJ2J1aWxkQWNoaWV2ZW1lbnRzUmV2aWV3VGFibGU6IHJlbmRlciBlcnJvcjonLCBlcnIpO1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnPHAgc3R5bGU9XCJjb2xvcjojZWY0NDQ0O3BhZGRpbmc6MjBweDtcIj5FcnJvciByZW5kZXJpbmcgYWNoaWV2ZW1lbnRzIHRhYmxlLiBQbGVhc2UgcmVsb2FkIGFuZCB0cnkgYWdhaW4uPC9wPic7XG4gIH1cbn1cblxuZnVuY3Rpb24gX3JlbmRlckFjaGlldmVtZW50c1Jldmlld1RhYmxlKGNvbnRhaW5lcikge1xuICBpZiAoIWNvbnRhaW5lcikgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaGlldmVtZW50cy10YWJsZS1jb250YWluZXInKTtcbiAgaWYgKCFjb250YWluZXIpIHJldHVybjtcblxuICBjb25zdCBkYXRhID0gd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnMgfHwge307XG4gIGNvbnN0IG9yZGVyZWRBY2hzICA9IHdpbmRvdy5fYWNoaWV2ZW1lbnRzT3JkZXJlZCB8fCBbXTtcbiAgY29uc3Qgc3VnZ2VzdGVkQWNocyA9IHdpbmRvdy5fc3VnZ2VzdGVkQWNoc09yZGVyZWQgfHwgW107XG5cbiAgLy8gQnVpbGQgZmlsdGVyICsgdGFibGUgSFRNTFxuICBsZXQgaHRtbCA9IGBcbiAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDoxMnB4O2FsaWduLWl0ZW1zOmNlbnRlcjttYXJnaW4tYm90dG9tOjEycHg7XCI+XG4gICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImFjaC1yZXZpZXctZmlsdGVyXCJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCJGaWx0ZXIgYWNoaWV2ZW1lbnRzXHUyMDI2XCJcbiAgICAgICAgb25pbnB1dD1cIl9maWx0ZXJBY2hpZXZlbWVudHNUYWJsZSh0aGlzLnZhbHVlKVwiXG4gICAgICAgIHN0eWxlPVwiZmxleDoxO3BhZGRpbmc6NnB4IDEwcHg7Ym9yZGVyOjFweCBzb2xpZCAjZDFkNWRiO2JvcmRlci1yYWRpdXM6NnB4O2ZvbnQtc2l6ZTowLjllbTtcIj5cbiAgICAgIDxzcGFuIGlkPVwiYWNoLXJldmlldy1jb3VudFwiIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtjb2xvcjojNmI3MjgwO3doaXRlLXNwYWNlOm5vd3JhcDtcIj4ke29yZGVyZWRBY2hzLmxlbmd0aCArIHN1Z2dlc3RlZEFjaHMubGVuZ3RofSBhY2hpZXZlbWVudHM8L3NwYW4+XG4gICAgPC9kaXY+XG4gICAgPHRhYmxlIGlkPVwiYWNoaWV2ZW1lbnRzLXJldmlldy10YWJsZVwiIGNsYXNzPVwicmV2aWV3LXRhYmxlXCIgc3R5bGU9XCJ3aWR0aDoxMDAlO2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTtcIj5cbiAgICAgIDx0aGVhZD5cbiAgICAgICAgPHRyPlxuICAgICAgICAgIDx0aD5BY2hpZXZlbWVudDwvdGg+XG4gICAgICAgICAgPHRoPlJlY29tbWVuZGF0aW9uPC90aD5cbiAgICAgICAgICA8dGg+Q29uZmlkZW5jZTwvdGg+XG4gICAgICAgICAgPHRoPlJlYXNvbmluZzwvdGg+XG4gICAgICAgICAgPHRoPlNlbGVjdGlvbjwvdGg+XG4gICAgICAgIDwvdHI+XG4gICAgICA8L3RoZWFkPlxuICAgICAgPHRib2R5PlxuICBgO1xuXG4gIG9yZGVyZWRBY2hzLmZvckVhY2goKGFjaCwgcm93SWR4KSA9PiB7XG4gICAgY29uc3QgaWQgICAgICAgICAgICAgPSBhY2guaWQgfHwgYWNoLnRpdGxlIHx8ICcnO1xuICAgIGNvbnN0IHRpdGxlICAgICAgICAgID0gYWNoLnRpdGxlIHx8IGlkO1xuICAgIGNvbnN0IGRlc2MgICAgICAgICAgID0gYWNoLmRlc2NyaXB0aW9uIHx8ICcnO1xuICAgIGNvbnN0IHJlY29tbWVuZGF0aW9uID0gZ2V0QWNoaWV2ZW1lbnRSZWNvbW1lbmRhdGlvbihpZCwgZGF0YSk7XG4gICAgY29uc3QgY29uZmlkZW5jZSAgICAgPSBnZXRBY2hpZXZlbWVudENvbmZpZGVuY2UoaWQsIGRhdGEsIGFjaC5pbXBvcnRhbmNlKTtcbiAgICBjb25zdCByZWFzb25pbmcgICAgICA9IGdldEFjaGlldmVtZW50UmVhc29uaW5nKGlkLCBkYXRhLCBhY2gpO1xuICAgIGNvbnN0IGRlZmF1bHRBY3Rpb24gID0gd2luZG93LmFjaGlldmVtZW50RGVjaXNpb25zW2lkXSB8fCAnaW5jbHVkZSc7XG4gICAgY29uc3QgY29uZmlkZW5jZUJhZGdlID0gYDxzcGFuIGNsYXNzPVwiY29uZmlkZW5jZS1iYWRnZSBjb25maWRlbmNlLSR7Y29uZmlkZW5jZS5sZXZlbH1cIj4ke2NvbmZpZGVuY2UudGV4dH08L3NwYW4+YDtcbiAgICBjb25zdCByZXJ1bk5ld0JhZGdlID0gX25ld1JlY29tbWVuZGVkQWNocy5oYXMoaWQpXG4gICAgICA/ICc8c3BhbiBjbGFzcz1cInJ3LWNoYW5nZS1iYWRnZSBydy1jaGFuZ2UtbmV3XCIgYXJpYS1sYWJlbD1cIk5ldyByZWNvbW1lbmRhdGlvbiBzaW5jZSBwcmV2aW91cyBydW5cIj5cdUQ4M0NcdUREOTUgTmV3PC9zcGFuPidcbiAgICAgIDogJyc7XG4gICAgY29uc3QgaXNGaXJzdCA9IHJvd0lkeCA9PT0gMDtcbiAgICBjb25zdCBpc0xhc3QgID0gcm93SWR4ID09PSBvcmRlcmVkQWNocy5sZW5ndGggLSAxO1xuXG4gICAgaHRtbCArPSBgXG4gICAgICA8dHIgZGF0YS1hY2gtaWQ9XCIke2VzY2FwZUh0bWwoaWQpfVwiPlxuICAgICAgICA8dGQgc3R5bGU9XCJtaW4td2lkdGg6MjIwcHg7XCI+XG4gICAgICAgICAgPGlucHV0IGlkPVwiYWNoLXRpdGxlLSR7ZXNjYXBlSHRtbChpZCl9XCJcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCIgdmFsdWU9XCIke2VzY2FwZUh0bWwodGl0bGUpfVwiXG4gICAgICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Zm9udC13ZWlnaHQ6NjAwO3BhZGRpbmc6M3B4IDZweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo0cHg7Zm9udC1zaXplOjAuOWVtO2JveC1zaXppbmc6Ym9yZGVyLWJveDtcIlxuICAgICAgICAgICAgb25ibHVyPVwic2F2ZVRvcExldmVsQWNoaWV2ZW1lbnRGaWVsZCgnJHtlc2NhcGVIdG1sKGlkKX0nLCAndGl0bGUnLCB0aGlzLnZhbHVlKVwiXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiQWNoaWV2ZW1lbnQgdGl0bGVcIj4ke3JlcnVuTmV3QmFkZ2V9XG4gICAgICAgICAgPHRleHRhcmVhIGlkPVwiYWNoLWRlc2MtJHtlc2NhcGVIdG1sKGlkKX1cIlxuICAgICAgICAgICAgcm93cz1cIjJcIlxuICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDoxMDAlO21hcmdpbi10b3A6NHB4O3BhZGRpbmc6M3B4IDZweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo0cHg7Zm9udC1zaXplOjAuODVlbTtyZXNpemU6dmVydGljYWw7Ym94LXNpemluZzpib3JkZXItYm94O1wiXG4gICAgICAgICAgICBvbmJsdXI9XCJzYXZlVG9wTGV2ZWxBY2hpZXZlbWVudEZpZWxkKCcke2VzY2FwZUh0bWwoaWQpfScsICdkZXNjcmlwdGlvbicsIHRoaXMudmFsdWUpXCJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJBY2hpZXZlbWVudCBkZXNjcmlwdGlvblwiXG4gICAgICAgICAgPiR7ZXNjYXBlSHRtbChkZXNjKX08L3RleHRhcmVhPlxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQ+PHN0cm9uZz4ke2VzY2FwZUh0bWwocmVjb21tZW5kYXRpb24pfTwvc3Ryb25nPjwvdGQ+XG4gICAgICAgIDx0ZD4ke2NvbmZpZGVuY2VCYWRnZX08L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJtYXgtd2lkdGg6MjAwcHg7XCI+PHNtYWxsPiR7ZXNjYXBlSHRtbChyZWFzb25pbmcpfTwvc21hbGw+PC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwiYWN0aW9uLWJ0bnNcIiBzdHlsZT1cIndoaXRlLXNwYWNlOm5vd3JhcDtcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG4gJHtkZWZhdWx0QWN0aW9uID09PSAnZW1waGFzaXplJyAgICA/ICdhY3RpdmUnIDogJyd9XCIgZGF0YS1hY3Rpb249XCJlbXBoYXNpemVcIiAgICBhcmlhLWxhYmVsPVwiRW1waGFzaXplICR7ZXNjYXBlSHRtbCh0aXRsZSl9XCIgICAgdGl0bGU9XCJFbXBoYXNpemUgXHUyMDE0IGZlYXR1cmUgcHJvbWluZW50bHlcIiAgc3R5bGU9XCJjb2xvcjojMTBiOTgxO1wiPlx1Mjc5NTwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0biAke2RlZmF1bHRBY3Rpb24gPT09ICdpbmNsdWRlJyAgICAgID8gJ2FjdGl2ZScgOiAnJ31cIiBkYXRhLWFjdGlvbj1cImluY2x1ZGVcIiAgICAgIGFyaWEtbGFiZWw9XCJJbmNsdWRlICR7ZXNjYXBlSHRtbCh0aXRsZSl9XCIgICAgICB0aXRsZT1cIkluY2x1ZGUgXHUyMDE0IHN0YW5kYXJkIHRyZWF0bWVudFwiPlx1MjcxMzwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0biAke2RlZmF1bHRBY3Rpb24gPT09ICdkZS1lbXBoYXNpemUnID8gJ2FjdGl2ZScgOiAnJ31cIiBkYXRhLWFjdGlvbj1cImRlLWVtcGhhc2l6ZVwiIGFyaWEtbGFiZWw9XCJEZS1lbXBoYXNpemUgJHtlc2NhcGVIdG1sKHRpdGxlKX1cIiB0aXRsZT1cIkRlLWVtcGhhc2l6ZSBcdTIwMTQgYnJpZWYgbWVudGlvbiBvbmx5XCIgIHN0eWxlPVwiY29sb3I6I2Y1OWUwYjtcIj5cdTI3OTY8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG4gJHtkZWZhdWx0QWN0aW9uID09PSAnZXhjbHVkZScgICAgICA/ICdhY3RpdmUnIDogJyd9XCIgZGF0YS1hY3Rpb249XCJleGNsdWRlXCIgICAgICBhcmlhLWxhYmVsPVwiRXhjbHVkZSAke2VzY2FwZUh0bWwodGl0bGUpfVwiICAgICAgdGl0bGU9XCJFeGNsdWRlIFx1MjAxNCBvbWl0IGZyb20gQ1ZcIiAgICAgICAgICAgIHN0eWxlPVwiY29sb3I6I2VmNDQ0NDtcIj4ke2V5ZVNsYXNoSWNvbigpfTwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIGFyaWEtbGFiZWw9XCJBSSByZXdyaXRlICR7ZXNjYXBlSHRtbCh0aXRsZSl9XCIgdGl0bGU9XCJBSSByZXdyaXRlIGRlc2NyaXB0aW9uXCIgb25jbGljaz1cImFpUmV3cml0ZVRvcExldmVsQWNoaWV2ZW1lbnQoJyR7ZXNjYXBlSHRtbChpZCl9JylcIj5cdTI3Mjg8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBhcmlhLWxhYmVsPVwiTW92ZSAke2VzY2FwZUh0bWwodGl0bGUpfSBlYXJsaWVyXCIgdGl0bGU9XCJNb3ZlIHVwXCIgICAke2lzRmlyc3QgPyAnZGlzYWJsZWQnIDogJyd9IG9uY2xpY2s9XCJtb3ZlQWNoaWV2ZW1lbnRSb3coJyR7ZXNjYXBlSHRtbChpZCl9JywtMSlcIj5cdTIxOTE8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBhcmlhLWxhYmVsPVwiTW92ZSAke2VzY2FwZUh0bWwodGl0bGUpfSBsYXRlclwiICAgdGl0bGU9XCJNb3ZlIGRvd25cIiAke2lzTGFzdCAgPyAnZGlzYWJsZWQnIDogJyd9IG9uY2xpY2s9XCJtb3ZlQWNoaWV2ZW1lbnRSb3coJyR7ZXNjYXBlSHRtbChpZCl9JywrMSlcIj5cdTIxOTM8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBhcmlhLWxhYmVsPVwiRGVsZXRlICR7ZXNjYXBlSHRtbCh0aXRsZSl9XCIgdGl0bGU9XCJEZWxldGUgYWNoaWV2ZW1lbnRcIiBvbmNsaWNrPVwiZGVsZXRlVG9wTGV2ZWxBY2hpZXZlbWVudCgnJHtlc2NhcGVIdG1sKGlkKX0nKVwiIHN0eWxlPVwiY29sb3I6I2VmNDQ0NDtcIj5cdUQ4M0RcdURERDE8L2J1dHRvbj5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvdHI+XG4gICAgYDtcbiAgfSk7XG5cbiAgLy8gQUktc3VnZ2VzdGVkIGFjaGlldmVtZW50cyBcdTIwMTQgZnVsbCBlZGl0aW5nL2NvbnRyb2wgcGFyaXR5IHdpdGggdXNlciBhY2hpZXZlbWVudHNcbiAgc3VnZ2VzdGVkQWNocy5mb3JFYWNoKChzdWdnLCByb3dJZHgpID0+IHtcbiAgICBjb25zdCBzdWdnSWQgICAgICA9IHN1Z2cuX3N1Z2dJZDtcbiAgICBjb25zdCBjb25mUmF3ICAgICA9IChzdWdnLmNvbmZpZGVuY2UgfHwgJ01lZGl1bScpLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgY29uZkxldmVsICAgPSBjb25mUmF3LmluY2x1ZGVzKCdoaWdoJykgPyAnaGlnaCcgOiBjb25mUmF3LmluY2x1ZGVzKCdsb3cnKSA/ICdsb3cnIDogJ21lZGl1bSc7XG4gICAgY29uc3QgY29uZlRleHQgICAgPSBzdWdnLmNvbmZpZGVuY2UgfHwgJ01lZGl1bSc7XG4gICAgY29uc3QgZGVmYXVsdEFjdGlvbiA9IHdpbmRvdy5hY2hpZXZlbWVudERlY2lzaW9uc1tzdWdnSWRdIHx8ICdpbmNsdWRlJztcbiAgICBjb25zdCBpc0ZpcnN0ICAgICA9IHJvd0lkeCA9PT0gMDtcbiAgICBjb25zdCBpc0xhc3QgICAgICA9IHJvd0lkeCA9PT0gc3VnZ2VzdGVkQWNocy5sZW5ndGggLSAxO1xuXG4gICAgaHRtbCArPSBgXG4gICAgICA8dHIgZGF0YS1hY2gtaWQ9XCIke2VzY2FwZUh0bWwoc3VnZ0lkKX1cIiBzdHlsZT1cImJhY2tncm91bmQ6I2ZlZmNlODtcIj5cbiAgICAgICAgPHRkIHN0eWxlPVwibWluLXdpZHRoOjIyMHB4O1wiPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZGlzcGxheTppbmxpbmUtYmxvY2s7YmFja2dyb3VuZDojZjU5ZTBiO2NvbG9yOiNmZmY7Zm9udC1zaXplOjAuN2VtO2ZvbnQtd2VpZ2h0OjcwMDtwYWRkaW5nOjFweCA2cHg7Ym9yZGVyLXJhZGl1czoxMHB4O21hcmdpbi1ib3R0b206NHB4O3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtcIj5cdTJCNTAgQUkgU3VnZ2VzdGVkPC9zcGFuPlxuICAgICAgICAgIDxpbnB1dCBpZD1cImFjaC10aXRsZS0ke2VzY2FwZUh0bWwoc3VnZ0lkKX1cIlxuICAgICAgICAgICAgdHlwZT1cInRleHRcIiB2YWx1ZT1cIiR7ZXNjYXBlSHRtbChzdWdnLnRpdGxlIHx8ICcnKX1cIlxuICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDoxMDAlO2ZvbnQtd2VpZ2h0OjYwMDtwYWRkaW5nOjNweCA2cHg7Ym9yZGVyOjFweCBzb2xpZCAjZDFkNWRiO2JvcmRlci1yYWRpdXM6NHB4O2ZvbnQtc2l6ZTowLjllbTtib3gtc2l6aW5nOmJvcmRlci1ib3g7XCJcbiAgICAgICAgICAgIG9uYmx1cj1cInNhdmVTdWdnZXN0ZWRBY2hpZXZlbWVudEZpZWxkKCcke2VzY2FwZUh0bWwoc3VnZ0lkKX0nLCAndGl0bGUnLCB0aGlzLnZhbHVlKVwiXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiQWNoaWV2ZW1lbnQgdGl0bGVcIj5cbiAgICAgICAgICA8dGV4dGFyZWEgaWQ9XCJhY2gtZGVzYy0ke2VzY2FwZUh0bWwoc3VnZ0lkKX1cIlxuICAgICAgICAgICAgcm93cz1cIjJcIlxuICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDoxMDAlO21hcmdpbi10b3A6NHB4O3BhZGRpbmc6M3B4IDZweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo0cHg7Zm9udC1zaXplOjAuODVlbTtyZXNpemU6dmVydGljYWw7Ym94LXNpemluZzpib3JkZXItYm94O1wiXG4gICAgICAgICAgICBvbmJsdXI9XCJzYXZlU3VnZ2VzdGVkQWNoaWV2ZW1lbnRGaWVsZCgnJHtlc2NhcGVIdG1sKHN1Z2dJZCl9JywgJ2Rlc2NyaXB0aW9uJywgdGhpcy52YWx1ZSlcIlxuICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkFjaGlldmVtZW50IGRlc2NyaXB0aW9uXCJcbiAgICAgICAgICA+JHtlc2NhcGVIdG1sKHN1Z2cuZGVzY3JpcHRpb24gfHwgJycpfTwvdGV4dGFyZWE+XG4gICAgICAgICAgJHtzdWdnLmV4cGVyaWVuY2VfaWQgPyBgPHNtYWxsIHN0eWxlPVwiY29sb3I6IzljYTNhZjtcIj5FeHBlcmllbmNlOiAke2VzY2FwZUh0bWwoc3VnZy5leHBlcmllbmNlX2lkKX08L3NtYWxsPmAgOiAnJ31cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkPjxzdHJvbmc+QWRkIE5ldzwvc3Ryb25nPjwvdGQ+XG4gICAgICAgIDx0ZD48c3BhbiBjbGFzcz1cImNvbmZpZGVuY2UtYmFkZ2UgY29uZmlkZW5jZS0ke2NvbmZMZXZlbH1cIj4ke2VzY2FwZUh0bWwoY29uZlRleHQpfTwvc3Bhbj48L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJtYXgtd2lkdGg6MjAwcHg7XCI+PHNtYWxsPiR7ZXNjYXBlSHRtbChzdWdnLnJhdGlvbmFsZSB8fCAnJyl9PC9zbWFsbD48L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJhY3Rpb24tYnRuc1wiIHN0eWxlPVwid2hpdGUtc3BhY2U6bm93cmFwO1wiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0biAke2RlZmF1bHRBY3Rpb24gPT09ICdlbXBoYXNpemUnICAgID8gJ2FjdGl2ZScgOiAnJ31cIiBkYXRhLWFjdGlvbj1cImVtcGhhc2l6ZVwiICAgIGFyaWEtbGFiZWw9XCJFbXBoYXNpemVcIiAgICB0aXRsZT1cIkVtcGhhc2l6ZSBcdTIwMTQgZmVhdHVyZSBwcm9taW5lbnRseVwiICBzdHlsZT1cImNvbG9yOiMxMGI5ODE7XCI+XHUyNzk1PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuICR7ZGVmYXVsdEFjdGlvbiA9PT0gJ2luY2x1ZGUnICAgICAgPyAnYWN0aXZlJyA6ICcnfVwiIGRhdGEtYWN0aW9uPVwiaW5jbHVkZVwiICAgICAgYXJpYS1sYWJlbD1cIkluY2x1ZGVcIiAgICAgIHRpdGxlPVwiSW5jbHVkZSBcdTIwMTQgYWRkIHRvIENWXCI+XHUyNzEzPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuICR7ZGVmYXVsdEFjdGlvbiA9PT0gJ2RlLWVtcGhhc2l6ZScgPyAnYWN0aXZlJyA6ICcnfVwiIGRhdGEtYWN0aW9uPVwiZGUtZW1waGFzaXplXCIgYXJpYS1sYWJlbD1cIkRlLWVtcGhhc2l6ZVwiIHRpdGxlPVwiRGUtZW1waGFzaXplIFx1MjAxNCBicmllZiBtZW50aW9uIG9ubHlcIiAgc3R5bGU9XCJjb2xvcjojZjU5ZTBiO1wiPlx1Mjc5NjwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0biAke2RlZmF1bHRBY3Rpb24gPT09ICdleGNsdWRlJyAgICAgID8gJ2FjdGl2ZScgOiAnJ31cIiBkYXRhLWFjdGlvbj1cImV4Y2x1ZGVcIiAgICAgIGFyaWEtbGFiZWw9XCJFeGNsdWRlXCIgICAgICB0aXRsZT1cIlNraXAgXHUyMDE0IGRvIG5vdCBhZGRcIiAgICAgICAgICAgICAgICAgc3R5bGU9XCJjb2xvcjojZWY0NDQ0O1wiPiR7ZXllU2xhc2hJY29uKCl9PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgYXJpYS1sYWJlbD1cIkFJIHJld3JpdGVcIiB0aXRsZT1cIkFJIHJld3JpdGUgZGVzY3JpcHRpb25cIiBvbmNsaWNrPVwiYWlSZXdyaXRlU3VnZ2VzdGVkQWNoaWV2ZW1lbnQoJyR7ZXNjYXBlSHRtbChzdWdnSWQpfScpXCI+XHUyNzI4PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgYXJpYS1sYWJlbD1cIk1vdmUgZWFybGllclwiIHRpdGxlPVwiTW92ZSB1cFwiICAgJHtpc0ZpcnN0ID8gJ2Rpc2FibGVkJyA6ICcnfSBvbmNsaWNrPVwibW92ZVN1Z2dlc3RlZEFjaGlldmVtZW50Um93KCcke2VzY2FwZUh0bWwoc3VnZ0lkKX0nLC0xKVwiPlx1MjE5MTwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIGFyaWEtbGFiZWw9XCJNb3ZlIGxhdGVyXCIgICB0aXRsZT1cIk1vdmUgZG93blwiICR7aXNMYXN0ICA/ICdkaXNhYmxlZCcgOiAnJ30gb25jbGljaz1cIm1vdmVTdWdnZXN0ZWRBY2hpZXZlbWVudFJvdygnJHtlc2NhcGVIdG1sKHN1Z2dJZCl9JywrMSlcIj5cdTIxOTM8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBhcmlhLWxhYmVsPVwiUmVtb3ZlIHN1Z2dlc3Rpb25cIiB0aXRsZT1cIlJlbW92ZSBzdWdnZXN0aW9uXCIgb25jbGljaz1cImRlbGV0ZVN1Z2dlc3RlZEFjaGlldmVtZW50KCcke2VzY2FwZUh0bWwoc3VnZ0lkKX0nKVwiIHN0eWxlPVwiY29sb3I6I2VmNDQ0NDtcIj5cdUQ4M0RcdURERDE8L2J1dHRvbj5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvdHI+XG4gICAgYDtcbiAgfSk7XG5cbiAgaHRtbCArPSAnPC90Ym9keT48L3RhYmxlPic7XG4gIGNvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sO1xuXG4gIC8vIEJ1bGsgdG9vbGJhciBhYm92ZSB0aGUgZmlsdGVyIHJvd1xuICBjb25zdCBhY2hUb29sYmFyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGFjaFRvb2xiYXIuY2xhc3NOYW1lID0gJ2J1bGstdG9vbGJhcic7XG4gIGFjaFRvb2xiYXIuaW5uZXJIVE1MID0gYFxuICAgIDxzcGFuPkJ1bGs6PC9zcGFuPlxuICAgIDxidXR0b24gY2xhc3M9XCJidWxrLWJ0biBidWxrLXJlY29tbWVuZGVkXCIgb25jbGljaz1cImJ1bGtBY2hpZXZlbWVudEFjdGlvbigncmVjb21tZW5kZWQnKVwiIHRpdGxlPVwiU2V0IGFsbCB0byB0aGUgTExNIHJlY29tbWVuZGF0aW9uXCI+XHUyNzI4IEFjY2VwdCBBbGwgUmVjb21tZW5kZWQ8L2J1dHRvbj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnVsay1idG4gYnVsay1lbXBoYXNpemVcIiAgIG9uY2xpY2s9XCJidWxrQWNoaWV2ZW1lbnRBY3Rpb24oJ2VtcGhhc2l6ZScpXCI+XHUyNzk1IEVtcGhhc2l6ZSBBbGw8L2J1dHRvbj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnVsay1idG4gYnVsay1pbmNsdWRlXCIgICAgIG9uY2xpY2s9XCJidWxrQWNoaWV2ZW1lbnRBY3Rpb24oJ2luY2x1ZGUnKVwiPlx1MjcxMyBJbmNsdWRlIEFsbDwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJidWxrLWJ0biBidWxrLWV4Y2x1ZGVcIiAgICAgb25jbGljaz1cImJ1bGtBY2hpZXZlbWVudEFjdGlvbignZXhjbHVkZScpXCI+JHtleWVTbGFzaEljb24oKX0gRXhjbHVkZSBBbGw8L2J1dHRvbj5cbiAgYDtcbiAgY29udGFpbmVyLmluc2VydEJlZm9yZShhY2hUb29sYmFyLCBjb250YWluZXIuZmlyc3RDaGlsZCk7XG5cbiAgLy8gRGVsZWdhdGVkIGNsaWNrIGhhbmRsZXIgZm9yIGRlY2lzaW9uIGJ1dHRvbnNcbiAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ3Rib2R5Jyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZSA9PiB7XG4gICAgY29uc3QgYnRuID0gZS50YXJnZXQuY2xvc2VzdCgnLmljb24tYnRuW2RhdGEtYWN0aW9uXScpO1xuICAgIGlmICghYnRuKSByZXR1cm47XG4gICAgY29uc3QgdHIgPSBidG4uY2xvc2VzdCgndHJbZGF0YS1hY2gtaWRdJyk7XG4gICAgaWYgKCF0cikgcmV0dXJuO1xuICAgIGNvbnN0IGFjdGlvbiA9IGJ0bi5kYXRhc2V0LmFjdGlvbjtcbiAgICBpZiAoYWN0aW9uKSBoYW5kbGVBY2hpZXZlbWVudEFjdGlvbih0ci5kYXRhc2V0LmFjaElkLCBhY3Rpb24pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gYnVsa0FjaGlldmVtZW50QWN0aW9uKGFjdGlvbikge1xuICBjb25zdCBkYXRhID0gd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnMgfHwge307XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNhY2hpZXZlbWVudHMtcmV2aWV3LXRhYmxlIHRib2R5IHRyW2RhdGEtYWNoLWlkXScpLmZvckVhY2gocm93ID0+IHtcbiAgICBpZiAocm93LnN0eWxlLmRpc3BsYXkgPT09ICdub25lJykgcmV0dXJuOyAgIC8vIHJlc3BlY3QgZmlsdGVyXG4gICAgY29uc3QgYWNoSWQgPSByb3cuZGF0YXNldC5hY2hJZDtcbiAgICBpZiAoIWFjaElkKSByZXR1cm47XG4gICAgbGV0IHJlc29sdmVkQWN0aW9uID0gYWN0aW9uO1xuICAgIGlmIChhY3Rpb24gPT09ICdyZWNvbW1lbmRlZCcpIHtcbiAgICAgIGlmIChhY2hJZC5zdGFydHNXaXRoKCdzdWdnOjonKSkge1xuICAgICAgICByZXNvbHZlZEFjdGlvbiA9ICdpbmNsdWRlJzsgLy8gQUktc3VnZ2VzdGVkIGl0ZW1zIGRlZmF1bHQgdG8gaW5jbHVkZSB3aGVuIGFjY2VwdGluZyBhbGxcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlYyA9IGdldEFjaGlldmVtZW50UmVjb21tZW5kYXRpb24oYWNoSWQsIGRhdGEpO1xuICAgICAgICBpZiAocmVjID09PSAnRW1waGFzaXplJykgICAgICAgICByZXNvbHZlZEFjdGlvbiA9ICdlbXBoYXNpemUnO1xuICAgICAgICBlbHNlIGlmIChyZWMgPT09ICdJbmNsdWRlJykgICAgICByZXNvbHZlZEFjdGlvbiA9ICdpbmNsdWRlJztcbiAgICAgICAgZWxzZSBpZiAocmVjID09PSAnRGUtZW1waGFzaXplJykgcmVzb2x2ZWRBY3Rpb24gPSAnZGUtZW1waGFzaXplJztcbiAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRBY3Rpb24gPSAnZXhjbHVkZSc7XG4gICAgICB9XG4gICAgfVxuICAgIGhhbmRsZUFjaGlldmVtZW50QWN0aW9uKGFjaElkLCByZXNvbHZlZEFjdGlvbik7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBoYW5kbGVBY2hpZXZlbWVudEFjdGlvbihhY2hJZCwgYWN0aW9uKSB7XG4gIHdpbmRvdy5hY2hpZXZlbWVudERlY2lzaW9uc1thY2hJZF0gPSBhY3Rpb247XG4gIGNvbnN0IHJvdyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYHRyW2RhdGEtYWNoLWlkPVwiJHtDU1MuZXNjYXBlKGFjaElkKX1cIl1gKTtcbiAgaWYgKCFyb3cpIHJldHVybjtcbiAgcm93LnF1ZXJ5U2VsZWN0b3JBbGwoJy5pY29uLWJ0bicpLmZvckVhY2goYnRuID0+IGJ0bi5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKSk7XG4gIGNvbnN0IGFjdGl2ZUJ0biA9IHJvdy5xdWVyeVNlbGVjdG9yKGBbZGF0YS1hY3Rpb249XCIke2FjdGlvbn1cIl1gKTtcbiAgaWYgKGFjdGl2ZUJ0bikgYWN0aXZlQnRuLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzdWJtaXRBY2hpZXZlbWVudERlY2lzaW9ucygpIHtcbiAgLyogZHVja2Zsb3c6XG4gICAqICAgaWQ6IGFjaGlldmVtZW50c191aV9zdWJtaXRfbGl2ZVxuICAgKiAgIGtpbmQ6IHVpXG4gICAqICAgdGltZXN0YW1wOiAnMjAyNi0wMy0yNVQyMTozOTo0OFonXG4gICAqICAgc3RhdHVzOiBsaXZlXG4gICAqICAgaGFuZGxlczpcbiAgICogICAtIHVpOmFjaGlldmVtZW50cy1yZXZpZXcuc3VibWl0XG4gICAqICAgY2FsbHM6XG4gICAqICAgLSBQT1NUIC9hcGkvcmV2aWV3LWRlY2lzaW9uc1xuICAgKiAgIC0gUE9TVCAvYXBpL2N2L2xheW91dC1lc3RpbWF0ZVxuICAgKiAgIHJlYWRzOlxuICAgKiAgIC0gd2luZG93OmFjaGlldmVtZW50RGVjaXNpb25zXG4gICAqICAgLSB3aW5kb3c6X3N1Z2dlc3RlZEFjaHNPcmRlcmVkXG4gICAqICAgd3JpdGVzOlxuICAgKiAgIC0gcmVxdWVzdDpQT1NUIC9hcGkvcmV2aWV3LWRlY2lzaW9ucy5kZWNpc2lvbnNcbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL3Jldmlldy1kZWNpc2lvbnMuYWNjZXB0ZWRfc3VnZ2VzdGlvbnNcbiAgICogICAtIHdpbmRvdzpfc2F2ZWREZWNpc2lvbnMuYWNoaWV2ZW1lbnRfZGVjaXNpb25zXG4gICAqICAgLSB3aW5kb3c6X3NhdmVkRGVjaXNpb25zLmFjY2VwdGVkX3N1Z2dlc3RlZF9hY2hpZXZlbWVudHNcbiAgICogICBub3RlczogUGVyc2lzdHMgYWNoaWV2ZW1lbnQgaW5jbHVzaW9uIGRlY2lzaW9ucyBhbmQgdGhlIGFjY2VwdGVkIEFJLXN1Z2dlc3RlZCBhY2hpZXZlbWVudHMgdGhhdCBzaG91bGQgcmVtYWluIHNlc3Npb24tb25seSB1bnRpbCBhbiBleHBsaWNpdCBoYXJ2ZXN0IHN0ZXAuXG4gICAqL1xuICBjb25zdCBhbGxEZWNpc2lvbnMgPSB3aW5kb3cuYWNoaWV2ZW1lbnREZWNpc2lvbnMgfHwge307XG4gIC8vIFNlcGFyYXRlIGV4aXN0aW5nIGFjaGlldmVtZW50cyBmcm9tIEFJLXN1Z2dlc3RlZCBvbmVzXG4gIGNvbnN0IGRlY2lzaW9ucyA9IHt9O1xuICBjb25zdCBzdWdnZXN0ZWREZWNpc2lvbnMgPSB7fTtcbiAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMoYWxsRGVjaXNpb25zKSkge1xuICAgIGlmIChrLnN0YXJ0c1dpdGgoJ3N1Z2c6OicpKSBzdWdnZXN0ZWREZWNpc2lvbnNba10gPSB2O1xuICAgIGVsc2UgZGVjaXNpb25zW2tdID0gdjtcbiAgfVxuICBjb25zdCBjb3VudCA9IE9iamVjdC5rZXlzKGFsbERlY2lzaW9ucykubGVuZ3RoO1xuICBpZiAoY291bnQgPT09IDApIHJldHVybjtcbiAgLy8gUmVzb2x2ZSBzdWdnZXN0ZWQgYWNoaWV2ZW1lbnQgb2JqZWN0cyB0aGF0IHdlcmUgYWNjZXB0ZWRcbiAgY29uc3Qgc3VnZ2VzdGVkQWNocyA9IHdpbmRvdy5fc3VnZ2VzdGVkQWNoc09yZGVyZWQgfHwgW107XG4gIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbnMgPSBzdWdnZXN0ZWRBY2hzXG4gICAgLmZpbHRlcihzID0+IHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IHN1Z2dlc3RlZERlY2lzaW9uc1tzLl9zdWdnSWRdO1xuICAgICAgcmV0dXJuIGFjdGlvbiA9PT0gJ2luY2x1ZGUnIHx8IGFjdGlvbiA9PT0gJ2VtcGhhc2l6ZSc7XG4gICAgfSlcbiAgICAubWFwKHMgPT4gKHsgdGl0bGU6IHMudGl0bGUsIGRlc2NyaXB0aW9uOiBzLmRlc2NyaXB0aW9uLCBleHBlcmllbmNlX2lkOiBzLmV4cGVyaWVuY2VfaWQsIHJhdGlvbmFsZTogcy5yYXRpb25hbGUgfSkpO1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvcmV2aWV3LWRlY2lzaW9ucycsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHR5cGU6ICdhY2hpZXZlbWVudHMnLCBkZWNpc2lvbnMsIGFjY2VwdGVkX3N1Z2dlc3Rpb25zOiBhY2NlcHRlZFN1Z2dlc3Rpb25zIH0pXG4gICAgfSk7XG4gICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICBzdGF0ZU1hbmFnZXIubWFya0NvbnRlbnRDaGFuZ2VkKCk7XG4gICAgICBzaG93VG9hc3QoYEFjaGlldmVtZW50IHNlbGVjdGlvbnMgc2F2ZWQgKCR7Y291bnR9IGl0ZW1zKWApO1xuICAgICAgc2NoZWR1bGVBdHNSZWZyZXNoKCk7XG4gICAgICAvLyBQZXJzaXN0IGxvY2FsbHkgc28gdGhlIHJldmlldyBVSSBpbW1lZGlhdGVseSByZWZsZWN0cyBzYXZlZCBjaG9pY2VzXG4gICAgICB3aW5kb3cuX3NhdmVkRGVjaXNpb25zID0gd2luZG93Ll9zYXZlZERlY2lzaW9ucyB8fCB7fTtcbiAgICAgIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMuYWNoaWV2ZW1lbnRfZGVjaXNpb25zID0gZGVjaXNpb25zO1xuICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbnMgJiYgYWNjZXB0ZWRTdWdnZXN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMuYWNjZXB0ZWRfc3VnZ2VzdGVkX2FjaGlldmVtZW50cyA9IGFjY2VwdGVkU3VnZ2VzdGlvbnM7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHVwZGF0ZUluY2x1c2lvbkNvdW50cyA9PT0gJ2Z1bmN0aW9uJykgdXBkYXRlSW5jbHVzaW9uQ291bnRzKCk7XG4gICAgICBzd2l0Y2hUYWIoJ3RhZ2xpbmUtcmV2aWV3Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGVyciA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIHNob3dUb2FzdChgRXJyb3I6ICR7ZXJyLmVycm9yIHx8ICdGYWlsZWQgdG8gc2F2ZSBzZWxlY3Rpb25zJ31gLCAnZXJyb3InKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBzaG93VG9hc3QoJ0ZhaWxlZCB0byBzYXZlIGFjaGlldmVtZW50IHNlbGVjdGlvbnMuIFBsZWFzZSB0cnkgYWdhaW4uJywgJ2Vycm9yJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbW92ZUFjaGlldmVtZW50Um93KGFjaElkLCBkaXJlY3Rpb24pIHtcbiAgY29uc3QgYXJyID0gd2luZG93Ll9hY2hpZXZlbWVudHNPcmRlcmVkO1xuICBpZiAoIWFycikgcmV0dXJuO1xuICBjb25zdCBpZHggPSBhcnIuZmluZEluZGV4KGEgPT4gYS5pZCA9PT0gYWNoSWQpO1xuICBpZiAoaWR4IDwgMCkgcmV0dXJuO1xuICBjb25zdCBuZXdJZHggPSBpZHggKyBkaXJlY3Rpb247XG4gIGlmIChuZXdJZHggPCAwIHx8IG5ld0lkeCA+PSBhcnIubGVuZ3RoKSByZXR1cm47XG4gIFthcnJbaWR4XSwgYXJyW25ld0lkeF1dID0gW2FycltuZXdJZHhdLCBhcnJbaWR4XV07XG4gIHdpbmRvdy5fYWNoaWV2ZW1lbnRzT3JkZXJlZCA9IGFycjtcbiAgX3JlbmRlckFjaGlldmVtZW50c1Jldmlld1RhYmxlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhY2hpZXZlbWVudHMtdGFibGUtY29udGFpbmVyJykpO1xufVxuXG4vLyA9PT09IEFjaGlldmVtZW50cyBFZGl0b3IgVGFiID09PT1cblxuLyoqXG4gKiBCdWlsZCB0aGUgcGVyLWV4cGVyaWVuY2UgYWNoaWV2ZW1lbnRzIGVkaXRvciB0YWIuXG4gKiBFYWNoIGV4cGVyaWVuY2UgZ2V0cyBhIGNvbGxhcHNpYmxlIGNhcmQgd2l0aCBpdHMgYWNoaWV2ZW1lbnRzIGxpc3RlZC5cbiAqIEVhY2ggYWNoaWV2ZW1lbnQgc3VwcG9ydHM6IGlubGluZSBlZGl0LCByZW9yZGVyIChcdTIxOTFcdTIxOTMpLCBkZWxldGUsIGFuZCBMTE0gcmV3cml0ZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYnVpbGRBY2hpZXZlbWVudHNFZGl0b3IoKSB7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIGlmICghY29udGFpbmVyKSByZXR1cm47XG5cbiAgY29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTJweDtwYWRkaW5nOjIwcHg7Y29sb3I6IzZiNzI4MDtcIj48ZGl2IGNsYXNzPVwibG9hZGluZy1zcGlubmVyXCIgc3R5bGU9XCJ3aWR0aDoyMHB4O2hlaWdodDoyMHB4O2JvcmRlci13aWR0aDoycHg7ZmxleC1zaHJpbms6MDtcIj48L2Rpdj48c3Bhbj5Mb2FkaW5nIGV4cGVyaWVuY2UgYnVsbGV0cyBlZGl0b3JcdTIwMjY8L3NwYW4+PC9kaXY+JztcblxuICAvLyBGZXRjaCBleHBlcmllbmNlcyArIHRoZWlyIGFjaGlldmVtZW50cyBmcm9tIG1hc3RlciBmaWVsZHNcbiAgbGV0IGV4cGVyaWVuY2VzID0gW107XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWZpZWxkcycpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGV4cGVyaWVuY2VzID0gZGF0YS5leHBlcmllbmNlcyB8fCBbXTtcbiAgfSBjYXRjaCAoXykge31cblxuICBpZiAoZXhwZXJpZW5jZXMubGVuZ3RoID09PSAwKSB7XG4gICAgY29udGFpbmVyLmlubmVySFRNTCA9ICc8cCBzdHlsZT1cInBhZGRpbmc6MjBweDtjb2xvcjojNmI3MjgwO1wiPk5vIGV4cGVyaWVuY2VzIGZvdW5kIGluIG1hc3RlciBDVi48L3A+JztcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBJbml0aWFsaXNlIGVkaXRzIHN0b3JlIFx1MjAxNCBrZXllZCBieSBleHBlcmllbmNlIGluZGV4LCB2YWx1ZSBpcyBhcnJheSBvZiB7IHRleHQsIGhpZGRlbiB9XG4gIHdpbmRvdy5hY2hpZXZlbWVudEVkaXRzID0gd2luZG93LmFjaGlldmVtZW50RWRpdHMgfHwge307XG4gIGV4cGVyaWVuY2VzLmZvckVhY2goKGV4cCwgZXhwSWR4KSA9PiB7XG4gICAgaWYgKCF3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0c1tleHBJZHhdKSB7XG4gICAgICB3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0c1tleHBJZHhdID0gKGV4cC5rZXlfYWNoaWV2ZW1lbnRzIHx8IGV4cC5hY2hpZXZlbWVudHMgfHwgW10pLm1hcChhID0+XG4gICAgICAgIF9ub3JtYWxpemVBY2hpZXZlbWVudEVkaXRFbnRyeShcbiAgICAgICAgICB0eXBlb2YgYSA9PT0gJ3N0cmluZycgPyBhIDogKGEgJiYgKGEudGV4dCB8fCBhLmRlc2NyaXB0aW9uIHx8IGEuY29udGVudCB8fCAnJykpIHx8ICcnXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdpbmRvdy5hY2hpZXZlbWVudEVkaXRzW2V4cElkeF0gPSBfbm9ybWFsaXplQWNoaWV2ZW1lbnRFZGl0TGlzdCh3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0c1tleHBJZHhdKTtcbiAgICB9XG4gIH0pO1xuXG4gIGxldCBodG1sID0gYFxuICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nOjE2cHg7XCI+XG4gICAgICA8aDIgc3R5bGU9XCJtYXJnaW46MCAwIDRweDtcIj5cdTI3MEZcdUZFMEYgRXhwZXJpZW5jZSBCdWxsZXRzPC9oMj5cbiAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDttYXJnaW46MCAwIDE2cHg7Zm9udC1zaXplOjAuOWVtO1wiPlxuICAgICAgICBFZGl0LCByZW9yZGVyLCBkZWxldGUsIG9yIEFJLXJld3JpdGUgaW5kaXZpZHVhbCBleHBlcmllbmNlIGJ1bGxldHMgcGVyIHJvbGUuXG4gICAgICAgIENoYW5nZXMgYXJlIHNhdmVkIGF1dG9tYXRpY2FsbHkgYW5kIHVzZWQgZHVyaW5nIENWIGdlbmVyYXRpb24uXG4gICAgICA8L3A+XG4gIGA7XG5cbiAgLy8gRmlsdGVyIG91dCBleHBlcmllbmNlcyB0aGF0IHVzZXIgbWFya2VkIGFzIGV4Y2x1ZGVkIChwZXJzaXN0ZWQgZGVjaXNpb25zKVxuICBjb25zdCBleHBEZWNpc2lvbnMgPSAod2luZG93Ll9zYXZlZERlY2lzaW9ucyAmJiB3aW5kb3cuX3NhdmVkRGVjaXNpb25zLmV4cGVyaWVuY2VfZGVjaXNpb25zKSB8fCB1c2VyU2VsZWN0aW9ucy5leHBlcmllbmNlcyB8fCB7fTtcbiAgZXhwZXJpZW5jZXMuZm9yRWFjaCgoZXhwLCBleHBJZHgpID0+IHtcbiAgICBjb25zdCBleHBJZCA9IGV4cC5pZCB8fCBleHAuZXhwZXJpZW5jZV9pZCB8fCBgZXhwOjoke2V4cElkeH1gO1xuICAgIGNvbnN0IGRlY2lzaW9uID0gZXhwRGVjaXNpb25zW2V4cElkXTtcbiAgICBpZiAoZGVjaXNpb24gPT09ICdleGNsdWRlJykgcmV0dXJuOyAvLyBvbWl0IGV4Y2x1ZGVkIGV4cGVyaWVuY2VzIGZyb20gZWRpdG9yXG4gICAgY29uc3QgdGl0bGUgICAgPSBlc2NhcGVIdG1sKGV4cC50aXRsZSB8fCBleHAucG9zaXRpb24gfHwgYEV4cGVyaWVuY2UgJHtleHBJZHggKyAxfWApO1xuICAgIGNvbnN0IGNvbXBhbnkgID0gZXNjYXBlSHRtbChleHAuY29tcGFueSB8fCBleHAub3JnYW5pemF0aW9uIHx8ICcnKTtcbiAgICBjb25zdCBhY2hDb3VudCA9IHdpbmRvdy5hY2hpZXZlbWVudEVkaXRzW2V4cElkeF0ubGVuZ3RoO1xuXG4gICAgaHRtbCArPSBgXG4gICAgICA8ZGV0YWlscyBvcGVuIHN0eWxlPVwibWFyZ2luLWJvdHRvbToxMnB4O2JvcmRlcjoxcHggc29saWQgI2U1ZTdlYjtib3JkZXItcmFkaXVzOjhweDtvdmVyZmxvdzpoaWRkZW47XCI+XG4gICAgICAgIDxzdW1tYXJ5IHN0eWxlPVwicGFkZGluZzoxMnB4IDE2cHg7YmFja2dyb3VuZDojZjlmYWZiO2N1cnNvcjpwb2ludGVyO2ZvbnQtd2VpZ2h0OjYwMDtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDo4cHg7XCI+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJmbGV4OjE7XCI+JHt0aXRsZX0ke2NvbXBhbnkgPyBgIDxzcGFuIHN0eWxlPVwiZm9udC13ZWlnaHQ6NDAwO2NvbG9yOiM2YjcyODA7XCI+QCAke2NvbXBhbnl9PC9zcGFuPmAgOiAnJ308L3NwYW4+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC44ZW07Y29sb3I6IzljYTNhZjtcIj4ke2FjaENvdW50fSBidWxsZXQke2FjaENvdW50ICE9PSAxID8gJ3MnIDogJyd9PC9zcGFuPlxuICAgICAgICA8L3N1bW1hcnk+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nOjEycHggMTZweDtcIiBpZD1cImFjaC1lZGl0b3ItZXhwLSR7ZXhwSWR4fVwiPlxuICAgICAgICAgIDxkaXYgaWQ9XCJhY2gtbGlzdC0ke2V4cElkeH1cIj48L2Rpdj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLXNlY29uZGFyeVwiIHN0eWxlPVwibWFyZ2luLXRvcDo4cHg7Zm9udC1zaXplOjAuODVlbTtcIlxuICAgICAgICAgICAgb25jbGljaz1cImFkZEFjaGlldmVtZW50Um93KCR7ZXhwSWR4fSlcIj4rIEFkZCBCdWxsZXQ8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2RldGFpbHM+XG4gICAgYDtcbiAgfSk7XG5cbiAgaHRtbCArPSBgXG4gICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6MjBweDtkaXNwbGF5OmZsZXg7Z2FwOjEycHg7YWxpZ24taXRlbXM6Y2VudGVyO1wiPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImJhY2stYnRuXCIgb25jbGljaz1cInN3aXRjaFRhYignZXhwLXJldmlldycpXCI+XHUyMTkwIEJhY2sgdG8gRXhwZXJpZW5jZXM8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJjb250aW51ZS1idG5cIiBvbmNsaWNrPVwic2F2ZUFjaGlldmVtZW50RWRpdHNBbmRDb250aW51ZSgpXCI+U2F2ZSAmYW1wOyBDb250aW51ZSB0byBTa2lsbHMgXHUyMTkyPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGA7XG5cbiAgY29udGFpbmVyLmlubmVySFRNTCA9IGh0bWw7XG5cbiAgLy8gUmVuZGVyIGFjaGlldmVtZW50IHJvd3MgZm9yIGVhY2ggZXhwZXJpZW5jZVxuICBleHBlcmllbmNlcy5mb3JFYWNoKChfLCBleHBJZHgpID0+IHJlbmRlckFjaGlldmVtZW50RWRpdG9yUm93cyhleHBJZHgpKTtcbn1cblxuLy8gVmVyYnMgdGhhdCBnZW5lcmF0ZSBhIHdlYWstdmVyYiB3YXJuaW5nIGJhZGdlIGluIHRoZSBidWxsZXQgZWRpdG9yLlxuY29uc3QgX0FDSF9QQVNTSVZFX1NUQVJUUyA9IG5ldyBTZXQoWyd3YXMnLCd3ZXJlJywnaXMnLCdhcmUnLCdiZWVuJ10pO1xuY29uc3QgX0FDSF9XRUFLX1ZFUkJTID0gbmV3IFNldChbXG4gICdhc3Npc3RlZCcsJ2NvbnRyaWJ1dGVkJywnaGVscGVkJywncGFydGljaXBhdGVkJywnc3VwcG9ydGVkJyxcbiAgJ3N1cGVydmlzZWQnLCd3b3JrZWQnLCdjb2xsYWJvcmF0ZWQnLCdjb29wZXJhdGVkJyxcbl0pO1xuY29uc3QgX0FDSF9TVFJPTkdfVkVSQlMgPSBuZXcgU2V0KFtcbiAgJ2FjY2VsZXJhdGVkJywnYWNoaWV2ZWQnLCdhcmNoaXRlY3RlZCcsJ2F1dG9tYXRlZCcsJ2J1aWx0JyxcbiAgJ2NoYW1waW9uZWQnLCdjb2luZWQnLCdjb25jZWl2ZWQnLCdjb25kdWN0ZWQnLCdjb25zb2xpZGF0ZWQnLFxuICAnY3JlYXRlZCcsJ2N1dCcsJ2RlbGl2ZXJlZCcsJ2RlbW9uc3RyYXRlZCcsJ2RlcGxveWVkJyxcbiAgJ2Rlc2lnbmVkJywnZGV2ZWxvcGVkJywnZGlyZWN0ZWQnLCdkb3VibGVkJywnZHJvdmUnLFxuICAnZW5hYmxlZCcsJ2VzdGFibGlzaGVkJywnZXhwYW5kZWQnLCdmb3VuZGVkJywnZ2VuZXJhdGVkJyxcbiAgJ2dyZXcnLCdpbXBsZW1lbnRlZCcsJ2ltcHJvdmVkJywnaW5jcmVhc2VkJywnaW50ZWdyYXRlZCcsXG4gICdpbnZlbnRlZCcsJ2xhdW5jaGVkJywnbGVkJywnbWFuYWdlZCcsJ29wdGltaXplZCcsJ3Bpb25lZXJlZCcsXG4gICdwcm92aWRlZCcsJ3B1Ymxpc2hlZCcsJ3JhaXNlZCcsJ3JlZHVjZWQnLCdyZWZhY3RvcmVkJywnc2NhbGVkJyxcbiAgJ3NlY3VyZWQnLCdzaGlwcGVkJywnc3BlYXJoZWFkZWQnLCdzdHJlYW1saW5lZCcsJ3RhdWdodCcsXG4gICd0cmFuc2Zvcm1lZCcsJ3RyYW5zbGF0ZWQnLCd0cmlwbGVkJyxcbl0pO1xuXG5mdW5jdGlvbiBfYWNoVmVyYldhcm5pbmcodGV4dCkge1xuICBjb25zdCBmaXJzdFdvcmQgPSAodGV4dCB8fCAnJykudHJpbSgpLnNwbGl0KC9bXFxzLC46O10vKVswXS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1teYS16XS9nLCAnJyk7XG4gIGlmICghZmlyc3RXb3JkKSByZXR1cm4gbnVsbDtcbiAgaWYgKF9BQ0hfUEFTU0lWRV9TVEFSVFMuaGFzKGZpcnN0V29yZCkpIHJldHVybiB7IGxldmVsOiAncGFzc2l2ZScsIHdvcmQ6IGZpcnN0V29yZCB9O1xuICBpZiAoX0FDSF9XRUFLX1ZFUkJTLmhhcyhmaXJzdFdvcmQpKSByZXR1cm4geyBsZXZlbDogJ3dlYWsnLCAgICB3b3JkOiBmaXJzdFdvcmQgfTtcbiAgaWYgKCFfQUNIX1NUUk9OR19WRVJCUy5oYXMoZmlyc3RXb3JkKSkgcmV0dXJuIHsgbGV2ZWw6ICduZXV0cmFsJywgd29yZDogZmlyc3RXb3JkIH07XG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIFJlbmRlciB0aGUgZWRpdGFibGUgYWNoaWV2ZW1lbnQgcm93cyBmb3Igb25lIGV4cGVyaWVuY2UuXG4gKi9cbmZ1bmN0aW9uIHJlbmRlckFjaGlldmVtZW50RWRpdG9yUm93cyhleHBJZHgpIHtcbiAgY29uc3QgbGlzdEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYGFjaC1saXN0LSR7ZXhwSWR4fWApO1xuICBpZiAoIWxpc3RFbCkgcmV0dXJuO1xuICBjb25zdCBhY2hzID0gX25vcm1hbGl6ZUFjaGlldmVtZW50RWRpdExpc3Qod2luZG93LmFjaGlldmVtZW50RWRpdHNbZXhwSWR4XSB8fCBbXSk7XG4gIHdpbmRvdy5hY2hpZXZlbWVudEVkaXRzW2V4cElkeF0gPSBhY2hzO1xuXG4gIGlmIChhY2hzLmxlbmd0aCA9PT0gMCkge1xuICAgIGxpc3RFbC5pbm5lckhUTUwgPSAnPHAgc3R5bGU9XCJjb2xvcjojOWNhM2FmO2ZvbnQtc2l6ZTowLjg1ZW07cGFkZGluZzo0cHggMDtcIj5ObyBleHBlcmllbmNlIGJ1bGxldHMgeWV0LjwvcD4nO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxpc3RFbC5pbm5lckhUTUwgPSBhY2hzLm1hcCgoZW50cnksIGFjaElkeCkgPT4ge1xuICAgIGNvbnN0IHRleHQgPSBfYWNoaWV2ZW1lbnRFbnRyeVRleHQoZW50cnkpO1xuICAgIGNvbnN0IGhpZGRlbiA9IF9hY2hpZXZlbWVudEVudHJ5SGlkZGVuKGVudHJ5KTtcbiAgICBjb25zdCB2ZXJiV2FybiA9IF9hY2hWZXJiV2FybmluZyh0ZXh0KTtcbiAgICBjb25zdCB2ZXJiQmFkZ2UgPSB2ZXJiV2FyblxuICAgICAgPyAodmVyYldhcm4ubGV2ZWwgPT09ICdwYXNzaXZlJ1xuICAgICAgICAgID8gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC43OGVtO2NvbG9yOiM5ZjEyMzk7YmFja2dyb3VuZDojZmZmMWYyO2JvcmRlcjoxcHggc29saWQgI2ZlY2RkMztib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjJweCA2cHg7bWFyZ2luLXRvcDozcHg7XCIgdGl0bGU9XCJCdWxsZXQgb3BlbnMgd2l0aCBwYXNzaXZlIHZvaWNlICgnJHt2ZXJiV2Fybi53b3JkfScpIFx1MjAxNCByZXdyaXRlIHdpdGggYW4gYWN0aXZlIG9wZW5pbmcgdmVyYlwiPlx1MjZBMCBQYXNzaXZlIHZvaWNlIFx1MjAxNCByZXdyaXRlIHdpdGggYW4gYWN0aXZlIG9wZW5pbmcgdmVyYjwvZGl2PmBcbiAgICAgICAgICA6IHZlcmJXYXJuLmxldmVsID09PSAnd2VhaydcbiAgICAgICAgICA/IGA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuNzhlbTtjb2xvcjojYjQ1MzA5O2JhY2tncm91bmQ6I2ZmZmJlYjtib3JkZXI6MXB4IHNvbGlkICNmZGU2OGE7Ym9yZGVyLXJhZGl1czo0cHg7cGFkZGluZzoycHggNnB4O21hcmdpbi10b3A6M3B4O1wiIHRpdGxlPVwiT3BlbmluZyB2ZXJiICcke3ZlcmJXYXJuLndvcmR9JyBpcyB3ZWFrIFx1MjAxNCBjb25zaWRlciBMZWQsIEJ1aWx0LCBEcm92ZSwgZXRjLlwiPlx1MjZBMCBXZWFrIG9wZW5pbmcgdmVyYiBcdTIwMTQgdXNlIGEgc3Ryb25nZXIgYWN0aW9uIHZlcmI8L2Rpdj5gXG4gICAgICAgICAgOiBgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjc4ZW07Y29sb3I6IzZiNzI4MDtiYWNrZ3JvdW5kOiNmOWZhZmI7Ym9yZGVyOjFweCBzb2xpZCAjZTVlN2ViO2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6MnB4IDZweDttYXJnaW4tdG9wOjNweDtcIiB0aXRsZT1cIicke3ZlcmJXYXJuLndvcmR9JyBpcyBub3QgaW4gdGhlIHN0cm9uZy12ZXJiIGxpc3QgXHUyMDE0IHZlcmlmeSBpdCBtYWtlcyBhbiBpbXBhY3Qgc3RhdGVtZW50XCI+XHUyMTM5IE9wZW5pbmcgdmVyYiBub3QgaW4gc3Ryb25nLXZlcmIgbGlzdDwvZGl2PmBcbiAgICAgICAgKVxuICAgICAgOiAnJztcbiAgICByZXR1cm4gYFxuICAgIDxkaXYgaWQ9XCJhY2gtcm93LSR7ZXhwSWR4fS0ke2FjaElkeH1cIiBjbGFzcz1cIiR7aGlkZGVuID8gJ2FjaGlldmVtZW50LXJvdy1oaWRkZW4nIDogJyd9XCIgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjhweDthbGlnbi1pdGVtczpmbGV4LXN0YXJ0O21hcmdpbi1ib3R0b206OHB4O1wiPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Z2FwOjJweDtwYWRkaW5nLXRvcDo0cHg7XCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIHRpdGxlPVwiTW92ZSB1cFwiICAgYXJpYS1sYWJlbD1cIk1vdmUgYnVsbGV0IHVwXCIgICBvbmNsaWNrPVwibW92ZUFjaGlldmVtZW50KCR7ZXhwSWR4fSwke2FjaElkeH0sLTEpXCI+XHUyNUIyPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIHRpdGxlPVwiTW92ZSBkb3duXCIgYXJpYS1sYWJlbD1cIk1vdmUgYnVsbGV0IGRvd25cIiBvbmNsaWNrPVwibW92ZUFjaGlldmVtZW50KCR7ZXhwSWR4fSwke2FjaElkeH0sKzEpXCI+XHUyNUJDPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgc3R5bGU9XCJmbGV4OjE7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtcIj5cbiAgICAgIDx0ZXh0YXJlYSBpZD1cImFjaC10ZXh0LSR7ZXhwSWR4fS0ke2FjaElkeH1cIlxuICAgICAgICByb3dzPVwiMlwiXG4gICAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTtwYWRkaW5nOjZweCA4cHg7Ym9yZGVyOjFweCBzb2xpZCAke2hpZGRlbiA/ICcjZjU5ZTBiJyA6IHZlcmJXYXJuPy5sZXZlbCA9PT0gJ3Bhc3NpdmUnID8gJyNmZWNkZDMnIDogdmVyYldhcm4/LmxldmVsID09PSAnd2VhaycgPyAnI2ZkZTY4YScgOiAnI2QxZDVkYid9O2JvcmRlci1yYWRpdXM6NnB4O2ZvbnQtc2l6ZTowLjllbTtyZXNpemU6dmVydGljYWw7Ym94LXNpemluZzpib3JkZXItYm94OyR7aGlkZGVuID8gJ2JhY2tncm91bmQ6I2ZmZmJlYjtjb2xvcjojOTI0MDBlOycgOiAnJ31cIlxuICAgICAgICBvbmNoYW5nZT1cInVwZGF0ZUFjaGlldmVtZW50VGV4dCgke2V4cElkeH0sJHthY2hJZHh9LHRoaXMudmFsdWUpXCJcbiAgICAgICAgb25ibHVyPVwidXBkYXRlQWNoaWV2ZW1lbnRUZXh0KCR7ZXhwSWR4fSwke2FjaElkeH0sdGhpcy52YWx1ZSlcIlxuICAgICAgPiR7ZXNjYXBlSHRtbCh0ZXh0KX08L3RleHRhcmVhPlxuICAgICAgJHt2ZXJiQmFkZ2V9XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2dhcDo0cHg7cGFkZGluZy10b3A6MnB4O1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG4gJHtoaWRkZW4gPyAnYWN0aXZlJyA6ICcnfVwiIHRpdGxlPVwiJHtoaWRkZW4gPyAnU2hvdyBidWxsZXQgaW4gZ2VuZXJhdGVkIENWJyA6ICdIaWRlIGJ1bGxldCBmcm9tIGdlbmVyYXRlZCBDVid9XCJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiJHtoaWRkZW4gPyAnU2hvdyBidWxsZXQgaW4gZ2VuZXJhdGVkIENWJyA6ICdIaWRlIGJ1bGxldCBmcm9tIGdlbmVyYXRlZCBDVid9XCIgYXJpYS1wcmVzc2VkPVwiJHtoaWRkZW59XCJcbiAgICAgICAgICBvbmNsaWNrPVwidG9nZ2xlQWNoaWV2ZW1lbnRIaWRkZW4oJHtleHBJZHh9LCR7YWNoSWR4fSlcIlxuICAgICAgICAgIHN0eWxlPVwiY29sb3I6JHtoaWRkZW4gPyAnI2I0NTMwOScgOiAnIzY0NzQ4Yid9O1wiPiR7ZXllU2xhc2hJY29uKCl9PC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIHRpdGxlPVwiQXNrIEFJIHRvIHJld3JpdGVcIlxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJBc2sgQUkgdG8gcmV3cml0ZSB0aGlzIGJ1bGxldFwiXG4gICAgICAgICAgb25jbGljaz1cInJld3JpdGVBY2hpZXZlbWVudFdpdGhMTE0oJHtleHBJZHh9LCR7YWNoSWR4fSlcIlxuICAgICAgICAgID5cdTI3Mjg8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgdGl0bGU9XCJEZWxldGVcIlxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJEZWxldGUgdGhpcyBidWxsZXRcIlxuICAgICAgICAgIG9uY2xpY2s9XCJkZWxldGVBY2hpZXZlbWVudCgke2V4cElkeH0sJHthY2hJZHh9KVwiXG4gICAgICAgICAgc3R5bGU9XCJjb2xvcjojZWY0NDQ0O1wiPlx1RDgzRFx1REREMTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGA7XG4gIH0pLmpvaW4oJycpO1xufVxuXG4vLyBEZWJvdW5jZSB0aW1lciBmb3IgYXV0by1wZXJzaXN0aW5nIGFjaGlldmVtZW50IHRleHQgZWRpdHMuXG5sZXQgX2FjaFBlcnNpc3RUaW1lciA9IG51bGw7XG5cbmZ1bmN0aW9uIHVwZGF0ZUFjaGlldmVtZW50VGV4dChleHBJZHgsIGFjaElkeCwgdmFsdWUpIHtcbiAgaWYgKCF3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0c1tleHBJZHhdKSByZXR1cm47XG4gIGNvbnN0IGV4aXN0aW5nID0gX25vcm1hbGl6ZUFjaGlldmVtZW50RWRpdEVudHJ5KHdpbmRvdy5hY2hpZXZlbWVudEVkaXRzW2V4cElkeF1bYWNoSWR4XSk7XG4gIGV4aXN0aW5nLnRleHQgPSB2YWx1ZTtcbiAgd2luZG93LmFjaGlldmVtZW50RWRpdHNbZXhwSWR4XVthY2hJZHhdID0gZXhpc3Rpbmc7XG5cbiAgLy8gRGVib3VuY2UtcGVyc2lzdCBzbyBlZGl0cyBzdXJ2aXZlIHRhYiBuYXZpZ2F0aW9uIGFuZCBzdGF0dXMgcG9sbGluZy5cbiAgY2xlYXJUaW1lb3V0KF9hY2hQZXJzaXN0VGltZXIpO1xuICBfYWNoUGVyc2lzdFRpbWVyID0gc2V0VGltZW91dChhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZldGNoKCcvYXBpL3NhdmUtYWNoaWV2ZW1lbnQtZWRpdHMnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBlZGl0czogd2luZG93LmFjaGlldmVtZW50RWRpdHMgfSksXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChfZSkgeyAvKiBzaWxlbnQgXHUyMDE0IHVzZXIgc3RpbGwgaGFzIGluLW1lbW9yeSBzdGF0ZSAqLyB9XG4gIH0sIDUwMCk7XG59XG5cbmZ1bmN0aW9uIHRvZ2dsZUFjaGlldmVtZW50SGlkZGVuKGV4cElkeCwgYWNoSWR4KSB7XG4gIGlmICghd2luZG93LmFjaGlldmVtZW50RWRpdHNbZXhwSWR4XSkgcmV0dXJuO1xuICBjb25zdCBleGlzdGluZyA9IF9ub3JtYWxpemVBY2hpZXZlbWVudEVkaXRFbnRyeSh3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0c1tleHBJZHhdW2FjaElkeF0pO1xuICBleGlzdGluZy5oaWRkZW4gPSAhZXhpc3RpbmcuaGlkZGVuO1xuICB3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0c1tleHBJZHhdW2FjaElkeF0gPSBleGlzdGluZztcbiAgcmVuZGVyQWNoaWV2ZW1lbnRFZGl0b3JSb3dzKGV4cElkeCk7XG59XG5cbmZ1bmN0aW9uIG1vdmVBY2hpZXZlbWVudChleHBJZHgsIGFjaElkeCwgZGlyKSB7XG4gIGNvbnN0IGFjaHMgPSB3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0c1tleHBJZHhdO1xuICBpZiAoIWFjaHMpIHJldHVybjtcbiAgY29uc3QgbmV3SWR4ID0gYWNoSWR4ICsgZGlyO1xuICBpZiAobmV3SWR4IDwgMCB8fCBuZXdJZHggPj0gYWNocy5sZW5ndGgpIHJldHVybjtcbiAgLy8gRmx1c2ggY3VycmVudCB0ZXh0YXJlYSB2YWx1ZSBiZWZvcmUgbW92aW5nXG4gIGNvbnN0IHRhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYGFjaC10ZXh0LSR7ZXhwSWR4fS0ke2FjaElkeH1gKTtcbiAgaWYgKHRhKSB1cGRhdGVBY2hpZXZlbWVudFRleHQoZXhwSWR4LCBhY2hJZHgsIHRhLnZhbHVlKTtcbiAgW2FjaHNbYWNoSWR4XSwgYWNoc1tuZXdJZHhdXSA9IFthY2hzW25ld0lkeF0sIGFjaHNbYWNoSWR4XV07XG4gIHJlbmRlckFjaGlldmVtZW50RWRpdG9yUm93cyhleHBJZHgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVBY2hpZXZlbWVudChleHBJZHgsIGFjaElkeCkge1xuICBjb25zdCBhY2hzID0gd2luZG93LmFjaGlldmVtZW50RWRpdHNbZXhwSWR4XTtcbiAgaWYgKCFhY2hzKSByZXR1cm47XG4gIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IGNvbmZpcm1EaWFsb2coXG4gICAgJ0RlbGV0ZSB0aGlzIGJ1bGxldCBmcm9tIHRoaXMgc2Vzc2lvbj8gSGlkZGVuIGJ1bGxldHMgcmVtYWluIGF2YWlsYWJsZSBmb3IgbGF0ZXIgaGFydmVzdCwgYnV0IGRlbGV0ZSByZW1vdmVzIHRoZSBlZGl0ZWQgcm93IGVudGlyZWx5LicsXG4gICAgeyBjb25maXJtTGFiZWw6ICdEZWxldGUnLCBjYW5jZWxMYWJlbDogJ0NhbmNlbCcsIGRhbmdlcjogdHJ1ZSB9LFxuICApO1xuICBpZiAoIWNvbmZpcm1lZCkgcmV0dXJuO1xuICBhY2hzLnNwbGljZShhY2hJZHgsIDEpO1xuICByZW5kZXJBY2hpZXZlbWVudEVkaXRvclJvd3MoZXhwSWR4KTtcbn1cblxuZnVuY3Rpb24gYWRkQWNoaWV2ZW1lbnRSb3coZXhwSWR4KSB7XG4gIGlmICghd2luZG93LmFjaGlldmVtZW50RWRpdHNbZXhwSWR4XSkgd2luZG93LmFjaGlldmVtZW50RWRpdHNbZXhwSWR4XSA9IFtdO1xuICB3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0c1tleHBJZHhdLnB1c2goeyB0ZXh0OiAnJywgaGlkZGVuOiBmYWxzZSB9KTtcbiAgcmVuZGVyQWNoaWV2ZW1lbnRFZGl0b3JSb3dzKGV4cElkeCk7XG4gIC8vIEZvY3VzIHRoZSBuZXcgdGV4dGFyZWFcbiAgY29uc3QgbmV3SWR4ID0gd2luZG93LmFjaGlldmVtZW50RWRpdHNbZXhwSWR4XS5sZW5ndGggLSAxO1xuICBjb25zdCB0YSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBhY2gtdGV4dC0ke2V4cElkeH0tJHtuZXdJZHh9YCk7XG4gIGlmICh0YSkgdGEuZm9jdXMoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmV3cml0ZUFjaGlldmVtZW50V2l0aExMTShleHBJZHgsIGFjaElkeCkge1xuICBjb25zdCB0YSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBhY2gtdGV4dC0ke2V4cElkeH0tJHthY2hJZHh9YCk7XG4gIGlmICghdGEpIHJldHVybjtcbiAgY29uc3Qgb3JpZ2luYWxUZXh0ID0gdGEudmFsdWUudHJpbSgpO1xuICBpZiAoIW9yaWdpbmFsVGV4dCkgeyBzaG93VG9hc3QoJ1BsZWFzZSBlbnRlciBhIGJ1bGxldCBmaXJzdC4nLCAnZXJyb3InKTsgcmV0dXJuOyB9XG5cbiAgX3Jld3JpdGVTdWdnZXN0aW9uSGlzdG9yeSA9IFtdO1xuICBfbGFzdFJld3JpdGVMb2dJZCA9IG51bGw7XG4gIF9vcGVuUmV3cml0ZU1vZGFsKG9yaWdpbmFsVGV4dCwgJycsIG51bGwsIHtcbiAgICBleHBlcmllbmNlSW5kZXg6IGV4cElkeCxcbiAgICBhY2hpZXZlbWVudEluZGV4OiBhY2hJZHgsXG4gICAgb25BY2NlcHQ6IGFzeW5jIChzdWdnZXN0aW9uKSA9PiB7XG4gICAgICB1cGRhdGVBY2hpZXZlbWVudFRleHQoZXhwSWR4LCBhY2hJZHgsIHN1Z2dlc3Rpb24pO1xuICAgICAgaWYgKHRhKSB0YS52YWx1ZSA9IHN1Z2dlc3Rpb247XG4gICAgICBfcmVjb3JkUmV3cml0ZU91dGNvbWUoJ2FjY2VwdGVkJywgc3VnZ2VzdGlvbik7XG4gICAgICBzaG93VG9hc3QoJ0J1bGxldCB1cGRhdGVkLicpO1xuICAgIH0sXG4gIH0pO1xuICBhd2FpdCBfcnVuUmV3cml0ZShvcmlnaW5hbFRleHQpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBhaVJld3JpdGVUb3BMZXZlbEFjaGlldmVtZW50KGFjaElkKSB7XG4gIGNvbnN0IGFjaCA9ICh3aW5kb3cuX2FjaGlldmVtZW50c09yZGVyZWQgfHwgW10pLmZpbmQoYSA9PiBhLmlkID09PSBhY2hJZCk7XG4gIGlmICghYWNoKSByZXR1cm47XG4gIGNvbnN0IG9yaWdpbmFsVGV4dCA9IGFjaC5kZXNjcmlwdGlvbiB8fCAnJztcbiAgaWYgKCFvcmlnaW5hbFRleHQpIHsgc2hvd1RvYXN0KCdQbGVhc2UgZW50ZXIgYSBkZXNjcmlwdGlvbiBmaXJzdC4nLCAnZXJyb3InKTsgcmV0dXJuOyB9XG5cbiAgX3Jld3JpdGVTdWdnZXN0aW9uSGlzdG9yeSA9IFtdO1xuICBfbGFzdFJld3JpdGVMb2dJZCA9IG51bGw7XG4gIF9vcGVuUmV3cml0ZU1vZGFsKG9yaWdpbmFsVGV4dCwgJycsIG51bGwsIHtcbiAgICBleHBlcmllbmNlSW5kZXg6IG51bGwsXG4gICAgb25BY2NlcHQ6IGFzeW5jIChzdWdnZXN0aW9uKSA9PiB7XG4gICAgICBhd2FpdCBzYXZlVG9wTGV2ZWxBY2hpZXZlbWVudEZpZWxkKGFjaElkLCAnZGVzY3JpcHRpb24nLCBzdWdnZXN0aW9uKTtcbiAgICAgIGNvbnN0IGRlc2NFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBhY2gtZGVzYy0ke0NTUy5lc2NhcGUoYWNoSWQpfWApO1xuICAgICAgaWYgKGRlc2NFbCkgZGVzY0VsLnZhbHVlID0gc3VnZ2VzdGlvbjtcbiAgICAgIF9yZWNvcmRSZXdyaXRlT3V0Y29tZSgnYWNjZXB0ZWQnLCBzdWdnZXN0aW9uKTtcbiAgICAgIHNob3dUb2FzdCgnQWNoaWV2ZW1lbnQgdXBkYXRlZC4nKTtcbiAgICB9LFxuICB9KTtcbiAgYXdhaXQgX3J1blJld3JpdGUob3JpZ2luYWxUZXh0KTtcbn1cblxuZnVuY3Rpb24gX29wZW5SZXdyaXRlTW9kYWwob3JpZ2luYWxUZXh0LCBjdXJyZW50SW5zdHJ1Y3Rpb25zLCBjdXJyZW50U3VnZ2VzdGlvbiwgY2FsbGJhY2tzKSB7XG4gIF9yZXdyaXRlQ2FsbGJhY2tzID0gY2FsbGJhY2tzO1xuXG4gIGNvbnN0IHN1Z2dlc3RlZEh0bWwgPSBjdXJyZW50U3VnZ2VzdGlvbiAhPSBudWxsXG4gICAgPyBgPHAgaWQ9XCJhY2gtcmV3cml0ZS1zdWdnZXN0aW9uXCIgc3R5bGU9XCJtYXJnaW46NHB4IDAgMDttaW4taGVpZ2h0OjIuNGVtO1wiPiR7ZXNjYXBlSHRtbChjdXJyZW50U3VnZ2VzdGlvbil9PC9wPmBcbiAgICA6IGA8cCBpZD1cImFjaC1yZXdyaXRlLXN1Z2dlc3Rpb25cIiBzdHlsZT1cIm1hcmdpbjo0cHggMCAwO21pbi1oZWlnaHQ6Mi40ZW07Y29sb3I6IzljYTNhZjtmb250LXN0eWxlOml0YWxpYztcIj5cdTIzRjMgR2VuZXJhdGluZ1x1MjAyNjwvcD5gO1xuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhbGVydC1tb2RhbC10aXRsZScpLnRleHRDb250ZW50ID0gJ1x1MjcyOCBBSSBSZXdyaXRlJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FsZXJ0LW1vZGFsLW1lc3NhZ2UnKS5pbm5lckhUTUwgPSBgXG4gICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTBweDtcIj5cbiAgICAgIDxzdHJvbmc+T3JpZ2luYWw6PC9zdHJvbmc+XG4gICAgICA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7bWFyZ2luOjRweCAwIDA7Zm9udC1zdHlsZTppdGFsaWM7Zm9udC1zaXplOjAuOTJlbTtcIj4ke2VzY2FwZUh0bWwob3JpZ2luYWxUZXh0KX08L3A+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTJweDtcIj5cbiAgICAgIDxzdHJvbmc+U3VnZ2VzdGVkOjwvc3Ryb25nPlxuICAgICAgJHtzdWdnZXN0ZWRIdG1sfVxuICAgIDwvZGl2PlxuICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE2cHg7XCI+XG4gICAgICA8bGFiZWwgZm9yPVwiYWNoLXJld3JpdGUtaW5zdHJ1Y3Rpb25zXCIgc3R5bGU9XCJmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjAuOTJlbTtkaXNwbGF5OmJsb2NrO21hcmdpbi1ib3R0b206NHB4O1wiPkluc3RydWN0aW9ucyA8c3BhbiBzdHlsZT1cImZvbnQtd2VpZ2h0OjQwMDtjb2xvcjojNmI3MjgwO1wiPihvcHRpb25hbCk8L3NwYW4+PC9sYWJlbD5cbiAgICAgIDx0ZXh0YXJlYSBpZD1cImFjaC1yZXdyaXRlLWluc3RydWN0aW9uc1wiXG4gICAgICAgIHJvd3M9XCIyXCJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIG1ha2UgaXQgbW9yZSBjb25jaXNlLCBlbXBoYXNpc2UgbGVhZGVyc2hpcCwgYWRkIGEgbWV0cmljXCJcbiAgICAgICAgc3R5bGU9XCJ3aWR0aDoxMDAlO2JveC1zaXppbmc6Ym9yZGVyLWJveDtwYWRkaW5nOjZweCA4cHg7Ym9yZGVyOjFweCBzb2xpZCAjZDFkNWRiO2JvcmRlci1yYWRpdXM6NnB4O2ZvbnQtc2l6ZTowLjllbTtyZXNpemU6dmVydGljYWw7XCJcbiAgICAgID4ke2VzY2FwZUh0bWwoY3VycmVudEluc3RydWN0aW9ucyl9PC90ZXh0YXJlYT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDo4cHg7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kO1wiPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1zZWNvbmRhcnlcIiBpZD1cImFjaC1yZXdyaXRlLXJlamVjdC1idG5cIiBvbmNsaWNrPVwiX3JlY29yZFJld3JpdGVPdXRjb21lKCdyZWplY3RlZCcpOyBjbG9zZUFsZXJ0TW9kYWwoKVwiPlJlamVjdDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1zZWNvbmRhcnlcIiBpZD1cImFjaC1yZXdyaXRlLWdlbmVyYXRlLWJ0blwiPkdlbmVyYXRlPC9idXR0b24+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiY29udGludWUtYnRuXCIgIGlkPVwiYWNoLXJld3JpdGUtYWNjZXB0LWJ0blwiPkFjY2VwdDwvYnV0dG9uPlxuICAgIDwvZGl2PmA7XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FsZXJ0LW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBzZXRJbml0aWFsRm9jdXMoJ2FsZXJ0LW1vZGFsLW92ZXJsYXknKTtcbiAgdHJhcEZvY3VzKCdhbGVydC1tb2RhbC1vdmVybGF5Jyk7XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaC1yZXdyaXRlLWdlbmVyYXRlLWJ0bicpLm9uY2xpY2sgPSAoKSA9PiBfcnVuUmV3cml0ZShvcmlnaW5hbFRleHQpO1xuXG4gIF91cGRhdGVSZXdyaXRlQWNjZXB0QnRuKGN1cnJlbnRTdWdnZXN0aW9uKTtcbn1cblxuZnVuY3Rpb24gX3VwZGF0ZVJld3JpdGVBY2NlcHRCdG4oc3VnZ2VzdGlvbikge1xuICBjb25zdCBhY2NlcHRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLXJld3JpdGUtYWNjZXB0LWJ0bicpO1xuICBpZiAoIWFjY2VwdEJ0bikgcmV0dXJuO1xuICBhY2NlcHRCdG4uZGlzYWJsZWQgPSBzdWdnZXN0aW9uID09IG51bGw7XG4gIGFjY2VwdEJ0bi5vbmNsaWNrID0gc3VnZ2VzdGlvbiA9PSBudWxsID8gbnVsbCA6IGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBfcmV3cml0ZUNhbGxiYWNrcy5vbkFjY2VwdChzdWdnZXN0aW9uKTtcbiAgICBjbG9zZUFsZXJ0TW9kYWwoKTtcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gX3JlY29yZFJld3JpdGVPdXRjb21lKG91dGNvbWUsIGFjY2VwdGVkVGV4dCkge1xuICBpZiAoIV9sYXN0UmV3cml0ZUxvZ0lkKSByZXR1cm47XG4gIGNvbnN0IGxvZ0lkID0gX2xhc3RSZXdyaXRlTG9nSWQ7XG4gIF9sYXN0UmV3cml0ZUxvZ0lkID0gbnVsbDtcbiAgY29uc3QgYm9keSA9IHsgbG9nX2lkOiBsb2dJZCwgb3V0Y29tZSB9O1xuICBpZiAoYWNjZXB0ZWRUZXh0ICE9IG51bGwpIGJvZHkuYWNjZXB0ZWRfdGV4dCA9IGFjY2VwdGVkVGV4dDtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmZXRjaCgnL2FwaS9yZXdyaXRlLWFjaGlldmVtZW50LW91dGNvbWUnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgfSk7XG4gIH0gY2F0Y2ggKF8pIHsgLyogZmlyZS1hbmQtZm9yZ2V0IFx1MjAxNCBkb24ndCBkaXNydXB0IHRoZSBVSSAqLyB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9ydW5SZXdyaXRlKG9yaWdpbmFsVGV4dCkge1xuICBjb25zdCBpbnN0cnVjdGlvbnNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhY2gtcmV3cml0ZS1pbnN0cnVjdGlvbnMnKTtcbiAgY29uc3QgdXNlckluc3RydWN0aW9ucyA9IGluc3RydWN0aW9uc0VsID8gaW5zdHJ1Y3Rpb25zRWwudmFsdWUudHJpbSgpIDogJyc7XG5cbiAgY29uc3QgZ2VuZXJhdGVCdG4gID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaC1yZXdyaXRlLWdlbmVyYXRlLWJ0bicpO1xuICBjb25zdCBhY2NlcHRCdG4gICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLXJld3JpdGUtYWNjZXB0LWJ0bicpO1xuICBjb25zdCByZWplY3RCdG4gICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLXJld3JpdGUtcmVqZWN0LWJ0bicpO1xuICBjb25zdCBzdWdnZXN0aW9uRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLXJld3JpdGUtc3VnZ2VzdGlvbicpO1xuXG4gIC8vIENhcHR1cmUgdGhlIGN1cnJlbnQgc3VnZ2VzdGlvbiBhcyBhIHByaW9yIGF0dGVtcHQgYmVmb3JlIG92ZXJ3cml0aW5nXG4gIGlmIChzdWdnZXN0aW9uRWwpIHtcbiAgICBjb25zdCBwcmV2ID0gc3VnZ2VzdGlvbkVsLnRleHRDb250ZW50LnRyaW0oKTtcbiAgICBpZiAocHJldiAmJiBwcmV2ICE9PSAnR2VuZXJhdGluZ1x1MjAyNicgJiYgIXByZXYuc3RhcnRzV2l0aCgnRXJyb3I6JykgJiYgIV9yZXdyaXRlU3VnZ2VzdGlvbkhpc3RvcnkuaW5jbHVkZXMocHJldikpIHtcbiAgICAgIF9yZXdyaXRlU3VnZ2VzdGlvbkhpc3RvcnkucHVzaChwcmV2KTtcbiAgICB9XG4gIH1cblxuICBpZiAoZ2VuZXJhdGVCdG4pIHsgZ2VuZXJhdGVCdG4uZGlzYWJsZWQgPSB0cnVlOyBnZW5lcmF0ZUJ0bi5pbm5lckhUTUwgPSAnPHNwYW4gY2xhc3M9XCJidG4tc3Bpbm5lclwiPjwvc3Bhbj5HZW5lcmF0aW5nXFx1MjAyNic7IH1cbiAgaWYgKGFjY2VwdEJ0bikgICB7IGFjY2VwdEJ0bi5kaXNhYmxlZCA9IHRydWU7IH1cbiAgaWYgKHN1Z2dlc3Rpb25FbCkgeyBzdWdnZXN0aW9uRWwuc3R5bGUuY29sb3IgPSAnIzljYTNhZic7IHN1Z2dlc3Rpb25FbC5zdHlsZS5mb250U3R5bGUgPSAnaXRhbGljJzsgc3VnZ2VzdGlvbkVsLnRleHRDb250ZW50ID0gJ0dlbmVyYXRpbmdcdTIwMjYnOyB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9yZXdyaXRlLWFjaGlldmVtZW50Jywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgYWNoaWV2ZW1lbnRfdGV4dDogICAgIG9yaWdpbmFsVGV4dCxcbiAgICAgICAgZXhwZXJpZW5jZV9pbmRleDogICAgIF9yZXdyaXRlQ2FsbGJhY2tzPy5leHBlcmllbmNlSW5kZXggPz8gbnVsbCxcbiAgICAgICAgYWNoaWV2ZW1lbnRfaW5kZXg6ICAgIF9yZXdyaXRlQ2FsbGJhY2tzPy5hY2hpZXZlbWVudEluZGV4ID8/IG51bGwsXG4gICAgICAgIHVzZXJfaW5zdHJ1Y3Rpb25zOiAgICB1c2VySW5zdHJ1Y3Rpb25zLFxuICAgICAgICBwcmV2aW91c19zdWdnZXN0aW9uczogX3Jld3JpdGVTdWdnZXN0aW9uSGlzdG9yeSxcbiAgICAgIH0pXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKCFyZXMub2spIHRocm93IG5ldyBFcnJvcihkYXRhLmVycm9yIHx8ICdSZXdyaXRlIGZhaWxlZCcpO1xuXG4gICAgY29uc3QgcmV3cml0dGVuID0gZGF0YS5yZXdyaXR0ZW4gfHwgJyc7XG4gICAgX2xhc3RSZXdyaXRlTG9nSWQgPSBkYXRhLmxvZ19pZCB8fCBudWxsO1xuICAgIGlmIChzdWdnZXN0aW9uRWwpIHtcbiAgICAgIHN1Z2dlc3Rpb25FbC5zdHlsZS5jb2xvciA9ICcnO1xuICAgICAgc3VnZ2VzdGlvbkVsLnN0eWxlLmZvbnRTdHlsZSA9ICcnO1xuICAgICAgc3VnZ2VzdGlvbkVsLnRleHRDb250ZW50ID0gcmV3cml0dGVuO1xuICAgIH1cbiAgICBfdXBkYXRlUmV3cml0ZUFjY2VwdEJ0bihyZXdyaXR0ZW4pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoc3VnZ2VzdGlvbkVsKSB7IHN1Z2dlc3Rpb25FbC5zdHlsZS5jb2xvciA9ICcjZWY0NDQ0Jzsgc3VnZ2VzdGlvbkVsLnN0eWxlLmZvbnRTdHlsZSA9ICcnOyBzdWdnZXN0aW9uRWwudGV4dENvbnRlbnQgPSBgRXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YDsgfVxuICAgIHNob3dUb2FzdChgQUkgcmV3cml0ZSBmYWlsZWQ6ICR7ZXJyLm1lc3NhZ2V9YCwgJ2Vycm9yJyk7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKGdlbmVyYXRlQnRuKSB7IGdlbmVyYXRlQnRuLmRpc2FibGVkID0gZmFsc2U7IGdlbmVyYXRlQnRuLnRleHRDb250ZW50ID0gJ0dlbmVyYXRlJzsgfVxuICAgIGlmIChyZWplY3RCdG4pICAgeyByZWplY3RCdG4uZGlzYWJsZWQgPSBmYWxzZTsgfVxuICB9XG59XG5cbi8qKlxuICogU2F2ZSBhIHNpbmdsZSBmaWVsZCBvZiBhIHRvcC1sZXZlbCBhY2hpZXZlbWVudCBpbiBzZXNzaW9uIHN0YXRlIGFuZCB1cGRhdGUgdGhlIGxvY2FsIGNhY2hlLlxuICovXG5hc3luYyBmdW5jdGlvbiBzYXZlVG9wTGV2ZWxBY2hpZXZlbWVudEZpZWxkKGFjaElkLCBmaWVsZCwgdmFsdWUpIHtcbiAgY29uc3QgYWNoID0gKHdpbmRvdy5fYWNoaWV2ZW1lbnRzT3JkZXJlZCB8fCBbXSkuZmluZChhID0+IGEuaWQgPT09IGFjaElkKTtcbiAgY29uc3QgcHJldmlvdXMgPSBhY2ggPyBhY2hbZmllbGRdIDogdW5kZWZpbmVkO1xuICBpZiAoYWNoKSBhY2hbZmllbGRdID0gdmFsdWU7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvcmV2aWV3LWFjaGlldmVtZW50Jywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgaWQ6IGFjaElkLCBmaWVsZCwgdmFsdWUgfSksXG4gICAgfSk7XG4gICAgaWYgKCFyZXMub2spIHRocm93IG5ldyBFcnJvcigoYXdhaXQgcmVzLmpzb24oKSkuZXJyb3IgfHwgJ1NhdmUgZmFpbGVkJyk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIFJvbGwgYmFjayB0aGUgb3B0aW1pc3RpYyB1cGRhdGVcbiAgICBpZiAoYWNoICYmIHByZXZpb3VzICE9PSB1bmRlZmluZWQpIGFjaFtmaWVsZF0gPSBwcmV2aW91cztcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGZpZWxkID09PSAndGl0bGUnID8gYGFjaC10aXRsZS0ke0NTUy5lc2NhcGUoYWNoSWQpfWAgOiBgYWNoLWRlc2MtJHtDU1MuZXNjYXBlKGFjaElkKX1gKTtcbiAgICBpZiAoZWwpIGVsLnZhbHVlID0gcHJldmlvdXMgPz8gJyc7XG4gICAgc2hvd1RvYXN0KGBGYWlsZWQgdG8gc2F2ZSBhY2hpZXZlbWVudDogJHtlcnIubWVzc2FnZX1gLCAnZXJyb3InKTtcbiAgfVxufVxuXG4vKipcbiAqIEhpZGUgYSB0b3AtbGV2ZWwgYWNoaWV2ZW1lbnQgZm9yIHRoaXMgc2Vzc2lvbiBhZnRlciBjb25maXJtYXRpb24uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZVRvcExldmVsQWNoaWV2ZW1lbnQoYWNoSWQpIHtcbiAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgY29uZmlybURpYWxvZyhcbiAgICAnSGlkZSB0aGlzIGFjaGlldmVtZW50IGZvciB0aGlzIENWIG9ubHk/IFlvdSBjYW4gcmVzdG9yZSBpdCBieSBzdGFydGluZyBvdmVyIG9yIGNoYW5naW5nIHRoZSBzZXNzaW9uIHNlbGVjdGlvbnMuJyxcbiAgICB7IGNvbmZpcm1MYWJlbDogJ0hpZGUnLCBjYW5jZWxMYWJlbDogJ0NhbmNlbCcsIGRhbmdlcjogdHJ1ZSB9LFxuICApO1xuICBpZiAoIWNvbmZpcm1lZCkgcmV0dXJuO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3Jldmlldy1hY2hpZXZlbWVudCcsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGlkOiBhY2hJZCwgYWN0aW9uOiAnZGVsZXRlJyB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgd2luZG93Ll9hY2hpZXZlbWVudHNPcmRlcmVkID0gKHdpbmRvdy5fYWNoaWV2ZW1lbnRzT3JkZXJlZCB8fCBbXSkuZmlsdGVyKGEgPT4gYS5pZCAhPT0gYWNoSWQpO1xuICAgICAgZGVsZXRlIHdpbmRvdy5hY2hpZXZlbWVudERlY2lzaW9uc1thY2hJZF07XG4gICAgICBfcmVuZGVyQWNoaWV2ZW1lbnRzUmV2aWV3VGFibGUoKTtcbiAgICAgIHNob3dUb2FzdCgnQWNoaWV2ZW1lbnQgaGlkZGVuIGZvciB0aGlzIHNlc3Npb24uJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3dUb2FzdChkYXRhLmVycm9yIHx8ICdEZWxldGUgZmFpbGVkLicsICdlcnJvcicpO1xuICAgIH1cbiAgfSBjYXRjaCAoXykge1xuICAgIHNob3dUb2FzdCgnRmFpbGVkIHRvIGRlbGV0ZSBhY2hpZXZlbWVudC4nLCAnZXJyb3InKTtcbiAgfVxufVxuXG4vKipcbiAqIFNhdmUgYW4gZWRpdGVkIGZpZWxkIG9uIGFuIEFJLXN1Z2dlc3RlZCBhY2hpZXZlbWVudCAoaW4tbWVtb3J5IG9ubHk7XG4gKiBzdWdnZXN0aW9ucyBhcmUgbm90IHBlcnNpc3RlZCB0byB0aGUgc2VydmVyIHVudGlsIGFjY2VwdGVkKS5cbiAqL1xuZnVuY3Rpb24gc2F2ZVN1Z2dlc3RlZEFjaGlldmVtZW50RmllbGQoc3VnZ0lkLCBmaWVsZCwgdmFsdWUpIHtcbiAgY29uc3Qgc3VnZyA9ICh3aW5kb3cuX3N1Z2dlc3RlZEFjaHNPcmRlcmVkIHx8IFtdKS5maW5kKHMgPT4gcy5fc3VnZ0lkID09PSBzdWdnSWQpO1xuICBpZiAoc3VnZykgc3VnZ1tmaWVsZF0gPSB2YWx1ZTtcbn1cblxuLyoqXG4gKiBPcGVuIHRoZSBBSSByZXdyaXRlIG1vZGFsIGZvciBhIHN1Z2dlc3RlZCBhY2hpZXZlbWVudCBkZXNjcmlwdGlvbi5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYWlSZXdyaXRlU3VnZ2VzdGVkQWNoaWV2ZW1lbnQoc3VnZ0lkKSB7XG4gIGNvbnN0IHN1Z2cgPSAod2luZG93Ll9zdWdnZXN0ZWRBY2hzT3JkZXJlZCB8fCBbXSkuZmluZChzID0+IHMuX3N1Z2dJZCA9PT0gc3VnZ0lkKTtcbiAgaWYgKCFzdWdnKSByZXR1cm47XG4gIGNvbnN0IG9yaWdpbmFsVGV4dCA9IHN1Z2cuZGVzY3JpcHRpb24gfHwgJyc7XG4gIGlmICghb3JpZ2luYWxUZXh0KSB7IHNob3dUb2FzdCgnUGxlYXNlIGVudGVyIGEgZGVzY3JpcHRpb24gZmlyc3QuJywgJ2Vycm9yJyk7IHJldHVybjsgfVxuXG4gIF9yZXdyaXRlU3VnZ2VzdGlvbkhpc3RvcnkgPSBbXTtcbiAgX2xhc3RSZXdyaXRlTG9nSWQgPSBudWxsO1xuICBfb3BlblJld3JpdGVNb2RhbChvcmlnaW5hbFRleHQsICcnLCBudWxsLCB7XG4gICAgZXhwZXJpZW5jZUluZGV4OiBudWxsLFxuICAgIG9uQWNjZXB0OiBhc3luYyAoc3VnZ2VzdGlvbikgPT4ge1xuICAgICAgc2F2ZVN1Z2dlc3RlZEFjaGlldmVtZW50RmllbGQoc3VnZ0lkLCAnZGVzY3JpcHRpb24nLCBzdWdnZXN0aW9uKTtcbiAgICAgIGNvbnN0IGRlc2NFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBhY2gtZGVzYy0ke3N1Z2dJZH1gKTtcbiAgICAgIGlmIChkZXNjRWwpIGRlc2NFbC52YWx1ZSA9IHN1Z2dlc3Rpb247XG4gICAgICBfcmVjb3JkUmV3cml0ZU91dGNvbWUoJ2FjY2VwdGVkJywgc3VnZ2VzdGlvbik7XG4gICAgICBzaG93VG9hc3QoJ0FjaGlldmVtZW50IHVwZGF0ZWQuJyk7XG4gICAgfSxcbiAgfSk7XG4gIGF3YWl0IF9ydW5SZXdyaXRlKG9yaWdpbmFsVGV4dCk7XG59XG5cbi8qKlxuICogTW92ZSBhIHN1Z2dlc3RlZCBhY2hpZXZlbWVudCB1cCBvciBkb3duIHdpdGhpbiB0aGUgZGlzcGxheSBvcmRlci5cbiAqIFN0YWJsZSBJRHMgbWVhbiBubyBkZWNpc2lvbiByZW1hcHBpbmcgaXMgbmVlZGVkLlxuICovXG5mdW5jdGlvbiBtb3ZlU3VnZ2VzdGVkQWNoaWV2ZW1lbnRSb3coc3VnZ0lkLCBkaXJlY3Rpb24pIHtcbiAgY29uc3QgYXJyID0gd2luZG93Ll9zdWdnZXN0ZWRBY2hzT3JkZXJlZDtcbiAgaWYgKCFhcnIpIHJldHVybjtcbiAgY29uc3QgaWR4ID0gYXJyLmZpbmRJbmRleChzID0+IHMuX3N1Z2dJZCA9PT0gc3VnZ0lkKTtcbiAgaWYgKGlkeCA8IDApIHJldHVybjtcbiAgY29uc3QgbmV3SWR4ID0gaWR4ICsgZGlyZWN0aW9uO1xuICBpZiAobmV3SWR4IDwgMCB8fCBuZXdJZHggPj0gYXJyLmxlbmd0aCkgcmV0dXJuO1xuICBbYXJyW2lkeF0sIGFycltuZXdJZHhdXSA9IFthcnJbbmV3SWR4XSwgYXJyW2lkeF1dO1xuICBfcmVuZGVyQWNoaWV2ZW1lbnRzUmV2aWV3VGFibGUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaGlldmVtZW50cy10YWJsZS1jb250YWluZXInKSk7XG59XG5cbi8qKlxuICogUmVtb3ZlIGEgc3VnZ2VzdGVkIGFjaGlldmVtZW50IGZyb20gdGhlIGxpc3QgYWZ0ZXIgY29uZmlybWF0aW9uLlxuICogU3RhYmxlIElEcyBtZWFuIG5vIG90aGVyIGRlY2lzaW9uIGtleXMgbmVlZCByZW1hcHBpbmcuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZVN1Z2dlc3RlZEFjaGlldmVtZW50KHN1Z2dJZCkge1xuICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCBjb25maXJtRGlhbG9nKCdSZW1vdmUgdGhpcyBBSSBzdWdnZXN0aW9uPycsIHsgY29uZmlybUxhYmVsOiAnUmVtb3ZlJywgZGFuZ2VyOiB0cnVlIH0pO1xuICBpZiAoIWNvbmZpcm1lZCkgcmV0dXJuO1xuICB3aW5kb3cuX3N1Z2dlc3RlZEFjaHNPcmRlcmVkID0gKHdpbmRvdy5fc3VnZ2VzdGVkQWNoc09yZGVyZWQgfHwgW10pLmZpbHRlcihzID0+IHMuX3N1Z2dJZCAhPT0gc3VnZ0lkKTtcbiAgZGVsZXRlIHdpbmRvdy5hY2hpZXZlbWVudERlY2lzaW9uc1tzdWdnSWRdO1xuICBfcmVuZGVyQWNoaWV2ZW1lbnRzUmV2aWV3VGFibGUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaGlldmVtZW50cy10YWJsZS1jb250YWluZXInKSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNhdmVBY2hpZXZlbWVudEVkaXRzQW5kQ29udGludWUoKSB7XG4gIHRyeSB7XG4gICAgLy8gRmx1c2ggYW55IGN1cnJlbnRseS1mb2N1c2VkIHRleHRhcmVhc1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tpZF49XCJhY2gtdGV4dC1cIl0nKS5mb3JFYWNoKHRhID0+IHtcbiAgICAgIGNvbnN0IHBhcnRzID0gdGEuaWQuc3BsaXQoJy0nKTtcbiAgICAgIGlmIChwYXJ0cy5sZW5ndGggPj0gNCkge1xuICAgICAgICBjb25zdCBleHBJZHggPSBwYXJzZUludChwYXJ0c1syXSk7XG4gICAgICAgIGNvbnN0IGFjaElkeCA9IHBhcnNlSW50KHBhcnRzWzNdKTtcbiAgICAgICAgaWYgKCFpc05hTihleHBJZHgpICYmICFpc05hTihhY2hJZHgpICYmIHdpbmRvdy5hY2hpZXZlbWVudEVkaXRzW2V4cElkeF0pIHtcbiAgICAgICAgICB1cGRhdGVBY2hpZXZlbWVudFRleHQoZXhwSWR4LCBhY2hJZHgsIHRhLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvc2F2ZS1hY2hpZXZlbWVudC1lZGl0cycsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGVkaXRzOiB3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0cyB9KVxuICAgIH0pO1xuICAgIGlmICghcmVzLm9rKSB7XG4gICAgICBjb25zdCBlcnIgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgc2hvd1RvYXN0KGBFcnJvciBzYXZpbmc6ICR7ZXJyLmVycm9yIHx8ICdVbmtub3duIGVycm9yJ31gLCAnZXJyb3InKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3RhdGVNYW5hZ2VyLm1hcmtDb250ZW50Q2hhbmdlZCgpO1xuICAgIHNob3dUb2FzdCgnQWNoaWV2ZW1lbnQgZWRpdHMgc2F2ZWQuJyk7XG4gICAgc3dpdGNoVGFiKCdza2lsbHMtcmV2aWV3Jyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBzaG93VG9hc3QoJ0ZhaWxlZCB0byBzYXZlIGFjaGlldmVtZW50IGVkaXRzLicsICdlcnJvcicpO1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIGZldGNoSnNvbldpdGhUaW1lb3V0LFxuICBfYWNoVmVyYldhcm5pbmcsXG4gIF9hY2hTbmFwc2hvdEtleSxcbiAgX3NhdmVBY2hTbmFwc2hvdCxcbiAgX2dldEFjaFNuYXBzaG90LFxuICBidWlsZEFjaGlldmVtZW50c1Jldmlld1RhYmxlLFxuICBfcmVuZGVyQWNoaWV2ZW1lbnRzUmV2aWV3VGFibGUsXG4gIGJ1bGtBY2hpZXZlbWVudEFjdGlvbixcbiAgaGFuZGxlQWNoaWV2ZW1lbnRBY3Rpb24sXG4gIHN1Ym1pdEFjaGlldmVtZW50RGVjaXNpb25zLFxuICBtb3ZlQWNoaWV2ZW1lbnRSb3csXG4gIGJ1aWxkQWNoaWV2ZW1lbnRzRWRpdG9yLFxuICByZW5kZXJBY2hpZXZlbWVudEVkaXRvclJvd3MsXG4gIHVwZGF0ZUFjaGlldmVtZW50VGV4dCxcbiAgdG9nZ2xlQWNoaWV2ZW1lbnRIaWRkZW4sXG4gIG1vdmVBY2hpZXZlbWVudCxcbiAgZGVsZXRlQWNoaWV2ZW1lbnQsXG4gIGFkZEFjaGlldmVtZW50Um93LFxuICByZXdyaXRlQWNoaWV2ZW1lbnRXaXRoTExNLFxuICBhaVJld3JpdGVUb3BMZXZlbEFjaGlldmVtZW50LFxuICBfb3BlblJld3JpdGVNb2RhbCxcbiAgX3VwZGF0ZVJld3JpdGVBY2NlcHRCdG4sXG4gIF9yZWNvcmRSZXdyaXRlT3V0Y29tZSxcbiAgX3J1blJld3JpdGUsXG4gIHNhdmVUb3BMZXZlbEFjaGlldmVtZW50RmllbGQsXG4gIGRlbGV0ZVRvcExldmVsQWNoaWV2ZW1lbnQsXG4gIHNhdmVTdWdnZXN0ZWRBY2hpZXZlbWVudEZpZWxkLFxuICBhaVJld3JpdGVTdWdnZXN0ZWRBY2hpZXZlbWVudCxcbiAgbW92ZVN1Z2dlc3RlZEFjaGlldmVtZW50Um93LFxuICBkZWxldGVTdWdnZXN0ZWRBY2hpZXZlbWVudCxcbiAgc2F2ZUFjaGlldmVtZW50RWRpdHNBbmRDb250aW51ZSxcbn07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi90YWdsaW5lLXJldmlldy5qc1xuICogQXBwbGljYW50IHRhZ2xpbmUgKGhlYWRsaW5lKSByZXZpZXc6IGRpc3BsYXkgQUktcHJvcG9zZWQgdGFnbGluZSxcbiAqIGFsbG93IGVkaXRpbmcsIHJlcXVpcmUgZXhwbGljaXQgdXNlciBjb25maXJtYXRpb24gYmVmb3JlIGNvbnRpbnVpbmcuXG4gKlxuICogVGhlIHRhZ2xpbmUgaXMgdGhlIG9uZS1saW5lIHByb2Zlc3Npb25hbCBpZGVudGl0eSBzaG93biB1bmRlciB0aGVcbiAqIGFwcGxpY2FudCdzIG5hbWUgb24gdGhlIENWLiAgSXQgaXMgTk9UIHRoZSBzYW1lIGFzIHRoZSBqb2IgdGl0bGUgXHUyMDE0XG4gKiBpdCBkZXNjcmliZXMgdGhlIGFwcGxpY2FudCAoZS5nLiBcIlNlbmlvciBEYXRhIFNjaWVudGlzdCBzcGVjaWFsaXNpbmdcbiAqIGluIGJpb3N0YXRpc3RpY3MgYW5kIE1MXCIpLCBub3QgdGhlIHJvbGUgYmVpbmcgYXBwbGllZCBmb3IuXG4gKlxuICogVXNlciBNVVNUIGNsaWNrIFwiQ29uZmlybSBUYWdsaW5lXCIgYmVmb3JlIGdlbmVyYXRpb24gaXMgYWxsb3dlZC5cbiAqIFRoZSBjb25maXJtZWQgdGV4dCBpcyBzdG9yZWQgdmlhIFBPU1QgL2FwaS9yZXZpZXctZGVjaXNpb25zICh0eXBlOiAndGFnbGluZScpLlxuICpcbiAqIERlcGVuZGVuY2llcyAocmVzb2x2ZWQgdGhyb3VnaCBnbG9iYWxUaGlzIGF0IHJ1bnRpbWUpOlxuICogICBlc2NhcGVIdG1sLCBzaG93VG9hc3QsIHN3aXRjaFRhYiwgc3RhdGVNYW5hZ2VyXG4gKi9cblxuaW1wb3J0IHsgc3RhdGVNYW5hZ2VyIH0gZnJvbSAnLi9zdGF0ZS1tYW5hZ2VyLmpzJztcblxuLy8gXHUyNTAwXHUyNTAwIEJ1aWxkIHRhZ2xpbmUtcmV2aWV3IHNlY3Rpb24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8qKlxuICogZHVja2Zsb3c6XG4gKiAgIGlkOiB0YWdsaW5lX3VpX2J1aWxkXG4gKiAgIGtpbmQ6IHVpXG4gKiAgIHRpbWVzdGFtcDogXCIyMDI2LTA1LTI4VDAwOjAwOjAwWlwiXG4gKiAgIHN0YXR1czogbGl2ZVxuICogICBoYW5kbGVzOiBbXCJ1aTp0YWdsaW5lLXJldmlldy5idWlsZFwiXVxuICogICByZWFkczpcbiAqICAgICAtIFwid2luZG93OnBlbmRpbmdSZWNvbW1lbmRhdGlvbnNcIlxuICogICAgIC0gXCJyZXNwb25zZTpHRVQgL2FwaS9zdGF0dXMudGFnbGluZV9vdmVycmlkZVwiXG4gKiAgICAgLSBcInJlc3BvbnNlOkdFVCAvYXBpL3N0YXR1cy5kZWNpc2lvbnNfY29uZmlybWVkXCJcbiAqICAgd3JpdGVzOiBbXCJkb206I3RhZ2xpbmUtcmV2aWV3LWNvbnRhaW5lclwiXVxuICogICBub3RlczogXCJSZW5kZXJzIHByb3Bvc2VkIHRhZ2xpbmUgKGZyb20gTExNIGN1c3RvbWl6YXRpb25zKSB3aXRoIGFuIGVkaXRhYmxlIGlucHV0IGFuZCBjb25maXJtIGJ1dHRvbi5cIlxuICovXG5hc3luYyBmdW5jdGlvbiBidWlsZFRhZ2xpbmVSZXZpZXdTZWN0aW9uKCkge1xuICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFnbGluZS1yZXZpZXctY29udGFpbmVyJyk7XG4gIGlmICghY29udGFpbmVyKSByZXR1cm47XG5cbiAgLy8gRmV0Y2ggY3VycmVudCBzdGF0dXMgdG8gZ2V0IHRhZ2xpbmVfb3ZlcnJpZGUgKyBwcm9wb3NlZCB0YWdsaW5lXG4gIGxldCBwcm9wb3NlZFRhZ2xpbmUgID0gJyc7XG4gIGxldCBjb25maXJtZWRUYWdsaW5lID0gJyc7XG4gIGxldCBhbHJlYWR5Q29uZmlybWVkID0gZmFsc2U7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgICAgPSBhd2FpdCBmZXRjaCgnL2FwaS9zdGF0dXMnKTtcbiAgICBjb25zdCBzdGF0dXMgPSByZXMub2sgPyBhd2FpdCByZXMuanNvbigpIDoge307XG5cbiAgICAvLyB0YWdsaW5lX292ZXJyaWRlIGlzIHRoZSB1c2VyLWNvbmZpcm1lZCB2YWx1ZSAobWF5IGJlIG51bGwpXG4gICAgY29uZmlybWVkVGFnbGluZSA9IHN0YXR1cy50YWdsaW5lX292ZXJyaWRlIHx8ICcnO1xuICAgIGFscmVhZHlDb25maXJtZWQgPSAhIShzdGF0dXMuZGVjaXNpb25zX2NvbmZpcm1lZCAmJiBzdGF0dXMuZGVjaXNpb25zX2NvbmZpcm1lZC50YWdsaW5lKTtcblxuICAgIC8vIFByb3Bvc2VkIHRhZ2xpbmUgZnJvbSB0aGUgTExNIHJlY29tbWVuZGF0aW9uc1xuICAgIGNvbnN0IGN1c3RvbWl6YXRpb25zID0gc3RhdHVzLmN1c3RvbWl6YXRpb25zIHx8IHt9O1xuICAgIHByb3Bvc2VkVGFnbGluZSA9IGN1c3RvbWl6YXRpb25zLmFwcGxpY2FudF90YWdsaW5lIHx8ICcnO1xuICB9IGNhdGNoIChfZSkge1xuICAgIC8vIE5ldHdvcmsgZmFpbHVyZSBcdTIwMTQgbGVhdmUgZmllbGRzIGVtcHR5LCB1c2VyIGNhbiBzdGlsbCB0eXBlIG1hbnVhbGx5XG4gIH1cblxuICBjb25zdCBpbml0aWFsICAgPSBjb25maXJtZWRUYWdsaW5lIHx8IHByb3Bvc2VkVGFnbGluZTtcbiAgY29uc3Qgc3RhdHVzTXNnID0gYWxyZWFkeUNvbmZpcm1lZFxuICAgID8gJzxzcGFuIHN0eWxlPVwiY29sb3I6IzA2NWY0Njtmb250LXdlaWdodDo2MDA7XCI+XHUyNzEzIENvbmZpcm1lZDwvc3Bhbj4nXG4gICAgOiAnPHNwYW4gc3R5bGU9XCJjb2xvcjojOTI0MDBlO1wiPlJlcXVpcmVzIHlvdXIgY29uZmlybWF0aW9uIGJlZm9yZSBnZW5lcmF0aW5nPC9zcGFuPic7XG5cbiAgY29udGFpbmVyLmlubmVySFRNTCA9IGBcbiAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNnB4O1wiPlxuICAgICAgPHAgc3R5bGU9XCJjb2xvcjojMzc0MTUxO2ZvbnQtc2l6ZTowLjk1ZW07bGluZS1oZWlnaHQ6MS42O21hcmdpbjowIDAgOHB4O1wiPlxuICAgICAgICBUaGUgPHN0cm9uZz50YWdsaW5lPC9zdHJvbmc+IGFwcGVhcnMgZGlyZWN0bHkgdW5kZXIgeW91ciBuYW1lIG9uIHRoZSBDVi5cbiAgICAgICAgSXQgc2hvdWxkIGRlc2NyaWJlIDxlbT53aG8geW91IGFyZTwvZW0+IGFzIGEgcHJvZmVzc2lvbmFsIFx1MjAxNCBub3QgdGhlIGpvYiB0aXRsZSB5b3UgYXJlIGFwcGx5aW5nIGZvci5cbiAgICAgIDwvcD5cbiAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtmb250LXNpemU6MC44NWVtO21hcmdpbjowO1wiPlxuICAgICAgICBFeGFtcGxlOiA8ZW0+XCJTZW5pb3IgRGF0YSBTY2llbnRpc3Qgc3BlY2lhbGlzaW5nIGluIGJpb3N0YXRpc3RpY3MgYW5kIG1hY2hpbmUgbGVhcm5pbmdcIjwvZW0+XG4gICAgICA8L3A+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IHN0eWxlPVwiYm9yZGVyOjFweCBzb2xpZCAjZDFmYWU1O2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MTZweDttYXJnaW4tYm90dG9tOjIwcHg7YmFja2dyb3VuZDojZjBmZGY0O1wiPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDttYXJnaW4tYm90dG9tOjEwcHg7XCI+XG4gICAgICAgIDxzdHJvbmcgc3R5bGU9XCJjb2xvcjojMDY1ZjQ2O1wiPkFwcGxpY2FudCBUYWdsaW5lPC9zdHJvbmc+XG4gICAgICAgIDxzcGFuIGlkPVwidGFnbGluZS1jb25maXJtLXN0YXR1c1wiIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtcIj4ke3N0YXR1c01zZ308L3NwYW4+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGxhYmVsIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtmb250LXdlaWdodDo2MDA7Y29sb3I6IzM3NDE1MTtkaXNwbGF5OmJsb2NrO21hcmdpbi1ib3R0b206NHB4O1wiXG4gICAgICAgICAgICAgZm9yPVwidGFnbGluZS1pbnB1dFwiPlxuICAgICAgICBFZGl0IHRhZ2xpbmUgKHJlcXVpcmVkKTpcbiAgICAgIDwvbGFiZWw+XG4gICAgICA8aW5wdXQgaWQ9XCJ0YWdsaW5lLWlucHV0XCIgdHlwZT1cInRleHRcIlxuICAgICAgICB2YWx1ZT1cIiR7ZXNjYXBlSHRtbChpbml0aWFsKX1cIlxuICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gU2VuaW9yIERhdGEgU2NpZW50aXN0IHNwZWNpYWxpc2luZyBpbiBiaW9zdGF0aXN0aWNzIGFuZCBNTFwiXG4gICAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTtib3gtc2l6aW5nOmJvcmRlci1ib3g7cGFkZGluZzo4cHggMTBweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo0cHg7Zm9udC1zaXplOjAuOTVlbTtcIlxuICAgICAgICBvbmlucHV0PVwib25UYWdsaW5lSW5wdXRDaGFuZ2UoKVwiIC8+XG5cbiAgICAgICR7cHJvcG9zZWRUYWdsaW5lICYmIHByb3Bvc2VkVGFnbGluZSAhPT0gY29uZmlybWVkVGFnbGluZSA/IGBcbiAgICAgIDxwIHN0eWxlPVwibWFyZ2luOjZweCAwIDA7Zm9udC1zaXplOjAuOGVtO2NvbG9yOiM2YjcyODA7XCI+XG4gICAgICAgIEFJIHByb3Bvc2VkOiA8ZW0+JHtlc2NhcGVIdG1sKHByb3Bvc2VkVGFnbGluZSl9PC9lbT5cbiAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPVwicmVzZXRUYWdsaW5lVG9Qcm9wb3NlZCgpXCIgc3R5bGU9XCJiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOm5vbmU7Y3Vyc29yOnBvaW50ZXI7Y29sb3I6IzI1NjNlYjtmb250LXNpemU6MC44ZW07cGFkZGluZzowIDRweDt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO1wiPlVzZSB0aGlzPC9idXR0b24+XG4gICAgICA8L3A+YCA6ICcnfVxuXG4gICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDoxMnB4O1wiPlxuICAgICAgICA8YnV0dG9uIGlkPVwidGFnbGluZS1jb25maXJtLWJ0blwiIGNsYXNzPVwic3VibWl0LWJ0blwiIHN0eWxlPVwiZm9udC1zaXplOjAuOWVtO3BhZGRpbmc6OHB4IDIwcHg7YmFja2dyb3VuZDojMTBiOTgxO1wiXG4gICAgICAgICAgb25jbGljaz1cImNvbmZpcm1UYWdsaW5lKClcIj5cbiAgICAgICAgICBcdTI3MTMgQ29uZmlybSBUYWdsaW5lXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAke2FscmVhZHlDb25maXJtZWQgPyAnPHNwYW4gaWQ9XCJ0YWdsaW5lLWNvbmZpcm1lZC1iYWRnZVwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6MTBweDtmb250LXNpemU6MC44NWVtO2NvbG9yOiMwNjVmNDY7XCI+U2F2ZWQgXHUyNzEzPC9zcGFuPicgOiAnPHNwYW4gaWQ9XCJ0YWdsaW5lLWNvbmZpcm1lZC1iYWRnZVwiIHN0eWxlPVwiZGlzcGxheTpub25lO21hcmdpbi1sZWZ0OjEwcHg7Zm9udC1zaXplOjAuODVlbTtjb2xvcjojMDY1ZjQ2O1wiPlNhdmVkIFx1MjcxMzwvc3Bhbj4nfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwibmF2LWJ1dHRvbnNcIiBzdHlsZT1cIm1hcmdpbi10b3A6MTZweDtcIj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJiYWNrLWJ0blwiIG9uY2xpY2s9XCJzd2l0Y2hUYWIoJ2FjaGlldmVtZW50cy1yZXZpZXcnKVwiPlx1MjE5MCBCYWNrIHRvIEFjaGlldmVtZW50czwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiBpZD1cInRhZ2xpbmUtY29udGludWUtYnRuXCIgY2xhc3M9XCJjb250aW51ZS1idG5cIlxuICAgICAgICBzdHlsZT1cIiR7YWxyZWFkeUNvbmZpcm1lZCA/ICcnIDogJ29wYWNpdHk6MC41O2N1cnNvcjpub3QtYWxsb3dlZDsnfVwiXG4gICAgICAgIG9uY2xpY2s9XCJ0YWdsaW5lQ29udGludWUoKVwiXG4gICAgICAgICR7YWxyZWFkeUNvbmZpcm1lZCA/ICcnIDogJ3RpdGxlPVwiUGxlYXNlIGNvbmZpcm0gdGhlIHRhZ2xpbmUgYmVmb3JlIGNvbnRpbnVpbmdcIid9PlxuICAgICAgICBDb250aW51ZSB0byBTdW1tYXJ5IFx1MjE5MlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+YDtcblxuICAvLyBFeHBvc2UgcHJvcG9zZWQgdGFnbGluZSBmb3IgdGhlIHJlc2V0IGJ1dHRvblxuICB3aW5kb3cuX3Byb3Bvc2VkVGFnbGluZSA9IHByb3Bvc2VkVGFnbGluZTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIElucHV0IGNoYW5nZSBoYW5kbGVyIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBvblRhZ2xpbmVJbnB1dENoYW5nZSgpIHtcbiAgLy8gV2hlbiB1c2VyIGVkaXRzIHRoZSB0ZXh0LCB1bi1jb25maXJtIHRoZSBwcmV2aW91cyBzYXZlIHNvIHRoZXkgbXVzdCByZS1jb25maXJtXG4gIGNvbnN0IGJhZGdlICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFnbGluZS1jb25maXJtZWQtYmFkZ2UnKTtcbiAgY29uc3Qgc3RhdHVzU3BhbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWdsaW5lLWNvbmZpcm0tc3RhdHVzJyk7XG4gIGlmIChiYWRnZSkgICAgICBiYWRnZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBpZiAoc3RhdHVzU3Bhbikgc3RhdHVzU3Bhbi5pbm5lckhUTUwgPSAnPHNwYW4gc3R5bGU9XCJjb2xvcjojOTI0MDBlO1wiPlJlcXVpcmVzIHlvdXIgY29uZmlybWF0aW9uIGJlZm9yZSBnZW5lcmF0aW5nPC9zcGFuPic7XG4gIGNvbnN0IGNvbnRpbnVlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhZ2xpbmUtY29udGludWUtYnRuJyk7XG4gIGlmIChjb250aW51ZUJ0bikge1xuICAgIGNvbnRpbnVlQnRuLnN0eWxlLm9wYWNpdHkgICAgICAgPSAnMC41JztcbiAgICBjb250aW51ZUJ0bi5zdHlsZS5jdXJzb3IgICAgICAgID0gJ25vdC1hbGxvd2VkJztcbiAgICBjb250aW51ZUJ0bi50aXRsZSAgICAgICAgICAgICAgID0gJ1BsZWFzZSBjb25maXJtIHRoZSB0YWdsaW5lIGJlZm9yZSBjb250aW51aW5nJztcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgUmVzZXQgdG8gQUktcHJvcG9zZWQgdGFnbGluZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gcmVzZXRUYWdsaW5lVG9Qcm9wb3NlZCgpIHtcbiAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFnbGluZS1pbnB1dCcpO1xuICBpZiAoaW5wdXQgJiYgd2luZG93Ll9wcm9wb3NlZFRhZ2xpbmUpIHtcbiAgICBpbnB1dC52YWx1ZSA9IHdpbmRvdy5fcHJvcG9zZWRUYWdsaW5lO1xuICAgIG9uVGFnbGluZUlucHV0Q2hhbmdlKCk7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIENvbmZpcm0gYW5kIHBlcnNpc3QgdGFnbGluZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLyoqXG4gKiBkdWNrZmxvdzpcbiAqICAgaWQ6IHRhZ2xpbmVfdWlfY29uZmlybVxuICogICBraW5kOiB1aVxuICogICB0aW1lc3RhbXA6IFwiMjAyNi0wNS0yOFQwMDowMDowMFpcIlxuICogICBzdGF0dXM6IGxpdmVcbiAqICAgaGFuZGxlczogW1widWk6dGFnbGluZS1yZXZpZXcuY29uZmlybVwiXVxuICogICBjYWxsczogW1wiUE9TVCAvYXBpL3Jldmlldy1kZWNpc2lvbnNcIl1cbiAqICAgcmVhZHM6IFtcImRvbTojdGFnbGluZS1pbnB1dFwiXVxuICogICB3cml0ZXM6XG4gKiAgICAgLSBcInJlcXVlc3Q6UE9TVCAvYXBpL3Jldmlldy1kZWNpc2lvbnMudHlwZT10YWdsaW5lXCJcbiAqICAgICAtIFwicmVxdWVzdDpQT1NUIC9hcGkvcmV2aWV3LWRlY2lzaW9ucy5kZWNpc2lvbnNcIlxuICogICBub3RlczogXCJQT1NUcyB0aGUgY29uZmlybWVkIHRhZ2xpbmUgdGV4dDsgZW5hYmxlcyB0aGUgY29udGludWUgYnV0dG9uIG9uIHN1Y2Nlc3MuXCJcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY29uZmlybVRhZ2xpbmUoKSB7XG4gIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhZ2xpbmUtaW5wdXQnKTtcbiAgaWYgKCFpbnB1dCkgcmV0dXJuO1xuXG4gIGNvbnN0IHRhZ2xpbmVUZXh0ID0gaW5wdXQudmFsdWUudHJpbSgpO1xuICBpZiAoIXRhZ2xpbmVUZXh0KSB7XG4gICAgc2hvd1RvYXN0KCdQbGVhc2UgZW50ZXIgYSB0YWdsaW5lIGJlZm9yZSBjb25maXJtaW5nLicsICdlcnJvcicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWdsaW5lLWNvbmZpcm0tYnRuJyk7XG4gIGlmIChidG4pIGJ0bi5kaXNhYmxlZCA9IHRydWU7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3Jldmlldy1kZWNpc2lvbnMnLCB7XG4gICAgICBtZXRob2Q6ICAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6ICAgIEpTT04uc3RyaW5naWZ5KHsgdHlwZTogJ3RhZ2xpbmUnLCBkZWNpc2lvbnM6IHRhZ2xpbmVUZXh0IH0pLFxuICAgIH0pO1xuXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgY29uc3QgZXJyID0gYXdhaXQgcmVzcG9uc2UuanNvbigpLmNhdGNoKCgpID0+ICh7fSkpO1xuICAgICAgc2hvd1RvYXN0KGBGYWlsZWQgdG8gc2F2ZSB0YWdsaW5lOiAke2Vyci5lcnJvciB8fCByZXNwb25zZS5zdGF0dXNUZXh0fWAsICdlcnJvcicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBVSSB0byBzaG93IGNvbmZpcm1lZCBzdGF0ZVxuICAgIGNvbnN0IGJhZGdlICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFnbGluZS1jb25maXJtZWQtYmFkZ2UnKTtcbiAgICBjb25zdCBzdGF0dXNTcGFuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhZ2xpbmUtY29uZmlybS1zdGF0dXMnKTtcbiAgICBpZiAoYmFkZ2UpICAgICAgeyBiYWRnZS5zdHlsZS5kaXNwbGF5ID0gJyc7IH1cbiAgICBpZiAoc3RhdHVzU3BhbikgeyBzdGF0dXNTcGFuLmlubmVySFRNTCA9ICc8c3BhbiBzdHlsZT1cImNvbG9yOiMwNjVmNDY7Zm9udC13ZWlnaHQ6NjAwO1wiPlx1MjcxMyBDb25maXJtZWQ8L3NwYW4+JzsgfVxuXG4gICAgY29uc3QgY29udGludWVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFnbGluZS1jb250aW51ZS1idG4nKTtcbiAgICBpZiAoY29udGludWVCdG4pIHtcbiAgICAgIGNvbnRpbnVlQnRuLnN0eWxlLm9wYWNpdHkgPSAnJztcbiAgICAgIGNvbnRpbnVlQnRuLnN0eWxlLmN1cnNvciAgPSAnJztcbiAgICAgIGNvbnRpbnVlQnRuLnRpdGxlICAgICAgICAgPSAnJztcbiAgICB9XG5cbiAgICBzdGF0ZU1hbmFnZXIubWFya0NvbnRlbnRDaGFuZ2VkKCk7XG4gICAgc2hvd1RvYXN0KCdUYWdsaW5lIGNvbmZpcm1lZC4nKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dUb2FzdCgnTmV0d29yayBlcnJvciBzYXZpbmcgdGFnbGluZS4nLCAnZXJyb3InKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoYnRuKSBidG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgQ29udGludWUgbmF2aWdhdGlvbiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gdGFnbGluZUNvbnRpbnVlKCkge1xuICAvLyBHdWFyZDogbXVzdCBiZSBjb25maXJtZWQgYmVmb3JlIHByb2NlZWRpbmdcbiAgY29uc3QgY29udGludWVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFnbGluZS1jb250aW51ZS1idG4nKTtcbiAgaWYgKGNvbnRpbnVlQnRuICYmIGNvbnRpbnVlQnRuLnN0eWxlLmN1cnNvciA9PT0gJ25vdC1hbGxvd2VkJykge1xuICAgIHNob3dUb2FzdCgnUGxlYXNlIGNvbmZpcm0gdGhlIHRhZ2xpbmUgYmVmb3JlIGNvbnRpbnVpbmcuJywgJ2Vycm9yJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHN3aXRjaFRhYignc3VtbWFyeS1yZXZpZXcnKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEV4cG9ydHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmV4cG9ydCB7XG4gIGJ1aWxkVGFnbGluZVJldmlld1NlY3Rpb24sXG4gIG9uVGFnbGluZUlucHV0Q2hhbmdlLFxuICByZXNldFRhZ2xpbmVUb1Byb3Bvc2VkLFxuICBjb25maXJtVGFnbGluZSxcbiAgdGFnbGluZUNvbnRpbnVlLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL3N1bW1hcnktcmV2aWV3LmpzXG4gKiBTdW1tYXJ5LWZvY3VzIHNlbGVjdGlvbjogQUkgZ2VuZXJhdGlvbiwgc3RvcmVkIHZhcmlhbnRzLCBzdWJtaXQgZGVjaXNpb24uXG4gKlxuICogRGVwZW5kZW5jaWVzIChyZXNvbHZlZCB0aHJvdWdoIGdsb2JhbFRoaXMgYXQgcnVudGltZSk6XG4gKiAgIHBlbmRpbmdSZWNvbW1lbmRhdGlvbnMsIHNlbGVjdGVkU3VtbWFyeUtleSwgX2FpR2VuZXJhdGVkU3VtbWFyeSxcbiAqICAgZXNjYXBlSHRtbCwgc2hvd1RvYXN0LCBzd2l0Y2hUYWIsIHNldExvYWRpbmcsIHNjaGVkdWxlQXRzUmVmcmVzaFxuICovXG5cbmltcG9ydCB7IHN0YXRlTWFuYWdlciB9IGZyb20gJy4vc3RhdGUtbWFuYWdlci5qcyc7XG5cbi8vIFx1MjUwMFx1MjUwMCBCdWlsZCBzdW1tYXJ5LWZvY3VzIHNlY3Rpb24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8qKlxuICogZHVja2Zsb3c6XG4gKiAgIGlkOiBzdW1tYXJ5X3VpX2J1aWxkXG4gKiAgIGtpbmQ6IHVpXG4gKiAgIHRpbWVzdGFtcDogXCIyMDI2LTAzLTI3VDAxOjIzOjI4WlwiXG4gKiAgIHN0YXR1czogc2hhcmVkXG4gKiAgIGhhbmRsZXM6IFtcInVpOnN1bW1hcnktcmV2aWV3LmJ1aWxkXCJdXG4gKiAgIGNhbGxzOiBbXCJHRVQgL2FwaS9tYXN0ZXItZmllbGRzXCIsIFwiR0VUIC9hcGkvc3RhdHVzXCIsIFwidWk6c3VtbWFyeS1yZXZpZXcuZ2VuZXJhdGVcIl1cbiAqICAgcmVhZHM6XG4gKiAgICAgLSBcIndpbmRvdzpwZW5kaW5nUmVjb21tZW5kYXRpb25zXCJcbiAqICAgICAtIFwicmVzcG9uc2U6R0VUIC9hcGkvbWFzdGVyLWZpZWxkcy5wcm9mZXNzaW9uYWxfc3VtbWFyaWVzXCJcbiAqICAgICAtIFwicmVzcG9uc2U6R0VUIC9hcGkvc3RhdHVzLnByb2Zlc3Npb25hbF9zdW1tYXJpZXNcIlxuICogICAgIC0gXCJzdGF0ZTpzZXNzaW9uX3N1bW1hcmllcy5haV9nZW5lcmF0ZWRcIlxuICogICB3cml0ZXM6IFtcImRvbTojc3VtbWFyeS1mb2N1cy1jb250YWluZXJcIiwgXCJ3aW5kb3c6c2VsZWN0ZWRTdW1tYXJ5S2V5XCJdXG4gKiAgIG5vdGVzOiBcIkJ1aWxkcyB0aGUgc3VtbWFyeSByZXZpZXcgVUkgZnJvbSBtYXN0ZXIgdmFyaWFudHMgcGx1cyBzZXNzaW9uIG92ZXJyaWRlcyBhbmQgc2VlZHMgdGhlIHNlbGVjdGVkIGtleS5cIlxuICovXG5cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkU3VtbWFyeUZvY3VzU2VjdGlvbigpIHtcbiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1bW1hcnktZm9jdXMtY29udGFpbmVyJyk7XG4gIGlmICghY29udGFpbmVyKSByZXR1cm47XG5cbiAgY29uc3QgZGF0YSA9IHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zO1xuXG4gIC8vIFx1MjUwMFx1MjUwMCBMb2FkIGFsbCBrbm93biBzdW1tYXJpZXMgKG1hc3RlciBiYXNlICsgc2Vzc2lvbiBvdmVycmlkZXMpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAvLyBGZXRjaCBtYXN0ZXIgZmllbGRzIGFuZCBzdGF0dXMgaW4gcGFyYWxsZWw7IHNlc3Npb24gc3VtbWFyaWVzIG92ZXJ3cml0ZSBtYXN0ZXIgdmFyaWFudHMuXG4gIGxldCBwcm9mZXNzaW9uYWxTdW1tYXJpZXMgPSB7fTtcbiAgY29uc3QgW21mUmVzdWx0LCBzdGF0dXNSZXN1bHRdID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFtcbiAgICBmZXRjaCgnL2FwaS9tYXN0ZXItZmllbGRzJykudGhlbihyID0+IHIuanNvbigpKSxcbiAgICBmZXRjaCgnL2FwaS9zdGF0dXMnKS50aGVuKHIgPT4gci5qc29uKCkpLFxuICBdKTtcbiAgaWYgKG1mUmVzdWx0LnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcgJiYgbWZSZXN1bHQudmFsdWUgJiYgbWZSZXN1bHQudmFsdWUub2spIHtcbiAgICBPYmplY3QuYXNzaWduKHByb2Zlc3Npb25hbFN1bW1hcmllcywgbWZSZXN1bHQudmFsdWUucHJvZmVzc2lvbmFsX3N1bW1hcmllcyB8fCB7fSk7XG4gIH1cbiAgaWYgKHN0YXR1c1Jlc3VsdC5zdGF0dXMgPT09ICdmdWxmaWxsZWQnICYmIHN0YXR1c1Jlc3VsdC52YWx1ZSkge1xuICAgIC8vIFNlc3Npb24gc3VtbWFyaWVzIChlLmcuIGFpX2dlbmVyYXRlZCkgb3ZlcndyaXRlIG1hc3RlciB2YXJpYW50c1xuICAgIE9iamVjdC5hc3NpZ24ocHJvZmVzc2lvbmFsU3VtbWFyaWVzLCBzdGF0dXNSZXN1bHQudmFsdWUucHJvZmVzc2lvbmFsX3N1bW1hcmllcyB8fCB7fSk7XG4gIH1cblxuICAvLyBcdTI1MDBcdTI1MDAgU3VnZ2VzdGVkIGNvbnRlbnQgcmVvcmRlcmluZyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgY29uc3QgcmVvcmRlcmluZ1RleHQgPSAoZGF0YSAmJiBkYXRhLnN1Z2dlc3RlZF9jb250ZW50X3Jlb3JkZXJpbmcpIHx8ICcnO1xuICBjb25zdCByZW9yZGVyaW5nSFRNTCA9IHJlb3JkZXJpbmdUZXh0XG4gICAgPyBgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2VmZjZmZjtib3JkZXI6MXB4IHNvbGlkICNiZmRiZmU7Ym9yZGVyLXJhZGl1czo2cHg7cGFkZGluZzoxMnB4O21hcmdpbi1ib3R0b206MTZweDtcIj5cbiAgICAgICAgPHN0cm9uZyBzdHlsZT1cImNvbG9yOiMxZTQwYWY7XCI+XHVEODNEXHVEQ0NCIFN1Z2dlc3RlZCBDb250ZW50IE9yZGVyOjwvc3Ryb25nPlxuICAgICAgICA8cCBzdHlsZT1cIm1hcmdpbjo2cHggMCAwO2NvbG9yOiMxZTNhOGE7Zm9udC1zaXplOjAuOWVtO3doaXRlLXNwYWNlOnByZS1saW5lO1wiPiR7ZXNjYXBlSHRtbChyZW9yZGVyaW5nVGV4dCl9PC9wPlxuICAgICAgIDwvZGl2PmBcbiAgICA6ICcnO1xuXG4gIC8vIFx1MjUwMFx1MjUwMCBSZW5kZXIgc2tlbGV0b24gd2hpbGUgd2UgZ2VuZXJhdGUgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIGNvbnRhaW5lci5pbm5lckhUTUwgPSBgXG4gICAgJHtyZW9yZGVyaW5nSFRNTH1cbiAgICA8ZGl2IGlkPVwiYWktc3VtbWFyeS1wYW5lbFwiIHN0eWxlPVwiYm9yZGVyOjFweCBzb2xpZCAjZDFmYWU1O2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MTZweDttYXJnaW4tYm90dG9tOjIwcHg7YmFja2dyb3VuZDojZjBmZGY0O1wiPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDttYXJnaW4tYm90dG9tOjEwcHg7XCI+XG4gICAgICAgIDxzdHJvbmcgc3R5bGU9XCJjb2xvcjojMDY1ZjQ2O1wiPlx1RDgzRVx1REQxNiBBSS1Qcm9wb3NlZCBTdW1tYXJ5PC9zdHJvbmc+XG4gICAgICAgIDxzcGFuIGlkPVwiYWktc3VtbWFyeS1zdGF0dXNcIiBzdHlsZT1cImZvbnQtc2l6ZTowLjhlbTtjb2xvcjojNmI3MjgwO1wiPkdlbmVyYXRpbmdcdTIwMjY8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgaWQ9XCJhaS1zdW1tYXJ5LWxvYWRpbmdcIiBzdHlsZT1cImZvbnQtc2l6ZTowLjllbTtjb2xvcjojOWNhM2FmO21pbi1oZWlnaHQ6NDBweDtcIj48ZW0+R2VuZXJhdGluZyBhIHRhaWxvcmVkIHN1bW1hcnkgZm9yIHRoaXMgYXBwbGljYXRpb25cdTIwMjY8L2VtPjwvZGl2PlxuICAgICAgPHRleHRhcmVhIGlkPVwiYWktc3VtbWFyeS10ZXh0XCIgcm93cz1cIjdcIiBvbmlucHV0PVwib25TdW1tYXJ5VGV4dENoYW5nZSgpXCJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCJHZW5lcmF0aW5nXHUyMDI2XCJcbiAgICAgICAgc3R5bGU9XCJ3aWR0aDoxMDAlO2JveC1zaXppbmc6Ym9yZGVyLWJveDtwYWRkaW5nOjhweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo0cHg7Zm9udC1zaXplOjAuOWVtO2xpbmUtaGVpZ2h0OjEuNjtyZXNpemU6dmVydGljYWw7ZGlzcGxheTpub25lO1wiPjwvdGV4dGFyZWE+XG4gICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDoxMnB4O1wiPlxuICAgICAgICA8bGFiZWwgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjojMzc0MTUxO2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWJvdHRvbTo0cHg7XCI+UmVxdWVzdCBjaGFuZ2VzIChvcHRpb25hbCk6PC9sYWJlbD5cbiAgICAgICAgPHRleHRhcmVhIGlkPVwic3VtbWFyeS1yZWZpbmVtZW50LWlucHV0XCIgcm93cz1cIjJcIlxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiAnTWFrZSBpdCBtb3JlIGNvbmNpc2UnLCAnRW1waGFzaXNlIG15IGxlYWRlcnNoaXAgZXhwZXJpZW5jZScsICdVc2UgYSBtb3JlIGZvcm1hbCB0b25lJ1x1MjAyNlwiXG4gICAgICAgICAgc3R5bGU9XCJ3aWR0aDoxMDAlO2JveC1zaXppbmc6Ym9yZGVyLWJveDtwYWRkaW5nOjhweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo0cHg7Zm9udC1zaXplOjAuODVlbTtyZXNpemU6dmVydGljYWw7XCI+PC90ZXh0YXJlYT5cbiAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6OHB4O2Rpc3BsYXk6ZmxleDtnYXA6OHB4O2ZsZXgtd3JhcDp3cmFwO1wiPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJhaS1yZWdlbmVyYXRlLWJ0blwiIGNsYXNzPVwic3VibWl0LWJ0blwiIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtwYWRkaW5nOjZweCAxNHB4O1wiXG4gICAgICAgICAgICBvbmNsaWNrPVwicmVnZW5lcmF0ZUFJU3VtbWFyeSgpXCI+UmVnZW5lcmF0ZTwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzdWJtaXQtYnRuXCIgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO3BhZGRpbmc6NnB4IDE0cHg7YmFja2dyb3VuZDojMTBiOTgxO1wiXG4gICAgICAgICAgICBvbmNsaWNrPVwidXNlQUlTdW1tYXJ5KClcIj5Vc2UgVGhpcyBTdW1tYXJ5PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBpZD1cInN1bW1hcnktc3RvcmVkLXNlY3Rpb25cIj5cbiAgICAgIDxkZXRhaWxzIHN0eWxlPVwibWFyZ2luLWJvdHRvbTo4cHg7XCI+XG4gICAgICAgIDxzdW1tYXJ5IHN0eWxlPVwiY3Vyc29yOnBvaW50ZXI7Zm9udC1zaXplOjAuODVlbTtjb2xvcjojNmI3MjgwO3VzZXItc2VsZWN0Om5vbmU7XCI+XG4gICAgICAgICAgVXNlIGEgc3RvcmVkIHN1bW1hcnkgdmFyaWFudCBpbnN0ZWFkXG4gICAgICAgIDwvc3VtbWFyeT5cbiAgICAgICAgPGRpdiBpZD1cInN1bW1hcnktcmFkaW9zXCIgc3R5bGU9XCJtYXJnaW4tdG9wOjEwcHg7XCI+PC9kaXY+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOjhweDtcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic3VibWl0LWJ0blwiIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtwYWRkaW5nOjZweCAxNHB4O1wiXG4gICAgICAgICAgICBvbmNsaWNrPVwic3VibWl0U3VtbWFyeUZvY3VzRGVjaXNpb24oKVwiPlVzZSBTZWxlY3RlZCBTdG9yZWQgU3VtbWFyeTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGV0YWlscz5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibmF2LWJ1dHRvbnNcIiBzdHlsZT1cIm1hcmdpbi10b3A6MTZweDtcIj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJiYWNrLWJ0blwiIG9uY2xpY2s9XCJzd2l0Y2hUYWIoJ3RhZ2xpbmUtcmV2aWV3JylcIj5cdTIxOTAgQmFjayB0byBUYWdsaW5lPC9idXR0b24+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiY29udGludWUtYnRuXCIgb25jbGljaz1cInN1Ym1pdFN1bW1hcnlGb2N1c0RlY2lzaW9uKClcIj5Db250aW51ZSB0byBQdWJsaWNhdGlvbnMgXHUyMTkyPC9idXR0b24+XG4gICAgPC9kaXY+YDtcblxuICAvLyBSZW5kZXIgc3RvcmVkIHN1bW1hcmllcyBpbiB0aGUgY29sbGFwc2libGUgc2VjdGlvblxuICBfcmVuZGVyU3RvcmVkU3VtbWFyeVJhZGlvcyhwcm9mZXNzaW9uYWxTdW1tYXJpZXMpO1xuXG4gIC8vIFx1MjUwMFx1MjUwMCBBdXRvLWdlbmVyYXRlIG9yIGxvYWQgY2FjaGVkIEFJIHN1bW1hcnkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIGNvbnN0IGNhY2hlZFN1bW1hcnkgPSBwcm9mZXNzaW9uYWxTdW1tYXJpZXNbJ2FpX2dlbmVyYXRlZCddIHx8ICcnO1xuICBpZiAoY2FjaGVkU3VtbWFyeSkge1xuICAgIF9zaG93QUlTdW1tYXJ5KGNhY2hlZFN1bW1hcnksICcoY2FjaGVkIFx1MjAxNCBjbGljayBSZWdlbmVyYXRlIHRvIHJlZnJlc2gpJyk7XG4gICAgd2luZG93LnNlbGVjdGVkU3VtbWFyeUtleSA9ICdhaV9nZW5lcmF0ZWQnO1xuICAgIGF3YWl0IHNhdmVTdW1tYXJ5Rm9jdXNUb0JhY2tlbmQoJ2FpX2dlbmVyYXRlZCcpO1xuICB9IGVsc2Uge1xuICAgIGF3YWl0IF9jYWxsR2VuZXJhdGVTdW1tYXJ5KG51bGwsIG51bGwpO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBSZW5kZXIgc3RvcmVkIHN1bW1hcnkgcmFkaW8gYnV0dG9ucyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gX3JlbmRlclN0b3JlZFN1bW1hcnlSYWRpb3MocHJvZmVzc2lvbmFsU3VtbWFyaWVzKSB7XG4gIGNvbnN0IHJhZGlvc0NvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdW1tYXJ5LXJhZGlvcycpO1xuICBpZiAoIXJhZGlvc0NvbnRhaW5lcikgcmV0dXJuO1xuICBjb25zdCBtYXN0ZXJLZXlzID0gT2JqZWN0LmtleXMocHJvZmVzc2lvbmFsU3VtbWFyaWVzKS5maWx0ZXIoayA9PiBrICE9PSAnYWlfZ2VuZXJhdGVkJyk7XG4gIGlmIChtYXN0ZXJLZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJhZGlvc0NvbnRhaW5lci5pbm5lckhUTUwgPSAnPHAgc3R5bGU9XCJjb2xvcjojOWNhM2FmO2ZvbnQtc2l6ZTowLjg1ZW07XCI+Tm8gc3RvcmVkIHN1bW1hcmllcyBhdmFpbGFibGUuPC9wPic7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGN1cnJlbnRLZXkgPSB3aW5kb3cuc2VsZWN0ZWRTdW1tYXJ5S2V5IHx8ICcnO1xuICByYWRpb3NDb250YWluZXIuaW5uZXJIVE1MID0gbWFzdGVyS2V5cy5tYXAoa2V5ID0+IHtcbiAgICBjb25zdCBwcmV2aWV3ID0gKHByb2Zlc3Npb25hbFN1bW1hcmllc1trZXldIHx8ICcnKS5zbGljZSgwLCAyMDApO1xuICAgIGNvbnN0IGxhYmVsID0ga2V5LnJlcGxhY2UoL18vZywgJyAnKS5yZXBsYWNlKC9cXGJcXHcvZywgYyA9PiBjLnRvVXBwZXJDYXNlKCkpO1xuICAgIGNvbnN0IGNoZWNrZWQgPSBrZXkgPT09IGN1cnJlbnRLZXkgPyAnY2hlY2tlZCcgOiAnJztcbiAgICByZXR1cm4gYFxuICAgICAgPGxhYmVsIHN0eWxlPVwiZGlzcGxheTpibG9jaztib3JkZXI6MXB4IHNvbGlkICNlNWU3ZWI7Ym9yZGVyLXJhZGl1czo2cHg7cGFkZGluZzoxMnB4O21hcmdpbi1ib3R0b206OHB4O2N1cnNvcjpwb2ludGVyOyR7Y2hlY2tlZCA/ICdib3JkZXItY29sb3I6IzEwYjk4MTtiYWNrZ3JvdW5kOiNmMGZkZjQ7JyA6ICcnfVwiPlxuICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cInN1bW1hcnlfa2V5XCIgdmFsdWU9XCIke2VzY2FwZUh0bWwoa2V5KX1cIiAke2NoZWNrZWR9XG4gICAgICAgICAgb25jaGFuZ2U9XCJzZWxlY3RTdW1tYXJ5S2V5KCcke2VzY2FwZUh0bWwoa2V5KX0nKVwiIHN0eWxlPVwibWFyZ2luLXJpZ2h0OjhweDtcIj5cbiAgICAgICAgPHN0cm9uZz4ke2VzY2FwZUh0bWwobGFiZWwpfTwvc3Ryb25nPiA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjc1ZW07cGFkZGluZzoxcHggNnB4O2JvcmRlci1yYWRpdXM6OTk5cHg7YmFja2dyb3VuZDojZWZmNmZmO2NvbG9yOiMxZDRlZDg7Ym9yZGVyOjFweCBzb2xpZCAjYmZkYmZlO2ZvbnQtd2VpZ2h0OjYwMDtcIj5cdUQ4M0RcdURDQzQgRnJvbSB5b3VyIE1hc3RlciBDVjwvc3Bhbj5cbiAgICAgICAgPHAgc3R5bGU9XCJtYXJnaW46NnB4IDAgMDtmb250LXNpemU6MC44NWVtO2NvbG9yOiM2YjcyODA7XCI+JHtlc2NhcGVIdG1sKHByZXZpZXcpfSR7cHJldmlldy5sZW5ndGggPT09IDIwMCA/ICdcdTIwMjYnIDogJyd9PC9wPlxuICAgICAgPC9sYWJlbD5gO1xuICB9KS5qb2luKCcnKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFNob3cgQUktZ2VuZXJhdGVkIHN1bW1hcnkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIF9zaG93QUlTdW1tYXJ5KHRleHQsIHN0YXR1c0xhYmVsKSB7XG4gIGNvbnN0IHRleHRFbCAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhaS1zdW1tYXJ5LXRleHQnKTtcbiAgY29uc3QgbG9hZGluZ0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FpLXN1bW1hcnktbG9hZGluZycpO1xuICBjb25zdCBzdGF0dXNFbCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWktc3VtbWFyeS1zdGF0dXMnKTtcbiAgaWYgKHRleHRFbCkge1xuICAgIHRleHRFbC52YWx1ZSA9IHRleHQ7XG4gICAgdGV4dEVsLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgfVxuICBpZiAobG9hZGluZ0VsKSBsb2FkaW5nRWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgaWYgKHN0YXR1c0VsKSAgc3RhdHVzRWwudGV4dENvbnRlbnQgPSBzdGF0dXNMYWJlbCB8fCAnJztcbiAgd2luZG93Ll9haUdlbmVyYXRlZFN1bW1hcnkgPSB0ZXh0O1xuICBfdXBkYXRlU3VtbWFyeVNwZWNpZmljaXR5QmFkZ2UodGV4dCk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBTdW1tYXJ5IHNwZWNpZmljaXR5IHZhbGlkYXRvciBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gX2NoZWNrU3VtbWFyeVNwZWNpZmljaXR5KHRleHQpIHtcbiAgaWYgKCF0ZXh0IHx8ICF0ZXh0LnRyaW0oKSkgcmV0dXJuIFtdO1xuICBjb25zdCB3YXJuaW5ncyA9IFtdO1xuICAvLyBDaGVjayAxOiBxdWFudGlmaWVkIGNsYWltIChudW1iZXIsIHBlcmNlbnRhZ2UsIG9yIHllYXIgcmFuZ2UpXG4gIGNvbnN0IGhhc1F1YW50aWZpZWQgPSAvXFxiXFxkW1xcZCxdKlxccyooJXxwZXJjZW50fHlycz98eWVhcnM/fG1vbnRocz98eFxcYnxcXCt8a1xcYnxtXFxifFxcLlxcZCkvaS50ZXN0KHRleHQpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAvXFxiXFxkK1xcK1xccyooeWVhcnM/fHlycz98bW9udGhzPykvaS50ZXN0KHRleHQpO1xuICBpZiAoIWhhc1F1YW50aWZpZWQpIHtcbiAgICB3YXJuaW5ncy5wdXNoKCdObyBxdWFudGlmaWVkIGNsYWltIGRldGVjdGVkIChlLmcuIFwiNSsgeWVhcnNcIiwgXCIzMCUgcmVkdWN0aW9uXCIsIFwiJDJNXCIpLiBBZGRpbmcgYSBudW1iZXIgc3RyZW5ndGhlbnMgY3JlZGliaWxpdHkuJyk7XG4gIH1cbiAgLy8gQ2hlY2sgMjogdGFyZ2V0IHJvbGUga2V5d29yZCBwcmVzZW50XG4gIGNvbnN0IGFuYWx5c2lzID0gd2luZG93Ll9sYXN0QW5hbHlzaXNEYXRhIHx8XG4gICAgKHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zICYmIHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zLmpvYl9hbmFseXNpcykgfHwge307XG4gIGNvbnN0IHJvbGVUaXRsZSA9IChhbmFseXNpcy50aXRsZSB8fCBhbmFseXNpcy5qb2JfdGl0bGUgfHwgJycpLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICBpZiAocm9sZVRpdGxlICYmIHJvbGVUaXRsZS5sZW5ndGggPiAzKSB7XG4gICAgY29uc3Qgcm9sZVBhcnRzID0gcm9sZVRpdGxlLnNwbGl0KC9bXFxzLyxdKy8pLmZpbHRlcih3ID0+IHcubGVuZ3RoID4gMyk7XG4gICAgY29uc3QgaW5UZXh0ID0gcm9sZVBhcnRzLnNvbWUocGFydCA9PiB0ZXh0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocGFydCkpO1xuICAgIGlmICghaW5UZXh0KSB7XG4gICAgICB3YXJuaW5ncy5wdXNoKGBUYXJnZXQgcm9sZSAoXCIke2VzY2FwZUh0bWwocm9sZVRpdGxlKX1cIikgbm90IG1lbnRpb25lZCBcdTIwMTQgY29uc2lkZXIgZWNob2luZyB0aGUgcm9sZSBvciBhIHN5bm9ueW0uYCk7XG4gICAgfVxuICB9XG4gIC8vIENoZWNrIDM6IGZhbGxiYWNrIGdlbmVyaWMgcGxhY2Vob2xkZXJcbiAgY29uc3QgZ2VuZXJpY1BocmFzZXMgPSBbJ2V4cGVyaWVuY2VkIHByb2Zlc3Npb25hbCcsICd0cmFjayByZWNvcmQgb2Ygc3VjY2VzcycsICdzZWVraW5nIGEgY2hhbGxlbmdpbmcnXTtcbiAgZm9yIChjb25zdCBwaHJhc2Ugb2YgZ2VuZXJpY1BocmFzZXMpIHtcbiAgICBpZiAodGV4dC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHBocmFzZSkpIHtcbiAgICAgIHdhcm5pbmdzLnB1c2goYEdlbmVyaWMgcGxhY2Vob2xkZXIgcGhyYXNlIGRldGVjdGVkIChcIiR7cGhyYXNlfVwiKSBcdTIwMTQgcmVwbGFjZSB3aXRoIHNwZWNpZmljIGFjaGlldmVtZW50cy5gKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHdhcm5pbmdzO1xufVxuXG5mdW5jdGlvbiBfdXBkYXRlU3VtbWFyeVNwZWNpZmljaXR5QmFkZ2UodGV4dCkge1xuICBsZXQgYmFkZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3VtbWFyeS1zcGVjaWZpY2l0eS1iYWRnZScpO1xuICBpZiAoIWJhZGdlKSB7XG4gICAgY29uc3QgdGV4dEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FpLXN1bW1hcnktdGV4dCcpO1xuICAgIGlmICghdGV4dEVsIHx8ICF0ZXh0RWwucGFyZW50Tm9kZSkgcmV0dXJuO1xuICAgIGJhZGdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgYmFkZ2UuaWQgPSAnc3VtbWFyeS1zcGVjaWZpY2l0eS1iYWRnZSc7XG4gICAgYmFkZ2Uuc3R5bGUuY3NzVGV4dCA9ICdtYXJnaW4tdG9wOjZweDtmb250LXNpemU6MC44MmVtOyc7XG4gICAgdGV4dEVsLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGJhZGdlLCB0ZXh0RWwubmV4dFNpYmxpbmcpO1xuICB9XG4gIGNvbnN0IHdhcm5pbmdzID0gX2NoZWNrU3VtbWFyeVNwZWNpZmljaXR5KHRleHQpO1xuICBpZiAod2FybmluZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgYmFkZ2UuaW5uZXJIVE1MID0gJzxzcGFuIHN0eWxlPVwiY29sb3I6IzEwYjk4MTtcIj5cdTI3MTMgU3VtbWFyeSBoYXMgc3BlY2lmaWMsIHF1YW50aWZpZWQgY29udGVudC48L3NwYW4+JztcbiAgfSBlbHNlIHtcbiAgICBiYWRnZS5pbm5lckhUTUwgPSB3YXJuaW5ncy5tYXAodyA9PlxuICAgICAgYDxkaXYgc3R5bGU9XCJjb2xvcjojYjQ1MzA5O21hcmdpbi10b3A6MnB4O1wiPlx1MjZBMCAke3d9PC9kaXY+YFxuICAgICkuam9pbignJyk7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIENhbGwgZ2VuZXJhdGUtc3VtbWFyeSBBUEkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8qKlxuICogZHVja2Zsb3c6XG4gKiAgIGlkOiBzdW1tYXJ5X3VpX2dlbmVyYXRlXG4gKiAgIGtpbmQ6IHVpXG4gKiAgIHRpbWVzdGFtcDogXCIyMDI2LTAzLTI3VDAxOjIzOjI4WlwiXG4gKiAgIHN0YXR1czogc2hhcmVkXG4gKiAgIGhhbmRsZXM6IFtcInVpOnN1bW1hcnktcmV2aWV3LmdlbmVyYXRlXCJdXG4gKiAgIGNhbGxzOiBbXCJQT1NUIC9hcGkvZ2VuZXJhdGUtc3VtbWFyeVwiLCBcInVpOnN1bW1hcnktcmV2aWV3LnBlcnNpc3RcIl1cbiAqICAgcmVhZHM6IFtcInJlc3BvbnNlOlBPU1QgL2FwaS9nZW5lcmF0ZS1zdW1tYXJ5LnN1bW1hcnlcIiwgXCJ3aW5kb3c6X2FpR2VuZXJhdGVkU3VtbWFyeVwiXVxuICogICB3cml0ZXM6IFtcImRvbTojYWktc3VtbWFyeS10ZXh0XCIsIFwiZG9tOiNhaS1zdW1tYXJ5LXN0YXR1c1wiLCBcIndpbmRvdzpfYWlHZW5lcmF0ZWRTdW1tYXJ5XCIsIFwid2luZG93OnNlbGVjdGVkU3VtbWFyeUtleVwiXVxuICogICBub3RlczogXCJSZXF1ZXN0cyBhIGdlbmVyYXRlZCBvciByZWZpbmVkIHN1bW1hcnksIHVwZGF0ZXMgdGhlIGxvY2FsIFVJLCBhbmQgcGVyc2lzdHMgdGhlIHNlbGVjdGVkIHN1bW1hcnkga2V5LlwiXG4gKi9cblxuYXN5bmMgZnVuY3Rpb24gX2NhbGxHZW5lcmF0ZVN1bW1hcnkocmVmaW5lbWVudFByb21wdCwgcHJldmlvdXNTdW1tYXJ5KSB7XG4gIGNvbnN0IGJ0biAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FpLXJlZ2VuZXJhdGUtYnRuJyk7XG4gIGNvbnN0IHN0YXR1c0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FpLXN1bW1hcnktc3RhdHVzJyk7XG4gIGNvbnN0IHRleHRFbCAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FpLXN1bW1hcnktdGV4dCcpO1xuICBjb25zdCBsb2FkaW5nRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWktc3VtbWFyeS1sb2FkaW5nJyk7XG4gIGlmIChidG4pICAgICAgYnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgaWYgKHN0YXR1c0VsKSBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICdHZW5lcmF0aW5nXHUyMDI2JztcbiAgLy8gU2hvdyBsb2FkaW5nIGluZGljYXRvcjsgaGlkZSB0aGUgdGV4dGFyZWEgd2hpbGUgZ2VuZXJhdGluZy5cbiAgaWYgKGxvYWRpbmdFbCkgeyBsb2FkaW5nRWwuaW5uZXJIVE1MID0gJzxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDoxMHB4O2NvbG9yOiM2YjcyODA7cGFkZGluZzo4cHggMDtcIj48ZGl2IGNsYXNzPVwibG9hZGluZy1zcGlubmVyXCIgc3R5bGU9XCJ3aWR0aDoyMHB4O2hlaWdodDoyMHB4O2JvcmRlci13aWR0aDoycHg7XCI+PC9kaXY+PGVtPkdlbmVyYXRpbmcgYSB0YWlsb3JlZCBzdW1tYXJ5XHUyMDI2PC9lbT48L2Rpdj4nOyBsb2FkaW5nRWwuc3R5bGUuZGlzcGxheSA9ICcnOyB9XG4gIGlmICh0ZXh0RWwpICAgdGV4dEVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgLy8gVXNlIHRoZSBnbG9iYWwgTExNIHN0YXR1cyBiYXIgZm9yIHZpc2liaWxpdHlcbiAgc2V0TG9hZGluZyh0cnVlLCAnR2VuZXJhdGluZyBzdW1tYXJ5XHUyMDI2Jyk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBib2R5ID0ge307XG4gICAgaWYgKHJlZmluZW1lbnRQcm9tcHQpIGJvZHkucmVmaW5lbWVudF9wcm9tcHQgPSByZWZpbmVtZW50UHJvbXB0O1xuICAgIGlmIChwcmV2aW91c1N1bW1hcnkpICBib2R5LnByZXZpb3VzX3N1bW1hcnkgID0gcHJldmlvdXNTdW1tYXJ5O1xuXG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL2dlbmVyYXRlLXN1bW1hcnknLCB7XG4gICAgICBtZXRob2Q6ICAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6ICAgIEpTT04uc3RyaW5naWZ5KGJvZHkpLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuXG4gICAgaWYgKGRhdGEub2spIHtcbiAgICAgIF9zaG93QUlTdW1tYXJ5KGRhdGEuc3VtbWFyeSwgJ1x1MjcxMyBnZW5lcmF0ZWQnKTtcbiAgICAgIHdpbmRvdy5zZWxlY3RlZFN1bW1hcnlLZXkgPSAnYWlfZ2VuZXJhdGVkJztcbiAgICAgIGF3YWl0IHNhdmVTdW1tYXJ5Rm9jdXNUb0JhY2tlbmQoJ2FpX2dlbmVyYXRlZCcpO1xuICAgICAgc2NoZWR1bGVBdHNSZWZyZXNoKCdyZXZpZXdfY2hlY2twb2ludCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJ1x1MjZBMCBlcnJvcic7XG4gICAgICBpZiAodGV4dEVsKSAgIHRleHRFbC5pbm5lckhUTUwgPSBgPHNwYW4gc3R5bGU9XCJjb2xvcjojZWY0NDQ0O1wiPiR7ZXNjYXBlSHRtbChkYXRhLmVycm9yIHx8ICdHZW5lcmF0aW9uIGZhaWxlZC4nKX08L3NwYW4+YDtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnXHUyNkEwIG5ldHdvcmsgZXJyb3InO1xuICAgIGlmICh0ZXh0RWwpICAgdGV4dEVsLmlubmVySFRNTCA9ICc8c3BhbiBzdHlsZT1cImNvbG9yOiNlZjQ0NDQ7XCI+TmV0d29yayBlcnJvciBcdTIwMTQgcGxlYXNlIHRyeSBhZ2Fpbi48L3NwYW4+JztcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoYnRuKSBidG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgUmVnZW5lcmF0ZSAvIHVzZSBBSSBzdW1tYXJ5IFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiByZWdlbmVyYXRlQUlTdW1tYXJ5KCkge1xuICBjb25zdCBpbnB1dCAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1bW1hcnktcmVmaW5lbWVudC1pbnB1dCcpO1xuICBjb25zdCBwcm9tcHQgID0gaW5wdXQgPyBpbnB1dC52YWx1ZS50cmltKCkgOiAnJztcbiAgY29uc3QgY3VycmVudCA9IHdpbmRvdy5fYWlHZW5lcmF0ZWRTdW1tYXJ5IHx8ICcnO1xuICBhd2FpdCBfY2FsbEdlbmVyYXRlU3VtbWFyeShwcm9tcHQgfHwgbnVsbCwgY3VycmVudCB8fCBudWxsKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdXNlQUlTdW1tYXJ5KCkge1xuICB3aW5kb3cuc2VsZWN0ZWRTdW1tYXJ5S2V5ID0gJ2FpX2dlbmVyYXRlZCc7XG4gIGNvbnN0IHRleHRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhaS1zdW1tYXJ5LXRleHQnKTtcbiAgY29uc3QgY3VycmVudFRleHQgPSB0ZXh0RWwgPyB0ZXh0RWwudmFsdWUudHJpbSgpIDogKHdpbmRvdy5fYWlHZW5lcmF0ZWRTdW1tYXJ5IHx8ICcnKTtcbiAgYXdhaXQgc2F2ZVN1bW1hcnlGb2N1c1RvQmFja2VuZCgnYWlfZ2VuZXJhdGVkJywgY3VycmVudFRleHQpO1xuICBzY2hlZHVsZUF0c1JlZnJlc2goJ3Jldmlld19jaGVja3BvaW50Jyk7XG4gIHNob3dUb2FzdCgnQUktZ2VuZXJhdGVkIHN1bW1hcnkgc2VsZWN0ZWQgZm9yIHlvdXIgQ1YnKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFNlbGVjdCBzdG9yZWQgc3VtbWFyeSBrZXkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIHNlbGVjdFN1bW1hcnlLZXkoa2V5KSB7XG4gIHdpbmRvdy5zZWxlY3RlZFN1bW1hcnlLZXkgPSBrZXk7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNzdW1tYXJ5LXJhZGlvcyBsYWJlbCcpLmZvckVhY2gobGFiZWwgPT4ge1xuICAgIGNvbnN0IHJhZGlvID0gbGFiZWwucXVlcnlTZWxlY3RvcignaW5wdXRbdHlwZT1yYWRpb10nKTtcbiAgICBjb25zdCBpc1NlbGVjdGVkID0gcmFkaW8gJiYgcmFkaW8udmFsdWUgPT09IGtleTtcbiAgICBsYWJlbC5zdHlsZS5ib3JkZXJDb2xvciA9IGlzU2VsZWN0ZWQgPyAnIzEwYjk4MScgOiAnI2U1ZTdlYic7XG4gICAgbGFiZWwuc3R5bGUuYmFja2dyb3VuZCAgPSBpc1NlbGVjdGVkID8gJyNmMGZkZjQnIDogJyc7XG4gIH0pO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgU2F2ZSAvIHN1Ym1pdCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLyoqXG4gKiBkdWNrZmxvdzpcbiAqICAgaWQ6IHN1bW1hcnlfdWlfcGVyc2lzdFxuICogICBraW5kOiB1aVxuICogICB0aW1lc3RhbXA6IFwiMjAyNi0wMy0yN1QwMToyMzoyOFpcIlxuICogICBzdGF0dXM6IHNoYXJlZFxuICogICBoYW5kbGVzOiBbXCJ1aTpzdW1tYXJ5LXJldmlldy5wZXJzaXN0XCJdXG4gKiAgIGNhbGxzOiBbXCJQT1NUIC9hcGkvcmV2aWV3LWRlY2lzaW9uc1wiXVxuICogICByZWFkczogW1wid2luZG93OnNlbGVjdGVkU3VtbWFyeUtleVwiXVxuICogICB3cml0ZXM6IFtcInJlcXVlc3Q6UE9TVCAvYXBpL3Jldmlldy1kZWNpc2lvbnMuc3VtbWFyeV9mb2N1c1wiXVxuICogICBub3RlczogXCJQZXJzaXN0cyBvbmx5IHRoZSBzZWxlY3RlZCBzdW1tYXJ5IGtleSBzbyBiYWNrZW5kIHN0YXRlIGNhbiByZXNvbHZlIHRoZSBhY3RpdmUgc3VtbWFyeSB2YXJpYW50IGxhdGVyLlwiXG4gKi9cblxuLy8gRGVib3VuY2UgdGltZXIgZm9yIGF1dG8tcGVyc2lzdGluZyBlZGl0cyB0byB0aGUgc3VtbWFyeSB0ZXh0LlxubGV0IF9zdW1tYXJ5UGVyc2lzdFRpbWVyID0gbnVsbDtcblxuZnVuY3Rpb24gb25TdW1tYXJ5VGV4dENoYW5nZSgpIHtcbiAgY29uc3QgdGV4dEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FpLXN1bW1hcnktdGV4dCcpO1xuICBpZiAoIXRleHRFbCkgcmV0dXJuO1xuICB3aW5kb3cuX2FpR2VuZXJhdGVkU3VtbWFyeSA9IHRleHRFbC52YWx1ZTtcbiAgX3VwZGF0ZVN1bW1hcnlTcGVjaWZpY2l0eUJhZGdlKHRleHRFbC52YWx1ZSk7XG4gIGNsZWFyVGltZW91dChfc3VtbWFyeVBlcnNpc3RUaW1lcik7XG4gIF9zdW1tYXJ5UGVyc2lzdFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgc2F2ZVN1bW1hcnlGb2N1c1RvQmFja2VuZCgnYWlfZ2VuZXJhdGVkJywgdGV4dEVsLnZhbHVlLnRyaW0oKSk7XG4gIH0sIDUwMCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNhdmVTdW1tYXJ5Rm9jdXNUb0JhY2tlbmQoa2V5LCB0ZXh0KSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGF5bG9hZCA9IHsgdHlwZTogJ3N1bW1hcnlfZm9jdXMnLCBkZWNpc2lvbnM6IGtleSB9O1xuICAgIGlmICh0ZXh0ICE9PSB1bmRlZmluZWQgJiYgdGV4dCAhPT0gbnVsbCkgcGF5bG9hZC5zdW1tYXJ5X3RleHQgPSB0ZXh0O1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvcmV2aWV3LWRlY2lzaW9ucycsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShwYXlsb2FkKVxuICAgIH0pO1xuICAgIHJldHVybiByZXNwb25zZS5vaztcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBzdWJtaXRTdW1tYXJ5Rm9jdXNEZWNpc2lvbigpIHtcbiAgY29uc3Qga2V5ID0gd2luZG93LnNlbGVjdGVkU3VtbWFyeUtleTtcbiAgaWYgKCFrZXkpIHJldHVybjtcbiAgY29uc3Qgc2F2ZWQgPSBhd2FpdCBzYXZlU3VtbWFyeUZvY3VzVG9CYWNrZW5kKGtleSk7XG4gIGlmICghc2F2ZWQpIHtcbiAgICBzaG93VG9hc3QoJ0ZhaWxlZCB0byBzYXZlIHN1bW1hcnkgc2VsZWN0aW9uLicsICdlcnJvcicpO1xuICAgIHJldHVybjtcbiAgfVxuICBzdGF0ZU1hbmFnZXIubWFya0NvbnRlbnRDaGFuZ2VkKCk7XG4gIHNjaGVkdWxlQXRzUmVmcmVzaCgncmV2aWV3X2NoZWNrcG9pbnQnKTtcbiAgc2hvd1RvYXN0KGBTdW1tYXJ5IHNlbGVjdGlvbiBzYXZlZDogXCIke2tleS5yZXBsYWNlKC9fL2csICcgJyl9XCJgKTtcbiAgc3dpdGNoVGFiKCdwdWJsaWNhdGlvbnMtcmV2aWV3Jyk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFeHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5leHBvcnQge1xuICBidWlsZFN1bW1hcnlGb2N1c1NlY3Rpb24sXG4gIF9yZW5kZXJTdG9yZWRTdW1tYXJ5UmFkaW9zLFxuICBfc2hvd0FJU3VtbWFyeSxcbiAgX2NhbGxHZW5lcmF0ZVN1bW1hcnksXG4gIHJlZ2VuZXJhdGVBSVN1bW1hcnksXG4gIHVzZUFJU3VtbWFyeSxcbiAgb25TdW1tYXJ5VGV4dENoYW5nZSxcbiAgc2VsZWN0U3VtbWFyeUtleSxcbiAgc2F2ZVN1bW1hcnlGb2N1c1RvQmFja2VuZCxcbiAgX2NoZWNrU3VtbWFyeVNwZWNpZmljaXR5LFxuICBfdXBkYXRlU3VtbWFyeVNwZWNpZmljaXR5QmFkZ2UsXG4gIHN1Ym1pdFN1bW1hcnlGb2N1c0RlY2lzaW9uLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL3B1YmxpY2F0aW9ucy1yZXZpZXcuanNcbiAqIFB1YmxpY2F0aW9ucyByZXZpZXcgdGFibGU6IGZldGNoLCByZW5kZXIsIHRvZ2dsZSBhY2NlcHQvcmVqZWN0LCBzdWJtaXQgZGVjaXNpb25zLlxuICpcbiAqIERlcGVuZGVuY2llcyAocmVzb2x2ZWQgdGhyb3VnaCBnbG9iYWxUaGlzIGF0IHJ1bnRpbWUpOlxuICogICBwdWJsaWNhdGlvbkRlY2lzaW9ucywgX3NhdmVkRGVjaXNpb25zLFxuICogICBlc2NhcGVIdG1sLCBzaG93VG9hc3QsIGZldGNoQW5kUmV2aWV3UmV3cml0ZXMsIENTU1xuICovXG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmNvbnN0IGxvZyA9IGdldExvZ2dlcigncHVibGljYXRpb25zLXJldmlldycpO1xuXG5pbXBvcnQgeyBzdGF0ZU1hbmFnZXIgfSBmcm9tICcuL3N0YXRlLW1hbmFnZXIuanMnO1xuaW1wb3J0IHsgZXllU2xhc2hJY29uIH0gZnJvbSAnLi9yZXZpZXctaWNvbnMuanMnO1xuXG4vLyBUcmFjayBwdWJsaWNhdGlvbiBhY2NlcHQvcmVqZWN0IGRlY2lzaW9uczogY2l0ZV9rZXkgXHUyMTkyIHRydWUgKGFjY2VwdCkgfCBmYWxzZSAocmVqZWN0KVxud2luZG93LnB1YmxpY2F0aW9uRGVjaXNpb25zID0ge307XG4vLyBPcmRlcmVkIGxpc3Qgb2YgcHVibGljYXRpb24gb2JqZWN0czsgbXV0YXRlZCBieSBtb3ZlUHViUm93KClcbndpbmRvdy5fcHVibGljYXRpb25zT3JkZXJlZCA9IFtdO1xuXG4vLyBcdTI1MDBcdTI1MDAgQnVpbGQgcHVibGljYXRpb25zIHJldmlldyB0YWJsZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gYnVpbGRQdWJsaWNhdGlvbnNSZXZpZXdUYWJsZSgpIHtcbiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1YmxpY2F0aW9ucy10YWJsZS1jb250YWluZXInKTtcbiAgLy8gSW4gdGhlIG5ldyBzdWItdGFiIGxheW91dCwgd2UgdXNlIHRoZSBwYW5lIHdyYXBwZXIgaW5zdGVhZCBvZiB0aGUgb2xkIHNlY3Rpb25cbiAgY29uc3Qgc2VjdGlvbiAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1YmxpY2F0aW9ucy1yZXZpZXctc2VjdGlvbicpIHx8XG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXZpZXctcGFuZS1wdWJsaWNhdGlvbnMnKTtcbiAgY29uc3QgcHViVGFiQnRuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnJldmlldy1zdWJ0YWJbZGF0YS1wYW5lPVwicHVibGljYXRpb25zXCJdJyk7XG4gIGlmICghY29udGFpbmVyKSByZXR1cm47XG5cbiAgY29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTJweDtwYWRkaW5nOjIwcHg7Y29sb3I6IzZiNzI4MDtcIj48ZGl2IGNsYXNzPVwibG9hZGluZy1zcGlubmVyXCIgc3R5bGU9XCJ3aWR0aDoyMHB4O2hlaWdodDoyMHB4O2JvcmRlci13aWR0aDoycHg7ZmxleC1zaHJpbms6MDtcIj48L2Rpdj48c3Bhbj5Mb2FkaW5nIHB1YmxpY2F0aW9uIHJlY29tbWVuZGF0aW9uc1xcdTIwMjY8L3NwYW4+PC9kaXY+JztcblxuICBsZXQgcmVjb21tZW5kYXRpb25zID0gW107XG4gIGxldCB0b3RhbENvdW50ID0gMDtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvcHVibGljYXRpb24tcmVjb21tZW5kYXRpb25zJyk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKCFkYXRhLm9rKSB7IGNvbnRhaW5lci5pbm5lckhUTUwgPSBgPHAgY2xhc3M9XCJlcnJvci1tZXNzYWdlXCI+JHtlc2NhcGVIdG1sKGRhdGEuZXJyb3IgfHwgJ0ZhaWxlZCB0byBsb2FkIHB1YmxpY2F0aW9ucy4nKX08L3A+YDsgcmV0dXJuOyB9XG4gICAgcmVjb21tZW5kYXRpb25zID0gZGF0YS5yZWNvbW1lbmRhdGlvbnMgfHwgW107XG4gICAgdG90YWxDb3VudCA9IGRhdGEudG90YWxfY291bnQgfHwgcmVjb21tZW5kYXRpb25zLmxlbmd0aDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLmVycm9yKCdFcnJvciBmZXRjaGluZyBwdWJsaWNhdGlvbiByZWNvbW1lbmRhdGlvbnM6JywgZXJyKTtcbiAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJzxwIHN0eWxlPVwiY29sb3I6ICNlZjQ0NDQ7IHBhZGRpbmc6IDIwcHg7XCI+RmFpbGVkIHRvIGxvYWQgcHVibGljYXRpb24gcmVjb21tZW5kYXRpb25zLjwvcD4nO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChyZWNvbW1lbmRhdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgLy8gTm8gcHVibGljYXRpb25zIFx1MjAxNCBoaWRlIHRoZSBwYW5lIGFuZCBkaXNhYmxlIHRoZSB0YWIgYnV0dG9uXG4gICAgaWYgKHNlY3Rpb24pIHNlY3Rpb24uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBpZiAocHViVGFiQnRuKSBwdWJUYWJCdG4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJzxwIHN0eWxlPVwicGFkZGluZzoyMHB4O2NvbG9yOiM2YjcyODA7XCI+Tm8gcHVibGljYXRpb25zIGZvdW5kLjwvcD4nO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFNob3cgc2VjdGlvbiBhbmQgdGFiIGJ1dHRvblxuICBpZiAocHViVGFiQnRuKSBwdWJUYWJCdG4uc3R5bGUuZGlzcGxheSA9ICcnO1xuXG4gIC8vIFVwZGF0ZSBoZWFkaW5nIGNvdW50IChoYW5kbGUgYm90aCBwYW5lIGFwcHJvYWNoIGFuZCBsZWdhY3kgc2VjdGlvbiBhcHByb2FjaClcbiAgY29uc3QgaGVhZGluZyA9IHNlY3Rpb24gPyBzZWN0aW9uLnF1ZXJ5U2VsZWN0b3IoJ2gyJykgOiBudWxsO1xuICBpZiAoaGVhZGluZykge1xuICAgIGhlYWRpbmcudGV4dENvbnRlbnQgPSBgXHVEODNEXHVEQ0M0IFNlbGVjdGVkIFB1YmxpY2F0aW9uc2A7XG4gIH1cblxuICAvLyBDb3VudCByZWNvbW1lbmRlZCB2cyB0b3RhbFxuICBjb25zdCByZWNvbW1lbmRlZENvdW50ID0gcmVjb21tZW5kYXRpb25zLmZpbHRlcihwID0+IHAuaXNfcmVjb21tZW5kZWQgIT09IGZhbHNlKS5sZW5ndGg7XG4gIGNvbnN0IGNvbnRleHROb3RlID0gYDxzdHJvbmc+JHtyZWNvbW1lbmRlZENvdW50fTwvc3Ryb25nPiBvZiA8c3Ryb25nPiR7dG90YWxDb3VudH08L3N0cm9uZz4gcHVibGljYXRpb25zIHJlY29tbWVuZGVkIGZvciB0aGlzIHJvbGUuIGAgK1xuICAgIGBSZWNvbW1lbmRlZCBwdWJsaWNhdGlvbnMgKHRvcCkgYXJlIHByZS1zZWxlY3RlZCBmb3IgaW5jbHVzaW9uOyBvdGhlcnMgKGJlbG93IHRoZSBkaXZpZGVyKSBhcmUgcHJlLWV4Y2x1ZGVkLiBBZGp1c3QgdXNpbmcgdGhlIHRvZ2dsZXMuYDtcblxuICAvLyBJbml0aWFsaXNlIGRlY2lzaW9ucyBcdTIwMTQgcmVjb21tZW5kZWQ9YWNjZXB0LCBub3QtcmVjb21tZW5kZWQ9cmVqZWN0IGJ5IGRlZmF1bHRcbiAgd2luZG93LnB1YmxpY2F0aW9uRGVjaXNpb25zID0ge307XG4gIHJlY29tbWVuZGF0aW9ucy5mb3JFYWNoKHB1YiA9PiB7XG4gICAgd2luZG93LnB1YmxpY2F0aW9uRGVjaXNpb25zW3B1Yi5jaXRlX2tleV0gPSBwdWIuaXNfcmVjb21tZW5kZWQgIT09IGZhbHNlO1xuICB9KTtcbiAgLy8gQXBwbHkgYW55IHByZXZpb3VzbHkgc2F2ZWQgdXNlciBkZWNpc2lvbnMgb3ZlciB0aGUgQVBJIGRlZmF1bHRzXG4gIGNvbnN0IHNhdmVkUHViRGVjcyA9IHdpbmRvdy5fc2F2ZWREZWNpc2lvbnM/LnB1YmxpY2F0aW9uX2RlY2lzaW9ucyB8fCB7fTtcbiAgaWYgKE9iamVjdC5rZXlzKHNhdmVkUHViRGVjcykubGVuZ3RoID4gMCkgT2JqZWN0LmFzc2lnbih3aW5kb3cucHVibGljYXRpb25EZWNpc2lvbnMsIHNhdmVkUHViRGVjcyk7XG5cbiAgLy8gU2VlZCB0aGUgb3JkZXJlZCBsaXN0IGZvciByZW9yZGVyIGNvbnRyb2xzXG4gIHdpbmRvdy5fcHVibGljYXRpb25zT3JkZXJlZCA9IFsuLi5yZWNvbW1lbmRhdGlvbnNdO1xuXG4gIGxldCB0YWJsZUhUTUwgPSBgXG4gICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO2ZvbnQtc2l6ZTowLjllbTttYXJnaW4tYm90dG9tOjEycHg7XCI+JHtjb250ZXh0Tm90ZX08L3A+XG4gICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjEycHg7ZmxleC13cmFwOndyYXA7bWFyZ2luLWJvdHRvbToxMHB4O1wiPlxuICAgICAgPGxhYmVsIHN0eWxlPVwiZm9udC1zaXplOjAuOWVtO2NvbG9yOiMzNzQxNTE7XCI+RmlsdGVyIHB1YmxpY2F0aW9uczpcbiAgICAgICAgPGlucHV0IHR5cGU9XCJzZWFyY2hcIiBpZD1cInB1Yi1maWx0ZXItaW5wdXRcIiBwbGFjZWhvbGRlcj1cIlR5cGUgdG8gZmlsdGVyXHUyMDI2XCJcbiAgICAgICAgICBzdHlsZT1cIm1hcmdpbi1sZWZ0OjhweDtwYWRkaW5nOjRweCA4cHg7Ym9yZGVyOjFweCBzb2xpZCAjZDFkNWRiO2JvcmRlci1yYWRpdXM6NHB4O2ZvbnQtc2l6ZTowLjllbTtcIlxuICAgICAgICAgIG9uaW5wdXQ9XCJmaWx0ZXJQdWJsaWNhdGlvbnNUYWJsZSh0aGlzLnZhbHVlKVwiPlxuICAgICAgPC9sYWJlbD5cbiAgICAgIDxzcGFuIHN0eWxlPVwibWFyZ2luLWxlZnQ6YXV0bztkaXNwbGF5OmZsZXg7Z2FwOjhweDthbGlnbi1pdGVtczpjZW50ZXI7XCI+XG4gICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjAuODJlbTtjb2xvcjojNmI3MjgwO1wiPkJ1bGs6PC9zcGFuPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBzZWNvbmRhcnlcIiBzdHlsZT1cImZvbnQtc2l6ZTowLjhlbTtwYWRkaW5nOjRweCAxMHB4O1wiXG4gICAgICAgICAgb25jbGljaz1cImJ1bGtQdWJBY3Rpb24oJ3JlY29tbWVuZGVkJylcIiB0aXRsZT1cIkFjY2VwdCBhbGwgcmVjb21tZW5kZWQgYW5kIHJlamVjdCB0aGUgcmVzdFwiPkFjY2VwdCBSZWNvbW1lbmRlZDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBzZWNvbmRhcnlcIiBzdHlsZT1cImZvbnQtc2l6ZTowLjhlbTtwYWRkaW5nOjRweCAxMHB4O1wiXG4gICAgICAgICAgb25jbGljaz1cImJ1bGtQdWJBY3Rpb24oJ2FjY2VwdC1hbGwnKVwiIHRpdGxlPVwiQWNjZXB0IGFsbCBwdWJsaWNhdGlvbnNcIj5BY2NlcHQgQWxsPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHNlY29uZGFyeVwiIHN0eWxlPVwiZm9udC1zaXplOjAuOGVtO3BhZGRpbmc6NHB4IDEwcHg7XCJcbiAgICAgICAgICBvbmNsaWNrPVwiYnVsa1B1YkFjdGlvbigncmVqZWN0LWFsbCcpXCIgdGl0bGU9XCJSZWplY3QgYWxsIHB1YmxpY2F0aW9uc1wiPlJlamVjdCBBbGw8L2J1dHRvbj5cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8dGFibGUgaWQ9XCJwdWJsaWNhdGlvbnMtcmV2aWV3LXRhYmxlXCIgY2xhc3M9XCJyZXZpZXctdGFibGVcIj5cbiAgICAgIDx0aGVhZD5cbiAgICAgICAgPHRyPlxuICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOjQwcHg7XCI+UmFuazwvdGg+XG4gICAgICAgICAgPHRoPkNpdGF0aW9uPC90aD5cbiAgICAgICAgICA8dGg+WWVhcjwvdGg+XG4gICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6MzZweDt0ZXh0LWFsaWduOmNlbnRlcjtcIiB0aXRsZT1cIkZpcnN0IGF1dGhvclwiPjFzdFx1MjYwNTwvdGg+XG4gICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6NTBweDtcIj5TY29yZTwvdGg+XG4gICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6ODBweDtcIj5Db25maWRlbmNlPC90aD5cbiAgICAgICAgICA8dGg+UmVhc29uaW5nPC90aD5cbiAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDo4MHB4O1wiPkluY2x1ZGU/PC90aD5cbiAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDo1NnB4O3RleHQtYWxpZ246Y2VudGVyO1wiPk9yZGVyPC90aD5cbiAgICAgICAgPC90cj5cbiAgICAgIDwvdGhlYWQ+XG4gICAgICA8dGJvZHk+XG4gIGA7XG5cbiAgbGV0IGRpdmlkZXJJbnNlcnRlZCA9IGZhbHNlO1xuICByZWNvbW1lbmRhdGlvbnMuZm9yRWFjaCgocHViLCBpZHgpID0+IHtcbiAgICAvLyBJbnNlcnQgYSBzZWN0aW9uIGRpdmlkZXIgYmVmb3JlIHRoZSBmaXJzdCBub24tcmVjb21tZW5kZWQgcHVibGljYXRpb25cbiAgICBpZiAoIWRpdmlkZXJJbnNlcnRlZCAmJiBwdWIuaXNfcmVjb21tZW5kZWQgPT09IGZhbHNlKSB7XG4gICAgICBkaXZpZGVySW5zZXJ0ZWQgPSB0cnVlO1xuICAgICAgY29uc3QgZGl2aWRlclN0eWxlID0gJ2JhY2tncm91bmQ6I2YzZjRmNjtib3JkZXItdG9wOjJweCBzb2xpZCAjZDFkNWRiO3BhZGRpbmc6MDsnO1xuICAgICAgdGFibGVIVE1MICs9IGBcbiAgICAgICAgPHRyIGNsYXNzPVwicHViLWRpdmlkZXItcm93XCI+XG4gICAgICAgICAgPHRkIHN0eWxlPVwiJHtkaXZpZGVyU3R5bGV9XCI+PC90ZD5cbiAgICAgICAgICA8dGQgc3R5bGU9XCIke2RpdmlkZXJTdHlsZX1jb2xvcjojNmI3MjgwO2ZvbnQtc2l6ZTowLjgyZW07Zm9udC1zdHlsZTppdGFsaWM7cGFkZGluZzo2cHggMTJweDt0ZXh0LWFsaWduOmNlbnRlcjtcIj5cbiAgICAgICAgICAgIFx1MjAxNCBQdWJsaWNhdGlvbnMgYmVsb3cgd2VyZSBub3QgcmVjb21tZW5kZWQgZm9yIHRoaXMgcm9sZSAocHJlLWV4Y2x1ZGVkKSBcdTIwMTRcbiAgICAgICAgICA8L3RkPlxuICAgICAgICAgIDx0ZCBzdHlsZT1cIiR7ZGl2aWRlclN0eWxlfVwiPjwvdGQ+XG4gICAgICAgICAgPHRkIHN0eWxlPVwiJHtkaXZpZGVyU3R5bGV9XCI+PC90ZD5cbiAgICAgICAgICA8dGQgc3R5bGU9XCIke2RpdmlkZXJTdHlsZX1cIj48L3RkPlxuICAgICAgICAgIDx0ZCBzdHlsZT1cIiR7ZGl2aWRlclN0eWxlfVwiPjwvdGQ+XG4gICAgICAgICAgPHRkIHN0eWxlPVwiJHtkaXZpZGVyU3R5bGV9XCI+PC90ZD5cbiAgICAgICAgICA8dGQgc3R5bGU9XCIke2RpdmlkZXJTdHlsZX1cIj48L3RkPlxuICAgICAgICAgIDx0ZCBzdHlsZT1cIiR7ZGl2aWRlclN0eWxlfVwiPjwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgICBgO1xuICAgIH1cblxuICAgIGNvbnN0IHJhbmsgICAgICAgPSBpZHggKyAxO1xuICAgIGNvbnN0IGNpdGF0aW9uICAgPSBwdWIuZm9ybWF0dGVkX2NpdGF0aW9uIHx8IFtwdWIudGl0bGUsIHB1Yi52ZW51ZSwgcHViLnllYXJdLmZpbHRlcihCb29sZWFuKS5qb2luKCcuICcpO1xuICAgIGNvbnN0IHllYXIgICAgICAgPSBwdWIueWVhciB8fCAnXHUyMDE0JztcbiAgICBjb25zdCBmaXJzdEF1dGggID0gcHViLmlzX2ZpcnN0X2F1dGhvciA/ICc8c3BhbiBzdHlsZT1cImNvbG9yOiMxMGI5ODE7Zm9udC13ZWlnaHQ6NzAwO1wiIHRpdGxlPVwiRmlyc3QgYXV0aG9yXCI+XHUyNjA1PC9zcGFuPicgOiAnPHNwYW4gc3R5bGU9XCJjb2xvcjojZDFkNWRiO1wiPlx1MjYwNjwvc3Bhbj4nO1xuICAgIGNvbnN0IHNjb3JlICAgICAgPSBwdWIucmVsZXZhbmNlX3Njb3JlID8gcHViLnJlbGV2YW5jZV9zY29yZSA6ICdcdTIwMTQnO1xuICAgIGNvbnN0IGNvbmZpZGVuY2UgPSBwdWIuY29uZmlkZW5jZSB8fCAnJztcbiAgICBjb25zdCBjb25mQ29sb3IgID0gY29uZmlkZW5jZSA9PT0gJ0hpZ2gnID8gJyMxMGI5ODEnIDogY29uZmlkZW5jZSA9PT0gJ0xvdycgPyAnI2VmNDQ0NCcgOiAnI2Y1OWUwYic7XG4gICAgY29uc3QgY29uZkJhZGdlICA9IGNvbmZpZGVuY2UgPyBgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MTFweDtjb2xvcjoke2NvbmZDb2xvcn07Zm9udC13ZWlnaHQ6NjAwO1wiPiR7ZXNjYXBlSHRtbChjb25maWRlbmNlKX08L3NwYW4+YCA6ICcnO1xuICAgIGNvbnN0IHJlYXNvbmluZyAgPSBwdWIucmF0aW9uYWxlID8gYDxzbWFsbD4ke2VzY2FwZUh0bWwocHViLnJhdGlvbmFsZSl9PC9zbWFsbD5gIDogJyc7XG4gICAgY29uc3QgdmVudWVXYXJuICA9IHB1Yi52ZW51ZV93YXJuaW5nID8gYCA8c3BhbiB0aXRsZT1cIiR7ZXNjYXBlSHRtbChwdWIudmVudWVfd2FybmluZyl9XCIgc3R5bGU9XCJjb2xvcjojZGM3OTAwO2N1cnNvcjpoZWxwO1wiPlx1MjZBMDwvc3Bhbj5gIDogJyc7XG4gICAgY29uc3QgY2l0ZUtleSAgICA9IHB1Yi5jaXRlX2tleSB8fCAnJztcbiAgICBjb25zdCBpc0FjY2VwdGVkID0gd2luZG93LnB1YmxpY2F0aW9uRGVjaXNpb25zW2NpdGVLZXldICE9PSBmYWxzZTtcbiAgICBjb25zdCByb3dTdHlsZSAgID0gcHViLmlzX3JlY29tbWVuZGVkID09PSBmYWxzZSA/ICdvcGFjaXR5OjAuNzsnIDogJyc7XG5cbiAgICBjb25zdCBpc0ZpcnN0ID0gaWR4ID09PSAwO1xuICAgIGNvbnN0IGlzTGFzdCAgPSBpZHggPT09IHJlY29tbWVuZGF0aW9ucy5sZW5ndGggLSAxO1xuICAgIHRhYmxlSFRNTCArPSBgXG4gICAgICA8dHIgZGF0YS1jaXRlLWtleT1cIiR7ZXNjYXBlSHRtbChjaXRlS2V5KX1cIiBzdHlsZT1cIiR7cm93U3R5bGV9XCI+XG4gICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO2ZvbnQtd2VpZ2h0OjcwMDtcIj4ke3Jhbmt9PC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwiZm9udC1zaXplOjAuODdlbTtcIj4ke2VzY2FwZUh0bWwoY2l0YXRpb24pfSR7dmVudWVXYXJufTwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO1wiPiR7eWVhcn08L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjtcIj4ke2ZpcnN0QXV0aH08L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjtcIj4ke3Njb3JlICE9PSAnXHUyMDE0JyA/IGA8c3Ryb25nPiR7c2NvcmV9PC9zdHJvbmc+LzEwYCA6ICdcdTIwMTQnfTwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO1wiPiR7Y29uZkJhZGdlfTwvdGQ+XG4gICAgICAgIDx0ZD4ke3JlYXNvbmluZ308L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJhY3Rpb24tYnRuc1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuJHtpc0FjY2VwdGVkID8gJyBhY3RpdmUnIDogJyd9XCIgZGF0YS1hY3Rpb249XCJhY2NlcHRcIiBhcmlhLWxhYmVsPVwiSW5jbHVkZSBwdWJsaWNhdGlvbiAke2VzY2FwZUh0bWwoY2l0ZUtleSl9XCIgdGl0bGU9XCJJbmNsdWRlIGluIENWXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJjb2xvcjojMTBiOTgxO1wiIGlkPVwicHViLWFjY2VwdC0ke3Jhbmt9XCI+XHUyNzEzPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG4keyFpc0FjY2VwdGVkID8gJyBhY3RpdmUnIDogJyd9XCIgZGF0YS1hY3Rpb249XCJyZWplY3RcIiBhcmlhLWxhYmVsPVwiRXhjbHVkZSBwdWJsaWNhdGlvbiAke2VzY2FwZUh0bWwoY2l0ZUtleSl9XCIgdGl0bGU9XCJFeGNsdWRlIGZyb20gQ1ZcIlxuICAgICAgICAgICAgICBzdHlsZT1cImNvbG9yOiNlZjQ0NDQ7XCIgaWQ9XCJwdWItcmVqZWN0LSR7cmFua31cIj4ke2V5ZVNsYXNoSWNvbigpfTwvYnV0dG9uPlxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjt3aGl0ZS1zcGFjZTpub3dyYXA7XCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgZGF0YS1hY3Rpb249XCJwdWItdXBcIiBkYXRhLWNpdGUta2V5PVwiJHtlc2NhcGVIdG1sKGNpdGVLZXkpfVwiXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiTW92ZSBwdWJsaWNhdGlvbiB1cFwiIHRpdGxlPVwiTW92ZSB1cFwiICR7aXNGaXJzdCA/ICdkaXNhYmxlZCBzdHlsZT1cIm9wYWNpdHk6MC4zO1wiJyA6ICcnfT5cdTIxOTE8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBkYXRhLWFjdGlvbj1cInB1Yi1kb3duXCIgZGF0YS1jaXRlLWtleT1cIiR7ZXNjYXBlSHRtbChjaXRlS2V5KX1cIlxuICAgICAgICAgICAgYXJpYS1sYWJlbD1cIk1vdmUgcHVibGljYXRpb24gZG93blwiIHRpdGxlPVwiTW92ZSBkb3duXCIgJHtpc0xhc3QgPyAnZGlzYWJsZWQgc3R5bGU9XCJvcGFjaXR5OjAuMztcIicgOiAnJ30+XHUyMTkzPC9idXR0b24+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L3RyPlxuICAgIGA7XG4gIH0pO1xuXG4gIHRhYmxlSFRNTCArPSAnPC90Ym9keT48L3RhYmxlPic7XG4gIGNvbnRhaW5lci5pbm5lckhUTUwgPSB0YWJsZUhUTUw7XG4gIC8vIERlbGVnYXRlZCBjbGljayBoYW5kbGVyIGZvciBwdWJsaWNhdGlvbiBhY3Rpb24gYnV0dG9ucyAoZGF0YS1jaXRlLWtleSBvbiA8dHI+IGF2b2lkcyBvbmNsaWNrIGluamVjdGlvbilcbiAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJyNwdWJsaWNhdGlvbnMtcmV2aWV3LXRhYmxlIHRib2R5Jyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZSA9PiB7XG4gICAgY29uc3QgYnRuID0gZS50YXJnZXQuY2xvc2VzdCgnLmljb24tYnRuJyk7XG4gICAgaWYgKCFidG4gfHwgYnRuLmRpc2FibGVkKSByZXR1cm47XG4gICAgY29uc3QgdHIgPSBidG4uY2xvc2VzdCgndHJbZGF0YS1jaXRlLWtleV0nKTtcbiAgICBpZiAoIXRyKSByZXR1cm47XG4gICAgY29uc3QgYWN0aW9uID0gYnRuLmRhdGFzZXQuYWN0aW9uO1xuICAgIGlmICAgICAgKGFjdGlvbiA9PT0gJ2FjY2VwdCcpICAgaGFuZGxlUHViQWN0aW9uKHRyLmRhdGFzZXQuY2l0ZUtleSwgdHJ1ZSk7XG4gICAgZWxzZSBpZiAoYWN0aW9uID09PSAncmVqZWN0JykgICBoYW5kbGVQdWJBY3Rpb24odHIuZGF0YXNldC5jaXRlS2V5LCBmYWxzZSk7XG4gICAgZWxzZSBpZiAoYWN0aW9uID09PSAncHViLXVwJykgICBtb3ZlUHViUm93KGJ0bi5kYXRhc2V0LmNpdGVLZXksIC0xKTtcbiAgICBlbHNlIGlmIChhY3Rpb24gPT09ICdwdWItZG93bicpIG1vdmVQdWJSb3coYnRuLmRhdGFzZXQuY2l0ZUtleSwgKzEpO1xuICB9KTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEZpbHRlciB0YWJsZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gZmlsdGVyUHVibGljYXRpb25zVGFibGUocXVlcnkpIHtcbiAgY29uc3QgcSA9IHF1ZXJ5LnRvTG93ZXJDYXNlKCk7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNwdWJsaWNhdGlvbnMtcmV2aWV3LXRhYmxlIHRib2R5IHRyOm5vdCgucHViLWRpdmlkZXItcm93KScpLmZvckVhY2gocm93ID0+IHtcbiAgICByb3cuc3R5bGUuZGlzcGxheSA9IHEgPT09ICcnIHx8IHJvdy50ZXh0Q29udGVudC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpID8gJycgOiAnbm9uZSc7XG4gIH0pO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgUmVvcmRlciByb3dzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBtb3ZlUHViUm93KGNpdGVLZXksIGRpcmVjdGlvbikge1xuICBjb25zdCBhcnIgPSB3aW5kb3cuX3B1YmxpY2F0aW9uc09yZGVyZWQ7XG4gIGlmICghYXJyIHx8ICFhcnIubGVuZ3RoKSByZXR1cm47XG4gIGNvbnN0IGlkeCA9IGFyci5maW5kSW5kZXgocCA9PiBwLmNpdGVfa2V5ID09PSBjaXRlS2V5KTtcbiAgaWYgKGlkeCA8IDApIHJldHVybjtcbiAgY29uc3QgbmV3SWR4ID0gaWR4ICsgZGlyZWN0aW9uO1xuICBpZiAobmV3SWR4IDwgMCB8fCBuZXdJZHggPj0gYXJyLmxlbmd0aCkgcmV0dXJuO1xuICBbYXJyW2lkeF0sIGFycltuZXdJZHhdXSA9IFthcnJbbmV3SWR4XSwgYXJyW2lkeF1dO1xuICBfcmVidWlsZFB1YlRhYmxlQm9keShhcnIpO1xuICAvLyBQZXJzaXN0IG9yZGVyIHRvIGJhY2tlbmQgKGZpcmUtYW5kLWZvcmdldClcbiAgZmV0Y2goJy9hcGkvcmVvcmRlci1yb3dzJywge1xuICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgdHlwZTogJ3B1YmxpY2F0aW9uJywgb3JkZXJlZF9pZHM6IGFyci5tYXAocCA9PiBwLmNpdGVfa2V5KSB9KSxcbiAgfSkuY2F0Y2goKCkgPT4ge30pO1xufVxuXG5mdW5jdGlvbiBfcmVidWlsZFB1YlRhYmxlQm9keShyZWNvbW1lbmRhdGlvbnMpIHtcbiAgY29uc3QgdGJvZHkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcHVibGljYXRpb25zLXJldmlldy10YWJsZSB0Ym9keScpO1xuICBpZiAoIXRib2R5KSByZXR1cm47XG4gIGxldCBodG1sID0gJyc7XG4gIGxldCBkaXZpZGVySW5zZXJ0ZWQgPSBmYWxzZTtcbiAgcmVjb21tZW5kYXRpb25zLmZvckVhY2goKHB1YiwgaWR4KSA9PiB7XG4gICAgaWYgKCFkaXZpZGVySW5zZXJ0ZWQgJiYgcHViLmlzX3JlY29tbWVuZGVkID09PSBmYWxzZSkge1xuICAgICAgZGl2aWRlckluc2VydGVkID0gdHJ1ZTtcbiAgICAgIGNvbnN0IGRzID0gJ2JhY2tncm91bmQ6I2YzZjRmNjtib3JkZXItdG9wOjJweCBzb2xpZCAjZDFkNWRiO3BhZGRpbmc6MDsnO1xuICAgICAgaHRtbCArPSBgPHRyIGNsYXNzPVwicHViLWRpdmlkZXItcm93XCI+PHRkIHN0eWxlPVwiJHtkc31cIj48L3RkPjx0ZCBzdHlsZT1cIiR7ZHN9Y29sb3I6IzZiNzI4MDtmb250LXNpemU6MC44MmVtO2ZvbnQtc3R5bGU6aXRhbGljO3BhZGRpbmc6NnB4IDEycHg7dGV4dC1hbGlnbjpjZW50ZXI7XCI+XHUyMDE0IFB1YmxpY2F0aW9ucyBiZWxvdyB3ZXJlIG5vdCByZWNvbW1lbmRlZCBmb3IgdGhpcyByb2xlIChwcmUtZXhjbHVkZWQpIFx1MjAxNDwvdGQ+PHRkIHN0eWxlPVwiJHtkc31cIj48L3RkPjx0ZCBzdHlsZT1cIiR7ZHN9XCI+PC90ZD48dGQgc3R5bGU9XCIke2RzfVwiPjwvdGQ+PHRkIHN0eWxlPVwiJHtkc31cIj48L3RkPjx0ZCBzdHlsZT1cIiR7ZHN9XCI+PC90ZD48dGQgc3R5bGU9XCIke2RzfVwiPjwvdGQ+PHRkIHN0eWxlPVwiJHtkc31cIj48L3RkPjwvdHI+YDtcbiAgICB9XG4gICAgY29uc3QgcmFuayAgICAgICA9IGlkeCArIDE7XG4gICAgY29uc3QgY2l0ZUtleSAgICA9IHB1Yi5jaXRlX2tleSB8fCAnJztcbiAgICBjb25zdCBjaXRhdGlvbiAgID0gcHViLmZvcm1hdHRlZF9jaXRhdGlvbiB8fCBbcHViLnRpdGxlLCBwdWIudmVudWUsIHB1Yi55ZWFyXS5maWx0ZXIoQm9vbGVhbikuam9pbignLiAnKTtcbiAgICBjb25zdCB5ZWFyICAgICAgID0gcHViLnllYXIgfHwgJ1x1MjAxNCc7XG4gICAgY29uc3QgZmlyc3RBdXRoICA9IHB1Yi5pc19maXJzdF9hdXRob3IgPyAnPHNwYW4gc3R5bGU9XCJjb2xvcjojMTBiOTgxO2ZvbnQtd2VpZ2h0OjcwMDtcIiB0aXRsZT1cIkZpcnN0IGF1dGhvclwiPlx1MjYwNTwvc3Bhbj4nIDogJzxzcGFuIHN0eWxlPVwiY29sb3I6I2QxZDVkYjtcIj5cdTI2MDY8L3NwYW4+JztcbiAgICBjb25zdCBzY29yZSAgICAgID0gcHViLnJlbGV2YW5jZV9zY29yZSA/IHB1Yi5yZWxldmFuY2Vfc2NvcmUgOiAnXHUyMDE0JztcbiAgICBjb25zdCBjb25maWRlbmNlID0gcHViLmNvbmZpZGVuY2UgfHwgJyc7XG4gICAgY29uc3QgY29uZkNvbG9yICA9IGNvbmZpZGVuY2UgPT09ICdIaWdoJyA/ICcjMTBiOTgxJyA6IGNvbmZpZGVuY2UgPT09ICdMb3cnID8gJyNlZjQ0NDQnIDogJyNmNTllMGInO1xuICAgIGNvbnN0IGNvbmZCYWRnZSAgPSBjb25maWRlbmNlID8gYDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjExcHg7Y29sb3I6JHtjb25mQ29sb3J9O2ZvbnQtd2VpZ2h0OjYwMDtcIj4ke2VzY2FwZUh0bWwoY29uZmlkZW5jZSl9PC9zcGFuPmAgOiAnJztcbiAgICBjb25zdCByZWFzb25pbmcgID0gcHViLnJhdGlvbmFsZSA/IGA8c21hbGw+JHtlc2NhcGVIdG1sKHB1Yi5yYXRpb25hbGUpfTwvc21hbGw+YCA6ICcnO1xuICAgIGNvbnN0IHZlbnVlV2FybiAgPSBwdWIudmVudWVfd2FybmluZyA/IGAgPHNwYW4gdGl0bGU9XCIke2VzY2FwZUh0bWwocHViLnZlbnVlX3dhcm5pbmcpfVwiIHN0eWxlPVwiY29sb3I6I2RjNzkwMDtjdXJzb3I6aGVscDtcIj5cdTI2QTA8L3NwYW4+YCA6ICcnO1xuICAgIGNvbnN0IGlzQWNjZXB0ZWQgPSB3aW5kb3cucHVibGljYXRpb25EZWNpc2lvbnNbY2l0ZUtleV0gIT09IGZhbHNlO1xuICAgIGNvbnN0IHJvd1N0eWxlICAgPSBwdWIuaXNfcmVjb21tZW5kZWQgPT09IGZhbHNlID8gJ29wYWNpdHk6MC43OycgOiAnJztcbiAgICBjb25zdCBpc0ZpcnN0ICAgID0gaWR4ID09PSAwO1xuICAgIGNvbnN0IGlzTGFzdCAgICAgPSBpZHggPT09IHJlY29tbWVuZGF0aW9ucy5sZW5ndGggLSAxO1xuICAgIGh0bWwgKz0gYDx0ciBkYXRhLWNpdGUta2V5PVwiJHtlc2NhcGVIdG1sKGNpdGVLZXkpfVwiIHN0eWxlPVwiJHtyb3dTdHlsZX1cIj5cbiAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO2ZvbnQtd2VpZ2h0OjcwMDtcIj4ke3Jhbmt9PC90ZD5cbiAgICAgIDx0ZCBzdHlsZT1cImZvbnQtc2l6ZTowLjg3ZW07XCI+JHtlc2NhcGVIdG1sKGNpdGF0aW9uKX0ke3ZlbnVlV2Fybn08L3RkPlxuICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7XCI+JHt5ZWFyfTwvdGQ+XG4gICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjtcIj4ke2ZpcnN0QXV0aH08L3RkPlxuICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7XCI+JHtzY29yZSAhPT0gJ1x1MjAxNCcgPyBgPHN0cm9uZz4ke3Njb3JlfTwvc3Ryb25nPi8xMGAgOiAnXHUyMDE0J308L3RkPlxuICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7XCI+JHtjb25mQmFkZ2V9PC90ZD5cbiAgICAgIDx0ZD4ke3JlYXNvbmluZ308L3RkPlxuICAgICAgPHRkIGNsYXNzPVwiYWN0aW9uLWJ0bnNcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuJHtpc0FjY2VwdGVkID8gJyBhY3RpdmUnIDogJyd9XCIgZGF0YS1hY3Rpb249XCJhY2NlcHRcIiBhcmlhLWxhYmVsPVwiSW5jbHVkZSBwdWJsaWNhdGlvbiAke2VzY2FwZUh0bWwoY2l0ZUtleSl9XCIgdGl0bGU9XCJJbmNsdWRlIGluIENWXCIgc3R5bGU9XCJjb2xvcjojMTBiOTgxO1wiIGlkPVwicHViLWFjY2VwdC0ke3Jhbmt9XCI+XHUyNzEzPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0biR7IWlzQWNjZXB0ZWQgPyAnIGFjdGl2ZScgOiAnJ31cIiBkYXRhLWFjdGlvbj1cInJlamVjdFwiIGFyaWEtbGFiZWw9XCJFeGNsdWRlIHB1YmxpY2F0aW9uICR7ZXNjYXBlSHRtbChjaXRlS2V5KX1cIiB0aXRsZT1cIkV4Y2x1ZGUgZnJvbSBDVlwiIHN0eWxlPVwiY29sb3I6I2VmNDQ0NDtcIiBpZD1cInB1Yi1yZWplY3QtJHtyYW5rfVwiPiR7ZXllU2xhc2hJY29uKCl9PC9idXR0b24+XG4gICAgICA8L3RkPlxuICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7d2hpdGUtc3BhY2U6bm93cmFwO1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBkYXRhLWFjdGlvbj1cInB1Yi11cFwiIGRhdGEtY2l0ZS1rZXk9XCIke2VzY2FwZUh0bWwoY2l0ZUtleSl9XCIgYXJpYS1sYWJlbD1cIk1vdmUgcHVibGljYXRpb24gdXBcIiB0aXRsZT1cIk1vdmUgdXBcIiAke2lzRmlyc3QgPyAnZGlzYWJsZWQgc3R5bGU9XCJvcGFjaXR5OjAuMztcIicgOiAnJ30+XHUyMTkxPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIGRhdGEtYWN0aW9uPVwicHViLWRvd25cIiBkYXRhLWNpdGUta2V5PVwiJHtlc2NhcGVIdG1sKGNpdGVLZXkpfVwiIGFyaWEtbGFiZWw9XCJNb3ZlIHB1YmxpY2F0aW9uIGRvd25cIiB0aXRsZT1cIk1vdmUgZG93blwiICR7aXNMYXN0ID8gJ2Rpc2FibGVkIHN0eWxlPVwib3BhY2l0eTowLjM7XCInIDogJyd9Plx1MjE5MzwvYnV0dG9uPlxuICAgICAgPC90ZD5cbiAgICA8L3RyPmA7XG4gIH0pO1xuICB0Ym9keS5pbm5lckhUTUwgPSBodG1sO1xuICAvLyBSZS1hcHBseSBhbnkgYWN0aXZlIGZpbHRlclxuICBjb25zdCBmaWx0ZXJWYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLWZpbHRlci1pbnB1dCcpPy52YWx1ZSB8fCAnJztcbiAgaWYgKGZpbHRlclZhbCkgZmlsdGVyUHVibGljYXRpb25zVGFibGUoZmlsdGVyVmFsKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFRvZ2dsZSBhY2NlcHQgLyByZWplY3QgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIGhhbmRsZVB1YkFjdGlvbihjaXRlS2V5LCBhY2NlcHQpIHtcbiAgd2luZG93LnB1YmxpY2F0aW9uRGVjaXNpb25zW2NpdGVLZXldID0gYWNjZXB0O1xuICAvLyB1cGRhdGUgYnV0dG9uIGFjdGl2ZSBzdGF0ZXMgaW4gdGhlIHJvd1xuICBjb25zdCByb3cgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGB0cltkYXRhLWNpdGUta2V5PVwiJHtDU1MuZXNjYXBlKGNpdGVLZXkpfVwiXWApO1xuICBpZiAoIXJvdykgcmV0dXJuO1xuICByb3cucXVlcnlTZWxlY3RvckFsbCgnLmljb24tYnRuJykuZm9yRWFjaChidG4gPT4gYnRuLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpKTtcbiAgY29uc3QgYWN0aW9uID0gYWNjZXB0ID8gJ2FjY2VwdCcgOiAncmVqZWN0JztcbiAgY29uc3QgYnRuID0gcm93LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWFjdGlvbj1cIiR7YWN0aW9ufVwiXWApO1xuICBpZiAoYnRuKSBidG4uY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBCdWxrIGFjdGlvbnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIGJ1bGtQdWJBY3Rpb24obW9kZSkge1xuICBjb25zdCBwdWJzID0gd2luZG93Ll9wdWJsaWNhdGlvbnNPcmRlcmVkIHx8IFtdO1xuICBpZiAoIXB1YnMubGVuZ3RoKSByZXR1cm47XG5cbiAgcHVicy5mb3JFYWNoKHB1YiA9PiB7XG4gICAgY29uc3QgY2l0ZUtleSA9IHB1Yi5jaXRlX2tleTtcbiAgICBsZXQgYWNjZXB0O1xuICAgIGlmIChtb2RlID09PSAncmVjb21tZW5kZWQnKSB7XG4gICAgICBhY2NlcHQgPSBwdWIuaXNfcmVjb21tZW5kZWQgIT09IGZhbHNlO1xuICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gJ2FjY2VwdC1hbGwnKSB7XG4gICAgICBhY2NlcHQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBhY2NlcHQgPSBmYWxzZTtcbiAgICB9XG4gICAgd2luZG93LnB1YmxpY2F0aW9uRGVjaXNpb25zW2NpdGVLZXldID0gYWNjZXB0O1xuICAgIC8vIFVwZGF0ZSBidXR0b24gc3RhdGVzIGluIHRoZSBET01cbiAgICBjb25zdCByb3cgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGB0cltkYXRhLWNpdGUta2V5PVwiJHtDU1MuZXNjYXBlKGNpdGVLZXkpfVwiXWApO1xuICAgIGlmICghcm93KSByZXR1cm47XG4gICAgcm93LnF1ZXJ5U2VsZWN0b3JBbGwoJy5pY29uLWJ0bltkYXRhLWFjdGlvbj1cImFjY2VwdFwiXSxbZGF0YS1hY3Rpb249XCJyZWplY3RcIl0nKS5mb3JFYWNoKGJ0biA9PiBidG4uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJykpO1xuICAgIGNvbnN0IHRhcmdldCA9IHJvdy5xdWVyeVNlbGVjdG9yKGBbZGF0YS1hY3Rpb249XCIke2FjY2VwdCA/ICdhY2NlcHQnIDogJ3JlamVjdCd9XCJdYCk7XG4gICAgaWYgKHRhcmdldCkgdGFyZ2V0LmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICB9KTtcblxuICBjb25zdCBhY2NlcHRlZCA9IE9iamVjdC52YWx1ZXMod2luZG93LnB1YmxpY2F0aW9uRGVjaXNpb25zKS5maWx0ZXIoQm9vbGVhbikubGVuZ3RoO1xuICBzaG93VG9hc3QoYEJ1bGsgYWN0aW9uIGFwcGxpZWQ6ICR7YWNjZXB0ZWR9IGFjY2VwdGVkLCAke3B1YnMubGVuZ3RoIC0gYWNjZXB0ZWR9IGV4Y2x1ZGVkYCk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBTdWJtaXQgZGVjaXNpb25zIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBzdWJtaXRQdWJsaWNhdGlvbkRlY2lzaW9ucygpIHtcbiAgLyogZHVja2Zsb3c6XG4gICAqICAgaWQ6IHB1YmxpY2F0aW9uc191aV9zdWJtaXRfbGl2ZVxuICAgKiAgIGtpbmQ6IHVpXG4gICAqICAgdGltZXN0YW1wOiAnMjAyNi0wMy0yNVQyMTozOTo0OFonXG4gICAqICAgc3RhdHVzOiBsaXZlXG4gICAqICAgaGFuZGxlczpcbiAgICogICAtIHVpOnB1YmxpY2F0aW9ucy1yZXZpZXcuc3VibWl0XG4gICAqICAgY2FsbHM6XG4gICAqICAgLSBQT1NUIC9hcGkvcmV2aWV3LWRlY2lzaW9uc1xuICAgKiAgIC0gR0VUIC9hcGkvcmV3cml0ZXNcbiAgICogICByZWFkczpcbiAgICogICAtIHdpbmRvdzpwdWJsaWNhdGlvbkRlY2lzaW9uc1xuICAgKiAgIHdyaXRlczpcbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL3Jldmlldy1kZWNpc2lvbnMuZGVjaXNpb25zXG4gICAqICAgbm90ZXM6IFBlcnNpc3RzIHB1YmxpY2F0aW9uIGluY2x1ZGUvZXhjbHVkZSBkZWNpc2lvbnMgYmVmb3JlIHRoZSByZXdyaXRlIHN0YWdlIGRlcml2ZXMgZG93bnN0cmVhbSBjb250ZW50IHByb3Bvc2FscyBmcm9tIHRoZSBhY2NlcHRlZCBwdWJsaWNhdGlvbiBzZXQuXG4gICAqL1xuICBjb25zdCBkZWNpc2lvbnMgPSB3aW5kb3cucHVibGljYXRpb25EZWNpc2lvbnMgfHwge307XG4gIGNvbnN0IGNvdW50ID0gT2JqZWN0LmtleXMoZGVjaXNpb25zKS5sZW5ndGg7XG4gIGlmIChjb3VudCA9PT0gMCkge1xuICAgIHNob3dUb2FzdCgnTm8gcHVibGljYXRpb24gZGVjaXNpb25zIHRvIHNhdmUuJywgJ2Vycm9yJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gUGVyc2lzdCBhcyBhIHN0cnVjdHVyZWQgYW5zd2VyIGluIHNlc3Npb24gc3RhdGVcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3Jldmlldy1kZWNpc2lvbnMnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyB0eXBlOiAncHVibGljYXRpb25zJywgZGVjaXNpb25zOiB3aW5kb3cucHVibGljYXRpb25EZWNpc2lvbnMgfSlcbiAgICB9KTtcblxuICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgc3RhdGVNYW5hZ2VyLm1hcmtDb250ZW50Q2hhbmdlZCgpO1xuICAgICAgY29uc3QgYWNjZXB0ZWQgPSBPYmplY3QudmFsdWVzKHdpbmRvdy5wdWJsaWNhdGlvbkRlY2lzaW9ucykuZmlsdGVyKEJvb2xlYW4pLmxlbmd0aDtcbiAgICAgIGNvbnN0IHJlamVjdGVkID0gY291bnQgLSBhY2NlcHRlZDtcbiAgICAgIHNob3dUb2FzdChgUHVibGljYXRpb24gc2VsZWN0aW9ucyBzYXZlZDogJHthY2NlcHRlZH0ga2VwdCwgJHtyZWplY3RlZH0gZXhjbHVkZWRgKTtcbiAgICAgIGF3YWl0IGZldGNoQW5kUmV2aWV3UmV3cml0ZXMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZXJyID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgc2hvd1RvYXN0KGBFcnJvcjogJHtlcnIuZXJyb3IgfHwgJ0ZhaWxlZCB0byBzYXZlIHB1YmxpY2F0aW9uIHNlbGVjdGlvbnMnfWAsICdlcnJvcicpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLmVycm9yKCdFcnJvciBzYXZpbmcgcHVibGljYXRpb24gZGVjaXNpb25zOicsIGVycik7XG4gICAgc2hvd1RvYXN0KCdGYWlsZWQgdG8gc2F2ZSBwdWJsaWNhdGlvbiBzZWxlY3Rpb25zLiBQbGVhc2UgdHJ5IGFnYWluLicsICdlcnJvcicpO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFeHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5leHBvcnQge1xuICBidWlsZFB1YmxpY2F0aW9uc1Jldmlld1RhYmxlLFxuICBidWxrUHViQWN0aW9uLFxuICBmaWx0ZXJQdWJsaWNhdGlvbnNUYWJsZSxcbiAgaGFuZGxlUHViQWN0aW9uLFxuICBzdWJtaXRQdWJsaWNhdGlvbkRlY2lzaW9ucyxcbn07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9yZXdyaXRlLXJldmlldy5qc1xuICogUmV3cml0ZSByZXZpZXcgcGFuZWw6IGZldGNoIHJld3JpdGVzLCByZW5kZXIgY2FyZHMgd2l0aCB3b3JkLWRpZmYsXG4gKiBhY2NlcHQvZWRpdC9yZWplY3QgZGVjaXNpb25zLCBzdWJtaXQuXG4gKlxuICogRGVwZW5kZW5jaWVzIChyZXNvbHZlZCB0aHJvdWdoIGdsb2JhbFRoaXMgYXQgcnVudGltZSk6XG4gKiAgIGFwcGVuZExvYWRpbmdNZXNzYWdlLCByZW1vdmVMb2FkaW5nTWVzc2FnZSwgYXBwZW5kUmV0cnlNZXNzYWdlLCBhcHBlbmRNZXNzYWdlLFxuICogICBzZXRMb2FkaW5nLCBzZW5kQWN0aW9uLCBzd2l0Y2hUYWIsIHNjaGVkdWxlQXRzUmVmcmVzaCxcbiAqICAgZXNjYXBlSHRtbCwgcGFyc2VSZXdyaXRlc1Jlc3BvbnNlLCBQSEFTRVNcbiAqL1xuXG5pbXBvcnQgeyBzdGF0ZU1hbmFnZXIgfSBmcm9tICcuL3N0YXRlLW1hbmFnZXIuanMnO1xuXG4vLyBNb2R1bGUtbGV2ZWwgc3RhdGVcbmxldCByZXdyaXRlRGVjaXNpb25zID0ge307XG5sZXQgX3Jld3JpdGVQYW5lbENhY2hlID0gbnVsbDtcbmxldCBwZXJzdWFzaW9uV2FybmluZ3NBY2tub3dsZWRnZWQgPSBmYWxzZTtcbmxldCBfd2FybmluZ3NCeVJld3JpdGVJZCA9IHt9OyAgLy8gTWFwIGZyb20gcmV3cml0ZSBpZCBcdTIxOTIgd2FybmluZyBsaXN0IChQYXRoIDEpXG5sZXQgX3Jlc3RvcmVUb2FzdFNob3duID0gZmFsc2U7XG5cbmZ1bmN0aW9uIHN5bmNSZXdyaXRlR2xvYmFscygpIHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHdpbmRvdy5yZXdyaXRlRGVjaXNpb25zID0gcmV3cml0ZURlY2lzaW9ucztcbiAgd2luZG93Ll9yZXdyaXRlUGFuZWxDYWNoZSA9IF9yZXdyaXRlUGFuZWxDYWNoZTtcbiAgd2luZG93LmFjY2VwdEFsbFJld3JpdGVzID0gYWNjZXB0QWxsUmV3cml0ZXM7XG4gIHdpbmRvdy5yZWplY3RBbGxSZXdyaXRlcyA9IHJlamVjdEFsbFJld3JpdGVzO1xuICB3aW5kb3cudG9nZ2xlUmV3cml0ZUNvbXBhY3RNb2RlID0gdG9nZ2xlUmV3cml0ZUNvbXBhY3RNb2RlO1xufVxuXG5mdW5jdGlvbiBfZGVjaXNpb25zS2V5KCkge1xuICB0cnkge1xuICAgIGNvbnN0IHNpZCA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCkuZ2V0KCdzZXNzaW9uJyk7XG4gICAgcmV0dXJuIHNpZCA/IGByd19kZWNpc2lvbnNfJHtzaWR9YCA6IG51bGw7XG4gIH0gY2F0Y2ggKF8pIHsgcmV0dXJuIG51bGw7IH1cbn1cblxuZnVuY3Rpb24gX3BlcnNpc3REZWNpc2lvbnMoKSB7XG4gIGNvbnN0IGtleSA9IF9kZWNpc2lvbnNLZXkoKTtcbiAgaWYgKCFrZXkpIHJldHVybjtcbiAgdHJ5IHsgbG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCBKU09OLnN0cmluZ2lmeShyZXdyaXRlRGVjaXNpb25zKSk7IH0gY2F0Y2ggKF8pIHt9XG59XG5cbi8vIEZhbGxiYWNrIGF1ZGl0IGZyb20gdGhlIGxhc3QgL2FwaS9yZXdyaXRlcyByZXNwb25zZSBcdTIwMTQgdXNlZCBmb3IgY29sZC1yZXN0b3JlIChHQVAtMTg2KS5cbmxldCBfYmFja2VuZFJld3JpdGVBdWRpdCA9IFtdO1xuXG5mdW5jdGlvbiBfcmVzdG9yZURlY2lzaW9ucygpIHtcbiAgY29uc3Qga2V5ID0gX2RlY2lzaW9uc0tleSgpO1xuICBpZiAoIWtleSkgcmV0dXJuO1xuICBjb25zdCBoYWREZWNpc2lvbnMgPSBPYmplY3Qua2V5cyhyZXdyaXRlRGVjaXNpb25zKS5sZW5ndGggPiAwO1xuICB0cnkge1xuICAgIGNvbnN0IHNhdmVkID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpIHx8ICdudWxsJyk7XG4gICAgaWYgKHNhdmVkICYmIHR5cGVvZiBzYXZlZCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoc2F2ZWQpKSB7XG4gICAgICBPYmplY3QuYXNzaWduKHJld3JpdGVEZWNpc2lvbnMsIHNhdmVkKTtcbiAgICAgIHN5bmNSZXdyaXRlR2xvYmFscygpO1xuICAgICAgaWYgKCFoYWREZWNpc2lvbnMgJiYgIV9yZXN0b3JlVG9hc3RTaG93biAmJiBPYmplY3Qua2V5cyhyZXdyaXRlRGVjaXNpb25zKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIF9yZXN0b3JlVG9hc3RTaG93biA9IHRydWU7XG4gICAgICAgIGlmICh0eXBlb2Ygc2hvd1RvYXN0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgc2hvd1RvYXN0KCdZb3VyIHByZXZpb3VzIHJld3JpdGUgZGVjaXNpb25zIGhhdmUgYmVlbiByZXN0b3JlZCBcdTIwMTQgeW91IGNhbiBzdGlsbCBjaGFuZ2UgdGhlbS4nLCAnd2FybmluZycsIDYwMDApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9IGNhdGNoIChfKSB7fVxuXG4gIC8vIENvbGQtcmVzdG9yZSBmYWxsYmFjazogc2VlZCBkZWNpc2lvbnMgZnJvbSBiYWNrZW5kIHJld3JpdGVfYXVkaXQgd2hlblxuICAvLyBsb2NhbFN0b3JhZ2UgaGFzIG5vdGhpbmcgKGRpZmZlcmVudCBkZXZpY2UsIGluY29nbml0bywgY2xlYXJlZCBzdG9yYWdlKS5cbiAgaWYgKF9iYWNrZW5kUmV3cml0ZUF1ZGl0Lmxlbmd0aCA+IDApIHtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIF9iYWNrZW5kUmV3cml0ZUF1ZGl0KSB7XG4gICAgICBjb25zdCBpZCA9IGVudHJ5LmlkO1xuICAgICAgaWYgKCFpZCB8fCAhZW50cnkub3V0Y29tZSkgY29udGludWU7XG4gICAgICByZXdyaXRlRGVjaXNpb25zW2lkXSA9IHtcbiAgICAgICAgb3V0Y29tZTogZW50cnkub3V0Y29tZSxcbiAgICAgICAgZmluYWxfdGV4dDogZW50cnkub3V0Y29tZSA9PT0gJ2VkaXQnID8gKGVudHJ5LmZpbmFsID8/IG51bGwpIDogbnVsbCxcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChPYmplY3Qua2V5cyhyZXdyaXRlRGVjaXNpb25zKS5sZW5ndGggPiAwKSB7XG4gICAgICBzeW5jUmV3cml0ZUdsb2JhbHMoKTtcbiAgICAgIF9wZXJzaXN0RGVjaXNpb25zKCk7XG4gICAgICBpZiAoIWhhZERlY2lzaW9ucyAmJiAhX3Jlc3RvcmVUb2FzdFNob3duKSB7XG4gICAgICAgIF9yZXN0b3JlVG9hc3RTaG93biA9IHRydWU7XG4gICAgICAgIGlmICh0eXBlb2Ygc2hvd1RvYXN0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgc2hvd1RvYXN0KCdZb3VyIHByZXZpb3VzIHJld3JpdGUgZGVjaXNpb25zIGhhdmUgYmVlbiByZXN0b3JlZCBcdTIwMTQgeW91IGNhbiBzdGlsbCBjaGFuZ2UgdGhlbS4nLCAnd2FybmluZycsIDYwMDApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIF9jbGVhclBlcnNpc3RlZERlY2lzaW9ucygpIHtcbiAgY29uc3Qga2V5ID0gX2RlY2lzaW9uc0tleSgpO1xuICBpZiAoIWtleSkgcmV0dXJuO1xuICB0cnkgeyBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpOyB9IGNhdGNoIChfKSB7fVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgUmV3cml0ZSBzbmFwc2hvdCAoY2hhbmdlZC1pdGVtIGhpZ2hsaWdodGluZykgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5mdW5jdGlvbiBfc25hcHNob3RLZXkoKSB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2lkID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKS5nZXQoJ3Nlc3Npb24nKTtcbiAgICByZXR1cm4gc2lkID8gYHJ3X3NuYXBzaG90XyR7c2lkfWAgOiBudWxsO1xuICB9IGNhdGNoIChfKSB7IHJldHVybiBudWxsOyB9XG59XG5cbmZ1bmN0aW9uIF9zYXZlUmV3cml0ZVNuYXBzaG90KHJld3JpdGVzKSB7XG4gIGNvbnN0IGtleSA9IF9zbmFwc2hvdEtleSgpO1xuICBpZiAoIWtleSkgcmV0dXJuO1xuICBjb25zdCBtYXAgPSB7fTtcbiAgZm9yIChjb25zdCByIG9mIHJld3JpdGVzKSB7XG4gICAgY29uc3QgY2FyZElkID0gU3RyaW5nKHIuaWQpLnJlcGxhY2UoL1teYS16QS1aMC05Xy1dL2csICdfJyk7XG4gICAgbWFwW2NhcmRJZF0gPSByLnByb3Bvc2VkIHx8ICcnO1xuICB9XG4gIHRyeSB7IGxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgSlNPTi5zdHJpbmdpZnkobWFwKSk7IH0gY2F0Y2ggKF8pIHt9XG59XG5cbmZ1bmN0aW9uIF9nZXRSZXdyaXRlU25hcHNob3QoKSB7XG4gIGNvbnN0IGtleSA9IF9zbmFwc2hvdEtleSgpO1xuICBpZiAoIWtleSkgcmV0dXJuIG51bGw7XG4gIHRyeSB7IHJldHVybiBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSkgfHwgJ251bGwnKTsgfSBjYXRjaCAoXykgeyByZXR1cm4gbnVsbDsgfVxufVxuXG5mdW5jdGlvbiBfY2xlYXJSZXdyaXRlU25hcHNob3QoKSB7XG4gIGNvbnN0IGtleSA9IF9zbmFwc2hvdEtleSgpO1xuICBpZiAoIWtleSkgcmV0dXJuO1xuICB0cnkgeyBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpOyB9IGNhdGNoIChfKSB7fVxufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaEFuZFJldmlld1Jld3JpdGVzKCkge1xuICBjb25zdCBsb2FkaW5nTXNnID0gYXBwZW5kTG9hZGluZ01lc3NhZ2UoJ0NoZWNraW5nIGZvciB0ZXh0IGltcHJvdmVtZW50cy4uLicpO1xuICBzZXRMb2FkaW5nKHRydWUsICdSZXZpZXdpbmcgcmV3cml0ZXNcdTIwMjYnKTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9yZXdyaXRlcycpO1xuICAgIGNvbnN0IGRhdGEgPSBwYXJzZVJld3JpdGVzUmVzcG9uc2UoYXdhaXQgcmVzLmpzb24oKSk7XG4gICAgcmVtb3ZlTG9hZGluZ01lc3NhZ2UobG9hZGluZ01zZyk7XG4gICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgaWYgKCFyZXMub2spIHtcbiAgICAgIGFwcGVuZFJldHJ5TWVzc2FnZSgnXHUyNzRDIEVycm9yIGNoZWNraW5nIHJld3JpdGVzOiAnICsgKGRhdGEuZXJyb3IgfHwgJ1Vua25vd24gZXJyb3InKSwgZmV0Y2hBbmRSZXZpZXdSZXdyaXRlcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJld3JpdGVzID0gZGF0YS5yZXdyaXRlcyB8fCBbXTtcbiAgICBjb25zdCB3YXJuaW5ncyA9IGRhdGEucGVyc3Vhc2lvbl93YXJuaW5ncyB8fCBbXTsgIC8vIFBoYXNlIDEwXG4gICAgX2JhY2tlbmRSZXdyaXRlQXVkaXQgPSBkYXRhLnJld3JpdGVfYXVkaXQgfHwgW107XG5cbiAgICAvLyBTaG93IHBlcnN1YXNpb24gd2FybmluZ3MgZmlyc3QgKFBoYXNlIDEwKVxuICAgIHBlcnN1YXNpb25XYXJuaW5nc0Fja25vd2xlZGdlZCA9IHdhcm5pbmdzLmxlbmd0aCA9PT0gMDsgIC8vIE1hcmsgYWNrbm93bGVkZ2VkIGlmIG5vIHdhcm5pbmdzXG4gICAgaWYgKHdhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG1zZyA9IGBcdTI2QTBcdUZFMEYgKioke3dhcm5pbmdzLmxlbmd0aH0qKiBwZXJzdWFzaW9uIGNoZWNrJHt3YXJuaW5ncy5sZW5ndGggPiAxID8gJ3MnIDogJyd9IGZsYWdnZWQuIFJldmlldyB0aGVzZSBiZWZvcmUgc3VibWl0dGluZy5gO1xuICAgICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgbXNnKTtcbiAgICB9XG5cbiAgICAvLyBTaG93IHJld3JpdGUgcmV2aWV3IHBhbmVsXG4gICAgcmV3cml0ZURlY2lzaW9ucyA9IHt9O1xuICAgIHN5bmNSZXdyaXRlR2xvYmFscygpO1xuICAgIHJlbmRlclJld3JpdGVQYW5lbChyZXdyaXRlcywgd2FybmluZ3MpOyAgLy8gUGFzcyB3YXJuaW5ncyB0byBwYW5lbFxuICAgIHN3aXRjaFRhYigncmV3cml0ZScpO1xuICAgIGNvbnN0IG4gPSByZXdyaXRlcy5sZW5ndGg7XG4gICAgaWYgKG4gPT09IDApIHtcbiAgICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsICdcdTI3MEZcdUZFMEYgTm8gcmV3cml0ZSBzdWdnZXN0aW9ucyB3ZXJlIG5lZWRlZCBcdTIwMTQgeW91ciBzZWxlY3RlZCBjb250ZW50IGFscmVhZHkgdXNlcyB0aGUgam9iXFwncyB0ZXJtaW5vbG9neSB3ZWxsLiBUaGUgKipSZXdyaXRlcyoqIHRhYiBpcyBzdGlsbCBhdmFpbGFibGUgc28geW91IGNhbiBjb25maXJtIGFuZCBjb250aW51ZSB0byAqKlNwZWxsIENoZWNrKiogd2hlbiByZWFkeS4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgYFx1MjcwRlx1RkUwRiBZb3UndmUgY29uZmlybWVkIHlvdXIgZXhwZXJpZW5jZSwgc2tpbGwsIGFuZCBhY2hpZXZlbWVudCBzZWxlY3Rpb25zLiBIZXJlIGFyZSB0aGUgQUkncyAqKiR7bn0qKiB0ZXh0IGltcHJvdmVtZW50IHN1Z2dlc3Rpb24ke24gPiAxID8gJ3MnIDogJyd9IGZvciB0aGUgaW5jbHVkZWQgYnVsbGV0cyBcdTIwMTQgZWFjaCBvbmUgaW50cm9kdWNlcyBqb2ItcmVsZXZhbnQga2V5d29yZHMgd2hpbGUgcHJlc2VydmluZyB5b3VyIGZhY3RzLiBSZXZpZXcgZWFjaCBzdWdnZXN0aW9uIGluIHRoZSAqKlJld3JpdGVzKiogdGFiLCB0aGVuIGFjY2VwdCwgZWRpdCwgb3IgcmVqZWN0IGJlZm9yZSBjb250aW51aW5nIHRvIHNwZWxsIGNoZWNrLmApO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmVtb3ZlTG9hZGluZ01lc3NhZ2UobG9hZGluZ01zZyk7XG4gICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgYXBwZW5kUmV0cnlNZXNzYWdlKCdcdTI3NEMgRXJyb3I6ICcgKyBlcnIubWVzc2FnZSwgZmV0Y2hBbmRSZXZpZXdSZXdyaXRlcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX3JlbmRlclJld3JpdGVBdWRpdExvZygpIHtcbiAgaWYgKCFfYmFja2VuZFJld3JpdGVBdWRpdCB8fCBfYmFja2VuZFJld3JpdGVBdWRpdC5sZW5ndGggPT09IDApIHJldHVybiAnJztcblxuICBjb25zdCBPVVRDT01FX0lDT04gPSB7IGFjY2VwdDogJ1x1MjcwNScsIHJlamVjdDogJ1x1Mjc0QycsIGVkaXQ6ICdcdTI3MEZcdUZFMEYnIH07XG4gIGNvbnN0IE9VVENPTUVfTEFCRUwgPSB7IGFjY2VwdDogJ0FjY2VwdGVkJywgcmVqZWN0OiAnUmVqZWN0ZWQnLCBlZGl0OiAnRWRpdGVkJyB9O1xuXG4gIGNvbnN0IHJvd3MgPSBfYmFja2VuZFJld3JpdGVBdWRpdC5tYXAoZW50cnkgPT4ge1xuICAgIGNvbnN0IGljb24gID0gT1VUQ09NRV9JQ09OW2VudHJ5Lm91dGNvbWVdIHx8ICdcdTI3NTMnO1xuICAgIGNvbnN0IGxhYmVsID0gT1VUQ09NRV9MQUJFTFtlbnRyeS5vdXRjb21lXSB8fCBlbnRyeS5vdXRjb21lO1xuICAgIGNvbnN0IGxvYyAgID0gZXNjYXBlSHRtbChlbnRyeS5sb2NhdGlvbiB8fCBlbnRyeS5maWVsZCB8fCAnJyk7XG4gICAgY29uc3Qgb3JpZyAgPSBlc2NhcGVIdG1sKGVudHJ5Lm9yaWdpbmFsIHx8ICcnKTtcbiAgICBjb25zdCBwcm9wICA9IGVzY2FwZUh0bWwoZW50cnkucHJvcG9zZWQgfHwgJycpO1xuICAgIGNvbnN0IGZpbiAgID0gZW50cnkub3V0Y29tZSA9PT0gJ2VkaXQnICYmIGVudHJ5LmZpbmFsXG4gICAgICA/IGA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDo0cHg7Y29sb3I6IzFkNGVkODtmb250LXNpemU6MC44NWVtO1wiPkZpbmFsOiAke2VzY2FwZUh0bWwoZW50cnkuZmluYWwpfTwvZGl2PmBcbiAgICAgIDogJyc7XG4gICAgcmV0dXJuIGBcbiAgICAgIDxkaXYgc3R5bGU9XCJib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZTJlOGYwO3BhZGRpbmc6OHB4IDA7Zm9udC1zaXplOjAuODhlbTtcIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjZweDttYXJnaW4tYm90dG9tOjRweDtcIj5cbiAgICAgICAgICA8c3BhbiB0aXRsZT1cIiR7bGFiZWx9XCI+JHtpY29ufTwvc3Bhbj5cbiAgICAgICAgICA8c3Ryb25nIHN0eWxlPVwiY29sb3I6IzM3NDE1MTtcIj4ke2xhYmVsfTwvc3Ryb25nPlxuICAgICAgICAgICR7bG9jID8gYDxzcGFuIHN0eWxlPVwiY29sb3I6IzljYTNhZjtmb250LXNpemU6MC44NWVtO1wiPlx1MjAxNCAke2xvY308L3NwYW4+YCA6ICcnfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImNvbG9yOiM2YjcyODA7dGV4dC1kZWNvcmF0aW9uOmxpbmUtdGhyb3VnaDtmb250LXNpemU6MC44NWVtO1wiPiR7b3JpZ308L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImNvbG9yOiMzNzQxNTE7Zm9udC1zaXplOjAuODVlbTtcIj4ke3Byb3B9PC9kaXY+XG4gICAgICAgICR7ZmlufVxuICAgICAgPC9kaXY+YDtcbiAgfSkuam9pbignJyk7XG5cbiAgcmV0dXJuIGBcbiAgICA8ZGV0YWlscyBzdHlsZT1cIm1hcmdpbi10b3A6MjRweDtib3JkZXI6MXB4IHNvbGlkICNlMmU4ZjA7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzoxMnB4IDE2cHg7XCI+XG4gICAgICA8c3VtbWFyeSBzdHlsZT1cImN1cnNvcjpwb2ludGVyO2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjojMzc0MTUxO2xpc3Qtc3R5bGU6bm9uZTtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDo4cHg7XCI+XG4gICAgICAgIDxzcGFuPlx1RDgzRFx1RENDQjwvc3Bhbj5cbiAgICAgICAgPHNwYW4+UmV3cml0ZSBBdWRpdCBMb2cgKCR7X2JhY2tlbmRSZXdyaXRlQXVkaXQubGVuZ3RofSBkZWNpc2lvbiR7X2JhY2tlbmRSZXdyaXRlQXVkaXQubGVuZ3RoID09PSAxID8gJycgOiAncyd9KTwvc3Bhbj5cbiAgICAgICAgPHNwYW4gc3R5bGU9XCJtYXJnaW4tbGVmdDphdXRvO2NvbG9yOiM5Y2EzYWY7Zm9udC1zaXplOjAuODVlbTtcIj5cdTI1QkMgc2hvdzwvc3Bhbj5cbiAgICAgIDwvc3VtbWFyeT5cbiAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOjEycHg7XCI+JHtyb3dzfTwvZGl2PlxuICAgIDwvZGV0YWlscz5gO1xufVxuXG5mdW5jdGlvbiByZW5kZXJSZXdyaXRlUGFuZWwocmV3cml0ZXMsIHdhcm5pbmdzID0gW10pIHtcbiAgX3Jld3JpdGVQYW5lbENhY2hlID0geyByZXdyaXRlcywgd2FybmluZ3MgfTtcbiAgLy8gQnVpbGQgcGVyLWNhcmQgd2FybmluZyBpbmRleCBmb3IgUGF0aCAxIGJhZGdlc1xuICBfd2FybmluZ3NCeVJld3JpdGVJZCA9IHt9O1xuICBmb3IgKGNvbnN0IHcgb2Ygd2FybmluZ3MpIHtcbiAgICBpZiAoIV93YXJuaW5nc0J5UmV3cml0ZUlkW3cuaWRdKSBfd2FybmluZ3NCeVJld3JpdGVJZFt3LmlkXSA9IFtdO1xuICAgIF93YXJuaW5nc0J5UmV3cml0ZUlkW3cuaWRdLnB1c2godyk7XG4gIH1cbiAgc3luY1Jld3JpdGVHbG9iYWxzKCk7XG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9jdW1lbnQtY29udGVudCcpO1xuICBjb25zdCBoYXNSZXdyaXRlcyA9IHJld3JpdGVzLmxlbmd0aCA+IDA7XG5cbiAgLy8gQnVpbGQgcGVyc3Vhc2lvbiB3YXJuaW5ncyBzZWN0aW9uIChQaGFzZSAxMClcbiAgbGV0IHdhcm5pbmdzSHRtbCA9ICcnO1xuICBpZiAod2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IHdhcm5pbmdzQnlUeXBlID0ge307XG4gICAgd2FybmluZ3MuZm9yRWFjaCh3ID0+IHtcbiAgICAgIGlmICghd2FybmluZ3NCeVR5cGVbdy5mbGFnX3R5cGVdKSB3YXJuaW5nc0J5VHlwZVt3LmZsYWdfdHlwZV0gPSAwO1xuICAgICAgd2FybmluZ3NCeVR5cGVbdy5mbGFnX3R5cGVdKys7XG4gICAgfSk7XG4gICAgY29uc3Qgd2FybmluZ0NvdW50cyA9IE9iamVjdC5lbnRyaWVzKHdhcm5pbmdzQnlUeXBlKVxuICAgICAgLm1hcCgoW3R5cGUsIGNvdW50XSkgPT4gYCR7Y291bnR9ICR7dHlwZS5yZXBsYWNlKC9fL2csICcgJyl9YClcbiAgICAgIC5qb2luKCcsICcpO1xuXG4gICAgd2FybmluZ3NIdG1sID0gYFxuICAgICAgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2ZlZjJmMjtib3JkZXI6MXB4IHNvbGlkICNmZWNhY2E7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzoxNHB4O21hcmdpbi1ib3R0b206MjBweDtcIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjEwcHg7bWFyZ2luLWJvdHRvbToxMHB4O2N1cnNvcjpwb2ludGVyO1wiIG9uY2xpY2s9XCJ0aGlzLnBhcmVudEVsZW1lbnQucXVlcnlTZWxlY3RvcignI3dhcm5pbmdzLWRldGFpbCcpLnN0eWxlLmRpc3BsYXkgPSB0aGlzLnBhcmVudEVsZW1lbnQucXVlcnlTZWxlY3RvcignI3dhcm5pbmdzLWRldGFpbCcpLnN0eWxlLmRpc3BsYXkgPT09ICdub25lJyA/ICdibG9jaycgOiAnbm9uZSc7XCI+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MjBweDtcIj5cdTI2QTBcdUZFMEY8L3NwYW4+XG4gICAgICAgICAgPHN0cm9uZyBzdHlsZT1cImNvbG9yOiM5OTFiMWI7XCI+UGVyc3Vhc2lvbiBjaGVja3M6ICR7d2FybmluZ0NvdW50c308L3N0cm9uZz5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cIm1hcmdpbi1sZWZ0OmF1dG87Y29sb3I6IzdmMWQxZDtcIj5cdTI1QkM8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwid2FybmluZ3MtZGV0YWlsXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7bWFyZ2luLXRvcDoxMHB4O3BhZGRpbmctdG9wOjEwcHg7Ym9yZGVyLXRvcDoxcHggc29saWQgI2ZlY2FjYTtcIj5cbiAgICAgICAgICAke3dhcm5pbmdzLm1hcCh3ID0+IGBcbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nOjhweDttYXJnaW4tYm90dG9tOjhweDtiYWNrZ3JvdW5kOiNmZmY3ZWQ7Ym9yZGVyLWxlZnQ6M3B4IHNvbGlkICNmOTczMTY7Ym9yZGVyLXJhZGl1czo0cHg7Zm9udC1zaXplOjAuOWVtO1wiPlxuICAgICAgICAgICAgICA8c3Ryb25nPiR7dy5mbGFnX3R5cGUucmVwbGFjZSgvXy9nLCAnICcpfTwvc3Ryb25nPiBhdCAke3cubG9jYXRpb259PGJyPlxuICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiM3YzJkMTI7XCI+JHt3LmRldGFpbHN9PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgYCkuam9pbignJyl9XG4gICAgICAgICAgPGJ1dHRvbiBzdHlsZT1cIm1hcmdpbi10b3A6MTBweDtwYWRkaW5nOjhweCAxMnB4O2JhY2tncm91bmQ6Izk5MWIxYjtjb2xvcjp3aGl0ZTtib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjRweDtjdXJzb3I6cG9pbnRlcjtcIiBvbmNsaWNrPVwic2V0UGVyc3Vhc2lvbldhcm5pbmdzQWNrbm93bGVkZ2VkKHRydWUpOyB0aGlzLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAuNic7IHVwZGF0ZVJld3JpdGVUYWxseSgpO1wiPlxuICAgICAgICAgICAgXHUyNzEzIEFja25vd2xlZGdlZFxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIGA7XG4gIH1cblxuICAvLyBDb21wdXRlIHBlci1jYXJkIGNoYW5nZSBzdGF0dXMgcmVsYXRpdmUgdG8gcHJldmlvdXMgcmVuZGVyJ3Mgc25hcHNob3QuXG4gIGNvbnN0IHByZXZTbmFwc2hvdCA9IF9nZXRSZXdyaXRlU25hcHNob3QoKTtcbiAgY29uc3QgY2hhbmdlU3RhdHVzTWFwID0ge307XG4gIGlmIChwcmV2U25hcHNob3QpIHtcbiAgICBmb3IgKGNvbnN0IHIgb2YgcmV3cml0ZXMpIHtcbiAgICAgIGNvbnN0IGNhcmRJZCA9IFN0cmluZyhyLmlkKS5yZXBsYWNlKC9bXmEtekEtWjAtOV8tXS9nLCAnXycpO1xuICAgICAgaWYgKCEoY2FyZElkIGluIHByZXZTbmFwc2hvdCkpIHtcbiAgICAgICAgY2hhbmdlU3RhdHVzTWFwW2NhcmRJZF0gPSAnbmV3JztcbiAgICAgIH0gZWxzZSBpZiAocHJldlNuYXBzaG90W2NhcmRJZF0gIT09IChyLnByb3Bvc2VkIHx8ICcnKSkge1xuICAgICAgICBjaGFuZ2VTdGF0dXNNYXBbY2FyZElkXSA9ICd1cGRhdGVkJztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLy8gU2F2ZSBjdXJyZW50IHJld3JpdGVzIGFzIHNuYXBzaG90IGZvciBuZXh0IHJlbmRlciBjb21wYXJpc29uLlxuICBfc2F2ZVJld3JpdGVTbmFwc2hvdChyZXdyaXRlcyk7XG5cbiAgY29udGVudC5pbm5lckhUTUwgPSB3YXJuaW5nc0h0bWwgKyBgXG4gICAgPGRpdiBpZD1cInJld3JpdGUtcGFuZWxcIj5cbiAgICAgIDxoMT5cdTI3MEZcdUZFMEYgUmV2aWV3IFRleHQgSW1wcm92ZW1lbnRzPC9oMT5cbiAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDttYXJnaW4tYm90dG9tOjIwcHg7XCI+XG4gICAgICAgICR7aGFzUmV3cml0ZXNcbiAgICA/ICdSZXZpZXcgZWFjaCBzdWdnZXN0ZWQgdGV4dCBpbXByb3ZlbWVudC4gQWNjZXB0LCBlZGl0LCBvciByZWplY3QgYWxsIHN1Z2dlc3Rpb25zIGJlZm9yZSBwcm9jZWVkaW5nIHRvIHNwZWxsIGNoZWNrLidcbiAgICA6ICdObyB0ZXh0IGltcHJvdmVtZW50cyB3ZXJlIHN1Z2dlc3RlZCBmb3IgdGhpcyBDVi4gQ29udGludWUgd2hlbiB5b3UgYXJlIHJlYWR5IHRvIG1vdmUgdG8gc3BlbGwgY2hlY2suJ31cbiAgICAgIDwvcD5cbiAgICAgIDxkaXYgY2xhc3M9XCJyZXdyaXRlLXRhbGx5LWJhclwiIGlkPVwicmV3cml0ZS10YWxseVwiICR7aGFzUmV3cml0ZXMgPyAnJyA6ICdzdHlsZT1cImRpc3BsYXk6bm9uZVwiJ30+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidGFsbHktYWNjZXB0ZWRcIj5cdTI3MTMgQWNjZXB0ZWQ6IDxzdHJvbmcgaWQ9XCJ0YWxseS1hY2NlcHRlZFwiPjA8L3N0cm9uZz48L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidGFsbHktcmVqZWN0ZWRcIj5cdTI3MTcgUmVqZWN0ZWQ6IDxzdHJvbmcgaWQ9XCJ0YWxseS1yZWplY3RlZFwiPjA8L3N0cm9uZz48L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidGFsbHktcGVuZGluZ1wiPlx1MjNGMyBQZW5kaW5nOiA8c3Ryb25nIGlkPVwidGFsbHktcGVuZGluZ1wiPiR7cmV3cml0ZXMubGVuZ3RofTwvc3Ryb25nPjwvc3Bhbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInJ3LWJ1bGstYnRuXCIgb25jbGljaz1cImFjY2VwdEFsbFJld3JpdGVzKClcIiB0aXRsZT1cIkFjY2VwdCBhbGwgcGVuZGluZyBzdWdnZXN0aW9uc1wiPlx1MjcxMyBBY2NlcHQgQWxsPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJydy1idWxrLWJ0biBydy1idWxrLXJlamVjdFwiIG9uY2xpY2s9XCJyZWplY3RBbGxSZXdyaXRlcygpXCIgdGl0bGU9XCJSZWplY3QgYWxsIHBlbmRpbmcgc3VnZ2VzdGlvbnNcIj5cdTI3MTcgUmVqZWN0IEFsbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwicnctY29tcGFjdC10b2dnbGVcIiBpZD1cInJ3LWNvbXBhY3QtYnRuXCIgb25jbGljaz1cInRvZ2dsZVJld3JpdGVDb21wYWN0TW9kZSgpXCIgdGl0bGU9XCJTd2l0Y2ggdG8gY29tcGFjdCBzaW5nbGUtbGluZSB2aWV3IGZvciByYXBpZCByZXZpZXdcIj5cdTIyOUUgQ29tcGFjdDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwic3VibWl0LXJld3JpdGVzLWJ0blwiIGlkPVwic3VibWl0LXJld3JpdGVzLWJ0blwiIGRpc2FibGVkXG4gICAgICAgICAgICAgICAgb25jbGljaz1cInN1Ym1pdFJld3JpdGVEZWNpc2lvbnMoKVwiPlN1Ym1pdCBBbGwgRGVjaXNpb25zPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgaWQ9XCJyZXdyaXRlLWNhcmRzXCI+XG4gICAgICAgICR7aGFzUmV3cml0ZXNcbiAgICA/IHJld3JpdGVzLm1hcChyID0+IHtcbiAgICAgICAgY29uc3QgY2FyZElkID0gU3RyaW5nKHIuaWQpLnJlcGxhY2UoL1teYS16QS1aMC05Xy1dL2csICdfJyk7XG4gICAgICAgIHJldHVybiByZW5kZXJSZXdyaXRlQ2FyZChyLCBfd2FybmluZ3NCeVJld3JpdGVJZFtyLmlkXSB8fCBbXSwgY2hhbmdlU3RhdHVzTWFwW2NhcmRJZF0gfHwgbnVsbCk7XG4gICAgICB9KS5qb2luKCcnKVxuICAgIDogYFxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJlbXB0eS1zdGF0ZVwiIHN0eWxlPVwibWFyZ2luLXRvcDoyNHB4O1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImljb25cIj5cdTI3MEZcdUZFMEY8L2Rpdj5cbiAgICAgICAgICAgIDxoMz5ObyBSZXdyaXRlIFN1Z2dlc3Rpb25zPC9oMz5cbiAgICAgICAgICAgIDxwPlRoaXMgZHJhZnQgYWxyZWFkeSBwYXNzZXMgdGhlIHJld3JpdGUgc3RhZ2Ugd2l0aG91dCBzdWdnZXN0ZWQgd29yZGluZyBjaGFuZ2VzLjwvcD5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzdWJtaXQtYnRuXCIgaWQ9XCJzdWJtaXQtcmV3cml0ZXMtYnRuXCIgb25jbGljaz1cInN1Ym1pdFJld3JpdGVEZWNpc2lvbnMoKVwiPkNvbnRpbnVlIHRvIFNwZWxsIENoZWNrPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIGB9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICAke19yZW5kZXJSZXdyaXRlQXVkaXRMb2coKX1cbiAgYDtcblxuICAvLyBSZXN0b3JlIGRlY2lzaW9ucyBwZXJzaXN0ZWQgZnJvbSBhIHByZXZpb3VzIHBhZ2UgbG9hZCAoR0FQLTE2NikuXG4gIF9yZXN0b3JlRGVjaXNpb25zKCk7XG4gIC8vIFJlLWFwcGx5IGFueSBkZWNpc2lvbnMgbWFkZSBiZWZvcmUgdGhlIGxhc3QgdGFiIG5hdmlnYXRpb24uXG4gIGlmIChPYmplY3Qua2V5cyhyZXdyaXRlRGVjaXNpb25zKS5sZW5ndGggPiAwKSB7XG4gICAgZm9yIChjb25zdCBbaWQsIGRlY10gb2YgT2JqZWN0LmVudHJpZXMocmV3cml0ZURlY2lzaW9ucykpIHtcbiAgICAgIGlmICghZGVjIHx8ICFkZWMub3V0Y29tZSkgY29udGludWU7XG4gICAgICBpZiAoZGVjLm91dGNvbWUgPT09ICdlZGl0JyAmJiBkZWMuZmluYWxfdGV4dCAhPSBudWxsKSB7XG4gICAgICAgIC8vIEVudGVyIGVkaXQgbW9kZSwgaW5qZWN0IHRoZSBzYXZlZCB0ZXh0LCB0aGVuIHNhdmUgc28gdGhlIGNhcmRcbiAgICAgICAgLy8gc2hvd3MgYXMgYWNjZXB0ZWQgd2l0aCB0aGUgY29ycmVjdCBkaWZmIHJlbmRlcmVkLlxuICAgICAgICBhcHBseVJld3JpdGVBY3Rpb24oaWQsICdlZGl0Jyk7XG4gICAgICAgIGNvbnN0IHRhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHJ3LXRleHRhcmVhLSR7aWR9YCk7XG4gICAgICAgIGlmICh0YSkge1xuICAgICAgICAgIHRhLnZhbHVlID0gZGVjLmZpbmFsX3RleHQ7XG4gICAgICAgICAgc2F2ZVJld3JpdGVFZGl0KGlkKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXBwbHlSZXdyaXRlQWN0aW9uKGlkLCBkZWMub3V0Y29tZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHVwZGF0ZVJld3JpdGVUYWxseSgpO1xuICB9XG59XG5cbi8qKlxuICogY29tcHV0ZVdvcmREaWZmKG9yaWdpbmFsLCBwcm9wb3NlZCkgXHUyMDE0IExDUyB3b3JkLWxldmVsIGRpZmYuXG4gKlxuICogVG9rZW5pc2VzIGJvdGggc3RyaW5ncyBieSBzcGxpdHRpbmcgb24gd2hpdGVzcGFjZSBib3VuZGFyaWVzIHdoaWxlXG4gKiBwcmVzZXJ2aW5nIHRoZSB3aGl0ZXNwYWNlIHRva2VucyBzbyB0aGUgcmVuZGVyZWQgZGlmZiBoYXMgdGhlIHNhbWVcbiAqIHNwYWNpbmcgYXMgdGhlIHNvdXJjZSB0ZXh0LiAgUmV0dXJucyBhbiBhcnJheSBvZlxuICoge3Rva2VuOiBzdHJpbmcsIHR5cGU6ICd1bmNoYW5nZWQnfCdyZW1vdmVkJ3wnYWRkZWQnfS5cbiAqL1xuZnVuY3Rpb24gY29tcHV0ZVdvcmREaWZmKG9yaWdpbmFsLCBwcm9wb3NlZCkge1xuICAvLyBTcGxpdCBvbiB3aGl0ZXNwYWNlIGJ1dCBrZWVwIHRoZSBzZXBhcmF0b3JzIGFzIHRva2Vucy5cbiAgZnVuY3Rpb24gdG9rZW5pemUoc3RyKSB7IHJldHVybiAoc3RyIHx8ICcnKS5zcGxpdCgvKFxccyspLyk7IH1cblxuICBjb25zdCBhID0gdG9rZW5pemUob3JpZ2luYWwpO1xuICBjb25zdCBiID0gdG9rZW5pemUocHJvcG9zZWQpO1xuICBjb25zdCBtID0gYS5sZW5ndGg7XG4gIGNvbnN0IG4gPSBiLmxlbmd0aDtcblxuICAvLyBCdWlsZCBMQ1MgRFAgdGFibGUgKE8obSpuKSBcdTIwMTQgYWNjZXB0YWJsZSBmb3IgQ1YgYnVsbGV0IGxlbmd0aHMpLlxuICBjb25zdCBkcCA9IEFycmF5LmZyb20oe2xlbmd0aDogbSArIDF9LCAoKSA9PiBuZXcgQXJyYXkobiArIDEpLmZpbGwoMCkpO1xuICBmb3IgKGxldCBpID0gMTsgaSA8PSBtOyBpKyspIHtcbiAgICBmb3IgKGxldCBqID0gMTsgaiA8PSBuOyBqKyspIHtcbiAgICAgIGRwW2ldW2pdID0gYVtpIC0gMV0gPT09IGJbaiAtIDFdXG4gICAgICAgID8gZHBbaSAtIDFdW2ogLSAxXSArIDFcbiAgICAgICAgOiBNYXRoLm1heChkcFtpIC0gMV1bal0sIGRwW2ldW2ogLSAxXSk7XG4gICAgfVxuICB9XG5cbiAgLy8gQmFja3RyYWNrIHRvIHByb2R1Y2UgdGhlIGRpZmYgc2VxdWVuY2UuXG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBsZXQgaSA9IG0sIGogPSBuO1xuICB3aGlsZSAoaSA+IDAgfHwgaiA+IDApIHtcbiAgICBpZiAoaSA+IDAgJiYgaiA+IDAgJiYgYVtpIC0gMV0gPT09IGJbaiAtIDFdKSB7XG4gICAgICByZXN1bHQudW5zaGlmdCh7dG9rZW46IGFbaSAtIDFdLCB0eXBlOiAndW5jaGFuZ2VkJ30pO1xuICAgICAgaS0tOyBqLS07XG4gICAgfSBlbHNlIGlmIChqID4gMCAmJiAoaSA9PT0gMCB8fCBkcFtpXVtqIC0gMV0gPj0gZHBbaSAtIDFdW2pdKSkge1xuICAgICAgcmVzdWx0LnVuc2hpZnQoe3Rva2VuOiBiW2ogLSAxXSwgdHlwZTogJ2FkZGVkJ30pO1xuICAgICAgai0tO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQudW5zaGlmdCh7dG9rZW46IGFbaSAtIDFdLCB0eXBlOiAncmVtb3ZlZCd9KTtcbiAgICAgIGktLTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqIFJlbmRlciBhIHt0b2tlbiwgdHlwZX0gZGlmZiBhcnJheSBpbnRvIGFuIEhUTUwgc3RyaW5nLiAqL1xuZnVuY3Rpb24gcmVuZGVyRGlmZkh0bWwodG9rZW5zKSB7XG4gIHJldHVybiB0b2tlbnMubWFwKHQgPT4ge1xuICAgIGlmICh0LnR5cGUgPT09ICdyZW1vdmVkJykgcmV0dXJuIGA8ZGVsIGNsYXNzPVwiZGlmZi1yZW1vdmVkXCI+JHtlc2NhcGVIdG1sKHQudG9rZW4pfTwvZGVsPmA7XG4gICAgaWYgKHQudHlwZSA9PT0gJ2FkZGVkJykgICByZXR1cm4gYDxpbnMgY2xhc3M9XCJkaWZmLWFkZGVkXCI+JHtlc2NhcGVIdG1sKHQudG9rZW4pfTwvaW5zPmA7XG4gICAgcmV0dXJuIGVzY2FwZUh0bWwodC50b2tlbik7XG4gIH0pLmpvaW4oJycpO1xufVxuXG5mdW5jdGlvbiByZW5kZXJSZXdyaXRlQ2FyZChyLCBjYXJkV2FybmluZ3MgPSBbXSwgY2hhbmdlU3RhdHVzID0gbnVsbCkge1xuICBjb25zdCBpc1dlYWtTa2lsbEFkZCA9IHIudHlwZSA9PT0gJ3NraWxsX2FkZCcgJiYgci5ldmlkZW5jZV9zdHJlbmd0aCA9PT0gJ3dlYWsnO1xuICBjb25zdCB3ZWFrQmFkZ2UgICAgID0gaXNXZWFrU2tpbGxBZGRcbiAgICA/IGA8c3BhbiBjbGFzcz1cIndlYWstYmFkZ2VcIj5cdTI2QTAgQ2FuZGlkYXRlIHRvIGNvbmZpcm08L3NwYW4+YFxuICAgIDogJyc7XG4gIGNvbnN0IGNoYW5nZUJhZGdlICAgPSBjaGFuZ2VTdGF0dXMgPT09ICduZXcnXG4gICAgPyBgPHNwYW4gY2xhc3M9XCJydy1jaGFuZ2UtYmFkZ2UgcnctY2hhbmdlLW5ld1wiIGFyaWEtbGFiZWw9XCJOZXcgc3VnZ2VzdGlvbiBub3QgaW4gcHJldmlvdXMgcnVuXCI+XHVEODNDXHVERDk1IE5ldzwvc3Bhbj5gXG4gICAgOiBjaGFuZ2VTdGF0dXMgPT09ICd1cGRhdGVkJ1xuICAgICAgPyBgPHNwYW4gY2xhc3M9XCJydy1jaGFuZ2UtYmFkZ2UgcnctY2hhbmdlLXVwZGF0ZWRcIiBhcmlhLWxhYmVsPVwiU3VnZ2VzdGlvbiBjaGFuZ2VkIHNpbmNlIHByZXZpb3VzIHJ1blwiPlx1MjFCQiBVcGRhdGVkPC9zcGFuPmBcbiAgICAgIDogJyc7XG4gIC8vIEtleXdvcmQgcGlsbHMgd2l0aCBwb3NpdGlvbi1iYXNlZCByYW5rIGJhZGdlICgjMSwgIzIsIFx1MjAyNilcbiAgY29uc3Qga2V5d29yZFBpbGxzICA9IChyLmtleXdvcmRzX2ludHJvZHVjZWQgfHwgW10pXG4gICAgLm1hcCgoaywgaWR4KSA9PiBgPHNwYW4gY2xhc3M9XCJyZXdyaXRlLWtleXdvcmRcIj48c3BhbiBjbGFzcz1cImt3LXJhbmtcIj4jJHtpZHggKyAxfTwvc3Bhbj4ke2VzY2FwZUh0bWwoayl9PC9zcGFuPmApXG4gICAgLmpvaW4oJycpO1xuICBjb25zdCB0eXBlTGFiZWwgPSAoci50eXBlIHx8ICdyZXdyaXRlJykucmVwbGFjZSgvXy9nLCAnICcpO1xuICAvLyBTYW5pdGl6ZSBJRDoga2VlcCBvbmx5IGFscGhhbnVtZXJpYywgdW5kZXJzY29yZSwgYW5kIGh5cGhlbiBzbyBpdCBpc1xuICAvLyBzYWZlIGFzIGJvdGggYW4gSFRNTCBhdHRyaWJ1dGUgdmFsdWUgYW5kIGEgSlMgc3RyaW5nIGxpdGVyYWwgaW4gb25jbGljay5cbiAgY29uc3QgY2FyZElkICAgID0gU3RyaW5nKHIuaWQpLnJlcGxhY2UoL1teYS16QS1aMC05Xy1dL2csICdfJyk7XG5cbiAgLy8gQ29tcHV0ZSB3b3JkLWxldmVsIGRpZmYgZm9yIHRoZSBpbmxpbmUgZGlzcGxheS5cbiAgY29uc3QgZGlmZlRva2VucyA9IGNvbXB1dGVXb3JkRGlmZihyLm9yaWdpbmFsIHx8ICcnLCByLnByb3Bvc2VkIHx8ICcnKTtcbiAgY29uc3QgZGlmZkh0bWwgICA9IHJlbmRlckRpZmZIdG1sKGRpZmZUb2tlbnMpO1xuXG4gIHJldHVybiBgXG4gICAgPGRpdiBjbGFzcz1cInJld3JpdGUtY2FyZFwiIGlkPVwicnctY2FyZC0ke2NhcmRJZH1cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJyZXdyaXRlLWNhcmQtaGVhZGVyXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwicmV3cml0ZS1jYXJkLXR5cGVcIj4ke2VzY2FwZUh0bWwodHlwZUxhYmVsKX08L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwicmV3cml0ZS1jYXJkLXRpdGxlXCI+JHtlc2NhcGVIdG1sKHIubG9jYXRpb24gfHwgci5pZCl9PC9zcGFuPlxuICAgICAgICAke3dlYWtCYWRnZX0ke2NoYW5nZUJhZGdlfVxuICAgICAgICA8c3BhbiBpZD1cInJ3LWRlY2lzaW9uLWJhZGdlLSR7Y2FyZElkfVwiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiIHN0eWxlPVwiZGlzcGxheTpub25lO2ZvbnQtc2l6ZTowLjc4ZW07Zm9udC13ZWlnaHQ6NjAwO3BhZGRpbmc6MXB4IDdweDtib3JkZXItcmFkaXVzOjlweDttYXJnaW4tbGVmdDphdXRvO1wiPjwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInJld3JpdGUtY2FyZC1ib2R5XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyZXdyaXRlLWlubGluZS1kaWZmXCIgaWQ9XCJydy1kaWZmLSR7Y2FyZElkfVwiXG4gICAgICAgICAgICAgZGF0YS1vcmlnaW5hbD1cIiR7ZXNjYXBlSHRtbChyLm9yaWdpbmFsIHx8ICcnKX1cIj4ke2RpZmZIdG1sfTwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicmV3cml0ZS1hZnRlclwiIGlkPVwicnctYWZ0ZXItJHtjYXJkSWR9XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmVcIj5cbiAgICAgICAgICA8c3BhbiBpZD1cInJ3LWFmdGVyLXRleHQtJHtjYXJkSWR9XCI+JHtlc2NhcGVIdG1sKHIucHJvcG9zZWQgfHwgJycpfTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgICR7a2V5d29yZFBpbGxzID8gYDxkaXYgY2xhc3M9XCJyZXdyaXRlLWtleXdvcmRzXCI+JHtrZXl3b3JkUGlsbHN9PC9kaXY+YCA6ICcnfVxuICAgICAgICAke3IucmF0aW9uYWxlID8gYFxuICAgICAgICA8ZGV0YWlscyBjbGFzcz1cInJld3JpdGUtcmF0aW9uYWxlXCI+XG4gICAgICAgICAgPHN1bW1hcnk+UmF0aW9uYWxlICZhbXA7IEV2aWRlbmNlPC9zdW1tYXJ5PlxuICAgICAgICAgIDxwIHN0eWxlPVwibWFyZ2luOjZweCAwIDA7XCI+JHtlc2NhcGVIdG1sKHIucmF0aW9uYWxlKX08L3A+XG4gICAgICAgICAgJHtyLmV2aWRlbmNlID8gYDxwIHN0eWxlPVwiY29sb3I6IzljYTNhZjtmb250LXNpemU6MC44NWVtO21hcmdpbjo0cHggMCAwO1wiPiR7ZXNjYXBlSHRtbChyLmV2aWRlbmNlKX08L3A+YCA6ICcnfVxuICAgICAgICA8L2RldGFpbHM+YCA6ICcnfVxuICAgICAgICAke2NhcmRXYXJuaW5ncy5sZW5ndGggPiAwID8gYFxuICAgICAgICA8ZGl2IGNsYXNzPVwicmV3cml0ZS1wZXJzdWFzaW9uLWJhZGdlc1wiPlxuICAgICAgICAgICR7Y2FyZFdhcm5pbmdzLm1hcCh3ID0+IGA8c3BhbiBjbGFzcz1cInBlcnN1YXNpb24tYmFkZ2UgcGVyc3Vhc2lvbi1iYWRnZS0tJHt3LnNldmVyaXR5fVwiIHRpdGxlPVwiJHtlc2NhcGVIdG1sKHcuZGV0YWlscyl9XCI+XHUyNkEwICR7ZXNjYXBlSHRtbCh3LmZsYWdfdHlwZS5yZXBsYWNlKC9fL2csICcgJykpfTwvc3Bhbj5gKS5qb2luKCcnKX1cbiAgICAgICAgPC9kaXY+YCA6ICcnfVxuICAgICAgICA8ZGl2IGNsYXNzPVwicmV3cml0ZS1hY3Rpb25zXCI+XG4gICAgICAgICAgPGEgY2xhc3M9XCJydy1iYWNrLWxpbmtcIiBocmVmPVwiI1wiIG9uY2xpY2s9XCJldmVudC5wcmV2ZW50RGVmYXVsdCgpOyBzd2l0Y2hUYWIoJ2N1c3RvbWl6YXRpb25zJylcIiB0aXRsZT1cIkdvIGJhY2sgdG8gQ3VzdG9taXNlIHRvIHJlY29uc2lkZXIgd2hldGhlciB0byBpbmNsdWRlIHRoaXMgY29udGVudFwiPlx1MjFBOSBSZWNvbnNpZGVyIGluY2x1c2lvbjwvYT5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicnctYnRuIGFjY2VwdFwiIGlkPVwicnctYWNjZXB0LSR7Y2FyZElkfVwiIGFyaWEtcHJlc3NlZD1cImZhbHNlXCIgb25jbGljaz1cImFwcGx5UmV3cml0ZUFjdGlvbignJHtjYXJkSWR9JywgJ2FjY2VwdCcpXCI+XHUyNzEzIEFjY2VwdDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJydy1idG4gZWRpdFwiICAgaWQ9XCJydy1lZGl0LSR7Y2FyZElkfVwiICAgYXJpYS1wcmVzc2VkPVwiZmFsc2VcIiBvbmNsaWNrPVwiYXBwbHlSZXdyaXRlQWN0aW9uKCcke2NhcmRJZH0nLCAnZWRpdCcpXCI+XHUyNzBFIEVkaXQ8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicnctYnRuIHJlamVjdFwiIGlkPVwicnctcmVqZWN0LSR7Y2FyZElkfVwiIGFyaWEtcHJlc3NlZD1cImZhbHNlXCIgb25jbGljaz1cImFwcGx5UmV3cml0ZUFjdGlvbignJHtjYXJkSWR9JywgJ3JlamVjdCcpXCI+XHUyNzE3IFJlamVjdDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PmA7XG59XG5cbmZ1bmN0aW9uIGFwcGx5UmV3cml0ZUFjdGlvbihpZCwgb3V0Y29tZSkge1xuICBjb25zdCBjYXJkICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHJ3LWNhcmQtJHtpZH1gKTtcbiAgY29uc3QgYWZ0ZXJFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBydy1hZnRlci0ke2lkfWApO1xuICBjb25zdCBkaWZmRWwgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHJ3LWRpZmYtJHtpZH1gKTtcbiAgaWYgKCFjYXJkIHx8ICFhZnRlckVsKSByZXR1cm47XG5cbiAgLy8gQ2xlYXIgYW55IHByZXZpb3VzIG91dGNvbWUgc3R5bGluZ1xuICBjYXJkLmNsYXNzTGlzdC5yZW1vdmUoJ2FjY2VwdGVkJywgJ3JlamVjdGVkJyk7XG4gIFsnYWNjZXB0JywgJ2VkaXQnLCAncmVqZWN0J10uZm9yRWFjaChhID0+IHtcbiAgICBjb25zdCBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcnctJHthfS0ke2lkfWApO1xuICAgIGJ0bj8uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gICAgaWYgKGJ0bikgYnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJywgJ2ZhbHNlJyk7XG4gIH0pO1xuICBjb25zdCBfZGVjaXNpb25CYWRnZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBydy1kZWNpc2lvbi1iYWRnZS0ke2lkfWApO1xuICBpZiAoX2RlY2lzaW9uQmFkZ2UpIF9kZWNpc2lvbkJhZGdlLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgaWYgKG91dGNvbWUgPT09ICdlZGl0Jykge1xuICAgIC8vIEtlZXAgdGhlIGlubGluZSBkaWZmIHZpc2libGUgYXMgYSByZWZlcmVuY2U7IHNob3cgdGhlIGVkaXRhYmxlIHRleHRhcmVhIGJlbG93IGl0LlxuICAgIGNvbnN0IGN1cnJlbnRUZXh0ID0gYWZ0ZXJFbC5xdWVyeVNlbGVjdG9yKGAjcnctYWZ0ZXItdGV4dC0ke2lkfWApPy50ZXh0Q29udGVudFxuICAgICAgICAgICAgICAgICAgICAgPz8gcmV3cml0ZURlY2lzaW9uc1tpZF0/LmZpbmFsX3RleHRcbiAgICAgICAgICAgICAgICAgICAgID8/ICcnO1xuICAgIGlmIChkaWZmRWwpIHtcbiAgICAgIGRpZmZFbC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICBkaWZmRWwuc3R5bGUub3BhY2l0eSA9ICcwLjU1JztcbiAgICAgIGRpZmZFbC5zdHlsZS5ib3JkZXJMZWZ0ID0gJzNweCBzb2xpZCAjOTNjNWZkJztcbiAgICB9XG4gICAgYWZ0ZXJFbC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICBhZnRlckVsLmlubmVySFRNTCA9IGBcbiAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC43OGVtO2NvbG9yOiM2YjcyODA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+XHUyNzBFIFlvdXIgZWRpdCAoQUkgc3VnZ2VzdGlvbiBzaG93biBhYm92ZSBmb3IgcmVmZXJlbmNlKTo8L2Rpdj5cbiAgICAgIDx0ZXh0YXJlYSBpZD1cInJ3LXRleHRhcmVhLSR7aWR9XCI+JHtlc2NhcGVIdG1sKGN1cnJlbnRUZXh0KX08L3RleHRhcmVhPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cInJ3LXNhdmUtZWRpdC1idG5cIiBzdHlsZT1cIm1hcmdpbi10b3A6NnB4XCJcbiAgICAgICAgICAgICAgb25jbGljaz1cInNhdmVSZXdyaXRlRWRpdCgnJHtpZH0nKVwiPlNhdmU8L2J1dHRvbj5cbiAgICBgO1xuICAgIGNvbnN0IGVkaXRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcnctZWRpdC0ke2lkfWApO1xuICAgIGVkaXRCdG4/LmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgIGlmIChlZGl0QnRuKSBlZGl0QnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJywgJ3RydWUnKTtcbiAgICAvLyBEZWNpc2lvbiBpcyByZWNvcmRlZCBvbmx5IHdoZW4gdGhlIHVzZXIgY2xpY2tzIFNhdmVcbiAgfSBlbHNlIHtcbiAgICAvLyBSZXN0b3JlIHRoZSBhZnRlci10ZXh0IHNwYW4gaWYgd2UgcHJldmlvdXNseSBlbnRlcmVkIGVkaXQgbW9kZVxuICAgIGNvbnN0IHRleHRhcmVhID0gYWZ0ZXJFbC5xdWVyeVNlbGVjdG9yKCd0ZXh0YXJlYScpO1xuICAgIGlmICh0ZXh0YXJlYSkge1xuICAgICAgY29uc3QgdHh0ID0gdGV4dGFyZWEudmFsdWU7XG4gICAgICBhZnRlckVsLmlubmVySFRNTCA9IGA8c3BhbiBpZD1cInJ3LWFmdGVyLXRleHQtJHtpZH1cIj4ke2VzY2FwZUh0bWwodHh0KX08L3NwYW4+YDtcbiAgICB9XG4gICAgLy8gUmUtc2hvdyB0aGUgaW5saW5lIGRpZmYgcGFuZWwgYXQgZnVsbCBvcGFjaXR5OyBoaWRlIHRoZSBlZGl0IGFyZWEuXG4gICAgaWYgKGRpZmZFbCkgeyBkaWZmRWwuc3R5bGUuZGlzcGxheSA9ICcnOyBkaWZmRWwuc3R5bGUub3BhY2l0eSA9ICcnOyBkaWZmRWwuc3R5bGUuYm9yZGVyTGVmdCA9ICcnOyB9XG4gICAgYWZ0ZXJFbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgcmV3cml0ZURlY2lzaW9uc1tpZF0gPSB7IG91dGNvbWUsIGZpbmFsX3RleHQ6IG51bGwgfTtcbiAgICBfcGVyc2lzdERlY2lzaW9ucygpO1xuICAgIGNhcmQuY2xhc3NMaXN0LmFkZChvdXRjb21lID09PSAnYWNjZXB0JyA/ICdhY2NlcHRlZCcgOiAncmVqZWN0ZWQnKTtcbiAgICBjb25zdCBhY3RpdmVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcnctJHtvdXRjb21lfS0ke2lkfWApO1xuICAgIGFjdGl2ZUJ0bj8uY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgaWYgKGFjdGl2ZUJ0bikgYWN0aXZlQnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJywgJ3RydWUnKTtcbiAgICBjb25zdCBkZWNCYWRnZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBydy1kZWNpc2lvbi1iYWRnZS0ke2lkfWApO1xuICAgIGlmIChkZWNCYWRnZSkge1xuICAgICAgZGVjQmFkZ2UudGV4dENvbnRlbnQgPSBvdXRjb21lID09PSAnYWNjZXB0JyA/ICdcdTI3MTMgQWNjZXB0ZWQnIDogJ1x1MjcxNyBSZWplY3RlZCc7XG4gICAgICBkZWNCYWRnZS5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICBkZWNCYWRnZS5zdHlsZS5iYWNrZ3JvdW5kID0gb3V0Y29tZSA9PT0gJ2FjY2VwdCcgPyAnI2JiZjdkMCcgOiAnI2ZlY2FjYSc7XG4gICAgICBkZWNCYWRnZS5zdHlsZS5jb2xvciAgICAgID0gb3V0Y29tZSA9PT0gJ2FjY2VwdCcgPyAnIzA2NWY0NicgOiAnIzk5MWIxYic7XG4gICAgfVxuICAgIHN5bmNSZXdyaXRlR2xvYmFscygpO1xuICAgIHVwZGF0ZVJld3JpdGVUYWxseSgpO1xuICAgIF9zY3JvbGxUb05leHRQZW5kaW5nUmV3cml0ZShpZCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX3Njcm9sbFRvTmV4dFBlbmRpbmdSZXdyaXRlKGFmdGVySWQpIHtcbiAgY29uc3QgYWxsQ2FyZHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbaWRePVwicnctY2FyZC1cIl0nKTtcbiAgbGV0IGZvdW5kID0gZmFsc2U7XG4gIGZvciAoY29uc3QgY2FyZCBvZiBhbGxDYXJkcykge1xuICAgIGNvbnN0IGlkID0gY2FyZC5pZC5yZXBsYWNlKCdydy1jYXJkLScsICcnKTtcbiAgICBpZiAoaWQgPT09IGFmdGVySWQpIHsgZm91bmQgPSB0cnVlOyBjb250aW51ZTsgfVxuICAgIGlmICghZm91bmQpIGNvbnRpbnVlO1xuICAgIGlmICghcmV3cml0ZURlY2lzaW9uc1tpZF0pIHtcbiAgICAgIGNhcmQuc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnY2VudGVyJyB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2F2ZVJld3JpdGVFZGl0KGlkKSB7XG4gIGNvbnN0IHRleHRhcmVhICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcnctdGV4dGFyZWEtJHtpZH1gKTtcbiAgY29uc3QgZWRpdGVkVGV4dCA9IHRleHRhcmVhID8gdGV4dGFyZWEudmFsdWUgOiAnJztcbiAgY29uc3QgYWZ0ZXJFbCAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBydy1hZnRlci0ke2lkfWApO1xuICBjb25zdCBkaWZmRWwgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHJ3LWRpZmYtJHtpZH1gKTtcbiAgY29uc3QgY2FyZCAgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBydy1jYXJkLSR7aWR9YCk7XG4gIGlmICghYWZ0ZXJFbCB8fCAhY2FyZCkgcmV0dXJuO1xuXG4gIC8vIFJlcGxhY2UgdGV4dGFyZWEgd2l0aCBmaW5hbCBzcGFuIChoaWRkZW4gXHUyMDE0IHByZXNlcnZlcyB0ZXh0IGZvciBmdXR1cmUgZWRpdHMpLlxuICBhZnRlckVsLmlubmVySFRNTCA9IGA8c3BhbiBpZD1cInJ3LWFmdGVyLXRleHQtJHtpZH1cIj4ke2VzY2FwZUh0bWwoZWRpdGVkVGV4dCl9PC9zcGFuPmA7XG4gIGFmdGVyRWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAvLyBSZWdlbmVyYXRlIHRoZSBpbmxpbmUgZGlmZiBhZ2FpbnN0IHRoZSBvcmlnaW5hbCB0ZXh0IGFuZCByZS1zaG93IGl0IChmdWxsIG9wYWNpdHkpLlxuICBpZiAoZGlmZkVsKSB7XG4gICAgY29uc3Qgb3JpZ2luYWwgPSBkaWZmRWwuZGF0YXNldC5vcmlnaW5hbCB8fCAnJztcbiAgICBkaWZmRWwuaW5uZXJIVE1MID0gcmVuZGVyRGlmZkh0bWwoY29tcHV0ZVdvcmREaWZmKG9yaWdpbmFsLCBlZGl0ZWRUZXh0KSk7XG4gICAgZGlmZkVsLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICBkaWZmRWwuc3R5bGUub3BhY2l0eSA9ICcnO1xuICAgIGRpZmZFbC5zdHlsZS5ib3JkZXJMZWZ0ID0gJyc7XG4gIH1cblxuICByZXdyaXRlRGVjaXNpb25zW2lkXSA9IHsgb3V0Y29tZTogJ2VkaXQnLCBmaW5hbF90ZXh0OiBlZGl0ZWRUZXh0IH07XG4gIF9wZXJzaXN0RGVjaXNpb25zKCk7XG4gIGNhcmQuY2xhc3NMaXN0LnJlbW92ZSgncmVqZWN0ZWQnKTtcbiAgY2FyZC5jbGFzc0xpc3QuYWRkKCdhY2NlcHRlZCcpO1xuICBbJ2FjY2VwdCcsICdyZWplY3QnXS5mb3JFYWNoKGEgPT4ge1xuICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBydy0ke2F9LSR7aWR9YCk7XG4gICAgYnRuPy5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICBpZiAoYnRuKSBidG4uc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCAnZmFsc2UnKTtcbiAgfSk7XG4gIGNvbnN0IHNhdmVFZGl0QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHJ3LWVkaXQtJHtpZH1gKTtcbiAgc2F2ZUVkaXRCdG4/LmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICBpZiAoc2F2ZUVkaXRCdG4pIHNhdmVFZGl0QnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJywgJ3RydWUnKTtcbiAgY29uc3QgZWRpdERlY0JhZGdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHJ3LWRlY2lzaW9uLWJhZGdlLSR7aWR9YCk7XG4gIGlmIChlZGl0RGVjQmFkZ2UpIHtcbiAgICBlZGl0RGVjQmFkZ2UudGV4dENvbnRlbnQgPSAnXHUyNzEzIEFjY2VwdGVkIChlZGl0ZWQpJztcbiAgICBlZGl0RGVjQmFkZ2Uuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgIGVkaXREZWNCYWRnZS5zdHlsZS5iYWNrZ3JvdW5kID0gJyNiYmY3ZDAnO1xuICAgIGVkaXREZWNCYWRnZS5zdHlsZS5jb2xvciAgICAgID0gJyMwNjVmNDYnO1xuICB9XG4gIHN5bmNSZXdyaXRlR2xvYmFscygpO1xuICB1cGRhdGVSZXdyaXRlVGFsbHkoKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlUmV3cml0ZVRhbGx5KCkge1xuICBjb25zdCBjYXJkcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5yZXdyaXRlLWNhcmQnKTtcbiAgbGV0IGFjY2VwdGVkID0gMCwgcmVqZWN0ZWQgPSAwLCBwZW5kaW5nID0gMDtcbiAgY2FyZHMuZm9yRWFjaChjYXJkID0+IHtcbiAgICBjb25zdCBpZCAgPSBjYXJkLmlkLnJlcGxhY2UoJ3J3LWNhcmQtJywgJycpO1xuICAgIGNvbnN0IGRlYyA9IHJld3JpdGVEZWNpc2lvbnNbaWRdO1xuICAgIGlmICAgICAgKCFkZWMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmcrKztcbiAgICBlbHNlIGlmIChkZWMub3V0Y29tZSA9PT0gJ2FjY2VwdCcgfHwgZGVjLm91dGNvbWUgPT09ICdlZGl0JykgYWNjZXB0ZWQrKztcbiAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3RlZCsrO1xuICB9KTtcblxuICBjb25zdCBhY2NlcHRlZEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhbGx5LWFjY2VwdGVkJyk7XG4gIGNvbnN0IHJlamVjdGVkRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFsbHktcmVqZWN0ZWQnKTtcbiAgY29uc3QgcGVuZGluZ0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhbGx5LXBlbmRpbmcnKTtcblxuICBpZiAoYWNjZXB0ZWRFbCkgYWNjZXB0ZWRFbC50ZXh0Q29udGVudCA9IGFjY2VwdGVkO1xuICBpZiAocmVqZWN0ZWRFbCkgcmVqZWN0ZWRFbC50ZXh0Q29udGVudCA9IHJlamVjdGVkO1xuICBpZiAocGVuZGluZ0VsKSBwZW5kaW5nRWwudGV4dENvbnRlbnQgID0gcGVuZGluZztcblxuICBjb25zdCBzdWJtaXRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3VibWl0LXJld3JpdGVzLWJ0bicpO1xuICBpZiAoc3VibWl0QnRuKSB7XG4gICAgY29uc3QgbmVlZHNBY2sgPSAhcGVyc3Vhc2lvbldhcm5pbmdzQWNrbm93bGVkZ2VkO1xuICAgIHN1Ym1pdEJ0bi5kaXNhYmxlZCA9IChwZW5kaW5nID4gMCkgfHwgbmVlZHNBY2s7XG4gICAgc3VibWl0QnRuLnRpdGxlID0gbmVlZHNBY2tcbiAgICAgID8gJ0Fja25vd2xlZGdlIHRoZSBwZXJzdWFzaW9uIHdhcm5pbmdzIGFib3ZlIGJlZm9yZSBzdWJtaXR0aW5nJ1xuICAgICAgOiAnJztcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBzdWJtaXRSZXdyaXRlRGVjaXNpb25zKCkge1xuICBpZiAoIXBlcnN1YXNpb25XYXJuaW5nc0Fja25vd2xlZGdlZCkge1xuICAgIGNvbnN0IHByb2NlZWQgPSBhd2FpdCBzaG93Q29uZmlybU1vZGFsKFxuICAgICAgJ1x1MjZBMFx1RkUwRiBQZXJzdWFzaW9uIENoZWNrcycsXG4gICAgICAnVGhlcmUgYXJlIHVuYWNrbm93bGVkZ2VkIHBlcnN1YXNpb24gd2FybmluZ3MuIEl0IGlzIHJlY29tbWVuZGVkIHlvdSByZXZpZXcgYW5kIGFja25vd2xlZGdlIHRoZW0gZmlyc3QuXFxuXFxuUHJvY2VlZCBhbnl3YXk/JyxcbiAgICAgICdTdWJtaXQgQW55d2F5J1xuICAgICk7XG4gICAgaWYgKCFwcm9jZWVkKSByZXR1cm47XG4gIH1cbiAgLyogZHVja2Zsb3c6XG4gICAqICAgaWQ6IHJld3JpdGVfdWlfc3VibWl0X2xpdmVcbiAgICogICBraW5kOiB1aVxuICAgKiAgIHRpbWVzdGFtcDogJzIwMjYtMDMtMjVUMjE6Mzk6NDhaJ1xuICAgKiAgIHN0YXR1czogbGl2ZVxuICAgKiAgIGhhbmRsZXM6XG4gICAqICAgLSB1aTpyZXdyaXRlLXJldmlldy5zdWJtaXRcbiAgICogICBjYWxsczpcbiAgICogICAtIFBPU1QgL2FwaS9yZXdyaXRlcy9hcHByb3ZlXG4gICAqICAgLSBQT1NUIC9hcGkvY3YvbGF5b3V0LWVzdGltYXRlXG4gICAqICAgcmVhZHM6XG4gICAqICAgLSB3aW5kb3c6cmV3cml0ZURlY2lzaW9uc1xuICAgKiAgIHdyaXRlczpcbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL3Jld3JpdGVzL2FwcHJvdmUuZGVjaXNpb25zXG4gICAqICAgbm90ZXM6IFN1Ym1pdHMgdGhlIGZpbmFsIHBlci1yZXdyaXRlIG91dGNvbWVzIGFuZCBlZGl0ZWQgdGV4dCBzbyBiYWNrZW5kIHN0YXRlIGNhbiBwZXJzaXN0IGFwcHJvdmVkIHJld3JpdGVzIGFuZCB0aGUgZnVsbCByZXdyaXRlIGF1ZGl0IGJlZm9yZSBzcGVsbC1jaGVjay5cbiAgICovXG4gIGNvbnN0IGRlY2lzaW9ucyA9IE9iamVjdC5lbnRyaWVzKHJld3JpdGVEZWNpc2lvbnMpLm1hcCgoW2lkLCBkZWNdKSA9PiAoe1xuICAgIGlkLFxuICAgIG91dGNvbWU6ICAgIGRlYy5vdXRjb21lLFxuICAgIGZpbmFsX3RleHQ6IGRlYy5maW5hbF90ZXh0ID8/IG51bGxcbiAgfSkpO1xuXG4gIGNvbnN0IGxvYWRpbmdNc2cgPSBhcHBlbmRMb2FkaW5nTWVzc2FnZSgnU3VibWl0dGluZyByZXdyaXRlIGRlY2lzaW9ucy4uLicpO1xuICBzZXRMb2FkaW5nKHRydWUsICdTdWJtaXR0aW5nIHJld3JpdGUgZGVjaXNpb25zXHUyMDI2Jyk7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvcmV3cml0ZXMvYXBwcm92ZScsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGRlY2lzaW9ucyB9KVxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIHJlbW92ZUxvYWRpbmdNZXNzYWdlKGxvYWRpbmdNc2cpO1xuICAgIHNldExvYWRpbmcoZmFsc2UpO1xuXG4gICAgaWYgKCFyZXMub2spIHtcbiAgICAgIGFwcGVuZFJldHJ5TWVzc2FnZSgnXHUyNzRDIEVycm9yOiAnICsgKGRhdGEuZXJyb3IgfHwgJ0ZhaWxlZCB0byBzdWJtaXQgcmV3cml0ZSBkZWNpc2lvbnMnKSwgc3VibWl0UmV3cml0ZURlY2lzaW9ucyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYWNjZXB0ZWQgPSBkYXRhLmFwcHJvdmVkX2NvdW50IHx8IDA7XG4gICAgY29uc3QgcmVqZWN0ZWQgPSBkYXRhLnJlamVjdGVkX2NvdW50IHx8IDA7XG4gICAgc3RhdGVNYW5hZ2VyLm1hcmtDb250ZW50Q2hhbmdlZCgpO1xuICAgIF9jbGVhclBlcnNpc3RlZERlY2lzaW9ucygpO1xuICAgIF9jbGVhclJld3JpdGVTbmFwc2hvdCgpO1xuICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIGBcdTI3MDUgUmV3cml0ZSBkZWNpc2lvbnMgcmVjb3JkZWQ6ICR7YWNjZXB0ZWR9IGFjY2VwdGVkLCAke3JlamVjdGVkfSByZWplY3RlZC4gU3RhcnRpbmcgc3BlbGwgY2hlY2tcdTIwMjZgKTtcbiAgICBzY2hlZHVsZUF0c1JlZnJlc2goJ3Jldmlld19jaGVja3BvaW50Jyk7XG4gICAgc3dpdGNoVGFiKCdzcGVsbCcpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZW1vdmVMb2FkaW5nTWVzc2FnZShsb2FkaW5nTXNnKTtcbiAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICBhcHBlbmRSZXRyeU1lc3NhZ2UoJ1x1Mjc0QyBFcnJvcjogJyArIGVyci5tZXNzYWdlLCBzdWJtaXRSZXdyaXRlRGVjaXNpb25zKTtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgRXhwb3J0cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmZ1bmN0aW9uIHNldFBlcnN1YXNpb25XYXJuaW5nc0Fja25vd2xlZGdlZCh2YWx1ZSkge1xuICBwZXJzdWFzaW9uV2FybmluZ3NBY2tub3dsZWRnZWQgPSB2YWx1ZTtcbn1cblxuLyoqIEJ1bGstYWNjZXB0IGFsbCBwZW5kaW5nIHJld3JpdGUgY2FyZHMuICovXG5mdW5jdGlvbiBhY2NlcHRBbGxSZXdyaXRlcygpIHtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnJld3JpdGUtY2FyZCcpLmZvckVhY2goY2FyZCA9PiB7XG4gICAgY29uc3QgaWQgPSBjYXJkLmlkLnJlcGxhY2UoJ3J3LWNhcmQtJywgJycpO1xuICAgIGlmICghcmV3cml0ZURlY2lzaW9uc1tpZF0pIGFwcGx5UmV3cml0ZUFjdGlvbihpZCwgJ2FjY2VwdCcpO1xuICB9KTtcbiAgdXBkYXRlUmV3cml0ZVRhbGx5KCk7XG59XG5cbi8qKiBCdWxrLXJlamVjdCBhbGwgcGVuZGluZyByZXdyaXRlIGNhcmRzLiAqL1xuZnVuY3Rpb24gcmVqZWN0QWxsUmV3cml0ZXMoKSB7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5yZXdyaXRlLWNhcmQnKS5mb3JFYWNoKGNhcmQgPT4ge1xuICAgIGNvbnN0IGlkID0gY2FyZC5pZC5yZXBsYWNlKCdydy1jYXJkLScsICcnKTtcbiAgICBpZiAoIXJld3JpdGVEZWNpc2lvbnNbaWRdKSBhcHBseVJld3JpdGVBY3Rpb24oaWQsICdyZWplY3QnKTtcbiAgfSk7XG4gIHVwZGF0ZVJld3JpdGVUYWxseSgpO1xufVxuXG4vKiogVG9nZ2xlIGNvbXBhY3QgKHNpbmdsZS1saW5lKSBjYXJkIGRpc3BsYXkgZm9yIHJhcGlkIHJldmlldy4gKi9cbmZ1bmN0aW9uIHRvZ2dsZVJld3JpdGVDb21wYWN0TW9kZSgpIHtcbiAgY29uc3QgY2FyZHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmV3cml0ZS1jYXJkcycpO1xuICBjb25zdCBidG4gICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdydy1jb21wYWN0LWJ0bicpO1xuICBpZiAoIWNhcmRzKSByZXR1cm47XG4gIGNvbnN0IGlzQ29tcGFjdCA9IGNhcmRzLmNsYXNzTGlzdC50b2dnbGUoJ2NvbXBhY3QtbW9kZScpO1xuICBpZiAoYnRuKSB7XG4gICAgYnRuLmNsYXNzTGlzdC50b2dnbGUoJ2FjdGl2ZScsIGlzQ29tcGFjdCk7XG4gICAgYnRuLnRleHRDb250ZW50ID0gaXNDb21wYWN0ID8gJ1x1MjI5RiBGdWxsIFZpZXcnIDogJ1x1MjI5RSBDb21wYWN0JztcbiAgICBidG4udGl0bGUgPSBpc0NvbXBhY3QgPyAnU3dpdGNoIHRvIGZ1bGwgY2FyZCB2aWV3JyA6ICdTd2l0Y2ggdG8gY29tcGFjdCBzaW5nbGUtbGluZSB2aWV3IGZvciByYXBpZCByZXZpZXcnO1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIHJld3JpdGVEZWNpc2lvbnMsXG4gIF9yZXdyaXRlUGFuZWxDYWNoZSxcbiAgcGVyc3Vhc2lvbldhcm5pbmdzQWNrbm93bGVkZ2VkLFxuICBzZXRQZXJzdWFzaW9uV2FybmluZ3NBY2tub3dsZWRnZWQsXG4gIGZldGNoQW5kUmV2aWV3UmV3cml0ZXMsXG4gIHJlbmRlclJld3JpdGVQYW5lbCxcbiAgY29tcHV0ZVdvcmREaWZmLFxuICByZW5kZXJEaWZmSHRtbCxcbiAgcmVuZGVyUmV3cml0ZUNhcmQsXG4gIGFwcGx5UmV3cml0ZUFjdGlvbixcbiAgc2F2ZVJld3JpdGVFZGl0LFxuICB1cGRhdGVSZXdyaXRlVGFsbHksXG4gIHN1Ym1pdFJld3JpdGVEZWNpc2lvbnMsXG4gIGFjY2VwdEFsbFJld3JpdGVzLFxuICByZWplY3RBbGxSZXdyaXRlcyxcbiAgdG9nZ2xlUmV3cml0ZUNvbXBhY3RNb2RlLFxufTtcblxuc3luY1Jld3JpdGVHbG9iYWxzKCk7XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9zcGVsbC1jaGVjay5qc1xuICogU3BlbGwgJiBncmFtbWFyIGNoZWNrIHRhYjogZmV0Y2ggc2VjdGlvbnMsIHJlbmRlciBzdWdnZXN0aW9ucyxcbiAqIGFwcGx5L2Rpc21pc3MgY29ycmVjdGlvbnMsIHN1Ym1pdCBhdWRpdC5cbiAqXG4gKiBEZXBlbmRlbmNpZXMgKHJlc29sdmVkIHRocm91Z2ggZ2xvYmFsVGhpcyBhdCBydW50aW1lKTpcbiAqICAgZXNjYXBlSHRtbCwgYXBwZW5kTG9hZGluZ01lc3NhZ2UsIHJlbW92ZUxvYWRpbmdNZXNzYWdlLCBhcHBlbmRNZXNzYWdlLFxuICogICBzaG93QWxlcnRNb2RhbCwgc2hvd0NvbmZpcm1Nb2RhbCwgc2V0TG9hZGluZywgZmV0Y2hTdGF0dXMsIHNlbmRBY3Rpb24sXG4gKiAgIHNjaGVkdWxlQXRzUmVmcmVzaCwgQ1NTXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdzcGVsbC1jaGVjaycpO1xuXG5pbXBvcnQgeyBzdGF0ZU1hbmFnZXIgfSBmcm9tICcuL3N0YXRlLW1hbmFnZXIuanMnO1xuXG4vLyBNb2R1bGUtbGV2ZWwgc3RhdGVcbmxldCBzcGVsbEF1ZGl0ID0gW107XG5sZXQgX3NwZWxsQ2hlY2tDYWNoZSA9IG51bGw7XG5cbi8vIFx1MjUwMFx1MjUwMCBQb3B1bGF0ZSBzcGVsbC1jaGVjayB0YWIgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIHBvcHVsYXRlU3BlbGxDaGVja1RhYigpIHtcbiAgLy8gSWYgd2UgaGF2ZSBjYWNoZWQgcmVzdWx0cyBmcm9tIGEgcHJldmlvdXMgcnVuLCByZS1yZW5kZXIgZnJvbSBjYWNoZVxuICAvLyBpbnN0ZWFkIG9mIHJlLXJ1bm5pbmcgTGFuZ3VhZ2VUb29sIG9uIGV2ZXJ5IGJhY2stbmF2aWdhdGlvbi5cbiAgaWYgKHdpbmRvdy5fc3BlbGxDaGVja0NhY2hlKSB7XG4gICAgY29uc3QgYyA9IHdpbmRvdy5fc3BlbGxDaGVja0NhY2hlO1xuICAgIGlmIChjLnR5cGUgPT09ICd6ZXJvJykge1xuICAgICAgcmVuZGVyU3BlbGxDaGVja1plcm9TdGF0ZShjLm1lc3NhZ2UsIGMuc3RhdHNMaW5lLCBjLmN1c3RvbURpY3RTaXplKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gICAgICBjb250ZW50LmlubmVySFRNTCA9IGBcbiAgICAgICAgPGgxPlx1RDgzRFx1REQyNCBTcGVsbCAmYW1wOyBHcmFtbWFyIENoZWNrPC9oMT5cbiAgICAgICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO21hcmdpbi1ib3R0b206MjRweDtcIj5SZXZpZXcgc3BlbGxpbmcgYW5kIGdyYW1tYXIgc3VnZ2VzdGlvbnMuPC9wPlxuICAgICAgICA8ZGl2IGlkPVwic3BlbGwtcmVzdWx0c1wiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPjwvZGl2PlxuICAgICAgYDtcbiAgICAgIHJlbmRlclNwZWxsU3VnZ2VzdGlvbnMoYy5mbGFnZ2VkU2VjdGlvbnMsIGMudG90YWxTZWN0aW9ucywgYy5zdGF0cywgYy5jdXN0b21EaWN0U2l6ZSk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9jdW1lbnQtY29udGVudCcpO1xuICBjb250ZW50LmlubmVySFRNTCA9IGBcbiAgICA8aDE+XHVEODNEXHVERDI0IFNwZWxsICZhbXA7IEdyYW1tYXIgQ2hlY2s8L2gxPlxuICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDttYXJnaW4tYm90dG9tOjI0cHg7XCI+Q2hlY2tpbmcgQ1Ygc2VjdGlvbnMgZm9yIHNwZWxsaW5nIGFuZCBncmFtbWFyIGlzc3Vlc1x1MjAyNjwvcD5cbiAgICA8ZGl2IGlkPVwic3BlbGwtbG9hZGluZ1wiIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7cGFkZGluZzo0MHB4O1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImxvYWRpbmctc3Bpbm5lclwiPjwvZGl2PlxuICAgICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO21hcmdpbi10b3A6MTJweDtcIj5SdW5uaW5nIExhbmd1YWdlVG9vbCBjaGVja3NcdTIwMjY8L3A+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBpZD1cInNwZWxsLXJlc3VsdHNcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj48L2Rpdj5cbiAgYDtcbiAgc3BlbGxBdWRpdCA9IFtdO1xuICB3aW5kb3cuX3NwZWxsU3VnTWFwID0ge307XG5cbiAgdHJ5IHtcbiAgICAvLyBGZXRjaCBzZWN0aW9ucyB0byBjaGVja1xuICAgIGNvbnN0IHNlY3Rpb25zUmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvc3BlbGwtY2hlY2stc2VjdGlvbnMnKTtcbiAgICBjb25zdCBzZWN0aW9uc0RhdGEgPSBhd2FpdCBzZWN0aW9uc1Jlcy5qc29uKCk7XG4gICAgaWYgKCFzZWN0aW9uc0RhdGEub2spIHtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzcGVsbC1sb2FkaW5nJykuaW5uZXJIVE1MID0gYDxwIGNsYXNzPVwiZXJyb3ItbWVzc2FnZVwiPkZhaWxlZCB0byBsb2FkIHNlY3Rpb25zOiAke3NlY3Rpb25zRGF0YS5lcnJvciB8fCAnVW5rbm93biBlcnJvcid9PC9wPmA7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2VjdGlvbnMgPSBzZWN0aW9uc0RhdGEuc2VjdGlvbnMgfHwgW107XG4gICAgaWYgKHNlY3Rpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmVuZGVyU3BlbGxDaGVja1plcm9TdGF0ZSgnTm8gQ1Ygc2VjdGlvbnMgYXJlIGF2YWlsYWJsZSB0byBjaGVjay4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBlYWNoIHNlY3Rpb25cbiAgICBjb25zdCBmbGFnZ2VkU2VjdGlvbnMgPSBbXTtcbiAgICBjb25zdCBhZ2dyZWdhdGVTdGF0cyA9IHNlY3Rpb25zRGF0YS5hZ2dyZWdhdGVfc3RhdHMgfHwge307XG4gICAgbGV0IGluY29ycmVjdFdvcmRzID0gMDtcbiAgICBsZXQgZ3JhbW1hcklzc3VlcyA9IDA7XG4gICAgbGV0IGN1c3RvbURpY3RTaXplID0gc2VjdGlvbnNEYXRhLmN1c3RvbV9kaWN0X3NpemUgfHwgMDtcbiAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2Ygc2VjdGlvbnMpIHtcbiAgICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9zcGVsbC1jaGVjaycsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHRleHQ6IHNlY3Rpb24udGV4dCwgY29udGV4dDogc2VjdGlvbi5jb250ZXh0IH0pXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3RhdHMpIHtcbiAgICAgICAgaWYgKGRhdGEuY3VzdG9tX2RpY3Rfc2l6ZSkgY3VzdG9tRGljdFNpemUgPSBkYXRhLmN1c3RvbV9kaWN0X3NpemU7XG4gICAgICAgIGluY29ycmVjdFdvcmRzICs9IGRhdGEuc3RhdHMudW5rbm93bl93b3JkX2NvdW50IHx8IDA7XG4gICAgICAgIGdyYW1tYXJJc3N1ZXMgKz0gZGF0YS5zdGF0cy5ncmFtbWFyX2lzc3VlX2NvdW50IHx8IDA7XG4gICAgICB9XG4gICAgICBpZiAoZGF0YS5vayAmJiBkYXRhLnN1Z2dlc3Rpb25zICYmIGRhdGEuc3VnZ2VzdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICBmbGFnZ2VkU2VjdGlvbnMucHVzaCh7IHNlY3Rpb24sIHN1Z2dlc3Rpb25zOiBkYXRhLnN1Z2dlc3Rpb25zIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzcGVsbC1sb2FkaW5nJykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgIGlmIChmbGFnZ2VkU2VjdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZW5kZXJTcGVsbENoZWNrWmVyb1N0YXRlKFxuICAgICAgICAnU3BlbGwgY2hlY2sgcGFzc2VkIFx1MjAxNCBubyBpc3N1ZXMgZm91bmQuJyxcbiAgICAgICAgYnVpbGRTcGVsbFN0YXRzU3VtbWFyeSh7XG4gICAgICAgICAgdG90YWxfc2VjdGlvbnM6IHNlY3Rpb25zLmxlbmd0aCxcbiAgICAgICAgICB0b3RhbF93b3JkczogYWdncmVnYXRlU3RhdHMud29yZF9jb3VudCB8fCAwLFxuICAgICAgICAgIHVuaXF1ZV93b3JkczogYWdncmVnYXRlU3RhdHMudW5pcXVlX3dvcmRzIHx8IDAsXG4gICAgICAgICAgY3VzdG9tX2RpY3Rfd29yZHM6IGFnZ3JlZ2F0ZVN0YXRzLmN1c3RvbV9kaWN0X3dvcmRzIHx8IDAsXG4gICAgICAgICAgaW5jb3JyZWN0X3dvcmRzOiBpbmNvcnJlY3RXb3JkcyxcbiAgICAgICAgICBncmFtbWFyX2lzc3VlczogZ3JhbW1hcklzc3VlcyxcbiAgICAgICAgfSksXG4gICAgICAgIGN1c3RvbURpY3RTaXplLFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBSZW5kZXIgc3VnZ2VzdGlvbnMgcGFuZWxcbiAgICByZW5kZXJTcGVsbFN1Z2dlc3Rpb25zKGZsYWdnZWRTZWN0aW9ucywgc2VjdGlvbnMubGVuZ3RoLCB7XG4gICAgICB0b3RhbF9zZWN0aW9uczogc2VjdGlvbnMubGVuZ3RoLFxuICAgICAgdG90YWxfd29yZHM6IGFnZ3JlZ2F0ZVN0YXRzLndvcmRfY291bnQgfHwgMCxcbiAgICAgIHVuaXF1ZV93b3JkczogYWdncmVnYXRlU3RhdHMudW5pcXVlX3dvcmRzIHx8IDAsXG4gICAgICBjdXN0b21fZGljdF93b3JkczogYWdncmVnYXRlU3RhdHMuY3VzdG9tX2RpY3Rfd29yZHMgfHwgMCxcbiAgICAgIGluY29ycmVjdF93b3JkczogaW5jb3JyZWN0V29yZHMsXG4gICAgICBncmFtbWFyX2lzc3VlczogZ3JhbW1hcklzc3VlcyxcbiAgICB9LCBjdXN0b21EaWN0U2l6ZSk7XG5cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLmVycm9yKCdTcGVsbCBjaGVjayBlcnJvcjonLCBlcnIpO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzcGVsbC1sb2FkaW5nJykuaW5uZXJIVE1MID0gYDxwIHN0eWxlPVwiY29sb3I6I2VmNDQ0NDtwYWRkaW5nOjIwcHg7XCI+U3BlbGwgY2hlY2sgZmFpbGVkOiAke2Vyci5tZXNzYWdlfTwvcD5gO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBaZXJvLXN0YXRlIHNwZWxsIHN0YWdlIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiByZW5kZXJTcGVsbENoZWNrWmVyb1N0YXRlKG1lc3NhZ2UsIHN0YXRzTGluZSA9ICcnLCBjdXN0b21EaWN0U2l6ZSA9IDApIHtcbiAgd2luZG93Ll9zcGVsbENoZWNrQ2FjaGUgPSB7IHR5cGU6ICd6ZXJvJywgbWVzc2FnZSwgc3RhdHNMaW5lLCBjdXN0b21EaWN0U2l6ZSB9O1xuICBfc3BlbGxDaGVja0NhY2hlID0gd2luZG93Ll9zcGVsbENoZWNrQ2FjaGU7XG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9jdW1lbnQtY29udGVudCcpO1xuICBjb25zdCBzdGF0c1BhcnRzID0gW107XG4gIGlmIChzdGF0c0xpbmUpIHN0YXRzUGFydHMucHVzaChgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO2ZvbnQtc2l6ZTowLjk1ZW07bWFyZ2luOjhweCAwIDA7XCI+JHtlc2NhcGVIdG1sKHN0YXRzTGluZSl9PC9wPmApO1xuICBpZiAoY3VzdG9tRGljdFNpemUgPiAwKSBzdGF0c1BhcnRzLnB1c2goYDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtmb250LXNpemU6MC45ZW07bWFyZ2luOjRweCAwIDA7XCI+Q3VzdG9tIGRpY3Rpb25hcnk6ICR7Y3VzdG9tRGljdFNpemUudG9Mb2NhbGVTdHJpbmcoKX0gd29yZCR7Y3VzdG9tRGljdFNpemUgIT09IDEgPyAncycgOiAnJ308L3A+YCk7XG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjtwYWRkaW5nOjYwcHggMjBweDtcIj5cbiAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6M2VtO21hcmdpbi1ib3R0b206MTZweDtcIj5cdTI3MDU8L2Rpdj5cbiAgICAgIDxoMiBzdHlsZT1cImNvbG9yOiMxNjY1MzQ7XCI+JHtlc2NhcGVIdG1sKG1lc3NhZ2UpfTwvaDI+XG4gICAgICAke3N0YXRzUGFydHMuam9pbignXFxuJyl9XG4gICAgICA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7bWFyZ2luOjE2cHggMCAyNHB4O1wiPkNvbnRpbnVlIHdoZW4geW91IGFyZSByZWFkeSB0byBnZW5lcmF0ZSB5b3VyIENWLjwvcD5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJzdWJtaXQtYnRuXCIgb25jbGljaz1cInN1Ym1pdEVtcHR5U3BlbGxDaGVjaygpXCIgdGl0bGU9XCJHZW5lcmF0ZSBhbiBIVE1MIHByZXZpZXcgb2YgeW91ciBDViBcdTIwMTQgeW91IHdpbGwgcmV2aWV3IHRoZSBsYXlvdXQgYmVmb3JlIGZpbmFsIERPQ1gvUERGIGZpbGVzIGFyZSBwcm9kdWNlZFwiPkdlbmVyYXRlIFByZXZpZXcgXHUyMTkyPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIGA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN1Ym1pdEVtcHR5U3BlbGxDaGVjaygpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvc3BlbGwtY2hlY2stY29tcGxldGUnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBzcGVsbF9hdWRpdDogW10gfSlcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoIXJlcy5vaykge1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsIGBGYWlsZWQgdG8gc2F2ZSBzcGVsbCBjaGVjazogJHtkYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yJ31gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcHJvY2VlZCA9IGF3YWl0IF9jb25maXJtUHJvY2VlZFRvR2VuZXJhdGUoKTtcbiAgICBpZiAoIXByb2NlZWQpIHJldHVybjtcbiAgICBzdGF0ZU1hbmFnZXIubWFya0NvbnRlbnRDaGFuZ2VkKCk7XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ1x1MjcwNSBTcGVsbCBjaGVjayBjb21wbGV0ZSBcdTIwMTQgbm8gaXNzdWVzIHJlcXVpcmVkIGNoYW5nZXMuIEdlbmVyYXRpbmcgeW91ciBDVlx1MjAyNicpO1xuICAgIHNjaGVkdWxlQXRzUmVmcmVzaCgncmV2aWV3X2NoZWNrcG9pbnQnKTtcbiAgICBhd2FpdCBmZXRjaFN0YXR1cygpO1xuICAgIGF3YWl0IHNlbmRBY3Rpb24oJ2dlbmVyYXRlX2N2Jyk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCBgU3BlbGwgY2hlY2sgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIFN0YXRzIHN1bW1hcnkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIGJ1aWxkU3BlbGxTdGF0c1N1bW1hcnkoc3RhdHMgPSB7fSkge1xuICByZXR1cm4gW1xuICAgIGAkeyhzdGF0cy50b3RhbF9zZWN0aW9ucyB8fCAwKS50b0xvY2FsZVN0cmluZygpfSBzZWN0aW9uJHtzdGF0cy50b3RhbF9zZWN0aW9ucyA9PT0gMSA/ICcnIDogJ3MnfSBjaGVja2VkYCxcbiAgICBgJHsoc3RhdHMudG90YWxfd29yZHMgfHwgMCkudG9Mb2NhbGVTdHJpbmcoKX0gd29yZHNgLFxuICAgIGAkeyhzdGF0cy51bmlxdWVfd29yZHMgfHwgMCkudG9Mb2NhbGVTdHJpbmcoKX0gdW5pcXVlYCxcbiAgICBgJHsoc3RhdHMuY3VzdG9tX2RpY3Rfd29yZHMgfHwgMCkudG9Mb2NhbGVTdHJpbmcoKX0gY3VzdG9tIGRpY3Rpb25hcnkgbWF0Y2gke3N0YXRzLmN1c3RvbV9kaWN0X3dvcmRzID09PSAxID8gJycgOiAnZXMnfWAsXG4gICAgYCR7KHN0YXRzLmluY29ycmVjdF93b3JkcyB8fCAwKS50b0xvY2FsZVN0cmluZygpfSB1bmtub3duL2luY29ycmVjdGAsXG4gICAgYCR7KHN0YXRzLmdyYW1tYXJfaXNzdWVzIHx8IDApLnRvTG9jYWxlU3RyaW5nKCl9IGdyYW1tYXIgaXNzdWUke3N0YXRzLmdyYW1tYXJfaXNzdWVzID09PSAxID8gJycgOiAncyd9YCxcbiAgXS5qb2luKCcgXHUwMEI3ICcpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgUmVuZGVyIHN1Z2dlc3Rpb25zIHBhbmVsIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiByZW5kZXJTcGVsbFN1Z2dlc3Rpb25zKGZsYWdnZWRTZWN0aW9ucywgdG90YWxTZWN0aW9ucywgc3RhdHMgPSB7fSwgY3VzdG9tRGljdFNpemUgPSAwKSB7XG4gIHdpbmRvdy5fc3BlbGxDaGVja0NhY2hlID0geyB0eXBlOiAnc3VnZ2VzdGlvbnMnLCBmbGFnZ2VkU2VjdGlvbnMsIHRvdGFsU2VjdGlvbnMsIHN0YXRzLCBjdXN0b21EaWN0U2l6ZSB9O1xuICBfc3BlbGxDaGVja0NhY2hlID0gd2luZG93Ll9zcGVsbENoZWNrQ2FjaGU7XG4gIGNvbnN0IHJlc3VsdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3BlbGwtcmVzdWx0cycpO1xuICByZXN1bHRzLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgY29uc3Qgc3RhdHNMaW5lID0gYnVpbGRTcGVsbFN0YXRzU3VtbWFyeShzdGF0cyk7XG5cbiAgbGV0IGh0bWwgPSBgXG4gICAgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2ZlZjljMztib3JkZXI6MXB4IHNvbGlkICNmZGUwNDc7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzoxMnB4IDE2cHg7bWFyZ2luLWJvdHRvbToyNHB4O1wiPlxuICAgICAgPHN0cm9uZz5cdTI2QTAgJHtmbGFnZ2VkU2VjdGlvbnMucmVkdWNlKCh0LCBmKSA9PiB0ICsgZi5zdWdnZXN0aW9ucy5sZW5ndGgsIDApfSBpc3N1ZSR7ZmxhZ2dlZFNlY3Rpb25zLnJlZHVjZSgodCwgZikgPT4gdCArIGYuc3VnZ2VzdGlvbnMubGVuZ3RoLCAwKSAhPT0gMSA/ICdzJyA6ICcnfTwvc3Ryb25nPiBmb3VuZFxuICAgICAgYWNyb3NzICR7ZmxhZ2dlZFNlY3Rpb25zLmxlbmd0aH0gb2YgJHt0b3RhbFNlY3Rpb25zfSBzZWN0aW9uJHt0b3RhbFNlY3Rpb25zICE9PSAxID8gJ3MnIDogJyd9LlxuICAgICAgUmV2aWV3IGVhY2ggc3VnZ2VzdGlvbiBiZWxvdywgdGhlbiBjbGljayA8c3Ryb25nPkRvbmU8L3N0cm9uZz4uXG4gICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDo4cHg7Zm9udC1zaXplOjAuOTJlbTtjb2xvcjojNmI3MjgwO1wiPiR7ZXNjYXBlSHRtbChzdGF0c0xpbmUpfTwvZGl2PlxuICAgICAgJHtjdXN0b21EaWN0U2l6ZSA+IDAgPyBgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6NHB4O2ZvbnQtc2l6ZTowLjg4ZW07Y29sb3I6IzZiNzI4MDtcIj5DdXN0b20gZGljdGlvbmFyeSBzaXplOiAke2N1c3RvbURpY3RTaXplLnRvTG9jYWxlU3RyaW5nKCl9IHdvcmQke2N1c3RvbURpY3RTaXplICE9PSAxID8gJ3MnIDogJyd9PC9kaXY+YCA6ICcnfVxuICAgIDwvZGl2PlxuICBgO1xuXG4gIGNvbnN0IF9zdWdTZXZlcml0eSA9IChzdWcpID0+IHtcbiAgICBjb25zdCByaWQgPSAoc3VnLnJ1bGVfaWQgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgY2F0ID0gKHN1Zy5jYXRlZ29yeSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoL3NwZWxsfHR5cG98bWlzc3BlbGwvLnRlc3QocmlkKSB8fCAvdHlwby8udGVzdChjYXQpKSByZXR1cm4gMDtcbiAgICBpZiAoL2dyYW1tYXJ8YWdyZWVtZW50fHZlcmJ8dGVuc2V8YXJ0aWNsZS8udGVzdChyaWQpIHx8IC9ncmFtbWFyLy50ZXN0KGNhdCkpIHJldHVybiAxO1xuICAgIGlmICgvc3R5bGV8cmVkdW5kYW58d29yZHkvLnRlc3QocmlkKSB8fCAvc3R5bGUvLnRlc3QoY2F0KSkgcmV0dXJuIDI7XG4gICAgcmV0dXJuIDM7XG4gIH07XG5cbiAgZmxhZ2dlZFNlY3Rpb25zLmZvckVhY2goKHsgc2VjdGlvbiwgc3VnZ2VzdGlvbnM6IHJhd1N1Z2dlc3Rpb25zIH0pID0+IHtcbiAgICBjb25zdCBzdWdnZXN0aW9ucyA9IFsuLi5yYXdTdWdnZXN0aW9uc10uc29ydCgoYSwgYikgPT4gX3N1Z1NldmVyaXR5KGEpIC0gX3N1Z1NldmVyaXR5KGIpKTtcbiAgICBodG1sICs9IGA8ZGl2IGNsYXNzPVwicmV2aWV3LXNlY3Rpb25cIiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MjRweDtcIj5cbiAgICAgIDxoMyBzdHlsZT1cImZvbnQtc2l6ZToxZW07Zm9udC13ZWlnaHQ6NzAwO2NvbG9yOiMzNzQxNTE7bWFyZ2luLWJvdHRvbToxMnB4O1wiPiR7ZXNjYXBlSHRtbChzZWN0aW9uLmxhYmVsKX08L2gzPlxuICAgICAgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2Y4ZmFmYztib3JkZXI6MXB4IHNvbGlkICNlMmU4ZjA7Ym9yZGVyLXJhZGl1czo2cHg7cGFkZGluZzoxMHB4IDE0cHg7bWFyZ2luLWJvdHRvbToxMHB4O2ZvbnQtc2l6ZTowLjllbTt3aGl0ZS1zcGFjZTpwcmUtd3JhcDtcIj4ke2VzY2FwZUh0bWwoc2VjdGlvbi50ZXh0KX08L2Rpdj5cbiAgICBgO1xuICAgIHN1Z2dlc3Rpb25zLmZvckVhY2goKHN1ZywgaWR4KSA9PiB7XG4gICAgICBjb25zdCBzdWdJZCA9IGBzdWdfJHtzZWN0aW9uLmlkfV8ke2lkeH1gO1xuICAgICAgY29uc3QgcmVwcyA9IHN1Zy5yZXBsYWNlbWVudHMgfHwgW107XG4gICAgICBodG1sICs9IGBcbiAgICAgICAgPGRpdiBjbGFzcz1cInNwZWxsLXN1Z2dlc3Rpb25cIiBpZD1cIiR7c3VnSWR9XCIgZGF0YS1zZWN0aW9uLWlkPVwiJHtlc2NhcGVIdG1sKHNlY3Rpb24uaWQpfVwiIGRhdGEtaWR4PVwiJHtpZHh9XCJcbiAgICAgICAgICAgICBzdHlsZT1cImJvcmRlcjoxcHggc29saWQgI2UyZThmMDtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjEwcHggMTRweDttYXJnaW4tYm90dG9tOjhweDtiYWNrZ3JvdW5kOiNmZmY7XCI+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpmbGV4LXN0YXJ0O2dhcDoxMHB4O1wiPlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZsZXg6MTtcIj5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjg4ZW07Y29sb3I6IzZiNzI4MDttYXJnaW4tYm90dG9tOjRweDtcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cImJhY2tncm91bmQ6I2ZlZTJlMjtjb2xvcjojZGMyNjI2O2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6MXB4IDZweDtmb250LXdlaWdodDo2MDA7XCI+JHtlc2NhcGVIdG1sKHN1Zy5mbGFnZ2VkKX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJtYXJnaW4tbGVmdDo4cHg7XCI+JHtlc2NhcGVIdG1sKHN1Zy5tZXNzYWdlKX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zdHlsZTppdGFsaWM7Zm9udC1zaXplOjAuODVlbTtjb2xvcjojMzc0MTUxO21hcmdpbi1ib3R0b206OHB4O1wiPiR7ZXNjYXBlSHRtbChzdWcuc25pcHBldCl9PC9kaXY+XG4gICAgICAgICAgICAgICR7cmVwcy5sZW5ndGggPiAwID8gYFxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2ZsZXgtd3JhcDp3cmFwO2dhcDo2cHg7bWFyZ2luLWJvdHRvbTo4cHg7XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC44MmVtO2NvbG9yOiM2YjcyODA7YWxpZ24tc2VsZjpjZW50ZXI7XCI+U3VnZ2VzdGlvbnM6PC9zcGFuPlxuICAgICAgICAgICAgICAgICR7cmVwcy5tYXAoKHIsIHJpKSA9PiBgPGJ1dHRvbiBjbGFzcz1cInJld3JpdGUta2V5d29yZFwiIG9uY2xpY2s9XCJhcHBseVNwZWxsUmVwbGFjZW1lbnQoJyR7ZXNjYXBlSHRtbChzZWN0aW9uLmlkKX0nLCAke2lkeH0sICR7cml9KVwiXG4gICAgICAgICAgICAgICAgICBzdHlsZT1cImN1cnNvcjpwb2ludGVyO2JvcmRlcjoxcHggc29saWQgIzNiODJmNjtiYWNrZ3JvdW5kOiNkYmVhZmU7XCI+JHtlc2NhcGVIdG1sKHIpfTwvYnV0dG9uPmApLmpvaW4oJycpfVxuICAgICAgICAgICAgICA8L2Rpdj5gIDogJyd9XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDo2cHg7bWFyZ2luLWJvdHRvbTo4cHg7XCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJlZGl0XyR7c3VnSWR9XCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiVHlwZSBjdXN0b20gY29ycmVjdGlvblx1MjAyNlwiXG4gICAgICAgICAgICAgICAgICB2YWx1ZT1cIiR7ZXNjYXBlSHRtbChyZXBzWzBdIHx8ICcnKX1cIlxuICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmbGV4OjE7Zm9udC1zaXplOjAuODhlbTtwYWRkaW5nOjRweCA4cHg7Ym9yZGVyOjFweCBzb2xpZCAjZDFkNWRiO2JvcmRlci1yYWRpdXM6NHB4O1wiXG4gICAgICAgICAgICAgICAgICBvbmtleWRvd249XCJpZihldmVudC5rZXk9PT0nRW50ZXInKXtldmVudC5wcmV2ZW50RGVmYXVsdCgpO2FwcGx5Q3VzdG9tU3BlbGxDb3JyZWN0aW9uKCcke2VzY2FwZUh0bWwoc2VjdGlvbi5pZCl9Jywke2lkeH0pO31cIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBvbmNsaWNrPVwiYXBwbHlDdXN0b21TcGVsbENvcnJlY3Rpb24oJyR7ZXNjYXBlSHRtbChzZWN0aW9uLmlkKX0nLCR7aWR4fSlcIiB0aXRsZT1cIkFwcGx5IGN1c3RvbSBjb3JyZWN0aW9uXCIgYXJpYS1sYWJlbD1cIkFwcGx5IGN1c3RvbSBjb3JyZWN0aW9uXCI+QXBwbHk8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjhweDtmbGV4LXdyYXA6d3JhcDtcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBvbmNsaWNrPVwiZGlzbWlzc1NwZWxsU3VnZ2VzdGlvbignJHtlc2NhcGVIdG1sKHN1Z0lkKX0nLCAnJHtlc2NhcGVIdG1sKHNlY3Rpb24uaWQpfScsICR7aWR4fSwgJyR7ZXNjYXBlSHRtbChzdWcuZmxhZ2dlZCl9JylcIlxuICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIklnbm9yZSB0aGlzIHN1Z2dlc3Rpb25cIiBhcmlhLWxhYmVsPVwiSWdub3JlIHRoaXMgc3VnZ2VzdGlvblwiPklnbm9yZTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIG9uY2xpY2s9XCJhZGRTcGVsbFdvcmQoJyR7ZXNjYXBlSHRtbChzdWcuZmxhZ2dlZCl9JywgJyR7ZXNjYXBlSHRtbChzdWdJZCl9JylcIlxuICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIkFkZCB0byBjdXN0b20gZGljdGlvbmFyeVwiIGFyaWEtbGFiZWw9XCJBZGQgdG8gY3VzdG9tIGRpY3Rpb25hcnlcIj5BZGQgdG8gRGljdGlvbmFyeTwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIGA7XG4gICAgICAvLyBSZWdpc3RlciBpbiBhdWRpdCBhcyBwZW5kaW5nXG4gICAgICBpZiAoIXdpbmRvdy5fc3BlbGxTdWdNYXApIHdpbmRvdy5fc3BlbGxTdWdNYXAgPSB7fTtcbiAgICAgIHdpbmRvdy5fc3BlbGxTdWdNYXBbYCR7c2VjdGlvbi5pZH1fJHtpZHh9YF0gPSB7XG4gICAgICAgIHNlY3Rpb25faWQ6ICAgIHNlY3Rpb24uaWQsXG4gICAgICAgIGNvbnRleHRfdHlwZTogc2VjdGlvbi5jb250ZXh0LFxuICAgICAgICBsb2NhdGlvbjogICAgIHNlY3Rpb24ubGFiZWwsXG4gICAgICAgIG9yaWdpbmFsOiAgICAgc3VnLmZsYWdnZWQsXG4gICAgICAgIHN1Z2dlc3Rpb246ICAgKHJlcHNbMF0gfHwgJycpLFxuICAgICAgICBvZmZzZXQ6ICAgICAgIHN1Zy5vZmZzZXQsXG4gICAgICAgIGxlbmd0aDogICAgICAgc3VnLmxlbmd0aCxcbiAgICAgICAgcnVsZTogICAgICAgICBzdWcucnVsZV9pZCB8fCAnJyxcbiAgICAgICAgb3V0Y29tZTogICAgICAncGVuZGluZycsXG4gICAgICAgIGZpbmFsOiAgICAgICAgc3VnLmZsYWdnZWQsXG4gICAgICB9O1xuICAgIH0pO1xuICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gIH0pO1xuXG4gIGh0bWwgKz0gYFxuICAgIDxkaXYgY2xhc3M9XCJuYXYtYnV0dG9uc1wiIHN0eWxlPVwibWFyZ2luOjI0cHggMDtcIj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJzdWJtaXQtYnRuXCIgb25jbGljaz1cInN1Ym1pdFNwZWxsQ2hlY2tEZWNpc2lvbnMoKVwiPkdlbmVyYXRlIFByZXZpZXcgXHUyMTkyPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIGA7XG4gIHJlc3VsdHMuaW5uZXJIVE1MID0gaHRtbDtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEFwcGx5IC8gZGlzbWlzcyBjb3JyZWN0aW9ucyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gYXBwbHlDdXN0b21TcGVsbENvcnJlY3Rpb24oc2VjdGlvbklkLCBpZHgpIHtcbiAgY29uc3Qga2V5ICAgID0gYCR7c2VjdGlvbklkfV8ke2lkeH1gO1xuICBjb25zdCBlbnRyeSAgPSAod2luZG93Ll9zcGVsbFN1Z01hcCB8fCB7fSlba2V5XTtcbiAgaWYgKCFlbnRyeSkgcmV0dXJuO1xuICBjb25zdCBpbnB1dCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgZWRpdF9zdWdfJHtzZWN0aW9uSWR9XyR7aWR4fWApO1xuICBjb25zdCBjdXN0b20gPSBpbnB1dCA/IGlucHV0LnZhbHVlLnRyaW0oKSA6ICcnO1xuICBpZiAoIWN1c3RvbSkgcmV0dXJuO1xuICBlbnRyeS5vdXRjb21lID0gJ2FjY2VwdCc7XG4gIGVudHJ5LmZpbmFsICAgPSBjdXN0b207XG4gIGNvbnN0IHN1Z0VsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgLnNwZWxsLXN1Z2dlc3Rpb25bZGF0YS1zZWN0aW9uLWlkPVwiJHtDU1MuZXNjYXBlKHNlY3Rpb25JZCl9XCJdW2RhdGEtaWR4PVwiJHtpZHh9XCJdYCk7XG4gIGlmICghc3VnRWwpIHJldHVybjtcbiAgY29uc3QgZmxhZ2dlZFNwYW4gPSBzdWdFbC5xdWVyeVNlbGVjdG9yKCdzcGFuW3N0eWxlKj1cImJhY2tncm91bmQ6I2ZlZTJlMlwiXScpO1xuICBpZiAoZmxhZ2dlZFNwYW4pIHtcbiAgICBmbGFnZ2VkU3Bhbi5vdXRlckhUTUwgPSBgPGRlbCBzdHlsZT1cImNvbG9yOiNkYzI2MjY7XCI+JHtlc2NhcGVIdG1sKGVudHJ5Lm9yaWdpbmFsKX08L2RlbD4gXHUyMTkyIDxpbnMgc3R5bGU9XCJjb2xvcjojMTY2NTM0O3RleHQtZGVjb3JhdGlvbjpub25lO1wiPiR7ZXNjYXBlSHRtbChjdXN0b20pfTwvaW5zPmA7XG4gIH1cbiAgc3VnRWwuc3R5bGUub3BhY2l0eSA9ICcwLjUnO1xufVxuXG5mdW5jdGlvbiBhcHBseVNwZWxsUmVwbGFjZW1lbnQoc2VjdGlvbklkLCBpZHgsIHJlcElkeCkge1xuICBjb25zdCBrZXkgID0gYCR7c2VjdGlvbklkfV8ke2lkeH1gO1xuICBjb25zdCBlbnRyeSA9ICh3aW5kb3cuX3NwZWxsU3VnTWFwIHx8IHt9KVtrZXldO1xuICBpZiAoIWVudHJ5KSByZXR1cm47XG4gIC8vIFRoZSByZXBsYWNlbWVudHMgbGlzdCBpcyBub3QgZGlyZWN0bHkgYWNjZXNzaWJsZSBoZXJlIFx1MjAxNCByZWFkIGZyb20gRE9NIHN1Z2dlc3Rpb25cbiAgY29uc3Qgc3VnRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuc3BlbGwtc3VnZ2VzdGlvbltkYXRhLXNlY3Rpb24taWQ9XCIke0NTUy5lc2NhcGUoc2VjdGlvbklkKX1cIl1bZGF0YS1pZHg9XCIke2lkeH1cIl1gKTtcbiAgaWYgKCFzdWdFbCkgcmV0dXJuO1xuICBjb25zdCBidXR0b25zID0gc3VnRWwucXVlcnlTZWxlY3RvckFsbCgnLnJld3JpdGUta2V5d29yZCcpO1xuICBjb25zdCByZXAgPSBidXR0b25zW3JlcElkeF0gPyBidXR0b25zW3JlcElkeF0udGV4dENvbnRlbnQudHJpbSgpIDogJyc7XG4gIGVudHJ5Lm91dGNvbWUgPSAnYWNjZXB0JztcbiAgZW50cnkuZmluYWwgICA9IHJlcDtcbiAgLy8gVmlzdWFsIGZlZWRiYWNrOiBzdHJpa2UgdGhlIGZsYWdnZWQgd29yZCwgc2hvdyByZXBsYWNlbWVudFxuICBjb25zdCBmbGFnZ2VkU3BhbiA9IHN1Z0VsLnF1ZXJ5U2VsZWN0b3IoJ3NwYW5bc3R5bGUqPVwiYmFja2dyb3VuZDojZmVlMmUyXCJdJyk7XG4gIGlmIChmbGFnZ2VkU3Bhbikge1xuICAgIGZsYWdnZWRTcGFuLm91dGVySFRNTCA9IGA8ZGVsIHN0eWxlPVwiY29sb3I6I2RjMjYyNjtcIj4ke2VzY2FwZUh0bWwoZW50cnkub3JpZ2luYWwpfTwvZGVsPiBcdTIxOTIgPGlucyBzdHlsZT1cImNvbG9yOiMxNjY1MzQ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7XCI+JHtlc2NhcGVIdG1sKHJlcCl9PC9pbnM+YDtcbiAgfVxuICBzdWdFbC5zdHlsZS5vcGFjaXR5ID0gJzAuNSc7XG59XG5cbmZ1bmN0aW9uIGRpc21pc3NTcGVsbFN1Z2dlc3Rpb24oc3VnSWQsIHNlY3Rpb25JZCwgaWR4LCB3b3JkKSB7XG4gIGNvbnN0IGtleSAgID0gYCR7c2VjdGlvbklkfV8ke2lkeH1gO1xuICBjb25zdCBlbnRyeSA9ICh3aW5kb3cuX3NwZWxsU3VnTWFwIHx8IHt9KVtrZXldO1xuICBpZiAoZW50cnkpIHsgZW50cnkub3V0Y29tZSA9ICdyZWplY3QnOyBlbnRyeS5maW5hbCA9IHdvcmQ7IH1cbiAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzdWdJZCk7XG4gIGlmIChlbCkgZWwuc3R5bGUub3BhY2l0eSA9ICcwLjQnO1xufVxuXG5hc3luYyBmdW5jdGlvbiBhZGRTcGVsbFdvcmQod29yZCwgc3VnSWQpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9jdXN0b20tZGljdGlvbmFyeScsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHdvcmQgfSlcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzdWdJZCk7XG4gICAgICBpZiAoZWwpIHtcbiAgICAgICAgZWwuc3R5bGUub3BhY2l0eSA9ICcwLjQnO1xuICAgICAgICBjb25zdCBtc2cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgbXNnLnN0eWxlLmNzc1RleHQgPSAnY29sb3I6IzE2NjUzNDtmb250LXNpemU6MC44NWVtO21hcmdpbi10b3A6NHB4Oyc7XG4gICAgICAgIG1zZy50ZXh0Q29udGVudCA9IGBcIiR7d29yZH1cIiBhZGRlZCB0byBkaWN0aW9uYXJ5LmA7XG4gICAgICAgIGVsLmFwcGVuZENoaWxkKG1zZyk7XG4gICAgICB9XG4gICAgICAvLyBBbHNvIHJlY29yZCBpbiBhdWRpdFxuICAgICAgY29uc3QgcGFydHMgPSBzdWdJZC5yZXBsYWNlKC9ec3VnXy8sICcnKS5zcGxpdCgnXycpO1xuICAgICAgY29uc3QgaWR4ID0gcGFyc2VJbnQocGFydHMucG9wKCksIDEwKTtcbiAgICAgIGNvbnN0IHNlY3Rpb25JZCA9IHBhcnRzLmpvaW4oJ18nKTtcbiAgICAgIGNvbnN0IGtleSA9IGAke3NlY3Rpb25JZH1fJHtpZHh9YDtcbiAgICAgIGNvbnN0IGVudHJ5ID0gKHdpbmRvdy5fc3BlbGxTdWdNYXAgfHwge30pW2tleV07XG4gICAgICBpZiAoZW50cnkpIHsgZW50cnkub3V0Y29tZSA9ICdhZGRfZGljdCc7IGVudHJ5LmZpbmFsID0gd29yZDsgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLmVycm9yKCdFcnJvciBhZGRpbmcgdG8gZGljdGlvbmFyeTonLCBlcnIpO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBQcmUtZ2VuZXJhdGlvbiBjb25maXJtYXRpb24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIF9jb25maXJtUHJvY2VlZFRvR2VuZXJhdGUoKSB7XG4gIC8vIEdhdGU6IHRhZ2xpbmUgbXVzdCBiZSBleHBsaWNpdGx5IGNvbmZpcm1lZCBiZWZvcmUgZ2VuZXJhdGluZ1xuICBjb25zdCBzdGF0dXMgPSBhd2FpdCBmZXRjaFN0YXR1cygpLmNhdGNoKCgpID0+ICh7fSkpO1xuICBpZiAoIXN0YXR1cz8uZGVjaXNpb25zX2NvbmZpcm1lZD8udGFnbGluZSkge1xuICAgIGF3YWl0IHNob3dBbGVydE1vZGFsKFxuICAgICAgJ1x1MjZBMCBUYWdsaW5lIE5vdCBDb25maXJtZWQnLFxuICAgICAgJ1lvdSBtdXN0IGNvbmZpcm0geW91ciBhcHBsaWNhbnQgdGFnbGluZSBiZWZvcmUgZ2VuZXJhdGluZy5cXG5cXG5HbyB0byB0aGUgXHVEODNDXHVERkY3XHVGRTBGIFRhZ2xpbmUgdGFiIGluIEN1c3RvbWl6YXRpb25zIHRvIGNvbmZpcm0gaXQuJ1xuICAgICk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IGF0c1Njb3JlID0gc3RhdGVNYW5hZ2VyLmdldEF0c1Njb3JlKCk7XG4gIGNvbnN0IGZyZXNobmVzcyA9IHN0YXRlTWFuYWdlci5nZXRMYXlvdXRGcmVzaG5lc3MoKTtcbiAgY29uc3QgZ2VuU3RhdGUgPSBzdGF0ZU1hbmFnZXIuZ2V0R2VuZXJhdGlvblN0YXRlKCk7XG4gIGNvbnN0IGRlY2lzaW9uc0NvbmZpcm1lZCA9IHN0YXR1cz8uZGVjaXNpb25zX2NvbmZpcm1lZCB8fCB7fTtcbiAgY29uc3QgbGluZXMgPSBbJ1lvdXIgQ1YgaXMgcmVhZHkgdG8gZ2VuZXJhdGUuJ107XG4gIGlmIChhdHNTY29yZSAhPT0gbnVsbCAmJiBhdHNTY29yZSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBhdHNTY29yZS5vdmVyYWxsID09PSAnbnVtYmVyJykge1xuICAgIGxpbmVzLnB1c2goYEN1cnJlbnQgQVRTIHNjb3JlOiAke01hdGgucm91bmQoYXRzU2NvcmUub3ZlcmFsbCl9JWApO1xuICB9XG4gIGlmIChnZW5TdGF0ZS5wYWdlV2FybmluZykge1xuICAgIGNvbnN0IHBjID0gZ2VuU3RhdGUucGFnZUNvdW50RXhhY3QgPz8gZ2VuU3RhdGUucGFnZUNvdW50RXN0aW1hdGU7XG4gICAgY29uc3QgcGNMYWJlbCA9IHBjICE9PSBudWxsID8gKGdlblN0YXRlLnBhZ2VDb3VudEV4YWN0ICE9PSBudWxsID8gYCR7cGN9YCA6IGB+JHtwY31gKSA6IG51bGw7XG4gICAgY29uc3Qgb2tQYWdlID0gYXdhaXQgc2hvd0NvbmZpcm1Nb2RhbChcbiAgICAgICdcdTI2QTAgUGFnZSBDb3VudCBPdXQgb2YgUmFuZ2UnLFxuICAgICAgYFRoZSBDViBpcyBlc3RpbWF0ZWQgYXQgJHtwY0xhYmVsID8gYCR7cGNMYWJlbH0gcGFnZSR7cGMgIT09IDEgPyAncycgOiAnJ31gIDogJ2FuIHVudXN1YWwgcGFnZSBjb3VudCd9LCB3aGljaCBpcyBvdXRzaWRlIHRoZSByZWNvbW1lbmRlZCByYW5nZSBmb3IgYSBzZW5pb3IgY2FuZGlkYXRlICgyXHUyMDEzMyBwYWdlcykuXFxuXFxuQ29uc2lkZXIgYWRqdXN0aW5nIHlvdXIgbGF5b3V0IGluc3RydWN0aW9ucyBiZWZvcmUgZ2VuZXJhdGluZy5cXG5cXG5Qcm9jZWVkIGFueXdheT9gLFxuICAgICAgJ0dlbmVyYXRlIEFueXdheSdcbiAgICApO1xuICAgIGlmICghb2tQYWdlKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGZyZXNobmVzcy5pc1N0YWxlKSB7XG4gICAgbGluZXMucHVzaChgXHUyNkEwICR7ZnJlc2huZXNzLmFyaWFMYWJlbH1gKTtcbiAgfVxuICBjb25zdCByZXZpZXdlZFNlY3Rpb25zID0gWydleHBlcmllbmNlcycsICdza2lsbHMnLCAnYWNoaWV2ZW1lbnRzJ10uZmlsdGVyKGsgPT4gZGVjaXNpb25zQ29uZmlybWVkW2tdKTtcbiAgaWYgKHJldmlld2VkU2VjdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgbGluZXMucHVzaCgnXHUyNkEwIE5vIGN1c3RvbWlzYXRpb24gc2VjdGlvbnMgcmV2aWV3ZWQgXHUyMDE0IGV4cGVyaWVuY2UsIHNraWxsLCBhbmQgYWNoaWV2ZW1lbnQgc2VsZWN0aW9ucyBhcmUgYWxsIExMTSBkZWZhdWx0cy4nKTtcbiAgfVxuICBsZXQgd2Vha0J1bGxldENvdW50ID0gMCwgcGFzc2l2ZUJ1bGxldENvdW50ID0gMDtcbiAgT2JqZWN0LnZhbHVlcyh3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0cyB8fCB7fSkuZm9yRWFjaChsaXN0ID0+IHtcbiAgICAobGlzdCB8fCBbXSkuZm9yRWFjaChlID0+IHtcbiAgICAgIGNvbnN0IHR4dCA9IHR5cGVvZiBlID09PSAnc3RyaW5nJyA/IGUgOiAoKGUgJiYgZS50ZXh0KSB8fCAnJyk7XG4gICAgICBpZiAoIXR4dC50cmltKCkgfHwgKGUgJiYgZS5oaWRkZW4pKSByZXR1cm47XG4gICAgICBjb25zdCB3YXJuID0gdHlwZW9mIF9hY2hWZXJiV2FybmluZyA9PT0gJ2Z1bmN0aW9uJyA/IF9hY2hWZXJiV2FybmluZyh0eHQpIDogbnVsbDtcbiAgICAgIGlmICh3YXJuPy5sZXZlbCA9PT0gJ3Bhc3NpdmUnKSBwYXNzaXZlQnVsbGV0Q291bnQrKztcbiAgICAgIGVsc2UgaWYgKHdhcm4/LmxldmVsID09PSAnd2VhaycpIHdlYWtCdWxsZXRDb3VudCsrO1xuICAgIH0pO1xuICB9KTtcbiAgaWYgKHdlYWtCdWxsZXRDb3VudCA+IDAgfHwgcGFzc2l2ZUJ1bGxldENvdW50ID4gMCkge1xuICAgIGNvbnN0IHBhcnRzID0gW107XG4gICAgaWYgKHBhc3NpdmVCdWxsZXRDb3VudCA+IDApIHBhcnRzLnB1c2goYCR7cGFzc2l2ZUJ1bGxldENvdW50fSB3aXRoIHBhc3NpdmUgdm9pY2VgKTtcbiAgICBpZiAod2Vha0J1bGxldENvdW50ID4gMCkgcGFydHMucHVzaChgJHt3ZWFrQnVsbGV0Q291bnR9IHdpdGggd2VhayBvcGVuaW5nIHZlcmIke3dlYWtCdWxsZXRDb3VudCAhPT0gMSA/ICdzJyA6ICcnfWApO1xuICAgIGxpbmVzLnB1c2goYFx1MjZBMCAke3BhcnRzLmpvaW4oJywgJyl9IGluIGV4cGVyaWVuY2UgYnVsbGV0cyBcdTIwMTQgY29uc2lkZXIgQUkgcmV3cml0ZXMgaW4gdGhlIEV4cGVyaWVuY2UgQnVsbGV0cyBlZGl0b3IuYCk7XG4gIH1cbiAgbGluZXMucHVzaCgnXFxuUHJvY2VlZD8nKTtcbiAgcmV0dXJuIHNob3dDb25maXJtTW9kYWwoJ1x1RDgzRFx1RENDNCBQcm9jZWVkIHRvIEdlbmVyYXRlPycsIGxpbmVzLmpvaW4oJ1xcbicpLCAnR2VuZXJhdGUgTm93Jyk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBTdWJtaXQgYXVkaXQgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIHN1Ym1pdFNwZWxsQ2hlY2tEZWNpc2lvbnMoKSB7XG4gIC8qIGR1Y2tmbG93OlxuICAgKiAgIGlkOiBzcGVsbF91aV9zdWJtaXRfbGl2ZVxuICAgKiAgIGtpbmQ6IHVpXG4gICAqICAgdGltZXN0YW1wOiAnMjAyNi0wNC0yMVQxODowMDowMFonXG4gICAqICAgc3RhdHVzOiBsaXZlXG4gICAqICAgaGFuZGxlczpcbiAgICogICAtIHVpOnNwZWxsLWNoZWNrLnN1Ym1pdFxuICAgKiAgIGNhbGxzOlxuICAgKiAgIC0gUE9TVCAvYXBpL3NwZWxsLWNoZWNrLWNvbXBsZXRlXG4gICAqICAgLSBQT1NUIC9hcGkvYWN0aW9uXG4gICAqICAgcmVhZHM6XG4gICAqICAgLSB3aW5kb3c6X3NwZWxsU3VnTWFwXG4gICAqICAgd3JpdGVzOlxuICAgKiAgIC0gcmVxdWVzdDpQT1NUIC9hcGkvc3BlbGwtY2hlY2stY29tcGxldGUuc3BlbGxfYXVkaXRcbiAgICogICAtIHdpbmRvdzpzcGVsbEF1ZGl0XG4gICAqICAgbm90ZXM6IENvbGxhcHNlcyByZXZpZXdlZCBzcGVsbCBzdWdnZXN0aW9ucyBpbnRvIHRoZSBjYW5vbmljYWwgc3BlbGwgYXVkaXQsIHBlcnNpc3RzIHRoYXQgYXVkaXQgaW4gc2Vzc2lvbiBzdGF0ZSwgc2hvd3MgYSBwcmUtZ2VuZXJhdGlvbiBjb25maXJtYXRpb24gbW9kYWwsIGFuZCB0aGVuIHRyaWdnZXJzIGdlbmVyYXRpb24gdXNpbmcgdGhlIGNvcnJlY3RlZCBjb250ZW50LlxuICAgKi9cbiAgLy8gQ291bnQgaXRlbXMgc3RpbGwgbWFya2VkICdwZW5kaW5nJyAobm90IGV4cGxpY2l0bHkgcmV2aWV3ZWQpXG4gIGNvbnN0IHBlbmRpbmdFbnRyaWVzID0gT2JqZWN0LnZhbHVlcyh3aW5kb3cuX3NwZWxsU3VnTWFwIHx8IHt9KS5maWx0ZXIoZSA9PiBlLm91dGNvbWUgPT09ICdwZW5kaW5nJyk7XG4gIGlmIChwZW5kaW5nRW50cmllcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgbiA9IHBlbmRpbmdFbnRyaWVzLmxlbmd0aDtcbiAgICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCBzaG93Q29uZmlybU1vZGFsKFxuICAgICAgJ1x1MjZBMCBVbnJldmlld2VkIElzc3VlcycsXG4gICAgICBgJHtufSBpc3N1ZSR7biAhPT0gMSA/ICdzIGhhdmUnIDogJyBoYXMnfSBub3QgYmVlbiByZXZpZXdlZCBhbmQgd2lsbCBiZSBpZ25vcmVkLlxcblByb2NlZWQgYW55d2F5P2AsXG4gICAgICAnUHJvY2VlZCdcbiAgICApO1xuICAgIGlmICghY29uZmlybWVkKSByZXR1cm47XG4gIH1cblxuICAvLyBDb2xsZWN0IGF1ZGl0IGZyb20gX3NwZWxsU3VnTWFwXG4gIGNvbnN0IGF1ZGl0ID0gT2JqZWN0LnZhbHVlcyh3aW5kb3cuX3NwZWxsU3VnTWFwIHx8IHt9KS5maWx0ZXIoZSA9PiBlLm91dGNvbWUgIT09ICdwZW5kaW5nJyk7XG4gIC8vIFJlbWFpbmluZyAncGVuZGluZycgaXRlbXMgYXJlIGV4cGxpY2l0bHkgYXV0by1pZ25vcmVkIGFmdGVyIGNvbmZpcm1hdGlvbiBhYm92ZVxuICBPYmplY3QudmFsdWVzKHdpbmRvdy5fc3BlbGxTdWdNYXAgfHwge30pLmZvckVhY2goZSA9PiB7XG4gICAgaWYgKGUub3V0Y29tZSA9PT0gJ3BlbmRpbmcnKSB7IGUub3V0Y29tZSA9ICdpZ25vcmUnOyBhdWRpdC5wdXNoKGUpOyB9XG4gIH0pO1xuICBzcGVsbEF1ZGl0ID0gYXVkaXQ7XG5cbiAgY29uc3QgbG9hZGluZ01zZyA9IGFwcGVuZExvYWRpbmdNZXNzYWdlKCdTYXZpbmcgc3BlbGwgY2hlY2sgZGVjaXNpb25zXHUyMDI2Jyk7XG4gIHNldExvYWRpbmcodHJ1ZSwgJ1NhdmluZyBzcGVsbC1jaGVjayBkZWNpc2lvbnNcdTIwMjYnKTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvc3BlbGwtY2hlY2stY29tcGxldGUnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBzcGVsbF9hdWRpdDogc3BlbGxBdWRpdCB9KVxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIHJlbW92ZUxvYWRpbmdNZXNzYWdlKGxvYWRpbmdNc2cpO1xuICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgIGlmICghcmVzLm9rKSB7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgYEZhaWxlZCB0byBzYXZlIHNwZWxsIGNoZWNrOiAke2RhdGEuZXJyb3IgfHwgJ1Vua25vd24gZXJyb3InfWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzdGF0ZU1hbmFnZXIubWFya0NvbnRlbnRDaGFuZ2VkKCk7XG4gICAgY29uc3QgcHJvY2VlZCA9IGF3YWl0IF9jb25maXJtUHJvY2VlZFRvR2VuZXJhdGUoKTtcbiAgICBpZiAoIXByb2NlZWQpIHJldHVybjtcbiAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCBgXHUyNzA1IFNwZWxsIGNoZWNrIGNvbXBsZXRlIFx1MjAxNCAke3NwZWxsQXVkaXQubGVuZ3RofSBpdGVtJHtzcGVsbEF1ZGl0Lmxlbmd0aCAhPT0gMSA/ICdzJyA6ICcnfSByZXZpZXdlZC4gR2VuZXJhdGluZyB5b3VyIENWXHUyMDI2YCk7XG4gICAgc2NoZWR1bGVBdHNSZWZyZXNoKCdyZXZpZXdfY2hlY2twb2ludCcpO1xuICAgIGF3YWl0IGZldGNoU3RhdHVzKCk7XG4gICAgYXdhaXQgc2VuZEFjdGlvbignZ2VuZXJhdGVfY3YnKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmVtb3ZlTG9hZGluZ01lc3NhZ2UobG9hZGluZ01zZyk7XG4gICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsIGBTcGVsbCBjaGVjayBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgRXhwb3J0cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZXhwb3J0IHtcbiAgc3BlbGxBdWRpdCxcbiAgcG9wdWxhdGVTcGVsbENoZWNrVGFiLFxuICByZW5kZXJTcGVsbENoZWNrWmVyb1N0YXRlLFxuICBzdWJtaXRFbXB0eVNwZWxsQ2hlY2ssXG4gIGJ1aWxkU3BlbGxTdGF0c1N1bW1hcnksXG4gIHJlbmRlclNwZWxsU3VnZ2VzdGlvbnMsXG4gIGFwcGx5Q3VzdG9tU3BlbGxDb3JyZWN0aW9uLFxuICBhcHBseVNwZWxsUmVwbGFjZW1lbnQsXG4gIGRpc21pc3NTcGVsbFN1Z2dlc3Rpb24sXG4gIGFkZFNwZWxsV29yZCxcbiAgc3VibWl0U3BlbGxDaGVja0RlY2lzaW9ucyxcbn07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9kb3dubG9hZC10YWIuanNcbiAqIEZpbGUgUmV2aWV3IHRhYjogQVRTIHZhbGlkYXRpb24sIGdlbmVyYXRlZC1maWxlIGRvd25sb2FkcywgcGVyc3Vhc2lvbiBjaGVjayxcbiAqIGFuZCByZWZpbmVtZW50IHNob3J0Y3V0cy5cbiAqXG4gKiBEZXBlbmRlbmNpZXMgKHJlc29sdmVkIHRocm91Z2ggZ2xvYmFsVGhpcyBhdCBydW50aW1lKTpcbiAqICAgZXNjYXBlSHRtbCwgYmFja1RvUGhhc2VcbiAqL1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5jb25zdCBsb2cgPSBnZXRMb2dnZXIoJ2Rvd25sb2FkLXRhYicpO1xuXG5pbXBvcnQgeyBzdGF0ZU1hbmFnZXIgfSBmcm9tICcuL3N0YXRlLW1hbmFnZXIuanMnO1xuXG5mdW5jdGlvbiBfY29sbGVjdERvd25sb2FkYWJsZUZpbGVzKGN2RGF0YSA9IHt9KSB7XG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0KCk7XG4gIGNvbnN0IGZpbGVzID0gW107XG4gIGNvbnN0IHJhd0ZpbGVzID0gQXJyYXkuaXNBcnJheShjdkRhdGEuZmlsZXMpID8gY3ZEYXRhLmZpbGVzIDogW107XG4gIGNvbnN0IGNhbmRpZGF0ZUZpbGVzID0gW1xuICAgIC4uLnJhd0ZpbGVzLFxuICAgIGN2RGF0YS5maW5hbF9odG1sLFxuICAgIGN2RGF0YS5maW5hbF9wZGYsXG4gICAgY3ZEYXRhLmh0bWwsXG4gICAgY3ZEYXRhLnBkZixcbiAgICBjdkRhdGEuZG9jeCxcbiAgICBjdkRhdGEuYXRzX2RvY3gsXG4gIF0uZmlsdGVyKEJvb2xlYW4pO1xuXG4gIGZvciAoY29uc3QgZmlsZW5hbWUgb2YgY2FuZGlkYXRlRmlsZXMpIHtcbiAgICBpZiAoc2Vlbi5oYXMoZmlsZW5hbWUpKSBjb250aW51ZTtcbiAgICBzZWVuLmFkZChmaWxlbmFtZSk7XG5cbiAgICBsZXQgaWNvbiA9ICdcdUQ4M0RcdURDQzEnO1xuICAgIGxldCBkZXNjcmlwdGlvbiA9ICdHZW5lcmF0ZWQgZmlsZSc7XG4gICAgbGV0IGZvcm1hdCA9ICdvdGhlcic7XG5cbiAgICBpZiAoZmlsZW5hbWUuZW5kc1dpdGgoJy5wZGYnKSkge1xuICAgICAgaWNvbiA9IGZpbGVuYW1lLmluY2x1ZGVzKCdBVFMnKSA/ICdcdUQ4M0VcdUREMTYnIDogJ1x1RDgzRFx1RENDNCc7XG4gICAgICBkZXNjcmlwdGlvbiA9IGZpbGVuYW1lLmluY2x1ZGVzKCdBVFMnKVxuICAgICAgICA/ICdBVFMtb3B0aW1pc2VkIFBERiBcdTIwMTQgbWFjaGluZS1yZWFkYWJsZSBmb3IgYXV0b21hdGVkIHNjcmVlbmluZydcbiAgICAgICAgOiAnSHVtYW4tcmVhZGFibGUgUERGIFx1MjAxNCBmb3IgaHVtYW4gcmV2aWV3ZXJzIGFuZCBwcmludGluZyc7XG4gICAgICBmb3JtYXQgPSAncGRmJztcbiAgICB9IGVsc2UgaWYgKGZpbGVuYW1lLmVuZHNXaXRoKCcuZG9jeCcpKSB7XG4gICAgICBpY29uID0gJ1x1RDgzRFx1RENERCc7XG4gICAgICBpZiAoZmlsZW5hbWUuc3RhcnRzV2l0aCgnQ292ZXJMZXR0ZXJfJykpIHtcbiAgICAgICAgZGVzY3JpcHRpb24gPSAnQ292ZXIgbGV0dGVyIFx1MjAxNCBXb3JkIGRvY3VtZW50IGZvciB0aGUgYXBwbGljYXRpb24nO1xuICAgICAgfSBlbHNlIGlmIChmaWxlbmFtZS5zdGFydHNXaXRoKCdTY3JlZW5pbmdfJykpIHtcbiAgICAgICAgZGVzY3JpcHRpb24gPSAnU2NyZWVuaW5nIHF1ZXN0aW9uIHJlc3BvbnNlcyBcdTIwMTQgV29yZCBkb2N1bWVudCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZXNjcmlwdGlvbiA9IGZpbGVuYW1lLmluY2x1ZGVzKCdBVFMnKVxuICAgICAgICAgID8gJ0FUUy1vcHRpbWlzZWQgV29yZCBkb2N1bWVudCBcdTIwMTQga2V5d29yZC1vcHRpbWlzZWQgZm9yIGpvYiBhcHBsaWNhdGlvbnMnXG4gICAgICAgICAgOiAnSHVtYW4tcmVhZGFibGUgV29yZCBkb2N1bWVudCBcdTIwMTQgZWRpdGFibGUgZm9ybWF0JztcbiAgICAgIH1cbiAgICAgIGZvcm1hdCA9ICdkb2N4JztcbiAgICB9IGVsc2UgaWYgKGZpbGVuYW1lLmVuZHNXaXRoKCcuaHRtbCcpKSB7XG4gICAgICBpY29uID0gJ1x1RDgzQ1x1REYxMCc7XG4gICAgICBjb25zdCBpc1ByZXZpZXcgPSAvcHJldmlldy9pLnRlc3QoZmlsZW5hbWUpO1xuICAgICAgZGVzY3JpcHRpb24gPSBpc1ByZXZpZXdcbiAgICAgICAgPyAnTGF5b3V0IHByZXZpZXcgXHUyMDE0IGludGVybWVkaWF0ZSB3b3JraW5nIGZpbGUsIG5vdCBmb3Igc3VibWlzc2lvbidcbiAgICAgICAgOiAnSFRNTCBmb3JtYXQgd2l0aCBlbWJlZGRlZCBKU09OLUxEIHN0cnVjdHVyZWQgZGF0YSc7XG4gICAgICBmb3JtYXQgPSBpc1ByZXZpZXcgPyAncHJldmlldycgOiAnaHRtbCc7XG4gICAgfSBlbHNlIGlmIChmaWxlbmFtZSA9PT0gJ2pvYl9kZXNjcmlwdGlvbi50eHQnKSB7XG4gICAgICBpY29uID0gJ1x1RDgzRFx1RENDQic7XG4gICAgICBkZXNjcmlwdGlvbiA9ICdPcmlnaW5hbCBqb2IgZGVzY3JpcHRpb24gcmVmZXJlbmNlJztcbiAgICB9XG5cbiAgICBmaWxlcy5wdXNoKHsgZmlsZW5hbWUsIGRlc2NyaXB0aW9uLCBpY29uLCBmb3JtYXQgfSk7XG4gIH1cblxuICByZXR1cm4gZmlsZXM7XG59XG5cbmZ1bmN0aW9uIF9yZW5kZXJWYWxpZGF0aW9uU3VtbWFyeShjaGVja3MsIHN1bW1hcnksIHBhZ2VDb3VudCwgYXRzRXJyb3IpIHtcbiAgbGV0IGh0bWwgPSAnJztcblxuICBpZiAocGFnZUNvdW50ICE9PSBudWxsKSB7XG4gICAgY29uc3QgcGFnZVdhcm5pbmcgPSBwYWdlQ291bnQgPCAxLjUgfHwgcGFnZUNvdW50ID4gMztcbiAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwiZGlzcGxheTppbmxpbmUtZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDtcbiAgICAgICAgICAgICAgYmFja2dyb3VuZDoke3BhZ2VXYXJuaW5nID8gJyNmZWY5YzMnIDogJyNmMGZkZjQnfTtcbiAgICAgICAgICAgICAgYm9yZGVyOjFweCBzb2xpZCAke3BhZ2VXYXJuaW5nID8gJyNmZGUwNDcnIDogJyNiYmY3ZDAnfTtcbiAgICAgICAgICAgICAgYm9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzo4cHggMTRweDttYXJnaW4tYm90dG9tOjE2cHg7XCI+XG4gICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZToxLjNlbTtcIj5cdUQ4M0RcdURDQzQ8L3NwYW4+XG4gICAgICA8c3Ryb25nPiR7cGFnZUNvdW50fSBwYWdlJHtwYWdlQ291bnQgIT09IDEgPyAncycgOiAnJ308L3N0cm9uZz5cbiAgICAgICR7cGFnZVdhcm5pbmdcbiAgICAgICAgPyAnPHNwYW4gc3R5bGU9XCJjb2xvcjojZDk3NzA2O2ZvbnQtc2l6ZTowLjg4ZW07XCI+XHUyNkEwIFNlbmlvciBjYW5kaWRhdGUgdGFyZ2V0IGlzIDJcdTIwMTMzIHBhZ2VzPC9zcGFuPidcbiAgICAgICAgOiAnPHNwYW4gc3R5bGU9XCJjb2xvcjojMTY2NTM0O2ZvbnQtc2l6ZTowLjg4ZW07XCI+XHUyNzEzIEdvb2QgbGVuZ3RoPC9zcGFuPid9XG4gICAgPC9kaXY+YDtcbiAgfVxuXG4gIGlmIChhdHNFcnJvcikge1xuICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZWUyZTI7Ym9yZGVyOjFweCBzb2xpZCAjZmNhNWE1O2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MTJweCAxNnB4O21hcmdpbi1ib3R0b206MjBweDtcIj5cbiAgICAgIDxzdHJvbmc+XHUyNkEwIEFUUyB2YWxpZGF0aW9uIGVycm9yOjwvc3Ryb25nPiAke2VzY2FwZUh0bWwoYXRzRXJyb3IpfVxuICAgIDwvZGl2PmA7XG4gICAgcmV0dXJuIGh0bWw7XG4gIH1cblxuICBpZiAoIWNoZWNrcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gaHRtbDtcbiAgfVxuXG4gIGNvbnN0IGtleXdvcmRGYWlsID0gY2hlY2tzLnNvbWUoKGNoZWNrKSA9PiBjaGVjay5uYW1lID09PSAnYXRzX2tleXdvcmRfcHJlc2VuY2UnICYmIGNoZWNrLnN0YXR1cyA9PT0gJ2ZhaWwnKTtcbiAgY29uc3Qgc3RhdHVzQ29sb3VyID0gc3VtbWFyeS5mYWlsID4gMCA/ICcjZGMyNjI2JyA6IHN1bW1hcnkud2FybiA+IDAgPyAnI2Q5NzcwNicgOiAnIzE2NjUzNCc7XG4gIGNvbnN0IHN0YXR1c0ljb24gPSBzdW1tYXJ5LmZhaWwgPiAwID8gJ1x1Mjc0QycgOiBzdW1tYXJ5Lndhcm4gPiAwID8gJ1x1MjZBMCcgOiAnXHUyNzA1JztcblxuICBodG1sICs9IGBcbiAgICA8ZGV0YWlscyBvcGVuIHN0eWxlPVwibWFyZ2luLWJvdHRvbToyMHB4O1wiPlxuICAgICAgPHN1bW1hcnkgc3R5bGU9XCJjdXJzb3I6cG9pbnRlcjtmb250LXdlaWdodDo3MDA7Zm9udC1zaXplOjFlbTtwYWRkaW5nOjhweCAwO2NvbG9yOiR7c3RhdHVzQ29sb3VyfTtcIj5cbiAgICAgICAgJHtzdGF0dXNJY29ufSBBVFMgUmVwb3J0IFx1MjAxNCAke3N1bW1hcnkucGFzc30gcGFzcywgJHtzdW1tYXJ5Lndhcm59IHdhcm4sICR7c3VtbWFyeS5mYWlsfSBmYWlsXG4gICAgICA8L3N1bW1hcnk+XG4gICAgICA8dGFibGUgY2xhc3M9XCJyZXZpZXctdGFibGVcIiBzdHlsZT1cIm1hcmdpbi10b3A6MTBweDtmb250LXNpemU6MC44N2VtO1wiPlxuICAgICAgICA8dGhlYWQ+PHRyPjx0aD5DaGVjazwvdGg+PHRoPkZvcm1hdDwvdGg+PHRoPlN0YXR1czwvdGg+PHRoPkRldGFpbDwvdGg+PC90cj48L3RoZWFkPlxuICAgICAgICA8dGJvZHk+YDtcblxuICBmb3IgKGNvbnN0IGNoZWNrIG9mIGNoZWNrcykge1xuICAgIGNvbnN0IGJhY2tncm91bmQgPSBjaGVjay5zdGF0dXMgPT09ICdwYXNzJyA/ICcjZjBmZGY0JyA6IGNoZWNrLnN0YXR1cyA9PT0gJ3dhcm4nID8gJyNmZWY5YzMnIDogJyNmZWUyZTInO1xuICAgIGNvbnN0IGljb24gPSBjaGVjay5zdGF0dXMgPT09ICdwYXNzJyA/ICdcdTI3MDUnIDogY2hlY2suc3RhdHVzID09PSAnd2FybicgPyAnXHUyNkEwJyA6ICdcdTI3NEMnO1xuICAgIGNvbnN0IGZvcm1hdEJhZGdlID0gYDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjExcHg7YmFja2dyb3VuZDojZTBlN2ZmO2NvbG9yOiMzNzMwYTM7Ym9yZGVyLXJhZGl1czo2cHg7cGFkZGluZzoxcHggNXB4O1wiPiR7ZXNjYXBlSHRtbChjaGVjay5mb3JtYXQpfTwvc3Bhbj5gO1xuXG4gICAgaHRtbCArPSBgPHRyIHN0eWxlPVwiYmFja2dyb3VuZDoke2JhY2tncm91bmR9O1wiPlxuICAgICAgPHRkIHN0eWxlPVwiZm9udC13ZWlnaHQ6NjAwO1wiPiR7ZXNjYXBlSHRtbChjaGVjay5sYWJlbCl9PC90ZD5cbiAgICAgIDx0ZD4ke2Zvcm1hdEJhZGdlfTwvdGQ+XG4gICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjtcIj4ke2ljb259PC90ZD5cbiAgICAgIDx0ZD48c21hbGw+JHtlc2NhcGVIdG1sKGNoZWNrLmRldGFpbCl9PC9zbWFsbD48L3RkPlxuICAgIDwvdHI+YDtcbiAgfVxuXG4gIGh0bWwgKz0gJzwvdGJvZHk+PC90YWJsZT48L2RldGFpbHM+JztcblxuICBpZiAoc3VtbWFyeS5mYWlsID4gMCkge1xuICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZWUyZTI7Ym9yZGVyOjFweCBzb2xpZCAjZmNhNWE1O2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MTBweCAxNnB4O21hcmdpbi1ib3R0b206MjBweDtcIj5cbiAgICAgIDxzdHJvbmc+XHUyNzRDIEZpeCByZXF1aXJlZDo8L3N0cm9uZz4gU29tZSBjaGVja3MgZmFpbGVkLiBCbG9ja2VkIGZvcm1hdHMgYXJlIGdyZXllZCBvdXQgYmVsb3cuXG4gICAgICAke2tleXdvcmRGYWlsXG4gICAgICAgID8gJzxicj48c3Ryb25nPkFUUyBrZXl3b3JkIGZhaWx1cmUgYmxvY2tzIGFsbCBkb3dubG9hZHM8L3N0cm9uZz4gXHUyMDE0IHJlLXJ1biBjdXN0b21pc2F0aW9ucyB0byBpbXByb3ZlIGtleXdvcmQgY292ZXJhZ2UuJ1xuICAgICAgICA6ICcnfVxuICAgIDwvZGl2PmA7XG4gIH1cblxuICByZXR1cm4gaHRtbDtcbn1cblxuLy8gQ2hlY2tzIHRoYXQgYXJlIGFkdmlzb3J5IG9ubHkgXHUyMDE0IHRoZXkgd2FybiBidXQgbmV2ZXIgYmxvY2sgdGhlIGRvd25sb2FkIGJ1dHRvbi5cbi8vIE9ubHkgZ2VudWluZWx5IGNyaXRpY2FsIGZhaWx1cmVzIChmaWxlIG5vdCBmb3VuZCwgUERGIHVucmVhZGFibGUsIGJyb2tlbiBvdXRwdXQpXG4vLyBzaG91bGQgcHJldmVudCBhIHVzZXIgZnJvbSBkb3dubG9hZGluZy5cbmNvbnN0IF9OT05fQkxPQ0tJTkdfQ0hFQ0tTID0gbmV3IFNldChbXG4gICdjdl9wYWdlX2NvdW50JywgICAgICAgICAgICAgICAvLyBhZHZpc29yeTogcGFnZSBsZW5ndGggb3V0c2lkZSBpZGVhbCByYW5nZVxuICAncGRmX3VzX2xldHRlcicsICAgICAgICAgICAgICAgLy8gYWR2aXNvcnk6IHBhZ2Ugc2l6ZVxuICAnZG9jeF96ZXJvX3NoYXBlcycsICAgICAgICAgICAgLy8gYWR2aXNvcnk6IEFUUyBmb3JtYXR0aW5nIGhpbnRcbiAgJ2RvY3hfc3RhbmRhcmRfaGVhZGluZ3MnLCAgICAgIC8vIGFkdmlzb3J5OiBBVFMgaGVhZGluZyB0ZXh0XG4gICdkb2N4X2hlYWRpbmcxX3ByZXNlbnQnLCAgICAgICAvLyBhZHZpc29yeTogQVRTIGhlYWRpbmcgc3R5bGVcbiAgJ2RvY3hfZGF0ZV9mb3JtYXRfY29uc2lzdGVudCcsIC8vIGFkdmlzb3J5OiBkYXRlIGZvcm1hdCBjb25zaXN0ZW5jeVxuICAnZG9jeF9wdWJsaWNhdGlvbnNfaGVhZGluZycsICAgLy8gYWR2aXNvcnk6IHB1YmxpY2F0aW9ucyBoZWFkaW5nIHRleHRcbiAgJ2h0bWxfanNvbmxkX3ZhbGlkX3BlcnNvbicsICAgIC8vIGFkdmlzb3J5OiBKU09OLUxEIHNjaGVtYSB0eXBlXG4gICdodG1sX2pzb25sZF9rbm93c19hYm91dCcsICAgICAvLyBhZHZpc29yeTogSlNPTi1MRCBza2lsbHMgcG9wdWxhdGlvblxuXSk7XG5cbmZ1bmN0aW9uIF9yZW5kZXJEb3dubG9hZEdyaWQoZmlsZXMsIGNoZWNrcywgc3VtbWFyeSwgZ2VuZXJhdGVkQXQgPSBudWxsLCBnZW5lcmF0aW9uUnVuID0gbnVsbCkge1xuICBjb25zdCBrZXl3b3JkRmFpbCA9IGNoZWNrcy5zb21lKChjaGVjaykgPT4gY2hlY2submFtZSA9PT0gJ2F0c19rZXl3b3JkX3ByZXNlbmNlJyAmJiBjaGVjay5zdGF0dXMgPT09ICdmYWlsJyk7XG4gIGNvbnN0IGlzQ3JpdGljYWxGYWlsID0gKGNoZWNrKSA9PiBjaGVjay5zdGF0dXMgPT09ICdmYWlsJyAmJiAhX05PTl9CTE9DS0lOR19DSEVDS1MuaGFzKGNoZWNrLm5hbWUpO1xuICBjb25zdCBibG9ja0RvY3ggPSBrZXl3b3JkRmFpbCB8fCBjaGVja3Muc29tZSgoY2hlY2spID0+IGNoZWNrLmZvcm1hdCA9PT0gJ2RvY3gnICYmIGlzQ3JpdGljYWxGYWlsKGNoZWNrKSk7XG4gIGNvbnN0IGJsb2NrSHRtbCA9IGtleXdvcmRGYWlsIHx8IGNoZWNrcy5zb21lKChjaGVjaykgPT4gY2hlY2suZm9ybWF0ID09PSAnaHRtbCcgJiYgaXNDcml0aWNhbEZhaWwoY2hlY2spKTtcbiAgY29uc3QgYmxvY2tQZGYgID0ga2V5d29yZEZhaWwgfHwgY2hlY2tzLnNvbWUoKGNoZWNrKSA9PiBjaGVjay5mb3JtYXQgPT09ICdwZGYnICAmJiBpc0NyaXRpY2FsRmFpbChjaGVjaykpO1xuXG4gIGxldCBnZW5lcmF0ZWRMYWJlbCA9ICcnO1xuICBpZiAoZ2VuZXJhdGVkQXQpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZCA9IG5ldyBEYXRlKGdlbmVyYXRlZEF0KTtcbiAgICAgIGNvbnN0IGRhdGVTdHIgPSBkLnRvTG9jYWxlU3RyaW5nKCdlbi1VUycsIHtcbiAgICAgICAgbW9udGg6ICdzaG9ydCcsIGRheTogJ251bWVyaWMnLCB5ZWFyOiAnbnVtZXJpYycsXG4gICAgICAgIGhvdXI6ICdudW1lcmljJywgbWludXRlOiAnMi1kaWdpdCcsXG4gICAgICB9KTtcbiAgICAgIGdlbmVyYXRlZExhYmVsID0gKGdlbmVyYXRpb25SdW4gJiYgZ2VuZXJhdGlvblJ1biA+IDEpXG4gICAgICAgID8gYFJ1biAjJHtnZW5lcmF0aW9uUnVufSBcdTIwMTQgJHtkYXRlU3RyfWBcbiAgICAgICAgOiBkYXRlU3RyO1xuICAgIH0gY2F0Y2ggKF8pIHsgLyogaWdub3JlICovIH1cbiAgfVxuXG4gIGxldCBodG1sID0gJzxkaXYgY2xhc3M9XCJkb3dubG9hZC1zZWN0aW9uXCI+PGRpdiBjbGFzcz1cImRvd25sb2FkLWdyaWRcIj4nO1xuICBpZiAoIWZpbGVzLmxlbmd0aCkge1xuICAgIGh0bWwgKz0gJzxwPk5vIGRvd25sb2FkYWJsZSBmaWxlcyBmb3VuZC4gUGxlYXNlIHRyeSBnZW5lcmF0aW5nIHlvdXIgQ1YgYWdhaW4uPC9wPic7XG4gICAgaHRtbCArPSAnPC9kaXY+PC9kaXY+JztcbiAgICByZXR1cm4gaHRtbDtcbiAgfVxuXG4gIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgIGNvbnN0IGJsb2NrZWQgPSAoZmlsZS5mb3JtYXQgPT09ICdkb2N4JyAmJiBibG9ja0RvY3gpXG4gICAgICB8fCAoZmlsZS5mb3JtYXQgPT09ICdodG1sJyAmJiBibG9ja0h0bWwpXG4gICAgICB8fCAoZmlsZS5mb3JtYXQgPT09ICdwZGYnICYmIGJsb2NrUGRmKTtcbiAgICBjb25zdCBibG9ja2VkU3R5bGUgPSBibG9ja2VkXG4gICAgICA/ICdjdXJzb3I6bm90LWFsbG93ZWQ7b3BhY2l0eTowLjQ7YmFja2dyb3VuZDojOWNhM2FmO2JvcmRlci1jb2xvcjojOWNhM2FmOydcbiAgICAgIDogJyc7XG4gICAgY29uc3QgYmxvY2tlZE1lc3NhZ2UgPSBibG9ja2VkXG4gICAgICA/ICc8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuNzhlbTtjb2xvcjojZGMyNjI2O21hcmdpbi10b3A6NHB4O1wiPlx1MjZENCBCbG9ja2VkIFx1MjAxNCBvdXRwdXQgZmlsZSBjb3VsZCBub3QgYmUgZ2VuZXJhdGVkPC9kaXY+J1xuICAgICAgOiAnJztcbiAgICBjb25zdCB0aW1lc3RhbXBMaW5lID0gZ2VuZXJhdGVkTGFiZWxcbiAgICAgID8gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC43NWVtO2NvbG9yOiM5Y2EzYWY7bWFyZ2luLXRvcDozcHg7XCI+R2VuZXJhdGVkICR7Z2VuZXJhdGVkTGFiZWx9PC9kaXY+YFxuICAgICAgOiAnPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjc1ZW07Y29sb3I6I2MwYzRjYzttYXJnaW4tdG9wOjNweDtcIj5Ob3QgeWV0IGdlbmVyYXRlZDwvZGl2Pic7XG5cbiAgICBjb25zdCBwcmV2aWV3QmFkZ2UgPSBmaWxlLmZvcm1hdCA9PT0gJ3ByZXZpZXcnXG4gICAgICA/ICc8c3BhbiBzdHlsZT1cImRpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbi1sZWZ0OjZweDtmb250LXNpemU6MC43NWVtO2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjojOTI0MDBlO2JhY2tncm91bmQ6I2ZlZjNjNztib3JkZXI6MXB4IHNvbGlkICNmY2QzNGQ7Ym9yZGVyLXJhZGl1czo0cHg7cGFkZGluZzoxcHggNXB4O3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtcIj5Xb3JraW5nIGZpbGUgXHUyMDE0IG5vdCBmb3Igc3VibWlzc2lvbjwvc3Bhbj4nXG4gICAgICA6ICcnO1xuXG4gICAgaHRtbCArPSBgXG4gICAgICA8ZGl2IGNsYXNzPVwiZG93bmxvYWQtaXRlbVwiIHN0eWxlPVwiJHtibG9ja2VkID8gJ29wYWNpdHk6MC43NTsnIDogJyd9JHtmaWxlLmZvcm1hdCA9PT0gJ3ByZXZpZXcnID8gJ2JvcmRlci1zdHlsZTpkYXNoZWQ7JyA6ICcnfVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZG93bmxvYWQtaWNvblwiPiR7ZmlsZS5pY29ufTwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZG93bmxvYWQtaW5mb1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkb3dubG9hZC1uYW1lXCI+JHtlc2NhcGVIdG1sKGZpbGUuZmlsZW5hbWUpfSR7cHJldmlld0JhZGdlfTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkb3dubG9hZC1kZXNjcmlwdGlvblwiPiR7ZXNjYXBlSHRtbChmaWxlLmRlc2NyaXB0aW9uKX08L2Rpdj5cbiAgICAgICAgICAke3RpbWVzdGFtcExpbmV9XG4gICAgICAgICAgJHtibG9ja2VkTWVzc2FnZX1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgICR7YmxvY2tlZFxuICAgICAgICAgID8gYDxidXR0b24gY2xhc3M9XCJidG4tZG93bmxvYWRcIiBkaXNhYmxlZCBzdHlsZT1cIiR7YmxvY2tlZFN0eWxlfVwiPkJsb2NrZWQ8L2J1dHRvbj5gXG4gICAgICAgICAgOiAoKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBfc2lkID0gdHlwZW9mIGdldFNlc3Npb25JZEZyb21VUkwgPT09ICdmdW5jdGlvbicgPyBnZXRTZXNzaW9uSWRGcm9tVVJMKCkgOiBudWxsO1xuICAgICAgICAgICAgICBjb25zdCBfc3AgID0gX3NpZCA/IGA/c2Vzc2lvbl9pZD0ke2VuY29kZVVSSUNvbXBvbmVudChfc2lkKX1gIDogJyc7XG4gICAgICAgICAgICAgIHJldHVybiBgPGEgaHJlZj1cIi9hcGkvZG93bmxvYWQvJHtlbmNvZGVVUklDb21wb25lbnQoZmlsZS5maWxlbmFtZSl9JHtfc3B9XCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1kb3dubG9hZCBkb3dubG9hZC1saW5rXCIgZG93bmxvYWQ9XCIke2VzY2FwZUh0bWwoZmlsZS5maWxlbmFtZSl9XCJcbiAgICAgICAgICAgICAgICBzdHlsZT1cInRleHQtZGVjb3JhdGlvbjpub25lO2Rpc3BsYXk6aW5saW5lLWZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7XCI+RG93bmxvYWQ8L2E+YDtcbiAgICAgICAgICAgIH0pKCl9XG4gICAgICA8L2Rpdj5gO1xuICB9XG5cbiAgaHRtbCArPSAnPC9kaXY+PC9kaXY+JztcbiAgaWYgKHN1bW1hcnkuZmFpbCA+IDAgJiYgZmlsZXMubGVuZ3RoKSB7XG4gICAgaHRtbCArPSAnPHAgc3R5bGU9XCJtYXJnaW4tdG9wOjEycHg7Y29sb3I6IzZiNzI4MDtmb250LXNpemU6MC44OGVtO1wiPkJsb2NrZWQgZm9ybWF0cyByZWZsZWN0IEFUUyB2YWxpZGF0aW9uIGZhaWx1cmVzIGZvciB0aGUgY29ycmVzcG9uZGluZyBvdXRwdXQgdHlwZXMuPC9wPic7XG4gIH1cbiAgcmV0dXJuIGh0bWw7XG59XG5cbmZ1bmN0aW9uIF9yZW5kZXJSZWZpbmVtZW50UGFuZWwoKSB7XG4gIHJldHVybiBgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6MjRweDtwYWRkaW5nOjE2cHg7YmFja2dyb3VuZDojZjhmYWZjO2JvcmRlcjoxcHggc29saWQgI2UyZThmMDtcbiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6OHB4O1wiPlxuICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbToxMHB4O2NvbG9yOiMzNzQxNTE7XCI+XHUyMUJCIEl0ZXJhdGl2ZSBSZWZpbmVtZW50PC9kaXY+XG4gICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjllbTtjb2xvcjojNmI3MjgwO21hcmdpbi1ib3R0b206MTJweDtcIj5cbiAgICAgIEdvIGJhY2sgdG8gcmVmaW5lIGFuIGVhcmxpZXIgc3RlcCBcdTIwMTQgYWxsIHByaW9yIGRlY2lzaW9ucyBhbmQgYXBwcm92YWxzIGFyZSBwcmVzZXJ2ZWQuXG4gICAgPC9kaXY+XG4gICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6MTBweDtmbGV4LXdyYXA6d3JhcDtcIj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJidG4tc2Vjb25kYXJ5XCIgb25jbGljaz1cImJhY2tUb1BoYXNlKCdjdXN0b21pemF0aW9ucycpXCIgdGl0bGU9XCJSZXR1cm4gdG8gQ3VzdG9taXNlIHN0ZXBcIj5cbiAgICAgICAgXHUyMUJCIFJlZmluZSBDdXN0b21pc2VcbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1zZWNvbmRhcnlcIiBvbmNsaWNrPVwiYmFja1RvUGhhc2UoJ3Jld3JpdGUnKVwiIHRpdGxlPVwiUmV0dXJuIHRvIFJld3JpdGUgUmV2aWV3IHN0ZXBcIj5cbiAgICAgICAgXHUyMUJCIFJlZmluZSBSZXdyaXRlc1xuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLXNlY29uZGFyeVwiIG9uY2xpY2s9XCJiYWNrVG9QaGFzZSgnYW5hbHlzaXMnKVwiIHRpdGxlPVwiUmV0dXJuIHRvIEFuYWx5c2lzIHN0ZXBcIj5cbiAgICAgICAgXHUyMUJCIFJlLWFuYWx5c2UgSm9iXG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gX2ZldGNoUGVyc3Vhc2lvbkh0bWwoKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9wZXJzdWFzaW9uLWNoZWNrJyk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICBpZiAoIXJlc3BvbnNlLm9rIHx8ICFkYXRhLm9rKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgY29uc3Qgc3VtbWFyeSA9IGRhdGEuc3VtbWFyeSB8fCB7IGZsYWdnZWQ6IDAsIHN0cm9uZ19jb3VudDogMCwgdG90YWxfYnVsbGV0czogMCB9O1xuICAgIGNvbnN0IGZpbmRpbmdzID0gQXJyYXkuaXNBcnJheShkYXRhLmZpbmRpbmdzKSA/IGRhdGEuZmluZGluZ3MgOiBbXTtcbiAgICBjb25zdCBzY29yZUNvbG9yID0gc3VtbWFyeS5mbGFnZ2VkID09PSAwID8gJyMxMGI5ODEnIDogc3VtbWFyeS5mbGFnZ2VkIDw9IDMgPyAnI2Y1OWUwYicgOiAnI2VmNDQ0NCc7XG4gICAgY29uc3Qgc2NvcmVMYWJlbCA9IHN1bW1hcnkuZmxhZ2dlZCA9PT0gMFxuICAgICAgPyAnRXhjZWxsZW50J1xuICAgICAgOiBzdW1tYXJ5LmZsYWdnZWQgPD0gM1xuICAgICAgICA/ICdHb29kIFx1MjAxNCBtaW5vciBpbXByb3ZlbWVudHMgcG9zc2libGUnXG4gICAgICAgIDogJ05lZWRzIGF0dGVudGlvbic7XG5cbiAgICBsZXQgaHRtbCA9IGA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDoyMHB4O2JvcmRlcjoxcHggc29saWQgI2UyZThmMDtib3JkZXItcmFkaXVzOjhweDtvdmVyZmxvdzpoaWRkZW47XCI+XG4gICAgICA8ZGl2IHN0eWxlPVwicGFkZGluZzoxNHB4IDE2cHg7YmFja2dyb3VuZDojZjhmYWZjO2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjthbGlnbi1pdGVtczpjZW50ZXI7Y3Vyc29yOnBvaW50ZXI7XCJcbiAgICAgICAgICAgb25jbGljaz1cInRoaXMubmV4dEVsZW1lbnRTaWJsaW5nLnN0eWxlLmRpc3BsYXk9dGhpcy5uZXh0RWxlbWVudFNpYmxpbmcuc3R5bGUuZGlzcGxheT09PSdub25lJz8nYmxvY2snOidub25lJ1wiPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC13ZWlnaHQ6NjAwO2NvbG9yOiMxZjI5Mzc7XCI+XHVEODNEXHVEQ0FBIEJ1bGxldCBQZXJzdWFzaXZlbmVzczwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cIm1hcmdpbi1sZWZ0OjEycHg7YmFja2dyb3VuZDoke3Njb3JlQ29sb3J9O2NvbG9yOiNmZmY7Ym9yZGVyLXJhZGl1czo0cHg7cGFkZGluZzoycHggOHB4O2ZvbnQtc2l6ZTowLjhlbTtcIj4ke3Njb3JlTGFiZWx9PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07Y29sb3I6IzZiNzI4MDtcIj5cbiAgICAgICAgICAke3N1bW1hcnkuc3Ryb25nX2NvdW50fS8ke3N1bW1hcnkudG90YWxfYnVsbGV0c30gc3Ryb25nIFx1MDBCNyAke3N1bW1hcnkuZmxhZ2dlZH0gZmxhZ2dlZCBcdTAwQjcgY2xpY2sgdG8gJHtzdW1tYXJ5LmZsYWdnZWQgPiAwID8gJ2V4cGFuZCcgOiAnY29sbGFwc2UnfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PmA7XG5cbiAgICBpZiAoZmluZGluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cInBhZGRpbmc6MTJweCAxNnB4O2Rpc3BsYXk6JHtzdW1tYXJ5LmZsYWdnZWQgPD0gMyA/ICdibG9jaycgOiAnbm9uZSd9O1wiPmA7XG4gICAgICBmb3IgKGNvbnN0IGZpbmRpbmcgb2YgZmluZGluZ3MpIHtcbiAgICAgICAgY29uc3Qgc2V2ZXJpdHkgPSBmaW5kaW5nLnNldmVyaXR5ID09PSAnd2FybmluZydcbiAgICAgICAgICA/IHsgYmFja2dyb3VuZDogJyNmZmY3ZWQnLCBib3JkZXI6ICcjZjU5ZTBiJywgbGFiZWw6ICdcdTI2QTAgV2FybmluZycgfVxuICAgICAgICAgIDogeyBiYWNrZ3JvdW5kOiAnI2YwZjlmZicsIGJvcmRlcjogJyMzYjgyZjYnLCBsYWJlbDogJ1x1MjEzOSBJbmZvJyB9O1xuICAgICAgICBjb25zdCB0cnVuY2F0ZWRUZXh0ID0gZmluZGluZy50ZXh0ICYmIGZpbmRpbmcudGV4dC5sZW5ndGggPiAxMjBcbiAgICAgICAgICA/IGAke2ZpbmRpbmcudGV4dC5zbGljZSgwLCAxMjApfVx1MjAyNmBcbiAgICAgICAgICA6IGZpbmRpbmcudGV4dCB8fCAnJztcbiAgICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTJweDtwYWRkaW5nOjEwcHggMTJweDtiYWNrZ3JvdW5kOiR7c2V2ZXJpdHkuYmFja2dyb3VuZH07Ym9yZGVyLWxlZnQ6M3B4IHNvbGlkICR7c2V2ZXJpdHkuYm9yZGVyfTtib3JkZXItcmFkaXVzOjAgNnB4IDZweCAwO1wiPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC44ZW07Y29sb3I6IzZiNzI4MDttYXJnaW4tYm90dG9tOjRweDtcIj5cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiYmFja2dyb3VuZDoke3NldmVyaXR5LmJvcmRlcn07Y29sb3I6I2ZmZjtib3JkZXItcmFkaXVzOjNweDtwYWRkaW5nOjFweCA2cHg7Zm9udC1zaXplOjAuOWVtO1wiPiR7c2V2ZXJpdHkubGFiZWx9PC9zcGFuPlxuICAgICAgICAgICAgQnVsbGV0ICR7KGZpbmRpbmcuYnVsbGV0X2luZGV4ID8/IDApICsgMX0ke2ZpbmRpbmcuZXhwX2lkID8gYCBcdTAwQjcgJHtlc2NhcGVIdG1sKGZpbmRpbmcuZXhwX2lkKX1gIDogJyd9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjllbTtjb2xvcjojMzc0MTUxO21hcmdpbi1ib3R0b206NnB4O1wiPlwiJHtlc2NhcGVIdG1sKHRydW5jYXRlZFRleHQpfVwiPC9kaXY+XG4gICAgICAgICAgPHVsIHN0eWxlPVwibWFyZ2luOjA7cGFkZGluZy1sZWZ0OjE4cHg7XCI+YDtcbiAgICAgICAgZm9yIChjb25zdCBpc3N1ZSBvZiBmaW5kaW5nLmlzc3VlcyB8fCBbXSkge1xuICAgICAgICAgIGh0bWwgKz0gYDxsaSBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07Y29sb3I6IzZiNzI4MDttYXJnaW4tYm90dG9tOjJweDtcIj4ke2VzY2FwZUh0bWwoaXNzdWUuc3VnZ2VzdGlvbil9PC9saT5gO1xuICAgICAgICB9XG4gICAgICAgIGh0bWwgKz0gJzwvdWw+PC9kaXY+JztcbiAgICAgIH1cbiAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgfSBlbHNlIHtcbiAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJwYWRkaW5nOjEycHggMTZweDtjb2xvcjojMTBiOTgxO2ZvbnQtc2l6ZTowLjllbTtcIj5BbGwgYnVsbGV0cyBtZWV0IHBlcnN1YXNpdmVuZXNzIGNyaXRlcmlhLjwvZGl2Pic7XG4gICAgfVxuXG4gICAgLy8gTmFycmF0aXZlLXRocmVhZCBhZHZpc29yeSAoR0FQLTI4MSlcbiAgICBjb25zdCBudGEgPSBzdW1tYXJ5Lm5hcnJhdGl2ZV90aHJlYWRfYWR2aXNvcnk7XG4gICAgaWYgKG50YSkge1xuICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cInBhZGRpbmc6MTBweCAxNnB4O2JhY2tncm91bmQ6I2ZlZjljMztib3JkZXItdG9wOjFweCBzb2xpZCAjZmRlNjhhO1wiPlxuICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtd2VpZ2h0OjYwMDtjb2xvcjojOTI0MDBlO1wiPlx1RDgzRVx1RERGNSBOYXJyYXRpdmUgZm9jdXMgYWR2aXNvcnk6PC9zcGFuPlxuICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjllbTtjb2xvcjojNzgzNTBmO21hcmdpbi1sZWZ0OjZweDtcIj4ke2VzY2FwZUh0bWwobnRhLmRldGFpbCl9PC9zcGFuPlxuICAgICAgPC9kaXY+YDtcbiAgICB9XG5cbiAgICAvLyBOYXJyYXRpdmUtYXJjIGFkdmlzb3J5IChHQVAtMTcpOiByZWNlbnQgcm9sZSBzaG91bGQgc2hvdyBzdHJvbmdlc3QgdmVyYnNcbiAgICBjb25zdCBuYWEgPSBzdW1tYXJ5Lm5hcnJhdGl2ZV9hcmNfYWR2aXNvcnk7XG4gICAgaWYgKG5hYSkge1xuICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cInBhZGRpbmc6MTBweCAxNnB4O2JhY2tncm91bmQ6I2ZmZjdlZDtib3JkZXItdG9wOjFweCBzb2xpZCAjZmVkN2FhO1wiPlxuICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtd2VpZ2h0OjYwMDtjb2xvcjojOWEzNDEyO1wiPlx1RDgzRFx1RENDOCBOYXJyYXRpdmUgYXJjIGFkdmlzb3J5Ojwvc3Bhbj5cbiAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC45ZW07Y29sb3I6IzdjMmQxMjttYXJnaW4tbGVmdDo2cHg7XCI+JHtlc2NhcGVIdG1sKG5hYS5kZXRhaWwpfTwvc3Bhbj5cbiAgICAgIDwvZGl2PmA7XG4gICAgfVxuXG4gICAgaHRtbCArPSAnPC9kaXY+JztcbiAgICByZXR1cm4gaHRtbDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cud2FybignUGVyc3Vhc2lvbiBjaGVjayBmYWlsZWQ6JywgZXJyb3IpO1xuICAgIHJldHVybiAnJztcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBwb3B1bGF0ZURvd25sb2FkVGFiKGN2RGF0YSkge1xuICBzdGF0ZU1hbmFnZXIuc2V0VGFiRGF0YSgnY3YnLCBjdkRhdGEpO1xuXG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9jdW1lbnQtY29udGVudCcpO1xuICBpZiAoIWNvbnRlbnQpIHJldHVybjtcblxuICBpZiAoIWN2RGF0YSB8fCAodHlwZW9mIGN2RGF0YSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMoY3ZEYXRhKS5sZW5ndGggPT09IDApKSB7XG4gICAgY29udGVudC5pbm5lckhUTUwgPSAnPGgxPlx1MkIwN1x1RkUwRiBEb3dubG9hZCBHZW5lcmF0ZWQgRmlsZXM8L2gxPjxkaXYgY2xhc3M9XCJlbXB0eS1zdGF0ZVwiPjxkaXYgY2xhc3M9XCJpY29uXCI+XHUyQjA3XHVGRTBGPC9kaXY+PGgzPk5vIEZpbGVzIEF2YWlsYWJsZTwvaDM+PHA+R2VuZXJhdGUgYSBDViBmaXJzdCB0byBzZWUgZG93bmxvYWQgb3B0aW9ucy48L3A+PC9kaXY+JztcbiAgICByZXR1cm47XG4gIH1cblxuICBjb250ZW50LmlubmVySFRNTCA9ICc8aDE+XHUyQjA3XHVGRTBGIERvd25sb2FkIEdlbmVyYXRlZCBGaWxlczwvaDE+PHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO21hcmdpbi1ib3R0b206MTZweDtcIj5SdW5uaW5nIEFUUyB2YWxpZGF0aW9uXHUyMDI2PC9wPic7XG5cbiAgbGV0IGNoZWNrcyA9IFtdO1xuICBsZXQgcGFnZUNvdW50ID0gbnVsbDtcbiAgbGV0IHN1bW1hcnkgPSB7IHBhc3M6IDAsIHdhcm46IDAsIGZhaWw6IDAgfTtcbiAgbGV0IGF0c0Vycm9yID0gbnVsbDtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL2F0cy12YWxpZGF0ZScpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgaWYgKGRhdGEub2spIHtcbiAgICAgIGNoZWNrcyA9IGRhdGEuY2hlY2tzIHx8IFtdO1xuICAgICAgcGFnZUNvdW50ID0gZGF0YS5wYWdlX2NvdW50ID8/IG51bGw7XG4gICAgICBzdW1tYXJ5ID0gZGF0YS5zdW1tYXJ5IHx8IHN1bW1hcnk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF0c0Vycm9yID0gZGF0YS5lcnJvciB8fCAnVmFsaWRhdGlvbiBmYWlsZWQnO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBhdHNFcnJvciA9IGBOZXR3b3JrIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YDtcbiAgfVxuXG4gIGNvbnN0IGZpbGVzID0gX2NvbGxlY3REb3dubG9hZGFibGVGaWxlcyhjdkRhdGEpO1xuICBsZXQgaHRtbCA9ICc8aDE+XHUyQjA3XHVGRTBGIEZpbGUgUmV2aWV3PC9oMT4nO1xuICBodG1sICs9ICc8cCBzdHlsZT1cImZvbnQtc2l6ZTowLjgzZW07Y29sb3I6Izk0YTNiODttYXJnaW4tYm90dG9tOjE2cHg7cGFkZGluZzo4cHggMTJweDtiYWNrZ3JvdW5kOiNmOGZhZmM7Ym9yZGVyLXJhZGl1czo2cHg7Ym9yZGVyLWxlZnQ6M3B4IHNvbGlkICNlMmU4ZjA7XCI+XHUyNzA1IDxlbT5UaGlzIGlzIHRoZSA8c3Ryb25nPmNvbXBsZXRlbmVzcyBjaGVjazwvc3Ryb25nPiBzdGVwIFx1MjAxNCBBVFMgdmFsaWRhdGlvbiBydW5zIGhlcmUgYW5kIHlvdSBjYW4gYXJjaGl2ZSB0aGUgYXBwbGljYXRpb24uIFRvIGRvd25sb2FkIGZpbGVzIGltbWVkaWF0ZWx5IGFmdGVyIGdlbmVyYXRpb24sIHVzZSB0aGUgPHN0cm9uZz5HZW5lcmF0ZWQgRmlsZXM8L3N0cm9uZz4gdGFiLjwvZW0+PC9wPic7XG4gIGh0bWwgKz0gX3JlbmRlclZhbGlkYXRpb25TdW1tYXJ5KGNoZWNrcywgc3VtbWFyeSwgcGFnZUNvdW50LCBhdHNFcnJvcik7XG5cbiAgY29uc3Qgc3VtbWFyeVdhcm5pbmdzID0gKGN2RGF0YS5tZXRhZGF0YT8uc3VtbWFyeV93YXJuaW5ncyB8fCBbXSk7XG4gIGlmIChzdW1tYXJ5V2FybmluZ3MubGVuZ3RoKSB7XG4gICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2ZlZjljMztib3JkZXI6MXB4IHNvbGlkICNmY2QzNGQ7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzoxMnB4IDE2cHg7bWFyZ2luLWJvdHRvbToxNnB4O1wiPlxuICAgICAgPHN0cm9uZz5cdTI2QTAgUHJvZmVzc2lvbmFsIFN1bW1hcnkgcXVhbGl0eSBub3RpY2VzICgke3N1bW1hcnlXYXJuaW5ncy5sZW5ndGh9KTo8L3N0cm9uZz5cbiAgICAgIDx1bCBzdHlsZT1cIm1hcmdpbjo4cHggMCAwIDA7cGFkZGluZy1sZWZ0OjE4cHg7XCI+XG4gICAgICAgICR7c3VtbWFyeVdhcm5pbmdzLm1hcCh3ID0+IGA8bGkgc3R5bGU9XCJmb250LXNpemU6MC45ZW07XCI+JHtlc2NhcGVIdG1sKHcpfTwvbGk+YCkuam9pbignJyl9XG4gICAgICA8L3VsPlxuICAgICAgPHAgc3R5bGU9XCJtYXJnaW46OHB4IDAgMDtmb250LXNpemU6MC44N2VtO2NvbG9yOiM3ODM1MGY7XCI+VGhlc2UgYXJlIGFkdmlzb3J5IHdhcm5pbmdzIFx1MjAxNCByZXZpZXcgdGhlIFN1bW1hcnkgdGFiIGlmIHlvdSB3aXNoIHRvIHVwZGF0ZSB0aGUgc3VtbWFyeSBiZWZvcmUgc3VibWl0dGluZy48L3A+XG4gICAgPC9kaXY+YDtcbiAgfVxuXG4gIGNvbnN0IHB1YmxpY2F0aW9uV2FybmluZ3MgPSAoY3ZEYXRhLm1ldGFkYXRhPy5wdWJsaWNhdGlvbl93YXJuaW5ncyB8fCBbXSk7XG4gIGlmIChwdWJsaWNhdGlvbldhcm5pbmdzLmxlbmd0aCkge1xuICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZWY5YzM7Ym9yZGVyOjFweCBzb2xpZCAjZmNkMzRkO2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MTJweCAxNnB4O21hcmdpbi1ib3R0b206MTZweDtcIj5cbiAgICAgIDxzdHJvbmc+XHUyNkEwIFB1YmxpY2F0aW9uIHZlbnVlIGluZm9ybWF0aW9uIGluY29tcGxldGUgKCR7cHVibGljYXRpb25XYXJuaW5ncy5sZW5ndGh9KTo8L3N0cm9uZz5cbiAgICAgIDx1bCBzdHlsZT1cIm1hcmdpbjo4cHggMCAwIDA7cGFkZGluZy1sZWZ0OjE4cHg7XCI+XG4gICAgICAgICR7cHVibGljYXRpb25XYXJuaW5ncy5tYXAodyA9PiBgPGxpIHN0eWxlPVwiZm9udC1zaXplOjAuOWVtO1wiPiR7ZXNjYXBlSHRtbCh3KX08L2xpPmApLmpvaW4oJycpfVxuICAgICAgPC91bD5cbiAgICAgIDxwIHN0eWxlPVwibWFyZ2luOjhweCAwIDA7Zm9udC1zaXplOjAuODdlbTtjb2xvcjojNzgzNTBmO1wiPkFkZCBtaXNzaW5nIGpvdXJuYWwgb3IgY29uZmVyZW5jZSBuYW1lcyB0byB5b3VyIE1hc3RlciBDViBiZWZvcmUgc3VibWl0dGluZyBcdTIwMTQgaW5jb21wbGV0ZSB2ZW51ZSBkZXRhaWxzIHdlYWtlbiBjcmVkaWJpbGl0eS48L3A+XG4gICAgPC9kaXY+YDtcbiAgfVxuXG4gIGNvbnN0IGxvbmdCdWxsZXRXYXJuaW5ncyA9IChjdkRhdGEubWV0YWRhdGE/LmxvbmdfYnVsbGV0X3dhcm5pbmdzIHx8IFtdKTtcbiAgaWYgKGxvbmdCdWxsZXRXYXJuaW5ncy5sZW5ndGgpIHtcbiAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZmVmOWMzO2JvcmRlcjoxcHggc29saWQgI2ZjZDM0ZDtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjEycHggMTZweDttYXJnaW4tYm90dG9tOjE2cHg7XCI+XG4gICAgICA8c3Ryb25nPlx1MjZBMCBMb25nIGJ1bGxldCBwb2ludHMgZGV0ZWN0ZWQgKCR7bG9uZ0J1bGxldFdhcm5pbmdzLmxlbmd0aH0pIFx1MjAxNCBtYXkgZXhjZWVkIDIgbGluZXM6PC9zdHJvbmc+XG4gICAgICA8dWwgc3R5bGU9XCJtYXJnaW46OHB4IDAgMCAwO3BhZGRpbmctbGVmdDoxOHB4O2xpc3Qtc3R5bGU6bm9uZTtcIj5cbiAgICAgICAgJHtsb25nQnVsbGV0V2FybmluZ3MubWFwKHcgPT4gYDxsaSBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07bWFyZ2luLWJvdHRvbTo0cHg7XCI+PHN0cm9uZz4ke2VzY2FwZUh0bWwody5jb21wYW55KX0gXHUwMEI3ICR7ZXNjYXBlSHRtbCh3LnRpdGxlKX08L3N0cm9uZz4gKCR7dy5jaGFyX2NvdW50fSBjaGFycyk8YnI+PHNwYW4gc3R5bGU9XCJjb2xvcjojNmI3MjgwO1wiPlwiJHtlc2NhcGVIdG1sKHcuYnVsbGV0X3RleHQpfVwiPC9zcGFuPjwvbGk+YCkuam9pbignJyl9XG4gICAgICA8L3VsPlxuICAgICAgPHAgc3R5bGU9XCJtYXJnaW46OHB4IDAgMDtmb250LXNpemU6MC44N2VtO2NvbG9yOiM3ODM1MGY7XCI+Q29uc2lkZXIgc2hvcnRlbmluZyB0aGVzZSBidWxsZXRzIFx1MjAxNCBhaW0gZm9yIFx1MjI2NDIwMCBjaGFyYWN0ZXJzIGVhY2ggZm9yIGNsZWFuIDItbGluZSByZW5kZXJpbmcgaW4gdGhlIERPQ1guPC9wPlxuICAgIDwvZGl2PmA7XG4gIH1cblxuICBjb25zdCBzcGFyc2VFeHBXYXJuaW5ncyA9IChjdkRhdGEubWV0YWRhdGE/LnNwYXJzZV9leHBlcmllbmNlX3dhcm5pbmdzIHx8IFtdKTtcbiAgaWYgKHNwYXJzZUV4cFdhcm5pbmdzLmxlbmd0aCkge1xuICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZWY5YzM7Ym9yZGVyOjFweCBzb2xpZCAjZmNkMzRkO2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MTJweCAxNnB4O21hcmdpbi1ib3R0b206MTZweDtcIj5cbiAgICAgIDxzdHJvbmc+XHUyNkEwIFNwYXJzZSBleHBlcmllbmNlIGVudHJpZXMgKCR7c3BhcnNlRXhwV2FybmluZ3MubGVuZ3RofSkgXHUyMDE0IGZld2VyIHRoYW4gMiBidWxsZXRzOjwvc3Ryb25nPlxuICAgICAgPHVsIHN0eWxlPVwibWFyZ2luOjhweCAwIDAgMDtwYWRkaW5nLWxlZnQ6MThweDtsaXN0LXN0eWxlOm5vbmU7XCI+XG4gICAgICAgICR7c3BhcnNlRXhwV2FybmluZ3MubWFwKHcgPT4gYDxsaSBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07bWFyZ2luLWJvdHRvbToycHg7XCI+PHN0cm9uZz4ke2VzY2FwZUh0bWwody5jb21wYW55KX0gXHUwMEI3ICR7ZXNjYXBlSHRtbCh3LnRpdGxlKX08L3N0cm9uZz4gXHUyMDE0ICR7dy5idWxsZXRfY291bnQgPT09IDAgPyAnbm8gYnVsbGV0cyBzZWxlY3RlZCcgOiAnMSBidWxsZXQgc2VsZWN0ZWQnfTwvbGk+YCkuam9pbignJyl9XG4gICAgICA8L3VsPlxuICAgICAgPHAgc3R5bGU9XCJtYXJnaW46OHB4IDAgMDtmb250LXNpemU6MC44N2VtO2NvbG9yOiM3ODM1MGY7XCI+SW5jbHVkZSBhdCBsZWFzdCAyIGJ1bGxldHMgcGVyIHJvbGUgdG8gZGVtb25zdHJhdGUgaW1wYWN0LiBSZXR1cm4gdG8gdGhlIEV4cGVyaWVuY2UgdGFiIHRvIGFkZCBtb3JlLjwvcD5cbiAgICA8L2Rpdj5gO1xuICB9XG5cbiAgY29uc3QgeWVhck9ubHlEYXRlV2FybmluZ3MgPSAoY3ZEYXRhLm1ldGFkYXRhPy55ZWFyX29ubHlfZGF0ZV93YXJuaW5ncyB8fCBbXSk7XG4gIGlmICh5ZWFyT25seURhdGVXYXJuaW5ncy5sZW5ndGgpIHtcbiAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZmVmOWMzO2JvcmRlcjoxcHggc29saWQgI2ZjZDM0ZDtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjEycHggMTZweDttYXJnaW4tYm90dG9tOjE2cHg7XCI+XG4gICAgICA8c3Ryb25nPlx1MjZBMCBZZWFyLW9ubHkgZGF0ZXMgZGV0ZWN0ZWQgKCR7eWVhck9ubHlEYXRlV2FybmluZ3MubGVuZ3RofSkgXHUyMDE0IG1vbnRoL3llYXIgZm9ybWF0IHJlY29tbWVuZGVkOjwvc3Ryb25nPlxuICAgICAgPHVsIHN0eWxlPVwibWFyZ2luOjhweCAwIDAgMDtwYWRkaW5nLWxlZnQ6MThweDtsaXN0LXN0eWxlOm5vbmU7XCI+XG4gICAgICAgICR7eWVhck9ubHlEYXRlV2FybmluZ3MubWFwKHcgPT4gYDxsaSBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07bWFyZ2luLWJvdHRvbToycHg7XCI+PHN0cm9uZz4ke2VzY2FwZUh0bWwody5jb21wYW55KX0gXHUwMEI3ICR7ZXNjYXBlSHRtbCh3LnRpdGxlKX08L3N0cm9uZz4gXHUyMDE0ICR7dy5maWVsZCA9PT0gJ3N0YXJ0X2RhdGUnID8gJ3N0YXJ0JyA6ICdlbmQnfSBkYXRlIGlzIFwiJHtlc2NhcGVIdG1sKHcuZGF0ZV92YWx1ZSl9XCI8L2xpPmApLmpvaW4oJycpfVxuICAgICAgPC91bD5cbiAgICAgIDxwIHN0eWxlPVwibWFyZ2luOjhweCAwIDA7Zm9udC1zaXplOjAuODdlbTtjb2xvcjojNzgzNTBmO1wiPlllYXItb25seSBkYXRlcyByZWR1Y2UgY2hyb25vbG9naWNhbCBwcmVjaXNpb24uIFVwZGF0ZSB0byBNb250aCBZWVlZIGZvcm1hdCAoZS5nLiBcIkphbiAyMDIwXCIpIGluIHRoZSBNYXN0ZXIgQ1YgZm9yIGJlc3QgQVRTIGNvbXBhdGliaWxpdHkuPC9wPlxuICAgIDwvZGl2PmA7XG4gIH1cblxuICBjb25zdCByZXdyaXRlQXVkaXRNaXNtYXRjaGVzID0gKGN2RGF0YS5tZXRhZGF0YT8ucmV3cml0ZV9hdWRpdF9taXNtYXRjaGVzIHx8IFtdKTtcbiAgaWYgKHJld3JpdGVBdWRpdE1pc21hdGNoZXMubGVuZ3RoKSB7XG4gICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2ZlZjJmMjtib3JkZXI6MXB4IHNvbGlkICNmY2E1YTU7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzoxMnB4IDE2cHg7bWFyZ2luLWJvdHRvbToxNnB4O1wiPlxuICAgICAgPHN0cm9uZz5cdTI2QTAgUmV3cml0ZSBjb250ZW50IG1pc21hdGNoICgke3Jld3JpdGVBdWRpdE1pc21hdGNoZXMubGVuZ3RofSkgXHUyMDE0IGFjY2VwdGVkIHJld3JpdGVzIG5vdCBmb3VuZCBpbiBnZW5lcmF0ZWQgdGV4dDo8L3N0cm9uZz5cbiAgICAgIDx1bCBzdHlsZT1cIm1hcmdpbjo4cHggMCAwIDA7cGFkZGluZy1sZWZ0OjE4cHg7bGlzdC1zdHlsZTpub25lO1wiPlxuICAgICAgICAke3Jld3JpdGVBdWRpdE1pc21hdGNoZXMubWFwKG0gPT4gYDxsaSBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07bWFyZ2luLWJvdHRvbTo2cHg7XCI+PHN0cm9uZz4ke2VzY2FwZUh0bWwobS5sb2NhdGlvbiB8fCBtLnR5cGUpfTwvc3Ryb25nPjxicj48c3BhbiBzdHlsZT1cImNvbG9yOiMzNzQxNTE7XCI+RXhwZWN0ZWQ6IDxlbT5cIiR7ZXNjYXBlSHRtbCgobS5leHBlY3RlZCB8fCAnJykuc2xpY2UoMCwgMTIwKSl9JHsobS5leHBlY3RlZCB8fCAnJykubGVuZ3RoID4gMTIwID8gJ1x1MjAyNicgOiAnJ31cIjwvZW0+PC9zcGFuPjxicj48c3BhbiBzdHlsZT1cImNvbG9yOiM5Y2EzYWY7XCI+QWN0dWFsOiA8ZW0+XCIke2VzY2FwZUh0bWwoKG0uYWN0dWFsIHx8ICcnKS5zbGljZSgwLCAxMjApKX0keyhtLmFjdHVhbCB8fCAnJykubGVuZ3RoID4gMTIwID8gJ1x1MjAyNicgOiAnJ31cIjwvZW0+PC9zcGFuPjwvbGk+YCkuam9pbignJyl9XG4gICAgICA8L3VsPlxuICAgICAgPHAgc3R5bGU9XCJtYXJnaW46OHB4IDAgMDtmb250LXNpemU6MC44N2VtO2NvbG9yOiM3ZjFkMWQ7XCI+VGhlc2UgYWNjZXB0ZWQgcmV3cml0ZXMgbWF5IG5vdCBoYXZlIGJlZW4gYXBwbGllZC4gUmUtZ2VuZXJhdGUgdGhlIENWIG9yIGNoZWNrIHRoZSByZXdyaXRlIHJldmlldyBzdGVwLjwvcD5cbiAgICA8L2Rpdj5gO1xuICB9XG5cbiAgY29uc3Qgb3ZlcmxhcFdhcm5pbmdzID0gKGN2RGF0YS5kYXRlX292ZXJsYXBfd2FybmluZ3MgfHwgW10pO1xuICBpZiAob3ZlcmxhcFdhcm5pbmdzLmxlbmd0aCkge1xuICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZWY5YzM7Ym9yZGVyOjFweCBzb2xpZCAjZmRlMDQ3O2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MTJweCAxNnB4O21hcmdpbi1ib3R0b206MTZweDtcIj5cbiAgICAgIDxzdHJvbmc+XHUyNkEwIEVtcGxveW1lbnQgZGF0ZSBvdmVybGFwcyBkZXRlY3RlZCAoJHtvdmVybGFwV2FybmluZ3MubGVuZ3RofSk6PC9zdHJvbmc+XG4gICAgICA8dWwgc3R5bGU9XCJtYXJnaW46OHB4IDAgMCAwO3BhZGRpbmctbGVmdDoxOHB4O1wiPlxuICAgICAgICAke292ZXJsYXBXYXJuaW5ncy5tYXAodyA9PiBgPGxpPjxzdHJvbmc+JHtlc2NhcGVIdG1sKHcuZW50cnlfYSl9PC9zdHJvbmc+IG92ZXJsYXBzIHdpdGggPHN0cm9uZz4ke2VzY2FwZUh0bWwody5lbnRyeV9iKX08L3N0cm9uZz48YnI+PHNtYWxsIHN0eWxlPVwiY29sb3I6IzkyNDAwZTtcIj4ke2VzY2FwZUh0bWwody5vdmVybGFwX2Rlc2NyaXB0aW9uKX08L3NtYWxsPjwvbGk+YCkuam9pbignJyl9XG4gICAgICA8L3VsPlxuICAgICAgPHAgc3R5bGU9XCJtYXJnaW46OHB4IDAgMDtmb250LXNpemU6MC44N2VtO2NvbG9yOiM3ODM1MGY7XCI+UmV2aWV3IHRoZXNlIGVudHJpZXMgaW4gdGhlIEV4cGVyaWVuY2UgdGFiIGJlZm9yZSBzdWJtaXR0aW5nIHlvdXIgYXBwbGljYXRpb24uPC9wPlxuICAgIDwvZGl2PmA7XG4gIH1cblxuICBjb25zdCBnZW5lcmF0ZWRBdCA9IGN2RGF0YS5tZXRhZGF0YT8uZ2VuZXJhdGlvbl9kYXRlID8/IG51bGw7XG4gIGNvbnN0IGdlbmVyYXRpb25SdW4gPSBjdkRhdGEubWV0YWRhdGE/LmdlbmVyYXRpb25fcnVuID8/IG51bGw7XG4gIGh0bWwgKz0gX3JlbmRlckRvd25sb2FkR3JpZChmaWxlcywgY2hlY2tzLCBzdW1tYXJ5LCBnZW5lcmF0ZWRBdCwgZ2VuZXJhdGlvblJ1bik7XG5cbiAgaWYgKGN2RGF0YS5vdXRwdXRfZGlyKSB7XG4gICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6MjBweDtwYWRkaW5nOjEycHg7YmFja2dyb3VuZDojZjFmNWY5O2JvcmRlci1yYWRpdXM6NnB4O2ZvbnQtc2l6ZToxNHB4O2NvbG9yOiM2NDc0OGI7XCI+XG4gICAgICA8c3Ryb25nPk91dHB1dCBEaXJlY3Rvcnk6PC9zdHJvbmc+ICR7ZXNjYXBlSHRtbChjdkRhdGEub3V0cHV0X2Rpcil9XG4gICAgPC9kaXY+YDtcbiAgfVxuXG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gYCR7aHRtbH08cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7bWFyZ2luLXRvcDoxNnB4O2ZvbnQtc2l6ZTowLjllbTtcIj5BbmFseXNpbmcgYnVsbGV0IHBlcnN1YXNpdmVuZXNzXHUyMDI2PC9wPmA7XG4gIGh0bWwgKz0gYXdhaXQgX2ZldGNoUGVyc3Vhc2lvbkh0bWwoKTtcbiAgaHRtbCArPSBfcmVuZGVyUmVmaW5lbWVudFBhbmVsKCk7XG4gIGh0bWwgKz0gYDxkaXYgY2xhc3M9XCJuYXYtYnV0dG9ucyBuYXYtZW5kXCIgc3R5bGU9XCJtYXJnaW4tdG9wOjE2cHg7XCI+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImNvbnRpbnVlLWJ0blwiIG9uY2xpY2s9XCJoYW5kbGVTdGVwQ2xpY2soJ2NvdmVyX2xldHRlcicpXCI+XG4gICAgICBcdUQ4M0RcdURDRTkgUHJvY2VlZCB0byBDb3ZlciBMZXR0ZXIgXHUyMTkyXG4gICAgPC9idXR0b24+XG4gIDwvZGl2PmA7XG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gaHRtbDtcbn1cblxuZXhwb3J0IHsgcG9wdWxhdGVEb3dubG9hZFRhYiB9OyIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL2ZpbmFsLWdlbmVyYXRlLmpzXG4gKiBGaW5hbCBnZW5lcmF0aW9uIHN0ZXA6IHNob3dzIGRvd25sb2FkIGxpbmtzIGZvciB0aGUgZ2VuZXJhdGVkIGZpbGVzXG4gKiAoUERGLCBBVFMgRE9DWCwgaHVtYW4gRE9DWCkgYW5kIGEgXCJQcm9jZWVkIHRvIERvd25sb2FkIFJldmlldyBcdTIxOTJcIiBidXR0b25cbiAqIHRoYXQgYWR2YW5jZXMgdGhlIHdvcmtmbG93IHRvIHRoZSBkb3dubG9hZCBzdGVwLlxuICpcbiAqIERlcGVuZGVuY2llcyAocmVzb2x2ZWQgdGhyb3VnaCBnbG9iYWxUaGlzIGF0IHJ1bnRpbWUpOlxuICogICBhcGlDYWxsLCBhcHBlbmRNZXNzYWdlLCBlc2NhcGVIdG1sLCBzdGF0ZU1hbmFnZXIsIHN3aXRjaFRhYlxuICovXG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmNvbnN0IGxvZyA9IGdldExvZ2dlcignZmluYWwtZ2VuZXJhdGUnKTtcblxuaW1wb3J0IHsgc3RhdGVNYW5hZ2VyIH0gZnJvbSAnLi9zdGF0ZS1tYW5hZ2VyLmpzJztcblxuLy8gXHUyNTAwXHUyNTAwIFByZXZpZXcgc3RhdGUgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmxldCBfcHJldmlld09wZW4gPSB0cnVlO1xuXG4vLyBcdTI1MDBcdTI1MDAgRmlsZSB0eXBlIGhlbHBlcnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIF9maWxlTGFiZWwoZmlsZW5hbWUpIHtcbiAgaWYgKCFmaWxlbmFtZSkgcmV0dXJuICcnO1xuICBjb25zdCBiYXNlID0gZmlsZW5hbWUuc3BsaXQoJy8nKS5wb3AoKTtcbiAgaWYgKGJhc2UuZW5kc1dpdGgoJy5wZGYnKSAmJiBiYXNlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2F0cycpKVxuICAgIHJldHVybiAnQVRTIFBERic7XG4gIGlmIChiYXNlLmVuZHNXaXRoKCcucGRmJykpXG4gICAgcmV0dXJuICdIdW1hbiBQREYnO1xuICBpZiAoYmFzZS5lbmRzV2l0aCgnLmRvY3gnKSAmJiBiYXNlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2F0cycpKVxuICAgIHJldHVybiAnQVRTIFdvcmQnO1xuICBpZiAoYmFzZS5lbmRzV2l0aCgnLmRvY3gnKSlcbiAgICByZXR1cm4gJ0h1bWFuIFdvcmQnO1xuICBpZiAoYmFzZS5lbmRzV2l0aCgnLmh0bWwnKSlcbiAgICByZXR1cm4gJ0hUTUwnO1xuICByZXR1cm4gYmFzZTtcbn1cblxuZnVuY3Rpb24gX2ZpbGVJY29uKGZpbGVuYW1lKSB7XG4gIGlmICghZmlsZW5hbWUpIHJldHVybiAnXHVEODNEXHVEQ0MxJztcbiAgY29uc3QgZiA9IGZpbGVuYW1lLnRvTG93ZXJDYXNlKCk7XG4gIGlmIChmLmVuZHNXaXRoKCcucGRmJykpICByZXR1cm4gZi5pbmNsdWRlcygnYXRzJykgPyAnXHVEODNFXHVERDE2JyA6ICdcdUQ4M0RcdURDQzQnO1xuICBpZiAoZi5lbmRzV2l0aCgnLmRvY3gnKSkgcmV0dXJuICdcdUQ4M0RcdURDREQnO1xuICBpZiAoZi5lbmRzV2l0aCgnLmh0bWwnKSkgcmV0dXJuICdcdUQ4M0NcdURGMTAnO1xuICByZXR1cm4gJ1x1RDgzRFx1RENDMSc7XG59XG5cbmZ1bmN0aW9uIF9maWxlRGVzY3JpcHRpb24oZmlsZW5hbWUpIHtcbiAgaWYgKCFmaWxlbmFtZSkgcmV0dXJuICcnO1xuICBjb25zdCBmID0gZmlsZW5hbWUudG9Mb3dlckNhc2UoKTtcbiAgaWYgKGYuZW5kc1dpdGgoJy5wZGYnKSAmJiBmLmluY2x1ZGVzKCdhdHMnKSlcbiAgICByZXR1cm4gJ0FUUy1vcHRpbWlzZWQgUERGIFx1MjAxNCBtYWNoaW5lLXJlYWRhYmxlIGZvciBhdXRvbWF0ZWQgc2NyZWVuaW5nJztcbiAgaWYgKGYuZW5kc1dpdGgoJy5wZGYnKSlcbiAgICByZXR1cm4gJ0h1bWFuLXJlYWRhYmxlIFBERiBcdTIwMTQgZm9yIGh1bWFuIHJldmlld2VycyBhbmQgcHJpbnRpbmcnO1xuICBpZiAoZi5lbmRzV2l0aCgnLmRvY3gnKSAmJiBmLmluY2x1ZGVzKCdhdHMnKSlcbiAgICByZXR1cm4gJ0FUUyBXb3JkIGRvY3VtZW50IFx1MjAxNCBrZXl3b3JkLW9wdGltaXNlZCBmb3Igam9iIGFwcGxpY2F0aW9ucyc7XG4gIGlmIChmLmVuZHNXaXRoKCcuZG9jeCcpKVxuICAgIHJldHVybiAnSHVtYW4tcmVhZGFibGUgV29yZCBkb2N1bWVudCBcdTIwMTQgZWRpdGFibGUgZm9ybWF0JztcbiAgaWYgKGYuZW5kc1dpdGgoJy5odG1sJykpXG4gICAgcmV0dXJuICdIVE1MIGZvcm1hdCB3aXRoIGVtYmVkZGVkIEpTT04tTEQgc3RydWN0dXJlZCBkYXRhJztcbiAgcmV0dXJuICdHZW5lcmF0ZWQgZmlsZSc7XG59XG5cbmZ1bmN0aW9uIF9odG1sUHJldmlld0ZpbGUoZmlsZXMpIHtcbiAgLy8gUHJlZmVyIGh1bWFuLXJlYWRhYmxlIEhUTUwgKENWXyouaHRtbCwgbm90IEFUUylcbiAgY29uc3QgaHVtYW4gPSBmaWxlcy5maW5kKGYgPT4gZi5lbmRzV2l0aCgnLmh0bWwnKSAmJiAhZi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdhdHMnKSk7XG4gIHJldHVybiBodW1hbiB8fCBmaWxlcy5maW5kKGYgPT4gZi5lbmRzV2l0aCgnLmh0bWwnKSkgfHwgbnVsbDtcbn1cblxuZnVuY3Rpb24gX3JlbmRlclByZXZpZXdQYW5lKGh0bWxGaWxlKSB7XG4gIGlmICghaHRtbEZpbGUpIHJldHVybiAnJztcbiAgY29uc3QgYmFzZSA9IGh0bWxGaWxlLnNwbGl0KCcvJykucG9wKCk7XG4gIGNvbnN0IHNyYyA9IGAvYXBpL2Rvd25sb2FkLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGJhc2UpfWA7XG4gIHJldHVybiBgXG4gICAgPGRpdiBpZD1cImZpbmFsLXByZXZpZXctcGFuZVwiIHN0eWxlPVwibWFyZ2luLWJvdHRvbToyNHB4O2JvcmRlcjoxcHggc29saWQgI2UyZThmMDtib3JkZXItcmFkaXVzOjEwcHg7b3ZlcmZsb3c6aGlkZGVuOyR7X3ByZXZpZXdPcGVuID8gJycgOiAnZGlzcGxheTpub25lOyd9XCI+XG4gICAgICA8ZGl2IHN0eWxlPVwicGFkZGluZzoxMHB4IDE2cHg7YmFja2dyb3VuZDojZjFmNWY5O2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjEwcHg7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2UyZThmMDtcIj5cbiAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC45ZW07Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOiMxZTI5M2I7XCI+XHVEODNDXHVERjEwIEhUTUwgUHJldmlldzwvc3Bhbj5cbiAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC44ZW07Y29sb3I6IzY0NzQ4YjtmbGV4OjE7XCI+JHtlc2NhcGVIdG1sKGJhc2UpfTwvc3Bhbj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWQ9XCJmaW5hbC1wcmV2aWV3LWNsb3NlLWJ0blwiXG4gICAgICAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6MC44ZW07cGFkZGluZzozcHggMTBweDtib3JkZXI6MXB4IHNvbGlkICNjYmQ1ZTE7Ym9yZGVyLXJhZGl1czo1cHg7YmFja2dyb3VuZDojZmZmO2N1cnNvcjpwb2ludGVyO2NvbG9yOiM0NzU1Njk7XCJcbiAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiSGlkZSBwcmV2aWV3XCI+SGlkZTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IHN0eWxlPVwicG9zaXRpb246cmVsYXRpdmU7d2lkdGg6MTAwJTtwYWRkaW5nLXRvcDo1Ni4yNSU7YmFja2dyb3VuZDojZjhmYWZjO1wiPlxuICAgICAgICA8aWZyYW1lIGlkPVwiZmluYWwtY3YtcHJldmlld1wiXG4gICAgICAgICAgICAgICAgc3JjPVwiJHtzcmN9XCJcbiAgICAgICAgICAgICAgICB0aXRsZT1cIkZpbmFsIENWIEhUTUwgUHJldmlld1wiXG4gICAgICAgICAgICAgICAgc2FuZGJveD1cImFsbG93LXNhbWUtb3JpZ2luXCJcbiAgICAgICAgICAgICAgICByZWZlcnJlcnBvbGljeT1cIm5vLXJlZmVycmVyXCJcbiAgICAgICAgICAgICAgICBzdHlsZT1cInBvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JvcmRlcjpub25lO1wiXG4gICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkZpbmFsIGdlbmVyYXRlZCBDViBwcmV2aWV3XCI+PC9pZnJhbWU+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgVGFiIHJlbmRlcmVyIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4vKipcbiAqIFBvcHVsYXRlIHRoZSBcIkdlbmVyYXRlXCIgKGZpbmFsX2dlbmVyYXRlKSB0YWIgY29udGVudC5cbiAqIFNob3dzIGRvd25sb2FkIGxpbmtzIGZvciBhbGwgZmluYWwtZ2VuZXJhdGVkIGZpbGVzIGFuZCBhIFwiUHJvY2VlZCB0byBGaW5hbGlzZVwiIGJ1dHRvbi5cbiAqIEBwYXJhbSB7T2JqZWN0fSBjdkRhdGEgLSBDViBkYXRhIG9iamVjdCBmcm9tIHN0YXRlTWFuYWdlci5nZXRUYWJEYXRhKCdjdicpXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBvcHVsYXRlRmluYWxHZW5lcmF0ZVRhYihjdkRhdGEgPSB7fSkge1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgaWYgKCFjb250ZW50KSByZXR1cm47XG5cbiAgLy8gQ29sbGVjdCBjYW5kaWRhdGUgZmlsZXMsIGRlZHVwbGljYXRlXG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0KCk7XG4gIGNvbnN0IGNhbmRpZGF0ZXMgPSBbXG4gICAgY3ZEYXRhLmZpbmFsX2h0bWwsXG4gICAgY3ZEYXRhLmZpbmFsX3BkZixcbiAgICBjdkRhdGEuaHRtbCxcbiAgICBjdkRhdGEucGRmLFxuICAgIGN2RGF0YS5kb2N4LFxuICAgIGN2RGF0YS5hdHNfZG9jeCxcbiAgICBjdkRhdGEuaHVtYW5fZG9jeCxcbiAgICAuLi4oQXJyYXkuaXNBcnJheShjdkRhdGEuZmlsZXMpID8gY3ZEYXRhLmZpbGVzIDogW10pLFxuICBdLmZpbHRlcihCb29sZWFuKTtcblxuICBjb25zdCBmaWxlcyA9IFtdO1xuICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICBpZiAoc2Vlbi5oYXMoZmlsZW5hbWUpKSBjb250aW51ZTtcbiAgICBzZWVuLmFkZChmaWxlbmFtZSk7XG4gICAgaWYgKGZpbGVuYW1lLmVuZHNXaXRoKCcudHh0JykgfHwgZmlsZW5hbWUgPT09ICdqb2JfZGVzY3JpcHRpb24udHh0JykgY29udGludWU7XG4gICAgZmlsZXMucHVzaChmaWxlbmFtZSk7XG4gIH1cblxuICBjb25zdCBodG1sUHJldmlld0ZpbGUgPSBfaHRtbFByZXZpZXdGaWxlKGZpbGVzKTtcblxuICBsZXQgaHRtbCA9ICc8aDE+XHVEODNEXHVEQ0M0IEdlbmVyYXRlZCBGaWxlczwvaDE+JztcbiAgaHRtbCArPSAnPHAgc3R5bGU9XCJjb2xvcjojNDc1NTY5O21hcmdpbi1ib3R0b206OHB4O1wiPllvdXIgQ1YgZmlsZXMgYXJlIHJlYWR5IHRvIGRvd25sb2FkLiBQcmV2aWV3IHRoZSBIVE1MIHZlcnNpb24gYmVsb3csIHRoZW4gY2xpY2sgPHN0cm9uZz5Qcm9jZWVkIHRvIERvd25sb2FkIFJldmlldzwvc3Ryb25nPiB0byBydW4gQVRTIHZhbGlkYXRpb24gYW5kIGFyY2hpdmUgeW91ciBhcHBsaWNhdGlvbi48L3A+JztcbiAgaHRtbCArPSAnPHAgc3R5bGU9XCJmb250LXNpemU6MC44M2VtO2NvbG9yOiM5NGEzYjg7bWFyZ2luLWJvdHRvbToyMHB4O3BhZGRpbmc6OHB4IDEycHg7YmFja2dyb3VuZDojZjhmYWZjO2JvcmRlci1yYWRpdXM6NnB4O2JvcmRlci1sZWZ0OjNweCBzb2xpZCAjZTJlOGYwO1wiPlx1RDgzRFx1RENBMSA8ZW0+VGhpcyB0YWIgbGV0cyB5b3UgZG93bmxvYWQgZmlsZXMgaW1tZWRpYXRlbHkuIFRoZSA8c3Ryb25nPkZpbGUgUmV2aWV3PC9zdHJvbmc+IHN1Yi10YWIgaW4gRmluYWxpc2UgcnVucyBBVFMgY2hlY2tzLCBjb25maXJtcyB0aGUgcGFja2FnZSBpcyBjb21wbGV0ZSwgYW5kIGxldHMgeW91IGFyY2hpdmUgdGhlIGFwcGxpY2F0aW9uLjwvZW0+PC9wPic7XG5cbiAgaWYgKGh0bWxQcmV2aWV3RmlsZSkge1xuICAgIGNvbnN0IHNob3dIaWRlID0gX3ByZXZpZXdPcGVuID8gJ0hpZGUgcHJldmlldycgOiAnU2hvdyBwcmV2aWV3JztcbiAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxMnB4O2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDtcIj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlkPVwiZmluYWwtcHJldmlldy10b2dnbGUtYnRuXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO3BhZGRpbmc6NXB4IDE0cHg7Ym9yZGVyOjFweCBzb2xpZCAjM2I4MmY2O2JvcmRlci1yYWRpdXM6NnB4O2JhY2tncm91bmQ6JHtfcHJldmlld09wZW4gPyAnI2VmZjZmZicgOiAnI2ZmZid9O2NvbG9yOiMzYjgyZjY7Y3Vyc29yOnBvaW50ZXI7Zm9udC13ZWlnaHQ6NjAwO1wiXG4gICAgICAgICAgICAgIGFyaWEtZXhwYW5kZWQ9XCIke19wcmV2aWV3T3Blbn1cIlxuICAgICAgICAgICAgICBhcmlhLWNvbnRyb2xzPVwiZmluYWwtcHJldmlldy1wYW5lXCI+XG4gICAgICAgIFx1RDgzQ1x1REYxMCAke3Nob3dIaWRlfVxuICAgICAgPC9idXR0b24+XG4gICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjhlbTtjb2xvcjojOTRhM2I4O1wiPkluLWJyb3dzZXIgSFRNTCBwcmV2aWV3PC9zcGFuPlxuICAgIDwvZGl2PmA7XG4gICAgaHRtbCArPSBfcmVuZGVyUHJldmlld1BhbmUoaHRtbFByZXZpZXdGaWxlKTtcbiAgfVxuXG4gIGlmIChmaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICBodG1sICs9ICc8cCBzdHlsZT1cImNvbG9yOiM5Y2EzYWY7cGFkZGluZzoxNnB4O1wiPk5vIGZpbGVzIGdlbmVyYXRlZCB5ZXQuPC9wPic7XG4gIH0gZWxzZSB7XG4gICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cImRpc3BsYXk6Z3JpZDtnYXA6MTJweDttYXJnaW4tYm90dG9tOjI4cHg7XCI+JztcbiAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIGZpbGVzKSB7XG4gICAgICBjb25zdCBiYXNlICAgPSBmaWxlbmFtZS5zcGxpdCgnLycpLnBvcCgpO1xuICAgICAgY29uc3QgaWNvbiAgID0gX2ZpbGVJY29uKGZpbGVuYW1lKTtcbiAgICAgIGNvbnN0IGxhYmVsICA9IF9maWxlTGFiZWwoZmlsZW5hbWUpO1xuICAgICAgY29uc3QgZGVzYyAgID0gX2ZpbGVEZXNjcmlwdGlvbihmaWxlbmFtZSk7XG4gICAgICBodG1sICs9IGBcbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjE0cHg7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6I2Y4ZmFmYztib3JkZXI6MXB4IHNvbGlkICNlMmU4ZjA7XG4gICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MTRweCAxOHB4O1wiPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjEuOGVtO1wiPiR7aWNvbn08L3NwYW4+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImZsZXg6MTttaW4td2lkdGg6MDtcIj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjAuOTVlbTtjb2xvcjojMWUyOTNiO1wiPiR7ZXNjYXBlSHRtbChsYWJlbCl9PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuODNlbTtjb2xvcjojNjQ3NDhiO21hcmdpbi10b3A6MnB4O1wiPiR7ZXNjYXBlSHRtbChkZXNjKX08L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8YSBocmVmPVwiL2FwaS9kb3dubG9hZC8ke2VuY29kZVVSSUNvbXBvbmVudChiYXNlKX1cIlxuICAgICAgICAgICAgIGRvd25sb2FkPVwiJHtlc2NhcGVIdG1sKGJhc2UpfVwiXG4gICAgICAgICAgICAgc3R5bGU9XCJkaXNwbGF5OmlubGluZS1mbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6NnB4O1xuICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiMzYjgyZjY7Y29sb3I6I2ZmZjtcbiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzo3cHggMTZweDtib3JkZXItcmFkaXVzOjZweDtcbiAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOjAuODhlbTtmb250LXdlaWdodDo2MDA7dGV4dC1kZWNvcmF0aW9uOm5vbmU7XG4gICAgICAgICAgICAgICAgICAgIHdoaXRlLXNwYWNlOm5vd3JhcDtcIj5cbiAgICAgICAgICAgIFx1MkIwN1x1RkUwRiBEb3dubG9hZFxuICAgICAgICAgIDwvYT5cbiAgICAgICAgPC9kaXY+YDtcbiAgICB9XG4gICAgaHRtbCArPSAnPC9kaXY+JztcbiAgfVxuXG4gIGlmIChjdkRhdGEub3V0cHV0X2Rpcikge1xuICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjI0cHg7cGFkZGluZzoxMHB4IDE0cHg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6I2YxZjVmOTtib3JkZXItcmFkaXVzOjZweDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOjEzcHg7Y29sb3I6IzY0NzQ4YjtcIj5cbiAgICAgIDxzdHJvbmc+T3V0cHV0IGRpcmVjdG9yeTo8L3N0cm9uZz4gJHtlc2NhcGVIdG1sKGN2RGF0YS5vdXRwdXRfZGlyKX1cbiAgICA8L2Rpdj5gO1xuICB9XG5cbiAgaHRtbCArPSBgXG4gICAgPGRpdiBjbGFzcz1cIm5hdi1idXR0b25zIG5hdi1lbmRcIiBzdHlsZT1cIm1hcmdpbi10b3A6MjRweDtcIj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJjb250aW51ZS1idG5cIiBpZD1cImZpbmFsLWdlbmVyYXRlLWNvbnRpbnVlLWJ0blwiXG4gICAgICAgICAgICAgIG9uY2xpY2s9XCJmaW5hbEdlbmVyYXRpb25Db21wbGV0ZSgpXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6MWVtO3BhZGRpbmc6MTBweCAyNHB4O1wiPlxuICAgICAgICBcdTI3MDUgUHJvY2VlZCB0byBEb3dubG9hZCBSZXZpZXcgXHUyMTkyXG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5gO1xuXG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gaHRtbDtcblxuICAvLyBXaXJlIHVwIHByZXZpZXcgdG9nZ2xlXG4gIGlmIChodG1sUHJldmlld0ZpbGUpIHtcbiAgICBjb25zdCB0b2dnbGVCdG4gID0gY29udGVudC5xdWVyeVNlbGVjdG9yKCcjZmluYWwtcHJldmlldy10b2dnbGUtYnRuJyk7XG4gICAgY29uc3QgY2xvc2VCdG4gICA9IGNvbnRlbnQucXVlcnlTZWxlY3RvcignI2ZpbmFsLXByZXZpZXctY2xvc2UtYnRuJyk7XG4gICAgY29uc3QgcHJldmlld1BhbmUgPSBjb250ZW50LnF1ZXJ5U2VsZWN0b3IoJyNmaW5hbC1wcmV2aWV3LXBhbmUnKTtcblxuICAgIGNvbnN0IHNldFByZXZpZXdPcGVuID0gKG9wZW4pID0+IHtcbiAgICAgIF9wcmV2aWV3T3BlbiA9IG9wZW47XG4gICAgICBpZiAocHJldmlld1BhbmUpIHByZXZpZXdQYW5lLnN0eWxlLmRpc3BsYXkgPSBvcGVuID8gJycgOiAnbm9uZSc7XG4gICAgICBpZiAodG9nZ2xlQnRuKSB7XG4gICAgICAgIHRvZ2dsZUJ0bi50ZXh0Q29udGVudCA9IG9wZW4gPyAnXHVEODNDXHVERjEwIEhpZGUgcHJldmlldycgOiAnXHVEODNDXHVERjEwIFNob3cgcHJldmlldyc7XG4gICAgICAgIHRvZ2dsZUJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCBTdHJpbmcob3BlbikpO1xuICAgICAgICB0b2dnbGVCdG4uc3R5bGUuYmFja2dyb3VuZCA9IG9wZW4gPyAnI2VmZjZmZicgOiAnI2ZmZic7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRvZ2dsZUJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBzZXRQcmV2aWV3T3BlbighX3ByZXZpZXdPcGVuKSk7XG4gICAgY2xvc2VCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgICgpID0+IHNldFByZXZpZXdPcGVuKGZhbHNlKSk7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIFBoYXNlIHRyYW5zaXRpb24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8qKlxuICogQWR2YW5jZSB3b3JrZmxvdyBmcm9tIGZpbmFsX2dlbmVyYXRpb24gXHUyMTkyIHJlZmluZW1lbnQuXG4gKiBDYWxscyBQT1NUIC9hcGkvZmluYWwtZ2VuZXJhdGlvbi1jb21wbGV0ZSwgdXBkYXRlcyBmcm9udGVuZCBwaGFzZSwgYW5kXG4gKiBzd2l0Y2hlcyB0byB0aGUgZG93bmxvYWQgdGFiLlxuICovXG5hc3luYyBmdW5jdGlvbiBmaW5hbEdlbmVyYXRpb25Db21wbGV0ZSgpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGlDYWxsKCdQT1NUJywgJy9hcGkvZmluYWwtZ2VuZXJhdGlvbi1jb21wbGV0ZScsIHt9KTtcbiAgICBpZiAoIXJlcz8ub2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihyZXM/LmVycm9yIHx8ICdGYWlsZWQgdG8gYWR2YW5jZSB0byBGaWxlIFJldmlldyBzdGVwLicpO1xuICAgIH1cbiAgICBzdGF0ZU1hbmFnZXIuc2V0UGhhc2UoJ3JlZmluZW1lbnQnKTtcbiAgICBzd2l0Y2hUYWIoJ2Rvd25sb2FkJyk7XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ1x1MjcwNSBGaWxlcyBnZW5lcmF0ZWQuIFlvdSBjYW4gbm93IGZpbmFsaXNlIHlvdXIgYXBwbGljYXRpb24uJyk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy5lcnJvcignZmluYWxHZW5lcmF0aW9uQ29tcGxldGUgZXJyb3I6JywgZXJyKTtcbiAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCBgXHUyNzRDICR7ZXJyLm1lc3NhZ2V9YCk7XG4gIH1cbn1cblxuZXhwb3J0IHsgcG9wdWxhdGVGaW5hbEdlbmVyYXRlVGFiLCBmaW5hbEdlbmVyYXRpb25Db21wbGV0ZSB9O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiBcIlVwZGF0ZSB2aWEgQUlcIiBwYW5lbCAoR0FQLTAxKTogbmF0dXJhbC1sYW5ndWFnZSBpbnN0cnVjdGlvbiBvclxuICogZG9jdW1lbnQtaW5nZXN0aW9uIHVwZGF0ZXMgdG8gTWFzdGVyX0NWX0RhdGEuanNvbiwgcHJvcG9zZWQgYnkgYW4gTExNLFxuICogcmV2aWV3ZWQgYXMgYSBkaWZmLCBhbmQgd3JpdHRlbiBvbmx5IG9uIGV4cGxpY2l0IGNvbmZpcm1hdGlvbi5cbiAqXG4gKiBSZW5kZXJlZCBpbnNpZGUgdGhlIE1hc3RlciBDViB0YWIgKHNlZSB3ZWIvbWFzdGVyLWN2LmpzKSwgY29sbGFwc2VkIGJ5XG4gKiBkZWZhdWx0LiBSZXVzZXMgd2ViL3Byb3Bvc2FsLXJldmlldy5qcydzIHJvdyByZW5kZXJlciBmb3IgdGhlIGRpZmYgcmV2aWV3XG4gKiBsaXN0IHJhdGhlciB0aGFuIGZvcmtpbmcgYSB0aGlyZCBjb3B5IG9mIHRoYXQgVUkgKGhhcnZlc3QuanMgYW5kXG4gKiBsYXlvdXQtaW5zdHJ1Y3Rpb24uanMncyByZW5kZXJDb250ZW50UHJvcG9zYWxzIGFscmVhZHkgZXhpc3QpLlxuICpcbiAqIFB1YmxpYyBleHBvcnRzIChhc3NpZ25lZCB0byB3aW5kb3cgYnkgd2ViL3NyYy9tYWluLmpzJ3MgYnVuZGxlKTpcbiAqICAgcmVuZGVyTWFzdGVyRGF0YUFpVXBkYXRlUGFuZWwoKVxuICogICB0b2dnbGVNYXN0ZXJEYXRhQWlQYW5lbCgpXG4gKiAgIHNldE1hc3RlckRhdGFBaU1vZGUobW9kZSlcbiAqICAgaGFuZGxlTWFzdGVyRGF0YUFpRmlsZVVwbG9hZChldmVudClcbiAqICAgc3VibWl0TWFzdGVyRGF0YUFpUHJvcG9zZSgpXG4gKiAgIGRpc2NhcmRNYXN0ZXJEYXRhQWlQcm9wb3NhbCgpXG4gKiAgIGNvbmZpcm1NYXN0ZXJEYXRhQWlVcGRhdGUoKVxuICpcbiAqIEtleWJvYXJkOiBDdHJsL0NtZCtFbnRlciBvbiBlaXRoZXIgaW5wdXQgdGV4dGFyZWEgc3VibWl0cyBcIlByb3Bvc2UgVXBkYXRlXCJcbiAqICh3aXJlZCBsb2NhbGx5IHZpYSBvbmtleWRvd24sIG5vdCBrZXlib2FyZC1zaG9ydGN1dHMuanMncyBnbG9iYWxcbiAqIF9UQUJfQUNUSU9OX0JUTiBtYXAgXHUyMDE0IHRoZSBNYXN0ZXIgQ1YgdGFiIGhhcyBzZXZlcmFsIGluZGVwZW5kZW50IGZvcm1zIHdpdGhcbiAqIG5vIHNpbmdsZSBwcmltYXJ5IGFjdGlvbiwgc28gY2xhaW1pbmcgdGhpcyBwYW5lbCBhcyAqdGhlKiB0YWItd2lkZVxuICogQ3RybCtFbnRlciB0YXJnZXQgd291bGQgYmUgbWlzbGVhZGluZy9yZWdyZXNzIHRoZSB0YWIncyBvdGhlciBzYXZlXG4gKiBhY3Rpb25zOyBhIGxvY2FsLCBzY29wZWQgc2hvcnRjdXQgaXMgdGhlIGNvcnJlY3QgZml0IGhlcmUgaW5zdGVhZCkuXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZXNjLCByZW5kZXJQcm9wb3NhbFJvdywgYXR0YWNoUHJvcG9zYWxSb3dMaXN0ZW5lcnMgfSBmcm9tICcuL3Byb3Bvc2FsLXJldmlldy5qcyc7XG5cbmNvbnN0IGxvZyA9IGdldExvZ2dlcignbWFzdGVyLWRhdGEtYWktdXBkYXRlJyk7XG5cbi8vIFx1MjUwMFx1MjUwMCBTdGF0ZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbi8vIENsb3N1cmUtc2NvcGVkLCBjb25zaXN0ZW50IHdpdGggaG93IGhhcnZlc3QuanMgbWFuYWdlcyBpdHMgb3duIGxvY2FsIHN0YXRlIFx1MjAxNFxuLy8gdGhpcyBwYW5lbCBkb2Vzbid0IG5lZWQgdG8gcGFydGljaXBhdGUgaW4gc3RhdGUtbWFuYWdlci5qcydzIGdsb2JhbHMuXG5cbmxldCBfbWR1TW9kZSA9ICdubF9pbnN0cnVjdGlvbic7ICAgICAgICAgICAvLyAnbmxfaW5zdHJ1Y3Rpb24nIHwgJ2RvY3VtZW50X2luZ2VzdGlvbidcbmxldCBfbWR1UGVuZGluZ1Byb3Bvc2FsID0gbnVsbDsgICAgICAgICAgICAvLyB7IHByb3Bvc2FsSWQsIHNvdXJjZSwgY2hhbmdlcyB9XG5sZXQgX21kdVByaW9yQ2xhcmlmaWNhdGlvbnMgPSBbXTsgICAgICAgICAgLy8gW3txdWVzdGlvbiwgYW5zd2VyfSwgLi4uXVxuXG5mdW5jdGlvbiBfbWR1UmVzZXRTdGF0ZSgpIHtcbiAgX21kdU1vZGUgPSAnbmxfaW5zdHJ1Y3Rpb24nO1xuICBfbWR1UGVuZGluZ1Byb3Bvc2FsID0gbnVsbDtcbiAgX21kdVByaW9yQ2xhcmlmaWNhdGlvbnMgPSBbXTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFBhbmVsIHNoZWxsIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiByZW5kZXJNYXN0ZXJEYXRhQWlVcGRhdGVQYW5lbCgpIHtcbiAgLy8gUmVzZXQgbW9kdWxlIHN0YXRlIG9uIGV2ZXJ5IGZyZXNoIHJlbmRlciAobm90IGp1c3QgcGFnZSBsb2FkKSBcdTIwMTQgdGhlIERPTVxuICAvLyB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYWx3YXlzIGRlcGljdHMgdGhlIG5sX2luc3RydWN0aW9uL25vLXByb3Bvc2FsXG4gIC8vIGRlZmF1bHQsIHNvIGFueSBjYXJyaWVkLW92ZXIgc3RhdGUgZnJvbSBhIHByaW9yIHJlbmRlciAoZS5nLiB0aGUgdXNlclxuICAvLyBzd2l0Y2hlZCB0YWJzIG1pZC1wcm9wb3NhbCBhbmQgcG9wdWxhdGVNYXN0ZXJUYWIoKSByZS1yZW5kZXJlZCB0aGlzXG4gIC8vIHBhbmVsKSBtdXN0IGJlIGRpc2NhcmRlZCB0byBhdm9pZCB0aGUgdHdvIGdvaW5nIG91dCBvZiBzeW5jLlxuICBfbWR1UmVzZXRTdGF0ZSgpO1xuICByZXR1cm4gYFxuICAgIDxkaXYgaWQ9XCJtZHUtcGFuZWxcIiBzdHlsZT1cIm1hcmdpbjoxNnB4IDA7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1jdi1ib3JkZXIpO2JvcmRlci1yYWRpdXM6OHB4O292ZXJmbG93OmhpZGRlbjtcIj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlkPVwibWR1LXRvZ2dsZS1idG5cIiBvbmNsaWNrPVwidG9nZ2xlTWFzdGVyRGF0YUFpUGFuZWwoKVwiXG4gICAgICAgIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiIGFyaWEtY29udHJvbHM9XCJtZHUtcGFuZWwtYm9keVwiXG4gICAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTt0ZXh0LWFsaWduOmxlZnQ7YmFja2dyb3VuZDp2YXIoLS1jdi1iZy1saWdodCk7Ym9yZGVyOm5vbmU7cGFkZGluZzoxMnB4IDE2cHg7Zm9udC1zaXplOjAuOTVlbTtmb250LXdlaWdodDo3MDA7Y29sb3I6dmFyKC0tY3YtdGV4dC1wcmltYXJ5KTtjdXJzb3I6cG9pbnRlcjtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDo4cHg7XCI+XG4gICAgICAgIDxzcGFuIGlkPVwibWR1LXRvZ2dsZS1pY29uXCI+XHUyNUI4PC9zcGFuPiBcdUQ4M0VcdUREMTYgVXBkYXRlIHZpYSBBSVxuICAgICAgPC9idXR0b24+XG4gICAgICA8ZGl2IGlkPVwibWR1LXBhbmVsLWJvZHlcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtwYWRkaW5nOjE2cHg7XCI+XG4gICAgICAgIDxwIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtjb2xvcjp2YXIoLS1jdi10ZXh0LXNlY29uZGFyeSk7bWFyZ2luOjAgMCAxNHB4O1wiPlxuICAgICAgICAgIFByZWZlciBwbGFpbiBFbmdsaXNoLCBvciBoYXZlIGFuIG9sZCBDViBvciBMaW5rZWRJbiBleHBvcnQ/IERlc2NyaWJlIGEgY2hhbmdlIG9yIHBhc3RlL3VwbG9hZCBhXG4gICAgICAgICAgZG9jdW1lbnQgYW5kIEFJIHdpbGwgZHJhZnQgaXQgZm9yIHlvdSB0byByZXZpZXcgXHUyMDE0IG5vdGhpbmcgaXMgc2F2ZWQgdW50aWwgeW91IGNvbmZpcm0uXG4gICAgICAgIDwvcD5cblxuICAgICAgICA8ZGl2IHJvbGU9XCJ0YWJsaXN0XCIgYXJpYS1sYWJlbD1cIlVwZGF0ZSBtZXRob2RcIiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6NnB4O21hcmdpbi1ib3R0b206MTJweDtcIj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBpZD1cIm1kdS1tb2RlLW5sX2luc3RydWN0aW9uLWJ0blwiIHJvbGU9XCJ0YWJcIiBhcmlhLXNlbGVjdGVkPVwidHJ1ZVwiXG4gICAgICAgICAgICBvbmNsaWNrPVwic2V0TWFzdGVyRGF0YUFpTW9kZSgnbmxfaW5zdHJ1Y3Rpb24nKVwiXG4gICAgICAgICAgICBzdHlsZT1cInBhZGRpbmc6NnB4IDE0cHg7Zm9udC1zaXplOjAuODVlbTtib3JkZXItcmFkaXVzOjZweCA2cHggMCAwO2JvcmRlcjoxcHggc29saWQgdmFyKC0tY3YtYm9yZGVyKTtib3JkZXItYm90dG9tOm5vbmU7YmFja2dyb3VuZDp2YXIoLS1jdi13aGl0ZSk7Y29sb3I6dmFyKC0tY3YtdGV4dC1wcmltYXJ5KTtmb250LXdlaWdodDo2MDA7Y3Vyc29yOnBvaW50ZXI7XCI+XG4gICAgICAgICAgICBEZXNjcmliZSBhIGNoYW5nZVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlkPVwibWR1LW1vZGUtZG9jdW1lbnRfaW5nZXN0aW9uLWJ0blwiIHJvbGU9XCJ0YWJcIiBhcmlhLXNlbGVjdGVkPVwiZmFsc2VcIlxuICAgICAgICAgICAgb25jbGljaz1cInNldE1hc3RlckRhdGFBaU1vZGUoJ2RvY3VtZW50X2luZ2VzdGlvbicpXCJcbiAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZzo2cHggMTRweDtmb250LXNpemU6MC44NWVtO2JvcmRlci1yYWRpdXM6NnB4IDZweCAwIDA7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1jdi1ib3JkZXIpO2JvcmRlci1ib3R0b206bm9uZTtiYWNrZ3JvdW5kOnZhcigtLWN2LWJnLXN1YnRsZSk7Y29sb3I6dmFyKC0tY3YtdGV4dC1zZWNvbmRhcnkpO2N1cnNvcjpwb2ludGVyO1wiPlxuICAgICAgICAgICAgUGFzdGUgb3IgdXBsb2FkIGEgZG9jdW1lbnRcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBpZD1cIm1kdS1ubF9pbnN0cnVjdGlvbi1pbnB1dC1hcmVhXCI+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cIm1kdS1ubC10ZXh0YXJlYVwiIHN0eWxlPVwiZm9udC1zaXplOjAuODJlbTtmb250LXdlaWdodDo2MDA7Y29sb3I6dmFyKC0tY3YtdGV4dC1tdXRlZCk7ZGlzcGxheTpibG9jazttYXJnaW4tYm90dG9tOjRweDtcIj5cbiAgICAgICAgICAgIERlc2NyaWJlIHRoZSBjaGFuZ2VcbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDx0ZXh0YXJlYSBpZD1cIm1kdS1ubC10ZXh0YXJlYVwiIHJvd3M9XCIzXCIgbWF4bGVuZ3RoPVwiNDAwMFwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gJnF1b3Q7SSBqdXN0IGZpbmlzaGVkIGEgcHJvamVjdCBhdCBBY21lIHVzaW5nIEt1YmVybmV0ZXMgXHUyMDE0IGFkZCBpdCB0byB0aGF0IHJvbGUncyBhY2hpZXZlbWVudHMuJnF1b3Q7XCJcbiAgICAgICAgICAgIG9ua2V5ZG93bj1cImlmKChldmVudC5jdHJsS2V5fHxldmVudC5tZXRhS2V5KSYmZXZlbnQua2V5PT09J0VudGVyJyl7ZXZlbnQucHJldmVudERlZmF1bHQoKTtzdWJtaXRNYXN0ZXJEYXRhQWlQcm9wb3NlKCk7fVwiXG4gICAgICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Ym94LXNpemluZzpib3JkZXItYm94O3BhZGRpbmc6OHB4O2JvcmRlcjoxcHggc29saWQgdmFyKC0tY3YtYm9yZGVyKTtib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6MC44OGVtO3Jlc2l6ZTp2ZXJ0aWNhbDtcIj48L3RleHRhcmVhPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGlkPVwibWR1LWRvY3VtZW50X2luZ2VzdGlvbi1pbnB1dC1hcmVhXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cIm1kdS1kb2MtdGV4dGFyZWFcIiBzdHlsZT1cImZvbnQtc2l6ZTowLjgyZW07Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOnZhcigtLWN2LXRleHQtbXV0ZWQpO2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWJvdHRvbTo0cHg7XCI+XG4gICAgICAgICAgICBQYXN0ZSBkb2N1bWVudCB0ZXh0LCBvciB1cGxvYWQgYSBmaWxlXG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8dGV4dGFyZWEgaWQ9XCJtZHUtZG9jLXRleHRhcmVhXCIgcm93cz1cIjRcIiBtYXhsZW5ndGg9XCI2MDAwMFwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlBhc3RlIGFuIG9sZCBDViBvciBMaW5rZWRJbiBleHBvcnQuLi5cIlxuICAgICAgICAgICAgb25rZXlkb3duPVwiaWYoKGV2ZW50LmN0cmxLZXl8fGV2ZW50Lm1ldGFLZXkpJiZldmVudC5rZXk9PT0nRW50ZXInKXtldmVudC5wcmV2ZW50RGVmYXVsdCgpO3N1Ym1pdE1hc3RlckRhdGFBaVByb3Bvc2UoKTt9XCJcbiAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTtib3gtc2l6aW5nOmJvcmRlci1ib3g7cGFkZGluZzo4cHg7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1jdi1ib3JkZXIpO2JvcmRlci1yYWRpdXM6NHB4O2ZvbnQtc2l6ZTowLjg4ZW07cmVzaXplOnZlcnRpY2FsO21hcmdpbi1ib3R0b206OHB4O1wiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgaWQ9XCJtZHUtZG9jLWZpbGUtaW5wdXRcIiBhY2NlcHQ9XCIudHh0LC5tZCwucnN0LC5odG1sLC5odG0sLnBkZiwuZG9jeCwucnRmXCJcbiAgICAgICAgICAgIG9uY2hhbmdlPVwiaGFuZGxlTWFzdGVyRGF0YUFpRmlsZVVwbG9hZChldmVudClcIiBhcmlhLWRlc2NyaWJlZGJ5PVwibWR1LXVwbG9hZC1kaXNjbG9zdXJlXCJcbiAgICAgICAgICAgIHN0eWxlPVwiZm9udC1zaXplOjAuODJlbTtcIj5cbiAgICAgICAgICA8cCBpZD1cIm1kdS11cGxvYWQtZGlzY2xvc3VyZVwiIHN0eWxlPVwiZm9udC1zaXplOjAuNzhlbTtjb2xvcjp2YXIoLS1jdi10ZXh0LXNlY29uZGFyeSk7bWFyZ2luOjZweCAwIDA7XCI+XG4gICAgICAgICAgICBUaGlzIGRvY3VtZW50IHdpbGwgYmUgc2VudCB0byB5b3VyIGNvbmZpZ3VyZWQgQUkgcHJvdmlkZXIgXHUyMDE0IHNlZSB0aGUgZGF0YSBoYW5kbGluZyBiYWRnZSBhYm92ZS5cbiAgICAgICAgICAgIEFuIG9sZCBDViBvciBMaW5rZWRJbiBleHBvcnQgY2FuIGNhcnJ5IG1vcmUgcGVyc29uYWwgaW5mb3JtYXRpb24gdGhhbiBhIGpvYiBkZXNjcmlwdGlvbi5cbiAgICAgICAgICA8L3A+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjhweDthbGlnbi1pdGVtczpjZW50ZXI7bWFyZ2luLXRvcDoxMnB4O1wiPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlkPVwibWR1LXByb3Bvc2UtYnRuXCIgb25jbGljaz1cInN1Ym1pdE1hc3RlckRhdGFBaVByb3Bvc2UoKVwiXG4gICAgICAgICAgICBzdHlsZT1cInBhZGRpbmc6OHB4IDE4cHg7Zm9udC1zaXplOjAuODhlbTtmb250LXdlaWdodDo2MDA7Y3Vyc29yOnBvaW50ZXI7YmFja2dyb3VuZDp2YXIoLS1jdi1hY2NlbnQpO2NvbG9yOnZhcigtLWN2LXdoaXRlKTtib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjZweDtcIj5cbiAgICAgICAgICAgIFByb3Bvc2UgVXBkYXRlXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWQ9XCJtZHUtZGlzY2FyZC1idG5cIiBvbmNsaWNrPVwiZGlzY2FyZE1hc3RlckRhdGFBaVByb3Bvc2FsKClcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtwYWRkaW5nOjhweCAxNHB4O2ZvbnQtc2l6ZTowLjg1ZW07Y3Vyc29yOnBvaW50ZXI7YmFja2dyb3VuZDp2YXIoLS1jdi13aGl0ZSk7Y29sb3I6dmFyKC0tY3YtdGV4dC1zZWNvbmRhcnkpO2JvcmRlcjoxcHggc29saWQgdmFyKC0tY3YtYm9yZGVyKTtib3JkZXItcmFkaXVzOjZweDtcIj5cbiAgICAgICAgICAgIERpc2NhcmRcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBpZD1cIm1kdS1zdGF0dXNcIiByb2xlPVwic3RhdHVzXCIgYXJpYS1saXZlPVwicG9saXRlXCIgc3R5bGU9XCJtYXJnaW4tdG9wOjEwcHg7Zm9udC1zaXplOjAuODVlbTtjb2xvcjp2YXIoLS1jdi10ZXh0LXNlY29uZGFyeSk7XCI+PC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJtZHUtY2xhcmlmaWNhdGlvbi1jb250YWluZXJcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cIm1kdS1yZXZpZXctYXJlYVwiIHN0eWxlPVwibWFyZ2luLXRvcDoxMnB4O1wiPjwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwibWR1LXJlc3VsdFwiIHN0eWxlPVwibWFyZ2luLXRvcDoxMnB4O1wiPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+YDtcbn1cblxuZnVuY3Rpb24gcmVuZGVyTWFzdGVyRGF0YUFpVXBkYXRlRGlzYWJsZWROb3RlKCkge1xuICByZXR1cm4gYFxuICAgIDxkaXYgc3R5bGU9XCJtYXJnaW46MTZweCAwO3BhZGRpbmc6MTBweCAxNHB4O2JhY2tncm91bmQ6dmFyKC0tY3YtYmctc3VidGxlKTtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWN2LWJvcmRlcik7Ym9yZGVyLXJhZGl1czo2cHg7Zm9udC1zaXplOjAuODVlbTtjb2xvcjp2YXIoLS1jdi10ZXh0LXNlY29uZGFyeSk7XCI+XG4gICAgICBcdUQ4M0VcdUREMTYgVXBkYXRlIHZpYSBBSSBpcyBhdmFpbGFibGUgYmVmb3JlIGFuYWx5c2lzIHN0YXJ0cyBvciBkdXJpbmcgcmVmaW5lbWVudC5cbiAgICA8L2Rpdj5gO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgUGFuZWwgZXhwYW5kL2NvbGxhcHNlICsgbW9kZSB0b2dnbGUgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIHRvZ2dsZU1hc3RlckRhdGFBaVBhbmVsKCkge1xuICBjb25zdCBib2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1wYW5lbC1ib2R5Jyk7XG4gIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtdG9nZ2xlLWJ0bicpO1xuICBjb25zdCBpY29uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS10b2dnbGUtaWNvbicpO1xuICBpZiAoIWJvZHkgfHwgIWJ0bikgcmV0dXJuO1xuICBjb25zdCBleHBhbmRlZCA9IGJvZHkuc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnO1xuICBib2R5LnN0eWxlLmRpc3BsYXkgPSBleHBhbmRlZCA/ICdub25lJyA6ICdibG9jayc7XG4gIGJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCBTdHJpbmcoIWV4cGFuZGVkKSk7XG4gIGlmIChpY29uKSBpY29uLnRleHRDb250ZW50ID0gZXhwYW5kZWQgPyAnXHUyNUI4JyA6ICdcdTI1QkUnO1xufVxuXG5mdW5jdGlvbiBzZXRNYXN0ZXJEYXRhQWlNb2RlKG1vZGUpIHtcbiAgX21kdU1vZGUgPSBtb2RlO1xuICBmb3IgKGNvbnN0IG0gb2YgWydubF9pbnN0cnVjdGlvbicsICdkb2N1bWVudF9pbmdlc3Rpb24nXSkge1xuICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBtZHUtbW9kZS0ke219LWJ0bmApO1xuICAgIGNvbnN0IGFyZWEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgbWR1LSR7bX0taW5wdXQtYXJlYWApO1xuICAgIGNvbnN0IGFjdGl2ZSA9IG0gPT09IG1vZGU7XG4gICAgaWYgKGJ0bikge1xuICAgICAgYnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1zZWxlY3RlZCcsIFN0cmluZyhhY3RpdmUpKTtcbiAgICAgIGJ0bi5zdHlsZS5iYWNrZ3JvdW5kID0gYWN0aXZlID8gJ3ZhcigtLWN2LXdoaXRlKScgOiAndmFyKC0tY3YtYmctc3VidGxlKSc7XG4gICAgICBidG4uc3R5bGUuY29sb3IgPSBhY3RpdmUgPyAndmFyKC0tY3YtdGV4dC1wcmltYXJ5KScgOiAndmFyKC0tY3YtdGV4dC1zZWNvbmRhcnkpJztcbiAgICAgIGJ0bi5zdHlsZS5mb250V2VpZ2h0ID0gYWN0aXZlID8gJzYwMCcgOiAnNDAwJztcbiAgICB9XG4gICAgaWYgKGFyZWEpIGFyZWEuc3R5bGUuZGlzcGxheSA9IGFjdGl2ZSA/ICdibG9jaycgOiAnbm9uZSc7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIERvY3VtZW50IHVwbG9hZCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gaGFuZGxlTWFzdGVyRGF0YUFpRmlsZVVwbG9hZChldmVudCkge1xuICBjb25zdCBmaWxlID0gZXZlbnQudGFyZ2V0LmZpbGVzICYmIGV2ZW50LnRhcmdldC5maWxlc1swXTtcbiAgaWYgKCFmaWxlKSByZXR1cm47XG4gIGNvbnN0IHN0YXR1c0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1zdGF0dXMnKTtcbiAgaWYgKHN0YXR1c0VsKSBzdGF0dXNFbC50ZXh0Q29udGVudCA9IGBSZWFkaW5nICR7ZmlsZS5uYW1lfVx1MjAyNmA7XG4gIHRyeSB7XG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ2ZpbGUnLCBmaWxlKTtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2goJy9hcGkvdXBsb2FkLWZpbGUnLCB7IG1ldGhvZDogJ1BPU1QnLCBib2R5OiBmb3JtRGF0YSB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcC5qc29uKCk7XG4gICAgaWYgKCFyZXNwLm9rIHx8IGRhdGEuZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihkYXRhLm1lc3NhZ2UgfHwgZGF0YS5lcnJvciB8fCBgU2VydmVyIGVycm9yICR7cmVzcC5zdGF0dXN9YCk7XG4gICAgfVxuICAgIGNvbnN0IHRleHRhcmVhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1kb2MtdGV4dGFyZWEnKTtcbiAgICBpZiAodGV4dGFyZWEpIHRleHRhcmVhLnZhbHVlID0gZGF0YS50ZXh0O1xuICAgIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSBgTG9hZGVkICR7ZGF0YS5jb250ZW50X2xlbmd0aC50b0xvY2FsZVN0cmluZygpfSBjaGFyYWN0ZXJzIGZyb20gXCIke2RhdGEuZmlsZW5hbWV9XCIuYDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLmVycm9yKCdoYW5kbGVNYXN0ZXJEYXRhQWlGaWxlVXBsb2FkOiBmYWlsZWQnLCBlcnIpO1xuICAgIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSBgRXJyb3IgcmVhZGluZyBmaWxlOiAke2Vyci5tZXNzYWdlfWA7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIFByb3Bvc2UgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIF9tZHVFbmRwb2ludEZvck1vZGUobW9kZSkge1xuICByZXR1cm4gbW9kZSA9PT0gJ25sX2luc3RydWN0aW9uJyA/ICcvYXBpL21hc3Rlci1kYXRhL25sLXVwZGF0ZS9wcm9wb3NlJyA6ICcvYXBpL21hc3Rlci1kYXRhL2luZ2VzdC1kb2N1bWVudC9wcm9wb3NlJztcbn1cblxuZnVuY3Rpb24gX21kdUlucHV0Rm9yTW9kZShtb2RlKSB7XG4gIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobW9kZSA9PT0gJ25sX2luc3RydWN0aW9uJyA/ICdtZHUtbmwtdGV4dGFyZWEnIDogJ21kdS1kb2MtdGV4dGFyZWEnKTtcbiAgcmV0dXJuIGVsID8gZWwudmFsdWUudHJpbSgpIDogJyc7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN1Ym1pdE1hc3RlckRhdGFBaVByb3Bvc2UoKSB7XG4gIGNvbnN0IGlucHV0ID0gX21kdUlucHV0Rm9yTW9kZShfbWR1TW9kZSk7XG4gIGNvbnN0IHN0YXR1c0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1zdGF0dXMnKTtcbiAgY29uc3QgcmV2aWV3QXJlYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtcmV2aWV3LWFyZWEnKTtcbiAgY29uc3QgcmVzdWx0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWR1LXJlc3VsdCcpO1xuICBjb25zdCBwcm9wb3NlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1wcm9wb3NlLWJ0bicpO1xuXG4gIGlmICghaW5wdXQpIHtcbiAgICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gX21kdU1vZGUgPT09ICdubF9pbnN0cnVjdGlvbidcbiAgICAgID8gJ1BsZWFzZSBkZXNjcmliZSB0aGUgY2hhbmdlIGZpcnN0LidcbiAgICAgIDogJ1BsZWFzZSBwYXN0ZSBvciB1cGxvYWQgZG9jdW1lbnQgdGV4dCBmaXJzdC4nO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChyZXZpZXdBcmVhKSByZXZpZXdBcmVhLmlubmVySFRNTCA9ICcnO1xuICBpZiAocmVzdWx0RWwpIHJlc3VsdEVsLmlubmVySFRNTCA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWR1LWNsYXJpZmljYXRpb24tY29udGFpbmVyJykuaW5uZXJIVE1MID0gJyc7XG4gIGlmIChwcm9wb3NlQnRuKSB7IHByb3Bvc2VCdG4uZGlzYWJsZWQgPSB0cnVlOyBwcm9wb3NlQnRuLnRleHRDb250ZW50ID0gJ0FuYWx5emluZ1x1MjAyNic7IH1cbiAgaWYgKHN0YXR1c0VsKSBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICdBbmFseXppbmdcdTIwMjYnO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgYm9keSA9IHsgcHJpb3JfY2xhcmlmaWNhdGlvbnM6IF9tZHVQcmlvckNsYXJpZmljYXRpb25zIH07XG4gICAgYm9keVtfbWR1TW9kZSA9PT0gJ25sX2luc3RydWN0aW9uJyA/ICdpbnN0cnVjdGlvbicgOiAndGV4dCddID0gaW5wdXQ7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKF9tZHVFbmRwb2ludEZvck1vZGUoX21kdU1vZGUpLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3AuanNvbigpO1xuXG4gICAgaWYgKCFyZXNwLm9rIHx8IGRhdGEub2sgPT09IGZhbHNlKSB7XG4gICAgICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gYEVycm9yOiAke2VzYyhkYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yJyl9YDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZGF0YS5yZXF1aXJlc19jbGFyaWZpY2F0aW9uKSB7XG4gICAgICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJyc7XG4gICAgICBfbWR1U2hvd0NsYXJpZmljYXRpb25EaWFsb2coZGF0YS5jbGFyaWZpY2F0aW9uX3F1ZXN0aW9uLCBpbnB1dCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgX21kdVByaW9yQ2xhcmlmaWNhdGlvbnMgPSBbXTtcbiAgICBjb25zdCBjaGFuZ2VzID0gZGF0YS5jaGFuZ2VzIHx8IFtdO1xuICAgIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnJztcblxuICAgIGlmIChjaGFuZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaWYgKHJldmlld0FyZWEpIHJldmlld0FyZWEuaW5uZXJIVE1MID0gYDxwIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtjb2xvcjp2YXIoLS1jdi10ZXh0LXNlY29uZGFyeSk7XCI+Tm8gY2hhbmdlcyBjb3VsZCBiZSBwcm9wb3NlZCBmcm9tIHRoYXQgXHUyMDE0IHRyeSBhZGRpbmcgbW9yZSBkZXRhaWwuPC9wPmA7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgX21kdVBlbmRpbmdQcm9wb3NhbCA9IHsgcHJvcG9zYWxJZDogZGF0YS5wcm9wb3NhbF9pZCwgc291cmNlOiBfbWR1TW9kZSwgY2hhbmdlcyB9O1xuICAgIF9tZHVSZW5kZXJSZXZpZXdBcmVhKCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy5lcnJvcignc3VibWl0TWFzdGVyRGF0YUFpUHJvcG9zZTogZmFpbGVkJywgZXJyKTtcbiAgICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gYE5ldHdvcmsgZXJyb3I6ICR7ZXNjKGVyci5tZXNzYWdlKX1gO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChwcm9wb3NlQnRuKSB7IHByb3Bvc2VCdG4uZGlzYWJsZWQgPSBmYWxzZTsgcHJvcG9zZUJ0bi50ZXh0Q29udGVudCA9ICdQcm9wb3NlIFVwZGF0ZSc7IH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkaXNjYXJkTWFzdGVyRGF0YUFpUHJvcG9zYWwoKSB7XG4gIF9tZHVQZW5kaW5nUHJvcG9zYWwgPSBudWxsO1xuICBfbWR1UHJpb3JDbGFyaWZpY2F0aW9ucyA9IFtdO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWR1LXJldmlldy1hcmVhJykuaW5uZXJIVE1MID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtcmVzdWx0JykuaW5uZXJIVE1MID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtZGlzY2FyZC1idG4nKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBjb25zdCBzdGF0dXNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtc3RhdHVzJyk7XG4gIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnRGlzY2FyZGVkLic7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBDbGFyaWZpY2F0aW9uIGRpYWxvZyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbi8vIE1vZGVsZWQgb24gc2hvd0NsYXJpZmljYXRpb25EaWFsb2coKSBpbiB3ZWIvbGF5b3V0LWluc3RydWN0aW9uLmpzLCBub3QgYVxuLy8gbGl0ZXJhbCBjb3B5LXBhc3RlIHBvcnQ6IHRoYXQgdmVyc2lvbiBoYXJkLWNvZGVzIGl0cyBtb3VudCBwb2ludCBhbmQgdXNlc1xuLy8gbm9uLW5hbWVzcGFjZWQgZWxlbWVudCBpZHMgKGxheW91dC1jbGFyaWZpY2F0aW9uLSopLCB3aGljaCB3b3VsZCBjb2xsaWRlXG4vLyB3aXRoIHRoaXMgcGFuZWwncyBvd24gaWRzIGlmIGJvdGggdGFicyBhcmUgcHJlc2VudCBpbiB0aGUgRE9NIGF0IG9uY2Vcbi8vIChDU1MtaGlkZGVuIHRhYnMgYXJlbid0IHVubW91bnRlZCkuIFRoaXMgdmVyc2lvbiBtb3VudHMgaW50byB0aGUgcGFuZWwnc1xuLy8gb3duICNtZHUtY2xhcmlmaWNhdGlvbi1jb250YWluZXIgYW5kIHVzZXMgYW4gbWR1LSogaWQgbmFtZXNwYWNlIHRocm91Z2hvdXQuXG5cbmZ1bmN0aW9uIF9tZHVTaG93Q2xhcmlmaWNhdGlvbkRpYWxvZyhxdWVzdGlvbiwgb3JpZ2luYWxJbnN0cnVjdGlvbikge1xuICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWR1LWNsYXJpZmljYXRpb24tY29udGFpbmVyJyk7XG4gIGlmICghY29udGFpbmVyKSB7XG4gICAgbG9nLndhcm4oJ19tZHVTaG93Q2xhcmlmaWNhdGlvbkRpYWxvZzogI21kdS1jbGFyaWZpY2F0aW9uLWNvbnRhaW5lciBub3QgZm91bmQnKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBvcmlnaW5hdGluZ0J0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtcHJvcG9zZS1idG4nKTtcblxuICBjb25zdCBwYW5lbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBwYW5lbC5pZCA9ICdtZHUtY2xhcmlmaWNhdGlvbi1wYW5lbCc7XG4gIHBhbmVsLnNldEF0dHJpYnV0ZSgncm9sZScsICdhbGVydCcpO1xuICBwYW5lbC5zdHlsZS5jc3NUZXh0ID0gJ2JhY2tncm91bmQ6dmFyKC0tY3Ytd2Fybi1iZyk7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1jdi13YXJuLWxpZ2h0KTtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjE0cHg7bWFyZ2luLXRvcDoxMHB4Oyc7XG4gIHBhbmVsLmlubmVySFRNTCA9IGBcbiAgICA8cCBzdHlsZT1cIm1hcmdpbjowIDAgNnB4O2ZvbnQtc2l6ZTowLjg1ZW07Y29sb3I6dmFyKC0tY3Ytd2Fybi10ZXh0KTtmb250LXdlaWdodDo2MDA7XCI+XG4gICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj5cdTI3NTM8L3NwYW4+IEFsbW9zdCB0aGVyZSBcdTIwMTQgYSBiaXQgbW9yZSBkZXRhaWwgd291bGQgaGVscDpcbiAgICA8L3A+XG4gICAgPHAgc3R5bGU9XCJtYXJnaW46MCAwIDEwcHg7Zm9udC1zaXplOjAuODhlbTtjb2xvcjp2YXIoLS1jdi13YXJuLXRleHQpO1wiPiR7ZXNjKHF1ZXN0aW9uKX08L3A+XG4gICAgPGxhYmVsIGZvcj1cIm1kdS1jbGFyaWZpY2F0aW9uLWlucHV0XCIgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjp2YXIoLS1jdi10ZXh0LW11dGVkKTtkaXNwbGF5OmJsb2NrO21hcmdpbi1ib3R0b206NHB4O1wiPlxuICAgICAgWW91ciBjbGFyaWZpY2F0aW9uOlxuICAgIDwvbGFiZWw+XG4gICAgPHRleHRhcmVhIGlkPVwibWR1LWNsYXJpZmljYXRpb24taW5wdXRcIiByb3dzPVwiMlwiXG4gICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Ym94LXNpemluZzpib3JkZXItYm94O3BhZGRpbmc6OHB4O2JvcmRlcjoxcHggc29saWQgdmFyKC0tY3Ytd2Fybi1saWdodCk7Ym9yZGVyLXJhZGl1czo0cHg7Zm9udC1zaXplOjAuODhlbTtyZXNpemU6dmVydGljYWw7XCJcbiAgICAgIGFyaWEtbGFiZWw9XCJDbGFyaWZpY2F0aW9uIGZvciBtYXN0ZXIgZGF0YSB1cGRhdGVcIj4ke2VzYyhvcmlnaW5hbEluc3RydWN0aW9uKX08L3RleHRhcmVhPlxuICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjhweDttYXJnaW4tdG9wOjhweDtcIj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlkPVwibWR1LWNsYXJpZmljYXRpb24tc3VibWl0XCJcbiAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOnZhcigtLWN2LXdhcm4pO2NvbG9yOnZhcigtLWN2LXdoaXRlKTtib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjZweCAxNHB4O2ZvbnQtc2l6ZTowLjg1ZW07Y3Vyc29yOnBvaW50ZXI7Zm9udC13ZWlnaHQ6NjAwO1wiPlxuICAgICAgICBTdWJtaXQgY2xhcmlmaWNhdGlvblxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBpZD1cIm1kdS1jbGFyaWZpY2F0aW9uLWNhbmNlbFwiXG4gICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDpub25lO2JvcmRlcjoxcHggc29saWQgdmFyKC0tY3Ytd2Fybik7Y29sb3I6dmFyKC0tY3Ytd2Fybi10ZXh0KTtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjZweCAxNHB4O2ZvbnQtc2l6ZTowLjg1ZW07Y3Vyc29yOnBvaW50ZXI7XCI+XG4gICAgICAgIENhbmNlbFxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+YDtcblxuICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG4gIGNvbnRhaW5lci5hcHBlbmRDaGlsZChwYW5lbCk7XG5cbiAgY29uc3QgY2xhcklucHV0ID0gcGFuZWwucXVlcnlTZWxlY3RvcignI21kdS1jbGFyaWZpY2F0aW9uLWlucHV0Jyk7XG4gIGNvbnN0IHN1Ym1pdEJ0biA9IHBhbmVsLnF1ZXJ5U2VsZWN0b3IoJyNtZHUtY2xhcmlmaWNhdGlvbi1zdWJtaXQnKTtcbiAgY29uc3QgY2FuY2VsQnRuID0gcGFuZWwucXVlcnlTZWxlY3RvcignI21kdS1jbGFyaWZpY2F0aW9uLWNhbmNlbCcpO1xuXG4gIGNsYXJJbnB1dC5mb2N1cygpO1xuICBjbGFySW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2UoY2xhcklucHV0LnZhbHVlLmxlbmd0aCwgY2xhcklucHV0LnZhbHVlLmxlbmd0aCk7XG5cbiAgY29uc3QgY2xvc2VBbmRSZXN0b3JlRm9jdXMgPSAoKSA9PiB7XG4gICAgcGFuZWwucmVtb3ZlKCk7XG4gICAgaWYgKG9yaWdpbmF0aW5nQnRuKSBvcmlnaW5hdGluZ0J0bi5mb2N1cygpO1xuICB9O1xuXG4gIHN1Ym1pdEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBjb25zdCByZWZpbmVkID0gY2xhcklucHV0LnZhbHVlLnRyaW0oKTtcbiAgICBpZiAocmVmaW5lZCkge1xuICAgICAgX21kdVByaW9yQ2xhcmlmaWNhdGlvbnMgPSBbLi4uX21kdVByaW9yQ2xhcmlmaWNhdGlvbnMsIHsgcXVlc3Rpb24sIGFuc3dlcjogcmVmaW5lZCB9XTtcbiAgICAgIGNvbnN0IGlucHV0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChfbWR1TW9kZSA9PT0gJ25sX2luc3RydWN0aW9uJyA/ICdtZHUtbmwtdGV4dGFyZWEnIDogJ21kdS1kb2MtdGV4dGFyZWEnKTtcbiAgICAgIGlmIChpbnB1dEVsKSBpbnB1dEVsLnZhbHVlID0gcmVmaW5lZDtcbiAgICB9XG4gICAgY2xvc2VBbmRSZXN0b3JlRm9jdXMoKTtcbiAgICBpZiAocmVmaW5lZCkgc3VibWl0TWFzdGVyRGF0YUFpUHJvcG9zZSgpO1xuICB9KTtcbiAgY2FuY2VsQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xvc2VBbmRSZXN0b3JlRm9jdXMpO1xuICBjbGFySW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChlKSA9PiB7XG4gICAgaWYgKGUua2V5ID09PSAnRW50ZXInICYmICFlLnNoaWZ0S2V5KSB7IGUucHJldmVudERlZmF1bHQoKTsgc3VibWl0QnRuLmNsaWNrKCk7IH1cbiAgICBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSBjYW5jZWxCdG4uY2xpY2soKTtcbiAgfSk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBSZXZpZXcgYXJlYSAocHJvcG9zYWwgcm93cykgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIF9tZHVDaGFuZ2VEaXNwbGF5VGV4dChjaGFuZ2UpIHtcbiAgY29uc3QgcHJvcG9zZWQgPSBjaGFuZ2UucHJvcG9zZWQ7XG4gIGlmICh0eXBlb2YgcHJvcG9zZWQgPT09ICdzdHJpbmcnKSByZXR1cm4gcHJvcG9zZWQ7XG4gIGlmIChwcm9wb3NlZCAmJiB0eXBlb2YgcHJvcG9zZWQgPT09ICdvYmplY3QnKSB7XG4gICAgaWYgKCd0ZXh0JyBpbiBwcm9wb3NlZCkgcmV0dXJuIHByb3Bvc2VkLnRleHQ7XG4gICAgaWYgKCduYW1lJyBpbiBwcm9wb3NlZCkgcmV0dXJuIHByb3Bvc2VkLm5hbWU7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHByb3Bvc2VkKTtcbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIF9tZHVGbGFnSHRtbChjaGFuZ2UpIHtcbiAgaWYgKGNoYW5nZS5wb3NzaWJsZV9kdXBsaWNhdGVfb2YpIHtcbiAgICByZXR1cm4gYDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjZweDtwYWRkaW5nOjZweCA4cHg7YmFja2dyb3VuZDp2YXIoLS1jdi13YXJuLWJnKTtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWN2LXdhcm4tYm9yZGVyKTtib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6MC44ZW07Y29sb3I6dmFyKC0tY3Ytd2Fybi10ZXh0KTtcIj5cbiAgICAgIFx1MjZBMCBwb3NzaWJsZSBkdXBsaWNhdGUgb2YgJHtlc2MoY2hhbmdlLnBvc3NpYmxlX2R1cGxpY2F0ZV9vZil9XG4gICAgPC9kaXY+YDtcbiAgfVxuICBpZiAoY2hhbmdlLnBlcnN1YXNpb25fZmxhZ3MgJiYgY2hhbmdlLnBlcnN1YXNpb25fZmxhZ3MubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTo2cHg7cGFkZGluZzo2cHggOHB4O2JhY2tncm91bmQ6dmFyKC0tY3Ytd2Fybi1iZyk7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1jdi13YXJuLWJvcmRlcik7Ym9yZGVyLXJhZGl1czo0cHg7Zm9udC1zaXplOjAuOGVtO2NvbG9yOnZhcigtLWN2LXdhcm4tdGV4dCk7XCI+XG4gICAgICBcdTI2QTAgcXVhbGl0eSBhZHZpc29yeTogJHtlc2MoY2hhbmdlLnBlcnN1YXNpb25fZmxhZ3Muam9pbignLCAnKSl9XG4gICAgPC9kaXY+YDtcbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIF9tZHVBcmlhU3VmZml4KGNoYW5nZSkge1xuICBjb25zdCBwYXJ0cyA9IFtdO1xuICBpZiAoY2hhbmdlLnBvc3NpYmxlX2R1cGxpY2F0ZV9vZikgcGFydHMucHVzaChgcG9zc2libGUgZHVwbGljYXRlIG9mICR7Y2hhbmdlLnBvc3NpYmxlX2R1cGxpY2F0ZV9vZn1gKTtcbiAgaWYgKGNoYW5nZS5wZXJzdWFzaW9uX2ZsYWdzICYmIGNoYW5nZS5wZXJzdWFzaW9uX2ZsYWdzLmxlbmd0aCkgcGFydHMucHVzaChgcXVhbGl0eSBhZHZpc29yeTogJHtjaGFuZ2UucGVyc3Vhc2lvbl9mbGFncy5qb2luKCcsICcpfWApO1xuICByZXR1cm4gcGFydHMubGVuZ3RoID8gYCwgJHtwYXJ0cy5qb2luKCcsICcpfWAgOiAnJztcbn1cblxuZnVuY3Rpb24gX21kdVJlbmRlclJldmlld0FyZWEoKSB7XG4gIGNvbnN0IHJldmlld0FyZWEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWR1LXJldmlldy1hcmVhJyk7XG4gIGNvbnN0IGRpc2NhcmRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWR1LWRpc2NhcmQtYnRuJyk7XG4gIGlmICghcmV2aWV3QXJlYSB8fCAhX21kdVBlbmRpbmdQcm9wb3NhbCkgcmV0dXJuO1xuXG4gIGNvbnN0IGNoYW5nZXMgPSBfbWR1UGVuZGluZ1Byb3Bvc2FsLmNoYW5nZXM7XG4gIGNvbnN0IHJvd3NIdG1sID0gY2hhbmdlcy5tYXAoKGMpID0+IHJlbmRlclByb3Bvc2FsUm93KHtcbiAgICBpZDogYy5pZCxcbiAgICB0eXBlTGFiZWw6IGMuc2VjdGlvbixcbiAgICBsYWJlbDogYy5sYWJlbCxcbiAgICBwcm9wb3NlZDogX21kdUNoYW5nZURpc3BsYXlUZXh0KGMpLFxuICAgIGRldGFpbFRleHQ6IGMucmF0aW9uYWxlLFxuICAgIGZsYWdIdG1sOiBfbWR1RmxhZ0h0bWwoYyksXG4gICAgY2hlY2tlZDogZmFsc2UsXG4gIH0sIHtcbiAgICBpZFByZWZpeDogJ21kdScsXG4gICAgY2hlY2tib3hEYXRhQXR0cjogJ21kdS1pZCcsXG4gICAgYXJpYUxhYmVsU3VmZml4OiBfbWR1QXJpYVN1ZmZpeChjKSxcbiAgfSkpLmpvaW4oJycpO1xuXG4gIGNvbnN0IGZsYWdnZWRDb3VudCA9IGNoYW5nZXMuZmlsdGVyKGMgPT4gYy5wb3NzaWJsZV9kdXBsaWNhdGVfb2YgfHwgKGMucGVyc3Vhc2lvbl9mbGFncyAmJiBjLnBlcnN1YXNpb25fZmxhZ3MubGVuZ3RoKSkubGVuZ3RoO1xuXG4gIHJldmlld0FyZWEuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgcm9sZT1cImdyb3VwXCIgYXJpYS1sYWJlbD1cIlByb3Bvc2VkIGNoYW5nZXMsICR7Y2hhbmdlcy5sZW5ndGh9IGl0ZW1zLCAwIHNlbGVjdGVkXCIgaWQ9XCJtZHUtcm93LWdyb3VwXCI+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2FsaWduLWl0ZW1zOmNlbnRlcjttYXJnaW4tYm90dG9tOjhweDtcIj5cbiAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2NvbG9yOnZhcigtLWN2LXRleHQtc2Vjb25kYXJ5KTtcIj4ke2NoYW5nZXMubGVuZ3RofSBwcm9wb3NlZCBjaGFuZ2Uke2NoYW5nZXMubGVuZ3RoID09PSAxID8gJycgOiAncyd9PC9zcGFuPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBvbmNsaWNrPVwic2VsZWN0TWFzdGVyRGF0YUFpTm9uRmxhZ2dlZCgpXCIgc3R5bGU9XCJmb250LXNpemU6MC44ZW07cGFkZGluZzo0cHggMTBweDtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWN2LWJvcmRlcik7Ym9yZGVyLXJhZGl1czo0cHg7YmFja2dyb3VuZDp2YXIoLS1jdi13aGl0ZSk7Y29sb3I6dmFyKC0tY3YtdGV4dC1wcmltYXJ5KTtjdXJzb3I6cG9pbnRlcjtcIj5cbiAgICAgICAgICBTZWxlY3QgYWxsIG5vbi1mbGFnZ2VkXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8dGFibGUgc3R5bGU9XCJ3aWR0aDoxMDAlO2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTtcIj4ke3Jvd3NIdG1sfTwvdGFibGU+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBpZD1cIm1kdS1zZWxlY3Rpb24tbGl2ZVwiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiIGNsYXNzPVwic3Itb25seVwiIHN0eWxlPVwicG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O2hlaWdodDoxcHg7b3ZlcmZsb3c6aGlkZGVuO1wiPjwvZGl2PlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlkPVwibWR1LWNvbmZpcm0tYnRuXCIgb25jbGljaz1cImNvbmZpcm1NYXN0ZXJEYXRhQWlVcGRhdGUoKVwiIGRpc2FibGVkXG4gICAgICBzdHlsZT1cIm1hcmdpbi10b3A6MTBweDtwYWRkaW5nOjlweCAyMHB4O2ZvbnQtc2l6ZTowLjllbTtmb250LXdlaWdodDo2MDA7Y3Vyc29yOm5vdC1hbGxvd2VkO2JhY2tncm91bmQ6dmFyKC0tY3Ytc2xhdGUtMzAwKTtjb2xvcjp2YXIoLS1jdi13aGl0ZSk7Ym9yZGVyOm5vbmU7Ym9yZGVyLXJhZGl1czo2cHg7XCI+XG4gICAgICBDb25maXJtIGFuZCBXcml0ZVxuICAgIDwvYnV0dG9uPlxuICAgICR7ZmxhZ2dlZENvdW50ID8gYDxwIHN0eWxlPVwiZm9udC1zaXplOjAuNzhlbTtjb2xvcjp2YXIoLS1jdi13YXJuLXRleHQpO21hcmdpbi10b3A6NnB4O1wiPiR7ZmxhZ2dlZENvdW50fSBpdGVtJHtmbGFnZ2VkQ291bnQgPT09IDEgPyAnJyA6ICdzJ30gZmxhZ2dlZCBmb3IgcmV2aWV3IGFib3ZlLjwvcD5gIDogJyd9YDtcblxuICBpZiAoZGlzY2FyZEJ0bikgZGlzY2FyZEJ0bi5zdHlsZS5kaXNwbGF5ID0gJ2lubGluZS1ibG9jayc7XG5cbiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1yZXZpZXctYXJlYScpO1xuICBhdHRhY2hQcm9wb3NhbFJvd0xpc3RlbmVycyhjb250YWluZXIsICdtZHUnKTtcbiAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W2RhdGEtbWR1LWlkXScpLmZvckVhY2goKGNiKSA9PiB7XG4gICAgY2IuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgX21kdVVwZGF0ZUNvbmZpcm1CdXR0b25TdGF0ZSk7XG4gIH0pO1xuICBfbWR1VXBkYXRlQ29uZmlybUJ1dHRvblN0YXRlKCk7XG59XG5cbmZ1bmN0aW9uIF9tZHVVcGRhdGVDb25maXJtQnV0dG9uU3RhdGUoKSB7XG4gIGNvbnN0IGNoZWNrZWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtkYXRhLW1kdS1pZF06Y2hlY2tlZCcpO1xuICBjb25zdCBjb25maXJtQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1jb25maXJtLWJ0bicpO1xuICBjb25zdCBncm91cCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtcm93LWdyb3VwJyk7XG4gIGNvbnN0IGxpdmVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtc2VsZWN0aW9uLWxpdmUnKTtcbiAgY29uc3QgdG90YWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtkYXRhLW1kdS1pZF0nKS5sZW5ndGg7XG4gIGlmIChjb25maXJtQnRuKSB7XG4gICAgY29uZmlybUJ0bi5kaXNhYmxlZCA9IGNoZWNrZWQubGVuZ3RoID09PSAwO1xuICAgIGNvbmZpcm1CdG4uc3R5bGUuY3Vyc29yID0gY2hlY2tlZC5sZW5ndGggPT09IDAgPyAnbm90LWFsbG93ZWQnIDogJ3BvaW50ZXInO1xuICAgIGNvbmZpcm1CdG4uc3R5bGUuYmFja2dyb3VuZCA9IGNoZWNrZWQubGVuZ3RoID09PSAwID8gJ3ZhcigtLWN2LXNsYXRlLTMwMCknIDogJ3ZhcigtLWN2LXN1Y2Nlc3MtbWQpJztcbiAgfVxuICBpZiAoZ3JvdXApIGdyb3VwLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIGBQcm9wb3NlZCBjaGFuZ2VzLCAke3RvdGFsfSBpdGVtcywgJHtjaGVja2VkLmxlbmd0aH0gc2VsZWN0ZWRgKTtcbiAgaWYgKGxpdmVFbCkgbGl2ZUVsLnRleHRDb250ZW50ID0gYCR7Y2hlY2tlZC5sZW5ndGh9IG9mICR7dG90YWx9IHNlbGVjdGVkYDtcbn1cblxuZnVuY3Rpb24gc2VsZWN0TWFzdGVyRGF0YUFpTm9uRmxhZ2dlZCgpIHtcbiAgaWYgKCFfbWR1UGVuZGluZ1Byb3Bvc2FsKSByZXR1cm47XG4gIGNvbnN0IGZsYWdnZWRJZHMgPSBuZXcgU2V0KFxuICAgIF9tZHVQZW5kaW5nUHJvcG9zYWwuY2hhbmdlc1xuICAgICAgLmZpbHRlcihjID0+IGMucG9zc2libGVfZHVwbGljYXRlX29mIHx8IChjLnBlcnN1YXNpb25fZmxhZ3MgJiYgYy5wZXJzdWFzaW9uX2ZsYWdzLmxlbmd0aCkpXG4gICAgICAubWFwKGMgPT4gYy5pZCksXG4gICk7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W2RhdGEtbWR1LWlkXScpLmZvckVhY2goKGNiKSA9PiB7XG4gICAgaWYgKCFmbGFnZ2VkSWRzLmhhcyhjYi5kYXRhc2V0Lm1kdUlkKSkgY2IuY2hlY2tlZCA9IHRydWU7XG4gIH0pO1xuICBfbWR1VXBkYXRlQ29uZmlybUJ1dHRvblN0YXRlKCk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBDb25maXJtIGFuZCB3cml0ZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gY29uZmlybU1hc3RlckRhdGFBaVVwZGF0ZSgpIHtcbiAgaWYgKCFfbWR1UGVuZGluZ1Byb3Bvc2FsKSByZXR1cm47XG4gIGNvbnN0IHNlbGVjdGVkSWRzID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtkYXRhLW1kdS1pZF06Y2hlY2tlZCcpKS5tYXAoY2IgPT4gY2IuZGF0YXNldC5tZHVJZCk7XG4gIGlmIChzZWxlY3RlZElkcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBjb25zdCBzb3VyY2VMYWJlbCA9IF9tZHVQZW5kaW5nUHJvcG9zYWwuc291cmNlID09PSAnbmxfaW5zdHJ1Y3Rpb24nID8gJ3lvdXIgaW5zdHJ1Y3Rpb24nIDogJ3RoZSB1cGxvYWRlZCBkb2N1bWVudCc7XG4gIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0ICh0eXBlb2Ygc2hvd0NvbmZpcm1Nb2RhbCA9PT0gJ2Z1bmN0aW9uJ1xuICAgID8gc2hvd0NvbmZpcm1Nb2RhbChcbiAgICAgICAgYFdyaXRlICR7c2VsZWN0ZWRJZHMubGVuZ3RofSBjaGFuZ2Uke3NlbGVjdGVkSWRzLmxlbmd0aCA9PT0gMSA/ICcnIDogJ3MnfSB0byBNYXN0ZXIgQ1Y/YCxcbiAgICAgICAgYFRoZXNlICR7c2VsZWN0ZWRJZHMubGVuZ3RofSBjaGFuZ2Uke3NlbGVjdGVkSWRzLmxlbmd0aCA9PT0gMSA/ICcnIDogJ3MnfSB3ZXJlIHByb3Bvc2VkIGJ5IEFJIGZyb20gJHtzb3VyY2VMYWJlbH0gYW5kIGhhdmUgbm90IGJlZW4gcHJldmlvdXNseSByZXZpZXdlZC4gYCArXG4gICAgICAgIGBDb25maXJtaW5nIHdpbGwgcGVybWFuZW50bHkgd3JpdGUgdGhlbSB0byBNYXN0ZXJfQ1ZfRGF0YS5qc29uLiBBIGJhY2t1cCB3aWxsIGJlIGNyZWF0ZWQgZmlyc3QgXHUyMDE0IHNlZSBcdUQ4M0RcdURENTAgQmFja3VwcyBhYm92ZSB0byByZXN0b3JlIGl0IGlmIG5lZWRlZC5gLFxuICAgICAgKVxuICAgIDogUHJvbWlzZS5yZXNvbHZlKHdpbmRvdy5jb25maXJtKGBXcml0ZSAke3NlbGVjdGVkSWRzLmxlbmd0aH0gY2hhbmdlKHMpIHRvIE1hc3RlciBDVj8gVGhpcyB3aWxsIHBlcm1hbmVudGx5IHdyaXRlIGNoYW5nZXMgdG8gTWFzdGVyX0NWX0RhdGEuanNvbi5gKSkpO1xuXG4gIGlmICghY29uZmlybWVkKSByZXR1cm47XG5cbiAgY29uc3QgY29uZmlybUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtY29uZmlybS1idG4nKTtcbiAgY29uc3QgcmVzdWx0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWR1LXJlc3VsdCcpO1xuICBpZiAoY29uZmlybUJ0bikgeyBjb25maXJtQnRuLmRpc2FibGVkID0gdHJ1ZTsgY29uZmlybUJ0bi50ZXh0Q29udGVudCA9ICdXcml0aW5nXHUyMDI2JzsgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL2NvbmZpcm0tdXBkYXRlJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcHJvcG9zYWxfaWQ6IF9tZHVQZW5kaW5nUHJvcG9zYWwucHJvcG9zYWxJZCwgc2VsZWN0ZWRfaWRzOiBzZWxlY3RlZElkcyB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcC5qc29uKCk7XG5cbiAgICBpZiAoZGF0YS5vayA9PT0gZmFsc2UgJiYgZGF0YS5zdGFsZV9jaGFuZ2VzKSB7XG4gICAgICBfbWR1SGFuZGxlU3RhbGVDaGFuZ2VzKGRhdGEuc3RhbGVfY2hhbmdlcywgZGF0YS5hcHBsaWNhYmxlX2NoYW5nZXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWRhdGEub2spIHtcbiAgICAgIGlmIChyZXN1bHRFbCkgcmVzdWx0RWwuaW5uZXJIVE1MID0gYDxwIGNsYXNzPVwiZXJyb3ItbWVzc2FnZVwiPkNvbmZpcm0gZmFpbGVkOiAke2VzYyhkYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yJyl9PC9wPmA7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY2hhbmdlc0J5SWQgPSBPYmplY3QuZnJvbUVudHJpZXMoX21kdVBlbmRpbmdQcm9wb3NhbC5jaGFuZ2VzLm1hcChjID0+IFtjLmlkLCBjXSkpO1xuICAgIGNvbnN0IHdyaXR0ZW5MaW5lcyA9IChkYXRhLmRpZmZfc3VtbWFyeSB8fCBbXSlcbiAgICAgIC5maWx0ZXIoZCA9PiBkLmFwcGxpZWQpXG4gICAgICAubWFwKGQgPT4gYDxsaT4ke2VzYyhkLmxhYmVsIHx8IGQuaWQpfSR7Y2hhbmdlc0J5SWRbZC5pZF0/LnJhdGlvbmFsZSA/IGAgXHUyMDE0ICR7ZXNjKGNoYW5nZXNCeUlkW2QuaWRdLnJhdGlvbmFsZSl9YCA6ICcnfTwvbGk+YClcbiAgICAgIC5qb2luKCcnKTtcblxuICAgIGNvbnN0IGNvbW1pdEluZm8gPSBkYXRhLmNvbW1pdF9oYXNoID8gYCAoY29tbWl0ICR7ZXNjKGRhdGEuY29tbWl0X2hhc2gpfSlgIDogJyc7XG4gICAgY29uc3QgZ2l0V2FybmluZyA9IGRhdGEuZ2l0X2Vycm9yXG4gICAgICA/IGA8cCBzdHlsZT1cImNvbG9yOnZhcigtLWN2LXdhcm4tdGV4dCk7Zm9udC1zaXplOjAuODdlbTtcIj5cdTI2QTBcdUZFMEYgR2l0IGNvbW1pdCBza2lwcGVkOiAke2VzYyhkYXRhLmdpdF9lcnJvcj8ubWVzc2FnZSB8fCBkYXRhLmdpdF9lcnJvcil9PC9wPmBcbiAgICAgIDogJyc7XG4gICAgY29uc3QgcHVzaFdhcm5pbmcgPSBkYXRhLnB1c2hfZXJyb3JcbiAgICAgID8gYDxwIHN0eWxlPVwiY29sb3I6dmFyKC0tY3Ytd2Fybi10ZXh0KTtmb250LXNpemU6MC44N2VtO1wiPlx1MjZBMFx1RkUwRiBHaXQgcHVzaCBza2lwcGVkOiAke2VzYyhkYXRhLnB1c2hfZXJyb3IpfTwvcD5gXG4gICAgICA6ICcnO1xuXG4gICAgaWYgKHJlc3VsdEVsKSB7XG4gICAgICByZXN1bHRFbC5pbm5lckhUTUwgPSBgXG4gICAgICAgIDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOnZhcigtLWN2LXN1Y2Nlc3MtYmcpO2JvcmRlcjoxcHggc29saWQgdmFyKC0tY3Ytc3VjY2Vzcy1ib3JkZXIpO2JvcmRlci1yYWRpdXM6NnB4O3BhZGRpbmc6MTJweCAxNnB4O1wiPlxuICAgICAgICAgIDxwIHN0eWxlPVwiY29sb3I6dmFyKC0tY3Ytc3VjY2Vzcy10ZXh0KTtmb250LXdlaWdodDo2MDA7bWFyZ2luOjAgMCA2cHg7XCI+XG4gICAgICAgICAgICBcdTI3MDUgJHtkYXRhLndyaXR0ZW5fY291bnR9IGl0ZW0ke2RhdGEud3JpdHRlbl9jb3VudCA9PT0gMSA/ICcnIDogJ3MnfSB3cml0dGVuIHRvIG1hc3RlciBDViR7Y29tbWl0SW5mb30uXG4gICAgICAgICAgPC9wPlxuICAgICAgICAgICR7d3JpdHRlbkxpbmVzID8gYDx1bCBzdHlsZT1cImZvbnQtc2l6ZTowLjgyZW07Y29sb3I6dmFyKC0tY3YtdGV4dC1tdXRlZCk7bWFyZ2luOjRweCAwIDA7cGFkZGluZy1sZWZ0OjE4cHg7XCI+JHt3cml0dGVuTGluZXN9PC91bD5gIDogJyd9XG4gICAgICAgICAgJHtnaXRXYXJuaW5nfSR7cHVzaFdhcm5pbmd9XG4gICAgICAgIDwvZGl2PmA7XG4gICAgfVxuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1yZXZpZXctYXJlYScpLmlubmVySFRNTCA9ICcnO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtZGlzY2FyZC1idG4nKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIF9tZHVQZW5kaW5nUHJvcG9zYWwgPSBudWxsO1xuICAgIF9tZHVQcmlvckNsYXJpZmljYXRpb25zID0gW107XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy5lcnJvcignY29uZmlybU1hc3RlckRhdGFBaVVwZGF0ZTogZmFpbGVkJywgZXJyKTtcbiAgICBpZiAocmVzdWx0RWwpIHJlc3VsdEVsLmlubmVySFRNTCA9IGA8cCBjbGFzcz1cImVycm9yLW1lc3NhZ2VcIj5OZXR3b3JrIGVycm9yOiAke2VzYyhlcnIubWVzc2FnZSl9PC9wPmA7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKGNvbmZpcm1CdG4pIHsgY29uZmlybUJ0bi5kaXNhYmxlZCA9IGZhbHNlOyBjb25maXJtQnRuLnRleHRDb250ZW50ID0gJ0NvbmZpcm0gYW5kIFdyaXRlJzsgfVxuICB9XG59XG5cbmZ1bmN0aW9uIF9tZHVIYW5kbGVTdGFsZUNoYW5nZXMoc3RhbGVDaGFuZ2VzLCBhcHBsaWNhYmxlQ2hhbmdlcykge1xuICBjb25zdCByZXN1bHRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtcmVzdWx0Jyk7XG4gIGNvbnN0IHN0YWxlSWRzID0gbmV3IFNldChzdGFsZUNoYW5nZXMubWFwKHMgPT4gcy5pZCkpO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W2RhdGEtbWR1LWlkXScpLmZvckVhY2goKGNiKSA9PiB7XG4gICAgaWYgKHN0YWxlSWRzLmhhcyhjYi5kYXRhc2V0Lm1kdUlkKSkge1xuICAgICAgY2IuY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgY2IuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgY29uc3Qgcm93ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYG1kdS1yb3ctJHtjYi5kYXRhc2V0Lm1kdUlkfWApO1xuICAgICAgaWYgKHJvdykgcm93LnN0eWxlLm9wYWNpdHkgPSAnMC41JztcbiAgICB9XG4gIH0pO1xuICBfbWR1VXBkYXRlQ29uZmlybUJ1dHRvblN0YXRlKCk7XG5cbiAgY29uc3QgbGl2ZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1zZWxlY3Rpb24tbGl2ZScpO1xuICBjb25zdCBzdW1tYXJ5ID0gYCR7c3RhbGVDaGFuZ2VzLmxlbmd0aH0gaXRlbSR7c3RhbGVDaGFuZ2VzLmxlbmd0aCA9PT0gMSA/ICcgaXMnIDogJ3MgYXJlJ30gbm8gbG9uZ2VyIHZhbGlkIGFuZCAke3N0YWxlQ2hhbmdlcy5sZW5ndGggPT09IDEgPyAnd2FzJyA6ICd3ZXJlJ30gZGVzZWxlY3RlZDsgcmV2aWV3IGFuZCBjb25maXJtIGFnYWluLmA7XG4gIGlmIChsaXZlRWwpIGxpdmVFbC50ZXh0Q29udGVudCA9IHN1bW1hcnk7XG5cbiAgY29uc3Qgc3RhbGVMaXN0ID0gc3RhbGVDaGFuZ2VzLm1hcChzID0+IGA8bGk+JHtlc2Mocy5sYWJlbCB8fCBzLmlkKX0gXHUyMDE0ICR7ZXNjKHMucmVhc29uKX08L2xpPmApLmpvaW4oJycpO1xuICBpZiAocmVzdWx0RWwpIHtcbiAgICByZXN1bHRFbC5pbm5lckhUTUwgPSBgXG4gICAgICA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDp2YXIoLS1jdi1iZy1zdWJ0bGUpO2JvcmRlcjoxcHggc29saWQgdmFyKC0tY3Ytc2xhdGUtMzAwKTtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjEycHggMTZweDtcIj5cbiAgICAgICAgPHAgc3R5bGU9XCJjb2xvcjp2YXIoLS1jdi10ZXh0LW11dGVkKTtmb250LXdlaWdodDo2MDA7bWFyZ2luOjAgMCA2cHg7XCI+Tm90aGluZyB3YXMgd3JpdHRlbiBcdTIwMTQgJHtzdW1tYXJ5fTwvcD5cbiAgICAgICAgPHVsIHN0eWxlPVwiZm9udC1zaXplOjAuODJlbTtjb2xvcjp2YXIoLS1jdi10ZXh0LW11dGVkKTttYXJnaW46NHB4IDAgMDtwYWRkaW5nLWxlZnQ6MThweDtcIj4ke3N0YWxlTGlzdH08L3VsPlxuICAgICAgICA8cCBzdHlsZT1cImZvbnQtc2l6ZTowLjgyZW07Y29sb3I6dmFyKC0tY3YtdGV4dC1zZWNvbmRhcnkpO21hcmdpbi10b3A6OHB4O1wiPiR7YXBwbGljYWJsZUNoYW5nZXMubGVuZ3RofSBpdGVtJHthcHBsaWNhYmxlQ2hhbmdlcy5sZW5ndGggPT09IDEgPyAnJyA6ICdzJ30gJHthcHBsaWNhYmxlQ2hhbmdlcy5sZW5ndGggPT09IDEgPyAnaXMnIDogJ2FyZSd9IHN0aWxsIHZhbGlkIFx1MjAxNCBjbGljayBcIkNvbmZpcm0gYW5kIFdyaXRlXCIgYWdhaW4gdG8gYXBwbHkganVzdCB0aG9zZS48L3A+XG4gICAgICA8L2Rpdj5gO1xuICB9XG59XG5cbi8vIE5vdGU6IG5vIGNsaWVudC1zaWRlIFwicmVzdW1lIGFuIGluLXByb2dyZXNzIHByb3Bvc2FsXCIgYWZmb3JkYW5jZSBcdTIwMTQgdGhlXG4vLyBwYW5lbCByZXNldHMgaXRzIHN0YXRlIG9uIGV2ZXJ5IHJlbmRlciAoc2VlIF9tZHVSZXNldFN0YXRlLCBjYWxsZWQgZnJvbVxuLy8gcmVuZGVyTWFzdGVyRGF0YUFpVXBkYXRlUGFuZWwpLCBhbmQgcGVuZGluZyBwcm9wb3NhbHMgbGl2ZSBzZXJ2ZXItc2lkZVxuLy8ga2V5ZWQgYnkgcHJvcG9zYWxfaWQgd2l0aCB0aGVpciBvd24gVFRMIChzZWUgbWFzdGVyX2RhdGFfcm91dGVzLnB5KS5cbi8vIFJlc3VtaW5nIHdvdWxkIHJlcXVpcmUgYSBzZXNzaW9uLXN0YXR1cy1kcml2ZW4gY2hlY2sgZm9yIGFuIGV4aXN0aW5nXG4vLyBwZW5kaW5nIHByb3Bvc2FsIGJlZm9yZSB0aGUgcGFuZWwgZmlyc3QgcmVuZGVyczsgdHJhY2tlZCBhcyBhIGtub3duIHYxXG4vLyBsaW1pdGF0aW9uLCBub3Qgc2lsZW50bHkgYWJzZW50LlxuXG5leHBvcnQge1xuICByZW5kZXJNYXN0ZXJEYXRhQWlVcGRhdGVQYW5lbCxcbiAgcmVuZGVyTWFzdGVyRGF0YUFpVXBkYXRlRGlzYWJsZWROb3RlLFxuICB0b2dnbGVNYXN0ZXJEYXRhQWlQYW5lbCxcbiAgc2V0TWFzdGVyRGF0YUFpTW9kZSxcbiAgaGFuZGxlTWFzdGVyRGF0YUFpRmlsZVVwbG9hZCxcbiAgc3VibWl0TWFzdGVyRGF0YUFpUHJvcG9zZSxcbiAgZGlzY2FyZE1hc3RlckRhdGFBaVByb3Bvc2FsLFxuICBzZWxlY3RNYXN0ZXJEYXRhQWlOb25GbGFnZ2VkLFxuICBjb25maXJtTWFzdGVyRGF0YUFpVXBkYXRlLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL21hc3Rlci1jdi5qc1xuICogTWFzdGVyIENWIG1hbmFnZW1lbnQgdGFiOiBmZXRjaCwgcmVuZGVyLCBhbmQgQ1JVRCBmb3IgcGVyc29uYWwgaW5mbyxcbiAqIGV4cGVyaWVuY2VzLCBza2lsbHMsIGVkdWNhdGlvbiwgYXdhcmRzLCBhY2hpZXZlbWVudHMsIHN1bW1hcmllcy5cbiAqXG4gKiBEZXBlbmRlbmNpZXMgKHJlc29sdmVkIHRocm91Z2ggZ2xvYmFsVGhpcyBhdCBydW50aW1lKTpcbiAqICAgZXNjYXBlSHRtbCwgc2hvd1RvYXN0LCBzaG93QWxlcnRNb2RhbCwgY29uZmlybURpYWxvZyxcbiAqICAgYXBwZW5kTG9hZGluZ01lc3NhZ2UsIHJlbW92ZUxvYWRpbmdNZXNzYWdlLFxuICogICBzZXRMb2FkaW5nLCBzd2l0Y2hUYWIsIGFwcGVuZE1lc3NhZ2UsXG4gKiAgIHJlbmRlck1hc3RlckRhdGFBaVVwZGF0ZVBhbmVsLCByZW5kZXJNYXN0ZXJEYXRhQWlVcGRhdGVEaXNhYmxlZE5vdGVcbiAqICAgICAoZnJvbSB3ZWIvbWFzdGVyLWRhdGEtYWktdXBkYXRlLmpzLCBHQVAtMDEpXG4gKi9cblxubGV0IF9tYXN0ZXJDaGFuZ2VOb3RpY2UgPSAnJztcblxuLy8gVHJhY2tzIHRoZSBhY3RpdmUgcmVuZGVyIHRhcmdldDogbW9kYWwgYm9keSBkaXYgd2hlbiBvcGVuZWQgZnJvbSBoZWFkZXIsXG4vLyBudWxsIHdoZW4gcmVuZGVyZWQgaW50byB0aGUgbm9ybWFsIHRhYiB2aWV3ZXIuXG5sZXQgX21hc3RlckN2QWN0aXZlQ29udGFpbmVyID0gbnVsbDtcblxuLy8gRmlsZW5hbWUgb2YgdGhlIHNhZmV0eSBiYWNrdXAgY3JlYXRlZCBieSB0aGUgbW9zdCByZWNlbnQgdW5kbywgcmVzdG9yYWJsZVxuLy8gdmlhIHJlZG8uIFNpbmdsZS1sZXZlbCBieSBkZXNpZ24gKEdBUC0xOSAxNi43IHYxIHNjb3BlKSBcdTIwMTQgZnVydGhlci1iYWNrXG4vLyByZWNvdmVyeSByZW1haW5zIGF2YWlsYWJsZSB2aWEgdGhlIGZ1bGwgXCJcdUQ4M0RcdURENTAgQmFja3Vwc1wiIGhpc3RvcnkgbW9kYWwuXG4vLyBSZXNldCB0byBudWxsIGF0IHRoZSB0b3Agb2YgZXZlcnkgcG9wdWxhdGVNYXN0ZXJUYWIoKSByZS1yZW5kZXIgc28gYW55XG4vLyBvdGhlciBzYXZlIGFjdGlvbiAoc3RydWN0dXJlZCBlZGl0LCBBSS11cGRhdGUgY29uZmlybSwgaGFydmVzdCBhcHBseSlcbi8vIGludmFsaWRhdGVzIGEgc3RhbGUgcmVkbyB0YXJnZXQuIHVuZG9NYXN0ZXJEYXRhQ2hhbmdlKCkgc2V0c1xuLy8gX21hc3RlckN2U3VwcHJlc3NSZWRvUmVzZXQgYmVmb3JlIGl0cyBvd24gcG9wdWxhdGVNYXN0ZXJUYWIoKSBjYWxsIHNvIGl0c1xuLy8gZnJlc2hseS1zZXQgcmVkbyB0YXJnZXQgc3Vydml2ZXMgdGhhdCBvbmUgcmVuZGVyLlxubGV0IF9tYXN0ZXJDdlJlZG9CYWNrdXAgPSBudWxsO1xubGV0IF9tYXN0ZXJDdlN1cHByZXNzUmVkb1Jlc2V0ID0gZmFsc2U7XG5cbmZ1bmN0aW9uIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2Uoc2VjdGlvbiwgYWN0aW9uKSB7XG4gIGNvbnN0IGNsZWFuU2VjdGlvbiA9IFN0cmluZyhzZWN0aW9uIHx8ICdNYXN0ZXIgQ1YnKS50cmltKCk7XG4gIGNvbnN0IGNsZWFuQWN0aW9uID0gU3RyaW5nKGFjdGlvbiB8fCAndXBkYXRlZCcpLnRyaW0oKTtcbiAgX21hc3RlckNoYW5nZU5vdGljZSA9IGAke2NsZWFuU2VjdGlvbn0gJHtjbGVhbkFjdGlvbn0uYDtcbn1cblxuZnVuY3Rpb24gX3JlbmRlck1hc3RlckNoYW5nZU5vdGljZSgpIHtcbiAgaWYgKCFfbWFzdGVyQ2hhbmdlTm90aWNlKSByZXR1cm4gJyc7XG4gIHJldHVybiBgXG4gICAgPGRpdiBzdHlsZT1cIm1hcmdpbjoxMnB4IDAgMThweDtwYWRkaW5nOjEwcHggMTJweDtib3JkZXI6MXB4IHNvbGlkICNiYmY3ZDA7YmFja2dyb3VuZDojZjBmZGY0O2JvcmRlci1yYWRpdXM6OHB4O2NvbG9yOiMxNDUzMmQ7XCI+XG4gICAgICA8c3Ryb25nPkxhc3Qgc2F2ZWQgY2hhbmdlOjwvc3Ryb25nPiAke2VzY2FwZUh0bWwoX21hc3RlckNoYW5nZU5vdGljZSl9XG4gICAgPC9kaXY+XG4gIGA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHBvcHVsYXRlTWFzdGVyVGFiKGNvbnRhaW5lciA9IG51bGwpIHtcbiAgaWYgKGNvbnRhaW5lciAhPT0gbnVsbCkgX21hc3RlckN2QWN0aXZlQ29udGFpbmVyID0gY29udGFpbmVyO1xuICBpZiAoX21hc3RlckN2U3VwcHJlc3NSZWRvUmVzZXQpIHtcbiAgICBfbWFzdGVyQ3ZTdXBwcmVzc1JlZG9SZXNldCA9IGZhbHNlO1xuICB9IGVsc2Uge1xuICAgIF9tYXN0ZXJDdlJlZG9CYWNrdXAgPSBudWxsO1xuICB9XG4gIGNvbnN0IGNvbnRlbnQgPSBfbWFzdGVyQ3ZBY3RpdmVDb250YWluZXIgfHwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgY29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImVtcHR5LXN0YXRlXCI+PGRpdiBjbGFzcz1cImxvYWRpbmctc3Bpbm5lclwiPjwvZGl2PjxwIHN0eWxlPVwibWFyZ2luLXRvcDoxMnB4O2NvbG9yOiM2NDc0OGI7XCI+TG9hZGluZyBtYXN0ZXIgQ1YgZGF0YVx1MjAyNjwvcD48L2Rpdj4nO1xuXG4gIGxldCBvdmVydmlldyA9IHt9O1xuICBsZXQgZnVsbERhdGEgID0ge307XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBbb3ZSZXMsIGZkUmVzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL292ZXJ2aWV3JyksXG4gICAgICBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS9mdWxsJyksXG4gICAgXSk7XG4gICAgb3ZlcnZpZXcgPSAoYXdhaXQgb3ZSZXMuanNvbigpKSB8fCB7fTtcbiAgICBmdWxsRGF0YSAgPSAoYXdhaXQgZmRSZXMuanNvbigpKSB8fCB7fTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY29udGVudC5pbm5lckhUTUwgPSAnPHAgc3R5bGU9XCJjb2xvcjojZWY0NDQ0O3BhZGRpbmc6MjBweDtcIj5GYWlsZWQgdG8gbG9hZCBtYXN0ZXIgQ1YgZGF0YS48L3A+JztcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwZXJzb25hbEluZm8gPSBmdWxsRGF0YS5wZXJzb25hbF9pbmZvIHx8IHt9O1xuICBjb25zdCBleHBlcmllbmNlcyAgICAgPSBmdWxsRGF0YS5leHBlcmllbmNlIHx8IFtdO1xuICB3aW5kb3cuX21hc3RlckV4cGVyaWVuY2VPcHRpb25zID0gZXhwZXJpZW5jZXNcbiAgICAubWFwKChleHApID0+ICh7XG4gICAgICBpZDogZXhwLmlkIHx8ICcnLFxuICAgICAgbGFiZWw6IGAke2V4cC50aXRsZSB8fCAnUm9sZSd9IEAgJHtleHAuY29tcGFueSB8fCAnQ29tcGFueSd9YCxcbiAgICB9KSlcbiAgICAuZmlsdGVyKCh4KSA9PiB4LmlkKTtcbiAgLy8gRnVsbCBleHBlcmllbmNlIG9iamVjdHMgKGluY2x1ZGluZyBhY2hpZXZlbWVudHMpLCBrZXllZCBieSBpZCwgc29cbiAgLy8gZWRpdE1hc3RlckV4cGVyaWVuY2UoKSBjYW4gbG9vayB1cCBuZXN0ZWQgYWNoaWV2ZW1lbnRzIHdpdGhvdXRcbiAgLy8gZW1iZWRkaW5nIGFyYml0cmFyeSBhY2hpZXZlbWVudCB0ZXh0IGluc2lkZSBhbiBpbmxpbmUgb25jbGljayBhdHRyaWJ1dGUuXG4gIHdpbmRvdy5fbWFzdGVyRXhwZXJpZW5jZUZ1bGxEYXRhID0gZXhwZXJpZW5jZXM7XG4gIGNvbnN0IHNraWxscyAgICAgICAgICA9IGZ1bGxEYXRhLnNraWxscyB8fCBbXTtcbiAgY29uc3QgZWR1Y2F0aW9uICAgICAgID0gZnVsbERhdGEuZWR1Y2F0aW9uIHx8IFtdO1xuICBjb25zdCBhd2FyZHMgICAgICAgICAgPSBmdWxsRGF0YS5hd2FyZHMgfHwgW107XG4gIGNvbnN0IGNlcnRpZmljYXRpb25zICA9IGZ1bGxEYXRhLmNlcnRpZmljYXRpb25zIHx8IFtdO1xuICBjb25zdCBhY2hpZXZlbWVudHMgICAgPSBmdWxsRGF0YS5zZWxlY3RlZF9hY2hpZXZlbWVudHMgfHwgW107XG4gIGNvbnN0IHN1bW1hcmllcyAgICAgICA9IGZ1bGxEYXRhLnByb2Zlc3Npb25hbF9zdW1tYXJpZXMgfHwge307XG5cbiAgY29uc3QgY3VycmVudFBoYXNlID0gKHR5cGVvZiBzdGF0ZU1hbmFnZXIgIT09ICd1bmRlZmluZWQnICYmIHN0YXRlTWFuYWdlci5nZXRQaGFzZSlcbiAgICA/IHN0YXRlTWFuYWdlci5nZXRQaGFzZSgpXG4gICAgOiBudWxsO1xuICBjb25zdCBFRElUQUJMRV9QSEFTRVMgPSBuZXcgU2V0KFsnaW5pdCcsICdyZWZpbmVtZW50JywgbnVsbCwgdW5kZWZpbmVkLCAnJ10pO1xuICBjb25zdCBpc0VkaXRhYmxlID0gRURJVEFCTEVfUEhBU0VTLmhhcyhjdXJyZW50UGhhc2UpO1xuXG4gIGNvbnN0IHBoYXNlTG9ja0Jhbm5lciA9IGlzRWRpdGFibGUgPyAnJyA6IGBcbiAgICA8ZGl2IHJvbGU9XCJzdGF0dXNcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIlxuICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZWYyZjI7Ym9yZGVyOjFweCBzb2xpZCAjZmNhNWE1O2JvcmRlci1yYWRpdXM6NnB4O1xuICAgICAgICAgICAgICAgIHBhZGRpbmc6MTBweCAxNHB4O21hcmdpbi1ib3R0b206MTZweDtmb250LXNpemU6MC44OGVtO2NvbG9yOiM5OTFiMWI7XCI+XG4gICAgICA8c3Ryb25nPlx1RDgzRFx1REQxMiBSZWFkLW9ubHkgXHUyMDE0IGVkaXRpbmcgbG9ja2VkPC9zdHJvbmc+PGJyPlxuICAgICAgTWFzdGVyIENWIGVkaXRpbmcgaXMgb25seSBhdmFpbGFibGUgYmVmb3JlIGpvYiBhbmFseXNpcyBiZWdpbnMgb3IgZHVyaW5nIHRoZVxuICAgICAgUmVmaW5lbWVudCBzdGFnZS4gVGhlIGN1cnJlbnQgc3RhZ2UgaXMgPHN0cm9uZz4ke2VzY2FwZUh0bWwoY3VycmVudFBoYXNlIHx8ICd1bmtub3duJyl9PC9zdHJvbmc+LlxuICAgICAgU2F2ZSBvciBjb21wbGV0ZSB0aGUgY3VycmVudCBzdGFnZSB0byByZS1lbmFibGUgZWRpdGluZy5cbiAgICA8L2Rpdj5gO1xuXG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2ZsZXgtd3JhcDp3cmFwO2dhcDo4cHg7bWFyZ2luLWJvdHRvbTo0cHg7XCI+XG4gICAgICA8aDEgc3R5bGU9XCJtYXJnaW46MDtcIj5cdUQ4M0RcdURDREEgTWFzdGVyIENWIFByb2ZpbGU8L2gxPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6OHB4O2ZsZXgtd3JhcDp3cmFwO1wiPlxuICAgICAgICA8YnV0dG9uIGlkPVwibWFzdGVyLWN2LXVuZG8tYnRuXCIgY2xhc3M9XCJhY3Rpb24tYnRuIHNlY29uZGFyeVwiIG9uY2xpY2s9XCJ1bmRvTWFzdGVyRGF0YUNoYW5nZSgpXCJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJVbmRvIHRoZSBtb3N0IHJlY2VudCBNYXN0ZXIgQ1YgY2hhbmdlXCIgdGl0bGU9XCJVbmRvIChDdHJsK1opXCI+XG4gICAgICAgICAgXHUyMUE5IFVuZG9cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gaWQ9XCJtYXN0ZXItY3YtcmVkby1idG5cIiBjbGFzcz1cImFjdGlvbi1idG4gc2Vjb25kYXJ5XCIgb25jbGljaz1cInJlZG9NYXN0ZXJEYXRhQ2hhbmdlKClcIlxuICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlJlZG8gdGhlIHByZXZpb3VzbHkgdW5kb25lIE1hc3RlciBDViBjaGFuZ2VcIiB0aXRsZT1cIlJlZG8gKEN0cmwrU2hpZnQrWilcIiR7IV9tYXN0ZXJDdlJlZG9CYWNrdXAgPyAnIGRpc2FibGVkJyA6ICcnfT5cbiAgICAgICAgICBcdTIxQUEgUmVkb1xuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG4gc2Vjb25kYXJ5XCIgb25jbGljaz1cIm9wZW5CYWNrdXBIaXN0b3J5TW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJWaWV3IGJhY2t1cCBoaXN0b3J5XCI+XG4gICAgICAgICAgXHVEODNEXHVERDUwIEJhY2t1cHNcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHNlY29uZGFyeVwiIG9uY2xpY2s9XCJvcGVuRnVsbERhdGFQcmV2aWV3TW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJQcmV2aWV3IGZ1bGwgbWFzdGVyIENWIGRhdGFcIj5cbiAgICAgICAgICBcdUQ4M0RcdURDNDEgUHJldmlldyBGdWxsIERhdGFcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHNlY29uZGFyeVwiIG9uY2xpY2s9XCJleHBvcnRNYXN0ZXJDVigpXCIgYXJpYS1sYWJlbD1cIkRvd25sb2FkIE1hc3Rlcl9DVl9EYXRhLmpzb25cIj5cbiAgICAgICAgICBcdTJCMDdcdUZFMEYgRXhwb3J0IEpTT05cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHNlY29uZGFyeVwiIG9uY2xpY2s9XCJ0cmlnZ2VyTWFzdGVyQ3ZJbXBvcnQoKVwiIGFyaWEtbGFiZWw9XCJJbXBvcnQgYSBmdWxsIE1hc3Rlcl9DVl9EYXRhLmpzb24gZmlsZVwiJHtpc0VkaXRhYmxlID8gJycgOiAnIGRpc2FibGVkJ30+XG4gICAgICAgICAgXHUyQjA2XHVGRTBGIEltcG9ydCBKU09OXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiBpZD1cIm1hc3Rlci1jdi1pbXBvcnQtZmlsZS1pbnB1dFwiIGFjY2VwdD1cImFwcGxpY2F0aW9uL2pzb24sLmpzb25cIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIlxuICAgICAgICAgICAgb25jaGFuZ2U9XCJoYW5kbGVNYXN0ZXJDdkltcG9ydEZpbGUoZXZlbnQpXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDttYXJnaW4tYm90dG9tOjEycHg7XCI+XG4gICAgICBUaGlzIGlzIHlvdXIgcGVyc2lzdGVudCBtYXN0ZXIgQ1YgcHJvZmlsZS4gQ2hhbmdlcyBoZXJlIHVwZGF0ZVxuICAgICAgPGNvZGU+TWFzdGVyX0NWX0RhdGEuanNvbjwvY29kZT4gZGlyZWN0bHkgYW5kIHBlcnNpc3QgYWNyb3NzIGFsbCBzZXNzaW9ucy5cbiAgICA8L3A+XG5cbiAgICAke3BoYXNlTG9ja0Jhbm5lcn1cblxuICAgIDwhLS0gR292ZXJuYW5jZSBiYW5uZXIgLS0+XG4gICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1nb3Zlcm5hbmNlLW5vdGVcIiBzdHlsZT1cImJhY2tncm91bmQ6I2ZmZmJlYjtib3JkZXI6MXB4IHNvbGlkICNmY2QzNGQ7Ym9yZGVyLXJhZGl1czo2cHg7cGFkZGluZzoxMHB4IDE0cHg7bWFyZ2luLWJvdHRvbToxNnB4O2ZvbnQtc2l6ZTowLjg4ZW07Y29sb3I6Izc4MzUwZjtcIj5cbiAgICAgIDxzdHJvbmc+XHUyNkEwXHVGRTBGIFBlcnNpc3RlbnQgc3RvcmFnZSBcdTIwMTQgdGhpcyB0YWIgb25seTo8L3N0cm9uZz4gRWRpdHMgbWFkZSBoZXJlICh0aGUgc3RydWN0dXJlZFxuICAgICAgZWRpdG9ycyBiZWxvdywgYW5kIFwiVXBkYXRlIHZpYSBBSVwiKSB3cml0ZSBkaXJlY3RseSB0byA8Y29kZT5NYXN0ZXJfQ1ZfRGF0YS5qc29uPC9jb2RlPlxuICAgICAgaW1tZWRpYXRlbHkgYW5kIHBlcnNpc3QgYWNyb3NzIGV2ZXJ5IGZ1dHVyZSBqb2IgYXBwbGljYXRpb24uXG4gICAgICBKb2Itc3BlY2lmaWMgY2hvaWNlcyB5b3UgbWFrZSBlbHNld2hlcmUgaW4gdGhlIGFwcCBcdTIwMTQgd2hpY2ggc2tpbGxzL2V4cGVyaWVuY2VzIHRvIGZlYXR1cmUsXG4gICAgICByZXdyaXR0ZW4gYnVsbGV0IHRleHQsIGNvdmVyLWxldHRlciB0b25lIFx1MjAxNCBsaXZlIG9ubHkgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbiBhbmQgYXJlXG4gICAgICA8ZW0+bmV2ZXI8L2VtPiB3cml0dGVuIGhlcmUgYXV0b21hdGljYWxseS4gVG8gY2FycnkgYSBzZXNzaW9uJ3MgaW1wcm92ZW1lbnRzIGludG8geW91clxuICAgICAgcGVybWFuZW50IHByb2ZpbGUsIHVzZSBcIlx1RDgzRFx1RENFNSBVcGRhdGUgTWFzdGVyIENWIERhdGFcIiBvbiB0aGUgRmluYWxpc2Ugc3RlcC5cbiAgICA8L2Rpdj5cblxuICAgICR7aXNFZGl0YWJsZSA/IHJlbmRlck1hc3RlckRhdGFBaVVwZGF0ZVBhbmVsKCkgOiByZW5kZXJNYXN0ZXJEYXRhQWlVcGRhdGVEaXNhYmxlZE5vdGUoKX1cblxuICAgICR7X3JlbmRlck1hc3RlckNoYW5nZU5vdGljZSgpfVxuXG4gICAgPCEtLSBQcm9maWxlIG92ZXJ2aWV3IGNhcmQgLS0+XG4gICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1wcm9maWxlLWNhcmRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItcHJvZmlsZS1uYW1lXCI+JHtlc2NhcGVIdG1sKG92ZXJ2aWV3Lm5hbWUgfHwgJ1lvdXIgUHJvZmlsZScpfTwvZGl2PlxuICAgICAgJHtvdmVydmlldy5oZWFkbGluZSA/IGA8ZGl2IGNsYXNzPVwibWFzdGVyLXByb2ZpbGUtaGVhZGxpbmVcIj4ke2VzY2FwZUh0bWwob3ZlcnZpZXcuaGVhZGxpbmUpfTwvZGl2PmAgOiAnJ31cbiAgICAgICR7b3ZlcnZpZXcuZW1haWwgICAgPyBgPGRpdiBjbGFzcz1cIm1hc3Rlci1wcm9maWxlLWVtYWlsXCI+XHUyNzA5XHVGRTBGICR7ZXNjYXBlSHRtbChvdmVydmlldy5lbWFpbCl9PC9kaXY+YCA6ICcnfVxuICAgICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1zdGF0c1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXN0YXRcIj48c3BhbiBjbGFzcz1cIm1hc3Rlci1zdGF0LXZhbHVlXCI+JHtvdmVydmlldy5leHBlcmllbmNlX2NvdW50ID8/ICdcdTIwMTQnfTwvc3Bhbj48c3BhbiBjbGFzcz1cIm1hc3Rlci1zdGF0LWxhYmVsXCI+RXhwZXJpZW5jZXM8L3NwYW4+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc3RhdFwiPjxzcGFuIGNsYXNzPVwibWFzdGVyLXN0YXQtdmFsdWVcIj4ke292ZXJ2aWV3LnNraWxsX2NvdW50ID8/ICdcdTIwMTQnfTwvc3Bhbj48c3BhbiBjbGFzcz1cIm1hc3Rlci1zdGF0LWxhYmVsXCI+U2tpbGxzPC9zcGFuPjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXN0YXRcIj48c3BhbiBjbGFzcz1cIm1hc3Rlci1zdGF0LXZhbHVlXCI+JHtvdmVydmlldy5hY2hpZXZlbWVudF9jb3VudCA/PyAnXHUyMDE0J308L3NwYW4+PHNwYW4gY2xhc3M9XCJtYXN0ZXItc3RhdC1sYWJlbFwiPkFjaGlldmVtZW50czwvc3Bhbj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1zdGF0XCI+PHNwYW4gY2xhc3M9XCJtYXN0ZXItc3RhdC12YWx1ZVwiPiR7b3ZlcnZpZXcuc3VtbWFyeV9jb3VudCA/PyAnXHUyMDE0J308L3NwYW4+PHNwYW4gY2xhc3M9XCJtYXN0ZXItc3RhdC1sYWJlbFwiPlN1bW1hcmllczwvc3Bhbj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1zdGF0XCI+PHNwYW4gY2xhc3M9XCJtYXN0ZXItc3RhdC12YWx1ZVwiPiR7b3ZlcnZpZXcuZWR1Y2F0aW9uX2NvdW50ID8/ICdcdTIwMTQnfTwvc3Bhbj48c3BhbiBjbGFzcz1cIm1hc3Rlci1zdGF0LWxhYmVsXCI+RWR1Y2F0aW9uPC9zcGFuPjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXN0YXRcIj48c3BhbiBjbGFzcz1cIm1hc3Rlci1zdGF0LXZhbHVlXCI+JHtvdmVydmlldy5wdWJsaWNhdGlvbl9jb3VudCA/PyAnXHUyMDE0J308L3NwYW4+PHNwYW4gY2xhc3M9XCJtYXN0ZXItc3RhdC1sYWJlbFwiPlB1YmxpY2F0aW9uczwvc3Bhbj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBQZXJzb25hbCBJbmZvIHNlY3Rpb24gLS0+XG4gICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1zZWN0aW9uXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXNlY3Rpb24taGVhZGVyXCI+XG4gICAgICAgIDxoMj5cdUQ4M0RcdURDNjQgUGVyc29uYWwgSW5mb3JtYXRpb248L2gyPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0blwiIG9uY2xpY2s9XCJzaG93RWRpdFBlcnNvbmFsSW5mb01vZGFsKClcIiBhcmlhLWxhYmVsPVwiRWRpdCBwZXJzb25hbCBpbmZvcm1hdGlvblwiPlxuICAgICAgICAgIFx1MjcwRlx1RkUwRiBFZGl0XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGlkPVwibWFzdGVyLXBlcnNvbmFsLWluZm8tY29udGFpbmVyXCI+XG4gICAgICAgICR7X3JlbmRlclBlcnNvbmFsSW5mb0NhcmQocGVyc29uYWxJbmZvKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBFeHBlcmllbmNlcyBzZWN0aW9uIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc2VjdGlvblwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1zZWN0aW9uLWhlYWRlclwiPlxuICAgICAgICA8aDI+XHVEODNEXHVEQ0JDIFdvcmsgRXhwZXJpZW5jZTwvaDI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgb25jbGljaz1cInNob3dBZGRFeHBlcmllbmNlTW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJBZGQgbmV3IHdvcmsgZXhwZXJpZW5jZVwiPlxuICAgICAgICAgICsgQWRkIEV4cGVyaWVuY2VcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgaWQ9XCJtYXN0ZXItZXhwZXJpZW5jZXMtY29udGFpbmVyXCI+XG4gICAgICAgICR7X3JlbmRlckV4cGVyaWVuY2VzTGlzdChleHBlcmllbmNlcyl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gU2tpbGxzIHNlY3Rpb24gLS0+XG4gICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1zZWN0aW9uXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXNlY3Rpb24taGVhZGVyXCI+XG4gICAgICAgIDxoMj5cdUQ4M0RcdURFRTBcdUZFMEYgU2tpbGxzPC9oMj5cbiAgICAgICAgJHtBcnJheS5pc0FycmF5KHNraWxscykgPyBgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwic2hvd0FkZFNraWxsTW9kYWwoJycsIHRydWUpXCIgYXJpYS1sYWJlbD1cIkFkZCBuZXcgc2tpbGxcIj4rIEFkZCBTa2lsbDwvYnV0dG9uPmAgOiAnJ31cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBpZD1cIm1hc3Rlci1za2lsbHMtY29udGFpbmVyXCI+XG4gICAgICAgICR7X3JlbmRlclNraWxsc1NlY3Rpb24oc2tpbGxzKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBFZHVjYXRpb24gc2VjdGlvbiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXNlY3Rpb25cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc2VjdGlvbi1oZWFkZXJcIj5cbiAgICAgICAgPGgyPlx1RDgzQ1x1REY5MyBFZHVjYXRpb248L2gyPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0blwiIG9uY2xpY2s9XCJzaG93QWRkRWR1Y2F0aW9uTW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJBZGQgZWR1Y2F0aW9uIGVudHJ5XCI+XG4gICAgICAgICAgKyBBZGQgRWR1Y2F0aW9uXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGlkPVwibWFzdGVyLWVkdWNhdGlvbi1jb250YWluZXJcIj5cbiAgICAgICAgJHtfcmVuZGVyRWR1Y2F0aW9uTGlzdChlZHVjYXRpb24pfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFB1YmxpY2F0aW9ucyBzZWN0aW9uIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc2VjdGlvblwiIGlkPVwibWFzdGVyLXB1YmxpY2F0aW9ucy1zZWN0aW9uXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXNlY3Rpb24taGVhZGVyXCI+XG4gICAgICAgIDxoMj5cdUQ4M0RcdURDRDYgUHVibGljYXRpb25zPC9oMj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDtcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBzZWNvbmRhcnlcIiBpZD1cIm1hc3Rlci1wdWItaW1wb3J0LWJ0blwiXG4gICAgICAgICAgICAgIG9uY2xpY2s9XCJzaG93SW1wb3J0UHVibGljYXRpb25zTW9kYWwoKVwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJJbXBvcnQgQmliVGVYIHB1YmxpY2F0aW9uc1wiPlxuICAgICAgICAgICAgXHUyQjA2XHVGRTBGIEltcG9ydCBCaWJUZVhcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBzZWNvbmRhcnlcIiBpZD1cIm1hc3Rlci1wdWItY29udmVydC1idG5cIlxuICAgICAgICAgICAgICBvbmNsaWNrPVwic2hvd0NvbnZlcnRQdWJsaWNhdGlvbnNNb2RhbCgpXCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkNvbnZlcnQgY2l0YXRpb24gdGV4dCB0byBCaWJUZVhcIj5cbiAgICAgICAgICAgIFx1RDgzRVx1REU4NCBDb252ZXJ0IFRleHRcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBzZWNvbmRhcnlcIiBpZD1cIm1hc3Rlci1wdWItdG9nZ2xlLWJ0blwiXG4gICAgICAgICAgICAgIG9uY2xpY2s9XCJ0b2dnbGVQdWJsaWNhdGlvbnNWaWV3KClcIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiVG9nZ2xlIGJldHdlZW4gc3RydWN0dXJlZCBDUlVEIHZpZXcgYW5kIHJhdyBCaWJUZVggZWRpdG9yXCI+XG4gICAgICAgICAgICBcdTI3MEZcdUZFMEYgUmF3IEJpYlRlWFxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgaWQ9XCJtYXN0ZXItcHViLWFkZC1idG5cIlxuICAgICAgICAgICAgICBvbmNsaWNrPVwic2hvd0FkZFB1YmxpY2F0aW9uTW9kYWwoKVwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJBZGQgcHVibGljYXRpb25cIj5cbiAgICAgICAgICAgICsgQWRkIFB1YmxpY2F0aW9uXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8IS0tIENSVUQgc3RydWN0dXJlZCB2aWV3IChkZWZhdWx0KSAtLT5cbiAgICAgIDxkaXYgaWQ9XCJtYXN0ZXItcHViLWNydWQtdmlld1wiPlxuICAgICAgICA8ZGl2IGlkPVwibWFzdGVyLXB1Yi1jcnVkLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtwYWRkaW5nOjEycHggMDtcIj5Mb2FkaW5nIHB1YmxpY2F0aW9uc1x1MjAyNjwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDwhLS0gUmF3IEJpYlRlWCBlZGl0b3IgKGhpZGRlbiBieSBkZWZhdWx0KSAtLT5cbiAgICAgIDxkaXYgaWQ9XCJtYXN0ZXItcHViLXJhdy12aWV3XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+XG4gICAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtmb250LXNpemU6MC45ZW07bWFyZ2luLWJvdHRvbToxMHB4O1wiPlxuICAgICAgICAgIEVkaXQgeW91ciBCaWJUZVggYmlibGlvZ3JhcGh5IGZpbGUgZGlyZWN0bHkuIENoYW5nZXMgYXJlIHNhdmVkIHRvXG4gICAgICAgICAgPGNvZGU+cHVibGljYXRpb25zLmJpYjwvY29kZT4gYW5kIGEgdGltZXN0YW1wZWQgYmFja3VwIGlzIGNyZWF0ZWRcbiAgICAgICAgICBhdXRvbWF0aWNhbGx5LiBDb250ZW50IGlzIHZhbGlkYXRlZCBiZWZvcmUgd3JpdGluZy5cbiAgICAgICAgPC9wPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6OHB4O21hcmdpbi1ib3R0b206OHB4O1wiPlxuICAgICAgICAgIDxzcGFuIGlkPVwibWFzdGVyLXB1Yi1jb3VudFwiIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtmb250LXNpemU6MC45ZW07XCI+PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZmxleDoxO1wiPjwvc3Bhbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBzZWNvbmRhcnlcIiBvbmNsaWNrPVwidmFsaWRhdGVQdWJsaWNhdGlvbnNCaWIoKVwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJWYWxpZGF0ZSBCaWJUZVggd2l0aG91dCBzYXZpbmdcIj5cdUQ4M0RcdUREMEQgVmFsaWRhdGU8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBzZWNvbmRhcnlcIiBvbmNsaWNrPVwibG9hZFB1YmxpY2F0aW9uc0JpYigpXCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlJlbG9hZCBwdWJsaWNhdGlvbnMuYmliIGZyb20gZGlza1wiPlx1RDgzRFx1REQwNCBSZWxvYWQ8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBwcmltYXJ5XCIgaWQ9XCJtYXN0ZXItcHViLXNhdmUtYnRuXCJcbiAgICAgICAgICAgICAgb25jbGljaz1cInNhdmVQdWJsaWNhdGlvbnNCaWIoKVwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJTYXZlIEJpYlRlWCB0byBkaXNrXCI+XHVEODNEXHVEQ0JFIFNhdmU8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDx0ZXh0YXJlYSBpZD1cIm1hc3Rlci1wdWItdGV4dGFyZWFcIlxuICAgICAgICAgIGNsYXNzPVwiZWRpdC1pbnB1dFwiXG4gICAgICAgICAgcm93cz1cIjIwXCJcbiAgICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Zm9udC1mYW1pbHk6bW9ub3NwYWNlO2ZvbnQtc2l6ZTowLjg1ZW07cmVzaXplOnZlcnRpY2FsO1wiXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJMb2FkaW5nXHUyMDI2XCJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiQmliVGVYIGJpYmxpb2dyYXBoeSBjb250ZW50XCJcbiAgICAgICAgICBzcGVsbGNoZWNrPVwiZmFsc2VcIlxuICAgICAgICA+PC90ZXh0YXJlYT5cbiAgICAgICAgPGRpdiBpZD1cIm1hc3Rlci1wdWItc3RhdHVzXCJcbiAgICAgICAgICAgIHN0eWxlPVwibWFyZ2luLXRvcDo2cHg7Zm9udC1zaXplOjAuODVlbTtjb2xvcjojNmI3MjgwO1wiXG4gICAgICAgICAgICBhcmlhLWxpdmU9XCJwb2xpdGVcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBBd2FyZHMgc2VjdGlvbiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXNlY3Rpb25cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc2VjdGlvbi1oZWFkZXJcIj5cbiAgICAgICAgPGgyPlx1RDgzQ1x1REZDNSBBd2FyZHMgJmFtcDsgSG9ub3VyczwvaDI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgb25jbGljaz1cInNob3dBZGRBd2FyZE1vZGFsKClcIiBhcmlhLWxhYmVsPVwiQWRkIGF3YXJkXCI+XG4gICAgICAgICAgKyBBZGQgQXdhcmRcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgaWQ9XCJtYXN0ZXItYXdhcmRzLWNvbnRhaW5lclwiPlxuICAgICAgICAke19yZW5kZXJBd2FyZHNMaXN0KGF3YXJkcyl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gQ2VydGlmaWNhdGlvbnMgc2VjdGlvbiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXNlY3Rpb25cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc2VjdGlvbi1oZWFkZXJcIj5cbiAgICAgICAgPGgyPlx1RDgzQ1x1REY5MyBDZXJ0aWZpY2F0aW9uczwvaDI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgb25jbGljaz1cInNob3dBZGRDZXJ0aWZpY2F0aW9uTW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJBZGQgY2VydGlmaWNhdGlvblwiPlxuICAgICAgICAgICsgQWRkIENlcnRpZmljYXRpb25cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgaWQ9XCJtYXN0ZXItY2VydGlmaWNhdGlvbnMtY29udGFpbmVyXCI+XG4gICAgICAgICR7X3JlbmRlckNlcnRpZmljYXRpb25zTGlzdChjZXJ0aWZpY2F0aW9ucyl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gU2VsZWN0ZWQgQWNoaWV2ZW1lbnRzIHNlY3Rpb24gLS0+XG4gICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1zZWN0aW9uXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXNlY3Rpb24taGVhZGVyXCI+XG4gICAgICAgIDxoMj5cdUQ4M0NcdURGQzYgU2VsZWN0ZWQgQWNoaWV2ZW1lbnRzPC9oMj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwic2hvd0FkZEFjaGlldmVtZW50TW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJBZGQgbmV3IGFjaGlldmVtZW50IHRvIG1hc3RlciBDVlwiPlxuICAgICAgICAgICsgQWRkIEFjaGlldmVtZW50XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7Zm9udC1zaXplOjAuOWVtO21hcmdpbi1ib3R0b206MTJweDtcIj5cbiAgICAgICAgVGhlc2UgYXJlIGNyb3NzLXJvbGUgaGlnaGxpZ2h0cyBzaG93biBpbiB0aGUgQWNoaWV2ZW1lbnRzIHJldmlldyBkdXJpbmcgY3VzdG9taXNhdGlvbi5cbiAgICAgICAgVGhlIEhhcnZlc3QgZmVhdHVyZSAoSGFydmVzdCB0YWIpIGNhbiBhZGQgbmV3IG9uZXMgZnJvbSB5b3VyIGN1cnJlbnQgc2Vzc2lvbi5cbiAgICAgIDwvcD5cbiAgICAgIDxkaXYgaWQ9XCJtYXN0ZXItYWNoaWV2ZW1lbnRzLWNvbnRhaW5lclwiPlxuICAgICAgICAke19yZW5kZXJNYXN0ZXJBY2hpZXZlbWVudHNUYWJsZShhY2hpZXZlbWVudHMpfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFByb2Zlc3Npb25hbCBTdW1tYXJpZXMgc2VjdGlvbiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXNlY3Rpb25cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc2VjdGlvbi1oZWFkZXJcIj5cbiAgICAgICAgPGgyPlx1RDgzRFx1RENERCBQcm9mZXNzaW9uYWwgU3VtbWFyaWVzPC9oMj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwic2hvd0FkZFN1bW1hcnlNb2RhbCgpXCIgYXJpYS1sYWJlbD1cIkFkZCBuZXcgcHJvZmVzc2lvbmFsIHN1bW1hcnkgdmFyaWFudFwiPlxuICAgICAgICAgICsgQWRkIFN1bW1hcnlcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtmb250LXNpemU6MC45ZW07bWFyZ2luLWJvdHRvbToxMnB4O1wiPlxuICAgICAgICBOYW1lZCBzdW1tYXJ5IHZhcmlhbnRzIGxldCB5b3UgdGFpbG9yIHlvdXIgcHJvZmVzc2lvbmFsIHN0YXRlbWVudCBmb3IgZGlmZmVyZW50IHJvbGUgdHlwZXNcbiAgICAgICAgd2l0aG91dCByZWdlbmVyYXRpbmcgZnJvbSBzY3JhdGNoLiBUaGUgQUkgd2lsbCByZWNvbW1lbmQgdGhlIG1vc3QgcmVsZXZhbnQgdmFyaWFudFxuICAgICAgICBkdXJpbmcgdGhlIFN1bW1hcnkgRm9jdXMgc3RlcC5cbiAgICAgIDwvcD5cbiAgICAgIDxkaXYgaWQ9XCJtYXN0ZXItc3VtbWFyaWVzLWNvbnRhaW5lclwiPlxuICAgICAgICAke19yZW5kZXJTdW1tYXJpZXNMaXN0KHN1bW1hcmllcyl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gUHVibGljYXRpb24gYWRkL2VkaXQgbW9kYWwgLS0+XG4gICAgPGRpdiBpZD1cIm1hc3Rlci1wdWItbW9kYWwtb3ZlcmxheVwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLW1vZGFsPVwidHJ1ZVwiXG4gICAgICAgIGFyaWEtbGFiZWxsZWRieT1cIm1hc3Rlci1wdWItbW9kYWwtdGl0bGVcIiBjbGFzcz1cIm1vZGFsLW92ZXJsYXlcIlxuICAgICAgICBvbmNsaWNrPVwiaWYoZXZlbnQudGFyZ2V0PT09dGhpcyljbG9zZVB1YmxpY2F0aW9uTW9kYWwoKVwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsXCIgc3R5bGU9XCJtYXgtd2lkdGg6NTgwcHg7XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cbiAgICAgICAgICA8aDIgaWQ9XCJtYXN0ZXItcHViLW1vZGFsLXRpdGxlLWhlYWRpbmdcIiBpZD1cInB1Yi1tb2RhbC10aXRsZS1oZWFkaW5nXCI+QWRkIFB1YmxpY2F0aW9uPC9oMj5cbiAgICAgICAgICA8YnV0dG9uIG9uY2xpY2s9XCJjbG9zZVB1YmxpY2F0aW9uTW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJDbG9zZSBwdWJsaWNhdGlvbiBlZGl0b3JcIlxuICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6bm9uZTtib3JkZXI6bm9uZTtmb250LXNpemU6MS40ZW07Y3Vyc29yOnBvaW50ZXI7Y29sb3I6IzY0NzQ4YjtcIj4mdGltZXM7PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiIHN0eWxlPVwicGFkZGluZzoyMHB4O1wiPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjEycHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwicHViLW1vZGFsLWtleVwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+Q2l0ZSBLZXkgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+Kjwvc3Bhbj48L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJwdWItbW9kYWwta2V5XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiIGFyaWEtcmVxdWlyZWQ9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gc21pdGgyMDI0bWxcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjEycHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwicHViLW1vZGFsLXR5cGVcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkVudHJ5IFR5cGUgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+Kjwvc3Bhbj48L2xhYmVsPlxuICAgICAgICAgICAgPHNlbGVjdCBpZD1cInB1Yi1tb2RhbC10eXBlXCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiYXJ0aWNsZVwiPmFydGljbGU8L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImlucHJvY2VlZGluZ3NcIj5pbnByb2NlZWRpbmdzPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJib29rXCI+Ym9vazwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiaW5jb2xsZWN0aW9uXCI+aW5jb2xsZWN0aW9uPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ0ZWNocmVwb3J0XCI+dGVjaHJlcG9ydDwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicGhkdGhlc2lzXCI+cGhkdGhlc2lzPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJtYXN0ZXJzdGhlc2lzXCI+bWFzdGVyc3RoZXNpczwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwibWlzY1wiPm1pc2M8L29wdGlvbj5cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjEycHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgaWQ9XCJwdWItbW9kYWwtYXV0aG9yLWxhYmVsXCIgZm9yPVwicHViLW1vZGFsLWF1dGhvclwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+QXV0aG9yKHMpIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPio8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwicHViLW1vZGFsLWF1dGhvclwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiTGFzdCwgRmlyc3QgYW5kIExhc3QyLCBGaXJzdDJcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjEycHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwicHViLW1vZGFsLXRpdGxlXCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5UaXRsZSA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4qPC9zcGFuPjwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInB1Yi1tb2RhbC10aXRsZVwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIiBhcmlhLXJlcXVpcmVkPVwidHJ1ZVwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6MTJweDttYXJnaW4tYm90dG9tOjEycHg7XCI+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDowIDAgMTAwcHg7XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwdWItbW9kYWwteWVhclwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+WWVhciA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4qPC9zcGFuPjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJwdWItbW9kYWwteWVhclwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwcHg7XCJcbiAgICAgICAgICAgICAgICAgIG1pbj1cIjE5MDBcIiBtYXg9XCIyMTAwXCIgYXJpYS1yZXF1aXJlZD1cInRydWVcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDoxO1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicHViLW1vZGFsLWpvdXJuYWxcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkpvdXJuYWwgLyBCb29rdGl0bGU8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInB1Yi1tb2RhbC1qb3VybmFsXCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxMnB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cInB1Yi1tb2RhbC1kb2lcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkRPSSAvIFVSTDwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInB1Yi1tb2RhbC1kb2lcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIjEwLnh4eHgveHh4eHhcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjRweDtcIj5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwdWItbW9kYWwtZXh0cmFcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkV4dHJhIGZpZWxkcyA8c3BhbiBzdHlsZT1cImZvbnQtd2VpZ2h0OjQwMDtjb2xvcjojNmI3MjgwO1wiPihrZXk9dmFsdWUsIG9uZSBwZXIgbGluZSk8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD1cInB1Yi1tb2RhbC1leHRyYVwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHJvd3M9XCIzXCIgc3R5bGU9XCJ3aWR0aDoxMDAlO3Jlc2l6ZTp2ZXJ0aWNhbDtmb250LWZhbWlseTptb25vc3BhY2U7Zm9udC1zaXplOjAuODVlbTtcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwidm9sdW1lPTEyJiMxMDtwYWdlcz0xLS0yMFwiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCIgc3R5bGU9XCJkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kO2dhcDo4cHg7cGFkZGluZzoxNnB4IDIwcHg7XCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwiY2xvc2VQdWJsaWNhdGlvbk1vZGFsKClcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBwcmltYXJ5XCIgb25jbGljaz1cInNhdmVNYXN0ZXJQdWJsaWNhdGlvbigpXCI+U2F2ZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBpZD1cIm1hc3Rlci1wdWItaW1wb3J0LW1vZGFsLW92ZXJsYXlcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1tb2RhbD1cInRydWVcIlxuICAgICAgICBhcmlhLWxhYmVsbGVkYnk9XCJtYXN0ZXItcHViLWltcG9ydC1tb2RhbC10aXRsZVwiIGNsYXNzPVwibW9kYWwtb3ZlcmxheVwiXG4gICAgICAgIG9uY2xpY2s9XCJpZihldmVudC50YXJnZXQ9PT10aGlzKWNsb3NlSW1wb3J0UHVibGljYXRpb25zTW9kYWwoKVwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsXCIgc3R5bGU9XCJtYXgtd2lkdGg6NjgwcHg7XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cbiAgICAgICAgICA8aDIgaWQ9XCJtYXN0ZXItcHViLWltcG9ydC1tb2RhbC10aXRsZVwiPkltcG9ydCBCaWJUZVggUHVibGljYXRpb25zPC9oMj5cbiAgICAgICAgICA8YnV0dG9uIG9uY2xpY2s9XCJjbG9zZUltcG9ydFB1YmxpY2F0aW9uc01vZGFsKClcIiBhcmlhLWxhYmVsPVwiQ2xvc2UgQmliVGVYIGltcG9ydCBkaWFsb2dcIlxuICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6bm9uZTtib3JkZXI6bm9uZTtmb250LXNpemU6MS40ZW07Y3Vyc29yOnBvaW50ZXI7Y29sb3I6IzY0NzQ4YjtcIj4mdGltZXM7PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiIHN0eWxlPVwicGFkZGluZzoyMHB4O1wiPlxuICAgICAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtmb250LXNpemU6MC45ZW07bWFyZ2luOjAgMCAxMnB4O1wiPlxuICAgICAgICAgICAgUGFzdGUgb25lIG9yIG1vcmUgQmliVGVYIGVudHJpZXMgdG8gbWVyZ2UgdGhlbSBpbnRvIDxjb2RlPnB1YmxpY2F0aW9ucy5iaWI8L2NvZGU+LlxuICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8dGV4dGFyZWEgaWQ9XCJtYXN0ZXItcHViLWltcG9ydC10ZXh0YXJlYVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZWRpdC1pbnB1dFwiXG4gICAgICAgICAgICAgIHJvd3M9XCIxMlwiXG4gICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTtmb250LWZhbWlseTptb25vc3BhY2U7Zm9udC1zaXplOjAuODVlbTtyZXNpemU6dmVydGljYWw7XCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJAYXJ0aWNsZXtzbWl0aDIwMjUsLi4ufVwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJCaWJUZVggaW1wb3J0IGNvbnRlbnRcIlxuICAgICAgICAgICAgICBzcGVsbGNoZWNrPVwiZmFsc2VcIj48L3RleHRhcmVhPlxuICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDttYXJnaW4tdG9wOjEycHg7Y29sb3I6IzMzNDE1NTtcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cIm1hc3Rlci1wdWItaW1wb3J0LW92ZXJ3cml0ZVwiIC8+XG4gICAgICAgICAgICBPdmVyd3JpdGUgZXhpc3RpbmcgZW50cmllcyB3aGVuIGNpdGUga2V5cyBhbHJlYWR5IGV4aXN0XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8ZGl2IGlkPVwibWFzdGVyLXB1Yi1pbXBvcnQtc3RhdHVzXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJtYXJnaW4tdG9wOjEwcHg7Zm9udC1zaXplOjAuODVlbTtjb2xvcjojNmI3MjgwO1wiXG4gICAgICAgICAgICAgIGFyaWEtbGl2ZT1cInBvbGl0ZVwiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiIHN0eWxlPVwiZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpmbGV4LWVuZDtnYXA6OHB4O3BhZGRpbmc6MTZweCAyMHB4O1wiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgb25jbGljaz1cImNsb3NlSW1wb3J0UHVibGljYXRpb25zTW9kYWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHByaW1hcnlcIiBpZD1cIm1hc3Rlci1wdWItaW1wb3J0LXN1Ym1pdC1idG5cIlxuICAgICAgICAgICAgICBvbmNsaWNrPVwiaW1wb3J0UHVibGljYXRpb25zQmliKClcIj5JbXBvcnQ8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgaWQ9XCJtYXN0ZXItcHViLWNvbnZlcnQtbW9kYWwtb3ZlcmxheVwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLW1vZGFsPVwidHJ1ZVwiXG4gICAgICAgIGFyaWEtbGFiZWxsZWRieT1cIm1hc3Rlci1wdWItY29udmVydC1tb2RhbC10aXRsZVwiIGNsYXNzPVwibW9kYWwtb3ZlcmxheVwiXG4gICAgICAgIG9uY2xpY2s9XCJpZihldmVudC50YXJnZXQ9PT10aGlzKWNsb3NlQ29udmVydFB1YmxpY2F0aW9uc01vZGFsKClcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbFwiIHN0eWxlPVwibWF4LXdpZHRoOjc2MHB4O1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XG4gICAgICAgICAgPGgyIGlkPVwibWFzdGVyLXB1Yi1jb252ZXJ0LW1vZGFsLXRpdGxlXCI+Q29udmVydCBDaXRhdGlvbiBUZXh0IHRvIEJpYlRlWDwvaDI+XG4gICAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPVwiY2xvc2VDb252ZXJ0UHVibGljYXRpb25zTW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJDbG9zZSBjaXRhdGlvbiBjb252ZXJzaW9uIGRpYWxvZ1wiXG4gICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDpub25lO2JvcmRlcjpub25lO2ZvbnQtc2l6ZToxLjRlbTtjdXJzb3I6cG9pbnRlcjtjb2xvcjojNjQ3NDhiO1wiPiZ0aW1lczs8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCIgc3R5bGU9XCJwYWRkaW5nOjIwcHg7XCI+XG4gICAgICAgICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO2ZvbnQtc2l6ZTowLjllbTttYXJnaW46MCAwIDEycHg7XCI+XG4gICAgICAgICAgICBQYXN0ZSBmcmVlLWZvcm0gY2l0YXRpb24gdGV4dCwgcmV2aWV3IHRoZSBnZW5lcmF0ZWQgQmliVGVYLCB0aGVuIGltcG9ydCBpdCB3aGVuIGl0IGxvb2tzIGNvcnJlY3QuXG4gICAgICAgICAgPC9wPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmdyaWQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmcjtnYXA6MTRweDtcIj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJtYXN0ZXItcHViLWNvbnZlcnQtaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkNpdGF0aW9uIFRleHQ8L2xhYmVsPlxuICAgICAgICAgICAgICA8dGV4dGFyZWEgaWQ9XCJtYXN0ZXItcHViLWNvbnZlcnQtaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJlZGl0LWlucHV0XCJcbiAgICAgICAgICAgICAgICAgIHJvd3M9XCI3XCJcbiAgICAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTtyZXNpemU6dmVydGljYWw7XCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRG9lLCBKLiAoMjAyNSkuIEFydGljbGUgdGl0bGUuIEpvdXJuYWwgTmFtZSwgMTIoMyksIDEtMTAuXCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJDaXRhdGlvbiB0ZXh0IHRvIGNvbnZlcnRcIj48L3RleHRhcmVhPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwibWFzdGVyLXB1Yi1jb252ZXJ0LW91dHB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+R2VuZXJhdGVkIEJpYlRlWCBQcmV2aWV3PC9sYWJlbD5cbiAgICAgICAgICAgICAgPHRleHRhcmVhIGlkPVwibWFzdGVyLXB1Yi1jb252ZXJ0LW91dHB1dFwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImVkaXQtaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgcm93cz1cIjEwXCJcbiAgICAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTtmb250LWZhbWlseTptb25vc3BhY2U7Zm9udC1zaXplOjAuODVlbTtyZXNpemU6dmVydGljYWw7XCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQ29udmVydGVkIEJpYlRlWCB3aWxsIGFwcGVhciBoZXJlXCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJHZW5lcmF0ZWQgQmliVGVYIHByZXZpZXdcIlxuICAgICAgICAgICAgICAgICAgc3BlbGxjaGVjaz1cImZhbHNlXCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDttYXJnaW4tdG9wOjEycHg7Y29sb3I6IzMzNDE1NTtcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cIm1hc3Rlci1wdWItY29udmVydC1vdmVyd3JpdGVcIiAvPlxuICAgICAgICAgICAgT3ZlcndyaXRlIGV4aXN0aW5nIGVudHJpZXMgd2hlbiBpbXBvcnRpbmcgdGhlIGdlbmVyYXRlZCBCaWJUZVhcbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxkaXYgaWQ9XCJtYXN0ZXItcHViLWNvbnZlcnQtc3RhdHVzXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJtYXJnaW4tdG9wOjEwcHg7Zm9udC1zaXplOjAuODVlbTtjb2xvcjojNmI3MjgwO1wiXG4gICAgICAgICAgICAgIGFyaWEtbGl2ZT1cInBvbGl0ZVwiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiIHN0eWxlPVwiZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpmbGV4LWVuZDtnYXA6OHB4O3BhZGRpbmc6MTZweCAyMHB4O1wiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgb25jbGljaz1cImNsb3NlQ29udmVydFB1YmxpY2F0aW9uc01vZGFsKClcIj5DbG9zZTwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHNlY29uZGFyeVwiIGlkPVwibWFzdGVyLXB1Yi1jb252ZXJ0LXN1Ym1pdC1idG5cIlxuICAgICAgICAgICAgICBvbmNsaWNrPVwiY29udmVydFB1YmxpY2F0aW9uVGV4dCgpXCI+R2VuZXJhdGUgQmliVGVYPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG4gcHJpbWFyeVwiIGlkPVwibWFzdGVyLXB1Yi1jb252ZXJ0LWltcG9ydC1idG5cIlxuICAgICAgICAgICAgICBvbmNsaWNrPVwiaW1wb3J0Q29udmVydGVkUHVibGljYXRpb25UZXh0KClcIj5JbXBvcnQgUHJldmlldzwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBQZXJzb25hbCBJbmZvIG1vZGFsIC0tPlxuICAgIDxkaXYgaWQ9XCJtYXN0ZXItcGktbW9kYWwtb3ZlcmxheVwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLW1vZGFsPVwidHJ1ZVwiXG4gICAgICAgIGFyaWEtbGFiZWxsZWRieT1cIm1hc3Rlci1waS1tb2RhbC10aXRsZVwiIGNsYXNzPVwibW9kYWwtb3ZlcmxheVwiXG4gICAgICAgIG9uY2xpY2s9XCJpZihldmVudC50YXJnZXQ9PT10aGlzKWNsb3NlUGVyc29uYWxJbmZvTW9kYWwoKVwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsXCIgc3R5bGU9XCJtYXgtd2lkdGg6NjIwcHg7XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cbiAgICAgICAgICA8aDIgaWQ9XCJtYXN0ZXItcGktbW9kYWwtdGl0bGVcIj5FZGl0IFBlcnNvbmFsIEluZm9ybWF0aW9uPC9oMj5cbiAgICAgICAgICA8YnV0dG9uIG9uY2xpY2s9XCJjbG9zZVBlcnNvbmFsSW5mb01vZGFsKClcIiBhcmlhLWxhYmVsPVwiQ2xvc2UgcGVyc29uYWwgaW5mbyBlZGl0b3JcIlxuICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6bm9uZTtib3JkZXI6bm9uZTtmb250LXNpemU6MS40ZW07Y3Vyc29yOnBvaW50ZXI7Y29sb3I6IzY0NzQ4YjtcIj4mdGltZXM7PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiIHN0eWxlPVwicGFkZGluZzoyMHB4O1wiPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmdyaWQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmciAxZnI7Z2FwOjE0cHg7XCI+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZ3JpZC1jb2x1bW46MS8tMTtcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBpLW5hbWUtaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkZ1bGwgTmFtZTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwicGktbmFtZS1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIiBwbGFjZWhvbGRlcj1cImUuZy4gSmFuZSBTbWl0aCwgUGguRC5cIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZ3JpZC1jb2x1bW46MS8tMTtcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBpLXRpdGxlLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5Qcm9mZXNzaW9uYWwgVGl0bGUgLyBIZWFkbGluZTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwicGktdGl0bGUtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgcGxhY2Vob2xkZXI9XCJlLmcuIFNlbmlvciBEYXRhIFNjaWVudGlzdFwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwaS1lbWFpbC1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+RW1haWw8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImVtYWlsXCIgaWQ9XCJwaS1lbWFpbC1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIiBwbGFjZWhvbGRlcj1cInlvdUBleGFtcGxlLmNvbVwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwaS1waG9uZS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+UGhvbmU8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRlbFwiIGlkPVwicGktcGhvbmUtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgcGxhY2Vob2xkZXI9XCI1NTUtMTIzLTQ1NjdcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicGktbGlua2VkaW4taW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkxpbmtlZEluIFVSTDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidXJsXCIgaWQ9XCJwaS1saW5rZWRpbi1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIiBwbGFjZWhvbGRlcj1cImh0dHBzOi8vbGlua2VkaW4uY29tL2luL3lvdVwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwaS13ZWJzaXRlLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5XZWJzaXRlPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ1cmxcIiBpZD1cInBpLXdlYnNpdGUtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgcGxhY2Vob2xkZXI9XCJodHRwczovL3lvdXJzaXRlLmNvbVwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwaS1jaXR5LWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5DaXR5PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJwaS1jaXR5LWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiIHBsYWNlaG9sZGVyPVwiUm9jaGVzdGVyXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBpLXN0YXRlLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5TdGF0ZSAvIFJlZ2lvbjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwicGktc3RhdGUtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgcGxhY2Vob2xkZXI9XCJOWVwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0blwiIG9uY2xpY2s9XCJjbG9zZVBlcnNvbmFsSW5mb01vZGFsKClcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBwcmltYXJ5XCIgb25jbGljaz1cInNhdmVQZXJzb25hbEluZm8oKVwiPlNhdmU8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gRXhwZXJpZW5jZSBtb2RhbCAtLT5cbiAgICA8ZGl2IGlkPVwibWFzdGVyLWV4cC1tb2RhbC1vdmVybGF5XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCIgcm9sZT1cImRpYWxvZ1wiIGFyaWEtbW9kYWw9XCJ0cnVlXCJcbiAgICAgICAgYXJpYS1sYWJlbGxlZGJ5PVwibWFzdGVyLWV4cC1tb2RhbC10aXRsZVwiIGNsYXNzPVwibW9kYWwtb3ZlcmxheVwiXG4gICAgICAgIG9uY2xpY2s9XCJpZihldmVudC50YXJnZXQ9PT10aGlzKWNsb3NlRXhwZXJpZW5jZU1vZGFsKClcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbFwiIHN0eWxlPVwibWF4LXdpZHRoOjY0MHB4O1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XG4gICAgICAgICAgPGgyIGlkPVwibWFzdGVyLWV4cC1tb2RhbC10aXRsZVwiPldvcmsgRXhwZXJpZW5jZTwvaDI+XG4gICAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPVwiY2xvc2VFeHBlcmllbmNlTW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJDbG9zZSBleHBlcmllbmNlIGVkaXRvclwiXG4gICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDpub25lO2JvcmRlcjpub25lO2ZvbnQtc2l6ZToxLjRlbTtjdXJzb3I6cG9pbnRlcjtjb2xvcjojNjQ3NDhiO1wiPiZ0aW1lczs8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCIgc3R5bGU9XCJwYWRkaW5nOjIwcHg7XCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBpZD1cImV4cC1tb2RhbC1pZFwiIC8+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6MWZyIDFmcjtnYXA6MTRweDtcIj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJncmlkLWNvbHVtbjoxLy0xO1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZXhwLXRpdGxlLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5Kb2IgVGl0bGUgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+Kjwvc3Bhbj48L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImV4cC10aXRsZS1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIiBhcmlhLXJlcXVpcmVkPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gU2VuaW9yIERhdGEgU2NpZW50aXN0XCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImdyaWQtY29sdW1uOjEvLTE7XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJleHAtY29tcGFueS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+Q29tcGFueSA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4qPC9zcGFuPjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZXhwLWNvbXBhbnktaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgYXJpYS1yZXF1aXJlZD1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIEFjbWUgQ29ycFwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJleHAtY2l0eS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+Q2l0eTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZXhwLWNpdHktaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgcGxhY2Vob2xkZXI9XCJCb3N0b25cIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZXhwLXN0YXRlLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5TdGF0ZSAvIFJlZ2lvbjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZXhwLXN0YXRlLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiIHBsYWNlaG9sZGVyPVwiTUFcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZXhwLXN0YXJ0LWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5TdGFydCBEYXRlPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJleHAtc3RhcnQtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgcGxhY2Vob2xkZXI9XCIyMDIwLTAxXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImV4cC1lbmQtaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkVuZCBEYXRlIChibGFuayA9IHByZXNlbnQpPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJleHAtZW5kLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiIHBsYWNlaG9sZGVyPVwiMjAyNC0wNiBvciBsZWF2ZSBibGFua1wiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJleHAtdHlwZS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+RW1wbG95bWVudCBUeXBlPC9sYWJlbD5cbiAgICAgICAgICAgICAgPHNlbGVjdCBpZD1cImV4cC10eXBlLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiPlxuICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJmdWxsX3RpbWVcIj5GdWxsLXRpbWU8L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicGFydF90aW1lXCI+UGFydC10aW1lPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImNvbnRyYWN0XCI+Q29udHJhY3Q8L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiY29uc3VsdGluZ1wiPkNvbnN1bHRpbmc8L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiaW50ZXJuc2hpcFwiPkludGVybnNoaXA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwic2VsZl9lbXBsb3llZFwiPlNlbGYtZW1wbG95ZWQ8L29wdGlvbj5cbiAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJleHAtaW1wb3J0YW5jZS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+SW1wb3J0YW5jZSAoMVx1MjAxMzEwKTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJleHAtaW1wb3J0YW5jZS1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6ODBweDtcIlxuICAgICAgICAgICAgICAgICAgbWluPVwiMVwiIG1heD1cIjEwXCIgdmFsdWU9XCI1XCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImdyaWQtY29sdW1uOjEvLTE7XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJleHAtdGFncy1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+VGFncyAoY29tbWEtc2VwYXJhdGVkKTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZXhwLXRhZ3MtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBtbCwgbGVhZGVyc2hpcCwgcHl0aG9uXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImdyaWQtY29sdW1uOjEvLTE7Ym9yZGVyLXRvcDoxcHggc29saWQgdmFyKC0tY3YtYm9yZGVyKTtwYWRkaW5nLXRvcDoxNHB4O21hcmdpbi10b3A6NHB4O1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjZweDtcIj5BY2hpZXZlbWVudHM8L2xhYmVsPlxuICAgICAgICAgICAgICA8ZGl2IGlkPVwiZXhwLWFjaGlldmVtZW50cy1lZGl0b3ItbGlzdFwiPjwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDo2cHg7bWFyZ2luLXRvcDo2cHg7XCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJleHAtYWNoLW5ldy1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwiZmxleDoxO1wiXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQWRkIGFuIGFjaGlldmVtZW50IG9yIGJ1bGxldFx1MjAyNlwiXG4gICAgICAgICAgICAgICAgICAgIG9ua2V5ZG93bj1cImlmKGV2ZW50LmtleT09PSdFbnRlcicpe2V2ZW50LnByZXZlbnREZWZhdWx0KCk7X2FkZEV4cEFjaGlldmVtZW50KCk7fVwiIC8+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhY3Rpb24tYnRuIHNlY29uZGFyeVwiIG9uY2xpY2s9XCJfYWRkRXhwQWNoaWV2ZW1lbnQoKVwiPisgQWRkPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwiY2xvc2VFeHBlcmllbmNlTW9kYWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHByaW1hcnlcIiBvbmNsaWNrPVwic2F2ZU1hc3RlckV4cGVyaWVuY2UoKVwiPlNhdmU8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gU2tpbGwgYWRkIG1vZGFsIC0tPlxuICAgIDxkaXYgaWQ9XCJtYXN0ZXItc2tpbGwtbW9kYWwtb3ZlcmxheVwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLW1vZGFsPVwidHJ1ZVwiXG4gICAgICAgIGFyaWEtbGFiZWxsZWRieT1cIm1hc3Rlci1za2lsbC1tb2RhbC10aXRsZVwiIGNsYXNzPVwibW9kYWwtb3ZlcmxheVwiXG4gICAgICAgIG9uY2xpY2s9XCJpZihldmVudC50YXJnZXQ9PT10aGlzKWNsb3NlU2tpbGxNb2RhbCgpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWxcIiBzdHlsZT1cIm1heC13aWR0aDo0ODBweDtcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuICAgICAgICAgIDxoMiBpZD1cIm1hc3Rlci1za2lsbC1tb2RhbC10aXRsZVwiPkFkZCBTa2lsbDwvaDI+XG4gICAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPVwiY2xvc2VTa2lsbE1vZGFsKClcIiBhcmlhLWxhYmVsPVwiQ2xvc2Ugc2tpbGwgZWRpdG9yXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOm5vbmU7Zm9udC1zaXplOjEuNGVtO2N1cnNvcjpwb2ludGVyO2NvbG9yOiM2NDc0OGI7XCI+JnRpbWVzOzwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIiBzdHlsZT1cInBhZGRpbmc6MjBweDtcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImhpZGRlblwiIGlkPVwic2tpbGwtbW9kYWwtY2F0ZWdvcnlcIiAvPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJza2lsbC1tb2RhbC1pcy1mbGF0XCIgLz5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImhpZGRlblwiIGlkPVwic2tpbGwtbW9kYWwtb3JpZ2luYWwtbmFtZVwiIC8+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTRweDtcIiBpZD1cInNraWxsLWNhdGVnb3J5LXJvd1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cInNraWxsLWNhdGVnb3J5LWRpc3BsYXlcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkNhdGVnb3J5PC9sYWJlbD5cbiAgICAgICAgICAgIDxzcGFuIGlkPVwic2tpbGwtY2F0ZWdvcnktZGlzcGxheVwiIHN0eWxlPVwiZm9udC13ZWlnaHQ6NTAwO2NvbG9yOiMzMzQxNTU7XCI+PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwic2tpbGwtbmFtZS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+U2tpbGwgTmFtZSA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4qPC9zcGFuPjwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInNraWxsLW5hbWUtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgYXJpYS1yZXF1aXJlZD1cInRydWVcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBQeXRob25cIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwic2tpbGwtZXhwZXJpZW5jZXMtaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkFzc29jaWF0ZWQgRXhwZXJpZW5jZSBJRHMgKG9wdGlvbmFsKTwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInNraWxsLWV4cGVyaWVuY2VzLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIGV4cF8xMjMsIGV4cF80NTZcIiAvPlxuICAgICAgICAgICAgPHNtYWxsIHN0eWxlPVwiZGlzcGxheTpibG9jazttYXJnaW4tdG9wOjRweDtjb2xvcjojNjQ3NDhiO1wiPkNvbW1hLXNlcGFyYXRlZCBJRHMuIEEgc2tpbGwgY2FuIGJlIGxpbmtlZCB0byBtdWx0aXBsZSBleHBlcmllbmNlcy48L3NtYWxsPlxuICAgICAgICAgICAgPGRpdiBpZD1cInNraWxsLWV4cGVyaWVuY2UtaGludHNcIiBzdHlsZT1cIm1hcmdpbi10b3A6NnB4O2ZvbnQtc2l6ZTowLjhlbTtjb2xvcjojOTRhM2I4O1wiPjwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwic2tpbGwtYWxpYXNlcy1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+QWxpYXNlcyAoY29tbWEtc2VwYXJhdGVkLCBvcHRpb25hbCk8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJza2lsbC1hbGlhc2VzLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIEpTLCBFQ01BU2NyaXB0XCIgLz5cbiAgICAgICAgICAgIDxzbWFsbCBzdHlsZT1cImRpc3BsYXk6YmxvY2s7bWFyZ2luLXRvcDo0cHg7Y29sb3I6IzY0NzQ4YjtcIj5BbHRlcm5hdGUgbmFtZXMgYW4gQVRTIG9yIHJldmlld2VyIG1pZ2h0IHNlYXJjaCBmb3IuPC9zbWFsbD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cInNraWxsLXllYXJzLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5ZZWFycyBvZiBFeHBlcmllbmNlIChvcHRpb25hbCk8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cInNraWxsLXllYXJzLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMjBweDtcIiBtaW49XCIwXCIgc3RlcD1cIjAuNVwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwiY2xvc2VTa2lsbE1vZGFsKClcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBwcmltYXJ5XCIgaWQ9XCJtYXN0ZXItc2tpbGwtc2F2ZS1idG5cIiBvbmNsaWNrPVwic2F2ZU1hc3RlclNraWxsKClcIj5BZGQgU2tpbGw8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gRWR1Y2F0aW9uIG1vZGFsIC0tPlxuICAgIDxkaXYgaWQ9XCJtYXN0ZXItZWR1LW1vZGFsLW92ZXJsYXlcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1tb2RhbD1cInRydWVcIlxuICAgICAgICBhcmlhLWxhYmVsbGVkYnk9XCJtYXN0ZXItZWR1LW1vZGFsLXRpdGxlXCIgY2xhc3M9XCJtb2RhbC1vdmVybGF5XCJcbiAgICAgICAgb25jbGljaz1cImlmKGV2ZW50LnRhcmdldD09PXRoaXMpY2xvc2VFZHVjYXRpb25Nb2RhbCgpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWxcIiBzdHlsZT1cIm1heC13aWR0aDo1ODBweDtcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuICAgICAgICAgIDxoMiBpZD1cIm1hc3Rlci1lZHUtbW9kYWwtdGl0bGVcIj5FZHVjYXRpb248L2gyPlxuICAgICAgICAgIDxidXR0b24gb25jbGljaz1cImNsb3NlRWR1Y2F0aW9uTW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJDbG9zZSBlZHVjYXRpb24gZWRpdG9yXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOm5vbmU7Zm9udC1zaXplOjEuNGVtO2N1cnNvcjpwb2ludGVyO2NvbG9yOiM2NDc0OGI7XCI+JnRpbWVzOzwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIiBzdHlsZT1cInBhZGRpbmc6MjBweDtcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImhpZGRlblwiIGlkPVwiZWR1LW1vZGFsLWlkeFwiIHZhbHVlPVwiLTFcIiAvPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmdyaWQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmciAxZnI7Z2FwOjE0cHg7XCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZWR1LWRlZ3JlZS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+RGVncmVlIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPio8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJlZHUtZGVncmVlLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiIGFyaWEtcmVxdWlyZWQ9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBQaC5ELlwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJlZHUtZmllbGQtaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkZpZWxkIG9mIFN0dWR5PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJlZHUtZmllbGQtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBCaW9zdGF0aXN0aWNzXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImdyaWQtY29sdW1uOjEvLTE7XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJlZHUtaW5zdGl0dXRpb24taW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkluc3RpdHV0aW9uIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPio8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJlZHUtaW5zdGl0dXRpb24taW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgYXJpYS1yZXF1aXJlZD1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIFVuaXZlcnNpdHkgb2YgV2FzaGluZ3RvblwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJlZHUtY2l0eS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+Q2l0eTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZWR1LWNpdHktaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgcGxhY2Vob2xkZXI9XCJTZWF0dGxlXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImVkdS1zdGF0ZS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+U3RhdGU8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImVkdS1zdGF0ZS1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIiBwbGFjZWhvbGRlcj1cIldBXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImVkdS1zdGFydC15ZWFyLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5TdGFydCBZZWFyPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cImVkdS1zdGFydC15ZWFyLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiXG4gICAgICAgICAgICAgICAgICBtaW49XCIxOTUwXCIgbWF4PVwiMjA5OVwiIHBsYWNlaG9sZGVyPVwiMTk5NVwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJlZHUtZW5kLXllYXItaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkVuZCBZZWFyPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cImVkdS1lbmQteWVhci1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIlxuICAgICAgICAgICAgICAgICAgbWluPVwiMTk1MFwiIG1heD1cIjIwOTlcIiBwbGFjZWhvbGRlcj1cIjIwMDBcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwiY2xvc2VFZHVjYXRpb25Nb2RhbCgpXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG4gcHJpbWFyeVwiIG9uY2xpY2s9XCJzYXZlTWFzdGVyRWR1Y2F0aW9uKClcIj5TYXZlPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEF3YXJkIG1vZGFsIC0tPlxuICAgIDxkaXYgaWQ9XCJtYXN0ZXItYXdhcmQtbW9kYWwtb3ZlcmxheVwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLW1vZGFsPVwidHJ1ZVwiXG4gICAgICAgIGFyaWEtbGFiZWxsZWRieT1cIm1hc3Rlci1hd2FyZC1tb2RhbC10aXRsZVwiIGNsYXNzPVwibW9kYWwtb3ZlcmxheVwiXG4gICAgICAgIG9uY2xpY2s9XCJpZihldmVudC50YXJnZXQ9PT10aGlzKWNsb3NlQXdhcmRNb2RhbCgpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWxcIiBzdHlsZT1cIm1heC13aWR0aDo1ODBweDtcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuICAgICAgICAgIDxoMiBpZD1cIm1hc3Rlci1hd2FyZC1tb2RhbC10aXRsZVwiPkF3YXJkIC8gSG9ub3VyPC9oMj5cbiAgICAgICAgICA8YnV0dG9uIG9uY2xpY2s9XCJjbG9zZUF3YXJkTW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJDbG9zZSBhd2FyZCBlZGl0b3JcIlxuICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6bm9uZTtib3JkZXI6bm9uZTtmb250LXNpemU6MS40ZW07Y3Vyc29yOnBvaW50ZXI7Y29sb3I6IzY0NzQ4YjtcIj4mdGltZXM7PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiIHN0eWxlPVwicGFkZGluZzoyMHB4O1wiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJhd2FyZC1tb2RhbC1pZHhcIiB2YWx1ZT1cIi0xXCIgLz5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cImF3YXJkLXRpdGxlLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5UaXRsZSA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4qPC9zcGFuPjwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImF3YXJkLXRpdGxlLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiIGFyaWEtcmVxdWlyZWQ9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gRW1wbG95ZWUgb2YgdGhlIFllYXJcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwiYXdhcmQteWVhci1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+WWVhcjwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiYXdhcmQteWVhci1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwcHg7XCJcbiAgICAgICAgICAgICAgICBtaW49XCIxOTUwXCIgbWF4PVwiMjA5OVwiIHBsYWNlaG9sZGVyPVwiMjAyMlwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTRweDtcIj5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJhd2FyZC1kZXNjLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5EZXNjcmlwdGlvbjwvbGFiZWw+XG4gICAgICAgICAgICA8dGV4dGFyZWEgaWQ9XCJhd2FyZC1kZXNjLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgcm93cz1cIjNcIiBzdHlsZT1cIndpZHRoOjEwMCU7cmVzaXplOnZlcnRpY2FsO1wiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJCcmllZiBjb250ZXh0IG9yIGFjaGlldmVtZW50IGRlc2NyaXB0aW9uXCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cImF3YXJkLXJlbGV2YW50LWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5SZWxldmFudCBmb3IgKGNvbW1hLXNlcGFyYXRlZCk8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJhd2FyZC1yZWxldmFudC1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBsZWFkZXJzaGlwLCBwaGFybWFcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgb25jbGljaz1cImNsb3NlQXdhcmRNb2RhbCgpXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG4gcHJpbWFyeVwiIG9uY2xpY2s9XCJzYXZlTWFzdGVyQXdhcmQoKVwiPlNhdmU8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gQ2VydGlmaWNhdGlvbiBtb2RhbCAtLT5cbiAgICA8ZGl2IGlkPVwibWFzdGVyLWNlcnQtbW9kYWwtb3ZlcmxheVwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLW1vZGFsPVwidHJ1ZVwiXG4gICAgICAgIGFyaWEtbGFiZWxsZWRieT1cIm1hc3Rlci1jZXJ0LW1vZGFsLXRpdGxlXCIgY2xhc3M9XCJtb2RhbC1vdmVybGF5XCJcbiAgICAgICAgb25jbGljaz1cImlmKGV2ZW50LnRhcmdldD09PXRoaXMpY2xvc2VDZXJ0aWZpY2F0aW9uTW9kYWwoKVwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsXCIgc3R5bGU9XCJtYXgtd2lkdGg6NTAwcHg7XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cbiAgICAgICAgICA8aDIgaWQ9XCJtYXN0ZXItY2VydC1tb2RhbC10aXRsZVwiPkNlcnRpZmljYXRpb248L2gyPlxuICAgICAgICAgIDxidXR0b24gb25jbGljaz1cImNsb3NlQ2VydGlmaWNhdGlvbk1vZGFsKClcIiBhcmlhLWxhYmVsPVwiQ2xvc2UgY2VydGlmaWNhdGlvbiBlZGl0b3JcIlxuICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6bm9uZTtib3JkZXI6bm9uZTtmb250LXNpemU6MS40ZW07Y3Vyc29yOnBvaW50ZXI7Y29sb3I6IzY0NzQ4YjtcIj4mdGltZXM7PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiIHN0eWxlPVwicGFkZGluZzoyMHB4O1wiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJjZXJ0LW1vZGFsLWlkeFwiIHZhbHVlPVwiLTFcIiAvPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwiY2VydC1uYW1lLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5OYW1lIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPio8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiY2VydC1uYW1lLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiIGFyaWEtcmVxdWlyZWQ9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gQVdTIENlcnRpZmllZCBTb2x1dGlvbnMgQXJjaGl0ZWN0XCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNlcnQtaXNzdWVyLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5Jc3N1ZXI8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJjZXJ0LWlzc3Vlci1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBBbWF6b24gV2ViIFNlcnZpY2VzXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNlcnQteWVhci1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+WWVhcjwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiY2VydC15ZWFyLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDBweDtcIlxuICAgICAgICAgICAgICAgIG1pbj1cIjE5NTBcIiBtYXg9XCIyMDk5XCIgcGxhY2Vob2xkZXI9XCIyMDIzXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0blwiIG9uY2xpY2s9XCJjbG9zZUNlcnRpZmljYXRpb25Nb2RhbCgpXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG4gcHJpbWFyeVwiIG9uY2xpY2s9XCJzYXZlTWFzdGVyQ2VydGlmaWNhdGlvbigpXCI+U2F2ZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBBY2hpZXZlbWVudCBlZGl0IG1vZGFsIC0tPlxuICAgIDxkaXYgaWQ9XCJtYXN0ZXItYWNoLW1vZGFsLW92ZXJsYXlcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1tb2RhbD1cInRydWVcIlxuICAgICAgICBhcmlhLWxhYmVsbGVkYnk9XCJtYXN0ZXItYWNoLW1vZGFsLXRpdGxlXCIgY2xhc3M9XCJtb2RhbC1vdmVybGF5XCJcbiAgICAgICAgb25jbGljaz1cImlmKGV2ZW50LnRhcmdldD09PXRoaXMpY2xvc2VNYXN0ZXJBY2hNb2RhbCgpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWxcIiBzdHlsZT1cIm1heC13aWR0aDo2MDBweDtcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuICAgICAgICAgIDxoMiBpZD1cIm1hc3Rlci1hY2gtbW9kYWwtdGl0bGVcIj5BY2hpZXZlbWVudDwvaDI+XG4gICAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPVwiY2xvc2VNYXN0ZXJBY2hNb2RhbCgpXCIgYXJpYS1sYWJlbD1cIkNsb3NlIGFjaGlldmVtZW50IGVkaXRvclwiXG4gICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDpub25lO2JvcmRlcjpub25lO2ZvbnQtc2l6ZToxLjRlbTtjdXJzb3I6cG9pbnRlcjtjb2xvcjojNjQ3NDhiO1wiPiZ0aW1lczs8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCIgc3R5bGU9XCJwYWRkaW5nOjIwcHg7XCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBpZD1cImFjaC1tb2RhbC1pZFwiIC8+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTRweDtcIj5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJhY2gtbW9kYWwtdGl0bGUtaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPlRpdGxlIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPio8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiYWNoLW1vZGFsLXRpdGxlLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiIGFyaWEtcmVxdWlyZWQ9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gTGVkIDNcdTAwRDcgcmV2ZW51ZSBncm93dGggaW5pdGlhdGl2ZVwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTRweDtcIj5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJhY2gtbW9kYWwtZGVzYy1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+RGVzY3JpcHRpb248L2xhYmVsPlxuICAgICAgICAgICAgPHRleHRhcmVhIGlkPVwiYWNoLW1vZGFsLWRlc2MtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiByb3dzPVwiM1wiIHN0eWxlPVwid2lkdGg6MTAwJTtyZXNpemU6dmVydGljYWw7XCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIk9wdGlvbmFsIGRldGFpbCBvciBtZXRyaWNcIj48L3RleHRhcmVhPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwiYWNoLW1vZGFsLXJlbGV2YW50LWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5SZWxldmFudCBmb3IgKGNvbW1hLXNlcGFyYXRlZCByb2xlcy9kb21haW5zKTwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImFjaC1tb2RhbC1yZWxldmFudC1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBsZWFkZXJzaGlwLCBNTCBlbmdpbmVlcmluZywgZGF0YSBzY2llbmNlXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cImFjaC1tb2RhbC1pbXBvcnRhbmNlLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5JbXBvcnRhbmNlICgxXHUyMDEzMTApPC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJhY2gtbW9kYWwtaW1wb3J0YW5jZS1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6ODBweDtcIlxuICAgICAgICAgICAgICAgIG1pbj1cIjFcIiBtYXg9XCIxMFwiIHZhbHVlPVwiN1wiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwiY2xvc2VNYXN0ZXJBY2hNb2RhbCgpXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG4gcHJpbWFyeVwiIG9uY2xpY2s9XCJzYXZlTWFzdGVyQWNoaWV2ZW1lbnQoKVwiPlNhdmU8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gU3VtbWFyeSBlZGl0IG1vZGFsIC0tPlxuICAgIDxkaXYgaWQ9XCJtYXN0ZXItc3VtLW1vZGFsLW92ZXJsYXlcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1tb2RhbD1cInRydWVcIlxuICAgICAgICBhcmlhLWxhYmVsbGVkYnk9XCJtYXN0ZXItc3VtLW1vZGFsLXRpdGxlXCIgY2xhc3M9XCJtb2RhbC1vdmVybGF5XCJcbiAgICAgICAgb25jbGljaz1cImlmKGV2ZW50LnRhcmdldD09PXRoaXMpY2xvc2VNYXN0ZXJTdW1Nb2RhbCgpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWxcIiBzdHlsZT1cIm1heC13aWR0aDo2MDBweDtcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuICAgICAgICAgIDxoMiBpZD1cIm1hc3Rlci1zdW0tbW9kYWwtdGl0bGVcIj5Qcm9mZXNzaW9uYWwgU3VtbWFyeTwvaDI+XG4gICAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPVwiY2xvc2VNYXN0ZXJTdW1Nb2RhbCgpXCIgYXJpYS1sYWJlbD1cIkNsb3NlIHN1bW1hcnkgZWRpdG9yXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOm5vbmU7Zm9udC1zaXplOjEuNGVtO2N1cnNvcjpwb2ludGVyO2NvbG9yOiM2NDc0OGI7XCI+JnRpbWVzOzwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIiBzdHlsZT1cInBhZGRpbmc6MjBweDtcIj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cInN1bS1tb2RhbC1rZXktaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPktleS9uYW1lIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPio8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwic3VtLW1vZGFsLWtleS1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIiBhcmlhLXJlcXVpcmVkPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIG1sX2VuZ2luZWVyaW5nIG9yIGxlYWRlcnNoaXBcIiAvPlxuICAgICAgICAgICAgPHAgc3R5bGU9XCJmb250LXNpemU6MC44MmVtO2NvbG9yOiM2YjcyODA7bWFyZ2luOjRweCAwIDA7XCI+VXNlIGxvd2VyY2FzZV91bmRlcnNjb3JlIFx1MjAxNCB0aGlzIGlzIHRoZSBrZXkgdXNlZCBpbnRlcm5hbGx5IGFuZCBzaG93biBpbiB0aGUgU3VtbWFyeSBGb2N1cyBzdGVwLjwvcD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cInN1bS1tb2RhbC10ZXh0LWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5TdW1tYXJ5IHRleHQgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+Kjwvc3Bhbj48L2xhYmVsPlxuICAgICAgICAgICAgPHRleHRhcmVhIGlkPVwic3VtLW1vZGFsLXRleHQtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiByb3dzPVwiNVwiIHN0eWxlPVwid2lkdGg6MTAwJTtyZXNpemU6dmVydGljYWw7XCIgYXJpYS1yZXF1aXJlZD1cInRydWVcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiV3JpdGUgeW91ciBwcm9mZXNzaW9uYWwgc3VtbWFyeSB2YXJpYW50IGhlcmVcdTIwMjZcIj48L3RleHRhcmVhPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgb25jbGljaz1cImNsb3NlTWFzdGVyU3VtTW9kYWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHByaW1hcnlcIiBvbmNsaWNrPVwic2F2ZU1hc3RlclN1bW1hcnkoKVwiPlNhdmU8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYDtcbiAgLy8gRGlzYWJsZSB3cml0ZSBjb250cm9scyB3aGVuIHRoZSB3b3JrZmxvdyBwaGFzZSBkb2VzIG5vdCBwZXJtaXQgTWFzdGVyIENWIGVkaXRzLlxuICBpZiAoIWlzRWRpdGFibGUpIHtcbiAgICBjb25zdCBTQUZFX09OQ0xJQ0sgPSAvXihleHBvcnRNYXN0ZXJDVnx2YWxpZGF0ZVB1YmxpY2F0aW9uc0JpYnxvcGVuQmFja3VwSGlzdG9yeU1vZGFsfHJlc3RvcmVCYWNrdXB8b3BlbkZ1bGxEYXRhUHJldmlld01vZGFsKVxcKC87XG4gICAgY29udGVudC5xdWVyeVNlbGVjdG9yQWxsKCdidXR0b24nKS5mb3JFYWNoKGJ0biA9PiB7XG4gICAgICBjb25zdCBvbmNsaWNrID0gKGJ0bi5nZXRBdHRyaWJ1dGUoJ29uY2xpY2snKSB8fCAnJykudHJpbSgpO1xuICAgICAgaWYgKFNBRkVfT05DTElDSy50ZXN0KG9uY2xpY2spKSByZXR1cm47XG4gICAgICBidG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgYnRuLnN0eWxlLm9wYWNpdHkgPSAnMC40NSc7XG4gICAgICBidG4uc3R5bGUuY3Vyc29yID0gJ25vdC1hbGxvd2VkJztcbiAgICAgIGJ0bi5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgJ0VkaXRpbmcgbG9ja2VkIFx1MjAxNCBjb21wbGV0ZSB0aGUgY3VycmVudCBzdGFnZSB0byByZS1lbmFibGUnKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIExvYWQgcHVibGljYXRpb25zIGFzeW5jaHJvbm91c2x5IGFmdGVyIHRoZSBET00gaXMgcmVhZHkuXG4gIGxvYWRQdWJsaWNhdGlvbnMoKTtcbn1cblxuZnVuY3Rpb24gX3JlbmRlclBlcnNvbmFsSW5mb0NhcmQocGkpIHtcbiAgY29uc3QgY29udGFjdCA9IHBpLmNvbnRhY3QgfHwge307XG4gIGNvbnN0IGFkZHJlc3MgPSBjb250YWN0LmFkZHJlc3MgfHwge307XG4gIGNvbnN0IHJvd3MgPSBbXG4gICAgWydOYW1lJywgICAgICBwaS5uYW1lIHx8ICcnXSxcbiAgICBbJ1RpdGxlJywgICAgIHBpLnRpdGxlIHx8IHBpLmhlYWRsaW5lIHx8ICcnXSxcbiAgICBbJ0VtYWlsJywgICAgIGNvbnRhY3QuZW1haWwgfHwgcGkuZW1haWwgfHwgJyddLFxuICAgIFsnUGhvbmUnLCAgICAgY29udGFjdC5waG9uZSB8fCAnJ10sXG4gICAgWydMaW5rZWRJbicsICBjb250YWN0LmxpbmtlZGluIHx8ICcnXSxcbiAgICBbJ1dlYnNpdGUnLCAgIGNvbnRhY3Qud2Vic2l0ZSB8fCAnJ10sXG4gICAgWydMb2NhdGlvbicsICBbYWRkcmVzcy5jaXR5LCBhZGRyZXNzLnN0YXRlXS5maWx0ZXIoQm9vbGVhbikuam9pbignLCAnKV0sXG4gIF0uZmlsdGVyKChbLCB2XSkgPT4gdik7XG4gIGlmICghcm93cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gJzxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtwYWRkaW5nOjEycHggMDtcIj5ObyBwZXJzb25hbCBpbmZvcm1hdGlvbiBvbiBmaWxlLiBDbGljayBcIlx1MjcwRlx1RkUwRiBFZGl0XCIgYWJvdmUgdG8gYWRkIHlvdXIgZGV0YWlscy48L3A+JztcbiAgfVxuICByZXR1cm4gYDxkbCBjbGFzcz1cIm1hc3Rlci1pbmZvLWdyaWRcIj4ke3Jvd3MubWFwKChbbGFiZWwsIHZhbHVlXSkgPT5cbiAgICBgPGRpdiBjbGFzcz1cIm1hc3Rlci1pbmZvLXJvd1wiPjxkdD4ke2VzY2FwZUh0bWwobGFiZWwpfTwvZHQ+PGRkPiR7ZXNjYXBlSHRtbCh2YWx1ZSl9PC9kZD48L2Rpdj5gXG4gICkuam9pbignJyl9PC9kbD5gO1xufVxuXG5mdW5jdGlvbiBfcmVuZGVyRXhwZXJpZW5jZXNMaXN0KGV4cGVyaWVuY2VzKSB7XG4gIGlmICghZXhwZXJpZW5jZXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuICc8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7cGFkZGluZzoxMnB4IDA7XCI+Tm8gZXhwZXJpZW5jZSBlbnRyaWVzIHlldC4gQ2xpY2sgXCIrIEFkZCBFeHBlcmllbmNlXCIgYWJvdmUuPC9wPic7XG4gIH1cbiAgY29uc3Qgcm93cyA9IGV4cGVyaWVuY2VzLm1hcCgoZXhwLCBpZHgpID0+IHtcbiAgICBjb25zdCB0aXRsZSAgID0gZXNjYXBlSHRtbChleHAudGl0bGUgfHwgJycpO1xuICAgIGNvbnN0IGNvbXBhbnkgPSBlc2NhcGVIdG1sKGV4cC5jb21wYW55IHx8ICcnKTtcbiAgICBjb25zdCBsb2MgICAgID0gZXhwLmxvY2F0aW9uIHx8IHt9O1xuICAgIGNvbnN0IGxvY2F0aW9uID0gZXNjYXBlSHRtbChbbG9jLmNpdHksIGxvYy5zdGF0ZV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJywgJykpO1xuICAgIGNvbnN0IGRhdGVzICAgPSBlc2NhcGVIdG1sKFtleHAuc3RhcnRfZGF0ZSwgZXhwLmVuZF9kYXRlIHx8ICdQcmVzZW50J10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyBcdTIwMTMgJykpO1xuICAgIGNvbnN0IGFjaENvdW50ID0gKGV4cC5hY2hpZXZlbWVudHMgfHwgW10pLmxlbmd0aDtcbiAgICBjb25zdCBleHBJZCA9IGVzY2FwZUh0bWwoZXhwLmlkIHx8ICcnKTtcbiAgICByZXR1cm4gYFxuICAgICAgPHRyPlxuICAgICAgICA8dGQ+XG4gICAgICAgICAgPHN0cm9uZz4ke3RpdGxlfTwvc3Ryb25nPjxicj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiM0NzU1Njk7XCI+JHtjb21wYW55fTwvc3Bhbj5cbiAgICAgICAgICAke2xvY2F0aW9uID8gYDxzcGFuIHN0eWxlPVwiY29sb3I6Izk0YTNiODtmb250LXNpemU6MC44NWVtO1wiPiBcdTAwQjcgJHtsb2NhdGlvbn08L3NwYW4+YCA6ICcnfVxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2NvbG9yOiM0NzU1Njk7d2hpdGUtc3BhY2U6bm93cmFwO1wiPiR7ZGF0ZXN9PC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7Y29sb3I6Izk0YTNiODtmb250LXNpemU6MC44NWVtO1wiPiR7YWNoQ291bnR9PC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwiYWN0aW9uLWJ0bnNcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBvbmNsaWNrPVwiZWRpdE1hc3RlckV4cGVyaWVuY2UoJyR7ZXhwSWR9JylcIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiRWRpdCBleHBlcmllbmNlOiAke3RpdGxlfVwiIHRpdGxlPVwiRWRpdFwiPlx1MjcwRlx1RkUwRjwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIG9uY2xpY2s9XCJkZWxldGVNYXN0ZXJFeHBlcmllbmNlKCcke2VzY2FwZUh0bWwoZXhwLmlkIHx8ICcnKX0nLCAnJHt0aXRsZX0nKVwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJEZWxldGUgZXhwZXJpZW5jZTogJHt0aXRsZX1cIiB0aXRsZT1cIkRlbGV0ZVwiPlx1RDgzRFx1REREMVx1RkUwRjwvYnV0dG9uPlxuICAgICAgICA8L3RkPlxuICAgICAgPC90cj5gO1xuICB9KS5qb2luKCcnKTtcbiAgcmV0dXJuIGBcbiAgICA8dGFibGUgY2xhc3M9XCJyZXZpZXctdGFibGVcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCI+XG4gICAgICA8dGhlYWQ+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8dGg+Um9sZSAvIENvbXBhbnk8L3RoPlxuICAgICAgICAgIDx0aD5EYXRlczwvdGg+XG4gICAgICAgICAgPHRoIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7d2lkdGg6NjBweDtcIj5CdWxsZXRzPC90aD5cbiAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDo4MHB4O1wiPkFjdGlvbnM8L3RoPlxuICAgICAgICA8L3RyPlxuICAgICAgPC90aGVhZD5cbiAgICAgIDx0Ym9keT4ke3Jvd3N9PC90Ym9keT5cbiAgICA8L3RhYmxlPmA7XG59XG5cbmZ1bmN0aW9uIF9yZW5kZXJTa2lsbHNTZWN0aW9uKHNraWxscykge1xuICBjb25zdCBub3JtYWxpemVTa2lsbCA9IChzKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBzID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHsgbmFtZTogcywgZXhwZXJpZW5jZXM6IFtdIH07XG4gICAgfVxuICAgIGlmIChzICYmIHR5cGVvZiBzID09PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogcy5uYW1lIHx8ICcnLFxuICAgICAgICBleHBlcmllbmNlczogQXJyYXkuaXNBcnJheShzLmV4cGVyaWVuY2VzKSA/IHMuZXhwZXJpZW5jZXMgOiBbXSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7IG5hbWU6IFN0cmluZyhzIHx8ICcnKSwgZXhwZXJpZW5jZXM6IFtdIH07XG4gIH07XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoc2tpbGxzKSkge1xuICAgIGlmICghc2tpbGxzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuICc8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7cGFkZGluZzoxMnB4IDA7XCI+Tm8gc2tpbGxzIG9uIGZpbGUuIENsaWNrIFwiKyBBZGQgU2tpbGxcIiBhYm92ZS48L3A+JztcbiAgICB9XG4gICAgY29uc3QgY2hpcHMgPSBza2lsbHMubWFwKHMgPT4ge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZVNraWxsKHMpO1xuICAgICAgY29uc3QgbmFtZSA9IGVzY2FwZUh0bWwobm9ybWFsaXplZC5uYW1lKTtcbiAgICAgIGNvbnN0IHJhdyA9IGVzY2FwZUh0bWwobm9ybWFsaXplZC5uYW1lKTtcbiAgICAgIGNvbnN0IGJhZGdlID0gbm9ybWFsaXplZC5leHBlcmllbmNlcy5sZW5ndGhcbiAgICAgICAgPyBgPHNtYWxsIHN0eWxlPVwiY29sb3I6IzY0NzQ4YjttYXJnaW4tbGVmdDo2cHg7XCI+KCR7bm9ybWFsaXplZC5leHBlcmllbmNlcy5sZW5ndGh9IGV4cCk8L3NtYWxsPmBcbiAgICAgICAgOiAnJztcbiAgICAgIGNvbnN0IHNraWxsSnNvbiA9IGVzY2FwZUh0bWwoSlNPTi5zdHJpbmdpZnkoeyBuYW1lOiBub3JtYWxpemVkLm5hbWUsIGV4cGVyaWVuY2VzOiBub3JtYWxpemVkLmV4cGVyaWVuY2VzIH0pKTtcbiAgICAgIHJldHVybiBgPHNwYW4gY2xhc3M9XCJza2lsbC1jaGlwXCI+JHtuYW1lfSR7YmFkZ2V9PGJ1dHRvbiBjbGFzcz1cInNraWxsLWNoaXAtZGVsXCIgb25jbGljaz1cImVkaXRNYXN0ZXJTa2lsbCgke3NraWxsSnNvbn0sICcnLCB0cnVlKVwiIGFyaWEtbGFiZWw9XCJFZGl0IHNraWxsICR7bmFtZX1cIiB0aXRsZT1cIkVkaXRcIj5cdTI3MEZcdUZFMEY8L2J1dHRvbj48YnV0dG9uIGNsYXNzPVwic2tpbGwtY2hpcC1kZWxcIiBvbmNsaWNrPVwiZGVsZXRlTWFzdGVyU2tpbGwoJyR7cmF3fScsICcnLCB0cnVlKVwiIGFyaWEtbGFiZWw9XCJSZW1vdmUgc2tpbGwgJHtuYW1lfVwiIHRpdGxlPVwiUmVtb3ZlXCI+XHUwMEQ3PC9idXR0b24+PC9zcGFuPmA7XG4gICAgfSkuam9pbignJyk7XG4gICAgcmV0dXJuIGA8ZGl2IGNsYXNzPVwic2tpbGwtY2hpcHMtY29udGFpbmVyXCI+JHtjaGlwc308L2Rpdj5gO1xuICB9XG4gIGlmICh0eXBlb2Ygc2tpbGxzID09PSAnb2JqZWN0JyAmJiBza2lsbHMgIT09IG51bGwpIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoc2tpbGxzKTtcbiAgICBpZiAoIWtleXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gJzxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtwYWRkaW5nOjEycHggMDtcIj5ObyBza2lsbCBjYXRlZ29yaWVzIG9uIGZpbGUuPC9wPic7XG4gICAgfVxuICAgIHJldHVybiBrZXlzLm1hcChjYXRLZXkgPT4ge1xuICAgICAgY29uc3QgY2F0VmFsICA9IHNraWxsc1tjYXRLZXldO1xuICAgICAgY29uc3QgY2F0TmFtZSAgPSB0eXBlb2YgY2F0VmFsID09PSAnb2JqZWN0JyAmJiBjYXRWYWwuY2F0ZWdvcnkgPyBjYXRWYWwuY2F0ZWdvcnkgOiBjYXRLZXk7XG4gICAgICBjb25zdCBjYXRMaXN0ICA9IEFycmF5LmlzQXJyYXkoY2F0VmFsKSA/IGNhdFZhbFxuICAgICAgICAgICAgICAgICAgICAgOiBBcnJheS5pc0FycmF5KGNhdFZhbD8uc2tpbGxzKSA/IGNhdFZhbC5za2lsbHMgOiBbXTtcbiAgICAgIGNvbnN0IGNoaXBzICAgPSBjYXRMaXN0Lm1hcChzID0+IHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZVNraWxsKHMpO1xuICAgICAgICBjb25zdCBuYW1lID0gZXNjYXBlSHRtbChub3JtYWxpemVkLm5hbWUpO1xuICAgICAgICBjb25zdCBiYWRnZSA9IG5vcm1hbGl6ZWQuZXhwZXJpZW5jZXMubGVuZ3RoXG4gICAgICAgICAgPyBgPHNtYWxsIHN0eWxlPVwiY29sb3I6IzY0NzQ4YjttYXJnaW4tbGVmdDo2cHg7XCI+KCR7bm9ybWFsaXplZC5leHBlcmllbmNlcy5sZW5ndGh9IGV4cCk8L3NtYWxsPmBcbiAgICAgICAgICA6ICcnO1xuICAgICAgICBjb25zdCBza2lsbEpzb24gPSBlc2NhcGVIdG1sKEpTT04uc3RyaW5naWZ5KHsgbmFtZTogbm9ybWFsaXplZC5uYW1lLCBleHBlcmllbmNlczogbm9ybWFsaXplZC5leHBlcmllbmNlcyB9KSk7XG4gICAgICAgIHJldHVybiBgPHNwYW4gY2xhc3M9XCJza2lsbC1jaGlwXCI+JHtuYW1lfSR7YmFkZ2V9PGJ1dHRvbiBjbGFzcz1cInNraWxsLWNoaXAtZGVsXCIgb25jbGljaz1cImVkaXRNYXN0ZXJTa2lsbCgke3NraWxsSnNvbn0sICcke2VzY2FwZUh0bWwoY2F0S2V5KX0nLCBmYWxzZSlcIiBhcmlhLWxhYmVsPVwiRWRpdCAke25hbWV9XCIgdGl0bGU9XCJFZGl0XCI+XHUyNzBGXHVGRTBGPC9idXR0b24+PGJ1dHRvbiBjbGFzcz1cInNraWxsLWNoaXAtZGVsXCIgb25jbGljaz1cImRlbGV0ZU1hc3RlclNraWxsKCcke25hbWV9JywgJyR7ZXNjYXBlSHRtbChjYXRLZXkpfScsIGZhbHNlKVwiIGFyaWEtbGFiZWw9XCJSZW1vdmUgJHtuYW1lfVwiIHRpdGxlPVwiUmVtb3ZlXCI+XHUwMEQ3PC9idXR0b24+PC9zcGFuPmA7XG4gICAgICB9KS5qb2luKCcnKTtcbiAgICAgIGNvbnN0IGNhdEtleUVzYyAgPSBlc2NhcGVIdG1sKGNhdEtleSk7XG4gICAgICBjb25zdCBjYXROYW1lRXNjID0gZXNjYXBlSHRtbChjYXROYW1lKTtcbiAgICAgIHJldHVybiBgXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc2tpbGwtY2F0ZWdvcnlcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXNraWxsLWNhdC1oZWFkZXJcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWFzdGVyLXNraWxsLWNhdC1uYW1lXCI+JHtjYXROYW1lRXNjfTwvc3Bhbj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuLXNtXCIgb25jbGljaz1cInNob3dBZGRTa2lsbE1vZGFsKCcke2NhdEtleUVzY30nLCBmYWxzZSlcIlxuICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJBZGQgc2tpbGwgdG8gJHtjYXROYW1lRXNjfVwiPisgQWRkPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNraWxsLWNoaXBzLWNvbnRhaW5lclwiPiR7Y2hpcHMgfHwgJzxzcGFuIHN0eWxlPVwiY29sb3I6Izk0YTNiODtmb250LXNpemU6MC44NWVtO1wiPk5vIHNraWxscyBpbiB0aGlzIGNhdGVnb3J5PC9zcGFuPid9PC9kaXY+XG4gICAgICAgIDwvZGl2PmA7XG4gICAgfSkuam9pbignJyk7XG4gIH1cbiAgcmV0dXJuICc8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7XCI+U2tpbGxzIGRhdGEgZm9ybWF0IG5vdCByZWNvZ25pc2VkLjwvcD4nO1xufVxuXG5mdW5jdGlvbiBfcmVuZGVyRWR1Y2F0aW9uTGlzdChlZHVjYXRpb24pIHtcbiAgaWYgKCFlZHVjYXRpb24ubGVuZ3RoKSB7XG4gICAgcmV0dXJuICc8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7cGFkZGluZzoxMnB4IDA7XCI+Tm8gZWR1Y2F0aW9uIGVudHJpZXMgeWV0LiBDbGljayBcIisgQWRkIEVkdWNhdGlvblwiIGFib3ZlLjwvcD4nO1xuICB9XG4gIGNvbnN0IHJvd3MgPSBlZHVjYXRpb24ubWFwKChlZHUsIGlkeCkgPT4ge1xuICAgIGNvbnN0IGRlZ3JlZSAgICAgID0gZXNjYXBlSHRtbChlZHUuZGVncmVlIHx8ICcnKTtcbiAgICBjb25zdCBmaWVsZCAgICAgICA9IGVzY2FwZUh0bWwoZWR1LmZpZWxkIHx8ICcnKTtcbiAgICBjb25zdCBpbnN0aXR1dGlvbiA9IGVzY2FwZUh0bWwoZWR1Lmluc3RpdHV0aW9uIHx8ICcnKTtcbiAgICBjb25zdCBsb2MgICAgICAgICA9IGVkdS5sb2NhdGlvbiB8fCB7fTtcbiAgICBjb25zdCBsb2NhdGlvbiAgICA9IGVzY2FwZUh0bWwoW2xvYy5jaXR5LCBsb2Muc3RhdGVdLmZpbHRlcihCb29sZWFuKS5qb2luKCcsICcpKTtcbiAgICBjb25zdCB5ZWFycyAgICAgICA9IFtlZHUuc3RhcnRfeWVhciwgZWR1LmVuZF95ZWFyXS5maWx0ZXIoQm9vbGVhbikuam9pbignXHUyMDEzJyk7XG4gICAgY29uc3QgZWR1SnNvbiA9IGVzY2FwZUh0bWwoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZGVncmVlOiBlZHUuZGVncmVlIHx8ICcnLCBmaWVsZDogZWR1LmZpZWxkIHx8ICcnLCBpbnN0aXR1dGlvbjogZWR1Lmluc3RpdHV0aW9uIHx8ICcnLFxuICAgICAgY2l0eTogbG9jLmNpdHkgfHwgJycsIHN0YXRlOiBsb2Muc3RhdGUgfHwgJycsXG4gICAgICBzdGFydF95ZWFyOiBlZHUuc3RhcnRfeWVhciB8fCAnJywgZW5kX3llYXI6IGVkdS5lbmRfeWVhciB8fCAnJyxcbiAgICB9KSk7XG4gICAgcmV0dXJuIGBcbiAgICAgIDx0cj5cbiAgICAgICAgPHRkPlxuICAgICAgICAgIDxzdHJvbmc+JHtkZWdyZWV9JHtmaWVsZCA/IGAsICR7ZmllbGR9YCA6ICcnfTwvc3Ryb25nPjxicj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiM0NzU1Njk7XCI+JHtpbnN0aXR1dGlvbn08L3NwYW4+XG4gICAgICAgICAgJHtsb2NhdGlvbiA/IGA8c3BhbiBzdHlsZT1cImNvbG9yOiM5NGEzYjg7Zm9udC1zaXplOjAuODVlbTtcIj4gXHUwMEI3ICR7bG9jYXRpb259PC9zcGFuPmAgOiAnJ31cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtjb2xvcjojNDc1NTY5O3doaXRlLXNwYWNlOm5vd3JhcDtcIj4ke3llYXJzIHx8ICdcdTIwMTQnfTwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cImFjdGlvbi1idG5zXCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgb25jbGljaz1cImVkaXRNYXN0ZXJFZHVjYXRpb24oJHtlZHVKc29ufSwgJHtpZHh9KVwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJFZGl0IGVkdWNhdGlvbjogJHtpbnN0aXR1dGlvbn1cIiB0aXRsZT1cIkVkaXRcIj5cdTI3MEZcdUZFMEY8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBvbmNsaWNrPVwiZGVsZXRlTWFzdGVyRWR1Y2F0aW9uKCR7aWR4fSwgJyR7aW5zdGl0dXRpb259JylcIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiRGVsZXRlIGVkdWNhdGlvbjogJHtpbnN0aXR1dGlvbn1cIiB0aXRsZT1cIkRlbGV0ZVwiPlx1RDgzRFx1REREMVx1RkUwRjwvYnV0dG9uPlxuICAgICAgICA8L3RkPlxuICAgICAgPC90cj5gO1xuICB9KS5qb2luKCcnKTtcbiAgcmV0dXJuIGBcbiAgICA8dGFibGUgY2xhc3M9XCJyZXZpZXctdGFibGVcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCI+XG4gICAgICA8dGhlYWQ+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8dGg+RGVncmVlIC8gSW5zdGl0dXRpb248L3RoPlxuICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOjEwMHB4O1wiPlllYXJzPC90aD5cbiAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDo4MHB4O1wiPkFjdGlvbnM8L3RoPlxuICAgICAgICA8L3RyPlxuICAgICAgPC90aGVhZD5cbiAgICAgIDx0Ym9keT4ke3Jvd3N9PC90Ym9keT5cbiAgICA8L3RhYmxlPmA7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUHVibGljYXRpb25zIFx1MjAxNCBDUlVEICsgcmF3IEJpYlRlWCB0b2dnbGVcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogQ3VycmVudCB2aWV3IG1vZGU6ICdjcnVkJyB8ICdyYXcnICovXG5sZXQgX3B1YlZpZXdNb2RlID0gJ2NydWQnO1xubGV0IF9wdWJTb3J0TW9kZSA9ICd5ZWFyX2Rlc2MnO1xubGV0IF9wdWJHcm91cE1vZGUgPSAnbm9uZSc7XG4vKiogVHJ1ZSB3aGVuIHRoZSBlbnRyeSBiZWluZyBlZGl0ZWQgaGFkIGFuIGBlZGl0b3JgIGZpZWxkIGJ1dCBubyBgYXV0aG9yYC4gKi9cbmxldCBfcHViTW9kYWxVc2VzRWRpdG9yRmllbGQgPSBmYWxzZTtcblxuZnVuY3Rpb24gdG9nZ2xlUHVibGljYXRpb25zVmlldygpIHtcbiAgX3B1YlZpZXdNb2RlID0gX3B1YlZpZXdNb2RlID09PSAnY3J1ZCcgPyAncmF3JyA6ICdjcnVkJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItY3J1ZC12aWV3Jykuc3R5bGUuZGlzcGxheSA9IF9wdWJWaWV3TW9kZSA9PT0gJ2NydWQnID8gJycgOiAnbm9uZSc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLXJhdy12aWV3Jykuc3R5bGUuZGlzcGxheSAgPSBfcHViVmlld01vZGUgPT09ICdyYXcnICA/ICcnIDogJ25vbmUnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1hZGQtYnRuJykuc3R5bGUuZGlzcGxheSAgID0gX3B1YlZpZXdNb2RlID09PSAnY3J1ZCcgPyAnJyA6ICdub25lJztcbiAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItdG9nZ2xlLWJ0bicpO1xuICBpZiAoYnRuKSBidG4udGV4dENvbnRlbnQgPSBfcHViVmlld01vZGUgPT09ICdjcnVkJyA/ICdcdTI3MEZcdUZFMEYgUmF3IEJpYlRlWCcgOiAnXHVEODNEXHVEQ0NCIFN0cnVjdHVyZWQgVmlldyc7XG4gIGlmIChfcHViVmlld01vZGUgPT09ICdyYXcnKSBsb2FkUHVibGljYXRpb25zQmliKCk7XG59XG5cbi8qKiBMb2FkIGJvdGggc3RydWN0dXJlZCBsaXN0IGFuZCByYXcgY29udGVudCBmcm9tIGEgc2luZ2xlIEFQSSBjYWxsLiAqL1xuYXN5bmMgZnVuY3Rpb24gbG9hZFB1YmxpY2F0aW9ucygpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvcHVibGljYXRpb25zJyk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEub2spIHtcbiAgICAgIF9yZW5kZXJQdWJsaWNhdGlvbnNDcnVkTGlzdChkYXRhLnB1YmxpY2F0aW9ucyB8fCBbXSk7XG4gICAgICBjb25zdCB0YSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLXRleHRhcmVhJyk7XG4gICAgICBpZiAodGEpIHRhLnZhbHVlID0gZGF0YS5jb250ZW50IHx8ICcnO1xuICAgICAgX3VwZGF0ZVB1YkNvdW50KGRhdGEuY291bnQgPz8gMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNydWQtY29udGFpbmVyJykuaW5uZXJIVE1MID1cbiAgICAgICAgYDxwIHN0eWxlPVwiY29sb3I6I2VmNDQ0NDtwYWRkaW5nOjEycHggMDtcIj5cdTI2QTBcdUZFMEYgJHtlc2NhcGVIdG1sKGRhdGEuZXJyb3IgfHwgJ0ZhaWxlZCB0byBsb2FkJyl9PC9wPmA7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1jcnVkLWNvbnRhaW5lcicpLmlubmVySFRNTCA9XG4gICAgICBgPHAgc3R5bGU9XCJjb2xvcjojZWY0NDQ0O3BhZGRpbmc6MTJweCAwO1wiPlx1MjZBMFx1RkUwRiBGYWlsZWQgdG8gbG9hZDogJHtlc2NhcGVIdG1sKGVyci5tZXNzYWdlKX08L3A+YDtcbiAgfVxufVxuXG4vKiogUmVsb2FkIG9ubHkgdGhlIHJhdyB0ZXh0YXJlYSBjb250ZW50IChjYWxsZWQgd2hlbiBzd2l0Y2hpbmcgdG8gcmF3IHZpZXcpLiAqL1xuYXN5bmMgZnVuY3Rpb24gbG9hZFB1YmxpY2F0aW9uc0JpYigpIHtcbiAgY29uc3QgdGEgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItdGV4dGFyZWEnKTtcbiAgY29uc3Qgc3RhdHVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItc3RhdHVzJyk7XG4gIGlmICghdGEpIHJldHVybjtcbiAgdGEuZGlzYWJsZWQgICAgPSB0cnVlO1xuICB0YS5wbGFjZWhvbGRlciA9ICdMb2FkaW5nXHUyMDI2JztcbiAgaWYgKHN0YXR1cykgc3RhdHVzLnRleHRDb250ZW50ID0gJyc7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL3B1YmxpY2F0aW9ucycpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICB0YS52YWx1ZSA9IGRhdGEuY29udGVudCB8fCAnJztcbiAgICAgIF91cGRhdGVQdWJDb3VudChkYXRhLmNvdW50ID8/IDApO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc3RhdHVzKSBzdGF0dXMudGV4dENvbnRlbnQgPSAnXHUyNkEwXHVGRTBGICcgKyAoZGF0YS5lcnJvciB8fCAnRmFpbGVkIHRvIGxvYWQnKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChzdGF0dXMpIHN0YXR1cy50ZXh0Q29udGVudCA9ICdcdTI2QTBcdUZFMEYgRmFpbGVkIHRvIGxvYWQ6ICcgKyBlcnIubWVzc2FnZTtcbiAgfSBmaW5hbGx5IHtcbiAgICB0YS5kaXNhYmxlZCAgICA9IGZhbHNlO1xuICAgIHRhLnBsYWNlaG9sZGVyID0gJyc7XG4gIH1cbn1cblxuZnVuY3Rpb24gX3VwZGF0ZVB1YkNvdW50KG4pIHtcbiAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1jb3VudCcpO1xuICBpZiAoZWwpIGVsLnRleHRDb250ZW50ID0gYCR7bn0gcHVibGljYXRpb24ke24gIT09IDEgPyAncycgOiAnJ30gb24gZmlsZWA7XG59XG5cbmZ1bmN0aW9uIF9zZXRQdWJsaWNhdGlvblN0YXR1cyhlbGVtZW50SWQsIHRleHQsIGNvbG9yID0gJyM2YjcyODAnKSB7XG4gIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbWVudElkKTtcbiAgaWYgKCFlbCkgcmV0dXJuO1xuICBlbC50ZXh0Q29udGVudCA9IHRleHQ7XG4gIGVsLnN0eWxlLmNvbG9yID0gY29sb3I7XG59XG5cbmZ1bmN0aW9uIHNldFB1YmxpY2F0aW9uU29ydE1vZGUobW9kZSkge1xuICBfcHViU29ydE1vZGUgPSBtb2RlIHx8ICd5ZWFyX2Rlc2MnO1xuICB2b2lkIGxvYWRQdWJsaWNhdGlvbnMoKTtcbn1cblxuZnVuY3Rpb24gc2V0UHVibGljYXRpb25Hcm91cE1vZGUobW9kZSkge1xuICBfcHViR3JvdXBNb2RlID0gbW9kZSB8fCAnbm9uZSc7XG4gIHZvaWQgbG9hZFB1YmxpY2F0aW9ucygpO1xufVxuXG5mdW5jdGlvbiBfZ2V0UHVibGljYXRpb25ZZWFyKHB1Yikge1xuICBjb25zdCByYXdZZWFyID0gcHViPy5maWVsZHM/LnllYXIgPz8gcHViPy55ZWFyID8/ICcnO1xuICBjb25zdCBtYXRjaCA9IFN0cmluZyhyYXdZZWFyKS5tYXRjaCgvXFxkezR9Lyk7XG4gIHJldHVybiBtYXRjaCA/IE51bWJlcihtYXRjaFswXSkgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBfY29tcGFyZVB1YmxpY2F0aW9ucyhsZWZ0LCByaWdodCkge1xuICBjb25zdCBsZWZ0WWVhciA9IF9nZXRQdWJsaWNhdGlvblllYXIobGVmdCkgPz8gLUluZmluaXR5O1xuICBjb25zdCByaWdodFllYXIgPSBfZ2V0UHVibGljYXRpb25ZZWFyKHJpZ2h0KSA/PyAtSW5maW5pdHk7XG4gIGNvbnN0IGxlZnRUeXBlID0gU3RyaW5nKGxlZnQ/LnR5cGUgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IHJpZ2h0VHlwZSA9IFN0cmluZyhyaWdodD8udHlwZSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgbGVmdEtleSA9IFN0cmluZyhsZWZ0Py5rZXkgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IHJpZ2h0S2V5ID0gU3RyaW5nKHJpZ2h0Py5rZXkgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG5cbiAgc3dpdGNoIChfcHViU29ydE1vZGUpIHtcbiAgICBjYXNlICd5ZWFyX2FzYyc6XG4gICAgICByZXR1cm4gKGxlZnRZZWFyIC0gcmlnaHRZZWFyKSB8fCBsZWZ0VHlwZS5sb2NhbGVDb21wYXJlKHJpZ2h0VHlwZSkgfHwgbGVmdEtleS5sb2NhbGVDb21wYXJlKHJpZ2h0S2V5KTtcbiAgICBjYXNlICd0eXBlX2FzYyc6XG4gICAgICByZXR1cm4gbGVmdFR5cGUubG9jYWxlQ29tcGFyZShyaWdodFR5cGUpIHx8IChyaWdodFllYXIgLSBsZWZ0WWVhcikgfHwgbGVmdEtleS5sb2NhbGVDb21wYXJlKHJpZ2h0S2V5KTtcbiAgICBjYXNlICd0eXBlX2Rlc2MnOlxuICAgICAgcmV0dXJuIHJpZ2h0VHlwZS5sb2NhbGVDb21wYXJlKGxlZnRUeXBlKSB8fCAocmlnaHRZZWFyIC0gbGVmdFllYXIpIHx8IGxlZnRLZXkubG9jYWxlQ29tcGFyZShyaWdodEtleSk7XG4gICAgY2FzZSAneWVhcl9kZXNjJzpcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIChyaWdodFllYXIgLSBsZWZ0WWVhcikgfHwgbGVmdFR5cGUubG9jYWxlQ29tcGFyZShyaWdodFR5cGUpIHx8IGxlZnRLZXkubG9jYWxlQ29tcGFyZShyaWdodEtleSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2dyb3VwUHVibGljYXRpb25MYWJlbChwdWIpIHtcbiAgaWYgKF9wdWJHcm91cE1vZGUgPT09ICd5ZWFyJykge1xuICAgIHJldHVybiBTdHJpbmcoX2dldFB1YmxpY2F0aW9uWWVhcihwdWIpID8/ICdVbmtub3duIHllYXInKTtcbiAgfVxuICBpZiAoX3B1Ykdyb3VwTW9kZSA9PT0gJ3R5cGUnKSB7XG4gICAgcmV0dXJuIHB1Yj8udHlwZSA/IFN0cmluZyhwdWIudHlwZSkgOiAnVW5rbm93biB0eXBlJztcbiAgfVxuICByZXR1cm4gJ1B1YmxpY2F0aW9ucyc7XG59XG5cbmZ1bmN0aW9uIF9yZW5kZXJQdWJsaWNhdGlvbnNDcnVkTGlzdChwdWJzKSB7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNydWQtY29udGFpbmVyJyk7XG4gIGlmICghY29udGFpbmVyKSByZXR1cm47XG4gIGNvbnN0IGNvbnRyb2xzSHRtbCA9IGBcbiAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2ZsZXgtd3JhcDp3cmFwO2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTJweDttYXJnaW4tYm90dG9tOjEycHg7XCI+XG4gICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDo2cHg7Y29sb3I6IzQ3NTU2OTtmb250LXNpemU6MC45ZW07XCI+XG4gICAgICAgIFNvcnRcbiAgICAgICAgPHNlbGVjdCBpZD1cIm1hc3Rlci1wdWItc29ydC1zZWxlY3RcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOmF1dG87bWluLXdpZHRoOjE1MHB4O1wiIG9uY2hhbmdlPVwic2V0UHVibGljYXRpb25Tb3J0TW9kZSh0aGlzLnZhbHVlKVwiPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ5ZWFyX2Rlc2NcIiAke19wdWJTb3J0TW9kZSA9PT0gJ3llYXJfZGVzYycgPyAnc2VsZWN0ZWQnIDogJyd9PlllYXIgbmV3ZXN0IGZpcnN0PC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInllYXJfYXNjXCIgJHtfcHViU29ydE1vZGUgPT09ICd5ZWFyX2FzYycgPyAnc2VsZWN0ZWQnIDogJyd9PlllYXIgb2xkZXN0IGZpcnN0PC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInR5cGVfYXNjXCIgJHtfcHViU29ydE1vZGUgPT09ICd0eXBlX2FzYycgPyAnc2VsZWN0ZWQnIDogJyd9PlR5cGUgQVx1MjAxM1o8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwidHlwZV9kZXNjXCIgJHtfcHViU29ydE1vZGUgPT09ICd0eXBlX2Rlc2MnID8gJ3NlbGVjdGVkJyA6ICcnfT5UeXBlIFpcdTIwMTNBPC9vcHRpb24+XG4gICAgICAgIDwvc2VsZWN0PlxuICAgICAgPC9sYWJlbD5cbiAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjZweDtjb2xvcjojNDc1NTY5O2ZvbnQtc2l6ZTowLjllbTtcIj5cbiAgICAgICAgR3JvdXBcbiAgICAgICAgPHNlbGVjdCBpZD1cIm1hc3Rlci1wdWItZ3JvdXAtc2VsZWN0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDphdXRvO21pbi13aWR0aDoxNDBweDtcIiBvbmNoYW5nZT1cInNldFB1YmxpY2F0aW9uR3JvdXBNb2RlKHRoaXMudmFsdWUpXCI+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIm5vbmVcIiAke19wdWJHcm91cE1vZGUgPT09ICdub25lJyA/ICdzZWxlY3RlZCcgOiAnJ30+Tm8gZ3JvdXBpbmc8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwieWVhclwiICR7X3B1Ykdyb3VwTW9kZSA9PT0gJ3llYXInID8gJ3NlbGVjdGVkJyA6ICcnfT5CeSB5ZWFyPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInR5cGVcIiAke19wdWJHcm91cE1vZGUgPT09ICd0eXBlJyA/ICdzZWxlY3RlZCcgOiAnJ30+QnkgdHlwZTwvb3B0aW9uPlxuICAgICAgICA8L3NlbGVjdD5cbiAgICAgIDwvbGFiZWw+XG4gICAgPC9kaXY+YDtcbiAgaWYgKCFwdWJzLmxlbmd0aCkge1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBgJHtjb250cm9sc0h0bWx9PHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO3BhZGRpbmc6MTJweCAwO1wiPk5vIHB1YmxpY2F0aW9ucyBvbiBmaWxlLiBDbGljayBcIisgQWRkIFB1YmxpY2F0aW9uXCIgYWJvdmUsIG9yIHN3aXRjaCB0byBSYXcgQmliVGVYIHRvIHBhc3RlL2ltcG9ydCBlbnRyaWVzLjwvcD5gO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBzb3J0ZWQgPSBbLi4ucHVic10uc29ydChfY29tcGFyZVB1YmxpY2F0aW9ucyk7XG4gIGNvbnN0IGdyb3VwcyA9IFtdO1xuICBmb3IgKGNvbnN0IHB1YiBvZiBzb3J0ZWQpIHtcbiAgICBjb25zdCBsYWJlbCA9IF9ncm91cFB1YmxpY2F0aW9uTGFiZWwocHViKTtcbiAgICBsZXQgZ3JvdXAgPSBncm91cHMuZmluZCgoZW50cnkpID0+IGVudHJ5LmxhYmVsID09PSBsYWJlbCk7XG4gICAgaWYgKCFncm91cCkge1xuICAgICAgZ3JvdXAgPSB7IGxhYmVsLCBpdGVtczogW10gfTtcbiAgICAgIGdyb3Vwcy5wdXNoKGdyb3VwKTtcbiAgICB9XG4gICAgZ3JvdXAuaXRlbXMucHVzaChwdWIpO1xuICB9XG4gIGNvbnN0IHNlY3Rpb25IdG1sID0gZ3JvdXBzLm1hcCgoeyBsYWJlbCwgaXRlbXMgfSkgPT4ge1xuICAgIGNvbnN0IGhlYWRpbmdIdG1sID0gX3B1Ykdyb3VwTW9kZSA9PT0gJ25vbmUnXG4gICAgICA/ICcnXG4gICAgICA6IGA8ZGl2IHN0eWxlPVwibWFyZ2luOjE2cHggMCA4cHg7Zm9udC1zaXplOjAuOWVtO2ZvbnQtd2VpZ2h0OjcwMDtjb2xvcjojMzM0MTU1O1wiPiR7ZXNjYXBlSHRtbChsYWJlbCl9PC9kaXY+YDtcbiAgICBjb25zdCByb3dzID0gaXRlbXMubWFwKHB1YiA9PiB7XG4gICAgY29uc3Qga2V5ICAgICAgPSBlc2NhcGVIdG1sKHB1Yi5rZXkgfHwgJycpO1xuICAgIGNvbnN0IHR5cGUgICAgID0gZXNjYXBlSHRtbChwdWIudHlwZSB8fCAnJyk7XG4gICAgY29uc3QgY2l0YXRpb24gPSBlc2NhcGVIdG1sKChwdWIuZm9ybWF0dGVkX2NpdGF0aW9uIHx8ICcnKS5zbGljZSgwLCAxNjApKTtcbiAgICBjb25zdCBmdWxsICAgICA9IHB1Yi5mb3JtYXR0ZWRfY2l0YXRpb24gfHwgJyc7XG4gICAgY29uc3QgcHViSnNvbiAgPSBlc2NhcGVIdG1sKEpTT04uc3RyaW5naWZ5KHB1YikpO1xuICAgIHJldHVybiBgXG4gICAgICA8dHI+XG4gICAgICAgIDx0ZD5cbiAgICAgICAgICA8Y29kZSBzdHlsZT1cImZvbnQtc2l6ZTowLjhlbTtjb2xvcjojNDc1NTY5O1wiPiR7a2V5fTwvY29kZT5cbiAgICAgICAgICAke2NpdGF0aW9uID8gYDxicj48c21hbGwgc3R5bGU9XCJjb2xvcjojNmI3MjgwO1wiPiR7Y2l0YXRpb259JHtmdWxsLmxlbmd0aCA+IDE2MCA/ICdcdTIwMjYnIDogJyd9PC9zbWFsbD5gIDogJyd9XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO2NvbG9yOiM0NzU1Njk7Zm9udC1zaXplOjAuODVlbTtcIj4ke3R5cGV9PC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwiYWN0aW9uLWJ0bnNcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBvbmNsaWNrPVwiZWRpdE1hc3RlclB1YmxpY2F0aW9uKCR7cHViSnNvbn0pXCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkVkaXQgcHVibGljYXRpb246ICR7a2V5fVwiIHRpdGxlPVwiRWRpdFwiPlx1MjcwRlx1RkUwRjwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIG9uY2xpY2s9XCJkZWxldGVNYXN0ZXJQdWJsaWNhdGlvbignJHtrZXl9JylcIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiRGVsZXRlIHB1YmxpY2F0aW9uOiAke2tleX1cIiB0aXRsZT1cIkRlbGV0ZVwiPlx1RDgzRFx1REREMVx1RkUwRjwvYnV0dG9uPlxuICAgICAgICA8L3RkPlxuICAgICAgPC90cj5gO1xuICAgIH0pLmpvaW4oJycpO1xuICAgIHJldHVybiBgJHtoZWFkaW5nSHRtbH1cbiAgICA8dGFibGUgY2xhc3M9XCJyZXZpZXctdGFibGVcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCI+XG4gICAgICA8dGhlYWQ+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8dGg+UHVibGljYXRpb248L3RoPlxuICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOjExMHB4O3RleHQtYWxpZ246Y2VudGVyO1wiPlR5cGU8L3RoPlxuICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOjgwcHg7XCI+QWN0aW9uczwvdGg+XG4gICAgICAgIDwvdHI+XG4gICAgICA8L3RoZWFkPlxuICAgICAgPHRib2R5PiR7cm93c308L3Rib2R5PlxuICAgIDwvdGFibGU+YDtcbiAgfSkuam9pbignJyk7XG4gIGNvbnRhaW5lci5pbm5lckhUTUwgPSBgJHtjb250cm9sc0h0bWx9JHtzZWN0aW9uSHRtbH1gO1xufVxuXG4vKiogVmFsaWRhdGUgQmliVGVYIGluIHRoZSB0ZXh0YXJlYSB3aXRob3V0IHNhdmluZy4gKi9cbmFzeW5jIGZ1bmN0aW9uIHZhbGlkYXRlUHVibGljYXRpb25zQmliKCkge1xuICBjb25zdCB0YSAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi10ZXh0YXJlYScpO1xuICBjb25zdCBzdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1zdGF0dXMnKTtcbiAgaWYgKCF0YSB8fCAhc3RhdHVzKSByZXR1cm47XG4gIGNvbnN0IHRleHQgPSB0YS52YWx1ZTtcbiAgaWYgKCF0ZXh0LnRyaW0oKSkge1xuICAgIHN0YXR1cy50ZXh0Q29udGVudCA9ICdcdTIxMzlcdUZFMEYgRW1wdHkgXHUyMDE0IG5vdGhpbmcgdG8gdmFsaWRhdGUuJztcbiAgICBzdGF0dXMuc3R5bGUuY29sb3IgPSAnIzZiNzI4MCc7XG4gICAgcmV0dXJuO1xuICB9XG4gIHN0YXR1cy50ZXh0Q29udGVudCA9ICdcdUQ4M0RcdUREMEQgVmFsaWRhdGluZ1x1MjAyNic7XG4gIHN0YXR1cy5zdHlsZS5jb2xvciA9ICcjNmI3MjgwJztcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvcHVibGljYXRpb25zL3ZhbGlkYXRlJywge1xuICAgICAgbWV0aG9kOiAgJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiAgICBKU09OLnN0cmluZ2lmeSh7IGJpYnRleF90ZXh0OiB0ZXh0IH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBjb25zdCBuID0gZGF0YS5jb3VudCA/PyAwO1xuICAgICAgc3RhdHVzLnRleHRDb250ZW50ID0gYFx1MjcwNSBWYWxpZCBcdTIwMTQgJHtufSBlbnRyJHtuICE9PSAxID8gJ2llcycgOiAneSd9IGZvdW5kLmA7XG4gICAgICBzdGF0dXMuc3R5bGUuY29sb3IgPSAnIzE1ODAzZCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXR1cy50ZXh0Q29udGVudCA9ICdcdTI3NEMgJyArIChkYXRhLmVycm9yIHx8ICdWYWxpZGF0aW9uIGZhaWxlZCcpO1xuICAgICAgc3RhdHVzLnN0eWxlLmNvbG9yID0gJyNkYzI2MjYnO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgc3RhdHVzLnRleHRDb250ZW50ID0gJ1x1Mjc0QyAnICsgZXJyLm1lc3NhZ2U7XG4gICAgc3RhdHVzLnN0eWxlLmNvbG9yID0gJyNkYzI2MjYnO1xuICB9XG59XG5cbi8qKiBTYXZlIHJhdyBCaWJUZVggKHZhbGlkYXRlcyBzZXJ2ZXItc2lkZSBiZWZvcmUgd3JpdGluZykuICovXG5hc3luYyBmdW5jdGlvbiBzYXZlUHVibGljYXRpb25zQmliKCkge1xuICBjb25zdCB0YSAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi10ZXh0YXJlYScpO1xuICBjb25zdCBzdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1zdGF0dXMnKTtcbiAgY29uc3QgYnRuICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItc2F2ZS1idG4nKTtcbiAgaWYgKCF0YSkgcmV0dXJuO1xuICBjb25zdCBjb250ZW50ID0gdGEudmFsdWU7XG4gIGlmIChidG4pIHsgYnRuLmRpc2FibGVkID0gdHJ1ZTsgYnRuLnRleHRDb250ZW50ID0gJ1x1MjNGMyBTYXZpbmdcdTIwMjYnOyB9XG4gIGlmIChzdGF0dXMpIHsgc3RhdHVzLnRleHRDb250ZW50ID0gJyc7IHN0YXR1cy5zdHlsZS5jb2xvciA9ICcjNmI3MjgwJzsgfVxuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS9wdWJsaWNhdGlvbnMnLCB7XG4gICAgICBtZXRob2Q6ICAnUFVUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogICAgSlNPTi5zdHJpbmdpZnkoeyBjb250ZW50IH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBjb25zdCBuID0gZGF0YS5jb3VudCA/PyAwO1xuICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICBzdGF0dXMudGV4dENvbnRlbnQgPSBgXHUyNzA1IFNhdmVkIFx1MjAxNCAke259IGVudHIke24gIT09IDEgPyAnaWVzJyA6ICd5J30gcGFyc2VkLmA7XG4gICAgICAgIHN0YXR1cy5zdHlsZS5jb2xvciA9ICcjMTU4MDNkJztcbiAgICAgIH1cbiAgICAgIF91cGRhdGVQdWJDb3VudChuKTtcbiAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ1B1YmxpY2F0aW9ucycsICd1cGRhdGVkJyk7XG4gICAgICAvLyBSZWZyZXNoIENSVUQgbGlzdCB0byBzdGF5IGluIHN5bmNcbiAgICAgIGF3YWl0IGxvYWRQdWJsaWNhdGlvbnMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICBzdGF0dXMudGV4dENvbnRlbnQgPSAnXHUyNzRDICcgKyAoZGF0YS5lcnJvciB8fCAnU2F2ZSBmYWlsZWQnKTtcbiAgICAgICAgc3RhdHVzLnN0eWxlLmNvbG9yID0gJyNkYzI2MjYnO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKHN0YXR1cykge1xuICAgICAgc3RhdHVzLnRleHRDb250ZW50ID0gJ1x1Mjc0QyAnICsgZXJyLm1lc3NhZ2U7XG4gICAgICBzdGF0dXMuc3R5bGUuY29sb3IgPSAnI2RjMjYyNic7XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIGlmIChidG4pIHsgYnRuLmRpc2FibGVkID0gZmFsc2U7IGJ0bi50ZXh0Q29udGVudCA9ICdcdUQ4M0RcdURDQkUgU2F2ZSc7IH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzaG93SW1wb3J0UHVibGljYXRpb25zTW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWltcG9ydC10ZXh0YXJlYScpLnZhbHVlID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWltcG9ydC1vdmVyd3JpdGUnKS5jaGVja2VkID0gZmFsc2U7XG4gIF9zZXRQdWJsaWNhdGlvblN0YXR1cygnbWFzdGVyLXB1Yi1pbXBvcnQtc3RhdHVzJywgJycpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1pbXBvcnQtbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgc2V0SW5pdGlhbEZvY3VzKCdtYXN0ZXItcHViLWltcG9ydC1tb2RhbC1vdmVybGF5Jyk7XG4gIHRyYXBGb2N1cygnbWFzdGVyLXB1Yi1pbXBvcnQtbW9kYWwtb3ZlcmxheScpO1xufVxuXG5mdW5jdGlvbiBjbG9zZUltcG9ydFB1YmxpY2F0aW9uc01vZGFsKCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1pbXBvcnQtbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHJlc3RvcmVGb2N1cygpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBpbXBvcnRQdWJsaWNhdGlvbnNCaWIoKSB7XG4gIGNvbnN0IHRleHRhcmVhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItaW1wb3J0LXRleHRhcmVhJyk7XG4gIGNvbnN0IG92ZXJ3cml0ZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWltcG9ydC1vdmVyd3JpdGUnKTtcbiAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItaW1wb3J0LXN1Ym1pdC1idG4nKTtcbiAgaWYgKCF0ZXh0YXJlYSkgcmV0dXJuO1xuICBjb25zdCBiaWJ0ZXhUZXh0ID0gdGV4dGFyZWEudmFsdWUudHJpbSgpO1xuICBpZiAoIWJpYnRleFRleHQpIHtcbiAgICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItaW1wb3J0LXN0YXR1cycsICdcdTI2QTBcdUZFMEYgUGFzdGUgQmliVGVYIGVudHJpZXMgdG8gaW1wb3J0LicsICcjZGMyNjI2Jyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChidXR0b24pIHtcbiAgICBidXR0b24uZGlzYWJsZWQgPSB0cnVlO1xuICAgIGJ1dHRvbi50ZXh0Q29udGVudCA9ICdcdTIzRjMgSW1wb3J0aW5nXHUyMDI2JztcbiAgfVxuICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItaW1wb3J0LXN0YXR1cycsICdJbXBvcnRpbmcgQmliVGVYXHUyMDI2Jyk7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvcHVibGljYXRpb25zL2ltcG9ydCcsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGJpYnRleF90ZXh0OiBiaWJ0ZXhUZXh0LFxuICAgICAgICBvdmVyd3JpdGU6IEJvb2xlYW4ob3ZlcndyaXRlPy5jaGVja2VkKSxcbiAgICAgIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBjb25zdCBwYXJ0cyA9IFtcbiAgICAgICAgYCR7ZGF0YS5hZGRlZCB8fCAwfSBhZGRlZGAsXG4gICAgICAgIGAke2RhdGEudXBkYXRlZCB8fCAwfSB1cGRhdGVkYCxcbiAgICAgICAgYCR7ZGF0YS5za2lwcGVkIHx8IDB9IHNraXBwZWRgLFxuICAgICAgXTtcbiAgICAgIGlmIChkYXRhLmludmFsaWQpIHBhcnRzLnB1c2goYCR7ZGF0YS5pbnZhbGlkfSByZWplY3RlZCAobWlzc2luZyByZXF1aXJlZCBmaWVsZHMpYCk7XG4gICAgICBjb25zdCBza2lwcGVkRGV0YWlsID0gKGRhdGEuc2tpcHBlZF9rZXlzPy5sZW5ndGgpXG4gICAgICAgID8gYFxcblxcblNraXBwZWQgKGFscmVhZHkgZXhpc3QgXHUyMDE0IGVuYWJsZSBcIk92ZXJ3cml0ZVwiIHRvIHVwZGF0ZSk6XFxuXHUyMDIyICR7ZGF0YS5za2lwcGVkX2tleXMuam9pbignXFxuXHUyMDIyICcpfWBcbiAgICAgICAgOiAnJztcbiAgICAgIGNvbnN0IGludmFsaWREZXRhaWwgPSAoZGF0YS5pbnZhbGlkX2tleXM/Lmxlbmd0aClcbiAgICAgICAgPyBgXFxuXFxuUmVqZWN0ZWQgKG1pc3NpbmcgdGl0bGUsIHllYXIsIG9yIGF1dGhvcik6XFxuXHUyMDIyICR7ZGF0YS5pbnZhbGlkX2tleXMuam9pbignXFxuXHUyMDIyICcpfWBcbiAgICAgICAgOiAnJztcbiAgICAgIF9zZXRQdWJsaWNhdGlvblN0YXR1cygnbWFzdGVyLXB1Yi1pbXBvcnQtc3RhdHVzJywgYFx1MjcwNSBJbXBvcnRlZDogJHtwYXJ0cy5qb2luKCcsICcpfS5gLCAnIzE1ODAzZCcpO1xuICAgICAgX3NldE1hc3RlckNoYW5nZU5vdGljZSgnUHVibGljYXRpb25zJywgJ2ltcG9ydGVkJyk7XG4gICAgICBhd2FpdCBsb2FkUHVibGljYXRpb25zKCk7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzA1IEltcG9ydGVkJywgYEltcG9ydGVkIEJpYlRlWCBlbnRyaWVzOiAke3BhcnRzLmpvaW4oJywgJyl9LiR7c2tpcHBlZERldGFpbH0ke2ludmFsaWREZXRhaWx9YCk7XG4gICAgICBjbG9zZUltcG9ydFB1YmxpY2F0aW9uc01vZGFsKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIF9zZXRQdWJsaWNhdGlvblN0YXR1cygnbWFzdGVyLXB1Yi1pbXBvcnQtc3RhdHVzJywgYFx1Mjc0QyAke2RhdGEuZXJyb3IgfHwgJ0ltcG9ydCBmYWlsZWQnfWAsICcjZGMyNjI2Jyk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItaW1wb3J0LXN0YXR1cycsIGBcdTI3NEMgJHtlcnIubWVzc2FnZX1gLCAnI2RjMjYyNicpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChidXR0b24pIHtcbiAgICAgIGJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgYnV0dG9uLnRleHRDb250ZW50ID0gJ0ltcG9ydCc7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNob3dDb252ZXJ0UHVibGljYXRpb25zTW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNvbnZlcnQtaW5wdXQnKS52YWx1ZSA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1jb252ZXJ0LW91dHB1dCcpLnZhbHVlID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNvbnZlcnQtb3ZlcndyaXRlJykuY2hlY2tlZCA9IGZhbHNlO1xuICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItY29udmVydC1zdGF0dXMnLCAnJyk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNvbnZlcnQtbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgc2V0SW5pdGlhbEZvY3VzKCdtYXN0ZXItcHViLWNvbnZlcnQtbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ21hc3Rlci1wdWItY29udmVydC1tb2RhbC1vdmVybGF5Jyk7XG59XG5cbmZ1bmN0aW9uIGNsb3NlQ29udmVydFB1YmxpY2F0aW9uc01vZGFsKCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1jb252ZXJ0LW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICByZXN0b3JlRm9jdXMoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29udmVydFB1YmxpY2F0aW9uVGV4dCgpIHtcbiAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1jb252ZXJ0LWlucHV0Jyk7XG4gIGNvbnN0IG91dHB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNvbnZlcnQtb3V0cHV0Jyk7XG4gIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNvbnZlcnQtc3VibWl0LWJ0bicpO1xuICBpZiAoIWlucHV0IHx8ICFvdXRwdXQpIHJldHVybjtcbiAgY29uc3QgdGV4dCA9IGlucHV0LnZhbHVlLnRyaW0oKTtcbiAgaWYgKCF0ZXh0KSB7XG4gICAgX3NldFB1YmxpY2F0aW9uU3RhdHVzKCdtYXN0ZXItcHViLWNvbnZlcnQtc3RhdHVzJywgJ1x1MjZBMFx1RkUwRiBQYXN0ZSBjaXRhdGlvbiB0ZXh0IHRvIGNvbnZlcnQuJywgJyNkYzI2MjYnKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGJ1dHRvbikge1xuICAgIGJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7XG4gICAgYnV0dG9uLnRleHRDb250ZW50ID0gJ1x1MjNGMyBHZW5lcmF0aW5nXHUyMDI2JztcbiAgfVxuICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItY29udmVydC1zdGF0dXMnLCAnR2VuZXJhdGluZyBCaWJUZVggcHJldmlld1x1MjAyNicpO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL3B1YmxpY2F0aW9ucy9jb252ZXJ0Jywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgdGV4dCB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgb3V0cHV0LnZhbHVlID0gZGF0YS5iaWJ0ZXggfHwgJyc7XG4gICAgICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItY29udmVydC1zdGF0dXMnLCAnXHUyNzA1IFJldmlldyB0aGUgZ2VuZXJhdGVkIEJpYlRlWCwgdGhlbiBpbXBvcnQgaXQgaWYgaXQgbG9va3MgY29ycmVjdC4nLCAnIzE1ODAzZCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItY29udmVydC1zdGF0dXMnLCBgXHUyNzRDICR7ZGF0YS5lcnJvciB8fCAnQ29udmVyc2lvbiBmYWlsZWQnfWAsICcjZGMyNjI2Jyk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItY29udmVydC1zdGF0dXMnLCBgXHUyNzRDICR7ZXJyLm1lc3NhZ2V9YCwgJyNkYzI2MjYnKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoYnV0dG9uKSB7XG4gICAgICBidXR0b24uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIGJ1dHRvbi50ZXh0Q29udGVudCA9ICdHZW5lcmF0ZSBCaWJUZVgnO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBpbXBvcnRDb252ZXJ0ZWRQdWJsaWNhdGlvblRleHQoKSB7XG4gIGNvbnN0IG91dHB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNvbnZlcnQtb3V0cHV0Jyk7XG4gIGNvbnN0IG92ZXJ3cml0ZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNvbnZlcnQtb3ZlcndyaXRlJyk7XG4gIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNvbnZlcnQtaW1wb3J0LWJ0bicpO1xuICBpZiAoIW91dHB1dCkgcmV0dXJuO1xuICBjb25zdCBiaWJ0ZXhUZXh0ID0gb3V0cHV0LnZhbHVlLnRyaW0oKTtcbiAgaWYgKCFiaWJ0ZXhUZXh0KSB7XG4gICAgX3NldFB1YmxpY2F0aW9uU3RhdHVzKCdtYXN0ZXItcHViLWNvbnZlcnQtc3RhdHVzJywgJ1x1MjZBMFx1RkUwRiBHZW5lcmF0ZSBvciBlZGl0IEJpYlRlWCBiZWZvcmUgaW1wb3J0aW5nLicsICcjZGMyNjI2Jyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChidXR0b24pIHtcbiAgICBidXR0b24uZGlzYWJsZWQgPSB0cnVlO1xuICAgIGJ1dHRvbi50ZXh0Q29udGVudCA9ICdcdTIzRjMgSW1wb3J0aW5nXHUyMDI2JztcbiAgfVxuICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItY29udmVydC1zdGF0dXMnLCAnSW1wb3J0aW5nIHJldmlld2VkIEJpYlRlWFx1MjAyNicpO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL3B1YmxpY2F0aW9ucy9pbXBvcnQnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBiaWJ0ZXhfdGV4dDogYmlidGV4VGV4dCxcbiAgICAgICAgb3ZlcndyaXRlOiBCb29sZWFuKG92ZXJ3cml0ZT8uY2hlY2tlZCksXG4gICAgICB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgY29uc3QgcGFydHMgPSBbXG4gICAgICAgIGAke2RhdGEuYWRkZWQgfHwgMH0gYWRkZWRgLFxuICAgICAgICBgJHtkYXRhLnVwZGF0ZWQgfHwgMH0gdXBkYXRlZGAsXG4gICAgICAgIGAke2RhdGEuc2tpcHBlZCB8fCAwfSBza2lwcGVkYCxcbiAgICAgIF07XG4gICAgICBpZiAoZGF0YS5pbnZhbGlkKSBwYXJ0cy5wdXNoKGAke2RhdGEuaW52YWxpZH0gcmVqZWN0ZWQgKG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzKWApO1xuICAgICAgY29uc3Qgc2tpcHBlZERldGFpbCA9IChkYXRhLnNraXBwZWRfa2V5cz8ubGVuZ3RoKVxuICAgICAgICA/IGBcXG5cXG5Ta2lwcGVkIChhbHJlYWR5IGV4aXN0IFx1MjAxNCBlbmFibGUgXCJPdmVyd3JpdGVcIiB0byB1cGRhdGUpOlxcblx1MjAyMiAke2RhdGEuc2tpcHBlZF9rZXlzLmpvaW4oJ1xcblx1MjAyMiAnKX1gXG4gICAgICAgIDogJyc7XG4gICAgICBjb25zdCBpbnZhbGlkRGV0YWlsID0gKGRhdGEuaW52YWxpZF9rZXlzPy5sZW5ndGgpXG4gICAgICAgID8gYFxcblxcblJlamVjdGVkIChtaXNzaW5nIHRpdGxlLCB5ZWFyLCBvciBhdXRob3IpOlxcblx1MjAyMiAke2RhdGEuaW52YWxpZF9rZXlzLmpvaW4oJ1xcblx1MjAyMiAnKX1gXG4gICAgICAgIDogJyc7XG4gICAgICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItY29udmVydC1zdGF0dXMnLCBgXHUyNzA1IEltcG9ydGVkIHByZXZpZXc6ICR7cGFydHMuam9pbignLCAnKX0uYCwgJyMxNTgwM2QnKTtcbiAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ1B1YmxpY2F0aW9ucycsICdpbXBvcnRlZCcpO1xuICAgICAgYXdhaXQgbG9hZFB1YmxpY2F0aW9ucygpO1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjcwNSBJbXBvcnRlZCcsIGBJbXBvcnRlZCBnZW5lcmF0ZWQgQmliVGVYOiAke3BhcnRzLmpvaW4oJywgJyl9LiR7c2tpcHBlZERldGFpbH0ke2ludmFsaWREZXRhaWx9YCk7XG4gICAgICBjbG9zZUNvbnZlcnRQdWJsaWNhdGlvbnNNb2RhbCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItY29udmVydC1zdGF0dXMnLCBgXHUyNzRDICR7ZGF0YS5lcnJvciB8fCAnSW1wb3J0IGZhaWxlZCd9YCwgJyNkYzI2MjYnKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIF9zZXRQdWJsaWNhdGlvblN0YXR1cygnbWFzdGVyLXB1Yi1jb252ZXJ0LXN0YXR1cycsIGBcdTI3NEMgJHtlcnIubWVzc2FnZX1gLCAnI2RjMjYyNicpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChidXR0b24pIHtcbiAgICAgIGJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgYnV0dG9uLnRleHRDb250ZW50ID0gJ0ltcG9ydCBQcmV2aWV3JztcbiAgICB9XG4gIH1cbn1cblxuLy8gLS0tLSBQdWJsaWNhdGlvbiBhZGQvZWRpdCBtb2RhbCAtLS0tXG5cbmZ1bmN0aW9uIHNob3dBZGRQdWJsaWNhdGlvbk1vZGFsKCkge1xuICBfcHViTW9kYWxVc2VzRWRpdG9yRmllbGQgPSBmYWxzZTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1rZXknKS52YWx1ZSAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLW1vZGFsLXR5cGUnKS52YWx1ZSAgID0gJ2FydGljbGUnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLW1vZGFsLWF1dGhvcicpLnZhbHVlID0gJyc7XG4gIGNvbnN0IGF1dGhvckxhYmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1hdXRob3ItbGFiZWwnKTtcbiAgaWYgKGF1dGhvckxhYmVsKSBhdXRob3JMYWJlbC50ZXh0Q29udGVudCA9ICdBdXRob3IocyknO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLW1vZGFsLXRpdGxlJykudmFsdWUgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWItbW9kYWwteWVhcicpLnZhbHVlICAgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1qb3VybmFsJykudmFsdWUgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1kb2knKS52YWx1ZSAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLW1vZGFsLWV4dHJhJykudmFsdWUgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWItbW9kYWwta2V5JykuZGlzYWJsZWQgPSBmYWxzZTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC10aXRsZS1oZWFkaW5nJykudGV4dENvbnRlbnQgPSAnQWRkIFB1YmxpY2F0aW9uJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgc2V0SW5pdGlhbEZvY3VzKCdtYXN0ZXItcHViLW1vZGFsLW92ZXJsYXknKTtcbiAgdHJhcEZvY3VzKCdtYXN0ZXItcHViLW1vZGFsLW92ZXJsYXknKTtcbn1cblxuZnVuY3Rpb24gZWRpdE1hc3RlclB1YmxpY2F0aW9uKHB1Yikge1xuICBjb25zdCBmaWVsZHMgPSBwdWIuZmllbGRzIHx8IHt9O1xuICAvLyBUcmFjayB3aGV0aGVyIHRoaXMgZW50cnkgdXNlcyBgZWRpdG9yYCBzbyB3ZSBwcmVzZXJ2ZSBpdCBvbiBzYXZlXG4gIF9wdWJNb2RhbFVzZXNFZGl0b3JGaWVsZCA9ICFmaWVsZHMuYXV0aG9yICYmICEhZmllbGRzLmVkaXRvcjtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1rZXknKS52YWx1ZSAgICAgPSBwdWIua2V5IHx8ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLW1vZGFsLXR5cGUnKS52YWx1ZSAgICA9IHB1Yi50eXBlIHx8ICdhcnRpY2xlJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1hdXRob3InKS52YWx1ZSAgPSBmaWVsZHMuYXV0aG9yIHx8IGZpZWxkcy5lZGl0b3IgfHwgJyc7XG4gIC8vIFVwZGF0ZSB0aGUgQXV0aG9yL0VkaXRvciBsYWJlbCBzbyB0aGUgdXNlciBrbm93cyB3aGljaCBmaWVsZCBpcyBiZWluZyBlZGl0ZWRcbiAgY29uc3QgYXV0aG9yTGFiZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLW1vZGFsLWF1dGhvci1sYWJlbCcpO1xuICBpZiAoYXV0aG9yTGFiZWwpIGF1dGhvckxhYmVsLnRleHRDb250ZW50ID0gX3B1Yk1vZGFsVXNlc0VkaXRvckZpZWxkID8gJ0VkaXRvcihzKScgOiAnQXV0aG9yKHMpJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC10aXRsZScpLnZhbHVlICAgPSBmaWVsZHMudGl0bGUgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWItbW9kYWwteWVhcicpLnZhbHVlICAgID0gZmllbGRzLnllYXIgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWItbW9kYWwtam91cm5hbCcpLnZhbHVlID0gZmllbGRzLmpvdXJuYWwgfHwgZmllbGRzLmJvb2t0aXRsZSB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1kb2knKS52YWx1ZSAgICAgPSBmaWVsZHMuZG9pIHx8ICcnO1xuICAvLyBFeHRyYTogcmVtYWluaW5nIG5vbi1zdGFuZGFyZCBmaWVsZHMgYXMga2V5PXZhbHVlIGxpbmVzXG4gIGNvbnN0IGtub3duID0gbmV3IFNldChbJ2F1dGhvcicsJ2VkaXRvcicsJ3RpdGxlJywneWVhcicsJ2pvdXJuYWwnLCdib29rdGl0bGUnLCdkb2knXSk7XG4gIGNvbnN0IGV4dHJhID0gT2JqZWN0LmVudHJpZXMoZmllbGRzKVxuICAgIC5maWx0ZXIoKFtrXSkgPT4gIWtub3duLmhhcyhrKSlcbiAgICAubWFwKChbaywgdl0pID0+IGAke2t9PSR7dn1gKVxuICAgIC5qb2luKCdcXG4nKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1leHRyYScpLnZhbHVlICAgPSBleHRyYTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1rZXknKS5kaXNhYmxlZCAgPSB0cnVlOyAgLy8ga2V5IGlzIGltbXV0YWJsZSBvbiBlZGl0XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWItbW9kYWwtdGl0bGUtaGVhZGluZycpLnRleHRDb250ZW50ID0gJ0VkaXQgUHVibGljYXRpb24nO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBzZXRJbml0aWFsRm9jdXMoJ21hc3Rlci1wdWItbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ21hc3Rlci1wdWItbW9kYWwtb3ZlcmxheScpO1xufVxuXG5mdW5jdGlvbiBjbG9zZVB1YmxpY2F0aW9uTW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICByZXN0b3JlRm9jdXMoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZU1hc3RlclB1YmxpY2F0aW9uKCkge1xuICBjb25zdCBrZXlFbCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLW1vZGFsLWtleScpO1xuICBjb25zdCBrZXkgICAgPSBrZXlFbC52YWx1ZS50cmltKCk7XG4gIGNvbnN0IGFjdGlvbiA9IGtleUVsLmRpc2FibGVkID8gJ3VwZGF0ZScgOiAnYWRkJztcbiAgaWYgKCFrZXkpIHsgc2hvd0FsZXJ0TW9kYWwoJ1x1MjZBMFx1RkUwRiBWYWxpZGF0aW9uJywgJ0NpdGUga2V5IGlzIHJlcXVpcmVkLicpOyByZXR1cm47IH1cbiAgY29uc3QgdHlwZSAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC10eXBlJykudmFsdWUudHJpbSgpIHx8ICdhcnRpY2xlJztcbiAgY29uc3QgYXV0aG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1hdXRob3InKS52YWx1ZS50cmltKCk7XG4gIGNvbnN0IHRpdGxlICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWItbW9kYWwtdGl0bGUnKS52YWx1ZS50cmltKCk7XG4gIGNvbnN0IHllYXIgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWItbW9kYWwteWVhcicpLnZhbHVlLnRyaW0oKTtcbiAgaWYgKCF0aXRsZSkgIHsgc2hvd0FsZXJ0TW9kYWwoJ1x1MjZBMFx1RkUwRiBWYWxpZGF0aW9uJywgJ1RpdGxlIGlzIHJlcXVpcmVkLicpOyByZXR1cm47IH1cbiAgaWYgKCF5ZWFyKSAgIHsgc2hvd0FsZXJ0TW9kYWwoJ1x1MjZBMFx1RkUwRiBWYWxpZGF0aW9uJywgJ1llYXIgaXMgcmVxdWlyZWQuJyk7IHJldHVybjsgfVxuICBpZiAoIWF1dGhvcikgeyBzaG93QWxlcnRNb2RhbCgnXHUyNkEwXHVGRTBGIFZhbGlkYXRpb24nLCAnQXV0aG9yIG9yIGVkaXRvciBpcyByZXF1aXJlZC4nKTsgcmV0dXJuOyB9XG4gIC8vIFByZXNlcnZlIHRoZSBvcmlnaW5hbCBmaWVsZCBuYW1lOiBlZGl0b3IgZW50cmllcyBtdXN0IG5vdCBiZSBzYXZlZCBhcyBhdXRob3JcbiAgY29uc3QgZmllbGRzID0gX3B1Yk1vZGFsVXNlc0VkaXRvckZpZWxkID8geyBlZGl0b3I6IGF1dGhvciwgdGl0bGUsIHllYXIgfSA6IHsgYXV0aG9yLCB0aXRsZSwgeWVhciB9O1xuICBjb25zdCBqb3VybmFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1qb3VybmFsJykudmFsdWUudHJpbSgpO1xuICBpZiAoam91cm5hbCkge1xuICAgIGZpZWxkc1t0eXBlID09PSAnaW5wcm9jZWVkaW5ncycgPyAnYm9va3RpdGxlJyA6ICdqb3VybmFsJ10gPSBqb3VybmFsO1xuICB9XG4gIGNvbnN0IGRvaSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWItbW9kYWwtZG9pJykudmFsdWUudHJpbSgpO1xuICBpZiAoZG9pKSBmaWVsZHMuZG9pID0gZG9pO1xuICAvLyBQYXJzZSBleHRyYSBmaWVsZHMgKGtleT12YWx1ZSBwZXIgbGluZSlcbiAgY29uc3QgZXh0cmEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLW1vZGFsLWV4dHJhJykudmFsdWU7XG4gIGZvciAoY29uc3QgbGluZSBvZiBleHRyYS5zcGxpdCgnXFxuJykpIHtcbiAgICBjb25zdCBlcSA9IGxpbmUuaW5kZXhPZignPScpO1xuICAgIGlmIChlcSA+IDApIHtcbiAgICAgIGNvbnN0IGsgPSBsaW5lLnNsaWNlKDAsIGVxKS50cmltKCk7XG4gICAgICBjb25zdCB2ID0gbGluZS5zbGljZShlcSArIDEpLnRyaW0oKTtcbiAgICAgIGlmIChrICYmIHYpIGZpZWxkc1trXSA9IHY7XG4gICAgfVxuICB9XG4gIGNvbnN0IGJvZHkgPSB7IGFjdGlvbiwga2V5LCB0eXBlLCBmaWVsZHMgfTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvcHVibGljYXRpb24nLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBjbG9zZVB1YmxpY2F0aW9uTW9kYWwoKTtcbiAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ1B1YmxpY2F0aW9ucycsIGRhdGEuYWN0aW9uIHx8ICd1cGRhdGVkJyk7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzA1IFNhdmVkJywgYFB1YmxpY2F0aW9uIFwiJHtrZXl9XCIgJHtkYXRhLmFjdGlvbn0uYCk7XG4gICAgICBhd2FpdCBsb2FkUHVibGljYXRpb25zKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCBkYXRhLmVycm9yIHx8ICdTYXZlIGZhaWxlZCcpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIHNhdmUgcHVibGljYXRpb24nKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVNYXN0ZXJQdWJsaWNhdGlvbihrZXkpIHtcbiAgc2hvd0NvbmZpcm1Nb2RhbChcbiAgICAnXHVEODNEXHVEREQxXHVGRTBGIERlbGV0ZSBQdWJsaWNhdGlvbicsXG4gICAgYERlbGV0ZSBcIiR7a2V5fVwiPyBUaGlzIGNhbm5vdCBiZSB1bmRvbmUuYCxcbiAgICBhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvcHVibGljYXRpb24nLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgYWN0aW9uOiAnZGVsZXRlJywga2V5IH0pLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICAgICAgX3NldE1hc3RlckNoYW5nZU5vdGljZSgnUHVibGljYXRpb25zJywgJ2RlbGV0ZWQnKTtcbiAgICAgICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzA1IERlbGV0ZWQnLCBgUHVibGljYXRpb24gXCIke2tleX1cIiByZW1vdmVkLmApO1xuICAgICAgICAgIGF3YWl0IGxvYWRQdWJsaWNhdGlvbnMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgZGF0YS5lcnJvciB8fCAnRGVsZXRlIGZhaWxlZCcpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIGRlbGV0ZSBwdWJsaWNhdGlvbicpO1xuICAgICAgfVxuICAgIH1cbiAgKTtcbn1cblxuZnVuY3Rpb24gX3JlbmRlckF3YXJkc0xpc3QoYXdhcmRzKSB7XG4gIGlmICghYXdhcmRzLmxlbmd0aCkge1xuICAgIHJldHVybiAnPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO3BhZGRpbmc6MTJweCAwO1wiPk5vIGF3YXJkcyBvbiBmaWxlLiBDbGljayBcIisgQWRkIEF3YXJkXCIgYWJvdmUuPC9wPic7XG4gIH1cbiAgY29uc3Qgcm93cyA9IGF3YXJkcy5tYXAoKGF3YXJkLCBpZHgpID0+IHtcbiAgICBjb25zdCB0aXRsZSA9IGVzY2FwZUh0bWwoYXdhcmQudGl0bGUgfHwgJycpO1xuICAgIGNvbnN0IHllYXIgID0gYXdhcmQueWVhciA/IFN0cmluZyhhd2FyZC55ZWFyKSA6ICdcdTIwMTQnO1xuICAgIGNvbnN0IGRlc2MgID0gZXNjYXBlSHRtbCgoYXdhcmQuZGVzY3JpcHRpb24gfHwgJycpLnNsaWNlKDAsIDEwMCkpO1xuICAgIGNvbnN0IGF3YXJkSnNvbiA9IGVzY2FwZUh0bWwoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgdGl0bGU6IGF3YXJkLnRpdGxlIHx8ICcnLCB5ZWFyOiBhd2FyZC55ZWFyIHx8ICcnLFxuICAgICAgZGVzY3JpcHRpb246IGF3YXJkLmRlc2NyaXB0aW9uIHx8ICcnLFxuICAgICAgcmVsZXZhbnRfZm9yOiAoYXdhcmQucmVsZXZhbnRfZm9yIHx8IFtdKS5qb2luKCcsICcpLFxuICAgIH0pKTtcbiAgICByZXR1cm4gYFxuICAgICAgPHRyPlxuICAgICAgICA8dGQ+XG4gICAgICAgICAgPHN0cm9uZz4ke3RpdGxlfTwvc3Ryb25nPlxuICAgICAgICAgICR7ZGVzYyA/IGA8YnI+PHNtYWxsIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtcIj4ke2Rlc2N9JHsoYXdhcmQuZGVzY3JpcHRpb258fCcnKS5sZW5ndGggPiAxMDAgPyAnXHUyMDI2JyA6ICcnfTwvc21hbGw+YCA6ICcnfVxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjtjb2xvcjojNDc1NTY5O1wiPiR7eWVhcn08L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJhY3Rpb24tYnRuc1wiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIG9uY2xpY2s9XCJlZGl0TWFzdGVyQXdhcmQoJHthd2FyZEpzb259LCAke2lkeH0pXCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkVkaXQgYXdhcmQ6ICR7dGl0bGV9XCIgdGl0bGU9XCJFZGl0XCI+XHUyNzBGXHVGRTBGPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgb25jbGljaz1cImRlbGV0ZU1hc3RlckF3YXJkKCR7aWR4fSwgJyR7dGl0bGV9JylcIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiRGVsZXRlIGF3YXJkOiAke3RpdGxlfVwiIHRpdGxlPVwiRGVsZXRlXCI+XHVEODNEXHVEREQxXHVGRTBGPC9idXR0b24+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L3RyPmA7XG4gIH0pLmpvaW4oJycpO1xuICByZXR1cm4gYFxuICAgIDx0YWJsZSBjbGFzcz1cInJldmlldy10YWJsZVwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIj5cbiAgICAgIDx0aGVhZD5cbiAgICAgICAgPHRyPlxuICAgICAgICAgIDx0aD5Bd2FyZDwvdGg+XG4gICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6NzBweDt0ZXh0LWFsaWduOmNlbnRlcjtcIj5ZZWFyPC90aD5cbiAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDo4MHB4O1wiPkFjdGlvbnM8L3RoPlxuICAgICAgICA8L3RyPlxuICAgICAgPC90aGVhZD5cbiAgICAgIDx0Ym9keT4ke3Jvd3N9PC90Ym9keT5cbiAgICA8L3RhYmxlPmA7XG59XG5cblxuZnVuY3Rpb24gX3JlbmRlckNlcnRpZmljYXRpb25zTGlzdChjZXJ0cykge1xuICBpZiAoIWNlcnRzLmxlbmd0aCkge1xuICAgIHJldHVybiAnPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO3BhZGRpbmc6MTJweCAwO1wiPk5vIGNlcnRpZmljYXRpb25zIG9uIGZpbGUuIENsaWNrIFwiKyBBZGQgQ2VydGlmaWNhdGlvblwiIGFib3ZlLjwvcD4nO1xuICB9XG4gIGNvbnN0IHJvd3MgPSBjZXJ0cy5tYXAoKGNlcnQsIGlkeCkgPT4ge1xuICAgIGNvbnN0IG5hbWUgICA9IGVzY2FwZUh0bWwoY2VydC5uYW1lIHx8ICcnKTtcbiAgICBjb25zdCBpc3N1ZXIgPSBlc2NhcGVIdG1sKGNlcnQuaXNzdWVyIHx8ICdcdTIwMTQnKTtcbiAgICBjb25zdCB5ZWFyICAgPSBjZXJ0LnllYXIgPyBTdHJpbmcoY2VydC55ZWFyKSA6ICdcdTIwMTQnO1xuICAgIGNvbnN0IGNlcnRKc29uID0gZXNjYXBlSHRtbChKU09OLnN0cmluZ2lmeSh7XG4gICAgICBuYW1lOiBjZXJ0Lm5hbWUgfHwgJycsIGlzc3VlcjogY2VydC5pc3N1ZXIgfHwgJycsIHllYXI6IGNlcnQueWVhciB8fCAnJyxcbiAgICB9KSk7XG4gICAgcmV0dXJuIGBcbiAgICAgIDx0cj5cbiAgICAgICAgPHRkPjxzdHJvbmc+JHtuYW1lfTwvc3Ryb25nPjwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cImNvbG9yOiM0NzU1Njk7XCI+JHtpc3N1ZXJ9PC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7Y29sb3I6IzQ3NTU2OTtcIj4ke3llYXJ9PC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwiYWN0aW9uLWJ0bnNcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBvbmNsaWNrPVwiZWRpdE1hc3RlckNlcnRpZmljYXRpb24oJHtjZXJ0SnNvbn0sICR7aWR4fSlcIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiRWRpdCBjZXJ0aWZpY2F0aW9uOiAke25hbWV9XCIgdGl0bGU9XCJFZGl0XCI+XHUyNzBGXHVGRTBGPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgb25jbGljaz1cImRlbGV0ZU1hc3RlckNlcnRpZmljYXRpb24oJHtpZHh9LCAnJHtuYW1lfScpXCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkRlbGV0ZSBjZXJ0aWZpY2F0aW9uOiAke25hbWV9XCIgdGl0bGU9XCJEZWxldGVcIj5cdUQ4M0RcdURERDFcdUZFMEY8L2J1dHRvbj5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvdHI+YDtcbiAgfSkuam9pbignJyk7XG4gIHJldHVybiBgXG4gICAgPHRhYmxlIGNsYXNzPVwicmV2aWV3LXRhYmxlXCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiPlxuICAgICAgPHRoZWFkPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRoPk5hbWU8L3RoPlxuICAgICAgICAgIDx0aD5Jc3N1ZXI8L3RoPlxuICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOjcwcHg7dGV4dC1hbGlnbjpjZW50ZXI7XCI+WWVhcjwvdGg+XG4gICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6ODBweDtcIj5BY3Rpb25zPC90aD5cbiAgICAgICAgPC90cj5cbiAgICAgIDwvdGhlYWQ+XG4gICAgICA8dGJvZHk+JHtyb3dzfTwvdGJvZHk+XG4gICAgPC90YWJsZT5gO1xufVxuXG5cbmZ1bmN0aW9uIF9yZW5kZXJNYXN0ZXJBY2hpZXZlbWVudHNUYWJsZShhY2hpZXZlbWVudHMpIHtcbiAgaWYgKCFhY2hpZXZlbWVudHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuICc8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7cGFkZGluZzoxMnB4IDA7XCI+Tm8gc2VsZWN0ZWQgYWNoaWV2ZW1lbnRzIHlldC4gVXNlIHRoZSBIYXJ2ZXN0IGZlYXR1cmUgdG8gYWRkIGFjaGlldmVtZW50cyBmcm9tIGEgY29tcGxldGVkIHNlc3Npb24sIG9yIGNsaWNrIFwiKyBBZGQgQWNoaWV2ZW1lbnRcIiBhYm92ZS48L3A+JztcbiAgfVxuICBsZXQgcm93cyA9IGFjaGlldmVtZW50cy5tYXAoYWNoID0+IHtcbiAgICBjb25zdCBpZCAgICAgID0gZXNjYXBlSHRtbChhY2guaWQgfHwgJycpO1xuICAgIGNvbnN0IHRpdGxlICAgPSBlc2NhcGVIdG1sKGFjaC50aXRsZSB8fCAnJyk7XG4gICAgY29uc3QgZGVzYyAgICA9IGVzY2FwZUh0bWwoKGFjaC5kZXNjcmlwdGlvbiB8fCAnJykuc2xpY2UoMCwgMTAwKSk7XG4gICAgY29uc3QgaW1wICAgICA9IGFjaC5pbXBvcnRhbmNlID8/ICdcdTIwMTQnO1xuICAgIGNvbnN0IHJlbEZvciAgPSBlc2NhcGVIdG1sKChhY2gucmVsZXZhbnRfZm9yIHx8IFtdKS5qb2luKCcsICcpKTtcbiAgICByZXR1cm4gYFxuICAgICAgPHRyPlxuICAgICAgICA8dGQ+PHN0cm9uZz4ke3RpdGxlfTwvc3Ryb25nPiR7ZGVzYyA/IGA8YnI+PHNtYWxsIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtcIj4ke2Rlc2N9JHsoYWNoLmRlc2NyaXB0aW9ufHwnJykubGVuZ3RoID4gMTAwID8gJ1x1MjAyNicgOiAnJ308L3NtYWxsPmAgOiAnJ308L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjtcIj4ke2ltcH08L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2NvbG9yOiM0NzU1Njk7XCI+JHtyZWxGb3IgfHwgJ1x1MjAxNCd9PC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwiYWN0aW9uLWJ0bnNcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBvbmNsaWNrPVwiZWRpdE1hc3RlckFjaGlldmVtZW50KCR7ZXNjYXBlSHRtbChKU09OLnN0cmluZ2lmeSh7aWQ6IGFjaC5pZHx8JycsIHRpdGxlOiBhY2gudGl0bGV8fCcnLCBkZXNjcmlwdGlvbjogYWNoLmRlc2NyaXB0aW9ufHwnJywgcmVsZXZhbnRfZm9yOiBhY2gucmVsZXZhbnRfZm9yfHxbXSwgaW1wb3J0YW5jZTogYWNoLmltcG9ydGFuY2V8fDd9KSl9KVwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJFZGl0IGFjaGlldmVtZW50OiAke3RpdGxlfVwiIHRpdGxlPVwiRWRpdFwiPlx1MjcwRlx1RkUwRjwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIG9uY2xpY2s9XCJkZWxldGVNYXN0ZXJBY2hpZXZlbWVudCgnJHtpZH0nLCAnJHt0aXRsZX0nKVwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJEZWxldGUgYWNoaWV2ZW1lbnQ6ICR7dGl0bGV9XCIgdGl0bGU9XCJEZWxldGVcIj5cdUQ4M0RcdURERDFcdUZFMEY8L2J1dHRvbj5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvdHI+YDtcbiAgfSkuam9pbignJyk7XG4gIHJldHVybiBgXG4gICAgPHRhYmxlIGNsYXNzPVwicmV2aWV3LXRhYmxlXCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiPlxuICAgICAgPHRoZWFkPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRoPkFjaGlldmVtZW50PC90aD5cbiAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDo2MHB4O3RleHQtYWxpZ246Y2VudGVyO1wiPkltcG9ydGFuY2U8L3RoPlxuICAgICAgICAgIDx0aD5SZWxldmFudCBmb3I8L3RoPlxuICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOjgwcHg7XCI+QWN0aW9uczwvdGg+XG4gICAgICAgIDwvdHI+XG4gICAgICA8L3RoZWFkPlxuICAgICAgPHRib2R5PiR7cm93c308L3Rib2R5PlxuICAgIDwvdGFibGU+YDtcbn1cblxuZnVuY3Rpb24gX3JlbmRlclN1bW1hcmllc0xpc3Qoc3VtbWFyaWVzKSB7XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhzdW1tYXJpZXMpO1xuICBpZiAoIWtleXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuICc8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7cGFkZGluZzoxMnB4IDA7XCI+Tm8gcHJvZmVzc2lvbmFsIHN1bW1hcnkgdmFyaWFudHMgeWV0LiBDbGljayBcIisgQWRkIFN1bW1hcnlcIiBhYm92ZSB0byBjcmVhdGUgeW91ciBmaXJzdCBvbmUuPC9wPic7XG4gIH1cbiAgcmV0dXJuIGtleXMubWFwKGtleSA9PiB7XG4gICAgY29uc3QgdGV4dCAgICA9IHR5cGVvZiBzdW1tYXJpZXNba2V5XSA9PT0gJ3N0cmluZycgPyBzdW1tYXJpZXNba2V5XSA6IEpTT04uc3RyaW5naWZ5KHN1bW1hcmllc1trZXldKTtcbiAgICBjb25zdCBwcmV2aWV3ID0gZXNjYXBlSHRtbCh0ZXh0LnNsaWNlKDAsIDIwMCkpO1xuICAgIGNvbnN0IGtleUVzYyAgPSBlc2NhcGVIdG1sKGtleSk7XG4gICAgcmV0dXJuIGBcbiAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc3VtbWFyeS1jYXJkXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc3VtbWFyeS1oZWFkZXJcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hc3Rlci1zdW1tYXJ5LWtleVwiPiR7a2V5RXNjfTwvc3Bhbj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWJ0bnNcIiBzdHlsZT1cImdhcDo0cHg7XCI+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBvbmNsaWNrPVwiZWRpdE1hc3RlclN1bW1hcnkoJHtlc2NhcGVIdG1sKEpTT04uc3RyaW5naWZ5KHtrZXksIHRleHR9KSl9KVwiXG4gICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkVkaXQgc3VtbWFyeTogJHtrZXlFc2N9XCIgdGl0bGU9XCJFZGl0XCI+XHUyNzBGXHVGRTBGPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBvbmNsaWNrPVwiZGVsZXRlTWFzdGVyU3VtbWFyeSgnJHtrZXlFc2N9JylcIlxuICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJEZWxldGUgc3VtbWFyeTogJHtrZXlFc2N9XCIgdGl0bGU9XCJEZWxldGVcIj5cdUQ4M0RcdURERDFcdUZFMEY8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc3VtbWFyeS1wcmV2aWV3XCI+JHtwcmV2aWV3fSR7dGV4dC5sZW5ndGggPiAyMDAgPyAnXHUyMDI2JyA6ICcnfTwvZGl2PlxuICAgICAgPC9kaXY+YDtcbiAgfSkuam9pbignJyk7XG59XG5cbmZ1bmN0aW9uIHNob3dBZGRBY2hpZXZlbWVudE1vZGFsKCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLW1vZGFsLWlkJykudmFsdWUgICAgICAgICAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLW1vZGFsLXRpdGxlLWlucHV0JykudmFsdWUgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLW1vZGFsLWRlc2MtaW5wdXQnKS52YWx1ZSAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLW1vZGFsLXJlbGV2YW50LWlucHV0JykudmFsdWUgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaC1tb2RhbC1pbXBvcnRhbmNlLWlucHV0JykudmFsdWUgPSAnNyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItYWNoLW1vZGFsLXRpdGxlJykudGV4dENvbnRlbnQgPSAnQWRkIEFjaGlldmVtZW50JztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1hY2gtbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgc2V0SW5pdGlhbEZvY3VzKCdtYXN0ZXItYWNoLW1vZGFsLW92ZXJsYXknKTtcbiAgdHJhcEZvY3VzKCdtYXN0ZXItYWNoLW1vZGFsLW92ZXJsYXknKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaC1tb2RhbC10aXRsZS1pbnB1dCcpLmZvY3VzKCk7XG59XG5cbmZ1bmN0aW9uIGVkaXRNYXN0ZXJBY2hpZXZlbWVudChhY2gpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaC1tb2RhbC1pZCcpLnZhbHVlICAgICAgICAgICAgICA9IGFjaC5pZCB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaC1tb2RhbC10aXRsZS1pbnB1dCcpLnZhbHVlICAgICA9IGFjaC50aXRsZSB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaC1tb2RhbC1kZXNjLWlucHV0JykudmFsdWUgICAgICA9IGFjaC5kZXNjcmlwdGlvbiB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaC1tb2RhbC1yZWxldmFudC1pbnB1dCcpLnZhbHVlICA9IChhY2gucmVsZXZhbnRfZm9yIHx8IFtdKS5qb2luKCcsICcpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLW1vZGFsLWltcG9ydGFuY2UtaW5wdXQnKS52YWx1ZSA9IGFjaC5pbXBvcnRhbmNlIHx8IDc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItYWNoLW1vZGFsLXRpdGxlJykudGV4dENvbnRlbnQgPSAnRWRpdCBBY2hpZXZlbWVudCc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItYWNoLW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICBfZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIHNldEluaXRpYWxGb2N1cygnbWFzdGVyLWFjaC1tb2RhbC1vdmVybGF5Jyk7XG4gIHRyYXBGb2N1cygnbWFzdGVyLWFjaC1tb2RhbC1vdmVybGF5Jyk7XG59XG5cbmZ1bmN0aW9uIGNsb3NlTWFzdGVyQWNoTW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItYWNoLW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICByZXN0b3JlRm9jdXMoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZU1hc3RlckFjaGlldmVtZW50KCkge1xuICBjb25zdCBpZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhY2gtbW9kYWwtaWQnKS52YWx1ZS50cmltKCkgfHxcbiAgICAgICAgICAgICAnc2FfJyArIERhdGUubm93KCk7XG4gIGNvbnN0IHRpdGxlICAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaC1tb2RhbC10aXRsZS1pbnB1dCcpLnZhbHVlLnRyaW0oKTtcbiAgY29uc3QgZGVzY3JpcHRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLW1vZGFsLWRlc2MtaW5wdXQnKS52YWx1ZS50cmltKCk7XG4gIGNvbnN0IHJlbGV2YW50UmF3ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaC1tb2RhbC1yZWxldmFudC1pbnB1dCcpLnZhbHVlO1xuICBjb25zdCBpbXBvcnRhbmNlICA9IHBhcnNlSW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhY2gtbW9kYWwtaW1wb3J0YW5jZS1pbnB1dCcpLnZhbHVlLCAxMCkgfHwgNztcblxuICBpZiAoIXRpdGxlKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjZBMFx1RkUwRiBWYWxpZGF0aW9uJywgJ1RpdGxlIGlzIHJlcXVpcmVkLicpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCByZWxldmFudF9mb3IgPSByZWxldmFudFJhdy5zcGxpdCgnLCcpLm1hcChzID0+IHMudHJpbSgpKS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS91cGRhdGUtYWNoaWV2ZW1lbnQnLCB7XG4gICAgICBtZXRob2Q6ICAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6ICAgIEpTT04uc3RyaW5naWZ5KHsgaWQsIHRpdGxlLCBkZXNjcmlwdGlvbiwgcmVsZXZhbnRfZm9yLCBpbXBvcnRhbmNlIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBjbG9zZU1hc3RlckFjaE1vZGFsKCk7XG4gICAgICBfc2V0TWFzdGVyQ2hhbmdlTm90aWNlKCdTZWxlY3RlZCBBY2hpZXZlbWVudHMnLCBkYXRhLmFjdGlvbiB8fCAndXBkYXRlZCcpO1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjcwNSBTYXZlZCcsIGBBY2hpZXZlbWVudCBcIiR7dGl0bGV9XCIgJHtkYXRhLmFjdGlvbn0uYCk7XG4gICAgICBhd2FpdCBwb3B1bGF0ZU1hc3RlclRhYigpOyAgLy8gcmVmcmVzaFxuICAgIH0gZWxzZSB7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgZGF0YS5lcnJvciB8fCAnU2F2ZSBmYWlsZWQnKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgJ0ZhaWxlZCB0byBzYXZlIGFjaGlldmVtZW50Jyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvd0FkZFN1bW1hcnlNb2RhbCgpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1bS1tb2RhbC1rZXktaW5wdXQnKS52YWx1ZSAgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1bS1tb2RhbC10ZXh0LWlucHV0JykudmFsdWUgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1zdW0tbW9kYWwtdGl0bGUnKS50ZXh0Q29udGVudCA9ICdBZGQgUHJvZmVzc2lvbmFsIFN1bW1hcnknO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXN1bS1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBzZXRJbml0aWFsRm9jdXMoJ21hc3Rlci1zdW0tbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ21hc3Rlci1zdW0tbW9kYWwtb3ZlcmxheScpO1xufVxuXG5mdW5jdGlvbiBlZGl0TWFzdGVyU3VtbWFyeShvYmopIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1bS1tb2RhbC1rZXktaW5wdXQnKS52YWx1ZSAgPSBvYmoua2V5ICB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1bS1tb2RhbC10ZXh0LWlucHV0JykudmFsdWUgPSBvYmoudGV4dCB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1zdW0tbW9kYWwtdGl0bGUnKS50ZXh0Q29udGVudCA9ICdFZGl0IFByb2Zlc3Npb25hbCBTdW1tYXJ5JztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1zdW0tbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgc2V0SW5pdGlhbEZvY3VzKCdtYXN0ZXItc3VtLW1vZGFsLW92ZXJsYXknKTtcbiAgdHJhcEZvY3VzKCdtYXN0ZXItc3VtLW1vZGFsLW92ZXJsYXknKTtcbn1cblxuZnVuY3Rpb24gY2xvc2VNYXN0ZXJTdW1Nb2RhbCgpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1zdW0tbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHJlc3RvcmVGb2N1cygpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzYXZlTWFzdGVyU3VtbWFyeSgpIHtcbiAgY29uc3Qga2V5ICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdW0tbW9kYWwta2V5LWlucHV0JykudmFsdWUudHJpbSgpO1xuICBjb25zdCB0ZXh0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1bS1tb2RhbC10ZXh0LWlucHV0JykudmFsdWUudHJpbSgpO1xuICBpZiAoIWtleSB8fCAhdGV4dCkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI2QTBcdUZFMEYgVmFsaWRhdGlvbicsICdCb3RoIEtleSBhbmQgU3VtbWFyeSB0ZXh0IGFyZSByZXF1aXJlZC4nKTtcbiAgICByZXR1cm47XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS91cGRhdGUtc3VtbWFyeScsIHtcbiAgICAgIG1ldGhvZDogICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogICAgSlNPTi5zdHJpbmdpZnkoeyBrZXksIHRleHQgfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEub2spIHtcbiAgICAgIGNsb3NlTWFzdGVyU3VtTW9kYWwoKTtcbiAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ1Byb2Zlc3Npb25hbCBTdW1tYXJpZXMnLCBkYXRhLmFjdGlvbiB8fCAndXBkYXRlZCcpO1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjcwNSBTYXZlZCcsIGBTdW1tYXJ5IFwiJHtrZXl9XCIgJHtkYXRhLmFjdGlvbn0uYCk7XG4gICAgICBhd2FpdCBwb3B1bGF0ZU1hc3RlclRhYigpOyAgLy8gcmVmcmVzaFxuICAgIH0gZWxzZSB7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgZGF0YS5lcnJvciB8fCAnU2F2ZSBmYWlsZWQnKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgJ0ZhaWxlZCB0byBzYXZlIHN1bW1hcnknKTtcbiAgfVxufVxuXG4vLyAtLS0tIFBlcnNvbmFsIEluZm8gbW9kYWwgaGFuZGxlcnMgLS0tLVxuXG5mdW5jdGlvbiBzaG93RWRpdFBlcnNvbmFsSW5mb01vZGFsKCkge1xuICBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS9mdWxsJylcbiAgICAudGhlbihyID0+IHIuanNvbigpKVxuICAgIC50aGVuKGRhdGEgPT4ge1xuICAgICAgY29uc3QgcGkgICAgICA9IGRhdGEucGVyc29uYWxfaW5mbyB8fCB7fTtcbiAgICAgIGNvbnN0IGNvbnRhY3QgPSBwaS5jb250YWN0IHx8IHt9O1xuICAgICAgY29uc3QgYWRkcmVzcyA9IGNvbnRhY3QuYWRkcmVzcyB8fCB7fTtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwaS1uYW1lLWlucHV0JykudmFsdWUgICAgPSBwaS5uYW1lIHx8ICcnO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BpLXRpdGxlLWlucHV0JykudmFsdWUgICA9IHBpLnRpdGxlIHx8IHBpLmhlYWRsaW5lIHx8ICcnO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BpLWVtYWlsLWlucHV0JykudmFsdWUgICA9IGNvbnRhY3QuZW1haWwgfHwgcGkuZW1haWwgfHwgJyc7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGktcGhvbmUtaW5wdXQnKS52YWx1ZSAgID0gY29udGFjdC5waG9uZSB8fCAnJztcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwaS1saW5rZWRpbi1pbnB1dCcpLnZhbHVlID0gY29udGFjdC5saW5rZWRpbiB8fCAnJztcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwaS13ZWJzaXRlLWlucHV0JykudmFsdWUgID0gY29udGFjdC53ZWJzaXRlIHx8ICcnO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BpLWNpdHktaW5wdXQnKS52YWx1ZSAgICA9IGFkZHJlc3MuY2l0eSB8fCAnJztcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwaS1zdGF0ZS1pbnB1dCcpLnZhbHVlICAgPSBhZGRyZXNzLnN0YXRlIHx8ICcnO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1waS1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICAgIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICAgIHNldEluaXRpYWxGb2N1cygnbWFzdGVyLXBpLW1vZGFsLW92ZXJsYXknKTtcbiAgICAgIHRyYXBGb2N1cygnbWFzdGVyLXBpLW1vZGFsLW92ZXJsYXknKTtcbiAgICB9KVxuICAgIC5jYXRjaCgoKSA9PiBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgJ0NvdWxkIG5vdCBsb2FkIHBlcnNvbmFsIGluZm8nKSk7XG59XG5cbmZ1bmN0aW9uIGNsb3NlUGVyc29uYWxJbmZvTW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcGktbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHJlc3RvcmVGb2N1cygpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzYXZlUGVyc29uYWxJbmZvKCkge1xuICBjb25zdCBib2R5ID0ge1xuICAgIG5hbWU6ICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGktbmFtZS1pbnB1dCcpLnZhbHVlLnRyaW0oKSxcbiAgICB0aXRsZTogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BpLXRpdGxlLWlucHV0JykudmFsdWUudHJpbSgpLFxuICAgIGVtYWlsOiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGktZW1haWwtaW5wdXQnKS52YWx1ZS50cmltKCksXG4gICAgcGhvbmU6ICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwaS1waG9uZS1pbnB1dCcpLnZhbHVlLnRyaW0oKSxcbiAgICBsaW5rZWRpbjogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BpLWxpbmtlZGluLWlucHV0JykudmFsdWUudHJpbSgpLFxuICAgIHdlYnNpdGU6ICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGktd2Vic2l0ZS1pbnB1dCcpLnZhbHVlLnRyaW0oKSxcbiAgICBjaXR5OiAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BpLWNpdHktaW5wdXQnKS52YWx1ZS50cmltKCksXG4gICAgc3RhdGU6ICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwaS1zdGF0ZS1pbnB1dCcpLnZhbHVlLnRyaW0oKSxcbiAgfTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvcGVyc29uYWwtaW5mbycsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSwgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEub2spIHtcbiAgICAgIGNsb3NlUGVyc29uYWxJbmZvTW9kYWwoKTtcbiAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ1BlcnNvbmFsIEluZm9ybWF0aW9uJywgJ3VwZGF0ZWQnKTtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3MDUgU2F2ZWQnLCAnUGVyc29uYWwgaW5mb3JtYXRpb24gdXBkYXRlZC4nKTtcbiAgICAgIGF3YWl0IHBvcHVsYXRlTWFzdGVyVGFiKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCBkYXRhLmVycm9yIHx8ICdTYXZlIGZhaWxlZCcpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIHNhdmUgcGVyc29uYWwgaW5mbycpO1xuICB9XG59XG5cbi8vIC0tLS0gRXhwZXJpZW5jZSBtb2RhbCBoYW5kbGVycyAtLS0tXG5cbmZ1bmN0aW9uIHNob3dBZGRFeHBlcmllbmNlTW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtbW9kYWwtaWQnKS52YWx1ZSAgICAgICAgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC10aXRsZS1pbnB1dCcpLnZhbHVlICAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLWNvbXBhbnktaW5wdXQnKS52YWx1ZSAgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtY2l0eS1pbnB1dCcpLnZhbHVlICAgICAgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC1zdGF0ZS1pbnB1dCcpLnZhbHVlICAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLXN0YXJ0LWlucHV0JykudmFsdWUgICAgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtZW5kLWlucHV0JykudmFsdWUgICAgICAgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC10eXBlLWlucHV0JykudmFsdWUgICAgICA9ICdmdWxsX3RpbWUnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLWltcG9ydGFuY2UtaW5wdXQnKS52YWx1ZSA9ICc1JztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC10YWdzLWlucHV0JykudmFsdWUgICAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWV4cC1tb2RhbC10aXRsZScpLnRleHRDb250ZW50ID0gJ0FkZCBXb3JrIEV4cGVyaWVuY2UnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWV4cC1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgX21hc3RlckV4cE1vZGFsQWNoaWV2ZW1lbnRzID0gW107XG4gIF9yZW5kZXJFeHBBY2hpZXZlbWVudHNFZGl0b3IoKTtcbiAgX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBzZXRJbml0aWFsRm9jdXMoJ21hc3Rlci1leHAtbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ21hc3Rlci1leHAtbW9kYWwtb3ZlcmxheScpO1xufVxuXG4vLyBXb3JraW5nIGNvcHkgb2YgdGhlIGN1cnJlbnRseS1lZGl0ZWQgZXhwZXJpZW5jZSdzIGFjaGlldmVtZW50cyB3aGlsZSB0aGVcbi8vIG1vZGFsIGlzIG9wZW4gKEdBUC0xOSAxNi4xMSkuIGVkaXRNYXN0ZXJFeHBlcmllbmNlKCkgdGFrZXMgYW4gaWQgKG5vdCB0aGVcbi8vIGZ1bGwgb2JqZWN0KSBhbmQgbG9va3MgaXQgdXAgZnJvbSB3aW5kb3cuX21hc3RlckV4cGVyaWVuY2VGdWxsRGF0YSBcdTIwMTRcbi8vIGFjaGlldmVtZW50IHRleHQgY2FuIGNvbnRhaW4gcXVvdGVzL3VuaWNvZGUgdGhhdCB3b3VsZCBiZSBmcmFnaWxlIHRvXG4vLyBlbWJlZCBkaXJlY3RseSBpbnNpZGUgYW4gaW5saW5lIG9uY2xpY2sgYXR0cmlidXRlLlxubGV0IF9tYXN0ZXJFeHBNb2RhbEFjaGlldmVtZW50cyA9IFtdO1xuXG5mdW5jdGlvbiBfYWNoaWV2ZW1lbnRUZXh0KGEpIHtcbiAgcmV0dXJuIHR5cGVvZiBhID09PSAnc3RyaW5nJyA/IGEgOiAoYSAmJiBhLnRleHQpIHx8ICcnO1xufVxuXG5mdW5jdGlvbiBfcmVuZGVyRXhwQWNoaWV2ZW1lbnRzRWRpdG9yKCkge1xuICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLWFjaGlldmVtZW50cy1lZGl0b3ItbGlzdCcpO1xuICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuO1xuICBjb25zdCBsYXN0SWR4ID0gX21hc3RlckV4cE1vZGFsQWNoaWV2ZW1lbnRzLmxlbmd0aCAtIDE7XG4gIGNvbnRhaW5lci5pbm5lckhUTUwgPSBfbWFzdGVyRXhwTW9kYWxBY2hpZXZlbWVudHMubWFwKChhY2gsIGlkeCkgPT4gYFxuICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjZweDthbGlnbi1pdGVtczpjZW50ZXI7bWFyZ2luLWJvdHRvbTo2cHg7XCI+XG4gICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImVkaXQtaW5wdXQgZXhwLWFjaC10ZXh0LWlucHV0XCIgZGF0YS1pZHg9XCIke2lkeH1cIiBzdHlsZT1cImZsZXg6MTtcIlxuICAgICAgICAgIHZhbHVlPVwiJHtlc2NhcGVIdG1sKF9hY2hpZXZlbWVudFRleHQoYWNoKSl9XCIgYXJpYS1sYWJlbD1cIkFjaGlldmVtZW50ICR7aWR4ICsgMX0gdGV4dFwiIC8+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImljb24tYnRuXCIgb25jbGljaz1cIl9tb3ZlRXhwQWNoaWV2ZW1lbnQoJHtpZHh9LCAtMSlcIlxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJNb3ZlIGFjaGlldmVtZW50ICR7aWR4ICsgMX0gdXBcIiB0aXRsZT1cIk1vdmUgdXBcIiAke2lkeCA9PT0gMCA/ICdkaXNhYmxlZCcgOiAnJ30+XHUyMTkxPC9idXR0b24+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImljb24tYnRuXCIgb25jbGljaz1cIl9tb3ZlRXhwQWNoaWV2ZW1lbnQoJHtpZHh9LCAxKVwiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIk1vdmUgYWNoaWV2ZW1lbnQgJHtpZHggKyAxfSBkb3duXCIgdGl0bGU9XCJNb3ZlIGRvd25cIiAke2lkeCA9PT0gbGFzdElkeCA/ICdkaXNhYmxlZCcgOiAnJ30+XHUyMTkzPC9idXR0b24+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImljb24tYnRuXCIgb25jbGljaz1cIl9kZWxldGVFeHBBY2hpZXZlbWVudCgke2lkeH0pXCJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiRGVsZXRlIGFjaGlldmVtZW50ICR7aWR4ICsgMX1cIiB0aXRsZT1cIkRlbGV0ZVwiPlx1RDgzRFx1REREMVx1RkUwRjwvYnV0dG9uPlxuICAgIDwvZGl2PmApLmpvaW4oJycpIHx8ICc8cCBzdHlsZT1cImNvbG9yOiM5NGEzYjg7Zm9udC1zaXplOjAuODVlbTttYXJnaW46MCAwIDZweDtcIj5ObyBhY2hpZXZlbWVudHMgeWV0LjwvcD4nO1xufVxuXG4vLyBSZWFkIGFueSBpbi1wcm9ncmVzcyBlZGl0cyBvdXQgb2YgdGhlIGFjaGlldmVtZW50IHRleHQgaW5wdXRzIGJlZm9yZSBhXG4vLyByZW9yZGVyL2RlbGV0ZS9zYXZlIHJlYnVpbGRzIHRoZSBsaXN0IGZyb20gX21hc3RlckV4cE1vZGFsQWNoaWV2ZW1lbnRzIFx1MjAxNFxuLy8gb3RoZXJ3aXNlIGFuIHVuLXN1Ym1pdHRlZCB0ZXh0IGVkaXQgd291bGQgYmUgc2lsZW50bHkgbG9zdCBvbiByZS1yZW5kZXIuXG5mdW5jdGlvbiBfc3luY0V4cEFjaGlldmVtZW50c0Zyb21JbnB1dHMoKSB7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5leHAtYWNoLXRleHQtaW5wdXQnKS5mb3JFYWNoKChpbnB1dCkgPT4ge1xuICAgIGNvbnN0IGlkeCA9IHBhcnNlSW50KGlucHV0LmRhdGFzZXQuaWR4LCAxMCk7XG4gICAgY29uc3QgYWNoID0gX21hc3RlckV4cE1vZGFsQWNoaWV2ZW1lbnRzW2lkeF07XG4gICAgaWYgKHR5cGVvZiBhY2ggPT09ICdzdHJpbmcnIHx8IGFjaCA9PSBudWxsKSB7XG4gICAgICBfbWFzdGVyRXhwTW9kYWxBY2hpZXZlbWVudHNbaWR4XSA9IGlucHV0LnZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBhY2gudGV4dCA9IGlucHV0LnZhbHVlO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIF9hZGRFeHBBY2hpZXZlbWVudCgpIHtcbiAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLWFjaC1uZXctaW5wdXQnKTtcbiAgY29uc3QgdGV4dCA9IChpbnB1dC52YWx1ZSB8fCAnJykudHJpbSgpO1xuICBpZiAoIXRleHQpIHJldHVybjtcbiAgX3N5bmNFeHBBY2hpZXZlbWVudHNGcm9tSW5wdXRzKCk7XG4gIF9tYXN0ZXJFeHBNb2RhbEFjaGlldmVtZW50cy5wdXNoKHRleHQpO1xuICBpbnB1dC52YWx1ZSA9ICcnO1xuICBfcmVuZGVyRXhwQWNoaWV2ZW1lbnRzRWRpdG9yKCk7XG59XG5cbmZ1bmN0aW9uIF9tb3ZlRXhwQWNoaWV2ZW1lbnQoaWR4LCBkZWx0YSkge1xuICBfc3luY0V4cEFjaGlldmVtZW50c0Zyb21JbnB1dHMoKTtcbiAgY29uc3QgdGFyZ2V0ID0gaWR4ICsgZGVsdGE7XG4gIGlmICh0YXJnZXQgPCAwIHx8IHRhcmdldCA+PSBfbWFzdGVyRXhwTW9kYWxBY2hpZXZlbWVudHMubGVuZ3RoKSByZXR1cm47XG4gIGNvbnN0IFtpdGVtXSA9IF9tYXN0ZXJFeHBNb2RhbEFjaGlldmVtZW50cy5zcGxpY2UoaWR4LCAxKTtcbiAgX21hc3RlckV4cE1vZGFsQWNoaWV2ZW1lbnRzLnNwbGljZSh0YXJnZXQsIDAsIGl0ZW0pO1xuICBfcmVuZGVyRXhwQWNoaWV2ZW1lbnRzRWRpdG9yKCk7XG59XG5cbmZ1bmN0aW9uIF9kZWxldGVFeHBBY2hpZXZlbWVudChpZHgpIHtcbiAgX3N5bmNFeHBBY2hpZXZlbWVudHNGcm9tSW5wdXRzKCk7XG4gIF9tYXN0ZXJFeHBNb2RhbEFjaGlldmVtZW50cy5zcGxpY2UoaWR4LCAxKTtcbiAgX3JlbmRlckV4cEFjaGlldmVtZW50c0VkaXRvcigpO1xufVxuXG5mdW5jdGlvbiBlZGl0TWFzdGVyRXhwZXJpZW5jZShpZCkge1xuICBjb25zdCBleHAgPSAod2luZG93Ll9tYXN0ZXJFeHBlcmllbmNlRnVsbERhdGEgfHwgW10pLmZpbmQoKGUpID0+IGUuaWQgPT09IGlkKTtcbiAgaWYgKCFleHApIHtcbiAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgJ0NvdWxkIG5vdCBmaW5kIHRoYXQgZXhwZXJpZW5jZSBlbnRyeSBcdTIwMTQgdHJ5IHJlZnJlc2hpbmcgdGhlIHRhYi4nKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgbG9jID0gZXhwLmxvY2F0aW9uIHx8IHt9O1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLW1vZGFsLWlkJykudmFsdWUgICAgICAgICA9IGV4cC5pZCB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC10aXRsZS1pbnB1dCcpLnZhbHVlICAgICAgPSBleHAudGl0bGUgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtY29tcGFueS1pbnB1dCcpLnZhbHVlICAgID0gZXhwLmNvbXBhbnkgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtY2l0eS1pbnB1dCcpLnZhbHVlICAgICAgID0gbG9jLmNpdHkgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtc3RhdGUtaW5wdXQnKS52YWx1ZSAgICAgID0gbG9jLnN0YXRlIHx8ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLXN0YXJ0LWlucHV0JykudmFsdWUgICAgICA9IGV4cC5zdGFydF9kYXRlIHx8ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLWVuZC1pbnB1dCcpLnZhbHVlICAgICAgICA9IGV4cC5lbmRfZGF0ZSB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC10eXBlLWlucHV0JykudmFsdWUgICAgICAgPSBleHAuZW1wbG95bWVudF90eXBlIHx8ICdmdWxsX3RpbWUnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLWltcG9ydGFuY2UtaW5wdXQnKS52YWx1ZSAgPSBleHAuaW1wb3J0YW5jZSB8fCA1O1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLXRhZ3MtaW5wdXQnKS52YWx1ZSAgICAgICA9IHR5cGVvZiBleHAudGFncyA9PT0gJ3N0cmluZycgPyBleHAudGFnc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoZXhwLnRhZ3MgfHwgW10pLmpvaW4oJywgJyk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItZXhwLW1vZGFsLXRpdGxlJykudGV4dENvbnRlbnQgPSAnRWRpdCBXb3JrIEV4cGVyaWVuY2UnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWV4cC1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgX21hc3RlckV4cE1vZGFsQWNoaWV2ZW1lbnRzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShleHAuYWNoaWV2ZW1lbnRzIHx8IFtdKSk7XG4gIF9yZW5kZXJFeHBBY2hpZXZlbWVudHNFZGl0b3IoKTtcbiAgX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBzZXRJbml0aWFsRm9jdXMoJ21hc3Rlci1leHAtbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ21hc3Rlci1leHAtbW9kYWwtb3ZlcmxheScpO1xufVxuXG5mdW5jdGlvbiBjbG9zZUV4cGVyaWVuY2VNb2RhbCgpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1leHAtbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHJlc3RvcmVGb2N1cygpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzYXZlTWFzdGVyRXhwZXJpZW5jZSgpIHtcbiAgY29uc3QgaWQgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC1tb2RhbC1pZCcpLnZhbHVlLnRyaW0oKTtcbiAgY29uc3QgdGl0bGUgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC10aXRsZS1pbnB1dCcpLnZhbHVlLnRyaW0oKTtcbiAgY29uc3QgY29tcGFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtY29tcGFueS1pbnB1dCcpLnZhbHVlLnRyaW0oKTtcbiAgaWYgKCF0aXRsZSB8fCAhY29tcGFueSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI2QTBcdUZFMEYgVmFsaWRhdGlvbicsICdKb2IgdGl0bGUgYW5kIGNvbXBhbnkgYXJlIHJlcXVpcmVkLicpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB0YWdzUmF3ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC10YWdzLWlucHV0JykudmFsdWU7XG4gIF9zeW5jRXhwQWNoaWV2ZW1lbnRzRnJvbUlucHV0cygpO1xuICBjb25zdCBleHBEYXRhID0ge1xuICAgIHRpdGxlLCBjb21wYW55LFxuICAgIGNpdHk6ICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC1jaXR5LWlucHV0JykudmFsdWUudHJpbSgpLFxuICAgIHN0YXRlOiAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC1zdGF0ZS1pbnB1dCcpLnZhbHVlLnRyaW0oKSxcbiAgICBzdGFydF9kYXRlOiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtc3RhcnQtaW5wdXQnKS52YWx1ZS50cmltKCksXG4gICAgZW5kX2RhdGU6ICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLWVuZC1pbnB1dCcpLnZhbHVlLnRyaW0oKSxcbiAgICBlbXBsb3ltZW50X3R5cGU6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtdHlwZS1pbnB1dCcpLnZhbHVlLFxuICAgIGltcG9ydGFuY2U6ICAgICAgcGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC1pbXBvcnRhbmNlLWlucHV0JykudmFsdWUsIDEwKSB8fCA1LFxuICAgIHRhZ3M6ICAgICAgICAgICAgdGFnc1Jhdy5zcGxpdCgnLCcpLm1hcChzID0+IHMudHJpbSgpKS5maWx0ZXIoQm9vbGVhbiksXG4gICAgYWNoaWV2ZW1lbnRzOiAgICBfbWFzdGVyRXhwTW9kYWxBY2hpZXZlbWVudHMsXG4gIH07XG4gIGNvbnN0IGFjdGlvbiA9IGlkID8gJ3VwZGF0ZScgOiAnYWRkJztcbiAgY29uc3QgYm9keSAgID0gYWN0aW9uID09PSAndXBkYXRlJyA/IHsgYWN0aW9uLCBpZCwgZXhwZXJpZW5jZTogZXhwRGF0YSB9IDogeyBhY3Rpb24sIGV4cGVyaWVuY2U6IGV4cERhdGEgfTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvZXhwZXJpZW5jZScsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSwgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEub2spIHtcbiAgICAgIGNsb3NlRXhwZXJpZW5jZU1vZGFsKCk7XG4gICAgICBfc2V0TWFzdGVyQ2hhbmdlTm90aWNlKCdXb3JrIEV4cGVyaWVuY2UnLCBkYXRhLmFjdGlvbiB8fCAndXBkYXRlZCcpO1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjcwNSBTYXZlZCcsIGBFeHBlcmllbmNlIFwiJHt0aXRsZX1cIiAke2RhdGEuYWN0aW9ufS5gKTtcbiAgICAgIGF3YWl0IHBvcHVsYXRlTWFzdGVyVGFiKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCBkYXRhLmVycm9yIHx8ICdTYXZlIGZhaWxlZCcpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIHNhdmUgZXhwZXJpZW5jZScpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZU1hc3RlckV4cGVyaWVuY2UoaWQsIHRpdGxlKSB7XG4gIHNob3dDb25maXJtTW9kYWwoXG4gICAgJ1x1RDgzRFx1REREMVx1RkUwRiBEZWxldGUgRXhwZXJpZW5jZScsXG4gICAgYERlbGV0ZSBcIiR7dGl0bGV9XCI/IFRoaXMgY2Fubm90IGJlIHVuZG9uZS5gLFxuICAgIGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS9leHBlcmllbmNlJywge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGFjdGlvbjogJ2RlbGV0ZScsIGlkIH0pLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICAgICAgX3NldE1hc3RlckNoYW5nZU5vdGljZSgnV29yayBFeHBlcmllbmNlJywgZGF0YS5hY3Rpb24gfHwgJ2RlbGV0ZWQnKTtcbiAgICAgICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzA1IERlbGV0ZWQnLCBgRXhwZXJpZW5jZSBcIiR7dGl0bGV9XCIgcmVtb3ZlZC5gKTtcbiAgICAgICAgICBhd2FpdCBwb3B1bGF0ZU1hc3RlclRhYigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCBkYXRhLmVycm9yIHx8ICdEZWxldGUgZmFpbGVkJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsICdGYWlsZWQgdG8gZGVsZXRlIGV4cGVyaWVuY2UnKTtcbiAgICAgIH1cbiAgICB9XG4gICk7XG59XG5cbi8vIC0tLS0gU2tpbGwgbW9kYWwgaGFuZGxlcnMgLS0tLVxuXG5mdW5jdGlvbiBzaG93QWRkU2tpbGxNb2RhbChjYXRlZ29yeUtleSwgaXNGbGF0KSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1tb2RhbC1jYXRlZ29yeScpLnZhbHVlID0gY2F0ZWdvcnlLZXkgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1tb2RhbC1pcy1mbGF0JykudmFsdWUgID0gaXNGbGF0ID8gJzEnIDogJzAnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtbW9kYWwtb3JpZ2luYWwtbmFtZScpLnZhbHVlID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1uYW1lLWlucHV0JykudmFsdWUgICAgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1leHBlcmllbmNlcy1pbnB1dCcpLnZhbHVlID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1hbGlhc2VzLWlucHV0JykudmFsdWUgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC15ZWFycy1pbnB1dCcpLnZhbHVlICAgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItc2tpbGwtbW9kYWwtdGl0bGUnKS50ZXh0Q29udGVudCA9ICdBZGQgU2tpbGwnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXNraWxsLXNhdmUtYnRuJykudGV4dENvbnRlbnQgPSAnQWRkIFNraWxsJztcbiAgY29uc3QgaGludHMgPSAod2luZG93Ll9tYXN0ZXJFeHBlcmllbmNlT3B0aW9ucyB8fCBbXSlcbiAgICAuc2xpY2UoMCwgOClcbiAgICAubWFwKCh4KSA9PiBgJHt4LmlkfSAoJHt4LmxhYmVsfSlgKVxuICAgIC5qb2luKCcgXHUwMEI3ICcpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtZXhwZXJpZW5jZS1oaW50cycpLnRleHRDb250ZW50ID0gaGludHMgPyBgQXZhaWxhYmxlOiAke2hpbnRzfWAgOiAnJztcbiAgY29uc3QgY2F0Um93ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NraWxsLWNhdGVnb3J5LXJvdycpO1xuICBpZiAoY2F0ZWdvcnlLZXkpIHtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtY2F0ZWdvcnktZGlzcGxheScpLnRleHRDb250ZW50ID0gY2F0ZWdvcnlLZXk7XG4gICAgY2F0Um93LnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgfSBlbHNlIHtcbiAgICBjYXRSb3cuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgfVxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXNraWxsLW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICBfZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIHNldEluaXRpYWxGb2N1cygnbWFzdGVyLXNraWxsLW1vZGFsLW92ZXJsYXknKTtcbiAgdHJhcEZvY3VzKCdtYXN0ZXItc2tpbGwtbW9kYWwtb3ZlcmxheScpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtbmFtZS1pbnB1dCcpLmZvY3VzKCk7XG59XG5cbmZ1bmN0aW9uIGVkaXRNYXN0ZXJTa2lsbChza2lsbE9iaiwgY2F0ZWdvcnlLZXksIGlzRmxhdCkge1xuICBjb25zdCBuYW1lID0gdHlwZW9mIHNraWxsT2JqID09PSAnc3RyaW5nJyA/IHNraWxsT2JqIDogKHNraWxsT2JqPy5uYW1lIHx8ICcnKTtcbiAgY29uc3QgZXhwZXJpZW5jZXMgPSBBcnJheS5pc0FycmF5KHNraWxsT2JqPy5leHBlcmllbmNlcykgPyBza2lsbE9iai5leHBlcmllbmNlcyA6IFtdO1xuICBjb25zdCBhbGlhc2VzID0gQXJyYXkuaXNBcnJheShza2lsbE9iaj8uYWxpYXNlcykgPyBza2lsbE9iai5hbGlhc2VzIDogW107XG4gIGNvbnN0IHllYXJzID0gKHR5cGVvZiBza2lsbE9iaiA9PT0gJ29iamVjdCcgJiYgc2tpbGxPYmo/LnllYXJzICE9IG51bGwpID8gc2tpbGxPYmoueWVhcnMgOiAnJztcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtbW9kYWwtY2F0ZWdvcnknKS52YWx1ZSA9IGNhdGVnb3J5S2V5IHx8ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtbW9kYWwtaXMtZmxhdCcpLnZhbHVlICA9IGlzRmxhdCA/ICcxJyA6ICcwJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NraWxsLW1vZGFsLW9yaWdpbmFsLW5hbWUnKS52YWx1ZSA9IG5hbWU7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1uYW1lLWlucHV0JykudmFsdWUgPSBuYW1lO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtZXhwZXJpZW5jZXMtaW5wdXQnKS52YWx1ZSA9IGV4cGVyaWVuY2VzLmpvaW4oJywgJyk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1hbGlhc2VzLWlucHV0JykudmFsdWUgPSBhbGlhc2VzLmpvaW4oJywgJyk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC15ZWFycy1pbnB1dCcpLnZhbHVlID0geWVhcnM7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItc2tpbGwtbW9kYWwtdGl0bGUnKS50ZXh0Q29udGVudCA9ICdFZGl0IFNraWxsJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1za2lsbC1zYXZlLWJ0bicpLnRleHRDb250ZW50ID0gJ1NhdmUgU2tpbGwnO1xuXG4gIGNvbnN0IGhpbnRzID0gKHdpbmRvdy5fbWFzdGVyRXhwZXJpZW5jZU9wdGlvbnMgfHwgW10pXG4gICAgLnNsaWNlKDAsIDgpXG4gICAgLm1hcCgoeCkgPT4gYCR7eC5pZH0gKCR7eC5sYWJlbH0pYClcbiAgICAuam9pbignIFx1MDBCNyAnKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NraWxsLWV4cGVyaWVuY2UtaGludHMnKS50ZXh0Q29udGVudCA9IGhpbnRzID8gYEF2YWlsYWJsZTogJHtoaW50c31gIDogJyc7XG5cbiAgY29uc3QgY2F0Um93ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NraWxsLWNhdGVnb3J5LXJvdycpO1xuICBpZiAoY2F0ZWdvcnlLZXkpIHtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtY2F0ZWdvcnktZGlzcGxheScpLnRleHRDb250ZW50ID0gY2F0ZWdvcnlLZXk7XG4gICAgY2F0Um93LnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgfSBlbHNlIHtcbiAgICBjYXRSb3cuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgfVxuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItc2tpbGwtbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgc2V0SW5pdGlhbEZvY3VzKCdtYXN0ZXItc2tpbGwtbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ21hc3Rlci1za2lsbC1tb2RhbC1vdmVybGF5Jyk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1uYW1lLWlucHV0JykuZm9jdXMoKTtcbn1cblxuZnVuY3Rpb24gY2xvc2VTa2lsbE1vZGFsKCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXNraWxsLW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICByZXN0b3JlRm9jdXMoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZU1hc3RlclNraWxsKCkge1xuICBjb25zdCBza2lsbCAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1uYW1lLWlucHV0JykudmFsdWUudHJpbSgpO1xuICBjb25zdCBjYXRlZ29yeSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1tb2RhbC1jYXRlZ29yeScpLnZhbHVlLnRyaW0oKTtcbiAgY29uc3QgaXNGbGF0ICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtbW9kYWwtaXMtZmxhdCcpLnZhbHVlID09PSAnMSc7XG4gIGNvbnN0IG9yaWdpbmFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NraWxsLW1vZGFsLW9yaWdpbmFsLW5hbWUnKS52YWx1ZS50cmltKCk7XG4gIGNvbnN0IGV4cGVyaWVuY2VzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NraWxsLWV4cGVyaWVuY2VzLWlucHV0JykudmFsdWVcbiAgICAuc3BsaXQoJywnKVxuICAgIC5tYXAoKHMpID0+IHMudHJpbSgpKVxuICAgIC5maWx0ZXIoQm9vbGVhbik7XG4gIGNvbnN0IGFsaWFzZXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtYWxpYXNlcy1pbnB1dCcpLnZhbHVlXG4gICAgLnNwbGl0KCcsJylcbiAgICAubWFwKChzKSA9PiBzLnRyaW0oKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pO1xuICBjb25zdCB5ZWFyc1JhdyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC15ZWFycy1pbnB1dCcpLnZhbHVlLnRyaW0oKTtcbiAgY29uc3QgeWVhcnMgPSB5ZWFyc1JhdyA9PT0gJycgPyBudWxsIDogcGFyc2VGbG9hdCh5ZWFyc1Jhdyk7XG4gIGlmICghc2tpbGwpIHtcbiAgICBzaG93QWxlcnRNb2RhbCgnXHUyNkEwXHVGRTBGIFZhbGlkYXRpb24nLCAnU2tpbGwgbmFtZSBpcyByZXF1aXJlZC4nKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHllYXJzICE9PSBudWxsICYmICFOdW1iZXIuaXNGaW5pdGUoeWVhcnMpKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjZBMFx1RkUwRiBWYWxpZGF0aW9uJywgJ1llYXJzIG9mIGV4cGVyaWVuY2UgbXVzdCBiZSBhIGZpbml0ZSBudW1iZXIuJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGlzVXBkYXRlID0gQm9vbGVhbihvcmlnaW5hbCk7XG4gIGNvbnN0IGJhc2VCb2R5ID0ge1xuICAgIGFjdGlvbjogaXNVcGRhdGUgPyAndXBkYXRlJyA6ICdhZGQnLFxuICAgIHNraWxsOiBpc1VwZGF0ZSA/IG9yaWdpbmFsIDogc2tpbGwsXG4gICAgLi4uKGlzVXBkYXRlID8geyBza2lsbF9uZXc6IHNraWxsIH0gOiB7fSksXG4gICAgZXhwZXJpZW5jZXMsXG4gICAgYWxpYXNlcyxcbiAgICB5ZWFycyxcbiAgfTtcbiAgY29uc3QgYm9keSA9IGlzRmxhdCA/IGJhc2VCb2R5IDogeyAuLi5iYXNlQm9keSwgY2F0ZWdvcnkgfTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvc2tpbGwnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBjbG9zZVNraWxsTW9kYWwoKTtcbiAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ1NraWxscycsIGRhdGEuYWN0aW9uIHx8ICd1cGRhdGVkJyk7XG4gICAgICBhd2FpdCBwb3B1bGF0ZU1hc3RlclRhYigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgZGF0YS5lcnJvciB8fCAnQ291bGQgbm90IGFkZCBza2lsbCcpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIGFkZCBza2lsbCcpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZU1hc3RlclNraWxsKHNraWxsLCBjYXRlZ29yeSwgaXNGbGF0KSB7XG4gIGNvbnN0IGJvZHkgPSBpc0ZsYXQgPyB7IGFjdGlvbjogJ2RlbGV0ZScsIHNraWxsIH0gOiB7IGFjdGlvbjogJ2RlbGV0ZScsIHNraWxsLCBjYXRlZ29yeSB9O1xuICBjb25zdCBzY29wZSA9IGlzRmxhdCA/ICdTa2lsbHMnIDogYFNraWxscyBcdTIxOTIgJHtjYXRlZ29yeX1gO1xuICBzaG93Q29uZmlybU1vZGFsKFxuICAgICdcdUQ4M0RcdURERDFcdUZFMEYgRGVsZXRlIFNraWxsJyxcbiAgICBgRGVsZXRlIHNraWxsIFwiJHtza2lsbH1cIiBmcm9tICR7c2NvcGV9PyBUaGlzIGNhbm5vdCBiZSB1bmRvbmUuYCxcbiAgICBhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvc2tpbGwnLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LCBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICBpZiAoZGF0YS5vaykge1xuICAgICAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ1NraWxscycsIGRhdGEuYWN0aW9uIHx8ICd1cGRhdGVkJyk7XG4gICAgICAgICAgYXdhaXQgcG9wdWxhdGVNYXN0ZXJUYWIoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgZGF0YS5lcnJvciB8fCAnQ291bGQgbm90IHJlbW92ZSBza2lsbCcpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIHJlbW92ZSBza2lsbCcpO1xuICAgICAgfVxuICAgIH1cbiAgKTtcbn1cblxuLy8gLS0tLSBFZHVjYXRpb24gbW9kYWwgaGFuZGxlcnMgLS0tLVxuXG5mdW5jdGlvbiBzaG93QWRkRWR1Y2F0aW9uTW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtbW9kYWwtaWR4JykudmFsdWUgICAgICAgICAgICA9ICctMSc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtZGVncmVlLWlucHV0JykudmFsdWUgICAgICAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LWZpZWxkLWlucHV0JykudmFsdWUgICAgICAgICAgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkdS1pbnN0aXR1dGlvbi1pbnB1dCcpLnZhbHVlICAgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtY2l0eS1pbnB1dCcpLnZhbHVlICAgICAgICAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LXN0YXRlLWlucHV0JykudmFsdWUgICAgICAgICAgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkdS1zdGFydC15ZWFyLWlucHV0JykudmFsdWUgICAgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtZW5kLXllYXItaW5wdXQnKS52YWx1ZSAgICAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWVkdS1tb2RhbC10aXRsZScpLnRleHRDb250ZW50ID0gJ0FkZCBFZHVjYXRpb24nO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWVkdS1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBzZXRJbml0aWFsRm9jdXMoJ21hc3Rlci1lZHUtbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ21hc3Rlci1lZHUtbW9kYWwtb3ZlcmxheScpO1xufVxuXG5mdW5jdGlvbiBlZGl0TWFzdGVyRWR1Y2F0aW9uKGVkdSwgaWR4KSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtbW9kYWwtaWR4JykudmFsdWUgICAgICAgICA9IGlkeDtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkdS1kZWdyZWUtaW5wdXQnKS52YWx1ZSAgICAgID0gZWR1LmRlZ3JlZSB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkdS1maWVsZC1pbnB1dCcpLnZhbHVlICAgICAgID0gZWR1LmZpZWxkIHx8ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LWluc3RpdHV0aW9uLWlucHV0JykudmFsdWUgPSBlZHUuaW5zdGl0dXRpb24gfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtY2l0eS1pbnB1dCcpLnZhbHVlICAgICAgICA9IGVkdS5jaXR5IHx8ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LXN0YXRlLWlucHV0JykudmFsdWUgICAgICAgPSBlZHUuc3RhdGUgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtc3RhcnQteWVhci1pbnB1dCcpLnZhbHVlICA9IGVkdS5zdGFydF95ZWFyIHx8ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LWVuZC15ZWFyLWlucHV0JykudmFsdWUgICAgPSBlZHUuZW5kX3llYXIgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItZWR1LW1vZGFsLXRpdGxlJykudGV4dENvbnRlbnQgPSAnRWRpdCBFZHVjYXRpb24nO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWVkdS1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBzZXRJbml0aWFsRm9jdXMoJ21hc3Rlci1lZHUtbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ21hc3Rlci1lZHUtbW9kYWwtb3ZlcmxheScpO1xufVxuXG5mdW5jdGlvbiBjbG9zZUVkdWNhdGlvbk1vZGFsKCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWVkdS1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgcmVzdG9yZUZvY3VzKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNhdmVNYXN0ZXJFZHVjYXRpb24oKSB7XG4gIGNvbnN0IGlkeCAgICAgPSBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LW1vZGFsLWlkeCcpLnZhbHVlLCAxMCk7XG4gIGNvbnN0IGRlZ3JlZSAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LWRlZ3JlZS1pbnB1dCcpLnZhbHVlLnRyaW0oKTtcbiAgY29uc3QgaW5zdGl0dXRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LWluc3RpdHV0aW9uLWlucHV0JykudmFsdWUudHJpbSgpO1xuICBpZiAoIWRlZ3JlZSB8fCAhaW5zdGl0dXRpb24pIHtcbiAgICBzaG93QWxlcnRNb2RhbCgnXHUyNkEwXHVGRTBGIFZhbGlkYXRpb24nLCAnRGVncmVlIGFuZCBpbnN0aXR1dGlvbiBhcmUgcmVxdWlyZWQuJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGFjdGlvbiA9IGlkeCA+PSAwID8gJ3VwZGF0ZScgOiAnYWRkJztcbiAgY29uc3QgYm9keSA9IHtcbiAgICBhY3Rpb24sXG4gICAgZGVncmVlLFxuICAgIGZpZWxkOiAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LWZpZWxkLWlucHV0JykudmFsdWUudHJpbSgpLFxuICAgIGluc3RpdHV0aW9uLFxuICAgIGNpdHk6ICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LWNpdHktaW5wdXQnKS52YWx1ZS50cmltKCksXG4gICAgc3RhdGU6ICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtc3RhdGUtaW5wdXQnKS52YWx1ZS50cmltKCksXG4gICAgc3RhcnRfeWVhcjogIHBhcnNlSW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtc3RhcnQteWVhci1pbnB1dCcpLnZhbHVlLCAxMCkgfHwgbnVsbCxcbiAgICBlbmRfeWVhcjogICAgcGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkdS1lbmQteWVhci1pbnB1dCcpLnZhbHVlLCAxMCkgfHwgbnVsbCxcbiAgICAuLi4oYWN0aW9uID09PSAndXBkYXRlJyA/IHsgaWR4IH0gOiB7fSksXG4gIH07XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL2VkdWNhdGlvbicsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSwgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEub2spIHtcbiAgICAgIGNsb3NlRWR1Y2F0aW9uTW9kYWwoKTtcbiAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ0VkdWNhdGlvbicsIGRhdGEuYWN0aW9uIHx8ICd1cGRhdGVkJyk7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzA1IFNhdmVkJywgYEVkdWNhdGlvbiBcIiR7ZGVncmVlfSBcdTIwMTMgJHtpbnN0aXR1dGlvbn1cIiAke2RhdGEuYWN0aW9ufS5gKTtcbiAgICAgIGF3YWl0IHBvcHVsYXRlTWFzdGVyVGFiKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCBkYXRhLmVycm9yIHx8ICdTYXZlIGZhaWxlZCcpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIHNhdmUgZWR1Y2F0aW9uJyk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlTWFzdGVyRWR1Y2F0aW9uKGlkeCwgaW5zdGl0dXRpb24pIHtcbiAgc2hvd0NvbmZpcm1Nb2RhbChcbiAgICAnXHVEODNEXHVEREQxXHVGRTBGIERlbGV0ZSBFZHVjYXRpb24nLFxuICAgIGBEZWxldGUgXCIke2luc3RpdHV0aW9ufVwiPyBUaGlzIGNhbm5vdCBiZSB1bmRvbmUuYCxcbiAgICBhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvZWR1Y2F0aW9uJywge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGFjdGlvbjogJ2RlbGV0ZScsIGlkeCB9KSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICBpZiAoZGF0YS5vaykge1xuICAgICAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ0VkdWNhdGlvbicsIGRhdGEuYWN0aW9uIHx8ICdkZWxldGVkJyk7XG4gICAgICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjcwNSBEZWxldGVkJywgYEVkdWNhdGlvbiBlbnRyeSByZW1vdmVkLmApO1xuICAgICAgICAgIGF3YWl0IHBvcHVsYXRlTWFzdGVyVGFiKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsIGRhdGEuZXJyb3IgfHwgJ0RlbGV0ZSBmYWlsZWQnKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgJ0ZhaWxlZCB0byBkZWxldGUgZWR1Y2F0aW9uIGVudHJ5Jyk7XG4gICAgICB9XG4gICAgfVxuICApO1xufVxuXG4vLyAtLS0tIEF3YXJkIG1vZGFsIGhhbmRsZXJzIC0tLS1cblxuZnVuY3Rpb24gc2hvd0FkZEF3YXJkTW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhd2FyZC1tb2RhbC1pZHgnKS52YWx1ZSAgICA9ICctMSc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhd2FyZC10aXRsZS1pbnB1dCcpLnZhbHVlICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXdhcmQteWVhci1pbnB1dCcpLnZhbHVlICAgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F3YXJkLWRlc2MtaW5wdXQnKS52YWx1ZSAgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhd2FyZC1yZWxldmFudC1pbnB1dCcpLnZhbHVlID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItYXdhcmQtbW9kYWwtdGl0bGUnKS50ZXh0Q29udGVudCA9ICdBZGQgQXdhcmQgLyBIb25vdXInO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWF3YXJkLW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICBfZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIHNldEluaXRpYWxGb2N1cygnbWFzdGVyLWF3YXJkLW1vZGFsLW92ZXJsYXknKTtcbiAgdHJhcEZvY3VzKCdtYXN0ZXItYXdhcmQtbW9kYWwtb3ZlcmxheScpO1xufVxuXG5mdW5jdGlvbiBlZGl0TWFzdGVyQXdhcmQoYXdhcmQsIGlkeCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXdhcmQtbW9kYWwtaWR4JykudmFsdWUgICAgID0gaWR4O1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXdhcmQtdGl0bGUtaW5wdXQnKS52YWx1ZSAgID0gYXdhcmQudGl0bGUgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhd2FyZC15ZWFyLWlucHV0JykudmFsdWUgICAgPSBhd2FyZC55ZWFyIHx8ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXdhcmQtZGVzYy1pbnB1dCcpLnZhbHVlICAgID0gYXdhcmQuZGVzY3JpcHRpb24gfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhd2FyZC1yZWxldmFudC1pbnB1dCcpLnZhbHVlID0gdHlwZW9mIGF3YXJkLnJlbGV2YW50X2ZvciA9PT0gJ3N0cmluZydcbiAgICA/IGF3YXJkLnJlbGV2YW50X2ZvciA6IChhd2FyZC5yZWxldmFudF9mb3IgfHwgW10pLmpvaW4oJywgJyk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItYXdhcmQtbW9kYWwtdGl0bGUnKS50ZXh0Q29udGVudCA9ICdFZGl0IEF3YXJkIC8gSG9ub3VyJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1hd2FyZC1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBzZXRJbml0aWFsRm9jdXMoJ21hc3Rlci1hd2FyZC1tb2RhbC1vdmVybGF5Jyk7XG4gIHRyYXBGb2N1cygnbWFzdGVyLWF3YXJkLW1vZGFsLW92ZXJsYXknKTtcbn1cblxuZnVuY3Rpb24gY2xvc2VBd2FyZE1vZGFsKCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWF3YXJkLW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICByZXN0b3JlRm9jdXMoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZU1hc3RlckF3YXJkKCkge1xuICBjb25zdCBpZHggICA9IHBhcnNlSW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhd2FyZC1tb2RhbC1pZHgnKS52YWx1ZSwgMTApO1xuICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhd2FyZC10aXRsZS1pbnB1dCcpLnZhbHVlLnRyaW0oKTtcbiAgaWYgKCF0aXRsZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI2QTBcdUZFMEYgVmFsaWRhdGlvbicsICdBd2FyZCB0aXRsZSBpcyByZXF1aXJlZC4nKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgYWN0aW9uID0gaWR4ID49IDAgPyAndXBkYXRlJyA6ICdhZGQnO1xuICBjb25zdCByZWxldmFudFJhdyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhd2FyZC1yZWxldmFudC1pbnB1dCcpLnZhbHVlO1xuICBjb25zdCBib2R5ID0ge1xuICAgIGFjdGlvbiwgdGl0bGUsXG4gICAgeWVhcjogICAgICAgICBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXdhcmQteWVhci1pbnB1dCcpLnZhbHVlLCAxMCkgfHwgbnVsbCxcbiAgICBkZXNjcmlwdGlvbjogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhd2FyZC1kZXNjLWlucHV0JykudmFsdWUudHJpbSgpLFxuICAgIHJlbGV2YW50X2ZvcjogcmVsZXZhbnRSYXcuc3BsaXQoJywnKS5tYXAocyA9PiBzLnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pLFxuICAgIC4uLihhY3Rpb24gPT09ICd1cGRhdGUnID8geyBpZHggfSA6IHt9KSxcbiAgfTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvYXdhcmQnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBjbG9zZUF3YXJkTW9kYWwoKTtcbiAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ0F3YXJkcyAmIEhvbm91cnMnLCBkYXRhLmFjdGlvbiB8fCAndXBkYXRlZCcpO1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjcwNSBTYXZlZCcsIGBBd2FyZCBcIiR7dGl0bGV9XCIgJHtkYXRhLmFjdGlvbn0uYCk7XG4gICAgICBhd2FpdCBwb3B1bGF0ZU1hc3RlclRhYigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgZGF0YS5lcnJvciB8fCAnU2F2ZSBmYWlsZWQnKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgJ0ZhaWxlZCB0byBzYXZlIGF3YXJkJyk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlTWFzdGVyQXdhcmQoaWR4LCB0aXRsZSkge1xuICBzaG93Q29uZmlybU1vZGFsKFxuICAgICdcdUQ4M0RcdURERDFcdUZFMEYgRGVsZXRlIEF3YXJkJyxcbiAgICBgRGVsZXRlIFwiJHt0aXRsZX1cIj8gVGhpcyBjYW5ub3QgYmUgdW5kb25lLmAsXG4gICAgYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL2F3YXJkJywge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGFjdGlvbjogJ2RlbGV0ZScsIGlkeCB9KSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICBpZiAoZGF0YS5vaykge1xuICAgICAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ0F3YXJkcyAmIEhvbm91cnMnLCBkYXRhLmFjdGlvbiB8fCAnZGVsZXRlZCcpO1xuICAgICAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3MDUgRGVsZXRlZCcsIGBBd2FyZCByZW1vdmVkLmApO1xuICAgICAgICAgIGF3YWl0IHBvcHVsYXRlTWFzdGVyVGFiKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsIGRhdGEuZXJyb3IgfHwgJ0RlbGV0ZSBmYWlsZWQnKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgJ0ZhaWxlZCB0byBkZWxldGUgYXdhcmQnKTtcbiAgICAgIH1cbiAgICB9XG4gICk7XG59XG5cbi8vIC0tLS0gQ2VydGlmaWNhdGlvbiBDUlVEIGhhbmRsZXJzIC0tLS1cblxuZnVuY3Rpb24gc2hvd0FkZENlcnRpZmljYXRpb25Nb2RhbCgpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NlcnQtbW9kYWwtaWR4JykudmFsdWUgICAgPSAnLTEnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2VydC1uYW1lLWlucHV0JykudmFsdWUgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2VydC1pc3N1ZXItaW5wdXQnKS52YWx1ZSA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2VydC15ZWFyLWlucHV0JykudmFsdWUgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWNlcnQtbW9kYWwtdGl0bGUnKS50ZXh0Q29udGVudCA9ICdBZGQgQ2VydGlmaWNhdGlvbic7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItY2VydC1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBzZXRJbml0aWFsRm9jdXMoJ21hc3Rlci1jZXJ0LW1vZGFsLW92ZXJsYXknKTtcbiAgdHJhcEZvY3VzKCdtYXN0ZXItY2VydC1tb2RhbC1vdmVybGF5Jyk7XG59XG5cbmZ1bmN0aW9uIGVkaXRNYXN0ZXJDZXJ0aWZpY2F0aW9uKGNlcnQsIGlkeCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2VydC1tb2RhbC1pZHgnKS52YWx1ZSAgICA9IGlkeDtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NlcnQtbmFtZS1pbnB1dCcpLnZhbHVlICAgPSBjZXJ0Lm5hbWUgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjZXJ0LWlzc3Vlci1pbnB1dCcpLnZhbHVlID0gY2VydC5pc3N1ZXIgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjZXJ0LXllYXItaW5wdXQnKS52YWx1ZSAgID0gY2VydC55ZWFyIHx8ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWNlcnQtbW9kYWwtdGl0bGUnKS50ZXh0Q29udGVudCA9ICdFZGl0IENlcnRpZmljYXRpb24nO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWNlcnQtbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgc2V0SW5pdGlhbEZvY3VzKCdtYXN0ZXItY2VydC1tb2RhbC1vdmVybGF5Jyk7XG4gIHRyYXBGb2N1cygnbWFzdGVyLWNlcnQtbW9kYWwtb3ZlcmxheScpO1xufVxuXG5mdW5jdGlvbiBjbG9zZUNlcnRpZmljYXRpb25Nb2RhbCgpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1jZXJ0LW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICByZXN0b3JlRm9jdXMoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZU1hc3RlckNlcnRpZmljYXRpb24oKSB7XG4gIGNvbnN0IGlkeCAgPSBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2VydC1tb2RhbC1pZHgnKS52YWx1ZSwgMTApO1xuICBjb25zdCBuYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NlcnQtbmFtZS1pbnB1dCcpLnZhbHVlLnRyaW0oKTtcbiAgaWYgKCFuYW1lKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjZBMFx1RkUwRiBWYWxpZGF0aW9uJywgJ0NlcnRpZmljYXRpb24gbmFtZSBpcyByZXF1aXJlZC4nKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgYWN0aW9uID0gaWR4ID49IDAgPyAndXBkYXRlJyA6ICdhZGQnO1xuICBjb25zdCBib2R5ID0ge1xuICAgIGFjdGlvbiwgbmFtZSxcbiAgICBpc3N1ZXI6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjZXJ0LWlzc3Vlci1pbnB1dCcpLnZhbHVlLnRyaW0oKSxcbiAgICB5ZWFyOiAgIHBhcnNlSW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjZXJ0LXllYXItaW5wdXQnKS52YWx1ZSwgMTApIHx8IG51bGwsXG4gICAgLi4uKGFjdGlvbiA9PT0gJ3VwZGF0ZScgPyB7IGlkeCB9IDoge30pLFxuICB9O1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS9jZXJ0aWZpY2F0aW9uJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LCBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgY2xvc2VDZXJ0aWZpY2F0aW9uTW9kYWwoKTtcbiAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ0NlcnRpZmljYXRpb25zJywgZGF0YS5hY3Rpb24gfHwgJ3VwZGF0ZWQnKTtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3MDUgU2F2ZWQnLCBgQ2VydGlmaWNhdGlvbiBcIiR7bmFtZX1cIiAke2RhdGEuYWN0aW9ufS5gKTtcbiAgICAgIGF3YWl0IHBvcHVsYXRlTWFzdGVyVGFiKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCBkYXRhLmVycm9yIHx8ICdTYXZlIGZhaWxlZCcpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIHNhdmUgY2VydGlmaWNhdGlvbicpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZU1hc3RlckNlcnRpZmljYXRpb24oaWR4LCBuYW1lKSB7XG4gIHNob3dDb25maXJtTW9kYWwoXG4gICAgJ1x1RDgzRFx1REREMVx1RkUwRiBEZWxldGUgQ2VydGlmaWNhdGlvbicsXG4gICAgYERlbGV0ZSBcIiR7bmFtZX1cIj8gVGhpcyBjYW5ub3QgYmUgdW5kb25lLmAsXG4gICAgYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL2NlcnRpZmljYXRpb24nLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgYWN0aW9uOiAnZGVsZXRlJywgaWR4IH0pLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICAgICAgX3NldE1hc3RlckNoYW5nZU5vdGljZSgnQ2VydGlmaWNhdGlvbnMnLCBkYXRhLmFjdGlvbiB8fCAnZGVsZXRlZCcpO1xuICAgICAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3MDUgRGVsZXRlZCcsIGBDZXJ0aWZpY2F0aW9uIHJlbW92ZWQuYCk7XG4gICAgICAgICAgYXdhaXQgcG9wdWxhdGVNYXN0ZXJUYWIoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgZGF0YS5lcnJvciB8fCAnRGVsZXRlIGZhaWxlZCcpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIGRlbGV0ZSBjZXJ0aWZpY2F0aW9uJyk7XG4gICAgICB9XG4gICAgfVxuICApO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgQmFja3VwIEhpc3RvcnkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIG9wZW5CYWNrdXBIaXN0b3J5TW9kYWwoKSB7XG4gIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgb3ZlcmxheS5pZCA9ICdiYWNrdXAtaGlzdG9yeS1vdmVybGF5JztcbiAgb3ZlcmxheS5zdHlsZS5jc3NUZXh0ID0gJ3Bvc2l0aW9uOmZpeGVkO2luc2V0OjA7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLDAuNSk7ei1pbmRleDoxMDAwMDtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7JztcbiAgb3ZlcmxheS5pbm5lckhUTUwgPSBgXG4gICAgPGRpdiByb2xlPVwiZGlhbG9nXCIgYXJpYS1tb2RhbD1cInRydWVcIiBhcmlhLWxhYmVsbGVkYnk9XCJiYWNrdXAtbW9kYWwtdGl0bGVcIlxuICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZmY7Ym9yZGVyLXJhZGl1czoxMHB4O3BhZGRpbmc6MjRweCAyOHB4O21heC13aWR0aDo1NjBweDt3aWR0aDo5NCU7XG4gICAgICAgICAgICAgICAgbWF4LWhlaWdodDo4MHZoO292ZXJmbG93LXk6YXV0bztib3gtc2hhZG93OjAgMjBweCA2MHB4IHJnYmEoMCwwLDAsMC4zKTtcIj5cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO21hcmdpbi1ib3R0b206MTZweDtcIj5cbiAgICAgICAgPGgzIGlkPVwiYmFja3VwLW1vZGFsLXRpdGxlXCIgc3R5bGU9XCJtYXJnaW46MDtmb250LXNpemU6MS4xZW07Y29sb3I6IzFlMjkzYjtcIj5cdUQ4M0RcdURENTAgQmFja3VwIEhpc3Rvcnk8L2gzPlxuICAgICAgICA8YnV0dG9uIGlkPVwiYmFja3VwLW1vZGFsLWNsb3NlXCIgc3R5bGU9XCJiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOm5vbmU7Zm9udC1zaXplOjEuM2VtO2N1cnNvcjpwb2ludGVyO2NvbG9yOiM2NDc0OGI7XCIgYXJpYS1sYWJlbD1cIkNsb3NlXCI+XHUyNzE1PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxwIHN0eWxlPVwiZm9udC1zaXplOjAuODhlbTtjb2xvcjojNjQ3NDhiO21hcmdpbi1ib3R0b206MTZweDtcIj5cbiAgICAgICAgQSBiYWNrdXAgaXMgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IGJlZm9yZSBldmVyeSBzYXZlLiBSZXN0b3Jpbmcgd2lsbCBwcmVzZXJ2ZSB0aGUgY3VycmVudCB2ZXJzaW9uIGFzIGEgbmV3IGJhY2t1cCBmaXJzdC5cbiAgICAgIDwvcD5cbiAgICAgIDxkaXYgaWQ9XCJiYWNrdXAtbGlzdC1ib2R5XCIgc3R5bGU9XCJmb250LXNpemU6MC45ZW07XCI+TG9hZGluZ1x1MjAyNjwvZGl2PlxuICAgIDwvZGl2PmA7XG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQob3ZlcmxheSk7XG4gIGlmICh0eXBlb2YgdHJhcEZvY3VzID09PSAnZnVuY3Rpb24nKSB0cmFwRm9jdXMoJ2JhY2t1cC1oaXN0b3J5LW92ZXJsYXknKTtcbiAgY29uc3QgY2xvc2UgPSAoKSA9PiB7IG92ZXJsYXkucmVtb3ZlKCk7IGlmICh0eXBlb2YgcmVzdG9yZUZvY3VzID09PSAnZnVuY3Rpb24nKSByZXN0b3JlRm9jdXMoKTsgfTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhY2t1cC1tb2RhbC1jbG9zZScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xvc2UpO1xuICBvdmVybGF5LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZSA9PiB7IGlmIChlLnRhcmdldCA9PT0gb3ZlcmxheSkgY2xvc2UoKTsgfSk7XG4gIG92ZXJsYXkuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGUgPT4geyBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSBjbG9zZSgpOyB9KTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL2hpc3RvcnknKTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBjb25zdCBib2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhY2t1cC1saXN0LWJvZHknKTtcbiAgICBpZiAoIWJvZHkpIHJldHVybjtcbiAgICBpZiAoIWRhdGEub2sgfHwgIWRhdGEuc25hcHNob3RzPy5sZW5ndGgpIHtcbiAgICAgIGJvZHkudGV4dENvbnRlbnQgPSAnTm8gYmFja3VwcyBmb3VuZC4nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByb3dzID0gZGF0YS5zbmFwc2hvdHMubWFwKHMgPT4ge1xuICAgICAgY29uc3QgZHQgPSBuZXcgRGF0ZShzLm10aW1lICogMTAwMCkudG9Mb2NhbGVTdHJpbmcoKTtcbiAgICAgIGNvbnN0IGtiID0gKHMuc2l6ZSAvIDEwMjQpLnRvRml4ZWQoMSk7XG4gICAgICByZXR1cm4gYDx0cj5cbiAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzo2cHggOHB4O2NvbG9yOiMxZTI5M2I7XCI+JHtlc2NhcGVIdG1sKGR0KX08L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOjZweCA4cHg7Y29sb3I6IzY0NzQ4Yjt3aGl0ZS1zcGFjZTpub3dyYXA7XCI+JHtrYn0gS0I8L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOjZweCA4cHg7XCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG4gc2Vjb25kYXJ5XCIgc3R5bGU9XCJwYWRkaW5nOjNweCAxMHB4O2ZvbnQtc2l6ZTowLjgyZW07XCJcbiAgICAgICAgICAgIG9uY2xpY2s9XCJyZXN0b3JlQmFja3VwKCR7SlNPTi5zdHJpbmdpZnkocy5maWxlbmFtZSl9KVwiPlJlc3RvcmU8L2J1dHRvbj5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvdHI+YDtcbiAgICB9KS5qb2luKCcnKTtcbiAgICBib2R5LmlubmVySFRNTCA9IGA8dGFibGUgc3R5bGU9XCJ3aWR0aDoxMDAlO2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTtcIj5cbiAgICAgIDx0aGVhZD48dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZTJlOGYwO1wiPlxuICAgICAgICA8dGggc3R5bGU9XCJwYWRkaW5nOjRweCA4cHg7dGV4dC1hbGlnbjpsZWZ0O2NvbG9yOiM0NzU1Njk7Zm9udC13ZWlnaHQ6NjAwO1wiPlNhdmVkPC90aD5cbiAgICAgICAgPHRoIHN0eWxlPVwicGFkZGluZzo0cHggOHB4O3RleHQtYWxpZ246bGVmdDtjb2xvcjojNDc1NTY5O2ZvbnQtd2VpZ2h0OjYwMDtcIj5TaXplPC90aD5cbiAgICAgICAgPHRoPjwvdGg+XG4gICAgICA8L3RyPjwvdGhlYWQ+XG4gICAgICA8dGJvZHk+JHtyb3dzfTwvdGJvZHk+XG4gICAgPC90YWJsZT5gO1xuICB9IGNhdGNoIChfKSB7XG4gICAgY29uc3QgYm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYWNrdXAtbGlzdC1ib2R5Jyk7XG4gICAgaWYgKGJvZHkpIGJvZHkudGV4dENvbnRlbnQgPSAnRmFpbGVkIHRvIGxvYWQgYmFja3VwIGhpc3RvcnkuJztcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZXN0b3JlQmFja3VwKGZpbGVuYW1lKSB7XG4gIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0ICh0eXBlb2YgY29uZmlybURpYWxvZyA9PT0gJ2Z1bmN0aW9uJ1xuICAgID8gY29uZmlybURpYWxvZygnUmVzdG9yZSB0aGlzIGJhY2t1cD8gVGhlIGN1cnJlbnQgdmVyc2lvbiB3aWxsIGJlIHNhdmVkIGFzIGEgbmV3IGJhY2t1cCBmaXJzdC4nKVxuICAgIDogUHJvbWlzZS5yZXNvbHZlKHdpbmRvdy5jb25maXJtKCdSZXN0b3JlIHRoaXMgYmFja3VwPyBUaGUgY3VycmVudCB2ZXJzaW9uIHdpbGwgYmUgc2F2ZWQgYXMgYSBuZXcgYmFja3VwIGZpcnN0LicpKSk7XG4gIGlmICghY29uZmlybWVkKSByZXR1cm47XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvcmVzdG9yZScsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGZpbGVuYW1lIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja3VwLWhpc3Rvcnktb3ZlcmxheScpPy5yZW1vdmUoKTtcbiAgICAgIGlmICh0eXBlb2YgcmVzdG9yZUZvY3VzID09PSAnZnVuY3Rpb24nKSByZXN0b3JlRm9jdXMoKTtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3MDUgUmVzdG9yZWQnLCAnTWFzdGVyIENWIHJlc3RvcmVkIGZyb20gYmFja3VwLiBSZWxvYWQgdGhlIHRhYiB0byBzZWUgdGhlIHVwZGF0ZWQgZGF0YS4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsIGRhdGEuZXJyb3IgfHwgJ1Jlc3RvcmUgZmFpbGVkLicpO1xuICAgIH1cbiAgfSBjYXRjaCAoXykge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIHJlc3RvcmUgYmFja3VwLicpO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBVbmRvIC8gUmVkbyAoR0FQLTE5IDE2LjcpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuLy8gU2luZ2xlLWxldmVsOiBVbmRvIHJlc3RvcmVzIHRoZSBtb3N0IHJlY2VudCBiYWNrdXAgc25hcHNob3QgKGkuZS4gdGhlXG4vLyBzdGF0ZSBiZWZvcmUgdGhlIGxhc3Qgc2F2ZSk7IFJlZG8gcmVzdG9yZXMgdGhlIHNhZmV0eSBiYWNrdXAgdGhlIHJlc3RvcmVcbi8vIGVuZHBvaW50IHRvb2sgb2YgdGhlIHByZS11bmRvIHN0YXRlLiBCb3RoIHJldXNlIHRoZSBleGlzdGluZ1xuLy8gL2FwaS9tYXN0ZXItZGF0YS9oaXN0b3J5ICsgL2FwaS9tYXN0ZXItZGF0YS9yZXN0b3JlIGVuZHBvaW50cyByYXRoZXIgdGhhblxuLy8gYWRkaW5nIG5ldyBiYWNrZW5kIHN1cmZhY2UgXHUyMDE0IHNlZSBfbWFzdGVyQ3ZSZWRvQmFja3VwIGFib3ZlIGZvciB0aGUgcmVzZXRcbi8vIGNvbnRyYWN0IHdpdGggcG9wdWxhdGVNYXN0ZXJUYWIoKS5cblxuYXN5bmMgZnVuY3Rpb24gdW5kb01hc3RlckRhdGFDaGFuZ2UoKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvaGlzdG9yeScpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmICghZGF0YS5vayB8fCAhZGF0YS5zbmFwc2hvdHM/Lmxlbmd0aCkge1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjEzOVx1RkUwRiBOb3RoaW5nIHRvIHVuZG8nLCAnTm8gYmFja3VwIHNuYXBzaG90cyBhcmUgYXZhaWxhYmxlIHlldC4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbW9zdFJlY2VudCA9IGRhdGEuc25hcHNob3RzWzBdOyAvLyBoaXN0b3J5IHJvdXRlIHJldHVybnMgbmV3ZXN0LWZpcnN0XG4gICAgY29uc3Qgd2hlbiA9IG5ldyBEYXRlKG1vc3RSZWNlbnQubXRpbWUgKiAxMDAwKS50b0xvY2FsZVN0cmluZygpO1xuICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0ICh0eXBlb2YgY29uZmlybURpYWxvZyA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgPyBjb25maXJtRGlhbG9nKGBVbmRvIHRoZSBtb3N0IHJlY2VudCBjaGFuZ2U/IFRoaXMgcmVzdG9yZXMgdGhlIHZlcnNpb24gc2F2ZWQgJHt3aGVufS4gVGhlIGN1cnJlbnQgdmVyc2lvbiB3aWxsIGJlIHNhdmVkIGFzIGEgbmV3IGJhY2t1cCBmaXJzdC5gKVxuICAgICAgOiBQcm9taXNlLnJlc29sdmUod2luZG93LmNvbmZpcm0oYFVuZG8gdGhlIG1vc3QgcmVjZW50IGNoYW5nZT8gVGhpcyByZXN0b3JlcyB0aGUgdmVyc2lvbiBzYXZlZCAke3doZW59LmApKSk7XG4gICAgaWYgKCFjb25maXJtZWQpIHJldHVybjtcblxuICAgIGNvbnN0IHJlc3RvcmVSZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS9yZXN0b3JlJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgZmlsZW5hbWU6IG1vc3RSZWNlbnQuZmlsZW5hbWUgfSksXG4gICAgfSk7XG4gICAgY29uc3QgcmVzdG9yZURhdGEgPSBhd2FpdCByZXN0b3JlUmVzLmpzb24oKTtcbiAgICBpZiAocmVzdG9yZURhdGEub2spIHtcbiAgICAgIC8vIE11c3QgYmUgc2V0ICpiZWZvcmUqIHBvcHVsYXRlTWFzdGVyVGFiKCkgcmVuZGVycyB0aGUgUmVkbyBidXR0b24sXG4gICAgICAvLyBub3QgYWZ0ZXIgXHUyMDE0IHRoZSBidXR0b24ncyBkaXNhYmxlZCBzdGF0ZSBpcyBiYWtlZCBpbnRvIHRoYXQgcmVuZGVyLlxuICAgICAgX21hc3RlckN2UmVkb0JhY2t1cCA9IHJlc3RvcmVEYXRhLnNhZmV0eV9iYWNrdXAgfHwgbnVsbDtcbiAgICAgIF9tYXN0ZXJDdlN1cHByZXNzUmVkb1Jlc2V0ID0gdHJ1ZTtcbiAgICAgIGF3YWl0IHBvcHVsYXRlTWFzdGVyVGFiKCk7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzA1IFVuZG9uZScsICdNYXN0ZXIgQ1YgcmV2ZXJ0ZWQgdG8gdGhlIHByZXZpb3VzIHNhdmVkIHZlcnNpb24uJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCByZXN0b3JlRGF0YS5lcnJvciB8fCAnVW5kbyBmYWlsZWQuJyk7XG4gICAgfVxuICB9IGNhdGNoIChfKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsICdGYWlsZWQgdG8gdW5kby4nKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZWRvTWFzdGVyRGF0YUNoYW5nZSgpIHtcbiAgaWYgKCFfbWFzdGVyQ3ZSZWRvQmFja3VwKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjEzOVx1RkUwRiBOb3RoaW5nIHRvIHJlZG8nLCAnVGhlcmUgaXMgbm8gdW5kb25lIGNoYW5nZSB0byByZXN0b3JlLicpO1xuICAgIHJldHVybjtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL3Jlc3RvcmUnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBmaWxlbmFtZTogX21hc3RlckN2UmVkb0JhY2t1cCB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgLy8gRGVsaWJlcmF0ZWx5IGRvIG5vdCByZS1hcm0gcmVkbyBcdTIwMTQgdGhpcyByZXN0b3JlIGNvbnN1bWVzIHRoZSByZWRvXG4gICAgICAvLyB0YXJnZXQsIGFuZCBwb3B1bGF0ZU1hc3RlclRhYigpJ3MgZGVmYXVsdCByZXNldCBjbGVhcnMgaXQuXG4gICAgICBhd2FpdCBwb3B1bGF0ZU1hc3RlclRhYigpO1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjcwNSBSZWRvbmUnLCAnTWFzdGVyIENWIHJlc3RvcmVkIHRvIHRoZSB2ZXJzaW9uIGJlZm9yZSB0aGUgdW5kby4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsIGRhdGEuZXJyb3IgfHwgJ1JlZG8gZmFpbGVkLicpO1xuICAgIH1cbiAgfSBjYXRjaCAoXykge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIHJlZG8uJyk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZXhwb3J0TWFzdGVyQ1YoKSB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2Vzc2lvbklkID0gd2luZG93Ll9jdXJyZW50U2Vzc2lvbklkO1xuICAgIGNvbnN0IHVybCA9IGAvYXBpL21hc3Rlci1kYXRhL2V4cG9ydCR7c2Vzc2lvbklkID8gYD9zZXNzaW9uX2lkPSR7c2Vzc2lvbklkfWAgOiAnJ31gO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgaWYgKCFyZXMub2spIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRXhwb3J0IGZhaWxlZCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBibG9iID0gYXdhaXQgcmVzLmJsb2IoKTtcbiAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgIGEuaHJlZiA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgYS5kb3dubG9hZCA9ICdNYXN0ZXJfQ1ZfRGF0YS5qc29uJztcbiAgICBhLmNsaWNrKCk7XG4gICAgVVJMLnJldm9rZU9iamVjdFVSTChhLmhyZWYpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsICdGYWlsZWQgdG8gZXhwb3J0IG1hc3RlciBDVicpO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBGdWxsIGRhdGEgcHJldmlldyAoR0FQLTE5IDE2LjE1KSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gb3BlbkZ1bGxEYXRhUHJldmlld01vZGFsKCkge1xuICBjb25zdCBvdmVybGF5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIG92ZXJsYXkuaWQgPSAnbWFzdGVyLWN2LXByZXZpZXctb3ZlcmxheSc7XG4gIG92ZXJsYXkuc3R5bGUuY3NzVGV4dCA9ICdwb3NpdGlvbjpmaXhlZDtpbnNldDowO2JhY2tncm91bmQ6cmdiYSgwLDAsMCwwLjUpO3otaW5kZXg6MTAwMDA7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyOyc7XG4gIG92ZXJsYXkuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgcm9sZT1cImRpYWxvZ1wiIGFyaWEtbW9kYWw9XCJ0cnVlXCIgYXJpYS1sYWJlbGxlZGJ5PVwibWFzdGVyLWN2LXByZXZpZXctdGl0bGVcIlxuICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZmY7Ym9yZGVyLXJhZGl1czoxMHB4O3BhZGRpbmc6MjRweCAyOHB4O21heC13aWR0aDo3NjBweDt3aWR0aDo5NCU7XG4gICAgICAgICAgICAgICAgbWF4LWhlaWdodDo4NXZoO292ZXJmbG93LXk6YXV0bztib3gtc2hhZG93OjAgMjBweCA2MHB4IHJnYmEoMCwwLDAsMC4zKTtcIj5cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO21hcmdpbi1ib3R0b206MTZweDtcIj5cbiAgICAgICAgPGgzIGlkPVwibWFzdGVyLWN2LXByZXZpZXctdGl0bGVcIiBzdHlsZT1cIm1hcmdpbjowO2ZvbnQtc2l6ZToxLjFlbTtjb2xvcjojMWUyOTNiO1wiPlx1RDgzRFx1REM0MSBGdWxsIE1hc3RlciBDViBEYXRhIChyZWFkLW9ubHkpPC9oMz5cbiAgICAgICAgPGJ1dHRvbiBpZD1cIm1hc3Rlci1jdi1wcmV2aWV3LWNsb3NlXCIgc3R5bGU9XCJiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOm5vbmU7Zm9udC1zaXplOjEuM2VtO2N1cnNvcjpwb2ludGVyO2NvbG9yOiM2NDc0OGI7XCIgYXJpYS1sYWJlbD1cIkNsb3NlXCI+XHUyNzE1PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxwIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtjb2xvcjojNjQ3NDhiO21hcmdpbi1ib3R0b206MTJweDtcIj5cbiAgICAgICAgVGhlIGNvbXBsZXRlLCB1bmZpbHRlcmVkIGNvbnRlbnRzIG9mIDxjb2RlPk1hc3Rlcl9DVl9EYXRhLmpzb248L2NvZGU+IFx1MjAxNCBpbmNsdWRpbmcgYW55IGZpZWxkcyB0aGUgc3RydWN0dXJlZCBlZGl0b3JzIGFib3ZlIGRvbid0IHN1cmZhY2UuXG4gICAgICA8L3A+XG4gICAgICA8cHJlIGlkPVwibWFzdGVyLWN2LXByZXZpZXctYm9keVwiIHN0eWxlPVwiYmFja2dyb3VuZDojZjhmYWZjO2JvcmRlcjoxcHggc29saWQgI2UyZThmMDtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjEycHg7Zm9udC1zaXplOjAuOGVtO2xpbmUtaGVpZ2h0OjEuNTt3aGl0ZS1zcGFjZTpwcmUtd3JhcDt3b3JkLWJyZWFrOmJyZWFrLXdvcmQ7XCI+TG9hZGluZ1x1MjAyNjwvcHJlPlxuICAgIDwvZGl2PmA7XG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQob3ZlcmxheSk7XG4gIGlmICh0eXBlb2YgdHJhcEZvY3VzID09PSAnZnVuY3Rpb24nKSB0cmFwRm9jdXMoJ21hc3Rlci1jdi1wcmV2aWV3LW92ZXJsYXknKTtcbiAgY29uc3QgY2xvc2UgPSAoKSA9PiB7IG92ZXJsYXkucmVtb3ZlKCk7IGlmICh0eXBlb2YgcmVzdG9yZUZvY3VzID09PSAnZnVuY3Rpb24nKSByZXN0b3JlRm9jdXMoKTsgfTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1jdi1wcmV2aWV3LWNsb3NlJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjbG9zZSk7XG4gIG92ZXJsYXkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4geyBpZiAoZS50YXJnZXQgPT09IG92ZXJsYXkpIGNsb3NlKCk7IH0pO1xuICBvdmVybGF5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4geyBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSBjbG9zZSgpOyB9KTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL2Z1bGwnKTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBjb25zdCBib2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1jdi1wcmV2aWV3LWJvZHknKTtcbiAgICBpZiAoYm9keSkgYm9keS50ZXh0Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsIDIpO1xuICB9IGNhdGNoIChfKSB7XG4gICAgY29uc3QgYm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItY3YtcHJldmlldy1ib2R5Jyk7XG4gICAgaWYgKGJvZHkpIGJvZHkudGV4dENvbnRlbnQgPSAnRmFpbGVkIHRvIGxvYWQgbWFzdGVyIENWIGRhdGEuJztcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgRnVsbC1maWxlIEpTT04gaW1wb3J0IHdpdGggZGlmZiByZXZpZXcgKEdBUC0xOSAxNi4xNikgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4vL1xuLy8gTm90IGEgbWVyZ2U6IGltcG9ydC1jb25maXJtIHJlcGxhY2VzIHRoZSBlbnRpcmUgZmlsZS4gVGhlIGltcG9ydC1wcmV2aWV3XG4vLyBzdGVwJ3Mgc2VjdGlvbi1sZXZlbCBjaGFuZ2VkL2NvdW50IHN1bW1hcnkgaXMgdGhlIHVzZXIncyBjaGFuY2UgdG8gY2F0Y2hcbi8vIGFuIHVuaW50ZW5kZWQgb3ZlcndyaXRlIGJlZm9yZSBjb25maXJtaW5nIFx1MjAxNCBmdWxsIGZpZWxkLWxldmVsIGRpZmZpbmdcbi8vIHdpdGhpbiBhIGNoYW5nZWQgc2VjdGlvbiBpcyBhIGtub3duIHYxIGxpbWl0YXRpb24gKHRoZSBzYW1lIHBvc3R1cmVcbi8vIGFscmVhZHkgYWNjZXB0ZWQgZm9yIG90aGVyIGFkdmlzb3J5LW9ubHkgcmV2aWV3IHN1cmZhY2VzIGluIHRoaXMgdGFiKS5cblxubGV0IF9tYXN0ZXJDdkltcG9ydERhdGEgPSBudWxsO1xuXG5mdW5jdGlvbiB0cmlnZ2VyTWFzdGVyQ3ZJbXBvcnQoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItY3YtaW1wb3J0LWZpbGUtaW5wdXQnKT8uY2xpY2soKTtcbn1cblxuZnVuY3Rpb24gaGFuZGxlTWFzdGVyQ3ZJbXBvcnRGaWxlKGV2ZW50KSB7XG4gIGNvbnN0IGZpbGUgPSBldmVudC50YXJnZXQ/LmZpbGVzPy5bMF07XG4gIGV2ZW50LnRhcmdldC52YWx1ZSA9ICcnOyAvLyBhbGxvdyByZS1zZWxlY3RpbmcgdGhlIHNhbWUgZmlsZW5hbWUgbGF0ZXJcbiAgaWYgKCFmaWxlKSByZXR1cm47XG4gIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gIHJlYWRlci5vbmxvYWQgPSBhc3luYyAoKSA9PiB7XG4gICAgbGV0IHBhcnNlZDtcbiAgICB0cnkge1xuICAgICAgcGFyc2VkID0gSlNPTi5wYXJzZShTdHJpbmcocmVhZGVyLnJlc3VsdCkpO1xuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnVGhhdCBmaWxlIGlzIG5vdCB2YWxpZCBKU09OLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXBhcnNlZCB8fCB0eXBlb2YgcGFyc2VkICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHBhcnNlZCkpIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRXhwZWN0ZWQgYSBKU09OIG9iamVjdCAoTWFzdGVyX0NWX0RhdGEuanNvbiBzaGFwZSksIG5vdCBhbiBhcnJheSBvciBzY2FsYXIuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IF9zdWJtaXRNYXN0ZXJDdkltcG9ydFByZXZpZXcocGFyc2VkKTtcbiAgfTtcbiAgcmVhZGVyLm9uZXJyb3IgPSAoKSA9PiBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgJ0ZhaWxlZCB0byByZWFkIHRoZSBzZWxlY3RlZCBmaWxlLicpO1xuICByZWFkZXIucmVhZEFzVGV4dChmaWxlKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gX3N1Ym1pdE1hc3RlckN2SW1wb3J0UHJldmlldyhwYXJzZWQpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS9pbXBvcnQtcHJldmlldycsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgZGF0YTogcGFyc2VkIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmICghZGF0YS5vaykge1xuICAgICAgY29uc3QgZGV0YWlsID0gKGRhdGEudmFsaWRhdGlvbl9lcnJvcnMgfHwgW10pLmpvaW4oJzsgJyk7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgZGV0YWlsID8gYCR7ZGF0YS5lcnJvcn06ICR7ZGV0YWlsfWAgOiAoZGF0YS5lcnJvciB8fCAnSW1wb3J0IHByZXZpZXcgZmFpbGVkLicpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgX21hc3RlckN2SW1wb3J0RGF0YSA9IHBhcnNlZDtcbiAgICBfc2hvd01hc3RlckN2SW1wb3J0UHJldmlld01vZGFsKGRhdGEuc2VjdGlvbnMgfHwgW10pO1xuICB9IGNhdGNoIChfKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsICdGYWlsZWQgdG8gcHJldmlldyB0aGUgaW1wb3J0LicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9zaG93TWFzdGVyQ3ZJbXBvcnRQcmV2aWV3TW9kYWwoc2VjdGlvbnMpIHtcbiAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBvdmVybGF5LmlkID0gJ21hc3Rlci1jdi1pbXBvcnQtb3ZlcmxheSc7XG4gIG92ZXJsYXkuc3R5bGUuY3NzVGV4dCA9ICdwb3NpdGlvbjpmaXhlZDtpbnNldDowO2JhY2tncm91bmQ6cmdiYSgwLDAsMCwwLjUpO3otaW5kZXg6MTAwMDA7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyOyc7XG4gIGNvbnN0IGNoYW5nZWRTZWN0aW9ucyA9IHNlY3Rpb25zLmZpbHRlcigocykgPT4gcy5jaGFuZ2VkKTtcbiAgY29uc3Qgcm93cyA9IHNlY3Rpb25zLm1hcCgocykgPT4gYFxuICAgIDx0ciBzdHlsZT1cIiR7cy5jaGFuZ2VkID8gJ2JhY2tncm91bmQ6dmFyKC0tY3Ytd2FybmluZy1iZywgI2ZmZmJlYik7JyA6ICcnfVwiPlxuICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzo2cHggOHB4O2NvbG9yOiMxZTI5M2I7XCI+JHtlc2NhcGVIdG1sKHMuc2VjdGlvbil9PC90ZD5cbiAgICAgIDx0ZCBzdHlsZT1cInBhZGRpbmc6NnB4IDhweDt0ZXh0LWFsaWduOmNlbnRlcjtjb2xvcjojNjQ3NDhiO1wiPiR7cy5jdXJyZW50X2NvdW50fTwvdGQ+XG4gICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOjZweCA4cHg7dGV4dC1hbGlnbjpjZW50ZXI7Y29sb3I6IzY0NzQ4YjtcIj4ke3MubmV3X2NvdW50fTwvdGQ+XG4gICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOjZweCA4cHg7XCI+JHtzLmNoYW5nZWQgPyAnXHUyNkEwIGNoYW5nZWQnIDogJ1x1MjAxNCd9PC90ZD5cbiAgICA8L3RyPmApLmpvaW4oJycpO1xuICBvdmVybGF5LmlubmVySFRNTCA9IGBcbiAgICA8ZGl2IHJvbGU9XCJkaWFsb2dcIiBhcmlhLW1vZGFsPVwidHJ1ZVwiIGFyaWEtbGFiZWxsZWRieT1cIm1hc3Rlci1jdi1pbXBvcnQtdGl0bGVcIlxuICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZmY7Ym9yZGVyLXJhZGl1czoxMHB4O3BhZGRpbmc6MjRweCAyOHB4O21heC13aWR0aDo2NDBweDt3aWR0aDo5NCU7XG4gICAgICAgICAgICAgICAgbWF4LWhlaWdodDo4NXZoO292ZXJmbG93LXk6YXV0bztib3gtc2hhZG93OjAgMjBweCA2MHB4IHJnYmEoMCwwLDAsMC4zKTtcIj5cbiAgICAgIDxoMyBpZD1cIm1hc3Rlci1jdi1pbXBvcnQtdGl0bGVcIiBzdHlsZT1cIm1hcmdpbjowIDAgMTJweDtmb250LXNpemU6MS4xZW07Y29sb3I6IzFlMjkzYjtcIj5cdTJCMDZcdUZFMEYgSW1wb3J0IE1hc3RlciBDViBEYXRhIFx1MjAxNCBSZXZpZXc8L2gzPlxuICAgICAgPGRpdiByb2xlPVwiYWxlcnRcIiBzdHlsZT1cImJhY2tncm91bmQ6I2ZlZjJmMjtib3JkZXI6MXB4IHNvbGlkICNmY2E1YTU7Ym9yZGVyLXJhZGl1czo2cHg7cGFkZGluZzoxMHB4IDE0cHg7bWFyZ2luLWJvdHRvbToxNHB4O2ZvbnQtc2l6ZTowLjg2ZW07Y29sb3I6Izk5MWIxYjtcIj5cbiAgICAgICAgPHN0cm9uZz5UaGlzIHJlcGxhY2VzIHRoZSBlbnRpcmUgZmlsZTwvc3Ryb25nPiwgbm90IGp1c3QgdGhlIGNoYW5nZWQgc2VjdGlvbnMuIEEgYmFja3VwIGlzIGNyZWF0ZWRcbiAgICAgICAgYXV0b21hdGljYWxseSBiZWZvcmUgdGhlIHdyaXRlIFx1MjAxNCBzZWUgXHVEODNEXHVERDUwIEJhY2t1cHMgYWJvdmUgdG8gcmVzdG9yZSBpdCBpZiBuZWVkZWQuXG4gICAgICA8L2Rpdj5cbiAgICAgIDxwIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtjb2xvcjojNjQ3NDhiO21hcmdpbi1ib3R0b206OHB4O1wiPlxuICAgICAgICAke2NoYW5nZWRTZWN0aW9ucy5sZW5ndGggPyBgJHtjaGFuZ2VkU2VjdGlvbnMubGVuZ3RofSBzZWN0aW9uKHMpIHdvdWxkIGNoYW5nZTpgIDogJ05vIHNlY3Rpb25zIHdvdWxkIGNoYW5nZSBcdTIwMTQgdGhlIHVwbG9hZGVkIGZpbGUgbWF0Y2hlcyB0aGUgY3VycmVudCBkYXRhLid9XG4gICAgICA8L3A+XG4gICAgICA8dGFibGUgc3R5bGU9XCJ3aWR0aDoxMDAlO2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTtmb250LXNpemU6MC44NWVtO21hcmdpbi1ib3R0b206MTZweDtcIj5cbiAgICAgICAgPHRoZWFkPjx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206MXB4IHNvbGlkICNlMmU4ZjA7XCI+XG4gICAgICAgICAgPHRoIHN0eWxlPVwicGFkZGluZzo0cHggOHB4O3RleHQtYWxpZ246bGVmdDtjb2xvcjojNDc1NTY5O1wiPlNlY3Rpb248L3RoPlxuICAgICAgICAgIDx0aCBzdHlsZT1cInBhZGRpbmc6NHB4IDhweDtjb2xvcjojNDc1NTY5O1wiPkN1cnJlbnQ8L3RoPlxuICAgICAgICAgIDx0aCBzdHlsZT1cInBhZGRpbmc6NHB4IDhweDtjb2xvcjojNDc1NTY5O1wiPk5ldzwvdGg+XG4gICAgICAgICAgPHRoIHN0eWxlPVwicGFkZGluZzo0cHggOHB4O3RleHQtYWxpZ246bGVmdDtjb2xvcjojNDc1NTY5O1wiPjwvdGg+XG4gICAgICAgIDwvdHI+PC90aGVhZD5cbiAgICAgICAgPHRib2R5PiR7cm93c308L3Rib2R5PlxuICAgICAgPC90YWJsZT5cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kO2dhcDo4cHg7XCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgaWQ9XCJtYXN0ZXItY3YtaW1wb3J0LWNhbmNlbFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBwcmltYXJ5XCIgaWQ9XCJtYXN0ZXItY3YtaW1wb3J0LWNvbmZpcm1cIiR7Y2hhbmdlZFNlY3Rpb25zLmxlbmd0aCA/ICcnIDogJyBkaXNhYmxlZCd9PkNvbmZpcm0gSW1wb3J0PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG92ZXJsYXkpO1xuICBpZiAodHlwZW9mIHRyYXBGb2N1cyA9PT0gJ2Z1bmN0aW9uJykgdHJhcEZvY3VzKCdtYXN0ZXItY3YtaW1wb3J0LW92ZXJsYXknKTtcbiAgY29uc3QgY2xvc2UgPSAoKSA9PiB7IG92ZXJsYXkucmVtb3ZlKCk7IF9tYXN0ZXJDdkltcG9ydERhdGEgPSBudWxsOyBpZiAodHlwZW9mIHJlc3RvcmVGb2N1cyA9PT0gJ2Z1bmN0aW9uJykgcmVzdG9yZUZvY3VzKCk7IH07XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItY3YtaW1wb3J0LWNhbmNlbCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xvc2UpO1xuICBvdmVybGF5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4geyBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSBjbG9zZSgpOyB9KTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1jdi1pbXBvcnQtY29uZmlybScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gY29uZmlybU1hc3RlckN2SW1wb3J0KCkpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb25maXJtTWFzdGVyQ3ZJbXBvcnQoKSB7XG4gIGlmICghX21hc3RlckN2SW1wb3J0RGF0YSkgcmV0dXJuO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL2ltcG9ydC1jb25maXJtJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBkYXRhOiBfbWFzdGVyQ3ZJbXBvcnREYXRhIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItY3YtaW1wb3J0LW92ZXJsYXknKT8ucmVtb3ZlKCk7XG4gICAgX21hc3RlckN2SW1wb3J0RGF0YSA9IG51bGw7XG4gICAgaWYgKHR5cGVvZiByZXN0b3JlRm9jdXMgPT09ICdmdW5jdGlvbicpIHJlc3RvcmVGb2N1cygpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBfc2V0TWFzdGVyQ2hhbmdlTm90aWNlKCdNYXN0ZXIgQ1YgRGF0YScsICdpbXBvcnRlZCcpO1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoXG4gICAgICAgICdcdTI3MDUgSW1wb3J0ZWQnLFxuICAgICAgICBgTWFzdGVyIENWIGRhdGEgcmVwbGFjZWQuJHtkYXRhLmNvbW1pdF9oYXNoID8gYCBDb21taXQ6ICR7ZGF0YS5jb21taXRfaGFzaC5zbGljZSgwLCAxMCl9LmAgOiAnJ30ke2RhdGEuZ2l0X2Vycm9yID8gYCAoZ2l0IHdhcm5pbmc6ICR7ZGF0YS5naXRfZXJyb3J9KWAgOiAnJ31gXG4gICAgICApO1xuICAgICAgYXdhaXQgcG9wdWxhdGVNYXN0ZXJUYWIoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZGV0YWlsID0gKGRhdGEudmFsaWRhdGlvbl9lcnJvcnMgfHwgW10pLmpvaW4oJzsgJyk7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgZGV0YWlsID8gYCR7ZGF0YS5lcnJvcn06ICR7ZGV0YWlsfWAgOiAoZGF0YS5lcnJvciB8fCAnSW1wb3J0IGZhaWxlZC4nKSk7XG4gICAgfVxuICB9IGNhdGNoIChfKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsICdGYWlsZWQgdG8gaW1wb3J0IG1hc3RlciBDViBkYXRhLicpO1xuICB9XG59XG5cbi8vIC0tLS0gQWNoaWV2ZW1lbnQvU3VtbWFyeSBkZWxldGUgaGFuZGxlcnMgLS0tLVxuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVNYXN0ZXJBY2hpZXZlbWVudChpZCwgdGl0bGUpIHtcbiAgc2hvd0NvbmZpcm1Nb2RhbChcbiAgICAnXHVEODNEXHVEREQxXHVGRTBGIERlbGV0ZSBBY2hpZXZlbWVudCcsXG4gICAgYERlbGV0ZSBcIiR7dGl0bGV9XCI/IFRoaXMgY2Fubm90IGJlIHVuZG9uZS5gLFxuICAgIGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS91cGRhdGUtYWNoaWV2ZW1lbnQnLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgYWN0aW9uOiAnZGVsZXRlJywgaWQgfSksXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgaWYgKGRhdGEub2spIHtcbiAgICAgICAgICBfc2V0TWFzdGVyQ2hhbmdlTm90aWNlKCdTZWxlY3RlZCBBY2hpZXZlbWVudHMnLCBkYXRhLmFjdGlvbiB8fCAnZGVsZXRlZCcpO1xuICAgICAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3MDUgRGVsZXRlZCcsIGBBY2hpZXZlbWVudCByZW1vdmVkLmApO1xuICAgICAgICAgIGF3YWl0IHBvcHVsYXRlTWFzdGVyVGFiKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsIGRhdGEuZXJyb3IgfHwgJ0RlbGV0ZSBmYWlsZWQnKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgJ0ZhaWxlZCB0byBkZWxldGUgYWNoaWV2ZW1lbnQnKTtcbiAgICAgIH1cbiAgICB9XG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZU1hc3RlclN1bW1hcnkoa2V5KSB7XG4gIHNob3dDb25maXJtTW9kYWwoXG4gICAgJ1x1RDgzRFx1REREMVx1RkUwRiBEZWxldGUgU3VtbWFyeScsXG4gICAgYERlbGV0ZSBzdW1tYXJ5IHZhcmlhbnQgXCIke2tleX1cIj8gVGhpcyBjYW5ub3QgYmUgdW5kb25lLmAsXG4gICAgYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL3VwZGF0ZS1zdW1tYXJ5Jywge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGFjdGlvbjogJ2RlbGV0ZScsIGtleSB9KSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICBpZiAoZGF0YS5vaykge1xuICAgICAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ1Byb2Zlc3Npb25hbCBTdW1tYXJpZXMnLCBkYXRhLmFjdGlvbiB8fCAnZGVsZXRlZCcpO1xuICAgICAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3MDUgRGVsZXRlZCcsIGBTdW1tYXJ5IFwiJHtrZXl9XCIgcmVtb3ZlZC5gKTtcbiAgICAgICAgICBhd2FpdCBwb3B1bGF0ZU1hc3RlclRhYigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCBkYXRhLmVycm9yIHx8ICdEZWxldGUgZmFpbGVkJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsICdGYWlsZWQgdG8gZGVsZXRlIHN1bW1hcnknKTtcbiAgICAgIH1cbiAgICB9XG4gICk7XG59XG5cbmZ1bmN0aW9uIG9wZW5NYXN0ZXJDdk1vZGFsKCkge1xuICBjb25zdCBvdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1jdi1tb2RhbC1vdmVybGF5Jyk7XG4gIGlmICghb3ZlcmxheSkgcmV0dXJuO1xuICBfZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWN2LW1vZGFsLWJvZHknKTtcbiAgcG9wdWxhdGVNYXN0ZXJUYWIoY29udGFpbmVyKTtcbiAgc2V0SW5pdGlhbEZvY3VzKCdtYXN0ZXItY3YtbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ21hc3Rlci1jdi1tb2RhbC1vdmVybGF5Jyk7XG59XG5cbmZ1bmN0aW9uIGNsb3NlTWFzdGVyQ3ZNb2RhbCgpIHtcbiAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItY3YtbW9kYWwtb3ZlcmxheScpO1xuICBpZiAob3ZlcmxheSkgb3ZlcmxheS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBfbWFzdGVyQ3ZBY3RpdmVDb250YWluZXIgPSBudWxsO1xuICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJyc7XG4gIHJlc3RvcmVGb2N1cygpO1xufVxuXG5leHBvcnQge1xuICBwb3B1bGF0ZU1hc3RlclRhYixcbiAgb3Blbk1hc3RlckN2TW9kYWwsXG4gIGNsb3NlTWFzdGVyQ3ZNb2RhbCxcbiAgX3JlbmRlclBlcnNvbmFsSW5mb0NhcmQsXG4gIF9yZW5kZXJFeHBlcmllbmNlc0xpc3QsXG4gIF9yZW5kZXJTa2lsbHNTZWN0aW9uLFxuICBfcmVuZGVyRWR1Y2F0aW9uTGlzdCxcbiAgX3JlbmRlckF3YXJkc0xpc3QsXG4gIF9yZW5kZXJDZXJ0aWZpY2F0aW9uc0xpc3QsXG4gIF9yZW5kZXJNYXN0ZXJBY2hpZXZlbWVudHNUYWJsZSxcbiAgX3JlbmRlclN1bW1hcmllc0xpc3QsXG4gIHNob3dBZGRBY2hpZXZlbWVudE1vZGFsLFxuICBlZGl0TWFzdGVyQWNoaWV2ZW1lbnQsXG4gIGNsb3NlTWFzdGVyQWNoTW9kYWwsXG4gIHNhdmVNYXN0ZXJBY2hpZXZlbWVudCxcbiAgc2hvd0FkZFN1bW1hcnlNb2RhbCxcbiAgZWRpdE1hc3RlclN1bW1hcnksXG4gIGNsb3NlTWFzdGVyU3VtTW9kYWwsXG4gIHNhdmVNYXN0ZXJTdW1tYXJ5LFxuICBzaG93RWRpdFBlcnNvbmFsSW5mb01vZGFsLFxuICBjbG9zZVBlcnNvbmFsSW5mb01vZGFsLFxuICBzYXZlUGVyc29uYWxJbmZvLFxuICBzaG93QWRkRXhwZXJpZW5jZU1vZGFsLFxuICBlZGl0TWFzdGVyRXhwZXJpZW5jZSxcbiAgY2xvc2VFeHBlcmllbmNlTW9kYWwsXG4gIHNhdmVNYXN0ZXJFeHBlcmllbmNlLFxuICBkZWxldGVNYXN0ZXJFeHBlcmllbmNlLFxuICBfYWRkRXhwQWNoaWV2ZW1lbnQsXG4gIF9tb3ZlRXhwQWNoaWV2ZW1lbnQsXG4gIF9kZWxldGVFeHBBY2hpZXZlbWVudCxcbiAgc2hvd0FkZFNraWxsTW9kYWwsXG4gIGVkaXRNYXN0ZXJTa2lsbCxcbiAgY2xvc2VTa2lsbE1vZGFsLFxuICBzYXZlTWFzdGVyU2tpbGwsXG4gIGRlbGV0ZU1hc3RlclNraWxsLFxuICBzaG93QWRkRWR1Y2F0aW9uTW9kYWwsXG4gIGVkaXRNYXN0ZXJFZHVjYXRpb24sXG4gIGNsb3NlRWR1Y2F0aW9uTW9kYWwsXG4gIHNhdmVNYXN0ZXJFZHVjYXRpb24sXG4gIGRlbGV0ZU1hc3RlckVkdWNhdGlvbixcbiAgc2hvd0FkZEF3YXJkTW9kYWwsXG4gIGVkaXRNYXN0ZXJBd2FyZCxcbiAgY2xvc2VBd2FyZE1vZGFsLFxuICBzYXZlTWFzdGVyQXdhcmQsXG4gIGRlbGV0ZU1hc3RlckF3YXJkLFxuICBzaG93QWRkQ2VydGlmaWNhdGlvbk1vZGFsLFxuICBlZGl0TWFzdGVyQ2VydGlmaWNhdGlvbixcbiAgY2xvc2VDZXJ0aWZpY2F0aW9uTW9kYWwsXG4gIHNhdmVNYXN0ZXJDZXJ0aWZpY2F0aW9uLFxuICBkZWxldGVNYXN0ZXJDZXJ0aWZpY2F0aW9uLFxuICBleHBvcnRNYXN0ZXJDVixcbiAgb3BlbkJhY2t1cEhpc3RvcnlNb2RhbCxcbiAgcmVzdG9yZUJhY2t1cCxcbiAgdW5kb01hc3RlckRhdGFDaGFuZ2UsXG4gIHJlZG9NYXN0ZXJEYXRhQ2hhbmdlLFxuICBvcGVuRnVsbERhdGFQcmV2aWV3TW9kYWwsXG4gIHRyaWdnZXJNYXN0ZXJDdkltcG9ydCxcbiAgaGFuZGxlTWFzdGVyQ3ZJbXBvcnRGaWxlLFxuICBjb25maXJtTWFzdGVyQ3ZJbXBvcnQsXG4gIGRlbGV0ZU1hc3RlckFjaGlldmVtZW50LFxuICBkZWxldGVNYXN0ZXJTdW1tYXJ5LFxuICBsb2FkUHVibGljYXRpb25zLFxuICBsb2FkUHVibGljYXRpb25zQmliLFxuICB0b2dnbGVQdWJsaWNhdGlvbnNWaWV3LFxuICBzZXRQdWJsaWNhdGlvblNvcnRNb2RlLFxuICBzZXRQdWJsaWNhdGlvbkdyb3VwTW9kZSxcbiAgdmFsaWRhdGVQdWJsaWNhdGlvbnNCaWIsXG4gIHNhdmVQdWJsaWNhdGlvbnNCaWIsXG4gIHNob3dJbXBvcnRQdWJsaWNhdGlvbnNNb2RhbCxcbiAgY2xvc2VJbXBvcnRQdWJsaWNhdGlvbnNNb2RhbCxcbiAgaW1wb3J0UHVibGljYXRpb25zQmliLFxuICBzaG93Q29udmVydFB1YmxpY2F0aW9uc01vZGFsLFxuICBjbG9zZUNvbnZlcnRQdWJsaWNhdGlvbnNNb2RhbCxcbiAgY29udmVydFB1YmxpY2F0aW9uVGV4dCxcbiAgaW1wb3J0Q29udmVydGVkUHVibGljYXRpb25UZXh0LFxuICBzaG93QWRkUHVibGljYXRpb25Nb2RhbCxcbiAgZWRpdE1hc3RlclB1YmxpY2F0aW9uLFxuICBjbG9zZVB1YmxpY2F0aW9uTW9kYWwsXG4gIHNhdmVNYXN0ZXJQdWJsaWNhdGlvbixcbiAgZGVsZXRlTWFzdGVyUHVibGljYXRpb24sXG59O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvY292ZXItbGV0dGVyLmpzXG4gKiBDb3ZlciBsZXR0ZXIgdGFiOiBnZW5lcmF0ZSwgc2F2ZSwgdmFsaWRhdGUsIGNvbnNpc3RlbmN5IHJlcG9ydC5cbiAqXG4gKiBEZXBlbmRlbmNpZXMgKHJlc29sdmVkIHRocm91Z2ggZ2xvYmFsVGhpcyBhdCBydW50aW1lKTpcbiAqICAgZXNjYXBlSHRtbCwgc2hvd0FsZXJ0TW9kYWwsIHRhYkRhdGEsIHBlbmRpbmdSZWNvbW1lbmRhdGlvbnMsIENTU1xuICovXG5cbmltcG9ydCB7IHN0YXRlTWFuYWdlciB9IGZyb20gJy4vc3RhdGUtbWFuYWdlci5qcyc7XG5cbi8vIFx1MjUwMFx1MjUwMCBNb2R1bGUtbGV2ZWwgc3RhdGUgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmNvbnN0IENPVkVSX0xFVFRFUl9UT05FUyA9IFtcbiAgeyB2YWx1ZTogJ3N0YXJ0dXAvdGVjaCcsICAgbGFiZWw6ICdTdGFydHVwIC8gVGVjaCcgICAgfSxcbiAgeyB2YWx1ZTogJ3BoYXJtYS9iaW90ZWNoJywgbGFiZWw6ICdQaGFybWEgLyBCaW90ZWNoJyAgfSxcbiAgeyB2YWx1ZTogJ2FjYWRlbWlhJywgICAgICAgbGFiZWw6ICdBY2FkZW1pYScgICAgICAgICAgIH0sXG4gIHsgdmFsdWU6ICdmaW5hbmNpYWwnLCAgICAgIGxhYmVsOiAnRmluYW5jaWFsIFNlcnZpY2VzJyB9LFxuICB7IHZhbHVlOiAnbGVhZGVyc2hpcCcsICAgICBsYWJlbDogJ0xlYWRlcnNoaXAgLyBFeGVjJyAgfSxcbl07XG5cbmNvbnN0IENPVkVSX0xFVFRFUl9PUEVOSU5HUyA9IFtcbiAgeyB2YWx1ZTogJ2Zvcm1hbCcsICAgIGxhYmVsOiAnRm9ybWFsIHNhbHV0YXRpb24gXHUyMDE0IFx1MjAxQ0RlYXIgW25hbWVdLFx1MjAxRCcgfSxcbiAgeyB2YWx1ZTogJ2hvb2snLCAgICAgIGxhYmVsOiAnQXR0ZW50aW9uIGhvb2sgXHUyMDE0IGJvbGQgY2xhaW0gb3IgYWNoaWV2ZW1lbnQnIH0sXG4gIHsgdmFsdWU6ICduYXJyYXRpdmUnLCBsYWJlbDogJ05hcnJhdGl2ZSBvcGVuZXIgXHUyMDE0IHZpdmlkIHNjZW5lIG9yIHN0b3J5JyB9LFxuXTtcblxubGV0IF9jb3ZlckxldHRlclByaW9yU2Vzc2lvbnMgPSBbXTtcblxuLyoqIFN1cnZpdmVzIHRhYiBuYXZpZ2F0aW9uOiBmb3JtIGlucHV0cyBhbmQgdGhlIGdlbmVyYXRlZCBsZXR0ZXIgYm9keS4gKi9cbmxldCBfY292ZXJMZXR0ZXJGb3JtU3RhdGUgPSB7XG4gIHRvbmU6ICAgICAgICAgICAnJyxcbiAgb3BlbmluZ1N0eWxlOiAgICcnLFxuICBoaXJpbmdNYW5hZ2VyOiAgJycsXG4gIGNvbXBhbnlBZGRyZXNzOiAnJyxcbiAgaGlnaGxpZ2h0OiAgICAgICcnLFxuICBjb21wYW55Q29udGV4dDogJycsXG4gIGxldHRlclRleHQ6ICAgICAnJyxcbiAgbGV0dGVyVmlzaWJsZTogIGZhbHNlLFxufTtcblxuLy8gXHUyNTAwXHUyNTAwIFBvcHVsYXRlIGNvdmVyIGxldHRlciB0YWIgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIHBvcHVsYXRlQ292ZXJMZXR0ZXJUYWIoKSB7XG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9jdW1lbnQtY29udGVudCcpO1xuICBjb250ZW50LmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwiZW1wdHktc3RhdGVcIj48ZGl2IGNsYXNzPVwibG9hZGluZy1zcGlubmVyXCI+PC9kaXY+PHAgc3R5bGU9XCJtYXJnaW4tdG9wOjEycHg7Y29sb3I6IzY0NzQ4YjtcIj5Mb2FkaW5nIGNvdmVyIGxldHRlclx1MjAyNjwvcD48L2Rpdj4nO1xuXG4gIC8vIEZldGNoIHByaW9yIHNlc3Npb25zIHdpdGggY292ZXIgbGV0dGVyc1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9jb3Zlci1sZXR0ZXIvcHJpb3InKTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBfY292ZXJMZXR0ZXJQcmlvclNlc3Npb25zID0gKGRhdGEuc2Vzc2lvbnMgfHwgW10pO1xuICB9IGNhdGNoIChfKSB7XG4gICAgX2NvdmVyTGV0dGVyUHJpb3JTZXNzaW9ucyA9IFtdO1xuICB9XG5cbiAgY29uc3QgdG9uZU9wdGlvbnMgPSBDT1ZFUl9MRVRURVJfVE9ORVMubWFwKHQgPT5cbiAgICBgPG9wdGlvbiB2YWx1ZT1cIiR7dC52YWx1ZX1cIj4ke2VzY2FwZUh0bWwodC5sYWJlbCl9PC9vcHRpb24+YFxuICApLmpvaW4oJycpO1xuXG4gIGNvbnN0IG9wZW5pbmdPcHRpb25zID0gQ09WRVJfTEVUVEVSX09QRU5JTkdTLm1hcChvID0+XG4gICAgYDxvcHRpb24gdmFsdWU9XCIke28udmFsdWV9XCI+JHtlc2NhcGVIdG1sKG8ubGFiZWwpfTwvb3B0aW9uPmBcbiAgKS5qb2luKCcnKTtcblxuICBjb25zdCBwcmlvclNlY3Rpb24gPSBfY292ZXJMZXR0ZXJQcmlvclNlc3Npb25zLmxlbmd0aCA/IGBcbiAgICA8ZGl2IGNsYXNzPVwiY2wtcHJpb3Itc2VjdGlvblwiPlxuICAgICAgPGgzPlx1RDgzRFx1RENDQiBQcmlvciBDb3ZlciBMZXR0ZXJzPC9oMz5cbiAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtmb250LXNpemU6MC44NWVtO21hcmdpbi1ib3R0b206MTBweDtcIj5cbiAgICAgICAgU2VsZWN0IGEgcHJpb3IgbGV0dGVyIHRvIHVzZSBhcyBhIHN0YXJ0aW5nIHBvaW50LlxuICAgICAgPC9wPlxuICAgICAgPGRpdiBpZD1cImNsLXByaW9yLWxpc3RcIj5cbiAgICAgICAgJHtfY292ZXJMZXR0ZXJQcmlvclNlc3Npb25zLm1hcCgocywgaSkgPT4gYFxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbC1wcmlvci1jYXJkXCIgaWQ9XCJjbC1wcmlvci0ke2l9XCI+XG4gICAgICAgICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjEwcHg7YWxpZ24taXRlbXM6ZmxleC1zdGFydDtjdXJzb3I6cG9pbnRlcjtcIj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJjbC1wcmlvclwiIHZhbHVlPVwiJHtpfVwiIHN0eWxlPVwibWFyZ2luLXRvcDozcHg7XCIgLz5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8c3Ryb25nPiR7ZXNjYXBlSHRtbChzLnJvbGUgfHwgJ1JvbGUnKX0gYXQgJHtlc2NhcGVIdG1sKHMuY29tcGFueSB8fCAnQ29tcGFueScpfTwvc3Ryb25nPlxuICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6Izk0YTNiODtmb250LXNpemU6MC44MmVtO21hcmdpbi1sZWZ0OjZweDtcIj4ke2VzY2FwZUh0bWwocy5kYXRlIHx8ICcnKX08L3NwYW4+XG4gICAgICAgICAgICAgICAgJHtzLnRvbmUgPyBgPHNwYW4gY2xhc3M9XCJjbC10b25lLWJhZGdlXCI+JHtlc2NhcGVIdG1sKHMudG9uZSl9PC9zcGFuPmAgOiAnJ31cbiAgICAgICAgICAgICAgICA8cCBzdHlsZT1cImNvbG9yOiM2NDc0OGI7Zm9udC1zaXplOjAuODVlbTttYXJnaW46NHB4IDAgMDtcIj4ke2VzY2FwZUh0bWwoKHMucHJldmlldyB8fCAnJykuc2xpY2UoMCwgMTIwKSl9XHUyMDI2PC9wPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPC9kaXY+YCkuam9pbignJyl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gIDogJyc7XG5cbiAgY29udGVudC5pbm5lckhUTUwgPSBgXG4gICAgPGgxPlx1RDgzRFx1RENFOSBDb3ZlciBMZXR0ZXI8L2gxPlxuICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDttYXJnaW4tYm90dG9tOjIwcHg7XCI+XG4gICAgICBHZW5lcmF0ZSBhIHRhaWxvcmVkIGNvdmVyIGxldHRlciBmb3IgdGhpcyBhcHBsaWNhdGlvbiB1c2luZyB5b3VyIENWIGNvbnRlbnRcbiAgICAgIGFuZCBqb2IgYW5hbHlzaXMgYXMgY29udGV4dC5cbiAgICA8L3A+XG5cbiAgICAke3ByaW9yU2VjdGlvbn1cblxuICAgIDxkaXYgY2xhc3M9XCJjbC1mb3JtLXNlY3Rpb25cIj5cbiAgICAgIDxoMz5HZW5lcmF0aW9uIE9wdGlvbnM8L2gzPlxuICAgICAgPGRpdiBjbGFzcz1cImNsLWZvcm0tZ3JpZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2wtZm9ybS1maWVsZFwiPlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJjbC10b25lLXNlbGVjdFwiPlRvbmUgLyBJbmR1c3RyeTwvbGFiZWw+XG4gICAgICAgICAgPHNlbGVjdCBpZD1cImNsLXRvbmUtc2VsZWN0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCI+JHt0b25lT3B0aW9uc308L3NlbGVjdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjbC1mb3JtLWZpZWxkXCI+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cImNsLW9wZW5pbmctc3R5bGVcIj5PcGVuaW5nIFN0eWxlPC9sYWJlbD5cbiAgICAgICAgICA8c2VsZWN0IGlkPVwiY2wtb3BlbmluZy1zdHlsZVwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiPiR7b3BlbmluZ09wdGlvbnN9PC9zZWxlY3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2wtZm9ybS1maWVsZFwiPlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJjbC1oaXJpbmctbWFuYWdlclwiPkhpcmluZyBNYW5hZ2VyIE5hbWUvVGl0bGUgPHNwYW4gc3R5bGU9XCJjb2xvcjojOTRhM2I4O2ZvbnQtd2VpZ2h0OjQwMDtcIj4ob3B0aW9uYWwpPC9zcGFuPjwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJjbC1oaXJpbmctbWFuYWdlclwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBEci4gSmFuZSBTbWl0aCwgSGVhZCBvZiBEYXRhIFNjaWVuY2VcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNsLWZvcm0tZmllbGRcIiBzdHlsZT1cIm1hcmdpbi10b3A6MTJweDtcIj5cbiAgICAgICAgPGxhYmVsIGZvcj1cImNsLWNvbXBhbnktYWRkcmVzc1wiPkNvbXBhbnkgQWRkcmVzcyA8c3BhbiBzdHlsZT1cImNvbG9yOiM5NGEzYjg7Zm9udC13ZWlnaHQ6NDAwO1wiPihvcHRpb25hbCk8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgPHRleHRhcmVhIGlkPVwiY2wtY29tcGFueS1hZGRyZXNzXCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgcm93cz1cIjJcIlxuICAgICAgICAgICAgc3R5bGU9XCJyZXNpemU6dmVydGljYWw7XCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBBY21lIENvcnAsIDEyMyBNYWluIFN0LCBCb3N0b24gTUEgMDIxMzRcIj48L3RleHRhcmVhPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2wtZm9ybS1maWVsZFwiIHN0eWxlPVwibWFyZ2luLXRvcDoxMnB4O1wiPlxuICAgICAgICA8bGFiZWwgZm9yPVwiY2wtaGlnaGxpZ2h0XCI+U3BlY2lmaWMgYWNoaWV2ZW1lbnQgb3IgcHJvamVjdCB0byBoaWdobGlnaHQgPHNwYW4gc3R5bGU9XCJjb2xvcjojOTRhM2I4O2ZvbnQtd2VpZ2h0OjQwMDtcIj4ob3B0aW9uYWwpPC9zcGFuPjwvbGFiZWw+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiY2wtaGlnaGxpZ2h0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBMZWQgdGhlIG1pZ3JhdGlvbiB0byBLdWJlcm5ldGVzIHNhdmluZyAzMCUgaW5mcmEgY29zdFwiIC8+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjbC1mb3JtLWZpZWxkXCIgc3R5bGU9XCJtYXJnaW4tdG9wOjEycHg7XCI+XG4gICAgICAgIDxsYWJlbCBmb3I9XCJjbC1jb21wYW55LWNvbnRleHRcIj5Db21wYW55IGNvbnRleHQgPHNwYW4gc3R5bGU9XCJjb2xvcjojOTRhM2I4O2ZvbnQtd2VpZ2h0OjQwMDtcIj4ob3B0aW9uYWwgXHUyMDE0IHBhc3RlIHNwZWNpZmljIGluaXRpYXRpdmVzLCBwcm9kdWN0cywgdmFsdWVzLCBvciByZWNlbnQgbmV3cyk8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgPHRleHRhcmVhIGlkPVwiY2wtY29tcGFueS1jb250ZXh0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgcm93cz1cIjNcIlxuICAgICAgICAgICAgc3R5bGU9XCJyZXNpemU6dmVydGljYWw7XCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBUaGV5IGp1c3QgbGF1bmNoZWQgYSBuZXcgQUkgcGxhdGZvcm0gZm9yIGhlYWx0aGNhcmU7IHRoZWlyIENUTyB3cm90ZSBhYm91dCBwcmlvcml0aXNpbmcgcmVsaWFiaWxpdHkgb3ZlciBzcGVlZFx1MjAyNlwiPjwvdGV4dGFyZWE+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOjE2cHg7XCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHByaW1hcnlcIiBpZD1cImNsLWdlbmVyYXRlLWJ0blwiIG9uY2xpY2s9XCJnZW5lcmF0ZUNvdmVyTGV0dGVyKClcIj5cbiAgICAgICAgICBcdTI3MjggR2VuZXJhdGUgQ292ZXIgTGV0dGVyXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGlkPVwiY2wtcmVzdWx0LXNlY3Rpb25cIiBzdHlsZT1cImRpc3BsYXk6bm9uZTttYXJnaW4tdG9wOjI0cHg7XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2wtcmVzdWx0LWhlYWRlclwiPlxuICAgICAgICA8aDM+R2VuZXJhdGVkIENvdmVyIExldHRlcjwvaDM+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjhweDtmbGV4LXdyYXA6d3JhcDtcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0blwiIG9uY2xpY2s9XCJnZW5lcmF0ZUNvdmVyTGV0dGVyKClcIiB0aXRsZT1cIlJlZ2VuZXJhdGVcIj5cdUQ4M0RcdUREMDQgUmVnZW5lcmF0ZTwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHByaW1hcnlcIiBvbmNsaWNrPVwic2F2ZUNvdmVyTGV0dGVyKClcIiBpZD1cImNsLXNhdmUtYnRuXCI+XHVEODNEXHVEQ0JFIFNhdmUgQ292ZXIgTGV0dGVyPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7Zm9udC1zaXplOjAuODVlbTttYXJnaW4tYm90dG9tOjhweDtcIj5cbiAgICAgICAgRWRpdCB0aGUgdGV4dCBiZWxvdyBiZWZvcmUgc2F2aW5nLlxuICAgICAgPC9wPlxuICAgICAgPHRleHRhcmVhIGlkPVwiY2wtbGV0dGVyLXRleHRhcmVhXCIgY2xhc3M9XCJjbC1sZXR0ZXItdGV4dGFyZWFcIiByb3dzPVwiMjJcIlxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJDb3ZlciBsZXR0ZXIgdGV4dCBcdTIwMTQgZWRpdCBhcyBuZWVkZWRcIlxuICAgICAgICAgIG9uaW5wdXQ9XCJfZGVib3VuY2VkVmFsaWRhdGVDTCgpOyBfY292ZXJMZXR0ZXJGb3JtU3RhdGUubGV0dGVyVGV4dCA9IHRoaXMudmFsdWU7XCI+PC90ZXh0YXJlYT5cbiAgICAgIDxkaXYgaWQ9XCJjbC12YWxpZGF0aW9uLXBhbmVsXCIgY2xhc3M9XCJjbC12YWxpZGF0aW9uLXBhbmVsXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+XG4gICAgICAgIDxoND5cdUQ4M0RcdURDQ0EgUXVhbGl0eSBDaGVja3M8L2g0PlxuICAgICAgICA8ZGl2IGlkPVwiY2wtY2hlY2tzLWNvbnRhaW5lclwiPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwibmF2LWJ1dHRvbnMgbmF2LWVuZFwiIHN0eWxlPVwibWFyZ2luLXRvcDoyNHB4O1wiPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbnRpbnVlLWJ0blwiIG9uY2xpY2s9XCJoYW5kbGVTdGVwQ2xpY2soJ3NjcmVlbmluZycpXCI+XHVEODNEXHVEQ0NCIFByb2NlZWQgdG8gU2NyZWVuaW5nIFx1MjE5MjwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICBgO1xuXG4gIC8vIFJlc3RvcmUgc2F2ZWQgZm9ybSBzdGF0ZSBhbmQgd2lyZSB1cCBzYXZlLW9uLWNoYW5nZSBsaXN0ZW5lcnMuXG4gIF9yZXN0b3JlQ292ZXJMZXR0ZXJGb3JtU3RhdGUoKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIENvdmVyIGxldHRlciBmb3JtIHN0YXRlIGhlbHBlcnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIF9yZXN0b3JlQ292ZXJMZXR0ZXJGb3JtU3RhdGUoKSB7XG4gIGNvbnN0IHRvbmVFbCAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC10b25lLXNlbGVjdCcpO1xuICBjb25zdCBvcGVuaW5nRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtb3BlbmluZy1zdHlsZScpO1xuICBjb25zdCBobUVsICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtaGlyaW5nLW1hbmFnZXInKTtcbiAgY29uc3QgYWRkckVsICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWNvbXBhbnktYWRkcmVzcycpO1xuICBjb25zdCBobEVsICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtaGlnaGxpZ2h0Jyk7XG4gIGNvbnN0IGN0eEVsICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1jb21wYW55LWNvbnRleHQnKTtcbiAgY29uc3QgcmVzdWx0RWwgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLXJlc3VsdC1zZWN0aW9uJyk7XG4gIGNvbnN0IGxldHRlckVsICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1sZXR0ZXItdGV4dGFyZWEnKTtcblxuICBpZiAodG9uZUVsICYmIF9jb3ZlckxldHRlckZvcm1TdGF0ZS50b25lKVxuICAgIHRvbmVFbC52YWx1ZSA9IF9jb3ZlckxldHRlckZvcm1TdGF0ZS50b25lO1xuICBpZiAob3BlbmluZ0VsICYmIF9jb3ZlckxldHRlckZvcm1TdGF0ZS5vcGVuaW5nU3R5bGUpXG4gICAgb3BlbmluZ0VsLnZhbHVlID0gX2NvdmVyTGV0dGVyRm9ybVN0YXRlLm9wZW5pbmdTdHlsZTtcbiAgaWYgKGhtRWwgJiYgX2NvdmVyTGV0dGVyRm9ybVN0YXRlLmhpcmluZ01hbmFnZXIpXG4gICAgaG1FbC52YWx1ZSA9IF9jb3ZlckxldHRlckZvcm1TdGF0ZS5oaXJpbmdNYW5hZ2VyO1xuICBpZiAoYWRkckVsICYmIF9jb3ZlckxldHRlckZvcm1TdGF0ZS5jb21wYW55QWRkcmVzcylcbiAgICBhZGRyRWwudmFsdWUgPSBfY292ZXJMZXR0ZXJGb3JtU3RhdGUuY29tcGFueUFkZHJlc3M7XG4gIGlmIChobEVsICYmIF9jb3ZlckxldHRlckZvcm1TdGF0ZS5oaWdobGlnaHQpXG4gICAgaGxFbC52YWx1ZSA9IF9jb3ZlckxldHRlckZvcm1TdGF0ZS5oaWdobGlnaHQ7XG4gIGlmIChjdHhFbCAmJiBfY292ZXJMZXR0ZXJGb3JtU3RhdGUuY29tcGFueUNvbnRleHQpXG4gICAgY3R4RWwudmFsdWUgPSBfY292ZXJMZXR0ZXJGb3JtU3RhdGUuY29tcGFueUNvbnRleHQ7XG5cbiAgaWYgKF9jb3ZlckxldHRlckZvcm1TdGF0ZS5sZXR0ZXJWaXNpYmxlICYmIF9jb3ZlckxldHRlckZvcm1TdGF0ZS5sZXR0ZXJUZXh0KSB7XG4gICAgaWYgKHJlc3VsdEVsKSByZXN1bHRFbC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICBpZiAobGV0dGVyRWwpIHtcbiAgICAgIGxldHRlckVsLnZhbHVlID0gX2NvdmVyTGV0dGVyRm9ybVN0YXRlLmxldHRlclRleHQ7XG4gICAgICBfdmFsaWRhdGVDb3ZlckxldHRlcihsZXR0ZXJFbC52YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gV2lyZSB1cCBzYXZlLW9uLWNoYW5nZSBsaXN0ZW5lcnMgKGlubGluZSBvbmlucHV0IGFscmVhZHkgaGFuZGxlcyBsZXR0ZXJUZXh0KS5cbiAgaWYgKHRvbmVFbCkgICAgdG9uZUVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICAgKCkgPT4geyBfY292ZXJMZXR0ZXJGb3JtU3RhdGUudG9uZSA9IHRvbmVFbC52YWx1ZTsgfSk7XG4gIGlmIChvcGVuaW5nRWwpIG9wZW5pbmdFbC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7IF9jb3ZlckxldHRlckZvcm1TdGF0ZS5vcGVuaW5nU3R5bGUgPSBvcGVuaW5nRWwudmFsdWU7IH0pO1xuICBpZiAoaG1FbCkgICAgICBobUVsLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgICAgICAoKSA9PiB7IF9jb3ZlckxldHRlckZvcm1TdGF0ZS5oaXJpbmdNYW5hZ2VyID0gaG1FbC52YWx1ZTsgfSk7XG4gIGlmIChhZGRyRWwpICAgIGFkZHJFbC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICAgICgpID0+IHsgX2NvdmVyTGV0dGVyRm9ybVN0YXRlLmNvbXBhbnlBZGRyZXNzID0gYWRkckVsLnZhbHVlOyB9KTtcbiAgaWYgKGhsRWwpICAgICAgaGxFbC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICAgICAgKCkgPT4geyBfY292ZXJMZXR0ZXJGb3JtU3RhdGUuaGlnaGxpZ2h0ID0gaGxFbC52YWx1ZTsgfSk7XG4gIGlmIChjdHhFbCkgICAgIGN0eEVsLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgICAgICgpID0+IHsgX2NvdmVyTGV0dGVyRm9ybVN0YXRlLmNvbXBhbnlDb250ZXh0ID0gY3R4RWwudmFsdWU7IH0pO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgR2VuZXJhdGUgY292ZXIgbGV0dGVyIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUNvdmVyTGV0dGVyKCkge1xuICAvKiBkdWNrZmxvdzpcbiAgICogICBpZDogY292ZXJfbGV0dGVyX3VpX2dlbmVyYXRlX2xpdmVcbiAgICogICBraW5kOiB1aVxuICAgKiAgIHRpbWVzdGFtcDogJzIwMjYtMDQtMjFUMTg6MDA6MDBaJ1xuICAgKiAgIHN0YXR1czogbGl2ZVxuICAgKiAgIGhhbmRsZXM6XG4gICAqICAgLSB1aTpjb3Zlci1sZXR0ZXIuZ2VuZXJhdGVcbiAgICogICBjYWxsczpcbiAgICogICAtIFBPU1QgL2FwaS9jb3Zlci1sZXR0ZXIvZ2VuZXJhdGVcbiAgICogICByZWFkczpcbiAgICogICAtIGRvbTojY2wtdG9uZS1zZWxlY3QudmFsdWVcbiAgICogICAtIGRvbTojY2wtb3BlbmluZy1zdHlsZS52YWx1ZVxuICAgKiAgIC0gZG9tOiNjbC1oaXJpbmctbWFuYWdlci52YWx1ZVxuICAgKiAgIC0gZG9tOiNjbC1jb21wYW55LWFkZHJlc3MudmFsdWVcbiAgICogICAtIGRvbTojY2wtaGlnaGxpZ2h0LnZhbHVlXG4gICAqICAgLSBkb206aW5wdXRbbmFtZT1jbC1wcmlvcl0uY2hlY2tlZFxuICAgKiAgIHdyaXRlczpcbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL2NvdmVyLWxldHRlci9nZW5lcmF0ZS50b25lXG4gICAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9jb3Zlci1sZXR0ZXIvZ2VuZXJhdGUub3BlbmluZ19zdHlsZVxuICAgKiAgIC0gcmVxdWVzdDpQT1NUIC9hcGkvY292ZXItbGV0dGVyL2dlbmVyYXRlLmhpcmluZ19tYW5hZ2VyXG4gICAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9jb3Zlci1sZXR0ZXIvZ2VuZXJhdGUuY29tcGFueV9hZGRyZXNzXG4gICAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9jb3Zlci1sZXR0ZXIvZ2VuZXJhdGUuaGlnaGxpZ2h0XG4gICAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9jb3Zlci1sZXR0ZXIvZ2VuZXJhdGUucmV1c2VfYm9keVxuICAgKiAgIC0gZG9tOiNjbC1sZXR0ZXItdGV4dGFyZWEudmFsdWVcbiAgICogICBub3RlczogU3VibWl0cyBjb3Zlci1sZXR0ZXIgcHJvbXB0IGlucHV0cyAoaW5jbHVkaW5nIGNvbmZpZ3VyYWJsZSBvcGVuaW5nIHN0eWxlKSBhbmQgb3B0aW9uYWwgcmV1c2UgdGV4dCwgdGhlbiB3cml0ZXMgdGhlIGdlbmVyYXRlZCBib2R5IGludG8gdGhlIGVkaXRhYmxlIGNvdmVyLWxldHRlciB0ZXh0YXJlYS5cbiAgICovXG4gIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1nZW5lcmF0ZS1idG4nKTtcbiAgYnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgYnRuLnRleHRDb250ZW50ID0gJ1x1MjNGMyBHZW5lcmF0aW5nXHUyMDI2JztcblxuICBjb25zdCB0b25lICAgICAgICAgICAgPSAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLXRvbmUtc2VsZWN0JykgICAgICB8fCB7fSkudmFsdWUgfHwgJ3N0YXJ0dXAvdGVjaCc7XG4gIGNvbnN0IG9wZW5pbmdfc3R5bGUgICA9IChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtb3BlbmluZy1zdHlsZScpICAgIHx8IHt9KS52YWx1ZSB8fCAnZm9ybWFsJztcbiAgY29uc3QgaGlyaW5nX21hbmFnZXIgID0gKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1oaXJpbmctbWFuYWdlcicpICAgfHwge30pLnZhbHVlIHx8ICcnO1xuICBjb25zdCBjb21wYW55X2FkZHJlc3MgPSAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWNvbXBhbnktYWRkcmVzcycpICB8fCB7fSkudmFsdWUgfHwgJyc7XG4gIGNvbnN0IGhpZ2hsaWdodCAgICAgICA9IChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtaGlnaGxpZ2h0JykgICAgICAgICB8fCB7fSkudmFsdWUgfHwgJyc7XG4gIGNvbnN0IGNvbXBhbnlfY29udGV4dCA9IChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtY29tcGFueS1jb250ZXh0JykgIHx8IHt9KS52YWx1ZSB8fCAnJztcblxuICAvLyBDaGVjayBmb3IgcHJpb3IgbGV0dGVyIHNlbGVjdGlvblxuICBsZXQgcmV1c2VfYm9keSA9ICcnO1xuICBjb25zdCBjaGVja2VkUHJpb3IgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFtuYW1lPVwiY2wtcHJpb3JcIl06Y2hlY2tlZCcpO1xuICBpZiAoY2hlY2tlZFByaW9yKSB7XG4gICAgY29uc3QgaWR4ID0gcGFyc2VJbnQoY2hlY2tlZFByaW9yLnZhbHVlLCAxMCk7XG4gICAgcmV1c2VfYm9keSA9IChfY292ZXJMZXR0ZXJQcmlvclNlc3Npb25zW2lkeF0gfHwge30pLmZ1bGxfdGV4dCB8fCAnJztcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL2NvdmVyLWxldHRlci9nZW5lcmF0ZScsIHtcbiAgICAgIG1ldGhvZDogICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogICAgSlNPTi5zdHJpbmdpZnkoeyB0b25lLCBvcGVuaW5nX3N0eWxlLCBoaXJpbmdfbWFuYWdlciwgY29tcGFueV9hZGRyZXNzLCBoaWdobGlnaHQsIGNvbXBhbnlfY29udGV4dCwgcmV1c2VfYm9keSB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcblxuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBjb25zdCByZXN1bHRTZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLXJlc3VsdC1zZWN0aW9uJyk7XG4gICAgICBjb25zdCB0ZXh0YXJlYSAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWxldHRlci10ZXh0YXJlYScpO1xuICAgICAgaWYgKHJlc3VsdFNlY3Rpb24pIHJlc3VsdFNlY3Rpb24uc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICBpZiAodGV4dGFyZWEpIHtcbiAgICAgICAgdGV4dGFyZWEudmFsdWUgPSBkYXRhLnRleHQ7XG4gICAgICAgIF92YWxpZGF0ZUNvdmVyTGV0dGVyKHRleHRhcmVhLnZhbHVlKTtcbiAgICAgIH1cbiAgICAgIF9jb3ZlckxldHRlckZvcm1TdGF0ZS5sZXR0ZXJUZXh0ICAgID0gZGF0YS50ZXh0O1xuICAgICAgX2NvdmVyTGV0dGVyRm9ybVN0YXRlLmxldHRlclZpc2libGUgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEdlbmVyYXRpb24gRmFpbGVkJywgZGF0YS5lcnJvciB8fCAnTExNIGRpZCBub3QgcmV0dXJuIGEgY292ZXIgbGV0dGVyLicpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIGNvbnRhY3Qgc2VydmVyLicpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChidG4pIHtcbiAgICAgIGJ0bi5kaXNhYmxlZCAgICA9IGZhbHNlO1xuICAgICAgYnRuLnRleHRDb250ZW50ID0gJ1x1MjcyOCBHZW5lcmF0ZSBDb3ZlciBMZXR0ZXInO1xuICAgIH1cbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgU2F2ZSBjb3ZlciBsZXR0ZXIgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIHNhdmVDb3ZlckxldHRlcigpIHtcbiAgLyogZHVja2Zsb3c6XG4gICAqICAgaWQ6IGNvdmVyX2xldHRlcl91aV9zYXZlX2xpdmVcbiAgICogICBraW5kOiB1aVxuICAgKiAgIHRpbWVzdGFtcDogJzIwMjYtMDMtMjVUMjE6Mzk6NDhaJ1xuICAgKiAgIHN0YXR1czogbGl2ZVxuICAgKiAgIGhhbmRsZXM6XG4gICAqICAgLSB1aTpjb3Zlci1sZXR0ZXIuc2F2ZVxuICAgKiAgIGNhbGxzOlxuICAgKiAgIC0gUE9TVCAvYXBpL2NvdmVyLWxldHRlci9zYXZlXG4gICAqICAgcmVhZHM6XG4gICAqICAgLSBkb206I2NsLWxldHRlci10ZXh0YXJlYS52YWx1ZVxuICAgKiAgIHdyaXRlczpcbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL2NvdmVyLWxldHRlci9zYXZlLnRleHRcbiAgICogICBub3RlczogU3VibWl0cyB0aGUgdXNlci1lZGl0ZWQgY292ZXItbGV0dGVyIGJvZHkgZm9yIHNlc3Npb24gcGVyc2lzdGVuY2UsIG1ldGFkYXRhIHdyaXRlLXRocm91Z2gsIGFuZCBhcmNoaXZlIGFydGlmYWN0IGdlbmVyYXRpb24uXG4gICAqL1xuICBjb25zdCB0ZXh0YXJlYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1sZXR0ZXItdGV4dGFyZWEnKTtcbiAgaWYgKCF0ZXh0YXJlYSkgcmV0dXJuO1xuICBjb25zdCB0ZXh0ID0gdGV4dGFyZWEudmFsdWUudHJpbSgpO1xuICBpZiAoIXRleHQpIHtcbiAgICBzaG93QWxlcnRNb2RhbCgnXHUyNkEwXHVGRTBGIEVtcHR5IExldHRlcicsICdQbGVhc2UgZ2VuZXJhdGUgb3IgdHlwZSBhIGNvdmVyIGxldHRlciBiZWZvcmUgc2F2aW5nLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1zYXZlLWJ0bicpO1xuICBpZiAoYnRuKSB7IGJ0bi5kaXNhYmxlZCA9IHRydWU7IGJ0bi50ZXh0Q29udGVudCA9ICdcdTIzRjMgU2F2aW5nXHUyMDI2JzsgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL2NvdmVyLWxldHRlci9zYXZlJywge1xuICAgICAgbWV0aG9kOiAgJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiAgICBKU09OLnN0cmluZ2lmeSh7IHRleHQgfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG5cbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjcwNSBTYXZlZCcsIGBDb3ZlciBsZXR0ZXIgc2F2ZWQgYXMgPHN0cm9uZz4ke2VzY2FwZUh0bWwoZGF0YS5maWxlbmFtZSl9PC9zdHJvbmc+IGluIHlvdXIgYXBwbGljYXRpb24gZm9sZGVyLmApO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIFNhdmUgRmFpbGVkJywgZGF0YS5lcnJvciB8fCAnQ291bGQgbm90IHNhdmUgY292ZXIgbGV0dGVyLicpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIGNvbnRhY3Qgc2VydmVyLicpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChidG4pIHsgYnRuLmRpc2FibGVkID0gZmFsc2U7IGJ0bi50ZXh0Q29udGVudCA9ICdcdUQ4M0RcdURDQkUgU2F2ZSBDb3ZlciBMZXR0ZXInOyB9XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIENyb3NzLWRvY3VtZW50IGNvbnNpc3RlbmN5IHJlcG9ydCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLyoqXG4gKiBCdWlsZCBhbmQgcmVuZGVyIHRoZSBjcm9zcy1kb2N1bWVudCBjb25zaXN0ZW5jeSByZXBvcnQgaW4gdGhlIEZpbmFsaXNlIHRhYi5cbiAqIENoZWNrcyBjb21wYW55IG5hbWUsIGpvYiB0aXRsZSwgQVRTIGtleXdvcmRzLCBhbmQgZGF0ZSBmb3JtYXR0aW5nIGFjcm9zc1xuICogdGhlIENWICh0YWJEYXRhLmN2KSBhbmQgY292ZXIgbGV0dGVyICgjY2wtbGV0dGVyLXRleHRhcmVhKS5cbiAqL1xuZnVuY3Rpb24gX3JlbmRlckNvbnNpc3RlbmN5UmVwb3J0KHN0YXR1c0RhdGEpIHtcbiAgY29uc3QgcGFuZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29uc2lzdGVuY3ktcmVwb3J0Jyk7XG4gIGlmICghcGFuZWwpIHJldHVybjtcblxuICBjb25zdCBhbmFseXNpcyAgICA9IHN0YXR1c0RhdGEuam9iX2FuYWx5c2lzIHx8IHt9O1xuICBjb25zdCBjb21wYW55ICAgICA9IChhbmFseXNpcy5jb21wYW55ICB8fCAnJykudHJpbSgpO1xuICBjb25zdCBqb2JUaXRsZSAgICA9IChhbmFseXNpcy50aXRsZSAgICB8fCAnJykudHJpbSgpO1xuICBjb25zdCBhdHNLZXl3b3JkcyA9IChhbmFseXNpcy5hdHNfa2V5d29yZHMgfHwgW10pLmZpbHRlcihCb29sZWFuKS5zbGljZSgwLCA4KTtcblxuICAvLyBTdHJpcCBIVE1MIHRhZ3MgZnJvbSBDViBjb250ZW50IGZvciB0ZXh0IHNlYXJjaFxuICBjb25zdCBjdlN0YXRlID0gc3RhdGVNYW5hZ2VyLmdldFRhYkRhdGEoJ2N2JykgfHwgJyc7XG4gIGNvbnN0IGN2SHRtbCA9IHR5cGVvZiBjdlN0YXRlID09PSAnc3RyaW5nJyA/IGN2U3RhdGUgOiAoY3ZTdGF0ZT8uWycqLmh0bWwnXSB8fCAnJyk7XG4gIGNvbnN0IGN2VGV4dCA9IGN2SHRtbC5yZXBsYWNlKC88W14+XSs+L2csICcgJykucmVwbGFjZSgvXFxzKy9nLCAnICcpLnRvTG93ZXJDYXNlKCk7XG5cbiAgLy8gR2V0IGNvdmVyIGxldHRlciB0ZXh0IGlmIHByZXNlbnRcbiAgY29uc3QgY2xFbCAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWxldHRlci10ZXh0YXJlYScpO1xuICBjb25zdCBjbFJhdyAgPSBjbEVsID8gY2xFbC52YWx1ZSA6ICcnO1xuICBjb25zdCBjbFRleHQgPSBjbFJhdy50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBoYXNDTCAgPSBjbFJhdy50cmltKCkubGVuZ3RoID4gNTA7XG5cbiAgaWYgKCFjb21wYW55ICYmICFqb2JUaXRsZSAmJiAhYXRzS2V5d29yZHMubGVuZ3RoKSB7XG4gICAgcGFuZWwuaW5uZXJIVE1MID0gJyc7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY2hlY2tzID0gW107XG5cbiAgLy8gXHUyNTAwXHUyNTAwIDEuIENvbXBhbnkgbmFtZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgaWYgKGNvbXBhbnkpIHtcbiAgICBjb25zdCBjb21wTGMgPSBjb21wYW55LnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgaW5DViAgID0gY3ZUZXh0LmluY2x1ZGVzKGNvbXBMYyk7XG4gICAgY29uc3QgaW5DTCAgID0gaGFzQ0wgJiYgY2xUZXh0LmluY2x1ZGVzKGNvbXBMYyk7XG4gICAgY29uc3QgbWlzc2luZyA9IFtdO1xuICAgIGlmICghaW5DVikgICAgICAgICAgbWlzc2luZy5wdXNoKCdDVicpO1xuICAgIGlmIChoYXNDTCAmJiAhaW5DTCkgbWlzc2luZy5wdXNoKCdjb3ZlciBsZXR0ZXInKTtcbiAgICBjb25zdCBzdGF0dXMgPSBtaXNzaW5nLmxlbmd0aCA9PT0gMCA/ICdwYXNzJyA6IG1pc3NpbmcubGVuZ3RoIDwgMiAmJiBoYXNDTCA/ICd3YXJuJyA6ICdmYWlsJztcbiAgICBjaGVja3MucHVzaCh7XG4gICAgICBzdGF0dXMsXG4gICAgICBsYWJlbDogICdDb21wYW55IG5hbWUnLFxuICAgICAgZGV0YWlsOiBzdGF0dXMgPT09ICdwYXNzJ1xuICAgICAgICA/IGBcXHUyMDFjJHtlc2NhcGVIdG1sKGNvbXBhbnkpfVxcdTIwMWQgZm91bmQgaW4gYWxsIGRvY3VtZW50cy5gXG4gICAgICAgIDogYFxcdTIwMWMke2VzY2FwZUh0bWwoY29tcGFueSl9XFx1MjAxZCBtaXNzaW5nIGZyb206ICR7bWlzc2luZy5qb2luKCcsICcpfS5gLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gXHUyNTAwXHUyNTAwIDIuIEpvYiB0aXRsZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgaWYgKGpvYlRpdGxlKSB7XG4gICAgY29uc3QgdGl0bGVMYyAgID0gam9iVGl0bGUudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCB0aXRsZUNvcmUgPSB0aXRsZUxjLnJlcGxhY2UoL14oc2VuaW9yfGp1bmlvcnxsZWFkfHByaW5jaXBhbHxzdGFmZnxhc3NvY2lhdGUpXFxzKy8sICcnKTtcbiAgICBjb25zdCBpbkNWICAgICAgPSBjdlRleHQuaW5jbHVkZXModGl0bGVMYykgfHwgY3ZUZXh0LmluY2x1ZGVzKHRpdGxlQ29yZSk7XG4gICAgY29uc3QgaW5DTCAgICAgID0gaGFzQ0wgJiYgKGNsVGV4dC5pbmNsdWRlcyh0aXRsZUxjKSB8fCBjbFRleHQuaW5jbHVkZXModGl0bGVDb3JlKSk7XG4gICAgY29uc3QgbWlzc2luZyAgID0gW107XG4gICAgaWYgKCFpbkNWKSAgICAgICAgICBtaXNzaW5nLnB1c2goJ0NWJyk7XG4gICAgaWYgKGhhc0NMICYmICFpbkNMKSBtaXNzaW5nLnB1c2goJ2NvdmVyIGxldHRlcicpO1xuICAgIGNvbnN0IHN0YXR1cyA9IG1pc3NpbmcubGVuZ3RoID09PSAwID8gJ3Bhc3MnIDogbWlzc2luZy5sZW5ndGggPCAyICYmIGhhc0NMID8gJ3dhcm4nIDogJ2ZhaWwnO1xuICAgIGNoZWNrcy5wdXNoKHtcbiAgICAgIHN0YXR1cyxcbiAgICAgIGxhYmVsOiAgJ0pvYiB0aXRsZScsXG4gICAgICBkZXRhaWw6IHN0YXR1cyA9PT0gJ3Bhc3MnXG4gICAgICAgID8gYFxcdTIwMWMke2VzY2FwZUh0bWwoam9iVGl0bGUpfVxcdTIwMWQgZm91bmQgaW4gYWxsIGRvY3VtZW50cy5gXG4gICAgICAgIDogYFxcdTIwMWMke2VzY2FwZUh0bWwoam9iVGl0bGUpfVxcdTIwMWQgbWlzc2luZyBmcm9tOiAke21pc3Npbmcuam9pbignLCAnKX0uYCxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFx1MjUwMFx1MjUwMCAzLiBBVFMga2V5d29yZHMgKHRvcCA4KSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgaWYgKGF0c0tleXdvcmRzLmxlbmd0aCkge1xuICAgIGNvbnN0IG1pc3NpbmdDViA9IGF0c0tleXdvcmRzLmZpbHRlcihrdyA9PiAhY3ZUZXh0LmluY2x1ZGVzKGt3LnRvTG93ZXJDYXNlKCkpKTtcbiAgICBjb25zdCBtaXNzaW5nQ0wgPSBoYXNDTCA/IGF0c0tleXdvcmRzLmZpbHRlcihrdyA9PiAhY2xUZXh0LmluY2x1ZGVzKGt3LnRvTG93ZXJDYXNlKCkpKSA6IFtdO1xuICAgIGNvbnN0IHRvdGFsTWlzc2luZyA9IG5ldyBTZXQoWy4uLm1pc3NpbmdDViwgLi4ubWlzc2luZ0NMXSkuc2l6ZTtcbiAgICBjb25zdCBzdGF0dXMgPSB0b3RhbE1pc3NpbmcgPT09IDAgPyAncGFzcycgOiB0b3RhbE1pc3NpbmcgPD0gMyA/ICd3YXJuJyA6ICdmYWlsJztcbiAgICBjb25zdCBwYXJ0cyAgPSBbXTtcbiAgICBpZiAobWlzc2luZ0NWLmxlbmd0aCkgcGFydHMucHVzaChgTWlzc2luZyBmcm9tIENWOiAke21pc3NpbmdDVi5tYXAoayA9PiBgPGVtPiR7ZXNjYXBlSHRtbChrKX08L2VtPmApLmpvaW4oJywgJyl9YCk7XG4gICAgaWYgKG1pc3NpbmdDTC5sZW5ndGgpIHBhcnRzLnB1c2goYE1pc3NpbmcgZnJvbSBjb3ZlciBsZXR0ZXI6ICR7bWlzc2luZ0NMLm1hcChrID0+IGA8ZW0+JHtlc2NhcGVIdG1sKGspfTwvZW0+YCkuam9pbignLCAnKX1gKTtcbiAgICBjaGVja3MucHVzaCh7XG4gICAgICBzdGF0dXMsXG4gICAgICBsYWJlbDogIGBBVFMga2V5d29yZHMgKCR7YXRzS2V5d29yZHMubGVuZ3RofSBjaGVja2VkKWAsXG4gICAgICBkZXRhaWw6IHBhcnRzLmxlbmd0aCA/IHBhcnRzLmpvaW4oJy4gJykgKyAnLicgOiBgQWxsICR7YXRzS2V5d29yZHMubGVuZ3RofSBrZXl3b3JkcyBwcmVzZW50IGluIGRvY3VtZW50cy5gLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gXHUyNTAwXHUyNTAwIDQuIERhdGUgZm9ybWF0IGNvbnNpc3RlbmN5IChDVikgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIGlmIChjdlRleHQpIHtcbiAgICBjb25zdCBoYXNXcml0dGVuID0gL1xcYihqYW58ZmVifG1hcnxhcHJ8bWF5fGp1bnxqdWx8YXVnfHNlcHxvY3R8bm92fGRlYylcXHcqXFxzK1xcZHs0fVxcYi9pLnRlc3QoY3ZUZXh0KTtcbiAgICBjb25zdCBoYXNJU08gICAgID0gL1xcYlxcZHs0fS1cXGR7Mn1cXGIvLnRlc3QoY3ZUZXh0KTtcbiAgICBjb25zdCBoYXNTbGFzaCAgID0gL1xcYlxcZHsxLDJ9XFwvXFxkezR9XFxiLy50ZXN0KGN2VGV4dCk7XG4gICAgY29uc3QgZm9ybWF0Q291bnQgPSBbaGFzV3JpdHRlbiwgaGFzSVNPLCBoYXNTbGFzaF0uZmlsdGVyKEJvb2xlYW4pLmxlbmd0aDtcbiAgICBjaGVja3MucHVzaCh7XG4gICAgICBzdGF0dXM6IGZvcm1hdENvdW50IDw9IDEgPyAncGFzcycgOiAnd2FybicsXG4gICAgICBsYWJlbDogICdEYXRlIGZvcm1hdHMgKENWKScsXG4gICAgICBkZXRhaWw6IGZvcm1hdENvdW50IDw9IDFcbiAgICAgICAgPyAnQ29uc2lzdGVudCBkYXRlIGZvcm1hdCB0aHJvdWdob3V0IENWLidcbiAgICAgICAgOiAnTWl4ZWQgZGF0ZSBmb3JtYXRzIGRldGVjdGVkIChlLmcuIFxcdTIwMWNKYW4gMjAyMFxcdTIwMWQgYW5kIFxcdTIwMWMyMDIwLTAxXFx1MjAxZCkgXFx1MjAxNCBzdGFuZGFyZGlzZSBmb3IgYSBwb2xpc2hlZCBsb29rLicsXG4gICAgfSk7XG4gIH1cblxuICAvLyBcXHUyNTAwXFx1MjUwMCA1LiBDcm9zcy1kb2N1bWVudCB0ZXJtaW5vbG9neSBjb25zaXN0ZW5jeSBcXHUyNTAwXFx1MjUwMFxcdTI1MDBcXHUyNTAwXFx1MjUwMFxcdTI1MDBcXHUyNTAwXFx1MjUwMFxcdTI1MDBcXHUyNTAwXFx1MjUwMFxcdTI1MDBcXHUyNTAwXFx1MjUwMFxcdTI1MDBcXHUyNTAwXFx1MjUwMFxcdTI1MDBcXHUyNTAwXFx1MjUwMFxcdTI1MDBcbiAgY29uc3Qgc3FUZXh0cyA9IFsuLi5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCd0ZXh0YXJlYVtpZF49XCJzYy10ZXh0LVwiXScpXVxuICAgIC5tYXAoZWwgPT4gZWwudmFsdWUudG9Mb3dlckNhc2UoKSkuZmlsdGVyKEJvb2xlYW4pO1xuICBjb25zdCBhbGxEb2NUZXh0ID0gW2N2VGV4dCwgY2xUZXh0LCAuLi5zcVRleHRzXTtcblxuICBjb25zdCBfVEVSTV9QQUlSUyA9IFtcbiAgICBbJ21hY2hpbmUgbGVhcm5pbmcnLCAnbWwnXSwgWydhcnRpZmljaWFsIGludGVsbGlnZW5jZScsICdhaSddLFxuICAgIFsnbmF0dXJhbCBsYW5ndWFnZSBwcm9jZXNzaW5nJywgJ25scCddLCBbJ2RlZXAgbGVhcm5pbmcnLCAnZGwnXSxcbiAgICBbJ2xhcmdlIGxhbmd1YWdlIG1vZGVsJywgJ2xsbSddLCBbJ3VzZXIgaW50ZXJmYWNlJywgJ3VpJ10sXG4gICAgWyd1c2VyIGV4cGVyaWVuY2UnLCAndXgnXSwgWydhcHBsaWNhdGlvbiBwcm9ncmFtbWluZyBpbnRlcmZhY2UnLCAnYXBpJ10sXG4gICAgWydrdWJlcm5ldGVzJywgJ2s4cyddLCBbJ2NvbnRpbnVvdXMgaW50ZWdyYXRpb24nLCAnY2kvY2QnXSxcbiAgXTtcbiAgY29uc3QgdGVybU1pc21hdGNoZXMgPSBbXTtcbiAgZm9yIChjb25zdCBbbG9uZywgc2hvcnRdIG9mIF9URVJNX1BBSVJTKSB7XG4gICAgY29uc3QgcmUgPSBuZXcgUmVnRXhwKGBcXFxcYiR7c2hvcnQucmVwbGFjZSgnLycsICdcXFxcLycpfVxcXFxiYCk7XG4gICAgaWYgKGFsbERvY1RleHQuc29tZSh0ID0+IHQuaW5jbHVkZXMobG9uZykpICYmIGFsbERvY1RleHQuc29tZSh0ID0+IHJlLnRlc3QodCkpKSB7XG4gICAgICB0ZXJtTWlzbWF0Y2hlcy5wdXNoKGBcXHUyMDFjJHtsb25nfVxcdTIwMWQgLyBcXHUyMDFjJHtzaG9ydC50b1VwcGVyQ2FzZSgpfVxcdTIwMWRgKTtcbiAgICB9XG4gIH1cbiAgaWYgKHRlcm1NaXNtYXRjaGVzLmxlbmd0aCA+IDApIHtcbiAgICBjaGVja3MucHVzaCh7XG4gICAgICBzdGF0dXM6ICd3YXJuJyxcbiAgICAgIGxhYmVsOiAgJ1Rlcm1pbm9sb2d5IGNvbnNpc3RlbmN5JyxcbiAgICAgIGRldGFpbDogYE1peGVkIGZvcm1zIGRldGVjdGVkIGFjcm9zcyBkb2N1bWVudHM6ICR7dGVybU1pc21hdGNoZXMuam9pbignOyAnKX0uIFN0YW5kYXJkaXNlIHRvIG9uZSBmb3JtIHBlciBjb25jZXB0LmAsXG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoYWxsRG9jVGV4dC5zb21lKHQgPT4gdC5sZW5ndGggPiA1MCkpIHtcbiAgICBjaGVja3MucHVzaCh7XG4gICAgICBzdGF0dXM6ICdwYXNzJyxcbiAgICAgIGxhYmVsOiAgJ1Rlcm1pbm9sb2d5IGNvbnNpc3RlbmN5JyxcbiAgICAgIGRldGFpbDogJ05vIG1peGVkIGFiYnJldmlhdGlvbi9leHBhbnNpb24gcGFpcnMgZGV0ZWN0ZWQgYWNyb3NzIENWLCBjb3ZlciBsZXR0ZXIsIGFuZCBzY3JlZW5pbmcgYW5zd2Vycy4nLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gXHUyNTAwXHUyNTAwIFJlbmRlciBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgY29uc3QgaWNvbnMgPSB7IHBhc3M6ICdcXHUyNzA1Jywgd2FybjogJ1xcdTI2YTBcXHVmZTBmJywgZmFpbDogJ1xcdTI3NGMnIH07XG4gIGNvbnN0IG92ZXJhbGxGYWlsICAgPSBjaGVja3Muc29tZShjID0+IGMuc3RhdHVzID09PSAnZmFpbCcpO1xuICBjb25zdCBvdmVyYWxsV2FybiAgID0gY2hlY2tzLnNvbWUoYyA9PiBjLnN0YXR1cyA9PT0gJ3dhcm4nKTtcbiAgY29uc3Qgb3ZlcmFsbFN0YXR1cyA9IG92ZXJhbGxGYWlsID8gJ2ZhaWwnIDogb3ZlcmFsbFdhcm4gPyAnd2FybicgOiAncGFzcyc7XG4gIGNvbnN0IG92ZXJhbGxNc2cgICAgPSBvdmVyYWxsRmFpbFxuICAgID8gJ0lzc3VlcyBmb3VuZCBcXHUyMDE0IHJldmlldyBiZWZvcmUgc2VuZGluZydcbiAgICA6IG92ZXJhbGxXYXJuID8gJ01pbm9yIGluY29uc2lzdGVuY2llcyBkZXRlY3RlZCcgOiAnQWxsIGNoZWNrcyBwYXNzZWQnO1xuXG4gIHBhbmVsLmlubmVySFRNTCA9IGBcbiAgICA8ZGl2IGNsYXNzPVwiY29uc2lzdGVuY3ktcmVwb3J0XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3ItaGVhZGVyXCI+XG4gICAgICAgIDxoMyBzdHlsZT1cIm1hcmdpbjowO2ZvbnQtc2l6ZToxZW07XCI+JHtpY29uc1tvdmVyYWxsU3RhdHVzXX0gQ3Jvc3MtRG9jdW1lbnQgQ29uc2lzdGVuY3k8L2gzPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImNyLWJhZGdlIGNyLSR7b3ZlcmFsbFN0YXR1c31cIj4ke2VzY2FwZUh0bWwob3ZlcmFsbE1zZyl9PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7Zm9udC1zaXplOjAuODNlbTttYXJnaW46MCAwIDEycHg7XCI+XG4gICAgICAgIENoZWNrcyBjb21wYW55IG5hbWUsIGpvYiB0aXRsZSwgQVRTIGtleXdvcmRzLCBkYXRlIGZvcm1hdHRpbmcsIGFuZCB0ZXJtaW5vbG9neSBjb25zaXN0ZW5jeSBhY3Jvc3MgQ1YsIGNvdmVyIGxldHRlciwgYW5kIHNjcmVlbmluZyBhbnN3ZXJzLlxuICAgICAgPC9wPlxuICAgICAgPGRpdiBjbGFzcz1cImNyLWNoZWNrc1wiPlxuICAgICAgICAke2NoZWNrcy5tYXAoYyA9PiBgXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNyLWNoZWNrIGNyLSR7Yy5zdGF0dXN9XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNyLWljb25cIj4ke2ljb25zW2Muc3RhdHVzXX08L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNyLWxhYmVsXCI+JHtlc2NhcGVIdG1sKGMubGFiZWwpfTwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3ItZGV0YWlsXCI+JHtjLmRldGFpbH08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+YCkuam9pbignJyl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgRGVib3VuY2VkIHZhbGlkYXRpb24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmxldCBfY2xWYWxpZGF0ZVRpbWVyID0gbnVsbDtcbmZ1bmN0aW9uIF9kZWJvdW5jZWRWYWxpZGF0ZUNMKCkge1xuICBjbGVhclRpbWVvdXQoX2NsVmFsaWRhdGVUaW1lcik7XG4gIF9jbFZhbGlkYXRlVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICBjb25zdCB0YSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1sZXR0ZXItdGV4dGFyZWEnKTtcbiAgICBpZiAodGEpIF92YWxpZGF0ZUNvdmVyTGV0dGVyKHRhLnZhbHVlKTtcbiAgfSwgNjAwKTtcbn1cblxuLyoqXG4gKiBDbGllbnQtc2lkZSBjb3ZlciBsZXR0ZXIgcXVhbGl0eSBjaGVja3MuXG4gKiA1IHJ1bGVzOiBvcGVuaW5nLCBJLWZpcnN0IGdhdGUsIGNvbXBhbnkgbmFtZSwgd29yZCBjb3VudCAocm9sZS1kaWZmZXJlbnRpYXRlZCksIGNhbGwtdG8tYWN0aW9uLlxuICovXG5mdW5jdGlvbiBfdmFsaWRhdGVDb3ZlckxldHRlcih0ZXh0KSB7XG4gIGNvbnN0IHBhbmVsICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC12YWxpZGF0aW9uLXBhbmVsJyk7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1jaGVja3MtY29udGFpbmVyJyk7XG4gIGlmICghcGFuZWwgfHwgIWNvbnRhaW5lciB8fCAhdGV4dC50cmltKCkpIHJldHVybjtcblxuICAvLyBcdTI1MDBcdTI1MDAgUnVsZSAxOiBPcGVuaW5nIHBhdHRlcm4gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIGNvbnN0IGZpcnN0TGluZSA9ICh0ZXh0LnNwbGl0KCdcXG4nKS5maW5kKGwgPT4gbC50cmltKCkpIHx8ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgZ2VuZXJpY09wZW5pbmdzID0gW1xuICAgIC9eZGVhciBoaXJpbmcgbWFuYWdlci8sXG4gICAgL15kZWFyIHNpciBvciBtYWRhbS8sXG4gICAgL150byB3aG9tIGl0IG1heSBjb25jZXJuLyxcbiAgICAvXmRlYXIgcmVjcnVpdGVyLyxcbiAgICAvXmRlYXIgaHVtYW4gcmVzb3VyY2VzLyxcbiAgICAvXmRlYXIgaHIvLFxuICBdO1xuICBjb25zdCBnZW5lcmljT3BlbmluZyA9IGdlbmVyaWNPcGVuaW5ncy5zb21lKHJlID0+IHJlLnRlc3QoZmlyc3RMaW5lKSk7XG4gIGNvbnN0IG9wZW5pbmdDaGVjayA9IHtcbiAgICBwYXNzOiAhZ2VuZXJpY09wZW5pbmcsXG4gICAgbGFiZWw6ICdPcGVuaW5nIHNhbHV0YXRpb24nLFxuICAgIGRldGFpbDogZ2VuZXJpY09wZW5pbmdcbiAgICAgID8gJ1VzZXMgYSBnZW5lcmljIG9wZW5lciAoXCJEZWFyIEhpcmluZyBNYW5hZ2VyXCIgZXRjLikgXHUyMDE0IHBlcnNvbmFsaXNlIHdpdGggYSBuYW1lIG9yIHJvbGUuJ1xuICAgICAgOiAnUGVyc29uYWxpc2VkIG9wZW5lciBcdTIwMTQgZ29vZC4nLFxuICB9O1xuXG4gIC8vIFx1MjUwMFx1MjUwMCBSdWxlIDFiOiBCb2R5IG11c3Qgbm90IG9wZW4gd2l0aCBcIklcIiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgY29uc3QgYWxsTGluZXMgPSB0ZXh0LnNwbGl0KCdcXG4nKS5tYXAobCA9PiBsLnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pO1xuICBjb25zdCBzYWx1dGF0aW9uSWR4ID0gYWxsTGluZXMuZmluZEluZGV4KFxuICAgIGwgPT4gbC50b0xvd2VyQ2FzZSgpID09PSBmaXJzdExpbmUudG9Mb3dlckNhc2UoKVxuICApO1xuICBjb25zdCBib2R5TGluZXMgPSBhbGxMaW5lcy5zbGljZShNYXRoLm1heCgwLCBzYWx1dGF0aW9uSWR4ICsgMSkpO1xuICBjb25zdCBmaXJzdEJvZHlXb3JkID0gKGJvZHlMaW5lcy5maW5kKGwgPT4gbC50cmltKCkpIHx8ICcnKS5zcGxpdCgvXFxzKy8pWzBdIHx8ICcnO1xuICAvLyBTcGxpdCBvbiBub24tYWxwaGEgc28gXCJJJ21cIiBcdTIxOTIgdG9rZW4gXCJJXCIsIFwiSW5cIiBcdTIxOTIgdG9rZW4gXCJJblwiXG4gIGNvbnN0IGZpcnN0Qm9keVRva2VuID0gZmlyc3RCb2R5V29yZC5zcGxpdCgvW15hLXpBLVpdLylbMF0gfHwgJyc7XG4gIGNvbnN0IGJvZHlTdGFydHNXaXRoSSA9IGZpcnN0Qm9keVRva2VuLnRvTG93ZXJDYXNlKCkgPT09ICdpJztcbiAgY29uc3QgaUZpcnN0Q2hlY2sgPSB7XG4gICAgcGFzczogIWJvZHlTdGFydHNXaXRoSSxcbiAgICBsYWJlbDogJ09wZW5pbmcgd29yZCcsXG4gICAgZGV0YWlsOiBib2R5U3RhcnRzV2l0aElcbiAgICAgID8gJ0JvZHkgb3BlbnMgd2l0aCBcIklcIiBcdTIwMTQgbGVhZCB3aXRoIHlvdXIgdmFsdWUsIHRoZSByb2xlLCBvciB0aGUgY29tcGFueSBpbnN0ZWFkLidcbiAgICAgIDogJ0JvZHkgZG9lcyBub3Qgb3BlbiB3aXRoIFwiSVwiIFx1MjAxNCBnb29kLicsXG4gIH07XG5cbiAgLy8gXHUyNTAwXHUyNTAwIFJ1bGUgMjogQ29tcGFueS1zcGVjaWZpYyByZWZlcmVuY2UgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIGNvbnN0IGNvbXBhbnlOYW1lID0gX2dldENvbXBhbnlOYW1lRm9yQ0woKTtcbiAgbGV0IGNvbXBhbnlDaGVjaztcbiAgaWYgKCFjb21wYW55TmFtZSkge1xuICAgIGNvbXBhbnlDaGVjayA9IHsgd2FybjogdHJ1ZSwgbGFiZWw6ICdDb21wYW55IHJlZmVyZW5jZScsIGRldGFpbDogJ0NvbXBhbnkgbmFtZSBub3QgZGV0ZWN0ZWQgZnJvbSBqb2IgZGVzY3JpcHRpb24gXHUyMDE0IHZlcmlmeSBtYW51YWxseS4nIH07XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgbWVudGlvbnMgPSAodGV4dC50b0xvd2VyQ2FzZSgpLm1hdGNoKG5ldyBSZWdFeHAoY29tcGFueU5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgJ1xcXFwkJicpLCAnZycpKSB8fCBbXSkubGVuZ3RoO1xuICAgIGNvbXBhbnlDaGVjayA9IHtcbiAgICAgIHBhc3M6IG1lbnRpb25zID49IDIsXG4gICAgICB3YXJuOiBtZW50aW9ucyA9PT0gMSxcbiAgICAgIGxhYmVsOiAnQ29tcGFueSByZWZlcmVuY2UnLFxuICAgICAgZGV0YWlsOiBtZW50aW9ucyA9PT0gMFxuICAgICAgICA/IGBcIiR7ZXNjYXBlSHRtbChjb21wYW55TmFtZSl9XCIgbm90IG1lbnRpb25lZCBcdTIwMTQgYWRkIHNwZWNpZmljIHJlZmVyZW5jZXMuYFxuICAgICAgICA6IG1lbnRpb25zID09PSAxXG4gICAgICAgICAgPyBgXCIke2VzY2FwZUh0bWwoY29tcGFueU5hbWUpfVwiIG1lbnRpb25lZCBvbmNlIFx1MjAxNCBhIHNlY29uZCBzcGVjaWZpYyByZWZlcmVuY2Ugc3RyZW5ndGhlbnMgdGhlIGxldHRlci5gXG4gICAgICAgICAgOiBgXCIke2VzY2FwZUh0bWwoY29tcGFueU5hbWUpfVwiIG1lbnRpb25lZCAke21lbnRpb25zfSB0aW1lcyBcdTIwMTQgZ29vZCBzcGVjaWZpY2l0eS5gLFxuICAgIH07XG4gIH1cblxuICAvLyBcdTI1MDBcdTI1MDAgUnVsZSAzOiBXb3JkIGNvdW50IChyb2xlLWRpZmZlcmVudGlhdGVkIHRhcmdldCkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIGNvbnN0IF9yb2xlQW5hbHlzaXMgPSB3aW5kb3cuX2xhc3RBbmFseXNpc0RhdGEgfHxcbiAgICAod2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnMgJiYgd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnMuam9iX2FuYWx5c2lzKSB8fCB7fTtcbiAgY29uc3QgX3JvbGVMZXZlbCAgPSAoX3JvbGVBbmFseXNpcy5yb2xlX2xldmVsIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBfcm9sZURvbWFpbiA9IChfcm9sZUFuYWx5c2lzLmRvbWFpbiB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgaXNFeGVjICAgICAgPSAvZXhlY3x2cHxjLXN1aXRlfGNoaWVmfGRpcmVjdG9yfHByZXNpZGVudHxwYXJ0bmVyLy50ZXN0KF9yb2xlTGV2ZWwpO1xuICBjb25zdCBpc0FjYWRlbWljICA9IC9hY2FkZW1pY3xyZXNlYXJjaHxmYWN1bHR5fHByb2Zlc3Nvcnxwb3N0ZG9jLy50ZXN0KF9yb2xlRG9tYWluICsgJyAnICsgX3JvbGVMZXZlbCk7XG4gIGNvbnN0IHdjVGFyZ2V0ICAgID0gaXNBY2FkZW1pYyA/IHsgbG86IDUwMCwgaGk6IDYwMCwgd2FybkxvOiA0MDAsIHdhcm5IaTogNjUwIH1cbiAgICAgICAgICAgICAgICAgICAgOiBpc0V4ZWMgICAgID8geyBsbzogNDAwLCBoaTogNTAwLCB3YXJuTG86IDMwMCwgd2FybkhpOiA1NTAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7IGxvOiAyNTAsIGhpOiAzMDAsIHdhcm5MbzogMjAwLCB3YXJuSGk6IDQwMCB9O1xuICBjb25zdCB3Y0xhYmVsICAgICA9IGlzQWNhZGVtaWMgPyBgJHt3Y1RhcmdldC5sb31cdTIwMTMke3djVGFyZ2V0LmhpfSAoYWNhZGVtaWMvcmVzZWFyY2gpYFxuICAgICAgICAgICAgICAgICAgICA6IGlzRXhlYyAgICAgPyBgJHt3Y1RhcmdldC5sb31cdTIwMTMke3djVGFyZ2V0LmhpfSAoZXhlY3V0aXZlKWBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYFx1MjI2NCR7d2NUYXJnZXQuaGl9IChzdGFuZGFyZClgO1xuXG4gIGNvbnN0IHdvcmRzICAgID0gdGV4dC50cmltKCkuc3BsaXQoL1xccysvKS5maWx0ZXIoQm9vbGVhbikubGVuZ3RoO1xuICBjb25zdCB3Y1BjdCAgICA9IE1hdGgubWluKDEwMCwgKHdvcmRzIC8gd2NUYXJnZXQuaGkpICogMTAwKTtcbiAgY29uc3Qgd2NDb2xvdXIgPSB3b3JkcyA8IHdjVGFyZ2V0Lndhcm5MbyA/ICcjZWY0NDQ0J1xuICAgICAgICAgICAgICAgICA6IHdvcmRzIDwgd2NUYXJnZXQubG8gICAgICA/ICcjZjU5ZTBiJ1xuICAgICAgICAgICAgICAgICA6IHdvcmRzIDw9IHdjVGFyZ2V0LmhpICAgICA/ICcjMjJjNTVlJ1xuICAgICAgICAgICAgICAgICA6IHdvcmRzIDw9IHdjVGFyZ2V0Lndhcm5IaSA/ICcjZjU5ZTBiJ1xuICAgICAgICAgICAgICAgICA6ICcjZWY0NDQ0JztcbiAgY29uc3Qgd2NTdGF0dXMgPSB3b3JkcyA+PSB3Y1RhcmdldC5sbyAmJiB3b3JkcyA8PSB3Y1RhcmdldC5oaSA/ICdwYXNzJ1xuICAgICAgICAgICAgICAgICA6IHdvcmRzID49IHdjVGFyZ2V0Lndhcm5MbyAmJiB3b3JkcyA8PSB3Y1RhcmdldC53YXJuSGkgPyAnd2FybidcbiAgICAgICAgICAgICAgICAgOiAnZmFpbCc7XG4gIGNvbnN0IHdjQmFyICAgID0gYDxzcGFuIGNsYXNzPVwiY2wtd2MtYmFyXCI+PHNwYW4gY2xhc3M9XCJjbC13Yy1maWxsXCIgc3R5bGU9XCJ3aWR0aDoke3djUGN0fSU7YmFja2dyb3VuZDoke3djQ29sb3VyfTtcIj48L3NwYW4+PC9zcGFuPmA7XG4gIGNvbnN0IHdvcmRDb3VudENoZWNrID0ge1xuICAgIFt3Y1N0YXR1c106IHRydWUsXG4gICAgbGFiZWw6IGBXb3JkIGNvdW50ICgke3djTGFiZWx9KWAsXG4gICAgZGV0YWlsOiBgJHt3b3Jkc30gd29yZHMgJHt3Y0Jhcn0gXHUyMDE0ICR7XG4gICAgICB3b3JkcyA8IHdjVGFyZ2V0LmxvID8gYHRvbyBzaG9ydDsgYWltIGZvciAke3djVGFyZ2V0LmxvfVx1MjAxMyR7d2NUYXJnZXQuaGl9LmBcbiAgICAgIDogd29yZHMgPiB3Y1RhcmdldC5oaSA/IGB0b28gbG9uZzsgdHJpbSB0byAke3djVGFyZ2V0LmhpfSB3b3Jkcy5gXG4gICAgICA6ICd3aXRoaW4gdGFyZ2V0IHJhbmdlLidcbiAgICB9YCxcbiAgfTtcblxuICAvLyBcdTI1MDBcdTI1MDAgUnVsZSA0OiBDYWxsLXRvLWFjdGlvbiBjbG9zaW5nIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICBjb25zdCBsYXN0UGFyYSA9IHRleHQuc3BsaXQoL1xcbnsyLH0vKS5maWx0ZXIocCA9PiBwLnRyaW0oKSkuc2xpY2UoLTEpWzBdIHx8ICcnO1xuICAvLyBBc3NlcnRpdmUgQ1RBczogY2FuZGlkYXRlIHRha2VzIGluaXRpYXRpdmUgKHBhc3MpXG4gIGNvbnN0IGFzc2VydGl2ZUN0YVBhdHRlcm5zID0gW1xuICAgIC9pbnRlcnZpZXcvaSwgL2Rpc2N1c3MvaSwgL29wcG9ydHVuaXR5IHRvIChzcGVha3x0YWxrfG1lZXR8Y29ubmVjdCkvaSxcbiAgICAvaSB3aWxsIChjYWxsfGZvbGxvdy4/dXB8cmVhY2ggb3V0fGNvbnRhY3R8c2VuZCkvaSxcbiAgICAvaSAocGxhbnxpbnRlbmQpIHRvL2ksIC93ZWxjb21lIHRoZSBjaGFuY2UvaSxcbiAgICAvYXZhaWxhYmxlIChmb3J8dG8pL2ksIC9jb250YWN0IG1lL2ksXG4gIF07XG4gIC8vIFBhc3NpdmUgQ1RBczogd2FpdGluZyBmb3IgYSByZXNwb25zZSAoZmFpbCBcdTIwMTQgc3RvcnkgVVMtUDUgcmVxdWlyZXMgcmVqZWN0aW9uKVxuICBjb25zdCBwYXNzaXZlQ3RhUGF0dGVybnMgPSBbXG4gICAgL2hlYXIgZnJvbSB5b3UvaSwgL2xvb2sgZm9yd2FyZCB0byAoeW91cnxoZWFyaW5nKS9pLFxuICAgIC9hd2FpdChpbmcpPyB5b3VyL2ksIC9ob3BlIHRvIChoZWFyfG1lZXQpL2ksXG4gIF07XG4gIGNvbnN0IGhhc0Fzc2VydGl2ZUN0YSA9IGFzc2VydGl2ZUN0YVBhdHRlcm5zLnNvbWUocmUgPT4gcmUudGVzdChsYXN0UGFyYSkpO1xuICBjb25zdCBoYXNQYXNzaXZlQ3RhICAgPSBwYXNzaXZlQ3RhUGF0dGVybnMuc29tZShyZSA9PiByZS50ZXN0KGxhc3RQYXJhKSk7XG4gIGNvbnN0IGN0YUNoZWNrID0ge1xuICAgIHBhc3M6IGhhc0Fzc2VydGl2ZUN0YSxcbiAgICBmYWlsOiAhaGFzQXNzZXJ0aXZlQ3RhICYmIGhhc1Bhc3NpdmVDdGEsXG4gICAgbGFiZWw6ICdDYWxsLXRvLWFjdGlvbiBjbG9zaW5nJyxcbiAgICBkZXRhaWw6IGhhc0Fzc2VydGl2ZUN0YVxuICAgICAgPyAnQXNzZXJ0aXZlIGNhbGwtdG8tYWN0aW9uIFx1MjAxNCB0YWtlcyBpbml0aWF0aXZlLidcbiAgICAgIDogaGFzUGFzc2l2ZUN0YVxuICAgICAgICA/ICdQYXNzaXZlIGNsb3NpbmcgcmVqZWN0ZWQgXHUyMDE0IHBocmFzZXMgbGlrZSBcIkkgbG9vayBmb3J3YXJkIHRvIGhlYXJpbmcgZnJvbSB5b3VcIiBhcmUgdG9vIHBhc3NpdmUuIFJlcGxhY2Ugd2l0aCBhIGRpcmVjdCBpbnRlcnZpZXcgcmVxdWVzdDogXCJJIHdvdWxkIHdlbGNvbWUgdGhlIG9wcG9ydHVuaXR5IHRvIGludGVydmlld1wiIG9yIFwiSSB3aWxsIGZvbGxvdyB1cCBuZXh0IHdlZWsuXCInXG4gICAgICAgIDogJ05vIGNhbGwtdG8tYWN0aW9uIGZvdW5kIFx1MjAxNCBhZGQgYSBkaXJlY3QgaW50ZXJ2aWV3IHJlcXVlc3Qgb3IgcHJvYWN0aXZlIGZvbGxvdy11cCBzdGF0ZW1lbnQuJyxcbiAgfTtcblxuICAvLyBcdTI1MDBcdTI1MDAgUnVsZSA1OiBOYW1lZCBvciBxdWFudGlmaWVkIGFjaGlldmVtZW50IFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICBjb25zdCBhY2hpZXZlbWVudFBhdHRlcm5zID0gW1xuICAgIC9cXGQrJS8sICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwZXJjZW50YWdlc1xuICAgIC9cXCRbXFxkLF0rLywgICAgICAgICAgICAgICAgICAgICAgLy8gZG9sbGFyIGFtb3VudHNcbiAgICAvXFxkKyAodGltZXN8eHxmb2xkfHllYXJ8bW9udGh8d2Vla3xkYXl8dGVhbXxwZW9wbGV8c3RhZmZ8Y2xpZW50fGN1c3RvbWVyfHByb2plY3R8cHJvZHVjdHxzeXN0ZW18YXdhcmR8cGF0ZW50KS9pLFxuICAgIC9yZWR1Y2VkfGluY3JlYXNlZHxncmV3fGdyZXd8ZG91YmxlZHx0cmlwbGVkfHNhdmVkfGdlbmVyYXRlZHxkZWxpdmVyZWR8bGF1bmNoZWR8bGVkfGJ1aWx0fGRlc2lnbmVkfGFyY2hpdGVjdGVkfHBpb25lZXJlZHx3b258YXdhcmRlZHxlYXJuZWR8YWNoaWV2ZWQvaSxcbiAgXTtcbiAgY29uc3QgaGFzQWNoaWV2ZW1lbnQgPSBhY2hpZXZlbWVudFBhdHRlcm5zLnNvbWUocmUgPT4gcmUudGVzdCh0ZXh0KSk7XG4gIGNvbnN0IGFjaGlldmVtZW50Q2hlY2sgPSB7XG4gICAgcGFzczogaGFzQWNoaWV2ZW1lbnQsXG4gICAgd2FybjogIWhhc0FjaGlldmVtZW50LFxuICAgIGxhYmVsOiAnU3BlY2lmaWMgYWNoaWV2ZW1lbnQnLFxuICAgIGRldGFpbDogaGFzQWNoaWV2ZW1lbnRcbiAgICAgID8gJ0NvbnRhaW5zIGEgcXVhbnRpZmllZCBvciBuYW1lZCBhY2hpZXZlbWVudCBcdTIwMTQgZ29vZC4nXG4gICAgICA6ICdObyBxdWFudGlmaWVkIGFjaGlldmVtZW50IGRldGVjdGVkIFx1MjAxNCBhZGQgYXQgbGVhc3Qgb25lIHNwZWNpZmljIHJlc3VsdCAoZS5nLiwgXCJpbmNyZWFzZWQgcmV2ZW51ZSBieSAzMCVcIiwgXCJsZWQgYSB0ZWFtIG9mIDhcIikuJyxcbiAgfTtcblxuICAvLyBcdTI1MDBcdTI1MDAgUnVsZSA3OiBHZW5lcmljIGZpbGxlciBwaHJhc2VzIChHQVAtMTcpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICBjb25zdCBfQ0xfRklMTEVSID0gW1xuICAgICdpIGFtIHdyaXRpbmcgdG8gYXBwbHknLCAnaSBhbSBleGNpdGVkIHRvIGFwcGx5JywgJ2kgYW0gcGxlYXNlZCB0byBhcHBseScsXG4gICAgJ3BsZWFzZSBmaW5kIG15JywgJ2F0dGFjaGVkIHBsZWFzZSBmaW5kJywgJ2VuY2xvc2VkIHBsZWFzZSBmaW5kJyxcbiAgICAndGhpcyBsZXR0ZXIgaXMgdG8gZXhwcmVzcycsICdpIGZlZWwgaSB3b3VsZCBiZSBhIGdyZWF0IGZpdCcsXG4gICAgJ2kgYmVsaWV2ZSBpIHdvdWxkIGJlIGEgcGVyZmVjdCBmaXQnLCAnaSBhbSBjb25maWRlbnQgdGhhdCBpJyxcbiAgICAncmVzdWx0cy1kcml2ZW4nLCAnZGV0YWlsLW9yaWVudGVkJywgJ3NlYXNvbmVkIHByb2Zlc3Npb25hbCcsXG4gICAgJ3Bhc3Npb25hdGUgYWJvdXQnLCAnZHluYW1pYyBwcm9mZXNzaW9uYWwnLCAnaGlnaGx5IG1vdGl2YXRlZCcsXG4gICAgJ3RlYW0gcGxheWVyJywgJ3NlbGYtc3RhcnRlcicsICdoYXJkIHdvcmtpbmcnLFxuICBdO1xuICBjb25zdCBfdGV4dExjICAgID0gdGV4dC50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBmb3VuZEZpbGwgID0gX0NMX0ZJTExFUi5maWx0ZXIocCA9PiBfdGV4dExjLmluY2x1ZGVzKHApKTtcbiAgY29uc3QgZmlsbGVyQ2hlY2sgPSB7XG4gICAgcGFzczogZm91bmRGaWxsLmxlbmd0aCA9PT0gMCxcbiAgICB3YXJuOiBmb3VuZEZpbGwubGVuZ3RoID4gMCAmJiBmb3VuZEZpbGwubGVuZ3RoIDw9IDIsXG4gICAgZmFpbDogZm91bmRGaWxsLmxlbmd0aCA+IDIsXG4gICAgbGFiZWw6ICdGaWxsZXIgcGhyYXNlcycsXG4gICAgZGV0YWlsOiBmb3VuZEZpbGwubGVuZ3RoID09PSAwXG4gICAgICA/ICdObyBnZW5lcmljIGZpbGxlciBwaHJhc2VzIGRldGVjdGVkIFx1MjAxNCBnb29kLidcbiAgICAgIDogYEdlbmVyaWMgcGhyYXNlJHtmb3VuZEZpbGwubGVuZ3RoID4gMSA/ICdzJyA6ICcnfSBkZXRlY3RlZDogJHtmb3VuZEZpbGwuc2xpY2UoMCwgMykubWFwKHAgPT4gYFx1MjAxQyR7cH1cdTIwMURgKS5qb2luKCcsICcpfSR7Zm91bmRGaWxsLmxlbmd0aCA+IDMgPyAnXHUyMDI2JyA6ICcnfSBcdTIwMTQgcmVwbGFjZSB3aXRoIHNwZWNpZmljIHZhbHVlIGNsYWltcy5gLFxuICB9O1xuXG4gIC8vIFx1MjUwMFx1MjUwMCBSZW5kZXIgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIGNvbnN0IGNoZWNrcyA9IFtvcGVuaW5nQ2hlY2ssIGlGaXJzdENoZWNrLCBjb21wYW55Q2hlY2ssIHdvcmRDb3VudENoZWNrLCBjdGFDaGVjaywgYWNoaWV2ZW1lbnRDaGVjaywgZmlsbGVyQ2hlY2tdO1xuICBjb250YWluZXIuaW5uZXJIVE1MID0gY2hlY2tzLm1hcChjID0+IHtcbiAgICBjb25zdCBzdGF0ZSA9IGMucGFzcyA/ICdwYXNzJyA6IGMud2FybiA/ICd3YXJuJyA6ICdmYWlsJztcbiAgICByZXR1cm4gYDxkaXYgY2xhc3M9XCJjbC1jaGVjayAke3N0YXRlfVwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjYy1pY29uXCI+PC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjYy1sYWJlbFwiPiR7ZXNjYXBlSHRtbChjLmxhYmVsKX08L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cImNjLWRldGFpbFwiPiR7Yy5kZXRhaWx9PC9zcGFuPlxuICAgIDwvZGl2PmA7XG4gIH0pLmpvaW4oJycpO1xuXG4gIHBhbmVsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgR2V0IGNvbXBhbnkgbmFtZSBmb3IgY292ZXIgbGV0dGVyIHZhbGlkYXRpb24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIF9nZXRDb21wYW55TmFtZUZvckNMKCkge1xuICAvLyBUcnkgYW5hbHlzaXMgZGF0YSBmaXJzdCwgdGhlbiBmYWxsIGJhY2sgdG8gam9iIGRlc2NyaXB0aW9uIGZpcnN0IGxpbmVcbiAgY29uc3QgYW5hbHlzaXMgPSB3aW5kb3cuX2xhc3RBbmFseXNpc0RhdGEgfHwgKHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zICYmIHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zLmpvYl9hbmFseXNpcyk7XG4gIGlmIChhbmFseXNpcyAmJiBhbmFseXNpcy5jb21wYW55X25hbWUpIHJldHVybiBhbmFseXNpcy5jb21wYW55X25hbWU7XG4gIGlmIChhbmFseXNpcyAmJiBhbmFseXNpcy5jb21wYW55KSAgICAgIHJldHVybiBhbmFseXNpcy5jb21wYW55O1xuICAvLyBGYWxsIGJhY2s6IGZpcnN0IG5vbi1lbXB0eSBsaW5lIG9mIGpvYiBkZXNjcmlwdGlvbiBpbiB0YWJEYXRhXG4gIGNvbnN0IGpkID0gc3RhdGVNYW5hZ2VyLmdldFRhYkRhdGEoJ2pvYicpIHx8ICcnO1xuICBjb25zdCBmaXJzdExpbmUgPSBqZC5zcGxpdCgnXFxuJykuZmluZChsID0+IGwudHJpbSgpKTtcbiAgcmV0dXJuIGZpcnN0TGluZSA/IGZpcnN0TGluZS50cmltKCkuc2xpY2UoMCwgNjApIDogJyc7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFeHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5leHBvcnQge1xuICBDT1ZFUl9MRVRURVJfVE9ORVMsXG4gIF9jb3ZlckxldHRlckZvcm1TdGF0ZSxcbiAgcG9wdWxhdGVDb3ZlckxldHRlclRhYixcbiAgZ2VuZXJhdGVDb3ZlckxldHRlcixcbiAgc2F2ZUNvdmVyTGV0dGVyLFxuICBfcmVuZGVyQ29uc2lzdGVuY3lSZXBvcnQsXG4gIF9kZWJvdW5jZWRWYWxpZGF0ZUNMLFxuICBfdmFsaWRhdGVDb3ZlckxldHRlcixcbiAgX2dldENvbXBhbnlOYW1lRm9yQ0wsXG59O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvc2NyZWVuaW5nLXF1ZXN0aW9ucy5qc1xuICogU2NyZWVuaW5nIHF1ZXN0aW9ucyB0YWI6IHBhcnNlLCBzZWFyY2gsIGdlbmVyYXRlLCBzYXZlIHJlc3BvbnNlcy5cbiAqXG4gKiBEZXBlbmRlbmNpZXMgKHJlc29sdmVkIHRocm91Z2ggZ2xvYmFsVGhpcyBhdCBydW50aW1lKTpcbiAqICAgZXNjYXBlSHRtbCwgc2hvd0FsZXJ0TW9kYWxcbiAqL1xuXG4vLyBcdTI1MDBcdTI1MDAgTW9kdWxlLWxldmVsIHN0YXRlIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4vKiogUGVyLXF1ZXN0aW9uIGRyYWZ0IHN0YXRlOiB7IGZvcm1hdCwgZXhwZXJpZW5jZUluZGljZXMsIHJlc3BvbnNlVGV4dCwgdG9waWNUYWcsIHByaW9yUmVzcG9uc2UgfSAqL1xuY29uc3QgX3NjcmVlbmluZ1N0YXRlID0ge307XG5cbi8qKiBSYXcgdGV4dCBmcm9tIHRoZSBzYy1pbnB1dCB0ZXh0YXJlYSBcdTIwMTQgc3Vydml2ZXMgdGFiIG5hdmlnYXRpb24uICovXG5sZXQgX3NjcmVlbmluZ0lucHV0VGV4dCA9ICcnO1xuXG4vKiogUmVzZXQgZnVuY3Rpb24gZm9yIHRlc3RpbmcgXHUyMDE0IGNsZWFycyBzYXZlZCB0ZXh0YXJlYSBzdGF0ZS4gKi9cbmZ1bmN0aW9uIF9yZXNldFNjcmVlbmluZ0lucHV0VGV4dCgpIHsgX3NjcmVlbmluZ0lucHV0VGV4dCA9ICcnOyB9XG5cbi8vIFx1MjUwMFx1MjUwMCBQb3B1bGF0ZSBzY3JlZW5pbmcgdGFiIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBwb3B1bGF0ZVNjcmVlbmluZ1RhYigpIHtcbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgc3R5bGU9XCJtYXgtd2lkdGg6OTAwcHg7bWFyZ2luOjAgYXV0bztwYWRkaW5nOjIwcHggMTBweDtcIj5cbiAgICAgIDxoMiBzdHlsZT1cImZvbnQtc2l6ZToxLjNlbTtmb250LXdlaWdodDo3MDA7bWFyZ2luLWJvdHRvbTo4cHg7XCI+XHVEODNEXHVEQ0NCIFNjcmVlbmluZyBRdWVzdGlvbnM8L2gyPlxuICAgICAgPHAgY2xhc3M9XCJzYy1pbnRyb1wiPlBhc3RlIG9uZSBvciBtb3JlIHNjcmVlbmluZyBxdWVzdGlvbnMgYmVsb3cgXHUyMDE0IG9uZSBwZXIgbGluZSwgb3Igc2VwYXJhdGVkIGJ5IGJsYW5rIGxpbmVzLiBDbGljayA8c3Ryb25nPlBhcnNlIFF1ZXN0aW9uczwvc3Ryb25nPiB0byBnZW5lcmF0ZSB0YWlsb3JlZCBkcmFmdCByZXNwb25zZXMuPC9wPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6MTBweDthbGlnbi1pdGVtczpmbGV4LXN0YXJ0O21hcmdpbi1ib3R0b206MjBweDtcIj5cbiAgICAgICAgPHRleHRhcmVhIGlkPVwic2MtaW5wdXRcIiByb3dzPVwiNlwiIHN0eWxlPVwiZmxleDoxO3BhZGRpbmc6MTJweDtib3JkZXI6MXB4IHNvbGlkICNlMmU4ZjA7Ym9yZGVyLXJhZGl1czo4cHg7Zm9udC1zaXplOjAuOTNlbTtyZXNpemU6dmVydGljYWw7XCIgcGxhY2Vob2xkZXI9XCJQYXN0ZSBzY3JlZW5pbmcgcXVlc3Rpb25zIGhlcmVcdTIwMjYmIzEwOyYjMTA7RS5nLiYjMTA7RGVzY3JpYmUgYSB0aW1lIHlvdSBsZWQgYSBjcm9zcy1mdW5jdGlvbmFsIHByb2plY3QuJiMxMDsmIzEwO0hvdyBkbyB5b3UgaGFuZGxlIHRpZ2h0IGRlYWRsaW5lcz9cIj48L3RleHRhcmVhPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLXByaW1hcnlcIiBvbmNsaWNrPVwicGFyc2VTY3JlZW5pbmdRdWVzdGlvbnMoKVwiPlBhcnNlIFF1ZXN0aW9uczwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGlkPVwic2MtcXVlc3Rpb25zLWNvbnRhaW5lclwiPjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInNjLXNhdmUtYmFyXCIgaWQ9XCJzYy1zYXZlLWJhclwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29udGludWUtYnRuXCIgaWQ9XCJzYy1zYXZlLWJ0blwiIG9uY2xpY2s9XCJzYXZlU2NyZWVuaW5nUmVzcG9uc2VzKClcIj5cdUQ4M0RcdURDQkUgU2F2ZSBBbGwgUmVzcG9uc2VzPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJuYXYtYnV0dG9ucyBuYXYtZW5kXCIgc3R5bGU9XCJtYXJnaW4tdG9wOjI0cHg7XCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJjb250aW51ZS1idG5cIiBvbmNsaWNrPVwiaGFuZGxlU3RlcENsaWNrKCdpbnRlcnZpZXdfcHJlcCcpXCI+XHVEODNDXHVERkE0IFByb2NlZWQgdG8gSW50ZXJ2aWV3IFByZXAgXHUyMTkyPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xuXG4gIC8vIFJlc3RvcmUgdGhlIHJhdyBpbnB1dCB0ZXh0IGFuZCB3aXJlIHVwIHNhdmUtb24taW5wdXQgbGlzdGVuZXIuXG4gIGNvbnN0IHNjSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2MtaW5wdXQnKTtcbiAgaWYgKHNjSW5wdXQpIHtcbiAgICBpZiAoX3NjcmVlbmluZ0lucHV0VGV4dCkgc2NJbnB1dC52YWx1ZSA9IF9zY3JlZW5pbmdJbnB1dFRleHQ7XG4gICAgc2NJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHsgX3NjcmVlbmluZ0lucHV0VGV4dCA9IHNjSW5wdXQudmFsdWU7IH0pO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBQYXJzZSBxdWVzdGlvbnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIHBhcnNlU2NyZWVuaW5nUXVlc3Rpb25zKCkge1xuICBjb25zdCByYXcgPSAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NjLWlucHV0Jyk/LnZhbHVlIHx8ICcnKS50cmltKCk7XG4gIGlmICghcmF3KSB7IHNob3dBbGVydE1vZGFsKCdcdTI2QTBcdUZFMEYgTm8gSW5wdXQnLCAnUGxlYXNlIHBhc3RlIGF0IGxlYXN0IG9uZSBzY3JlZW5pbmcgcXVlc3Rpb24gZmlyc3QuJyk7IHJldHVybjsgfVxuXG4gIC8vIFNwbGl0IG9uIGJsYW5rIGxpbmVzIChwcmVmZXJyZWQpIG9yIG51bWJlcmVkIGxpc3QgcGF0dGVybnM7IGZpbHRlciBlbXB0eSByZXN1bHRzXG4gIGxldCBxdWVzdGlvbnMgPSByYXcuc3BsaXQoL1xcblxccypcXG4rLykubWFwKHEgPT4gcS50cmltKCkpLmZpbHRlcihCb29sZWFuKTtcbiAgaWYgKHF1ZXN0aW9ucy5sZW5ndGggPT09IDEpIHtcbiAgICAvLyBUcnkgbnVtYmVyZWQgcGF0dGVybnMgbGlrZSBcIjEuIFwiIG9yIFwiMSkgXCIgb3IgXCJRMTpcIiB3aXRob3V0IHJlcXVpcmluZyBzcGFjZSBhZnRlclxuICAgIGNvbnN0IG51bWJlcmVkID0gcmF3LnNwbGl0KC9cXG4oPz1cXGQrWy5cXCldXFxzKig/PVtBLVpdKXxRXFxkK1s6XFwuXT9cXHMqKD89W0EtWl0pKS8pXG4gICAgICAubWFwKHEgPT4gcS50cmltKCkpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGlmIChudW1iZXJlZC5sZW5ndGggPiAxKSBxdWVzdGlvbnMgPSBudW1iZXJlZDtcbiAgfVxuICBpZiAocXVlc3Rpb25zLmxlbmd0aCA9PT0gMSkge1xuICAgIC8vIExhc3QgcmVzb3J0OiBzcGxpdCBvbiBhbnkgc2luZ2xlIG5ld2xpbmUgaWYgd2Ugc3RpbGwgaGF2ZSBqdXN0IG9uZSBcInF1ZXN0aW9uXCJcbiAgICBjb25zdCBzaW5nbGVMaW5lID0gcmF3LnNwbGl0KC9cXG4rLykubWFwKHEgPT4gcS50cmltKCkpLmZpbHRlcihxID0+IHEubGVuZ3RoID4gMCk7XG4gICAgaWYgKHNpbmdsZUxpbmUubGVuZ3RoID4gMSkgcXVlc3Rpb25zID0gc2luZ2xlTGluZTtcbiAgfVxuXG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzYy1xdWVzdGlvbnMtY29udGFpbmVyJyk7XG4gIGNvbnRhaW5lci5pbm5lckhUTUwgPSBxdWVzdGlvbnMubWFwKChxLCBpKSA9PiByZW5kZXJRdWVzdGlvbkJsb2NrKHEsIGkpKS5qb2luKCcnKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NjLXNhdmUtYmFyJykuc3R5bGUuZGlzcGxheSA9IHF1ZXN0aW9ucy5sZW5ndGggPyAnJyA6ICdub25lJztcblxuICAvLyBLaWNrIG9mZiBzZWFyY2hlcyBpbiBwYXJhbGxlbFxuICBxdWVzdGlvbnMuZm9yRWFjaCgocSwgaSkgPT4gc2VhcmNoRm9yUXVlc3Rpb24ocSwgaSkpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgUmVuZGVyIHF1ZXN0aW9uIGJsb2NrIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiByZW5kZXJRdWVzdGlvbkJsb2NrKHF1ZXN0aW9uLCBpZHgpIHtcbiAgcmV0dXJuIGBcbiAgICA8ZGl2IGNsYXNzPVwic2MtcXVlc3Rpb24tYmxvY2tcIiBpZD1cInNjLWJsb2NrLSR7aWR4fVwiIGRhdGEtcXVlc3Rpb249XCIke2VzY2FwZUh0bWwocXVlc3Rpb24pfVwiPlxuICAgICAgPGRpdiBjbGFzcz1cInNjLXF1ZXN0aW9uLWhlYWRlclwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInNjLXF1ZXN0aW9uLW51bVwiPiR7aWR4ICsgMX08L3NwYW4+XG4gICAgICAgIDxzcGFuPiR7ZXNjYXBlSHRtbChxdWVzdGlvbil9PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwic2MtcXVlc3Rpb24tYm9keVwiPlxuICAgICAgICA8ZGl2IGlkPVwic2MtcHJpb3ItJHtpZHh9XCI+PGVtIHN0eWxlPVwiY29sb3I6Izk0YTNiODtmb250LXNpemU6MC44N2VtO1wiPlNlYXJjaGluZyByZXNwb25zZSBsaWJyYXJ5XHUyMDI2PC9lbT48L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cInNjLWV4cC0ke2lkeH1cIj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNjLWZvcm1hdC1yb3dcIiBpZD1cInNjLWZtdC0ke2lkeH1cIj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOiMzNzQxNTE7YWxpZ24tc2VsZjpjZW50ZXI7XCI+Rm9ybWF0Ojwvc3Bhbj5cbiAgICAgICAgICAke1snZGlyZWN0Jywnc3RhcicsJ3RlY2huaWNhbCddLm1hcChmID0+IGBcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzYy1mb3JtYXQtYnRuJHtmID09PSAnZGlyZWN0JyA/ICcgYWN0aXZlJyA6ICcnfVwiIGRhdGEtZm10PVwiJHtmfVwiIG9uY2xpY2s9XCJzZWxlY3RGb3JtYXQoJHtpZHh9LCcke2Z9Jyx0aGlzKVwiPiR7X2ZtdExhYmVsKGYpfTwvYnV0dG9uPmApLmpvaW4oJycpfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1wcmltYXJ5XCIgaWQ9XCJzYy1nZW4tYnRuLSR7aWR4fVwiIG9uY2xpY2s9XCJnZW5lcmF0ZVNjcmVlbmluZ1Jlc3BvbnNlKCR7aWR4fSlcIj5cdTI3MjggR2VuZXJhdGUgRHJhZnQ8L2J1dHRvbj5cbiAgICAgICAgPGRpdiBpZD1cInNjLXJlc3VsdC0ke2lkeH1cIiBzdHlsZT1cIm1hcmdpbi10b3A6MTJweDtcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNjLXRvcGljLXJvd1wiIGlkPVwic2MtdG9waWMtcm93LSR7aWR4fVwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJzYy10b3BpYy0ke2lkeH1cIj5Ub3BpYyB0YWc6PC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJzYy10b3BpYy1pbnB1dFwiIGlkPVwic2MtdG9waWMtJHtpZHh9XCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cImUuZy4gbGVhZGVyc2hpcCwgY3Jvc3MtZnVuY3Rpb25hbCwgZGVhZGxpbmUtbWFuYWdlbWVudFwiPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PmA7XG59XG5cbmZ1bmN0aW9uIF9mbXRMYWJlbChmbXQpIHtcbiAgcmV0dXJuIHsgZGlyZWN0OiAnRGlyZWN0L0NvbmNpc2UgKDE1MFx1MjAxMzIwMHcpJywgc3RhcjogJ1NUQVIgKDI1MFx1MjAxMzM1MHcpJywgdGVjaG5pY2FsOiAnVGVjaG5pY2FsIERldGFpbCAoNDAwXHUyMDEzNTAwdyknIH1bZm10XSB8fCBmbXQ7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBGb3JtYXQgc2VsZWN0aW9uIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBzZWxlY3RGb3JtYXQoaWR4LCBmbXQsIGJ0bikge1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGAjc2MtZm10LSR7aWR4fSAuc2MtZm9ybWF0LWJ0bmApLmZvckVhY2goYiA9PiBiLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpKTtcbiAgYnRuLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICBpZiAoIV9zY3JlZW5pbmdTdGF0ZVtpZHhdKSBfc2NyZWVuaW5nU3RhdGVbaWR4XSA9IHt9O1xuICBfc2NyZWVuaW5nU3RhdGVbaWR4XS5mb3JtYXQgPSBmbXQ7XG59XG5cbmZ1bmN0aW9uIF9nZXRTZWxlY3RlZEZvcm1hdChpZHgpIHtcbiAgY29uc3QgYWN0aXZlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgI3NjLWZtdC0ke2lkeH0gLnNjLWZvcm1hdC1idG4uYWN0aXZlYCk7XG4gIHJldHVybiBhY3RpdmUgPyBhY3RpdmUuZ2V0QXR0cmlidXRlKCdkYXRhLWZtdCcpIDogJ2RpcmVjdCc7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBTZWFyY2ggZm9yIHByaW9yIHJlc3BvbnNlcyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gc2VhcmNoRm9yUXVlc3Rpb24ocXVlc3Rpb24sIGlkeCkge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9zY3JlZW5pbmcvc2VhcmNoJywge1xuICAgICAgbWV0aG9kOiAgJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiAgICBKU09OLnN0cmluZ2lmeSh7IHF1ZXN0aW9uIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmICghZGF0YS5vaykgeyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc2MtcHJpb3ItJHtpZHh9YCkuaW5uZXJIVE1MID0gJyc7IHJldHVybjsgfVxuXG4gICAgLy8gUmVuZGVyIHByaW9yIG1hdGNoXG4gICAgY29uc3QgcHJpb3JFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzYy1wcmlvci0ke2lkeH1gKTtcbiAgICBpZiAoZGF0YS5wcmlvcikge1xuICAgICAgY29uc3QgcCA9IGRhdGEucHJpb3I7XG4gICAgICBwcmlvckVsLmlubmVySFRNTCA9IGBcbiAgICAgICAgPGRpdiBjbGFzcz1cInNjLXByaW9yLW1hdGNoXCI+XG4gICAgICAgICAgPHN0cm9uZz5cdUQ4M0RcdURDREEgU2ltaWxhciBwcmlvciByZXNwb25zZSBmb3VuZDwvc3Ryb25nPiBcdTIwMTQgJHtlc2NhcGVIdG1sKHAuY29tcGFueSB8fCAnJyl9ICgke2VzY2FwZUh0bWwocC5kYXRlIHx8ICcnKX0pPGJyPlxuICAgICAgICAgIDxlbSBzdHlsZT1cImNvbG9yOiM3ODM1MGY7XCI+XCIke2VzY2FwZUh0bWwoKHAucXVlc3Rpb24gfHwgJycpLnN1YnN0cmluZygwLCAxMjApKX1cdTIwMjZcIjwvZW0+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6NnB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtcIj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwic2MtdXNlLXByaW9yLSR7aWR4fVwiIG9uY2hhbmdlPVwidG9nZ2xlUHJpb3JVc2UoJHtpZHh9KVwiPiBVc2UgYXMgc3RhcnRpbmcgcG9pbnRcbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PmA7XG4gICAgICBpZiAoIV9zY3JlZW5pbmdTdGF0ZVtpZHhdKSBfc2NyZWVuaW5nU3RhdGVbaWR4XSA9IHt9O1xuICAgICAgX3NjcmVlbmluZ1N0YXRlW2lkeF0ucHJpb3JSZXNwb25zZSA9IHAucmVzcG9uc2VfdGV4dCB8fCAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgcHJpb3JFbC5pbm5lckhUTUwgPSAnJztcbiAgICB9XG5cbiAgICAvLyBSZW5kZXIgZXhwZXJpZW5jZSBjYXJkc1xuICAgIGNvbnN0IGV4cEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNjLWV4cC0ke2lkeH1gKTtcbiAgICBpZiAoZGF0YS5leHBlcmllbmNlcyAmJiBkYXRhLmV4cGVyaWVuY2VzLmxlbmd0aCkge1xuICAgICAgY29uc3QgY2FyZHMgPSBkYXRhLmV4cGVyaWVuY2VzLm1hcChlID0+IGBcbiAgICAgICAgPGxhYmVsIGNsYXNzPVwic2MtZXhwLWNhcmRcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1pZHg9XCIke2UuaWR4fVwiIGNoZWNrZWQgb25jaGFuZ2U9XCJ1cGRhdGVFeHBTZWxlY3Rpb24oJHtpZHh9KVwiPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmbGV4OjE7XCI+XG4gICAgICAgICAgICA8c3Ryb25nPiR7ZXNjYXBlSHRtbChlLnRpdGxlKX08L3N0cm9uZz4gXHUwMEI3ICR7ZXNjYXBlSHRtbChlLmNvbXBhbnkpfVxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYy1zY29yZS1iYWRnZVwiPiR7TWF0aC5yb3VuZChlLnNjb3JlICogMTAwKX0lIG1hdGNoPC9zcGFuPlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImNvbG9yOiM2NDc0OGI7bWFyZ2luLXRvcDoycHg7XCI+JHtlc2NhcGVIdG1sKGUuc3VtbWFyeSl9PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbGFiZWw+YCkuam9pbignJyk7XG4gICAgICBleHBFbC5pbm5lckhUTUwgPSBgPHAgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjojMzc0MTUxO21hcmdpbi1ib3R0b206NnB4O1wiPlJlbGV2YW50IGV4cGVyaWVuY2U6PC9wPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2MtZXhwLWxpc3RcIj4ke2NhcmRzfTwvZGl2PmA7XG4gICAgICBpZiAoIV9zY3JlZW5pbmdTdGF0ZVtpZHhdKSBfc2NyZWVuaW5nU3RhdGVbaWR4XSA9IHt9O1xuICAgICAgX3NjcmVlbmluZ1N0YXRlW2lkeF0uZXhwZXJpZW5jZUluZGljZXMgPSBkYXRhLmV4cGVyaWVuY2VzLm1hcChlID0+IGUuaWR4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXhwRWwuaW5uZXJIVE1MID0gJyc7XG4gICAgfVxuICB9IGNhdGNoIChfKSB7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNjLXByaW9yLSR7aWR4fWApLmlubmVySFRNTCA9ICcnO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBUb2dnbGUgcHJpb3IgdXNlIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiB0b2dnbGVQcmlvclVzZShpZHgpIHtcbiAgY29uc3QgY2IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc2MtdXNlLXByaW9yLSR7aWR4fWApO1xuICBpZiAoIV9zY3JlZW5pbmdTdGF0ZVtpZHhdKSBfc2NyZWVuaW5nU3RhdGVbaWR4XSA9IHt9O1xuICBfc2NyZWVuaW5nU3RhdGVbaWR4XS51c2VQcmlvciA9IGNiPy5jaGVja2VkID8/IGZhbHNlO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVFeHBTZWxlY3Rpb24oaWR4KSB7XG4gIGNvbnN0IGJsb2NrICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzYy1ibG9jay0ke2lkeH1gKTtcbiAgY29uc3QgY2hlY2tlZCAgID0gQXJyYXkuZnJvbShibG9jay5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFt0eXBlPWNoZWNrYm94XVtkYXRhLWlkeF0nKSlcbiAgICAuZmlsdGVyKGNiID0+IGNiLmNoZWNrZWQpXG4gICAgLm1hcChjYiA9PiBwYXJzZUludChjYi5nZXRBdHRyaWJ1dGUoJ2RhdGEtaWR4JyksIDEwKSk7XG4gIGlmICghX3NjcmVlbmluZ1N0YXRlW2lkeF0pIF9zY3JlZW5pbmdTdGF0ZVtpZHhdID0ge307XG4gIF9zY3JlZW5pbmdTdGF0ZVtpZHhdLmV4cGVyaWVuY2VJbmRpY2VzID0gY2hlY2tlZDtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEdlbmVyYXRlIHNjcmVlbmluZyByZXNwb25zZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVTY3JlZW5pbmdSZXNwb25zZShpZHgpIHtcbiAgLyogZHVja2Zsb3c6XG4gICAqICAgaWQ6IHNjcmVlbmluZ191aV9nZW5lcmF0ZV9saXZlXG4gICAqICAga2luZDogdWlcbiAgICogICB0aW1lc3RhbXA6ICcyMDI2LTAzLTI1VDIxOjM5OjQ4WidcbiAgICogICBzdGF0dXM6IGxpdmVcbiAgICogICBoYW5kbGVzOlxuICAgKiAgIC0gdWk6c2NyZWVuaW5nLmdlbmVyYXRlLXJlc3BvbnNlXG4gICAqICAgY2FsbHM6XG4gICAqICAgLSBQT1NUIC9hcGkvc2NyZWVuaW5nL2dlbmVyYXRlXG4gICAqICAgcmVhZHM6XG4gICAqICAgLSBkb206c2MtcXVlc3Rpb24tYmxvY2sucXVlc3Rpb25cbiAgICogICAtIHdpbmRvdzpfc2NyZWVuaW5nU3RhdGUuZm9ybWF0XG4gICAqICAgLSB3aW5kb3c6X3NjcmVlbmluZ1N0YXRlLnByaW9yUmVzcG9uc2VcbiAgICogICAtIHdpbmRvdzpfc2NyZWVuaW5nU3RhdGUuZXhwZXJpZW5jZUluZGljZXNcbiAgICogICB3cml0ZXM6XG4gICAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9zY3JlZW5pbmcvZ2VuZXJhdGUucXVlc3Rpb25cbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL3NjcmVlbmluZy9nZW5lcmF0ZS5mb3JtYXRcbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL3NjcmVlbmluZy9nZW5lcmF0ZS5leHBlcmllbmNlX2luZGljZXNcbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL3NjcmVlbmluZy9nZW5lcmF0ZS5wcmlvcl9yZXNwb25zZVxuICAgKiAgIC0gd2luZG93Ol9zY3JlZW5pbmdTdGF0ZS5yZXNwb25zZVRleHRcbiAgICogICAtIHdpbmRvdzpfc2NyZWVuaW5nU3RhdGUuZm9ybWF0XG4gICAqICAgbm90ZXM6IEdlbmVyYXRlcyBhIHNpbmdsZSBzY3JlZW5pbmcgcmVzcG9uc2UgZnJvbSB0aGUgc2VsZWN0ZWQgZm9ybWF0LCBwcmlvci1yZXNwb25zZSBzZWVkLCBhbmQgY2hvc2VuIGV4cGVyaWVuY2UgZXZpZGVuY2UsIHRoZW4gc3RvcmVzIHRoZSBkcmFmdCBiYWNrIGludG8gVUkgc3RhdGUgZm9yIGVkaXRpbmcuXG4gICAqL1xuICBjb25zdCBidG4gICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzYy1nZW4tYnRuLSR7aWR4fWApO1xuICBpZiAoYnRuKSB7IGJ0bi5kaXNhYmxlZCA9IHRydWU7IGJ0bi50ZXh0Q29udGVudCA9ICdcdTIzRjMgR2VuZXJhdGluZ1x1MjAyNic7IH1cblxuICBjb25zdCBxdWVzdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzYy1ibG9jay0ke2lkeH1gKT8uZGF0YXNldC5xdWVzdGlvbiB8fCAnJztcbiAgY29uc3Qgc3RhdGUgICAgPSBfc2NyZWVuaW5nU3RhdGVbaWR4XSB8fCB7fTtcbiAgY29uc3QgZm10ICAgICAgPSBfZ2V0U2VsZWN0ZWRGb3JtYXQoaWR4KTtcbiAgY29uc3QgcHJpb3IgICAgPSAoc3RhdGUudXNlUHJpb3IgJiYgc3RhdGUucHJpb3JSZXNwb25zZSkgPyBzdGF0ZS5wcmlvclJlc3BvbnNlIDogJyc7XG4gIGNvbnN0IGV4cElkeCAgID0gc3RhdGUuZXhwZXJpZW5jZUluZGljZXMgPz8gW107XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvc2NyZWVuaW5nL2dlbmVyYXRlJywge1xuICAgICAgbWV0aG9kOiAgJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIHF1ZXN0aW9uLFxuICAgICAgICBmb3JtYXQ6ICAgICAgICAgICAgICBmbXQsXG4gICAgICAgIGV4cGVyaWVuY2VfaW5kaWNlczogIGV4cElkeCxcbiAgICAgICAgcHJpb3JfcmVzcG9uc2U6ICAgICAgcHJpb3IsXG4gICAgICB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoIWRhdGEub2spIHsgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsIGRhdGEuZXJyb3IgfHwgJ0dlbmVyYXRpb24gZmFpbGVkLicpOyByZXR1cm47IH1cblxuICAgIGlmICghX3NjcmVlbmluZ1N0YXRlW2lkeF0pIF9zY3JlZW5pbmdTdGF0ZVtpZHhdID0ge307XG4gICAgX3NjcmVlbmluZ1N0YXRlW2lkeF0ucmVzcG9uc2VUZXh0ID0gZGF0YS50ZXh0O1xuICAgIF9zY3JlZW5pbmdTdGF0ZVtpZHhdLmZvcm1hdCAgICAgICA9IGZtdDtcblxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzYy1yZXN1bHQtJHtpZHh9YCkuaW5uZXJIVE1MID0gYFxuICAgICAgPHRleHRhcmVhIGNsYXNzPVwic2MtcmVzcG9uc2UtdGV4dGFyZWFcIiBpZD1cInNjLXRleHQtJHtpZHh9XCIgcm93cz1cIjdcIlxuICAgICAgICBvbmlucHV0PVwiX3NjcmVlbmluZ1N0YXRlWyR7aWR4fV0gPSBfc2NyZWVuaW5nU3RhdGVbJHtpZHh9XSB8fCB7fTsgX3NjcmVlbmluZ1N0YXRlWyR7aWR4fV0ucmVzcG9uc2VUZXh0ID0gdGhpcy52YWx1ZTtcIlxuICAgICAgPiR7ZXNjYXBlSHRtbChkYXRhLnRleHQpfTwvdGV4dGFyZWE+YDtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc2MtdG9waWMtcm93LSR7aWR4fWApLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIGNvbnRhY3Qgc2VydmVyLicpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChidG4pIHsgYnRuLmRpc2FibGVkID0gZmFsc2U7IGJ0bi50ZXh0Q29udGVudCA9ICdcdTI3MjggR2VuZXJhdGUgRHJhZnQnOyB9XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIFNhdmUgcmVzcG9uc2VzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBzYXZlU2NyZWVuaW5nUmVzcG9uc2VzKCkge1xuICAvKiBkdWNrZmxvdzpcbiAgICogICBpZDogc2NyZWVuaW5nX3VpX3NhdmVfbGl2ZVxuICAgKiAgIGtpbmQ6IHVpXG4gICAqICAgdGltZXN0YW1wOiAnMjAyNi0wMy0yNVQyMTozOTo0OFonXG4gICAqICAgc3RhdHVzOiBsaXZlXG4gICAqICAgaGFuZGxlczpcbiAgICogICAtIHVpOnNjcmVlbmluZy5zYXZlLWFsbFxuICAgKiAgIGNhbGxzOlxuICAgKiAgIC0gUE9TVCAvYXBpL3NjcmVlbmluZy9zYXZlXG4gICAqICAgcmVhZHM6XG4gICAqICAgLSB3aW5kb3c6X3NjcmVlbmluZ1N0YXRlXG4gICAqICAgLSBkb206LnNjLXF1ZXN0aW9uLWJsb2NrXG4gICAqICAgLSBkb206I3NjLXRleHQtKi52YWx1ZVxuICAgKiAgIC0gZG9tOiNzYy10b3BpYy0qLnZhbHVlXG4gICAqICAgd3JpdGVzOlxuICAgKiAgIC0gcmVxdWVzdDpQT1NUIC9hcGkvc2NyZWVuaW5nL3NhdmUucmVzcG9uc2VzXG4gICAqICAgbm90ZXM6IEFnZ3JlZ2F0ZXMgdGhlIGVkaXRlZCBzY3JlZW5pbmcgcmVzcG9uc2VzIGFuZCB0b3BpYyB0YWdzIGZyb20gdGhlIFVJIGludG8gdGhlIHN0cnVjdHVyZWQgcGF5bG9hZCB0aGF0IGJhY2tlbmQgc3RhdGUsIG1ldGFkYXRhLCBhcmNoaXZlIERPQ1gsIGFuZCB0aGUgcmVzcG9uc2UgbGlicmFyeSBhbGwgcGVyc2lzdC5cbiAgICovXG4gIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzYy1zYXZlLWJ0bicpO1xuICBpZiAoYnRuKSB7IGJ0bi5kaXNhYmxlZCA9IHRydWU7IGJ0bi50ZXh0Q29udGVudCA9ICdcdTIzRjMgU2F2aW5nXHUyMDI2JzsgfVxuXG4gIGNvbnN0IHJlc3BvbnNlcyA9IFtdO1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2MtcXVlc3Rpb24tYmxvY2snKS5mb3JFYWNoKChibG9jaywgaSkgPT4ge1xuICAgIGNvbnN0IHFFbCAgICA9IGJsb2NrLnF1ZXJ5U2VsZWN0b3IoJy5zYy1xdWVzdGlvbi1oZWFkZXIgc3BhbjpsYXN0LWNoaWxkJyk7XG4gICAgY29uc3QgdGV4dEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNjLXRleHQtJHtpfWApO1xuICAgIGNvbnN0IHRvcGljRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc2MtdG9waWMtJHtpfWApO1xuICAgIGlmICghdGV4dEVsKSByZXR1cm47IC8vIG5vdCB5ZXQgZ2VuZXJhdGVkIFx1MjAxNCBza2lwXG5cbiAgICBjb25zdCBxdWVzdGlvbiAgICAgPSBxRWwgPyBxRWwudGV4dENvbnRlbnQudHJpbSgpIDogJyc7XG4gICAgY29uc3QgcmVzcG9uc2VUZXh0ID0gKF9zY3JlZW5pbmdTdGF0ZVtpXT8ucmVzcG9uc2VUZXh0KSB8fCB0ZXh0RWwudmFsdWUgfHwgJyc7XG4gICAgY29uc3QgZm10ICAgICAgICAgID0gX2dldFNlbGVjdGVkRm9ybWF0KGkpO1xuICAgIGNvbnN0IHRvcGljVGFnICAgICA9IHRvcGljRWwgPyB0b3BpY0VsLnZhbHVlLnRyaW0oKSA6ICcnO1xuXG4gICAgcmVzcG9uc2VzLnB1c2goeyBxdWVzdGlvbiwgdG9waWNfdGFnOiB0b3BpY1RhZywgZm9ybWF0OiBmbXQsIHJlc3BvbnNlX3RleHQ6IHJlc3BvbnNlVGV4dCB9KTtcbiAgfSk7XG5cbiAgaWYgKCFyZXNwb25zZXMubGVuZ3RoKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjZBMFx1RkUwRiBOb3RoaW5nIHRvIFNhdmUnLCAnUGxlYXNlIGdlbmVyYXRlIGF0IGxlYXN0IG9uZSByZXNwb25zZSBiZWZvcmUgc2F2aW5nLicpO1xuICAgIGlmIChidG4pIHsgYnRuLmRpc2FibGVkID0gZmFsc2U7IGJ0bi50ZXh0Q29udGVudCA9ICdcdUQ4M0RcdURDQkUgU2F2ZSBBbGwgUmVzcG9uc2VzJzsgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL3NjcmVlbmluZy9zYXZlJywge1xuICAgICAgbWV0aG9kOiAgJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiAgICBKU09OLnN0cmluZ2lmeSh7IHJlc3BvbnNlcyB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjcwNSBTYXZlZCcsIGAke2RhdGEuY291bnR9IHJlc3BvbnNlJHtkYXRhLmNvdW50ICE9PSAxID8gJ3MnIDogJyd9IHNhdmVkIGFzIDxzdHJvbmc+JHtlc2NhcGVIdG1sKGRhdGEuZmlsZW5hbWUpfTwvc3Ryb25nPiBhbmQgYWRkZWQgdG8geW91ciByZXNwb25zZSBsaWJyYXJ5LmApO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIFNhdmUgRmFpbGVkJywgZGF0YS5lcnJvciB8fCAnQ291bGQgbm90IHNhdmUgcmVzcG9uc2VzLicpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIGNvbnRhY3Qgc2VydmVyLicpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChidG4pIHsgYnRuLmRpc2FibGVkID0gZmFsc2U7IGJ0bi50ZXh0Q29udGVudCA9ICdcdUQ4M0RcdURDQkUgU2F2ZSBBbGwgUmVzcG9uc2VzJzsgfVxuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFeHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5leHBvcnQge1xuICBfc2NyZWVuaW5nU3RhdGUsXG4gIF9zY3JlZW5pbmdJbnB1dFRleHQsXG4gIF9yZXNldFNjcmVlbmluZ0lucHV0VGV4dCxcbiAgcG9wdWxhdGVTY3JlZW5pbmdUYWIsXG4gIHBhcnNlU2NyZWVuaW5nUXVlc3Rpb25zLFxuICByZW5kZXJRdWVzdGlvbkJsb2NrLFxuICBfZm10TGFiZWwsXG4gIHNlbGVjdEZvcm1hdCxcbiAgX2dldFNlbGVjdGVkRm9ybWF0LFxuICBzZWFyY2hGb3JRdWVzdGlvbixcbiAgdG9nZ2xlUHJpb3JVc2UsXG4gIHVwZGF0ZUV4cFNlbGVjdGlvbixcbiAgZ2VuZXJhdGVTY3JlZW5pbmdSZXNwb25zZSxcbiAgc2F2ZVNjcmVlbmluZ1Jlc3BvbnNlcyxcbn07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9maW5hbGlzZS5qc1xuICogRmluYWxpc2UgJiBhcmNoaXZlIHRhYjogZmluYWxpc2UgYXBwbGljYXRpb24sIGhhcnZlc3QgY2FuZGlkYXRlcyxcbiAqIGFwcGx5IHNlbGVjdGVkIHVwZGF0ZXMgdG8gbWFzdGVyIENWIGRhdGEuXG4gKlxuICogRGVwZW5kZW5jaWVzIChyZXNvbHZlZCB0aHJvdWdoIGdsb2JhbFRoaXMgYXQgcnVudGltZSk6XG4gKiAgIGVzY2FwZUh0bWwsIF9yZW5kZXJDb25zaXN0ZW5jeVJlcG9ydFxuICovXG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IGZvcm1hdEF0c1Njb3JlU3VtbWFyeSB9IGZyb20gJy4vYXRzLXJlZmluZW1lbnQuanMnO1xuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdmaW5hbGlzZScpO1xuXG5mdW5jdGlvbiBfZm9ybWF0RHVyYXRpb24oc2Vjcykge1xuICBpZiAoc2VjcyA9PSBudWxsIHx8IHNlY3MgPCAwKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgaCA9IE1hdGguZmxvb3Ioc2VjcyAvIDM2MDApO1xuICBjb25zdCBtID0gTWF0aC5mbG9vcigoc2VjcyAlIDM2MDApIC8gNjApO1xuICBjb25zdCBzID0gc2VjcyAlIDYwO1xuICBpZiAoaCA+IDApIHJldHVybiBgJHtofWggJHttfW1gO1xuICBpZiAobSA+IDApIHJldHVybiBgJHttfW0gJHtzfXNgO1xuICByZXR1cm4gYCR7c31zYDtcbn1cblxuZnVuY3Rpb24gX3JlbmRlckZpbmFsaXNlQXRzSXRlbXMoc2NvcmUsIGF0c0tleXdvcmRzKSB7XG4gIGlmICghc2NvcmUgfHwgdHlwZW9mIHNjb3JlLm92ZXJhbGwgIT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGA8bGk+QVRTIGtleXdvcmRzIHRyYWNrZWQ6ICR7YXRzS2V5d29yZHMubGVuZ3RofTwvbGk+YDtcbiAgfVxuXG4gIGNvbnN0IHN1bW1hcnkgPSBmb3JtYXRBdHNTY29yZVN1bW1hcnkoc2NvcmUpO1xuICBjb25zdCBoYXJkU2NvcmUgPSB0eXBlb2Ygc2NvcmUuaGFyZF9yZXF1aXJlbWVudF9zY29yZSA9PT0gJ251bWJlcidcbiAgICA/IGAke01hdGgucm91bmQoc2NvcmUuaGFyZF9yZXF1aXJlbWVudF9zY29yZSl9JWBcbiAgICA6ICduL2EnO1xuICBjb25zdCBzb2Z0U2NvcmUgPSB0eXBlb2Ygc2NvcmUuc29mdF9yZXF1aXJlbWVudF9zY29yZSA9PT0gJ251bWJlcidcbiAgICA/IGAke01hdGgucm91bmQoc2NvcmUuc29mdF9yZXF1aXJlbWVudF9zY29yZSl9JWBcbiAgICA6ICduL2EnO1xuXG4gIHJldHVybiBbXG4gICAgYDxsaT5BVFMgc2NvcmU6IDxzdHJvbmc+JHtzdW1tYXJ5Lm92ZXJhbGx9JTwvc3Ryb25nPiA8c3BhbiBzdHlsZT1cImNvbG9yOiM0NzU1Njk7XCI+KGhhcmQgJHtoYXJkU2NvcmV9IFx1MjAyMiBzb2Z0ICR7c29mdFNjb3JlfSk8L3NwYW4+PC9saT5gLFxuICAgIGA8bGk+QVRTIGNvdmVyYWdlOiAke2VzY2FwZUh0bWwoc3VtbWFyeS5saW5lKX08L2xpPmAsXG4gICAgYDxsaT5BVFMgZGV0YWlsOiAke2VzY2FwZUh0bWwoc3VtbWFyeS5kZXRhaWwpfTwvbGk+YCxcbiAgXS5qb2luKCcnKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFBvcHVsYXRlIGZpbmFsaXNlIHRhYiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gcG9wdWxhdGVGaW5hbGlzZVRhYigpIHtcbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG5cbiAgLy8gRmV0Y2ggY3VycmVudCBzdGF0dXMgdG8gZ2V0IGdlbmVyYXRlZCBmaWxlcyBhbmQgam9iIGFuYWx5c2lzIGZvciBjb25zaXN0ZW5jeSBjaGVja1xuICBsZXQgZ2VuZXJhdGVkICA9IG51bGw7XG4gIGxldCBzdGF0dXNEYXRhID0gbnVsbDtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvc3RhdHVzJyk7XG4gICAgc3RhdHVzRGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgZ2VuZXJhdGVkICA9IHN0YXR1c0RhdGEuZ2VuZXJhdGVkX2ZpbGVzIHx8IG51bGw7XG4gIH0gY2F0Y2ggKGVycikgeyBsb2cud2FybignRmFpbGVkIHRvIGZldGNoIHN0YXR1cyBmb3IgZmluYWxpc2UgdGFiOicsIGVycik7IH1cblxuICBpZiAoIWdlbmVyYXRlZCB8fCAhZ2VuZXJhdGVkLm91dHB1dF9kaXIpIHtcbiAgICBjb250ZW50LmlubmVySFRNTCA9IGBcbiAgICAgIDxoMT5cdTI3MDUgRmluYWxpc2UgQXBwbGljYXRpb248L2gxPlxuICAgICAgPGRpdiBjbGFzcz1cImVtcHR5LXN0YXRlXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpY29uXCI+XHVEODNEXHVEQ0MyPC9kaXY+XG4gICAgICAgIDxoMz5ObyBDViBHZW5lcmF0ZWQgWWV0PC9oMz5cbiAgICAgICAgPHA+UGxlYXNlIGdlbmVyYXRlIGEgQ1YgZmlyc3QgYmVmb3JlIGZpbmFsaXNpbmcuPC9wPlxuICAgICAgPC9kaXY+YDtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBmaWxlcyA9IGdlbmVyYXRlZC5maWxlcyB8fCBbXTtcblxuICBsZXQgaHRtbCA9IGBcbiAgICA8aDE+XHUyNzA1IEZpbmFsaXNlIEFwcGxpY2F0aW9uPC9oMT5cbiAgICA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7bWFyZ2luLWJvdHRvbToyNHB4O1wiPlxuICAgICAgQXJjaGl2ZSB0aGlzIGFwcGxpY2F0aW9uIHRvIHlvdXIgQ1YgaGlzdG9yeSwgdXBkYXRlIHRoZSByZXNwb25zZSBsaWJyYXJ5LCBhbmQgb3B0aW9uYWxseVxuICAgICAgd3JpdGUgYW55IGltcHJvdmVtZW50cyBiYWNrIHRvIE1hc3RlciBDViBEYXRhLlxuICAgIDwvcD5cblxuICAgIDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmMGZkZjQ7Ym9yZGVyOjFweCBzb2xpZCAjYmJmN2QwO2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MTZweDttYXJnaW4tYm90dG9tOjI0cHg7XCI+XG4gICAgICA8aDMgc3R5bGU9XCJtYXJnaW46MCAwIDEwcHg7XCI+XHVEODNEXHVEQ0MyIEdlbmVyYXRlZCBGaWxlczwvaDM+XG4gICAgICA8dWwgc3R5bGU9XCJtYXJnaW46MDtwYWRkaW5nLWxlZnQ6MjBweDtsaW5lLWhlaWdodDoxLjg7XCI+XG4gICAgICAgICR7ZmlsZXMubWFwKGYgPT4gYDxsaT48Y29kZSBzdHlsZT1cImZvbnQtc2l6ZTowLjllbTtcIj4ke2VzY2FwZUh0bWwoZil9PC9jb2RlPjwvbGk+YCkuam9pbignJykgfHwgJzxsaT4obm9uZSk8L2xpPid9XG4gICAgICA8L3VsPlxuICAgICAgPHAgc3R5bGU9XCJtYXJnaW46OHB4IDAgMDtmb250LXNpemU6MC44NWVtO2NvbG9yOiMxNjY1MzQ7XCI+T3V0cHV0IGRpcjogPGNvZGU+JHtlc2NhcGVIdG1sKGdlbmVyYXRlZC5vdXRwdXRfZGlyKX08L2NvZGU+PC9wPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBpZD1cInJlYWRpbmVzcy1jaGVja2xpc3RcIj48L2Rpdj5cbiAgICA8ZGl2IGlkPVwiY29uc2lzdGVuY3ktcmVwb3J0XCI+PC9kaXY+XG4gICAgPGRpdiBpZD1cInJld3JpdGUtYXVkaXQtbG9nXCI+PC9kaXY+XG5cbiAgICA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZmZmO2JvcmRlcjoxcHggc29saWQgI2UyZThmMDtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjIwcHg7bWFyZ2luLWJvdHRvbToyNHB4O1wiPlxuICAgICAgPGgzIHN0eWxlPVwibWFyZ2luOjAgMCAxNnB4O1wiPlx1RDgzRFx1RENDQiBBcHBsaWNhdGlvbiBTdGF0dXM8L2gzPlxuXG4gICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNnB4O1wiPlxuICAgICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjZweDtcIiBmb3I9XCJmaW5hbGlzZS1zdGF0dXNcIj5TdGF0dXM8L2xhYmVsPlxuICAgICAgICA8c2VsZWN0IGlkPVwiZmluYWxpc2Utc3RhdHVzXCIgc3R5bGU9XCJ3aWR0aDoyMjBweDtwYWRkaW5nOjhweCAxMHB4O2JvcmRlcjoxcHggc29saWQgI2NiZDVlMTtib3JkZXItcmFkaXVzOjZweDtmb250LXNpemU6MC45NWVtO1wiPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJkcmFmdFwiPkRyYWZ0IFx1MjAxNCBub3QgeWV0IHNlbnQ8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicmVhZHlcIiBzZWxlY3RlZD5SZWFkeSB0byBzZW5kPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInNlbnRcIj5TZW50PC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImludGVydmlld1wiPkludGVydmlldyBzY2hlZHVsZWQ8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicmVqZWN0ZWRcIj5SZWplY3RlZDwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJhY2NlcHRlZFwiPkFjY2VwdGVkPC9vcHRpb24+XG4gICAgICAgIDwvc2VsZWN0PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjIwcHg7XCI+XG4gICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NnB4O1wiIGZvcj1cImZpbmFsaXNlLW5vdGVzXCI+Tm90ZXM8L2xhYmVsPlxuICAgICAgICA8dGV4dGFyZWEgaWQ9XCJmaW5hbGlzZS1ub3Rlc1wiIHJvd3M9XCI0XCIgbWF4bGVuZ3RoPVwiMjAwMFwiXG4gICAgICAgICAgb25pbnB1dD1cImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaW5hbGlzZS1ub3Rlcy1jb3VudGVyJykudGV4dENvbnRlbnQ9dGhpcy52YWx1ZS5sZW5ndGgrJyAvIDIwMDAnO2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaW5hbGlzZS1ub3Rlcy1jb3VudGVyJykuc3R5bGUuY29sb3I9dGhpcy52YWx1ZS5sZW5ndGg+MTgwMD8nI2RjMjYyNic6dGhpcy52YWx1ZS5sZW5ndGg+MTYwMD8nI2Q5NzcwNic6JyM2YjcyODAnXCJcbiAgICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7cGFkZGluZzoxMHB4O2JvcmRlcjoxcHggc29saWQgI2NiZDVlMTtib3JkZXItcmFkaXVzOjZweDtcbiAgICAgICAgICAgICAgICAgZm9udC1zaXplOjAuOTJlbTtyZXNpemU6dmVydGljYWw7Ym94LXNpemluZzpib3JkZXItYm94O1wiXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJSZWNydWl0ZXIgbmFtZSwgc2FsYXJ5IGluZm8sIGZvbGxvdy11cCBkYXRlLCBpbnRlcnZpZXcgbm90ZXNcdTIwMjZcIj48L3RleHRhcmVhPlxuICAgICAgICA8ZGl2IGlkPVwiZmluYWxpc2Utbm90ZXMtY291bnRlclwiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiIHN0eWxlPVwidGV4dC1hbGlnbjpyaWdodDtmb250LXNpemU6MC44ZW07Y29sb3I6IzZiNzI4MDttYXJnaW4tdG9wOjJweDtcIj4wIC8gMjAwMDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxidXR0b24gaWQ9XCJmaW5hbGlzZS1idG5cIiBvbmNsaWNrPVwiZmluYWxpc2VBcHBsaWNhdGlvbigpXCJcbiAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiMwNTk2Njk7Y29sb3I6I2ZmZjtib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjZweDtcbiAgICAgICAgICAgICAgIHBhZGRpbmc6MTBweCAyNHB4O2ZvbnQtc2l6ZToxZW07Zm9udC13ZWlnaHQ6NjAwO2N1cnNvcjpwb2ludGVyO1wiPlxuICAgICAgICBcdTI3MDUgRmluYWxpc2UgJmFtcDsgQXJjaGl2ZVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGlkPVwiZmluYWxpc2UtcmVzdWx0XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+PC9kaXY+XG4gICAgPGRpdiBpZD1cImhhcnZlc3Qtc2VjdGlvblwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPjwvZGl2PlxuICBgO1xuXG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gaHRtbDtcbiAgX3JlbmRlclJlYWRpbmVzc0NoZWNrbGlzdChmaWxlcywgc3RhdHVzRGF0YSk7XG4gIGlmIChzdGF0dXNEYXRhKSBfcmVuZGVyQ29uc2lzdGVuY3lSZXBvcnQoc3RhdHVzRGF0YSk7XG4gIF9yZW5kZXJSZXdyaXRlQXVkaXRMb2coKTtcbiAgX3Jlc3RvcmVGaW5hbGlzZU1ldGEoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gX3Jlc3RvcmVGaW5hbGlzZU1ldGEoKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvZmluYWxpc2UtbWV0YScpO1xuICAgIGlmICghcmVzLm9rKSByZXR1cm47XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgY29uc3Qgc3RhdHVzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmluYWxpc2Utc3RhdHVzJyk7XG4gICAgY29uc3Qgbm90ZXNFbCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmluYWxpc2Utbm90ZXMnKTtcbiAgICBpZiAoc3RhdHVzRWwgJiYgZGF0YS5hcHBsaWNhdGlvbl9zdGF0dXMpIHN0YXR1c0VsLnZhbHVlID0gZGF0YS5hcHBsaWNhdGlvbl9zdGF0dXM7XG4gICAgaWYgKG5vdGVzRWwgICYmIGRhdGEubm90ZXMpIHtcbiAgICAgIG5vdGVzRWwudmFsdWUgPSBkYXRhLm5vdGVzO1xuICAgICAgY29uc3QgY291bnRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaW5hbGlzZS1ub3Rlcy1jb3VudGVyJyk7XG4gICAgICBpZiAoY291bnRlcikge1xuICAgICAgICBjb25zdCBsZW4gPSBkYXRhLm5vdGVzLmxlbmd0aDtcbiAgICAgICAgY291bnRlci50ZXh0Q29udGVudCA9IGAke2xlbn0gLyAyMDAwYDtcbiAgICAgICAgY291bnRlci5zdHlsZS5jb2xvciA9IGxlbiA+IDE4MDAgPyAnI2RjMjYyNicgOiBsZW4gPiAxNjAwID8gJyNkOTc3MDYnIDogJyM2YjcyODAnO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoXykge31cbn1cblxuLy8gXHUyNTAwXHUyNTAwIFN1Ym1pc3Npb24gcmVhZGluZXNzIGNoZWNrbGlzdCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gX3JlbmRlclJlYWRpbmVzc0NoZWNrbGlzdChmaWxlcywgc3RhdHVzRGF0YSkge1xuICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWFkaW5lc3MtY2hlY2tsaXN0Jyk7XG4gIGlmICghZWwpIHJldHVybjtcblxuICBjb25zdCBmaWxlU2V0ID0gbmV3IFNldCgoZmlsZXMgfHwgW10pLm1hcChmID0+IChmIHx8ICcnKS50b0xvd2VyQ2FzZSgpKSk7XG4gIGNvbnN0IGhhc1BkZiAgPSBbLi4uZmlsZVNldF0uc29tZShmID0+IGYuZW5kc1dpdGgoJy5wZGYnKSAmJiAhZi5pbmNsdWRlcygnY292ZXJsZXR0ZXInKSAmJiAhZi5pbmNsdWRlcygnY292ZXJfbGV0dGVyJykpO1xuICBjb25zdCBoYXNEb2N4ID0gWy4uLmZpbGVTZXRdLnNvbWUoZiA9PiBmLmVuZHNXaXRoKCcuZG9jeCcpICYmICFmLmluY2x1ZGVzKCdjb3ZlcmxldHRlcicpICYmICFmLmluY2x1ZGVzKCdjb3Zlcl9sZXR0ZXInKSAmJiAhZi5pbmNsdWRlcygnc2NyZWVuaW5nJykpO1xuICBjb25zdCBoYXNIdG1sID0gWy4uLmZpbGVTZXRdLnNvbWUoZiA9PiBmLmVuZHNXaXRoKCcuaHRtbCcpKTtcbiAgY29uc3QgaGFzQ2wgICA9IFsuLi5maWxlU2V0XS5zb21lKGYgPT4gZi5pbmNsdWRlcygnY292ZXJsZXR0ZXInKSB8fCBmLmluY2x1ZGVzKCdjb3Zlcl9sZXR0ZXInKSk7XG4gIGNvbnN0IGhhc1NjciAgPSBbLi4uZmlsZVNldF0uc29tZShmID0+IGYuaW5jbHVkZXMoJ3NjcmVlbmluZycpKTtcblxuICBjb25zdCBhdHNDaGVja3MgID0gc3RhdHVzRGF0YT8uYXRzX2NoZWNrcyB8fCBbXTtcbiAgY29uc3QgYXRzRmFpbHMgICA9IChhdHNDaGVja3MpLmZpbHRlcihjID0+IGMuc3RhdHVzID09PSAnZmFpbCcgfHwgYy5zdGF0dXMgPT09ICdlcnJvcicpLmxlbmd0aDtcbiAgY29uc3QgYXRzU2Nhbm5lZCA9IGF0c0NoZWNrcy5sZW5ndGggPiAwO1xuXG4gIGNvbnN0IGxheW91dEZyZXNoID0gc3RhdHVzRGF0YT8ubGF5b3V0X2ZyZXNobmVzcyAhPT0gJ3N0YWxlJztcblxuICBjb25zdCBpdGVtcyA9IFtcbiAgICB7IG9rOiBoYXNQZGYsICAgbGFiZWw6ICdDViBQREYgZ2VuZXJhdGVkJywgICAgICAgIHdhcm46IGZhbHNlIH0sXG4gICAgeyBvazogaGFzRG9jeCwgIGxhYmVsOiAnQ1YgRE9DWCBnZW5lcmF0ZWQnLCAgICAgICB3YXJuOiBmYWxzZSB9LFxuICAgIHsgb2s6IGhhc0h0bWwsICBsYWJlbDogJ0NWIEhUTUwgZ2VuZXJhdGVkJywgICAgICAgd2FybjogZmFsc2UgfSxcbiAgICB7IG9rOiBoYXNDbCwgICAgbGFiZWw6ICdDb3ZlciBsZXR0ZXIgZ2VuZXJhdGVkJywgIHdhcm46IHRydWUgIH0sXG4gICAgeyBvazogaGFzU2NyLCAgIGxhYmVsOiAnU2NyZWVuaW5nIFEmQSBnZW5lcmF0ZWQnLCB3YXJuOiB0cnVlICB9LFxuICAgIHsgb2s6IGF0c1NjYW5uZWQgJiYgYXRzRmFpbHMgPT09IDAsIHdhcm46IHRydWUsXG4gICAgICBsYWJlbDogYXRzU2Nhbm5lZFxuICAgICAgICA/IChhdHNGYWlscyA+IDAgPyBgQVRTIHZhbGlkYXRpb24gXHUyMDE0ICR7YXRzRmFpbHN9IGlzc3VlJHthdHNGYWlscyAhPT0gMSA/ICdzJyA6ICcnfSBmb3VuZGAgOiAnQVRTIHZhbGlkYXRpb24gcGFzc2VkJylcbiAgICAgICAgOiAnQVRTIHZhbGlkYXRpb24gbm90IHlldCBydW4nIH0sXG4gICAgeyBvazogbGF5b3V0RnJlc2gsIHdhcm46IHRydWUsIGxhYmVsOiAnTGF5b3V0IGlzIGN1cnJlbnQgKG5vdCBzdGFsZSknIH0sXG4gIF07XG5cbiAgY29uc3Qgcm93cyA9IGl0ZW1zLm1hcCgoeyBvaywgbGFiZWwsIHdhcm4gfSkgPT4ge1xuICAgIGNvbnN0IGljb24gID0gb2sgPyAnXHUyNzA1JyA6ICh3YXJuID8gJ1x1MjZBMCcgOiAnXHUyNzRDJyk7XG4gICAgY29uc3QgY29sb3IgPSBvayA/ICcjMDY1ZjQ2JyA6ICh3YXJuID8gJyM5MjQwMGUnIDogJyM5OTFiMWInKTtcbiAgICBjb25zdCBiZyAgICA9IG9rID8gJyNmMGZkZjQnIDogKHdhcm4gPyAnI2ZmZmJlYicgOiAnI2ZlZjJmMicpO1xuICAgIHJldHVybiBgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjEwcHg7cGFkZGluZzo4cHggMTJweDtiYWNrZ3JvdW5kOiR7Ymd9O2JvcmRlci1yYWRpdXM6NnB4O21hcmdpbi1ib3R0b206NnB4O1wiPlxuICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCIgc3R5bGU9XCJmb250LXNpemU6MS4xZW07XCI+JHtpY29ufTwvc3Bhbj5cbiAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6JHtjb2xvcn07Zm9udC1zaXplOjAuOTJlbTtcIj4ke2VzY2FwZUh0bWwobGFiZWwpfTwvc3Bhbj5cbiAgICA8L2Rpdj5gO1xuICB9KS5qb2luKCcnKTtcblxuICBjb25zdCBhbGxSZXF1aXJlZCA9IGhhc1BkZiAmJiBoYXNEb2N4ICYmIGhhc0h0bWw7XG4gIGNvbnN0IGhlYWRlckNvbG9yID0gYWxsUmVxdWlyZWQgPyAnIzA2NWY0NicgOiAnIzkyNDAwZSc7XG4gIGVsLmlubmVySFRNTCA9IGBcbiAgICA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZmZmO2JvcmRlcjoxcHggc29saWQgI2UyZThmMDtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjE2cHggMjBweDttYXJnaW4tYm90dG9tOjI0cHg7XCI+XG4gICAgICA8aDMgc3R5bGU9XCJtYXJnaW46MCAwIDEycHg7Y29sb3I6JHtoZWFkZXJDb2xvcn07XCI+XHVEODNEXHVEQ0NCIFN1Ym1pc3Npb24gUmVhZGluZXNzPC9oMz5cbiAgICAgICR7cm93c31cbiAgICAgIDxwIHN0eWxlPVwibWFyZ2luOjEwcHggMCAwO2ZvbnQtc2l6ZTowLjgyZW07Y29sb3I6IzY0NzQ4YjtcIj5cbiAgICAgICAgXHUyNkEwIGl0ZW1zIGFyZSBvcHRpb25hbCBcdTIwMTQgdGhleSB3YXJuIGJ1dCBkbyBub3QgYmxvY2sgYXJjaGl2aW5nLlxuICAgICAgICBcdTI3NEMgaXRlbXMgbXVzdCBiZSByZXNvbHZlZCBiZWZvcmUgc3VibWl0dGluZy5cbiAgICAgIDwvcD5cbiAgICA8L2Rpdj5gO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgUmV3cml0ZSBhdWRpdCBsb2cgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIF9yZW5kZXJSZXdyaXRlQXVkaXRMb2coKSB7XG4gIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jld3JpdGUtYXVkaXQtbG9nJyk7XG4gIGlmICghZWwpIHJldHVybjtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvcmV3cml0ZXMnKTtcbiAgICBpZiAoIXJlcy5vaykgcmV0dXJuO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGNvbnN0IGF1ZGl0ID0gZGF0YS5yZXdyaXRlX2F1ZGl0IHx8IFtdO1xuICAgIGlmIChhdWRpdC5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICBjb25zdCByb3dzID0gYXVkaXQubWFwKGVudHJ5ID0+IHtcbiAgICAgIGNvbnN0IG91dGNvbWUgPSBlbnRyeS5vdXRjb21lIHx8IGVudHJ5LmRlY2lzaW9uIHx8ICdcdTIwMTQnO1xuICAgICAgY29uc3QgaWNvbiA9IG91dGNvbWUgPT09ICdhY2NlcHRlZCcgPyAnXHUyNzA1JyA6IG91dGNvbWUgPT09ICdlZGl0ZWQnID8gJ1x1MjcwRlx1RkUwRicgOiBvdXRjb21lID09PSAncmVqZWN0ZWQnID8gJ1x1Mjc0QycgOiAnXHUyMDE0JztcbiAgICAgIGNvbnN0IG9yaWdpbmFsICA9IGVzY2FwZUh0bWwoKGVudHJ5Lm9yaWdpbmFsX3RleHQgfHwgZW50cnkub3JpZ2luYWwgfHwgJycpLnNsaWNlKDAsIDEyMCkpO1xuICAgICAgY29uc3QgZmluYWwgICAgID0gZXNjYXBlSHRtbCgoZW50cnkuZmluYWxfdGV4dCB8fCBlbnRyeS5yZXdyaXR0ZW4gfHwgZW50cnkuc3VnZ2VzdGVkIHx8ICcnKS5zbGljZSgwLCAxMjApKTtcbiAgICAgIGNvbnN0IGZpZWxkICAgICA9IGVzY2FwZUh0bWwoZW50cnkuZmllbGQgfHwgZW50cnkudHlwZSB8fCAnXHUyMDE0Jyk7XG4gICAgICByZXR1cm4gYDx0cj5cbiAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzo2cHggOHB4O2ZvbnQtc2l6ZTowLjhlbTtjb2xvcjojNmI3MjgwO1wiPiR7ZmllbGR9PC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzo2cHggOHB4O2ZvbnQtc2l6ZTowLjhlbTtjb2xvcjojMzc0MTUxO1wiPiR7b3JpZ2luYWx9JHtvcmlnaW5hbC5sZW5ndGggPT09IDEyMCA/ICdcdTIwMjYnIDogJyd9PC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzo2cHggOHB4O2ZvbnQtc2l6ZTowLjhlbTtjb2xvcjojMzc0MTUxO1wiPiR7ZmluYWx9JHtmaW5hbC5sZW5ndGggPT09IDEyMCA/ICdcdTIwMjYnIDogJyd9PC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzo2cHggOHB4O2ZvbnQtc2l6ZTowLjhlbTt0ZXh0LWFsaWduOmNlbnRlcjtcIj4ke2ljb259ICR7ZXNjYXBlSHRtbChvdXRjb21lKX08L3RkPlxuICAgICAgPC90cj5gO1xuICAgIH0pLmpvaW4oJycpO1xuICAgIGVsLmlubmVySFRNTCA9IGBcbiAgICAgIDxkZXRhaWxzIHN0eWxlPVwibWFyZ2luLWJvdHRvbToyNHB4O1wiPlxuICAgICAgICA8c3VtbWFyeSBzdHlsZT1cImN1cnNvcjpwb2ludGVyO2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MC45NWVtO3BhZGRpbmc6MTBweCAwO2NvbG9yOiMzNzQxNTE7dXNlci1zZWxlY3Q6bm9uZTtcIj5cbiAgICAgICAgICBcdUQ4M0RcdURDQ0IgUmV3cml0ZSBhdWRpdCBsb2cgKCR7YXVkaXQubGVuZ3RofSBkZWNpc2lvbiR7YXVkaXQubGVuZ3RoICE9PSAxID8gJ3MnIDogJyd9KVxuICAgICAgICA8L3N1bW1hcnk+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJvdmVyZmxvdy14OmF1dG87bWFyZ2luLXRvcDoxMHB4O1wiPlxuICAgICAgICAgIDx0YWJsZSBzdHlsZT1cIndpZHRoOjEwMCU7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlO2ZvbnQtc2l6ZTowLjg1ZW07XCI+XG4gICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgIDx0ciBzdHlsZT1cImJhY2tncm91bmQ6I2Y4ZmFmYztib3JkZXItYm90dG9tOjJweCBzb2xpZCAjZTJlOGYwO1wiPlxuICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cInBhZGRpbmc6OHB4O3RleHQtYWxpZ246bGVmdDtjb2xvcjojMzc0MTUxO2ZvbnQtd2VpZ2h0OjYwMDtcIj5GaWVsZDwvdGg+XG4gICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwicGFkZGluZzo4cHg7dGV4dC1hbGlnbjpsZWZ0O2NvbG9yOiMzNzQxNTE7Zm9udC13ZWlnaHQ6NjAwO1wiPk9yaWdpbmFsPC90aD5cbiAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJwYWRkaW5nOjhweDt0ZXh0LWFsaWduOmxlZnQ7Y29sb3I6IzM3NDE1MTtmb250LXdlaWdodDo2MDA7XCI+RmluYWw8L3RoPlxuICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cInBhZGRpbmc6OHB4O3RleHQtYWxpZ246Y2VudGVyO2NvbG9yOiMzNzQxNTE7Zm9udC13ZWlnaHQ6NjAwO1wiPk91dGNvbWU8L3RoPlxuICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICAgIDx0Ym9keT4ke3Jvd3N9PC90Ym9keT5cbiAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGV0YWlscz5gO1xuICB9IGNhdGNoIHsgLyogbm9uLWZhdGFsICovIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIEZpbmFsaXNlIGFwcGxpY2F0aW9uIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBmaW5hbGlzZUFwcGxpY2F0aW9uKCkge1xuICAvKiBkdWNrZmxvdzpcbiAgICogICBpZDogZmluYWxpc2VfdWlfc3VibWl0X2xpdmVcbiAgICogICBraW5kOiB1aVxuICAgKiAgIHRpbWVzdGFtcDogJzIwMjYtMDMtMjVUMjE6Mzk6NDhaJ1xuICAgKiAgIHN0YXR1czogbGl2ZVxuICAgKiAgIGhhbmRsZXM6XG4gICAqICAgLSB1aTpmaW5hbGlzZS5zdWJtaXRcbiAgICogICBjYWxsczpcbiAgICogICAtIFBPU1QgL2FwaS9maW5hbGlzZVxuICAgKiAgIHJlYWRzOlxuICAgKiAgIC0gZG9tOiNmaW5hbGlzZS1zdGF0dXMudmFsdWVcbiAgICogICAtIGRvbTojZmluYWxpc2Utbm90ZXMudmFsdWVcbiAgICogICB3cml0ZXM6XG4gICAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9maW5hbGlzZS5zdGF0dXNcbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL2ZpbmFsaXNlLm5vdGVzXG4gICAqICAgLSBkb206I2ZpbmFsaXNlLXJlc3VsdFxuICAgKiAgIG5vdGVzOiBTdWJtaXRzIGZpbmFsIGFwcGxpY2F0aW9uIHN0YXR1cyBhbmQgbm90ZXMgc28gYmFja2VuZCBtZXRhZGF0YSwgYXJjaGl2ZSBzdGF0ZSwgYW5kIG9wdGlvbmFsIGdpdCBmaW5hbGl6YXRpb24gY2FuIGJlIHdyaXR0ZW4gZnJvbSB0aGUgY3VycmVudCBzZXNzaW9uLlxuICAgKi9cbiAgY29uc3QgYnRuICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbmFsaXNlLWJ0bicpO1xuICBjb25zdCByZXN1bHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmluYWxpc2UtcmVzdWx0Jyk7XG4gIGNvbnN0IHN0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaW5hbGlzZS1zdGF0dXMnKS52YWx1ZTtcbiAgY29uc3Qgbm90ZXMgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbmFsaXNlLW5vdGVzJykudmFsdWU7XG5cbiAgYnRuLmRpc2FibGVkICAgID0gdHJ1ZTtcbiAgYnRuLnRleHRDb250ZW50ID0gJ1x1MjNGMyBGaW5hbGlzaW5nXHUyMDI2JztcbiAgcmVzdWx0LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHJlc3VsdC5pbm5lckhUTUwgICAgID0gJyc7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvZmluYWxpc2UnLCB7XG4gICAgICBtZXRob2Q6ICAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6ICAgIEpTT04uc3RyaW5naWZ5KHsgc3RhdHVzLCBub3RlcyB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcblxuICAgIGlmICghcmVzLm9rIHx8ICFkYXRhLm9rKSB7XG4gICAgICByZXN1bHQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICByZXN1bHQuaW5uZXJIVE1MID0gYDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZWUyZTI7Ym9yZGVyOjFweCBzb2xpZCAjZmNhNWE1O2JvcmRlci1yYWRpdXM6OHB4O1xuICAgICAgICBwYWRkaW5nOjE0cHggMThweDtjb2xvcjojOTkxYjFiO1wiPlxuICAgICAgICA8c3Ryb25nPlx1Mjc0QyBFcnJvcjo8L3N0cm9uZz4gJHtlc2NhcGVIdG1sKGRhdGEuZXJyb3IgfHwgJ0ZpbmFsaXNlIGZhaWxlZCcpfVxuICAgICAgPC9kaXY+YDtcbiAgICAgIGJ0bi5kaXNhYmxlZCAgICA9IGZhbHNlO1xuICAgICAgYnRuLnRleHRDb250ZW50ID0gJ1x1MjcwNSBGaW5hbGlzZSAmIEFyY2hpdmUnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN1bW1hcnkgPSBkYXRhLnN1bW1hcnkgfHwge307XG4gICAgY29uc3QgaGFzaCAgICA9IGRhdGEuY29tbWl0X2hhc2ggPyBgPGNvZGUgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO1wiPiR7ZXNjYXBlSHRtbChkYXRhLmNvbW1pdF9oYXNoKX08L2NvZGU+YCA6ICcobm8gY29tbWl0KSc7XG4gICAgY29uc3QgZ2l0V2FybiA9IGRhdGEuZ2l0X2Vycm9yXG4gICAgICA/IGA8cCBzdHlsZT1cImNvbG9yOiNkOTc3MDY7Zm9udC1zaXplOjAuODdlbTttYXJnaW4tdG9wOjhweDtcIj5cdTI2QTAgR2l0OiAke2VzY2FwZUh0bWwoZGF0YS5naXRfZXJyb3IpfTwvcD5gXG4gICAgICA6ICcnO1xuICAgIGNvbnN0IGFwcHJvdmVkQ291bnQgPSBzdW1tYXJ5LmFwcHJvdmVkX3Jld3JpdGVzID8/IDA7XG4gICAgY29uc3QgYXRzS2V5d29yZHMgICA9IHN1bW1hcnkuYXRzX2tleXdvcmRzIHx8IFtdO1xuICAgIGNvbnN0IGF0c1Njb3JlICAgICAgPSBzdW1tYXJ5LmF0c19zY29yZSB8fCBudWxsO1xuICAgIGNvbnN0IGR1cmF0aW9uU2VjcyAgPSBzdW1tYXJ5LnNlc3Npb25fZHVyYXRpb25fc2VjcztcbiAgICBjb25zdCBkdXJhdGlvblN0ciAgID0gZHVyYXRpb25TZWNzICE9IG51bGwgPyBfZm9ybWF0RHVyYXRpb24oZHVyYXRpb25TZWNzKSA6IG51bGw7XG5cbiAgICByZXN1bHQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgcmVzdWx0LmlubmVySFRNTCA9IGBcbiAgICAgIDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmMGZkZjQ7Ym9yZGVyOjFweCBzb2xpZCAjODZlZmFjO2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MTZweCAyMHB4O21hcmdpbi1ib3R0b206MjBweDtcIj5cbiAgICAgICAgPHN0cm9uZz5cdTI3MDUgQXBwbGljYXRpb24gYXJjaGl2ZWQhPC9zdHJvbmc+XG4gICAgICAgIDx1bCBzdHlsZT1cIm1hcmdpbjo4cHggMCAwO3BhZGRpbmctbGVmdDoyMHB4O2xpbmUtaGVpZ2h0OjEuODtmb250LXNpemU6MC45MmVtO1wiPlxuICAgICAgICAgIDxsaT5TdGF0dXM6IDxzdHJvbmc+JHtlc2NhcGVIdG1sKHN0YXR1cyl9PC9zdHJvbmc+PC9saT5cbiAgICAgICAgICA8bGk+QXBwcm92ZWQgcmV3cml0ZXM6ICR7YXBwcm92ZWRDb3VudH08L2xpPlxuICAgICAgICAgICR7X3JlbmRlckZpbmFsaXNlQXRzSXRlbXMoYXRzU2NvcmUsIGF0c0tleXdvcmRzKX1cbiAgICAgICAgICAke2R1cmF0aW9uU3RyID8gYDxsaT5TZXNzaW9uIGR1cmF0aW9uOiAke2VzY2FwZUh0bWwoZHVyYXRpb25TdHIpfTwvbGk+YCA6ICcnfVxuICAgICAgICAgIDxsaT5HaXQgY29tbWl0OiAke2hhc2h9PC9saT5cbiAgICAgICAgPC91bD5cbiAgICAgICAgJHtnaXRXYXJufVxuICAgICAgPC9kaXY+YDtcblxuICAgIGJ0bi50ZXh0Q29udGVudCA9ICdcdTI3MDUgQXJjaGl2ZWQnO1xuXG4gICAgLy8gU2hvdyBoYXJ2ZXN0IHNlY3Rpb25cbiAgICBhd2FpdCBzaG93SGFydmVzdFNlY3Rpb24oKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmVzdWx0LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgIHJlc3VsdC5pbm5lckhUTUwgPSBgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2ZlZTJlMjtib3JkZXI6MXB4IHNvbGlkICNmY2E1YTU7Ym9yZGVyLXJhZGl1czo4cHg7XG4gICAgICBwYWRkaW5nOjE0cHggMThweDtjb2xvcjojOTkxYjFiO1wiPlxuICAgICAgPHN0cm9uZz5cdTI3NEMgTmV0d29yayBlcnJvcjo8L3N0cm9uZz4gJHtlc2NhcGVIdG1sKGVyci5tZXNzYWdlKX1cbiAgICA8L2Rpdj5gO1xuICAgIGJ0bi5kaXNhYmxlZCAgICA9IGZhbHNlO1xuICAgIGJ0bi50ZXh0Q29udGVudCA9ICdcdTI3MDUgRmluYWxpc2UgJiBBcmNoaXZlJztcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgU2hvdyBoYXJ2ZXN0IHNlY3Rpb24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIHNob3dIYXJ2ZXN0U2VjdGlvbigpIHtcbiAgY29uc3Qgc2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoYXJ2ZXN0LXNlY3Rpb24nKTtcbiAgc2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgc2VjdGlvbi5pbm5lckhUTUwgPSBgXG4gICAgPGgyIHN0eWxlPVwibWFyZ2luLXRvcDowO1wiPlx1RDgzRFx1RENFNSBVcGRhdGUgTWFzdGVyIENWIERhdGE8L2gyPlxuICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDttYXJnaW4tYm90dG9tOjE2cHg7XCI+TG9hZGluZyBpbXByb3ZlbWVudCBjYW5kaWRhdGVzIGZyb20gdGhpcyBzZXNzaW9uXHUyMDI2PC9wPlxuICAgIDxkaXYgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjtwYWRkaW5nOjI0cHg7XCI+PGRpdiBjbGFzcz1cImxvYWRpbmctc3Bpbm5lclwiPjwvZGl2PjwvZGl2PmA7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvaGFydmVzdC9jYW5kaWRhdGVzJyk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG5cbiAgICBpZiAoIWRhdGEub2spIHtcbiAgICAgIHNlY3Rpb24uaW5uZXJIVE1MID0gYFxuICAgICAgICA8aDIgc3R5bGU9XCJtYXJnaW4tdG9wOjA7XCI+XHVEODNEXHVEQ0U1IFVwZGF0ZSBNYXN0ZXIgQ1YgRGF0YTwvaDI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZWUyZTI7Ym9yZGVyOjFweCBzb2xpZCAjZmNhNWE1O2JvcmRlci1yYWRpdXM6OHB4O1xuICAgICAgICAgIHBhZGRpbmc6MTJweCAxNnB4O2NvbG9yOiM5OTFiMWI7XCI+XG4gICAgICAgICAgXHUyNzRDICR7ZXNjYXBlSHRtbChkYXRhLmVycm9yIHx8ICdGYWlsZWQgdG8gbG9hZCBjYW5kaWRhdGVzJyl9XG4gICAgICAgIDwvZGl2PmA7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY2FuZGlkYXRlcyA9IGRhdGEuY2FuZGlkYXRlcyB8fCBbXTtcblxuICAgIGlmIChjYW5kaWRhdGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgc2VjdGlvbi5pbm5lckhUTUwgPSBgXG4gICAgICAgIDxoMiBzdHlsZT1cIm1hcmdpbi10b3A6MDtcIj5cdUQ4M0RcdURDRTUgVXBkYXRlIE1hc3RlciBDViBEYXRhPC9oMj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImVtcHR5LXN0YXRlXCIgc3R5bGU9XCJwYWRkaW5nOjI0cHggMDtcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWNvblwiPlx1RDgzRFx1RENDQjwvZGl2PlxuICAgICAgICAgIDxoMz5ObyBVcGRhdGUgQ2FuZGlkYXRlczwvaDM+XG4gICAgICAgICAgPHA+Tm90aGluZyBmcm9tIHRoaXMgc2Vzc2lvbiB3YXJyYW50cyB3cml0aW5nIGJhY2sgdG8gdGhlIG1hc3RlciBDVi48L3A+XG4gICAgICAgIDwvZGl2PmA7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdHlwZUljb25zID0ge1xuICAgICAgaW1wcm92ZWRfYnVsbGV0OiAgICAnXHUyNzBGXHVGRTBGJyxcbiAgICAgIG5ld19za2lsbDogICAgICAgICAgJ1x1RDgzRFx1REVFMCcsXG4gICAgICBzdW1tYXJ5X3ZhcmlhbnQ6ICAgICdcdUQ4M0RcdURDREQnLFxuICAgICAgc2tpbGxfZ2FwX2NvbmZpcm1lZDonXHUyNzA1JyxcbiAgICB9O1xuXG4gICAgbGV0IGh0bWwgPSBgXG4gICAgICA8aDIgc3R5bGU9XCJtYXJnaW4tdG9wOjA7XCI+XHVEODNEXHVEQ0U1IFVwZGF0ZSBNYXN0ZXIgQ1YgRGF0YTwvaDI+XG4gICAgICA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7bWFyZ2luLWJvdHRvbToxNnB4O1wiPlxuICAgICAgICBTZWxlY3QgaW1wcm92ZW1lbnRzIGZyb20gdGhpcyBzZXNzaW9uIHRvIHdyaXRlIGJhY2sgdG8gPGNvZGU+TWFzdGVyX0NWX0RhdGEuanNvbjwvY29kZT4uXG4gICAgICAgIE5vIGl0ZW1zIGFyZSBwcmUtc2VsZWN0ZWQgXHUyMDE0IGNob29zZSBvbmx5IHdoYXQgeW91IHdhbnQgdG8ga2VlcC5cbiAgICAgIDwvcD5cbiAgICAgIDx0YWJsZSBjbGFzcz1cInJldmlldy10YWJsZVwiIHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNnB4O1wiPlxuICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgPHRyPlxuICAgICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6MzZweDt0ZXh0LWFsaWduOmNlbnRlcjtcIj5JbmNsdWRlPC90aD5cbiAgICAgICAgICAgIDx0aD5UeXBlPC90aD5cbiAgICAgICAgICAgIDx0aD5DaGFuZ2U8L3RoPlxuICAgICAgICAgICAgPHRoPlJhdGlvbmFsZTwvdGg+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgPC90aGVhZD5cbiAgICAgICAgPHRib2R5PmA7XG5cbiAgICBmb3IgKGNvbnN0IGMgb2YgY2FuZGlkYXRlcykge1xuICAgICAgY29uc3QgaWNvbiAgICAgPSB0eXBlSWNvbnNbYy50eXBlXSB8fCAnXHVEODNEXHVEQ0NDJztcbiAgICAgIGNvbnN0IG9yaWdpbmFsID0gYy5vcmlnaW5hbCAmJiBjLm9yaWdpbmFsICE9PSAnKG5vdCBpbiBtYXN0ZXIgZGF0YSknXG4gICAgICAgID8gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC44MmVtO2NvbG9yOiM2YjcyODA7bWFyZ2luLXRvcDo0cHg7bWFyZ2luLWJvdHRvbToycHg7XG4gICAgICAgICAgICAgICB0ZXh0LWRlY29yYXRpb246bGluZS10aHJvdWdoO1wiPiR7ZXNjYXBlSHRtbChjLm9yaWdpbmFsKX08L2Rpdj5gXG4gICAgICAgIDogJyc7XG4gICAgICBodG1sICs9IGBcbiAgICAgICAgPHRyIGlkPVwiaGFydmVzdC1yb3ctJHtlc2NhcGVIdG1sKGMuaWQpfVwiPlxuICAgICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO1wiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiaGFydmVzdC1jaGstJHtlc2NhcGVIdG1sKGMuaWQpfVwiXG4gICAgICAgICAgICAgIGRhdGEtaGFydmVzdC1pZD1cIiR7ZXNjYXBlSHRtbChjLmlkKX1cIiBzdHlsZT1cIndpZHRoOjE2cHg7aGVpZ2h0OjE2cHg7Y3Vyc29yOnBvaW50ZXI7XCI+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICA8c3BhbiB0aXRsZT1cIiR7ZXNjYXBlSHRtbChjLnR5cGUpfVwiPiR7aWNvbn08L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07Y29sb3I6IzQ3NTU2OTttYXJnaW4tbGVmdDo0cHg7XCI+JHtlc2NhcGVIdG1sKGMudHlwZS5yZXBsYWNlKC9fL2csJyAnKSl9PC9zcGFuPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPHRkPlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtd2VpZ2h0OjUwMDtcIj4ke2VzY2FwZUh0bWwoYy5sYWJlbCl9PC9kaXY+XG4gICAgICAgICAgICAke29yaWdpbmFsfVxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjg4ZW07Y29sb3I6IzFlMjkzYjttYXJnaW4tdG9wOjJweDtcIj4ke2VzY2FwZUh0bWwoYy5wcm9wb3NlZCl9PC9kaXY+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8dGQgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2NvbG9yOiM2NDc0OGI7XCI+JHtlc2NhcGVIdG1sKGMucmF0aW9uYWxlKX08L3RkPlxuICAgICAgICA8L3RyPmA7XG4gICAgfVxuXG4gICAgaHRtbCArPSBgXG4gICAgICAgIDwvdGJvZHk+XG4gICAgICA8L3RhYmxlPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6MTJweDthbGlnbi1pdGVtczpjZW50ZXI7XCI+XG4gICAgICAgIDxidXR0b24gb25jbGljaz1cImFwcGx5SGFydmVzdFNlbGVjdGlvbnMoKVwiXG4gICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiMwZWE1ZTk7Y29sb3I6I2ZmZjtib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjZweDtcbiAgICAgICAgICAgICAgICAgcGFkZGluZzoxMHB4IDI0cHg7Zm9udC1zaXplOjFlbTtmb250LXdlaWdodDo2MDA7Y3Vyc29yOnBvaW50ZXI7XCIgaWQ9XCJoYXJ2ZXN0LWFwcGx5LWJ0blwiPlxuICAgICAgICAgIFx1RDgzRFx1RENFNSBBcHBseSBTZWxlY3RlZCBVcGRhdGVzXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIG9uY2xpY2s9XCJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGFydmVzdC1zZWN0aW9uJykuc3R5bGUuZGlzcGxheT0nbm9uZSdcIlxuICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDojZjFmNWY5O2NvbG9yOiM0NzU1Njk7Ym9yZGVyOjFweCBzb2xpZCAjY2JkNWUxO2JvcmRlci1yYWRpdXM6NnB4O1xuICAgICAgICAgICAgICAgICBwYWRkaW5nOjEwcHggMjBweDtmb250LXNpemU6MC45NWVtO2N1cnNvcjpwb2ludGVyO1wiPlxuICAgICAgICAgIFNraXBcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgaWQ9XCJoYXJ2ZXN0LXJlc3VsdFwiIHN0eWxlPVwibWFyZ2luLXRvcDoxNnB4O1wiPjwvZGl2PmA7XG5cbiAgICBzZWN0aW9uLmlubmVySFRNTCA9IGh0bWw7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHNlY3Rpb24uaW5uZXJIVE1MID0gYFxuICAgICAgPGgyIHN0eWxlPVwibWFyZ2luLXRvcDowO1wiPlx1RDgzRFx1RENFNSBVcGRhdGUgTWFzdGVyIENWIERhdGE8L2gyPlxuICAgICAgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2ZlZTJlMjtib3JkZXI6MXB4IHNvbGlkICNmY2E1YTU7Ym9yZGVyLXJhZGl1czo4cHg7XG4gICAgICAgIHBhZGRpbmc6MTJweCAxNnB4O2NvbG9yOiM5OTFiMWI7XCI+XG4gICAgICAgIFx1Mjc0QyBOZXR3b3JrIGVycm9yOiAke2VzY2FwZUh0bWwoZXJyLm1lc3NhZ2UpfVxuICAgICAgPC9kaXY+YDtcbiAgfVxufVxuXG4vLyBhcHBseUhhcnZlc3RTZWxlY3Rpb25zKCkgKGJvdW5kIHZpYSB0aGUgYnV0dG9uJ3Mgb25jbGljayBhYm92ZSkgbGl2ZXMgaW5cbi8vIHdlYi9oYXJ2ZXN0LmpzLCBub3QgaGVyZSBcdTIwMTQgdGhpcyBmaWxlIHVzZWQgdG8gY2FycnkgaXRzIG93biBkaXZlcmdlbnRcbi8vIGR1cGxpY2F0ZSAoZGlmZmVyZW50IGNvbmZpcm0vbWVzc2FnZSBjb3B5LCBubyBjb25maXJtLW1vZGFsIHN0ZXApLCBidXRcbi8vIHNpbmNlIGJvdGggZmlsZXMgcmVuZGVyIGEgYnV0dG9uIHdpdGggdGhlIHNhbWUgb25jbGljayBhbmQgd2luZG93IHJlc29sdmVzXG4vLyBiYXJlIGlkZW50aWZpZXJzIGF0IGNsaWNrIHRpbWUsIGhhcnZlc3QuanMncyB2ZXJzaW9uIHdhcyBhbHdheXMgdGhlIG9uZVxuLy8gYWN0dWFsbHkgaW52b2tlZCBpbiBwcm9kdWN0aW9uIHJlZ2FyZGxlc3M7IHRoaXMgY29weSB3YXMgdW5yZWFjaGFibGUgZGVhZFxuLy8gY29kZS4gUmVtb3ZlZDsgc2VlIHdlYi9oYXJ2ZXN0LmpzLlxuXG4vLyBcdTI1MDBcdTI1MDAgRXhwb3J0cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZXhwb3J0IHtcbiAgcG9wdWxhdGVGaW5hbGlzZVRhYixcbiAgZmluYWxpc2VBcHBsaWNhdGlvbixcbiAgc2hvd0hhcnZlc3RTZWN0aW9uLFxuICBfcmVuZGVyUmVhZGluZXNzQ2hlY2tsaXN0LFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL2ludGVydmlldy1wcmVwLmpzXG4gKiBJbnRlcnZpZXcgUHJlcGFyYXRpb24gcGhhc2UgXHUyMDE0IHBsYWNlaG9sZGVyIGNvbnRlbnQgd2l0aCBuYXZpZ2F0aW9uLlxuICpcbiAqIERlcGVuZGVuY2llcyAocmVzb2x2ZWQgdGhyb3VnaCBnbG9iYWxUaGlzIGF0IHJ1bnRpbWUpOlxuICogICBoYW5kbGVTdGVwQ2xpY2tcbiAqL1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5jb25zdCBsb2cgPSBnZXRMb2dnZXIoJ2ludGVydmlldy1wcmVwJyk7XG5cbmFzeW5jIGZ1bmN0aW9uIHBvcHVsYXRlSW50ZXJ2aWV3UHJlcFRhYigpIHtcbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIGlmICghY29udGVudCkgcmV0dXJuO1xuXG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgc3R5bGU9XCJtYXgtd2lkdGg6NzAwcHg7bWFyZ2luOjAgYXV0bztwYWRkaW5nOjQwcHggMjBweDt0ZXh0LWFsaWduOmNlbnRlcjtcIj5cbiAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6M2VtO21hcmdpbi1ib3R0b206MTZweDtcIj5cdUQ4M0NcdURGQTQ8L2Rpdj5cbiAgICAgIDxoMiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTJweDtcIj5JbnRlcnZpZXcgUHJlcGFyYXRpb248L2gyPlxuICAgICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO21hcmdpbi1ib3R0b206OHB4O1wiPlxuICAgICAgICBBSS1nZW5lcmF0ZWQgaW50ZXJ2aWV3IHByZXBhcmF0aW9uIGJhc2VkIG9uIHRoaXMgam9iIGFuZCB5b3VyIENWIGlzIGNvbWluZyBzb29uLlxuICAgICAgPC9wPlxuICAgICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO2ZvbnQtc2l6ZTowLjllbTtcIj5cbiAgICAgICAgVGhpcyB3aWxsIGluY2x1ZGUgbGlrZWx5IGludGVydmlldyBxdWVzdGlvbnMsIHN1Z2dlc3RlZCB0YWxraW5nIHBvaW50cywgYW5kXG4gICAgICAgIFNUQVItZm9ybWF0IGFuc3dlcnMgZHJhd24gZnJvbSB5b3VyIGV4cGVyaWVuY2UuXG4gICAgICA8L3A+XG4gICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDo0MHB4O1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLXByaW1hcnlcIiBvbmNsaWNrPVwiaGFuZGxlU3RlcENsaWNrKCd0aGFua195b3UnKVwiXG4gICAgICAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6MWVtO3BhZGRpbmc6MTBweCAyNHB4O1wiPlxuICAgICAgICAgIFByb2NlZWQgdG8gVGhhbmsgWW91IExldHRlciBcdTIxOTJcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xuXG4gIGxvZy5kZWJ1ZygnSW50ZXJ2aWV3IHByZXAgcGxhY2Vob2xkZXIgcmVuZGVyZWQnKTtcbn1cblxuZXhwb3J0IHsgcG9wdWxhdGVJbnRlcnZpZXdQcmVwVGFiIH07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi90aGFuay15b3UuanNcbiAqIFRoYW5rIFlvdSBMZXR0ZXIgcGhhc2UgXHUyMDE0IHBsYWNlaG9sZGVyIGNvbnRlbnQgd2l0aCBuYXZpZ2F0aW9uLlxuICpcbiAqIERlcGVuZGVuY2llcyAocmVzb2x2ZWQgdGhyb3VnaCBnbG9iYWxUaGlzIGF0IHJ1bnRpbWUpOlxuICogICBoYW5kbGVTdGVwQ2xpY2tcbiAqL1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5jb25zdCBsb2cgPSBnZXRMb2dnZXIoJ3RoYW5rLXlvdScpO1xuXG5hc3luYyBmdW5jdGlvbiBwb3B1bGF0ZVRoYW5rWW91VGFiKCkge1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgaWYgKCFjb250ZW50KSByZXR1cm47XG5cbiAgY29udGVudC5pbm5lckhUTUwgPSBgXG4gICAgPGRpdiBzdHlsZT1cIm1heC13aWR0aDo3MDBweDttYXJnaW46MCBhdXRvO3BhZGRpbmc6NDBweCAyMHB4O3RleHQtYWxpZ246Y2VudGVyO1wiPlxuICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTozZW07bWFyZ2luLWJvdHRvbToxNnB4O1wiPlx1RDgzRFx1REU0RjwvZGl2PlxuICAgICAgPGgyIHN0eWxlPVwibWFyZ2luLWJvdHRvbToxMnB4O1wiPlRoYW5rIFlvdSBMZXR0ZXI8L2gyPlxuICAgICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO21hcmdpbi1ib3R0b206OHB4O1wiPlxuICAgICAgICBBSS1nZW5lcmF0ZWQgdGhhbmsgeW91IGxldHRlciB0ZW1wbGF0ZXMgYXJlIGNvbWluZyBzb29uLlxuICAgICAgPC9wPlxuICAgICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO2ZvbnQtc2l6ZTowLjllbTtcIj5cbiAgICAgICAgQWZ0ZXIgeW91ciBpbnRlcnZpZXcsIHVzZSB0aGlzIHRvIGdlbmVyYXRlIGEgcGVyc29uYWxpc2VkIHRoYW5rIHlvdSBub3RlXG4gICAgICAgIHRoYXQgcmVpbmZvcmNlcyB5b3VyIGZpdCBmb3IgdGhlIHJvbGUuXG4gICAgICA8L3A+XG4gICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDo0MHB4O1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLXByaW1hcnlcIiBvbmNsaWNrPVwiaGFuZGxlU3RlcENsaWNrKCdoYXJ2ZXN0JylcIlxuICAgICAgICAgICAgICAgIHN0eWxlPVwiZm9udC1zaXplOjFlbTtwYWRkaW5nOjEwcHggMjRweDtcIj5cbiAgICAgICAgICBQcm9jZWVkIHRvIEhhcnZlc3QgSW1wcm92ZW1lbnRzIFx1MjE5MlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PmA7XG5cbiAgbG9nLmRlYnVnKCdUaGFuayB5b3UgbGV0dGVyIHBsYWNlaG9sZGVyIHJlbmRlcmVkJyk7XG59XG5cbmV4cG9ydCB7IHBvcHVsYXRlVGhhbmtZb3VUYWIgfTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogSGFydmVzdCB0YWI6IExMTS1zY29yZWQgZ3JvdXBlZCB2aWV3IG9mIG1hc3Rlci1DViBpbXByb3ZlbWVudCBjYW5kaWRhdGVzLlxuICpcbiAqIFB1YmxpYyBleHBvcnRzOlxuICogICBwb3B1bGF0ZUhhcnZlc3RUYWIoKSAgICAgICAgXHUyMDE0IGNhbGxlZCBieSByZXZpZXctdGFibGUtYmFzZS5qcyBvbiB0YWIgc3dpdGNoXG4gKiAgIGFwcGx5SGFydmVzdFNlbGVjdGlvbnMoKSAgICBcdTIwMTQgY2FsbGVkIGJ5IGlubGluZSBvbmNsaWNrIG9uIHRoZSBBcHBseSBidXR0b25cbiAqICAgcmVmcmVzaEhhcnZlc3RBbmFseXNpcygpICAgIFx1MjAxNCBjYWxsZWQgYnkgaW5saW5lIG9uY2xpY2sgb24gdGhlIFJlZnJlc2ggYnV0dG9uXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZXNjLCByZW5kZXJQcm9wb3NhbFJvdywgYXR0YWNoUHJvcG9zYWxSb3dMaXN0ZW5lcnMgfSBmcm9tICcuL3Byb3Bvc2FsLXJldmlldy5qcyc7XG5cbmNvbnN0IGxvZyA9IGdldExvZ2dlcignaGFydmVzdCcpO1xuXG4vLyBcdTI1MDBcdTI1MDAgRGlzcGxheSBjb25maWcgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8qKlxuICogTWVyZ2VkIGRpc3BsYXkgdHlwZSBjb25maWcuXG4gKiBuZXdfc2tpbGwgYW5kIHNraWxsX2dhcF9jb25maXJtZWQgYm90aCBtYXAgdG8gdGhlICdza2lsbCcgZGlzcGxheSBncm91cC5cbiAqL1xuY29uc3QgSEFSVkVTVF9UWVBFX0NPTkZJRyA9IHtcbiAgaW1wcm92ZWRfYnVsbGV0OiAgICAgeyBsYWJlbDogJ0V4cGVyaWVuY2UgQnVsbGV0cycsICAgICBpY29uOiAnXHUyNzBGXHVGRTBGJywgIHNvcnQ6IDEsIGRpc3BsYXlUeXBlOiAnaW1wcm92ZWRfYnVsbGV0JyAgICAgfSxcbiAgbmV3X3NraWxsOiAgICAgICAgICAgeyBsYWJlbDogJ1NraWxscycsICAgICAgICAgICAgICAgICBpY29uOiAnXHVEODNEXHVERUUwXHVGRTBGJywgIHNvcnQ6IDIsIGRpc3BsYXlUeXBlOiAnc2tpbGwnICAgICAgICAgICAgICAgfSxcbiAgc2tpbGxfZ2FwX2NvbmZpcm1lZDogeyBsYWJlbDogJ1NraWxscycsICAgICAgICAgICAgICAgICBpY29uOiAnXHVEODNEXHVERUUwXHVGRTBGJywgIHNvcnQ6IDIsIGRpc3BsYXlUeXBlOiAnc2tpbGwnICAgICAgICAgICAgICAgfSxcbiAgc3VtbWFyeV92YXJpYW50OiAgICAgeyBsYWJlbDogJ1Byb2Zlc3Npb25hbCBTdW1tYXJ5JywgICBpY29uOiAnXHVEODNEXHVEQ0REJywgIHNvcnQ6IDMsIGRpc3BsYXlUeXBlOiAnc3VtbWFyeV92YXJpYW50JyAgICAgfSxcbiAgc2tpbGxfdHlwZV91cGRhdGU6ICAgeyBsYWJlbDogJ1NraWxsIENsYXNzaWZpY2F0aW9uJywgICBpY29uOiAnXHVEODNDXHVERkY3XHVGRTBGJywgIHNvcnQ6IDQsIGRpc3BsYXlUeXBlOiAnc2tpbGxfdHlwZV91cGRhdGUnICB9LFxufTtcblxuY29uc3QgSEFSVkVTVF9UWVBFX0RFU0NSSVBUSU9OUyA9IHtcbiAgaW1wcm92ZWRfYnVsbGV0OiAgICAgICdSZXdyaXR0ZW4gYWNoaWV2ZW1lbnQgYnVsbGV0cyB5b3UgYXBwcm92ZWQgaW4gdGhlIFJld3JpdGVzIHN0ZXAuIFByb21vdGluZyB1cGRhdGVzIHRoZSBidWxsZXQgdGV4dCBpbiB5b3VyIG1hc3RlciBDVi4nLFxuICBza2lsbDogICAgICAgICAgICAgICAgJ1NraWxscyBhYnNlbnQgZnJvbSB5b3VyIG1hc3RlciBDViBcdTIwMTQgZWl0aGVyIGFkZGVkIChcdUQ4M0NcdUREOTUgQWRkZWQpIGR1cmluZyB0aGUgU2tpbGxzIFJldmlldyBvciBjb25maXJtZWQgd2hlbiBhc2tlZCAoXHUyNzA1IENvbmZpcm1lZCkuIFByb21vdGluZyBhZGRzIHRoZW0gdG8geW91ciBza2lsbHMgc2VjdGlvbi4nLFxuICBzdW1tYXJ5X3ZhcmlhbnQ6ICAgICAgJ0EgcmV3cml0dGVuIHZlcnNpb24gb2YgeW91ciBwcm9mZXNzaW9uYWwgc3VtbWFyeS4gUHJvbW90aW5nIHN0b3JlcyBpdCBhcyBhIG5hbWVkIHZhcmlhbnQgaW4geW91ciBtYXN0ZXIgQ1YuJyxcbiAgc2tpbGxfdHlwZV91cGRhdGU6ICAgICdIYXJkL3NvZnQgc2tpbGwgY2xhc3NpZmljYXRpb25zIHlvdSBjaGFuZ2VkIGR1cmluZyB0aGlzIHNlc3Npb24uIFByb21vdGluZyBwZXJzaXN0cyB0aGUgbmV3IHR5cGUgc28gaXQgaXMgbm90IHJlLWNsYXNzaWZpZWQgb24gZXZlcnkgYXBwbGljYXRpb24uJyxcbn07XG5cbmNvbnN0IEhBUlZFU1RfU09VUkNFX0JBREdFID0ge1xuICBuZXdfc2tpbGw6ICAgICAgICAgICAnPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC43NWVtO2JhY2tncm91bmQ6I2RiZWFmZTtjb2xvcjojMWQ0ZWQ4O2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6MXB4IDZweDttYXJnaW4tbGVmdDo2cHg7d2hpdGUtc3BhY2U6bm93cmFwO1wiPlx1RDgzQ1x1REQ5NSBBZGRlZDwvc3Bhbj4nLFxuICBza2lsbF9nYXBfY29uZmlybWVkOiAnPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC43NWVtO2JhY2tncm91bmQ6I2RjZmNlNztjb2xvcjojMTY2NTM0O2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6MXB4IDZweDttYXJnaW4tbGVmdDo2cHg7d2hpdGUtc3BhY2U6bm93cmFwO1wiPlx1MjcwNSBDb25maXJtZWQ8L3NwYW4+JyxcbiAgc2tpbGxfdHlwZV91cGRhdGU6ICAgJzxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjAuNzVlbTtiYWNrZ3JvdW5kOiNmZWY5YzM7Y29sb3I6Izg1NGQwZTtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjFweCA2cHg7bWFyZ2luLWxlZnQ6NnB4O3doaXRlLXNwYWNlOm5vd3JhcDtcIj5cdUQ4M0NcdURGRjdcdUZFMEYgUmVjbGFzc2lmaWVkPC9zcGFuPicsXG59O1xuXG5jb25zdCBSRUNfQ09ORklHID0ge1xuICBwcm9tb3RlOiB7IGxhYmVsOiAnUHJvbW90ZScsICAgICAgaWNvbjogJ1x1MkIwNlx1RkUwRicsICBjb2xvcjogJyMxNjY1MzQnLCBiZzogJyNmMGZkZjQnLCBzb3J0OiAwIH0sXG4gIHNraXA6ICAgIHsgbGFiZWw6ICdTa2lwJywgICAgICAgICBpY29uOiAnXHUyM0VEXHVGRTBGJywgIGNvbG9yOiAnIzlhMzQxMicsIGJnOiAnI2ZmZjdlZCcsIHNvcnQ6IDEgfSxcbiAgbnVsbDogICAgeyBsYWJlbDogJ1VuYW5hbHl6ZWQnLCAgIGljb246ICdcdTI3NTMnLCAgY29sb3I6ICcjNGI1NTYzJywgYmc6ICcjZjlmYWZiJywgc29ydDogMiB9LFxufTtcblxuY29uc3QgQ09ORl9DT05GSUcgPSB7XG4gIGhpZ2g6ICAgeyBsYWJlbDogJ0hpZ2gnLCAgIGNvbG9yOiAnIzE1ODAzZCcsIGJnOiAnI2YwZmRmNCcsIHNvcnQ6IDAgfSxcbiAgbWVkaXVtOiB7IGxhYmVsOiAnTWVkaXVtJywgY29sb3I6ICcjYjQ1MzA5JywgYmc6ICcjZmZmYmViJywgc29ydDogMSB9LFxuICBsb3c6ICAgIHsgbGFiZWw6ICdMb3cnLCAgICBjb2xvcjogJyNiOTFjMWMnLCBiZzogJyNmZWYyZjInLCBzb3J0OiAyIH0sXG4gIG51bGw6ICAgeyBsYWJlbDogJycsICAgICAgIGNvbG9yOiAnIzZiNzI4MCcsIGJnOiAnI2Y5ZmFmYicsIHNvcnQ6IDMgfSxcbn07XG5cbi8vIFx1MjUwMFx1MjUwMCBHcm91cGluZyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gZ2V0RGlzcGxheVR5cGUoY2FuZGlkYXRlKSB7XG4gIHJldHVybiBIQVJWRVNUX1RZUEVfQ09ORklHW2NhbmRpZGF0ZS50eXBlXT8uZGlzcGxheVR5cGUgPz8gY2FuZGlkYXRlLnR5cGU7XG59XG5cbi8qKlxuICogR3JvdXAgZW5yaWNoZWQgY2FuZGlkYXRlcyBpbnRvIGEgbmVzdGVkIHN0cnVjdHVyZTpcbiAqICAgeyBkaXNwbGF5VHlwZSBcdTIxOTIgeyByZWMgXHUyMTkyIHsgY29uZmlkZW5jZSBcdTIxOTIgW2NhbmRpZGF0ZSwgXHUyMDI2XSB9IH0gfVxuICovXG5mdW5jdGlvbiBncm91cENhbmRpZGF0ZXMoZW5yaWNoZWQpIHtcbiAgY29uc3QgZ3JvdXBzID0ge307XG4gIGZvciAoY29uc3QgYyBvZiBlbnJpY2hlZCkge1xuICAgIGNvbnN0IGR0ICAgPSBnZXREaXNwbGF5VHlwZShjKTtcbiAgICBjb25zdCByZWMgID0gYy5yZWNvbW1lbmRhdGlvbiA/PyAnbnVsbCc7XG4gICAgY29uc3QgY29uZiA9IGMuY29uZmlkZW5jZSAgICAgPz8gJ251bGwnO1xuICAgIGlmICghZ3JvdXBzW2R0XSkgICAgICAgICAgICAgICAgZ3JvdXBzW2R0XSAgICAgICA9IHt9O1xuICAgIGlmICghZ3JvdXBzW2R0XVtyZWNdKSAgICAgICAgICAgZ3JvdXBzW2R0XVtyZWNdICA9IHt9O1xuICAgIGlmICghZ3JvdXBzW2R0XVtyZWNdW2NvbmZdKSAgICAgZ3JvdXBzW2R0XVtyZWNdW2NvbmZdID0gW107XG4gICAgZ3JvdXBzW2R0XVtyZWNdW2NvbmZdLnB1c2goYyk7XG4gIH1cbiAgcmV0dXJuIGdyb3Vwcztcbn1cblxuZnVuY3Rpb24gc29ydGVkS2V5cyhvYmosIGNvbmZpZ01hcCkge1xuICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5zb3J0KChhLCBiKSA9PiB7XG4gICAgY29uc3Qgc2EgPSBjb25maWdNYXBbYV0/LnNvcnQgPz8gOTk7XG4gICAgY29uc3Qgc2IgPSBjb25maWdNYXBbYl0/LnNvcnQgPz8gOTk7XG4gICAgcmV0dXJuIHNhIC0gc2I7XG4gIH0pO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgUHJlLWNoZWNrIGxvZ2ljIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuLy8gQWxsIGhhcnZlc3QgaXRlbXMgc3RhcnQgdW5jaGVja2VkIFx1MjAxNCBtYXN0ZXIgQ1YgdXBkYXRlcyBhcmUgb3B0LWluIG9ubHkgKFVTLUExMSkuXG4vLyBHcm91cHMgd2l0aCBoaWdoL21lZGl1bSBjb25maWRlbmNlIHByb21vdGlvbnMgYXJlIGV4cGFuZGVkIHNvIGNhbmRpZGF0ZXMgYXJlXG4vLyBwcm9taW5lbnQsIGJ1dCBubyBjaGVja2JveCBpcyBwcmUtc2VsZWN0ZWQuXG5cbmZ1bmN0aW9uIHNob3VsZFByZUNoZWNrKF9jYW5kaWRhdGUpIHtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgQ29sbGFwc2UgZGVmYXVsdCBsb2dpYyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gdHlwZUdyb3VwRXhwYW5kZWQoZHRDYW5kaWRhdGVzKSB7XG4gIHJldHVybiBkdENhbmRpZGF0ZXMuc29tZShjID0+IGMucmVjb21tZW5kYXRpb24gPT09ICdwcm9tb3RlJyAmJlxuICAgIChjLmNvbmZpZGVuY2UgPT09ICdoaWdoJyB8fCBjLmNvbmZpZGVuY2UgPT09ICdtZWRpdW0nKSk7XG59XG5cbmZ1bmN0aW9uIHJlY0dyb3VwRXhwYW5kZWQocmVjLCBjb25mQ2FuZGlkYXRlcykge1xuICBpZiAocmVjICE9PSAncHJvbW90ZScpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGNvbmZDYW5kaWRhdGVzLnNvbWUoYyA9PiBjLmNvbmZpZGVuY2UgPT09ICdoaWdoJyB8fCBjLmNvbmZpZGVuY2UgPT09ICdtZWRpdW0nKTtcbn1cblxuZnVuY3Rpb24gY29uZlRpZXJFeHBhbmRlZChyZWMsIGNvbmYpIHtcbiAgcmV0dXJuIHJlYyA9PT0gJ3Byb21vdGUnICYmIChjb25mID09PSAnaGlnaCcgfHwgY29uZiA9PT0gJ21lZGl1bScpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgUmVuZGVyaW5nIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiByZW5kZXJDb25maWRlbmNlQmFkZ2UoY29uZikge1xuICBjb25zdCBjZmcgPSBDT05GX0NPTkZJR1tjb25mXSA/PyBDT05GX0NPTkZJR1snbnVsbCddO1xuICBpZiAoIWNmZy5sYWJlbCkgcmV0dXJuICcnO1xuICByZXR1cm4gYDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjAuN2VtO2ZvbnQtd2VpZ2h0OjYwMDtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjFweCA2cHg7YmFja2dyb3VuZDoke2NmZy5iZ307Y29sb3I6JHtjZmcuY29sb3J9O2JvcmRlcjoxcHggc29saWQgJHtjZmcuY29sb3J9MzA7d2hpdGUtc3BhY2U6bm93cmFwO1wiPiR7ZXNjKGNmZy5sYWJlbCl9PC9zcGFuPmA7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclJlY29tbWVuZGF0aW9uQmFkZ2UocmVjKSB7XG4gIGNvbnN0IGNmZyA9IFJFQ19DT05GSUdbcmVjXSA/PyBSRUNfQ09ORklHWydudWxsJ107XG4gIHJldHVybiBgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC43NWVtO2ZvbnQtd2VpZ2h0OjYwMDtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjJweCA4cHg7YmFja2dyb3VuZDoke2NmZy5iZ307Y29sb3I6JHtjZmcuY29sb3J9O3doaXRlLXNwYWNlOm5vd3JhcDtcIj4ke2NmZy5pY29ufSAke2VzYyhjZmcubGFiZWwpfTwvc3Bhbj5gO1xufVxuXG5mdW5jdGlvbiByZW5kZXJDYW5kaWRhdGVSb3coYywgaWR4KSB7XG4gIGNvbnN0IHR5cGVDZmcgICA9IEhBUlZFU1RfVFlQRV9DT05GSUdbYy50eXBlXSA/PyB7fTtcbiAgY29uc3QgcmVjQmFkZ2UgID0gYy5yZWNvbW1lbmRhdGlvbiA/IHJlbmRlclJlY29tbWVuZGF0aW9uQmFkZ2UoYy5yZWNvbW1lbmRhdGlvbikgOiAnJztcbiAgY29uc3QgY29uZkJhZGdlID0gYy5jb25maWRlbmNlID8gcmVuZGVyQ29uZmlkZW5jZUJhZGdlKGMuY29uZmlkZW5jZSkgOiAnJztcbiAgY29uc3QgaGFzUmVhc29uaW5nID0gYy5hbmFseXNpc0F2YWlsYWJsZSAmJiBjLnJlYXNvbmluZztcblxuICByZXR1cm4gcmVuZGVyUHJvcG9zYWxSb3coe1xuICAgIGlkOiAgICAgICAgICAgICAgYy5pZCxcbiAgICB0eXBlTGFiZWw6ICAgICAgIHR5cGVDZmcubGFiZWwgPz8gYy50eXBlLFxuICAgIHNvdXJjZUJhZGdlSHRtbDogSEFSVkVTVF9TT1VSQ0VfQkFER0VbYy50eXBlXSA/PyAnJyxcbiAgICBsYWJlbDogICAgICAgICAgIGMubGFiZWwsXG4gICAgb3JpZ2luYWw6ICAgICAgICBjLm9yaWdpbmFsLFxuICAgIHByb3Bvc2VkOiAgICAgICAgYy5wcm9wb3NlZCxcbiAgICBkZXRhaWxUZXh0OiAgICAgIGhhc1JlYXNvbmluZyA/IGMucmVhc29uaW5nIDogbnVsbCxcbiAgICBiYWRnZXNIdG1sOiAgICAgICBgJHtyZWNCYWRnZX0ke2NvbmZCYWRnZX1gLFxuICAgIGNoZWNrZWQ6ICAgICAgICAgc2hvdWxkUHJlQ2hlY2soYyksXG4gIH0sIHtcbiAgICBpZFByZWZpeDogICAgICAgICAnaGFydmVzdCcsXG4gICAgY2hlY2tib3hEYXRhQXR0cjogJ2hhcnZlc3QtaWQnLFxuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVuZGVyQ29uZmlkZW5jZVRpZXIocmVjLCBjb25mLCBjYW5kaWRhdGVzKSB7XG4gIGNvbnN0IGNmZyAgICAgID0gQ09ORl9DT05GSUdbY29uZl0gPz8gQ09ORl9DT05GSUdbJ251bGwnXTtcbiAgY29uc3QgZXhwYW5kZWQgPSBjb25mVGllckV4cGFuZGVkKHJlYywgY29uZik7XG4gIGNvbnN0IHRpZXJJZCAgID0gYGhhcnZlc3QtY29uZi0ke3JlY30tJHtjb25mfS0ke0RhdGUubm93KCl9YDtcbiAgY29uc3QgY291bnQgICAgPSBjYW5kaWRhdGVzLmxlbmd0aDtcblxuICBpZiAoIWNmZy5sYWJlbCkge1xuICAgIC8vIE5vLWFuYWx5c2lzIHRpZXIgXHUyMDE0IHJlbmRlciByb3dzIGRpcmVjdGx5IHdpdGhvdXQgYSBzdWItaGVhZGVyXG4gICAgcmV0dXJuIGNhbmRpZGF0ZXMubWFwKChjLCBpKSA9PiByZW5kZXJDYW5kaWRhdGVSb3coYywgaSkpLmpvaW4oJycpO1xuICB9XG5cbiAgY29uc3QgdG9nZ2xlSWNvbiA9IGV4cGFuZGVkID8gJ1x1MjVCRScgOiAnXHUyNUI4JztcbiAgY29uc3QgaGVhZGVySHRtbCA9IGBcbiAgICA8dHIgY2xhc3M9XCJoYXJ2ZXN0LWNvbmYtaGVhZGVyXCIgc3R5bGU9XCJjdXJzb3I6cG9pbnRlcjtiYWNrZ3JvdW5kOiNmYWZhZmE7XCIgb25jbGljaz1cInRvZ2dsZUhhcnZlc3RTZWN0aW9uKCcke3RpZXJJZH0nKVwiPlxuICAgICAgPHRkIGNvbHNwYW49XCIyXCIgc3R5bGU9XCJwYWRkaW5nOjZweCAxMnB4IDZweCAzNnB4O2ZvbnQtc2l6ZTowLjhlbTtjb2xvcjoke2NmZy5jb2xvcn07Zm9udC13ZWlnaHQ6NjAwO1wiPlxuICAgICAgICA8c3BhbiBpZD1cIiR7dGllcklkfS1pY29uXCI+JHt0b2dnbGVJY29ufTwvc3Bhbj5cbiAgICAgICAgJHtlc2MoY2ZnLmxhYmVsKX0gY29uZmlkZW5jZVxuICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07Zm9udC13ZWlnaHQ6NDAwO2NvbG9yOiM5Y2EzYWY7bWFyZ2luLWxlZnQ6NnB4O1wiPigke2NvdW50fSk8L3NwYW4+XG4gICAgICA8L3RkPlxuICAgIDwvdHI+XG4gICAgPHRib2R5IGlkPVwiJHt0aWVySWR9XCIgc3R5bGU9XCIke2V4cGFuZGVkID8gJycgOiAnZGlzcGxheTpub25lOyd9XCI+XG4gICAgICAke2NhbmRpZGF0ZXMubWFwKChjLCBpKSA9PiByZW5kZXJDYW5kaWRhdGVSb3coYywgaSkpLmpvaW4oJycpfVxuICAgIDwvdGJvZHk+YDtcbiAgcmV0dXJuIGhlYWRlckh0bWw7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclJlY0dyb3VwKGR0LCByZWMsIGNvbmZNYXApIHtcbiAgY29uc3QgY2ZnID0gUkVDX0NPTkZJR1tyZWNdID8/IFJFQ19DT05GSUdbJ251bGwnXTtcbiAgY29uc3QgYWxsQ2FuZHMgPSBPYmplY3QudmFsdWVzKGNvbmZNYXApLmZsYXQoKTtcbiAgY29uc3QgZXhwYW5kZWQgPSByZWNHcm91cEV4cGFuZGVkKHJlYywgYWxsQ2FuZHMpO1xuICBjb25zdCBncm91cElkICA9IGBoYXJ2ZXN0LXJlYy0ke2R0fS0ke3JlY30tJHtEYXRlLm5vdygpfWA7XG4gIGNvbnN0IGNvdW50ICAgID0gYWxsQ2FuZHMubGVuZ3RoO1xuXG4gIGNvbnN0IGNvbmZzICAgID0gc29ydGVkS2V5cyhjb25mTWFwLCBDT05GX0NPTkZJRyk7XG4gIGNvbnN0IGhhc011bHRpcGxlQ29uZnMgPSBjb25mcy5sZW5ndGggPiAxIHx8IChjb25mcy5sZW5ndGggPT09IDEgJiYgQ09ORl9DT05GSUdbY29uZnNbMF1dPy5sYWJlbCk7XG5cbiAgY29uc3QgaW5uZXJSb3dzID0gY29uZnMubWFwKGNvbmYgPT4gcmVuZGVyQ29uZmlkZW5jZVRpZXIocmVjLCBjb25mLCBjb25mTWFwW2NvbmZdKSkuam9pbignJyk7XG5cbiAgY29uc3QgdG9nZ2xlSWNvbiA9IGV4cGFuZGVkID8gJ1x1MjVCRScgOiAnXHUyNUI4JztcbiAgcmV0dXJuIGBcbiAgICA8dHIgY2xhc3M9XCJoYXJ2ZXN0LXJlYy1oZWFkZXJcIiBzdHlsZT1cImN1cnNvcjpwb2ludGVyO2JhY2tncm91bmQ6JHtjZmcuYmd9O1wiIG9uY2xpY2s9XCJ0b2dnbGVIYXJ2ZXN0U2VjdGlvbignJHtncm91cElkfScpXCI+XG4gICAgICA8dGQgY29sc3Bhbj1cIjJcIiBzdHlsZT1cInBhZGRpbmc6OHB4IDEycHggOHB4IDI0cHg7Zm9udC1zaXplOjAuODVlbTtjb2xvcjoke2NmZy5jb2xvcn07Zm9udC13ZWlnaHQ6NzAwO1wiPlxuICAgICAgICA8c3BhbiBpZD1cIiR7Z3JvdXBJZH0taWNvblwiPiR7dG9nZ2xlSWNvbn08L3NwYW4+XG4gICAgICAgICR7Y2ZnLmljb259ICR7ZXNjKGNmZy5sYWJlbCl9XG4gICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtmb250LXdlaWdodDo0MDA7Y29sb3I6IzljYTNhZjttYXJnaW4tbGVmdDo2cHg7XCI+KCR7Y291bnR9KTwvc3Bhbj5cbiAgICAgIDwvdGQ+XG4gICAgPC90cj5cbiAgICA8dGJvZHkgaWQ9XCIke2dyb3VwSWR9XCIgc3R5bGU9XCIke2V4cGFuZGVkID8gJycgOiAnZGlzcGxheTpub25lOyd9XCI+XG4gICAgICAke2hhc011bHRpcGxlQ29uZnMgPyBpbm5lclJvd3MgOiBhbGxDYW5kcy5tYXAoKGMsIGkpID0+IHJlbmRlckNhbmRpZGF0ZVJvdyhjLCBpKSkuam9pbignJyl9XG4gICAgPC90Ym9keT5gO1xufVxuXG5mdW5jdGlvbiByZW5kZXJUeXBlR3JvdXAoZHQsIHJlY01hcCwgYWxsRHRDYW5kaWRhdGVzKSB7XG4gIGNvbnN0IGNmZyAgICAgID0gSEFSVkVTVF9UWVBFX0NPTkZJR1tkdF0gPz8geyBsYWJlbDogZHQsIGljb246ICdcdUQ4M0RcdURDQ0InLCBzb3J0OiA5OSB9O1xuICBjb25zdCBleHBhbmRlZCA9IHR5cGVHcm91cEV4cGFuZGVkKGFsbER0Q2FuZGlkYXRlcyk7XG4gIGNvbnN0IGdyb3VwSWQgID0gYGhhcnZlc3QtdHlwZS0ke2R0fS0ke0RhdGUubm93KCl9YDtcbiAgY29uc3QgY291bnQgICAgPSBhbGxEdENhbmRpZGF0ZXMubGVuZ3RoO1xuICBjb25zdCBkZXNjICAgICA9IEhBUlZFU1RfVFlQRV9ERVNDUklQVElPTlNbZHRdID8/ICcnO1xuXG4gIGNvbnN0IHJlY3MgICAgICAgID0gc29ydGVkS2V5cyhyZWNNYXAsIFJFQ19DT05GSUcpO1xuICBjb25zdCBoYXNNdWx0aXBsZVJlY3MgPSByZWNzLmxlbmd0aCA+IDE7XG5cbiAgY29uc3QgaW5uZXJIdG1sID0gcmVjcy5tYXAocmVjID0+IHtcbiAgICBpZiAoIWhhc011bHRpcGxlUmVjcykge1xuICAgICAgLy8gU3VwcHJlc3MgdGhlIHJlYy1sZXZlbCBoZWFkZXI7IHJlbmRlciBjb25maWRlbmNlIHRpZXJzIGRpcmVjdGx5XG4gICAgICBjb25zdCBjb25mTWFwICA9IHJlY01hcFtyZWNdO1xuICAgICAgY29uc3QgY29uZnMgICAgPSBzb3J0ZWRLZXlzKGNvbmZNYXAsIENPTkZfQ09ORklHKTtcbiAgICAgIGNvbnN0IGhhc0NvbmZzID0gY29uZnMubGVuZ3RoID4gMSB8fCAoY29uZnMubGVuZ3RoID09PSAxICYmIENPTkZfQ09ORklHW2NvbmZzWzBdXT8ubGFiZWwpO1xuICAgICAgcmV0dXJuIGhhc0NvbmZzXG4gICAgICAgID8gY29uZnMubWFwKGNvbmYgPT4gcmVuZGVyQ29uZmlkZW5jZVRpZXIocmVjLCBjb25mLCBjb25mTWFwW2NvbmZdKSkuam9pbignJylcbiAgICAgICAgOiBjb25mTWFwW2NvbmZzWzBdXS5tYXAoKGMsIGkpID0+IHJlbmRlckNhbmRpZGF0ZVJvdyhjLCBpKSkuam9pbignJyk7XG4gICAgfVxuICAgIHJldHVybiByZW5kZXJSZWNHcm91cChkdCwgcmVjLCByZWNNYXBbcmVjXSk7XG4gIH0pLmpvaW4oJycpO1xuXG4gIGNvbnN0IHRvZ2dsZUljb24gPSBleHBhbmRlZCA/ICdcdTI1QkUnIDogJ1x1MjVCOCc7XG4gIHJldHVybiBgXG4gICAgPGRpdiBjbGFzcz1cImhhcnZlc3QtdHlwZS1zZWN0aW9uXCIgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjI0cHg7Ym9yZGVyOjFweCBzb2xpZCAjZTJlOGYwO2JvcmRlci1yYWRpdXM6OHB4O292ZXJmbG93OmhpZGRlbjtcIj5cbiAgICAgIDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmOGZhZmM7cGFkZGluZzoxMnB4IDE2cHg7Y3Vyc29yOnBvaW50ZXI7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTBweDtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZTJlOGYwO1wiXG4gICAgICAgICAgIG9uY2xpY2s9XCJ0b2dnbGVIYXJ2ZXN0U2VjdGlvbignJHtncm91cElkfScpXCI+XG4gICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjEuMjVlbTtcIj4ke2NmZy5pY29ufTwvc3Bhbj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImZsZXg6MTtcIj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6NzAwO2NvbG9yOiMwZjE3MmE7Zm9udC1zaXplOjAuOTVlbTtcIj5cbiAgICAgICAgICAgIDxzcGFuIGlkPVwiJHtncm91cElkfS1pY29uXCI+JHt0b2dnbGVJY29ufTwvc3Bhbj5cbiAgICAgICAgICAgICR7ZXNjKGNmZy5sYWJlbCl9XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjgyZW07Zm9udC13ZWlnaHQ6NDAwO2NvbG9yOiM5NGEzYjg7bWFyZ2luLWxlZnQ6NnB4O1wiPigke2NvdW50fSk8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgJHtkZXNjID8gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC43OGVtO2NvbG9yOiM2NDc0OGI7bWFyZ2luLXRvcDoycHg7XCI+JHtlc2MoZGVzYyl9PC9kaXY+YCA6ICcnfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBpZD1cIiR7Z3JvdXBJZH1cIiBzdHlsZT1cIiR7ZXhwYW5kZWQgPyAnJyA6ICdkaXNwbGF5Om5vbmU7J31cIj5cbiAgICAgICAgPHRhYmxlIHN0eWxlPVwid2lkdGg6MTAwJTtib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7XCI+XG4gICAgICAgICAgJHtpbm5lckh0bWx9XG4gICAgICAgIDwvdGFibGU+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xufVxuXG5mdW5jdGlvbiByZW5kZXJIYXJ2ZXN0VGFiSHRtbChlbnJpY2hlZCwgYW5hbHlzaXNPaywgYW5hbHlzaXNFcnJvcikge1xuICBjb25zdCBncm91cHMgPSBncm91cENhbmRpZGF0ZXMoZW5yaWNoZWQpO1xuICBjb25zdCBkdEtleXMgPSBzb3J0ZWRLZXlzKGdyb3VwcywgT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKEhBUlZFU1RfVFlQRV9DT05GSUcpLm1hcCgoW2ssIHZdKSA9PiBbdi5kaXNwbGF5VHlwZSwgdl0pXG4gICkpO1xuXG4gIGNvbnN0IHRvdGFsQ291bnQgPSBlbnJpY2hlZC5sZW5ndGg7XG5cbiAgY29uc3QgYW5hbHlzaXNXYXJuaW5nID0gIWFuYWx5c2lzT2tcbiAgICA/IGA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZmZmYmViO2JvcmRlcjoxcHggc29saWQgI2ZjZDM0ZDtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjEwcHggMTRweDttYXJnaW4tYm90dG9tOjE2cHg7Zm9udC1zaXplOjAuODdlbTtjb2xvcjojOTI0MDBlO1wiPlxuICAgICAgICBcdTI2QTBcdUZFMEYgTExNIGFuYWx5c2lzIHVuYXZhaWxhYmxlJHthbmFseXNpc0Vycm9yID8gYDogJHtlc2MoYW5hbHlzaXNFcnJvcil9YCA6ICcnfS4gQ2hlY2tib3hlcyBhcmUgdW5jaGVja2VkIFx1MjAxNCByZXZpZXcgbWFudWFsbHkuXG4gICAgICAgIDxidXR0b24gb25jbGljaz1cInJlZnJlc2hIYXJ2ZXN0QW5hbHlzaXMoKVwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6MTBweDtmb250LXNpemU6MC44NWVtO3BhZGRpbmc6MnB4IDEwcHg7Ym9yZGVyOjFweCBzb2xpZCAjZDk3NzA2O2JvcmRlci1yYWRpdXM6NHB4O2JhY2tncm91bmQ6d2hpdGU7Y29sb3I6I2I0NTMwOTtjdXJzb3I6cG9pbnRlcjtcIj5SZXRyeSBhbmFseXNpczwvYnV0dG9uPlxuICAgICAgPC9kaXY+YFxuICAgIDogJyc7XG5cbiAgY29uc3Qgc2VjdGlvbnNIdG1sID0gZHRLZXlzLm1hcChkdCA9PiB7XG4gICAgY29uc3QgcmVjTWFwICAgICAgPSBncm91cHNbZHRdO1xuICAgIGNvbnN0IGFsbER0Q2FuZHMgID0gT2JqZWN0LnZhbHVlcyhyZWNNYXApLmZsYXRNYXAoY29uZk1hcCA9PiBPYmplY3QudmFsdWVzKGNvbmZNYXApLmZsYXQoKSk7XG4gICAgcmV0dXJuIHJlbmRlclR5cGVHcm91cChkdCwgcmVjTWFwLCBhbGxEdENhbmRzKTtcbiAgfSkuam9pbignJyk7XG5cbiAgcmV0dXJuIGBcbiAgICA8aDE+XHVEODNDXHVERjNFIEhhcnZlc3QgSW1wcm92ZW1lbnRzPC9oMT5cbiAgICA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7bWFyZ2luLWJvdHRvbTo4cHg7XCI+XG4gICAgICBSZXZpZXcgTExNLXNjb3JlZCBjYW5kaWRhdGVzIGZvciBwcm9tb3Rpb24gdG8geW91ciBtYXN0ZXIgQ1YuXG4gICAgICBDaGVjayB0aGUgaXRlbXMgeW91IHdhbnQgdG8gYXBwbHkgKCR7dG90YWxDb3VudH0gY2FuZGlkYXRlJHt0b3RhbENvdW50ID09PSAxID8gJycgOiAncyd9IGZvdW5kKS5cbiAgICA8L3A+XG4gICAgJHthbmFseXNpc1dhcm5pbmd9XG4gICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6MTBweDthbGlnbi1pdGVtczpjZW50ZXI7bWFyZ2luLWJvdHRvbToyMHB4O2ZsZXgtd3JhcDp3cmFwO1wiPlxuICAgICAgPGJ1dHRvbiBpZD1cImhhcnZlc3QtYXBwbHktYnRuXCIgb25jbGljaz1cImFwcGx5SGFydmVzdFNlbGVjdGlvbnMoKVwiXG4gICAgICAgIHN0eWxlPVwicGFkZGluZzoxMHB4IDI0cHg7Zm9udC1zaXplOjFlbTtmb250LXdlaWdodDo2MDA7Y3Vyc29yOnBvaW50ZXI7YmFja2dyb3VuZDojMTZhMzRhO2NvbG9yOndoaXRlO2JvcmRlcjpub25lO2JvcmRlci1yYWRpdXM6NnB4O1wiPlxuICAgICAgICBcdTI3MDUgQXBwbHkgU2VsZWN0ZWQgdG8gTWFzdGVyIENWXG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gb25jbGljaz1cInJlZnJlc2hIYXJ2ZXN0QW5hbHlzaXMoKVwiXG4gICAgICAgIHN0eWxlPVwicGFkZGluZzoxMHB4IDE4cHg7Zm9udC1zaXplOjAuOWVtO2N1cnNvcjpwb2ludGVyO2JhY2tncm91bmQ6d2hpdGU7Y29sb3I6IzQ3NTU2OTtib3JkZXI6MXB4IHNvbGlkICNjYmQ1ZTE7Ym9yZGVyLXJhZGl1czo2cHg7XCI+XG4gICAgICAgIFx1RDgzRFx1REQwNCBSZS1hbmFseXNlXG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtjb2xvcjojOTRhM2I4O1wiPlxuICAgICAgICAke3RvdGFsQ291bnR9IGNhbmRpZGF0ZSR7dG90YWxDb3VudCAhPT0gMSA/ICdzJyA6ICcnfVxuICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuICAgICR7c2VjdGlvbnNIdG1sfVxuICAgIDxkaXYgaWQ9XCJoYXJ2ZXN0LXJlc3VsdFwiIHN0eWxlPVwibWFyZ2luLXRvcDoyMHB4O1wiPjwvZGl2PmA7XG59XG5cbmZ1bmN0aW9uIHJlbmRlckVtcHR5U3RhdGVIdG1sKCkge1xuICByZXR1cm4gYFxuICAgIDxoMT5cdUQ4M0NcdURGM0UgSGFydmVzdCBJbXByb3ZlbWVudHM8L2gxPlxuICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtcIj5ObyBoYXJ2ZXN0IGNhbmRpZGF0ZXMgZm91bmQgZm9yIHRoaXMgc2Vzc2lvbi48L3A+XG4gICAgPHAgc3R5bGU9XCJjb2xvcjojOTRhM2I4O2ZvbnQtc2l6ZTowLjllbTtcIj5cbiAgICAgIENhbmRpZGF0ZXMgYXJlIGdlbmVyYXRlZCBmcm9tIGFwcHJvdmVkIHJld3JpdGVzLCBza2lsbHMgYWRkZWQgZHVyaW5nIHJldmlldyxcbiAgICAgIGFuZCBzdW1tYXJ5IHZhcmlhbnRzIGNyZWF0ZWQgZHVyaW5nIHRoZSBzZXNzaW9uLlxuICAgIDwvcD5gO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgQVBJIGNhbGxzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaENhbmRpZGF0ZXMoKSB7XG4gIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9oYXJ2ZXN0L2NhbmRpZGF0ZXMnKTtcbiAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gIHJldHVybiBkYXRhO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaEFuYWx5c2lzKGZvcmNlUmVmcmVzaCA9IGZhbHNlKSB7XG4gIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9oYXJ2ZXN0L2FuYWx5emUnLCB7XG4gICAgbWV0aG9kOiAgJ1BPU1QnLFxuICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgIGJvZHk6ICAgIEpTT04uc3RyaW5naWZ5KHsgZm9yY2VfcmVmcmVzaDogZm9yY2VSZWZyZXNoIH0pLFxuICB9KTtcbiAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gIHJldHVybiBkYXRhO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgVG9nZ2xlIGhlbHBlcnMgKGNhbGxlZCBieSBpbmxpbmUgb25jbGljaykgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIHRvZ2dsZUhhcnZlc3RTZWN0aW9uKGlkKSB7XG4gIGNvbnN0IGVsICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gIGNvbnN0IGljb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtpZH0taWNvbmApO1xuICBpZiAoIWVsKSByZXR1cm47XG4gIGNvbnN0IGhpZGRlbiA9IGVsLnN0eWxlLmRpc3BsYXkgPT09ICdub25lJztcbiAgZWwuc3R5bGUuZGlzcGxheSA9IGhpZGRlbiA/ICcnIDogJ25vbmUnO1xuICBpZiAoaWNvbikgaWNvbi50ZXh0Q29udGVudCA9IGhpZGRlbiA/ICdcdTI1QkUnIDogJ1x1MjVCOCc7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBNYWluIGVudHJ5IHBvaW50cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gcG9wdWxhdGVIYXJ2ZXN0VGFiKCkge1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgaWYgKCFjb250ZW50KSByZXR1cm47XG5cbiAgY29udGVudC5pbm5lckhUTUwgPSBgXG4gICAgPGgxPlx1RDgzQ1x1REYzRSBIYXJ2ZXN0IEltcHJvdmVtZW50czwvaDE+XG4gICAgPGRpdiBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO3BhZGRpbmc6NDBweDtcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJsb2FkaW5nLXNwaW5uZXJcIj48L2Rpdj5cbiAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDttYXJnaW4tdG9wOjEycHg7XCI+TG9hZGluZyBjYW5kaWRhdGVzIGFuZCBydW5uaW5nIExMTSBhbmFseXNpc1x1MjAyNjwvcD5cbiAgICA8L2Rpdj5gO1xuXG4gIGxldCBjYW5kaWRhdGVzID0gW107XG4gIGxldCBhbmFseXNpc09rID0gZmFsc2U7XG4gIGxldCBhbmFseXNlcyAgID0gW107XG4gIGxldCBhbmFseXNpc0Vycm9yID0gbnVsbDtcblxuICB0cnkge1xuICAgIGNvbnN0IGNhbmREYXRhID0gYXdhaXQgZmV0Y2hDYW5kaWRhdGVzKCk7XG4gICAgaWYgKCFjYW5kRGF0YS5vaykge1xuICAgICAgY29udGVudC5pbm5lckhUTUwgPSBgPGgxPlx1RDgzQ1x1REYzRSBIYXJ2ZXN0IEltcHJvdmVtZW50czwvaDE+PHAgY2xhc3M9XCJlcnJvci1tZXNzYWdlXCI+RmFpbGVkIHRvIGxvYWQgY2FuZGlkYXRlczogJHtlc2MoY2FuZERhdGEuZXJyb3IgfHwgJ1Vua25vd24gZXJyb3InKX08L3A+YDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY2FuZGlkYXRlcyA9IGNhbmREYXRhLmNhbmRpZGF0ZXMgfHwgW107XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy5lcnJvcigncG9wdWxhdGVIYXJ2ZXN0VGFiOiBjYW5kaWRhdGVzIGZldGNoIGZhaWxlZCcsIGVycik7XG4gICAgY29udGVudC5pbm5lckhUTUwgPSBgPGgxPlx1RDgzQ1x1REYzRSBIYXJ2ZXN0IEltcHJvdmVtZW50czwvaDE+PHAgY2xhc3M9XCJlcnJvci1tZXNzYWdlXCI+TmV0d29yayBlcnJvciBsb2FkaW5nIGNhbmRpZGF0ZXMuPC9wPmA7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGNhbmRpZGF0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgY29udGVudC5pbm5lckhUTUwgPSByZW5kZXJFbXB0eVN0YXRlSHRtbCgpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgYW5hbHlzaXNEYXRhID0gYXdhaXQgZmV0Y2hBbmFseXNpcyhmYWxzZSk7XG4gICAgaWYgKGFuYWx5c2lzRGF0YS5vaykge1xuICAgICAgYW5hbHlzaXNPayA9IHRydWU7XG4gICAgICBhbmFseXNlcyAgID0gYW5hbHlzaXNEYXRhLmFuYWx5c2VzIHx8IFtdO1xuICAgIH0gZWxzZSB7XG4gICAgICBhbmFseXNpc0Vycm9yID0gYW5hbHlzaXNEYXRhLmVycm9yIHx8ICdBbmFseXNpcyBmYWlsZWQnO1xuICAgICAgbG9nLndhcm4oJ3BvcHVsYXRlSGFydmVzdFRhYjogYW5hbHlzaXMgbm90IG9rJywgYW5hbHlzaXNFcnJvcik7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cuZXJyb3IoJ3BvcHVsYXRlSGFydmVzdFRhYjogYW5hbHlzaXMgZmV0Y2ggZmFpbGVkJywgZXJyKTtcbiAgICBhbmFseXNpc0Vycm9yID0gZXJyLm1lc3NhZ2U7XG4gIH1cblxuICBjb25zdCBhbmFseXNlc0J5SWQgPSBPYmplY3QuZnJvbUVudHJpZXMoYW5hbHlzZXMubWFwKGEgPT4gW2EuaWQsIGFdKSk7XG4gIGNvbnN0IGVucmljaGVkID0gY2FuZGlkYXRlcy5tYXAoYyA9PiAoe1xuICAgIC4uLmMsXG4gICAgcmVjb21tZW5kYXRpb246ICAgIGFuYWx5c2VzQnlJZFtjLmlkXT8ucmVjb21tZW5kYXRpb24gPz8gbnVsbCxcbiAgICBjb25maWRlbmNlOiAgICAgICAgYW5hbHlzZXNCeUlkW2MuaWRdPy5jb25maWRlbmNlICAgICA/PyBudWxsLFxuICAgIHJlYXNvbmluZzogICAgICAgICBhbmFseXNlc0J5SWRbYy5pZF0/LnJlYXNvbmluZyAgICAgID8/IG51bGwsXG4gICAgYW5hbHlzaXNBdmFpbGFibGU6IGFuYWx5c2lzT2ssXG4gIH0pKTtcblxuICBjb250ZW50LmlubmVySFRNTCA9IHJlbmRlckhhcnZlc3RUYWJIdG1sKGVucmljaGVkLCBhbmFseXNpc09rLCBhbmFseXNpc0Vycm9yKTtcbiAgYXR0YWNoUHJvcG9zYWxSb3dMaXN0ZW5lcnMoY29udGVudCwgJ2hhcnZlc3QnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVmcmVzaEhhcnZlc3RBbmFseXNpcygpIHtcbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIGlmICghY29udGVudCkgcmV0dXJuO1xuXG4gIC8vIFNob3cgc3Bpbm5lciBpbmxpbmUgd2hpbGUgcmUtZmV0Y2hpbmdcbiAgY29uc3QgYXBwbHlCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGFydmVzdC1hcHBseS1idG4nKTtcbiAgaWYgKGFwcGx5QnRuKSBhcHBseUJ0bi5kaXNhYmxlZCA9IHRydWU7XG5cbiAgLy8gUmUtcnVuIGZ1bGwgcG9wdWxhdGUgd2l0aCBmb3JjZSByZWZyZXNoXG4gIHRyeSB7XG4gICAgY29uc3QgY2FuZERhdGEgPSBhd2FpdCBmZXRjaENhbmRpZGF0ZXMoKTtcbiAgICBjb25zdCBjYW5kaWRhdGVzID0gKGNhbmREYXRhLm9rICYmIGNhbmREYXRhLmNhbmRpZGF0ZXMpID8gY2FuZERhdGEuY2FuZGlkYXRlcyA6IFtdO1xuXG4gICAgaWYgKGNhbmRpZGF0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb250ZW50LmlubmVySFRNTCA9IHJlbmRlckVtcHR5U3RhdGVIdG1sKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGFuYWx5c2lzT2sgPSBmYWxzZTtcbiAgICBsZXQgYW5hbHlzZXMgICA9IFtdO1xuICAgIGxldCBhbmFseXNpc0Vycm9yID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYW5hbHlzaXNEYXRhID0gYXdhaXQgZmV0Y2hBbmFseXNpcyh0cnVlKTtcbiAgICAgIGlmIChhbmFseXNpc0RhdGEub2spIHtcbiAgICAgICAgYW5hbHlzaXNPayA9IHRydWU7XG4gICAgICAgIGFuYWx5c2VzICAgPSBhbmFseXNpc0RhdGEuYW5hbHlzZXMgfHwgW107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhbmFseXNpc0Vycm9yID0gYW5hbHlzaXNEYXRhLmVycm9yIHx8ICdBbmFseXNpcyBmYWlsZWQnO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgYW5hbHlzaXNFcnJvciA9IGVyci5tZXNzYWdlO1xuICAgIH1cblxuICAgIGNvbnN0IGFuYWx5c2VzQnlJZCA9IE9iamVjdC5mcm9tRW50cmllcyhhbmFseXNlcy5tYXAoYSA9PiBbYS5pZCwgYV0pKTtcbiAgICBjb25zdCBlbnJpY2hlZCA9IGNhbmRpZGF0ZXMubWFwKGMgPT4gKHtcbiAgICAgIC4uLmMsXG4gICAgICByZWNvbW1lbmRhdGlvbjogICAgYW5hbHlzZXNCeUlkW2MuaWRdPy5yZWNvbW1lbmRhdGlvbiA/PyBudWxsLFxuICAgICAgY29uZmlkZW5jZTogICAgICAgIGFuYWx5c2VzQnlJZFtjLmlkXT8uY29uZmlkZW5jZSAgICAgPz8gbnVsbCxcbiAgICAgIHJlYXNvbmluZzogICAgICAgICBhbmFseXNlc0J5SWRbYy5pZF0/LnJlYXNvbmluZyAgICAgID8/IG51bGwsXG4gICAgICBhbmFseXNpc0F2YWlsYWJsZTogYW5hbHlzaXNPayxcbiAgICB9KSk7XG5cbiAgICBjb250ZW50LmlubmVySFRNTCA9IHJlbmRlckhhcnZlc3RUYWJIdG1sKGVucmljaGVkLCBhbmFseXNpc09rLCBhbmFseXNpc0Vycm9yKTtcbiAgICBhdHRhY2hQcm9wb3NhbFJvd0xpc3RlbmVycyhjb250ZW50LCAnaGFydmVzdCcpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cuZXJyb3IoJ3JlZnJlc2hIYXJ2ZXN0QW5hbHlzaXM6IGZhaWxlZCcsIGVycik7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gYXBwbHlIYXJ2ZXN0U2VsZWN0aW9ucygpIHtcbiAgY29uc3QgY2hlY2tib3hlcyAgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtkYXRhLWhhcnZlc3QtaWRdOmNoZWNrZWQnKTtcbiAgY29uc3Qgc2VsZWN0ZWRJZHMgPSBBcnJheS5mcm9tKGNoZWNrYm94ZXMpLm1hcChjYiA9PiBjYi5kYXRhc2V0LmhhcnZlc3RJZCk7XG4gIGNvbnN0IHJlc3VsdERpdiAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hhcnZlc3QtcmVzdWx0Jyk7XG4gIGNvbnN0IGFwcGx5QnRuICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hhcnZlc3QtYXBwbHktYnRuJyk7XG5cbiAgaWYgKHNlbGVjdGVkSWRzLmxlbmd0aCA9PT0gMCkge1xuICAgIGlmIChyZXN1bHREaXYpIHJlc3VsdERpdi5pbm5lckhUTUwgPSAnPHAgc3R5bGU9XCJjb2xvcjojYjQ1MzA5O1wiPk5vIGl0ZW1zIHNlbGVjdGVkLjwvcD4nO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0ICh0eXBlb2Ygc2hvd0NvbmZpcm1Nb2RhbCA9PT0gJ2Z1bmN0aW9uJ1xuICAgID8gc2hvd0NvbmZpcm1Nb2RhbChcbiAgICAgICAgYFByb21vdGUgJHtzZWxlY3RlZElkcy5sZW5ndGh9IGl0ZW0ke3NlbGVjdGVkSWRzLmxlbmd0aCAhPT0gMSA/ICdzJyA6ICcnfSB0byBtYXN0ZXIgQ1Y/YCxcbiAgICAgICAgJ1RoaXMgd2lsbCBwZXJtYW5lbnRseSB3cml0ZSBjaGFuZ2VzIHRvIHlvdXIgTWFzdGVyX0NWX0RhdGEuanNvbi4gQSBiYWNrdXAgd2lsbCBiZSBjcmVhdGVkIGZpcnN0LicsXG4gICAgICApXG4gICAgOiBQcm9taXNlLnJlc29sdmUod2luZG93LmNvbmZpcm0oYFByb21vdGUgJHtzZWxlY3RlZElkcy5sZW5ndGh9IGl0ZW0ocykgdG8gbWFzdGVyIENWP1xcblxcblRoaXMgd2lsbCBwZXJtYW5lbnRseSB3cml0ZSBjaGFuZ2VzIHRvIHlvdXIgTWFzdGVyX0NWX0RhdGEuanNvbi5gKSkpO1xuXG4gIGlmICghY29uZmlybWVkKSByZXR1cm47XG5cbiAgaWYgKGFwcGx5QnRuKSB7IGFwcGx5QnRuLmRpc2FibGVkID0gdHJ1ZTsgYXBwbHlCdG4udGV4dENvbnRlbnQgPSAnQXBwbHlpbmdcdTIwMjYnOyB9XG4gIGlmIChyZXN1bHREaXYpIHJlc3VsdERpdi5pbm5lckhUTUwgPSAnJztcblxuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9oYXJ2ZXN0L2FwcGx5Jywge1xuICAgICAgbWV0aG9kOiAgJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiAgICBKU09OLnN0cmluZ2lmeSh7IHNlbGVjdGVkX2lkczogc2VsZWN0ZWRJZHMgfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG5cbiAgICBpZiAoIWRhdGEub2spIHtcbiAgICAgIGlmIChyZXN1bHREaXYpIHJlc3VsdERpdi5pbm5lckhUTUwgPSBgPHAgY2xhc3M9XCJlcnJvci1tZXNzYWdlXCI+QXBwbHkgZmFpbGVkOiAke2VzYyhkYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yJyl9PC9wPmA7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgd3JpdHRlbkNvdW50ID0gZGF0YS53cml0dGVuX2NvdW50ID8/IDA7XG4gICAgY29uc3QgY29tbWl0SGFzaCAgID0gZGF0YS5jb21taXRfaGFzaCAgID8gYCAoY29tbWl0ICR7ZXNjKGRhdGEuY29tbWl0X2hhc2gpfSlgIDogJyc7XG4gICAgY29uc3QgYmFja3VwTm90ZSAgID0gZGF0YS5iYWNrdXBfcGF0aCAgID8gYCBCYWNrdXAgc2F2ZWQgdG8gPGNvZGU+JHtlc2MoZGF0YS5iYWNrdXBfcGF0aCl9PC9jb2RlPi5gIDogJyc7XG4gICAgY29uc3QgZ2l0V2FybmluZyAgID0gZGF0YS5naXRfZXJyb3JcbiAgICAgID8gYDxwIHN0eWxlPVwiY29sb3I6I2I0NTMwOTtmb250LXNpemU6MC44N2VtO1wiPlx1MjZBMFx1RkUwRiBHaXQgY29tbWl0IHNraXBwZWQ6ICR7ZXNjKGRhdGEuZ2l0X2Vycm9yPy5tZXNzYWdlIHx8IGRhdGEuZ2l0X2Vycm9yKX08L3A+YFxuICAgICAgOiAnJztcblxuICAgIGlmIChyZXN1bHREaXYpIHtcbiAgICAgIHJlc3VsdERpdi5pbm5lckhUTUwgPSBgXG4gICAgICAgIDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmMGZkZjQ7Ym9yZGVyOjFweCBzb2xpZCAjODZlZmFjO2JvcmRlci1yYWRpdXM6NnB4O3BhZGRpbmc6MTJweCAxNnB4O1wiPlxuICAgICAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzE2NjUzNDtmb250LXdlaWdodDo2MDA7bWFyZ2luOjAgMCA0cHg7XCI+XG4gICAgICAgICAgICBcdTI3MDUgJHt3cml0dGVuQ291bnR9IGl0ZW0ke3dyaXR0ZW5Db3VudCAhPT0gMSA/ICdzJyA6ICcnfSB3cml0dGVuIHRvIG1hc3RlciBDViR7Y29tbWl0SGFzaH0uXG4gICAgICAgICAgPC9wPlxuICAgICAgICAgICR7YmFja3VwTm90ZSA/IGA8cCBzdHlsZT1cImZvbnQtc2l6ZTowLjgyZW07Y29sb3I6IzZiNzI4MDttYXJnaW46NHB4IDAgMDtcIj4ke2JhY2t1cE5vdGV9PC9wPmAgOiAnJ31cbiAgICAgICAgICAke2dpdFdhcm5pbmd9XG4gICAgICAgIDwvZGl2PmA7XG4gICAgfVxuXG4gICAgLy8gRGlzYWJsZSBjaGVja2JveGVzIGZvciBhcHBsaWVkIGl0ZW1zXG4gICAgZm9yIChjb25zdCBpZCBvZiBzZWxlY3RlZElkcykge1xuICAgICAgY29uc3QgY2IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgaGFydmVzdC1jaGstJHtpZH1gKTtcbiAgICAgIGlmIChjYikgeyBjYi5kaXNhYmxlZCA9IHRydWU7IGNiLmNoZWNrZWQgPSBmYWxzZTsgfVxuICAgICAgY29uc3Qgcm93ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYGhhcnZlc3Qtcm93LSR7aWR9YCk7XG4gICAgICBpZiAocm93KSByb3cuc3R5bGUub3BhY2l0eSA9ICcwLjQ1JztcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy5lcnJvcignYXBwbHlIYXJ2ZXN0U2VsZWN0aW9uczogZmFpbGVkJywgZXJyKTtcbiAgICBpZiAocmVzdWx0RGl2KSByZXN1bHREaXYuaW5uZXJIVE1MID0gYDxwIGNsYXNzPVwiZXJyb3ItbWVzc2FnZVwiPk5ldHdvcmsgZXJyb3I6ICR7ZXNjKGVyci5tZXNzYWdlKX08L3A+YDtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoYXBwbHlCdG4pIHsgYXBwbHlCdG4uZGlzYWJsZWQgPSBmYWxzZTsgYXBwbHlCdG4udGV4dENvbnRlbnQgPSAnXHUyNzA1IEFwcGx5IFNlbGVjdGVkIHRvIE1hc3RlciBDVic7IH1cbiAgfVxufVxuXG5leHBvcnQgeyBwb3B1bGF0ZUhhcnZlc3RUYWIsIGFwcGx5SGFydmVzdFNlbGVjdGlvbnMsIHJlZnJlc2hIYXJ2ZXN0QW5hbHlzaXMsIHRvZ2dsZUhhcnZlc3RTZWN0aW9uIH07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9lYXJseS1wcmV2aWV3LXBhbmVsLmpzXG4gKiBHQVAtMTYgUGFydCBCOiBhIHBlcnNpc3RlbnQsIGNvbGxhcHNpYmxlIENWIHByZXZpZXcgc2hvd24gZHVyaW5nIHRoZVxuICogY3VzdG9taXphdGlvbi9yZXdyaXRlL3NwZWxsLWNoZWNrIHBpcGVsaW5lLCBzbyB0aGUgdXNlciBzZWVzIGEgcmVuZGVyZWRcbiAqIENWIHdlbGwgYmVmb3JlIExheW91dCBSZXZpZXcuXG4gKlxuICogU0FGRVRZIEJPVU5EQVJZIChkbyBub3Qgd2Vha2VuIHdpdGhvdXQgcmUtcmVhZGluZyB0aGUgR0FQLTE2IHBsYW4nc1xuICogY29tbWl0dGVlLXJldmlldyBzZWN0aW9uIG9uIHRoaXMgbW9kdWxlKTogdGhpcyBmaWxlIG11c3Qgb25seSBldmVyIGNhbGxcbiAqIHRoZSByZWFkLW9ubHkgR0VUIC9hcGkvbGF5b3V0LWh0bWwgZW5kcG9pbnQuIEl0IG11c3QgbmV2ZXIgY2FsbFxuICogUE9TVCAvYXBpL2N2L2dlbmVyYXRlLXByZXZpZXcgb3IgUE9TVCAvYXBpL2N2L3NtYXJ0LWluc3RydWN0aW9uIFx1MjAxNCBib3RoXG4gKiBtdXRhdGUgZ2VuZXJhdGlvbl9zdGF0ZSAoc3RhdGVNYW5hZ2VyLm1hcmtQcmV2aWV3R2VuZXJhdGVkKCkgZm9yY2libHlcbiAqIGFkdmFuY2VzIHRoZSB3b3JrZmxvdyBwaGFzZSB0byBMQVlPVVRfUkVWSUVXKSwgd2hpY2ggd291bGQgc2lsZW50bHlcbiAqIGZhc3QtZm9yd2FyZCB0aGUgdXNlcidzIHN0YWdlIHdoaWxlIHRoZXkncmUgc3RpbGwgb24gYW4gZWFybGllciB0YWIuXG4gKiBUaGUgcmVuZGVyaW5nIHN0ZXAgaXMgZGVsZWdhdGVkIHRvIHByZXZpZXctcmVuZGVyLmpzLCBhIHNoYXJlZCB1dGlsIHdpdGhcbiAqIG5vIHJlZmVyZW5jZSB0byBhcGlDYWxsL3N0YXRlTWFuYWdlciBhdCBhbGwsIHNwZWNpZmljYWxseSBzbyBhIGZ1dHVyZVxuICogZWRpdCB0byB0aGUgbXV0YXRpbmcgbGF5b3V0LXJldmlldyBmbG93IGNhbm5vdCBwdWxsIHRoZSBtdXRhdGluZyBwYXRoIGluXG4gKiBoZXJlIHZpYSBhIHNoYXJlZCBpbXBvcnQuXG4gKi9cblxuaW1wb3J0IHsgYXBpQ2FsbCwgU3RvcmFnZUtleXMgfSBmcm9tICcuL2FwaS1jbGllbnQuanMnO1xuaW1wb3J0IHsgc3RhdGVNYW5hZ2VyIH0gZnJvbSAnLi9zdGF0ZS1tYW5hZ2VyLmpzJztcbmltcG9ydCB7IHJlbmRlckh0bWxJbnRvSWZyYW1lIH0gZnJvbSAnLi9wcmV2aWV3LXJlbmRlci5qcyc7XG5cbmNvbnN0IEVBUkxZX1BSRVZJRVdfVEFCUyA9IG5ldyBTZXQoW1xuICAnZXhwLXJldmlldycsICdhY2gtZWRpdG9yJywgJ3NraWxscy1yZXZpZXcnLCAnYWNoaWV2ZW1lbnRzLXJldmlldycsXG4gICd0YWdsaW5lLXJldmlldycsICdzdW1tYXJ5LXJldmlldycsICdwdWJsaWNhdGlvbnMtcmV2aWV3JywgLy8gY3VzdG9taXphdGlvbnNcbiAgJ3Jld3JpdGUnLCAnc3BlbGwnLFxuXSk7XG5cbmxldCBfY29sbGFwc2VkID0gZmFsc2U7XG50cnkge1xuICBfY29sbGFwc2VkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oU3RvcmFnZUtleXMuRUFSTFlfUFJFVklFV19DT0xMQVBTRUQpID09PSAndHJ1ZSc7XG59IGNhdGNoIChfZSkge1xuICAvLyBsb2NhbFN0b3JhZ2UgdW5hdmFpbGFibGUgXHUyMDE0IGRlZmF1bHQgdG8gZXhwYW5kZWQuXG59XG5cbmZ1bmN0aW9uIF9zZXRDb2xsYXBzZWQoY29sbGFwc2VkKSB7XG4gIF9jb2xsYXBzZWQgPSBjb2xsYXBzZWQ7XG4gIHRyeSB7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oU3RvcmFnZUtleXMuRUFSTFlfUFJFVklFV19DT0xMQVBTRUQsIFN0cmluZyhjb2xsYXBzZWQpKTtcbiAgfSBjYXRjaCAoX2UpIHtcbiAgICAvLyBOb24tZmF0YWwgXHUyMDE0IGNvbGxhcHNlIHN0YXRlIGp1c3Qgd29uJ3QgcGVyc2lzdCBhY3Jvc3MgcmVsb2Fkcy5cbiAgfVxuICBjb25zdCBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWFybHktcHJldmlldy10b2dnbGUtYnRuJyk7XG4gIGlmIChidG4pIHtcbiAgICBidG4udGV4dENvbnRlbnQgPSBjb2xsYXBzZWQgPyAnU2hvdycgOiAnSGlkZSc7XG4gICAgYnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsIFN0cmluZyghY29sbGFwc2VkKSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gX3JlbmRlckVhcmx5UHJldmlld0JvZHkoKSB7XG4gIGNvbnN0IGJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWFybHktcHJldmlldy1ib2R5Jyk7XG4gIGNvbnN0IG5vdGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWFybHktcHJldmlldy1zdGF0dXMtbm90ZScpO1xuICBpZiAoIWJvZHkpIHJldHVybjtcblxuICBpZiAoX2NvbGxhcHNlZCkge1xuICAgIGJvZHkuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICByZXR1cm47XG4gIH1cbiAgYm9keS5zdHlsZS5kaXNwbGF5ID0gJyc7XG5cbiAgbGV0IGRhdGE7XG4gIHRyeSB7XG4gICAgLy8gUmVhZC1vbmx5IGZldGNoIG9ubHkgXHUyMDE0IHNlZSB0aGUgbW9kdWxlLWhlYWRlciBzYWZldHkgYm91bmRhcnkuXG4gICAgZGF0YSA9IGF3YWl0IGFwaUNhbGwoJ0dFVCcsICcvYXBpL2xheW91dC1odG1sJyk7XG4gIH0gY2F0Y2ggKF9lKSB7XG4gICAgLy8gNDA0L2Vycm9yIChubyBwcmV2aWV3IGdlbmVyYXRlZCB5ZXQgdGhpcyBzZXNzaW9uKSBcdTIwMTQgZW1wdHkgc3RhdGUgYmVsb3cuXG4gICAgZGF0YSA9IG51bGw7XG4gIH1cblxuICBpZiAoZGF0YSAmJiBkYXRhLm9rICYmIGRhdGEuaHRtbCkge1xuICAgIGNvbnN0IGZyZXNobmVzcyA9ICh0eXBlb2Ygc3RhdGVNYW5hZ2VyPy5nZXRMYXlvdXRGcmVzaG5lc3MgPT09ICdmdW5jdGlvbicpXG4gICAgICA/IHN0YXRlTWFuYWdlci5nZXRMYXlvdXRGcmVzaG5lc3MoKSA6IHsgaXNTdGFsZTogZmFsc2UgfTtcblxuICAgIGJvZHkuaW5uZXJIVE1MID0gJzxpZnJhbWUgaWQ9XCJlYXJseS1wcmV2aWV3LWlmcmFtZVwiIHNhbmRib3g9XCJhbGxvdy1zYW1lLW9yaWdpblwiICcgK1xuICAgICAgJ3JlZmVycmVycG9saWN5PVwibm8tcmVmZXJyZXJcIiBzdHlsZT1cIndpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7Ym9yZGVyOm5vbmU7XCI+PC9pZnJhbWU+JztcbiAgICBjb25zdCBpZnJhbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWFybHktcHJldmlldy1pZnJhbWUnKTtcbiAgICBjb25zdCBzdGF0ZUxhYmVsID0gZnJlc2huZXNzLmlzU3RhbGUgPyAnc3RhbGUnIDogJ2ZyZXNoJztcbiAgICBpZnJhbWUudGl0bGUgPSBgQ1YgcHJldmlldyBcdTIwMTQgJHtzdGF0ZUxhYmVsfWA7XG4gICAgaWZyYW1lLmNsYXNzTGlzdC50b2dnbGUoJ2Vhcmx5LXByZXZpZXctaWZyYW1lLXN0YWxlJywgQm9vbGVhbihmcmVzaG5lc3MuaXNTdGFsZSkpO1xuICAgIHJlbmRlckh0bWxJbnRvSWZyYW1lKGlmcmFtZSwgZGF0YS5odG1sKTtcblxuICAgIGlmIChub3RlKSB7XG4gICAgICBub3RlLnRleHRDb250ZW50ID0gZnJlc2huZXNzLmlzU3RhbGVcbiAgICAgICAgPyAnUHJldmlldyByZWZsZWN0cyBhbiBlYXJsaWVyIHZlcnNpb24gXHUyMDE0IHZpc2l0IExheW91dCBSZXZpZXcgdG8gcmVmcmVzaC4nXG4gICAgICAgIDogJyc7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIGJvZHkuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJlYXJseS1wcmV2aWV3LWVtcHR5XCI+Tm8gQ1YgcHJldmlldyB5ZXQgXHUyMDE0IGF2YWlsYWJsZSBhZnRlciB5b3UgcmVhY2ggTGF5b3V0IFJldmlldy48L2Rpdj4nO1xuICBpZiAobm90ZSkgbm90ZS50ZXh0Q29udGVudCA9ICcnO1xufVxuXG4vKipcbiAqIFNob3cgb3IgaGlkZSB0aGUgcGFuZWwgZm9yIHRoZSBnaXZlbiB0YWIsIGFuZCAocmUpcmVuZGVyIGl0cyBib2R5IHdoZW5cbiAqIHNob3duLiBDYWxsZWQgZnJvbSBzd2l0Y2hUYWIoKSBcdTIwMTQgdGhpcyBmdW5jdGlvbidzIG93biBpbi1zY29wZSBjaGVja1xuICogZGVjaWRlcyB2aXNpYmlsaXR5LCBzbyB0aGUgY2FsbGVyIGRvZXNuJ3QgbmVlZCB0byBrbm93IHRoZSB0YWIgbGlzdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWJcbiAqL1xuYXN5bmMgZnVuY3Rpb24gdG9nZ2xlRWFybHlQcmV2aWV3UGFuZWwodGFiKSB7XG4gIGNvbnN0IHBhbmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Vhcmx5LXByZXZpZXctcGFuZWwnKTtcbiAgaWYgKCFwYW5lbCkgcmV0dXJuO1xuICBpZiAoIUVBUkxZX1BSRVZJRVdfVEFCUy5oYXModGFiKSkge1xuICAgIHBhbmVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgcmV0dXJuO1xuICB9XG4gIHBhbmVsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICBhd2FpdCBfcmVuZGVyRWFybHlQcmV2aWV3Qm9keSgpO1xufVxuXG5mdW5jdGlvbiBpbml0RWFybHlQcmV2aWV3UGFuZWwoKSB7XG4gIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlYXJseS1wcmV2aWV3LXRvZ2dsZS1idG4nKTtcbiAgaWYgKCFidG4pIHJldHVybjtcbiAgYnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsIFN0cmluZyghX2NvbGxhcHNlZCkpO1xuICBidG4udGV4dENvbnRlbnQgPSBfY29sbGFwc2VkID8gJ1Nob3cnIDogJ0hpZGUnO1xuICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgX3NldENvbGxhcHNlZCghX2NvbGxhcHNlZCk7XG4gICAgX3JlbmRlckVhcmx5UHJldmlld0JvZHkoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCB7IGluaXRFYXJseVByZXZpZXdQYW5lbCwgdG9nZ2xlRWFybHlQcmV2aWV3UGFuZWwgfTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL3Nlc3Npb24tc3dpdGNoZXItdWkuanNcbiAqIFNlc3Npb24gbWFuYWdlbWVudCBtb2RhbCwgdHJhc2ggdmlldywgYW5kIG93bmVyc2hpcCBjb25mbGljdCBkaWFsb2cuXG4gKlxuICogVGhlIHNlc3Npb24tY29uZmxpY3QgcmV0cnkgYmFubmVyIChzaG93U2Vzc2lvbkNvbmZsaWN0QmFubmVyL1xuICogY29uZmxpY3RSZXRyeU5vdy9jb25mbGljdERpc21pc3MpIGxpdmVzIGluIHdlYi9mZXRjaC11dGlscy5qcywgd2hpY2ggb3duc1xuICogaGFuZGxlNDA5Q29uZmxpY3QgKHRoZSBhY3R1YWwgdHJpZ2dlcikgXHUyMDE0IHRoaXMgZmlsZSB1c2VkIHRvIGNhcnJ5IGl0cyBvd25cbiAqIGJ5dGUtZm9yLWJ5dGUgZHVwbGljYXRlIHdpdGggYSBzZXBhcmF0ZSByZXRyeSBxdWV1ZS90aW1lciwgd2hpY2ggbWVhbnRcbiAqIGNsaWNraW5nIFwiUmV0cnkgTm93XCIgY291bGQgc2lsZW50bHkgZHJhaW4gdGhlIHdyb25nIChhbHdheXMtZW1wdHkpIHF1ZXVlXG4gKiBkZXBlbmRpbmcgb24gd2ViL3NyYy9tYWluLmpzJ3MgbW9kdWxlIGxvYWQgb3JkZXIsIG5ldmVyIGFjdHVhbGx5XG4gKiByZXNvbHZpbmcgdGhlIHBlbmRpbmcgcmV0cmllZCByZXF1ZXN0LiBSZW1vdmVkOyBzZWUgd2ViL2ZldGNoLXV0aWxzLmpzLlxuICpcbiAqIERlcGVuZGVuY2llcyAocmVzb2x2ZWQgdGhyb3VnaCBnbG9iYWxUaGlzIGF0IHJ1bnRpbWUpOlxuICogICBlc2NhcGVIdG1sLCBwYXJzZVNlc3Npb25MaXN0UmVzcG9uc2UsIGZvcm1hdFNlc3Npb25QaGFzZUxhYmVsLFxuICogICBmb3JtYXRTZXNzaW9uVGltZXN0YW1wLCBidWlsZFNlc3Npb25Td2l0Y2hlckxhYmVsLFxuICogICBnZXRBY3RpdmVTZXNzaW9uT3duZXJzaGlwTWV0YSwgX2dldEN1cnJlbnRTZXNzaW9uSWRWYWx1ZSxcbiAqICAgbG9hZFNlc3Npb25GaWxlLCBjcmVhdGVOZXdTZXNzaW9uQW5kTmF2aWdhdGUsIGZldGNoU3RhdHVzLFxuICogICBzZXRJbml0aWFsRm9jdXMsIHRyYXBGb2N1cywgcmVzdG9yZUZvY3VzLCBjb25maXJtRGlhbG9nXG4gKi9cblxuLy8gXHUyNTAwXHUyNTAwIFNvcnQgc3RhdGUgJiBzZXNzaW9uIGNhY2hlIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuY29uc3QgX1NNX1NUT1JBR0VfS0VZID0gJ2N2X3NtX3NvcnRfa2V5JztcbmNvbnN0IF9TTV9TVE9SQUdFX0RJUiA9ICdjdl9zbV9zb3J0X2Rpcic7XG5cbmxldCBfc21Tb3J0S2V5ID0gKCgpID0+IHsgdHJ5IHsgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKF9TTV9TVE9SQUdFX0tFWSkgfHwgJ2xhc3RNb2RpZmllZCc7IH0gY2F0Y2ggKF8pIHsgcmV0dXJuICdsYXN0TW9kaWZpZWQnOyB9IH0pKCk7XG5sZXQgX3NtU29ydERpciA9ICgoKSA9PiB7IHRyeSB7IHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShfU01fU1RPUkFHRV9ESVIpIHx8ICdkZXNjJzsgICAgICAgICB9IGNhdGNoIChfKSB7IHJldHVybiAnZGVzYyc7ICAgICAgICAgfSB9KSgpO1xuXG5sZXQgX3NtQWN0aXZlQ2FjaGUgPSBbXTtcbmxldCBfc21TYXZlZENhY2hlICA9IFtdO1xuXG4vLyBcdTI1MDBcdTI1MDAgUmVuZGVyIGhlbHBlcnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIF9yZW5kZXJBY3RpdmVTZXNzaW9uUm93cyhhY3RpdmVTZXNzaW9ucykge1xuICBpZiAoIWFjdGl2ZVNlc3Npb25zLmxlbmd0aCkge1xuICAgIHJldHVybiAnPHAgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLWVtcHR5XCI+Tm8gYWN0aXZlIGluLW1lbW9yeSBzZXNzaW9ucy48L3A+JztcbiAgfVxuXG4gIGNvbnN0IGN1cnJlbnRTZXNzaW9uSWQgPSBfZ2V0Q3VycmVudFNlc3Npb25JZFZhbHVlKCk7XG5cbiAgcmV0dXJuIGA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1saXN0XCI+JHthY3RpdmVTZXNzaW9ucy5tYXAoc2Vzc2lvbiA9PiB7XG4gICAgY29uc3Qgb3duZXJzaGlwID0gZ2V0QWN0aXZlU2Vzc2lvbk93bmVyc2hpcE1ldGEoc2Vzc2lvbiwgeyBjdXJyZW50U2Vzc2lvbklkIH0pO1xuICAgIGNvbnN0IG9wZW5IcmVmID0gYC8/c2Vzc2lvbj0ke2VuY29kZVVSSUNvbXBvbmVudChzZXNzaW9uLnNlc3Npb25faWQgfHwgJycpfWA7XG4gICAgY29uc3QgYWN0aW9uSHRtbCA9IG93bmVyc2hpcC5pc0N1cnJlbnRcbiAgICAgID8gJzxzcGFuIGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1idG5cIiBhcmlhLWRpc2FibGVkPVwidHJ1ZVwiPkN1cnJlbnQ8L3NwYW4+J1xuICAgICAgOiBgPGEgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLWxpbmtcIiBocmVmPVwiJHtvcGVuSHJlZn1cIj5PcGVuPC9hPmA7XG4gICAgcmV0dXJuIGBcbiAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLXJvd1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1yb3ctbWFpblwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLXJvdy10aXRsZVwiPlxuICAgICAgICAgICAgPHN0cm9uZz4ke2VzY2FwZUh0bWwoc2Vzc2lvbi5wb3NpdGlvbl9uYW1lIHx8ICdVbnRpdGxlZCcpfTwvc3Ryb25nPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZXNzaW9uLXN0YXR1cy1waWxsICR7b3duZXJzaGlwLmNsYXNzTmFtZX1cIj48c3BhbiBjbGFzcz1cInNlc3Npb24tc3RhdHVzLWRvdFwiPjwvc3Bhbj4ke2VzY2FwZUh0bWwob3duZXJzaGlwLmxhYmVsKX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNlc3Npb24tc3dpdGNoZXItcm93LW1ldGFcIj5cbiAgICAgICAgICAgICR7ZXNjYXBlSHRtbChmb3JtYXRTZXNzaW9uUGhhc2VMYWJlbChzZXNzaW9uLnBoYXNlKSl9IFx1MDBCNyBDcmVhdGVkICR7ZXNjYXBlSHRtbChmb3JtYXRTZXNzaW9uVGltZXN0YW1wKHNlc3Npb24uY3JlYXRlZCkpfSBcdTAwQjcgTGFzdCBtb2RpZmllZCAke2VzY2FwZUh0bWwoZm9ybWF0U2Vzc2lvblRpbWVzdGFtcChzZXNzaW9uLmxhc3RfbW9kaWZpZWQpKX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLWFjdGlvbnNcIj4ke2FjdGlvbkh0bWx9PC9kaXY+XG4gICAgICA8L2Rpdj5gO1xuICB9KS5qb2luKCcnKX08L2Rpdj5gO1xufVxuXG5mdW5jdGlvbiBfcmVuZGVyU2F2ZWRTZXNzaW9uUm93cyhzYXZlZFNlc3Npb25zLCB7IGluY2x1ZGVNYW5hZ2VtZW50ID0gZmFsc2UgfSA9IHt9KSB7XG4gIGlmICghc2F2ZWRTZXNzaW9ucy5sZW5ndGgpIHtcbiAgICByZXR1cm4gJzxwIGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1lbXB0eVwiPk5vIHNhdmVkIHNlc3Npb25zIGZvdW5kLjwvcD4nO1xuICB9XG5cbiAgZnVuY3Rpb24gX2NyZWF0ZWRJc29Gcm9tU2Vzc2lvblBhdGgoc2Vzc2lvblBhdGgpIHtcbiAgICBpZiAoIXNlc3Npb25QYXRoKSByZXR1cm4gJyc7XG4gICAgY29uc3QgcGF0aFRleHQgPSBTdHJpbmcoc2Vzc2lvblBhdGgpO1xuICAgIGNvbnN0IHBhcnRzID0gcGF0aFRleHQuc3BsaXQoL1tcXFxcL10vKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCA8IDIpIHJldHVybiAnJztcblxuICAgIGNvbnN0IGRpck5hbWUgPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAyXTtcbiAgICBjb25zdCBtYXRjaCA9IGRpck5hbWUubWF0Y2goLyhcXGR7NH0pKFxcZHsyfSkoXFxkezJ9KVtfLV0/KFxcZHsyfSkoXFxkezJ9KShcXGR7Mn0pLyk7XG4gICAgaWYgKCFtYXRjaCkgcmV0dXJuICcnO1xuXG4gICAgY29uc3QgWywgeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmRdID0gbWF0Y2g7XG4gICAgcmV0dXJuIGAke3llYXJ9LSR7bW9udGh9LSR7ZGF5fVQke2hvdXJ9OiR7bWludXRlfToke3NlY29uZH1aYDtcbiAgfVxuXG4gIHJldHVybiBgPGRpdiBjbGFzcz1cInNlc3Npb24tc3dpdGNoZXItbGlzdFwiPiR7c2F2ZWRTZXNzaW9ucy5tYXAoKHNlc3Npb24sIGluZGV4KSA9PiB7XG4gICAgY29uc3QgZXNjYXBlZFBhdGggPSBlc2NhcGVIdG1sKHNlc3Npb24ucGF0aCB8fCAnJyk7XG4gICAgY29uc3QgY3JlYXRlZElzbyA9IF9jcmVhdGVkSXNvRnJvbVNlc3Npb25QYXRoKHNlc3Npb24ucGF0aCk7XG4gICAgY29uc3QgY3JlYXRlZExhYmVsID0gY3JlYXRlZElzbyA/IGZvcm1hdFNlc3Npb25UaW1lc3RhbXAoY3JlYXRlZElzbykgOiAnXHUyMDE0JztcbiAgICBjb25zdCBzYXZlZExhYmVsID0gZm9ybWF0U2Vzc2lvblRpbWVzdGFtcChzZXNzaW9uLnRpbWVzdGFtcCk7XG4gICAgY29uc3Qgc2F2ZWRNZXRhID0gc2F2ZWRMYWJlbCA9PT0gJ1x1MjAxNCcgPyAnJyA6IGAgXHUwMEI3IFNhdmVkICR7ZXNjYXBlSHRtbChzYXZlZExhYmVsKX1gO1xuICAgIGNvbnN0IG1hbmFnZW1lbnRIdG1sID0gaW5jbHVkZU1hbmFnZW1lbnRcbiAgICAgID8gYFxuICAgICAgICA8YnV0dG9uIGRhdGEtc20tYWN0aW9uPVwicmVuYW1lXCIgZGF0YS1zbS1wYXRoPVwiJHtlc2NhcGVkUGF0aH1cIiBkYXRhLXNtLWlkeD1cIiR7aW5kZXh9XCIgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLWJ0blwiIHRpdGxlPVwiUmVuYW1lIHNlc3Npb25cIj5SZW5hbWU8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBkYXRhLXNtLWFjdGlvbj1cImRlbGV0ZVwiIGRhdGEtc20tcGF0aD1cIiR7ZXNjYXBlZFBhdGh9XCIgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLWJ0biBkYW5nZXJcIiB0aXRsZT1cIk1vdmUgc2Vzc2lvbiB0byBUcmFzaFwiPk1vdmUgdG8gVHJhc2g8L2J1dHRvbj5gXG4gICAgICA6ICcnO1xuXG4gICAgcmV0dXJuIGBcbiAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLXJvd1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1yb3ctbWFpblwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLXJvdy10aXRsZVwiPlxuICAgICAgICAgICAgPHN0cm9uZyBpZD1cInNtLW5hbWUtJHtpbmRleH1cIj4ke2VzY2FwZUh0bWwoc2Vzc2lvbi5wb3NpdGlvbl9uYW1lIHx8ICdVbnRpdGxlZCcpfTwvc3Ryb25nPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZXNzaW9uLXN0YXR1cy1waWxsIHNlc3Npb24tc3RhdHVzLXNhdmVkXCI+PHNwYW4gY2xhc3M9XCJzZXNzaW9uLXN0YXR1cy1kb3RcIj48L3NwYW4+U2F2ZWQ8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBpZD1cInNtLXJlbmFtZS0ke2luZGV4fVwiIHN0eWxlPVwiZGlzcGxheTpub25lO2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6NnB4O21hcmdpbjo4cHggMCA0cHg7XCI+XG4gICAgICAgICAgICA8aW5wdXQgaWQ9XCJzbS1pbnB1dC0ke2luZGV4fVwiIHR5cGU9XCJ0ZXh0XCIgdmFsdWU9XCIke2VzY2FwZUh0bWwoc2Vzc2lvbi5wb3NpdGlvbl9uYW1lIHx8ICcnKX1cIiBjbGFzcz1cInNtLWtleS1pbnB1dFwiIGRhdGEtc20tcGF0aD1cIiR7ZXNjYXBlZFBhdGh9XCIgZGF0YS1zbS1pZHg9XCIke2luZGV4fVwiIHN0eWxlPVwiYm9yZGVyOjFweCBzb2xpZCAjM2I4MmY2O2JvcmRlci1yYWRpdXM6NnB4O3BhZGRpbmc6NnB4IDEwcHg7Zm9udC1zaXplOjEzcHg7ZmxleDoxO21pbi13aWR0aDowO1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLXNtLWFjdGlvbj1cInN1Ym1pdC1yZW5hbWVcIiBkYXRhLXNtLXBhdGg9XCIke2VzY2FwZWRQYXRofVwiIGRhdGEtc20taWR4PVwiJHtpbmRleH1cIiBjbGFzcz1cInNlc3Npb24tc3dpdGNoZXItYnRuXCI+U2F2ZTwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLXNtLWFjdGlvbj1cImNhbmNlbC1yZW5hbWVcIiBkYXRhLXNtLWlkeD1cIiR7aW5kZXh9XCIgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLWJ0blwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLXJvdy1tZXRhXCI+XG4gICAgICAgICAgICAke2VzY2FwZUh0bWwoZm9ybWF0U2Vzc2lvblBoYXNlTGFiZWwoc2Vzc2lvbi5waGFzZSkpfSBcdTAwQjcgQ3JlYXRlZCAke2VzY2FwZUh0bWwoY3JlYXRlZExhYmVsKX0ke3NhdmVkTWV0YX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLWFjdGlvbnNcIj5cbiAgICAgICAgICA8YnV0dG9uIGRhdGEtc20tYWN0aW9uPVwibG9hZFwiIGRhdGEtc20tcGF0aD1cIiR7ZXNjYXBlZFBhdGh9XCIgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLWxpbmtcIj5Mb2FkPC9idXR0b24+XG4gICAgICAgICAgJHttYW5hZ2VtZW50SHRtbH1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5gO1xuICB9KS5qb2luKCcnKX08L2Rpdj5gO1xufVxuXG5mdW5jdGlvbiBfcmVuZGVyU2Vzc2lvblN3aXRjaGVyU2VjdGlvbnMoYWN0aXZlU2Vzc2lvbnMsIHNhdmVkU2Vzc2lvbnMsIHsgaW5jbHVkZVNhdmVkTWFuYWdlbWVudCA9IGZhbHNlIH0gPSB7fSkge1xuICBjb25zdCBzYXZlZFNlY3Rpb25Ob3RlID0gaW5jbHVkZVNhdmVkTWFuYWdlbWVudFxuICAgID8gJ0xvYWQgZnJvbSBkaXNrLCByZW5hbWUsIG9yIG1vdmUgc2F2ZWQgd29yayB0byBUcmFzaC4nXG4gICAgOiAnTG9hZCBzYXZlZCB3b3JrIGZyb20gZGlzay4nO1xuXG4gIHJldHVybiBgXG4gICAgPGRpdiBjbGFzcz1cInNlc3Npb24tc3dpdGNoZXItc2VjdGlvbnNcIj5cbiAgICAgIDxzZWN0aW9uIGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1zZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLXNlY3Rpb24taGVhZGVyXCI+XG4gICAgICAgICAgPGgzPkFjdGl2ZSBTZXNzaW9uczwvaDM+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLXNlY3Rpb24tbm90ZVwiPkluLW1lbW9yeSBzZXNzaW9ucyB0aGF0IGNhbiBiZSBvcGVuZWQgZGlyZWN0bHkuPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgJHtfcmVuZGVyQWN0aXZlU2Vzc2lvblJvd3MoYWN0aXZlU2Vzc2lvbnMpfVxuICAgICAgPC9zZWN0aW9uPlxuICAgICAgPHNlY3Rpb24gY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLXNlY3Rpb25cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNlc3Npb24tc3dpdGNoZXItc2VjdGlvbi1oZWFkZXJcIj5cbiAgICAgICAgICA8aDM+U2F2ZWQgU2Vzc2lvbnM8L2gzPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1zZWN0aW9uLW5vdGVcIj4ke3NhdmVkU2VjdGlvbk5vdGV9PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgJHtfcmVuZGVyU2F2ZWRTZXNzaW9uUm93cyhzYXZlZFNlc3Npb25zLCB7IGluY2x1ZGVNYW5hZ2VtZW50OiBpbmNsdWRlU2F2ZWRNYW5hZ2VtZW50IH0pfVxuICAgICAgPC9zZWN0aW9uPlxuICAgIDwvZGl2PmA7XG59XG5cbmZ1bmN0aW9uIF91cGRhdGVTZXNzaW9uU3dpdGNoZXJIZWFkZXIoc3RhdHVzID0ge30pIHtcbiAgY29uc3QgbGFiZWwgPSBidWlsZFNlc3Npb25Td2l0Y2hlckxhYmVsKHN0YXR1cyk7XG4gIGNvbnN0IHN3aXRjaGVyTGFiZWxFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXNzaW9uLXN3aXRjaGVyLWxhYmVsJyk7XG4gIGNvbnN0IHN3aXRjaGVyQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Nlc3Npb24tc3dpdGNoZXItYnRuJyk7XG4gIGNvbnN0IHN1YnRpdGxlRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhZGVyLXNlc3Npb24tbmFtZScpO1xuICBjb25zdCBoYXNTZXNzaW9uID0gQm9vbGVhbihfZ2V0Q3VycmVudFNlc3Npb25JZFZhbHVlKCkpO1xuXG4gIGlmIChzd2l0Y2hlckxhYmVsRWwpIHN3aXRjaGVyTGFiZWxFbC50ZXh0Q29udGVudCA9IGxhYmVsO1xuICBpZiAoc3dpdGNoZXJCdG4pIHN3aXRjaGVyQnRuLmNsYXNzTGlzdC50b2dnbGUoJ2lzLXNlc3Npb24tYWN0aXZlJywgaGFzU2Vzc2lvbik7XG4gIGlmIChzdWJ0aXRsZUVsKSB7XG4gICAgc3VidGl0bGVFbC50ZXh0Q29udGVudCA9IGhhc1Nlc3Npb24gPyBgQ3VycmVudCBzZXNzaW9uOiAke2xhYmVsfWAgOiAnU2VsZWN0IG9yIGNyZWF0ZSBhIHNlc3Npb24nO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBPd25lcnNoaXAgY29uZmxpY3QgZGlhbG9nIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBzaG93T3duZXJzaGlwQ29uZmxpY3REaWFsb2cobWVzc2FnZSA9ICdUaGlzIHNlc3Npb24gaXMgY3VycmVudGx5IGNsYWltZWQgYnkgYW5vdGhlciBicm93c2VyIHRhYi4nKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICBjb25zdCBvdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ293bmVyc2hpcC1jb25mbGljdC1vdmVybGF5Jyk7XG4gICAgY29uc3QgbWVzc2FnZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ293bmVyc2hpcC1jb25mbGljdC1tZXNzYWdlJyk7XG4gICAgY29uc3QgbG9hZERpZmZlcmVudEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvd25lcnNoaXAtbG9hZC1kaWZmZXJlbnQtYnRuJyk7XG4gICAgY29uc3QgbmV3U2Vzc2lvbkJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvd25lcnNoaXAtbmV3LXNlc3Npb24tYnRuJyk7XG4gICAgY29uc3QgdGFrZW92ZXJCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3duZXJzaGlwLXRha2VvdmVyLWJ0bicpO1xuICAgIGlmICghb3ZlcmxheSB8fCAhbWVzc2FnZUVsIHx8ICFsb2FkRGlmZmVyZW50QnRuIHx8ICFuZXdTZXNzaW9uQnRuIHx8ICF0YWtlb3ZlckJ0bikge1xuICAgICAgcmVzb2x2ZSgnZGlmZmVyZW50Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY2xlYW51cCA9IChjaG9pY2UpID0+IHtcbiAgICAgIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIHJlc3RvcmVGb2N1cygpO1xuICAgICAgbG9hZERpZmZlcmVudEJ0bi5vbmNsaWNrID0gbnVsbDtcbiAgICAgIG5ld1Nlc3Npb25CdG4ub25jbGljayA9IG51bGw7XG4gICAgICB0YWtlb3ZlckJ0bi5vbmNsaWNrID0gbnVsbDtcbiAgICAgIHJlc29sdmUoY2hvaWNlKTtcbiAgICB9O1xuXG4gICAgbWVzc2FnZUVsLnRleHRDb250ZW50ID0gbWVzc2FnZTtcbiAgICBvdmVybGF5LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgd2luZG93Ll9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICBzZXRJbml0aWFsRm9jdXMoJ293bmVyc2hpcC1jb25mbGljdC1vdmVybGF5Jyk7XG4gICAgdHJhcEZvY3VzKCdvd25lcnNoaXAtY29uZmxpY3Qtb3ZlcmxheScpO1xuXG4gICAgbG9hZERpZmZlcmVudEJ0bi5vbmNsaWNrID0gKCkgPT4gY2xlYW51cCgnZGlmZmVyZW50Jyk7XG4gICAgbmV3U2Vzc2lvbkJ0bi5vbmNsaWNrID0gKCkgPT4gY2xlYW51cCgnbmV3Jyk7XG4gICAgdGFrZW92ZXJCdG4ub25jbGljayA9ICgpID0+IGNsZWFudXAoJ3Rha2VvdmVyJyk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjbG9zZU93bmVyc2hpcENvbmZsaWN0RGlhbG9nKGNob2ljZSA9ICdkaWZmZXJlbnQnKSB7XG4gIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3duZXJzaGlwLWNvbmZsaWN0LW92ZXJsYXknKTtcbiAgaWYgKG92ZXJsYXkpIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgcmVzdG9yZUZvY3VzKCk7XG4gIGNvbnN0IGxvYWREaWZmZXJlbnRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3duZXJzaGlwLWxvYWQtZGlmZmVyZW50LWJ0bicpO1xuICBpZiAobG9hZERpZmZlcmVudEJ0biAmJiB0eXBlb2YgbG9hZERpZmZlcmVudEJ0bi5vbmNsaWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgbG9hZERpZmZlcmVudEJ0bi5vbmNsaWNrKCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHJldHVybiBjaG9pY2U7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBTZXNzaW9uIGZpbGUtYnJvd3NlciB0YWJsZSBoZWxwZXJzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBfc2V0U21Tb3J0KGtleSkge1xuICBpZiAoX3NtU29ydEtleSA9PT0ga2V5KSB7XG4gICAgX3NtU29ydERpciA9IF9zbVNvcnREaXIgPT09ICdhc2MnID8gJ2Rlc2MnIDogJ2FzYyc7XG4gIH0gZWxzZSB7XG4gICAgX3NtU29ydEtleSA9IGtleTtcbiAgICBfc21Tb3J0RGlyID0ga2V5ID09PSAnbGFzdE1vZGlmaWVkJyA/ICdkZXNjJyA6ICdhc2MnO1xuICB9XG4gIHRyeSB7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oX1NNX1NUT1JBR0VfS0VZLCBfc21Tb3J0S2V5KTtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShfU01fU1RPUkFHRV9ESVIsIF9zbVNvcnREaXIpO1xuICB9IGNhdGNoIChfKSB7IC8qIHN0b3JhZ2UgdW5hdmFpbGFibGUgKi8gfVxuICBfcmVuZGVyU2Vzc2lvblRhYmxlRnJvbUNhY2hlKCk7XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVkSXNvRnJvbVNlc3Npb25QYXRoKHNlc3Npb25QYXRoKSB7XG4gIGlmICghc2Vzc2lvblBhdGgpIHJldHVybiAnJztcbiAgY29uc3QgcGF0aFRleHQgPSBTdHJpbmcoc2Vzc2lvblBhdGgpO1xuICBjb25zdCBwYXJ0cyAgICA9IHBhdGhUZXh0LnNwbGl0KC9bXFxcXC9dLykuZmlsdGVyKEJvb2xlYW4pO1xuICBpZiAocGFydHMubGVuZ3RoIDwgMikgcmV0dXJuICcnO1xuICBjb25zdCBkaXJOYW1lICA9IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDJdO1xuICBjb25zdCBtYXRjaCAgICA9IGRpck5hbWUubWF0Y2goLyhcXGR7NH0pKFxcZHsyfSkoXFxkezJ9KVtfLV0/KFxcZHsyfSkoXFxkezJ9KShcXGR7Mn0pLyk7XG4gIGlmICghbWF0Y2gpIHJldHVybiAnJztcbiAgY29uc3QgWywgeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmRdID0gbWF0Y2g7XG4gIHJldHVybiBgJHt5ZWFyfS0ke21vbnRofS0ke2RheX1UJHtob3VyfToke21pbnV0ZX06JHtzZWNvbmR9WmA7XG59XG5cbmZ1bmN0aW9uIF9ub3JtYWxpemVTZXNzaW9uc0ZvclRhYmxlKGFjdGl2ZVNlc3Npb25zLCBzYXZlZFNlc3Npb25zKSB7XG4gIGNvbnN0IGN1cnJlbnRTZXNzaW9uSWQgPSBfZ2V0Q3VycmVudFNlc3Npb25JZFZhbHVlKCk7XG4gIGNvbnN0IHJvd3MgPSBbXTtcblxuICBmb3IgKGNvbnN0IHMgb2YgYWN0aXZlU2Vzc2lvbnMpIHtcbiAgICBjb25zdCBvd25lcnNoaXAgPSBnZXRBY3RpdmVTZXNzaW9uT3duZXJzaGlwTWV0YShzLCB7IGN1cnJlbnRTZXNzaW9uSWQgfSk7XG4gICAgcm93cy5wdXNoKHtcbiAgICAgIHR5cGU6ICAgICAgICAgICAgICAnYWN0aXZlJyxcbiAgICAgIG5hbWU6ICAgICAgICAgICAgICAgcy5wb3NpdGlvbl9uYW1lIHx8ICdVbnRpdGxlZCcsXG4gICAgICBjb21wYW55OiAgICAgICAgICAgIHMuY29tcGFueSB8fCAnJyxcbiAgICAgIHBoYXNlOiAgICAgICAgICAgICAgcy5waGFzZSAgICAgICAgIHx8ICcnLFxuICAgICAgYXBwbGljYXRpb25TdGF0dXM6ICBzLmFwcGxpY2F0aW9uX3N0YXR1cyB8fCAnJyxcbiAgICAgIGF0c1Njb3JlOiAgICAgICAgICAgcy5hdHNfc2NvcmUgPz8gbnVsbCxcbiAgICAgIGxhc3RNb2RpZmllZDogICAgICAgcy5sYXN0X21vZGlmaWVkICA/IG5ldyBEYXRlKHMubGFzdF9tb2RpZmllZCkgOiBudWxsLFxuICAgICAgY3JlYXRlZDogICAgICAgICAgICBzLmNyZWF0ZWQgICAgICAgID8gbmV3IERhdGUocy5jcmVhdGVkKSAgICAgICA6IG51bGwsXG4gICAgICBvd25lcnNoaXAsXG4gICAgICBzZXNzaW9uSWQ6ICAgICAgICAgIHMuc2Vzc2lvbl9pZCxcbiAgICAgIHBhdGg6ICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgIGlkeDogICAgICAgICAgICAgICAgbnVsbCxcbiAgICB9KTtcbiAgfVxuXG4gIHNhdmVkU2Vzc2lvbnMuZm9yRWFjaCgocywgaWR4KSA9PiB7XG4gICAgY29uc3QgY3JlYXRlZElzbyA9IF9jcmVhdGVkSXNvRnJvbVNlc3Npb25QYXRoKHMucGF0aCk7XG4gICAgcm93cy5wdXNoKHtcbiAgICAgIHR5cGU6ICAgICAgICAgICAgICAnc2F2ZWQnLFxuICAgICAgbmFtZTogICAgICAgICAgICAgICBzLnBvc2l0aW9uX25hbWUgfHwgJ1VudGl0bGVkJyxcbiAgICAgIGNvbXBhbnk6ICAgICAgICAgICAgcy5jb21wYW55IHx8ICcnLFxuICAgICAgcGhhc2U6ICAgICAgICAgICAgICBzLnBoYXNlICAgICAgICAgfHwgJycsXG4gICAgICBhcHBsaWNhdGlvblN0YXR1czogIHMuYXBwbGljYXRpb25fc3RhdHVzIHx8ICcnLFxuICAgICAgbm90ZXM6ICAgICAgICAgICAgICBzLm5vdGVzIHx8ICcnLFxuICAgICAgYXRzU2NvcmU6ICAgICAgICAgICBzLmF0c19zY29yZSA/PyBudWxsLFxuICAgICAgbGFzdE1vZGlmaWVkOiAgICAgICBzLnRpbWVzdGFtcCAgPyBuZXcgRGF0ZShzLnRpbWVzdGFtcCkgIDogbnVsbCxcbiAgICAgIGNyZWF0ZWQ6ICAgICAgICAgICAgY3JlYXRlZElzbyAgID8gbmV3IERhdGUoY3JlYXRlZElzbykgICA6IG51bGwsXG4gICAgICBvd25lcnNoaXA6ICAgICAgICAgIG51bGwsXG4gICAgICBzZXNzaW9uSWQ6ICAgICAgICAgIG51bGwsXG4gICAgICBwYXRoOiAgICAgICAgICAgICAgIHMucGF0aCxcbiAgICAgIGlkeCxcbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHJvd3M7XG59XG5cbmZ1bmN0aW9uIF9zb3J0U2Vzc2lvblJvd3Mocm93cywga2V5LCBkaXIpIHtcbiAgcmV0dXJuIFsuLi5yb3dzXS5zb3J0KChhLCBiKSA9PiB7XG4gICAgbGV0IGF2LCBidjtcbiAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgY2FzZSAnbmFtZSc6XG4gICAgICAgIGF2ID0gKGEubmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgYnYgPSAoYi5uYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICByZXR1cm4gZGlyID09PSAnYXNjJyA/IGF2LmxvY2FsZUNvbXBhcmUoYnYpIDogYnYubG9jYWxlQ29tcGFyZShhdik7XG4gICAgICBjYXNlICdzdGF0dXMnOiB7XG4gICAgICAgIGNvbnN0IHJhbmsgPSByID0+IHIudHlwZSA9PT0gJ2FjdGl2ZScgPyAoci5vd25lcnNoaXA/LmlzQ3VycmVudCA/IDAgOiAxKSA6IDI7XG4gICAgICAgIGF2ID0gcmFuayhhKTsgYnYgPSByYW5rKGIpO1xuICAgICAgICByZXR1cm4gZGlyID09PSAnYXNjJyA/IGF2IC0gYnYgOiBidiAtIGF2O1xuICAgICAgfVxuICAgICAgY2FzZSAncGhhc2UnOlxuICAgICAgICBhdiA9IChhLnBoYXNlIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBidiA9IChiLnBoYXNlIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICByZXR1cm4gZGlyID09PSAnYXNjJyA/IGF2LmxvY2FsZUNvbXBhcmUoYnYpIDogYnYubG9jYWxlQ29tcGFyZShhdik7XG4gICAgICBjYXNlICdsYXN0TW9kaWZpZWQnOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYXYgPSBhLmxhc3RNb2RpZmllZCA/IGEubGFzdE1vZGlmaWVkLmdldFRpbWUoKSA6IDA7XG4gICAgICAgIGJ2ID0gYi5sYXN0TW9kaWZpZWQgPyBiLmxhc3RNb2RpZmllZC5nZXRUaW1lKCkgOiAwO1xuICAgICAgICByZXR1cm4gZGlyID09PSAnYXNjJyA/IGF2IC0gYnYgOiBidiAtIGF2O1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIF9yZW5kZXJTZXNzaW9uVGFibGVIZWFkZXIoKSB7XG4gIGNvbnN0IGNvbHMgPSBbXG4gICAgeyBrZXk6ICduYW1lJywgICAgICAgICBsYWJlbDogJ05hbWUnICAgICB9LFxuICAgIHsga2V5OiAnc3RhdHVzJywgICAgICAgbGFiZWw6ICdTdGF0dXMnICAgfSxcbiAgICB7IGtleTogJ3BoYXNlJywgICAgICAgIGxhYmVsOiAnUGhhc2UnICAgIH0sXG4gICAgeyBrZXk6ICdsYXN0TW9kaWZpZWQnLCBsYWJlbDogJ01vZGlmaWVkJyB9LFxuICBdO1xuICBjb25zdCBjZWxscyA9IGNvbHMubWFwKCh7IGtleSwgbGFiZWwgfSkgPT4ge1xuICAgIGNvbnN0IGFjdGl2ZSA9IF9zbVNvcnRLZXkgPT09IGtleTtcbiAgICBjb25zdCBpY29uICAgPSBhY3RpdmUgPyAoX3NtU29ydERpciA9PT0gJ2FzYycgPyAnXFx1MjViMicgOiAnXFx1MjViYycpIDogJ1xcdTIxYzUnO1xuICAgIHJldHVybiBgPHNwYW4gY2xhc3M9XCJzbS10aCR7YWN0aXZlID8gJyBzbS10aC1zb3J0ZWQnIDogJyd9XCIgZGF0YS1zbS1zb3J0PVwiJHtrZXl9XCIgcm9sZT1cImJ1dHRvblwiIHRhYmluZGV4PVwiMFwiIHRpdGxlPVwiU29ydCBieSAke2xhYmVsfVwiPiR7ZXNjYXBlSHRtbChsYWJlbCl9IDxzcGFuIGNsYXNzPVwic20tc29ydC1pY29uJHthY3RpdmUgPyAnIHNtLXNvcnQtYWN0aXZlJyA6ICcnfVwiPiR7aWNvbn08L3NwYW4+PC9zcGFuPmA7XG4gIH0pO1xuICByZXR1cm4gYDxkaXYgY2xhc3M9XCJzbS10aGVhZFwiPiR7Y2VsbHMuam9pbignJyl9PHNwYW4gY2xhc3M9XCJzbS10aCBzbS10aC1hY3Rpb25zXCI+QWN0aW9uczwvc3Bhbj48L2Rpdj5gO1xufVxuXG5mdW5jdGlvbiBfZm10RGF0ZUNvbXBhY3QoZCkge1xuICBpZiAoIWQpIHJldHVybiAnXFx1MjAxNCc7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGQudG9Mb2NhbGVTdHJpbmcoJ2VuLVVTJywge1xuICAgICAgbW9udGg6ICdudW1lcmljJywgZGF5OiAnbnVtZXJpYycsIHllYXI6ICcyLWRpZ2l0JyxcbiAgICAgIGhvdXI6ICdudW1lcmljJywgbWludXRlOiAnMi1kaWdpdCcsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKF8pIHsgcmV0dXJuICdcXHUyMDE0JzsgfVxufVxuXG5mdW5jdGlvbiBfcmVuZGVyU2Vzc2lvblRhYmxlUm93KHJvdykge1xuICBjb25zdCBwaGFzZUxhYmVsID0gZXNjYXBlSHRtbChmb3JtYXRTZXNzaW9uUGhhc2VMYWJlbChyb3cucGhhc2UpKTtcbiAgY29uc3QgbW9kTGFiZWwgICA9IGVzY2FwZUh0bWwoX2ZtdERhdGVDb21wYWN0KHJvdy5sYXN0TW9kaWZpZWQpKTtcblxuICBjb25zdCBzdGF0dXNQaWxsID0gcm93LnR5cGUgPT09ICdhY3RpdmUnXG4gICAgPyBgPHNwYW4gY2xhc3M9XCJzZXNzaW9uLXN0YXR1cy1waWxsICR7cm93Lm93bmVyc2hpcC5jbGFzc05hbWV9XCI+PHNwYW4gY2xhc3M9XCJzZXNzaW9uLXN0YXR1cy1kb3RcIj48L3NwYW4+JHtlc2NhcGVIdG1sKHJvdy5vd25lcnNoaXAubGFiZWwpfTwvc3Bhbj5gXG4gICAgOiBgPHNwYW4gY2xhc3M9XCJzZXNzaW9uLXN0YXR1cy1waWxsIHNlc3Npb24tc3RhdHVzLXNhdmVkXCI+PHNwYW4gY2xhc3M9XCJzZXNzaW9uLXN0YXR1cy1kb3RcIj48L3NwYW4+U2F2ZWQ8L3NwYW4+YDtcblxuICBsZXQgYWN0aW9uSHRtbDtcbiAgaWYgKHJvdy50eXBlID09PSAnYWN0aXZlJykge1xuICAgIGNvbnN0IGhyZWYgPSBgLz9zZXNzaW9uPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHJvdy5zZXNzaW9uSWQgfHwgJycpfWA7XG4gICAgYWN0aW9uSHRtbCA9IHJvdy5vd25lcnNoaXAuaXNDdXJyZW50XG4gICAgICA/ICc8c3BhbiBjbGFzcz1cInNtLWJ0biBzbS1idG4tZGlzYWJsZWRcIiBhcmlhLWRpc2FibGVkPVwidHJ1ZVwiPkN1cnJlbnQ8L3NwYW4+J1xuICAgICAgOiBgPGEgY2xhc3M9XCJzbS1idG4gc20tYnRuLW9wZW5cIiBocmVmPVwiJHtocmVmfVwiPk9wZW48L2E+YDtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBlcCAgPSBlc2NhcGVIdG1sKHJvdy5wYXRoIHx8ICcnKTtcbiAgICBjb25zdCBpZHggPSByb3cuaWR4O1xuICAgIGFjdGlvbkh0bWwgPVxuICAgICAgYDxidXR0b24gZGF0YS1zbS1hY3Rpb249XCJsb2FkXCIgICBkYXRhLXNtLXBhdGg9XCIke2VwfVwiIGNsYXNzPVwic20tYnRuIHNtLWJ0bi1vcGVuIHNtLWJ0bi1pY29uXCIgdGl0bGU9XCJMb2FkIHNlc3Npb25cIiBhcmlhLWxhYmVsPVwiTG9hZCBzZXNzaW9uXCI+PGkgY2xhc3M9XCJmYS1zb2xpZCBmYS1mb2xkZXItb3BlblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT48L2J1dHRvbj5gICtcbiAgICAgIGA8YnV0dG9uIGRhdGEtc20tYWN0aW9uPVwicmVuYW1lXCIgZGF0YS1zbS1wYXRoPVwiJHtlcH1cIiBkYXRhLXNtLWlkeD1cIiR7aWR4fVwiIGNsYXNzPVwic20tYnRuIHNtLWJ0bi1pY29uXCIgdGl0bGU9XCJSZW5hbWUgc2Vzc2lvblwiIGFyaWEtbGFiZWw9XCJSZW5hbWUgc2Vzc2lvblwiPjxpIGNsYXNzPVwiZmEtc29saWQgZmEtcGVuY2lsXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPjwvYnV0dG9uPmAgK1xuICAgICAgYDxidXR0b24gZGF0YS1zbS1hY3Rpb249XCJkdXBsaWNhdGVcIiBkYXRhLXNtLXBhdGg9XCIke2VwfVwiIGNsYXNzPVwic20tYnRuIHNtLWJ0bi1pY29uXCIgdGl0bGU9XCJEdXBsaWNhdGUgc2Vzc2lvblwiIGFyaWEtbGFiZWw9XCJEdXBsaWNhdGUgc2Vzc2lvblwiPjxpIGNsYXNzPVwiZmEtc29saWQgZmEtY29weVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT48L2J1dHRvbj5gICtcbiAgICAgIGA8YnV0dG9uIGRhdGEtc20tYWN0aW9uPVwiZGVsZXRlXCIgZGF0YS1zbS1wYXRoPVwiJHtlcH1cIiBjbGFzcz1cInNtLWJ0biBzbS1idG4tZGFuZ2VyIHNtLWJ0bi1pY29uXCIgdGl0bGU9XCJNb3ZlIHRvIFRyYXNoXCIgYXJpYS1sYWJlbD1cIk1vdmUgc2Vzc2lvbiB0byBUcmFzaFwiPjxpIGNsYXNzPVwiZmEtc29saWQgZmEtdHJhc2hcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+PC9idXR0b24+YDtcbiAgfVxuXG4gIGNvbnN0IHJvd0NsYXNzID0gKHJvdy50eXBlID09PSAnYWN0aXZlJyAmJiByb3cub3duZXJzaGlwLmlzQ3VycmVudCkgPyAnc20tdHIgc20tdHItY3VycmVudCcgOiAnc20tdHInO1xuXG4gIGNvbnN0IGNvbXBhbnlTdWIgPSByb3cuY29tcGFueVxuICAgID8gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC44ZW07Y29sb3I6Izk0YTNiODttYXJnaW4tdG9wOjFweDtcIj4ke2VzY2FwZUh0bWwocm93LmNvbXBhbnkpfTwvZGl2PmBcbiAgICA6ICcnO1xuICBjb25zdCBuYW1lQ2VsbCA9IHJvdy50eXBlID09PSAnc2F2ZWQnXG4gICAgPyBgPHNwYW4gaWQ9XCJzbS1uYW1lLSR7cm93LmlkeH1cIj4ke2VzY2FwZUh0bWwocm93Lm5hbWUpfTwvc3Bhbj5gICtcbiAgICAgIGAke2NvbXBhbnlTdWJ9YCArXG4gICAgICBgPHNwYW4gaWQ9XCJzbS1yZW5hbWUtJHtyb3cuaWR4fVwiIHN0eWxlPVwiZGlzcGxheTpub25lO2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6NHB4O21hcmdpbi10b3A6M3B4O1wiPmAgK1xuICAgICAgICBgPGlucHV0IGlkPVwic20taW5wdXQtJHtyb3cuaWR4fVwiIHR5cGU9XCJ0ZXh0XCIgdmFsdWU9XCIke2VzY2FwZUh0bWwocm93Lm5hbWUpfVwiIGNsYXNzPVwic20ta2V5LWlucHV0XCJgICtcbiAgICAgICAgICBgIGRhdGEtc20tcGF0aD1cIiR7ZXNjYXBlSHRtbChyb3cucGF0aCB8fCAnJyl9XCIgZGF0YS1zbS1pZHg9XCIke3Jvdy5pZHh9XCJgICtcbiAgICAgICAgICBgIHN0eWxlPVwiYm9yZGVyOjFweCBzb2xpZCAjM2I4MmY2O2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6M3B4IDhweDtmb250LXNpemU6MTJweDtmbGV4OjE7bWluLXdpZHRoOjYwcHg7XCI+YCArXG4gICAgICAgIGA8YnV0dG9uIGRhdGEtc20tYWN0aW9uPVwic3VibWl0LXJlbmFtZVwiIGRhdGEtc20tcGF0aD1cIiR7ZXNjYXBlSHRtbChyb3cucGF0aCB8fCAnJyl9XCIgZGF0YS1zbS1pZHg9XCIke3Jvdy5pZHh9XCIgY2xhc3M9XCJzbS1idG5cIiB0aXRsZT1cIlNhdmUgcmVuYW1lXCIgYXJpYS1sYWJlbD1cIlNhdmUgcmVuYW1lXCI+XFx1MjcxMzwvYnV0dG9uPmAgK1xuICAgICAgICBgPGJ1dHRvbiBkYXRhLXNtLWFjdGlvbj1cImNhbmNlbC1yZW5hbWVcIiBkYXRhLXNtLWlkeD1cIiR7cm93LmlkeH1cIiBjbGFzcz1cInNtLWJ0blwiIHRpdGxlPVwiQ2FuY2VsIHJlbmFtZVwiIGFyaWEtbGFiZWw9XCJDYW5jZWwgcmVuYW1lXCI+XFx1MjcxNTwvYnV0dG9uPmAgK1xuICAgICAgYDwvc3Bhbj5gXG4gICAgOiBgPHNwYW4+JHtlc2NhcGVIdG1sKHJvdy5uYW1lKX08L3NwYW4+JHtjb21wYW55U3VifWA7XG5cbiAgY29uc3QgYXBwU3RhdHVzTGFiZWxzID0ge1xuICAgIGRyYWZ0OiAnRHJhZnQnLCByZWFkeTogJ1JlYWR5Jywgc2VudDogJ1NlbnQnLCBxdWV1ZWQ6ICdRdWV1ZWQnLFxuICAgIGludGVydmlldzogJ0ludGVydmlldycsIHJlamVjdGVkOiAnUmVqZWN0ZWQnLCBhY2NlcHRlZDogJ0FjY2VwdGVkJyxcbiAgICBwYXJrZWQ6ICdQYXJrZWQnLFxuICB9O1xuICBjb25zdCBhcHBTdGF0dXNDb2xvcnMgPSB7XG4gICAgZHJhZnQ6ICcjOTRhM2I4JywgcmVhZHk6ICcjM2I4MmY2Jywgc2VudDogJyMyMmM1NWUnLCBxdWV1ZWQ6ICcjZWFiMzA4JyxcbiAgICBpbnRlcnZpZXc6ICcjYTg1NWY3JywgcmVqZWN0ZWQ6ICcjZWY0NDQ0JywgYWNjZXB0ZWQ6ICcjMDU5NjY5JyxcbiAgICBwYXJrZWQ6ICcjZjk3MzE2JyxcbiAgfTtcbiAgY29uc3QgYXBwU3RhdHVzID0gcm93LmFwcGxpY2F0aW9uU3RhdHVzIHx8ICcnO1xuICBjb25zdCBhcHBTdGF0dXNCYWRnZSA9IGFwcFN0YXR1cyAmJiBhcHBTdGF0dXNMYWJlbHNbYXBwU3RhdHVzXVxuICAgID8gYCA8c3BhbiBpZD1cInNtLXN0YXR1cy1iYWRnZS0ke3Jvdy5pZHh9XCIgc3R5bGU9XCJmb250LXNpemU6MC43NWVtO3BhZGRpbmc6MXB4IDZweDtib3JkZXItcmFkaXVzOjlweDtiYWNrZ3JvdW5kOiR7YXBwU3RhdHVzQ29sb3JzW2FwcFN0YXR1c119O2NvbG9yOiNmZmY7dmVydGljYWwtYWxpZ246bWlkZGxlO1wiPiR7YXBwU3RhdHVzTGFiZWxzW2FwcFN0YXR1c119PC9zcGFuPmBcbiAgICA6IGA8c3BhbiBpZD1cInNtLXN0YXR1cy1iYWRnZS0ke3Jvdy5pZHh9XCI+PC9zcGFuPmA7XG5cbiAgLy8gU3RhdHVzLWVkaXQgaW5saW5lIHdpZGdldCAoc2F2ZWQgcm93cyBvbmx5KVxuICBjb25zdCBzdGF0dXNFZGl0V2lkZ2V0ID0gcm93LnR5cGUgPT09ICdzYXZlZCdcbiAgICA/IGA8c3BhbiBpZD1cInNtLXN0YXR1cy1lZGl0LSR7cm93LmlkeH1cIiBzdHlsZT1cImRpc3BsYXk6bm9uZTthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjRweDttYXJnaW4tdG9wOjJweDtcIj5gICtcbiAgICAgICAgYDxzZWxlY3QgaWQ9XCJzbS1zdGF0dXMtc2VsLSR7cm93LmlkeH1cIiBjbGFzcz1cInNtLWtleS1pbnB1dFwiIHN0eWxlPVwiYm9yZGVyOjFweCBzb2xpZCAjM2I4MmY2O2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6MnB4IDRweDtmb250LXNpemU6MTJweDtcIiBhcmlhLWxhYmVsPVwiU2VsZWN0IGFwcGxpY2F0aW9uIHN0YXR1c1wiPmAgK1xuICAgICAgICAgIGA8b3B0aW9uIHZhbHVlPVwiXCI+LS0gY2xlYXIgLS08L29wdGlvbj5gICtcbiAgICAgICAgICBPYmplY3QuZW50cmllcyhhcHBTdGF0dXNMYWJlbHMpLm1hcCgoW3YsIGxdKSA9PlxuICAgICAgICAgICAgYDxvcHRpb24gdmFsdWU9XCIke3Z9XCIke2FwcFN0YXR1cyA9PT0gdiA/ICcgc2VsZWN0ZWQnIDogJyd9PiR7bH08L29wdGlvbj5gXG4gICAgICAgICAgKS5qb2luKCcnKSArXG4gICAgICAgIGA8L3NlbGVjdD5gICtcbiAgICAgICAgYDxidXR0b24gZGF0YS1zbS1hY3Rpb249XCJzdWJtaXQtc3RhdHVzXCIgZGF0YS1zbS1wYXRoPVwiJHtlc2NhcGVIdG1sKHJvdy5wYXRoIHx8ICcnKX1cIiBkYXRhLXNtLWlkeD1cIiR7cm93LmlkeH1cIiBjbGFzcz1cInNtLWJ0blwiIHRpdGxlPVwiU2F2ZSBzdGF0dXNcIiBhcmlhLWxhYmVsPVwiU2F2ZSBzdGF0dXNcIj4mIzEwMDAzOzwvYnV0dG9uPmAgK1xuICAgICAgICBgPGJ1dHRvbiBkYXRhLXNtLWFjdGlvbj1cImNhbmNlbC1zdGF0dXNcIiBkYXRhLXNtLWlkeD1cIiR7cm93LmlkeH1cIiBjbGFzcz1cInNtLWJ0blwiIHRpdGxlPVwiQ2FuY2VsXCIgYXJpYS1sYWJlbD1cIkNhbmNlbCBzdGF0dXMgZWRpdFwiPiYjMTAwMDU7PC9idXR0b24+YCArXG4gICAgICBgPC9zcGFuPmBcbiAgICA6ICcnO1xuXG4gIC8vIE5vdGVzLWVkaXQgaW5saW5lIHdpZGdldCAoc2F2ZWQgcm93cyBvbmx5KVxuICBjb25zdCBub3Rlc1ByZXZpZXcgPSByb3cubm90ZXNcbiAgICA/IGA8ZGl2IGlkPVwic20tbm90ZXMtcHJldmlldy0ke3Jvdy5pZHh9XCIgc3R5bGU9XCJmb250LXNpemU6MC43OGVtO2NvbG9yOiM5NGEzYjg7bWFyZ2luLXRvcDoycHg7bWF4LXdpZHRoOjI2MHB4O292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3doaXRlLXNwYWNlOm5vd3JhcDtcIiB0aXRsZT1cIiR7ZXNjYXBlSHRtbChyb3cubm90ZXMpfVwiPiR7ZXNjYXBlSHRtbChyb3cubm90ZXMpfTwvZGl2PmBcbiAgICA6IGA8ZGl2IGlkPVwic20tbm90ZXMtcHJldmlldy0ke3Jvdy5pZHh9XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7Zm9udC1zaXplOjAuNzhlbTtjb2xvcjojOTRhM2I4O21hcmdpbi10b3A6MnB4O1wiPjwvZGl2PmA7XG4gIGNvbnN0IG5vdGVzRWRpdFdpZGdldCA9IHJvdy50eXBlID09PSAnc2F2ZWQnXG4gICAgPyBgPHNwYW4gaWQ9XCJzbS1ub3Rlcy1lZGl0LSR7cm93LmlkeH1cIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Z2FwOjRweDttYXJnaW4tdG9wOjRweDt3aWR0aDoxMDAlO1wiPmAgK1xuICAgICAgICBgPHRleHRhcmVhIGlkPVwic20tbm90ZXMtdGEtJHtyb3cuaWR4fVwiIHJvd3M9XCIyXCIgbWF4bGVuZ3RoPVwiMjAwMFwiYCArXG4gICAgICAgICAgYCBzdHlsZT1cIndpZHRoOjEwMCU7Zm9udC1zaXplOjEycHg7cGFkZGluZzo0cHg7Ym9yZGVyOjFweCBzb2xpZCAjM2I4MmY2O2JvcmRlci1yYWRpdXM6NHB4O3Jlc2l6ZTp2ZXJ0aWNhbDtcImAgK1xuICAgICAgICAgIGAgYXJpYS1sYWJlbD1cIlNlc3Npb24gbm90ZXNcIiBwbGFjZWhvbGRlcj1cImUuZy4sIEludGVydmlld2VkIDIwMjUtMDMtMTAsIGF3YWl0aW5nIGNhbGxiYWNrXCI+JHtlc2NhcGVIdG1sKHJvdy5ub3RlcyB8fCAnJyl9PC90ZXh0YXJlYT5gICtcbiAgICAgICAgYDxzcGFuIHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDo0cHg7XCI+YCArXG4gICAgICAgICAgYDxidXR0b24gZGF0YS1zbS1hY3Rpb249XCJzdWJtaXQtbm90ZXNcIiBkYXRhLXNtLXBhdGg9XCIke2VzY2FwZUh0bWwocm93LnBhdGggfHwgJycpfVwiIGRhdGEtc20taWR4PVwiJHtyb3cuaWR4fVwiIGNsYXNzPVwic20tYnRuXCIgdGl0bGU9XCJTYXZlIG5vdGVzXCIgYXJpYS1sYWJlbD1cIlNhdmUgbm90ZXNcIj4mIzEwMDAzOzwvYnV0dG9uPmAgK1xuICAgICAgICAgIGA8YnV0dG9uIGRhdGEtc20tYWN0aW9uPVwiY2FuY2VsLW5vdGVzXCIgZGF0YS1zbS1pZHg9XCIke3Jvdy5pZHh9XCIgY2xhc3M9XCJzbS1idG5cIiB0aXRsZT1cIkNhbmNlbFwiIGFyaWEtbGFiZWw9XCJDYW5jZWwgbm90ZXMgZWRpdFwiPiYjMTAwMDU7PC9idXR0b24+YCArXG4gICAgICAgIGA8L3NwYW4+YCArXG4gICAgICBgPC9zcGFuPmBcbiAgICA6ICcnO1xuXG4gIGlmIChyb3cudHlwZSA9PT0gJ3NhdmVkJykge1xuICAgIGFjdGlvbkh0bWwgKz1cbiAgICAgIGA8YnV0dG9uIGRhdGEtc20tYWN0aW9uPVwiZWRpdC1zdGF0dXNcIiBkYXRhLXNtLXBhdGg9XCIke2VzY2FwZUh0bWwocm93LnBhdGggfHwgJycpfVwiIGRhdGEtc20taWR4PVwiJHtyb3cuaWR4fVwiIGNsYXNzPVwic20tYnRuIHNtLWJ0bi1pY29uXCIgdGl0bGU9XCJVcGRhdGUgYXBwbGljYXRpb24gc3RhdHVzXCIgYXJpYS1sYWJlbD1cIlVwZGF0ZSBhcHBsaWNhdGlvbiBzdGF0dXNcIj48aSBjbGFzcz1cImZhLXNvbGlkIGZhLXRhZ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT48L2J1dHRvbj5gO1xuICAgIGFjdGlvbkh0bWwgKz1cbiAgICAgIGA8YnV0dG9uIGRhdGEtc20tYWN0aW9uPVwiZWRpdC1ub3Rlc1wiIGRhdGEtc20tcGF0aD1cIiR7ZXNjYXBlSHRtbChyb3cucGF0aCB8fCAnJyl9XCIgZGF0YS1zbS1pZHg9XCIke3Jvdy5pZHh9XCIgY2xhc3M9XCJzbS1idG4gc20tYnRuLWljb25cIiB0aXRsZT1cIkVkaXQgbm90ZXNcIiBhcmlhLWxhYmVsPVwiRWRpdCBub3Rlc1wiPjxpIGNsYXNzPVwiZmEtc29saWQgZmEtbm90ZS1zdGlja3lcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+PC9idXR0b24+YDtcbiAgfVxuXG4gIGNvbnN0IGF0c1Njb3JlTGFiZWwgPSByb3cuYXRzU2NvcmUgIT0gbnVsbFxuICAgID8gKCgpID0+IHtcbiAgICAgICAgY29uc3QgcyA9IE51bWJlcihyb3cuYXRzU2NvcmUpO1xuICAgICAgICBjb25zdCBjb2xvciA9IHMgPj0gNzUgPyAnIzA1OTY2OScgOiBzID49IDUwID8gJyNkOTc3MDYnIDogJyNkYzI2MjYnO1xuICAgICAgICByZXR1cm4gYCA8c3BhbiB0aXRsZT1cIkFUUyBtYXRjaCBzY29yZVwiIHN0eWxlPVwiZm9udC1zaXplOjAuNzhlbTtwYWRkaW5nOjFweCA1cHg7Ym9yZGVyLXJhZGl1czo5cHg7YmFja2dyb3VuZDoke2NvbG9yfTtjb2xvcjojZmZmO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtmb250LXdlaWdodDo2MDA7XCI+JHtzfSU8L3NwYW4+YDtcbiAgICAgIH0pKClcbiAgICA6ICcnO1xuXG4gIHJldHVybiBgPGRpdiBjbGFzcz1cIiR7cm93Q2xhc3N9XCI+YCArXG4gICAgYDxzcGFuIGNsYXNzPVwic20tdGQgc20tdGQtbmFtZVwiPiR7bmFtZUNlbGx9PC9zcGFuPmAgK1xuICAgIGA8c3BhbiBjbGFzcz1cInNtLXRkIHNtLXRkLXN0YXR1c1wiPiR7c3RhdHVzUGlsbH08L3NwYW4+YCArXG4gICAgYDxzcGFuIGNsYXNzPVwic20tdGQgc20tdGQtcGhhc2VcIj48c3BhbiBpZD1cInNtLXBoYXNlLSR7cm93LmlkeH1cIj4ke3BoYXNlTGFiZWx9JHthdHNTY29yZUxhYmVsfSR7YXBwU3RhdHVzQmFkZ2V9PC9zcGFuPiR7c3RhdHVzRWRpdFdpZGdldH0ke25vdGVzUHJldmlld30ke25vdGVzRWRpdFdpZGdldH08L3NwYW4+YCArXG4gICAgYDxzcGFuIGNsYXNzPVwic20tdGQgc20tdGQtZGF0ZVwiPiR7bW9kTGFiZWx9PC9zcGFuPmAgK1xuICAgIGA8c3BhbiBjbGFzcz1cInNtLXRkIHNtLXRkLWFjdGlvbnNcIj4ke2FjdGlvbkh0bWx9PC9zcGFuPmAgK1xuICAgIGA8L2Rpdj5gO1xufVxuXG5mdW5jdGlvbiBfcmVuZGVyUmVjZW50c1N0cmlwKHJlY2VudFJvd3MpIHtcbiAgaWYgKCFyZWNlbnRSb3dzLmxlbmd0aCkgcmV0dXJuICcnO1xuICBjb25zdCBpdGVtcyA9IHJlY2VudFJvd3MubWFwKHJvdyA9PiB7XG4gICAgY29uc3QgbGFiZWwgICAgPSBlc2NhcGVIdG1sKHJvdy5uYW1lKTtcbiAgICBjb25zdCBkb3RDbGFzcyA9IHJvdy50eXBlID09PSAnYWN0aXZlJ1xuICAgICAgPyAocm93Lm93bmVyc2hpcC5pc0N1cnJlbnQgPyAnc20tcmVjZW50LWRvdC1jdXJyZW50JyA6ICdzbS1yZWNlbnQtZG90LW90aGVyJylcbiAgICAgIDogJ3NtLXJlY2VudC1kb3Qtc2F2ZWQnO1xuICAgIGNvbnN0IGRvdCA9IGA8c3BhbiBjbGFzcz1cInNtLXJlY2VudC1kb3QgJHtkb3RDbGFzc31cIj48L3NwYW4+YDtcbiAgICBpZiAocm93LnR5cGUgPT09ICdhY3RpdmUnKSB7XG4gICAgICBjb25zdCBocmVmICA9IGAvP3Nlc3Npb249JHtlbmNvZGVVUklDb21wb25lbnQocm93LnNlc3Npb25JZCB8fCAnJyl9YDtcbiAgICAgIGNvbnN0IGV4dHJhID0gcm93Lm93bmVyc2hpcC5pc0N1cnJlbnQgPyAnIHNtLXJlY2VudC1jdXJyZW50JyA6ICcnO1xuICAgICAgcmV0dXJuIGA8YSBjbGFzcz1cInNtLXJlY2VudC1pdGVtJHtleHRyYX1cIiBocmVmPVwiJHtocmVmfVwiPiR7ZG90fSR7bGFiZWx9PC9hPmA7XG4gICAgfVxuICAgIHJldHVybiBgPGJ1dHRvbiBjbGFzcz1cInNtLXJlY2VudC1pdGVtXCIgZGF0YS1zbS1hY3Rpb249XCJsb2FkXCIgZGF0YS1zbS1wYXRoPVwiJHtlc2NhcGVIdG1sKHJvdy5wYXRoIHx8ICcnKX1cIj4ke2RvdH0ke2xhYmVsfTwvYnV0dG9uPmA7XG4gIH0pLmpvaW4oJycpO1xuICByZXR1cm4gYDxkaXYgY2xhc3M9XCJzbS1yZWNlbnRzXCI+PGRpdiBjbGFzcz1cInNtLXJlY2VudHMtbGFiZWxcIj5SZWNlbnQ8L2Rpdj48ZGl2IGNsYXNzPVwic20tcmVjZW50cy1saXN0XCI+JHtpdGVtc308L2Rpdj48L2Rpdj5gO1xufVxuXG5mdW5jdGlvbiBfcmVuZGVyU2Vzc2lvblRhYmxlRnJvbUNhY2hlKCkge1xuICBjb25zdCBib2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Nlc3Npb25zLW1vZGFsLWJvZHknKTtcbiAgaWYgKCFib2R5KSByZXR1cm47XG5cbiAgY29uc3Qgcm93cyAgID0gX25vcm1hbGl6ZVNlc3Npb25zRm9yVGFibGUoX3NtQWN0aXZlQ2FjaGUsIF9zbVNhdmVkQ2FjaGUpO1xuICBjb25zdCBieURhdGUgPSBfc29ydFNlc3Npb25Sb3dzKHJvd3MsICdsYXN0TW9kaWZpZWQnLCAnZGVzYycpO1xuICBjb25zdCBzb3J0ZWQgPSBfc29ydFNlc3Npb25Sb3dzKHJvd3MsIF9zbVNvcnRLZXksIF9zbVNvcnREaXIpO1xuXG4gIGlmIChzb3J0ZWQubGVuZ3RoID09PSAwKSB7XG4gICAgYm9keS5pbm5lckhUTUwgPSAnPHAgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLWVtcHR5XCIgc3R5bGU9XCJwYWRkaW5nOjI0cHggMTZweDtcIj5ObyBzZXNzaW9ucyBmb3VuZC4gQ3JlYXRlIG9uZSB0byBnZXQgc3RhcnRlZC48L3A+JztcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwYXJ0cyA9IFtcbiAgICBfc21BY3RpdmVDYWNoZS5sZW5ndGggPyBgJHtfc21BY3RpdmVDYWNoZS5sZW5ndGh9IGFjdGl2ZWAgOiAnJyxcbiAgICBfc21TYXZlZENhY2hlLmxlbmd0aCAgPyBgJHtfc21TYXZlZENhY2hlLmxlbmd0aH0gc2F2ZWRgICAgOiAnJyxcbiAgXS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgYm9keS5pbm5lckhUTUwgPVxuICAgIF9yZW5kZXJSZWNlbnRzU3RyaXAoYnlEYXRlLnNsaWNlKDAsIDUpKSArXG4gICAgYDxkaXYgY2xhc3M9XCJzbS10YWJsZS13cmFwXCI+YCArXG4gICAgICBgPGRpdiBjbGFzcz1cInNtLXRhYmxlLWluZm9cIj4ke3BhcnRzLmpvaW4oJyBcXHUwMGI3ICcpfTwvZGl2PmAgK1xuICAgICAgX3JlbmRlclNlc3Npb25UYWJsZUhlYWRlcigpICtcbiAgICAgIGA8ZGl2IGNsYXNzPVwic20tdGJvZHlcIj4ke3NvcnRlZC5tYXAoX3JlbmRlclNlc3Npb25UYWJsZVJvdykuam9pbignJyl9PC9kaXY+YCArXG4gICAgYDwvZGl2PmA7XG59XG5cbmZ1bmN0aW9uIF9oYW5kbGVTZXNzaW9uTW9kYWxDbGljayhlKSB7XG4gIGNvbnN0IHNvcnRCdG4gPSBlLnRhcmdldC5jbG9zZXN0KCdbZGF0YS1zbS1zb3J0XScpO1xuICBpZiAoc29ydEJ0bikgeyBfc2V0U21Tb3J0KHNvcnRCdG4uZGF0YXNldC5zbVNvcnQpOyByZXR1cm47IH1cblxuICBjb25zdCBidG4gPSBlLnRhcmdldC5jbG9zZXN0KCdbZGF0YS1zbS1hY3Rpb25dJyk7XG4gIGlmICghYnRuKSByZXR1cm47XG4gIGNvbnN0IHBhdGggICA9IGJ0bi5kYXRhc2V0LnNtUGF0aDtcbiAgY29uc3QgaWR4ICAgID0gcGFyc2VJbnQoYnRuLmRhdGFzZXQuc21JZHggPz8gJy0xJywgMTApO1xuICBjb25zdCBhY3Rpb24gPSBidG4uZGF0YXNldC5zbUFjdGlvbjtcbiAgaWYgICAgICAoYWN0aW9uID09PSAncmVuYW1lJykgICAgICAgIHN0YXJ0U2Vzc2lvbk1vZGFsUmVuYW1lKHBhdGgsIGlkeCk7XG4gIGVsc2UgaWYgKGFjdGlvbiA9PT0gJ3N1Ym1pdC1yZW5hbWUnKSBzdWJtaXRTZXNzaW9uTW9kYWxSZW5hbWUocGF0aCwgaWR4KTtcbiAgZWxzZSBpZiAoYWN0aW9uID09PSAnY2FuY2VsLXJlbmFtZScpIGNhbmNlbFNlc3Npb25Nb2RhbFJlbmFtZShpZHgpO1xuICBlbHNlIGlmIChhY3Rpb24gPT09ICdlZGl0LXN0YXR1cycpICAgc3RhcnRTZXNzaW9uU3RhdHVzRWRpdChpZHgpO1xuICBlbHNlIGlmIChhY3Rpb24gPT09ICdzdWJtaXQtc3RhdHVzJykgc3VibWl0U2Vzc2lvblN0YXR1c0VkaXQocGF0aCwgaWR4KTtcbiAgZWxzZSBpZiAoYWN0aW9uID09PSAnY2FuY2VsLXN0YXR1cycpIGNhbmNlbFNlc3Npb25TdGF0dXNFZGl0KGlkeCk7XG4gIGVsc2UgaWYgKGFjdGlvbiA9PT0gJ2VkaXQtbm90ZXMnKSAgICBzdGFydFNlc3Npb25Ob3Rlc0VkaXQoaWR4KTtcbiAgZWxzZSBpZiAoYWN0aW9uID09PSAnc3VibWl0LW5vdGVzJykgIHN1Ym1pdFNlc3Npb25Ob3Rlc0VkaXQocGF0aCwgaWR4KTtcbiAgZWxzZSBpZiAoYWN0aW9uID09PSAnY2FuY2VsLW5vdGVzJykgIGNhbmNlbFNlc3Npb25Ob3Rlc0VkaXQoaWR4KTtcbiAgZWxzZSBpZiAoYWN0aW9uID09PSAnbG9hZCcpICAgICAgICAgIGxvYWRTZXNzaW9uQW5kQ2xvc2VNb2RhbChwYXRoKTtcbiAgZWxzZSBpZiAoYWN0aW9uID09PSAnZHVwbGljYXRlJykgICAgIF9kdXBsaWNhdGVTZXNzaW9uRnJvbU1vZGFsKHBhdGgpO1xuICBlbHNlIGlmIChhY3Rpb24gPT09ICdkZWxldGUnKSAgICAgICAgX2RlbGV0ZVNlc3Npb25Gcm9tTW9kYWwocGF0aCwgZSk7XG59XG5cbmZ1bmN0aW9uIF9oYW5kbGVTZXNzaW9uTW9kYWxLZXlkb3duKGUpIHtcbiAgaWYgKChlLmtleSA9PT0gJ0VudGVyJyB8fCBlLmtleSA9PT0gJyAnKSAmJiBlLnRhcmdldC5jbG9zZXN0KCdbZGF0YS1zbS1zb3J0XScpKSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIF9zZXRTbVNvcnQoZS50YXJnZXQuY2xvc2VzdCgnW2RhdGEtc20tc29ydF0nKS5kYXRhc2V0LnNtU29ydCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGlucHV0ID0gZS50YXJnZXQuY2xvc2VzdCgnLnNtLWtleS1pbnB1dCcpO1xuICBpZiAoIWlucHV0KSByZXR1cm47XG4gIGNvbnN0IHBhdGggPSBpbnB1dC5kYXRhc2V0LnNtUGF0aDtcbiAgY29uc3QgaWR4ICA9IHBhcnNlSW50KGlucHV0LmRhdGFzZXQuc21JZHgsIDEwKTtcbiAgaWYgICAgICAoZS5rZXkgPT09ICdFbnRlcicpICBzdWJtaXRTZXNzaW9uTW9kYWxSZW5hbWUocGF0aCwgaWR4KTtcbiAgZWxzZSBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSBjYW5jZWxTZXNzaW9uTW9kYWxSZW5hbWUoaWR4KTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFNlc3Npb25zIG1vZGFsIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBvcGVuU2Vzc2lvbnNNb2RhbCh7IHJlcXVpcmVkID0gZmFsc2UgfSA9IHt9KSB7XG4gIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2Vzc2lvbnMtbW9kYWwtb3ZlcmxheScpO1xuICBpZiAoIW92ZXJsYXkpIHJldHVybjtcbiAgb3ZlcmxheS5kYXRhc2V0LmRpc21pc3NEaXNhYmxlZCA9IHJlcXVpcmVkID8gJzEnIDogJyc7XG4gIGNvbnN0IGNsb3NlWCAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Nlc3Npb25zLW1vZGFsLWNsb3NlLXgnKTtcbiAgY29uc3QgY2xvc2VGb290ZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2Vzc2lvbnMtbW9kYWwtY2xvc2UtZm9vdGVyJyk7XG4gIGlmIChjbG9zZVgpICAgICAgY2xvc2VYLnN0eWxlLmRpc3BsYXkgICAgICA9IHJlcXVpcmVkID8gJ25vbmUnIDogJyc7XG4gIGlmIChjbG9zZUZvb3RlcikgY2xvc2VGb290ZXIuc3R5bGUuZGlzcGxheSA9IHJlcXVpcmVkID8gJ25vbmUnIDogJyc7XG4gIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgd2luZG93Ll9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgYXdhaXQgX3JlbmRlclNlc3Npb25zTW9kYWxCb2R5KCk7XG4gIF9yZWZyZXNoVHJhc2hCYWRnZSgpO1xuICB0cmFwRm9jdXMoJ3Nlc3Npb25zLW1vZGFsLW92ZXJsYXknKTtcbiAgc2V0SW5pdGlhbEZvY3VzKCdzZXNzaW9ucy1tb2RhbC1vdmVybGF5Jyk7XG59XG5cbmZ1bmN0aW9uIGNsb3NlU2Vzc2lvbnNNb2RhbCgpIHtcbiAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXNzaW9ucy1tb2RhbC1vdmVybGF5Jyk7XG4gIGlmICghb3ZlcmxheSkgcmV0dXJuO1xuICBpZiAob3ZlcmxheS5kYXRhc2V0LmRpc21pc3NEaXNhYmxlZCA9PT0gJzEnKSByZXR1cm47XG4gIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgcmVzdG9yZUZvY3VzKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9yZW5kZXJTZXNzaW9uc01vZGFsQm9keSgpIHtcbiAgY29uc3QgYm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXNzaW9ucy1tb2RhbC1ib2R5Jyk7XG4gIGlmICghYm9keSkgcmV0dXJuO1xuICBib2R5LmlubmVySFRNTCA9ICc8ZGl2IHN0eWxlPVwicGFkZGluZzoyNHB4O2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjtnYXA6MTBweDtjb2xvcjojNmI3MjgwO1wiPjxzcGFuIGNsYXNzPVwibG9hZGluZy1zcGlubmVyXCI+PC9zcGFuPiBMb2FkaW5nIHNlc3Npb25zXFx1MjAyNjwvZGl2Pic7XG4gIHRyeSB7XG4gICAgY29uc3QgW2FjdGl2ZVJlcywgc2F2ZWRSZXNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgZmV0Y2goJy9hcGkvc2Vzc2lvbnMvYWN0aXZlJyksXG4gICAgICBmZXRjaCgnL2FwaS9zZXNzaW9ucycpLFxuICAgIF0pO1xuICAgIF9zbUFjdGl2ZUNhY2hlID0gYWN0aXZlUmVzLm9rID8gKChhd2FpdCBhY3RpdmVSZXMuanNvbigpKS5zZXNzaW9ucyB8fCBbXSkgOiBbXTtcbiAgICBjb25zdCBzYXZlZERhdGEgPSBzYXZlZFJlcy5vayA/IHBhcnNlU2Vzc2lvbkxpc3RSZXNwb25zZShhd2FpdCBzYXZlZFJlcy5qc29uKCkpIDogeyBzZXNzaW9uczogW10gfTtcbiAgICBfc21TYXZlZENhY2hlICAgPSBzYXZlZERhdGEuc2Vzc2lvbnMgfHwgW107XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBib2R5LmlubmVySFRNTCA9IGA8cCBzdHlsZT1cInBhZGRpbmc6MjBweDtjb2xvcjojZWY0NDQ0O1wiPkNvdWxkIG5vdCBsb2FkIHNlc3Npb25zOiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX08L3A+YDtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gV2lyZSBldmVudCBkZWxlZ2F0aW9uIG9uY2U7IHBlcnNpc3RzIGFjcm9zcyByZS1yZW5kZXJzIHNpbmNlIGJvZHkgZWxlbWVudCBpcyBzdGFibGVcbiAgaWYgKCFib2R5Ll9zbUxpc3RlbmVyQXR0YWNoZWQpIHtcbiAgICBib2R5Ll9zbUxpc3RlbmVyQXR0YWNoZWQgPSB0cnVlO1xuICAgIGJvZHkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAgIF9oYW5kbGVTZXNzaW9uTW9kYWxDbGljayk7XG4gICAgYm9keS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgX2hhbmRsZVNlc3Npb25Nb2RhbEtleWRvd24pO1xuICB9XG4gIF9yZW5kZXJTZXNzaW9uVGFibGVGcm9tQ2FjaGUoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9hZFNlc3Npb25BbmRDbG9zZU1vZGFsKHBhdGgpIHtcbiAgLy8gQ2xlYXIgZGlzbWlzc0Rpc2FibGVkIHNvIGxvYWRpbmcgYSBzZXNzaW9uIGFsd2F5cyBjbG9zZXMgdGhlIG1vZGFsLFxuICAvLyBldmVuIHdoZW4gaXQgd2FzIG9wZW5lZCBpbiByZXF1aXJlZCAoc3RhcnR1cCkgbW9kZS5cbiAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXNzaW9ucy1tb2RhbC1vdmVybGF5Jyk7XG4gIGlmIChvdmVybGF5KSBvdmVybGF5LmRhdGFzZXQuZGlzbWlzc0Rpc2FibGVkID0gJyc7XG4gIGNsb3NlU2Vzc2lvbnNNb2RhbCgpO1xuICBhd2FpdCBsb2FkU2Vzc2lvbkZpbGUocGF0aCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG5ld1Nlc3Npb25Gcm9tTW9kYWwoKSB7XG4gIGNsb3NlU2Vzc2lvbnNNb2RhbCgpO1xuICBhd2FpdCBjcmVhdGVOZXdTZXNzaW9uQW5kTmF2aWdhdGUoKTtcbn1cblxuZnVuY3Rpb24gc3RhcnRTZXNzaW9uTW9kYWxSZW5hbWUocGF0aCwgaWR4KSB7XG4gIGNvbnN0IG5hbWVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzbS1uYW1lLSR7aWR4fWApO1xuICBjb25zdCBmb3JtICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc20tcmVuYW1lLSR7aWR4fWApO1xuICBpZiAobmFtZUVsKSBuYW1lRWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgaWYgKGZvcm0pICAgZm9ybS5zdHlsZS5kaXNwbGF5ICAgPSAnZmxleCc7XG4gIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNtLWlucHV0LSR7aWR4fWApO1xuICBpZiAoaW5wdXQpIHsgaW5wdXQuZm9jdXMoKTsgaW5wdXQuc2VsZWN0KCk7IH1cbn1cblxuZnVuY3Rpb24gY2FuY2VsU2Vzc2lvbk1vZGFsUmVuYW1lKGlkeCkge1xuICBjb25zdCBuYW1lRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc20tbmFtZS0ke2lkeH1gKTtcbiAgY29uc3QgZm9ybSAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNtLXJlbmFtZS0ke2lkeH1gKTtcbiAgaWYgKGZvcm0pICAgZm9ybS5zdHlsZS5kaXNwbGF5ICAgPSAnbm9uZSc7XG4gIGlmIChuYW1lRWwpIG5hbWVFbC5zdHlsZS5kaXNwbGF5ID0gJyc7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN1Ym1pdFNlc3Npb25Nb2RhbFJlbmFtZShwYXRoLCBpZHgpIHtcbiAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc20taW5wdXQtJHtpZHh9YCk7XG4gIGlmICghaW5wdXQpIHJldHVybjtcbiAgY29uc3QgbmV3TmFtZSA9IGlucHV0LnZhbHVlLnRyaW0oKTtcbiAgaWYgKCFuZXdOYW1lKSByZXR1cm47XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL3JlbmFtZS1zZXNzaW9uJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBwYXRoLCBuZXdfbmFtZTogbmV3TmFtZSB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgY29uc3QgbmFtZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNtLW5hbWUtJHtpZHh9YCk7XG4gICAgICBpZiAobmFtZUVsKSBuYW1lRWwudGV4dENvbnRlbnQgPSBuZXdOYW1lO1xuICAgICAgY2FuY2VsU2Vzc2lvbk1vZGFsUmVuYW1lKGlkeCk7XG4gICAgICBhd2FpdCBmZXRjaFN0YXR1cygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHlwZW9mIHNob3dUb2FzdCA9PT0gJ2Z1bmN0aW9uJykgc2hvd1RvYXN0KGBSZW5hbWUgZmFpbGVkOiAke2RhdGEuZXJyb3J9YCwgJ2Vycm9yJyk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7IGlmICh0eXBlb2Ygc2hvd1RvYXN0ID09PSAnZnVuY3Rpb24nKSBzaG93VG9hc3QoYFJlbmFtZSBlcnJvcjogJHtlLm1lc3NhZ2V9YCwgJ2Vycm9yJyk7IH1cbn1cblxuZnVuY3Rpb24gc3RhcnRTZXNzaW9uU3RhdHVzRWRpdChpZHgpIHtcbiAgY29uc3QgcGhhc2VFbCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc20tcGhhc2UtJHtpZHh9YCk7XG4gIGNvbnN0IGVkaXRXaWRnZXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc20tc3RhdHVzLWVkaXQtJHtpZHh9YCk7XG4gIGlmIChwaGFzZUVsKSAgICBwaGFzZUVsLnN0eWxlLmRpc3BsYXkgICAgPSAnbm9uZSc7XG4gIGlmIChlZGl0V2lkZ2V0KSBlZGl0V2lkZ2V0LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIGNvbnN0IHNlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzbS1zdGF0dXMtc2VsLSR7aWR4fWApO1xuICBpZiAoc2VsKSBzZWwuZm9jdXMoKTtcbn1cblxuZnVuY3Rpb24gY2FuY2VsU2Vzc2lvblN0YXR1c0VkaXQoaWR4KSB7XG4gIGNvbnN0IHBoYXNlRWwgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc20tcGhhc2UtJHtpZHh9YCk7XG4gIGNvbnN0IGVkaXRXaWRnZXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc20tc3RhdHVzLWVkaXQtJHtpZHh9YCk7XG4gIGlmIChlZGl0V2lkZ2V0KSBlZGl0V2lkZ2V0LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIGlmIChwaGFzZUVsKSAgICBwaGFzZUVsLnN0eWxlLmRpc3BsYXkgICAgPSAnJztcbn1cblxuYXN5bmMgZnVuY3Rpb24gc3VibWl0U2Vzc2lvblN0YXR1c0VkaXQocGF0aCwgaWR4KSB7XG4gIGNvbnN0IHNlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzbS1zdGF0dXMtc2VsLSR7aWR4fWApO1xuICBpZiAoIXNlbCkgcmV0dXJuO1xuICBjb25zdCBuZXdTdGF0dXMgPSBzZWwudmFsdWU7XG4gIGNvbnN0IF9hcHBTdGF0dXNMYWJlbHMgPSB7XG4gICAgZHJhZnQ6ICdEcmFmdCcsIHJlYWR5OiAnUmVhZHknLCBzZW50OiAnU2VudCcsIHF1ZXVlZDogJ1F1ZXVlZCcsXG4gICAgaW50ZXJ2aWV3OiAnSW50ZXJ2aWV3JywgcmVqZWN0ZWQ6ICdSZWplY3RlZCcsIGFjY2VwdGVkOiAnQWNjZXB0ZWQnLFxuICAgIHBhcmtlZDogJ1BhcmtlZCcsXG4gIH07XG4gIGNvbnN0IF9hcHBTdGF0dXNDb2xvcnMgPSB7XG4gICAgZHJhZnQ6ICcjOTRhM2I4JywgcmVhZHk6ICcjM2I4MmY2Jywgc2VudDogJyMyMmM1NWUnLCBxdWV1ZWQ6ICcjZWFiMzA4JyxcbiAgICBpbnRlcnZpZXc6ICcjYTg1NWY3JywgcmVqZWN0ZWQ6ICcjZWY0NDQ0JywgYWNjZXB0ZWQ6ICcjMDU5NjY5JyxcbiAgICBwYXJrZWQ6ICcjZjk3MzE2JyxcbiAgfTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvc2Vzc2lvbnMvbWV0YWRhdGEnLCB7XG4gICAgICBtZXRob2Q6ICdQQVRDSCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBwYXRoLCBhcHBsaWNhdGlvbl9zdGF0dXM6IG5ld1N0YXR1cyB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgY29uc3QgYmFkZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc20tc3RhdHVzLWJhZGdlLSR7aWR4fWApO1xuICAgICAgaWYgKGJhZGdlKSB7XG4gICAgICAgIGlmIChuZXdTdGF0dXMgJiYgX2FwcFN0YXR1c0xhYmVsc1tuZXdTdGF0dXNdKSB7XG4gICAgICAgICAgYmFkZ2UudGV4dENvbnRlbnQgPSBfYXBwU3RhdHVzTGFiZWxzW25ld1N0YXR1c107XG4gICAgICAgICAgYmFkZ2Uuc3R5bGUuY3NzVGV4dCA9IGBmb250LXNpemU6MC43NWVtO3BhZGRpbmc6MXB4IDZweDtib3JkZXItcmFkaXVzOjlweDtiYWNrZ3JvdW5kOiR7X2FwcFN0YXR1c0NvbG9yc1tuZXdTdGF0dXNdfTtjb2xvcjojZmZmO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtgO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJhZGdlLnRleHRDb250ZW50ID0gJyc7XG4gICAgICAgICAgYmFkZ2Uuc3R5bGUuY3NzVGV4dCA9ICcnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjYW5jZWxTZXNzaW9uU3RhdHVzRWRpdChpZHgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHlwZW9mIHNob3dUb2FzdCA9PT0gJ2Z1bmN0aW9uJykgc2hvd1RvYXN0KGBTdGF0dXMgdXBkYXRlIGZhaWxlZDogJHtkYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yJ31gLCAnZXJyb3InKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAodHlwZW9mIHNob3dUb2FzdCA9PT0gJ2Z1bmN0aW9uJykgc2hvd1RvYXN0KGBTdGF0dXMgdXBkYXRlIGVycm9yOiAke2UubWVzc2FnZX1gLCAnZXJyb3InKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzdGFydFNlc3Npb25Ob3Rlc0VkaXQoaWR4KSB7XG4gIGNvbnN0IGVkaXRXaWRnZXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc20tbm90ZXMtZWRpdC0ke2lkeH1gKTtcbiAgY29uc3QgcHJldmlldyAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzbS1ub3Rlcy1wcmV2aWV3LSR7aWR4fWApO1xuICBpZiAocHJldmlldykgICAgcHJldmlldy5zdHlsZS5kaXNwbGF5ICAgID0gJ25vbmUnO1xuICBpZiAoZWRpdFdpZGdldCkgZWRpdFdpZGdldC5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICBjb25zdCB0YSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzbS1ub3Rlcy10YS0ke2lkeH1gKTtcbiAgaWYgKHRhKSB7IHRhLmZvY3VzKCk7IHRhLnNlbGVjdGlvblN0YXJ0ID0gdGEuc2VsZWN0aW9uRW5kID0gdGEudmFsdWUubGVuZ3RoOyB9XG59XG5cbmZ1bmN0aW9uIGNhbmNlbFNlc3Npb25Ob3Rlc0VkaXQoaWR4KSB7XG4gIGNvbnN0IGVkaXRXaWRnZXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc20tbm90ZXMtZWRpdC0ke2lkeH1gKTtcbiAgY29uc3QgcHJldmlldyAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzbS1ub3Rlcy1wcmV2aWV3LSR7aWR4fWApO1xuICBpZiAoZWRpdFdpZGdldCkgZWRpdFdpZGdldC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBpZiAocHJldmlldykgICAgcHJldmlldy5zdHlsZS5kaXNwbGF5ICAgID0gJyc7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN1Ym1pdFNlc3Npb25Ob3Rlc0VkaXQocGF0aCwgaWR4KSB7XG4gIGNvbnN0IHRhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNtLW5vdGVzLXRhLSR7aWR4fWApO1xuICBpZiAoIXRhKSByZXR1cm47XG4gIGNvbnN0IG5ld05vdGVzID0gdGEudmFsdWU7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL3Nlc3Npb25zL21ldGFkYXRhJywge1xuICAgICAgbWV0aG9kOiAnUEFUQ0gnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcGF0aCwgbm90ZXM6IG5ld05vdGVzIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBjb25zdCBwcmV2aWV3ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNtLW5vdGVzLXByZXZpZXctJHtpZHh9YCk7XG4gICAgICBpZiAocHJldmlldykge1xuICAgICAgICBwcmV2aWV3LnRleHRDb250ZW50ID0gbmV3Tm90ZXM7XG4gICAgICAgIHByZXZpZXcudGl0bGUgICAgICAgPSBuZXdOb3RlcztcbiAgICAgICAgcHJldmlldy5zdHlsZS5kaXNwbGF5ID0gbmV3Tm90ZXMgPyAnJyA6ICdub25lJztcbiAgICAgIH1cbiAgICAgIGNhbmNlbFNlc3Npb25Ob3Rlc0VkaXQoaWR4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHNob3dUb2FzdChgTm90ZXMgdXBkYXRlIGZhaWxlZDogJHtkYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yJ31gLCAnZXJyb3InKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAodHlwZW9mIHNob3dUb2FzdCA9PT0gJ2Z1bmN0aW9uJykgc2hvd1RvYXN0KGBOb3RlcyB1cGRhdGUgZXJyb3I6ICR7ZS5tZXNzYWdlfWAsICdlcnJvcicpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9kZWxldGVTZXNzaW9uRnJvbU1vZGFsKHBhdGgsIGV2ZW50KSB7XG4gIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICBpZiAodHlwZW9mIGNvbmZpcm1EaWFsb2cgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25zdCBvayA9IGF3YWl0IGNvbmZpcm1EaWFsb2coJ01vdmUgdGhpcyBzZXNzaW9uIHRvIFRyYXNoPyBZb3UgY2FuIHJlc3RvcmUgaXQgZnJvbSB0aGUgVHJhc2ggdmlldy4nKTtcbiAgICBpZiAoIW9rKSByZXR1cm47XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvZGVsZXRlLXNlc3Npb24nLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHBhdGggfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgYXdhaXQgX3JlbmRlclNlc3Npb25zTW9kYWxCb2R5KCk7XG4gICAgICBhd2FpdCBfcmVmcmVzaFRyYXNoQmFkZ2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHNob3dUb2FzdChgRmFpbGVkIHRvIG1vdmUgc2Vzc2lvbiB0byBUcmFzaDogJHtkYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yJ31gLCAnZXJyb3InKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHsgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHNob3dUb2FzdChgRXJyb3I6ICR7ZS5tZXNzYWdlfWAsICdlcnJvcicpOyB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBEdXBsaWNhdGUgc2Vzc2lvbiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gX2R1cGxpY2F0ZVNlc3Npb25Gcm9tTW9kYWwocGF0aCkge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9zZXNzaW9ucy9kdXBsaWNhdGUnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHBhdGggfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEub2spIHtcbiAgICAgIGF3YWl0IF9yZW5kZXJTZXNzaW9uc01vZGFsQm9keSgpO1xuICAgICAgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHNob3dUb2FzdChgU2Vzc2lvbiBkdXBsaWNhdGVkOiBcIiR7ZGF0YS5uZXdfbmFtZX1cImApO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHlwZW9mIHNob3dUb2FzdCA9PT0gJ2Z1bmN0aW9uJykgc2hvd1RvYXN0KGBGYWlsZWQgdG8gZHVwbGljYXRlIHNlc3Npb246ICR7ZGF0YS5lcnJvciB8fCAnVW5rbm93biBlcnJvcid9YCwgJ2Vycm9yJyk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7IGlmICh0eXBlb2Ygc2hvd1RvYXN0ID09PSAnZnVuY3Rpb24nKSBzaG93VG9hc3QoYEVycm9yOiAke2UubWVzc2FnZX1gLCAnZXJyb3InKTsgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgVHJhc2ggYmFkZ2UgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIF9yZWZyZXNoVHJhc2hCYWRnZSgpIHtcbiAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Nlc3Npb25zLXRyYXNoLWJ0bicpO1xuICBpZiAoIWJ0bikgcmV0dXJuO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS90cmFzaCcpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGNvbnN0IG4gPSAoZGF0YS5pdGVtcyB8fCBbXSkubGVuZ3RoO1xuICAgIGJ0bi50ZXh0Q29udGVudCA9IG4gPiAwID8gYFx1RDgzRFx1REREMSBUcmFzaCAoJHtufSlgIDogJ1x1RDgzRFx1REREMSBUcmFzaCc7XG4gIH0gY2F0Y2ggKF8pIHsgLyogaWdub3JlICovIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIFRyYXNoIHZpZXcgKGlubGluZSBpbiBzZXNzaW9ucyBtb2RhbCkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIG9wZW5UcmFzaFZpZXcoKSB7XG4gIGNvbnN0IGJvZHkgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXNzaW9ucy1tb2RhbC1ib2R5Jyk7XG4gIGNvbnN0IGZvb3RlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzZXNzaW9ucy1tb2RhbC1vdmVybGF5IC5tb2RhbC1mb290ZXInKTtcbiAgaWYgKCFib2R5KSByZXR1cm47XG5cbiAgYm9keS5pbm5lckhUTUwgPSAnPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjEycHg7cGFkZGluZzoyNHB4O2NvbG9yOiM2YjcyODA7XCI+PGRpdiBjbGFzcz1cImxvYWRpbmctc3Bpbm5lclwiIHN0eWxlPVwid2lkdGg6MjBweDtoZWlnaHQ6MjBweDtib3JkZXItd2lkdGg6MnB4O2ZsZXgtc2hyaW5rOjA7XCI+PC9kaXY+PHNwYW4+TG9hZGluZyB0cmFzaFx1MjAyNjwvc3Bhbj48L2Rpdj4nO1xuXG4gIGlmIChmb290ZXIpIHtcbiAgICBmb290ZXIuaW5uZXJIVE1MID0gYFxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwiZW1wdHlUcmFzaCgpXCJcbiAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZWUyZTI7Y29sb3I6I2RjMjYyNjtib3JkZXItY29sb3I6I2ZlY2FjYTtcIj5FbXB0eSBUcmFzaDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwiY2xvc2VUcmFzaFZpZXcoKVwiPlx1MjE5MCBCYWNrPC9idXR0b24+YDtcbiAgfVxuXG4gIGF3YWl0IF9yZW5kZXJUcmFzaFZpZXcoKTtcbn1cblxuZnVuY3Rpb24gY2xvc2VUcmFzaFZpZXcoKSB7XG4gIGNvbnN0IGZvb3RlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzZXNzaW9ucy1tb2RhbC1vdmVybGF5IC5tb2RhbC1mb290ZXInKTtcbiAgaWYgKGZvb3Rlcikge1xuICAgIGZvb3Rlci5pbm5lckhUTUwgPSBgXG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0blwiIG9uY2xpY2s9XCJuZXdTZXNzaW9uRnJvbU1vZGFsKClcIlxuICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6IzEwYjk4MTtjb2xvcjojZmZmO2JvcmRlci1jb2xvcjojMTBiOTgxO1wiPlx1RkYwQiBOZXcgU2Vzc2lvbjwvYnV0dG9uPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6OHB4O2FsaWduLWl0ZW1zOmNlbnRlcjtcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInNlc3Npb25zLXRyYXNoLWJ0blwiIGNsYXNzPVwiYWN0aW9uLWJ0blwiXG4gICAgICAgICAgb25jbGljaz1cIm9wZW5UcmFzaFZpZXcoKVwiXG4gICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmMWY1Zjk7Y29sb3I6IzY0NzQ4Yjtib3JkZXItY29sb3I6I2UyZThmMDtcIj5cdUQ4M0RcdURERDEgVHJhc2g8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwiY2xvc2VTZXNzaW9uc01vZGFsKClcIj5DbG9zZTwvYnV0dG9uPlxuICAgICAgPC9kaXY+YDtcbiAgfVxuICBfcmVuZGVyU2Vzc2lvbnNNb2RhbEJvZHkoKTtcbiAgX3JlZnJlc2hUcmFzaEJhZGdlKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9yZW5kZXJUcmFzaFZpZXcoKSB7XG4gIGNvbnN0IGJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2Vzc2lvbnMtbW9kYWwtYm9keScpO1xuICBpZiAoIWJvZHkpIHJldHVybjtcbiAgbGV0IGl0ZW1zID0gW107XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL3RyYXNoJyk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaXRlbXMgPSBkYXRhLml0ZW1zIHx8IFtdO1xuICB9IGNhdGNoIChlKSB7XG4gICAgYm9keS5pbm5lckhUTUwgPSBgPHAgc3R5bGU9XCJwYWRkaW5nOjIwcHg7Y29sb3I6I2VmNDQ0NDtcIj5Db3VsZCBub3QgbG9hZCB0cmFzaDogJHtlc2NhcGVIdG1sKGUubWVzc2FnZSl9PC9wPmA7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChpdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICBib2R5LmlubmVySFRNTCA9ICc8cCBzdHlsZT1cInBhZGRpbmc6MjRweDt0ZXh0LWFsaWduOmNlbnRlcjtjb2xvcjojNmI3MjgwO1wiPlRyYXNoIGlzIGVtcHR5LjwvcD4nO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZtdERhdGUodHMpIHtcbiAgICBpZiAoIXRzKSByZXR1cm4gJyc7XG4gICAgdHJ5IHsgcmV0dXJuIG5ldyBEYXRlKHRzKS50b0xvY2FsZURhdGVTdHJpbmcoJ2VuLVVTJywgeyBtb250aDogJ3Nob3J0JywgZGF5OiAnbnVtZXJpYycsIHllYXI6ICdudW1lcmljJyB9KTsgfVxuICAgIGNhdGNoIHsgcmV0dXJuIHRzLnNsaWNlKDAsIDEwKTsgfVxuICB9XG5cbiAgbGV0IGh0bWwgPSAnPHRhYmxlIHN0eWxlPVwid2lkdGg6MTAwJTtib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7XCI+JztcbiAgaXRlbXMuZm9yRWFjaChzID0+IHtcbiAgICBjb25zdCBlcCA9IGVzY2FwZUh0bWwocy5wYXRoKTtcbiAgICBodG1sICs9IGBcbiAgICAgIDx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206MXB4IHNvbGlkICNmMWY1Zjk7dmVydGljYWwtYWxpZ246dG9wO1wiPlxuICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOjEycHggMTZweDtcIj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6NjAwO2NvbG9yOiMxZTI5M2I7XCI+JHtlc2NhcGVIdG1sKHMucG9zaXRpb25fbmFtZSB8fCAnVW50aXRsZWQnKX08L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjEycHg7Y29sb3I6Izk0YTNiODttYXJnaW4tdG9wOjJweDtcIj4ke2ZtdERhdGUocy50aW1lc3RhbXApfSR7cy5waGFzZSA/ICcgXHUwMEI3ICcgKyBlc2NhcGVIdG1sKHMucGhhc2UpIDogJyd9PC9kaXY+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cInBhZGRpbmc6MTJweCAxNnB4O3doaXRlLXNwYWNlOm5vd3JhcDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7XCI+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6NnB4O1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLXRyYXNoLWFjdGlvbj1cInJlc3RvcmVcIiBkYXRhLXRyYXNoLXBhdGg9XCIke2VwfVwiXG4gICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDojZGJlYWZlO2NvbG9yOiMxZDRlZDg7Ym9yZGVyOjFweCBzb2xpZCAjYmZkYmZlO2JvcmRlci1yYWRpdXM6NnB4O3BhZGRpbmc6NnB4IDEycHg7Zm9udC1zaXplOjEzcHg7Zm9udC13ZWlnaHQ6NjAwO2N1cnNvcjpwb2ludGVyO1wiPlJlc3RvcmU8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gZGF0YS10cmFzaC1hY3Rpb249XCJkZWxldGUtZm9yZXZlclwiIGRhdGEtdHJhc2gtcGF0aD1cIiR7ZXB9XCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZWUyZTI7Y29sb3I6I2RjMjYyNjtib3JkZXI6MXB4IHNvbGlkICNmZWNhY2E7Ym9yZGVyLXJhZGl1czo2cHg7cGFkZGluZzo2cHggOHB4O2ZvbnQtc2l6ZToxM3B4O2N1cnNvcjpwb2ludGVyO1wiIHRpdGxlPVwiRGVsZXRlIHBlcm1hbmVudGx5XCIgYXJpYS1sYWJlbD1cIkRlbGV0ZSBwZXJtYW5lbnRseVwiPlx1MjcxNTwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3RkPlxuICAgICAgPC90cj5gO1xuICB9KTtcbiAgaHRtbCArPSAnPC90YWJsZT4nO1xuICBjb25zdCB0cmFzaFdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgdHJhc2hXcmFwcGVyLmlubmVySFRNTCA9IGh0bWw7XG4gIGJvZHkuaW5uZXJIVE1MID0gJyc7XG4gIGJvZHkuYXBwZW5kQ2hpbGQodHJhc2hXcmFwcGVyKTtcbiAgLy8gV2lyZSB1cCB0cmFzaCBhY3Rpb24gYnV0dG9ucyB2aWEgZXZlbnQgZGVsZWdhdGlvblxuICB0cmFzaFdyYXBwZXIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBlID0+IHtcbiAgICBjb25zdCBidG4gPSBlLnRhcmdldC5jbG9zZXN0KCdbZGF0YS10cmFzaC1hY3Rpb25dJyk7XG4gICAgaWYgKCFidG4pIHJldHVybjtcbiAgICBjb25zdCBwYXRoICAgPSBidG4uZGF0YXNldC50cmFzaFBhdGg7XG4gICAgY29uc3QgYWN0aW9uID0gYnRuLmRhdGFzZXQudHJhc2hBY3Rpb247XG4gICAgaWYgICAgICAoYWN0aW9uID09PSAncmVzdG9yZScpICAgICAgICByZXN0b3JlRnJvbVRyYXNoKHBhdGgpO1xuICAgIGVsc2UgaWYgKGFjdGlvbiA9PT0gJ2RlbGV0ZS1mb3JldmVyJykgZGVsZXRlRm9yZXZlcihwYXRoKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc3RvcmVGcm9tVHJhc2gocGF0aCkge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS90cmFzaC9yZXN0b3JlJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBwYXRoIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHsgYXdhaXQgX3JlbmRlclRyYXNoVmlldygpOyBhd2FpdCBfcmVmcmVzaFRyYXNoQmFkZ2UoKTsgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHNob3dUb2FzdChgUmVzdG9yZSBmYWlsZWQ6ICR7ZGF0YS5lcnJvciB8fCAnVW5rbm93biBlcnJvcid9YCwgJ2Vycm9yJyk7XG4gIH0gY2F0Y2ggKGUpIHsgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHNob3dUb2FzdChgRXJyb3I6ICR7ZS5tZXNzYWdlfWAsICdlcnJvcicpOyB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUZvcmV2ZXIocGF0aCkge1xuICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCBjb25maXJtRGlhbG9nKFxuICAgICdQZXJtYW5lbnRseSBkZWxldGUgdGhpcyBzZXNzaW9uPyBUaGlzIGNhbm5vdCBiZSB1bmRvbmUuJyxcbiAgICB7IGNvbmZpcm1MYWJlbDogJ0RlbGV0ZSBGb3JldmVyJywgY2FuY2VsTGFiZWw6ICdDYW5jZWwnLCBkYW5nZXI6IHRydWUgfVxuICApO1xuICBpZiAoIWNvbmZpcm1lZCkgcmV0dXJuO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS90cmFzaC9kZWxldGUnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHBhdGggfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEuc3VjY2VzcykgeyBhd2FpdCBfcmVuZGVyVHJhc2hWaWV3KCk7IGF3YWl0IF9yZWZyZXNoVHJhc2hCYWRnZSgpOyB9XG4gICAgZWxzZSBpZiAodHlwZW9mIHNob3dUb2FzdCA9PT0gJ2Z1bmN0aW9uJykgc2hvd1RvYXN0KGBEZWxldGUgZmFpbGVkOiAke2RhdGEuZXJyb3IgfHwgJ1Vua25vd24gZXJyb3InfWAsICdlcnJvcicpO1xuICB9IGNhdGNoIChlKSB7IGlmICh0eXBlb2Ygc2hvd1RvYXN0ID09PSAnZnVuY3Rpb24nKSBzaG93VG9hc3QoYEVycm9yOiAke2UubWVzc2FnZX1gLCAnZXJyb3InKTsgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBlbXB0eVRyYXNoKCkge1xuICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCBjb25maXJtRGlhbG9nKFxuICAgICdQZXJtYW5lbnRseSBkZWxldGUgYWxsIGl0ZW1zIGluIFRyYXNoPyBUaGlzIGNhbm5vdCBiZSB1bmRvbmUuJyxcbiAgICB7IGNvbmZpcm1MYWJlbDogJ0VtcHR5IFRyYXNoJywgY2FuY2VsTGFiZWw6ICdDYW5jZWwnLCBkYW5nZXI6IHRydWUgfVxuICApO1xuICBpZiAoIWNvbmZpcm1lZCkgcmV0dXJuO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS90cmFzaC9lbXB0eScsIHsgbWV0aG9kOiAnUE9TVCcgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEuc3VjY2VzcykgeyBhd2FpdCBfcmVuZGVyVHJhc2hWaWV3KCk7IGF3YWl0IF9yZWZyZXNoVHJhc2hCYWRnZSgpOyB9XG4gICAgZWxzZSBpZiAodHlwZW9mIHNob3dUb2FzdCA9PT0gJ2Z1bmN0aW9uJykgc2hvd1RvYXN0KGBGYWlsZWQgdG8gZW1wdHkgdHJhc2g6ICR7ZGF0YS5lcnJvciB8fCAnVW5rbm93biBlcnJvcid9YCwgJ2Vycm9yJyk7XG4gIH0gY2F0Y2ggKGUpIHsgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHNob3dUb2FzdChgRXJyb3I6ICR7ZS5tZXNzYWdlfWAsICdlcnJvcicpOyB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFeHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5leHBvcnQge1xuICBfcmVuZGVyQWN0aXZlU2Vzc2lvblJvd3MsXG4gIF9yZW5kZXJTYXZlZFNlc3Npb25Sb3dzLFxuICBfcmVuZGVyU2Vzc2lvblN3aXRjaGVyU2VjdGlvbnMsXG4gIF91cGRhdGVTZXNzaW9uU3dpdGNoZXJIZWFkZXIsXG4gIHNob3dPd25lcnNoaXBDb25mbGljdERpYWxvZyxcbiAgY2xvc2VPd25lcnNoaXBDb25mbGljdERpYWxvZyxcbiAgb3BlblNlc3Npb25zTW9kYWwsXG4gIGNsb3NlU2Vzc2lvbnNNb2RhbCxcbiAgX3JlbmRlclNlc3Npb25zTW9kYWxCb2R5LFxuICBsb2FkU2Vzc2lvbkFuZENsb3NlTW9kYWwsXG4gIG5ld1Nlc3Npb25Gcm9tTW9kYWwsXG4gIHN0YXJ0U2Vzc2lvbk1vZGFsUmVuYW1lLFxuICBjYW5jZWxTZXNzaW9uTW9kYWxSZW5hbWUsXG4gIHN1Ym1pdFNlc3Npb25Nb2RhbFJlbmFtZSxcbiAgX2RlbGV0ZVNlc3Npb25Gcm9tTW9kYWwsXG4gIF9kdXBsaWNhdGVTZXNzaW9uRnJvbU1vZGFsLFxuICBfcmVmcmVzaFRyYXNoQmFkZ2UsXG4gIG9wZW5UcmFzaFZpZXcsXG4gIGNsb3NlVHJhc2hWaWV3LFxuICBfcmVuZGVyVHJhc2hWaWV3LFxuICByZXN0b3JlRnJvbVRyYXNoLFxuICBkZWxldGVGb3JldmVyLFxuICBlbXB0eVRyYXNoLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL2tleWJvYXJkLXNob3J0Y3V0cy5qcyBcdTIwMTQgR2xvYmFsIGtleWJvYXJkIHNob3J0Y3V0cyBmb3Igd29ya2Zsb3cgbmF2aWdhdGlvbi5cbiAqXG4gKiBTaG9ydGN1dHMgaW1wbGVtZW50ZWQ6XG4gKiAgIEN0cmwrRW50ZXIgICAgICAgVHJpZ2dlciB0aGUgcHJpbWFyeSBhY3Rpb24gYnV0dG9uIG9uIHRoZSBjdXJyZW50IHRhYlxuICogICBDdHJsK1NoaWZ0K1IgICAgIFJlLXJ1biB0aGUgY3VycmVudCB3b3JrZmxvdyBwaGFzZSAoY2FsbHMgY29uZmlybVJlUnVuUGhhc2UpXG4gKiAgIEEgICAgICAgICAgICAgICAgQWNjZXB0IHRoZSBmb2N1c2VkIHJldmlldyBjYXJkIChyZXdyaXRlIC8gc3BlbGwtY2hlY2sgdGFicylcbiAqICAgUiAgICAgICAgICAgICAgICBSZWplY3QgdGhlIGZvY3VzZWQgcmV2aWV3IGNhcmQgKHJld3JpdGUgLyBzcGVsbC1jaGVjayB0YWJzKVxuICogICBcdTIxOTEgLyBcdTIxOTMgICAgICAgICAgICBOYXZpZ2F0ZSBiZXR3ZWVuIHJldmlldyBjYXJkcyBvbiByZXZpZXcgdGFic1xuICogICBDdHJsK1ogICAgICAgICAgIFVuZG8gdGhlIG1vc3QgcmVjZW50IE1hc3RlciBDViBkYXRhIGNoYW5nZSAoTWFzdGVyIENWIG1vZGFsIG9ubHkpXG4gKiAgIEN0cmwrU2hpZnQrWiAgICAgUmVkbyB0aGUgcHJldmlvdXNseSB1bmRvbmUgTWFzdGVyIENWIGRhdGEgY2hhbmdlIChNYXN0ZXIgQ1YgbW9kYWwgb25seSlcbiAqICAgPyAgICAgICAgICAgICAgICBUb2dnbGUga2V5Ym9hcmQgc2hvcnRjdXQgaGVscCBwYW5lbFxuICovXG5cbi8qKiBUcmFjayB3aGljaCBjYXJkIGlzIGtleWJvYXJkLWZvY3VzZWQgb24gdGhlIGN1cnJlbnQgcmV2aWV3IHRhYi4gKi9cbmxldCBfZm9jdXNlZENhcmRJbmRleCA9IC0xO1xuXG4vKiogUmV0dXJucyB0cnVlIGlmIGZvY3VzIGlzIGluc2lkZSBhIHRleHQgaW5wdXQsIHNvIEEvUi9cdTIxOTEvXHUyMTkzIHNob3VsZCBub3QgZmlyZS4gKi9cbmZ1bmN0aW9uIF9pblRleHRJbnB1dCgpIHtcbiAgY29uc3QgZWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBpZiAoIWVsKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHRhZyA9IGVsLnRhZ05hbWU7XG4gIHJldHVybiB0YWcgPT09ICdJTlBVVCcgfHwgdGFnID09PSAnVEVYVEFSRUEnIHx8IHRhZyA9PT0gJ1NFTEVDVCcgfHwgZWwuaXNDb250ZW50RWRpdGFibGU7XG59XG5cbi8qKiBSZXR1cm5zIHRydWUgaWYgYW55IG1vZGFsIG92ZXJsYXkgaXMgY3VycmVudGx5IHZpc2libGUuICovXG5mdW5jdGlvbiBfbW9kYWxPcGVuKCkge1xuICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW3JvbGU9XCJkaWFsb2dcIl06bm90KFtzdHlsZSo9XCJkaXNwbGF5OiBub25lXCJdKTpub3QoW3N0eWxlKj1cImRpc3BsYXk6bm9uZVwiXSknKSAhPT0gbnVsbDtcbn1cblxuLyoqIFJldHVybnMgdHJ1ZSBpZiB0aGUgTWFzdGVyIENWIG1vZGFsICh3ZWIvaW5kZXguaHRtbCNtYXN0ZXItY3YtbW9kYWwtb3ZlcmxheSkgaXMgb3Blbi4gKi9cbmZ1bmN0aW9uIF9tYXN0ZXJDdk1vZGFsT3BlbigpIHtcbiAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWN2LW1vZGFsLW92ZXJsYXknKTtcbiAgcmV0dXJuICEhZWwgJiYgZWwuc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnO1xufVxuXG4vKipcbiAqIE1hcCB0YWIgSURzIHRvIHRoZWlyIHByaW1hcnkgYWN0aW9uIGJ1dHRvbiBJRHMuXG4gKiBCdXR0b25zIHRoYXQgbWlnaHQgYmUgZGlzYWJsZWQgYXQgcnVudGltZSBhcmUgc3RpbGwgY2xpY2tlZCBcdTIwMTQgdGhlIGJ1dHRvbidzXG4gKiBvd24gZGlzYWJsZWQgY2hlY2sgcHJldmVudHMgYWNjaWRlbnRhbCBzdWJtaXNzaW9uLlxuICovXG5jb25zdCBfVEFCX0FDVElPTl9CVE4gPSB7XG4gICdqb2InOiAgICAgICAgICAgICAgICAgICAnc2VuZC1idG4nLFxuICAnYW5hbHlzaXMnOiAgICAgICAgICAgICAgJ2FuYWx5emUtYnRuJyxcbiAgJ2dvYWxzJzogICAgICAgICAgICAgICAgICdyZWNvbW1lbmQtYnRuJyxcbiAgJ3Jld3JpdGUnOiAgICAgICAgICAgICAgICdyZXdyaXRlLWJ0bicsXG4gICdzcGVsbCc6ICAgICAgICAgICAgICAgICAnc3BlbGwtYnRuJyxcbiAgJ2ZpbmFsX2dlbmVyYXRlJzogICAgICAgICdnZW5lcmF0ZS1idG4nLFxuICAnbGF5b3V0JzogICAgICAgICAgICAgICAgJ2xheW91dC1idG4nLFxuICAnZG93bmxvYWQnOiAgICAgICAgICAgICAgJ2ZpbmFsLWdlbmVyYXRlLXByb2NlZWQtYnRuJyxcbiAgJ2ZpbmFsaXNlJzogICAgICAgICAgICAgICdmaW5hbGlzZS1hY3Rpb24tYnRuJyxcbn07XG5cbi8qKiBDbGljayB0aGUgcHJpbWFyeSBhY3Rpb24gYnV0dG9uIGZvciB0aGUgY3VycmVudCB0YWIgKEN0cmwrRW50ZXIpLiAqL1xuZnVuY3Rpb24gX3RyaWdnZXJQcmltYXJ5QWN0aW9uKCkge1xuICBjb25zdCB0YWIgPSB0eXBlb2Ygc3RhdGVNYW5hZ2VyICE9PSAndW5kZWZpbmVkJyA/IHN0YXRlTWFuYWdlci5nZXRDdXJyZW50VGFiKCkgOiBudWxsO1xuICBpZiAoIXRhYikgcmV0dXJuO1xuICBjb25zdCBidG5JZCA9IF9UQUJfQUNUSU9OX0JUTlt0YWJdO1xuICBpZiAoIWJ0bklkKSByZXR1cm47XG4gIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJ0bklkKTtcbiAgaWYgKGJ0biAmJiAhYnRuLmRpc2FibGVkKSBidG4uY2xpY2soKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIENhcmQgbmF2aWdhdGlvbiBoZWxwZXJzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4vKiogUmV0dXJuIHZpc2libGUgcmV2aWV3IGNhcmRzIGZvciB0aGUgY3VycmVudCB0YWIuICovXG5mdW5jdGlvbiBfZ2V0Q2FyZHMoKSB7XG4gIGNvbnN0IHRhYiA9IHR5cGVvZiBzdGF0ZU1hbmFnZXIgIT09ICd1bmRlZmluZWQnID8gc3RhdGVNYW5hZ2VyLmdldEN1cnJlbnRUYWIoKSA6IG51bGw7XG4gIGlmICh0YWIgPT09ICdyZXdyaXRlJykgcmV0dXJuIFsuLi5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucmV3cml0ZS1jYXJkJyldO1xuICBpZiAodGFiID09PSAnc3BlbGwnKSAgIHJldHVybiBbLi4uZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnNwZWxsLWNhcmQnKV07XG4gIHJldHVybiBbXTtcbn1cblxuLyoqIFZpc3VhbGx5IGhpZ2hsaWdodCBhIGNhcmQgYXMga2V5Ym9hcmQtZm9jdXNlZC4gKi9cbmZ1bmN0aW9uIF9oaWdobGlnaHRDYXJkKGNhcmRzLCBpZHgpIHtcbiAgY2FyZHMuZm9yRWFjaCgoYywgaSkgPT4ge1xuICAgIGlmIChpID09PSBpZHgpIHtcbiAgICAgIGMuY2xhc3NMaXN0LmFkZCgna2ItZm9jdXNlZCcpO1xuICAgICAgYy5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnbmVhcmVzdCcsIGJlaGF2aW9yOiAnc21vb3RoJyB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYy5jbGFzc0xpc3QucmVtb3ZlKCdrYi1mb2N1c2VkJyk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqIE1vdmUgdGhlIGtleWJvYXJkIGZvY3VzIHRvIGNhcmQgYXQgZGVsdGEgb2Zmc2V0IGZyb20gY3VycmVudC4gKi9cbmZ1bmN0aW9uIF9tb3ZlQ2FyZEZvY3VzKGRlbHRhKSB7XG4gIGNvbnN0IGNhcmRzID0gX2dldENhcmRzKCk7XG4gIGlmICghY2FyZHMubGVuZ3RoKSByZXR1cm47XG4gIF9mb2N1c2VkQ2FyZEluZGV4ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oY2FyZHMubGVuZ3RoIC0gMSwgX2ZvY3VzZWRDYXJkSW5kZXggKyBkZWx0YSkpO1xuICBfaGlnaGxpZ2h0Q2FyZChjYXJkcywgX2ZvY3VzZWRDYXJkSW5kZXgpO1xufVxuXG4vKiogQWNjZXB0IHRoZSBjdXJyZW50bHkga2V5Ym9hcmQtZm9jdXNlZCByZXdyaXRlIGNhcmQuICovXG5mdW5jdGlvbiBfYWNjZXB0Rm9jdXNlZENhcmQoKSB7XG4gIGNvbnN0IHRhYiA9IHR5cGVvZiBzdGF0ZU1hbmFnZXIgIT09ICd1bmRlZmluZWQnID8gc3RhdGVNYW5hZ2VyLmdldEN1cnJlbnRUYWIoKSA6IG51bGw7XG4gIGlmICh0YWIgPT09ICdyZXdyaXRlJykge1xuICAgIGNvbnN0IGNhcmRzID0gX2dldENhcmRzKCk7XG4gICAgaWYgKF9mb2N1c2VkQ2FyZEluZGV4IDwgMCB8fCBfZm9jdXNlZENhcmRJbmRleCA+PSBjYXJkcy5sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCBjYXJkID0gY2FyZHNbX2ZvY3VzZWRDYXJkSW5kZXhdO1xuICAgIGNvbnN0IGlkID0gY2FyZC5pZC5yZXBsYWNlKCdydy1jYXJkLScsICcnKTtcbiAgICBpZiAodHlwZW9mIGFwcGx5UmV3cml0ZUFjdGlvbiA9PT0gJ2Z1bmN0aW9uJykgYXBwbHlSZXdyaXRlQWN0aW9uKGlkLCAnYWNjZXB0Jyk7XG4gIH0gZWxzZSBpZiAodGFiID09PSAnc3BlbGwnKSB7XG4gICAgY29uc3QgY2FyZHMgPSBfZ2V0Q2FyZHMoKTtcbiAgICBpZiAoX2ZvY3VzZWRDYXJkSW5kZXggPCAwIHx8IF9mb2N1c2VkQ2FyZEluZGV4ID49IGNhcmRzLmxlbmd0aCkgcmV0dXJuO1xuICAgIC8vIHNwZWxsIGNhcmRzOiBmaW5kIHRoZSBhY2NlcHQgYnV0dG9uIHdpdGhpbiB0aGUgZm9jdXNlZCBjYXJkXG4gICAgY29uc3QgYnRuID0gY2FyZHNbX2ZvY3VzZWRDYXJkSW5kZXhdLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWFjdGlvbj1cImtlZXBcIl0sIC5zcGVsbC1rZWVwLWJ0bicpO1xuICAgIGlmIChidG4pIGJ0bi5jbGljaygpO1xuICB9XG59XG5cbi8qKiBSZWplY3QgdGhlIGN1cnJlbnRseSBrZXlib2FyZC1mb2N1c2VkIHJldmlldyBjYXJkLiAqL1xuZnVuY3Rpb24gX3JlamVjdEZvY3VzZWRDYXJkKCkge1xuICBjb25zdCB0YWIgPSB0eXBlb2Ygc3RhdGVNYW5hZ2VyICE9PSAndW5kZWZpbmVkJyA/IHN0YXRlTWFuYWdlci5nZXRDdXJyZW50VGFiKCkgOiBudWxsO1xuICBpZiAodGFiID09PSAncmV3cml0ZScpIHtcbiAgICBjb25zdCBjYXJkcyA9IF9nZXRDYXJkcygpO1xuICAgIGlmIChfZm9jdXNlZENhcmRJbmRleCA8IDAgfHwgX2ZvY3VzZWRDYXJkSW5kZXggPj0gY2FyZHMubGVuZ3RoKSByZXR1cm47XG4gICAgY29uc3QgY2FyZCA9IGNhcmRzW19mb2N1c2VkQ2FyZEluZGV4XTtcbiAgICBjb25zdCBpZCA9IGNhcmQuaWQucmVwbGFjZSgncnctY2FyZC0nLCAnJyk7XG4gICAgaWYgKHR5cGVvZiBhcHBseVJld3JpdGVBY3Rpb24gPT09ICdmdW5jdGlvbicpIGFwcGx5UmV3cml0ZUFjdGlvbihpZCwgJ3JlamVjdCcpO1xuICB9IGVsc2UgaWYgKHRhYiA9PT0gJ3NwZWxsJykge1xuICAgIGNvbnN0IGNhcmRzID0gX2dldENhcmRzKCk7XG4gICAgaWYgKF9mb2N1c2VkQ2FyZEluZGV4IDwgMCB8fCBfZm9jdXNlZENhcmRJbmRleCA+PSBjYXJkcy5sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCBidG4gPSBjYXJkc1tfZm9jdXNlZENhcmRJbmRleF0ucXVlcnlTZWxlY3RvcignW2RhdGEtYWN0aW9uPVwiYXBwbHlcIl0sIC5zcGVsbC1hcHBseS1idG4nKTtcbiAgICBpZiAoYnRuKSBidG4uY2xpY2soKTtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgU2hvcnRjdXQgaGVscCBwYW5lbCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuY29uc3QgX1BBTkVMX0lEID0gJ2tiLXNob3J0Y3V0cy1wYW5lbCc7XG5cbi8qKiBUb2dnbGUgdGhlIGtleWJvYXJkIHNob3J0Y3V0IGhlbHAgcGFuZWwuICovXG5leHBvcnQgZnVuY3Rpb24gc2hvd0tleWJvYXJkU2hvcnRjdXRzUGFuZWwoKSB7XG4gIGNvbnN0IGV4aXN0aW5nID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoX1BBTkVMX0lEKTtcbiAgaWYgKGV4aXN0aW5nKSB7IGV4aXN0aW5nLnJlbW92ZSgpOyByZXR1cm47IH1cblxuICBjb25zdCBwYW5lbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBwYW5lbC5pZCA9IF9QQU5FTF9JRDtcbiAgcGFuZWwuc2V0QXR0cmlidXRlKCdyb2xlJywgJ2RpYWxvZycpO1xuICBwYW5lbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbW9kYWwnLCAndHJ1ZScpO1xuICBwYW5lbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnS2V5Ym9hcmQgc2hvcnRjdXRzJyk7XG4gIHBhbmVsLmlubmVySFRNTCA9IGBcbiAgICA8ZGl2IGlkPVwia2Itc2hvcnRjdXRzLWlubmVyXCI+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2FsaWduLWl0ZW1zOmNlbnRlcjttYXJnaW4tYm90dG9tOjEycHhcIj5cbiAgICAgICAgPHN0cm9uZz5LZXlib2FyZCBTaG9ydGN1dHM8L3N0cm9uZz5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImtiLXNob3J0Y3V0cy1jbG9zZVwiIGFyaWEtbGFiZWw9XCJDbG9zZSBrZXlib2FyZCBzaG9ydGN1dHNcIiBzdHlsZT1cImJhY2tncm91bmQ6bm9uZTtib3JkZXI6bm9uZTtmb250LXNpemU6MS4yZW07Y3Vyc29yOnBvaW50ZXI7cGFkZGluZzoycHggNnB4XCI+XHUyNzE1PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDx0YWJsZSBzdHlsZT1cImJvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTt3aWR0aDoxMDAlXCI+XG4gICAgICAgIDx0Ym9keT5cbiAgICAgICAgICA8dHI+PHRkIHN0eWxlPVwicGFkZGluZzo0cHggMTJweCA0cHggMFwiPjxrYmQ+Q3RybDwva2JkPis8a2JkPkVudGVyPC9rYmQ+PC90ZD48dGQ+VHJpZ2dlciBwcmltYXJ5IGFjdGlvbiBvbiBjdXJyZW50IHN0ZXA8L3RkPjwvdHI+XG4gICAgICAgICAgPHRyPjx0ZCBzdHlsZT1cInBhZGRpbmc6NHB4IDEycHggNHB4IDBcIj48a2JkPkN0cmw8L2tiZD4rPGtiZD5TaGlmdDwva2JkPis8a2JkPlI8L2tiZD48L3RkPjx0ZD5SZS1ydW4gY3VycmVudCB3b3JrZmxvdyBwaGFzZTwvdGQ+PC90cj5cbiAgICAgICAgICA8dHI+PHRkIHN0eWxlPVwicGFkZGluZzo0cHggMTJweCA0cHggMFwiPjxrYmQ+XHUyMTkxPC9rYmQ+IC8gPGtiZD5cdTIxOTM8L2tiZD48L3RkPjx0ZD5OYXZpZ2F0ZSBiZXR3ZWVuIHJldmlldyBjYXJkczwvdGQ+PC90cj5cbiAgICAgICAgICA8dHI+PHRkIHN0eWxlPVwicGFkZGluZzo0cHggMTJweCA0cHggMFwiPjxrYmQ+QTwva2JkPjwvdGQ+PHRkPkFjY2VwdCBmb2N1c2VkIGNhcmQgKHJld3JpdGUgLyBzcGVsbCk8L3RkPjwvdHI+XG4gICAgICAgICAgPHRyPjx0ZCBzdHlsZT1cInBhZGRpbmc6NHB4IDEycHggNHB4IDBcIj48a2JkPlI8L2tiZD48L3RkPjx0ZD5SZWplY3QgZm9jdXNlZCBjYXJkIChyZXdyaXRlIC8gc3BlbGwpPC90ZD48L3RyPlxuICAgICAgICAgIDx0cj48dGQgc3R5bGU9XCJwYWRkaW5nOjRweCAxMnB4IDRweCAwXCI+PGtiZD5DdHJsPC9rYmQ+KzxrYmQ+Wjwva2JkPjwvdGQ+PHRkPlVuZG8gTWFzdGVyIENWIGNoYW5nZSAoTWFzdGVyIENWIG1vZGFsKTwvdGQ+PC90cj5cbiAgICAgICAgICA8dHI+PHRkIHN0eWxlPVwicGFkZGluZzo0cHggMTJweCA0cHggMFwiPjxrYmQ+Q3RybDwva2JkPis8a2JkPlNoaWZ0PC9rYmQ+KzxrYmQ+Wjwva2JkPjwvdGQ+PHRkPlJlZG8gTWFzdGVyIENWIGNoYW5nZSAoTWFzdGVyIENWIG1vZGFsKTwvdGQ+PC90cj5cbiAgICAgICAgICA8dHI+PHRkIHN0eWxlPVwicGFkZGluZzo0cHggMTJweCA0cHggMFwiPjxrYmQ+Pzwva2JkPjwvdGQ+PHRkPlRvZ2dsZSB0aGlzIGhlbHAgcGFuZWw8L3RkPjwvdHI+XG4gICAgICAgICAgPHRyPjx0ZCBzdHlsZT1cInBhZGRpbmc6NHB4IDEycHggNHB4IDBcIj48a2JkPkVzYzwva2JkPjwvdGQ+PHRkPkNsb3NlIG1vZGFscyAvIHRoaXMgcGFuZWw8L3RkPjwvdHI+XG4gICAgICAgIDwvdGJvZHk+XG4gICAgICA8L3RhYmxlPlxuICAgIDwvZGl2PmA7XG4gIE9iamVjdC5hc3NpZ24ocGFuZWwuc3R5bGUsIHtcbiAgICBwb3NpdGlvbjogICAnZml4ZWQnLFxuICAgIGJvdHRvbTogICAgICc4MHB4JyxcbiAgICByaWdodDogICAgICAnMjRweCcsXG4gICAgYmFja2dyb3VuZDogJyMxZjI5MzcnLFxuICAgIGNvbG9yOiAgICAgICcjZjlmYWZiJyxcbiAgICBib3JkZXI6ICAgICAnMXB4IHNvbGlkICMzNzQxNTEnLFxuICAgIGJvcmRlclJhZGl1czogJzhweCcsXG4gICAgcGFkZGluZzogICAgJzE2cHggMjBweCcsXG4gICAgekluZGV4OiAgICAgJzEwMDAwJyxcbiAgICBmb250U2l6ZTogICAnMC44NWVtJyxcbiAgICBtaW5XaWR0aDogICAnMzQwcHgnLFxuICAgIGJveFNoYWRvdzogICcwIDRweCAyMHB4IHJnYmEoMCwwLDAsMC41KScsXG4gIH0pO1xuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHBhbmVsKTtcbiAgcGFuZWwucXVlcnlTZWxlY3RvcignI2tiLXNob3J0Y3V0cy1jbG9zZScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gcGFuZWwucmVtb3ZlKCkpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgUmVzZXQgY2FyZCBmb2N1cyB3aGVuIHRhYiBjaGFuZ2VzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4vKiogQ2FsbGVkIHdoZW5ldmVyIHRoZSBhY3RpdmUgdGFiIGNoYW5nZXMgc28gY2FyZCBmb2N1cyByZXNldHMuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzZXRDYXJkRm9jdXMoKSB7XG4gIF9mb2N1c2VkQ2FyZEluZGV4ID0gLTE7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5rYi1mb2N1c2VkJykuZm9yRWFjaChlbCA9PiBlbC5jbGFzc0xpc3QucmVtb3ZlKCdrYi1mb2N1c2VkJykpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgR2xvYmFsIGtleWRvd24gaGFuZGxlciBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gX29uS2V5RG93bihlKSB7XG4gIC8vIEN0cmwrRW50ZXIgXHUyMTkyIHByaW1hcnkgYWN0aW9uIChhbHdheXMsIGV2ZW4gaW4gdGV4dCBpbnB1dHMgd2hlbiB0aGUgbWFpblxuICAvLyBzZW5kLWJveCBpcyBmb2N1c2VkLCB0byBtYXRjaCB0aGUgZXhpc3RpbmcgRW50ZXIgYmVoYXZpb3VyIHRoZXJlKS5cbiAgaWYgKGUuY3RybEtleSAmJiBlLmtleSA9PT0gJ0VudGVyJykge1xuICAgIF90cmlnZ2VyUHJpbWFyeUFjdGlvbigpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEN0cmwrU2hpZnQrUiBcdTIxOTIgcmUtcnVuIGN1cnJlbnQgcGhhc2VcbiAgaWYgKGUuY3RybEtleSAmJiBlLnNoaWZ0S2V5ICYmIGUua2V5ID09PSAnUicpIHtcbiAgICBjb25zdCBhY3RpdmVFbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tpZF49XCJzdGVwLVwiXS5hY3RpdmUnKTtcbiAgICBjb25zdCBzdGVwID0gYWN0aXZlRWwgPyBhY3RpdmVFbC5pZC5yZXBsYWNlKCdzdGVwLScsICcnKSA6IG51bGw7XG4gICAgaWYgKHN0ZXAgJiYgdHlwZW9mIGNvbmZpcm1SZVJ1blBoYXNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBjb25maXJtUmVSdW5QaGFzZShzdGVwKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gQ3RybCtaIC8gQ3RybCtTaGlmdCtaIFx1MjE5MiB1bmRvL3JlZG8gdGhlIG1vc3QgcmVjZW50IE1hc3RlciBDViBkYXRhIGNoYW5nZS5cbiAgLy8gU2NvcGVkIHRvIHdoZW4gdGhlIE1hc3RlciBDViBtb2RhbCBpcyBvcGVuIFx1MjAxNCBhbmQgbm8gbmVzdGVkIHN1Yi1tb2RhbFxuICAvLyAoZS5nLiB0aGUgYmFja3VwLWhpc3RvcnkgYnJvd3NlcikgaXMgc3RhY2tlZCBvbiB0b3Agb2YgaXQgXHUyMDE0IGFuZCBmb2N1c1xuICAvLyBpc24ndCBpbiBhIHRleHQgZmllbGQsIHNpbmNlIEN0cmwrWiBpbnNpZGUgYSB0ZXh0YXJlYSBtdXN0IHN0aWxsIHBlcmZvcm1cbiAgLy8gbmF0aXZlIHRleHQtdW5kbyByYXRoZXIgdGhhbiBiZWluZyBoaWphY2tlZCBieSB0aGlzIHNob3J0Y3V0LlxuICBpZiAoZS5jdHJsS2V5ICYmICFlLmFsdEtleSAmJiAoZS5rZXkgPT09ICd6JyB8fCBlLmtleSA9PT0gJ1onKVxuICAgICAgJiYgX21hc3RlckN2TW9kYWxPcGVuKCkgJiYgIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYWNrdXAtaGlzdG9yeS1vdmVybGF5JylcbiAgICAgICYmICFfaW5UZXh0SW5wdXQoKSkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBpZiAoZS5zaGlmdEtleSkge1xuICAgICAgaWYgKHR5cGVvZiByZWRvTWFzdGVyRGF0YUNoYW5nZSA9PT0gJ2Z1bmN0aW9uJykgcmVkb01hc3RlckRhdGFDaGFuZ2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR5cGVvZiB1bmRvTWFzdGVyRGF0YUNoYW5nZSA9PT0gJ2Z1bmN0aW9uJykgdW5kb01hc3RlckRhdGFDaGFuZ2UoKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gQWxsIHNpbmdsZS1rZXkgc2hvcnRjdXRzIGFyZSBzdXBwcmVzc2VkIHdoZW4gdHlwaW5nIGludG8gYW4gaW5wdXQuXG4gIGlmIChfaW5UZXh0SW5wdXQoKSkgcmV0dXJuO1xuICAvLyBBbGwgc2luZ2xlLWtleSBzaG9ydGN1dHMgYXJlIHN1cHByZXNzZWQgd2hlbiBhIG1vZGFsIGRpYWxvZyBpcyBvcGVuLFxuICAvLyBleGNlcHQgRXNjYXBlIChoYW5kbGVkIGJ5IHVpLWNvcmUuanMpLlxuICBpZiAoX21vZGFsT3BlbigpKSByZXR1cm47XG5cbiAgc3dpdGNoIChlLmtleSkge1xuICAgIGNhc2UgJz8nOlxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgc2hvd0tleWJvYXJkU2hvcnRjdXRzUGFuZWwoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgX21vdmVDYXJkRm9jdXMoLTEpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIF9tb3ZlQ2FyZEZvY3VzKDEpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYSc6XG4gICAgY2FzZSAnQSc6XG4gICAgICBfYWNjZXB0Rm9jdXNlZENhcmQoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3InOlxuICAgIGNhc2UgJ1InOlxuICAgICAgX3JlamVjdEZvY3VzZWRDYXJkKCk7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgYnJlYWs7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIEluaXRpYWxpc2F0aW9uIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4vKipcbiAqIEF0dGFjaCB0aGUgZ2xvYmFsIGtleWJvYXJkLXNob3J0Y3V0IGxpc3RlbmVyLlxuICogQ2FsbGVkIG9uY2UgZnJvbSBhcHAuanMgYWZ0ZXIgRE9NQ29udGVudExvYWRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRLZXlib2FyZFNob3J0Y3V0cygpIHtcbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIF9vbktleURvd24pO1xufVxuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLy8gT3JjaGVzdHJhdG9yIGVudHJ5LXBvaW50IFx1MjAxNCBhbGwgbW9kdWxlIGZ1bmN0aW9ucyBhcmUgZXhwb3NlZCBhcyBnbG9iYWxzIGJ5IGJ1bmRsZS5qcy5cbi8vIE5vdGU6IGFwcC5qcyBpcyBhIHBsYWluIGxlZ2FjeSBzY3JpcHQgKG5vdCBidW5kbGVkKS4gbG9nbGV2ZWwgaXMgYXZhaWxhYmxlXG4vLyB2aWEgZ2xvYmFsVGhpcy5sb2dsZXZlbCAoc2V0IGJ5IGJ1bmRsZS5qcyB3aGljaCBpbmNsdWRlcyB3ZWIvbG9nZ2VyLmpzKS5cbmNvbnN0IF9hcHBMb2cgPSAodHlwZW9mIGxvZ2xldmVsICE9PSAndW5kZWZpbmVkJykgPyBsb2dsZXZlbC5nZXRMb2dnZXIoJ2FwcCcpIDogY29uc29sZTtcbi8vIFRoaXMgZmlsZSBjb250YWlucyBvbmx5IGluaXQoKSBhbmQgdG9wLWxldmVsIGV2ZW50LXdpcmluZyAoXHUyMjY0IDMwMCBsaW5lcykuXG5cbmxldCBfbGlzdGVuZXJzUmVnaXN0ZXJlZCA9IGZhbHNlO1xuXG5mdW5jdGlvbiBfc2V0Q29ubmVjdGlvbk1lc3NhZ2UobWVzc2FnZU5vZGUsIHRleHQsIGtpbmQgPSAnaW5mbycpIHtcbiAgaWYgKCFtZXNzYWdlTm9kZSkgcmV0dXJuO1xuICBjb25zdCBjb250ZW50ID0gbWVzc2FnZU5vZGUucXVlcnlTZWxlY3RvcignLmNvbnRlbnQnKTtcbiAgaWYgKCFjb250ZW50KSByZXR1cm47XG4gIGNvbnRlbnQudGV4dENvbnRlbnQgPSB0ZXh0O1xuICBjb250ZW50LnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lLWJsb2NrJztcbiAgY29udGVudC5zdHlsZS5wYWRkaW5nID0gJzZweCAxMHB4JztcbiAgY29udGVudC5zdHlsZS5ib3JkZXJSYWRpdXMgPSAnOTk5cHgnO1xuICBjb250ZW50LnN0eWxlLmZvbnRXZWlnaHQgPSAnNjAwJztcbiAgY29udGVudC5zdHlsZS5mb250U2l6ZSA9ICcwLjg4ZW0nO1xuICBjb250ZW50LnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgI2NiZDVlMSc7XG4gIGlmIChraW5kID09PSAnc3VjY2VzcycpIHtcbiAgICBjb250ZW50LnN0eWxlLmNvbG9yID0gJyMxNjY1MzQnO1xuICAgIGNvbnRlbnQuc3R5bGUuYmFja2dyb3VuZCA9ICcjZWNmZGY1JztcbiAgICBjb250ZW50LnN0eWxlLmJvcmRlckNvbG9yID0gJyM4NmVmYWMnO1xuICB9IGVsc2UgaWYgKGtpbmQgPT09ICdlcnJvcicpIHtcbiAgICBjb250ZW50LnN0eWxlLmNvbG9yID0gJyNiOTFjMWMnO1xuICAgIGNvbnRlbnQuc3R5bGUuYmFja2dyb3VuZCA9ICcjZmVmMmYyJztcbiAgICBjb250ZW50LnN0eWxlLmJvcmRlckNvbG9yID0gJyNmZWNhY2EnO1xuICB9IGVsc2Uge1xuICAgIGNvbnRlbnQuc3R5bGUuY29sb3IgPSAnIzFlNDBhZic7XG4gICAgY29udGVudC5zdHlsZS5iYWNrZ3JvdW5kID0gJyNlZmY2ZmYnO1xuICAgIGNvbnRlbnQuc3R5bGUuYm9yZGVyQ29sb3IgPSAnI2JmZGJmZSc7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gaW5pdCgpIHtcbiAgLy8gSW5pdGlhbGl6ZSBhYm9ydCBjb250cm9sbGVyIHRvIG51bGwgKHNldCB0byBuZXcgQWJvcnRDb250cm9sbGVyIGJ5IHNldExvYWRpbmcodHJ1ZSkpXG4gIHdpbmRvdy5fY3VycmVudEFib3J0Q29udHJvbGxlciA9IG51bGw7XG5cbiAgLy8gRmx1c2ggYW55IG1lc3NhZ2VzIHRoYXQgd2VyZSBxdWV1ZWQgYmVmb3JlIERPTUNvbnRlbnRMb2FkZWQgKGRlZmVuc2l2ZSBcdTIwMTQgc2hvdWxkIGJlIGVtcHR5IGluIHByYWN0aWNlKS5cbiAgX2ZsdXNoTWVzc2FnZVF1ZXVlKCk7XG5cbiAgY29uc3QgaGFzQWN0aXZlU2Vzc2lvbiA9IGF3YWl0IGVuc3VyZVNlc3Npb25Db250ZXh0KCk7XG4gIGlmICghaGFzQWN0aXZlU2Vzc2lvbikge1xuICAgIGNvbnN0IGZhaWxlZE1lc3NhZ2UgPSBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnXHUyNkEwXHVGRTBGIENvdWxkIG5vdCBlc3RhYmxpc2ggYSBzZXNzaW9uLiBDcmVhdGUgb3IgbG9hZCBhIHNlc3Npb24gdG8gY29udGludWUuJyk7XG4gICAgX3NldENvbm5lY3Rpb25NZXNzYWdlKGZhaWxlZE1lc3NhZ2UsICdcdTI2QTBcdUZFMEYgQ291bGQgbm90IGVzdGFibGlzaCBhIHNlc3Npb24uIENyZWF0ZSBvciBsb2FkIGEgc2Vzc2lvbiB0byBjb250aW51ZS4nLCAnZXJyb3InKTtcbiAgICBzZXR1cEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gU2hvdyB3ZWxjb21lL29uYm9hcmRpbmcgbW9kYWwgb24gZXZlcnkgc3RhcnR1cCB1bnRpbCB1c2VyIGRpc21pc3NlcyBpdC5cbiAgYXdhaXQgbWF5YmVTaG93V2VsY29tZU1vZGFsKCk7XG5cbiAgLy8gUmVzdG9yZSBzZXNzaW9uIHN0YXRlIGZpcnN0XG4gIGF3YWl0IHJlc3RvcmVTZXNzaW9uKCk7XG5cbiAgLy8gU2hvdyBjb25uZWN0aW9uIHN0YXR1cyBhZnRlciByZXN0b3JlU2Vzc2lvbiBzbyBpdCBpcyBub3QgcmVtb3ZlZCBieSBoaXN0b3J5IHJlc3RvcmUuXG4gIGNvbnN0IGNvbm5lY3Rpb25NZXNzYWdlID0gYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgJ1x1RDgzRFx1REQwNCBDb25uZWN0aW5nIHRvIENWIEJ1aWxkZXIuLi4nKTtcbiAgX3NldENvbm5lY3Rpb25NZXNzYWdlKGNvbm5lY3Rpb25NZXNzYWdlLCAnXHVEODNEXHVERDA0IENvbm5lY3RpbmcgdG8gQ1YgQnVpbGRlci4uLicsICdpbmZvJyk7XG5cbiAgLy8gUmVzdG9yZSBBVFMgYmFkZ2UgZnJvbSBjYWNoZWQgc2NvcmUgKGlmIGFueSlcbiAgdXBkYXRlQXRzQmFkZ2Uoc3RhdGVNYW5hZ2VyLmdldEF0c1Njb3JlKCkpO1xuXG4gIC8vIEluaXRpYWxpemUgdGhlIHJlc3RcbiAgYXdhaXQgZmV0Y2hTdGF0dXMoKTtcbiAgY29uc3QgY29ubmVjdGVkTWVzc2FnZSA9IGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsICdcdTI3MDUgQ29ubmVjdGlvbiBzdWNjZXNzZnVsLicpO1xuICBfc2V0Q29ubmVjdGlvbk1lc3NhZ2UoY29ubmVjdGVkTWVzc2FnZSwgJ1x1MjcwNSBDb25uZWN0aW9uIHN1Y2Nlc3NmdWwuJywgJ3N1Y2Nlc3MnKTtcbiAgaWYgKHN0YXRlTWFuYWdlci5nZXRDdXJyZW50VGFiKCkgPT09ICdqb2InKSBhd2FpdCBwb3B1bGF0ZUpvYlRhYigpO1xuICBzZXR1cEV2ZW50TGlzdGVuZXJzKCk7XG5cbiAgLy8gU2V0IHVwIHBlcmlvZGljIHN0YXRlIHNhdmluZ1xuICBzZXRJbnRlcnZhbChzYXZlVGFiRGF0YSwgNTAwMCk7IC8vIFNhdmUgZXZlcnkgNSBzZWNvbmRzXG5cbiAgLy8gU2F2ZSBzdGF0ZSBiZWZvcmUgcGFnZSB1bmxvYWRcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsICgpID0+IHtcbiAgICBzYXZlVGFiRGF0YSgpO1xuICAgIGNvbnN0IGFjdGl2ZVNlc3Npb25JZCA9IHN0YXRlTWFuYWdlci5nZXRTZXNzaW9uSWQoKTtcbiAgICBpZiAoYWN0aXZlU2Vzc2lvbklkKSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShTdG9yYWdlS2V5cy5TRVNTSU9OX0lELCBhY3RpdmVTZXNzaW9uSWQpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gUHJvbXB0IHVzZXIgdG8gYW5hbHl6ZSBpZiBhIGpvYiBkZXNjcmlwdGlvbiBpcyBsb2FkZWQgYnV0IG5vdCB5ZXQgYW5hbHl6ZWQuXG4gIC8vIERvIE5PVCBhdXRvLWZpcmUgXHUyMDE0IGEgcmV0dXJuaW5nIHVzZXIgbWF5IGhhdmUgaW50ZW50aW9uYWxseSBsZWZ0IGl0IHVuYW5hbHl6ZWRcbiAgLy8gKGUuZy4gbWlkLWVkaXQpLiBMZXQgdGhlbSBjbGljayBBbmFseXNlIEpvYiBleHBsaWNpdGx5IChHQVAtMjQ4KS5cbiAgaWYgKCFzdGF0ZU1hbmFnZXIuaXNSZWNvbm5lY3RpbmcoKSkge1xuICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IGZldGNoU3RhdHVzKCk7XG4gICAgaWYgKCFzdGF0dXMuX2Vycm9yICYmIHN0YXR1cy5qb2JfZGVzY3JpcHRpb24gJiYgIXN0YXR1cy5qb2JfYW5hbHlzaXMpIHtcbiAgICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsICdcdUQ4M0RcdURDQ0IgSm9iIGRlc2NyaXB0aW9uIGRldGVjdGVkIFx1MjAxNCBjbGljayA8c3Ryb25nPkFuYWx5c2UgSm9iPC9zdHJvbmc+IHdoZW4gcmVhZHkgdG8gYmVnaW4uJyk7XG4gICAgICBjb25zdCBhbmFseXplQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FuYWx5emUtYnRuJyk7XG4gICAgICBpZiAoYW5hbHl6ZUJ0bikge1xuICAgICAgICBhbmFseXplQnRuLnN0eWxlLm91dGxpbmUgPSAnMnB4IHNvbGlkICMzYjgyZjYnO1xuICAgICAgICBhbmFseXplQnRuLnN0eWxlLm91dGxpbmVPZmZzZXQgPSAnMnB4JztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHN0YXR1cy5qb2JfYW5hbHlzaXMpIHtcbiAgICAgIF9hcHBMb2cuaW5mbygnSm9iIGFuYWx5c2lzIGFscmVhZHkgY29tcGxldGUsIHNraXBwaW5nIGF1dG8tYW5hbHlzaXMnKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgX2FwcExvZy5pbmZvKCdSZWNvbm5lY3RpbmcgdG8gZXhpc3Rpbmcgc2Vzc2lvbiwgc2tpcHBpbmcgYXV0by1hbmFseXNpcycpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNldHVwRXZlbnRMaXN0ZW5lcnMoKSB7XG4gIGlmIChfbGlzdGVuZXJzUmVnaXN0ZXJlZCkgcmV0dXJuO1xuICBfbGlzdGVuZXJzUmVnaXN0ZXJlZCA9IHRydWU7XG5cbiAgLy8gVGFiIHN3aXRjaGluZ1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudGFiJykuZm9yRWFjaCh0YWIgPT4ge1xuICAgIHRhYi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHN3aXRjaFRhYih0YWIuZGF0YXNldC50YWIpKTtcbiAgfSk7XG5cbiAgLy8gTWVzc2FnZSBzZW5kaW5nXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZW5kLWJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc2VuZE1lc3NhZ2UpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWVzc2FnZS1pbnB1dCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2tleXByZXNzJywgKGUpID0+IHtcbiAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicpIHNlbmRNZXNzYWdlKCk7XG4gIH0pO1xuXG4gIC8vIEFjdGlvbiBidXR0b25zIFx1MjAxNCBvbmUgcGVyIHdvcmtmbG93IHN0YWdlXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhbmFseXplLWJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYW5hbHl6ZUpvYik7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWNvbW1lbmQtYnRuJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBzZW5kQWN0aW9uKCdyZWNvbW1lbmRfY3VzdG9taXphdGlvbnMnKSk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnZW5lcmF0ZS1idG4nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICAvLyBTb2Z0IGdhdGU6IHdhcm4gaWYgY3VzdG9taXNhdGlvbiBpdGVtcyBoYXZlIG5ldmVyIGJlZW4gaW5kaXZpZHVhbGx5IHJldmlld2VkIChHQVAtMTE2KVxuICAgIGNvbnN0IHJldmlld2VkID0gd2luZG93Ll9leHBsaWNpdGx5UmV2aWV3ZWQgfHwgeyBleHBlcmllbmNlczogbmV3IFNldCgpLCBza2lsbHM6IG5ldyBTZXQoKSB9O1xuICAgIGNvbnN0IHRvdGFsRXhwID0gKHdpbmRvdy5fZXhwZXJpZW5jZXNPcmRlcmVkIHx8IFtdKS5sZW5ndGg7XG4gICAgY29uc3QgdG90YWxTa2lsbCA9IE9iamVjdC5rZXlzKHVzZXJTZWxlY3Rpb25zPy5za2lsbHMgfHwge30pLmxlbmd0aDtcbiAgICBjb25zdCB1bnJldmlld2VkRXhwID0gdG90YWxFeHAgLSByZXZpZXdlZC5leHBlcmllbmNlcy5zaXplO1xuICAgIGNvbnN0IHVucmV2aWV3ZWRTa2lsbCA9IHRvdGFsU2tpbGwgLSByZXZpZXdlZC5za2lsbHMuc2l6ZTtcbiAgICBjb25zdCB1bnJldmlld2VkVG90YWwgPSBNYXRoLm1heCgwLCB1bnJldmlld2VkRXhwKSArIE1hdGgubWF4KDAsIHVucmV2aWV3ZWRTa2lsbCk7XG4gICAgaWYgKHVucmV2aWV3ZWRUb3RhbCA+IDApIHtcbiAgICAgIGNvbnN0IHBhcnRzID0gW107XG4gICAgICBpZiAodW5yZXZpZXdlZEV4cCA+IDApIHBhcnRzLnB1c2goYCR7dW5yZXZpZXdlZEV4cH0gZXhwZXJpZW5jZSBlbnRyJHt1bnJldmlld2VkRXhwID09PSAxID8gJ3knIDogJ2llcyd9YCk7XG4gICAgICBpZiAodW5yZXZpZXdlZFNraWxsID4gMCkgcGFydHMucHVzaChgJHt1bnJldmlld2VkU2tpbGx9IHNraWxsJHt1bnJldmlld2VkU2tpbGwgPT09IDEgPyAnJyA6ICdzJ31gKTtcbiAgICAgIGNvbnN0IG9rID0gd2luZG93LmNvbmZpcm0oXG4gICAgICAgIGAke3BhcnRzLmpvaW4oJyBhbmQgJyl9IG5vdCBpbmRpdmlkdWFsbHkgcmV2aWV3ZWQgXHUyMDE0IHRoZSBBSSdzIHJlY29tbWVuZGF0aW9uIHdpbGwgYmUgdXNlZCBmb3IgdGhlc2UuXFxuXFxuUHJvY2VlZCBhbnl3YXk/YFxuICAgICAgKTtcbiAgICAgIGlmICghb2spIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHVzZXJTZWxlY3Rpb25zICYmIChPYmplY3Qua2V5cyh1c2VyU2VsZWN0aW9ucy5leHBlcmllbmNlcykubGVuZ3RoID4gMCB8fCBPYmplY3Qua2V5cyh1c2VyU2VsZWN0aW9ucy5za2lsbHMpLmxlbmd0aCA+IDApKSB7XG4gICAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnQXBwbHlpbmcgeW91ciByZXZpZXcgZGVjaXNpb25zLi4uJyk7XG4gICAgICAvLyBEZWNpc2lvbnMgd2VyZSBhbHJlYWR5IHN1Ym1pdHRlZCB2aWEgc3VibWl0RXhwZXJpZW5jZURlY2lzaW9ucy9zdWJtaXRTa2lsbERlY2lzaW9uc1xuICAgICAgLy8gQmFja2VuZCBoYXMgdGhlbSBpbiBjb252ZXJzYXRpb24uc3RhdGVbJ2V4cGVyaWVuY2VfZGVjaXNpb25zJ10gYW5kIFsnc2tpbGxfZGVjaXNpb25zJ11cbiAgICB9XG4gICAgYXdhaXQgZmV0Y2hBbmRSZXZpZXdSZXdyaXRlcygpO1xuICB9KTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jld3JpdGUtYnRuJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzdWJtaXRSZXdyaXRlRGVjaXNpb25zKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NwZWxsLWJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc3VibWl0U3BlbGxDaGVja0RlY2lzaW9ucyk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnZW5lcmF0ZS1wcm9jZWVkLWJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gc3dpdGNoVGFiKCdsYXlvdXQnKSk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYXlvdXQtYnRuJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVMYXlvdXRQcmltYXJ5QWN0aW9uKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbmFsLWdlbmVyYXRlLXByb2NlZWQtYnRuJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmaW5hbEdlbmVyYXRpb25Db21wbGV0ZSk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaW5hbGlzZS1hY3Rpb24tYnRuJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBzd2l0Y2hUYWIoJ2ZpbmFsaXNlJykpO1xuXG4gIGlmICh0eXBlb2YgaW5pdEtleWJvYXJkU2hvcnRjdXRzID09PSAnZnVuY3Rpb24nKSBpbml0S2V5Ym9hcmRTaG9ydGN1dHMoKTtcbiAgaWYgKHR5cGVvZiBpbml0RWFybHlQcmV2aWV3UGFuZWwgPT09ICdmdW5jdGlvbicpIGluaXRFYXJseVByZXZpZXdQYW5lbCgpO1xufVxuXG4vLyBUZXN0cyBub3cgaW1wb3J0IGhlbHBlciBmdW5jdGlvbnMgZnJvbSB0aGVpciBjYW5vbmljYWwgRVMgbW9kdWxlcyBkaXJlY3RseS5cblxuZXhwb3J0IHsgaW5pdCwgc2V0dXBFdmVudExpc3RlbmVycyB9O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvc3JjL21haW4uanMgXHUyMDE0IGVzYnVpbGQgZW50cnkgcG9pbnQgZm9yIHRoZSBmdWxsIGJyb3dzZXIgYnVuZGxlLlxuICpcbiAqIFBoYXNlIDIgbW9kdWxlczogdXRpbHMsIGFwaS1jbGllbnQsIHN0YXRlLW1hbmFnZXIsIHVpLWNvcmUsIGxheW91dC1pbnN0cnVjdGlvblxuICogUGhhc2UgMyBtb2R1bGVzOiBhbGwgZG9tYWluIHNwbGl0IG1vZHVsZXMgKFRpZXIgMFx1MjAxMzcpIGZyb20gdGhlIGFwcC5qcyBtb2R1bGFyaXNhdGlvbi5cbiAqXG4gKiBFdmVyeSBleHBvcnQgaXMgYXNzaWduZWQgdG8gYHdpbmRvd2Agc28gdGhhdCBsZWdhY3kgaW5saW5lIG9uY2xpY2s9XCJmbigpXCJcbiAqIGhhbmRsZXJzIGFuZCBhcHAuanMgY29udGludWUgdG8gd29yayB1bmNoYW5nZWQuXG4gKlxuICogQnVpbGQ6ICBucG0gcnVuIGJ1aWxkICAgICAgICAgIFx1MjE5MiB3ZWIvYnVuZGxlLmpzIChkZXZlbG9wbWVudCwgdW5taW5pZmllZClcbiAqICAgICAgICAgbnBtIHJ1biBidWlsZDpwcm9kICAgICBcdTIxOTIgd2ViL2J1bmRsZS5qcyAobWluaWZpZWQpXG4gKiAgICAgICAgIG5wbSBydW4gYnVpbGQ6d2F0Y2ggICAgXHUyMTkyIHJlYnVpbGQgb24gZXZlcnkgc291cmNlIGNoYW5nZVxuICovXG5cbi8vIFx1MjUwMFx1MjUwMCBMb2dnZXIgKG11c3QgYmUgZmlyc3Qgc28gbmFtZWQgbG9nZ2VycyBhcmUgYXZhaWxhYmxlIHRvIGFsbCBtb2R1bGVzKSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmltcG9ydCAqIGFzIExvZ2dlciBmcm9tICcuLi9sb2dnZXIuanMnO1xuXG4vLyBcdTI1MDBcdTI1MDAgUGhhc2UgMiAob3JpZ2luYWwgYnVuZGxlKSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmltcG9ydCAqIGFzIFV0aWxzICAgICAgICAgICAgIGZyb20gJy4uL3V0aWxzLmpzJztcbmltcG9ydCAqIGFzIEFwaUNsaWVudCAgICAgICAgIGZyb20gJy4uL2FwaS1jbGllbnQuanMnO1xuaW1wb3J0ICogYXMgU3RhdGUgICAgICAgICAgICAgZnJvbSAnLi4vc3RhdGUtbWFuYWdlci5qcyc7XG5pbXBvcnQgKiBhcyBQcm92aWRlckluZm8gICAgICBmcm9tICcuLi9wcm92aWRlci1pbmZvLmpzJztcbmltcG9ydCAqIGFzIFVpQ29yZSAgICAgICAgICAgIGZyb20gJy4uL3VpLWNvcmUuanMnO1xuaW1wb3J0ICogYXMgTGF5b3V0SW5zdHJ1Y3Rpb24gZnJvbSAnLi4vbGF5b3V0LWluc3RydWN0aW9uLmpzJztcblxuLy8gXHUyNTAwXHUyNTAwIFRpZXIgMCBcdTIwMTQgbm8gZGVwZW5kZW5jaWVzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuaW1wb3J0ICogYXMgVmFsaWRhdG9ycyAgICAgICAgICAgIGZyb20gJy4uL3ZhbGlkYXRvcnMuanMnO1xuaW1wb3J0ICogYXMgUmVjb21tZW5kYXRpb25IZWxwZXJzIGZyb20gJy4uL3JlY29tbWVuZGF0aW9uLWhlbHBlcnMuanMnO1xuaW1wb3J0ICogYXMgVWlIZWxwZXJzICAgICAgICAgICAgIGZyb20gJy4uL3VpLWhlbHBlcnMuanMnO1xuaW1wb3J0ICogYXMgUHJvcG9zYWxSZXZpZXcgICAgICAgIGZyb20gJy4uL3Byb3Bvc2FsLXJldmlldy5qcyc7XG5cbi8vIFx1MjUwMFx1MjUwMCBUaWVyIDEgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5pbXBvcnQgKiBhcyBGZXRjaFV0aWxzICAgZnJvbSAnLi4vZmV0Y2gtdXRpbHMuanMnO1xuaW1wb3J0ICogYXMgTWVzc2FnZVF1ZXVlIGZyb20gJy4uL21lc3NhZ2UtcXVldWUuanMnO1xuaW1wb3J0ICogYXMgTGxtTG9nICAgICAgIGZyb20gJy4uL2xsbS1sb2cuanMnO1xuXG4vLyBcdTI1MDBcdTI1MDAgVGllciAyIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuaW1wb3J0ICogYXMgQXV0aFByb3ZpZGVyICAgZnJvbSAnLi4vYXV0aC1wcm92aWRlci5qcyc7XG5pbXBvcnQgKiBhcyBBdHNSZWZpbmVtZW50ICBmcm9tICcuLi9hdHMtcmVmaW5lbWVudC5qcyc7XG5pbXBvcnQgKiBhcyBBdHNNb2RhbHMgICAgICBmcm9tICcuLi9hdHMtbW9kYWxzLmpzJztcbmltcG9ydCAqIGFzIFNlc3Npb25BY3Rpb25zIGZyb20gJy4uL3Nlc3Npb24tYWN0aW9ucy5qcyc7XG5pbXBvcnQgKiBhcyBKb2JBbmFseXNpcyAgICBmcm9tICcuLi9qb2ItYW5hbHlzaXMuanMnO1xuXG4vLyBcdTI1MDBcdTI1MDAgVGllciAzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuaW1wb3J0ICogYXMgR29hbHMgICAgICAgICAgIGZyb20gJy4uL2dvYWxzLmpzJztcbmltcG9ydCAqIGFzIFNlc3Npb25NYW5hZ2VyICBmcm9tICcuLi9zZXNzaW9uLW1hbmFnZXIuanMnO1xuaW1wb3J0ICogYXMgSm9iSW5wdXQgICAgICAgIGZyb20gJy4uL2pvYi1pbnB1dC5qcyc7XG5pbXBvcnQgKiBhcyBNZXNzYWdlRGlzcGF0Y2ggZnJvbSAnLi4vbWVzc2FnZS1kaXNwYXRjaC5qcyc7XG5pbXBvcnQgKiBhcyBRdWVzdGlvbnNQYW5lbCAgZnJvbSAnLi4vcXVlc3Rpb25zLXBhbmVsLmpzJztcblxuLy8gXHUyNTAwXHUyNTAwIFRpZXIgNCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmltcG9ydCAqIGFzIFJldmlld0ljb25zICAgIGZyb20gJy4uL3Jldmlldy1pY29ucy5qcyc7XG5pbXBvcnQgKiBhcyBSZXZpZXdUYWJsZUJhc2UgZnJvbSAnLi4vcmV2aWV3LXRhYmxlLWJhc2UuanMnO1xuXG4vLyBcdTI1MDBcdTI1MDAgVGllciA1IFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuaW1wb3J0ICogYXMgRXhwZXJpZW5jZVJldmlldyAgIGZyb20gJy4uL2V4cGVyaWVuY2UtcmV2aWV3LmpzJztcbmltcG9ydCAqIGFzIFNraWxsc1JldmlldyAgICAgICBmcm9tICcuLi9za2lsbHMtcmV2aWV3LmpzJztcbmltcG9ydCAqIGFzIEFjaGlldmVtZW50c1JldmlldyBmcm9tICcuLi9hY2hpZXZlbWVudHMtcmV2aWV3LmpzJztcbmltcG9ydCAqIGFzIFRhZ2xpbmVSZXZpZXcgICAgICBmcm9tICcuLi90YWdsaW5lLXJldmlldy5qcyc7XG5pbXBvcnQgKiBhcyBTdW1tYXJ5UmV2aWV3ICAgICAgZnJvbSAnLi4vc3VtbWFyeS1yZXZpZXcuanMnO1xuaW1wb3J0ICogYXMgUHVibGljYXRpb25zUmV2aWV3IGZyb20gJy4uL3B1YmxpY2F0aW9ucy1yZXZpZXcuanMnO1xuXG4vLyBcdTI1MDBcdTI1MDAgVGllciA2IFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuaW1wb3J0ICogYXMgUmV3cml0ZVJldmlldyAgICAgIGZyb20gJy4uL3Jld3JpdGUtcmV2aWV3LmpzJztcbmltcG9ydCAqIGFzIFNwZWxsQ2hlY2sgICAgICAgICBmcm9tICcuLi9zcGVsbC1jaGVjay5qcyc7XG5pbXBvcnQgKiBhcyBEb3dubG9hZFRhYiAgICAgICAgZnJvbSAnLi4vZG93bmxvYWQtdGFiLmpzJztcbmltcG9ydCAqIGFzIEZpbmFsR2VuZXJhdGUgICAgICBmcm9tICcuLi9maW5hbC1nZW5lcmF0ZS5qcyc7XG5pbXBvcnQgKiBhcyBXb3JrZmxvd1N0ZXBzICAgICAgZnJvbSAnLi4vd29ya2Zsb3ctc3RlcHMuanMnO1xuaW1wb3J0ICogYXMgTWFzdGVyRGF0YUFpVXBkYXRlIGZyb20gJy4uL21hc3Rlci1kYXRhLWFpLXVwZGF0ZS5qcyc7XG5pbXBvcnQgKiBhcyBNYXN0ZXJDdiAgICAgICAgICAgZnJvbSAnLi4vbWFzdGVyLWN2LmpzJztcbmltcG9ydCAqIGFzIENvdmVyTGV0dGVyICAgICAgICBmcm9tICcuLi9jb3Zlci1sZXR0ZXIuanMnO1xuaW1wb3J0ICogYXMgU2NyZWVuaW5nUXVlc3Rpb25zIGZyb20gJy4uL3NjcmVlbmluZy1xdWVzdGlvbnMuanMnO1xuaW1wb3J0ICogYXMgRmluYWxpc2UgICAgICAgICAgIGZyb20gJy4uL2ZpbmFsaXNlLmpzJztcbmltcG9ydCAqIGFzIEludGVydmlld1ByZXAgICAgICBmcm9tICcuLi9pbnRlcnZpZXctcHJlcC5qcyc7XG5pbXBvcnQgKiBhcyBUaGFua1lvdSAgICAgICAgICAgZnJvbSAnLi4vdGhhbmsteW91LmpzJztcbmltcG9ydCAqIGFzIEhhcnZlc3QgICAgICAgICAgICBmcm9tICcuLi9oYXJ2ZXN0LmpzJztcbmltcG9ydCAqIGFzIEVhcmx5UHJldmlld1BhbmVsICBmcm9tICcuLi9lYXJseS1wcmV2aWV3LXBhbmVsLmpzJztcblxuLy8gXHUyNTAwXHUyNTAwIFRpZXIgNyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmltcG9ydCAqIGFzIFNlc3Npb25Td2l0Y2hlclVpICBmcm9tICcuLi9zZXNzaW9uLXN3aXRjaGVyLXVpLmpzJztcbmltcG9ydCAqIGFzIEtleWJvYXJkU2hvcnRjdXRzICBmcm9tICcuLi9rZXlib2FyZC1zaG9ydGN1dHMuanMnO1xuXG4vLyBcdTI1MDBcdTI1MDAgQXBwIG9yY2hlc3RyYXRvciAoZm9sZGVkIGludG8gYnVuZGxlIFx1MjAxNCBHQVAtNjQpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuaW1wb3J0ICogYXMgQXBwIGZyb20gJy4uL2FwcC5qcyc7XG5cbi8vIFx1MjUwMFx1MjUwMCBBc3NpZ24gYWxsIGV4cG9ydHMgdG8gZ2xvYmFsVGhpcyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbi8vIFBoYXNlIDIgbW9kdWxlcyBmaXJzdDsgcGhhc2UgMyBkb21haW4gbW9kdWxlcyBmb2xsb3cgc28gZnVsbHktZmVhdHVyZWRcbi8vIGltcGxlbWVudGF0aW9ucyBvdmVycmlkZSBhbnkgcGxhY2Vob2xkZXIgc3R1YnMgKGUuZy4gc2hvd1Nlc3Npb25Db25mbGljdEJhbm5lclxuLy8gaW4gc2Vzc2lvbi1zd2l0Y2hlci11aSBvdmVycmlkZXMgdGhlIHNpbXBsZSBzdHViIGluIHVpLWNvcmUpLlxuT2JqZWN0LmFzc2lnbihnbG9iYWxUaGlzLFxuICBMb2dnZXIsIFV0aWxzLCBBcGlDbGllbnQsIFN0YXRlLCBQcm92aWRlckluZm8sIFVpQ29yZSwgTGF5b3V0SW5zdHJ1Y3Rpb24sXG4gIFZhbGlkYXRvcnMsIFJlY29tbWVuZGF0aW9uSGVscGVycywgVWlIZWxwZXJzLCBQcm9wb3NhbFJldmlldyxcbiAgRmV0Y2hVdGlscywgTWVzc2FnZVF1ZXVlLCBMbG1Mb2csXG4gIEF1dGhQcm92aWRlciwgQXRzUmVmaW5lbWVudCwgQXRzTW9kYWxzLCBTZXNzaW9uQWN0aW9ucywgSm9iQW5hbHlzaXMsXG4gIEdvYWxzLFxuICBTZXNzaW9uTWFuYWdlciwgSm9iSW5wdXQsIE1lc3NhZ2VEaXNwYXRjaCwgUXVlc3Rpb25zUGFuZWwsXG4gIFJldmlld1RhYmxlQmFzZSxcbiAgRXhwZXJpZW5jZVJldmlldywgU2tpbGxzUmV2aWV3LCBBY2hpZXZlbWVudHNSZXZpZXcsIFRhZ2xpbmVSZXZpZXcsIFN1bW1hcnlSZXZpZXcsIFB1YmxpY2F0aW9uc1JldmlldywgUmV2aWV3SWNvbnMsXG4gIFJld3JpdGVSZXZpZXcsIFNwZWxsQ2hlY2ssIERvd25sb2FkVGFiLCBGaW5hbEdlbmVyYXRlLCBXb3JrZmxvd1N0ZXBzLCBNYXN0ZXJEYXRhQWlVcGRhdGUsIE1hc3RlckN2LFxuICBDb3ZlckxldHRlciwgU2NyZWVuaW5nUXVlc3Rpb25zLCBGaW5hbGlzZSwgSW50ZXJ2aWV3UHJlcCwgVGhhbmtZb3UsIEhhcnZlc3QsIEVhcmx5UHJldmlld1BhbmVsLFxuICBTZXNzaW9uU3dpdGNoZXJVaSwgS2V5Ym9hcmRTaG9ydGN1dHMsXG4gIEFwcCxcbik7XG5cbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBBcHAuaW5pdCk7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFNQSxPQUFDLFNBQVUsTUFBTSxZQUFZO0FBQ3pCO0FBQ0EsWUFBSSxPQUFPLFdBQVcsY0FBYyxPQUFPLEtBQUs7QUFDNUMsaUJBQU8sVUFBVTtBQUFBLFFBQ3JCLFdBQVcsT0FBTyxXQUFXLFlBQVksT0FBTyxTQUFTO0FBQ3JELGlCQUFPLFVBQVUsV0FBVztBQUFBLFFBQ2hDLE9BQU87QUFDSCxlQUFLLE1BQU0sV0FBVztBQUFBLFFBQzFCO0FBQUEsTUFDSixHQUFFLFNBQU0sV0FBWTtBQUNoQjtBQUdBLFlBQUksT0FBTyxXQUFXO0FBQUEsUUFBQztBQUN2QixZQUFJLGdCQUFnQjtBQUNwQixZQUFJLE9BQVEsT0FBTyxXQUFXLGlCQUFtQixPQUFPLE9BQU8sY0FBYyxpQkFDekUsa0JBQWtCLEtBQUssT0FBTyxVQUFVLFNBQVM7QUFHckQsWUFBSSxhQUFhO0FBQUEsVUFDYjtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxRQUNKO0FBRUEsWUFBSSxpQkFBaUIsQ0FBQztBQUN0QixZQUFJLGdCQUFnQjtBQUdwQixpQkFBUyxXQUFXLEtBQUssWUFBWTtBQUNqQyxjQUFJLFNBQVMsSUFBSSxVQUFVO0FBQzNCLGNBQUksT0FBTyxPQUFPLFNBQVMsWUFBWTtBQUNuQyxtQkFBTyxPQUFPLEtBQUssR0FBRztBQUFBLFVBQzFCLE9BQU87QUFDSCxnQkFBSTtBQUNBLHFCQUFPLFNBQVMsVUFBVSxLQUFLLEtBQUssUUFBUSxHQUFHO0FBQUEsWUFDbkQsU0FBUyxHQUFHO0FBRVIscUJBQU8sV0FBVztBQUNkLHVCQUFPLFNBQVMsVUFBVSxNQUFNLE1BQU0sUUFBUSxDQUFDLEtBQUssU0FBUyxD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QUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsVUE4RS9CLGtCQUFrQixNQUFNLENBQUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxVQWF6QiwwQkFBMEIsY0FBYyxDQUFDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxVQWlCekMsK0JBQStCLFlBQVksQ0FBQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxVQWtCNUMscUJBQXFCLFNBQVMsQ0FBQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FB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QUFFcEcsUUFBSSxPQUFPLDBCQUEwQixXQUFZLHVCQUFzQjtBQUN2RSxRQUFJLE9BQU8sMEJBQTBCLFdBQVksdUJBQXNCO0FBQUEsRUFDekU7OztBQy9EQSxTQUFPO0FBQUEsSUFBTztBQUFBLElBQ1o7QUFBQSxJQUFRO0FBQUEsSUFBTztBQUFBLElBQVc7QUFBQSxJQUFPO0FBQUEsSUFBYztBQUFBLElBQVE7QUFBQSxJQUN2RDtBQUFBLElBQVk7QUFBQSxJQUF1QjtBQUFBLElBQVc7QUFBQSxJQUM5QztBQUFBLElBQVk7QUFBQSxJQUFjO0FBQUEsSUFDMUI7QUFBQSxJQUFjO0FBQUEsSUFBZTtBQUFBLElBQVc7QUFBQSxJQUFnQjtBQUFBLElBQ3hEO0FBQUEsSUFDQTtBQUFBLElBQWdCO0FBQUEsSUFBVTtBQUFBLElBQWlCO0FBQUEsSUFDM0M7QUFBQSxJQUNBO0FBQUEsSUFBa0I7QUFBQSxJQUFjO0FBQUEsSUFBb0I7QUFBQSxJQUFlO0FBQUEsSUFBZTtBQUFBLElBQW9CO0FBQUEsSUFDdEc7QUFBQSxJQUFlO0FBQUEsSUFBWTtBQUFBLElBQWE7QUFBQSxJQUFlO0FBQUEsSUFBZTtBQUFBLElBQW9CO0FBQUEsSUFDMUY7QUFBQSxJQUFhO0FBQUEsSUFBb0I7QUFBQSxJQUFVO0FBQUEsSUFBZTtBQUFBLElBQVU7QUFBQSxJQUFTO0FBQUEsSUFDN0U7QUFBQSxJQUFtQjtBQUFBLElBQ25CO0FBQUEsRUFDRjtBQUVBLFdBQVMsaUJBQWlCLG9CQUF3QixJQUFJOyIsCiAgIm5hbWVzIjogWyJnZXRMb2dnZXIiLCAibG9nZ2VyIiwgImxvZ2xldmVsIiwgImNsZWFuSnNvblJlc3BvbnNlIiwgImVzY2FwZUh0bWwiLCAiZXh0cmFjdEZpcnN0SnNvbk9iamVjdCIsICJleHRyYWN0VGl0bGVBbmRDb21wYW55RnJvbUpvYlRleHQiLCAiZm9ybWF0U2Vzc2lvblBoYXNlTGFiZWwiLCAibm9ybWFsaXplUG9zaXRpb25MYWJlbCIsICJub3JtYWxpemVUZXh0IiwgInRleHQiLCAibSIsICJodG1sIiwgInYiLCAiU3RvcmFnZUtleXMiLCAiYXBpQ2FsbCIsICJjcmVhdGVTZXNzaW9uIiwgImZldGNoU3RhdHVzIiwgImdldE93bmVyVG9rZW4iLCAiZ2V0U2NvcGVkVGFiRGF0YVN0b3JhZ2VLZXkiLCAiZ2V0U2Vzc2lvbklkRnJvbVVSTCIsICJfdXBkYXRlTExNU3RhdHVzQmFyIiwgImxsbUZldGNoIiwgInNldExvYWRpbmciLCAiXyIsICJpbml0IiwgImNoYXRBcmVhIiwgIlN0b3JhZ2VLZXlzIiwgImdldFNlc3Npb25JZEZyb21VUkwiLCAiZ2V0T3duZXJUb2tlbiIsICJnZXRTY29wZWRUYWJEYXRhU3RvcmFnZUtleSIsICJzZXNzaW9uSWQiLCAiaW5pdCIsICJfIiwgImFwaUNhbGwiLCAiY3JlYXRlU2Vzc2lvbiIsICJmZXRjaFN0YXR1cyIsICJQSEFTRVMiLCAic3RhdGVNYW5hZ2VyIiwgImxvZyIsICJQSEFTRVMiLCAic3RhdGVNYW5hZ2VyIiwgIlN0b3JhZ2VLZXlzIiwgImdldFByb3ZpZGVySW5mbyIsICJsb2FkUHJvdmlkZXJJbmZvIiwgInByb3ZpZGVySW5mb1BvcG92ZXJDb250ZW50IiwgImxvYWRQcm92aWRlckluZm8iLCAiZ2V0UHJvdmlkZXJJbmZvIiwgInByb3ZpZGVySW5mb1BvcG92ZXJDb250ZW50IiwgImVzY2FwZUh0bWwiLCAiX3VwZGF0ZUxsbVN0YXR1c1BpbGwiLCAiY2xvc2VNb2RlbE1vZGFsIiwgImNvbmZpcm1EaWFsb2ciLCAiZ2V0U3RhZ2VGb3JUYWIiLCAicHVzaEZvY3VzU3RhY2siLCAicmVzdG9yZUZvY3VzIiwgInNldEluaXRpYWxGb2N1cyIsICJ0cmFwRm9jdXMiLCAidXBkYXRlVGFiQmFyRm9yU3RhZ2UiLCAiX3VwZGF0ZVZpZXdpbmdJbmRpY2F0b3IiLCAiY29uZmlybVJlUnVuUGhhc2UiLCAic2hvd0J1bGxldFJlb3JkZXIiLCAibG9nIiwgInN0YXRlTWFuYWdlciIsICJnZW5lcmF0aW9uU3RhdGUiLCAiY29uZmlybVJlUnVuUGhhc2UiLCAiX3VwZGF0ZVZpZXdpbmdJbmRpY2F0b3IiLCAicSIsICJjbG9zZU1vZGFsIiwgIl9lIiwgInNob3dCdWxsZXRSZW9yZGVyIiwgIl8iLCAidGV4dCIsICJsb2ciLCAiZmV0Y2hTdGF0dXMiLCAiYXBpQ2FsbCIsICJfIiwgInNldEluaXRpYWxGb2N1cyIsICJ0cmFwRm9jdXMiLCAicmVzdG9yZUZvY3VzIiwgInB1c2hGb2N1c1N0YWNrIiwgImNvbmZpcm1EaWFsb2ciLCAiZ2V0U3RhZ2VGb3JUYWIiLCAic3RhdGVNYW5hZ2VyIiwgInVwZGF0ZVRhYkJhckZvclN0YWdlIiwgIlN0b3JhZ2VLZXlzIiwgIl91cGRhdGVMbG1TdGF0dXNQaWxsIiwgInRleHQiLCAiYiIsICJlc2NhcGVIdG1sIiwgImNsb3NlTW9kZWxNb2RhbCIsICJ2IiwgIm0iLCAiZXZlbnQiLCAidXBkYXRlV29ya2Zsb3dTdGVwc0NsaWNrYWJsZSIsICJoYW5kbGVMYXlvdXRQcmltYXJ5QWN0aW9uIiwgImluaXRpYXRlTGF5b3V0SW5zdHJ1Y3Rpb25zIiwgInJlZnJlc2hBdHNTY29yZSIsICJzY2hlZHVsZUF0c1JlZnJlc2giLCAidXBkYXRlQXRzQmFkZ2UiLCAidGV4dCIsICJnZW5lcmF0aW9uU3RhdGUiLCAic2Vzc2lvbklkIiwgIl9lIiwgIl9mbHVzaE1lc3NhZ2VRdWV1ZSIsICJhcHBlbmRGb3JtYXR0ZWRBbmFseXNpcyIsICJhcHBlbmRMb2FkaW5nTWVzc2FnZSIsICJhcHBlbmRNZXNzYWdlIiwgImFwcGVuZFJhd0h0bWwiLCAiYXBwZW5kUmV0cnlNZXNzYWdlIiwgInJlbW92ZUxvYWRpbmdNZXNzYWdlIiwgImxvZyIsICJfZmx1c2hNZXNzYWdlUXVldWUiLCAidGV4dCIsICJhcHBlbmRNZXNzYWdlIiwgImFwcGVuZExvYWRpbmdNZXNzYWdlIiwgInJlbW92ZUxvYWRpbmdNZXNzYWdlIiwgImh0bWwiLCAiZXNjYXBlSHRtbCIsICJhcHBlbmRSZXRyeU1lc3NhZ2UiLCAiYXBwZW5kRm9ybWF0dGVkQW5hbHlzaXMiLCAiY2xlYW5Kc29uUmVzcG9uc2UiLCAiYXBwZW5kUmF3SHRtbCIsICJfdXBkYXRlUGFnZUVzdGltYXRlIiwgImhhbmRsZUFjdGlvbkNsaWNrIiwgImhhbmRsZUN1c3RvbWl6YXRpb25SZXNwb25zZSIsICJzaG93VGFibGVCYXNlZFJldmlldyIsICJzd2l0Y2hUYWIiLCAidXBkYXRlSW5jbHVzaW9uQ291bnRzIiwgInVzZXJTZWxlY3Rpb25zIiwgImxvZyIsICJ1c2VyU2VsZWN0aW9ucyIsICJzdGF0ZU1hbmFnZXIiLCAidXBkYXRlSW5jbHVzaW9uQ291bnRzIiwgInYiLCAic3dpdGNoVGFiIiwgInRhYkRhdGEiLCAic2hvd1RhYmxlQmFzZWRSZXZpZXciLCAic2Vzc2lvbklkIiwgIl8iLCAiaHRtbCIsICJoYW5kbGVDdXN0b21pemF0aW9uUmVzcG9uc2UiLCAic3RhdGVNYW5hZ2VyIiwgIl91cGRhdGVQYWdlRXN0aW1hdGUiLCAidXNlclNlbGVjdGlvbnMiLCAiaGFuZGxlQWN0aW9uQ2xpY2siLCAiaHRtbCIsICJsb2ciLCAic3RhdGVNYW5hZ2VyIiwgImh0bWwiLCAic2Vzc2lvbklkIiwgImVzY2FwZUh0bWwiLCAidGV4dCIsICJnZW5lcmF0aW9uU3RhdGUiLCAiaW5pdGlhdGVMYXlvdXRJbnN0cnVjdGlvbnMiLCAiXyIsICJhcHBlbmRNZXNzYWdlIiwgImNvbmZpcm1SZVJ1blBoYXNlIiwgImFwaUNhbGwiLCAidyIsICJfZSIsICJzY2hlZHVsZUF0c1JlZnJlc2giLCAic3dpdGNoVGFiIiwgImhhbmRsZUxheW91dFByaW1hcnlBY3Rpb24iLCAicGFyc2VNZXNzYWdlUmVzcG9uc2UiLCAicGFyc2VSZXdyaXRlc1Jlc3BvbnNlIiwgInBhcnNlU2Vzc2lvbkxpc3RSZXNwb25zZSIsICJwYXJzZVN0YXR1c1Jlc3BvbnNlIiwgImxvZyIsICJwYXJzZVN0YXR1c1Jlc3BvbnNlIiwgImsiLCAicGFyc2VTZXNzaW9uTGlzdFJlc3BvbnNlIiwgInBhcnNlUmV3cml0ZXNSZXNwb25zZSIsICJwYXJzZU1lc3NhZ2VSZXNwb25zZSIsICJidWlsZEZhbGxiYWNrUG9zdEFuYWx5c2lzUXVlc3Rpb25zIiwgImdldEFjaGlldmVtZW50Q29uZmlkZW5jZSIsICJnZXRBY2hpZXZlbWVudFJlYXNvbmluZyIsICJnZXRBY2hpZXZlbWVudFJlY29tbWVuZGF0aW9uIiwgImdldENvbmZpZGVuY2VMZXZlbCIsICJnZXRFeHBlcmllbmNlUmVhc29uaW5nIiwgImdldEV4cGVyaWVuY2VSZWNvbW1lbmRhdGlvbiIsICJnZXRTa2lsbENvbmZpZGVuY2UiLCAiZ2V0U2tpbGxSZWFzb25pbmciLCAiZ2V0U2tpbGxSZWNvbW1lbmRhdGlvbiIsICJsb2ciLCAiZ2V0RXhwZXJpZW5jZVJlY29tbWVuZGF0aW9uIiwgImdldENvbmZpZGVuY2VMZXZlbCIsICJnZXRFeHBlcmllbmNlUmVhc29uaW5nIiwgImdldFNraWxsUmVjb21tZW5kYXRpb24iLCAiZ2V0U2tpbGxDb25maWRlbmNlIiwgImdldFNraWxsUmVhc29uaW5nIiwgImdldEFjaGlldmVtZW50UmVjb21tZW5kYXRpb24iLCAiZ2V0QWNoaWV2ZW1lbnRDb25maWRlbmNlIiwgImdldEFjaGlldmVtZW50UmVhc29uaW5nIiwgImJ1aWxkRmFsbGJhY2tQb3N0QW5hbHlzaXNRdWVzdGlvbnMiLCAiY2xvc2VBbGVydE1vZGFsIiwgInNob3dBbGVydE1vZGFsIiwgInNob3dDb25maXJtTW9kYWwiLCAic2hvd1RvYXN0IiwgInVwZGF0ZUFjdGlvbkJ1dHRvbnMiLCAic2hvd0FsZXJ0TW9kYWwiLCAiY2xvc2VBbGVydE1vZGFsIiwgInNob3dDb25maXJtTW9kYWwiLCAic2hvd1RvYXN0IiwgInN0YXRlTWFuYWdlciIsICJnZW5lcmF0aW9uU3RhdGUiLCAidXBkYXRlQWN0aW9uQnV0dG9ucyIsICJldmVudCIsICJmZXRjaEFuZERpc3BsYXlMbG1Mb2ciLCAibG9nIiwgInRleHQiLCAiZXNjYXBlSHRtbCIsICJtIiwgImh0bWwiLCAiZmV0Y2hBbmREaXNwbGF5TGxtTG9nIiwgInNlc3Npb25JZCIsICJnZXRTZXNzaW9uSWRGcm9tVVJMIiwgInVwZGF0ZUF1dGhCYWRnZSIsICJ1cGRhdGVBdXRoQmFkZ2UiLCAidGV4dCIsICJnZXRQcm92aWRlckluZm8iLCAicG9wdWxhdGVBdHNTY29yZVRhYiIsICJzZXNzaW9uSWQiLCAic3RhdGVNYW5hZ2VyIiwgIl8iLCAiZXNjYXBlSHRtbCIsICJwdXNoRm9jdXNTdGFjayIsICJ0cmFwRm9jdXMiLCAidXBkYXRlQXRzQmFkZ2UiLCAicmVzdG9yZUZvY3VzIiwgImsiLCAicG9wdWxhdGVBdHNTY29yZVRhYiIsICJfQUNUSU9OX0xBQkVMUyIsICJzZW5kQWN0aW9uIiwgInVwZGF0ZVBvc2l0aW9uVGl0bGUiLCAibG9nIiwgIl9BQ1RJT05fTEFCRUxTIiwgInNlbmRBY3Rpb24iLCAic3RhdGVNYW5hZ2VyIiwgIl9lIiwgIlN0b3JhZ2VLZXlzIiwgInRleHQiLCAidXBkYXRlUG9zaXRpb25UaXRsZSIsICJhbmFseXplSm9iIiwgIm1lcmdlUG9zdEFuYWx5c2lzUXVlc3Rpb25zIiwgIm5vcm1hbGl6ZVBvc3RBbmFseXNpc1F1ZXN0aW9ucyIsICJsb2ciLCAibm9ybWFsaXplUG9zdEFuYWx5c2lzUXVlc3Rpb25zIiwgInEiLCAidGV4dCIsICJtZXJnZVBvc3RBbmFseXNpc1F1ZXN0aW9ucyIsICJhbmFseXplSm9iIiwgInN0YXRlTWFuYWdlciIsICJTdG9yYWdlS2V5cyIsICJfZSIsICJwb3B1bGF0ZUdvYWxzVGFiIiwgImxvZyIsICJwb3B1bGF0ZUdvYWxzVGFiIiwgIl9nZXRDdXJyZW50U2Vzc2lvbklkVmFsdWUiLCAiYnVpbGRTZXNzaW9uU3dpdGNoZXJMYWJlbCIsICJjcmVhdGVOZXdTZXNzaW9uQW5kTmF2aWdhdGUiLCAiZW5zdXJlU2Vzc2lvbkNvbnRleHQiLCAiZm9ybWF0U2Vzc2lvblBoYXNlTGFiZWwiLCAiZm9ybWF0U2Vzc2lvblRpbWVzdGFtcCIsICJnZXRBY3RpdmVTZXNzaW9uT3duZXJzaGlwTWV0YSIsICJsb2FkU2Vzc2lvbkZpbGUiLCAibWF5YmVTaG93V2VsY29tZU1vZGFsIiwgInJlc3RvcmVTZXNzaW9uIiwgInNhdmVUYWJEYXRhIiwgImxvZyIsICJmb3JtYXRTZXNzaW9uUGhhc2VMYWJlbCIsICJfZ2V0Q3VycmVudFNlc3Npb25JZFZhbHVlIiwgIl8iLCAiYnVpbGRTZXNzaW9uU3dpdGNoZXJMYWJlbCIsICJnZXRBY3RpdmVTZXNzaW9uT3duZXJzaGlwTWV0YSIsICJmb3JtYXRTZXNzaW9uVGltZXN0YW1wIiwgIm1heWJlU2hvd1dlbGNvbWVNb2RhbCIsICJjcmVhdGVOZXdTZXNzaW9uQW5kTmF2aWdhdGUiLCAic3RhdGVNYW5hZ2VyIiwgIlBIQVNFUyIsICJlbnN1cmVTZXNzaW9uQ29udGV4dCIsICJyZXN0b3JlU2Vzc2lvbiIsICJrIiwgInYiLCAiX2UiLCAibG9hZFNlc3Npb25GaWxlIiwgInNhdmVUYWJEYXRhIiwgInBvcHVsYXRlSm9iVGFiIiwgInNob3dMb2FkSm9iUGFuZWwiLCAiX2dldERlZmF1bHRzIiwgIl9kZWZhdWx0cyIsICJjaGFuZ2VEZWZhdWx0cyIsICJuZXdEZWZhdWx0cyIsICJub29wVGVzdCIsICJlZGl0IiwgInJlZ2V4IiwgIm9wdCIsICJzb3VyY2UiLCAib2JqIiwgIm5hbWUiLCAidmFsIiwgInZhbFNvdXJjZSIsICJvdGhlciIsICJzdXBwb3J0c0xvb2tiZWhpbmQiLCAiYnVsbCIsICJpbmRlbnQiLCAibmV3bGluZSIsICJibG9ja0NvZGUiLCAiZmVuY2VzIiwgImhyIiwgImhlYWRpbmciLCAiYnVsbGV0IiwgImxoZWFkaW5nQ29yZSIsICJsaGVhZGluZyIsICJsaGVhZGluZ0dmbSIsICJfcGFyYWdyYXBoIiwgImJsb2NrVGV4dCIsICJfYmxvY2tMYWJlbCIsICJkZWYiLCAibGlzdCIsICJfdGFnIiwgIl9jb21tZW50IiwgImh0bWwiLCAicGFyYWdyYXBoIiwgImJsb2NrcXVvdGUiLCAiYmxvY2tOb3JtYWwiLCAiZ2ZtVGFibGUiLCAiYmxvY2tHZm0iLCAiYmxvY2tQZWRhbnRpYyIsICJlc2NhcGUiLCAiaW5saW5lQ29kZSIsICJiciIsICJpbmxpbmVUZXh0IiwgIl9wdW5jdHVhdGlvbiIsICJfcHVuY3R1YXRpb25PclNwYWNlIiwgIl9ub3RQdW5jdHVhdGlvbk9yU3BhY2UiLCAicHVuY3R1YXRpb24iLCAiX3B1bmN0dWF0aW9uR2ZtU3Ryb25nRW0iLCAiX3B1bmN0dWF0aW9uT3JTcGFjZUdmbVN0cm9uZ0VtIiwgIl9ub3RQdW5jdHVhdGlvbk9yU3BhY2VHZm1TdHJvbmdFbSIsICJibG9ja1NraXAiLCAiZW1TdHJvbmdMRGVsaW1Db3JlIiwgImVtU3Ryb25nTERlbGltIiwgImVtU3Ryb25nTERlbGltR2ZtIiwgImVtU3Ryb25nUkRlbGltQXN0Q29yZSIsICJlbVN0cm9uZ1JEZWxpbUFzdCIsICJlbVN0cm9uZ1JEZWxpbUFzdEdmbSIsICJlbVN0cm9uZ1JEZWxpbVVuZCIsICJkZWxMRGVsaW0iLCAiZGVsUkRlbGltQ29yZSIsICJkZWxSRGVsaW0iLCAiYW55UHVuY3R1YXRpb24iLCAiYXV0b2xpbmsiLCAiX2lubGluZUNvbW1lbnQiLCAidGFnIiwgIl9pbmxpbmVMYWJlbCIsICJsaW5rIiwgInJlZmxpbmsiLCAibm9saW5rIiwgInJlZmxpbmtTZWFyY2giLCAiX2Nhc2VJbnNlbnNpdGl2ZVByb3RvY29sIiwgImlubGluZU5vcm1hbCIsICJpbmxpbmVQZWRhbnRpYyIsICJpbmxpbmVHZm0iLCAiaW5saW5lQnJlYWtzIiwgImJsb2NrIiwgImlubGluZSIsICJlc2NhcGVSZXBsYWNlbWVudHMiLCAiZ2V0RXNjYXBlUmVwbGFjZW1lbnQiLCAiY2giLCAiZXNjYXBlSHRtbEVudGl0aWVzIiwgImVuY29kZSIsICJjbGVhblVybCIsICJocmVmIiwgInNwbGl0Q2VsbHMiLCAidGFibGVSb3ciLCAiY291bnQiLCAicm93IiwgIm1hdGNoIiwgIm9mZnNldCIsICJzdHIiLCAiZXNjYXBlZCIsICJjdXJyIiwgImNlbGxzIiwgImkiLCAicnRyaW0iLCAiYyIsICJpbnZlcnQiLCAibCIsICJzdWZmTGVuIiwgImN1cnJDaGFyIiwgImZpbmRDbG9zaW5nQnJhY2tldCIsICJiIiwgImxldmVsIiwgImV4cGFuZFRhYnMiLCAibGluZSIsICJjb2wiLCAiZXhwYW5kZWQiLCAiY2hhciIsICJhZGRlZCIsICJvdXRwdXRMaW5rIiwgImNhcCIsICJyYXciLCAibGV4ZXIiLCAicnVsZXMiLCAidGl0bGUiLCAidGV4dCIsICJ0b2tlbiIsICJpbmRlbnRDb2RlQ29tcGVuc2F0aW9uIiwgIm1hdGNoSW5kZW50VG9Db2RlIiwgImluZGVudFRvQ29kZSIsICJub2RlIiwgIm1hdGNoSW5kZW50SW5Ob2RlIiwgImluZGVudEluTm9kZSIsICJfVG9rZW5pemVyIiwgIm9wdGlvbnMiLCAic3JjIiwgInRyaW1tZWQiLCAibGluZXMiLCAidG9rZW5zIiwgImluQmxvY2txdW90ZSIsICJjdXJyZW50TGluZXMiLCAiY3VycmVudFJhdyIsICJjdXJyZW50VGV4dCIsICJ0b3AiLCAibGFzdFRva2VuIiwgIm9sZFRva2VuIiwgIm5ld1RleHQiLCAibmV3VG9rZW4iLCAiaXNvcmRlcmVkIiwgIml0ZW1SZWdleCIsICJlbmRzV2l0aEJsYW5rTGluZSIsICJlbmRFYXJseSIsICJpdGVtQ29udGVudHMiLCAibmV4dExpbmUiLCAiYmxhbmtMaW5lIiwgIm5leHRCdWxsZXRSZWdleCIsICJoclJlZ2V4IiwgImZlbmNlc0JlZ2luUmVnZXgiLCAiaGVhZGluZ0JlZ2luUmVnZXgiLCAiaHRtbEJlZ2luUmVnZXgiLCAiYmxvY2txdW90ZUJlZ2luUmVnZXgiLCAicmF3TGluZSIsICJuZXh0TGluZVdpdGhvdXRUYWJzIiwgImxhc3RJdGVtIiwgIml0ZW0iLCAidGFza1JhdyIsICJjaGVja2JveFRva2VuIiwgInNwYWNlcnMiLCAidCIsICJoYXNNdWx0aXBsZUxpbmVCcmVha3MiLCAiaGVhZGVycyIsICJhbGlnbnMiLCAicm93cyIsICJhbGlnbiIsICJjZWxsIiwgInRyaW1tZWRVcmwiLCAicnRyaW1TbGFzaCIsICJsYXN0UGFyZW5JbmRleCIsICJsaW5rTGVuIiwgImxpbmtzIiwgImxpbmtTdHJpbmciLCAibWFza2VkU3JjIiwgInByZXZDaGFyIiwgImxMZW5ndGgiLCAickRlbGltIiwgInJMZW5ndGgiLCAiZGVsaW1Ub3RhbCIsICJtaWREZWxpbVRvdGFsIiwgImVuZFJlZyIsICJsYXN0Q2hhckxlbmd0aCIsICJoYXNOb25TcGFjZUNoYXJzIiwgImhhc1NwYWNlQ2hhcnNPbkJvdGhFbmRzIiwgInByZXZDYXBaZXJvIiwgIl9MZXhlciIsICJfX0xleGVyIiwgIm5leHQiLCAibGFzdFBhcmFncmFwaENsaXBwZWQiLCAiZXh0VG9rZW5pemVyIiwgImN1dFNyYyIsICJzdGFydEluZGV4IiwgInRlbXBTcmMiLCAidGVtcFN0YXJ0IiwgImdldFN0YXJ0SW5kZXgiLCAiZXJyTXNnIiwgImtlZXBQcmV2Q2hhciIsICJfUmVuZGVyZXIiLCAibGFuZyIsICJsYW5nU3RyaW5nIiwgImNvZGUiLCAiZGVwdGgiLCAib3JkZXJlZCIsICJzdGFydCIsICJib2R5IiwgImoiLCAidHlwZSIsICJzdGFydEF0dHIiLCAiY2hlY2tlZCIsICJoZWFkZXIiLCAiayIsICJjb250ZW50IiwgImNsZWFuSHJlZiIsICJvdXQiLCAiX1RleHRSZW5kZXJlciIsICJfUGFyc2VyIiwgIl9fUGFyc2VyIiwgImFueVRva2VuIiwgImdlbmVyaWNUb2tlbiIsICJyZXQiLCAicmVuZGVyZXIiLCAiX0hvb2tzIiwgIm1hcmtkb3duIiwgIk1hcmtlZCIsICJhcmdzIiwgImNhbGxiYWNrIiwgInZhbHVlcyIsICJ0YWJsZVRva2VuIiwgImxpc3RUb2tlbiIsICJjaGlsZFRva2VucyIsICJleHRlbnNpb25zIiwgInBhY2siLCAib3B0cyIsICJleHQiLCAicHJldlJlbmRlcmVyIiwgImV4dExldmVsIiwgInByb3AiLCAicmVuZGVyZXJQcm9wIiwgInJlbmRlcmVyRnVuYyIsICJ0b2tlbml6ZXIiLCAidG9rZW5pemVyUHJvcCIsICJ0b2tlbml6ZXJGdW5jIiwgInByZXZUb2tlbml6ZXIiLCAiaG9va3MiLCAiaG9va3NQcm9wIiwgImhvb2tzRnVuYyIsICJwcmV2SG9vayIsICJhcmciLCAid2Fsa1Rva2VucyIsICJwYWNrV2Fsa3Rva2VucyIsICJibG9ja1R5cGUiLCAib3JpZ09wdCIsICJ0aHJvd0Vycm9yIiwgInByb2Nlc3NlZFNyYyIsICJwcm9jZXNzZWRUb2tlbnMiLCAiZSIsICJzaWxlbnQiLCAiYXN5bmMiLCAibXNnIiwgIm1hcmtlZEluc3RhbmNlIiwgIm1hcmtlZCIsICJzZXRPcHRpb25zIiwgInVzZSIsICJwYXJzZUlubGluZSIsICJwYXJzZXIiLCAiX1BhcnNlciIsICJsZXhlciIsICJfTGV4ZXIiLCAiZW50cmllcyIsICJzZXRQcm90b3R5cGVPZiIsICJpc0Zyb3plbiIsICJnZXRQcm90b3R5cGVPZiIsICJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCAiT2JqZWN0IiwgImZyZWV6ZSIsICJzZWFsIiwgImNyZWF0ZSIsICJhcHBseSIsICJjb25zdHJ1Y3QiLCAiUmVmbGVjdCIsICJ4IiwgImZ1bmMiLCAidGhpc0FyZyIsICJfbGVuIiwgImFyZ3VtZW50cyIsICJsZW5ndGgiLCAiYXJncyIsICJBcnJheSIsICJfa2V5IiwgIkZ1bmMiLCAiX2xlbjIiLCAiX2tleTIiLCAiYXJyYXlGb3JFYWNoIiwgInVuYXBwbHkiLCAicHJvdG90eXBlIiwgImZvckVhY2giLCAiYXJyYXlMYXN0SW5kZXhPZiIsICJsYXN0SW5kZXhPZiIsICJhcnJheVBvcCIsICJwb3AiLCAiYXJyYXlQdXNoIiwgInB1c2giLCAiYXJyYXlTcGxpY2UiLCAic3BsaWNlIiwgInN0cmluZ1RvTG93ZXJDYXNlIiwgIlN0cmluZyIsICJ0b0xvd2VyQ2FzZSIsICJzdHJpbmdUb1N0cmluZyIsICJ0b1N0cmluZyIsICJzdHJpbmdNYXRjaCIsICJtYXRjaCIsICJzdHJpbmdSZXBsYWNlIiwgInJlcGxhY2UiLCAic3RyaW5nSW5kZXhPZiIsICJpbmRleE9mIiwgInN0cmluZ1RyaW0iLCAidHJpbSIsICJvYmplY3RIYXNPd25Qcm9wZXJ0eSIsICJoYXNPd25Qcm9wZXJ0eSIsICJyZWdFeHBUZXN0IiwgIlJlZ0V4cCIsICJ0ZXN0IiwgInR5cGVFcnJvckNyZWF0ZSIsICJ1bmNvbnN0cnVjdCIsICJUeXBlRXJyb3IiLCAibGFzdEluZGV4IiwgIl9sZW4zIiwgIl9rZXkzIiwgIl9sZW40IiwgIl9rZXk0IiwgImFkZFRvU2V0IiwgInNldCIsICJhcnJheSIsICJ0cmFuc2Zvcm1DYXNlRnVuYyIsICJsIiwgImVsZW1lbnQiLCAibGNFbGVtZW50IiwgImNsZWFuQXJyYXkiLCAiaW5kZXgiLCAiaXNQcm9wZXJ0eUV4aXN0IiwgImNsb25lIiwgIm9iamVjdCIsICJuZXdPYmplY3QiLCAicHJvcGVydHkiLCAidmFsdWUiLCAiaXNBcnJheSIsICJjb25zdHJ1Y3RvciIsICJsb29rdXBHZXR0ZXIiLCAicHJvcCIsICJkZXNjIiwgImdldCIsICJmYWxsYmFja1ZhbHVlIiwgImh0bWwiLCAic3ZnIiwgInN2Z0ZpbHRlcnMiLCAic3ZnRGlzYWxsb3dlZCIsICJtYXRoTWwiLCAibWF0aE1sRGlzYWxsb3dlZCIsICJ0ZXh0IiwgInhtbCIsICJNVVNUQUNIRV9FWFBSIiwgIkVSQl9FWFBSIiwgIlRNUExJVF9FWFBSIiwgIkRBVEFfQVRUUiIsICJBUklBX0FUVFIiLCAiSVNfQUxMT1dFRF9VUkkiLCAiSVNfU0NSSVBUX09SX0RBVEEiLCAiQVRUUl9XSElURVNQQUNFIiwgIkRPQ1RZUEVfTkFNRSIsICJDVVNUT01fRUxFTUVOVCIsICJOT0RFX1RZUEUiLCAiYXR0cmlidXRlIiwgImNkYXRhU2VjdGlvbiIsICJlbnRpdHlSZWZlcmVuY2UiLCAiZW50aXR5Tm9kZSIsICJwcm9ncmVzc2luZ0luc3RydWN0aW9uIiwgImNvbW1lbnQiLCAiZG9jdW1lbnQiLCAiZG9jdW1lbnRUeXBlIiwgImRvY3VtZW50RnJhZ21lbnQiLCAibm90YXRpb24iLCAiZ2V0R2xvYmFsIiwgIndpbmRvdyIsICJfY3JlYXRlVHJ1c3RlZFR5cGVzUG9saWN5IiwgInRydXN0ZWRUeXBlcyIsICJwdXJpZnlIb3N0RWxlbWVudCIsICJjcmVhdGVQb2xpY3kiLCAic3VmZml4IiwgIkFUVFJfTkFNRSIsICJoYXNBdHRyaWJ1dGUiLCAiZ2V0QXR0cmlidXRlIiwgInBvbGljeU5hbWUiLCAiY3JlYXRlSFRNTCIsICJjcmVhdGVTY3JpcHRVUkwiLCAic2NyaXB0VXJsIiwgIl8iLCAiY29uc29sZSIsICJ3YXJuIiwgIl9jcmVhdGVIb29rc01hcCIsICJhZnRlclNhbml0aXplQXR0cmlidXRlcyIsICJhZnRlclNhbml0aXplRWxlbWVudHMiLCAiYWZ0ZXJTYW5pdGl6ZVNoYWRvd0RPTSIsICJiZWZvcmVTYW5pdGl6ZUF0dHJpYnV0ZXMiLCAiYmVmb3JlU2FuaXRpemVFbGVtZW50cyIsICJiZWZvcmVTYW5pdGl6ZVNoYWRvd0RPTSIsICJ1cG9uU2FuaXRpemVBdHRyaWJ1dGUiLCAidXBvblNhbml0aXplRWxlbWVudCIsICJ1cG9uU2FuaXRpemVTaGFkb3dOb2RlIiwgImNyZWF0ZURPTVB1cmlmeSIsICJ1bmRlZmluZWQiLCAiRE9NUHVyaWZ5IiwgInJvb3QiLCAidmVyc2lvbiIsICJWRVJTSU9OIiwgInJlbW92ZWQiLCAibm9kZVR5cGUiLCAiRWxlbWVudCIsICJpc1N1cHBvcnRlZCIsICJvcmlnaW5hbERvY3VtZW50IiwgImN1cnJlbnRTY3JpcHQiLCAiRG9jdW1lbnRGcmFnbWVudCIsICJIVE1MVGVtcGxhdGVFbGVtZW50IiwgIk5vZGUiLCAiTm9kZUZpbHRlciIsICJOYW1lZE5vZGVNYXAiLCAiTW96TmFtZWRBdHRyTWFwIiwgIkhUTUxGb3JtRWxlbWVudCIsICJET01QYXJzZXIiLCAiRWxlbWVudFByb3RvdHlwZSIsICJjbG9uZU5vZGUiLCAicmVtb3ZlIiwgImdldE5leHRTaWJsaW5nIiwgImdldENoaWxkTm9kZXMiLCAiZ2V0UGFyZW50Tm9kZSIsICJ0ZW1wbGF0ZSIsICJjcmVhdGVFbGVtZW50IiwgImNvbnRlbnQiLCAib3duZXJEb2N1bWVudCIsICJ0cnVzdGVkVHlwZXNQb2xpY3kiLCAiZW1wdHlIVE1MIiwgImltcGxlbWVudGF0aW9uIiwgImNyZWF0ZU5vZGVJdGVyYXRvciIsICJjcmVhdGVEb2N1bWVudEZyYWdtZW50IiwgImdldEVsZW1lbnRzQnlUYWdOYW1lIiwgImltcG9ydE5vZGUiLCAiaG9va3MiLCAiY3JlYXRlSFRNTERvY3VtZW50IiwgIkVYUFJFU1NJT05TIiwgIkFMTE9XRURfVEFHUyIsICJERUZBVUxUX0FMTE9XRURfVEFHUyIsICJUQUdTIiwgIkFMTE9XRURfQVRUUiIsICJERUZBVUxUX0FMTE9XRURfQVRUUiIsICJBVFRSUyIsICJDVVNUT01fRUxFTUVOVF9IQU5ETElORyIsICJ0YWdOYW1lQ2hlY2siLCAid3JpdGFibGUiLCAiY29uZmlndXJhYmxlIiwgImVudW1lcmFibGUiLCAiYXR0cmlidXRlTmFtZUNoZWNrIiwgImFsbG93Q3VzdG9taXplZEJ1aWx0SW5FbGVtZW50cyIsICJGT1JCSURfVEFHUyIsICJGT1JCSURfQVRUUiIsICJFWFRSQV9FTEVNRU5UX0hBTkRMSU5HIiwgInRhZ0NoZWNrIiwgImF0dHJpYnV0ZUNoZWNrIiwgIkFMTE9XX0FSSUFfQVRUUiIsICJBTExPV19EQVRBX0FUVFIiLCAiQUxMT1dfVU5LTk9XTl9QUk9UT0NPTFMiLCAiQUxMT1dfU0VMRl9DTE9TRV9JTl9BVFRSIiwgIlNBRkVfRk9SX1RFTVBMQVRFUyIsICJTQUZFX0ZPUl9YTUwiLCAiV0hPTEVfRE9DVU1FTlQiLCAiU0VUX0NPTkZJRyIsICJGT1JDRV9CT0RZIiwgIlJFVFVSTl9ET00iLCAiUkVUVVJOX0RPTV9GUkFHTUVOVCIsICJSRVRVUk5fVFJVU1RFRF9UWVBFIiwgIlNBTklUSVpFX0RPTSIsICJTQU5JVElaRV9OQU1FRF9QUk9QUyIsICJTQU5JVElaRV9OQU1FRF9QUk9QU19QUkVGSVgiLCAiS0VFUF9DT05URU5UIiwgIklOX1BMQUNFIiwgIlVTRV9QUk9GSUxFUyIsICJGT1JCSURfQ09OVEVOVFMiLCAiREVGQVVMVF9GT1JCSURfQ09OVEVOVFMiLCAiREFUQV9VUklfVEFHUyIsICJERUZBVUxUX0RBVEFfVVJJX1RBR1MiLCAiVVJJX1NBRkVfQVRUUklCVVRFUyIsICJERUZBVUxUX1VSSV9TQUZFX0FUVFJJQlVURVMiLCAiTUFUSE1MX05BTUVTUEFDRSIsICJTVkdfTkFNRVNQQUNFIiwgIkhUTUxfTkFNRVNQQUNFIiwgIk5BTUVTUEFDRSIsICJJU19FTVBUWV9JTlBVVCIsICJBTExPV0VEX05BTUVTUEFDRVMiLCAiREVGQVVMVF9BTExPV0VEX05BTUVTUEFDRVMiLCAiTUFUSE1MX1RFWFRfSU5URUdSQVRJT05fUE9JTlRTIiwgIkhUTUxfSU5URUdSQVRJT05fUE9JTlRTIiwgIkNPTU1PTl9TVkdfQU5EX0hUTUxfRUxFTUVOVFMiLCAiUEFSU0VSX01FRElBX1RZUEUiLCAiU1VQUE9SVEVEX1BBUlNFUl9NRURJQV9UWVBFUyIsICJERUZBVUxUX1BBUlNFUl9NRURJQV9UWVBFIiwgIkNPTkZJRyIsICJmb3JtRWxlbWVudCIsICJpc1JlZ2V4T3JGdW5jdGlvbiIsICJ0ZXN0VmFsdWUiLCAiRnVuY3Rpb24iLCAiX3BhcnNlQ29uZmlnIiwgImNmZyIsICJBRERfVVJJX1NBRkVfQVRUUiIsICJBRERfREFUQV9VUklfVEFHUyIsICJBTExPV0VEX1VSSV9SRUdFWFAiLCAiQUREX1RBR1MiLCAiQUREX0FUVFIiLCAiQUREX0ZPUkJJRF9DT05URU5UUyIsICJ0YWJsZSIsICJ0Ym9keSIsICJUUlVTVEVEX1RZUEVTX1BPTElDWSIsICJBTExfU1ZHX1RBR1MiLCAiQUxMX01BVEhNTF9UQUdTIiwgIl9jaGVja1ZhbGlkTmFtZXNwYWNlIiwgInBhcmVudCIsICJ0YWdOYW1lIiwgIm5hbWVzcGFjZVVSSSIsICJwYXJlbnRUYWdOYW1lIiwgIkJvb2xlYW4iLCAiX2ZvcmNlUmVtb3ZlIiwgIm5vZGUiLCAicmVtb3ZlQ2hpbGQiLCAiX3JlbW92ZUF0dHJpYnV0ZSIsICJuYW1lIiwgImdldEF0dHJpYnV0ZU5vZGUiLCAiZnJvbSIsICJyZW1vdmVBdHRyaWJ1dGUiLCAic2V0QXR0cmlidXRlIiwgIl9pbml0RG9jdW1lbnQiLCAiZGlydHkiLCAiZG9jIiwgImxlYWRpbmdXaGl0ZXNwYWNlIiwgIm1hdGNoZXMiLCAiZGlydHlQYXlsb2FkIiwgInBhcnNlRnJvbVN0cmluZyIsICJkb2N1bWVudEVsZW1lbnQiLCAiY3JlYXRlRG9jdW1lbnQiLCAiaW5uZXJIVE1MIiwgImJvZHkiLCAiaW5zZXJ0QmVmb3JlIiwgImNyZWF0ZVRleHROb2RlIiwgImNoaWxkTm9kZXMiLCAiY2FsbCIsICJfY3JlYXRlTm9kZUl0ZXJhdG9yIiwgIlNIT1dfRUxFTUVOVCIsICJTSE9XX0NPTU1FTlQiLCAiU0hPV19URVhUIiwgIlNIT1dfUFJPQ0VTU0lOR19JTlNUUlVDVElPTiIsICJTSE9XX0NEQVRBX1NFQ1RJT04iLCAiX2lzQ2xvYmJlcmVkIiwgIm5vZGVOYW1lIiwgInRleHRDb250ZW50IiwgImF0dHJpYnV0ZXMiLCAiaGFzQ2hpbGROb2RlcyIsICJfaXNOb2RlIiwgIl9leGVjdXRlSG9va3MiLCAiY3VycmVudE5vZGUiLCAiZGF0YSIsICJob29rIiwgIl9zYW5pdGl6ZUVsZW1lbnRzIiwgImFsbG93ZWRUYWdzIiwgImZpcnN0RWxlbWVudENoaWxkIiwgIl9pc0Jhc2ljQ3VzdG9tRWxlbWVudCIsICJwYXJlbnROb2RlIiwgImNoaWxkQ291bnQiLCAiaSIsICJjaGlsZENsb25lIiwgIl9fcmVtb3ZhbENvdW50IiwgImV4cHIiLCAiX2lzVmFsaWRBdHRyaWJ1dGUiLCAibGNUYWciLCAibGNOYW1lIiwgIl9zYW5pdGl6ZUF0dHJpYnV0ZXMiLCAiaG9va0V2ZW50IiwgImF0dHJOYW1lIiwgImF0dHJWYWx1ZSIsICJrZWVwQXR0ciIsICJhbGxvd2VkQXR0cmlidXRlcyIsICJmb3JjZUtlZXBBdHRyIiwgImF0dHIiLCAiaW5pdFZhbHVlIiwgImdldEF0dHJpYnV0ZVR5cGUiLCAic2V0QXR0cmlidXRlTlMiLCAiX3Nhbml0aXplU2hhZG93RE9NIiwgImZyYWdtZW50IiwgInNoYWRvd05vZGUiLCAic2hhZG93SXRlcmF0b3IiLCAibmV4dE5vZGUiLCAic2FuaXRpemUiLCAiaW1wb3J0ZWROb2RlIiwgInJldHVybk5vZGUiLCAiYXBwZW5kQ2hpbGQiLCAiZmlyc3RDaGlsZCIsICJub2RlSXRlcmF0b3IiLCAic2hhZG93cm9vdCIsICJzaGFkb3dyb290bW9kZSIsICJzZXJpYWxpemVkSFRNTCIsICJvdXRlckhUTUwiLCAiZG9jdHlwZSIsICJzZXRDb25maWciLCAiY2xlYXJDb25maWciLCAiaXNWYWxpZEF0dHJpYnV0ZSIsICJ0YWciLCAiYWRkSG9vayIsICJlbnRyeVBvaW50IiwgImhvb2tGdW5jdGlvbiIsICJyZW1vdmVIb29rIiwgInJlbW92ZUhvb2tzIiwgInJlbW92ZUFsbEhvb2tzIiwgImxvZyIsICJ0ZXh0IiwgInBvcHVsYXRlSm9iVGFiIiwgImh0bWwiLCAiUEhBU0VTIiwgInNob3dMb2FkSm9iUGFuZWwiLCAic3RhdGVNYW5hZ2VyIiwgImV2ZW50IiwgIm0iLCAidSIsICJfcHJvY2VlZEFmdGVySW50YWtlIiwgIl9zaG93SW50YWtlQ29uZmlybUNhcmQiLCAic2VuZE1lc3NhZ2UiLCAibG9nIiwgIlJFVFJZX1BPTElDWV9TVE9SQUdFX0tFWSIsICJ0ZXh0IiwgInNlbmRNZXNzYWdlIiwgInN0YXRlTWFuYWdlciIsICJnZXRTZXNzaW9uSWRGcm9tVVJMIiwgIl9zaG93SW50YWtlQ29uZmlybUNhcmQiLCAiX3Byb2NlZWRBZnRlckludGFrZSIsICJfZSIsICJhc2tQb3N0QW5hbHlzaXNRdWVzdGlvbnMiLCAiaGFuZGxlUXVlc3Rpb25SZXNwb25zZSIsICJwb3B1bGF0ZVF1ZXN0aW9uc1RhYiIsICJsb2ciLCAiYXNrUG9zdEFuYWx5c2lzUXVlc3Rpb25zIiwgInBvcHVsYXRlUXVlc3Rpb25zVGFiIiwgInN0YXRlTWFuYWdlciIsICJxIiwgIl8iLCAiaGFuZGxlUXVlc3Rpb25SZXNwb25zZSIsICJidWlsZEV4cGVyaWVuY2VSZXZpZXdUYWJsZSIsICJoYW5kbGVFeHBlcmllbmNlUmVzcG9uc2UiLCAibG9nIiwgIl9maW5kRXhwZXJpZW5jZVJlY29tbWVuZGF0aW9uUmVjb3JkIiwgIl8iLCAiYnVpbGRFeHBlcmllbmNlUmV2aWV3VGFibGUiLCAiYiIsICJoYW5kbGVFeHBlcmllbmNlUmVzcG9uc2UiLCAic3RhdGVNYW5hZ2VyIiwgImJ1aWxkU2tpbGxzUmV2aWV3VGFibGUiLCAiaGFuZGxlU2tpbGxzUmVzcG9uc2UiLCAibG9nIiwgIm0iLCAieCIsICJuYW1lIiwgInNraWxsIiwgIl8iLCAiYnVpbGRTa2lsbHNSZXZpZXdUYWJsZSIsICJzdGF0ZU1hbmFnZXIiLCAiYiIsICJlIiwgInNraWxsTmFtZSIsICJoYW5kbGVTa2lsbHNSZXNwb25zZSIsICJfYWNoVmVyYldhcm5pbmciLCAiYnVpbGRBY2hpZXZlbWVudHNFZGl0b3IiLCAiYnVpbGRBY2hpZXZlbWVudHNSZXZpZXdUYWJsZSIsICJlbnRyaWVzIiwgIl8iLCAiYnVpbGRBY2hpZXZlbWVudHNSZXZpZXdUYWJsZSIsICJiIiwgImh0bWwiLCAiayIsICJ2IiwgInN0YXRlTWFuYWdlciIsICJidWlsZEFjaGlldmVtZW50c0VkaXRvciIsICJfYWNoVmVyYldhcm5pbmciLCAidGV4dCIsICJfZSIsICJidWlsZFRhZ2xpbmVSZXZpZXdTZWN0aW9uIiwgImJ1aWxkVGFnbGluZVJldmlld1NlY3Rpb24iLCAiX2UiLCAic3RhdGVNYW5hZ2VyIiwgImJ1aWxkU3VtbWFyeUZvY3VzU2VjdGlvbiIsICJidWlsZFN1bW1hcnlGb2N1c1NlY3Rpb24iLCAiayIsICJ0ZXh0IiwgInciLCAic3RhdGVNYW5hZ2VyIiwgImJ1aWxkUHVibGljYXRpb25zUmV2aWV3VGFibGUiLCAibG9nIiwgImJ1aWxkUHVibGljYXRpb25zUmV2aWV3VGFibGUiLCAicSIsICJodG1sIiwgImJ0biIsICJzdGF0ZU1hbmFnZXIiLCAiYXBwbHlSZXdyaXRlQWN0aW9uIiwgImZldGNoQW5kUmV2aWV3UmV3cml0ZXMiLCAicmVuZGVyUmV3cml0ZVBhbmVsIiwgInJld3JpdGVEZWNpc2lvbnMiLCAic3VibWl0UmV3cml0ZURlY2lzaW9ucyIsICJyZXdyaXRlRGVjaXNpb25zIiwgIl8iLCAiZmV0Y2hBbmRSZXZpZXdSZXdyaXRlcyIsICJyZW5kZXJSZXdyaXRlUGFuZWwiLCAidyIsICJhcHBseVJld3JpdGVBY3Rpb24iLCAiYiIsICJtIiwgImkiLCAiaiIsICJrIiwgInN1Ym1pdFJld3JpdGVEZWNpc2lvbnMiLCAic3RhdGVNYW5hZ2VyIiwgInBvcHVsYXRlU3BlbGxDaGVja1RhYiIsICJzdWJtaXRTcGVsbENoZWNrRGVjaXNpb25zIiwgImxvZyIsICJwb3B1bGF0ZVNwZWxsQ2hlY2tUYWIiLCAiY29udGVudCIsICJzdGF0ZU1hbmFnZXIiLCAiaHRtbCIsICJiIiwgImF0c1Njb3JlIiwgImsiLCAic3VibWl0U3BlbGxDaGVja0RlY2lzaW9ucyIsICJwb3B1bGF0ZURvd25sb2FkVGFiIiwgImxvZyIsICJodG1sIiwgIl8iLCAicG9wdWxhdGVEb3dubG9hZFRhYiIsICJzdGF0ZU1hbmFnZXIiLCAidyIsICJtIiwgImZpbmFsR2VuZXJhdGlvbkNvbXBsZXRlIiwgImxvZyIsICJodG1sIiwgImZpbmFsR2VuZXJhdGlvbkNvbXBsZXRlIiwgInN0YXRlTWFuYWdlciIsICJyZW5kZXJNYXN0ZXJEYXRhQWlVcGRhdGVEaXNhYmxlZE5vdGUiLCAicmVuZGVyTWFzdGVyRGF0YUFpVXBkYXRlUGFuZWwiLCAibG9nIiwgInJlbmRlck1hc3RlckRhdGFBaVVwZGF0ZVBhbmVsIiwgInJlbmRlck1hc3RlckRhdGFBaVVwZGF0ZURpc2FibGVkTm90ZSIsICJtIiwgImV2ZW50IiwgIm9wZW5NYXN0ZXJDdk1vZGFsIiwgInBvcHVsYXRlTWFzdGVyVGFiIiwgInJlZG9NYXN0ZXJEYXRhQ2hhbmdlIiwgInVuZG9NYXN0ZXJEYXRhQ2hhbmdlIiwgIngiLCAidiIsICJ0ZXh0IiwgImsiLCAiXyIsICJzZXNzaW9uSWQiLCAiZXZlbnQiLCAiX3JlbmRlckNvbnNpc3RlbmN5UmVwb3J0IiwgInBvcHVsYXRlQ292ZXJMZXR0ZXJUYWIiLCAicG9wdWxhdGVDb3ZlckxldHRlclRhYiIsICJfIiwgInRleHQiLCAiX3JlbmRlckNvbnNpc3RlbmN5UmVwb3J0IiwgInN0YXRlTWFuYWdlciIsICJrIiwgInJlIiwgInBvcHVsYXRlU2NyZWVuaW5nVGFiIiwgInEiLCAiYiIsICJfIiwgInBvcHVsYXRlRmluYWxpc2VUYWIiLCAibG9nIiwgIm0iLCAicG9wdWxhdGVGaW5hbGlzZVRhYiIsICJodG1sIiwgIl9yZW5kZXJSZXdyaXRlQXVkaXRMb2ciLCAiXyIsICJhdHNTY29yZSIsICJwb3B1bGF0ZUludGVydmlld1ByZXBUYWIiLCAibG9nIiwgInBvcHVsYXRlSW50ZXJ2aWV3UHJlcFRhYiIsICJwb3B1bGF0ZVRoYW5rWW91VGFiIiwgImxvZyIsICJwb3B1bGF0ZVRoYW5rWW91VGFiIiwgInBvcHVsYXRlSGFydmVzdFRhYiIsICJsb2ciLCAiYiIsICJrIiwgInYiLCAicG9wdWxhdGVIYXJ2ZXN0VGFiIiwgImluaXRFYXJseVByZXZpZXdQYW5lbCIsICJ0b2dnbGVFYXJseVByZXZpZXdQYW5lbCIsICJTdG9yYWdlS2V5cyIsICJfZSIsICJhcGlDYWxsIiwgInN0YXRlTWFuYWdlciIsICJ0b2dnbGVFYXJseVByZXZpZXdQYW5lbCIsICJpbml0RWFybHlQcmV2aWV3UGFuZWwiLCAiX3VwZGF0ZVNlc3Npb25Td2l0Y2hlckhlYWRlciIsICJvcGVuU2Vzc2lvbnNNb2RhbCIsICJzaG93T3duZXJzaGlwQ29uZmxpY3REaWFsb2ciLCAiXyIsICJfY3JlYXRlZElzb0Zyb21TZXNzaW9uUGF0aCIsICJiIiwgInYiLCAiZXZlbnQiLCAiZm10RGF0ZSIsICJodG1sIiwgImluaXRLZXlib2FyZFNob3J0Y3V0cyIsICJyZXNldENhcmRGb2N1cyIsICJzZXR1cEV2ZW50TGlzdGVuZXJzIiwgInRleHQiXQp9Cg== diff --git a/web/early-preview-panel.js b/web/early-preview-panel.js new file mode 100644 index 00000000..e2daa932 --- /dev/null +++ b/web/early-preview-panel.js @@ -0,0 +1,129 @@ +// Copyright (C) 2026 Gregory R. Warnes +// SPDX-License-Identifier: AGPL-3.0-or-later +// +// This file is part of CV-Builder. +// For commercial licensing, contact greg@warnes-innovations.com + +/** + * web/early-preview-panel.js + * GAP-16 Part B: a persistent, collapsible CV preview shown during the + * customization/rewrite/spell-check pipeline, so the user sees a rendered + * CV well before Layout Review. + * + * SAFETY BOUNDARY (do not weaken without re-reading the GAP-16 plan's + * committee-review section on this module): this file must only ever call + * the read-only GET /api/layout-html endpoint. It must never call + * POST /api/cv/generate-preview or POST /api/cv/smart-instruction — both + * mutate generation_state (stateManager.markPreviewGenerated() forcibly + * advances the workflow phase to LAYOUT_REVIEW), which would silently + * fast-forward the user's stage while they're still on an earlier tab. + * The rendering step is delegated to preview-render.js, a shared util with + * no reference to apiCall/stateManager at all, specifically so a future + * edit to the mutating layout-review flow cannot pull the mutating path in + * here via a shared import. + */ + +import { apiCall, StorageKeys } from './api-client.js'; +import { stateManager } from './state-manager.js'; +import { renderHtmlIntoIframe } from './preview-render.js'; + +const EARLY_PREVIEW_TABS = new Set([ + 'exp-review', 'ach-editor', 'skills-review', 'achievements-review', + 'tagline-review', 'summary-review', 'publications-review', // customizations + 'rewrite', 'spell', +]); + +let _collapsed = false; +try { + _collapsed = localStorage.getItem(StorageKeys.EARLY_PREVIEW_COLLAPSED) === 'true'; +} catch (_e) { + // localStorage unavailable — default to expanded. +} + +function _setCollapsed(collapsed) { + _collapsed = collapsed; + try { + localStorage.setItem(StorageKeys.EARLY_PREVIEW_COLLAPSED, String(collapsed)); + } catch (_e) { + // Non-fatal — collapse state just won't persist across reloads. + } + const btn = document.getElementById('early-preview-toggle-btn'); + if (btn) { + btn.textContent = collapsed ? 'Show' : 'Hide'; + btn.setAttribute('aria-expanded', String(!collapsed)); + } +} + +async function _renderEarlyPreviewBody() { + const body = document.getElementById('early-preview-body'); + const note = document.getElementById('early-preview-status-note'); + if (!body) return; + + if (_collapsed) { + body.style.display = 'none'; + return; + } + body.style.display = ''; + + let data; + try { + // Read-only fetch only — see the module-header safety boundary. + data = await apiCall('GET', '/api/layout-html'); + } catch (_e) { + // 404/error (no preview generated yet this session) — empty state below. + data = null; + } + + if (data && data.ok && data.html) { + const freshness = (typeof stateManager?.getLayoutFreshness === 'function') + ? stateManager.getLayoutFreshness() : { isStale: false }; + + body.innerHTML = ''; + const iframe = document.getElementById('early-preview-iframe'); + const stateLabel = freshness.isStale ? 'stale' : 'fresh'; + iframe.title = `CV preview — ${stateLabel}`; + iframe.classList.toggle('early-preview-iframe-stale', Boolean(freshness.isStale)); + renderHtmlIntoIframe(iframe, data.html); + + if (note) { + note.textContent = freshness.isStale + ? 'Preview reflects an earlier version — visit Layout Review to refresh.' + : ''; + } + return; + } + + body.innerHTML = '
    No CV preview yet — available after you reach Layout Review.
    '; + if (note) note.textContent = ''; +} + +/** + * Show or hide the panel for the given tab, and (re)render its body when + * shown. Called from switchTab() — this function's own in-scope check + * decides visibility, so the caller doesn't need to know the tab list. + * @param {string} tab + */ +async function toggleEarlyPreviewPanel(tab) { + const panel = document.getElementById('early-preview-panel'); + if (!panel) return; + if (!EARLY_PREVIEW_TABS.has(tab)) { + panel.style.display = 'none'; + return; + } + panel.style.display = 'block'; + await _renderEarlyPreviewBody(); +} + +function initEarlyPreviewPanel() { + const btn = document.getElementById('early-preview-toggle-btn'); + if (!btn) return; + btn.setAttribute('aria-expanded', String(!_collapsed)); + btn.textContent = _collapsed ? 'Show' : 'Hide'; + btn.addEventListener('click', () => { + _setCollapsed(!_collapsed); + _renderEarlyPreviewBody(); + }); +} + +export { initEarlyPreviewPanel, toggleEarlyPreviewPanel }; diff --git a/web/index.html b/web/index.html index 2af0cbe7..0b8dd2c7 100644 --- a/web/index.html +++ b/web/index.html @@ -236,7 +236,20 @@

    Conversation

    - + + + +
    diff --git a/web/layout-instruction.js b/web/layout-instruction.js index d6e4ccbe..ae5a2978 100644 --- a/web/layout-instruction.js +++ b/web/layout-instruction.js @@ -20,6 +20,7 @@ import { switchTab } from './review-table-base.js'; import { stateManager, GENERATION_STATE_EVENT, GENERATION_PHASES } from './state-manager.js'; import { escapeHtml } from './utils.js'; import { confirmReRunPhase } from './workflow-steps.js'; +import { renderHtmlIntoIframe } from './preview-render.js'; let dismissedStaleCalloutRevision = null; @@ -988,9 +989,7 @@ function displayLayoutPreview(html) { showPreviewLoading(false); preview.onload = () => fitLayoutPreviewToPane(preview); - preview.setAttribute('sandbox', 'allow-same-origin'); - preview.setAttribute('referrerpolicy', 'no-referrer'); - preview.srcdoc = html; + renderHtmlIntoIframe(preview, html); const doc = preview.contentDocument || preview.contentWindow?.document; if (doc?.readyState === 'complete') { diff --git a/web/preview-render.js b/web/preview-render.js new file mode 100644 index 00000000..58445bb2 --- /dev/null +++ b/web/preview-render.js @@ -0,0 +1,30 @@ +// Copyright (C) 2026 Gregory R. Warnes +// SPDX-License-Identifier: AGPL-3.0-or-later +// +// This file is part of CV-Builder. +// For commercial licensing, contact greg@warnes-innovations.com + +/** + * web/preview-render.js + * Shared, side-effect-free helper for safely rendering CV HTML into a + * sandboxed iframe. Deliberately has no reference to stateManager, apiCall, + * or any fetch logic — it only touches the DOM — so it can be safely + * imported by both the mutating layout-review flow (layout-instruction.js) + * and the read-only early-preview panel (early-preview-panel.js) without + * creating a shared import path back to any mutating endpoint. + */ + +/** + * Render an HTML string into an iframe via srcdoc, with the sandbox + * attributes already established for CV previews elsewhere in the app. + * @param {HTMLIFrameElement} iframeEl + * @param {string} html + */ +function renderHtmlIntoIframe(iframeEl, html) { + if (!iframeEl) return; + iframeEl.setAttribute('sandbox', 'allow-same-origin'); + iframeEl.setAttribute('referrerpolicy', 'no-referrer'); + iframeEl.srcdoc = html; +} + +export { renderHtmlIntoIframe }; diff --git a/web/review-table-base.js b/web/review-table-base.js index ccae1b8d..9028bfac 100644 --- a/web/review-table-base.js +++ b/web/review-table-base.js @@ -198,6 +198,10 @@ function switchTab(tab) { updateWorkflowStepsClickable(stateManager.getPhase()); } + // GAP-16 Part B: show/hide and (re)render the early CV preview panel for + // this tab. toggleEarlyPreviewPanel's own in-scope check decides visibility. + if (typeof toggleEarlyPreviewPanel === 'function') toggleEarlyPreviewPanel(tab); + // Update active tab, ARIA state, and roving tabindex (WCAG 2.1 tablist pattern) document.querySelectorAll('.tab').forEach(t => { t.classList.remove('active'); diff --git a/web/src/main.js b/web/src/main.js index 8b3cfef6..02be2fa4 100644 --- a/web/src/main.js +++ b/web/src/main.js @@ -80,6 +80,7 @@ import * as Finalise from '../finalise.js'; import * as InterviewPrep from '../interview-prep.js'; import * as ThankYou from '../thank-you.js'; import * as Harvest from '../harvest.js'; +import * as EarlyPreviewPanel from '../early-preview-panel.js'; // ── Tier 7 ──────────────────────────────────────────────────────────────────── import * as SessionSwitcherUi from '../session-switcher-ui.js'; @@ -102,7 +103,7 @@ Object.assign(globalThis, ReviewTableBase, ExperienceReview, SkillsReview, AchievementsReview, TaglineReview, SummaryReview, PublicationsReview, ReviewIcons, RewriteReview, SpellCheck, DownloadTab, FinalGenerate, WorkflowSteps, MasterDataAiUpdate, MasterCv, - CoverLetter, ScreeningQuestions, Finalise, InterviewPrep, ThankYou, Harvest, + CoverLetter, ScreeningQuestions, Finalise, InterviewPrep, ThankYou, Harvest, EarlyPreviewPanel, SessionSwitcherUi, KeyboardShortcuts, App, ); diff --git a/web/styles.css b/web/styles.css index 15c2825b..b54e055e 100644 --- a/web/styles.css +++ b/web/styles.css @@ -752,6 +752,15 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sa .review-subtab.active { color: var(--cv-accent); border-bottom-color: var(--cv-accent); background: var(--cv-white); } .review-pane { min-height: 200px; } +/* ===== EARLY PREVIEW PANEL (GAP-16 Part B) ===== */ +.early-preview-panel { border-bottom: 1px solid var(--cv-border); background: var(--cv-bg-light); flex-shrink: 0; } +.early-preview-header { display: flex; align-items: center; gap: 10px; padding: 6px 16px; font-size: 0.85em; } +.early-preview-title { font-weight: 600; color: var(--cv-text-primary); } +.early-preview-status-note { color: var(--cv-warn-text); font-size: 0.85em; flex: 1; } +.early-preview-body { height: 220px; } +.early-preview-empty { padding: 16px; color: var(--cv-text-secondary); font-size: 0.85em; } +#early-preview-iframe.early-preview-iframe-stale { opacity: 0.55; filter: grayscale(40%); } + /* ===== DOCUMENT VIEWER ===== */ .document-viewer { flex: 1; overflow-y: auto; padding: 32px; background: var(--cv-white); } .document-viewer.expanded { padding: 16px; } From b93d7763a09396a3e82671806bdec6894218bcc7 Mon Sep 17 00:00:00 2001 From: "Gregory R. Warnes" Date: Mon, 6 Jul 2026 13:58:57 -0400 Subject: [PATCH 5/9] feat(css): fix orphaned token, tokenize 13 reused hex literals (GAP-133) master-cv.js referenced a non-existent --cv-warning-bg token that silently fell through to its hardcoded fallback; fixed to the real --cv-warn-bg. Add 13 new --cv-* tokens for the raw hex colors reused 3+ times in styles.css (error-dark, success-text-dark, text-darkest, gray-100/200, warn-dark/text-dark, sky-bg-md/border, emerald-bg, orange-text, green-700, bg-input), replacing 44 occurrences. Raw hex literal count: 148 -> 117. Verified pure refactor (identical resolved color values) via a throwaway Playwright check. Co-Authored-By: Claude Sonnet 5 --- web/bundle.js | 4 +- web/master-cv.js | 2 +- web/styles.css | 99 +++++++++++++++++++++++++++--------------------- 3 files changed, 59 insertions(+), 46 deletions(-) diff --git a/web/bundle.js b/web/bundle.js index 690033f1..08da0144 100644 --- a/web/bundle.js +++ b/web/bundle.js @@ -19929,7 +19929,7 @@ Rejected (missing title, year, or author): overlay.style.cssText = "position:fixed;inset:0;background:rgba(0,0,0,0.5);z-index:10000;display:flex;align-items:center;justify-content:center;"; const changedSections = sections.filter((s) => s.changed); const rows = sections.map((s) => ` - + ${escapeHtml(s.section)} ${s.current_count} ${s.new_count} @@ -23048,4 +23048,4 @@ Proceed anyway?` dompurify/dist/purify.es.mjs: (*! @license DOMPurify 3.3.3 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.3.3/LICENSE *) */ -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbm9kZV9tb2R1bGVzL2xvZ2xldmVsL2xpYi9sb2dsZXZlbC5qcyIsICJsb2dnZXIuanMiLCAidXRpbHMuanMiLCAiYXBpLWNsaWVudC5qcyIsICJmZXRjaC11dGlscy5qcyIsICJzdGF0ZS1tYW5hZ2VyLmpzIiwgInByb3ZpZGVyLWluZm8uanMiLCAidWktY29yZS5qcyIsICJ3b3JrZmxvdy1zdGVwcy5qcyIsICJsYXlvdXQtaW5zdHJ1Y3Rpb24uanMiLCAiYXRzLXJlZmluZW1lbnQuanMiLCAibWVzc2FnZS1xdWV1ZS5qcyIsICJyZXZpZXctdGFibGUtYmFzZS5qcyIsICJwcmV2aWV3LXJlbmRlci5qcyIsICJ2YWxpZGF0b3JzLmpzIiwgInJlY29tbWVuZGF0aW9uLWhlbHBlcnMuanMiLCAidWktaGVscGVycy5qcyIsICJwcm9wb3NhbC1yZXZpZXcuanMiLCAibGxtLWxvZy5qcyIsICJhdXRoLXByb3ZpZGVyLmpzIiwgImF0cy1tb2RhbHMuanMiLCAic2Vzc2lvbi1hY3Rpb25zLmpzIiwgImpvYi1hbmFseXNpcy5qcyIsICJnb2Fscy5qcyIsICJzZXNzaW9uLW1hbmFnZXIuanMiLCAiam9iLWlucHV0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tYXJrZWQvc3JjL2RlZmF1bHRzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9tYXJrZWQvc3JjL3J1bGVzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9tYXJrZWQvc3JjL2hlbHBlcnMudHMiLCAiLi4vbm9kZV9tb2R1bGVzL21hcmtlZC9zcmMvVG9rZW5pemVyLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9tYXJrZWQvc3JjL0xleGVyLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9tYXJrZWQvc3JjL1JlbmRlcmVyLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9tYXJrZWQvc3JjL1RleHRSZW5kZXJlci50cyIsICIuLi9ub2RlX21vZHVsZXMvbWFya2VkL3NyYy9QYXJzZXIudHMiLCAiLi4vbm9kZV9tb2R1bGVzL21hcmtlZC9zcmMvSG9va3MudHMiLCAiLi4vbm9kZV9tb2R1bGVzL21hcmtlZC9zcmMvSW5zdGFuY2UudHMiLCAiLi4vbm9kZV9tb2R1bGVzL21hcmtlZC9zcmMvbWFya2VkLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9kb21wdXJpZnkvc3JjL3V0aWxzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9kb21wdXJpZnkvc3JjL3RhZ3MudHMiLCAiLi4vbm9kZV9tb2R1bGVzL2RvbXB1cmlmeS9zcmMvYXR0cnMudHMiLCAiLi4vbm9kZV9tb2R1bGVzL2RvbXB1cmlmeS9zcmMvcmVnZXhwLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9kb21wdXJpZnkvc3JjL3B1cmlmeS50cyIsICJtZXNzYWdlLWRpc3BhdGNoLmpzIiwgInF1ZXN0aW9ucy1wYW5lbC5qcyIsICJyZXZpZXctaWNvbnMuanMiLCAiZXhwZXJpZW5jZS1yZXZpZXcuanMiLCAic2tpbGxzLXJldmlldy5qcyIsICJhY2hpZXZlbWVudHMtcmV2aWV3LmpzIiwgInRhZ2xpbmUtcmV2aWV3LmpzIiwgInN1bW1hcnktcmV2aWV3LmpzIiwgInB1YmxpY2F0aW9ucy1yZXZpZXcuanMiLCAicmV3cml0ZS1yZXZpZXcuanMiLCAic3BlbGwtY2hlY2suanMiLCAiZG93bmxvYWQtdGFiLmpzIiwgImZpbmFsLWdlbmVyYXRlLmpzIiwgIm1hc3Rlci1kYXRhLWFpLXVwZGF0ZS5qcyIsICJtYXN0ZXItY3YuanMiLCAiY292ZXItbGV0dGVyLmpzIiwgInNjcmVlbmluZy1xdWVzdGlvbnMuanMiLCAiZmluYWxpc2UuanMiLCAiaW50ZXJ2aWV3LXByZXAuanMiLCAidGhhbmsteW91LmpzIiwgImhhcnZlc3QuanMiLCAiZWFybHktcHJldmlldy1wYW5lbC5qcyIsICJzZXNzaW9uLXN3aXRjaGVyLXVpLmpzIiwgImtleWJvYXJkLXNob3J0Y3V0cy5qcyIsICJhcHAuanMiLCAic3JjL21haW4uanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qXG4qIGxvZ2xldmVsIC0gaHR0cHM6Ly9naXRodWIuY29tL3BpbXRlcnJ5L2xvZ2xldmVsXG4qXG4qIENvcHlyaWdodCAoYykgMjAxMyBUaW0gUGVycnlcbiogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuKi9cbihmdW5jdGlvbiAocm9vdCwgZGVmaW5pdGlvbikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcbiAgICAgICAgZGVmaW5lKGRlZmluaXRpb24pO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBkZWZpbml0aW9uKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcm9vdC5sb2cgPSBkZWZpbml0aW9uKCk7XG4gICAgfVxufSh0aGlzLCBmdW5jdGlvbiAoKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAvLyBTbGlnaHRseSBkdWJpb3VzIHRyaWNrcyB0byBjdXQgZG93biBtaW5pbWl6ZWQgZmlsZSBzaXplXG4gICAgdmFyIG5vb3AgPSBmdW5jdGlvbigpIHt9O1xuICAgIHZhciB1bmRlZmluZWRUeXBlID0gXCJ1bmRlZmluZWRcIjtcbiAgICB2YXIgaXNJRSA9ICh0eXBlb2Ygd2luZG93ICE9PSB1bmRlZmluZWRUeXBlKSAmJiAodHlwZW9mIHdpbmRvdy5uYXZpZ2F0b3IgIT09IHVuZGVmaW5lZFR5cGUpICYmIChcbiAgICAgICAgL1RyaWRlbnRcXC98TVNJRSAvLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpXG4gICAgKTtcblxuICAgIHZhciBsb2dNZXRob2RzID0gW1xuICAgICAgICBcInRyYWNlXCIsXG4gICAgICAgIFwiZGVidWdcIixcbiAgICAgICAgXCJpbmZvXCIsXG4gICAgICAgIFwid2FyblwiLFxuICAgICAgICBcImVycm9yXCJcbiAgICBdO1xuXG4gICAgdmFyIF9sb2dnZXJzQnlOYW1lID0ge307XG4gICAgdmFyIGRlZmF1bHRMb2dnZXIgPSBudWxsO1xuXG4gICAgLy8gQ3Jvc3MtYnJvd3NlciBiaW5kIGVxdWl2YWxlbnQgdGhhdCB3b3JrcyBhdCBsZWFzdCBiYWNrIHRvIElFNlxuICAgIGZ1bmN0aW9uIGJpbmRNZXRob2Qob2JqLCBtZXRob2ROYW1lKSB7XG4gICAgICAgIHZhciBtZXRob2QgPSBvYmpbbWV0aG9kTmFtZV07XG4gICAgICAgIGlmICh0eXBlb2YgbWV0aG9kLmJpbmQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBtZXRob2QuYmluZChvYmopO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQuY2FsbChtZXRob2QsIG9iaik7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgLy8gTWlzc2luZyBiaW5kIHNoaW0gb3IgSUU4ICsgTW9kZXJuaXpyLCBmYWxsYmFjayB0byB3cmFwcGluZ1xuICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5hcHBseShtZXRob2QsIFtvYmosIGFyZ3VtZW50c10pO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUcmFjZSgpIGRvZXNuJ3QgcHJpbnQgdGhlIG1lc3NhZ2UgaW4gSUUsIHNvIGZvciB0aGF0IGNhc2Ugd2UgbmVlZCB0byB3cmFwIGl0XG4gICAgZnVuY3Rpb24gdHJhY2VGb3JJRSgpIHtcbiAgICAgICAgaWYgKGNvbnNvbGUubG9nKSB7XG4gICAgICAgICAgICBpZiAoY29uc29sZS5sb2cuYXBwbHkpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZy5hcHBseShjb25zb2xlLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBJbiBvbGQgSUUsIG5hdGl2ZSBjb25zb2xlIG1ldGhvZHMgdGhlbXNlbHZlcyBkb24ndCBoYXZlIGFwcGx5KCkuXG4gICAgICAgICAgICAgICAgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmFwcGx5KGNvbnNvbGUubG9nLCBbY29uc29sZSwgYXJndW1lbnRzXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnNvbGUudHJhY2UpIGNvbnNvbGUudHJhY2UoKTtcbiAgICB9XG5cbiAgICAvLyBCdWlsZCB0aGUgYmVzdCBsb2dnaW5nIG1ldGhvZCBwb3NzaWJsZSBmb3IgdGhpcyBlbnZcbiAgICAvLyBXaGVyZXZlciBwb3NzaWJsZSB3ZSB3YW50IHRvIGJpbmQsIG5vdCB3cmFwLCB0byBwcmVzZXJ2ZSBzdGFjayB0cmFjZXNcbiAgICBmdW5jdGlvbiByZWFsTWV0aG9kKG1ldGhvZE5hbWUpIHtcbiAgICAgICAgaWYgKG1ldGhvZE5hbWUgPT09ICdkZWJ1ZycpIHtcbiAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAnbG9nJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgY29uc29sZSA9PT0gdW5kZWZpbmVkVHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBObyBtZXRob2QgcG9zc2libGUsIGZvciBub3cgLSBmaXhlZCBsYXRlciBieSBlbmFibGVMb2dnaW5nV2hlbkNvbnNvbGVBcnJpdmVzXG4gICAgICAgIH0gZWxzZSBpZiAobWV0aG9kTmFtZSA9PT0gJ3RyYWNlJyAmJiBpc0lFKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJhY2VGb3JJRTtcbiAgICAgICAgfSBlbHNlIGlmIChjb25zb2xlW21ldGhvZE5hbWVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBiaW5kTWV0aG9kKGNvbnNvbGUsIG1ldGhvZE5hbWUpO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnNvbGUubG9nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBiaW5kTWV0aG9kKGNvbnNvbGUsICdsb2cnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBub29wO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhlc2UgcHJpdmF0ZSBmdW5jdGlvbnMgYWx3YXlzIG5lZWQgYHRoaXNgIHRvIGJlIHNldCBwcm9wZXJseVxuXG4gICAgZnVuY3Rpb24gcmVwbGFjZUxvZ2dpbmdNZXRob2RzKCkge1xuICAgICAgICAvKmpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqL1xuICAgICAgICB2YXIgbGV2ZWwgPSB0aGlzLmdldExldmVsKCk7XG5cbiAgICAgICAgLy8gUmVwbGFjZSB0aGUgYWN0dWFsIG1ldGhvZHMuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbG9nTWV0aG9kcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIG1ldGhvZE5hbWUgPSBsb2dNZXRob2RzW2ldO1xuICAgICAgICAgICAgdGhpc1ttZXRob2ROYW1lXSA9IChpIDwgbGV2ZWwpID9cbiAgICAgICAgICAgICAgICBub29wIDpcbiAgICAgICAgICAgICAgICB0aGlzLm1ldGhvZEZhY3RvcnkobWV0aG9kTmFtZSwgbGV2ZWwsIHRoaXMubmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWZpbmUgbG9nLmxvZyBhcyBhbiBhbGlhcyBmb3IgbG9nLmRlYnVnXG4gICAgICAgIHRoaXMubG9nID0gdGhpcy5kZWJ1ZztcblxuICAgICAgICAvLyBSZXR1cm4gYW55IGltcG9ydGFudCB3YXJuaW5ncy5cbiAgICAgICAgaWYgKHR5cGVvZiBjb25zb2xlID09PSB1bmRlZmluZWRUeXBlICYmIGxldmVsIDwgdGhpcy5sZXZlbHMuU0lMRU5UKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJObyBjb25zb2xlIGF2YWlsYWJsZSBmb3IgbG9nZ2luZ1wiO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gSW4gb2xkIElFIHZlcnNpb25zLCB0aGUgY29uc29sZSBpc24ndCBwcmVzZW50IHVudGlsIHlvdSBmaXJzdCBvcGVuIGl0LlxuICAgIC8vIFdlIGJ1aWxkIHJlYWxNZXRob2QoKSByZXBsYWNlbWVudHMgaGVyZSB0aGF0IHJlZ2VuZXJhdGUgbG9nZ2luZyBtZXRob2RzXG4gICAgZnVuY3Rpb24gZW5hYmxlTG9nZ2luZ1doZW5Db25zb2xlQXJyaXZlcyhtZXRob2ROYW1lKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09IHVuZGVmaW5lZFR5cGUpIHtcbiAgICAgICAgICAgICAgICByZXBsYWNlTG9nZ2luZ01ldGhvZHMuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgICAgICB0aGlzW21ldGhvZE5hbWVdLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQnkgZGVmYXVsdCwgd2UgdXNlIGNsb3NlbHkgYm91bmQgcmVhbCBtZXRob2RzIHdoZXJldmVyIHBvc3NpYmxlLCBhbmRcbiAgICAvLyBvdGhlcndpc2Ugd2Ugd2FpdCBmb3IgYSBjb25zb2xlIHRvIGFwcGVhciwgYW5kIHRoZW4gdHJ5IGFnYWluLlxuICAgIGZ1bmN0aW9uIGRlZmF1bHRNZXRob2RGYWN0b3J5KG1ldGhvZE5hbWUsIF9sZXZlbCwgX2xvZ2dlck5hbWUpIHtcbiAgICAgICAgLypqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi9cbiAgICAgICAgcmV0dXJuIHJlYWxNZXRob2QobWV0aG9kTmFtZSkgfHxcbiAgICAgICAgICAgICAgIGVuYWJsZUxvZ2dpbmdXaGVuQ29uc29sZUFycml2ZXMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBMb2dnZXIobmFtZSwgZmFjdG9yeSkge1xuICAgICAgLy8gUHJpdmF0ZSBpbnN0YW5jZSB2YXJpYWJsZXMuXG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAvKipcbiAgICAgICAqIFRoZSBsZXZlbCBpbmhlcml0ZWQgZnJvbSBhIHBhcmVudCBsb2dnZXIgKG9yIGEgZ2xvYmFsIGRlZmF1bHQpLiBXZVxuICAgICAgICogY2FjaGUgdGhpcyBoZXJlIHJhdGhlciB0aGFuIGRlbGVnYXRpbmcgdG8gdGhlIHBhcmVudCBzbyB0aGF0IGl0IHN0YXlzXG4gICAgICAgKiBpbiBzeW5jIHdpdGggdGhlIGFjdHVhbCBsb2dnaW5nIG1ldGhvZHMgdGhhdCB3ZSBoYXZlIGluc3RhbGxlZCAodGhlXG4gICAgICAgKiBwYXJlbnQgY291bGQgY2hhbmdlIGxldmVscyBidXQgd2UgbWlnaHQgbm90IGhhdmUgcmVidWlsdCB0aGUgbG9nZ2Vyc1xuICAgICAgICogaW4gdGhpcyBjaGlsZCB5ZXQpLlxuICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAqL1xuICAgICAgdmFyIGluaGVyaXRlZExldmVsO1xuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBsZXZlbCBmb3IgdGhpcyBsb2dnZXIsIGlmIGFueS4gSWYgc2V0LCB0aGlzIG92ZXJyaWRlc1xuICAgICAgICogYGluaGVyaXRlZExldmVsYC5cbiAgICAgICAqIEB0eXBlIHtudW1iZXJ8bnVsbH1cbiAgICAgICAqL1xuICAgICAgdmFyIGRlZmF1bHRMZXZlbDtcbiAgICAgIC8qKlxuICAgICAgICogQSB1c2VyLXNwZWNpZmljIGxldmVsIGZvciB0aGlzIGxvZ2dlci4gSWYgc2V0LCB0aGlzIG92ZXJyaWRlc1xuICAgICAgICogYGRlZmF1bHRMZXZlbGAuXG4gICAgICAgKiBAdHlwZSB7bnVtYmVyfG51bGx9XG4gICAgICAgKi9cbiAgICAgIHZhciB1c2VyTGV2ZWw7XG5cbiAgICAgIHZhciBzdG9yYWdlS2V5ID0gXCJsb2dsZXZlbFwiO1xuICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHN0b3JhZ2VLZXkgKz0gXCI6XCIgKyBuYW1lO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzeW1ib2xcIikge1xuICAgICAgICBzdG9yYWdlS2V5ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBwZXJzaXN0TGV2ZWxJZlBvc3NpYmxlKGxldmVsTnVtKSB7XG4gICAgICAgICAgdmFyIGxldmVsTmFtZSA9IChsb2dNZXRob2RzW2xldmVsTnVtXSB8fCAnc2lsZW50JykudG9VcHBlckNhc2UoKTtcblxuICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSB1bmRlZmluZWRUeXBlIHx8ICFzdG9yYWdlS2V5KSByZXR1cm47XG5cbiAgICAgICAgICAvLyBVc2UgbG9jYWxTdG9yYWdlIGlmIGF2YWlsYWJsZVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Vbc3RvcmFnZUtleV0gPSBsZXZlbE5hbWU7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG5cbiAgICAgICAgICAvLyBVc2Ugc2Vzc2lvbiBjb29raWUgYXMgZmFsbGJhY2tcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuY29va2llID1cbiAgICAgICAgICAgICAgICBlbmNvZGVVUklDb21wb25lbnQoc3RvcmFnZUtleSkgKyBcIj1cIiArIGxldmVsTmFtZSArIFwiO1wiO1xuICAgICAgICAgIH0gY2F0Y2ggKGlnbm9yZSkge31cbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gZ2V0UGVyc2lzdGVkTGV2ZWwoKSB7XG4gICAgICAgICAgdmFyIHN0b3JlZExldmVsO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IHVuZGVmaW5lZFR5cGUgfHwgIXN0b3JhZ2VLZXkpIHJldHVybjtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHN0b3JlZExldmVsID0gd2luZG93LmxvY2FsU3RvcmFnZVtzdG9yYWdlS2V5XTtcbiAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG5cbiAgICAgICAgICAvLyBGYWxsYmFjayB0byBjb29raWVzIGlmIGxvY2FsIHN0b3JhZ2UgZ2l2ZXMgdXMgbm90aGluZ1xuICAgICAgICAgIGlmICh0eXBlb2Ygc3RvcmVkTGV2ZWwgPT09IHVuZGVmaW5lZFR5cGUpIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIHZhciBjb29raWUgPSB3aW5kb3cuZG9jdW1lbnQuY29va2llO1xuICAgICAgICAgICAgICAgICAgdmFyIGNvb2tpZU5hbWUgPSBlbmNvZGVVUklDb21wb25lbnQoc3RvcmFnZUtleSk7XG4gICAgICAgICAgICAgICAgICB2YXIgbG9jYXRpb24gPSBjb29raWUuaW5kZXhPZihjb29raWVOYW1lICsgXCI9XCIpO1xuICAgICAgICAgICAgICAgICAgaWYgKGxvY2F0aW9uICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgIHN0b3JlZExldmVsID0gL14oW147XSspLy5leGVjKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb29raWUuc2xpY2UobG9jYXRpb24gKyBjb29raWVOYW1lLmxlbmd0aCArIDEpXG4gICAgICAgICAgICAgICAgICAgICAgKVsxXTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBjYXRjaCAoaWdub3JlKSB7fVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIElmIHRoZSBzdG9yZWQgbGV2ZWwgaXMgbm90IHZhbGlkLCB0cmVhdCBpdCBhcyBpZiBub3RoaW5nIHdhcyBzdG9yZWQuXG4gICAgICAgICAgaWYgKHNlbGYubGV2ZWxzW3N0b3JlZExldmVsXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHN0b3JlZExldmVsID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBzdG9yZWRMZXZlbDtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gY2xlYXJQZXJzaXN0ZWRMZXZlbCgpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gdW5kZWZpbmVkVHlwZSB8fCAhc3RvcmFnZUtleSkgcmV0dXJuO1xuXG4gICAgICAgICAgLy8gVXNlIGxvY2FsU3RvcmFnZSBpZiBhdmFpbGFibGVcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oc3RvcmFnZUtleSk7XG4gICAgICAgICAgfSBjYXRjaCAoaWdub3JlKSB7fVxuXG4gICAgICAgICAgLy8gVXNlIHNlc3Npb24gY29va2llIGFzIGZhbGxiYWNrXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgd2luZG93LmRvY3VtZW50LmNvb2tpZSA9XG4gICAgICAgICAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KHN0b3JhZ2VLZXkpICsgXCI9OyBleHBpcmVzPVRodSwgMDEgSmFuIDE5NzAgMDA6MDA6MDAgVVRDXCI7XG4gICAgICAgICAgfSBjYXRjaCAoaWdub3JlKSB7fVxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBub3JtYWxpemVMZXZlbChpbnB1dCkge1xuICAgICAgICAgIHZhciBsZXZlbCA9IGlucHV0O1xuICAgICAgICAgIGlmICh0eXBlb2YgbGV2ZWwgPT09IFwic3RyaW5nXCIgJiYgc2VsZi5sZXZlbHNbbGV2ZWwudG9VcHBlckNhc2UoKV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBsZXZlbCA9IHNlbGYubGV2ZWxzW2xldmVsLnRvVXBwZXJDYXNlKCldO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHlwZW9mIGxldmVsID09PSBcIm51bWJlclwiICYmIGxldmVsID49IDAgJiYgbGV2ZWwgPD0gc2VsZi5sZXZlbHMuU0lMRU5UKSB7XG4gICAgICAgICAgICAgIHJldHVybiBsZXZlbDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwibG9nLnNldExldmVsKCkgY2FsbGVkIHdpdGggaW52YWxpZCBsZXZlbDogXCIgKyBpbnB1dCk7XG4gICAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvKlxuICAgICAgICpcbiAgICAgICAqIFB1YmxpYyBsb2dnZXIgQVBJIC0gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9waW10ZXJyeS9sb2dsZXZlbCBmb3IgZGV0YWlsc1xuICAgICAgICpcbiAgICAgICAqL1xuXG4gICAgICBzZWxmLm5hbWUgPSBuYW1lO1xuXG4gICAgICBzZWxmLmxldmVscyA9IHsgXCJUUkFDRVwiOiAwLCBcIkRFQlVHXCI6IDEsIFwiSU5GT1wiOiAyLCBcIldBUk5cIjogMyxcbiAgICAgICAgICBcIkVSUk9SXCI6IDQsIFwiU0lMRU5UXCI6IDV9O1xuXG4gICAgICBzZWxmLm1ldGhvZEZhY3RvcnkgPSBmYWN0b3J5IHx8IGRlZmF1bHRNZXRob2RGYWN0b3J5O1xuXG4gICAgICBzZWxmLmdldExldmVsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICh1c2VyTGV2ZWwgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHVzZXJMZXZlbDtcbiAgICAgICAgICB9IGVsc2UgaWYgKGRlZmF1bHRMZXZlbCAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmYXVsdExldmVsO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gaW5oZXJpdGVkTGV2ZWw7XG4gICAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgc2VsZi5zZXRMZXZlbCA9IGZ1bmN0aW9uIChsZXZlbCwgcGVyc2lzdCkge1xuICAgICAgICAgIHVzZXJMZXZlbCA9IG5vcm1hbGl6ZUxldmVsKGxldmVsKTtcbiAgICAgICAgICBpZiAocGVyc2lzdCAhPT0gZmFsc2UpIHsgIC8vIGRlZmF1bHRzIHRvIHRydWVcbiAgICAgICAgICAgICAgcGVyc2lzdExldmVsSWZQb3NzaWJsZSh1c2VyTGV2ZWwpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIE5PVEU6IGluIHYyLCB0aGlzIHNob3VsZCBjYWxsIHJlYnVpbGQoKSwgd2hpY2ggdXBkYXRlcyBjaGlsZHJlbi5cbiAgICAgICAgICByZXR1cm4gcmVwbGFjZUxvZ2dpbmdNZXRob2RzLmNhbGwoc2VsZik7XG4gICAgICB9O1xuXG4gICAgICBzZWxmLnNldERlZmF1bHRMZXZlbCA9IGZ1bmN0aW9uIChsZXZlbCkge1xuICAgICAgICAgIGRlZmF1bHRMZXZlbCA9IG5vcm1hbGl6ZUxldmVsKGxldmVsKTtcbiAgICAgICAgICBpZiAoIWdldFBlcnNpc3RlZExldmVsKCkpIHtcbiAgICAgICAgICAgICAgc2VsZi5zZXRMZXZlbChsZXZlbCwgZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHNlbGYucmVzZXRMZXZlbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB1c2VyTGV2ZWwgPSBudWxsO1xuICAgICAgICAgIGNsZWFyUGVyc2lzdGVkTGV2ZWwoKTtcbiAgICAgICAgICByZXBsYWNlTG9nZ2luZ01ldGhvZHMuY2FsbChzZWxmKTtcbiAgICAgIH07XG5cbiAgICAgIHNlbGYuZW5hYmxlQWxsID0gZnVuY3Rpb24ocGVyc2lzdCkge1xuICAgICAgICAgIHNlbGYuc2V0TGV2ZWwoc2VsZi5sZXZlbHMuVFJBQ0UsIHBlcnNpc3QpO1xuICAgICAgfTtcblxuICAgICAgc2VsZi5kaXNhYmxlQWxsID0gZnVuY3Rpb24ocGVyc2lzdCkge1xuICAgICAgICAgIHNlbGYuc2V0TGV2ZWwoc2VsZi5sZXZlbHMuU0lMRU5ULCBwZXJzaXN0KTtcbiAgICAgIH07XG5cbiAgICAgIHNlbGYucmVidWlsZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoZGVmYXVsdExvZ2dlciAhPT0gc2VsZikge1xuICAgICAgICAgICAgICBpbmhlcml0ZWRMZXZlbCA9IG5vcm1hbGl6ZUxldmVsKGRlZmF1bHRMb2dnZXIuZ2V0TGV2ZWwoKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlcGxhY2VMb2dnaW5nTWV0aG9kcy5jYWxsKHNlbGYpO1xuXG4gICAgICAgICAgaWYgKGRlZmF1bHRMb2dnZXIgPT09IHNlbGYpIHtcbiAgICAgICAgICAgICAgZm9yICh2YXIgY2hpbGROYW1lIGluIF9sb2dnZXJzQnlOYW1lKSB7XG4gICAgICAgICAgICAgICAgX2xvZ2dlcnNCeU5hbWVbY2hpbGROYW1lXS5yZWJ1aWxkKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICAvLyBJbml0aWFsaXplIGFsbCB0aGUgaW50ZXJuYWwgbGV2ZWxzLlxuICAgICAgaW5oZXJpdGVkTGV2ZWwgPSBub3JtYWxpemVMZXZlbChcbiAgICAgICAgICBkZWZhdWx0TG9nZ2VyID8gZGVmYXVsdExvZ2dlci5nZXRMZXZlbCgpIDogXCJXQVJOXCJcbiAgICAgICk7XG4gICAgICB2YXIgaW5pdGlhbExldmVsID0gZ2V0UGVyc2lzdGVkTGV2ZWwoKTtcbiAgICAgIGlmIChpbml0aWFsTGV2ZWwgIT0gbnVsbCkge1xuICAgICAgICAgIHVzZXJMZXZlbCA9IG5vcm1hbGl6ZUxldmVsKGluaXRpYWxMZXZlbCk7XG4gICAgICB9XG4gICAgICByZXBsYWNlTG9nZ2luZ01ldGhvZHMuY2FsbChzZWxmKTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqXG4gICAgICogVG9wLWxldmVsIEFQSVxuICAgICAqXG4gICAgICovXG5cbiAgICBkZWZhdWx0TG9nZ2VyID0gbmV3IExvZ2dlcigpO1xuXG4gICAgZGVmYXVsdExvZ2dlci5nZXRMb2dnZXIgPSBmdW5jdGlvbiBnZXRMb2dnZXIobmFtZSkge1xuICAgICAgICBpZiAoKHR5cGVvZiBuYW1lICE9PSBcInN5bWJvbFwiICYmIHR5cGVvZiBuYW1lICE9PSBcInN0cmluZ1wiKSB8fCBuYW1lID09PSBcIlwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiWW91IG11c3Qgc3VwcGx5IGEgbmFtZSB3aGVuIGNyZWF0aW5nIGEgbG9nZ2VyLlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBsb2dnZXIgPSBfbG9nZ2Vyc0J5TmFtZVtuYW1lXTtcbiAgICAgICAgaWYgKCFsb2dnZXIpIHtcbiAgICAgICAgICAgIGxvZ2dlciA9IF9sb2dnZXJzQnlOYW1lW25hbWVdID0gbmV3IExvZ2dlcihcbiAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgIGRlZmF1bHRMb2dnZXIubWV0aG9kRmFjdG9yeVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbG9nZ2VyO1xuICAgIH07XG5cbiAgICAvLyBHcmFiIHRoZSBjdXJyZW50IGdsb2JhbCBsb2cgdmFyaWFibGUgaW4gY2FzZSBvZiBvdmVyd3JpdGVcbiAgICB2YXIgX2xvZyA9ICh0eXBlb2Ygd2luZG93ICE9PSB1bmRlZmluZWRUeXBlKSA/IHdpbmRvdy5sb2cgOiB1bmRlZmluZWQ7XG4gICAgZGVmYXVsdExvZ2dlci5ub0NvbmZsaWN0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSB1bmRlZmluZWRUeXBlICYmXG4gICAgICAgICAgICAgICB3aW5kb3cubG9nID09PSBkZWZhdWx0TG9nZ2VyKSB7XG4gICAgICAgICAgICB3aW5kb3cubG9nID0gX2xvZztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkZWZhdWx0TG9nZ2VyO1xuICAgIH07XG5cbiAgICBkZWZhdWx0TG9nZ2VyLmdldExvZ2dlcnMgPSBmdW5jdGlvbiBnZXRMb2dnZXJzKCkge1xuICAgICAgICByZXR1cm4gX2xvZ2dlcnNCeU5hbWU7XG4gICAgfTtcblxuICAgIC8vIEVTNiBkZWZhdWx0IGV4cG9ydCwgZm9yIGNvbXBhdGliaWxpdHlcbiAgICBkZWZhdWx0TG9nZ2VyWydkZWZhdWx0J10gPSBkZWZhdWx0TG9nZ2VyO1xuXG4gICAgcmV0dXJuIGRlZmF1bHRMb2dnZXI7XG59KSk7XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9sb2dnZXIuanNcbiAqIENlbnRyYWxpc2VkIGxvZ2dpbmcgdXNpbmcgdGhlIGxvZ2xldmVsIGxpYnJhcnkuXG4gKlxuICogVXNhZ2UgKHBlci1tb2R1bGUgbmFtZWQgbG9nZ2Vycyk6XG4gKiAgIGltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbiAqICAgY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdhcGktY2xpZW50Jyk7XG4gKiAgIGxvZy5pbmZvKCdyZXF1ZXN0IHN0YXJ0ZWQnLCBlbmRwb2ludCk7XG4gKiAgIGxvZy53YXJuKCdzZXNzaW9uIGNvbmZsaWN0Jyk7XG4gKiAgIGxvZy5lcnJvcignZmF0YWwnLCBlcnJvcik7XG4gKlxuICogUm9vdCBsb2dnZXIgKHVuY2hhbmdlZCBnbG9iYWwgbGV2ZWwpOlxuICogICBpbXBvcnQgbG9nIGZyb20gJy4vbG9nZ2VyLmpzJztcbiAqICAgbG9nLnNldExldmVsKCdkZWJ1ZycpOyAgIC8vIGxvd2VyIHRoZSBnbG9iYWwgbWluaW11bVxuICpcbiAqIFRoZSBkZWZhdWx0IGxldmVsIGlzICd3YXJuJyBpbiBwcm9kdWN0aW9uIGJ1aWxkcyAoTk9ERV9FTlY9cHJvZHVjdGlvbikgYW5kXG4gKiAnZGVidWcnIGluIGRldmVsb3BtZW50LiAgSW5kaXZpZHVhbCBtb2R1bGUgbGV2ZWxzIGNhbiBiZSBvdmVycmlkZGVuIGF0XG4gKiBydW50aW1lIHZpYSB0aGUgYnJvd3NlciBjb25zb2xlOlxuICogICBsb2dsZXZlbC5nZXRMb2dnZXIoJ2FwaS1jbGllbnQnKS5zZXRMZXZlbCgndHJhY2UnKTtcbiAqXG4gKiBERVBFTkRFTkNJRVM6IGxvZ2xldmVsIChucG0pXG4gKi9cblxuaW1wb3J0IGxvZ2xldmVsIGZyb20gJ2xvZ2xldmVsJztcblxuLy8gRGVmYXVsdCBsZXZlbDogZGVidWcgaW4gZGV2LCB3YXJuIGluIHByb2QuXG5jb25zdCBERUZBVUxUX0xFVkVMID0gKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLmVudiAmJiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKVxuICA/ICd3YXJuJ1xuICA6ICdkZWJ1Zyc7XG5cbmxvZ2xldmVsLnNldERlZmF1bHRMZXZlbChERUZBVUxUX0xFVkVMKTtcblxuLyoqXG4gKiBHZXQgKG9yIGNyZWF0ZSkgYSBuYW1lZCBjaGlsZCBsb2dnZXIuXG4gKiBOYW1lZCBsb2dnZXJzIGluaGVyaXQgdGhlIHJvb3QgZGVmYXVsdCBsZXZlbCBidXQgY2FuIGJlIHR1bmVkIGluZGVwZW5kZW50bHkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBNb2R1bGUgbmFtZSwgZS5nLiAnYXBpLWNsaWVudCdcbiAqIEByZXR1cm5zIHtpbXBvcnQoJ2xvZ2xldmVsJykuTG9nZ2VyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TG9nZ2VyKG5hbWUpIHtcbiAgcmV0dXJuIGxvZ2xldmVsLmdldExvZ2dlcihuYW1lKTtcbn1cblxuLy8gRXhwb3NlIHJvb3QgbG9nbGV2ZWwgaW5zdGFuY2Ugb24gZ2xvYmFsVGhpcyBzbyB0aGUgYnJvd3NlciBjb25zb2xlIGNhblxuLy8gYWRqdXN0IGxldmVscyBhdCBydW50aW1lIHdpdGhvdXQgYSBidWlsZCBzdGVwOlxuLy8gICBsb2dsZXZlbC5zZXRMZXZlbCgnZGVidWcnKTtcbi8vICAgbG9nbGV2ZWwuZ2V0TG9nZ2VyKCdhcGktY2xpZW50Jykuc2V0TGV2ZWwoJ3RyYWNlJyk7XG5pZiAodHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnKSB7XG4gIGdsb2JhbFRoaXMubG9nbGV2ZWwgPSBsb2dsZXZlbDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgbG9nbGV2ZWw7XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHV0aWxzLmpzXG4gKiBVdGlsaXR5IGZ1bmN0aW9ucyBmb3IgdGV4dCBwcm9jZXNzaW5nLCBmb3JtYXR0aW5nLCBhbmQgZGF0YSBtYW5pcHVsYXRpb24uXG4gKiBObyBkZXBlbmRlbmNpZXMgb24gRE9NIG9yIGNvbXBsZXggc3RhdGUuIFB1cmUgZnVuY3Rpb25zLlxuICovXG5cbi8qKlxuICogTm9ybWFsaXplIHdoaXRlc3BhY2UgaW4gdGV4dDpcbiAqIC0gUmVtb3ZlIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZVxuICogLSBDb2xsYXBzZSBpbnRlcm5hbCB3aGl0ZXNwYWNlIHRvIHNpbmdsZSBzcGFjZXNcbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplVGV4dCh0ZXh0KSB7XG4gIHJldHVybiB0ZXh0XG4gICAgLnRyaW0oKSAgLy8gUmVtb3ZlIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZVxuICAgIC5yZXBsYWNlKC9cXHMrL2csICcgJykgIC8vIENvbGxhcHNlIGludGVybmFsIHdoaXRlc3BhY2VcbiAgICAudHJpbSgpO1xufVxuXG4vKipcbiAqIEZvcm1hdCBhIFVuaXggdGltZXN0YW1wIGFzIGh1bWFuLXJlYWRhYmxlIGRhdGUgc3RyaW5nLlxuICogRXhhbXBsZTogMTcwOTIzNjgwMCBcdTIxOTIgXCJNYXIgMSwgMjAyNFwiXG4gKi9cbmZ1bmN0aW9uIGZtdERhdGUodHMpIHtcbiAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHRzICogMTAwMCk7XG4gIHJldHVybiBkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZygnZW4tVVMnLCB7IG1vbnRoOiAnc2hvcnQnLCBkYXk6ICdudW1lcmljJywgeWVhcjogJ251bWVyaWMnIH0pO1xufVxuXG4vKipcbiAqIENsZWFuIEpTT04gcmVzcG9uc2UgYnkgcmVtb3ZpbmcgbWFya2Rvd24gY29kZSBibG9ja3MuXG4gKiBIYW5kbGVzIGNvbW1vbiBwYXR0ZXJuczpcbiAqIC0gYGBganNvbiAuLi4gYGBgXG4gKiAtIGBgYFxuICogICAuLi5cbiAqIGBgYFxuICovXG5mdW5jdGlvbiBjbGVhbkpzb25SZXNwb25zZSh0ZXh0KSB7XG4gIGlmICh0eXBlb2YgdGV4dCAhPT0gJ3N0cmluZycpIHJldHVybiB0ZXh0O1xuICBsZXQgY2xlYW5lZCA9IHRleHQ7XG4gIC8vIFJlbW92ZSBgYGBqc29uIHdyYXBwZXJcbiAgY2xlYW5lZCA9IGNsZWFuZWQucmVwbGFjZSgvXmBgYGpzb25cXHMqL2ksICcnKS5yZXBsYWNlKC9gYGBcXHMqJC9pLCAnJyk7XG4gIC8vIFJlbW92ZSBgYGAgd3JhcHBlclxuICBjbGVhbmVkID0gY2xlYW5lZC5yZXBsYWNlKC9eYGBgXFxzKi9pLCAnJykucmVwbGFjZSgvYGBgXFxzKiQvaSwgJycpO1xuICByZXR1cm4gY2xlYW5lZC50cmltKCk7XG59XG5cbi8qKlxuICogRXh0cmFjdCBhbmQgcGFyc2UgdGhlIGZpcnN0IHZhbGlkIEpTT04gb2JqZWN0IGVtYmVkZGVkIGluIGZyZWUtZm9ybSB0ZXh0LlxuICogUmV0dXJucyBudWxsIHdoZW4gbm8gY29tcGxldGUgcGFyc2VhYmxlIG9iamVjdCBpcyBmb3VuZC5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdEZpcnN0SnNvbk9iamVjdCh0ZXh0KSB7XG4gIGlmICh0ZXh0ID09IG51bGwgfHwgdHlwZW9mIHRleHQgIT09ICdzdHJpbmcnKSByZXR1cm4gbnVsbDtcblxuICBjb25zdCBjbGVhbmVkID0gY2xlYW5Kc29uUmVzcG9uc2UodGV4dCk7XG5cbiAgZm9yIChsZXQgc3RhcnQgPSAwOyBzdGFydCA8IGNsZWFuZWQubGVuZ3RoOyBzdGFydCArPSAxKSB7XG4gICAgaWYgKGNsZWFuZWRbc3RhcnRdICE9PSAneycpIGNvbnRpbnVlO1xuXG4gICAgbGV0IGRlcHRoID0gMDtcbiAgICBsZXQgaW5TdHJpbmcgPSBmYWxzZTtcbiAgICBsZXQgaXNFc2NhcGVkID0gZmFsc2U7XG5cbiAgICBmb3IgKGxldCBpbmRleCA9IHN0YXJ0OyBpbmRleCA8IGNsZWFuZWQubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICBjb25zdCBjaGFyID0gY2xlYW5lZFtpbmRleF07XG5cbiAgICAgIGlmIChpblN0cmluZykge1xuICAgICAgICBpZiAoaXNFc2NhcGVkKSB7XG4gICAgICAgICAgaXNFc2NhcGVkID0gZmFsc2U7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYXIgPT09ICdcXFxcJykge1xuICAgICAgICAgIGlzRXNjYXBlZCA9IHRydWU7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYXIgPT09ICdcIicpIHtcbiAgICAgICAgICBpblN0cmluZyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hhciA9PT0gJ1wiJykge1xuICAgICAgICBpblN0cmluZyA9IHRydWU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hhciA9PT0gJ3snKSB7XG4gICAgICAgIGRlcHRoICs9IDE7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hhciAhPT0gJ30nKSBjb250aW51ZTtcblxuICAgICAgZGVwdGggLT0gMTtcbiAgICAgIGlmIChkZXB0aCAhPT0gMCkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IGNsZWFuZWQuc2xpY2Uoc3RhcnQsIGluZGV4ICsgMSk7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShjYW5kaWRhdGUpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIEVzY2FwZSBIVE1MIHNwZWNpYWwgY2hhcmFjdGVycyB0byBwcmV2ZW50IGluamVjdGlvbi5cbiAqIENvbnZlcnRzOiAmIDwgPiBcIiAnXG4gKi9cbmZ1bmN0aW9uIGVzY2FwZUh0bWwodGV4dCkge1xuICBpZiAodGV4dCA9PSBudWxsKSByZXR1cm4gJyc7XG4gIGlmICh0eXBlb2YgdGV4dCAhPT0gJ3N0cmluZycpIHJldHVybiBlc2NhcGVIdG1sKFN0cmluZyh0ZXh0KSk7XG4gIGNvbnN0IG1hcCA9IHtcbiAgICAnJic6ICcmYW1wOycsXG4gICAgJzwnOiAnJmx0OycsXG4gICAgJz4nOiAnJmd0OycsXG4gICAgJ1wiJzogJyZxdW90OycsXG4gICAgXCInXCI6ICcmIzAzOTsnXG4gIH07XG4gIHJldHVybiB0ZXh0LnJlcGxhY2UoL1smPD5cIiddL2csIG0gPT4gbWFwW21dKTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0IHRpdGxlIGFuZCBjb21wYW55IGZyb20gam9iIGRlc2NyaXB0aW9uIHRleHQuXG4gKiBQYXR0ZXJuczpcbiAqIC0gXCJUaXRsZSB8IENvbXBhbnlcIlxuICogLSBcIlRpdGxlIGF0IENvbXBhbnlcIlxuICogLSBGaXJzdCBsaW5lIGNvbnRhaW5pbmcgXCJ0aXRsZVwiLCBcInBvc2l0aW9uXCIsIFwicm9sZVwiLCBcImFyY2hpdGVjdFwiLCBldGMuXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RUaXRsZUFuZENvbXBhbnlGcm9tSm9iVGV4dChqb2JUZXh0KSB7XG4gIGNvbnN0IGxpbmVzID0gam9iVGV4dC5zcGxpdCgnXFxuJykubWFwKGwgPT4gbC50cmltKCkpLmZpbHRlcihsID0+IGwubGVuZ3RoID4gMCk7XG5cbiAgLy8gTG9vayBmb3IgcGF0dGVybnM6IFwiVGl0bGUgfCBDb21wYW55XCIgb3IgXCJUaXRsZSBhdCBDb21wYW55XCJcbiAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgaWYgKGxpbmUuaW5jbHVkZXMoJ3wnKSkge1xuICAgICAgY29uc3QgW3RpdGxlLCBjb21wYW55XSA9IGxpbmUuc3BsaXQoJ3wnKS5tYXAocyA9PiBzLnRyaW0oKSk7XG4gICAgICBpZiAodGl0bGUgJiYgY29tcGFueSkge1xuICAgICAgICByZXR1cm4geyB0aXRsZSwgY29tcGFueSB9O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobGluZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCcgYXQgJykpIHtcbiAgICAgIGNvbnN0IFt0aXRsZSwgY29tcGFueV0gPSBsaW5lLnNwbGl0KC9cXHMrYXRcXHMrL2kpLm1hcChzID0+IHMudHJpbSgpKTtcbiAgICAgIGlmICh0aXRsZSAmJiBjb21wYW55KSB7XG4gICAgICAgIHJldHVybiB7IHRpdGxlLCBjb21wYW55IH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gRmFsbGJhY2s6IHVzZSBmaXJzdCBub24tZW1wdHkgbGluZSBhcyB0aXRsZVxuICBjb25zdCB0aXRsZUxpbmUgPSBsaW5lc1swXTtcbiAgcmV0dXJuIHtcbiAgICB0aXRsZTogdGl0bGVMaW5lIHx8ICdVbnRpdGxlZCBQb3NpdGlvbicsXG4gICAgY29tcGFueTogbGluZXMuZmluZChsID0+IGwudG9Mb3dlckNhc2UoKSAhPT0gdGl0bGVMaW5lLnRvTG93ZXJDYXNlKCkpIHx8ICdVbmtub3duIENvbXBhbnknXG4gIH07XG59XG5cbi8qKlxuICogTm9ybWFsaXplIHBvc2l0aW9uIGxhYmVsOlxuICogLSBDYXBpdGFsaXplIGVhY2ggd29yZFxuICogLSBSZW1vdmUgdHJhaWxpbmcgXCJyb2xlXCIsIFwicG9zaXRpb25cIiwgXCJ0aXRsZVwiLCBcImpvYlwiXG4gKiBFeGFtcGxlczpcbiAqIC0gXCJzZW5pb3IgZGF0YSBzY2llbnRpc3RcIiBcdTIxOTIgXCJTZW5pb3IgRGF0YSBTY2llbnRpc3RcIlxuICogLSBcImRpcmVjdG9yIG9mIGVuZ2luZWVyaW5nXCIgXHUyMTkyIFwiRGlyZWN0b3Igb2YgRW5naW5lZXJpbmdcIlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVQb3NpdGlvbkxhYmVsKHRpdGxlLCBjb21wYW55KSB7XG4gIGxldCBub3JtYWxpemVkID0gdGl0bGVcbiAgICAuc3BsaXQoJyAnKVxuICAgIC5tYXAod29yZCA9PiB3b3JkLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgd29yZC5zbGljZSgxKS50b0xvd2VyQ2FzZSgpKVxuICAgIC5qb2luKCcgJyk7XG5cbiAgLy8gUmVtb3ZlIGNvbW1vbiBzdWZmaXhlc1xuICBub3JtYWxpemVkID0gbm9ybWFsaXplZFxuICAgIC5yZXBsYWNlKC9cXHMrKHJvbGV8cG9zaXRpb258dGl0bGV8am9iKVxccyokL2ksICcnKVxuICAgIC50cmltKCk7XG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWQgfHwgJ1Byb2Zlc3Npb25hbCBSb2xlJztcbn1cblxuLyoqXG4gKiBTdHJpcCBIVE1MIHRhZ3MgZnJvbSBzdHJpbmcuXG4gKiBVc2VzIGFuIGluZXJ0IHRlbXBsYXRlIGVsZW1lbnQsIHRoZW4gcmVtb3ZlcyBleGVjdXRhYmxlL25vbi12aXNpYmxlIG5vZGVzLlxuICovXG5mdW5jdGlvbiBzdHJpcEh0bWwoaHRtbCkge1xuICBjb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7XG4gIHRlbXBsYXRlLmlubmVySFRNTCA9IFN0cmluZyhodG1sID8/ICcnKTtcbiAgdGVtcGxhdGUuY29udGVudC5xdWVyeVNlbGVjdG9yQWxsKCdzY3JpcHQsIHN0eWxlLCBub3NjcmlwdCwgdGVtcGxhdGUnKS5mb3JFYWNoKG5vZGUgPT4gbm9kZS5yZW1vdmUoKSk7XG4gIHJldHVybiB0ZW1wbGF0ZS5jb250ZW50LnRleHRDb250ZW50IHx8ICcnO1xufVxuXG4vKipcbiAqIFRydW5jYXRlIHRleHQgdG8gbWF4IGxlbmd0aCB3aXRoIGVsbGlwc2lzLlxuICogUHJlc2VydmVzIHdvcmQgYm91bmRhcmllcyB3aGVuIHBvc3NpYmxlLlxuICovXG5mdW5jdGlvbiB0cnVuY2F0ZVRleHQodGV4dCwgbWF4TGVuZ3RoID0gMTAwKSB7XG4gIGlmICh0ZXh0Lmxlbmd0aCA8PSBtYXhMZW5ndGgpIHJldHVybiB0ZXh0O1xuXG4gIC8vIFRydW5jYXRlIGF0IG1heCBsZW5ndGhcbiAgbGV0IHRydW5jYXRlZCA9IHRleHQuc3Vic3RyaW5nKDAsIG1heExlbmd0aCk7XG5cbiAgLy8gVHJ5IHRvIGZpbmQgdGhlIGxhc3Qgc3BhY2UgdG8gYXZvaWQgY3V0dGluZyB3b3Jkc1xuICBjb25zdCBsYXN0U3BhY2UgPSB0cnVuY2F0ZWQubGFzdEluZGV4T2YoJyAnKTtcbiAgaWYgKGxhc3RTcGFjZSA+IE1hdGguZmxvb3IobWF4TGVuZ3RoICogMC43NSkpIHtcbiAgICB0cnVuY2F0ZWQgPSB0cnVuY2F0ZWQuc3Vic3RyaW5nKDAsIGxhc3RTcGFjZSk7XG4gIH1cblxuICByZXR1cm4gdHJ1bmNhdGVkICsgJ1x1MjAyNic7XG59XG5cbi8qKlxuICogQ2FwaXRhbGl6ZSBmaXJzdCBsZXR0ZXIgb2YgZWFjaCB3b3JkLlxuICovXG5mdW5jdGlvbiBjYXBpdGFsaXplV29yZHModGV4dCkge1xuICByZXR1cm4gdGV4dFxuICAgIC5zcGxpdCgnICcpXG4gICAgLm1hcCh3b3JkID0+IHdvcmQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB3b3JkLnNsaWNlKDEpLnRvTG93ZXJDYXNlKCkpXG4gICAgLmpvaW4oJyAnKTtcbn1cblxuLyoqXG4gKiBDb25kaXRpb25hbCBwbHVyYWxpemF0aW9uIGhlbHBlci5cbiAqIEV4YW1wbGU6IHBsdXJhbGl6ZSgxLCAnaXRlbScsICdpdGVtcycpIFx1MjE5MiAnaXRlbSdcbiAqICAgICAgICAgIHBsdXJhbGl6ZSgzLCAnaXRlbScsICdpdGVtcycpIFx1MjE5MiAnaXRlbXMnXG4gKi9cbmZ1bmN0aW9uIHBsdXJhbGl6ZShjb3VudCwgc2luZ3VsYXIsIHBsdXJhbCkge1xuICByZXR1cm4gY291bnQgPT09IDEgPyBzaW5ndWxhciA6IHBsdXJhbDtcbn1cblxuLyoqXG4gKiBIdW1hbi1yZWFkYWJsZSB0aW1lIGR1cmF0aW9uLlxuICogRXhhbXBsZTogNTAwMCBcdTIxOTIgXCI1IHNlY29uZHNcIiwgNjUwMDAgXHUyMTkyIFwiMSBtaW51dGVcIlxuICovXG5mdW5jdGlvbiBmb3JtYXREdXJhdGlvbihtcykge1xuICBjb25zdCBzZWNvbmRzID0gTWF0aC5mbG9vcihtcyAvIDEwMDApO1xuICBjb25zdCBtaW51dGVzID0gTWF0aC5mbG9vcihzZWNvbmRzIC8gNjApO1xuICBjb25zdCBob3VycyA9IE1hdGguZmxvb3IobWludXRlcyAvIDYwKTtcblxuICBpZiAoaG91cnMgPiAwKSByZXR1cm4gYCR7aG91cnN9aCAke21pbnV0ZXMgJSA2MH1tYDtcbiAgaWYgKG1pbnV0ZXMgPiAwKSByZXR1cm4gYCR7bWludXRlc31tICR7c2Vjb25kcyAlIDYwfXNgO1xuICByZXR1cm4gYCR7c2Vjb25kc31zYDtcbn1cblxuLyoqXG4gKiBPcmRpbmFsIG51bWJlciBzdWZmaXguXG4gKiBFeGFtcGxlOiAxIFx1MjE5MiBcIjFzdFwiLCAyIFx1MjE5MiBcIjJuZFwiLCAzIFx1MjE5MiBcIjNyZFwiLCA0IFx1MjE5MiBcIjR0aFwiXG4gKi9cbmZ1bmN0aW9uIG9yZGluYWwobikge1xuICBjb25zdCBzID0gWyd0aCcsICdzdCcsICduZCcsICdyZCddO1xuICBjb25zdCB2ID0gbiAlIDEwMDtcbiAgcmV0dXJuIG4gKyAoc1sodiAtIDIwKSAlIDEwXSB8fCBzW3ZdIHx8IHNbMF0pO1xufVxuXG4vLyBVdGlsaXR5IGZ1bmN0aW9ucyBmb3Igc2Vzc2lvbiBtYW5hZ2VtZW50IGFuZCBmb3JtYXR0aW5nXG5cbi8vIEZ1bGwtbGVuZ3RoIHBoYXNlIGxhYmVscyBcdTIwMTQgdXNlZCBieSB3b3JrZmxvdyBzdGVwIGRpc3BsYXksIHN0YXR1cyB0ZXh0LCBldGMuXG5jb25zdCBTRVNTSU9OX1BIQVNFX0xBQkVMUyA9IHtcbiAgaW5pdDogICAgICAgICAgICAgJ0dldHRpbmcgU3RhcnRlZCcsXG4gIGpvYl9hbmFseXNpczogICAgICdKb2IgQW5hbHlzaXMnLFxuICBjdXN0b21pemF0aW9uOiAgICAnQ3VzdG9taXNhdGlvbicsXG4gIHJld3JpdGVfcmV2aWV3OiAgICdSZXdyaXRlIFJldmlldycsXG4gIHNwZWxsX2NoZWNrOiAgICAgICdTcGVsbCBDaGVjaycsXG4gIGdlbmVyYXRpb246ICAgICAgICdHZW5lcmF0aW9uJyxcbiAgbGF5b3V0X3JldmlldzogICAgJ0xheW91dCBSZXZpZXcnLFxuICByZWZpbmVtZW50OiAgICAgICAnRmluYWxpc2UnLFxuICBmaW5hbF9nZW5lcmF0aW9uOiAnRmluYWwgR2VuZXJhdGlvbicsXG59O1xuXG4vLyBBYmJyZXZpYXRlZCBwaGFzZSBsYWJlbHMgXHUyMDE0IHVzZWQgYnkgdGhlIGNvbXBhY3Qgc2Vzc2lvbi1zd2l0Y2hlciBVSS5cbi8vIEludGVudGlvbmFsbHkgc2VwYXJhdGUgZnJvbSBTRVNTSU9OX1BIQVNFX0xBQkVMUzogdGhlIHR3byBzZXRzIHNlcnZlIGRpZmZlcmVudFxuLy8gVUkgY29udGV4dHMgKHNwYWNlLWNvbnN0cmFpbmVkIGhlYWRlciBjaGlwIHZzLiBmdWxsIHdvcmtmbG93IHN0ZXAgbGFiZWwpLlxuY29uc3QgU0VTU0lPTl9QSEFTRV9MQUJFTFNfU0hPUlQgPSB7XG4gIGluaXQ6ICAgICAgICAgICAgICdTZXR1cCcsXG4gIGpvYl9hbmFseXNpczogICAgICdBbmFseXNpcycsXG4gIGN1c3RvbWl6YXRpb246ICAgICdDdXN0b21pc2luZycsXG4gIHJld3JpdGVfcmV2aWV3OiAgICdSZXdyaXRlcycsXG4gIHNwZWxsX2NoZWNrOiAgICAgICdTcGVsbCBDaGVjaycsXG4gIGdlbmVyYXRpb246ICAgICAgICdHZW5lcmF0ZScsXG4gIGxheW91dF9yZXZpZXc6ICAgICdMYXlvdXQnLFxuICByZWZpbmVtZW50OiAgICAgICAnRmluYWxpc2UnLFxuICBmaW5hbF9nZW5lcmF0aW9uOiAnRmluYWwgR2VuJyxcbn07XG5cbi8qKlxuICogRm9ybWF0IHNlc3Npb24gcGhhc2UgbGFiZWxzIChmdWxsIGZvcm0pLlxuICogQHBhcmFtIHtzdHJpbmd9IHBoYXNlIC0gVGhlIHBoYXNlIHN0cmluZyB0byBmb3JtYXQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSBmb3JtYXR0ZWQgcGhhc2UgbGFiZWwuXG4gKi9cbmZ1bmN0aW9uIGZvcm1hdFNlc3Npb25QaGFzZUxhYmVsKHBoYXNlKSB7XG4gIGlmICghcGhhc2UpIHJldHVybiAnaW5pdCc7XG4gIHJldHVybiBTRVNTSU9OX1BIQVNFX0xBQkVMU1twaGFzZV0gfHwgU3RyaW5nKHBoYXNlKS5yZXBsYWNlKC9fL2csICcgJyk7XG59XG5cbi8qKlxuICogRm9ybWF0IHNlc3Npb24gdGltZXN0YW1wcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0aW1lc3RhbXAgLSBUaGUgdGltZXN0YW1wIHRvIGZvcm1hdC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIC0gRm9ybWF0dGluZyBvcHRpb25zLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5pbmNsdWRlVGltZT10cnVlXSAtIFdoZXRoZXIgdG8gaW5jbHVkZSB0aW1lIGluIHRoZSBvdXRwdXQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICovXG5mdW5jdGlvbiBmb3JtYXRTZXNzaW9uVGltZXN0YW1wKHRpbWVzdGFtcCwgeyBpbmNsdWRlVGltZSA9IHRydWUgfSA9IHt9KSB7XG4gIGlmICghdGltZXN0YW1wKSByZXR1cm4gJ1x1MjAxNCc7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHRpbWVzdGFtcCkudG9Mb2NhbGVTdHJpbmcoJ2VuLVVTJywge1xuICAgICAgbW9udGg6ICdzaG9ydCcsIGRheTogJ251bWVyaWMnLCB5ZWFyOiAnbnVtZXJpYycsXG4gICAgICAuLi4oaW5jbHVkZVRpbWUgPyB7IGhvdXI6ICdudW1lcmljJywgbWludXRlOiAnMi1kaWdpdCcgfSA6IHt9KSxcbiAgICB9KTtcbiAgfSBjYXRjaCAoXykge1xuICAgIHJldHVybiBTdHJpbmcodGltZXN0YW1wKS5yZXBsYWNlKCdUJywgJyAnKS5zbGljZSgwLCBpbmNsdWRlVGltZSA/IDE2IDogMTApO1xuICB9XG59XG5cbi8vIFN0cnVjdHVyZWQgbG9nZ2luZyBoZWxwZXIgKGdsb2JhbCBhbmQgdGVzdC1mcmllbmRseSkuXG5jb25zdCBMT0dfTEVWRUxTID0geyBkZWJ1ZzogMTAsIGluZm86IDIwLCB3YXJuOiAzMCwgZXJyb3I6IDQwIH07XG5jb25zdCBERUZBVUxUX0xPR19MRVZFTCA9ICdpbmZvJztcblxuZnVuY3Rpb24gY3JlYXRlTG9nRW50cnkobGV2ZWwsIG1lc3NhZ2UsIG1ldGFkYXRhID0ge30pIHtcbiAgY29uc3QgZW50cnkgPSB7XG4gICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgbGV2ZWwsXG4gICAgbWVzc2FnZTogU3RyaW5nKG1lc3NhZ2UpLFxuICAgIC4uLm1ldGFkYXRhLFxuICB9O1xuICByZXR1cm4gZW50cnk7XG59XG5cbmNvbnN0IGxvZ2dlciA9IHtcbiAgbGV2ZWw6IERFRkFVTFRfTE9HX0xFVkVMLFxuXG4gIHNldExldmVsKG5ld0xldmVsKSB7XG4gICAgaWYgKExPR19MRVZFTFNbbmV3TGV2ZWxdICE9IG51bGwpIHtcbiAgICAgIHRoaXMubGV2ZWwgPSBuZXdMZXZlbDtcbiAgICB9XG4gIH0sXG5cbiAgc2hvdWxkTG9nKGxldmVsKSB7XG4gICAgaWYgKExPR19MRVZFTFNbbGV2ZWxdID09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gTE9HX0xFVkVMU1tsZXZlbF0gPj0gTE9HX0xFVkVMU1t0aGlzLmxldmVsXTtcbiAgfSxcblxuICBsb2cobGV2ZWwsIG1lc3NhZ2UsIG1ldGFkYXRhID0ge30pIHtcbiAgICBpZiAoIXRoaXMuc2hvdWxkTG9nKGxldmVsKSkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBlbnRyeSA9IGNyZWF0ZUxvZ0VudHJ5KGxldmVsLCBtZXNzYWdlLCBtZXRhZGF0YSk7XG4gICAgY29uc3QgZm9ybWF0dGVkID0gSlNPTi5zdHJpbmdpZnkoZW50cnkpO1xuXG4gICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgaWYgKGxldmVsID09PSAnZXJyb3InKSBjb25zb2xlLmVycm9yKGZvcm1hdHRlZCk7XG4gICAgICBlbHNlIGlmIChsZXZlbCA9PT0gJ3dhcm4nKSBjb25zb2xlLndhcm4oZm9ybWF0dGVkKTtcbiAgICAgIGVsc2UgY29uc29sZS5sb2coZm9ybWF0dGVkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZW50cnk7XG4gIH0sXG5cbiAgZGVidWcobWVzc2FnZSwgbWV0YWRhdGEgPSB7fSkgeyByZXR1cm4gdGhpcy5sb2coJ2RlYnVnJywgbWVzc2FnZSwgbWV0YWRhdGEpOyB9LFxuICBpbmZvKG1lc3NhZ2UsIG1ldGFkYXRhID0ge30pIHsgcmV0dXJuIHRoaXMubG9nKCdpbmZvJywgbWVzc2FnZSwgbWV0YWRhdGEpOyB9LFxuICB3YXJuKG1lc3NhZ2UsIG1ldGFkYXRhID0ge30pIHsgcmV0dXJuIHRoaXMubG9nKCd3YXJuJywgbWVzc2FnZSwgbWV0YWRhdGEpOyB9LFxuICBlcnJvcihtZXNzYWdlLCBtZXRhZGF0YSA9IHt9KSB7IHJldHVybiB0aGlzLmxvZygnZXJyb3InLCBtZXNzYWdlLCBtZXRhZGF0YSk7IH0sXG5cbiAgZXZlbnQoYWN0aW9uLCBtZXRhZGF0YSA9IHt9KSB7XG4gICAgcmV0dXJuIHRoaXMuaW5mbyhgZXZlbnQ6JHthY3Rpb259YCwgeyBhY3Rpb24sIC4uLm1ldGFkYXRhIH0pO1xuICB9LFxufTtcblxuaWYgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJykge1xuICBnbG9iYWxUaGlzLmxvZ2dlciA9IGxvZ2dlcjtcbn1cblxuZXhwb3J0IHtcbiAgbm9ybWFsaXplVGV4dCwgZm10RGF0ZSwgY2xlYW5Kc29uUmVzcG9uc2UsIGV4dHJhY3RGaXJzdEpzb25PYmplY3QsIGVzY2FwZUh0bWwsXG4gIGV4dHJhY3RUaXRsZUFuZENvbXBhbnlGcm9tSm9iVGV4dCwgbm9ybWFsaXplUG9zaXRpb25MYWJlbCxcbiAgc3RyaXBIdG1sLCB0cnVuY2F0ZVRleHQsIGNhcGl0YWxpemVXb3JkcywgcGx1cmFsaXplLFxuICBmb3JtYXREdXJhdGlvbiwgb3JkaW5hbCxcbiAgU0VTU0lPTl9QSEFTRV9MQUJFTFMsIFNFU1NJT05fUEhBU0VfTEFCRUxTX1NIT1JULFxuICBmb3JtYXRTZXNzaW9uUGhhc2VMYWJlbCxcbiAgbG9nZ2VyLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogYXBpLWNsaWVudC5qc1xuICogQ2VudHJhbGl6ZWQgSFRUUCBjb21tdW5pY2F0aW9uIGxheWVyLiBBbGwgQVBJIGNhbGxzIGdvIHRocm91Z2ggYXBpQ2FsbCgpLlxuICogUHJvdmlkZXMgZXJyb3IgaGFuZGxpbmcsIGxvZ2dpbmcsIGFuZCByZXRyeSBsb2dpYy5cbiAqL1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBoYW5kbGU0MDlDb25mbGljdCB9IGZyb20gJy4vZmV0Y2gtdXRpbHMuanMnO1xuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdhcGktY2xpZW50Jyk7XG5cbi8qKlxuICogQ2VudHJhbGl6ZWQgbG9jYWxTdG9yYWdlIGtleSBtYW5hZ2VtZW50IHRvIGF2b2lkIGR1cGxpY2F0aW9uXG4gKi9cbmNvbnN0IFN0b3JhZ2VLZXlzID0ge1xuICBTRVNTSU9OX0lEOiAgICAgICAgICAgICAgJ2N2LWJ1aWxkZXItc2Vzc2lvbi1pZCcsXG4gIFNFU1NJT05fUEFUSDogICAgICAgICAgICAnY3YtYnVpbGRlci1zZXNzaW9uLXBhdGgnLFxuICBUQUJfREFUQTogICAgICAgICAgICAgICAgJ2N2LWJ1aWxkZXItdGFiLWRhdGEnLFxuICBDVVJSRU5UX1RBQjogICAgICAgICAgICAgJ2N2LWJ1aWxkZXItY3VycmVudC10YWInLFxuICBDSEFUX0NPTExBUFNFRDogICAgICAgICAgJ2N2LWJ1aWxkZXItY2hhdC1jb2xsYXBzZWQnLFxuICBMTE1fRElTQ0xPU1VSRV9TSE9XTjogICAgJ2N2LWJ1aWxkZXItbGxtLWRpc2Nsb3N1cmUtc2hvd24nLFxuICBFQVJMWV9QUkVWSUVXX0NPTExBUFNFRDogJ2N2LWJ1aWxkZXItZWFybHktcHJldmlldy1jb2xsYXBzZWQnLFxufTtcblxuY29uc3QgT1dORVJfVE9LRU5fS0VZID0gJ2N2LWJ1aWxkZXItb3duZXItdG9rZW4nO1xuXG5mdW5jdGlvbiBnZXRTZXNzaW9uSWRGcm9tVVJMKCkge1xuICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIXdpbmRvdy5sb2NhdGlvbikgcmV0dXJuIG51bGw7XG4gIHJldHVybiBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpLmdldCgnc2Vzc2lvbicpO1xufVxuXG5mdW5jdGlvbiBnZXRPd25lclRva2VuKCkge1xuICBpZiAodHlwZW9mIHNlc3Npb25TdG9yYWdlID09PSAndW5kZWZpbmVkJykgcmV0dXJuIG51bGw7XG4gIGxldCB0b2tlbiA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oT1dORVJfVE9LRU5fS0VZKTtcbiAgaWYgKCF0b2tlbikge1xuICAgIGlmICh0eXBlb2YgY3J5cHRvICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgY3J5cHRvLnJhbmRvbVVVSUQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRva2VuID0gY3J5cHRvLnJhbmRvbVVVSUQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdG9rZW4gPSBgdGFiLSR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDE2KS5zbGljZSgyLCAxMCl9YDtcbiAgICB9XG4gICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShPV05FUl9UT0tFTl9LRVksIHRva2VuKTtcbiAgfVxuICByZXR1cm4gdG9rZW47XG59XG5cbmZ1bmN0aW9uIGdldFNjb3BlZFRhYkRhdGFTdG9yYWdlS2V5KHNlc3Npb25JZCA9IG51bGwpIHtcbiAgY29uc3Qgc2NvcGVkU2Vzc2lvbklkID0gc2Vzc2lvbklkIHx8IGdldFNlc3Npb25JZEZyb21VUkwoKTtcbiAgcmV0dXJuIHNjb3BlZFNlc3Npb25JZFxuICAgID8gYCR7U3RvcmFnZUtleXMuVEFCX0RBVEF9LSR7c2NvcGVkU2Vzc2lvbklkfWBcbiAgICA6IFN0b3JhZ2VLZXlzLlRBQl9EQVRBO1xufVxuXG5mdW5jdGlvbiBfaXNTZXNzaW9uTWFuYWdlbWVudFBhdGgocGF0aG5hbWUpIHtcbiAgcmV0dXJuIHBhdGhuYW1lID09PSAnL2FwaS9zZXNzaW9ucy9uZXcnXG4gICAgfHwgcGF0aG5hbWUgPT09ICcvYXBpL3Nlc3Npb25zL2NsYWltJ1xuICAgIHx8IHBhdGhuYW1lID09PSAnL2FwaS9zZXNzaW9ucy90YWtlb3Zlcic7XG59XG5cbmZ1bmN0aW9uIF9idWlsZFNlc3Npb25Bd2FyZVJlcXVlc3QoaW5wdXQsIGluaXQgPSB7fSkge1xuICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIXdpbmRvdy5sb2NhdGlvbikge1xuICAgIHJldHVybiBbaW5wdXQsIGluaXRdO1xuICB9XG5cbiAgY29uc3QgdXJsID0gbmV3IFVSTCh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnID8gaW5wdXQgOiBpbnB1dC51cmwsIHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4pO1xuICBpZiAoIXVybC5wYXRobmFtZS5zdGFydHNXaXRoKCcvYXBpLycpKSB7XG4gICAgcmV0dXJuIFtpbnB1dCwgaW5pdF07XG4gIH1cblxuICBjb25zdCBvd25lclRva2VuID0gZ2V0T3duZXJUb2tlbigpO1xuICBpZiAoIXVybC5zZWFyY2hQYXJhbXMuaGFzKCdvd25lcl90b2tlbicpICYmICFfaXNTZXNzaW9uTWFuYWdlbWVudFBhdGgodXJsLnBhdGhuYW1lKSAmJiBvd25lclRva2VuKSB7XG4gICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ293bmVyX3Rva2VuJywgb3duZXJUb2tlbik7XG4gIH1cblxuICBjb25zdCBzZXNzaW9uSWQgPSBnZXRTZXNzaW9uSWRGcm9tVVJMKCk7XG4gIGlmICghc2Vzc2lvbklkKSB7XG4gICAgcmV0dXJuIFt1cmwudG9TdHJpbmcoKSwgaW5pdF07XG4gIH1cblxuICBjb25zdCBtZXRob2QgPSAoaW5pdC5tZXRob2QgfHwgJ0dFVCcpLnRvVXBwZXJDYXNlKCk7XG4gIGNvbnN0IG5leHRJbml0ID0geyAuLi5pbml0IH07XG4gIGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycyhpbml0LmhlYWRlcnMgfHwge30pO1xuXG4gIGlmICghdXJsLnNlYXJjaFBhcmFtcy5oYXMoJ3Nlc3Npb25faWQnKSAmJiAhX2lzU2Vzc2lvbk1hbmFnZW1lbnRQYXRoKHVybC5wYXRobmFtZSkpIHtcbiAgICB1cmwuc2VhcmNoUGFyYW1zLnNldCgnc2Vzc2lvbl9pZCcsIHNlc3Npb25JZCk7XG4gIH1cblxuICBjb25zdCBuZWVkc0JvZHlDb250ZXh0ID0gIVsnR0VUJywgJ0hFQUQnXS5pbmNsdWRlcyhtZXRob2QpO1xuICBjb25zdCBib2R5ID0gbmV4dEluaXQuYm9keTtcbiAgY29uc3QgaXNGb3JtRGF0YSA9IHR5cGVvZiBGb3JtRGF0YSAhPT0gJ3VuZGVmaW5lZCcgJiYgYm9keSBpbnN0YW5jZW9mIEZvcm1EYXRhO1xuICBjb25zdCBpc1VSTFNlYXJjaFBhcmFtcyA9IHR5cGVvZiBVUkxTZWFyY2hQYXJhbXMgIT09ICd1bmRlZmluZWQnICYmIGJvZHkgaW5zdGFuY2VvZiBVUkxTZWFyY2hQYXJhbXM7XG4gIGNvbnN0IGNvbnRlbnRUeXBlID0gaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpIHx8ICcnO1xuXG4gIGlmIChuZWVkc0JvZHlDb250ZXh0ICYmICFpc0Zvcm1EYXRhICYmICFpc1VSTFNlYXJjaFBhcmFtcykge1xuICAgIGxldCBwYXlsb2FkID0ge307XG4gICAgaWYgKHR5cGVvZiBib2R5ID09PSAnc3RyaW5nJyAmJiBib2R5LnRyaW0oKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcGF5bG9hZCA9IEpTT04ucGFyc2UoYm9keSk7XG4gICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgIHJldHVybiBbdXJsLnRvU3RyaW5nKCksIG5leHRJbml0XTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGJvZHkgPT0gbnVsbCkge1xuICAgICAgcGF5bG9hZCA9IHt9O1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGJvZHkgPT09ICdvYmplY3QnKSB7XG4gICAgICBwYXlsb2FkID0geyAuLi5ib2R5IH07XG4gICAgfVxuXG4gICAgaWYgKHBheWxvYWQuc2Vzc2lvbl9pZCA9PSBudWxsICYmICFfaXNTZXNzaW9uTWFuYWdlbWVudFBhdGgodXJsLnBhdGhuYW1lKSkge1xuICAgICAgcGF5bG9hZC5zZXNzaW9uX2lkID0gc2Vzc2lvbklkO1xuICAgIH1cbiAgICBpZiAocGF5bG9hZC5vd25lcl90b2tlbiA9PSBudWxsICYmICFfaXNTZXNzaW9uTWFuYWdlbWVudFBhdGgodXJsLnBhdGhuYW1lKSkge1xuICAgICAgaWYgKG93bmVyVG9rZW4pIHBheWxvYWQub3duZXJfdG9rZW4gPSBvd25lclRva2VuO1xuICAgIH1cblxuICAgIG5leHRJbml0LmJvZHkgPSBKU09OLnN0cmluZ2lmeShwYXlsb2FkKTtcbiAgICBpZiAoIWNvbnRlbnRUeXBlKSB7XG4gICAgICBoZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL2pzb24nKTtcbiAgICB9XG4gIH1cblxuICBuZXh0SW5pdC5oZWFkZXJzID0gaGVhZGVycztcbiAgcmV0dXJuIFt1cmwudG9TdHJpbmcoKSwgbmV4dEluaXRdO1xufVxuXG5jb25zdCBfbmF0aXZlRmV0Y2ggPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93LmZldGNoID09PSAnZnVuY3Rpb24nXG4gID8gd2luZG93LmZldGNoLmJpbmQod2luZG93KVxuICA6ICh0eXBlb2YgZ2xvYmFsVGhpcy5mZXRjaCA9PT0gJ2Z1bmN0aW9uJyA/IGdsb2JhbFRoaXMuZmV0Y2guYmluZChnbG9iYWxUaGlzKSA6IG51bGwpO1xuXG5hc3luYyBmdW5jdGlvbiBzZXNzaW9uQXdhcmVGZXRjaChpbnB1dCwgaW5pdCA9IHt9KSB7XG4gIGlmIChfbmF0aXZlRmV0Y2ggPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignZmV0Y2ggaXMgbm90IGF2YWlsYWJsZScpO1xuICB9XG4gIGNvbnN0IFtuZXh0SW5wdXQsIG5leHRJbml0XSA9IF9idWlsZFNlc3Npb25Bd2FyZVJlcXVlc3QoaW5wdXQsIGluaXQpO1xuICBsZXQgcmVzcCA9IGF3YWl0IF9uYXRpdmVGZXRjaChuZXh0SW5wdXQsIG5leHRJbml0KTtcbiAgaWYgKHJlc3Auc3RhdHVzID09PSA0MDkpIHtcbiAgICBjb25zdCBzaG91bGRSZXRyeSA9IGF3YWl0IGhhbmRsZTQwOUNvbmZsaWN0KG5leHRJbnB1dCwgbmV4dEluaXQsIHJlc3ApO1xuICAgIGlmIChzaG91bGRSZXRyeSkgcmVzcCA9IGF3YWl0IF9uYXRpdmVGZXRjaChuZXh0SW5wdXQsIG5leHRJbml0KTtcbiAgfVxuICByZXR1cm4gcmVzcDtcbn1cblxuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuZmV0Y2ggPT09ICdmdW5jdGlvbicpIHtcbiAgd2luZG93LmZldGNoID0gc2Vzc2lvbkF3YXJlRmV0Y2g7XG59XG5cbi8qKlxuICogQmFzZSBBUEkgY2FsbCBmdW5jdGlvbiB3aXRoIGVycm9yIGhhbmRsaW5nIGFuZCBsb2dnaW5nLlxuICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZCAtIEhUVFAgbWV0aG9kIChHRVQsIFBPU1QsIGV0Yy4pXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5kcG9pbnQgLSBBUEkgZW5kcG9pbnQgKGUuZy4sICcvYXBpL3N0YXR1cycpXG4gKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIFJlcXVlc3QgYm9keSBkYXRhIChmb3IgUE9TVC9QVVQpXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxvYmplY3Q+fSBQYXJzZWQgSlNPTiByZXNwb25zZVxuICovXG5hc3luYyBmdW5jdGlvbiBhcGlDYWxsKG1ldGhvZCwgZW5kcG9pbnQsIGRhdGEgPSBudWxsKSB7XG4gIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgbWV0aG9kLFxuICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9XG4gIH07XG5cbiAgaWYgKGRhdGEgJiYgKG1ldGhvZCA9PT0gJ1BPU1QnIHx8IG1ldGhvZCA9PT0gJ1BVVCcpKSB7XG4gICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2Vzc2lvbkF3YXJlRmV0Y2goZW5kcG9pbnQsIG9wdGlvbnMpO1xuXG4gICAgLy8gSGFuZGxlIDQwOSBDb25mbGljdCAoc2Vzc2lvbiBhbHJlYWR5IGFjdGl2ZSlcbiAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDkpIHtcbiAgICAgIGxvZy53YXJuKGBTZXNzaW9uIGNvbmZsaWN0IG9uICR7ZW5kcG9pbnR9YCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Nlc3Npb24gYWxyZWFkeSBhY3RpdmUgaW4gYW5vdGhlciB0YWInKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICBsb2cuZXJyb3IoYEFQSSBlcnJvciBvbiAke21ldGhvZH0gJHtlbmRwb2ludH06YCwgcmVzcG9uc2Uuc3RhdHVzLCByZXNwb25zZS5zdGF0dXNUZXh0KTtcbiAgICAgIGxldCBlcnJvck1lc3NhZ2UgPSByZXNwb25zZS5zdGF0dXNUZXh0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZXJyb3JKc29uID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICBpZiAoZXJyb3JKc29uICYmIHR5cGVvZiBlcnJvckpzb24gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgZXJyb3JNZXNzYWdlID0gZXJyb3JKc29uLmVycm9yIHx8IGVycm9ySnNvbi5tZXNzYWdlIHx8IGVycm9yTWVzc2FnZTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAvLyBGYWxsIGJhY2sgdG8gc3RhdHVzIHRleHQgd2hlbiByZXNwb25zZSBpcyBub3QgSlNPTi5cbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtyZXNwb25zZS5zdGF0dXN9OiAke2Vycm9yTWVzc2FnZX1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgIHJldHVybiBqc29uO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy5lcnJvcihgQVBJIGNhbGwgZmFpbGVkOiAke21ldGhvZH0gJHtlbmRwb2ludH1gLCBlcnJvcik7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT1cbi8vIFNlc3Npb24gTWFuYWdlbWVudFxuLy8gPT09PT09PT09PT09PT09PT09PT1cblxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlU2Vzc2lvbigpIHtcbiAgcmV0dXJuIGFwaUNhbGwoJ1BPU1QnLCAnL2FwaS9zZXNzaW9ucy9uZXcnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hTdGF0dXMoKSB7XG4gIGNvbnN0IHN0YXR1cyA9IGF3YWl0IGFwaUNhbGwoJ0dFVCcsICcvYXBpL3N0YXR1cycpO1xuXG4gIC8vIEtlZXAgcHJvdmlkZXIvYXV0aCBVSSBpbiBzeW5jIHdoZW5ldmVyIHN0YXR1cyBpcyBmZXRjaGVkLlxuICBjb25zdCBwcm92aWRlciA9IHN0YXR1cz8ubGxtX3Byb3ZpZGVyIHx8IG51bGw7XG4gIGlmIChwcm92aWRlcikge1xuICAgIGdsb2JhbFRoaXMuY3VycmVudFByb3ZpZGVyID0gcHJvdmlkZXI7XG4gIH1cbiAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzLnVwZGF0ZUF1dGhCYWRnZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGdsb2JhbFRoaXMudXBkYXRlQXV0aEJhZGdlKHN0YXR1cz8uY29waWxvdF9hdXRoIHx8IHt9LCBwcm92aWRlcik7XG4gIH1cblxuICAvLyBVcGRhdGUgd29ya2Zsb3cgc3RlcCBiYXIgKGNsaWNrYWJsZS9jb21wbGV0ZWQvYWN0aXZlIHN0YXRlKSBvbiBldmVyeSBzdGF0dXMgZmV0Y2guXG4gIGlmICh0eXBlb2YgZ2xvYmFsVGhpcy51cGRhdGVXb3JrZmxvd1N0ZXBzID09PSAnZnVuY3Rpb24nICYmIHN0YXR1cyAmJiAhc3RhdHVzLl9lcnJvcikge1xuICAgIGdsb2JhbFRoaXMudXBkYXRlV29ya2Zsb3dTdGVwcyhzdGF0dXMpO1xuICB9XG5cbiAgcmV0dXJuIHN0YXR1cztcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT1cbi8vIFNldHRpbmdzXG4vLyA9PT09PT09PT09PT09PT09PT09PVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaFNldHRpbmdzKCkge1xuICByZXR1cm4gYXBpQ2FsbCgnR0VUJywgJy9hcGkvc2V0dGluZ3MnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlU2V0dGluZ3Moc2V0dGluZ3MpIHtcbiAgcmV0dXJuIGFwaUNhbGwoJ1BVVCcsICcvYXBpL3NldHRpbmdzJywgeyBzZXR0aW5ncyB9KTtcbn1cblxuZXhwb3J0IHtcbiAgU3RvcmFnZUtleXMsXG4gIE9XTkVSX1RPS0VOX0tFWSxcbiAgYXBpQ2FsbCxcbiAgZ2V0U2Vzc2lvbklkRnJvbVVSTCxcbiAgZ2V0T3duZXJUb2tlbixcbiAgZ2V0U2NvcGVkVGFiRGF0YVN0b3JhZ2VLZXksXG4gIHNlc3Npb25Bd2FyZUZldGNoLFxuICBjcmVhdGVTZXNzaW9uLFxuICBmZXRjaFN0YXR1cyxcbiAgZmV0Y2hTZXR0aW5ncywgdXBkYXRlU2V0dGluZ3MsXG59O1xuXG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9mZXRjaC11dGlscy5qc1xuICogR2xvYmFsIGZldGNoIGludGVyY2VwdG9yLCA0MDktY29uZmxpY3QgcmV0cnkgcXVldWUsIExMTSBidXN5IG92ZXJsYXksIGFuZFxuICogdGhlIHNldExvYWRpbmcgaGVscGVyIHRoYXQgZHJpdmVzIGJ1dHRvbnMvcHJvZ3Jlc3MgYmFyL2Fib3J0IGNvbnRyb2xsZXIuXG4gKlxuICogREVQRU5ERU5DSUVTOiB1aS1jb3JlLmpzIGV4cG9ydHMgKHRyYXBGb2N1cyBldGMuKSBhdmFpbGFibGUgb24gZ2xvYmFsVGhpcy5cbiAqICAgICAgICAgICAgICAgc2V0TG9hZGluZyBjYWxscyBfdXBkYXRlTExNT3ZlcmxheSAoZGVmaW5lZCBoZXJlKSBhbmRcbiAqICAgICAgICAgICAgICAgYXBwZW5kTWVzc2FnZSAoZGVmaW5lZCBpbiBtZXNzYWdlLXF1ZXVlLmpzLCBvbiBnbG9iYWxUaGlzKS5cbiAqL1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIDQwOSBDb25mbGljdCByZXRyeSBxdWV1ZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IF9jb25mbGljdFJldHJ5UXVldWUgPSBbXTtcbmxldCAgIF9jb25mbGljdFRpbWVySWQgICAgPSBudWxsO1xubGV0ICAgX2NvbmZsaWN0Q291bnRkb3duICA9IDA7XG5cbi8qKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHJlcXVlc3Qgc2hvdWxkIGJlIGludGVyY2VwdGVkIGJ5IHRoZSA0MDkgaGFuZGxlci4gKi9cbmZ1bmN0aW9uIF9zaG91bGRIYW5kbGVCdXN5Q29uZmxpY3QoYXJncykge1xuICB0cnkge1xuICAgIGNvbnN0IHJhd1VybCA9IHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJyA/IGFyZ3NbMF0gOiBhcmdzWzBdPy51cmw7XG4gICAgaWYgKCFyYXdVcmwpIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocmF3VXJsLCB3aW5kb3cubG9jYXRpb24ub3JpZ2luKTtcbiAgICByZXR1cm4gdXJsLnBhdGhuYW1lICE9PSAnL2FwaS9zZXNzaW9ucy9jbGFpbScgJiYgdXJsLnBhdGhuYW1lICE9PSAnL2FwaS9zZXNzaW9ucy90YWtlb3Zlcic7XG4gIH0gY2F0Y2ggKF8pIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG4vKipcbiAqIEhhbmRsZSBhIDQwOSBDb25mbGljdCByZXNwb25zZTogc2hvdyB0aGUgYW1iZXIgYmFubmVyIGFuZCBhd2FpdCB1c2VyIGNob2ljZS5cbiAqIFJldHVybnMgYSBQcm9taXNlPGJvb2xlYW4+IFx1MjAxNCB0cnVlIG1lYW5zIFwicmV0cnlcIiwgZmFsc2UgbWVhbnMgXCJkaXNtaXNzXCIuXG4gKiBDYWxsZWQgZnJvbSBhcGktY2xpZW50LmpzIGluc2lkZSBzZXNzaW9uQXdhcmVGZXRjaCBzbyB0aGUgZnVsbCBmZXRjaCBwaXBlbGluZVxuICogaXMgb3duZWQgYnkgYSBzaW5nbGUgbW9kdWxlLWxldmVsIHdpbmRvdy5mZXRjaCBhc3NpZ25tZW50IHRoZXJlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfFJlcXVlc3R9IGlucHV0IC0gVGhlIHJlcXVlc3QgVVJML29iamVjdCAodXNlZCBmb3IgcGF0aCBmaWx0ZXJpbmcpLlxuICogQHBhcmFtIHtvYmplY3R9IGluaXQgLSBUaGUgZmV0Y2ggaW5pdCBvcHRpb25zLlxuICogQHBhcmFtIHtSZXNwb25zZX0gW3Jlc3BvbnNlXSAtIFRoZSA0MDkgcmVzcG9uc2UgKHVzZWQgdG8gY2hlY2sgY29uZmxpY3RfdHlwZSkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZTQwOUNvbmZsaWN0KGlucHV0LCBpbml0LCByZXNwb25zZSkge1xuICBpZiAoIV9zaG91bGRIYW5kbGVCdXN5Q29uZmxpY3QoW2lucHV0LCBpbml0XSkpIHJldHVybiBmYWxzZTtcbiAgaWYgKHJlc3BvbnNlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCByZXNwb25zZS5jbG9uZSgpLmpzb24oKTtcbiAgICAgIGlmIChib2R5ICYmIGJvZHkuY29uZmxpY3RfdHlwZSAmJiBib2R5LmNvbmZsaWN0X3R5cGUgIT09ICdzZXNzaW9uX293bmVyc2hpcCcpIHJldHVybiBmYWxzZTtcbiAgICB9IGNhdGNoIChfKSB7IC8qIG5vbi1KU09OIGJvZHkgXHUyMDE0IHByb2NlZWQgdG8gYmFubmVyICovIH1cbiAgfVxuICBzaG93U2Vzc2lvbkNvbmZsaWN0QmFubmVyKCk7XG4gIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IF9jb25mbGljdFJldHJ5UXVldWUucHVzaChyZXNvbHZlKSk7XG59XG5cbmZ1bmN0aW9uIHNob3dTZXNzaW9uQ29uZmxpY3RCYW5uZXIoKSB7XG4gIGNvbnN0IGJhbm5lciAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Nlc3Npb24tY29uZmxpY3QtYmFubmVyJyk7XG4gIGNvbnN0IGJhbm5lclRleHQgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbmZsaWN0LWJhbm5lci10ZXh0Jyk7XG4gIGNvbnN0IGNvdW50ZG93bkVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbmZsaWN0LWNvdW50ZG93bicpO1xuICBpZiAoIWJhbm5lcikgcmV0dXJuO1xuICBiYW5uZXIuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gIGlmIChfY29uZmxpY3RUaW1lcklkKSB7IGNsZWFySW50ZXJ2YWwoX2NvbmZsaWN0VGltZXJJZCk7IF9jb25mbGljdFRpbWVySWQgPSBudWxsOyB9XG4gIF9jb25mbGljdENvdW50ZG93biA9IDMwO1xuICBpZiAoYmFubmVyVGV4dCkgIGJhbm5lclRleHQudGV4dENvbnRlbnQgID0gJ1x1MjZBMCBBbm90aGVyIG9wZXJhdGlvbiBpcyBpbiBwcm9ncmVzcy4gQXV0by1yZXRyeWluZyBpbiAnO1xuICBpZiAoY291bnRkb3duRWwpIGNvdW50ZG93bkVsLnRleHRDb250ZW50ID0gYCR7X2NvbmZsaWN0Q291bnRkb3dufXNcdTIwMjZgO1xuICBfY29uZmxpY3RUaW1lcklkID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgIF9jb25mbGljdENvdW50ZG93bi0tO1xuICAgIGlmIChfY29uZmxpY3RDb3VudGRvd24gPD0gMCkge1xuICAgICAgY2xlYXJJbnRlcnZhbChfY29uZmxpY3RUaW1lcklkKTsgX2NvbmZsaWN0VGltZXJJZCA9IG51bGw7XG4gICAgICBjb25mbGljdFJldHJ5Tm93KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChjb3VudGRvd25FbCkgY291bnRkb3duRWwudGV4dENvbnRlbnQgPSBgJHtfY29uZmxpY3RDb3VudGRvd259c1x1MjAyNmA7XG4gICAgfVxuICB9LCAxMDAwKTtcbn1cblxuZnVuY3Rpb24gY29uZmxpY3RSZXRyeU5vdygpIHtcbiAgaWYgKF9jb25mbGljdFRpbWVySWQpIHsgY2xlYXJJbnRlcnZhbChfY29uZmxpY3RUaW1lcklkKTsgX2NvbmZsaWN0VGltZXJJZCA9IG51bGw7IH1cbiAgY29uc3QgYmFubmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Nlc3Npb24tY29uZmxpY3QtYmFubmVyJyk7XG4gIGlmIChiYW5uZXIpIGJhbm5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICB3aGlsZSAoX2NvbmZsaWN0UmV0cnlRdWV1ZS5sZW5ndGgpIF9jb25mbGljdFJldHJ5UXVldWUuc2hpZnQoKSh0cnVlKTtcbn1cblxuZnVuY3Rpb24gY29uZmxpY3REaXNtaXNzKCkge1xuICBpZiAoX2NvbmZsaWN0VGltZXJJZCkgeyBjbGVhckludGVydmFsKF9jb25mbGljdFRpbWVySWQpOyBfY29uZmxpY3RUaW1lcklkID0gbnVsbDsgfVxuICBjb25zdCBiYW5uZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2Vzc2lvbi1jb25mbGljdC1iYW5uZXInKTtcbiAgaWYgKGJhbm5lcikgYmFubmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHdoaWxlIChfY29uZmxpY3RSZXRyeVF1ZXVlLmxlbmd0aCkgX2NvbmZsaWN0UmV0cnlRdWV1ZS5zaGlmdCgpKGZhbHNlKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBMTE0gZmV0Y2ggd3JhcHBlciAoYXR0YWNoZXMgYWJvcnQgc2lnbmFsKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIGxsbUZldGNoKHVybCwgb3B0aW9ucyA9IHt9KSB7XG4gIGlmICh3aW5kb3cuX2N1cnJlbnRBYm9ydENvbnRyb2xsZXIpIHtcbiAgICBvcHRpb25zLnNpZ25hbCA9IHdpbmRvdy5fY3VycmVudEFib3J0Q29udHJvbGxlci5zaWduYWw7XG4gIH1cbiAgcmV0dXJuIGZldGNoKHVybCwgb3B0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIGFib3J0Q3VycmVudFJlcXVlc3QoKSB7XG4gIGlmICh3aW5kb3cuX2N1cnJlbnRBYm9ydENvbnRyb2xsZXIpIHtcbiAgICB3aW5kb3cuX2N1cnJlbnRBYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICB3aW5kb3cuX2N1cnJlbnRBYm9ydENvbnRyb2xsZXIgPSBudWxsO1xuICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgIGlmICh0eXBlb2YgYXBwZW5kTWVzc2FnZSA9PT0gJ2Z1bmN0aW9uJykgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgJ1x1MjNGOSBSZXF1ZXN0IHN0b3BwZWQuJyk7XG4gIH1cbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBMTE0gYnVzeSBvdmVybGF5XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxubGV0IF9sbG1FbGFwc2VkVGltZXIgPSBudWxsO1xubGV0IF9sbG1TdGFydFRpbWUgICAgPSBudWxsO1xuXG5mdW5jdGlvbiBfdXBkYXRlTExNT3ZlcmxheShsb2FkaW5nLCBsYWJlbCkge1xuICBjb25zdCBvdmVybGF5ICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG0tYnVzeS1vdmVybGF5Jyk7XG4gIGNvbnN0IGxhYmVsRWwgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbS1idXN5LWxhYmVsJyk7XG4gIGNvbnN0IGVsYXBzZWQgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbS1idXN5LWVsYXBzZWQnKTtcbiAgaWYgKCFvdmVybGF5KSByZXR1cm47XG5cbiAgaWYgKGxvYWRpbmcpIHtcbiAgICBvdmVybGF5LmNsYXNzTGlzdC5hZGQoJ3Zpc2libGUnKTtcbiAgICBvdmVybGF5LmNsYXNzTGlzdC5yZW1vdmUoJ3Nsb3cnKTtcbiAgICBpZiAobGFiZWxFbCkgbGFiZWxFbC50ZXh0Q29udGVudCA9IGxhYmVsIHx8ICdSZWFzb25pbmdcdTIwMjYnO1xuICAgIGlmIChlbGFwc2VkKSAgZWxhcHNlZC50ZXh0Q29udGVudCA9ICcwOjAwJztcblxuICAgIF9sbG1TdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGNsZWFySW50ZXJ2YWwoX2xsbUVsYXBzZWRUaW1lcik7XG4gICAgX2xsbUVsYXBzZWRUaW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIGNvbnN0IHNlY3MgPSBNYXRoLmZsb29yKChEYXRlLm5vdygpIC0gX2xsbVN0YXJ0VGltZSkgLyAxMDAwKTtcbiAgICAgIGNvbnN0IG1tID0gU3RyaW5nKE1hdGguZmxvb3Ioc2VjcyAvIDYwKSkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICAgIGNvbnN0IHNzID0gU3RyaW5nKHNlY3MgJSA2MCkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICAgIGlmIChlbGFwc2VkKSBlbGFwc2VkLnRleHRDb250ZW50ID0gYCR7bW19OiR7c3N9YDtcbiAgICAgIGlmIChzZWNzID49IDMwICYmICFvdmVybGF5LmNsYXNzTGlzdC5jb250YWlucygnc2xvdycpKSB7XG4gICAgICAgIG92ZXJsYXkuY2xhc3NMaXN0LmFkZCgnc2xvdycpO1xuICAgICAgfVxuICAgIH0sIDEwMDApO1xuICB9IGVsc2Uge1xuICAgIGNsZWFySW50ZXJ2YWwoX2xsbUVsYXBzZWRUaW1lcik7XG4gICAgX2xsbUVsYXBzZWRUaW1lciA9IG51bGw7XG4gICAgX2xsbVN0YXJ0VGltZSAgICA9IG51bGw7XG4gICAgb3ZlcmxheS5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJywgJ3Nsb3cnKTtcbiAgICBpZiAobGFiZWxFbCkgbGFiZWxFbC50ZXh0Q29udGVudCA9ICdSZWFzb25pbmdcdTIwMjYnO1xuICAgIGlmIChlbGFwc2VkKSAgZWxhcHNlZC50ZXh0Q29udGVudCA9ICcwOjAwJztcbiAgICBfcmVmcmVzaENvbnRleHRTdGF0cygpO1xuICB9XG59XG5cbi8vIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkgZm9yIHRlc3RzL2ltcG9ydHMgdGhhdCBzdGlsbCByZWZlcmVuY2UgdGhlIG9sZCBuYW1lLlxuZnVuY3Rpb24gX3VwZGF0ZUxMTVN0YXR1c0Jhcihsb2FkaW5nLCBsYWJlbCkge1xuICBfdXBkYXRlTExNT3ZlcmxheShsb2FkaW5nLCBsYWJlbCk7XG5cbiAgY29uc3QgYmFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbS1zdGF0dXMtYmFyJyk7XG4gIGNvbnN0IHRoaW5raW5nID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbS10aGlua2luZycpO1xuICBjb25zdCBzdGVwTGFiZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtLXN0ZXAtbGFiZWwnKTtcbiAgY29uc3QgYWJvcnRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtLWFib3J0LWJ0bicpO1xuICBpZiAoIWJhcikgcmV0dXJuO1xuXG4gIGlmIChsb2FkaW5nKSB7XG4gICAgYmFyLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgaWYgKHRoaW5raW5nKSB0aGlua2luZy5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICAgIGlmIChzdGVwTGFiZWwpIHN0ZXBMYWJlbC50ZXh0Q29udGVudCA9IGxhYmVsIHx8ICdSZWFzb25pbmdcdTIwMjYnO1xuICAgIGlmIChhYm9ydEJ0bikge1xuICAgICAgYWJvcnRCdG4uc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgYWJvcnRCdG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKHRoaW5raW5nKSB0aGlua2luZy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGlmIChhYm9ydEJ0bikgYWJvcnRCdG4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBiYXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBfcmVmcmVzaENvbnRleHRTdGF0cygpIHtcbiAgY29uc3QgdG9rZW5FbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG0tdG9rZW4tY291bnQnKTtcbiAgaWYgKCF0b2tlbkVsKSByZXR1cm47XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL2NvbnRleHQtc3RhdHMnKTtcbiAgICBpZiAoIXJlcy5vaykgcmV0dXJuO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmICghZGF0YS5vaykgcmV0dXJuO1xuICAgIGNvbnN0IGVzdCAgICA9IGRhdGEuZXN0aW1hdGVkX3Rva2VucyB8fCAwO1xuICAgIGNvbnN0IHdpbiAgICA9IGRhdGEuY29udGV4dF93aW5kb3cgICB8fCAxMjhfMDAwO1xuICAgIGNvbnN0IGV4YWN0ICA9IGRhdGEudG9rZW5fc291cmNlID09PSAnZXhhY3QnO1xuICAgIGNvbnN0IHBjdCAgICA9IE1hdGgucm91bmQoKGVzdCAvIHdpbikgKiAxMDApO1xuICAgIGNvbnN0IGVzdFN0ciA9IGVzdCA+PSAxMDAwID8gYCR7KGVzdCAvIDEwMDApLnRvRml4ZWQoMSl9S2AgOiBgJHtlc3R9YDtcbiAgICBjb25zdCB3aW5TdHIgPSB3aW4gPj0gMTAwMCA/IGAke01hdGgucm91bmQod2luIC8gMTAwMCl9S2AgIDogYCR7d2lufWA7XG4gICAgdG9rZW5FbC50ZXh0Q29udGVudCA9IGAke2V4YWN0ID8gJycgOiAnfid9JHtlc3RTdHJ9IC8gJHt3aW5TdHJ9ICgke3BjdH0lKWA7XG4gIH0gY2F0Y2ggKF8pIHsgLyogc2lsZW50bHkgaWdub3JlICovIH1cbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBMb2FkaW5nIHN0YXRlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gc2V0TG9hZGluZyhsb2FkaW5nLCBsYWJlbCkge1xuICBpZiAodHlwZW9mIHN0YXRlTWFuYWdlciAhPT0gJ3VuZGVmaW5lZCcgJiYgc3RhdGVNYW5hZ2VyPy5zZXRMb2FkaW5nKSB7XG4gICAgc3RhdGVNYW5hZ2VyLnNldExvYWRpbmcobG9hZGluZyk7XG4gIH1cblxuICBpZiAobG9hZGluZykge1xuICAgIHdpbmRvdy5fY3VycmVudEFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAvLyBFeHBhbmQgY2hhdCBwYW5lbCBpZiBjb2xsYXBzZWRcbiAgICBjb25zdCBjaGF0QXJlYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaGF0LWFyZWEnKTtcbiAgICBjb25zdCB2aWV3ZXJBcmVhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ZpZXdlci1hcmVhJyk7XG4gICAgY29uc3QgdG9nZ2xlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvZ2dsZS1jaGF0Jyk7XG4gICAgaWYgKGNoYXRBcmVhPy5jbGFzc0xpc3QuY29udGFpbnMoJ2NvbGxhcHNlZCcpKSB7XG4gICAgICBjaGF0QXJlYS5jbGFzc0xpc3QucmVtb3ZlKCdjb2xsYXBzZWQnKTtcbiAgICAgIHZpZXdlckFyZWE/LmNsYXNzTGlzdC5yZW1vdmUoJ2V4cGFuZGVkJyk7XG4gICAgICBpZiAodG9nZ2xlQnRuKSB0b2dnbGVCdG4udGV4dENvbnRlbnQgPSAnXHUyNUMwJztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgd2luZG93Ll9jdXJyZW50QWJvcnRDb250cm9sbGVyID0gbnVsbDtcbiAgfVxuXG4gIF91cGRhdGVMTE1TdGF0dXNCYXIobG9hZGluZywgbGFiZWwpO1xuXG4gIC8vIE9ubHkgZGlzYWJsZSBidXR0b25zIGluc2lkZSB0aGUgY2hhdC9pbnRlcmFjdGlvbiBhcmVhIFx1MjAxNCBub3QgdGhlIHdob2xlIHBhZ2UuXG4gIGNvbnN0IGNoYXRBcmVhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NoYXQtYXJlYScpO1xuICBjb25zdCBzY29wZSA9IGNoYXRBcmVhIHx8IGRvY3VtZW50O1xuICBzY29wZS5xdWVyeVNlbGVjdG9yQWxsKCdidXR0b24nKS5mb3JFYWNoKGJ0biA9PiB7IGJ0bi5kaXNhYmxlZCA9IGxvYWRpbmc7IH0pO1xuICBjb25zdCBzdG9wQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbS1idXN5LXN0b3AnKTtcbiAgaWYgKHN0b3BCdG4pIHN0b3BCdG4uZGlzYWJsZWQgPSBmYWxzZTtcblxuICBsZXQgYmFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvYWRpbmctcHJvZ3Jlc3MtYmFyJyk7XG4gIGlmIChsb2FkaW5nKSB7XG4gICAgaWYgKCFiYXIpIHtcbiAgICAgIGJhciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgYmFyLmlkID0gJ2xvYWRpbmctcHJvZ3Jlc3MtYmFyJztcbiAgICAgIGRvY3VtZW50LmJvZHkucHJlcGVuZChiYXIpO1xuICAgIH1cbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4geyBiYXIuc3R5bGUud2lkdGggPSAnNzAlJzsgfSk7XG4gICAgaWYgKGxhYmVsKSBiYXIudGl0bGUgPSBsYWJlbDtcbiAgfSBlbHNlIHtcbiAgICBpZiAoYmFyKSB7XG4gICAgICBiYXIuc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IGJhci5yZW1vdmUoKSwgNDAwKTtcbiAgICB9XG4gIH1cblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc3RlcC5hY3RpdmUnKS5mb3JFYWNoKGVsID0+IHtcbiAgICBlbC5jbGFzc0xpc3QudG9nZ2xlKCdsb2FkaW5nLXN0ZXAnLCBsb2FkaW5nKTtcbiAgfSk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFUyBtb2R1bGUgZXhwb3J0cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmV4cG9ydCB7XG4gIGhhbmRsZTQwOUNvbmZsaWN0LFxuICBzaG93U2Vzc2lvbkNvbmZsaWN0QmFubmVyLCBjb25mbGljdFJldHJ5Tm93LCBjb25mbGljdERpc21pc3MsXG4gIGxsbUZldGNoLCBhYm9ydEN1cnJlbnRSZXF1ZXN0LFxuICBfdXBkYXRlTExNU3RhdHVzQmFyLFxuICBfdXBkYXRlTExNT3ZlcmxheSwgX3JlZnJlc2hDb250ZXh0U3RhdHMsXG4gIHNldExvYWRpbmcsXG59O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiBzdGF0ZS1tYW5hZ2VyLmpzXG4gKiBNYW5hZ2VzIHNlc3Npb24gc3RhdGUsIGxvY2FsU3RvcmFnZSBwZXJzaXN0ZW5jZSwgYW5kIHN0YXRlIGluaXRpYWxpemF0aW9uLlxuICogQ2VudHJhbGl6ZXMgYWxsIHN0YXRlIG1hbmFnZW1lbnQgbG9naWMgKGN1cnJlbnRUYWIsIGludGVyYWN0aXZlU3RhdGUsIHNlc3Npb25JZCwgZXRjLilcbiAqL1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5jb25zdCBsb2cgPSBnZXRMb2dnZXIoJ3N0YXRlLW1hbmFnZXInKTtcblxuaW1wb3J0IHsgU3RvcmFnZUtleXMgfSBmcm9tICcuL2FwaS1jbGllbnQuanMnO1xuXG4vKipcbiAqIE1pcnJvciBvZiB0aGUgUHl0aG9uIFBoYXNlIGVudW0gaW4gc2NyaXB0cy91dGlscy9jb252ZXJzYXRpb25fbWFuYWdlci5weS5cbiAqIFB5dGhvbiBpcyB0aGUgU09VUkNFIE9GIFRSVVRIIFx1MjAxNCB1cGRhdGUgYm90aCBmaWxlcyB0b2dldGhlciB3aGVuZXZlciBhZGRpbmdcbiAqIG9yIHJlbmFtaW5nIGEgcGhhc2UuXG4gKi9cbmNvbnN0IFBIQVNFUyA9IHtcbiAgSU5JVDogICAgICAgICAgICAgJ2luaXQnLFxuICBKT0JfQU5BTFlTSVM6ICAgICAnam9iX2FuYWx5c2lzJyxcbiAgQ1VTVE9NSVpBVElPTjogICAgJ2N1c3RvbWl6YXRpb24nLFxuICBSRVdSSVRFX1JFVklFVzogICAncmV3cml0ZV9yZXZpZXcnLFxuICBTUEVMTF9DSEVDSzogICAgICAnc3BlbGxfY2hlY2snLFxuICBHRU5FUkFUSU9OOiAgICAgICAnZ2VuZXJhdGlvbicsXG4gIExBWU9VVF9SRVZJRVc6ICAgICdsYXlvdXRfcmV2aWV3JyxcbiAgRklOQUxfR0VORVJBVElPTjogJ2ZpbmFsX2dlbmVyYXRpb24nLFxuICBSRUZJTkVNRU5UOiAgICAgICAncmVmaW5lbWVudCcsXG59O1xuXG5jb25zdCBQSEFTRV9UT19TVEVQID0ge1xuICBbUEhBU0VTLklOSVRdOiAgICAgICAgICAgICAnam9iJyxcbiAgW1BIQVNFUy5KT0JfQU5BTFlTSVNdOiAgICAgJ2FuYWx5c2lzJyxcbiAgW1BIQVNFUy5DVVNUT01JWkFUSU9OXTogICAgJ2N1c3RvbWl6YXRpb25zJyxcbiAgW1BIQVNFUy5SRVdSSVRFX1JFVklFV106ICAgJ3Jld3JpdGUnLFxuICBbUEhBU0VTLlNQRUxMX0NIRUNLXTogICAgICAnc3BlbGwnLFxuICBbUEhBU0VTLkdFTkVSQVRJT05dOiAgICAgICAnbGF5b3V0JyxcbiAgW1BIQVNFUy5MQVlPVVRfUkVWSUVXXTogICAgJ2xheW91dCcsXG4gIFtQSEFTRVMuRklOQUxfR0VORVJBVElPTl06ICdkb3dubG9hZCcsXG4gIFtQSEFTRVMuUkVGSU5FTUVOVF06ICAgICAgICdkb3dubG9hZCcsXG59O1xuXG5mdW5jdGlvbiBnZXRXb3JrZmxvd1N0ZXBGb3JQaGFzZShwaGFzZSkge1xuICByZXR1cm4gUEhBU0VfVE9fU1RFUFtwaGFzZV0gfHwgJ2pvYic7XG59XG5cbi8qKlxuICogU3RhZ2VkIGdlbmVyYXRpb24gd29ya2Zsb3cgcGhhc2VzIChHQVAtMjAgaW1wbGVtZW50YXRpb24pLlxuICogVGhlc2UgdHJhY2sgdGhlIHByZXZpZXcvbGF5b3V0IHJldmlldyBcdTIxOTIgY29uZmlybWVkIFx1MjE5MiBmaW5hbCBwaXBlbGluZVxuICogaW5kZXBlbmRlbnRseSBvZiB0aGUgbWFpbiBjb252ZXJzYXRpb24gUEhBU0VTIGFib3ZlLlxuICogQmFja2VuZCBzb3VyY2Ugb2YgdHJ1dGggaXMgc2Vzc2lvbl9kYXRhWydnZW5lcmF0aW9uX3N0YXRlJ11bJ3BoYXNlJ10uXG4gKi9cbmNvbnN0IEdFTkVSQVRJT05fUEhBU0VTID0ge1xuICBJRExFOiAgICAgICAgICAgJ2lkbGUnLFxuICBMQVlPVVRfUkVWSUVXOiAgJ2xheW91dF9yZXZpZXcnLFxuICBDT05GSVJNRUQ6ICAgICAgJ2NvbmZpcm1lZCcsXG4gIEZJTkFMX0NPTVBMRVRFOiAnZmluYWxfY29tcGxldGUnLFxufTtcblxuY29uc3QgR0VORVJBVElPTl9TVEFURV9FVkVOVCA9ICdjdmJ1aWxkZXI6Z2VuZXJhdGlvbi1zdGF0ZS1jaGFuZ2VkJztcblxuZnVuY3Rpb24gY3JlYXRlRGVmYXVsdEdlbmVyYXRpb25TdGF0ZSgpIHtcbiAgcmV0dXJuIHtcbiAgICBwaGFzZTogR0VORVJBVElPTl9QSEFTRVMuSURMRSxcbiAgICBwcmV2aWV3QXZhaWxhYmxlOiBmYWxzZSxcbiAgICBwcmV2aWV3T3V0cHV0czogbnVsbCxcbiAgICBsYXlvdXRDb25maXJtZWQ6IGZhbHNlLFxuICAgIHBhZ2VDb3VudEVzdGltYXRlOiBudWxsLFxuICAgIHBhZ2VDb3VudEV4YWN0OiBudWxsLFxuICAgIHBhZ2VDb3VudENvbmZpZGVuY2U6IG51bGwsXG4gICAgcGFnZUNvdW50U291cmNlOiBudWxsLFxuICAgIHBhZ2VOZWVkc0V4YWN0UmVjaGVjazogZmFsc2UsXG4gICAgcGFnZVdhcm5pbmc6IGZhbHNlLFxuICAgIGxheW91dEluc3RydWN0aW9uc0NvdW50OiAwLFxuICAgIGZpbmFsR2VuZXJhdGVkQXQ6IG51bGwsXG4gICAgcHJldmlld0dlbmVyYXRlZEF0OiBudWxsLFxuICAgIHByZXZpZXdSZXF1ZXN0SWQ6IG51bGwsXG4gICAgY29uZmlybWVkQXQ6IG51bGwsXG4gICAgY29udGVudFJldmlzaW9uOiAwLFxuICAgIGxhc3RQcmV2aWV3Q29udGVudFJldmlzaW9uOiBudWxsLFxuICAgIGxhc3RGaW5hbENvbnRlbnRSZXZpc2lvbjogbnVsbCxcbiAgICBkaXJ0eVBoYXNlczogW10sXG4gICAgZWFybGllc3REaXJ0eVN0ZXA6IG51bGwsXG4gIH07XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJldmlzaW9uKHZhbHVlKSB7XG4gIHJldHVybiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpID8gdmFsdWUgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBnZXRMYXN0UmVuZGVyZWRDb250ZW50UmV2aXNpb24oc3RhdGUpIHtcbiAgY29uc3QgcmV2aXNpb25zID0gW1xuICAgIG5vcm1hbGl6ZVJldmlzaW9uKHN0YXRlLmxhc3RQcmV2aWV3Q29udGVudFJldmlzaW9uKSxcbiAgICBub3JtYWxpemVSZXZpc2lvbihzdGF0ZS5sYXN0RmluYWxDb250ZW50UmV2aXNpb24pLFxuICBdLmZpbHRlcih2YWx1ZSA9PiB2YWx1ZSAhPT0gbnVsbCk7XG4gIHJldHVybiByZXZpc2lvbnMubGVuZ3RoID4gMCA/IE1hdGgubWF4KC4uLnJldmlzaW9ucykgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZVNlc3Npb25JZCgpIHtcbiAgY29uc3QgY3J5cHRvQXBpID0gZ2xvYmFsVGhpcy5jcnlwdG87XG4gIGlmIChjcnlwdG9BcGk/LnJhbmRvbVVVSUQpIHtcbiAgICByZXR1cm4gYHNlc3Npb24tJHtjcnlwdG9BcGkucmFuZG9tVVVJRCgpfWA7XG4gIH1cblxuICBpZiAoY3J5cHRvQXBpPy5nZXRSYW5kb21WYWx1ZXMpIHtcbiAgICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KDE2KTtcbiAgICBjcnlwdG9BcGkuZ2V0UmFuZG9tVmFsdWVzKGJ5dGVzKTtcbiAgICBjb25zdCB0b2tlbiA9IEFycmF5LmZyb20oYnl0ZXMsIGJ5dGUgPT4gYnl0ZS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKSkuam9pbignJyk7XG4gICAgcmV0dXJuIGBzZXNzaW9uLSR7dG9rZW59YDtcbiAgfVxuXG4gIGxvZy53YXJuKCdXZWIgQ3J5cHRvIEFQSSB1bmF2YWlsYWJsZTsgZmFsbGluZyBiYWNrIHRvIHRpbWVzdGFtcC1wbHVzLXJhbmRvbSBzZXNzaW9uIGlkIGdlbmVyYXRpb24uJyk7XG4gIHJldHVybiBgc2Vzc2lvbi0ke0RhdGUubm93KCkudG9TdHJpbmcoMzYpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDExKX1gO1xufVxuXG5mdW5jdGlvbiBnZXRMYXlvdXRGcmVzaG5lc3NGcm9tU3RhdGUoc3RhdGUpIHtcbiAgY29uc3QgcHJldmlld0F2YWlsYWJsZSA9IEJvb2xlYW4oc3RhdGUucHJldmlld0F2YWlsYWJsZSk7XG4gIGNvbnN0IGhhc0ZpbmFsT3V0cHV0cyA9IEJvb2xlYW4oXG4gICAgc3RhdGUuZmluYWxHZW5lcmF0ZWRBdFxuICAgICAgfHwgc3RhdGUucGhhc2UgPT09IEdFTkVSQVRJT05fUEhBU0VTLkZJTkFMX0NPTVBMRVRFXG4gICAgICB8fCBub3JtYWxpemVSZXZpc2lvbihzdGF0ZS5sYXN0RmluYWxDb250ZW50UmV2aXNpb24pICE9PSBudWxsXG4gICk7XG5cbiAgaWYgKCFwcmV2aWV3QXZhaWxhYmxlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNob3dDaGlwOiBmYWxzZSxcbiAgICAgIGlzU3RhbGU6IGZhbHNlLFxuICAgICAgaXNDcml0aWNhbDogZmFsc2UsXG4gICAgICBoYXNGaW5hbE91dHB1dHMsXG4gICAgICBsYWJlbDogJycsXG4gICAgICBhcmlhTGFiZWw6ICcnLFxuICAgICAgdG9uZTogJ2hpZGRlbicsXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IGNvbnRlbnRSZXZpc2lvbiA9IG5vcm1hbGl6ZVJldmlzaW9uKHN0YXRlLmNvbnRlbnRSZXZpc2lvbikgPz8gMDtcbiAgY29uc3QgbGFzdFJlbmRlcmVkUmV2aXNpb24gPSBnZXRMYXN0UmVuZGVyZWRDb250ZW50UmV2aXNpb24oc3RhdGUpO1xuICBjb25zdCBpc1N0YWxlID0gbGFzdFJlbmRlcmVkUmV2aXNpb24gIT09IG51bGwgJiYgY29udGVudFJldmlzaW9uID4gbGFzdFJlbmRlcmVkUmV2aXNpb247XG4gIGNvbnN0IGlzQ3JpdGljYWwgPSBpc1N0YWxlICYmIGhhc0ZpbmFsT3V0cHV0cztcblxuICBpZiAoaXNDcml0aWNhbCkge1xuICAgIHJldHVybiB7XG4gICAgICBzaG93Q2hpcDogdHJ1ZSxcbiAgICAgIGlzU3RhbGUsXG4gICAgICBpc0NyaXRpY2FsLFxuICAgICAgaGFzRmluYWxPdXRwdXRzLFxuICAgICAgbGFiZWw6ICdGaWxlcyBvdXRkYXRlZCcsXG4gICAgICBhcmlhTGFiZWw6ICdGaWxlcyBvdXRkYXRlZC4gQWN0aXZhdGUgdG8gcmV2aWV3IGxheW91dCBhbmQgcmVnZW5lcmF0ZSBvdXRwdXRzLicsXG4gICAgICB0b25lOiAnY3JpdGljYWwnLFxuICAgIH07XG4gIH1cblxuICBpZiAoaXNTdGFsZSkge1xuICAgIHJldHVybiB7XG4gICAgICBzaG93Q2hpcDogdHJ1ZSxcbiAgICAgIGlzU3RhbGUsXG4gICAgICBpc0NyaXRpY2FsLFxuICAgICAgaGFzRmluYWxPdXRwdXRzLFxuICAgICAgbGFiZWw6ICdMYXlvdXQgb3V0ZGF0ZWQnLFxuICAgICAgYXJpYUxhYmVsOiAnTGF5b3V0IG91dGRhdGVkLiBBY3RpdmF0ZSB0byByZXZpZXcgYW5kIHJlZ2VuZXJhdGUgcHJldmlldy4nLFxuICAgICAgdG9uZTogJ3N0YWxlJyxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzaG93Q2hpcDogdHJ1ZSxcbiAgICBpc1N0YWxlLFxuICAgIGlzQ3JpdGljYWwsXG4gICAgaGFzRmluYWxPdXRwdXRzLFxuICAgIGxhYmVsOiAnTGF5b3V0IGN1cnJlbnQnLFxuICAgIGFyaWFMYWJlbDogJ0xheW91dCBjdXJyZW50LiBQcmV2aWV3IG1hdGNoZXMgbGF0ZXN0IGNvbnRlbnQuJyxcbiAgICB0b25lOiAnZnJlc2gnLFxuICB9O1xufVxuXG5mdW5jdGlvbiBlbWl0R2VuZXJhdGlvblN0YXRlQ2hhbmdlZCgpIHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiB3aW5kb3cuZGlzcGF0Y2hFdmVudCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybjtcbiAgfVxuICB3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoR0VORVJBVElPTl9TVEFURV9FVkVOVCwge1xuICAgIGRldGFpbDoge1xuICAgICAgZ2VuZXJhdGlvblN0YXRlOiB7IC4uLmdlbmVyYXRpb25TdGF0ZSB9LFxuICAgICAgbGF5b3V0RnJlc2huZXNzOiBnZXRMYXlvdXRGcmVzaG5lc3NGcm9tU3RhdGUoZ2VuZXJhdGlvblN0YXRlKSxcbiAgICB9LFxuICB9KSk7XG59XG5cbi8vIEdsb2JhbCBzdGF0ZSB2YXJpYWJsZXMgKG1vdmVkIGludG8gbW9kdWxlIGZvciBjbGFyaXR5KVxubGV0IGN1cnJlbnRUYWIgPSAnam9iJztcbmxldCBpc0xvYWRpbmcgPSBmYWxzZTtcbmxldCB0YWJEYXRhID0ge1xuICBhbmFseXNpczogbnVsbCxcbiAgY3VzdG9taXphdGlvbnM6IG51bGwsXG4gIGN2OiBudWxsXG59O1xubGV0IGludGVyYWN0aXZlU3RhdGUgPSB7XG4gIGlzUmV2aWV3aW5nOiBmYWxzZSxcbiAgY3VycmVudEluZGV4OiAwLFxuICB0eXBlOiBudWxsLCAvLyAnZXhwZXJpZW5jZXMnIG9yICdza2lsbHMnXG4gIGRhdGE6IG51bGxcbn07XG5sZXQgc2Vzc2lvbklkID0gbnVsbDtcbmxldCBsYXN0S25vd25QaGFzZSA9IFBIQVNFUy5JTklUO1xubGV0IGlzUmVjb25uZWN0aW5nID0gZmFsc2U7XG5jb25zdCBfcGhhc2VDaGFuZ2VMaXN0ZW5lcnMgPSBbXTtcbi8vIEN1cnJlbnQgbW9kZWwvcHJvdmlkZXIgc2VsZWN0aW9uIChwZXJzaXN0ZWQgdG8gbG9jYWxTdG9yYWdlKVxubGV0IGN1cnJlbnRNb2RlbFByb3ZpZGVyID0gbnVsbDtcbmxldCBjdXJyZW50TW9kZWxOYW1lID0gbnVsbDtcblxuXG4vLyBTdGFnZWQgZ2VuZXJhdGlvbiBzdGF0ZSAoR0FQLTIwKTogdHJhY2tzIHByZXZpZXcgXHUyMTkyIGNvbmZpcm0gXHUyMTkyIGZpbmFsIHBpcGVsaW5lLlxuLy8gU3luY2VkIGZyb20gL2FwaS9jdi9nZW5lcmF0aW9uLXN0YXRlIG9uIHBhZ2UgbG9hZCBhbmQgYWZ0ZXIga2V5IHRyYW5zaXRpb25zLlxubGV0IGdlbmVyYXRpb25TdGF0ZSA9IGNyZWF0ZURlZmF1bHRHZW5lcmF0aW9uU3RhdGUoKTtcblxuLy8gQVRTIHNjb3JlIHN0YXRlIChHQVAtMjEpOiBjYWNoZWQgc2NvcmUgZnJvbSAvYXBpL2N2L2F0cy1zY29yZS5cbi8vIE51bGwgdW50aWwgZmlyc3Qgc2NvcmUgaXMgZmV0Y2hlZC5cbmxldCBhdHNTY29yZSA9IG51bGw7XG5cbi8vIEV4cG9ydCBzdGF0ZSBnZXR0ZXJzL3NldHRlcnNcbmNvbnN0IHN0YXRlTWFuYWdlciA9IHtcbiAgLy8gVGFiIHN0YXRlXG4gIGdldEN1cnJlbnRUYWI6ICgpID0+IGN1cnJlbnRUYWIsXG4gIHNldEN1cnJlbnRUYWI6ICh0YWIpID0+IHsgY3VycmVudFRhYiA9IHRhYjsgc2F2ZVN0YXRlVG9Mb2NhbFN0b3JhZ2UoKTsgfSxcbiAgZ2V0Q3VycmVudFN0YWdlOiAoKSA9PiBnZXRXb3JrZmxvd1N0ZXBGb3JQaGFzZShsYXN0S25vd25QaGFzZSksXG5cbiAgLy8gTG9hZGluZyBzdGF0ZVxuICBpc0xvYWRpbmc6ICgpID0+IGlzTG9hZGluZyxcbiAgc2V0TG9hZGluZzogKGxvYWRpbmcpID0+IHtcbiAgICBpc0xvYWRpbmcgPSBsb2FkaW5nO1xuICB9LFxuXG4gIC8vIFRhYiBkYXRhIChhbmFseXNpcywgY3VzdG9taXphdGlvbnMsIENWKVxuICBnZXRUYWJEYXRhOiAodGFiKSA9PiB0YWJEYXRhW3RhYl0sXG4gIGdldEFsbFRhYkRhdGE6ICgpID0+ICh7IC4uLnRhYkRhdGEgfSksXG4gIHNldFRhYkRhdGE6ICh0YWIsIGRhdGEpID0+IHsgdGFiRGF0YVt0YWJdID0gZGF0YTsgc2F2ZVN0YXRlVG9Mb2NhbFN0b3JhZ2UoKTsgfSxcblxuICAvLyBJbnRlcmFjdGl2ZSBzdGF0ZSAoZm9yIGV4cGVyaWVuY2Uvc2tpbGwgc2VsZWN0aW9uIHJldmlldylcbiAgZ2V0SW50ZXJhY3RpdmVTdGF0ZTogKCkgPT4gaW50ZXJhY3RpdmVTdGF0ZSxcbiAgc2V0SW50ZXJhY3RpdmVTdGF0ZTogKHN0YXRlKSA9PiB7IGludGVyYWN0aXZlU3RhdGUgPSB7IC4uLmludGVyYWN0aXZlU3RhdGUsIC4uLnN0YXRlIH07IHNhdmVTdGF0ZVRvTG9jYWxTdG9yYWdlKCk7IH0sXG5cbiAgLy8gUmVjb25uZWN0IHN0YXRlXG4gIGlzUmVjb25uZWN0aW5nOiAoKSA9PiBpc1JlY29ubmVjdGluZyxcbiAgc2V0SXNSZWNvbm5lY3Rpbmc6IChyZWNvbm5lY3RpbmcpID0+IHsgaXNSZWNvbm5lY3RpbmcgPSBCb29sZWFuKHJlY29ubmVjdGluZyk7IH0sXG5cbiAgLy8gU2Vzc2lvbiBtYW5hZ2VtZW50XG4gIGdldFNlc3Npb25JZDogKCkgPT4gc2Vzc2lvbklkLFxuICBzZXRTZXNzaW9uSWQ6IChpZCkgPT4geyBzZXNzaW9uSWQgPSBpZDsgbG9jYWxTdG9yYWdlLnNldEl0ZW0oU3RvcmFnZUtleXMuU0VTU0lPTl9JRCwgaWQpOyB9LFxuXG4gIC8vIE1vZGVsL3Byb3ZpZGVyIHNlbGVjdGlvblxuICBnZXRDdXJyZW50TW9kZWxQcm92aWRlcjogKCkgPT4gY3VycmVudE1vZGVsUHJvdmlkZXIsXG4gIGdldEN1cnJlbnRNb2RlbE5hbWU6ICgpID0+IGN1cnJlbnRNb2RlbE5hbWUsXG4gIHNldEN1cnJlbnRNb2RlbDogKHByb3ZpZGVyLCBtb2RlbCkgPT4geyBjdXJyZW50TW9kZWxQcm92aWRlciA9IHByb3ZpZGVyIHx8IG51bGw7IGN1cnJlbnRNb2RlbE5hbWUgPSBtb2RlbCB8fCBudWxsOyBzYXZlU3RhdGVUb0xvY2FsU3RvcmFnZSgpOyB9LFxuXG4gIC8vIFBoYXNlIHRyYWNraW5nXG4gIGdldFBoYXNlOiAoKSA9PiBsYXN0S25vd25QaGFzZSxcbiAgc2V0UGhhc2U6IChwaGFzZSkgPT4ge1xuICAgIGxhc3RLbm93blBoYXNlID0gcGhhc2U7XG4gICAgc2F2ZVN0YXRlVG9Mb2NhbFN0b3JhZ2UoKTtcbiAgICBfcGhhc2VDaGFuZ2VMaXN0ZW5lcnMuZm9yRWFjaChmbiA9PiB7IHRyeSB7IGZuKHBoYXNlKTsgfSBjYXRjaCAoZSkgeyAvKiBpZ25vcmUgKi8gfSB9KTtcbiAgfSxcbiAgb25QaGFzZUNoYW5nZTogKGZuKSA9PiB7IGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIF9waGFzZUNoYW5nZUxpc3RlbmVycy5wdXNoKGZuKTsgfSxcbiAgZ2V0V29ya2Zsb3dTdGVwOiAoKSA9PiBnZXRXb3JrZmxvd1N0ZXBGb3JQaGFzZShsYXN0S25vd25QaGFzZSksXG5cbiAgLy8gUG9zdC1hbmFseXNpcyBxdWVzdGlvbnNcbiAgZ2V0UG9zdEFuYWx5c2lzUXVlc3Rpb25zOiAoKSA9PiB3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zIHx8IFtdLFxuICBzZXRQb3N0QW5hbHlzaXNRdWVzdGlvbnM6IChxdWVzdGlvbnMpID0+IHsgd2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucyA9IHF1ZXN0aW9uczsgfSxcblxuICAvLyBRdWVzdGlvbiBhbnN3ZXJzXG4gIGdldFF1ZXN0aW9uQW5zd2VyczogKCkgPT4gd2luZG93LnF1ZXN0aW9uQW5zd2VycyB8fCB7fSxcbiAgc2V0UXVlc3Rpb25BbnN3ZXJzOiAoYW5zd2VycykgPT4geyB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzID0gYW5zd2VyczsgfSxcblxuICAvLyBQZW5kaW5nIHJlY29tbWVuZGF0aW9uc1xuICBnZXRQZW5kaW5nUmVjb21tZW5kYXRpb25zOiAoKSA9PiB3aW5kb3cucGVuZGluZ1JlY29tbWVuZGF0aW9ucyB8fCBudWxsLFxuICBzZXRQZW5kaW5nUmVjb21tZW5kYXRpb25zOiAocmVjKSA9PiB7IHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zID0gcmVjOyBzYXZlU3RhdGVUb0xvY2FsU3RvcmFnZSgpOyB9LFxuXG4gIC8vIEFUUyBzY29yZSBzdGF0ZSAoR0FQLTIxKVxuICBnZXRBdHNTY29yZTogKCkgPT4gYXRzU2NvcmUsXG4gIHNldEF0c1Njb3JlOiAoc2NvcmUpID0+IHsgYXRzU2NvcmUgPSBzY29yZTsgc2F2ZVN0YXRlVG9Mb2NhbFN0b3JhZ2UoKTsgfSxcbiAgY2xlYXJBdHNTY29yZTogKCkgPT4geyBhdHNTY29yZSA9IG51bGw7IHNhdmVTdGF0ZVRvTG9jYWxTdG9yYWdlKCk7IH0sXG5cbiAgLy8gU3RhZ2VkIGdlbmVyYXRpb24gc3RhdGUgKEdBUC0yMClcbiAgZ2V0R2VuZXJhdGlvblN0YXRlOiAoKSA9PiBnZW5lcmF0aW9uU3RhdGUsXG4gIGdldExheW91dEZyZXNobmVzczogKCkgPT4gZ2V0TGF5b3V0RnJlc2huZXNzRnJvbVN0YXRlKGdlbmVyYXRpb25TdGF0ZSksXG4gIHNldEdlbmVyYXRpb25TdGF0ZTogKHVwZGF0ZSkgPT4ge1xuICAgIGdlbmVyYXRpb25TdGF0ZSA9IHsgLi4uZ2VuZXJhdGlvblN0YXRlLCAuLi51cGRhdGUgfTtcbiAgICBzYXZlU3RhdGVUb0xvY2FsU3RvcmFnZSgpO1xuICAgIGVtaXRHZW5lcmF0aW9uU3RhdGVDaGFuZ2VkKCk7XG4gIH0sXG4gIG1hcmtDb250ZW50Q2hhbmdlZDogKCkgPT4ge1xuICAgIGdlbmVyYXRpb25TdGF0ZSA9IHtcbiAgICAgIC4uLmdlbmVyYXRpb25TdGF0ZSxcbiAgICAgIGNvbnRlbnRSZXZpc2lvbjogKG5vcm1hbGl6ZVJldmlzaW9uKGdlbmVyYXRpb25TdGF0ZS5jb250ZW50UmV2aXNpb24pID8/IDApICsgMSxcbiAgICB9O1xuICAgIHNhdmVTdGF0ZVRvTG9jYWxTdG9yYWdlKCk7XG4gICAgZW1pdEdlbmVyYXRpb25TdGF0ZUNoYW5nZWQoKTtcbiAgfSxcbiAgbWFya1ByZXZpZXdHZW5lcmF0ZWQ6ICh1cGRhdGUgPSB7fSkgPT4ge1xuICAgIGNvbnN0IGNvbnRlbnRSZXZpc2lvbiA9IG5vcm1hbGl6ZVJldmlzaW9uKGdlbmVyYXRpb25TdGF0ZS5jb250ZW50UmV2aXNpb24pID8/IDA7XG4gICAgZ2VuZXJhdGlvblN0YXRlID0ge1xuICAgICAgLi4uZ2VuZXJhdGlvblN0YXRlLFxuICAgICAgLi4udXBkYXRlLFxuICAgICAgcGhhc2U6IEdFTkVSQVRJT05fUEhBU0VTLkxBWU9VVF9SRVZJRVcsXG4gICAgICBwcmV2aWV3QXZhaWxhYmxlOiB0cnVlLFxuICAgICAgbGF5b3V0Q29uZmlybWVkOiBmYWxzZSxcbiAgICAgIGxhc3RQcmV2aWV3Q29udGVudFJldmlzaW9uOiBjb250ZW50UmV2aXNpb24sXG4gICAgfTtcbiAgICBzYXZlU3RhdGVUb0xvY2FsU3RvcmFnZSgpO1xuICAgIGVtaXRHZW5lcmF0aW9uU3RhdGVDaGFuZ2VkKCk7XG4gIH0sXG4gIG1hcmtMYXlvdXRDb25maXJtZWQ6ICh1cGRhdGUgPSB7fSkgPT4ge1xuICAgIGdlbmVyYXRpb25TdGF0ZSA9IHtcbiAgICAgIC4uLmdlbmVyYXRpb25TdGF0ZSxcbiAgICAgIC4uLnVwZGF0ZSxcbiAgICAgIHBoYXNlOiBHRU5FUkFUSU9OX1BIQVNFUy5DT05GSVJNRUQsXG4gICAgICBsYXlvdXRDb25maXJtZWQ6IHRydWUsXG4gICAgfTtcbiAgICBzYXZlU3RhdGVUb0xvY2FsU3RvcmFnZSgpO1xuICAgIGVtaXRHZW5lcmF0aW9uU3RhdGVDaGFuZ2VkKCk7XG4gIH0sXG4gIG1hcmtGaW5hbEdlbmVyYXRlZDogKGdlbmVyYXRlZEF0ID0gbnVsbCwgdXBkYXRlID0ge30pID0+IHtcbiAgICBjb25zdCBjb250ZW50UmV2aXNpb24gPSBub3JtYWxpemVSZXZpc2lvbihnZW5lcmF0aW9uU3RhdGUuY29udGVudFJldmlzaW9uKSA/PyAwO1xuICAgIGdlbmVyYXRpb25TdGF0ZSA9IHtcbiAgICAgIC4uLmdlbmVyYXRpb25TdGF0ZSxcbiAgICAgIC4uLnVwZGF0ZSxcbiAgICAgIHBoYXNlOiBHRU5FUkFUSU9OX1BIQVNFUy5GSU5BTF9DT01QTEVURSxcbiAgICAgIGxheW91dENvbmZpcm1lZDogdHJ1ZSxcbiAgICAgIGZpbmFsR2VuZXJhdGVkQXQ6IGdlbmVyYXRlZEF0IHx8IHVwZGF0ZS5maW5hbEdlbmVyYXRlZEF0IHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIGxhc3RGaW5hbENvbnRlbnRSZXZpc2lvbjogY29udGVudFJldmlzaW9uLFxuICAgIH07XG4gICAgc2F2ZVN0YXRlVG9Mb2NhbFN0b3JhZ2UoKTtcbiAgICBlbWl0R2VuZXJhdGlvblN0YXRlQ2hhbmdlZCgpO1xuICB9LFxuICByZXNldEdlbmVyYXRpb25TdGF0ZTogKCkgPT4ge1xuICAgIGdlbmVyYXRpb25TdGF0ZSA9IGNyZWF0ZURlZmF1bHRHZW5lcmF0aW9uU3RhdGUoKTtcbiAgICBzYXZlU3RhdGVUb0xvY2FsU3RvcmFnZSgpO1xuICAgIGVtaXRHZW5lcmF0aW9uU3RhdGVDaGFuZ2VkKCk7XG4gIH0sXG4gIHNldERpcnR5UGhhc2VzOiAocGhhc2VzLCBlYXJsaWVzdFN0ZXApID0+IHtcbiAgICBnZW5lcmF0aW9uU3RhdGUgPSB7XG4gICAgICAuLi5nZW5lcmF0aW9uU3RhdGUsXG4gICAgICBkaXJ0eVBoYXNlczogICAgICAgQXJyYXkuaXNBcnJheShwaGFzZXMpID8gcGhhc2VzIDogW10sXG4gICAgICBlYXJsaWVzdERpcnR5U3RlcDogZWFybGllc3RTdGVwIHx8IG51bGwsXG4gICAgfTtcbiAgICBzYXZlU3RhdGVUb0xvY2FsU3RvcmFnZSgpO1xuICAgIGVtaXRHZW5lcmF0aW9uU3RhdGVDaGFuZ2VkKCk7XG4gIH0sXG4gIGNsZWFyRGlydHlQaGFzZXM6ICgpID0+IHtcbiAgICBnZW5lcmF0aW9uU3RhdGUgPSB7XG4gICAgICAuLi5nZW5lcmF0aW9uU3RhdGUsXG4gICAgICBkaXJ0eVBoYXNlczogICAgICAgW10sXG4gICAgICBlYXJsaWVzdERpcnR5U3RlcDogbnVsbCxcbiAgICB9O1xuICAgIHNhdmVTdGF0ZVRvTG9jYWxTdG9yYWdlKCk7XG4gICAgZW1pdEdlbmVyYXRpb25TdGF0ZUNoYW5nZWQoKTtcbiAgfSxcbiAgZ2V0RGlydHlQaGFzZXM6ICAgICAgICgpID0+IGdlbmVyYXRpb25TdGF0ZS5kaXJ0eVBoYXNlcyB8fCBbXSxcbiAgZ2V0RWFybGllc3REaXJ0eVN0ZXA6ICgpID0+IGdlbmVyYXRpb25TdGF0ZS5lYXJsaWVzdERpcnR5U3RlcCB8fCBudWxsLFxufTtcblxuLyoqXG4gKiBJbml0aWFsaXplIGZyZXNoIHN0YXRlIG9iamVjdCB3aXRoIGFsbCBkZWZhdWx0IHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gaW5pdGlhbGl6ZVN0YXRlKCkge1xuICBjdXJyZW50VGFiID0gJ2pvYic7XG4gIGlzTG9hZGluZyA9IGZhbHNlO1xuICB0YWJEYXRhID0ge1xuICAgIGFuYWx5c2lzOiBudWxsLFxuICAgIGN1c3RvbWl6YXRpb25zOiBudWxsLFxuICAgIGN2OiBudWxsXG4gIH07XG4gIGludGVyYWN0aXZlU3RhdGUgPSB7XG4gICAgaXNSZXZpZXdpbmc6IGZhbHNlLFxuICAgIGN1cnJlbnRJbmRleDogMCxcbiAgICB0eXBlOiBudWxsLFxuICAgIGRhdGE6IG51bGxcbiAgfTtcbiAgd2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucyA9IFtdO1xuICB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzID0ge307XG4gIGxhc3RLbm93blBoYXNlID0gUEhBU0VTLklOSVQ7XG4gIGdlbmVyYXRpb25TdGF0ZSA9IGNyZWF0ZURlZmF1bHRHZW5lcmF0aW9uU3RhdGUoKTtcblxuICAvLyBHZXQgb3IgZ2VuZXJhdGUgc2Vzc2lvbiBJRFxuICBsZXQgc3RvcmVkSWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShTdG9yYWdlS2V5cy5TRVNTSU9OX0lEKTtcbiAgaWYgKCFzdG9yZWRJZCkge1xuICAgIHN0b3JlZElkID0gZ2VuZXJhdGVTZXNzaW9uSWQoKTtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShTdG9yYWdlS2V5cy5TRVNTSU9OX0lELCBzdG9yZWRJZCk7XG4gIH1cbiAgc2Vzc2lvbklkID0gc3RvcmVkSWQ7XG5cbiAgc2F2ZVN0YXRlVG9Mb2NhbFN0b3JhZ2UoKTtcbiAgZW1pdEdlbmVyYXRpb25TdGF0ZUNoYW5nZWQoKTtcbn1cblxuLyoqXG4gKiBMb2FkIHN0YXRlIGZyb20gYnJvd3NlciBsb2NhbFN0b3JhZ2UuXG4gKi9cbmZ1bmN0aW9uIGxvYWRTdGF0ZUZyb21Mb2NhbFN0b3JhZ2UoKSB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2F2ZWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShTdG9yYWdlS2V5cy5UQUJfREFUQSk7XG4gICAgaWYgKCFzYXZlZCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2Uoc2F2ZWQpO1xuXG4gICAgLy8gT25seSByZXN0b3JlIGlmIGRhdGEgaXMgcmVjZW50ICh3aXRoaW4gMjQgaG91cnMpXG4gICAgY29uc3QgYWdlID0gRGF0ZS5ub3coKSAtIChkYXRhLnRpbWVzdGFtcCB8fCAwKTtcbiAgICBpZiAoYWdlID4gMjQgKiA2MCAqIDYwICogMTAwMCkge1xuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oU3RvcmFnZUtleXMuVEFCX0RBVEEpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFJlc3RvcmUgdGFiIGRhdGFcbiAgICBpZiAoZGF0YS50YWJEYXRhKSB7XG4gICAgICB0YWJEYXRhID0geyAuLi50YWJEYXRhLCAuLi5kYXRhLnRhYkRhdGEgfTtcbiAgICB9XG5cbiAgICBpZiAoZGF0YS5jdXJyZW50VGFiKSB7XG4gICAgICBjdXJyZW50VGFiID0gZGF0YS5jdXJyZW50VGFiO1xuICAgIH1cblxuICAgIC8vIFJlc3RvcmUgaW50ZXJhY3RpdmUgc3RhdGVcbiAgICBpZiAoZGF0YS5pbnRlcmFjdGl2ZVN0YXRlKSB7XG4gICAgICBpbnRlcmFjdGl2ZVN0YXRlID0geyAuLi5pbnRlcmFjdGl2ZVN0YXRlLCAuLi5kYXRhLmludGVyYWN0aXZlU3RhdGUgfTtcbiAgICB9XG5cbiAgICAvLyBSZXN0b3JlIHBlbmRpbmcgcmVjb21tZW5kYXRpb25zXG4gICAgaWYgKGRhdGEucGVuZGluZ1JlY29tbWVuZGF0aW9ucykge1xuICAgICAgd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnMgPSBkYXRhLnBlbmRpbmdSZWNvbW1lbmRhdGlvbnM7XG4gICAgfVxuXG4gICAgLy8gUmVzdG9yZSBzYXZlZCBtb2RlbC9wcm92aWRlciBzZWxlY3Rpb25cbiAgICBpZiAoZGF0YS5jdXJyZW50TW9kZWxQcm92aWRlcikge1xuICAgICAgY3VycmVudE1vZGVsUHJvdmlkZXIgPSBkYXRhLmN1cnJlbnRNb2RlbFByb3ZpZGVyO1xuICAgIH1cbiAgICBpZiAoZGF0YS5jdXJyZW50TW9kZWxOYW1lKSB7XG4gICAgICBjdXJyZW50TW9kZWxOYW1lID0gZGF0YS5jdXJyZW50TW9kZWxOYW1lO1xuICAgIH1cblxuICAgIC8vIFJlc3RvcmUgcG9zdC1hbmFseXNpcyBzdGF0ZVxuICAgIGlmIChkYXRhLnBvc3RBbmFseXNpc1F1ZXN0aW9ucykge1xuICAgICAgd2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucyA9IGRhdGEucG9zdEFuYWx5c2lzUXVlc3Rpb25zO1xuICAgIH1cbiAgICBpZiAoZGF0YS5xdWVzdGlvbkFuc3dlcnMpIHtcbiAgICAgIHdpbmRvdy5xdWVzdGlvbkFuc3dlcnMgPSBkYXRhLnF1ZXN0aW9uQW5zd2VycztcbiAgICB9XG5cbiAgICAvLyBSZXN0b3JlIHBoYXNlXG4gICAgaWYgKGRhdGEubGFzdEtub3duUGhhc2UpIHtcbiAgICAgIGxhc3RLbm93blBoYXNlID0gZGF0YS5sYXN0S25vd25QaGFzZTtcbiAgICB9XG5cbiAgICAvLyBSZXN0b3JlIHN0YWdlZCBnZW5lcmF0aW9uIHN0YXRlXG4gICAgaWYgKGRhdGEuZ2VuZXJhdGlvblN0YXRlKSB7XG4gICAgICBnZW5lcmF0aW9uU3RhdGUgPSB7IC4uLmdlbmVyYXRpb25TdGF0ZSwgLi4uZGF0YS5nZW5lcmF0aW9uU3RhdGUgfTtcbiAgICB9XG5cbiAgICAvLyBSZXN0b3JlIEFUUyBzY29yZVxuICAgIGlmIChkYXRhLmF0c1Njb3JlKSB7XG4gICAgICBhdHNTY29yZSA9IGRhdGEuYXRzU2NvcmU7XG4gICAgfVxuXG4gICAgZW1pdEdlbmVyYXRpb25TdGF0ZUNoYW5nZWQoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cud2FybignRmFpbGVkIHRvIGxvYWQgc3RhdGUgZnJvbSBsb2NhbFN0b3JhZ2U6JywgZXJyb3IpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFNhdmUgY3VycmVudCBzdGF0ZSB0byBicm93c2VyIGxvY2FsU3RvcmFnZS5cbiAqL1xuZnVuY3Rpb24gc2F2ZVN0YXRlVG9Mb2NhbFN0b3JhZ2UoKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgZGF0YVRvU2F2ZSA9IHtcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIHRhYkRhdGEsXG4gICAgICBpbnRlcmFjdGl2ZVN0YXRlLFxuICAgICAgcGVuZGluZ1JlY29tbWVuZGF0aW9uczogd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnMsXG4gICAgICBwb3N0QW5hbHlzaXNRdWVzdGlvbnM6IHdpbmRvdy5wb3N0QW5hbHlzaXNRdWVzdGlvbnMsXG4gICAgICBxdWVzdGlvbkFuc3dlcnM6IHdpbmRvdy5xdWVzdGlvbkFuc3dlcnMsXG4gICAgICBsYXN0S25vd25QaGFzZSxcbiAgICAgIGN1cnJlbnRUYWIsXG4gICAgICAvLyBQZXJzaXN0IGxhc3Qtc2VsZWN0ZWQgbW9kZWwvcHJvdmlkZXIgc28gVUkgc2VsZWN0aW9ucyBzdXJ2aXZlIHJlbG9hZHNcbiAgICAgIGN1cnJlbnRNb2RlbFByb3ZpZGVyLFxuICAgICAgY3VycmVudE1vZGVsTmFtZSxcbiAgICAgIGdlbmVyYXRpb25TdGF0ZSxcbiAgICAgIGF0c1Njb3JlLFxuICAgIH07XG5cbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShTdG9yYWdlS2V5cy5UQUJfREFUQSwgSlNPTi5zdHJpbmdpZnkoZGF0YVRvU2F2ZSkpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy53YXJuKCdGYWlsZWQgdG8gc2F2ZSBzdGF0ZSB0byBsb2NhbFN0b3JhZ2U6JywgZXJyb3IpO1xuICB9XG59XG5cbi8qKlxuICogQ2xlYXIgYWxsIHN0YXRlIChvbiBuZXcgc2Vzc2lvbiBvciByZXNldCBhY3Rpb24pLlxuICovXG5mdW5jdGlvbiBjbGVhclN0YXRlKCkge1xuICBpbml0aWFsaXplU3RhdGUoKTtcbiAgT2JqZWN0LnZhbHVlcyhTdG9yYWdlS2V5cykuZm9yRWFjaChrZXkgPT4gbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KSk7XG59XG5cbi8vIFRoZSBhdXRob3JpdGF0aXZlIHJlc3RvcmVTZXNzaW9uL3Jlc3RvcmVCYWNrZW5kU3RhdGUvbG9hZFNlc3Npb25GaWxlXG4vLyBpbXBsZW1lbnRhdGlvbnMgbGl2ZSBpbiBgd2ViL2FwcC5qc2AuIFJlbW92ZSBkdXBsaWNhdGUgaW1wbGVtZW50YXRpb25zXG4vLyBmcm9tIHRoaXMgbW9kdWxlIHRvIGF2b2lkIGNvbmZsaWN0aW5nIGJlaGF2aW9yIGFuZCBlbnN1cmUgYSBzaW5nbGVcbi8vIHJlc3RvcmUgcGF0aCBpcyB1c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbi5cblxuZXhwb3J0IHtcbiAgUEhBU0VTLFxuICBQSEFTRV9UT19TVEVQLFxuICBHRU5FUkFUSU9OX1BIQVNFUyxcbiAgR0VORVJBVElPTl9TVEFURV9FVkVOVCxcbiAgc3RhdGVNYW5hZ2VyLFxuICBnZXRXb3JrZmxvd1N0ZXBGb3JQaGFzZSxcbiAgaW5pdGlhbGl6ZVN0YXRlLCBsb2FkU3RhdGVGcm9tTG9jYWxTdG9yYWdlLCBzYXZlU3RhdGVUb0xvY2FsU3RvcmFnZSxcbiAgY2xlYXJTdGF0ZSxcbn07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9wcm92aWRlci1pbmZvLmpzIFx1MjAxNCBMTE0gcHJvdmlkZXIgZGlzcGxheSBtZXRhZGF0YSBjbGllbnQuXG4gKlxuICogUHJvdmlkZXIgZGF0YSBpcyBub3cgdGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggaW4gc2NyaXB0cy91dGlscy9wcm92aWRlcl9yZWdpc3RyeS5weVxuICogYW5kIHNlcnZlZCBieSBHRVQgL2FwaS9wcm92aWRlcnMuIFRoaXMgbW9kdWxlIGZldGNoZXMgYW5kIGNhY2hlcyB0aGF0IGRhdGEuXG4gKlxuICogQWxsIHByb3ZpZGVyIGRlc2NyaXB0aW9ucywgVVJMcywgYW5kIHRpZXIvcHJpdmFjeSBmbGFncyBzaG91bGQgYmUgZWRpdGVkIGluXG4gKiBwcm92aWRlcl9yZWdpc3RyeS5weSByYXRoZXIgdGhhbiBoZXJlLlxuICpcbiAqIFNlcnZlciBmaWVsZCBuYW1lcyAoc25ha2VfY2FzZSwgbWF0Y2hpbmcgUHl0aG9uKTpcbiAqICAgZnJlZV90aWVyICAgXHUyMDE0IHdoZXRoZXIgYSBuby1jb3N0IEFQSSBlbnRyeSB0aWVyIGlzIGF2YWlsYWJsZVxuICogICBjb25maWRlbnRpYWwgXHUyMDE0IHdoZXRoZXIgdGhlIHByb3ZpZGVyIGNvbW1pdHMgbm90IHRvIHRyYWluIG9uIEFQSSByZXF1ZXN0IGRhdGFcbiAqICAgbm90ZSAgICAgICAgXHUyMDE0IG9uZS1zZW50ZW5jZSBwbGFpbi10ZXh0IGRlc2NyaXB0aW9uXG4gKiAgIGhvbWVwYWdlICAgIFx1MjAxNCBwcm92aWRlciBsYW5kaW5nIHBhZ2UgVVJMIChudWxsIGlmIG5vdCBhcHBsaWNhYmxlKVxuICogICBwcmljaW5nX3VybCBcdTIwMTQgcHJpY2luZyAvIHBsYW5zIHBhZ2UgVVJMIChudWxsIGlmIG5vdCBhcHBsaWNhYmxlKVxuICogICBwcml2YWN5X3VybCBcdTIwMTQgcHJpdmFjeSBwb2xpY3kgb3IgZGF0YS11c2UgcG9saWN5IFVSTCAobnVsbCBpZiBub3QgYXBwbGljYWJsZSlcbiAqL1xuXG5pbXBvcnQgeyBlc2NhcGVIdG1sIH0gZnJvbSAnLi91dGlscy5qcyc7XG5cbi8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgb2JqZWN0PnxudWxsfSAqL1xubGV0IF9jYWNoZSA9IG51bGw7XG5cbi8qKlxuICogRmV0Y2ggcHJvdmlkZXIgZGlzcGxheSBtZXRhZGF0YSBmcm9tIHRoZSBzZXJ2ZXIgYW5kIGNhY2hlIGl0LlxuICogU2FmZSB0byBjYWxsIG11bHRpcGxlIHRpbWVzIFx1MjAxNCByZXR1cm5zIHRoZSBjYWNoZSBpZiBwb3B1bGF0ZWQsIHJldHJpZXMgaWZcbiAqIHRoZSBpbml0aWFsIGZldGNoIGZhaWxlZCAobm9uLWZhdGFsLCBwb3BvdmVycyB3aWxsIGp1c3Qgbm90IGFwcGVhcikuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBvYmplY3Q+fG51bGw+fVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFByb3ZpZGVySW5mbygpIHtcbiAgaWYgKF9jYWNoZSAhPT0gbnVsbCkgcmV0dXJuIF9jYWNoZTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2goJy9hcGkvcHJvdmlkZXJzJyk7XG4gICAgaWYgKHJlc3Aub2spIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwLmpzb24oKTtcbiAgICAgIF9jYWNoZSA9IGRhdGEucHJvdmlkZXJzIHx8IHt9O1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gTm9uLWZhdGFsOiBwb3BvdmVycyBzaW1wbHkgd29uJ3QgYXBwZWFyLlxuICB9XG4gIHJldHVybiBfY2FjaGU7XG59XG5cbi8qKlxuICogUmV0dXJuIGNhY2hlZCBkaXNwbGF5IGluZm8gZm9yIGEgcHJvdmlkZXIsIG9yIG51bGwgaWYgbm90IGxvYWRlZCAvIHVua25vd24uXG4gKiBDYWxsIGxvYWRQcm92aWRlckluZm8oKSBmaXJzdCAoZS5nLiBpbiBvcGVuTW9kZWxNb2RhbCkuXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvdmlkZXJcbiAqIEByZXR1cm5zIHtvYmplY3R8bnVsbH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFByb3ZpZGVySW5mbyhwcm92aWRlcikge1xuICByZXR1cm4gX2NhY2hlID8gKF9jYWNoZVtwcm92aWRlcl0gfHwgbnVsbCkgOiBudWxsO1xufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBIVE1MIGNvbnRlbnQgc3RyaW5nIGZvciBhIHByb3ZpZGVyIGluZm8gQm9vdHN0cmFwIDUgcG9wb3Zlci5cbiAqIFVzZXMgc25ha2VfY2FzZSBmaWVsZCBuYW1lcyBhcyByZXR1cm5lZCBieSBHRVQgL2FwaS9wcm92aWRlcnMuXG4gKiBAcGFyYW0ge29iamVjdH0gaW5mbyAtIFByb3ZpZGVyIGluZm8gZW50cnkgZnJvbSBnZXRQcm92aWRlckluZm8oKVxuICogQHJldHVybnMge3N0cmluZ30gSFRNTCBzdHJpbmcgKHNhZmUgdG8gcGFzcyB0byBCUzUgUG9wb3ZlciB3aXRoIHNhbml0aXplOmZhbHNlKVxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZXJJbmZvUG9wb3ZlckNvbnRlbnQoaW5mbykge1xuICBjb25zdCB0aWVySWNvbiAgPSBpbmZvLmZyZWVfdGllciAgICA/ICcmIzEwMDAzOyBGcmVlIHRpZXIgYXZhaWxhYmxlJyAgICA6ICcmIzEwMDA3OyBQYWlkIG9ubHkgKG5vIGZyZWUgQVBJIHRpZXIpJztcbiAgY29uc3QgcHJpdkljb24gID0gaW5mby5jb25maWRlbnRpYWwgPyAnJiMxMjgyNzQ7IERhdGEgY29uZmlkZW50aWFsJyAgICAgOiAnJiM5ODg4OyYjNjUwMzk7IERhdGEgbWF5IGJlIHJldmlld2VkL3JldGFpbmVkJztcbiAgY29uc3QgdGllckNvbG9yID0gaW5mby5mcmVlX3RpZXIgICAgPyAnIzA2NWY0NicgOiAnIzkyNDAwZSc7XG4gIGNvbnN0IHByaXZDb2xvciA9IGluZm8uY29uZmlkZW50aWFsID8gJyMxZTQwYWYnIDogJyM5MjQwMGUnO1xuXG4gIGNvbnN0IGxpbmtzID0gW1xuICAgIGluZm8uaG9tZXBhZ2UgICAgPyBgPGEgaHJlZj1cIiR7ZXNjYXBlSHRtbChpbmZvLmhvbWVwYWdlKX1cIiAgICB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCI+SG9tZXBhZ2U8L2E+YCAgICAgICAgICAgOiAnJyxcbiAgICBpbmZvLnByaWNpbmdfdXJsID8gYDxhIGhyZWY9XCIke2VzY2FwZUh0bWwoaW5mby5wcmljaW5nX3VybCl9XCIgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiPlByaWNpbmcgJmFtcDsgcGxhbnM8L2E+YCA6ICcnLFxuICAgIGluZm8ucHJpdmFjeV91cmwgPyBgPGEgaHJlZj1cIiR7ZXNjYXBlSHRtbChpbmZvLnByaXZhY3lfdXJsKX1cIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCI+UHJpdmFjeSBwb2xpY3k8L2E+YCAgICAgIDogJycsXG4gIF0uZmlsdGVyKEJvb2xlYW4pO1xuXG4gIHJldHVybiAnPGRpdiBzdHlsZT1cIm1pbi13aWR0aDoyMjBweDttYXgtd2lkdGg6MzAwcHg7Zm9udC1zaXplOjAuODJlbTtsaW5lLWhlaWdodDoxLjU7XCI+J1xuICAgICsgYDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjZweDtcIj48c3BhbiBzdHlsZT1cImNvbG9yOiR7dGllckNvbG9yfTtcIj4ke3RpZXJJY29ufTwvc3Bhbj48L2Rpdj5gXG4gICAgKyBgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206OHB4O1wiPjxzcGFuIHN0eWxlPVwiY29sb3I6JHtwcml2Q29sb3J9O1wiPiR7cHJpdkljb259PC9zcGFuPjwvZGl2PmBcbiAgICArIGA8cCBzdHlsZT1cIm1hcmdpbjowIDAgOHB4O2NvbG9yOiMzNzQxNTE7XCI+JHtlc2NhcGVIdG1sKGluZm8ubm90ZSl9PC9wPmBcbiAgICArIChsaW5rcy5sZW5ndGggPyAnPHVsIHN0eWxlPVwibWFyZ2luOjA7cGFkZGluZy1sZWZ0OjE2cHg7XCI+JyArIGxpbmtzLm1hcChsID0+IGA8bGk+JHtsfTwvbGk+YCkuam9pbignJykgKyAnPC91bD4nIDogJycpXG4gICAgKyAnPC9kaXY+Jztcbn1cbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogdWktY29yZS5qc1xuICogQ29yZSBVSSByb3V0aW5nLCB0YWIgbWFuYWdlbWVudCwgbW9kYWwgbWFuYWdlbWVudCwgYW5kIHBhZ2UgaW5pdGlhbGl6YXRpb24uXG4gKiBFbnRyeSBwb2ludCBmb3IgdGhlIGFwcGxpY2F0aW9uIC0gbG9hZHMgb24gRE9NQ29udGVudExvYWRlZC5cbiAqL1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5jb25zdCBsb2cgPSBnZXRMb2dnZXIoJ3VpLWNvcmUnKTtcblxuaW1wb3J0IHsgZXNjYXBlSHRtbCB9IGZyb20gJy4vdXRpbHMuanMnO1xuaW1wb3J0IHsgU3RvcmFnZUtleXMsIGFwaUNhbGwsIGZldGNoU3RhdHVzLCBmZXRjaFNldHRpbmdzLCB1cGRhdGVTZXR0aW5ncyB9IGZyb20gJy4vYXBpLWNsaWVudC5qcyc7XG5pbXBvcnQge1xuICBnZXRXb3JrZmxvd1N0ZXBGb3JQaGFzZSxcbiAgaW5pdGlhbGl6ZVN0YXRlLFxuICBsb2FkU3RhdGVGcm9tTG9jYWxTdG9yYWdlLFxuICBzdGF0ZU1hbmFnZXIsXG59IGZyb20gJy4vc3RhdGUtbWFuYWdlci5qcyc7XG5pbXBvcnQgeyBfU1RFUF9ESVNQTEFZIH0gZnJvbSAnLi93b3JrZmxvdy1zdGVwcy5qcyc7XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuLy8gQWNjZXNzaWJpbGl0eTogRm9jdXMgTWFuYWdlbWVudCBmb3IgTW9kYWxzXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLyoqIFN0YWNrIG9mIGVsZW1lbnRzIHRoYXQgb3BlbmVkIGVhY2ggbW9kYWwgKHN1cHBvcnRzIG5lc3RlZCBtb2RhbHMpLiAqL1xuY29uc3QgX2ZvY3VzU3RhY2sgPSBbXTtcblxuLyoqIFN0YWNrIG9mIGZvY3VzLXRyYXAgbGlzdGVuZXJzIChvbmUgcGVyIG9wZW4gbW9kYWwpLiAqL1xuY29uc3QgX2ZvY3VzVHJhcFN0YWNrID0gW107XG5sZXQgX3NldHRpbmdzRGF0YSA9IG51bGw7XG5jb25zdCBSRVRSWV9QT0xJQ1lfU1RPUkFHRV9LRVkgPSAnY3YtYnVpbGRlci1yZXRyeS1wb2xpY3knO1xuXG5mdW5jdGlvbiBfZ2V0UmV0cnlQb2xpY3lGcm9tU3RvcmFnZSgpIHtcbiAgY29uc3QgZGVmYXVsdHMgPSB7XG4gICAgYmFzZU1zOiAxNTAwLFxuICAgIGNhcE1zOiA2MDAwMCxcbiAgICBtYXhBdHRlbXB0czogNixcbiAgICBhdXRvUmV0cnk6IHRydWUsXG4gIH07XG4gIHRyeSB7XG4gICAgY29uc3QgcmF3ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oUkVUUllfUE9MSUNZX1NUT1JBR0VfS0VZKTtcbiAgICBpZiAoIXJhdykgcmV0dXJuIGRlZmF1bHRzO1xuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UocmF3KTtcbiAgICByZXR1cm4ge1xuICAgICAgYmFzZU1zOiBNYXRoLm1heCgyMDAsIE51bWJlcihwYXJzZWQuYmFzZU1zIHx8IGRlZmF1bHRzLmJhc2VNcykpLFxuICAgICAgY2FwTXM6IE1hdGgubWF4KDEwMDAsIE51bWJlcihwYXJzZWQuY2FwTXMgfHwgZGVmYXVsdHMuY2FwTXMpKSxcbiAgICAgIG1heEF0dGVtcHRzOiBNYXRoLm1heCgxLCBOdW1iZXIocGFyc2VkLm1heEF0dGVtcHRzIHx8IGRlZmF1bHRzLm1heEF0dGVtcHRzKSksXG4gICAgICBhdXRvUmV0cnk6IHBhcnNlZC5hdXRvUmV0cnkgIT09IGZhbHNlLFxuICAgIH07XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBkZWZhdWx0cztcbiAgfVxufVxuXG5mdW5jdGlvbiBfc2F2ZVJldHJ5UG9saWN5VG9TdG9yYWdlKHBvbGljeSkge1xuICB0cnkge1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFJFVFJZX1BPTElDWV9TVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkocG9saWN5KSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nLndhcm4oJ0NvdWxkIG5vdCBzYXZlIHJldHJ5IHBvbGljeSBwcmVmZXJlbmNlOicsIGVycm9yKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfc2V0dGluZ3NTb3VyY2VMYWJlbChtZXRhLCBrZXksIHJ1bnRpbWVPdmVycmlkZXMgPSBudWxsKSB7XG4gIGlmIChydW50aW1lT3ZlcnJpZGVzICYmIGtleSBpbiBydW50aW1lT3ZlcnJpZGVzKSB7XG4gICAgcmV0dXJuICdTb3VyY2U6IHJ1bnRpbWUgc2VsZWN0aW9uJztcbiAgfVxuICBjb25zdCBzb3VyY2UgPSBtZXRhPy5zb3VyY2VzPy5ba2V5XSB8fCAnZGVmYXVsdCc7XG4gIGNvbnN0IGVudktleSA9IG1ldGE/LmVudl9rZXlzPy5ba2V5XSB8fCBudWxsO1xuICBpZiAoc291cmNlID09PSAnZW52JykgcmV0dXJuIGBTb3VyY2U6IGVudmlyb25tZW50IHZhcmlhYmxlICgke2VudktleSB8fCAnbG9ja2VkJ30pYDtcbiAgaWYgKHNvdXJjZSA9PT0gJ2RvdGVudicpIHJldHVybiBgU291cmNlOiAuZW52ICgke2VudktleSB8fCAnbG9ja2VkJ30pYDtcbiAgaWYgKHNvdXJjZSA9PT0gJ2NvbmZpZycpIHJldHVybiAnU291cmNlOiBjb25maWcueWFtbCc7XG4gIHJldHVybiAnU291cmNlOiBidWlsdC1pbiBkZWZhdWx0Jztcbn1cblxuZnVuY3Rpb24gX3JlbmRlclNldHRpbmdzU291cmNlcyhtZXRhLCBydW50aW1lT3ZlcnJpZGVzID0gbnVsbCkge1xuICBjb25zdCBzb3VyY2VUYXJnZXRzID0gW1xuICAgICdsbG0uZGVmYXVsdF9wcm92aWRlcicsXG4gICAgJ2xsbS5kZWZhdWx0X21vZGVsJyxcbiAgICAnbGxtLnJlcXVlc3RfdGltZW91dF9zZWNvbmRzJyxcbiAgICAnbGxtLnRlbXBlcmF0dXJlJyxcbiAgICAnZ2VuZXJhdGlvbi5tYXhfc2tpbGxzJyxcbiAgICAnZ2VuZXJhdGlvbi5tYXhfYWNoaWV2ZW1lbnRzJyxcbiAgICAnZ2VuZXJhdGlvbi5tYXhfcHVibGljYXRpb25zJyxcbiAgICAnZ2VuZXJhdGlvbi5za2lsbHNfc2VjdGlvbl90aXRsZScsXG4gICAgJ2dlbmVyYXRpb24uZm9ybWF0cy5hdHNfZG9jeCcsXG4gICAgJ2dlbmVyYXRpb24uZm9ybWF0cy5odW1hbl9wZGYnLFxuICAgICdnZW5lcmF0aW9uLmZvcm1hdHMuaHVtYW5fZG9jeCcsXG4gIF07XG4gIHNvdXJjZVRhcmdldHMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc291cmNlLSR7a2V5fWApO1xuICAgIGlmICghZWwpIHJldHVybjtcbiAgICBlbC50ZXh0Q29udGVudCA9IF9zZXR0aW5nc1NvdXJjZUxhYmVsKG1ldGEsIGtleSwgcnVudGltZU92ZXJyaWRlcyk7XG4gICAgY29uc3QgcnVudGltZUtleSA9IHJ1bnRpbWVPdmVycmlkZXMgJiYga2V5IGluIHJ1bnRpbWVPdmVycmlkZXM7XG4gICAgY29uc3QgaXNMb2NrZWQgPSBCb29sZWFuKG1ldGE/LmxvY2tlZD8uW2tleV0pO1xuICAgIGVsLnN0eWxlLmNvbG9yID0gcnVudGltZUtleSA/ICcjMWU0MGFmJyA6IChpc0xvY2tlZCA/ICcjYjQ1MzA5JyA6ICcjNjQ3NDhiJyk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBfc2V0U2V0dGluZ3NTdGF0dXMobWVzc2FnZSwga2luZCA9ICdpbmZvJykge1xuICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR0aW5ncy1zdGF0dXMtbXNnJyk7XG4gIGlmICghZWwpIHJldHVybjtcbiAgZWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuICBpZiAoa2luZCA9PT0gJ3N1Y2Nlc3MnKSB7XG4gICAgZWwuc3R5bGUuYmFja2dyb3VuZCA9ICcjZWNmZGY1JztcbiAgICBlbC5zdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkICM4NmVmYWMnO1xuICAgIGVsLnN0eWxlLmNvbG9yID0gJyMxNjY1MzQnO1xuICB9IGVsc2UgaWYgKGtpbmQgPT09ICdlcnJvcicpIHtcbiAgICBlbC5zdHlsZS5iYWNrZ3JvdW5kID0gJyNmZWYyZjInO1xuICAgIGVsLnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgI2ZlY2FjYSc7XG4gICAgZWwuc3R5bGUuY29sb3IgPSAnIzk5MWIxYic7XG4gIH0gZWxzZSB7XG4gICAgZWwuc3R5bGUuYmFja2dyb3VuZCA9ICcjZWZmNmZmJztcbiAgICBlbC5zdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkICNiZmRiZmUnO1xuICAgIGVsLnN0eWxlLmNvbG9yID0gJyMxZTQwYWYnO1xuICB9XG4gIGVsLnRleHRDb250ZW50ID0gbWVzc2FnZTtcbn1cblxuZnVuY3Rpb24gX2NvbGxlY3RTZXR0aW5nc1BheWxvYWRGcm9tRm9ybSgpIHtcbiAgcmV0dXJuIHtcbiAgICBsbG06IHtcbiAgICAgIGRlZmF1bHRfcHJvdmlkZXI6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR0aW5ncy1sbG0tZGVmYXVsdC1wcm92aWRlcicpPy52YWx1ZT8udHJpbSgpIHx8IG51bGwsXG4gICAgICBkZWZhdWx0X21vZGVsOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dGluZ3MtbGxtLWRlZmF1bHQtbW9kZWwnKT8udmFsdWU/LnRyaW0oKSB8fCBudWxsLFxuICAgICAgcmVxdWVzdF90aW1lb3V0X3NlY29uZHM6IE51bWJlcihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dGluZ3MtbGxtLXJlcXVlc3QtdGltZW91dCcpPy52YWx1ZSB8fCAxMjApLFxuICAgICAgdGVtcGVyYXR1cmU6IE51bWJlcihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dGluZ3MtbGxtLXRlbXBlcmF0dXJlJyk/LnZhbHVlIHx8IDAuNyksXG4gICAgfSxcbiAgICBnZW5lcmF0aW9uOiB7XG4gICAgICBtYXhfc2tpbGxzOiBOdW1iZXIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHRpbmdzLWdlbi1tYXgtc2tpbGxzJyk/LnZhbHVlIHx8IDIwKSxcbiAgICAgIG1heF9hY2hpZXZlbWVudHM6IE51bWJlcihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dGluZ3MtZ2VuLW1heC1hY2hpZXZlbWVudHMnKT8udmFsdWUgfHwgNSksXG4gICAgICBtYXhfcHVibGljYXRpb25zOiBOdW1iZXIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHRpbmdzLWdlbi1tYXgtcHVibGljYXRpb25zJyk/LnZhbHVlIHx8IDEwKSxcbiAgICAgIHNraWxsc19zZWN0aW9uX3RpdGxlOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dGluZ3MtZ2VuLXNraWxscy10aXRsZScpPy52YWx1ZT8udHJpbSgpIHx8ICdTa2lsbHMnLFxuICAgICAgZm9ybWF0czoge1xuICAgICAgICBhdHNfZG9jeDogQm9vbGVhbihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dGluZ3MtZm9ybWF0LWF0cy1kb2N4Jyk/LmNoZWNrZWQpLFxuICAgICAgICBodW1hbl9wZGY6IEJvb2xlYW4oZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHRpbmdzLWZvcm1hdC1odW1hbi1wZGYnKT8uY2hlY2tlZCksXG4gICAgICAgIGh1bWFuX2RvY3g6IEJvb2xlYW4oZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHRpbmdzLWZvcm1hdC1odW1hbi1kb2N4Jyk/LmNoZWNrZWQpLFxuICAgICAgfSxcbiAgICAgIGFpX2F0dHJpYnV0aW9uOiBCb29sZWFuKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR0aW5ncy1nZW4tYWktYXR0cmlidXRpb24nKT8uY2hlY2tlZCksXG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gX2NvbGxlY3RSZXRyeVBvbGljeUZyb21Gb3JtKCkge1xuICByZXR1cm4ge1xuICAgIGJhc2VNczogTnVtYmVyKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR0aW5ncy1yZXRyeS1iYXNlLW1zJyk/LnZhbHVlIHx8IDE1MDApLFxuICAgIGNhcE1zOiBOdW1iZXIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHRpbmdzLXJldHJ5LWNhcC1tcycpPy52YWx1ZSB8fCA2MDAwMCksXG4gICAgbWF4QXR0ZW1wdHM6IE51bWJlcihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dGluZ3MtcmV0cnktbWF4LWF0dGVtcHRzJyk/LnZhbHVlIHx8IDYpLFxuICAgIGF1dG9SZXRyeTogQm9vbGVhbihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dGluZ3MtcmV0cnktYXV0bycpPy5jaGVja2VkKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gX3JlbmRlclNldHRpbmdzVG9Gb3JtKHBheWxvYWQpIHtcbiAgY29uc3Qgc2V0dGluZ3MgPSBwYXlsb2FkPy5zZXR0aW5ncyB8fCB7fTtcbiAgY29uc3QgbGxtID0gc2V0dGluZ3MubGxtIHx8IHt9O1xuICBjb25zdCBnZW5lcmF0aW9uID0gc2V0dGluZ3MuZ2VuZXJhdGlvbiB8fCB7fTtcbiAgY29uc3QgZm9ybWF0cyA9IGdlbmVyYXRpb24uZm9ybWF0cyB8fCB7fTtcbiAgY29uc3QgcnVudGltZVByb3ZpZGVyID0gcGF5bG9hZD8ucnVudGltZT8ubGxtPy5wcm92aWRlciB8fCBudWxsO1xuICBjb25zdCBydW50aW1lTW9kZWwgPSBwYXlsb2FkPy5ydW50aW1lPy5sbG0/Lm1vZGVsIHx8IG51bGw7XG4gIGNvbnN0IHJ1bnRpbWVPdmVycmlkZXMgPSB7fTtcbiAgaWYgKHJ1bnRpbWVQcm92aWRlcikgcnVudGltZU92ZXJyaWRlc1snbGxtLmRlZmF1bHRfcHJvdmlkZXInXSA9IHJ1bnRpbWVQcm92aWRlcjtcbiAgaWYgKHJ1bnRpbWVNb2RlbCkgcnVudGltZU92ZXJyaWRlc1snbGxtLmRlZmF1bHRfbW9kZWwnXSA9IHJ1bnRpbWVNb2RlbDtcblxuICBjb25zdCBzZXRWYWx1ZSA9IChpZCwgdmFsdWUpID0+IHtcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICBpZiAoZWwpIGVsLnZhbHVlID0gdmFsdWUgPz8gJyc7XG4gIH07XG4gIGNvbnN0IHNldENoZWNrZWQgPSAoaWQsIHZhbHVlKSA9PiB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgaWYgKGVsKSBlbC5jaGVja2VkID0gQm9vbGVhbih2YWx1ZSk7XG4gIH07XG5cbiAgc2V0VmFsdWUoJ3NldHRpbmdzLWxsbS1kZWZhdWx0LXByb3ZpZGVyJywgcnVudGltZVByb3ZpZGVyIHx8IGxsbS5kZWZhdWx0X3Byb3ZpZGVyIHx8ICcnKTtcbiAgc2V0VmFsdWUoJ3NldHRpbmdzLWxsbS1kZWZhdWx0LW1vZGVsJywgcnVudGltZU1vZGVsIHx8IGxsbS5kZWZhdWx0X21vZGVsIHx8ICcnKTtcbiAgc2V0VmFsdWUoJ3NldHRpbmdzLWxsbS1yZXF1ZXN0LXRpbWVvdXQnLCBsbG0ucmVxdWVzdF90aW1lb3V0X3NlY29uZHMgPz8gMTIwKTtcbiAgc2V0VmFsdWUoJ3NldHRpbmdzLWxsbS10ZW1wZXJhdHVyZScsIGxsbS50ZW1wZXJhdHVyZSA/PyAwLjcpO1xuXG4gIHNldFZhbHVlKCdzZXR0aW5ncy1nZW4tbWF4LXNraWxscycsIGdlbmVyYXRpb24ubWF4X3NraWxscyA/PyAyMCk7XG4gIHNldFZhbHVlKCdzZXR0aW5ncy1nZW4tbWF4LWFjaGlldmVtZW50cycsIGdlbmVyYXRpb24ubWF4X2FjaGlldmVtZW50cyA/PyA1KTtcbiAgc2V0VmFsdWUoJ3NldHRpbmdzLWdlbi1tYXgtcHVibGljYXRpb25zJywgZ2VuZXJhdGlvbi5tYXhfcHVibGljYXRpb25zID8/IDEwKTtcbiAgc2V0VmFsdWUoJ3NldHRpbmdzLWdlbi1za2lsbHMtdGl0bGUnLCBnZW5lcmF0aW9uLnNraWxsc19zZWN0aW9uX3RpdGxlIHx8ICdTa2lsbHMnKTtcblxuICBzZXRDaGVja2VkKCdzZXR0aW5ncy1mb3JtYXQtYXRzLWRvY3gnLCBmb3JtYXRzLmF0c19kb2N4KTtcbiAgc2V0Q2hlY2tlZCgnc2V0dGluZ3MtZm9ybWF0LWh1bWFuLXBkZicsIGZvcm1hdHMuaHVtYW5fcGRmKTtcbiAgc2V0Q2hlY2tlZCgnc2V0dGluZ3MtZm9ybWF0LWh1bWFuLWRvY3gnLCBmb3JtYXRzLmh1bWFuX2RvY3gpO1xuICBzZXRDaGVja2VkKCdzZXR0aW5ncy1nZW4tYWktYXR0cmlidXRpb24nLCBnZW5lcmF0aW9uLmFpX2F0dHJpYnV0aW9uKTtcblxuICBjb25zdCByZXRyeVBvbGljeSA9IF9nZXRSZXRyeVBvbGljeUZyb21TdG9yYWdlKCk7XG4gIHNldFZhbHVlKCdzZXR0aW5ncy1yZXRyeS1iYXNlLW1zJywgcmV0cnlQb2xpY3kuYmFzZU1zKTtcbiAgc2V0VmFsdWUoJ3NldHRpbmdzLXJldHJ5LWNhcC1tcycsIHJldHJ5UG9saWN5LmNhcE1zKTtcbiAgc2V0VmFsdWUoJ3NldHRpbmdzLXJldHJ5LW1heC1hdHRlbXB0cycsIHJldHJ5UG9saWN5Lm1heEF0dGVtcHRzKTtcbiAgc2V0Q2hlY2tlZCgnc2V0dGluZ3MtcmV0cnktYXV0bycsIHJldHJ5UG9saWN5LmF1dG9SZXRyeSk7XG5cbiAgX3JlbmRlclNldHRpbmdzU291cmNlcyhwYXlsb2FkLm1ldGEgfHwge30sIHJ1bnRpbWVPdmVycmlkZXMpO1xuXG4gIGNvbnN0IHBhdGhFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR0aW5ncy1jb25maWctcGF0aCcpO1xuICBpZiAocGF0aEVsKSB7XG4gICAgcGF0aEVsLnRleHRDb250ZW50ID0gcGF5bG9hZD8ubWV0YT8uY29uZmlnX3BhdGhcbiAgICAgID8gYENvbmZpZyBmaWxlOiAke3BheWxvYWQubWV0YS5jb25maWdfcGF0aH1gXG4gICAgICA6ICcnO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbG9hZFNldHRpbmdzTW9kYWwoKSB7XG4gIHRyeSB7XG4gICAgX3NldFNldHRpbmdzU3RhdHVzKCdMb2FkaW5nIHNldHRpbmdzLi4uJywgJ2luZm8nKTtcbiAgICBjb25zdCBbcmVzdWx0LCBzdGF0dXNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW2ZldGNoU2V0dGluZ3MoKSwgZmV0Y2hTdGF0dXMoKS5jYXRjaCgoKSA9PiBudWxsKV0pO1xuICAgIF9yZW5kZXJTZXR0aW5nc1RvRm9ybShyZXN1bHQpO1xuICAgIC8vIGFpX2F0dHJpYnV0aW9uIGlzIHBlci1zZXNzaW9uLCBub3QgaW4gY29uZmlnLnlhbWwgXHUyMDE0IHJlYWQgZnJvbSBzZXNzaW9uIHN0YXR1c1xuICAgIGNvbnN0IGF0dHJFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR0aW5ncy1nZW4tYWktYXR0cmlidXRpb24nKTtcbiAgICBpZiAoYXR0ckVsICYmIHN0YXR1cykgYXR0ckVsLmNoZWNrZWQgPSBCb29sZWFuKHN0YXR1cy5haV9hdHRyaWJ1dGlvbik7XG4gICAgX3NldFNldHRpbmdzU3RhdHVzKCdTZXR0aW5ncyBsb2FkZWQuJywgJ3N1Y2Nlc3MnKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBfc2V0U2V0dGluZ3NTdGF0dXMoYEZhaWxlZCB0byBsb2FkIHNldHRpbmdzOiAke2Vycm9yLm1lc3NhZ2UgfHwgZXJyb3J9YCwgJ2Vycm9yJyk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZVNldHRpbmdzTW9kYWwoKSB7XG4gIGNvbnN0IHNhdmVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dGluZ3Mtc2F2ZS1idG4nKTtcbiAgdHJ5IHtcbiAgICBpZiAoc2F2ZUJ0bikge1xuICAgICAgc2F2ZUJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICBzYXZlQnRuLnRleHRDb250ZW50ID0gJ1NhdmluZy4uLic7XG4gICAgfVxuICAgIF9zZXRTZXR0aW5nc1N0YXR1cygnU2F2aW5nIHNldHRpbmdzLi4uJywgJ2luZm8nKTtcbiAgICBjb25zdCBwYXlsb2FkID0gX2NvbGxlY3RTZXR0aW5nc1BheWxvYWRGcm9tRm9ybSgpO1xuICAgIGNvbnN0IGFpQXR0cmlidXRpb24gPSBCb29sZWFuKHBheWxvYWQuZ2VuZXJhdGlvbj8uYWlfYXR0cmlidXRpb24pO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHVwZGF0ZVNldHRpbmdzKHBheWxvYWQpO1xuICAgIF9zYXZlUmV0cnlQb2xpY3lUb1N0b3JhZ2UoX2NvbGxlY3RSZXRyeVBvbGljeUZyb21Gb3JtKCkpO1xuICAgIF9zZXR0aW5nc0RhdGEgPSByZXN1bHQ7XG4gICAgX3JlbmRlclNldHRpbmdzVG9Gb3JtKHJlc3VsdCk7XG4gICAgLy8gYWlfYXR0cmlidXRpb24gaXMgcGVyLXNlc3Npb24gc3RhdGUsIG5vdCBhIGNvbmZpZy55YW1sIGtleSBcdTIwMTQgc2F2ZSBpdCBzZXBhcmF0ZWx5XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGFwaUNhbGwoJ1BPU1QnLCAnL2FwaS9nZW5lcmF0aW9uLXNldHRpbmdzJywgeyBhaV9hdHRyaWJ1dGlvbjogYWlBdHRyaWJ1dGlvbiB9KTtcbiAgICB9IGNhdGNoIChfKSB7IC8qIG5vbi1mYXRhbCAqLyB9XG4gICAgX3NldFNldHRpbmdzU3RhdHVzKCdTZXR0aW5ncyBzYXZlZCBzdWNjZXNzZnVsbHkuJywgJ3N1Y2Nlc3MnKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBfc2V0U2V0dGluZ3NTdGF0dXMoYEZhaWxlZCB0byBzYXZlIHNldHRpbmdzOiAke2Vycm9yLm1lc3NhZ2UgfHwgZXJyb3J9YCwgJ2Vycm9yJyk7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKHNhdmVCdG4pIHtcbiAgICAgIHNhdmVCdG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIHNhdmVCdG4udGV4dENvbnRlbnQgPSAnU2F2ZSBTZXR0aW5ncyc7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG9wZW5TZXR0aW5nc01vZGFsKCkge1xuICBjb25zdCBvdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHRpbmdzLW1vZGFsLW92ZXJsYXknKTtcbiAgaWYgKCFvdmVybGF5KSByZXR1cm47XG4gIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgX2ZvY3VzU3RhY2sucHVzaChkb2N1bWVudC5hY3RpdmVFbGVtZW50KTtcbiAgc2V0SW5pdGlhbEZvY3VzKCdzZXR0aW5ncy1tb2RhbC1vdmVybGF5Jyk7XG4gIHRyYXBGb2N1cygnc2V0dGluZ3MtbW9kYWwtb3ZlcmxheScpO1xuICBhd2FpdCByZWxvYWRTZXR0aW5nc01vZGFsKCk7XG59XG5cbmZ1bmN0aW9uIGNsb3NlU2V0dGluZ3NNb2RhbCgpIHtcbiAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR0aW5ncy1tb2RhbC1vdmVybGF5Jyk7XG4gIGlmIChvdmVybGF5KSBvdmVybGF5LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHJlc3RvcmVGb2N1cygpO1xufVxuXG4vKipcbiAqIEdldCBhbGwgZm9jdXNhYmxlIGVsZW1lbnRzIHdpdGhpbiBhIGNvbnRhaW5lci5cbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGNvbnRhaW5lciAtIFRoZSBtb2RhbCBvciBjb250YWluZXIgZWxlbWVudFxuICogQHJldHVybnMge0hUTUxFbGVtZW50W119IEFycmF5IG9mIGZvY3VzYWJsZSBlbGVtZW50c1xuICovXG5mdW5jdGlvbiBnZXRGb2N1c2FibGVFbGVtZW50cyhjb250YWluZXIpIHtcbiAgY29uc3QgZm9jdXNhYmxlU2VsZWN0b3JzID0gW1xuICAgICdhW2hyZWZdJywgJ2J1dHRvbjpub3QoW2Rpc2FibGVkXSknLCAnaW5wdXQ6bm90KFtkaXNhYmxlZF0pJyxcbiAgICAndGV4dGFyZWE6bm90KFtkaXNhYmxlZF0pJywgJ3NlbGVjdDpub3QoW2Rpc2FibGVkXSknLFxuICAgICdbdGFiaW5kZXhdOm5vdChbdGFiaW5kZXg9XCItMVwiXSknLFxuICBdLmpvaW4oJywgJyk7XG4gIHJldHVybiBBcnJheS5mcm9tKGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKGZvY3VzYWJsZVNlbGVjdG9ycykpO1xufVxuXG4vKipcbiAqIFNldCBpbml0aWFsIGZvY3VzIHRvIHRoZSBmaXJzdCBmb2N1c2FibGUgZWxlbWVudCBpbiBhIG1vZGFsLlxuICogUHJpb3JpdGl6ZXMgZWxlbWVudHMgd2l0aCBpZD1cIlttb2RhbElkXS1mb2N1cy10YXJnZXRcIiBpZiBwcmVzZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGFsSWQgLSBJRCBvZiB0aGUgbW9kYWxcbiAqL1xuZnVuY3Rpb24gc2V0SW5pdGlhbEZvY3VzKG1vZGFsSWQpIHtcbiAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChtb2RhbElkKTtcbiAgaWYgKCFtb2RhbCkgcmV0dXJuO1xuXG4gIC8vIFRyeSB0byBmb2N1cyBhbiBleHBsaWNpdCB0YXJnZXQgKGUuZy4sIGlucHV0IGZpZWxkIHdpdGggY2xhc3MvaWQpXG4gIGNvbnN0IGZvY3VzVGFyZ2V0ID0gbW9kYWwucXVlcnlTZWxlY3RvcignW2RhdGEtZm9jdXMtdGFyZ2V0PVwidHJ1ZVwiXScpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgbW9kYWwucXVlcnlTZWxlY3RvcignaW5wdXRbdHlwZT1cInRleHRcIl0nKSB8fFxuICAgICAgICAgICAgICAgICAgICAgIG1vZGFsLnF1ZXJ5U2VsZWN0b3IoJ2J1dHRvbicpO1xuXG4gIGlmIChmb2N1c1RhcmdldCkge1xuICAgIC8vIFNtYWxsIGRlbGF5IHRvIGVuc3VyZSBtb2RhbCByZW5kZXIgKyBhY3R1YWwgZGlzcGxheVxuICAgIHNldFRpbWVvdXQoKCkgPT4gZm9jdXNUYXJnZXQuZm9jdXMoKSwgNTApO1xuICB9XG59XG5cbi8qKlxuICogVHJhcCBmb2N1cyB3aXRoaW4gYSBtb2RhbCB1c2luZyBUYWIvU2hpZnQrVGFiLlxuICogUHJldmVudHMgdXNlciB0YWJiaW5nIHRvIGVsZW1lbnRzIG91dHNpZGUgdGhlIG1vZGFsLlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGFsSWQgLSBJRCBvZiB0aGUgbW9kYWxcbiAqL1xuZnVuY3Rpb24gdHJhcEZvY3VzKG1vZGFsSWQpIHtcbiAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChtb2RhbElkKTtcbiAgaWYgKCFtb2RhbCkgcmV0dXJuO1xuXG4gIGNvbnN0IGZvY3VzYWJsZUVsZW1lbnRzID0gZ2V0Rm9jdXNhYmxlRWxlbWVudHMobW9kYWwpO1xuICBpZiAoZm9jdXNhYmxlRWxlbWVudHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgY29uc3QgZmlyc3RFbGVtZW50ID0gZm9jdXNhYmxlRWxlbWVudHNbMF07XG4gIGNvbnN0IGxhc3RFbGVtZW50ID0gZm9jdXNhYmxlRWxlbWVudHNbZm9jdXNhYmxlRWxlbWVudHMubGVuZ3RoIC0gMV07XG5cbiAgY29uc3QgbGlzdGVuZXIgPSAoZSkgPT4ge1xuICAgIGlmIChlLmtleSAhPT0gJ1RhYicpIHJldHVybjtcblxuICAgIGNvbnN0IGlzU2hpZnQgPSBlLnNoaWZ0S2V5O1xuICAgIGNvbnN0IGFjdGl2ZUVsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcblxuICAgIGlmIChpc1NoaWZ0KSB7XG4gICAgICBpZiAoYWN0aXZlRWwgPT09IGZpcnN0RWxlbWVudCkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGxhc3RFbGVtZW50LmZvY3VzKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChhY3RpdmVFbCA9PT0gbGFzdEVsZW1lbnQpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBmaXJzdEVsZW1lbnQuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGxpc3RlbmVyKTtcbiAgX2ZvY3VzVHJhcFN0YWNrLnB1c2gobGlzdGVuZXIpO1xufVxuXG4vKipcbiAqIFJlc3RvcmUgZm9jdXMgdG8gdGhlIGVsZW1lbnQgdGhhdCBvcGVuZWQgdGhlIG1vZGFsLlxuICovXG5mdW5jdGlvbiByZXN0b3JlRm9jdXMoKSB7XG4gIGNvbnN0IGVsID0gX2ZvY3VzU3RhY2sucG9wKCk7XG4gIGlmIChlbCAmJiB0eXBlb2YgZWwuZm9jdXMgPT09ICdmdW5jdGlvbicpIGVsLmZvY3VzKCk7XG5cbiAgY29uc3QgbGlzdGVuZXIgPSBfZm9jdXNUcmFwU3RhY2sucG9wKCk7XG4gIGlmIChsaXN0ZW5lcikgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGxpc3RlbmVyKTtcbn1cblxuZnVuY3Rpb24gcHVzaEZvY3VzU3RhY2soZWwpIHtcbiAgX2ZvY3VzU3RhY2sucHVzaChlbCB8fCBkb2N1bWVudC5hY3RpdmVFbGVtZW50KTtcbn1cblxuLyoqIE1hcHMgZWFjaCB3b3JrZmxvdyBzdGFnZSAodG9wIGJhcikgdG8gdGhlIHRhYnMgc2hvd24gaW4gdGhlIHNlY29uZCBuYXYgYmFyLiAqL1xuY29uc3QgU1RBR0VfVEFCUyA9IHtcbiAgam9iOiAgICAgICAgICAgIFsnam9iJywgJ21hc3RlciddLFxuICBhbmFseXNpczogICAgICAgWydhbmFseXNpcyddLFxuICBjdXN0b21pemF0aW9uczogWydnb2FscycsICdxdWVzdGlvbnMnLCAnZXhwLXJldmlldycsICdhY2gtZWRpdG9yJywgJ3NraWxscy1yZXZpZXcnLCAnYWNoaWV2ZW1lbnRzLXJldmlldycsICd0YWdsaW5lLXJldmlldycsICdzdW1tYXJ5LXJldmlldycsICdwdWJsaWNhdGlvbnMtcmV2aWV3JywgJ2F0cy1zY29yZSddLFxuICByZXdyaXRlOiAgICAgICAgWydyZXdyaXRlJ10sXG4gIHNwZWxsOiAgICAgICAgICBbJ3NwZWxsJ10sXG4gIGxheW91dDogICAgICAgICBbJ2xheW91dCddLFxuICBkb3dubG9hZDogICAgICAgWydmaW5hbF9nZW5lcmF0ZScsICdkb3dubG9hZCddLFxuICBjb3Zlcl9sZXR0ZXI6ICAgWydjb3Zlci1sZXR0ZXInXSxcbiAgc2NyZWVuaW5nOiAgICAgIFsnc2NyZWVuaW5nJ10sXG4gIGludGVydmlld19wcmVwOiBbJ2ludGVydmlldy1wcmVwJ10sXG4gIHRoYW5rX3lvdTogICAgICBbJ3RoYW5rLXlvdSddLFxuICBoYXJ2ZXN0OiAgICAgICAgWydoYXJ2ZXN0J10sXG59O1xuXG4vKipcbiAqIEN1c3RvbSBjb25maXJtIGRpYWxvZyBcdTIwMTQgcmV0dXJucyBhIFByb21pc2U8Ym9vbGVhbj4uXG4gKiBSZXBsYWNlcyBicm93c2VyIGNvbmZpcm0oKSB3aGljaCBjYW4gYmUgc2lsZW50bHkgc3VwcHJlc3NlZCBvbmNlIHRoZSB1c2VyXG4gKiBjaGVja3MgXCJQcmV2ZW50IHRoaXMgcGFnZSBmcm9tIGNyZWF0aW5nIGFkZGl0aW9uYWwgZGlhbG9nc1wiLlxuICpcbiAqIFVzYWdlOiAgaWYgKGF3YWl0IGNvbmZpcm1EaWFsb2coJ0FyZSB5b3Ugc3VyZT8nKSkgeyAuLi4gfVxuICovXG5mdW5jdGlvbiBjb25maXJtRGlhbG9nKG1lc3NhZ2UsIHsgY29uZmlybUxhYmVsID0gJ09LJywgY2FuY2VsTGFiZWwgPSAnQ2FuY2VsJywgZGFuZ2VyID0gZmFsc2UgfSA9IHt9KSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICBjb25zdCBwcmV2aW91c0ZvY3VzID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcblxuICAgIC8vIFJldXNlIG9yIGNyZWF0ZSB0aGUgc2hhcmVkIG92ZXJsYXkgZWxlbWVudFxuICAgIGxldCBvdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbmZpcm0tZGlhbG9nLW92ZXJsYXknKTtcbiAgICBpZiAoIW92ZXJsYXkpIHtcbiAgICAgIG92ZXJsYXkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIG92ZXJsYXkuaWQgPSAnY29uZmlybS1kaWFsb2ctb3ZlcmxheSc7XG4gICAgICBvdmVybGF5LnN0eWxlLmNzc1RleHQgPVxuICAgICAgICAnZGlzcGxheTpub25lOyBwb3NpdGlvbjpmaXhlZDsgaW5zZXQ6MDsgYmFja2dyb3VuZDpyZ2JhKDAsMCwwLDAuNDUpOyB6LWluZGV4Ojk5OTk7JyArXG4gICAgICAgICdhbGlnbi1pdGVtczpjZW50ZXI7IGp1c3RpZnktY29udGVudDpjZW50ZXI7JztcbiAgICAgIG92ZXJsYXkuaW5uZXJIVE1MID1cbiAgICAgICAgJzxkaXYgaWQ9XCJjb25maXJtLWRpYWxvZy1ib3hcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1tb2RhbD1cInRydWVcIicgK1xuICAgICAgICAnIGFyaWEtbGFiZWxsZWRieT1cImNvbmZpcm0tZGlhbG9nLW1zZ1wiJyArXG4gICAgICAgICcgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZmY7IGJvcmRlci1yYWRpdXM6OHB4OyBwYWRkaW5nOjI0cHggMjhweDsnICtcbiAgICAgICAgJ21heC13aWR0aDo0MDBweDsgd2lkdGg6OTAlOyBib3gtc2hhZG93OjAgOHB4IDMycHggcmdiYSgwLDAsMCwwLjE4KTsgZm9udC1mYW1pbHk6aW5oZXJpdDtcIj4nICtcbiAgICAgICAgJzxwIGlkPVwiY29uZmlybS1kaWFsb2ctbXNnXCIgc3R5bGU9XCJtYXJnaW46MCAwIDIwcHg7IGZvbnQtc2l6ZTowLjk1ZW07IGNvbG9yOiMxZTI5M2I7IHdoaXRlLXNwYWNlOnByZS13cmFwO1wiPjwvcD4nICtcbiAgICAgICAgJzxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7IGdhcDo4cHg7IGp1c3RpZnktY29udGVudDpmbGV4LWVuZDtcIj4nICtcbiAgICAgICAgJzxidXR0b24gaWQ9XCJjb25maXJtLWRpYWxvZy1jYW5jZWxcIiBzdHlsZT1cInBhZGRpbmc6NnB4IDE2cHg7IGJvcmRlcjoxcHggc29saWQgI2NiZDVlMTsnICtcbiAgICAgICAgJ2JvcmRlci1yYWRpdXM6NXB4OyBiYWNrZ3JvdW5kOiNmOGZhZmM7IGN1cnNvcjpwb2ludGVyOyBjb2xvcjojNDc1NTY5O1wiPjwvYnV0dG9uPicgK1xuICAgICAgICAnPGJ1dHRvbiBpZD1cImNvbmZpcm0tZGlhbG9nLW9rXCIgc3R5bGU9XCJwYWRkaW5nOjZweCAxNnB4OyBib3JkZXI6bm9uZTsnICtcbiAgICAgICAgJ2JvcmRlci1yYWRpdXM6NXB4OyBjdXJzb3I6cG9pbnRlcjsgY29sb3I6I2ZmZjsgZm9udC13ZWlnaHQ6NjAwO1wiPjwvYnV0dG9uPicgK1xuICAgICAgICAnPC9kaXY+PC9kaXY+JztcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQob3ZlcmxheSk7XG4gICAgfVxuXG4gICAgY29uc3Qgb2tCdG4gICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbmZpcm0tZGlhbG9nLW9rJyk7XG4gICAgY29uc3QgY2FuY2VsQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbmZpcm0tZGlhbG9nLWNhbmNlbCcpO1xuICAgIGNvbnN0IG1zZ0VsICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb25maXJtLWRpYWxvZy1tc2cnKTtcblxuICAgIG1zZ0VsLnRleHRDb250ZW50ICAgICAgICAgID0gbWVzc2FnZTtcbiAgICBva0J0bi50ZXh0Q29udGVudCAgICAgICAgICA9IGNvbmZpcm1MYWJlbDtcbiAgICBjYW5jZWxCdG4udGV4dENvbnRlbnQgICAgICA9IGNhbmNlbExhYmVsO1xuICAgIG9rQnRuLnN0eWxlLmJhY2tncm91bmQgICAgID0gZGFuZ2VyID8gJyNkYzI2MjYnIDogJyMzYjgyZjYnO1xuXG4gICAgb3ZlcmxheS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICAgIG9rQnRuLmZvY3VzKCk7XG5cbiAgICAvLyBGb2N1cyB0cmFwIFx1MjAxNCBrZWVwIFRhYi9TaGlmdCtUYWIgaW5zaWRlIHRoZSB0d28gYnV0dG9uc1xuICAgIGNvbnN0IHRyYXBGb2N1cyA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5rZXkgIT09ICdUYWInKSByZXR1cm47XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBjb25zdCBmb2N1c2VkID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICAgIGlmIChlLnNoaWZ0S2V5KSB7XG4gICAgICAgIChmb2N1c2VkID09PSBjYW5jZWxCdG4gPyBva0J0biA6IGNhbmNlbEJ0bikuZm9jdXMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIChmb2N1c2VkID09PSBva0J0biA/IGNhbmNlbEJ0biA6IG9rQnRuKS5mb2N1cygpO1xuICAgICAgfVxuICAgIH07XG4gICAgb3ZlcmxheS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdHJhcEZvY3VzKTtcblxuICAgIGNvbnN0IGZpbmlzaCA9IChyZXN1bHQpID0+IHtcbiAgICAgIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIG92ZXJsYXkucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRyYXBGb2N1cyk7XG4gICAgICAvLyBSZW1vdmUgbGlzdGVuZXJzIHRvIGF2b2lkIHN0YWNraW5nIGhhbmRsZXJzXG4gICAgICBva0J0bi5yZXBsYWNlV2l0aChva0J0bi5jbG9uZU5vZGUodHJ1ZSkpO1xuICAgICAgY2FuY2VsQnRuLnJlcGxhY2VXaXRoKGNhbmNlbEJ0bi5jbG9uZU5vZGUodHJ1ZSkpO1xuICAgICAgaWYgKHByZXZpb3VzRm9jdXMgJiYgdHlwZW9mIHByZXZpb3VzRm9jdXMuZm9jdXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcHJldmlvdXNGb2N1cy5mb2N1cygpO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgIH07XG5cbiAgICAvLyBFc2NhcGUga2V5IGNhbmNlbHNcbiAgICBvdmVybGF5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4geyBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSBmaW5pc2goZmFsc2UpOyB9LCB7IG9uY2U6IHRydWUgfSk7XG5cbiAgICAvLyBSZWJpbmQgY2xvbmVkIGJ1dHRvbnNcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29uZmlybS1kaWFsb2ctb2snKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICAgICAoKSA9PiBmaW5pc2godHJ1ZSksICB7IG9uY2U6IHRydWUgfSk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbmZpcm0tZGlhbG9nLWNhbmNlbCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gZmluaXNoKGZhbHNlKSwgeyBvbmNlOiB0cnVlIH0pO1xuICAgIG92ZXJsYXkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBlID0+IHsgaWYgKGUudGFyZ2V0ID09PSBvdmVybGF5KSBmaW5pc2goZmFsc2UpOyB9LCB7IG9uY2U6IHRydWUgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEluaXRpYWxpemUgdGhlIGFwcGxpY2F0aW9uIG9uIERPTSByZWFkeS5cbiAqIFNldHMgdXAgZXZlbnQgbGlzdGVuZXJzLCByZXN0b3JlcyBzZXNzaW9uLCBhbmQgbG9hZHMgaW5pdGlhbCB0YWIuXG4gKi9cbi8qKlxuICogU2V0IHVwIGFsbCBnbG9iYWwgZXZlbnQgbGlzdGVuZXJzLlxuICovXG5mdW5jdGlvbiBzZXR1cEV2ZW50TGlzdGVuZXJzKCkge1xuICAvLyBUYWIgYnV0dG9uc1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudGFiJykuZm9yRWFjaCh0YWIgPT4ge1xuICAgIHRhYi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICBjb25zdCB0YWJOYW1lID0gZS50YXJnZXQuaWQucmVwbGFjZSgndGFiLScsICcnKTtcbiAgICAgIHN3aXRjaFRhYih0YWJOYW1lKTtcbiAgICB9KTtcblxuICAgIC8vIEtleWJvYXJkIG5hdmlnYXRpb24gZm9yIHRhYnMgKFdDQUcgMi4xIEFBIHRhYmxpc3QgcGF0dGVybilcbiAgICB0YWIuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChlKSA9PiB7XG4gICAgICAvLyBFbnRlci9TcGFjZSBhY3RpdmF0ZSB0aGUgZm9jdXNlZCB0YWJcbiAgICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJyB8fCBlLmtleSA9PT0gJyAnKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS50YXJnZXQuY2xpY2soKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gQXJyb3cvSG9tZS9FbmQgbmF2aWdhdGUgYW5kIGFjdGl2YXRlXG4gICAgICBpZiAoWydBcnJvd0xlZnQnLCAnQXJyb3dSaWdodCcsICdIb21lJywgJ0VuZCddLmluY2x1ZGVzKGUua2V5KSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGNvbnN0IHRhYnMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50YWI6bm90KFtzdHlsZSo9XCJkaXNwbGF5OiBub25lXCJdKScpKTtcbiAgICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gdGFicy5pbmRleE9mKGUudGFyZ2V0KTtcblxuICAgICAgICBsZXQgbmV4dFRhYjtcbiAgICAgICAgaWYgKGUua2V5ID09PSAnQXJyb3dMZWZ0JyB8fCBlLmtleSA9PT0gJ0hvbWUnKSB7XG4gICAgICAgICAgbmV4dFRhYiA9IGUua2V5ID09PSAnSG9tZScgPyB0YWJzWzBdIDogdGFic1soY3VycmVudEluZGV4IC0gMSArIHRhYnMubGVuZ3RoKSAlIHRhYnMubGVuZ3RoXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXh0VGFiID0gZS5rZXkgPT09ICdFbmQnID8gdGFic1t0YWJzLmxlbmd0aCAtIDFdIDogdGFic1soY3VycmVudEluZGV4ICsgMSkgJSB0YWJzLmxlbmd0aF07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV4dFRhYikge1xuICAgICAgICAgIG5leHRUYWIuZm9jdXMoKTtcbiAgICAgICAgICBuZXh0VGFiLmNsaWNrKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gTWVzc2FnZSBpbnB1dCAoRW50ZXIga2V5IHRvIHNlbmQpXG4gIGNvbnN0IG1lc3NhZ2VJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZXNzYWdlLWlucHV0Jyk7XG4gIGlmIChtZXNzYWdlSW5wdXQpIHtcbiAgICBtZXNzYWdlSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5cHJlc3MnLCAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSAnRW50ZXInICYmICFlLnNoaWZ0S2V5KSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzLnNlbmRNZXNzYWdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgZ2xvYmFsVGhpcy5zZW5kTWVzc2FnZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBNb2RhbCBjbG9zZSBvbiBFU0Mga2V5XG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4ge1xuICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgIGNsb3NlQWxsTW9kYWxzKCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBDbG9zZSBtb2RhbHMgb24gYmFja2dyb3VuZCBjbGlja1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbcm9sZT1cImRpYWxvZ1wiXScpLmZvckVhY2gobW9kYWwgPT4ge1xuICAgIG1vZGFsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgIGlmIChlLnRhcmdldCA9PT0gbW9kYWwpIHtcbiAgICAgICAgY2xvc2VNb2RhbChtb2RhbC5pZCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJldHVybiB0aGUgc3RhZ2UgdGhhdCBvd25zIGEgZ2l2ZW4gdGFiLCBvciBudWxsIGlmIHVubWFwcGVkLlxuICogQHBhcmFtIHtzdHJpbmd9IHRhYlxuICogQHJldHVybnMge3N0cmluZ3xudWxsfVxuICovXG5mdW5jdGlvbiBnZXRTdGFnZUZvclRhYih0YWIpIHtcbiAgZm9yIChjb25zdCBbc3RhZ2UsIHRhYnNdIG9mIE9iamVjdC5lbnRyaWVzKFNUQUdFX1RBQlMpKSB7XG4gICAgaWYgKHRhYnMuaW5jbHVkZXModGFiKSkgcmV0dXJuIHN0YWdlO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBnZXRWaXNpYmxlU3RhZ2UoKSB7XG4gIGNvbnN0IGFjdGl2ZVRhYiA9IHN0YXRlTWFuYWdlci5nZXRDdXJyZW50VGFiKCk7XG4gIHJldHVybiBnZXRTdGFnZUZvclRhYihhY3RpdmVUYWIpIHx8IGdldFdvcmtmbG93U3RlcEZvclBoYXNlKHN0YXRlTWFuYWdlci5nZXRQaGFzZSgpKTtcbn1cblxuLyoqXG4gKiBTaG93L2hpZGUgdGhlIHNjcm9sbCBhcnJvdyBidXR0b25zIGJhc2VkIG9uIHdoZXRoZXIgdGhlIHRhYiBiYXIgaXMgc2Nyb2xsYWJsZS5cbiAqL1xuZnVuY3Rpb24gdXBkYXRlVGFiU2Nyb2xsQnV0dG9ucygpIHtcbiAgY29uc3QgdGFiQmFyICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWItYmFyJyk7XG4gIGNvbnN0IGxlZnRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFiLXNjcm9sbC1sZWZ0Jyk7XG4gIGNvbnN0IHJpZ2h0QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYi1zY3JvbGwtcmlnaHQnKTtcbiAgaWYgKCF0YWJCYXIgfHwgIWxlZnRCdG4gfHwgIXJpZ2h0QnRuKSByZXR1cm47XG4gIGxlZnRCdG4uc3R5bGUuZGlzcGxheSAgPSB0YWJCYXIuc2Nyb2xsTGVmdCA+IDAgPyAnJyA6ICdub25lJztcbiAgcmlnaHRCdG4uc3R5bGUuZGlzcGxheSA9IHRhYkJhci5zY3JvbGxMZWZ0IDwgdGFiQmFyLnNjcm9sbFdpZHRoIC0gdGFiQmFyLmNsaWVudFdpZHRoIC0gMSA/ICcnIDogJ25vbmUnO1xufVxuXG4vKipcbiAqIFNob3cgb25seSB0aGUgdGFicyB0aGF0IGJlbG9uZyB0byB0aGUgZ2l2ZW4gc3RhZ2UgaW4gdGhlIHNlY29uZCBuYXYgYmFyLlxuICogQHBhcmFtIHtzdHJpbmd9IHN0YWdlIC0gS2V5IGZyb20gU1RBR0VfVEFCU1xuICovXG5mdW5jdGlvbiB1cGRhdGVUYWJCYXJGb3JTdGFnZShzdGFnZSkge1xuICBjb25zdCBzdGFnZVRhYnMgPSBTVEFHRV9UQUJTW3N0YWdlXSB8fCBbXTtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnRhYicpLmZvckVhY2godGFiID0+IHtcbiAgICB0YWIuc3R5bGUuZGlzcGxheSA9IHN0YWdlVGFicy5pbmNsdWRlcyh0YWIuZGF0YXNldC50YWIpID8gJycgOiAnbm9uZSc7XG4gIH0pO1xuICAvLyBSZXNldCBzY3JvbGwgcG9zaXRpb24gdG8gc2hvdyBhY3RpdmUgdGFiLCB0aGVuIHJlZnJlc2ggYXJyb3cgdmlzaWJpbGl0eVxuICBjb25zdCB0YWJCYXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFiLWJhcicpO1xuICBpZiAodGFiQmFyKSB0YWJCYXIuc2Nyb2xsTGVmdCA9IDA7XG4gIHVwZGF0ZVRhYlNjcm9sbEJ1dHRvbnMoKTtcblxuICAvLyBHQVAtMTYgKFBhcnQgQSk6IHN1cmZhY2Ugd2hpY2ggd29ya2Zsb3cgc3RlcCdzIHN1Yi10YWJzIGFyZSBjdXJyZW50bHlcbiAgLy8gc2hvd24uIFZpc2libGUtb25seSBsYWJlbCBcdTIwMTQgbm8gYXJpYS1saXZlIGhlcmU7IHN3aXRjaFRhYigpIGluXG4gIC8vIHJldmlldy10YWJsZS1iYXNlLmpzIGlzIHRoZSBzb2xlIGxpdmUtc3BlZWNoIHNvdXJjZSBmb3IgdGhpcyBldmVudCwgdG9cbiAgLy8gYXZvaWQgYSBkb3VibGUtYW5ub3VuY2UgZnJvbSB0d28gaW5kZXBlbmRlbnQgbGl2ZSByZWdpb25zLlxuICBjb25zdCBsYWJlbEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYi1zdGFnZS1sYWJlbCcpO1xuICBpZiAobGFiZWxFbCkge1xuICAgIGNvbnN0IHN0ZXBMYWJlbCA9IF9TVEVQX0RJU1BMQVlbc3RhZ2VdIHx8IHN0YWdlO1xuICAgIGxhYmVsRWwudGV4dENvbnRlbnQgPSBzdGVwTGFiZWwgPyBgTm93IHZpZXdpbmc6ICR7c3RlcExhYmVsfWAgOiAnJztcbiAgfVxufVxuXG4vLyBsb2FkVGFiQ29udGVudCgpIGxpdmVzIGluIHdlYi9yZXZpZXctdGFibGUtYmFzZS5qcywgd2hpY2ggb3ducyB0aGVcbi8vIGZ1bGwgfjIwLWNhc2UgdGFiIGRpc3BhdGNoICh0aGlzIGZpbGUncyBjb3B5IG9ubHkgZXZlciBoYW5kbGVkIDUgb2YgdGhlbVxuLy8gYW5kIHdhcyBuZXZlciBjYWxsZWQgaW50ZXJuYWxseSBcdTIwMTQgZGVhZCBjb2RlLCBzdXBlcnNlZGVkIG9uY2UgdGhlIHRhYlxuLy8gc3lzdGVtIGdyZXcpLiByZXZpZXctdGFibGUtYmFzZS5qcydzIHZlcnNpb24gbm93IGNhcnJpZXMgdGhlIHNhbWVcbi8vIHNhZmUgdGV4dENvbnRlbnQtYmFzZWQgZXJyb3IgcmVuZGVyaW5nIHRoaXMgY29weSBoYWQ7IHNlZSBpdHMgb3duXG4vLyB0cnkvY2F0Y2guIFJlbW92ZWQgaGVyZSByYXRoZXIgdGhhbiBsZWZ0IHRvIGRyaWZ0IGZ1cnRoZXIgb3V0IG9mIHN5bmMuXG5cbi8qKlxuICogVG9nZ2xlIGNvbGxhcHNpYmxlIGNoYXQgcGFuZWwgKGludGVyYWN0aW9uIGFyZWEpLlxuICovXG5mdW5jdGlvbiB0b2dnbGVDaGF0KCkge1xuICBjb25zdCBpbnRlcmFjdGlvbkFyZWEgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaW50ZXJhY3Rpb24tYXJlYScpO1xuICBjb25zdCB2aWV3ZXJBcmVhID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnZpZXdlci1hcmVhJyk7XG5cbiAgaWYgKGludGVyYWN0aW9uQXJlYSkge1xuICAgIGNvbnN0IGlzQ29sbGFwc2VkID0gaW50ZXJhY3Rpb25BcmVhLmNsYXNzTGlzdC50b2dnbGUoJ2NvbGxhcHNlZCcpO1xuICAgIGlmICh2aWV3ZXJBcmVhKSB7XG4gICAgICB2aWV3ZXJBcmVhLnN0eWxlLmZsZXggPSBpc0NvbGxhcHNlZCA/ICcxIDEgMTAwJScgOiAnMCAxIDYwJSc7XG4gICAgfVxuICAgIC8vIEtlZXAgYXJpYS1sYWJlbCBhbmQgYXJpYS1leHBhbmRlZCBpbiBzeW5jIHdpdGggY29sbGFwc2VkIHN0YXRlXG4gICAgY29uc3QgdG9nZ2xlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvZ2dsZS1jaGF0Jyk7XG4gICAgaWYgKHRvZ2dsZUJ0bikge1xuICAgICAgdG9nZ2xlQnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsIFN0cmluZyghaXNDb2xsYXBzZWQpKTtcbiAgICAgIHRvZ2dsZUJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCBpc0NvbGxhcHNlZCA/ICdFeHBhbmQgY2hhdCBwYW5lbCcgOiAnQ29sbGFwc2UgY2hhdCBwYW5lbCcpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oU3RvcmFnZUtleXMuQ0hBVF9DT0xMQVBTRUQsIGlzQ29sbGFwc2VkKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2cud2FybignQ291bGQgbm90IHNhdmUgY2hhdCBzdGF0ZScpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIE9wZW4gYSBtb2RhbCBieSBJRC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RhbElkIC0gSUQgb2YgbW9kYWwgZWxlbWVudFxuICovXG5mdW5jdGlvbiBvcGVuTW9kYWwobW9kYWxJZCkge1xuICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG1vZGFsSWQpO1xuICBpZiAobW9kYWwpIHtcbiAgICAvLyBTYXZlIGZvY3VzIGJlZm9yZSBvcGVuaW5nIG1vZGFsXG4gICAgX2ZvY3VzU3RhY2sucHVzaChkb2N1bWVudC5hY3RpdmVFbGVtZW50KTtcblxuICAgIG1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Zpc2libGUnKTtcbiAgICBtb2RhbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ2ZhbHNlJyk7XG4gICAgLy8gTG9jayBib2R5IHNjcm9sbFxuICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcblxuICAgIC8vIFNldCBpbml0aWFsIGZvY3VzIGFuZCB0cmFwIGZvY3VzIHdpdGhpbiBtb2RhbFxuICAgIHNldEluaXRpYWxGb2N1cyhtb2RhbElkKTtcbiAgICB0cmFwRm9jdXMobW9kYWxJZCk7XG4gIH1cbn1cblxuLyoqXG4gKiBDbG9zZSBhIG1vZGFsIGJ5IElELlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGFsSWQgLSBJRCBvZiBtb2RhbCBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIGNsb3NlTW9kYWwobW9kYWxJZCkge1xuICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG1vZGFsSWQpO1xuICBpZiAobW9kYWwpIHtcbiAgICBpZiAobW9kYWwuZGF0YXNldC5kaXNtaXNzRGlzYWJsZWQgPT09ICcxJykgcmV0dXJuO1xuICAgIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Zpc2libGUnKTtcbiAgICBtb2RhbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTtcbiAgICAvLyBSZXN0b3JlIGJvZHkgc2Nyb2xsXG4gICAgaWYgKCFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbcm9sZT1cImRpYWxvZ1wiXS52aXNpYmxlJykpIHtcbiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnJztcbiAgICB9XG4gICAgLy8gUmVzdG9yZSBmb2N1c1xuICAgIHJlc3RvcmVGb2N1cygpO1xuICB9XG59XG5cbi8qKlxuICogQ2xvc2UgYWxsIG9wZW4gbW9kYWxzLlxuICovXG5mdW5jdGlvbiBjbG9zZUFsbE1vZGFscygpIHtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW3JvbGU9XCJkaWFsb2dcIl0nKS5mb3JFYWNoKG1vZGFsID0+IHtcbiAgICBpZiAobW9kYWwuZGF0YXNldC5kaXNtaXNzRGlzYWJsZWQgPT09ICcxJykgcmV0dXJuO1xuICAgIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Zpc2libGUnKTtcbiAgICBtb2RhbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTtcbiAgICBpZiAobW9kYWwuc3R5bGUuZGlzcGxheSAmJiBtb2RhbC5zdHlsZS5kaXNwbGF5ICE9PSAnbm9uZScpIHtcbiAgICAgIG1vZGFsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgfVxuICB9KTtcbiAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICcnO1xuICAvLyBSZXN0b3JlIGZvY3VzXG4gIHJlc3RvcmVGb2N1cygpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgTW9kZWwgc2VsZWN0b3IgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmxldCBfbW9kZWxEYXRhID0gbnVsbDsgLy8gY2FjaGVkIGZyb20gbGFzdCBsb2FkTW9kZWxTZWxlY3RvcigpIGNhbGxcbmxldCBfbW9kZWxEYXRhVGFibGUgPSBudWxsO1xubGV0IF9zZWxlY3RlZE1vZGVsUHJvdmlkZXJzID0gbmV3IFNldCgpO1xubGV0IF9tb2RlbFNlbGVjdG9yTG9hZGluZyA9IGZhbHNlOyAgIC8vIGd1YXJkOiBsb2FkTW9kZWxTZWxlY3RvcigpIGluIGZsaWdodFxubGV0IF9jYXRhbG9nUmVmcmVzaGluZyA9IGZhbHNlOyAgICAgIC8vIGd1YXJkOiBfcmVmcmVzaE1vZGVsQ2F0YWxvZ0ZvclNlbGVjdGlvbigpIGluIGZsaWdodFxubGV0IF9jYXRhbG9nUmVmcmVzaFBlbmRpbmcgPSBmYWxzZTsgIC8vIHF1ZXVlIG9uZSByZXJ1biB3aGVuIHRvZ2dsZXMgaGFwcGVuIG1pZC1yZWZyZXNoXG5sZXQgX3Nob3dGdWxsTW9kZWxDYXRhbG9nID0gZmFsc2U7XG5sZXQgX2NvcGlsb3RBdXRoUG9sbFRpbWVyID0gbnVsbDtcbmxldCBfbW9kZWxXaXphcmRTdGVwID0gMTtcbmxldCBfbW9kZWxXaXphcmRTZWxlY3RlZFByb3ZpZGVyID0gbnVsbDtcblxuXG5mdW5jdGlvbiBfZ2V0TW9kZWxQcmVmc0Zyb21TdG9yYWdlKCkge1xuICB0cnkge1xuICAgIGNvbnN0IHNhdmVkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oU3RvcmFnZUtleXMuVEFCX0RBVEEpO1xuICAgIHJldHVybiBzYXZlZCA/IChKU09OLnBhcnNlKHNhdmVkKSB8fCB7fSkgOiB7fTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG59XG5cbmZ1bmN0aW9uIF9zYXZlTW9kZWxQcmVmc1RvU3RvcmFnZShwYXRjaCkge1xuICB0cnkge1xuICAgIGNvbnN0IHBhcnNlZCA9IF9nZXRNb2RlbFByZWZzRnJvbVN0b3JhZ2UoKTtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShTdG9yYWdlS2V5cy5UQUJfREFUQSwgSlNPTi5zdHJpbmdpZnkoeyAuLi5wYXJzZWQsIC4uLnBhdGNoIH0pKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZy53YXJuKCdGYWlsZWQgdG8gcGVyc2lzdCBtb2RlbCBwcmVmZXJlbmNlcyBsb2NhbGx5OicsIGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9hcHBlbmRSZWNlbnRNb2RlbChwcm92aWRlciwgbW9kZWwpIHtcbiAgaWYgKCFwcm92aWRlciB8fCAhbW9kZWwpIHJldHVybjtcbiAgY29uc3QgcGFyc2VkID0gX2dldE1vZGVsUHJlZnNGcm9tU3RvcmFnZSgpO1xuICBjb25zdCBleGlzdGluZyA9IEFycmF5LmlzQXJyYXkocGFyc2VkLnJlY2VudE1vZGVscykgPyBwYXJzZWQucmVjZW50TW9kZWxzIDogW107XG4gIGNvbnN0IGZpbHRlcmVkID0gZXhpc3RpbmcuZmlsdGVyKChpdGVtKSA9PiAhKGl0ZW0ucHJvdmlkZXIgPT09IHByb3ZpZGVyICYmIGl0ZW0ubW9kZWwgPT09IG1vZGVsKSk7XG4gIGZpbHRlcmVkLnVuc2hpZnQoeyBwcm92aWRlciwgbW9kZWwgfSk7XG4gIF9zYXZlTW9kZWxQcmVmc1RvU3RvcmFnZSh7IHJlY2VudE1vZGVsczogZmlsdGVyZWQuc2xpY2UoMCwgNikgfSk7XG59XG5cbmZ1bmN0aW9uIF91cGRhdGVMbG1TdGF0dXNQaWxsKGtpbmQsIHRleHQsIGljb24gPSAnJywgdG9vbHRpcCA9ICcnKSB7XG4gIGNvbnN0IHBpbGwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtLXN0YXR1cy1waWxsJyk7XG4gIGNvbnN0IGxhYmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbS1zdGF0dXMtbGFiZWwnKTtcbiAgY29uc3QgaWNvbkVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbS1zdGF0dXMtaWNvbicpO1xuICBpZiAoIXBpbGwgfHwgIWxhYmVsKSByZXR1cm47XG5cbiAgY29uc3QgYWxpYXNlcyA9IHtcbiAgICBhdXRoZW50aWNhdGVkOiAnY29ubmVjdGVkJyxcbiAgICB1bmF1dGhlbnRpY2F0ZWQ6ICd1bmNvbmZpZ3VyZWQnLFxuICAgIHBvbGxpbmc6ICdjb25uZWN0aW5nJyxcbiAgfTtcbiAgY29uc3Qgbm9ybWFsaXplZEtpbmQgPSBhbGlhc2VzW2tpbmRdIHx8IGtpbmQgfHwgJ3VuY29uZmlndXJlZCc7XG4gIGNvbnN0IGRlZmF1bHRUb29sdGlwID0ge1xuICAgIHVuY29uZmlndXJlZDogJ05vIHByb3ZpZGVyL21vZGVsIGlzIGNvbmZpZ3VyZWQgeWV0LicsXG4gICAgY29uZmlndXJlZDogJ1Byb3ZpZGVyL21vZGVsIGlzIGNvbmZpZ3VyZWQuIENvbm5lY3Rpdml0eSBub3QgeWV0IHZlcmlmaWVkLicsXG4gICAgY29ubmVjdGluZzogJ1Rlc3Rpbmcgb3IgY29ubmVjdGluZyB0byB0aGUgc2VsZWN0ZWQgcHJvdmlkZXIuJyxcbiAgICBjb25uZWN0ZWQ6ICdQcm92aWRlciByZXNwb25kZWQgc3VjY2Vzc2Z1bGx5IHRvIGEgbGl2ZSByZXF1ZXN0LicsXG4gICAgJ2F1dGgtcmVxdWlyZWQnOiAnQXV0aGVudGljYXRpb24gaXMgcmVxdWlyZWQuIENoZWNrIEFQSSBrZXkgb3Igc2lnbiBpbi4nLFxuICAgICdyYXRlLWxpbWl0ZWQnOiAnUmF0ZSBsaW1pdCByZWFjaGVkLiBXYWl0IGJlZm9yZSByZXRyeWluZyByZXF1ZXN0cy4nLFxuICAgIHVuYXZhaWxhYmxlOiAnUHJvdmlkZXIgaXMgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGUgb3IgdW5yZWFjaGFibGUuJyxcbiAgICBlcnJvcjogJ0Nvbm5lY3Rpb24gZmFpbGVkLiBPcGVuIG1vZGVsIHNldHRpbmdzIGZvciBkZXRhaWxzLicsXG4gIH07XG4gIHBpbGwuY2xhc3NMaXN0LnJlbW92ZSgnYXV0aGVudGljYXRlZCcsICd1bmF1dGhlbnRpY2F0ZWQnLCAncG9sbGluZycsICd1bmNvbmZpZ3VyZWQnLCAnY29uZmlndXJlZCcsICdjb25uZWN0aW5nJywgJ2Nvbm5lY3RlZCcsICdhdXRoLXJlcXVpcmVkJywgJ3JhdGUtbGltaXRlZCcsICd1bmF2YWlsYWJsZScsICdlcnJvcicpO1xuICBpZiAobm9ybWFsaXplZEtpbmQpIHBpbGwuY2xhc3NMaXN0LmFkZChub3JtYWxpemVkS2luZCk7XG4gIGxhYmVsLnRleHRDb250ZW50ID0gdGV4dDtcbiAgY29uc3QgaWNvbkJ5S2luZCA9IHtcbiAgICB1bmNvbmZpZ3VyZWQ6ICdcdTI1Q0InLFxuICAgIGNvbmZpZ3VyZWQ6ICdcdTI1RDQnLFxuICAgIGNvbm5lY3Rpbmc6ICdcdTI5RDcnLFxuICAgIGNvbm5lY3RlZDogJ1x1MjcxMycsXG4gICAgJ2F1dGgtcmVxdWlyZWQnOiAnXHVEODNEXHVERDExJyxcbiAgICAncmF0ZS1saW1pdGVkJzogJ1x1MjNGMycsXG4gICAgdW5hdmFpbGFibGU6ICdcdTI2MDEnLFxuICAgIGVycm9yOiAnXHUyNkEwJyxcbiAgfTtcbiAgY29uc3QgaWNvblRleHQgPSBpY29uIHx8IGljb25CeUtpbmRbbm9ybWFsaXplZEtpbmRdIHx8ICdcdTI2QTAnO1xuICBpZiAoaWNvbkVsKSBpY29uRWwudGV4dENvbnRlbnQgPSBpY29uVGV4dDtcbiAgY29uc3QgdG9vbHRpcFRleHQgPSB0b29sdGlwIHx8IGRlZmF1bHRUb29sdGlwW25vcm1hbGl6ZWRLaW5kXSB8fCAnJztcbiAgcGlsbC50aXRsZSA9IHRvb2x0aXBUZXh0O1xuICBpZiAoaWNvbkVsKSBpY29uRWwudGl0bGUgPSB0b29sdGlwVGV4dDtcbiAgbGFiZWwudGl0bGUgPSB0b29sdGlwVGV4dDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9hZE1vZGVsU2VsZWN0b3IoKSB7XG4gIGlmIChfbW9kZWxTZWxlY3RvckxvYWRpbmcpIHJldHVybjtcbiAgX21vZGVsU2VsZWN0b3JMb2FkaW5nID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICBfbW9kZWxEYXRhID0gYXdhaXQgYXBpQ2FsbCgnR0VUJywgJy9hcGkvbW9kZWwnKTtcbiAgICAvLyBJZiBiYWNrZW5kIGRpZG4ndCByZXR1cm4gYSBwZXJzaXN0ZW50IHNlbGVjdGlvbiwgcHJlZmVyIGEgbG9jYWxseS1zYXZlZCBjaG9pY2VcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2F2ZWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShTdG9yYWdlS2V5cy5UQUJfREFUQSk7XG4gICAgICBpZiAoc2F2ZWQpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShzYXZlZCk7XG4gICAgICAgIGlmIChwYXJzZWQgJiYgIShfbW9kZWxEYXRhICYmIF9tb2RlbERhdGEucHJvdmlkZXIpICYmIHBhcnNlZC5jdXJyZW50TW9kZWxQcm92aWRlcikge1xuICAgICAgICAgIF9tb2RlbERhdGEgPSBfbW9kZWxEYXRhIHx8IHt9O1xuICAgICAgICAgIF9tb2RlbERhdGEucHJvdmlkZXIgPSBwYXJzZWQuY3VycmVudE1vZGVsUHJvdmlkZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcnNlZCAmJiAhKF9tb2RlbERhdGEgJiYgX21vZGVsRGF0YS5tb2RlbCkgJiYgcGFyc2VkLmN1cnJlbnRNb2RlbE5hbWUpIHtcbiAgICAgICAgICBfbW9kZWxEYXRhID0gX21vZGVsRGF0YSB8fCB7fTtcbiAgICAgICAgICBfbW9kZWxEYXRhLm1vZGVsID0gcGFyc2VkLmN1cnJlbnRNb2RlbE5hbWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2cud2FybignQ291bGQgbm90IHJlYWQgc2F2ZWQgbW9kZWwgZnJvbSBsb2NhbFN0b3JhZ2U6JywgZSk7XG4gICAgfVxuICAgIGNvbnN0IGxhYmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLWN1cnJlbnQtbGFiZWwnKTtcbiAgICBpZiAobGFiZWwpIHtcbiAgICAgIGNvbnN0IHByb3YgID0gX21vZGVsRGF0YS5wcm92aWRlcjtcbiAgICAgIGNvbnN0IG1vZGVsID0gX21vZGVsRGF0YS5tb2RlbCB8fCAnXHUyMDE0JztcbiAgICAgIGxhYmVsLnRleHRDb250ZW50ID0gcHJvdiA/IGAke3Byb3Z9IFx1MDBCNyAke21vZGVsfWAgOiBtb2RlbDtcbiAgICB9XG4gICAgaWYgKF9tb2RlbERhdGEgJiYgX21vZGVsRGF0YS5wcm92aWRlcikge1xuICAgICAgX3NlbGVjdGVkTW9kZWxQcm92aWRlcnMgPSBuZXcgU2V0KFtfbW9kZWxEYXRhLnByb3ZpZGVyXSk7XG4gICAgICBfdXBkYXRlTGxtU3RhdHVzUGlsbCgnY29uZmlndXJlZCcsIGAke19tb2RlbERhdGEucHJvdmlkZXJ9IGNvbmZpZ3VyZWRgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgX3VwZGF0ZUxsbVN0YXR1c1BpbGwoJ3VuY29uZmlndXJlZCcsICdOb3QgY29uZmlndXJlZCcpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZy53YXJuKCdDb3VsZCBub3QgbG9hZCBtb2RlbCBsaXN0OicsIGUpO1xuICB9IGZpbmFsbHkge1xuICAgIF9tb2RlbFNlbGVjdG9yTG9hZGluZyA9IGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9wcm92aWRlclN0YWdlTGFiZWwocHJvdmlkZXIsIGNhcGFibGVTZXQpIHtcbiAgY29uc3QgaXNDYXBhYmxlID0gY2FwYWJsZVNldC5oYXMocHJvdmlkZXIpO1xuICByZXR1cm4gaXNDYXBhYmxlID8gJ2xpc3RfbW9kZWxzJyA6ICdmYWxsYmFjayc7XG59XG5cbmZ1bmN0aW9uIF9wcm92aWRlckRpc3BsYXlMYWJlbChwcm92aWRlcikge1xuICBjb25zdCBkZXByZWNhdGVkID0ge1xuICAgICdjb3BpbG90LW9hdXRoJzogJ0NvcGlsb3QgT0F1dGggKGRlcHJlY2F0ZWQpJyxcbiAgICBjb3BpbG90OiAnQ29waWxvdCAoZGVwcmVjYXRlZCknLFxuICAgIGdpdGh1YjogJ0dpdEh1YiBNb2RlbHMgKGRlcHJlY2F0ZWQpJyxcbiAgICAnY29waWxvdC1zZGsnOiAnQ29waWxvdCBTREsgKHJlY29tbWVuZGVkKScsXG4gIH07XG4gIGlmIChkZXByZWNhdGVkW3Byb3ZpZGVyXSkgcmV0dXJuIGRlcHJlY2F0ZWRbcHJvdmlkZXJdO1xuICByZXR1cm4gcHJvdmlkZXI7XG59XG5cbmZ1bmN0aW9uIF9nZXRRdWlja01vZGVsQ2FuZGlkYXRlcyhyb3dzKSB7XG4gIGNvbnN0IHBhcnNlZCA9IF9nZXRNb2RlbFByZWZzRnJvbVN0b3JhZ2UoKTtcbiAgY29uc3QgcmVjZW50cyA9IEFycmF5LmlzQXJyYXkocGFyc2VkLnJlY2VudE1vZGVscykgPyBwYXJzZWQucmVjZW50TW9kZWxzIDogW107XG4gIGNvbnN0IHJhbmtlZCA9IFtdO1xuXG4gIGZvciAoY29uc3QgcmVjZW50IG9mIHJlY2VudHMpIHtcbiAgICBjb25zdCBoaXQgPSByb3dzLmZpbmQoKHJvdykgPT4gcm93LnByb3ZpZGVyID09PSByZWNlbnQucHJvdmlkZXIgJiYgcm93Lm1vZGVsID09PSByZWNlbnQubW9kZWwpO1xuICAgIGlmIChoaXQpIHJhbmtlZC5wdXNoKGhpdCk7XG4gIH1cblxuICBjb25zdCBwb3B1bGFyID0gWy4uLnJvd3NdXG4gICAgLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGNvbnN0IGFtID0gTnVtYmVyKGEuY29waWxvdF9tdWx0aXBsaWVyID8/IDk5OSk7XG4gICAgICBjb25zdCBibSA9IE51bWJlcihiLmNvcGlsb3RfbXVsdGlwbGllciA/PyA5OTkpO1xuICAgICAgaWYgKGFtICE9PSBibSkgcmV0dXJuIGFtIC0gYm07XG4gICAgICBjb25zdCBhYyA9IE51bWJlcihhLmNvbnRleHRfd2luZG93IHx8IDApO1xuICAgICAgY29uc3QgYmMgPSBOdW1iZXIoYi5jb250ZXh0X3dpbmRvdyB8fCAwKTtcbiAgICAgIHJldHVybiBiYyAtIGFjO1xuICAgIH0pO1xuXG4gIGZvciAoY29uc3QgaXRlbSBvZiBwb3B1bGFyKSB7XG4gICAgaWYgKCFyYW5rZWQuc29tZSgocikgPT4gci5wcm92aWRlciA9PT0gaXRlbS5wcm92aWRlciAmJiByLm1vZGVsID09PSBpdGVtLm1vZGVsKSkge1xuICAgICAgcmFua2VkLnB1c2goaXRlbSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJhbmtlZC5zbGljZSgwLCA4KTtcbn1cblxuZnVuY3Rpb24gX3JlbmRlclF1aWNrTW9kZWxMaXN0KHJvd3MpIHtcbiAgY29uc3QgcXVpY2tFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1xdWljay1saXN0Jyk7XG4gIGlmICghcXVpY2tFbCkgcmV0dXJuO1xuICBxdWlja0VsLmlubmVySFRNTCA9ICcnO1xuXG4gIGNvbnN0IGNhbmRpZGF0ZXMgPSBfZ2V0UXVpY2tNb2RlbENhbmRpZGF0ZXMocm93cyB8fCBbXSk7XG4gIGZvciAoY29uc3QgaXRlbSBvZiBjYW5kaWRhdGVzKSB7XG4gICAgY29uc3QgaXNBY3RpdmUgPSBpdGVtLnByb3ZpZGVyID09PSBfbW9kZWxEYXRhPy5wcm92aWRlciAmJiBpdGVtLm1vZGVsID09PSBfbW9kZWxEYXRhPy5tb2RlbDtcbiAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICBidXR0b24uY2xhc3NOYW1lID0gJ2hlYWRlci1waWxsLWJ0bic7XG4gICAgYnV0dG9uLnN0eWxlLnBhZGRpbmcgPSAnNXB4IDEwcHgnO1xuICAgIGJ1dHRvbi5zdHlsZS5mb250U2l6ZSA9ICcwLjgyZW0nO1xuICAgIGJ1dHRvbi5zdHlsZS5iYWNrZ3JvdW5kID0gaXNBY3RpdmUgPyAnI2RiZWFmZScgOiAnI2Y4ZmFmYyc7XG4gICAgYnV0dG9uLnN0eWxlLmNvbG9yID0gaXNBY3RpdmUgPyAnIzFlM2E4YScgOiAnIzMzNDE1NSc7XG4gICAgYnV0dG9uLnN0eWxlLmJvcmRlckNvbG9yID0gaXNBY3RpdmUgPyAnIzkzYzVmZCcgOiAnI2NiZDVlMSc7XG4gICAgYnV0dG9uLnRpdGxlID0gYCR7aXRlbS5wcm92aWRlcn0gXHUwMEI3ICR7aXRlbS5tb2RlbH1gO1xuICAgIGJ1dHRvbi50ZXh0Q29udGVudCA9IGAke2l0ZW0ucHJvdmlkZXJ9IFx1MDBCNyAke2l0ZW0ubW9kZWx9YDtcbiAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBzZXRNb2RlbChpdGVtLm1vZGVsLCBpdGVtLnByb3ZpZGVyKTtcbiAgICB9KTtcbiAgICBxdWlja0VsLmFwcGVuZENoaWxkKGJ1dHRvbik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX3N5bmNDYXRhbG9nVmlzaWJpbGl0eSgpIHtcbiAgY29uc3Qgd3JhcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1mdWxsLXRhYmxlLXdyYXAnKTtcbiAgY29uc3Qgc2VhcmNoID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLWdsb2JhbC1zZWFyY2gnKTtcbiAgY29uc3QgdG9nZ2xlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLXNob3ctYWxsLWJ0bicpO1xuICBpZiAod3JhcCkgd3JhcC5zdHlsZS5kaXNwbGF5ID0gX3Nob3dGdWxsTW9kZWxDYXRhbG9nID8gJycgOiAnbm9uZSc7XG4gIGlmIChzZWFyY2gpIHNlYXJjaC5zdHlsZS5kaXNwbGF5ID0gX3Nob3dGdWxsTW9kZWxDYXRhbG9nID8gJycgOiAnbm9uZSc7XG4gIGlmICh0b2dnbGUpIHRvZ2dsZS50ZXh0Q29udGVudCA9IF9zaG93RnVsbE1vZGVsQ2F0YWxvZyA/ICdIaWRlIEZ1bGwgQ2F0YWxvZycgOiAnU2hvdyBGdWxsIENhdGFsb2cnO1xufVxuXG5mdW5jdGlvbiB0b2dnbGVNb2RlbENhdGFsb2dWaXNpYmlsaXR5KCkge1xuICBfc2hvd0Z1bGxNb2RlbENhdGFsb2cgPSAhX3Nob3dGdWxsTW9kZWxDYXRhbG9nO1xuICBfc3luY0NhdGFsb2dWaXNpYmlsaXR5KCk7XG59XG5cbi8vIF9yZW5kZXJBdXRoU3RlcCBcdTIwMTQgY2FsbGVkIGJ5IF9zZXRNb2RlbFdpemFyZFN0ZXAgd2hlbiBlbnRlcmluZyBTdGVwIDIuXG4vLyBSZW5kZXJzIHByb3ZpZGVyLXNwZWNpZmljIGNvbnRlbnQgaW50byAjbW9kZWwtYXV0aC1zdGVwLWNvbnRlbnQgYW5kIHNob3dzXG4vLyB0aGUgYXBwcm9wcmlhdGUgc3ViLXBhbmVsIChrZXkgaW5wdXQsIGRldmljZS1mbG93LCBDTEkgbm90aWNlLCBvciBub25lKS5cbmFzeW5jIGZ1bmN0aW9uIF9yZW5kZXJBdXRoU3RlcChwcm92aWRlcikge1xuICBjb25zdCBjb250ZW50ICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLWF1dGgtc3RlcC1jb250ZW50Jyk7XG4gIGNvbnN0IGtleVBhbmVsICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtYXV0aC1rZXktcGFuZWwnKTtcbiAgY29uc3QgZGV2UGFuZWwgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1hdXRoLWRldmljZS1wYW5lbCcpO1xuICBjb25zdCBrZXlJbnB1dCAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLWF1dGgta2V5LWlucHV0Jyk7XG4gIGNvbnN0IGtleVN0YXR1cyAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtYXV0aC1rZXktc3RhdHVzJyk7XG5cbiAgaWYgKCFjb250ZW50KSByZXR1cm47XG5cbiAgLy8gUmVzZXQgc3ViLXBhbmVsc1xuICBpZiAoa2V5UGFuZWwpICBrZXlQYW5lbC5zdHlsZS5kaXNwbGF5ICA9ICdub25lJztcbiAgaWYgKGRldlBhbmVsKSAgZGV2UGFuZWwuc3R5bGUuZGlzcGxheSAgPSAnbm9uZSc7XG4gIGlmIChrZXlJbnB1dCkgIGtleUlucHV0LnZhbHVlID0gJyc7XG4gIGlmIChrZXlTdGF0dXMpIGtleVN0YXR1cy50ZXh0Q29udGVudCA9ICcnO1xuXG4gIGlmICghcHJvdmlkZXIpIHtcbiAgICBjb250ZW50LmlubmVySFRNTCA9ICc8cCBzdHlsZT1cImNvbG9yOiM2NDc0OGI7XCI+U2VsZWN0IGEgcHJvdmlkZXIgaW4gU3RlcCAxIGZpcnN0LjwvcD4nO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBjcmVkRGF0YSA9IG51bGw7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKCcvYXBpL3NldHRpbmdzL2NyZWRlbnRpYWxzL3N0YXR1cycpO1xuICAgIGlmIChyZXNwLm9rKSB7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcC5qc29uKCk7XG4gICAgICBjcmVkRGF0YSA9IChkYXRhLnByb3ZpZGVycyB8fCB7fSlbcHJvdmlkZXJdIHx8IG51bGw7XG4gICAgfVxuICB9IGNhdGNoIHsgLyogbm9uLWZhdGFsICovIH1cblxuICBjb25zdCBhdXRoVHlwZSAgID0gY3JlZERhdGE/LmF1dGhfdHlwZSAgfHwgJ2FwaV9rZXknO1xuICBjb25zdCBsYWJlbCAgICAgID0gY3JlZERhdGE/LmxhYmVsICAgICAgfHwgcHJvdmlkZXI7XG4gIGNvbnN0IGhlbHBUZXh0ICAgPSBjcmVkRGF0YT8uaGVscF90ZXh0ICB8fCAnJztcbiAgY29uc3QgZ2V0S2V5VXJsICA9IGNyZWREYXRhPy5nZXRfa2V5X3VybCB8fCAnJztcbiAgY29uc3QgaXNTZXQgICAgICA9IGNyZWREYXRhPy5pc19zZXQgICAgIHx8IGZhbHNlO1xuICBjb25zdCBzb3VyY2UgICAgID0gY3JlZERhdGE/LnNvdXJjZSAgICAgfHwgJ3Vuc2V0JztcbiAgY29uc3QgZW52VmFyICAgICA9IGNyZWREYXRhPy5lbnZfdmFyICAgIHx8IG51bGw7XG4gIGNvbnN0IGlzTG9ja2VkICAgPSBjcmVkRGF0YT8ubG9ja2VkICAgICB8fCBmYWxzZTtcblxuICBjb25zdCBpc1NldEJhZGdlID0gaXNTZXRcbiAgICA/ICc8c3BhbiBzdHlsZT1cImRpc3BsYXk6aW5saW5lLWJsb2NrO3BhZGRpbmc6MnB4IDhweDtib3JkZXItcmFkaXVzOjk5OXB4O2JhY2tncm91bmQ6I2QxZmFlNTtjb2xvcjojMDY1ZjQ2O2ZvbnQtc2l6ZTowLjhlbTtmb250LXdlaWdodDo2MDA7XCI+JiMxMDAwMzsgS2V5IHNhdmVkPC9zcGFuPidcbiAgICA6ICc8c3BhbiBzdHlsZT1cImRpc3BsYXk6aW5saW5lLWJsb2NrO3BhZGRpbmc6MnB4IDhweDtib3JkZXItcmFkaXVzOjk5OXB4O2JhY2tncm91bmQ6I2ZlZTJlMjtjb2xvcjojOTkxYjFiO2ZvbnQtc2l6ZTowLjhlbTtmb250LXdlaWdodDo2MDA7XCI+Tm90IGNvbmZpZ3VyZWQ8L3NwYW4+JztcblxuICAvLyBTb3VyY2UgbGFiZWwgKyBcdTI0RDggdG9vbHRpcCBcdTIwMTQgbWlycm9ycyB0aGUgc2V0dGluZ3MgZGlhbG9nIHBhdHRlcm4uXG4gIGxldCBzb3VyY2VMYWJlbCA9ICcnO1xuICBsZXQgdG9vbHRpcFRleHQgPSAnJztcbiAgaWYgKHNvdXJjZSA9PT0gJ2VudicpIHtcbiAgICBzb3VyY2VMYWJlbCA9IGBTb3VyY2U6IGVudmlyb25tZW50IHZhcmlhYmxlICgke2VudlZhciB8fCAnbG9ja2VkJ30pYDtcbiAgICB0b29sdGlwVGV4dCA9IGBDdXJyZW50bHkgbG9hZGVkIGZyb20gdGhlICR7ZW52VmFyfSBlbnZpcm9ubWVudCB2YXJpYWJsZS4gYCArXG4gICAgICBgVG8gY2hhbmdlIGl0IHBlcm1hbmVudGx5LCB1cGRhdGUgeW91ciBzaGVsbCBjb25maWcgKGUuZy4gfi8uenNocmMpIGFuZCByZXN0YXJ0IHRoZSBzZXJ2ZXIuIGAgK1xuICAgICAgYFlvdSBjYW4gc3RpbGwgc2F2ZSBhIHZhbHVlIGJlbG93IFx1MjAxNCBpdCB0YWtlcyBlZmZlY3QgaW1tZWRpYXRlbHkgYnV0IHdpbGwgYmUgb3ZlcnJpZGRlbiBieSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgb24gbmV4dCByZXN0YXJ0LmA7XG4gIH0gZWxzZSBpZiAoc291cmNlID09PSAnZG90ZW52Jykge1xuICAgIHNvdXJjZUxhYmVsID0gYFNvdXJjZTogLmVudiBmaWxlICgke2VudlZhciB8fCAnbG9ja2VkJ30pYDtcbiAgICB0b29sdGlwVGV4dCA9IGBDdXJyZW50bHkgbG9hZGVkIGZyb20gJHtlbnZWYXJ9IGluIHlvdXIgLmVudiBmaWxlLiBgICtcbiAgICAgIGBUbyBjaGFuZ2UgaXQgcGVybWFuZW50bHksIGVkaXQgdGhlIC5lbnYgZmlsZSBpbiB0aGUgcHJvamVjdCBkaXJlY3RvcnkgYW5kIHJlc3RhcnQgdGhlIHNlcnZlci4gYCArXG4gICAgICBgWW91IGNhbiBzdGlsbCBzYXZlIGEgdmFsdWUgYmVsb3cgXHUyMDE0IGl0IHRha2VzIGVmZmVjdCBpbW1lZGlhdGVseSBidXQgd2lsbCBiZSBvdmVycmlkZGVuIGJ5IC5lbnYgb24gbmV4dCByZXN0YXJ0LmA7XG4gIH0gZWxzZSBpZiAoc291cmNlID09PSAnY29uZmlnJykge1xuICAgIHNvdXJjZUxhYmVsID0gJ1NvdXJjZTogY29uZmlnLnlhbWwnO1xuICAgIHRvb2x0aXBUZXh0ID0gJ1N0b3JlZCBpbiBjb25maWcueWFtbC4gVXBkYXRlIGl0IHVzaW5nIHRoZSBpbnB1dCBiZWxvdy4nO1xuICB9XG5cbiAgY29uc3QgaW5mb0ljb24gPSB0b29sdGlwVGV4dFxuICAgID8gYCA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiB0aXRsZT1cIiR7ZXNjYXBlSHRtbCh0b29sdGlwVGV4dCl9XCIgYXJpYS1sYWJlbD1cIldoZXJlIGlzIHRoaXMga2V5IHN0b3JlZD9cIiBgICtcbiAgICAgIGBzdHlsZT1cImJhY2tncm91bmQ6bm9uZTtib3JkZXI6bm9uZTtjdXJzb3I6aGVscDtjb2xvcjojNjQ3NDhiO2ZvbnQtc2l6ZTowLjg1ZW07cGFkZGluZzowIDJweDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7bGluZS1oZWlnaHQ6MTtcIj5cdTI0RDg8L2J1dHRvbj5gXG4gICAgOiAnJztcblxuICBjb25zdCBzb3VyY2VMYWJlbEh0bWwgPSBzb3VyY2VMYWJlbFxuICAgID8gYDxzcGFuIHN0eWxlPVwibWFyZ2luLWxlZnQ6MTBweDtmb250LXNpemU6MC44ZW07Y29sb3I6JHtpc0xvY2tlZCA/ICcjYjQ1MzA5JyA6ICcjNjQ3NDhiJ307XCI+JHtlc2NhcGVIdG1sKHNvdXJjZUxhYmVsKX0ke2luZm9JY29ufTwvc3Bhbj5gXG4gICAgOiAnJztcblxuICAvLyBBbWJlciB3YXJuaW5nIHdoZW4gYSBsb2NrZWQgc291cmNlIGV4aXN0cyBcdTIwMTQgaW5wdXQgcmVtYWlucyBlbmFibGVkIHNvIHRoZVxuICAvLyB1c2VyIGNhbiBzYXZlIGEgc2Vzc2lvbi9jb25maWcgb3ZlcnJpZGUsIGJ1dCB0aGUgcHJlY2VkZW5jZSBydWxlIGlzIGNsZWFyLlxuICBjb25zdCBzb3VyY2VEZXNjID0gc291cmNlID09PSAnZW52JyA/ICdlbnZpcm9ubWVudCB2YXJpYWJsZScgOiAnLmVudiBmaWxlJztcbiAgY29uc3Qgc291cmNlUmVmICA9IGVudlZhclxuICAgID8gYCR7c291cmNlRGVzY30gPGNvZGU+JHtlc2NhcGVIdG1sKGVudlZhcil9PC9jb2RlPmBcbiAgICA6IHNvdXJjZURlc2M7XG4gIGNvbnN0IGxvY2tlZFdhcm5IdG1sID0gaXNMb2NrZWRcbiAgICA/IGA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZmVmM2M3O2JvcmRlcjoxcHggc29saWQgI2Y1OWUwYjtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjhweCAxMnB4O21hcmdpbjo4cHggMDtmb250LXNpemU6MC44NWVtO2NvbG9yOiM5MjQwMGU7XCI+YCArXG4gICAgICBgXHUyNkEwIFRoaXMga2V5IGlzIGxvYWRlZCBmcm9tIHRoZSA8c3Ryb25nPiR7c291cmNlUmVmfTwvc3Ryb25nPi4gYCArXG4gICAgICBgQW55IHZhbHVlIHNhdmVkIGJlbG93IHRha2VzIGVmZmVjdCBpbW1lZGlhdGVseSBmb3IgdGhlIGN1cnJlbnQgc2Vzc2lvbiwgYnV0IHdpbGwgYmUgYCArXG4gICAgICBgPHN0cm9uZz5vdmVycmlkZGVuIGJ5IHRoZSAke3NvdXJjZURlc2N9IHdoZW4gdGhlIHNlcnZlciByZXN0YXJ0cyBvciByZWxvYWRzPC9zdHJvbmc+LjwvZGl2PmBcbiAgICA6ICcnO1xuXG4gIGNvbnN0IGdldEtleUxpbmsgPSBnZXRLZXlVcmxcbiAgICA/IGA8YSBocmVmPVwiJHtlc2NhcGVIdG1sKGdldEtleVVybCl9XCIgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiIHN0eWxlPVwiY29sb3I6IzI1NjNlYjtcIj5HZXQgeW91ciBrZXkgJiM4NTk5OzwvYT5gXG4gICAgOiAnJztcblxuICBjb250ZW50LmlubmVySFRNTCA9XG4gICAgYDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjEwcHg7XCI+YCArXG4gICAgYCAgPHN0cm9uZz4ke2VzY2FwZUh0bWwobGFiZWwpfTwvc3Ryb25nPiAke2lzU2V0QmFkZ2V9JHtzb3VyY2VMYWJlbEh0bWx9YCArXG4gICAgKGdldEtleUxpbmsgPyBgICA8c3BhbiBzdHlsZT1cIm1hcmdpbi1sZWZ0OjEwcHg7XCI+JHtnZXRLZXlMaW5rfTwvc3Bhbj5gIDogJycpICtcbiAgICBgPC9kaXY+YCArXG4gICAgKGhlbHBUZXh0ID8gYDxwIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtjb2xvcjojNDc1NTY5O21hcmdpbjowIDAgMTJweDtcIj4ke2VzY2FwZUh0bWwoaGVscFRleHQpfTwvcD5gIDogJycpICtcbiAgICBsb2NrZWRXYXJuSHRtbDtcblxuICBpZiAoYXV0aFR5cGUgPT09ICdhcGlfa2V5Jykge1xuICAgIGlmIChrZXlQYW5lbCkge1xuICAgICAga2V5UGFuZWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgaWYgKGtleUlucHV0KSB7XG4gICAgICAgIC8vIEFsd2F5cyBlbmFibGUgaW5wdXQgXHUyMDE0IHVzZXIgY2FuIHNhdmUgYSBuZXcgdmFsdWUgZXZlbiB3aGVuIGVudi9kb3RlbnYgaXMgdGhlIGN1cnJlbnRcbiAgICAgICAgLy8gc291cmNlLiBUaGUgd2FybmluZyBiYW5uZXIgYWJvdmUgY29tbXVuaWNhdGVzIHRoZSByZXN0YXJ0LXByZWNlZGVuY2UgYmVoYXZpb3VyLlxuICAgICAgICBrZXlJbnB1dC5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICBrZXlJbnB1dC5zdHlsZS5vcGFjaXR5ID0gJyc7XG4gICAgICAgIGtleUlucHV0LnBsYWNlaG9sZGVyID0gaXNTZXQgPyAnRW50ZXIgbmV3IGtleSB0byByZXBsYWNlIHRoZSBzYXZlZCBvbmUnIDogJ1Bhc3RlIHlvdXIgQVBJIGtleSBoZXJlJztcbiAgICAgICAga2V5SW5wdXQuZGF0YXNldC5wcm92aWRlciA9IHByb3ZpZGVyO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChhdXRoVHlwZSA9PT0gJ2RldmljZV9mbG93Jykge1xuICAgIGlmIChkZXZQYW5lbCkge1xuICAgICAgZGV2UGFuZWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgYXdhaXQgX3JlZnJlc2hDb3BpbG90QXV0aFN0YXR1cygpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChhdXRoVHlwZSA9PT0gJ2NsaScpIHtcbiAgICBjb250ZW50LmlubmVySFRNTCArPVxuICAgICAgYDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmMGZkZjQ7Ym9yZGVyOjFweCBzb2xpZCAjYmJmN2QwO2JvcmRlci1yYWRpdXM6NnB4O3BhZGRpbmc6MTBweCAxNHB4O2ZvbnQtc2l6ZTowLjg4ZW07XCI+YCArXG4gICAgICBgPHAgc3R5bGU9XCJtYXJnaW46MCAwIDZweDtcIj5SdW4gdGhpcyBjb21tYW5kIGluIGEgdGVybWluYWwsIHRoZW4gcmV0dXJuIGhlcmUgYW5kIGNsaWNrIDxzdHJvbmc+TmV4dDwvc3Ryb25nPjo8L3A+YCArXG4gICAgICBgPGNvZGUgc3R5bGU9XCJmb250LXNpemU6MWVtO1wiPmdoIGF1dGggbG9naW48L2NvZGU+PC9kaXY+YDtcbiAgfSBlbHNlIHtcbiAgICBjb250ZW50LmlubmVySFRNTCArPVxuICAgICAgYDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmOGZhZmM7Ym9yZGVyOjFweCBzb2xpZCAjZTJlOGYwO2JvcmRlci1yYWRpdXM6NnB4O3BhZGRpbmc6MTBweCAxNHB4O2ZvbnQtc2l6ZTowLjg4ZW07Y29sb3I6IzQ3NTU2OTtcIj5gICtcbiAgICAgIGBObyBhdXRoZW50aWNhdGlvbiByZXF1aXJlZCBmb3IgdGhpcyBwcm92aWRlci48L2Rpdj5gO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9yZWZyZXNoQ29waWxvdEF1dGhTdGF0dXMoKSB7XG4gIGNvbnN0IHN0YXR1c0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLWF1dGgtc3RhdHVzJyk7XG4gIGNvbnN0IHN0YXJ0QnRuICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1hdXRoLXN0YXJ0LWJ0bicpO1xuICBjb25zdCBsb2dvdXRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtYXV0aC1sb2dvdXQtYnRuJyk7XG4gIGNvbnN0IGNvZGVFbCAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1hdXRoLWNvZGUnKTtcbiAgY29uc3QgbGlua0VsICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLWF1dGgtbGluaycpO1xuICBpZiAoIXN0YXR1c0VsKSByZXR1cm47XG5cbiAgaWYgKGNvZGVFbCkgIGNvZGVFbC50ZXh0Q29udGVudCA9ICcnO1xuICBpZiAobGlua0VsKSAgbGlua0VsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBzdCA9IGF3YWl0IGZldGNoKCcvYXBpL2NvcGlsb3QtYXV0aC9zdGF0dXMnKS50aGVuKChyZXMpID0+IHJlcy5qc29uKCkpO1xuICAgIGlmIChzdC5hdXRoZW50aWNhdGVkKSB7XG4gICAgICBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICdBdXRoZW50aWNhdGVkIHdpdGggR2l0SHViIENvcGlsb3QuJztcbiAgICAgIGlmIChzdGFydEJ0bikgc3RhcnRCdG4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIGlmIChsb2dvdXRCdG4pIGxvZ291dEJ0bi5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICBfdXBkYXRlTGxtU3RhdHVzUGlsbCgnYXV0aGVudGljYXRlZCcsICdDb3BpbG90IHJlYWR5Jyk7XG4gICAgfSBlbHNlIGlmIChzdC5wb2xsaW5nKSB7XG4gICAgICBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICdXYWl0aW5nIGZvciBkZXZpY2UgYXBwcm92YWxcdTIwMjYnO1xuICAgICAgaWYgKHN0YXJ0QnRuKSBzdGFydEJ0bi5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICBpZiAobG9nb3V0QnRuKSBsb2dvdXRCdG4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIF91cGRhdGVMbG1TdGF0dXNQaWxsKCdwb2xsaW5nJywgJ0NvcGlsb3QgYXV0aCBwZW5kaW5nJywgJ1x1MjlENycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICdOb3QgYXV0aGVudGljYXRlZC4gU3RhcnQgc2lnbi1pbiB0byBlbmFibGUgQ29waWxvdCBPQXV0aC4nO1xuICAgICAgaWYgKHN0YXJ0QnRuKSBzdGFydEJ0bi5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICBpZiAobG9nb3V0QnRuKSBsb2dvdXRCdG4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIF91cGRhdGVMbG1TdGF0dXNQaWxsKCd1bmF1dGhlbnRpY2F0ZWQnLCAnQ29waWxvdCBub3QgYXV0aGVudGljYXRlZCcpO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnVW5hYmxlIHRvIGxvYWQgYXV0aCBzdGF0dXMuJztcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBzYXZlUHJvdmlkZXJBcGlLZXkoKSB7XG4gIGNvbnN0IGtleUlucHV0ICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1hdXRoLWtleS1pbnB1dCcpO1xuICBjb25zdCBrZXlTdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtYXV0aC1rZXktc3RhdHVzJyk7XG4gIGNvbnN0IHByb3ZpZGVyICA9IGtleUlucHV0Py5kYXRhc2V0Py5wcm92aWRlciB8fCBfbW9kZWxXaXphcmRTZWxlY3RlZFByb3ZpZGVyO1xuICBjb25zdCB2YWx1ZSAgICAgPSAoa2V5SW5wdXQ/LnZhbHVlIHx8ICcnKS50cmltKCk7XG5cbiAgaWYgKCF2YWx1ZSkge1xuICAgIGlmIChrZXlTdGF0dXMpIHsga2V5U3RhdHVzLnRleHRDb250ZW50ID0gJ1BsZWFzZSBlbnRlciBhIGtleSB2YWx1ZS4nOyBrZXlTdGF0dXMuc3R5bGUuY29sb3IgPSAnI2I5MWMxYyc7IH1cbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCFwcm92aWRlcikge1xuICAgIGlmIChrZXlTdGF0dXMpIHsga2V5U3RhdHVzLnRleHRDb250ZW50ID0gJ05vIHByb3ZpZGVyIHNlbGVjdGVkLic7IGtleVN0YXR1cy5zdHlsZS5jb2xvciA9ICcjYjkxYzFjJzsgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChrZXlTdGF0dXMpIHsga2V5U3RhdHVzLnRleHRDb250ZW50ID0gJ1NhdmluZ1x1MjAyNic7IGtleVN0YXR1cy5zdHlsZS5jb2xvciA9ICcjNDc1NTY5JzsgfVxuICB0cnkge1xuICAgIGF3YWl0IGFwaUNhbGwoJ1BPU1QnLCAnL2FwaS9zZXR0aW5ncy9jcmVkZW50aWFscycsIHsgcHJvdmlkZXIsIGtleV92YWx1ZTogdmFsdWUgfSk7XG4gICAgaWYgKGtleUlucHV0KSAga2V5SW5wdXQudmFsdWUgPSAnJztcbiAgICBpZiAoa2V5U3RhdHVzKSB7XG4gICAgICBrZXlTdGF0dXMudGV4dENvbnRlbnQgPSAnS2V5IHNhdmVkIHN1Y2Nlc3NmdWxseS4nO1xuICAgICAga2V5U3RhdHVzLnN0eWxlLmNvbG9yID0gJyMwNjVmNDYnO1xuICAgIH1cbiAgICAvLyBSZS1yZW5kZXIgYmFkZ2UgdG8gc2hvdyBrZXkgaXMgbm93IHNldFxuICAgIGF3YWl0IF9yZW5kZXJBdXRoU3RlcChwcm92aWRlcik7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoa2V5U3RhdHVzKSB7IGtleVN0YXR1cy50ZXh0Q29udGVudCA9IGBFcnJvcjogJHtlLm1lc3NhZ2UgfHwgZX1gOyBrZXlTdGF0dXMuc3R5bGUuY29sb3IgPSAnI2I5MWMxYyc7IH1cbiAgfVxufVxuXG5mdW5jdGlvbiB0b2dnbGVBcGlLZXlWaXNpYmlsaXR5KCkge1xuICBjb25zdCBpbnB1dCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtYXV0aC1rZXktaW5wdXQnKTtcbiAgY29uc3QgdG9nZ2xlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLWF1dGgta2V5LXRvZ2dsZScpO1xuICBpZiAoIWlucHV0KSByZXR1cm47XG4gIGNvbnN0IGlzSGlkZGVuID0gaW5wdXQudHlwZSA9PT0gJ3Bhc3N3b3JkJztcbiAgaW5wdXQudHlwZSA9IGlzSGlkZGVuID8gJ3RleHQnIDogJ3Bhc3N3b3JkJztcbiAgaWYgKHRvZ2dsZSkgdG9nZ2xlLnRleHRDb250ZW50ID0gaXNIaWRkZW4gPyAnXHVEODNEXHVERTQ4JyA6ICdcdUQ4M0RcdURDNDEnO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzdGFydENvcGlsb3RBdXRoRnJvbVdpemFyZCgpIHtcbiAgY29uc3Qgc3RhdHVzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtYXV0aC1zdGF0dXMnKTtcbiAgY29uc3QgY29kZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLWF1dGgtY29kZScpO1xuICBjb25zdCBsaW5rRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtYXV0aC1saW5rJyk7XG4gIGlmICghc3RhdHVzRWwgfHwgIWNvZGVFbCB8fCAhbGlua0VsKSByZXR1cm47XG5cbiAgX3Nob3dNb2RlbFdpemFyZEJ1c3koJ1N0YXJ0aW5nIEdpdEh1YiBkZXZpY2UgYXV0aG9yaXphdGlvbi4uLicpO1xuICB0cnkge1xuICAgIGNvbnN0IGZsb3dSZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9jb3BpbG90LWF1dGgvc3RhcnQnLCB7IG1ldGhvZDogJ1BPU1QnIH0pO1xuICAgIGlmICghZmxvd1Jlcy5vaykgdGhyb3cgbmV3IEVycm9yKGF3YWl0IGZsb3dSZXMudGV4dCgpKTtcbiAgICBjb25zdCBmbG93ID0gYXdhaXQgZmxvd1Jlcy5qc29uKCk7XG5cbiAgICBjb2RlRWwudGV4dENvbnRlbnQgPSBmbG93LnVzZXJfY29kZSB8fCAnJztcbiAgICBsaW5rRWwuaHJlZiA9IGZsb3cudmVyaWZpY2F0aW9uX3VyaSB8fCAnaHR0cHM6Ly9naXRodWIuY29tL2xvZ2luL2RldmljZSc7XG4gICAgbGlua0VsLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICdPcGVuIEdpdEh1YiwgZW50ZXIgdGhlIGNvZGUsIHRoZW4gcmV0dXJuIGhlcmUuJztcbiAgICB3aW5kb3cub3BlbihsaW5rRWwuaHJlZiwgJ19ibGFuaycpO1xuXG4gICAgYXdhaXQgZmV0Y2goJy9hcGkvY29waWxvdC1hdXRoL3BvbGwnLCB7IG1ldGhvZDogJ1BPU1QnIH0pO1xuICAgIF91cGRhdGVMbG1TdGF0dXNQaWxsKCdwb2xsaW5nJywgJ0NvcGlsb3QgYXV0aCBwZW5kaW5nJywgJ1x1MjlENycpO1xuICAgIGlmIChfY29waWxvdEF1dGhQb2xsVGltZXIpIGNsZWFySW50ZXJ2YWwoX2NvcGlsb3RBdXRoUG9sbFRpbWVyKTtcbiAgICBfY29waWxvdEF1dGhQb2xsVGltZXIgPSBzZXRJbnRlcnZhbChhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzdCA9IGF3YWl0IGZldGNoKCcvYXBpL2NvcGlsb3QtYXV0aC9zdGF0dXMnKS50aGVuKChyZXMpID0+IHJlcy5qc29uKCkpO1xuICAgICAgICBpZiAoc3QuYXV0aGVudGljYXRlZCkge1xuICAgICAgICAgIGNsZWFySW50ZXJ2YWwoX2NvcGlsb3RBdXRoUG9sbFRpbWVyKTtcbiAgICAgICAgICBfY29waWxvdEF1dGhQb2xsVGltZXIgPSBudWxsO1xuICAgICAgICAgIGF3YWl0IF9yZWZyZXNoQ29waWxvdEF1dGhTdGF0dXMoKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIGtlZXAgcG9sbGluZyBzaWxlbnRseSB1bnRpbCBjbG9zZVxuICAgICAgfVxuICAgIH0sIDUwMDApO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHN0YXR1c0VsLnRleHRDb250ZW50ID0gYEF1dGggc3RhcnQgZmFpbGVkOiAke2Vycm9yLm1lc3NhZ2UgfHwgZXJyb3J9YDtcbiAgfSBmaW5hbGx5IHtcbiAgICBfaGlkZU1vZGVsV2l6YXJkQnVzeSgpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxvZ291dENvcGlsb3RBdXRoRnJvbVdpemFyZCgpIHtcbiAgYXdhaXQgZmV0Y2goJy9hcGkvY29waWxvdC1hdXRoL2xvZ291dCcsIHsgbWV0aG9kOiAnUE9TVCcgfSk7XG4gIGF3YWl0IF9yZWZyZXNoQ29waWxvdEF1dGhTdGF0dXMoKTtcbn1cblxuZnVuY3Rpb24gX3dpcmVHbG9iYWxNb2RlbFNlYXJjaCgpIHtcbiAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtZ2xvYmFsLXNlYXJjaCcpO1xuICBpZiAoIWlucHV0KSByZXR1cm47XG4gIGlucHV0Lm9uaW5wdXQgPSAoKSA9PiB7XG4gICAgaWYgKF9tb2RlbERhdGFUYWJsZSAmJiB0eXBlb2YgX21vZGVsRGF0YVRhYmxlLnNlYXJjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgX21vZGVsRGF0YVRhYmxlLnNlYXJjaChpbnB1dC52YWx1ZSB8fCAnJykuZHJhdygpO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gX3JlbmRlclByb3ZpZGVyU2VsZWN0b3IoKSB7XG4gIGNvbnN0IGxpc3RFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1wcm92aWRlci1saXN0Jyk7XG4gIGlmICghbGlzdEVsIHx8ICFfbW9kZWxEYXRhKSByZXR1cm47XG5cbiAgY29uc3QgcHJvdmlkZXJzID0gQXJyYXkuaXNBcnJheShfbW9kZWxEYXRhLnByb3ZpZGVycylcbiAgICA/IF9tb2RlbERhdGEucHJvdmlkZXJzXG4gICAgOiBBcnJheS5mcm9tKG5ldyBTZXQoKF9tb2RlbERhdGEuYWxsX21vZGVscyB8fCBbXSkubWFwKHIgPT4gci5wcm92aWRlcikuZmlsdGVyKEJvb2xlYW4pKSkuc29ydCgpO1xuICBjb25zdCBjYXBhYmxlU2V0ID0gbmV3IFNldChfbW9kZWxEYXRhLmxpc3RfbW9kZWxzX2NhcGFibGUgfHwgW10pO1xuXG4gIGlmICghX21vZGVsV2l6YXJkU2VsZWN0ZWRQcm92aWRlcikge1xuICAgIF9tb2RlbFdpemFyZFNlbGVjdGVkUHJvdmlkZXIgPSBfbW9kZWxEYXRhLnByb3ZpZGVyIHx8IHByb3ZpZGVyc1swXSB8fCBudWxsO1xuICB9XG4gIGlmIChfbW9kZWxXaXphcmRTZWxlY3RlZFByb3ZpZGVyKSB7XG4gICAgX3NlbGVjdGVkTW9kZWxQcm92aWRlcnMgPSBuZXcgU2V0KFtfbW9kZWxXaXphcmRTZWxlY3RlZFByb3ZpZGVyXSk7XG4gIH1cblxuICAvLyBEaXNwb3NlIGFueSBleGlzdGluZyBCUzUgcG9wb3ZlcnMgYmVmb3JlIGNsZWFyaW5nIHRoZSBsaXN0LlxuICBsaXN0RWwucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtYnMtdG9nZ2xlPVwicG9wb3ZlclwiXScpLmZvckVhY2goZWwgPT4ge1xuICAgIHdpbmRvdy5ib290c3RyYXA/LlBvcG92ZXI/LmdldEluc3RhbmNlKGVsKT8uZGlzcG9zZSgpO1xuICB9KTtcblxuICBsaXN0RWwuaW5uZXJIVE1MID0gJyc7XG4gIHByb3ZpZGVycy5mb3JFYWNoKHByb3ZpZGVyID0+IHtcbiAgICBjb25zdCBjaGVja2VkID0gcHJvdmlkZXIgPT09IF9tb2RlbFdpemFyZFNlbGVjdGVkUHJvdmlkZXI7XG4gICAgY29uc3Qgc291cmNlTGFiZWwgPSBfcHJvdmlkZXJTdGFnZUxhYmVsKHByb3ZpZGVyLCBjYXBhYmxlU2V0KTtcbiAgICBjb25zdCBpbmZvID0gZ2V0UHJvdmlkZXJJbmZvKHByb3ZpZGVyKTtcblxuICAgIGNvbnN0IGxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGFiZWwnKTtcbiAgICBsYWJlbC5zdHlsZS5jc3NUZXh0ID0gJ2Rpc3BsYXk6ZmxleDsgYWxpZ24taXRlbXM6Y2VudGVyOyBnYXA6NnB4OyBwYWRkaW5nOjRweCA4cHg7IGJvcmRlcjoxcHggc29saWQgI2NiZDVlMTsgYm9yZGVyLXJhZGl1czo5OTlweDsgZm9udC1zaXplOjAuODJlbTsgYmFja2dyb3VuZDojZmZmOyBjdXJzb3I6cG9pbnRlcjsnO1xuICAgIGxhYmVsLmlubmVySFRNTCA9XG4gICAgICBgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJtb2RlbC1wcm92aWRlci1jaG9pY2VcIiB2YWx1ZT1cIiR7ZXNjYXBlSHRtbChwcm92aWRlcil9XCIgJHtjaGVja2VkID8gJ2NoZWNrZWQnIDogJyd9IHN0eWxlPVwibWFyZ2luOjA7XCIgLz5gICtcbiAgICAgIGA8c3Bhbj4ke2VzY2FwZUh0bWwoX3Byb3ZpZGVyRGlzcGxheUxhYmVsKHByb3ZpZGVyKSl9PC9zcGFuPmAgK1xuICAgICAgYDxzcGFuIHN0eWxlPVwiY29sb3I6IzY0NzQ4YjsgZm9udC1zaXplOjAuOGVtO1wiPigke2VzY2FwZUh0bWwoc291cmNlTGFiZWwpfSk8L3NwYW4+YDtcblxuICAgIC8vIEFwcGVuZCBhIFx1MjREOCBidXR0b24gd2lyZWQgdG8gYSBCUzUgSFRNTCBwb3BvdmVyIHNvIGxpbmtzIGluc2lkZSBhcmUgY2xpY2thYmxlLlxuICAgIGlmIChpbmZvKSB7XG4gICAgICBjb25zdCBidG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICAgIGJ0bi50eXBlID0gJ2J1dHRvbic7XG4gICAgICBidG4uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgJ1Byb3ZpZGVyIGluZm8nKTtcbiAgICAgIGJ0bi5zZXRBdHRyaWJ1dGUoJ2RhdGEtYnMtdG9nZ2xlJywgJ3BvcG92ZXInKTtcbiAgICAgIGJ0bi5zZXRBdHRyaWJ1dGUoJ2RhdGEtYnMtdHJpZ2dlcicsICdjbGljaycpO1xuICAgICAgYnRuLnNldEF0dHJpYnV0ZSgnZGF0YS1icy1wbGFjZW1lbnQnLCAncmlnaHQnKTtcbiAgICAgIGJ0bi5zZXRBdHRyaWJ1dGUoJ2RhdGEtYnMtaHRtbCcsICd0cnVlJyk7XG4gICAgICBidG4uc2V0QXR0cmlidXRlKCdkYXRhLWJzLWNvbnRhaW5lcicsICdib2R5Jyk7XG4gICAgICBidG4uc2V0QXR0cmlidXRlKCdkYXRhLWJzLWNvbnRlbnQnLCBwcm92aWRlckluZm9Qb3BvdmVyQ29udGVudChpbmZvKSk7XG4gICAgICBidG4uc3R5bGUuY3NzVGV4dCA9ICdiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOm5vbmU7Y3Vyc29yOnBvaW50ZXI7Y29sb3I6IzY0NzQ4Yjtmb250LXNpemU6MC45ZW07cGFkZGluZzowIDFweDtsaW5lLWhlaWdodDoxO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTsnO1xuICAgICAgYnRuLnRleHRDb250ZW50ID0gJ1x1MjREOCc7XG4gICAgICAvLyBQcmV2ZW50IHRoZSByYWRpby1sYWJlbCBjbGljayBmcm9tIHByb3BhZ2F0aW5nIHRvIHRoZSByYWRpbyBidXR0b24uXG4gICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBlID0+IGUuc3RvcFByb3BhZ2F0aW9uKCkpO1xuICAgICAgbGFiZWwuYXBwZW5kQ2hpbGQoYnRuKTtcblxuICAgICAgLy8gSW5pdGlhbGlzZSBhZnRlciBhcHBlbmQgXHUyMDE0IEJTNSBtdXN0IGZpbmQgdGhlIGVsZW1lbnQgaW4gdGhlIERPTS5cbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIGlmICh3aW5kb3cuYm9vdHN0cmFwPy5Qb3BvdmVyKSB7XG4gICAgICAgICAgbmV3IHdpbmRvdy5ib290c3RyYXAuUG9wb3ZlcihidG4sIHsgc2FuaXRpemU6IGZhbHNlIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBjaGVja2JveCA9IGxhYmVsLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7XG4gICAgY2hlY2tib3guYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgaWYgKCFjaGVja2JveC5jaGVja2VkKSByZXR1cm47XG4gICAgICBfbW9kZWxXaXphcmRTZWxlY3RlZFByb3ZpZGVyID0gcHJvdmlkZXI7XG4gICAgICBfc2VsZWN0ZWRNb2RlbFByb3ZpZGVycyA9IG5ldyBTZXQoW3Byb3ZpZGVyXSk7XG4gICAgICBfdXBkYXRlTW9kZWxXaXphcmROYXYoKTtcbiAgICB9KTtcblxuICAgIGxpc3RFbC5hcHBlbmRDaGlsZChsYWJlbCk7XG4gIH0pO1xuXG4gIF91cGRhdGVNb2RlbFdpemFyZE5hdigpO1xufVxuXG5mdW5jdGlvbiBfc2hvd01vZGVsV2l6YXJkQnVzeShtZXNzYWdlKSB7XG4gIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtd2l6YXJkLWJ1c3ktb3ZlcmxheScpO1xuICBjb25zdCBtZXNzYWdlRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtd2l6YXJkLWJ1c3ktbWVzc2FnZScpO1xuICBpZiAobWVzc2FnZUVsKSBtZXNzYWdlRWwudGV4dENvbnRlbnQgPSBtZXNzYWdlIHx8ICdXb3JraW5nLi4uJztcbiAgaWYgKG92ZXJsYXkpIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICdmbGV4Jztcbn1cblxuZnVuY3Rpb24gX2hpZGVNb2RlbFdpemFyZEJ1c3koKSB7XG4gIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtd2l6YXJkLWJ1c3ktb3ZlcmxheScpO1xuICBpZiAob3ZlcmxheSkgb3ZlcmxheS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xufVxuXG5mdW5jdGlvbiBfc2V0TW9kZWxXaXphcmRTdGVwKHN0ZXApIHtcbiAgX21vZGVsV2l6YXJkU3RlcCA9IFsxLCAyLCAzLCA0XS5pbmNsdWRlcyhzdGVwKSA/IHN0ZXAgOiAxO1xuICBjb25zdCBwYW5lcyA9IHtcbiAgICAxOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtc3RlcC1wcm92aWRlcicpLFxuICAgIDI6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1zdGVwLWF1dGgnKSxcbiAgICAzOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtc3RlcC1tb2RlbHMnKSxcbiAgICA0OiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtc3RlcC1zdWNjZXNzJyksXG4gIH07XG4gIE9iamVjdC5lbnRyaWVzKHBhbmVzKS5mb3JFYWNoKChbbnVtLCBlbF0pID0+IHtcbiAgICBpZiAoZWwpIGVsLnN0eWxlLmRpc3BsYXkgPSBOdW1iZXIobnVtKSA9PT0gX21vZGVsV2l6YXJkU3RlcCA/ICcnIDogJ25vbmUnO1xuICB9KTtcbiAgaWYgKF9tb2RlbFdpemFyZFN0ZXAgPT09IDIpIHtcbiAgICBfcmVuZGVyQXV0aFN0ZXAoX21vZGVsV2l6YXJkU2VsZWN0ZWRQcm92aWRlcik7XG4gIH1cbiAgX3VwZGF0ZU1vZGVsV2l6YXJkTmF2KCk7XG59XG5cbmZ1bmN0aW9uIF91cGRhdGVNb2RlbFdpemFyZFByb2dyZXNzQmFyKCkge1xuICBbMSwgMiwgMywgNF0uZm9yRWFjaCgoc3RlcE51bSkgPT4ge1xuICAgIGNvbnN0IHN0ZXBFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBtb2RlbC1wcm9ncmVzcy1zdGVwLSR7c3RlcE51bX1gKTtcbiAgICBpZiAoIXN0ZXBFbCkgcmV0dXJuO1xuICAgIGNvbnN0IGJhZGdlRWwgPSBzdGVwRWwucXVlcnlTZWxlY3RvcignLm1vZGVsLXByb2dyZXNzLWJhZGdlJyk7XG4gICAgc3RlcEVsLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWFjdGl2ZScsICdpcy1jb21wbGV0ZScsICdpcy11cGNvbWluZycpO1xuICAgIGlmIChzdGVwTnVtIDwgX21vZGVsV2l6YXJkU3RlcCkge1xuICAgICAgc3RlcEVsLmNsYXNzTGlzdC5hZGQoJ2lzLWNvbXBsZXRlJyk7XG4gICAgICBzdGVwRWwuc2V0QXR0cmlidXRlKCdhcmlhLWN1cnJlbnQnLCAnZmFsc2UnKTtcbiAgICAgIGlmIChiYWRnZUVsKSBiYWRnZUVsLnRleHRDb250ZW50ID0gJ1x1MjcxMyc7XG4gICAgfSBlbHNlIGlmIChzdGVwTnVtID09PSBfbW9kZWxXaXphcmRTdGVwKSB7XG4gICAgICBzdGVwRWwuY2xhc3NMaXN0LmFkZCgnaXMtYWN0aXZlJyk7XG4gICAgICBzdGVwRWwuc2V0QXR0cmlidXRlKCdhcmlhLWN1cnJlbnQnLCAnc3RlcCcpO1xuICAgICAgaWYgKGJhZGdlRWwpIGJhZGdlRWwudGV4dENvbnRlbnQgPSBTdHJpbmcoc3RlcE51bSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ZXBFbC5jbGFzc0xpc3QuYWRkKCdpcy11cGNvbWluZycpO1xuICAgICAgc3RlcEVsLnNldEF0dHJpYnV0ZSgnYXJpYS1jdXJyZW50JywgJ2ZhbHNlJyk7XG4gICAgICBpZiAoYmFkZ2VFbCkgYmFkZ2VFbC50ZXh0Q29udGVudCA9IFN0cmluZyhzdGVwTnVtKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBfdXBkYXRlTW9kZWxXaXphcmROYXYoKSB7XG4gIGNvbnN0IHN0ZXBMYWJlbCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtd2l6YXJkLXN0ZXAtbGFiZWwnKTtcbiAgY29uc3QgYmFja0J0biAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC13aXphcmQtYmFjay1idG4nKTtcbiAgY29uc3QgbmV4dEJ0biAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC13aXphcmQtbmV4dC1idG4nKTtcbiAgY29uc3QgdGVzdEJ0biAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC10ZXN0LWJ0bicpO1xuICBjb25zdCByZWZyZXNoQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ByaWNpbmctcmVmcmVzaC1idG4nKTtcbiAgY29uc3QgZm9vdGVyICAgICA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5tb2RlbC13aXphcmQtZm9vdGVyJyk7XG5cbiAgX3VwZGF0ZU1vZGVsV2l6YXJkUHJvZ3Jlc3NCYXIoKTtcblxuICBpZiAoc3RlcExhYmVsKSB7XG4gICAgY29uc3QgbGFiZWxzID0ge1xuICAgICAgMTogJ1N0ZXAgMSBvZiA0OiBDaG9vc2UgcHJvdmlkZXInLFxuICAgICAgMjogJ1N0ZXAgMiBvZiA0OiBTZXQgdXAgYXV0aGVudGljYXRpb24nLFxuICAgICAgMzogJ1N0ZXAgMyBvZiA0OiBDaG9vc2UgbW9kZWwgYW5kIHRlc3QgY29ubmVjdGlvbicsXG4gICAgICA0OiAnU3RlcCA0IG9mIDQ6IENvbXBsZXRlJyxcbiAgICB9O1xuICAgIHN0ZXBMYWJlbC50ZXh0Q29udGVudCA9IGxhYmVsc1tfbW9kZWxXaXphcmRTdGVwXSB8fCAnJztcbiAgfVxuXG4gIGlmIChiYWNrQnRuKSB7XG4gICAgYmFja0J0bi5kaXNhYmxlZCA9IF9tb2RlbFdpemFyZFN0ZXAgPT09IDE7XG4gICAgYmFja0J0bi5zdHlsZS5kaXNwbGF5ID0gX21vZGVsV2l6YXJkU3RlcCA9PT0gNCA/ICdub25lJyA6ICcnO1xuICB9XG4gIC8vIE5leHQgYnV0dG9uOiB2aXNpYmxlIG9uIHN0ZXBzIDEgYW5kIDJcbiAgaWYgKG5leHRCdG4pIHtcbiAgICBuZXh0QnRuLnN0eWxlLmRpc3BsYXkgPSAoX21vZGVsV2l6YXJkU3RlcCA9PT0gMSB8fCBfbW9kZWxXaXphcmRTdGVwID09PSAyKSA/ICcnIDogJ25vbmUnO1xuICAgIG5leHRCdG4uZGlzYWJsZWQgPSBfbW9kZWxXaXphcmRTdGVwID09PSAxICYmICFfbW9kZWxXaXphcmRTZWxlY3RlZFByb3ZpZGVyO1xuICAgIG5leHRCdG4udGV4dENvbnRlbnQgPSBfbW9kZWxXaXphcmRTdGVwID09PSAyID8gJ05leHQnIDogJ05leHQnO1xuICB9XG4gIGlmICh0ZXN0QnRuKSAgICB0ZXN0QnRuLnN0eWxlLmRpc3BsYXkgICAgPSBfbW9kZWxXaXphcmRTdGVwID09PSAzID8gJycgOiAnbm9uZSc7XG4gIGlmIChyZWZyZXNoQnRuKSByZWZyZXNoQnRuLnN0eWxlLmRpc3BsYXkgPSBfbW9kZWxXaXphcmRTdGVwID09PSAzID8gJycgOiAnbm9uZSc7XG4gIGlmIChmb290ZXIpIGZvb3Rlci5zdHlsZS5qdXN0aWZ5Q29udGVudCAgPSBfbW9kZWxXaXphcmRTdGVwID09PSA0ID8gJ2NlbnRlcicgOiAnc3BhY2UtYmV0d2Vlbic7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9sb2FkTW9kZWxzRm9yU2VsZWN0ZWRQcm92aWRlcigpIHtcbiAgaWYgKCFfbW9kZWxXaXphcmRTZWxlY3RlZFByb3ZpZGVyKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgbG9hZGluZ0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLW1vZGVscy1sb2FkaW5nJyk7XG4gIGlmIChsb2FkaW5nRWwpIHtcbiAgICBsb2FkaW5nRWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgIGxvYWRpbmdFbC5zdHlsZS5jb2xvciA9ICcjNDc1NTY5JztcbiAgICBsb2FkaW5nRWwuaW5uZXJIVE1MID0gJzxzcGFuIGNsYXNzPVwibG9hZGluZy1zcGlubmVyXCIgc3R5bGU9XCJ3aWR0aDoxNHB4O2hlaWdodDoxNHB4O2JvcmRlci13aWR0aDoycHg7dmVydGljYWwtYWxpZ246bWlkZGxlO21hcmdpbi1yaWdodDo2cHg7XCI+PC9zcGFuPkxvYWRpbmcgbW9kZWxzIGZvciBzZWxlY3RlZCBwcm92aWRlci4uLic7XG4gIH1cblxuICBfc2hvd01vZGVsV2l6YXJkQnVzeSgnUXVlcnlpbmcgYXZhaWxhYmxlIG1vZGVscy4uLicpO1xuICB0cnkge1xuICAgIF9zZWxlY3RlZE1vZGVsUHJvdmlkZXJzID0gbmV3IFNldChbX21vZGVsV2l6YXJkU2VsZWN0ZWRQcm92aWRlcl0pO1xuICAgIF9tb2RlbERhdGEucHJvdmlkZXIgPSBfbW9kZWxXaXphcmRTZWxlY3RlZFByb3ZpZGVyO1xuICAgIGF3YWl0IF9yZWZyZXNoTW9kZWxDYXRhbG9nRm9yU2VsZWN0aW9uKCk7XG4gICAgaWYgKGxvYWRpbmdFbCkge1xuICAgICAgbG9hZGluZ0VsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICBsb2FkaW5nRWwudGV4dENvbnRlbnQgPSAnJztcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nLndhcm4oJ0NvdWxkIG5vdCBsb2FkIG1vZGVscyBmb3Igc2VsZWN0ZWQgcHJvdmlkZXI6JywgZXJyb3IpO1xuICAgIGlmIChsb2FkaW5nRWwpIHtcbiAgICAgIGxvYWRpbmdFbC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICBsb2FkaW5nRWwudGV4dENvbnRlbnQgPSAnRmFpbGVkIHRvIGxvYWQgbW9kZWxzIGZvciBzZWxlY3RlZCBwcm92aWRlci4nO1xuICAgICAgbG9hZGluZ0VsLnN0eWxlLmNvbG9yID0gJyNiOTFjMWMnO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZmluYWxseSB7XG4gICAgX2hpZGVNb2RlbFdpemFyZEJ1c3koKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBuZXh0V2l6YXJkU3RlcCgpIHtcbiAgaWYgKF9tb2RlbFdpemFyZFN0ZXAgPT09IDEpIHtcbiAgICBpZiAoIV9tb2RlbFdpemFyZFNlbGVjdGVkUHJvdmlkZXIpIHJldHVybjtcbiAgICBfc2V0TW9kZWxXaXphcmRTdGVwKDIpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoX21vZGVsV2l6YXJkU3RlcCA9PT0gMikge1xuICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IF9sb2FkTW9kZWxzRm9yU2VsZWN0ZWRQcm92aWRlcigpO1xuICAgIGlmICghbG9hZGVkKSByZXR1cm47XG4gICAgX3NldE1vZGVsV2l6YXJkU3RlcCgzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmV2aW91c1dpemFyZFN0ZXAoKSB7XG4gIGlmIChfbW9kZWxXaXphcmRTdGVwID09PSAyKSB7IF9zZXRNb2RlbFdpemFyZFN0ZXAoMSk7IHJldHVybjsgfVxuICBpZiAoX21vZGVsV2l6YXJkU3RlcCA9PT0gMykgeyBfc2V0TW9kZWxXaXphcmRTdGVwKDIpOyByZXR1cm47IH1cbiAgaWYgKF9tb2RlbFdpemFyZFN0ZXAgPT09IDQpIHsgX3NldE1vZGVsV2l6YXJkU3RlcCgzKTsgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBfcmVmcmVzaE1vZGVsQ2F0YWxvZ0ZvclNlbGVjdGlvbigpIHtcbiAgaWYgKCFfbW9kZWxEYXRhKSByZXR1cm47XG4gIGlmIChfY2F0YWxvZ1JlZnJlc2hpbmcpIHtcbiAgICBfY2F0YWxvZ1JlZnJlc2hQZW5kaW5nID0gdHJ1ZTtcbiAgICByZXR1cm47XG4gIH1cbiAgX2NhdGFsb2dSZWZyZXNoaW5nID0gdHJ1ZTtcblxuICB0cnkge1xuICAgIGNvbnN0IHNlbGVjdGVkID0gQXJyYXkuZnJvbShfc2VsZWN0ZWRNb2RlbFByb3ZpZGVycyk7XG4gICAgaWYgKCFzZWxlY3RlZC5sZW5ndGgpIHtcbiAgICAgIF9zZWxlY3RlZE1vZGVsUHJvdmlkZXJzID0gbmV3IFNldChbX21vZGVsRGF0YS5wcm92aWRlcl0pO1xuICAgIH1cblxuICAgIGNvbnN0IHByb3ZpZGVyc1BhcmFtID0gZW5jb2RlVVJJQ29tcG9uZW50KEFycmF5LmZyb20oX3NlbGVjdGVkTW9kZWxQcm92aWRlcnMpLmpvaW4oJywnKSk7XG4gICAgY29uc3QgY2F0YWxvZyA9IGF3YWl0IGFwaUNhbGwoJ0dFVCcsIGAvYXBpL21vZGVsLWNhdGFsb2c/cHJvdmlkZXJzPSR7cHJvdmlkZXJzUGFyYW19YCk7XG4gICAgX21vZGVsRGF0YS5hbGxfbW9kZWxzID0gY2F0YWxvZy5hbGxfbW9kZWxzIHx8IFtdO1xuICAgIF9tb2RlbERhdGEucHJpY2luZ191cGRhdGVkX2F0ID0gY2F0YWxvZy5wcmljaW5nX3VwZGF0ZWRfYXQgfHwgX21vZGVsRGF0YS5wcmljaW5nX3VwZGF0ZWRfYXQ7XG4gICAgX21vZGVsRGF0YS5wcmljaW5nX3NvdXJjZSA9IGNhdGFsb2cucHJpY2luZ19zb3VyY2UgfHwgX21vZGVsRGF0YS5wcmljaW5nX3NvdXJjZTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjYXRhbG9nLnByb3ZpZGVycykgJiYgY2F0YWxvZy5wcm92aWRlcnMubGVuZ3RoKSB7XG4gICAgICBfbW9kZWxEYXRhLnByb3ZpZGVycyA9IGNhdGFsb2cucHJvdmlkZXJzO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShjYXRhbG9nLmxpc3RfbW9kZWxzX2NhcGFibGUpKSB7XG4gICAgICBfbW9kZWxEYXRhLmxpc3RfbW9kZWxzX2NhcGFibGUgPSBjYXRhbG9nLmxpc3RfbW9kZWxzX2NhcGFibGU7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy53YXJuKCdDb3VsZCBub3QgcmVmcmVzaCBtb2RlbCBjYXRhbG9nIGZvciBzZWxlY3RlZCBwcm92aWRlcnM6JywgZXJyb3IpO1xuICB9IGZpbmFsbHkge1xuICAgIF9jYXRhbG9nUmVmcmVzaGluZyA9IGZhbHNlO1xuICB9XG5cbiAgX3JlbmRlclByb3ZpZGVyU2VsZWN0b3IoKTtcbiAgX2J1aWxkTW9kZWxUYWJsZSgpO1xuXG4gIGlmIChfY2F0YWxvZ1JlZnJlc2hQZW5kaW5nKSB7XG4gICAgX2NhdGFsb2dSZWZyZXNoUGVuZGluZyA9IGZhbHNlO1xuICAgIGF3YWl0IF9yZWZyZXNoTW9kZWxDYXRhbG9nRm9yU2VsZWN0aW9uKCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gb3Blbk1vZGVsTW9kYWwoKSB7XG4gIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtbW9kYWwtb3ZlcmxheScpO1xuICBpZiAoIW92ZXJsYXkpIHJldHVybjtcblxuICBpZiAoIV9tb2RlbERhdGEpIHtcbiAgICBhd2FpdCBsb2FkTW9kZWxTZWxlY3RvcigpO1xuICB9XG4gIGF3YWl0IGxvYWRQcm92aWRlckluZm8oKTtcbiAgaWYgKCFfbW9kZWxXaXphcmRTZWxlY3RlZFByb3ZpZGVyKSB7XG4gICAgX21vZGVsV2l6YXJkU2VsZWN0ZWRQcm92aWRlciA9IF9tb2RlbERhdGE/LnByb3ZpZGVyIHx8IG51bGw7XG4gIH1cbiAgY29uc3Qgc3VjY2Vzc1N1bW1hcnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtc3VjY2Vzcy1zdW1tYXJ5Jyk7XG4gIGlmIChzdWNjZXNzU3VtbWFyeSkge1xuICAgIHN1Y2Nlc3NTdW1tYXJ5LnRleHRDb250ZW50ID0gJ1Byb3ZpZGVyIGFuZCBtb2RlbCBhcmUgY29uZmlndXJlZCBhbmQgdGhlIGNvbm5lY3Rpb24gY2hlY2sgc3VjY2VlZGVkLic7XG4gIH1cbiAgX3JlbmRlclByb3ZpZGVyU2VsZWN0b3IoKTtcbiAgX3N5bmNDYXRhbG9nVmlzaWJpbGl0eSgpO1xuICBfd2lyZUdsb2JhbE1vZGVsU2VhcmNoKCk7XG4gIF9zZXRNb2RlbFdpemFyZFN0ZXAoMSk7XG4gIF9oaWRlTW9kZWxXaXphcmRCdXN5KCk7XG4gIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgX2ZvY3VzU3RhY2sucHVzaChkb2N1bWVudC5hY3RpdmVFbGVtZW50KTtcbiAgc2V0SW5pdGlhbEZvY3VzKCdtb2RlbC1tb2RhbC1vdmVybGF5Jyk7XG4gIHRyYXBGb2N1cygnbW9kZWwtbW9kYWwtb3ZlcmxheScpO1xufVxuXG5mdW5jdGlvbiBjbG9zZU1vZGVsTW9kYWwoKSB7XG4gIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtbW9kYWwtb3ZlcmxheScpO1xuICBpZiAob3ZlcmxheSkgb3ZlcmxheS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBfc2V0TW9kZWxXaXphcmRTdGVwKDEpO1xuICBfaGlkZU1vZGVsV2l6YXJkQnVzeSgpO1xuICBpZiAoX2NvcGlsb3RBdXRoUG9sbFRpbWVyKSB7XG4gICAgY2xlYXJJbnRlcnZhbChfY29waWxvdEF1dGhQb2xsVGltZXIpO1xuICAgIF9jb3BpbG90QXV0aFBvbGxUaW1lciA9IG51bGw7XG4gIH1cbiAgcmVzdG9yZUZvY3VzKCk7XG59XG5cbmZ1bmN0aW9uIF9hcHBseU1vZGVsUm93VmlzdWFsU3RhdGUodHIsIGlzQWN0aXZlKSB7XG4gIHRyLmNsYXNzTGlzdC50b2dnbGUoJ21vZGVsLXJvdy1hY3RpdmUnLCBpc0FjdGl2ZSk7XG4gIHRyLnN0eWxlLmNzc1RleHQgPSBpc0FjdGl2ZVxuICAgID8gJ2JhY2tncm91bmQ6I2VmZjZmZjsgZm9udC13ZWlnaHQ6NjAwOyBjdXJzb3I6cG9pbnRlcjsnXG4gICAgOiAnY3Vyc29yOnBvaW50ZXI7JztcblxuICBjb25zdCBtb2RlbCA9IHRyLmdldEF0dHJpYnV0ZSgnZGF0YS1tb2RlbCcpIHx8ICcnO1xuICBjb25zdCBtb2RlbENlbGwgPSB0ci5jZWxscyAmJiB0ci5jZWxsc1sxXTtcbiAgaWYgKG1vZGVsQ2VsbCkge1xuICAgIG1vZGVsQ2VsbC5pbm5lckhUTUwgPSBgJHtlc2NhcGVIdG1sKG1vZGVsKX1gICtcbiAgICAgIChpc0FjdGl2ZSA/ICcgPHNwYW4gc3R5bGU9XCJjb2xvcjojM2I4MmY2OyBmb250LXNpemU6MC43NWVtO1wiPiYjMTAwMDM7IGFjdGl2ZTwvc3Bhbj4nIDogJycpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9zeW5jTW9kZWxUYWJsZVNlbGVjdGlvbigpIHtcbiAgY29uc3QgdGJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtdGFibGUtYm9keScpO1xuICBpZiAoIXRib2R5IHx8ICFfbW9kZWxEYXRhKSByZXR1cm47XG5cbiAgY29uc3QgYWN0aXZlUHJvdmlkZXIgPSBfbW9kZWxEYXRhLnByb3ZpZGVyO1xuICBjb25zdCBhY3RpdmVNb2RlbCA9IF9tb2RlbERhdGEubW9kZWw7XG4gIHRib2R5LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RyJykuZm9yRWFjaCh0ciA9PiB7XG4gICAgY29uc3QgaXNBY3RpdmUgPSAoXG4gICAgICB0ci5nZXRBdHRyaWJ1dGUoJ2RhdGEtcHJvdmlkZXInKSA9PT0gYWN0aXZlUHJvdmlkZXIgJiZcbiAgICAgIHRyLmdldEF0dHJpYnV0ZSgnZGF0YS1tb2RlbCcpID09PSBhY3RpdmVNb2RlbFxuICAgICk7XG4gICAgX2FwcGx5TW9kZWxSb3dWaXN1YWxTdGF0ZSh0ciwgaXNBY3RpdmUpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gX2J1aWxkTW9kZWxUYWJsZSgpIHtcbiAgY29uc3QgdGJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtdGFibGUtYm9keScpO1xuICBjb25zdCB0aGVhZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC10YWJsZS1oZWFkJyk7XG4gIGlmICghdGJvZHkgfHwgIV9tb2RlbERhdGEpIHJldHVybjtcblxuICBjb25zdCBjdXJyZW50UHJvdmlkZXIgPSBfbW9kZWxEYXRhLnByb3ZpZGVyO1xuICBjb25zdCBjdXJyZW50TW9kZWwgICAgPSBfbW9kZWxEYXRhLm1vZGVsO1xuXG4gIC8vIEZpeGVkIDctY29sdW1uIGhlYWRlcnMgXHUyMDE0IG5vIGR5bmFtaWMgcmVidWlsZGluZyBuZWVkZWRcbiAgaWYgKHRoZWFkKSB7XG4gICAgY29uc3QgdGhTID0gJ3BhZGRpbmc6MTBweCAxNHB4OyB3aGl0ZS1zcGFjZTpub3dyYXA7JztcbiAgICB0aGVhZC5pbm5lckhUTUwgPVxuICAgICAgYDx0ciBzdHlsZT1cImJhY2tncm91bmQ6I2YxZjVmOTsgdGV4dC1hbGlnbjpsZWZ0O1wiPmAgK1xuICAgICAgICBgPHRoIHN0eWxlPVwiJHt0aFN9XCI+UHJvdmlkZXI8L3RoPmAgK1xuICAgICAgICBgPHRoIHN0eWxlPVwiJHt0aFN9XCI+TW9kZWw8L3RoPmAgK1xuICAgICAgICBgPHRoIHN0eWxlPVwiJHt0aFN9IHRleHQtYWxpZ246cmlnaHQ7XCI+Q29udGV4dDwvdGg+YCArXG4gICAgICAgIGA8dGggc3R5bGU9XCIke3RoU30gdGV4dC1hbGlnbjpyaWdodDtcIiB0aXRsZT1cIlVTRCBwZXIgMU0gaW5wdXQgdG9rZW5zIChkaXJlY3QgQVBJIGJpbGxpbmcpXCI+JC8xTSBpbjwvdGg+YCArXG4gICAgICAgIGA8dGggc3R5bGU9XCIke3RoU30gdGV4dC1hbGlnbjpyaWdodDtcIiB0aXRsZT1cIlVTRCBwZXIgMU0gb3V0cHV0IHRva2VucyAoZGlyZWN0IEFQSSBiaWxsaW5nKVwiPiQvMU0gb3V0PC90aD5gICtcbiAgICAgICAgYDx0aCBzdHlsZT1cIiR7dGhTfSB0ZXh0LWFsaWduOnJpZ2h0O1wiIHRpdGxlPVwiR2l0SHViIENvcGlsb3QgcHJlbWl1bS1yZXF1ZXN0IG11bHRpcGxpZXIgKDAgPSBmcmVlIGZvciBwYWlkIHN1YnNjcmliZXJzKVwiPkNvcGlsb3Q8L3RoPmAgK1xuICAgICAgICBgPHRoIHN0eWxlPVwiJHt0aFN9XCI+U291cmNlPC90aD5gICtcbiAgICAgICAgYDx0aCBzdHlsZT1cIiR7dGhTfVwiPk5vdGVzPC90aD5gICtcbiAgICAgIGA8L3RyPmA7XG4gIH1cblxuICAvLyBUZWFyIGRvd24gYW55IGV4aXN0aW5nIERhdGFUYWJsZSBiZWZvcmUgcmVidWlsZGluZyByb3dzLlxuICBpZiAod2luZG93LiQgJiYgJC5mbiAmJiAkLmZuLkRhdGFUYWJsZSAmJiAkLmZuLkRhdGFUYWJsZS5pc0RhdGFUYWJsZSgnI21vZGVsLXRhYmxlJykpIHtcbiAgICB0cnkge1xuICAgICAgX21vZGVsRGF0YVRhYmxlID0gJCgnI21vZGVsLXRhYmxlJykuRGF0YVRhYmxlKCk7XG4gICAgICBfbW9kZWxEYXRhVGFibGUuZGVzdHJveSgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZy53YXJuKCdEYXRhVGFibGUuZGVzdHJveSgpIGZhaWxlZCAodGFibGUgbWF5IGFscmVhZHkgYmUgdG9ybiBkb3duKTonLCBlKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgX21vZGVsRGF0YVRhYmxlID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvLyBQcmVmZXIgY3Jvc3MtcHJvdmlkZXIgbGlzdDsgZmFsbCBiYWNrIHRvIGN1cnJlbnQtcHJvdmlkZXIgYXZhaWxhYmxlIGxpc3RcbiAgbGV0IHJvd3MgPSAoX21vZGVsRGF0YS5hbGxfbW9kZWxzICYmIF9tb2RlbERhdGEuYWxsX21vZGVscy5sZW5ndGgpXG4gICAgPyBfbW9kZWxEYXRhLmFsbF9tb2RlbHMuZmlsdGVyKHIgPT4gci5tb2RlbClcbiAgICA6IChfbW9kZWxEYXRhLmF2YWlsYWJsZSB8fCBbXSkubWFwKHIgPT5cbiAgICAgICAgdHlwZW9mIHIgPT09ICdvYmplY3QnXG4gICAgICAgICAgPyB7IC4uLnIsIHByb3ZpZGVyOiBjdXJyZW50UHJvdmlkZXIgfVxuICAgICAgICAgIDogeyBtb2RlbDogciwgcHJvdmlkZXI6IGN1cnJlbnRQcm92aWRlciB9XG4gICAgICApO1xuXG4gIF9yZW5kZXJRdWlja01vZGVsTGlzdChyb3dzKTtcbiAgdGJvZHkuaW5uZXJIVE1MID0gJyc7XG4gIGNvbnN0IHRkQmFzZSAgPSAncGFkZGluZzo5cHggMTRweDsgYm9yZGVyLWJvdHRvbToxcHggc29saWQgI2UyZThmMDsnO1xuICBjb25zdCBmbXRDb3N0ID0gdiA9PiAodiAhPSBudWxsKSA/ICckJyArIE51bWJlcih2KS50b0ZpeGVkKHYgPCAxID8gMyA6IDIpIDogJ1x1MjAxNCc7XG4gIGNvbnN0IGZtdFByaWNlSGludCA9IHNvdXJjZSA9PiB7XG4gICAgaWYgKHNvdXJjZSA9PT0gJ3J1bnRpbWVfY2FjaGUnKSB7XG4gICAgICByZXR1cm4gJzxzcGFuIHRpdGxlPVwiUHJpY2UgZnJvbSBydW50aW1lIGNhY2hlXCIgc3R5bGU9XCJtYXJnaW4tbGVmdDo2cHg7IGRpc3BsYXk6aW5saW5lLWJsb2NrOyBwYWRkaW5nOjFweCA1cHg7IGJvcmRlci1yYWRpdXM6OTk5cHg7IGJhY2tncm91bmQ6I2VjZmVmZjsgY29sb3I6IzBmNzY2ZTsgZm9udC1zaXplOjAuNzJlbTsgZm9udC13ZWlnaHQ6NjAwOyB2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7XCI+Y2FjaGU8L3NwYW4+JztcbiAgICB9XG4gICAgcmV0dXJuICc8c3BhbiB0aXRsZT1cIlByaWNlIGZyb20gc3RhdGljIGJhc2VsaW5lXCIgc3R5bGU9XCJtYXJnaW4tbGVmdDo2cHg7IGRpc3BsYXk6aW5saW5lLWJsb2NrOyBwYWRkaW5nOjFweCA1cHg7IGJvcmRlci1yYWRpdXM6OTk5cHg7IGJhY2tncm91bmQ6I2Y4ZmFmYzsgY29sb3I6IzY0NzQ4YjsgZm9udC1zaXplOjAuNzJlbTsgZm9udC13ZWlnaHQ6NjAwOyB2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7XCI+c3RhdGljPC9zcGFuPic7XG4gIH07XG4gIGNvbnN0IGZtdFNvdXJjZSA9IHMgPT4ge1xuICAgIGlmIChzID09PSAnbGlzdF9tb2RlbHMnKSB7XG4gICAgICByZXR1cm4gJzxzcGFuIHN0eWxlPVwiZGlzcGxheTppbmxpbmUtYmxvY2s7IHBhZGRpbmc6MnB4IDZweDsgYm9yZGVyLXJhZGl1czo5OTlweDsgYmFja2dyb3VuZDojZWNmZWZmOyBjb2xvcjojMGY3NjZlOyBmb250LXNpemU6MC43OGVtOyBmb250LXdlaWdodDo2MDA7XCI+bGlzdF9tb2RlbHM8L3NwYW4+JztcbiAgICB9XG4gICAgcmV0dXJuICc8c3BhbiBzdHlsZT1cImRpc3BsYXk6aW5saW5lLWJsb2NrOyBwYWRkaW5nOjJweCA2cHg7IGJvcmRlci1yYWRpdXM6OTk5cHg7IGJhY2tncm91bmQ6I2YxZjVmOTsgY29sb3I6IzQ3NTU2OTsgZm9udC1zaXplOjAuNzhlbTsgZm9udC13ZWlnaHQ6NjAwO1wiPmZhbGxiYWNrX3N0YXRpYzwvc3Bhbj4nO1xuICB9O1xuICBjb25zdCBmbXRNdWx0ID0gdiA9PiB7XG4gICAgaWYgKHYgPT0gbnVsbCkgcmV0dXJuICdcdTIwMTQnO1xuICAgIGlmICh2ID09PSAwKSAgIHJldHVybiAnPHNwYW4gc3R5bGU9XCJjb2xvcjojMTZhMzRhOyBmb250LXdlaWdodDo2MDA7XCI+ZnJlZTwvc3Bhbj4nO1xuICAgIHJldHVybiBOdW1iZXIodikudG9GaXhlZCh2ICUgMSA9PT0gMCA/IDAgOiAyKSArICcmdGltZXM7JztcbiAgfTtcblxuICByb3dzLmZvckVhY2goaXRlbSA9PiB7XG4gICAgY29uc3QgcHJvdmlkZXIgICA9IGl0ZW0ucHJvdmlkZXIgfHwgY3VycmVudFByb3ZpZGVyO1xuICAgIGNvbnN0IG0gICAgICAgICAgPSBpdGVtLm1vZGVsO1xuICAgIGNvbnN0IGN0eCAgICAgICAgPSBpdGVtLmNvbnRleHRfd2luZG93ID8gTnVtYmVyKGl0ZW0uY29udGV4dF93aW5kb3cpLnRvTG9jYWxlU3RyaW5nKCkgOiAnXHUyMDE0JztcbiAgICBjb25zdCBzb3VyY2UgICAgID0gaXRlbS5zb3VyY2UgfHwgJ2ZhbGxiYWNrX3N0YXRpYyc7XG4gICAgY29uc3QgcHJpY2VTb3VyY2UgPSBpdGVtLnByaWNlX3NvdXJjZSB8fCAnc3RhdGljX2Jhc2VsaW5lJztcbiAgICBjb25zdCBub3RlcyAgICAgID0gaXRlbS5ub3RlcyB8fCAnJztcbiAgICBjb25zdCBpc1NlbGVjdGVkID0gKHByb3ZpZGVyID09PSBjdXJyZW50UHJvdmlkZXIgJiYgbSA9PT0gY3VycmVudE1vZGVsKTtcblxuICAgIGNvbnN0IHRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTtcbiAgICB0ci5zZXRBdHRyaWJ1dGUoJ2RhdGEtcHJvdmlkZXInLCBwcm92aWRlcik7XG4gICAgdHIuc2V0QXR0cmlidXRlKCdkYXRhLW1vZGVsJywgbSk7XG4gICAgX2FwcGx5TW9kZWxSb3dWaXN1YWxTdGF0ZSh0ciwgaXNTZWxlY3RlZCk7XG4gICAgdHIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgKCkgPT4ge1xuICAgICAgaWYgKCF0ci5jbGFzc0xpc3QuY29udGFpbnMoJ21vZGVsLXJvdy1hY3RpdmUnKSkgdHIuc3R5bGUuYmFja2dyb3VuZCA9ICcjZjhmYWZjJztcbiAgICB9KTtcbiAgICB0ci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsICgpID0+IHtcbiAgICAgIGlmICghdHIuY2xhc3NMaXN0LmNvbnRhaW5zKCdtb2RlbC1yb3ctYWN0aXZlJykpIHRyLnN0eWxlLmJhY2tncm91bmQgPSAnJztcbiAgICB9KTtcblxuICAgIHRyLmlubmVySFRNTCA9XG4gICAgICBgPHRkIHN0eWxlPVwiJHt0ZEJhc2V9IGNvbG9yOiM2NDc0OGI7IHdoaXRlLXNwYWNlOm5vd3JhcDtcIj4ke2VzY2FwZUh0bWwoX3Byb3ZpZGVyRGlzcGxheUxhYmVsKHByb3ZpZGVyKSl9PC90ZD5gICtcbiAgICAgIGA8dGQgc3R5bGU9XCIke3RkQmFzZX1cIj4ke2VzY2FwZUh0bWwobSl9PC90ZD5gICtcbiAgICAgIGA8dGQgc3R5bGU9XCIke3RkQmFzZX0gd2hpdGUtc3BhY2U6bm93cmFwOyB0ZXh0LWFsaWduOnJpZ2h0OyBmb250LXZhcmlhbnQtbnVtZXJpYzp0YWJ1bGFyLW51bXM7XCI+JHtjdHh9PC90ZD5gICtcbiAgICAgIGA8dGQgc3R5bGU9XCIke3RkQmFzZX0gdGV4dC1hbGlnbjpyaWdodDsgZm9udC12YXJpYW50LW51bWVyaWM6dGFidWxhci1udW1zOyB3aGl0ZS1zcGFjZTpub3dyYXA7XCI+JHtmbXRDb3N0KGl0ZW0uY29zdF9pbnB1dCl9JHtmbXRQcmljZUhpbnQocHJpY2VTb3VyY2UpfTwvdGQ+YCArXG4gICAgICBgPHRkIHN0eWxlPVwiJHt0ZEJhc2V9IHRleHQtYWxpZ246cmlnaHQ7IGZvbnQtdmFyaWFudC1udW1lcmljOnRhYnVsYXItbnVtczsgd2hpdGUtc3BhY2U6bm93cmFwO1wiPiR7Zm10Q29zdChpdGVtLmNvc3Rfb3V0cHV0KX0ke2ZtdFByaWNlSGludChwcmljZVNvdXJjZSl9PC90ZD5gICtcbiAgICAgIGA8dGQgc3R5bGU9XCIke3RkQmFzZX0gdGV4dC1hbGlnbjpyaWdodDsgZm9udC12YXJpYW50LW51bWVyaWM6dGFidWxhci1udW1zOyB3aGl0ZS1zcGFjZTpub3dyYXA7XCI+JHtmbXRNdWx0KGl0ZW0uY29waWxvdF9tdWx0aXBsaWVyKX08L3RkPmAgK1xuICAgICAgYDx0ZCBzdHlsZT1cIiR7dGRCYXNlfSB3aGl0ZS1zcGFjZTpub3dyYXA7XCI+JHtmbXRTb3VyY2Uoc291cmNlKX08L3RkPmAgK1xuICAgICAgYDx0ZCBzdHlsZT1cIiR7dGRCYXNlfSBjb2xvcjojNjQ3NDhiO1wiPiR7ZXNjYXBlSHRtbChub3Rlcyl9PC90ZD5gO1xuICAgIHRib2R5LmFwcGVuZENoaWxkKHRyKTtcbiAgfSk7XG5cbiAgLy8gUmViaW5kIHJvdyBjbGljayB1c2luZyBkZWxlZ2F0aW9uIHNvIHNvcnRpbmcvZmlsdGVyIHJlZHJhd3Mgc3RpbGwgd29yay5cbiAgdGJvZHkub25jbGljayA9IGFzeW5jIChldmVudCkgPT4ge1xuICAgIGNvbnN0IHRyID0gZXZlbnQudGFyZ2V0LmNsb3Nlc3QoJ3RyJyk7XG4gICAgaWYgKCF0cikgcmV0dXJuO1xuICAgIGNvbnN0IHByb3ZpZGVyID0gdHIuZ2V0QXR0cmlidXRlKCdkYXRhLXByb3ZpZGVyJyk7XG4gICAgY29uc3QgbW9kZWwgPSB0ci5nZXRBdHRyaWJ1dGUoJ2RhdGEtbW9kZWwnKTtcbiAgICBpZiAoIW1vZGVsKSByZXR1cm47XG5cbiAgICAvLyBJbW1lZGlhdGUgZmVlZGJhY2sgd2hpbGUgdGhlIEFQSSBjYWxsIGlzIGluLWZsaWdodFxuICAgIHRyLnN0eWxlLmNzc1RleHQgPSAnYmFja2dyb3VuZDojZmVmM2M3OyBjdXJzb3I6d2FpdDsgb3BhY2l0eTowLjg1Oyc7XG4gICAgY29uc3QgbW9kZWxDZWxsID0gdHIuY2VsbHMgJiYgdHIuY2VsbHNbMV07XG4gICAgaWYgKG1vZGVsQ2VsbCkge1xuICAgICAgbW9kZWxDZWxsLmlubmVySFRNTCA9XG4gICAgICAgIGA8c3BhbiBjbGFzcz1cImxvYWRpbmctc3Bpbm5lclwiIHN0eWxlPVwid2lkdGg6MTRweDtoZWlnaHQ6MTRweDtib3JkZXItd2lkdGg6MnB4O3ZlcnRpY2FsLWFsaWduOm1pZGRsZTttYXJnaW4tcmlnaHQ6NnB4O1wiPjwvc3Bhbj4ke2VzY2FwZUh0bWwobW9kZWwpfWA7XG4gICAgfVxuICAgIGNvbnN0IHN0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC10ZXN0LXN0YXR1cycpO1xuICAgIGlmIChzdGF0dXMpIHtcbiAgICAgIHN0YXR1cy5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICBzdGF0dXMuc3R5bGUuY29sb3IgICA9ICcjOTI0MDBlJztcbiAgICAgIHN0YXR1cy5pbm5lckhUTUwgICAgID1cbiAgICAgICAgYDxzcGFuIGNsYXNzPVwibG9hZGluZy1zcGlubmVyXCIgc3R5bGU9XCJ3aWR0aDoxNHB4O2hlaWdodDoxNHB4O2JvcmRlci13aWR0aDoycHg7dmVydGljYWwtYWxpZ246bWlkZGxlO21hcmdpbi1yaWdodDo2cHg7XCI+PC9zcGFuPiBTd2l0Y2hpbmcgdG8gJHtlc2NhcGVIdG1sKG1vZGVsKX1cXHUyMDI2YDtcbiAgICB9XG5cbiAgICBhd2FpdCBzZXRNb2RlbChtb2RlbCwgcHJvdmlkZXIpO1xuICB9O1xuXG4gIC8vIEVuaGFuY2Ugd2l0aCBEYXRhVGFibGVzIGZvciBzb3J0aW5nL3NlYXJjaGluZzsga2VlcCBwYWdpbmcgZGlzYWJsZWQuXG4gIGlmICh3aW5kb3cuJCAmJiAkLmZuICYmICQuZm4uRGF0YVRhYmxlKSB7XG4gICAgX21vZGVsRGF0YVRhYmxlID0gJCgnI21vZGVsLXRhYmxlJykuRGF0YVRhYmxlKHtcbiAgICAgIHBhZ2luZzogZmFsc2UsXG4gICAgICBzZWFyY2hpbmc6IHRydWUsXG4gICAgICBpbmZvOiBmYWxzZSxcbiAgICAgIG9yZGVyQ2VsbHNUb3A6IHRydWUsXG4gICAgICBvcmRlcjogW1swLCAnYXNjJ10sIFsxLCAnYXNjJ11dLFxuICAgICAgYXV0b1dpZHRoOiBmYWxzZSxcbiAgICAgIGxhbmd1YWdlOiB7IHNlYXJjaDogJ0ZpbHRlcjonIH0sXG4gICAgICBpbml0Q29tcGxldGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICBjb25zdCBhcGkgPSB0aGlzLmFwaSgpO1xuICAgICAgICBjb25zdCAkdGhlYWQgPSAkKCcjbW9kZWwtdGFibGUgdGhlYWQnKTtcbiAgICAgICAgY29uc3QgaGFzRmlsdGVyUm93ID0gJHRoZWFkLmZpbmQoJ3RyLm1vZGVsLWZpbHRlci1yb3cnKS5sZW5ndGggPiAwO1xuICAgICAgICBpZiAoIWhhc0ZpbHRlclJvdykge1xuICAgICAgICAgIGNvbnN0ICRmaWx0ZXJSb3cgPSAkKCc8dHIgY2xhc3M9XCJtb2RlbC1maWx0ZXItcm93XCI+PC90cj4nKTtcbiAgICAgICAgICBhcGkuY29sdW1ucygpLmV2ZXJ5KGZ1bmN0aW9uKGNvbElkeCkge1xuICAgICAgICAgICAgY29uc3QgdGl0bGUgPSAkKGFwaS5jb2x1bW4oY29sSWR4KS5oZWFkZXIoKSkudGV4dCgpLnRyaW0oKTtcbiAgICAgICAgICAgIGNvbnN0ICR0aCA9ICQoJzx0aCBzdHlsZT1cInBhZGRpbmc6NnB4IDEwcHg7IGJhY2tncm91bmQ6I2Y4ZmFmYzsgYm9yZGVyLXRvcDoxcHggc29saWQgI2UyZThmMDtcIj48L3RoPicpO1xuICAgICAgICAgICAgY29uc3QgJGlucHV0ID0gJCgnPGlucHV0PicsIHtcbiAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogdGl0bGUsXG4gICAgICAgICAgICAgIHN0eWxlOiAnd2lkdGg6MTAwJTsgcGFkZGluZzo0cHggNnB4OyBib3JkZXI6MXB4IHNvbGlkICNjYmQ1ZTE7IGJvcmRlci1yYWRpdXM6NHB4OyBmb250LXNpemU6MC44MmVtOycsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICR0aC5hcHBlbmQoJGlucHV0KTtcbiAgICAgICAgICAgICRmaWx0ZXJSb3cuYXBwZW5kKCR0aCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgJHRoZWFkLmFwcGVuZCgkZmlsdGVyUm93KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFwaS5jb2x1bW5zKCkuZXZlcnkoZnVuY3Rpb24oY29sSWR4KSB7XG4gICAgICAgICAgY29uc3QgJGlucHV0ID0gJCgnI21vZGVsLXRhYmxlIHRoZWFkIHRyLm1vZGVsLWZpbHRlci1yb3cgdGgnKS5lcShjb2xJZHgpLmZpbmQoJ2lucHV0Jyk7XG4gICAgICAgICAgaWYgKCEkaW5wdXQubGVuZ3RoKSByZXR1cm47XG4gICAgICAgICAgJGlucHV0Lm9mZignY2xpY2subW9kZWxGaWx0ZXIga2V5dXAubW9kZWxGaWx0ZXIgY2hhbmdlLm1vZGVsRmlsdGVyJyk7XG4gICAgICAgICAgJGlucHV0Lm9uKCdjbGljay5tb2RlbEZpbHRlcicsIGZ1bmN0aW9uKGV2ZW50KSB7IGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyB9KTtcbiAgICAgICAgICAkaW5wdXQub24oJ2tleXVwLm1vZGVsRmlsdGVyIGNoYW5nZS5tb2RlbEZpbHRlcicsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgICAgICAgICAgaWYgKGFwaS5jb2x1bW4oY29sSWR4KS5zZWFyY2goKSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgICAgYXBpLmNvbHVtbihjb2xJZHgpLnNlYXJjaCh2YWx1ZSkuZHJhdygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBfc3luY01vZGVsVGFibGVTZWxlY3Rpb24oKTtcblxuICAvLyBVcGRhdGUgcHJpY2luZyBmcmVzaG5lc3MgZm9vdGVyXG4gIF91cGRhdGVQcmljaW5nRm9vdGVyKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldE1vZGVsKG1vZGVsLCBwcm92aWRlcikge1xuICBpZiAoIW1vZGVsKSByZXR1cm47XG4gIF9zaG93TW9kZWxXaXphcmRCdXN5KGBBcHBseWluZyBtb2RlbCAke21vZGVsfS4uLmApO1xuICB0cnkge1xuICAgIGNvbnN0IHBheWxvYWQgPSBwcm92aWRlciA/IHsgbW9kZWwsIHByb3ZpZGVyIH0gOiB7IG1vZGVsIH07XG4gICAgYXdhaXQgYXBpQ2FsbCgnUE9TVCcsICcvYXBpL21vZGVsJywgcGF5bG9hZCk7XG4gICAgaWYgKF9tb2RlbERhdGEpIHtcbiAgICAgIF9tb2RlbERhdGEubW9kZWwgPSBtb2RlbDtcbiAgICAgIGlmIChwcm92aWRlcikgX21vZGVsRGF0YS5wcm92aWRlciA9IHByb3ZpZGVyO1xuICAgIH1cbiAgICBjb25zdCBlZmZlY3RpdmVQcm92aWRlciA9IChfbW9kZWxEYXRhICYmIF9tb2RlbERhdGEucHJvdmlkZXIpIHx8IHByb3ZpZGVyO1xuICAgIGNvbnN0IGxhYmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLWN1cnJlbnQtbGFiZWwnKTtcbiAgICBpZiAobGFiZWwpIHtcbiAgICAgIGxhYmVsLnRleHRDb250ZW50ID0gZWZmZWN0aXZlUHJvdmlkZXIgPyBgJHtlZmZlY3RpdmVQcm92aWRlcn0gXHUwMEI3ICR7bW9kZWx9YCA6IG1vZGVsO1xuICAgIH1cbiAgICBfYXBwZW5kUmVjZW50TW9kZWwoZWZmZWN0aXZlUHJvdmlkZXIsIG1vZGVsKTtcbiAgICBfc3luY01vZGVsVGFibGVTZWxlY3Rpb24oKTtcbiAgICBfcmVuZGVyUXVpY2tNb2RlbExpc3QoKF9tb2RlbERhdGEgJiYgX21vZGVsRGF0YS5hbGxfbW9kZWxzKSB8fCBbXSk7XG4gICAgX3VwZGF0ZUxsbVN0YXR1c1BpbGwoJ2NvbmZpZ3VyZWQnLCBgJHtlZmZlY3RpdmVQcm92aWRlciB8fCAnUHJvdmlkZXInfSBjb25maWd1cmVkYCk7XG5cbiAgICBfc2F2ZU1vZGVsUHJlZnNUb1N0b3JhZ2Uoe1xuICAgICAgY3VycmVudE1vZGVsUHJvdmlkZXI6IGVmZmVjdGl2ZVByb3ZpZGVyIHx8IG51bGwsXG4gICAgICBjdXJyZW50TW9kZWxOYW1lOiBtb2RlbCB8fCBudWxsLFxuICAgIH0pO1xuICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcy51cGRhdGVBdXRoQmFkZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGdsb2JhbFRoaXMudXBkYXRlQXV0aEJhZGdlKHt9LCBlZmZlY3RpdmVQcm92aWRlciB8fCBudWxsKTtcbiAgICB9XG4gICAgYXdhaXQgX3JlZnJlc2hDb3BpbG90QXV0aFN0YXR1cygpO1xuICAgIGF3YWl0IHRlc3RDdXJyZW50TW9kZWwoKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZy5lcnJvcignRmFpbGVkIHRvIHN3aXRjaCBtb2RlbDonLCBlKTtcbiAgICBjb25zdCBtc2cgPSBlLm1lc3NhZ2UgfHwgU3RyaW5nKGUpO1xuICAgIF9zeW5jTW9kZWxUYWJsZVNlbGVjdGlvbigpO1xuICAgIGNvbnN0IHN0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC10ZXN0LXN0YXR1cycpO1xuICAgIGlmIChzdGF0dXMpIHtcbiAgICAgIHN0YXR1cy5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICBzdGF0dXMuc3R5bGUuY29sb3IgPSAnI2RjMjYyNic7XG4gICAgICBzdGF0dXMudGV4dENvbnRlbnQgPSBgXHUyNzRDICR7bXNnfWA7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgYXBwZW5kTWVzc2FnZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgYFx1Mjc0QyBNb2RlbCBzd2l0Y2ggZmFpbGVkOiAke21zZ31gKTtcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgX2hpZGVNb2RlbFdpemFyZEJ1c3koKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiB0ZXN0Q3VycmVudE1vZGVsKCkge1xuICAvLyBVcGRhdGUgYm90aCB0aGUgaGVhZGVyIGJhZGdlIGFuZCB0aGUgbW9kYWwgc3RhdHVzIGxpbmVcbiAgY29uc3QgYmFkZ2UgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLXRlc3QtYmFkZ2UnKTtcbiAgY29uc3Qgc3RhdHVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLXRlc3Qtc3RhdHVzJyk7XG4gIGNvbnN0IGJ0biAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC10ZXN0LWJ0bicpO1xuXG4gIGNvbnN0IFNQSU4gPSAnXHUyM0YzJztcbiAgY29uc3QgT0sgICA9ICdcdTI3MDUnO1xuICBjb25zdCBGQUlMID0gJ1x1Mjc0Qyc7XG5cbiAgY29uc3Qgc2V0UnVubmluZyA9ICgpID0+IHtcbiAgICBpZiAoYmFkZ2UpICB7IGJhZGdlLnRleHRDb250ZW50ICA9IFNQSU47IGJhZGdlLnN0eWxlLmRpc3BsYXkgID0gJyc7IGJhZGdlLnRpdGxlICA9ICdUZXN0aW5nXHUyMDI2JzsgfVxuICAgIGlmIChzdGF0dXMpIHsgc3RhdHVzLmlubmVySFRNTCAgID0gYCR7U1BJTn0gVGVzdGluZyBjb25uZWN0aW9uXHUyMDI2YDsgc3RhdHVzLnN0eWxlLmRpc3BsYXkgPSAnJzsgfVxuICAgIGlmIChidG4pICAgIHsgYnRuLmRpc2FibGVkID0gdHJ1ZTsgYnRuLnRleHRDb250ZW50ID0gJ1x1MjNGMyBUZXN0aW5nXHUyMDI2JzsgfVxuICAgIF91cGRhdGVMbG1TdGF0dXNQaWxsKCdjb25uZWN0aW5nJywgJ0Nvbm5lY3RpbmdcdTIwMjYnLCAnXHUyOUQ3Jyk7XG4gIH07XG5cbiAgY29uc3Qgc2V0T2sgPSAobGF0ZW5jeU1zKSA9PiB7XG4gICAgY29uc3QgdGlwID0gYENvbm5lY3RlZCBcdTIwMTQgJHtsYXRlbmN5TXN9bXNgO1xuICAgIGlmIChiYWRnZSkgIHsgYmFkZ2UudGV4dENvbnRlbnQgID0gT0s7ICBiYWRnZS5zdHlsZS5kaXNwbGF5ICA9ICcnOyBiYWRnZS50aXRsZSAgPSB0aXA7IH1cbiAgICBpZiAoc3RhdHVzKSB7IHN0YXR1cy5pbm5lckhUTUwgICA9IGAke09LfSAke3RpcH1gOyBzdGF0dXMuc3R5bGUuY29sb3IgPSAnIzE2YTM0YSc7IHN0YXR1cy5zdHlsZS5kaXNwbGF5ID0gJyc7IH1cbiAgICBpZiAoYnRuKSAgICB7IGJ0bi5kaXNhYmxlZCA9IGZhbHNlOyBidG4uaW5uZXJIVE1MID0gJyYjMTAwMDM7IFRlc3QgY29ubmVjdGlvbic7IH1cbiAgICBfdXBkYXRlTGxtU3RhdHVzUGlsbCgnY29ubmVjdGVkJywgYEhlYWx0aHkgKCR7bGF0ZW5jeU1zfW1zKWAsICdcdTI3MTMnKTtcbiAgICBjb25zdCBzdWNjZXNzU3VtbWFyeSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1zdWNjZXNzLXN1bW1hcnknKTtcbiAgICBpZiAoc3VjY2Vzc1N1bW1hcnkpIHtcbiAgICAgIHN1Y2Nlc3NTdW1tYXJ5LnRleHRDb250ZW50ID0gYENvbm5lY3Rpb24gdmVyaWZpZWQgaW4gJHtsYXRlbmN5TXN9bXMuIFlvdSBjYW4gY2xvc2UgdGhlIHdpemFyZCBhbmQgY29udGludWUuYDtcbiAgICB9XG4gICAgX3NldE1vZGVsV2l6YXJkU3RlcCg0KTtcbiAgfTtcblxuICBjb25zdCBzZXRGYWlsID0gKGVyck1zZykgPT4ge1xuICAgIGlmIChiYWRnZSkgIHsgYmFkZ2UudGV4dENvbnRlbnQgID0gRkFJTDsgYmFkZ2Uuc3R5bGUuZGlzcGxheSAgPSAnJzsgYmFkZ2UudGl0bGUgID0gZXJyTXNnOyB9XG4gICAgaWYgKHN0YXR1cykge1xuICAgICAgc3RhdHVzLmlubmVySFRNTCAgID0gYCR7RkFJTH0gPHNwYW4gdGl0bGU9XCIke2Vyck1zZy5yZXBsYWNlKC9cIi9nLCAnJnF1b3Q7Jyl9XCIgc3R5bGU9XCJjdXJzb3I6aGVscDsgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZSBkb3R0ZWQ7XCI+Q29ubmVjdGlvbiBmYWlsZWQ8L3NwYW4+YDtcbiAgICAgIHN0YXR1cy5zdHlsZS5jb2xvciA9ICcjZGMyNjI2JztcbiAgICAgIHN0YXR1cy5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgfVxuICAgIGlmIChidG4pICAgIHsgYnRuLmRpc2FibGVkID0gZmFsc2U7IGJ0bi5pbm5lckhUTUwgPSAnJiMxMDAwMzsgVGVzdCBjb25uZWN0aW9uJzsgfVxuICAgIF91cGRhdGVMbG1TdGF0dXNQaWxsKCdlcnJvcicsICdDb25uZWN0aW9uIGZhaWxlZCcsICdcdTI2QTAnLCBlcnJNc2cpO1xuICAgIGlmIChfbW9kZWxXaXphcmRTdGVwID09PSAzKSB7XG4gICAgICBfc2V0TW9kZWxXaXphcmRTdGVwKDIpO1xuICAgIH1cbiAgfTtcblxuICBzZXRSdW5uaW5nKCk7XG4gIF9zaG93TW9kZWxXaXphcmRCdXN5KCdUZXN0aW5nIG1vZGVsIGNvbm5lY3Rpb24uLi4nKTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhcGlDYWxsKCdQT1NUJywgJy9hcGkvbW9kZWwvdGVzdCcpO1xuICAgIGlmIChyZXN1bHQub2spIHtcbiAgICAgIHNldE9rKHJlc3VsdC5sYXRlbmN5X21zKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBzZXRGYWlsKHJlc3VsdC5lcnJvciB8fCAnVW5rbm93biBlcnJvcicpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHNldEZhaWwoZS5tZXNzYWdlIHx8IFN0cmluZyhlKSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGZpbmFsbHkge1xuICAgIF9oaWRlTW9kZWxXaXphcmRCdXN5KCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX3VwZGF0ZVByaWNpbmdGb290ZXIoKSB7XG4gIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ByaWNpbmctdXBkYXRlZC1sYWJlbCcpO1xuICBpZiAoIWVsIHx8ICFfbW9kZWxEYXRhKSByZXR1cm47XG4gIGNvbnN0IHRzICAgICA9IF9tb2RlbERhdGEucHJpY2luZ191cGRhdGVkX2F0O1xuICBjb25zdCBzb3VyY2UgPSBfbW9kZWxEYXRhLnByaWNpbmdfc291cmNlO1xuXG4gIGNvbnN0IHNvdXJjZUxhYmVsID0gKHNvdXJjZSA9PT0gJ29wZW5yb3V0ZXInKVxuICAgID8gJzxhIGhyZWY9XCJodHRwczovL29wZW5yb3V0ZXIuYWlcIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lclwiICcgK1xuICAgICAgJ3N0eWxlPVwiY29sb3I6aW5oZXJpdDsgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZSBkb3R0ZWQ7XCI+T3BlblJvdXRlcjwvYT4nXG4gICAgOiAnc3RhdGljIGJhc2VsaW5lIChNYXJjaCAyMDI2KSc7XG5cbiAgaWYgKCF0cykgeyBlbC5pbm5lckhUTUwgPSBgUHJpY2VzOiAke3NvdXJjZUxhYmVsfWA7IHJldHVybjsgfVxuICB0cnkge1xuICAgIGNvbnN0IGQgICA9IG5ldyBEYXRlKHRzKTtcbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgIGNvbnN0IGggICA9IE1hdGgucm91bmQoKG5vdyAtIGQpIC8gM182MDBfMDAwKTtcbiAgICBjb25zdCBhZ2UgPSBoIDwgMSA/ICdqdXN0IG5vdycgOiBoIDwgMjQgPyBgJHtofWggYWdvYCA6IGAke01hdGgucm91bmQoaCAvIDI0KX1kIGFnb2A7XG4gICAgZWwuaW5uZXJIVE1MID0gYFByaWNlcyB2aWEgJHtzb3VyY2VMYWJlbH0gJm1pZGRvdDsgdXBkYXRlZCAke2FnZX1gO1xuICB9IGNhdGNoIHsgZWwuaW5uZXJIVE1MID0gYFByaWNlczogJHtzb3VyY2VMYWJlbH1gOyB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlZnJlc2hNb2RlbFByaWNpbmcoKSB7XG4gIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcmljaW5nLXJlZnJlc2gtYnRuJyk7XG4gIGNvbnN0IGxibCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcmljaW5nLXVwZGF0ZWQtbGFiZWwnKTtcbiAgaWYgKGJ0bikgeyBidG4uZGlzYWJsZWQgPSB0cnVlOyBidG4udGV4dENvbnRlbnQgPSAnUmVmcmVzaGluZ1x1MjAyNic7IH1cbiAgX3Nob3dNb2RlbFdpemFyZEJ1c3koJ1JlZnJlc2hpbmcgbW9kZWwgcHJpY2luZy4uLicpO1xuICB0cnkge1xuICAgIGF3YWl0IGFwaUNhbGwoJ1BPU1QnLCAnL2FwaS9tb2RlbC1wcmljaW5nL3JlZnJlc2gnKTtcbiAgICAvLyBSZS1mZXRjaCBtb2RlbCBkYXRhIHNvIHRoZSB0YWJsZSBnZXRzIGZyZXNoIHByaWNlc1xuICAgIF9tb2RlbERhdGEgPSBhd2FpdCBhcGlDYWxsKCdHRVQnLCAnL2FwaS9tb2RlbCcpO1xuICAgIF9idWlsZE1vZGVsVGFibGUoKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmIChsYmwpIGxibC50ZXh0Q29udGVudCA9ICdSZWZyZXNoIGZhaWxlZCc7XG4gICAgbG9nLmVycm9yKCdQcmljaW5nIHJlZnJlc2ggZmFpbGVkOicsIGUpO1xuICB9IGZpbmFsbHkge1xuICAgIF9oaWRlTW9kZWxXaXphcmRCdXN5KCk7XG4gICAgaWYgKGJ0bikgeyBidG4uZGlzYWJsZWQgPSBmYWxzZTsgYnRuLnRleHRDb250ZW50ID0gJ1x1MjFCQiBSZWZyZXNoIHByaWNlcyc7IH1cbiAgfVxufVxuXG5cbi8vIEhlbHBlcjogdXBkYXRlIHdvcmtmbG93IHN0ZXAgYmFyIGNsaWNrYWJsZSBzdGF0ZVxuZnVuY3Rpb24gdXBkYXRlV29ya2Zsb3dTdGVwc0NsaWNrYWJsZShjdXJyZW50UGhhc2UpIHtcbiAgLy8gU2VxdWVudGlhbCBwcmUtbGF5b3V0IHN0ZXBzIHVubG9jayBvbmUtYnktb25lIGFzIHRoZSB1c2VyIHByb2dyZXNzZXMuXG4gIGNvbnN0IHNlcXVlbnRpYWxTdGVwcyA9IFtcbiAgICAnc3RlcC1qb2InLFxuICAgICdzdGVwLWFuYWx5c2lzJyxcbiAgICAnc3RlcC1jdXN0b21pemF0aW9ucycsXG4gICAgJ3N0ZXAtcmV3cml0ZScsXG4gICAgJ3N0ZXAtc3BlbGwnLFxuICAgICdzdGVwLWxheW91dCcsXG4gIF07XG4gIC8vIFBvc3QtbGF5b3V0IHN0ZXBzIGFsbCB1bmxvY2sgc2ltdWx0YW5lb3VzbHkgb25jZSBsYXlvdXQgaXMgY29uZmlybWVkLlxuICBjb25zdCBwb3N0TGF5b3V0U3RlcHMgPSBbXG4gICAgJ3N0ZXAtZG93bmxvYWQnLFxuICAgICdzdGVwLWNvdmVyX2xldHRlcicsXG4gICAgJ3N0ZXAtc2NyZWVuaW5nJyxcbiAgICAnc3RlcC1pbnRlcnZpZXdfcHJlcCcsXG4gICAgJ3N0ZXAtdGhhbmtfeW91JyxcbiAgICAnc3RlcC1oYXJ2ZXN0JyxcbiAgXTtcbiAgLy8gTWFwIGJhY2tlbmQgcGhhc2Ugc3RyaW5ncyB0byBob3cgbWFueSBzZXF1ZW50aWFsIHN0ZXBzIGFyZSB1bmxvY2tlZCAoMC1iYXNlZCBpbmRleCkuXG4gIGNvbnN0IHBoYXNlVG9JbmRleCA9IHtcbiAgICAnaW5pdCc6ICAgICAgICAgICAgIDAsXG4gICAgJ2pvYl9hbmFseXNpcyc6ICAgICAxLFxuICAgICdjdXN0b21pemF0aW9uJzogICAgMixcbiAgICAncmV3cml0ZV9yZXZpZXcnOiAgIDMsXG4gICAgJ3NwZWxsX2NoZWNrJzogICAgICA0LFxuICAgICdnZW5lcmF0aW9uJzogICAgICAgNSxcbiAgICAnbGF5b3V0X3Jldmlldyc6ICAgIDUsXG4gICAgJ2ZpbmFsX2dlbmVyYXRpb24nOiA1LFxuICAgICdyZWZpbmVtZW50JzogICAgICAgNSxcbiAgICAvLyBMZWdhY3kgZmFsbGJhY2tzIChzdGVwIG5hbWVzIHNvbWV0aW1lcyBwYXNzZWQgb24gRE9NQ29udGVudExvYWRlZClcbiAgICAnam9iJzogICAgICAgICAgICAgIDAsXG4gICAgJ2xheW91dCc6ICAgICAgICAgICA1LFxuICAgICdmaW5hbGlzZSc6ICAgICAgICAgNSxcbiAgfTtcbiAgY29uc3QgcG9zdExheW91dFVubG9ja2VkID0gWydmaW5hbF9nZW5lcmF0aW9uJywgJ3JlZmluZW1lbnQnXS5pbmNsdWRlcyhjdXJyZW50UGhhc2UpO1xuICBjb25zdCBjdXJyZW50SWR4ID0gcGhhc2VUb0luZGV4W2N1cnJlbnRQaGFzZV0gPz8gMDtcblxuICBmdW5jdGlvbiBfbWFrZVN0ZXBDbGlja2FibGUoZWwpIHtcbiAgICBpZiAoIWVsIHx8IGVsLmNsYXNzTGlzdC5jb250YWlucygnY2xpY2thYmxlJykpIHJldHVybjtcbiAgICBlbC5jbGFzc0xpc3QuYWRkKCdjbGlja2FibGUnKTtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnYnV0dG9uJyk7XG4gICAgZWwuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICcwJyk7XG4gICAgaWYgKCFlbC5fc3RlcEtleUhhbmRsZXIpIHtcbiAgICAgIGVsLl9zdGVwS2V5SGFuZGxlciA9IChlKSA9PiB7XG4gICAgICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJyB8fCBlLmtleSA9PT0gJyAnKSB7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGVsLmNsaWNrKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZWwuX3N0ZXBLZXlIYW5kbGVyKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBfbWFrZVN0ZXBJbmVydChlbCkge1xuICAgIGlmICghZWwpIHJldHVybjtcbiAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCdjbGlja2FibGUnKTtcbiAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoJ3JvbGUnKTtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJy0xJyk7XG4gICAgaWYgKGVsLl9zdGVwS2V5SGFuZGxlcikge1xuICAgICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGVsLl9zdGVwS2V5SGFuZGxlcik7XG4gICAgICBkZWxldGUgZWwuX3N0ZXBLZXlIYW5kbGVyO1xuICAgIH1cbiAgfVxuXG4gIHNlcXVlbnRpYWxTdGVwcy5mb3JFYWNoKChpZCwgaWR4KSA9PiB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIGlmIChpZHggPD0gY3VycmVudElkeCB8fCBwb3N0TGF5b3V0VW5sb2NrZWQpIHtcbiAgICAgIF9tYWtlU3RlcENsaWNrYWJsZShlbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIF9tYWtlU3RlcEluZXJ0KGVsKTtcbiAgICB9XG4gIH0pO1xuXG4gIHBvc3RMYXlvdXRTdGVwcy5mb3JFYWNoKGlkID0+IHtcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICBpZiAoIWVsKSByZXR1cm47XG4gICAgaWYgKHBvc3RMYXlvdXRVbmxvY2tlZCkge1xuICAgICAgX21ha2VTdGVwQ2xpY2thYmxlKGVsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgX21ha2VTdGVwSW5lcnQoZWwpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gTWFyayB0aGUgY3VycmVudGx5IGFjdGl2ZSBzdGVwIGZvciBzY3JlZW4gcmVhZGVycy5cbiAgY29uc3QgYWxsU3RlcElkcyA9IFsuLi5zZXF1ZW50aWFsU3RlcHMsIC4uLnBvc3RMYXlvdXRTdGVwc107XG4gIGFsbFN0ZXBJZHMuZm9yRWFjaChpZCA9PiB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgaWYgKGVsKSBlbC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtY3VycmVudCcpO1xuICB9KTtcbiAgLy8gRm9yIHBvc3QtbGF5b3V0IHBoYXNlcywgbWFyayBzdGVwLWRvd25sb2FkIGFzIHRoZSBhY3RpdmUgc3RlcCBzbyBzY3JlZW4gcmVhZGVyc1xuICAvLyBoYXZlIGEgcHJvZ3JhbW1hdGljIGN1cnJlbnQtcG9zaXRpb24gaW5kaWNhdG9yLlxuICBjb25zdCBhY3RpdmVTdGVwSWQgPSBwb3N0TGF5b3V0VW5sb2NrZWQgPyAnc3RlcC1kb3dubG9hZCcgOiBzZXF1ZW50aWFsU3RlcHNbY3VycmVudElkeF07XG4gIGlmIChhY3RpdmVTdGVwSWQpIHtcbiAgICBjb25zdCBhY3RpdmVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFjdGl2ZVN0ZXBJZCk7XG4gICAgaWYgKGFjdGl2ZUVsKSBhY3RpdmVFbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtY3VycmVudCcsICdzdGVwJyk7XG4gIH1cbn1cblxuLy8gSW5pdGlhbGl6ZSBvbiBwYWdlIGxvYWQgXHUyMDE0IGRlbGVnYXRlcyB0byBhcHAuanMgaW5pdCgpIHdoaWNoIGlzIGxvYWRlZCBhZnRlciB0aGlzIGZpbGVcbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB7XG4gIGxvYWRNb2RlbFNlbGVjdG9yKCk7XG5cbiAgLy8gV2lyZSB1cCB0YWIgc2Nyb2xsIGFycm93IGJ1dHRvbnNcbiAgY29uc3QgdGFiQmFyICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFiLWJhcicpO1xuICBjb25zdCBsZWZ0QnRuICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWItc2Nyb2xsLWxlZnQnKTtcbiAgY29uc3QgcmlnaHRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFiLXNjcm9sbC1yaWdodCcpO1xuICBpZiAodGFiQmFyICYmIGxlZnRCdG4gJiYgcmlnaHRCdG4pIHtcbiAgICBsZWZ0QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgICgpID0+IHsgdGFiQmFyLnNjcm9sbEJ5KHsgbGVmdDogLTE2MCwgYmVoYXZpb3I6ICdzbW9vdGgnIH0pOyB9KTtcbiAgICByaWdodEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHsgdGFiQmFyLnNjcm9sbEJ5KHsgbGVmdDogIDE2MCwgYmVoYXZpb3I6ICdzbW9vdGgnIH0pOyB9KTtcbiAgICB0YWJCYXIuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdXBkYXRlVGFiU2Nyb2xsQnV0dG9ucyk7XG4gICAgbmV3IFJlc2l6ZU9ic2VydmVyKHVwZGF0ZVRhYlNjcm9sbEJ1dHRvbnMpLm9ic2VydmUodGFiQmFyKTtcbiAgfVxuXG4gIC8vIFNob3cgb25seSB0aGUgSm9iIHRhYiB1bnRpbCBmZXRjaFN0YXR1cyByZXNvbHZlcyB0aGUgYWN0dWFsIHN0YWdlXG4gIHVwZGF0ZVRhYkJhckZvclN0YWdlKCdqb2InKTtcbiAgdXBkYXRlV29ya2Zsb3dTdGVwc0NsaWNrYWJsZSgnam9iJyk7XG5cbiAgLy8gTGlzdGVuIGZvciBwaGFzZSBjaGFuZ2VzIHRvIHVwZGF0ZSBjbGlja2FibGUgc3RlcHNcbiAgaWYgKHR5cGVvZiBzdGF0ZU1hbmFnZXI/Lm9uUGhhc2VDaGFuZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICBzdGF0ZU1hbmFnZXIub25QaGFzZUNoYW5nZSgocGhhc2UpID0+IHtcbiAgICAgIHVwZGF0ZVdvcmtmbG93U3RlcHNDbGlja2FibGUocGhhc2UpO1xuICAgIH0pO1xuICB9XG5cbn0pO1xuXG4vLyBcdTI1MDBcdTI1MDAgRVMgbW9kdWxlIGV4cG9ydHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5leHBvcnQge1xuICAvLyBGb2N1cyAvIGFjY2Vzc2liaWxpdHlcbiAgc2V0SW5pdGlhbEZvY3VzLCB0cmFwRm9jdXMsIHJlc3RvcmVGb2N1cywgcHVzaEZvY3VzU3RhY2ssXG4gIC8vIERpYWxvZ3MgJiBtb2RhbHNcbiAgY29uZmlybURpYWxvZywgb3Blbk1vZGFsLCBjbG9zZU1vZGFsLCBjbG9zZUFsbE1vZGFscyxcbiAgLy8gVGFiICYgc3RhZ2UgbWFuYWdlbWVudFxuICBzZXR1cEV2ZW50TGlzdGVuZXJzLCBnZXRTdGFnZUZvclRhYiwgZ2V0VmlzaWJsZVN0YWdlLCB1cGRhdGVUYWJCYXJGb3JTdGFnZSxcbiAgLy8gQ2hhdFxuICB0b2dnbGVDaGF0LFxuICAvLyBNb2RlbCBzZWxlY3RvclxuICBsb2FkTW9kZWxTZWxlY3Rvciwgb3Blbk1vZGVsTW9kYWwsIGNsb3NlTW9kZWxNb2RhbCwgc2V0TW9kZWwsIHRlc3RDdXJyZW50TW9kZWwsIHJlZnJlc2hNb2RlbFByaWNpbmcsXG4gIHRvZ2dsZU1vZGVsQ2F0YWxvZ1Zpc2liaWxpdHksIHN0YXJ0Q29waWxvdEF1dGhGcm9tV2l6YXJkLCBsb2dvdXRDb3BpbG90QXV0aEZyb21XaXphcmQsXG4gIG5leHRXaXphcmRTdGVwLCBwcmV2aW91c1dpemFyZFN0ZXAsXG4gIHNhdmVQcm92aWRlckFwaUtleSwgdG9nZ2xlQXBpS2V5VmlzaWJpbGl0eSxcbiAgX3VwZGF0ZUxsbVN0YXR1c1BpbGwsXG4gIC8vIFNldHRpbmdzIG1vZGFsXG4gIG9wZW5TZXR0aW5nc01vZGFsLCBjbG9zZVNldHRpbmdzTW9kYWwsIHNhdmVTZXR0aW5nc01vZGFsLCByZWxvYWRTZXR0aW5nc01vZGFsLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL3dvcmtmbG93LXN0ZXBzLmpzXG4gKiBXb3JrZmxvdyBwcm9ncmVzcyBiYXIsIHBoYXNlIHJlLXJ1bi9iYWNrLW5hdiwgYW5kIGJ1bGxldCByZW9yZGVyIG1vZGFsLlxuICpcbiAqIERlcGVuZGVuY2llcyAocmVzb2x2ZWQgdGhyb3VnaCBnbG9iYWxUaGlzIGF0IHJ1bnRpbWUpOlxuICogICBQSEFTRVMsIGVzY2FwZUh0bWwsXG4gKiAgIGFwcGVuZExvYWRpbmdNZXNzYWdlLCByZW1vdmVMb2FkaW5nTWVzc2FnZSwgYXBwZW5kUmV0cnlNZXNzYWdlLCBhcHBlbmRNZXNzYWdlLFxuICogICBzZXRMb2FkaW5nLCBmZXRjaFN0YXR1cywgc3dpdGNoVGFiLCBzZW5kQWN0aW9uLFxuICogICBzaG93TG9hZEpvYlBhbmVsLCB1cGRhdGVBY3Rpb25CdXR0b25zLCB1cGRhdGVUYWJCYXJGb3JTdGFnZSxcbiAqICAgdHJhcEZvY3VzLCByZXN0b3JlRm9jdXMsIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsLFxuICogICBwb3N0QW5hbHlzaXNRdWVzdGlvbnMsIHF1ZXN0aW9uQW5zd2VycywgQ1NTXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCd3b3JrZmxvdy1zdGVwcycpO1xuXG5pbXBvcnQgeyBzdGF0ZU1hbmFnZXIsIEdFTkVSQVRJT05fU1RBVEVfRVZFTlQgfSBmcm9tICcuL3N0YXRlLW1hbmFnZXIuanMnO1xuXG5mdW5jdGlvbiBfZmluZEV4cGVyaWVuY2VSZWNvbW1lbmRhdGlvblJlY29yZChleHBJZCkge1xuICBjb25zdCBkYXRhID0gZ2xvYmFsVGhpcy53aW5kb3c/LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnM7XG4gIGlmICghZGF0YSB8fCAhQXJyYXkuaXNBcnJheShkYXRhLmV4cGVyaWVuY2VfcmVjb21tZW5kYXRpb25zKSkgcmV0dXJuIG51bGw7XG4gIHJldHVybiBkYXRhLmV4cGVyaWVuY2VfcmVjb21tZW5kYXRpb25zLmZpbmQoKHJlYykgPT4gU3RyaW5nKHJlYz8uaWQgfHwgcmVjPy5leHBlcmllbmNlX2lkIHx8ICcnKSA9PT0gU3RyaW5nKGV4cElkKSkgfHwgbnVsbDtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFN0ZXAtb3JkZXIgY29uc3RhbnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5jb25zdCBfU1RFUF9PUkRFUiA9IFtcbiAgJ2pvYicsICdhbmFseXNpcycsICdjdXN0b21pemF0aW9ucycsICdyZXdyaXRlJywgJ3NwZWxsJywgJ2xheW91dCcsXG4gICdkb3dubG9hZCcsICdjb3Zlcl9sZXR0ZXInLCAnc2NyZWVuaW5nJywgJ2ludGVydmlld19wcmVwJywgJ3RoYW5rX3lvdScsICdoYXJ2ZXN0Jyxcbl07XG5jb25zdCBfU1RFUF9ESVNQTEFZID0ge1xuICBqb2I6ICAgICAgICAgICAgJ0pvYiBJbnB1dCcsXG4gIGFuYWx5c2lzOiAgICAgICAnSm9iIEFuYWx5c2lzJyxcbiAgY3VzdG9taXphdGlvbnM6ICdDdXN0b21pc2UnLFxuICByZXdyaXRlOiAgICAgICAgJ1Jld3JpdGUgUmV2aWV3JyxcbiAgc3BlbGw6ICAgICAgICAgICdTcGVsbCBDaGVjaycsXG4gIGxheW91dDogICAgICAgICAnTGF5b3V0IFJldmlldycsXG4gIGRvd25sb2FkOiAgICAgICAnRmlsZSBSZXZpZXcnLFxuICBjb3Zlcl9sZXR0ZXI6ICAgJ0NvdmVyIExldHRlcicsXG4gIHNjcmVlbmluZzogICAgICAnU2NyZWVuaW5nJyxcbiAgaW50ZXJ2aWV3X3ByZXA6ICdJbnRlcnZpZXcgUHJlcCcsXG4gIHRoYW5rX3lvdTogICAgICAnVGhhbmsgWW91JyxcbiAgaGFydmVzdDogICAgICAgICdIYXJ2ZXN0Jyxcbn07XG5jb25zdCBfQUNUSU9OX0xBQkVMUyA9IHtcbiAgcmVjb21tZW5kX2N1c3RvbWl6YXRpb25zOiAnU2VsZWN0aW5nIGV4cGVyaWVuY2VzICYgc2tpbGxzXHUyMDI2JyxcbiAgZ2VuZXJhdGVfY3Y6ICdHZW5lcmF0aW5nIENWXHUyMDI2Jyxcbn07XG5cbmNvbnN0IF9OQVZfVEFCX0xBQkVMUyA9IHtcbiAgZG93bmxvYWQ6ICdcdTJCMDdcdUZFMEYgRmlsZSBSZXZpZXcnLFxufTtcblxuZnVuY3Rpb24gYXBwbHlMYXlvdXRGcmVzaG5lc3NOYXZpZ2F0aW9uU3RhdGUoKSB7XG4gIGNvbnN0IGZyZXNobmVzcyA9IHN0YXRlTWFuYWdlci5nZXRMYXlvdXRGcmVzaG5lc3MoKTtcbiAgY29uc3QgZ2VuZXJhdGlvblN0YXRlID0gc3RhdGVNYW5hZ2VyLmdldEdlbmVyYXRpb25TdGF0ZSgpO1xuICBjb25zdCBsYXlvdXRTdGVwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0ZXAtbGF5b3V0Jyk7XG5cbiAgaWYgKGxheW91dFN0ZXApIHtcbiAgICBsYXlvdXRTdGVwLmNsYXNzTGlzdC5yZW1vdmUoJ3N0YWxlJywgJ3N0YWxlLWNyaXRpY2FsJyk7XG4gICAgY29uc3QgcmVydW4gPSBsYXlvdXRTdGVwLnF1ZXJ5U2VsZWN0b3IoJy5zdGVwLXJlcnVuJyk/Lm91dGVySFRNTCB8fCAnJztcbiAgICBjb25zdCByZWZpbmVCYWRnZSA9IGxheW91dFN0ZXAucXVlcnlTZWxlY3RvcignLnN0ZXAtaW5saW5lLWJhZGdlJyk/Lm91dGVySFRNTCB8fCAnJztcbiAgICBjb25zdCBzdGFsZUJhZGdlID0gZnJlc2huZXNzLmlzU3RhbGVcbiAgICAgID8gJyA8c3BhbiBjbGFzcz1cInN0ZXAtaW5saW5lLWJhZGdlIHN0ZXAtc3RhbGUtYmFkZ2VcIj5PdXRkYXRlZDwvc3Bhbj4nXG4gICAgICA6ICcnO1xuICAgIGlmIChmcmVzaG5lc3MuaXNTdGFsZSkge1xuICAgICAgbGF5b3V0U3RlcC5jbGFzc0xpc3QuYWRkKCdzdGFsZScpO1xuICAgICAgaWYgKGZyZXNobmVzcy5pc0NyaXRpY2FsKSBsYXlvdXRTdGVwLmNsYXNzTGlzdC5hZGQoJ3N0YWxlLWNyaXRpY2FsJyk7XG4gICAgfVxuICAgIGxheW91dFN0ZXAuaW5uZXJIVE1MID0gYFx1RDgzQ1x1REZBOCBMYXlvdXQgUmV2aWV3JHtzdGFsZUJhZGdlfSR7cmVmaW5lQmFkZ2UgPyBgICR7cmVmaW5lQmFkZ2V9YCA6ICcnfSR7cmVydW4gPyBgICR7cmVydW59YCA6ICcnfWA7XG4gIH1cblxuICBjb25zdCBzaG93RG93bnN0cmVhbUJhZGdlID0gZnJlc2huZXNzLmlzU3RhbGUgJiYgQm9vbGVhbihcbiAgICBnZW5lcmF0aW9uU3RhdGUuZmluYWxHZW5lcmF0ZWRBdCB8fCBnZW5lcmF0aW9uU3RhdGUucGhhc2UgPT09ICdmaW5hbF9jb21wbGV0ZSdcbiAgKTtcbiAgT2JqZWN0LmVudHJpZXMoX05BVl9UQUJfTEFCRUxTKS5mb3JFYWNoKChbdGFiLCBsYWJlbF0pID0+IHtcbiAgICBjb25zdCB0YWJFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGB0YWItJHt0YWJ9YCk7XG4gICAgaWYgKCF0YWJFbCkgcmV0dXJuO1xuICAgIHRhYkVsLmNsYXNzTGlzdC5yZW1vdmUoJ3RhYi1zdGFsZScsICd0YWItc3RhbGUtY3JpdGljYWwnKTtcbiAgICBpZiAoc2hvd0Rvd25zdHJlYW1CYWRnZSkge1xuICAgICAgdGFiRWwuY2xhc3NMaXN0LmFkZCgndGFiLXN0YWxlJyk7XG4gICAgICBpZiAoZnJlc2huZXNzLmlzQ3JpdGljYWwpIHRhYkVsLmNsYXNzTGlzdC5hZGQoJ3RhYi1zdGFsZS1jcml0aWNhbCcpO1xuICAgICAgdGFiRWwuaW5uZXJIVE1MID0gYCR7bGFiZWx9IDxzcGFuIGNsYXNzPVwidGFiLXN0YWxlLWJhZGdlXCI+T3V0ZGF0ZWQ8L3NwYW4+YDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGFiRWwudGV4dENvbnRlbnQgPSBsYWJlbDtcbiAgICB9XG4gIH0pO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgQmFjayB0byBwaGFzZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gYmFja1RvUGhhc2Uoc3RlcCwgZmVlZGJhY2spIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBib2R5ID0gZmVlZGJhY2sgPyB7cGhhc2U6IHN0ZXAsIGZlZWRiYWNrfSA6IHtwaGFzZTogc3RlcH07XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL2JhY2stdG8tcGhhc2UnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmICghcmVzLm9rIHx8ICFkYXRhLm9rKSB7XG4gICAgICBhcHBlbmRSZXRyeU1lc3NhZ2UoJ1x1MjZBMCBDb3VsZCBub3QgbmF2aWdhdGUgYmFjazogJyArIChkYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yJyksICgpID0+IGJhY2tUb1BoYXNlKHN0ZXAsIGZlZWRiYWNrKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIGBcdTIxQkIgTmF2aWdhdGluZyBiYWNrIHRvICR7c3RlcH0uIFByaW9yIGRlY2lzaW9ucyBhbmQgYXBwcm92YWxzIGFyZSBwcmVzZXJ2ZWQuYCk7XG4gICAgaWYgKGZlZWRiYWNrKSBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCBgUmVmaW5lbWVudCBmZWVkYmFjayBxdWV1ZWQ6IFwiJHtmZWVkYmFja31cImApO1xuICAgIGF3YWl0IGZldGNoU3RhdHVzKCk7XG5cbiAgICAvLyBTd2l0Y2ggdG8gdGhlIGFwcHJvcHJpYXRlIHZpZXdlciB0YWJcbiAgICBjb25zdCB0YWJNYXAgPSB7XG4gICAgICBqb2I6ICAgICAgICAgICAgbnVsbCxcbiAgICAgIGFuYWx5c2lzOiAgICAgICAnYW5hbHlzaXMnLFxuICAgICAgY3VzdG9taXphdGlvbnM6ICdnb2FscycsXG4gICAgICByZXdyaXRlOiAgICAgICAgJ3Jld3JpdGUnLFxuICAgICAgc3BlbGw6ICAgICAgICAgICdzcGVsbCcsXG4gICAgfTtcbiAgICBjb25zdCByZXNvbHZlZFRhYiA9IHRhYk1hcFtzdGVwXSB8fCB0YWJNYXBbZGF0YS5waGFzZV0gfHwgbnVsbDtcbiAgICBpZiAocmVzb2x2ZWRUYWIpIHN3aXRjaFRhYihyZXNvbHZlZFRhYik7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGFwcGVuZFJldHJ5TWVzc2FnZSgnXHUyNkEwIE5ldHdvcmsgZXJyb3IgaW4gYmFja1RvUGhhc2U6ICcgKyBlcnIubWVzc2FnZSwgKCkgPT4gYmFja1RvUGhhc2Uoc3RlcCkpO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBSZS1ydW4gY29uZmlybSBtb2RhbCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLyoqXG4gKiBTaG93IGEgZG93bnN0cmVhbS1hd2FyZSBjb25maXJtYXRpb24gbW9kYWwgYmVmb3JlIHJlLXJ1bm5pbmcgb3IgYmFjay1uYXZpZ2F0aW5nLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgc3RlcCAgICAgIC0gVGhlIHRhcmdldCBzdGVwIGtleVxuICogQHBhcmFtIHsncmVydW4nfCdiYWNrLW5hdid9IG1vZGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IG9uQ29uZmlybSAtIENhbGxlZCBpZiB0aGUgdXNlciBjbGlja3MgUHJvY2VlZFxuICovXG5mdW5jdGlvbiBfc2hvd1JlUnVuQ29uZmlybU1vZGFsKHN0ZXAsIG1vZGUsIG9uQ29uZmlybSkge1xuICBjb25zdCBzdGVwSWR4ICAgID0gX1NURVBfT1JERVIuaW5kZXhPZihzdGVwKTtcbiAgLy8gT25seSBzaG93IGRvd25zdHJlYW0gc3RhZ2VzIHRoYXQgaGF2ZSBhY3R1YWxseSBiZWVuIGNvbXBsZXRlZFxuICBjb25zdCBkb3duc3RyZWFtID0gX1NURVBfT1JERVIuc2xpY2Uoc3RlcElkeCArIDEpLmZpbHRlcihzID0+IHtcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzdGVwLSR7c31gKTtcbiAgICByZXR1cm4gZWwgJiYgZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdjb21wbGV0ZWQnKTtcbiAgfSk7XG4gIGNvbnN0IHN0ZXBMYWJlbCAgPSBfU1RFUF9ESVNQTEFZW3N0ZXBdIHx8IHN0ZXA7XG5cbiAgY29uc3QgdGl0bGUgPSBtb2RlID09PSAncmVydW4nXG4gICAgPyBgXHUyMUJCIFJlLXJ1biAke3N0ZXBMYWJlbH0/YFxuICAgIDogYFx1MjE5MCBOYXZpZ2F0ZSBiYWNrIHRvICR7c3RlcExhYmVsfT9gO1xuICBjb25zdCBib2R5VGV4dCA9IG1vZGUgPT09ICdyZXJ1bidcbiAgICA/ICdUaGUgZm9sbG93aW5nIHN0YWdlcyB3aWxsIHNlZSB1cGRhdGVkIGlucHV0cyBhbmQgbWF5IHNob3cgY2hhbmdlZCByZWNvbW1lbmRhdGlvbnM6J1xuICAgIDogJ1lvdSBhcmUgbmF2aWdhdGluZyBiYWNrIHBhc3QgdGhlIGZvbGxvd2luZyBjb21wbGV0ZWQgc3RhZ2VzOic7XG4gIGNvbnN0IG5vdGUgPSAnQWxsIGV4aXN0aW5nIGFwcHJvdmFscyBhbmQgcmV3cml0ZXMgYXJlIHByZXNlcnZlZCBhcyBjb250ZXh0Lic7XG5cbiAgY29uc3QgbGlzdEh0bWwgPSBkb3duc3RyZWFtXG4gICAgLm1hcChzID0+IGA8bGkgc3R5bGU9XCJwYWRkaW5nOjJweCAwO1wiPiR7X1NURVBfRElTUExBWVtzXSB8fCBzfTwvbGk+YClcbiAgICAuam9pbignJyk7XG5cbiAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBvdmVybGF5LmlkID0gJ3JlcnVuLWNvbmZpcm0tb3ZlcmxheSc7XG4gIG92ZXJsYXkuc3R5bGUuY3NzVGV4dCA9IGBwb3NpdGlvbjpmaXhlZDtpbnNldDowO2JhY2tncm91bmQ6cmdiYSgwLDAsMCwwLjUpO1xuICAgIHotaW5kZXg6MTAwMDA7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2A7XG4gIG92ZXJsYXkuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgcm9sZT1cImRpYWxvZ1wiIGFyaWEtbW9kYWw9XCJ0cnVlXCIgYXJpYS1sYWJlbGxlZGJ5PVwicmVydW4tY29uZmlybS10aXRsZVwiXG4gICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6I2ZmZjtib3JkZXItcmFkaXVzOjEwcHg7cGFkZGluZzoyNHB4IDI4cHg7bWF4LXdpZHRoOjQ0MHB4O1xuICAgICAgICAgICAgICAgIHdpZHRoOjkyJTtib3gtc2hhZG93OjAgMjBweCA2MHB4IHJnYmEoMCwwLDAsMC4zKTtcIj5cbiAgICAgIDxoMyBpZD1cInJlcnVuLWNvbmZpcm0tdGl0bGVcIiBzdHlsZT1cIm1hcmdpbjowIDAgMTBweDtmb250LXNpemU6MS4xZW07Y29sb3I6IzFlMjkzYjtcIj5cbiAgICAgICAgJHtlc2NhcGVIdG1sKHRpdGxlKX08L2gzPlxuICAgICAgPHAgc3R5bGU9XCJtYXJnaW46MCAwIDhweDtmb250LXNpemU6MC45ZW07Y29sb3I6IzQ3NTU2OTtcIj4ke2VzY2FwZUh0bWwoYm9keVRleHQpfTwvcD5cbiAgICAgIDx1bCBzdHlsZT1cIm1hcmdpbjowIDAgMTJweDtwYWRkaW5nLWxlZnQ6MjBweDtmb250LXNpemU6MC45ZW07Y29sb3I6IzM3NDE1MTtcIj4ke2xpc3RIdG1sfTwvdWw+XG4gICAgICA8cCBzdHlsZT1cIm1hcmdpbjowIDAgMThweDtmb250LXNpemU6MC44NWVtO2NvbG9yOiM2YjcyODA7XCI+JHtlc2NhcGVIdG1sKG5vdGUpfTwvcD5cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjEwcHg7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kO1wiPlxuICAgICAgICA8YnV0dG9uIGlkPVwicmVydW4tY2FuY2VsLWJ0blwiIGNsYXNzPVwiYnRuLXNlY29uZGFyeVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwicmVydW4tcHJvY2VlZC1idG5cIiBjbGFzcz1cImJ0bi1wcmltYXJ5XCI+UHJvY2VlZDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+YDtcblxuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG92ZXJsYXkpO1xuICBfZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIGlmICh0eXBlb2YgdHJhcEZvY3VzID09PSAnZnVuY3Rpb24nKSB0cmFwRm9jdXMoJ3JlcnVuLWNvbmZpcm0tb3ZlcmxheScpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVydW4tcHJvY2VlZC1idG4nKS5mb2N1cygpO1xuXG4gIGNvbnN0IGNsb3NlID0gKCkgPT4geyBvdmVybGF5LnJlbW92ZSgpOyByZXN0b3JlRm9jdXMoKTsgfTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlcnVuLWNhbmNlbC1idG4nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNsb3NlKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlcnVuLXByb2NlZWQtYnRuJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7IGNsb3NlKCk7IG9uQ29uZmlybSgpOyB9KTtcbiAgb3ZlcmxheS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGUgPT4geyBpZiAoZS50YXJnZXQgPT09IG92ZXJsYXkpIGNsb3NlKCk7IH0pO1xuICBvdmVybGF5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBlID0+IHsgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgY2xvc2UoKTsgfSk7XG59XG5cbmZ1bmN0aW9uIGNvbmZpcm1SZVJ1blBoYXNlKHN0ZXApIHtcbiAgX3Nob3dSZVJ1bkNvbmZpcm1Nb2RhbChzdGVwLCAncmVydW4nLCAoKSA9PiBiYWNrVG9QaGFzZShzdGVwKSk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBWaWV3LWN1cnNvciBpbmRpY2F0b3IgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8qKlxuICogUmV0dXJuIGEgdG9vbHRpcCBzdHJpbmcgZm9yIGEgc3RlcCBwaWxsIGJhc2VkIG9uIGl0cyBjb21iaW5lZCBzdGF0ZS5cbiAqL1xuZnVuY3Rpb24gX2dldFN0ZXBUb29sdGlwKHN0ZXAsIGlzQWN0aXZlLCBpc1ZpZXdpbmcsIGlzQnJvd3NpbmdBd2F5LCBpc0NvbXBsZXRlZCwgaXNTdGFsZSwgaXNTdGFsZUNyaXRpY2FsKSB7XG4gIGlmIChpc1N0YWxlQ3JpdGljYWwpIHJldHVybiBpc1ZpZXdpbmcgPyAnQ3JpdGljYWwgY2hhbmdlcyBcdTIwMTQgcmV2aWV3IHJlcXVpcmVkLiBDbGljayBcdTIxQkIgdG8gcmVydW4uJyA6ICdDcml0aWNhbCBjaGFuZ2VzIFx1MjAxNCByZXZpZXcgcmVxdWlyZWQuJztcbiAgaWYgKGlzU3RhbGUpICAgICAgICAgcmV0dXJuIGlzVmlld2luZyA/ICdSZXN1bHRzIG1heSBiZSBvdXRkYXRlZC4gQ2xpY2sgXHUyMUJCIHRvIHJlcnVuLicgICAgICAgICAgIDogJ1Jlc3VsdHMgbWF5IGJlIG91dGRhdGVkLic7XG4gIGlmIChpc0Jyb3dzaW5nQXdheSkgIHJldHVybiAnQWN0aXZlIHN0ZXAgXHUyMDE0IGNsaWNrIHRvIHJldHVybic7XG4gIGlmIChpc0FjdGl2ZSAmJiBpc1ZpZXdpbmcpICAgIHJldHVybiAnQ3VycmVudCBzdGVwJztcbiAgaWYgKGlzQ29tcGxldGVkICYmIGlzVmlld2luZykgcmV0dXJuICdDbGljayBcdTIxQkIgdG8gcmVydW4gZnJvbSBoZXJlJztcbiAgaWYgKGlzQ29tcGxldGVkKSAgICAgICAgICAgICAgcmV0dXJuICdDbGljayB0byB2aWV3JztcbiAgcmV0dXJuICcnO1xufVxuXG4vKipcbiAqIFN5bmMgdGhlIGJsdWUgcmluZyAodmlldyBjdXJzb3IpIGFuZCBhbWJlciBwdWxzaW5nIHJpbmcgKGJyb3dzaW5nLWF3YXkpXG4gKiB0byB0aGUgY3VycmVudGx5IHZpc2libGUgdGFiLiBDYWxsZWQgYWZ0ZXIgZXZlcnkgdGFiIHN3aXRjaCBhbmQgc3RhdHVzIHVwZGF0ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWJOYW1lIC0gVGhlIGN1cnJlbnRseSB2aXNpYmxlIHRhYiBpZCAoZS5nLiAnYW5hbHlzaXMnLCAnZXhwLXJldmlldycpXG4gKi9cbmZ1bmN0aW9uIF91cGRhdGVWaWV3aW5nSW5kaWNhdG9yKHRhYk5hbWUpIHtcbiAgY29uc3QgdGFiVG9TdGVwID0ge1xuICAgICdqb2InOiAgICAgICAgICAgJ2pvYicsXG4gICAgJ2FuYWx5c2lzJzogICAgICAnYW5hbHlzaXMnLFxuICAgICdxdWVzdGlvbnMnOiAgICAgJ2FuYWx5c2lzJyxcbiAgICAnZXhwLXJldmlldyc6ICAgICdjdXN0b21pemF0aW9ucycsXG4gICAgJ3Jld3JpdGUnOiAgICAgICAncmV3cml0ZScsXG4gICAgJ3NwZWxsJzogICAgICAgICAnc3BlbGwnLFxuICAgICdsYXlvdXQnOiAgICAgICAgJ2xheW91dCcsXG4gICAgJ2ZpbmFsX2dlbmVyYXRlJzonZG93bmxvYWQnLFxuICAgICdkb3dubG9hZCc6ICAgICAgJ2Rvd25sb2FkJyxcbiAgICAnY292ZXItbGV0dGVyJzogICdjb3Zlcl9sZXR0ZXInLFxuICAgICdzY3JlZW5pbmcnOiAgICAgJ3NjcmVlbmluZycsXG4gICAgJ2ludGVydmlldy1wcmVwJzonaW50ZXJ2aWV3X3ByZXAnLFxuICAgICd0aGFuay15b3UnOiAgICAgJ3RoYW5rX3lvdScsXG4gICAgJ2hhcnZlc3QnOiAgICAgICAnaGFydmVzdCcsXG4gIH07XG4gIGNvbnN0IHZpZXdlZFN0ZXAgPSB0YWJUb1N0ZXBbdGFiTmFtZV0gfHwgbnVsbDtcblxuICBsZXQgYWN0aXZlU3RlcCA9IG51bGw7XG4gIF9TVEVQX09SREVSLmZvckVhY2goc3RlcCA9PiB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc3RlcC0ke3N0ZXB9YCk7XG4gICAgaWYgKGVsICYmIGVsLmNsYXNzTGlzdC5jb250YWlucygnYWN0aXZlJykpIGFjdGl2ZVN0ZXAgPSBzdGVwO1xuICB9KTtcblxuICBfU1RFUF9PUkRFUi5mb3JFYWNoKHN0ZXAgPT4ge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHN0ZXAtJHtzdGVwfWApO1xuICAgIGlmICghZWwpIHJldHVybjtcblxuICAgIGNvbnN0IGlzVmlld2luZyAgICAgID0gc3RlcCA9PT0gdmlld2VkU3RlcDtcbiAgICBjb25zdCBpc0FjdGl2ZSAgICAgICA9IHN0ZXAgPT09IGFjdGl2ZVN0ZXA7XG4gICAgY29uc3QgaXNCcm93c2luZ0F3YXkgPSBpc0FjdGl2ZSAmJiAhIXZpZXdlZFN0ZXAgJiYgdmlld2VkU3RlcCAhPT0gYWN0aXZlU3RlcDtcbiAgICBjb25zdCBpc0NvbXBsZXRlZCAgICA9IGVsLmNsYXNzTGlzdC5jb250YWlucygnY29tcGxldGVkJyk7XG4gICAgY29uc3QgaXNTdGFsZSAgICAgICAgPSBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ3N0YWxlJyk7XG4gICAgY29uc3QgaXNTdGFsZUNyaXRpY2FsID0gZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdzdGFsZS1jcml0aWNhbCcpO1xuXG4gICAgZWwuY2xhc3NMaXN0LnRvZ2dsZSgndmlld2luZycsICAgICAgIGlzVmlld2luZyk7XG4gICAgZWwuY2xhc3NMaXN0LnRvZ2dsZSgnYnJvd3NpbmctYXdheScsIGlzQnJvd3NpbmdBd2F5KTtcblxuICAgIGNvbnN0IHRvb2x0aXBUZXh0ID0gX2dldFN0ZXBUb29sdGlwKHN0ZXAsIGlzQWN0aXZlLCBpc1ZpZXdpbmcsIGlzQnJvd3NpbmdBd2F5LCBpc0NvbXBsZXRlZCwgaXNTdGFsZSwgaXNTdGFsZUNyaXRpY2FsKTtcbiAgICBpZiAodG9vbHRpcFRleHQpIHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZSgnZGF0YS1icy10b2dnbGUnLCAgICAndG9vbHRpcCcpO1xuICAgICAgZWwuc2V0QXR0cmlidXRlKCdkYXRhLWJzLXBsYWNlbWVudCcsICdib3R0b20nKTtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZSgnZGF0YS1icy10aXRsZScsICAgICB0b29sdGlwVGV4dCk7XG4gICAgICBpZiAodHlwZW9mIGJvb3RzdHJhcCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY29uc3QgdGlwID0gYm9vdHN0cmFwLlRvb2x0aXAuZ2V0SW5zdGFuY2UoZWwpO1xuICAgICAgICBpZiAodGlwKSB0aXAuc2V0Q29udGVudCh7ICcudG9vbHRpcC1pbm5lcic6IHRvb2x0aXBUZXh0IH0pO1xuICAgICAgICBlbHNlICAgICBuZXcgYm9vdHN0cmFwLlRvb2x0aXAoZWwpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtYnMtdG9nZ2xlJyk7XG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtYnMtdGl0bGUnKTtcbiAgICAgIGlmICh0eXBlb2YgYm9vdHN0cmFwICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBjb25zdCB0aXAgPSBib290c3RyYXAuVG9vbHRpcC5nZXRJbnN0YW5jZShlbCk7XG4gICAgICAgIGlmICh0aXApIHRpcC5kaXNwb3NlKCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFJlLXJ1biBwaGFzZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLyoqXG4gKiBTaG93IGFuIGFtZW5kLWNsYXJpZmljYXRpb25zIG1vZGFsIGJlZm9yZSByZS1ydW5uaW5nIHRoZSBhbmFseXNpcyBwaGFzZS5cbiAqIENhbGxzIG9uUHJvY2VlZCgpIGlmIHRoZSB1c2VyIGNvbmZpcm1zICh3aXRoIG9yIHdpdGhvdXQgdXBkYXRpbmcgYW5zd2VycykuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIF9zaG93QW5hbHlzaXNDbGFyaWZpY2F0aW9uQW1lbmRNb2RhbChvblByb2NlZWQpIHtcbiAgY29uc3QgcXVlc3Rpb25zID0gd2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucyB8fCBbXTtcbiAgY29uc3QgYW5zd2VycyAgID0gd2luZG93LnF1ZXN0aW9uQW5zd2VycyB8fCB7fTtcblxuICAvLyBObyBwcmlvciBxdWVzdGlvbnMgXHUyMDE0IHNraXAgdGhlIG1vZGFsIGFuZCBwcm9jZWVkIGRpcmVjdGx5LlxuICBpZiAoIXF1ZXN0aW9ucy5sZW5ndGgpIHsgYXdhaXQgb25Qcm9jZWVkKCk7IHJldHVybjsgfVxuXG4gIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgb3ZlcmxheS5pZCA9ICdjbGFyLWFtZW5kLW92ZXJsYXknO1xuICBvdmVybGF5LnN0eWxlLmNzc1RleHQgPSAncG9zaXRpb246Zml4ZWQ7aW5zZXQ6MDtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsMC41KTt6LWluZGV4OjEwMDAwO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjtvdmVyZmxvdy15OmF1dG87JztcblxuICBjb25zdCBmb3JtUm93cyA9IHF1ZXN0aW9ucy5tYXAoKHEsIGkpID0+IHtcbiAgICBjb25zdCBxdHlwZSAgPSBxLnR5cGUgfHwgYGNsYXJpZmljYXRpb25fJHtpICsgMX1gO1xuICAgIGNvbnN0IHF0ZXh0ICA9IGVzY2FwZUh0bWwocS5xdWVzdGlvbiB8fCAnJyk7XG4gICAgY29uc3QgY3VyQW5zID0gZXNjYXBlSHRtbChhbnN3ZXJzW3F0eXBlXSB8fCAnJyk7XG4gICAgY29uc3QgY2hvaWNlcyA9IEFycmF5LmlzQXJyYXkocS5jaG9pY2VzKSA/IHEuY2hvaWNlcyA6IFtdO1xuXG4gICAgaWYgKGNob2ljZXMubGVuZ3RoKSB7XG4gICAgICBjb25zdCByYWRpb3MgPSBjaG9pY2VzLm1hcChjID0+IGBcbiAgICAgICAgPGxhYmVsIHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6NnB4O21hcmdpbi1ib3R0b206NHB4O2N1cnNvcjpwb2ludGVyO1wiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwiY2xhci0ke2VzY2FwZUh0bWwocXR5cGUpfVwiIHZhbHVlPVwiJHtlc2NhcGVIdG1sKGMpfVwiXG4gICAgICAgICAgICAke2Fuc3dlcnNbcXR5cGVdID09PSBjID8gJ2NoZWNrZWQnIDogJyd9IHN0eWxlPVwiZmxleC1zaHJpbms6MDtcIj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjllbTtcIj4ke2VzY2FwZUh0bWwoYyl9PC9zcGFuPlxuICAgICAgICA8L2xhYmVsPmApLmpvaW4oJycpO1xuICAgICAgcmV0dXJuIGBcbiAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTRweDtcIj5cbiAgICAgICAgICA8bGFiZWwgc3R5bGU9XCJmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjAuOWVtO2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWJvdHRvbTo2cHg7XCI+JHtxdGV4dH08L2xhYmVsPlxuICAgICAgICAgICR7cmFkaW9zfVxuICAgICAgICA8L2Rpdj5gO1xuICAgIH1cbiAgICByZXR1cm4gYFxuICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTRweDtcIj5cbiAgICAgICAgPGxhYmVsIGZvcj1cImNsYXItYW5zLSR7ZXNjYXBlSHRtbChxdHlwZSl9XCIgc3R5bGU9XCJmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjAuOWVtO2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWJvdHRvbTo0cHg7XCI+JHtxdGV4dH08L2xhYmVsPlxuICAgICAgICA8dGV4dGFyZWEgaWQ9XCJjbGFyLWFucy0ke2VzY2FwZUh0bWwocXR5cGUpfVwiIG5hbWU9XCJjbGFyLSR7ZXNjYXBlSHRtbChxdHlwZSl9XCIgcm93cz1cIjJcIlxuICAgICAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTtib3gtc2l6aW5nOmJvcmRlci1ib3g7cGFkZGluZzo2cHggOHB4O2JvcmRlcjoxcHggc29saWQgI2QxZDVkYjtib3JkZXItcmFkaXVzOjZweDtmb250LXNpemU6MC45ZW07cmVzaXplOnZlcnRpY2FsO1wiXG4gICAgICAgID4ke2N1ckFuc308L3RleHRhcmVhPlxuICAgICAgPC9kaXY+YDtcbiAgfSkuam9pbignJyk7XG5cbiAgb3ZlcmxheS5pbm5lckhUTUwgPSBgXG4gICAgPGRpdiByb2xlPVwiZGlhbG9nXCIgYXJpYS1tb2RhbD1cInRydWVcIiBhcmlhLWxhYmVsbGVkYnk9XCJjbGFyLWFtZW5kLXRpdGxlXCJcbiAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDojZmZmO2JvcmRlci1yYWRpdXM6MTBweDtwYWRkaW5nOjI0cHggMjhweDttYXgtd2lkdGg6NTAwcHg7d2lkdGg6OTQlO1xuICAgICAgICAgICAgICAgIGJveC1zaGFkb3c6MCAyMHB4IDYwcHggcmdiYSgwLDAsMCwwLjMpO21hcmdpbjoyMHB4IGF1dG87XCI+XG4gICAgICA8aDMgaWQ9XCJjbGFyLWFtZW5kLXRpdGxlXCIgc3R5bGU9XCJtYXJnaW46MCAwIDZweDtmb250LXNpemU6MS4xZW07Y29sb3I6IzFlMjkzYjtcIj5cdTIxQkIgQW1lbmQgQ2xhcmlmaWNhdGlvbiBBbnN3ZXJzPC9oMz5cbiAgICAgIDxwIHN0eWxlPVwibWFyZ2luOjAgMCAxNnB4O2ZvbnQtc2l6ZTowLjg1ZW07Y29sb3I6IzZiNzI4MDtcIj5cbiAgICAgICAgVXBkYXRlIHlvdXIgYW5zd2VycyBiZWZvcmUgcmVydW5uaW5nIGFuYWx5c2lzLCBvciBrZWVwIHRoZW0gYXMtaXMuXG4gICAgICA8L3A+XG4gICAgICA8Zm9ybSBpZD1cImNsYXItYW1lbmQtZm9ybVwiIG9uc3VibWl0PVwicmV0dXJuIGZhbHNlO1wiPlxuICAgICAgICAke2Zvcm1Sb3dzfVxuICAgICAgPC9mb3JtPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6MTBweDtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmQ7bWFyZ2luLXRvcDo4cHg7ZmxleC13cmFwOndyYXA7XCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJjbGFyLWFtZW5kLWNhbmNlbFwiIGNsYXNzPVwiYnRuLXNlY29uZGFyeVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwiY2xhci1hbWVuZC1rZWVwXCIgICBjbGFzcz1cImJ0bi1zZWNvbmRhcnlcIj5LZWVwIEV4aXN0aW5nIEFuc3dlcnM8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImNsYXItYW1lbmQtc2F2ZVwiICAgY2xhc3M9XCJidG4tcHJpbWFyeVwiPlVwZGF0ZSAmYW1wOyBSZXJ1bjwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+YDtcblxuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG92ZXJsYXkpO1xuICBpZiAodHlwZW9mIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsICE9PSAndW5kZWZpbmVkJykgd2luZG93Ll9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgaWYgKHR5cGVvZiB0cmFwRm9jdXMgPT09ICdmdW5jdGlvbicpIHRyYXBGb2N1cygnY2xhci1hbWVuZC1vdmVybGF5Jyk7XG4gIG92ZXJsYXkucXVlcnlTZWxlY3RvcignI2NsYXItYW1lbmQtc2F2ZScpLmZvY3VzKCk7XG5cbiAgZnVuY3Rpb24gY2xvc2VNb2RhbCgpIHtcbiAgICBvdmVybGF5LnJlbW92ZSgpO1xuICAgIGlmICh0eXBlb2YgcmVzdG9yZUZvY3VzID09PSAnZnVuY3Rpb24nKSByZXN0b3JlRm9jdXMoKTtcbiAgfVxuXG4gIG92ZXJsYXkucXVlcnlTZWxlY3RvcignI2NsYXItYW1lbmQtY2FuY2VsJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjbG9zZU1vZGFsKTtcbiAgb3ZlcmxheS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGUgPT4geyBpZiAoZS50YXJnZXQgPT09IG92ZXJsYXkpIGNsb3NlTW9kYWwoKTsgfSk7XG4gIG92ZXJsYXkuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGUgPT4geyBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSBjbG9zZU1vZGFsKCk7IH0pO1xuXG4gIG92ZXJsYXkucXVlcnlTZWxlY3RvcignI2NsYXItYW1lbmQta2VlcCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGNsb3NlTW9kYWwoKTtcbiAgICBvblByb2NlZWQoKTtcbiAgfSk7XG5cbiAgb3ZlcmxheS5xdWVyeVNlbGVjdG9yKCcjY2xhci1hbWVuZC1zYXZlJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZm9ybSAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbGFyLWFtZW5kLWZvcm0nKTtcbiAgICBjb25zdCB1cGRhdGVkID0ge307XG4gICAgcXVlc3Rpb25zLmZvckVhY2goKHEsIGkpID0+IHtcbiAgICAgIGNvbnN0IHF0eXBlID0gcS50eXBlIHx8IGBjbGFyaWZpY2F0aW9uXyR7aSArIDF9YDtcbiAgICAgIGNvbnN0IGVsICAgID0gZm9ybS5xdWVyeVNlbGVjdG9yKGBbbmFtZT1cImNsYXItJHtxdHlwZX1cIl1gKTtcbiAgICAgIGlmICghZWwpIHJldHVybjtcbiAgICAgIGlmIChlbC50eXBlID09PSAncmFkaW8nKSB7XG4gICAgICAgIGNvbnN0IGNoZWNrZWQgPSBmb3JtLnF1ZXJ5U2VsZWN0b3IoYFtuYW1lPVwiY2xhci0ke3F0eXBlfVwiXTpjaGVja2VkYCk7XG4gICAgICAgIGlmIChjaGVja2VkKSB1cGRhdGVkW3F0eXBlXSA9IGNoZWNrZWQudmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB2YWwgPSBlbC52YWx1ZS50cmltKCk7XG4gICAgICAgIGlmICh2YWwpIHVwZGF0ZWRbcXR5cGVdID0gdmFsO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY2xvc2VNb2RhbCgpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmZXRjaCgnL2FwaS9wb3N0LWFuYWx5c2lzLXJlc3BvbnNlcycsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHF1ZXN0aW9ucywgYW5zd2VyczogdXBkYXRlZCB9KSxcbiAgICAgIH0pO1xuICAgICAgd2luZG93LnF1ZXN0aW9uQW5zd2VycyA9IHVwZGF0ZWQ7XG4gICAgfSBjYXRjaCAoX2UpIHsgLyogc2lsZW50IFx1MjAxNCBwcm9jZWVkIHdpdGggd2hhdGV2ZXIgdGhlIGJhY2tlbmQgYWxyZWFkeSBoYXMgKi8gfVxuICAgIGF3YWl0IG9uUHJvY2VlZCgpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVSdW5QaGFzZShzdGVwKSB7XG4gIC8vIEludGVyY2VwdCBhbmFseXNpcyByZXJ1bnMgdG8gbGV0IHRoZSB1c2VyIGFtZW5kIHByaW9yIGNsYXJpZmljYXRpb24gYW5zd2Vycy5cbiAgaWYgKHN0ZXAgPT09ICdhbmFseXNpcycpIHtcbiAgICBhd2FpdCBfc2hvd0FuYWx5c2lzQ2xhcmlmaWNhdGlvbkFtZW5kTW9kYWwoKCkgPT4gX2V4ZWN1dGVSZVJ1blBoYXNlKCdhbmFseXNpcycpKTtcbiAgICByZXR1cm47XG4gIH1cbiAgYXdhaXQgX2V4ZWN1dGVSZVJ1blBoYXNlKHN0ZXApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBfZXhlY3V0ZVJlUnVuUGhhc2Uoc3RlcCkge1xuICBjb25zdCBsb2FkaW5nTXNnID0gYXBwZW5kTG9hZGluZ01lc3NhZ2UoYFx1MjFCQiBSZS1ydW5uaW5nICR7c3RlcH1cdTIwMjZgKTtcbiAgc2V0TG9hZGluZyh0cnVlLCBgUmUtcnVubmluZyAke3N0ZXB9XHUyMDI2YCk7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL3JlLXJ1bi1waGFzZScsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeydDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbid9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe3BoYXNlOiBzdGVwfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgcmVtb3ZlTG9hZGluZ01lc3NhZ2UobG9hZGluZ01zZyk7XG4gICAgc2V0TG9hZGluZyhmYWxzZSk7XG5cbiAgICBpZiAoIXJlcy5vayB8fCAhZGF0YS5vaykge1xuICAgICAgYXBwZW5kUmV0cnlNZXNzYWdlKCdcdTI2QTAgUmUtcnVuIGZhaWxlZDogJyArIChkYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yJyksICgpID0+IHJlUnVuUGhhc2Uoc3RlcCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIGBcdTI3MDUgJHtzdGVwfSByZS1ydW4gY29tcGxldGUuIFJldmlldyB0aGUgdXBkYXRlZCByZXN1bHRzIFx1MjAxNCBjaGFuZ2VkIGl0ZW1zIGFyZSBoaWdobGlnaHRlZC5gKTtcbiAgICBhd2FpdCBmZXRjaFN0YXR1cygpO1xuXG4gICAgLy8gQ2xlYXIgcGVyLXBoYXNlIGNhY2hlcyBzbyBiYWNrLW5hdmlnYXRpb24gZmV0Y2hlcyBmcmVzaCByZXN1bHRzXG4gICAgaWYgKHN0ZXAgPT09ICdzcGVsbCcpICAgd2luZG93Ll9zcGVsbENoZWNrQ2FjaGUgID0gbnVsbDtcbiAgICBpZiAoc3RlcCA9PT0gJ3Jld3JpdGUnKSB3aW5kb3cuX3Jld3JpdGVQYW5lbENhY2hlID0gbnVsbDtcblxuICAgIC8vIE5hdmlnYXRlIHRvIHRoZSBzdGVwJ3Mgdmlld2VyIHRhYlxuICAgIGNvbnN0IHRhYk1hcCA9IHtcbiAgICAgIGFuYWx5c2lzOiAgICAgICAnYW5hbHlzaXMnLFxuICAgICAgY3VzdG9taXphdGlvbnM6ICdnb2FscycsXG4gICAgICByZXdyaXRlOiAgICAgICAgJ3Jld3JpdGUnLFxuICAgICAgc3BlbGw6ICAgICAgICAgICdzcGVsbCcsXG4gICAgfTtcbiAgICBpZiAodGFiTWFwW3N0ZXBdKSBzd2l0Y2hUYWIodGFiTWFwW3N0ZXBdKTtcblxuICAgIC8vIENvbXB1dGUgY2hhbmdlZC1pdGVtIElEcyBmcm9tIHByaW9yIHZzIG5ldyBvdXRwdXQgYW5kIGhpZ2hsaWdodCB0aGVtLlxuICAgIGlmIChkYXRhLnByaW9yX291dHB1dCAmJiBkYXRhLm5ld19vdXRwdXQpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gX2hpZ2hsaWdodENoYW5nZWRJdGVtcyhzdGVwLCBkYXRhLnByaW9yX291dHB1dCwgZGF0YS5uZXdfb3V0cHV0KSwgMzAwKTtcbiAgICB9XG5cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmVtb3ZlTG9hZGluZ01lc3NhZ2UobG9hZGluZ01zZyk7XG4gICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgYXBwZW5kUmV0cnlNZXNzYWdlKCdcdTI2QTAgTmV0d29yayBlcnJvciBpbiByZVJ1blBoYXNlOiAnICsgZXJyLm1lc3NhZ2UsICgpID0+IHJlUnVuUGhhc2Uoc3RlcCkpO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBIaWdobGlnaHQgY2hhbmdlZCBpdGVtcyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLyoqXG4gKiBDb21wYXJlIHByaW9yIGFuZCBuZXcgcmUtcnVuIG91dHB1dHM7IG1hcmsgRE9NIGVsZW1lbnRzIGZvciBjaGFuZ2VkIGVudGl0aWVzLlxuICpcbiAqIFN0cmF0ZWdpZXMgYnkgc3RlcDpcbiAqICAgcmV3cml0ZSAgICAgICAgXHUyMDE0IGNvbXBhcmUgcmV3cml0ZSBJRHM7IG1hcmsgcnctY2FyZC08aWQ+XG4gKiAgIGN1c3RvbWl6YXRpb25zIFx1MjAxNCBjb21wYXJlIGV4cGVyaWVuY2UgSURzOyBtYXJrIHRyW2RhdGEtZXhwLWlkXSBhbmQgdHJbZGF0YS1za2lsbF1cbiAqICAgYW5hbHlzaXMgICAgICAgXHUyMDE0IG5vIHBlci1lbnRpdHkgRE9NIHRhcmdldGluZzsgc2tpcFxuICovXG5mdW5jdGlvbiBfaGlnaGxpZ2h0Q2hhbmdlZEl0ZW1zKHN0ZXAsIHByaW9yT3V0cHV0LCBuZXdPdXRwdXQpIHtcbiAgaWYgKHN0ZXAgPT09ICdyZXdyaXRlJykge1xuICAgIGNvbnN0IHByaW9ySWRzID0gbmV3IFNldCgocHJpb3JPdXRwdXQucGVuZGluZ19yZXdyaXRlcyB8fCBbXSkubWFwKHIgPT4gU3RyaW5nKHIuaWQpKSk7XG4gICAgY29uc3QgbmV3SXRlbXMgID0gbmV3T3V0cHV0LnBlbmRpbmdfcmV3cml0ZXMgIHx8IFtdO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBuZXdJdGVtcykge1xuICAgICAgY29uc3QgaWQgICAgICA9IFN0cmluZyhpdGVtLmlkIHx8ICcnKTtcbiAgICAgIGNvbnN0IGNhcmRJZCAgPSBpZC5yZXBsYWNlKC9bXmEtekEtWjAtOV8tXS9nLCAnXycpO1xuICAgICAgY29uc3QgZWwgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBydy1jYXJkLSR7Y2FyZElkfWApO1xuICAgICAgaWYgKCFlbCkgY29udGludWU7XG4gICAgICBjb25zdCBpc05ldyAgICAgPSAhcHJpb3JJZHMuaGFzKGlkKTtcbiAgICAgIGNvbnN0IHByaW9ySXRlbSA9IChwcmlvck91dHB1dC5wZW5kaW5nX3Jld3JpdGVzIHx8IFtdKS5maW5kKHIgPT4gU3RyaW5nKHIuaWQpID09PSBpZCk7XG4gICAgICBjb25zdCBjaGFuZ2VkICAgPSBpc05ldyB8fCAocHJpb3JJdGVtICYmIHByaW9ySXRlbS5wcm9wb3NlZCAhPT0gaXRlbS5wcm9wb3NlZCk7XG4gICAgICBpZiAoY2hhbmdlZCkgX21hcmtDaGFuZ2VkKGVsKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHN0ZXAgPT09ICdjdXN0b21pemF0aW9ucycpIHtcbiAgICBjb25zdCBwcmlvckV4cElkcyA9IG5ldyBTZXQoXG4gICAgICAocHJpb3JPdXRwdXQuY3VzdG9taXphdGlvbnM/LmV4cGVyaWVuY2VfcmVjb21tZW5kYXRpb25zIHx8IFtdKS5tYXAociA9PiBTdHJpbmcoci5pZCkpXG4gICAgKTtcbiAgICBjb25zdCBuZXdFeHBSZWNzICA9IG5ld091dHB1dC5jdXN0b21pemF0aW9ucz8uZXhwZXJpZW5jZV9yZWNvbW1lbmRhdGlvbnMgfHwgW107XG4gICAgZm9yIChjb25zdCByZWMgb2YgbmV3RXhwUmVjcykge1xuICAgICAgY29uc3QgaWQgICA9IFN0cmluZyhyZWMuaWQgfHwgJycpO1xuICAgICAgY29uc3QgZWwgICA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYHRyW2RhdGEtZXhwLWlkPVwiJHtDU1MuZXNjYXBlKGlkKX1cIl1gKTtcbiAgICAgIGlmICghZWwpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgcHJpb3IgPSAocHJpb3JPdXRwdXQuY3VzdG9taXphdGlvbnM/LmV4cGVyaWVuY2VfcmVjb21tZW5kYXRpb25zIHx8IFtdKS5maW5kKHIgPT4gU3RyaW5nKHIuaWQpID09PSBpZCk7XG4gICAgICBpZiAoIXByaW9yRXhwSWRzLmhhcyhpZCkgfHwgKHByaW9yICYmIHByaW9yLnJlY29tbWVuZGF0aW9uICE9PSByZWMucmVjb21tZW5kYXRpb24pKSB7XG4gICAgICAgIF9tYXJrQ2hhbmdlZChlbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcHJpb3JTa2lsbHMgPSBuZXcgU2V0KFxuICAgICAgKHByaW9yT3V0cHV0LmN1c3RvbWl6YXRpb25zPy5za2lsbF9yZWNvbW1lbmRhdGlvbnMgfHwgW10pLm1hcChyID0+IChyLnNraWxsIHx8ICcnKS50b0xvd2VyQ2FzZSgpKVxuICAgICk7XG4gICAgY29uc3QgbmV3U2tpbGxSZWNzID0gbmV3T3V0cHV0LmN1c3RvbWl6YXRpb25zPy5za2lsbF9yZWNvbW1lbmRhdGlvbnMgfHwgW107XG4gICAgZm9yIChjb25zdCByZWMgb2YgbmV3U2tpbGxSZWNzKSB7XG4gICAgICBjb25zdCBuYW1lID0gKHJlYy5za2lsbCB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IGVsICAgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGB0cltkYXRhLXNraWxsPVwiJHtDU1MuZXNjYXBlKG5hbWUpfVwiXWApO1xuICAgICAgaWYgKCFlbCkgY29udGludWU7XG4gICAgICBjb25zdCBwcmlvciA9IChwcmlvck91dHB1dC5jdXN0b21pemF0aW9ucz8uc2tpbGxfcmVjb21tZW5kYXRpb25zIHx8IFtdKS5maW5kKFxuICAgICAgICByID0+IChyLnNraWxsIHx8ICcnKS50b0xvd2VyQ2FzZSgpID09PSBuYW1lXG4gICAgICApO1xuICAgICAgaWYgKCFwcmlvclNraWxscy5oYXMobmFtZSkgfHwgKHByaW9yICYmIHByaW9yLnJlY29tbWVuZGF0aW9uICE9PSByZWMucmVjb21tZW5kYXRpb24pKSB7XG4gICAgICAgIF9tYXJrQ2hhbmdlZChlbCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxufVxuXG4vKiogQXBwbHkgZGF0YS1jaGFuZ2VkIGF0dHJpYnV0ZSBhbmQgdHJpZ2dlciBoaWdobGlnaHQgYW5pbWF0aW9uIG9uIGFuIGVsZW1lbnQuICovXG5mdW5jdGlvbiBfbWFya0NoYW5nZWQoZWwpIHtcbiAgZWwuc2V0QXR0cmlidXRlKCdkYXRhLWNoYW5nZWQnLCAndHJ1ZScpO1xuICAvLyBSZW1vdmUgdGhlIGF0dHJpYnV0ZSBhZnRlciB0aGUgYW5pbWF0aW9uIGNvbXBsZXRlcyBzbyBpdCBjYW4gYmUgcmUtdHJpZ2dlcmVkIG9uIGEgc2Vjb25kIHJlcnVuLlxuICBzZXRUaW1lb3V0KCgpID0+IGVsLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1jaGFuZ2VkJyksIDI1MDApO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgQnVsbGV0IHJlb3JkZXIgbW9kYWwgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIHNob3dCdWxsZXRSZW9yZGVyKGV4cElkLCBleHBUaXRsZSkge1xuICAvLyBGZXRjaCBhY2hpZXZlbWVudHMgKHJlcXVpcmVkKSBhbmQgc3VnZ2VzdGVkIG9yZGVyIChiZXN0LWVmZm9ydCkuXG4gIGxldCBhY2hpZXZlbWVudHMgPSBbXTtcbiAgbGV0IHByb3Bvc2VkT3JkZXIgPSBudWxsO1xuICBsZXQgaGFzSm9iQW5hbHlzaXMgPSBmYWxzZTtcbiAgbGV0IHByb3Bvc2VkUmVhc29uaW5nID0gJyc7XG4gIGxldCBwcm9wb3NlZEF0c0ltcGFjdCA9ICcnO1xuICBsZXQgcHJvcG9zZWRQYWdlSW1wYWN0ID0gJyc7XG4gIHRyeSB7XG4gICAgY29uc3QgZGV0YWlsc1JlcyA9IGF3YWl0IGZldGNoKCcvYXBpL2V4cGVyaWVuY2UtZGV0YWlscycsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7J0NvbnRlbnQtVHlwZSc6J2FwcGxpY2F0aW9uL2pzb24nfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtleHBlcmllbmNlX2lkOiBleHBJZH0pLFxuICAgIH0pO1xuICAgIGlmICghZGV0YWlsc1Jlcy5vaykge1xuICAgICAgbGV0IGRldGFpbHNFcnIgPSBgSFRUUCAke2RldGFpbHNSZXMuc3RhdHVzfWA7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXlsb2FkID0gYXdhaXQgZGV0YWlsc1Jlcy5qc29uKCk7XG4gICAgICAgIGRldGFpbHNFcnIgPSBwYXlsb2FkLmVycm9yIHx8IHBheWxvYWQubWVzc2FnZSB8fCBkZXRhaWxzRXJyO1xuICAgICAgfSBjYXRjaCAoXykgeyAvKiBrZWVwIHN0YXR1cy1iYXNlZCBlcnJvciAqLyB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZGV0YWlsc0Vycik7XG4gICAgfVxuXG4gICAgY29uc3QgZGV0YWlsc0RhdGEgPSBhd2FpdCBkZXRhaWxzUmVzLmpzb24oKTtcbiAgICBhY2hpZXZlbWVudHMgID0gKGRldGFpbHNEYXRhLmV4cGVyaWVuY2UgJiYgZGV0YWlsc0RhdGEuZXhwZXJpZW5jZS5hY2hpZXZlbWVudHMpIHx8IFtdO1xuXG4gICAgY29uc3QgcmVjUmVjb3JkID0gX2ZpbmRFeHBlcmllbmNlUmVjb21tZW5kYXRpb25SZWNvcmQoZXhwSWQpO1xuICAgIGNvbnN0IGxsbUJ1bGxldE9yZGVyID0gcmVjUmVjb3JkICYmIHR5cGVvZiByZWNSZWNvcmQuYnVsbGV0X29yZGVyID09PSAnb2JqZWN0J1xuICAgICAgPyByZWNSZWNvcmQuYnVsbGV0X29yZGVyXG4gICAgICA6IG51bGw7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkobGxtQnVsbGV0T3JkZXI/Lm9yZGVyKSAmJiBsbG1CdWxsZXRPcmRlci5vcmRlci5sZW5ndGggPiAxKSB7XG4gICAgICBwcm9wb3NlZE9yZGVyID0gbGxtQnVsbGV0T3JkZXIub3JkZXI7XG4gICAgICBoYXNKb2JBbmFseXNpcyA9IHRydWU7XG4gICAgICBwcm9wb3NlZFJlYXNvbmluZyA9IFN0cmluZyhsbG1CdWxsZXRPcmRlci5yZWFzb25pbmcgfHwgJycpLnRyaW0oKTtcbiAgICAgIHByb3Bvc2VkQXRzSW1wYWN0ID0gU3RyaW5nKGxsbUJ1bGxldE9yZGVyLmF0c19pbXBhY3QgfHwgJycpLnRyaW0oKTtcbiAgICAgIHByb3Bvc2VkUGFnZUltcGFjdCA9IFN0cmluZyhsbG1CdWxsZXRPcmRlci5wYWdlX2xlbmd0aF9pbXBhY3QgfHwgJycpLnRyaW0oKTtcbiAgICB9XG5cbiAgICAvLyBTdWdnZXN0ZWQgb3JkZXIgaXMgb3B0aW9uYWw7IGZhaWx1cmVzIHNob3VsZCBub3QgYmxvY2sgb3BlbmluZyB0aGUgbW9kYWwuXG4gICAgaWYgKCFwcm9wb3NlZE9yZGVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwcm9wb3NlZFJlcyA9IGF3YWl0IGZldGNoKGAvYXBpL3Byb3Bvc2VkLWJ1bGxldC1vcmRlcj9leHBlcmllbmNlX2lkPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGV4cElkKX1gKTtcbiAgICAgICAgaWYgKHByb3Bvc2VkUmVzLm9rKSB7XG4gICAgICAgICAgY29uc3QgcHJvcG9zZWREYXRhID0gYXdhaXQgcHJvcG9zZWRSZXMuanNvbigpO1xuICAgICAgICAgIHByb3Bvc2VkT3JkZXIgPSBwcm9wb3NlZERhdGEucHJvcG9zZWRfb3JkZXIgfHwgbnVsbDtcbiAgICAgICAgICBoYXNKb2JBbmFseXNpcyA9IHByb3Bvc2VkRGF0YS5oYXNfam9iX2FuYWx5c2lzIHx8IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvZy53YXJuKCdDb3VsZCBub3QgbG9hZCBzdWdnZXN0ZWQgYnVsbGV0IG9yZGVyOicsIHByb3Bvc2VkUmVzLnN0YXR1cyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nLndhcm4oJ0NvdWxkIG5vdCBsb2FkIHN1Z2dlc3RlZCBidWxsZXQgb3JkZXI6JywgZSk7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc3QgZXJyb3JUZXh0ID0gZS5tZXNzYWdlID09PSAnRmFpbGVkIHRvIGZldGNoJ1xuICAgICAgPyAnRmFpbGVkIHRvIGZldGNoIChzZXJ2ZXIgdW5hdmFpbGFibGUpLidcbiAgICAgIDogZS5tZXNzYWdlO1xuICAgIGFwcGVuZFJldHJ5TWVzc2FnZSgnXHUyNkEwIENvdWxkIG5vdCBsb2FkIGJ1bGxldHM6ICcgKyBlcnJvclRleHQsICgpID0+IHNob3dCdWxsZXRSZW9yZGVyKGV4cElkLCBleHBUaXRsZSkpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIWFjaGlldmVtZW50cy5sZW5ndGgpIHtcbiAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnTm8gYnVsbGV0IHBvaW50cyBmb3VuZCBmb3IgdGhpcyBleHBlcmllbmNlLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFNhdmUgZm9jdXMgb3JpZ2luIGZvciByZXN0b3JhdGlvbiBvbiBjbG9zZSAoR0FQLTE3NilcbiAgaWYgKHR5cGVvZiBfZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBfZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIH1cblxuICAvLyBCdWlsZCBtb2RhbCBjb250ZW50XG4gIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIG1vZGFsLmlkID0gJ2J1bGxldC1yZW9yZGVyLW1vZGFsJztcbiAgbW9kYWwuc2V0QXR0cmlidXRlKCdyb2xlJywgJ2RpYWxvZycpO1xuICBtb2RhbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbW9kYWwnLCAndHJ1ZScpO1xuICBtb2RhbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWxsZWRieScsICdidWxsZXQtcmVvcmRlci10aXRsZScpO1xuICBtb2RhbC5zdHlsZS5jc3NUZXh0ID0gYFxuICAgIHBvc2l0aW9uOmZpeGVkO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JhY2tncm91bmQ6cmdiYSgwLDAsMCwwLjUpO1xuICAgIHotaW5kZXg6OTk5OTtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7YDtcblxuICBjb25zdCBzdWdnZXN0ZWRCdG4gPSBoYXNKb2JBbmFseXNpc1xuICAgID8gYDxidXR0b24gY2xhc3M9XCJidG4tc2Vjb25kYXJ5XCIgaWQ9XCJ1c2UtbGxtLW9yZGVyLWJ0blwiIHRpdGxlPVwiQXBwbHkgam9iLXJlbGV2YW5jZSByYW5raW5nIGZyb20geW91ciBqb2IgYW5hbHlzaXNcIlxuICAgICAgICAgc3R5bGU9XCJjb2xvcjojNjM2NmYxO2JvcmRlci1jb2xvcjojNjM2NmYxO1wiPlx1MjcyOCBVc2UgU3VnZ2VzdGVkIE9yZGVyPC9idXR0b24+YFxuICAgIDogJyc7XG4gIGNvbnN0IHN1Z2dlc3Rpb25NZXRhID0gcHJvcG9zZWRSZWFzb25pbmcgfHwgcHJvcG9zZWRBdHNJbXBhY3QgfHwgcHJvcG9zZWRQYWdlSW1wYWN0XG4gICAgPyBgPGRpdiBpZD1cImJ1bGxldC1vcmRlci1haS1ub3RlXCIgc3R5bGU9XCJmb250LXNpemU6MC44MmVtO2NvbG9yOiM0MzM4Y2E7YmFja2dyb3VuZDojZWVmMmZmO2JvcmRlcjoxcHggc29saWQgI2M3ZDJmZTtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjEwcHggMTJweDttYXJnaW4tYm90dG9tOjEycHg7XCI+XG4gICAgICAgICR7cHJvcG9zZWRSZWFzb25pbmcgPyBgPGRpdj48c3Ryb25nPkFJIHJhdGlvbmFsZTo8L3N0cm9uZz4gJHtlc2NhcGVIdG1sKHByb3Bvc2VkUmVhc29uaW5nKX08L2Rpdj5gIDogJyd9XG4gICAgICAgICR7cHJvcG9zZWRBdHNJbXBhY3QgPyBgPGRpdj48c3Ryb25nPkFUUyBpbXBhY3Q6PC9zdHJvbmc+ICR7ZXNjYXBlSHRtbChwcm9wb3NlZEF0c0ltcGFjdCl9PC9kaXY+YCA6ICcnfVxuICAgICAgICAke3Byb3Bvc2VkUGFnZUltcGFjdCA/IGA8ZGl2PjxzdHJvbmc+UGFnZSBsZW5ndGggaW1wYWN0Ojwvc3Ryb25nPiAke2VzY2FwZUh0bWwocHJvcG9zZWRQYWdlSW1wYWN0KX08L2Rpdj5gIDogJyd9XG4gICAgICA8L2Rpdj5gXG4gICAgOiAnJztcblxuICBtb2RhbC5pbm5lckhUTUwgPSBgXG4gICAgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2ZmZjtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjI0cHg7bWF4LXdpZHRoOjY0MHB4O3dpZHRoOjkyJTtcbiAgICAgICAgICAgICAgICBtYXgtaGVpZ2h0Ojgwdmg7b3ZlcmZsb3cteTphdXRvO2JveC1zaGFkb3c6MCAyMHB4IDYwcHggcmdiYSgwLDAsMCwwLjMpO1wiPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjthbGlnbi1pdGVtczpmbGV4LXN0YXJ0O21hcmdpbi1ib3R0b206MTZweDtcIj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8aDMgaWQ9XCJidWxsZXQtcmVvcmRlci10aXRsZVwiIHN0eWxlPVwibWFyZ2luOjA7Y29sb3I6IzFmMjkzNztcIj5cdTIxOTUgUmVvcmRlciBCdWxsZXRzPC9oMz5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiY29sb3I6IzZiNzI4MDtmb250LXNpemU6MC45ZW07bWFyZ2luLXRvcDo0cHg7XCI+JHtleHBUaXRsZX08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxidXR0b24gYXJpYS1sYWJlbD1cIkNsb3NlIHJlb3JkZXIgZGlhbG9nXCJcbiAgICAgICAgICBvbmNsaWNrPVwicmVzdG9yZUZvY3VzKCk7ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J1bGxldC1yZW9yZGVyLW1vZGFsJykucmVtb3ZlKClcIlxuICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDpub25lO2JvcmRlcjpub25lO2ZvbnQtc2l6ZToxLjRlbTtjdXJzb3I6cG9pbnRlcjtjb2xvcjojNmI3MjgwO1wiPlx1MjcxNTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtjb2xvcjojNmI3MjgwO21hcmdpbi1ib3R0b206MTJweDtcIj5cbiAgICAgICAgVXNlIFx1MjE5MSBcdTIxOTMgdG8gcmVvcmRlci4gQnVsbGV0cyBoaWdoZXIgaW4gdGhlIGxpc3QgYXBwZWFyIGZpcnN0IG9uIHlvdXIgQ1YuXG4gICAgICAgIFRoZSBtb3N0IHJlbGV2YW50IGJ1bGxldCB3aWxsIGJlIGF1dG8tcmFua2VkIGhpZ2hlc3QgaWYgeW91IHJlc2V0LlxuICAgICAgPC9kaXY+XG4gICAgICAke3N1Z2dlc3Rpb25NZXRhfVxuICAgICAgPG9sIGlkPVwiYnVsbGV0LXJlb3JkZXItbGlzdFwiIHN0eWxlPVwicGFkZGluZzowO21hcmdpbjowO2xpc3Qtc3R5bGU6bm9uZTtcIj5cbiAgICAgIDwvb2w+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDoxMHB4O21hcmdpbi10b3A6MThweDtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmQ7XCI+XG4gICAgICAgICR7c3VnZ2VzdGVkQnRufVxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLXNlY29uZGFyeVwiIG9uY2xpY2s9XCJyZXNldEJ1bGxldE9yZGVyKCcke2V4cElkfScpXCI+XHUyMUJBIFJlc2V0IHRvIEF1dG88L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1wcmltYXJ5XCIgICBvbmNsaWNrPVwic2F2ZUJ1bGxldE9yZGVyKCcke2V4cElkfScpO3Jlc3RvcmVGb2N1cygpXCI+U2F2ZSBPcmRlcjwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+YDtcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChtb2RhbCk7XG4gIGlmICh0eXBlb2YgdHJhcEZvY3VzID09PSAnZnVuY3Rpb24nKSB0cmFwRm9jdXMoJ2J1bGxldC1yZW9yZGVyLW1vZGFsJyk7XG4gIGlmICh0eXBlb2Ygc2V0SW5pdGlhbEZvY3VzID09PSAnZnVuY3Rpb24nKSBzZXRJbml0aWFsRm9jdXMoJ2J1bGxldC1yZW9yZGVyLW1vZGFsJyk7XG5cbiAgLy8gQ2xvc2Ugb24gRXNjYXBlXG4gIGNvbnN0IGVzY0hhbmRsZXIgPSAoZSkgPT4ge1xuICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHJlc3RvcmVGb2N1cygpO1xuICAgICAgbW9kYWwucmVtb3ZlKCk7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZXNjSGFuZGxlcik7XG4gICAgfVxuICB9O1xuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZXNjSGFuZGxlcik7XG5cbiAgLy8gUG9wdWxhdGUgbGlzdCBpdGVtc1xuICBjb25zdCBsaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J1bGxldC1yZW9yZGVyLWxpc3QnKTtcbiAgYWNoaWV2ZW1lbnRzLmZvckVhY2goKGFjaCwgaWR4KSA9PiB7XG4gICAgY29uc3QgdGV4dCA9ICh0eXBlb2YgYWNoID09PSAnb2JqZWN0JyA/IChhY2gudGV4dCB8fCAnJykgOiBTdHJpbmcoYWNoKSk7XG4gICAgY29uc3QgbGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpO1xuICAgIGxpLmRhdGFzZXQub3JpZ0luZGV4ID0gaWR4O1xuICAgIGxpLnN0eWxlLmNzc1RleHQgPSBgZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmZsZXgtc3RhcnQ7Z2FwOjhweDtwYWRkaW5nOjhweDttYXJnaW4tYm90dG9tOjZweDtcbiAgICAgIGJhY2tncm91bmQ6I2Y4ZmFmYztib3JkZXI6MXB4IHNvbGlkICNlMmU4ZjA7Ym9yZGVyLXJhZGl1czo2cHg7YDtcbiAgICBsaS5pbm5lckhUTUwgPSBgXG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtnYXA6MnB4O2ZsZXgtc2hyaW5rOjA7XCI+XG4gICAgICAgIDxidXR0b24gdGl0bGU9XCJNb3ZlIHVwXCIgYXJpYS1sYWJlbD1cIk1vdmUgYnVsbGV0IHVwXCJcbiAgICAgICAgICBvbmNsaWNrPVwibW92ZUJ1bGxldCh0aGlzLC0xKVwiXG4gICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOjFweCBzb2xpZCAjZDFkNWRiO2JvcmRlci1yYWRpdXM6M3B4O1xuICAgICAgICAgICAgICAgICBjdXJzb3I6cG9pbnRlcjtwYWRkaW5nOjFweCA1cHg7bGluZS1oZWlnaHQ6MS4yO2ZvbnQtc2l6ZTowLjllbTtcIj5cdTIxOTE8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiB0aXRsZT1cIk1vdmUgZG93blwiIGFyaWEtbGFiZWw9XCJNb3ZlIGJ1bGxldCBkb3duXCJcbiAgICAgICAgICBvbmNsaWNrPVwibW92ZUJ1bGxldCh0aGlzLCsxKVwiXG4gICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOjFweCBzb2xpZCAjZDFkNWRiO2JvcmRlci1yYWRpdXM6M3B4O1xuICAgICAgICAgICAgICAgICBjdXJzb3I6cG9pbnRlcjtwYWRkaW5nOjFweCA1cHg7bGluZS1oZWlnaHQ6MS4yO2ZvbnQtc2l6ZTowLjllbTtcIj5cdTIxOTM8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPHNwYW4gc3R5bGU9XCJmbGV4OjE7Zm9udC1zaXplOjAuOWVtO1wiPiR7dGV4dH08L3NwYW4+YDtcbiAgICBsaXN0LmFwcGVuZENoaWxkKGxpKTtcbiAgfSk7XG4gIF91cGRhdGVCdWxsZXRBcnJvd3MoKTtcblxuICAvLyBXaXJlIHVwIFwiVXNlIFN1Z2dlc3RlZCBPcmRlclwiIGJ1dHRvbiBpZiBqb2IgYW5hbHlzaXMgaXMgYXZhaWxhYmxlXG4gIGlmIChoYXNKb2JBbmFseXNpcyAmJiBwcm9wb3NlZE9yZGVyKSB7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VzZS1sbG0tb3JkZXItYnRuJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgX2FwcGx5QnVsbGV0T3JkZXIocHJvcG9zZWRPcmRlcik7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2FwcGx5QnVsbGV0T3JkZXIob3JkZXIpIHtcbiAgY29uc3QgbGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidWxsZXQtcmVvcmRlci1saXN0Jyk7XG4gIGlmICghbGlzdCkgcmV0dXJuO1xuICBjb25zdCBpdGVtcyA9IEFycmF5LmZyb20obGlzdC5xdWVyeVNlbGVjdG9yQWxsKCdsaScpKTtcbiAgLy8gQnVpbGQgYSBtYXAgZnJvbSBvcmlnSW5kZXggXHUyMTkyIGxpIGVsZW1lbnRcbiAgY29uc3QgYnlPcmlnID0ge307XG4gIGl0ZW1zLmZvckVhY2gobGkgPT4geyBieU9yaWdbcGFyc2VJbnQobGkuZGF0YXNldC5vcmlnSW5kZXgsIDEwKV0gPSBsaTsgfSk7XG4gIC8vIFJlLWFwcGVuZCBpbiBwcm9wb3NlZCBvcmRlciwgdGhlbiBhbnkgbm90IGxpc3RlZFxuICBjb25zdCBsaXN0ZWQgPSBuZXcgU2V0KG9yZGVyLm1hcChOdW1iZXIpKTtcbiAgb3JkZXIuZm9yRWFjaChpZHggPT4geyBpZiAoYnlPcmlnW2lkeF0pIGxpc3QuYXBwZW5kQ2hpbGQoYnlPcmlnW2lkeF0pOyB9KTtcbiAgaXRlbXMuZm9yRWFjaChsaSA9PiB7XG4gICAgaWYgKCFsaXN0ZWQuaGFzKHBhcnNlSW50KGxpLmRhdGFzZXQub3JpZ0luZGV4LCAxMCkpKSBsaXN0LmFwcGVuZENoaWxkKGxpKTtcbiAgfSk7XG4gIF91cGRhdGVCdWxsZXRBcnJvd3MoKTtcbn1cblxuZnVuY3Rpb24gbW92ZUJ1bGxldChidG4sIGRpcmVjdGlvbikge1xuICBjb25zdCBsaSAgID0gYnRuLmNsb3Nlc3QoJ2xpJyk7XG4gIGNvbnN0IGxpc3QgPSBsaS5wYXJlbnROb2RlO1xuICBpZiAoZGlyZWN0aW9uID09PSAtMSAmJiBsaS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nKSB7XG4gICAgbGlzdC5pbnNlcnRCZWZvcmUobGksIGxpLnByZXZpb3VzRWxlbWVudFNpYmxpbmcpO1xuICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gKzEgJiYgbGkubmV4dEVsZW1lbnRTaWJsaW5nKSB7XG4gICAgbGlzdC5pbnNlcnRCZWZvcmUobGkubmV4dEVsZW1lbnRTaWJsaW5nLCBsaSk7XG4gIH1cbiAgX3VwZGF0ZUJ1bGxldEFycm93cygpO1xufVxuXG5mdW5jdGlvbiBfdXBkYXRlQnVsbGV0QXJyb3dzKCkge1xuICBjb25zdCBsaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J1bGxldC1yZW9yZGVyLWxpc3QnKTtcbiAgaWYgKCFsaXN0KSByZXR1cm47XG4gIGNvbnN0IGl0ZW1zID0gbGlzdC5xdWVyeVNlbGVjdG9yQWxsKCdsaScpO1xuICBpdGVtcy5mb3JFYWNoKChsaSwgaWR4KSA9PiB7XG4gICAgY29uc3QgW3VwQnRuLCBkb3duQnRuXSA9IGxpLnF1ZXJ5U2VsZWN0b3JBbGwoJ2J1dHRvbicpO1xuICAgIHVwQnRuLmRpc2FibGVkICAgPSBpZHggPT09IDA7XG4gICAgZG93bkJ0bi5kaXNhYmxlZCA9IGlkeCA9PT0gaXRlbXMubGVuZ3RoIC0gMTtcbiAgICB1cEJ0bi5zdHlsZS5vcGFjaXR5ICAgPSB1cEJ0bi5kaXNhYmxlZCAgID8gJzAuMycgOiAnMSc7XG4gICAgZG93bkJ0bi5zdHlsZS5vcGFjaXR5ID0gZG93bkJ0bi5kaXNhYmxlZCA/ICcwLjMnIDogJzEnO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZUJ1bGxldE9yZGVyKGV4cElkKSB7XG4gIGNvbnN0IGxpc3QgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J1bGxldC1yZW9yZGVyLWxpc3QnKTtcbiAgY29uc3QgaXRlbXMgPSBsaXN0ID8gbGlzdC5xdWVyeVNlbGVjdG9yQWxsKCdsaScpIDogW107XG4gIGNvbnN0IG9yZGVyID0gQXJyYXkuZnJvbShpdGVtcykubWFwKGxpID0+IHBhcnNlSW50KGxpLmRhdGFzZXQub3JpZ0luZGV4LCAxMCkpO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9yZW9yZGVyLWJ1bGxldHMnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeydDb250ZW50LVR5cGUnOidhcHBsaWNhdGlvbi9qc29uJ30sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7ZXhwZXJpZW5jZV9pZDogZXhwSWQsIG9yZGVyfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKCFyZXMub2sgfHwgIWRhdGEub2spIHtcbiAgICAgIGFwcGVuZFJldHJ5TWVzc2FnZSgnXHUyNkEwIENvdWxkIG5vdCBzYXZlIGJ1bGxldCBvcmRlcjogJyArIChkYXRhLmVycm9yfHwnVW5rbm93bicpLCAoKSA9PiBzYXZlQnVsbGV0T3JkZXIoZXhwSWQpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ1x1MjE5NSBCdWxsZXQgb3JkZXIgc2F2ZWQuIEl0IHdpbGwgYXBwbHkgd2hlbiB5b3UgZ2VuZXJhdGUgdGhlIENWLicpO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidWxsZXQtcmVvcmRlci1tb2RhbCcpPy5yZW1vdmUoKTtcbiAgfSBjYXRjaChlKSB7XG4gICAgYXBwZW5kUmV0cnlNZXNzYWdlKCdcdTI2QTAgTmV0d29yayBlcnJvciBzYXZpbmcgYnVsbGV0IG9yZGVyOiAnICsgZS5tZXNzYWdlLCAoKSA9PiBzYXZlQnVsbGV0T3JkZXIoZXhwSWQpKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZXNldEJ1bGxldE9yZGVyKGV4cElkKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL3Jlb3JkZXItYnVsbGV0cycsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7J0NvbnRlbnQtVHlwZSc6J2FwcGxpY2F0aW9uL2pzb24nfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtleHBlcmllbmNlX2lkOiBleHBJZCwgb3JkZXI6IFtdfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKCFyZXMub2sgfHwgIWRhdGEub2spIHtcbiAgICAgIGFwcGVuZFJldHJ5TWVzc2FnZSgnXHUyNkEwIENvdWxkIG5vdCByZXNldCBidWxsZXQgb3JkZXI6ICcgKyAoZGF0YS5lcnJvcnx8J1Vua25vd24nKSwgKCkgPT4gcmVzZXRCdWxsZXRPcmRlcihleHBJZCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCAnXHUyMUJBIEJ1bGxldCBvcmRlciByZXNldC4gUmVsZXZhbmNlLWJhc2VkIG9yZGVyaW5nIHdpbGwgYXBwbHkuJyk7XG4gICAgcmVzdG9yZUZvY3VzKCk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J1bGxldC1yZW9yZGVyLW1vZGFsJyk/LnJlbW92ZSgpO1xuICB9IGNhdGNoKGUpIHtcbiAgICBhcHBlbmRSZXRyeU1lc3NhZ2UoJ1x1MjZBMCBOZXR3b3JrIGVycm9yIHJlc2V0dGluZyBidWxsZXQgb3JkZXI6ICcgKyBlLm1lc3NhZ2UsICgpID0+IHJlc2V0QnVsbGV0T3JkZXIoZXhwSWQpKTtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgRm9yd2FyZC1za2lwIHBoYXNlIHdhdGVybWFyayAoR0FQLTEwMSkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8vIEJhY2tlbmQgcGhhc2Ugb3JkZXJpbmcgKG1hdGNoZXMgY29udmVyc2F0aW9uX21hbmFnZXIucHkgX1BIQVNFX09SREVSKS5cbmNvbnN0IF9QSEFTRV9QUk9HUkVTU0lPTiA9IFtcbiAgJ2luaXQnLCAnam9iX2FuYWx5c2lzJywgJ2N1c3RvbWl6YXRpb24nLCAncmV3cml0ZV9yZXZpZXcnLFxuICAnc3BlbGxfY2hlY2snLCAnZ2VuZXJhdGlvbicsICdsYXlvdXRfcmV2aWV3JywgJ2ZpbmFsX2dlbmVyYXRpb24nLCAncmVmaW5lbWVudCcsXG5dO1xuXG4vLyBNaW5pbXVtIGhpZ2hlc3RQaGFzZSBpbmRleCByZXF1aXJlZCBmb3IgZWFjaCBzdGVwIHRvIGJlIGZvcndhcmQtc2tpcHBhYmxlLlxuY29uc3QgX1NURVBfRldEX1BIQVNFX01JTiA9IHtcbiAgYW5hbHlzaXM6ICAgICAgIDEsICAgLy8gam9iX2FuYWx5c2lzXG4gIGN1c3RvbWl6YXRpb25zOiAyLCAgIC8vIGN1c3RvbWl6YXRpb25cbiAgcmV3cml0ZTogICAgICAgIDMsICAgLy8gcmV3cml0ZV9yZXZpZXdcbiAgc3BlbGw6ICAgICAgICAgIDQsICAgLy8gc3BlbGxfY2hlY2tcbiAgbGF5b3V0OiAgICAgICAgIDUsICAgLy8gZ2VuZXJhdGlvblxuICBkb3dubG9hZDogICAgICAgNywgICAvLyBmaW5hbF9nZW5lcmF0aW9uXG4gIGNvdmVyX2xldHRlcjogICA3LFxuICBzY3JlZW5pbmc6ICAgICAgNyxcbiAgaW50ZXJ2aWV3X3ByZXA6IDcsXG4gIHRoYW5rX3lvdTogICAgICA3LFxuICBoYXJ2ZXN0OiAgICAgICAgNyxcbn07XG5cbi8vIFx1MjUwMFx1MjUwMCBXb3JrZmxvdyBzdGVwIGJhciBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gdXBkYXRlV29ya2Zsb3dTdGVwcyhzdGF0dXMpIHtcbiAgLy8gMTItc3RlcCB3b3JrZmxvdyBiYXI6IEpvYiBJbnB1dCBcdTIxOTIgQW5hbHlzaXMgXHUyMTkyIEN1c3RvbWlzZSBcdTIxOTIgUmV3cml0ZXMgXHUyMTkyXG4gIC8vICAgU3BlbGwgQ2hlY2sgXHUyMTkyIExheW91dCBSZXZpZXcgXHUyMTkyIERvd25sb2FkIFx1MjE5MiBDb3ZlciBMZXR0ZXIgXHUyMTkyIFNjcmVlbmluZyBcdTIxOTJcbiAgLy8gICBJbnRlcnZpZXcgUHJlcCBcdTIxOTIgVGhhbmsgWW91IFx1MjE5MiBIYXJ2ZXN0XG4gIC8vXG4gIGNvbnN0IFVQQ09NSU5HID0gbmV3IFNldCgpO1xuXG4gIC8vIFN0ZXBzIHRoYXQgc3VwcG9ydCBMTE0gcmUtZXhlY3V0aW9uIHZpYSAvYXBpL3JlLXJ1bi1waGFzZVxuICBjb25zdCBSRV9SVU5fU1RFUFMgPSBuZXcgU2V0KFsnYW5hbHlzaXMnLCAnY3VzdG9taXphdGlvbnMnLCAncmV3cml0ZScsICdzcGVsbCcsICdsYXlvdXQnXSk7XG5cbiAgLy8gQmFzZSBsYWJlbCBmb3IgZWFjaCBzdGVwICh1c2VkIHdoZW4gaW5qZWN0aW5nIFx1MjFCQiBidXR0b24pXG4gIGNvbnN0IFNURVBfTEFCRUxTID0ge1xuICAgIGpvYjogICAgICAgICAgICAnXHVEODNEXHVEQ0U1IEpvYiBJbnB1dCcsXG4gICAgYW5hbHlzaXM6ICAgICAgICdcdUQ4M0RcdUREMEQgQW5hbHlzaXMnLFxuICAgIGN1c3RvbWl6YXRpb25zOiAnXHUyNjk5XHVGRTBGIEN1c3RvbWlzZScsXG4gICAgcmV3cml0ZTogICAgICAgICdcdTI3MEZcdUZFMEYgUmV3cml0ZXMnLFxuICAgIHNwZWxsOiAgICAgICAgICAnXHVEODNEXHVERDI0IFNwZWxsIENoZWNrJyxcbiAgICBsYXlvdXQ6ICAgICAgICAgJ1x1RDgzQ1x1REZBOCBMYXlvdXQgUmV2aWV3JyxcbiAgICBkb3dubG9hZDogICAgICAgJ1x1MkIwN1x1RkUwRiBEb3dubG9hZCBGaWxlcycsXG4gICAgY292ZXJfbGV0dGVyOiAgICdcdUQ4M0RcdURDRTkgQ292ZXIgTGV0dGVyJyxcbiAgICBzY3JlZW5pbmc6ICAgICAgJ1x1RDgzRFx1RENDQiBTY3JlZW5pbmcnLFxuICAgIGludGVydmlld19wcmVwOiAnXHVEODNDXHVERkE0IEludGVydmlldyBQcmVwJyxcbiAgICB0aGFua195b3U6ICAgICAgJ1x1RDgzRFx1REU0RiBUaGFuayBZb3UnLFxuICAgIGhhcnZlc3Q6ICAgICAgICAnXHVEODNDXHVERjNFIEhhcnZlc3QnLFxuICB9O1xuXG4gIC8vIERldGVybWluZSB3aGljaCBzdGVwcyBhcmUgZG9uZSBiYXNlZCBvbiBzZXNzaW9uIHN0YXRlIGZpZWxkcy5cbiAgY29uc3QgcGhhc2UgPSBzdGF0dXMucGhhc2UgfHwgJyc7XG4gIC8vIEFsbCBwb3N0LWxheW91dCBwaGFzZXMgdW5sb2NrIHNpbXVsdGFuZW91c2x5IG9uY2UgbGF5b3V0IGlzIGNvbmZpcm1lZC5cbiAgY29uc3QgcG9zdExheW91dCA9IHBoYXNlID09PSBQSEFTRVMuRklOQUxfR0VORVJBVElPTiB8fCBwaGFzZSA9PT0gUEhBU0VTLlJFRklORU1FTlQ7XG4gIGNvbnN0IGRvbmUgPSB7XG4gICAgam9iOiAgICAgICAgICAgICEhc3RhdHVzLmpvYl9kZXNjcmlwdGlvbixcbiAgICBhbmFseXNpczogICAgICAgISFzdGF0dXMuam9iX2FuYWx5c2lzLFxuICAgIGN1c3RvbWl6YXRpb25zOiAhIXN0YXR1cy5jdXN0b21pemF0aW9ucyxcbiAgICByZXdyaXRlOiAgICAgICAgcGhhc2UgIT09IFBIQVNFUy5SRVdSSVRFX1JFVklFVyAmJiAoISFzdGF0dXMuY3VzdG9taXphdGlvbnMpLFxuICAgIHNwZWxsOiAgICAgICAgICBwaGFzZSA9PT0gUEhBU0VTLkdFTkVSQVRJT04gfHwgcGhhc2UgPT09IFBIQVNFUy5MQVlPVVRfUkVWSUVXIHx8XG4gICAgICAgICAgICAgICAgICAgIHBoYXNlID09PSBQSEFTRVMuRklOQUxfR0VORVJBVElPTiB8fCBwaGFzZSA9PT0gUEhBU0VTLlJFRklORU1FTlQsXG4gICAgbGF5b3V0OiAgICAgICAgIHBvc3RMYXlvdXQsXG4gICAgZG93bmxvYWQ6ICAgICAgIHBvc3RMYXlvdXQsXG4gICAgY292ZXJfbGV0dGVyOiAgIHBvc3RMYXlvdXQsXG4gICAgc2NyZWVuaW5nOiAgICAgIHBvc3RMYXlvdXQsXG4gICAgaW50ZXJ2aWV3X3ByZXA6IHBvc3RMYXlvdXQsXG4gICAgdGhhbmtfeW91OiAgICAgIHBvc3RMYXlvdXQsXG4gICAgaGFydmVzdDogICAgICAgIHBvc3RMYXlvdXQsXG4gIH07XG5cbiAgLy8gRm9yd2FyZC1za2lwIHdhdGVybWFyayAoR0FQLTEwMSk6IHN0ZXBzIHByZXZpb3VzbHkgcmVhY2hlZCBidXQgbm90IGN1cnJlbnRseVxuICAvLyBcImRvbmVcIiBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgcGhhc2UgYXJlIHN0aWxsIG5hdmlnYWJsZSB3aXRoIGEgY29uZmlybWF0aW9uLlxuICBjb25zdCBoaWdoZXN0UGhhc2VJZHggPSBfUEhBU0VfUFJPR1JFU1NJT04uaW5kZXhPZihzdGF0dXMuaGlnaGVzdF9waGFzZSB8fCAnJyk7XG4gIGNvbnN0IGN1cnJlbnRQaGFzZUlkeCA9IF9QSEFTRV9QUk9HUkVTU0lPTi5pbmRleE9mKHBoYXNlKTtcblxuICAvLyBEZXRlcm1pbmUgdGhlIGFjdGl2ZSBzdGVwIGZyb20gdGhlIGJhY2tlbmQgcGhhc2Ugc3RyaW5nLlxuICBjb25zdCBwaGFzZVRvU3RlcCA9IHtcbiAgICAnaW5pdCc6ICAgICAgICAgICAgICdqb2InLFxuICAgICdqb2JfYW5hbHlzaXMnOiAgICAgJ2FuYWx5c2lzJyxcbiAgICAnY3VzdG9taXphdGlvbic6ICAgICdjdXN0b21pemF0aW9ucycsXG4gICAgJ3Jld3JpdGVfcmV2aWV3JzogICAncmV3cml0ZScsXG4gICAgJ3NwZWxsX2NoZWNrJzogICAgICAnc3BlbGwnLFxuICAgICdnZW5lcmF0aW9uJzogICAgICAgJ2xheW91dCcsXG4gICAgJ2xheW91dF9yZXZpZXcnOiAgICAnbGF5b3V0JyxcbiAgICAnZmluYWxfZ2VuZXJhdGlvbic6ICdkb3dubG9hZCcsXG4gICAgJ3JlZmluZW1lbnQnOiAgICAgICAnZG93bmxvYWQnLFxuICB9O1xuICBjb25zdCBhY3RpdmVTdGVwID0gcGhhc2VUb1N0ZXBbcGhhc2VdIHx8ICdqb2InO1xuXG4gIC8vIFJlc29sdmUgdGhlIHJlZW50cnkgc3RlcCBmb3IgdGhlIFwiUmVmaW5pbmdcIiBiYWRnZVxuICBjb25zdCBfcGhhc2VUb1N0ZXAyID0gT2JqZWN0LmFzc2lnbih7J2luaXQnOiAnam9iJ30sIHBoYXNlVG9TdGVwKTtcbiAgY29uc3QgcmVlbnRyeVN0ZXAgPSBzdGF0dXMuaXRlcmF0aW5nXG4gICAgPyAoX3BoYXNlVG9TdGVwMltzdGF0dXMucmVlbnRyeV9waGFzZV0gfHwgc3RhdHVzLnJlZW50cnlfcGhhc2UgfHwgbnVsbClcbiAgICA6IG51bGw7XG5cbiAgY29uc3Qgc3RlcElkcyA9IFtcbiAgICAnam9iJywgJ2FuYWx5c2lzJywgJ2N1c3RvbWl6YXRpb25zJywgJ3Jld3JpdGUnLCAnc3BlbGwnLCAnbGF5b3V0JyxcbiAgICAnZG93bmxvYWQnLCAnY292ZXJfbGV0dGVyJywgJ3NjcmVlbmluZycsICdpbnRlcnZpZXdfcHJlcCcsICd0aGFua195b3UnLCAnaGFydmVzdCcsXG4gIF07XG4gIGNvbnN0IHN0YWxlU3RlcHMgPSBuZXcgU2V0KHN0YXR1cy5zdGFsZV9zdGVwcyB8fCBbXSk7XG4gIHN0ZXBJZHMuZm9yRWFjaChzdGVwID0+IHtcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzdGVwLSR7c3RlcH1gKTtcbiAgICBpZiAoIWVsKSByZXR1cm47XG4gICAgLy8gVXBjb21pbmcgc3RlcHMgYXJlIGZpeGVkIFx1MjAxNCBuZXZlciBjaGFuZ2UgdGhlaXIgY2xhc3MuXG4gICAgaWYgKFVQQ09NSU5HLmhhcyhzdGVwKSkgcmV0dXJuO1xuICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScsICdjb21wbGV0ZWQnLCAnY2xpY2thYmxlJywgJ3VwY29taW5nJywgJ3N0YWxlJywgJ2ZvcndhcmQtc2tpcCcpO1xuXG4gICAgbGV0IGxhYmVsID0gU1RFUF9MQUJFTFNbc3RlcF0gfHwgc3RlcDtcblxuICAgIGlmIChzdGVwID09PSBhY3RpdmVTdGVwKSB7XG4gICAgICBlbC5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICAgIC8vIFwiXHUyMUJCIFJlZmluaW5nXCIgYmFkZ2Ugc2hvd24gb24gdGhlIGFjdGl2ZSBzdGVwIHdoZW4gaXRlcmF0aW5nXG4gICAgICBpZiAoc3RhdHVzLml0ZXJhdGluZyAmJiByZWVudHJ5U3RlcCA9PT0gc3RlcCkge1xuICAgICAgICBsYWJlbCArPSAnIDxzcGFuIGNsYXNzPVwic3RlcC1pbmxpbmUtYmFkZ2VcIj5cdTIxQkIgUmVmaW5pbmc8L3NwYW4+JztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGRvbmVbc3RlcF0pIHtcbiAgICAgIGVsLmNsYXNzTGlzdC5hZGQoJ2NvbXBsZXRlZCcpO1xuICAgICAgLy8gQ29tcGxldGVkIHN0ZXBzIGFyZSBjbGlja2FibGUgZm9yIGJhY2stbmF2aWdhdGlvbi5cbiAgICAgIGVsLmNsYXNzTGlzdC5hZGQoJ2NsaWNrYWJsZScpO1xuICAgICAgLy8gQWRkIFx1MjFCQiByZS1ydW4gYnV0dG9uIGZvciBzdGVwcyB0aGF0IHN1cHBvcnQgTExNIHJlLWV4ZWN1dGlvblxuICAgICAgaWYgKFJFX1JVTl9TVEVQUy5oYXMoc3RlcCkpIHtcbiAgICAgICAgY29uc3QgcmVydW5MYWJlbCA9IF9TVEVQX0RJU1BMQVlbc3RlcF0gfHwgc3RlcDtcbiAgICAgICAgbGFiZWwgKz0gYCA8YnV0dG9uIGNsYXNzPVwic3RlcC1yZXJ1blwiIGFyaWEtbGFiZWw9XCJSZS1ydW4gJHtyZXJ1bkxhYmVsfVwiXG4gICAgICAgICAgdGl0bGU9XCJSZS1ydW4gJHtzdGVwfSB3aXRoIHVwZGF0ZWQgaW5wdXRzXCJcbiAgICAgICAgICBvbmNsaWNrPVwiZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7Y29uZmlybVJlUnVuUGhhc2UoJyR7c3RlcH0nKVwiXG4gICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6MC44ZW07b3BhY2l0eTowLjM1O3RyYW5zaXRpb246b3BhY2l0eSAwLjE1czttYXJnaW4tbGVmdDoycHg7Y3Vyc29yOnBvaW50ZXI7YmFja2dyb3VuZDpub25lO2JvcmRlcjpub25lO3BhZGRpbmc6MDtjb2xvcjppbmhlcml0O2xpbmUtaGVpZ2h0OjE7XCI+XHUyMUJCPC9idXR0b24+YDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGhpZ2hlc3RQaGFzZUlkeCA+PSAwICYmIChfU1RFUF9GV0RfUEhBU0VfTUlOW3N0ZXBdID8/IEluZmluaXR5KSA8PSBoaWdoZXN0UGhhc2VJZHhcbiAgICAgICAgICAgICAgICYmIGhpZ2hlc3RQaGFzZUlkeCA+IGN1cnJlbnRQaGFzZUlkeCkge1xuICAgICAgLy8gRm9yd2FyZC1za2lwOiBzdGVwIHdhcyBjb21wbGV0ZWQgaW4gYSBwcmlvciBpdGVyYXRpb24gYnV0IGlzIGFoZWFkIG9mIGN1cnJlbnQgcGhhc2UuXG4gICAgICBlbC5jbGFzc0xpc3QuYWRkKCdmb3J3YXJkLXNraXAnLCAnY2xpY2thYmxlJyk7XG4gICAgICBsYWJlbCArPSAnIDxzcGFuIGNsYXNzPVwic3RlcC1pbmxpbmUtYmFkZ2Ugc3RlcC1md2QtYmFkZ2VcIiB0aXRsZT1cIlByZXZpb3VzbHkgY29tcGxldGVkIFx1MjAxNCBjbGljayB0byBqdW1wIGFoZWFkXCI+XHUyM0U5PC9zcGFuPic7XG4gICAgfVxuXG4gICAgLy8gQXBwbHkgc3RhbGUgY2xhc3MgZm9yIHN0ZXBzIGRvd25zdHJlYW0gb2YgYSByZS1ydW5cbiAgICBpZiAoc3RhbGVTdGVwcy5oYXMoc3RlcCkpIGVsLmNsYXNzTGlzdC5hZGQoJ3N0YWxlJyk7XG5cbiAgICAvLyBBcHBlbmQgc3Itb25seSBzdGF0ZSBkZXNjcmlwdGlvbiBmb3Igc2NyZWVuIHJlYWRlciB1c2Vyc1xuICAgIGNvbnN0IGlzU3RhbGUgICAgICAgICA9IHN0YWxlU3RlcHMuaGFzKHN0ZXApO1xuICAgIGNvbnN0IGlzU3RhbGVDcml0aWNhbCA9IGVsLmNsYXNzTGlzdC5jb250YWlucygnc3RhbGUtY3JpdGljYWwnKTtcbiAgICBjb25zdCBpc0FjdGl2ZSAgICAgICAgPSBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2FjdGl2ZScpO1xuICAgIGNvbnN0IGlzQ29tcGxldGVkICAgICA9IGVsLmNsYXNzTGlzdC5jb250YWlucygnY29tcGxldGVkJyk7XG4gICAgY29uc3QgaXNGd2RTa2lwICAgICAgID0gZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdmb3J3YXJkLXNraXAnKTtcbiAgICBjb25zdCBzclN0YXRlID0gaXNTdGFsZUNyaXRpY2FsID8gJyAoY3JpdGljYWwgXHUyMDE0IHJldmlldyByZXF1aXJlZCknXG4gICAgICA6IGlzU3RhbGUgICAgID8gJyAoc3RhbGUgXHUyMDE0IHJlc3VsdHMgbWF5IGJlIG91dGRhdGVkKSdcbiAgICAgIDogaXNBY3RpdmUgICAgPyAnIChjdXJyZW50IHN0ZXApJ1xuICAgICAgOiBpc0NvbXBsZXRlZCA/ICcgKGNvbXBsZXRlZCknXG4gICAgICA6IGlzRndkU2tpcCAgID8gJyAocHJldmlvdXNseSBjb21wbGV0ZWQgXHUyMDE0IGNsaWNrIHRvIGp1bXAgYWhlYWQpJ1xuICAgICAgOiAnJztcbiAgICBpZiAoc3JTdGF0ZSkgbGFiZWwgKz0gYDxzcGFuIGNsYXNzPVwic3Itb25seVwiPiR7c3JTdGF0ZX08L3NwYW4+YDtcblxuICAgIGVsLmlubmVySFRNTCA9IGxhYmVsO1xuICB9KTtcblxuICBhcHBseUxheW91dEZyZXNobmVzc05hdmlnYXRpb25TdGF0ZSgpO1xuXG4gIC8vIFNob3cgXHUyMUJCIGljb25zIHZpYSBDU1MgOmhvdmVyIG9uIHRoZSBwYXJlbnQgLmNvbXBsZXRlZCBzdGVwXG4gIC8vIChpbmplY3QgYSA8c3R5bGU+IG9ubHkgb25jZSlcbiAgaWYgKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RlcC1yZXJ1bi1zdHlsZScpKSB7XG4gICAgY29uc3QgcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgcy5pZCA9ICdzdGVwLXJlcnVuLXN0eWxlJztcbiAgICBzLnRleHRDb250ZW50ID0gJy5zdGVwLmNvbXBsZXRlZDpob3ZlciAuc3RlcC1yZXJ1biwgLnN0ZXAuY29tcGxldGVkOmZvY3VzLXdpdGhpbiAuc3RlcC1yZXJ1biB7IG9wYWNpdHk6IDEgIWltcG9ydGFudDsgfSAuc3RlcC1yZXJ1bjpmb2N1cy12aXNpYmxlIHsgb3V0bGluZTogMnB4IHNvbGlkICMzYjgyZjY7IG91dGxpbmUtb2Zmc2V0OiAycHg7IG9wYWNpdHk6IDEgIWltcG9ydGFudDsgfSc7XG4gICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzKTtcbiAgfVxuXG4gIC8vIFN5bmMgc2Vjb25kLWJhciB0YWIgdmlzaWJpbGl0eSBhbmQgYWN0aW9uIGJ1dHRvbnMgdG8gdGhlIGFjdGl2ZSB3b3JrZmxvdyBzdGVwXG4gIGlmICh0eXBlb2YgdXBkYXRlVGFiQmFyRm9yU3RhZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICB1cGRhdGVUYWJCYXJGb3JTdGFnZShhY3RpdmVTdGVwKTtcbiAgfVxuICB1cGRhdGVBY3Rpb25CdXR0b25zKGFjdGl2ZVN0ZXApO1xuXG4gIC8vIFN5bmMgdmlldy1jdXJzb3IgcmluZyB0byB0aGUgY3VycmVudGx5IHZpc2libGUgdGFiXG4gIF91cGRhdGVWaWV3aW5nSW5kaWNhdG9yKHN0YXRlTWFuYWdlci5nZXRDdXJyZW50VGFiKCkpO1xufVxuXG5pZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoR0VORVJBVElPTl9TVEFURV9FVkVOVCwgYXBwbHlMYXlvdXRGcmVzaG5lc3NOYXZpZ2F0aW9uU3RhdGUpO1xuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihHRU5FUkFUSU9OX1NUQVRFX0VWRU5ULCBhcHBseURpcnR5UGhhc2VOYXZpZ2F0aW9uU3RhdGUpO1xufVxuXG4vKipcbiAqIE1hcmsgb3IgdW5tYXJrIHdvcmtmbG93IHN0ZXAgcGlsbHMgYXMgc3RhbGUgYmFzZWQgb24gZGlydHkgcGhhc2VzIHNldCBieVxuICogbGF5b3V0LXBoYXNlIGNvbnRlbnQgZWRpdHMgKFBPU1QgL2FwaS9jdi9hcHBseS1jb250ZW50LWNoYW5nZXMpLlxuICpcbiAqIE9ubHkgYWZmZWN0cyBzdGVwcyBsaXN0ZWQgaW4gc3RhdGVNYW5hZ2VyLmdldERpcnR5UGhhc2VzKCkgdGhhdCBhcmUgTk9UXG4gKiBhbHJlYWR5IGhhbmRsZWQgYnkgYXBwbHlMYXlvdXRGcmVzaG5lc3NOYXZpZ2F0aW9uU3RhdGUgKGkuZS4gbm90ICdsYXlvdXQnKS5cbiAqL1xuZnVuY3Rpb24gYXBwbHlEaXJ0eVBoYXNlTmF2aWdhdGlvblN0YXRlKCkge1xuICBjb25zdCBkaXJ0eVBoYXNlcyA9IHN0YXRlTWFuYWdlci5nZXREaXJ0eVBoYXNlcygpO1xuICBjb25zdCBzdGVwc1RvQ2xlYXIgPSBbXTsgICAgLy8gc3RlcHMgd2UgbWFuYWdlIGhlcmUgKG5vdCAnbGF5b3V0JylcblxuICBzdGVwc1RvQ2xlYXIuZm9yRWFjaChzdGVwID0+IHtcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzdGVwLSR7c3RlcH1gKTtcbiAgICBpZiAoIWVsKSByZXR1cm47XG5cbiAgICBjb25zdCBpc0RpcnR5ID0gZGlydHlQaGFzZXMuaW5jbHVkZXMoc3RlcCk7XG4gICAgZWwuY2xhc3NMaXN0LnRvZ2dsZSgnc3RhbGUnLCBpc0RpcnR5KTtcblxuICAgIC8vIFByZXNlcnZlIGV4aXN0aW5nIHJlcnVuIGJ1dHRvbiBtYXJrdXAsIHVwZGF0ZSB0ZXh0ICsgYmFkZ2VcbiAgICBjb25zdCByZXJ1bkh0bWwgPSBlbC5xdWVyeVNlbGVjdG9yKCcuc3RlcC1yZXJ1bicpPy5vdXRlckhUTUwgfHwgJyc7XG4gICAgY29uc3QgbGFiZWwgICAgID0gX1NURVBfRElTUExBWVtzdGVwXSB8fCBzdGVwO1xuICAgIGNvbnN0IGJhZGdlICAgICA9IGlzRGlydHlcbiAgICAgID8gJyA8c3BhbiBjbGFzcz1cInN0ZXAtaW5saW5lLWJhZGdlIHN0ZXAtc3RhbGUtYmFkZ2VcIj5Db250ZW50IGNoYW5nZWQ8L3NwYW4+J1xuICAgICAgOiAnJztcbiAgICBlbC5pbm5lckhUTUwgPSBgJHtsYWJlbH0ke2JhZGdlfSR7cmVydW5IdG1sID8gYCAke3JlcnVuSHRtbH1gIDogJyd9YDtcbiAgfSk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBTdGVwIG5hdmlnYXRpb24gaGVscGVyIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBfZG9TdGVwTmF2aWdhdGUoc3RlcCkge1xuICBjb25zdCBzdGVwVG9UYWIgPSB7XG4gICAgYW5hbHlzaXM6ICAgICAgICdhbmFseXNpcycsXG4gICAgY3VzdG9taXphdGlvbnM6ICdnb2FscycsXG4gICAgcmV3cml0ZTogICAgICAgICdyZXdyaXRlJyxcbiAgICBzcGVsbDogICAgICAgICAgJ3NwZWxsJyxcbiAgICBsYXlvdXQ6ICAgICAgICAgJ2xheW91dCcsXG4gICAgZG93bmxvYWQ6ICAgICAgICdmaW5hbF9nZW5lcmF0ZScsXG4gICAgY292ZXJfbGV0dGVyOiAgICdjb3Zlci1sZXR0ZXInLFxuICAgIHNjcmVlbmluZzogICAgICAnc2NyZWVuaW5nJyxcbiAgICBpbnRlcnZpZXdfcHJlcDogJ2ludGVydmlldy1wcmVwJyxcbiAgICB0aGFua195b3U6ICAgICAgJ3RoYW5rLXlvdScsXG4gICAgaGFydmVzdDogICAgICAgICdoYXJ2ZXN0JyxcbiAgfTtcbiAgY29uc3QgdGFiTmFtZSA9IHN0ZXBUb1RhYltzdGVwXTtcbiAgaWYgKCF0YWJOYW1lKSByZXR1cm47XG4gIGlmICh0eXBlb2YgdXBkYXRlVGFiQmFyRm9yU3RhZ2UgPT09ICdmdW5jdGlvbicpIHVwZGF0ZVRhYkJhckZvclN0YWdlKHN0ZXApO1xuICBzd2l0Y2hUYWIodGFiTmFtZSk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBTdGVwIGNsaWNrIChiYWNrLW5hdikgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8vIEJhY2stbmF2aWdhdGlvbjogY2xpY2tpbmcgYSBjb21wbGV0ZWQgd29ya2Zsb3cgc3RlcCBuYXZpZ2F0ZXMgdG8gaXRzIHZpZXdlciB0YWIuXG4vLyBDbGlja2luZyB0aGUgam9iIHN0ZXAgYWx3YXlzIG9wZW5zIHRoZSBsb2FkLWpvYiBwYW5lbC5cbmZ1bmN0aW9uIGhhbmRsZVN0ZXBDbGljayhzdGVwKSB7XG4gIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHN0ZXAtJHtzdGVwfWApO1xuICBpZiAoIWVsKSByZXR1cm47XG5cbiAgLy8gSm9iIHN0ZXA6IHNob3cgam9iIGNvbnRlbnQgaWYgYSBqb2IgaXMgbG9hZGVkLCBvdGhlcndpc2Ugb3BlbiB0aGUgbG9hZCBwYW5lbC5cbiAgaWYgKHN0ZXAgPT09ICdqb2InKSB7XG4gICAgaWYgKGVsLmNsYXNzTGlzdC5jb250YWlucygnY29tcGxldGVkJykgfHwgZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdhY3RpdmUnKSkge1xuICAgICAgc3dpdGNoVGFiKCdqb2InKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2hvd0xvYWRKb2JQYW5lbCgpO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBGb3J3YXJkLXNraXA6IHByZXZpb3VzbHkgcmVhY2hlZCBzdGFnZSB0aGF0IGlzIGFoZWFkIG9mIGN1cnJlbnQgcGhhc2UuXG4gIGlmIChlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2ZvcndhcmQtc2tpcCcpKSB7XG4gICAgY29uc3QgbGFiZWwgPSBfU1RFUF9ESVNQTEFZW3N0ZXBdIHx8IHN0ZXA7XG4gICAgaWYgKHR5cGVvZiBjb25maXJtRGlhbG9nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25maXJtRGlhbG9nKFxuICAgICAgICBgSnVtcCBhaGVhZCB0byAke2xhYmVsfT9cXG5cXG5JbnRlcm1lZGlhdGUgc3RhZ2VzIG1heSBuZWVkIHJlLXJ1bm5pbmcgaWYgeW91IG1ha2UgY2hhbmdlcyBoZXJlLmAsXG4gICAgICAgIHsgY29uZmlybUxhYmVsOiAnSnVtcCBhaGVhZCcsIGNhbmNlbExhYmVsOiAnU3RheSBoZXJlJyB9XG4gICAgICApLnRoZW4oY29uZmlybWVkID0+IHsgaWYgKGNvbmZpcm1lZCkgX2RvU3RlcE5hdmlnYXRlKHN0ZXApOyB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgX2RvU3RlcE5hdmlnYXRlKHN0ZXApO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBPbmx5IG5hdmlnYXRlIGlmIHRoZSBzdGVwIGlzIGNvbXBsZXRlZCAoYmFjay1uYXYpIG9yIGFjdGl2ZS5cbiAgaWYgKCFlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2NvbXBsZXRlZCcpICYmICFlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2FjdGl2ZScpKSByZXR1cm47XG5cbiAgY29uc3QgaGFzVW5hbnN3ZXJlZFBvc3RBbmFseXNpc1F1ZXN0aW9ucyA9ICgpID0+IHtcbiAgICBjb25zdCBxcyA9IEFycmF5LmlzQXJyYXkod2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucykgPyB3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zIDogW107XG4gICAgaWYgKHFzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGFuc3dlcnMgPSAod2luZG93LnF1ZXN0aW9uQW5zd2VycyAmJiB0eXBlb2Ygd2luZG93LnF1ZXN0aW9uQW5zd2VycyA9PT0gJ29iamVjdCcpXG4gICAgICA/IHdpbmRvdy5xdWVzdGlvbkFuc3dlcnNcbiAgICAgIDoge307XG4gICAgcmV0dXJuIHFzLnNvbWUocSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGFuc3dlcnNbcS50eXBlXTtcbiAgICAgIHJldHVybiAhdmFsdWUgfHwgIVN0cmluZyh2YWx1ZSkudHJpbSgpO1xuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IHN0ZXBUb1RhYiA9IHtcbiAgICBhbmFseXNpczogICAgICAgaGFzVW5hbnN3ZXJlZFBvc3RBbmFseXNpc1F1ZXN0aW9ucygpID8gJ3F1ZXN0aW9ucycgOiAnYW5hbHlzaXMnLFxuICAgIGN1c3RvbWl6YXRpb25zOiAnZ29hbHMnLFxuICAgIHJld3JpdGU6ICAgICAgICAncmV3cml0ZScsXG4gICAgc3BlbGw6ICAgICAgICAgICdzcGVsbCcsXG4gICAgbGF5b3V0OiAgICAgICAgICdsYXlvdXQnLFxuICAgIGRvd25sb2FkOiAgICAgICAnZmluYWxfZ2VuZXJhdGUnLFxuICAgIGNvdmVyX2xldHRlcjogICAnY292ZXItbGV0dGVyJyxcbiAgICBzY3JlZW5pbmc6ICAgICAgJ3NjcmVlbmluZycsXG4gICAgaW50ZXJ2aWV3X3ByZXA6ICdpbnRlcnZpZXctcHJlcCcsXG4gICAgdGhhbmtfeW91OiAgICAgICd0aGFuay15b3UnLFxuICAgIGhhcnZlc3Q6ICAgICAgICAnaGFydmVzdCcsXG4gIH07XG4gIGNvbnN0IHRhYk5hbWUgPSBzdGVwVG9UYWJbc3RlcF07XG4gIGlmICghdGFiTmFtZSkgcmV0dXJuO1xuXG4gIGNvbnN0IGRvTmF2aWdhdGUgPSAoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB1cGRhdGVUYWJCYXJGb3JTdGFnZSA9PT0gJ2Z1bmN0aW9uJykgdXBkYXRlVGFiQmFyRm9yU3RhZ2Uoc3RlcCk7XG4gICAgc3dpdGNoVGFiKHRhYk5hbWUpO1xuICB9O1xuXG4gIC8vIFNob3cgYSBkb3duc3RyZWFtLWF3YXJlbmVzcyBkaWFsb2cgd2hlbiBiYWNrLW5hdmlnYXRpbmcgdG8gYSBjb21wbGV0ZWQgc3RlcFxuICAvLyB0aGF0IGhhcyBkb3duc3RyZWFtIGNvbXBsZXRlZCBzdGVwcyAobm90IHdoZW4gdGhlIHN0ZXAgaXMgYWN0aXZlKS5cbiAgaWYgKGVsLmNsYXNzTGlzdC5jb250YWlucygnY29tcGxldGVkJykgJiYgIWVsLmNsYXNzTGlzdC5jb250YWlucygnYWN0aXZlJykpIHtcbiAgICBjb25zdCBzdGVwSWR4ID0gX1NURVBfT1JERVIuaW5kZXhPZihzdGVwKTtcbiAgICBjb25zdCBoYXNEb3duc3RyZWFtQ29tcGxldGVkID0gX1NURVBfT1JERVIuc2xpY2Uoc3RlcElkeCArIDEpLnNvbWUocyA9PiB7XG4gICAgICBjb25zdCBkb3duc3RyZWFtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHN0ZXAtJHtzfWApO1xuICAgICAgcmV0dXJuIGRvd25zdHJlYW0gJiYgZG93bnN0cmVhbS5jbGFzc0xpc3QuY29udGFpbnMoJ2NvbXBsZXRlZCcpO1xuICAgIH0pO1xuICAgIGlmIChoYXNEb3duc3RyZWFtQ29tcGxldGVkKSB7XG4gICAgICBfc2hvd1JlUnVuQ29uZmlybU1vZGFsKHN0ZXAsICdiYWNrLW5hdicsIGRvTmF2aWdhdGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGRvTmF2aWdhdGUoKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEV4cG9ydHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmV4cG9ydCB7XG4gIF9TVEVQX09SREVSLFxuICBfU1RFUF9ESVNQTEFZLFxuICBiYWNrVG9QaGFzZSxcbiAgX3Nob3dSZVJ1bkNvbmZpcm1Nb2RhbCxcbiAgX3Nob3dBbmFseXNpc0NsYXJpZmljYXRpb25BbWVuZE1vZGFsLFxuICBjb25maXJtUmVSdW5QaGFzZSxcbiAgcmVSdW5QaGFzZSxcbiAgX2V4ZWN1dGVSZVJ1blBoYXNlLFxuICBfZ2V0U3RlcFRvb2x0aXAsXG4gIF91cGRhdGVWaWV3aW5nSW5kaWNhdG9yLFxuICBfaGlnaGxpZ2h0Q2hhbmdlZEl0ZW1zLFxuICBfbWFya0NoYW5nZWQsXG4gIGFwcGx5TGF5b3V0RnJlc2huZXNzTmF2aWdhdGlvblN0YXRlLFxuICBhcHBseURpcnR5UGhhc2VOYXZpZ2F0aW9uU3RhdGUsXG4gIHNob3dCdWxsZXRSZW9yZGVyLFxuICBfYXBwbHlCdWxsZXRPcmRlcixcbiAgbW92ZUJ1bGxldCxcbiAgX3VwZGF0ZUJ1bGxldEFycm93cyxcbiAgc2F2ZUJ1bGxldE9yZGVyLFxuICByZXNldEJ1bGxldE9yZGVyLFxuICB1cGRhdGVXb3JrZmxvd1N0ZXBzLFxuICBoYW5kbGVTdGVwQ2xpY2ssXG4gIF9BQ1RJT05fTEFCRUxTLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogbGF5b3V0LWluc3RydWN0aW9uLmpzXG4gKiBGcm9udGVuZCBVSSBmb3IgbmF0dXJhbC1sYW5ndWFnZSBsYXlvdXQgaW5zdHJ1Y3Rpb24gd29ya2Zsb3cuXG4gKiBIYW5kbGVzIGluc3RydWN0aW9uIHN1Ym1pc3Npb24sIHByZXZpZXcgdXBkYXRlcywgYW5kIGluc3RydWN0aW9uIGhpc3RvcnkuXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdsYXlvdXQtaW5zdHJ1Y3Rpb24nKTtcblxuaW1wb3J0IHsgYXBpQ2FsbCB9IGZyb20gJy4vYXBpLWNsaWVudC5qcyc7XG5pbXBvcnQgeyBzY2hlZHVsZUF0c1JlZnJlc2ggfSBmcm9tICcuL2F0cy1yZWZpbmVtZW50LmpzJztcbmltcG9ydCB7IGFwcGVuZE1lc3NhZ2UsIGFwcGVuZE1lc3NhZ2VIdG1sIH0gZnJvbSAnLi9tZXNzYWdlLXF1ZXVlLmpzJztcbmltcG9ydCB7IHN3aXRjaFRhYiB9IGZyb20gJy4vcmV2aWV3LXRhYmxlLWJhc2UuanMnO1xuaW1wb3J0IHsgc3RhdGVNYW5hZ2VyLCBHRU5FUkFUSU9OX1NUQVRFX0VWRU5ULCBHRU5FUkFUSU9OX1BIQVNFUyB9IGZyb20gJy4vc3RhdGUtbWFuYWdlci5qcyc7XG5pbXBvcnQgeyBlc2NhcGVIdG1sIH0gZnJvbSAnLi91dGlscy5qcyc7XG5pbXBvcnQgeyBjb25maXJtUmVSdW5QaGFzZSB9IGZyb20gJy4vd29ya2Zsb3ctc3RlcHMuanMnO1xuaW1wb3J0IHsgcmVuZGVySHRtbEludG9JZnJhbWUgfSBmcm9tICcuL3ByZXZpZXctcmVuZGVyLmpzJztcblxubGV0IGRpc21pc3NlZFN0YWxlQ2FsbG91dFJldmlzaW9uID0gbnVsbDtcblxuLyoqXG4gKiBDb252ZXJ0IGEgQ1NTIHBpeGVsIHZhbHVlIHRvIGl0cyB0eXBvZ3JhcGhpYyBwb2ludCBlcXVpdmFsZW50LlxuICogQXNzdW1lcyB0aGUgc3RhbmRhcmQgc2NyZWVuIHJlc29sdXRpb24gY29udmVudGlvbjogOTYgcHgvaW4sIDcyIHB0L2luLFxuICogc28gMXB4ID0gMC43NSBwdC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBweFxuICogQHJldHVybnMge251bWJlcn0gcHQgdmFsdWUgcm91bmRlZCB0byBvbmUgZGVjaW1hbCBwbGFjZVxuICovXG5leHBvcnQgZnVuY3Rpb24gcHhUb1B0KHB4KSB7XG4gIHJldHVybiBNYXRoLnJvdW5kKHB4ICogMC43NSAqIDEwKSAvIDEwO1xufVxuXG5mdW5jdGlvbiBjb2VyY2VCb29sZWFuKHZhbHVlLCBkZWZhdWx0VmFsdWUgPSBmYWxzZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHJldHVybiB2YWx1ZTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCBub3JtYWxpemVkID0gdmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKFsnMScsICd0cnVlJywgJ3llcycsICdvbiddLmluY2x1ZGVzKG5vcm1hbGl6ZWQpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoWycwJywgJ2ZhbHNlJywgJ25vJywgJ29mZiddLmluY2x1ZGVzKG5vcm1hbGl6ZWQpKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gIHJldHVybiBCb29sZWFuKHZhbHVlKTtcbn1cblxuLy8gVW5kbyBzdGFjayBcdTIwMTQgZWFjaCBlbnRyeSBpcyB7IGh0bWwsIGluc3RydWN0aW9ucyB9IHNuYXBzaG90dGVkIGJlZm9yZSBhXG4vLyBsYXlvdXQgaW5zdHJ1Y3Rpb24gaXMgYXBwbGllZC4gIENhcCBhdCAyMCBlbnRyaWVzIHRvIGJvdW5kIG1lbW9yeS5cbmNvbnN0IF9sYXlvdXRVbmRvU3RhY2sgPSBbXTtcbmNvbnN0IF9VTkRPX1NUQUNLX01BWCA9IDIwO1xuXG5mdW5jdGlvbiBnZXRDdkFydGlmYWN0cygpIHtcbiAgcmV0dXJuIHN0YXRlTWFuYWdlci5nZXRUYWJEYXRhKCdjdicpIHx8IHt9O1xufVxuXG5mdW5jdGlvbiB1cGRhdGVDdkFydGlmYWN0cyhuZXh0Q3ZBcnRpZmFjdHMpIHtcbiAgc3RhdGVNYW5hZ2VyLnNldFRhYkRhdGEoJ2N2JywgbmV4dEN2QXJ0aWZhY3RzKTtcbn1cblxuZnVuY3Rpb24gc2V0UHJldmlld0h0bWwoaHRtbCkge1xuICB1cGRhdGVDdkFydGlmYWN0cyh7IC4uLmdldEN2QXJ0aWZhY3RzKCksICcqLmh0bWwnOiBodG1sIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRQcmV2aWV3T3V0cHV0cygpIHtcbiAgcmV0dXJuIHN0YXRlTWFuYWdlcj8uZ2V0R2VuZXJhdGlvblN0YXRlPy4oKT8ucHJldmlld091dHB1dHMgfHwgbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0UHJldmlld091dHB1dFVybChyZW5kZXJlcikge1xuICBjb25zdCBzZXNzaW9uSWQgPSBzdGF0ZU1hbmFnZXI/LmdldFNlc3Npb25JZD8uKCk7XG4gIGNvbnN0IHN1ZmZpeCA9IHNlc3Npb25JZFxuICAgID8gYD9zZXNzaW9uX2lkPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHNlc3Npb25JZCl9YFxuICAgIDogJyc7XG4gIHJldHVybiBgL2FwaS9jdi9wcmV2aWV3LW91dHB1dC8ke2VuY29kZVVSSUNvbXBvbmVudChyZW5kZXJlcil9JHtzdWZmaXh9YDtcbn1cblxuZnVuY3Rpb24gcmVuZGVyUHJldmlld091dHB1dFN0YXR1cyhwcmV2aWV3T3V0cHV0cyA9IG51bGwpIHtcbiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ByZXZpZXctb3V0cHV0LXN0YXR1cycpO1xuICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuO1xuXG4gIGNvbnN0IHBkZnMgPSBwcmV2aWV3T3V0cHV0cz8ucGRmcyB8fCB7fTtcbiAgY29uc3QgcmVuZGVyZXJPcmRlciA9IFsnY2hyb21lJywgJ3dlYXN5cHJpbnQnXTtcbiAgY29uc3QgYXZhaWxhYmxlUmVuZGVyZXJzID0gcmVuZGVyZXJPcmRlci5maWx0ZXIoKHJlbmRlcmVyS2V5KSA9PiByZW5kZXJlcktleSBpbiBwZGZzKTtcblxuICBpZiAoYXZhaWxhYmxlUmVuZGVyZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBgXG4gICAgICA8ZGl2IGNsYXNzPVwicHJldmlldy1vdXRwdXQtZW1wdHlcIj5cbiAgICAgICAgUHJldmlldyBQREZzIHdpbGwgYXBwZWFyIGhlcmUgYWZ0ZXIgdGhlIGN1cnJlbnQgbGF5b3V0IGlzIHJlbmRlcmVkLlxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCByZW5kZXJlckxhYmVscyA9IHtcbiAgICBjaHJvbWU6ICdDaHJvbWUnLFxuICAgIHdlYXN5cHJpbnQ6ICdXZWFzeVByaW50JyxcbiAgfTtcblxuICBjb250YWluZXIuaW5uZXJIVE1MID0gYXZhaWxhYmxlUmVuZGVyZXJzLm1hcCgocmVuZGVyZXJLZXkpID0+IHtcbiAgICBjb25zdCByZW5kZXJlciA9IHBkZnNbcmVuZGVyZXJLZXldIHx8IHt9O1xuICAgIGNvbnN0IG9rID0gQm9vbGVhbihyZW5kZXJlci5vayk7XG4gICAgY29uc3QgZGV0YWlsID0gcmVuZGVyZXIucmVuZGVyZXJfZGV0YWlsIHx8IHJlbmRlcmVyLmVycm9yIHx8ICdObyBkZXRhaWwgYXZhaWxhYmxlJztcbiAgICBjb25zdCByZW5kZXJlckxhYmVsID0gcmVuZGVyZXJMYWJlbHNbcmVuZGVyZXJLZXldIHx8IHJlbmRlcmVyS2V5O1xuICAgIGNvbnN0IGJhZGdlTWFya3VwID0gb2tcbiAgICAgID8gYDxhIGNsYXNzPVwicHJldmlldy1vdXRwdXQtYmFkZ2UgcHJldmlldy1vdXRwdXQtYmFkZ2UtbGluayBpcy1yZWFkeVwiIGhyZWY9XCIke2dldFByZXZpZXdPdXRwdXRVcmwocmVuZGVyZXJLZXkpfVwiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyXCI+JHtyZW5kZXJlckxhYmVsfSBSZWFkeTwvYT5gXG4gICAgICA6IGA8c3BhbiBjbGFzcz1cInByZXZpZXctb3V0cHV0LWJhZGdlIGlzLWZhaWxlZFwiPiR7cmVuZGVyZXJMYWJlbH0gRmFpbGVkPC9zcGFuPmA7XG5cbiAgICByZXR1cm4gYFxuICAgICAgPGRpdiBjbGFzcz1cInByZXZpZXctb3V0cHV0LXJvdyAke29rID8gJ2lzLXJlYWR5JyA6ICdpcy1mYWlsZWQnfVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHJldmlldy1vdXRwdXQtY29weVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcmV2aWV3LW91dHB1dC10aXRsZS1yb3dcIj5cbiAgICAgICAgICAgICR7YmFkZ2VNYXJrdXB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInByZXZpZXctb3V0cHV0LWRldGFpbFwiPiR7ZXNjYXBlSHRtbChkZXRhaWwpfTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIGA7XG4gIH0pLmpvaW4oJycpO1xufVxuXG5mdW5jdGlvbiBhcHBlbmRMYXlvdXRTYWZldHlBbGVydChzYWZldHlBbGVydCkge1xuICBpZiAoIXNhZmV0eUFsZXJ0Py5mbGFnZ2VkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgaXNzdWVzID0gKHNhZmV0eUFsZXJ0Lmlzc3VlcyB8fCBbXSlcbiAgICAubWFwKGlzc3VlID0+IHtcbiAgICAgIGNvbnN0IHRleHQgPSB0eXBlb2YgaXNzdWUgPT09ICdzdHJpbmcnXG4gICAgICAgID8gaXNzdWVcbiAgICAgICAgOiAoaXNzdWU/LmRldGFpbCB8fCBpc3N1ZT8uaXNzdWUgfHwgSlNPTi5zdHJpbmdpZnkoaXNzdWUpKTtcbiAgICAgIHJldHVybiBgPGxpPiR7ZXNjYXBlSHRtbCh0ZXh0KX08L2xpPmA7XG4gICAgfSlcbiAgICAuam9pbignJyk7XG5cbiAgYXBwZW5kTWVzc2FnZUh0bWwoXG4gICAgJ3N5c3RlbScsXG4gICAgYDxzdHJvbmc+XHUyNkEwXHVGRTBGIExheW91dCBzYWZldHkgc2FuaXRpemF0aW9uIGFwcGxpZWQuPC9zdHJvbmc+PGJyPiR7ZXNjYXBlSHRtbChzYWZldHlBbGVydC5tZXNzYWdlIHx8ICdQb3RlbnRpYWwgcHJvbXB0IHBheWxvYWRzIG9yIHVuc2FmZSBIVE1MIHdlcmUgcmVtb3ZlZCBiZWZvcmUgYXBwbHlpbmcgdGhlIGNoYW5nZS4nKX08YnI+PHVsIHN0eWxlPVwibWFyZ2luOjZweCAwIDAgMThweFwiPiR7aXNzdWVzfTwvdWw+YCxcbiAgKTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTGF5b3V0SW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb24gPSB7fSkge1xuICByZXR1cm4ge1xuICAgIHRpbWVzdGFtcDogaW5zdHJ1Y3Rpb24udGltZXN0YW1wIHx8ICcnLFxuICAgIGluc3RydWN0aW9uX3RleHQ6IGluc3RydWN0aW9uLmluc3RydWN0aW9uX3RleHQgfHwgaW5zdHJ1Y3Rpb24uaW5zdHJ1Y3Rpb24gfHwgJycsXG4gICAgY2hhbmdlX3N1bW1hcnk6IGluc3RydWN0aW9uLmNoYW5nZV9zdW1tYXJ5IHx8IGluc3RydWN0aW9uLnN1bW1hcnkgfHwgJycsXG4gICAgY29uZmlybWF0aW9uOiBpbnN0cnVjdGlvbi5jb25maXJtYXRpb24gIT09IGZhbHNlLFxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRDdXJyZW50Q29udGVudFJldmlzaW9uKCkge1xuICByZXR1cm4gc3RhdGVNYW5hZ2VyLmdldEdlbmVyYXRpb25TdGF0ZSgpLmNvbnRlbnRSZXZpc2lvbiA/PyAwO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRHZW5lcmF0aW9uVGltZXN0YW1wKHRpbWVzdGFtcCkge1xuICBpZiAoIXRpbWVzdGFtcCkgcmV0dXJuICcnO1xuICBjb25zdCBwYXJzZWQgPSBuZXcgRGF0ZSh0aW1lc3RhbXApO1xuICBpZiAoTnVtYmVyLmlzTmFOKHBhcnNlZC5nZXRUaW1lKCkpKSByZXR1cm4gJyc7XG4gIHJldHVybiBwYXJzZWQudG9Mb2NhbGVTdHJpbmcoW10sIHsgbW9udGg6ICdzaG9ydCcsIGRheTogJ251bWVyaWMnLCBob3VyOiAnbnVtZXJpYycsIG1pbnV0ZTogJzItZGlnaXQnIH0pO1xufVxuXG5mdW5jdGlvbiBidWlsZExheW91dEZyZXNobmVzc0NoaXBNYXJrdXAoZnJlc2huZXNzKSB7XG4gIGlmICghZnJlc2huZXNzPy5zaG93Q2hpcCkgcmV0dXJuICcnO1xuICBjb25zdCBpY29uID0gZnJlc2huZXNzLmlzQ3JpdGljYWwgPyAnXHUyMUJCJyA6IChmcmVzaG5lc3MuaXNTdGFsZSA/ICchJyA6ICdcdTI3MTMnKTtcbiAgcmV0dXJuIGA8c3BhbiBjbGFzcz1cImxheW91dC1mcmVzaG5lc3MtY2hpcCAke2ZyZXNobmVzcy50b25lfSBsYXlvdXQtcGFuZS1mcmVzaG5lc3MtY2hpcFwiXG4gICAgYXJpYS1sYWJlbD1cIiR7ZXNjYXBlSHRtbChmcmVzaG5lc3MuYXJpYUxhYmVsIHx8ICcnKX1cIj5cbiAgICA8c3BhbiBjbGFzcz1cImxheW91dC1mcmVzaG5lc3MtaWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiR7aWNvbn08L3NwYW4+XG4gICAgPHNwYW4gY2xhc3M9XCJsYXlvdXQtZnJlc2huZXNzLWxhYmVsXCI+JHtlc2NhcGVIdG1sKGZyZXNobmVzcy5sYWJlbCB8fCAnJyl9PC9zcGFuPlxuICA8L3NwYW4+YDtcbn1cblxuZnVuY3Rpb24gcmVuZGVyTGF5b3V0UHJldmlld1N0YXR1cygpIHtcbiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xheW91dC1wcmV2aWV3LXN0YXR1cycpO1xuICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuO1xuICBjb25zdCBmcmVzaG5lc3MgPSBzdGF0ZU1hbmFnZXIuZ2V0TGF5b3V0RnJlc2huZXNzKCk7XG4gIGNvbnN0IGdlbmVyYXRpb25TdGF0ZSA9IHN0YXRlTWFuYWdlci5nZXRHZW5lcmF0aW9uU3RhdGUoKTtcbiAgaWYgKCFnZW5lcmF0aW9uU3RhdGUucHJldmlld0F2YWlsYWJsZSkge1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcbiAgICBjb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgbGFzdFByZXZpZXdSZXZpc2lvbiA9IE51bWJlci5pc0Zpbml0ZShnZW5lcmF0aW9uU3RhdGUubGFzdFByZXZpZXdDb250ZW50UmV2aXNpb24pXG4gICAgPyBnZW5lcmF0aW9uU3RhdGUubGFzdFByZXZpZXdDb250ZW50UmV2aXNpb24gOiBudWxsO1xuICBjb25zdCBjdXJyZW50UmV2aXNpb24gPSBOdW1iZXIuaXNGaW5pdGUoZ2VuZXJhdGlvblN0YXRlLmNvbnRlbnRSZXZpc2lvbilcbiAgICA/IGdlbmVyYXRpb25TdGF0ZS5jb250ZW50UmV2aXNpb24gOiBudWxsO1xuICBjb25zdCBwZW5kaW5nUmV2aXNpb25Db3VudCA9IGxhc3RQcmV2aWV3UmV2aXNpb24gIT09IG51bGwgJiYgY3VycmVudFJldmlzaW9uICE9PSBudWxsXG4gICAgPyBNYXRoLm1heCgwLCBjdXJyZW50UmV2aXNpb24gLSBsYXN0UHJldmlld1JldmlzaW9uKSA6IDA7XG4gIGNvbnN0IHRpbWVzdGFtcExhYmVsID0gZm9ybWF0R2VuZXJhdGlvblRpbWVzdGFtcChnZW5lcmF0aW9uU3RhdGUucHJldmlld0dlbmVyYXRlZEF0KTtcbiAgY29uc3QgZGV0YWlsTGluZXMgPSBbXTtcbiAgaWYgKHRpbWVzdGFtcExhYmVsKSBkZXRhaWxMaW5lcy5wdXNoKGBQcmV2aWV3IGdlbmVyYXRlZCAke3RpbWVzdGFtcExhYmVsfWApO1xuICBpZiAoZ2VuZXJhdGlvblN0YXRlLmxheW91dENvbmZpcm1lZCAmJiBnZW5lcmF0aW9uU3RhdGUuY29uZmlybWVkQXQpIHtcbiAgICBjb25zdCBjb25maXJtZWRMYWJlbCA9IGZvcm1hdEdlbmVyYXRpb25UaW1lc3RhbXAoZ2VuZXJhdGlvblN0YXRlLmNvbmZpcm1lZEF0KTtcbiAgICBpZiAoY29uZmlybWVkTGFiZWwpIGRldGFpbExpbmVzLnB1c2goYExheW91dCBjb25maXJtZWQgJHtjb25maXJtZWRMYWJlbH1gKTtcbiAgfVxuICBpZiAoZnJlc2huZXNzLmlzU3RhbGUpIHtcbiAgICBpZiAocGVuZGluZ1JldmlzaW9uQ291bnQgPiAwKSB7XG4gICAgICBkZXRhaWxMaW5lcy5wdXNoKGAke3BlbmRpbmdSZXZpc2lvbkNvdW50fSBjb250ZW50IGNoYW5nZSR7cGVuZGluZ1JldmlzaW9uQ291bnQgPT09IDEgPyAnJyA6ICdzJ30gc2luY2UgdGhpcyBwcmV2aWV3YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRldGFpbExpbmVzLnB1c2goJ0NvbnRlbnQgY2hhbmdlZCBhZnRlciB0aGlzIHByZXZpZXcgd2FzIGdlbmVyYXRlZCcpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChnZW5lcmF0aW9uU3RhdGUubGF5b3V0Q29uZmlybWVkIHx8IGdlbmVyYXRpb25TdGF0ZS5waGFzZSA9PT0gJ2NvbmZpcm1lZCcpIHtcbiAgICBkZXRhaWxMaW5lcy5wdXNoKCdDb25maXJtZWQgcHJldmlldyBtYXRjaGVzIHRoZSBsYXRlc3QgYXBwcm92ZWQgY29udGVudCcpO1xuICB9IGVsc2Uge1xuICAgIGRldGFpbExpbmVzLnB1c2goJ1ByZXZpZXcgbWF0Y2hlcyB0aGUgbGF0ZXN0IGFwcHJvdmVkIGNvbnRlbnQnKTtcbiAgfVxuICBjb25zdCBzdGFnZUxhYmVsID0gZ2VuZXJhdGlvblN0YXRlLmxheW91dENvbmZpcm1lZCB8fCBnZW5lcmF0aW9uU3RhdGUucGhhc2UgPT09ICdjb25maXJtZWQnXG4gICAgPyAnUmVhZHkgZm9yIGZpbmFsIGZpbGVzJyA6ICdSZWFkeSBmb3IgbGF5b3V0IHJldmlldyc7XG4gIC8vIFBhZ2UgY291bnQgYmFkZ2U6IHNob3duIHdoZW4gYSBwYWdlIGNvdW50IGlzIGF2YWlsYWJsZSBmcm9tIHRoZSBwcmV2aWV3XG4gIGNvbnN0IHBjID0gZ2VuZXJhdGlvblN0YXRlLnBhZ2VDb3VudEV4YWN0ID8/IGdlbmVyYXRpb25TdGF0ZS5wYWdlQ291bnRFc3RpbWF0ZTtcbiAgbGV0IHBhZ2VDb3VudEJhZGdlID0gJyc7XG4gIGlmIChwYyAhPT0gbnVsbCAmJiBwYyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgcGNMYWJlbCAgPSBnZW5lcmF0aW9uU3RhdGUucGFnZUNvdW50RXhhY3QgIT09IG51bGwgPyBgJHtwY30gcGFnZSR7cGMgIT09IDEgPyAncycgOiAnJ31gIDogYH4ke3BjfSBwYWdlJHtwYyAhPT0gMSA/ICdzJyA6ICcnfWA7XG4gICAgY29uc3QgcGNXYXJuICAgPSBnZW5lcmF0aW9uU3RhdGUucGFnZVdhcm5pbmc7XG4gICAgcGFnZUNvdW50QmFkZ2UgPSBgPHNwYW4gY2xhc3M9XCJsYXlvdXQtcGFnZS1jb3VudC1iYWRnZSR7cGNXYXJuID8gJyB3YXJuJyA6ICcnfVwiIHRpdGxlPVwiJHtwY1dhcm4gPyAnUGFnZSBjb3VudCBvdXRzaWRlIHJlY29tbWVuZGVkIHJhbmdlJyA6ICdQYWdlIGNvdW50IHdpdGhpbiByYW5nZSd9XCI+JHtwY1dhcm4gPyAnXHUyNkEwICcgOiAnXHVEODNEXHVEQ0M0ICd9JHtlc2NhcGVIdG1sKHBjTGFiZWwpfTwvc3Bhbj5gO1xuICB9XG4gIGNvbnRhaW5lci5pbm5lckhUTUwgPSBgXG4gICAgPGRpdiBjbGFzcz1cImxheW91dC1wcmV2aWV3LXN0YXR1cy1jYXJkICR7ZnJlc2huZXNzLnRvbmV9XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibGF5b3V0LXByZXZpZXctc3RhdHVzLWhlYWRlclwiPlxuICAgICAgICAke2J1aWxkTGF5b3V0RnJlc2huZXNzQ2hpcE1hcmt1cChmcmVzaG5lc3MpfVxuICAgICAgICA8c3BhbiBjbGFzcz1cImxheW91dC1wcmV2aWV3LXN0YXR1cy1zdGFnZVwiPiR7ZXNjYXBlSHRtbChzdGFnZUxhYmVsKX08L3NwYW4+XG4gICAgICAgICR7cGFnZUNvdW50QmFkZ2V9XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJsYXlvdXQtcHJldmlldy1zdGF0dXMtZGV0YWlsc1wiPlxuICAgICAgICAke2RldGFpbExpbmVzLm1hcCgobGluZSkgPT4gYDxkaXY+JHtlc2NhcGVIdG1sKGxpbmUpfTwvZGl2PmApLmpvaW4oJycpfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+YDtcbiAgY29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xufVxuXG5mdW5jdGlvbiByZW5kZXJMYXlvdXRTdGFsZUNhbGxvdXQoKSB7XG4gIGNvbnN0IGNhbGxvdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGF5b3V0LXN0YWxlLWNhbGxvdXQnKTtcbiAgaWYgKCFjYWxsb3V0KSByZXR1cm47XG5cbiAgY29uc3QgZnJlc2huZXNzID0gc3RhdGVNYW5hZ2VyLmdldExheW91dEZyZXNobmVzcygpO1xuICBjb25zdCBjb250ZW50UmV2aXNpb24gPSBnZXRDdXJyZW50Q29udGVudFJldmlzaW9uKCk7XG4gIGNvbnN0IGlzRGlzbWlzc2VkID0gZGlzbWlzc2VkU3RhbGVDYWxsb3V0UmV2aXNpb24gPT09IGNvbnRlbnRSZXZpc2lvbjtcblxuICBpZiAoIWZyZXNobmVzcy5pc1N0YWxlIHx8IGlzRGlzbWlzc2VkKSB7XG4gICAgaWYgKCFmcmVzaG5lc3MuaXNTdGFsZSkgZGlzbWlzc2VkU3RhbGVDYWxsb3V0UmV2aXNpb24gPSBudWxsO1xuICAgIGNhbGxvdXQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICByZXR1cm47XG4gIH1cblxuICBjYWxsb3V0LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xufVxuXG5mdW5jdGlvbiByZWZyZXNoTGF5b3V0UmV2aWV3U3RhdGUoKSB7XG4gIGNvbnN0IGZyZXNobmVzcyA9IHN0YXRlTWFuYWdlci5nZXRMYXlvdXRGcmVzaG5lc3MoKTtcbiAgY29uc3QgZ2VuZXJhdGlvblN0YXRlID0gc3RhdGVNYW5hZ2VyLmdldEdlbmVyYXRpb25TdGF0ZSgpO1xuICBjb25zdCBjb25maXJtQnRuICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb25maXJtLWxheW91dC1idG4nKTtcbiAgY29uc3QgZmluYWxCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJvY2VlZC10by1maW5hbGlzZS1idG4nKTtcblxuICByZW5kZXJMYXlvdXRQcmV2aWV3U3RhdHVzKCk7XG4gIHJlbmRlckxheW91dFN0YWxlQ2FsbG91dCgpO1xuICByZW5kZXJEaXJ0eVBoYXNlc0NhbGxvdXQoKTtcblxuICBjb25zdCBkaXJ0eVBoYXNlcyA9IHN0YXRlTWFuYWdlci5nZXREaXJ0eVBoYXNlcygpO1xuICBjb25zdCBoYXNEaXJ0eSA9IGRpcnR5UGhhc2VzLmxlbmd0aCA+IDA7XG5cbiAgY29uc3Qgc2hvd0NvbmZpcm0gPSBnZW5lcmF0aW9uU3RhdGUucHJldmlld0F2YWlsYWJsZSAmJiAhZnJlc2huZXNzLmlzU3RhbGUgJiYgIWdlbmVyYXRpb25TdGF0ZS5sYXlvdXRDb25maXJtZWQgJiYgIWhhc0RpcnR5XG4gICAgPyAnYmxvY2snXG4gICAgOiAnbm9uZSc7XG5cbiAgaWYgKGNvbmZpcm1CdG4pICBjb25maXJtQnRuLnN0eWxlLmRpc3BsYXkgID0gc2hvd0NvbmZpcm07XG4gIGNvbnN0IGhpbnRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYXlvdXQtdHdvLXN0ZXAtaGludCcpO1xuICBpZiAoaGludEVsKSBoaW50RWwuc3R5bGUuZGlzcGxheSA9IHNob3dDb25maXJtO1xuXG4gIGlmIChmaW5hbEJ0bikge1xuICAgIGZpbmFsQnRuLnN0eWxlLmRpc3BsYXkgPSBnZW5lcmF0aW9uU3RhdGUucHJldmlld0F2YWlsYWJsZVxuICAgICAgJiYgIWZyZXNobmVzcy5pc1N0YWxlXG4gICAgICAmJiAhaGFzRGlydHlcbiAgICAgICYmIChnZW5lcmF0aW9uU3RhdGUubGF5b3V0Q29uZmlybWVkIHx8IGdlbmVyYXRpb25TdGF0ZS5waGFzZSA9PT0gJ2NvbmZpcm1lZCcpXG4gICAgICA/ICdibG9jaydcbiAgICAgIDogJ25vbmUnO1xuICB9XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBsYXlvdXQgaW5zdHJ1Y3Rpb24gVUkgYW5kIGV2ZW50IGhhbmRsZXJzLlxuICogQ2FsbGVkIHdoZW4gbGF5b3V0IHRhYiBpcyBhY3RpdmF0ZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGluaXRpYXRlTGF5b3V0SW5zdHJ1Y3Rpb25zKCkge1xuICBjb25zdCBpbnN0cnVjdGlvblRhYiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIGlmICghaW5zdHJ1Y3Rpb25UYWIpIHJldHVybjtcblxuICAvLyBDcmVhdGUgdHdvLWNvbHVtbiBsYXlvdXQgaWYgaXQgZG9lc24ndCBleGlzdFxuICBpZiAoIWluc3RydWN0aW9uVGFiLnF1ZXJ5U2VsZWN0b3IoJy5sYXlvdXQtaW5zdHJ1Y3Rpb24tcGFuZWwnKSkge1xuICAgIGluc3RydWN0aW9uVGFiLmlubmVySFRNTCA9IGBcbiAgICAgIDxkaXYgY2xhc3M9XCJsYXlvdXQtaW5zdHJ1Y3Rpb24tcGFuZWxcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxheW91dC1wcmV2aWV3LXBhbmVcIj5cbiAgICAgICAgICA8aDM+Q3VycmVudCBMYXlvdXQgUHJldmlldzwvaDM+XG4gICAgICAgICAgPGRpdiBpZD1cImxheW91dC1wcmV2aWV3LXN0YXR1c1wiIGNsYXNzPVwibGF5b3V0LXByZXZpZXctc3RhdHVzXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInByZXZpZXctaWZyYW1lLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGRpdiBpZD1cInByZXZpZXctbG9hZGluZy1vdmVybGF5XCIgY2xhc3M9XCJwcmV2aWV3LWxvYWRpbmctb3ZlcmxheVwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Bpbm5lclwiPjwvZGl2PlxuICAgICAgICAgICAgICA8cCBjbGFzcz1cInByZXZpZXctbG9hZGluZy1sYWJlbFwiPlJlbmRlcmluZyBwcmV2aWV3XHUyMDI2PC9wPlxuICAgICAgICAgICAgICA8cCBpZD1cInByZXZpZXctbG9hZGluZy1sb2dcIiBjbGFzcz1cInByZXZpZXctbG9hZGluZy1sb2dcIj48L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxpZnJhbWUgaWQ9XCJsYXlvdXQtcHJldmlld1wiIGNsYXNzPVwibGF5b3V0LXByZXZpZXctaWZyYW1lXCIgdGl0bGU9XCJDViBMYXlvdXQgUHJldmlld1wiIHNhbmRib3g9XCJhbGxvdy1zYW1lLW9yaWdpblwiIHJlZmVycmVycG9saWN5PVwibm8tcmVmZXJyZXJcIj48L2lmcmFtZT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxheW91dC1pbnB1dC1wYW5lXCI+XG4gICAgICAgICAgPGgzPkxheW91dCBSZXZpZXc8L2gzPlxuICAgICAgICAgIDxwIGNsYXNzPVwibGF5b3V0LXNjb3BlLWxhYmVsXCI+XHVEODNEXHVEQ0ExIERlc2NyaWJlIGEgbGF5b3V0IGNoYW5nZSAoc3BhY2luZywgbWFyZ2lucywgY29sdW1uIHdpZHRocywgc2VjdGlvbiBvcmRlcikuIFRleHQgY29udGVudCBpcyBmaW5hbGlzZWQgXHUyMDE0IGNvbnRlbnQgZWRpdHMgYXJlIG5vdCBhcHBsaWVkIGhlcmUuPC9wPlxuICAgICAgICAgIDxkaXYgaWQ9XCJsYXlvdXQtcGFnZS1lc3RpbWF0ZVwiIHN0eWxlPVwiZGlzcGxheTpub25lO21hcmdpbi1ib3R0b206MTBweDtcIj48L2Rpdj5cblxuICAgICAgICAgIDxkaXYgaWQ9XCJsYXlvdXQtc3RhbGUtY2FsbG91dFwiIGNsYXNzPVwibGF5b3V0LXN0YWxlLWNhbGxvdXRcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj5cbiAgICAgICAgICAgIDxoND5MYXlvdXQgcHJldmlldyBpcyBvdXQgb2YgZGF0ZTwvaDQ+XG4gICAgICAgICAgICA8cD5Zb3UgY2hhbmdlZCBDViBjb250ZW50IGFmdGVyIHRoZSBjdXJyZW50IHByZXZpZXcgd2FzIGdlbmVyYXRlZC4gUmVnZW5lcmF0ZSB0aGUgcHJldmlldyBiZWZvcmUgdHJ1c3RpbmcgcGFnZSBjb3VudCwgbGF5b3V0IGZlZWRiYWNrLCBvciBmaW5hbCBmaWxlcy48L3A+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGF5b3V0LXN0YWxlLWNhbGxvdXQtYWN0aW9uc1wiPlxuICAgICAgICAgICAgICA8YnV0dG9uIGlkPVwicmVnZW5lcmF0ZS1sYXlvdXQtcHJldmlldy1idG5cIiBjbGFzcz1cImJ0bi13YXJuaW5nIGxheW91dC1hY3Rpb24tYnRuXCI+UmVnZW5lcmF0ZSBwcmV2aWV3PC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b24gaWQ9XCJkaXNtaXNzLWxheW91dC1zdGFsZS1idG5cIiBjbGFzcz1cImJ0bi1zZWNvbmRhcnkgbGF5b3V0LWFjdGlvbi1idG5cIj5LZWVwIHJldmlld2luZyBjdXJyZW50IHByZXZpZXc8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInByZXZpZXctb3V0cHV0LWNhcmRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcmV2aWV3LW91dHB1dC1jYXJkLWhlYWRlclwiPlxuICAgICAgICAgICAgICA8aDQ+UHJldmlldyBQREZzPC9oND5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwcmV2aWV3LW91dHB1dC1jYXJkLW5vdGVcIj5DaHJvbWUgYW5kIFdlYXN5UHJpbnQgcmVuZGVyIGluIHBhcmFsbGVsPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGlkPVwicHJldmlldy1vdXRwdXQtc3RhdHVzXCIgY2xhc3M9XCJwcmV2aWV3LW91dHB1dC1zdGF0dXNcIj48L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYXlvdXQtc2V0dGluZ3Mtcm93XCIgc3R5bGU9XCJkaXNwbGF5OmZsZXg7IGZsZXgtd3JhcDp3cmFwOyBhbGlnbi1pdGVtczpjZW50ZXI7IGdhcDoxMHB4OyBtYXJnaW4tYm90dG9tOjE0cHg7IHBhZGRpbmc6OHB4IDEwcHg7IGJhY2tncm91bmQ6I2Y4ZmFmYzsgYm9yZGVyOjFweCBzb2xpZCAjZTJlOGYwOyBib3JkZXItcmFkaXVzOjZweDtcIj5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJiYXNlLWZvbnQtc2l6ZS1pbnB1dFwiIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTsgZm9udC13ZWlnaHQ6NjAwOyBjb2xvcjojNDc1NTY5OyB3aGl0ZS1zcGFjZTpub3dyYXA7XCI+QmFzZSBmb250IHNpemU6PC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBpZD1cImJhc2UtZm9udC1zaXplLWlucHV0XCJcbiAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgIG1pbj1cIjZcIiBtYXg9XCIxNlwiIHN0ZXA9XCIwLjVcIlxuICAgICAgICAgICAgICB2YWx1ZT1cIjEzXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDo2MHB4OyBwYWRkaW5nOjNweCA2cHg7IGJvcmRlcjoxcHggc29saWQgI2NiZDVlMTsgYm9yZGVyLXJhZGl1czo0cHg7IGZvbnQtc2l6ZTowLjllbTtcIlxuICAgICAgICAgICAgICB0aXRsZT1cIkNvbnRyb2xzIHRoZSByb290IGZvbnQgc2l6ZSBmb3IgdGhlIENWLiBBbGwgcmVtLWJhc2VkIHNpemVzIHNjYWxlIHdpdGggdGhpcyB2YWx1ZS5cIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxzcGFuIGlkPVwiZm9udC1zaXplLXB0LWRpc3BsYXlcIiBzdHlsZT1cImZvbnQtc2l6ZTowLjgyZW07IGNvbG9yOiM2NDc0OGI7IHdoaXRlLXNwYWNlOm5vd3JhcDtcIj5weCZuYnNwOyg5LjgmbmJzcDtwdCk8L3NwYW4+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwicGFnZS1tYXJnaW4taW5wdXRcIiBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07IGZvbnQtd2VpZ2h0OjYwMDsgY29sb3I6IzQ3NTU2OTsgd2hpdGUtc3BhY2U6bm93cmFwOyBtYXJnaW4tbGVmdDo4cHg7XCI+UGFnZSBtYXJnaW4gKGluKTo8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIGlkPVwicGFnZS1tYXJnaW4taW5wdXRcIlxuICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgbWluPVwiMC41XCIgbWF4PVwiMS41XCIgc3RlcD1cIjAuMDVcIlxuICAgICAgICAgICAgICB2YWx1ZT1cIjAuNVwiXG4gICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6NzJweDsgcGFkZGluZzozcHggNnB4OyBib3JkZXI6MXB4IHNvbGlkICNjYmQ1ZTE7IGJvcmRlci1yYWRpdXM6NHB4OyBmb250LXNpemU6MC45ZW07XCJcbiAgICAgICAgICAgICAgdGl0bGU9XCJDb250cm9scyB0aGUgcHJpbnQgcGFnZSBtYXJnaW5zIGZvciBhbGwgUERGIHBhZ2VzLlwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cInB1YmxpY2F0aW9ucy1zdGFydC1uZXctcGFnZS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTppbmxpbmUtZmxleDsgYWxpZ24taXRlbXM6Y2VudGVyOyBnYXA6NnB4OyBmb250LXNpemU6MC44M2VtOyBjb2xvcjojMzM0MTU1OyBtYXJnaW4tbGVmdDo4cHg7XCI+XG4gICAgICAgICAgICAgIDxpbnB1dCBpZD1cInB1YmxpY2F0aW9ucy1zdGFydC1uZXctcGFnZS1pbnB1dFwiIHR5cGU9XCJjaGVja2JveFwiIC8+XG4gICAgICAgICAgICAgIFN0YXJ0IFB1YmxpY2F0aW9ucyBvbiBuZXcgcGFnZVxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJza2lsbHMtc2hvdy1leHBlcmllbmNlLXNlbGVjdFwiIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTsgZm9udC13ZWlnaHQ6NjAwOyBjb2xvcjojNDc1NTY5OyB3aGl0ZS1zcGFjZTpub3dyYXA7IG1hcmdpbi1sZWZ0OjhweDtcIj5Ta2lsbCBleHBlcmllbmNlIGxldmVsOjwvbGFiZWw+XG4gICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgIGlkPVwic2tpbGxzLXNob3ctZXhwZXJpZW5jZS1zZWxlY3RcIlxuICAgICAgICAgICAgICBzdHlsZT1cInBhZGRpbmc6M3B4IDZweDsgYm9yZGVyOjFweCBzb2xpZCAjY2JkNWUxOyBib3JkZXItcmFkaXVzOjRweDsgZm9udC1zaXplOjAuOWVtO1wiXG4gICAgICAgICAgICAgIHRpdGxlPVwiQ29udHJvbHMgd2hldGhlciB5ZWFycyBvZiBleHBlcmllbmNlIGFyZSBzaG93biBuZXh0IHRvIGVhY2ggc2tpbGwuXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImluZGl2aWR1YWxcIj5JbmRpdmlkdWFsIHNldHRpbmc8L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImFsd2F5c1wiPkFsd2F5czwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwibmV2ZXJcIj5OZXZlcjwvb3B0aW9uPlxuICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwiYXBwbHktbGF5b3V0LXNldHRpbmdzLWJ0blwiIGNsYXNzPVwiYnRuLXNlY29uZGFyeVwiIHN0eWxlPVwicGFkZGluZzozcHggMTBweDsgZm9udC1zaXplOjAuODVlbTtcIj5BcHBseTwvYnV0dG9uPlxuICAgICAgICAgICAgPHNwYW4gaWQ9XCJsYXlvdXQtc2V0dGluZ3Mtc3RhdHVzXCIgc3R5bGU9XCJmb250LXNpemU6MC44ZW07IGNvbG9yOiM2NDc0OGI7XCI+PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPHRleHRhcmVhXG4gICAgICAgICAgICBpZD1cImluc3RydWN0aW9uLWlucHV0XCJcbiAgICAgICAgICAgIGNsYXNzPVwibGF5b3V0LWluc3RydWN0aW9uLXRleHRhcmVhXCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiwgTW92ZSBQdWJsaWNhdGlvbnMgc2VjdGlvbiBhZnRlciBTa2lsbHMmIzEwO29yOiBTaG9ydGVuIHRoZSBzZWNvbmQgYnVsbGV0IHVuZGVyIEdlbmVudGVjaCB0byBmb2N1cyBvbiBpbXBhY3QmIzEwO29yOiBLZWVwIHRoZSBHZW5lbnRlY2ggZW50cnkgb24gb25lIHBhZ2VcIlxuICAgICAgICAgICAgcm93cz1cIjZcIj48L3RleHRhcmVhPlxuXG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImFwcGx5LWluc3RydWN0aW9uLWJ0blwiIGNsYXNzPVwiYnRuLXByaW1hcnkgbGF5b3V0LWFjdGlvbi1idG5cIj5cbiAgICAgICAgICAgIEFwcGx5XG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiY29uZmlybS1sYXlvdXQtYnRuXCIgY2xhc3M9XCJjb250aW51ZS1idG4gbGF5b3V0LWFjdGlvbi1idG5cIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj5cbiAgICAgICAgICAgIENvbmZpcm0gTGF5b3V0XG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8cCBpZD1cImxheW91dC10d28tc3RlcC1oaW50XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7Zm9udC1zaXplOjAuODJlbTtjb2xvcjojNmI3MjgwO21hcmdpbjo2cHggMCAycHg7XCI+XG4gICAgICAgICAgICBPbmNlIHRoZSBwcmV2aWV3IGxvb2tzIHJpZ2h0LCBjb25maXJtIHRoZSBsYXlvdXQgXHUyMDE0IHRoZW4gZ2VuZXJhdGUgeW91ciBmaW5hbCBzdWJtaXNzaW9uIGZpbGVzLlxuICAgICAgICAgIDwvcD5cblxuICAgICAgICAgIDxkaXYgaWQ9XCJwcm9jZXNzaW5nLWluZGljYXRvclwiIGNsYXNzPVwicHJvY2Vzc2luZy1pbmRpY2F0b3JcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Bpbm5lclwiPjwvZGl2PlxuICAgICAgICAgICAgPHA+QXBwbHlpbmcgaW5zdHJ1Y3Rpb24uLi48L3A+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGlkPVwiY29uZmlybWF0aW9uLW1lc3NhZ2VcIiBjbGFzcz1cImNvbmZpcm1hdGlvbi1tZXNzYWdlXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPjwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImxheW91dC1oaXN0b3J5LXNlY3Rpb25cIj5cbiAgICAgICAgICAgIDxoND5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoaXN0b3J5LXRvZ2dsZVwiPlx1MjVCQzwvc3Bhbj5cbiAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gSGlzdG9yeSAoPHNwYW4gaWQ9XCJpbnN0cnVjdGlvbi1jb3VudFwiPjA8L3NwYW4+KVxuICAgICAgICAgICAgPC9oND5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJpbnN0cnVjdGlvbi1oaXN0b3J5XCIgY2xhc3M9XCJpbnN0cnVjdGlvbi1oaXN0b3J5LWxpc3RcIj48L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxidXR0b24gaWQ9XCJwcm9jZWVkLXRvLWZpbmFsaXNlLWJ0blwiIGNsYXNzPVwiY29udGludWUtYnRuIGxheW91dC1hY3Rpb24tYnRuXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxuICAgICAgICAgICAgR2VuZXJhdGUgRmluYWwgRmlsZXNcbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDxkaXYgaWQ9XCJjb250ZW50LXByb3Bvc2FsLXByb2Nlc3NpbmdcIiBjbGFzcz1cInByb2Nlc3NpbmctaW5kaWNhdG9yXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Bpbm5lclwiPjwvZGl2PlxuICAgICAgICAgICAgPHA+R2VuZXJhdGluZyBjb250ZW50IHByb3Bvc2Fsc1x1MjAyNjwvcD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGlkPVwiY29udGVudC1wcm9wb3NhbHMtcGFuZWxcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj48L2Rpdj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiYXBwbHktY29udGVudC1jaGFuZ2VzLWJ0blwiIGNsYXNzPVwiYnRuLXdhcm5pbmcgbGF5b3V0LWFjdGlvbi1idG5cIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj5cbiAgICAgICAgICAgIEFwcGx5IEFwcHJvdmVkIENoYW5nZXNcbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDxkaXYgaWQ9XCJkaXJ0eS1waGFzZXMtY2FsbG91dFwiIGNsYXNzPVwiZGlydHktcGhhc2VzLWNhbGxvdXRcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj5cbiAgICAgICAgICAgIDxoND5cdTI2QTAgQ29udGVudCBDaGFuZ2VkIFx1MjAxNCBSZS1ydW4gUmVxdWlyZWQ8L2g0PlxuICAgICAgICAgICAgPHA+VGV4dCBlZGl0cyBoYXZlIGJlZW4gc3RhZ2VkLiBUaGUgY3VycmVudCBwcmV2aWV3IG5vIGxvbmdlciByZWZsZWN0cyB0aGUgdXBkYXRlZCBjb250ZW50LjwvcD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYXlvdXQtc3RhbGUtY2FsbG91dC1hY3Rpb25zXCI+XG4gICAgICAgICAgICAgIDxidXR0b24gaWQ9XCJyZXR1cm4tdG8tZWFybGllc3QtZGlydHktYnRuXCIgY2xhc3M9XCJidG4td2FybmluZyBsYXlvdXQtYWN0aW9uLWJ0blwiPlx1MjFCQiBSZXR1cm4gdG8gR2VuZXJhdGUgQ1Y8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIGA7XG5cbiAgICAvLyBXaXJlIHVwIGV2ZW50IGxpc3RlbmVyc1xuICAgIHNldHVwTGF5b3V0SW5zdHJ1Y3Rpb25MaXN0ZW5lcnMoKTtcbiAgfVxuXG4gIC8vIFJlc3RvcmUgc2F2ZWQgZm9udCBzaXplIGZyb20gc2Vzc2lvbiBzdGF0ZSBpZiBhdmFpbGFibGVcbiAgY29uc3Qgc2F2ZWRGb250U2l6ZSA9IHN0YXRlTWFuYWdlcj8uZ2V0U2Vzc2lvblN0YXRlPy4oKT8uYmFzZV9mb250X3NpemU7XG4gIGlmIChzYXZlZEZvbnRTaXplKSB7XG4gICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFzZS1mb250LXNpemUtaW5wdXQnKTtcbiAgICBpZiAoaW5wdXQpIHtcbiAgICAgIGNvbnN0IHB4ID0gcGFyc2VGbG9hdChzYXZlZEZvbnRTaXplKSB8fCAxMztcbiAgICAgIGlucHV0LnZhbHVlID0gcHg7XG4gICAgICBjb25zdCBwdERpc3BsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZm9udC1zaXplLXB0LWRpc3BsYXknKTtcbiAgICAgIGlmIChwdERpc3BsYXkpIHB0RGlzcGxheS50ZXh0Q29udGVudCA9IGBweFxcdTAwYTAoJHtweFRvUHQocHgpfVxcdTAwYTBwdClgO1xuICAgIH1cbiAgfVxuICBjb25zdCBzYXZlZFBhZ2VNYXJnaW4gPSBzdGF0ZU1hbmFnZXI/LmdldFNlc3Npb25TdGF0ZT8uKCk/LnBhZ2VfbWFyZ2luO1xuICBpZiAoc2F2ZWRQYWdlTWFyZ2luKSB7XG4gICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGFnZS1tYXJnaW4taW5wdXQnKTtcbiAgICBpZiAoaW5wdXQpIGlucHV0LnZhbHVlID0gcGFyc2VGbG9hdChzYXZlZFBhZ2VNYXJnaW4pIHx8IDAuNTtcbiAgfVxuICBjb25zdCBwdWJsaWNhdGlvbnNTdGFydElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1YmxpY2F0aW9ucy1zdGFydC1uZXctcGFnZS1pbnB1dCcpO1xuICBpZiAocHVibGljYXRpb25zU3RhcnRJbnB1dCkge1xuICAgIGNvbnN0IHNlc3Npb25TdGF0ZSA9IHN0YXRlTWFuYWdlcj8uZ2V0U2Vzc2lvblN0YXRlPy4oKSB8fCB7fTtcbiAgICBjb25zdCBjdXN0b21pemF0aW9uU3RhdGUgPSBzdGF0ZU1hbmFnZXI/LmdldFRhYkRhdGE/LignY3VzdG9taXphdGlvbnMnKSB8fCB7fTtcbiAgICBjb25zdCBzYXZlZFB1YmxpY2F0aW9uc1N0YXJ0ID1cbiAgICAgIHNlc3Npb25TdGF0ZS5wdWJsaWNhdGlvbnNfc3RhcnRfbmV3X3BhZ2VcbiAgICAgID8/IHNlc3Npb25TdGF0ZT8uY3VzdG9taXphdGlvbnM/LnB1YmxpY2F0aW9uc19zdGFydF9uZXdfcGFnZVxuICAgICAgPz8gY3VzdG9taXphdGlvblN0YXRlLnB1YmxpY2F0aW9uc19zdGFydF9uZXdfcGFnZVxuICAgICAgPz8gY3VzdG9taXphdGlvblN0YXRlLnB1YmxpY2F0aW9uc19wYWdlX2JyZWFrXG4gICAgICA/PyBjdXN0b21pemF0aW9uU3RhdGUuc3RhcnRfcHVibGljYXRpb25zX29uX25ld19wYWdlXG4gICAgICA/PyBmYWxzZTtcbiAgICBwdWJsaWNhdGlvbnNTdGFydElucHV0LmNoZWNrZWQgPSBjb2VyY2VCb29sZWFuKHNhdmVkUHVibGljYXRpb25zU3RhcnQsIGZhbHNlKTtcbiAgfVxuICBjb25zdCBza2lsbHNTaG93RXhwZXJpZW5jZVNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbHMtc2hvdy1leHBlcmllbmNlLXNlbGVjdCcpO1xuICBpZiAoc2tpbGxzU2hvd0V4cGVyaWVuY2VTZWxlY3QpIHtcbiAgICBjb25zdCBzZXNzaW9uU3RhdGUgPSBzdGF0ZU1hbmFnZXI/LmdldFNlc3Npb25TdGF0ZT8uKCkgfHwge307XG4gICAgY29uc3QgY3VzdG9taXphdGlvblN0YXRlID0gc3RhdGVNYW5hZ2VyPy5nZXRUYWJEYXRhPy4oJ2N1c3RvbWl6YXRpb25zJykgfHwge307XG4gICAgY29uc3Qgc2F2ZWRTa2lsbHNFeHAgPVxuICAgICAgc2Vzc2lvblN0YXRlLnNraWxsc19zaG93X2V4cGVyaWVuY2VcbiAgICAgID8/IHNlc3Npb25TdGF0ZT8uY3VzdG9taXphdGlvbnM/LnNraWxsc19zaG93X2V4cGVyaWVuY2VcbiAgICAgID8/IGN1c3RvbWl6YXRpb25TdGF0ZS5za2lsbHNfc2hvd19leHBlcmllbmNlXG4gICAgICA/PyAnaW5kaXZpZHVhbCc7XG4gICAgY29uc3QgdmFsaWQgPSBbJ2Fsd2F5cycsICduZXZlcicsICdpbmRpdmlkdWFsJ107XG4gICAgc2tpbGxzU2hvd0V4cGVyaWVuY2VTZWxlY3QudmFsdWUgPSB2YWxpZC5pbmNsdWRlcyhzYXZlZFNraWxsc0V4cCkgPyBzYXZlZFNraWxsc0V4cCA6ICdpbmRpdmlkdWFsJztcbiAgfVxuXG4gIHJlbmRlclByZXZpZXdPdXRwdXRTdGF0dXMoZ2V0UHJldmlld091dHB1dHMoKSk7XG5cbiAgLy8gTG9hZCBhbmQgZGlzcGxheSBjdXJyZW50IEhUTUwgcHJldmlldyB2aWEgdGhlIHN0YWdlZCBnZW5lcmF0aW9uIGNvbnRyYWN0LlxuICAvLyAvYXBpL2N2L2dlbmVyYXRlLXByZXZpZXcgZ2VuZXJhdGVzIGZyZXNoIEhUTUwgYW5kIHN0b3JlcyBpdCBpbiBzZXNzaW9uIHN0YXRlLlxuICAvLyBGYWxsIGJhY2sgdG8gdGhlIGxlZ2FjeSAvYXBpL2xheW91dC1odG1sIGVuZHBvaW50IGlmIHRoZSBzZXNzaW9uIGhhcyBub1xuICAvLyBjdXN0b21pemF0aW9uIGRhdGEgeWV0IChlLmcuIHNlc3Npb24gcmVzdG9yZWQgYWZ0ZXIgZnVsbCBnZW5lcmF0aW9uKS5cbiAgY29uc3QgY2FjaGVkSHRtbCA9IGdldEN2QXJ0aWZhY3RzKClbJyouaHRtbCddIHx8ICcnO1xuICBpZiAoY2FjaGVkSHRtbCkge1xuICAgIGRpc3BsYXlMYXlvdXRQcmV2aWV3KGNhY2hlZEh0bWwpO1xuICB9IGVsc2Uge1xuICAgIF9mZXRjaEFuZERpc3BsYXlMYXlvdXRQcmV2aWV3KCk7XG4gIH1cblxuICAvLyBSZXN0b3JlIGFueSBwcmlvciBpbnN0cnVjdGlvbnMgZnJvbSBzZXNzaW9uXG4gIGF3YWl0IHJlc3RvcmVJbnN0cnVjdGlvbkhpc3RvcnkoKTtcbiAgcmVmcmVzaExheW91dFJldmlld1N0YXRlKCk7XG5cbiAgLy8gU2hvdyBhIHByb2FjdGl2ZSBwYWdlLWxlbmd0aCBlc3RpbWF0ZSBzbyB1c2VycyBjYW4gYWRqdXN0IGNvbnRlbnQgYmVmb3JlIGdlbmVyYXRpbmdcbiAgX2ZldGNoUGFnZUVzdGltYXRlKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9mZXRjaFBhZ2VFc3RpbWF0ZSgpIHtcbiAgY29uc3QgYmFubmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xheW91dC1wYWdlLWVzdGltYXRlJyk7XG4gIGlmICghYmFubmVyKSByZXR1cm47XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvZXN0aW1hdGUtcGFnZXMnKTtcbiAgICBpZiAoIXJlcy5vaykgcmV0dXJuO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmICghZGF0YS5vayB8fCAhZGF0YS5lc3RpbWF0ZWRfcGFnZXMpIHJldHVybjtcbiAgICBjb25zdCBwYWdlcyA9IGRhdGEuZXN0aW1hdGVkX3BhZ2VzO1xuICAgIGNvbnN0IGlzT3ZlciA9IHBhZ2VzID4gMztcbiAgICBjb25zdCBjb2xvciA9IGlzT3ZlciA/ICcjOTI0MDBlJyA6ICcjMTY2NTM0JztcbiAgICBjb25zdCBiZyAgICA9IGlzT3ZlciA/ICcjZmVmM2M3JyA6ICcjZjBmZGY0JztcbiAgICBjb25zdCBib3JkZXIgPSBpc092ZXIgPyAnI2ZjZDM0ZCcgOiAnI2JiZjdkMCc7XG4gICAgY29uc3QgbXNnICAgPSBpc092ZXJcbiAgICAgID8gYFx1MjZBMCBFc3RpbWF0ZWQgfiR7cGFnZXN9IHBhZ2VzIFx1MjAxNCBzZW5pb3IgY2FuZGlkYXRlIHRhcmdldCBpcyAyXHUyMDEzMyBwYWdlcy4gQ29uc2lkZXIgcmVkdWNpbmcgc2VsZWN0ZWQgYnVsbGV0IHBvaW50cyBiZWZvcmUgZ2VuZXJhdGluZy5gXG4gICAgICA6IGBcdTI3MTMgRXN0aW1hdGVkIH4ke3BhZ2VzfSBwYWdlcyBcdTIwMTQgd2l0aGluIHRoZSAyXHUyMDEzMyBwYWdlIHRhcmdldCBmb3Igc2VuaW9yIGNhbmRpZGF0ZXMuYDtcbiAgICBiYW5uZXIuc3R5bGUuY3NzVGV4dCA9IGBkaXNwbGF5OmJsb2NrO3BhZGRpbmc6OHB4IDEycHg7Ym9yZGVyLXJhZGl1czo2cHg7Ym9yZGVyOjFweCBzb2xpZCAke2JvcmRlcn07YmFja2dyb3VuZDoke2JnfTtjb2xvcjoke2NvbG9yfTtmb250LXNpemU6MC44N2VtO2A7XG4gICAgYmFubmVyLnRleHRDb250ZW50ID0gbXNnO1xuICB9IGNhdGNoIChfKSB7IC8qIHNpbGVudCBcdTIwMTQgbm9uLWNyaXRpY2FsICovIH1cbn1cblxuLyoqXG4gKiBTZXQgdXAgZXZlbnQgbGlzdGVuZXJzIGZvciBsYXlvdXQgaW5zdHJ1Y3Rpb24gVUkuXG4gKi9cbmZ1bmN0aW9uIHNldHVwTGF5b3V0SW5zdHJ1Y3Rpb25MaXN0ZW5lcnMoKSB7XG4gIGNvbnN0IGFwcGx5QnRuICAgICAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FwcGx5LWluc3RydWN0aW9uLWJ0bicpO1xuICBjb25zdCBjb25maXJtQnRuICAgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb25maXJtLWxheW91dC1idG4nKTtcbiAgY29uc3QgcHJvY2VlZEJ0biAgICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJvY2VlZC10by1maW5hbGlzZS1idG4nKTtcbiAgY29uc3QgcmVnZW5lcmF0ZUJ0biAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVnZW5lcmF0ZS1sYXlvdXQtcHJldmlldy1idG4nKTtcbiAgY29uc3QgZGlzbWlzc0NhbGxvdXRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGlzbWlzcy1sYXlvdXQtc3RhbGUtYnRuJyk7XG4gIGNvbnN0IGluc3RydWN0aW9uSW5wdXQgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2luc3RydWN0aW9uLWlucHV0Jyk7XG4gIGNvbnN0IGhpc3RvcnlUb2dnbGUgICAgID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmhpc3RvcnktdG9nZ2xlJyk7XG4gIGNvbnN0IGFwcGx5U2V0dGluZ3NCdG4gID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FwcGx5LWxheW91dC1zZXR0aW5ncy1idG4nKTtcbiAgY29uc3QgZm9udFNpemVJbnB1dCAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFzZS1mb250LXNpemUtaW5wdXQnKTtcbiAgY29uc3QgcGFnZU1hcmdpbklucHV0ICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGFnZS1tYXJnaW4taW5wdXQnKTtcbiAgY29uc3QgcHVibGljYXRpb25zU3RhcnRJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWJsaWNhdGlvbnMtc3RhcnQtbmV3LXBhZ2UtaW5wdXQnKTtcbiAgY29uc3Qgc2tpbGxzU2hvd0V4cGVyaWVuY2VTZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGxzLXNob3ctZXhwZXJpZW5jZS1zZWxlY3QnKTtcblxuICBpZiAoYXBwbHlTZXR0aW5nc0J0biAmJiBmb250U2l6ZUlucHV0ICYmIHBhZ2VNYXJnaW5JbnB1dCAmJiBwdWJsaWNhdGlvbnNTdGFydElucHV0KSB7XG4gICAgYXBwbHlTZXR0aW5nc0J0bi5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgJ2NsaWNrJyxcbiAgICAgICgpID0+IGFwcGx5TGF5b3V0U2V0dGluZ3MoXG4gICAgICAgIGZvbnRTaXplSW5wdXQudmFsdWUsXG4gICAgICAgIHBhZ2VNYXJnaW5JbnB1dC52YWx1ZSxcbiAgICAgICAgcHVibGljYXRpb25zU3RhcnRJbnB1dC5jaGVja2VkLFxuICAgICAgICBza2lsbHNTaG93RXhwZXJpZW5jZVNlbGVjdD8udmFsdWUgfHwgJ2luZGl2aWR1YWwnLFxuICAgICAgKSxcbiAgICApO1xuICAgIGZvbnRTaXplSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwdERpc3BsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZm9udC1zaXplLXB0LWRpc3BsYXknKTtcbiAgICAgIGlmIChwdERpc3BsYXkpIHtcbiAgICAgICAgY29uc3QgcHggPSBwYXJzZUZsb2F0KGZvbnRTaXplSW5wdXQudmFsdWUpO1xuICAgICAgICBwdERpc3BsYXkudGV4dENvbnRlbnQgPSBpc05hTihweCkgPyAncHgnIDogYHB4XFx1MDBhMCgke3B4VG9QdChweCl9XFx1MDBhMHB0KWA7XG4gICAgICB9XG4gICAgfSk7XG4gICAgZm9udFNpemVJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdrZXlwcmVzcycsIChlKSA9PiB7XG4gICAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicpIHtcbiAgICAgICAgYXBwbHlMYXlvdXRTZXR0aW5ncyhcbiAgICAgICAgICBmb250U2l6ZUlucHV0LnZhbHVlLFxuICAgICAgICAgIHBhZ2VNYXJnaW5JbnB1dC52YWx1ZSxcbiAgICAgICAgICBwdWJsaWNhdGlvbnNTdGFydElucHV0LmNoZWNrZWQsXG4gICAgICAgICAgc2tpbGxzU2hvd0V4cGVyaWVuY2VTZWxlY3Q/LnZhbHVlIHx8ICdpbmRpdmlkdWFsJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBwYWdlTWFyZ2luSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5cHJlc3MnLCAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSAnRW50ZXInKSB7XG4gICAgICAgIGFwcGx5TGF5b3V0U2V0dGluZ3MoXG4gICAgICAgICAgZm9udFNpemVJbnB1dC52YWx1ZSxcbiAgICAgICAgICBwYWdlTWFyZ2luSW5wdXQudmFsdWUsXG4gICAgICAgICAgcHVibGljYXRpb25zU3RhcnRJbnB1dC5jaGVja2VkLFxuICAgICAgICAgIHNraWxsc1Nob3dFeHBlcmllbmNlU2VsZWN0Py52YWx1ZSB8fCAnaW5kaXZpZHVhbCcsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBpZiAoYXBwbHlCdG4pIHtcbiAgICBhcHBseUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IGluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb25JbnB1dC52YWx1ZS50cmltKCk7XG4gICAgICBpZiAoIWluc3RydWN0aW9uKSB7XG4gICAgICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsICdcdTI2QTBcdUZFMEYgUGxlYXNlIGVudGVyIGFuIGluc3RydWN0aW9uIGJlZm9yZSBzdWJtaXR0aW5nLicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzdWJtaXRTbWFydEluc3RydWN0aW9uKGluc3RydWN0aW9uKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChjb25maXJtQnRuKSB7XG4gICAgY29uZmlybUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNvbmZpcm1MYXlvdXRSZXZpZXcpO1xuICB9XG5cbiAgaWYgKHByb2NlZWRCdG4pIHtcbiAgICBwcm9jZWVkQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZ2VuZXJhdGVGaW5hbE91dHB1dHMpO1xuICB9XG5cbiAgaWYgKHJlZ2VuZXJhdGVCdG4pIHtcbiAgICByZWdlbmVyYXRlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlUmVnZW5lcmF0ZVByZXZpZXdBY3Rpb24pO1xuICB9XG5cbiAgaWYgKGRpc21pc3NDYWxsb3V0QnRuKSB7XG4gICAgZGlzbWlzc0NhbGxvdXRCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBkaXNtaXNzZWRTdGFsZUNhbGxvdXRSZXZpc2lvbiA9IGdldEN1cnJlbnRDb250ZW50UmV2aXNpb24oKTtcbiAgICAgIHJlbmRlckxheW91dFN0YWxlQ2FsbG91dCgpO1xuICAgIH0pO1xuICB9XG5cbiAgaWYgKGhpc3RvcnlUb2dnbGUpIHtcbiAgICBoaXN0b3J5VG9nZ2xlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgIGUudGFyZ2V0LnRleHRDb250ZW50ID0gZS50YXJnZXQudGV4dENvbnRlbnQgPT09ICdcdTI1QkMnID8gJ1x1MjVCNicgOiAnXHUyNUJDJztcbiAgICAgIGNvbnN0IGhpc3RvcnlMaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2luc3RydWN0aW9uLWhpc3RvcnknKTtcbiAgICAgIGlmIChoaXN0b3J5TGlzdCkge1xuICAgICAgICBoaXN0b3J5TGlzdC5jbGFzc0xpc3QudG9nZ2xlKCdjb2xsYXBzZWQnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIEFsbG93IEVudGVyIGtleSB0byBzdWJtaXQgaW4gdGV4dGFyZWEgKFNoaWZ0K0VudGVyIGZvciBuZXcgbGluZSlcbiAgaWYgKGluc3RydWN0aW9uSW5wdXQpIHtcbiAgICBpbnN0cnVjdGlvbklucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXByZXNzJywgKGUpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJyAmJiAhZS5zaGlmdEtleSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGFwcGx5QnRuPy5jbGljaygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gQ29udGVudCBwcm9wb3NhbCBhbmQgZGlydHktcGhhc2UgYnV0dG9uc1xuICBjb25zdCBhcHBseUNvbnRlbnRDaGFuZ2VzQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FwcGx5LWNvbnRlbnQtY2hhbmdlcy1idG4nKTtcbiAgY29uc3QgcmV0dXJuVG9EaXJ0eUJ0biAgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXR1cm4tdG8tZWFybGllc3QtZGlydHktYnRuJyk7XG5cbiAgaWYgKGFwcGx5Q29udGVudENoYW5nZXNCdG4pIHtcbiAgICBhcHBseUNvbnRlbnRDaGFuZ2VzQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXBwbHlBY2NlcHRlZFByb3Bvc2Fscyk7XG4gIH1cblxuICBpZiAocmV0dXJuVG9EaXJ0eUJ0bikge1xuICAgIHJldHVyblRvRGlydHlCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBzdGVwID0gc3RhdGVNYW5hZ2VyLmdldEVhcmxpZXN0RGlydHlTdGVwKCkgfHwgJ2dlbmVyYXRlJztcbiAgICAgIGNvbmZpcm1SZVJ1blBoYXNlKHN0ZXApO1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogU2F2ZSBsYXlvdXQgZGlzcGxheSBzZXR0aW5ncyB0byBzZXNzaW9uIHN0YXRlLCB0aGVuIHJlLXJlbmRlciB0aGUgcHJldmlldy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYXBwbHlMYXlvdXRTZXR0aW5ncyhmb250U2l6ZVZhbHVlLCBwYWdlTWFyZ2luVmFsdWUsIHB1YmxpY2F0aW9uc1N0YXJ0TmV3UGFnZSA9IGZhbHNlLCBza2lsbHNTaG93RXhwZXJpZW5jZSA9ICdpbmRpdmlkdWFsJykge1xuICBjb25zdCBzdGF0dXNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYXlvdXQtc2V0dGluZ3Mtc3RhdHVzJyk7XG4gIGNvbnN0IHBhcnNlZEZvbnRTaXplID0gcGFyc2VGbG9hdChmb250U2l6ZVZhbHVlKTtcbiAgY29uc3QgcGFyc2VkUGFnZU1hcmdpbiA9IHBhcnNlRmxvYXQocGFnZU1hcmdpblZhbHVlKTtcbiAgaWYgKGlzTmFOKHBhcnNlZEZvbnRTaXplKSB8fCBwYXJzZWRGb250U2l6ZSA8IDYgfHwgcGFyc2VkRm9udFNpemUgPiAxNikge1xuICAgIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnXHUyNkEwXHVGRTBGIEZvbnQgbXVzdCBiZSA2XHUyMDEzMTYnO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoaXNOYU4ocGFyc2VkUGFnZU1hcmdpbikgfHwgcGFyc2VkUGFnZU1hcmdpbiA8IDAuNSB8fCBwYXJzZWRQYWdlTWFyZ2luID4gMS41KSB7XG4gICAgaWYgKHN0YXR1c0VsKSBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICdcdTI2QTBcdUZFMEYgTWFyZ2luIG11c3QgYmUgMC41XHUyMDEzMS41JztcbiAgICByZXR1cm47XG4gIH1cbiAgdHJ5IHtcbiAgICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJ1NhdmluZ1x1MjAyNic7XG4gICAgY29uc3Qgc2F2ZVJlcyA9IGF3YWl0IGFwaUNhbGwoJ1BPU1QnLCAnL2FwaS9sYXlvdXQtc2V0dGluZ3MnLCB7XG4gICAgICBiYXNlX2ZvbnRfc2l6ZTogYCR7cGFyc2VkRm9udFNpemV9cHhgLFxuICAgICAgcGFnZV9tYXJnaW46IGAke3BhcnNlZFBhZ2VNYXJnaW59aW5gLFxuICAgICAgcHVibGljYXRpb25zX3N0YXJ0X25ld19wYWdlOiBCb29sZWFuKHB1YmxpY2F0aW9uc1N0YXJ0TmV3UGFnZSksXG4gICAgICBza2lsbHNfc2hvd19leHBlcmllbmNlOiBza2lsbHNTaG93RXhwZXJpZW5jZSxcbiAgICB9KTtcbiAgICBpZiAoIXNhdmVSZXMub2spIHRocm93IG5ldyBFcnJvcihzYXZlUmVzLmVycm9yIHx8ICdzYXZlIGZhaWxlZCcpO1xuXG4gICAgaWYgKHN0YXR1c0VsKSBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICdSZS1yZW5kZXJpbmdcdTIwMjYnO1xuICAgIGNvbnN0IHByZXZpZXdSZXMgPSBhd2FpdCBhcGlDYWxsKCdQT1NUJywgJy9hcGkvY3YvZ2VuZXJhdGUtcHJldmlldycsIHsgY29udGVudF9yZXZpc2lvbjogZ2V0Q3VycmVudENvbnRlbnRSZXZpc2lvbigpIH0pO1xuICAgIGlmIChwcmV2aWV3UmVzLm9rICYmIHByZXZpZXdSZXMuaHRtbCkge1xuICAgICAgZGlzcGxheUxheW91dFByZXZpZXcocHJldmlld1Jlcy5odG1sKTtcbiAgICAgIHNldFByZXZpZXdIdG1sKHByZXZpZXdSZXMuaHRtbCk7XG4gICAgICBkaXNtaXNzZWRTdGFsZUNhbGxvdXRSZXZpc2lvbiA9IG51bGw7XG4gICAgICBzdGF0ZU1hbmFnZXI/Lm1hcmtQcmV2aWV3R2VuZXJhdGVkPy4oe1xuICAgICAgICBwcmV2aWV3QXZhaWxhYmxlOiB0cnVlLFxuICAgICAgICBwcmV2aWV3T3V0cHV0czogcHJldmlld1Jlcy5wcmV2aWV3X291dHB1dHMgfHwgbnVsbCxcbiAgICAgICAgcGFnZUNvdW50RXN0aW1hdGU6IHByZXZpZXdSZXMucGFnZV9jb3VudF9lc3RpbWF0ZSA/PyBudWxsLFxuICAgICAgICBwYWdlQ291bnRFeGFjdDogcHJldmlld1Jlcy5wYWdlX2NvdW50X2V4YWN0ID8/IG51bGwsXG4gICAgICAgIHBhZ2VDb3VudENvbmZpZGVuY2U6IHByZXZpZXdSZXMucGFnZV9jb3VudF9jb25maWRlbmNlID8/IG51bGwsXG4gICAgICAgIHBhZ2VDb3VudFNvdXJjZTogcHJldmlld1Jlcy5wYWdlX2NvdW50X3NvdXJjZSB8fCBudWxsLFxuICAgICAgICBwYWdlV2FybmluZzogQm9vbGVhbihwcmV2aWV3UmVzLnBhZ2VfbGVuZ3RoX3dhcm5pbmcpLFxuICAgICAgICBwcmV2aWV3R2VuZXJhdGVkQXQ6IHByZXZpZXdSZXMucHJldmlld19nZW5lcmF0ZWRfYXQgfHwgbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICBwcmV2aWV3UmVxdWVzdElkOiBwcmV2aWV3UmVzLnByZXZpZXdfcmVxdWVzdF9pZCB8fCBudWxsLFxuICAgICAgfSk7XG4gICAgICByZW5kZXJQcmV2aWV3T3V0cHV0U3RhdHVzKHByZXZpZXdSZXMucHJldmlld19vdXRwdXRzIHx8IG51bGwpO1xuICAgICAgcmVmcmVzaExheW91dFJldmlld1N0YXRlKCk7XG4gICAgICAocHJldmlld1Jlcy5jb250ZW50X3dhcm5pbmdzIHx8IFtdKS5mb3JFYWNoKHcgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHNob3dUb2FzdCA9PT0gJ2Z1bmN0aW9uJykgc2hvd1RvYXN0KHcubWVzc2FnZSwgJ3dhcm5pbmcnLCA4MDAwKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoc3RhdHVzRWwpIHsgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnXHUyNzA1IEFwcGxpZWQnOyBzZXRUaW1lb3V0KCgpID0+IHsgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnJzsgfSwgMjAwMCk7IH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKHN0YXR1c0VsKSBzdGF0dXNFbC50ZXh0Q29udGVudCA9IGBcdTI3NEMgRmFpbGVkIHRvIGFwcGx5IFx1MjAxNCB0cnkgYWdhaW4gb3IgcmVmcmVzaC5gO1xuICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsIGBcdTI3NEMgQ291bGQgbm90IGFwcGx5IHRoZSBpbnN0cnVjdGlvbi4gVHJ5IHJlcGhyYXNpbmcgaXQgb3IgcmVmcmVzaCB0aGUgcGFnZSBpZiB0aGUgcHJvYmxlbSBwZXJzaXN0cy5gKTtcbiAgfVxufVxuXG4vKipcbiAqIFN1Ym1pdCBhbiBpbnN0cnVjdGlvbiB0aHJvdWdoIHRoZSB1bmlmaWVkIHNtYXJ0LWluc3RydWN0aW9uIGVuZHBvaW50LlxuICogVGhlIGJhY2tlbmQgY2xhc3NpZmllcyB0aGUgaW5zdHJ1Y3Rpb24gYXMgbGF5b3V0IG9yIGNvbnRlbnQgYW5kIGRlbGVnYXRlc1xuICogdG8gdGhlIGFwcHJvcHJpYXRlIGhhbmRsZXIuIFRoZSByZXNwb25zZSBpcyByb3V0ZWQgYWNjb3JkaW5nbHkgaGVyZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3VibWl0U21hcnRJbnN0cnVjdGlvbihpbnN0cnVjdGlvblRleHQpIHtcbiAgY29uc3QgY3VycmVudEh0bWwgPSBnZXRDdkFydGlmYWN0cygpWycqLmh0bWwnXSB8fCAnJztcbiAgLy8gU25hcHNob3Qgc3RhdGUgZm9yIHVuZG8gYmVmb3JlIGFwcGx5aW5nLlxuICBfbGF5b3V0VW5kb1N0YWNrLnB1c2goe1xuICAgIGh0bWw6IGN1cnJlbnRIdG1sLFxuICAgIGluc3RydWN0aW9uczogKHdpbmRvdy5sYXlvdXRJbnN0cnVjdGlvbnMgfHwgW10pLm1hcChpID0+ICh7IC4uLmkgfSkpLFxuICB9KTtcbiAgaWYgKF9sYXlvdXRVbmRvU3RhY2subGVuZ3RoID4gX1VORE9fU1RBQ0tfTUFYKSB7XG4gICAgX2xheW91dFVuZG9TdGFjay5zaGlmdCgpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBzaG93UHJvY2Vzc2luZyh0cnVlKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGFwaUNhbGwoJ1BPU1QnLCAnL2FwaS9jdi9zbWFydC1pbnN0cnVjdGlvbicsIHsgaW5zdHJ1Y3Rpb246IGluc3RydWN0aW9uVGV4dCB9KTtcblxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIGlmIChyZXNwb25zZS5lcnJvciA9PT0gJ2NsYXJpZnknKSB7XG4gICAgICAgIHNob3dDbGFyaWZpY2F0aW9uRGlhbG9nKHJlc3BvbnNlLnF1ZXN0aW9uLCBpbnN0cnVjdGlvblRleHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXBwZW5kTGF5b3V0U2FmZXR5QWxlcnQocmVzcG9uc2Uuc2FmZXR5X2FsZXJ0KTtcbiAgICAgICAgbGV0IGVycm9ySHRtbCA9IGBcdTI2QTBcdUZFMEYgRXJyb3I6ICR7ZXNjYXBlSHRtbChyZXNwb25zZS5lcnJvcil9IFx1MjAxNCAke2VzY2FwZUh0bWwocmVzcG9uc2UuZGV0YWlscyB8fCAnJyl9YDtcbiAgICAgICAgaWYgKHJlc3BvbnNlLnJhd19yZXNwb25zZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZXJyb3JIdG1sICs9IGA8YnI+PGRldGFpbHMgc3R5bGU9XCJtYXJnaW4tdG9wOjZweFwiPjxzdW1tYXJ5IHN0eWxlPVwiY3Vyc29yOnBvaW50ZXI7Zm9udC1zaXplOjAuODVlbTtjb2xvcjojNjQ3NDhiXCI+UmF3IExMTSByZXNwb25zZTwvc3VtbWFyeT48cHJlIHN0eWxlPVwiZm9udC1zaXplOjAuNzVlbTt3aGl0ZS1zcGFjZTpwcmUtd3JhcDt3b3JkLWJyZWFrOmJyZWFrLWFsbDttYXgtaGVpZ2h0OjIwMHB4O292ZXJmbG93LXk6YXV0bztiYWNrZ3JvdW5kOiNmOGZhZmM7Ym9yZGVyOjFweCBzb2xpZCAjZTJlOGYwO2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6OHB4O21hcmdpbi10b3A6NHB4XCI+JHtlc2NhcGVIdG1sKHJlc3BvbnNlLnJhd19yZXNwb25zZSB8fCAnKGVtcHR5KScpfTwvcHJlPjwvZGV0YWlscz5gO1xuICAgICAgICB9XG4gICAgICAgIGFwcGVuZE1lc3NhZ2VIdG1sKCdzeXN0ZW0nLCBlcnJvckh0bWwpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGluc3RydWN0aW9uVHlwZSA9IHJlc3BvbnNlLmluc3RydWN0aW9uX3R5cGUgfHwgJ2xheW91dCc7XG5cbiAgICBpZiAoaW5zdHJ1Y3Rpb25UeXBlID09PSAnY29udGVudCcpIHtcbiAgICAgIC8vIENvbnRlbnQgcGF0aDogcmVuZGVyIHByb3Bvc2FscyBmb3IgcmV2aWV3XG4gICAgICBjb25zdCBwcm9wb3NhbHMgPSByZXNwb25zZS5wcm9wb3NhbHMgfHwgW107XG4gICAgICBpZiAocHJvcG9zYWxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnXHUyNkEwXHVGRTBGIE5vIGNvbnRlbnQgcHJvcG9zYWxzIHdlcmUgZ2VuZXJhdGVkLiBUcnkgcmVwaHJhc2luZyB5b3VyIGluc3RydWN0aW9uLicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVuZGVyQ29udGVudFByb3Bvc2Fscyhwcm9wb3NhbHMpO1xuICAgICAgICBjb25zdCBwYW5lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb250ZW50LXByb3Bvc2Fscy1wYW5lbCcpO1xuICAgICAgICBpZiAocGFuZWwpIHBhbmVsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgfVxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2luc3RydWN0aW9uLWlucHV0JykudmFsdWUgPSAnJztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBMYXlvdXQgcGF0aDogdXBkYXRlIHByZXZpZXdcbiAgICBjb25zdCBuZXdIdG1sID0gcmVzcG9uc2UuaHRtbDtcbiAgICBkaXNwbGF5TGF5b3V0UHJldmlldyhuZXdIdG1sKTtcbiAgICBhcHBlbmRMYXlvdXRTYWZldHlBbGVydChyZXNwb25zZS5zYWZldHlfYWxlcnQpO1xuICAgIHNldFByZXZpZXdIdG1sKG5ld0h0bWwpO1xuICAgIGRpc21pc3NlZFN0YWxlQ2FsbG91dFJldmlzaW9uID0gbnVsbDtcbiAgICBzdGF0ZU1hbmFnZXI/Lm1hcmtQcmV2aWV3R2VuZXJhdGVkPy4oe1xuICAgICAgcHJldmlld0F2YWlsYWJsZTogdHJ1ZSxcbiAgICAgIHByZXZpZXdPdXRwdXRzOiByZXNwb25zZS5wcmV2aWV3X291dHB1dHMgfHwgbnVsbCxcbiAgICAgIGxheW91dENvbmZpcm1lZDogZmFsc2UsXG4gICAgICBwYWdlQ291bnRFc3RpbWF0ZTogcmVzcG9uc2UucGFnZV9jb3VudF9lc3RpbWF0ZSA/PyBudWxsLFxuICAgICAgcGFnZUNvdW50RXhhY3Q6IHJlc3BvbnNlLnBhZ2VfY291bnRfZXhhY3QgPz8gbnVsbCxcbiAgICAgIHBhZ2VDb3VudENvbmZpZGVuY2U6IHJlc3BvbnNlLnBhZ2VfY291bnRfY29uZmlkZW5jZSA/PyBudWxsLFxuICAgICAgcGFnZUNvdW50U291cmNlOiByZXNwb25zZS5wYWdlX2NvdW50X3NvdXJjZSB8fCBudWxsLFxuICAgICAgcGFnZVdhcm5pbmc6IEJvb2xlYW4ocmVzcG9uc2UucGFnZV9sZW5ndGhfd2FybmluZyksXG4gICAgICBwcmV2aWV3R2VuZXJhdGVkQXQ6IHJlc3BvbnNlLnByZXZpZXdfZ2VuZXJhdGVkX2F0IHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHByZXZpZXdSZXF1ZXN0SWQ6IHJlc3BvbnNlLnByZXZpZXdfcmVxdWVzdF9pZCB8fCBudWxsLFxuICAgIH0pO1xuICAgIHJlbmRlclByZXZpZXdPdXRwdXRTdGF0dXMocmVzcG9uc2UucHJldmlld19vdXRwdXRzIHx8IG51bGwpO1xuXG4gICAgY29uc3QgaW5zdHJ1Y3Rpb24gPSB7XG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9Mb2NhbGVUaW1lU3RyaW5nKCksXG4gICAgICBpbnN0cnVjdGlvbl90ZXh0OiBpbnN0cnVjdGlvblRleHQsXG4gICAgICBjaGFuZ2Vfc3VtbWFyeTogcmVzcG9uc2Uuc3VtbWFyeSxcbiAgICAgIGNvbmZpcm1hdGlvbjogdHJ1ZSxcbiAgICB9O1xuICAgIGFkZFRvSW5zdHJ1Y3Rpb25IaXN0b3J5KGluc3RydWN0aW9uKTtcbiAgICBzaG93Q29uZmlybWF0aW9uTWVzc2FnZShgJHtyZXNwb25zZS5zYWZldHlfYWxlcnQ/LmZsYWdnZWQgPyAnXHUyNkEwXHVGRTBGICcgOiAnXHUyNzA1ICd9JHtyZXNwb25zZS5zdW1tYXJ5fWApO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnN0cnVjdGlvbi1pbnB1dCcpLnZhbHVlID0gJyc7XG4gICAgcmVmcmVzaExheW91dFJldmlld1N0YXRlKCk7XG5cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCBgXHUyNzRDIENvdWxkIG5vdCBhcHBseSB0aGUgaW5zdHJ1Y3Rpb24uIFRyeSByZXBocmFzaW5nIGl0LCBvciBjbGljayBcIlJlZ2VuZXJhdGUgUHJldmlld1wiIHRvIHJlc2V0IHRoZSBwcmV2aWV3IGFuZCB0cnkgYWdhaW4uYCk7XG4gIH0gZmluYWxseSB7XG4gICAgc2hvd1Byb2Nlc3NpbmcoZmFsc2UpO1xuICB9XG59XG5cbi8qKlxuICogU3VibWl0IGxheW91dCBpbnN0cnVjdGlvbiB0byBiYWNrZW5kIGZvciBwcm9jZXNzaW5nLlxuICpcbiAqIFVzZXMgUE9TVCAvYXBpL2N2L2xheW91dC1yZWZpbmUgKHN0YWdlZCBnZW5lcmF0aW9uIGNvbnRyYWN0KSB3aGVuIGFcbiAqIHNlc3Npb24tc3RvcmVkIHByZXZpZXcgaXMgYXZhaWxhYmxlLiAgRmFsbHMgYmFjayB0byB0aGUgbGVnYWN5XG4gKiBQT1NUIC9hcGkvbGF5b3V0LWluc3RydWN0aW9uIGVuZHBvaW50ICh3aGljaCByZXF1aXJlcyB0aGUgSFRNTCBpbiB0aGVcbiAqIHJlcXVlc3QgYm9keSkgd2hlbiBubyBzZXNzaW9uIHByZXZpZXcgZXhpc3RzLlxuICovXG5hc3luYyBmdW5jdGlvbiBzdWJtaXRMYXlvdXRJbnN0cnVjdGlvbihpbnN0cnVjdGlvblRleHQpIHtcbiAgLyogZHVja2Zsb3c6XG4gICAqICAgaWQ6IGxheW91dF91aV9yZWZpbmVfbGl2ZVxuICAgKiAgIGtpbmQ6IHVpXG4gICAqICAgdGltZXN0YW1wOiAnMjAyNi0wMy0yNlQwMDoyNDowMFonXG4gICAqICAgc3RhdHVzOiBsaXZlXG4gICAqICAgaGFuZGxlczpcbiAgICogICAtIHVpOmxheW91dC5zdWJtaXQtaW5zdHJ1Y3Rpb25cbiAgICogICBjYWxsczpcbiAgICogICAtIFBPU1QgL2FwaS9jdi9sYXlvdXQtcmVmaW5lXG4gICAqICAgLSBQT1NUIC9hcGkvbGF5b3V0LWluc3RydWN0aW9uXG4gICAqICAgcmVhZHM6XG4gICAqICAgLSBkb206I2luc3RydWN0aW9uLWlucHV0LnZhbHVlXG4gICAqICAgLSBzdGF0ZTpnZW5lcmF0aW9uX3N0YXRlLnByZXZpZXdBdmFpbGFibGVcbiAgICogICAtIHN0YXRlOmdlbmVyYXRpb25fc3RhdGUucGhhc2VcbiAgICogICAtIHdpbmRvdzpsYXlvdXRJbnN0cnVjdGlvbnNcbiAgICogICB3cml0ZXM6XG4gICAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9jdi9sYXlvdXQtcmVmaW5lLmluc3RydWN0aW9uXG4gICAqICAgLSBkb206I2xheW91dC1wcmV2aWV3XG4gICAqICAgLSB3aW5kb3c6bGF5b3V0SW5zdHJ1Y3Rpb25zXG4gICAqICAgLSBzdGF0ZTpnZW5lcmF0aW9uX3N0YXRlLnByZXZpZXdfb3V0cHV0c1xuICAgKiAgIG5vdGVzOiBTdWJtaXRzIGEgbmF0dXJhbC1sYW5ndWFnZSBsYXlvdXQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCB0aGUgc3RhZ2VkIHByZXZpZXcgd2hlbiBhdmFpbGFibGUsIHRoZW4gcmVmcmVzaGVzIHRoZSBwcmV2aWV3IGFuZCBsb2NhbCBpbnN0cnVjdGlvbiBoaXN0b3J5IGZyb20gdGhlIHJldHVybmVkIEhUTUwuXG4gICAqL1xuICBjb25zdCBjdXJyZW50SHRtbCA9IGdldEN2QXJ0aWZhY3RzKClbJyouaHRtbCddIHx8ICcnO1xuICBjb25zdCBwcmlvckluc3RydWN0aW9ucyA9IHdpbmRvdy5sYXlvdXRJbnN0cnVjdGlvbnMgfHwgW107XG5cbiAgLy8gU25hcHNob3Qgc3RhdGUgYmVmb3JlIGFwcGx5aW5nIHNvIFVuZG8gY2FuIHJlc3RvcmUgaXQuXG4gIF9sYXlvdXRVbmRvU3RhY2sucHVzaCh7XG4gICAgaHRtbDogY3VycmVudEh0bWwsXG4gICAgaW5zdHJ1Y3Rpb25zOiAod2luZG93LmxheW91dEluc3RydWN0aW9ucyB8fCBbXSkubWFwKGkgPT4gKHsgLi4uaSB9KSksXG4gIH0pO1xuICBpZiAoX2xheW91dFVuZG9TdGFjay5sZW5ndGggPiBfVU5ET19TVEFDS19NQVgpIHtcbiAgICBfbGF5b3V0VW5kb1N0YWNrLnNoaWZ0KCk7XG4gIH1cblxuICB0cnkge1xuICAgIHNob3dQcm9jZXNzaW5nKHRydWUpO1xuXG4gICAgLy8gUHJlZmVyIHRoZSBzZXNzaW9uLWJhY2tlZCBlbmRwb2ludDsgaXQgbWFuYWdlcyBIVE1MIHNlcnZlci1zaWRlLlxuICAgIGxldCByZXNwb25zZTtcbiAgICBjb25zdCBnZW5TdGF0ZSA9IHN0YXRlTWFuYWdlcj8uZ2V0R2VuZXJhdGlvblN0YXRlPy4oKSB8fCB7fTtcbiAgICBjb25zdCB1c2VTZXNzaW9uRW5kcG9pbnQgPSBnZW5TdGF0ZS5wcmV2aWV3QXZhaWxhYmxlIHx8IGdlblN0YXRlLnBoYXNlID09PSAnbGF5b3V0X3Jldmlldyc7XG5cbiAgICBpZiAodXNlU2Vzc2lvbkVuZHBvaW50KSB7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IGFwaUNhbGwoJ1BPU1QnLCAnL2FwaS9jdi9sYXlvdXQtcmVmaW5lJywge1xuICAgICAgICBpbnN0cnVjdGlvbjogaW5zdHJ1Y3Rpb25UZXh0LFxuICAgICAgICBjb250ZW50X3JldmlzaW9uOiBnZXRDdXJyZW50Q29udGVudFJldmlzaW9uKCksXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCBhcGlDYWxsKCdQT1NUJywgJy9hcGkvbGF5b3V0LWluc3RydWN0aW9uJywge1xuICAgICAgICBpbnN0cnVjdGlvbjogaW5zdHJ1Y3Rpb25UZXh0LFxuICAgICAgICBjdXJyZW50X2h0bWw6IGN1cnJlbnRIdG1sLFxuICAgICAgICBwcmlvcl9pbnN0cnVjdGlvbnM6IHByaW9ySW5zdHJ1Y3Rpb25zLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgaWYgKHJlc3BvbnNlLmVycm9yID09PSAnY2xhcmlmeScpIHtcbiAgICAgICAgc2hvd0NsYXJpZmljYXRpb25EaWFsb2cocmVzcG9uc2UucXVlc3Rpb24sIGluc3RydWN0aW9uVGV4dCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhcHBlbmRMYXlvdXRTYWZldHlBbGVydChyZXNwb25zZS5zYWZldHlfYWxlcnQpO1xuICAgICAgICBsZXQgZXJyb3JIdG1sID0gYFx1MjZBMFx1RkUwRiBFcnJvcjogJHtlc2NhcGVIdG1sKHJlc3BvbnNlLmVycm9yKX0gXHUyMDE0ICR7ZXNjYXBlSHRtbChyZXNwb25zZS5kZXRhaWxzIHx8ICcnKX1gO1xuICAgICAgICBpZiAocmVzcG9uc2UucmF3X3Jlc3BvbnNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBlcnJvckh0bWwgKz0gYDxicj48ZGV0YWlscyBzdHlsZT1cIm1hcmdpbi10b3A6NnB4XCI+PHN1bW1hcnkgc3R5bGU9XCJjdXJzb3I6cG9pbnRlcjtmb250LXNpemU6MC44NWVtO2NvbG9yOiM2NDc0OGJcIj5SYXcgTExNIHJlc3BvbnNlPC9zdW1tYXJ5PjxwcmUgc3R5bGU9XCJmb250LXNpemU6MC43NWVtO3doaXRlLXNwYWNlOnByZS13cmFwO3dvcmQtYnJlYWs6YnJlYWstYWxsO21heC1oZWlnaHQ6MjAwcHg7b3ZlcmZsb3cteTphdXRvO2JhY2tncm91bmQ6I2Y4ZmFmYztib3JkZXI6MXB4IHNvbGlkICNlMmU4ZjA7Ym9yZGVyLXJhZGl1czo0cHg7cGFkZGluZzo4cHg7bWFyZ2luLXRvcDo0cHhcIj4ke2VzY2FwZUh0bWwocmVzcG9uc2UucmF3X3Jlc3BvbnNlIHx8ICcoZW1wdHkpJyl9PC9wcmU+PC9kZXRhaWxzPmA7XG4gICAgICAgIH1cbiAgICAgICAgYXBwZW5kTWVzc2FnZUh0bWwoJ3N5c3RlbScsIGVycm9ySHRtbCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHByZXZpZXcgd2l0aCBuZXcgSFRNTFxuICAgIGNvbnN0IG5ld0h0bWwgPSByZXNwb25zZS5odG1sO1xuICAgIGRpc3BsYXlMYXlvdXRQcmV2aWV3KG5ld0h0bWwpO1xuXG4gICAgYXBwZW5kTGF5b3V0U2FmZXR5QWxlcnQocmVzcG9uc2Uuc2FmZXR5X2FsZXJ0KTtcblxuICAgIC8vIFVwZGF0ZSBzdGF0ZVxuICAgIHNldFByZXZpZXdIdG1sKG5ld0h0bWwpO1xuICAgIGRpc21pc3NlZFN0YWxlQ2FsbG91dFJldmlzaW9uID0gbnVsbDtcbiAgICBzdGF0ZU1hbmFnZXI/Lm1hcmtQcmV2aWV3R2VuZXJhdGVkPy4oe1xuICAgICAgcHJldmlld0F2YWlsYWJsZTogdHJ1ZSxcbiAgICAgIHByZXZpZXdPdXRwdXRzOiByZXNwb25zZS5wcmV2aWV3X291dHB1dHMgfHwgbnVsbCxcbiAgICAgIGxheW91dENvbmZpcm1lZDogZmFsc2UsXG4gICAgICBwYWdlQ291bnRFc3RpbWF0ZTogcmVzcG9uc2UucGFnZV9jb3VudF9lc3RpbWF0ZSA/PyBudWxsLFxuICAgICAgcGFnZUNvdW50RXhhY3Q6IHJlc3BvbnNlLnBhZ2VfY291bnRfZXhhY3QgPz8gbnVsbCxcbiAgICAgIHBhZ2VDb3VudENvbmZpZGVuY2U6IHJlc3BvbnNlLnBhZ2VfY291bnRfY29uZmlkZW5jZSA/PyBudWxsLFxuICAgICAgcGFnZUNvdW50U291cmNlOiByZXNwb25zZS5wYWdlX2NvdW50X3NvdXJjZSB8fCBudWxsLFxuICAgICAgcGFnZVdhcm5pbmc6IEJvb2xlYW4ocmVzcG9uc2UucGFnZV9sZW5ndGhfd2FybmluZyksXG4gICAgICBwcmV2aWV3R2VuZXJhdGVkQXQ6IHJlc3BvbnNlLnByZXZpZXdfZ2VuZXJhdGVkX2F0IHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHByZXZpZXdSZXF1ZXN0SWQ6IHJlc3BvbnNlLnByZXZpZXdfcmVxdWVzdF9pZCB8fCBudWxsLFxuICAgIH0pO1xuICAgIHJlbmRlclByZXZpZXdPdXRwdXRTdGF0dXMocmVzcG9uc2UucHJldmlld19vdXRwdXRzIHx8IG51bGwpO1xuXG4gICAgLy8gQWRkIHRvIGluc3RydWN0aW9uIGhpc3RvcnlcbiAgICBjb25zdCBpbnN0cnVjdGlvbiA9IHtcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0xvY2FsZVRpbWVTdHJpbmcoKSxcbiAgICAgIGluc3RydWN0aW9uX3RleHQ6IGluc3RydWN0aW9uVGV4dCxcbiAgICAgIGNoYW5nZV9zdW1tYXJ5OiByZXNwb25zZS5zdW1tYXJ5LFxuICAgICAgY29uZmlybWF0aW9uOiB0cnVlXG4gICAgfTtcbiAgICBhZGRUb0luc3RydWN0aW9uSGlzdG9yeShpbnN0cnVjdGlvbik7XG5cbiAgICAvLyBTaG93IGNvbmZpcm1hdGlvblxuICAgIHNob3dDb25maXJtYXRpb25NZXNzYWdlKGAke3Jlc3BvbnNlLnNhZmV0eV9hbGVydD8uZmxhZ2dlZCA/ICdcdTI2QTBcdUZFMEYgJyA6ICdcdTI3MDUgJ30ke3Jlc3BvbnNlLnN1bW1hcnl9YCk7XG5cbiAgICAvLyBDbGVhciBpbnB1dCBhbmQgcmVmcmVzaCB0aGUgc3RhZ2VkIGNvbnRyb2xzLlxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnN0cnVjdGlvbi1pbnB1dCcpLnZhbHVlID0gJyc7XG4gICAgcmVmcmVzaExheW91dFJldmlld1N0YXRlKCk7XG5cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCBgXHUyNzRDIENvdWxkIG5vdCBhcHBseSB0aGUgbGF5b3V0IGluc3RydWN0aW9uLiBUcnkgcmVwaHJhc2luZyBpdCwgb3IgY2xpY2sgXCJSZWdlbmVyYXRlIFByZXZpZXdcIiB0byByZXNldCBhbmQgdHJ5IGFnYWluLmApO1xuICB9IGZpbmFsbHkge1xuICAgIHNob3dQcm9jZXNzaW5nKGZhbHNlKTtcbiAgfVxufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBtYXJrUHJldmlld0dlbmVyYXRlZCBwYXlsb2FkIGZyb20gYSAvYXBpL2N2L2dlbmVyYXRlLXByZXZpZXcgcmVzcG9uc2UuXG4gKiBAcGFyYW0ge09iamVjdH0gZGF0YSAtIFJlc3BvbnNlIGZyb20gdGhlIGdlbmVyYXRlLXByZXZpZXcgZW5kcG9pbnQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBQYXlsb2FkIHN1aXRhYmxlIGZvciBzdGF0ZU1hbmFnZXIubWFya1ByZXZpZXdHZW5lcmF0ZWQoKS5cbiAqL1xuZnVuY3Rpb24gX2J1aWxkUHJldmlld1BheWxvYWQoZGF0YSkge1xuICByZXR1cm4ge1xuICAgIHByZXZpZXdBdmFpbGFibGU6ICAgIHRydWUsXG4gICAgcHJldmlld091dHB1dHM6ICAgICAgZGF0YS5wcmV2aWV3X291dHB1dHMgICAgICB8fCBudWxsLFxuICAgIHBhZ2VDb3VudEVzdGltYXRlOiAgIGRhdGEucGFnZV9jb3VudF9lc3RpbWF0ZSAgPz8gbnVsbCxcbiAgICBwYWdlQ291bnRFeGFjdDogICAgICBkYXRhLnBhZ2VfY291bnRfZXhhY3QgICAgICA/PyBudWxsLFxuICAgIHBhZ2VDb3VudENvbmZpZGVuY2U6IGRhdGEucGFnZV9jb3VudF9jb25maWRlbmNlID8/IG51bGwsXG4gICAgcGFnZUNvdW50U291cmNlOiAgICAgZGF0YS5wYWdlX2NvdW50X3NvdXJjZSAgICAgfHwgbnVsbCxcbiAgICBwYWdlV2FybmluZzogICAgICAgICBCb29sZWFuKGRhdGEucGFnZV9sZW5ndGhfd2FybmluZyksXG4gICAgcHJldmlld0dlbmVyYXRlZEF0OiAgZGF0YS5wcmV2aWV3X2dlbmVyYXRlZF9hdCAgfHwgbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIHByZXZpZXdSZXF1ZXN0SWQ6ICAgIGRhdGEucHJldmlld19yZXF1ZXN0X2lkICAgIHx8IG51bGwsXG4gIH07XG59XG5cbi8qKlxuICogRmV0Y2ggdGhlIENWIEhUTUwgcHJldmlldyB2aWEgdGhlIHN0YWdlZCBnZW5lcmF0aW9uIGNvbnRyYWN0LlxuICpcbiAqIFN0cmF0ZWd5IGRlcGVuZHMgb24gdGhlIGN1cnJlbnQgZ2VuZXJhdGlvbiBzdGF0ZTpcbiAqXG4gKiAtIHBoYXNlIGlzIG5vdCBjb25maXJtZWQvZmluYWxfY29tcGxldGU6XG4gKiAgIEFsd2F5cyBjYWxscyBQT1NUIC9hcGkvY3YvZ2VuZXJhdGUtcHJldmlldywgd2hpY2ggc3RvcmVzIHByZXZpZXdfaHRtbCBpblxuICogICBnZW5lcmF0aW9uX3N0YXRlIChyZXF1aXJlZCBmb3IgY29uZmlybS1sYXlvdXQpIGFuZCBjYWxscyBtYXJrUHJldmlld0dlbmVyYXRlZC5cbiAqICAgVGhpcyBib290c3RyYXBzIHRoZSBzdGFnZWQgc3RhdGUgZXZlbiBhZnRlciBsZWdhY3kgZ2VuZXJhdGVfY3YgYWN0aW9ucyB0aGF0XG4gKiAgIHdyaXRlIGZpbGVzIHRvIGRpc2sgd2l0aG91dCBwb3B1bGF0aW5nIGdlbmVyYXRpb25fc3RhdGUucHJldmlld19odG1sLlxuICogICBGYWxscyBiYWNrIHRvIEdFVCAvYXBpL2xheW91dC1odG1sIChwYXNzaXZlLCBubyBzdGF0ZSBjaGFuZ2UpIHdoZW5cbiAqICAgZ2VuZXJhdGUtcHJldmlldyBpcyB1bmF2YWlsYWJsZSAoZS5nLiBzZXNzaW9uIGhhcyBubyBqb2JfYW5hbHlzaXMgeWV0KS5cbiAqXG4gKiAtIHBoYXNlIGlzIGNvbmZpcm1lZC9maW5hbF9jb21wbGV0ZSAocGFzc2l2ZSByZXN0b3JlKTpcbiAqICAgUmVhZHMgSFRNTCBmcm9tIGRpc2sgdmlhIEdFVCAvYXBpL2xheW91dC1odG1sIHdpdGhvdXQgdG91Y2hpbmcgc2Vzc2lvbiBzdGF0ZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gX2ZldGNoQW5kRGlzcGxheUxheW91dFByZXZpZXcoKSB7XG4gIGNvbnN0IGdlblN0YXRlICAgID0gc3RhdGVNYW5hZ2VyPy5nZXRHZW5lcmF0aW9uU3RhdGU/LigpIHx8IHt9O1xuICBjb25zdCBpc0NvbmZpcm1lZCA9IGdlblN0YXRlLnBoYXNlID09PSBHRU5FUkFUSU9OX1BIQVNFUy5DT05GSVJNRURcbiAgICAgICAgICAgICAgICAgICB8fCBnZW5TdGF0ZS5waGFzZSA9PT0gR0VORVJBVElPTl9QSEFTRVMuRklOQUxfQ09NUExFVEU7XG5cbiAgc2hvd1ByZXZpZXdMb2FkaW5nKHRydWUsIGlzQ29uZmlybWVkID8gJ0xvYWRpbmcgc2F2ZWQgbGF5b3V0XHUyMDI2JyA6ICdHZW5lcmF0aW5nIHByZXZpZXdcdTIwMjYnKTtcbiAgdHJ5IHtcbiAgICAvLyBGcmVzaC1yZW5kZXIgcGF0aDogYWx3YXlzIHBvcHVsYXRlIGdlbmVyYXRpb25fc3RhdGUucHJldmlld19odG1sIG9uIHRoZSBiYWNrZW5kXG4gICAgLy8gc28gdGhhdCBjb25maXJtLWxheW91dCBzdWNjZWVkcy4gQ292ZXJzIGJvdGggdGhlIG5vcm1hbCBzdGFnZWQgcGF0aCBhbmQgdGhlXG4gICAgLy8gbGVnYWN5IGdlbmVyYXRlX2N2IHBhdGggdGhhdCBkb2VzIG5vdCBjYWxsIGdlbmVyYXRlLXByZXZpZXcgaXRzZWxmLlxuICAgIGlmICghaXNDb25maXJtZWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBhcGlDYWxsKCdQT1NUJywgJy9hcGkvY3YvZ2VuZXJhdGUtcHJldmlldycsIHt9KTtcbiAgICAgICAgaWYgKGRhdGEub2sgJiYgZGF0YS5odG1sKSB7XG4gICAgICAgICAgZGlzcGxheUxheW91dFByZXZpZXcoZGF0YS5odG1sKTtcbiAgICAgICAgICBzZXRQcmV2aWV3SHRtbChkYXRhLmh0bWwpO1xuICAgICAgICAgIGRpc21pc3NlZFN0YWxlQ2FsbG91dFJldmlzaW9uID0gbnVsbDtcbiAgICAgICAgICBzdGF0ZU1hbmFnZXI/Lm1hcmtQcmV2aWV3R2VuZXJhdGVkPy4oX2J1aWxkUHJldmlld1BheWxvYWQoZGF0YSkpO1xuICAgICAgICAgIHJlbmRlclByZXZpZXdPdXRwdXRTdGF0dXMoZGF0YS5wcmV2aWV3X291dHB1dHMgfHwgbnVsbCk7XG4gICAgICAgICAgcmVmcmVzaExheW91dFJldmlld1N0YXRlKCk7XG4gICAgICAgICAgKGRhdGEuY29udGVudF93YXJuaW5ncyB8fCBbXSkuZm9yRWFjaCh3ID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc2hvd1RvYXN0ID09PSAnZnVuY3Rpb24nKSBzaG93VG9hc3Qody5tZXNzYWdlLCAnd2FybmluZycsIDgwMDApO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoX2UpIHtcbiAgICAgICAgLy8gZmFsbCB0aHJvdWdoIHRvIGxlZ2FjeSBkaXNrIHJlYWRcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQYXNzaXZlIHJlc3RvcmUgcGF0aDogbG9hZCBzdG9yZWQgSFRNTCBmcm9tIGRpc2sgd2l0aG91dCB0b3VjaGluZyBnZW5lcmF0aW9uIHN0YXRlLlxuICAgIC8vIFVzZWQgZm9yIGNvbmZpcm1lZC9maW5hbF9jb21wbGV0ZSBsYXlvdXRzLCBvciBhcyBmYWxsYmFjayB3aGVuIGdlbmVyYXRlLXByZXZpZXdcbiAgICAvLyBpcyB1bmF2YWlsYWJsZSAoZS5nLiBzZXNzaW9uIGhhcyBubyBqb2JfYW5hbHlzaXMgeWV0KS5cbiAgICB0cnkge1xuICAgICAgc2hvd1ByZXZpZXdMb2FkaW5nKHRydWUsICdMb2FkaW5nIHN0b3JlZCBsYXlvdXRcdTIwMjYnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBhcGlDYWxsKCdHRVQnLCAnL2FwaS9sYXlvdXQtaHRtbCcpO1xuICAgICAgaWYgKGRhdGEub2sgJiYgZGF0YS5odG1sKSB7XG4gICAgICAgIGRpc3BsYXlMYXlvdXRQcmV2aWV3KGRhdGEuaHRtbCk7XG4gICAgICAgIHNldFByZXZpZXdIdG1sKGRhdGEuaHRtbCk7XG4gICAgICAgIHJlZnJlc2hMYXlvdXRSZXZpZXdTdGF0ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsb2cud2FybignTGF5b3V0IHByZXZpZXcgbm90IGF2YWlsYWJsZTonLCBkYXRhLmVycm9yIHx8ICdubyBIVE1MIHJldHVybmVkJyk7XG4gICAgfSBjYXRjaCAoX2UpIHtcbiAgICAgIC8vIG5vIHByZXZpZXcgYXZhaWxhYmxlXG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIHNob3dQcmV2aWV3TG9hZGluZyhmYWxzZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBEaXNwbGF5IEhUTUwgcHJldmlldyBpbiBpZnJhbWUuXG4gKi9cbmZ1bmN0aW9uIGRpc3BsYXlMYXlvdXRQcmV2aWV3KGh0bWwpIHtcbiAgY29uc3QgcHJldmlldyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYXlvdXQtcHJldmlldycpO1xuICBpZiAoIXByZXZpZXcpIHJldHVybjtcblxuICBzaG93UHJldmlld0xvYWRpbmcoZmFsc2UpO1xuICBwcmV2aWV3Lm9ubG9hZCA9ICgpID0+IGZpdExheW91dFByZXZpZXdUb1BhbmUocHJldmlldyk7XG4gIHJlbmRlckh0bWxJbnRvSWZyYW1lKHByZXZpZXcsIGh0bWwpO1xuXG4gIGNvbnN0IGRvYyA9IHByZXZpZXcuY29udGVudERvY3VtZW50IHx8IHByZXZpZXcuY29udGVudFdpbmRvdz8uZG9jdW1lbnQ7XG4gIGlmIChkb2M/LnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScpIHtcbiAgICBmaXRMYXlvdXRQcmV2aWV3VG9QYW5lKHByZXZpZXcpO1xuICB9XG59XG5cbi8qKlxuICogU2NhbGUgdGhlIHByZXZpZXcgc28gYW4gZW50aXJlIENWIHBhZ2Ugd2lkdGggZml0cyB3aXRoaW4gdGhlIHByZXZpZXcgcGFuZS5cbiAqL1xuZnVuY3Rpb24gZml0TGF5b3V0UHJldmlld1RvUGFuZShwcmV2aWV3KSB7XG4gIGNvbnN0IGRvYyA9IHByZXZpZXc/LmNvbnRlbnREb2N1bWVudCB8fCBwcmV2aWV3Py5jb250ZW50V2luZG93Py5kb2N1bWVudDtcbiAgY29uc3QgY29udGFpbmVyID0gcHJldmlldz8uY2xvc2VzdCgnLnByZXZpZXctaWZyYW1lLWNvbnRhaW5lcicpO1xuICBpZiAoIWRvYyB8fCAhY29udGFpbmVyKSByZXR1cm47XG5cbiAgY29uc3QgcGFnZUNvbnRhaW5lciA9IGRvYy5xdWVyeVNlbGVjdG9yKCcucGFnZS1jb250YWluZXInKSB8fCBkb2MuYm9keTtcbiAgaWYgKCFwYWdlQ29udGFpbmVyKSByZXR1cm47XG5cbiAgY29uc3QgY29udGFpbmVyV2lkdGggPSBNYXRoLm1heChjb250YWluZXIuY2xpZW50V2lkdGggLSAyNCwgMSk7XG4gIGNvbnN0IGNvbnRlbnRXaWR0aCA9IE1hdGgubWF4KFxuICAgIE1hdGguY2VpbChwYWdlQ29udGFpbmVyLnNjcm9sbFdpZHRoIHx8IDApLFxuICAgIE1hdGguY2VpbChwYWdlQ29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoIHx8IDApLFxuICAgIDFcbiAgKTtcbiAgY29uc3Qgc2NhbGUgPSBNYXRoLm1pbigxLCBjb250YWluZXJXaWR0aCAvIGNvbnRlbnRXaWR0aCk7XG5cbiAgZG9jLmRvY3VtZW50RWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kID0gJyNmOGZhZmMnO1xuICBkb2MuYm9keS5zdHlsZS5tYXJnaW4gPSAnMCc7XG4gIGRvYy5ib2R5LnN0eWxlLnBhZGRpbmcgPSAnMCc7XG4gIGRvYy5ib2R5LnN0eWxlLmJhY2tncm91bmQgPSAnI2Y4ZmFmYyc7XG4gIGRvYy5ib2R5LnN0eWxlLm92ZXJmbG93WCA9ICdhdXRvJztcblxuICBwYWdlQ29udGFpbmVyLnN0eWxlLnpvb20gPSBgJHtzY2FsZX1gO1xuICBwYWdlQ29udGFpbmVyLnN0eWxlLnRyYW5zZm9ybSA9ICcnO1xuICBwYWdlQ29udGFpbmVyLnN0eWxlLnRyYW5zZm9ybU9yaWdpbiA9ICcnO1xuICBwYWdlQ29udGFpbmVyLnN0eWxlLm1hcmdpbiA9ICcxMnB4JztcbiAgcHJldmlldy5zdHlsZS5taW5XaWR0aCA9ICcnO1xufVxuXG4vKipcbiAqIEFkZCBpbnN0cnVjdGlvbiB0byBoaXN0b3J5IHBhbmVsLlxuICovXG5mdW5jdGlvbiBhZGRUb0luc3RydWN0aW9uSGlzdG9yeShpbnN0cnVjdGlvbikge1xuICAvLyBJbml0aWFsaXplIGdsb2JhbCBpbnN0cnVjdGlvbiBsaXN0IGlmIG5lZWRlZFxuICBpZiAoIXdpbmRvdy5sYXlvdXRJbnN0cnVjdGlvbnMpIHtcbiAgICB3aW5kb3cubGF5b3V0SW5zdHJ1Y3Rpb25zID0gW107XG4gIH1cblxuICB3aW5kb3cubGF5b3V0SW5zdHJ1Y3Rpb25zLnB1c2gobm9ybWFsaXplTGF5b3V0SW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb24pKTtcbiAgcmVuZGVySW5zdHJ1Y3Rpb25IaXN0b3J5KCk7XG59XG5cbi8qKlxuICogUmVuZGVyIGluc3RydWN0aW9uIGhpc3RvcnkgZnJvbSBjdXJyZW50IHN0YXRlIHdpdGhvdXQgbXV0YXRpbmcgaXQuXG4gKi9cbmZ1bmN0aW9uIHJlbmRlckluc3RydWN0aW9uSGlzdG9yeSgpIHtcbiAgY29uc3QgaGlzdG9yeUxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5zdHJ1Y3Rpb24taGlzdG9yeScpO1xuICBpZiAoIWhpc3RvcnlMaXN0KSByZXR1cm47XG5cbiAgY29uc3QgaW5zdHJ1Y3Rpb25zID0gd2luZG93LmxheW91dEluc3RydWN0aW9ucyB8fCBbXTtcbiAgaGlzdG9yeUxpc3QuaW5uZXJIVE1MID0gJyc7XG4gIGNvbnN0IGxhc3RJZHggPSBpbnN0cnVjdGlvbnMubGVuZ3RoIC0gMTtcbiAgaW5zdHJ1Y3Rpb25zLmZvckVhY2goKGluc3RydWN0aW9uLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IGVudHJ5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZW50cnkuY2xhc3NOYW1lID0gJ2luc3RydWN0aW9uLWhpc3RvcnktZW50cnknO1xuICAgIGNvbnN0IGlzTGFzdCA9IGluZGV4ID09PSBsYXN0SWR4O1xuICAgIGNvbnN0IHVuZG9IdG1sID0gaXNMYXN0XG4gICAgICA/IGA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0bi1zbVwiIG9uY2xpY2s9XCJ1bmRvSW5zdHJ1Y3Rpb24oJHtpbmRleH0pXCI+XHUyMUE5IFVuZG88L2J1dHRvbj5gXG4gICAgICA6IGA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0bi1zbVwiIGRpc2FibGVkIHRpdGxlPVwiVW5kbyBpcyBzZXF1ZW50aWFsIFx1MjAxNCB1bmRvIHRoZSBtb3N0IHJlY2VudCBpbnN0cnVjdGlvbiBmaXJzdFwiXG4gICAgICAgICAgIHN0eWxlPVwib3BhY2l0eTowLjM7Y3Vyc29yOm5vdC1hbGxvd2VkO1wiPlx1MjFBOSBVbmRvPC9idXR0b24+YDtcbiAgICBlbnRyeS5pbm5lckhUTUwgPSBgXG4gICAgICA8ZGl2IGNsYXNzPVwiaW5zdHJ1Y3Rpb24tdGltZVwiPiR7aW5zdHJ1Y3Rpb24udGltZXN0YW1wIHx8ICcnfTwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImluc3RydWN0aW9uLXRleHRcIj4ke2VzY2FwZUh0bWwoaW5zdHJ1Y3Rpb24uaW5zdHJ1Y3Rpb25fdGV4dCB8fCAnJyl9PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiaW5zdHJ1Y3Rpb24tc3VtbWFyeVwiPjxlbT4ke2VzY2FwZUh0bWwoaW5zdHJ1Y3Rpb24uY2hhbmdlX3N1bW1hcnkgfHwgJycpfTwvZW0+PC9kaXY+XG4gICAgICAke3VuZG9IdG1sfVxuICAgIGA7XG4gICAgaGlzdG9yeUxpc3QuYXBwZW5kQ2hpbGQoZW50cnkpO1xuICB9KTtcblxuICAvLyBVcGRhdGUgY291bnRcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2luc3RydWN0aW9uLWNvdW50JykudGV4dENvbnRlbnQgPSAod2luZG93LmxheW91dEluc3RydWN0aW9ucyB8fCBbXSkubGVuZ3RoO1xufVxuXG4vKipcbiAqIFJlc3RvcmUgaW5zdHJ1Y3Rpb24gaGlzdG9yeSBmcm9tIHNlc3Npb24gc3RhdGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxvYWRMYXlvdXRJbnN0cnVjdGlvbkhpc3RvcnkoKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBhcGlDYWxsKCdHRVQnLCAnL2FwaS9sYXlvdXQtaGlzdG9yeScpO1xuICAgIGlmICghcmVzcG9uc2U/Lmluc3RydWN0aW9ucyB8fCAhQXJyYXkuaXNBcnJheShyZXNwb25zZS5pbnN0cnVjdGlvbnMpKSB7XG4gICAgICByZXR1cm4gd2luZG93LmxheW91dEluc3RydWN0aW9ucyB8fCBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzcG9uc2UuaW5zdHJ1Y3Rpb25zLm1hcCgoaW5zdHJ1Y3Rpb24pID0+IG5vcm1hbGl6ZUxheW91dEluc3RydWN0aW9uKGluc3RydWN0aW9uKSk7XG4gIH0gY2F0Y2ggKF9lcnJvcikge1xuICAgIHJldHVybiB3aW5kb3cubGF5b3V0SW5zdHJ1Y3Rpb25zIHx8IFtdO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc3RvcmVJbnN0cnVjdGlvbkhpc3RvcnkoKSB7XG4gIHdpbmRvdy5sYXlvdXRJbnN0cnVjdGlvbnMgPSBhd2FpdCBsb2FkTGF5b3V0SW5zdHJ1Y3Rpb25IaXN0b3J5KCk7XG4gIHJlbmRlckluc3RydWN0aW9uSGlzdG9yeSgpO1xuICByZWZyZXNoTGF5b3V0UmV2aWV3U3RhdGUoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaGFuZGxlUmVnZW5lcmF0ZVByZXZpZXdBY3Rpb24oKSB7XG4gIHRyeSB7XG4gICAgc2hvd1Byb2Nlc3NpbmcodHJ1ZSk7XG4gICAgYXdhaXQgX2ZldGNoQW5kRGlzcGxheUxheW91dFByZXZpZXcoKTtcbiAgICBzaG93Q29uZmlybWF0aW9uTWVzc2FnZSgnXHUyNzA1IFByZXZpZXcgcmVnZW5lcmF0ZWQgZnJvbSB0aGUgbGF0ZXN0IGNvbnRlbnQuJyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgYFx1Mjc0QyBDb3VsZCBub3QgcmVnZW5lcmF0ZSB0aGUgcHJldmlldy4gQ2hlY2sgdGhhdCB5b3VyIHNlc3Npb24gaXMgYWN0aXZlIGFuZCB0cnkgYWdhaW4uIElmIHRoZSBwcm9ibGVtIHBlcnNpc3RzLCByZWxvYWQgdGhlIHBhZ2UuYCk7XG4gICAgc2hvd1ByZXZpZXdMb2FkaW5nKGZhbHNlKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBzaG93UHJvY2Vzc2luZyhmYWxzZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBTaG93IHByb2Nlc3Npbmcgc3Bpbm5lciAocmlnaHQtcGFuZSBpbmRpY2F0b3IgZm9yIGxheW91dC1pbnN0cnVjdGlvbiBhcHBseSkuXG4gKi9cbmZ1bmN0aW9uIHNob3dQcm9jZXNzaW5nKHNob3cpIHtcbiAgY29uc3QgaW5kaWNhdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Byb2Nlc3NpbmctaW5kaWNhdG9yJyk7XG4gIGlmIChpbmRpY2F0b3IpIHtcbiAgICBpbmRpY2F0b3Iuc3R5bGUuZGlzcGxheSA9IHNob3cgPyAnYmxvY2snIDogJ25vbmUnO1xuICB9XG59XG5cbi8qKlxuICogU2hvdyBvciBoaWRlIHRoZSBwcmV2aWV3LWFyZWEgbG9hZGluZyBvdmVybGF5LlxuICogQHBhcmFtIHtib29sZWFufSBzaG93XG4gKiBAcGFyYW0ge3N0cmluZ30gW2xvZ1RleHRdIE9wdGlvbmFsIHN0YXR1cyBsaW5lIHNob3duIGJlbG93IHRoZSBzcGlubmVyLlxuICovXG5mdW5jdGlvbiBzaG93UHJldmlld0xvYWRpbmcoc2hvdywgbG9nVGV4dCA9ICcnKSB7XG4gIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJldmlldy1sb2FkaW5nLW92ZXJsYXknKTtcbiAgaWYgKCFvdmVybGF5KSByZXR1cm47XG4gIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9IHNob3cgPyAnZmxleCcgOiAnbm9uZSc7XG4gIGNvbnN0IGxvZ0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ByZXZpZXctbG9hZGluZy1sb2cnKTtcbiAgaWYgKGxvZ0VsKSBsb2dFbC50ZXh0Q29udGVudCA9IGxvZ1RleHQ7XG59XG5cbi8qKlxuICogU2hvdyBjb25maXJtYXRpb24gbWVzc2FnZS5cbiAqL1xuZnVuY3Rpb24gc2hvd0NvbmZpcm1hdGlvbk1lc3NhZ2UobWVzc2FnZSkge1xuICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbmZpcm1hdGlvbi1tZXNzYWdlJyk7XG4gIGlmICghZWxlbWVudCkgcmV0dXJuO1xuXG4gIGVsZW1lbnQudGV4dENvbnRlbnQgPSBtZXNzYWdlO1xuICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuXG4gIC8vIEF1dG8taGlkZSBhZnRlciAzIHNlY29uZHNcbiAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICB9LCAzMDAwKTtcbn1cblxuLyoqXG4gKiBTaG93IGlubGluZSBjbGFyaWZpY2F0aW9uIHBhbmVsIHdoZW4gTExNIG5lZWRzIG1vcmUgaW5mby5cbiAqIFJlcGxhY2VzIHdpbmRvdy5wcm9tcHQoKSB3aXRoIGFuIGFjY2Vzc2libGUgaW5saW5lIGZvcm0uXG4gKi9cbmZ1bmN0aW9uIHNob3dDbGFyaWZpY2F0aW9uRGlhbG9nKHF1ZXN0aW9uLCBvcmlnaW5hbEluc3RydWN0aW9uKSB7XG4gIGNvbnN0IGlucHV0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5zdHJ1Y3Rpb24taW5wdXQnKTtcbiAgY29uc3QgY29udGFpbmVyID0gaW5wdXRFbCA/IGlucHV0RWwuY2xvc2VzdCgnZGl2JykgfHwgaW5wdXRFbC5wYXJlbnROb2RlIDogbnVsbDtcbiAgaWYgKCFjb250YWluZXIpIHJldHVybjtcblxuICBjb25zdCBleGlzdGluZ1BhbmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xheW91dC1jbGFyaWZpY2F0aW9uLXBhbmVsJyk7XG4gIGlmIChleGlzdGluZ1BhbmVsKSBleGlzdGluZ1BhbmVsLnJlbW92ZSgpO1xuXG4gIGNvbnN0IHBhbmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHBhbmVsLmlkID0gJ2xheW91dC1jbGFyaWZpY2F0aW9uLXBhbmVsJztcbiAgcGFuZWwuc2V0QXR0cmlidXRlKCdyb2xlJywgJ2FsZXJ0Jyk7XG4gIHBhbmVsLnN0eWxlLmNzc1RleHQgPSAnYmFja2dyb3VuZDojZmVmOWMzO2JvcmRlcjoxcHggc29saWQgI2ZkZTA0Nztib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjE0cHg7bWFyZ2luLXRvcDoxMHB4Oyc7XG4gIHBhbmVsLmlubmVySFRNTCA9IGBcbiAgICA8cCBzdHlsZT1cIm1hcmdpbjowIDAgOHB4O2ZvbnQtc2l6ZTowLjllbTtjb2xvcjojOTI0MDBlO2ZvbnQtd2VpZ2h0OjYwMDtcIj5cbiAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlx1Mjc1Mzwvc3Bhbj4gQ2xhcmlmaWNhdGlvbiBuZWVkZWRcbiAgICA8L3A+XG4gICAgPHAgc3R5bGU9XCJtYXJnaW46MCAwIDEwcHg7Zm9udC1zaXplOjAuODhlbTtjb2xvcjojNzgzNTBmO1wiPiR7ZXNjYXBlSHRtbChxdWVzdGlvbil9PC9wPlxuICAgIDxsYWJlbCBmb3I9XCJsYXlvdXQtY2xhcmlmaWNhdGlvbi1pbnB1dFwiIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtmb250LXdlaWdodDo2MDA7Y29sb3I6IzM3NDE1MTtkaXNwbGF5OmJsb2NrO21hcmdpbi1ib3R0b206NHB4O1wiPlxuICAgICAgWW91ciBjbGFyaWZpY2F0aW9uOlxuICAgIDwvbGFiZWw+XG4gICAgPHRleHRhcmVhIGlkPVwibGF5b3V0LWNsYXJpZmljYXRpb24taW5wdXRcIiByb3dzPVwiMlwiXG4gICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Ym94LXNpemluZzpib3JkZXItYm94O3BhZGRpbmc6OHB4O2JvcmRlcjoxcHggc29saWQgI2ZkZTA0Nztib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6MC44OGVtO3Jlc2l6ZTp2ZXJ0aWNhbDtcIlxuICAgICAgYXJpYS1sYWJlbD1cIkNsYXJpZmljYXRpb24gZm9yIGxheW91dCBpbnN0cnVjdGlvblwiPiR7ZXNjYXBlSHRtbChvcmlnaW5hbEluc3RydWN0aW9uKX08L3RleHRhcmVhPlxuICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjhweDttYXJnaW4tdG9wOjhweDtcIj5cbiAgICAgIDxidXR0b24gaWQ9XCJsYXlvdXQtY2xhcmlmaWNhdGlvbi1zdWJtaXRcIlxuICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6I2Q5NzcwNjtjb2xvcjojZmZmO2JvcmRlcjpub25lO2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6NnB4IDE0cHg7Zm9udC1zaXplOjAuODVlbTtjdXJzb3I6cG9pbnRlcjtmb250LXdlaWdodDo2MDA7XCI+XG4gICAgICAgIFN1Ym1pdCBjbGFyaWZpY2F0aW9uXG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gaWQ9XCJsYXlvdXQtY2xhcmlmaWNhdGlvbi1jYW5jZWxcIlxuICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6bm9uZTtib3JkZXI6MXB4IHNvbGlkICNkOTc3MDY7Y29sb3I6IzkyNDAwZTtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjZweCAxNHB4O2ZvbnQtc2l6ZTowLjg1ZW07Y3Vyc29yOnBvaW50ZXI7XCI+XG4gICAgICAgIENhbmNlbFxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+YDtcblxuICBjb250YWluZXIuYXBwZW5kQ2hpbGQocGFuZWwpO1xuXG4gIGNvbnN0IGNsYXJJbnB1dCAgPSBwYW5lbC5xdWVyeVNlbGVjdG9yKCcjbGF5b3V0LWNsYXJpZmljYXRpb24taW5wdXQnKTtcbiAgY29uc3Qgc3VibWl0QnRuICA9IHBhbmVsLnF1ZXJ5U2VsZWN0b3IoJyNsYXlvdXQtY2xhcmlmaWNhdGlvbi1zdWJtaXQnKTtcbiAgY29uc3QgY2FuY2VsQnRuICA9IHBhbmVsLnF1ZXJ5U2VsZWN0b3IoJyNsYXlvdXQtY2xhcmlmaWNhdGlvbi1jYW5jZWwnKTtcblxuICBjbGFySW5wdXQuZm9jdXMoKTtcbiAgY2xhcklucHV0LnNldFNlbGVjdGlvblJhbmdlKGNsYXJJbnB1dC52YWx1ZS5sZW5ndGgsIGNsYXJJbnB1dC52YWx1ZS5sZW5ndGgpO1xuXG4gIHN1Ym1pdEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBjb25zdCBjbGFyaWZpZWQgPSBjbGFySW5wdXQudmFsdWUudHJpbSgpO1xuICAgIHBhbmVsLnJlbW92ZSgpO1xuICAgIGlmIChjbGFyaWZpZWQgJiYgY2xhcmlmaWVkICE9PSBvcmlnaW5hbEluc3RydWN0aW9uKSB7XG4gICAgICBzdWJtaXRMYXlvdXRJbnN0cnVjdGlvbihjbGFyaWZpZWQpO1xuICAgIH1cbiAgfSk7XG4gIGNhbmNlbEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHBhbmVsLnJlbW92ZSgpKTtcbiAgY2xhcklucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBlID0+IHtcbiAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicgJiYgIWUuc2hpZnRLZXkpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyBzdWJtaXRCdG4uY2xpY2soKTsgfVxuICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIGNhbmNlbEJ0bi5jbGljaygpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBVbmRvIHRoZSBsYXN0IGxheW91dCBpbnN0cnVjdGlvbiBieSByZXN0b3JpbmcgdGhlIHByZXZpb3VzIHNuYXBzaG90LlxuICogVGhlIGluZGV4IHBhcmFtZXRlciBpcyBhY2NlcHRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBidXQgaXMgaWdub3JlZCBcdTIwMTRcbiAqIHRoZSB1bmRvIHN0YWNrIGFsd2F5cyByZXN0b3JlcyB0aGUgbW9zdCByZWNlbnQgcHJlLWluc3RydWN0aW9uIHN0YXRlLlxuICovXG5mdW5jdGlvbiB1bmRvSW5zdHJ1Y3Rpb24oX2luZGV4KSB7XG4gIGlmIChfbGF5b3V0VW5kb1N0YWNrLmxlbmd0aCA9PT0gMCkge1xuICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsICdcdTIxMzlcdUZFMEYgTm90aGluZyB0byB1bmRvLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHNuYXBzaG90ID0gX2xheW91dFVuZG9TdGFjay5wb3AoKTtcbiAgd2luZG93LmxheW91dEluc3RydWN0aW9ucyA9IHNuYXBzaG90Lmluc3RydWN0aW9ucztcblxuICBkaXNwbGF5TGF5b3V0UHJldmlldyhzbmFwc2hvdC5odG1sKTtcbiAgc2V0UHJldmlld0h0bWwoc25hcHNob3QuaHRtbCk7XG4gIHJlbmRlckluc3RydWN0aW9uSGlzdG9yeSgpO1xuICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnXHUyMUE5XHVGRTBGIExhc3QgbGF5b3V0IGluc3RydWN0aW9uIHVuZG9uZS4nKTtcbn1cblxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsICgpID0+IHtcbiAgY29uc3QgcHJldmlldyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYXlvdXQtcHJldmlldycpO1xuICBpZiAocHJldmlldykge1xuICAgIGZpdExheW91dFByZXZpZXdUb1BhbmUocHJldmlldyk7XG4gIH1cbn0pO1xuXG5hc3luYyBmdW5jdGlvbiBjb25maXJtTGF5b3V0UmV2aWV3KCkge1xuICB0cnkge1xuICAgIHNob3dQcm9jZXNzaW5nKHRydWUpO1xuXG4gICAgY29uc3QgZnJlc2huZXNzID0gc3RhdGVNYW5hZ2VyLmdldExheW91dEZyZXNobmVzcygpO1xuICAgIGlmIChmcmVzaG5lc3MuaXNTdGFsZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQcmV2aWV3IGlzIG91dGRhdGVkLiBSZWdlbmVyYXRlIHRoZSBwcmV2aWV3IGJlZm9yZSBjb25maXJtaW5nIGxheW91dC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb25maXJtUmVzID0gYXdhaXQgYXBpQ2FsbCgnUE9TVCcsICcvYXBpL2N2L2NvbmZpcm0tbGF5b3V0JywgeyBjb250ZW50X3JldmlzaW9uOiBnZXRDdXJyZW50Q29udGVudFJldmlzaW9uKCkgfSk7XG4gICAgaWYgKCFjb25maXJtUmVzPy5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGNvbmZpcm1SZXM/LmVycm9yIHx8ICdGYWlsZWQgdG8gY29uZmlybSBsYXlvdXQuJyk7XG4gICAgfVxuXG4gICAgc3RhdGVNYW5hZ2VyLm1hcmtMYXlvdXRDb25maXJtZWQoe1xuICAgICAgY29uZmlybWVkQXQ6IGNvbmZpcm1SZXMuY29uZmlybWVkX2F0IHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICB9KTtcbiAgICBzaG93Q29uZmlybWF0aW9uTWVzc2FnZSgnXHUyNzA1IExheW91dCBjb25maXJtZWQuIEdlbmVyYXRlIGZpbmFsIGZpbGVzIHdoZW4geW91IGFyZSByZWFkeS4nKTtcbiAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCAnXHUyNzA1IExheW91dCBjb25maXJtZWQuIFJldmlldyB0aGUgcHJldmlldyBpZiBuZWVkZWQsIHRoZW4gZ2VuZXJhdGUgdGhlIGZpbmFsIGZpbGVzLicpO1xuICAgIHJlZnJlc2hMYXlvdXRSZXZpZXdTdGF0ZSgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsIGBcdTI3NEMgQ291bGQgbm90IGNvbmZpcm0gdGhlIGxheW91dC4gVHJ5IGNsaWNraW5nIENvbmZpcm0gYWdhaW4uIElmIHRoZSBwcm9ibGVtIHBlcnNpc3RzLCByZWxvYWQgdGhlIHBhZ2UuYCk7XG4gIH0gZmluYWxseSB7XG4gICAgc2hvd1Byb2Nlc3NpbmcoZmFsc2UpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRmluYWxPdXRwdXRzKCkge1xuICAvKiBkdWNrZmxvdzpcbiAgICogICBpZDogbGF5b3V0X3VpX2dlbmVyYXRlX2ZpbmFsX2xpdmVcbiAgICogICBraW5kOiB1aVxuICAgKiAgIHRpbWVzdGFtcDogJzIwMjYtMDMtMjZUMDA6MjQ6MDBaJ1xuICAgKiAgIHN0YXR1czogbGl2ZVxuICAgKiAgIGhhbmRsZXM6XG4gICAqICAgLSB1aTpsYXlvdXQuZ2VuZXJhdGUtZmluYWxcbiAgICogICBjYWxsczpcbiAgICogICAtIFBPU1QgL2FwaS9jdi9nZW5lcmF0ZS1maW5hbFxuICAgKiAgIC0gUE9TVCAvYXBpL2xheW91dC1jb21wbGV0ZVxuICAgKiAgIHJlYWRzOlxuICAgKiAgIC0gc3RhdGU6Z2VuZXJhdGlvbl9zdGF0ZS5sYXlvdXRDb25maXJtZWRcbiAgICogICAtIHN0YXRlOmdlbmVyYXRpb25fc3RhdGUucGhhc2VcbiAgICogICAtIHN0YXRlOmxheW91dF9mcmVzaG5lc3NcbiAgICogICB3cml0ZXM6XG4gICAqICAgLSB0YWI6Y3ZBcnRpZmFjdHNcbiAgICogICAtIHN0YXRlOmdlbmVyYXRpb25fc3RhdGUuZmluYWxfZ2VuZXJhdGVkX2F0XG4gICAqICAgLSB1aTp3b3JrZmxvdy5yZWZpbmVtZW50XG4gICAqICAgbm90ZXM6IEdlbmVyYXRlcyB0aGUgZmluYWwgaHVtYW4tcmVhZGFibGUgb3V0cHV0cyBmcm9tIHRoZSBjb25maXJtZWQgcHJldmlldyBhbmQgYWR2YW5jZXMgdGhlIFVJIGludG8gZmlsZSByZXZpZXcvZmluYWxpc2Ugd2l0aCB0aGUgbmV3IGFydGlmYWN0IHNldC5cbiAgICovXG4gIHRyeSB7XG4gICAgc2hvd1Byb2Nlc3NpbmcodHJ1ZSk7XG5cbiAgICBjb25zdCBmcmVzaG5lc3MgPSBzdGF0ZU1hbmFnZXIuZ2V0TGF5b3V0RnJlc2huZXNzKCk7XG4gICAgY29uc3QgZ2VuZXJhdGlvblN0YXRlID0gc3RhdGVNYW5hZ2VyLmdldEdlbmVyYXRpb25TdGF0ZSgpO1xuICAgIGlmIChmcmVzaG5lc3MuaXNTdGFsZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQcmV2aWV3IGlzIG91dGRhdGVkLiBSZWdlbmVyYXRlIHRoZSBwcmV2aWV3IGJlZm9yZSBnZW5lcmF0aW5nIGZpbmFsIGZpbGVzLicpO1xuICAgIH1cbiAgICBpZiAoIWdlbmVyYXRpb25TdGF0ZS5sYXlvdXRDb25maXJtZWQgJiYgZ2VuZXJhdGlvblN0YXRlLnBoYXNlICE9PSAnY29uZmlybWVkJykge1xuICAgICAgY29uc3QgaGFzSW5zdHJ1Y3Rpb25zID0gKHdpbmRvdy5sYXlvdXRJbnN0cnVjdGlvbnMgfHwgW10pLmxlbmd0aCA+IDA7XG4gICAgICBpZiAoaGFzSW5zdHJ1Y3Rpb25zKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ29uZmlybSBsYXlvdXQgYmVmb3JlIGdlbmVyYXRpbmcgZmluYWwgZmlsZXMuJyk7XG4gICAgICB9XG4gICAgICAvLyBObyBpbnN0cnVjdGlvbnMgYWRkZWQgXHUyMDE0IGF1dG8tY29uZmlybSBzbyB1c2VycyBhcmVuJ3QgYmxvY2tlZCBieSBhIHJlZHVuZGFudCBjbGljay5cbiAgICAgIGNvbnN0IGNvbmZpcm1SZXMgPSBhd2FpdCBhcGlDYWxsKCdQT1NUJywgJy9hcGkvY3YvY29uZmlybS1sYXlvdXQnLCB7IGNvbnRlbnRfcmV2aXNpb246IGdldEN1cnJlbnRDb250ZW50UmV2aXNpb24oKSB9KTtcbiAgICAgIGlmICghY29uZmlybVJlcz8ub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGNvbmZpcm1SZXM/LmVycm9yIHx8ICdGYWlsZWQgdG8gYXV0by1jb25maXJtIGxheW91dC4nKTtcbiAgICAgIH1cbiAgICAgIHN0YXRlTWFuYWdlci5tYXJrTGF5b3V0Q29uZmlybWVkKHsgY29uZmlybWVkQXQ6IGNvbmZpcm1SZXMuY29uZmlybWVkX2F0IHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBmaW5hbFJlcyA9IGF3YWl0IGFwaUNhbGwoJ1BPU1QnLCAnL2FwaS9jdi9nZW5lcmF0ZS1maW5hbCcsIHt9KTtcbiAgICBpZiAoIWZpbmFsUmVzPy5vayB8fCAhZmluYWxSZXMub3V0cHV0cykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGZpbmFsUmVzPy5lcnJvciB8fCAnRmFpbGVkIHRvIGdlbmVyYXRlIGZpbmFsIENWIG91dHB1dC4nKTtcbiAgICB9XG5cbiAgICB1cGRhdGVDdkFydGlmYWN0cyhmaW5hbFJlcy5vdXRwdXRzKTtcbiAgICBzdGF0ZU1hbmFnZXIubWFya0ZpbmFsR2VuZXJhdGVkKGZpbmFsUmVzLmdlbmVyYXRlZF9hdCB8fCBudWxsLCB7XG4gICAgICBwYWdlQ291bnRFc3RpbWF0ZTogZmluYWxSZXMucGFnZV9jb3VudF9lc3RpbWF0ZSA/PyBudWxsLFxuICAgICAgcGFnZUNvdW50RXhhY3Q6IGZpbmFsUmVzLnBhZ2VfY291bnRfZXhhY3QgPz8gbnVsbCxcbiAgICB9KTtcblxuICAgIHNjaGVkdWxlQXRzUmVmcmVzaCgncG9zdF9nZW5lcmF0aW9uJyk7XG5cbiAgICBzdGF0ZU1hbmFnZXIuc2V0UGhhc2UoJ2ZpbmFsX2dlbmVyYXRpb24nKTtcbiAgICBzd2l0Y2hUYWIoJ2ZpbmFsX2dlbmVyYXRlJyk7XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ1x1MjcwNSBGaW5hbCBmaWxlcyBnZW5lcmF0ZWQgZnJvbSB0aGUgY29uZmlybWVkIGxheW91dC4nKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCBgXHUyNzRDIENvdWxkIG5vdCBnZW5lcmF0ZSBmaW5hbCBmaWxlczogJHtlcnJvci5tZXNzYWdlfSBUcnkgY2xpY2tpbmcgR2VuZXJhdGUgYWdhaW4uIElmIGxheW91dCBjb25maXJtYXRpb24gaXMgbmVlZGVkIGZpcnN0LCBjbGljayBDb25maXJtIExheW91dCwgdGhlbiB0cnkgYWdhaW4uYCk7XG4gIH0gZmluYWxseSB7XG4gICAgc2hvd1Byb2Nlc3NpbmcoZmFsc2UpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZUxheW91dFByaW1hcnlBY3Rpb24oKSB7XG4gIGNvbnN0IGZyZXNobmVzcyA9IHN0YXRlTWFuYWdlci5nZXRMYXlvdXRGcmVzaG5lc3MoKTtcbiAgY29uc3QgZ2VuZXJhdGlvblN0YXRlID0gc3RhdGVNYW5hZ2VyLmdldEdlbmVyYXRpb25TdGF0ZSgpO1xuICBpZiAoZnJlc2huZXNzLmlzU3RhbGUpIHJldHVybiBoYW5kbGVSZWdlbmVyYXRlUHJldmlld0FjdGlvbigpO1xuICBpZiAoZ2VuZXJhdGlvblN0YXRlLmxheW91dENvbmZpcm1lZCB8fCBnZW5lcmF0aW9uU3RhdGUucGhhc2UgPT09ICdjb25maXJtZWQnKSB7XG4gICAgcmV0dXJuIGdlbmVyYXRlRmluYWxPdXRwdXRzKCk7XG4gIH1cbiAgcmV0dXJuIGNvbmZpcm1MYXlvdXRSZXZpZXcoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29tcGxldGVMYXlvdXRSZXZpZXcoKSB7XG4gIHJldHVybiBoYW5kbGVMYXlvdXRQcmltYXJ5QWN0aW9uKCk7XG59XG5cbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihHRU5FUkFUSU9OX1NUQVRFX0VWRU5ULCByZWZyZXNoTGF5b3V0UmV2aWV3U3RhdGUpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgQ29udGVudCBwcm9wb3NhbCBmdW5jdGlvbnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8qKlxuICogU3VibWl0IGEgbmF0dXJhbC1sYW5ndWFnZSBjb250ZW50IGVkaXQgcmVxdWVzdCB0byB0aGUgYmFja2VuZCBhbmQgcmVuZGVyIHByb3Bvc2Fscy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3VibWl0Q29udGVudFByb3Bvc2FsKCkge1xuICBjb25zdCBpbnB1dCAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2luc3RydWN0aW9uLWlucHV0Jyk7XG4gIGNvbnN0IHByb2Nlc3NpbmcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGVudC1wcm9wb3NhbC1wcm9jZXNzaW5nJyk7XG4gIGNvbnN0IHBhbmVsICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGVudC1wcm9wb3NhbHMtcGFuZWwnKTtcblxuICBjb25zdCBpbnN0cnVjdGlvbiA9IGlucHV0Py52YWx1ZS50cmltKCk7XG4gIGlmICghaW5zdHJ1Y3Rpb24pIHtcbiAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnXHUyNkEwXHVGRTBGIFBsZWFzZSBkZXNjcmliZSB0aGUgY29udGVudCBjaGFuZ2UgeW91IHdhbnQgYmVmb3JlIHN1Ym1pdHRpbmcuJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHByb2Nlc3NpbmcpIHByb2Nlc3Npbmcuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgaWYgKHBhbmVsKSAgICAgICBwYW5lbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpQ2FsbCgnUE9TVCcsICcvYXBpL2N2L3Byb3Bvc2UtY29udGVudC1jaGFuZ2UnLCB7IGluc3RydWN0aW9uIH0pO1xuICAgIGlmICghcmVzPy5vaykge1xuICAgICAgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgYFx1Mjc0QyBDb3VsZCBub3QgZ2VuZXJhdGUgY29udGVudCBwcm9wb3NhbHMuIFRyeSByZXBocmFzaW5nIHlvdXIgaW5zdHJ1Y3Rpb24gb3IgY2hlY2sgdGhlIHNlc3Npb24gaXMgc3RpbGwgYWN0aXZlLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwcm9wb3NhbHMgPSByZXMucHJvcG9zYWxzIHx8IFtdO1xuICAgIGlmIChwcm9wb3NhbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnXHUyNkEwXHVGRTBGIE5vIHByb3Bvc2FscyB3ZXJlIGdlbmVyYXRlZC4gVHJ5IHJlcGhyYXNpbmcgeW91ciBpbnN0cnVjdGlvbi4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmVuZGVyQ29udGVudFByb3Bvc2Fscyhwcm9wb3NhbHMpO1xuICAgIGlmIChwYW5lbCkgcGFuZWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsIGBcdTI3NEMgQ291bGQgbm90IHN1Ym1pdCB0aGUgY29udGVudCBwcm9wb3NhbC4gQ2hlY2sgeW91ciBjb25uZWN0aW9uIGFuZCB0cnkgYWdhaW4uYCk7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKHByb2Nlc3NpbmcpIHByb2Nlc3Npbmcuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgfVxufVxuXG4vKipcbiAqIFJlbmRlciBhIGxpc3Qgb2YgY29udGVudCBwcm9wb3NhbHMgYXMgcmV2aWV3YWJsZSBjYXJkcyBpbnNpZGUgI2NvbnRlbnQtcHJvcG9zYWxzLXBhbmVsLlxuICogQHBhcmFtIHtBcnJheTx7aWQsIHR5cGUsIGxvY2F0aW9uLCBvcmlnaW5hbCwgcHJvcG9zZWQsIHJlYXNvbn0+fSBwcm9wb3NhbHNcbiAqL1xuZnVuY3Rpb24gcmVuZGVyQ29udGVudFByb3Bvc2Fscyhwcm9wb3NhbHMpIHtcbiAgY29uc3QgcGFuZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGVudC1wcm9wb3NhbHMtcGFuZWwnKTtcbiAgaWYgKCFwYW5lbCkgcmV0dXJuO1xuXG4gIGNvbnN0IGFwcGx5QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FwcGx5LWNvbnRlbnQtY2hhbmdlcy1idG4nKTtcblxuICBwYW5lbC5pbm5lckhUTUwgPSBgXG4gICAgPHAgY2xhc3M9XCJjb250ZW50LXByb3Bvc2Fscy1oZWFkaW5nXCI+JHtwcm9wb3NhbHMubGVuZ3RofSBwcm9wb3NhbCR7cHJvcG9zYWxzLmxlbmd0aCAhPT0gMSA/ICdzJyA6ICcnfSBcdTIwMTQgYXBwcm92ZSB0aGUgY2hhbmdlcyB5b3Ugd2FudCB0byBhcHBseTo8L3A+XG4gICAgJHtwcm9wb3NhbHMubWFwKChwLCBpKSA9PiBgXG4gICAgICA8ZGl2IGNsYXNzPVwiY29udGVudC1wcm9wb3NhbC1jYXJkXCIgZGF0YS1wcm9wb3NhbC1pZD1cIiR7ZXNjYXBlSHRtbChwLmlkKX1cIiBkYXRhLXByb3Bvc2FsLWluZGV4PVwiJHtpfVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHJvcG9zYWwtbWV0YVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwicHJvcG9zYWwtdHlwZS1iYWRnZVwiPiR7cC50eXBlID09PSAnc3VtbWFyeScgPyAnU3VtbWFyeScgOiAnQnVsbGV0J308L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJwcm9wb3NhbC1sb2NhdGlvblwiPiR7ZXNjYXBlSHRtbChwLmxvY2F0aW9uKX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHJvcG9zYWwtZGlmZlwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9wb3NhbC1vcmlnaW5hbFwiPjxzdHJvbmc+QmVmb3JlOjwvc3Ryb25nPiAke2VzY2FwZUh0bWwocC5vcmlnaW5hbCl9PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInByb3Bvc2FsLXByb3Bvc2VkXCI+PHN0cm9uZz5BZnRlcjo8L3N0cm9uZz4gJHtlc2NhcGVIdG1sKHAucHJvcG9zZWQpfTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgJHtwLnJlYXNvbiA/IGA8ZGl2IGNsYXNzPVwicHJvcG9zYWwtcmVhc29uXCI+PGVtPiR7ZXNjYXBlSHRtbChwLnJlYXNvbil9PC9lbT48L2Rpdj5gIDogJyd9XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwcm9wb3NhbC1hY3Rpb25zXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwicHJvcG9zYWwtYXBwcm92ZS1sYWJlbFwiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwicHJvcG9zYWwtYXBwcm92ZS1jaGVja2JveFwiIGNoZWNrZWQ+XG4gICAgICAgICAgICBBcHByb3ZlIHRoaXMgY2hhbmdlXG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5gKS5qb2luKCcnKX1cbiAgYDtcblxuICAvLyBTdG9yZSBwcm9wb3NhbHMgZm9yIGxhdGVyIHJldHJpZXZhbFxuICBwYW5lbC5kYXRhc2V0LnByb3Bvc2FscyA9IEpTT04uc3RyaW5naWZ5KHByb3Bvc2Fscyk7XG5cbiAgaWYgKGFwcGx5QnRuKSBhcHBseUJ0bi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbn1cblxuLyoqXG4gKiBDb2xsZWN0IGFwcHJvdmVkIHByb3Bvc2FscyBhbmQgUE9TVCB0aGVtIHRvIC9hcGkvY3YvYXBwbHktY29udGVudC1jaGFuZ2VzLlxuICogVXBkYXRlcyBkaXJ0eS1waGFzZSBzdGF0ZSBhbmQgc2hvd3MgdGhlIHJldHVybiBjYWxsb3V0LlxuICovXG5hc3luYyBmdW5jdGlvbiBhcHBseUFjY2VwdGVkUHJvcG9zYWxzKCkge1xuICBjb25zdCBwYW5lbCAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb250ZW50LXByb3Bvc2Fscy1wYW5lbCcpO1xuICBjb25zdCBhcHBseUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHBseS1jb250ZW50LWNoYW5nZXMtYnRuJyk7XG5cbiAgY29uc3QgYWxsUHJvcG9zYWxzID0gSlNPTi5wYXJzZShwYW5lbD8uZGF0YXNldC5wcm9wb3NhbHMgfHwgJ1tdJyk7XG4gIGNvbnN0IGNoZWNrYm94ZXMgICA9IHBhbmVsPy5xdWVyeVNlbGVjdG9yQWxsKCcucHJvcG9zYWwtYXBwcm92ZS1jaGVja2JveCcpIHx8IFtdO1xuXG4gIGNvbnN0IGFjY2VwdGVkID0gYWxsUHJvcG9zYWxzLmZpbHRlcigoXywgaSkgPT4gY2hlY2tib3hlc1tpXT8uY2hlY2tlZCk7XG4gIGlmIChhY2NlcHRlZC5sZW5ndGggPT09IDApIHtcbiAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnXHUyNkEwXHVGRTBGIE5vIHByb3Bvc2FscyBhcHByb3ZlZC4gVGljayBhdCBsZWFzdCBvbmUgY2hhbmdlIHRvIGFwcGx5LicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChhcHBseUJ0bikgYXBwbHlCdG4uZGlzYWJsZWQgPSB0cnVlO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpQ2FsbCgnUE9TVCcsICcvYXBpL2N2L2FwcGx5LWNvbnRlbnQtY2hhbmdlcycsIHsgYWNjZXB0ZWQgfSk7XG4gICAgaWYgKCFyZXM/Lm9rKSB7XG4gICAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCBgXHUyNzRDIEZhaWxlZCB0byBhcHBseSBjb250ZW50IGNoYW5nZXM6ICR7cmVzPy5lcnJvciB8fCAnVW5rbm93biBlcnJvcid9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3RhdGVNYW5hZ2VyLnNldERpcnR5UGhhc2VzKFxuICAgICAgcmVzLmRpcnR5X3BoYXNlcyB8fCBbJ2dlbmVyYXRlJywgJ2xheW91dCddLFxuICAgICAgcmVzLmVhcmxpZXN0X2RpcnR5X3N0ZXAgfHwgJ2dlbmVyYXRlJyxcbiAgICApO1xuXG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgYFx1MjcwNSAke3Jlcy5hcHBsaWVkX2NvdW50fSBjb250ZW50IGNoYW5nZSR7cmVzLmFwcGxpZWRfY291bnQgIT09IDEgPyAncycgOiAnJ30gc3RhZ2VkLiBSZXR1cm4gdG8gR2VuZXJhdGUgQ1YgdG8gYXBwbHkgdGhlbS5gKTtcblxuICAgIC8vIENsZWFyIHRoZSBwcm9wb3NhbCBwYW5lbFxuICAgIGlmIChwYW5lbCkgeyBwYW5lbC5pbm5lckhUTUwgPSAnJzsgcGFuZWwuc3R5bGUuZGlzcGxheSA9ICdub25lJzsgcGFuZWwuZGF0YXNldC5wcm9wb3NhbHMgPSAnW10nOyB9XG4gICAgaWYgKGFwcGx5QnRuKSBhcHBseUJ0bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgcmVmcmVzaExheW91dFJldmlld1N0YXRlKCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsIGBcdTI3NEMgQ291bGQgbm90IGFwcGx5IGNvbnRlbnQgY2hhbmdlcy4gQ2hlY2sgeW91ciBjb25uZWN0aW9uIGFuZCB0cnkgYWdhaW4uYCk7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKGFwcGx5QnRuKSBhcHBseUJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogU2hvdyBvciBoaWRlIHRoZSBkaXJ0eS1waGFzZXMgY2FsbG91dCBiYXNlZCBvbiBzdGF0ZU1hbmFnZXIuZ2V0RGlydHlQaGFzZXMoKS5cbiAqL1xuZnVuY3Rpb24gcmVuZGVyRGlydHlQaGFzZXNDYWxsb3V0KCkge1xuICBjb25zdCBjYWxsb3V0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RpcnR5LXBoYXNlcy1jYWxsb3V0Jyk7XG4gIGlmICghY2FsbG91dCkgcmV0dXJuO1xuICBjb25zdCBkaXJ0eSA9IHN0YXRlTWFuYWdlci5nZXREaXJ0eVBoYXNlcygpO1xuICBjYWxsb3V0LnN0eWxlLmRpc3BsYXkgPSBkaXJ0eS5sZW5ndGggPiAwID8gJ2Jsb2NrJyA6ICdub25lJztcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEVTIG1vZHVsZSBleHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuZXhwb3J0IHtcbiAgaW5pdGlhdGVMYXlvdXRJbnN0cnVjdGlvbnMsXG4gIGNvbXBsZXRlTGF5b3V0UmV2aWV3LFxuICBjb25maXJtTGF5b3V0UmV2aWV3LFxuICBnZW5lcmF0ZUZpbmFsT3V0cHV0cyxcbiAgaGFuZGxlTGF5b3V0UHJpbWFyeUFjdGlvbixcbiAgbG9hZExheW91dEluc3RydWN0aW9uSGlzdG9yeSxcbiAgcmVuZGVyUHJldmlld091dHB1dFN0YXR1cyxcbiAgcmVuZGVyTGF5b3V0UHJldmlld1N0YXR1cyxcbiAgZGlzcGxheUxheW91dFByZXZpZXcsXG4gIHN1Ym1pdExheW91dEluc3RydWN0aW9uLFxuICBzdWJtaXRTbWFydEluc3RydWN0aW9uLFxuICAvLyBoZWxwZXJzIGV4cG9ydGVkIGZvciB1bml0IHRlc3RzXG4gIHNob3dQcm9jZXNzaW5nLFxuICBzaG93Q29uZmlybWF0aW9uTWVzc2FnZSxcbiAgcmVuZGVySW5zdHJ1Y3Rpb25IaXN0b3J5LFxuICBhZGRUb0luc3RydWN0aW9uSGlzdG9yeSxcbiAgdW5kb0luc3RydWN0aW9uLFxuICAvLyBjb250ZW50IHByb3Bvc2FsXG4gIHN1Ym1pdENvbnRlbnRQcm9wb3NhbCxcbiAgcmVuZGVyQ29udGVudFByb3Bvc2FscyxcbiAgYXBwbHlBY2NlcHRlZFByb3Bvc2FscyxcbiAgcmVuZGVyRGlydHlQaGFzZXNDYWxsb3V0LFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL2F0cy1yZWZpbmVtZW50LmpzXG4gKiBBVFMgc2NvcmUgYmFkZ2UgZGlzcGxheSBhbmQgZGVib3VuY2VkIHJlZnJlc2ggc2NoZWR1bGluZy5cbiAqXG4gKiBERVBFTkRFTkNJRVM6XG4gKiAgIC0gZ2xvYmFsVGhpcy5zdGF0ZU1hbmFnZXIgZnJvbSBzdGF0ZS1tYW5hZ2VyLmpzIChhY2Nlc3NlZCB2aWEgZ2xvYmFsVGhpcyB0aHJvdWdob3V0KVxuICovXG5cbmZ1bmN0aW9uIF9kaXNwYXRjaEF0c1Njb3JlVXBkYXRlZCgpIHtcbiAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2F0cy1zY29yZS11cGRhdGVkJykpO1xufVxuXG5mdW5jdGlvbiBfc2FmZVRleHQodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZS50cmltKCkgOiAnJztcbn1cblxuZnVuY3Rpb24gX2NvZXJjZU9iamVjdCh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyA/IHZhbHVlIDoge307XG59XG5cbmZ1bmN0aW9uIF9mb3JtYXREYXRlTGFiZWwodmFsdWUpIHtcbiAgY29uc3QgdGV4dCA9IF9zYWZlVGV4dCh2YWx1ZSk7XG4gIGlmICghdGV4dCkgcmV0dXJuICcnO1xuXG4gIGlmICgvXlxcZHs0fS1cXGR7Mn0tXFxkezJ9JC8udGVzdCh0ZXh0KSkge1xuICAgIGNvbnN0IFt5ZWFyLCBtb250aCwgZGF5XSA9IHRleHQuc3BsaXQoJy0nKTtcbiAgICByZXR1cm4gYCR7bW9udGh9LyR7ZGF5fS8ke3llYXJ9YDtcbiAgfVxuXG4gIGNvbnN0IHBhcnNlZCA9IG5ldyBEYXRlKHRleHQpO1xuICBpZiAoIU51bWJlci5pc05hTihwYXJzZWQuZ2V0VGltZSgpKSkge1xuICAgIHJldHVybiBwYXJzZWQudG9JU09TdHJpbmcoKS5zbGljZSgwLCAxMCk7XG4gIH1cbiAgcmV0dXJuIHRleHQ7XG59XG5cbmZ1bmN0aW9uIF9nZXRQYWdlTGVuZ3RoTGFiZWwoKSB7XG4gIGNvbnN0IGdlbmVyYXRpb25TdGF0ZSA9IF9jb2VyY2VPYmplY3QoZ2xvYmFsVGhpcy5zdGF0ZU1hbmFnZXI/LmdldEdlbmVyYXRpb25TdGF0ZT8uKCkpO1xuICBjb25zdCBleGFjdCA9IE51bWJlcihnZW5lcmF0aW9uU3RhdGUucGFnZUNvdW50RXhhY3QpO1xuICBpZiAoTnVtYmVyLmlzRmluaXRlKGV4YWN0KSAmJiBleGFjdCA+IDApIHtcbiAgICByZXR1cm4gYExlbmd0aCAke2V4YWN0fSBwYWdlJHtleGFjdCA9PT0gMSA/ICcnIDogJ3MnfWA7XG4gIH1cblxuICBjb25zdCBlc3RpbWF0ZSA9IE51bWJlcihnZW5lcmF0aW9uU3RhdGUucGFnZUNvdW50RXN0aW1hdGUpO1xuICBpZiAoTnVtYmVyLmlzRmluaXRlKGVzdGltYXRlKSAmJiBlc3RpbWF0ZSA+IDApIHtcbiAgICByZXR1cm4gYExlbmd0aCAke2VzdGltYXRlLnRvRml4ZWQoMSl9IHBhZ2VzIGVzdGA7XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIF9nZXRKb2JTdW1tYXJ5TGFiZWwoKSB7XG4gIGNvbnN0IGludGFrZSA9IF9jb2VyY2VPYmplY3Qod2luZG93Ll9zdGF0dXNJbnRha2UpO1xuICBjb25zdCBhbmFseXNpcyA9IF9jb2VyY2VPYmplY3QoZ2xvYmFsVGhpcy5zdGF0ZU1hbmFnZXI/LmdldFRhYkRhdGE/LignYW5hbHlzaXMnKSk7XG4gIGNvbnN0IHBvc2l0aW9uRmFsbGJhY2sgPSBfc2FmZVRleHQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Bvc2l0aW9uLXRpdGxlJyk/LnRleHRDb250ZW50IHx8ICcnKTtcblxuICBjb25zdCByb2xlID0gX3NhZmVUZXh0KFxuICAgIGludGFrZS5yb2xlXG4gICAgICB8fCBhbmFseXNpcy5qb2JfdGl0bGVcbiAgICAgIHx8IGFuYWx5c2lzLnRpdGxlXG4gICAgICB8fCBhbmFseXNpcy5wb3NpdGlvbl9uYW1lXG4gICAgICB8fCAnJ1xuICApO1xuICBjb25zdCBjb21wYW55ID0gX3NhZmVUZXh0KGludGFrZS5jb21wYW55IHx8IGFuYWx5c2lzLmNvbXBhbnlfbmFtZSB8fCBhbmFseXNpcy5jb21wYW55IHx8ICcnKTtcbiAgY29uc3QgZGF0ZUFwcGxpZWQgPSBfZm9ybWF0RGF0ZUxhYmVsKFxuICAgIGludGFrZS5kYXRlX2FwcGxpZWRcbiAgICAgIHx8IGFuYWx5c2lzLmRhdGVfYXBwbGllZFxuICAgICAgfHwgYW5hbHlzaXMuYXBwbGljYXRpb25fZGF0ZVxuICAgICAgfHwgJydcbiAgKTtcblxuICBjb25zdCBwcmltYXJ5ID0gcm9sZSAmJiBjb21wYW55XG4gICAgPyBgJHtyb2xlfSBAICR7Y29tcGFueX1gXG4gICAgOiAocm9sZSB8fCBjb21wYW55IHx8IHBvc2l0aW9uRmFsbGJhY2spO1xuICBpZiAoIXByaW1hcnkpIHJldHVybiAnJztcbiAgaWYgKCFkYXRlQXBwbGllZCkgcmV0dXJuIHByaW1hcnk7XG4gIHJldHVybiBgJHtwcmltYXJ5fSAoJHtkYXRlQXBwbGllZH0pYDtcbn1cblxuZnVuY3Rpb24gX2tleXdvcmRDb3VudChrZXl3b3JkcywgdHlwZSwgc3RhdHVzZXMgPSBbJ21hdGNoZWQnLCAncGFydGlhbCddKSB7XG4gIHJldHVybiBrZXl3b3Jkcy5maWx0ZXIoa2V5d29yZCA9PiBrZXl3b3JkLnR5cGUgPT09IHR5cGUgJiYgc3RhdHVzZXMuaW5jbHVkZXMoa2V5d29yZC5zdGF0dXMpKS5sZW5ndGg7XG59XG5cbmZ1bmN0aW9uIF9idWlsZFN1bW1hcnlEZXRhaWwoc2NvcmUsIGtleXdvcmRzKSB7XG4gIGNvbnN0IG1pc3NpbmdIYXJkID0ga2V5d29yZHNcbiAgICAuZmlsdGVyKGtleXdvcmQgPT4ga2V5d29yZC50eXBlID09PSAnaGFyZCcgJiYga2V5d29yZC5zdGF0dXMgPT09ICdtaXNzaW5nJylcbiAgICAubWFwKGtleXdvcmQgPT4ga2V5d29yZC5rZXl3b3JkKVxuICAgIC5maWx0ZXIoQm9vbGVhbik7XG5cbiAgaWYgKG1pc3NpbmdIYXJkLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBwcmV2aWV3ID0gbWlzc2luZ0hhcmQuc2xpY2UoMCwgMikuam9pbignLCAnKTtcbiAgICBjb25zdCBzdWZmaXggPSBtaXNzaW5nSGFyZC5sZW5ndGggPiAyID8gYCArJHttaXNzaW5nSGFyZC5sZW5ndGggLSAyfSBtb3JlYCA6ICcnO1xuICAgIHJldHVybiBgTWlzc2luZyBoYXJkOiAke3ByZXZpZXd9JHtzdWZmaXh9YDtcbiAgfVxuXG4gIGNvbnN0IGV4YWN0ID0ga2V5d29yZHMuZmlsdGVyKGtleXdvcmQgPT4ga2V5d29yZC5tYXRjaF90eXBlID09PSAnZXhhY3QnIHx8IGtleXdvcmQubWF0Y2hfdHlwZSA9PT0gJ3N5bm9ueW0nKS5sZW5ndGg7XG4gIGNvbnN0IHBhcnRpYWwgPSBrZXl3b3Jkcy5maWx0ZXIoa2V5d29yZCA9PiBrZXl3b3JkLm1hdGNoX3R5cGUgPT09ICdwYXJ0aWFsJykubGVuZ3RoO1xuICBjb25zdCB0b3BTZWN0aW9ucyA9IE9iamVjdC5lbnRyaWVzKHNjb3JlLnNlY3Rpb25fc2NvcmVzIHx8IHt9KVxuICAgIC5maWx0ZXIoKFssIHZhbHVlXSkgPT4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiB2YWx1ZSA+IDApXG4gICAgLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiByaWdodFsxXSAtIGxlZnRbMV0pXG4gICAgLnNsaWNlKDAsIDIpXG4gICAgLm1hcCgoW3NlY3Rpb24sIHZhbHVlXSkgPT4gYCR7c2VjdGlvbn0gJHtNYXRoLnJvdW5kKHZhbHVlKX0lYCk7XG5cbiAgaWYgKHRvcFNlY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gYFRvcCBzZWN0aW9uczogJHt0b3BTZWN0aW9ucy5qb2luKCcgXHUyMDIyICcpfWA7XG4gIH1cblxuICBpZiAoZXhhY3QgPiAwIHx8IHBhcnRpYWwgPiAwKSB7XG4gICAgcmV0dXJuIGBNYXRjaCBxdWFsaXR5OiAke2V4YWN0fSBleGFjdCBcdTIwMjIgJHtwYXJ0aWFsfSBwYXJ0aWFsYDtcbiAgfVxuXG4gIHJldHVybiBgQmFzaXM6ICR7c2NvcmUuYmFzaXMgfHwgJ3Jldmlldyd9YDtcbn1cblxuZnVuY3Rpb24gZm9ybWF0QXRzU2NvcmVTdW1tYXJ5KHNjb3JlKSB7XG4gIGNvbnN0IGtleXdvcmRzID0gQXJyYXkuaXNBcnJheShzY29yZT8ua2V5d29yZF9zdGF0dXMpID8gc2NvcmUua2V5d29yZF9zdGF0dXMgOiBbXTtcbiAgY29uc3Qgb3ZlcmFsbCA9IHR5cGVvZiBzY29yZT8ub3ZlcmFsbCA9PT0gJ251bWJlcicgPyBNYXRoLnJvdW5kKHNjb3JlLm92ZXJhbGwpIDogbnVsbDtcblxuICBpZiAob3ZlcmFsbCA9PT0gbnVsbCkge1xuICAgIHJldHVybiB7IG92ZXJhbGw6IG51bGwsIGxpbmU6ICcnLCBkZXRhaWw6ICcnLCBrZXl3b3JkcyB9O1xuICB9XG5cbiAgaWYgKGtleXdvcmRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB7XG4gICAgICBvdmVyYWxsLFxuICAgICAgbGluZTogYE92ZXJhbGwgJHtvdmVyYWxsfSVgLFxuICAgICAgZGV0YWlsOiBgQmFzaXM6ICR7c2NvcmUuYmFzaXMgfHwgJ3Jldmlldyd9YCxcbiAgICAgIGtleXdvcmRzLFxuICAgIH07XG4gIH1cblxuICBjb25zdCBoYXJkVG90YWwgPSBrZXl3b3Jkcy5maWx0ZXIoa2V5d29yZCA9PiBrZXl3b3JkLnR5cGUgPT09ICdoYXJkJykubGVuZ3RoO1xuICBjb25zdCBzb2Z0VG90YWwgPSBrZXl3b3Jkcy5maWx0ZXIoa2V5d29yZCA9PiBrZXl3b3JkLnR5cGUgPT09ICdzb2Z0JykubGVuZ3RoO1xuICBjb25zdCBib251c1RvdGFsID0ga2V5d29yZHMuZmlsdGVyKGtleXdvcmQgPT4ga2V5d29yZC50eXBlID09PSAnYm9udXMnKS5sZW5ndGg7XG4gIGNvbnN0IHN1bW1hcnlQYXJ0cyA9IFtdO1xuXG4gIGlmIChoYXJkVG90YWwgPiAwKSB7XG4gICAgc3VtbWFyeVBhcnRzLnB1c2goYEhhcmQgJHtfa2V5d29yZENvdW50KGtleXdvcmRzLCAnaGFyZCcpfS8ke2hhcmRUb3RhbH1gKTtcbiAgfVxuICBpZiAoc29mdFRvdGFsID4gMCkge1xuICAgIHN1bW1hcnlQYXJ0cy5wdXNoKGBTb2Z0ICR7X2tleXdvcmRDb3VudChrZXl3b3JkcywgJ3NvZnQnKX0vJHtzb2Z0VG90YWx9YCk7XG4gIH1cbiAgaWYgKGJvbnVzVG90YWwgPiAwKSB7XG4gICAgc3VtbWFyeVBhcnRzLnB1c2goYEJvbnVzICR7X2tleXdvcmRDb3VudChrZXl3b3JkcywgJ2JvbnVzJyl9LyR7Ym9udXNUb3RhbH1gKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgb3ZlcmFsbCxcbiAgICBsaW5lOiBzdW1tYXJ5UGFydHMuam9pbignIFx1MjAyMiAnKSB8fCBgT3ZlcmFsbCAke292ZXJhbGx9JWAsXG4gICAgZGV0YWlsOiBfYnVpbGRTdW1tYXJ5RGV0YWlsKHNjb3JlLCBrZXl3b3JkcyksXG4gICAga2V5d29yZHMsXG4gIH07XG59XG5cbmZ1bmN0aW9uIF91cGRhdGVBdHNTdW1tYXJ5KHNjb3JlKSB7XG4gIGNvbnN0IGhlYWRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdHMtc2NvcmUtaGVhZGVyJyk7XG4gIGNvbnN0IHN1bW1hcnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXRzLXNjb3JlLXN1bW1hcnknKTtcbiAgY29uc3Qgc3VtbWFyeUxpbmUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXRzLXNjb3JlLXN1bW1hcnktbGluZScpO1xuICBjb25zdCBzdW1tYXJ5RGV0YWlsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F0cy1zY29yZS1zdW1tYXJ5LWRldGFpbCcpO1xuXG4gIGlmICghaGVhZGVyIHx8ICFzdW1tYXJ5IHx8ICFzdW1tYXJ5TGluZSB8fCAhc3VtbWFyeURldGFpbCkgcmV0dXJuO1xuXG4gIGNvbnN0IGtleXdvcmRzID0gQXJyYXkuaXNBcnJheShzY29yZT8ua2V5d29yZF9zdGF0dXMpID8gc2NvcmUua2V5d29yZF9zdGF0dXMgOiBbXTtcbiAgY29uc3QgaGFzU2NvcmUgPSBzY29yZSAmJiB0eXBlb2Ygc2NvcmUub3ZlcmFsbCA9PT0gJ251bWJlcic7XG4gIGNvbnN0IHBhZ2VMZW5ndGhMYWJlbCA9IF9nZXRQYWdlTGVuZ3RoTGFiZWwoKTtcbiAgY29uc3Qgam9iU3VtbWFyeUxhYmVsID0gX2dldEpvYlN1bW1hcnlMYWJlbCgpO1xuXG4gIGlmICghaGFzU2NvcmUpIHtcbiAgICBoZWFkZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBzdW1tYXJ5LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgc3VtbWFyeUxpbmUudGV4dENvbnRlbnQgPSAnJztcbiAgICBzdW1tYXJ5RGV0YWlsLnRleHRDb250ZW50ID0gJyc7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaGVhZGVyLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG5cbiAgY29uc3Qgc3VtbWFyeUNvbnRlbnQgPSBmb3JtYXRBdHNTY29yZVN1bW1hcnkoc2NvcmUpO1xuICBjb25zdCBsaW5lUGFydHMgPSBbc3VtbWFyeUNvbnRlbnQubGluZSwgcGFnZUxlbmd0aExhYmVsXS5maWx0ZXIoQm9vbGVhbik7XG4gIGNvbnN0IGRldGFpbFBhcnRzID0gW2pvYlN1bW1hcnlMYWJlbCwgc3VtbWFyeUNvbnRlbnQuZGV0YWlsXS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgaWYgKGxpbmVQYXJ0cy5sZW5ndGggPT09IDAgJiYgZGV0YWlsUGFydHMubGVuZ3RoID09PSAwICYmIGtleXdvcmRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHN1bW1hcnkuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBzdW1tYXJ5TGluZS50ZXh0Q29udGVudCA9ICcnO1xuICAgIHN1bW1hcnlEZXRhaWwudGV4dENvbnRlbnQgPSAnJztcbiAgICByZXR1cm47XG4gIH1cblxuICBzdW1tYXJ5TGluZS50ZXh0Q29udGVudCA9IGxpbmVQYXJ0cy5qb2luKCcgXHUyMDIyICcpO1xuICBzdW1tYXJ5RGV0YWlsLnRleHRDb250ZW50ID0gZGV0YWlsUGFydHMuam9pbignIFx1MjAyMiAnKTtcbiAgc3VtbWFyeS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVBdHNCYWRnZShzY29yZSkge1xuICBfdXBkYXRlQXRzU3VtbWFyeShzY29yZSk7XG5cbiAgY29uc3QgYmFkZ2UgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdHMtc2NvcmUtYmFkZ2UnKTtcbiAgY29uc3QgdmFsdWVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdHMtc2NvcmUtdmFsdWUnKTtcbiAgaWYgKCFiYWRnZSB8fCAhdmFsdWVFbCkge1xuICAgIF9kaXNwYXRjaEF0c1Njb3JlVXBkYXRlZCgpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICghc2NvcmUgfHwgdHlwZW9mIHNjb3JlLm92ZXJhbGwgIT09ICdudW1iZXInKSB7XG4gICAgYmFkZ2Uuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBfZGlzcGF0Y2hBdHNTY29yZVVwZGF0ZWQoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBvdmVyYWxsID0gTWF0aC5yb3VuZChzY29yZS5vdmVyYWxsKTtcbiAgdmFsdWVFbC50ZXh0Q29udGVudCA9IGAke292ZXJhbGx9JWA7XG4gIGJhZGdlLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG5cbiAgYmFkZ2UuY2xhc3NMaXN0LnJlbW92ZSgnc2NvcmUtaGlnaCcsICdzY29yZS1tZWRpdW0nLCAnc2NvcmUtbG93Jyk7XG4gIGlmIChvdmVyYWxsID49IDc1KSB7XG4gICAgYmFkZ2UuY2xhc3NMaXN0LmFkZCgnc2NvcmUtaGlnaCcpO1xuICB9IGVsc2UgaWYgKG92ZXJhbGwgPj0gNTApIHtcbiAgICBiYWRnZS5jbGFzc0xpc3QuYWRkKCdzY29yZS1tZWRpdW0nKTtcbiAgfSBlbHNlIHtcbiAgICBiYWRnZS5jbGFzc0xpc3QuYWRkKCdzY29yZS1sb3cnKTtcbiAgfVxuXG4gIGJhZGdlLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIGBBVFMgbWF0Y2ggc2NvcmU6ICR7b3ZlcmFsbH0lICgke3Njb3JlLmJhc2lzIHx8ICdyZXZpZXcnfSlgKTtcbiAgX2Rpc3BhdGNoQXRzU2NvcmVVcGRhdGVkKCk7XG59XG5cbi8qKlxuICogRmV0Y2ggQVRTIHNjb3JlIGZyb20gYmFja2VuZCBhbmQgdXBkYXRlIGJhZGdlICsgc3RhdGVNYW5hZ2VyLlxuICogU2FmZSB0byBjYWxsIGF0IGFueSBwaGFzZSBcdTIwMTQgZG9lcyBub3RoaW5nIHdoZW4gbm8gc2Vzc2lvbi9hbmFseXNpcyBhdmFpbGFibGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFtiYXNpc10gIFwiYW5hbHlzaXNcIiB8IFwicmV2aWV3X2NoZWNrcG9pbnRcIiB8IFwicG9zdF9nZW5lcmF0aW9uXCJcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVmcmVzaEF0c1Njb3JlKGJhc2lzID0gJ3Jldmlld19jaGVja3BvaW50Jykge1xuICBjb25zdCBzZXNzaW9uSWQgPSBnbG9iYWxUaGlzLnN0YXRlTWFuYWdlcj8uZ2V0U2Vzc2lvbklkPy4oKTtcbiAgaWYgKCFzZXNzaW9uSWQpIHJldHVybjtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9jdi9hdHMtc2NvcmUnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBzZXNzaW9uX2lkOiBzZXNzaW9uSWQsIGJhc2lzIH0pLFxuICAgIH0pO1xuICAgIGlmICghcmVzLm9rKSByZXR1cm47XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEub2sgJiYgZGF0YS5hdHNfc2NvcmUpIHtcbiAgICAgIGdsb2JhbFRoaXMuc3RhdGVNYW5hZ2VyPy5zZXRBdHNTY29yZT8uKGRhdGEuYXRzX3Njb3JlKTtcbiAgICAgIHVwZGF0ZUF0c0JhZGdlKGRhdGEuYXRzX3Njb3JlKTtcbiAgICB9XG4gIH0gY2F0Y2ggKF9lKSB7XG4gICAgLy8gTm9uLWZhdGFsIFx1MjAxNCBiYWRnZSBzdGF5cyBoaWRkZW4gb3Igc2hvd3Mgc3RhbGUgdmFsdWVcbiAgfVxufVxuXG4vKiogRGVib3VuY2VkOiBkZWZlcnMgcmVmcmVzaCA2MDBtcyBhZnRlciB0aGUgbGFzdCBjYWxsLiAqL1xubGV0IF9hdHNSZWZyZXNoVGltZXIgPSBudWxsO1xuZnVuY3Rpb24gc2NoZWR1bGVBdHNSZWZyZXNoKGJhc2lzID0gJ3Jldmlld19jaGVja3BvaW50Jykge1xuICBjbGVhclRpbWVvdXQoX2F0c1JlZnJlc2hUaW1lcik7XG4gIF9hdHNSZWZyZXNoVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHJlZnJlc2hBdHNTY29yZShiYXNpcyksIDYwMCk7XG59XG5cbmZ1bmN0aW9uIF9yZWZyZXNoU3VtbWFyeUZyb21TdGF0ZSgpIHtcbiAgY29uc3Qgc2NvcmUgPSBnbG9iYWxUaGlzLnN0YXRlTWFuYWdlcj8uZ2V0QXRzU2NvcmU/LigpO1xuICBpZiAoc2NvcmUgJiYgdHlwZW9mIHNjb3JlLm92ZXJhbGwgPT09ICdudW1iZXInKSB7XG4gICAgX3VwZGF0ZUF0c1N1bW1hcnkoc2NvcmUpO1xuICB9XG59XG5cbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignY3ZidWlsZGVyOmdlbmVyYXRpb24tc3RhdGUtY2hhbmdlZCcsICgpID0+IHtcbiAgICBfcmVmcmVzaFN1bW1hcnlGcm9tU3RhdGUoKTtcbiAgfSk7XG59XG5cbmlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gIGNvbnN0IHBvc2l0aW9uVGl0bGVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwb3NpdGlvbi10aXRsZScpO1xuICBpZiAocG9zaXRpb25UaXRsZUVsICYmIHR5cGVvZiBNdXRhdGlvbk9ic2VydmVyICE9PSAndW5kZWZpbmVkJykge1xuICAgIGNvbnN0IHRpdGxlT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7XG4gICAgICBfcmVmcmVzaFN1bW1hcnlGcm9tU3RhdGUoKTtcbiAgICB9KTtcbiAgICB0aXRsZU9ic2VydmVyLm9ic2VydmUocG9zaXRpb25UaXRsZUVsLCB7XG4gICAgICBjaGlsZExpc3Q6IHRydWUsXG4gICAgICBjaGFyYWN0ZXJEYXRhOiB0cnVlLFxuICAgICAgc3VidHJlZTogdHJ1ZSxcbiAgICB9KTtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgRVMgbW9kdWxlIGV4cG9ydHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5leHBvcnQgeyB1cGRhdGVBdHNCYWRnZSwgcmVmcmVzaEF0c1Njb3JlLCBzY2hlZHVsZUF0c1JlZnJlc2gsIGZvcm1hdEF0c1Njb3JlU3VtbWFyeSB9O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvbWVzc2FnZS1xdWV1ZS5qc1xuICogQ29udmVyc2F0aW9uIG1lc3NhZ2UgYXBwZW5kaW5nLCBsb2FkaW5nIG1lc3NhZ2VzLCBhbmQgdGhlIHByZS1ET00gYnVmZmVyXG4gKiBxdWV1ZSB0aGF0IGhvbGRzIG1lc3NhZ2VzIGVtaXR0ZWQgYmVmb3JlICNjb252ZXJzYXRpb24gZXhpc3RzLlxuICpcbiAqIERFUEVOREVOQ0lFUzpcbiAqICAgLSBjbGVhbkpzb25SZXNwb25zZSwgZXNjYXBlSHRtbCBmcm9tIHV0aWxzLmpzXG4gKiAgIC0gc2VuZE1lc3NhZ2UgZnJvbSBtZXNzYWdlLWRpc3BhdGNoLmpzIChvbiBnbG9iYWxUaGlzLCBmb3IgaW5saW5lIGJ1dHRvbnMpXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgY2xlYW5Kc29uUmVzcG9uc2UsIGVzY2FwZUh0bWwgfSBmcm9tICcuL3V0aWxzLmpzJztcbmNvbnN0IGxvZyA9IGdldExvZ2dlcignbWVzc2FnZS1xdWV1ZScpO1xuXG4vLyBCdWZmZXIgZm9yIG1lc3NhZ2VzIGVtaXR0ZWQgYmVmb3JlIHRoZSAjY29udmVyc2F0aW9uIGRpdiBleGlzdHMuXG4vLyBGbHVzaGVkIGF0IHRoZSBzdGFydCBvZiBpbml0KCkgb25jZSB0aGUgRE9NIGlzIGZ1bGx5IHJlYWR5LlxuY29uc3QgX21lc3NhZ2VRdWV1ZSA9IFtdO1xuXG5mdW5jdGlvbiBfZmx1c2hNZXNzYWdlUXVldWUoKSB7XG4gIHdoaWxlIChfbWVzc2FnZVF1ZXVlLmxlbmd0aCkge1xuICAgIGNvbnN0IHsgdHlwZSwgdGV4dCB9ID0gX21lc3NhZ2VRdWV1ZS5zaGlmdCgpO1xuICAgIGFwcGVuZE1lc3NhZ2UodHlwZSwgdGV4dCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYXBwZW5kTG9hZGluZ01lc3NhZ2UodGV4dCkge1xuICBjb25zdCBjb252ZXJzYXRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udmVyc2F0aW9uJyk7XG4gIGNvbnN0IG1lc3NhZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgbWVzc2FnZS5jbGFzc05hbWUgPSAnbWVzc2FnZSBzeXN0ZW0nO1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGNvbnRlbnQuY2xhc3NOYW1lID0gJ2NvbnRlbnQgbG9hZGluZy1tZXNzYWdlJztcbiAgY29udGVudC5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz1cImxvYWRpbmctc3Bpbm5lclwiPjwvZGl2PjxzcGFuPiR7dGV4dH08L3NwYW4+YDtcbiAgbWVzc2FnZS5hcHBlbmRDaGlsZChjb250ZW50KTtcbiAgY29udmVyc2F0aW9uLmFwcGVuZENoaWxkKG1lc3NhZ2UpO1xuICBjb252ZXJzYXRpb24uc2Nyb2xsVG9wID0gY29udmVyc2F0aW9uLnNjcm9sbEhlaWdodDtcbiAgcmV0dXJuIG1lc3NhZ2U7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUxvYWRpbmdNZXNzYWdlKG1lc3NhZ2VFbGVtZW50KSB7XG4gIGlmIChtZXNzYWdlRWxlbWVudCAmJiBtZXNzYWdlRWxlbWVudC5wYXJlbnROb2RlKSB7XG4gICAgbWVzc2FnZUVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChtZXNzYWdlRWxlbWVudCk7XG4gIH1cbn1cblxuLyoqIFJlc3RvcmVzIGEgcHJldmlvdXNseS1zYXZlZCBtZXNzYWdlIHdob3NlIGNvbnRlbnQgaXMgYWxyZWFkeSBIVE1MIChzYXZlZCB2aWEgaW5uZXJIVE1MKS4gKi9cbmZ1bmN0aW9uIGFwcGVuZE1lc3NhZ2VIdG1sKHR5cGUsIGh0bWwpIHtcbiAgY29uc3QgY29udmVyc2F0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbnZlcnNhdGlvbicpO1xuICBjb25zdCBtZXNzYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIG1lc3NhZ2UuY2xhc3NOYW1lID0gYG1lc3NhZ2UgJHt0eXBlfWA7XG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgY29udGVudC5jbGFzc05hbWUgPSAnY29udGVudCc7XG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gaHRtbDtcbiAgbWVzc2FnZS5hcHBlbmRDaGlsZChjb250ZW50KTtcbiAgY29udmVyc2F0aW9uLmFwcGVuZENoaWxkKG1lc3NhZ2UpO1xuICBjb252ZXJzYXRpb24uc2Nyb2xsVG9wID0gY29udmVyc2F0aW9uLnNjcm9sbEhlaWdodDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDb2xsYXBzaWJsZSBsb25nLWNvbnRlbnQgaGVscGVyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY29uc3QgQ09MTEFQU0VfTElORV9USFJFU0hPTEQgPSA4OyAgLy8gbGluZXMgYmVmb3JlIGNvbGxhcHNpbmdcbmNvbnN0IENPTExBUFNFX0NIQVJfVEhSRVNIT0xEID0gNDgwOyAvLyBjaGFycyBiZWZvcmUgY29sbGFwc2luZ1xuXG4vKipcbiAqIFdyYXAgcmVuZGVyZWQgSFRNTCBpbiBhIGNvbGxhcHNpYmxlIGNvbnRhaW5lciB3aGVuIHRoZSBjb250ZW50IGV4Y2VlZHMgdGhlXG4gKiB0aHJlc2hvbGQsIHNob3dpbmcgdGhlIGZpcnN0IGZldyBsaW5lcyB3aXRoIGEgdG9nZ2xlIGJ1dHRvbi5cbiAqL1xuZnVuY3Rpb24gX21ha2VDb2xsYXBzaWJsZUNvbnRlbnQoaHRtbCwgdGV4dFN0cikge1xuICBjb25zdCBsaW5lcyA9IHRleHRTdHIuc3BsaXQoJ1xcbicpO1xuICBpZiAobGluZXMubGVuZ3RoIDw9IENPTExBUFNFX0xJTkVfVEhSRVNIT0xEICYmIHRleHRTdHIubGVuZ3RoIDw9IENPTExBUFNFX0NIQVJfVEhSRVNIT0xEKSB7XG4gICAgcmV0dXJuIHsgaHRtbCwgY29sbGFwc2libGU6IGZhbHNlIH07XG4gIH1cblxuICAvLyBCdWlsZCBwcmV2aWV3OiBmaXJzdCBDT0xMQVBTRV9MSU5FX1RIUkVTSE9MRCBsaW5lcyB3b3J0aCBvZiBlc2NhcGVkIHRleHRcbiAgY29uc3QgcHJldmlld0xpbmVzID0gbGluZXMuc2xpY2UoMCwgQ09MTEFQU0VfTElORV9USFJFU0hPTEQpO1xuICBjb25zdCBwcmV2aWV3SHRtbCA9IGVzY2FwZUh0bWwocHJldmlld0xpbmVzLmpvaW4oJ1xcbicpKVxuICAgIC5yZXBsYWNlKC9cXCpcXCooLis/KVxcKlxcKi9nLCAnPHN0cm9uZz4kMTwvc3Ryb25nPicpXG4gICAgLnJlcGxhY2UoL1xcKiguKz8pXFwqL2csICc8ZW0+JDE8L2VtPicpXG4gICAgLnJlcGxhY2UoL2AoW15gXSspYC9nLCAnPGNvZGU+JDE8L2NvZGU+JylcbiAgICAucmVwbGFjZSgvXFxuL2csICc8YnI+Jyk7XG5cbiAgY29uc3Qgb3ZlcmZsb3cgPSBsaW5lcy5sZW5ndGggLSBDT0xMQVBTRV9MSU5FX1RIUkVTSE9MRDtcbiAgY29uc3QgaWQgPSBgY29sbGFwc2libGUtJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDcpfWA7XG5cbiAgY29uc3Qgd3JhcHBlZCA9IGBcbiAgICA8ZGl2IGNsYXNzPVwibXNnLXByZXZpZXdcIiBpZD1cIiR7aWR9LXByZXZpZXdcIj4ke3ByZXZpZXdIdG1sfTwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJtc2ctZnVsbFwiIGlkPVwiJHtpZH0tZnVsbFwiIHN0eWxlPVwiZGlzcGxheTpub25lXCI+JHtodG1sfTwvZGl2PlxuICAgIDxidXR0b24gY2xhc3M9XCJtc2ctdG9nZ2xlLWJ0blwiIG9uY2xpY2s9XCIoZnVuY3Rpb24oYnRuKXtcbiAgICAgIHZhciBwPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCcke2lkfS1wcmV2aWV3JyksXG4gICAgICAgICAgZj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnJHtpZH0tZnVsbCcpO1xuICAgICAgaWYoZi5zdHlsZS5kaXNwbGF5PT09J25vbmUnKXtcbiAgICAgICAgcC5zdHlsZS5kaXNwbGF5PSdub25lJzsgZi5zdHlsZS5kaXNwbGF5PSdibG9jayc7IGJ0bi50ZXh0Q29udGVudD0nU2hvdyBsZXNzJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHAuc3R5bGUuZGlzcGxheT0nJzsgZi5zdHlsZS5kaXNwbGF5PSdub25lJzsgYnRuLnRleHRDb250ZW50PSdTaG93ICR7b3ZlcmZsb3d9IG1vcmUgbGluZSR7b3ZlcmZsb3cgPT09IDEgPyAnJyA6ICdzJ31cdTIwMjYnO1xuICAgICAgfVxuICAgIH0pKHRoaXMpXCIgdHlwZT1cImJ1dHRvblwiPlNob3cgJHtvdmVyZmxvd30gbW9yZSBsaW5lJHtvdmVyZmxvdyA9PT0gMSA/ICcnIDogJ3MnfVx1MjAyNjwvYnV0dG9uPmA7XG5cbiAgcmV0dXJuIHsgaHRtbDogd3JhcHBlZCwgY29sbGFwc2libGU6IHRydWUgfTtcbn1cblxuZnVuY3Rpb24gYXBwZW5kTWVzc2FnZSh0eXBlLCB0ZXh0KSB7XG4gIGNvbnN0IGNvbnZlcnNhdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb252ZXJzYXRpb24nKTtcbiAgaWYgKCFjb252ZXJzYXRpb24pIHtcbiAgICAvLyBET00gbm90IHJlYWR5IHlldCBcdTIwMTQgYnVmZmVyIHVudGlsIF9mbHVzaE1lc3NhZ2VRdWV1ZSgpIGlzIGNhbGxlZCBmcm9tIGluaXQoKVxuICAgIF9tZXNzYWdlUXVldWUucHVzaCh7IHR5cGUsIHRleHQgfSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgbWVzc2FnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBtZXNzYWdlLmNsYXNzTmFtZSA9IGBtZXNzYWdlICR7dHlwZX1gO1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGNvbnRlbnQuY2xhc3NOYW1lID0gJ2NvbnRlbnQnO1xuXG4gIC8vIFNpbXBsZSBtYXJrZG93biByZW5kZXJpbmc6IGNvbnZlcnQgKip0ZXh0KiogdG8gPHN0cm9uZz4gYW5kIHByZXNlcnZlIG5ld2xpbmVzXG4gIGNvbnN0IHRleHRTdHIgPSB0eXBlb2YgdGV4dCA9PT0gJ3N0cmluZycgPyB0ZXh0IDogSlNPTi5zdHJpbmdpZnkodGV4dCwgbnVsbCwgMik7XG4gIGNvbnN0IHJlbmRlcmVkSHRtbCA9IGVzY2FwZUh0bWwodGV4dFN0cilcbiAgICAucmVwbGFjZSgvXFwqXFwqKC4rPylcXCpcXCovZywgJzxzdHJvbmc+JDE8L3N0cm9uZz4nKVxuICAgIC5yZXBsYWNlKC9cXCooLis/KVxcKi9nLCAnPGVtPiQxPC9lbT4nKVxuICAgIC5yZXBsYWNlKC9gKFteYF0rKWAvZywgJzxjb2RlPiQxPC9jb2RlPicpXG4gICAgLnJlcGxhY2UoL1xcbi9nLCAnPGJyPicpO1xuXG4gIC8vIEFwcGx5IGNvbGxhcHNpYmxlIHdyYXBwZXIgZm9yIGxvbmcgdXNlci9hc3Npc3RhbnQgbWVzc2FnZXNcbiAgaWYgKHR5cGUgPT09ICd1c2VyJyB8fCB0eXBlID09PSAnYXNzaXN0YW50Jykge1xuICAgIGNvbnN0IHsgaHRtbCwgY29sbGFwc2libGUgfSA9IF9tYWtlQ29sbGFwc2libGVDb250ZW50KHJlbmRlcmVkSHRtbCwgdGV4dFN0cik7XG4gICAgY29udGVudC5pbm5lckhUTUwgPSBodG1sO1xuICAgIGlmIChjb2xsYXBzaWJsZSkgY29udGVudC5jbGFzc0xpc3QuYWRkKCdjb2xsYXBzaWJsZS1tc2cnKTtcbiAgfSBlbHNlIHtcbiAgICBjb250ZW50LmlubmVySFRNTCA9IHJlbmRlcmVkSHRtbDtcbiAgfVxuICBtZXNzYWdlLmFwcGVuZENoaWxkKGNvbnRlbnQpO1xuXG4gIC8vIENoZWNrIGlmIG1lc3NhZ2UgZW5kcyB3aXRoIHJlc3BvbnNlIG9wdGlvbnMgbGlrZSAoeWVzL25vL21heWJlKVxuICBjb25zdCBvcHRpb25zTWF0Y2ggPSB0ZXh0U3RyLm1hdGNoKC9cXCgoW14pXStcXC9bXildKylcXClcXHMqJC8pO1xuICBpZiAob3B0aW9uc01hdGNoICYmIHR5cGUgPT09ICdhc3Npc3RhbnQnKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IG9wdGlvbnNNYXRjaFsxXS5zcGxpdCgnLycpLm1hcChvcHQgPT4gb3B0LnRyaW0oKSk7XG4gICAgY29uc3QgYnV0dG9uQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgYnV0dG9uQ29udGFpbmVyLnN0eWxlLmNzc1RleHQgPSAnbWFyZ2luLXRvcDogMTJweDsgZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IGZsZXgtd3JhcDogd3JhcDsnO1xuICAgIG9wdGlvbnMuZm9yRWFjaChvcHRpb24gPT4ge1xuICAgICAgY29uc3QgYnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgICBidG4udGV4dENvbnRlbnQgPSBvcHRpb247XG4gICAgICBidG4uY2xhc3NOYW1lID0gJ2FjdGlvbi1idG4nO1xuICAgICAgYnRuLnN0eWxlLmNzc1RleHQgPSAncGFkZGluZzogOHB4IDE2cHg7IGJhY2tncm91bmQ6ICMzYjgyZjY7IGNvbG9yOiB3aGl0ZTsgYm9yZGVyOiBub25lOyBib3JkZXItcmFkaXVzOiA2cHg7IGN1cnNvcjogcG9pbnRlcjsnO1xuICAgICAgYnRuLm9uY2xpY2sgPSAoKSA9PiB7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZXNzYWdlLWlucHV0JykudmFsdWUgPSBvcHRpb247XG4gICAgICAgIGlmICh0eXBlb2Ygc2VuZE1lc3NhZ2UgPT09ICdmdW5jdGlvbicpIHNlbmRNZXNzYWdlKCk7XG4gICAgICB9O1xuICAgICAgYnV0dG9uQ29udGFpbmVyLmFwcGVuZENoaWxkKGJ0bik7XG4gICAgfSk7XG4gICAgbWVzc2FnZS5hcHBlbmRDaGlsZChidXR0b25Db250YWluZXIpO1xuICB9XG5cbiAgY29udmVyc2F0aW9uLmFwcGVuZENoaWxkKG1lc3NhZ2UpO1xuICBjb252ZXJzYXRpb24uc2Nyb2xsVG9wID0gY29udmVyc2F0aW9uLnNjcm9sbEhlaWdodDtcbiAgcmV0dXJuIG1lc3NhZ2U7XG59XG5cbi8qKlxuICogQXBwZW5kcyBhIHN5c3RlbSBlcnJvciBtZXNzYWdlIHdpdGggYW4gb3B0aW9uYWwgUmV0cnkgYnV0dG9uLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgdGV4dCAgICAgICAtIEVycm9yIG1lc3NhZ2UgdGV4dCAoc3VwcG9ydHMgKipib2xkKiogbWFya2Rvd24pXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcmV0cnlGbl0gIC0gQ2FsbGVkIHdoZW4gUmV0cnkgaXMgY2xpY2tlZDsgb21pdCBmb3Igbm9uLXJldHJ5YWJsZSBlcnJvcnNcbiAqIEBwYXJhbSB7c3RyaW5nfSAgIFtyZXRyeUxhYmVsXSAtIFJldHJ5IGJ1dHRvbiBsYWJlbCAoZGVmYXVsdCAnUmV0cnknKVxuICovXG5mdW5jdGlvbiBhcHBlbmRSZXRyeU1lc3NhZ2UodGV4dCwgcmV0cnlGbiwgcmV0cnlMYWJlbCA9ICdSZXRyeScsIGNhbmNlbEZuID0gbnVsbCkge1xuICBjb25zdCBjb252ZXJzYXRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udmVyc2F0aW9uJyk7XG4gIGNvbnN0IG1lc3NhZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgbWVzc2FnZS5jbGFzc05hbWUgPSAnbWVzc2FnZSBzeXN0ZW0nO1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGNvbnRlbnQuY2xhc3NOYW1lID0gJ2NvbnRlbnQnO1xuICBjb25zdCBlc2NhcGVkID0gZXNjYXBlSHRtbCh0ZXh0KTtcbiAgY29udGVudC5pbm5lckhUTUwgPSBlc2NhcGVkXG4gICAgLnJlcGxhY2UoL1xcKlxcKiguKz8pXFwqXFwqL2csICc8c3Ryb25nPiQxPC9zdHJvbmc+JylcbiAgICAucmVwbGFjZSgvXFxuL2csICc8YnI+Jyk7XG4gIG1lc3NhZ2UuYXBwZW5kQ2hpbGQoY29udGVudCk7XG4gIGlmICh0eXBlb2YgcmV0cnlGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgIGJ0bi50ZXh0Q29udGVudCA9IHJldHJ5TGFiZWw7XG4gICAgYnRuLnN0eWxlLmNzc1RleHQgPSAnbWFyZ2luLXRvcDo4cHg7cGFkZGluZzo2cHggMTRweDtiYWNrZ3JvdW5kOiMzYjgyZjY7Y29sb3I6I2ZmZjtib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjZweDtjdXJzb3I6cG9pbnRlcjtmb250LXNpemU6MC44NXJlbTtkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW4tcmlnaHQ6OHB4Oyc7XG4gICAgYnRuLm9uY2xpY2sgPSAoKSA9PiB7IG1lc3NhZ2UucmVtb3ZlKCk7IHJldHJ5Rm4oKTsgfTtcbiAgICBtZXNzYWdlLmFwcGVuZENoaWxkKGJ0bik7XG4gIH1cbiAgaWYgKHR5cGVvZiBjYW5jZWxGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnN0IGNhbmNlbEJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgIGNhbmNlbEJ0bi50ZXh0Q29udGVudCA9ICdTdG9wIHJldHJpZXMnO1xuICAgIGNhbmNlbEJ0bi5zdHlsZS5jc3NUZXh0ID0gJ21hcmdpbi10b3A6OHB4O3BhZGRpbmc6NnB4IDE0cHg7YmFja2dyb3VuZDojNmI3MjgwO2NvbG9yOiNmZmY7Ym9yZGVyOm5vbmU7Ym9yZGVyLXJhZGl1czo2cHg7Y3Vyc29yOnBvaW50ZXI7Zm9udC1zaXplOjAuODVyZW07ZGlzcGxheTppbmxpbmUtYmxvY2s7JztcbiAgICBjYW5jZWxCdG4ub25jbGljayA9ICgpID0+IHsgbWVzc2FnZS5yZW1vdmUoKTsgY2FuY2VsRm4oKTsgfTtcbiAgICBtZXNzYWdlLmFwcGVuZENoaWxkKGNhbmNlbEJ0bik7XG4gIH1cbiAgY29udmVyc2F0aW9uLmFwcGVuZENoaWxkKG1lc3NhZ2UpO1xuICBjb252ZXJzYXRpb24uc2Nyb2xsVG9wID0gY29udmVyc2F0aW9uLnNjcm9sbEhlaWdodDtcbiAgcmV0dXJuIG1lc3NhZ2U7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZEZvcm1hdHRlZEFuYWx5c2lzKHJlc3VsdCkge1xuICB0cnkge1xuICAgIGNvbnN0IGNsZWFuUmVzdWx0ID0gY2xlYW5Kc29uUmVzcG9uc2UocmVzdWx0KTtcbiAgICBjb25zdCBkYXRhID0gdHlwZW9mIGNsZWFuUmVzdWx0ID09PSAnc3RyaW5nJyA/IEpTT04ucGFyc2UoY2xlYW5SZXN1bHQpIDogY2xlYW5SZXN1bHQ7XG5cbiAgICBpZiAoZGF0YSAmJiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiYgKGRhdGEudGl0bGUgfHwgZGF0YS5yZXF1aXJlZF9za2lsbHMpKSB7XG4gICAgICBjb25zdCBjb252ZXJzYXRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udmVyc2F0aW9uJyk7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBtZXNzYWdlLmNsYXNzTmFtZSA9ICdtZXNzYWdlIGFzc2lzdGFudCc7XG4gICAgICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBjb250ZW50LmNsYXNzTmFtZSA9ICdjb250ZW50IGpvYi1hbmFseXNpcyc7XG5cbiAgICAgIGxldCBodG1sID0gJzxoMz5cdUQ4M0RcdURDQ0IgSm9iIEFuYWx5c2lzIENvbXBsZXRlPC9oMz4nO1xuICAgICAgaWYgKGRhdGEudGl0bGUpICBodG1sICs9IGA8cD48c3Ryb25nPlBvc2l0aW9uOjwvc3Ryb25nPiAke2RhdGEudGl0bGV9IGF0ICR7ZGF0YS5jb21wYW55IHx8ICdDb21wYW55J308L3A+YDtcbiAgICAgIGlmIChkYXRhLmRvbWFpbikgaHRtbCArPSBgPHA+PHN0cm9uZz5Eb21haW46PC9zdHJvbmc+ICR7ZGF0YS5kb21haW59PC9wPmA7XG5cbiAgICAgIGlmIChkYXRhLnJlcXVpcmVkX3NraWxscz8ubGVuZ3RoKSB7XG4gICAgICAgIGh0bWwgKz0gJzxoND5cdUQ4M0NcdURGQUYgUmVxdWlyZWQgU2tpbGxzOjwvaDQ+PHVsPic7XG4gICAgICAgIGRhdGEucmVxdWlyZWRfc2tpbGxzLmZvckVhY2gocyA9PiB7IGh0bWwgKz0gYDxsaT4ke3N9PC9saT5gOyB9KTtcbiAgICAgICAgaHRtbCArPSAnPC91bD4nO1xuICAgICAgfVxuICAgICAgaWYgKGRhdGEucHJlZmVycmVkX3NraWxscz8ubGVuZ3RoKSB7XG4gICAgICAgIGh0bWwgKz0gJzxoND5cdTJCNTAgUHJlZmVycmVkIFNraWxsczo8L2g0Pjx1bD4nO1xuICAgICAgICBkYXRhLnByZWZlcnJlZF9za2lsbHMuZm9yRWFjaChzID0+IHsgaHRtbCArPSBgPGxpPiR7c308L2xpPmA7IH0pO1xuICAgICAgICBodG1sICs9ICc8L3VsPic7XG4gICAgICB9XG4gICAgICBpZiAoZGF0YS5uaWNlX3RvX2hhdmVfcmVxdWlyZW1lbnRzPy5sZW5ndGgpIHtcbiAgICAgICAgaHRtbCArPSAnPGg0Plx1MjcyOCBOaWNlIHRvIEhhdmU6PC9oND48dWw+JztcbiAgICAgICAgZGF0YS5uaWNlX3RvX2hhdmVfcmVxdWlyZW1lbnRzLmZvckVhY2gociA9PiB7IGh0bWwgKz0gYDxsaT4ke3J9PC9saT5gOyB9KTtcbiAgICAgICAgaHRtbCArPSAnPC91bD4nO1xuICAgICAgfVxuICAgICAgaWYgKGRhdGEuYXRzX2tleXdvcmRzPy5sZW5ndGgpIHtcbiAgICAgICAgaHRtbCArPSAnPGg0Plx1RDgzRFx1REQxMSBBVFMgS2V5d29yZHM6PC9oND48cCBzdHlsZT1cImxpbmUtaGVpZ2h0OiAyO1wiPic7XG4gICAgICAgIGRhdGEuYXRzX2tleXdvcmRzLmZvckVhY2goa3cgPT4ge1xuICAgICAgICAgIGh0bWwgKz0gYDxzcGFuIHN0eWxlPVwiZGlzcGxheTppbmxpbmUtYmxvY2s7YmFja2dyb3VuZDojZGJlYWZlO2NvbG9yOiMxZTQwYWY7Ym9yZGVyLXJhZGl1czo0cHg7cGFkZGluZzoycHggOHB4O21hcmdpbjoycHg7Zm9udC1zaXplOjAuODVlbTtcIj4ke2t3fTwvc3Bhbj5gO1xuICAgICAgICB9KTtcbiAgICAgICAgaHRtbCArPSAnPC9wPic7XG4gICAgICB9XG5cbiAgICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgIG1lc3NhZ2UuYXBwZW5kQ2hpbGQoY29udGVudCk7XG4gICAgICBjb252ZXJzYXRpb24uYXBwZW5kQ2hpbGQobWVzc2FnZSk7XG4gICAgICBjb252ZXJzYXRpb24uc2Nyb2xsVG9wID0gY29udmVyc2F0aW9uLnNjcm9sbEhlaWdodDtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgcmVzdWx0KTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2cuZXJyb3IoJ0FuYWx5c2lzIGRpc3BsYXkgZXJyb3I6JywgZSk7XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgcmVzdWx0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhcHBlbmRGb3JtYXR0ZWRSZXNwb25zZShyZXNwb25zZSkge1xuICB0cnkge1xuICAgIGNvbnN0IGRhdGEgPSB0eXBlb2YgcmVzcG9uc2UgPT09ICdzdHJpbmcnID8gSlNPTi5wYXJzZShyZXNwb25zZSkgOiByZXNwb25zZTtcbiAgICBpZiAoZGF0YSAmJiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiYgKGRhdGEudGl0bGUgfHwgZGF0YS5yZXF1aXJlZF9za2lsbHMpKSB7XG4gICAgICBhcHBlbmRGb3JtYXR0ZWRBbmFseXNpcyhyZXNwb25zZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIHJlc3BvbnNlKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCByZXNwb25zZSk7XG4gIH1cbn1cblxuLy8gYXBwZW5kUmF3SHRtbCBpcyBuZWVkZWQgYnkgbWVzc2FnZS1kaXNwYXRjaDsgZGVmaW5lZCBoZXJlIHNpbmNlIGl0IHVzZXMgdGhlXG4vLyBjb252ZXJzYXRpb24gZWxlbWVudCBwYXR0ZXJuLlxuZnVuY3Rpb24gYXBwZW5kUmF3SHRtbChodG1sKSB7XG4gIGNvbnN0IGNvbnZlcnNhdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb252ZXJzYXRpb24nKTtcbiAgaWYgKCFjb252ZXJzYXRpb24pIHJldHVybjtcbiAgY29udmVyc2F0aW9uLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJywgaHRtbCk7XG4gIGNvbnZlcnNhdGlvbi5zY3JvbGxUb3AgPSBjb252ZXJzYXRpb24uc2Nyb2xsSGVpZ2h0O1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgRVMgbW9kdWxlIGV4cG9ydHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5leHBvcnQge1xuICBfbWVzc2FnZVF1ZXVlLCBfZmx1c2hNZXNzYWdlUXVldWUsXG4gIGFwcGVuZExvYWRpbmdNZXNzYWdlLCByZW1vdmVMb2FkaW5nTWVzc2FnZSxcbiAgYXBwZW5kTWVzc2FnZUh0bWwsIGFwcGVuZE1lc3NhZ2UsXG4gIGFwcGVuZFJldHJ5TWVzc2FnZSxcbiAgYXBwZW5kRm9ybWF0dGVkQW5hbHlzaXMsIGFwcGVuZEZvcm1hdHRlZFJlc3BvbnNlLFxuICBhcHBlbmRSYXdIdG1sLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL3Jldmlldy10YWJsZS1iYXNlLmpzXG4gKiBUYWIgc3dpdGNoaW5nLCBhbmFseXNpcyB0YWIsIGN1c3RvbWl6YXRpb24gcmVzcG9uc2UgaGFuZGxlciwgcmV2aWV3LXBhbmVcbiAqIGNvb3JkaW5hdGlvbiwgYW5kIHRoZSBwYWdlLWVzdGltYXRlIHdpZGdldC5cbiAqXG4gKiBEZXBlbmRlbmNpZXMgKGFsbCByZXNvbHZlZCB0aHJvdWdoIGdsb2JhbFRoaXMgYXQgcnVudGltZSk6XG4gKiAgIGFwcGVuZE1lc3NhZ2UsIHNhdmVUYWJEYXRhLCBjbGVhbkpzb25SZXNwb25zZSwgZXNjYXBlSHRtbCxcbiAqICAgZ2V0U3RhZ2VGb3JUYWIsIHVwZGF0ZVRhYkJhckZvclN0YWdlLCB1cGRhdGVBY3Rpb25CdXR0b25zLFxuICogICBwb3B1bGF0ZUpvYlRhYiwgcG9wdWxhdGVRdWVzdGlvbnNUYWIsIGJ1aWxkQWNoaWV2ZW1lbnRzRWRpdG9yLFxuICogICByZW5kZXJSZXdyaXRlUGFuZWwsIHBvcHVsYXRlQ1ZFZGl0b3JUYWIsXG4gKiAgIHBvcHVsYXRlRG93bmxvYWRUYWIsIHBvcHVsYXRlU3BlbGxDaGVja1RhYiwgaW5pdGlhdGVMYXlvdXRJbnN0cnVjdGlvbnMsXG4gKiAgIHBvcHVsYXRlRmluYWxpc2VUYWIsIHBvcHVsYXRlTWFzdGVyVGFiLCBwb3B1bGF0ZUNvdmVyTGV0dGVyVGFiLFxuICogICBwb3B1bGF0ZVNjcmVlbmluZ1RhYiwgZXh0cmFjdEZpcnN0SnNvbk9iamVjdCxcbiAqICAgZmV0Y2hTdGF0dXMsIGFwaUNhbGwsXG4gKiAgIGJ1aWxkRXhwZXJpZW5jZVJldmlld1RhYmxlLCBidWlsZFNraWxsc1Jldmlld1RhYmxlLFxuICogICBidWlsZEFjaGlldmVtZW50c1Jldmlld1RhYmxlLCBidWlsZFN1bW1hcnlGb2N1c1NlY3Rpb24sXG4gKiAgIGJ1aWxkUHVibGljYXRpb25zUmV2aWV3VGFibGUsIGdldEV4cGVyaWVuY2VEZXRhaWxzLFxuICogICBnZXRFeHBlcmllbmNlUmVjb21tZW5kYXRpb24sIGFjaGlldmVtZW50RGVjaXNpb25zXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdyZXZpZXctdGFibGUtYmFzZScpO1xuXG5pbXBvcnQgeyBzdGF0ZU1hbmFnZXIgfSBmcm9tICcuL3N0YXRlLW1hbmFnZXIuanMnO1xuaW1wb3J0IHsgX1NURVBfRElTUExBWSB9IGZyb20gJy4vd29ya2Zsb3ctc3RlcHMuanMnO1xuXG4vLyBcdTI1MDBcdTI1MDAgTW9kdWxlLWxldmVsIHN0YXRlIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5sZXQgdXNlclNlbGVjdGlvbnMgPSB7XG4gIGV4cGVyaWVuY2VzOiB7fSwgIC8vIGV4cF9pZCAtPiAnZW1waGFzaXplJ3wnaW5jbHVkZSd8J2RlLWVtcGhhc2l6ZSd8J2V4Y2x1ZGUnXG4gIHNraWxsczoge30gICAgICAgIC8vIHNraWxsX25hbWUgLT4gJ2VtcGhhc2l6ZSd8J2luY2x1ZGUnfCdkZS1lbXBoYXNpemUnfCdleGNsdWRlJ1xufTtcbmxldCBwYWdlRXN0aW1hdGVUaW1lciA9IG51bGw7XG5sZXQgcGFnZUVzdGltYXRlUmVxdWVzdElkID0gMDtcblxuLy8gRHJhZnQgaW5wdXQgY2FjaGUgXHUyMDEzIHByZXNlcnZlcyB1c2VyLXR5cGVkIHZhbHVlcyBhY3Jvc3MgdGFiIHN3aXRjaGVzXG5jb25zdCBfZHJhZnRJbnB1dHMgPSB7fTtcblxuZnVuY3Rpb24gX3NhdmVEcmFmdElucHV0c0ZvclRhYih0YWJOYW1lKSB7XG4gIGlmICghdGFiTmFtZSkgcmV0dXJuO1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgaWYgKCFjb250ZW50KSByZXR1cm47XG4gIGNvbnN0IHNhdmVkID0ge307XG4gIGNvbnRlbnQucXVlcnlTZWxlY3RvckFsbCgndGV4dGFyZWEsIGlucHV0LCBzZWxlY3QnKS5mb3JFYWNoKGVsID0+IHtcbiAgICBpZiAoIWVsLmlkIHx8IGVsLnR5cGUgPT09ICdmaWxlJykgcmV0dXJuO1xuICAgIHNhdmVkW2VsLmlkXSA9IChlbC50eXBlID09PSAnY2hlY2tib3gnIHx8IGVsLnR5cGUgPT09ICdyYWRpbycpID8gZWwuY2hlY2tlZCA6IGVsLnZhbHVlO1xuICB9KTtcbiAgaWYgKE9iamVjdC5rZXlzKHNhdmVkKS5sZW5ndGggPiAwKSB7XG4gICAgX2RyYWZ0SW5wdXRzW3RhYk5hbWVdID0gc2F2ZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gX3Jlc3RvcmVEcmFmdElucHV0c0ZvclRhYih0YWJOYW1lKSB7XG4gIGNvbnN0IGNhY2hlZCA9IF9kcmFmdElucHV0c1t0YWJOYW1lXTtcbiAgaWYgKCFjYWNoZWQpIHJldHVybjtcbiAgT2JqZWN0LmVudHJpZXMoY2FjaGVkKS5mb3JFYWNoKChbaWQsIHZhbHVlXSkgPT4ge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgIGlmICghZWwgfHwgZWwucmVhZE9ubHkgfHwgZWwuZGlzYWJsZWQgfHwgZWwudHlwZSA9PT0gJ2ZpbGUnKSByZXR1cm47XG4gICAgaWYgKGVsLnR5cGUgPT09ICdjaGVja2JveCcgfHwgZWwudHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgZWwuY2hlY2tlZCA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbC52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGVuc3VyZVRhYkRhdGFTdGF0ZSgpIHtcbiAgcmV0dXJuIHN0YXRlTWFuYWdlci5nZXRBbGxUYWJEYXRhKCk7XG59XG5cbmZ1bmN0aW9uIGlzUmVjb25uZWN0SW5Qcm9ncmVzcygpIHtcbiAgcmV0dXJuIHN0YXRlTWFuYWdlci5pc1JlY29ubmVjdGluZygpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgSW5jbHVzaW9uIGNvdW50cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gdXBkYXRlSW5jbHVzaW9uQ291bnRzKCkge1xuICB0cnkge1xuICAgIGNvbnN0IGV4cERlY3MgPSAod2luZG93Ll9zYXZlZERlY2lzaW9ucyAmJiB3aW5kb3cuX3NhdmVkRGVjaXNpb25zLmV4cGVyaWVuY2VfZGVjaXNpb25zKSB8fCB1c2VyU2VsZWN0aW9ucy5leHBlcmllbmNlcyB8fCB7fTtcbiAgICBjb25zdCBza2lsbERlY3MgPSAod2luZG93Ll9zYXZlZERlY2lzaW9ucyAmJiB3aW5kb3cuX3NhdmVkRGVjaXNpb25zLnNraWxsX2RlY2lzaW9ucykgfHwgdXNlclNlbGVjdGlvbnMuc2tpbGxzIHx8IHt9O1xuICAgIGNvbnN0IGFjaERlY3MgPSAod2luZG93Ll9zYXZlZERlY2lzaW9ucyAmJiB3aW5kb3cuX3NhdmVkRGVjaXNpb25zLmFjaGlldmVtZW50X2RlY2lzaW9ucykgfHwgd2luZG93LmFjaGlldmVtZW50RGVjaXNpb25zIHx8IHt9O1xuXG4gICAgY29uc3QgZXhwSW5jbHVkZWQgPSBPYmplY3QudmFsdWVzKGV4cERlY3MpLmZpbHRlcih2ID0+IHYgIT09ICdleGNsdWRlJykubGVuZ3RoO1xuICAgIGNvbnN0IHNraWxsSW5jbHVkZWQgPSBPYmplY3QudmFsdWVzKHNraWxsRGVjcykuZmlsdGVyKHYgPT4gdiAhPT0gJ2V4Y2x1ZGUnKS5sZW5ndGg7XG4gICAgY29uc3QgYWNoSW5jbHVkZWQgPSBPYmplY3QudmFsdWVzKGFjaERlY3MpLmZpbHRlcih2ID0+IHYgIT09ICdleGNsdWRlJykubGVuZ3RoO1xuXG4gICAgY29uc3QgZXhwVGFiID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYi1leHAtcmV2aWV3Jyk7XG4gICAgY29uc3Qgc2tpbGxUYWIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFiLXNraWxscy1yZXZpZXcnKTtcbiAgICBjb25zdCBhY2hUYWIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFiLWFjaGlldmVtZW50cy1yZXZpZXcnKTtcblxuICAgIGlmIChleHBUYWIpIGV4cFRhYi50ZXh0Q29udGVudCA9IGBcdUQ4M0RcdURDQ0EgRXhwZXJpZW5jZXMke2V4cEluY2x1ZGVkID8gJyAoJyArIGV4cEluY2x1ZGVkICsgJyknIDogJyd9YDtcbiAgICBpZiAoc2tpbGxUYWIpIHNraWxsVGFiLnRleHRDb250ZW50ID0gYFx1RDgzRFx1REVFMFx1RkUwRiBTa2lsbHMke3NraWxsSW5jbHVkZWQgPyAnICgnICsgc2tpbGxJbmNsdWRlZCArICcpJyA6ICcnfWA7XG4gICAgaWYgKGFjaFRhYikgYWNoVGFiLnRleHRDb250ZW50ID0gYFx1RDgzQ1x1REZDNiBBY2hpZXZlbWVudHMke2FjaEluY2x1ZGVkID8gJyAoJyArIGFjaEluY2x1ZGVkICsgJyknIDogJyd9YDtcbiAgfSBjYXRjaCAoZSkgeyBsb2cud2FybignRmFpbGVkIHRvIHVwZGF0ZSBpbmNsdXNpb24gY291bnRzOicsIGUpOyB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBHZW5lcmF0ZSBDViB0YWIgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIF9wb3B1bGF0ZUdlbmVyYXRlVGFiKGN2RGF0YSwgY29udGVudCkge1xuICBpZiAoIWN2RGF0YSB8fCAhY3ZEYXRhLmZpbGVzIHx8ICFjdkRhdGEuZmlsZXMubGVuZ3RoKSB7XG4gICAgY29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImVtcHR5LXN0YXRlXCI+PGRpdiBjbGFzcz1cImljb25cIj5cdUQ4M0RcdURDQzQ8L2Rpdj48aDM+R2VuZXJhdGVkIENWPC9oMz48cD5HZW5lcmF0ZSBDViB0byBzZWUgcHJldmlldzwvcD48L2Rpdj4nO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG1ldGEgICAgID0gY3ZEYXRhLm1ldGFkYXRhIHx8IHt9O1xuICBjb25zdCByb2xlICAgICA9IG1ldGEucm9sZSAgICAgfHwgbWV0YS5wb3NpdGlvbiB8fCAnJztcbiAgY29uc3QgY29tcGFueSAgPSBtZXRhLmNvbXBhbnkgIHx8ICcnO1xuICBjb25zdCBzdWJ0aXRsZSA9IHJvbGUgJiYgY29tcGFueSA/IGAke3JvbGV9IFx1MjAxNCAke2NvbXBhbnl9YCA6IHJvbGUgfHwgY29tcGFueSB8fCAnQ1YgZ2VuZXJhdGVkJztcblxuICBjb25zdCBJQ09OUyA9IHsgJy5wZGYnOiAnXHVEODNEXHVEQ0M0JywgJy5kb2N4JzogJ1x1RDgzRFx1RENERCcsICcuaHRtbCc6ICdcdUQ4M0NcdURGMTAnIH07XG4gIGNvbnN0IExBQkVMUyA9IHtcbiAgICAnLnBkZic6ICBmID0+IGYuaW5jbHVkZXMoJ0FUUycpID8gJ0FUUyBQREYnICA6ICdIdW1hbiBQREYnLFxuICAgICcuZG9jeCc6IGYgPT4gZi5pbmNsdWRlcygnQVRTJykgPyAnQVRTIERPQ1gnIDogZi5zdGFydHNXaXRoKCdDb3ZlckxldHRlcl8nKSA/ICdDb3ZlciBMZXR0ZXInIDogJ0h1bWFuIERPQ1gnLFxuICAgICcuaHRtbCc6ICgpID0+ICdIVE1MJyxcbiAgfTtcblxuICBjb25zdCBkb3dubG9hZGFibGVFeHRzID0gbmV3IFNldChbJy5wZGYnLCAnLmRvY3gnLCAnLmh0bWwnXSk7XG4gIGNvbnN0IGZpbGVzID0gKGN2RGF0YS5maWxlcyB8fCBbXSkuZmlsdGVyKGYgPT4ge1xuICAgIGNvbnN0IGV4dCA9IGYuc2xpY2UoZi5sYXN0SW5kZXhPZignLicpKS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiBkb3dubG9hZGFibGVFeHRzLmhhcyhleHQpICYmIGYgIT09ICdqb2JfZGVzY3JpcHRpb24udHh0JztcbiAgfSk7XG5cbiAgY29uc3Qgc2lkID0gdHlwZW9mIGdldFNlc3Npb25JZEZyb21VUkwgPT09ICdmdW5jdGlvbicgPyBnZXRTZXNzaW9uSWRGcm9tVVJMKCkgOiBudWxsO1xuICBjb25zdCBzZXNzaW9uUGFyYW0gPSBzaWQgPyBgP3Nlc3Npb25faWQ9JHtlbmNvZGVVUklDb21wb25lbnQoc2lkKX1gIDogJyc7XG5cbiAgbGV0IGZpbGVSb3dzID0gJyc7XG4gIGZvciAoY29uc3QgZiBvZiBmaWxlcykge1xuICAgIGNvbnN0IGV4dCAgID0gZi5zbGljZShmLmxhc3RJbmRleE9mKCcuJykpLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgaWNvbiAgPSBJQ09OU1tleHRdICB8fCAnXHVEODNEXHVEQ0MxJztcbiAgICBjb25zdCBsYWJlbCA9IExBQkVMU1tleHRdID8gTEFCRUxTW2V4dF0oZikgOiBmO1xuICAgIGZpbGVSb3dzICs9IGBcbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDoxMnB4O3BhZGRpbmc6MTBweCAwO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNmMWY1Zjk7XCI+XG4gICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjEuNGVtO1wiPiR7aWNvbn08L3NwYW4+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJmbGV4OjE7bWluLXdpZHRoOjA7XCI+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOiMzNzQxNTE7XCI+JHtsYWJlbH08L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuNzhlbTtjb2xvcjojOWNhM2FmO3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztcIj4ke2VzY2FwZUh0bWwoZil9PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8YSBocmVmPVwiL2FwaS9kb3dubG9hZC8ke2VuY29kZVVSSUNvbXBvbmVudChmKX0ke3Nlc3Npb25QYXJhbX1cIiBkb3dubG9hZD1cIiR7ZXNjYXBlSHRtbChmKX1cIlxuICAgICAgICAgICBjbGFzcz1cImJ0bi1zZWNvbmRhcnlcIiBzdHlsZT1cInBhZGRpbmc6NnB4IDE0cHg7Zm9udC1zaXplOjAuODVlbTt0ZXh0LWRlY29yYXRpb246bm9uZTtkaXNwbGF5OmlubGluZS1ibG9jaztcIj5Eb3dubG9hZDwvYT5cbiAgICAgIDwvZGl2PmA7XG4gIH1cblxuICBjb250ZW50LmlubmVySFRNTCA9IGBcbiAgICA8ZGl2IHN0eWxlPVwibWF4LXdpZHRoOjY0MHB4O21hcmdpbjowIGF1dG87cGFkZGluZzoyNHB4IDA7XCI+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTJweDttYXJnaW4tYm90dG9tOjI0cHg7XCI+XG4gICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjJlbTtcIj5cdTI3MDU8L3NwYW4+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGgyIHN0eWxlPVwibWFyZ2luOjA7Zm9udC1zaXplOjEuMmVtO2NvbG9yOiMxMTE4Mjc7XCI+Q1YgR2VuZXJhdGVkPC9oMj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuOWVtO2NvbG9yOiM2YjcyODA7XCI+JHtlc2NhcGVIdG1sKHN1YnRpdGxlKX08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZmY7Ym9yZGVyOjFweCBzb2xpZCAjZTJlOGYwO2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MCAxNnB4O21hcmdpbi1ib3R0b206MjRweDtcIj5cbiAgICAgICAgJHtmaWxlUm93c31cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cIm5hdi1idXR0b25zIG5hdi1lbmRcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbnRpbnVlLWJ0blwiIG9uY2xpY2s9XCJzd2l0Y2hUYWIoJ2xheW91dCcpXCI+T3BlbiBMYXlvdXQgUmV2aWV3IFx1MjE5MjwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+YDtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFRhYiBzd2l0Y2hpbmcgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8vIFRyYWNrcyB3aGljaCBjdXN0b21pc2Utc3RhZ2Ugc3ViLXRhYnMgaGF2ZSBiZWVuIHZpZXdlZCB0aGlzIHNlc3Npb24gKEdBUC0yNjkpLlxuY29uc3QgX3Zpc2l0ZWRDdXN0b21pc2VUYWJzID0gbmV3IFNldCgpO1xuY29uc3QgX0NVU1RPTUlTRV9UQUJTID0gbmV3IFNldChbJ2dvYWxzJywgJ3F1ZXN0aW9ucycsICdleHAtcmV2aWV3JywgJ2FjaC1lZGl0b3InLCAnc2tpbGxzLXJldmlldycsICdhY2hpZXZlbWVudHMtcmV2aWV3JywgJ3RhZ2xpbmUtcmV2aWV3JywgJ3N1bW1hcnktcmV2aWV3JywgJ3B1YmxpY2F0aW9ucy1yZXZpZXcnLCAnYXRzLXNjb3JlJ10pO1xuXG5mdW5jdGlvbiBfdXBkYXRlVmlzaXRlZFRhYkluZGljYXRvcnMoKSB7XG4gIF92aXNpdGVkQ3VzdG9taXNlVGFicy5mb3JFYWNoKG5hbWUgPT4ge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHRhYi0ke25hbWV9YCk7XG4gICAgaWYgKGVsKSBlbC5jbGFzc0xpc3QuYWRkKCd0YWItLXZpc2l0ZWQnKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHN3aXRjaFRhYih0YWIpIHtcbiAgLy8gQ2xlYXIga2V5Ym9hcmQtZm9jdXNlZCBjYXJkIHN0YXRlIHdoZW4gbGVhdmluZyBhIHJldmlldyB0YWJcbiAgaWYgKHR5cGVvZiByZXNldENhcmRGb2N1cyA9PT0gJ2Z1bmN0aW9uJykgcmVzZXRDYXJkRm9jdXMoKTtcblxuICAvLyBTYXZlIHVuc2F2ZWQgdXNlciBpbnB1dCBmcm9tIHRoZSB0YWIgd2UgYXJlIGxlYXZpbmdcbiAgX3NhdmVEcmFmdElucHV0c0ZvclRhYihzdGF0ZU1hbmFnZXIuZ2V0Q3VycmVudFRhYigpKTtcblxuICAvLyBTeW5jIHNlY29uZC1iYXIgdmlzaWJpbGl0eSB0byB0aGlzIHRhYidzIHN0YWdlXG4gIGxldCBfc3dpdGNoVGFiU3RhZ2UgPSBudWxsO1xuICBpZiAodHlwZW9mIGdldFN0YWdlRm9yVGFiID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB1cGRhdGVUYWJCYXJGb3JTdGFnZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIF9zd2l0Y2hUYWJTdGFnZSA9IGdldFN0YWdlRm9yVGFiKHRhYik7XG4gICAgaWYgKF9zd2l0Y2hUYWJTdGFnZSkge1xuICAgICAgdXBkYXRlVGFiQmFyRm9yU3RhZ2UoX3N3aXRjaFRhYlN0YWdlKTtcbiAgICAgIHVwZGF0ZUFjdGlvbkJ1dHRvbnMoX3N3aXRjaFRhYlN0YWdlKTtcbiAgICB9XG4gIH1cbiAgLy8gQWx3YXlzIHVwZGF0ZSB3b3JrZmxvdyBjbGlja2FibGUgc3RhdGUgdXNpbmcgY3VycmVudCBwaGFzZVxuICBpZiAodHlwZW9mIHN0YXRlTWFuYWdlcj8uZ2V0UGhhc2UgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHVwZGF0ZVdvcmtmbG93U3RlcHNDbGlja2FibGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICB1cGRhdGVXb3JrZmxvd1N0ZXBzQ2xpY2thYmxlKHN0YXRlTWFuYWdlci5nZXRQaGFzZSgpKTtcbiAgfVxuXG4gIC8vIEdBUC0xNiBQYXJ0IEI6IHNob3cvaGlkZSBhbmQgKHJlKXJlbmRlciB0aGUgZWFybHkgQ1YgcHJldmlldyBwYW5lbCBmb3JcbiAgLy8gdGhpcyB0YWIuIHRvZ2dsZUVhcmx5UHJldmlld1BhbmVsJ3Mgb3duIGluLXNjb3BlIGNoZWNrIGRlY2lkZXMgdmlzaWJpbGl0eS5cbiAgaWYgKHR5cGVvZiB0b2dnbGVFYXJseVByZXZpZXdQYW5lbCA9PT0gJ2Z1bmN0aW9uJykgdG9nZ2xlRWFybHlQcmV2aWV3UGFuZWwodGFiKTtcblxuICAvLyBVcGRhdGUgYWN0aXZlIHRhYiwgQVJJQSBzdGF0ZSwgYW5kIHJvdmluZyB0YWJpbmRleCAoV0NBRyAyLjEgdGFibGlzdCBwYXR0ZXJuKVxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudGFiJykuZm9yRWFjaCh0ID0+IHtcbiAgICB0LmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgIHQuc2V0QXR0cmlidXRlKCdhcmlhLXNlbGVjdGVkJywgJ2ZhbHNlJyk7XG4gICAgdC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJy0xJyk7XG4gIH0pO1xuICBjb25zdCBhY3RpdmVUYWIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgdGFiLSR7dGFifWApO1xuICBpZiAoYWN0aXZlVGFiKSB7XG4gICAgYWN0aXZlVGFiLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgIGFjdGl2ZVRhYi5zZXRBdHRyaWJ1dGUoJ2FyaWEtc2VsZWN0ZWQnLCAndHJ1ZScpO1xuICAgIGFjdGl2ZVRhYi5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTtcbiAgICBjb25zdCB0YWJwYW5lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gICAgaWYgKHRhYnBhbmVsKSB0YWJwYW5lbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWxsZWRieScsIGB0YWItJHt0YWJ9YCk7XG4gIH1cbiAgc3RhdGVNYW5hZ2VyLnNldEN1cnJlbnRUYWIodGFiKTtcblxuICAvLyBNYXJrIHRoaXMgdGFiIGFzIHZpc2l0ZWQgYW5kIHJlZnJlc2ggdGhlIHZpc2l0ZWQgaW5kaWNhdG9ycyAoR0FQLTI2OSlcbiAgaWYgKF9DVVNUT01JU0VfVEFCUy5oYXModGFiKSkge1xuICAgIF92aXNpdGVkQ3VzdG9taXNlVGFicy5hZGQodGFiKTtcbiAgICBfdXBkYXRlVmlzaXRlZFRhYkluZGljYXRvcnMoKTtcbiAgfVxuXG4gIC8vIEFubm91bmNlIHRoZSB0YWIgY2hhbmdlIHRvIHNjcmVlbiByZWFkZXJzIChHQVAtNzMpLiBDb21iaW5lZCB3aXRoIHRoZVxuICAvLyBzdGFnZSBuYW1lIChHQVAtMTYgUGFydCBBKSBpbnRvIGEgc2luZ2xlIG1lc3NhZ2UgZnJvbSB0aGlzIG9uZSBjYWxsIHNpdGVcbiAgLy8gXHUyMDE0ICN0YWItc3RhZ2UtbGFiZWwgaXMgYSB2aXNpYmxlLW9ubHkgbGFiZWwsIG5vdCBhIHNlY29uZCBsaXZlIHJlZ2lvbiwgdG9cbiAgLy8gYXZvaWQgYSBkb3VibGUtYW5ub3VuY2Ugb2YgdGhlIHNhbWUgbmF2aWdhdGlvbiBldmVudC5cbiAgY29uc3QgYW5ub3VuY2VyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3dvcmtmbG93LXN0YWdlLWFubm91bmNlcicpO1xuICBpZiAoYW5ub3VuY2VyICYmIGFjdGl2ZVRhYikge1xuICAgIGNvbnN0IHN0YWdlTGFiZWwgPSBfc3dpdGNoVGFiU3RhZ2UgPyBfU1RFUF9ESVNQTEFZW19zd2l0Y2hUYWJTdGFnZV0gOiBudWxsO1xuICAgIGNvbnN0IHRhYkxhYmVsID0gYWN0aXZlVGFiLnRleHRDb250ZW50LnRyaW0oKTtcbiAgICBjb25zdCBtZXNzYWdlID0gc3RhZ2VMYWJlbCA/IGBOb3cgdmlld2luZzogJHtzdGFnZUxhYmVsfSBcdTIwMTQgJHt0YWJMYWJlbH1gIDogYE5vdyB2aWV3aW5nOiAke3RhYkxhYmVsfWA7XG4gICAgYW5ub3VuY2VyLnRleHRDb250ZW50ID0gJyc7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7IGFubm91bmNlci50ZXh0Q29udGVudCA9IG1lc3NhZ2U7IH0sIDUwKTtcbiAgfVxuXG4gIC8vIFN5bmMgdmlldy1jdXJzb3IgcmluZyB0byB0aGUgbmV3bHkgdmlzaWJsZSB0YWJcbiAgaWYgKHR5cGVvZiBfdXBkYXRlVmlld2luZ0luZGljYXRvciA9PT0gJ2Z1bmN0aW9uJykgX3VwZGF0ZVZpZXdpbmdJbmRpY2F0b3IodGFiKTtcblxuICAvLyBBbGwgdGFicyBleGNlcHQgJ2N2JyB1c2UgZnVsbC13aWR0aCBsYXlvdXQgKG5vIHBhcGVyLXNpemVkIGNlbnRlcmluZylcbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIGNvbnRlbnQuY2xhc3NMaXN0LnRvZ2dsZSgnZnVsbC13aWR0aCcsIHRhYiAhPT0gJ2dlbmVyYXRlJyk7XG5cbiAgLy8gTG9hZCBjb250ZW50IGZvciB0YWJcbiAgbG9hZFRhYkNvbnRlbnQodGFiKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9hZFRhYkNvbnRlbnQodGFiKSB7XG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9jdW1lbnQtY29udGVudCcpO1xuICBjb25zdCB0YWJEYXRhID0gZW5zdXJlVGFiRGF0YVN0YXRlKCk7XG5cbiAgdHJ5IHtcbiAgc3dpdGNoICh0YWIpIHtcbiAgICBjYXNlICdqb2InOlxuICAgICAgYXdhaXQgcG9wdWxhdGVKb2JUYWIoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2dvYWxzJzpcbiAgICAgIGlmICh0eXBlb2YgcG9wdWxhdGVHb2Fsc1RhYiA9PT0gJ2Z1bmN0aW9uJykgYXdhaXQgcG9wdWxhdGVHb2Fsc1RhYigpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYW5hbHlzaXMnOlxuICAgICAgaWYgKHRhYkRhdGEuYW5hbHlzaXMpIHtcbiAgICAgICAgcG9wdWxhdGVBbmFseXNpc1RhYih0YWJEYXRhLmFuYWx5c2lzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJlbXB0eS1zdGF0ZVwiPjxkaXYgY2xhc3M9XCJpY29uXCI+XHVEODNEXHVERDBEPC9kaXY+PGgzPkpvYiBBbmFseXNpczwvaDM+PHA+Q2xpY2sgXCJBbmFseXplIEpvYlwiIHRvIGdlbmVyYXRlIGFuYWx5c2lzPC9wPjwvZGl2Pic7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdxdWVzdGlvbnMnOlxuICAgICAgcG9wdWxhdGVRdWVzdGlvbnNUYWIoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2N1c3RvbWl6YXRpb25zJzpcbiAgICAgIHN3aXRjaFRhYignZXhwLXJldmlldycpO1xuICAgICAgcmV0dXJuO1xuICAgIGNhc2UgJ2V4cC1yZXZpZXcnOlxuICAgICAgYXdhaXQgcG9wdWxhdGVSZXZpZXdUYWIoJ2V4cGVyaWVuY2VzJyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdhY2gtZWRpdG9yJzpcbiAgICAgIGF3YWl0IGJ1aWxkQWNoaWV2ZW1lbnRzRWRpdG9yKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdza2lsbHMtcmV2aWV3JzpcbiAgICAgIGF3YWl0IHBvcHVsYXRlUmV2aWV3VGFiKCdza2lsbHMnKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2FjaGlldmVtZW50cy1yZXZpZXcnOlxuICAgICAgYXdhaXQgcG9wdWxhdGVSZXZpZXdUYWIoJ2FjaGlldmVtZW50cycpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndGFnbGluZS1yZXZpZXcnOlxuICAgICAgYXdhaXQgcG9wdWxhdGVUYWdsaW5lUmV2aWV3VGFiKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdzdW1tYXJ5LXJldmlldyc6XG4gICAgICBhd2FpdCBwb3B1bGF0ZVJldmlld1RhYignc3VtbWFyeScpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAncHVibGljYXRpb25zLXJldmlldyc6XG4gICAgICBhd2FpdCBwb3B1bGF0ZVJldmlld1RhYigncHVibGljYXRpb25zJyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdhdHMtc2NvcmUnOlxuICAgICAgaWYgKHR5cGVvZiBwb3B1bGF0ZUF0c1Njb3JlVGFiID09PSAnZnVuY3Rpb24nKSBhd2FpdCBwb3B1bGF0ZUF0c1Njb3JlVGFiKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdyZXdyaXRlJzpcbiAgICAgIGlmICh3aW5kb3cuX3Jld3JpdGVQYW5lbENhY2hlKSB7XG4gICAgICAgIHJlbmRlclJld3JpdGVQYW5lbChcbiAgICAgICAgICB3aW5kb3cuX3Jld3JpdGVQYW5lbENhY2hlLnJld3JpdGVzLFxuICAgICAgICAgIHdpbmRvdy5fcmV3cml0ZVBhbmVsQ2FjaGUud2FybmluZ3MsXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250ZW50LmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwiZW1wdHktc3RhdGVcIj48ZGl2IGNsYXNzPVwiaWNvblwiPlx1MjcwRlx1RkUwRjwvZGl2PjxoMz5SZXdyaXRlczwvaDM+PHA+TG9hZGluZyByZXdyaXRlc1x1MjAyNjwvcD48L2Rpdj4nO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBhcGlDYWxsKCdHRVQnLCAnL2FwaS9yZXdyaXRlcycpO1xuICAgICAgICAgIGlmIChkYXRhLnJld3JpdGVzKSB7XG4gICAgICAgICAgICByZW5kZXJSZXdyaXRlUGFuZWwoZGF0YS5yZXdyaXRlcywgZGF0YS5wZXJzdWFzaW9uX3dhcm5pbmdzIHx8IFtdKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImVtcHR5LXN0YXRlXCI+PGRpdiBjbGFzcz1cImljb25cIj5cdTI3MEZcdUZFMEY8L2Rpdj48aDM+UmV3cml0ZXM8L2gzPjxwPkNvbXBsZXRlIGN1c3RvbWl6YXRpb25zIHRvIHJlYWNoIHRoaXMgc3RlcDwvcD48L2Rpdj4nO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJlbXB0eS1zdGF0ZVwiPjxkaXYgY2xhc3M9XCJpY29uXCI+XHUyNzBGXHVGRTBGPC9kaXY+PGgzPlJld3JpdGVzPC9oMz48cD5Db21wbGV0ZSBjdXN0b21pemF0aW9ucyB0byByZWFjaCB0aGlzIHN0ZXA8L3A+PC9kaXY+JztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZWRpdG9yJzpcbiAgICAgIGF3YWl0IHBvcHVsYXRlQ1ZFZGl0b3JUYWIoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2dlbmVyYXRlJzpcbiAgICAgIF9wb3B1bGF0ZUdlbmVyYXRlVGFiKHRhYkRhdGEuY3YsIGNvbnRlbnQpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZG93bmxvYWQnOlxuICAgICAgaWYgKHRhYkRhdGEuY3YgJiYgT2JqZWN0LmtleXModGFiRGF0YS5jdikubGVuZ3RoID4gMCkge1xuICAgICAgICBhd2FpdCBwb3B1bGF0ZURvd25sb2FkVGFiKHRhYkRhdGEuY3YpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImVtcHR5LXN0YXRlXCI+PGRpdiBjbGFzcz1cImljb25cIj5cdTJCMDdcdUZFMEY8L2Rpdj48aDM+RG93bmxvYWQ8L2gzPjxwPkdlbmVyYXRlIENWIHRvIGVuYWJsZSBkb3dubG9hZHM8L3A+PC9kaXY+JztcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3NwZWxsJzpcbiAgICAgIGF3YWl0IHBvcHVsYXRlU3BlbGxDaGVja1RhYigpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnbGF5b3V0JzpcbiAgICAgIGluaXRpYXRlTGF5b3V0SW5zdHJ1Y3Rpb25zKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdmaW5hbGlzZSc6XG4gICAgICBhd2FpdCBwb3B1bGF0ZUZpbmFsaXNlVGFiKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdoYXJ2ZXN0JzpcbiAgICAgIGlmICh0eXBlb2YgcG9wdWxhdGVIYXJ2ZXN0VGFiID09PSAnZnVuY3Rpb24nKSBhd2FpdCBwb3B1bGF0ZUhhcnZlc3RUYWIoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2ludGVydmlldy1wcmVwJzpcbiAgICAgIGlmICh0eXBlb2YgcG9wdWxhdGVJbnRlcnZpZXdQcmVwVGFiID09PSAnZnVuY3Rpb24nKSBhd2FpdCBwb3B1bGF0ZUludGVydmlld1ByZXBUYWIoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3RoYW5rLXlvdSc6XG4gICAgICBpZiAodHlwZW9mIHBvcHVsYXRlVGhhbmtZb3VUYWIgPT09ICdmdW5jdGlvbicpIGF3YWl0IHBvcHVsYXRlVGhhbmtZb3VUYWIoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ21hc3Rlcic6XG4gICAgICBhd2FpdCBwb3B1bGF0ZU1hc3RlclRhYigpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnY292ZXItbGV0dGVyJzpcbiAgICAgIGF3YWl0IHBvcHVsYXRlQ292ZXJMZXR0ZXJUYWIoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3NjcmVlbmluZyc6XG4gICAgICBhd2FpdCBwb3B1bGF0ZVNjcmVlbmluZ1RhYigpO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cuZXJyb3IoYEVycm9yIGxvYWRpbmcgdGFiICR7dGFifTpgLCBlcnJvcik7XG4gICAgLy8gdGV4dENvbnRlbnQsIG5vdCBpbm5lckhUTUwgXHUyMDE0IGEgdGhyb3duIGVycm9yIG1lc3NhZ2UgbXVzdCBuZXZlciBiZVxuICAgIC8vIGludGVycHJldGVkIGFzIEhUTUwgKGUuZy4gYW4gZXJyb3Igc3RyaW5nIGNvbnRhaW5pbmcgYSBzdHJheSA8aW1nPikuXG4gICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpO1xuICAgIGVycm9yTWVzc2FnZS5zdHlsZS5jc3NUZXh0ID0gJ3BhZGRpbmc6IDIwcHg7IGNvbG9yOiAjYzQxZTNhOyc7XG4gICAgZXJyb3JNZXNzYWdlLnRleHRDb250ZW50ID0gYEVycm9yIGxvYWRpbmcgY29udGVudDogJHtlcnJvci5tZXNzYWdlfWA7XG4gICAgY29udGVudC5hcHBlbmRDaGlsZChlcnJvck1lc3NhZ2UpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFJlc3RvcmUgdW5zYXZlZCB1c2VyIGlucHV0IGZvciB0aGUgbmV3bHkgbG9hZGVkIHRhYlxuICBfcmVzdG9yZURyYWZ0SW5wdXRzRm9yVGFiKHRhYik7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBSZXZpZXcgdGFiIChmbGF0LCBvbmUgcGFuZSBwZXIgdG9wLWxldmVsIHRhYikgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIHNob3dUYWJsZUJhc2VkUmV2aWV3KCkge1xuICBpZiAoIXdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zKSB7XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ05vIHJlY29tbWVuZGF0aW9ucyB0byByZXZpZXcuIFBsZWFzZSBnZW5lcmF0ZSBjdXN0b21pemF0aW9ucyBmaXJzdC4nKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBzd2l0Y2hUYWIoJ2V4cC1yZXZpZXcnKTtcbiAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ1x1MjcwNSBDdXN0b21pemF0aW9ucyBnZW5lcmF0ZWQhIFBsZWFzZSByZXZpZXcgZWFjaCBzZWN0aW9uIGluIHRoZSAqKkN1c3RvbWl6YXRpb25zKiogdGFiIFx1MjAxNCBFeHBlcmllbmNlcywgQWNoaWV2ZW1lbnRzLCBTa2lsbHMsIFN1bW1hcnksIGFuZCBQdWJsaWNhdGlvbnMuIFNlbGVjdCB5b3VyIHByZWZlcmVuY2VzIHVzaW5nIHRoZSBhY3Rpb24gYnV0dG9ucywgdGhlbiBzdWJtaXQgeW91ciBkZWNpc2lvbnMuJyk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBBbmFseXNpcyB0YWIgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8vIENhY2hlZCBzeW5vbnltIG1hcDogYWxpYXMgKGxvd2VyKSBcdTIxOTIgY2Fub25pY2FsLCBhbmQgY2Fub25pY2FsIChsb3dlcikgXHUyMTkyIFthbGlhc2VzXVxubGV0IF9zeW5vbnltTWFwQ2FjaGUgPSBudWxsO1xuYXN5bmMgZnVuY3Rpb24gX2xvYWRTeW5vbnltTWFwKCkge1xuICBpZiAoX3N5bm9ueW1NYXBDYWNoZSkgcmV0dXJuIF9zeW5vbnltTWFwQ2FjaGU7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2Vzc2lvbklkID0gc3RhdGVNYW5hZ2VyLmdldFNlc3Npb25JZCAmJiBzdGF0ZU1hbmFnZXIuZ2V0U2Vzc2lvbklkKCk7XG4gICAgY29uc3QgdXJsID0gc2Vzc2lvbklkID8gYC9hcGkvc3lub255bS1tYXA/c2Vzc2lvbl9pZD0ke2VuY29kZVVSSUNvbXBvbmVudChzZXNzaW9uSWQpfWAgOiAnL2FwaS9zeW5vbnltLW1hcCc7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgaWYgKCFyZXMub2spIHJldHVybiAoX3N5bm9ueW1NYXBDYWNoZSA9IHt9KTtcbiAgICBjb25zdCByYXcgID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBjb25zdCBhbGlhc1RvQ2Fub24gPSB7fTtcbiAgICBjb25zdCBjYW5vblRvQWxpYXNlcyA9IHt9O1xuICAgIE9iamVjdC5lbnRyaWVzKHJhdykuZm9yRWFjaCgoW2FsaWFzLCBjYW5vbl0pID0+IHtcbiAgICAgIGFsaWFzVG9DYW5vblthbGlhcy50b0xvd2VyQ2FzZSgpXSA9IGNhbm9uO1xuICAgICAgY29uc3QgY2wgPSBjYW5vbi50b0xvd2VyQ2FzZSgpO1xuICAgICAgKGNhbm9uVG9BbGlhc2VzW2NsXSA9IGNhbm9uVG9BbGlhc2VzW2NsXSB8fCBbXSkucHVzaChhbGlhcyk7XG4gICAgfSk7XG4gICAgX3N5bm9ueW1NYXBDYWNoZSA9IHsgYWxpYXNUb0Nhbm9uLCBjYW5vblRvQWxpYXNlcyB9O1xuICB9IGNhdGNoIChfKSB7IF9zeW5vbnltTWFwQ2FjaGUgPSB7fTsgfVxuICByZXR1cm4gX3N5bm9ueW1NYXBDYWNoZTtcbn1cblxuZnVuY3Rpb24gX2t3U3lub255bUFubm90YXRpb24oa3csIHN5bk1hcCkge1xuICBpZiAoIXN5bk1hcCB8fCAoIXN5bk1hcC5hbGlhc1RvQ2Fub24gJiYgIXN5bk1hcC5jYW5vblRvQWxpYXNlcykpIHJldHVybiAnJztcbiAgY29uc3Qga2wgPSBrdy50b0xvd2VyQ2FzZSgpO1xuICAvLyBJcyBrdyBhbiBhbGlhcz8gU2hvdyBjYW5vbmljYWwgZm9ybS5cbiAgaWYgKHN5bk1hcC5hbGlhc1RvQ2Fub25ba2xdKSByZXR1cm4gYCA9ICR7c3luTWFwLmFsaWFzVG9DYW5vbltrbF19YDtcbiAgLy8gSXMga3cgYSBjYW5vbmljYWwgZm9ybT8gU2hvdyBhbGlhc2VzLlxuICBjb25zdCBhbGlhc2VzID0gc3luTWFwLmNhbm9uVG9BbGlhc2VzICYmIHN5bk1hcC5jYW5vblRvQWxpYXNlc1trbF07XG4gIGlmIChhbGlhc2VzICYmIGFsaWFzZXMubGVuZ3RoKSByZXR1cm4gYCAoJHthbGlhc2VzLmpvaW4oJywgJyl9KWA7XG4gIHJldHVybiAnJztcbn1cblxuYXN5bmMgZnVuY3Rpb24gcG9wdWxhdGVBbmFseXNpc1RhYihyZXN1bHQpIHtcbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIHRyeSB7XG4gICAgLy8gcmVzdWx0IG1heSBhbHJlYWR5IGJlIGEgcGFyc2VkIG9iamVjdCAoZS5nLiBjb21pbmcgZnJvbSBzdGF0ZU1hbmFnZXIpIG9yIGFcbiAgICAvLyByYXcgSlNPTiBzdHJpbmcuICBjbGVhbkpzb25SZXNwb25zZSBvbmx5IGhhbmRsZXMgc3RyaW5ncywgc28gc2tpcCBpdCB3aGVuXG4gICAgLy8gdGhlIHZhbHVlIGlzIGFscmVhZHkgYW4gb2JqZWN0IHRvIGF2b2lkIFwiY2xlYW5lZC5yZXBsYWNlIGlzIG5vdCBhIGZ1bmN0aW9uXCIuXG4gICAgbGV0IGRhdGE7XG4gICAgaWYgKHJlc3VsdCAhPT0gbnVsbCAmJiB0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0Jykge1xuICAgICAgZGF0YSA9IHJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY2xlYW5SZXN1bHQgPSBjbGVhbkpzb25SZXNwb25zZShyZXN1bHQpO1xuICAgICAgZGF0YSA9IHR5cGVvZiBjbGVhblJlc3VsdCA9PT0gJ3N0cmluZycgPyBKU09OLnBhcnNlKGNsZWFuUmVzdWx0KSA6IGNsZWFuUmVzdWx0O1xuICAgIH1cblxuICAgIC8vIFBlcnNpc3Qgb25seSBhZnRlciB0aGUgYW5hbHlzaXMgcGF5bG9hZCBoYXMgYmVlbiB2YWxpZGF0ZWQuXG4gICAgc3RhdGVNYW5hZ2VyLnNldFRhYkRhdGEoJ2FuYWx5c2lzJywgcmVzdWx0KTtcbiAgICBzYXZlVGFiRGF0YSgpO1xuXG4gICAgLy8gXHUyNTAwXHUyNTAwIFNlY3Rpb24gMTogUm9sZSAmIERvbWFpbiBjYXJkIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIGxldCBodG1sID0gJzxkaXYgY2xhc3M9XCJhbmFseXNpcy1wYWdlXCI+JztcbiAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwiYW5hbHlzaXMtcm9sZS1jYXJkXCI+JztcbiAgICBodG1sICs9IGA8aDE+JHtkYXRhLnRpdGxlIHx8ICdSb2xlJ308L2gxPmA7XG4gICAgaWYgKGRhdGEuY29tcGFueSkgaHRtbCArPSBgPHAgY2xhc3M9XCJjb21wYW55XCI+XHVEODNDXHVERkUyICR7ZGF0YS5jb21wYW55fTwvcD5gO1xuICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJtZXRhXCI+JztcbiAgICBpZiAoZGF0YS5kb21haW4pIHtcbiAgICAgIGNvbnN0IGNvbmYgPSBkYXRhLmRvbWFpbl9jb25maWRlbmNlO1xuICAgICAgbGV0IGNvbmZMYWJlbCA9ICcnO1xuICAgICAgbGV0IGNvbmZUaXRsZSA9ICcnO1xuICAgICAgaWYgKHR5cGVvZiBjb25mID09PSAnbnVtYmVyJykge1xuICAgICAgICBpZiAoY29uZiA+PSAwLjgpIHsgY29uZkxhYmVsID0gJyc7IGNvbmZUaXRsZSA9IGBEb21haW4gY29uZmlkZW5jZTogSGlnaCAoJHtNYXRoLnJvdW5kKGNvbmYgKiAxMDApfSUpYDsgfVxuICAgICAgICBlbHNlIGlmIChjb25mID49IDAuNikgeyBjb25mTGFiZWwgPSAnIFx1MjZBMCc7IGNvbmZUaXRsZSA9IGBEb21haW4gY29uZmlkZW5jZTogTWVkaXVtICgke01hdGgucm91bmQoY29uZiAqIDEwMCl9JSkgXHUyMDE0IHZlcmlmeSB0aGlzIGlzIGNvcnJlY3RgOyB9XG4gICAgICAgIGVsc2UgeyBjb25mTGFiZWwgPSAnIFx1MjZBMCc7IGNvbmZUaXRsZSA9IGBEb21haW4gY29uZmlkZW5jZTogTG93ICgke01hdGgucm91bmQoY29uZiAqIDEwMCl9JSkgXHUyMDE0IHRoZSBKRCBzcGFucyBtdWx0aXBsZSBkb21haW5zOyBjb25zaWRlciBvdmVycmlkaW5nYDsgfVxuICAgICAgfVxuICAgICAgaHRtbCArPSBgPHNwYW4gY2xhc3M9XCJtZXRhLWNoaXBcIiB0aXRsZT1cIiR7ZXNjYXBlSHRtbChjb25mVGl0bGUgfHwgJ0luZmVycmVkIHRlY2huaWNhbCBkb21haW4nKX1cIj5cdUQ4M0RcdUREMkMgJHtlc2NhcGVIdG1sKGRhdGEuZG9tYWluKX0ke2NvbmZMYWJlbH08L3NwYW4+YDtcbiAgICB9XG4gICAgaWYgKGRhdGEucm9sZV9sZXZlbCkgaHRtbCArPSBgPHNwYW4gY2xhc3M9XCJtZXRhLWNoaXBcIj5cdUQ4M0RcdURDQ0EgJHtkYXRhLnJvbGVfbGV2ZWx9PC9zcGFuPmA7XG4gICAgaWYgKGRhdGEuc3VnZ2VzdGVkX3N1bW1hcnkpIGh0bWwgKz0gYDxzcGFuIGNsYXNzPVwibWV0YS1jaGlwXCI+XHVEODNEXHVEQ0FDICR7ZGF0YS5zdWdnZXN0ZWRfc3VtbWFyeX08L3NwYW4+YDtcbiAgICBodG1sICs9ICc8L2Rpdj48L2Rpdj4nO1xuXG4gICAgLy8gXHUyNTAwXHUyNTAwIE1pc21hdGNoIGNhbGxvdXQgKGNvbXB1dGVkIGZyb20gbWFzdGVyIHNraWxscykgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgY29uc3QgcmVxdWlyZWRTa2lsbHMgPSBBcnJheS5pc0FycmF5KGRhdGEucmVxdWlyZWRfc2tpbGxzKSA/IGRhdGEucmVxdWlyZWRfc2tpbGxzIDogW107XG4gICAgY29uc3QgbWFzdGVyU2tpbGxzID0gd2luZG93Ll9tYXN0ZXJTa2lsbHMgfHwgW107XG4gICAgaWYgKHJlcXVpcmVkU2tpbGxzLmxlbmd0aCA+IDAgJiYgbWFzdGVyU2tpbGxzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG1pc3NpbmcgPSByZXF1aXJlZFNraWxscy5maWx0ZXIoc2tpbGwgPT5cbiAgICAgICAgIW1hc3RlclNraWxscy5zb21lKG1zID0+IG1zLmluY2x1ZGVzKHNraWxsLnRvTG93ZXJDYXNlKCkpIHx8IHNraWxsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobXMpKVxuICAgICAgKTtcbiAgICAgIGlmIChtaXNzaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaHRtbCArPSBgPGRpdiBjbGFzcz1cIm1pc21hdGNoLWNhbGxvdXRcIj5cdTI2QTAgPHN0cm9uZz4ke21pc3NpbmcubGVuZ3RofSByZXF1aXJlZCBza2lsbCR7bWlzc2luZy5sZW5ndGggPiAxID8gJ3MnIDogJyd9IG5vdCBmb3VuZCBpbiB5b3VyIG1hc3RlciBDVjo8L3N0cm9uZz4gJHttaXNzaW5nLmpvaW4oJywgJyl9PC9kaXY+YDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgU2VjdGlvbiAyOiBSZXF1aXJlZCBTa2lsbHMgZ3JpZCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICBpZiAocmVxdWlyZWRTa2lsbHMubGVuZ3RoID4gMCkge1xuICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cImFuYWx5c2lzLXNlY3Rpb25cIj48aDI+XHVEODNDXHVERkFGIFJlcXVpcmVkIFNraWxsczwvaDI+PGRpdiBjbGFzcz1cInNraWxsLWdyaWRcIj4nO1xuICAgICAgcmVxdWlyZWRTa2lsbHMuZm9yRWFjaChza2lsbCA9PiB7XG4gICAgICAgIGNvbnN0IGlzTWlzc2luZyA9IG1hc3RlclNraWxscy5sZW5ndGggPiAwICYmICFtYXN0ZXJTa2lsbHMuc29tZShcbiAgICAgICAgICBtcyA9PiBtcy5pbmNsdWRlcyhza2lsbC50b0xvd2VyQ2FzZSgpKSB8fCBza2lsbC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKG1zKVxuICAgICAgICApO1xuICAgICAgICBodG1sICs9IGA8c3BhbiBjbGFzcz1cInNraWxsLWJhZGdlJHtpc01pc3NpbmcgPyAnIG1pc3NpbmcnIDogJyd9XCIgdGl0bGU9XCIke2lzTWlzc2luZyA/ICdOb3QgaW4gbWFzdGVyIENWJyA6ICdGb3VuZCBpbiBtYXN0ZXIgQ1YnfVwiPiR7c2tpbGx9JHtpc01pc3NpbmcgPyAnPHNwYW4gY2xhc3M9XCJzci1vbmx5XCI+IChub3QgaW4gbWFzdGVyIENWKTwvc3Bhbj4nIDogJyd9PC9zcGFuPmA7XG4gICAgICB9KTtcbiAgICAgIGh0bWwgKz0gJzwvZGl2PjwvZGl2Pic7XG4gICAgfVxuXG4gICAgLy8gXHUyNTAwXHUyNTAwIFNlY3Rpb24gMzogUHJlZmVycmVkIC8gTmljZS10by1IYXZlIGxpc3QgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgY29uc3QgcHJlZmVycmVkID0gW1xuICAgICAgLi4uKEFycmF5LmlzQXJyYXkoZGF0YS5wcmVmZXJyZWRfc2tpbGxzKSA/IGRhdGEucHJlZmVycmVkX3NraWxscyA6IFtdKSxcbiAgICAgIC4uLihBcnJheS5pc0FycmF5KGRhdGEubmljZV90b19oYXZlX3JlcXVpcmVtZW50cykgPyBkYXRhLm5pY2VfdG9faGF2ZV9yZXF1aXJlbWVudHMgOiBbXSksXG4gICAgXTtcbiAgICBpZiAocHJlZmVycmVkLmxlbmd0aCA+IDApIHtcbiAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJhbmFseXNpcy1zZWN0aW9uXCI+PGgyPlx1MkI1MCBQcmVmZXJyZWQgLyBOaWNlLXRvLUhhdmU8L2gyPjx1bCBjbGFzcz1cInByZWZlcnJlZC1saXN0XCI+JztcbiAgICAgIHByZWZlcnJlZC5mb3JFYWNoKGl0ZW0gPT4geyBodG1sICs9IGA8bGk+JHtpdGVtfTwvbGk+YDsgfSk7XG4gICAgICBodG1sICs9ICc8L3VsPjwvZGl2Pic7XG4gICAgfVxuXG4gICAgLy8gXHUyNTAwXHUyNTAwIFNlY3Rpb24gNDogQVRTIEtleXdvcmRzIHdpdGggcmFuayBiYWRnZXMgYW5kIHN5bm9ueW0gYW5ub3RhdGlvbnMgXHUyNTAwXHUyNTAwXG4gICAgY29uc3QgYXRzS3dzID0gQXJyYXkuaXNBcnJheShkYXRhLmF0c19rZXl3b3JkcykgPyBkYXRhLmF0c19rZXl3b3JkcyA6IFtdO1xuICAgIGlmIChhdHNLd3MubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgc3luTWFwID0gYXdhaXQgX2xvYWRTeW5vbnltTWFwKCk7XG4gICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwiYW5hbHlzaXMtc2VjdGlvblwiPjxoMj5cdUQ4M0RcdUREMTEgQVRTIEtleXdvcmRzIDxzbWFsbCBzdHlsZT1cImZvbnQtd2VpZ2h0OjQwMDtjb2xvcjojNjQ3NDhiO2ZvbnQtc2l6ZToxMnB4O1wiPihoaWdoZXIgcmFuayA9IGhpZ2hlciBwcmlvcml0eSk8L3NtYWxsPjwvaDI+PGRpdiBjbGFzcz1cImt3LWJhZGdlc1wiPic7XG4gICAgICBhdHNLd3MuZm9yRWFjaCgoa3csIGlkeCkgPT4ge1xuICAgICAgICBjb25zdCBhbm5vdGF0aW9uID0gX2t3U3lub255bUFubm90YXRpb24oa3csIHN5bk1hcCk7XG4gICAgICAgIGNvbnN0IHRpdGxlQXR0ciAgPSBhbm5vdGF0aW9uID8gYCB0aXRsZT1cIlN5bm9ueW06ICR7ZXNjYXBlSHRtbChrdyArIGFubm90YXRpb24pfVwiYCA6ICcnO1xuICAgICAgICBjb25zdCBhbm5vdEh0bWwgID0gYW5ub3RhdGlvbiA/IGA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZToxMHB4O2NvbG9yOiM2NDc0OGI7bWFyZ2luLWxlZnQ6M3B4O1wiPiR7ZXNjYXBlSHRtbChhbm5vdGF0aW9uKX08L3NwYW4+YCA6ICcnO1xuICAgICAgICBodG1sICs9IGA8c3BhbiBjbGFzcz1cImt3LWJhZGdlXCIke3RpdGxlQXR0cn0+PHNwYW4gY2xhc3M9XCJrdy1yYW5rXCI+IyR7aWR4ICsgMX08L3NwYW4+JHtlc2NhcGVIdG1sKGt3KX0ke2Fubm90SHRtbH08L3NwYW4+YDtcbiAgICAgIH0pO1xuICAgICAgaHRtbCArPSAnPC9kaXY+PC9kaXY+JztcbiAgICB9XG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgQ3VsdHVyZSBpbmRpY2F0b3JzIChvcHRpb25hbCkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgY29uc3QgY3VsdHVyZSA9IEFycmF5LmlzQXJyYXkoZGF0YS5jdWx0dXJlX2luZGljYXRvcnMpID8gZGF0YS5jdWx0dXJlX2luZGljYXRvcnMgOiBbXTtcbiAgICBpZiAoY3VsdHVyZS5sZW5ndGggPiAwKSB7XG4gICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwiYW5hbHlzaXMtc2VjdGlvblwiPjxoMj5cdUQ4M0NcdURGRTIgQ3VsdHVyZSBJbmRpY2F0b3JzPC9oMj48dWwgY2xhc3M9XCJwcmVmZXJyZWQtbGlzdFwiPic7XG4gICAgICBjdWx0dXJlLmZvckVhY2goYyA9PiB7IGh0bWwgKz0gYDxsaT4ke2N9PC9saT5gOyB9KTtcbiAgICAgIGh0bWwgKz0gJzwvdWw+PC9kaXY+JztcbiAgICB9XG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgTXVzdC1oYXZlIHJlcXVpcmVtZW50cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICBjb25zdCBtdXN0SGF2ZSA9IEFycmF5LmlzQXJyYXkoZGF0YS5tdXN0X2hhdmVfcmVxdWlyZW1lbnRzKSA/IGRhdGEubXVzdF9oYXZlX3JlcXVpcmVtZW50cyA6IFtdO1xuICAgIGlmIChtdXN0SGF2ZS5sZW5ndGggPiAwKSB7XG4gICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwiYW5hbHlzaXMtc2VjdGlvblwiPjxoMj5cdTI3MDUgTXVzdC1IYXZlIFJlcXVpcmVtZW50czwvaDI+PHVsIGNsYXNzPVwicHJlZmVycmVkLWxpc3RcIj4nO1xuICAgICAgbXVzdEhhdmUuZm9yRWFjaChyID0+IHsgaHRtbCArPSBgPGxpPiR7cn08L2xpPmA7IH0pO1xuICAgICAgaHRtbCArPSAnPC91bD48L2Rpdj4nO1xuICAgIH1cblxuICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJuYXYtYnV0dG9ucyBuYXYtZW5kXCI+PGJ1dHRvbiBjbGFzcz1cImNvbnRpbnVlLWJ0blwiIG9uY2xpY2s9XCJzZW5kQWN0aW9uKFxcdTAwMjdyZWNvbW1lbmRfY3VzdG9taXphdGlvbnNcXHUwMDI3KVwiPkNvbnRpbnVlIHRvIEN1c3RvbWl6YXRpb25zIFx1MjE5MjwvYnV0dG9uPjwvZGl2Pic7XG4gICAgaHRtbCArPSAnPC9kaXY+JzsgLy8gLmFuYWx5c2lzLXBhZ2VcbiAgICBjb250ZW50LmlubmVySFRNTCA9IGh0bWw7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2cuZXJyb3IoJ0FuYWx5c2lzIHBhcnNpbmcgZXJyb3I6JywgZSwgJ09yaWdpbmFsIHJlc3VsdDonLCByZXN1bHQpO1xuICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJlbXB0eS1zdGF0ZVwiPjxkaXYgY2xhc3M9XCJpY29uXCI+XHUyNzRDPC9kaXY+PGgzPkFuYWx5c2lzIEVycm9yPC9oMz48cD5Db3VsZCBub3QgcGFyc2UgYW5hbHlzaXMgcmVzdWx0czogJHtlc2NhcGVIdG1sKGUubWVzc2FnZSl9PC9wPjxkZXRhaWxzPjxzdW1tYXJ5PkRlYnVnIEluZm88L3N1bW1hcnk+PHByZT4ke2VzY2FwZUh0bWwoSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKSl9PC9wcmU+PC9kZXRhaWxzPjwvZGl2PmA7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIEN1c3RvbWl6YXRpb24gcmVzcG9uc2UgaGFuZGxlciBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gaGFuZGxlQ3VzdG9taXphdGlvblJlc3BvbnNlKHJlc3BvbnNlKSB7XG4gIHRyeSB7XG4gICAgLy8gQWNjZXB0IGEgcHJlLXBhcnNlZCBvYmplY3Qgb3IgYSByYXcgc3RyaW5nIChwYXJzZSBhdCBib3VuZGFyeSkuXG4gICAgY29uc3QgZGF0YSA9IChyZXNwb25zZSAhPT0gbnVsbCAmJiB0eXBlb2YgcmVzcG9uc2UgPT09ICdvYmplY3QnKVxuICAgICAgPyByZXNwb25zZVxuICAgICAgOiBleHRyYWN0Rmlyc3RKc29uT2JqZWN0KHJlc3BvbnNlKTtcbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIHR5cGVvZiByZXNwb25zZSA9PT0gJ3N0cmluZycgPyByZXNwb25zZSA6ICcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZGF0YSAmJiAoZGF0YS5yZWNvbW1lbmRlZF9leHBlcmllbmNlcyB8fCBkYXRhLnJlY29tbWVuZGVkX3NraWxscykpIHtcbiAgICAgIHN0YXRlTWFuYWdlci5zZXRUYWJEYXRhKCdjdXN0b21pemF0aW9ucycsIGRhdGEpO1xuICAgICAgd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnMgPSBkYXRhO1xuICAgICAgc2F2ZVRhYkRhdGEoKTtcblxuICAgICAgaWYgKCFpc1JlY29ubmVjdEluUHJvZ3Jlc3MoKSkge1xuICAgICAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCAnXHUyNzA1IEN1c3RvbWl6YXRpb25zIGdlbmVyYXRlZCEgUGxlYXNlIHJldmlldyBlYWNoIHNlY3Rpb24gaW4gdGhlICoqQ3VzdG9taXphdGlvbnMqKiB0YWIgXHUyMDE0IEV4cGVyaWVuY2VzLCBBY2hpZXZlbWVudHMsIFNraWxscywgU3VtbWFyeSwgYW5kIFB1YmxpY2F0aW9ucy4gU2VsZWN0IHlvdXIgcHJlZmVyZW5jZXMgdXNpbmcgdGhlIGFjdGlvbiBidXR0b25zLCB0aGVuIHN1Ym1pdCB5b3VyIGRlY2lzaW9ucy4nKTtcbiAgICAgICAgc3dpdGNoVGFiKCdleHAtcmV2aWV3Jyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghaXNSZWNvbm5lY3RJblByb2dyZXNzKCkpIHtcbiAgICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIHJlc3BvbnNlKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2cuZXJyb3IoJ0N1c3RvbWl6YXRpb24gcmVzcG9uc2UgZXJyb3I6JywgZSk7XG4gICAgaWYgKCFpc1JlY29ubmVjdEluUHJvZ3Jlc3MoKSkge1xuICAgICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgcmVzcG9uc2UpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFN5bmMgdGhlIHNraWxscy10aXRsZSBzZWxlY3QvY3VzdG9tLWlucHV0IGNvbnRyb2xzIHRvIGEgZ2l2ZW4gdGl0bGUgdmFsdWUsXG4gKiBhbmQgYXR0YWNoIGNoYW5nZSBsaXN0ZW5lcnMgc28gdXBkYXRlcyBhcmUgc2F2ZWQgdmlhIHRoZSBBUEkuXG4gKiBkdWNrZmxvdzpcbiAqICAgaWQ6IGdlbmVyYXRpb25fc2V0dGluZ3Mud2ViX3Jldmlld190YWJsZV9iYXNlLkwzMzBcbiAqICAga2luZDogdWlcbiAqICAgdGltZXN0YW1wOiAnMjAyNi0wMy0yN1QwMToyMzoyOFonXG4gKiAgIHN0YXR1czogbGl2ZVxuICogICBoYW5kbGVzOlxuICogICAtIHVpOmdlbmVyYXRpb24tc2V0dGluZ3Muc3luYy1za2lsbHMtdGl0bGVcbiAqICAgY2FsbHM6XG4gKiAgIC0gUE9TVCAvYXBpL2dlbmVyYXRpb24tc2V0dGluZ3NcbiAqICAgcmVhZHM6XG4gKiAgIC0gcmVzcG9uc2U6R0VUIC9hcGkvc3RhdHVzLnNraWxsc19zZWN0aW9uX3RpdGxlXG4gKiAgIHdyaXRlczpcbiAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9nZW5lcmF0aW9uLXNldHRpbmdzLnNraWxsc19zZWN0aW9uX3RpdGxlXG4gKiAgIG5vdGVzOiBLZWVwcyB0aGUgVUkgc2tpbGxzLXRpdGxlIGNvbnRyb2xzIGluIHN5bmMgd2l0aCBzdGF0dXMgZGF0YSBhbmQgcGVyc2lzdHMgdGl0bGUgY2hhbmdlcyBiYWNrIHRvIHRoZSBzZXNzaW9uIHNldHRpbmdzIHJvdXRlLlxuICovXG5mdW5jdGlvbiBfc3luY1NraWxsc1RpdGxlQ29udHJvbHMoY3VycmVudFRpdGxlKSB7XG4gIGNvbnN0IGtub3duT3B0aW9ucyA9IFsnU2tpbGxzJywgJ1RlY2huaWNhbCBTa2lsbHMnLCAnS2V5IFNraWxscycsICdDb3JlIFNraWxscyddO1xuICBjb25zdCBzZWwgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NraWxscy10aXRsZS1zZWxlY3QnKTtcbiAgY29uc3QgY3VzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbHMtdGl0bGUtY3VzdG9tJyk7XG4gIGlmICghc2VsKSByZXR1cm47XG5cbiAgY29uc3QgaXNLbm93biA9IGtub3duT3B0aW9ucy5pbmNsdWRlcyhjdXJyZW50VGl0bGUpO1xuICBpZiAoaXNLbm93bikge1xuICAgIHNlbC52YWx1ZSA9IGN1cnJlbnRUaXRsZTtcbiAgICBpZiAoY3VzdCkgY3VzdC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICB9IGVsc2Uge1xuICAgIHNlbC52YWx1ZSA9ICdfX2N1c3RvbV9fJztcbiAgICBpZiAoY3VzdCkge1xuICAgICAgY3VzdC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICBjdXN0LnZhbHVlID0gY3VycmVudFRpdGxlO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHNhdmVUaXRsZSA9IGFzeW5jICh0aXRsZSkgPT4ge1xuICAgIHRyeSB7IGF3YWl0IGFwaUNhbGwoJ1BPU1QnLCAnL2FwaS9nZW5lcmF0aW9uLXNldHRpbmdzJywgeyBza2lsbHNfc2VjdGlvbl90aXRsZTogdGl0bGUgfSk7IH1cbiAgICBjYXRjaCAoZSkgeyBsb2cud2FybignRmFpbGVkIHRvIHNhdmUgc2tpbGxzX3NlY3Rpb25fdGl0bGUgc2V0dGluZzonLCBlKTsgfVxuICB9O1xuXG4gIHNlbC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgaWYgKHNlbC52YWx1ZSA9PT0gJ19fY3VzdG9tX18nKSB7XG4gICAgICBpZiAoY3VzdCkgeyBjdXN0LnN0eWxlLmRpc3BsYXkgPSAnJzsgY3VzdC5mb2N1cygpOyB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChjdXN0KSBjdXN0LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICBzYXZlVGl0bGUoc2VsLnZhbHVlKTtcbiAgICB9XG4gIH0pO1xuXG4gIGlmIChjdXN0KSB7XG4gICAgY3VzdC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCB2ID0gY3VzdC52YWx1ZS50cmltKCk7XG4gICAgICBpZiAodikgc2F2ZVRpdGxlKHYpO1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogUmVuZGVycyBvbmUgb2YgdGhlIDUgcmV2aWV3IHBhbmVzIGFzIGEgdG9wLWxldmVsIHRhYi5cbiAqIFJlcGxhY2VzIHRoZSBvbGQgc3ViLXRhYiBhcHByb2FjaCB3aXRoIGEgZmxhdCBzaW5nbGUtbGV2ZWwgdGFiIHN0cnVjdHVyZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcG9wdWxhdGVSZXZpZXdUYWIocGFuZSkge1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgY29uc3QgY3VzdG9taXphdGlvbnMgPSBzdGF0ZU1hbmFnZXIuZ2V0VGFiRGF0YSgnY3VzdG9taXphdGlvbnMnKTtcblxuICBpZiAoIXdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zIHx8ICFjdXN0b21pemF0aW9ucykge1xuICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJlbXB0eS1zdGF0ZVwiPjxkaXYgY2xhc3M9XCJpY29uXCI+XHUyNjk5XHVGRTBGPC9kaXY+PGgzPlJldmlldyBDdXN0b21pemF0aW9uczwvaDM+PHA+Q2xpY2sgXCJSZWNvbW1lbmQgQ3VzdG9taXphdGlvbnNcIiB0byBnZW5lcmF0ZSByZWNvbW1lbmRhdGlvbnMuPC9wPjwvZGl2Pic7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcGFuZUNvbmZpZyA9IHtcbiAgICBleHBlcmllbmNlczogICB7IHRpdGxlOiAnJywgZGVzYzogJ1NvcnRlZCBieSBkYXRlIChtb3N0IHJlY2VudCBmaXJzdCkuIENsaWNrIGFjdGlvbiBidXR0b25zIHRvIG92ZXJyaWRlIHJlY29tbWVuZGF0aW9ucy4nLCAgICAgICAgIGNvbnRhaW5lcjogJ2V4cGVyaWVuY2UtdGFibGUtY29udGFpbmVyJyAgIH0sXG4gICAgc2tpbGxzOiAgICAgICAgeyB0aXRsZTogJ1x1RDgzRFx1REVFMFx1RkUwRiBTa2lsbHMnLCAgICAgICAgICAgZGVzYzogJ1NvcnRlZCBieSByZWxldmFuY2UuIFNlbGVjdCBob3cgdG8gZmVhdHVyZSBlYWNoIHNraWxsLicsICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXI6ICdza2lsbHMtdGFibGUtY29udGFpbmVyJyAgICAgICB9LFxuICAgIGFjaGlldmVtZW50czogIHsgdGl0bGU6ICdcdUQ4M0NcdURGQzYgQWNoaWV2ZW1lbnRzJywgICAgICBkZXNjOiAnU2VsZWN0IGhvdyB0byBmZWF0dXJlIGVhY2gga2V5IGFjaGlldmVtZW50LiBBSSByZWNvbW1lbmRhdGlvbnMgYXJlIHByZS1zZWxlY3RlZC4nLCAgY29udGFpbmVyOiAnYWNoaWV2ZW1lbnRzLXRhYmxlLWNvbnRhaW5lcicgIH0sXG4gICAgc3VtbWFyeTogICAgICAgeyB0aXRsZTogJ1x1RDgzRFx1RENERCBQcm9mZXNzaW9uYWwgU3VtbWFyeScsIGRlc2M6ICdTZWxlY3Qgd2hpY2ggcHJvZmVzc2lvbmFsIHN1bW1hcnkgdG8gdXNlLiBUaGUgQUlcXCdzIHJlY29tbWVuZGF0aW9uIGlzIHByZS1zZWxlY3RlZC4nLCBjb250YWluZXI6ICdzdW1tYXJ5LWZvY3VzLWNvbnRhaW5lcicgICAgfSxcbiAgICBwdWJsaWNhdGlvbnM6ICB7IHRpdGxlOiAnXHVEODNEXHVEQ0M0IFB1YmxpY2F0aW9ucycsICAgICAgZGVzYzogJ0FsbCBwdWJsaWNhdGlvbnMgcmFua2VkIGJ5IHJlbGV2YW5jZS4gQWNjZXB0IG9yIHJlamVjdCBlYWNoIGZvciB5b3VyIENWLicsICAgICAgICAgIGNvbnRhaW5lcjogJ3B1YmxpY2F0aW9ucy10YWJsZS1jb250YWluZXInIH0sXG4gIH07XG4gIGNvbnN0IGNmZyA9IHBhbmVDb25maWdbcGFuZV0gfHwge307XG5cbiAgY29uc3QgaGVhZGVySHRtbCA9IHBhbmUgPT09ICdleHBlcmllbmNlcycgPyBgXG4gICAgPGgxPlx1MjY5OVx1RkUwRiBSZXZpZXcgQ3VzdG9taXphdGlvbiBSZWNvbW1lbmRhdGlvbnM8L2gxPlxuICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDttYXJnaW4tYm90dG9tOjE2cHg7XCI+UmV2aWV3IHRoZSBBSSdzIHJlY29tbWVuZGF0aW9ucy4gVXNlIHRoZSBhY3Rpb24gYnV0dG9ucyB0byBhZGp1c3QgZWFjaCBpdGVtLCB0aGVuIHNhdmUgeW91ciBkZWNpc2lvbnMgYmVmb3JlIGdlbmVyYXRpbmcgdGhlIENWLjwvcD5cbiAgICA8ZGl2IGlkPVwicGFnZS1lc3RpbWF0ZS13aWRnZXRcIiBjbGFzcz1cInBhZ2UtZXN0aW1hdGUgb2tcIj5cbiAgICAgIDxzcGFuIGlkPVwicGUtaWNvblwiPlx1RDgzRFx1RENDNDwvc3Bhbj5cbiAgICAgIDxzcGFuIGlkPVwicGUtbGFiZWxcIj5Fc3RpbWF0ZWQgbGVuZ3RoOiBjYWxjdWxhdGluZ1x1MjAyNjwvc3Bhbj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwZS1iYXJcIj48ZGl2IGNsYXNzPVwicGUtZmlsbFwiIGlkPVwicGUtZmlsbFwiIHN0eWxlPVwid2lkdGg6MCU7YmFja2dyb3VuZDojODZlZmFjO1wiPjwvZGl2PjwvZGl2PlxuICAgIDwvZGl2PlxuICBgIDogKGNmZy50aXRsZSA/IGA8aDIgc3R5bGU9XCJtYXJnaW46MCAwIDEycHg7XCI+JHtjZmcudGl0bGV9PC9oMj5gIDogJycpO1xuXG4gIGNvbnN0IG5hdkJhY2sgPSB7XG4gICAgc2tpbGxzOiAgICAgICBgPGJ1dHRvbiBjbGFzcz1cImJhY2stYnRuXCIgb25jbGljaz1cInN3aXRjaFRhYignYWNoLWVkaXRvcicpXCI+XHUyMTkwIEJhY2sgdG8gRXhwZXJpZW5jZSBCdWxsZXRzPC9idXR0b24+YCxcbiAgICBhY2hpZXZlbWVudHM6IGA8YnV0dG9uIGNsYXNzPVwiYmFjay1idG5cIiBvbmNsaWNrPVwic3dpdGNoVGFiKCdza2lsbHMtcmV2aWV3JylcIj5cdTIxOTAgQmFjayB0byBTa2lsbHM8L2J1dHRvbj5gLFxuICAgIHB1YmxpY2F0aW9uczogYDxidXR0b24gY2xhc3M9XCJiYWNrLWJ0blwiIG9uY2xpY2s9XCJzd2l0Y2hUYWIoJ3N1bW1hcnktcmV2aWV3JylcIj5cdTIxOTAgQmFjayB0byBTdW1tYXJ5PC9idXR0b24+YCxcbiAgfTtcbiAgY29uc3QgbmF2Q29udGludWUgPSB7XG4gICAgZXhwZXJpZW5jZXM6ICBgPGJ1dHRvbiBjbGFzcz1cImNvbnRpbnVlLWJ0blwiIG9uY2xpY2s9XCJzdWJtaXRFeHBlcmllbmNlRGVjaXNpb25zKClcIj5Db250aW51ZSB0byBFeHBlcmllbmNlIEJ1bGxldHMgXHUyMTkyPC9idXR0b24+YCxcbiAgICBza2lsbHM6ICAgICAgIGA8YnV0dG9uIGNsYXNzPVwiY29udGludWUtYnRuXCIgb25jbGljaz1cInN1Ym1pdFNraWxsRGVjaXNpb25zKClcIj5Db250aW51ZSB0byBBY2hpZXZlbWVudHMgXHUyMTkyPC9idXR0b24+YCxcbiAgICBhY2hpZXZlbWVudHM6IGA8YnV0dG9uIGNsYXNzPVwiY29udGludWUtYnRuXCIgb25jbGljaz1cInN1Ym1pdEFjaGlldmVtZW50RGVjaXNpb25zKClcIj5Db250aW51ZSB0byBUYWdsaW5lIFx1MjE5MjwvYnV0dG9uPmAsXG4gICAgcHVibGljYXRpb25zOiBgPGJ1dHRvbiBjbGFzcz1cImNvbnRpbnVlLWJ0blwiIG9uY2xpY2s9XCJzdWJtaXRQdWJsaWNhdGlvbkRlY2lzaW9ucygpXCI+Q29udGludWUgdG8gUmV3cml0ZSBcdTIxOTI8L2J1dHRvbj5gLFxuICB9O1xuICBjb25zdCBuYXZIdG1sID0gcGFuZSA9PT0gJ3N1bW1hcnknID8gJycgOiBgXG4gICAgPGRpdiBjbGFzcz1cIm5hdi1idXR0b25zJHtwYW5lID09PSAnZXhwZXJpZW5jZXMnID8gJyBuYXYtZW5kJyA6ICcnfVwiIHN0eWxlPVwibWFyZ2luOjE2cHggMDtcIj5cbiAgICAgICR7bmF2QmFja1twYW5lXSB8fCAnJ31cbiAgICAgICR7bmF2Q29udGludWVbcGFuZV0gfHwgJyd9XG4gICAgPC9kaXY+YDtcblxuICBjb250ZW50LmlubmVySFRNTCA9IGBcbiAgICAke2hlYWRlckh0bWx9XG4gICAgJHtjZmcuZGVzYyA/IGA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7Zm9udC1zaXplOjAuOTVlbTttYXJnaW4tYm90dG9tOjE2cHg7XCI+JHtlc2NhcGVIdG1sKGNmZy5kZXNjKX08L3A+YCA6ICcnfVxuICAgIDxkaXYgaWQ9XCIke2NmZy5jb250YWluZXJ9XCI+PC9kaXY+XG4gICAgJHtuYXZIdG1sfVxuICBgO1xuXG4gIHdpbmRvdy5fYWN0aXZlUmV2aWV3UGFuZSA9IHBhbmU7XG4gIHN3aXRjaCAocGFuZSkge1xuICAgIGNhc2UgJ2V4cGVyaWVuY2VzJzpcbiAgICAgIGF3YWl0IGJ1aWxkRXhwZXJpZW5jZVJldmlld1RhYmxlKCk7XG4gICAgICBfdXBkYXRlUGFnZUVzdGltYXRlKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdza2lsbHMnOlxuICAgICAgYXdhaXQgYnVpbGRTa2lsbHNSZXZpZXdUYWJsZSgpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYWNoaWV2ZW1lbnRzJzpcbiAgICAgIGF3YWl0IGJ1aWxkQWNoaWV2ZW1lbnRzUmV2aWV3VGFibGUoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3N1bW1hcnknOlxuICAgICAgYXdhaXQgYnVpbGRTdW1tYXJ5Rm9jdXNTZWN0aW9uKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdwdWJsaWNhdGlvbnMnOlxuICAgICAgYXdhaXQgYnVpbGRQdWJsaWNhdGlvbnNSZXZpZXdUYWJsZSgpO1xuICAgICAgYnJlYWs7XG4gIH1cbn1cblxuLy8gVHJhY2sgd2hpY2ggcGFuZSBpcyBjdXJyZW50bHkgYWN0aXZlXG53aW5kb3cuX2FjdGl2ZVJldmlld1BhbmUgPSAnZXhwZXJpZW5jZXMnO1xuXG5hc3luYyBmdW5jdGlvbiBzd2l0Y2hSZXZpZXdTdWJ0YWIocGFuZSkge1xuICAvLyBVcGRhdGUgYnV0dG9uIHN0YXRlc1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucmV2aWV3LXN1YnRhYicpLmZvckVhY2goYnRuID0+IHtcbiAgICBidG4uY2xhc3NMaXN0LnRvZ2dsZSgnYWN0aXZlJywgYnRuLmRhdGFzZXQucGFuZSA9PT0gcGFuZSk7XG4gIH0pO1xuXG4gIC8vIEhpZGUgYWxsIHBhbmVzLCBzaG93IHRoZSBzZWxlY3RlZCBvbmVcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnJldmlldy1wYW5lJykuZm9yRWFjaChwID0+IHAuc3R5bGUuZGlzcGxheSA9ICdub25lJyk7XG4gIGNvbnN0IHRhcmdldCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGByZXZpZXctcGFuZS0ke3BhbmV9YCk7XG4gIGlmICh0YXJnZXQpIHRhcmdldC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcblxuICB3aW5kb3cuX2FjdGl2ZVJldmlld1BhbmUgPSBwYW5lO1xuXG4gIC8vIExhenktbG9hZCBwYW5lIGNvbnRlbnQgb24gZmlyc3QgdmlzaXRcbiAgaWYgKCF3aW5kb3cuX3Jldmlld1BhbmVMb2FkZWQgfHwgIXdpbmRvdy5fcmV2aWV3UGFuZUxvYWRlZFtwYW5lXSkge1xuICAgIGF3YWl0IF9sb2FkUmV2aWV3UGFuZShwYW5lKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBfbG9hZFJldmlld1BhbmUocGFuZSkge1xuICBpZiAoIXdpbmRvdy5fcmV2aWV3UGFuZUxvYWRlZCkgd2luZG93Ll9yZXZpZXdQYW5lTG9hZGVkID0ge307XG4gIHRyeSB7XG4gICAgc3dpdGNoIChwYW5lKSB7XG4gICAgICBjYXNlICdleHBlcmllbmNlcyc6ICAgYXdhaXQgYnVpbGRFeHBlcmllbmNlUmV2aWV3VGFibGUoKTsgIGJyZWFrO1xuICAgICAgY2FzZSAnc2tpbGxzJzogICAgICAgIGF3YWl0IGJ1aWxkU2tpbGxzUmV2aWV3VGFibGUoKTsgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdhY2hpZXZlbWVudHMnOiAgYXdhaXQgYnVpbGRBY2hpZXZlbWVudHNSZXZpZXdUYWJsZSgpOyBicmVhaztcbiAgICAgIGNhc2UgJ3N1bW1hcnknOiAgICAgICBhd2FpdCBidWlsZFN1bW1hcnlGb2N1c1NlY3Rpb24oKTsgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncHVibGljYXRpb25zJzogIGF3YWl0IGJ1aWxkUHVibGljYXRpb25zUmV2aWV3VGFibGUoKTsgYnJlYWs7XG4gICAgICBkZWZhdWx0OiByZXR1cm47XG4gICAgfVxuICAgIHdpbmRvdy5fcmV2aWV3UGFuZUxvYWRlZFtwYW5lXSA9IHRydWU7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgZGVsZXRlIHdpbmRvdy5fcmV2aWV3UGFuZUxvYWRlZFtwYW5lXTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgUGFnZS1lc3RpbWF0ZSB3aWRnZXQgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIF91cGRhdGVQYWdlRXN0aW1hdGUoKSB7XG4gIGNvbnN0IHdpZGdldCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYWdlLWVzdGltYXRlLXdpZGdldCcpO1xuICBpZiAoIXdpZGdldCkgcmV0dXJuO1xuXG4gIGNvbnN0IGxhYmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BlLWxhYmVsJyk7XG4gIGNvbnN0IGZpbGwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGUtZmlsbCcpO1xuICBjb25zdCBpY29uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BlLWljb24nKTtcblxuICBpZiAobGFiZWwpIGxhYmVsLnRleHRDb250ZW50ID0gJ1VwZGF0aW5nIHNlcnZlciBsYXlvdXQgZXN0aW1hdGVcdTIwMjYnO1xuICBpZiAoZmlsbCkgZmlsbC5zdHlsZS53aWR0aCA9ICcwJSc7XG4gIGlmIChpY29uKSBpY29uLnRleHRDb250ZW50ID0gJ1x1MjNGMyc7XG5cbiAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICBleHBlcmllbmNlX2RlY2lzaW9uczoge1xuICAgICAgLi4uKCh3aW5kb3cuX3NhdmVkRGVjaXNpb25zICYmIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMuZXhwZXJpZW5jZV9kZWNpc2lvbnMpIHx8IHt9KSxcbiAgICAgIC4uLih1c2VyU2VsZWN0aW9ucy5leHBlcmllbmNlcyB8fCB7fSksXG4gICAgfSxcbiAgICBza2lsbF9kZWNpc2lvbnM6IHtcbiAgICAgIC4uLigod2luZG93Ll9zYXZlZERlY2lzaW9ucyAmJiB3aW5kb3cuX3NhdmVkRGVjaXNpb25zLnNraWxsX2RlY2lzaW9ucykgfHwge30pLFxuICAgICAgLi4uKHVzZXJTZWxlY3Rpb25zLnNraWxscyB8fCB7fSksXG4gICAgfSxcbiAgICBhY2hpZXZlbWVudF9kZWNpc2lvbnM6IChcbiAgICAgICh3aW5kb3cuX3NhdmVkRGVjaXNpb25zICYmIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMuYWNoaWV2ZW1lbnRfZGVjaXNpb25zKVxuICAgICAgfHwgd2luZG93LmFjaGlldmVtZW50RGVjaXNpb25zXG4gICAgICB8fCB7fVxuICAgICksXG4gICAgcHVibGljYXRpb25fZGVjaXNpb25zOiAoXG4gICAgICAod2luZG93Ll9zYXZlZERlY2lzaW9ucyAmJiB3aW5kb3cuX3NhdmVkRGVjaXNpb25zLnB1YmxpY2F0aW9uX2RlY2lzaW9ucylcbiAgICAgIHx8IHdpbmRvdy5wdWJsaWNhdGlvbkRlY2lzaW9uc1xuICAgICAgfHwge31cbiAgICApLFxuICAgIHN1bW1hcnlfZm9jdXNfb3ZlcnJpZGU6IHdpbmRvdy5zZWxlY3RlZFN1bW1hcnlLZXkgfHwgbnVsbCxcbiAgfTtcblxuICBjb25zdCByZXF1ZXN0SWQgPSArK3BhZ2VFc3RpbWF0ZVJlcXVlc3RJZDtcbiAgY2xlYXJUaW1lb3V0KHBhZ2VFc3RpbWF0ZVRpbWVyKTtcbiAgcGFnZUVzdGltYXRlVGltZXIgPSBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBhcGlDYWxsKCdQT1NUJywgJy9hcGkvY3YvbGF5b3V0LWVzdGltYXRlJywgcGF5bG9hZCk7XG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB0aHJvdyBuZXcgRXJyb3IocmVzcG9uc2UuZXJyb3IgfHwgJ2VzdGltYXRlIGZhaWxlZCcpO1xuICAgICAgaWYgKHJlcXVlc3RJZCAhPT0gcGFnZUVzdGltYXRlUmVxdWVzdElkKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHBhZ2VzID0gTnVtYmVyKHJlc3BvbnNlLnBhZ2VfY291bnRfZXN0aW1hdGUgfHwgMCk7XG4gICAgICBjb25zdCBwY3QgPSBNYXRoLm1pbigxMDAsIChwYWdlcyAvIDMpICogMTAwKTtcbiAgICAgIGNvbnN0IGNvbmZpZGVuY2UgPSBOdW1iZXIocmVzcG9uc2UucGFnZV9jb3VudF9jb25maWRlbmNlIHx8IDApO1xuXG4gICAgICBsZXQgY2xzID0gJ29rJztcbiAgICAgIGxldCBjb2xvdXIgPSAnIzIyYzU1ZSc7XG4gICAgICBsZXQgaWNvblRleHQgPSByZXNwb25zZS5wYWdlX2NvdW50X2V4YWN0ICE9IG51bGwgPyAnXHUyNzA1JyA6ICdcdUQ4M0RcdURDQzQnO1xuICAgICAgaWYgKHJlc3BvbnNlLnBhZ2VfbGVuZ3RoX3dhcm5pbmcpIHtcbiAgICAgICAgY2xzID0gcGFnZXMgPiAzID8gJ292ZXInIDogJ3dhcm4nO1xuICAgICAgICBjb2xvdXIgPSBwYWdlcyA+IDMgPyAnI2VmNDQ0NCcgOiAnI2Y1OWUwYic7XG4gICAgICAgIGljb25UZXh0ID0gcGFnZXMgPiAzID8gJ1x1RDgzRFx1REVBOCcgOiAnXHUyNkEwXHVGRTBGJztcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc291cmNlTGFiZWwgPSByZXNwb25zZS5wYWdlX2NvdW50X2V4YWN0ICE9IG51bGxcbiAgICAgICAgPyBgRXhhY3Q6ICR7cmVzcG9uc2UucGFnZV9jb3VudF9leGFjdH0gcGFnZSR7cmVzcG9uc2UucGFnZV9jb3VudF9leGFjdCA9PT0gMSA/ICcnIDogJ3MnfWBcbiAgICAgICAgOiBgRXN0aW1hdGVkOiAke3BhZ2VzLnRvRml4ZWQoMSl9IHBhZ2VzYDtcbiAgICAgIGNvbnN0IGNvbmZpZGVuY2VMYWJlbCA9IHJlc3BvbnNlLnBhZ2VfY291bnRfZXhhY3QgIT0gbnVsbFxuICAgICAgICA/ICcnXG4gICAgICAgIDogYCAoJHtNYXRoLnJvdW5kKGNvbmZpZGVuY2UgKiAxMDApfSUgY29uZmlkZW5jZSlgO1xuICAgICAgY29uc3QgY29udHJpYnV0b3JUZXh0ID0gQXJyYXkuaXNBcnJheShyZXNwb25zZS5jb250cmlidXRvcnMpICYmIHJlc3BvbnNlLmNvbnRyaWJ1dG9ycy5sZW5ndGggPiAwXG4gICAgICAgID8gYCAke3Jlc3BvbnNlLmNvbnRyaWJ1dG9yc1swXX0uYFxuICAgICAgICA6ICcnO1xuICAgICAgY29uc3QgcmVjaGVja1RleHQgPSByZXNwb25zZS5wYWdlX2NvdW50X25lZWRzX2V4YWN0X3JlY2hlY2sgJiYgcmVzcG9uc2UucGFnZV9jb3VudF9leGFjdCA9PSBudWxsXG4gICAgICAgID8gJyBFeGFjdCByZWNoZWNrIHJlY29tbWVuZGVkLidcbiAgICAgICAgOiAnJztcblxuICAgICAgd2lkZ2V0LmNsYXNzTmFtZSA9IGBwYWdlLWVzdGltYXRlICR7Y2xzfWA7XG4gICAgICBpZiAobGFiZWwpIHtcbiAgICAgICAgbGFiZWwudGV4dENvbnRlbnQgPSBgJHtzb3VyY2VMYWJlbH0ke2NvbmZpZGVuY2VMYWJlbH0uJHtjb250cmlidXRvclRleHR9JHtyZWNoZWNrVGV4dH1gLnRyaW0oKTtcbiAgICAgIH1cbiAgICAgIGlmIChmaWxsKSB7XG4gICAgICAgIGZpbGwuc3R5bGUud2lkdGggPSBgJHtwY3R9JWA7XG4gICAgICAgIGZpbGwuc3R5bGUuYmFja2dyb3VuZCA9IGNvbG91cjtcbiAgICAgIH1cbiAgICAgIGlmIChpY29uKSBpY29uLnRleHRDb250ZW50ID0gaWNvblRleHQ7XG5cbiAgICAgIHN0YXRlTWFuYWdlci5zZXRHZW5lcmF0aW9uU3RhdGUoe1xuICAgICAgICBwYWdlQ291bnRFc3RpbWF0ZTogcmVzcG9uc2UucGFnZV9jb3VudF9lc3RpbWF0ZSA/PyBudWxsLFxuICAgICAgICBwYWdlQ291bnRFeGFjdDogcmVzcG9uc2UucGFnZV9jb3VudF9leGFjdCA/PyBudWxsLFxuICAgICAgICBwYWdlQ291bnRDb25maWRlbmNlOiByZXNwb25zZS5wYWdlX2NvdW50X2NvbmZpZGVuY2UgPz8gbnVsbCxcbiAgICAgICAgcGFnZUNvdW50U291cmNlOiByZXNwb25zZS5wYWdlX2NvdW50X3NvdXJjZSB8fCBudWxsLFxuICAgICAgICBwYWdlTmVlZHNFeGFjdFJlY2hlY2s6IEJvb2xlYW4ocmVzcG9uc2UucGFnZV9jb3VudF9uZWVkc19leGFjdF9yZWNoZWNrKSxcbiAgICAgICAgcGFnZVdhcm5pbmc6IEJvb2xlYW4ocmVzcG9uc2UucGFnZV9sZW5ndGhfd2FybmluZyksXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKHJlcXVlc3RJZCAhPT0gcGFnZUVzdGltYXRlUmVxdWVzdElkKSByZXR1cm47XG4gICAgICB3aWRnZXQuY2xhc3NOYW1lID0gJ3BhZ2UtZXN0aW1hdGUgd2Fybic7XG4gICAgICBpZiAobGFiZWwpIGxhYmVsLnRleHRDb250ZW50ID0gYExheW91dCBlc3RpbWF0ZSB1bmF2YWlsYWJsZTogJHtlcnJvci5tZXNzYWdlfWA7XG4gICAgICBpZiAoZmlsbCkge1xuICAgICAgICBmaWxsLnN0eWxlLndpZHRoID0gJzAlJztcbiAgICAgICAgZmlsbC5zdHlsZS5iYWNrZ3JvdW5kID0gJyNmNTllMGInO1xuICAgICAgfVxuICAgICAgaWYgKGljb24pIGljb24udGV4dENvbnRlbnQgPSAnXHUyNkEwXHVGRTBGJztcbiAgICB9XG4gIH0sIDI1MCk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBTaGFyZWQgYWN0aW9uIGNsaWNrIGhhbmRsZXJzIChleHBlcmllbmNlICsgc2tpbGxzIHRhYmxlcykgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIGhhbmRsZUFjdGlvbkNsaWNrKGl0ZW1JZCwgYWN0aW9uLCB0eXBlKSB7XG4gIC8vIFJlbW92ZSBhY3RpdmUgY2xhc3MgZnJvbSBhbGwgYnV0dG9ucyBpbiB0aGlzIHJvd1xuICBjb25zdCByb3cgPSB0eXBlID09PSAnZXhwZXJpZW5jZSdcbiAgICA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYHRyW2RhdGEtZXhwLWlkPVwiJHtpdGVtSWR9XCJdYClcbiAgICA6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYHRyW2RhdGEtc2tpbGw9XCIke2l0ZW1JZH1cIl1gKTtcblxuICBjb25zdCBidXR0b25zID0gcm93LnF1ZXJ5U2VsZWN0b3JBbGwoJy5pY29uLWJ0bicpO1xuICBidXR0b25zLmZvckVhY2goYnRuID0+IHtcbiAgICBidG4uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gICAgaWYgKGJ0bi5oYXNBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcpKSBidG4uc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCAnZmFsc2UnKTtcbiAgfSk7XG5cbiAgLy8gQWRkIGFjdGl2ZSBjbGFzcyB0byBjbGlja2VkIGJ1dHRvblxuICBjb25zdCBjbGlja2VkQnRuID0gcm93LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWFjdGlvbj1cIiR7YWN0aW9ufVwiXWApO1xuICBjbGlja2VkQnRuLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICBpZiAoY2xpY2tlZEJ0bi5oYXNBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcpKSBjbGlja2VkQnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJywgJ3RydWUnKTtcblxuICAvLyBTdG9yZSBzZWxlY3Rpb24gYW5kIHJlY29yZCBleHBsaWNpdCByZXZpZXdcbiAgaWYgKHR5cGUgPT09ICdleHBlcmllbmNlJykge1xuICAgIHVzZXJTZWxlY3Rpb25zLmV4cGVyaWVuY2VzW2l0ZW1JZF0gPSBhY3Rpb247XG4gICAgd2luZG93Ll9leHBsaWNpdGx5UmV2aWV3ZWQgPSB3aW5kb3cuX2V4cGxpY2l0bHlSZXZpZXdlZCB8fCB7IGV4cGVyaWVuY2VzOiBuZXcgU2V0KCksIHNraWxsczogbmV3IFNldCgpIH07XG4gICAgd2luZG93Ll9leHBsaWNpdGx5UmV2aWV3ZWQuZXhwZXJpZW5jZXMuYWRkKGl0ZW1JZCk7XG4gIH0gZWxzZSB7XG4gICAgdXNlclNlbGVjdGlvbnMuc2tpbGxzW2l0ZW1JZF0gPSBhY3Rpb247XG4gICAgd2luZG93Ll9leHBsaWNpdGx5UmV2aWV3ZWQgPSB3aW5kb3cuX2V4cGxpY2l0bHlSZXZpZXdlZCB8fCB7IGV4cGVyaWVuY2VzOiBuZXcgU2V0KCksIHNraWxsczogbmV3IFNldCgpIH07XG4gICAgd2luZG93Ll9leHBsaWNpdGx5UmV2aWV3ZWQuc2tpbGxzLmFkZChpdGVtSWQpO1xuICB9XG4gIF91cGRhdGVQYWdlRXN0aW1hdGUoKTtcbn1cblxuLyoqXG4gKiBBcHBseSBhIGJ1bGsgYWN0aW9uIHRvIGFsbCB2aXNpYmxlIChEYXRhVGFibGUtZmlsdGVyZWQpIHJvd3MgaW4gb25lIHRhYmxlLlxuICogYWN0aW9uOiAnZW1waGFzaXplJyB8ICdpbmNsdWRlJyB8ICdkZS1lbXBoYXNpemUnIHwgJ2V4Y2x1ZGUnIHwgJ3JlY29tbWVuZGVkJ1xuICogdHlwZTogICAnZXhwZXJpZW5jZScgfCAnc2tpbGwnXG4gKi9cbmZ1bmN0aW9uIGJ1bGtBY3Rpb24oYWN0aW9uLCB0eXBlKSB7XG4gIGNvbnN0IHRhYmxlSWQgID0gdHlwZSA9PT0gJ2V4cGVyaWVuY2UnID8gJyNleHBlcmllbmNlLXJldmlldy10YWJsZScgOiAnI3NraWxscy1yZXZpZXctdGFibGUnO1xuICBjb25zdCBkYXRhICAgICA9IHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zIHx8IHt9O1xuICBjb25zdCBkdCAgICAgICA9ICQuZm4uRGF0YVRhYmxlLmlzRGF0YVRhYmxlKHRhYmxlSWQpID8gJCh0YWJsZUlkKS5EYXRhVGFibGUoKSA6IG51bGw7XG5cbiAgLy8gSXRlcmF0ZSBvbmx5IHRoZSByb3dzIHRoYXQgRGF0YVRhYmxlIGN1cnJlbnRseSBzaG93cyAocmVzcGVjdHMgc2VhcmNoIGZpbHRlcilcbiAgY29uc3Qgcm93cyA9IGR0XG4gICAgPyBkdC5yb3dzKHsgc2VhcmNoOiAnYXBwbGllZCcgfSkubm9kZXMoKS50b0FycmF5KClcbiAgICA6IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgJHt0YWJsZUlkfSB0Ym9keSB0cmApKTtcblxuICByb3dzLmZvckVhY2gocm93ID0+IHtcbiAgICBjb25zdCBleHBJZCAgICA9IHJvdy5kYXRhc2V0LmV4cElkO1xuICAgIGNvbnN0IHNraWxsSWQgID0gcm93LmRhdGFzZXQuc2tpbGw7XG4gICAgY29uc3QgaXRlbUlkICAgPSBleHBJZCB8fCBza2lsbElkO1xuICAgIGlmICghaXRlbUlkKSByZXR1cm47XG5cbiAgICBsZXQgcmVzb2x2ZWRBY3Rpb24gPSBhY3Rpb247XG4gICAgaWYgKGFjdGlvbiA9PT0gJ3JlY29tbWVuZGVkJykge1xuICAgICAgcmVzb2x2ZWRBY3Rpb24gPSB0eXBlID09PSAnZXhwZXJpZW5jZSdcbiAgICAgICAgPyBfcmVzb2x2ZWRFeHBBY3Rpb24oaXRlbUlkLCBkYXRhKVxuICAgICAgICA6IF9yZXNvbHZlZFNraWxsQWN0aW9uKGl0ZW1JZCwgZGF0YSk7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIGJ1dHRvbiBzdGF0ZXNcbiAgICByb3cucXVlcnlTZWxlY3RvckFsbCgnLmljb24tYnRuJykuZm9yRWFjaChidG4gPT4ge1xuICAgICAgYnRuLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgICAgaWYgKGJ0bi5oYXNBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcpKSBidG4uc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCAnZmFsc2UnKTtcbiAgICB9KTtcbiAgICBjb25zdCB0YXJnZXQgPSByb3cucXVlcnlTZWxlY3RvcihgW2RhdGEtYWN0aW9uPVwiJHtyZXNvbHZlZEFjdGlvbn1cIl1gKTtcbiAgICBpZiAodGFyZ2V0KSB7XG4gICAgICB0YXJnZXQuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgICBpZiAodGFyZ2V0Lmhhc0F0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJykpIHRhcmdldC5zZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsICd0cnVlJyk7XG4gICAgfVxuXG4gICAgLy8gU3RvcmUgc2VsZWN0aW9uXG4gICAgaWYgKHR5cGUgPT09ICdleHBlcmllbmNlJykge1xuICAgICAgdXNlclNlbGVjdGlvbnMuZXhwZXJpZW5jZXNbaXRlbUlkXSA9IHJlc29sdmVkQWN0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICB1c2VyU2VsZWN0aW9ucy5za2lsbHNbaXRlbUlkXSA9IHJlc29sdmVkQWN0aW9uO1xuICAgIH1cbiAgfSk7XG4gIF91cGRhdGVQYWdlRXN0aW1hdGUoKTtcbn1cblxuZnVuY3Rpb24gX3Jlc29sdmVkRXhwQWN0aW9uKGV4cElkLCBkYXRhKSB7XG4gIGNvbnN0IHJlYyA9IGdldEV4cGVyaWVuY2VSZWNvbW1lbmRhdGlvbihleHBJZCwgZGF0YSk7XG4gIGlmIChyZWMgPT09ICdFbXBoYXNpemUnKSAgICByZXR1cm4gJ2VtcGhhc2l6ZSc7XG4gIGlmIChyZWMgPT09ICdJbmNsdWRlJykgICAgICByZXR1cm4gJ2luY2x1ZGUnO1xuICBpZiAocmVjID09PSAnRGUtZW1waGFzaXplJykgcmV0dXJuICdkZS1lbXBoYXNpemUnO1xuICByZXR1cm4gJ2V4Y2x1ZGUnO1xufVxuXG5mdW5jdGlvbiBfcmVzb2x2ZWRTa2lsbEFjdGlvbihza2lsbE5hbWUsIGRhdGEpIHtcbiAgY29uc3QgcmVjID0gZ2V0U2tpbGxSZWNvbW1lbmRhdGlvbihza2lsbE5hbWUsIGRhdGEpO1xuICBpZiAocmVjID09PSAnRW1waGFzaXplJykgICAgcmV0dXJuICdlbXBoYXNpemUnO1xuICBpZiAocmVjID09PSAnSW5jbHVkZScpICAgICAgcmV0dXJuICdpbmNsdWRlJztcbiAgaWYgKHJlYyA9PT0gJ0RlLWVtcGhhc2l6ZScpIHJldHVybiAnZGUtZW1waGFzaXplJztcbiAgcmV0dXJuICdleGNsdWRlJztcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFRhZ2xpbmUgcmV2aWV3IHRhYiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gcG9wdWxhdGVUYWdsaW5lUmV2aWV3VGFiKCkge1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgaWYgKCFjb250ZW50KSByZXR1cm47XG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgIDxoMiBzdHlsZT1cIm1hcmdpbjowIDAgMTZweDtcIj5cdUQ4M0NcdURGRjdcdUZFMEYgQXBwbGljYW50IFRhZ2xpbmU8L2gyPlxuICAgIDxkaXYgaWQ9XCJ0YWdsaW5lLXJldmlldy1jb250YWluZXJcIj48L2Rpdj5cbiAgYDtcbiAgaWYgKHR5cGVvZiBidWlsZFRhZ2xpbmVSZXZpZXdTZWN0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgYXdhaXQgYnVpbGRUYWdsaW5lUmV2aWV3U2VjdGlvbigpO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFeHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5leHBvcnQge1xuICB1c2VyU2VsZWN0aW9ucyxcbiAgdXBkYXRlSW5jbHVzaW9uQ291bnRzLFxuICBzd2l0Y2hUYWIsXG4gIGxvYWRUYWJDb250ZW50LFxuICBwb3B1bGF0ZUFuYWx5c2lzVGFiLFxuICBoYW5kbGVDdXN0b21pemF0aW9uUmVzcG9uc2UsXG4gIHNob3dUYWJsZUJhc2VkUmV2aWV3LFxuICBwb3B1bGF0ZVJldmlld1RhYixcbiAgcG9wdWxhdGVUYWdsaW5lUmV2aWV3VGFiLFxuICBzd2l0Y2hSZXZpZXdTdWJ0YWIsXG4gIF9sb2FkUmV2aWV3UGFuZSxcbiAgX3VwZGF0ZVBhZ2VFc3RpbWF0ZSxcbiAgaGFuZGxlQWN0aW9uQ2xpY2ssXG4gIGJ1bGtBY3Rpb24sXG4gIF9yZXNvbHZlZEV4cEFjdGlvbixcbiAgX3Jlc29sdmVkU2tpbGxBY3Rpb24sXG59O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvcHJldmlldy1yZW5kZXIuanNcbiAqIFNoYXJlZCwgc2lkZS1lZmZlY3QtZnJlZSBoZWxwZXIgZm9yIHNhZmVseSByZW5kZXJpbmcgQ1YgSFRNTCBpbnRvIGFcbiAqIHNhbmRib3hlZCBpZnJhbWUuIERlbGliZXJhdGVseSBoYXMgbm8gcmVmZXJlbmNlIHRvIHN0YXRlTWFuYWdlciwgYXBpQ2FsbCxcbiAqIG9yIGFueSBmZXRjaCBsb2dpYyBcdTIwMTQgaXQgb25seSB0b3VjaGVzIHRoZSBET00gXHUyMDE0IHNvIGl0IGNhbiBiZSBzYWZlbHlcbiAqIGltcG9ydGVkIGJ5IGJvdGggdGhlIG11dGF0aW5nIGxheW91dC1yZXZpZXcgZmxvdyAobGF5b3V0LWluc3RydWN0aW9uLmpzKVxuICogYW5kIHRoZSByZWFkLW9ubHkgZWFybHktcHJldmlldyBwYW5lbCAoZWFybHktcHJldmlldy1wYW5lbC5qcykgd2l0aG91dFxuICogY3JlYXRpbmcgYSBzaGFyZWQgaW1wb3J0IHBhdGggYmFjayB0byBhbnkgbXV0YXRpbmcgZW5kcG9pbnQuXG4gKi9cblxuLyoqXG4gKiBSZW5kZXIgYW4gSFRNTCBzdHJpbmcgaW50byBhbiBpZnJhbWUgdmlhIHNyY2RvYywgd2l0aCB0aGUgc2FuZGJveFxuICogYXR0cmlidXRlcyBhbHJlYWR5IGVzdGFibGlzaGVkIGZvciBDViBwcmV2aWV3cyBlbHNld2hlcmUgaW4gdGhlIGFwcC5cbiAqIEBwYXJhbSB7SFRNTElGcmFtZUVsZW1lbnR9IGlmcmFtZUVsXG4gKiBAcGFyYW0ge3N0cmluZ30gaHRtbFxuICovXG5mdW5jdGlvbiByZW5kZXJIdG1sSW50b0lmcmFtZShpZnJhbWVFbCwgaHRtbCkge1xuICBpZiAoIWlmcmFtZUVsKSByZXR1cm47XG4gIGlmcmFtZUVsLnNldEF0dHJpYnV0ZSgnc2FuZGJveCcsICdhbGxvdy1zYW1lLW9yaWdpbicpO1xuICBpZnJhbWVFbC5zZXRBdHRyaWJ1dGUoJ3JlZmVycmVycG9saWN5JywgJ25vLXJlZmVycmVyJyk7XG4gIGlmcmFtZUVsLnNyY2RvYyA9IGh0bWw7XG59XG5cbmV4cG9ydCB7IHJlbmRlckh0bWxJbnRvSWZyYW1lIH07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi92YWxpZGF0b3JzLmpzXG4gKiBBUEkgcmVzcG9uc2UgdmFsaWRhdG9ycyBcdTIwMTQgRFRPIG1pcnJvcnMgb2YgUHl0aG9uIGRhdGFjbGFzc2VzIGluIHdlYl9hcHAucHkuXG4gKlxuICogRWFjaCBmdW5jdGlvbiBjaGVja3MgdGhhdCByZXF1aXJlZCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gYW4gQVBJIHJlc3BvbnNlIGFuZFxuICogbG9ncyBhIGNvbnNvbGUud2FybiBpZiBhbnkgYXJlIG1pc3Npbmcgb3IgaGF2ZSBhbiB1bmV4cGVjdGVkIHR5cGUuICBWYWxpZGF0b3JzXG4gKiByZXR1cm4gdGhlIG9yaWdpbmFsIGRhdGEgb2JqZWN0IHVuY2hhbmdlZCBzbyB0aGV5IGNhbiBiZSB1c2VkIGlubGluZS5cbiAqXG4gKiBVcGRhdGUgYm90aCB0aGlzIGZpbGUgYW5kIHRoZSBQeXRob24gZGF0YWNsYXNzZXMgaW4gd2ViX2FwcC5weSB0b2dldGhlclxuICogd2hlbmV2ZXIgYWRkaW5nIG9yIHJlbW92aW5nIHJlc3BvbnNlIGZpZWxkcy5cbiAqXG4gKiBERVBFTkRFTkNJRVM6IG5vbmVcbiAqL1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5jb25zdCBsb2cgPSBnZXRMb2dnZXIoJ3ZhbGlkYXRvcnMnKTtcblxuLyoqIFZhbGlkYXRlIEdFVCAvYXBpL3N0YXR1cyByZXNwb25zZS4gKi9cbmZ1bmN0aW9uIHBhcnNlU3RhdHVzUmVzcG9uc2UoZGF0YSkge1xuICBjb25zdCByZXF1aXJlZCA9IFtcbiAgICAncGhhc2UnLCAnbGxtX3Byb3ZpZGVyJywgJ2pvYl9kZXNjcmlwdGlvbicsXG4gICAgJ3Bvc3RfYW5hbHlzaXNfcXVlc3Rpb25zJywgJ3Bvc3RfYW5hbHlzaXNfYW5zd2VycycsXG4gICAgJ2FsbF9leHBlcmllbmNlX2lkcycsICdhbGxfZXhwZXJpZW5jZXMnLCAnYWxsX3NraWxscycsICdhbGxfYWNoaWV2ZW1lbnRzJyxcbiAgICAncHJvZmVzc2lvbmFsX3N1bW1hcmllcycsICdjb3BpbG90X2F1dGgnLCAnaXRlcmF0aW5nJyxcbiAgICAnZXhwZXJpZW5jZV9kZWNpc2lvbnMnLCAnc2tpbGxfZGVjaXNpb25zJyxcbiAgICAnYWNoaWV2ZW1lbnRfZGVjaXNpb25zJywgJ3B1YmxpY2F0aW9uX2RlY2lzaW9ucycsXG4gICAgJ2V4dHJhX3NraWxscycsICdleHRyYV9za2lsbF9tYXRjaGVzJywgJ3Nlc3Npb25fZmlsZScsXG4gIF07XG4gIGNvbnN0IG1pc3NpbmcgPSByZXF1aXJlZC5maWx0ZXIoayA9PiAhKGsgaW4gZGF0YSkpO1xuICBpZiAobWlzc2luZy5sZW5ndGgpIHtcbiAgICBsb2cud2FybignW3BhcnNlU3RhdHVzUmVzcG9uc2VdIE1pc3NpbmcgZmllbGRzOicsIG1pc3NpbmcsIGRhdGEpO1xuICB9XG4gIGlmICgncG9zdF9hbmFseXNpc19xdWVzdGlvbnMnIGluIGRhdGEgJiYgIUFycmF5LmlzQXJyYXkoZGF0YS5wb3N0X2FuYWx5c2lzX3F1ZXN0aW9ucykpIHtcbiAgICBsb2cud2FybignW3BhcnNlU3RhdHVzUmVzcG9uc2VdIHBvc3RfYW5hbHlzaXNfcXVlc3Rpb25zIHNob3VsZCBiZSBhbiBhcnJheTonLCBkYXRhLnBvc3RfYW5hbHlzaXNfcXVlc3Rpb25zKTtcbiAgfVxuICBpZiAoJ2FsbF9leHBlcmllbmNlX2lkcycgaW4gZGF0YSAmJiAhQXJyYXkuaXNBcnJheShkYXRhLmFsbF9leHBlcmllbmNlX2lkcykpIHtcbiAgICBsb2cud2FybignW3BhcnNlU3RhdHVzUmVzcG9uc2VdIGFsbF9leHBlcmllbmNlX2lkcyBzaG91bGQgYmUgYW4gYXJyYXk6JywgZGF0YS5hbGxfZXhwZXJpZW5jZV9pZHMpO1xuICB9XG4gIHJldHVybiBkYXRhO1xufVxuXG4vKiogVmFsaWRhdGUgR0VUIC9hcGkvc2Vzc2lvbnMgcmVzcG9uc2UuICovXG5mdW5jdGlvbiBwYXJzZVNlc3Npb25MaXN0UmVzcG9uc2UoZGF0YSkge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YS5zZXNzaW9ucykpIHtcbiAgICBsb2cud2FybignW3BhcnNlU2Vzc2lvbkxpc3RSZXNwb25zZV0gc2Vzc2lvbnMgc2hvdWxkIGJlIGFuIGFycmF5OicsIGRhdGEpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGl0ZW1SZXF1aXJlZCA9IFsncGF0aCcsICdwb3NpdGlvbl9uYW1lJywgJ3RpbWVzdGFtcCcsICdwaGFzZScsICdoYXNfam9iJywgJ2hhc19hbmFseXNpcycsICdoYXNfY3VzdG9taXphdGlvbnMnXTtcbiAgICBkYXRhLnNlc3Npb25zLmZvckVhY2goKHMsIGkpID0+IHtcbiAgICAgIGNvbnN0IG1pc3NpbmcgPSBpdGVtUmVxdWlyZWQuZmlsdGVyKGsgPT4gIShrIGluIHMpKTtcbiAgICAgIGlmIChtaXNzaW5nLmxlbmd0aCkgbG9nLndhcm4oYFtwYXJzZVNlc3Npb25MaXN0UmVzcG9uc2VdIHNlc3Npb25zWyR7aX1dIG1pc3NpbmcgZmllbGRzOmAsIG1pc3NpbmcsIHMpO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBkYXRhO1xufVxuXG4vKiogVmFsaWRhdGUgR0VUIC9hcGkvcmV3cml0ZXMgcmVzcG9uc2UuICovXG5mdW5jdGlvbiBwYXJzZVJld3JpdGVzUmVzcG9uc2UoZGF0YSkge1xuICBjb25zdCByZXF1aXJlZCA9IFsnb2snLCAncmV3cml0ZXMnLCAncGVyc3Vhc2lvbl93YXJuaW5ncycsICdwaGFzZSddO1xuICBjb25zdCBtaXNzaW5nID0gcmVxdWlyZWQuZmlsdGVyKGsgPT4gIShrIGluIGRhdGEpKTtcbiAgaWYgKG1pc3NpbmcubGVuZ3RoKSBsb2cud2FybignW3BhcnNlUmV3cml0ZXNSZXNwb25zZV0gTWlzc2luZyBmaWVsZHM6JywgbWlzc2luZywgZGF0YSk7XG4gIGlmICgncmV3cml0ZXMnIGluIGRhdGEgJiYgIUFycmF5LmlzQXJyYXkoZGF0YS5yZXdyaXRlcykpIHtcbiAgICBsb2cud2FybignW3BhcnNlUmV3cml0ZXNSZXNwb25zZV0gcmV3cml0ZXMgc2hvdWxkIGJlIGFuIGFycmF5OicsIGRhdGEucmV3cml0ZXMpO1xuICB9XG4gIHJldHVybiBkYXRhO1xufVxuXG4vKiogVmFsaWRhdGUgUE9TVCAvYXBpL21lc3NhZ2UgYW5kIFBPU1QgL2FwaS9hY3Rpb24gcmVzcG9uc2VzLiAqL1xuZnVuY3Rpb24gcGFyc2VNZXNzYWdlUmVzcG9uc2UoZGF0YSkge1xuICBpZiAoIWRhdGEub2sgJiYgIWRhdGEuZXJyb3IpIHtcbiAgICBsb2cud2FybignW3BhcnNlTWVzc2FnZVJlc3BvbnNlXSBSZXNwb25zZSBoYXMgbmVpdGhlciBvayBub3IgZXJyb3I6JywgZGF0YSk7XG4gIH1cbiAgcmV0dXJuIGRhdGE7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFUyBtb2R1bGUgZXhwb3J0cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmV4cG9ydCB7XG4gIHBhcnNlU3RhdHVzUmVzcG9uc2UsXG4gIHBhcnNlU2Vzc2lvbkxpc3RSZXNwb25zZSxcbiAgcGFyc2VSZXdyaXRlc1Jlc3BvbnNlLFxuICBwYXJzZU1lc3NhZ2VSZXNwb25zZSxcbn07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9yZWNvbW1lbmRhdGlvbi1oZWxwZXJzLmpzXG4gKiBQdXJlIGhlbHBlciBmdW5jdGlvbnMgZm9yIGxvb2tpbmcgdXAgTExNIHJlY29tbWVuZGF0aW9uIGRhdGEgZnJvbSB0aGVcbiAqIC9hcGkvc3RhdHVzIHJlc3BvbnNlIG9iamVjdC4gIFN1cHBvcnRzIGV4cGVyaWVuY2UsIHNraWxsLCBhbmQgYWNoaWV2ZW1lbnRcbiAqIHJlY29tbWVuZGF0aW9ucyB3aXRoIGJhY2t3YXJkcy1jb21wYXRpYmxlIGZsYXQtbGlzdCBmYWxsYmFja3MgZm9yIG9sZFxuICogc2Vzc2lvbiBkYXRhLlxuICpcbiAqIERFUEVOREVOQ0lFUzogbm9uZVxuICovXG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmNvbnN0IGxvZyA9IGdldExvZ2dlcigncmVjb21tZW5kYXRpb24taGVscGVycycpO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEludGVybmFsIGxvb2t1cCBoZWxwZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIExvb2sgdXAgYSBzaW5nbGUgZXhwZXJpZW5jZSBlbnRyeSBpbiBleHBlcmllbmNlX3JlY29tbWVuZGF0aW9ucy4gKi9cbmZ1bmN0aW9uIF9maW5kRXhwUmVjKGV4cElkLCBkYXRhKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShkYXRhLmV4cGVyaWVuY2VfcmVjb21tZW5kYXRpb25zKSkge1xuICAgIGxvZy53YXJuKCdbcmVjb21tZW5kYXRpb25dIGV4cGVyaWVuY2VfcmVjb21tZW5kYXRpb25zIG1pc3Npbmc7IHVzaW5nIGZsYXQtbGlzdCBmYWxsYmFjayBmb3InLCBleHBJZCk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIGRhdGEuZXhwZXJpZW5jZV9yZWNvbW1lbmRhdGlvbnMuZmluZChyID0+IHIuaWQgPT09IGV4cElkIHx8IHIuZXhwZXJpZW5jZV9pZCA9PT0gZXhwSWQpIHx8IG51bGw7XG59XG5cbi8qKiBMb29rIHVwIGEgc2luZ2xlIHNraWxsIGVudHJ5IGluIHNraWxsX3JlY29tbWVuZGF0aW9ucy4gKi9cbmZ1bmN0aW9uIF9maW5kU2tpbGxSZWMoc2tpbGwsIGRhdGEpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEuc2tpbGxfcmVjb21tZW5kYXRpb25zKSkge1xuICAgIGxvZy53YXJuKCdbcmVjb21tZW5kYXRpb25dIHNraWxsX3JlY29tbWVuZGF0aW9ucyBtaXNzaW5nOyB1c2luZyBmbGF0LWxpc3QgZmFsbGJhY2sgZm9yJywgc2tpbGwpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBkYXRhLnNraWxsX3JlY29tbWVuZGF0aW9ucy5maW5kKHIgPT4gci5za2lsbCA9PT0gc2tpbGwgfHwgci5uYW1lID09PSBza2lsbCkgfHwgbnVsbDtcbn1cblxuLyoqIFBhcnNlIGEgcmF3IGNvbmZpZGVuY2Ugc3RyaW5nIHRvIGEge2xldmVsLCB0ZXh0fSBvYmplY3QsIG9yIG51bGwgaWYgdW5yZWNvZ25pc2VkLiAqL1xuZnVuY3Rpb24gX3BhcnNlQ29uZmlkZW5jZShjb25mKSB7XG4gIGNvbnN0IGMgPSAoY29uZiB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgaWYgKGMuaW5jbHVkZXMoJ3ZlcnkgaGlnaCcpKSByZXR1cm4geyBsZXZlbDogJ3ZlcnktaGlnaCcsIHRleHQ6ICdWZXJ5IEhpZ2ggQ29uZmlkZW5jZScgfTtcbiAgaWYgKGMuaW5jbHVkZXMoJ3ZlcnkgbG93JykpICByZXR1cm4geyBsZXZlbDogJ3ZlcnktbG93JywgIHRleHQ6ICdWZXJ5IExvdyBDb25maWRlbmNlJyAgfTtcbiAgaWYgKGMuaW5jbHVkZXMoJ2hpZ2gnKSkgICAgICByZXR1cm4geyBsZXZlbDogJ2hpZ2gnLCAgICAgIHRleHQ6ICdIaWdoIENvbmZpZGVuY2UnICAgICAgfTtcbiAgaWYgKGMuaW5jbHVkZXMoJ21lZGl1bScpKSAgICByZXR1cm4geyBsZXZlbDogJ21lZGl1bScsICAgIHRleHQ6ICdNZWRpdW0gQ29uZmlkZW5jZScgICAgfTtcbiAgaWYgKGMuaW5jbHVkZXMoJ2xvdycpKSAgICAgICByZXR1cm4geyBsZXZlbDogJ2xvdycsICAgICAgIHRleHQ6ICdMb3cgQ29uZmlkZW5jZScgICAgICAgfTtcbiAgcmV0dXJuIG51bGw7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRXhwZXJpZW5jZSByZWNvbW1lbmRhdGlvbnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiBnZXRFeHBlcmllbmNlUmVjb21tZW5kYXRpb24oZXhwSWQsIGRhdGEpIHtcbiAgY29uc3QgcmVjID0gX2ZpbmRFeHBSZWMoZXhwSWQsIGRhdGEpO1xuICBpZiAocmVjICYmIHJlYy5yZWNvbW1lbmRhdGlvbikgcmV0dXJuIHJlYy5yZWNvbW1lbmRhdGlvbjtcbiAgLy8gQmFja3dhcmRzLWNvbXBhdCBmbGF0LWxpc3QgZmFsbGJhY2tcbiAgaWYgKGRhdGEub21pdHRlZF9leHBlcmllbmNlcyAgICAgJiYgZGF0YS5vbWl0dGVkX2V4cGVyaWVuY2VzLmluY2x1ZGVzKGV4cElkKSkgICAgIHJldHVybiAnT21pdCc7XG4gIGlmIChkYXRhLnJlY29tbWVuZGVkX2V4cGVyaWVuY2VzICYmIGRhdGEucmVjb21tZW5kZWRfZXhwZXJpZW5jZXMuaW5jbHVkZXMoZXhwSWQpKSByZXR1cm4gJ0VtcGhhc2l6ZSc7XG4gIHJldHVybiAnSW5jbHVkZSc7XG59XG5cbmZ1bmN0aW9uIGdldENvbmZpZGVuY2VMZXZlbChleHBJZCwgZGF0YSkge1xuICBjb25zdCByZWMgPSBfZmluZEV4cFJlYyhleHBJZCwgZGF0YSk7XG4gIHJldHVybiAocmVjICYmIF9wYXJzZUNvbmZpZGVuY2UocmVjLmNvbmZpZGVuY2UpKSB8fCB7IGxldmVsOiAnbWVkaXVtJywgdGV4dDogJ01lZGl1bSBDb25maWRlbmNlJyB9O1xufVxuXG5mdW5jdGlvbiBnZXRFeHBlcmllbmNlUmVhc29uaW5nKGV4cElkLCBkYXRhKSB7XG4gIGNvbnN0IHJlYyA9IF9maW5kRXhwUmVjKGV4cElkLCBkYXRhKTtcbiAgcmV0dXJuIChyZWMgJiYgcmVjLnJlYXNvbmluZykgfHwgJ1RoaXMgZXhwZXJpZW5jZSB3YXMgc2VsZWN0ZWQgYmFzZWQgb24gaXRzIHJlbGV2YW5jZSB0byB0aGUgcG9zaXRpb24gcmVxdWlyZW1lbnRzLic7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU2tpbGwgcmVjb21tZW5kYXRpb25zXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gZ2V0U2tpbGxSZWNvbW1lbmRhdGlvbihza2lsbCwgZGF0YSkge1xuICBjb25zdCByZWMgPSBfZmluZFNraWxsUmVjKHNraWxsLCBkYXRhKTtcbiAgaWYgKHJlYyAmJiByZWMucmVjb21tZW5kYXRpb24pIHJldHVybiByZWMucmVjb21tZW5kYXRpb247XG4gIGlmIChkYXRhLnJlY29tbWVuZGVkX3NraWxscyAmJiBkYXRhLnJlY29tbWVuZGVkX3NraWxscy5pbmNsdWRlcyhza2lsbCkpIHJldHVybiAnSW5jbHVkZSc7XG4gIHJldHVybiAnT21pdCc7XG59XG5cbmZ1bmN0aW9uIGdldFNraWxsQ29uZmlkZW5jZShza2lsbCwgZGF0YSkge1xuICBjb25zdCByZWMgPSBfZmluZFNraWxsUmVjKHNraWxsLCBkYXRhKTtcbiAgaWYgKHJlYykge1xuICAgIGNvbnN0IHBhcnNlZCA9IF9wYXJzZUNvbmZpZGVuY2UocmVjLmNvbmZpZGVuY2UpO1xuICAgIGlmIChwYXJzZWQpIHJldHVybiBwYXJzZWQ7XG4gIH1cbiAgaWYgKGRhdGEucmVjb21tZW5kZWRfc2tpbGxzICYmIGRhdGEucmVjb21tZW5kZWRfc2tpbGxzLmluY2x1ZGVzKHNraWxsKSkge1xuICAgIHJldHVybiB7IGxldmVsOiAnbWVkaXVtJywgdGV4dDogJ01lZGl1bSBDb25maWRlbmNlJyB9O1xuICB9XG4gIHJldHVybiB7IGxldmVsOiAnbG93JywgdGV4dDogJ0xvdyBDb25maWRlbmNlJyB9O1xufVxuXG5mdW5jdGlvbiBnZXRTa2lsbFJlYXNvbmluZyhza2lsbCwgZGF0YSkge1xuICBjb25zdCByZWMgPSBfZmluZFNraWxsUmVjKHNraWxsLCBkYXRhKTtcbiAgaWYgKHJlYyAmJiByZWMucmVhc29uaW5nKSByZXR1cm4gcmVjLnJlYXNvbmluZztcbiAgaWYgKGRhdGEucmVjb21tZW5kZWRfc2tpbGxzICYmIGRhdGEucmVjb21tZW5kZWRfc2tpbGxzLmluY2x1ZGVzKHNraWxsKSkge1xuICAgIHJldHVybiAnVGhpcyBza2lsbCB3YXMgaWRlbnRpZmllZCBhcyByZWxldmFudCB0byB0aGUgcG9zaXRpb24gcmVxdWlyZW1lbnRzLic7XG4gIH1cbiAgcmV0dXJuICdUaGlzIHNraWxsIHdhcyBub3Qgc3BlY2lmaWNhbGx5IG1lbnRpb25lZCBpbiB0aGUgam9iIHJlcXVpcmVtZW50cy4nO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEFjaGlldmVtZW50IHJlY29tbWVuZGF0aW9uc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIGdldEFjaGlldmVtZW50UmVjb21tZW5kYXRpb24oYWNoSWQsIGRhdGEpIHtcbiAgaWYgKGRhdGEuYWNoaWV2ZW1lbnRfcmVjb21tZW5kYXRpb25zICYmIEFycmF5LmlzQXJyYXkoZGF0YS5hY2hpZXZlbWVudF9yZWNvbW1lbmRhdGlvbnMpKSB7XG4gICAgY29uc3QgcmVjID0gZGF0YS5hY2hpZXZlbWVudF9yZWNvbW1lbmRhdGlvbnMuZmluZChyID0+IHIuaWQgPT09IGFjaElkKTtcbiAgICBpZiAocmVjICYmIHJlYy5yZWNvbW1lbmRhdGlvbikgcmV0dXJuIHJlYy5yZWNvbW1lbmRhdGlvbjtcbiAgfVxuICBpZiAoZGF0YS5yZWNvbW1lbmRlZF9hY2hpZXZlbWVudHMgJiYgZGF0YS5yZWNvbW1lbmRlZF9hY2hpZXZlbWVudHMuaW5jbHVkZXMoYWNoSWQpKSB7XG4gICAgcmV0dXJuICdJbmNsdWRlJztcbiAgfVxuICByZXR1cm4gJ0RlLWVtcGhhc2l6ZSc7XG59XG5cbmZ1bmN0aW9uIGdldEFjaGlldmVtZW50Q29uZmlkZW5jZShhY2hJZCwgZGF0YSwgYWNoSW1wb3J0YW5jZSkge1xuICBpZiAoZGF0YS5hY2hpZXZlbWVudF9yZWNvbW1lbmRhdGlvbnMgJiYgQXJyYXkuaXNBcnJheShkYXRhLmFjaGlldmVtZW50X3JlY29tbWVuZGF0aW9ucykpIHtcbiAgICBjb25zdCByZWMgPSBkYXRhLmFjaGlldmVtZW50X3JlY29tbWVuZGF0aW9ucy5maW5kKHIgPT4gci5pZCA9PT0gYWNoSWQpO1xuICAgIGlmIChyZWMgJiYgcmVjLmNvbmZpZGVuY2UpIHtcbiAgICAgIGNvbnN0IGNvbmYgPSByZWMuY29uZmlkZW5jZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKGNvbmYuaW5jbHVkZXMoJ3ZlcnkgaGlnaCcpKSByZXR1cm4geyBsZXZlbDogJ3ZlcnktaGlnaCcsIHRleHQ6ICdWZXJ5IEhpZ2gnIH07XG4gICAgICBpZiAoY29uZi5pbmNsdWRlcygnaGlnaCcpKSAgICAgIHJldHVybiB7IGxldmVsOiAnaGlnaCcsICAgICAgdGV4dDogJ0hpZ2gnICAgICAgfTtcbiAgICAgIGlmIChjb25mLmluY2x1ZGVzKCdtZWRpdW0nKSkgICAgcmV0dXJuIHsgbGV2ZWw6ICdtZWRpdW0nLCAgICB0ZXh0OiAnTWVkaXVtJyAgICB9O1xuICAgICAgaWYgKGNvbmYuaW5jbHVkZXMoJ3ZlcnkgbG93JykpICByZXR1cm4geyBsZXZlbDogJ3ZlcnktbG93JywgIHRleHQ6ICdWZXJ5IExvdycgIH07XG4gICAgICBpZiAoY29uZi5pbmNsdWRlcygnbG93JykpICAgICAgIHJldHVybiB7IGxldmVsOiAnbG93JywgICAgICAgdGV4dDogJ0xvdycgICAgICAgfTtcbiAgICB9XG4gIH1cbiAgY29uc3QgaW1wID0gYWNoSW1wb3J0YW5jZSB8fCA1O1xuICBpZiAoaW1wID49IDkpIHJldHVybiB7IGxldmVsOiAndmVyeS1oaWdoJywgdGV4dDogJ1ZlcnkgSGlnaCcgfTtcbiAgaWYgKGltcCA+PSA3KSByZXR1cm4geyBsZXZlbDogJ2hpZ2gnLCAgICAgIHRleHQ6ICdIaWdoJyAgICAgIH07XG4gIGlmIChpbXAgPj0gNSkgcmV0dXJuIHsgbGV2ZWw6ICdtZWRpdW0nLCAgICB0ZXh0OiAnTWVkaXVtJyAgICB9O1xuICBpZiAoaW1wID49IDMpIHJldHVybiB7IGxldmVsOiAnbG93JywgICAgICAgdGV4dDogJ0xvdycgICAgICAgfTtcbiAgcmV0dXJuIHsgbGV2ZWw6ICd2ZXJ5LWxvdycsIHRleHQ6ICdWZXJ5IExvdycgfTtcbn1cblxuZnVuY3Rpb24gZ2V0QWNoaWV2ZW1lbnRSZWFzb25pbmcoYWNoSWQsIGRhdGEsIGFjaCkge1xuICBpZiAoZGF0YS5hY2hpZXZlbWVudF9yZWNvbW1lbmRhdGlvbnMgJiYgQXJyYXkuaXNBcnJheShkYXRhLmFjaGlldmVtZW50X3JlY29tbWVuZGF0aW9ucykpIHtcbiAgICBjb25zdCByZWMgPSBkYXRhLmFjaGlldmVtZW50X3JlY29tbWVuZGF0aW9ucy5maW5kKHIgPT4gci5pZCA9PT0gYWNoSWQpO1xuICAgIGlmIChyZWMgJiYgcmVjLnJlYXNvbmluZykgcmV0dXJuIHJlYy5yZWFzb25pbmc7XG4gIH1cbiAgY29uc3QgcmVsZXZhbnRGb3IgPSAoYWNoLnJlbGV2YW50X2ZvciB8fCBbXSkuam9pbignLCAnKTtcbiAgaWYgKGRhdGEucmVjb21tZW5kZWRfYWNoaWV2ZW1lbnRzICYmIGRhdGEucmVjb21tZW5kZWRfYWNoaWV2ZW1lbnRzLmluY2x1ZGVzKGFjaElkKSkge1xuICAgIHJldHVybiByZWxldmFudEZvclxuICAgICAgPyBgUmVjb21tZW5kZWQgZm9yIHRoaXMgcm9sZS4gUmVsZXZhbnQgZm9yOiAke3JlbGV2YW50Rm9yfS5gXG4gICAgICA6ICdSZWNvbW1lbmRlZCBieSBBSSBhcyByZWxldmFudCB0byB0aGlzIHJvbGUuJztcbiAgfVxuICByZXR1cm4gcmVsZXZhbnRGb3JcbiAgICA/IGBSZWxldmFudCBmb3I6ICR7cmVsZXZhbnRGb3J9LiBOb3Qgc3BlY2lmaWNhbGx5IGhpZ2hsaWdodGVkIGZvciB0aGlzIHJvbGUuYFxuICAgIDogJ05vdCBzcGVjaWZpY2FsbHkgaGlnaGxpZ2h0ZWQgZm9yIHRoaXMgcm9sZSBiYXNlZCBvbiBqb2IgcmVxdWlyZW1lbnRzLic7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRmFsbGJhY2sgcXVlc3Rpb24gZ2VuZXJhdGlvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIGJ1aWxkRmFsbGJhY2tQb3N0QW5hbHlzaXNRdWVzdGlvbnMoZGF0YSkge1xuICBjb25zdCBxdWVzdGlvbnMgPSBbXTtcblxuICBpZiAoZGF0YS5yb2xlX2xldmVsKSB7XG4gICAgcXVlc3Rpb25zLnB1c2goe1xuICAgICAgcXVlc3Rpb246IGBUaGlzIHJvbGUgYXBwZWFycyB0byBiZSBhdCAke2RhdGEucm9sZV9sZXZlbH0gbGV2ZWwuIFNob3VsZCBJIGVtcGhhc2l6ZSB5b3VyIG1vc3Qgc2VuaW9yIGV4cGVyaWVuY2VzIG9yIGluY2x1ZGUgYSBicm9hZGVyIHJhbmdlIHRvIHNob3cgY2FyZWVyIHByb2dyZXNzaW9uP2AsXG4gICAgICB0eXBlOiAnZXhwZXJpZW5jZV9sZXZlbCcsXG4gICAgICBjaG9pY2VzOiBbJ0VtcGhhc2l6ZSBtb3N0IHNlbmlvcicsICdCcm9hZGVyIGNhcmVlciBwcm9ncmVzc2lvbicsICdMZXQgeW91IGRlY2lkZSBiYXNlZCBvbiBhbmFseXNpcyddLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKGRhdGEucmVxdWlyZWRfc2tpbGxzICYmIGRhdGEucmVxdWlyZWRfc2tpbGxzLnNvbWUoc2tpbGwgPT5cbiAgICAgIHNraWxsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2xlYWRlcnNoaXAnKSB8fFxuICAgICAgc2tpbGwudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnbWFuYWdlbWVudCcpIHx8XG4gICAgICBza2lsbC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCd0ZWFtJykpKSB7XG4gICAgcXVlc3Rpb25zLnB1c2goe1xuICAgICAgcXVlc3Rpb246ICdUaGlzIHJvbGUgaGFzIGxlYWRlcnNoaXAgY29tcG9uZW50cy4gV291bGQgeW91IHByZWZlciBtZSB0byBlbXBoYXNpemUgeW91ciBtYW5hZ2VtZW50IGV4cGVyaWVuY2Ugb3IgZm9jdXMgbW9yZSBvbiB5b3VyIHRlY2huaWNhbCBjb250cmlidXRpb25zPycsXG4gICAgICB0eXBlOiAnbGVhZGVyc2hpcF9mb2N1cycsXG4gICAgICBjaG9pY2VzOiBbJ0VtcGhhc2l6ZSBtYW5hZ2VtZW50JywgJ0ZvY3VzIG9uIHRlY2huaWNhbCcsICdCYWxhbmNlIGJvdGggZXF1YWxseSddLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKGRhdGEuZG9tYWluKSB7XG4gICAgcXVlc3Rpb25zLnB1c2goe1xuICAgICAgcXVlc3Rpb246IGBUaGUgcm9sZSBpcyBpbiAke2RhdGEuZG9tYWlufS4gRG8geW91IGhhdmUgcGFydGljdWxhciBwcm9qZWN0cyBvciBhY2hpZXZlbWVudHMgaW4gdGhpcyBkb21haW4gdGhhdCB5b3UnZCBsaWtlIG1lIHRvIGhpZ2hsaWdodD9gLFxuICAgICAgdHlwZTogJ2RvbWFpbl9leHBlcnRpc2UnLFxuICAgICAgY2hvaWNlczogWydIaWdobGlnaHQgZG9tYWluLXNwZWNpZmljIGFjaGlldmVtZW50cycsICdVc2UgYWxsIGF2YWlsYWJsZSBleHBlcmllbmNlJywgJ1ByaW9yaXRpemUgbW9zdCByZWNlbnQgd29yayddLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKGRhdGEuY29tcGFueSkge1xuICAgIHF1ZXN0aW9ucy5wdXNoKHtcbiAgICAgIHF1ZXN0aW9uOiBgRm9yICR7ZGF0YS5jb21wYW55fSwgd291bGQgeW91IGxpa2UgbWUgdG8gdGFpbG9yIGVtcGhhc2lzIHRvd2FyZCB0aGVpciBjdWx0dXJlIGFuZCB2YWx1ZXM/IElmIHNvLCB3aGF0IHNob3VsZCBJIHByaW9yaXRpemU/YCxcbiAgICAgIHR5cGU6ICdjb21wYW55X2N1bHR1cmUnLFxuICAgICAgY2hvaWNlczogWydSZXNlYXJjaC1kcml2ZW4gLyBhY2FkZW1pYycsICdJbmR1c3RyeSAvIGNvbW1lcmNpYWwgaW1wYWN0JywgJ0lubm92YXRpb24gLyBzdGFydHVwJywgJ1VzZSBjdWx0dXJhbCBpbmRpY2F0b3JzIGZyb20gam9iIGRlc2NyaXB0aW9uJ10sXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gcXVlc3Rpb25zO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgRVMgbW9kdWxlIGV4cG9ydHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5leHBvcnQge1xuICBnZXRFeHBlcmllbmNlUmVjb21tZW5kYXRpb24sIGdldENvbmZpZGVuY2VMZXZlbCwgZ2V0RXhwZXJpZW5jZVJlYXNvbmluZyxcbiAgZ2V0U2tpbGxSZWNvbW1lbmRhdGlvbiwgZ2V0U2tpbGxDb25maWRlbmNlLCBnZXRTa2lsbFJlYXNvbmluZyxcbiAgZ2V0QWNoaWV2ZW1lbnRSZWNvbW1lbmRhdGlvbiwgZ2V0QWNoaWV2ZW1lbnRDb25maWRlbmNlLCBnZXRBY2hpZXZlbWVudFJlYXNvbmluZyxcbiAgYnVpbGRGYWxsYmFja1Bvc3RBbmFseXNpc1F1ZXN0aW9ucyxcbn07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi91aS1oZWxwZXJzLmpzXG4gKiBMaWdodHdlaWdodCBET00gaGVscGVyczogdG9hc3RzLCBhbGVydC9jb25maXJtIG1vZGFscywgY2hhdCB0b2dnbGUsIGFuZFxuICogd29ya2Zsb3ctc3RhZ2UgYWN0aW9uLWJ1dHRvbiBtYW5hZ2VtZW50LlxuICpcbiAqIERFUEVOREVOQ0lFUzogdWktY29yZS5qcyBleHBvcnRzICh0cmFwRm9jdXMsIHJlc3RvcmVGb2N1cywgc2V0SW5pdGlhbEZvY3VzLFxuICogICAgICAgICAgICAgICBwdXNoRm9jdXNTdGFjaykgYXZhaWxhYmxlIG9uIGdsb2JhbFRoaXMgYXQgcnVudGltZS5cbiAqL1xuXG5pbXBvcnQgeyBzdGF0ZU1hbmFnZXIsIEdFTkVSQVRJT05fU1RBVEVfRVZFTlQgfSBmcm9tICcuL3N0YXRlLW1hbmFnZXIuanMnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEFsZXJ0IG1vZGFsIChpbmZvcm1hdGlvbmFsIFx1MjAxNCBzaW5nbGUgT0sgYnV0dG9uKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIF9zZXRNb2RhbFRleHQoZWwsIG1lc3NhZ2UpIHtcbiAgZWwudGV4dENvbnRlbnQgPSAnJztcbiAgY29uc3QgcGFydHMgPSBTdHJpbmcobWVzc2FnZSB8fCAnJykuc3BsaXQoJ1xcbicpO1xuICBwYXJ0cy5mb3JFYWNoKChwYXJ0LCBpKSA9PiB7XG4gICAgZWwuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUocGFydCkpO1xuICAgIGlmIChpIDwgcGFydHMubGVuZ3RoIC0gMSkgZWwuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnInKSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzaG93QWxlcnRNb2RhbCh0aXRsZSwgbWVzc2FnZSkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWxlcnQtbW9kYWwtdGl0bGUnKS50ZXh0Q29udGVudCA9IHRpdGxlO1xuICBfc2V0TW9kYWxUZXh0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhbGVydC1tb2RhbC1tZXNzYWdlJyksIG1lc3NhZ2UpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWxlcnQtbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAvLyBwdXNoRm9jdXNTdGFjayAoR0FQLTE5NykgcGFpcnMgd2l0aCB0cmFwRm9jdXMvcmVzdG9yZUZvY3VzIGJlbG93IFx1MjAxNCB1c2luZ1xuICAvLyB0aGUgc2hhcmVkIGZvY3VzLXN0YWNrIG1lY2hhbmlzbSwgbm90IGEgbG9jYWwgdmFyaWFibGUsIHNvIGNsb3NlQWxlcnRNb2RhbFxuICAvLyBhbHNvIHBvcHMgdGhlIGtleWRvd24gbGlzdGVuZXIgdHJhcEZvY3VzIHJlZ2lzdGVycyBvbiBkb2N1bWVudC4gQSBwcmlvclxuICAvLyB2ZXJzaW9uIHRyYWNrZWQgaXRzIG93biBgX2FsZXJ0UHJldmlvdXNGb2N1c2AgYW5kIG5ldmVyIGNhbGxlZFxuICAvLyByZXN0b3JlRm9jdXMoKSwgd2hpY2ggbGVmdCB0aGF0IHRyYXBGb2N1cyBsaXN0ZW5lciBwZXJtYW5lbnRseSBhdHRhY2hlZFxuICAvLyBhZnRlciBldmVyeSBhbGVydCBtb2RhbCBjbG9zZS5cbiAgaWYgKHR5cGVvZiBwdXNoRm9jdXNTdGFjayA9PT0gJ2Z1bmN0aW9uJykgcHVzaEZvY3VzU3RhY2soZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7XG4gIGlmICh0eXBlb2Ygc2V0SW5pdGlhbEZvY3VzID09PSAnZnVuY3Rpb24nKSBzZXRJbml0aWFsRm9jdXMoJ2FsZXJ0LW1vZGFsLW92ZXJsYXknKTtcbiAgaWYgKHR5cGVvZiB0cmFwRm9jdXMgPT09ICdmdW5jdGlvbicpIHRyYXBGb2N1cygnYWxlcnQtbW9kYWwtb3ZlcmxheScpO1xufVxuXG5mdW5jdGlvbiBjbG9zZUFsZXJ0TW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhbGVydC1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgaWYgKHR5cGVvZiByZXN0b3JlRm9jdXMgPT09ICdmdW5jdGlvbicpIHJlc3RvcmVGb2N1cygpO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIENvbmZpcm0gbW9kYWwgKHJldHVybnMgYSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdHJ1ZS9mYWxzZSlcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5sZXQgX2NvbmZpcm1SZXNvbHZlID0gbnVsbDtcbmxldCBfY29uZmlybVByZXZpb3VzRm9jdXMgPSBudWxsO1xuXG5mdW5jdGlvbiBzaG93Q29uZmlybU1vZGFsKHRpdGxlLCBtZXNzYWdlLCBva0xhYmVsID0gJ09LJykge1xuICBfY29uZmlybVByZXZpb3VzRm9jdXMgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29uZmlybS1tb2RhbC10aXRsZScpLnRleHRDb250ZW50ID0gdGl0bGU7XG4gIF9zZXRNb2RhbFRleHQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbmZpcm0tbW9kYWwtbWVzc2FnZScpLCBtZXNzYWdlKTtcbiAgY29uc3Qgb2tCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29uZmlybS1tb2RhbC1vaycpO1xuICBpZiAob2tCdG4pIG9rQnRuLnRleHRDb250ZW50ID0gb2tMYWJlbDtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbmZpcm0tbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICBpZiAob2tCdG4pIG9rQnRuLmZvY3VzKCk7XG4gIGlmICh0eXBlb2YgdHJhcEZvY3VzID09PSAnZnVuY3Rpb24nKSB0cmFwRm9jdXMoJ2NvbmZpcm0tbW9kYWwtb3ZlcmxheScpO1xuICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7IF9jb25maXJtUmVzb2x2ZSA9IHJlc29sdmU7IH0pO1xufVxuXG5mdW5jdGlvbiBjbG9zZUNvbmZpcm1Nb2RhbChyZXN1bHQpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbmZpcm0tbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIGlmICh0eXBlb2YgcmVzdG9yZUZvY3VzID09PSAnZnVuY3Rpb24nKSByZXN0b3JlRm9jdXMoKTtcbiAgaWYgKF9jb25maXJtUmVzb2x2ZSkgeyBfY29uZmlybVJlc29sdmUocmVzdWx0KTsgX2NvbmZpcm1SZXNvbHZlID0gbnVsbDsgfVxuICBpZiAoX2NvbmZpcm1QcmV2aW91c0ZvY3VzICYmIHR5cGVvZiBfY29uZmlybVByZXZpb3VzRm9jdXMuZm9jdXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBfY29uZmlybVByZXZpb3VzRm9jdXMuZm9jdXMoKTtcbiAgfVxuICBfY29uZmlybVByZXZpb3VzRm9jdXMgPSBudWxsO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFRvYXN0IG5vdGlmaWNhdGlvbnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiBzaG93VG9hc3QobWVzc2FnZSwgdHlwZSA9ICdzdWNjZXNzJywgZHVyYXRpb24gPSAzMDAwKSB7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2FzdC1jb250YWluZXInKTtcbiAgaWYgKCFjb250YWluZXIpIHJldHVybjtcbiAgY29uc3QgdG9hc3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgdG9hc3QuY2xhc3NOYW1lID0gYHRvYXN0IHRvYXN0LSR7dHlwZX1gO1xuICB0b2FzdC50ZXh0Q29udGVudCA9IG1lc3NhZ2U7XG4gIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0b2FzdCk7XG4gIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7IHRvYXN0LmNsYXNzTGlzdC5hZGQoJ3RvYXN0LXNob3cnKTsgfSk7IH0pO1xuICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICB0b2FzdC5jbGFzc0xpc3QucmVtb3ZlKCd0b2FzdC1zaG93Jyk7XG4gICAgdG9hc3QuYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsICgpID0+IHRvYXN0LnJlbW92ZSgpLCB7IG9uY2U6IHRydWUgfSk7XG4gIH0sIGR1cmF0aW9uKTtcbn1cblxuZnVuY3Rpb24gcmVmcmVzaExheW91dFN0YXR1c1VJKCkge1xuICBjb25zdCBsYXlvdXRDaGlwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xheW91dC1mcmVzaG5lc3MtY2hpcCcpO1xuICBjb25zdCBsYXlvdXRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGF5b3V0LWJ0bicpO1xuICBjb25zdCBmcmVzaG5lc3MgPSBzdGF0ZU1hbmFnZXIuZ2V0TGF5b3V0RnJlc2huZXNzKCk7XG4gIGNvbnN0IGdlbmVyYXRpb25TdGF0ZSA9IHN0YXRlTWFuYWdlci5nZXRHZW5lcmF0aW9uU3RhdGUoKTtcblxuICBpZiAobGF5b3V0Q2hpcCkge1xuICAgIGxheW91dENoaXAuc3R5bGUuZGlzcGxheSA9IGZyZXNobmVzcy5zaG93Q2hpcCA/ICcnIDogJ25vbmUnO1xuICAgIGxheW91dENoaXAuY2xhc3NOYW1lID0gYGxheW91dC1mcmVzaG5lc3MtY2hpcCAke2ZyZXNobmVzcy50b25lfWA7XG4gICAgbGF5b3V0Q2hpcC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCBmcmVzaG5lc3MuYXJpYUxhYmVsIHx8ICcnKTtcbiAgICBsYXlvdXRDaGlwLmlubmVySFRNTCA9IGZyZXNobmVzcy5zaG93Q2hpcFxuICAgICAgPyBgPHNwYW4gY2xhc3M9XCJsYXlvdXQtZnJlc2huZXNzLWljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj4ke2ZyZXNobmVzcy5pc0NyaXRpY2FsID8gJ1x1MjFCQicgOiAoZnJlc2huZXNzLmlzU3RhbGUgPyAnIScgOiAnXHUyNzEzJyl9PC9zcGFuPjxzcGFuIGNsYXNzPVwibGF5b3V0LWZyZXNobmVzcy1sYWJlbFwiPiR7ZnJlc2huZXNzLmxhYmVsfTwvc3Bhbj5gXG4gICAgICA6ICcnO1xuICB9XG5cbiAgaWYgKGxheW91dEJ0bikge1xuICAgIGlmIChmcmVzaG5lc3MuaXNTdGFsZSkge1xuICAgICAgbGF5b3V0QnRuLnRleHRDb250ZW50ID0gJ1x1MjFCQiBSZWdlbmVyYXRlIFByZXZpZXcnO1xuICAgICAgbGF5b3V0QnRuLnRpdGxlID0gJ1ByZXZpZXcgaXMgb3V0IG9mIGRhdGUgXHUyMDE0IHJlZ2VuZXJhdGUgYmVmb3JlIGNvbmZpcm1pbmcgbGF5b3V0JztcbiAgICB9IGVsc2UgaWYgKGdlbmVyYXRpb25TdGF0ZS5sYXlvdXRDb25maXJtZWQgfHwgZ2VuZXJhdGlvblN0YXRlLnBoYXNlID09PSAnY29uZmlybWVkJykge1xuICAgICAgbGF5b3V0QnRuLnRleHRDb250ZW50ID0gJ1x1MkIwN1x1RkUwRiBHZW5lcmF0ZSBGaW5hbCBGaWxlcyc7XG4gICAgICBsYXlvdXRCdG4udGl0bGUgPSAnTGF5b3V0IGNvbmZpcm1lZCBcdTIwMTQgcHJvZHVjZSBmaW5hbCBzdWJtaXNzaW9uLXJlYWR5IERPQ1ggYW5kIFBERiBmaWxlcyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxheW91dEJ0bi50ZXh0Q29udGVudCA9ICdcdTI3MDUgQ29uZmlybSBMYXlvdXQnO1xuICAgICAgbGF5b3V0QnRuLnRpdGxlID0gJ1N0ZXAgMiBvZiAzOiBDb25maXJtIHRoZSBsYXlvdXQgbG9va3MgcmlnaHQgYmVmb3JlIGdlbmVyYXRpbmcgZmluYWwgZmlsZXMnO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVMYXlvdXRGcmVzaG5lc3NDaGlwQ2xpY2soKSB7XG4gIGlmICh0eXBlb2YgdXBkYXRlVGFiQmFyRm9yU3RhZ2UgPT09ICdmdW5jdGlvbicpIHVwZGF0ZVRhYkJhckZvclN0YWdlKCdsYXlvdXQnKTtcbiAgaWYgKHR5cGVvZiB1cGRhdGVBY3Rpb25CdXR0b25zID09PSAnZnVuY3Rpb24nKSB1cGRhdGVBY3Rpb25CdXR0b25zKCdsYXlvdXQnKTtcbiAgaWYgKHR5cGVvZiBzd2l0Y2hUYWIgPT09ICdmdW5jdGlvbicpIHN3aXRjaFRhYignbGF5b3V0Jyk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gV29ya2Zsb3ctc3RhZ2UgcHJpbWFyeSBhY3Rpb24gYnV0dG9uc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBBbGwgc3RhZ2Utc3BlY2lmaWMgcHJpbWFyeSBhY3Rpb24gYnV0dG9uIElEcyAoZXhjbHVkZXMgcmVzZXQgd2hpY2ggaXMgYWx3YXlzIHZpc2libGUpLiAqL1xuY29uc3QgX1NUQUdFX0JVVFRPTlMgPSBbXG4gICdhbmFseXplLWJ0bicsICdyZWNvbW1lbmQtYnRuJywgJ2dlbmVyYXRlLWJ0bicsXG4gICdyZXdyaXRlLWJ0bicsICdzcGVsbC1idG4nLCAnZ2VuZXJhdGUtcHJvY2VlZC1idG4nLFxuICAnbGF5b3V0LWJ0bicsICdmaW5hbC1nZW5lcmF0ZS1wcm9jZWVkLWJ0bicsICdmaW5hbGlzZS1hY3Rpb24tYnRuJyxcbl07XG5cbi8qKiBNYXBzIGVhY2ggd29ya2Zsb3cgc3RhZ2UgdG8gaXRzIG9uZSBwcmltYXJ5IGFjdGlvbiBidXR0b24uICovXG5jb25zdCBfU1RBR0VfQlVUVE9OX01BUCA9IHtcbiAgam9iOiAgICAgICAgICAgICdhbmFseXplLWJ0bicsXG4gIGFuYWx5c2lzOiAgICAgICAncmVjb21tZW5kLWJ0bicsXG4gIGN1c3RvbWl6YXRpb25zOiAnZ2VuZXJhdGUtYnRuJyxcbiAgcmV3cml0ZTogICAgICAgICdyZXdyaXRlLWJ0bicsXG4gIHNwZWxsOiAgICAgICAgICAnc3BlbGwtYnRuJyxcbiAgZ2VuZXJhdGU6ICAgICAgICdnZW5lcmF0ZS1wcm9jZWVkLWJ0bicsXG4gIGxheW91dDogICAgICAgICAnbGF5b3V0LWJ0bicsXG4gIGZpbmFsX2dlbmVyYXRlOiAnZmluYWwtZ2VuZXJhdGUtcHJvY2VlZC1idG4nLFxuICBmaW5hbGlzZTogICAgICAgJ2ZpbmFsaXNlLWFjdGlvbi1idG4nLFxufTtcblxuLyoqXG4gKiBTaG93IG9ubHkgdGhlIHByaW1hcnkgYWN0aW9uIGJ1dHRvbiBmb3IgdGhlIGdpdmVuIHdvcmtmbG93IHN0YWdlLlxuICogUmVzZXQgaXMgYWx3YXlzIHZpc2libGUuICBBbGwgb3RoZXIgc3RhZ2UgYnV0dG9ucyBhcmUgaGlkZGVuLlxuICovXG5mdW5jdGlvbiB1cGRhdGVBY3Rpb25CdXR0b25zKHN0YWdlKSB7XG4gIGNvbnN0IGFjdGl2ZUlkID0gX1NUQUdFX0JVVFRPTl9NQVBbc3RhZ2VdIHx8IG51bGw7XG4gIF9TVEFHRV9CVVRUT05TLmZvckVhY2goaWQgPT4ge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgIGlmIChlbCkgZWwuc3R5bGUuZGlzcGxheSA9IChpZCA9PT0gYWN0aXZlSWQpID8gJycgOiAnbm9uZSc7XG4gIH0pO1xuICByZWZyZXNoTGF5b3V0U3RhdHVzVUkoKTtcbn1cblxuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEdFTkVSQVRJT05fU1RBVEVfRVZFTlQsIHJlZnJlc2hMYXlvdXRTdGF0dXNVSSk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFUyBtb2R1bGUgZXhwb3J0cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmV4cG9ydCB7XG4gIHNob3dBbGVydE1vZGFsLCBjbG9zZUFsZXJ0TW9kYWwsXG4gIHNob3dDb25maXJtTW9kYWwsIGNsb3NlQ29uZmlybU1vZGFsLFxuICBzaG93VG9hc3QsXG4gIHJlZnJlc2hMYXlvdXRTdGF0dXNVSSxcbiAgaGFuZGxlTGF5b3V0RnJlc2huZXNzQ2hpcENsaWNrLFxuICB1cGRhdGVBY3Rpb25CdXR0b25zLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogU2hhcmVkIHByb3Bvc2FsLXJldmlldyByb3cgcmVuZGVyZXIsIGV4dHJhY3RlZCBmcm9tIHdlYi9oYXJ2ZXN0LmpzIHNvIHRoZVxuICogR0FQLTAxIFwiVXBkYXRlIHZpYSBBSVwiIHBhbmVsICh3ZWIvbWFzdGVyLWRhdGEtYWktdXBkYXRlLmpzKSBkb2Vzbid0XG4gKiBkdXBsaWNhdGUgb3IgZm9yayB0aGUgc2FtZSBiZWZvcmUvYWZ0ZXIgZGlmZi1yb3cgVUkgYSB0aGlyZCB0aW1lLlxuICpcbiAqIFJvdyBtYXJrdXAgdXNlcyBgZGF0YS10b2dnbGUtcmVhc29uaW5nPVwiSURcImAgYXR0cmlidXRlcyBpbnN0ZWFkIG9mIGlubGluZVxuICogYG9uY2xpY2s9XCIuLi5cImAgaGFuZGxlcnMgXHUyMDE0IHRoZSBjYWxsZXIgYXR0YWNoZXMgT05FIGRlbGVnYXRlZCBjbGlja1xuICogbGlzdGVuZXIgKGF0dGFjaFByb3Bvc2FsUm93TGlzdGVuZXJzKSByYXRoZXIgdGhhbiBlYWNoIHJvdyB3aXJpbmcgaXRzIG93blxuICogaW5saW5lIGhhbmRsZXIuIFRoaXMgbWF0dGVycyBiZWNhdXNlIGhhcnZlc3QuanMncyBvcmlnaW5hbCBpbmxpbmUtb25jbGlja1xuICogdmVyc2lvbiBjYWxsZWQgaGFydmVzdC5qcy1zcGVjaWZpYyBnbG9iYWwgZnVuY3Rpb25zIGRpcmVjdGx5OyBhIHJvd1xuICogcmVuZGVyZWQgYnkgYSBkaWZmZXJlbnQgbW9kdWxlIChtYXN0ZXItZGF0YS1haS11cGRhdGUuanMpIG11c3Qgbm90XG4gKiBzaWxlbnRseSByZWZlcmVuY2UgZnVuY3Rpb25zIHRoYXQgZG9uJ3QgZXhpc3QgdGhlcmUuXG4gKlxuICogYGlkUHJlZml4YCBrZWVwcyBlYWNoIGNhbGxlcidzIGV4aXN0aW5nIERPTS1pZCBjb252ZW50aW9uIGludGFjdCAoZS5nLlxuICogaGFydmVzdC5qcydzIGBoYXJ2ZXN0LXJvdy0qYC9gaGFydmVzdC1jaGstKmAsIHJlZmVyZW5jZWQgZWxzZXdoZXJlIGluIHRoYXRcbiAqIGZpbGUsIG5vdGFibHkgYXBwbHlIYXJ2ZXN0U2VsZWN0aW9ucykgcmF0aGVyIHRoYW4gZm9yY2luZyBhIHJlbmFtZS5cbiAqXG4gKiBQdWJsaWMgZXhwb3J0czpcbiAqICAgZXNjKHN0cilcbiAqICAgcmVuZGVyUHJvcG9zYWxSb3coaXRlbSwgb3B0cylcbiAqICAgYXR0YWNoUHJvcG9zYWxSb3dMaXN0ZW5lcnMoY29udGFpbmVyRWwsIGlkUHJlZml4LCBoYW5kbGVycylcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXNjKHN0cikge1xuICByZXR1cm4gU3RyaW5nKHN0ciA/PyAnJylcbiAgICAucmVwbGFjZSgvJi9nLCAnJmFtcDsnKVxuICAgIC5yZXBsYWNlKC88L2csICcmbHQ7JylcbiAgICAucmVwbGFjZSgvPi9nLCAnJmd0OycpXG4gICAgLnJlcGxhY2UoL1wiL2csICcmcXVvdDsnKTtcbn1cblxuLyoqXG4gKiBSZW5kZXIgb25lIHByb3Bvc2FsLXJldmlldyByb3cgKGNoZWNrYm94ICsgYmVmb3JlL2FmdGVyICsgb3B0aW9uYWxcbiAqIGNvbGxhcHNpYmxlIGRldGFpbCArIG9wdGlvbmFsIGJhZGdlcy9mbGFnIGJhbm5lcikuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGl0ZW1cbiAqIEBwYXJhbSB7c3RyaW5nfSBpdGVtLmlkXG4gKiBAcGFyYW0ge3N0cmluZ30gaXRlbS50eXBlTGFiZWwgICAgIC0gc21hbGwgY2FwcyBsYWJlbCBhYm92ZSB0aGUgcm93IChlLmcuIHNlY3Rpb24gbmFtZSlcbiAqIEBwYXJhbSB7c3RyaW5nfSBbaXRlbS5zb3VyY2VCYWRnZUh0bWxdXG4gKiBAcGFyYW0ge3N0cmluZ30gaXRlbS5sYWJlbCAgICAgICAgIC0gc2Vjb25kYXJ5IHN1bW1hcnkgbGluZVxuICogQHBhcmFtIHtzdHJpbmd9IFtpdGVtLm9yaWdpbmFsXSAgICAtIFwiQmVmb3JlXCIgYmxvY2sgdGV4dCAob21pdCBmb3IgYWRkLW9ubHkgcHJvcG9zYWxzKVxuICogQHBhcmFtIHtzdHJpbmd9IFtpdGVtLnByb3Bvc2VkXSAgICAtIFwiQWZ0ZXJcIiBibG9jayB0ZXh0IChhbHJlYWR5IGRpc3BsYXktcmVhZHksIG5vdCBhIHJhdyBvYmplY3QpXG4gKiBAcGFyYW0ge3N0cmluZ30gW2l0ZW0uZGV0YWlsVGV4dF0gIC0gY29sbGFwc2libGUgZGV0YWlsIChoYXJ2ZXN0OiByZWFzb25pbmc7IEdBUC0wMTogcmF0aW9uYWxlKVxuICogQHBhcmFtIHtzdHJpbmd9IFtpdGVtLmJhZGdlc0h0bWxdICAtIHByZS1yZW5kZXJlZCByaWdodC1zaWRlIGJhZGdlIEhUTUwgKGNhbGxlci1zcGVjaWZpYylcbiAqIEBwYXJhbSB7c3RyaW5nfSBbaXRlbS5mbGFnSHRtbF0gICAgLSBwcmUtcmVuZGVyZWQgYWR2aXNvcnkvd2FybmluZyBiYW5uZXIgKGUuZy4gcG9zc2libGUtZHVwbGljYXRlLCBzdGFsZSlcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2l0ZW0uY2hlY2tlZF1cbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5pZFByZWZpeCAgICAgICAgICAtIHNoYXJlZCBwcmVmaXggZm9yIHJvdy9yZWFzb24vY2hlY2tib3ggaWRzLCBlLmcuICdoYXJ2ZXN0JyBvciAnbWR1J1xuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmNoZWNrYm94RGF0YUF0dHJdIC0ga2ViYWItY2FzZSBkYXRhLWF0dHJpYnV0ZSBzdWZmaXgsIGUuZy4gJ2hhcnZlc3QtaWQnIG9yICdtZHUtaWQnXG4gKiAgIChOT1QgY2FtZWxDYXNlIFx1MjAxNCB0aGlzIGlzIGludGVycG9sYXRlZCB2ZXJiYXRpbSBpbnRvIGBkYXRhLSR7Y2hlY2tib3hEYXRhQXR0cn1gIGluIHRoZSBIVE1MIHN0cmluZztcbiAqICAgYSBjYW1lbENhc2UgdmFsdWUgbGlrZSAnaGFydmVzdElkJyBwcm9kdWNlcyB0aGUgbGl0ZXJhbCBhdHRyaWJ1dGUgYGRhdGEtaGFydmVzdElkYCwgd2hpY2ggdGhlIEhUTUxcbiAqICAgcGFyc2VyIGxvd2VyY2FzZXMgdG8gYGRhdGEtaGFydmVzdGlkYCBvbiBpbnNlcnRpb24sIHNpbGVudGx5IGJyZWFraW5nIGAuZGF0YXNldC5oYXJ2ZXN0SWRgIC9cbiAqICAgYFtkYXRhLWhhcnZlc3QtaWRdYCBsb29rdXBzIGVsc2V3aGVyZS4gVGhpcyBiaXQgbWFzdGVyLWRhdGEtYWktdXBkYXRlLmpzJ3Mgb3duIGZpcnN0IGRyYWZ0LilcbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5hcmlhTGFiZWxTdWZmaXhdICAtIGFwcGVuZGVkIHRvIHRoZSBjaGVja2JveCdzIGFyaWEtbGFiZWwgYWZ0ZXIgYGxhYmVsYCAoZS5nLiBkdXBsaWNhdGUvZmxhZyB0ZXh0KVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyUHJvcG9zYWxSb3coaXRlbSwgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBpZFByZWZpeCA9ICdwcm9wb3NhbCcsXG4gICAgY2hlY2tib3hEYXRhQXR0ciA9ICdwcm9wb3NhbC1pZCcsXG4gICAgYXJpYUxhYmVsU3VmZml4ID0gJycsXG4gIH0gPSBvcHRzO1xuXG4gIGNvbnN0IGNoZWNrZWQgPSBpdGVtLmNoZWNrZWQgPyAnIGNoZWNrZWQnIDogJyc7XG4gIGNvbnN0IHJvd0lkID0gYCR7aWRQcmVmaXh9LXJvdy0ke2VzYyhpdGVtLmlkKX1gO1xuICBjb25zdCByZWFzb25JZCA9IGAke2lkUHJlZml4fS1yZWFzb24tJHtlc2MoaXRlbS5pZCl9YDtcbiAgY29uc3QgY2hlY2tib3hJZCA9IGAke2lkUHJlZml4fS1jaGstJHtlc2MoaXRlbS5pZCl9YDtcbiAgY29uc3QgYXJpYUxhYmVsID0gZXNjKGAke2l0ZW0ubGFiZWwgfHwgJyd9JHthcmlhTGFiZWxTdWZmaXh9YCk7XG5cbiAgY29uc3QgaGFzRGV0YWlsID0gQm9vbGVhbihpdGVtLmRldGFpbFRleHQpO1xuICBjb25zdCBkZXRhaWxUb2dnbGUgPSBoYXNEZXRhaWxcbiAgICA/IGA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLXRvZ2dsZS1yZWFzb25pbmc9XCIke2VzYyhpdGVtLmlkKX1cIiBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIiBhcmlhLWNvbnRyb2xzPVwiJHtyZWFzb25JZH1cIiBzdHlsZT1cImZvbnQtc2l6ZTowLjc1ZW07YmFja2dyb3VuZDpub25lO2JvcmRlcjpub25lO2NvbG9yOnZhcigtLWN2LWdyYXktNTAwKTtjdXJzb3I6cG9pbnRlcjtwYWRkaW5nOjAgNHB4O3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtcIiB0aXRsZT1cIlRvZ2dsZSBkZXRhaWxzXCI+XHVEODNEXHVEQ0FDPC9idXR0b24+YFxuICAgIDogJyc7XG4gIGNvbnN0IGRldGFpbEJsb2NrID0gaGFzRGV0YWlsXG4gICAgPyBgPGRpdiBpZD1cIiR7cmVhc29uSWR9XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7bWFyZ2luLXRvcDo2cHg7cGFkZGluZzo4cHggMTBweDtiYWNrZ3JvdW5kOnZhcigtLWN2LWJnLWxpZ2h0KTtib3JkZXItbGVmdDozcHggc29saWQgdmFyKC0tY3Ytc2xhdGUtNDAwKTtib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6MC44MmVtO2NvbG9yOnZhcigtLWN2LXRleHQtbXV0ZWQpO2xpbmUtaGVpZ2h0OjEuNTtcIj4ke2VzYyhpdGVtLmRldGFpbFRleHQpfTwvZGl2PmBcbiAgICA6ICcnO1xuXG4gIHJldHVybiBgXG4gICAgPHRyIGlkPVwiJHtyb3dJZH1cIiBzdHlsZT1cImJvcmRlci1ib3R0b206MXB4IHNvbGlkIHZhcigtLWN2LWJnLXN1YnRsZSk7XCI+XG4gICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOjEwcHggMTJweDt3aWR0aDozNnB4O3ZlcnRpY2FsLWFsaWduOnRvcDtcIj5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiJHtjaGVja2JveElkfVwiIGRhdGEtJHtjaGVja2JveERhdGFBdHRyfT1cIiR7ZXNjKGl0ZW0uaWQpfVwiJHtjaGVja2VkfVxuICAgICAgICAgIGFyaWEtbGFiZWw9XCIke2FyaWFMYWJlbH1cIlxuICAgICAgICAgIHN0eWxlPVwid2lkdGg6MTZweDtoZWlnaHQ6MTZweDtjdXJzb3I6cG9pbnRlcjttYXJnaW4tdG9wOjJweDtcIj5cbiAgICAgIDwvdGQ+XG4gICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOjEwcHggMTJweDtcIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpmbGV4LXN0YXJ0O2dhcDo4cHg7ZmxleC13cmFwOndyYXA7XCI+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImZsZXg6MTttaW4td2lkdGg6MjAwcHg7XCI+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuNzhlbTtmb250LXdlaWdodDo2MDA7Y29sb3I6dmFyKC0tY3YtdGV4dC1zZWNvbmRhcnkpO3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTtsZXR0ZXItc3BhY2luZzowLjA0ZW07bWFyZ2luLWJvdHRvbTo0cHg7XCI+XG4gICAgICAgICAgICAgICR7ZXNjKGl0ZW0udHlwZUxhYmVsIHx8ICcnKX0ke2l0ZW0uc291cmNlQmFkZ2VIdG1sIHx8ICcnfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuODdlbTtjb2xvcjp2YXIoLS1jdi1zbGF0ZS00MDApO21hcmdpbi1ib3R0b206NnB4O1wiPiR7ZXNjKGl0ZW0ubGFiZWwgfHwgJycpfTwvZGl2PlxuICAgICAgICAgICAgJHtpdGVtLmZsYWdIdG1sIHx8ICcnfVxuICAgICAgICAgICAgJHtpdGVtLm9yaWdpbmFsID8gYFxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206NnB4O1wiPlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuNzJlbTtmb250LXdlaWdodDo2MDA7Y29sb3I6dmFyKC0tY3YtZ3JheS01MDApO3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTtsZXR0ZXItc3BhY2luZzowLjAzZW07bWFyZ2luLWJvdHRvbToycHg7XCI+QmVmb3JlPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2NvbG9yOnZhcigtLWN2LWdyYXktNTAwKTtiYWNrZ3JvdW5kOnZhcigtLWN2LWJnLWxpZ2h0KTtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjZweCA4cHg7Ym9yZGVyLWxlZnQ6M3B4IHNvbGlkIHZhcigtLWN2LWdyYXktMzAwKTtsaW5lLWhlaWdodDoxLjU7XCI+JHtlc2MoaXRlbS5vcmlnaW5hbCl9PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5gIDogJyd9XG4gICAgICAgICAgICAke2l0ZW0ucHJvcG9zZWQgPyBgXG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTo0cHg7XCI+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC43MmVtO2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjp2YXIoLS1jdi1ncmF5LTUwMCk7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO2xldHRlci1zcGFjaW5nOjAuMDNlbTttYXJnaW4tYm90dG9tOjJweDtcIj5BZnRlcjwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtjb2xvcjp2YXIoLS1jdi10ZXh0LXByaW1hcnkpO2JhY2tncm91bmQ6dmFyKC0tY3Ytc3VjY2Vzcy1iZyk7Ym9yZGVyLXJhZGl1czo0cHg7cGFkZGluZzo2cHggOHB4O2JvcmRlci1sZWZ0OjNweCBzb2xpZCB2YXIoLS1jdi1zdWNjZXNzLWJvcmRlcik7bGluZS1oZWlnaHQ6MS41O1wiPiR7ZXNjKGl0ZW0ucHJvcG9zZWQpfTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+YCA6ICcnfVxuICAgICAgICAgICAgJHtkZXRhaWxCbG9ja31cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtnYXA6NHB4O2FsaWduLWl0ZW1zOmZsZXgtZW5kO2ZsZXgtc2hyaW5rOjA7XCI+XG4gICAgICAgICAgICAke2l0ZW0uYmFkZ2VzSHRtbCB8fCAnJ31cbiAgICAgICAgICAgICR7ZGV0YWlsVG9nZ2xlfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvdGQ+XG4gICAgPC90cj5gO1xufVxuXG4vKipcbiAqIEF0dGFjaCBvbmUgZGVsZWdhdGVkIGNsaWNrIGxpc3RlbmVyIHRvIGBjb250YWluZXJFbGAgY292ZXJpbmcgZXZlcnlcbiAqIGBbZGF0YS10b2dnbGUtcmVhc29uaW5nXWAgZWxlbWVudCByZW5kZXJlZCBieSByZW5kZXJQcm9wb3NhbFJvdyB3aXRoIHRoZVxuICogbWF0Y2hpbmcgYGlkUHJlZml4YC4gR3VhcmRzIGFnYWluc3QgZG91YmxlLWF0dGFjaGluZyBhY3Jvc3MgcmVwZWF0ZWRcbiAqIGNhbGxzIChlLmcuIGEgdGFiIGJlaW5nIHJlLXBvcHVsYXRlZCkgdmlhIGEgbWFya2VyIG9uIGBjb250YWluZXJFbGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhdHRhY2hQcm9wb3NhbFJvd0xpc3RlbmVycyhjb250YWluZXJFbCwgaWRQcmVmaXgsIGhhbmRsZXJzID0ge30pIHtcbiAgaWYgKCFjb250YWluZXJFbCkgcmV0dXJuO1xuICBjb25zdCBndWFyZEtleSA9IGBwcm9wb3NhbExpc3RlbmVyc0F0dGFjaGVkXyR7aWRQcmVmaXh9YDtcbiAgaWYgKGNvbnRhaW5lckVsLmRhdGFzZXRbZ3VhcmRLZXldKSByZXR1cm47XG4gIGNvbnRhaW5lckVsLmRhdGFzZXRbZ3VhcmRLZXldID0gJzEnO1xuXG4gIGNvbnRhaW5lckVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB7XG4gICAgY29uc3QgdG9nZ2xlID0gZXZlbnQudGFyZ2V0LmNsb3Nlc3QoJ1tkYXRhLXRvZ2dsZS1yZWFzb25pbmddJyk7XG4gICAgaWYgKCF0b2dnbGUpIHJldHVybjtcbiAgICBjb25zdCBpZCA9IHRvZ2dsZS5kYXRhc2V0LnRvZ2dsZVJlYXNvbmluZztcbiAgICBjb25zdCByZWFzb25FbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2lkUHJlZml4fS1yZWFzb24tJHtpZH1gKTtcbiAgICBpZiAocmVhc29uRWwpIHtcbiAgICAgIGNvbnN0IG5vd1Zpc2libGUgPSByZWFzb25FbC5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZSc7XG4gICAgICByZWFzb25FbC5zdHlsZS5kaXNwbGF5ID0gbm93VmlzaWJsZSA/ICdibG9jaycgOiAnbm9uZSc7XG4gICAgICB0b2dnbGUuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgU3RyaW5nKG5vd1Zpc2libGUpKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBoYW5kbGVycy5vblRvZ2dsZVJlYXNvbmluZyA9PT0gJ2Z1bmN0aW9uJykgaGFuZGxlcnMub25Ub2dnbGVSZWFzb25pbmcoaWQpO1xuICB9KTtcbn1cbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL2xsbS1sb2cuanNcbiAqIEZldGNoZXMgcmF3IExMTSBpbnRlcmFjdGlvbiBsb2cgZW50cmllcyBmcm9tIC9hcGkvbGxtLWxvZyBhbmQgZGlzcGxheXNcbiAqIHRoZW0gaW4gdGhlIENvbnZlcnNhdGlvbiBwYW5lbCBhcyBjb2xsYXBzaWJsZSB0cmFuc2NyaXB0IGVudHJpZXMuXG4gKlxuICogRWFjaCBMTE0gY2FsbCBzaG93czpcbiAqICAgLSBIZWFkZXI6IHRpbWVzdGFtcCBhbmQgbWVzc2FnZS1jb3VudCBzdW1tYXJ5XG4gKiAgIC0gUHJvbXB0IHNlY3Rpb246IGFsbCBtZXNzYWdlcyBzZW50IChyb2xlLXByZWZpeGVkKSwgY29sbGFwc2libGUgd2hlbiBsb25nXG4gKiAgIC0gUmVzcG9uc2Ugc2VjdGlvbjogcmF3IExMTSByZXNwb25zZSwgY29sbGFwc2libGUgd2hlbiBsb25nXG4gKlxuICogREVQRU5ERU5DSUVTIChnbG9iYWxUaGlzKTpcbiAqICAgLSBhcHBlbmRNZXNzYWdlSHRtbCAgKG1lc3NhZ2UtcXVldWUuanMpXG4gKiAgIC0gZ2V0U2Vzc2lvbklkRnJvbVVSTCAoYXBpLWNsaWVudC5qcylcbiAqL1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBlc2NhcGVIdG1sIH0gZnJvbSAnLi91dGlscy5qcyc7XG5pbXBvcnQgeyBnZXRTZXNzaW9uSWRGcm9tVVJMIH0gZnJvbSAnLi9hcGktY2xpZW50LmpzJztcblxuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdsbG0tbG9nJyk7XG5cbi8vIEN1cnNvciB0cmFja3MgdGhlIG5leHQgaW5kZXggdG8gZmV0Y2ggZnJvbSAvYXBpL2xsbS1sb2cuXG4vLyBJbmNyZW1lbnQgYWZ0ZXIgZWFjaCBzdWNjZXNzZnVsIGZldGNoIGJ5IGB0b3RhbGAgcmV0dXJuZWQgZnJvbSB0aGUgc2VydmVyLlxubGV0IF9sbG1Mb2dDdXJzb3IgPSAwO1xuXG4vKiogUmVzZXQgdGhlIGN1cnNvciB0byAwIChjYWxsIHdoZW4gYSBuZXcgc2Vzc2lvbiBpcyBsb2FkZWQpLiAqL1xuZnVuY3Rpb24gcmVzZXRMbG1Mb2dDdXJzb3IoKSB7XG4gIF9sbG1Mb2dDdXJzb3IgPSAwO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIENvbGxhcHNpYmxlIEhUTUwgYnVpbGRlciAobWlycm9ycyBfbWFrZUNvbGxhcHNpYmxlQ29udGVudCBpbiBtZXNzYWdlLXF1ZXVlLmpzKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IF9MT0dfQ09MTEFQU0VfTElORVMgPSA4O1xuY29uc3QgX0xPR19DT0xMQVBTRV9DSEFSUyA9IDQ4MDtcblxuLyoqXG4gKiBXcmFwIGB0ZXh0YCBpbiBhIGNvbGxhcHNpYmxlIDxwcmU+IGJsb2NrIHdoZW4gaXQgZXhjZWVkcyB0aGUgdGhyZXNob2xkLlxuICogUmV0dXJucyBhbiBIVE1MIHN0cmluZyByZWFkeSBmb3IgaW5zZXJ0aW9uIHZpYSBpbm5lckhUTUwuXG4gKi9cbmZ1bmN0aW9uIF9jb2xsYXBzaWJsZVByZSh0ZXh0KSB7XG4gIGNvbnN0IGVzY2FwZWQgPSBlc2NhcGVIdG1sKHRleHQpO1xuICBjb25zdCBsaW5lcyAgID0gdGV4dC5zcGxpdCgnXFxuJyk7XG5cbiAgaWYgKGxpbmVzLmxlbmd0aCA8PSBfTE9HX0NPTExBUFNFX0xJTkVTICYmIHRleHQubGVuZ3RoIDw9IF9MT0dfQ09MTEFQU0VfQ0hBUlMpIHtcbiAgICByZXR1cm4gYDxwcmUgY2xhc3M9XCJsbG0tbG9nLXRleHRcIj4ke2VzY2FwZWR9PC9wcmU+YDtcbiAgfVxuXG4gIGNvbnN0IHByZXZpZXdUZXh0ID0gbGluZXMuc2xpY2UoMCwgX0xPR19DT0xMQVBTRV9MSU5FUykuam9pbignXFxuJyk7XG4gIGNvbnN0IG92ZXJmbG93ICAgID0gbGluZXMubGVuZ3RoIC0gX0xPR19DT0xMQVBTRV9MSU5FUztcbiAgY29uc3QgaWQgICAgICAgICAgPSBgbGxtbG9nLSR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCA3KX1gO1xuICBjb25zdCBsYWJlbCAgICAgICA9IGBTaG93ICR7b3ZlcmZsb3d9IG1vcmUgbGluZSR7b3ZlcmZsb3cgPT09IDEgPyAnJyA6ICdzJ31cdTIwMjZgO1xuXG4gIHJldHVybiBgXG4gICAgPHByZSBjbGFzcz1cImxsbS1sb2ctdGV4dCBtc2ctcHJldmlld1wiIGlkPVwiJHtpZH0tcHJldmlld1wiPiR7ZXNjYXBlSHRtbChwcmV2aWV3VGV4dCl9XHUyMDI2PC9wcmU+XG4gICAgPHByZSBjbGFzcz1cImxsbS1sb2ctdGV4dCBtc2ctZnVsbFwiICAgIGlkPVwiJHtpZH0tZnVsbFwiIHN0eWxlPVwiZGlzcGxheTpub25lXCI+JHtlc2NhcGVkfTwvcHJlPlxuICAgIDxidXR0b24gY2xhc3M9XCJtc2ctdG9nZ2xlLWJ0blwiIHR5cGU9XCJidXR0b25cIlxuICAgICAgb25jbGljaz1cIihmdW5jdGlvbihidG4pe1xuICAgICAgICB2YXIgcD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnJHtpZH0tcHJldmlldycpLFxuICAgICAgICAgICAgZj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnJHtpZH0tZnVsbCcpO1xuICAgICAgICBpZihmLnN0eWxlLmRpc3BsYXk9PT0nbm9uZScpe1xuICAgICAgICAgIHAuc3R5bGUuZGlzcGxheT0nbm9uZSc7IGYuc3R5bGUuZGlzcGxheT0nYmxvY2snOyBidG4udGV4dENvbnRlbnQ9J1Nob3cgbGVzcyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcC5zdHlsZS5kaXNwbGF5PScnOyBmLnN0eWxlLmRpc3BsYXk9J25vbmUnOyBidG4udGV4dENvbnRlbnQ9JyR7bGFiZWx9JztcbiAgICAgICAgfVxuICAgICAgfSkodGhpcylcIj4ke2xhYmVsfTwvYnV0dG9uPmA7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUmVuZGVyIG9uZSBpbnRlcmFjdGlvbiBpbnRvIHRoZSBjb252ZXJzYXRpb24gcGFuZWxcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiBfcmVuZGVySW50ZXJhY3Rpb24oaXgpIHtcbiAgY29uc3QgY29udmVyc2F0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbnZlcnNhdGlvbicpO1xuICBpZiAoIWNvbnZlcnNhdGlvbikgcmV0dXJuO1xuXG4gIGNvbnN0IHRzID0gaXgudGltZXN0YW1wXG4gICAgPyBuZXcgRGF0ZShpeC50aW1lc3RhbXApLnRvTG9jYWxlVGltZVN0cmluZyhbXSwgeyBob3VyOiAnMi1kaWdpdCcsIG1pbnV0ZTogJzItZGlnaXQnLCBzZWNvbmQ6ICcyLWRpZ2l0JyB9KVxuICAgIDogJyc7XG5cbiAgY29uc3QgbXNncyAgICAgPSBBcnJheS5pc0FycmF5KGl4Lm1lc3NhZ2VzKSA/IGl4Lm1lc3NhZ2VzIDogW107XG4gIGNvbnN0IG1zZ0NvdW50ID0gbXNncy5sZW5ndGg7XG5cbiAgLy8gQnVpbGQgZm9ybWF0dGVkIHByb21wdCB0ZXh0OiBlYWNoIG1lc3NhZ2Ugb24gaXRzIG93biBsYWJlbGxlZCBibG9ja1xuICBjb25zdCBwcm9tcHRUZXh0ID0gbXNnc1xuICAgIC5tYXAobSA9PiBgWyR7KG0ucm9sZSB8fCAndW5rbm93bicpLnRvVXBwZXJDYXNlKCl9XVxcbiR7bS5jb250ZW50IHx8ICcnfWApXG4gICAgLmpvaW4oJ1xcblxcblx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxcblxcbicpO1xuXG4gIGNvbnN0IHJlc3BvbnNlVGV4dCA9IHR5cGVvZiBpeC5yZXNwb25zZSA9PT0gJ3N0cmluZycgPyBpeC5yZXNwb25zZSA6ICcnO1xuXG4gIGNvbnN0IGh0bWwgPSBgXG4gICAgPGRpdiBjbGFzcz1cImxsbS1sb2ctaGVhZGVyXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImxsbS1sb2ctaWNvblwiPlx1RDgzRVx1REQxNjwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwibGxtLWxvZy1sYWJlbFwiPkxMTSBJbnRlcmFjdGlvbjwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwibGxtLWxvZy1tZXRhXCI+JHttc2dDb3VudH0gbWVzc2FnZSR7bXNnQ291bnQgPT09IDEgPyAnJyA6ICdzJ308L3NwYW4+XG4gICAgICAke3RzID8gYDxzcGFuIGNsYXNzPVwibGxtLWxvZy10c1wiPiR7ZXNjYXBlSHRtbCh0cyl9PC9zcGFuPmAgOiAnJ31cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibGxtLWxvZy1zZWN0aW9uXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibGxtLWxvZy1zZWN0aW9uLWxhYmVsXCI+UHJvbXB0PC9kaXY+XG4gICAgICAke19jb2xsYXBzaWJsZVByZShwcm9tcHRUZXh0KX1cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibGxtLWxvZy1zZWN0aW9uXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibGxtLWxvZy1zZWN0aW9uLWxhYmVsXCI+UmVzcG9uc2U8L2Rpdj5cbiAgICAgICR7X2NvbGxhcHNpYmxlUHJlKHJlc3BvbnNlVGV4dCl9XG4gICAgPC9kaXY+YDtcblxuICBjb25zdCBtZXNzYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIG1lc3NhZ2UuY2xhc3NOYW1lID0gJ21lc3NhZ2UgbGxtLXJhdyc7XG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgY29udGVudC5jbGFzc05hbWUgPSAnY29udGVudCc7XG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gaHRtbDtcbiAgbWVzc2FnZS5hcHBlbmRDaGlsZChjb250ZW50KTtcbiAgY29udmVyc2F0aW9uLmFwcGVuZENoaWxkKG1lc3NhZ2UpO1xuICBjb252ZXJzYXRpb24uc2Nyb2xsVG9wID0gY29udmVyc2F0aW9uLnNjcm9sbEhlaWdodDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBQdWJsaWMgQVBJXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBGZXRjaCBMTE0gaW50ZXJhY3Rpb24gbG9nIGVudHJpZXMgYWRkZWQgc2luY2UgdGhlIGxhc3QgY2FsbCBhbmQgZGlzcGxheVxuICogZWFjaCBvbmUgaW4gdGhlIENvbnZlcnNhdGlvbiBwYW5lbC4gIFNhZmUgdG8gY2FsbCBhZnRlciBldmVyeSBiYWNrZW5kXG4gKiBvcGVyYXRpb24gdGhhdCBtYXkgdHJpZ2dlciBMTE0gY2FsbHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZldGNoQW5kRGlzcGxheUxsbUxvZygpIHtcbiAgY29uc3Qgc2Vzc2lvbklkID0gZ2V0U2Vzc2lvbklkRnJvbVVSTCgpO1xuICBpZiAoIXNlc3Npb25JZCkgcmV0dXJuO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goXG4gICAgICBgL2FwaS9sbG0tbG9nP3Nlc3Npb25faWQ9JHtlbmNvZGVVUklDb21wb25lbnQoc2Vzc2lvbklkKX0mc2luY2U9JHtfbGxtTG9nQ3Vyc29yfWAsXG4gICAgKTtcbiAgICBpZiAoIXJlcy5vaykge1xuICAgICAgbG9nLndhcm4oJ2xsbS1sb2cgZmV0Y2ggZmFpbGVkJywgcmVzLnN0YXR1cyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGRhdGEgICAgICAgICA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgY29uc3QgaW50ZXJhY3Rpb25zID0gQXJyYXkuaXNBcnJheShkYXRhLmludGVyYWN0aW9ucykgPyBkYXRhLmludGVyYWN0aW9ucyA6IFtdO1xuXG4gICAgZm9yIChjb25zdCBpeCBvZiBpbnRlcmFjdGlvbnMpIHtcbiAgICAgIF9yZW5kZXJJbnRlcmFjdGlvbihpeCk7XG4gICAgfVxuXG4gICAgLy8gQWR2YW5jZSBjdXJzb3IgdG8gdGhlIG5ldyB0b3RhbCBzbyB0aGUgbmV4dCBjYWxsIGZldGNoZXMgb25seSBuZXcgZW50cmllcy5cbiAgICBpZiAodHlwZW9mIGRhdGEudG90YWwgPT09ICdudW1iZXInKSB7XG4gICAgICBfbGxtTG9nQ3Vyc29yID0gZGF0YS50b3RhbDtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy5lcnJvcignZmV0Y2hBbmREaXNwbGF5TGxtTG9nIGVycm9yOicsIGVycik7XG4gIH1cbn1cblxuZXhwb3J0IHsgZmV0Y2hBbmREaXNwbGF5TGxtTG9nLCByZXNldExsbUxvZ0N1cnNvciB9O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvYXV0aC1wcm92aWRlci5qc1xuICogQ29waWxvdCAvIEdpdEh1YiBPQXV0aCBhdXRoIGZsb3csIGJhZGdlIHVwZGF0ZXMsIGFuZCBwcm92aWRlciBsYWJlbCBmb3JtYXR0aW5nLlxuICpcbiAqIERFUEVOREVOQ0lFUzpcbiAqICAgLSBjb25maXJtRGlhbG9nIGZyb20gdWktY29yZS5qcyAob24gZ2xvYmFsVGhpcylcbiAqICAgLSBzZXRJbml0aWFsRm9jdXMsIHRyYXBGb2N1cywgcmVzdG9yZUZvY3VzIGZyb20gdWktY29yZS5qcyAob24gZ2xvYmFsVGhpcylcbiAqICAgLSB1cGRhdGVBdXRoQmFkZ2UgKHNlbGYtcmVmZXJlbmNlOyBleHBvcnRlZCB0byBnbG9iYWxUaGlzKVxuICogICAtIGdldFByb3ZpZGVySW5mbyBmcm9tIHByb3ZpZGVyLWluZm8uanMgKGltcG9ydGVkIGRpcmVjdGx5KVxuICovXG5cbmltcG9ydCB7IGdldFByb3ZpZGVySW5mbyB9IGZyb20gJy4vcHJvdmlkZXItaW5mby5qcyc7XG5cbmxldCBfYXV0aFBvbGxUaW1lciA9IG51bGw7XG5cbmZ1bmN0aW9uIGZvcm1hdFByb3ZpZGVyTGFiZWwocHJvdmlkZXIpIHtcbiAgaWYgKCFwcm92aWRlciB8fCB0eXBlb2YgcHJvdmlkZXIgIT09ICdzdHJpbmcnKSByZXR1cm4gJ1Byb3ZpZGVyJztcbiAgY29uc3QgYWxpYXNlcyA9IHtcbiAgICBvcGVuYWk6ICdPcGVuQUknLFxuICAgICdjb3BpbG90LW9hdXRoJzogJ0NvcGlsb3QgT0F1dGggKGRlcHJlY2F0ZWQpJyxcbiAgICBjb3BpbG90OiAnQ29waWxvdCAoZGVwcmVjYXRlZCknLFxuICAgIGdpdGh1YjogJ0dpdEh1YiBNb2RlbHMgKGRlcHJlY2F0ZWQpJyxcbiAgICAnY29waWxvdC1zZGsnOiAnQ29waWxvdCBTREsgKHJlY29tbWVuZGVkKScsXG4gIH07XG4gIGlmIChhbGlhc2VzW3Byb3ZpZGVyXSkgcmV0dXJuIGFsaWFzZXNbcHJvdmlkZXJdO1xuICByZXR1cm4gcHJvdmlkZXJcbiAgICAuc3BsaXQoL1stX1xcc10rLylcbiAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgLm1hcChwYXJ0ID0+IHBhcnQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBwYXJ0LnNsaWNlKDEpLnRvTG93ZXJDYXNlKCkpXG4gICAgLmpvaW4oJyAnKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlQXV0aEJhZGdlKGF1dGhTdGF0dXMsIHByb3ZpZGVyID0gbnVsbCkge1xuICBjb25zdCBsZWdhY3lCYWRnZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb3BpbG90LWF1dGgtYmFkZ2UnKTtcbiAgY29uc3QgbGVnYWN5SWNvbiAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXV0aC1iYWRnZS1pY29uJyk7XG4gIGNvbnN0IGxlZ2FjeUxhYmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F1dGgtYmFkZ2UtbGFiZWwnKTtcblxuICBjb25zdCBwaWxsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbS1zdGF0dXMtcGlsbCcpO1xuICBjb25zdCBwaWxsSWNvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG0tc3RhdHVzLWljb24nKTtcbiAgY29uc3QgcGlsbExhYmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbS1zdGF0dXMtbGFiZWwnKTtcblxuICBjb25zdCBhcHBseVN0YXRlID0gKGtpbmQsIHRleHQsIGljb25UZXh0KSA9PiB7XG4gICAgaWYgKGxlZ2FjeUJhZGdlICYmIGxlZ2FjeUljb24gJiYgbGVnYWN5TGFiZWwpIHtcbiAgICAgIGxlZ2FjeUJhZGdlLmNsYXNzTGlzdC5yZW1vdmUoJ2F1dGhlbnRpY2F0ZWQnLCAndW5hdXRoZW50aWNhdGVkJywgJ3BvbGxpbmcnKTtcbiAgICAgIGxlZ2FjeUJhZGdlLmNsYXNzTGlzdC5hZGQoa2luZCk7XG4gICAgICBpZiAoa2luZCA9PT0gJ2Nvbm5lY3RlZCcgfHwga2luZCA9PT0gJ2NvbmZpZ3VyZWQnKSBsZWdhY3lCYWRnZS5jbGFzc0xpc3QuYWRkKCdhdXRoZW50aWNhdGVkJyk7XG4gICAgICBpZiAoa2luZCA9PT0gJ2Nvbm5lY3RpbmcnKSBsZWdhY3lCYWRnZS5jbGFzc0xpc3QuYWRkKCdwb2xsaW5nJyk7XG4gICAgICBpZiAoa2luZCA9PT0gJ3VuY29uZmlndXJlZCcgfHwga2luZCA9PT0gJ2F1dGgtcmVxdWlyZWQnIHx8IGtpbmQgPT09ICdyYXRlLWxpbWl0ZWQnIHx8IGtpbmQgPT09ICd1bmF2YWlsYWJsZScgfHwga2luZCA9PT0gJ2Vycm9yJykgbGVnYWN5QmFkZ2UuY2xhc3NMaXN0LmFkZCgndW5hdXRoZW50aWNhdGVkJyk7XG4gICAgICBsZWdhY3lJY29uLnRleHRDb250ZW50ID0gaWNvblRleHQ7XG4gICAgICBsZWdhY3lMYWJlbC50ZXh0Q29udGVudCA9IHRleHQ7XG4gICAgfVxuICAgIGlmIChwaWxsICYmIHBpbGxJY29uICYmIHBpbGxMYWJlbCkge1xuICAgICAgcGlsbC5jbGFzc0xpc3QucmVtb3ZlKCdhdXRoZW50aWNhdGVkJywgJ3VuYXV0aGVudGljYXRlZCcsICdwb2xsaW5nJywgJ3VuY29uZmlndXJlZCcsICdjb25maWd1cmVkJywgJ2Nvbm5lY3RpbmcnLCAnY29ubmVjdGVkJywgJ2F1dGgtcmVxdWlyZWQnLCAncmF0ZS1saW1pdGVkJywgJ3VuYXZhaWxhYmxlJywgJ2Vycm9yJyk7XG4gICAgICBwaWxsLmNsYXNzTGlzdC5hZGQoa2luZCk7XG4gICAgICBpZiAoa2luZCA9PT0gJ2Nvbm5lY3RlZCcgfHwga2luZCA9PT0gJ2NvbmZpZ3VyZWQnKSBwaWxsLmNsYXNzTGlzdC5hZGQoJ2F1dGhlbnRpY2F0ZWQnKTtcbiAgICAgIGlmIChraW5kID09PSAnY29ubmVjdGluZycpIHBpbGwuY2xhc3NMaXN0LmFkZCgncG9sbGluZycpO1xuICAgICAgaWYgKGtpbmQgPT09ICd1bmNvbmZpZ3VyZWQnIHx8IGtpbmQgPT09ICdhdXRoLXJlcXVpcmVkJyB8fCBraW5kID09PSAncmF0ZS1saW1pdGVkJyB8fCBraW5kID09PSAndW5hdmFpbGFibGUnIHx8IGtpbmQgPT09ICdlcnJvcicpIHBpbGwuY2xhc3NMaXN0LmFkZCgndW5hdXRoZW50aWNhdGVkJyk7XG4gICAgICBwaWxsSWNvbi50ZXh0Q29udGVudCA9IGljb25UZXh0O1xuICAgICAgcGlsbExhYmVsLnRleHRDb250ZW50ID0gdGV4dDtcbiAgICAgIGNvbnN0IHRvb2x0aXBNYXAgPSB7XG4gICAgICAgIHVuY29uZmlndXJlZDogJ05vIHByb3ZpZGVyL21vZGVsIGlzIGNvbmZpZ3VyZWQgeWV0LicsXG4gICAgICAgIGNvbmZpZ3VyZWQ6ICdQcm92aWRlci9tb2RlbCBpcyBjb25maWd1cmVkLiBDb25uZWN0aXZpdHkgbm90IHlldCB2ZXJpZmllZC4nLFxuICAgICAgICBjb25uZWN0aW5nOiAnVGVzdGluZyBvciBjb25uZWN0aW5nIHRvIHRoZSBzZWxlY3RlZCBwcm92aWRlci4nLFxuICAgICAgICBjb25uZWN0ZWQ6ICdQcm92aWRlciByZXNwb25kZWQgc3VjY2Vzc2Z1bGx5IHRvIGEgbGl2ZSByZXF1ZXN0LicsXG4gICAgICAgICdhdXRoLXJlcXVpcmVkJzogJ0F1dGhlbnRpY2F0aW9uIGlzIHJlcXVpcmVkLiBDaGVjayBBUEkga2V5IG9yIHNpZ24gaW4uJyxcbiAgICAgICAgJ3JhdGUtbGltaXRlZCc6ICdSYXRlIGxpbWl0IHJlYWNoZWQuIFdhaXQgYmVmb3JlIHJldHJ5aW5nIHJlcXVlc3RzLicsXG4gICAgICAgIHVuYXZhaWxhYmxlOiAnUHJvdmlkZXIgaXMgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGUgb3IgdW5yZWFjaGFibGUuJyxcbiAgICAgICAgZXJyb3I6ICdDb25uZWN0aW9uIGZhaWxlZC4gT3BlbiBtb2RlbCBzZXR0aW5ncyBmb3IgZGV0YWlscy4nLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHRpcCA9IHRvb2x0aXBNYXBba2luZF0gfHwgJyc7XG4gICAgICBwaWxsLnRpdGxlID0gdGlwO1xuICAgICAgcGlsbEljb24udGl0bGUgPSB0aXA7XG4gICAgICBwaWxsTGFiZWwudGl0bGUgPSB0aXA7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGFjdGl2ZVByb3ZpZGVyID0gcHJvdmlkZXIgfHwgd2luZG93LmN1cnJlbnRQcm92aWRlciB8fCBudWxsO1xuICBjb25zdCBpc0NvcGlsb3RPQXV0aCA9IGFjdGl2ZVByb3ZpZGVyID09PSAnY29waWxvdC1vYXV0aCc7XG5cbiAgLy8gTm9uLWNvbmZpZGVudGlhbCBiYWRnZTogc2hvdyB1bmxlc3MgdGhlIHByb3ZpZGVyIGV4cGxpY2l0bHkgbWFya3MgY29uZmlkZW50aWFsOnRydWUuXG4gIC8vIERlZmF1bHQgaXMgbm9uLWNvbmZpZGVudGlhbCAoZmFpbC1zYWZlIFx1MjAxNCBtb3N0IHByb3ZpZGVycyByZXRhaW4vcmV2aWV3IEFQSSBkYXRhKS5cbiAgY29uc3QgbmNCYWRnZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG0tbm9uLWNvbmZpZGVudGlhbC1iYWRnZScpO1xuICBpZiAobmNCYWRnZSAmJiBhY3RpdmVQcm92aWRlcikge1xuICAgIGNvbnN0IGluZm8gPSBnZXRQcm92aWRlckluZm8oYWN0aXZlUHJvdmlkZXIpO1xuICAgIG5jQmFkZ2Uuc3R5bGUuZGlzcGxheSA9IChpbmZvICYmIGluZm8uY29uZmlkZW50aWFsICE9PSB0cnVlKSA/ICcnIDogJ25vbmUnO1xuICB9XG5cbiAgaWYgKGFjdGl2ZVByb3ZpZGVyICYmICFpc0NvcGlsb3RPQXV0aCkge1xuICAgIGFwcGx5U3RhdGUoJ2NvbmZpZ3VyZWQnLCBgJHtmb3JtYXRQcm92aWRlckxhYmVsKGFjdGl2ZVByb3ZpZGVyKX0gY29uZmlndXJlZGAsICdcdTI1RDQnKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoYXV0aFN0YXR1cy5hdXRoZW50aWNhdGVkKSB7XG4gICAgYXBwbHlTdGF0ZSgnY29ubmVjdGVkJywgJ0NvcGlsb3QgcmVhZHknLCAnXHUyNzEzJyk7XG4gIH0gZWxzZSBpZiAoYXV0aFN0YXR1cy5wb2xsaW5nKSB7XG4gICAgYXBwbHlTdGF0ZSgnY29ubmVjdGluZycsICdXYWl0aW5nIGZvciBhcHByb3ZhbFx1MjAyNicsICdcdTI5RDcnKTtcbiAgfSBlbHNlIHtcbiAgICBhcHBseVN0YXRlKCdhdXRoLXJlcXVpcmVkJywgJ05vdCBhdXRoZW50aWNhdGVkJywgJ1x1RDgzRFx1REQxMScpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNsb3NlQ29waWxvdEF1dGhNb2RhbCgpIHtcbiAgaWYgKF9hdXRoUG9sbFRpbWVyKSB7IGNsZWFySW50ZXJ2YWwoX2F1dGhQb2xsVGltZXIpOyBfYXV0aFBvbGxUaW1lciA9IG51bGw7IH1cbiAgaWYgKHR5cGVvZiBjbG9zZU1vZGVsTW9kYWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjbG9zZU1vZGVsTW9kYWwoKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgbGVnYWN5T3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdXRoLW1vZGFsLW92ZXJsYXknKTtcbiAgaWYgKGxlZ2FjeU92ZXJsYXkpIGxlZ2FjeU92ZXJsYXkuY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZScpO1xuICBpZiAodHlwZW9mIHJlc3RvcmVGb2N1cyA9PT0gJ2Z1bmN0aW9uJykgcmVzdG9yZUZvY3VzKCk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFUyBtb2R1bGUgZXhwb3J0cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmV4cG9ydCB7XG4gIGZvcm1hdFByb3ZpZGVyTGFiZWwsIHVwZGF0ZUF1dGhCYWRnZSxcbiAgY2xvc2VDb3BpbG90QXV0aE1vZGFsLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogYXRzLW1vZGFscy5qc1xuICogQVRTIFJlcG9ydCBhbmQgSm9iIEFuYWx5c2lzIG1vZGFsIGRpYWxvZ3MgKyBBVFMgU2NvcmUgdGFiIHJlbmRlcmVyLlxuICpcbiAqIERFUEVOREVOQ0lFUzpcbiAqIC0gc3RhdGUtbWFuYWdlci5qcyBmb3IgcGVyc2lzdGVkIEFUUyBzY29yZSArIGFuYWx5c2lzIGRhdGFcbiAqIC0gdXRpbHMuanMgZm9yIEhUTUwgZXNjYXBpbmdcbiAqIC0gYXRzLXJlZmluZW1lbnQuanMgZm9yIEFUUyBmZXRjaC9iYWRnZSB1cGRhdGVzXG4gKiAtIGluZGV4Lmh0bWwgbW9kYWwgb3ZlcmxheXM6ICNhdHMtcmVwb3J0LW1vZGFsLW92ZXJsYXksICNqb2ItYW5hbHlzaXMtbW9kYWwtb3ZlcmxheVxuICovXG5cbmltcG9ydCB7IHJlZnJlc2hBdHNTY29yZSwgdXBkYXRlQXRzQmFkZ2UgfSBmcm9tICcuL2F0cy1yZWZpbmVtZW50LmpzJztcbmltcG9ydCB7IHN0YXRlTWFuYWdlciB9IGZyb20gJy4vc3RhdGUtbWFuYWdlci5qcyc7XG5pbXBvcnQgeyBlc2NhcGVIdG1sIH0gZnJvbSAnLi91dGlscy5qcyc7XG5pbXBvcnQgeyB0cmFwRm9jdXMsIHJlc3RvcmVGb2N1cywgcHVzaEZvY3VzU3RhY2sgfSBmcm9tICcuL3VpLWNvcmUuanMnO1xuXG5sZXQgX2F0c1N5bm9ueW1NYXBDYWNoZSA9IG51bGw7XG5cbmFzeW5jIGZ1bmN0aW9uIF9sb2FkQXRzU3lub255bU1hcCgpIHtcbiAgaWYgKF9hdHNTeW5vbnltTWFwQ2FjaGUpIHJldHVybiBfYXRzU3lub255bU1hcENhY2hlO1xuICB0cnkge1xuICAgIGNvbnN0IHNlc3Npb25JZCA9IHN0YXRlTWFuYWdlcj8uZ2V0U2Vzc2lvbklkPy4oKTtcbiAgICBjb25zdCB1cmwgPSBzZXNzaW9uSWQgPyBgL2FwaS9zeW5vbnltLW1hcD9zZXNzaW9uX2lkPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHNlc3Npb25JZCl9YCA6ICcvYXBpL3N5bm9ueW0tbWFwJztcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICAgIGlmICghcmVzLm9rKSByZXR1cm4gKF9hdHNTeW5vbnltTWFwQ2FjaGUgPSB7fSk7XG4gICAgY29uc3QgcmF3ID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBjb25zdCBhbGlhc1RvQ2Fub24gPSB7fTtcbiAgICBjb25zdCBjYW5vblRvQWxpYXNlcyA9IHt9O1xuICAgIE9iamVjdC5lbnRyaWVzKHJhdykuZm9yRWFjaCgoW2FsaWFzLCBjYW5vbl0pID0+IHtcbiAgICAgIGFsaWFzVG9DYW5vblthbGlhcy50b0xvd2VyQ2FzZSgpXSA9IGNhbm9uO1xuICAgICAgY29uc3QgY2wgPSBjYW5vbi50b0xvd2VyQ2FzZSgpO1xuICAgICAgKGNhbm9uVG9BbGlhc2VzW2NsXSA9IGNhbm9uVG9BbGlhc2VzW2NsXSB8fCBbXSkucHVzaChhbGlhcyk7XG4gICAgfSk7XG4gICAgX2F0c1N5bm9ueW1NYXBDYWNoZSA9IHsgYWxpYXNUb0Nhbm9uLCBjYW5vblRvQWxpYXNlcyB9O1xuICB9IGNhdGNoIChfKSB7IF9hdHNTeW5vbnltTWFwQ2FjaGUgPSB7fTsgfVxuICByZXR1cm4gX2F0c1N5bm9ueW1NYXBDYWNoZTtcbn1cblxuZnVuY3Rpb24gX2t3U3luQW5ub3RhdGlvbihrdywgc3luTWFwKSB7XG4gIGlmICghc3luTWFwIHx8ICghc3luTWFwLmFsaWFzVG9DYW5vbiAmJiAhc3luTWFwLmNhbm9uVG9BbGlhc2VzKSkgcmV0dXJuICcnO1xuICBjb25zdCBrbCA9IChrdyB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgaWYgKHN5bk1hcC5hbGlhc1RvQ2Fub24gJiYgc3luTWFwLmFsaWFzVG9DYW5vbltrbF0pIHJldHVybiBgPSAke3N5bk1hcC5hbGlhc1RvQ2Fub25ba2xdfWA7XG4gIGNvbnN0IGFsaWFzZXMgPSBzeW5NYXAuY2Fub25Ub0FsaWFzZXMgJiYgc3luTWFwLmNhbm9uVG9BbGlhc2VzW2tsXTtcbiAgaWYgKGFsaWFzZXMgJiYgYWxpYXNlcy5sZW5ndGgpIHJldHVybiBgYWxzbzogJHthbGlhc2VzLmpvaW4oJywgJyl9YDtcbiAgcmV0dXJuICcnO1xufVxuXG5jb25zdCBBVFNfR1JPVVBTID0gW1xuICBbJ2hhcmQnLCAnSGFyZCBSZXF1aXJlbWVudHMnXSxcbiAgWydzb2Z0JywgJ1ByZWZlcnJlZCBTa2lsbHMnXSxcbiAgWydib251cycsICdcdTI2MDUgQm9udXMgS2V5d29yZHMnXSxcbl07XG5cbmZ1bmN0aW9uIF9rZXl3b3JkU3RhdHVzKGtleXdvcmQpIHtcbiAgcmV0dXJuIGtleXdvcmQ/LnN0YXR1cyB8fCAoa2V5d29yZD8uZm91bmQgPyAnbWF0Y2hlZCcgOiAnbWlzc2luZycpO1xufVxuXG5mdW5jdGlvbiBfa2V5d29yZFR5cGUoa2V5d29yZCkge1xuICByZXR1cm4ga2V5d29yZD8udHlwZSB8fCAnb3RoZXInO1xufVxuXG5mdW5jdGlvbiBfaXNFeGFjdE1hdGNoKGtleXdvcmQpIHtcbiAgcmV0dXJuIF9rZXl3b3JkU3RhdHVzKGtleXdvcmQpID09PSAnbWF0Y2hlZCcgJiYga2V5d29yZD8ubWF0Y2hfdHlwZSAhPT0gJ3BhcnRpYWwnO1xufVxuXG5mdW5jdGlvbiBfaXNQYXJ0aWFsTWF0Y2goa2V5d29yZCkge1xuICByZXR1cm4gX2tleXdvcmRTdGF0dXMoa2V5d29yZCkgPT09ICdwYXJ0aWFsJyB8fCBrZXl3b3JkPy5tYXRjaF90eXBlID09PSAncGFydGlhbCc7XG59XG5cbmZ1bmN0aW9uIF9rZXl3b3JkU29ydFZhbHVlKGtleXdvcmQpIHtcbiAgaWYgKF9rZXl3b3JkU3RhdHVzKGtleXdvcmQpID09PSAnbWlzc2luZycpIHJldHVybiAwO1xuICBpZiAoX2lzUGFydGlhbE1hdGNoKGtleXdvcmQpKSByZXR1cm4gMTtcbiAgcmV0dXJuIDI7XG59XG5cbmZ1bmN0aW9uIF9rZXl3b3JkU3RhdHVzQmFkZ2Uoa2V5d29yZCkge1xuICBpZiAoX2tleXdvcmRTdGF0dXMoa2V5d29yZCkgPT09ICdtaXNzaW5nJykge1xuICAgIHJldHVybiAnPHNwYW4gc3R5bGU9XCJkaXNwbGF5OmlubGluZS1ibG9jaztwYWRkaW5nOjJweCA4cHg7Ym9yZGVyLXJhZGl1czo5OTlweDtiYWNrZ3JvdW5kOiNmZWUyZTI7Y29sb3I6Izk5MWIxYjtmb250LXNpemU6MC44ZW07Zm9udC13ZWlnaHQ6NjAwO1wiPlx1Mjc0QyBNaXNzaW5nPC9zcGFuPic7XG4gIH1cbiAgaWYgKF9pc1BhcnRpYWxNYXRjaChrZXl3b3JkKSkge1xuICAgIHJldHVybiAnPHNwYW4gc3R5bGU9XCJkaXNwbGF5OmlubGluZS1ibG9jaztwYWRkaW5nOjJweCA4cHg7Ym9yZGVyLXJhZGl1czo5OTlweDtiYWNrZ3JvdW5kOiNmZWYzYzc7Y29sb3I6IzkyNDAwZTtmb250LXNpemU6MC44ZW07Zm9udC13ZWlnaHQ6NjAwO1wiPlx1MjZBMCBQYXJ0aWFsPC9zcGFuPic7XG4gIH1cbiAgcmV0dXJuICc8c3BhbiBzdHlsZT1cImRpc3BsYXk6aW5saW5lLWJsb2NrO3BhZGRpbmc6MnB4IDhweDtib3JkZXItcmFkaXVzOjk5OXB4O2JhY2tncm91bmQ6I2RjZmNlNztjb2xvcjojMTY2NTM0O2ZvbnQtc2l6ZTowLjhlbTtmb250LXdlaWdodDo2MDA7XCI+XHUyNzA1IE1hdGNoZWQ8L3NwYW4+Jztcbn1cblxuZnVuY3Rpb24gX3JlbmRlcktleXdvcmRHcm91cCh0aXRsZSwga2V5d29yZHMsIHN5bk1hcCkge1xuICBpZiAoa2V5d29yZHMubGVuZ3RoID09PSAwKSByZXR1cm4gJyc7XG5cbiAgY29uc3QgZXhhY3RDb3VudCA9IGtleXdvcmRzLmZpbHRlcihfaXNFeGFjdE1hdGNoKS5sZW5ndGg7XG4gIGNvbnN0IHBhcnRpYWxDb3VudCA9IGtleXdvcmRzLmZpbHRlcihfaXNQYXJ0aWFsTWF0Y2gpLmxlbmd0aDtcbiAgY29uc3QgbWlzc2luZ0NvdW50ID0ga2V5d29yZHMuZmlsdGVyKGtleXdvcmQgPT4gX2tleXdvcmRTdGF0dXMoa2V5d29yZCkgPT09ICdtaXNzaW5nJykubGVuZ3RoO1xuICBjb25zdCBzb3J0ZWQgPSBbLi4ua2V5d29yZHNdLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiB7XG4gICAgY29uc3QgcHJpb3JpdHkgPSBfa2V5d29yZFNvcnRWYWx1ZShsZWZ0KSAtIF9rZXl3b3JkU29ydFZhbHVlKHJpZ2h0KTtcbiAgICBpZiAocHJpb3JpdHkgIT09IDApIHJldHVybiBwcmlvcml0eTtcbiAgICByZXR1cm4gU3RyaW5nKGxlZnQua2V5d29yZCB8fCBsZWZ0LnRlcm0gfHwgJycpLmxvY2FsZUNvbXBhcmUoU3RyaW5nKHJpZ2h0LmtleXdvcmQgfHwgcmlnaHQudGVybSB8fCAnJykpO1xuICB9KTtcblxuICByZXR1cm4gYFxuICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOjE2cHg7XCI+XG4gICAgICA8aDQgc3R5bGU9XCJtYXJnaW46MCAwIDhweDtmb250LXNpemU6MXJlbTtjb2xvcjojMzM0MTU1O1wiPiR7ZXNjYXBlSHRtbCh0aXRsZSl9PC9oND5cbiAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC44MmVtO2NvbG9yOiM2NDc0OGI7bWFyZ2luLWJvdHRvbTo4cHg7XCI+JHtleGFjdENvdW50fSBleGFjdCBcdTIwMjIgJHtwYXJ0aWFsQ291bnR9IHBhcnRpYWwgXHUyMDIyICR7bWlzc2luZ0NvdW50fSBtaXNzaW5nPC9kaXY+XG4gICAgICA8dGFibGUgc3R5bGU9XCJ3aWR0aDoxMDAlO2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTtmb250LXNpemU6MC45ZW07XCI+XG4gICAgICAgIDx0aGVhZD5cbiAgICAgICAgICA8dHIgc3R5bGU9XCJ0ZXh0LWFsaWduOmxlZnQ7Y29sb3I6IzY0NzQ4Yjtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZTJlOGYwO1wiPlxuICAgICAgICAgICAgPHRoIHN0eWxlPVwicGFkZGluZzo2cHggOHB4O1wiPktleXdvcmQ8L3RoPlxuICAgICAgICAgICAgPHRoIHN0eWxlPVwicGFkZGluZzo2cHggOHB4O1wiPkNvdmVyYWdlPC90aD5cbiAgICAgICAgICAgIDx0aCBzdHlsZT1cInBhZGRpbmc6NnB4IDhweDtcIj5TZWN0aW9uczwvdGg+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgPC90aGVhZD5cbiAgICAgICAgPHRib2R5PlxuICAgICAgICAgICR7c29ydGVkLm1hcChrZXl3b3JkID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGt3ID0ga2V5d29yZC5rZXl3b3JkIHx8IGtleXdvcmQudGVybSB8fCAnJztcbiAgICAgICAgICAgIGNvbnN0IHNlY3Rpb25zID0gQXJyYXkuaXNBcnJheShrZXl3b3JkLm1hdGNoZWRfaW5fc2VjdGlvbnMpICYmIGtleXdvcmQubWF0Y2hlZF9pbl9zZWN0aW9ucy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgID8ga2V5d29yZC5tYXRjaGVkX2luX3NlY3Rpb25zLmpvaW4oJywgJylcbiAgICAgICAgICAgICAgOiAnTm90IGZvdW5kJztcbiAgICAgICAgICAgIGNvbnN0IHN5bkFubm90ID0gX2t3U3luQW5ub3RhdGlvbihrdywgc3luTWFwKTtcbiAgICAgICAgICAgIGNvbnN0IHN5bkh0bWwgPSBzeW5Bbm5vdFxuICAgICAgICAgICAgICA/IGA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuNzhlbTtjb2xvcjojNjQ3NDhiO21hcmdpbi10b3A6MnB4O1wiIHRpdGxlPVwiU3lub255bSBncm91cGluZ1wiPiR7ZXNjYXBlSHRtbChzeW5Bbm5vdCl9PC9kaXY+YFxuICAgICAgICAgICAgICA6ICcnO1xuICAgICAgICAgICAgcmV0dXJuIGBcbiAgICAgICAgICAgICAgPHRyIHN0eWxlPVwiYm9yZGVyLWJvdHRvbToxcHggc29saWQgI2YxZjVmOTt2ZXJ0aWNhbC1hbGlnbjp0b3A7XCI+XG4gICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzo4cHg7XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6NjAwO2NvbG9yOiMxZTI5M2I7XCI+JHtlc2NhcGVIdG1sKGt3KX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC44ZW07Y29sb3I6Izk0YTNiODt0ZXh0LXRyYW5zZm9ybTpjYXBpdGFsaXplO1wiPiR7ZXNjYXBlSHRtbChfa2V5d29yZFR5cGUoa2V5d29yZCkpfTwvZGl2PlxuICAgICAgICAgICAgICAgICAgJHtzeW5IdG1sfVxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzo4cHg7XCI+JHtfa2V5d29yZFN0YXR1c0JhZGdlKGtleXdvcmQpfTwvdGQ+XG4gICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzo4cHg7Y29sb3I6IzQ3NTU2OTtcIj4ke2VzY2FwZUh0bWwoc2VjdGlvbnMpfTwvdGQ+XG4gICAgICAgICAgICAgIDwvdHI+YDtcbiAgICAgICAgICB9KS5qb2luKCcnKX1cbiAgICAgICAgPC90Ym9keT5cbiAgICAgIDwvdGFibGU+XG4gICAgPC9kaXY+YDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBBVFMgUmVwb3J0IE1vZGFsXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBPcGVuIHRoZSBBVFMgUmVwb3J0IG1vZGFsLiBSZW5kZXJzIHRoZSBjYWNoZWQgQVRTIHNjb3JlIGZyb20gc3RhdGUsIG9yXG4gKiBmZXRjaGVzIGEgZnJlc2ggc2NvcmUgaWYgbm9uZSBpcyBjYWNoZWQuXG4gKi9cbmZ1bmN0aW9uIF9hdHNFc2NhcGVIYW5kbGVyKGUpIHtcbiAgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgY2xvc2VBdHNSZXBvcnRNb2RhbCgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBvcGVuQXRzUmVwb3J0TW9kYWwoKSB7XG4gIHB1c2hGb2N1c1N0YWNrKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpO1xuICBjb25zdCBvdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F0cy1yZXBvcnQtbW9kYWwtb3ZlcmxheScpO1xuICBvdmVybGF5LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBfYXRzRXNjYXBlSGFuZGxlcik7XG4gIC8vIE1vdmUgZm9jdXMgdG8gdGhlIENsb3NlIGJ1dHRvbiBpbiB0aGUgbW9kYWwgZm9vdGVyXG4gIGNvbnN0IGNsb3NlQnRuID0gb3ZlcmxheS5xdWVyeVNlbGVjdG9yKCcubW9kYWwtZm9vdGVyIC5hY3Rpb24tYnRuJyk7XG4gIGlmIChjbG9zZUJ0bikgY2xvc2VCdG4uZm9jdXMoKTtcbiAgdHJhcEZvY3VzKCdhdHMtcmVwb3J0LW1vZGFsLW92ZXJsYXknKTtcbiAgY29uc3QgYm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdHMtcmVwb3J0LW1vZGFsLWJvZHknKTtcblxuICAvLyBBIGNhY2hlZCBzY29yZSByZW5kZXJzIGltbWVkaWF0ZWx5IHVzaW5nIHdoYXRldmVyIHN5bm9ueW0gbWFwIGlzIGFscmVhZHlcbiAgLy8gY2FjaGVkIChvciBub25lKSByYXRoZXIgdGhhbiBibG9ja2luZyBvbiBhIG5ldHdvcmsgcm91bmQtdHJpcCBmb3IgaXQgXHUyMDE0XG4gIC8vIHRoZSBhbm5vdGF0aW9ucyBhcmUgYW4gZW5yaWNobWVudCwgbm90IHJlcXVpcmVkIGZvciBfcmVuZGVyQXRzUmVwb3J0IHRvXG4gIC8vIHdvcmssIGFuZCBhIGNhY2hlZC1zY29yZSBvcGVuIHNob3VsZCBiZSBpbnN0YW50LlxuICBjb25zdCBjYWNoZWQgPSBzdGF0ZU1hbmFnZXI/LmdldEF0c1Njb3JlPy4oKTtcbiAgaWYgKGNhY2hlZCkge1xuICAgIGJvZHkuaW5uZXJIVE1MID0gX3JlbmRlckF0c1JlcG9ydChjYWNoZWQsIF9hdHNTeW5vbnltTWFwQ2FjaGUgfHwge30pO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGJvZHkuaW5uZXJIVE1MID0gJzxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDoxMnB4O3BhZGRpbmc6MjRweDtjb2xvcjojNmI3MjgwO1wiPjxkaXYgY2xhc3M9XCJsb2FkaW5nLXNwaW5uZXJcIiBzdHlsZT1cIndpZHRoOjIwcHg7aGVpZ2h0OjIwcHg7Ym9yZGVyLXdpZHRoOjJweDtmbGV4LXNocmluazowO1wiPjwvZGl2PjxzcGFuPkZldGNoaW5nIEFUUyBzY29yZVx1MjAyNjwvc3Bhbj48L2Rpdj4nO1xuICB0cnkge1xuICAgIGNvbnN0IHNlc3Npb25JZCA9IHN0YXRlTWFuYWdlcj8uZ2V0U2Vzc2lvbklkPy4oKTtcbiAgICBjb25zdCBbc3luTWFwLCByZXNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgX2xvYWRBdHNTeW5vbnltTWFwKCksXG4gICAgICBmZXRjaCgnL2FwaS9jdi9hdHMtc2NvcmUnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBzZXNzaW9uX2lkOiBzZXNzaW9uSWQsIGJhc2lzOiAncmV2aWV3X2NoZWNrcG9pbnQnIH0pLFxuICAgICAgfSksXG4gICAgXSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEub2sgJiYgZGF0YS5hdHNfc2NvcmUpIHtcbiAgICAgIHN0YXRlTWFuYWdlcj8uc2V0QXRzU2NvcmU/LihkYXRhLmF0c19zY29yZSk7XG4gICAgICB1cGRhdGVBdHNCYWRnZShkYXRhLmF0c19zY29yZSk7XG4gICAgICBib2R5LmlubmVySFRNTCA9IF9yZW5kZXJBdHNSZXBvcnQoZGF0YS5hdHNfc2NvcmUsIHN5bk1hcCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJvZHkuaW5uZXJIVE1MID0gYDxwIHN0eWxlPVwicGFkZGluZzoyNHB4O2NvbG9yOiNlZjQ0NDQ7XCI+Q291bGQgbm90IGxvYWQgQVRTIHJlcG9ydDogJHtlc2NhcGVIdG1sKGRhdGEuZXJyb3IgfHwgJ3Vua25vd24gZXJyb3InKX08L3A+YDtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBib2R5LmlubmVySFRNTCA9IGA8cCBzdHlsZT1cInBhZGRpbmc6MjRweDtjb2xvcjojZWY0NDQ0O1wiPkVycm9yOiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX08L3A+YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBjbG9zZUF0c1JlcG9ydE1vZGFsKCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXRzLXJlcG9ydC1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIF9hdHNFc2NhcGVIYW5kbGVyKTtcbiAgcmVzdG9yZUZvY3VzKCk7XG59XG5cbi8qKlxuICogUmVuZGVyIGFuIEFUUyBzY29yZSBvYmplY3QgaW50byBIVE1MIGZvciB0aGUgbW9kYWwgYm9keS5cbiAqL1xuZnVuY3Rpb24gX3JlbmRlckF0c1JlcG9ydChzY29yZSwgc3luTWFwKSB7XG4gIGNvbnN0IG92ZXJhbGwgPSBNYXRoLnJvdW5kKHNjb3JlLm92ZXJhbGwgPz8gMCk7XG4gIGNvbnN0IGhhcmQgPSBNYXRoLnJvdW5kKHNjb3JlLmhhcmRfcmVxdWlyZW1lbnRfc2NvcmUgPz8gMCk7XG4gIGNvbnN0IHNvZnQgPSBNYXRoLnJvdW5kKHNjb3JlLnNvZnRfcmVxdWlyZW1lbnRfc2NvcmUgPz8gMCk7XG5cbiAgY29uc3Qgc2NvcmVDb2xvciA9IG92ZXJhbGwgPj0gNzUgPyAnIzEwYjk4MScgOiBvdmVyYWxsID49IDUwID8gJyNmNTllMGInIDogJyNlZjQ0NDQnO1xuXG4gIGNvbnN0IGtleXdvcmRzID0gc2NvcmUua2V5d29yZF9zdGF0dXMgfHwgW107XG4gIGNvbnN0IG1pc3NpbmdLdyA9IGtleXdvcmRzLmZpbHRlcihrZXl3b3JkID0+IF9rZXl3b3JkU3RhdHVzKGtleXdvcmQpID09PSAnbWlzc2luZycpO1xuICBjb25zdCBtaXNzaW5nSGFyZCA9IG1pc3NpbmdLdy5maWx0ZXIoa2V5d29yZCA9PiBfa2V5d29yZFR5cGUoa2V5d29yZCkgPT09ICdoYXJkJyk7XG4gIGNvbnN0IGtleXdvcmRHcm91cHMgPSBBVFNfR1JPVVBTXG4gICAgLm1hcCgoW3R5cGUsIHRpdGxlXSkgPT4gX3JlbmRlcktleXdvcmRHcm91cCh0aXRsZSwga2V5d29yZHMuZmlsdGVyKGtleXdvcmQgPT4gX2tleXdvcmRUeXBlKGtleXdvcmQpID09PSB0eXBlKSwgc3luTWFwKSlcbiAgICAuam9pbignJyk7XG5cbiAgY29uc3Qgc2VjdGlvblNjb3JlcyA9IHNjb3JlLnNlY3Rpb25fc2NvcmVzIHx8IHt9O1xuICBjb25zdCBzZWN0SHRtbCA9IE9iamVjdC5rZXlzKHNlY3Rpb25TY29yZXMpLmxlbmd0aCA9PT0gMCA/ICcnIDogYFxuICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOjE2cHg7XCI+XG4gICAgICA8aDQgc3R5bGU9XCJtYXJnaW46MCAwIDhweDtmb250LXNpemU6MXJlbTtjb2xvcjojMzM0MTU1O1wiPlNlY3Rpb24gU2NvcmVzPC9oND5cbiAgICAgIDx0YWJsZSBzdHlsZT1cIndpZHRoOjEwMCU7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlO2ZvbnQtc2l6ZTowLjllbTtcIj5cbiAgICAgICAgJHtPYmplY3QuZW50cmllcyhzZWN0aW9uU2NvcmVzKS5tYXAoKFtzZWMsIHZhbF0pID0+IGBcbiAgICAgICAgICA8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZjFmNWY5O1wiPlxuICAgICAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzo0cHggOHB4O3RleHQtdHJhbnNmb3JtOmNhcGl0YWxpemU7Y29sb3I6IzQ3NTU2OTtcIj4ke2VzY2FwZUh0bWwoc2VjKX08L3RkPlxuICAgICAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzo0cHggOHB4O2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjojMWUyOTNiO1wiPiR7TWF0aC5yb3VuZCh2YWwpfSU8L3RkPlxuICAgICAgICAgIDwvdHI+YCkuam9pbignJyl9XG4gICAgICA8L3RhYmxlPlxuICAgIDwvZGl2PmA7XG5cbiAgcmV0dXJuIGBcbiAgICA8ZGl2IHN0eWxlPVwicGFkZGluZzoyMHB4O1wiPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjI0cHg7bWFyZ2luLWJvdHRvbToyMHB4O1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjIuNGVtO2ZvbnQtd2VpZ2h0OjcwMDtjb2xvcjoke3Njb3JlQ29sb3J9O1wiPiR7b3ZlcmFsbH0lPC9kaXY+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjllbTtjb2xvcjojNDc1NTY5O1wiPkhhcmQgcmVxdWlyZW1lbnRzOiA8c3Ryb25nPiR7aGFyZH0lPC9zdHJvbmc+PC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjllbTtjb2xvcjojNDc1NTY5O1wiPlByZWZlcnJlZCBza2lsbHM6IDxzdHJvbmc+JHtzb2Z0fSU8L3N0cm9uZz48L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuNzVlbTtjb2xvcjojOTRhM2I4O21hcmdpbi10b3A6MnB4O1wiPkJhc2lzOiAke2VzY2FwZUh0bWwoc2NvcmUuYmFzaXMgfHwgJ3JldmlldycpfTwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC43NWVtO2NvbG9yOiM5NGEzYjg7bWFyZ2luLXRvcDo0cHg7XCIgdGl0bGU9XCJTY29yZSB0aHJlc2hvbGRzXCI+XG4gICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIiBzdHlsZT1cImNvbG9yOiMxMGI5ODE7XCI+XHUyNUNGPC9zcGFuPiBcdTIyNjU3NSUgU3Ryb25nIG1hdGNoICZuYnNwO1xuICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCIgc3R5bGU9XCJjb2xvcjojZjU5ZTBiO1wiPlx1MjVDRjwvc3Bhbj4gNTBcdTIwMTM3NCUgUGFydGlhbCBtYXRjaCAmbmJzcDtcbiAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIHN0eWxlPVwiY29sb3I6I2VmNDQ0NDtcIj5cdTI1Q0Y8L3NwYW4+ICZsdDs1MCUgTG93IG1hdGNoXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICAke2tleXdvcmRHcm91cHN9XG4gICAgICAke3NlY3RIdG1sfVxuICAgICAgJHttaXNzaW5nSGFyZC5sZW5ndGggPiAwID8gYFxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDoxNnB4O3BhZGRpbmc6MTJweDtiYWNrZ3JvdW5kOiNmZmY3ZWQ7Ym9yZGVyOjFweCBzb2xpZCAjZmVkN2FhO2JvcmRlci1yYWRpdXM6NnB4O1wiPlxuICAgICAgICAgIDxzdHJvbmcgc3R5bGU9XCJjb2xvcjojOWEzNDEyO1wiPk1pc3NpbmcgaGFyZCByZXF1aXJlbWVudHMgKCR7bWlzc2luZ0hhcmQubGVuZ3RofSk6PC9zdHJvbmc+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjojN2MyZDEyO2ZvbnQtc2l6ZTowLjllbTtcIj4gJHttaXNzaW5nSGFyZC5tYXAoa2V5d29yZCA9PiBlc2NhcGVIdG1sKGtleXdvcmQua2V5d29yZCB8fCBrZXl3b3JkLnRlcm0gfHwgJycpKS5qb2luKCcsICcpfTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+YCA6ICcnfVxuICAgICAgJHttaXNzaW5nS3cubGVuZ3RoID4gbWlzc2luZ0hhcmQubGVuZ3RoID8gYFxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDoxNnB4O3BhZGRpbmc6MTJweDtiYWNrZ3JvdW5kOiNmZmY3ZWQ7Ym9yZGVyOjFweCBzb2xpZCAjZmVkN2FhO2JvcmRlci1yYWRpdXM6NnB4O1wiPlxuICAgICAgICAgIDxzdHJvbmcgc3R5bGU9XCJjb2xvcjojOWEzNDEyO1wiPlJlbWFpbmluZyBrZXl3b3JkIGdhcHMgKCR7bWlzc2luZ0t3Lmxlbmd0aCAtIG1pc3NpbmdIYXJkLmxlbmd0aH0pOjwvc3Ryb25nPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6IzdjMmQxMjtmb250LXNpemU6MC45ZW07XCI+ICR7bWlzc2luZ0t3LmZpbHRlcihrZXl3b3JkID0+IF9rZXl3b3JkVHlwZShrZXl3b3JkKSAhPT0gJ2hhcmQnKS5tYXAoa2V5d29yZCA9PiBlc2NhcGVIdG1sKGtleXdvcmQua2V5d29yZCB8fCBrZXl3b3JkLnRlcm0gfHwgJycpKS5qb2luKCcsICcpfTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+YCA6ICcnfVxuICAgIDwvZGl2PmA7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gSm9iIEFuYWx5c2lzIE1vZGFsXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBPcGVuIHRoZSBKb2IgQW5hbHlzaXMgbW9kYWwuIFJldXNlcyB0YWJEYXRhLmFuYWx5c2lzIGlmIGF2YWlsYWJsZS5cbiAqL1xuZnVuY3Rpb24gX2pvYkFuYWx5c2lzRXNjYXBlSGFuZGxlcihlKSB7XG4gIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIGNsb3NlSm9iQW5hbHlzaXNNb2RhbCgpO1xufVxuXG5mdW5jdGlvbiBvcGVuSm9iQW5hbHlzaXNNb2RhbCgpIHtcbiAgcHVzaEZvY3VzU3RhY2soZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7XG4gIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnam9iLWFuYWx5c2lzLW1vZGFsLW92ZXJsYXknKTtcbiAgb3ZlcmxheS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgX2pvYkFuYWx5c2lzRXNjYXBlSGFuZGxlcik7XG4gIGNvbnN0IGNsb3NlQnRuID0gb3ZlcmxheS5xdWVyeVNlbGVjdG9yKCcubW9kYWwtZm9vdGVyIC5hY3Rpb24tYnRuJyk7XG4gIGlmIChjbG9zZUJ0bikgY2xvc2VCdG4uZm9jdXMoKTtcbiAgdHJhcEZvY3VzKCdqb2ItYW5hbHlzaXMtbW9kYWwtb3ZlcmxheScpO1xuICBjb25zdCBib2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pvYi1hbmFseXNpcy1tb2RhbC1ib2R5Jyk7XG5cbiAgY29uc3QgYW5hbHlzaXMgPSBzdGF0ZU1hbmFnZXIuZ2V0VGFiRGF0YSgnYW5hbHlzaXMnKTtcbiAgaWYgKGFuYWx5c2lzKSB7XG4gICAgLy8gUmVuZGVyIGludG8gYSB0ZW1wIGRpdiB1c2luZyBwb3B1bGF0ZUFuYWx5c2lzVGFiJ3Mgb3V0cHV0IHBhdHRlcm5cbiAgICBjb25zdCB0bXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0bXAuc3R5bGUucGFkZGluZyA9ICcyMHB4JztcbiAgICBib2R5LmlubmVySFRNTCA9ICcnO1xuICAgIGJvZHkuYXBwZW5kQ2hpbGQodG1wKTtcbiAgICAvLyBwb3B1bGF0ZUFuYWx5c2lzVGFiIHdyaXRlcyB0byAjZG9jdW1lbnQtY29udGVudDsgdXNlIGEgc2hpbVxuICAgIF9yZW5kZXJBbmFseXNpc0ludG9FbCh0bXAsIGFuYWx5c2lzKTtcbiAgfSBlbHNlIHtcbiAgICBib2R5LmlubmVySFRNTCA9ICc8cCBzdHlsZT1cInBhZGRpbmc6MjRweDt0ZXh0LWFsaWduOmNlbnRlcjtjb2xvcjojNmI3MjgwO1wiPk5vIGpvYiBhbmFseXNpcyBhdmFpbGFibGUuIFJ1biBqb2IgYW5hbHlzaXMgZmlyc3QuPC9wPic7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2xvc2VKb2JBbmFseXNpc01vZGFsKCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnam9iLWFuYWx5c2lzLW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgX2pvYkFuYWx5c2lzRXNjYXBlSGFuZGxlcik7XG4gIHJlc3RvcmVGb2N1cygpO1xufVxuXG4vKipcbiAqIFJlbmRlciBqb2IgYW5hbHlzaXMgZGF0YSBpbnRvIGFuIGFyYml0cmFyeSBjb250YWluZXIgZWxlbWVudC5cbiAqIE1pcnJvcnMgdGhlIHN0cnVjdHVyZSBmcm9tIHBvcHVsYXRlQW5hbHlzaXNUYWIgaW4gYXBwLmpzLlxuICovXG5mdW5jdGlvbiBfcmVuZGVyQW5hbHlzaXNJbnRvRWwoZWwsIHJlc3VsdCkge1xuICBpZiAoIXJlc3VsdCkge1xuICAgIGVsLmlubmVySFRNTCA9ICc8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7XCI+Tm8gYW5hbHlzaXMgZGF0YS48L3A+JztcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBEZWR1cGxpY2F0ZSBsaXN0czogY2FzZS1pbnNlbnNpdGl2ZSwga2VlcCBmaXJzdCBvY2N1cnJlbmNlIG9mIGVhY2ggbm9ybWFsaXNlZCBmb3JtLlxuICBjb25zdCBfZGVkdXAgPSAoYXJyKSA9PiB7XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQoKTtcbiAgICByZXR1cm4gKGFyciB8fCBbXSkuZmlsdGVyKGl0ZW0gPT4ge1xuICAgICAgY29uc3Qga2V5ID0gU3RyaW5nKHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJyA/IGl0ZW0gOiBpdGVtLmtleXdvcmQgfHwgaXRlbS50ZXJtIHx8ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmICgha2V5IHx8IHNlZW4uaGFzKGtleSkpIHJldHVybiBmYWxzZTtcbiAgICAgIHNlZW4uYWRkKGtleSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgfTtcbiAgY29uc3QgcmVxID0gX2RlZHVwKHJlc3VsdC5yZXF1aXJlZF9za2lsbHMpO1xuICBjb25zdCBwcmVmID0gX2RlZHVwKHJlc3VsdC5wcmVmZXJyZWRfc2tpbGxzIHx8IHJlc3VsdC5uaWNlX3RvX2hhdmUpO1xuICBjb25zdCBrZXl3b3JkcyA9IF9kZWR1cChyZXN1bHQuYXRzX2tleXdvcmRzKTtcbiAgY29uc3QgY3VsdHVyZSA9IHJlc3VsdC5jdWx0dXJlX2luZGljYXRvcnMgfHwgW107XG4gIGNvbnN0IG11c3RIYXZlID0gcmVzdWx0Lm11c3RfaGF2ZV9yZXF1aXJlbWVudHMgfHwgW107XG4gIGNvbnN0IG1pc3NpbmcgPSByZXN1bHQubWlzc2luZ19yZXF1aXJlZCB8fCBbXTtcblxuICBlbC5pbm5lckhUTUwgPSBgXG4gICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjk1ZW07bGluZS1oZWlnaHQ6MS42O1wiPlxuICAgICAgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2Y4ZmFmYztib3JkZXI6MXB4IHNvbGlkICNlMmU4ZjA7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzoxNHB4IDE2cHg7bWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjEuMWVtO2ZvbnQtd2VpZ2h0OjcwMDtjb2xvcjojMWUyOTNiO1wiPiR7ZXNjYXBlSHRtbChyZXN1bHQuam9iX3RpdGxlIHx8IHJlc3VsdC50aXRsZSB8fCAnUm9sZScpfTwvZGl2PlxuICAgICAgICAke3Jlc3VsdC5jb21wYW55ID8gYDxkaXYgc3R5bGU9XCJjb2xvcjojNDc1NTY5O1wiPiR7ZXNjYXBlSHRtbChyZXN1bHQuY29tcGFueSl9PC9kaXY+YCA6ICcnfVxuICAgICAgICAke3Jlc3VsdC5kb21haW4gPyBgPHNwYW4gc3R5bGU9XCJkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW4tdG9wOjZweDtwYWRkaW5nOjJweCA4cHg7YmFja2dyb3VuZDojZGJlYWZlO2NvbG9yOiMxZTQwYWY7Ym9yZGVyLXJhZGl1czoxMHB4O2ZvbnQtc2l6ZTowLjhlbTtcIj4ke2VzY2FwZUh0bWwocmVzdWx0LmRvbWFpbil9PC9zcGFuPmAgOiAnJ31cbiAgICAgIDwvZGl2PlxuXG4gICAgICAke21pc3NpbmcubGVuZ3RoID4gMCA/IGBcbiAgICAgICAgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2ZmZjdlZDtib3JkZXI6MXB4IHNvbGlkICNmZWQ3YWE7Ym9yZGVyLXJhZGl1czo2cHg7cGFkZGluZzoxMHB4IDE0cHg7bWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgIDxzdHJvbmcgc3R5bGU9XCJjb2xvcjojOWEzNDEyO1wiPlx1MjZBMCBNaXNzaW5nIHJlcXVpcmVkIHNraWxsczo8L3N0cm9uZz5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiY29sb3I6IzdjMmQxMjttYXJnaW4tdG9wOjRweDtcIj4ke21pc3NpbmcubWFwKHMgPT4gZXNjYXBlSHRtbChzKSkuam9pbignIFx1MDBCNyAnKX08L2Rpdj5cbiAgICAgICAgPC9kaXY+YCA6ICcnfVxuXG4gICAgICAke3JlcS5sZW5ndGggPiAwID8gYFxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgIDxoNCBzdHlsZT1cIm1hcmdpbjowIDAgOHB4O2ZvbnQtc2l6ZTowLjk1ZW07dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO2xldHRlci1zcGFjaW5nOi41cHg7Y29sb3I6IzMzNDE1NTtcIj5SZXF1aXJlZCBTa2lsbHM8L2g0PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7ZmxleC13cmFwOndyYXA7Z2FwOjZweDtcIj5cbiAgICAgICAgICAgICR7cmVxLm1hcChzID0+IGA8c3BhbiBzdHlsZT1cInBhZGRpbmc6MnB4IDEwcHg7Ym9yZGVyLXJhZGl1czoxMnB4O2JhY2tncm91bmQ6JHttaXNzaW5nLmluY2x1ZGVzKHMpPycjZmVlMmUyJzonI2RjZmNlNyd9O2NvbG9yOiR7bWlzc2luZy5pbmNsdWRlcyhzKT8nIzk5MWIxYic6JyMxNjY1MzQnfTtmb250LXNpemU6MC44NWVtO1wiPiR7ZXNjYXBlSHRtbChzKX08L3NwYW4+YCkuam9pbignJyl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PmAgOiAnJ31cblxuICAgICAgJHtwcmVmLmxlbmd0aCA+IDAgPyBgXG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgICAgPGg0IHN0eWxlPVwibWFyZ2luOjAgMCA4cHg7Zm9udC1zaXplOjAuOTVlbTt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7bGV0dGVyLXNwYWNpbmc6LjVweDtjb2xvcjojMzM0MTU1O1wiPlByZWZlcnJlZCAvIE5pY2UtdG8taGF2ZTwvaDQ+XG4gICAgICAgICAgPHVsIHN0eWxlPVwibWFyZ2luOjA7cGFkZGluZy1sZWZ0OjE4cHg7Y29sb3I6IzQ3NTU2OTtcIj4ke3ByZWYubWFwKHMgPT4gYDxsaT4ke2VzY2FwZUh0bWwocyl9PC9saT5gKS5qb2luKCcnKX08L3VsPlxuICAgICAgICA8L2Rpdj5gIDogJyd9XG5cbiAgICAgICR7a2V5d29yZHMubGVuZ3RoID4gMCA/IGBcbiAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTRweDtcIj5cbiAgICAgICAgICA8aDQgc3R5bGU9XCJtYXJnaW46MCAwIDhweDtmb250LXNpemU6MC45NWVtO3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTtsZXR0ZXItc3BhY2luZzouNXB4O2NvbG9yOiMzMzQxNTU7XCI+QVRTIEtleXdvcmRzPC9oND5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2ZsZXgtd3JhcDp3cmFwO2dhcDo2cHg7XCI+XG4gICAgICAgICAgICAke2tleXdvcmRzLm1hcCgoaywgaSkgPT4gYDxzcGFuIHN0eWxlPVwicGFkZGluZzoycHggOHB4O2JvcmRlci1yYWRpdXM6MTJweDtiYWNrZ3JvdW5kOiNmMGY5ZmY7Ym9yZGVyOjFweCBzb2xpZCAjYmFlNmZkO2NvbG9yOiMwMzY5YTE7Zm9udC1zaXplOjAuODJlbTtcIj4ke2kgPCA1ID8gYDxzdHJvbmc+IyR7aSsxfTwvc3Ryb25nPiBgIDogJyd9JHtlc2NhcGVIdG1sKHR5cGVvZiBrID09PSAnc3RyaW5nJyA/IGsgOiBrLmtleXdvcmQgfHwgay50ZXJtIHx8ICcnKX08L3NwYW4+YCkuam9pbignJyl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PmAgOiAnJ31cblxuICAgICAgJHttdXN0SGF2ZS5sZW5ndGggPiAwID8gYFxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgIDxoNCBzdHlsZT1cIm1hcmdpbjowIDAgOHB4O2ZvbnQtc2l6ZTowLjk1ZW07dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO2xldHRlci1zcGFjaW5nOi41cHg7Y29sb3I6IzMzNDE1NTtcIj5NdXN0LWhhdmUgUmVxdWlyZW1lbnRzPC9oND5cbiAgICAgICAgICA8dWwgc3R5bGU9XCJtYXJnaW46MDtwYWRkaW5nLWxlZnQ6MThweDtjb2xvcjojNDc1NTY5O1wiPiR7bXVzdEhhdmUubWFwKHMgPT4gYDxsaT4ke2VzY2FwZUh0bWwocyl9PC9saT5gKS5qb2luKCcnKX08L3VsPlxuICAgICAgICA8L2Rpdj5gIDogJyd9XG5cbiAgICAgICR7Y3VsdHVyZS5sZW5ndGggPiAwID8gYFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxoNCBzdHlsZT1cIm1hcmdpbjowIDAgOHB4O2ZvbnQtc2l6ZTowLjk1ZW07dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO2xldHRlci1zcGFjaW5nOi41cHg7Y29sb3I6IzMzNDE1NTtcIj5DdWx0dXJlIEluZGljYXRvcnM8L2g0PlxuICAgICAgICAgIDx1bCBzdHlsZT1cIm1hcmdpbjowO3BhZGRpbmctbGVmdDoxOHB4O2NvbG9yOiM0NzU1Njk7XCI+JHtjdWx0dXJlLm1hcChzID0+IGA8bGk+JHtlc2NhcGVIdG1sKHMpfTwvbGk+YCkuam9pbignJyl9PC91bD5cbiAgICAgICAgPC9kaXY+YCA6ICcnfVxuICAgIDwvZGl2PmA7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQVRTIFNjb3JlIFRhYiAoaW4gY3VzdG9taXplIHBoYXNlKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogUG9wdWxhdGUgdGhlIEFUUyBTY29yZSB0YWIgY29udGVudCBhcmVhLlxuICogQ2FsbGVkIGJ5IGFwcC5qcyBzd2l0Y2hUYWIgd2hlbiBjYXNlICdhdHMtc2NvcmUnIGlzIHNlbGVjdGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBwb3B1bGF0ZUF0c1Njb3JlVGFiKCkge1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgaWYgKCFjb250ZW50KSByZXR1cm47XG5cbiAgY29uc3QgY2FjaGVkID0gc3RhdGVNYW5hZ2VyPy5nZXRBdHNTY29yZT8uKCk7XG4gIGlmIChjYWNoZWQpIHtcbiAgICBjb250ZW50LmlubmVySFRNTCA9IGA8ZGl2IHN0eWxlPVwibWF4LXdpZHRoOjY4MHB4O21hcmdpbjowIGF1dG87XCI+JHtfcmVuZGVyQXRzUmVwb3J0KGNhY2hlZCl9PC9kaXY+YDtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb250ZW50LmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwiZW1wdHktc3RhdGVcIj48ZGl2IGNsYXNzPVwiaWNvblwiPlx1RDgzRFx1RENDQTwvZGl2PjxoMz5BVFMgU2NvcmU8L2gzPjxwPkNvbXBsZXRlIGpvYiBhbmFseXNpcyBhbmQgc2tpbGxzIHJldmlldyB0byBzZWUgeW91ciBBVFMgc2NvcmU8L3A+PGJ1dHRvbiBjbGFzcz1cImJ0bi1wcmltYXJ5XCIgb25jbGljaz1cInJlZnJlc2hBdHNTY29yZShcXCdyZXZpZXdfY2hlY2twb2ludFxcJykudGhlbigoKT0+cG9wdWxhdGVBdHNTY29yZVRhYigpKVwiPkNvbXB1dGUgQVRTIFNjb3JlPC9idXR0b24+PC9kaXY+Jztcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTaG93L2hpZGUgdGhlIG1vZGFsIHNob3J0Y3V0IGJ1dHRvbnMgd2hlbiBBVFMgYmFkZ2UgYmVjb21lcyB2aXNpYmxlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBTaG93IG9yIGhpZGUgdGhlIEFUUyBSZXBvcnQgYW5kIEpvYiBBbmFseXNpcyBzaG9ydGN1dCBidXR0b25zLlxuICogRHJpdmVuIGJ5IHRoZSAnYXRzLXNjb3JlLXVwZGF0ZWQnIGN1c3RvbSBldmVudCBkaXNwYXRjaGVkIGJ5IGFwcC5qc1xuICogd2hlbmV2ZXIgdXBkYXRlQXRzQmFkZ2UoKSBydW5zLiBObyBtb25rZXktcGF0Y2hpbmcgcmVxdWlyZWQuXG4gKi9cbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2F0cy1zY29yZS11cGRhdGVkJywgKCkgPT4ge1xuICBjb25zdCBiYWRnZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdHMtc2NvcmUtYmFkZ2UnKTtcbiAgY29uc3QgdmlzaWJsZSA9IGJhZGdlICYmIGJhZGdlLnN0eWxlLmRpc3BsYXkgIT09ICdub25lJztcbiAgY29uc3QgcmVwb3J0QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F0cy1yZXBvcnQtYnRuJyk7XG4gIGNvbnN0IGFuYWx5c2lzQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pvYi1hbmFseXNpcy1idG4nKTtcbiAgaWYgKHJlcG9ydEJ0bikgcmVwb3J0QnRuLnN0eWxlLmRpc3BsYXkgPSB2aXNpYmxlID8gJ2lubGluZS1ibG9jaycgOiAnbm9uZSc7XG4gIGlmIChhbmFseXNpc0J0bikgYW5hbHlzaXNCdG4uc3R5bGUuZGlzcGxheSA9IHZpc2libGUgPyAnaW5saW5lLWJsb2NrJyA6ICdub25lJztcbn0pO1xuXG5leHBvcnQge1xuICBvcGVuQXRzUmVwb3J0TW9kYWwsXG4gIGNsb3NlQXRzUmVwb3J0TW9kYWwsXG4gIF9yZW5kZXJBdHNSZXBvcnQsXG4gIG9wZW5Kb2JBbmFseXNpc01vZGFsLFxuICBjbG9zZUpvYkFuYWx5c2lzTW9kYWwsXG4gIF9yZW5kZXJBbmFseXNpc0ludG9FbCxcbiAgcG9wdWxhdGVBdHNTY29yZVRhYixcbn07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9zZXNzaW9uLWFjdGlvbnMuanNcbiAqIFNlc3Npb24tbGV2ZWwgZGlzcGF0Y2ggKHNlbmRBY3Rpb24pLCBzYXZlLCBhbmQgcG9zaXRpb24gdGl0bGUgdXBkYXRlcy5cbiAqXG4gKiBERVBFTkRFTkNJRVMgKGFsbCBvbiBnbG9iYWxUaGlzIGF0IHJ1bnRpbWUpOlxuICogICAtIHN0YXRlTWFuYWdlciAoc3RhdGUtbWFuYWdlci5qcyBcdTIwMTQgaXNMb2FkaW5nKCkvc2V0VGFiRGF0YSgpKVxuICogICAtIHVzZXJTZWxlY3Rpb25zICh3aW5kb3cgZ2xvYmFsIGZyb20gYXBwKVxuICogICAtIGFwcGVuZExvYWRpbmdNZXNzYWdlLCByZW1vdmVMb2FkaW5nTWVzc2FnZSwgYXBwZW5kTWVzc2FnZSwgYXBwZW5kUmV0cnlNZXNzYWdlXG4gKiAgIC0gc2V0TG9hZGluZywgbGxtRmV0Y2ggKGZldGNoLXV0aWxzLmpzKVxuICogICAtIHBhcnNlTWVzc2FnZVJlc3BvbnNlLCBwYXJzZVN0YXR1c1Jlc3BvbnNlICh2YWxpZGF0b3JzLmpzKVxuICogICAtIGhhbmRsZUN1c3RvbWl6YXRpb25SZXNwb25zZSAocmV2aWV3LXRhYmxlLWJhc2UuanMsIFRpZXIgNClcbiAqICAgLSByZWZyZXNoQXRzU2NvcmUsIHN3aXRjaFRhYiwgZmV0Y2hTdGF0dXMgKGdsb2JhbFRoaXMpXG4gKiAgIC0gY2xlYXJTdGF0ZSwgU3RvcmFnZUtleXMgKHN0YXRlLW1hbmFnZXIuanMgLyBhcGktY2xpZW50LmpzKVxuICogICAtIHNob3dMb2FkSm9iUGFuZWwsIGNsZWFySm9iSW5wdXQsIGNsZWFyVVJMSW5wdXQsIF9jbGVhckZpZWxkRXJyb3IsXG4gKiAgICAgX3VwZGF0ZVBhc3RlQ2hhckNvdW50IChqb2ItaW5wdXQuanMsIFRpZXIgMylcbiAqICAgLSBub3JtYWxpemVQb3NpdGlvbkxhYmVsLCBleHRyYWN0VGl0bGVBbmRDb21wYW55RnJvbUpvYlRleHQsXG4gKiAgICAgY2xlYW5Kc29uUmVzcG9uc2UgKHV0aWxzLmpzKVxuICogICAtIF91cGRhdGVTZXNzaW9uU3dpdGNoZXJIZWFkZXIgKHNlc3Npb24tc3dpdGNoZXItdWkuanMsIFRpZXIgNylcbiAqL1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5jb25zdCBsb2cgPSBnZXRMb2dnZXIoJ3Nlc3Npb24tYWN0aW9ucycpO1xuXG5pbXBvcnQgeyBTdG9yYWdlS2V5cyB9IGZyb20gJy4vYXBpLWNsaWVudC5qcyc7XG5pbXBvcnQgeyBzdGF0ZU1hbmFnZXIgfSBmcm9tICcuL3N0YXRlLW1hbmFnZXIuanMnO1xuXG4vKiogTWFwcyBhY3Rpb24gaWRlbnRpZmllcnMgdG8gaHVtYW4tcmVhZGFibGUgTExNIHN0YXR1cyBiYXIgbGFiZWxzLiAqL1xuY29uc3QgX0FDVElPTl9MQUJFTFMgPSB7XG4gIGFuYWx5emVfam9iOiAgICAgICAgICAgICAgJ0FuYWx5c2luZyBqb2IgZGVzY3JpcHRpb25cdTIwMjYnLFxuICByZWNvbW1lbmRfY3VzdG9taXphdGlvbnM6ICdHZW5lcmF0aW5nIGN1c3RvbWlzYXRpb24gcmVjb21tZW5kYXRpb25zXHUyMDI2JyxcbiAgZ2VuZXJhdGVfY3Y6ICAgICAgICAgICAgICAnR2VuZXJhdGluZyBDViBmaWxlc1x1MjAyNicsXG59O1xuXG5hc3luYyBmdW5jdGlvbiBzZW5kQWN0aW9uKGFjdGlvbikge1xuICBpZiAoc3RhdGVNYW5hZ2VyLmlzTG9hZGluZygpKSByZXR1cm47XG5cbiAgY29uc3QgbG9hZGluZ01zZyA9IGFwcGVuZExvYWRpbmdNZXNzYWdlKGBFeGVjdXRpbmcgJHthY3Rpb259Li4uYCk7XG4gIHNldExvYWRpbmcodHJ1ZSwgX0FDVElPTl9MQUJFTFNbYWN0aW9uXSB8fCBgJHthY3Rpb24ucmVwbGFjZSgvXy9nLCAnICcpfVx1MjAyNmApO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcGF5bG9hZCA9IHsgYWN0aW9uIH07XG4gICAgaWYgKGFjdGlvbiA9PT0gJ3JlY29tbWVuZF9jdXN0b21pemF0aW9ucycgJiYgd2luZG93LnF1ZXN0aW9uQW5zd2Vycykge1xuICAgICAgcGF5bG9hZC51c2VyX3ByZWZlcmVuY2VzID0gd2luZG93LnF1ZXN0aW9uQW5zd2VycztcbiAgICB9XG5cbiAgICBjb25zdCByZXMgPSBhd2FpdCBsbG1GZXRjaCgnL2FwaS9hY3Rpb24nLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocGF5bG9hZCksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IHBhcnNlTWVzc2FnZVJlc3BvbnNlKGF3YWl0IHJlcy5qc29uKCkpO1xuXG4gICAgcmVtb3ZlTG9hZGluZ01lc3NhZ2UobG9hZGluZ01zZyk7XG5cbiAgICBpZiAoZGF0YS5lcnJvcikge1xuICAgICAgYXBwZW5kUmV0cnlNZXNzYWdlKCdcdTI3NEMgRXJyb3I6ICcgKyBkYXRhLmVycm9yLCAoKSA9PiBzZW5kQWN0aW9uKGFjdGlvbikpO1xuICAgIH0gZWxzZSBpZiAoYWN0aW9uID09PSAncmVjb21tZW5kX2N1c3RvbWl6YXRpb25zJykge1xuICAgICAgY29uc3QgY3VzdG9taXphdGlvbkRhdGEgPSBkYXRhLnJlc3VsdD8uY29udGV4dF9kYXRhPy5jdXN0b21pemF0aW9ucyA/PyBkYXRhLnJlc3VsdDtcbiAgICAgIGF3YWl0IGhhbmRsZUN1c3RvbWl6YXRpb25SZXNwb25zZShjdXN0b21pemF0aW9uRGF0YSk7XG4gICAgfSBlbHNlIGlmIChhY3Rpb24gPT09ICdnZW5lcmF0ZV9jdicpIHtcbiAgICAgIGNvbnN0IGdlbmVyYXRpb25Nc2cgPSBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCAnXHUyM0YzIEdlbmVyYXRpbmcgQ1YgZmlsZXMgKEFUUyBET0NYIFx1MjE5MiBIVE1MIFx1MjE5MiBIdW1hbiBET0NYKS4uLicpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMjA7IGkrKykge1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgNTAwKSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qgc3RhdHVzUmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL3N0YXR1cycpO1xuICAgICAgICAgIGNvbnN0IHN0YXR1c0RhdGEgPSBwYXJzZVN0YXR1c1Jlc3BvbnNlKGF3YWl0IHN0YXR1c1Jlcy5qc29uKCkpO1xuICAgICAgICAgIGNvbnN0IHByb2dyZXNzICAgPSBzdGF0dXNEYXRhLmdlbmVyYXRpb25fcHJvZ3Jlc3MgfHwgW107XG4gICAgICAgICAgaWYgKHByb2dyZXNzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHRvdGFsID0gcHJvZ3Jlc3MubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgZG9uZUNvdW50ID0gcHJvZ3Jlc3MuZmlsdGVyKHAgPT4gcC5zdGF0dXMgPT09ICdjb21wbGV0ZScpLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IGFjdGl2ZSA9IHByb2dyZXNzLmZpbmQocCA9PiBwLnN0YXR1cyAhPT0gJ2NvbXBsZXRlJyk7XG4gICAgICAgICAgICBjb25zdCBzdGVwTGFiZWwgPSBhY3RpdmVcbiAgICAgICAgICAgICAgPyBgJHthY3RpdmUuc3RlcC5yZXBsYWNlKC9fL2csICcgJyl9ICgke2RvbmVDb3VudCArIDF9IG9mICR7dG90YWx9KWBcbiAgICAgICAgICAgICAgOiBgJHt0b3RhbH0gb2YgJHt0b3RhbH0gY29tcGxldGVgO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBfdXBkYXRlTExNU3RhdHVzQmFyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgIF91cGRhdGVMTE1TdGF0dXNCYXIodHJ1ZSwgYEdlbmVyYXRpbmcgQ1Y6ICR7c3RlcExhYmVsfVx1MjAyNmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc3RlcHMgPSBwcm9ncmVzcy5tYXAocCA9PlxuICAgICAgICAgICAgICBgJHtwLnN0YXR1cyA9PT0gJ2NvbXBsZXRlJyA/ICdcdTI3MTMnIDogJ1x1MjNGMyd9ICR7cC5zdGVwLnJlcGxhY2UoL18vZywgJyAnKX0gJHtwLmVsYXBzZWRfbXMgPyBgKCR7cC5lbGFwc2VkX21zfW1zKWAgOiAnJ31gXG4gICAgICAgICAgICApLmpvaW4oJyBcdTIwMjIgJyk7XG4gICAgICAgICAgICBpZiAoZ2VuZXJhdGlvbk1zZykgZ2VuZXJhdGlvbk1zZy5xdWVyeVNlbGVjdG9yKCcuY29udGVudCcpLnRleHRDb250ZW50ID0gYEdlbmVyYXRpbmcgQ1Y6ICR7c3RlcHN9YDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHByb2dyZXNzLmV2ZXJ5KHAgPT4gcC5zdGF0dXMgPT09ICdjb21wbGV0ZScpICYmIHByb2dyZXNzLmxlbmd0aCA+IDApIGJyZWFrO1xuICAgICAgICB9IGNhdGNoIChfZSkgeyAvKiBwb2xsaW5nIGVycm9yIFx1MjAxNCBjb250aW51ZSAqLyB9XG4gICAgICB9XG4gICAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCAnQ1YgZ2VuZXJhdGVkIHN1Y2Nlc3NmdWxseSEgUmV2aWV3IHlvdXIgbGF5b3V0IGJlbG93LicpO1xuICAgICAgc3RhdGVNYW5hZ2VyLnNldFRhYkRhdGEoJ2N2JywgZGF0YS5yZXN1bHQpO1xuICAgICAgcmVmcmVzaEF0c1Njb3JlKCdwb3N0X2dlbmVyYXRpb24nKTtcbiAgICAgIHN3aXRjaFRhYignbGF5b3V0Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIGRhdGEucmVzdWx0KTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nLmVycm9yKCc9PT0gU0VORCBBQ1RJT04gRVJST1IgPT09JywgYWN0aW9uLCBlcnJvcik7XG4gICAgcmVtb3ZlTG9hZGluZ01lc3NhZ2UobG9hZGluZ01zZyk7XG4gICAgaWYgKGVycm9yLm5hbWUgIT09ICdBYm9ydEVycm9yJykge1xuICAgICAgYXBwZW5kUmV0cnlNZXNzYWdlKCdcdTI3NEMgRXJyb3I6ICcgKyBlcnJvci5tZXNzYWdlLCAoKSA9PiBzZW5kQWN0aW9uKGFjdGlvbikpO1xuICAgIH1cbiAgfVxuXG4gIHNldExvYWRpbmcoZmFsc2UpO1xuICBhd2FpdCBmZXRjaFN0YXR1cygpO1xuICBpZiAodHlwZW9mIGZldGNoQW5kRGlzcGxheUxsbUxvZyA9PT0gJ2Z1bmN0aW9uJykgZmV0Y2hBbmREaXNwbGF5TGxtTG9nKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNhdmVTZXNzaW9uKCkge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9zYXZlJywgeyBtZXRob2Q6ICdQT1NUJyB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgaWYgKGRhdGEuc2Vzc2lvbl9maWxlKSBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShTdG9yYWdlS2V5cy5TRVNTSU9OX1BBVEgsIGRhdGEuc2Vzc2lvbl9maWxlKTtcbiAgICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsICdTZXNzaW9uIHNhdmVkIHN1Y2Nlc3NmdWxseS4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwZW5kUmV0cnlNZXNzYWdlKCdcdTI3NEMgRXJyb3Igc2F2aW5nIHNlc3Npb246ICcgKyBkYXRhLmVycm9yLCBzYXZlU2Vzc2lvbik7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy5lcnJvcignPT09IFNBVkUgU0VTU0lPTiBFUlJPUiA9PT0nLCBlcnJvcik7XG4gICAgYXBwZW5kUmV0cnlNZXNzYWdlKCdcdTI3NEMgRXJyb3I6ICcgKyBlcnJvci5tZXNzYWdlLCBzYXZlU2Vzc2lvbik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2Zvcm1hdEJhckRhdGUodmFsdWUpIHtcbiAgY29uc3QgdGV4dCA9IFN0cmluZyh2YWx1ZSB8fCAnJykudHJpbSgpO1xuICBpZiAoIXRleHQpIHJldHVybiAnJztcbiAgaWYgKC9eXFxkezR9LVxcZHsyfS1cXGR7Mn0kLy50ZXN0KHRleHQpKSB7XG4gICAgY29uc3QgW3llYXIsIG1vbnRoLCBkYXldID0gdGV4dC5zcGxpdCgnLScpO1xuICAgIHJldHVybiBgJHttb250aH0vJHtkYXl9LyR7eWVhcn1gO1xuICB9XG4gIGNvbnN0IHBhcnNlZCA9IG5ldyBEYXRlKHRleHQpO1xuICBpZiAoIU51bWJlci5pc05hTihwYXJzZWQuZ2V0VGltZSgpKSkge1xuICAgIHJldHVybiBwYXJzZWQudG9JU09TdHJpbmcoKS5zbGljZSgwLCAxMCk7XG4gIH1cbiAgcmV0dXJuIHRleHQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVBvc2l0aW9uVGl0bGUoc3RhdHVzID0ge30pIHtcbiAgY29uc3QgcG9zaXRpb25FbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwb3NpdGlvbi10aXRsZScpO1xuICBpZiAoIXBvc2l0aW9uRWwpIHJldHVybjtcblxuICBjb25zdCBmYWxsYmFja0Jyb3dzZXJUaXRsZSA9ICdDViBCdWlsZGVyIFx1MjAxNCBQcm9mZXNzaW9uYWwgV2ViIFVJJztcbiAgbGV0IGxhYmVsID0gKHN0YXR1cy5wb3NpdGlvbl9uYW1lIHx8ICcnKS50b1N0cmluZygpLnRyaW0oKTtcbiAgbGV0IGNvbXBhbnkgPSAnJztcbiAgbGV0IGRhdGVBcHBsaWVkID0gJyc7XG5cbiAgaWYgKCFsYWJlbCAmJiBzdGF0dXMuam9iX2FuYWx5c2lzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGFuYWx5c2lzID0gdHlwZW9mIHN0YXR1cy5qb2JfYW5hbHlzaXMgPT09ICdzdHJpbmcnXG4gICAgICAgID8gSlNPTi5wYXJzZShjbGVhbkpzb25SZXNwb25zZShzdGF0dXMuam9iX2FuYWx5c2lzKSlcbiAgICAgICAgOiBzdGF0dXMuam9iX2FuYWx5c2lzO1xuICAgICAgY29uc3QgdGl0bGUgPSBhbmFseXNpcz8uam9iX3RpdGxlIHx8IGFuYWx5c2lzPy50aXRsZSB8fCBhbmFseXNpcz8ucG9zaXRpb25fbmFtZSB8fCAnJztcbiAgICAgIGxhYmVsID0gbm9ybWFsaXplUG9zaXRpb25MYWJlbCh0aXRsZSwgYW5hbHlzaXM/LmNvbXBhbnkpO1xuICAgICAgY29tcGFueSA9IChhbmFseXNpcz8uY29tcGFueV9uYW1lIHx8IGFuYWx5c2lzPy5jb21wYW55IHx8ICcnKS50cmltKCk7XG4gICAgICBkYXRlQXBwbGllZCA9IF9mb3JtYXRCYXJEYXRlKGFuYWx5c2lzPy5kYXRlX2FwcGxpZWQgfHwgYW5hbHlzaXM/LmFwcGxpY2F0aW9uX2RhdGUgfHwgJycpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2cud2FybignRmFpbGVkIHRvIHBhcnNlIGpvYl9hbmFseXNpcyBmb3IgdGl0bGU6JywgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIGlmICghbGFiZWwgJiYgc3RhdHVzLmpvYl9kZXNjcmlwdGlvbl90ZXh0KSB7XG4gICAgY29uc3QgcGFyc2VkID0gZXh0cmFjdFRpdGxlQW5kQ29tcGFueUZyb21Kb2JUZXh0KHN0YXR1cy5qb2JfZGVzY3JpcHRpb25fdGV4dCk7XG4gICAgbGFiZWwgPSBub3JtYWxpemVQb3NpdGlvbkxhYmVsKHBhcnNlZC50aXRsZSwgcGFyc2VkLmNvbXBhbnkpO1xuICAgIGlmICghY29tcGFueSkgY29tcGFueSA9IChwYXJzZWQuY29tcGFueSB8fCAnJykudHJpbSgpO1xuICB9XG5cbiAgcG9zaXRpb25FbC50ZXh0Q29udGVudCA9IGxhYmVsO1xuICBkb2N1bWVudC50aXRsZSA9IGxhYmVsID8gYCR7bGFiZWx9IFx1MjAxNCBDViBCdWlsZGVyYCA6IGZhbGxiYWNrQnJvd3NlclRpdGxlO1xuXG4gIGNvbnN0IHBvc2l0aW9uQ29tcGFueUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Bvc2l0aW9uLWNvbXBhbnknKTtcbiAgaWYgKHBvc2l0aW9uQ29tcGFueUVsKSB7XG4gICAgY29uc3QgaW50YWtlID0gd2luZG93Ll9zdGF0dXNJbnRha2UgfHwge307XG4gICAgY29uc3QgZmluYWxDb21wYW55ID0gKGludGFrZS5jb21wYW55IHx8ICcnKS50cmltKCkgfHwgY29tcGFueTtcbiAgICBjb25zdCBmaW5hbERhdGUgPSBkYXRlQXBwbGllZCB8fCBfZm9ybWF0QmFyRGF0ZShpbnRha2UuZGF0ZV9hcHBsaWVkIHx8ICcnKTtcbiAgICBjb25zdCBzdWJ0aXRsZSA9IFtmaW5hbENvbXBhbnksIGZpbmFsRGF0ZV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAgXHUwMEI3ICAnKTtcbiAgICBwb3NpdGlvbkNvbXBhbnlFbC50ZXh0Q29udGVudCA9IHN1YnRpdGxlO1xuICAgIHBvc2l0aW9uQ29tcGFueUVsLnN0eWxlLmRpc3BsYXkgPSBzdWJ0aXRsZSA/ICcnIDogJ25vbmUnO1xuICB9XG5cbiAgY29uc3QgcmVuYW1lQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlbmFtZS1zZXNzaW9uLWJ0bicpO1xuICBpZiAocmVuYW1lQnRuKSByZW5hbWVCdG4uc3R5bGUuZGlzcGxheSA9IGxhYmVsID8gJycgOiAnbm9uZSc7XG4gIGlmICh0eXBlb2YgX3VwZGF0ZVNlc3Npb25Td2l0Y2hlckhlYWRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIF91cGRhdGVTZXNzaW9uU3dpdGNoZXJIZWFkZXIoeyBwb3NpdGlvbl9uYW1lOiBsYWJlbCwgcGhhc2U6IHN0YXR1cy5waGFzZSB8fCBudWxsIH0pO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFUyBtb2R1bGUgZXhwb3J0cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmV4cG9ydCB7IHNlbmRBY3Rpb24sIHNhdmVTZXNzaW9uLCB1cGRhdGVQb3NpdGlvblRpdGxlLCBfQUNUSU9OX0xBQkVMUyB9O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvam9iLWFuYWx5c2lzLmpzXG4gKiBKb2IgYW5hbHlzaXMgb3JjaGVzdHJhdGlvbjogZmlyZXMgYW5hbHl6ZV9qb2IgYWN0aW9uLCBtZXJnZXMgcG9zdC1hbmFseXNpc1xuICogcXVlc3Rpb25zLCBhbmQgdHJhbnNpdGlvbnMgdGhlIFVJIHRvIHRoZSBhbmFseXNpcyB0YWIuXG4gKlxuICogREVQRU5ERU5DSUVTIChhbGwgb24gZ2xvYmFsVGhpcyBhdCBydW50aW1lKTpcbiAqICAgLSBzdGF0ZU1hbmFnZXIgKHN0YXRlLW1hbmFnZXIuanMgXHUyMDE0IGlzTG9hZGluZygpL3NldFRhYkRhdGEoKSlcbiAqICAgLSBsbG1GZXRjaCwgc2V0TG9hZGluZyAoZmV0Y2gtdXRpbHMuanMpXG4gKiAgIC0gYXBwZW5kTG9hZGluZ01lc3NhZ2UsIHJlbW92ZUxvYWRpbmdNZXNzYWdlLCBhcHBlbmRNZXNzYWdlLFxuICogICAgIGFwcGVuZFJldHJ5TWVzc2FnZSwgYXBwZW5kRm9ybWF0dGVkQW5hbHlzaXMgKG1lc3NhZ2UtcXVldWUuanMpXG4gKiAgIC0gcGFyc2VNZXNzYWdlUmVzcG9uc2UgKHZhbGlkYXRvcnMuanMpXG4gKiAgIC0gYXNrUG9zdEFuYWx5c2lzUXVlc3Rpb25zIChxdWVzdGlvbnMtcGFuZWwuanMpXG4gKiAgIC0gcmVmcmVzaEF0c1Njb3JlIChhdHMtcmVmaW5lbWVudC5qcylcbiAqICAgLSBzd2l0Y2hUYWIgKHJldmlldy10YWJsZS1iYXNlLmpzLCBUaWVyIDQpXG4gKiAgIC0gZmV0Y2hTdGF0dXMgKGFwcC5qcyBvcmNoZXN0cmF0b3IsIFRpZXIgOClcbiAqICAgLSBfc2hvd0ludGFrZUNvbmZpcm1DYXJkLCBfcHJvY2VlZEFmdGVySW50YWtlIChtZXNzYWdlLWRpc3BhdGNoLmpzLCBUaWVyIDMpXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdqb2ItYW5hbHlzaXMnKTtcblxuaW1wb3J0IHsgU3RvcmFnZUtleXMgfSBmcm9tICcuL2FwaS1jbGllbnQuanMnO1xuaW1wb3J0IHsgc3RhdGVNYW5hZ2VyIH0gZnJvbSAnLi9zdGF0ZS1tYW5hZ2VyLmpzJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBQb3N0LWFuYWx5c2lzIHF1ZXN0aW9uIGhlbHBlcnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogTm9ybWFsaXNlIGEgcmF3IHF1ZXN0aW9ucyBhcnJheSB0byBbe3F1ZXN0aW9uLCB0eXBlLCBjaG9pY2VzfV0uICovXG5mdW5jdGlvbiBub3JtYWxpemVQb3N0QW5hbHlzaXNRdWVzdGlvbnMocmF3UXVlc3Rpb25zKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShyYXdRdWVzdGlvbnMpKSByZXR1cm4gW107XG4gIHJldHVybiByYXdRdWVzdGlvbnNcbiAgICAuZmlsdGVyKHEgPT4gcSAmJiB0eXBlb2YgcS5xdWVzdGlvbiA9PT0gJ3N0cmluZycgJiYgcS5xdWVzdGlvbi50cmltKCkpXG4gICAgLm1hcCgocSwgaWR4KSA9PiAoe1xuICAgICAgcXVlc3Rpb246IHEucXVlc3Rpb24udHJpbSgpLFxuICAgICAgdHlwZTogICAgIChxLnR5cGUgfHwgYGNsYXJpZmljYXRpb25fJHtpZHggKyAxfWApLnRvU3RyaW5nKCksXG4gICAgICBjaG9pY2VzOiAgQXJyYXkuaXNBcnJheShxLmNob2ljZXMpID8gcS5jaG9pY2VzIDogW10sXG4gICAgfSkpO1xufVxuXG4vKipcbiAqIEV4dHJhY3QgbnVtYmVyZWQtbGlzdCBxdWVzdGlvbnMgZnJvbSB1bnN0cnVjdHVyZWQgYXNzaXN0YW50IHRleHQuXG4gKiBSZXR1cm5zIGF0IG1vc3QgNCBxdWVzdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RTdHJ1Y3R1cmVkUXVlc3Rpb25zRnJvbUFzc2lzdGFudFRleHQodGV4dCkge1xuICBpZiAodHlwZW9mIHRleHQgIT09ICdzdHJpbmcnIHx8ICF0ZXh0LnRyaW0oKSkgcmV0dXJuIFtdO1xuICBjb25zdCBub3JtYWxpemVkID0gdGV4dC5yZXBsYWNlKC9cXHJcXG4vZywgJ1xcbicpO1xuICBjb25zdCBibG9ja3MgPSBub3JtYWxpemVkLnNwbGl0KC9eXFxzKlxcZCtcXC5cXHMrL20pO1xuICBpZiAoYmxvY2tzLmxlbmd0aCA8PSAxKSByZXR1cm4gW107XG4gIHJldHVybiBibG9ja3NcbiAgICAuc2xpY2UoMSlcbiAgICAubWFwKChibG9jaywgaWR4KSA9PiB7XG4gICAgICBjb25zdCBxdWVzdGlvbiA9IGJsb2NrLnRyaW0oKTtcbiAgICAgIGlmICghcXVlc3Rpb24pIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIHsgcXVlc3Rpb246IHF1ZXN0aW9uLnNsaWNlKDAsIDQwMDApLCB0eXBlOiBgY2xhcmlmaWNhdGlvbl8ke2lkeCArIDF9YCwgY2hvaWNlczogW10gfTtcbiAgICB9KVxuICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAuc2xpY2UoMCwgNCk7XG59XG5cbi8qKlxuICogTWVyZ2Ugc2VydmVyLXByb3ZpZGVkIHF1ZXN0aW9ucyB3aXRoIHRob3NlIGV4dHJhY3RlZCBmcm9tIHRoZSBhc3Npc3RhbnQgdGV4dCxcbiAqIGRlLWR1cGxpY2F0aW5nIGJ5IHF1ZXN0aW9uIHRleHQgYW5kIHR5cGUuXG4gKi9cbmZ1bmN0aW9uIG1lcmdlUG9zdEFuYWx5c2lzUXVlc3Rpb25zKGV4aXN0aW5nUXVlc3Rpb25zLCBpbmNvbWluZ1F1ZXN0aW9ucykge1xuICBjb25zdCBleGlzdGluZyA9IG5vcm1hbGl6ZVBvc3RBbmFseXNpc1F1ZXN0aW9ucyhleGlzdGluZ1F1ZXN0aW9ucyk7XG4gIGNvbnN0IGluY29taW5nID0gbm9ybWFsaXplUG9zdEFuYWx5c2lzUXVlc3Rpb25zKGluY29taW5nUXVlc3Rpb25zKTtcblxuICBjb25zdCBtZXJnZWQgICAgICAgID0gWy4uLmV4aXN0aW5nXTtcbiAgY29uc3Qgc2VlbkJ5UXVlc3Rpb24gPSBuZXcgU2V0KGV4aXN0aW5nLm1hcChxID0+IHEucXVlc3Rpb24udG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXHMrL2csICcgJykudHJpbSgpKSk7XG4gIGNvbnN0IHVzZWRUeXBlcyAgICAgID0gbmV3IFNldChleGlzdGluZy5tYXAocSA9PiBxLnR5cGUpKTtcblxuICBpbmNvbWluZy5mb3JFYWNoKChxLCBpZHgpID0+IHtcbiAgICBjb25zdCBrZXkgPSBxLnF1ZXN0aW9uLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpLnRyaW0oKTtcbiAgICBpZiAoIWtleSB8fCBzZWVuQnlRdWVzdGlvbi5oYXMoa2V5KSkgcmV0dXJuO1xuICAgIGxldCB0eXBlID0gcS50eXBlIHx8IGBjbGFyaWZpY2F0aW9uXyR7bWVyZ2VkLmxlbmd0aCArIGlkeCArIDF9YDtcbiAgICBpZiAodXNlZFR5cGVzLmhhcyh0eXBlKSkgdHlwZSA9IGAke3R5cGV9XyR7bWVyZ2VkLmxlbmd0aCArIGlkeCArIDF9YDtcbiAgICBtZXJnZWQucHVzaCh7IHF1ZXN0aW9uOiBxLnF1ZXN0aW9uLCB0eXBlLCBjaG9pY2VzOiBBcnJheS5pc0FycmF5KHEuY2hvaWNlcykgPyBxLmNob2ljZXMgOiBbXSB9KTtcbiAgICBzZWVuQnlRdWVzdGlvbi5hZGQoa2V5KTtcbiAgICB1c2VkVHlwZXMuYWRkKHR5cGUpO1xuICB9KTtcblxuICByZXR1cm4gbWVyZ2VkO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIGFuYWx5emVKb2Jcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5hc3luYyBmdW5jdGlvbiBhbmFseXplSm9iKCkge1xuICBpZiAoc3RhdGVNYW5hZ2VyLmlzTG9hZGluZygpKSByZXR1cm47XG5cbiAgaWYgKCFsb2NhbFN0b3JhZ2UuZ2V0SXRlbShTdG9yYWdlS2V5cy5MTE1fRElTQ0xPU1VSRV9TSE9XTikpIHtcbiAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnXHUyMTM5XHVGRTBGIENvbnRlbnQgeW91IHN1Ym1pdCBpcyBzZW50IHRvIHRoZSBjb25maWd1cmVkIExMTSBwcm92aWRlciBmb3IgYW5hbHlzaXMuIFJldmlldyB5b3VyIHByb3ZpZGVyXFwncyBkYXRhIHBvbGljeSBmb3IgZGV0YWlscy4nKTtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShTdG9yYWdlS2V5cy5MTE1fRElTQ0xPU1VSRV9TSE9XTiwgJzEnKTtcbiAgfVxuXG4gIGNvbnN0IGxvYWRpbmdNc2cgPSBhcHBlbmRMb2FkaW5nTWVzc2FnZSgnQW5hbHl6aW5nIGpvYiBkZXNjcmlwdGlvbi4uLicpO1xuICBzZXRMb2FkaW5nKHRydWUsICdBbmFseXNpbmcgam9iIGRlc2NyaXB0aW9uXHUyMDI2Jyk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgbGxtRmV0Y2goJy9hcGkvYWN0aW9uJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgYWN0aW9uOiAnYW5hbHl6ZV9qb2InIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBwYXJzZU1lc3NhZ2VSZXNwb25zZShhd2FpdCByZXMuanNvbigpKTtcblxuICAgIHJlbW92ZUxvYWRpbmdNZXNzYWdlKGxvYWRpbmdNc2cpO1xuXG4gICAgaWYgKGRhdGEuZXJyb3IpIHtcbiAgICAgIGFwcGVuZFJldHJ5TWVzc2FnZSgnXHUyNzRDIEVycm9yOiAnICsgZGF0YS5lcnJvciwgYW5hbHl6ZUpvYik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJlc3VsdCAgICAgICA9IGRhdGEucmVzdWx0O1xuICAgICAgY29uc3QgYW5hbHlzaXNUZXh0ID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycgPyByZXN1bHQgOiAocmVzdWx0Py50ZXh0KSB8fCBudWxsO1xuICAgICAgY29uc3QgYW5hbHlzaXNEYXRhID0gdHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcgJiYgcmVzdWx0ICE9PSBudWxsXG4gICAgICAgID8gKHJlc3VsdC5jb250ZXh0X2RhdGE/LmpvYl9hbmFseXNpcyA/PyByZXN1bHQpXG4gICAgICAgIDogcmVzdWx0O1xuICAgICAgY29uc3QgY29udGV4dFF1ZXN0aW9ucyA9ICh0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0JyAmJiByZXN1bHQgIT09IG51bGwpXG4gICAgICAgID8gcmVzdWx0LmNvbnRleHRfZGF0YT8ucG9zdF9hbmFseXNpc19xdWVzdGlvbnNcbiAgICAgICAgOiBudWxsO1xuICAgICAgY29uc3Qgc3RydWN0dXJlZFF1ZXN0aW9ucyA9IG1lcmdlUG9zdEFuYWx5c2lzUXVlc3Rpb25zKFxuICAgICAgICBjb250ZXh0UXVlc3Rpb25zLFxuICAgICAgICAoY29udGV4dFF1ZXN0aW9ucyAmJiBjb250ZXh0UXVlc3Rpb25zLmxlbmd0aCA+IDApXG4gICAgICAgICAgPyBbXVxuICAgICAgICAgIDogZXh0cmFjdFN0cnVjdHVyZWRRdWVzdGlvbnNGcm9tQXNzaXN0YW50VGV4dChhbmFseXNpc1RleHQpLFxuICAgICAgKTtcblxuICAgICAgaWYgKGFuYWx5c2lzVGV4dCkgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgYW5hbHlzaXNUZXh0KTtcbiAgICAgIGFwcGVuZEZvcm1hdHRlZEFuYWx5c2lzKGFuYWx5c2lzRGF0YSk7XG4gICAgICBzdGF0ZU1hbmFnZXIuc2V0VGFiRGF0YSgnYW5hbHlzaXMnLCBhbmFseXNpc0RhdGEpO1xuICAgICAgcmVmcmVzaEF0c1Njb3JlKCdhbmFseXNpcycpO1xuICAgICAgc3dpdGNoVGFiKCdhbmFseXNpcycpO1xuXG4gICAgICBjb25zdCBjb250aW51ZUFmdGVySW50YWtlID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBhc2tQb3N0QW5hbHlzaXNRdWVzdGlvbnMoYW5hbHlzaXNEYXRhLCBzdHJ1Y3R1cmVkUXVlc3Rpb25zKTtcbiAgICAgIH07XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGludGFrZVJlcyAgPSBhd2FpdCBsbG1GZXRjaCgnL2FwaS9pbnRha2UtbWV0YWRhdGEnKTtcbiAgICAgICAgY29uc3QgaW50YWtlRGF0YSA9IGF3YWl0IGludGFrZVJlcy5qc29uKCk7XG4gICAgICAgIGlmIChpbnRha2VEYXRhLmNvbmZpcm1lZCkge1xuICAgICAgICAgIGF3YWl0IF9wcm9jZWVkQWZ0ZXJJbnRha2UoY29udGludWVBZnRlckludGFrZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgX3Nob3dJbnRha2VDb25maXJtQ2FyZChjb250aW51ZUFmdGVySW50YWtlKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoX2UpIHtcbiAgICAgICAgYXdhaXQgY29udGludWVBZnRlckludGFrZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cuZXJyb3IoJz09PSBBTkFMWVpFIEpPQiBFUlJPUiA9PT0nLCBlcnJvcik7XG4gICAgcmVtb3ZlTG9hZGluZ01lc3NhZ2UobG9hZGluZ01zZyk7XG4gICAgaWYgKGVycm9yLm5hbWUgIT09ICdBYm9ydEVycm9yJykge1xuICAgICAgYXBwZW5kUmV0cnlNZXNzYWdlKCdcdTI3NEMgRXJyb3I6ICcgKyBlcnJvci5tZXNzYWdlLCBhbmFseXplSm9iKTtcbiAgICB9XG4gIH1cblxuICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgLy8gVXBkYXRlIHRoZSBwb3NpdGlvbi10aXRsZSBiYXIgd2l0aCB0aGUgbGF0ZXN0IHNlc3Npb24gbmFtZSBhZnRlciBhbmFseXNpcy5cbiAgdHJ5IHtcbiAgICBjb25zdCBsYXRlc3RTdGF0dXMgPSBhd2FpdCBmZXRjaFN0YXR1cygpO1xuICAgIGlmIChsYXRlc3RTdGF0dXMgJiYgdHlwZW9mIHVwZGF0ZVBvc2l0aW9uVGl0bGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHVwZGF0ZVBvc2l0aW9uVGl0bGUobGF0ZXN0U3RhdHVzKTtcbiAgICB9XG4gIH0gY2F0Y2ggKF9lKSB7IC8qIG5vbi1mYXRhbCAqLyB9XG4gIGlmICh0eXBlb2YgZmV0Y2hBbmREaXNwbGF5TGxtTG9nID09PSAnZnVuY3Rpb24nKSBmZXRjaEFuZERpc3BsYXlMbG1Mb2coKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEVTIG1vZHVsZSBleHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuZXhwb3J0IHtcbiAgbm9ybWFsaXplUG9zdEFuYWx5c2lzUXVlc3Rpb25zLFxuICBleHRyYWN0U3RydWN0dXJlZFF1ZXN0aW9uc0Zyb21Bc3Npc3RhbnRUZXh0LFxuICBtZXJnZVBvc3RBbmFseXNpc1F1ZXN0aW9ucyxcbiAgYW5hbHl6ZUpvYixcbn07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9nb2Fscy5qcyBcdTIwMTQgR2VuZXJhdGlvbiBHb2FscyBjb25maWd1cmF0aW9uIHRhYi5cbiAqXG4gKiBBbGxvd3MgdGhlIHVzZXIgdG8gc2V0IGRvY3VtZW50LWxlbmd0aCBhbmQgY2hhcmFjdGVyLWNvdW50IGNvbnN0cmFpbnRzIHRoYXRcbiAqIGFyZSBpbmplY3RlZCBpbnRvIGV2ZXJ5IExMTSBwcm9tcHQgYW5kIHVzZWQgdG8gY29udHJvbCB0aGUgZmluYWwgUERGIGxlbmd0aC5cbiAqXG4gKiBGaWVsZHM6XG4gKiAgIHBkZl9wYWdlc19lbmFibGVkICAgIFx1MjAxNCB3aGV0aGVyIHRoZSBQREYgcGFnZSBnb2FsIGlzIGFjdGl2ZVxuICogICBtYXhfcGRmX3BhZ2VzX21vZGUgICBcdTIwMTQgJ2NvbWJpbmVkJyB8ICdzcGxpdCdcbiAqICAgbWF4X3BkZl9wYWdlcyAgICAgICAgXHUyMDE0IGNvbWJpbmVkIHRvdGFsIFBERiBwYWdlIGdvYWwgKG1vZGU9Y29tYmluZWQpXG4gKiAgIG1heF9wZGZfcmVzdW1lX3BhZ2VzIFx1MjAxNCByZXN1bWUtcG9ydGlvbiBwYWdlIGdvYWwgKG1vZGU9c3BsaXQpXG4gKiAgIG1heF9wZGZfY3ZfcGFnZXMgICAgIFx1MjAxNCBDVi9wdWJsaWNhdGlvbnMgcG9ydGlvbiBwYWdlIGdvYWwgKG1vZGU9c3BsaXQpXG4gKiAgIGF0c19wYWdlc19lbmFibGVkICAgIFx1MjAxNCB3aGV0aGVyIHRoZSBBVFMgcGFnZSBnb2FsIGlzIGFjdGl2ZVxuICogICBtYXhfYXRzX3BhZ2VzICAgICAgICBcdTIwMTQgdGFyZ2V0IHBhZ2UgY291bnQgZm9yIEFUUyBwbGFpbi10ZXh0IG91dHB1dFxuICogICBhdHNfY2hhcnNfZW5hYmxlZCAgICBcdTIwMTQgd2hldGhlciB0aGUgQVRTIGNoYXJhY3RlciBsaW1pdCBpcyBhY3RpdmUgKGRlZmF1bHQgZmFsc2UpXG4gKiAgIG1heF9hdHNfY2hhcnMgICAgICAgIFx1MjAxNCBtYXhpbXVtIGNoYXJhY3RlcnMgKGluY2x1ZGluZyBzcGFjZXMpIGZvciBBVFMgdGV4dFxuICpcbiAqIEVhY2ggZ29hbCBoYXMgYSBjaGVja2JveCB0byBlbmFibGUgb3IgZGlzYWJsZSBpdDsgZGlzYWJsZWQgZ29hbHMgYXJlIG5vdFxuICogc2VudCB0byB0aGUgYmFja2VuZCBhbmQgYXJlIG5vdCBpbmplY3RlZCBpbnRvIHByb21wdHMuXG4gKlxuICogREVQRU5ERU5DSUVTIChhdmFpbGFibGUgb24gZ2xvYmFsVGhpcyB2aWEgbWFpbi5qcyk6XG4gKiAgIGFwaUNhbGwgKGFwaS1jbGllbnQuanMpXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuXG5jb25zdCBsb2cgPSBnZXRMb2dnZXIoJ2dvYWxzJyk7XG5cbmNvbnN0IEdPQUxTX0RFRkFVTFRTID0ge1xuICBwZGZfcGFnZXNfZW5hYmxlZDogICAgdHJ1ZSxcbiAgbWF4X3BkZl9wYWdlc19tb2RlOiAgICdjb21iaW5lZCcsXG4gIG1heF9wZGZfcGFnZXM6ICAgICAgICAyLFxuICBtYXhfcGRmX3Jlc3VtZV9wYWdlczogMixcbiAgbWF4X3BkZl9jdl9wYWdlczogICAgIDEsXG4gIGF0c19wYWdlc19lbmFibGVkOiAgICB0cnVlLFxuICBtYXhfYXRzX3BhZ2VzOiAgICAgICAgMSxcbiAgYXRzX2NoYXJzX2VuYWJsZWQ6ICAgIGZhbHNlLFxuICBtYXhfYXRzX2NoYXJzOiAgICAgICAgNTAwMCxcbn07XG5cbi8qKiBTaGFyZWQgaW5saW5lIHN0eWxlcyAqL1xuY29uc3QgUyA9IHtcbiAgc2VjdGlvbjogICAgJ21hcmdpbi1ib3R0b206MjBweDtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJvcmRlciwjZTBlMGUwKTtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjE2cHgnLFxuICBoZWFkZXI6ICAgICAnZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTBweDttYXJnaW4tYm90dG9tOjEycHgnLFxuICBjaGVja2JveDogICAnd2lkdGg6MTZweDtoZWlnaHQ6MTZweDtjdXJzb3I6cG9pbnRlcjtmbGV4LXNocmluazowJyxcbiAgbGFiZWw6ICAgICAgJ2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MXJlbTtjdXJzb3I6cG9pbnRlcjttYXJnaW46MCcsXG4gIGhpbnQ6ICAgICAgICdmb250LXNpemU6MC44NzVyZW07Y29sb3I6dmFyKC0tdGV4dC1zZWNvbmRhcnksIzU1NSk7bWFyZ2luOjAgMCA4cHgnLFxuICBudW1JbnB1dDogICAncGFkZGluZzo2cHggMTBweDtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJvcmRlciwjY2NjKTtib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6MXJlbScsXG4gIHJvdzogICAgICAgICdkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDo4cHgnLFxuICBtdXRlZDogICAgICAnY29sb3I6dmFyKC0tdGV4dC1zZWNvbmRhcnksIzU1NSknLFxuICByYWRpb0xhYmVsOiAnZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmZsZXgtc3RhcnQ7Z2FwOjhweDtjdXJzb3I6cG9pbnRlcicsXG4gIHJhZGlvSW5wdXQ6ICdtYXJnaW4tdG9wOjNweCcsXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcG9wdWxhdGVHb2Fsc1RhYigpIHtcbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIGlmICghY29udGVudCkgcmV0dXJuO1xuXG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgY2xhc3M9XCJnb2Fscy1wYW5lbFwiIHN0eWxlPVwibWF4LXdpZHRoOjY0MHB4O21hcmdpbjowIGF1dG87cGFkZGluZzoyOHB4IDI0cHhcIj5cbiAgICAgIDxoMiBzdHlsZT1cIm1hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjhweFwiPlx1RDgzQ1x1REZBRiBHZW5lcmF0aW9uIEdvYWxzPC9oMj5cbiAgICAgIDxwIHN0eWxlPVwiJHtTLm11dGVkfTttYXJnaW4tYm90dG9tOjI0cHg7bGluZS1oZWlnaHQ6MS41XCI+XG4gICAgICAgIFNldCBvcHRpb25hbCBsZW5ndGggY29uc3RyYWludHMgZm9yIHRoZSBnZW5lcmF0ZWQgQ1YuXG4gICAgICAgIENoZWNrIGVhY2ggZ29hbCB5b3Ugd2FudCB0byBlbmZvcmNlOyB1bmNoZWNrZWQgZ29hbHMgYXJlIGlnbm9yZWQuXG4gICAgICAgIFRoZXNlIGd1aWRlIHRoZSBBSSBhdCBldmVyeSBlZGl0aW5nIHN0YWdlIGFuZCBjb250cm9sIHRoZSBmaW5hbCBkb2N1bWVudCBsZW5ndGguXG4gICAgICA8L3A+XG5cbiAgICAgIDwhLS0gXHUyNTAwXHUyNTAwIFBERiBQYWdlIExlbmd0aCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDAgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiZ29hbHMtc2VjdGlvblwiIHN0eWxlPVwiJHtTLnNlY3Rpb259XCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCIke1MuaGVhZGVyfVwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImdvYWxzLXBkZi1lbmFibGVkXCJcbiAgICAgICAgICAgICAgICAgb25jaGFuZ2U9XCJnb2Fsc1RvZ2dsZVNlY3Rpb24oJ3BkZicpXCJcbiAgICAgICAgICAgICAgICAgY2hlY2tlZCBzdHlsZT1cIiR7Uy5jaGVja2JveH1cIj5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwiZ29hbHMtcGRmLWVuYWJsZWRcIiBzdHlsZT1cIiR7Uy5sYWJlbH1cIj5QREYgUGFnZSBMZW5ndGg8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cImdvYWxzLXBkZi1ib2R5XCI+XG4gICAgICAgICAgPHAgc3R5bGU9XCIke1MuaGludH1cIj5cbiAgICAgICAgICAgIFRhcmdldCBwYWdlIGNvdW50IGZvciB0aGUgaHVtYW4tcmVhZGFibGUgUERGIChlLmcuIDFcdTIwMTMzKS5cbiAgICAgICAgICA8L3A+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Z2FwOjEycHhcIj5cblxuICAgICAgICAgICAgPCEtLSBcdTI1MDBcdTI1MDAgU2luZ2xlIHRvdGFsIG9wdGlvbiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDAgLS0+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgc3R5bGU9XCIke1MucmFkaW9MYWJlbH1cIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cImdvYWxzLXBkZi1tb2RlXCIgdmFsdWU9XCJjb21iaW5lZFwiXG4gICAgICAgICAgICAgICAgICAgICAgIGlkPVwiZ29hbHMtcGRmLW1vZGUtY29tYmluZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICBvbmNoYW5nZT1cImdvYWxzVXBkYXRlUGRmTW9kZSgpXCIgY2hlY2tlZFxuICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIiR7Uy5yYWRpb0lucHV0fVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICAgICAgPHN0cm9uZz5TaW5nbGUgdG90YWw8L3N0cm9uZz5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXNpemU6MC44NzVyZW07JHtTLm11dGVkfTttYXJnaW4tdG9wOjJweFwiPlxuICAgICAgICAgICAgICAgICAgICBPbmUgcGFnZSBnb2FsIGNvdmVyaW5nIHRoZSBlbnRpcmUgZG9jdW1lbnQsIGluY2x1ZGluZ1xuICAgICAgICAgICAgICAgICAgICBwdWJsaWNhdGlvbnMgYW5kIGNpdGF0aW9ucy5cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxkaXYgaWQ9XCJnb2Fscy1wZGYtY29tYmluZWRcIlxuICAgICAgICAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZy1sZWZ0OjI0cHg7bWFyZ2luLXRvcDo4cHg7JHtTLnJvd31cIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiZ29hbHMtbWF4LXBkZi1wYWdlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgIG1pbj1cIjFcIiBtYXg9XCIxMFwiIHN0ZXA9XCIxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCIke0dPQUxTX0RFRkFVTFRTLm1heF9wZGZfcGFnZXN9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDo5MHB4OyR7Uy5udW1JbnB1dH1cIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cIiR7Uy5tdXRlZH1cIj5wYWdlcyB0b3RhbDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBcdTI1MDBcdTI1MDAgU3BsaXQgcG9ydGlvbnMgb3B0aW9uIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMCAtLT5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBzdHlsZT1cIiR7Uy5yYWRpb0xhYmVsfVwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwiZ29hbHMtcGRmLW1vZGVcIiB2YWx1ZT1cInNwbGl0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJnb2Fscy1wZGYtbW9kZS1zcGxpdFwiXG4gICAgICAgICAgICAgICAgICAgICAgIG9uY2hhbmdlPVwiZ29hbHNVcGRhdGVQZGZNb2RlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIiR7Uy5yYWRpb0lucHV0fVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICAgICAgPHN0cm9uZz5TcGxpdCBwb3J0aW9uczwvc3Ryb25nPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtc2l6ZTowLjg3NXJlbTske1MubXV0ZWR9O21hcmdpbi10b3A6MnB4XCI+XG4gICAgICAgICAgICAgICAgICAgIFNlcGFyYXRlIHBhZ2UgZ29hbHMgZm9yIHRoZSByZXN1bWUgcG9ydGlvbiAoZXhwZXJpZW5jZSwgc2tpbGxzKVxuICAgICAgICAgICAgICAgICAgICBhbmQgdGhlIENWL3B1YmxpY2F0aW9ucyBwb3J0aW9uIChjaXRhdGlvbnMsIHB1YmxpY2F0aW9ucykuXG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICA8ZGl2IGlkPVwiZ29hbHMtcGRmLXNwbGl0XCJcbiAgICAgICAgICAgICAgICAgICBzdHlsZT1cInBhZGRpbmctbGVmdDoyNHB4O21hcmdpbi10b3A6OHB4O2Rpc3BsYXk6bm9uZTtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Z2FwOjhweFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCIke1Mucm93fVwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIHN0eWxlPVwibWluLXdpZHRoOjE4NXB4O2ZvbnQtc2l6ZTowLjlyZW1cIj5SZXN1bWUgcG9ydGlvbjo8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cImdvYWxzLW1heC1wZGYtcmVzdW1lLXBhZ2VzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICBtaW49XCIxXCIgbWF4PVwiMTBcIiBzdGVwPVwiMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCIke0dPQUxTX0RFRkFVTFRTLm1heF9wZGZfcmVzdW1lX3BhZ2VzfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDo5MHB4OyR7Uy5udW1JbnB1dH1cIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiJHtTLm11dGVkfVwiPnBhZ2VzPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCIke1Mucm93fVwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIHN0eWxlPVwibWluLXdpZHRoOjE4NXB4O2ZvbnQtc2l6ZTowLjlyZW1cIj5DViAvIFB1YmxpY2F0aW9ucyBwb3J0aW9uOjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiZ29hbHMtbWF4LXBkZi1jdi1wYWdlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgbWluPVwiMVwiIG1heD1cIjEwXCIgc3RlcD1cIjFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPVwiJHtHT0FMU19ERUZBVUxUUy5tYXhfcGRmX2N2X3BhZ2VzfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDo5MHB4OyR7Uy5udW1JbnB1dH1cIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiJHtTLm11dGVkfVwiPnBhZ2VzPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPC9kaXY+PCEtLSBlbmQgbW9kZSBvcHRpb25zIGNvbHVtbiAtLT5cbiAgICAgICAgPC9kaXY+PCEtLSBlbmQgZ29hbHMtcGRmLWJvZHkgLS0+XG4gICAgICA8L2Rpdj48IS0tIGVuZCBQREYgc2VjdGlvbiAtLT5cblxuICAgICAgPCEtLSBcdTI1MDBcdTI1MDAgQVRTIFBsYWluLVRleHQgUGFnZSBMZW5ndGggXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImdvYWxzLXNlY3Rpb25cIiBzdHlsZT1cIiR7Uy5zZWN0aW9ufVwiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiJHtTLmhlYWRlcn1cIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJnb2Fscy1hdHMtcGFnZXMtZW5hYmxlZFwiXG4gICAgICAgICAgICAgICAgIG9uY2hhbmdlPVwiZ29hbHNUb2dnbGVTZWN0aW9uKCdhdHMtcGFnZXMnKVwiXG4gICAgICAgICAgICAgICAgIGNoZWNrZWQgc3R5bGU9XCIke1MuY2hlY2tib3h9XCI+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cImdvYWxzLWF0cy1wYWdlcy1lbmFibGVkXCIgc3R5bGU9XCIke1MubGFiZWx9XCI+QVRTIFBsYWluLVRleHQgUGFnZSBMZW5ndGg8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cImdvYWxzLWF0cy1wYWdlcy1ib2R5XCI+XG4gICAgICAgICAgPHAgc3R5bGU9XCIke1MuaGludH1cIj5cbiAgICAgICAgICAgIFRhcmdldCBudW1iZXIgb2YgcGFnZXMgZm9yIHRoZSBBVFMtb3B0aW1pc2VkIHBsYWluLXRleHQgb3V0cHV0ICh0eXBpY2FsbHkgMVx1MjAxMzIpLlxuICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiJHtTLnJvd31cIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJnb2Fscy1tYXgtYXRzLXBhZ2VzXCJcbiAgICAgICAgICAgICAgICAgICBtaW49XCIxXCIgbWF4PVwiNVwiIHN0ZXA9XCIxXCJcbiAgICAgICAgICAgICAgICAgICB2YWx1ZT1cIiR7R09BTFNfREVGQVVMVFMubWF4X2F0c19wYWdlc31cIlxuICAgICAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6OTBweDske1MubnVtSW5wdXR9XCI+XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cIiR7Uy5tdXRlZH1cIj5wYWdlczwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBcdTI1MDBcdTI1MDAgQVRTIENoYXJhY3RlciBDb3VudCAoZGlzYWJsZWQgYnkgZGVmYXVsdCkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImdvYWxzLXNlY3Rpb25cIiBzdHlsZT1cIiR7Uy5zZWN0aW9ufTttYXJnaW4tYm90dG9tOjI4cHhcIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cIiR7Uy5oZWFkZXJ9XCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiZ29hbHMtYXRzLWNoYXJzLWVuYWJsZWRcIlxuICAgICAgICAgICAgICAgICBvbmNoYW5nZT1cImdvYWxzVG9nZ2xlU2VjdGlvbignYXRzLWNoYXJzJylcIlxuICAgICAgICAgICAgICAgICBzdHlsZT1cIiR7Uy5jaGVja2JveH1cIj5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwiZ29hbHMtYXRzLWNoYXJzLWVuYWJsZWRcIiBzdHlsZT1cIiR7Uy5sYWJlbH1cIj5BVFMgQ2hhcmFjdGVyIENvdW50IExpbWl0PC9sYWJlbD5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjhyZW07JHtTLm11dGVkfTtmb250LXN0eWxlOml0YWxpY1wiPihvcHRpb25hbCBcdTIwMTQgdW5jb21tb24pPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cImdvYWxzLWF0cy1jaGFycy1ib2R5XCIgc3R5bGU9XCJvcGFjaXR5OjAuNDtwb2ludGVyLWV2ZW50czpub25lXCI+XG4gICAgICAgICAgPHAgc3R5bGU9XCIke1MuaGludH1cIj5cbiAgICAgICAgICAgIE1heGltdW0gY2hhcmFjdGVycyAoaW5jbHVkaW5nIHNwYWNlcykgaW4gdGhlIEFUUyBwbGFpbi10ZXh0IG91dHB1dC5cbiAgICAgICAgICA8L3A+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cIiR7Uy5yb3d9XCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiZ29hbHMtbWF4LWF0cy1jaGFyc1wiXG4gICAgICAgICAgICAgICAgICAgbWluPVwiNTAwXCIgbWF4PVwiMjAwMDBcIiBzdGVwPVwiMTAwXCJcbiAgICAgICAgICAgICAgICAgICB2YWx1ZT1cIiR7R09BTFNfREVGQVVMVFMubWF4X2F0c19jaGFyc31cIlxuICAgICAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6MTEwcHg7JHtTLm51bUlucHV0fVwiPlxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCIke1MubXV0ZWR9XCI+Y2hhcmFjdGVyczwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBcdTI1MDBcdTI1MDAgR2VuZXJhdGlvbiBTZXR0aW5ncyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDAgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiZ29hbHMtc2VjdGlvblwiIHN0eWxlPVwiJHtTLnNlY3Rpb259O21hcmdpbi1ib3R0b206MjhweFwiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiJHtTLmhlYWRlcn1cIj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZToxLjFyZW1cIj5cdTI2OTlcdUZFMEY8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCIke1MubGFiZWx9XCI+R2VuZXJhdGlvbiBTZXR0aW5nczwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxwIHN0eWxlPVwiJHtTLmhpbnR9XCI+XG4gICAgICAgICAgQ29udHJvbHMgdGhlIHNoYXBlIG9mIHRoZSBnZW5lcmF0ZWQgQ1YgXHUyMDE0IGFwcGxpZWQgZHVyaW5nIGN1c3RvbWl6YXRpb24gYW5kIHJld3JpdGUgc3RlcHMuXG4gICAgICAgIDwvcD5cblxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtnYXA6MTRweFwiPlxuICAgICAgICAgIDwhLS0gTWF4IHNraWxscyAtLT5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTJweDtmbGV4LXdyYXA6d3JhcFwiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cImdvYWxzLW1heC1za2lsbHMtaW5wdXRcIiBzdHlsZT1cImZvbnQtc2l6ZTowLjlyZW07Y29sb3I6IzRiNTU2Mzt3aGl0ZS1zcGFjZTpub3dyYXA7bWluLXdpZHRoOjE2MHB4XCI+XG4gICAgICAgICAgICAgIE1heCBza2lsbHMgaW4gQ1Y6XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYW5nZVwiIGlkPVwiZ29hbHMtbWF4LXNraWxscy1pbnB1dFwiIG1pbj1cIjFcIiBtYXg9XCI2MFwiIHN0ZXA9XCIxXCIgdmFsdWU9XCIyMFwiXG4gICAgICAgICAgICAgICAgICAgb25pbnB1dD1cImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb2Fscy1tYXgtc2tpbGxzLXZhbHVlJykudGV4dENvbnRlbnQ9dGhpcy52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgb25jaGFuZ2U9XCJnb2Fsc0F1dG9TYXZlU2V0dGluZ3MoKVwiXG4gICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmbGV4OjE7bWluLXdpZHRoOjEyMHB4O2FjY2VudC1jb2xvcjojM2I4MmY2XCI+XG4gICAgICAgICAgICA8c3BhbiBpZD1cImdvYWxzLW1heC1za2lsbHMtdmFsdWVcIiBzdHlsZT1cImZvbnQtd2VpZ2h0OjYwMDtjb2xvcjojMWUyOTNiO21pbi13aWR0aDoyZW07dGV4dC1hbGlnbjpyaWdodFwiPjIwPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC44MmVtOyR7Uy5tdXRlZH1cIj4oZGVmYXVsdDogMjApPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBTa2lsbHMgc2VjdGlvbiB0aXRsZSAtLT5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTJweDtmbGV4LXdyYXA6d3JhcFwiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cImdvYWxzLXNraWxscy10aXRsZS1zZWxlY3RcIiBzdHlsZT1cImZvbnQtc2l6ZTowLjlyZW07Y29sb3I6IzRiNTU2Mzt3aGl0ZS1zcGFjZTpub3dyYXA7bWluLXdpZHRoOjE2MHB4XCI+XG4gICAgICAgICAgICAgIFNraWxscyBzZWN0aW9uIHRpdGxlOlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJnb2Fscy1za2lsbHMtdGl0bGUtc2VsZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgb25jaGFuZ2U9XCJnb2Fsc09uU2tpbGxzVGl0bGVTZWxlY3QoKVwiXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZm9udC1zaXplOjAuOWVtO2JvcmRlcjoxcHggc29saWQgI2QxZDVkYjtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjRweCA4cHg7Y29sb3I6IzFlMjkzYlwiPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiU2tpbGxzXCI+U2tpbGxzPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJUZWNobmljYWwgU2tpbGxzXCI+VGVjaG5pY2FsIFNraWxsczwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiS2V5IFNraWxsc1wiPktleSBTa2lsbHM8L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIkNvcmUgU2tpbGxzXCI+Q29yZSBTa2lsbHM8L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIl9fY3VzdG9tX19cIj5DdXN0b21cdTIwMjY8L29wdGlvbj5cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJnb2Fscy1za2lsbHMtdGl0bGUtY3VzdG9tXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBjdXN0b20gdGl0bGVcIlxuICAgICAgICAgICAgICAgICAgIG9uY2hhbmdlPVwiZ29hbHNBdXRvU2F2ZVNldHRpbmdzKClcIlxuICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZGlzcGxheTpub25lO2ZvbnQtc2l6ZTowLjllbTtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo0cHg7cGFkZGluZzo0cHggOHB4O2NvbG9yOiMxZTI5M2I7bWluLXdpZHRoOjE2MHB4XCI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8c3BhbiBpZD1cImdvYWxzLXNldHRpbmdzLXN0YXR1c1wiIHN0eWxlPVwiZGlzcGxheTpibG9jazttYXJnaW4tdG9wOjhweDtmb250LXNpemU6MC44MnJlbTt0cmFuc2l0aW9uOmNvbG9yIDAuMnNcIj48L3NwYW4+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBzdHlsZT1cIiR7Uy5yb3d9O2dhcDoxNHB4XCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJzYXZlLWdvYWxzLWJ0blwiXG4gICAgICAgICAgICAgICAgb25jbGljaz1cInNhdmVHZW5lcmF0aW9uR29hbHMoKVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4tcHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgc3R5bGU9XCJwYWRkaW5nOjhweCAyMnB4O2ZvbnQtc2l6ZTowLjk1cmVtXCI+XG4gICAgICAgICAgU2F2ZSBHb2Fsc1xuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPHNwYW4gaWQ9XCJnb2Fscy1zdGF0dXNcIlxuICAgICAgICAgICAgICBzdHlsZT1cImZvbnQtc2l6ZTowLjg3NXJlbTt0cmFuc2l0aW9uOmNvbG9yIDAuMnNcIj48L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYDtcblxuICAvLyBSZXN0b3JlIHNhdmVkIGdvYWxzIGZyb20gdGhlIGJhY2tlbmQgc2Vzc2lvbiBzdGF0ZS5cbiAgYXdhaXQgX2xvYWRHb2Fsc0Zyb21TdGF0dXMoKTtcbn1cblxuLyoqXG4gKiBUb2dnbGUgdGhlIGVuYWJsZWQvZGlzYWJsZWQgYXBwZWFyYW5jZSBvZiBhIGdvYWwgc2VjdGlvbi5cbiAqIEV4cG9ydGVkIHNvIHRoZSBpbmxpbmUgb25jaGFuZ2U9XCJnb2Fsc1RvZ2dsZVNlY3Rpb24oLi4uKVwiIGhhbmRsZXJzIHdvcmsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnb2Fsc1RvZ2dsZVNlY3Rpb24oc2VjdGlvbikge1xuICBjb25zdCBNQVAgPSB7XG4gICAgJ3BkZic6ICAgICAgIHsgY2I6ICdnb2Fscy1wZGYtZW5hYmxlZCcsICAgICAgIGJvZHk6ICdnb2Fscy1wZGYtYm9keScgICAgICAgfSxcbiAgICAnYXRzLXBhZ2VzJzogeyBjYjogJ2dvYWxzLWF0cy1wYWdlcy1lbmFibGVkJywgYm9keTogJ2dvYWxzLWF0cy1wYWdlcy1ib2R5JyB9LFxuICAgICdhdHMtY2hhcnMnOiB7IGNiOiAnZ29hbHMtYXRzLWNoYXJzLWVuYWJsZWQnLCBib2R5OiAnZ29hbHMtYXRzLWNoYXJzLWJvZHknIH0sXG4gIH07XG4gIGNvbnN0IHNlbCA9IE1BUFtzZWN0aW9uXTtcbiAgaWYgKCFzZWwpIHJldHVybjtcbiAgY29uc3QgY2IgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHNlbC5jYik7XG4gIGNvbnN0IGJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzZWwuYm9keSk7XG4gIGlmICghY2IgfHwgIWJvZHkpIHJldHVybjtcbiAgYm9keS5zdHlsZS5vcGFjaXR5ICAgICAgID0gY2IuY2hlY2tlZCA/ICcxJyAgICA6ICcwLjQnO1xuICBib2R5LnN0eWxlLnBvaW50ZXJFdmVudHMgPSBjYi5jaGVja2VkID8gJ2F1dG8nIDogJ25vbmUnO1xufVxuXG4vKipcbiAqIFNob3cvaGlkZSBjb21iaW5lZCB2cyBzcGxpdCBQREYgcGFnZSBpbnB1dHMgd2hlbiB0aGUgbW9kZSByYWRpbyBjaGFuZ2VzLlxuICogRXhwb3J0ZWQgc28gdGhlIGlubGluZSBvbmNoYW5nZT1cImdvYWxzVXBkYXRlUGRmTW9kZSgpXCIgaGFuZGxlciB3b3Jrcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdvYWxzVXBkYXRlUGRmTW9kZSgpIHtcbiAgY29uc3QgY29tYmluZWRSYWRpbyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb2Fscy1wZGYtbW9kZS1jb21iaW5lZCcpO1xuICBjb25zdCBpc0NvbWJpbmVkICAgID0gY29tYmluZWRSYWRpbz8uY2hlY2tlZCA/PyB0cnVlO1xuICBjb25zdCBjb21iaW5lZERpdiAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLXBkZi1jb21iaW5lZCcpO1xuICBjb25zdCBzcGxpdERpdiAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLXBkZi1zcGxpdCcpO1xuICBpZiAoY29tYmluZWREaXYpIGNvbWJpbmVkRGl2LnN0eWxlLmRpc3BsYXkgPSBpc0NvbWJpbmVkID8gJ2ZsZXgnICAgOiAnbm9uZSc7XG4gIGlmIChzcGxpdERpdikgICAgc3BsaXREaXYuc3R5bGUuZGlzcGxheSAgICA9IGlzQ29tYmluZWQgPyAnbm9uZScgICA6ICdmbGV4Jztcbn1cblxuLyoqXG4gKiBGZXRjaCBjdXJyZW50IGdlbmVyYXRpb24gZ29hbHMgZnJvbSB0aGUgc2Vzc2lvbiBhbmQgcG9wdWxhdGUgdGhlIGZvcm0gaW5wdXRzLlxuICogQHByaXZhdGVcbiAqL1xuYXN5bmMgZnVuY3Rpb24gX2xvYWRHb2Fsc0Zyb21TdGF0dXMoKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgZGF0YSAgPSBhd2FpdCBhcGlDYWxsKCdHRVQnLCAnL2FwaS9zdGF0dXMnKTtcbiAgICBjb25zdCBnb2FscyA9IGRhdGE/LmdlbmVyYXRpb25fZ29hbHM7XG4gICAgaWYgKCFnb2FscykgcmV0dXJuO1xuXG4gICAgLy8gXHUyNTAwXHUyNTAwIEVuYWJsZWQgY2hlY2tib3hlcyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICBjb25zdCBwZGZFbmFibGVkQ2IgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb2Fscy1wZGYtZW5hYmxlZCcpO1xuICAgIGNvbnN0IGF0c1BhZ2VFbmFibGVkQ2IgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLWF0cy1wYWdlcy1lbmFibGVkJyk7XG4gICAgY29uc3QgYXRzQ2hhcnNFbmFibGVkQ2IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtYXRzLWNoYXJzLWVuYWJsZWQnKTtcblxuICAgIGlmIChwZGZFbmFibGVkQ2IgICAgICAmJiBnb2Fscy5wZGZfcGFnZXNfZW5hYmxlZCAgIT0gbnVsbCkgcGRmRW5hYmxlZENiLmNoZWNrZWQgICAgICA9IGdvYWxzLnBkZl9wYWdlc19lbmFibGVkO1xuICAgIGlmIChhdHNQYWdlRW5hYmxlZENiICAmJiBnb2Fscy5hdHNfcGFnZXNfZW5hYmxlZCAgIT0gbnVsbCkgYXRzUGFnZUVuYWJsZWRDYi5jaGVja2VkICA9IGdvYWxzLmF0c19wYWdlc19lbmFibGVkO1xuICAgIGlmIChhdHNDaGFyc0VuYWJsZWRDYiAmJiBnb2Fscy5hdHNfY2hhcnNfZW5hYmxlZCAgIT0gbnVsbCkgYXRzQ2hhcnNFbmFibGVkQ2IuY2hlY2tlZCA9IGdvYWxzLmF0c19jaGFyc19lbmFibGVkO1xuXG4gICAgZ29hbHNUb2dnbGVTZWN0aW9uKCdwZGYnKTtcbiAgICBnb2Fsc1RvZ2dsZVNlY3Rpb24oJ2F0cy1wYWdlcycpO1xuICAgIGdvYWxzVG9nZ2xlU2VjdGlvbignYXRzLWNoYXJzJyk7XG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgUERGIG1vZGUgcmFkaW8gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgaWYgKGdvYWxzLm1heF9wZGZfcGFnZXNfbW9kZSkge1xuICAgICAgY29uc3QgcmFkaW8gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICBgaW5wdXRbbmFtZT1cImdvYWxzLXBkZi1tb2RlXCJdW3ZhbHVlPVwiJHtnb2Fscy5tYXhfcGRmX3BhZ2VzX21vZGV9XCJdYCk7XG4gICAgICBpZiAocmFkaW8pIHJhZGlvLmNoZWNrZWQgPSB0cnVlO1xuICAgICAgZ29hbHNVcGRhdGVQZGZNb2RlKCk7XG4gICAgfVxuXG4gICAgLy8gXHUyNTAwXHUyNTAwIE51bWVyaWMgdmFsdWVzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIGNvbnN0IHBkZklucHV0ICAgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb2Fscy1tYXgtcGRmLXBhZ2VzJyk7XG4gICAgY29uc3QgcGRmUmVzdW1lSW5wdXQgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLW1heC1wZGYtcmVzdW1lLXBhZ2VzJyk7XG4gICAgY29uc3QgcGRmQ3ZJbnB1dCAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLW1heC1wZGYtY3YtcGFnZXMnKTtcbiAgICBjb25zdCBhdHNQYWdlSW5wdXQgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtbWF4LWF0cy1wYWdlcycpO1xuICAgIGNvbnN0IGF0c0NoYXJJbnB1dCAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb2Fscy1tYXgtYXRzLWNoYXJzJyk7XG5cbiAgICBpZiAocGRmSW5wdXQgICAgICAgJiYgZ29hbHMubWF4X3BkZl9wYWdlcyAgICAgICAgICE9IG51bGwpIHBkZklucHV0LnZhbHVlICAgICAgID0gZ29hbHMubWF4X3BkZl9wYWdlcztcbiAgICBpZiAocGRmUmVzdW1lSW5wdXQgJiYgZ29hbHMubWF4X3BkZl9yZXN1bWVfcGFnZXMgICE9IG51bGwpIHBkZlJlc3VtZUlucHV0LnZhbHVlID0gZ29hbHMubWF4X3BkZl9yZXN1bWVfcGFnZXM7XG4gICAgaWYgKHBkZkN2SW5wdXQgICAgICYmIGdvYWxzLm1heF9wZGZfY3ZfcGFnZXMgICAgICAhPSBudWxsKSBwZGZDdklucHV0LnZhbHVlICAgICA9IGdvYWxzLm1heF9wZGZfY3ZfcGFnZXM7XG4gICAgaWYgKGF0c1BhZ2VJbnB1dCAgICYmIGdvYWxzLm1heF9hdHNfcGFnZXMgICAgICAgICAhPSBudWxsKSBhdHNQYWdlSW5wdXQudmFsdWUgICA9IGdvYWxzLm1heF9hdHNfcGFnZXM7XG4gICAgaWYgKGF0c0NoYXJJbnB1dCAgICYmIGdvYWxzLm1heF9hdHNfY2hhcnMgICAgICAgICAhPSBudWxsKSBhdHNDaGFySW5wdXQudmFsdWUgICA9IGdvYWxzLm1heF9hdHNfY2hhcnM7XG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgR2VuZXJhdGlvbiBTZXR0aW5ncyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICBjb25zdCBtYXhTa2lsbHNTbGlkZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtbWF4LXNraWxscy1pbnB1dCcpO1xuICAgIGNvbnN0IG1heFNraWxsc0xhYmVsICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb2Fscy1tYXgtc2tpbGxzLXZhbHVlJyk7XG4gICAgaWYgKG1heFNraWxsc1NsaWRlciAmJiBkYXRhLm1heF9za2lsbHMgIT0gbnVsbCkge1xuICAgICAgbWF4U2tpbGxzU2xpZGVyLnZhbHVlID0gZGF0YS5tYXhfc2tpbGxzO1xuICAgICAgaWYgKG1heFNraWxsc0xhYmVsKSBtYXhTa2lsbHNMYWJlbC50ZXh0Q29udGVudCA9IGRhdGEubWF4X3NraWxscztcbiAgICB9XG4gICAgY29uc3Qga25vd25UaXRsZXMgPSBbJ1NraWxscycsICdUZWNobmljYWwgU2tpbGxzJywgJ0tleSBTa2lsbHMnLCAnQ29yZSBTa2lsbHMnXTtcbiAgICBjb25zdCBjdXJyZW50VGl0bGUgPSBkYXRhLnNraWxsc19zZWN0aW9uX3RpdGxlIHx8ICdTa2lsbHMnO1xuICAgIGNvbnN0IHRpdGxlU2VsZWN0ICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb2Fscy1za2lsbHMtdGl0bGUtc2VsZWN0Jyk7XG4gICAgY29uc3QgdGl0bGVDdXN0b20gID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLXNraWxscy10aXRsZS1jdXN0b20nKTtcbiAgICBpZiAodGl0bGVTZWxlY3QpIHtcbiAgICAgIGNvbnN0IGlzS25vd24gPSBrbm93blRpdGxlcy5pbmNsdWRlcyhjdXJyZW50VGl0bGUpO1xuICAgICAgdGl0bGVTZWxlY3QudmFsdWUgPSBpc0tub3duID8gY3VycmVudFRpdGxlIDogJ19fY3VzdG9tX18nO1xuICAgICAgaWYgKHRpdGxlQ3VzdG9tKSB7XG4gICAgICAgIHRpdGxlQ3VzdG9tLnN0eWxlLmRpc3BsYXkgPSBpc0tub3duID8gJ25vbmUnIDogJyc7XG4gICAgICAgIGlmICghaXNLbm93bikgdGl0bGVDdXN0b20udmFsdWUgPSBjdXJyZW50VGl0bGU7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cud2FybignRmFpbGVkIHRvIGxvYWQgZ2VuZXJhdGlvbiBnb2FscyBmcm9tIGJhY2tlbmQ6JywgZXJyKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlYWQgdGhlIGZvcm0gaW5wdXRzLCB2YWxpZGF0ZSwgYW5kIFBPU1QgdG8gL2FwaS9nZW5lcmF0aW9uLWdvYWxzLlxuICogRXhwb3NlZCBvbiBnbG9iYWxUaGlzIHNvIHRoZSBpbmxpbmUgb25jbGljaz1cInNhdmVHZW5lcmF0aW9uR29hbHMoKVwiIHdvcmtzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2F2ZUdlbmVyYXRpb25Hb2FscygpIHtcbiAgY29uc3Qgc3RhdHVzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtc3RhdHVzJyk7XG5cbiAgLy8gXHUyNTAwXHUyNTAwIFJlYWQgZW5hYmxlZCBmbGFncyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgY29uc3QgcGRmRW5hYmxlZCAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLXBkZi1lbmFibGVkJyk/LmNoZWNrZWQgICAgICA/PyB0cnVlO1xuICBjb25zdCBhdHNQYWdlRW5hYmxlZCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtYXRzLXBhZ2VzLWVuYWJsZWQnKT8uY2hlY2tlZCA/PyB0cnVlO1xuICBjb25zdCBhdHNDaGFyc0VuYWJsZWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtYXRzLWNoYXJzLWVuYWJsZWQnKT8uY2hlY2tlZCA/PyBmYWxzZTtcblxuICAvLyBcdTI1MDBcdTI1MDAgUmVhZCBQREYgbW9kZSBhbmQgdmFsdWVzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICBjb25zdCBwZGZNb2RlICAgICAgICA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W25hbWU9XCJnb2Fscy1wZGYtbW9kZVwiXTpjaGVja2VkJyk/LnZhbHVlID8/ICdjb21iaW5lZCc7XG4gIGNvbnN0IHBkZlBhZ2VzICAgICAgID0gcGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLW1heC1wZGYtcGFnZXMnKT8udmFsdWUsICAgICAgICAxMCk7XG4gIGNvbnN0IHBkZlJlc3VtZVBhZ2VzID0gcGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLW1heC1wZGYtcmVzdW1lLXBhZ2VzJyk/LnZhbHVlLCAxMCk7XG4gIGNvbnN0IHBkZkN2UGFnZXMgICAgID0gcGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLW1heC1wZGYtY3YtcGFnZXMnKT8udmFsdWUsICAgICAxMCk7XG4gIGNvbnN0IGF0c1BhZ2VzICAgICAgID0gcGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLW1heC1hdHMtcGFnZXMnKT8udmFsdWUsICAgICAgICAxMCk7XG4gIGNvbnN0IGF0c0NoYXJzICAgICAgID0gcGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLW1heC1hdHMtY2hhcnMnKT8udmFsdWUsICAgICAgICAxMCk7XG5cbiAgLy8gXHUyNTAwXHUyNTAwIFZhbGlkYXRlIG9ubHkgZW5hYmxlZCBmaWVsZHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIGlmIChwZGZFbmFibGVkKSB7XG4gICAgaWYgKHBkZk1vZGUgPT09ICdjb21iaW5lZCcpIHtcbiAgICAgIGlmICghcGRmUGFnZXMgfHwgcGRmUGFnZXMgPCAxIHx8IHBkZlBhZ2VzID4gMTApIHtcbiAgICAgICAgX3NldFN0YXR1cyhzdGF0dXNFbCwgJ1x1MjZBMFx1RkUwRiBQREYgcGFnZXMgbXVzdCBiZSAxXHUyMDEzMTAuJywgJ3dhcm4nKTsgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIXBkZlJlc3VtZVBhZ2VzIHx8IHBkZlJlc3VtZVBhZ2VzIDwgMSB8fCBwZGZSZXN1bWVQYWdlcyA+IDEwKSB7XG4gICAgICAgIF9zZXRTdGF0dXMoc3RhdHVzRWwsICdcdTI2QTBcdUZFMEYgUmVzdW1lIHBvcnRpb24gcGFnZXMgbXVzdCBiZSAxXHUyMDEzMTAuJywgJ3dhcm4nKTsgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCFwZGZDdlBhZ2VzIHx8IHBkZkN2UGFnZXMgPCAxIHx8IHBkZkN2UGFnZXMgPiAxMCkge1xuICAgICAgICBfc2V0U3RhdHVzKHN0YXR1c0VsLCAnXHUyNkEwXHVGRTBGIENWIC8gUHVibGljYXRpb25zIHBvcnRpb24gcGFnZXMgbXVzdCBiZSAxXHUyMDEzMTAuJywgJ3dhcm4nKTsgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoYXRzUGFnZUVuYWJsZWQgICYmICghYXRzUGFnZXMgIHx8IGF0c1BhZ2VzICA8IDEgIHx8IGF0c1BhZ2VzICA+IDUpKSAgICAgeyBfc2V0U3RhdHVzKHN0YXR1c0VsLCAnXHUyNkEwXHVGRTBGIEFUUyBwYWdlcyBtdXN0IGJlIDFcdTIwMTM1LicsICAgICAgICAgICd3YXJuJyk7IHJldHVybjsgfVxuICBpZiAoYXRzQ2hhcnNFbmFibGVkICYmICghYXRzQ2hhcnMgIHx8IGF0c0NoYXJzICA8IDUwMCB8fCBhdHNDaGFycyA+IDIwMDAwKSkgeyBfc2V0U3RhdHVzKHN0YXR1c0VsLCAnXHUyNkEwXHVGRTBGIENoYXJhY3RlcnMgbXVzdCBiZSA1MDBcdTIwMTMyMCAwMDAuJywgJ3dhcm4nKTsgcmV0dXJuOyB9XG5cbiAgLy8gXHUyNTAwXHUyNTAwIEJ1aWxkIHBheWxvYWQgKGluY2x1ZGUgZW5hYmxlZCBmbGFncyArIGFjdGl2ZSB2YWx1ZXMgb25seSkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgcGRmX3BhZ2VzX2VuYWJsZWQ6ICBwZGZFbmFibGVkLFxuICAgIGF0c19wYWdlc19lbmFibGVkOiAgYXRzUGFnZUVuYWJsZWQsXG4gICAgYXRzX2NoYXJzX2VuYWJsZWQ6ICBhdHNDaGFyc0VuYWJsZWQsXG4gICAgbWF4X3BkZl9wYWdlc19tb2RlOiBwZGZNb2RlLFxuICB9O1xuXG4gIGlmIChwZGZFbmFibGVkKSB7XG4gICAgaWYgKHBkZk1vZGUgPT09ICdjb21iaW5lZCcpIHtcbiAgICAgIHBheWxvYWQubWF4X3BkZl9wYWdlcyA9IHBkZlBhZ2VzO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXlsb2FkLm1heF9wZGZfcmVzdW1lX3BhZ2VzID0gcGRmUmVzdW1lUGFnZXM7XG4gICAgICBwYXlsb2FkLm1heF9wZGZfY3ZfcGFnZXMgICAgID0gcGRmQ3ZQYWdlcztcbiAgICB9XG4gIH1cbiAgaWYgKGF0c1BhZ2VFbmFibGVkKSAgcGF5bG9hZC5tYXhfYXRzX3BhZ2VzID0gYXRzUGFnZXM7XG4gIGlmIChhdHNDaGFyc0VuYWJsZWQpIHBheWxvYWQubWF4X2F0c19jaGFycyA9IGF0c0NoYXJzO1xuXG4gIF9zZXRTdGF0dXMoc3RhdHVzRWwsICdTYXZpbmdcdTIwMjYnLCAnaW5mbycpO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgYXBpQ2FsbCgnUE9TVCcsICcvYXBpL2dlbmVyYXRpb24tZ29hbHMnLCBwYXlsb2FkKTtcbiAgICBfc2V0U3RhdHVzKHN0YXR1c0VsLCAnXHUyNzEzIFNhdmVkJywgJ29rJyk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7IGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnJzsgfSwgMzAwMCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy5lcnJvcignRmFpbGVkIHRvIHNhdmUgZ2VuZXJhdGlvbiBnb2FsczonLCBlcnIpO1xuICAgIF9zZXRTdGF0dXMoc3RhdHVzRWwsICdTYXZlIGZhaWxlZC4gUGxlYXNlIHRyeSBhZ2Fpbi4nLCAnZXJyb3InKTtcbiAgfVxufVxuXG4vKipcbiAqIFNob3cvaGlkZSB0aGUgY3VzdG9tLXRpdGxlIGlucHV0IHdoZW4gdGhlIHNraWxscy10aXRsZSBzZWxlY3QgY2hhbmdlcy5cbiAqIEV4cG9ydGVkIHNvIHRoZSBpbmxpbmUgb25jaGFuZ2U9XCJnb2Fsc09uU2tpbGxzVGl0bGVTZWxlY3QoKVwiIGhhbmRsZXIgd29ya3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnb2Fsc09uU2tpbGxzVGl0bGVTZWxlY3QoKSB7XG4gIGNvbnN0IHNlbCAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb2Fscy1za2lsbHMtdGl0bGUtc2VsZWN0Jyk7XG4gIGNvbnN0IGN1c3RvbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb2Fscy1za2lsbHMtdGl0bGUtY3VzdG9tJyk7XG4gIGlmICghc2VsKSByZXR1cm47XG4gIGlmIChzZWwudmFsdWUgPT09ICdfX2N1c3RvbV9fJykge1xuICAgIGlmIChjdXN0b20pIHsgY3VzdG9tLnN0eWxlLmRpc3BsYXkgPSAnJzsgY3VzdG9tLmZvY3VzKCk7IH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoY3VzdG9tKSBjdXN0b20uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBnb2Fsc0F1dG9TYXZlU2V0dGluZ3MoKTtcbiAgfVxufVxuXG4vKipcbiAqIEF1dG8tc2F2ZSB0aGUgZ2VuZXJhdGlvbiBzZXR0aW5ncyAobWF4X3NraWxscyArIHNraWxsc19zZWN0aW9uX3RpdGxlKVxuICogdmlhIFBPU1QgL2FwaS9nZW5lcmF0aW9uLXNldHRpbmdzIHdpdGhvdXQgYmxvY2tpbmcuXG4gKiBFeHBvcnRlZCBzbyBpbmxpbmUgb25jaGFuZ2U9XCJnb2Fsc0F1dG9TYXZlU2V0dGluZ3MoKVwiIGhhbmRsZXJzIHdvcmsuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnb2Fsc0F1dG9TYXZlU2V0dGluZ3MoKSB7XG4gIGNvbnN0IHN0YXR1c0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLXNldHRpbmdzLXN0YXR1cycpO1xuICBjb25zdCBzbGlkZXIgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb2Fscy1tYXgtc2tpbGxzLWlucHV0Jyk7XG4gIGNvbnN0IHNlbCAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLXNraWxscy10aXRsZS1zZWxlY3QnKTtcbiAgY29uc3QgY3VzdG9tICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtc2tpbGxzLXRpdGxlLWN1c3RvbScpO1xuXG4gIGNvbnN0IG1heFNraWxscyA9IHNsaWRlciA/IHBhcnNlSW50KHNsaWRlci52YWx1ZSwgMTApIDogbnVsbDtcbiAgY29uc3QgdGl0bGUgICAgID0gc2VsPy52YWx1ZSA9PT0gJ19fY3VzdG9tX18nXG4gICAgPyAoY3VzdG9tPy52YWx1ZT8udHJpbSgpIHx8IG51bGwpXG4gICAgOiAoc2VsPy52YWx1ZSB8fCBudWxsKTtcblxuICBpZiAoIW1heFNraWxscyAmJiAhdGl0bGUpIHJldHVybjtcblxuICBjb25zdCBwYXlsb2FkID0ge307XG4gIGlmIChtYXhTa2lsbHMgJiYgbWF4U2tpbGxzID49IDEpIHBheWxvYWQubWF4X3NraWxscyAgICAgICAgICA9IG1heFNraWxscztcbiAgaWYgKHRpdGxlKSAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZC5za2lsbHNfc2VjdGlvbl90aXRsZSA9IHRpdGxlO1xuXG4gIF9zZXRTdGF0dXMoc3RhdHVzRWwsICdTYXZpbmdcdTIwMjYnLCAnaW5mbycpO1xuICB0cnkge1xuICAgIGF3YWl0IGFwaUNhbGwoJ1BPU1QnLCAnL2FwaS9nZW5lcmF0aW9uLXNldHRpbmdzJywgcGF5bG9hZCk7XG4gICAgX3NldFN0YXR1cyhzdGF0dXNFbCwgJ1x1MjcxMyBTYXZlZCcsICdvaycpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4geyBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJyc7IH0sIDIwMDApO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cud2FybignRmFpbGVkIHRvIHNhdmUgZ2VuZXJhdGlvbiBzZXR0aW5nczonLCBlcnIpO1xuICAgIF9zZXRTdGF0dXMoc3RhdHVzRWwsICdTYXZlIGZhaWxlZCcsICdlcnJvcicpO1xuICB9XG59XG5cbi8qKiBAcHJpdmF0ZSAqL1xuZnVuY3Rpb24gX3NldFN0YXR1cyhlbCwgbWVzc2FnZSwgbGV2ZWwpIHtcbiAgaWYgKCFlbCkgcmV0dXJuO1xuICBjb25zdCBjb2xvdXJzID0ge1xuICAgIG9rOiAgICAndmFyKC0tc3VjY2VzcywjMmU3ZDMyKScsXG4gICAgZXJyb3I6ICd2YXIoLS1kYW5nZXIsI2M2MjgyOCknLFxuICAgIHdhcm46ICAndmFyKC0td2FybmluZywjZTY1MTAwKScsXG4gICAgaW5mbzogICd2YXIoLS10ZXh0LXNlY29uZGFyeSwjNTU1KScsXG4gIH07XG4gIGVsLnN0eWxlLmNvbG9yICA9IGNvbG91cnNbbGV2ZWxdIHx8IGNvbG91cnMuaW5mbztcbiAgZWwudGV4dENvbnRlbnQgID0gbWVzc2FnZTtcbn1cbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL3Nlc3Npb24tbWFuYWdlci5qc1xuICogU2Vzc2lvbiBsaWZlY3ljbGU6IGNyZWF0ZSwgY2xhaW0sIHJlc3RvcmUsIHNhdmUsIGxvYWQuXG4gKiBBbHNvIG93bnMgZm9ybWF0U2Vzc2lvblBoYXNlTGFiZWwgYW5kIHJlbGF0ZWQgc2Vzc2lvbi1sYWJlbCBoZWxwZXJzLlxuICpcbiAqIERFUEVOREVOQ0lFUyAoYWxsIG9uIGdsb2JhbFRoaXMgYXQgcnVudGltZSk6XG4gKiAgIC0gY3JlYXRlU2Vzc2lvbiwgZmV0Y2hTdGF0dXMgKGFwaS1jbGllbnQuanMpXG4gKiAgIC0gZ2V0U2Vzc2lvbklkRnJvbVVSTCwgZ2V0T3duZXJUb2tlbiwgU3RvcmFnZUtleXMsIGdldFNjb3BlZFRhYkRhdGFTdG9yYWdlS2V5IChzdGF0ZS1tYW5hZ2VyLmpzKVxuICogICAtIGFwcGVuZE1lc3NhZ2UsIGFwcGVuZFJldHJ5TWVzc2FnZSAobWVzc2FnZS1xdWV1ZS5qcylcbiAqICAgLSBwYXJzZVN0YXR1c1Jlc3BvbnNlLCBwYXJzZVJld3JpdGVzUmVzcG9uc2UgKHZhbGlkYXRvcnMuanMpXG4gKiAgIC0gcmVmcmVzaEF0c1Njb3JlIChhdHMtcmVmaW5lbWVudC5qcylcbiAqICAgLSB1cGRhdGVJbmNsdXNpb25Db3VudHMgKHJldmlldy10YWJsZS1iYXNlLmpzLCBUaWVyIDQpXG4gKiAgIC0gc3dpdGNoVGFiIChyZXZpZXctdGFibGUtYmFzZS5qcywgVGllciA0KVxuICogICAtIHJlbmRlclJld3JpdGVQYW5lbCAocmV3cml0ZS1yZXZpZXcuanMsIFRpZXIgNilcbiAqICAgLSBzaG93T3duZXJzaGlwQ29uZmxpY3REaWFsb2csIG9wZW5TZXNzaW9uc01vZGFsIChzZXNzaW9uLXN3aXRjaGVyLXVpLmpzLCBUaWVyIDcpXG4gKiAgIC0gdXBkYXRlQWN0aW9uQnV0dG9ucyAodWktaGVscGVycy5qcylcbiAqICAgLSB1cGRhdGVQb3NpdGlvblRpdGxlIChzZXNzaW9uLWFjdGlvbnMuanMpXG4gKiAgIC0gZXNjYXBlSHRtbCwgU0VTU0lPTl9QSEFTRV9MQUJFTFNfU0hPUlQgKHV0aWxzLmpzKVxuICogICAtIHN0YXRlTWFuYWdlciAoc3RhdGUtbWFuYWdlci5qcyBcdTIwMTQgZ2V0QWxsVGFiRGF0YSgpL2dldEN1cnJlbnRUYWIoKS9zZXRUYWJEYXRhKCkvc2V0Q3VycmVudFRhYigpKVxuICogICAtIHNlc3Npb25JZCwgaXNSZWNvbm5lY3RpbmcsIGxhc3RLbm93blBoYXNlLCBpbnRlcmFjdGl2ZVN0YXRlLFxuICogICAgIHJld3JpdGVEZWNpc2lvbnMsIFBIQVNFUyAod2luZG93IGdsb2JhbHMpXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdzZXNzaW9uLW1hbmFnZXInKTtcblxuaW1wb3J0IHsgU0VTU0lPTl9QSEFTRV9MQUJFTFNfU0hPUlQsIFNFU1NJT05fUEhBU0VfTEFCRUxTIH0gZnJvbSAnLi91dGlscy5qcyc7XG5pbXBvcnQgeyBQSEFTRVMsIHN0YXRlTWFuYWdlciB9IGZyb20gJy4vc3RhdGUtbWFuYWdlci5qcyc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU2Vzc2lvbiBwaGFzZSBsYWJlbHMgKGFiYnJldmlhdGVkIGZvcm0gXHUyMDE0IGZvciBjb21wYWN0IHNlc3Npb24tc3dpdGNoZXIgVUkpXG4vLyBGdWxsLWxlbmd0aCBsYWJlbHMgbGl2ZSBpbiB1dGlscy5qcyBTRVNTSU9OX1BIQVNFX0xBQkVMUy5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiBmb3JtYXRTZXNzaW9uUGhhc2VMYWJlbChwaGFzZSkge1xuICBpZiAoIXBoYXNlKSByZXR1cm4gJ2luaXQnO1xuICByZXR1cm4gU0VTU0lPTl9QSEFTRV9MQUJFTFNfU0hPUlRbcGhhc2VdIHx8IFN0cmluZyhwaGFzZSkucmVwbGFjZSgvXy9nLCAnICcpO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEN1cnJlbnQgc2Vzc2lvbiBpZGVudGl0eSBoZWxwZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gX2dldEN1cnJlbnRTZXNzaW9uSWRWYWx1ZSgpIHtcbiAgaWYgKHR5cGVvZiBnZXRTZXNzaW9uSWRGcm9tVVJMID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGdldFNlc3Npb25JZEZyb21VUkwoKTtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpLmdldCgnc2Vzc2lvbicpO1xuICB9IGNhdGNoIChfKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2dldEN1cnJlbnRPd25lclRva2VuVmFsdWUoKSB7XG4gIGlmICh0eXBlb2YgZ2V0T3duZXJUb2tlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBnZXRPd25lclRva2VuKCk7XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnY3YtYnVpbGRlci1vd25lci10b2tlbicpO1xuICB9IGNhdGNoIChfKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gYnVpbGRTZXNzaW9uU3dpdGNoZXJMYWJlbChzdGF0dXMgPSB7fSkge1xuICBjb25zdCBwb3NpdGlvbk5hbWUgPSAoc3RhdHVzLnBvc2l0aW9uX25hbWUgfHwgJycpLnRvU3RyaW5nKCkudHJpbSgpO1xuICBjb25zdCBwaGFzZSA9IGZvcm1hdFNlc3Npb25QaGFzZUxhYmVsKHN0YXR1cy5waGFzZSk7XG4gIGlmIChwb3NpdGlvbk5hbWUpIHtcbiAgICByZXR1cm4gYCR7cG9zaXRpb25OYW1lfSBcdTAwQjcgJHtwaGFzZX1gO1xuICB9XG4gIHJldHVybiBfZ2V0Q3VycmVudFNlc3Npb25JZFZhbHVlKCkgPyBgU2Vzc2lvbiBcdTAwQjcgJHtwaGFzZX1gIDogJ1x1RDgzRFx1RENDMiBTZXNzaW9ucyc7XG59XG5cbmZ1bmN0aW9uIGdldEFjdGl2ZVNlc3Npb25Pd25lcnNoaXBNZXRhKHNlc3Npb24sIHtcbiAgY3VycmVudFNlc3Npb25JZCA9IF9nZXRDdXJyZW50U2Vzc2lvbklkVmFsdWUoKSxcbn0gPSB7fSkge1xuICBpZiAoIXNlc3Npb24gfHwgdHlwZW9mIHNlc3Npb24gIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHsgbGFiZWw6ICdVbmtub3duJywgY2xhc3NOYW1lOiAnc2Vzc2lvbi1zdGF0dXMtdW5jbGFpbWVkJywgaXNDdXJyZW50OiBmYWxzZSB9O1xuICB9XG5cbiAgY29uc3QgaXNDdXJyZW50U2Vzc2lvbiA9IEJvb2xlYW4oY3VycmVudFNlc3Npb25JZCkgJiYgc2Vzc2lvbi5zZXNzaW9uX2lkID09PSBjdXJyZW50U2Vzc2lvbklkO1xuICBjb25zdCBzYW1lT3duZXIgPSBCb29sZWFuKHNlc3Npb24ub3duZWRfYnlfcmVxdWVzdGVyKTtcblxuICBpZiAoaXNDdXJyZW50U2Vzc2lvbikge1xuICAgIHJldHVybiB7IGxhYmVsOiAnQ3VycmVudCB0YWInLCBjbGFzc05hbWU6ICdzZXNzaW9uLXN0YXR1cy1jdXJyZW50JywgaXNDdXJyZW50OiB0cnVlIH07XG4gIH1cbiAgaWYgKHNhbWVPd25lcikge1xuICAgIHJldHVybiB7IGxhYmVsOiAnT3duZWQgYnkgdGhpcyB0YWInLCBjbGFzc05hbWU6ICdzZXNzaW9uLXN0YXR1cy1jdXJyZW50JywgaXNDdXJyZW50OiBmYWxzZSB9O1xuICB9XG4gIGlmIChzZXNzaW9uLmNsYWltZWQpIHtcbiAgICByZXR1cm4geyBsYWJlbDogJ093bmVkIGJ5IGFub3RoZXIgdGFiJywgY2xhc3NOYW1lOiAnc2Vzc2lvbi1zdGF0dXMtb3duZWQnLCBpc0N1cnJlbnQ6IGZhbHNlIH07XG4gIH1cbiAgcmV0dXJuIHsgbGFiZWw6ICdVbmNsYWltZWQnLCBjbGFzc05hbWU6ICdzZXNzaW9uLXN0YXR1cy11bmNsYWltZWQnLCBpc0N1cnJlbnQ6IGZhbHNlIH07XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFNlc3Npb25UaW1lc3RhbXAodGltZXN0YW1wLCB7IGluY2x1ZGVUaW1lID0gdHJ1ZSB9ID0ge30pIHtcbiAgaWYgKCF0aW1lc3RhbXApIHJldHVybiAnXHUyMDE0JztcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IERhdGUodGltZXN0YW1wKS50b0xvY2FsZVN0cmluZygnZW4tVVMnLCB7XG4gICAgICBtb250aDogJ3Nob3J0JywgZGF5OiAnbnVtZXJpYycsIHllYXI6ICdudW1lcmljJyxcbiAgICAgIC4uLihpbmNsdWRlVGltZSA/IHsgaG91cjogJ251bWVyaWMnLCBtaW51dGU6ICcyLWRpZ2l0JyB9IDoge30pLFxuICAgIH0pO1xuICB9IGNhdGNoIChfKSB7XG4gICAgcmV0dXJuIFN0cmluZyh0aW1lc3RhbXApLnJlcGxhY2UoJ1QnLCAnICcpLnNsaWNlKDAsIGluY2x1ZGVUaW1lID8gMTYgOiAxMCk7XG4gIH1cbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBXZWxjb21lIC8gb25ib2FyZGluZyBtb2RhbCAoR0FQLTM2IC8gR0FQLTM3KVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IF9XRUxDT01FX0RJU01JU1NFRF9LRVkgPSAnY3YtYnVpbGRlci13ZWxjb21lLWRpc21pc3NlZCc7XG5cbi8qKlxuICogU3dpdGNoIHdoaWNoIGNvbnRlbnQgc2VjdGlvbiBpcyB2aXNpYmxlIGluc2lkZSB0aGUgd2VsY29tZSBtb2RhbC5cbiAqIEBwYXJhbSB7J3ByZXNlbnQnfCdtaXNzaW5nJ30gc2VjdGlvblxuICovXG5mdW5jdGlvbiBfc2V0V2VsY29tZVNlY3Rpb24oc2VjdGlvbikge1xuICBjb25zdCBzUHJlc2VudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd3ZWxjb21lLXNlY3Rpb24tcHJlc2VudCcpO1xuICBjb25zdCBzRW1wdHkgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd3ZWxjb21lLXNlY3Rpb24tZW1wdHknKTtcbiAgY29uc3Qgc01pc3NpbmcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnd2VsY29tZS1zZWN0aW9uLW1pc3NpbmcnKTtcbiAgY29uc3QgZlByZXNlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnd2VsY29tZS1mb290ZXItcHJlc2VudCcpO1xuICBjb25zdCBmTWlzc2luZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd3ZWxjb21lLWZvb3Rlci1taXNzaW5nJyk7XG4gIGlmIChzUHJlc2VudCkgc1ByZXNlbnQuc3R5bGUuZGlzcGxheSA9IHNlY3Rpb24gPT09ICdwcmVzZW50JyA/ICcnIDogJ25vbmUnO1xuICBpZiAoc0VtcHR5KSAgIHNFbXB0eS5zdHlsZS5kaXNwbGF5ICAgPSBzZWN0aW9uID09PSAnZW1wdHknICAgPyAnJyA6ICdub25lJztcbiAgaWYgKHNNaXNzaW5nKSBzTWlzc2luZy5zdHlsZS5kaXNwbGF5ID0gc2VjdGlvbiA9PT0gJ21pc3NpbmcnID8gJycgOiAnbm9uZSc7XG4gIC8vIEVtcHR5IHNrZWxldG9uOiBzaG93IFwicHJlc2VudFwiIGZvb3RlciAoQ2xvc2UvZGlzbWlzcykgbm90IFwibWlzc2luZ1wiIGZvb3RlciAoQ3JlYXRlL1JlbG9hZClcbiAgaWYgKGZQcmVzZW50KSBmUHJlc2VudC5zdHlsZS5kaXNwbGF5ID0gKHNlY3Rpb24gPT09ICdwcmVzZW50JyB8fCBzZWN0aW9uID09PSAnZW1wdHknKSA/ICdmbGV4JyA6ICdub25lJztcbiAgaWYgKGZNaXNzaW5nKSBmTWlzc2luZy5zdHlsZS5kaXNwbGF5ID0gc2VjdGlvbiA9PT0gJ21pc3NpbmcnID8gJ2ZsZXgnIDogJ25vbmUnO1xuICAvLyBGb3IgZW1wdHkgc3RhdGU6IGNoYW5nZSBDVEEgdG8gbmF2aWdhdGUgdG8gTWFzdGVyIENWIGluc3RlYWQgb2YganVzdCBjbG9zaW5nXG4gIGNvbnN0IGdldFN0YXJ0ZWRCdG4gPSBmUHJlc2VudCA/IGZQcmVzZW50LnF1ZXJ5U2VsZWN0b3IoJ2J1dHRvbi5wcmltYXJ5JykgOiBudWxsO1xuICBpZiAoZ2V0U3RhcnRlZEJ0bikge1xuICAgIGlmIChzZWN0aW9uID09PSAnZW1wdHknKSB7XG4gICAgICBnZXRTdGFydGVkQnRuLnRleHRDb250ZW50ID0gJ09wZW4gTWFzdGVyIENWJztcbiAgICAgIGdldFN0YXJ0ZWRCdG4ub25jbGljayA9ICgpID0+IHsgY2xvc2VXZWxjb21lTW9kYWwoKTsgaWYgKHR5cGVvZiBvcGVuTWFzdGVyQ3ZNb2RhbCA9PT0gJ2Z1bmN0aW9uJykgb3Blbk1hc3RlckN2TW9kYWwoKTsgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2V0U3RhcnRlZEJ0bi50ZXh0Q29udGVudCA9ICdHZXQgU3RhcnRlZCc7XG4gICAgICBnZXRTdGFydGVkQnRuLm9uY2xpY2sgPSAoKSA9PiB7XG4gICAgICAgIGNsb3NlV2VsY29tZU1vZGFsKCk7XG4gICAgICAgIGlmICh0eXBlb2Ygc3dpdGNoVGFiID09PSAnZnVuY3Rpb24nKSBzd2l0Y2hUYWIoJ2pvYicpO1xuICAgICAgfTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBTaG93IHRoZSBvbmJvYXJkaW5nIG1vZGFsIGluIHRoZSBcIm1pc3NpbmcgbWFzdGVyIENWXCIgc3RhdGUuXG4gKiBDYWxsZWQgZnJvbSBjcmVhdGVOZXdTZXNzaW9uQW5kTmF2aWdhdGUoKSB3aGVuIHRoZSBiYWNrZW5kIHJldHVybnMgbWFzdGVyX2N2X21pc3NpbmcuXG4gKiBAcGFyYW0ge3N0cmluZ30gbWFzdGVyQ3ZQYXRoIC0gU2VydmVyLXJlcG9ydGVkIGV4cGVjdGVkIGZpbGUgcGF0aC5cbiAqL1xuZnVuY3Rpb24gc2hvd09uYm9hcmRpbmdNb2RhbChtYXN0ZXJDdlBhdGgpIHtcbiAgY29uc3Qgb3ZlcmxheSAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb25ib2FyZGluZy1tb2RhbC1vdmVybGF5Jyk7XG4gIGNvbnN0IHBhdGhFbCAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ29uYm9hcmRpbmctbWFzdGVyLWN2LXBhdGgnKTtcbiAgY29uc3Qgc3RhdHVzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb25ib2FyZGluZy1tb2RhbC1zdGF0dXMnKTtcbiAgaWYgKHBhdGhFbCkgICBwYXRoRWwudGV4dENvbnRlbnQgICA9IG1hc3RlckN2UGF0aCB8fCAnKHVua25vd24pJztcbiAgaWYgKHN0YXR1c0VsKSBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICcnO1xuICBfc2V0V2VsY29tZVNlY3Rpb24oJ21pc3NpbmcnKTtcbiAgaWYgKG92ZXJsYXkpIHtcbiAgICBvdmVybGF5LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgX29wZW5PbmJvYXJkaW5nRm9jdXNUcmFwKG92ZXJsYXkpO1xuICB9XG59XG5cbi8qKlxuICogU2hvdyB0aGUgd2VsY29tZSBtb2RhbCB1bmxlc3MgdGhlIHVzZXIgaGFzIGRpc21pc3NlZCBpdC5cbiAqIENhbGxzIC9hcGkvc2V0dXAvbWFzdGVyLWN2LXN0YXR1cyB0byBjaG9vc2Ugd2hpY2ggc2VjdGlvbiB0byBkaXNwbGF5LlxuICogU2FmZSB0byBjYWxsIG9uIGV2ZXJ5IHN0YXJ0dXAgXHUyMDE0IG5vLW9wcyBpbW1lZGlhdGVseSBpZiBkaXNtaXNzZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG1heWJlU2hvd1dlbGNvbWVNb2RhbCgpIHtcbiAgdHJ5IHtcbiAgICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0oX1dFTENPTUVfRElTTUlTU0VEX0tFWSkpIHJldHVybjtcbiAgfSBjYXRjaCAoXykge31cbiAgbGV0IHNlY3Rpb24gPSAncHJlc2VudCc7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvc2V0dXAvbWFzdGVyLWN2LXN0YXR1cycpO1xuICAgIGlmIChyZXMub2spIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpLmNhdGNoKCgpID0+ICh7fSkpO1xuICAgICAgaWYgKCFkYXRhLmV4aXN0cykge1xuICAgICAgICBjb25zdCBwYXRoRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb25ib2FyZGluZy1tYXN0ZXItY3YtcGF0aCcpO1xuICAgICAgICBpZiAocGF0aEVsKSBwYXRoRWwudGV4dENvbnRlbnQgPSBkYXRhLnBhdGggfHwgJyh1bmtub3duKSc7XG4gICAgICAgIHNlY3Rpb24gPSAnbWlzc2luZyc7XG4gICAgICB9IGVsc2UgaWYgKGRhdGEuaXNfZW1wdHkpIHtcbiAgICAgICAgc2VjdGlvbiA9ICdlbXB0eSc7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChfKSB7fVxuICBjb25zdCBzdGF0dXNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvbmJvYXJkaW5nLW1vZGFsLXN0YXR1cycpO1xuICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJyc7XG4gIF9zZXRXZWxjb21lU2VjdGlvbihzZWN0aW9uKTtcbiAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvbmJvYXJkaW5nLW1vZGFsLW92ZXJsYXknKTtcbiAgaWYgKG92ZXJsYXkpIHtcbiAgICBvdmVybGF5LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgX29wZW5PbmJvYXJkaW5nRm9jdXNUcmFwKG92ZXJsYXkpO1xuICB9XG59XG5cbi8qKiBXaXJlIGZvY3VzIHRyYXAgYW5kIEVzY2FwZSBoYW5kbGVyIGZvciB0aGUgb25ib2FyZGluZyBvdmVybGF5IChXQ0FHIDIuMS4yKS4gKi9cbmZ1bmN0aW9uIF9vcGVuT25ib2FyZGluZ0ZvY3VzVHJhcChvdmVybGF5KSB7XG4gIGlmICh0eXBlb2YgZ2xvYmFsVGhpcy5zZXRJbml0aWFsRm9jdXMgPT09ICdmdW5jdGlvbicpIGdsb2JhbFRoaXMuc2V0SW5pdGlhbEZvY3VzKCdvbmJvYXJkaW5nLW1vZGFsLW92ZXJsYXknKTtcbiAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzLnRyYXBGb2N1cyA9PT0gJ2Z1bmN0aW9uJykgICAgICAgZ2xvYmFsVGhpcy50cmFwRm9jdXMoJ29uYm9hcmRpbmctbW9kYWwtb3ZlcmxheScpO1xuICBpZiAoIW92ZXJsYXkuX29uYm9hcmRpbmdFc2NIYW5kbGVyKSB7XG4gICAgb3ZlcmxheS5fb25ib2FyZGluZ0VzY0hhbmRsZXIgPSAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgY2xvc2VXZWxjb21lTW9kYWwoKTtcbiAgICB9O1xuICAgIG92ZXJsYXkuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIG92ZXJsYXkuX29uYm9hcmRpbmdFc2NIYW5kbGVyKTtcbiAgfVxufVxuXG4vKipcbiAqIFNob3cgdGhlIHdlbGNvbWUgbW9kYWwgdW5jb25kaXRpb25hbGx5IChpZ25vcmVzIHRoZSBcImRvbid0IHNob3cgYWdhaW5cIiBmbGFnKS5cbiAqIFVzZWQgYnkgdGhlIEhlbHAgYnV0dG9uIHNvIHVzZXJzIGNhbiBhbHdheXMgcmVvcGVuIG9uYm9hcmRpbmcgbWlkLXNlc3Npb24uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNob3dXZWxjb21lTW9kYWwoKSB7XG4gIGxldCBzZWN0aW9uID0gJ3ByZXNlbnQnO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3NldHVwL21hc3Rlci1jdi1zdGF0dXMnKTtcbiAgICBpZiAocmVzLm9rKSB7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKTtcbiAgICAgIGlmICghZGF0YS5leGlzdHMpIHtcbiAgICAgICAgY29uc3QgcGF0aEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ29uYm9hcmRpbmctbWFzdGVyLWN2LXBhdGgnKTtcbiAgICAgICAgaWYgKHBhdGhFbCkgcGF0aEVsLnRleHRDb250ZW50ID0gZGF0YS5wYXRoIHx8ICcodW5rbm93biknO1xuICAgICAgICBzZWN0aW9uID0gJ21pc3NpbmcnO1xuICAgICAgfSBlbHNlIGlmIChkYXRhLmlzX2VtcHR5KSB7XG4gICAgICAgIHNlY3Rpb24gPSAnZW1wdHknO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoXykge31cbiAgY29uc3Qgc3RhdHVzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb25ib2FyZGluZy1tb2RhbC1zdGF0dXMnKTtcbiAgaWYgKHN0YXR1c0VsKSBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICcnO1xuICBfc2V0V2VsY29tZVNlY3Rpb24oc2VjdGlvbik7XG4gIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb25ib2FyZGluZy1tb2RhbC1vdmVybGF5Jyk7XG4gIGlmIChvdmVybGF5KSB7XG4gICAgb3ZlcmxheS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICAgIF9vcGVuT25ib2FyZGluZ0ZvY3VzVHJhcChvdmVybGF5KTtcbiAgfVxufVxuXG4vKipcbiAqIENsb3NlIHRoZSB3ZWxjb21lIG1vZGFsLlxuICogSWYgXCJEb24ndCBzaG93IGFnYWluXCIgaXMgY2hlY2tlZCwgcGVyc2lzdHMgdGhlIGRpc21pc3NhbCBpbiBsb2NhbFN0b3JhZ2UuXG4gKi9cbmZ1bmN0aW9uIGNsb3NlV2VsY29tZU1vZGFsKCkge1xuICBjb25zdCBvdmVybGF5ICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvbmJvYXJkaW5nLW1vZGFsLW92ZXJsYXknKTtcbiAgY29uc3QgY2hlY2tib3ggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnd2VsY29tZS1kb250LXNob3ctYWdhaW4nKTtcbiAgaWYgKG92ZXJsYXkpIHtcbiAgICBvdmVybGF5LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgaWYgKG92ZXJsYXkuX29uYm9hcmRpbmdFc2NIYW5kbGVyKSB7XG4gICAgICBvdmVybGF5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBvdmVybGF5Ll9vbmJvYXJkaW5nRXNjSGFuZGxlcik7XG4gICAgICBkZWxldGUgb3ZlcmxheS5fb25ib2FyZGluZ0VzY0hhbmRsZXI7XG4gICAgfVxuICB9XG4gIGlmIChjaGVja2JveCAmJiBjaGVja2JveC5jaGVja2VkKSB7XG4gICAgdHJ5IHsgbG9jYWxTdG9yYWdlLnNldEl0ZW0oX1dFTENPTUVfRElTTUlTU0VEX0tFWSwgJzEnKTsgfSBjYXRjaCAoXykge31cbiAgfVxuICBpZiAodHlwZW9mIGdsb2JhbFRoaXMucmVzdG9yZUZvY3VzID09PSAnZnVuY3Rpb24nKSBnbG9iYWxUaGlzLnJlc3RvcmVGb2N1cygpO1xufVxuXG4vKipcbiAqIENhbGxlZCBieSB0aGUgb25ib2FyZGluZyBtb2RhbCBcIkNyZWF0ZSBlbXB0eSBwcm9maWxlXCIgYnV0dG9uLlxuICogUE9TVHMgdG8gL2FwaS9zZXR1cC9jcmVhdGUtbWFzdGVyLWN2LCB0aGVuIG5hdmlnYXRlcyB0byBhIG5ldyBzZXNzaW9uLlxuICovXG5hc3luYyBmdW5jdGlvbiBvbmJvYXJkaW5nQ3JlYXRlRW1wdHlQcm9maWxlKCkge1xuICBjb25zdCBidG4gICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvbmJvYXJkaW5nLWNyZWF0ZS1idG4nKTtcbiAgY29uc3Qgc3RhdHVzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb25ib2FyZGluZy1tb2RhbC1zdGF0dXMnKTtcbiAgaWYgKGJ0bikgYnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgaWYgKHN0YXR1c0VsKSBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICdDcmVhdGluZyBwcm9maWxlXHUyMDI2JztcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvc2V0dXAvY3JlYXRlLW1hc3Rlci1jdicsIHsgbWV0aG9kOiAnUE9TVCcgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSk7XG4gICAgaWYgKCFyZXMub2spIHtcbiAgICAgIGNvbnN0IG1zZyA9IGRhdGEuZXJyb3IgPT09ICdhbHJlYWR5X2V4aXN0cydcbiAgICAgICAgPyAnRmlsZSBhbHJlYWR5IGV4aXN0cyBcdTIwMTQgcGxlYXNlIHJlbG9hZCB0aGUgcGFnZS4nXG4gICAgICAgIDogKGRhdGEuZXJyb3IgfHwgYFNlcnZlciBlcnJvciAke3Jlcy5zdGF0dXN9YCk7XG4gICAgICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gbXNnO1xuICAgICAgaWYgKGJ0bikgYnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEZpbGUgY3JlYXRlZCBcdTIwMTQgbm93IG5hdmlnYXRlIHRvIGEgbmV3IHNlc3Npb25cbiAgICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJ1Byb2ZpbGUgY3JlYXRlZCEgU3RhcnRpbmcgc2Vzc2lvblx1MjAyNic7XG4gICAgYXdhaXQgY3JlYXRlTmV3U2Vzc2lvbkFuZE5hdmlnYXRlKCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSBgRXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YDtcbiAgICBpZiAoYnRuKSBidG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNlc3Npb24gY3JlYXRpb25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVOZXdTZXNzaW9uQW5kTmF2aWdhdGUoKSB7XG4gIGNvbnN0IGRhdGEgPSBhd2FpdCBjcmVhdGVTZXNzaW9uKCk7XG4gIGlmIChkYXRhLmVycm9yID09PSAnbWFzdGVyX2N2X21pc3NpbmcnKSB7XG4gICAgc2hvd09uYm9hcmRpbmdNb2RhbChkYXRhLm1hc3Rlcl9jdl9wYXRoIHx8ICcnKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCFkYXRhLnNlc3Npb25faWQpIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGNyZWF0ZSBzZXNzaW9uJyk7XG4gIC8vIENsZWFyIGFueSBzdGFsZSBzZXNzaW9uIHBhdGggXHUyMDE0IHRoZSBuZXcgc2Vzc2lvbiBoYXMgbm8gc2F2ZWQgZmlsZSB5ZXQuXG4gIC8vIElmIFNFU1NJT05fUEFUSCB3ZXJlIGxlZnQgcG9pbnRpbmcgYXQgYSBwcmV2aW91cyBzZXNzaW9uJ3MgZmlsZSwgdGhlXG4gIC8vIGRpc2stcmVzdG9yZSBndWFyZCBpbiByZXN0b3JlQmFja2VuZFN0YXRlIGNvdWxkIGxvYWQgdGhlIHdyb25nIHNlc3Npb25cbiAgLy8gb24gdGhlIG5leHQgdmlzaXQgb25jZSBTRVNTSU9OX0lEIGlzIHVwZGF0ZWQgYnkgdGhlIGJlZm9yZXVubG9hZCBoYW5kbGVyLlxuICB0cnkgeyBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnY3YtYnVpbGRlci1zZXNzaW9uLXBhdGgnKTsgfSBjYXRjaCAoXykge31cbiAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihkYXRhLnJlZGlyZWN0X3VybCB8fCBgLz9zZXNzaW9uPSR7ZGF0YS5zZXNzaW9uX2lkfWApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVOZXdTZXNzaW9uSW5OZXdUYWIoKSB7XG4gIGNvbnN0IGRhdGEgPSBhd2FpdCBjcmVhdGVTZXNzaW9uKCk7XG4gIGlmIChkYXRhLmVycm9yID09PSAnbWFzdGVyX2N2X21pc3NpbmcnKSB7XG4gICAgc2hvd09uYm9hcmRpbmdNb2RhbChkYXRhLm1hc3Rlcl9jdl9wYXRoIHx8ICcnKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCFkYXRhLnNlc3Npb25faWQpIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGNyZWF0ZSBzZXNzaW9uJyk7XG4gIHdpbmRvdy5vcGVuKGRhdGEucmVkaXJlY3RfdXJsIHx8IGAvP3Nlc3Npb249JHtkYXRhLnNlc3Npb25faWR9YCwgJ19ibGFuaycsICdub29wZW5lcicpO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNlc3Npb24gY2xhaW0gLyBvd25lcnNoaXBcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5hc3luYyBmdW5jdGlvbiBfY2xhaW1DdXJyZW50U2Vzc2lvbihzZXNzaW9uSWRUb0NsYWltKSB7XG4gIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3Nlc3Npb25zL2NsYWltJywge1xuICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIHNlc3Npb25faWQ6IHNlc3Npb25JZFRvQ2xhaW0sXG4gICAgICBvd25lcl90b2tlbjogZ2V0T3duZXJUb2tlbigpLFxuICAgIH0pLFxuICB9KTtcblxuICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKTtcbiAgaWYgKHJlcy5vayAmJiBkYXRhLm9rICE9PSBmYWxzZSkgcmV0dXJuIHRydWU7XG5cbiAgaWYgKHJlcy5zdGF0dXMgPT09IDQwOSAmJiBkYXRhLmVycm9yID09PSAnc2Vzc2lvbl9vd25lZCcpIHtcbiAgICBjb25zdCBhY3Rpb24gPSBhd2FpdCBzaG93T3duZXJzaGlwQ29uZmxpY3REaWFsb2coXG4gICAgICAnVGhpcyBzZXNzaW9uIGlzIGN1cnJlbnRseSBjbGFpbWVkIGJ5IGFub3RoZXIgYnJvd3NlciB0YWIuIFlvdSBjYW4gdGFrZSBpdCBvdmVyLCBzdGFydCBhIG5ldyBzZXNzaW9uLCBvciBsb2FkIGEgZGlmZmVyZW50IG9uZS4nXG4gICAgKTtcbiAgICBpZiAoYWN0aW9uID09PSAnbmV3Jykge1xuICAgICAgYXdhaXQgY3JlYXRlTmV3U2Vzc2lvbkFuZE5hdmlnYXRlKCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChhY3Rpb24gIT09ICd0YWtlb3ZlcicpIHtcbiAgICAgIHNob3dTZXNzaW9uc0xhbmRpbmdQYW5lbCgnU2VsZWN0IGEgZGlmZmVyZW50IHNlc3Npb24gb3IgY3JlYXRlIGEgbmV3IG9uZS4nKTtcbiAgICAgIG9wZW5TZXNzaW9uc01vZGFsKHsgcmVxdWlyZWQ6IHRydWUgfSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgdGFrZW92ZXJSZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9zZXNzaW9ucy90YWtlb3ZlcicsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIHNlc3Npb25faWQ6IHNlc3Npb25JZFRvQ2xhaW0sXG4gICAgICAgIG93bmVyX3Rva2VuOiBnZXRPd25lclRva2VuKCksXG4gICAgICB9KSxcbiAgICB9KTtcbiAgICBjb25zdCB0YWtlb3ZlckRhdGEgPSBhd2FpdCB0YWtlb3ZlclJlcy5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSk7XG4gICAgaWYgKCF0YWtlb3ZlclJlcy5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHRha2VvdmVyRGF0YS5lcnJvciB8fCAnRmFpbGVkIHRvIHRha2Ugb3ZlciBzZXNzaW9uJyk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHJlcy5zdGF0dXMgPT09IDQwNCB8fCBkYXRhLmVycm9yID09PSAnc2Vzc2lvbl9ub3RfZm91bmQnKSB7XG4gICAgc2hvd1Nlc3Npb25zTGFuZGluZ1BhbmVsKCdUaGF0IHNlc3Npb24gaXMgbm8gbG9uZ2VyIGFjdGl2ZS4gTG9hZCBpdCBmcm9tIGRpc2sgb3IgY3JlYXRlIGEgbmV3IG9uZS4nKTtcbiAgICBvcGVuU2Vzc2lvbnNNb2RhbCh7IHJlcXVpcmVkOiB0cnVlIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihkYXRhLmVycm9yIHx8IGBGYWlsZWQgdG8gY2xhaW0gc2Vzc2lvbiAoJHtyZXMuc3RhdHVzfSlgKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTZXNzaW9uIG5hdmlnYXRpb24gZnJvbSBsYW5kaW5nIHBhZ2Vcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiBzaG93U2Vzc2lvbnNMYW5kaW5nUGFuZWwobWVzc2FnZSA9ICcnKSB7XG4gIHN0YXRlTWFuYWdlci5zZXRDdXJyZW50VGFiKCdqb2InKTtcbiAgc3RhdGVNYW5hZ2VyLnNldFBoYXNlKFBIQVNFUy5JTklUKTtcbiAgdXBkYXRlQWN0aW9uQnV0dG9ucygnam9iJyk7XG4gIHVwZGF0ZVBvc2l0aW9uVGl0bGUoe30pO1xuXG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9jdW1lbnQtY29udGVudCcpO1xuICBpZiAoIWNvbnRlbnQpIHJldHVybjtcblxuICBjb250ZW50LmlubmVySFRNTCA9IGBcbiAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1sYW5kaW5nLXNoZWxsXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1sYW5kaW5nLWhlYWRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1sYW5kaW5nLWNvcHlcIj5cbiAgICAgICAgICA8aDI+U2VsZWN0IGEgU2Vzc2lvbjwvaDI+XG4gICAgICAgICAgPHA+RWFjaCBicm93c2VyIHRhYiBub3cgd29ya3MgYWdhaW5zdCBpdHMgb3duIFVSTC1zY29wZWQgc2Vzc2lvbi48L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1sYW5kaW5nLWFjdGlvbnNcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0blwiIG9uY2xpY2s9XCJjcmVhdGVOZXdTZXNzaW9uSW5OZXdUYWIoKVwiPlx1RkYwQiBOZXcgU2Vzc2lvbiBpbiBOZXcgVGFiPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICAke21lc3NhZ2UgPyBgPHAgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjIwcHg7Y29sb3I6I2I0NTMwOTtmb250LXdlaWdodDo2MDA7XCI+JHtlc2NhcGVIdG1sKG1lc3NhZ2UpfTwvcD5gIDogJyd9XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDoxMnB4O21hcmdpbi1ib3R0b206MjRweDtmbGV4LXdyYXA6d3JhcDtcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG4gcHJpbWFyeVwiIG9uY2xpY2s9XCJjcmVhdGVOZXdTZXNzaW9uQW5kTmF2aWdhdGUoKVwiPisgTmV3IFNlc3Npb248L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgO1xufVxuXG5mdW5jdGlvbiBfcmVzdG9yZVRhYkZvclBoYXNlKHNlc3Npb25QaGFzZSkge1xuICBjb25zdCBwaGFzZVRhYk1hcCA9IHtcbiAgICBbUEhBU0VTLklOSVRdOiAgICAgICAgICAgICAnam9iJyxcbiAgICBbUEhBU0VTLkpPQl9BTkFMWVNJU106ICAgICAnYW5hbHlzaXMnLFxuICAgIFtQSEFTRVMuQ1VTVE9NSVpBVElPTl06ICAgICdleHAtcmV2aWV3JyxcbiAgICBbUEhBU0VTLlJFV1JJVEVfUkVWSUVXXTogICAncmV3cml0ZScsXG4gICAgW1BIQVNFUy5TUEVMTF9DSEVDS106ICAgICAgJ3NwZWxsJyxcbiAgICBbUEhBU0VTLkdFTkVSQVRJT05dOiAgICAgICAnbGF5b3V0JyxcbiAgICBbUEhBU0VTLkxBWU9VVF9SRVZJRVddOiAgICAnbGF5b3V0JyxcbiAgICBbUEhBU0VTLkZJTkFMX0dFTkVSQVRJT05dOiAnZmluYWxfZ2VuZXJhdGUnLFxuICAgIFtQSEFTRVMuUkVGSU5FTUVOVF06ICAgICAgICdkb3dubG9hZCcsXG4gIH07XG4gIGNvbnN0IHRhcmdldFRhYiA9IHBoYXNlVGFiTWFwW3Nlc3Npb25QaGFzZV0gfHwgJ2pvYic7XG5cbiAgaWYgKHR5cGVvZiBzd2l0Y2hUYWIgPT09ICdmdW5jdGlvbicpIHtcbiAgICBzd2l0Y2hUYWIodGFyZ2V0VGFiKTtcbiAgfSBlbHNlIHtcbiAgICBzdGF0ZU1hbmFnZXIuc2V0Q3VycmVudFRhYih0YXJnZXRUYWIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9yZXNvbHZlUmVzdG9yZWRQaGFzZShzdGF0dXNEYXRhKSB7XG4gIGNvbnN0IHBoYXNlID0gc3RhdHVzRGF0YT8ucGhhc2UgfHwgUEhBU0VTLklOSVQ7XG5cbiAgLy8gR3VhcmQ6IG5vIGpvYl9hbmFseXNpcyBtZWFucyB3ZSBjYW5ub3QgYmUgcGFzdCB0aGUgaW5pdGlhbCBpbnB1dCBzdGVwLlxuICBpZiAoIXN0YXR1c0RhdGE/LmpvYl9hbmFseXNpcykge1xuICAgIHJldHVybiBQSEFTRVMuSU5JVDtcbiAgfVxuXG4gIC8vIEd1YXJkOiBwaGFzZSBjbGFpbXMgY3VzdG9taXphdGlvbnMgd2VyZSByZXZpZXdlZCwgYnV0IHRoZXkgd2VyZSBuZXZlclxuICAvLyBnZW5lcmF0ZWQgKGUuZy4gYmFja2VuZCByZXN0YXJ0ZWQgYWZ0ZXIgYW5hbHl6ZV9qb2IgYnV0IGJlZm9yZVxuICAvLyByZWNvbW1lbmRfY3VzdG9taXphdGlvbnMgcmFuLCBvciBsZWdhY3kgc2Vzc2lvbnMgc2F2ZWQgd2l0aCB0aGUgb2xkXG4gIC8vIHByZW1hdHVyZS1DVVNUT01JWkFUSU9OIGJ1ZykuIEZhbGwgYmFjayBzbyB0aGUgdXNlciBzZWVzIHRoZSBBbmFseXNpc1xuICAvLyBzdGVwIGFuZCBjYW4gcnVuIFJlY29tbWVuZCBDdXN0b21pemF0aW9ucyBmcm9tIHRoZXJlLlxuICBpZiAoXG4gICAgKHBoYXNlID09PSBQSEFTRVMuQ1VTVE9NSVpBVElPTiB8fCBwaGFzZSA9PT0gUEhBU0VTLlJFV1JJVEVfUkVWSUVXKVxuICAgICYmICFzdGF0dXNEYXRhPy5jdXN0b21pemF0aW9uc1xuICApIHtcbiAgICByZXR1cm4gUEhBU0VTLkpPQl9BTkFMWVNJUztcbiAgfVxuXG4gIHJldHVybiBwaGFzZTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTZXNzaW9uIGNvbnRleHQgLyByZXN0b3JlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuYXN5bmMgZnVuY3Rpb24gZW5zdXJlU2Vzc2lvbkNvbnRleHQoKSB7XG4gIGNvbnN0IHVybFNlc3Npb25JZCA9IGdldFNlc3Npb25JZEZyb21VUkwoKTtcbiAgaWYgKCF1cmxTZXNzaW9uSWQpIHtcbiAgICBzaG93U2Vzc2lvbnNMYW5kaW5nUGFuZWwoKTtcbiAgICBvcGVuU2Vzc2lvbnNNb2RhbCh7IHJlcXVpcmVkOiB0cnVlIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHN0YXRlTWFuYWdlci5zZXRTZXNzaW9uSWQodXJsU2Vzc2lvbklkKTtcbiAgcmV0dXJuIF9jbGFpbUN1cnJlbnRTZXNzaW9uKHVybFNlc3Npb25JZCk7XG59XG5cbmZ1bmN0aW9uIF9hcHBlbmRSZXN0b3JlZERlY2lzaW9uc1N1bW1hcnkoKSB7XG4gIGNvbnN0IHBoYXNlID0gc3RhdGVNYW5hZ2VyLmdldFBoYXNlKCk7XG4gIGNvbnN0IGN1c3RvbWl6YXRpb25zID0gc3RhdGVNYW5hZ2VyLmdldFRhYkRhdGEoJ2N1c3RvbWl6YXRpb25zJykgfHwgd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnM7XG4gIGNvbnN0IHBhcnRzID0gW107XG5cbiAgaWYgKGN1c3RvbWl6YXRpb25zKSB7XG4gICAgY29uc3QgZXhwQ291bnQgPSAoY3VzdG9taXphdGlvbnMucmVjb21tZW5kZWRfZXhwZXJpZW5jZXMgfHwgW10pLmxlbmd0aDtcbiAgICBpZiAoZXhwQ291bnQgPiAwKSBwYXJ0cy5wdXNoKGAke2V4cENvdW50fSBleHBlcmllbmNlJHtleHBDb3VudCAhPT0gMSA/ICdzJyA6ICcnfSByZWNvbW1lbmRlZGApO1xuICAgIGNvbnN0IHNraWxsQ291bnQgPSAoY3VzdG9taXphdGlvbnMucmVjb21tZW5kZWRfc2tpbGxzIHx8IFtdKS5sZW5ndGg7XG4gICAgaWYgKHNraWxsQ291bnQgPiAwKSBwYXJ0cy5wdXNoKGAke3NraWxsQ291bnR9IHNraWxsJHtza2lsbENvdW50ICE9PSAxID8gJ3MnIDogJyd9IHJlY29tbWVuZGVkYCk7XG4gIH1cblxuICBjb25zdCBkZWNpc2lvbnMgPSB3aW5kb3cuX3NhdmVkRGVjaXNpb25zIHx8IHt9O1xuICBjb25zdCBhcHByb3ZlZFJld3JpdGVzID0gQXJyYXkuaXNBcnJheSh3aW5kb3cuYXBwcm92ZWRSZXdyaXRlcykgPyB3aW5kb3cuYXBwcm92ZWRSZXdyaXRlcy5sZW5ndGhcbiAgICA6IE9iamVjdC5rZXlzKGRlY2lzaW9ucy5leHBlcmllbmNlX2RlY2lzaW9ucyB8fCB7fSkubGVuZ3RoO1xuICBpZiAoYXBwcm92ZWRSZXdyaXRlcyA+IDApIHBhcnRzLnB1c2goYCR7YXBwcm92ZWRSZXdyaXRlc30gcmV3cml0ZSR7YXBwcm92ZWRSZXdyaXRlcyAhPT0gMSA/ICdzJyA6ICcnfSBhcHByb3ZlZGApO1xuXG4gIGNvbnN0IGF0cyA9IHN0YXRlTWFuYWdlci5nZXRBdHNTY29yZSgpO1xuICBpZiAoYXRzICYmIHR5cGVvZiBhdHMub3ZlcmFsbCA9PT0gJ251bWJlcicpIHtcbiAgICBwYXJ0cy5wdXNoKGBBVFMgc2NvcmUgJHtNYXRoLnJvdW5kKGF0cy5vdmVyYWxsKX0lYCk7XG4gIH1cblxuICBpZiAocGFydHMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IHBoYXNlTGFiZWwgPSBTRVNTSU9OX1BIQVNFX0xBQkVMU19TSE9SVFtwaGFzZV0gfHwgU3RyaW5nKHBoYXNlKS5yZXBsYWNlKC9fL2csICcgJyk7XG4gICAgY29uc3QgcG9zaXRpb25DdHggPSB3aW5kb3cuX3Jlc3RvcmVkUG9zaXRpb25OYW1lID8gYCBmb3IgJHt3aW5kb3cuX3Jlc3RvcmVkUG9zaXRpb25OYW1lfWAgOiAnJztcbiAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCBgXHVEODNEXHVEQ0NCIFJlc3RvcmVkJHtwb3NpdGlvbkN0eH0gYXQgc3RhZ2U6ICR7cGhhc2VMYWJlbH0gXHUyMDE0ICR7cGFydHMuam9pbignLCAnKX0uYCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVzdG9yZVNlc3Npb24oKSB7XG4gIHRyeSB7XG4gICAgc3RhdGVNYW5hZ2VyLnNldElzUmVjb25uZWN0aW5nKHRydWUpO1xuXG4gICAgY29uc3Qgc3RvcmVkU2Vzc2lvbklkID0gZ2V0U2Vzc2lvbklkRnJvbVVSTCgpIHx8IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFN0b3JhZ2VLZXlzLlNFU1NJT05fSUQpO1xuICAgIGlmICghc3RvcmVkU2Vzc2lvbklkKSB7XG4gICAgICBzdGF0ZU1hbmFnZXIuc2V0SXNSZWNvbm5lY3RpbmcoZmFsc2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzdGF0ZU1hbmFnZXIuc2V0U2Vzc2lvbklkKHN0b3JlZFNlc3Npb25JZCk7XG5cbiAgICAvLyBUcnkgdG8gcmVzdG9yZSBjb252ZXJzYXRpb24gaGlzdG9yeSBmcm9tIGJhY2tlbmRcbiAgICBjb25zdCBoaXN0b3J5UmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvaGlzdG9yeScpO1xuICAgIGlmIChoaXN0b3J5UmVzLm9rKSB7XG4gICAgICBjb25zdCBoaXN0b3J5RGF0YSA9IGF3YWl0IGhpc3RvcnlSZXMuanNvbigpO1xuXG4gICAgICAvLyBBbHdheXMgY2xlYXIgcGxhY2Vob2xkZXIgSFRNTCBjb250ZW50IG5vdyB0aGF0IHdlIGhhdmUgYSBsaXZlIHNlc3Npb24gcmVzcG9uc2UuXG4gICAgICBjb25zdCBjb252ZXJzYXRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udmVyc2F0aW9uJyk7XG4gICAgICBjb252ZXJzYXRpb24uaW5uZXJIVE1MID0gJyc7XG5cbiAgICAgIC8vIEFsd2F5cyByZXN0b3JlIGZyb20gdGhlIHNlcnZlciBzZXNzaW9uIGZpbGUgKGF1dGhvcml0YXRpdmUgaGlzdG9yeSBzb3VyY2UpLlxuICAgICAgaWYgKGhpc3RvcnlEYXRhLmhpc3RvcnkgJiYgaGlzdG9yeURhdGEuaGlzdG9yeS5sZW5ndGggPiAwKSB7XG5cbiAgICAgICAgaGlzdG9yeURhdGEuaGlzdG9yeS5mb3JFYWNoKG1zZyA9PiB7XG4gICAgICAgICAgaWYgKG1zZy5yb2xlID09PSAndXNlcicpIHtcbiAgICAgICAgICAgIGFwcGVuZE1lc3NhZ2UoJ3VzZXInLCBtc2cuY29udGVudCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChtc2cucm9sZSA9PT0gJ2Fzc2lzdGFudCcpIHtcbiAgICAgICAgICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIG1zZy5jb250ZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsICdcdUQ4M0RcdUREMDQgU2Vzc2lvbiByZXN0b3JlZCBmcm9tIHNlcnZlci4nKTtcbiAgICAgICAgbG9nLmluZm8oYFJlc3RvcmVkICR7aGlzdG9yeURhdGEuaGlzdG9yeS5sZW5ndGh9IG1lc3NhZ2VzIGZyb20gYmFja2VuZGApO1xuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgcGhhc2VcbiAgICAgIGlmIChoaXN0b3J5RGF0YS5waGFzZSkge1xuICAgICAgICBzdGF0ZU1hbmFnZXIuc2V0UGhhc2UoaGlzdG9yeURhdGEucGhhc2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRyeSB0byByZXN0b3JlIGJhY2tlbmQgc3RhdGUuXG4gICAgLy8gUmV0dXJucyB0cnVlIHdoZW4gc2VydmVyIGhhZCBsaXZlIHNlc3Npb24gZGF0YSAoaW4gbWVtb3J5IG9yIGxvYWRlZCBmcm9tIGRpc2spLlxuICAgIGNvbnN0IHNlcnZlckhhc0RhdGEgPSBhd2FpdCByZXN0b3JlQmFja2VuZFN0YXRlKCk7XG5cbiAgICAvLyBSZXN0b3JlIFVJLW9ubHkgcHJlZnMgKGFjdGl2ZVJldmlld1BhbmUpIGZyb20gbG9jYWxTdG9yYWdlLlxuICAgIHJlc3RvcmVUYWJEYXRhKHsgdWlQcmVmc09ubHk6IHNlcnZlckhhc0RhdGEgfSk7XG5cbiAgICAvLyBTaG93IGEgcmVzdG9yZWQtZGVjaXNpb25zIHN1bW1hcnkgd2hlbiB0aGUgYmFja2VuZCBoYWQgbGl2ZSBzZXNzaW9uIGRhdGEuXG4gICAgaWYgKHNlcnZlckhhc0RhdGEpIHtcbiAgICAgIF9hcHBlbmRSZXN0b3JlZERlY2lzaW9uc1N1bW1hcnkoKTtcbiAgICB9XG5cbiAgICBzdGF0ZU1hbmFnZXIuc2V0SXNSZWNvbm5lY3RpbmcoZmFsc2UpO1xuXG4gICAgLy8gUnVuIGEgYmFja2dyb3VuZCBoZWFsdGggY2hlY2sgc28gdGhlIHN0YXR1cyBwaWxsIHJlZmxlY3RzIGxpdmUgY29ubmVjdGl2aXR5LlxuICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcy50ZXN0Q3VycmVudE1vZGVsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBnbG9iYWxUaGlzLnRlc3RDdXJyZW50TW9kZWwoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgfVxuXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nLndhcm4oJ1Nlc3Npb24gcmVzdG9yYXRpb24gZmFpbGVkOicsIGVycm9yKTtcbiAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCBgXHUyNkEwXHVGRTBGIENvdWxkIG5vdCByZXN0b3JlIHByZXZpb3VzIHNlc3Npb24uIFN0YXJ0aW5nIGZyZXNoLiAoJHtlcnJvci5tZXNzYWdlfSlgKTtcbiAgICBzdGF0ZU1hbmFnZXIuc2V0SXNSZWNvbm5lY3RpbmcoZmFsc2UpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9oeWRyYXRlU3RhdHVzRGVyaXZlZFN0YXRlKHN0YXR1c0RhdGEpIHtcbiAgd2luZG93LmFjaGlldmVtZW50RWRpdHMgPSB7fTtcbiAgdHJ5IHtcbiAgICBpZiAoc3RhdHVzRGF0YS5hY2hpZXZlbWVudF9lZGl0cyAmJiBPYmplY3Qua2V5cyhzdGF0dXNEYXRhLmFjaGlldmVtZW50X2VkaXRzKS5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhzdGF0dXNEYXRhLmFjaGlldmVtZW50X2VkaXRzKSkge1xuICAgICAgICBjb25zdCBpZHggPSBwYXJzZUludChrLCAxMCk7XG4gICAgICAgIGNvbnN0IHJhd0l0ZW1zID0gQXJyYXkuaXNBcnJheSh2KSA/IHYgOiBbdl07XG4gICAgICAgIHdpbmRvdy5hY2hpZXZlbWVudEVkaXRzW2lkeF0gPSByYXdJdGVtcy5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgaWYgKGl0ZW0gJiYgdHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGl0ZW0pKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICB0ZXh0OiBTdHJpbmcoaXRlbS50ZXh0ID8/IGl0ZW0uZGVzY3JpcHRpb24gPz8gaXRlbS5jb250ZW50ID8/ICcnKSxcbiAgICAgICAgICAgICAgaGlkZGVuOiBCb29sZWFuKGl0ZW0uaGlkZGVuKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0ZXh0OiBTdHJpbmcoaXRlbSA/PyAnJyksXG4gICAgICAgICAgICBoaWRkZW46IGZhbHNlLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoX2UpIHsgLyogbm9uLWZhdGFsICovIH1cblxuICB3aW5kb3cuX3NhdmVkRGVjaXNpb25zID0ge1xuICAgIGV4cGVyaWVuY2VfZGVjaXNpb25zOiBzdGF0dXNEYXRhLmV4cGVyaWVuY2VfZGVjaXNpb25zIHx8IHt9LFxuICAgIHNraWxsX2RlY2lzaW9uczogICAgICBzdGF0dXNEYXRhLnNraWxsX2RlY2lzaW9ucyAgICAgIHx8IHt9LFxuICAgIGFjaGlldmVtZW50X2RlY2lzaW9uczpzdGF0dXNEYXRhLmFjaGlldmVtZW50X2RlY2lzaW9ucyB8fCB7fSxcbiAgICBwdWJsaWNhdGlvbl9kZWNpc2lvbnM6c3RhdHVzRGF0YS5wdWJsaWNhdGlvbl9kZWNpc2lvbnMgfHwge30sXG4gICAgc3VtbWFyeV9mb2N1c19vdmVycmlkZTogc3RhdHVzRGF0YS5zdW1tYXJ5X2ZvY3VzX292ZXJyaWRlIHx8IG51bGwsXG4gICAgZXh0cmFfc2tpbGxzOiAgICAgICAgICAgc3RhdHVzRGF0YS5leHRyYV9za2lsbHMgfHwgW10sXG4gICAgZXh0cmFfc2tpbGxfbWF0Y2hlczogICAgc3RhdHVzRGF0YS5leHRyYV9za2lsbF9tYXRjaGVzIHx8IHt9LFxuICB9O1xuICB3aW5kb3cuX2FsbEV4cGVyaWVuY2VzID0gc3RhdHVzRGF0YS5hbGxfZXhwZXJpZW5jZXMgfHwgW107XG4gIHdpbmRvdy5zZWxlY3RlZFN1bW1hcnlLZXkgPSBzdGF0dXNEYXRhLnN1bW1hcnlfZm9jdXNfb3ZlcnJpZGUgfHwgc3RhdHVzRGF0YS5zZWxlY3RlZF9zdW1tYXJ5X2tleSB8fCBudWxsO1xuICB3aW5kb3cuX25ld1NraWxsc0Zyb21MTE0gPSBzdGF0dXNEYXRhLm5ld19za2lsbHNfZnJvbV9sbG0gfHwgW107XG4gIHdpbmRvdy5fc3RhdHVzSW50YWtlID0gc3RhdHVzRGF0YS5pbnRha2UgJiYgdHlwZW9mIHN0YXR1c0RhdGEuaW50YWtlID09PSAnb2JqZWN0J1xuICAgID8gc3RhdHVzRGF0YS5pbnRha2VcbiAgICA6IHt9O1xuICB3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zID0gQXJyYXkuaXNBcnJheShzdGF0dXNEYXRhLnBvc3RfYW5hbHlzaXNfcXVlc3Rpb25zKVxuICAgID8gc3RhdHVzRGF0YS5wb3N0X2FuYWx5c2lzX3F1ZXN0aW9uc1xuICAgIDogW107XG4gIHdpbmRvdy5xdWVzdGlvbkFuc3dlcnMgPSAoc3RhdHVzRGF0YS5wb3N0X2FuYWx5c2lzX2Fuc3dlcnMgJiYgdHlwZW9mIHN0YXR1c0RhdGEucG9zdF9hbmFseXNpc19hbnN3ZXJzID09PSAnb2JqZWN0JylcbiAgICA/IHN0YXR1c0RhdGEucG9zdF9hbmFseXNpc19hbnN3ZXJzXG4gICAgOiB7fTtcbiAgd2luZG93Ll9yZXN0b3JlZFBvc2l0aW9uTmFtZSA9IHN0YXR1c0RhdGEucG9zaXRpb25fbmFtZSB8fCBudWxsO1xufVxuXG5mdW5jdGlvbiBfaHlkcmF0ZVN0YXR1c1RhYlN0YXRlKHN0YXR1c0RhdGEpIHtcbiAgY29uc3QgaGFzQW5hbHlzaXMgPSBzdGF0dXNEYXRhLmpvYl9hbmFseXNpcyAhPT0gdW5kZWZpbmVkICYmIHN0YXR1c0RhdGEuam9iX2FuYWx5c2lzICE9PSBudWxsO1xuICBjb25zdCBoYXNDdXN0b21pemF0aW9ucyA9IHN0YXR1c0RhdGEuY3VzdG9taXphdGlvbnMgIT09IHVuZGVmaW5lZCAmJiBzdGF0dXNEYXRhLmN1c3RvbWl6YXRpb25zICE9PSBudWxsO1xuICBjb25zdCBoYXNHZW5lcmF0ZWRGaWxlcyA9IHN0YXR1c0RhdGEuZ2VuZXJhdGVkX2ZpbGVzICE9PSB1bmRlZmluZWQgJiYgc3RhdHVzRGF0YS5nZW5lcmF0ZWRfZmlsZXMgIT09IG51bGw7XG5cbiAgc3RhdGVNYW5hZ2VyLnNldFRhYkRhdGEoJ2FuYWx5c2lzJywgaGFzQW5hbHlzaXMgPyBzdGF0dXNEYXRhLmpvYl9hbmFseXNpcyA6IG51bGwpO1xuICBzdGF0ZU1hbmFnZXIuc2V0VGFiRGF0YSgnY3VzdG9taXphdGlvbnMnLCBoYXNDdXN0b21pemF0aW9ucyA/IHN0YXR1c0RhdGEuY3VzdG9taXphdGlvbnMgOiBudWxsKTtcbiAgc3RhdGVNYW5hZ2VyLnNldFRhYkRhdGEoJ2N2JywgaGFzR2VuZXJhdGVkRmlsZXMgPyBzdGF0dXNEYXRhLmdlbmVyYXRlZF9maWxlcyA6IG51bGwpO1xuICB3aW5kb3cucGVuZGluZ1JlY29tbWVuZGF0aW9ucyA9IGhhc0N1c3RvbWl6YXRpb25zID8gc3RhdHVzRGF0YS5jdXN0b21pemF0aW9ucyA6IG51bGw7XG5cbiAgaWYgKGhhc0FuYWx5c2lzKSB7XG4gICAgcmVmcmVzaEF0c1Njb3JlKCdhbmFseXNpcycpO1xuICB9XG5cbiAgcmV0dXJuIGhhc0FuYWx5c2lzIHx8IGhhc0N1c3RvbWl6YXRpb25zIHx8IGhhc0dlbmVyYXRlZEZpbGVzO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXN0b3JlQmFja2VuZFN0YXRlKCkge1xuICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIHNlcnZlciBoYWQgYW55IGxpdmUgc2Vzc2lvbiBkYXRhLlxuICB0cnkge1xuICAgIGNvbnN0IHN0YXR1c1JlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3N0YXR1cycpO1xuICAgIGlmICghc3RhdHVzUmVzLm9rKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3Qgc3RhdHVzRGF0YSA9IHBhcnNlU3RhdHVzUmVzcG9uc2UoYXdhaXQgc3RhdHVzUmVzLmpzb24oKSk7XG5cbiAgICBpZiAodHlwZW9mIHVwZGF0ZUF1dGhCYWRnZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdXBkYXRlQXV0aEJhZGdlKHN0YXR1c0RhdGEuY29waWxvdF9hdXRoIHx8IHt9LCBzdGF0dXNEYXRhLmxsbV9wcm92aWRlciB8fCBudWxsKTtcbiAgICB9XG5cbiAgICBfaHlkcmF0ZVN0YXR1c0Rlcml2ZWRTdGF0ZShzdGF0dXNEYXRhKTtcblxuICAgIGxldCBzZXJ2ZXJIYXNEYXRhID0gX2h5ZHJhdGVTdGF0dXNUYWJTdGF0ZShzdGF0dXNEYXRhKTtcblxuICAgIGlmIChzdGF0dXNEYXRhLmpvYl9hbmFseXNpcyAhPT0gdW5kZWZpbmVkICYmIHN0YXR1c0RhdGEuam9iX2FuYWx5c2lzICE9PSBudWxsKSB7XG4gICAgICBsb2cuaW5mbygnUmVzdG9yZWQgYW5hbHlzaXMgZGF0YSBmcm9tIGJhY2tlbmQgbWVtb3J5Jyk7XG4gICAgfVxuICAgIGlmIChzdGF0dXNEYXRhLmN1c3RvbWl6YXRpb25zICE9PSB1bmRlZmluZWQgJiYgc3RhdHVzRGF0YS5jdXN0b21pemF0aW9ucyAhPT0gbnVsbCkge1xuICAgICAgbG9nLmluZm8oJ1Jlc3RvcmVkIGN1c3RvbWl6YXRpb25zIGRhdGEgZnJvbSBiYWNrZW5kIG1lbW9yeScpO1xuICAgIH1cbiAgICBpZiAoc3RhdHVzRGF0YS5nZW5lcmF0ZWRfZmlsZXMgIT09IHVuZGVmaW5lZCAmJiBzdGF0dXNEYXRhLmdlbmVyYXRlZF9maWxlcyAhPT0gbnVsbCkge1xuICAgICAgbG9nLmluZm8oJ1Jlc3RvcmVkIENWIGRhdGEgZnJvbSBiYWNrZW5kIG1lbW9yeScpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBnZW5lcmF0aW9uUmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvY3YvZ2VuZXJhdGlvbi1zdGF0ZScpO1xuICAgICAgaWYgKGdlbmVyYXRpb25SZXMub2spIHtcbiAgICAgICAgY29uc3QgZ2VuZXJhdGlvbkRhdGEgPSBhd2FpdCBnZW5lcmF0aW9uUmVzLmpzb24oKTtcbiAgICAgICAgaWYgKGdlbmVyYXRpb25EYXRhPy5vaykge1xuICAgICAgICAgIGNvbnN0IGhhc0NhY2hlZEF0c1Njb3JlID0gQm9vbGVhbihnZW5lcmF0aW9uRGF0YS5hdHNfc2NvcmUpO1xuICAgICAgICAgIGNvbnN0IGhhc1BlcnNpc3RlZEdlbmVyYXRpb25EYXRhID0gQm9vbGVhbihcbiAgICAgICAgICAgIGdlbmVyYXRpb25EYXRhLnByZXZpZXdfYXZhaWxhYmxlXG4gICAgICAgICAgICAgIHx8IGdlbmVyYXRpb25EYXRhLmZpbmFsX2dlbmVyYXRlZF9hdFxuICAgICAgICAgICAgICB8fCBoYXNDYWNoZWRBdHNTY29yZVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBzdGF0ZU1hbmFnZXIuc2V0R2VuZXJhdGlvblN0YXRlKHtcbiAgICAgICAgICAgIHBoYXNlOiBnZW5lcmF0aW9uRGF0YS5waGFzZSB8fCAnaWRsZScsXG4gICAgICAgICAgICBwcmV2aWV3QXZhaWxhYmxlOiBCb29sZWFuKGdlbmVyYXRpb25EYXRhLnByZXZpZXdfYXZhaWxhYmxlKSxcbiAgICAgICAgICAgIHByZXZpZXdPdXRwdXRzOiBnZW5lcmF0aW9uRGF0YS5wcmV2aWV3X291dHB1dHMgfHwgbnVsbCxcbiAgICAgICAgICAgIGxheW91dENvbmZpcm1lZDogQm9vbGVhbihnZW5lcmF0aW9uRGF0YS5sYXlvdXRfY29uZmlybWVkKSxcbiAgICAgICAgICAgIHBhZ2VDb3VudEVzdGltYXRlOiBnZW5lcmF0aW9uRGF0YS5wYWdlX2NvdW50X2VzdGltYXRlID8/IG51bGwsXG4gICAgICAgICAgICBwYWdlQ291bnRFeGFjdDogZ2VuZXJhdGlvbkRhdGEucGFnZV9jb3VudF9leGFjdCA/PyBudWxsLFxuICAgICAgICAgICAgcGFnZUNvdW50Q29uZmlkZW5jZTogZ2VuZXJhdGlvbkRhdGEucGFnZV9jb3VudF9jb25maWRlbmNlID8/IG51bGwsXG4gICAgICAgICAgICBwYWdlQ291bnRTb3VyY2U6IGdlbmVyYXRpb25EYXRhLnBhZ2VfY291bnRfc291cmNlIHx8IG51bGwsXG4gICAgICAgICAgICBwYWdlTmVlZHNFeGFjdFJlY2hlY2s6IEJvb2xlYW4oXG4gICAgICAgICAgICAgIGdlbmVyYXRpb25EYXRhLnBhZ2VfY291bnRfbmVlZHNfZXhhY3RfcmVjaGVjayxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBwYWdlV2FybmluZzogQm9vbGVhbihnZW5lcmF0aW9uRGF0YS5wYWdlX2xlbmd0aF93YXJuaW5nKSxcbiAgICAgICAgICAgIGxheW91dEluc3RydWN0aW9uc0NvdW50OiBnZW5lcmF0aW9uRGF0YS5sYXlvdXRfaW5zdHJ1Y3Rpb25zX2NvdW50IHx8IDAsXG4gICAgICAgICAgICBmaW5hbEdlbmVyYXRlZEF0OiBnZW5lcmF0aW9uRGF0YS5maW5hbF9nZW5lcmF0ZWRfYXQgfHwgbnVsbCxcbiAgICAgICAgICAgIHByZXZpZXdHZW5lcmF0ZWRBdDogZ2VuZXJhdGlvbkRhdGEucHJldmlld19nZW5lcmF0ZWRfYXQgfHwgbnVsbCxcbiAgICAgICAgICAgIHByZXZpZXdSZXF1ZXN0SWQ6IGdlbmVyYXRpb25EYXRhLnByZXZpZXdfcmVxdWVzdF9pZCB8fCBudWxsLFxuICAgICAgICAgICAgY29uZmlybWVkQXQ6IGdlbmVyYXRpb25EYXRhLmNvbmZpcm1lZF9hdCB8fCBudWxsLFxuICAgICAgICAgICAgLy8gT3B0aW9uYWwgc2VydmVyLXByb3ZpZGVkIHJldmlzaW9uIG1ldGFkYXRhIChpZiBiYWNrZW5kIGV4cG9zZXMgdGhlbSlcbiAgICAgICAgICAgIGNvbnRlbnRSZXZpc2lvbjogKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBjb25zdCB2ID0gZ2VuZXJhdGlvbkRhdGEuY29udGVudF9yZXZpc2lvbiA/PyBnZW5lcmF0aW9uRGF0YS5jb250ZW50UmV2aXNpb247XG4gICAgICAgICAgICAgIHJldHVybiAodiA9PT0gdW5kZWZpbmVkIHx8IHYgPT09IG51bGwpID8gMCA6IChOdW1iZXIuaXNGaW5pdGUoTnVtYmVyKHYpKSA/IE51bWJlcih2KSA6IDApO1xuICAgICAgICAgICAgfSkoKSxcbiAgICAgICAgICAgIGxhc3RQcmV2aWV3Q29udGVudFJldmlzaW9uOiBnZW5lcmF0aW9uRGF0YS5sYXN0X3ByZXZpZXdfY29udGVudF9yZXZpc2lvbiA/PyBnZW5lcmF0aW9uRGF0YS5sYXN0UHJldmlld0NvbnRlbnRSZXZpc2lvbiA/PyBudWxsLFxuICAgICAgICAgICAgbGFzdEZpbmFsQ29udGVudFJldmlzaW9uOiBnZW5lcmF0aW9uRGF0YS5sYXN0X2ZpbmFsX2NvbnRlbnRfcmV2aXNpb24gPz8gZ2VuZXJhdGlvbkRhdGEubGFzdEZpbmFsQ29udGVudFJldmlzaW9uID8/IG51bGwsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAoaGFzQ2FjaGVkQXRzU2NvcmUpIHtcbiAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zZXRBdHNTY29yZShnZW5lcmF0aW9uRGF0YS5hdHNfc2NvcmUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdGF0ZU1hbmFnZXIuY2xlYXJBdHNTY29yZSgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChoYXNQZXJzaXN0ZWRHZW5lcmF0aW9uRGF0YSkge1xuICAgICAgICAgICAgc2VydmVySGFzRGF0YSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoX2UpIHsgLyogbm9uLWZhdGFsICovIH1cblxuICAgIGNvbnN0IHJlc3RvcmVkUGhhc2UgPSBfcmVzb2x2ZVJlc3RvcmVkUGhhc2Uoc3RhdHVzRGF0YSk7XG4gICAgc3RhdGVNYW5hZ2VyLnNldFBoYXNlKHJlc3RvcmVkUGhhc2UpO1xuICAgIF9yZXN0b3JlVGFiRm9yUGhhc2UocmVzdG9yZWRQaGFzZSk7XG5cbiAgICAvLyBLZWVwIHRoZSBwb3NpdGlvbi10aXRsZSBlbGVtZW50IGluIHN5bmMgd2hlbmV2ZXIgd2UgcmVzdG9yZSBzdGF0dXMgZGF0YS5cbiAgICBpZiAodHlwZW9mIHVwZGF0ZVBvc2l0aW9uVGl0bGUgPT09ICdmdW5jdGlvbicpIHVwZGF0ZVBvc2l0aW9uVGl0bGUoc3RhdHVzRGF0YSk7XG5cbiAgICBpZiAodHlwZW9mIHVwZGF0ZUluY2x1c2lvbkNvdW50cyA9PT0gJ2Z1bmN0aW9uJykgdXBkYXRlSW5jbHVzaW9uQ291bnRzKCk7XG5cbiAgICBpZiAoIXN0YXR1c0RhdGEucG9zaXRpb25fbmFtZSAmJiAhc3RhdHVzRGF0YS5qb2JfYW5hbHlzaXMpIHtcbiAgICAgIGNvbnN0IHN0b3JlZFBhdGggICAgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShTdG9yYWdlS2V5cy5TRVNTSU9OX1BBVEgpO1xuICAgICAgY29uc3Qgc3RvcmVkU2Vzc2lvbiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFN0b3JhZ2VLZXlzLlNFU1NJT05fSUQpO1xuICAgICAgY29uc3QgY3VycmVudFNlc3Npb24gPSBnZXRTZXNzaW9uSWRGcm9tVVJMID8gZ2V0U2Vzc2lvbklkRnJvbVVSTCgpIDogbnVsbDtcbiAgICAgIC8vIE9ubHkgYXV0by1yZXN0b3JlIGZyb20gZGlzayB3aGVuIHJlY29ubmVjdGluZyB0byB0aGUgU0FNRSBzZXNzaW9uXG4gICAgICAvLyAoc3RvcmVkU2Vzc2lvbiBtYXRjaGVzIHRoZSBjdXJyZW50IFVSTCBzZXNzaW9uX2lkKS4gIEEgZnJlc2ggbmV3IHNlc3Npb25cbiAgICAgIC8vIHdpbGwgaGF2ZSBhIGRpZmZlcmVudCBJRCwgc28gdGhpcyBndWFyZCBwcmV2ZW50cyB0aGUgbmV3IHNlc3Npb24gZnJvbVxuICAgICAgLy8gc2lsZW50bHkgbG9hZGluZyB0aGUgcHJldmlvdXMgc2Vzc2lvbidzIGRhdGEgb2ZmIGRpc2suXG4gICAgICBpZiAoc3RvcmVkUGF0aCAmJiBzdG9yZWRTZXNzaW9uICYmIHN0b3JlZFNlc3Npb24gPT09IGN1cnJlbnRTZXNzaW9uKSB7XG4gICAgICAgIC8vIFBhc3MgcmVkaXJlY3RPbk1pc21hdGNoOmZhbHNlIHNvIHRoYXQgaWYgdGhlIGZpbGUgb24gZGlzayBiZWxvbmdzIHRvIGFcbiAgICAgICAgLy8gZGlmZmVyZW50IHNlc3Npb24gKGUuZy4gU0VTU0lPTl9QQVRIIHdhcyBuZXZlciB1cGRhdGVkIGFmdGVyIGEgbmV3XG4gICAgICAgIC8vIHNlc3Npb24gd2FzIGNyZWF0ZWQpLCB3ZSBzaWxlbnRseSBza2lwIHRoZSByZXN0b3JlIHJhdGhlciB0aGFuXG4gICAgICAgIC8vIG5hdmlnYXRpbmcgdGhlIGJyb3dzZXIgdG8gYSBzZXNzaW9uIHRoZSB1c2VyIGRpZG4ndCBhc2sgZm9yLlxuICAgICAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCBsb2FkU2Vzc2lvbkZpbGUoc3RvcmVkUGF0aCwgeyByZWRpcmVjdE9uTWlzbWF0Y2g6IGZhbHNlIH0pO1xuICAgICAgICBpZiAobG9hZGVkKSByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2VydmVySGFzRGF0YTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cud2FybignRmFpbGVkIHRvIHJlc3RvcmUgYmFja2VuZCBzdGF0ZTonLCBlcnJvcik7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxvYWRTZXNzaW9uRmlsZShwYXRoLCB7IHJlZGlyZWN0T25NaXNtYXRjaCA9IHRydWUgfSA9IHt9KSB7XG4gIHRyeSB7XG4gICAgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgJ1x1RDgzRFx1REQwNCBSZXN0b3Jpbmcgc2Vzc2lvbiBmcm9tIGZpbGUuLi4nKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9sb2FkLXNlc3Npb24nLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBwYXRoIH0pXG4gICAgfSk7XG4gICAgaWYgKCFyZXMub2spIHtcbiAgICAgIGNvbnN0IGVyciA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCBgXHUyNzRDIEZhaWxlZCB0byByZXN0b3JlIHNlc3Npb246ICR7ZXJyLmVycm9yfWApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcblxuICAgIGlmIChkYXRhLnJlZGlyZWN0X3VybCAmJiBnZXRTZXNzaW9uSWRGcm9tVVJMKCkgIT09IGRhdGEuc2Vzc2lvbl9pZCkge1xuICAgICAgaWYgKCFyZWRpcmVjdE9uTWlzbWF0Y2gpIHtcbiAgICAgICAgLy8gVGhlIGZpbGUgb24gZGlzayBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IHNlc3Npb24gdGhhbiB0aGUgb25lIGluIHRoZVxuICAgICAgICAvLyBVUkwuICBTaWxlbnRseSBhYm9ydCByYXRoZXIgdGhhbiByZWRpcmVjdGluZyB0aGUgYnJvd3NlciBcdTIwMTQgdGhlIGNhbGxlclxuICAgICAgICAvLyAocmVzdG9yZUJhY2tlbmRTdGF0ZSkgb25seSB3YW50cyB0byByZXN0b3JlIFRISVMgc2Vzc2lvbiwgbm90IGxvYWQgYVxuICAgICAgICAvLyBkaWZmZXJlbnQgb25lLlxuICAgICAgICBsb2cud2FybihcbiAgICAgICAgICAnbG9hZFNlc3Npb25GaWxlOiBzZXNzaW9uX2lkIG1pc21hdGNoICh1cmw9JXMsIGZpbGU9JXMpOyBza2lwcGluZyByZXN0b3JlJyxcbiAgICAgICAgICBnZXRTZXNzaW9uSWRGcm9tVVJMKCksIGRhdGEuc2Vzc2lvbl9pZCxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihkYXRhLnJlZGlyZWN0X3VybCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShTdG9yYWdlS2V5cy5TRVNTSU9OX1BBVEgsIGRhdGEuc2Vzc2lvbl9maWxlIHx8IHBhdGgpO1xuXG4gICAgLy8gUmVzZXQgc2Vzc2lvbi1zY29wZWQgc3VnZ2VzdGlvbiBzdGF0ZVxuICAgIHdpbmRvdy5fc3VnZ2VzdGVkQWNoc09yZGVyZWQgPSBudWxsO1xuXG4gICAgLy8gUmVsb2FkIGNvbnZlcnNhdGlvbiBoaXN0b3J5IGZyb20gdGhlIGZyZXNobHktbG9hZGVkIGJhY2tlbmRcbiAgICBjb25zdCBoaXN0b3J5UmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvaGlzdG9yeScpO1xuICAgIGlmIChoaXN0b3J5UmVzLm9rKSB7XG4gICAgICBjb25zdCBoaXN0b3J5RGF0YSA9IGF3YWl0IGhpc3RvcnlSZXMuanNvbigpO1xuICAgICAgY29uc3QgY29udiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb252ZXJzYXRpb24nKTtcbiAgICAgIGNvbnYuaW5uZXJIVE1MID0gJyc7XG4gICAgICAoaGlzdG9yeURhdGEuaGlzdG9yeSB8fCBbXSkuZm9yRWFjaChtc2cgPT4ge1xuICAgICAgICBpZiAobXNnLnJvbGUgIT09ICdzeXN0ZW0nKSBhcHBlbmRNZXNzYWdlKG1zZy5yb2xlLCBtc2cuY29udGVudCk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgJ1x1MjZBMCBDb3VsZCBub3QgcmVzdG9yZSBjb252ZXJzYXRpb24gaGlzdG9yeS4nKTtcbiAgICB9XG5cbiAgICBhd2FpdCBmZXRjaFN0YXR1cygpO1xuXG4gICAgLy8gUnVuIGEgYmFja2dyb3VuZCBoZWFsdGggY2hlY2sgc28gdGhlIHN0YXR1cyBwaWxsIHJlZmxlY3RzIGxpdmUgY29ubmVjdGl2aXR5LlxuICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcy50ZXN0Q3VycmVudE1vZGVsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBnbG9iYWxUaGlzLnRlc3RDdXJyZW50TW9kZWwoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgfVxuXG4gICAgLy8gUmVoeWRyYXRlIHRhYkRhdGEgYW5kIHN3aXRjaCB0byB0aGUgY29ycmVjdCB0YWIgZm9yIHRoZSByZXN0b3JlZCBwaGFzZVxuICAgIGNvbnN0IHNlc3Npb25QaGFzZSA9IGRhdGEucGhhc2UgfHwgUEhBU0VTLklOSVQ7XG4gICAgY29uc3QgcGhhc2VUYWJNYXAgPSB7XG4gICAgICBbUEhBU0VTLklOSVRdOiAgICAgICAgICAgICAnam9iJyxcbiAgICAgIFtQSEFTRVMuSk9CX0FOQUxZU0lTXTogICAgICdhbmFseXNpcycsXG4gICAgICBbUEhBU0VTLkNVU1RPTUlaQVRJT05dOiAgICAnZXhwLXJldmlldycsXG4gICAgICBbUEhBU0VTLlJFV1JJVEVfUkVWSUVXXTogICAncmV3cml0ZScsXG4gICAgICBbUEhBU0VTLlNQRUxMX0NIRUNLXTogICAgICAnc3BlbGwnLFxuICAgICAgW1BIQVNFUy5HRU5FUkFUSU9OXTogICAgICAgJ2xheW91dCcsXG4gICAgICBbUEhBU0VTLkxBWU9VVF9SRVZJRVddOiAgICAnbGF5b3V0JyxcbiAgICAgIFtQSEFTRVMuRklOQUxfR0VORVJBVElPTl06ICdmaW5hbF9nZW5lcmF0ZScsXG4gICAgICBbUEhBU0VTLlJFRklORU1FTlRdOiAgICAgICAnZG93bmxvYWQnLFxuICAgIH07XG4gICAgY29uc3QgdGFyZ2V0VGFiID0gcGhhc2VUYWJNYXBbc2Vzc2lvblBoYXNlXSB8fCAnam9iJztcblxuICAgIGNvbnN0IGN1c3RvbWl6YXRpb25QaGFzZXMgPSBbXG4gICAgICBQSEFTRVMuQ1VTVE9NSVpBVElPTiwgUEhBU0VTLlJFV1JJVEVfUkVWSUVXLCBQSEFTRVMuU1BFTExfQ0hFQ0ssXG4gICAgICBQSEFTRVMuR0VORVJBVElPTiwgUEhBU0VTLkxBWU9VVF9SRVZJRVcsIFBIQVNFUy5GSU5BTF9HRU5FUkFUSU9OLCBQSEFTRVMuUkVGSU5FTUVOVCxcbiAgICBdO1xuICAgIGlmIChjdXN0b21pemF0aW9uUGhhc2VzLmluY2x1ZGVzKHNlc3Npb25QaGFzZSkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHMyID0gYXdhaXQgZmV0Y2goJy9hcGkvc3RhdHVzJyk7XG4gICAgICAgIGNvbnN0IHNkID0gcGFyc2VTdGF0dXNSZXNwb25zZShhd2FpdCBzMi5qc29uKCkpO1xuICAgICAgICBfaHlkcmF0ZVN0YXR1c0Rlcml2ZWRTdGF0ZShzZCk7XG4gICAgICAgIF9oeWRyYXRlU3RhdHVzVGFiU3RhdGUoc2QpO1xuICAgICAgfSBjYXRjaCAoXykgeyAvKiBub24tZmF0YWwgKi8gfVxuICAgIH1cblxuICAgIC8vIEZvciByZXdyaXRlX3JldmlldyBwaGFzZSwgcHJlLXBvcHVsYXRlIHRoZSByZXdyaXRlIHBhbmVsIGNhY2hlXG4gICAgaWYgKHNlc3Npb25QaGFzZSA9PT0gUEhBU0VTLlJFV1JJVEVfUkVWSUVXKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByciA9IGF3YWl0IGZldGNoKCcvYXBpL3Jld3JpdGVzJyk7XG4gICAgICAgIGlmIChyci5vaykge1xuICAgICAgICAgIGNvbnN0IHJkID0gcGFyc2VSZXdyaXRlc1Jlc3BvbnNlKGF3YWl0IHJyLmpzb24oKSk7XG4gICAgICAgICAgY29uc3QgcmV3cml0ZXMgPSByZC5yZXdyaXRlcyB8fCBbXTtcbiAgICAgICAgICBjb25zdCB3YXJuaW5ncyA9IHJkLnBlcnN1YXNpb25fd2FybmluZ3MgfHwgW107XG4gICAgICAgICAgcmV3cml0ZURlY2lzaW9ucyA9IHt9O1xuICAgICAgICAgIHJlbmRlclJld3JpdGVQYW5lbChyZXdyaXRlcywgd2FybmluZ3MpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChfKSB7IC8qIG5vbi1mYXRhbCAqLyB9XG4gICAgfVxuXG4gICAgc3dpdGNoVGFiKHRhcmdldFRhYik7XG4gICAgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgYFx1MjcwNSBTZXNzaW9uIHJlc3RvcmVkOiAke2RhdGEucG9zaXRpb25fbmFtZSB8fCAnVW5uYW1lZCd9ICgke1NFU1NJT05fUEhBU0VfTEFCRUxTW2RhdGEucGhhc2VdIHx8IFN0cmluZyhkYXRhLnBoYXNlIHx8IFBIQVNFUy5JTklUKS5yZXBsYWNlKC9fL2csICcgJyl9KWApO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCBgXHUyNzRDIEVycm9yIHJlc3RvcmluZyBzZXNzaW9uOiAke2Vyci5tZXNzYWdlfWApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFJlbmFtZSAvIHRhYiBkYXRhIHBlcnNpc3RlbmNlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuYXN5bmMgZnVuY3Rpb24gcHJvbXB0UmVuYW1lQ3VycmVudFNlc3Npb24oKSB7XG4gIGNvbnN0IHRpdGxlRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncG9zaXRpb24tdGl0bGUnKTtcbiAgY29uc3QgcmVuYW1lQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlbmFtZS1zZXNzaW9uLWJ0bicpO1xuICBjb25zdCBjdXJyZW50ID0gKHRpdGxlRWw/LnRleHRDb250ZW50IHx8ICcnKS50cmltKCk7XG5cbiAgLy8gQnVpbGQgaW5saW5lIGlucHV0IHdpZGdldCBzbyB3ZSBuZXZlciBjYWxsIHdpbmRvdy5wcm9tcHQoKVxuICBjb25zdCB3cmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICB3cmFwcGVyLnN0eWxlLmNzc1RleHQgPSAnZGlzcGxheTppbmxpbmUtZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjRweDsnO1xuICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gIGlucHV0LnR5cGUgPSAndGV4dCc7XG4gIGlucHV0LnZhbHVlID0gY3VycmVudDtcbiAgaW5wdXQuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgJ05ldyBzZXNzaW9uIG5hbWUnKTtcbiAgaW5wdXQuc3R5bGUuY3NzVGV4dCA9ICdmb250LXNpemU6aW5oZXJpdDtwYWRkaW5nOjFweCA0cHg7Ym9yZGVyOjFweCBzb2xpZCAjOTRhM2I4O2JvcmRlci1yYWRpdXM6M3B4O3dpZHRoOjIyMHB4Oyc7XG4gIGNvbnN0IG9rQnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gIG9rQnRuLnRleHRDb250ZW50ID0gJ1x1MjcxMyc7XG4gIG9rQnRuLnRpdGxlID0gJ1NhdmUgcmVuYW1lJztcbiAgb2tCdG4uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgJ1NhdmUgcmVuYW1lJyk7XG4gIG9rQnRuLnN0eWxlLmNzc1RleHQgPSAnYmFja2dyb3VuZDojMTBiOTgxO2NvbG9yOiNmZmY7Ym9yZGVyOm5vbmU7Ym9yZGVyLXJhZGl1czozcHg7Y3Vyc29yOnBvaW50ZXI7cGFkZGluZzoxcHggNnB4O2ZvbnQtc2l6ZToxZW07JztcbiAgY29uc3QgY2FuY2VsQnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gIGNhbmNlbEJ0bi50ZXh0Q29udGVudCA9ICdcdTI3MTUnO1xuICBjYW5jZWxCdG4udGl0bGUgPSAnQ2FuY2VsIHJlbmFtZSc7XG4gIGNhbmNlbEJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnQ2FuY2VsIHJlbmFtZScpO1xuICBjYW5jZWxCdG4uc3R5bGUuY3NzVGV4dCA9ICdiYWNrZ3JvdW5kOiM2YjcyODA7Y29sb3I6I2ZmZjtib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjNweDtjdXJzb3I6cG9pbnRlcjtwYWRkaW5nOjFweCA2cHg7Zm9udC1zaXplOjFlbTsnO1xuICB3cmFwcGVyLmFwcGVuZChpbnB1dCwgb2tCdG4sIGNhbmNlbEJ0bik7XG5cbiAgaWYgKHRpdGxlRWwpIHRpdGxlRWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgaWYgKHJlbmFtZUJ0bikgcmVuYW1lQnRuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHRpdGxlRWw/LnBhcmVudEVsZW1lbnQ/Lmluc2VydEJlZm9yZSh3cmFwcGVyLCB0aXRsZUVsKTtcbiAgaW5wdXQuZm9jdXMoKTtcbiAgaW5wdXQuc2VsZWN0KCk7XG5cbiAgYXN5bmMgZnVuY3Rpb24gZG9SZW5hbWUoKSB7XG4gICAgY29uc3QgbmV3TmFtZSA9IGlucHV0LnZhbHVlLnRyaW0oKTtcbiAgICBjbGVhbnVwKCk7XG4gICAgaWYgKCFuZXdOYW1lIHx8IG5ld05hbWUgPT09IGN1cnJlbnQpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL3JlbmFtZS1jdXJyZW50LXNlc3Npb24nLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBuZXdfbmFtZTogbmV3TmFtZSB9KSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5vaykgYXdhaXQgZmV0Y2hTdGF0dXMoKTtcbiAgICAgIGVsc2UgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHNob3dUb2FzdChgUmVuYW1lIGZhaWxlZDogJHtkYXRhLmVycm9yfWAsICdlcnJvcicpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmICh0eXBlb2Ygc2hvd1RvYXN0ID09PSAnZnVuY3Rpb24nKSBzaG93VG9hc3QoYFJlbmFtZSBlcnJvcjogJHtlLm1lc3NhZ2V9YCwgJ2Vycm9yJyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY2xlYW51cCgpIHtcbiAgICB3cmFwcGVyLnJlbW92ZSgpO1xuICAgIGlmICh0aXRsZUVsKSB0aXRsZUVsLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICBpZiAocmVuYW1lQnRuKSByZW5hbWVCdG4uc3R5bGUuZGlzcGxheSA9ICcnO1xuICB9XG5cbiAgb2tCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBkb1JlbmFtZSk7XG4gIGNhbmNlbEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNsZWFudXApO1xuICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZSA9PiB7XG4gICAgaWYgKGUua2V5ID09PSAnRW50ZXInKSBkb1JlbmFtZSgpO1xuICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIGNsZWFudXAoKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHNhdmVUYWJEYXRhKCkge1xuICB0cnkge1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGdldFNjb3BlZFRhYkRhdGFTdG9yYWdlS2V5KHN0YXRlTWFuYWdlci5nZXRTZXNzaW9uSWQoKSksIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIHRhYkRhdGE6IHN0YXRlTWFuYWdlci5nZXRBbGxUYWJEYXRhKCksXG4gICAgICBjdXJyZW50VGFiOiBzdGF0ZU1hbmFnZXIuZ2V0Q3VycmVudFRhYigpLFxuICAgICAgcGVuZGluZ1JlY29tbWVuZGF0aW9uczogd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnMgfHwgbnVsbCxcbiAgICAgIGludGVyYWN0aXZlU3RhdGU6IHN0YXRlTWFuYWdlci5nZXRJbnRlcmFjdGl2ZVN0YXRlKCksXG4gICAgICBhY3RpdmVSZXZpZXdQYW5lOiB3aW5kb3cuX2FjdGl2ZVJldmlld1BhbmUgfHwgJ2V4cGVyaWVuY2VzJyxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKVxuICAgIH0pKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cud2FybignRmFpbGVkIHRvIHNhdmUgdGFiIGRhdGE6JywgZXJyb3IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc3RvcmVUYWJEYXRhKHsgdWlQcmVmc09ubHkgPSBmYWxzZSB9ID0ge30pIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzYXZlZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGdldFNjb3BlZFRhYkRhdGFTdG9yYWdlS2V5KHN0YXRlTWFuYWdlci5nZXRTZXNzaW9uSWQoKSkpO1xuICAgIGlmIChzYXZlZCkge1xuICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2Uoc2F2ZWQpO1xuXG4gICAgICBjb25zdCBhZ2UgPSBEYXRlLm5vdygpIC0gKGRhdGEudGltZXN0YW1wIHx8IDApO1xuICAgICAgaWYgKGFnZSA8IDI0ICogNjAgKiA2MCAqIDEwMDApIHtcbiAgICAgICAgaWYgKCF1aVByZWZzT25seSkge1xuICAgICAgICAgIGlmIChkYXRhLnRhYkRhdGEpIHtcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGRhdGEudGFiRGF0YSkuZm9yRWFjaCgoW3RhYiwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zZXRUYWJEYXRhKHRhYiwgdmFsdWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChkYXRhLnBlbmRpbmdSZWNvbW1lbmRhdGlvbnMpIHtcbiAgICAgICAgICAgIHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zID0gZGF0YS5wZW5kaW5nUmVjb21tZW5kYXRpb25zO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZGF0YS5pbnRlcmFjdGl2ZVN0YXRlKSB7XG4gICAgICAgICAgICBzdGF0ZU1hbmFnZXIuc2V0SW50ZXJhY3RpdmVTdGF0ZShkYXRhLmludGVyYWN0aXZlU3RhdGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YS5hY3RpdmVSZXZpZXdQYW5lKSB7XG4gICAgICAgICAgd2luZG93Ll9hY3RpdmVSZXZpZXdQYW5lID0gZGF0YS5hY3RpdmVSZXZpZXdQYW5lO1xuICAgICAgICB9XG5cbiAgICAgICAgbG9nLmluZm8oYFJlc3RvcmVkIHRhYiBkYXRhIGZyb20gbG9jYWxTdG9yYWdlICh1aVByZWZzT25seT0ke3VpUHJlZnNPbmx5fSlgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGdldFNjb3BlZFRhYkRhdGFTdG9yYWdlS2V5KHN0YXRlTWFuYWdlci5nZXRTZXNzaW9uSWQoKSkpO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cud2FybignRmFpbGVkIHRvIHJlc3RvcmUgdGFiIGRhdGE6JywgZXJyb3IpO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFUyBtb2R1bGUgZXhwb3J0cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmV4cG9ydCB7XG4gIGZvcm1hdFNlc3Npb25QaGFzZUxhYmVsLFxuICBfZ2V0Q3VycmVudFNlc3Npb25JZFZhbHVlLFxuICBfZ2V0Q3VycmVudE93bmVyVG9rZW5WYWx1ZSxcbiAgYnVpbGRTZXNzaW9uU3dpdGNoZXJMYWJlbCxcbiAgZ2V0QWN0aXZlU2Vzc2lvbk93bmVyc2hpcE1ldGEsXG4gIGZvcm1hdFNlc3Npb25UaW1lc3RhbXAsXG4gIGNyZWF0ZU5ld1Nlc3Npb25BbmROYXZpZ2F0ZSxcbiAgY3JlYXRlTmV3U2Vzc2lvbkluTmV3VGFiLFxuICBvbmJvYXJkaW5nQ3JlYXRlRW1wdHlQcm9maWxlLFxuICBzaG93T25ib2FyZGluZ01vZGFsLFxuICBtYXliZVNob3dXZWxjb21lTW9kYWwsXG4gIHNob3dXZWxjb21lTW9kYWwsXG4gIGNsb3NlV2VsY29tZU1vZGFsLFxuICBfY2xhaW1DdXJyZW50U2Vzc2lvbixcbiAgX3Jlc29sdmVSZXN0b3JlZFBoYXNlLFxuICBzaG93U2Vzc2lvbnNMYW5kaW5nUGFuZWwsXG4gIGVuc3VyZVNlc3Npb25Db250ZXh0LFxuICByZXN0b3JlU2Vzc2lvbixcbiAgcmVzdG9yZUJhY2tlbmRTdGF0ZSxcbiAgbG9hZFNlc3Npb25GaWxlLFxuICBwcm9tcHRSZW5hbWVDdXJyZW50U2Vzc2lvbixcbiAgc2F2ZVRhYkRhdGEsXG4gIHJlc3RvcmVUYWJEYXRhLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL2pvYi1pbnB1dC5qc1xuICogSm9iIGRlc2NyaXB0aW9uIGlucHV0IHBhbmVsOiBwYXN0ZSwgVVJMIGZldGNoLCBmaWxlIHVwbG9hZCwgbG9hZC1pdGVtcyB0YWJsZS5cbiAqXG4gKiBERVBFTkRFTkNJRVMgKGFsbCBvbiBnbG9iYWxUaGlzIGF0IHJ1bnRpbWUpOlxuICogICAtIG1hcmtlZCwgZG9tcHVyaWZ5IChucG0gXHUyMDE0IGJ1bmRsZWQ7IHVzZWQgaW50ZXJuYWxseSBmb3Igc2FmZSBtYXJrZG93biByZW5kZXJpbmcpXG4gKiAgIC0gZXNjYXBlSHRtbCAodXRpbHMuanMpXG4gKiAgIC0gYXBwZW5kTWVzc2FnZSwgYXBwZW5kUmV0cnlNZXNzYWdlIChtZXNzYWdlLXF1ZXVlLmpzKVxuICogICAtIHNldExvYWRpbmcgKGZldGNoLXV0aWxzLmpzKVxuICogICAtIHNhdmVUYWJEYXRhIChzZXNzaW9uLW1hbmFnZXIuanMpXG4gKiAgIC0gc3dpdGNoVGFiIChyZXZpZXctdGFibGUtYmFzZS5qcywgVGllciA0KVxuICogICAtIGFuYWx5emVKb2IgKGpvYi1hbmFseXNpcy5qcylcbiAqICAgLSBmZXRjaFN0YXR1cyAoYXBpLWNsaWVudC5qcylcbiAqICAgLSBzaG93QWxlcnRNb2RhbCAodWktaGVscGVycy5qcylcbiAqICAgLSBzdGF0ZU1hbmFnZXIgKHN0YXRlLW1hbmFnZXIuanMgXHUyMDE0IGdldEN1cnJlbnRUYWIoKS9zZXRUYWJEYXRhKCkpXG4gKiAgIC0gUEhBU0VTICh3aW5kb3cgZ2xvYmFsKVxuICpcbiAqIEdBUC0yMyBpbnRha2UgY29uZmlybWF0aW9uOlxuICogICBBbGwgam9iLXRleHQgc3VibWlzc2lvbnMgKHBhc3RlLCBVUkwsIGZpbGUpIHJvdXRlIGRpcmVjdGx5IHRvIGFuYWx5emVKb2IoKVxuICogICBzbyBldmVyeSBzb3VyY2UgZm9sbG93cyB0aGUgc2FtZSBwb3N0LWFuYWx5c2lzIGludGFrZSBwYXRoLlxuICovXG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmNvbnN0IGxvZyA9IGdldExvZ2dlcignam9iLWlucHV0Jyk7XG5cbmltcG9ydCB7IFBIQVNFUywgc3RhdGVNYW5hZ2VyIH0gZnJvbSAnLi9zdGF0ZS1tYW5hZ2VyLmpzJztcbmltcG9ydCB7IG1hcmtlZCB9IGZyb20gJ21hcmtlZCc7XG5pbXBvcnQgRE9NUHVyaWZ5IGZyb20gJ2RvbXB1cmlmeSc7XG5cbi8vIFJlbmRlciBqb2IgZGVzY3JpcHRpb24gdGV4dCBzYWZlbHk6IG1hcmtlZCBwYXJzZXMgR0ZNIChpbmNsdWRpbmcgZW1iZWRkZWQgSFRNTFxuLy8gYW5kIGF1dG9saW5rcyksIERPTVB1cmlmeSBzYW5pdGl6ZXMgdGhlIG91dHB1dCBiZWZvcmUgd3JpdGluZyB0byBpbm5lckhUTUwuXG4vLyBGT1JCSURfQVRUUjogWydzdHlsZSddIHN0cmlwcyBpbmxpbmUgQ1NTIGZyb20gSFRNTCBlbWJlZGRlZCBpbiB0aGUgam9iIHRleHRcbi8vIChlLmcuIFdvcmQtc3R5bGUgZm9udC1zaXplL2ZvbnQtZmFtaWx5IGZyb20gSlNPTi1MRCBkZXNjcmlwdGlvbiBmaWVsZHMpLFxuLy8gc28gdGhlIHBhZ2UncyBvd24gc3R5bGVzaGVldCBjb250cm9scyBmb250IHJlbmRlcmluZyBjb25zaXN0ZW50bHkuXG5mdW5jdGlvbiBfcmVuZGVySm9iVGV4dCh0ZXh0KSB7XG4gIGNvbnN0IHJhdyA9IG1hcmtlZC5wYXJzZSh0ZXh0LCB7IGdmbTogdHJ1ZSwgYnJlYWtzOiB0cnVlIH0pO1xuICByZXR1cm4gRE9NUHVyaWZ5LnNhbml0aXplKHJhdywgeyBGT1JCSURfQVRUUjogWydzdHlsZSddIH0pO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEpvYiB0YWIgZGlzcGxheVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmFzeW5jIGZ1bmN0aW9uIHBvcHVsYXRlSm9iVGFiKCkge1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9zdGF0dXMnKTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcblxuICAgIGlmIChkYXRhLmpvYl9kZXNjcmlwdGlvbl90ZXh0KSB7XG4gICAgICBjb25zdCBqb2JUZXh0ID0gZGF0YS5qb2JfZGVzY3JpcHRpb25fdGV4dDtcbiAgICAgIGNvbnN0IHBvc2l0aW9uTmFtZSA9IGRhdGEucG9zaXRpb25fbmFtZSB8fCBudWxsO1xuICAgICAgY29uc3Qgam9iVXJsID0gZGF0YS5qb2JfdXJsIHx8IG51bGw7XG4gICAgICBjb25zdCB0aXRsZVRleHQgPSBwb3NpdGlvbk5hbWVcbiAgICAgICAgPyBlc2NhcGVIdG1sKHBvc2l0aW9uTmFtZSlcbiAgICAgICAgOiAnPGVtIHN0eWxlPVwiY29sb3I6IzljYTNhZjtcIj5Qb3NpdGlvbiB0aXRsZSBub3QgeWV0IGV4dHJhY3RlZFx1MjAyNjwvZW0+JztcbiAgICAgIGNvbnN0IHRpdGxlQ29udGVudCA9IChwb3NpdGlvbk5hbWUgJiYgam9iVXJsKVxuICAgICAgICA/IGA8YSBocmVmPVwiJHtlc2NhcGVIdG1sKGpvYlVybCl9XCIgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiIHN0eWxlPVwiY29sb3I6aW5oZXJpdDt0ZXh0LWRlY29yYXRpb246bm9uZTtcIj4ke3RpdGxlVGV4dH08L2E+YFxuICAgICAgICA6IHRpdGxlVGV4dDtcbiAgICAgIGxldCBodG1sID0gJzxoMT4nICsgdGl0bGVDb250ZW50ICsgJzwvaDE+JztcbiAgICAgIGlmIChqb2JVcmwpIHtcbiAgICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cIm1heC13aWR0aDoxMDAlO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3doaXRlLXNwYWNlOm5vd3JhcDtjb2xvcjojNjQ3NDhiO2ZvbnQtc2l6ZTowLjg1ZW07bWFyZ2luOi04cHggMCA4cHggMDtcIiB0aXRsZT1cIiR7ZXNjYXBlSHRtbChqb2JVcmwpfVwiPjxhIGhyZWY9XCIke2VzY2FwZUh0bWwoam9iVXJsKX1cIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCIgc3R5bGU9XCJjb2xvcjojM2I4MmY2O3RleHQtZGVjb3JhdGlvbjpub25lO1wiPiR7ZXNjYXBlSHRtbChqb2JVcmwpfTwvYT48L2Rpdj5gO1xuICAgICAgfVxuXG4gICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwibGluZS1oZWlnaHQ6IDEuNjsgYmFja2dyb3VuZDogI2Y4ZjlmYTsgcGFkZGluZzogMjBweDsgYm9yZGVyLXJhZGl1czogOHB4OyBtYXJnaW46IDIwcHggMDtcIj4nICsgX3JlbmRlckpvYlRleHQoam9iVGV4dCkgKyAnPC9kaXY+JztcblxuICAgICAgY29uc3QgYW5hbHl6ZUJ0biA9IGRhdGEucGhhc2UgPT09IFBIQVNFUy5JTklUXG4gICAgICAgID8gJzxidXR0b24gb25jbGljaz1cImFuYWx5emVKb2IoKVwiIGNsYXNzPVwiYnRuLXByaW1hcnlcIiBzdHlsZT1cIm1hcmdpbi1yaWdodDo4cHg7XCI+XHVEODNEXHVERDBEIEFuYWx5c2UgSm9iPC9idXR0b24+J1xuICAgICAgICA6ICcnO1xuICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6MjBweDtcIj4nICsgYW5hbHl6ZUJ0biArICc8YnV0dG9uIG9uY2xpY2s9XCJzaG93TG9hZEpvYlBhbmVsKClcIiBjbGFzcz1cImJ0bi1zZWNvbmRhcnlcIj5cdUQ4M0RcdURDRTUgTG9hZCBEaWZmZXJlbnQgSm9iPC9idXR0b24+PC9kaXY+JztcbiAgICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gaHRtbDtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgc2hvd0xvYWRKb2JQYW5lbCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cuZXJyb3IoJ0Vycm9yIGxvYWRpbmcgam9iIGRlc2NyaXB0aW9uOicsIGVycm9yKTtcbiAgICBhd2FpdCBzaG93TG9hZEpvYlBhbmVsKCk7XG4gIH1cbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBMb2FkLWpvYiBwYW5lbCAoc2Vzc2lvbnMgKyBzZXJ2ZXIgZmlsZXMgdGFibGUgKyBpbnB1dCBtZXRob2RzKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmFzeW5jIGZ1bmN0aW9uIHNob3dMb2FkSm9iUGFuZWwoKSB7XG4gIGlmIChzdGF0ZU1hbmFnZXIuZ2V0Q3VycmVudFRhYigpICE9PSAnam9iJykge1xuICAgIHN3aXRjaFRhYignam9iJyk7XG4gIH1cblxuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgY29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImVtcHR5LXN0YXRlXCI+PGRpdiBjbGFzcz1cImxvYWRpbmctc3Bpbm5lclwiPjwvZGl2PjxwIHN0eWxlPVwibWFyZ2luLXRvcDoxMnB4O2NvbG9yOiM2NDc0OGI7XCI+TG9hZGluZ1x1MjAyNjwvcD48L2Rpdj4nO1xuXG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgc3R5bGU9XCJtYXgtd2lkdGg6ODIwcHg7bWFyZ2luOjAgYXV0bztwYWRkaW5nOjI0cHg7XCI+XG4gICAgICA8aDEgc3R5bGU9XCJmb250LXNpemU6MjJweDtmb250LXdlaWdodDo3MDA7Y29sb3I6IzFlMjkzYjttYXJnaW4tYm90dG9tOjZweDtcIj5cdUQ4M0RcdURDRTUgQWRkIEpvYiBEZXNjcmlwdGlvbjwvaDE+XG5cbiAgICAgIDxkaXYgc3R5bGU9XCJib3JkZXI6MXB4IHNvbGlkICNlMmU4ZjA7Ym9yZGVyLXJhZGl1czo4cHg7b3ZlcmZsb3c6dmlzaWJsZTtcIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2Y4ZmFmYztwYWRkaW5nOjEwcHggMTZweDtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZTJlOGYwO2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTNweDtjb2xvcjojNDc1NTY5O1wiPkFkZCBOZXcgSm9iIERlc2NyaXB0aW9uPC9kaXY+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nOjIwcHg7XCI+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtbWV0aG9kLXRhYnNcIiBzdHlsZT1cIm1hcmdpbi10b3A6MDtcIj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpbnB1dC10YWIgYWN0aXZlXCIgb25jbGljaz1cInN3aXRjaElucHV0TWV0aG9kKCdwYXN0ZScpXCI+XHVEODNEXHVEQ0REIFBhc3RlIFRleHQ8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpbnB1dC10YWJcIiBvbmNsaWNrPVwic3dpdGNoSW5wdXRNZXRob2QoJ3VybCcpXCI+XHVEODNEXHVERDE3IEZyb20gVVJMPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaW5wdXQtdGFiXCIgb25jbGljaz1cInN3aXRjaElucHV0TWV0aG9kKCdmaWxlJylcIj5cdUQ4M0RcdURDQzEgVXBsb2FkIEZpbGU8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1tZXRob2QgYWN0aXZlXCIgaWQ9XCJwYXN0ZS1tZXRob2RcIj5cbiAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD1cImpvYi10ZXh0LWlucHV0XCIgcGxhY2Vob2xkZXI9XCJQYXN0ZSB0aGUgam9iIGRlc2NyaXB0aW9uIGhlcmVcdTIwMjZcIiByb3dzPVwiMTJcIlxuICAgICAgICAgICAgICBhcmlhLXJlcXVpcmVkPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIGFyaWEtZGVzY3JpYmVkYnk9XCJwYXN0ZS1jaGFyLWNvdW50IHBhc3RlLWVycm9yXCJcbiAgICAgICAgICAgICAgb25ibHVyPVwiX3ZhbGlkYXRlUGFzdGVGaWVsZCgpXCIgb25pbnB1dD1cIl91cGRhdGVQYXN0ZUNoYXJDb3VudCgpXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDoxMDAlO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOjE0cHg7cGFkZGluZzoxMnB4O2JvcmRlcjoxcHggc29saWQgI2QxZDVkYjtib3JkZXItcmFkaXVzOjZweDtyZXNpemU6dmVydGljYWw7bWFyZ2luLXRvcDo4cHg7XCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJwYXN0ZS1jaGFyLWNvdW50XCIgYXJpYS1saXZlPVwicG9saXRlXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6MTJweDtjb2xvcjojOTRhM2I4O21hcmdpbi10b3A6NHB4O21pbi1oZWlnaHQ6MThweDtcIj48L2Rpdj5cbiAgICAgICAgICAgIDxzcGFuIGlkPVwicGFzdGUtZXJyb3JcIiBjbGFzcz1cImZpZWxkLWVycm9yXCIgYXJpYS1saXZlPVwicG9saXRlXCI+PC9zcGFuPlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6MTBweDtkaXNwbGF5OmZsZXg7Z2FwOjEycHg7XCI+XG4gICAgICAgICAgICAgIDxidXR0b24gb25jbGljaz1cInN1Ym1pdEpvYlRleHQoKVwiIGNsYXNzPVwiYnRuLXByaW1hcnlcIj5TdWJtaXQgSm9iIERlc2NyaXB0aW9uPC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b24gb25jbGljaz1cImNsZWFySm9iSW5wdXQoKVwiIGNsYXNzPVwiYnRuLXNlY29uZGFyeVwiPkNsZWFyPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1tZXRob2RcIiBpZD1cInVybC1tZXRob2RcIj5cbiAgICAgICAgICAgIDxwIHN0eWxlPVwibWFyZ2luOjhweCAwIDEwcHg7XCI+RW50ZXIgYSBVUkwgdG8gYXV0b21hdGljYWxseSBleHRyYWN0IHRoZSBqb2IgZGVzY3JpcHRpb246PC9wPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ1cmxcIiBpZD1cImpvYi11cmwtaW5wdXRcIiBwbGFjZWhvbGRlcj1cImh0dHBzOi8vY29tcGFueS5jb20vam9iLXBvc3RpbmdcIlxuICAgICAgICAgICAgICBhcmlhLXJlcXVpcmVkPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIGFyaWEtZGVzY3JpYmVkYnk9XCJ1cmwtZXJyb3JcIlxuICAgICAgICAgICAgICBvbmJsdXI9XCJfdmFsaWRhdGVVUkxGaWVsZCgpXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDoxMDAlO3BhZGRpbmc6MTJweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo2cHg7XCIgLz5cbiAgICAgICAgICAgIDxzcGFuIGlkPVwidXJsLWVycm9yXCIgY2xhc3M9XCJmaWVsZC1lcnJvclwiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOjEwcHg7ZGlzcGxheTpmbGV4O2dhcDoxMnB4O1wiPlxuICAgICAgICAgICAgICA8YnV0dG9uIG9uY2xpY2s9XCJmZXRjaEpvYkZyb21VUkwoKVwiIGNsYXNzPVwiYnRuLXByaW1hcnlcIj5GZXRjaCBKb2IgRGVzY3JpcHRpb248L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPVwiY2xlYXJVUkxJbnB1dCgpXCIgY2xhc3M9XCJidG4tc2Vjb25kYXJ5XCI+Q2xlYXI8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6MTRweDtkaXNwbGF5OmdyaWQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmciAxZnI7Z2FwOjEwcHg7Zm9udC1zaXplOjEzcHg7XCI+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmMGY5ZmY7Ym9yZGVyOjFweCBzb2xpZCAjMGVhNWU5O2JvcmRlci1yYWRpdXM6NnB4O3BhZGRpbmc6MTBweDtcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6NjAwO2NvbG9yOiMwMzY5YTE7bWFyZ2luLWJvdHRvbTo0cHg7XCI+XHUyNzA1IFdvcmtzIHdlbGwgd2l0aDo8L2Rpdj5cbiAgICAgICAgICAgICAgICA8dWwgc3R5bGU9XCJtYXJnaW46MDtwYWRkaW5nLWxlZnQ6MTZweDtjb2xvcjojMDM2OWExO2xpbmUtaGVpZ2h0OjEuNztcIj48bGk+Q29tcGFueSBjYXJlZXIgcGFnZXM8L2xpPjxsaT5BbmdlbExpc3QsIFJlbW90ZU9LPC9saT48bGk+R292ZXJubWVudCAmYW1wOyB1bml2ZXJzaXR5IHNpdGVzPC9saT48L3VsPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2ZlZjNjNztib3JkZXI6MXB4IHNvbGlkICNmNTllMGI7Ym9yZGVyLXJhZGl1czo2cHg7cGFkZGluZzoxMHB4O1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDo2MDA7Y29sb3I6IzkyNDAwZTttYXJnaW4tYm90dG9tOjRweDtcIj5cdTI2QTBcdUZFMEYgQ29weSBtYW51YWxseSBmcm9tOjwvZGl2PlxuICAgICAgICAgICAgICAgIDx1bCBzdHlsZT1cIm1hcmdpbjowO3BhZGRpbmctbGVmdDoxNnB4O2NvbG9yOiM5MjQwMGU7bGluZS1oZWlnaHQ6MS43O1wiPjxsaT48c3Ryb25nPkxpbmtlZEluPC9zdHJvbmc+IChsb2dpbiByZXF1aXJlZCk8L2xpPjxsaT48c3Ryb25nPkluZGVlZDwvc3Ryb25nPiAoYW50aS1ib3QpPC9saT48bGk+PHN0cm9uZz5HbGFzc2Rvb3I8L3N0cm9uZz4gKGF1dGggcmVxdWlyZWQpPC9saT48L3VsPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LW1ldGhvZFwiIGlkPVwiZmlsZS1tZXRob2RcIj5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJmaWxlLWRyb3Atem9uZVwiXG4gICAgICAgICAgICAgICAgIG9uZHJhZ292ZXI9XCJldmVudC5wcmV2ZW50RGVmYXVsdCgpOyB0aGlzLmNsYXNzTGlzdC5hZGQoJ2RyYWctb3ZlcicpXCJcbiAgICAgICAgICAgICAgICAgb25kcmFnbGVhdmU9XCJ0aGlzLmNsYXNzTGlzdC5yZW1vdmUoJ2RyYWctb3ZlcicpXCJcbiAgICAgICAgICAgICAgICAgb25kcm9wPVwiaGFuZGxlRmlsZURyb3AoZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgb25jbGljaz1cImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqb2ItZmlsZS1pbnB1dCcpLmNsaWNrKClcIlxuICAgICAgICAgICAgICAgICBzdHlsZT1cImJvcmRlcjoycHggZGFzaGVkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzozMnB4IDE2cHg7dGV4dC1hbGlnbjpjZW50ZXI7Y3Vyc29yOnBvaW50ZXI7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kIDAuMnMsYm9yZGVyLWNvbG9yIDAuMnM7bWFyZ2luOjhweCAwO1wiPlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjJyZW07bWFyZ2luLWJvdHRvbTo4cHg7XCI+XHVEODNEXHVEQ0M0PC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+RHJvcCBhIGZpbGUgaGVyZSwgb3IgY2xpY2sgdG8gYnJvd3NlPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC44NXJlbTtjb2xvcjojNjQ3NDhiO1wiPi50eHQgJm5ic3A7XHUwMEI3Jm5ic3A7IC5tZCAmbmJzcDtcdTAwQjcmbmJzcDsgLmh0bWwgJm5ic3A7XHUwMEI3Jm5ic3A7IC5wZGYgJm5ic3A7XHUwMEI3Jm5ic3A7IC5kb2N4ICZuYnNwO1x1MDBCNyZuYnNwOyAucnRmPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIGlkPVwiam9iLWZpbGUtaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6bm9uZVwiXG4gICAgICAgICAgICAgICAgICAgYWNjZXB0PVwiLnR4dCwubWQsLnJzdCwudGV4dCwuaHRtbCwuaHRtLC5wZGYsLmRvY3gsLmRvYywucnRmXCJcbiAgICAgICAgICAgICAgICAgICBhcmlhLWRlc2NyaWJlZGJ5PVwiZmlsZS11cGxvYWQtZXJyb3JcIlxuICAgICAgICAgICAgICAgICAgIG9uY2hhbmdlPVwiaGFuZGxlRmlsZVNlbGVjdGVkKHRoaXMuZmlsZXNbMF0pXCI+XG4gICAgICAgICAgICA8ZGl2IGlkPVwiZmlsZS1zZWxlY3RlZC1pbmZvXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7bWFyZ2luOjhweCAwO1wiPlxuICAgICAgICAgICAgICA8c3BhbiBpZD1cImZpbGUtc2VsZWN0ZWQtbmFtZVwiIHN0eWxlPVwiZm9udC13ZWlnaHQ6NjAwO1wiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gaWQ9XCJmaWxlLXNlbGVjdGVkLXNpemVcIiBzdHlsZT1cImNvbG9yOiM2NDc0OGI7bWFyZ2luLWxlZnQ6OHB4O1wiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPVwiY2xlYXJTZWxlY3RlZEZpbGUoKVwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6OHB4O2JhY2tncm91bmQ6bm9uZTtib3JkZXI6bm9uZTtjdXJzb3I6cG9pbnRlcjtjb2xvcjojNjQ3NDhiO1wiPlx1MjcxNTwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGlkPVwiZmlsZS11cGxvYWQtZXJyb3JcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtjb2xvcjojYzAzOTJiO21hcmdpbjo4cHggMDtmb250LXNpemU6MC44NXJlbTtcIj48L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJmaWxlLXNpemUtd2FybmluZ1wiIHN0eWxlPVwiZGlzcGxheTpub25lO2NvbG9yOiM5MjQwMGU7YmFja2dyb3VuZDojZmVmM2M3O2JvcmRlcjoxcHggc29saWQgI2ZjZDM0ZDtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjRweCA4cHg7bWFyZ2luOjRweCAwO2ZvbnQtc2l6ZTowLjg1cmVtO1wiPjwvZGl2PlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6OHB4O21hcmdpbi10b3A6NHB4O2FsaWduLWl0ZW1zOmNlbnRlcjtcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImZpbGUtdXBsb2FkLWJ0blwiIG9uY2xpY2s9XCJ1cGxvYWRKb2JGaWxlKClcIiBjbGFzcz1cImJ0bi1wcmltYXJ5XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+XHVEODNEXHVEQ0U0IFVzZSBUaGlzIEZpbGU8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGRpdiBpZD1cImZpbGUtdXBsb2FkLXNwaW5uZXJcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtmb250LXNpemU6MC44NXJlbTtjb2xvcjojNjQ3NDhiO1wiPlx1MjNGMyBQYXJzaW5nXHUyMDI2PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgO1xuICAvLyBTaG93IG1pbmltdW0tbGVuZ3RoIGhpbnQgaW1tZWRpYXRlbHkgb24gZmlyc3QgcmVuZGVyIChHQVAtMjg4KS5cbiAgX3VwZGF0ZVBhc3RlQ2hhckNvdW50KCk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gSW5wdXQgbWV0aG9kIHN3aXRjaGluZ1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIHN3aXRjaElucHV0TWV0aG9kKG1ldGhvZCkge1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuaW5wdXQtdGFiJykuZm9yRWFjaCh0YWIgPT4gdGFiLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpKTtcbiAgZXZlbnQudGFyZ2V0LmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5pbnB1dC1tZXRob2QnKS5mb3JFYWNoKHBhbmVsID0+IHBhbmVsLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobWV0aG9kICsgJy1tZXRob2QnKS5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBGaWxlIHVwbG9hZFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmxldCBfcGVuZGluZ1VwbG9hZEZpbGUgPSBudWxsO1xuXG5mdW5jdGlvbiBoYW5kbGVGaWxlRHJvcChldmVudCkge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmlsZS1kcm9wLXpvbmUnKS5jbGFzc0xpc3QucmVtb3ZlKCdkcmFnLW92ZXInKTtcbiAgY29uc3QgZmlsZSA9IGV2ZW50LmRhdGFUcmFuc2Zlci5maWxlc1swXTtcbiAgaWYgKGZpbGUpIGhhbmRsZUZpbGVTZWxlY3RlZChmaWxlKTtcbn1cblxuZnVuY3Rpb24gaGFuZGxlRmlsZVNlbGVjdGVkKGZpbGUpIHtcbiAgaWYgKCFmaWxlKSByZXR1cm47XG5cbiAgY29uc3Qgc2l6ZU1iICA9IChmaWxlLnNpemUgLyAoMTAyNCAqIDEwMjQpKS50b0ZpeGVkKDEpO1xuICBjb25zdCBzaXplU3RyID0gZmlsZS5zaXplID4gMTAyNCAqIDEwMjQgPyBgJHtzaXplTWJ9IE1CYCA6IGAkeyhmaWxlLnNpemUgLyAxMDI0KS50b0ZpeGVkKDEpfSBLQmA7XG4gIGNvbnN0IGVyckVsICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmlsZS11cGxvYWQtZXJyb3InKTtcbiAgY29uc3Qgd2FybkVsICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlLXNpemUtd2FybmluZycpO1xuXG4gIGNvbnN0IGFsbG93ZWRNaW1lcyA9IFsnYXBwbGljYXRpb24vcGRmJywgJ2FwcGxpY2F0aW9uL21zd29yZCcsXG4gICAgJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC53b3JkcHJvY2Vzc2luZ21sLmRvY3VtZW50JyxcbiAgICAndGV4dC9wbGFpbicsICd0ZXh0L2h0bWwnXTtcbiAgY29uc3QgYWxsb3dlZEV4dHMgID0gWycucGRmJywgJy5kb2MnLCAnLmRvY3gnLCAnLnR4dCcsICcuaHRtbCcsICcuaHRtJ107XG4gIGNvbnN0IGV4dCA9ICcuJyArIChmaWxlLm5hbWUuc3BsaXQoJy4nKS5wb3AoKSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgbWltZU9rID0gYWxsb3dlZE1pbWVzLnNvbWUobSA9PiBmaWxlLnR5cGUuc3RhcnRzV2l0aChtKSkgfHwgZmlsZS50eXBlID09PSAnJztcbiAgY29uc3QgZXh0T2sgID0gYWxsb3dlZEV4dHMuaW5jbHVkZXMoZXh0KTtcbiAgaWYgKCFtaW1lT2sgJiYgIWV4dE9rKSB7XG4gICAgZXJyRWwudGV4dENvbnRlbnQgICA9IGBVbnN1cHBvcnRlZCBmaWxlIHR5cGUgXCIke2V4dCB8fCBmaWxlLnR5cGV9XCIuIFN1cHBvcnRlZCBmb3JtYXRzOiBQREYsIFdvcmQgKC5kb2MvLmRvY3gpLCBwbGFpbiB0ZXh0LCBIVE1MLmA7XG4gICAgZXJyRWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgaWYgKHdhcm5FbCkgd2FybkVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGUtdXBsb2FkLWJ0bicpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGZpbGUuc2l6ZSA+IDIwICogMTAyNCAqIDEwMjQpIHtcbiAgICBlcnJFbC50ZXh0Q29udGVudCAgID0gYEZpbGUgaXMgdG9vIGxhcmdlICgke3NpemVNYn0gTUIpLiBNYXhpbXVtIGFsbG93ZWQgc2l6ZSBpcyAyMCBNQi5gO1xuICAgIGVyckVsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgIGlmICh3YXJuRWwpIHdhcm5FbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlLXVwbG9hZC1idG4nKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIF9wZW5kaW5nVXBsb2FkRmlsZSA9IGZpbGU7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlLXNlbGVjdGVkLW5hbWUnKS50ZXh0Q29udGVudCAgPSBmaWxlLm5hbWU7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlLXNlbGVjdGVkLXNpemUnKS50ZXh0Q29udGVudCAgPSBgKCR7c2l6ZVN0cn0pYDtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGUtc2VsZWN0ZWQtaW5mbycpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmlsZS11cGxvYWQtYnRuJykuc3R5bGUuZGlzcGxheSAgICA9ICdpbmxpbmUtYmxvY2snO1xuICBlcnJFbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gIGlmICh3YXJuRWwpIHtcbiAgICBpZiAoZmlsZS5zaXplID4gNSAqIDEwMjQgKiAxMDI0KSB7XG4gICAgICB3YXJuRWwudGV4dENvbnRlbnQgICA9IGBcdTI2QTAgTGFyZ2UgZmlsZSAoJHtzaXplTWJ9IE1CKSBcdTIwMTQgcGFyc2luZyBtYXkgdGFrZSBhIG1vbWVudC5gO1xuICAgICAgd2FybkVsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgIH0gZWxzZSB7XG4gICAgICB3YXJuRWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY2xlYXJTZWxlY3RlZEZpbGUoKSB7XG4gIF9wZW5kaW5nVXBsb2FkRmlsZSA9IG51bGw7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqb2ItZmlsZS1pbnB1dCcpLnZhbHVlID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlLXNlbGVjdGVkLWluZm8nKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmlsZS11cGxvYWQtYnRuJykuc3R5bGUuZGlzcGxheSAgID0gJ25vbmUnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmlsZS11cGxvYWQtZXJyb3InKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBjb25zdCB3YXJuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGUtc2l6ZS13YXJuaW5nJyk7XG4gIGlmICh3YXJuKSB3YXJuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwbG9hZEpvYkZpbGUoKSB7XG4gIGlmICghX3BlbmRpbmdVcGxvYWRGaWxlKSByZXR1cm47XG5cbiAgY29uc3QgZXJyRWwgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlLXVwbG9hZC1lcnJvcicpO1xuICBjb25zdCBzcGlubmVyICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGUtdXBsb2FkLXNwaW5uZXInKTtcbiAgY29uc3QgdXBsb2FkQnRuICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlLXVwbG9hZC1idG4nKTtcblxuICBlcnJFbC5zdHlsZS5kaXNwbGF5ICAgID0gJ25vbmUnO1xuICBzcGlubmVyLnN0eWxlLmRpc3BsYXkgID0gJ2lubGluZSc7XG4gIHVwbG9hZEJ0bi5kaXNhYmxlZCAgICAgPSB0cnVlO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ2ZpbGUnLCBfcGVuZGluZ1VwbG9hZEZpbGUpO1xuXG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKCcvYXBpL3VwbG9hZC1maWxlJywgeyBtZXRob2Q6ICdQT1NUJywgYm9keTogZm9ybURhdGEgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3AuanNvbigpO1xuXG4gICAgaWYgKCFyZXNwLm9rIHx8IGRhdGEuZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihkYXRhLm1lc3NhZ2UgfHwgZGF0YS5lcnJvciB8fCBgU2VydmVyIGVycm9yICR7cmVzcC5zdGF0dXN9YCk7XG4gICAgfVxuXG4gICAgY29uc3Qgam9iUmVzcCA9IGF3YWl0IGZldGNoKCcvYXBpL2pvYicsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGpvYl90ZXh0OiBkYXRhLnRleHQgfSlcbiAgICB9KTtcbiAgICBjb25zdCBqb2JEYXRhID0gYXdhaXQgam9iUmVzcC5qc29uKCk7XG4gICAgaWYgKCFqb2JSZXNwLm9rKSB0aHJvdyBuZXcgRXJyb3Ioam9iRGF0YS5lcnJvciB8fCAnRmFpbGVkIHRvIHByb2Nlc3Mgam9iIGRlc2NyaXB0aW9uJyk7XG5cbiAgICBpZiAoam9iRGF0YS5lcnJvcikge1xuICAgICAgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgJ0Vycm9yOiAnICsgam9iRGF0YS5lcnJvcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlTWFuYWdlci5zZXRUYWJEYXRhKCdqb2InLCBkYXRhLnRleHQpO1xuICAgICAgc2F2ZVRhYkRhdGEoKTtcbiAgICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIGBcdTI3MDUgSm9iIGRlc2NyaXB0aW9uIGxvYWRlZCBmcm9tIFwiJHtkYXRhLmZpbGVuYW1lfVwiICgke2RhdGEuY29udGVudF9sZW5ndGgudG9Mb2NhbGVTdHJpbmcoKX0gY2hhcnMpLmApO1xuICAgICAgYXdhaXQgYW5hbHl6ZUpvYigpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZXJyRWwudGV4dENvbnRlbnQgICA9IGVyci5tZXNzYWdlO1xuICAgIGVyckVsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICB9IGZpbmFsbHkge1xuICAgIHNwaW5uZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB1cGxvYWRCdG4uZGlzYWJsZWQgICAgPSBmYWxzZTtcbiAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFBhc3RlIHRleHQgc3VibWlzc2lvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IFBBU1RFX01JTl9DSEFSUyA9IDIwMDtcblxuZnVuY3Rpb24gX3VwZGF0ZVBhc3RlQ2hhckNvdW50KCkge1xuICBjb25zdCB2YWwgPSAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pvYi10ZXh0LWlucHV0Jyk/LnZhbHVlIHx8ICcnKS50cmltKCk7XG4gIGNvbnN0IGNvdW50RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGFzdGUtY2hhci1jb3VudCcpO1xuICBpZiAoIWNvdW50RWwpIHJldHVybjtcbiAgY29uc3QgbiA9IHZhbC5sZW5ndGg7XG4gIGlmIChuID09PSAwKSB7XG4gICAgY291bnRFbC5zdHlsZS5jb2xvciA9ICcjOTRhM2I4JztcbiAgICBjb3VudEVsLnRleHRDb250ZW50ID0gYFBhc3RlIHRoZSBmdWxsIGpvYiBkZXNjcmlwdGlvbiAobWluaW11bSAke1BBU1RFX01JTl9DSEFSU30gY2hhcmFjdGVycyBmb3IgYmVzdCByZXN1bHRzKWA7XG4gIH0gZWxzZSBpZiAobiA8IFBBU1RFX01JTl9DSEFSUykge1xuICAgIGNvdW50RWwuc3R5bGUuY29sb3IgPSAnI2VmNDQ0NCc7XG4gICAgY291bnRFbC50ZXh0Q29udGVudCA9IGAke259IC8gJHtQQVNURV9NSU5fQ0hBUlN9IG1pbmltdW0gXHUyMDE0IFRvbyBzaG9ydCwgYWltIGZvciBhdCBsZWFzdCAke1BBU1RFX01JTl9DSEFSU30gY2hhcmFjdGVyc2A7XG4gIH0gZWxzZSB7XG4gICAgY291bnRFbC5zdHlsZS5jb2xvciA9ICcjMTZhMzRhJztcbiAgICBjb3VudEVsLnRleHRDb250ZW50ID0gYCR7bn0gLyAke1BBU1RFX01JTl9DSEFSU30gbWluaW11bSBcdTI3MTNgO1xuICB9XG59XG5cbmZ1bmN0aW9uIF92YWxpZGF0ZVBhc3RlRmllbGQoKSB7XG4gIGNvbnN0IHZhbCA9IChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnam9iLXRleHQtaW5wdXQnKT8udmFsdWUgfHwgJycpLnRyaW0oKTtcbiAgX3VwZGF0ZVBhc3RlQ2hhckNvdW50KCk7XG4gIGlmICh2YWwubGVuZ3RoID4gMCAmJiB2YWwubGVuZ3RoIDwgUEFTVEVfTUlOX0NIQVJTKSB7XG4gICAgX3Nob3dGaWVsZEVycm9yKCdqb2ItdGV4dC1pbnB1dCcsICdwYXN0ZS1lcnJvcicsIGBKb2IgZGVzY3JpcHRpb24gaXMgdG9vIHNob3J0IFx1MjAxNCBwbGVhc2UgcGFzdGUgYXQgbGVhc3QgJHtQQVNURV9NSU5fQ0hBUlN9IGNoYXJhY3RlcnMuYCk7XG4gIH0gZWxzZSB7XG4gICAgX2NsZWFyRmllbGRFcnJvcignam9iLXRleHQtaW5wdXQnLCAncGFzdGUtZXJyb3InKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBzdWJtaXRKb2JUZXh0KCkge1xuICAvKiBkdWNrZmxvdzpcbiAgICogICBpZDogam9iX3VpX3N1Ym1pdF9saXZlXG4gICAqICAga2luZDogdWlcbiAgICogICB0aW1lc3RhbXA6ICcyMDI2LTAzLTMxVDEyOjQ5OjQ3WidcbiAgICogICBzdGF0dXM6IGxpdmVcbiAgICogICBoYW5kbGVzOlxuICAgKiAgIC0gdWk6am9iLWlucHV0LnN1Ym1pdC10ZXh0XG4gICAqICAgY2FsbHM6XG4gICAqICAgLSBQT1NUIC9hcGkvam9iXG4gICAqICAgLSBhbmFseXplSm9iXG4gICAqICAgcmVhZHM6XG4gICAqICAgLSBkb206I2pvYi10ZXh0LWlucHV0LnZhbHVlXG4gICAqICAgd3JpdGVzOlxuICAgKiAgIC0gcmVxdWVzdDpQT1NUIC9hcGkvam9iLmpvYl90ZXh0XG4gICAqICAgLSB0YWI6am9iXG4gICAqICAgLSB1aTp3b3JrZmxvdy5qb2JcbiAgICogICBub3RlczogU3VibWl0cyBwYXN0ZWQgam9iIHRleHQgdG8gdGhlIGJhY2tlbmQsIGNhY2hlcyB0aGUgc2FtZSB0ZXh0IGluIHRhYiBzdGF0ZSwgdGhlbiBydW5zIGFuYWx5emVKb2IoKSBzbyBhbGwgam9iIHNvdXJjZXMgc2hhcmUgdGhlIHNhbWUgYW5hbHlzaXMgYW5kIGludGFrZSBmbG93LlxuICAgKi9cbiAgY29uc3QgdGV4dElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pvYi10ZXh0LWlucHV0Jyk7XG4gIGNvbnN0IGpvYlRleHQgPSB0ZXh0SW5wdXQudmFsdWUudHJpbSgpO1xuXG4gIGlmICgham9iVGV4dCkge1xuICAgIF9zaG93RmllbGRFcnJvcignam9iLXRleHQtaW5wdXQnLCAncGFzdGUtZXJyb3InLCAnUGxlYXNlIGVudGVyIGEgam9iIGRlc2NyaXB0aW9uIGJlZm9yZSBzdWJtaXR0aW5nLicpO1xuICAgIHRleHRJbnB1dC5mb2N1cygpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoam9iVGV4dC5sZW5ndGggPCBQQVNURV9NSU5fQ0hBUlMpIHtcbiAgICBfc2hvd0ZpZWxkRXJyb3IoJ2pvYi10ZXh0LWlucHV0JywgJ3Bhc3RlLWVycm9yJywgYEpvYiBkZXNjcmlwdGlvbiBpcyB0b28gc2hvcnQgXHUyMDE0IHBsZWFzZSBwYXN0ZSBhdCBsZWFzdCAke1BBU1RFX01JTl9DSEFSU30gY2hhcmFjdGVycy5gKTtcbiAgICB0ZXh0SW5wdXQuZm9jdXMoKTtcbiAgICByZXR1cm47XG4gIH1cbiAgX2NsZWFyRmllbGRFcnJvcignam9iLXRleHQtaW5wdXQnLCAncGFzdGUtZXJyb3InKTtcblxuICBzZXRMb2FkaW5nKHRydWUsICdBbmFseXNpbmcgam9iIGRlc2NyaXB0aW9uXHUyMDI2Jyk7XG4gIGFwcGVuZE1lc3NhZ2UoJ3VzZXInLCAnU3VibWl0dGluZyBqb2IgZGVzY3JpcHRpb24uLi4nKTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvam9iJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgam9iX3RleHQ6IGpvYlRleHQgfSlcbiAgICB9KTtcblxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICBpZiAoZGF0YS5lcnJvcikge1xuICAgICAgX3Nob3dGaWVsZEVycm9yKCdqb2ItdGV4dC1pbnB1dCcsICdwYXN0ZS1lcnJvcicsIGRhdGEuZXJyb3IpO1xuICAgICAgYXBwZW5kUmV0cnlNZXNzYWdlKCdcdTI3NEMgRXJyb3I6ICcgKyBkYXRhLmVycm9yLCBzdWJtaXRKb2JUZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgX2NsZWFyRmllbGRFcnJvcignam9iLXRleHQtaW5wdXQnLCAncGFzdGUtZXJyb3InKTtcbiAgICAgIHN0YXRlTWFuYWdlci5zZXRUYWJEYXRhKCdqb2InLCBqb2JUZXh0KTtcbiAgICAgIHNhdmVUYWJEYXRhKCk7XG4gICAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCAnXHUyNzA1IEpvYiBkZXNjcmlwdGlvbiBzdWJtaXR0ZWQgc3VjY2Vzc2Z1bGx5LicpO1xuXG4gICAgICBpZiAodHlwZW9mIHVwZGF0ZVRhYkJhckZvclN0YWdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHVwZGF0ZVRhYkJhckZvclN0YWdlKCdqb2InKTtcbiAgICAgIH1cbiAgICAgIHN3aXRjaFRhYignam9iJyk7XG4gICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICAgIGF3YWl0IGFuYWx5emVKb2IoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nLmVycm9yKCdFcnJvciBzdWJtaXR0aW5nIGpvYjonLCBlcnJvcik7XG4gICAgYXBwZW5kUmV0cnlNZXNzYWdlKCdcdTI3NEMgRXJyb3Igc3VibWl0dGluZyBqb2IgZGVzY3JpcHRpb246ICcgKyBlcnJvci5tZXNzYWdlLCBzdWJtaXRKb2JUZXh0KTtcbiAgfVxuXG4gIHNldExvYWRpbmcoZmFsc2UpO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFVSTCBmZXRjaFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIF92YWxpZGF0ZVVSTEZpZWxkKCkge1xuICBjb25zdCB2YWwgPSAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pvYi11cmwtaW5wdXQnKT8udmFsdWUgfHwgJycpLnRyaW0oKTtcbiAgaWYgKCF2YWwpIHsgX2NsZWFyRmllbGRFcnJvcignam9iLXVybC1pbnB1dCcsICd1cmwtZXJyb3InKTsgcmV0dXJuOyB9XG4gIHRyeSB7XG4gICAgY29uc3QgdSA9IG5ldyBVUkwodmFsKTtcbiAgICBpZiAoIVsnaHR0cDonLCAnaHR0cHM6J10uaW5jbHVkZXModS5wcm90b2NvbCkpIHRocm93IG5ldyBFcnJvcignUHJvdG9jb2wgbm90IGh0dHAvaHR0cHMnKTtcbiAgICBfY2xlYXJGaWVsZEVycm9yKCdqb2ItdXJsLWlucHV0JywgJ3VybC1lcnJvcicpO1xuICB9IGNhdGNoIHtcbiAgICBfc2hvd0ZpZWxkRXJyb3IoJ2pvYi11cmwtaW5wdXQnLCAndXJsLWVycm9yJywgJ1BsZWFzZSBlbnRlciBhIHZhbGlkIFVSTCBzdGFydGluZyB3aXRoIGh0dHBzOi8vIG9yIGh0dHA6Ly8nKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaEpvYkZyb21VUkwoKSB7XG4gIGNvbnN0IHVybElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pvYi11cmwtaW5wdXQnKTtcbiAgY29uc3QgdXJsID0gdXJsSW5wdXQudmFsdWUudHJpbSgpO1xuXG4gIGlmICghdXJsKSB7XG4gICAgX3Nob3dGaWVsZEVycm9yKCdqb2ItdXJsLWlucHV0JywgJ3VybC1lcnJvcicsICdQbGVhc2UgZW50ZXIgYSBVUkwgYmVmb3JlIGZldGNoaW5nLicpO1xuICAgIHVybElucHV0LmZvY3VzKCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgdSA9IG5ldyBVUkwodXJsKTtcbiAgICBpZiAoIVsnaHR0cDonLCAnaHR0cHM6J10uaW5jbHVkZXModS5wcm90b2NvbCkpIHRocm93IG5ldyBFcnJvcigpO1xuICAgIF9jbGVhckZpZWxkRXJyb3IoJ2pvYi11cmwtaW5wdXQnLCAndXJsLWVycm9yJyk7XG4gIH0gY2F0Y2gge1xuICAgIF9zaG93RmllbGRFcnJvcignam9iLXVybC1pbnB1dCcsICd1cmwtZXJyb3InLCAnUGxlYXNlIGVudGVyIGEgdmFsaWQgVVJMIHN0YXJ0aW5nIHdpdGggaHR0cHM6Ly8gb3IgaHR0cDovLycpO1xuICAgIHVybElucHV0LmZvY3VzKCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgc2V0TG9hZGluZyh0cnVlLCAnRmV0Y2hpbmcgam9iIGZyb20gVVJMXHUyMDI2Jyk7XG4gIGFwcGVuZE1lc3NhZ2UoJ3VzZXInLCBgRmV0Y2hpbmcgam9iIGRlc2NyaXB0aW9uIGZyb20gVVJMOiAke3VybH1gKTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvZmV0Y2gtam9iLXVybCcsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHVybDogdXJsIH0pXG4gICAgfSk7XG5cbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXG4gICAgaWYgKGRhdGEuZXJyb3IpIHtcbiAgICAgIGxldCBlcnJvck1lc3NhZ2UgPSBkYXRhLmVycm9yO1xuICAgICAgbGV0IGhlbHBNZXNzYWdlID0gZGF0YS5tZXNzYWdlIHx8ICcnO1xuXG4gICAgICBpZiAoZGF0YS5wcm90ZWN0ZWRfc2l0ZSkge1xuICAgICAgICBlcnJvck1lc3NhZ2UgPSBgJHtkYXRhLnNpdGVfbmFtZX0gUHJvdGVjdGlvbiBEZXRlY3RlZGA7XG4gICAgICAgIGhlbHBNZXNzYWdlID0gZGF0YS5tZXNzYWdlO1xuXG4gICAgICAgIGlmIChkYXRhLmluc3RydWN0aW9ucyAmJiBkYXRhLmluc3RydWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgaGVscE1lc3NhZ2UgKz0gJ1xcblxcbkhvdyB0byBwcm9jZWVkOlxcbicgKyBkYXRhLmluc3RydWN0aW9ucy5tYXAoKGluc3QsIGkpID0+IGAke2kgKyAxfS4gJHtpbnN0fWApLmpvaW4oJ1xcbicpO1xuICAgICAgICB9XG5cbiAgICAgICAgc2hvd1Byb3RlY3RlZFNpdGVNb2RhbChkYXRhLnNpdGVfbmFtZSwgZGF0YS5tZXNzYWdlLCBkYXRhLmluc3RydWN0aW9ucyk7XG4gICAgICB9IGVsc2UgaWYgKGRhdGEuaW5zdHJ1Y3Rpb25zKSB7XG4gICAgICAgIGhlbHBNZXNzYWdlICs9ICdcXG5cXG5TdWdnZXN0ZWQgc29sdXRpb25zOlxcbicgKyBkYXRhLmluc3RydWN0aW9ucy5tYXAoKGluc3QsIGkpID0+IGAke2kgKyAxfS4gJHtpbnN0fWApLmpvaW4oJ1xcbicpO1xuICAgICAgICBzaG93QWxlcnRNb2RhbCgnVVJMIEZldGNoIEVycm9yJywgYCR7ZXJyb3JNZXNzYWdlfVxcblxcbiR7aGVscE1lc3NhZ2V9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfc2hvd0ZpZWxkRXJyb3IoJ2pvYi11cmwtaW5wdXQnLCAndXJsLWVycm9yJywgZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgc2hvd0FsZXJ0TW9kYWwoJ0Vycm9yJywgYCR7ZXJyb3JNZXNzYWdlfSR7aGVscE1lc3NhZ2UgPyAnXFxuXFxuJyArIGhlbHBNZXNzYWdlIDogJyd9YCk7XG4gICAgICB9XG5cbiAgICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsIGBcdTI3NEMgJHtlcnJvck1lc3NhZ2V9OiAke2RhdGEubWVzc2FnZSB8fCAnUGxlYXNlIHRyeSBtYW51YWwgaW5wdXQuJ31gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGVNYW5hZ2VyLnNldFRhYkRhdGEoJ2pvYicsIGRhdGEuam9iX3RleHQpO1xuICAgICAgc2F2ZVRhYkRhdGEoKTtcbiAgICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIGBcdTI3MDUgJHtkYXRhLm1lc3NhZ2V9ISBGZXRjaGVkICR7ZGF0YS5jb250ZW50X2xlbmd0aCB8fCAnY29udGVudCd9IGNoYXJhY3RlcnMuIFJldmlldyB0aGUgam9iIGRlc2NyaXB0aW9uIGJlbG93LCB0aGVuIGNsaWNrIFwiXHVEODNEXHVERDBEIEFuYWx5c2UgSm9iXCIgdG8gY29udGludWUuYCk7XG4gICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICAgIHN3aXRjaFRhYignam9iJyk7XG4gICAgICBhd2FpdCBwb3B1bGF0ZUpvYlRhYigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cuZXJyb3IoJ0Vycm9yIGZldGNoaW5nIFVSTDonLCBlcnJvcik7XG4gICAgX3Nob3dGaWVsZEVycm9yKCdqb2ItdXJsLWlucHV0JywgJ3VybC1lcnJvcicsIGBOZXR3b3JrIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgYXBwZW5kUmV0cnlNZXNzYWdlKGBOZXR3b3JrIGVycm9yIG9jY3VycmVkOiAke2Vycm9yLm1lc3NhZ2V9LiBQbGVhc2UgY2hlY2sgeW91ciBjb25uZWN0aW9uIG9yIHRyeSBtYW51YWwgaW5wdXQuYCwgZmV0Y2hKb2JGcm9tVVJMKTtcbiAgICBzaG93QWxlcnRNb2RhbCgnTmV0d29yayBFcnJvcicsICdVbmFibGUgdG8gY29ubmVjdCB0byB0aGUgc2VydmVyLiBQbGVhc2UgdHJ5IGFnYWluIG9yIHVzZSB0aGUgXCJQYXN0ZSBUZXh0XCIgb3B0aW9uIHRvIGlucHV0IHRoZSBqb2IgZGVzY3JpcHRpb24gbWFudWFsbHkuJyk7XG4gIH1cblxuICBzZXRMb2FkaW5nKGZhbHNlKTtcbn1cblxuZnVuY3Rpb24gc2hvd1Byb3RlY3RlZFNpdGVNb2RhbChzaXRlTmFtZSwgbWVzc2FnZSwgaW5zdHJ1Y3Rpb25zKSB7XG4gIGxldCBpbnN0cnVjdGlvbnNMaXN0ID0gJyc7XG4gIGlmIChpbnN0cnVjdGlvbnMgJiYgaW5zdHJ1Y3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICBpbnN0cnVjdGlvbnNMaXN0ID0gJzxvbCBzdHlsZT1cIm1hcmdpbjogMTZweCAwOyBwYWRkaW5nLWxlZnQ6IDIwcHg7XCI+JyArXG4gICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zLm1hcChpbnN0ID0+IGA8bGkgc3R5bGU9XCJtYXJnaW46IDhweCAwO1wiPiR7aW5zdH08L2xpPmApLmpvaW4oJycpICtcbiAgICAgICAgICAgICAgICAgICAgICAnPC9vbD4nO1xuICB9XG5cbiAgY29uc3Qgc2FmZU5hbWUgPSBlc2NhcGVIdG1sKHNpdGVOYW1lKTtcbiAgY29uc3Qgc2FmZU1lc3NhZ2UgPSBlc2NhcGVIdG1sKG1lc3NhZ2UpO1xuICBjb25zdCBtb2RhbENvbnRlbnQgPSBgXG4gICAgPGRpdiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjsgbWFyZ2luLWJvdHRvbTogMTZweDtcIj5cbiAgICAgIFx1RDgzRFx1REQxMiA8c3Ryb25nPiR7c2FmZU5hbWV9IHJlcXVpcmVzIG1hbnVhbCBpbnB1dDwvc3Ryb25nPlxuICAgIDwvZGl2PlxuICAgIDxwPiR7c2FmZU1lc3NhZ2V9PC9wPlxuICAgICR7aW5zdHJ1Y3Rpb25zTGlzdH1cbiAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMjBweDsgcGFkZGluZzogMTJweDsgYmFja2dyb3VuZDogI2YwZjlmZjsgYm9yZGVyOiAxcHggc29saWQgIzBlYTVlOTsgYm9yZGVyLXJhZGl1czogNnB4O1wiPlxuICAgICAgPHN0cm9uZz5cdUQ4M0RcdURDQTEgVGlwOjwvc3Ryb25nPiBBZnRlciBjb3B5aW5nIHRoZSBqb2IgZGVzY3JpcHRpb24sIGNsaWNrIHRoZSBcIlBhc3RlIFRleHRcIiB0YWIgYWJvdmUgdG8gc3VibWl0IGl0IGRpcmVjdGx5LlxuICAgIDwvZGl2PlxuICBgO1xuXG4gIHNob3dBbGVydE1vZGFsKGAke3NhZmVOYW1lfSBJbnB1dCBSZXF1aXJlZGAsIG1vZGFsQ29udGVudCk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ2xlYXIgaGVscGVyc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIGNsZWFySm9iSW5wdXQoKSB7XG4gIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pvYi10ZXh0LWlucHV0Jyk7XG4gIGlmIChlbCkgZWwudmFsdWUgPSAnJztcbn1cblxuZnVuY3Rpb24gY2xlYXJVUkxJbnB1dCgpIHtcbiAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnam9iLXVybC1pbnB1dCcpO1xuICBpZiAoZWwpIGVsLnZhbHVlID0gJyc7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRmllbGQgZXJyb3IgaGVscGVyc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIF9zaG93RmllbGRFcnJvcihpbnB1dElkLCBlcnJvcklkLCBtc2cpIHtcbiAgY29uc3QgaW5wICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlucHV0SWQpO1xuICBjb25zdCBzcGFuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZXJyb3JJZCk7XG4gIGlmIChzcGFuKSAgeyBzcGFuLnRleHRDb250ZW50ID0gbXNnOyBzcGFuLmNsYXNzTGlzdC5hZGQoJ3Zpc2libGUnKTsgfVxuICBpZiAoaW5wKSAgIHtcbiAgICBpbnAuY2xhc3NMaXN0LmFkZCgnZmllbGQtaW52YWxpZCcpO1xuICAgIGlucC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaW52YWxpZCcsICd0cnVlJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2NsZWFyRmllbGRFcnJvcihpbnB1dElkLCBlcnJvcklkKSB7XG4gIGNvbnN0IGlucCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpbnB1dElkKTtcbiAgY29uc3Qgc3BhbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVycm9ySWQpO1xuICBpZiAoc3BhbikgIHsgc3Bhbi50ZXh0Q29udGVudCA9ICcnOyBzcGFuLmNsYXNzTGlzdC5yZW1vdmUoJ3Zpc2libGUnKTsgfVxuICBpZiAoaW5wKSAgIHtcbiAgICBpbnAuY2xhc3NMaXN0LnJlbW92ZSgnZmllbGQtaW52YWxpZCcpO1xuICAgIGlucC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaW52YWxpZCcsICdmYWxzZScpO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFUyBtb2R1bGUgZXhwb3J0cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmV4cG9ydCB7XG4gIHBvcHVsYXRlSm9iVGFiLFxuICBzaG93TG9hZEpvYlBhbmVsLFxuICBzd2l0Y2hJbnB1dE1ldGhvZCxcbiAgX3BlbmRpbmdVcGxvYWRGaWxlLFxuICBoYW5kbGVGaWxlRHJvcCxcbiAgaGFuZGxlRmlsZVNlbGVjdGVkLFxuICBjbGVhclNlbGVjdGVkRmlsZSxcbiAgdXBsb2FkSm9iRmlsZSxcbiAgUEFTVEVfTUlOX0NIQVJTLFxuICBfdXBkYXRlUGFzdGVDaGFyQ291bnQsXG4gIF92YWxpZGF0ZVBhc3RlRmllbGQsXG4gIHN1Ym1pdEpvYlRleHQsXG4gIF92YWxpZGF0ZVVSTEZpZWxkLFxuICBmZXRjaEpvYkZyb21VUkwsXG4gIHNob3dQcm90ZWN0ZWRTaXRlTW9kYWwsXG4gIGNsZWFySm9iSW5wdXQsXG4gIGNsZWFyVVJMSW5wdXQsXG4gIF9zaG93RmllbGRFcnJvcixcbiAgX2NsZWFyRmllbGRFcnJvcixcbn07XG4iLCAiaW1wb3J0IHR5cGUgeyBNYXJrZWRPcHRpb25zIH0gZnJvbSAnLi9NYXJrZWRPcHRpb25zLnRzJztcblxuLyoqXG4gKiBHZXRzIHRoZSBvcmlnaW5hbCBtYXJrZWQgZGVmYXVsdCBvcHRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gX2dldERlZmF1bHRzPFBhcnNlck91dHB1dCA9IHN0cmluZywgUmVuZGVyZXJPdXRwdXQgPSBzdHJpbmc+KCk6IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4ge1xuICByZXR1cm4ge1xuICAgIGFzeW5jOiBmYWxzZSxcbiAgICBicmVha3M6IGZhbHNlLFxuICAgIGV4dGVuc2lvbnM6IG51bGwsXG4gICAgZ2ZtOiB0cnVlLFxuICAgIGhvb2tzOiBudWxsLFxuICAgIHBlZGFudGljOiBmYWxzZSxcbiAgICByZW5kZXJlcjogbnVsbCxcbiAgICBzaWxlbnQ6IGZhbHNlLFxuICAgIHRva2VuaXplcjogbnVsbCxcbiAgICB3YWxrVG9rZW5zOiBudWxsLFxuICB9O1xufVxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBsZXQgX2RlZmF1bHRzOiBNYXJrZWRPcHRpb25zPGFueSwgYW55PiA9IF9nZXREZWZhdWx0cygpO1xuXG5leHBvcnQgZnVuY3Rpb24gY2hhbmdlRGVmYXVsdHM8UGFyc2VyT3V0cHV0ID0gc3RyaW5nLCBSZW5kZXJlck91dHB1dCA9IHN0cmluZz4obmV3RGVmYXVsdHM6IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4pIHtcbiAgX2RlZmF1bHRzID0gbmV3RGVmYXVsdHM7XG59XG4iLCAiY29uc3Qgbm9vcFRlc3QgPSB7IGV4ZWM6ICgpID0+IG51bGwgfSBhcyB1bmtub3duIGFzIFJlZ0V4cDtcblxuZnVuY3Rpb24gZWRpdChyZWdleDogc3RyaW5nIHwgUmVnRXhwLCBvcHQgPSAnJykge1xuICBsZXQgc291cmNlID0gdHlwZW9mIHJlZ2V4ID09PSAnc3RyaW5nJyA/IHJlZ2V4IDogcmVnZXguc291cmNlO1xuICBjb25zdCBvYmogPSB7XG4gICAgcmVwbGFjZTogKG5hbWU6IHN0cmluZyB8IFJlZ0V4cCwgdmFsOiBzdHJpbmcgfCBSZWdFeHApID0+IHtcbiAgICAgIGxldCB2YWxTb3VyY2UgPSB0eXBlb2YgdmFsID09PSAnc3RyaW5nJyA/IHZhbCA6IHZhbC5zb3VyY2U7XG4gICAgICB2YWxTb3VyY2UgPSB2YWxTb3VyY2UucmVwbGFjZShvdGhlci5jYXJldCwgJyQxJyk7XG4gICAgICBzb3VyY2UgPSBzb3VyY2UucmVwbGFjZShuYW1lLCB2YWxTb3VyY2UpO1xuICAgICAgcmV0dXJuIG9iajtcbiAgICB9LFxuICAgIGdldFJlZ2V4OiAoKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IFJlZ0V4cChzb3VyY2UsIG9wdCk7XG4gICAgfSxcbiAgfTtcbiAgcmV0dXJuIG9iajtcbn1cblxuY29uc3Qgc3VwcG9ydHNMb29rYmVoaW5kID0gKCgpID0+IHtcbnRyeSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItcmVnZXgtbGl0ZXJhbHNcbiAgcmV0dXJuICEhbmV3IFJlZ0V4cCgnKD88PTEpKD88ITEpJyk7XG59IGNhdGNoIHtcbiAgLy8gU2VlIGJyb3dzZXIgc3VwcG9ydCBoZXJlOlxuICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9SZWd1bGFyX2V4cHJlc3Npb25zL0xvb2tiZWhpbmRfYXNzZXJ0aW9uXG4gIHJldHVybiBmYWxzZTtcbn1cbn0pKCk7XG5cbmV4cG9ydCBjb25zdCBvdGhlciA9IHtcbiAgY29kZVJlbW92ZUluZGVudDogL14oPzogezEsNH18IHswLDN9XFx0KS9nbSxcbiAgb3V0cHV0TGlua1JlcGxhY2U6IC9cXFxcKFtcXFtcXF1dKS9nLFxuICBpbmRlbnRDb2RlQ29tcGVuc2F0aW9uOiAvXihcXHMrKSg/OmBgYCkvLFxuICBiZWdpbm5pbmdTcGFjZTogL15cXHMrLyxcbiAgZW5kaW5nSGFzaDogLyMkLyxcbiAgc3RhcnRpbmdTcGFjZUNoYXI6IC9eIC8sXG4gIGVuZGluZ1NwYWNlQ2hhcjogLyAkLyxcbiAgbm9uU3BhY2VDaGFyOiAvW14gXS8sXG4gIG5ld0xpbmVDaGFyR2xvYmFsOiAvXFxuL2csXG4gIHRhYkNoYXJHbG9iYWw6IC9cXHQvZyxcbiAgbXVsdGlwbGVTcGFjZUdsb2JhbDogL1xccysvZyxcbiAgYmxhbmtMaW5lOiAvXlsgXFx0XSokLyxcbiAgZG91YmxlQmxhbmtMaW5lOiAvXFxuWyBcXHRdKlxcblsgXFx0XSokLyxcbiAgYmxvY2txdW90ZVN0YXJ0OiAvXiB7MCwzfT4vLFxuICBibG9ja3F1b3RlU2V0ZXh0UmVwbGFjZTogL1xcbiB7MCwzfSgoPzo9K3wtKykgKikoPz1cXG58JCkvZyxcbiAgYmxvY2txdW90ZVNldGV4dFJlcGxhY2UyOiAvXiB7MCwzfT5bIFxcdF0/L2dtLFxuICBsaXN0UmVwbGFjZU5lc3Rpbmc6IC9eIHsxLDR9KD89KCB7NH0pKlteIF0pL2csXG4gIGxpc3RJc1Rhc2s6IC9eXFxbWyB4WF1cXF0gK1xcUy8sXG4gIGxpc3RSZXBsYWNlVGFzazogL15cXFtbIHhYXVxcXSArLyxcbiAgbGlzdFRhc2tDaGVja2JveDogL1xcW1sgeFhdXFxdLyxcbiAgYW55TGluZTogL1xcbi4qXFxuLyxcbiAgaHJlZkJyYWNrZXRzOiAvXjwoLiopPiQvLFxuICB0YWJsZURlbGltaXRlcjogL1s6fF0vLFxuICB0YWJsZUFsaWduQ2hhcnM6IC9eXFx8fFxcfCAqJC9nLFxuICB0YWJsZVJvd0JsYW5rTGluZTogL1xcblsgXFx0XSokLyxcbiAgdGFibGVBbGlnblJpZ2h0OiAvXiAqLSs6ICokLyxcbiAgdGFibGVBbGlnbkNlbnRlcjogL14gKjotKzogKiQvLFxuICB0YWJsZUFsaWduTGVmdDogL14gKjotKyAqJC8sXG4gIHN0YXJ0QVRhZzogL148YSAvaSxcbiAgZW5kQVRhZzogL148XFwvYT4vaSxcbiAgc3RhcnRQcmVTY3JpcHRUYWc6IC9ePChwcmV8Y29kZXxrYmR8c2NyaXB0KShcXHN8PikvaSxcbiAgZW5kUHJlU2NyaXB0VGFnOiAvXjxcXC8ocHJlfGNvZGV8a2JkfHNjcmlwdCkoXFxzfD4pL2ksXG4gIHN0YXJ0QW5nbGVCcmFja2V0OiAvXjwvLFxuICBlbmRBbmdsZUJyYWNrZXQ6IC8+JC8sXG4gIHBlZGFudGljSHJlZlRpdGxlOiAvXihbXidcIl0qW15cXHNdKVxccysoWydcIl0pKC4qKVxcMi8sXG4gIHVuaWNvZGVBbHBoYU51bWVyaWM6IC9bXFxwe0x9XFxwe059XS91LFxuICBlc2NhcGVUZXN0OiAvWyY8PlwiJ10vLFxuICBlc2NhcGVSZXBsYWNlOiAvWyY8PlwiJ10vZyxcbiAgZXNjYXBlVGVzdE5vRW5jb2RlOiAvWzw+XCInXXwmKD8hKCNcXGR7MSw3fXwjW1h4XVthLWZBLUYwLTldezEsNn18XFx3Kyk7KS8sXG4gIGVzY2FwZVJlcGxhY2VOb0VuY29kZTogL1s8PlwiJ118Jig/ISgjXFxkezEsN318I1tYeF1bYS1mQS1GMC05XXsxLDZ9fFxcdyspOykvZyxcbiAgY2FyZXQ6IC8oXnxbXlxcW10pXFxeL2csXG4gIHBlcmNlbnREZWNvZGU6IC8lMjUvZyxcbiAgZmluZFBpcGU6IC9cXHwvZyxcbiAgc3BsaXRQaXBlOiAvIFxcfC8sXG4gIHNsYXNoUGlwZTogL1xcXFxcXHwvZyxcbiAgY2FycmlhZ2VSZXR1cm46IC9cXHJcXG58XFxyL2csXG4gIHNwYWNlTGluZTogL14gKyQvZ20sXG4gIG5vdFNwYWNlU3RhcnQ6IC9eXFxTKi8sXG4gIGVuZGluZ05ld2xpbmU6IC9cXG4kLyxcbiAgbGlzdEl0ZW1SZWdleDogKGJ1bGw6IHN0cmluZykgPT4gbmV3IFJlZ0V4cChgXiggezAsM30ke2J1bGx9KSgoPzpbXFx0IF1bXlxcXFxuXSopPyg/OlxcXFxufCQpKWApLFxuICBuZXh0QnVsbGV0UmVnZXg6IChpbmRlbnQ6IG51bWJlcikgPT4gbmV3IFJlZ0V4cChgXiB7MCwke01hdGgubWluKDMsIGluZGVudCAtIDEpfX0oPzpbKistXXxcXFxcZHsxLDl9Wy4pXSkoKD86WyBcXHRdW15cXFxcbl0qKT8oPzpcXFxcbnwkKSlgKSxcbiAgaHJSZWdleDogKGluZGVudDogbnVtYmVyKSA9PiBuZXcgUmVnRXhwKGBeIHswLCR7TWF0aC5taW4oMywgaW5kZW50IC0gMSl9fSgoPzotICopezMsfXwoPzpfICopezMsfXwoPzpcXFxcKiAqKXszLH0pKD86XFxcXG4rfCQpYCksXG4gIGZlbmNlc0JlZ2luUmVnZXg6IChpbmRlbnQ6IG51bWJlcikgPT4gbmV3IFJlZ0V4cChgXiB7MCwke01hdGgubWluKDMsIGluZGVudCAtIDEpfX0oPzpcXGBcXGBcXGB8fn5+KWApLFxuICBoZWFkaW5nQmVnaW5SZWdleDogKGluZGVudDogbnVtYmVyKSA9PiBuZXcgUmVnRXhwKGBeIHswLCR7TWF0aC5taW4oMywgaW5kZW50IC0gMSl9fSNgKSxcbiAgaHRtbEJlZ2luUmVnZXg6IChpbmRlbnQ6IG51bWJlcikgPT4gbmV3IFJlZ0V4cChgXiB7MCwke01hdGgubWluKDMsIGluZGVudCAtIDEpfX08KD86W2Etel0uKj58IS0tKWAsICdpJyksXG4gIGJsb2NrcXVvdGVCZWdpblJlZ2V4OiAoaW5kZW50OiBudW1iZXIpID0+IG5ldyBSZWdFeHAoYF4gezAsJHtNYXRoLm1pbigzLCBpbmRlbnQgLSAxKX19PmApLFxufTtcblxuLyoqXG4gKiBCbG9jay1MZXZlbCBHcmFtbWFyXG4gKi9cblxuY29uc3QgbmV3bGluZSA9IC9eKD86WyBcXHRdKig/OlxcbnwkKSkrLztcbmNvbnN0IGJsb2NrQ29kZSA9IC9eKCg/OiB7NH18IHswLDN9XFx0KVteXFxuXSsoPzpcXG4oPzpbIFxcdF0qKD86XFxufCQpKSopPykrLztcbmNvbnN0IGZlbmNlcyA9IC9eIHswLDN9KGB7Myx9KD89W15gXFxuXSooPzpcXG58JCkpfH57Myx9KShbXlxcbl0qKSg/OlxcbnwkKSg/OnwoW1xcc1xcU10qPykoPzpcXG58JCkpKD86IHswLDN9XFwxW35gXSogKig/PVxcbnwkKXwkKS87XG5jb25zdCBociA9IC9eIHswLDN9KCg/Oi1bXFx0IF0qKXszLH18KD86X1sgXFx0XSopezMsfXwoPzpcXCpbIFxcdF0qKXszLH0pKD86XFxuK3wkKS87XG5jb25zdCBoZWFkaW5nID0gL14gezAsM30oI3sxLDZ9KSg/PVxcc3wkKSguKikoPzpcXG4rfCQpLztcbmNvbnN0IGJ1bGxldCA9IC8gezAsM30oPzpbKistXXxcXGR7MSw5fVsuKV0pLztcbmNvbnN0IGxoZWFkaW5nQ29yZSA9IC9eKD8hYnVsbCB8YmxvY2tDb2RlfGZlbmNlc3xibG9ja3F1b3RlfGhlYWRpbmd8aHRtbHx0YWJsZSkoKD86LnxcXG4oPyFcXHMqP1xcbnxidWxsIHxibG9ja0NvZGV8ZmVuY2VzfGJsb2NrcXVvdGV8aGVhZGluZ3xodG1sfHRhYmxlKSkrPylcXG4gezAsM30oPSt8LSspICooPzpcXG4rfCQpLztcbmNvbnN0IGxoZWFkaW5nID0gZWRpdChsaGVhZGluZ0NvcmUpXG4gIC5yZXBsYWNlKC9idWxsL2csIGJ1bGxldCkgLy8gbGlzdHMgY2FuIGludGVycnVwdFxuICAucmVwbGFjZSgvYmxvY2tDb2RlL2csIC8oPzogezR9fCB7MCwzfVxcdCkvKSAvLyBpbmRlbnRlZCBjb2RlIGJsb2NrcyBjYW4gaW50ZXJydXB0XG4gIC5yZXBsYWNlKC9mZW5jZXMvZywgLyB7MCwzfSg/OmB7Myx9fH57Myx9KS8pIC8vIGZlbmNlZCBjb2RlIGJsb2NrcyBjYW4gaW50ZXJydXB0XG4gIC5yZXBsYWNlKC9ibG9ja3F1b3RlL2csIC8gezAsM30+LykgLy8gYmxvY2txdW90ZSBjYW4gaW50ZXJydXB0XG4gIC5yZXBsYWNlKC9oZWFkaW5nL2csIC8gezAsM30jezEsNn0vKSAvLyBBVFggaGVhZGluZyBjYW4gaW50ZXJydXB0XG4gIC5yZXBsYWNlKC9odG1sL2csIC8gezAsM308W15cXG4+XSs+XFxuLykgLy8gYmxvY2sgaHRtbCBjYW4gaW50ZXJydXB0XG4gIC5yZXBsYWNlKC9cXHx0YWJsZS9nLCAnJykgLy8gdGFibGUgbm90IGluIGNvbW1vbm1hcmtcbiAgLmdldFJlZ2V4KCk7XG5jb25zdCBsaGVhZGluZ0dmbSA9IGVkaXQobGhlYWRpbmdDb3JlKVxuICAucmVwbGFjZSgvYnVsbC9nLCBidWxsZXQpIC8vIGxpc3RzIGNhbiBpbnRlcnJ1cHRcbiAgLnJlcGxhY2UoL2Jsb2NrQ29kZS9nLCAvKD86IHs0fXwgezAsM31cXHQpLykgLy8gaW5kZW50ZWQgY29kZSBibG9ja3MgY2FuIGludGVycnVwdFxuICAucmVwbGFjZSgvZmVuY2VzL2csIC8gezAsM30oPzpgezMsfXx+ezMsfSkvKSAvLyBmZW5jZWQgY29kZSBibG9ja3MgY2FuIGludGVycnVwdFxuICAucmVwbGFjZSgvYmxvY2txdW90ZS9nLCAvIHswLDN9Pi8pIC8vIGJsb2NrcXVvdGUgY2FuIGludGVycnVwdFxuICAucmVwbGFjZSgvaGVhZGluZy9nLCAvIHswLDN9I3sxLDZ9LykgLy8gQVRYIGhlYWRpbmcgY2FuIGludGVycnVwdFxuICAucmVwbGFjZSgvaHRtbC9nLCAvIHswLDN9PFteXFxuPl0rPlxcbi8pIC8vIGJsb2NrIGh0bWwgY2FuIGludGVycnVwdFxuICAucmVwbGFjZSgvdGFibGUvZywgLyB7MCwzfVxcfD8oPzpbOlxcLSBdKlxcfCkrW1xcOlxcLSBdKlxcbi8pIC8vIHRhYmxlIGNhbiBpbnRlcnJ1cHRcbiAgLmdldFJlZ2V4KCk7XG5jb25zdCBfcGFyYWdyYXBoID0gL14oW15cXG5dKyg/Olxcbig/IWhyfGhlYWRpbmd8bGhlYWRpbmd8YmxvY2txdW90ZXxmZW5jZXN8bGlzdHxodG1sfHRhYmxlfCArXFxuKVteXFxuXSspKikvO1xuY29uc3QgYmxvY2tUZXh0ID0gL15bXlxcbl0rLztcbmNvbnN0IF9ibG9ja0xhYmVsID0gLyg/IVxccypcXF0pKD86XFxcXFtcXHNcXFNdfFteXFxbXFxdXFxcXF0pKy87XG5jb25zdCBkZWYgPSBlZGl0KC9eIHswLDN9XFxbKGxhYmVsKVxcXTogKig/OlxcblsgXFx0XSopPyhbXjxcXHNdW15cXHNdKnw8Lio/PikoPzooPzogKyg/OlxcblsgXFx0XSopP3wgKlxcblsgXFx0XSopKHRpdGxlKSk/ICooPzpcXG4rfCQpLylcbiAgLnJlcGxhY2UoJ2xhYmVsJywgX2Jsb2NrTGFiZWwpXG4gIC5yZXBsYWNlKCd0aXRsZScsIC8oPzpcIig/OlxcXFxcIj98W15cIlxcXFxdKSpcInwnW14nXFxuXSooPzpcXG5bXidcXG5dKykqXFxuPyd8XFwoW14oKV0qXFwpKS8pXG4gIC5nZXRSZWdleCgpO1xuXG5jb25zdCBsaXN0ID0gZWRpdCgvXihidWxsKShbIFxcdF1bXlxcbl0rPyk/KD86XFxufCQpLylcbiAgLnJlcGxhY2UoL2J1bGwvZywgYnVsbGV0KVxuICAuZ2V0UmVnZXgoKTtcblxuY29uc3QgX3RhZyA9ICdhZGRyZXNzfGFydGljbGV8YXNpZGV8YmFzZXxiYXNlZm9udHxibG9ja3F1b3RlfGJvZHl8Y2FwdGlvbidcbiAgKyAnfGNlbnRlcnxjb2x8Y29sZ3JvdXB8ZGR8ZGV0YWlsc3xkaWFsb2d8ZGlyfGRpdnxkbHxkdHxmaWVsZHNldHxmaWdjYXB0aW9uJ1xuICArICd8ZmlndXJlfGZvb3Rlcnxmb3JtfGZyYW1lfGZyYW1lc2V0fGhbMS02XXxoZWFkfGhlYWRlcnxocnxodG1sfGlmcmFtZSdcbiAgKyAnfGxlZ2VuZHxsaXxsaW5rfG1haW58bWVudXxtZW51aXRlbXxtZXRhfG5hdnxub2ZyYW1lc3xvbHxvcHRncm91cHxvcHRpb24nXG4gICsgJ3xwfHBhcmFtfHNlYXJjaHxzZWN0aW9ufHN1bW1hcnl8dGFibGV8dGJvZHl8dGR8dGZvb3R8dGh8dGhlYWR8dGl0bGUnXG4gICsgJ3x0cnx0cmFja3x1bCc7XG5jb25zdCBfY29tbWVudCA9IC88IS0tKD86LT8+fFtcXHNcXFNdKj8oPzotLT58JCkpLztcbmNvbnN0IGh0bWwgPSBlZGl0KFxuICAnXiB7MCwzfSg/OicgLy8gb3B0aW9uYWwgaW5kZW50YXRpb25cbisgJzwoc2NyaXB0fHByZXxzdHlsZXx0ZXh0YXJlYSlbXFxcXHM+XVtcXFxcc1xcXFxTXSo/KD86PC9cXFxcMT5bXlxcXFxuXSpcXFxcbit8JCknIC8vICgxKVxuKyAnfGNvbW1lbnRbXlxcXFxuXSooXFxcXG4rfCQpJyAvLyAoMilcbisgJ3w8XFxcXD9bXFxcXHNcXFxcU10qPyg/OlxcXFw/PlxcXFxuKnwkKScgLy8gKDMpXG4rICd8PCFbQS1aXVtcXFxcc1xcXFxTXSo/KD86PlxcXFxuKnwkKScgLy8gKDQpXG4rICd8PCFcXFxcW0NEQVRBXFxcXFtbXFxcXHNcXFxcU10qPyg/OlxcXFxdXFxcXF0+XFxcXG4qfCQpJyAvLyAoNSlcbisgJ3w8Lz8odGFnKSg/OiArfFxcXFxufC8/PilbXFxcXHNcXFxcU10qPyg/Oig/OlxcXFxuWyBcXHRdKikrXFxcXG58JCknIC8vICg2KVxuKyAnfDwoPyFzY3JpcHR8cHJlfHN0eWxlfHRleHRhcmVhKShbYS16XVtcXFxcdy1dKikoPzphdHRyaWJ1dGUpKj8gKi8/Pig/PVsgXFxcXHRdKig/OlxcXFxufCQpKVtcXFxcc1xcXFxTXSo/KD86KD86XFxcXG5bIFxcdF0qKStcXFxcbnwkKScgLy8gKDcpIG9wZW4gdGFnXG4rICd8PC8oPyFzY3JpcHR8cHJlfHN0eWxlfHRleHRhcmVhKVthLXpdW1xcXFx3LV0qXFxcXHMqPig/PVsgXFxcXHRdKig/OlxcXFxufCQpKVtcXFxcc1xcXFxTXSo/KD86KD86XFxcXG5bIFxcdF0qKStcXFxcbnwkKScgLy8gKDcpIGNsb3NpbmcgdGFnXG4rICcpJywgJ2knKVxuICAucmVwbGFjZSgnY29tbWVudCcsIF9jb21tZW50KVxuICAucmVwbGFjZSgndGFnJywgX3RhZylcbiAgLnJlcGxhY2UoJ2F0dHJpYnV0ZScsIC8gK1thLXpBLVo6X11bXFx3LjotXSooPzogKj0gKlwiW15cIlxcbl0qXCJ8ICo9IConW14nXFxuXSonfCAqPSAqW15cXHNcIic9PD5gXSspPy8pXG4gIC5nZXRSZWdleCgpO1xuXG5jb25zdCBwYXJhZ3JhcGggPSBlZGl0KF9wYXJhZ3JhcGgpXG4gIC5yZXBsYWNlKCdocicsIGhyKVxuICAucmVwbGFjZSgnaGVhZGluZycsICcgezAsM30jezEsNn0oPzpcXFxcc3wkKScpXG4gIC5yZXBsYWNlKCd8bGhlYWRpbmcnLCAnJykgLy8gc2V0ZXh0IGhlYWRpbmdzIGRvbid0IGludGVycnVwdCBjb21tb25tYXJrIHBhcmFncmFwaHNcbiAgLnJlcGxhY2UoJ3x0YWJsZScsICcnKVxuICAucmVwbGFjZSgnYmxvY2txdW90ZScsICcgezAsM30+JylcbiAgLnJlcGxhY2UoJ2ZlbmNlcycsICcgezAsM30oPzpgezMsfSg/PVteYFxcXFxuXSpcXFxcbil8fnszLH0pW15cXFxcbl0qXFxcXG4nKVxuICAucmVwbGFjZSgnbGlzdCcsICcgezAsM30oPzpbKistXXwxWy4pXSlbIFxcXFx0XScpIC8vIG9ubHkgbGlzdHMgc3RhcnRpbmcgZnJvbSAxIGNhbiBpbnRlcnJ1cHRcbiAgLnJlcGxhY2UoJ2h0bWwnLCAnPC8/KD86dGFnKSg/OiArfFxcXFxufC8/Pil8PCg/OnNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWF8IS0tKScpXG4gIC5yZXBsYWNlKCd0YWcnLCBfdGFnKSAvLyBwYXJzIGNhbiBiZSBpbnRlcnJ1cHRlZCBieSB0eXBlICg2KSBodG1sIGJsb2Nrc1xuICAuZ2V0UmVnZXgoKTtcblxuY29uc3QgYmxvY2txdW90ZSA9IGVkaXQoL14oIHswLDN9PiA/KHBhcmFncmFwaHxbXlxcbl0qKSg/OlxcbnwkKSkrLylcbiAgLnJlcGxhY2UoJ3BhcmFncmFwaCcsIHBhcmFncmFwaClcbiAgLmdldFJlZ2V4KCk7XG5cbi8qKlxuICogTm9ybWFsIEJsb2NrIEdyYW1tYXJcbiAqL1xuXG5jb25zdCBibG9ja05vcm1hbCA9IHtcbiAgYmxvY2txdW90ZSxcbiAgY29kZTogYmxvY2tDb2RlLFxuICBkZWYsXG4gIGZlbmNlcyxcbiAgaGVhZGluZyxcbiAgaHIsXG4gIGh0bWwsXG4gIGxoZWFkaW5nLFxuICBsaXN0LFxuICBuZXdsaW5lLFxuICBwYXJhZ3JhcGgsXG4gIHRhYmxlOiBub29wVGVzdCxcbiAgdGV4dDogYmxvY2tUZXh0LFxufTtcblxudHlwZSBCbG9ja0tleXMgPSBrZXlvZiB0eXBlb2YgYmxvY2tOb3JtYWw7XG5cbi8qKlxuICogR0ZNIEJsb2NrIEdyYW1tYXJcbiAqL1xuXG5jb25zdCBnZm1UYWJsZSA9IGVkaXQoXG4gICdeICooW15cXFxcbiBdLiopXFxcXG4nIC8vIEhlYWRlclxuKyAnIHswLDN9KCg/OlxcXFx8ICopPzo/LSs6PyAqKD86XFxcXHwgKjo/LSs6PyAqKSooPzpcXFxcfCAqKT8pJyAvLyBBbGlnblxuKyAnKD86XFxcXG4oKD86KD8hICpcXFxcbnxocnxoZWFkaW5nfGJsb2NrcXVvdGV8Y29kZXxmZW5jZXN8bGlzdHxodG1sKS4qKD86XFxcXG58JCkpKilcXFxcbip8JCknKSAvLyBDZWxsc1xuICAucmVwbGFjZSgnaHInLCBocilcbiAgLnJlcGxhY2UoJ2hlYWRpbmcnLCAnIHswLDN9I3sxLDZ9KD86XFxcXHN8JCknKVxuICAucmVwbGFjZSgnYmxvY2txdW90ZScsICcgezAsM30+JylcbiAgLnJlcGxhY2UoJ2NvZGUnLCAnKD86IHs0fXwgezAsM31cXHQpW15cXFxcbl0nKVxuICAucmVwbGFjZSgnZmVuY2VzJywgJyB7MCwzfSg/OmB7Myx9KD89W15gXFxcXG5dKlxcXFxuKXx+ezMsfSlbXlxcXFxuXSpcXFxcbicpXG4gIC5yZXBsYWNlKCdsaXN0JywgJyB7MCwzfSg/OlsqKy1dfDFbLildKVsgXFxcXHRdJykgLy8gb25seSBsaXN0cyBzdGFydGluZyBmcm9tIDEgY2FuIGludGVycnVwdFxuICAucmVwbGFjZSgnaHRtbCcsICc8Lz8oPzp0YWcpKD86ICt8XFxcXG58Lz8+KXw8KD86c2NyaXB0fHByZXxzdHlsZXx0ZXh0YXJlYXwhLS0pJylcbiAgLnJlcGxhY2UoJ3RhZycsIF90YWcpIC8vIHRhYmxlcyBjYW4gYmUgaW50ZXJydXB0ZWQgYnkgdHlwZSAoNikgaHRtbCBibG9ja3NcbiAgLmdldFJlZ2V4KCk7XG5cbmNvbnN0IGJsb2NrR2ZtOiBSZWNvcmQ8QmxvY2tLZXlzLCBSZWdFeHA+ID0ge1xuICAuLi5ibG9ja05vcm1hbCxcbiAgbGhlYWRpbmc6IGxoZWFkaW5nR2ZtLFxuICB0YWJsZTogZ2ZtVGFibGUsXG4gIHBhcmFncmFwaDogZWRpdChfcGFyYWdyYXBoKVxuICAgIC5yZXBsYWNlKCdocicsIGhyKVxuICAgIC5yZXBsYWNlKCdoZWFkaW5nJywgJyB7MCwzfSN7MSw2fSg/OlxcXFxzfCQpJylcbiAgICAucmVwbGFjZSgnfGxoZWFkaW5nJywgJycpIC8vIHNldGV4dCBoZWFkaW5ncyBkb24ndCBpbnRlcnJ1cHQgY29tbW9ubWFyayBwYXJhZ3JhcGhzXG4gICAgLnJlcGxhY2UoJ3RhYmxlJywgZ2ZtVGFibGUpIC8vIGludGVycnVwdCBwYXJhZ3JhcGhzIHdpdGggdGFibGVcbiAgICAucmVwbGFjZSgnYmxvY2txdW90ZScsICcgezAsM30+JylcbiAgICAucmVwbGFjZSgnZmVuY2VzJywgJyB7MCwzfSg/OmB7Myx9KD89W15gXFxcXG5dKlxcXFxuKXx+ezMsfSlbXlxcXFxuXSpcXFxcbicpXG4gICAgLnJlcGxhY2UoJ2xpc3QnLCAnIHswLDN9KD86WyorLV18MVsuKV0pWyBcXFxcdF0nKSAvLyBvbmx5IGxpc3RzIHN0YXJ0aW5nIGZyb20gMSBjYW4gaW50ZXJydXB0XG4gICAgLnJlcGxhY2UoJ2h0bWwnLCAnPC8/KD86dGFnKSg/OiArfFxcXFxufC8/Pil8PCg/OnNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWF8IS0tKScpXG4gICAgLnJlcGxhY2UoJ3RhZycsIF90YWcpIC8vIHBhcnMgY2FuIGJlIGludGVycnVwdGVkIGJ5IHR5cGUgKDYpIGh0bWwgYmxvY2tzXG4gICAgLmdldFJlZ2V4KCksXG59O1xuXG4vKipcbiAqIFBlZGFudGljIGdyYW1tYXIgKG9yaWdpbmFsIEpvaG4gR3J1YmVyJ3MgbG9vc2UgbWFya2Rvd24gc3BlY2lmaWNhdGlvbilcbiAqL1xuXG5jb25zdCBibG9ja1BlZGFudGljOiBSZWNvcmQ8QmxvY2tLZXlzLCBSZWdFeHA+ID0ge1xuICAuLi5ibG9ja05vcm1hbCxcbiAgaHRtbDogZWRpdChcbiAgICAnXiAqKD86Y29tbWVudCAqKD86XFxcXG58XFxcXHMqJCknXG4gICAgKyAnfDwodGFnKVtcXFxcc1xcXFxTXSs/PC9cXFxcMT4gKig/OlxcXFxuezIsfXxcXFxccyokKScgLy8gY2xvc2VkIHRhZ1xuICAgICsgJ3w8dGFnKD86XCJbXlwiXSpcInxcXCdbXlxcJ10qXFwnfFxcXFxzW15cXCdcIi8+XFxcXHNdKikqPy8/PiAqKD86XFxcXG57Mix9fFxcXFxzKiQpKScpXG4gICAgLnJlcGxhY2UoJ2NvbW1lbnQnLCBfY29tbWVudClcbiAgICAucmVwbGFjZSgvdGFnL2csICcoPyEoPzonXG4gICAgICArICdhfGVtfHN0cm9uZ3xzbWFsbHxzfGNpdGV8cXxkZm58YWJicnxkYXRhfHRpbWV8Y29kZXx2YXJ8c2FtcHxrYmR8c3ViJ1xuICAgICAgKyAnfHN1cHxpfGJ8dXxtYXJrfHJ1Ynl8cnR8cnB8YmRpfGJkb3xzcGFufGJyfHdicnxpbnN8ZGVsfGltZyknXG4gICAgICArICdcXFxcYilcXFxcdysoPyE6fFteXFxcXHdcXFxcc0BdKkApXFxcXGInKVxuICAgIC5nZXRSZWdleCgpLFxuICBkZWY6IC9eICpcXFsoW15cXF1dKylcXF06ICo8PyhbXlxccz5dKyk+Pyg/OiArKFtcIihdW15cXG5dK1tcIildKSk/ICooPzpcXG4rfCQpLyxcbiAgaGVhZGluZzogL14oI3sxLDZ9KSguKikoPzpcXG4rfCQpLyxcbiAgZmVuY2VzOiBub29wVGVzdCwgLy8gZmVuY2VzIG5vdCBzdXBwb3J0ZWRcbiAgbGhlYWRpbmc6IC9eKC4rPylcXG4gezAsM30oPSt8LSspICooPzpcXG4rfCQpLyxcbiAgcGFyYWdyYXBoOiBlZGl0KF9wYXJhZ3JhcGgpXG4gICAgLnJlcGxhY2UoJ2hyJywgaHIpXG4gICAgLnJlcGxhY2UoJ2hlYWRpbmcnLCAnICojezEsNn0gKlteXFxuXScpXG4gICAgLnJlcGxhY2UoJ2xoZWFkaW5nJywgbGhlYWRpbmcpXG4gICAgLnJlcGxhY2UoJ3x0YWJsZScsICcnKVxuICAgIC5yZXBsYWNlKCdibG9ja3F1b3RlJywgJyB7MCwzfT4nKVxuICAgIC5yZXBsYWNlKCd8ZmVuY2VzJywgJycpXG4gICAgLnJlcGxhY2UoJ3xsaXN0JywgJycpXG4gICAgLnJlcGxhY2UoJ3xodG1sJywgJycpXG4gICAgLnJlcGxhY2UoJ3x0YWcnLCAnJylcbiAgICAuZ2V0UmVnZXgoKSxcbn07XG5cbi8qKlxuICogSW5saW5lLUxldmVsIEdyYW1tYXJcbiAqL1xuXG5jb25zdCBlc2NhcGUgPSAvXlxcXFwoWyFcIiMkJSYnKCkqKyxcXC0uLzo7PD0+P0BcXFtcXF1cXFxcXl9ge3x9fl0pLztcbmNvbnN0IGlubGluZUNvZGUgPSAvXihgKykoW15gXXxbXmBdW1xcc1xcU10qP1teYF0pXFwxKD8hYCkvO1xuY29uc3QgYnIgPSAvXiggezIsfXxcXFxcKVxcbig/IVxccyokKS87XG5jb25zdCBpbmxpbmVUZXh0ID0gL14oYCt8W15gXSkoPzooPz0gezIsfVxcbil8W1xcc1xcU10qPyg/Oig/PVtcXFxcPCFcXFtgKl9dfFxcYl98JCl8W14gXSg/PSB7Mix9XFxuKSkpLztcblxuLy8gbGlzdCBvZiB1bmljb2RlIHB1bmN0dWF0aW9uIG1hcmtzLCBwbHVzIGFueSBtaXNzaW5nIGNoYXJhY3RlcnMgZnJvbSBDb21tb25NYXJrIHNwZWNcbmNvbnN0IF9wdW5jdHVhdGlvbiA9IC9bXFxwe1B9XFxwe1N9XS91O1xuY29uc3QgX3B1bmN0dWF0aW9uT3JTcGFjZSA9IC9bXFxzXFxwe1B9XFxwe1N9XS91O1xuY29uc3QgX25vdFB1bmN0dWF0aW9uT3JTcGFjZSA9IC9bXlxcc1xccHtQfVxccHtTfV0vdTtcbmNvbnN0IHB1bmN0dWF0aW9uID0gZWRpdCgvXigoPyFbKl9dKXB1bmN0U3BhY2UpLywgJ3UnKVxuICAucmVwbGFjZSgvcHVuY3RTcGFjZS9nLCBfcHVuY3R1YXRpb25PclNwYWNlKS5nZXRSZWdleCgpO1xuXG4vLyBHRk0gYWxsb3dzIH4gaW5zaWRlIHN0cm9uZyBhbmQgZW0gZm9yIHN0cmlrZXRocm91Z2hcbmNvbnN0IF9wdW5jdHVhdGlvbkdmbVN0cm9uZ0VtID0gLyg/IX4pW1xccHtQfVxccHtTfV0vdTtcbmNvbnN0IF9wdW5jdHVhdGlvbk9yU3BhY2VHZm1TdHJvbmdFbSA9IC8oPyF+KVtcXHNcXHB7UH1cXHB7U31dL3U7XG5jb25zdCBfbm90UHVuY3R1YXRpb25PclNwYWNlR2ZtU3Ryb25nRW0gPSAvKD86W15cXHNcXHB7UH1cXHB7U31dfH4pL3U7XG5cbi8vIHNlcXVlbmNlcyBlbSBzaG91bGQgc2tpcCBvdmVyIFt0aXRsZV0obGluayksIGBjb2RlYCwgPGh0bWw+XG5jb25zdCBibG9ja1NraXAgPSBlZGl0KC9saW5rfHByZWNvZGUtY29kZXxodG1sLywgJ2cnKVxuICAucmVwbGFjZSgnbGluaycsIC9cXFsoPzpbXlxcW1xcXWBdfCg/PGE+YCspW15gXStcXGs8YT4oPyFgKSkqP1xcXVxcKCg/OlxcXFxbXFxzXFxTXXxbXlxcXFxcXChcXCldfFxcKCg/OlxcXFxbXFxzXFxTXXxbXlxcXFxcXChcXCldKSpcXCkpKlxcKS8pXG4gIC5yZXBsYWNlKCdwcmVjb2RlLScsIHN1cHBvcnRzTG9va2JlaGluZCA/ICcoPzwhYCkoKScgOiAnKF5efFteYF0pJylcbiAgLnJlcGxhY2UoJ2NvZGUnLCAvKD88Yj5gKylbXmBdK1xcazxiPig/IWApLylcbiAgLnJlcGxhY2UoJ2h0bWwnLCAvPCg/ISApW148Pl0qPz4vKVxuICAuZ2V0UmVnZXgoKTtcblxuY29uc3QgZW1TdHJvbmdMRGVsaW1Db3JlID0gL14oPzpcXCorKD86KCg/IVxcKilwdW5jdCl8KFteXFxzKl0pKT8pfF5fKyg/OigoPyFfKXB1bmN0KXwoW15cXHNfXSkpPy87XG5cbmNvbnN0IGVtU3Ryb25nTERlbGltID0gZWRpdChlbVN0cm9uZ0xEZWxpbUNvcmUsICd1JylcbiAgLnJlcGxhY2UoL3B1bmN0L2csIF9wdW5jdHVhdGlvbilcbiAgLmdldFJlZ2V4KCk7XG5cbmNvbnN0IGVtU3Ryb25nTERlbGltR2ZtID0gZWRpdChlbVN0cm9uZ0xEZWxpbUNvcmUsICd1JylcbiAgLnJlcGxhY2UoL3B1bmN0L2csIF9wdW5jdHVhdGlvbkdmbVN0cm9uZ0VtKVxuICAuZ2V0UmVnZXgoKTtcblxuY29uc3QgZW1TdHJvbmdSRGVsaW1Bc3RDb3JlID1cbiAgJ15bXl8qXSo/X19bXl8qXSo/XFxcXCpbXl8qXSo/KD89X18pJyAvLyBTa2lwIG9ycGhhbiBpbnNpZGUgc3Ryb25nXG4rICd8W14qXSsoPz1bXipdKScgLy8gQ29uc3VtZSB0byBkZWxpbVxuKyAnfCg/IVxcXFwqKXB1bmN0KFxcXFwqKykoPz1bXFxcXHNdfCQpJyAvLyAoMSkgIyoqKiBjYW4gb25seSBiZSBhIFJpZ2h0IERlbGltaXRlclxuKyAnfG5vdFB1bmN0U3BhY2UoXFxcXCorKSg/IVxcXFwqKSg/PXB1bmN0U3BhY2V8JCknIC8vICgyKSBhKioqIywgYSoqKiBjYW4gb25seSBiZSBhIFJpZ2h0IERlbGltaXRlclxuKyAnfCg/IVxcXFwqKXB1bmN0U3BhY2UoXFxcXCorKSg/PW5vdFB1bmN0U3BhY2UpJyAvLyAoMykgIyoqKmEsICoqKmEgY2FuIG9ubHkgYmUgTGVmdCBEZWxpbWl0ZXJcbisgJ3xbXFxcXHNdKFxcXFwqKykoPyFcXFxcKikoPz1wdW5jdCknIC8vICg0KSAqKiojIGNhbiBvbmx5IGJlIExlZnQgRGVsaW1pdGVyXG4rICd8KD8hXFxcXCopcHVuY3QoXFxcXCorKSg/IVxcXFwqKSg/PXB1bmN0KScgLy8gKDUpICMqKiojIGNhbiBiZSBlaXRoZXIgTGVmdCBvciBSaWdodCBEZWxpbWl0ZXJcbisgJ3xub3RQdW5jdFNwYWNlKFxcXFwqKykoPz1ub3RQdW5jdFNwYWNlKSc7IC8vICg2KSBhKioqYSBjYW4gYmUgZWl0aGVyIExlZnQgb3IgUmlnaHQgRGVsaW1pdGVyXG5cbmNvbnN0IGVtU3Ryb25nUkRlbGltQXN0ID0gZWRpdChlbVN0cm9uZ1JEZWxpbUFzdENvcmUsICdndScpXG4gIC5yZXBsYWNlKC9ub3RQdW5jdFNwYWNlL2csIF9ub3RQdW5jdHVhdGlvbk9yU3BhY2UpXG4gIC5yZXBsYWNlKC9wdW5jdFNwYWNlL2csIF9wdW5jdHVhdGlvbk9yU3BhY2UpXG4gIC5yZXBsYWNlKC9wdW5jdC9nLCBfcHVuY3R1YXRpb24pXG4gIC5nZXRSZWdleCgpO1xuXG5jb25zdCBlbVN0cm9uZ1JEZWxpbUFzdEdmbSA9IGVkaXQoZW1TdHJvbmdSRGVsaW1Bc3RDb3JlLCAnZ3UnKVxuICAucmVwbGFjZSgvbm90UHVuY3RTcGFjZS9nLCBfbm90UHVuY3R1YXRpb25PclNwYWNlR2ZtU3Ryb25nRW0pXG4gIC5yZXBsYWNlKC9wdW5jdFNwYWNlL2csIF9wdW5jdHVhdGlvbk9yU3BhY2VHZm1TdHJvbmdFbSlcbiAgLnJlcGxhY2UoL3B1bmN0L2csIF9wdW5jdHVhdGlvbkdmbVN0cm9uZ0VtKVxuICAuZ2V0UmVnZXgoKTtcblxuLy8gKDYpIE5vdCBhbGxvd2VkIGZvciBfXG5jb25zdCBlbVN0cm9uZ1JEZWxpbVVuZCA9IGVkaXQoXG4gICdeW15fKl0qP1xcXFwqXFxcXCpbXl8qXSo/X1teXypdKj8oPz1cXFxcKlxcXFwqKScgLy8gU2tpcCBvcnBoYW4gaW5zaWRlIHN0cm9uZ1xuKyAnfFteX10rKD89W15fXSknIC8vIENvbnN1bWUgdG8gZGVsaW1cbisgJ3woPyFfKXB1bmN0KF8rKSg/PVtcXFxcc118JCknIC8vICgxKSAjX19fIGNhbiBvbmx5IGJlIGEgUmlnaHQgRGVsaW1pdGVyXG4rICd8bm90UHVuY3RTcGFjZShfKykoPyFfKSg/PXB1bmN0U3BhY2V8JCknIC8vICgyKSBhX19fIywgYV9fXyBjYW4gb25seSBiZSBhIFJpZ2h0IERlbGltaXRlclxuKyAnfCg/IV8pcHVuY3RTcGFjZShfKykoPz1ub3RQdW5jdFNwYWNlKScgLy8gKDMpICNfX19hLCBfX19hIGNhbiBvbmx5IGJlIExlZnQgRGVsaW1pdGVyXG4rICd8W1xcXFxzXShfKykoPyFfKSg/PXB1bmN0KScgLy8gKDQpIF9fXyMgY2FuIG9ubHkgYmUgTGVmdCBEZWxpbWl0ZXJcbisgJ3woPyFfKXB1bmN0KF8rKSg/IV8pKD89cHVuY3QpJywgJ2d1JykgLy8gKDUpICNfX18jIGNhbiBiZSBlaXRoZXIgTGVmdCBvciBSaWdodCBEZWxpbWl0ZXJcbiAgLnJlcGxhY2UoL25vdFB1bmN0U3BhY2UvZywgX25vdFB1bmN0dWF0aW9uT3JTcGFjZSlcbiAgLnJlcGxhY2UoL3B1bmN0U3BhY2UvZywgX3B1bmN0dWF0aW9uT3JTcGFjZSlcbiAgLnJlcGxhY2UoL3B1bmN0L2csIF9wdW5jdHVhdGlvbilcbiAgLmdldFJlZ2V4KCk7XG5cbi8vIFRpbGRlIGxlZnQgZGVsaW1pdGVyIGZvciBzdHJpa2V0aHJvdWdoIChzaW1pbGFyIHRvIGVtU3Ryb25nTERlbGltIGZvciBhc3RlcmlzaylcbmNvbnN0IGRlbExEZWxpbSA9IGVkaXQoL15+fj8oPzooKD8hfilwdW5jdCl8W15cXHN+XSkvLCAndScpXG4gIC5yZXBsYWNlKC9wdW5jdC9nLCBfcHVuY3R1YXRpb24pXG4gIC5nZXRSZWdleCgpO1xuXG4vLyBUaWxkZSBkZWxpbWl0ZXIgcGF0dGVybnMgZm9yIHN0cmlrZXRocm91Z2ggKHNpbWlsYXIgdG8gYXN0ZXJpc2spXG5jb25zdCBkZWxSRGVsaW1Db3JlID1cbiAgJ15bXn5dKyg/PVtefl0pJyAvLyBDb25zdW1lIHRvIGRlbGltXG4rICd8KD8hfilwdW5jdCh+fj8pKD89W1xcXFxzXXwkKScgLy8gKDEpICN+fiBjYW4gb25seSBiZSBhIFJpZ2h0IERlbGltaXRlclxuKyAnfG5vdFB1bmN0U3BhY2Uofn4/KSg/IX4pKD89cHVuY3RTcGFjZXwkKScgLy8gKDIpIGF+fiMsIGF+fiBjYW4gb25seSBiZSBhIFJpZ2h0IERlbGltaXRlclxuKyAnfCg/IX4pcHVuY3RTcGFjZSh+fj8pKD89bm90UHVuY3RTcGFjZSknIC8vICgzKSAjfn5hLCB+fmEgY2FuIG9ubHkgYmUgTGVmdCBEZWxpbWl0ZXJcbisgJ3xbXFxcXHNdKH5+PykoPyF+KSg/PXB1bmN0KScgLy8gKDQpIH5+IyBjYW4gb25seSBiZSBMZWZ0IERlbGltaXRlclxuKyAnfCg/IX4pcHVuY3Qofn4/KSg/IX4pKD89cHVuY3QpJyAvLyAoNSkgI35+IyBjYW4gYmUgZWl0aGVyIExlZnQgb3IgUmlnaHQgRGVsaW1pdGVyXG4rICd8bm90UHVuY3RTcGFjZSh+fj8pKD89bm90UHVuY3RTcGFjZSknOyAvLyAoNikgYX5+YSBjYW4gYmUgZWl0aGVyIExlZnQgb3IgUmlnaHQgRGVsaW1pdGVyXG5cbmNvbnN0IGRlbFJEZWxpbSA9IGVkaXQoZGVsUkRlbGltQ29yZSwgJ2d1JylcbiAgLnJlcGxhY2UoL25vdFB1bmN0U3BhY2UvZywgX25vdFB1bmN0dWF0aW9uT3JTcGFjZSlcbiAgLnJlcGxhY2UoL3B1bmN0U3BhY2UvZywgX3B1bmN0dWF0aW9uT3JTcGFjZSlcbiAgLnJlcGxhY2UoL3B1bmN0L2csIF9wdW5jdHVhdGlvbilcbiAgLmdldFJlZ2V4KCk7XG5cbmNvbnN0IGFueVB1bmN0dWF0aW9uID0gZWRpdCgvXFxcXChwdW5jdCkvLCAnZ3UnKVxuICAucmVwbGFjZSgvcHVuY3QvZywgX3B1bmN0dWF0aW9uKVxuICAuZ2V0UmVnZXgoKTtcblxuY29uc3QgYXV0b2xpbmsgPSBlZGl0KC9ePChzY2hlbWU6W15cXHNcXHgwMC1cXHgxZjw+XSp8ZW1haWwpPi8pXG4gIC5yZXBsYWNlKCdzY2hlbWUnLCAvW2EtekEtWl1bYS16QS1aMC05Ky4tXXsxLDMxfS8pXG4gIC5yZXBsYWNlKCdlbWFpbCcsIC9bYS16QS1aMC05LiEjJCUmJyorLz0/Xl9ge3x9fi1dKyhAKVthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPyg/OlxcLlthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPykrKD8hWy1fXSkvKVxuICAuZ2V0UmVnZXgoKTtcblxuY29uc3QgX2lubGluZUNvbW1lbnQgPSBlZGl0KF9jb21tZW50KS5yZXBsYWNlKCcoPzotLT58JCknLCAnLS0+JykuZ2V0UmVnZXgoKTtcbmNvbnN0IHRhZyA9IGVkaXQoXG4gICdeY29tbWVudCdcbiAgICArICd8XjwvW2EtekEtWl1bXFxcXHc6LV0qXFxcXHMqPicgLy8gc2VsZi1jbG9zaW5nIHRhZ1xuICAgICsgJ3xePFthLXpBLVpdW1xcXFx3LV0qKD86YXR0cmlidXRlKSo/XFxcXHMqLz8+JyAvLyBvcGVuIHRhZ1xuICAgICsgJ3xePFxcXFw/W1xcXFxzXFxcXFNdKj9cXFxcPz4nIC8vIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24sIGUuZy4gPD9waHAgPz5cbiAgICArICd8XjwhW2EtekEtWl0rXFxcXHNbXFxcXHNcXFxcU10qPz4nIC8vIGRlY2xhcmF0aW9uLCBlLmcuIDwhRE9DVFlQRSBodG1sPlxuICAgICsgJ3xePCFcXFxcW0NEQVRBXFxcXFtbXFxcXHNcXFxcU10qP1xcXFxdXFxcXF0+JykgLy8gQ0RBVEEgc2VjdGlvblxuICAucmVwbGFjZSgnY29tbWVudCcsIF9pbmxpbmVDb21tZW50KVxuICAucmVwbGFjZSgnYXR0cmlidXRlJywgL1xccytbYS16QS1aOl9dW1xcdy46LV0qKD86XFxzKj1cXHMqXCJbXlwiXSpcInxcXHMqPVxccyonW14nXSonfFxccyo9XFxzKlteXFxzXCInPTw+YF0rKT8vKVxuICAuZ2V0UmVnZXgoKTtcblxuY29uc3QgX2lubGluZUxhYmVsID0gLyg/OlxcWyg/OlxcXFxbXFxzXFxTXXxbXlxcW1xcXVxcXFxdKSpcXF18XFxcXFtcXHNcXFNdfGArKD8hYClbXmBdKj9gKyg/IWApfGBgKyg/PVxcXSl8W15cXFtcXF1cXFxcYF0pKj8vO1xuXG5jb25zdCBsaW5rID0gZWRpdCgvXiE/XFxbKGxhYmVsKVxcXVxcKFxccyooaHJlZikoPzooPzpbIFxcdF0rKD86XFxuWyBcXHRdKik/fFxcblsgXFx0XSopKHRpdGxlKSk/XFxzKlxcKS8pXG4gIC5yZXBsYWNlKCdsYWJlbCcsIF9pbmxpbmVMYWJlbClcbiAgLnJlcGxhY2UoJ2hyZWYnLCAvPCg/OlxcXFwufFteXFxuPD5cXFxcXSkrPnxbXiBcXHRcXG5cXHgwMC1cXHgxZl0qLylcbiAgLnJlcGxhY2UoJ3RpdGxlJywgL1wiKD86XFxcXFwiP3xbXlwiXFxcXF0pKlwifCcoPzpcXFxcJz98W14nXFxcXF0pKid8XFwoKD86XFxcXFxcKT98W14pXFxcXF0pKlxcKS8pXG4gIC5nZXRSZWdleCgpO1xuXG5jb25zdCByZWZsaW5rID0gZWRpdCgvXiE/XFxbKGxhYmVsKVxcXVxcWyhyZWYpXFxdLylcbiAgLnJlcGxhY2UoJ2xhYmVsJywgX2lubGluZUxhYmVsKVxuICAucmVwbGFjZSgncmVmJywgX2Jsb2NrTGFiZWwpXG4gIC5nZXRSZWdleCgpO1xuXG5jb25zdCBub2xpbmsgPSBlZGl0KC9eIT9cXFsocmVmKVxcXSg/OlxcW1xcXSk/LylcbiAgLnJlcGxhY2UoJ3JlZicsIF9ibG9ja0xhYmVsKVxuICAuZ2V0UmVnZXgoKTtcblxuY29uc3QgcmVmbGlua1NlYXJjaCA9IGVkaXQoJ3JlZmxpbmt8bm9saW5rKD8hXFxcXCgpJywgJ2cnKVxuICAucmVwbGFjZSgncmVmbGluaycsIHJlZmxpbmspXG4gIC5yZXBsYWNlKCdub2xpbmsnLCBub2xpbmspXG4gIC5nZXRSZWdleCgpO1xuXG5jb25zdCBfY2FzZUluc2Vuc2l0aXZlUHJvdG9jb2wgPSAvW2hIXVt0VF1bdFRdW3BQXVtzU10/fFtmRl1bdFRdW3BQXS87XG5cbi8qKlxuICogTm9ybWFsIElubGluZSBHcmFtbWFyXG4gKi9cblxuY29uc3QgaW5saW5lTm9ybWFsID0ge1xuICBfYmFja3BlZGFsOiBub29wVGVzdCwgLy8gb25seSB1c2VkIGZvciBHRk0gdXJsXG4gIGFueVB1bmN0dWF0aW9uLFxuICBhdXRvbGluayxcbiAgYmxvY2tTa2lwLFxuICBicixcbiAgY29kZTogaW5saW5lQ29kZSxcbiAgZGVsOiBub29wVGVzdCxcbiAgZGVsTERlbGltOiBub29wVGVzdCxcbiAgZGVsUkRlbGltOiBub29wVGVzdCxcbiAgZW1TdHJvbmdMRGVsaW0sXG4gIGVtU3Ryb25nUkRlbGltQXN0LFxuICBlbVN0cm9uZ1JEZWxpbVVuZCxcbiAgZXNjYXBlLFxuICBsaW5rLFxuICBub2xpbmssXG4gIHB1bmN0dWF0aW9uLFxuICByZWZsaW5rLFxuICByZWZsaW5rU2VhcmNoLFxuICB0YWcsXG4gIHRleHQ6IGlubGluZVRleHQsXG4gIHVybDogbm9vcFRlc3QsXG59O1xuXG50eXBlIElubGluZUtleXMgPSBrZXlvZiB0eXBlb2YgaW5saW5lTm9ybWFsO1xuXG4vKipcbiAqIFBlZGFudGljIElubGluZSBHcmFtbWFyXG4gKi9cblxuY29uc3QgaW5saW5lUGVkYW50aWM6IFJlY29yZDxJbmxpbmVLZXlzLCBSZWdFeHA+ID0ge1xuICAuLi5pbmxpbmVOb3JtYWwsXG4gIGxpbms6IGVkaXQoL14hP1xcWyhsYWJlbClcXF1cXCgoLio/KVxcKS8pXG4gICAgLnJlcGxhY2UoJ2xhYmVsJywgX2lubGluZUxhYmVsKVxuICAgIC5nZXRSZWdleCgpLFxuICByZWZsaW5rOiBlZGl0KC9eIT9cXFsobGFiZWwpXFxdXFxzKlxcWyhbXlxcXV0qKVxcXS8pXG4gICAgLnJlcGxhY2UoJ2xhYmVsJywgX2lubGluZUxhYmVsKVxuICAgIC5nZXRSZWdleCgpLFxufTtcblxuLyoqXG4gKiBHRk0gSW5saW5lIEdyYW1tYXJcbiAqL1xuXG5jb25zdCBpbmxpbmVHZm06IFJlY29yZDxJbmxpbmVLZXlzLCBSZWdFeHA+ID0ge1xuICAuLi5pbmxpbmVOb3JtYWwsXG4gIGVtU3Ryb25nUkRlbGltQXN0OiBlbVN0cm9uZ1JEZWxpbUFzdEdmbSxcbiAgZW1TdHJvbmdMRGVsaW06IGVtU3Ryb25nTERlbGltR2ZtLFxuICBkZWxMRGVsaW0sXG4gIGRlbFJEZWxpbSxcbiAgdXJsOiBlZGl0KC9eKCg/OnByb3RvY29sKTpcXC9cXC98d3d3XFwuKSg/OlthLXpBLVowLTlcXC1dK1xcLj8pK1teXFxzPF0qfF5lbWFpbC8pXG4gICAgLnJlcGxhY2UoJ3Byb3RvY29sJywgX2Nhc2VJbnNlbnNpdGl2ZVByb3RvY29sKVxuICAgIC5yZXBsYWNlKCdlbWFpbCcsIC9bQS1aYS16MC05Ll8rLV0rKEApW2EtekEtWjAtOS1fXSsoPzpcXC5bYS16QS1aMC05LV9dKlthLXpBLVowLTldKSsoPyFbLV9dKS8pXG4gICAgLmdldFJlZ2V4KCksXG4gIF9iYWNrcGVkYWw6IC8oPzpbXj8hLiw6OypfJ1wifigpJl0rfFxcKFteKV0qXFwpfCYoPyFbYS16QS1aMC05XSs7JCl8Wz8hLiw6OypfJ1wifildKyg/ISQpKSsvLFxuICBkZWw6IC9eKH5+PykoPz1bXlxcc35dKSgoPzpcXFxcW1xcc1xcU118W15cXFxcXSkqPyg/OlxcXFxbXFxzXFxTXXxbXlxcc35cXFxcXSkpXFwxKD89W15+XXwkKS8sXG4gIHRleHQ6IGVkaXQoL14oW2B+XSt8W15gfl0pKD86KD89IHsyLH1cXG4pfCg/PVthLXpBLVowLTkuISMkJSYnKitcXC89P19ge1xcfH1+LV0rQCl8W1xcc1xcU10qPyg/Oig/PVtcXFxcPCFcXFtgKn5fXXxcXGJffHByb3RvY29sOlxcL1xcL3x3d3dcXC58JCl8W14gXSg/PSB7Mix9XFxuKXxbXmEtekEtWjAtOS4hIyQlJicqK1xcLz0/X2B7XFx8fX4tXSg/PVthLXpBLVowLTkuISMkJSYnKitcXC89P19ge1xcfH1+LV0rQCkpKS8pXG4gICAgLnJlcGxhY2UoJ3Byb3RvY29sJywgX2Nhc2VJbnNlbnNpdGl2ZVByb3RvY29sKVxuICAgIC5nZXRSZWdleCgpLFxufTtcblxuLyoqXG4gKiBHRk0gKyBMaW5lIEJyZWFrcyBJbmxpbmUgR3JhbW1hclxuICovXG5cbmNvbnN0IGlubGluZUJyZWFrczogUmVjb3JkPElubGluZUtleXMsIFJlZ0V4cD4gPSB7XG4gIC4uLmlubGluZUdmbSxcbiAgYnI6IGVkaXQoYnIpLnJlcGxhY2UoJ3syLH0nLCAnKicpLmdldFJlZ2V4KCksXG4gIHRleHQ6IGVkaXQoaW5saW5lR2ZtLnRleHQpXG4gICAgLnJlcGxhY2UoJ1xcXFxiXycsICdcXFxcYl98IHsyLH1cXFxcbicpXG4gICAgLnJlcGxhY2UoL1xcezIsXFx9L2csICcqJylcbiAgICAuZ2V0UmVnZXgoKSxcbn07XG5cbi8qKlxuICogZXhwb3J0c1xuICovXG5cbmV4cG9ydCBjb25zdCBibG9jayA9IHtcbiAgbm9ybWFsOiBibG9ja05vcm1hbCxcbiAgZ2ZtOiBibG9ja0dmbSxcbiAgcGVkYW50aWM6IGJsb2NrUGVkYW50aWMsXG59O1xuXG5leHBvcnQgY29uc3QgaW5saW5lID0ge1xuICBub3JtYWw6IGlubGluZU5vcm1hbCxcbiAgZ2ZtOiBpbmxpbmVHZm0sXG4gIGJyZWFrczogaW5saW5lQnJlYWtzLFxuICBwZWRhbnRpYzogaW5saW5lUGVkYW50aWMsXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFJ1bGVzIHtcbiAgb3RoZXI6IHR5cGVvZiBvdGhlclxuICBibG9jazogUmVjb3JkPEJsb2NrS2V5cywgUmVnRXhwPlxuICBpbmxpbmU6IFJlY29yZDxJbmxpbmVLZXlzLCBSZWdFeHA+XG59XG4iLCAiaW1wb3J0IHsgb3RoZXIgfSBmcm9tICcuL3J1bGVzLnRzJztcblxuLyoqXG4gKiBIZWxwZXJzXG4gKi9cbmNvbnN0IGVzY2FwZVJlcGxhY2VtZW50czogeyBbaW5kZXg6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAnJic6ICcmYW1wOycsXG4gICc8JzogJyZsdDsnLFxuICAnPic6ICcmZ3Q7JyxcbiAgJ1wiJzogJyZxdW90OycsXG4gIFwiJ1wiOiAnJiMzOTsnLFxufTtcbmNvbnN0IGdldEVzY2FwZVJlcGxhY2VtZW50ID0gKGNoOiBzdHJpbmcpID0+IGVzY2FwZVJlcGxhY2VtZW50c1tjaF07XG5cbmV4cG9ydCBmdW5jdGlvbiBlc2NhcGVIdG1sRW50aXRpZXMoaHRtbDogc3RyaW5nLCBlbmNvZGU/OiBib29sZWFuKSB7XG4gIGlmIChlbmNvZGUpIHtcbiAgICBpZiAob3RoZXIuZXNjYXBlVGVzdC50ZXN0KGh0bWwpKSB7XG4gICAgICByZXR1cm4gaHRtbC5yZXBsYWNlKG90aGVyLmVzY2FwZVJlcGxhY2UsIGdldEVzY2FwZVJlcGxhY2VtZW50KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKG90aGVyLmVzY2FwZVRlc3ROb0VuY29kZS50ZXN0KGh0bWwpKSB7XG4gICAgICByZXR1cm4gaHRtbC5yZXBsYWNlKG90aGVyLmVzY2FwZVJlcGxhY2VOb0VuY29kZSwgZ2V0RXNjYXBlUmVwbGFjZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBodG1sO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYW5VcmwoaHJlZjogc3RyaW5nKSB7XG4gIHRyeSB7XG4gICAgaHJlZiA9IGVuY29kZVVSSShocmVmKS5yZXBsYWNlKG90aGVyLnBlcmNlbnREZWNvZGUsICclJyk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBocmVmO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRDZWxscyh0YWJsZVJvdzogc3RyaW5nLCBjb3VudD86IG51bWJlcikge1xuICAvLyBlbnN1cmUgdGhhdCBldmVyeSBjZWxsLWRlbGltaXRpbmcgcGlwZSBoYXMgYSBzcGFjZVxuICAvLyBiZWZvcmUgaXQgdG8gZGlzdGluZ3Vpc2ggaXQgZnJvbSBhbiBlc2NhcGVkIHBpcGVcbiAgY29uc3Qgcm93ID0gdGFibGVSb3cucmVwbGFjZShvdGhlci5maW5kUGlwZSwgKG1hdGNoLCBvZmZzZXQsIHN0cikgPT4ge1xuICAgICAgbGV0IGVzY2FwZWQgPSBmYWxzZTtcbiAgICAgIGxldCBjdXJyID0gb2Zmc2V0O1xuICAgICAgd2hpbGUgKC0tY3VyciA+PSAwICYmIHN0cltjdXJyXSA9PT0gJ1xcXFwnKSBlc2NhcGVkID0gIWVzY2FwZWQ7XG4gICAgICBpZiAoZXNjYXBlZCkge1xuICAgICAgICAvLyBvZGQgbnVtYmVyIG9mIHNsYXNoZXMgbWVhbnMgfCBpcyBlc2NhcGVkXG4gICAgICAgIC8vIHNvIHdlIGxlYXZlIGl0IGFsb25lXG4gICAgICAgIHJldHVybiAnfCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBhZGQgc3BhY2UgYmVmb3JlIHVuZXNjYXBlZCB8XG4gICAgICAgIHJldHVybiAnIHwnO1xuICAgICAgfVxuICAgIH0pLFxuICAgIGNlbGxzID0gcm93LnNwbGl0KG90aGVyLnNwbGl0UGlwZSk7XG4gIGxldCBpID0gMDtcblxuICAvLyBGaXJzdC9sYXN0IGNlbGwgaW4gYSByb3cgY2Fubm90IGJlIGVtcHR5IGlmIGl0IGhhcyBubyBsZWFkaW5nL3RyYWlsaW5nIHBpcGVcbiAgaWYgKCFjZWxsc1swXS50cmltKCkpIHtcbiAgICBjZWxscy5zaGlmdCgpO1xuICB9XG4gIGlmIChjZWxscy5sZW5ndGggPiAwICYmICFjZWxscy5hdCgtMSk/LnRyaW0oKSkge1xuICAgIGNlbGxzLnBvcCgpO1xuICB9XG5cbiAgaWYgKGNvdW50KSB7XG4gICAgaWYgKGNlbGxzLmxlbmd0aCA+IGNvdW50KSB7XG4gICAgICBjZWxscy5zcGxpY2UoY291bnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB3aGlsZSAoY2VsbHMubGVuZ3RoIDwgY291bnQpIGNlbGxzLnB1c2goJycpO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoOyBpIDwgY2VsbHMubGVuZ3RoOyBpKyspIHtcbiAgICAvLyBsZWFkaW5nIG9yIHRyYWlsaW5nIHdoaXRlc3BhY2UgaXMgaWdub3JlZCBwZXIgdGhlIGdmbSBzcGVjXG4gICAgY2VsbHNbaV0gPSBjZWxsc1tpXS50cmltKCkucmVwbGFjZShvdGhlci5zbGFzaFBpcGUsICd8Jyk7XG4gIH1cbiAgcmV0dXJuIGNlbGxzO1xufVxuXG4vKipcbiAqIFJlbW92ZSB0cmFpbGluZyAnYydzLiBFcXVpdmFsZW50IHRvIHN0ci5yZXBsYWNlKC9jKiQvLCAnJykuXG4gKiAvYyokLyBpcyB2dWxuZXJhYmxlIHRvIFJFRE9TLlxuICpcbiAqIEBwYXJhbSBzdHJcbiAqIEBwYXJhbSBjXG4gKiBAcGFyYW0gaW52ZXJ0IFJlbW92ZSBzdWZmaXggb2Ygbm9uLWMgY2hhcnMgaW5zdGVhZC4gRGVmYXVsdCBmYWxzZXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydHJpbShzdHI6IHN0cmluZywgYzogc3RyaW5nLCBpbnZlcnQ/OiBib29sZWFuKSB7XG4gIGNvbnN0IGwgPSBzdHIubGVuZ3RoO1xuICBpZiAobCA9PT0gMCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIC8vIExlbmd0aCBvZiBzdWZmaXggbWF0Y2hpbmcgdGhlIGludmVydCBjb25kaXRpb24uXG4gIGxldCBzdWZmTGVuID0gMDtcblxuICAvLyBTdGVwIGxlZnQgdW50aWwgd2UgZmFpbCB0byBtYXRjaCB0aGUgaW52ZXJ0IGNvbmRpdGlvbi5cbiAgd2hpbGUgKHN1ZmZMZW4gPCBsKSB7XG4gICAgY29uc3QgY3VyckNoYXIgPSBzdHIuY2hhckF0KGwgLSBzdWZmTGVuIC0gMSk7XG4gICAgaWYgKGN1cnJDaGFyID09PSBjICYmICFpbnZlcnQpIHtcbiAgICAgIHN1ZmZMZW4rKztcbiAgICB9IGVsc2UgaWYgKGN1cnJDaGFyICE9PSBjICYmIGludmVydCkge1xuICAgICAgc3VmZkxlbisrO1xuICAgIH0gZWxzZSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3RyLnNsaWNlKDAsIGwgLSBzdWZmTGVuKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRDbG9zaW5nQnJhY2tldChzdHI6IHN0cmluZywgYjogc3RyaW5nKSB7XG4gIGlmIChzdHIuaW5kZXhPZihiWzFdKSA9PT0gLTEpIHtcbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICBsZXQgbGV2ZWwgPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgIGlmIChzdHJbaV0gPT09ICdcXFxcJykge1xuICAgICAgaSsrO1xuICAgIH0gZWxzZSBpZiAoc3RyW2ldID09PSBiWzBdKSB7XG4gICAgICBsZXZlbCsrO1xuICAgIH0gZWxzZSBpZiAoc3RyW2ldID09PSBiWzFdKSB7XG4gICAgICBsZXZlbC0tO1xuICAgICAgaWYgKGxldmVsIDwgMCkge1xuICAgICAgICByZXR1cm4gaTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKGxldmVsID4gMCkge1xuICAgIHJldHVybiAtMjtcbiAgfVxuXG4gIHJldHVybiAtMTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4cGFuZFRhYnMobGluZTogc3RyaW5nLCBpbmRlbnQgPSAwKSB7XG4gIGxldCBjb2wgPSBpbmRlbnQ7XG4gIGxldCBleHBhbmRlZCA9ICcnO1xuICBmb3IgKGNvbnN0IGNoYXIgb2YgbGluZSkge1xuICAgIGlmIChjaGFyID09PSAnXFx0Jykge1xuICAgICAgY29uc3QgYWRkZWQgPSA0IC0gKGNvbCAlIDQpO1xuICAgICAgZXhwYW5kZWQgKz0gJyAnLnJlcGVhdChhZGRlZCk7XG4gICAgICBjb2wgKz0gYWRkZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGV4cGFuZGVkICs9IGNoYXI7XG4gICAgICBjb2wrKztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXhwYW5kZWQ7XG59XG4iLCAiaW1wb3J0IHsgX2RlZmF1bHRzIH0gZnJvbSAnLi9kZWZhdWx0cy50cyc7XG5pbXBvcnQge1xuICBydHJpbSxcbiAgc3BsaXRDZWxscyxcbiAgZmluZENsb3NpbmdCcmFja2V0LFxuICBleHBhbmRUYWJzLFxufSBmcm9tICcuL2hlbHBlcnMudHMnO1xuaW1wb3J0IHR5cGUgeyBSdWxlcyB9IGZyb20gJy4vcnVsZXMudHMnO1xuaW1wb3J0IHR5cGUgeyBfTGV4ZXIgfSBmcm9tICcuL0xleGVyLnRzJztcbmltcG9ydCB0eXBlIHsgTGlua3MsIFRva2VucywgVG9rZW4gfSBmcm9tICcuL1Rva2Vucy50cyc7XG5pbXBvcnQgdHlwZSB7IE1hcmtlZE9wdGlvbnMgfSBmcm9tICcuL01hcmtlZE9wdGlvbnMudHMnO1xuXG5mdW5jdGlvbiBvdXRwdXRMaW5rKGNhcDogc3RyaW5nW10sIGxpbms6IFBpY2s8VG9rZW5zLkxpbmssICdocmVmJyB8ICd0aXRsZSc+LCByYXc6IHN0cmluZywgbGV4ZXI6IF9MZXhlciwgcnVsZXM6IFJ1bGVzKTogVG9rZW5zLkxpbmsgfCBUb2tlbnMuSW1hZ2Uge1xuICBjb25zdCBocmVmID0gbGluay5ocmVmO1xuICBjb25zdCB0aXRsZSA9IGxpbmsudGl0bGUgfHwgbnVsbDtcbiAgY29uc3QgdGV4dCA9IGNhcFsxXS5yZXBsYWNlKHJ1bGVzLm90aGVyLm91dHB1dExpbmtSZXBsYWNlLCAnJDEnKTtcblxuICBsZXhlci5zdGF0ZS5pbkxpbmsgPSB0cnVlO1xuICBjb25zdCB0b2tlbjogVG9rZW5zLkxpbmsgfCBUb2tlbnMuSW1hZ2UgPSB7XG4gICAgdHlwZTogY2FwWzBdLmNoYXJBdCgwKSA9PT0gJyEnID8gJ2ltYWdlJyA6ICdsaW5rJyxcbiAgICByYXcsXG4gICAgaHJlZixcbiAgICB0aXRsZSxcbiAgICB0ZXh0LFxuICAgIHRva2VuczogbGV4ZXIuaW5saW5lVG9rZW5zKHRleHQpLFxuICB9O1xuICBsZXhlci5zdGF0ZS5pbkxpbmsgPSBmYWxzZTtcbiAgcmV0dXJuIHRva2VuO1xufVxuXG5mdW5jdGlvbiBpbmRlbnRDb2RlQ29tcGVuc2F0aW9uKHJhdzogc3RyaW5nLCB0ZXh0OiBzdHJpbmcsIHJ1bGVzOiBSdWxlcykge1xuICBjb25zdCBtYXRjaEluZGVudFRvQ29kZSA9IHJhdy5tYXRjaChydWxlcy5vdGhlci5pbmRlbnRDb2RlQ29tcGVuc2F0aW9uKTtcblxuICBpZiAobWF0Y2hJbmRlbnRUb0NvZGUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gdGV4dDtcbiAgfVxuXG4gIGNvbnN0IGluZGVudFRvQ29kZSA9IG1hdGNoSW5kZW50VG9Db2RlWzFdO1xuXG4gIHJldHVybiB0ZXh0XG4gICAgLnNwbGl0KCdcXG4nKVxuICAgIC5tYXAobm9kZSA9PiB7XG4gICAgICBjb25zdCBtYXRjaEluZGVudEluTm9kZSA9IG5vZGUubWF0Y2gocnVsZXMub3RoZXIuYmVnaW5uaW5nU3BhY2UpO1xuICAgICAgaWYgKG1hdGNoSW5kZW50SW5Ob2RlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBbaW5kZW50SW5Ob2RlXSA9IG1hdGNoSW5kZW50SW5Ob2RlO1xuXG4gICAgICBpZiAoaW5kZW50SW5Ob2RlLmxlbmd0aCA+PSBpbmRlbnRUb0NvZGUubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBub2RlLnNsaWNlKGluZGVudFRvQ29kZS5sZW5ndGgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9KVxuICAgIC5qb2luKCdcXG4nKTtcbn1cblxuLyoqXG4gKiBUb2tlbml6ZXJcbiAqL1xuZXhwb3J0IGNsYXNzIF9Ub2tlbml6ZXI8UGFyc2VyT3V0cHV0ID0gc3RyaW5nLCBSZW5kZXJlck91dHB1dCA9IHN0cmluZz4ge1xuICBvcHRpb25zOiBNYXJrZWRPcHRpb25zPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+O1xuICBydWxlcyE6IFJ1bGVzOyAvLyBzZXQgYnkgdGhlIGxleGVyXG4gIGxleGVyITogX0xleGVyPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+OyAvLyBzZXQgYnkgdGhlIGxleGVyXG5cbiAgY29uc3RydWN0b3Iob3B0aW9ucz86IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4pIHtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IF9kZWZhdWx0cztcbiAgfVxuXG4gIHNwYWNlKHNyYzogc3RyaW5nKTogVG9rZW5zLlNwYWNlIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjYXAgPSB0aGlzLnJ1bGVzLmJsb2NrLm5ld2xpbmUuZXhlYyhzcmMpO1xuICAgIGlmIChjYXAgJiYgY2FwWzBdLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdzcGFjZScsXG4gICAgICAgIHJhdzogY2FwWzBdLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBjb2RlKHNyYzogc3RyaW5nKTogVG9rZW5zLkNvZGUgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuYmxvY2suY29kZS5leGVjKHNyYyk7XG4gICAgaWYgKGNhcCkge1xuICAgICAgY29uc3QgdGV4dCA9IGNhcFswXS5yZXBsYWNlKHRoaXMucnVsZXMub3RoZXIuY29kZVJlbW92ZUluZGVudCwgJycpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ2NvZGUnLFxuICAgICAgICByYXc6IGNhcFswXSxcbiAgICAgICAgY29kZUJsb2NrU3R5bGU6ICdpbmRlbnRlZCcsXG4gICAgICAgIHRleHQ6ICF0aGlzLm9wdGlvbnMucGVkYW50aWNcbiAgICAgICAgICA/IHJ0cmltKHRleHQsICdcXG4nKVxuICAgICAgICAgIDogdGV4dCxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgZmVuY2VzKHNyYzogc3RyaW5nKTogVG9rZW5zLkNvZGUgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuYmxvY2suZmVuY2VzLmV4ZWMoc3JjKTtcbiAgICBpZiAoY2FwKSB7XG4gICAgICBjb25zdCByYXcgPSBjYXBbMF07XG4gICAgICBjb25zdCB0ZXh0ID0gaW5kZW50Q29kZUNvbXBlbnNhdGlvbihyYXcsIGNhcFszXSB8fCAnJywgdGhpcy5ydWxlcyk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdjb2RlJyxcbiAgICAgICAgcmF3LFxuICAgICAgICBsYW5nOiBjYXBbMl0gPyBjYXBbMl0udHJpbSgpLnJlcGxhY2UodGhpcy5ydWxlcy5pbmxpbmUuYW55UHVuY3R1YXRpb24sICckMScpIDogY2FwWzJdLFxuICAgICAgICB0ZXh0LFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBoZWFkaW5nKHNyYzogc3RyaW5nKTogVG9rZW5zLkhlYWRpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuYmxvY2suaGVhZGluZy5leGVjKHNyYyk7XG4gICAgaWYgKGNhcCkge1xuICAgICAgbGV0IHRleHQgPSBjYXBbMl0udHJpbSgpO1xuXG4gICAgICAvLyByZW1vdmUgdHJhaWxpbmcgI3NcbiAgICAgIGlmICh0aGlzLnJ1bGVzLm90aGVyLmVuZGluZ0hhc2gudGVzdCh0ZXh0KSkge1xuICAgICAgICBjb25zdCB0cmltbWVkID0gcnRyaW0odGV4dCwgJyMnKTtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5wZWRhbnRpYykge1xuICAgICAgICAgIHRleHQgPSB0cmltbWVkLnRyaW0oKTtcbiAgICAgICAgfSBlbHNlIGlmICghdHJpbW1lZCB8fCB0aGlzLnJ1bGVzLm90aGVyLmVuZGluZ1NwYWNlQ2hhci50ZXN0KHRyaW1tZWQpKSB7XG4gICAgICAgICAgLy8gQ29tbW9uTWFyayByZXF1aXJlcyBzcGFjZSBiZWZvcmUgdHJhaWxpbmcgI3NcbiAgICAgICAgICB0ZXh0ID0gdHJpbW1lZC50cmltKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ2hlYWRpbmcnLFxuICAgICAgICByYXc6IGNhcFswXSxcbiAgICAgICAgZGVwdGg6IGNhcFsxXS5sZW5ndGgsXG4gICAgICAgIHRleHQsXG4gICAgICAgIHRva2VuczogdGhpcy5sZXhlci5pbmxpbmUodGV4dCksXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGhyKHNyYzogc3RyaW5nKTogVG9rZW5zLkhyIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjYXAgPSB0aGlzLnJ1bGVzLmJsb2NrLmhyLmV4ZWMoc3JjKTtcbiAgICBpZiAoY2FwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAnaHInLFxuICAgICAgICByYXc6IHJ0cmltKGNhcFswXSwgJ1xcbicpLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBibG9ja3F1b3RlKHNyYzogc3RyaW5nKTogVG9rZW5zLkJsb2NrcXVvdGUgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuYmxvY2suYmxvY2txdW90ZS5leGVjKHNyYyk7XG4gICAgaWYgKGNhcCkge1xuICAgICAgbGV0IGxpbmVzID0gcnRyaW0oY2FwWzBdLCAnXFxuJykuc3BsaXQoJ1xcbicpO1xuICAgICAgbGV0IHJhdyA9ICcnO1xuICAgICAgbGV0IHRleHQgPSAnJztcbiAgICAgIGNvbnN0IHRva2VuczogVG9rZW5bXSA9IFtdO1xuXG4gICAgICB3aGlsZSAobGluZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBsZXQgaW5CbG9ja3F1b3RlID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRMaW5lcyA9IFtdO1xuXG4gICAgICAgIGxldCBpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAvLyBnZXQgbGluZXMgdXAgdG8gYSBjb250aW51YXRpb25cbiAgICAgICAgICBpZiAodGhpcy5ydWxlcy5vdGhlci5ibG9ja3F1b3RlU3RhcnQudGVzdChsaW5lc1tpXSkpIHtcbiAgICAgICAgICAgIGN1cnJlbnRMaW5lcy5wdXNoKGxpbmVzW2ldKTtcbiAgICAgICAgICAgIGluQmxvY2txdW90ZSA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmICghaW5CbG9ja3F1b3RlKSB7XG4gICAgICAgICAgICBjdXJyZW50TGluZXMucHVzaChsaW5lc1tpXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsaW5lcyA9IGxpbmVzLnNsaWNlKGkpO1xuXG4gICAgICAgIGNvbnN0IGN1cnJlbnRSYXcgPSBjdXJyZW50TGluZXMuam9pbignXFxuJyk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRUZXh0ID0gY3VycmVudFJhd1xuICAgICAgICAgIC8vIHByZWNlZGUgc2V0ZXh0IGNvbnRpbnVhdGlvbiB3aXRoIDQgc3BhY2VzIHNvIGl0IGlzbid0IGEgc2V0ZXh0XG4gICAgICAgICAgLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5ibG9ja3F1b3RlU2V0ZXh0UmVwbGFjZSwgJ1xcbiAgICAkMScpXG4gICAgICAgICAgLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5ibG9ja3F1b3RlU2V0ZXh0UmVwbGFjZTIsICcnKTtcbiAgICAgICAgcmF3ID0gcmF3ID8gYCR7cmF3fVxcbiR7Y3VycmVudFJhd31gIDogY3VycmVudFJhdztcbiAgICAgICAgdGV4dCA9IHRleHQgPyBgJHt0ZXh0fVxcbiR7Y3VycmVudFRleHR9YCA6IGN1cnJlbnRUZXh0O1xuXG4gICAgICAgIC8vIHBhcnNlIGJsb2NrcXVvdGUgbGluZXMgYXMgdG9wIGxldmVsIHRva2Vuc1xuICAgICAgICAvLyBtZXJnZSBwYXJhZ3JhcGhzIGlmIHRoaXMgaXMgYSBjb250aW51YXRpb25cbiAgICAgICAgY29uc3QgdG9wID0gdGhpcy5sZXhlci5zdGF0ZS50b3A7XG4gICAgICAgIHRoaXMubGV4ZXIuc3RhdGUudG9wID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5sZXhlci5ibG9ja1Rva2VucyhjdXJyZW50VGV4dCwgdG9rZW5zLCB0cnVlKTtcbiAgICAgICAgdGhpcy5sZXhlci5zdGF0ZS50b3AgPSB0b3A7XG5cbiAgICAgICAgLy8gaWYgdGhlcmUgaXMgbm8gY29udGludWF0aW9uIHRoZW4gd2UgYXJlIGRvbmVcbiAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGFzdFRva2VuID0gdG9rZW5zLmF0KC0xKTtcblxuICAgICAgICBpZiAobGFzdFRva2VuPy50eXBlID09PSAnY29kZScpIHtcbiAgICAgICAgICAvLyBibG9ja3F1b3RlIGNvbnRpbnVhdGlvbiBjYW5ub3QgYmUgcHJlY2VkZWQgYnkgYSBjb2RlIGJsb2NrXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSBpZiAobGFzdFRva2VuPy50eXBlID09PSAnYmxvY2txdW90ZScpIHtcbiAgICAgICAgICAvLyBpbmNsdWRlIGNvbnRpbnVhdGlvbiBpbiBuZXN0ZWQgYmxvY2txdW90ZVxuICAgICAgICAgIGNvbnN0IG9sZFRva2VuID0gbGFzdFRva2VuIGFzIFRva2Vucy5CbG9ja3F1b3RlO1xuICAgICAgICAgIGNvbnN0IG5ld1RleHQgPSBvbGRUb2tlbi5yYXcgKyAnXFxuJyArIGxpbmVzLmpvaW4oJ1xcbicpO1xuICAgICAgICAgIGNvbnN0IG5ld1Rva2VuID0gdGhpcy5ibG9ja3F1b3RlKG5ld1RleHQpITtcbiAgICAgICAgICB0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdID0gbmV3VG9rZW47XG5cbiAgICAgICAgICByYXcgPSByYXcuc3Vic3RyaW5nKDAsIHJhdy5sZW5ndGggLSBvbGRUb2tlbi5yYXcubGVuZ3RoKSArIG5ld1Rva2VuLnJhdztcbiAgICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMCwgdGV4dC5sZW5ndGggLSBvbGRUb2tlbi50ZXh0Lmxlbmd0aCkgKyBuZXdUb2tlbi50ZXh0O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2UgaWYgKGxhc3RUb2tlbj8udHlwZSA9PT0gJ2xpc3QnKSB7XG4gICAgICAgICAgLy8gaW5jbHVkZSBjb250aW51YXRpb24gaW4gbmVzdGVkIGxpc3RcbiAgICAgICAgICBjb25zdCBvbGRUb2tlbiA9IGxhc3RUb2tlbiBhcyBUb2tlbnMuTGlzdDtcbiAgICAgICAgICBjb25zdCBuZXdUZXh0ID0gb2xkVG9rZW4ucmF3ICsgJ1xcbicgKyBsaW5lcy5qb2luKCdcXG4nKTtcbiAgICAgICAgICBjb25zdCBuZXdUb2tlbiA9IHRoaXMubGlzdChuZXdUZXh0KSE7XG4gICAgICAgICAgdG9rZW5zW3Rva2Vucy5sZW5ndGggLSAxXSA9IG5ld1Rva2VuO1xuXG4gICAgICAgICAgcmF3ID0gcmF3LnN1YnN0cmluZygwLCByYXcubGVuZ3RoIC0gbGFzdFRva2VuLnJhdy5sZW5ndGgpICsgbmV3VG9rZW4ucmF3O1xuICAgICAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cmluZygwLCB0ZXh0Lmxlbmd0aCAtIG9sZFRva2VuLnJhdy5sZW5ndGgpICsgbmV3VG9rZW4ucmF3O1xuICAgICAgICAgIGxpbmVzID0gbmV3VGV4dC5zdWJzdHJpbmcodG9rZW5zLmF0KC0xKSEucmF3Lmxlbmd0aCkuc3BsaXQoJ1xcbicpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdibG9ja3F1b3RlJyxcbiAgICAgICAgcmF3LFxuICAgICAgICB0b2tlbnMsXG4gICAgICAgIHRleHQsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGxpc3Qoc3JjOiBzdHJpbmcpOiBUb2tlbnMuTGlzdCB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGNhcCA9IHRoaXMucnVsZXMuYmxvY2subGlzdC5leGVjKHNyYyk7XG4gICAgaWYgKGNhcCkge1xuICAgICAgbGV0IGJ1bGwgPSBjYXBbMV0udHJpbSgpO1xuICAgICAgY29uc3QgaXNvcmRlcmVkID0gYnVsbC5sZW5ndGggPiAxO1xuXG4gICAgICBjb25zdCBsaXN0OiBUb2tlbnMuTGlzdCA9IHtcbiAgICAgICAgdHlwZTogJ2xpc3QnLFxuICAgICAgICByYXc6ICcnLFxuICAgICAgICBvcmRlcmVkOiBpc29yZGVyZWQsXG4gICAgICAgIHN0YXJ0OiBpc29yZGVyZWQgPyArYnVsbC5zbGljZSgwLCAtMSkgOiAnJyxcbiAgICAgICAgbG9vc2U6IGZhbHNlLFxuICAgICAgICBpdGVtczogW10sXG4gICAgICB9O1xuXG4gICAgICBidWxsID0gaXNvcmRlcmVkID8gYFxcXFxkezEsOX1cXFxcJHtidWxsLnNsaWNlKC0xKX1gIDogYFxcXFwke2J1bGx9YDtcblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5wZWRhbnRpYykge1xuICAgICAgICBidWxsID0gaXNvcmRlcmVkID8gYnVsbCA6ICdbKistXSc7XG4gICAgICB9XG5cbiAgICAgIC8vIEdldCBuZXh0IGxpc3QgaXRlbVxuICAgICAgY29uc3QgaXRlbVJlZ2V4ID0gdGhpcy5ydWxlcy5vdGhlci5saXN0SXRlbVJlZ2V4KGJ1bGwpO1xuICAgICAgbGV0IGVuZHNXaXRoQmxhbmtMaW5lID0gZmFsc2U7XG4gICAgICAvLyBDaGVjayBpZiBjdXJyZW50IGJ1bGxldCBwb2ludCBjYW4gc3RhcnQgYSBuZXcgTGlzdCBJdGVtXG4gICAgICB3aGlsZSAoc3JjKSB7XG4gICAgICAgIGxldCBlbmRFYXJseSA9IGZhbHNlO1xuICAgICAgICBsZXQgcmF3ID0gJyc7XG4gICAgICAgIGxldCBpdGVtQ29udGVudHMgPSAnJztcbiAgICAgICAgaWYgKCEoY2FwID0gaXRlbVJlZ2V4LmV4ZWMoc3JjKSkpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnJ1bGVzLmJsb2NrLmhyLnRlc3Qoc3JjKSkgeyAvLyBFbmQgbGlzdCBpZiBidWxsZXQgd2FzIGFjdHVhbGx5IEhSIChwb3NzaWJseSBtb3ZlIGludG8gaXRlbVJlZ2V4PylcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJhdyA9IGNhcFswXTtcbiAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyhyYXcubGVuZ3RoKTtcblxuICAgICAgICBsZXQgbGluZSA9IGV4cGFuZFRhYnMoY2FwWzJdLnNwbGl0KCdcXG4nLCAxKVswXSwgY2FwWzFdLmxlbmd0aCk7XG4gICAgICAgIGxldCBuZXh0TGluZSA9IHNyYy5zcGxpdCgnXFxuJywgMSlbMF07XG4gICAgICAgIGxldCBibGFua0xpbmUgPSAhbGluZS50cmltKCk7XG5cbiAgICAgICAgbGV0IGluZGVudCA9IDA7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMucGVkYW50aWMpIHtcbiAgICAgICAgICBpbmRlbnQgPSAyO1xuICAgICAgICAgIGl0ZW1Db250ZW50cyA9IGxpbmUudHJpbVN0YXJ0KCk7XG4gICAgICAgIH0gZWxzZSBpZiAoYmxhbmtMaW5lKSB7XG4gICAgICAgICAgaW5kZW50ID0gY2FwWzFdLmxlbmd0aCArIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaW5kZW50ID0gbGluZS5zZWFyY2godGhpcy5ydWxlcy5vdGhlci5ub25TcGFjZUNoYXIpOyAvLyBGaW5kIGZpcnN0IG5vbi1zcGFjZSBjaGFyXG4gICAgICAgICAgaW5kZW50ID0gaW5kZW50ID4gNCA/IDEgOiBpbmRlbnQ7IC8vIFRyZWF0IGluZGVudGVkIGNvZGUgYmxvY2tzICg+IDQgc3BhY2VzKSBhcyBoYXZpbmcgb25seSAxIGluZGVudFxuICAgICAgICAgIGl0ZW1Db250ZW50cyA9IGxpbmUuc2xpY2UoaW5kZW50KTtcbiAgICAgICAgICBpbmRlbnQgKz0gY2FwWzFdLmxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChibGFua0xpbmUgJiYgdGhpcy5ydWxlcy5vdGhlci5ibGFua0xpbmUudGVzdChuZXh0TGluZSkpIHsgLy8gSXRlbXMgYmVnaW4gd2l0aCBhdCBtb3N0IG9uZSBibGFuayBsaW5lXG4gICAgICAgICAgcmF3ICs9IG5leHRMaW5lICsgJ1xcbic7XG4gICAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyhuZXh0TGluZS5sZW5ndGggKyAxKTtcbiAgICAgICAgICBlbmRFYXJseSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWVuZEVhcmx5KSB7XG4gICAgICAgICAgY29uc3QgbmV4dEJ1bGxldFJlZ2V4ID0gdGhpcy5ydWxlcy5vdGhlci5uZXh0QnVsbGV0UmVnZXgoaW5kZW50KTtcbiAgICAgICAgICBjb25zdCBoclJlZ2V4ID0gdGhpcy5ydWxlcy5vdGhlci5oclJlZ2V4KGluZGVudCk7XG4gICAgICAgICAgY29uc3QgZmVuY2VzQmVnaW5SZWdleCA9IHRoaXMucnVsZXMub3RoZXIuZmVuY2VzQmVnaW5SZWdleChpbmRlbnQpO1xuICAgICAgICAgIGNvbnN0IGhlYWRpbmdCZWdpblJlZ2V4ID0gdGhpcy5ydWxlcy5vdGhlci5oZWFkaW5nQmVnaW5SZWdleChpbmRlbnQpO1xuICAgICAgICAgIGNvbnN0IGh0bWxCZWdpblJlZ2V4ID0gdGhpcy5ydWxlcy5vdGhlci5odG1sQmVnaW5SZWdleChpbmRlbnQpO1xuICAgICAgICAgIGNvbnN0IGJsb2NrcXVvdGVCZWdpblJlZ2V4ID0gdGhpcy5ydWxlcy5vdGhlci5ibG9ja3F1b3RlQmVnaW5SZWdleChpbmRlbnQpO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgZm9sbG93aW5nIGxpbmVzIHNob3VsZCBiZSBpbmNsdWRlZCBpbiBMaXN0IEl0ZW1cbiAgICAgICAgICB3aGlsZSAoc3JjKSB7XG4gICAgICAgICAgICBjb25zdCByYXdMaW5lID0gc3JjLnNwbGl0KCdcXG4nLCAxKVswXTtcbiAgICAgICAgICAgIGxldCBuZXh0TGluZVdpdGhvdXRUYWJzO1xuICAgICAgICAgICAgbmV4dExpbmUgPSByYXdMaW5lO1xuXG4gICAgICAgICAgICAvLyBSZS1hbGlnbiB0byBmb2xsb3cgY29tbW9ubWFyayBuZXN0aW5nIHJ1bGVzXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnBlZGFudGljKSB7XG4gICAgICAgICAgICAgIG5leHRMaW5lID0gbmV4dExpbmUucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLmxpc3RSZXBsYWNlTmVzdGluZywgJyAgJyk7XG4gICAgICAgICAgICAgIG5leHRMaW5lV2l0aG91dFRhYnMgPSBuZXh0TGluZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG5leHRMaW5lV2l0aG91dFRhYnMgPSBuZXh0TGluZS5yZXBsYWNlKHRoaXMucnVsZXMub3RoZXIudGFiQ2hhckdsb2JhbCwgJyAgICAnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRW5kIGxpc3QgaXRlbSBpZiBmb3VuZCBjb2RlIGZlbmNlc1xuICAgICAgICAgICAgaWYgKGZlbmNlc0JlZ2luUmVnZXgudGVzdChuZXh0TGluZSkpIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEVuZCBsaXN0IGl0ZW0gaWYgZm91bmQgc3RhcnQgb2YgbmV3IGhlYWRpbmdcbiAgICAgICAgICAgIGlmIChoZWFkaW5nQmVnaW5SZWdleC50ZXN0KG5leHRMaW5lKSkge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRW5kIGxpc3QgaXRlbSBpZiBmb3VuZCBzdGFydCBvZiBodG1sIGJsb2NrXG4gICAgICAgICAgICBpZiAoaHRtbEJlZ2luUmVnZXgudGVzdChuZXh0TGluZSkpIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEVuZCBsaXN0IGl0ZW0gaWYgZm91bmQgc3RhcnQgb2YgYmxvY2txdW90ZVxuICAgICAgICAgICAgaWYgKGJsb2NrcXVvdGVCZWdpblJlZ2V4LnRlc3QobmV4dExpbmUpKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBFbmQgbGlzdCBpdGVtIGlmIGZvdW5kIHN0YXJ0IG9mIG5ldyBidWxsZXRcbiAgICAgICAgICAgIGlmIChuZXh0QnVsbGV0UmVnZXgudGVzdChuZXh0TGluZSkpIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEhvcml6b250YWwgcnVsZSBmb3VuZFxuICAgICAgICAgICAgaWYgKGhyUmVnZXgudGVzdChuZXh0TGluZSkpIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChuZXh0TGluZVdpdGhvdXRUYWJzLnNlYXJjaCh0aGlzLnJ1bGVzLm90aGVyLm5vblNwYWNlQ2hhcikgPj0gaW5kZW50IHx8ICFuZXh0TGluZS50cmltKCkpIHsgLy8gRGVkZW50IGlmIHBvc3NpYmxlXG4gICAgICAgICAgICAgIGl0ZW1Db250ZW50cyArPSAnXFxuJyArIG5leHRMaW5lV2l0aG91dFRhYnMuc2xpY2UoaW5kZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIG5vdCBlbm91Z2ggaW5kZW50YXRpb25cbiAgICAgICAgICAgICAgaWYgKGJsYW5rTGluZSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gcGFyYWdyYXBoIGNvbnRpbnVhdGlvbiB1bmxlc3MgbGFzdCBsaW5lIHdhcyBhIGRpZmZlcmVudCBibG9jayBsZXZlbCBlbGVtZW50XG4gICAgICAgICAgICAgIGlmIChsaW5lLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci50YWJDaGFyR2xvYmFsLCAnICAgICcpLnNlYXJjaCh0aGlzLnJ1bGVzLm90aGVyLm5vblNwYWNlQ2hhcikgPj0gNCkgeyAvLyBpbmRlbnRlZCBjb2RlIGJsb2NrXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGZlbmNlc0JlZ2luUmVnZXgudGVzdChsaW5lKSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChoZWFkaW5nQmVnaW5SZWdleC50ZXN0KGxpbmUpKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGhyUmVnZXgudGVzdChsaW5lKSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaXRlbUNvbnRlbnRzICs9ICdcXG4nICsgbmV4dExpbmU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJsYW5rTGluZSA9ICFuZXh0TGluZS50cmltKCk7XG5cbiAgICAgICAgICAgIHJhdyArPSByYXdMaW5lICsgJ1xcbic7XG4gICAgICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHJhd0xpbmUubGVuZ3RoICsgMSk7XG4gICAgICAgICAgICBsaW5lID0gbmV4dExpbmVXaXRob3V0VGFicy5zbGljZShpbmRlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbGlzdC5sb29zZSkge1xuICAgICAgICAgIC8vIElmIHRoZSBwcmV2aW91cyBpdGVtIGVuZGVkIHdpdGggYSBibGFuayBsaW5lLCB0aGUgbGlzdCBpcyBsb29zZVxuICAgICAgICAgIGlmIChlbmRzV2l0aEJsYW5rTGluZSkge1xuICAgICAgICAgICAgbGlzdC5sb29zZSA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJ1bGVzLm90aGVyLmRvdWJsZUJsYW5rTGluZS50ZXN0KHJhdykpIHtcbiAgICAgICAgICAgIGVuZHNXaXRoQmxhbmtMaW5lID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsaXN0Lml0ZW1zLnB1c2goe1xuICAgICAgICAgIHR5cGU6ICdsaXN0X2l0ZW0nLFxuICAgICAgICAgIHJhdyxcbiAgICAgICAgICB0YXNrOiAhIXRoaXMub3B0aW9ucy5nZm0gJiYgdGhpcy5ydWxlcy5vdGhlci5saXN0SXNUYXNrLnRlc3QoaXRlbUNvbnRlbnRzKSxcbiAgICAgICAgICBsb29zZTogZmFsc2UsXG4gICAgICAgICAgdGV4dDogaXRlbUNvbnRlbnRzLFxuICAgICAgICAgIHRva2VuczogW10sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxpc3QucmF3ICs9IHJhdztcbiAgICAgIH1cblxuICAgICAgLy8gRG8gbm90IGNvbnN1bWUgbmV3bGluZXMgYXQgZW5kIG9mIGZpbmFsIGl0ZW0uIEFsdGVybmF0aXZlbHksIG1ha2UgaXRlbVJlZ2V4ICpzdGFydCogd2l0aCBhbnkgbmV3bGluZXMgdG8gc2ltcGxpZnkvc3BlZWQgdXAgZW5kc1dpdGhCbGFua0xpbmUgbG9naWNcbiAgICAgIGNvbnN0IGxhc3RJdGVtID0gbGlzdC5pdGVtcy5hdCgtMSk7XG4gICAgICBpZiAobGFzdEl0ZW0pIHtcbiAgICAgICAgbGFzdEl0ZW0ucmF3ID0gbGFzdEl0ZW0ucmF3LnRyaW1FbmQoKTtcbiAgICAgICAgbGFzdEl0ZW0udGV4dCA9IGxhc3RJdGVtLnRleHQudHJpbUVuZCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gbm90IGEgbGlzdCBzaW5jZSB0aGVyZSB3ZXJlIG5vIGl0ZW1zXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxpc3QucmF3ID0gbGlzdC5yYXcudHJpbUVuZCgpO1xuXG4gICAgICAvLyBJdGVtIGNoaWxkIHRva2VucyBoYW5kbGVkIGhlcmUgYXQgZW5kIGJlY2F1c2Ugd2UgbmVlZGVkIHRvIGhhdmUgdGhlIGZpbmFsIGl0ZW0gdG8gdHJpbSBpdCBmaXJzdFxuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGxpc3QuaXRlbXMpIHtcbiAgICAgICAgdGhpcy5sZXhlci5zdGF0ZS50b3AgPSBmYWxzZTtcbiAgICAgICAgaXRlbS50b2tlbnMgPSB0aGlzLmxleGVyLmJsb2NrVG9rZW5zKGl0ZW0udGV4dCwgW10pO1xuICAgICAgICBpZiAoaXRlbS50YXNrKSB7XG4gICAgICAgICAgLy8gUmVtb3ZlIGNoZWNrYm94IG1hcmtkb3duIGZyb20gaXRlbSB0b2tlbnNcbiAgICAgICAgICBpdGVtLnRleHQgPSBpdGVtLnRleHQucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLmxpc3RSZXBsYWNlVGFzaywgJycpO1xuICAgICAgICAgIGlmIChpdGVtLnRva2Vuc1swXT8udHlwZSA9PT0gJ3RleHQnIHx8IGl0ZW0udG9rZW5zWzBdPy50eXBlID09PSAncGFyYWdyYXBoJykge1xuICAgICAgICAgICAgaXRlbS50b2tlbnNbMF0ucmF3ID0gaXRlbS50b2tlbnNbMF0ucmF3LnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5saXN0UmVwbGFjZVRhc2ssICcnKTtcbiAgICAgICAgICAgIGl0ZW0udG9rZW5zWzBdLnRleHQgPSBpdGVtLnRva2Vuc1swXS50ZXh0LnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5saXN0UmVwbGFjZVRhc2ssICcnKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmxleGVyLmlubGluZVF1ZXVlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLnJ1bGVzLm90aGVyLmxpc3RJc1Rhc2sudGVzdCh0aGlzLmxleGVyLmlubGluZVF1ZXVlW2ldLnNyYykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxleGVyLmlubGluZVF1ZXVlW2ldLnNyYyA9IHRoaXMubGV4ZXIuaW5saW5lUXVldWVbaV0uc3JjLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5saXN0UmVwbGFjZVRhc2ssICcnKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHRhc2tSYXcgPSB0aGlzLnJ1bGVzLm90aGVyLmxpc3RUYXNrQ2hlY2tib3guZXhlYyhpdGVtLnJhdyk7XG4gICAgICAgICAgaWYgKHRhc2tSYXcpIHtcbiAgICAgICAgICAgIGNvbnN0IGNoZWNrYm94VG9rZW46IFRva2Vucy5DaGVja2JveCA9IHtcbiAgICAgICAgICAgICAgdHlwZTogJ2NoZWNrYm94JyxcbiAgICAgICAgICAgICAgcmF3OiB0YXNrUmF3WzBdICsgJyAnLFxuICAgICAgICAgICAgICBjaGVja2VkOiB0YXNrUmF3WzBdICE9PSAnWyBdJyxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpdGVtLmNoZWNrZWQgPSBjaGVja2JveFRva2VuLmNoZWNrZWQ7XG4gICAgICAgICAgICBpZiAobGlzdC5sb29zZSkge1xuICAgICAgICAgICAgICBpZiAoaXRlbS50b2tlbnNbMF0gJiYgWydwYXJhZ3JhcGgnLCAndGV4dCddLmluY2x1ZGVzKGl0ZW0udG9rZW5zWzBdLnR5cGUpICYmICd0b2tlbnMnIGluIGl0ZW0udG9rZW5zWzBdICYmIGl0ZW0udG9rZW5zWzBdLnRva2Vucykge1xuICAgICAgICAgICAgICAgIGl0ZW0udG9rZW5zWzBdLnJhdyA9IGNoZWNrYm94VG9rZW4ucmF3ICsgaXRlbS50b2tlbnNbMF0ucmF3O1xuICAgICAgICAgICAgICAgIGl0ZW0udG9rZW5zWzBdLnRleHQgPSBjaGVja2JveFRva2VuLnJhdyArIGl0ZW0udG9rZW5zWzBdLnRleHQ7XG4gICAgICAgICAgICAgICAgaXRlbS50b2tlbnNbMF0udG9rZW5zLnVuc2hpZnQoY2hlY2tib3hUb2tlbik7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaXRlbS50b2tlbnMudW5zaGlmdCh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiAncGFyYWdyYXBoJyxcbiAgICAgICAgICAgICAgICAgIHJhdzogY2hlY2tib3hUb2tlbi5yYXcsXG4gICAgICAgICAgICAgICAgICB0ZXh0OiBjaGVja2JveFRva2VuLnJhdyxcbiAgICAgICAgICAgICAgICAgIHRva2VuczogW2NoZWNrYm94VG9rZW5dLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpdGVtLnRva2Vucy51bnNoaWZ0KGNoZWNrYm94VG9rZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbGlzdC5sb29zZSkge1xuICAgICAgICAgIC8vIENoZWNrIGlmIGxpc3Qgc2hvdWxkIGJlIGxvb3NlXG4gICAgICAgICAgY29uc3Qgc3BhY2VycyA9IGl0ZW0udG9rZW5zLmZpbHRlcih0ID0+IHQudHlwZSA9PT0gJ3NwYWNlJyk7XG4gICAgICAgICAgY29uc3QgaGFzTXVsdGlwbGVMaW5lQnJlYWtzID0gc3BhY2Vycy5sZW5ndGggPiAwICYmIHNwYWNlcnMuc29tZSh0ID0+IHRoaXMucnVsZXMub3RoZXIuYW55TGluZS50ZXN0KHQucmF3KSk7XG5cbiAgICAgICAgICBsaXN0Lmxvb3NlID0gaGFzTXVsdGlwbGVMaW5lQnJlYWtzO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCBhbGwgaXRlbXMgdG8gbG9vc2UgaWYgbGlzdCBpcyBsb29zZVxuICAgICAgaWYgKGxpc3QubG9vc2UpIHtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGxpc3QuaXRlbXMpIHtcbiAgICAgICAgICBpdGVtLmxvb3NlID0gdHJ1ZTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHRva2VuIG9mIGl0ZW0udG9rZW5zKSB7XG4gICAgICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICAgICAgICAgIHRva2VuLnR5cGUgPSAncGFyYWdyYXBoJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGxpc3Q7XG4gICAgfVxuICB9XG5cbiAgaHRtbChzcmM6IHN0cmluZyk6IFRva2Vucy5IVE1MIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjYXAgPSB0aGlzLnJ1bGVzLmJsb2NrLmh0bWwuZXhlYyhzcmMpO1xuICAgIGlmIChjYXApIHtcbiAgICAgIGNvbnN0IHRva2VuOiBUb2tlbnMuSFRNTCA9IHtcbiAgICAgICAgdHlwZTogJ2h0bWwnLFxuICAgICAgICBibG9jazogdHJ1ZSxcbiAgICAgICAgcmF3OiBjYXBbMF0sXG4gICAgICAgIHByZTogY2FwWzFdID09PSAncHJlJyB8fCBjYXBbMV0gPT09ICdzY3JpcHQnIHx8IGNhcFsxXSA9PT0gJ3N0eWxlJyxcbiAgICAgICAgdGV4dDogY2FwWzBdLFxuICAgICAgfTtcbiAgICAgIHJldHVybiB0b2tlbjtcbiAgICB9XG4gIH1cblxuICBkZWYoc3JjOiBzdHJpbmcpOiBUb2tlbnMuRGVmIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjYXAgPSB0aGlzLnJ1bGVzLmJsb2NrLmRlZi5leGVjKHNyYyk7XG4gICAgaWYgKGNhcCkge1xuICAgICAgY29uc3QgdGFnID0gY2FwWzFdLnRvTG93ZXJDYXNlKCkucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLm11bHRpcGxlU3BhY2VHbG9iYWwsICcgJyk7XG4gICAgICBjb25zdCBocmVmID0gY2FwWzJdID8gY2FwWzJdLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5ocmVmQnJhY2tldHMsICckMScpLnJlcGxhY2UodGhpcy5ydWxlcy5pbmxpbmUuYW55UHVuY3R1YXRpb24sICckMScpIDogJyc7XG4gICAgICBjb25zdCB0aXRsZSA9IGNhcFszXSA/IGNhcFszXS5zdWJzdHJpbmcoMSwgY2FwWzNdLmxlbmd0aCAtIDEpLnJlcGxhY2UodGhpcy5ydWxlcy5pbmxpbmUuYW55UHVuY3R1YXRpb24sICckMScpIDogY2FwWzNdO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ2RlZicsXG4gICAgICAgIHRhZyxcbiAgICAgICAgcmF3OiBjYXBbMF0sXG4gICAgICAgIGhyZWYsXG4gICAgICAgIHRpdGxlLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICB0YWJsZShzcmM6IHN0cmluZyk6IFRva2Vucy5UYWJsZSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5ibG9jay50YWJsZS5leGVjKHNyYyk7XG4gICAgaWYgKCFjYXApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMucnVsZXMub3RoZXIudGFibGVEZWxpbWl0ZXIudGVzdChjYXBbMl0pKSB7XG4gICAgICAvLyBkZWxpbWl0ZXIgcm93IG11c3QgaGF2ZSBhIHBpcGUgKHwpIG9yIGNvbG9uICg6KSBvdGhlcndpc2UgaXQgaXMgYSBzZXRleHQgaGVhZGluZ1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGhlYWRlcnMgPSBzcGxpdENlbGxzKGNhcFsxXSk7XG4gICAgY29uc3QgYWxpZ25zID0gY2FwWzJdLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci50YWJsZUFsaWduQ2hhcnMsICcnKS5zcGxpdCgnfCcpO1xuICAgIGNvbnN0IHJvd3MgPSBjYXBbM10/LnRyaW0oKSA/IGNhcFszXS5yZXBsYWNlKHRoaXMucnVsZXMub3RoZXIudGFibGVSb3dCbGFua0xpbmUsICcnKS5zcGxpdCgnXFxuJykgOiBbXTtcblxuICAgIGNvbnN0IGl0ZW06IFRva2Vucy5UYWJsZSA9IHtcbiAgICAgIHR5cGU6ICd0YWJsZScsXG4gICAgICByYXc6IGNhcFswXSxcbiAgICAgIGhlYWRlcjogW10sXG4gICAgICBhbGlnbjogW10sXG4gICAgICByb3dzOiBbXSxcbiAgICB9O1xuXG4gICAgaWYgKGhlYWRlcnMubGVuZ3RoICE9PSBhbGlnbnMubGVuZ3RoKSB7XG4gICAgICAvLyBoZWFkZXIgYW5kIGFsaWduIGNvbHVtbnMgbXVzdCBiZSBlcXVhbCwgcm93cyBjYW4gYmUgZGlmZmVyZW50LlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgYWxpZ24gb2YgYWxpZ25zKSB7XG4gICAgICBpZiAodGhpcy5ydWxlcy5vdGhlci50YWJsZUFsaWduUmlnaHQudGVzdChhbGlnbikpIHtcbiAgICAgICAgaXRlbS5hbGlnbi5wdXNoKCdyaWdodCcpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnJ1bGVzLm90aGVyLnRhYmxlQWxpZ25DZW50ZXIudGVzdChhbGlnbikpIHtcbiAgICAgICAgaXRlbS5hbGlnbi5wdXNoKCdjZW50ZXInKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5ydWxlcy5vdGhlci50YWJsZUFsaWduTGVmdC50ZXN0KGFsaWduKSkge1xuICAgICAgICBpdGVtLmFsaWduLnB1c2goJ2xlZnQnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGl0ZW0uYWxpZ24ucHVzaChudWxsKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlYWRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGl0ZW0uaGVhZGVyLnB1c2goe1xuICAgICAgICB0ZXh0OiBoZWFkZXJzW2ldLFxuICAgICAgICB0b2tlbnM6IHRoaXMubGV4ZXIuaW5saW5lKGhlYWRlcnNbaV0pLFxuICAgICAgICBoZWFkZXI6IHRydWUsXG4gICAgICAgIGFsaWduOiBpdGVtLmFsaWduW2ldLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgICAgaXRlbS5yb3dzLnB1c2goc3BsaXRDZWxscyhyb3csIGl0ZW0uaGVhZGVyLmxlbmd0aCkubWFwKChjZWxsLCBpKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdGV4dDogY2VsbCxcbiAgICAgICAgICB0b2tlbnM6IHRoaXMubGV4ZXIuaW5saW5lKGNlbGwpLFxuICAgICAgICAgIGhlYWRlcjogZmFsc2UsXG4gICAgICAgICAgYWxpZ246IGl0ZW0uYWxpZ25baV0sXG4gICAgICAgIH07XG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGl0ZW07XG4gIH1cblxuICBsaGVhZGluZyhzcmM6IHN0cmluZyk6IFRva2Vucy5IZWFkaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjYXAgPSB0aGlzLnJ1bGVzLmJsb2NrLmxoZWFkaW5nLmV4ZWMoc3JjKTtcbiAgICBpZiAoY2FwKSB7XG4gICAgICBjb25zdCB0ZXh0ID0gY2FwWzFdLnRyaW0oKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdoZWFkaW5nJyxcbiAgICAgICAgcmF3OiBjYXBbMF0sXG4gICAgICAgIGRlcHRoOiBjYXBbMl0uY2hhckF0KDApID09PSAnPScgPyAxIDogMixcbiAgICAgICAgdGV4dCxcbiAgICAgICAgdG9rZW5zOiB0aGlzLmxleGVyLmlubGluZSh0ZXh0KSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcGFyYWdyYXBoKHNyYzogc3RyaW5nKTogVG9rZW5zLlBhcmFncmFwaCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5ibG9jay5wYXJhZ3JhcGguZXhlYyhzcmMpO1xuICAgIGlmIChjYXApIHtcbiAgICAgIGNvbnN0IHRleHQgPSBjYXBbMV0uY2hhckF0KGNhcFsxXS5sZW5ndGggLSAxKSA9PT0gJ1xcbidcbiAgICAgICAgPyBjYXBbMV0uc2xpY2UoMCwgLTEpXG4gICAgICAgIDogY2FwWzFdO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ3BhcmFncmFwaCcsXG4gICAgICAgIHJhdzogY2FwWzBdLFxuICAgICAgICB0ZXh0LFxuICAgICAgICB0b2tlbnM6IHRoaXMubGV4ZXIuaW5saW5lKHRleHQpLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICB0ZXh0KHNyYzogc3RyaW5nKTogVG9rZW5zLlRleHQgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuYmxvY2sudGV4dC5leGVjKHNyYyk7XG4gICAgaWYgKGNhcCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICByYXc6IGNhcFswXSxcbiAgICAgICAgdGV4dDogY2FwWzBdLFxuICAgICAgICB0b2tlbnM6IHRoaXMubGV4ZXIuaW5saW5lKGNhcFswXSksXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGVzY2FwZShzcmM6IHN0cmluZyk6IFRva2Vucy5Fc2NhcGUgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuaW5saW5lLmVzY2FwZS5leGVjKHNyYyk7XG4gICAgaWYgKGNhcCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ2VzY2FwZScsXG4gICAgICAgIHJhdzogY2FwWzBdLFxuICAgICAgICB0ZXh0OiBjYXBbMV0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHRhZyhzcmM6IHN0cmluZyk6IFRva2Vucy5UYWcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuaW5saW5lLnRhZy5leGVjKHNyYyk7XG4gICAgaWYgKGNhcCkge1xuICAgICAgaWYgKCF0aGlzLmxleGVyLnN0YXRlLmluTGluayAmJiB0aGlzLnJ1bGVzLm90aGVyLnN0YXJ0QVRhZy50ZXN0KGNhcFswXSkpIHtcbiAgICAgICAgdGhpcy5sZXhlci5zdGF0ZS5pbkxpbmsgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmxleGVyLnN0YXRlLmluTGluayAmJiB0aGlzLnJ1bGVzLm90aGVyLmVuZEFUYWcudGVzdChjYXBbMF0pKSB7XG4gICAgICAgIHRoaXMubGV4ZXIuc3RhdGUuaW5MaW5rID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMubGV4ZXIuc3RhdGUuaW5SYXdCbG9jayAmJiB0aGlzLnJ1bGVzLm90aGVyLnN0YXJ0UHJlU2NyaXB0VGFnLnRlc3QoY2FwWzBdKSkge1xuICAgICAgICB0aGlzLmxleGVyLnN0YXRlLmluUmF3QmxvY2sgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmxleGVyLnN0YXRlLmluUmF3QmxvY2sgJiYgdGhpcy5ydWxlcy5vdGhlci5lbmRQcmVTY3JpcHRUYWcudGVzdChjYXBbMF0pKSB7XG4gICAgICAgIHRoaXMubGV4ZXIuc3RhdGUuaW5SYXdCbG9jayA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAnaHRtbCcsXG4gICAgICAgIHJhdzogY2FwWzBdLFxuICAgICAgICBpbkxpbms6IHRoaXMubGV4ZXIuc3RhdGUuaW5MaW5rLFxuICAgICAgICBpblJhd0Jsb2NrOiB0aGlzLmxleGVyLnN0YXRlLmluUmF3QmxvY2ssXG4gICAgICAgIGJsb2NrOiBmYWxzZSxcbiAgICAgICAgdGV4dDogY2FwWzBdLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBsaW5rKHNyYzogc3RyaW5nKTogVG9rZW5zLkxpbmsgfCBUb2tlbnMuSW1hZ2UgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuaW5saW5lLmxpbmsuZXhlYyhzcmMpO1xuICAgIGlmIChjYXApIHtcbiAgICAgIGNvbnN0IHRyaW1tZWRVcmwgPSBjYXBbMl0udHJpbSgpO1xuICAgICAgaWYgKCF0aGlzLm9wdGlvbnMucGVkYW50aWMgJiYgdGhpcy5ydWxlcy5vdGhlci5zdGFydEFuZ2xlQnJhY2tldC50ZXN0KHRyaW1tZWRVcmwpKSB7XG4gICAgICAgIC8vIGNvbW1vbm1hcmsgcmVxdWlyZXMgbWF0Y2hpbmcgYW5nbGUgYnJhY2tldHNcbiAgICAgICAgaWYgKCEodGhpcy5ydWxlcy5vdGhlci5lbmRBbmdsZUJyYWNrZXQudGVzdCh0cmltbWVkVXJsKSkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlbmRpbmcgYW5nbGUgYnJhY2tldCBjYW5ub3QgYmUgZXNjYXBlZFxuICAgICAgICBjb25zdCBydHJpbVNsYXNoID0gcnRyaW0odHJpbW1lZFVybC5zbGljZSgwLCAtMSksICdcXFxcJyk7XG4gICAgICAgIGlmICgodHJpbW1lZFVybC5sZW5ndGggLSBydHJpbVNsYXNoLmxlbmd0aCkgJSAyID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBmaW5kIGNsb3NpbmcgcGFyZW50aGVzaXNcbiAgICAgICAgY29uc3QgbGFzdFBhcmVuSW5kZXggPSBmaW5kQ2xvc2luZ0JyYWNrZXQoY2FwWzJdLCAnKCknKTtcbiAgICAgICAgaWYgKGxhc3RQYXJlbkluZGV4ID09PSAtMikge1xuICAgICAgICAgIC8vIG1vcmUgb3BlbiBwYXJlbnMgdGhhbiBjbG9zZWRcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGFzdFBhcmVuSW5kZXggPiAtMSkge1xuICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gY2FwWzBdLmluZGV4T2YoJyEnKSA9PT0gMCA/IDUgOiA0O1xuICAgICAgICAgIGNvbnN0IGxpbmtMZW4gPSBzdGFydCArIGNhcFsxXS5sZW5ndGggKyBsYXN0UGFyZW5JbmRleDtcbiAgICAgICAgICBjYXBbMl0gPSBjYXBbMl0uc3Vic3RyaW5nKDAsIGxhc3RQYXJlbkluZGV4KTtcbiAgICAgICAgICBjYXBbMF0gPSBjYXBbMF0uc3Vic3RyaW5nKDAsIGxpbmtMZW4pLnRyaW0oKTtcbiAgICAgICAgICBjYXBbM10gPSAnJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGV0IGhyZWYgPSBjYXBbMl07XG4gICAgICBsZXQgdGl0bGUgPSAnJztcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMucGVkYW50aWMpIHtcbiAgICAgICAgLy8gc3BsaXQgcGVkYW50aWMgaHJlZiBhbmQgdGl0bGVcbiAgICAgICAgY29uc3QgbGluayA9IHRoaXMucnVsZXMub3RoZXIucGVkYW50aWNIcmVmVGl0bGUuZXhlYyhocmVmKTtcblxuICAgICAgICBpZiAobGluaykge1xuICAgICAgICAgIGhyZWYgPSBsaW5rWzFdO1xuICAgICAgICAgIHRpdGxlID0gbGlua1szXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGl0bGUgPSBjYXBbM10gPyBjYXBbM10uc2xpY2UoMSwgLTEpIDogJyc7XG4gICAgICB9XG5cbiAgICAgIGhyZWYgPSBocmVmLnRyaW0oKTtcbiAgICAgIGlmICh0aGlzLnJ1bGVzLm90aGVyLnN0YXJ0QW5nbGVCcmFja2V0LnRlc3QoaHJlZikpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5wZWRhbnRpYyAmJiAhKHRoaXMucnVsZXMub3RoZXIuZW5kQW5nbGVCcmFja2V0LnRlc3QodHJpbW1lZFVybCkpKSB7XG4gICAgICAgICAgLy8gcGVkYW50aWMgYWxsb3dzIHN0YXJ0aW5nIGFuZ2xlIGJyYWNrZXQgd2l0aG91dCBlbmRpbmcgYW5nbGUgYnJhY2tldFxuICAgICAgICAgIGhyZWYgPSBocmVmLnNsaWNlKDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGhyZWYgPSBocmVmLnNsaWNlKDEsIC0xKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG91dHB1dExpbmsoY2FwLCB7XG4gICAgICAgIGhyZWY6IGhyZWYgPyBocmVmLnJlcGxhY2UodGhpcy5ydWxlcy5pbmxpbmUuYW55UHVuY3R1YXRpb24sICckMScpIDogaHJlZixcbiAgICAgICAgdGl0bGU6IHRpdGxlID8gdGl0bGUucmVwbGFjZSh0aGlzLnJ1bGVzLmlubGluZS5hbnlQdW5jdHVhdGlvbiwgJyQxJykgOiB0aXRsZSxcbiAgICAgIH0sIGNhcFswXSwgdGhpcy5sZXhlciwgdGhpcy5ydWxlcyk7XG4gICAgfVxuICB9XG5cbiAgcmVmbGluayhzcmM6IHN0cmluZywgbGlua3M6IExpbmtzKTogVG9rZW5zLkxpbmsgfCBUb2tlbnMuSW1hZ2UgfCBUb2tlbnMuVGV4dCB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGNhcDtcbiAgICBpZiAoKGNhcCA9IHRoaXMucnVsZXMuaW5saW5lLnJlZmxpbmsuZXhlYyhzcmMpKVxuICAgICAgfHwgKGNhcCA9IHRoaXMucnVsZXMuaW5saW5lLm5vbGluay5leGVjKHNyYykpKSB7XG4gICAgICBjb25zdCBsaW5rU3RyaW5nID0gKGNhcFsyXSB8fCBjYXBbMV0pLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5tdWx0aXBsZVNwYWNlR2xvYmFsLCAnICcpO1xuICAgICAgY29uc3QgbGluayA9IGxpbmtzW2xpbmtTdHJpbmcudG9Mb3dlckNhc2UoKV07XG4gICAgICBpZiAoIWxpbmspIHtcbiAgICAgICAgY29uc3QgdGV4dCA9IGNhcFswXS5jaGFyQXQoMCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgIHJhdzogdGV4dCxcbiAgICAgICAgICB0ZXh0LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG91dHB1dExpbmsoY2FwLCBsaW5rLCBjYXBbMF0sIHRoaXMubGV4ZXIsIHRoaXMucnVsZXMpO1xuICAgIH1cbiAgfVxuXG4gIGVtU3Ryb25nKHNyYzogc3RyaW5nLCBtYXNrZWRTcmM6IHN0cmluZywgcHJldkNoYXIgPSAnJyk6IFRva2Vucy5FbSB8IFRva2Vucy5TdHJvbmcgfCB1bmRlZmluZWQge1xuICAgIGxldCBtYXRjaCA9IHRoaXMucnVsZXMuaW5saW5lLmVtU3Ryb25nTERlbGltLmV4ZWMoc3JjKTtcbiAgICBpZiAoIW1hdGNoKSByZXR1cm47XG4gICAgaWYgKCFtYXRjaFsxXSAmJiAhbWF0Y2hbMl0gJiYgIW1hdGNoWzNdICYmICFtYXRjaFs0XSkgcmV0dXJuO1xuXG4gICAgLy8gXyBjYW4ndCBiZSBiZXR3ZWVuIHR3byBhbHBoYW51bWVyaWNzLiBcXHB7TH1cXHB7Tn0gaW5jbHVkZXMgbm9uLWVuZ2xpc2ggYWxwaGFiZXQvbnVtYmVycyBhcyB3ZWxsXG4gICAgaWYgKG1hdGNoWzRdICYmIHByZXZDaGFyLm1hdGNoKHRoaXMucnVsZXMub3RoZXIudW5pY29kZUFscGhhTnVtZXJpYykpIHJldHVybjtcblxuICAgIGNvbnN0IG5leHRDaGFyID0gbWF0Y2hbMV0gfHwgbWF0Y2hbM10gfHwgJyc7XG5cbiAgICBpZiAoIW5leHRDaGFyIHx8ICFwcmV2Q2hhciB8fCB0aGlzLnJ1bGVzLmlubGluZS5wdW5jdHVhdGlvbi5leGVjKHByZXZDaGFyKSkge1xuICAgICAgLy8gdW5pY29kZSBSZWdleCBjb3VudHMgZW1vamkgYXMgMSBjaGFyOyBzcHJlYWQgaW50byBhcnJheSBmb3IgcHJvcGVyIGNvdW50ICh1c2VkIG11bHRpcGxlIHRpbWVzIGJlbG93KVxuICAgICAgY29uc3QgbExlbmd0aCA9IFsuLi5tYXRjaFswXV0ubGVuZ3RoIC0gMTtcbiAgICAgIGxldCByRGVsaW0sIHJMZW5ndGgsIGRlbGltVG90YWwgPSBsTGVuZ3RoLCBtaWREZWxpbVRvdGFsID0gMDtcblxuICAgICAgY29uc3QgZW5kUmVnID0gbWF0Y2hbMF1bMF0gPT09ICcqJyA/IHRoaXMucnVsZXMuaW5saW5lLmVtU3Ryb25nUkRlbGltQXN0IDogdGhpcy5ydWxlcy5pbmxpbmUuZW1TdHJvbmdSRGVsaW1VbmQ7XG4gICAgICBlbmRSZWcubGFzdEluZGV4ID0gMDtcblxuICAgICAgLy8gQ2xpcCBtYXNrZWRTcmMgdG8gc2FtZSBzZWN0aW9uIG9mIHN0cmluZyBhcyBzcmMgKG1vdmUgdG8gbGV4ZXI/KVxuICAgICAgbWFza2VkU3JjID0gbWFza2VkU3JjLnNsaWNlKC0xICogc3JjLmxlbmd0aCArIGxMZW5ndGgpO1xuXG4gICAgICB3aGlsZSAoKG1hdGNoID0gZW5kUmVnLmV4ZWMobWFza2VkU3JjKSkgIT0gbnVsbCkge1xuICAgICAgICByRGVsaW0gPSBtYXRjaFsxXSB8fCBtYXRjaFsyXSB8fCBtYXRjaFszXSB8fCBtYXRjaFs0XSB8fCBtYXRjaFs1XSB8fCBtYXRjaFs2XTtcblxuICAgICAgICBpZiAoIXJEZWxpbSkgY29udGludWU7IC8vIHNraXAgc2luZ2xlICogaW4gX19hYmMqYWJjX19cblxuICAgICAgICByTGVuZ3RoID0gWy4uLnJEZWxpbV0ubGVuZ3RoO1xuXG4gICAgICAgIGlmIChtYXRjaFszXSB8fCBtYXRjaFs0XSkgeyAvLyBmb3VuZCBhbm90aGVyIExlZnQgRGVsaW1cbiAgICAgICAgICBkZWxpbVRvdGFsICs9IHJMZW5ndGg7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSBpZiAobWF0Y2hbNV0gfHwgbWF0Y2hbNl0pIHsgLy8gZWl0aGVyIExlZnQgb3IgUmlnaHQgRGVsaW1cbiAgICAgICAgICBpZiAobExlbmd0aCAlIDMgJiYgISgobExlbmd0aCArIHJMZW5ndGgpICUgMykpIHtcbiAgICAgICAgICAgIG1pZERlbGltVG90YWwgKz0gckxlbmd0aDtcbiAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBDb21tb25NYXJrIEVtcGhhc2lzIFJ1bGVzIDktMTBcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBkZWxpbVRvdGFsIC09IHJMZW5ndGg7XG5cbiAgICAgICAgaWYgKGRlbGltVG90YWwgPiAwKSBjb250aW51ZTsgLy8gSGF2ZW4ndCBmb3VuZCBlbm91Z2ggY2xvc2luZyBkZWxpbWl0ZXJzXG5cbiAgICAgICAgLy8gUmVtb3ZlIGV4dHJhIGNoYXJhY3RlcnMuICphKioqIC0+ICphKlxuICAgICAgICByTGVuZ3RoID0gTWF0aC5taW4ockxlbmd0aCwgckxlbmd0aCArIGRlbGltVG90YWwgKyBtaWREZWxpbVRvdGFsKTtcbiAgICAgICAgLy8gY2hhciBsZW5ndGggY2FuIGJlID4xIGZvciB1bmljb2RlIGNoYXJhY3RlcnM7XG4gICAgICAgIGNvbnN0IGxhc3RDaGFyTGVuZ3RoID0gWy4uLm1hdGNoWzBdXVswXS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IHJhdyA9IHNyYy5zbGljZSgwLCBsTGVuZ3RoICsgbWF0Y2guaW5kZXggKyBsYXN0Q2hhckxlbmd0aCArIHJMZW5ndGgpO1xuXG4gICAgICAgIC8vIENyZWF0ZSBgZW1gIGlmIHNtYWxsZXN0IGRlbGltaXRlciBoYXMgb2RkIGNoYXIgY291bnQuICphKioqXG4gICAgICAgIGlmIChNYXRoLm1pbihsTGVuZ3RoLCByTGVuZ3RoKSAlIDIpIHtcbiAgICAgICAgICBjb25zdCB0ZXh0ID0gcmF3LnNsaWNlKDEsIC0xKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogJ2VtJyxcbiAgICAgICAgICAgIHJhdyxcbiAgICAgICAgICAgIHRleHQsXG4gICAgICAgICAgICB0b2tlbnM6IHRoaXMubGV4ZXIuaW5saW5lVG9rZW5zKHRleHQpLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDcmVhdGUgJ3N0cm9uZycgaWYgc21hbGxlc3QgZGVsaW1pdGVyIGhhcyBldmVuIGNoYXIgY291bnQuICoqYSoqKlxuICAgICAgICBjb25zdCB0ZXh0ID0gcmF3LnNsaWNlKDIsIC0yKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiAnc3Ryb25nJyxcbiAgICAgICAgICByYXcsXG4gICAgICAgICAgdGV4dCxcbiAgICAgICAgICB0b2tlbnM6IHRoaXMubGV4ZXIuaW5saW5lVG9rZW5zKHRleHQpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvZGVzcGFuKHNyYzogc3RyaW5nKTogVG9rZW5zLkNvZGVzcGFuIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjYXAgPSB0aGlzLnJ1bGVzLmlubGluZS5jb2RlLmV4ZWMoc3JjKTtcbiAgICBpZiAoY2FwKSB7XG4gICAgICBsZXQgdGV4dCA9IGNhcFsyXS5yZXBsYWNlKHRoaXMucnVsZXMub3RoZXIubmV3TGluZUNoYXJHbG9iYWwsICcgJyk7XG4gICAgICBjb25zdCBoYXNOb25TcGFjZUNoYXJzID0gdGhpcy5ydWxlcy5vdGhlci5ub25TcGFjZUNoYXIudGVzdCh0ZXh0KTtcbiAgICAgIGNvbnN0IGhhc1NwYWNlQ2hhcnNPbkJvdGhFbmRzID0gdGhpcy5ydWxlcy5vdGhlci5zdGFydGluZ1NwYWNlQ2hhci50ZXN0KHRleHQpICYmIHRoaXMucnVsZXMub3RoZXIuZW5kaW5nU3BhY2VDaGFyLnRlc3QodGV4dCk7XG4gICAgICBpZiAoaGFzTm9uU3BhY2VDaGFycyAmJiBoYXNTcGFjZUNoYXJzT25Cb3RoRW5kcykge1xuICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMSwgdGV4dC5sZW5ndGggLSAxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdjb2Rlc3BhbicsXG4gICAgICAgIHJhdzogY2FwWzBdLFxuICAgICAgICB0ZXh0LFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBicihzcmM6IHN0cmluZyk6IFRva2Vucy5CciB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5pbmxpbmUuYnIuZXhlYyhzcmMpO1xuICAgIGlmIChjYXApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdicicsXG4gICAgICAgIHJhdzogY2FwWzBdLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBkZWwoc3JjOiBzdHJpbmcsIG1hc2tlZFNyYzogc3RyaW5nLCBwcmV2Q2hhciA9ICcnKTogVG9rZW5zLkRlbCB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IG1hdGNoID0gdGhpcy5ydWxlcy5pbmxpbmUuZGVsTERlbGltLmV4ZWMoc3JjKTtcbiAgICBpZiAoIW1hdGNoKSByZXR1cm47XG5cbiAgICBjb25zdCBuZXh0Q2hhciA9IG1hdGNoWzFdIHx8ICcnO1xuXG4gICAgaWYgKCFuZXh0Q2hhciB8fCAhcHJldkNoYXIgfHwgdGhpcy5ydWxlcy5pbmxpbmUucHVuY3R1YXRpb24uZXhlYyhwcmV2Q2hhcikpIHtcbiAgICAgIC8vIHVuaWNvZGUgUmVnZXggY291bnRzIGVtb2ppIGFzIDEgY2hhcjsgc3ByZWFkIGludG8gYXJyYXkgZm9yIHByb3BlciBjb3VudFxuICAgICAgY29uc3QgbExlbmd0aCA9IFsuLi5tYXRjaFswXV0ubGVuZ3RoIC0gMTtcbiAgICAgIGxldCByRGVsaW0sIHJMZW5ndGgsIGRlbGltVG90YWwgPSBsTGVuZ3RoO1xuXG4gICAgICBjb25zdCBlbmRSZWcgPSB0aGlzLnJ1bGVzLmlubGluZS5kZWxSRGVsaW07XG4gICAgICBlbmRSZWcubGFzdEluZGV4ID0gMDtcblxuICAgICAgLy8gQ2xpcCBtYXNrZWRTcmMgdG8gc2FtZSBzZWN0aW9uIG9mIHN0cmluZyBhcyBzcmNcbiAgICAgIG1hc2tlZFNyYyA9IG1hc2tlZFNyYy5zbGljZSgtMSAqIHNyYy5sZW5ndGggKyBsTGVuZ3RoKTtcblxuICAgICAgd2hpbGUgKChtYXRjaCA9IGVuZFJlZy5leGVjKG1hc2tlZFNyYykpICE9IG51bGwpIHtcbiAgICAgICAgckRlbGltID0gbWF0Y2hbMV0gfHwgbWF0Y2hbMl0gfHwgbWF0Y2hbM10gfHwgbWF0Y2hbNF0gfHwgbWF0Y2hbNV0gfHwgbWF0Y2hbNl07XG5cbiAgICAgICAgaWYgKCFyRGVsaW0pIGNvbnRpbnVlO1xuXG4gICAgICAgIHJMZW5ndGggPSBbLi4uckRlbGltXS5sZW5ndGg7XG5cbiAgICAgICAgaWYgKHJMZW5ndGggIT09IGxMZW5ndGgpIGNvbnRpbnVlO1xuXG4gICAgICAgIGlmIChtYXRjaFszXSB8fCBtYXRjaFs0XSkgeyAvLyBmb3VuZCBhbm90aGVyIExlZnQgRGVsaW1cbiAgICAgICAgICBkZWxpbVRvdGFsICs9IHJMZW5ndGg7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBkZWxpbVRvdGFsIC09IHJMZW5ndGg7XG5cbiAgICAgICAgaWYgKGRlbGltVG90YWwgPiAwKSBjb250aW51ZTsgLy8gSGF2ZW4ndCBmb3VuZCBlbm91Z2ggY2xvc2luZyBkZWxpbWl0ZXJzXG5cbiAgICAgICAgLy8gUmVtb3ZlIGV4dHJhIGNoYXJhY3RlcnNcbiAgICAgICAgckxlbmd0aCA9IE1hdGgubWluKHJMZW5ndGgsIHJMZW5ndGggKyBkZWxpbVRvdGFsKTtcbiAgICAgICAgLy8gY2hhciBsZW5ndGggY2FuIGJlID4xIGZvciB1bmljb2RlIGNoYXJhY3RlcnNcbiAgICAgICAgY29uc3QgbGFzdENoYXJMZW5ndGggPSBbLi4ubWF0Y2hbMF1dWzBdLmxlbmd0aDtcbiAgICAgICAgY29uc3QgcmF3ID0gc3JjLnNsaWNlKDAsIGxMZW5ndGggKyBtYXRjaC5pbmRleCArIGxhc3RDaGFyTGVuZ3RoICsgckxlbmd0aCk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGRlbCB0b2tlbiAtIG9ubHkgc2luZ2xlIH4gb3IgZG91YmxlIH5+IHN1cHBvcnRlZFxuICAgICAgICBjb25zdCB0ZXh0ID0gcmF3LnNsaWNlKGxMZW5ndGgsIC1sTGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiAnZGVsJyxcbiAgICAgICAgICByYXcsXG4gICAgICAgICAgdGV4dCxcbiAgICAgICAgICB0b2tlbnM6IHRoaXMubGV4ZXIuaW5saW5lVG9rZW5zKHRleHQpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGF1dG9saW5rKHNyYzogc3RyaW5nKTogVG9rZW5zLkxpbmsgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuaW5saW5lLmF1dG9saW5rLmV4ZWMoc3JjKTtcbiAgICBpZiAoY2FwKSB7XG4gICAgICBsZXQgdGV4dCwgaHJlZjtcbiAgICAgIGlmIChjYXBbMl0gPT09ICdAJykge1xuICAgICAgICB0ZXh0ID0gY2FwWzFdO1xuICAgICAgICBocmVmID0gJ21haWx0bzonICsgdGV4dDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRleHQgPSBjYXBbMV07XG4gICAgICAgIGhyZWYgPSB0ZXh0O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAnbGluaycsXG4gICAgICAgIHJhdzogY2FwWzBdLFxuICAgICAgICB0ZXh0LFxuICAgICAgICBocmVmLFxuICAgICAgICB0b2tlbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICByYXc6IHRleHQsXG4gICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHVybChzcmM6IHN0cmluZyk6IFRva2Vucy5MaW5rIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgY2FwO1xuICAgIGlmIChjYXAgPSB0aGlzLnJ1bGVzLmlubGluZS51cmwuZXhlYyhzcmMpKSB7XG4gICAgICBsZXQgdGV4dCwgaHJlZjtcbiAgICAgIGlmIChjYXBbMl0gPT09ICdAJykge1xuICAgICAgICB0ZXh0ID0gY2FwWzBdO1xuICAgICAgICBocmVmID0gJ21haWx0bzonICsgdGV4dDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGRvIGV4dGVuZGVkIGF1dG9saW5rIHBhdGggdmFsaWRhdGlvblxuICAgICAgICBsZXQgcHJldkNhcFplcm87XG4gICAgICAgIGRvIHtcbiAgICAgICAgICBwcmV2Q2FwWmVybyA9IGNhcFswXTtcbiAgICAgICAgICBjYXBbMF0gPSB0aGlzLnJ1bGVzLmlubGluZS5fYmFja3BlZGFsLmV4ZWMoY2FwWzBdKT8uWzBdID8/ICcnO1xuICAgICAgICB9IHdoaWxlIChwcmV2Q2FwWmVybyAhPT0gY2FwWzBdKTtcbiAgICAgICAgdGV4dCA9IGNhcFswXTtcbiAgICAgICAgaWYgKGNhcFsxXSA9PT0gJ3d3dy4nKSB7XG4gICAgICAgICAgaHJlZiA9ICdodHRwOi8vJyArIGNhcFswXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBocmVmID0gY2FwWzBdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAnbGluaycsXG4gICAgICAgIHJhdzogY2FwWzBdLFxuICAgICAgICB0ZXh0LFxuICAgICAgICBocmVmLFxuICAgICAgICB0b2tlbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICByYXc6IHRleHQsXG4gICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGlubGluZVRleHQoc3JjOiBzdHJpbmcpOiBUb2tlbnMuVGV4dCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5pbmxpbmUudGV4dC5leGVjKHNyYyk7XG4gICAgaWYgKGNhcCkge1xuICAgICAgY29uc3QgZXNjYXBlZCA9IHRoaXMubGV4ZXIuc3RhdGUuaW5SYXdCbG9jaztcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgcmF3OiBjYXBbMF0sXG4gICAgICAgIHRleHQ6IGNhcFswXSxcbiAgICAgICAgZXNjYXBlZCxcbiAgICAgIH07XG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IHsgX1Rva2VuaXplciB9IGZyb20gJy4vVG9rZW5pemVyLnRzJztcbmltcG9ydCB7IF9kZWZhdWx0cyB9IGZyb20gJy4vZGVmYXVsdHMudHMnO1xuaW1wb3J0IHsgb3RoZXIsIGJsb2NrLCBpbmxpbmUgfSBmcm9tICcuL3J1bGVzLnRzJztcbmltcG9ydCB0eXBlIHsgVG9rZW4sIFRva2Vuc0xpc3QsIFRva2VucyB9IGZyb20gJy4vVG9rZW5zLnRzJztcbmltcG9ydCB0eXBlIHsgTWFya2VkT3B0aW9ucyB9IGZyb20gJy4vTWFya2VkT3B0aW9ucy50cyc7XG5cbi8qKlxuICogQmxvY2sgTGV4ZXJcbiAqL1xuZXhwb3J0IGNsYXNzIF9MZXhlcjxQYXJzZXJPdXRwdXQgPSBzdHJpbmcsIFJlbmRlcmVyT3V0cHV0ID0gc3RyaW5nPiB7XG4gIHRva2VuczogVG9rZW5zTGlzdDtcbiAgb3B0aW9uczogTWFya2VkT3B0aW9uczxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0PjtcbiAgc3RhdGU6IHtcbiAgICBpbkxpbms6IGJvb2xlYW47XG4gICAgaW5SYXdCbG9jazogYm9vbGVhbjtcbiAgICB0b3A6IGJvb2xlYW47XG4gIH07XG5cbiAgcHVibGljIGlubGluZVF1ZXVlOiB7IHNyYzogc3RyaW5nLCB0b2tlbnM6IFRva2VuW10gfVtdO1xuXG4gIHByaXZhdGUgdG9rZW5pemVyOiBfVG9rZW5pemVyPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+O1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBNYXJrZWRPcHRpb25zPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+KSB7XG4gICAgLy8gVG9rZW5MaXN0IGNhbm5vdCBiZSBjcmVhdGVkIGluIG9uZSBnb1xuICAgIHRoaXMudG9rZW5zID0gW10gYXMgdW5rbm93biBhcyBUb2tlbnNMaXN0O1xuICAgIHRoaXMudG9rZW5zLmxpbmtzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IF9kZWZhdWx0cztcbiAgICB0aGlzLm9wdGlvbnMudG9rZW5pemVyID0gdGhpcy5vcHRpb25zLnRva2VuaXplciB8fCBuZXcgX1Rva2VuaXplcjxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0PigpO1xuICAgIHRoaXMudG9rZW5pemVyID0gdGhpcy5vcHRpb25zLnRva2VuaXplcjtcbiAgICB0aGlzLnRva2VuaXplci5vcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgIHRoaXMudG9rZW5pemVyLmxleGVyID0gdGhpcztcbiAgICB0aGlzLmlubGluZVF1ZXVlID0gW107XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGluTGluazogZmFsc2UsXG4gICAgICBpblJhd0Jsb2NrOiBmYWxzZSxcbiAgICAgIHRvcDogdHJ1ZSxcbiAgICB9O1xuXG4gICAgY29uc3QgcnVsZXMgPSB7XG4gICAgICBvdGhlcixcbiAgICAgIGJsb2NrOiBibG9jay5ub3JtYWwsXG4gICAgICBpbmxpbmU6IGlubGluZS5ub3JtYWwsXG4gICAgfTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMucGVkYW50aWMpIHtcbiAgICAgIHJ1bGVzLmJsb2NrID0gYmxvY2sucGVkYW50aWM7XG4gICAgICBydWxlcy5pbmxpbmUgPSBpbmxpbmUucGVkYW50aWM7XG4gICAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbnMuZ2ZtKSB7XG4gICAgICBydWxlcy5ibG9jayA9IGJsb2NrLmdmbTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuYnJlYWtzKSB7XG4gICAgICAgIHJ1bGVzLmlubGluZSA9IGlubGluZS5icmVha3M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBydWxlcy5pbmxpbmUgPSBpbmxpbmUuZ2ZtO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnRva2VuaXplci5ydWxlcyA9IHJ1bGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9zZSBSdWxlc1xuICAgKi9cbiAgc3RhdGljIGdldCBydWxlcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYmxvY2ssXG4gICAgICBpbmxpbmUsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0aWMgTGV4IE1ldGhvZFxuICAgKi9cbiAgc3RhdGljIGxleDxQYXJzZXJPdXRwdXQgPSBzdHJpbmcsIFJlbmRlcmVyT3V0cHV0ID0gc3RyaW5nPihzcmM6IHN0cmluZywgb3B0aW9ucz86IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4pIHtcbiAgICBjb25zdCBsZXhlciA9IG5ldyBfTGV4ZXI8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4ob3B0aW9ucyk7XG4gICAgcmV0dXJuIGxleGVyLmxleChzcmMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXRpYyBMZXggSW5saW5lIE1ldGhvZFxuICAgKi9cbiAgc3RhdGljIGxleElubGluZTxQYXJzZXJPdXRwdXQgPSBzdHJpbmcsIFJlbmRlcmVyT3V0cHV0ID0gc3RyaW5nPihzcmM6IHN0cmluZywgb3B0aW9ucz86IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4pIHtcbiAgICBjb25zdCBsZXhlciA9IG5ldyBfTGV4ZXI8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4ob3B0aW9ucyk7XG4gICAgcmV0dXJuIGxleGVyLmlubGluZVRva2VucyhzcmMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXByb2Nlc3NpbmdcbiAgICovXG4gIGxleChzcmM6IHN0cmluZykge1xuICAgIHNyYyA9IHNyYy5yZXBsYWNlKG90aGVyLmNhcnJpYWdlUmV0dXJuLCAnXFxuJyk7XG5cbiAgICB0aGlzLmJsb2NrVG9rZW5zKHNyYywgdGhpcy50b2tlbnMpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmlubGluZVF1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBuZXh0ID0gdGhpcy5pbmxpbmVRdWV1ZVtpXTtcbiAgICAgIHRoaXMuaW5saW5lVG9rZW5zKG5leHQuc3JjLCBuZXh0LnRva2Vucyk7XG4gICAgfVxuICAgIHRoaXMuaW5saW5lUXVldWUgPSBbXTtcblxuICAgIHJldHVybiB0aGlzLnRva2VucztcbiAgfVxuXG4gIC8qKlxuICAgKiBMZXhpbmdcbiAgICovXG4gIGJsb2NrVG9rZW5zKHNyYzogc3RyaW5nLCB0b2tlbnM/OiBUb2tlbltdLCBsYXN0UGFyYWdyYXBoQ2xpcHBlZD86IGJvb2xlYW4pOiBUb2tlbltdO1xuICBibG9ja1Rva2VucyhzcmM6IHN0cmluZywgdG9rZW5zPzogVG9rZW5zTGlzdCwgbGFzdFBhcmFncmFwaENsaXBwZWQ/OiBib29sZWFuKTogVG9rZW5zTGlzdDtcbiAgYmxvY2tUb2tlbnMoc3JjOiBzdHJpbmcsIHRva2VuczogVG9rZW5bXSA9IFtdLCBsYXN0UGFyYWdyYXBoQ2xpcHBlZCA9IGZhbHNlKSB7XG4gICAgdGhpcy50b2tlbml6ZXIubGV4ZXIgPSB0aGlzO1xuICAgIGlmICh0aGlzLm9wdGlvbnMucGVkYW50aWMpIHtcbiAgICAgIHNyYyA9IHNyYy5yZXBsYWNlKG90aGVyLnRhYkNoYXJHbG9iYWwsICcgICAgJykucmVwbGFjZShvdGhlci5zcGFjZUxpbmUsICcnKTtcbiAgICB9XG5cbiAgICB3aGlsZSAoc3JjKSB7XG4gICAgICBsZXQgdG9rZW46IFRva2Vucy5HZW5lcmljIHwgdW5kZWZpbmVkO1xuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmV4dGVuc2lvbnM/LmJsb2NrPy5zb21lKChleHRUb2tlbml6ZXIpID0+IHtcbiAgICAgICAgaWYgKHRva2VuID0gZXh0VG9rZW5pemVyLmNhbGwoeyBsZXhlcjogdGhpcyB9LCBzcmMsIHRva2VucykpIHtcbiAgICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gbmV3bGluZVxuICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIuc3BhY2Uoc3JjKSkge1xuICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICBjb25zdCBsYXN0VG9rZW4gPSB0b2tlbnMuYXQoLTEpO1xuICAgICAgICBpZiAodG9rZW4ucmF3Lmxlbmd0aCA9PT0gMSAmJiBsYXN0VG9rZW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIGlmIHRoZXJlJ3MgYSBzaW5nbGUgXFxuIGFzIGEgc3BhY2VyLCBpdCdzIHRlcm1pbmF0aW5nIHRoZSBsYXN0IGxpbmUsXG4gICAgICAgICAgLy8gc28gbW92ZSBpdCB0aGVyZSBzbyB0aGF0IHdlIGRvbid0IGdldCB1bm5lY2Vzc2FyeSBwYXJhZ3JhcGggdGFnc1xuICAgICAgICAgIGxhc3RUb2tlbi5yYXcgKz0gJ1xcbic7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBjb2RlXG4gICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5jb2RlKHNyYykpIHtcbiAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgbGFzdFRva2VuID0gdG9rZW5zLmF0KC0xKTtcbiAgICAgICAgLy8gQW4gaW5kZW50ZWQgY29kZSBibG9jayBjYW5ub3QgaW50ZXJydXB0IGEgcGFyYWdyYXBoLlxuICAgICAgICBpZiAobGFzdFRva2VuPy50eXBlID09PSAncGFyYWdyYXBoJyB8fCBsYXN0VG9rZW4/LnR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgICAgIGxhc3RUb2tlbi5yYXcgKz0gKGxhc3RUb2tlbi5yYXcuZW5kc1dpdGgoJ1xcbicpID8gJycgOiAnXFxuJykgKyB0b2tlbi5yYXc7XG4gICAgICAgICAgbGFzdFRva2VuLnRleHQgKz0gJ1xcbicgKyB0b2tlbi50ZXh0O1xuICAgICAgICAgIHRoaXMuaW5saW5lUXVldWUuYXQoLTEpIS5zcmMgPSBsYXN0VG9rZW4udGV4dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGZlbmNlc1xuICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIuZmVuY2VzKHNyYykpIHtcbiAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gaGVhZGluZ1xuICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIuaGVhZGluZyhzcmMpKSB7XG4gICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGhyXG4gICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5ocihzcmMpKSB7XG4gICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGJsb2NrcXVvdGVcbiAgICAgIGlmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLmJsb2NrcXVvdGUoc3JjKSkge1xuICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBsaXN0XG4gICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5saXN0KHNyYykpIHtcbiAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gaHRtbFxuICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIuaHRtbChzcmMpKSB7XG4gICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGRlZlxuICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIuZGVmKHNyYykpIHtcbiAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgbGFzdFRva2VuID0gdG9rZW5zLmF0KC0xKTtcbiAgICAgICAgaWYgKGxhc3RUb2tlbj8udHlwZSA9PT0gJ3BhcmFncmFwaCcgfHwgbGFzdFRva2VuPy50eXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgICBsYXN0VG9rZW4ucmF3ICs9IChsYXN0VG9rZW4ucmF3LmVuZHNXaXRoKCdcXG4nKSA/ICcnIDogJ1xcbicpICsgdG9rZW4ucmF3O1xuICAgICAgICAgIGxhc3RUb2tlbi50ZXh0ICs9ICdcXG4nICsgdG9rZW4ucmF3O1xuICAgICAgICAgIHRoaXMuaW5saW5lUXVldWUuYXQoLTEpIS5zcmMgPSBsYXN0VG9rZW4udGV4dDtcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy50b2tlbnMubGlua3NbdG9rZW4udGFnXSkge1xuICAgICAgICAgIHRoaXMudG9rZW5zLmxpbmtzW3Rva2VuLnRhZ10gPSB7XG4gICAgICAgICAgICBocmVmOiB0b2tlbi5ocmVmLFxuICAgICAgICAgICAgdGl0bGU6IHRva2VuLnRpdGxlLFxuICAgICAgICAgIH07XG4gICAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyB0YWJsZSAoZ2ZtKVxuICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIudGFibGUoc3JjKSkge1xuICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBsaGVhZGluZ1xuICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIubGhlYWRpbmcoc3JjKSkge1xuICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyB0b3AtbGV2ZWwgcGFyYWdyYXBoXG4gICAgICAvLyBwcmV2ZW50IHBhcmFncmFwaCBjb25zdW1pbmcgZXh0ZW5zaW9ucyBieSBjbGlwcGluZyAnc3JjJyB0byBleHRlbnNpb24gc3RhcnRcbiAgICAgIGxldCBjdXRTcmMgPSBzcmM7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLmV4dGVuc2lvbnM/LnN0YXJ0QmxvY2spIHtcbiAgICAgICAgbGV0IHN0YXJ0SW5kZXggPSBJbmZpbml0eTtcbiAgICAgICAgY29uc3QgdGVtcFNyYyA9IHNyYy5zbGljZSgxKTtcbiAgICAgICAgbGV0IHRlbXBTdGFydDtcbiAgICAgICAgdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMuc3RhcnRCbG9jay5mb3JFYWNoKChnZXRTdGFydEluZGV4KSA9PiB7XG4gICAgICAgICAgdGVtcFN0YXJ0ID0gZ2V0U3RhcnRJbmRleC5jYWxsKHsgbGV4ZXI6IHRoaXMgfSwgdGVtcFNyYyk7XG4gICAgICAgICAgaWYgKHR5cGVvZiB0ZW1wU3RhcnQgPT09ICdudW1iZXInICYmIHRlbXBTdGFydCA+PSAwKSB7XG4gICAgICAgICAgICBzdGFydEluZGV4ID0gTWF0aC5taW4oc3RhcnRJbmRleCwgdGVtcFN0YXJ0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoc3RhcnRJbmRleCA8IEluZmluaXR5ICYmIHN0YXJ0SW5kZXggPj0gMCkge1xuICAgICAgICAgIGN1dFNyYyA9IHNyYy5zdWJzdHJpbmcoMCwgc3RhcnRJbmRleCArIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5zdGF0ZS50b3AgJiYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIucGFyYWdyYXBoKGN1dFNyYykpKSB7XG4gICAgICAgIGNvbnN0IGxhc3RUb2tlbiA9IHRva2Vucy5hdCgtMSk7XG4gICAgICAgIGlmIChsYXN0UGFyYWdyYXBoQ2xpcHBlZCAmJiBsYXN0VG9rZW4/LnR5cGUgPT09ICdwYXJhZ3JhcGgnKSB7XG4gICAgICAgICAgbGFzdFRva2VuLnJhdyArPSAobGFzdFRva2VuLnJhdy5lbmRzV2l0aCgnXFxuJykgPyAnJyA6ICdcXG4nKSArIHRva2VuLnJhdztcbiAgICAgICAgICBsYXN0VG9rZW4udGV4dCArPSAnXFxuJyArIHRva2VuLnRleHQ7XG4gICAgICAgICAgdGhpcy5pbmxpbmVRdWV1ZS5wb3AoKTtcbiAgICAgICAgICB0aGlzLmlubGluZVF1ZXVlLmF0KC0xKSEuc3JjID0gbGFzdFRva2VuLnRleHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICB9XG4gICAgICAgIGxhc3RQYXJhZ3JhcGhDbGlwcGVkID0gY3V0U3JjLmxlbmd0aCAhPT0gc3JjLmxlbmd0aDtcbiAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIHRleHRcbiAgICAgIGlmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLnRleHQoc3JjKSkge1xuICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICBjb25zdCBsYXN0VG9rZW4gPSB0b2tlbnMuYXQoLTEpO1xuICAgICAgICBpZiAobGFzdFRva2VuPy50eXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgICBsYXN0VG9rZW4ucmF3ICs9IChsYXN0VG9rZW4ucmF3LmVuZHNXaXRoKCdcXG4nKSA/ICcnIDogJ1xcbicpICsgdG9rZW4ucmF3O1xuICAgICAgICAgIGxhc3RUb2tlbi50ZXh0ICs9ICdcXG4nICsgdG9rZW4udGV4dDtcbiAgICAgICAgICB0aGlzLmlubGluZVF1ZXVlLnBvcCgpO1xuICAgICAgICAgIHRoaXMuaW5saW5lUXVldWUuYXQoLTEpIS5zcmMgPSBsYXN0VG9rZW4udGV4dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChzcmMpIHtcbiAgICAgICAgY29uc3QgZXJyTXNnID0gJ0luZmluaXRlIGxvb3Agb24gYnl0ZTogJyArIHNyYy5jaGFyQ29kZUF0KDApO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNpbGVudCkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyTXNnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyTXNnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc3RhdGUudG9wID0gdHJ1ZTtcbiAgICByZXR1cm4gdG9rZW5zO1xuICB9XG5cbiAgaW5saW5lKHNyYzogc3RyaW5nLCB0b2tlbnM6IFRva2VuW10gPSBbXSkge1xuICAgIHRoaXMuaW5saW5lUXVldWUucHVzaCh7IHNyYywgdG9rZW5zIH0pO1xuICAgIHJldHVybiB0b2tlbnM7XG4gIH1cblxuICAvKipcbiAgICogTGV4aW5nL0NvbXBpbGluZ1xuICAgKi9cbiAgaW5saW5lVG9rZW5zKHNyYzogc3RyaW5nLCB0b2tlbnM6IFRva2VuW10gPSBbXSk6IFRva2VuW10ge1xuICAgIHRoaXMudG9rZW5pemVyLmxleGVyID0gdGhpcztcbiAgICAvLyBTdHJpbmcgd2l0aCBsaW5rcyBtYXNrZWQgdG8gYXZvaWQgaW50ZXJmZXJlbmNlIHdpdGggZW0gYW5kIHN0cm9uZ1xuICAgIGxldCBtYXNrZWRTcmMgPSBzcmM7XG4gICAgbGV0IG1hdGNoOiBSZWdFeHBFeGVjQXJyYXkgfCBudWxsID0gbnVsbDtcblxuICAgIC8vIE1hc2sgb3V0IHJlZmxpbmtzXG4gICAgaWYgKHRoaXMudG9rZW5zLmxpbmtzKSB7XG4gICAgICBjb25zdCBsaW5rcyA9IE9iamVjdC5rZXlzKHRoaXMudG9rZW5zLmxpbmtzKTtcbiAgICAgIGlmIChsaW5rcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHdoaWxlICgobWF0Y2ggPSB0aGlzLnRva2VuaXplci5ydWxlcy5pbmxpbmUucmVmbGlua1NlYXJjaC5leGVjKG1hc2tlZFNyYykpICE9IG51bGwpIHtcbiAgICAgICAgICBpZiAobGlua3MuaW5jbHVkZXMobWF0Y2hbMF0uc2xpY2UobWF0Y2hbMF0ubGFzdEluZGV4T2YoJ1snKSArIDEsIC0xKSkpIHtcbiAgICAgICAgICAgIG1hc2tlZFNyYyA9IG1hc2tlZFNyYy5zbGljZSgwLCBtYXRjaC5pbmRleClcbiAgICAgICAgICAgICAgKyAnWycgKyAnYScucmVwZWF0KG1hdGNoWzBdLmxlbmd0aCAtIDIpICsgJ10nXG4gICAgICAgICAgICAgICsgbWFza2VkU3JjLnNsaWNlKHRoaXMudG9rZW5pemVyLnJ1bGVzLmlubGluZS5yZWZsaW5rU2VhcmNoLmxhc3RJbmRleCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTWFzayBvdXQgZXNjYXBlZCBjaGFyYWN0ZXJzXG4gICAgd2hpbGUgKChtYXRjaCA9IHRoaXMudG9rZW5pemVyLnJ1bGVzLmlubGluZS5hbnlQdW5jdHVhdGlvbi5leGVjKG1hc2tlZFNyYykpICE9IG51bGwpIHtcbiAgICAgIG1hc2tlZFNyYyA9IG1hc2tlZFNyYy5zbGljZSgwLCBtYXRjaC5pbmRleCkgKyAnKysnICsgbWFza2VkU3JjLnNsaWNlKHRoaXMudG9rZW5pemVyLnJ1bGVzLmlubGluZS5hbnlQdW5jdHVhdGlvbi5sYXN0SW5kZXgpO1xuICAgIH1cblxuICAgIC8vIE1hc2sgb3V0IG90aGVyIGJsb2Nrc1xuICAgIGxldCBvZmZzZXQ7XG4gICAgd2hpbGUgKChtYXRjaCA9IHRoaXMudG9rZW5pemVyLnJ1bGVzLmlubGluZS5ibG9ja1NraXAuZXhlYyhtYXNrZWRTcmMpKSAhPSBudWxsKSB7XG4gICAgICBvZmZzZXQgPSBtYXRjaFsyXSA/IG1hdGNoWzJdLmxlbmd0aCA6IDA7XG4gICAgICBtYXNrZWRTcmMgPSBtYXNrZWRTcmMuc2xpY2UoMCwgbWF0Y2guaW5kZXggKyBvZmZzZXQpICsgJ1snICsgJ2EnLnJlcGVhdChtYXRjaFswXS5sZW5ndGggLSBvZmZzZXQgLSAyKSArICddJyArIG1hc2tlZFNyYy5zbGljZSh0aGlzLnRva2VuaXplci5ydWxlcy5pbmxpbmUuYmxvY2tTa2lwLmxhc3RJbmRleCk7XG4gICAgfVxuXG4gICAgLy8gTWFzayBvdXQgYmxvY2tzIGZyb20gZXh0ZW5zaW9uc1xuICAgIG1hc2tlZFNyYyA9IHRoaXMub3B0aW9ucy5ob29rcz8uZW1TdHJvbmdNYXNrPy5jYWxsKHsgbGV4ZXI6IHRoaXMgfSwgbWFza2VkU3JjKSA/PyBtYXNrZWRTcmM7XG5cbiAgICBsZXQga2VlcFByZXZDaGFyID0gZmFsc2U7XG4gICAgbGV0IHByZXZDaGFyID0gJyc7XG4gICAgd2hpbGUgKHNyYykge1xuICAgICAgaWYgKCFrZWVwUHJldkNoYXIpIHtcbiAgICAgICAgcHJldkNoYXIgPSAnJztcbiAgICAgIH1cbiAgICAgIGtlZXBQcmV2Q2hhciA9IGZhbHNlO1xuXG4gICAgICBsZXQgdG9rZW46IFRva2Vucy5HZW5lcmljIHwgdW5kZWZpbmVkO1xuXG4gICAgICAvLyBleHRlbnNpb25zXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmV4dGVuc2lvbnM/LmlubGluZT8uc29tZSgoZXh0VG9rZW5pemVyKSA9PiB7XG4gICAgICAgIGlmICh0b2tlbiA9IGV4dFRva2VuaXplci5jYWxsKHsgbGV4ZXI6IHRoaXMgfSwgc3JjLCB0b2tlbnMpKSB7XG4gICAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGVzY2FwZVxuICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIuZXNjYXBlKHNyYykpIHtcbiAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gdGFnXG4gICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci50YWcoc3JjKSkge1xuICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBsaW5rXG4gICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5saW5rKHNyYykpIHtcbiAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gcmVmbGluaywgbm9saW5rXG4gICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5yZWZsaW5rKHNyYywgdGhpcy50b2tlbnMubGlua3MpKSB7XG4gICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IGxhc3RUb2tlbiA9IHRva2Vucy5hdCgtMSk7XG4gICAgICAgIGlmICh0b2tlbi50eXBlID09PSAndGV4dCcgJiYgbGFzdFRva2VuPy50eXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgICBsYXN0VG9rZW4ucmF3ICs9IHRva2VuLnJhdztcbiAgICAgICAgICBsYXN0VG9rZW4udGV4dCArPSB0b2tlbi50ZXh0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gZW0gJiBzdHJvbmdcbiAgICAgIGlmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLmVtU3Ryb25nKHNyYywgbWFza2VkU3JjLCBwcmV2Q2hhcikpIHtcbiAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gY29kZVxuICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIuY29kZXNwYW4oc3JjKSkge1xuICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBiclxuICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIuYnIoc3JjKSkge1xuICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBkZWwgKGdmbSlcbiAgICAgIGlmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLmRlbChzcmMsIG1hc2tlZFNyYywgcHJldkNoYXIpKSB7XG4gICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGF1dG9saW5rXG4gICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5hdXRvbGluayhzcmMpKSB7XG4gICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIHVybCAoZ2ZtKVxuICAgICAgaWYgKCF0aGlzLnN0YXRlLmluTGluayAmJiAodG9rZW4gPSB0aGlzLnRva2VuaXplci51cmwoc3JjKSkpIHtcbiAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gdGV4dFxuICAgICAgLy8gcHJldmVudCBpbmxpbmVUZXh0IGNvbnN1bWluZyBleHRlbnNpb25zIGJ5IGNsaXBwaW5nICdzcmMnIHRvIGV4dGVuc2lvbiBzdGFydFxuICAgICAgbGV0IGN1dFNyYyA9IHNyYztcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucz8uc3RhcnRJbmxpbmUpIHtcbiAgICAgICAgbGV0IHN0YXJ0SW5kZXggPSBJbmZpbml0eTtcbiAgICAgICAgY29uc3QgdGVtcFNyYyA9IHNyYy5zbGljZSgxKTtcbiAgICAgICAgbGV0IHRlbXBTdGFydDtcbiAgICAgICAgdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMuc3RhcnRJbmxpbmUuZm9yRWFjaCgoZ2V0U3RhcnRJbmRleCkgPT4ge1xuICAgICAgICAgIHRlbXBTdGFydCA9IGdldFN0YXJ0SW5kZXguY2FsbCh7IGxleGVyOiB0aGlzIH0sIHRlbXBTcmMpO1xuICAgICAgICAgIGlmICh0eXBlb2YgdGVtcFN0YXJ0ID09PSAnbnVtYmVyJyAmJiB0ZW1wU3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgc3RhcnRJbmRleCA9IE1hdGgubWluKHN0YXJ0SW5kZXgsIHRlbXBTdGFydCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHN0YXJ0SW5kZXggPCBJbmZpbml0eSAmJiBzdGFydEluZGV4ID49IDApIHtcbiAgICAgICAgICBjdXRTcmMgPSBzcmMuc3Vic3RyaW5nKDAsIHN0YXJ0SW5kZXggKyAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIuaW5saW5lVGV4dChjdXRTcmMpKSB7XG4gICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgIGlmICh0b2tlbi5yYXcuc2xpY2UoLTEpICE9PSAnXycpIHsgLy8gVHJhY2sgcHJldkNoYXIgYmVmb3JlIHN0cmluZyBvZiBfX19fIHN0YXJ0ZWRcbiAgICAgICAgICBwcmV2Q2hhciA9IHRva2VuLnJhdy5zbGljZSgtMSk7XG4gICAgICAgIH1cbiAgICAgICAga2VlcFByZXZDaGFyID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgbGFzdFRva2VuID0gdG9rZW5zLmF0KC0xKTtcbiAgICAgICAgaWYgKGxhc3RUb2tlbj8udHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICAgICAgbGFzdFRva2VuLnJhdyArPSB0b2tlbi5yYXc7XG4gICAgICAgICAgbGFzdFRva2VuLnRleHQgKz0gdG9rZW4udGV4dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChzcmMpIHtcbiAgICAgICAgY29uc3QgZXJyTXNnID0gJ0luZmluaXRlIGxvb3Agb24gYnl0ZTogJyArIHNyYy5jaGFyQ29kZUF0KDApO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNpbGVudCkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyTXNnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyTXNnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0b2tlbnM7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBfZGVmYXVsdHMgfSBmcm9tICcuL2RlZmF1bHRzLnRzJztcbmltcG9ydCB7XG4gIGNsZWFuVXJsLFxuICBlc2NhcGVIdG1sRW50aXRpZXMsXG59IGZyb20gJy4vaGVscGVycy50cyc7XG5pbXBvcnQgeyBvdGhlciB9IGZyb20gJy4vcnVsZXMudHMnO1xuaW1wb3J0IHR5cGUgeyBNYXJrZWRPcHRpb25zIH0gZnJvbSAnLi9NYXJrZWRPcHRpb25zLnRzJztcbmltcG9ydCB0eXBlIHsgVG9rZW5zIH0gZnJvbSAnLi9Ub2tlbnMudHMnO1xuaW1wb3J0IHR5cGUgeyBfUGFyc2VyIH0gZnJvbSAnLi9QYXJzZXIudHMnO1xuXG4vKipcbiAqIFJlbmRlcmVyXG4gKi9cbmV4cG9ydCBjbGFzcyBfUmVuZGVyZXI8UGFyc2VyT3V0cHV0ID0gc3RyaW5nLCBSZW5kZXJlck91dHB1dCA9IHN0cmluZz4ge1xuICBvcHRpb25zOiBNYXJrZWRPcHRpb25zPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+O1xuICBwYXJzZXIhOiBfUGFyc2VyPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+OyAvLyBzZXQgYnkgdGhlIHBhcnNlclxuICBjb25zdHJ1Y3RvcihvcHRpb25zPzogTWFya2VkT3B0aW9uczxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0Pikge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwgX2RlZmF1bHRzO1xuICB9XG5cbiAgc3BhY2UodG9rZW46IFRva2Vucy5TcGFjZSk6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICByZXR1cm4gJycgYXMgUmVuZGVyZXJPdXRwdXQ7XG4gIH1cblxuICBjb2RlKHsgdGV4dCwgbGFuZywgZXNjYXBlZCB9OiBUb2tlbnMuQ29kZSk6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICBjb25zdCBsYW5nU3RyaW5nID0gKGxhbmcgfHwgJycpLm1hdGNoKG90aGVyLm5vdFNwYWNlU3RhcnQpPy5bMF07XG5cbiAgICBjb25zdCBjb2RlID0gdGV4dC5yZXBsYWNlKG90aGVyLmVuZGluZ05ld2xpbmUsICcnKSArICdcXG4nO1xuXG4gICAgaWYgKCFsYW5nU3RyaW5nKSB7XG4gICAgICByZXR1cm4gJzxwcmU+PGNvZGU+J1xuICAgICAgICArIChlc2NhcGVkID8gY29kZSA6IGVzY2FwZUh0bWxFbnRpdGllcyhjb2RlLCB0cnVlKSlcbiAgICAgICAgKyAnPC9jb2RlPjwvcHJlPlxcbicgYXMgUmVuZGVyZXJPdXRwdXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuICc8cHJlPjxjb2RlIGNsYXNzPVwibGFuZ3VhZ2UtJ1xuICAgICAgKyBlc2NhcGVIdG1sRW50aXRpZXMobGFuZ1N0cmluZylcbiAgICAgICsgJ1wiPidcbiAgICAgICsgKGVzY2FwZWQgPyBjb2RlIDogZXNjYXBlSHRtbEVudGl0aWVzKGNvZGUsIHRydWUpKVxuICAgICAgKyAnPC9jb2RlPjwvcHJlPlxcbicgYXMgUmVuZGVyZXJPdXRwdXQ7XG4gIH1cblxuICBibG9ja3F1b3RlKHsgdG9rZW5zIH06IFRva2Vucy5CbG9ja3F1b3RlKTogUmVuZGVyZXJPdXRwdXQge1xuICAgIGNvbnN0IGJvZHkgPSB0aGlzLnBhcnNlci5wYXJzZSh0b2tlbnMpO1xuICAgIHJldHVybiBgPGJsb2NrcXVvdGU+XFxuJHtib2R5fTwvYmxvY2txdW90ZT5cXG5gIGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgaHRtbCh7IHRleHQgfTogVG9rZW5zLkhUTUwgfCBUb2tlbnMuVGFnKTogUmVuZGVyZXJPdXRwdXQge1xuICAgIHJldHVybiB0ZXh0IGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgZGVmKHRva2VuOiBUb2tlbnMuRGVmKTogUmVuZGVyZXJPdXRwdXQge1xuICAgIHJldHVybiAnJyBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIGhlYWRpbmcoeyB0b2tlbnMsIGRlcHRoIH06IFRva2Vucy5IZWFkaW5nKTogUmVuZGVyZXJPdXRwdXQge1xuICAgIHJldHVybiBgPGgke2RlcHRofT4ke3RoaXMucGFyc2VyLnBhcnNlSW5saW5lKHRva2Vucyl9PC9oJHtkZXB0aH0+XFxuYCBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIGhyKHRva2VuOiBUb2tlbnMuSHIpOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuICc8aHI+XFxuJyBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIGxpc3QodG9rZW46IFRva2Vucy5MaXN0KTogUmVuZGVyZXJPdXRwdXQge1xuICAgIGNvbnN0IG9yZGVyZWQgPSB0b2tlbi5vcmRlcmVkO1xuICAgIGNvbnN0IHN0YXJ0ID0gdG9rZW4uc3RhcnQ7XG5cbiAgICBsZXQgYm9keSA9ICcnO1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgdG9rZW4uaXRlbXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSB0b2tlbi5pdGVtc1tqXTtcbiAgICAgIGJvZHkgKz0gdGhpcy5saXN0aXRlbShpdGVtKTtcbiAgICB9XG5cbiAgICBjb25zdCB0eXBlID0gb3JkZXJlZCA/ICdvbCcgOiAndWwnO1xuICAgIGNvbnN0IHN0YXJ0QXR0ciA9IChvcmRlcmVkICYmIHN0YXJ0ICE9PSAxKSA/ICgnIHN0YXJ0PVwiJyArIHN0YXJ0ICsgJ1wiJykgOiAnJztcbiAgICByZXR1cm4gJzwnICsgdHlwZSArIHN0YXJ0QXR0ciArICc+XFxuJyArIGJvZHkgKyAnPC8nICsgdHlwZSArICc+XFxuJyBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIGxpc3RpdGVtKGl0ZW06IFRva2Vucy5MaXN0SXRlbSk6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICByZXR1cm4gYDxsaT4ke3RoaXMucGFyc2VyLnBhcnNlKGl0ZW0udG9rZW5zKX08L2xpPlxcbmAgYXMgUmVuZGVyZXJPdXRwdXQ7XG4gIH1cblxuICBjaGVja2JveCh7IGNoZWNrZWQgfTogVG9rZW5zLkNoZWNrYm94KTogUmVuZGVyZXJPdXRwdXQge1xuICAgIHJldHVybiAnPGlucHV0ICdcbiAgICAgICsgKGNoZWNrZWQgPyAnY2hlY2tlZD1cIlwiICcgOiAnJylcbiAgICAgICsgJ2Rpc2FibGVkPVwiXCIgdHlwZT1cImNoZWNrYm94XCI+ICcgYXMgUmVuZGVyZXJPdXRwdXQ7XG4gIH1cblxuICBwYXJhZ3JhcGgoeyB0b2tlbnMgfTogVG9rZW5zLlBhcmFncmFwaCk6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICByZXR1cm4gYDxwPiR7dGhpcy5wYXJzZXIucGFyc2VJbmxpbmUodG9rZW5zKX08L3A+XFxuYCBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIHRhYmxlKHRva2VuOiBUb2tlbnMuVGFibGUpOiBSZW5kZXJlck91dHB1dCB7XG4gICAgbGV0IGhlYWRlciA9ICcnO1xuXG4gICAgLy8gaGVhZGVyXG4gICAgbGV0IGNlbGwgPSAnJztcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRva2VuLmhlYWRlci5sZW5ndGg7IGorKykge1xuICAgICAgY2VsbCArPSB0aGlzLnRhYmxlY2VsbCh0b2tlbi5oZWFkZXJbal0pO1xuICAgIH1cbiAgICBoZWFkZXIgKz0gdGhpcy50YWJsZXJvdyh7IHRleHQ6IGNlbGwgYXMgUGFyc2VyT3V0cHV0IH0pO1xuXG4gICAgbGV0IGJvZHkgPSAnJztcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRva2VuLnJvd3MubGVuZ3RoOyBqKyspIHtcbiAgICAgIGNvbnN0IHJvdyA9IHRva2VuLnJvd3Nbal07XG5cbiAgICAgIGNlbGwgPSAnJztcbiAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgcm93Lmxlbmd0aDsgaysrKSB7XG4gICAgICAgIGNlbGwgKz0gdGhpcy50YWJsZWNlbGwocm93W2tdKTtcbiAgICAgIH1cblxuICAgICAgYm9keSArPSB0aGlzLnRhYmxlcm93KHsgdGV4dDogY2VsbCBhcyBQYXJzZXJPdXRwdXQgfSk7XG4gICAgfVxuICAgIGlmIChib2R5KSBib2R5ID0gYDx0Ym9keT4ke2JvZHl9PC90Ym9keT5gO1xuXG4gICAgcmV0dXJuICc8dGFibGU+XFxuJ1xuICAgICAgKyAnPHRoZWFkPlxcbidcbiAgICAgICsgaGVhZGVyXG4gICAgICArICc8L3RoZWFkPlxcbidcbiAgICAgICsgYm9keVxuICAgICAgKyAnPC90YWJsZT5cXG4nIGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgdGFibGVyb3coeyB0ZXh0IH06IFRva2Vucy5UYWJsZVJvdzxQYXJzZXJPdXRwdXQ+KTogUmVuZGVyZXJPdXRwdXQge1xuICAgIHJldHVybiBgPHRyPlxcbiR7dGV4dH08L3RyPlxcbmAgYXMgUmVuZGVyZXJPdXRwdXQ7XG4gIH1cblxuICB0YWJsZWNlbGwodG9rZW46IFRva2Vucy5UYWJsZUNlbGwpOiBSZW5kZXJlck91dHB1dCB7XG4gICAgY29uc3QgY29udGVudCA9IHRoaXMucGFyc2VyLnBhcnNlSW5saW5lKHRva2VuLnRva2Vucyk7XG4gICAgY29uc3QgdHlwZSA9IHRva2VuLmhlYWRlciA/ICd0aCcgOiAndGQnO1xuICAgIGNvbnN0IHRhZyA9IHRva2VuLmFsaWduXG4gICAgICA/IGA8JHt0eXBlfSBhbGlnbj1cIiR7dG9rZW4uYWxpZ259XCI+YFxuICAgICAgOiBgPCR7dHlwZX0+YDtcbiAgICByZXR1cm4gdGFnICsgY29udGVudCArIGA8LyR7dHlwZX0+XFxuYCBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBzcGFuIGxldmVsIHJlbmRlcmVyXG4gICAqL1xuICBzdHJvbmcoeyB0b2tlbnMgfTogVG9rZW5zLlN0cm9uZyk6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICByZXR1cm4gYDxzdHJvbmc+JHt0aGlzLnBhcnNlci5wYXJzZUlubGluZSh0b2tlbnMpfTwvc3Ryb25nPmAgYXMgUmVuZGVyZXJPdXRwdXQ7XG4gIH1cblxuICBlbSh7IHRva2VucyB9OiBUb2tlbnMuRW0pOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuIGA8ZW0+JHt0aGlzLnBhcnNlci5wYXJzZUlubGluZSh0b2tlbnMpfTwvZW0+YCBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIGNvZGVzcGFuKHsgdGV4dCB9OiBUb2tlbnMuQ29kZXNwYW4pOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuIGA8Y29kZT4ke2VzY2FwZUh0bWxFbnRpdGllcyh0ZXh0LCB0cnVlKX08L2NvZGU+YCBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIGJyKHRva2VuOiBUb2tlbnMuQnIpOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuICc8YnI+JyBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIGRlbCh7IHRva2VucyB9OiBUb2tlbnMuRGVsKTogUmVuZGVyZXJPdXRwdXQge1xuICAgIHJldHVybiBgPGRlbD4ke3RoaXMucGFyc2VyLnBhcnNlSW5saW5lKHRva2Vucyl9PC9kZWw+YCBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIGxpbmsoeyBocmVmLCB0aXRsZSwgdG9rZW5zIH06IFRva2Vucy5MaW5rKTogUmVuZGVyZXJPdXRwdXQge1xuICAgIGNvbnN0IHRleHQgPSB0aGlzLnBhcnNlci5wYXJzZUlubGluZSh0b2tlbnMpIGFzIHN0cmluZztcbiAgICBjb25zdCBjbGVhbkhyZWYgPSBjbGVhblVybChocmVmKTtcbiAgICBpZiAoY2xlYW5IcmVmID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gdGV4dCBhcyBSZW5kZXJlck91dHB1dDtcbiAgICB9XG4gICAgaHJlZiA9IGNsZWFuSHJlZjtcbiAgICBsZXQgb3V0ID0gJzxhIGhyZWY9XCInICsgaHJlZiArICdcIic7XG4gICAgaWYgKHRpdGxlKSB7XG4gICAgICBvdXQgKz0gJyB0aXRsZT1cIicgKyAoZXNjYXBlSHRtbEVudGl0aWVzKHRpdGxlKSkgKyAnXCInO1xuICAgIH1cbiAgICBvdXQgKz0gJz4nICsgdGV4dCArICc8L2E+JztcbiAgICByZXR1cm4gb3V0IGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgaW1hZ2UoeyBocmVmLCB0aXRsZSwgdGV4dCwgdG9rZW5zIH06IFRva2Vucy5JbWFnZSk6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICBpZiAodG9rZW5zKSB7XG4gICAgICB0ZXh0ID0gdGhpcy5wYXJzZXIucGFyc2VJbmxpbmUodG9rZW5zLCB0aGlzLnBhcnNlci50ZXh0UmVuZGVyZXIpIGFzIHN0cmluZztcbiAgICB9XG4gICAgY29uc3QgY2xlYW5IcmVmID0gY2xlYW5VcmwoaHJlZik7XG4gICAgaWYgKGNsZWFuSHJlZiA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGVzY2FwZUh0bWxFbnRpdGllcyh0ZXh0KSBhcyBSZW5kZXJlck91dHB1dDtcbiAgICB9XG4gICAgaHJlZiA9IGNsZWFuSHJlZjtcblxuICAgIGxldCBvdXQgPSBgPGltZyBzcmM9XCIke2hyZWZ9XCIgYWx0PVwiJHtlc2NhcGVIdG1sRW50aXRpZXModGV4dCl9XCJgO1xuICAgIGlmICh0aXRsZSkge1xuICAgICAgb3V0ICs9IGAgdGl0bGU9XCIke2VzY2FwZUh0bWxFbnRpdGllcyh0aXRsZSl9XCJgO1xuICAgIH1cbiAgICBvdXQgKz0gJz4nO1xuICAgIHJldHVybiBvdXQgYXMgUmVuZGVyZXJPdXRwdXQ7XG4gIH1cblxuICB0ZXh0KHRva2VuOiBUb2tlbnMuVGV4dCB8IFRva2Vucy5Fc2NhcGUpOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuICd0b2tlbnMnIGluIHRva2VuICYmIHRva2VuLnRva2Vuc1xuICAgICAgPyB0aGlzLnBhcnNlci5wYXJzZUlubGluZSh0b2tlbi50b2tlbnMpIGFzIHVua25vd24gYXMgUmVuZGVyZXJPdXRwdXRcbiAgICAgIDogKCdlc2NhcGVkJyBpbiB0b2tlbiAmJiB0b2tlbi5lc2NhcGVkID8gdG9rZW4udGV4dCBhcyBSZW5kZXJlck91dHB1dCA6IGVzY2FwZUh0bWxFbnRpdGllcyh0b2tlbi50ZXh0KSBhcyBSZW5kZXJlck91dHB1dCk7XG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IFRva2VucyB9IGZyb20gJy4vVG9rZW5zLnRzJztcblxuLyoqXG4gKiBUZXh0UmVuZGVyZXJcbiAqIHJldHVybnMgb25seSB0aGUgdGV4dHVhbCBwYXJ0IG9mIHRoZSB0b2tlblxuICovXG5leHBvcnQgY2xhc3MgX1RleHRSZW5kZXJlcjxSZW5kZXJlck91dHB1dCA9IHN0cmluZz4ge1xuICAvLyBubyBuZWVkIGZvciBibG9jayBsZXZlbCByZW5kZXJlcnNcbiAgc3Ryb25nKHsgdGV4dCB9OiBUb2tlbnMuU3Ryb25nKTogUmVuZGVyZXJPdXRwdXQge1xuICAgIHJldHVybiB0ZXh0IGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgZW0oeyB0ZXh0IH06IFRva2Vucy5FbSk6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICByZXR1cm4gdGV4dCBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIGNvZGVzcGFuKHsgdGV4dCB9OiBUb2tlbnMuQ29kZXNwYW4pOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuIHRleHQgYXMgUmVuZGVyZXJPdXRwdXQ7XG4gIH1cblxuICBkZWwoeyB0ZXh0IH06IFRva2Vucy5EZWwpOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuIHRleHQgYXMgUmVuZGVyZXJPdXRwdXQ7XG4gIH1cblxuICBodG1sKHsgdGV4dCB9OiBUb2tlbnMuSFRNTCB8IFRva2Vucy5UYWcpOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuIHRleHQgYXMgUmVuZGVyZXJPdXRwdXQ7XG4gIH1cblxuICB0ZXh0KHsgdGV4dCB9OiBUb2tlbnMuVGV4dCB8IFRva2Vucy5Fc2NhcGUgfCBUb2tlbnMuVGFnKTogUmVuZGVyZXJPdXRwdXQge1xuICAgIHJldHVybiB0ZXh0IGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgbGluayh7IHRleHQgfTogVG9rZW5zLkxpbmspOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuICcnICsgdGV4dCBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIGltYWdlKHsgdGV4dCB9OiBUb2tlbnMuSW1hZ2UpOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuICcnICsgdGV4dCBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIGJyKCk6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICByZXR1cm4gJycgYXMgUmVuZGVyZXJPdXRwdXQ7XG4gIH1cblxuICBjaGVja2JveCh7IHJhdyB9OiBUb2tlbnMuQ2hlY2tib3gpOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuIHJhdyBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxufVxuIiwgImltcG9ydCB7IF9SZW5kZXJlciB9IGZyb20gJy4vUmVuZGVyZXIudHMnO1xuaW1wb3J0IHsgX1RleHRSZW5kZXJlciB9IGZyb20gJy4vVGV4dFJlbmRlcmVyLnRzJztcbmltcG9ydCB7IF9kZWZhdWx0cyB9IGZyb20gJy4vZGVmYXVsdHMudHMnO1xuaW1wb3J0IHR5cGUgeyBNYXJrZWRUb2tlbiwgVG9rZW4sIFRva2VucyB9IGZyb20gJy4vVG9rZW5zLnRzJztcbmltcG9ydCB0eXBlIHsgTWFya2VkT3B0aW9ucyB9IGZyb20gJy4vTWFya2VkT3B0aW9ucy50cyc7XG5cbi8qKlxuICogUGFyc2luZyAmIENvbXBpbGluZ1xuICovXG5leHBvcnQgY2xhc3MgX1BhcnNlcjxQYXJzZXJPdXRwdXQgPSBzdHJpbmcsIFJlbmRlcmVyT3V0cHV0ID0gc3RyaW5nPiB7XG4gIG9wdGlvbnM6IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD47XG4gIHJlbmRlcmVyOiBfUmVuZGVyZXI8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD47XG4gIHRleHRSZW5kZXJlcjogX1RleHRSZW5kZXJlcjxSZW5kZXJlck91dHB1dD47XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBNYXJrZWRPcHRpb25zPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+KSB7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCBfZGVmYXVsdHM7XG4gICAgdGhpcy5vcHRpb25zLnJlbmRlcmVyID0gdGhpcy5vcHRpb25zLnJlbmRlcmVyIHx8IG5ldyBfUmVuZGVyZXI8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4oKTtcbiAgICB0aGlzLnJlbmRlcmVyID0gdGhpcy5vcHRpb25zLnJlbmRlcmVyO1xuICAgIHRoaXMucmVuZGVyZXIub3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICB0aGlzLnJlbmRlcmVyLnBhcnNlciA9IHRoaXM7XG4gICAgdGhpcy50ZXh0UmVuZGVyZXIgPSBuZXcgX1RleHRSZW5kZXJlcjxSZW5kZXJlck91dHB1dD4oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0aWMgUGFyc2UgTWV0aG9kXG4gICAqL1xuICBzdGF0aWMgcGFyc2U8UGFyc2VyT3V0cHV0ID0gc3RyaW5nLCBSZW5kZXJlck91dHB1dCA9IHN0cmluZz4odG9rZW5zOiBUb2tlbltdLCBvcHRpb25zPzogTWFya2VkT3B0aW9uczxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0Pikge1xuICAgIGNvbnN0IHBhcnNlciA9IG5ldyBfUGFyc2VyPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+KG9wdGlvbnMpO1xuICAgIHJldHVybiBwYXJzZXIucGFyc2UodG9rZW5zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0aWMgUGFyc2UgSW5saW5lIE1ldGhvZFxuICAgKi9cbiAgc3RhdGljIHBhcnNlSW5saW5lPFBhcnNlck91dHB1dCA9IHN0cmluZywgUmVuZGVyZXJPdXRwdXQgPSBzdHJpbmc+KHRva2VuczogVG9rZW5bXSwgb3B0aW9ucz86IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4pIHtcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgX1BhcnNlcjxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0PihvcHRpb25zKTtcbiAgICByZXR1cm4gcGFyc2VyLnBhcnNlSW5saW5lKHRva2Vucyk7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgTG9vcFxuICAgKi9cbiAgcGFyc2UodG9rZW5zOiBUb2tlbltdKTogUGFyc2VyT3V0cHV0IHtcbiAgICB0aGlzLnJlbmRlcmVyLnBhcnNlciA9IHRoaXM7XG4gICAgbGV0IG91dCA9ICcnO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGFueVRva2VuID0gdG9rZW5zW2ldO1xuXG4gICAgICAvLyBSdW4gYW55IHJlbmRlcmVyIGV4dGVuc2lvbnNcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucz8ucmVuZGVyZXJzPy5bYW55VG9rZW4udHlwZV0pIHtcbiAgICAgICAgY29uc3QgZ2VuZXJpY1Rva2VuID0gYW55VG9rZW4gYXMgVG9rZW5zLkdlbmVyaWM7XG4gICAgICAgIGNvbnN0IHJldCA9IHRoaXMub3B0aW9ucy5leHRlbnNpb25zLnJlbmRlcmVyc1tnZW5lcmljVG9rZW4udHlwZV0uY2FsbCh7IHBhcnNlcjogdGhpcyB9LCBnZW5lcmljVG9rZW4pO1xuICAgICAgICBpZiAocmV0ICE9PSBmYWxzZSB8fCAhWydzcGFjZScsICdocicsICdoZWFkaW5nJywgJ2NvZGUnLCAndGFibGUnLCAnYmxvY2txdW90ZScsICdsaXN0JywgJ2h0bWwnLCAnZGVmJywgJ3BhcmFncmFwaCcsICd0ZXh0J10uaW5jbHVkZXMoZ2VuZXJpY1Rva2VuLnR5cGUpKSB7XG4gICAgICAgICAgb3V0ICs9IHJldCB8fCAnJztcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCB0b2tlbiA9IGFueVRva2VuIGFzIE1hcmtlZFRva2VuO1xuXG4gICAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnc3BhY2UnOiB7XG4gICAgICAgICAgb3V0ICs9IHRoaXMucmVuZGVyZXIuc3BhY2UodG9rZW4pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2hyJzoge1xuICAgICAgICAgIG91dCArPSB0aGlzLnJlbmRlcmVyLmhyKHRva2VuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdoZWFkaW5nJzoge1xuICAgICAgICAgIG91dCArPSB0aGlzLnJlbmRlcmVyLmhlYWRpbmcodG9rZW4pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2NvZGUnOiB7XG4gICAgICAgICAgb3V0ICs9IHRoaXMucmVuZGVyZXIuY29kZSh0b2tlbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndGFibGUnOiB7XG4gICAgICAgICAgb3V0ICs9IHRoaXMucmVuZGVyZXIudGFibGUodG9rZW4pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2Jsb2NrcXVvdGUnOiB7XG4gICAgICAgICAgb3V0ICs9IHRoaXMucmVuZGVyZXIuYmxvY2txdW90ZSh0b2tlbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnbGlzdCc6IHtcbiAgICAgICAgICBvdXQgKz0gdGhpcy5yZW5kZXJlci5saXN0KHRva2VuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdjaGVja2JveCc6IHtcbiAgICAgICAgICBvdXQgKz0gdGhpcy5yZW5kZXJlci5jaGVja2JveCh0b2tlbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnaHRtbCc6IHtcbiAgICAgICAgICBvdXQgKz0gdGhpcy5yZW5kZXJlci5odG1sKHRva2VuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkZWYnOiB7XG4gICAgICAgICAgb3V0ICs9IHRoaXMucmVuZGVyZXIuZGVmKHRva2VuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdwYXJhZ3JhcGgnOiB7XG4gICAgICAgICAgb3V0ICs9IHRoaXMucmVuZGVyZXIucGFyYWdyYXBoKHRva2VuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0ZXh0Jzoge1xuICAgICAgICAgIG91dCArPSB0aGlzLnJlbmRlcmVyLnRleHQodG9rZW4pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIGNvbnN0IGVyck1zZyA9ICdUb2tlbiB3aXRoIFwiJyArIHRva2VuLnR5cGUgKyAnXCIgdHlwZSB3YXMgbm90IGZvdW5kLic7XG4gICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyTXNnKTtcbiAgICAgICAgICAgIHJldHVybiAnJyBhcyBQYXJzZXJPdXRwdXQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJNc2cpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvdXQgYXMgUGFyc2VyT3V0cHV0O1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIElubGluZSBUb2tlbnNcbiAgICovXG4gIHBhcnNlSW5saW5lKHRva2VuczogVG9rZW5bXSwgcmVuZGVyZXI6IF9SZW5kZXJlcjxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0PiB8IF9UZXh0UmVuZGVyZXI8UmVuZGVyZXJPdXRwdXQ+ID0gdGhpcy5yZW5kZXJlcik6IFBhcnNlck91dHB1dCB7XG4gICAgdGhpcy5yZW5kZXJlci5wYXJzZXIgPSB0aGlzO1xuICAgIGxldCBvdXQgPSAnJztcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBhbnlUb2tlbiA9IHRva2Vuc1tpXTtcblxuICAgICAgLy8gUnVuIGFueSByZW5kZXJlciBleHRlbnNpb25zXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmV4dGVuc2lvbnM/LnJlbmRlcmVycz8uW2FueVRva2VuLnR5cGVdKSB7XG4gICAgICAgIGNvbnN0IHJldCA9IHRoaXMub3B0aW9ucy5leHRlbnNpb25zLnJlbmRlcmVyc1thbnlUb2tlbi50eXBlXS5jYWxsKHsgcGFyc2VyOiB0aGlzIH0sIGFueVRva2VuKTtcbiAgICAgICAgaWYgKHJldCAhPT0gZmFsc2UgfHwgIVsnZXNjYXBlJywgJ2h0bWwnLCAnbGluaycsICdpbWFnZScsICdzdHJvbmcnLCAnZW0nLCAnY29kZXNwYW4nLCAnYnInLCAnZGVsJywgJ3RleHQnXS5pbmNsdWRlcyhhbnlUb2tlbi50eXBlKSkge1xuICAgICAgICAgIG91dCArPSByZXQgfHwgJyc7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgdG9rZW4gPSBhbnlUb2tlbiBhcyBNYXJrZWRUb2tlbjtcblxuICAgICAgc3dpdGNoICh0b2tlbi50eXBlKSB7XG4gICAgICAgIGNhc2UgJ2VzY2FwZSc6IHtcbiAgICAgICAgICBvdXQgKz0gcmVuZGVyZXIudGV4dCh0b2tlbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnaHRtbCc6IHtcbiAgICAgICAgICBvdXQgKz0gcmVuZGVyZXIuaHRtbCh0b2tlbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnbGluayc6IHtcbiAgICAgICAgICBvdXQgKz0gcmVuZGVyZXIubGluayh0b2tlbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnaW1hZ2UnOiB7XG4gICAgICAgICAgb3V0ICs9IHJlbmRlcmVyLmltYWdlKHRva2VuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdjaGVja2JveCc6IHtcbiAgICAgICAgICBvdXQgKz0gcmVuZGVyZXIuY2hlY2tib3godG9rZW4pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3N0cm9uZyc6IHtcbiAgICAgICAgICBvdXQgKz0gcmVuZGVyZXIuc3Ryb25nKHRva2VuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdlbSc6IHtcbiAgICAgICAgICBvdXQgKz0gcmVuZGVyZXIuZW0odG9rZW4pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2NvZGVzcGFuJzoge1xuICAgICAgICAgIG91dCArPSByZW5kZXJlci5jb2Rlc3Bhbih0b2tlbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnYnInOiB7XG4gICAgICAgICAgb3V0ICs9IHJlbmRlcmVyLmJyKHRva2VuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkZWwnOiB7XG4gICAgICAgICAgb3V0ICs9IHJlbmRlcmVyLmRlbCh0b2tlbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndGV4dCc6IHtcbiAgICAgICAgICBvdXQgKz0gcmVuZGVyZXIudGV4dCh0b2tlbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIGNvbnN0IGVyck1zZyA9ICdUb2tlbiB3aXRoIFwiJyArIHRva2VuLnR5cGUgKyAnXCIgdHlwZSB3YXMgbm90IGZvdW5kLic7XG4gICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyTXNnKTtcbiAgICAgICAgICAgIHJldHVybiAnJyBhcyBQYXJzZXJPdXRwdXQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJNc2cpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0IGFzIFBhcnNlck91dHB1dDtcbiAgfVxufVxuIiwgImltcG9ydCB7IF9kZWZhdWx0cyB9IGZyb20gJy4vZGVmYXVsdHMudHMnO1xuaW1wb3J0IHsgX0xleGVyIH0gZnJvbSAnLi9MZXhlci50cyc7XG5pbXBvcnQgeyBfUGFyc2VyIH0gZnJvbSAnLi9QYXJzZXIudHMnO1xuaW1wb3J0IHR5cGUgeyBNYXJrZWRPcHRpb25zIH0gZnJvbSAnLi9NYXJrZWRPcHRpb25zLnRzJztcbmltcG9ydCB0eXBlIHsgVG9rZW4sIFRva2Vuc0xpc3QgfSBmcm9tICcuL1Rva2Vucy50cyc7XG5cbmV4cG9ydCBjbGFzcyBfSG9va3M8UGFyc2VyT3V0cHV0ID0gc3RyaW5nLCBSZW5kZXJlck91dHB1dCA9IHN0cmluZz4ge1xuICBvcHRpb25zOiBNYXJrZWRPcHRpb25zPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+O1xuICBibG9jaz86IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3Iob3B0aW9ucz86IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4pIHtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IF9kZWZhdWx0cztcbiAgfVxuXG4gIHN0YXRpYyBwYXNzVGhyb3VnaEhvb2tzID0gbmV3IFNldChbXG4gICAgJ3ByZXByb2Nlc3MnLFxuICAgICdwb3N0cHJvY2VzcycsXG4gICAgJ3Byb2Nlc3NBbGxUb2tlbnMnLFxuICAgICdlbVN0cm9uZ01hc2snLFxuICBdKTtcblxuICBzdGF0aWMgcGFzc1Rocm91Z2hIb29rc1Jlc3BlY3RBc3luYyA9IG5ldyBTZXQoW1xuICAgICdwcmVwcm9jZXNzJyxcbiAgICAncG9zdHByb2Nlc3MnLFxuICAgICdwcm9jZXNzQWxsVG9rZW5zJyxcbiAgXSk7XG5cbiAgLyoqXG4gICAqIFByb2Nlc3MgbWFya2Rvd24gYmVmb3JlIG1hcmtlZFxuICAgKi9cbiAgcHJlcHJvY2VzcyhtYXJrZG93bjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIG1hcmtkb3duO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3MgSFRNTCBhZnRlciBtYXJrZWQgaXMgZmluaXNoZWRcbiAgICovXG4gIHBvc3Rwcm9jZXNzKGh0bWw6IFBhcnNlck91dHB1dCkge1xuICAgIHJldHVybiBodG1sO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3MgYWxsIHRva2VucyBiZWZvcmUgd2FsayB0b2tlbnNcbiAgICovXG4gIHByb2Nlc3NBbGxUb2tlbnModG9rZW5zOiBUb2tlbltdIHwgVG9rZW5zTGlzdCkge1xuICAgIHJldHVybiB0b2tlbnM7XG4gIH1cblxuICAvKipcbiAgICogTWFzayBjb250ZW50cyB0aGF0IHNob3VsZCBub3QgYmUgaW50ZXJwcmV0ZWQgYXMgZW0vc3Ryb25nIGRlbGltaXRlcnNcbiAgICovXG4gIGVtU3Ryb25nTWFzayhzcmM6IHN0cmluZykge1xuICAgIHJldHVybiBzcmM7XG4gIH1cblxuICAvKipcbiAgICogUHJvdmlkZSBmdW5jdGlvbiB0byB0b2tlbml6ZSBtYXJrZG93blxuICAgKi9cbiAgcHJvdmlkZUxleGVyKCkge1xuICAgIHJldHVybiB0aGlzLmJsb2NrID8gX0xleGVyLmxleCA6IF9MZXhlci5sZXhJbmxpbmU7XG4gIH1cblxuICAvKipcbiAgICogUHJvdmlkZSBmdW5jdGlvbiB0byBwYXJzZSB0b2tlbnNcbiAgICovXG4gIHByb3ZpZGVQYXJzZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuYmxvY2sgPyBfUGFyc2VyLnBhcnNlPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+IDogX1BhcnNlci5wYXJzZUlubGluZTxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0PjtcbiAgfVxufVxuIiwgImltcG9ydCB7IF9nZXREZWZhdWx0cyB9IGZyb20gJy4vZGVmYXVsdHMudHMnO1xuaW1wb3J0IHsgX0xleGVyIH0gZnJvbSAnLi9MZXhlci50cyc7XG5pbXBvcnQgeyBfUGFyc2VyIH0gZnJvbSAnLi9QYXJzZXIudHMnO1xuaW1wb3J0IHsgX0hvb2tzIH0gZnJvbSAnLi9Ib29rcy50cyc7XG5pbXBvcnQgeyBfUmVuZGVyZXIgfSBmcm9tICcuL1JlbmRlcmVyLnRzJztcbmltcG9ydCB7IF9Ub2tlbml6ZXIgfSBmcm9tICcuL1Rva2VuaXplci50cyc7XG5pbXBvcnQgeyBfVGV4dFJlbmRlcmVyIH0gZnJvbSAnLi9UZXh0UmVuZGVyZXIudHMnO1xuaW1wb3J0IHsgZXNjYXBlSHRtbEVudGl0aWVzIH0gZnJvbSAnLi9oZWxwZXJzLnRzJztcbmltcG9ydCB0eXBlIHsgTWFya2VkRXh0ZW5zaW9uLCBNYXJrZWRPcHRpb25zIH0gZnJvbSAnLi9NYXJrZWRPcHRpb25zLnRzJztcbmltcG9ydCB0eXBlIHsgVG9rZW4sIFRva2VucywgVG9rZW5zTGlzdCB9IGZyb20gJy4vVG9rZW5zLnRzJztcblxuZXhwb3J0IHR5cGUgTWF5YmVQcm9taXNlID0gdm9pZCB8IFByb21pc2U8dm9pZD47XG5cbnR5cGUgVW5rbm93bkZ1bmN0aW9uID0gKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdW5rbm93bjtcbnR5cGUgR2VuZXJpY1JlbmRlcmVyRnVuY3Rpb24gPSAoLi4uYXJnczogdW5rbm93bltdKSA9PiBzdHJpbmcgfCBmYWxzZTtcblxuZXhwb3J0IGNsYXNzIE1hcmtlZDxQYXJzZXJPdXRwdXQgPSBzdHJpbmcsIFJlbmRlcmVyT3V0cHV0ID0gc3RyaW5nPiB7XG4gIGRlZmF1bHRzID0gX2dldERlZmF1bHRzPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+KCk7XG4gIG9wdGlvbnMgPSB0aGlzLnNldE9wdGlvbnM7XG5cbiAgcGFyc2UgPSB0aGlzLnBhcnNlTWFya2Rvd24odHJ1ZSk7XG4gIHBhcnNlSW5saW5lID0gdGhpcy5wYXJzZU1hcmtkb3duKGZhbHNlKTtcblxuICBQYXJzZXIgPSBfUGFyc2VyPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+O1xuICBSZW5kZXJlciA9IF9SZW5kZXJlcjxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0PjtcbiAgVGV4dFJlbmRlcmVyID0gX1RleHRSZW5kZXJlcjxSZW5kZXJlck91dHB1dD47XG4gIExleGVyID0gX0xleGVyO1xuICBUb2tlbml6ZXIgPSBfVG9rZW5pemVyPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+O1xuICBIb29rcyA9IF9Ib29rczxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0PjtcblxuICBjb25zdHJ1Y3RvciguLi5hcmdzOiBNYXJrZWRFeHRlbnNpb248UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD5bXSkge1xuICAgIHRoaXMudXNlKC4uLmFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1biBjYWxsYmFjayBmb3IgZXZlcnkgdG9rZW5cbiAgICovXG4gIHdhbGtUb2tlbnModG9rZW5zOiBUb2tlbltdIHwgVG9rZW5zTGlzdCwgY2FsbGJhY2s6ICh0b2tlbjogVG9rZW4pID0+IE1heWJlUHJvbWlzZSB8IE1heWJlUHJvbWlzZVtdKSB7XG4gICAgbGV0IHZhbHVlczogTWF5YmVQcm9taXNlW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHRva2Vucykge1xuICAgICAgdmFsdWVzID0gdmFsdWVzLmNvbmNhdChjYWxsYmFjay5jYWxsKHRoaXMsIHRva2VuKSk7XG4gICAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcbiAgICAgICAgY2FzZSAndGFibGUnOiB7XG4gICAgICAgICAgY29uc3QgdGFibGVUb2tlbiA9IHRva2VuIGFzIFRva2Vucy5UYWJsZTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGNlbGwgb2YgdGFibGVUb2tlbi5oZWFkZXIpIHtcbiAgICAgICAgICAgIHZhbHVlcyA9IHZhbHVlcy5jb25jYXQodGhpcy53YWxrVG9rZW5zKGNlbGwudG9rZW5zLCBjYWxsYmFjaykpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKGNvbnN0IHJvdyBvZiB0YWJsZVRva2VuLnJvd3MpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2VsbCBvZiByb3cpIHtcbiAgICAgICAgICAgICAgdmFsdWVzID0gdmFsdWVzLmNvbmNhdCh0aGlzLndhbGtUb2tlbnMoY2VsbC50b2tlbnMsIGNhbGxiYWNrKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2xpc3QnOiB7XG4gICAgICAgICAgY29uc3QgbGlzdFRva2VuID0gdG9rZW4gYXMgVG9rZW5zLkxpc3Q7XG4gICAgICAgICAgdmFsdWVzID0gdmFsdWVzLmNvbmNhdCh0aGlzLndhbGtUb2tlbnMobGlzdFRva2VuLml0ZW1zLCBjYWxsYmFjaykpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBjb25zdCBnZW5lcmljVG9rZW4gPSB0b2tlbiBhcyBUb2tlbnMuR2VuZXJpYztcbiAgICAgICAgICBpZiAodGhpcy5kZWZhdWx0cy5leHRlbnNpb25zPy5jaGlsZFRva2Vucz8uW2dlbmVyaWNUb2tlbi50eXBlXSkge1xuICAgICAgICAgICAgdGhpcy5kZWZhdWx0cy5leHRlbnNpb25zLmNoaWxkVG9rZW5zW2dlbmVyaWNUb2tlbi50eXBlXS5mb3JFYWNoKChjaGlsZFRva2VucykgPT4ge1xuICAgICAgICAgICAgICBjb25zdCB0b2tlbnMgPSBnZW5lcmljVG9rZW5bY2hpbGRUb2tlbnNdLmZsYXQoSW5maW5pdHkpIGFzIFRva2VuW10gfCBUb2tlbnNMaXN0O1xuICAgICAgICAgICAgICB2YWx1ZXMgPSB2YWx1ZXMuY29uY2F0KHRoaXMud2Fsa1Rva2Vucyh0b2tlbnMsIGNhbGxiYWNrKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGdlbmVyaWNUb2tlbi50b2tlbnMpIHtcbiAgICAgICAgICAgIHZhbHVlcyA9IHZhbHVlcy5jb25jYXQodGhpcy53YWxrVG9rZW5zKGdlbmVyaWNUb2tlbi50b2tlbnMsIGNhbGxiYWNrKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZXM7XG4gIH1cblxuICB1c2UoLi4uYXJnczogTWFya2VkRXh0ZW5zaW9uPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+W10pIHtcbiAgICBjb25zdCBleHRlbnNpb25zOiBNYXJrZWRPcHRpb25zPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+WydleHRlbnNpb25zJ10gPSB0aGlzLmRlZmF1bHRzLmV4dGVuc2lvbnMgfHwgeyByZW5kZXJlcnM6IHt9LCBjaGlsZFRva2Vuczoge30gfTtcblxuICAgIGFyZ3MuZm9yRWFjaCgocGFjaykgPT4ge1xuICAgICAgLy8gY29weSBvcHRpb25zIHRvIG5ldyBvYmplY3RcbiAgICAgIGNvbnN0IG9wdHMgPSB7IC4uLnBhY2sgfSBhcyBNYXJrZWRPcHRpb25zPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+O1xuXG4gICAgICAvLyBzZXQgYXN5bmMgdG8gdHJ1ZSBpZiBpdCB3YXMgc2V0IHRvIHRydWUgYmVmb3JlXG4gICAgICBvcHRzLmFzeW5jID0gdGhpcy5kZWZhdWx0cy5hc3luYyB8fCBvcHRzLmFzeW5jIHx8IGZhbHNlO1xuXG4gICAgICAvLyA9PS0tIFBhcnNlIFwiYWRkb25cIiBleHRlbnNpb25zIC0tPT0gLy9cbiAgICAgIGlmIChwYWNrLmV4dGVuc2lvbnMpIHtcbiAgICAgICAgcGFjay5leHRlbnNpb25zLmZvckVhY2goKGV4dCkgPT4ge1xuICAgICAgICAgIGlmICghZXh0Lm5hbWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZXh0ZW5zaW9uIG5hbWUgcmVxdWlyZWQnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCdyZW5kZXJlcicgaW4gZXh0KSB7IC8vIFJlbmRlcmVyIGV4dGVuc2lvbnNcbiAgICAgICAgICAgIGNvbnN0IHByZXZSZW5kZXJlciA9IGV4dGVuc2lvbnMucmVuZGVyZXJzW2V4dC5uYW1lXTtcbiAgICAgICAgICAgIGlmIChwcmV2UmVuZGVyZXIpIHtcbiAgICAgICAgICAgICAgLy8gUmVwbGFjZSBleHRlbnNpb24gd2l0aCBmdW5jIHRvIHJ1biBuZXcgZXh0ZW5zaW9uIGJ1dCBmYWxsIGJhY2sgaWYgZmFsc2VcbiAgICAgICAgICAgICAgZXh0ZW5zaW9ucy5yZW5kZXJlcnNbZXh0Lm5hbWVdID0gZnVuY3Rpb24oLi4uYXJncykge1xuICAgICAgICAgICAgICAgIGxldCByZXQgPSBleHQucmVuZGVyZXIuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgICAgICAgICAgaWYgKHJldCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgIHJldCA9IHByZXZSZW5kZXJlci5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGV4dGVuc2lvbnMucmVuZGVyZXJzW2V4dC5uYW1lXSA9IGV4dC5yZW5kZXJlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCd0b2tlbml6ZXInIGluIGV4dCkgeyAvLyBUb2tlbml6ZXIgRXh0ZW5zaW9uc1xuICAgICAgICAgICAgaWYgKCFleHQubGV2ZWwgfHwgKGV4dC5sZXZlbCAhPT0gJ2Jsb2NrJyAmJiBleHQubGV2ZWwgIT09ICdpbmxpbmUnKSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJleHRlbnNpb24gbGV2ZWwgbXVzdCBiZSAnYmxvY2snIG9yICdpbmxpbmUnXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZXh0TGV2ZWwgPSBleHRlbnNpb25zW2V4dC5sZXZlbF07XG4gICAgICAgICAgICBpZiAoZXh0TGV2ZWwpIHtcbiAgICAgICAgICAgICAgZXh0TGV2ZWwudW5zaGlmdChleHQudG9rZW5pemVyKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGV4dGVuc2lvbnNbZXh0LmxldmVsXSA9IFtleHQudG9rZW5pemVyXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChleHQuc3RhcnQpIHsgLy8gRnVuY3Rpb24gdG8gY2hlY2sgZm9yIHN0YXJ0IG9mIHRva2VuXG4gICAgICAgICAgICAgIGlmIChleHQubGV2ZWwgPT09ICdibG9jaycpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXh0ZW5zaW9ucy5zdGFydEJsb2NrKSB7XG4gICAgICAgICAgICAgICAgICBleHRlbnNpb25zLnN0YXJ0QmxvY2sucHVzaChleHQuc3RhcnQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBleHRlbnNpb25zLnN0YXJ0QmxvY2sgPSBbZXh0LnN0YXJ0XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXh0LmxldmVsID09PSAnaW5saW5lJykge1xuICAgICAgICAgICAgICAgIGlmIChleHRlbnNpb25zLnN0YXJ0SW5saW5lKSB7XG4gICAgICAgICAgICAgICAgICBleHRlbnNpb25zLnN0YXJ0SW5saW5lLnB1c2goZXh0LnN0YXJ0KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9ucy5zdGFydElubGluZSA9IFtleHQuc3RhcnRdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoJ2NoaWxkVG9rZW5zJyBpbiBleHQgJiYgZXh0LmNoaWxkVG9rZW5zKSB7IC8vIENoaWxkIHRva2VucyB0byBiZSB2aXNpdGVkIGJ5IHdhbGtUb2tlbnNcbiAgICAgICAgICAgIGV4dGVuc2lvbnMuY2hpbGRUb2tlbnNbZXh0Lm5hbWVdID0gZXh0LmNoaWxkVG9rZW5zO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIG9wdHMuZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnM7XG4gICAgICB9XG5cbiAgICAgIC8vID09LS0gUGFyc2UgXCJvdmVyd3JpdGVcIiBleHRlbnNpb25zIC0tPT0gLy9cbiAgICAgIGlmIChwYWNrLnJlbmRlcmVyKSB7XG4gICAgICAgIGNvbnN0IHJlbmRlcmVyID0gdGhpcy5kZWZhdWx0cy5yZW5kZXJlciB8fCBuZXcgX1JlbmRlcmVyPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+KHRoaXMuZGVmYXVsdHMpO1xuICAgICAgICBmb3IgKGNvbnN0IHByb3AgaW4gcGFjay5yZW5kZXJlcikge1xuICAgICAgICAgIGlmICghKHByb3AgaW4gcmVuZGVyZXIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHJlbmRlcmVyICcke3Byb3B9JyBkb2VzIG5vdCBleGlzdGApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoWydvcHRpb25zJywgJ3BhcnNlciddLmluY2x1ZGVzKHByb3ApKSB7XG4gICAgICAgICAgICAvLyBpZ25vcmUgb3B0aW9ucyBwcm9wZXJ0eVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHJlbmRlcmVyUHJvcCA9IHByb3AgYXMgRXhjbHVkZTxrZXlvZiBfUmVuZGVyZXI8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4sICdvcHRpb25zJyB8ICdwYXJzZXInPjtcbiAgICAgICAgICBjb25zdCByZW5kZXJlckZ1bmMgPSBwYWNrLnJlbmRlcmVyW3JlbmRlcmVyUHJvcF0gYXMgR2VuZXJpY1JlbmRlcmVyRnVuY3Rpb247XG4gICAgICAgICAgY29uc3QgcHJldlJlbmRlcmVyID0gcmVuZGVyZXJbcmVuZGVyZXJQcm9wXSBhcyBHZW5lcmljUmVuZGVyZXJGdW5jdGlvbjtcbiAgICAgICAgICAvLyBSZXBsYWNlIHJlbmRlcmVyIHdpdGggZnVuYyB0byBydW4gZXh0ZW5zaW9uLCBidXQgZmFsbCBiYWNrIGlmIGZhbHNlXG4gICAgICAgICAgcmVuZGVyZXJbcmVuZGVyZXJQcm9wXSA9ICguLi5hcmdzOiB1bmtub3duW10pID0+IHtcbiAgICAgICAgICAgIGxldCByZXQgPSByZW5kZXJlckZ1bmMuYXBwbHkocmVuZGVyZXIsIGFyZ3MpO1xuICAgICAgICAgICAgaWYgKHJldCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgcmV0ID0gcHJldlJlbmRlcmVyLmFwcGx5KHJlbmRlcmVyLCBhcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAocmV0IHx8ICcnKSBhcyBSZW5kZXJlck91dHB1dDtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIG9wdHMucmVuZGVyZXIgPSByZW5kZXJlcjtcbiAgICAgIH1cbiAgICAgIGlmIChwYWNrLnRva2VuaXplcikge1xuICAgICAgICBjb25zdCB0b2tlbml6ZXIgPSB0aGlzLmRlZmF1bHRzLnRva2VuaXplciB8fCBuZXcgX1Rva2VuaXplcjxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0Pih0aGlzLmRlZmF1bHRzKTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wIGluIHBhY2sudG9rZW5pemVyKSB7XG4gICAgICAgICAgaWYgKCEocHJvcCBpbiB0b2tlbml6ZXIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHRva2VuaXplciAnJHtwcm9wfScgZG9lcyBub3QgZXhpc3RgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKFsnb3B0aW9ucycsICdydWxlcycsICdsZXhlciddLmluY2x1ZGVzKHByb3ApKSB7XG4gICAgICAgICAgICAvLyBpZ25vcmUgb3B0aW9ucywgcnVsZXMsIGFuZCBsZXhlciBwcm9wZXJ0aWVzXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgdG9rZW5pemVyUHJvcCA9IHByb3AgYXMgRXhjbHVkZTxrZXlvZiBfVG9rZW5pemVyPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+LCAnb3B0aW9ucycgfCAncnVsZXMnIHwgJ2xleGVyJz47XG4gICAgICAgICAgY29uc3QgdG9rZW5pemVyRnVuYyA9IHBhY2sudG9rZW5pemVyW3Rva2VuaXplclByb3BdIGFzIFVua25vd25GdW5jdGlvbjtcbiAgICAgICAgICBjb25zdCBwcmV2VG9rZW5pemVyID0gdG9rZW5pemVyW3Rva2VuaXplclByb3BdIGFzIFVua25vd25GdW5jdGlvbjtcbiAgICAgICAgICAvLyBSZXBsYWNlIHRva2VuaXplciB3aXRoIGZ1bmMgdG8gcnVuIGV4dGVuc2lvbiwgYnV0IGZhbGwgYmFjayBpZiBmYWxzZVxuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgY2Fubm90IHR5cGUgdG9rZW5pemVyIGZ1bmN0aW9uIGR5bmFtaWNhbGx5XG4gICAgICAgICAgdG9rZW5pemVyW3Rva2VuaXplclByb3BdID0gKC4uLmFyZ3M6IHVua25vd25bXSkgPT4ge1xuICAgICAgICAgICAgbGV0IHJldCA9IHRva2VuaXplckZ1bmMuYXBwbHkodG9rZW5pemVyLCBhcmdzKTtcbiAgICAgICAgICAgIGlmIChyZXQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgIHJldCA9IHByZXZUb2tlbml6ZXIuYXBwbHkodG9rZW5pemVyLCBhcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBvcHRzLnRva2VuaXplciA9IHRva2VuaXplcjtcbiAgICAgIH1cblxuICAgICAgLy8gPT0tLSBQYXJzZSBIb29rcyBleHRlbnNpb25zIC0tPT0gLy9cbiAgICAgIGlmIChwYWNrLmhvb2tzKSB7XG4gICAgICAgIGNvbnN0IGhvb2tzID0gdGhpcy5kZWZhdWx0cy5ob29rcyB8fCBuZXcgX0hvb2tzPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+KCk7XG4gICAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBwYWNrLmhvb2tzKSB7XG4gICAgICAgICAgaWYgKCEocHJvcCBpbiBob29rcykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgaG9vayAnJHtwcm9wfScgZG9lcyBub3QgZXhpc3RgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKFsnb3B0aW9ucycsICdibG9jayddLmluY2x1ZGVzKHByb3ApKSB7XG4gICAgICAgICAgICAvLyBpZ25vcmUgb3B0aW9ucyBhbmQgYmxvY2sgcHJvcGVydGllc1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGhvb2tzUHJvcCA9IHByb3AgYXMgRXhjbHVkZTxrZXlvZiBfSG9va3M8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4sICdvcHRpb25zJyB8ICdibG9jayc+O1xuICAgICAgICAgIGNvbnN0IGhvb2tzRnVuYyA9IHBhY2suaG9va3NbaG9va3NQcm9wXSBhcyBVbmtub3duRnVuY3Rpb247XG4gICAgICAgICAgY29uc3QgcHJldkhvb2sgPSBob29rc1tob29rc1Byb3BdIGFzIFVua25vd25GdW5jdGlvbjtcbiAgICAgICAgICBpZiAoX0hvb2tzLnBhc3NUaHJvdWdoSG9va3MuaGFzKHByb3ApKSB7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGNhbm5vdCB0eXBlIGhvb2sgZnVuY3Rpb24gZHluYW1pY2FsbHlcbiAgICAgICAgICAgIGhvb2tzW2hvb2tzUHJvcF0gPSAoYXJnOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLmRlZmF1bHRzLmFzeW5jICYmIF9Ib29rcy5wYXNzVGhyb3VnaEhvb2tzUmVzcGVjdEFzeW5jLmhhcyhwcm9wKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAoYXN5bmMoKSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCByZXQgPSBhd2FpdCBob29rc0Z1bmMuY2FsbChob29rcywgYXJnKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBwcmV2SG9vay5jYWxsKGhvb2tzLCByZXQpO1xuICAgICAgICAgICAgICAgIH0pKCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjb25zdCByZXQgPSBob29rc0Z1bmMuY2FsbChob29rcywgYXJnKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHByZXZIb29rLmNhbGwoaG9va3MsIHJldCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGNhbm5vdCB0eXBlIGhvb2sgZnVuY3Rpb24gZHluYW1pY2FsbHlcbiAgICAgICAgICAgIGhvb2tzW2hvb2tzUHJvcF0gPSAoLi4uYXJnczogdW5rbm93bltdKSA9PiB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLmRlZmF1bHRzLmFzeW5jKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChhc3luYygpID0+IHtcbiAgICAgICAgICAgICAgICAgIGxldCByZXQgPSBhd2FpdCBob29rc0Z1bmMuYXBwbHkoaG9va3MsIGFyZ3MpO1xuICAgICAgICAgICAgICAgICAgaWYgKHJldCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0ID0gYXdhaXQgcHJldkhvb2suYXBwbHkoaG9va3MsIGFyZ3MpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgICAgICAgICB9KSgpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgbGV0IHJldCA9IGhvb2tzRnVuYy5hcHBseShob29rcywgYXJncyk7XG4gICAgICAgICAgICAgIGlmIChyZXQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0ID0gcHJldkhvb2suYXBwbHkoaG9va3MsIGFyZ3MpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBvcHRzLmhvb2tzID0gaG9va3M7XG4gICAgICB9XG5cbiAgICAgIC8vID09LS0gUGFyc2UgV2Fsa1Rva2VucyBleHRlbnNpb25zIC0tPT0gLy9cbiAgICAgIGlmIChwYWNrLndhbGtUb2tlbnMpIHtcbiAgICAgICAgY29uc3Qgd2Fsa1Rva2VucyA9IHRoaXMuZGVmYXVsdHMud2Fsa1Rva2VucztcbiAgICAgICAgY29uc3QgcGFja1dhbGt0b2tlbnMgPSBwYWNrLndhbGtUb2tlbnM7XG4gICAgICAgIG9wdHMud2Fsa1Rva2VucyA9IGZ1bmN0aW9uKHRva2VuKSB7XG4gICAgICAgICAgbGV0IHZhbHVlczogTWF5YmVQcm9taXNlW10gPSBbXTtcbiAgICAgICAgICB2YWx1ZXMucHVzaChwYWNrV2Fsa3Rva2Vucy5jYWxsKHRoaXMsIHRva2VuKSk7XG4gICAgICAgICAgaWYgKHdhbGtUb2tlbnMpIHtcbiAgICAgICAgICAgIHZhbHVlcyA9IHZhbHVlcy5jb25jYXQod2Fsa1Rva2Vucy5jYWxsKHRoaXMsIHRva2VuKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB2YWx1ZXM7XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZGVmYXVsdHMgPSB7IC4uLnRoaXMuZGVmYXVsdHMsIC4uLm9wdHMgfTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0T3B0aW9ucyhvcHQ6IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4pIHtcbiAgICB0aGlzLmRlZmF1bHRzID0geyAuLi50aGlzLmRlZmF1bHRzLCAuLi5vcHQgfTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGxleGVyKHNyYzogc3RyaW5nLCBvcHRpb25zPzogTWFya2VkT3B0aW9uczxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0Pikge1xuICAgIHJldHVybiBfTGV4ZXIubGV4KHNyYywgb3B0aW9ucyA/PyB0aGlzLmRlZmF1bHRzKTtcbiAgfVxuXG4gIHBhcnNlcih0b2tlbnM6IFRva2VuW10sIG9wdGlvbnM/OiBNYXJrZWRPcHRpb25zPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+KSB7XG4gICAgcmV0dXJuIF9QYXJzZXIucGFyc2U8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4odG9rZW5zLCBvcHRpb25zID8/IHRoaXMuZGVmYXVsdHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZU1hcmtkb3duKGJsb2NrVHlwZTogYm9vbGVhbikge1xuICAgIHR5cGUgb3ZlcmxvYWRlZFBhcnNlID0ge1xuICAgICAgKHNyYzogc3RyaW5nLCBvcHRpb25zOiBNYXJrZWRPcHRpb25zPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+ICYgeyBhc3luYzogdHJ1ZSB9KTogUHJvbWlzZTxQYXJzZXJPdXRwdXQ+O1xuICAgICAgKHNyYzogc3RyaW5nLCBvcHRpb25zOiBNYXJrZWRPcHRpb25zPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+ICYgeyBhc3luYzogZmFsc2UgfSk6IFBhcnNlck91dHB1dDtcbiAgICAgIChzcmM6IHN0cmluZywgb3B0aW9ucz86IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4gfCBudWxsKTogUGFyc2VyT3V0cHV0IHwgUHJvbWlzZTxQYXJzZXJPdXRwdXQ+O1xuICAgIH07XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IHBhcnNlOiBvdmVybG9hZGVkUGFyc2UgPSAoc3JjOiBzdHJpbmcsIG9wdGlvbnM/OiBNYXJrZWRPcHRpb25zPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+IHwgbnVsbCk6IGFueSA9PiB7XG4gICAgICBjb25zdCBvcmlnT3B0ID0geyAuLi5vcHRpb25zIH07XG4gICAgICBjb25zdCBvcHQgPSB7IC4uLnRoaXMuZGVmYXVsdHMsIC4uLm9yaWdPcHQgfTtcblxuICAgICAgY29uc3QgdGhyb3dFcnJvciA9IHRoaXMub25FcnJvcighIW9wdC5zaWxlbnQsICEhb3B0LmFzeW5jKTtcblxuICAgICAgLy8gdGhyb3cgZXJyb3IgaWYgYW4gZXh0ZW5zaW9uIHNldCBhc3luYyB0byB0cnVlIGJ1dCBwYXJzZSB3YXMgY2FsbGVkIHdpdGggYXN5bmM6IGZhbHNlXG4gICAgICBpZiAodGhpcy5kZWZhdWx0cy5hc3luYyA9PT0gdHJ1ZSAmJiBvcmlnT3B0LmFzeW5jID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihuZXcgRXJyb3IoJ21hcmtlZCgpOiBUaGUgYXN5bmMgb3B0aW9uIHdhcyBzZXQgdG8gdHJ1ZSBieSBhbiBleHRlbnNpb24uIFJlbW92ZSBhc3luYzogZmFsc2UgZnJvbSB0aGUgcGFyc2Ugb3B0aW9ucyBvYmplY3QgdG8gcmV0dXJuIGEgUHJvbWlzZS4nKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIHRocm93IGVycm9yIGluIGNhc2Ugb2Ygbm9uIHN0cmluZyBpbnB1dFxuICAgICAgaWYgKHR5cGVvZiBzcmMgPT09ICd1bmRlZmluZWQnIHx8IHNyYyA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihuZXcgRXJyb3IoJ21hcmtlZCgpOiBpbnB1dCBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkIG9yIG51bGwnKSk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHNyYyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IobmV3IEVycm9yKCdtYXJrZWQoKTogaW5wdXQgcGFyYW1ldGVyIGlzIG9mIHR5cGUgJ1xuICAgICAgICAgICsgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHNyYykgKyAnLCBzdHJpbmcgZXhwZWN0ZWQnKSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHQuaG9va3MpIHtcbiAgICAgICAgb3B0Lmhvb2tzLm9wdGlvbnMgPSBvcHQ7XG4gICAgICAgIG9wdC5ob29rcy5ibG9jayA9IGJsb2NrVHlwZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdC5hc3luYykge1xuICAgICAgICByZXR1cm4gKGFzeW5jKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHByb2Nlc3NlZFNyYyA9IG9wdC5ob29rcyA/IGF3YWl0IG9wdC5ob29rcy5wcmVwcm9jZXNzKHNyYykgOiBzcmM7XG4gICAgICAgICAgY29uc3QgbGV4ZXIgPSBvcHQuaG9va3MgPyBhd2FpdCBvcHQuaG9va3MucHJvdmlkZUxleGVyKCkgOiAoYmxvY2tUeXBlID8gX0xleGVyLmxleCA6IF9MZXhlci5sZXhJbmxpbmUpO1xuICAgICAgICAgIGNvbnN0IHRva2VucyA9IGF3YWl0IGxleGVyKHByb2Nlc3NlZFNyYywgb3B0KTtcbiAgICAgICAgICBjb25zdCBwcm9jZXNzZWRUb2tlbnMgPSBvcHQuaG9va3MgPyBhd2FpdCBvcHQuaG9va3MucHJvY2Vzc0FsbFRva2Vucyh0b2tlbnMpIDogdG9rZW5zO1xuICAgICAgICAgIGlmIChvcHQud2Fsa1Rva2Vucykge1xuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwodGhpcy53YWxrVG9rZW5zKHByb2Nlc3NlZFRva2Vucywgb3B0LndhbGtUb2tlbnMpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcGFyc2VyID0gb3B0Lmhvb2tzID8gYXdhaXQgb3B0Lmhvb2tzLnByb3ZpZGVQYXJzZXIoKSA6IChibG9ja1R5cGUgPyBfUGFyc2VyLnBhcnNlIDogX1BhcnNlci5wYXJzZUlubGluZSk7XG4gICAgICAgICAgY29uc3QgaHRtbCA9IGF3YWl0IHBhcnNlcihwcm9jZXNzZWRUb2tlbnMsIG9wdCk7XG4gICAgICAgICAgcmV0dXJuIG9wdC5ob29rcyA/IGF3YWl0IG9wdC5ob29rcy5wb3N0cHJvY2VzcyhodG1sKSA6IGh0bWw7XG4gICAgICAgIH0pKCkuY2F0Y2godGhyb3dFcnJvcik7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChvcHQuaG9va3MpIHtcbiAgICAgICAgICBzcmMgPSBvcHQuaG9va3MucHJlcHJvY2VzcyhzcmMpIGFzIHN0cmluZztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsZXhlciA9IG9wdC5ob29rcyA/IG9wdC5ob29rcy5wcm92aWRlTGV4ZXIoKSA6IChibG9ja1R5cGUgPyBfTGV4ZXIubGV4IDogX0xleGVyLmxleElubGluZSk7XG4gICAgICAgIGxldCB0b2tlbnMgPSBsZXhlcihzcmMsIG9wdCk7XG4gICAgICAgIGlmIChvcHQuaG9va3MpIHtcbiAgICAgICAgICB0b2tlbnMgPSBvcHQuaG9va3MucHJvY2Vzc0FsbFRva2Vucyh0b2tlbnMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHQud2Fsa1Rva2Vucykge1xuICAgICAgICAgIHRoaXMud2Fsa1Rva2Vucyh0b2tlbnMsIG9wdC53YWxrVG9rZW5zKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJzZXIgPSBvcHQuaG9va3MgPyBvcHQuaG9va3MucHJvdmlkZVBhcnNlcigpIDogKGJsb2NrVHlwZSA/IF9QYXJzZXIucGFyc2UgOiBfUGFyc2VyLnBhcnNlSW5saW5lKTtcbiAgICAgICAgbGV0IGh0bWwgPSBwYXJzZXIodG9rZW5zLCBvcHQpO1xuICAgICAgICBpZiAob3B0Lmhvb2tzKSB7XG4gICAgICAgICAgaHRtbCA9IG9wdC5ob29rcy5wb3N0cHJvY2VzcyhodG1sKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaHRtbDtcbiAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihlIGFzIEVycm9yKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIHBhcnNlO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkVycm9yKHNpbGVudDogYm9vbGVhbiwgYXN5bmM6IGJvb2xlYW4pIHtcbiAgICByZXR1cm4gKGU6IEVycm9yKTogc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgICAgIGUubWVzc2FnZSArPSAnXFxuUGxlYXNlIHJlcG9ydCB0aGlzIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJrZWRqcy9tYXJrZWQuJztcblxuICAgICAgaWYgKHNpbGVudCkge1xuICAgICAgICBjb25zdCBtc2cgPSAnPHA+QW4gZXJyb3Igb2NjdXJyZWQ6PC9wPjxwcmU+J1xuICAgICAgICAgICsgZXNjYXBlSHRtbEVudGl0aWVzKGUubWVzc2FnZSArICcnLCB0cnVlKVxuICAgICAgICAgICsgJzwvcHJlPic7XG4gICAgICAgIGlmIChhc3luYykge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobXNnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbXNnO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXN5bmMpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgX0xleGVyIH0gZnJvbSAnLi9MZXhlci50cyc7XG5pbXBvcnQgeyBfUGFyc2VyIH0gZnJvbSAnLi9QYXJzZXIudHMnO1xuaW1wb3J0IHsgX1Rva2VuaXplciB9IGZyb20gJy4vVG9rZW5pemVyLnRzJztcbmltcG9ydCB7IF9SZW5kZXJlciB9IGZyb20gJy4vUmVuZGVyZXIudHMnO1xuaW1wb3J0IHsgX1RleHRSZW5kZXJlciB9IGZyb20gJy4vVGV4dFJlbmRlcmVyLnRzJztcbmltcG9ydCB7IF9Ib29rcyB9IGZyb20gJy4vSG9va3MudHMnO1xuaW1wb3J0IHsgTWFya2VkIH0gZnJvbSAnLi9JbnN0YW5jZS50cyc7XG5pbXBvcnQge1xuICBfZ2V0RGVmYXVsdHMsXG4gIGNoYW5nZURlZmF1bHRzLFxuICBfZGVmYXVsdHMsXG59IGZyb20gJy4vZGVmYXVsdHMudHMnO1xuaW1wb3J0IHR5cGUgeyBNYXJrZWRFeHRlbnNpb24sIE1hcmtlZE9wdGlvbnMgfSBmcm9tICcuL01hcmtlZE9wdGlvbnMudHMnO1xuaW1wb3J0IHR5cGUgeyBUb2tlbiwgVG9rZW5zTGlzdCB9IGZyb20gJy4vVG9rZW5zLnRzJztcbmltcG9ydCB0eXBlIHsgTWF5YmVQcm9taXNlIH0gZnJvbSAnLi9JbnN0YW5jZS50cyc7XG5cbmNvbnN0IG1hcmtlZEluc3RhbmNlID0gbmV3IE1hcmtlZCgpO1xuXG4vKipcbiAqIENvbXBpbGVzIG1hcmtkb3duIHRvIEhUTUwgYXN5bmNocm9ub3VzbHkuXG4gKlxuICogQHBhcmFtIHNyYyBTdHJpbmcgb2YgbWFya2Rvd24gc291cmNlIHRvIGJlIGNvbXBpbGVkXG4gKiBAcGFyYW0gb3B0aW9ucyBIYXNoIG9mIG9wdGlvbnMsIGhhdmluZyBhc3luYzogdHJ1ZVxuICogQHJldHVybiBQcm9taXNlIG9mIHN0cmluZyBvZiBjb21waWxlZCBIVE1MXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXJrZWQoc3JjOiBzdHJpbmcsIG9wdGlvbnM6IE1hcmtlZE9wdGlvbnMgJiB7IGFzeW5jOiB0cnVlIH0pOiBQcm9taXNlPHN0cmluZz47XG5cbi8qKlxuICogQ29tcGlsZXMgbWFya2Rvd24gdG8gSFRNTC5cbiAqXG4gKiBAcGFyYW0gc3JjIFN0cmluZyBvZiBtYXJrZG93biBzb3VyY2UgdG8gYmUgY29tcGlsZWRcbiAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbmFsIGhhc2ggb2Ygb3B0aW9uc1xuICogQHJldHVybiBTdHJpbmcgb2YgY29tcGlsZWQgSFRNTC4gV2lsbCBiZSBhIFByb21pc2Ugb2Ygc3RyaW5nIGlmIGFzeW5jIGlzIHNldCB0byB0cnVlIGJ5IGFueSBleHRlbnNpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFya2VkKHNyYzogc3RyaW5nLCBvcHRpb25zOiBNYXJrZWRPcHRpb25zICYgeyBhc3luYzogZmFsc2UgfSk6IHN0cmluZztcbmV4cG9ydCBmdW5jdGlvbiBtYXJrZWQoc3JjOiBzdHJpbmcsIG9wdGlvbnM6IE1hcmtlZE9wdGlvbnMgJiB7IGFzeW5jOiB0cnVlIH0pOiBQcm9taXNlPHN0cmluZz47XG5leHBvcnQgZnVuY3Rpb24gbWFya2VkKHNyYzogc3RyaW5nLCBvcHRpb25zPzogTWFya2VkT3B0aW9ucyB8IG51bGwpOiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz47XG5leHBvcnQgZnVuY3Rpb24gbWFya2VkKHNyYzogc3RyaW5nLCBvcHQ/OiBNYXJrZWRPcHRpb25zIHwgbnVsbCk6IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPiB7XG4gIHJldHVybiBtYXJrZWRJbnN0YW5jZS5wYXJzZShzcmMsIG9wdCk7XG59XG5cbi8qKlxuICogU2V0cyB0aGUgZGVmYXVsdCBvcHRpb25zLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIEhhc2ggb2Ygb3B0aW9uc1xuICovXG5tYXJrZWQub3B0aW9ucyA9XG4gIG1hcmtlZC5zZXRPcHRpb25zID0gZnVuY3Rpb24ob3B0aW9uczogTWFya2VkT3B0aW9ucykge1xuICAgIG1hcmtlZEluc3RhbmNlLnNldE9wdGlvbnMob3B0aW9ucyk7XG4gICAgbWFya2VkLmRlZmF1bHRzID0gbWFya2VkSW5zdGFuY2UuZGVmYXVsdHM7XG4gICAgY2hhbmdlRGVmYXVsdHMobWFya2VkLmRlZmF1bHRzKTtcbiAgICByZXR1cm4gbWFya2VkO1xuICB9O1xuXG4vKipcbiAqIEdldHMgdGhlIG9yaWdpbmFsIG1hcmtlZCBkZWZhdWx0IG9wdGlvbnMuXG4gKi9cbm1hcmtlZC5nZXREZWZhdWx0cyA9IF9nZXREZWZhdWx0cztcblxubWFya2VkLmRlZmF1bHRzID0gX2RlZmF1bHRzO1xuXG4vKipcbiAqIFVzZSBFeHRlbnNpb25cbiAqL1xuXG5tYXJrZWQudXNlID0gZnVuY3Rpb24oLi4uYXJnczogTWFya2VkRXh0ZW5zaW9uW10pIHtcbiAgbWFya2VkSW5zdGFuY2UudXNlKC4uLmFyZ3MpO1xuICBtYXJrZWQuZGVmYXVsdHMgPSBtYXJrZWRJbnN0YW5jZS5kZWZhdWx0cztcbiAgY2hhbmdlRGVmYXVsdHMobWFya2VkLmRlZmF1bHRzKTtcbiAgcmV0dXJuIG1hcmtlZDtcbn07XG5cbi8qKlxuICogUnVuIGNhbGxiYWNrIGZvciBldmVyeSB0b2tlblxuICovXG5cbm1hcmtlZC53YWxrVG9rZW5zID0gZnVuY3Rpb24odG9rZW5zOiBUb2tlbltdIHwgVG9rZW5zTGlzdCwgY2FsbGJhY2s6ICh0b2tlbjogVG9rZW4pID0+IE1heWJlUHJvbWlzZSB8IE1heWJlUHJvbWlzZVtdKSB7XG4gIHJldHVybiBtYXJrZWRJbnN0YW5jZS53YWxrVG9rZW5zKHRva2VucywgY2FsbGJhY2spO1xufTtcblxuLyoqXG4gKiBDb21waWxlcyBtYXJrZG93biB0byBIVE1MIHdpdGhvdXQgZW5jbG9zaW5nIGBwYCB0YWcuXG4gKlxuICogQHBhcmFtIHNyYyBTdHJpbmcgb2YgbWFya2Rvd24gc291cmNlIHRvIGJlIGNvbXBpbGVkXG4gKiBAcGFyYW0gb3B0aW9ucyBIYXNoIG9mIG9wdGlvbnNcbiAqIEByZXR1cm4gU3RyaW5nIG9mIGNvbXBpbGVkIEhUTUxcbiAqL1xubWFya2VkLnBhcnNlSW5saW5lID0gbWFya2VkSW5zdGFuY2UucGFyc2VJbmxpbmU7XG5cbi8qKlxuICogRXhwb3NlXG4gKi9cbm1hcmtlZC5QYXJzZXIgPSBfUGFyc2VyO1xubWFya2VkLnBhcnNlciA9IF9QYXJzZXIucGFyc2U7XG5tYXJrZWQuUmVuZGVyZXIgPSBfUmVuZGVyZXI7XG5tYXJrZWQuVGV4dFJlbmRlcmVyID0gX1RleHRSZW5kZXJlcjtcbm1hcmtlZC5MZXhlciA9IF9MZXhlcjtcbm1hcmtlZC5sZXhlciA9IF9MZXhlci5sZXg7XG5tYXJrZWQuVG9rZW5pemVyID0gX1Rva2VuaXplcjtcbm1hcmtlZC5Ib29rcyA9IF9Ib29rcztcbm1hcmtlZC5wYXJzZSA9IG1hcmtlZDtcblxuZXhwb3J0IGNvbnN0IG9wdGlvbnMgPSBtYXJrZWQub3B0aW9ucztcbmV4cG9ydCBjb25zdCBzZXRPcHRpb25zID0gbWFya2VkLnNldE9wdGlvbnM7XG5leHBvcnQgY29uc3QgdXNlID0gbWFya2VkLnVzZTtcbmV4cG9ydCBjb25zdCB3YWxrVG9rZW5zID0gbWFya2VkLndhbGtUb2tlbnM7XG5leHBvcnQgY29uc3QgcGFyc2VJbmxpbmUgPSBtYXJrZWQucGFyc2VJbmxpbmU7XG5leHBvcnQgY29uc3QgcGFyc2UgPSBtYXJrZWQ7XG5leHBvcnQgY29uc3QgcGFyc2VyID0gX1BhcnNlci5wYXJzZTtcbmV4cG9ydCBjb25zdCBsZXhlciA9IF9MZXhlci5sZXg7XG5leHBvcnQgeyBfZGVmYXVsdHMgYXMgZGVmYXVsdHMsIF9nZXREZWZhdWx0cyBhcyBnZXREZWZhdWx0cyB9IGZyb20gJy4vZGVmYXVsdHMudHMnO1xuZXhwb3J0IHsgX0xleGVyIGFzIExleGVyIH0gZnJvbSAnLi9MZXhlci50cyc7XG5leHBvcnQgeyBfUGFyc2VyIGFzIFBhcnNlciB9IGZyb20gJy4vUGFyc2VyLnRzJztcbmV4cG9ydCB7IF9Ub2tlbml6ZXIgYXMgVG9rZW5pemVyIH0gZnJvbSAnLi9Ub2tlbml6ZXIudHMnO1xuZXhwb3J0IHsgX1JlbmRlcmVyIGFzIFJlbmRlcmVyIH0gZnJvbSAnLi9SZW5kZXJlci50cyc7XG5leHBvcnQgeyBfVGV4dFJlbmRlcmVyIGFzIFRleHRSZW5kZXJlciB9IGZyb20gJy4vVGV4dFJlbmRlcmVyLnRzJztcbmV4cG9ydCB7IF9Ib29rcyBhcyBIb29rcyB9IGZyb20gJy4vSG9va3MudHMnO1xuZXhwb3J0IHsgTWFya2VkIH0gZnJvbSAnLi9JbnN0YW5jZS50cyc7XG5leHBvcnQgdHlwZSAqIGZyb20gJy4vTWFya2VkT3B0aW9ucy50cyc7XG5leHBvcnQgdHlwZSAqIGZyb20gJy4vVG9rZW5zLnRzJztcbiIsICJjb25zdCB7XG4gIGVudHJpZXMsXG4gIHNldFByb3RvdHlwZU9mLFxuICBpc0Zyb3plbixcbiAgZ2V0UHJvdG90eXBlT2YsXG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcixcbn0gPSBPYmplY3Q7XG5cbmxldCB7IGZyZWV6ZSwgc2VhbCwgY3JlYXRlIH0gPSBPYmplY3Q7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgaW1wb3J0L25vLW11dGFibGUtZXhwb3J0c1xubGV0IHsgYXBwbHksIGNvbnN0cnVjdCB9ID0gdHlwZW9mIFJlZmxlY3QgIT09ICd1bmRlZmluZWQnICYmIFJlZmxlY3Q7XG5cbmlmICghZnJlZXplKSB7XG4gIGZyZWV6ZSA9IGZ1bmN0aW9uIDxUPih4OiBUKTogVCB7XG4gICAgcmV0dXJuIHg7XG4gIH07XG59XG5cbmlmICghc2VhbCkge1xuICBzZWFsID0gZnVuY3Rpb24gPFQ+KHg6IFQpOiBUIHtcbiAgICByZXR1cm4geDtcbiAgfTtcbn1cblxuaWYgKCFhcHBseSkge1xuICBhcHBseSA9IGZ1bmN0aW9uIDxUPihcbiAgICBmdW5jOiAodGhpc0FyZzogYW55LCAuLi5hcmdzOiBhbnlbXSkgPT4gVCxcbiAgICB0aGlzQXJnOiBhbnksXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogVCB7XG4gICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyk7XG4gIH07XG59XG5cbmlmICghY29uc3RydWN0KSB7XG4gIGNvbnN0cnVjdCA9IGZ1bmN0aW9uIDxUPihGdW5jOiBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBULCAuLi5hcmdzOiBhbnlbXSk6IFQge1xuICAgIHJldHVybiBuZXcgRnVuYyguLi5hcmdzKTtcbiAgfTtcbn1cblxuY29uc3QgYXJyYXlGb3JFYWNoID0gdW5hcHBseShBcnJheS5wcm90b3R5cGUuZm9yRWFjaCk7XG5jb25zdCBhcnJheUluZGV4T2YgPSB1bmFwcGx5KEFycmF5LnByb3RvdHlwZS5pbmRleE9mKTtcbmNvbnN0IGFycmF5TGFzdEluZGV4T2YgPSB1bmFwcGx5KEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZik7XG5jb25zdCBhcnJheVBvcCA9IHVuYXBwbHkoQXJyYXkucHJvdG90eXBlLnBvcCk7XG5jb25zdCBhcnJheVB1c2ggPSB1bmFwcGx5KEFycmF5LnByb3RvdHlwZS5wdXNoKTtcbmNvbnN0IGFycmF5U2xpY2UgPSB1bmFwcGx5KEFycmF5LnByb3RvdHlwZS5zbGljZSk7XG5jb25zdCBhcnJheVNwbGljZSA9IHVuYXBwbHkoQXJyYXkucHJvdG90eXBlLnNwbGljZSk7XG5cbmNvbnN0IHN0cmluZ1RvTG93ZXJDYXNlID0gdW5hcHBseShTdHJpbmcucHJvdG90eXBlLnRvTG93ZXJDYXNlKTtcbmNvbnN0IHN0cmluZ1RvU3RyaW5nID0gdW5hcHBseShTdHJpbmcucHJvdG90eXBlLnRvU3RyaW5nKTtcbmNvbnN0IHN0cmluZ01hdGNoID0gdW5hcHBseShTdHJpbmcucHJvdG90eXBlLm1hdGNoKTtcbmNvbnN0IHN0cmluZ1JlcGxhY2UgPSB1bmFwcGx5KFN0cmluZy5wcm90b3R5cGUucmVwbGFjZSk7XG5jb25zdCBzdHJpbmdJbmRleE9mID0gdW5hcHBseShTdHJpbmcucHJvdG90eXBlLmluZGV4T2YpO1xuY29uc3Qgc3RyaW5nVHJpbSA9IHVuYXBwbHkoU3RyaW5nLnByb3RvdHlwZS50cmltKTtcblxuY29uc3Qgb2JqZWN0SGFzT3duUHJvcGVydHkgPSB1bmFwcGx5KE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkpO1xuXG5jb25zdCByZWdFeHBUZXN0ID0gdW5hcHBseShSZWdFeHAucHJvdG90eXBlLnRlc3QpO1xuXG5jb25zdCB0eXBlRXJyb3JDcmVhdGUgPSB1bmNvbnN0cnVjdChUeXBlRXJyb3IpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgZnVuY3Rpb24gdGhhdCBjYWxscyB0aGUgZ2l2ZW4gZnVuY3Rpb24gd2l0aCBhIHNwZWNpZmllZCB0aGlzQXJnIGFuZCBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIGZ1bmMgLSBUaGUgZnVuY3Rpb24gdG8gYmUgd3JhcHBlZCBhbmQgY2FsbGVkLlxuICogQHJldHVybnMgQSBuZXcgZnVuY3Rpb24gdGhhdCBjYWxscyB0aGUgZ2l2ZW4gZnVuY3Rpb24gd2l0aCBhIHNwZWNpZmllZCB0aGlzQXJnIGFuZCBhcmd1bWVudHMuXG4gKi9cbmZ1bmN0aW9uIHVuYXBwbHk8VD4oXG4gIGZ1bmM6ICh0aGlzQXJnOiBhbnksIC4uLmFyZ3M6IGFueVtdKSA9PiBUXG4pOiAodGhpc0FyZzogYW55LCAuLi5hcmdzOiBhbnlbXSkgPT4gVCB7XG4gIHJldHVybiAodGhpc0FyZzogYW55LCAuLi5hcmdzOiBhbnlbXSk6IFQgPT4ge1xuICAgIGlmICh0aGlzQXJnIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICB0aGlzQXJnLmxhc3RJbmRleCA9IDA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFwcGx5KGZ1bmMsIHRoaXNBcmcsIGFyZ3MpO1xuICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgZnVuY3Rpb24gdGhhdCBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIG9mIHRoZSBnaXZlbiBjb25zdHJ1Y3RvciBmdW5jdGlvbiB3aXRoIHRoZSBwcm92aWRlZCBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIGZ1bmMgLSBUaGUgY29uc3RydWN0b3IgZnVuY3Rpb24gdG8gYmUgd3JhcHBlZCBhbmQgY2FsbGVkLlxuICogQHJldHVybnMgQSBuZXcgZnVuY3Rpb24gdGhhdCBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIG9mIHRoZSBnaXZlbiBjb25zdHJ1Y3RvciBmdW5jdGlvbiB3aXRoIHRoZSBwcm92aWRlZCBhcmd1bWVudHMuXG4gKi9cbmZ1bmN0aW9uIHVuY29uc3RydWN0PFQ+KFxuICBGdW5jOiBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUXG4pOiAoLi4uYXJnczogYW55W10pID0+IFQge1xuICByZXR1cm4gKC4uLmFyZ3M6IGFueVtdKTogVCA9PiBjb25zdHJ1Y3QoRnVuYywgYXJncyk7XG59XG5cbi8qKlxuICogQWRkIHByb3BlcnRpZXMgdG8gYSBsb29rdXAgdGFibGVcbiAqXG4gKiBAcGFyYW0gc2V0IC0gVGhlIHNldCB0byB3aGljaCBlbGVtZW50cyB3aWxsIGJlIGFkZGVkLlxuICogQHBhcmFtIGFycmF5IC0gVGhlIGFycmF5IGNvbnRhaW5pbmcgZWxlbWVudHMgdG8gYmUgYWRkZWQgdG8gdGhlIHNldC5cbiAqIEBwYXJhbSB0cmFuc2Zvcm1DYXNlRnVuYyAtIEFuIG9wdGlvbmFsIGZ1bmN0aW9uIHRvIHRyYW5zZm9ybSB0aGUgY2FzZSBvZiBlYWNoIGVsZW1lbnQgYmVmb3JlIGFkZGluZyB0byB0aGUgc2V0LlxuICogQHJldHVybnMgVGhlIG1vZGlmaWVkIHNldCB3aXRoIGFkZGVkIGVsZW1lbnRzLlxuICovXG5mdW5jdGlvbiBhZGRUb1NldChcbiAgc2V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBhcnJheTogcmVhZG9ubHkgYW55W10sXG4gIHRyYW5zZm9ybUNhc2VGdW5jOiBSZXR1cm5UeXBlPHR5cGVvZiB1bmFwcGx5PHN0cmluZz4+ID0gc3RyaW5nVG9Mb3dlckNhc2Vcbik6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICBpZiAoc2V0UHJvdG90eXBlT2YpIHtcbiAgICAvLyBNYWtlICdpbicgYW5kIHRydXRoeSBjaGVja3MgbGlrZSBCb29sZWFuKHNldC5jb25zdHJ1Y3RvcilcbiAgICAvLyBpbmRlcGVuZGVudCBvZiBhbnkgcHJvcGVydGllcyBkZWZpbmVkIG9uIE9iamVjdC5wcm90b3R5cGUuXG4gICAgLy8gUHJldmVudCBwcm90b3R5cGUgc2V0dGVycyBmcm9tIGludGVyY2VwdGluZyBzZXQgYXMgYSB0aGlzIHZhbHVlLlxuICAgIHNldFByb3RvdHlwZU9mKHNldCwgbnVsbCk7XG4gIH1cblxuICBsZXQgbCA9IGFycmF5Lmxlbmd0aDtcbiAgd2hpbGUgKGwtLSkge1xuICAgIGxldCBlbGVtZW50ID0gYXJyYXlbbF07XG4gICAgaWYgKHR5cGVvZiBlbGVtZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgbGNFbGVtZW50ID0gdHJhbnNmb3JtQ2FzZUZ1bmMoZWxlbWVudCk7XG4gICAgICBpZiAobGNFbGVtZW50ICE9PSBlbGVtZW50KSB7XG4gICAgICAgIC8vIENvbmZpZyBwcmVzZXRzIChlLmcuIHRhZ3MuanMsIGF0dHJzLmpzKSBhcmUgaW1tdXRhYmxlLlxuICAgICAgICBpZiAoIWlzRnJvemVuKGFycmF5KSkge1xuICAgICAgICAgIChhcnJheSBhcyBhbnlbXSlbbF0gPSBsY0VsZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBlbGVtZW50ID0gbGNFbGVtZW50O1xuICAgICAgfVxuICAgIH1cblxuICAgIHNldFtlbGVtZW50XSA9IHRydWU7XG4gIH1cblxuICByZXR1cm4gc2V0O1xufVxuXG4vKipcbiAqIENsZWFuIHVwIGFuIGFycmF5IHRvIGhhcmRlbiBhZ2FpbnN0IENTUFBcbiAqXG4gKiBAcGFyYW0gYXJyYXkgLSBUaGUgYXJyYXkgdG8gYmUgY2xlYW5lZC5cbiAqIEByZXR1cm5zIFRoZSBjbGVhbmVkIHZlcnNpb24gb2YgdGhlIGFycmF5XG4gKi9cbmZ1bmN0aW9uIGNsZWFuQXJyYXk8VD4oYXJyYXk6IFRbXSk6IEFycmF5PFQgfCBudWxsPiB7XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBhcnJheS5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBpc1Byb3BlcnR5RXhpc3QgPSBvYmplY3RIYXNPd25Qcm9wZXJ0eShhcnJheSwgaW5kZXgpO1xuXG4gICAgaWYgKCFpc1Byb3BlcnR5RXhpc3QpIHtcbiAgICAgIGFycmF5W2luZGV4XSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFycmF5O1xufVxuXG4vKipcbiAqIFNoYWxsb3cgY2xvbmUgYW4gb2JqZWN0XG4gKlxuICogQHBhcmFtIG9iamVjdCAtIFRoZSBvYmplY3QgdG8gYmUgY2xvbmVkLlxuICogQHJldHVybnMgQSBuZXcgb2JqZWN0IHRoYXQgY29waWVzIHRoZSBvcmlnaW5hbC5cbiAqL1xuZnVuY3Rpb24gY2xvbmU8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+KG9iamVjdDogVCk6IFQge1xuICBjb25zdCBuZXdPYmplY3QgPSBjcmVhdGUobnVsbCk7XG5cbiAgZm9yIChjb25zdCBbcHJvcGVydHksIHZhbHVlXSBvZiBlbnRyaWVzKG9iamVjdCkpIHtcbiAgICBjb25zdCBpc1Byb3BlcnR5RXhpc3QgPSBvYmplY3RIYXNPd25Qcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5KTtcblxuICAgIGlmIChpc1Byb3BlcnR5RXhpc3QpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBuZXdPYmplY3RbcHJvcGVydHldID0gY2xlYW5BcnJheSh2YWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICB2YWx1ZSAmJlxuICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgICAgIHZhbHVlLmNvbnN0cnVjdG9yID09PSBPYmplY3RcbiAgICAgICkge1xuICAgICAgICBuZXdPYmplY3RbcHJvcGVydHldID0gY2xvbmUodmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3T2JqZWN0W3Byb3BlcnR5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXdPYmplY3Q7XG59XG5cbi8qKlxuICogVGhpcyBtZXRob2QgYXV0b21hdGljYWxseSBjaGVja3MgaWYgdGhlIHByb3AgaXMgZnVuY3Rpb24gb3IgZ2V0dGVyIGFuZCBiZWhhdmVzIGFjY29yZGluZ2x5LlxuICpcbiAqIEBwYXJhbSBvYmplY3QgLSBUaGUgb2JqZWN0IHRvIGxvb2sgdXAgdGhlIGdldHRlciBmdW5jdGlvbiBpbiBpdHMgcHJvdG90eXBlIGNoYWluLlxuICogQHBhcmFtIHByb3AgLSBUaGUgcHJvcGVydHkgbmFtZSBmb3Igd2hpY2ggdG8gZmluZCB0aGUgZ2V0dGVyIGZ1bmN0aW9uLlxuICogQHJldHVybnMgVGhlIGdldHRlciBmdW5jdGlvbiBmb3VuZCBpbiB0aGUgcHJvdG90eXBlIGNoYWluIG9yIGEgZmFsbGJhY2sgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGxvb2t1cEdldHRlcjxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4oXG4gIG9iamVjdDogVCxcbiAgcHJvcDogc3RyaW5nXG4pOiBSZXR1cm5UeXBlPHR5cGVvZiB1bmFwcGx5PGFueT4+IHwgKCgpID0+IG51bGwpIHtcbiAgd2hpbGUgKG9iamVjdCAhPT0gbnVsbCkge1xuICAgIGNvbnN0IGRlc2MgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wKTtcblxuICAgIGlmIChkZXNjKSB7XG4gICAgICBpZiAoZGVzYy5nZXQpIHtcbiAgICAgICAgcmV0dXJuIHVuYXBwbHkoZGVzYy5nZXQpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGRlc2MudmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIHVuYXBwbHkoZGVzYy52YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgb2JqZWN0ID0gZ2V0UHJvdG90eXBlT2Yob2JqZWN0KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZhbGxiYWNrVmFsdWUoKTogbnVsbCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gZmFsbGJhY2tWYWx1ZTtcbn1cblxuZXhwb3J0IHtcbiAgLy8gQXJyYXlcbiAgYXJyYXlGb3JFYWNoLFxuICBhcnJheUluZGV4T2YsXG4gIGFycmF5TGFzdEluZGV4T2YsXG4gIGFycmF5UG9wLFxuICBhcnJheVB1c2gsXG4gIGFycmF5U2xpY2UsXG4gIGFycmF5U3BsaWNlLFxuICAvLyBPYmplY3RcbiAgZW50cmllcyxcbiAgZnJlZXplLFxuICBnZXRQcm90b3R5cGVPZixcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxuICBpc0Zyb3plbixcbiAgc2V0UHJvdG90eXBlT2YsXG4gIHNlYWwsXG4gIGNsb25lLFxuICBjcmVhdGUsXG4gIG9iamVjdEhhc093blByb3BlcnR5LFxuICAvLyBSZWdFeHBcbiAgcmVnRXhwVGVzdCxcbiAgLy8gU3RyaW5nXG4gIHN0cmluZ0luZGV4T2YsXG4gIHN0cmluZ01hdGNoLFxuICBzdHJpbmdSZXBsYWNlLFxuICBzdHJpbmdUb0xvd2VyQ2FzZSxcbiAgc3RyaW5nVG9TdHJpbmcsXG4gIHN0cmluZ1RyaW0sXG4gIC8vIEVycm9yc1xuICB0eXBlRXJyb3JDcmVhdGUsXG4gIC8vIE90aGVyXG4gIGxvb2t1cEdldHRlcixcbiAgYWRkVG9TZXQsXG4gIC8vIFJlZmxlY3RcbiAgdW5hcHBseSxcbiAgdW5jb25zdHJ1Y3QsXG59O1xuIiwgImltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4vdXRpbHMuanMnO1xuXG5leHBvcnQgY29uc3QgaHRtbCA9IGZyZWV6ZShbXG4gICdhJyxcbiAgJ2FiYnInLFxuICAnYWNyb255bScsXG4gICdhZGRyZXNzJyxcbiAgJ2FyZWEnLFxuICAnYXJ0aWNsZScsXG4gICdhc2lkZScsXG4gICdhdWRpbycsXG4gICdiJyxcbiAgJ2JkaScsXG4gICdiZG8nLFxuICAnYmlnJyxcbiAgJ2JsaW5rJyxcbiAgJ2Jsb2NrcXVvdGUnLFxuICAnYm9keScsXG4gICdicicsXG4gICdidXR0b24nLFxuICAnY2FudmFzJyxcbiAgJ2NhcHRpb24nLFxuICAnY2VudGVyJyxcbiAgJ2NpdGUnLFxuICAnY29kZScsXG4gICdjb2wnLFxuICAnY29sZ3JvdXAnLFxuICAnY29udGVudCcsXG4gICdkYXRhJyxcbiAgJ2RhdGFsaXN0JyxcbiAgJ2RkJyxcbiAgJ2RlY29yYXRvcicsXG4gICdkZWwnLFxuICAnZGV0YWlscycsXG4gICdkZm4nLFxuICAnZGlhbG9nJyxcbiAgJ2RpcicsXG4gICdkaXYnLFxuICAnZGwnLFxuICAnZHQnLFxuICAnZWxlbWVudCcsXG4gICdlbScsXG4gICdmaWVsZHNldCcsXG4gICdmaWdjYXB0aW9uJyxcbiAgJ2ZpZ3VyZScsXG4gICdmb250JyxcbiAgJ2Zvb3RlcicsXG4gICdmb3JtJyxcbiAgJ2gxJyxcbiAgJ2gyJyxcbiAgJ2gzJyxcbiAgJ2g0JyxcbiAgJ2g1JyxcbiAgJ2g2JyxcbiAgJ2hlYWQnLFxuICAnaGVhZGVyJyxcbiAgJ2hncm91cCcsXG4gICdocicsXG4gICdodG1sJyxcbiAgJ2knLFxuICAnaW1nJyxcbiAgJ2lucHV0JyxcbiAgJ2lucycsXG4gICdrYmQnLFxuICAnbGFiZWwnLFxuICAnbGVnZW5kJyxcbiAgJ2xpJyxcbiAgJ21haW4nLFxuICAnbWFwJyxcbiAgJ21hcmsnLFxuICAnbWFycXVlZScsXG4gICdtZW51JyxcbiAgJ21lbnVpdGVtJyxcbiAgJ21ldGVyJyxcbiAgJ25hdicsXG4gICdub2JyJyxcbiAgJ29sJyxcbiAgJ29wdGdyb3VwJyxcbiAgJ29wdGlvbicsXG4gICdvdXRwdXQnLFxuICAncCcsXG4gICdwaWN0dXJlJyxcbiAgJ3ByZScsXG4gICdwcm9ncmVzcycsXG4gICdxJyxcbiAgJ3JwJyxcbiAgJ3J0JyxcbiAgJ3J1YnknLFxuICAncycsXG4gICdzYW1wJyxcbiAgJ3NlYXJjaCcsXG4gICdzZWN0aW9uJyxcbiAgJ3NlbGVjdCcsXG4gICdzaGFkb3cnLFxuICAnc2xvdCcsXG4gICdzbWFsbCcsXG4gICdzb3VyY2UnLFxuICAnc3BhY2VyJyxcbiAgJ3NwYW4nLFxuICAnc3RyaWtlJyxcbiAgJ3N0cm9uZycsXG4gICdzdHlsZScsXG4gICdzdWInLFxuICAnc3VtbWFyeScsXG4gICdzdXAnLFxuICAndGFibGUnLFxuICAndGJvZHknLFxuICAndGQnLFxuICAndGVtcGxhdGUnLFxuICAndGV4dGFyZWEnLFxuICAndGZvb3QnLFxuICAndGgnLFxuICAndGhlYWQnLFxuICAndGltZScsXG4gICd0cicsXG4gICd0cmFjaycsXG4gICd0dCcsXG4gICd1JyxcbiAgJ3VsJyxcbiAgJ3ZhcicsXG4gICd2aWRlbycsXG4gICd3YnInLFxuXSBhcyBjb25zdCk7XG5cbmV4cG9ydCBjb25zdCBzdmcgPSBmcmVlemUoW1xuICAnc3ZnJyxcbiAgJ2EnLFxuICAnYWx0Z2x5cGgnLFxuICAnYWx0Z2x5cGhkZWYnLFxuICAnYWx0Z2x5cGhpdGVtJyxcbiAgJ2FuaW1hdGVjb2xvcicsXG4gICdhbmltYXRlbW90aW9uJyxcbiAgJ2FuaW1hdGV0cmFuc2Zvcm0nLFxuICAnY2lyY2xlJyxcbiAgJ2NsaXBwYXRoJyxcbiAgJ2RlZnMnLFxuICAnZGVzYycsXG4gICdlbGxpcHNlJyxcbiAgJ2VudGVya2V5aGludCcsXG4gICdleHBvcnRwYXJ0cycsXG4gICdmaWx0ZXInLFxuICAnZm9udCcsXG4gICdnJyxcbiAgJ2dseXBoJyxcbiAgJ2dseXBocmVmJyxcbiAgJ2hrZXJuJyxcbiAgJ2ltYWdlJyxcbiAgJ2lucHV0bW9kZScsXG4gICdsaW5lJyxcbiAgJ2xpbmVhcmdyYWRpZW50JyxcbiAgJ21hcmtlcicsXG4gICdtYXNrJyxcbiAgJ21ldGFkYXRhJyxcbiAgJ21wYXRoJyxcbiAgJ3BhcnQnLFxuICAncGF0aCcsXG4gICdwYXR0ZXJuJyxcbiAgJ3BvbHlnb24nLFxuICAncG9seWxpbmUnLFxuICAncmFkaWFsZ3JhZGllbnQnLFxuICAncmVjdCcsXG4gICdzdG9wJyxcbiAgJ3N0eWxlJyxcbiAgJ3N3aXRjaCcsXG4gICdzeW1ib2wnLFxuICAndGV4dCcsXG4gICd0ZXh0cGF0aCcsXG4gICd0aXRsZScsXG4gICd0cmVmJyxcbiAgJ3RzcGFuJyxcbiAgJ3ZpZXcnLFxuICAndmtlcm4nLFxuXSBhcyBjb25zdCk7XG5cbmV4cG9ydCBjb25zdCBzdmdGaWx0ZXJzID0gZnJlZXplKFtcbiAgJ2ZlQmxlbmQnLFxuICAnZmVDb2xvck1hdHJpeCcsXG4gICdmZUNvbXBvbmVudFRyYW5zZmVyJyxcbiAgJ2ZlQ29tcG9zaXRlJyxcbiAgJ2ZlQ29udm9sdmVNYXRyaXgnLFxuICAnZmVEaWZmdXNlTGlnaHRpbmcnLFxuICAnZmVEaXNwbGFjZW1lbnRNYXAnLFxuICAnZmVEaXN0YW50TGlnaHQnLFxuICAnZmVEcm9wU2hhZG93JyxcbiAgJ2ZlRmxvb2QnLFxuICAnZmVGdW5jQScsXG4gICdmZUZ1bmNCJyxcbiAgJ2ZlRnVuY0cnLFxuICAnZmVGdW5jUicsXG4gICdmZUdhdXNzaWFuQmx1cicsXG4gICdmZUltYWdlJyxcbiAgJ2ZlTWVyZ2UnLFxuICAnZmVNZXJnZU5vZGUnLFxuICAnZmVNb3JwaG9sb2d5JyxcbiAgJ2ZlT2Zmc2V0JyxcbiAgJ2ZlUG9pbnRMaWdodCcsXG4gICdmZVNwZWN1bGFyTGlnaHRpbmcnLFxuICAnZmVTcG90TGlnaHQnLFxuICAnZmVUaWxlJyxcbiAgJ2ZlVHVyYnVsZW5jZScsXG5dIGFzIGNvbnN0KTtcblxuLy8gTGlzdCBvZiBTVkcgZWxlbWVudHMgdGhhdCBhcmUgZGlzYWxsb3dlZCBieSBkZWZhdWx0LlxuLy8gV2Ugc3RpbGwgbmVlZCB0byBrbm93IHRoZW0gc28gdGhhdCB3ZSBjYW4gZG8gbmFtZXNwYWNlXG4vLyBjaGVja3MgcHJvcGVybHkgaW4gY2FzZSBvbmUgd2FudHMgdG8gYWRkIHRoZW0gdG9cbi8vIGFsbG93LWxpc3QuXG5leHBvcnQgY29uc3Qgc3ZnRGlzYWxsb3dlZCA9IGZyZWV6ZShbXG4gICdhbmltYXRlJyxcbiAgJ2NvbG9yLXByb2ZpbGUnLFxuICAnY3Vyc29yJyxcbiAgJ2Rpc2NhcmQnLFxuICAnZm9udC1mYWNlJyxcbiAgJ2ZvbnQtZmFjZS1mb3JtYXQnLFxuICAnZm9udC1mYWNlLW5hbWUnLFxuICAnZm9udC1mYWNlLXNyYycsXG4gICdmb250LWZhY2UtdXJpJyxcbiAgJ2ZvcmVpZ25vYmplY3QnLFxuICAnaGF0Y2gnLFxuICAnaGF0Y2hwYXRoJyxcbiAgJ21lc2gnLFxuICAnbWVzaGdyYWRpZW50JyxcbiAgJ21lc2hwYXRjaCcsXG4gICdtZXNocm93JyxcbiAgJ21pc3NpbmctZ2x5cGgnLFxuICAnc2NyaXB0JyxcbiAgJ3NldCcsXG4gICdzb2xpZGNvbG9yJyxcbiAgJ3Vua25vd24nLFxuICAndXNlJyxcbl0gYXMgY29uc3QpO1xuXG5leHBvcnQgY29uc3QgbWF0aE1sID0gZnJlZXplKFtcbiAgJ21hdGgnLFxuICAnbWVuY2xvc2UnLFxuICAnbWVycm9yJyxcbiAgJ21mZW5jZWQnLFxuICAnbWZyYWMnLFxuICAnbWdseXBoJyxcbiAgJ21pJyxcbiAgJ21sYWJlbGVkdHInLFxuICAnbW11bHRpc2NyaXB0cycsXG4gICdtbicsXG4gICdtbycsXG4gICdtb3ZlcicsXG4gICdtcGFkZGVkJyxcbiAgJ21waGFudG9tJyxcbiAgJ21yb290JyxcbiAgJ21yb3cnLFxuICAnbXMnLFxuICAnbXNwYWNlJyxcbiAgJ21zcXJ0JyxcbiAgJ21zdHlsZScsXG4gICdtc3ViJyxcbiAgJ21zdXAnLFxuICAnbXN1YnN1cCcsXG4gICdtdGFibGUnLFxuICAnbXRkJyxcbiAgJ210ZXh0JyxcbiAgJ210cicsXG4gICdtdW5kZXInLFxuICAnbXVuZGVyb3ZlcicsXG4gICdtcHJlc2NyaXB0cycsXG5dIGFzIGNvbnN0KTtcblxuLy8gU2ltaWxhcmx5IHRvIFNWRywgd2Ugd2FudCB0byBrbm93IGFsbCBNYXRoTUwgZWxlbWVudHMsXG4vLyBldmVuIHRob3NlIHRoYXQgd2UgZGlzYWxsb3cgYnkgZGVmYXVsdC5cbmV4cG9ydCBjb25zdCBtYXRoTWxEaXNhbGxvd2VkID0gZnJlZXplKFtcbiAgJ21hY3Rpb24nLFxuICAnbWFsaWduZ3JvdXAnLFxuICAnbWFsaWdubWFyaycsXG4gICdtbG9uZ2RpdicsXG4gICdtc2NhcnJpZXMnLFxuICAnbXNjYXJyeScsXG4gICdtc2dyb3VwJyxcbiAgJ21zdGFjaycsXG4gICdtc2xpbmUnLFxuICAnbXNyb3cnLFxuICAnc2VtYW50aWNzJyxcbiAgJ2Fubm90YXRpb24nLFxuICAnYW5ub3RhdGlvbi14bWwnLFxuICAnbXByZXNjcmlwdHMnLFxuICAnbm9uZScsXG5dIGFzIGNvbnN0KTtcblxuZXhwb3J0IGNvbnN0IHRleHQgPSBmcmVlemUoWycjdGV4dCddIGFzIGNvbnN0KTtcbiIsICJpbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuL3V0aWxzLmpzJztcblxuZXhwb3J0IGNvbnN0IGh0bWwgPSBmcmVlemUoW1xuICAnYWNjZXB0JyxcbiAgJ2FjdGlvbicsXG4gICdhbGlnbicsXG4gICdhbHQnLFxuICAnYXV0b2NhcGl0YWxpemUnLFxuICAnYXV0b2NvbXBsZXRlJyxcbiAgJ2F1dG9waWN0dXJlaW5waWN0dXJlJyxcbiAgJ2F1dG9wbGF5JyxcbiAgJ2JhY2tncm91bmQnLFxuICAnYmdjb2xvcicsXG4gICdib3JkZXInLFxuICAnY2FwdHVyZScsXG4gICdjZWxscGFkZGluZycsXG4gICdjZWxsc3BhY2luZycsXG4gICdjaGVja2VkJyxcbiAgJ2NpdGUnLFxuICAnY2xhc3MnLFxuICAnY2xlYXInLFxuICAnY29sb3InLFxuICAnY29scycsXG4gICdjb2xzcGFuJyxcbiAgJ2NvbnRyb2xzJyxcbiAgJ2NvbnRyb2xzbGlzdCcsXG4gICdjb29yZHMnLFxuICAnY3Jvc3NvcmlnaW4nLFxuICAnZGF0ZXRpbWUnLFxuICAnZGVjb2RpbmcnLFxuICAnZGVmYXVsdCcsXG4gICdkaXInLFxuICAnZGlzYWJsZWQnLFxuICAnZGlzYWJsZXBpY3R1cmVpbnBpY3R1cmUnLFxuICAnZGlzYWJsZXJlbW90ZXBsYXliYWNrJyxcbiAgJ2Rvd25sb2FkJyxcbiAgJ2RyYWdnYWJsZScsXG4gICdlbmN0eXBlJyxcbiAgJ2VudGVya2V5aGludCcsXG4gICdleHBvcnRwYXJ0cycsXG4gICdmYWNlJyxcbiAgJ2ZvcicsXG4gICdoZWFkZXJzJyxcbiAgJ2hlaWdodCcsXG4gICdoaWRkZW4nLFxuICAnaGlnaCcsXG4gICdocmVmJyxcbiAgJ2hyZWZsYW5nJyxcbiAgJ2lkJyxcbiAgJ2luZXJ0JyxcbiAgJ2lucHV0bW9kZScsXG4gICdpbnRlZ3JpdHknLFxuICAnaXNtYXAnLFxuICAna2luZCcsXG4gICdsYWJlbCcsXG4gICdsYW5nJyxcbiAgJ2xpc3QnLFxuICAnbG9hZGluZycsXG4gICdsb29wJyxcbiAgJ2xvdycsXG4gICdtYXgnLFxuICAnbWF4bGVuZ3RoJyxcbiAgJ21lZGlhJyxcbiAgJ21ldGhvZCcsXG4gICdtaW4nLFxuICAnbWlubGVuZ3RoJyxcbiAgJ211bHRpcGxlJyxcbiAgJ211dGVkJyxcbiAgJ25hbWUnLFxuICAnbm9uY2UnLFxuICAnbm9zaGFkZScsXG4gICdub3ZhbGlkYXRlJyxcbiAgJ25vd3JhcCcsXG4gICdvcGVuJyxcbiAgJ29wdGltdW0nLFxuICAncGFydCcsXG4gICdwYXR0ZXJuJyxcbiAgJ3BsYWNlaG9sZGVyJyxcbiAgJ3BsYXlzaW5saW5lJyxcbiAgJ3BvcG92ZXInLFxuICAncG9wb3ZlcnRhcmdldCcsXG4gICdwb3BvdmVydGFyZ2V0YWN0aW9uJyxcbiAgJ3Bvc3RlcicsXG4gICdwcmVsb2FkJyxcbiAgJ3B1YmRhdGUnLFxuICAncmFkaW9ncm91cCcsXG4gICdyZWFkb25seScsXG4gICdyZWwnLFxuICAncmVxdWlyZWQnLFxuICAncmV2JyxcbiAgJ3JldmVyc2VkJyxcbiAgJ3JvbGUnLFxuICAncm93cycsXG4gICdyb3dzcGFuJyxcbiAgJ3NwZWxsY2hlY2snLFxuICAnc2NvcGUnLFxuICAnc2VsZWN0ZWQnLFxuICAnc2hhcGUnLFxuICAnc2l6ZScsXG4gICdzaXplcycsXG4gICdzbG90JyxcbiAgJ3NwYW4nLFxuICAnc3JjbGFuZycsXG4gICdzdGFydCcsXG4gICdzcmMnLFxuICAnc3Jjc2V0JyxcbiAgJ3N0ZXAnLFxuICAnc3R5bGUnLFxuICAnc3VtbWFyeScsXG4gICd0YWJpbmRleCcsXG4gICd0aXRsZScsXG4gICd0cmFuc2xhdGUnLFxuICAndHlwZScsXG4gICd1c2VtYXAnLFxuICAndmFsaWduJyxcbiAgJ3ZhbHVlJyxcbiAgJ3dpZHRoJyxcbiAgJ3dyYXAnLFxuICAneG1sbnMnLFxuICAnc2xvdCcsXG5dIGFzIGNvbnN0KTtcblxuZXhwb3J0IGNvbnN0IHN2ZyA9IGZyZWV6ZShbXG4gICdhY2NlbnQtaGVpZ2h0JyxcbiAgJ2FjY3VtdWxhdGUnLFxuICAnYWRkaXRpdmUnLFxuICAnYWxpZ25tZW50LWJhc2VsaW5lJyxcbiAgJ2FtcGxpdHVkZScsXG4gICdhc2NlbnQnLFxuICAnYXR0cmlidXRlbmFtZScsXG4gICdhdHRyaWJ1dGV0eXBlJyxcbiAgJ2F6aW11dGgnLFxuICAnYmFzZWZyZXF1ZW5jeScsXG4gICdiYXNlbGluZS1zaGlmdCcsXG4gICdiZWdpbicsXG4gICdiaWFzJyxcbiAgJ2J5JyxcbiAgJ2NsYXNzJyxcbiAgJ2NsaXAnLFxuICAnY2xpcHBhdGh1bml0cycsXG4gICdjbGlwLXBhdGgnLFxuICAnY2xpcC1ydWxlJyxcbiAgJ2NvbG9yJyxcbiAgJ2NvbG9yLWludGVycG9sYXRpb24nLFxuICAnY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzJyxcbiAgJ2NvbG9yLXByb2ZpbGUnLFxuICAnY29sb3ItcmVuZGVyaW5nJyxcbiAgJ2N4JyxcbiAgJ2N5JyxcbiAgJ2QnLFxuICAnZHgnLFxuICAnZHknLFxuICAnZGlmZnVzZWNvbnN0YW50JyxcbiAgJ2RpcmVjdGlvbicsXG4gICdkaXNwbGF5JyxcbiAgJ2Rpdmlzb3InLFxuICAnZHVyJyxcbiAgJ2VkZ2Vtb2RlJyxcbiAgJ2VsZXZhdGlvbicsXG4gICdlbmQnLFxuICAnZXhwb25lbnQnLFxuICAnZmlsbCcsXG4gICdmaWxsLW9wYWNpdHknLFxuICAnZmlsbC1ydWxlJyxcbiAgJ2ZpbHRlcicsXG4gICdmaWx0ZXJ1bml0cycsXG4gICdmbG9vZC1jb2xvcicsXG4gICdmbG9vZC1vcGFjaXR5JyxcbiAgJ2ZvbnQtZmFtaWx5JyxcbiAgJ2ZvbnQtc2l6ZScsXG4gICdmb250LXNpemUtYWRqdXN0JyxcbiAgJ2ZvbnQtc3RyZXRjaCcsXG4gICdmb250LXN0eWxlJyxcbiAgJ2ZvbnQtdmFyaWFudCcsXG4gICdmb250LXdlaWdodCcsXG4gICdmeCcsXG4gICdmeScsXG4gICdnMScsXG4gICdnMicsXG4gICdnbHlwaC1uYW1lJyxcbiAgJ2dseXBocmVmJyxcbiAgJ2dyYWRpZW50dW5pdHMnLFxuICAnZ3JhZGllbnR0cmFuc2Zvcm0nLFxuICAnaGVpZ2h0JyxcbiAgJ2hyZWYnLFxuICAnaWQnLFxuICAnaW1hZ2UtcmVuZGVyaW5nJyxcbiAgJ2luJyxcbiAgJ2luMicsXG4gICdpbnRlcmNlcHQnLFxuICAnaycsXG4gICdrMScsXG4gICdrMicsXG4gICdrMycsXG4gICdrNCcsXG4gICdrZXJuaW5nJyxcbiAgJ2tleXBvaW50cycsXG4gICdrZXlzcGxpbmVzJyxcbiAgJ2tleXRpbWVzJyxcbiAgJ2xhbmcnLFxuICAnbGVuZ3RoYWRqdXN0JyxcbiAgJ2xldHRlci1zcGFjaW5nJyxcbiAgJ2tlcm5lbG1hdHJpeCcsXG4gICdrZXJuZWx1bml0bGVuZ3RoJyxcbiAgJ2xpZ2h0aW5nLWNvbG9yJyxcbiAgJ2xvY2FsJyxcbiAgJ21hcmtlci1lbmQnLFxuICAnbWFya2VyLW1pZCcsXG4gICdtYXJrZXItc3RhcnQnLFxuICAnbWFya2VyaGVpZ2h0JyxcbiAgJ21hcmtlcnVuaXRzJyxcbiAgJ21hcmtlcndpZHRoJyxcbiAgJ21hc2tjb250ZW50dW5pdHMnLFxuICAnbWFza3VuaXRzJyxcbiAgJ21heCcsXG4gICdtYXNrJyxcbiAgJ21hc2stdHlwZScsXG4gICdtZWRpYScsXG4gICdtZXRob2QnLFxuICAnbW9kZScsXG4gICdtaW4nLFxuICAnbmFtZScsXG4gICdudW1vY3RhdmVzJyxcbiAgJ29mZnNldCcsXG4gICdvcGVyYXRvcicsXG4gICdvcGFjaXR5JyxcbiAgJ29yZGVyJyxcbiAgJ29yaWVudCcsXG4gICdvcmllbnRhdGlvbicsXG4gICdvcmlnaW4nLFxuICAnb3ZlcmZsb3cnLFxuICAncGFpbnQtb3JkZXInLFxuICAncGF0aCcsXG4gICdwYXRobGVuZ3RoJyxcbiAgJ3BhdHRlcm5jb250ZW50dW5pdHMnLFxuICAncGF0dGVybnRyYW5zZm9ybScsXG4gICdwYXR0ZXJudW5pdHMnLFxuICAncG9pbnRzJyxcbiAgJ3ByZXNlcnZlYWxwaGEnLFxuICAncHJlc2VydmVhc3BlY3RyYXRpbycsXG4gICdwcmltaXRpdmV1bml0cycsXG4gICdyJyxcbiAgJ3J4JyxcbiAgJ3J5JyxcbiAgJ3JhZGl1cycsXG4gICdyZWZ4JyxcbiAgJ3JlZnknLFxuICAncmVwZWF0Y291bnQnLFxuICAncmVwZWF0ZHVyJyxcbiAgJ3Jlc3RhcnQnLFxuICAncmVzdWx0JyxcbiAgJ3JvdGF0ZScsXG4gICdzY2FsZScsXG4gICdzZWVkJyxcbiAgJ3NoYXBlLXJlbmRlcmluZycsXG4gICdzbG9wZScsXG4gICdzcGVjdWxhcmNvbnN0YW50JyxcbiAgJ3NwZWN1bGFyZXhwb25lbnQnLFxuICAnc3ByZWFkbWV0aG9kJyxcbiAgJ3N0YXJ0b2Zmc2V0JyxcbiAgJ3N0ZGRldmlhdGlvbicsXG4gICdzdGl0Y2h0aWxlcycsXG4gICdzdG9wLWNvbG9yJyxcbiAgJ3N0b3Atb3BhY2l0eScsXG4gICdzdHJva2UtZGFzaGFycmF5JyxcbiAgJ3N0cm9rZS1kYXNob2Zmc2V0JyxcbiAgJ3N0cm9rZS1saW5lY2FwJyxcbiAgJ3N0cm9rZS1saW5lam9pbicsXG4gICdzdHJva2UtbWl0ZXJsaW1pdCcsXG4gICdzdHJva2Utb3BhY2l0eScsXG4gICdzdHJva2UnLFxuICAnc3Ryb2tlLXdpZHRoJyxcbiAgJ3N0eWxlJyxcbiAgJ3N1cmZhY2VzY2FsZScsXG4gICdzeXN0ZW1sYW5ndWFnZScsXG4gICd0YWJpbmRleCcsXG4gICd0YWJsZXZhbHVlcycsXG4gICd0YXJnZXR4JyxcbiAgJ3RhcmdldHknLFxuICAndHJhbnNmb3JtJyxcbiAgJ3RyYW5zZm9ybS1vcmlnaW4nLFxuICAndGV4dC1hbmNob3InLFxuICAndGV4dC1kZWNvcmF0aW9uJyxcbiAgJ3RleHQtcmVuZGVyaW5nJyxcbiAgJ3RleHRsZW5ndGgnLFxuICAndHlwZScsXG4gICd1MScsXG4gICd1MicsXG4gICd1bmljb2RlJyxcbiAgJ3ZhbHVlcycsXG4gICd2aWV3Ym94JyxcbiAgJ3Zpc2liaWxpdHknLFxuICAndmVyc2lvbicsXG4gICd2ZXJ0LWFkdi15JyxcbiAgJ3ZlcnQtb3JpZ2luLXgnLFxuICAndmVydC1vcmlnaW4teScsXG4gICd3aWR0aCcsXG4gICd3b3JkLXNwYWNpbmcnLFxuICAnd3JhcCcsXG4gICd3cml0aW5nLW1vZGUnLFxuICAneGNoYW5uZWxzZWxlY3RvcicsXG4gICd5Y2hhbm5lbHNlbGVjdG9yJyxcbiAgJ3gnLFxuICAneDEnLFxuICAneDInLFxuICAneG1sbnMnLFxuICAneScsXG4gICd5MScsXG4gICd5MicsXG4gICd6JyxcbiAgJ3pvb21hbmRwYW4nLFxuXSBhcyBjb25zdCk7XG5cbmV4cG9ydCBjb25zdCBtYXRoTWwgPSBmcmVlemUoW1xuICAnYWNjZW50JyxcbiAgJ2FjY2VudHVuZGVyJyxcbiAgJ2FsaWduJyxcbiAgJ2JldmVsbGVkJyxcbiAgJ2Nsb3NlJyxcbiAgJ2NvbHVtbnNhbGlnbicsXG4gICdjb2x1bW5saW5lcycsXG4gICdjb2x1bW5zcGFuJyxcbiAgJ2Rlbm9tYWxpZ24nLFxuICAnZGVwdGgnLFxuICAnZGlyJyxcbiAgJ2Rpc3BsYXknLFxuICAnZGlzcGxheXN0eWxlJyxcbiAgJ2VuY29kaW5nJyxcbiAgJ2ZlbmNlJyxcbiAgJ2ZyYW1lJyxcbiAgJ2hlaWdodCcsXG4gICdocmVmJyxcbiAgJ2lkJyxcbiAgJ2xhcmdlb3AnLFxuICAnbGVuZ3RoJyxcbiAgJ2xpbmV0aGlja25lc3MnLFxuICAnbHNwYWNlJyxcbiAgJ2xxdW90ZScsXG4gICdtYXRoYmFja2dyb3VuZCcsXG4gICdtYXRoY29sb3InLFxuICAnbWF0aHNpemUnLFxuICAnbWF0aHZhcmlhbnQnLFxuICAnbWF4c2l6ZScsXG4gICdtaW5zaXplJyxcbiAgJ21vdmFibGVsaW1pdHMnLFxuICAnbm90YXRpb24nLFxuICAnbnVtYWxpZ24nLFxuICAnb3BlbicsXG4gICdyb3dhbGlnbicsXG4gICdyb3dsaW5lcycsXG4gICdyb3dzcGFjaW5nJyxcbiAgJ3Jvd3NwYW4nLFxuICAncnNwYWNlJyxcbiAgJ3JxdW90ZScsXG4gICdzY3JpcHRsZXZlbCcsXG4gICdzY3JpcHRtaW5zaXplJyxcbiAgJ3NjcmlwdHNpemVtdWx0aXBsaWVyJyxcbiAgJ3NlbGVjdGlvbicsXG4gICdzZXBhcmF0b3InLFxuICAnc2VwYXJhdG9ycycsXG4gICdzdHJldGNoeScsXG4gICdzdWJzY3JpcHRzaGlmdCcsXG4gICdzdXBzY3JpcHRzaGlmdCcsXG4gICdzeW1tZXRyaWMnLFxuICAndm9mZnNldCcsXG4gICd3aWR0aCcsXG4gICd4bWxucycsXG5dKTtcblxuZXhwb3J0IGNvbnN0IHhtbCA9IGZyZWV6ZShbXG4gICd4bGluazpocmVmJyxcbiAgJ3htbDppZCcsXG4gICd4bGluazp0aXRsZScsXG4gICd4bWw6c3BhY2UnLFxuICAneG1sbnM6eGxpbmsnLFxuXSBhcyBjb25zdCk7XG4iLCAiaW1wb3J0IHsgc2VhbCB9IGZyb20gJy4vdXRpbHMuanMnO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9iZXR0ZXItcmVnZXhcbmV4cG9ydCBjb25zdCBNVVNUQUNIRV9FWFBSID0gc2VhbCgvXFx7XFx7W1xcd1xcV10qfFtcXHdcXFddKlxcfVxcfS9nbSk7IC8vIFNwZWNpZnkgdGVtcGxhdGUgZGV0ZWN0aW9uIHJlZ2V4IGZvciBTQUZFX0ZPUl9URU1QTEFURVMgbW9kZVxuZXhwb3J0IGNvbnN0IEVSQl9FWFBSID0gc2VhbCgvPCVbXFx3XFxXXSp8W1xcd1xcV10qJT4vZ20pO1xuZXhwb3J0IGNvbnN0IFRNUExJVF9FWFBSID0gc2VhbCgvXFwkXFx7W1xcd1xcV10qL2dtKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSB1bmljb3JuL2JldHRlci1yZWdleFxuZXhwb3J0IGNvbnN0IERBVEFfQVRUUiA9IHNlYWwoL15kYXRhLVtcXC1cXHcuXFx1MDBCNy1cXHVGRkZGXSskLyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdXNlbGVzcy1lc2NhcGVcbmV4cG9ydCBjb25zdCBBUklBX0FUVFIgPSBzZWFsKC9eYXJpYS1bXFwtXFx3XSskLyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdXNlbGVzcy1lc2NhcGVcbmV4cG9ydCBjb25zdCBJU19BTExPV0VEX1VSSSA9IHNlYWwoXG4gIC9eKD86KD86KD86ZnxodCl0cHM/fG1haWx0b3x0ZWx8Y2FsbHRvfHNtc3xjaWR8eG1wcHxtYXRyaXgpOnxbXmEtel18W2EteisuXFwtXSsoPzpbXmEteisuXFwtOl18JCkpL2kgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2VsZXNzLWVzY2FwZVxuKTtcbmV4cG9ydCBjb25zdCBJU19TQ1JJUFRfT1JfREFUQSA9IHNlYWwoL14oPzpcXHcrc2NyaXB0fGRhdGEpOi9pKTtcbmV4cG9ydCBjb25zdCBBVFRSX1dISVRFU1BBQ0UgPSBzZWFsKFxuICAvW1xcdTAwMDAtXFx1MDAyMFxcdTAwQTBcXHUxNjgwXFx1MTgwRVxcdTIwMDAtXFx1MjAyOVxcdTIwNUZcXHUzMDAwXS9nIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29udHJvbC1yZWdleFxuKTtcbmV4cG9ydCBjb25zdCBET0NUWVBFX05BTUUgPSBzZWFsKC9eaHRtbCQvaSk7XG5leHBvcnQgY29uc3QgQ1VTVE9NX0VMRU1FTlQgPSBzZWFsKC9eW2Etel1bLlxcd10qKC1bLlxcd10rKSskL2kpO1xuIiwgIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9pbmRlbnQgKi9cblxuaW1wb3J0IHR5cGUge1xuICBUcnVzdGVkSFRNTCxcbiAgVHJ1c3RlZFR5cGVzV2luZG93LFxufSBmcm9tICd0cnVzdGVkLXR5cGVzL2xpYi9pbmRleC5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbmZpZywgVXNlUHJvZmlsZXNDb25maWcgfSBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQgKiBhcyBUQUdTIGZyb20gJy4vdGFncy5qcyc7XG5pbXBvcnQgKiBhcyBBVFRSUyBmcm9tICcuL2F0dHJzLmpzJztcbmltcG9ydCAqIGFzIEVYUFJFU1NJT05TIGZyb20gJy4vcmVnZXhwLmpzJztcbmltcG9ydCB7XG4gIGFkZFRvU2V0LFxuICBjbG9uZSxcbiAgZW50cmllcyxcbiAgZnJlZXplLFxuICBhcnJheUZvckVhY2gsXG4gIGFycmF5TGFzdEluZGV4T2YsXG4gIGFycmF5UG9wLFxuICBhcnJheVB1c2gsXG4gIGFycmF5U3BsaWNlLFxuICBzdHJpbmdNYXRjaCxcbiAgc3RyaW5nUmVwbGFjZSxcbiAgc3RyaW5nVG9Mb3dlckNhc2UsXG4gIHN0cmluZ1RvU3RyaW5nLFxuICBzdHJpbmdJbmRleE9mLFxuICBzdHJpbmdUcmltLFxuICByZWdFeHBUZXN0LFxuICB0eXBlRXJyb3JDcmVhdGUsXG4gIGxvb2t1cEdldHRlcixcbiAgY3JlYXRlLFxuICBvYmplY3RIYXNPd25Qcm9wZXJ0eSxcbn0gZnJvbSAnLi91dGlscy5qcyc7XG5cbmV4cG9ydCB0eXBlIHsgQ29uZmlnIH0gZnJvbSAnLi9jb25maWcnO1xuXG5kZWNsYXJlIGNvbnN0IFZFUlNJT046IHN0cmluZztcblxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL05vZGUvbm9kZVR5cGVcbmNvbnN0IE5PREVfVFlQRSA9IHtcbiAgZWxlbWVudDogMSxcbiAgYXR0cmlidXRlOiAyLFxuICB0ZXh0OiAzLFxuICBjZGF0YVNlY3Rpb246IDQsXG4gIGVudGl0eVJlZmVyZW5jZTogNSwgLy8gRGVwcmVjYXRlZFxuICBlbnRpdHlOb2RlOiA2LCAvLyBEZXByZWNhdGVkXG4gIHByb2dyZXNzaW5nSW5zdHJ1Y3Rpb246IDcsXG4gIGNvbW1lbnQ6IDgsXG4gIGRvY3VtZW50OiA5LFxuICBkb2N1bWVudFR5cGU6IDEwLFxuICBkb2N1bWVudEZyYWdtZW50OiAxMSxcbiAgbm90YXRpb246IDEyLCAvLyBEZXByZWNhdGVkXG59O1xuXG5jb25zdCBnZXRHbG9iYWwgPSBmdW5jdGlvbiAoKTogV2luZG93TGlrZSB7XG4gIHJldHVybiB0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyA/IG51bGwgOiB3aW5kb3c7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuby1vcCBwb2xpY3kgZm9yIGludGVybmFsIHVzZSBvbmx5LlxuICogRG9uJ3QgZXhwb3J0IHRoaXMgZnVuY3Rpb24gb3V0c2lkZSB0aGlzIG1vZHVsZSFcbiAqIEBwYXJhbSB0cnVzdGVkVHlwZXMgVGhlIHBvbGljeSBmYWN0b3J5LlxuICogQHBhcmFtIHB1cmlmeUhvc3RFbGVtZW50IFRoZSBTY3JpcHQgZWxlbWVudCB1c2VkIHRvIGxvYWQgRE9NUHVyaWZ5ICh0byBkZXRlcm1pbmUgcG9saWN5IG5hbWUgc3VmZml4KS5cbiAqIEByZXR1cm4gVGhlIHBvbGljeSBjcmVhdGVkIChvciBudWxsLCBpZiBUcnVzdGVkIFR5cGVzXG4gKiBhcmUgbm90IHN1cHBvcnRlZCBvciBjcmVhdGluZyB0aGUgcG9saWN5IGZhaWxlZCkuXG4gKi9cbmNvbnN0IF9jcmVhdGVUcnVzdGVkVHlwZXNQb2xpY3kgPSBmdW5jdGlvbiAoXG4gIHRydXN0ZWRUeXBlczogVHJ1c3RlZFR5cGVQb2xpY3lGYWN0b3J5LFxuICBwdXJpZnlIb3N0RWxlbWVudDogSFRNTFNjcmlwdEVsZW1lbnRcbikge1xuICBpZiAoXG4gICAgdHlwZW9mIHRydXN0ZWRUeXBlcyAhPT0gJ29iamVjdCcgfHxcbiAgICB0eXBlb2YgdHJ1c3RlZFR5cGVzLmNyZWF0ZVBvbGljeSAhPT0gJ2Z1bmN0aW9uJ1xuICApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIEFsbG93IHRoZSBjYWxsZXJzIHRvIGNvbnRyb2wgdGhlIHVuaXF1ZSBwb2xpY3kgbmFtZVxuICAvLyBieSBhZGRpbmcgYSBkYXRhLXR0LXBvbGljeS1zdWZmaXggdG8gdGhlIHNjcmlwdCBlbGVtZW50IHdpdGggdGhlIERPTVB1cmlmeS5cbiAgLy8gUG9saWN5IGNyZWF0aW9uIHdpdGggZHVwbGljYXRlIG5hbWVzIHRocm93cyBpbiBUcnVzdGVkIFR5cGVzLlxuICBsZXQgc3VmZml4ID0gbnVsbDtcbiAgY29uc3QgQVRUUl9OQU1FID0gJ2RhdGEtdHQtcG9saWN5LXN1ZmZpeCc7XG4gIGlmIChwdXJpZnlIb3N0RWxlbWVudCAmJiBwdXJpZnlIb3N0RWxlbWVudC5oYXNBdHRyaWJ1dGUoQVRUUl9OQU1FKSkge1xuICAgIHN1ZmZpeCA9IHB1cmlmeUhvc3RFbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSX05BTUUpO1xuICB9XG5cbiAgY29uc3QgcG9saWN5TmFtZSA9ICdkb21wdXJpZnknICsgKHN1ZmZpeCA/ICcjJyArIHN1ZmZpeCA6ICcnKTtcblxuICB0cnkge1xuICAgIHJldHVybiB0cnVzdGVkVHlwZXMuY3JlYXRlUG9saWN5KHBvbGljeU5hbWUsIHtcbiAgICAgIGNyZWF0ZUhUTUwoaHRtbCkge1xuICAgICAgICByZXR1cm4gaHRtbDtcbiAgICAgIH0sXG4gICAgICBjcmVhdGVTY3JpcHRVUkwoc2NyaXB0VXJsKSB7XG4gICAgICAgIHJldHVybiBzY3JpcHRVcmw7XG4gICAgICB9LFxuICAgIH0pO1xuICB9IGNhdGNoIChfKSB7XG4gICAgLy8gUG9saWN5IGNyZWF0aW9uIGZhaWxlZCAobW9zdCBsaWtlbHkgYW5vdGhlciBET01QdXJpZnkgc2NyaXB0IGhhc1xuICAgIC8vIGFscmVhZHkgcnVuKS4gU2tpcCBjcmVhdGluZyB0aGUgcG9saWN5LCBhcyB0aGlzIHdpbGwgb25seSBjYXVzZSBlcnJvcnNcbiAgICAvLyBpZiBUVCBhcmUgZW5mb3JjZWQuXG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ1RydXN0ZWRUeXBlcyBwb2xpY3kgJyArIHBvbGljeU5hbWUgKyAnIGNvdWxkIG5vdCBiZSBjcmVhdGVkLidcbiAgICApO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59O1xuXG5jb25zdCBfY3JlYXRlSG9va3NNYXAgPSBmdW5jdGlvbiAoKTogSG9va3NNYXAge1xuICByZXR1cm4ge1xuICAgIGFmdGVyU2FuaXRpemVBdHRyaWJ1dGVzOiBbXSxcbiAgICBhZnRlclNhbml0aXplRWxlbWVudHM6IFtdLFxuICAgIGFmdGVyU2FuaXRpemVTaGFkb3dET006IFtdLFxuICAgIGJlZm9yZVNhbml0aXplQXR0cmlidXRlczogW10sXG4gICAgYmVmb3JlU2FuaXRpemVFbGVtZW50czogW10sXG4gICAgYmVmb3JlU2FuaXRpemVTaGFkb3dET006IFtdLFxuICAgIHVwb25TYW5pdGl6ZUF0dHJpYnV0ZTogW10sXG4gICAgdXBvblNhbml0aXplRWxlbWVudDogW10sXG4gICAgdXBvblNhbml0aXplU2hhZG93Tm9kZTogW10sXG4gIH07XG59O1xuXG5mdW5jdGlvbiBjcmVhdGVET01QdXJpZnkod2luZG93OiBXaW5kb3dMaWtlID0gZ2V0R2xvYmFsKCkpOiBET01QdXJpZnkge1xuICBjb25zdCBET01QdXJpZnk6IERPTVB1cmlmeSA9IChyb290OiBXaW5kb3dMaWtlKSA9PiBjcmVhdGVET01QdXJpZnkocm9vdCk7XG5cbiAgRE9NUHVyaWZ5LnZlcnNpb24gPSBWRVJTSU9OO1xuXG4gIERPTVB1cmlmeS5yZW1vdmVkID0gW107XG5cbiAgaWYgKFxuICAgICF3aW5kb3cgfHxcbiAgICAhd2luZG93LmRvY3VtZW50IHx8XG4gICAgd2luZG93LmRvY3VtZW50Lm5vZGVUeXBlICE9PSBOT0RFX1RZUEUuZG9jdW1lbnQgfHxcbiAgICAhd2luZG93LkVsZW1lbnRcbiAgKSB7XG4gICAgLy8gTm90IHJ1bm5pbmcgaW4gYSBicm93c2VyLCBwcm92aWRlIGEgZmFjdG9yeSBmdW5jdGlvblxuICAgIC8vIHNvIHRoYXQgeW91IGNhbiBwYXNzIHlvdXIgb3duIFdpbmRvd1xuICAgIERPTVB1cmlmeS5pc1N1cHBvcnRlZCA9IGZhbHNlO1xuXG4gICAgcmV0dXJuIERPTVB1cmlmeTtcbiAgfVxuXG4gIGxldCB7IGRvY3VtZW50IH0gPSB3aW5kb3c7XG5cbiAgY29uc3Qgb3JpZ2luYWxEb2N1bWVudCA9IGRvY3VtZW50O1xuICBjb25zdCBjdXJyZW50U2NyaXB0OiBIVE1MU2NyaXB0RWxlbWVudCA9XG4gICAgb3JpZ2luYWxEb2N1bWVudC5jdXJyZW50U2NyaXB0IGFzIEhUTUxTY3JpcHRFbGVtZW50O1xuICBjb25zdCB7XG4gICAgRG9jdW1lbnRGcmFnbWVudCxcbiAgICBIVE1MVGVtcGxhdGVFbGVtZW50LFxuICAgIE5vZGUsXG4gICAgRWxlbWVudCxcbiAgICBOb2RlRmlsdGVyLFxuICAgIE5hbWVkTm9kZU1hcCA9IHdpbmRvdy5OYW1lZE5vZGVNYXAgfHwgKHdpbmRvdyBhcyBhbnkpLk1vek5hbWVkQXR0ck1hcCxcbiAgICBIVE1MRm9ybUVsZW1lbnQsXG4gICAgRE9NUGFyc2VyLFxuICAgIHRydXN0ZWRUeXBlcyxcbiAgfSA9IHdpbmRvdztcblxuICBjb25zdCBFbGVtZW50UHJvdG90eXBlID0gRWxlbWVudC5wcm90b3R5cGU7XG5cbiAgY29uc3QgY2xvbmVOb2RlID0gbG9va3VwR2V0dGVyKEVsZW1lbnRQcm90b3R5cGUsICdjbG9uZU5vZGUnKTtcbiAgY29uc3QgcmVtb3ZlID0gbG9va3VwR2V0dGVyKEVsZW1lbnRQcm90b3R5cGUsICdyZW1vdmUnKTtcbiAgY29uc3QgZ2V0TmV4dFNpYmxpbmcgPSBsb29rdXBHZXR0ZXIoRWxlbWVudFByb3RvdHlwZSwgJ25leHRTaWJsaW5nJyk7XG4gIGNvbnN0IGdldENoaWxkTm9kZXMgPSBsb29rdXBHZXR0ZXIoRWxlbWVudFByb3RvdHlwZSwgJ2NoaWxkTm9kZXMnKTtcbiAgY29uc3QgZ2V0UGFyZW50Tm9kZSA9IGxvb2t1cEdldHRlcihFbGVtZW50UHJvdG90eXBlLCAncGFyZW50Tm9kZScpO1xuXG4gIC8vIEFzIHBlciBpc3N1ZSAjNDcsIHRoZSB3ZWItY29tcG9uZW50cyByZWdpc3RyeSBpcyBpbmhlcml0ZWQgYnkgYVxuICAvLyBuZXcgZG9jdW1lbnQgY3JlYXRlZCB2aWEgY3JlYXRlSFRNTERvY3VtZW50LiBBcyBwZXIgdGhlIHNwZWNcbiAgLy8gKGh0dHA6Ly93M2MuZ2l0aHViLmlvL3dlYmNvbXBvbmVudHMvc3BlYy9jdXN0b20vI2NyZWF0aW5nLWFuZC1wYXNzaW5nLXJlZ2lzdHJpZXMpXG4gIC8vIGEgbmV3IGVtcHR5IHJlZ2lzdHJ5IGlzIHVzZWQgd2hlbiBjcmVhdGluZyBhIHRlbXBsYXRlIGNvbnRlbnRzIG93bmVyXG4gIC8vIGRvY3VtZW50LCBzbyB3ZSB1c2UgdGhhdCBhcyBvdXIgcGFyZW50IGRvY3VtZW50IHRvIGVuc3VyZSBub3RoaW5nXG4gIC8vIGlzIGluaGVyaXRlZC5cbiAgaWYgKHR5cGVvZiBIVE1MVGVtcGxhdGVFbGVtZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY29uc3QgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpO1xuICAgIGlmICh0ZW1wbGF0ZS5jb250ZW50ICYmIHRlbXBsYXRlLmNvbnRlbnQub3duZXJEb2N1bWVudCkge1xuICAgICAgZG9jdW1lbnQgPSB0ZW1wbGF0ZS5jb250ZW50Lm93bmVyRG9jdW1lbnQ7XG4gICAgfVxuICB9XG5cbiAgbGV0IHRydXN0ZWRUeXBlc1BvbGljeTtcbiAgbGV0IGVtcHR5SFRNTCA9ICcnO1xuXG4gIGNvbnN0IHtcbiAgICBpbXBsZW1lbnRhdGlvbixcbiAgICBjcmVhdGVOb2RlSXRlcmF0b3IsXG4gICAgY3JlYXRlRG9jdW1lbnRGcmFnbWVudCxcbiAgICBnZXRFbGVtZW50c0J5VGFnTmFtZSxcbiAgfSA9IGRvY3VtZW50O1xuICBjb25zdCB7IGltcG9ydE5vZGUgfSA9IG9yaWdpbmFsRG9jdW1lbnQ7XG5cbiAgbGV0IGhvb2tzID0gX2NyZWF0ZUhvb2tzTWFwKCk7XG5cbiAgLyoqXG4gICAqIEV4cG9zZSB3aGV0aGVyIHRoaXMgYnJvd3NlciBzdXBwb3J0cyBydW5uaW5nIHRoZSBmdWxsIERPTVB1cmlmeS5cbiAgICovXG4gIERPTVB1cmlmeS5pc1N1cHBvcnRlZCA9XG4gICAgdHlwZW9mIGVudHJpZXMgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2YgZ2V0UGFyZW50Tm9kZSA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIGltcGxlbWVudGF0aW9uICYmXG4gICAgaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50ICE9PSB1bmRlZmluZWQ7XG5cbiAgY29uc3Qge1xuICAgIE1VU1RBQ0hFX0VYUFIsXG4gICAgRVJCX0VYUFIsXG4gICAgVE1QTElUX0VYUFIsXG4gICAgREFUQV9BVFRSLFxuICAgIEFSSUFfQVRUUixcbiAgICBJU19TQ1JJUFRfT1JfREFUQSxcbiAgICBBVFRSX1dISVRFU1BBQ0UsXG4gICAgQ1VTVE9NX0VMRU1FTlQsXG4gIH0gPSBFWFBSRVNTSU9OUztcblxuICBsZXQgeyBJU19BTExPV0VEX1VSSSB9ID0gRVhQUkVTU0lPTlM7XG5cbiAgLyoqXG4gICAqIFdlIGNvbnNpZGVyIHRoZSBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBiZWxvdyB0byBiZSBzYWZlLiBJZGVhbGx5XG4gICAqIGRvbid0IGFkZCBhbnkgbmV3IG9uZXMgYnV0IGZlZWwgZnJlZSB0byByZW1vdmUgdW53YW50ZWQgb25lcy5cbiAgICovXG5cbiAgLyogYWxsb3dlZCBlbGVtZW50IG5hbWVzICovXG4gIGxldCBBTExPV0VEX1RBR1MgPSBudWxsO1xuICBjb25zdCBERUZBVUxUX0FMTE9XRURfVEFHUyA9IGFkZFRvU2V0KHt9LCBbXG4gICAgLi4uVEFHUy5odG1sLFxuICAgIC4uLlRBR1Muc3ZnLFxuICAgIC4uLlRBR1Muc3ZnRmlsdGVycyxcbiAgICAuLi5UQUdTLm1hdGhNbCxcbiAgICAuLi5UQUdTLnRleHQsXG4gIF0pO1xuXG4gIC8qIEFsbG93ZWQgYXR0cmlidXRlIG5hbWVzICovXG4gIGxldCBBTExPV0VEX0FUVFIgPSBudWxsO1xuICBjb25zdCBERUZBVUxUX0FMTE9XRURfQVRUUiA9IGFkZFRvU2V0KHt9LCBbXG4gICAgLi4uQVRUUlMuaHRtbCxcbiAgICAuLi5BVFRSUy5zdmcsXG4gICAgLi4uQVRUUlMubWF0aE1sLFxuICAgIC4uLkFUVFJTLnhtbCxcbiAgXSk7XG5cbiAgLypcbiAgICogQ29uZmlndXJlIGhvdyBET01QdXJpZnkgc2hvdWxkIGhhbmRsZSBjdXN0b20gZWxlbWVudHMgYW5kIHRoZWlyIGF0dHJpYnV0ZXMgYXMgd2VsbCBhcyBjdXN0b21pemVkIGJ1aWx0LWluIGVsZW1lbnRzLlxuICAgKiBAcHJvcGVydHkge1JlZ0V4cHxGdW5jdGlvbnxudWxsfSB0YWdOYW1lQ2hlY2sgb25lIG9mIFtudWxsLCByZWdleFBhdHRlcm4sIHByZWRpY2F0ZV0uIERlZmF1bHQ6IGBudWxsYCAoZGlzYWxsb3cgYW55IGN1c3RvbSBlbGVtZW50cylcbiAgICogQHByb3BlcnR5IHtSZWdFeHB8RnVuY3Rpb258bnVsbH0gYXR0cmlidXRlTmFtZUNoZWNrIG9uZSBvZiBbbnVsbCwgcmVnZXhQYXR0ZXJuLCBwcmVkaWNhdGVdLiBEZWZhdWx0OiBgbnVsbGAgKGRpc2FsbG93IGFueSBhdHRyaWJ1dGVzIG5vdCBvbiB0aGUgYWxsb3cgbGlzdClcbiAgICogQHByb3BlcnR5IHtib29sZWFufSBhbGxvd0N1c3RvbWl6ZWRCdWlsdEluRWxlbWVudHMgYWxsb3cgY3VzdG9tIGVsZW1lbnRzIGRlcml2ZWQgZnJvbSBidWlsdC1pbnMgaWYgdGhleSBwYXNzIENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVjay4gRGVmYXVsdDogYGZhbHNlYC5cbiAgICovXG4gIGxldCBDVVNUT01fRUxFTUVOVF9IQU5ETElORyA9IE9iamVjdC5zZWFsKFxuICAgIGNyZWF0ZShudWxsLCB7XG4gICAgICB0YWdOYW1lQ2hlY2s6IHtcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgfSxcbiAgICAgIGF0dHJpYnV0ZU5hbWVDaGVjazoge1xuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IG51bGwsXG4gICAgICB9LFxuICAgICAgYWxsb3dDdXN0b21pemVkQnVpbHRJbkVsZW1lbnRzOiB7XG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogZmFsc2UsXG4gICAgICB9LFxuICAgIH0pXG4gICk7XG5cbiAgLyogRXhwbGljaXRseSBmb3JiaWRkZW4gdGFncyAob3ZlcnJpZGVzIEFMTE9XRURfVEFHUy9BRERfVEFHUykgKi9cbiAgbGV0IEZPUkJJRF9UQUdTID0gbnVsbDtcblxuICAvKiBFeHBsaWNpdGx5IGZvcmJpZGRlbiBhdHRyaWJ1dGVzIChvdmVycmlkZXMgQUxMT1dFRF9BVFRSL0FERF9BVFRSKSAqL1xuICBsZXQgRk9SQklEX0FUVFIgPSBudWxsO1xuXG4gIC8qIENvbmZpZyBvYmplY3QgdG8gc3RvcmUgQUREX1RBR1MvQUREX0FUVFIgZnVuY3Rpb25zICh3aGVuIHVzZWQgYXMgZnVuY3Rpb25zKSAqL1xuICBjb25zdCBFWFRSQV9FTEVNRU5UX0hBTkRMSU5HID0gT2JqZWN0LnNlYWwoXG4gICAgY3JlYXRlKG51bGwsIHtcbiAgICAgIHRhZ0NoZWNrOiB7XG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogbnVsbCxcbiAgICAgIH0sXG4gICAgICBhdHRyaWJ1dGVDaGVjazoge1xuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IG51bGwsXG4gICAgICB9LFxuICAgIH0pXG4gICk7XG5cbiAgLyogRGVjaWRlIGlmIEFSSUEgYXR0cmlidXRlcyBhcmUgb2theSAqL1xuICBsZXQgQUxMT1dfQVJJQV9BVFRSID0gdHJ1ZTtcblxuICAvKiBEZWNpZGUgaWYgY3VzdG9tIGRhdGEgYXR0cmlidXRlcyBhcmUgb2theSAqL1xuICBsZXQgQUxMT1dfREFUQV9BVFRSID0gdHJ1ZTtcblxuICAvKiBEZWNpZGUgaWYgdW5rbm93biBwcm90b2NvbHMgYXJlIG9rYXkgKi9cbiAgbGV0IEFMTE9XX1VOS05PV05fUFJPVE9DT0xTID0gZmFsc2U7XG5cbiAgLyogRGVjaWRlIGlmIHNlbGYtY2xvc2luZyB0YWdzIGluIGF0dHJpYnV0ZXMgYXJlIGFsbG93ZWQuXG4gICAqIFVzdWFsbHkgcmVtb3ZlZCBkdWUgdG8gYSBtWFNTIGlzc3VlIGluIGpRdWVyeSAzLjAgKi9cbiAgbGV0IEFMTE9XX1NFTEZfQ0xPU0VfSU5fQVRUUiA9IHRydWU7XG5cbiAgLyogT3V0cHV0IHNob3VsZCBiZSBzYWZlIGZvciBjb21tb24gdGVtcGxhdGUgZW5naW5lcy5cbiAgICogVGhpcyBtZWFucywgRE9NUHVyaWZ5IHJlbW92ZXMgZGF0YSBhdHRyaWJ1dGVzLCBtdXN0YWNoZXMgYW5kIEVSQlxuICAgKi9cbiAgbGV0IFNBRkVfRk9SX1RFTVBMQVRFUyA9IGZhbHNlO1xuXG4gIC8qIE91dHB1dCBzaG91bGQgYmUgc2FmZSBldmVuIGZvciBYTUwgdXNlZCB3aXRoaW4gSFRNTCBhbmQgYWxpa2UuXG4gICAqIFRoaXMgbWVhbnMsIERPTVB1cmlmeSByZW1vdmVzIGNvbW1lbnRzIHdoZW4gY29udGFpbmluZyByaXNreSBjb250ZW50LlxuICAgKi9cbiAgbGV0IFNBRkVfRk9SX1hNTCA9IHRydWU7XG5cbiAgLyogRGVjaWRlIGlmIGRvY3VtZW50IHdpdGggPGh0bWw+Li4uIHNob3VsZCBiZSByZXR1cm5lZCAqL1xuICBsZXQgV0hPTEVfRE9DVU1FTlQgPSBmYWxzZTtcblxuICAvKiBUcmFjayB3aGV0aGVyIGNvbmZpZyBpcyBhbHJlYWR5IHNldCBvbiB0aGlzIGluc3RhbmNlIG9mIERPTVB1cmlmeS4gKi9cbiAgbGV0IFNFVF9DT05GSUcgPSBmYWxzZTtcblxuICAvKiBEZWNpZGUgaWYgYWxsIGVsZW1lbnRzIChlLmcuIHN0eWxlLCBzY3JpcHQpIG11c3QgYmUgY2hpbGRyZW4gb2ZcbiAgICogZG9jdW1lbnQuYm9keS4gQnkgZGVmYXVsdCwgYnJvd3NlcnMgbWlnaHQgbW92ZSB0aGVtIHRvIGRvY3VtZW50LmhlYWQgKi9cbiAgbGV0IEZPUkNFX0JPRFkgPSBmYWxzZTtcblxuICAvKiBEZWNpZGUgaWYgYSBET00gYEhUTUxCb2R5RWxlbWVudGAgc2hvdWxkIGJlIHJldHVybmVkLCBpbnN0ZWFkIG9mIGEgaHRtbFxuICAgKiBzdHJpbmcgKG9yIGEgVHJ1c3RlZEhUTUwgb2JqZWN0IGlmIFRydXN0ZWQgVHlwZXMgYXJlIHN1cHBvcnRlZCkuXG4gICAqIElmIGBXSE9MRV9ET0NVTUVOVGAgaXMgZW5hYmxlZCBhIGBIVE1MSHRtbEVsZW1lbnRgIHdpbGwgYmUgcmV0dXJuZWQgaW5zdGVhZFxuICAgKi9cbiAgbGV0IFJFVFVSTl9ET00gPSBmYWxzZTtcblxuICAvKiBEZWNpZGUgaWYgYSBET00gYERvY3VtZW50RnJhZ21lbnRgIHNob3VsZCBiZSByZXR1cm5lZCwgaW5zdGVhZCBvZiBhIGh0bWxcbiAgICogc3RyaW5nICAob3IgYSBUcnVzdGVkSFRNTCBvYmplY3QgaWYgVHJ1c3RlZCBUeXBlcyBhcmUgc3VwcG9ydGVkKSAqL1xuICBsZXQgUkVUVVJOX0RPTV9GUkFHTUVOVCA9IGZhbHNlO1xuXG4gIC8qIFRyeSB0byByZXR1cm4gYSBUcnVzdGVkIFR5cGUgb2JqZWN0IGluc3RlYWQgb2YgYSBzdHJpbmcsIHJldHVybiBhIHN0cmluZyBpblxuICAgKiBjYXNlIFRydXN0ZWQgVHlwZXMgYXJlIG5vdCBzdXBwb3J0ZWQgICovXG4gIGxldCBSRVRVUk5fVFJVU1RFRF9UWVBFID0gZmFsc2U7XG5cbiAgLyogT3V0cHV0IHNob3VsZCBiZSBmcmVlIGZyb20gRE9NIGNsb2JiZXJpbmcgYXR0YWNrcz9cbiAgICogVGhpcyBzYW5pdGl6ZXMgbWFya3VwcyBuYW1lZCB3aXRoIGNvbGxpZGluZywgY2xvYmJlcmFibGUgYnVpbHQtaW4gRE9NIEFQSXMuXG4gICAqL1xuICBsZXQgU0FOSVRJWkVfRE9NID0gdHJ1ZTtcblxuICAvKiBBY2hpZXZlIGZ1bGwgRE9NIENsb2JiZXJpbmcgcHJvdGVjdGlvbiBieSBpc29sYXRpbmcgdGhlIG5hbWVzcGFjZSBvZiBuYW1lZFxuICAgKiBwcm9wZXJ0aWVzIGFuZCBKUyB2YXJpYWJsZXMsIG1pdGlnYXRpbmcgYXR0YWNrcyB0aGF0IGFidXNlIHRoZSBIVE1ML0RPTSBzcGVjIHJ1bGVzLlxuICAgKlxuICAgKiBIVE1ML0RPTSBzcGVjIHJ1bGVzIHRoYXQgZW5hYmxlIERPTSBDbG9iYmVyaW5nOlxuICAgKiAgIC0gTmFtZWQgQWNjZXNzIG9uIFdpbmRvdyAowqc3LjMuMylcbiAgICogICAtIERPTSBUcmVlIEFjY2Vzc29ycyAowqczLjEuNSlcbiAgICogICAtIEZvcm0gRWxlbWVudCBQYXJlbnQtQ2hpbGQgUmVsYXRpb25zICjCpzQuMTAuMylcbiAgICogICAtIElmcmFtZSBzcmNkb2MgLyBOZXN0ZWQgV2luZG93UHJveGllcyAowqc0LjguNSlcbiAgICogICAtIEhUTUxDb2xsZWN0aW9uICjCpzQuMi4xMC4yKVxuICAgKlxuICAgKiBOYW1lc3BhY2UgaXNvbGF0aW9uIGlzIGltcGxlbWVudGVkIGJ5IHByZWZpeGluZyBgaWRgIGFuZCBgbmFtZWAgYXR0cmlidXRlc1xuICAgKiB3aXRoIGEgY29uc3RhbnQgc3RyaW5nLCBpLmUuLCBgdXNlci1jb250ZW50LWBcbiAgICovXG4gIGxldCBTQU5JVElaRV9OQU1FRF9QUk9QUyA9IGZhbHNlO1xuICBjb25zdCBTQU5JVElaRV9OQU1FRF9QUk9QU19QUkVGSVggPSAndXNlci1jb250ZW50LSc7XG5cbiAgLyogS2VlcCBlbGVtZW50IGNvbnRlbnQgd2hlbiByZW1vdmluZyBlbGVtZW50PyAqL1xuICBsZXQgS0VFUF9DT05URU5UID0gdHJ1ZTtcblxuICAvKiBJZiBhIGBOb2RlYCBpcyBwYXNzZWQgdG8gc2FuaXRpemUoKSwgdGhlbiBwZXJmb3JtcyBzYW5pdGl6YXRpb24gaW4tcGxhY2UgaW5zdGVhZFxuICAgKiBvZiBpbXBvcnRpbmcgaXQgaW50byBhIG5ldyBEb2N1bWVudCBhbmQgcmV0dXJuaW5nIGEgc2FuaXRpemVkIGNvcHkgKi9cbiAgbGV0IElOX1BMQUNFID0gZmFsc2U7XG5cbiAgLyogQWxsb3cgdXNhZ2Ugb2YgcHJvZmlsZXMgbGlrZSBodG1sLCBzdmcgYW5kIG1hdGhNbCAqL1xuICBsZXQgVVNFX1BST0ZJTEVTOiBVc2VQcm9maWxlc0NvbmZpZyB8IGZhbHNlID0ge307XG5cbiAgLyogVGFncyB0byBpZ25vcmUgY29udGVudCBvZiB3aGVuIEtFRVBfQ09OVEVOVCBpcyB0cnVlICovXG4gIGxldCBGT1JCSURfQ09OVEVOVFMgPSBudWxsO1xuICBjb25zdCBERUZBVUxUX0ZPUkJJRF9DT05URU5UUyA9IGFkZFRvU2V0KHt9LCBbXG4gICAgJ2Fubm90YXRpb24teG1sJyxcbiAgICAnYXVkaW8nLFxuICAgICdjb2xncm91cCcsXG4gICAgJ2Rlc2MnLFxuICAgICdmb3JlaWdub2JqZWN0JyxcbiAgICAnaGVhZCcsXG4gICAgJ2lmcmFtZScsXG4gICAgJ21hdGgnLFxuICAgICdtaScsXG4gICAgJ21uJyxcbiAgICAnbW8nLFxuICAgICdtcycsXG4gICAgJ210ZXh0JyxcbiAgICAnbm9lbWJlZCcsXG4gICAgJ25vZnJhbWVzJyxcbiAgICAnbm9zY3JpcHQnLFxuICAgICdwbGFpbnRleHQnLFxuICAgICdzY3JpcHQnLFxuICAgICdzdHlsZScsXG4gICAgJ3N2ZycsXG4gICAgJ3RlbXBsYXRlJyxcbiAgICAndGhlYWQnLFxuICAgICd0aXRsZScsXG4gICAgJ3ZpZGVvJyxcbiAgICAneG1wJyxcbiAgXSk7XG5cbiAgLyogVGFncyB0aGF0IGFyZSBzYWZlIGZvciBkYXRhOiBVUklzICovXG4gIGxldCBEQVRBX1VSSV9UQUdTID0gbnVsbDtcbiAgY29uc3QgREVGQVVMVF9EQVRBX1VSSV9UQUdTID0gYWRkVG9TZXQoe30sIFtcbiAgICAnYXVkaW8nLFxuICAgICd2aWRlbycsXG4gICAgJ2ltZycsXG4gICAgJ3NvdXJjZScsXG4gICAgJ2ltYWdlJyxcbiAgICAndHJhY2snLFxuICBdKTtcblxuICAvKiBBdHRyaWJ1dGVzIHNhZmUgZm9yIHZhbHVlcyBsaWtlIFwiamF2YXNjcmlwdDpcIiAqL1xuICBsZXQgVVJJX1NBRkVfQVRUUklCVVRFUyA9IG51bGw7XG4gIGNvbnN0IERFRkFVTFRfVVJJX1NBRkVfQVRUUklCVVRFUyA9IGFkZFRvU2V0KHt9LCBbXG4gICAgJ2FsdCcsXG4gICAgJ2NsYXNzJyxcbiAgICAnZm9yJyxcbiAgICAnaWQnLFxuICAgICdsYWJlbCcsXG4gICAgJ25hbWUnLFxuICAgICdwYXR0ZXJuJyxcbiAgICAncGxhY2Vob2xkZXInLFxuICAgICdyb2xlJyxcbiAgICAnc3VtbWFyeScsXG4gICAgJ3RpdGxlJyxcbiAgICAndmFsdWUnLFxuICAgICdzdHlsZScsXG4gICAgJ3htbG5zJyxcbiAgXSk7XG5cbiAgY29uc3QgTUFUSE1MX05BTUVTUEFDRSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MJztcbiAgY29uc3QgU1ZHX05BTUVTUEFDRSA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc7XG4gIGNvbnN0IEhUTUxfTkFNRVNQQUNFID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnO1xuICAvKiBEb2N1bWVudCBuYW1lc3BhY2UgKi9cbiAgbGV0IE5BTUVTUEFDRSA9IEhUTUxfTkFNRVNQQUNFO1xuICBsZXQgSVNfRU1QVFlfSU5QVVQgPSBmYWxzZTtcblxuICAvKiBBbGxvd2VkIFhIVE1MK1hNTCBuYW1lc3BhY2VzICovXG4gIGxldCBBTExPV0VEX05BTUVTUEFDRVMgPSBudWxsO1xuICBjb25zdCBERUZBVUxUX0FMTE9XRURfTkFNRVNQQUNFUyA9IGFkZFRvU2V0KFxuICAgIHt9LFxuICAgIFtNQVRITUxfTkFNRVNQQUNFLCBTVkdfTkFNRVNQQUNFLCBIVE1MX05BTUVTUEFDRV0sXG4gICAgc3RyaW5nVG9TdHJpbmdcbiAgKTtcblxuICBsZXQgTUFUSE1MX1RFWFRfSU5URUdSQVRJT05fUE9JTlRTID0gYWRkVG9TZXQoe30sIFtcbiAgICAnbWknLFxuICAgICdtbycsXG4gICAgJ21uJyxcbiAgICAnbXMnLFxuICAgICdtdGV4dCcsXG4gIF0pO1xuXG4gIGxldCBIVE1MX0lOVEVHUkFUSU9OX1BPSU5UUyA9IGFkZFRvU2V0KHt9LCBbJ2Fubm90YXRpb24teG1sJ10pO1xuXG4gIC8vIENlcnRhaW4gZWxlbWVudHMgYXJlIGFsbG93ZWQgaW4gYm90aCBTVkcgYW5kIEhUTUxcbiAgLy8gbmFtZXNwYWNlLiBXZSBuZWVkIHRvIHNwZWNpZnkgdGhlbSBleHBsaWNpdGx5XG4gIC8vIHNvIHRoYXQgdGhleSBkb24ndCBnZXQgZXJyb25lb3VzbHkgZGVsZXRlZCBmcm9tXG4gIC8vIEhUTUwgbmFtZXNwYWNlLlxuICBjb25zdCBDT01NT05fU1ZHX0FORF9IVE1MX0VMRU1FTlRTID0gYWRkVG9TZXQoe30sIFtcbiAgICAndGl0bGUnLFxuICAgICdzdHlsZScsXG4gICAgJ2ZvbnQnLFxuICAgICdhJyxcbiAgICAnc2NyaXB0JyxcbiAgXSk7XG5cbiAgLyogUGFyc2luZyBvZiBzdHJpY3QgWEhUTUwgZG9jdW1lbnRzICovXG4gIGxldCBQQVJTRVJfTUVESUFfVFlQRTogbnVsbCB8IERPTVBhcnNlclN1cHBvcnRlZFR5cGUgPSBudWxsO1xuICBjb25zdCBTVVBQT1JURURfUEFSU0VSX01FRElBX1RZUEVTID0gWydhcHBsaWNhdGlvbi94aHRtbCt4bWwnLCAndGV4dC9odG1sJ107XG4gIGNvbnN0IERFRkFVTFRfUEFSU0VSX01FRElBX1RZUEUgPSAndGV4dC9odG1sJztcbiAgbGV0IHRyYW5zZm9ybUNhc2VGdW5jOiBudWxsIHwgUGFyYW1ldGVyczx0eXBlb2YgYWRkVG9TZXQ+WzJdID0gbnVsbDtcblxuICAvKiBLZWVwIGEgcmVmZXJlbmNlIHRvIGNvbmZpZyB0byBwYXNzIHRvIGhvb2tzICovXG4gIGxldCBDT05GSUc6IENvbmZpZyB8IG51bGwgPSBudWxsO1xuXG4gIC8qIElkZWFsbHksIGRvIG5vdCB0b3VjaCBhbnl0aGluZyBiZWxvdyB0aGlzIGxpbmUgKi9cbiAgLyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqL1xuXG4gIGNvbnN0IGZvcm1FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZm9ybScpO1xuXG4gIGNvbnN0IGlzUmVnZXhPckZ1bmN0aW9uID0gZnVuY3Rpb24gKFxuICAgIHRlc3RWYWx1ZTogdW5rbm93blxuICApOiB0ZXN0VmFsdWUgaXMgRnVuY3Rpb24gfCBSZWdFeHAge1xuICAgIHJldHVybiB0ZXN0VmFsdWUgaW5zdGFuY2VvZiBSZWdFeHAgfHwgdGVzdFZhbHVlIGluc3RhbmNlb2YgRnVuY3Rpb247XG4gIH07XG5cbiAgLyoqXG4gICAqIF9wYXJzZUNvbmZpZ1xuICAgKlxuICAgKiBAcGFyYW0gY2ZnIG9wdGlvbmFsIGNvbmZpZyBsaXRlcmFsXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuICBjb25zdCBfcGFyc2VDb25maWcgPSBmdW5jdGlvbiAoY2ZnOiBDb25maWcgPSB7fSk6IHZvaWQge1xuICAgIGlmIChDT05GSUcgJiYgQ09ORklHID09PSBjZmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvKiBTaGllbGQgY29uZmlndXJhdGlvbiBvYmplY3QgZnJvbSB0YW1wZXJpbmcgKi9cbiAgICBpZiAoIWNmZyB8fCB0eXBlb2YgY2ZnICE9PSAnb2JqZWN0Jykge1xuICAgICAgY2ZnID0ge307XG4gICAgfVxuXG4gICAgLyogU2hpZWxkIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGZyb20gcHJvdG90eXBlIHBvbGx1dGlvbiAqL1xuICAgIGNmZyA9IGNsb25lKGNmZyk7XG5cbiAgICBQQVJTRVJfTUVESUFfVFlQRSA9XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9wcmVmZXItaW5jbHVkZXNcbiAgICAgIFNVUFBPUlRFRF9QQVJTRVJfTUVESUFfVFlQRVMuaW5kZXhPZihjZmcuUEFSU0VSX01FRElBX1RZUEUpID09PSAtMVxuICAgICAgICA/IERFRkFVTFRfUEFSU0VSX01FRElBX1RZUEVcbiAgICAgICAgOiBjZmcuUEFSU0VSX01FRElBX1RZUEU7XG5cbiAgICAvLyBIVE1MIHRhZ3MgYW5kIGF0dHJpYnV0ZXMgYXJlIG5vdCBjYXNlLXNlbnNpdGl2ZSwgY29udmVydGluZyB0byBsb3dlcmNhc2UuIEtlZXBpbmcgWEhUTUwgYXMgaXMuXG4gICAgdHJhbnNmb3JtQ2FzZUZ1bmMgPVxuICAgICAgUEFSU0VSX01FRElBX1RZUEUgPT09ICdhcHBsaWNhdGlvbi94aHRtbCt4bWwnXG4gICAgICAgID8gc3RyaW5nVG9TdHJpbmdcbiAgICAgICAgOiBzdHJpbmdUb0xvd2VyQ2FzZTtcblxuICAgIC8qIFNldCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgKi9cbiAgICBBTExPV0VEX1RBR1MgPSBvYmplY3RIYXNPd25Qcm9wZXJ0eShjZmcsICdBTExPV0VEX1RBR1MnKVxuICAgICAgPyBhZGRUb1NldCh7fSwgY2ZnLkFMTE9XRURfVEFHUywgdHJhbnNmb3JtQ2FzZUZ1bmMpXG4gICAgICA6IERFRkFVTFRfQUxMT1dFRF9UQUdTO1xuICAgIEFMTE9XRURfQVRUUiA9IG9iamVjdEhhc093blByb3BlcnR5KGNmZywgJ0FMTE9XRURfQVRUUicpXG4gICAgICA/IGFkZFRvU2V0KHt9LCBjZmcuQUxMT1dFRF9BVFRSLCB0cmFuc2Zvcm1DYXNlRnVuYylcbiAgICAgIDogREVGQVVMVF9BTExPV0VEX0FUVFI7XG4gICAgQUxMT1dFRF9OQU1FU1BBQ0VTID0gb2JqZWN0SGFzT3duUHJvcGVydHkoY2ZnLCAnQUxMT1dFRF9OQU1FU1BBQ0VTJylcbiAgICAgID8gYWRkVG9TZXQoe30sIGNmZy5BTExPV0VEX05BTUVTUEFDRVMsIHN0cmluZ1RvU3RyaW5nKVxuICAgICAgOiBERUZBVUxUX0FMTE9XRURfTkFNRVNQQUNFUztcbiAgICBVUklfU0FGRV9BVFRSSUJVVEVTID0gb2JqZWN0SGFzT3duUHJvcGVydHkoY2ZnLCAnQUREX1VSSV9TQUZFX0FUVFInKVxuICAgICAgPyBhZGRUb1NldChcbiAgICAgICAgICBjbG9uZShERUZBVUxUX1VSSV9TQUZFX0FUVFJJQlVURVMpLFxuICAgICAgICAgIGNmZy5BRERfVVJJX1NBRkVfQVRUUixcbiAgICAgICAgICB0cmFuc2Zvcm1DYXNlRnVuY1xuICAgICAgICApXG4gICAgICA6IERFRkFVTFRfVVJJX1NBRkVfQVRUUklCVVRFUztcbiAgICBEQVRBX1VSSV9UQUdTID0gb2JqZWN0SGFzT3duUHJvcGVydHkoY2ZnLCAnQUREX0RBVEFfVVJJX1RBR1MnKVxuICAgICAgPyBhZGRUb1NldChcbiAgICAgICAgICBjbG9uZShERUZBVUxUX0RBVEFfVVJJX1RBR1MpLFxuICAgICAgICAgIGNmZy5BRERfREFUQV9VUklfVEFHUyxcbiAgICAgICAgICB0cmFuc2Zvcm1DYXNlRnVuY1xuICAgICAgICApXG4gICAgICA6IERFRkFVTFRfREFUQV9VUklfVEFHUztcbiAgICBGT1JCSURfQ09OVEVOVFMgPSBvYmplY3RIYXNPd25Qcm9wZXJ0eShjZmcsICdGT1JCSURfQ09OVEVOVFMnKVxuICAgICAgPyBhZGRUb1NldCh7fSwgY2ZnLkZPUkJJRF9DT05URU5UUywgdHJhbnNmb3JtQ2FzZUZ1bmMpXG4gICAgICA6IERFRkFVTFRfRk9SQklEX0NPTlRFTlRTO1xuICAgIEZPUkJJRF9UQUdTID0gb2JqZWN0SGFzT3duUHJvcGVydHkoY2ZnLCAnRk9SQklEX1RBR1MnKVxuICAgICAgPyBhZGRUb1NldCh7fSwgY2ZnLkZPUkJJRF9UQUdTLCB0cmFuc2Zvcm1DYXNlRnVuYylcbiAgICAgIDogY2xvbmUoe30pO1xuICAgIEZPUkJJRF9BVFRSID0gb2JqZWN0SGFzT3duUHJvcGVydHkoY2ZnLCAnRk9SQklEX0FUVFInKVxuICAgICAgPyBhZGRUb1NldCh7fSwgY2ZnLkZPUkJJRF9BVFRSLCB0cmFuc2Zvcm1DYXNlRnVuYylcbiAgICAgIDogY2xvbmUoe30pO1xuICAgIFVTRV9QUk9GSUxFUyA9IG9iamVjdEhhc093blByb3BlcnR5KGNmZywgJ1VTRV9QUk9GSUxFUycpXG4gICAgICA/IGNmZy5VU0VfUFJPRklMRVNcbiAgICAgIDogZmFsc2U7XG4gICAgQUxMT1dfQVJJQV9BVFRSID0gY2ZnLkFMTE9XX0FSSUFfQVRUUiAhPT0gZmFsc2U7IC8vIERlZmF1bHQgdHJ1ZVxuICAgIEFMTE9XX0RBVEFfQVRUUiA9IGNmZy5BTExPV19EQVRBX0FUVFIgIT09IGZhbHNlOyAvLyBEZWZhdWx0IHRydWVcbiAgICBBTExPV19VTktOT1dOX1BST1RPQ09MUyA9IGNmZy5BTExPV19VTktOT1dOX1BST1RPQ09MUyB8fCBmYWxzZTsgLy8gRGVmYXVsdCBmYWxzZVxuICAgIEFMTE9XX1NFTEZfQ0xPU0VfSU5fQVRUUiA9IGNmZy5BTExPV19TRUxGX0NMT1NFX0lOX0FUVFIgIT09IGZhbHNlOyAvLyBEZWZhdWx0IHRydWVcbiAgICBTQUZFX0ZPUl9URU1QTEFURVMgPSBjZmcuU0FGRV9GT1JfVEVNUExBVEVTIHx8IGZhbHNlOyAvLyBEZWZhdWx0IGZhbHNlXG4gICAgU0FGRV9GT1JfWE1MID0gY2ZnLlNBRkVfRk9SX1hNTCAhPT0gZmFsc2U7IC8vIERlZmF1bHQgdHJ1ZVxuICAgIFdIT0xFX0RPQ1VNRU5UID0gY2ZnLldIT0xFX0RPQ1VNRU5UIHx8IGZhbHNlOyAvLyBEZWZhdWx0IGZhbHNlXG4gICAgUkVUVVJOX0RPTSA9IGNmZy5SRVRVUk5fRE9NIHx8IGZhbHNlOyAvLyBEZWZhdWx0IGZhbHNlXG4gICAgUkVUVVJOX0RPTV9GUkFHTUVOVCA9IGNmZy5SRVRVUk5fRE9NX0ZSQUdNRU5UIHx8IGZhbHNlOyAvLyBEZWZhdWx0IGZhbHNlXG4gICAgUkVUVVJOX1RSVVNURURfVFlQRSA9IGNmZy5SRVRVUk5fVFJVU1RFRF9UWVBFIHx8IGZhbHNlOyAvLyBEZWZhdWx0IGZhbHNlXG4gICAgRk9SQ0VfQk9EWSA9IGNmZy5GT1JDRV9CT0RZIHx8IGZhbHNlOyAvLyBEZWZhdWx0IGZhbHNlXG4gICAgU0FOSVRJWkVfRE9NID0gY2ZnLlNBTklUSVpFX0RPTSAhPT0gZmFsc2U7IC8vIERlZmF1bHQgdHJ1ZVxuICAgIFNBTklUSVpFX05BTUVEX1BST1BTID0gY2ZnLlNBTklUSVpFX05BTUVEX1BST1BTIHx8IGZhbHNlOyAvLyBEZWZhdWx0IGZhbHNlXG4gICAgS0VFUF9DT05URU5UID0gY2ZnLktFRVBfQ09OVEVOVCAhPT0gZmFsc2U7IC8vIERlZmF1bHQgdHJ1ZVxuICAgIElOX1BMQUNFID0gY2ZnLklOX1BMQUNFIHx8IGZhbHNlOyAvLyBEZWZhdWx0IGZhbHNlXG4gICAgSVNfQUxMT1dFRF9VUkkgPSBjZmcuQUxMT1dFRF9VUklfUkVHRVhQIHx8IEVYUFJFU1NJT05TLklTX0FMTE9XRURfVVJJO1xuICAgIE5BTUVTUEFDRSA9IGNmZy5OQU1FU1BBQ0UgfHwgSFRNTF9OQU1FU1BBQ0U7XG4gICAgTUFUSE1MX1RFWFRfSU5URUdSQVRJT05fUE9JTlRTID1cbiAgICAgIGNmZy5NQVRITUxfVEVYVF9JTlRFR1JBVElPTl9QT0lOVFMgfHwgTUFUSE1MX1RFWFRfSU5URUdSQVRJT05fUE9JTlRTO1xuICAgIEhUTUxfSU5URUdSQVRJT05fUE9JTlRTID1cbiAgICAgIGNmZy5IVE1MX0lOVEVHUkFUSU9OX1BPSU5UUyB8fCBIVE1MX0lOVEVHUkFUSU9OX1BPSU5UUztcblxuICAgIENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HID0gY2ZnLkNVU1RPTV9FTEVNRU5UX0hBTkRMSU5HIHx8IHt9O1xuICAgIGlmIChcbiAgICAgIGNmZy5DVVNUT01fRUxFTUVOVF9IQU5ETElORyAmJlxuICAgICAgaXNSZWdleE9yRnVuY3Rpb24oY2ZnLkNVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVjaylcbiAgICApIHtcbiAgICAgIENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVjayA9XG4gICAgICAgIGNmZy5DVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2s7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgY2ZnLkNVU1RPTV9FTEVNRU5UX0hBTkRMSU5HICYmXG4gICAgICBpc1JlZ2V4T3JGdW5jdGlvbihjZmcuQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcuYXR0cmlidXRlTmFtZUNoZWNrKVxuICAgICkge1xuICAgICAgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcuYXR0cmlidXRlTmFtZUNoZWNrID1cbiAgICAgICAgY2ZnLkNVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLmF0dHJpYnV0ZU5hbWVDaGVjaztcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBjZmcuQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcgJiZcbiAgICAgIHR5cGVvZiBjZmcuQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcuYWxsb3dDdXN0b21pemVkQnVpbHRJbkVsZW1lbnRzID09PVxuICAgICAgICAnYm9vbGVhbidcbiAgICApIHtcbiAgICAgIENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLmFsbG93Q3VzdG9taXplZEJ1aWx0SW5FbGVtZW50cyA9XG4gICAgICAgIGNmZy5DVVNUT01fRUxFTUVOVF9IQU5ETElORy5hbGxvd0N1c3RvbWl6ZWRCdWlsdEluRWxlbWVudHM7XG4gICAgfVxuXG4gICAgaWYgKFNBRkVfRk9SX1RFTVBMQVRFUykge1xuICAgICAgQUxMT1dfREFUQV9BVFRSID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKFJFVFVSTl9ET01fRlJBR01FTlQpIHtcbiAgICAgIFJFVFVSTl9ET00gPSB0cnVlO1xuICAgIH1cblxuICAgIC8qIFBhcnNlIHByb2ZpbGUgaW5mbyAqL1xuICAgIGlmIChVU0VfUFJPRklMRVMpIHtcbiAgICAgIEFMTE9XRURfVEFHUyA9IGFkZFRvU2V0KHt9LCBUQUdTLnRleHQpO1xuICAgICAgQUxMT1dFRF9BVFRSID0gY3JlYXRlKG51bGwpO1xuICAgICAgaWYgKFVTRV9QUk9GSUxFUy5odG1sID09PSB0cnVlKSB7XG4gICAgICAgIGFkZFRvU2V0KEFMTE9XRURfVEFHUywgVEFHUy5odG1sKTtcbiAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9BVFRSLCBBVFRSUy5odG1sKTtcbiAgICAgIH1cblxuICAgICAgaWYgKFVTRV9QUk9GSUxFUy5zdmcgPT09IHRydWUpIHtcbiAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9UQUdTLCBUQUdTLnN2Zyk7XG4gICAgICAgIGFkZFRvU2V0KEFMTE9XRURfQVRUUiwgQVRUUlMuc3ZnKTtcbiAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9BVFRSLCBBVFRSUy54bWwpO1xuICAgICAgfVxuXG4gICAgICBpZiAoVVNFX1BST0ZJTEVTLnN2Z0ZpbHRlcnMgPT09IHRydWUpIHtcbiAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9UQUdTLCBUQUdTLnN2Z0ZpbHRlcnMpO1xuICAgICAgICBhZGRUb1NldChBTExPV0VEX0FUVFIsIEFUVFJTLnN2Zyk7XG4gICAgICAgIGFkZFRvU2V0KEFMTE9XRURfQVRUUiwgQVRUUlMueG1sKTtcbiAgICAgIH1cblxuICAgICAgaWYgKFVTRV9QUk9GSUxFUy5tYXRoTWwgPT09IHRydWUpIHtcbiAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9UQUdTLCBUQUdTLm1hdGhNbCk7XG4gICAgICAgIGFkZFRvU2V0KEFMTE9XRURfQVRUUiwgQVRUUlMubWF0aE1sKTtcbiAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9BVFRSLCBBVFRSUy54bWwpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qIFByZXZlbnQgZnVuY3Rpb24tYmFzZWQgQUREX0FUVFIgLyBBRERfVEFHUyBmcm9tIGxlYWtpbmcgYWNyb3NzIGNhbGxzICovXG4gICAgaWYgKCFvYmplY3RIYXNPd25Qcm9wZXJ0eShjZmcsICdBRERfVEFHUycpKSB7XG4gICAgICBFWFRSQV9FTEVNRU5UX0hBTkRMSU5HLnRhZ0NoZWNrID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoIW9iamVjdEhhc093blByb3BlcnR5KGNmZywgJ0FERF9BVFRSJykpIHtcbiAgICAgIEVYVFJBX0VMRU1FTlRfSEFORExJTkcuYXR0cmlidXRlQ2hlY2sgPSBudWxsO1xuICAgIH1cblxuICAgIC8qIE1lcmdlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyAqL1xuICAgIGlmIChjZmcuQUREX1RBR1MpIHtcbiAgICAgIGlmICh0eXBlb2YgY2ZnLkFERF9UQUdTID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIEVYVFJBX0VMRU1FTlRfSEFORExJTkcudGFnQ2hlY2sgPSBjZmcuQUREX1RBR1M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoQUxMT1dFRF9UQUdTID09PSBERUZBVUxUX0FMTE9XRURfVEFHUykge1xuICAgICAgICAgIEFMTE9XRURfVEFHUyA9IGNsb25lKEFMTE9XRURfVEFHUyk7XG4gICAgICAgIH1cblxuICAgICAgICBhZGRUb1NldChBTExPV0VEX1RBR1MsIGNmZy5BRERfVEFHUywgdHJhbnNmb3JtQ2FzZUZ1bmMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjZmcuQUREX0FUVFIpIHtcbiAgICAgIGlmICh0eXBlb2YgY2ZnLkFERF9BVFRSID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIEVYVFJBX0VMRU1FTlRfSEFORExJTkcuYXR0cmlidXRlQ2hlY2sgPSBjZmcuQUREX0FUVFI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoQUxMT1dFRF9BVFRSID09PSBERUZBVUxUX0FMTE9XRURfQVRUUikge1xuICAgICAgICAgIEFMTE9XRURfQVRUUiA9IGNsb25lKEFMTE9XRURfQVRUUik7XG4gICAgICAgIH1cblxuICAgICAgICBhZGRUb1NldChBTExPV0VEX0FUVFIsIGNmZy5BRERfQVRUUiwgdHJhbnNmb3JtQ2FzZUZ1bmMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjZmcuQUREX1VSSV9TQUZFX0FUVFIpIHtcbiAgICAgIGFkZFRvU2V0KFVSSV9TQUZFX0FUVFJJQlVURVMsIGNmZy5BRERfVVJJX1NBRkVfQVRUUiwgdHJhbnNmb3JtQ2FzZUZ1bmMpO1xuICAgIH1cblxuICAgIGlmIChjZmcuRk9SQklEX0NPTlRFTlRTKSB7XG4gICAgICBpZiAoRk9SQklEX0NPTlRFTlRTID09PSBERUZBVUxUX0ZPUkJJRF9DT05URU5UUykge1xuICAgICAgICBGT1JCSURfQ09OVEVOVFMgPSBjbG9uZShGT1JCSURfQ09OVEVOVFMpO1xuICAgICAgfVxuXG4gICAgICBhZGRUb1NldChGT1JCSURfQ09OVEVOVFMsIGNmZy5GT1JCSURfQ09OVEVOVFMsIHRyYW5zZm9ybUNhc2VGdW5jKTtcbiAgICB9XG5cbiAgICBpZiAoY2ZnLkFERF9GT1JCSURfQ09OVEVOVFMpIHtcbiAgICAgIGlmIChGT1JCSURfQ09OVEVOVFMgPT09IERFRkFVTFRfRk9SQklEX0NPTlRFTlRTKSB7XG4gICAgICAgIEZPUkJJRF9DT05URU5UUyA9IGNsb25lKEZPUkJJRF9DT05URU5UUyk7XG4gICAgICB9XG5cbiAgICAgIGFkZFRvU2V0KEZPUkJJRF9DT05URU5UUywgY2ZnLkFERF9GT1JCSURfQ09OVEVOVFMsIHRyYW5zZm9ybUNhc2VGdW5jKTtcbiAgICB9XG5cbiAgICAvKiBBZGQgI3RleHQgaW4gY2FzZSBLRUVQX0NPTlRFTlQgaXMgc2V0IHRvIHRydWUgKi9cbiAgICBpZiAoS0VFUF9DT05URU5UKSB7XG4gICAgICBBTExPV0VEX1RBR1NbJyN0ZXh0J10gPSB0cnVlO1xuICAgIH1cblxuICAgIC8qIEFkZCBodG1sLCBoZWFkIGFuZCBib2R5IHRvIEFMTE9XRURfVEFHUyBpbiBjYXNlIFdIT0xFX0RPQ1VNRU5UIGlzIHRydWUgKi9cbiAgICBpZiAoV0hPTEVfRE9DVU1FTlQpIHtcbiAgICAgIGFkZFRvU2V0KEFMTE9XRURfVEFHUywgWydodG1sJywgJ2hlYWQnLCAnYm9keSddKTtcbiAgICB9XG5cbiAgICAvKiBBZGQgdGJvZHkgdG8gQUxMT1dFRF9UQUdTIGluIGNhc2UgdGFibGVzIGFyZSBwZXJtaXR0ZWQsIHNlZSAjMjg2LCAjMzY1ICovXG4gICAgaWYgKEFMTE9XRURfVEFHUy50YWJsZSkge1xuICAgICAgYWRkVG9TZXQoQUxMT1dFRF9UQUdTLCBbJ3Rib2R5J10pO1xuICAgICAgZGVsZXRlIEZPUkJJRF9UQUdTLnRib2R5O1xuICAgIH1cblxuICAgIGlmIChjZmcuVFJVU1RFRF9UWVBFU19QT0xJQ1kpIHtcbiAgICAgIGlmICh0eXBlb2YgY2ZnLlRSVVNURURfVFlQRVNfUE9MSUNZLmNyZWF0ZUhUTUwgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgdHlwZUVycm9yQ3JlYXRlKFxuICAgICAgICAgICdUUlVTVEVEX1RZUEVTX1BPTElDWSBjb25maWd1cmF0aW9uIG9wdGlvbiBtdXN0IHByb3ZpZGUgYSBcImNyZWF0ZUhUTUxcIiBob29rLidcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBjZmcuVFJVU1RFRF9UWVBFU19QT0xJQ1kuY3JlYXRlU2NyaXB0VVJMICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IHR5cGVFcnJvckNyZWF0ZShcbiAgICAgICAgICAnVFJVU1RFRF9UWVBFU19QT0xJQ1kgY29uZmlndXJhdGlvbiBvcHRpb24gbXVzdCBwcm92aWRlIGEgXCJjcmVhdGVTY3JpcHRVUkxcIiBob29rLidcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gT3ZlcndyaXRlIGV4aXN0aW5nIFRydXN0ZWRUeXBlcyBwb2xpY3kuXG4gICAgICB0cnVzdGVkVHlwZXNQb2xpY3kgPSBjZmcuVFJVU1RFRF9UWVBFU19QT0xJQ1k7XG5cbiAgICAgIC8vIFNpZ24gbG9jYWwgdmFyaWFibGVzIHJlcXVpcmVkIGJ5IGBzYW5pdGl6ZWAuXG4gICAgICBlbXB0eUhUTUwgPSB0cnVzdGVkVHlwZXNQb2xpY3kuY3JlYXRlSFRNTCgnJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFVuaW5pdGlhbGl6ZWQgcG9saWN5LCBhdHRlbXB0IHRvIGluaXRpYWxpemUgdGhlIGludGVybmFsIGRvbXB1cmlmeSBwb2xpY3kuXG4gICAgICBpZiAodHJ1c3RlZFR5cGVzUG9saWN5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdHJ1c3RlZFR5cGVzUG9saWN5ID0gX2NyZWF0ZVRydXN0ZWRUeXBlc1BvbGljeShcbiAgICAgICAgICB0cnVzdGVkVHlwZXMsXG4gICAgICAgICAgY3VycmVudFNjcmlwdFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiBjcmVhdGluZyB0aGUgaW50ZXJuYWwgcG9saWN5IHN1Y2NlZWRlZCBzaWduIGludGVybmFsIHZhcmlhYmxlcy5cbiAgICAgIGlmICh0cnVzdGVkVHlwZXNQb2xpY3kgIT09IG51bGwgJiYgdHlwZW9mIGVtcHR5SFRNTCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgZW1wdHlIVE1MID0gdHJ1c3RlZFR5cGVzUG9saWN5LmNyZWF0ZUhUTUwoJycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFByZXZlbnQgZnVydGhlciBtYW5pcHVsYXRpb24gb2YgY29uZmlndXJhdGlvbi5cbiAgICAvLyBOb3QgYXZhaWxhYmxlIGluIElFOCwgU2FmYXJpIDUsIGV0Yy5cbiAgICBpZiAoZnJlZXplKSB7XG4gICAgICBmcmVlemUoY2ZnKTtcbiAgICB9XG5cbiAgICBDT05GSUcgPSBjZmc7XG4gIH07XG5cbiAgLyogS2VlcCB0cmFjayBvZiBhbGwgcG9zc2libGUgU1ZHIGFuZCBNYXRoTUwgdGFnc1xuICAgKiBzbyB0aGF0IHdlIGNhbiBwZXJmb3JtIHRoZSBuYW1lc3BhY2UgY2hlY2tzXG4gICAqIGNvcnJlY3RseS4gKi9cbiAgY29uc3QgQUxMX1NWR19UQUdTID0gYWRkVG9TZXQoe30sIFtcbiAgICAuLi5UQUdTLnN2ZyxcbiAgICAuLi5UQUdTLnN2Z0ZpbHRlcnMsXG4gICAgLi4uVEFHUy5zdmdEaXNhbGxvd2VkLFxuICBdKTtcbiAgY29uc3QgQUxMX01BVEhNTF9UQUdTID0gYWRkVG9TZXQoe30sIFtcbiAgICAuLi5UQUdTLm1hdGhNbCxcbiAgICAuLi5UQUdTLm1hdGhNbERpc2FsbG93ZWQsXG4gIF0pO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gZWxlbWVudCBhIERPTSBlbGVtZW50IHdob3NlIG5hbWVzcGFjZSBpcyBiZWluZyBjaGVja2VkXG4gICAqIEByZXR1cm5zIFJldHVybiBmYWxzZSBpZiB0aGUgZWxlbWVudCBoYXMgYVxuICAgKiAgbmFtZXNwYWNlIHRoYXQgYSBzcGVjLWNvbXBsaWFudCBwYXJzZXIgd291bGQgbmV2ZXJcbiAgICogIHJldHVybi4gUmV0dXJuIHRydWUgb3RoZXJ3aXNlLlxuICAgKi9cbiAgY29uc3QgX2NoZWNrVmFsaWROYW1lc3BhY2UgPSBmdW5jdGlvbiAoZWxlbWVudDogRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgIGxldCBwYXJlbnQgPSBnZXRQYXJlbnROb2RlKGVsZW1lbnQpO1xuXG4gICAgLy8gSW4gSlNET00sIGlmIHdlJ3JlIGluc2lkZSBzaGFkb3cgRE9NLCB0aGVuIHBhcmVudE5vZGVcbiAgICAvLyBjYW4gYmUgbnVsbC4gV2UganVzdCBzaW11bGF0ZSBwYXJlbnQgaW4gdGhpcyBjYXNlLlxuICAgIGlmICghcGFyZW50IHx8ICFwYXJlbnQudGFnTmFtZSkge1xuICAgICAgcGFyZW50ID0ge1xuICAgICAgICBuYW1lc3BhY2VVUkk6IE5BTUVTUEFDRSxcbiAgICAgICAgdGFnTmFtZTogJ3RlbXBsYXRlJyxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgdGFnTmFtZSA9IHN0cmluZ1RvTG93ZXJDYXNlKGVsZW1lbnQudGFnTmFtZSk7XG4gICAgY29uc3QgcGFyZW50VGFnTmFtZSA9IHN0cmluZ1RvTG93ZXJDYXNlKHBhcmVudC50YWdOYW1lKTtcblxuICAgIGlmICghQUxMT1dFRF9OQU1FU1BBQ0VTW2VsZW1lbnQubmFtZXNwYWNlVVJJXSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChlbGVtZW50Lm5hbWVzcGFjZVVSSSA9PT0gU1ZHX05BTUVTUEFDRSkge1xuICAgICAgLy8gVGhlIG9ubHkgd2F5IHRvIHN3aXRjaCBmcm9tIEhUTUwgbmFtZXNwYWNlIHRvIFNWR1xuICAgICAgLy8gaXMgdmlhIDxzdmc+LiBJZiBpdCBoYXBwZW5zIHZpYSBhbnkgb3RoZXIgdGFnLCB0aGVuXG4gICAgICAvLyBpdCBzaG91bGQgYmUga2lsbGVkLlxuICAgICAgaWYgKHBhcmVudC5uYW1lc3BhY2VVUkkgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgICAgIHJldHVybiB0YWdOYW1lID09PSAnc3ZnJztcbiAgICAgIH1cblxuICAgICAgLy8gVGhlIG9ubHkgd2F5IHRvIHN3aXRjaCBmcm9tIE1hdGhNTCB0byBTVkcgaXMgdmlhYFxuICAgICAgLy8gc3ZnIGlmIHBhcmVudCBpcyBlaXRoZXIgPGFubm90YXRpb24teG1sPiBvciBNYXRoTUxcbiAgICAgIC8vIHRleHQgaW50ZWdyYXRpb24gcG9pbnRzLlxuICAgICAgaWYgKHBhcmVudC5uYW1lc3BhY2VVUkkgPT09IE1BVEhNTF9OQU1FU1BBQ0UpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICB0YWdOYW1lID09PSAnc3ZnJyAmJlxuICAgICAgICAgIChwYXJlbnRUYWdOYW1lID09PSAnYW5ub3RhdGlvbi14bWwnIHx8XG4gICAgICAgICAgICBNQVRITUxfVEVYVF9JTlRFR1JBVElPTl9QT0lOVFNbcGFyZW50VGFnTmFtZV0pXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFdlIG9ubHkgYWxsb3cgZWxlbWVudHMgdGhhdCBhcmUgZGVmaW5lZCBpbiBTVkdcbiAgICAgIC8vIHNwZWMuIEFsbCBvdGhlcnMgYXJlIGRpc2FsbG93ZWQgaW4gU1ZHIG5hbWVzcGFjZS5cbiAgICAgIHJldHVybiBCb29sZWFuKEFMTF9TVkdfVEFHU1t0YWdOYW1lXSk7XG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnQubmFtZXNwYWNlVVJJID09PSBNQVRITUxfTkFNRVNQQUNFKSB7XG4gICAgICAvLyBUaGUgb25seSB3YXkgdG8gc3dpdGNoIGZyb20gSFRNTCBuYW1lc3BhY2UgdG8gTWF0aE1MXG4gICAgICAvLyBpcyB2aWEgPG1hdGg+LiBJZiBpdCBoYXBwZW5zIHZpYSBhbnkgb3RoZXIgdGFnLCB0aGVuXG4gICAgICAvLyBpdCBzaG91bGQgYmUga2lsbGVkLlxuICAgICAgaWYgKHBhcmVudC5uYW1lc3BhY2VVUkkgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgICAgIHJldHVybiB0YWdOYW1lID09PSAnbWF0aCc7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBvbmx5IHdheSB0byBzd2l0Y2ggZnJvbSBTVkcgdG8gTWF0aE1MIGlzIHZpYVxuICAgICAgLy8gPG1hdGg+IGFuZCBIVE1MIGludGVncmF0aW9uIHBvaW50c1xuICAgICAgaWYgKHBhcmVudC5uYW1lc3BhY2VVUkkgPT09IFNWR19OQU1FU1BBQ0UpIHtcbiAgICAgICAgcmV0dXJuIHRhZ05hbWUgPT09ICdtYXRoJyAmJiBIVE1MX0lOVEVHUkFUSU9OX1BPSU5UU1twYXJlbnRUYWdOYW1lXTtcbiAgICAgIH1cblxuICAgICAgLy8gV2Ugb25seSBhbGxvdyBlbGVtZW50cyB0aGF0IGFyZSBkZWZpbmVkIGluIE1hdGhNTFxuICAgICAgLy8gc3BlYy4gQWxsIG90aGVycyBhcmUgZGlzYWxsb3dlZCBpbiBNYXRoTUwgbmFtZXNwYWNlLlxuICAgICAgcmV0dXJuIEJvb2xlYW4oQUxMX01BVEhNTF9UQUdTW3RhZ05hbWVdKTtcbiAgICB9XG5cbiAgICBpZiAoZWxlbWVudC5uYW1lc3BhY2VVUkkgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgICAvLyBUaGUgb25seSB3YXkgdG8gc3dpdGNoIGZyb20gU1ZHIHRvIEhUTUwgaXMgdmlhXG4gICAgICAvLyBIVE1MIGludGVncmF0aW9uIHBvaW50cywgYW5kIGZyb20gTWF0aE1MIHRvIEhUTUxcbiAgICAgIC8vIGlzIHZpYSBNYXRoTUwgdGV4dCBpbnRlZ3JhdGlvbiBwb2ludHNcbiAgICAgIGlmIChcbiAgICAgICAgcGFyZW50Lm5hbWVzcGFjZVVSSSA9PT0gU1ZHX05BTUVTUEFDRSAmJlxuICAgICAgICAhSFRNTF9JTlRFR1JBVElPTl9QT0lOVFNbcGFyZW50VGFnTmFtZV1cbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgcGFyZW50Lm5hbWVzcGFjZVVSSSA9PT0gTUFUSE1MX05BTUVTUEFDRSAmJlxuICAgICAgICAhTUFUSE1MX1RFWFRfSU5URUdSQVRJT05fUE9JTlRTW3BhcmVudFRhZ05hbWVdXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBXZSBkaXNhbGxvdyB0YWdzIHRoYXQgYXJlIHNwZWNpZmljIGZvciBNYXRoTUxcbiAgICAgIC8vIG9yIFNWRyBhbmQgc2hvdWxkIG5ldmVyIGFwcGVhciBpbiBIVE1MIG5hbWVzcGFjZVxuICAgICAgcmV0dXJuIChcbiAgICAgICAgIUFMTF9NQVRITUxfVEFHU1t0YWdOYW1lXSAmJlxuICAgICAgICAoQ09NTU9OX1NWR19BTkRfSFRNTF9FTEVNRU5UU1t0YWdOYW1lXSB8fCAhQUxMX1NWR19UQUdTW3RhZ05hbWVdKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBGb3IgWEhUTUwgYW5kIFhNTCBkb2N1bWVudHMgdGhhdCBzdXBwb3J0IGN1c3RvbSBuYW1lc3BhY2VzXG4gICAgaWYgKFxuICAgICAgUEFSU0VSX01FRElBX1RZUEUgPT09ICdhcHBsaWNhdGlvbi94aHRtbCt4bWwnICYmXG4gICAgICBBTExPV0VEX05BTUVTUEFDRVNbZWxlbWVudC5uYW1lc3BhY2VVUkldXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBUaGUgY29kZSBzaG91bGQgbmV2ZXIgcmVhY2ggdGhpcyBwbGFjZSAodGhpcyBtZWFuc1xuICAgIC8vIHRoYXQgdGhlIGVsZW1lbnQgc29tZWhvdyBnb3QgbmFtZXNwYWNlIHRoYXQgaXMgbm90XG4gICAgLy8gSFRNTCwgU1ZHLCBNYXRoTUwgb3IgYWxsb3dlZCB2aWEgQUxMT1dFRF9OQU1FU1BBQ0VTKS5cbiAgICAvLyBSZXR1cm4gZmFsc2UganVzdCBpbiBjYXNlLlxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICAvKipcbiAgICogX2ZvcmNlUmVtb3ZlXG4gICAqXG4gICAqIEBwYXJhbSBub2RlIGEgRE9NIG5vZGVcbiAgICovXG4gIGNvbnN0IF9mb3JjZVJlbW92ZSA9IGZ1bmN0aW9uIChub2RlOiBOb2RlKTogdm9pZCB7XG4gICAgYXJyYXlQdXNoKERPTVB1cmlmeS5yZW1vdmVkLCB7IGVsZW1lbnQ6IG5vZGUgfSk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vcHJlZmVyLWRvbS1ub2RlLXJlbW92ZVxuICAgICAgZ2V0UGFyZW50Tm9kZShub2RlKS5yZW1vdmVDaGlsZChub2RlKTtcbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICByZW1vdmUobm9kZSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBfcmVtb3ZlQXR0cmlidXRlXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIGFuIEF0dHJpYnV0ZSBuYW1lXG4gICAqIEBwYXJhbSBlbGVtZW50IGEgRE9NIG5vZGVcbiAgICovXG4gIGNvbnN0IF9yZW1vdmVBdHRyaWJ1dGUgPSBmdW5jdGlvbiAobmFtZTogc3RyaW5nLCBlbGVtZW50OiBFbGVtZW50KTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGFycmF5UHVzaChET01QdXJpZnkucmVtb3ZlZCwge1xuICAgICAgICBhdHRyaWJ1dGU6IGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShuYW1lKSxcbiAgICAgICAgZnJvbTogZWxlbWVudCxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIGFycmF5UHVzaChET01QdXJpZnkucmVtb3ZlZCwge1xuICAgICAgICBhdHRyaWJ1dGU6IG51bGwsXG4gICAgICAgIGZyb206IGVsZW1lbnQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcblxuICAgIC8vIFdlIHZvaWQgYXR0cmlidXRlIHZhbHVlcyBmb3IgdW5yZW1vdmFibGUgXCJpc1wiIGF0dHJpYnV0ZXNcbiAgICBpZiAobmFtZSA9PT0gJ2lzJykge1xuICAgICAgaWYgKFJFVFVSTl9ET00gfHwgUkVUVVJOX0RPTV9GUkFHTUVOVCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIF9mb3JjZVJlbW92ZShlbGVtZW50KTtcbiAgICAgICAgfSBjYXRjaCAoXykge31cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUobmFtZSwgJycpO1xuICAgICAgICB9IGNhdGNoIChfKSB7fVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogX2luaXREb2N1bWVudFxuICAgKlxuICAgKiBAcGFyYW0gZGlydHkgLSBhIHN0cmluZyBvZiBkaXJ0eSBtYXJrdXBcbiAgICogQHJldHVybiBhIERPTSwgZmlsbGVkIHdpdGggdGhlIGRpcnR5IG1hcmt1cFxuICAgKi9cbiAgY29uc3QgX2luaXREb2N1bWVudCA9IGZ1bmN0aW9uIChkaXJ0eTogc3RyaW5nKTogRG9jdW1lbnQge1xuICAgIC8qIENyZWF0ZSBhIEhUTUwgZG9jdW1lbnQgKi9cbiAgICBsZXQgZG9jID0gbnVsbDtcbiAgICBsZXQgbGVhZGluZ1doaXRlc3BhY2UgPSBudWxsO1xuXG4gICAgaWYgKEZPUkNFX0JPRFkpIHtcbiAgICAgIGRpcnR5ID0gJzxyZW1vdmU+PC9yZW1vdmU+JyArIGRpcnR5O1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBJZiBGT1JDRV9CT0RZIGlzbid0IHVzZWQsIGxlYWRpbmcgd2hpdGVzcGFjZSBuZWVkcyB0byBiZSBwcmVzZXJ2ZWQgbWFudWFsbHkgKi9cbiAgICAgIGNvbnN0IG1hdGNoZXMgPSBzdHJpbmdNYXRjaChkaXJ0eSwgL15bXFxyXFxuXFx0IF0rLyk7XG4gICAgICBsZWFkaW5nV2hpdGVzcGFjZSA9IG1hdGNoZXMgJiYgbWF0Y2hlc1swXTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBQQVJTRVJfTUVESUFfVFlQRSA9PT0gJ2FwcGxpY2F0aW9uL3hodG1sK3htbCcgJiZcbiAgICAgIE5BTUVTUEFDRSA9PT0gSFRNTF9OQU1FU1BBQ0VcbiAgICApIHtcbiAgICAgIC8vIFJvb3Qgb2YgWEhUTUwgZG9jIG11c3QgY29udGFpbiB4bWxucyBkZWNsYXJhdGlvbiAoc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvbm9ybWF0aXZlLmh0bWwjc3RyaWN0KVxuICAgICAgZGlydHkgPVxuICAgICAgICAnPGh0bWwgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCI+PGhlYWQ+PC9oZWFkPjxib2R5PicgK1xuICAgICAgICBkaXJ0eSArXG4gICAgICAgICc8L2JvZHk+PC9odG1sPic7XG4gICAgfVxuXG4gICAgY29uc3QgZGlydHlQYXlsb2FkID0gdHJ1c3RlZFR5cGVzUG9saWN5XG4gICAgICA/IHRydXN0ZWRUeXBlc1BvbGljeS5jcmVhdGVIVE1MKGRpcnR5KVxuICAgICAgOiBkaXJ0eTtcbiAgICAvKlxuICAgICAqIFVzZSB0aGUgRE9NUGFyc2VyIEFQSSBieSBkZWZhdWx0LCBmYWxsYmFjayBsYXRlciBpZiBuZWVkcyBiZVxuICAgICAqIERPTVBhcnNlciBub3Qgd29yayBmb3Igc3ZnIHdoZW4gaGFzIG11bHRpcGxlIHJvb3QgZWxlbWVudC5cbiAgICAgKi9cbiAgICBpZiAoTkFNRVNQQUNFID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZG9jID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhkaXJ0eVBheWxvYWQsIFBBUlNFUl9NRURJQV9UWVBFKTtcbiAgICAgIH0gY2F0Y2ggKF8pIHt9XG4gICAgfVxuXG4gICAgLyogVXNlIGNyZWF0ZUhUTUxEb2N1bWVudCBpbiBjYXNlIERPTVBhcnNlciBpcyBub3QgYXZhaWxhYmxlICovXG4gICAgaWYgKCFkb2MgfHwgIWRvYy5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgIGRvYyA9IGltcGxlbWVudGF0aW9uLmNyZWF0ZURvY3VtZW50KE5BTUVTUEFDRSwgJ3RlbXBsYXRlJywgbnVsbCk7XG4gICAgICB0cnkge1xuICAgICAgICBkb2MuZG9jdW1lbnRFbGVtZW50LmlubmVySFRNTCA9IElTX0VNUFRZX0lOUFVUXG4gICAgICAgICAgPyBlbXB0eUhUTUxcbiAgICAgICAgICA6IGRpcnR5UGF5bG9hZDtcbiAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgLy8gU3ludGF4IGVycm9yIGlmIGRpcnR5UGF5bG9hZCBpcyBpbnZhbGlkIHhtbFxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGJvZHkgPSBkb2MuYm9keSB8fCBkb2MuZG9jdW1lbnRFbGVtZW50O1xuXG4gICAgaWYgKGRpcnR5ICYmIGxlYWRpbmdXaGl0ZXNwYWNlKSB7XG4gICAgICBib2R5Lmluc2VydEJlZm9yZShcbiAgICAgICAgZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobGVhZGluZ1doaXRlc3BhY2UpLFxuICAgICAgICBib2R5LmNoaWxkTm9kZXNbMF0gfHwgbnVsbFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvKiBXb3JrIG9uIHdob2xlIGRvY3VtZW50IG9yIGp1c3QgaXRzIGJvZHkgKi9cbiAgICBpZiAoTkFNRVNQQUNFID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgICAgcmV0dXJuIGdldEVsZW1lbnRzQnlUYWdOYW1lLmNhbGwoXG4gICAgICAgIGRvYyxcbiAgICAgICAgV0hPTEVfRE9DVU1FTlQgPyAnaHRtbCcgOiAnYm9keSdcbiAgICAgIClbMF07XG4gICAgfVxuXG4gICAgcmV0dXJuIFdIT0xFX0RPQ1VNRU5UID8gZG9jLmRvY3VtZW50RWxlbWVudCA6IGJvZHk7XG4gIH07XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBOb2RlSXRlcmF0b3Igb2JqZWN0IHRoYXQgeW91IGNhbiB1c2UgdG8gdHJhdmVyc2UgZmlsdGVyZWQgbGlzdHMgb2Ygbm9kZXMgb3IgZWxlbWVudHMgaW4gYSBkb2N1bWVudC5cbiAgICpcbiAgICogQHBhcmFtIHJvb3QgVGhlIHJvb3QgZWxlbWVudCBvciBub2RlIHRvIHN0YXJ0IHRyYXZlcnNpbmcgb24uXG4gICAqIEByZXR1cm4gVGhlIGNyZWF0ZWQgTm9kZUl0ZXJhdG9yXG4gICAqL1xuICBjb25zdCBfY3JlYXRlTm9kZUl0ZXJhdG9yID0gZnVuY3Rpb24gKHJvb3Q6IE5vZGUpOiBOb2RlSXRlcmF0b3Ige1xuICAgIHJldHVybiBjcmVhdGVOb2RlSXRlcmF0b3IuY2FsbChcbiAgICAgIHJvb3Qub3duZXJEb2N1bWVudCB8fCByb290LFxuICAgICAgcm9vdCxcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1iaXR3aXNlXG4gICAgICBOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCB8XG4gICAgICAgIE5vZGVGaWx0ZXIuU0hPV19DT01NRU5UIHxcbiAgICAgICAgTm9kZUZpbHRlci5TSE9XX1RFWFQgfFxuICAgICAgICBOb2RlRmlsdGVyLlNIT1dfUFJPQ0VTU0lOR19JTlNUUlVDVElPTiB8XG4gICAgICAgIE5vZGVGaWx0ZXIuU0hPV19DREFUQV9TRUNUSU9OLFxuICAgICAgbnVsbFxuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIF9pc0Nsb2JiZXJlZFxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCBlbGVtZW50IHRvIGNoZWNrIGZvciBjbG9iYmVyaW5nIGF0dGFja3NcbiAgICogQHJldHVybiB0cnVlIGlmIGNsb2JiZXJlZCwgZmFsc2UgaWYgc2FmZVxuICAgKi9cbiAgY29uc3QgX2lzQ2xvYmJlcmVkID0gZnVuY3Rpb24gKGVsZW1lbnQ6IEVsZW1lbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxGb3JtRWxlbWVudCAmJlxuICAgICAgKHR5cGVvZiBlbGVtZW50Lm5vZGVOYW1lICE9PSAnc3RyaW5nJyB8fFxuICAgICAgICB0eXBlb2YgZWxlbWVudC50ZXh0Q29udGVudCAhPT0gJ3N0cmluZycgfHxcbiAgICAgICAgdHlwZW9mIGVsZW1lbnQucmVtb3ZlQ2hpbGQgIT09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgIShlbGVtZW50LmF0dHJpYnV0ZXMgaW5zdGFuY2VvZiBOYW1lZE5vZGVNYXApIHx8XG4gICAgICAgIHR5cGVvZiBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICB0eXBlb2YgZWxlbWVudC5zZXRBdHRyaWJ1dGUgIT09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgdHlwZW9mIGVsZW1lbnQubmFtZXNwYWNlVVJJICE9PSAnc3RyaW5nJyB8fFxuICAgICAgICB0eXBlb2YgZWxlbWVudC5pbnNlcnRCZWZvcmUgIT09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgdHlwZW9mIGVsZW1lbnQuaGFzQ2hpbGROb2RlcyAhPT0gJ2Z1bmN0aW9uJylcbiAgICApO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGEgRE9NIG5vZGUuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBvYmplY3QgdG8gY2hlY2sgd2hldGhlciBpdCdzIGEgRE9NIG5vZGVcbiAgICogQHJldHVybiB0cnVlIGlzIG9iamVjdCBpcyBhIERPTSBub2RlXG4gICAqL1xuICBjb25zdCBfaXNOb2RlID0gZnVuY3Rpb24gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgTm9kZSB7XG4gICAgcmV0dXJuIHR5cGVvZiBOb2RlID09PSAnZnVuY3Rpb24nICYmIHZhbHVlIGluc3RhbmNlb2YgTm9kZTtcbiAgfTtcblxuICBmdW5jdGlvbiBfZXhlY3V0ZUhvb2tzPFQgZXh0ZW5kcyBIb29rRnVuY3Rpb24+KFxuICAgIGhvb2tzOiBIb29rRnVuY3Rpb25bXSxcbiAgICBjdXJyZW50Tm9kZTogUGFyYW1ldGVyczxUPlswXSxcbiAgICBkYXRhOiBQYXJhbWV0ZXJzPFQ+WzFdXG4gICk6IHZvaWQge1xuICAgIGFycmF5Rm9yRWFjaChob29rcywgKGhvb2s6IFQpID0+IHtcbiAgICAgIGhvb2suY2FsbChET01QdXJpZnksIGN1cnJlbnROb2RlLCBkYXRhLCBDT05GSUcpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIF9zYW5pdGl6ZUVsZW1lbnRzXG4gICAqXG4gICAqIEBwcm90ZWN0IG5vZGVOYW1lXG4gICAqIEBwcm90ZWN0IHRleHRDb250ZW50XG4gICAqIEBwcm90ZWN0IHJlbW92ZUNoaWxkXG4gICAqIEBwYXJhbSBjdXJyZW50Tm9kZSB0byBjaGVjayBmb3IgcGVybWlzc2lvbiB0byBleGlzdFxuICAgKiBAcmV0dXJuIHRydWUgaWYgbm9kZSB3YXMga2lsbGVkLCBmYWxzZSBpZiBsZWZ0IGFsaXZlXG4gICAqL1xuICBjb25zdCBfc2FuaXRpemVFbGVtZW50cyA9IGZ1bmN0aW9uIChjdXJyZW50Tm9kZTogYW55KTogYm9vbGVhbiB7XG4gICAgbGV0IGNvbnRlbnQgPSBudWxsO1xuXG4gICAgLyogRXhlY3V0ZSBhIGhvb2sgaWYgcHJlc2VudCAqL1xuICAgIF9leGVjdXRlSG9va3MoaG9va3MuYmVmb3JlU2FuaXRpemVFbGVtZW50cywgY3VycmVudE5vZGUsIG51bGwpO1xuXG4gICAgLyogQ2hlY2sgaWYgZWxlbWVudCBpcyBjbG9iYmVyZWQgb3IgY2FuIGNsb2JiZXIgKi9cbiAgICBpZiAoX2lzQ2xvYmJlcmVkKGN1cnJlbnROb2RlKSkge1xuICAgICAgX2ZvcmNlUmVtb3ZlKGN1cnJlbnROb2RlKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qIE5vdyBsZXQncyBjaGVjayB0aGUgZWxlbWVudCdzIHR5cGUgYW5kIG5hbWUgKi9cbiAgICBjb25zdCB0YWdOYW1lID0gdHJhbnNmb3JtQ2FzZUZ1bmMoY3VycmVudE5vZGUubm9kZU5hbWUpO1xuXG4gICAgLyogRXhlY3V0ZSBhIGhvb2sgaWYgcHJlc2VudCAqL1xuICAgIF9leGVjdXRlSG9va3MoaG9va3MudXBvblNhbml0aXplRWxlbWVudCwgY3VycmVudE5vZGUsIHtcbiAgICAgIHRhZ05hbWUsXG4gICAgICBhbGxvd2VkVGFnczogQUxMT1dFRF9UQUdTLFxuICAgIH0pO1xuXG4gICAgLyogRGV0ZWN0IG1YU1MgYXR0ZW1wdHMgYWJ1c2luZyBuYW1lc3BhY2UgY29uZnVzaW9uICovXG4gICAgaWYgKFxuICAgICAgU0FGRV9GT1JfWE1MICYmXG4gICAgICBjdXJyZW50Tm9kZS5oYXNDaGlsZE5vZGVzKCkgJiZcbiAgICAgICFfaXNOb2RlKGN1cnJlbnROb2RlLmZpcnN0RWxlbWVudENoaWxkKSAmJlxuICAgICAgcmVnRXhwVGVzdCgvPFsvXFx3IV0vZywgY3VycmVudE5vZGUuaW5uZXJIVE1MKSAmJlxuICAgICAgcmVnRXhwVGVzdCgvPFsvXFx3IV0vZywgY3VycmVudE5vZGUudGV4dENvbnRlbnQpXG4gICAgKSB7XG4gICAgICBfZm9yY2VSZW1vdmUoY3VycmVudE5vZGUpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyogUmVtb3ZlIGFueSBvY2N1cnJlbmNlIG9mIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zICovXG4gICAgaWYgKGN1cnJlbnROb2RlLm5vZGVUeXBlID09PSBOT0RFX1RZUEUucHJvZ3Jlc3NpbmdJbnN0cnVjdGlvbikge1xuICAgICAgX2ZvcmNlUmVtb3ZlKGN1cnJlbnROb2RlKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qIFJlbW92ZSBhbnkga2luZCBvZiBwb3NzaWJseSBoYXJtZnVsIGNvbW1lbnRzICovXG4gICAgaWYgKFxuICAgICAgU0FGRV9GT1JfWE1MICYmXG4gICAgICBjdXJyZW50Tm9kZS5ub2RlVHlwZSA9PT0gTk9ERV9UWVBFLmNvbW1lbnQgJiZcbiAgICAgIHJlZ0V4cFRlc3QoLzxbL1xcd10vZywgY3VycmVudE5vZGUuZGF0YSlcbiAgICApIHtcbiAgICAgIF9mb3JjZVJlbW92ZShjdXJyZW50Tm9kZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKiBSZW1vdmUgZWxlbWVudCBpZiBhbnl0aGluZyBmb3JiaWRzIGl0cyBwcmVzZW5jZSAqL1xuICAgIGlmIChcbiAgICAgICEoXG4gICAgICAgIEVYVFJBX0VMRU1FTlRfSEFORExJTkcudGFnQ2hlY2sgaW5zdGFuY2VvZiBGdW5jdGlvbiAmJlxuICAgICAgICBFWFRSQV9FTEVNRU5UX0hBTkRMSU5HLnRhZ0NoZWNrKHRhZ05hbWUpXG4gICAgICApICYmXG4gICAgICAoIUFMTE9XRURfVEFHU1t0YWdOYW1lXSB8fCBGT1JCSURfVEFHU1t0YWdOYW1lXSlcbiAgICApIHtcbiAgICAgIC8qIENoZWNrIGlmIHdlIGhhdmUgYSBjdXN0b20gZWxlbWVudCB0byBoYW5kbGUgKi9cbiAgICAgIGlmICghRk9SQklEX1RBR1NbdGFnTmFtZV0gJiYgX2lzQmFzaWNDdXN0b21FbGVtZW50KHRhZ05hbWUpKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBDVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2sgaW5zdGFuY2VvZiBSZWdFeHAgJiZcbiAgICAgICAgICByZWdFeHBUZXN0KENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVjaywgdGFnTmFtZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVjayBpbnN0YW5jZW9mIEZ1bmN0aW9uICYmXG4gICAgICAgICAgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrKHRhZ05hbWUpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvKiBLZWVwIGNvbnRlbnQgZXhjZXB0IGZvciBiYWQtbGlzdGVkIGVsZW1lbnRzICovXG4gICAgICBpZiAoS0VFUF9DT05URU5UICYmICFGT1JCSURfQ09OVEVOVFNbdGFnTmFtZV0pIHtcbiAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IGdldFBhcmVudE5vZGUoY3VycmVudE5vZGUpIHx8IGN1cnJlbnROb2RlLnBhcmVudE5vZGU7XG4gICAgICAgIGNvbnN0IGNoaWxkTm9kZXMgPSBnZXRDaGlsZE5vZGVzKGN1cnJlbnROb2RlKSB8fCBjdXJyZW50Tm9kZS5jaGlsZE5vZGVzO1xuXG4gICAgICAgIGlmIChjaGlsZE5vZGVzICYmIHBhcmVudE5vZGUpIHtcbiAgICAgICAgICBjb25zdCBjaGlsZENvdW50ID0gY2hpbGROb2Rlcy5sZW5ndGg7XG5cbiAgICAgICAgICBmb3IgKGxldCBpID0gY2hpbGRDb3VudCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgICAgICBjb25zdCBjaGlsZENsb25lID0gY2xvbmVOb2RlKGNoaWxkTm9kZXNbaV0sIHRydWUpO1xuICAgICAgICAgICAgY2hpbGRDbG9uZS5fX3JlbW92YWxDb3VudCA9IChjdXJyZW50Tm9kZS5fX3JlbW92YWxDb3VudCB8fCAwKSArIDE7XG4gICAgICAgICAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShjaGlsZENsb25lLCBnZXROZXh0U2libGluZyhjdXJyZW50Tm9kZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBfZm9yY2VSZW1vdmUoY3VycmVudE5vZGUpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyogQ2hlY2sgd2hldGhlciBlbGVtZW50IGhhcyBhIHZhbGlkIG5hbWVzcGFjZSAqL1xuICAgIGlmIChjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgIV9jaGVja1ZhbGlkTmFtZXNwYWNlKGN1cnJlbnROb2RlKSkge1xuICAgICAgX2ZvcmNlUmVtb3ZlKGN1cnJlbnROb2RlKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qIE1ha2Ugc3VyZSB0aGF0IG9sZGVyIGJyb3dzZXJzIGRvbid0IGdldCBmYWxsYmFjay10YWcgbVhTUyAqL1xuICAgIGlmIChcbiAgICAgICh0YWdOYW1lID09PSAnbm9zY3JpcHQnIHx8XG4gICAgICAgIHRhZ05hbWUgPT09ICdub2VtYmVkJyB8fFxuICAgICAgICB0YWdOYW1lID09PSAnbm9mcmFtZXMnKSAmJlxuICAgICAgcmVnRXhwVGVzdCgvPFxcL25vKHNjcmlwdHxlbWJlZHxmcmFtZXMpL2ksIGN1cnJlbnROb2RlLmlubmVySFRNTClcbiAgICApIHtcbiAgICAgIF9mb3JjZVJlbW92ZShjdXJyZW50Tm9kZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKiBTYW5pdGl6ZSBlbGVtZW50IGNvbnRlbnQgdG8gYmUgdGVtcGxhdGUtc2FmZSAqL1xuICAgIGlmIChTQUZFX0ZPUl9URU1QTEFURVMgJiYgY3VycmVudE5vZGUubm9kZVR5cGUgPT09IE5PREVfVFlQRS50ZXh0KSB7XG4gICAgICAvKiBHZXQgdGhlIGVsZW1lbnQncyB0ZXh0IGNvbnRlbnQgKi9cbiAgICAgIGNvbnRlbnQgPSBjdXJyZW50Tm9kZS50ZXh0Q29udGVudDtcblxuICAgICAgYXJyYXlGb3JFYWNoKFtNVVNUQUNIRV9FWFBSLCBFUkJfRVhQUiwgVE1QTElUX0VYUFJdLCAoZXhwcjogUmVnRXhwKSA9PiB7XG4gICAgICAgIGNvbnRlbnQgPSBzdHJpbmdSZXBsYWNlKGNvbnRlbnQsIGV4cHIsICcgJyk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKGN1cnJlbnROb2RlLnRleHRDb250ZW50ICE9PSBjb250ZW50KSB7XG4gICAgICAgIGFycmF5UHVzaChET01QdXJpZnkucmVtb3ZlZCwgeyBlbGVtZW50OiBjdXJyZW50Tm9kZS5jbG9uZU5vZGUoKSB9KTtcbiAgICAgICAgY3VycmVudE5vZGUudGV4dENvbnRlbnQgPSBjb250ZW50O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qIEV4ZWN1dGUgYSBob29rIGlmIHByZXNlbnQgKi9cbiAgICBfZXhlY3V0ZUhvb2tzKGhvb2tzLmFmdGVyU2FuaXRpemVFbGVtZW50cywgY3VycmVudE5vZGUsIG51bGwpO1xuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBfaXNWYWxpZEF0dHJpYnV0ZVxuICAgKlxuICAgKiBAcGFyYW0gbGNUYWcgTG93ZXJjYXNlIHRhZyBuYW1lIG9mIGNvbnRhaW5pbmcgZWxlbWVudC5cbiAgICogQHBhcmFtIGxjTmFtZSBMb3dlcmNhc2UgYXR0cmlidXRlIG5hbWUuXG4gICAqIEBwYXJhbSB2YWx1ZSBBdHRyaWJ1dGUgdmFsdWUuXG4gICAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmIGB2YWx1ZWAgaXMgdmFsaWQsIG90aGVyd2lzZSBmYWxzZS5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG4gIGNvbnN0IF9pc1ZhbGlkQXR0cmlidXRlID0gZnVuY3Rpb24gKFxuICAgIGxjVGFnOiBzdHJpbmcsXG4gICAgbGNOYW1lOiBzdHJpbmcsXG4gICAgdmFsdWU6IHN0cmluZ1xuICApOiBib29sZWFuIHtcbiAgICAvKiBGT1JCSURfQVRUUiBtdXN0IGFsd2F5cyB3aW4sIGV2ZW4gaWYgQUREX0FUVFIgcHJlZGljYXRlIHdvdWxkIGFsbG93IGl0ICovXG4gICAgaWYgKEZPUkJJRF9BVFRSW2xjTmFtZV0pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKiBNYWtlIHN1cmUgYXR0cmlidXRlIGNhbm5vdCBjbG9iYmVyICovXG4gICAgaWYgKFxuICAgICAgU0FOSVRJWkVfRE9NICYmXG4gICAgICAobGNOYW1lID09PSAnaWQnIHx8IGxjTmFtZSA9PT0gJ25hbWUnKSAmJlxuICAgICAgKHZhbHVlIGluIGRvY3VtZW50IHx8IHZhbHVlIGluIGZvcm1FbGVtZW50KVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qIEFsbG93IHZhbGlkIGRhdGEtKiBhdHRyaWJ1dGVzOiBBdCBsZWFzdCBvbmUgY2hhcmFjdGVyIGFmdGVyIFwiLVwiXG4gICAgICAgIChodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9kb20uaHRtbCNlbWJlZGRpbmctY3VzdG9tLW5vbi12aXNpYmxlLWRhdGEtd2l0aC10aGUtZGF0YS0qLWF0dHJpYnV0ZXMpXG4gICAgICAgIFhNTC1jb21wYXRpYmxlIChodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9pbmZyYXN0cnVjdHVyZS5odG1sI3htbC1jb21wYXRpYmxlIGFuZCBodHRwOi8vd3d3LnczLm9yZy9UUi94bWwvI2QwZTgwNClcbiAgICAgICAgV2UgZG9uJ3QgbmVlZCB0byBjaGVjayB0aGUgdmFsdWU7IGl0J3MgYWx3YXlzIFVSSSBzYWZlLiAqL1xuICAgIGlmIChcbiAgICAgIEFMTE9XX0RBVEFfQVRUUiAmJlxuICAgICAgIUZPUkJJRF9BVFRSW2xjTmFtZV0gJiZcbiAgICAgIHJlZ0V4cFRlc3QoREFUQV9BVFRSLCBsY05hbWUpXG4gICAgKSB7XG4gICAgICAvLyBUaGlzIGF0dHJpYnV0ZSBpcyBzYWZlXG4gICAgfSBlbHNlIGlmIChBTExPV19BUklBX0FUVFIgJiYgcmVnRXhwVGVzdChBUklBX0FUVFIsIGxjTmFtZSkpIHtcbiAgICAgIC8vIFRoaXMgYXR0cmlidXRlIGlzIHNhZmVcbiAgICAgIC8qIENoZWNrIGlmIEFERF9BVFRSIGZ1bmN0aW9uIGFsbG93cyB0aGlzIGF0dHJpYnV0ZSAqL1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBFWFRSQV9FTEVNRU5UX0hBTkRMSU5HLmF0dHJpYnV0ZUNoZWNrIGluc3RhbmNlb2YgRnVuY3Rpb24gJiZcbiAgICAgIEVYVFJBX0VMRU1FTlRfSEFORExJTkcuYXR0cmlidXRlQ2hlY2sobGNOYW1lLCBsY1RhZylcbiAgICApIHtcbiAgICAgIC8vIFRoaXMgYXR0cmlidXRlIGlzIHNhZmVcbiAgICAgIC8qIE90aGVyd2lzZSwgY2hlY2sgdGhlIG5hbWUgaXMgcGVybWl0dGVkICovXG4gICAgfSBlbHNlIGlmICghQUxMT1dFRF9BVFRSW2xjTmFtZV0gfHwgRk9SQklEX0FUVFJbbGNOYW1lXSkge1xuICAgICAgaWYgKFxuICAgICAgICAvLyBGaXJzdCBjb25kaXRpb24gZG9lcyBhIHZlcnkgYmFzaWMgY2hlY2sgaWYgYSkgaXQncyBiYXNpY2FsbHkgYSB2YWxpZCBjdXN0b20gZWxlbWVudCB0YWduYW1lIEFORFxuICAgICAgICAvLyBiKSBpZiB0aGUgdGFnTmFtZSBwYXNzZXMgd2hhdGV2ZXIgdGhlIHVzZXIgaGFzIGNvbmZpZ3VyZWQgZm9yIENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVja1xuICAgICAgICAvLyBhbmQgYykgaWYgdGhlIGF0dHJpYnV0ZSBuYW1lIHBhc3NlcyB3aGF0ZXZlciB0aGUgdXNlciBoYXMgY29uZmlndXJlZCBmb3IgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcuYXR0cmlidXRlTmFtZUNoZWNrXG4gICAgICAgIChfaXNCYXNpY0N1c3RvbUVsZW1lbnQobGNUYWcpICYmXG4gICAgICAgICAgKChDVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2sgaW5zdGFuY2VvZiBSZWdFeHAgJiZcbiAgICAgICAgICAgIHJlZ0V4cFRlc3QoQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrLCBsY1RhZykpIHx8XG4gICAgICAgICAgICAoQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrIGluc3RhbmNlb2YgRnVuY3Rpb24gJiZcbiAgICAgICAgICAgICAgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrKGxjVGFnKSkpICYmXG4gICAgICAgICAgKChDVVNUT01fRUxFTUVOVF9IQU5ETElORy5hdHRyaWJ1dGVOYW1lQ2hlY2sgaW5zdGFuY2VvZiBSZWdFeHAgJiZcbiAgICAgICAgICAgIHJlZ0V4cFRlc3QoQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcuYXR0cmlidXRlTmFtZUNoZWNrLCBsY05hbWUpKSB8fFxuICAgICAgICAgICAgKENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLmF0dHJpYnV0ZU5hbWVDaGVjayBpbnN0YW5jZW9mIEZ1bmN0aW9uICYmXG4gICAgICAgICAgICAgIENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLmF0dHJpYnV0ZU5hbWVDaGVjayhsY05hbWUsIGxjVGFnKSkpKSB8fFxuICAgICAgICAvLyBBbHRlcm5hdGl2ZSwgc2Vjb25kIGNvbmRpdGlvbiBjaGVja3MgaWYgaXQncyBhbiBgaXNgLWF0dHJpYnV0ZSwgQU5EXG4gICAgICAgIC8vIHRoZSB2YWx1ZSBwYXNzZXMgd2hhdGV2ZXIgdGhlIHVzZXIgaGFzIGNvbmZpZ3VyZWQgZm9yIENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVja1xuICAgICAgICAobGNOYW1lID09PSAnaXMnICYmXG4gICAgICAgICAgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcuYWxsb3dDdXN0b21pemVkQnVpbHRJbkVsZW1lbnRzICYmXG4gICAgICAgICAgKChDVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2sgaW5zdGFuY2VvZiBSZWdFeHAgJiZcbiAgICAgICAgICAgIHJlZ0V4cFRlc3QoQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrLCB2YWx1ZSkpIHx8XG4gICAgICAgICAgICAoQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrIGluc3RhbmNlb2YgRnVuY3Rpb24gJiZcbiAgICAgICAgICAgICAgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrKHZhbHVlKSkpKVxuICAgICAgKSB7XG4gICAgICAgIC8vIElmIHVzZXIgaGFzIHN1cHBsaWVkIGEgcmVnZXhwIG9yIGZ1bmN0aW9uIGluIENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVjaywgd2UgbmVlZCB0byBhbHNvIGFsbG93IGRlcml2ZWQgY3VzdG9tIGVsZW1lbnRzIHVzaW5nIHRoZSBzYW1lIHRhZ05hbWUgdGVzdC5cbiAgICAgICAgLy8gQWRkaXRpb25hbGx5LCB3ZSBuZWVkIHRvIGFsbG93IGF0dHJpYnV0ZXMgcGFzc2luZyB0aGUgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcuYXR0cmlidXRlTmFtZUNoZWNrIHVzZXIgaGFzIGNvbmZpZ3VyZWQsIGFzIGN1c3RvbSBlbGVtZW50cyBjYW4gZGVmaW5lIHRoZXNlIGF0IHRoZWlyIG93biBkaXNjcmV0aW9uLlxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgLyogQ2hlY2sgdmFsdWUgaXMgc2FmZS4gRmlyc3QsIGlzIGF0dHIgaW5lcnQ/IElmIHNvLCBpcyBzYWZlICovXG4gICAgfSBlbHNlIGlmIChVUklfU0FGRV9BVFRSSUJVVEVTW2xjTmFtZV0pIHtcbiAgICAgIC8vIFRoaXMgYXR0cmlidXRlIGlzIHNhZmVcbiAgICAgIC8qIENoZWNrIG5vIHNjcmlwdCwgZGF0YSBvciB1bmtub3duIHBvc3NpYmx5IHVuc2FmZSBVUklcbiAgICAgICAgdW5sZXNzIHdlIGtub3cgVVJJIHZhbHVlcyBhcmUgc2FmZSBmb3IgdGhhdCBhdHRyaWJ1dGUgKi9cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgcmVnRXhwVGVzdChJU19BTExPV0VEX1VSSSwgc3RyaW5nUmVwbGFjZSh2YWx1ZSwgQVRUUl9XSElURVNQQUNFLCAnJykpXG4gICAgKSB7XG4gICAgICAvLyBUaGlzIGF0dHJpYnV0ZSBpcyBzYWZlXG4gICAgICAvKiBLZWVwIGltYWdlIGRhdGEgVVJJcyBhbGl2ZSBpZiBzcmMveGxpbms6aHJlZiBpcyBhbGxvd2VkICovXG4gICAgICAvKiBGdXJ0aGVyIHByZXZlbnQgZ2FkZ2V0IFhTUyBmb3IgZHluYW1pY2FsbHkgYnVpbHQgc2NyaXB0IHRhZ3MgKi9cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgKGxjTmFtZSA9PT0gJ3NyYycgfHwgbGNOYW1lID09PSAneGxpbms6aHJlZicgfHwgbGNOYW1lID09PSAnaHJlZicpICYmXG4gICAgICBsY1RhZyAhPT0gJ3NjcmlwdCcgJiZcbiAgICAgIHN0cmluZ0luZGV4T2YodmFsdWUsICdkYXRhOicpID09PSAwICYmXG4gICAgICBEQVRBX1VSSV9UQUdTW2xjVGFnXVxuICAgICkge1xuICAgICAgLy8gVGhpcyBhdHRyaWJ1dGUgaXMgc2FmZVxuICAgICAgLyogQWxsb3cgdW5rbm93biBwcm90b2NvbHM6IFRoaXMgcHJvdmlkZXMgc3VwcG9ydCBmb3IgbGlua3MgdGhhdFxuICAgICAgICBhcmUgaGFuZGxlZCBieSBwcm90b2NvbCBoYW5kbGVycyB3aGljaCBtYXkgYmUgdW5rbm93biBhaGVhZCBvZlxuICAgICAgICB0aW1lLCBlLmcuIGZiOiwgc3BvdGlmeTogKi9cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgQUxMT1dfVU5LTk9XTl9QUk9UT0NPTFMgJiZcbiAgICAgICFyZWdFeHBUZXN0KElTX1NDUklQVF9PUl9EQVRBLCBzdHJpbmdSZXBsYWNlKHZhbHVlLCBBVFRSX1dISVRFU1BBQ0UsICcnKSlcbiAgICApIHtcbiAgICAgIC8vIFRoaXMgYXR0cmlidXRlIGlzIHNhZmVcbiAgICAgIC8qIENoZWNrIGZvciBiaW5hcnkgYXR0cmlidXRlcyAqL1xuICAgIH0gZWxzZSBpZiAodmFsdWUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQmluYXJ5IGF0dHJpYnV0ZXMgYXJlIHNhZmUgYXQgdGhpcyBwb2ludFxuICAgICAgLyogQW55dGhpbmcgZWxzZSwgcHJlc3VtZSB1bnNhZmUsIGRvIG5vdCBhZGQgaXQgYmFjayAqL1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBfaXNCYXNpY0N1c3RvbUVsZW1lbnRcbiAgICogY2hlY2tzIGlmIGF0IGxlYXN0IG9uZSBkYXNoIGlzIGluY2x1ZGVkIGluIHRhZ05hbWUsIGFuZCBpdCdzIG5vdCB0aGUgZmlyc3QgY2hhclxuICAgKiBmb3IgbW9yZSBzb3BoaXN0aWNhdGVkIGNoZWNraW5nIHNlZSBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL3ZhbGlkYXRlLWVsZW1lbnQtbmFtZVxuICAgKlxuICAgKiBAcGFyYW0gdGFnTmFtZSBuYW1lIG9mIHRoZSB0YWcgb2YgdGhlIG5vZGUgdG8gc2FuaXRpemVcbiAgICogQHJldHVybnMgUmV0dXJucyB0cnVlIGlmIHRoZSB0YWcgbmFtZSBtZWV0cyB0aGUgYmFzaWMgY3JpdGVyaWEgZm9yIGEgY3VzdG9tIGVsZW1lbnQsIG90aGVyd2lzZSBmYWxzZS5cbiAgICovXG4gIGNvbnN0IF9pc0Jhc2ljQ3VzdG9tRWxlbWVudCA9IGZ1bmN0aW9uICh0YWdOYW1lOiBzdHJpbmcpOiBSZWdFeHBNYXRjaEFycmF5IHtcbiAgICByZXR1cm4gdGFnTmFtZSAhPT0gJ2Fubm90YXRpb24teG1sJyAmJiBzdHJpbmdNYXRjaCh0YWdOYW1lLCBDVVNUT01fRUxFTUVOVCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIF9zYW5pdGl6ZUF0dHJpYnV0ZXNcbiAgICpcbiAgICogQHByb3RlY3QgYXR0cmlidXRlc1xuICAgKiBAcHJvdGVjdCBub2RlTmFtZVxuICAgKiBAcHJvdGVjdCByZW1vdmVBdHRyaWJ1dGVcbiAgICogQHByb3RlY3Qgc2V0QXR0cmlidXRlXG4gICAqXG4gICAqIEBwYXJhbSBjdXJyZW50Tm9kZSB0byBzYW5pdGl6ZVxuICAgKi9cbiAgY29uc3QgX3Nhbml0aXplQXR0cmlidXRlcyA9IGZ1bmN0aW9uIChjdXJyZW50Tm9kZTogRWxlbWVudCk6IHZvaWQge1xuICAgIC8qIEV4ZWN1dGUgYSBob29rIGlmIHByZXNlbnQgKi9cbiAgICBfZXhlY3V0ZUhvb2tzKGhvb2tzLmJlZm9yZVNhbml0aXplQXR0cmlidXRlcywgY3VycmVudE5vZGUsIG51bGwpO1xuXG4gICAgY29uc3QgeyBhdHRyaWJ1dGVzIH0gPSBjdXJyZW50Tm9kZTtcblxuICAgIC8qIENoZWNrIGlmIHdlIGhhdmUgYXR0cmlidXRlczsgaWYgbm90IHdlIG1pZ2h0IGhhdmUgYSB0ZXh0IG5vZGUgKi9cbiAgICBpZiAoIWF0dHJpYnV0ZXMgfHwgX2lzQ2xvYmJlcmVkKGN1cnJlbnROb2RlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGhvb2tFdmVudCA9IHtcbiAgICAgIGF0dHJOYW1lOiAnJyxcbiAgICAgIGF0dHJWYWx1ZTogJycsXG4gICAgICBrZWVwQXR0cjogdHJ1ZSxcbiAgICAgIGFsbG93ZWRBdHRyaWJ1dGVzOiBBTExPV0VEX0FUVFIsXG4gICAgICBmb3JjZUtlZXBBdHRyOiB1bmRlZmluZWQsXG4gICAgfTtcbiAgICBsZXQgbCA9IGF0dHJpYnV0ZXMubGVuZ3RoO1xuXG4gICAgLyogR28gYmFja3dhcmRzIG92ZXIgYWxsIGF0dHJpYnV0ZXM7IHNhZmVseSByZW1vdmUgYmFkIG9uZXMgKi9cbiAgICB3aGlsZSAobC0tKSB7XG4gICAgICBjb25zdCBhdHRyID0gYXR0cmlidXRlc1tsXTtcbiAgICAgIGNvbnN0IHsgbmFtZSwgbmFtZXNwYWNlVVJJLCB2YWx1ZTogYXR0clZhbHVlIH0gPSBhdHRyO1xuICAgICAgY29uc3QgbGNOYW1lID0gdHJhbnNmb3JtQ2FzZUZ1bmMobmFtZSk7XG5cbiAgICAgIGNvbnN0IGluaXRWYWx1ZSA9IGF0dHJWYWx1ZTtcbiAgICAgIGxldCB2YWx1ZSA9IG5hbWUgPT09ICd2YWx1ZScgPyBpbml0VmFsdWUgOiBzdHJpbmdUcmltKGluaXRWYWx1ZSk7XG5cbiAgICAgIC8qIEV4ZWN1dGUgYSBob29rIGlmIHByZXNlbnQgKi9cbiAgICAgIGhvb2tFdmVudC5hdHRyTmFtZSA9IGxjTmFtZTtcbiAgICAgIGhvb2tFdmVudC5hdHRyVmFsdWUgPSB2YWx1ZTtcbiAgICAgIGhvb2tFdmVudC5rZWVwQXR0ciA9IHRydWU7XG4gICAgICBob29rRXZlbnQuZm9yY2VLZWVwQXR0ciA9IHVuZGVmaW5lZDsgLy8gQWxsb3dzIGRldmVsb3BlcnMgdG8gc2VlIHRoaXMgaXMgYSBwcm9wZXJ0eSB0aGV5IGNhbiBzZXRcbiAgICAgIF9leGVjdXRlSG9va3MoaG9va3MudXBvblNhbml0aXplQXR0cmlidXRlLCBjdXJyZW50Tm9kZSwgaG9va0V2ZW50KTtcbiAgICAgIHZhbHVlID0gaG9va0V2ZW50LmF0dHJWYWx1ZTtcblxuICAgICAgLyogRnVsbCBET00gQ2xvYmJlcmluZyBwcm90ZWN0aW9uIHZpYSBuYW1lc3BhY2UgaXNvbGF0aW9uLFxuICAgICAgICogUHJlZml4IGlkIGFuZCBuYW1lIGF0dHJpYnV0ZXMgd2l0aCBgdXNlci1jb250ZW50LWBcbiAgICAgICAqL1xuICAgICAgaWYgKFNBTklUSVpFX05BTUVEX1BST1BTICYmIChsY05hbWUgPT09ICdpZCcgfHwgbGNOYW1lID09PSAnbmFtZScpKSB7XG4gICAgICAgIC8vIFJlbW92ZSB0aGUgYXR0cmlidXRlIHdpdGggdGhpcyB2YWx1ZVxuICAgICAgICBfcmVtb3ZlQXR0cmlidXRlKG5hbWUsIGN1cnJlbnROb2RlKTtcblxuICAgICAgICAvLyBQcmVmaXggdGhlIHZhbHVlIGFuZCBsYXRlciByZS1jcmVhdGUgdGhlIGF0dHJpYnV0ZSB3aXRoIHRoZSBzYW5pdGl6ZWQgdmFsdWVcbiAgICAgICAgdmFsdWUgPSBTQU5JVElaRV9OQU1FRF9QUk9QU19QUkVGSVggKyB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgLyogV29yayBhcm91bmQgYSBzZWN1cml0eSBpc3N1ZSB3aXRoIGNvbW1lbnRzIGluc2lkZSBhdHRyaWJ1dGVzICovXG4gICAgICBpZiAoXG4gICAgICAgIFNBRkVfRk9SX1hNTCAmJlxuICAgICAgICByZWdFeHBUZXN0KFxuICAgICAgICAgIC8oKC0tIT98XSk+KXw8XFwvKHN0eWxlfHNjcmlwdHx0aXRsZXx4bXB8dGV4dGFyZWF8bm9zY3JpcHR8aWZyYW1lfG5vZW1iZWR8bm9mcmFtZXMpL2ksXG4gICAgICAgICAgdmFsdWVcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIF9yZW1vdmVBdHRyaWJ1dGUobmFtZSwgY3VycmVudE5vZGUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLyogTWFrZSBzdXJlIHdlIGNhbm5vdCBlYXNpbHkgdXNlIGFuaW1hdGVkIGhyZWZzLCBldmVuIGlmIGFuaW1hdGlvbnMgYXJlIGFsbG93ZWQgKi9cbiAgICAgIGlmIChsY05hbWUgPT09ICdhdHRyaWJ1dGVuYW1lJyAmJiBzdHJpbmdNYXRjaCh2YWx1ZSwgJ2hyZWYnKSkge1xuICAgICAgICBfcmVtb3ZlQXR0cmlidXRlKG5hbWUsIGN1cnJlbnROb2RlKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8qIERpZCB0aGUgaG9va3MgYXBwcm92ZSBvZiB0aGUgYXR0cmlidXRlPyAqL1xuICAgICAgaWYgKGhvb2tFdmVudC5mb3JjZUtlZXBBdHRyKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvKiBEaWQgdGhlIGhvb2tzIGFwcHJvdmUgb2YgdGhlIGF0dHJpYnV0ZT8gKi9cbiAgICAgIGlmICghaG9va0V2ZW50LmtlZXBBdHRyKSB7XG4gICAgICAgIF9yZW1vdmVBdHRyaWJ1dGUobmFtZSwgY3VycmVudE5vZGUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLyogV29yayBhcm91bmQgYSBzZWN1cml0eSBpc3N1ZSBpbiBqUXVlcnkgMy4wICovXG4gICAgICBpZiAoIUFMTE9XX1NFTEZfQ0xPU0VfSU5fQVRUUiAmJiByZWdFeHBUZXN0KC9cXC8+L2ksIHZhbHVlKSkge1xuICAgICAgICBfcmVtb3ZlQXR0cmlidXRlKG5hbWUsIGN1cnJlbnROb2RlKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8qIFNhbml0aXplIGF0dHJpYnV0ZSBjb250ZW50IHRvIGJlIHRlbXBsYXRlLXNhZmUgKi9cbiAgICAgIGlmIChTQUZFX0ZPUl9URU1QTEFURVMpIHtcbiAgICAgICAgYXJyYXlGb3JFYWNoKFtNVVNUQUNIRV9FWFBSLCBFUkJfRVhQUiwgVE1QTElUX0VYUFJdLCAoZXhwcjogUmVnRXhwKSA9PiB7XG4gICAgICAgICAgdmFsdWUgPSBzdHJpbmdSZXBsYWNlKHZhbHVlLCBleHByLCAnICcpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLyogSXMgYHZhbHVlYCB2YWxpZCBmb3IgdGhpcyBhdHRyaWJ1dGU/ICovXG4gICAgICBjb25zdCBsY1RhZyA9IHRyYW5zZm9ybUNhc2VGdW5jKGN1cnJlbnROb2RlLm5vZGVOYW1lKTtcbiAgICAgIGlmICghX2lzVmFsaWRBdHRyaWJ1dGUobGNUYWcsIGxjTmFtZSwgdmFsdWUpKSB7XG4gICAgICAgIF9yZW1vdmVBdHRyaWJ1dGUobmFtZSwgY3VycmVudE5vZGUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLyogSGFuZGxlIGF0dHJpYnV0ZXMgdGhhdCByZXF1aXJlIFRydXN0ZWQgVHlwZXMgKi9cbiAgICAgIGlmIChcbiAgICAgICAgdHJ1c3RlZFR5cGVzUG9saWN5ICYmXG4gICAgICAgIHR5cGVvZiB0cnVzdGVkVHlwZXMgPT09ICdvYmplY3QnICYmXG4gICAgICAgIHR5cGVvZiB0cnVzdGVkVHlwZXMuZ2V0QXR0cmlidXRlVHlwZSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgKSB7XG4gICAgICAgIGlmIChuYW1lc3BhY2VVUkkpIHtcbiAgICAgICAgICAvKiBOYW1lc3BhY2VzIGFyZSBub3QgeWV0IHN1cHBvcnRlZCwgc2VlIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTEzMDUyOTMgKi9cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzd2l0Y2ggKHRydXN0ZWRUeXBlcy5nZXRBdHRyaWJ1dGVUeXBlKGxjVGFnLCBsY05hbWUpKSB7XG4gICAgICAgICAgICBjYXNlICdUcnVzdGVkSFRNTCc6IHtcbiAgICAgICAgICAgICAgdmFsdWUgPSB0cnVzdGVkVHlwZXNQb2xpY3kuY3JlYXRlSFRNTCh2YWx1ZSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlICdUcnVzdGVkU2NyaXB0VVJMJzoge1xuICAgICAgICAgICAgICB2YWx1ZSA9IHRydXN0ZWRUeXBlc1BvbGljeS5jcmVhdGVTY3JpcHRVUkwodmFsdWUpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLyogSGFuZGxlIGludmFsaWQgZGF0YS0qIGF0dHJpYnV0ZSBzZXQgYnkgdHJ5LWNhdGNoaW5nIGl0ICovXG4gICAgICBpZiAodmFsdWUgIT09IGluaXRWYWx1ZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkpIHtcbiAgICAgICAgICAgIGN1cnJlbnROb2RlLnNldEF0dHJpYnV0ZU5TKG5hbWVzcGFjZVVSSSwgbmFtZSwgdmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvKiBGYWxsYmFjayB0byBzZXRBdHRyaWJ1dGUoKSBmb3IgYnJvd3Nlci11bnJlY29nbml6ZWQgbmFtZXNwYWNlcyBlLmcuIFwieC1zY2hlbWFcIi4gKi9cbiAgICAgICAgICAgIGN1cnJlbnROb2RlLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKF9pc0Nsb2JiZXJlZChjdXJyZW50Tm9kZSkpIHtcbiAgICAgICAgICAgIF9mb3JjZVJlbW92ZShjdXJyZW50Tm9kZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFycmF5UG9wKERPTVB1cmlmeS5yZW1vdmVkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgICBfcmVtb3ZlQXR0cmlidXRlKG5hbWUsIGN1cnJlbnROb2RlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qIEV4ZWN1dGUgYSBob29rIGlmIHByZXNlbnQgKi9cbiAgICBfZXhlY3V0ZUhvb2tzKGhvb2tzLmFmdGVyU2FuaXRpemVBdHRyaWJ1dGVzLCBjdXJyZW50Tm9kZSwgbnVsbCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIF9zYW5pdGl6ZVNoYWRvd0RPTVxuICAgKlxuICAgKiBAcGFyYW0gZnJhZ21lbnQgdG8gaXRlcmF0ZSBvdmVyIHJlY3Vyc2l2ZWx5XG4gICAqL1xuICBjb25zdCBfc2FuaXRpemVTaGFkb3dET00gPSBmdW5jdGlvbiAoZnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQpOiB2b2lkIHtcbiAgICBsZXQgc2hhZG93Tm9kZSA9IG51bGw7XG4gICAgY29uc3Qgc2hhZG93SXRlcmF0b3IgPSBfY3JlYXRlTm9kZUl0ZXJhdG9yKGZyYWdtZW50KTtcblxuICAgIC8qIEV4ZWN1dGUgYSBob29rIGlmIHByZXNlbnQgKi9cbiAgICBfZXhlY3V0ZUhvb2tzKGhvb2tzLmJlZm9yZVNhbml0aXplU2hhZG93RE9NLCBmcmFnbWVudCwgbnVsbCk7XG5cbiAgICB3aGlsZSAoKHNoYWRvd05vZGUgPSBzaGFkb3dJdGVyYXRvci5uZXh0Tm9kZSgpKSkge1xuICAgICAgLyogRXhlY3V0ZSBhIGhvb2sgaWYgcHJlc2VudCAqL1xuICAgICAgX2V4ZWN1dGVIb29rcyhob29rcy51cG9uU2FuaXRpemVTaGFkb3dOb2RlLCBzaGFkb3dOb2RlLCBudWxsKTtcblxuICAgICAgLyogU2FuaXRpemUgdGFncyBhbmQgZWxlbWVudHMgKi9cbiAgICAgIF9zYW5pdGl6ZUVsZW1lbnRzKHNoYWRvd05vZGUpO1xuXG4gICAgICAvKiBDaGVjayBhdHRyaWJ1dGVzIG5leHQgKi9cbiAgICAgIF9zYW5pdGl6ZUF0dHJpYnV0ZXMoc2hhZG93Tm9kZSk7XG5cbiAgICAgIC8qIERlZXAgc2hhZG93IERPTSBkZXRlY3RlZCAqL1xuICAgICAgaWYgKHNoYWRvd05vZGUuY29udGVudCBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpIHtcbiAgICAgICAgX3Nhbml0aXplU2hhZG93RE9NKHNoYWRvd05vZGUuY29udGVudCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogRXhlY3V0ZSBhIGhvb2sgaWYgcHJlc2VudCAqL1xuICAgIF9leGVjdXRlSG9va3MoaG9va3MuYWZ0ZXJTYW5pdGl6ZVNoYWRvd0RPTSwgZnJhZ21lbnQsIG51bGwpO1xuICB9O1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG4gIERPTVB1cmlmeS5zYW5pdGl6ZSA9IGZ1bmN0aW9uIChkaXJ0eSwgY2ZnID0ge30pIHtcbiAgICBsZXQgYm9keSA9IG51bGw7XG4gICAgbGV0IGltcG9ydGVkTm9kZSA9IG51bGw7XG4gICAgbGV0IGN1cnJlbnROb2RlID0gbnVsbDtcbiAgICBsZXQgcmV0dXJuTm9kZSA9IG51bGw7XG4gICAgLyogTWFrZSBzdXJlIHdlIGhhdmUgYSBzdHJpbmcgdG8gc2FuaXRpemUuXG4gICAgICBETyBOT1QgcmV0dXJuIGVhcmx5LCBhcyB0aGlzIHdpbGwgcmV0dXJuIHRoZSB3cm9uZyB0eXBlIGlmXG4gICAgICB0aGUgdXNlciBoYXMgcmVxdWVzdGVkIGEgRE9NIG9iamVjdCByYXRoZXIgdGhhbiBhIHN0cmluZyAqL1xuICAgIElTX0VNUFRZX0lOUFVUID0gIWRpcnR5O1xuICAgIGlmIChJU19FTVBUWV9JTlBVVCkge1xuICAgICAgZGlydHkgPSAnPCEtLT4nO1xuICAgIH1cblxuICAgIC8qIFN0cmluZ2lmeSwgaW4gY2FzZSBkaXJ0eSBpcyBhbiBvYmplY3QgKi9cbiAgICBpZiAodHlwZW9mIGRpcnR5ICE9PSAnc3RyaW5nJyAmJiAhX2lzTm9kZShkaXJ0eSkpIHtcbiAgICAgIGlmICh0eXBlb2YgZGlydHkudG9TdHJpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZGlydHkgPSBkaXJ0eS50b1N0cmluZygpO1xuICAgICAgICBpZiAodHlwZW9mIGRpcnR5ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IHR5cGVFcnJvckNyZWF0ZSgnZGlydHkgaXMgbm90IGEgc3RyaW5nLCBhYm9ydGluZycpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyB0eXBlRXJyb3JDcmVhdGUoJ3RvU3RyaW5nIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogUmV0dXJuIGRpcnR5IEhUTUwgaWYgRE9NUHVyaWZ5IGNhbm5vdCBydW4gKi9cbiAgICBpZiAoIURPTVB1cmlmeS5pc1N1cHBvcnRlZCkge1xuICAgICAgcmV0dXJuIGRpcnR5O1xuICAgIH1cblxuICAgIC8qIEFzc2lnbiBjb25maWcgdmFycyAqL1xuICAgIGlmICghU0VUX0NPTkZJRykge1xuICAgICAgX3BhcnNlQ29uZmlnKGNmZyk7XG4gICAgfVxuXG4gICAgLyogQ2xlYW4gdXAgcmVtb3ZlZCBlbGVtZW50cyAqL1xuICAgIERPTVB1cmlmeS5yZW1vdmVkID0gW107XG5cbiAgICAvKiBDaGVjayBpZiBkaXJ0eSBpcyBjb3JyZWN0bHkgdHlwZWQgZm9yIElOX1BMQUNFICovXG4gICAgaWYgKHR5cGVvZiBkaXJ0eSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIElOX1BMQUNFID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKElOX1BMQUNFKSB7XG4gICAgICAvKiBEbyBzb21lIGVhcmx5IHByZS1zYW5pdGl6YXRpb24gdG8gYXZvaWQgdW5zYWZlIHJvb3Qgbm9kZXMgKi9cbiAgICAgIGlmICgoZGlydHkgYXMgTm9kZSkubm9kZU5hbWUpIHtcbiAgICAgICAgY29uc3QgdGFnTmFtZSA9IHRyYW5zZm9ybUNhc2VGdW5jKChkaXJ0eSBhcyBOb2RlKS5ub2RlTmFtZSk7XG4gICAgICAgIGlmICghQUxMT1dFRF9UQUdTW3RhZ05hbWVdIHx8IEZPUkJJRF9UQUdTW3RhZ05hbWVdKSB7XG4gICAgICAgICAgdGhyb3cgdHlwZUVycm9yQ3JlYXRlKFxuICAgICAgICAgICAgJ3Jvb3Qgbm9kZSBpcyBmb3JiaWRkZW4gYW5kIGNhbm5vdCBiZSBzYW5pdGl6ZWQgaW4tcGxhY2UnXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZGlydHkgaW5zdGFuY2VvZiBOb2RlKSB7XG4gICAgICAvKiBJZiBkaXJ0eSBpcyBhIERPTSBlbGVtZW50LCBhcHBlbmQgdG8gYW4gZW1wdHkgZG9jdW1lbnQgdG8gYXZvaWRcbiAgICAgICAgIGVsZW1lbnRzIGJlaW5nIHN0cmlwcGVkIGJ5IHRoZSBwYXJzZXIgKi9cbiAgICAgIGJvZHkgPSBfaW5pdERvY3VtZW50KCc8IS0tLS0+Jyk7XG4gICAgICBpbXBvcnRlZE5vZGUgPSBib2R5Lm93bmVyRG9jdW1lbnQuaW1wb3J0Tm9kZShkaXJ0eSwgdHJ1ZSk7XG4gICAgICBpZiAoXG4gICAgICAgIGltcG9ydGVkTm9kZS5ub2RlVHlwZSA9PT0gTk9ERV9UWVBFLmVsZW1lbnQgJiZcbiAgICAgICAgaW1wb3J0ZWROb2RlLm5vZGVOYW1lID09PSAnQk9EWSdcbiAgICAgICkge1xuICAgICAgICAvKiBOb2RlIGlzIGFscmVhZHkgYSBib2R5LCB1c2UgYXMgaXMgKi9cbiAgICAgICAgYm9keSA9IGltcG9ydGVkTm9kZTtcbiAgICAgIH0gZWxzZSBpZiAoaW1wb3J0ZWROb2RlLm5vZGVOYW1lID09PSAnSFRNTCcpIHtcbiAgICAgICAgYm9keSA9IGltcG9ydGVkTm9kZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL3ByZWZlci1kb20tbm9kZS1hcHBlbmRcbiAgICAgICAgYm9keS5hcHBlbmRDaGlsZChpbXBvcnRlZE5vZGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvKiBFeGl0IGRpcmVjdGx5IGlmIHdlIGhhdmUgbm90aGluZyB0byBkbyAqL1xuICAgICAgaWYgKFxuICAgICAgICAhUkVUVVJOX0RPTSAmJlxuICAgICAgICAhU0FGRV9GT1JfVEVNUExBVEVTICYmXG4gICAgICAgICFXSE9MRV9ET0NVTUVOVCAmJlxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9wcmVmZXItaW5jbHVkZXNcbiAgICAgICAgZGlydHkuaW5kZXhPZignPCcpID09PSAtMVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0cnVzdGVkVHlwZXNQb2xpY3kgJiYgUkVUVVJOX1RSVVNURURfVFlQRVxuICAgICAgICAgID8gdHJ1c3RlZFR5cGVzUG9saWN5LmNyZWF0ZUhUTUwoZGlydHkpXG4gICAgICAgICAgOiBkaXJ0eTtcbiAgICAgIH1cblxuICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgZG9jdW1lbnQgdG8gd29yayBvbiAqL1xuICAgICAgYm9keSA9IF9pbml0RG9jdW1lbnQoZGlydHkpO1xuXG4gICAgICAvKiBDaGVjayB3ZSBoYXZlIGEgRE9NIG5vZGUgZnJvbSB0aGUgZGF0YSAqL1xuICAgICAgaWYgKCFib2R5KSB7XG4gICAgICAgIHJldHVybiBSRVRVUk5fRE9NID8gbnVsbCA6IFJFVFVSTl9UUlVTVEVEX1RZUEUgPyBlbXB0eUhUTUwgOiAnJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBSZW1vdmUgZmlyc3QgZWxlbWVudCBub2RlIChvdXJzKSBpZiBGT1JDRV9CT0RZIGlzIHNldCAqL1xuICAgIGlmIChib2R5ICYmIEZPUkNFX0JPRFkpIHtcbiAgICAgIF9mb3JjZVJlbW92ZShib2R5LmZpcnN0Q2hpbGQpO1xuICAgIH1cblxuICAgIC8qIEdldCBub2RlIGl0ZXJhdG9yICovXG4gICAgY29uc3Qgbm9kZUl0ZXJhdG9yID0gX2NyZWF0ZU5vZGVJdGVyYXRvcihJTl9QTEFDRSA/IGRpcnR5IDogYm9keSk7XG5cbiAgICAvKiBOb3cgc3RhcnQgaXRlcmF0aW5nIG92ZXIgdGhlIGNyZWF0ZWQgZG9jdW1lbnQgKi9cbiAgICB3aGlsZSAoKGN1cnJlbnROb2RlID0gbm9kZUl0ZXJhdG9yLm5leHROb2RlKCkpKSB7XG4gICAgICAvKiBTYW5pdGl6ZSB0YWdzIGFuZCBlbGVtZW50cyAqL1xuICAgICAgX3Nhbml0aXplRWxlbWVudHMoY3VycmVudE5vZGUpO1xuXG4gICAgICAvKiBDaGVjayBhdHRyaWJ1dGVzIG5leHQgKi9cbiAgICAgIF9zYW5pdGl6ZUF0dHJpYnV0ZXMoY3VycmVudE5vZGUpO1xuXG4gICAgICAvKiBTaGFkb3cgRE9NIGRldGVjdGVkLCBzYW5pdGl6ZSBpdCAqL1xuICAgICAgaWYgKGN1cnJlbnROb2RlLmNvbnRlbnQgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KSB7XG4gICAgICAgIF9zYW5pdGl6ZVNoYWRvd0RPTShjdXJyZW50Tm9kZS5jb250ZW50KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBJZiB3ZSBzYW5pdGl6ZWQgYGRpcnR5YCBpbi1wbGFjZSwgcmV0dXJuIGl0LiAqL1xuICAgIGlmIChJTl9QTEFDRSkge1xuICAgICAgcmV0dXJuIGRpcnR5O1xuICAgIH1cblxuICAgIC8qIFJldHVybiBzYW5pdGl6ZWQgc3RyaW5nIG9yIERPTSAqL1xuICAgIGlmIChSRVRVUk5fRE9NKSB7XG4gICAgICBpZiAoUkVUVVJOX0RPTV9GUkFHTUVOVCkge1xuICAgICAgICByZXR1cm5Ob2RlID0gY3JlYXRlRG9jdW1lbnRGcmFnbWVudC5jYWxsKGJvZHkub3duZXJEb2N1bWVudCk7XG5cbiAgICAgICAgd2hpbGUgKGJvZHkuZmlyc3RDaGlsZCkge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL3ByZWZlci1kb20tbm9kZS1hcHBlbmRcbiAgICAgICAgICByZXR1cm5Ob2RlLmFwcGVuZENoaWxkKGJvZHkuZmlyc3RDaGlsZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybk5vZGUgPSBib2R5O1xuICAgICAgfVxuXG4gICAgICBpZiAoQUxMT1dFRF9BVFRSLnNoYWRvd3Jvb3QgfHwgQUxMT1dFRF9BVFRSLnNoYWRvd3Jvb3Rtb2RlKSB7XG4gICAgICAgIC8qXG4gICAgICAgICAgQWRvcHROb2RlKCkgaXMgbm90IHVzZWQgYmVjYXVzZSBpbnRlcm5hbCBzdGF0ZSBpcyBub3QgcmVzZXRcbiAgICAgICAgICAoZS5nLiB0aGUgcGFzdCBuYW1lcyBtYXAgb2YgYSBIVE1MRm9ybUVsZW1lbnQpLCB0aGlzIGlzIHNhZmVcbiAgICAgICAgICBpbiB0aGVvcnkgYnV0IHdlIHdvdWxkIHJhdGhlciBub3QgcmlzayBhbm90aGVyIGF0dGFjayB2ZWN0b3IuXG4gICAgICAgICAgVGhlIHN0YXRlIHRoYXQgaXMgY2xvbmVkIGJ5IGltcG9ydE5vZGUoKSBpcyBleHBsaWNpdGx5IGRlZmluZWRcbiAgICAgICAgICBieSB0aGUgc3BlY3MuXG4gICAgICAgICovXG4gICAgICAgIHJldHVybk5vZGUgPSBpbXBvcnROb2RlLmNhbGwob3JpZ2luYWxEb2N1bWVudCwgcmV0dXJuTm9kZSwgdHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXR1cm5Ob2RlO1xuICAgIH1cblxuICAgIGxldCBzZXJpYWxpemVkSFRNTCA9IFdIT0xFX0RPQ1VNRU5UID8gYm9keS5vdXRlckhUTUwgOiBib2R5LmlubmVySFRNTDtcblxuICAgIC8qIFNlcmlhbGl6ZSBkb2N0eXBlIGlmIGFsbG93ZWQgKi9cbiAgICBpZiAoXG4gICAgICBXSE9MRV9ET0NVTUVOVCAmJlxuICAgICAgQUxMT1dFRF9UQUdTWychZG9jdHlwZSddICYmXG4gICAgICBib2R5Lm93bmVyRG9jdW1lbnQgJiZcbiAgICAgIGJvZHkub3duZXJEb2N1bWVudC5kb2N0eXBlICYmXG4gICAgICBib2R5Lm93bmVyRG9jdW1lbnQuZG9jdHlwZS5uYW1lICYmXG4gICAgICByZWdFeHBUZXN0KEVYUFJFU1NJT05TLkRPQ1RZUEVfTkFNRSwgYm9keS5vd25lckRvY3VtZW50LmRvY3R5cGUubmFtZSlcbiAgICApIHtcbiAgICAgIHNlcmlhbGl6ZWRIVE1MID1cbiAgICAgICAgJzwhRE9DVFlQRSAnICsgYm9keS5vd25lckRvY3VtZW50LmRvY3R5cGUubmFtZSArICc+XFxuJyArIHNlcmlhbGl6ZWRIVE1MO1xuICAgIH1cblxuICAgIC8qIFNhbml0aXplIGZpbmFsIHN0cmluZyB0ZW1wbGF0ZS1zYWZlICovXG4gICAgaWYgKFNBRkVfRk9SX1RFTVBMQVRFUykge1xuICAgICAgYXJyYXlGb3JFYWNoKFtNVVNUQUNIRV9FWFBSLCBFUkJfRVhQUiwgVE1QTElUX0VYUFJdLCAoZXhwcjogUmVnRXhwKSA9PiB7XG4gICAgICAgIHNlcmlhbGl6ZWRIVE1MID0gc3RyaW5nUmVwbGFjZShzZXJpYWxpemVkSFRNTCwgZXhwciwgJyAnKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVzdGVkVHlwZXNQb2xpY3kgJiYgUkVUVVJOX1RSVVNURURfVFlQRVxuICAgICAgPyB0cnVzdGVkVHlwZXNQb2xpY3kuY3JlYXRlSFRNTChzZXJpYWxpemVkSFRNTClcbiAgICAgIDogc2VyaWFsaXplZEhUTUw7XG4gIH07XG5cbiAgRE9NUHVyaWZ5LnNldENvbmZpZyA9IGZ1bmN0aW9uIChjZmcgPSB7fSkge1xuICAgIF9wYXJzZUNvbmZpZyhjZmcpO1xuICAgIFNFVF9DT05GSUcgPSB0cnVlO1xuICB9O1xuXG4gIERPTVB1cmlmeS5jbGVhckNvbmZpZyA9IGZ1bmN0aW9uICgpIHtcbiAgICBDT05GSUcgPSBudWxsO1xuICAgIFNFVF9DT05GSUcgPSBmYWxzZTtcbiAgfTtcblxuICBET01QdXJpZnkuaXNWYWxpZEF0dHJpYnV0ZSA9IGZ1bmN0aW9uICh0YWcsIGF0dHIsIHZhbHVlKSB7XG4gICAgLyogSW5pdGlhbGl6ZSBzaGFyZWQgY29uZmlnIHZhcnMgaWYgbmVjZXNzYXJ5LiAqL1xuICAgIGlmICghQ09ORklHKSB7XG4gICAgICBfcGFyc2VDb25maWcoe30pO1xuICAgIH1cblxuICAgIGNvbnN0IGxjVGFnID0gdHJhbnNmb3JtQ2FzZUZ1bmModGFnKTtcbiAgICBjb25zdCBsY05hbWUgPSB0cmFuc2Zvcm1DYXNlRnVuYyhhdHRyKTtcbiAgICByZXR1cm4gX2lzVmFsaWRBdHRyaWJ1dGUobGNUYWcsIGxjTmFtZSwgdmFsdWUpO1xuICB9O1xuXG4gIERPTVB1cmlmeS5hZGRIb29rID0gZnVuY3Rpb24gKFxuICAgIGVudHJ5UG9pbnQ6IGtleW9mIEhvb2tzTWFwLFxuICAgIGhvb2tGdW5jdGlvbjogSG9va0Z1bmN0aW9uXG4gICkge1xuICAgIGlmICh0eXBlb2YgaG9va0Z1bmN0aW9uICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXJyYXlQdXNoKGhvb2tzW2VudHJ5UG9pbnRdLCBob29rRnVuY3Rpb24pO1xuICB9O1xuXG4gIERPTVB1cmlmeS5yZW1vdmVIb29rID0gZnVuY3Rpb24gKFxuICAgIGVudHJ5UG9pbnQ6IGtleW9mIEhvb2tzTWFwLFxuICAgIGhvb2tGdW5jdGlvbjogSG9va0Z1bmN0aW9uXG4gICkge1xuICAgIGlmIChob29rRnVuY3Rpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgaW5kZXggPSBhcnJheUxhc3RJbmRleE9mKGhvb2tzW2VudHJ5UG9pbnRdLCBob29rRnVuY3Rpb24pO1xuXG4gICAgICByZXR1cm4gaW5kZXggPT09IC0xXG4gICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgIDogYXJyYXlTcGxpY2UoaG9va3NbZW50cnlQb2ludF0sIGluZGV4LCAxKVswXTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJyYXlQb3AoaG9va3NbZW50cnlQb2ludF0pO1xuICB9O1xuXG4gIERPTVB1cmlmeS5yZW1vdmVIb29rcyA9IGZ1bmN0aW9uIChlbnRyeVBvaW50OiBrZXlvZiBIb29rc01hcCkge1xuICAgIGhvb2tzW2VudHJ5UG9pbnRdID0gW107XG4gIH07XG5cbiAgRE9NUHVyaWZ5LnJlbW92ZUFsbEhvb2tzID0gZnVuY3Rpb24gKCkge1xuICAgIGhvb2tzID0gX2NyZWF0ZUhvb2tzTWFwKCk7XG4gIH07XG5cbiAgcmV0dXJuIERPTVB1cmlmeTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlRE9NUHVyaWZ5KCk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRE9NUHVyaWZ5IHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBET01QdXJpZnkgaW5zdGFuY2UgdXNpbmcgdGhlIGdpdmVuIHdpbmRvdy1saWtlIG9iamVjdC4gRGVmYXVsdHMgdG8gYHdpbmRvd2AuXG4gICAqL1xuICAocm9vdD86IFdpbmRvd0xpa2UpOiBET01QdXJpZnk7XG5cbiAgLyoqXG4gICAqIFZlcnNpb24gbGFiZWwsIGV4cG9zZWQgZm9yIGVhc2llciBjaGVja3NcbiAgICogaWYgRE9NUHVyaWZ5IGlzIHVwIHRvIGRhdGUgb3Igbm90XG4gICAqL1xuICB2ZXJzaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFycmF5IG9mIGVsZW1lbnRzIHRoYXQgRE9NUHVyaWZ5IHJlbW92ZWQgZHVyaW5nIHNhbml0YXRpb24uXG4gICAqIEVtcHR5IGlmIG5vdGhpbmcgd2FzIHJlbW92ZWQuXG4gICAqL1xuICByZW1vdmVkOiBBcnJheTxSZW1vdmVkRWxlbWVudCB8IFJlbW92ZWRBdHRyaWJ1dGU+O1xuXG4gIC8qKlxuICAgKiBFeHBvc2Ugd2hldGhlciB0aGlzIGJyb3dzZXIgc3VwcG9ydHMgcnVubmluZyB0aGUgZnVsbCBET01QdXJpZnkuXG4gICAqL1xuICBpc1N1cHBvcnRlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogU2V0IHRoZSBjb25maWd1cmF0aW9uIG9uY2UuXG4gICAqXG4gICAqIEBwYXJhbSBjZmcgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICovXG4gIHNldENvbmZpZyhjZmc/OiBDb25maWcpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHRoZSBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgY2xlYXJDb25maWcoKTogdm9pZDtcblxuICAvKipcbiAgICogUHJvdmlkZXMgY29yZSBzYW5pdGF0aW9uIGZ1bmN0aW9uYWxpdHkuXG4gICAqXG4gICAqIEBwYXJhbSBkaXJ0eSBzdHJpbmcgb3IgRE9NIG5vZGVcbiAgICogQHBhcmFtIGNmZyBvYmplY3RcbiAgICogQHJldHVybnMgU2FuaXRpemVkIFRydXN0ZWRIVE1MLlxuICAgKi9cbiAgc2FuaXRpemUoXG4gICAgZGlydHk6IHN0cmluZyB8IE5vZGUsXG4gICAgY2ZnOiBDb25maWcgJiB7IFJFVFVSTl9UUlVTVEVEX1RZUEU6IHRydWUgfVxuICApOiBUcnVzdGVkSFRNTDtcblxuICAvKipcbiAgICogUHJvdmlkZXMgY29yZSBzYW5pdGF0aW9uIGZ1bmN0aW9uYWxpdHkuXG4gICAqXG4gICAqIEBwYXJhbSBkaXJ0eSBET00gbm9kZVxuICAgKiBAcGFyYW0gY2ZnIG9iamVjdFxuICAgKiBAcmV0dXJucyBTYW5pdGl6ZWQgRE9NIG5vZGUuXG4gICAqL1xuICBzYW5pdGl6ZShkaXJ0eTogTm9kZSwgY2ZnOiBDb25maWcgJiB7IElOX1BMQUNFOiB0cnVlIH0pOiBOb2RlO1xuXG4gIC8qKlxuICAgKiBQcm92aWRlcyBjb3JlIHNhbml0YXRpb24gZnVuY3Rpb25hbGl0eS5cbiAgICpcbiAgICogQHBhcmFtIGRpcnR5IHN0cmluZyBvciBET00gbm9kZVxuICAgKiBAcGFyYW0gY2ZnIG9iamVjdFxuICAgKiBAcmV0dXJucyBTYW5pdGl6ZWQgRE9NIG5vZGUuXG4gICAqL1xuICBzYW5pdGl6ZShkaXJ0eTogc3RyaW5nIHwgTm9kZSwgY2ZnOiBDb25maWcgJiB7IFJFVFVSTl9ET006IHRydWUgfSk6IE5vZGU7XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVzIGNvcmUgc2FuaXRhdGlvbiBmdW5jdGlvbmFsaXR5LlxuICAgKlxuICAgKiBAcGFyYW0gZGlydHkgc3RyaW5nIG9yIERPTSBub2RlXG4gICAqIEBwYXJhbSBjZmcgb2JqZWN0XG4gICAqIEByZXR1cm5zIFNhbml0aXplZCBkb2N1bWVudCBmcmFnbWVudC5cbiAgICovXG4gIHNhbml0aXplKFxuICAgIGRpcnR5OiBzdHJpbmcgfCBOb2RlLFxuICAgIGNmZzogQ29uZmlnICYgeyBSRVRVUk5fRE9NX0ZSQUdNRU5UOiB0cnVlIH1cbiAgKTogRG9jdW1lbnRGcmFnbWVudDtcblxuICAvKipcbiAgICogUHJvdmlkZXMgY29yZSBzYW5pdGF0aW9uIGZ1bmN0aW9uYWxpdHkuXG4gICAqXG4gICAqIEBwYXJhbSBkaXJ0eSBzdHJpbmcgb3IgRE9NIG5vZGVcbiAgICogQHBhcmFtIGNmZyBvYmplY3RcbiAgICogQHJldHVybnMgU2FuaXRpemVkIHN0cmluZy5cbiAgICovXG4gIHNhbml0aXplKGRpcnR5OiBzdHJpbmcgfCBOb2RlLCBjZmc/OiBDb25maWcpOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhbiBhdHRyaWJ1dGUgdmFsdWUgaXMgdmFsaWQuXG4gICAqIFVzZXMgbGFzdCBzZXQgY29uZmlnLCBpZiBhbnkuIE90aGVyd2lzZSwgdXNlcyBjb25maWcgZGVmYXVsdHMuXG4gICAqXG4gICAqIEBwYXJhbSB0YWcgVGFnIG5hbWUgb2YgY29udGFpbmluZyBlbGVtZW50LlxuICAgKiBAcGFyYW0gYXR0ciBBdHRyaWJ1dGUgbmFtZS5cbiAgICogQHBhcmFtIHZhbHVlIEF0dHJpYnV0ZSB2YWx1ZS5cbiAgICogQHJldHVybnMgUmV0dXJucyB0cnVlIGlmIGB2YWx1ZWAgaXMgdmFsaWQuIE90aGVyd2lzZSwgcmV0dXJucyBmYWxzZS5cbiAgICovXG4gIGlzVmFsaWRBdHRyaWJ1dGUodGFnOiBzdHJpbmcsIGF0dHI6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBET01QdXJpZnkgaG9vay5cbiAgICpcbiAgICogQHBhcmFtIGVudHJ5UG9pbnQgZW50cnkgcG9pbnQgZm9yIHRoZSBob29rIHRvIGFkZFxuICAgKiBAcGFyYW0gaG9va0Z1bmN0aW9uIGZ1bmN0aW9uIHRvIGV4ZWN1dGVcbiAgICovXG4gIGFkZEhvb2soZW50cnlQb2ludDogQmFzaWNIb29rTmFtZSwgaG9va0Z1bmN0aW9uOiBOb2RlSG9vayk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBET01QdXJpZnkgaG9vay5cbiAgICpcbiAgICogQHBhcmFtIGVudHJ5UG9pbnQgZW50cnkgcG9pbnQgZm9yIHRoZSBob29rIHRvIGFkZFxuICAgKiBAcGFyYW0gaG9va0Z1bmN0aW9uIGZ1bmN0aW9uIHRvIGV4ZWN1dGVcbiAgICovXG4gIGFkZEhvb2soZW50cnlQb2ludDogRWxlbWVudEhvb2tOYW1lLCBob29rRnVuY3Rpb246IEVsZW1lbnRIb29rKTogdm9pZDtcblxuICAvKipcbiAgICogQWRkcyBhIERPTVB1cmlmeSBob29rLlxuICAgKlxuICAgKiBAcGFyYW0gZW50cnlQb2ludCBlbnRyeSBwb2ludCBmb3IgdGhlIGhvb2sgdG8gYWRkXG4gICAqIEBwYXJhbSBob29rRnVuY3Rpb24gZnVuY3Rpb24gdG8gZXhlY3V0ZVxuICAgKi9cbiAgYWRkSG9vayhcbiAgICBlbnRyeVBvaW50OiBEb2N1bWVudEZyYWdtZW50SG9va05hbWUsXG4gICAgaG9va0Z1bmN0aW9uOiBEb2N1bWVudEZyYWdtZW50SG9va1xuICApOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBBZGRzIGEgRE9NUHVyaWZ5IGhvb2suXG4gICAqXG4gICAqIEBwYXJhbSBlbnRyeVBvaW50IGVudHJ5IHBvaW50IGZvciB0aGUgaG9vayB0byBhZGRcbiAgICogQHBhcmFtIGhvb2tGdW5jdGlvbiBmdW5jdGlvbiB0byBleGVjdXRlXG4gICAqL1xuICBhZGRIb29rKFxuICAgIGVudHJ5UG9pbnQ6ICd1cG9uU2FuaXRpemVFbGVtZW50JyxcbiAgICBob29rRnVuY3Rpb246IFVwb25TYW5pdGl6ZUVsZW1lbnRIb29rXG4gICk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBET01QdXJpZnkgaG9vay5cbiAgICpcbiAgICogQHBhcmFtIGVudHJ5UG9pbnQgZW50cnkgcG9pbnQgZm9yIHRoZSBob29rIHRvIGFkZFxuICAgKiBAcGFyYW0gaG9va0Z1bmN0aW9uIGZ1bmN0aW9uIHRvIGV4ZWN1dGVcbiAgICovXG4gIGFkZEhvb2soXG4gICAgZW50cnlQb2ludDogJ3Vwb25TYW5pdGl6ZUF0dHJpYnV0ZScsXG4gICAgaG9va0Z1bmN0aW9uOiBVcG9uU2FuaXRpemVBdHRyaWJ1dGVIb29rXG4gICk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIERPTVB1cmlmeSBob29rIGF0IGEgZ2l2ZW4gZW50cnlQb2ludFxuICAgKiAocG9wcyBpdCBmcm9tIHRoZSBzdGFjayBvZiBob29rcyBpZiBob29rIG5vdCBzcGVjaWZpZWQpXG4gICAqXG4gICAqIEBwYXJhbSBlbnRyeVBvaW50IGVudHJ5IHBvaW50IGZvciB0aGUgaG9vayB0byByZW1vdmVcbiAgICogQHBhcmFtIGhvb2tGdW5jdGlvbiBvcHRpb25hbCBzcGVjaWZpYyBob29rIHRvIHJlbW92ZVxuICAgKiBAcmV0dXJucyByZW1vdmVkIGhvb2tcbiAgICovXG4gIHJlbW92ZUhvb2soXG4gICAgZW50cnlQb2ludDogQmFzaWNIb29rTmFtZSxcbiAgICBob29rRnVuY3Rpb24/OiBOb2RlSG9va1xuICApOiBOb2RlSG9vayB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogUmVtb3ZlIGEgRE9NUHVyaWZ5IGhvb2sgYXQgYSBnaXZlbiBlbnRyeVBvaW50XG4gICAqIChwb3BzIGl0IGZyb20gdGhlIHN0YWNrIG9mIGhvb2tzIGlmIGhvb2sgbm90IHNwZWNpZmllZClcbiAgICpcbiAgICogQHBhcmFtIGVudHJ5UG9pbnQgZW50cnkgcG9pbnQgZm9yIHRoZSBob29rIHRvIHJlbW92ZVxuICAgKiBAcGFyYW0gaG9va0Z1bmN0aW9uIG9wdGlvbmFsIHNwZWNpZmljIGhvb2sgdG8gcmVtb3ZlXG4gICAqIEByZXR1cm5zIHJlbW92ZWQgaG9va1xuICAgKi9cbiAgcmVtb3ZlSG9vayhcbiAgICBlbnRyeVBvaW50OiBFbGVtZW50SG9va05hbWUsXG4gICAgaG9va0Z1bmN0aW9uPzogRWxlbWVudEhvb2tcbiAgKTogRWxlbWVudEhvb2sgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIERPTVB1cmlmeSBob29rIGF0IGEgZ2l2ZW4gZW50cnlQb2ludFxuICAgKiAocG9wcyBpdCBmcm9tIHRoZSBzdGFjayBvZiBob29rcyBpZiBob29rIG5vdCBzcGVjaWZpZWQpXG4gICAqXG4gICAqIEBwYXJhbSBlbnRyeVBvaW50IGVudHJ5IHBvaW50IGZvciB0aGUgaG9vayB0byByZW1vdmVcbiAgICogQHBhcmFtIGhvb2tGdW5jdGlvbiBvcHRpb25hbCBzcGVjaWZpYyBob29rIHRvIHJlbW92ZVxuICAgKiBAcmV0dXJucyByZW1vdmVkIGhvb2tcbiAgICovXG4gIHJlbW92ZUhvb2soXG4gICAgZW50cnlQb2ludDogRG9jdW1lbnRGcmFnbWVudEhvb2tOYW1lLFxuICAgIGhvb2tGdW5jdGlvbj86IERvY3VtZW50RnJhZ21lbnRIb29rXG4gICk6IERvY3VtZW50RnJhZ21lbnRIb29rIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBET01QdXJpZnkgaG9vayBhdCBhIGdpdmVuIGVudHJ5UG9pbnRcbiAgICogKHBvcHMgaXQgZnJvbSB0aGUgc3RhY2sgb2YgaG9va3MgaWYgaG9vayBub3Qgc3BlY2lmaWVkKVxuICAgKlxuICAgKiBAcGFyYW0gZW50cnlQb2ludCBlbnRyeSBwb2ludCBmb3IgdGhlIGhvb2sgdG8gcmVtb3ZlXG4gICAqIEBwYXJhbSBob29rRnVuY3Rpb24gb3B0aW9uYWwgc3BlY2lmaWMgaG9vayB0byByZW1vdmVcbiAgICogQHJldHVybnMgcmVtb3ZlZCBob29rXG4gICAqL1xuICByZW1vdmVIb29rKFxuICAgIGVudHJ5UG9pbnQ6ICd1cG9uU2FuaXRpemVFbGVtZW50JyxcbiAgICBob29rRnVuY3Rpb24/OiBVcG9uU2FuaXRpemVFbGVtZW50SG9va1xuICApOiBVcG9uU2FuaXRpemVFbGVtZW50SG9vayB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogUmVtb3ZlIGEgRE9NUHVyaWZ5IGhvb2sgYXQgYSBnaXZlbiBlbnRyeVBvaW50XG4gICAqIChwb3BzIGl0IGZyb20gdGhlIHN0YWNrIG9mIGhvb2tzIGlmIGhvb2sgbm90IHNwZWNpZmllZClcbiAgICpcbiAgICogQHBhcmFtIGVudHJ5UG9pbnQgZW50cnkgcG9pbnQgZm9yIHRoZSBob29rIHRvIHJlbW92ZVxuICAgKiBAcGFyYW0gaG9va0Z1bmN0aW9uIG9wdGlvbmFsIHNwZWNpZmljIGhvb2sgdG8gcmVtb3ZlXG4gICAqIEByZXR1cm5zIHJlbW92ZWQgaG9va1xuICAgKi9cbiAgcmVtb3ZlSG9vayhcbiAgICBlbnRyeVBvaW50OiAndXBvblNhbml0aXplQXR0cmlidXRlJyxcbiAgICBob29rRnVuY3Rpb24/OiBVcG9uU2FuaXRpemVBdHRyaWJ1dGVIb29rXG4gICk6IFVwb25TYW5pdGl6ZUF0dHJpYnV0ZUhvb2sgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYWxsIERPTVB1cmlmeSBob29rcyBhdCBhIGdpdmVuIGVudHJ5UG9pbnRcbiAgICpcbiAgICogQHBhcmFtIGVudHJ5UG9pbnQgZW50cnkgcG9pbnQgZm9yIHRoZSBob29rcyB0byByZW1vdmVcbiAgICovXG4gIHJlbW92ZUhvb2tzKGVudHJ5UG9pbnQ6IEhvb2tOYW1lKTogdm9pZDtcblxuICAvKipcbiAgICogUmVtb3ZlcyBhbGwgRE9NUHVyaWZ5IGhvb2tzLlxuICAgKi9cbiAgcmVtb3ZlQWxsSG9va3MoKTogdm9pZDtcbn1cblxuLyoqXG4gKiBBbiBlbGVtZW50IHJlbW92ZWQgYnkgRE9NUHVyaWZ5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbW92ZWRFbGVtZW50IHtcbiAgLyoqXG4gICAqIFRoZSBlbGVtZW50IHRoYXQgd2FzIHJlbW92ZWQuXG4gICAqL1xuICBlbGVtZW50OiBOb2RlO1xufVxuXG4vKipcbiAqIEFuIGVsZW1lbnQgcmVtb3ZlZCBieSBET01QdXJpZnkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVtb3ZlZEF0dHJpYnV0ZSB7XG4gIC8qKlxuICAgKiBUaGUgYXR0cmlidXRlIHRoYXQgd2FzIHJlbW92ZWQuXG4gICAqL1xuICBhdHRyaWJ1dGU6IEF0dHIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgZWxlbWVudCB0aGF0IHRoZSBhdHRyaWJ1dGUgd2FzIHJlbW92ZWQuXG4gICAqL1xuICBmcm9tOiBOb2RlO1xufVxuXG50eXBlIEJhc2ljSG9va05hbWUgPVxuICB8ICdiZWZvcmVTYW5pdGl6ZUVsZW1lbnRzJ1xuICB8ICdhZnRlclNhbml0aXplRWxlbWVudHMnXG4gIHwgJ3Vwb25TYW5pdGl6ZVNoYWRvd05vZGUnO1xudHlwZSBFbGVtZW50SG9va05hbWUgPSAnYmVmb3JlU2FuaXRpemVBdHRyaWJ1dGVzJyB8ICdhZnRlclNhbml0aXplQXR0cmlidXRlcyc7XG50eXBlIERvY3VtZW50RnJhZ21lbnRIb29rTmFtZSA9XG4gIHwgJ2JlZm9yZVNhbml0aXplU2hhZG93RE9NJ1xuICB8ICdhZnRlclNhbml0aXplU2hhZG93RE9NJztcbnR5cGUgVXBvblNhbml0aXplRWxlbWVudEhvb2tOYW1lID0gJ3Vwb25TYW5pdGl6ZUVsZW1lbnQnO1xudHlwZSBVcG9uU2FuaXRpemVBdHRyaWJ1dGVIb29rTmFtZSA9ICd1cG9uU2FuaXRpemVBdHRyaWJ1dGUnO1xuXG5pbnRlcmZhY2UgSG9va3NNYXAge1xuICBiZWZvcmVTYW5pdGl6ZUVsZW1lbnRzOiBOb2RlSG9va1tdO1xuICBhZnRlclNhbml0aXplRWxlbWVudHM6IE5vZGVIb29rW107XG4gIGJlZm9yZVNhbml0aXplU2hhZG93RE9NOiBEb2N1bWVudEZyYWdtZW50SG9va1tdO1xuICB1cG9uU2FuaXRpemVTaGFkb3dOb2RlOiBOb2RlSG9va1tdO1xuICBhZnRlclNhbml0aXplU2hhZG93RE9NOiBEb2N1bWVudEZyYWdtZW50SG9va1tdO1xuICBiZWZvcmVTYW5pdGl6ZUF0dHJpYnV0ZXM6IEVsZW1lbnRIb29rW107XG4gIGFmdGVyU2FuaXRpemVBdHRyaWJ1dGVzOiBFbGVtZW50SG9va1tdO1xuICB1cG9uU2FuaXRpemVFbGVtZW50OiBVcG9uU2FuaXRpemVFbGVtZW50SG9va1tdO1xuICB1cG9uU2FuaXRpemVBdHRyaWJ1dGU6IFVwb25TYW5pdGl6ZUF0dHJpYnV0ZUhvb2tbXTtcbn1cblxudHlwZSBBcnJheUVsZW1lbnQ8VD4gPSBUIGV4dGVuZHMgQXJyYXk8aW5mZXIgVT4gPyBVIDogbmV2ZXI7XG5cbnR5cGUgSG9va0Z1bmN0aW9uID0gQXJyYXlFbGVtZW50PEhvb2tzTWFwW2tleW9mIEhvb2tzTWFwXT47XG5cbmV4cG9ydCB0eXBlIEhvb2tOYW1lID1cbiAgfCBCYXNpY0hvb2tOYW1lXG4gIHwgRWxlbWVudEhvb2tOYW1lXG4gIHwgRG9jdW1lbnRGcmFnbWVudEhvb2tOYW1lXG4gIHwgVXBvblNhbml0aXplRWxlbWVudEhvb2tOYW1lXG4gIHwgVXBvblNhbml0aXplQXR0cmlidXRlSG9va05hbWU7XG5cbmV4cG9ydCB0eXBlIE5vZGVIb29rID0gKFxuICB0aGlzOiBET01QdXJpZnksXG4gIGN1cnJlbnROb2RlOiBOb2RlLFxuICBob29rRXZlbnQ6IG51bGwsXG4gIGNvbmZpZzogQ29uZmlnXG4pID0+IHZvaWQ7XG5cbmV4cG9ydCB0eXBlIEVsZW1lbnRIb29rID0gKFxuICB0aGlzOiBET01QdXJpZnksXG4gIGN1cnJlbnROb2RlOiBFbGVtZW50LFxuICBob29rRXZlbnQ6IG51bGwsXG4gIGNvbmZpZzogQ29uZmlnXG4pID0+IHZvaWQ7XG5cbmV4cG9ydCB0eXBlIERvY3VtZW50RnJhZ21lbnRIb29rID0gKFxuICB0aGlzOiBET01QdXJpZnksXG4gIGN1cnJlbnROb2RlOiBEb2N1bWVudEZyYWdtZW50LFxuICBob29rRXZlbnQ6IG51bGwsXG4gIGNvbmZpZzogQ29uZmlnXG4pID0+IHZvaWQ7XG5cbmV4cG9ydCB0eXBlIFVwb25TYW5pdGl6ZUVsZW1lbnRIb29rID0gKFxuICB0aGlzOiBET01QdXJpZnksXG4gIGN1cnJlbnROb2RlOiBOb2RlLFxuICBob29rRXZlbnQ6IFVwb25TYW5pdGl6ZUVsZW1lbnRIb29rRXZlbnQsXG4gIGNvbmZpZzogQ29uZmlnXG4pID0+IHZvaWQ7XG5cbmV4cG9ydCB0eXBlIFVwb25TYW5pdGl6ZUF0dHJpYnV0ZUhvb2sgPSAoXG4gIHRoaXM6IERPTVB1cmlmeSxcbiAgY3VycmVudE5vZGU6IEVsZW1lbnQsXG4gIGhvb2tFdmVudDogVXBvblNhbml0aXplQXR0cmlidXRlSG9va0V2ZW50LFxuICBjb25maWc6IENvbmZpZ1xuKSA9PiB2b2lkO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVwb25TYW5pdGl6ZUVsZW1lbnRIb29rRXZlbnQge1xuICB0YWdOYW1lOiBzdHJpbmc7XG4gIGFsbG93ZWRUYWdzOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVcG9uU2FuaXRpemVBdHRyaWJ1dGVIb29rRXZlbnQge1xuICBhdHRyTmFtZTogc3RyaW5nO1xuICBhdHRyVmFsdWU6IHN0cmluZztcbiAga2VlcEF0dHI6IGJvb2xlYW47XG4gIGFsbG93ZWRBdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPjtcbiAgZm9yY2VLZWVwQXR0cjogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBBIGBXaW5kb3dgLWxpa2Ugb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHByb3BlcnRpZXMgYW5kIHR5cGVzIHRoYXQgRE9NUHVyaWZ5IHJlcXVpcmVzLlxuICovXG5leHBvcnQgdHlwZSBXaW5kb3dMaWtlID0gUGljazxcbiAgdHlwZW9mIGdsb2JhbFRoaXMsXG4gIHwgJ0RvY3VtZW50RnJhZ21lbnQnXG4gIHwgJ0hUTUxUZW1wbGF0ZUVsZW1lbnQnXG4gIHwgJ05vZGUnXG4gIHwgJ0VsZW1lbnQnXG4gIHwgJ05vZGVGaWx0ZXInXG4gIHwgJ05hbWVkTm9kZU1hcCdcbiAgfCAnSFRNTEZvcm1FbGVtZW50J1xuICB8ICdET01QYXJzZXInXG4+ICYge1xuICBkb2N1bWVudD86IERvY3VtZW50O1xuICBNb3pOYW1lZEF0dHJNYXA/OiB0eXBlb2Ygd2luZG93Lk5hbWVkTm9kZU1hcDtcbn0gJiBQaWNrPFRydXN0ZWRUeXBlc1dpbmRvdywgJ3RydXN0ZWRUeXBlcyc+O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvbWVzc2FnZS1kaXNwYXRjaC5qc1xuICogQ2hhdCBtZXNzYWdlIGRpc3BhdGNoOiBzZW5kTWVzc2FnZSwgaW50YWtlIGNvbmZpcm1hdGlvbiBjYXJkLFxuICogcHJpb3ItY2xhcmlmaWNhdGlvbiBwcmVsb2FkLlxuICpcbiAqIERFUEVOREVOQ0lFUyAoYWxsIG9uIGdsb2JhbFRoaXMgYXQgcnVudGltZSk6XG4gKiAgIC0gcGFyc2VNZXNzYWdlUmVzcG9uc2UgKHZhbGlkYXRvcnMuanMpXG4gKiAgIC0gc2V0TG9hZGluZywgbGxtRmV0Y2ggKGZldGNoLXV0aWxzLmpzKVxuICogICAtIGFwcGVuZE1lc3NhZ2UsIGFwcGVuZFJldHJ5TWVzc2FnZSwgYXBwZW5kUmF3SHRtbCAobWVzc2FnZS1xdWV1ZS5qcylcbiAqICAgLSBub3JtYWxpemVUZXh0LCBlc2NhcGVIdG1sICh1dGlscy5qcylcbiAqICAgLSBmZXRjaFN0YXR1cyAoYXBpLWNsaWVudC5qcylcbiAqICAgLSBhbmFseXplSm9iIChqb2ItYW5hbHlzaXMuanMpXG4gKiAgIC0gc2VuZEFjdGlvbiAoc2Vzc2lvbi1hY3Rpb25zLmpzKVxuICogICAtIHNob3dUYWJsZUJhc2VkUmV2aWV3IChyZXZpZXctdGFibGUtYmFzZS5qcywgVGllciA0KVxuICogICAtIGhhbmRsZUV4cGVyaWVuY2VSZXNwb25zZSAoZXhwZXJpZW5jZS1yZXZpZXcuanMsIFRpZXIgNSlcbiAqICAgLSBoYW5kbGVTa2lsbHNSZXNwb25zZSAoc2tpbGxzLXJldmlldy5qcywgVGllciA1KVxuICogICAtIGhhbmRsZVF1ZXN0aW9uUmVzcG9uc2UgKHF1ZXN0aW9ucy1wYW5lbC5qcylcbiAqICAgLSBleHRyYWN0Rmlyc3RKc29uT2JqZWN0LCBoYW5kbGVDdXN0b21pemF0aW9uUmVzcG9uc2UgKGFwcC5qcyBvcmNoZXN0cmF0b3IpXG4gKiAgIC0gc3RhdGVNYW5hZ2VyIChzdGF0ZS1tYW5hZ2VyLmpzIFx1MjAxNCBpc0xvYWRpbmcoKSlcbiAqICAgLSBxdWVzdGlvbkFuc3dlcnMsIHBlbmRpbmdSZWNvbW1lbmRhdGlvbnMgKHdpbmRvdyBnbG9iYWxzKVxuICovXG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmNvbnN0IGxvZyA9IGdldExvZ2dlcignbWVzc2FnZS1kaXNwYXRjaCcpO1xuXG5pbXBvcnQgeyBzdGF0ZU1hbmFnZXIgfSBmcm9tICcuL3N0YXRlLW1hbmFnZXIuanMnO1xuaW1wb3J0IHsgZ2V0U2Vzc2lvbklkRnJvbVVSTCB9IGZyb20gJy4vYXBpLWNsaWVudC5qcyc7XG5cbmxldCBfcGVuZGluZ1Bvc3RJbnRha2VDb250aW51YXRpb24gPSBudWxsO1xuY29uc3QgUkVUUllfUE9MSUNZX1NUT1JBR0VfS0VZID0gJ2N2LWJ1aWxkZXItcmV0cnktcG9saWN5JztcbmxldCBfcmV0cnlBdHRlbXB0Q291bnQgPSAwO1xubGV0IF9yZXRyeVRpbWVyID0gbnVsbDtcbmxldCBfcmV0cnlJbnRlcnZhbCA9IG51bGw7XG5cbmZ1bmN0aW9uIF9jbGVhclJldHJ5VGltZXJzKCkge1xuICBpZiAoX3JldHJ5VGltZXIpIHtcbiAgICBjbGVhclRpbWVvdXQoX3JldHJ5VGltZXIpO1xuICAgIF9yZXRyeVRpbWVyID0gbnVsbDtcbiAgfVxuICBpZiAoX3JldHJ5SW50ZXJ2YWwpIHtcbiAgICBjbGVhckludGVydmFsKF9yZXRyeUludGVydmFsKTtcbiAgICBfcmV0cnlJbnRlcnZhbCA9IG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2dldFJldHJ5UG9saWN5KCkge1xuICBjb25zdCBkZWZhdWx0cyA9IHtcbiAgICBiYXNlTXM6IDE1MDAsXG4gICAgY2FwTXM6IDYwMDAwLFxuICAgIG1heEF0dGVtcHRzOiA2LFxuICAgIGF1dG9SZXRyeTogdHJ1ZSxcbiAgfTtcbiAgdHJ5IHtcbiAgICBjb25zdCByYXcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShSRVRSWV9QT0xJQ1lfU1RPUkFHRV9LRVkpO1xuICAgIGlmICghcmF3KSByZXR1cm4gZGVmYXVsdHM7XG4gICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShyYXcpO1xuICAgIHJldHVybiB7XG4gICAgICBiYXNlTXM6IE1hdGgubWF4KDIwMCwgTnVtYmVyKHBhcnNlZC5iYXNlTXMgfHwgZGVmYXVsdHMuYmFzZU1zKSksXG4gICAgICBjYXBNczogTWF0aC5tYXgoMTAwMCwgTnVtYmVyKHBhcnNlZC5jYXBNcyB8fCBkZWZhdWx0cy5jYXBNcykpLFxuICAgICAgbWF4QXR0ZW1wdHM6IE1hdGgubWF4KDEsIE51bWJlcihwYXJzZWQubWF4QXR0ZW1wdHMgfHwgZGVmYXVsdHMubWF4QXR0ZW1wdHMpKSxcbiAgICAgIGF1dG9SZXRyeTogcGFyc2VkLmF1dG9SZXRyeSAhPT0gZmFsc2UsXG4gICAgfTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGRlZmF1bHRzO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9jYWxjdWxhdGVSZXRyeURlbGF5TXMoa2luZCwgZXJyb3IpIHtcbiAgY29uc3QgcG9saWN5ID0gX2dldFJldHJ5UG9saWN5KCk7XG4gIGNvbnN0IGV4cCA9IE1hdGgubWluKHBvbGljeS5jYXBNcywgcG9saWN5LmJhc2VNcyAqICgyICoqIF9yZXRyeUF0dGVtcHRDb3VudCkpO1xuICBjb25zdCBqaXR0ZXIgPSBNYXRoLnJvdW5kKGV4cCAqICgwLjEgKyBNYXRoLnJhbmRvbSgpICogMC4xNSkpO1xuICBsZXQgZGVsYXlNcyA9IE1hdGgubWluKHBvbGljeS5jYXBNcywgZXhwICsgaml0dGVyKTtcblxuICBpZiAoa2luZCA9PT0gJ3JhdGUtbGltaXRlZCcpIHtcbiAgICBjb25zdCByZXRyeUFmdGVyU2VjID0gTnVtYmVyKGVycm9yPy5yZXRyeUFmdGVyU2VjIHx8IDApO1xuICAgIGlmIChyZXRyeUFmdGVyU2VjID4gMCkge1xuICAgICAgZGVsYXlNcyA9IE1hdGgubWF4KGRlbGF5TXMsIHJldHJ5QWZ0ZXJTZWMgKiAxMDAwKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlbGF5TXM7XG59XG5cbmZ1bmN0aW9uIF9zY2hlZHVsZVJldHJ5KHRleHQsIGRlcml2ZWQsIGVycm9yKSB7XG4gIF9jbGVhclJldHJ5VGltZXJzKCk7XG4gIGNvbnN0IHBvbGljeSA9IF9nZXRSZXRyeVBvbGljeSgpO1xuXG4gIC8vIENsaWVudCBlcnJvcnMgKDR4eCkgYW5kIGF1dGggZmFpbHVyZXMgYXJlIG5vdCB0cmFuc2llbnQ7IGRvIG5vdCBhdXRvLXJldHJ5LlxuICBjb25zdCBOT05fUkVUUllBQkxFID0gbmV3IFNldChbJ2NsaWVudC1lcnJvcicsICdhdXRoLXJlcXVpcmVkJ10pO1xuICBjb25zdCBjYW5BdXRvUmV0cnkgPSBwb2xpY3kuYXV0b1JldHJ5XG4gICAgJiYgX3JldHJ5QXR0ZW1wdENvdW50IDwgcG9saWN5Lm1heEF0dGVtcHRzXG4gICAgJiYgIU5PTl9SRVRSWUFCTEUuaGFzKGRlcml2ZWQua2luZCk7XG5cbiAgY29uc3QgZGVsYXlNcyA9IF9jYWxjdWxhdGVSZXRyeURlbGF5TXMoZGVyaXZlZC5raW5kLCBlcnJvcik7XG4gIGNvbnN0IHRvdGFsU2Vjb25kcyA9IE1hdGgubWF4KDEsIE1hdGguY2VpbChkZWxheU1zIC8gMTAwMCkpO1xuXG4gIGNvbnN0IHJldHJ5QWN0aW9uID0gKCkgPT4ge1xuICAgIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21lc3NhZ2UtaW5wdXQnKTtcbiAgICBpZiAoaW5wdXQpIGlucHV0LnZhbHVlID0gdGV4dDtcbiAgICBzZW5kTWVzc2FnZSgpO1xuICB9O1xuXG4gIGxldCByZXRyeU1lc3NhZ2U7XG4gIGNvbnN0IGNhbmNlbEZuID0gY2FuQXV0b1JldHJ5ID8gKCkgPT4ge1xuICAgIF9jbGVhclJldHJ5VGltZXJzKCk7XG4gICAgaWYgKHJldHJ5TWVzc2FnZSkgcmV0cnlNZXNzYWdlLnJlbW92ZSgpO1xuICB9IDogbnVsbDtcblxuICByZXRyeU1lc3NhZ2UgPSBhcHBlbmRSZXRyeU1lc3NhZ2UoXG4gICAgYFx1MjZBMFx1RkUwRiAke2Vycm9yLm1lc3NhZ2V9YCxcbiAgICAoKSA9PiB7XG4gICAgICBfY2xlYXJSZXRyeVRpbWVycygpO1xuICAgICAgX3JldHJ5QXR0ZW1wdENvdW50ICs9IDE7XG4gICAgICByZXRyeUFjdGlvbigpO1xuICAgIH0sXG4gICAgY2FuQXV0b1JldHJ5ID8gYFJldHJ5IGluICR7dG90YWxTZWNvbmRzfXNgIDogJ1JldHJ5JyxcbiAgICBjYW5jZWxGbixcbiAgKTtcblxuICBpZiAoIWNhbkF1dG9SZXRyeSkgcmV0dXJuO1xuXG4gIGNvbnN0IHJldHJ5QnRuID0gcmV0cnlNZXNzYWdlPy5xdWVyeVNlbGVjdG9yKCdidXR0b24nKTtcbiAgbGV0IHJlbWFpbmluZyA9IHRvdGFsU2Vjb25kcztcbiAgaWYgKHJldHJ5QnRuKSB7XG4gICAgcmV0cnlCdG4udGV4dENvbnRlbnQgPSBgUmV0cnkgaW4gJHtyZW1haW5pbmd9c2A7XG4gICAgaWYgKGRlcml2ZWQua2luZCA9PT0gJ3JhdGUtbGltaXRlZCcpIHtcbiAgICAgIHJldHJ5QnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIHJldHJ5QnRuLnN0eWxlLm9wYWNpdHkgPSAnMC43JztcbiAgICAgIHJldHJ5QnRuLnN0eWxlLmN1cnNvciA9ICdub3QtYWxsb3dlZCc7XG4gICAgfVxuICB9XG5cbiAgX3JldHJ5SW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgcmVtYWluaW5nIC09IDE7XG4gICAgaWYgKHJldHJ5QnRuICYmIHJlbWFpbmluZyA+IDApIHtcbiAgICAgIHJldHJ5QnRuLnRleHRDb250ZW50ID0gYFJldHJ5IGluICR7cmVtYWluaW5nfXNgO1xuICAgIH1cbiAgICBpZiAocmVtYWluaW5nIDw9IDApIHtcbiAgICAgIGlmIChyZXRyeUJ0bikge1xuICAgICAgICByZXRyeUJ0bi50ZXh0Q29udGVudCA9ICdSZXRyeSBOb3cnO1xuICAgICAgICByZXRyeUJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICByZXRyeUJ0bi5zdHlsZS5vcGFjaXR5ID0gJyc7XG4gICAgICAgIHJldHJ5QnRuLnN0eWxlLmN1cnNvciA9ICcnO1xuICAgICAgfVxuICAgICAgY2xlYXJJbnRlcnZhbChfcmV0cnlJbnRlcnZhbCk7XG4gICAgICBfcmV0cnlJbnRlcnZhbCA9IG51bGw7XG4gICAgfVxuICB9LCAxMDAwKTtcblxuICBfcmV0cnlUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIF9yZXRyeVRpbWVyID0gbnVsbDtcbiAgICBfcmV0cnlBdHRlbXB0Q291bnQgKz0gMTtcbiAgICByZXRyeU1lc3NhZ2U/LnJlbW92ZSgpO1xuICAgIHJldHJ5QWN0aW9uKCk7XG4gIH0sIGRlbGF5TXMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBfcGFyc2VBcGlKc29uUmVzcG9uc2UocmVzcG9uc2UsIGVuZHBvaW50KSB7XG4gIGNvbnN0IHN0YXR1cyA9IE51bWJlcihyZXNwb25zZT8uc3RhdHVzIHx8IDApO1xuICBjb25zdCBzdGF0dXNUZXh0ID0gcmVzcG9uc2U/LnN0YXR1c1RleHQgfHwgJ1Vua25vd24gU3RhdHVzJztcbiAgY29uc3QgY29udGVudFR5cGUgPSAocmVzcG9uc2U/LmhlYWRlcnM/LmdldCgnY29udGVudC10eXBlJykgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IHJhdyA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcblxuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgbGV0IGRldGFpbCA9IHN0YXR1c1RleHQ7XG4gICAgaWYgKGNvbnRlbnRUeXBlLmluY2x1ZGVzKCdhcHBsaWNhdGlvbi9qc29uJykpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSBKU09OLnBhcnNlKHJhdyB8fCAne30nKTtcbiAgICAgICAgZGV0YWlsID0gcGF5bG9hZD8uZXJyb3IgfHwgcGF5bG9hZD8ubWVzc2FnZSB8fCBkZXRhaWw7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gS2VlcCBmYWxsYmFjayBkZXRhaWwgaWYgbWFsZm9ybWVkIEpTT04gZXJyb3IgcGF5bG9hZC5cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKChyYXcgfHwgJycpLnRyaW0oKS5zdGFydHNXaXRoKCc8JykpIHtcbiAgICAgIGRldGFpbCA9ICdzZXJ2ZXIgcmV0dXJuZWQgSFRNTCBpbnN0ZWFkIG9mIEpTT04gKHBvc3NpYmxlIHNlc3Npb24gcmVkaXJlY3Qgb3IgYmFja2VuZCBlcnJvciknO1xuICAgIH0gZWxzZSBpZiAoKHJhdyB8fCAnJykudHJpbSgpKSB7XG4gICAgICBkZXRhaWwgPSByYXcudHJpbSgpLnNsaWNlKDAsIDIyMCk7XG4gICAgfVxuICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKGAke3N0YXR1c306ICR7ZGV0YWlsfWApO1xuICAgIGVycm9yLnN0YXR1cyA9IHN0YXR1cztcbiAgICBlcnJvci5yZXRyeUFmdGVyU2VjID0gTnVtYmVyKHJlc3BvbnNlPy5oZWFkZXJzPy5nZXQoJ3JldHJ5LWFmdGVyJykgfHwgMCk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICBpZiAoIWNvbnRlbnRUeXBlLmluY2x1ZGVzKCdhcHBsaWNhdGlvbi9qc29uJykpIHtcbiAgICBjb25zdCBzbmlwcGV0ID0gKHJhdyB8fCAnJykudHJpbSgpLnNsaWNlKDAsIDgwKTtcbiAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoXG4gICAgICBgRXhwZWN0ZWQgSlNPTiBmcm9tICR7ZW5kcG9pbnR9LCBnb3QgJHtjb250ZW50VHlwZSB8fCAndW5rbm93biBjb250ZW50IHR5cGUnfSR7c25pcHBldCA/IGA6ICR7c25pcHBldH1gIDogJyd9YCxcbiAgICApO1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gcGFyc2VNZXNzYWdlUmVzcG9uc2UoSlNPTi5wYXJzZShyYXcgfHwgJ3t9JykpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgSW52YWxpZCBKU09OIGZyb20gJHtlbmRwb2ludH06ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfc2V0TGl2ZUxsbVN0YXRlKGtpbmQsIHRleHQsIGljb24gPSAnJywgdG9vbHRpcCA9ICcnKSB7XG4gIGlmICh0eXBlb2YgX3VwZGF0ZUxsbVN0YXR1c1BpbGwgPT09ICdmdW5jdGlvbicpIHtcbiAgICBfdXBkYXRlTGxtU3RhdHVzUGlsbChraW5kLCB0ZXh0LCBpY29uLCB0b29sdGlwKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfZGVyaXZlRXJyb3JTdGF0ZShlcnJvcikge1xuICBjb25zdCBtZXNzYWdlID0gU3RyaW5nKGVycm9yPy5tZXNzYWdlIHx8IGVycm9yIHx8ICdVbmtub3duIGVycm9yJyk7XG4gIGNvbnN0IGxvd2VyID0gbWVzc2FnZS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBzdGF0dXMgPSBOdW1iZXIoZXJyb3I/LnN0YXR1cyB8fCAwKTtcblxuICBpZiAoc3RhdHVzID09PSA0MDEgfHwgc3RhdHVzID09PSA0MDMgfHwgbWVzc2FnZS5zdGFydHNXaXRoKCc0MDE6JykgfHwgbWVzc2FnZS5zdGFydHNXaXRoKCc0MDM6JykgfHwgbG93ZXIuaW5jbHVkZXMoJ2F1dGgnKSkge1xuICAgIHJldHVybiB7XG4gICAgICBraW5kOiAnYXV0aC1yZXF1aXJlZCcsXG4gICAgICB0ZXh0OiAnQXV0aGVudGljYXRpb24gcmVxdWlyZWQnLFxuICAgICAgaWNvbjogJ1x1RDgzRFx1REQxMScsXG4gICAgICB0b29sdGlwOiAnQXV0aGVudGljYXRpb24gZmFpbGVkLiBDaGVjayBBUEkga2V5L3Rva2VuIG9yIHNpZ24gaW4gYWdhaW4uJyxcbiAgICB9O1xuICB9XG5cbiAgaWYgKHN0YXR1cyA9PT0gNDI5IHx8IG1lc3NhZ2Uuc3RhcnRzV2l0aCgnNDI5OicpIHx8IGxvd2VyLmluY2x1ZGVzKCdyYXRlIGxpbWl0JykpIHtcbiAgICByZXR1cm4ge1xuICAgICAga2luZDogJ3JhdGUtbGltaXRlZCcsXG4gICAgICB0ZXh0OiAnUmF0ZSBsaW1pdGVkJyxcbiAgICAgIGljb246ICdcdTIzRjMnLFxuICAgICAgdG9vbHRpcDogJ1Byb3ZpZGVyIHJhdGUgbGltaXQgcmVhY2hlZC4gV2FpdCBicmllZmx5IGFuZCByZXRyeS4nLFxuICAgIH07XG4gIH1cblxuICBpZiAoXG4gICAgc3RhdHVzID09PSA1MDIgfHxcbiAgICBzdGF0dXMgPT09IDUwMyB8fFxuICAgIHN0YXR1cyA9PT0gNTA0IHx8XG4gICAgbWVzc2FnZS5zdGFydHNXaXRoKCc1MDI6JykgfHxcbiAgICBtZXNzYWdlLnN0YXJ0c1dpdGgoJzUwMzonKSB8fFxuICAgIG1lc3NhZ2Uuc3RhcnRzV2l0aCgnNTA0OicpIHx8XG4gICAgbG93ZXIuaW5jbHVkZXMoJ3RpbWVvdXQnKSB8fFxuICAgIGxvd2VyLmluY2x1ZGVzKCd1bmF2YWlsYWJsZScpIHx8XG4gICAgbG93ZXIuaW5jbHVkZXMoJ2Nhbm5vdCByZWFjaCcpXG4gICkge1xuICAgIHJldHVybiB7XG4gICAgICBraW5kOiAndW5hdmFpbGFibGUnLFxuICAgICAgdGV4dDogJ1Byb3ZpZGVyIHVuYXZhaWxhYmxlJyxcbiAgICAgIGljb246ICdcdTI2MDEnLFxuICAgICAgdG9vbHRpcDogJ1Byb3ZpZGVyIGlzIGN1cnJlbnRseSB1bmF2YWlsYWJsZSBvciB1bnJlYWNoYWJsZS4gUmV0cnkgc29vbi4nLFxuICAgIH07XG4gIH1cblxuICAvLyA0eHggY2xpZW50IGVycm9ycyBhcmUgbm90IHRyYW5zaWVudCBcdTIwMTQgcmV0cnlpbmcgd2lsbCBub3QgZml4IHRoZW0uXG4gIGlmIChzdGF0dXMgPj0gNDAwICYmIHN0YXR1cyA8IDUwMCkge1xuICAgIHJldHVybiB7XG4gICAgICBraW5kOiAnY2xpZW50LWVycm9yJyxcbiAgICAgIHRleHQ6ICdSZXF1ZXN0IGVycm9yJyxcbiAgICAgIGljb246ICdcdTI2QTAnLFxuICAgICAgdG9vbHRpcDogbWVzc2FnZSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBraW5kOiAnZXJyb3InLFxuICAgIHRleHQ6ICdDb25uZWN0aW9uIGZhaWxlZCcsXG4gICAgaWNvbjogJ1x1MjZBMCcsXG4gICAgdG9vbHRpcDogbWVzc2FnZSxcbiAgfTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBEZWZhdWx0IExMTSBtZXNzYWdlIGhhbmRsZXJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5hc3luYyBmdW5jdGlvbiBfaGFuZGxlTExNTWVzc2FnZSh0ZXh0KSB7XG4gIF9jbGVhclJldHJ5VGltZXJzKCk7XG4gIHNldExvYWRpbmcodHJ1ZSwgJ1RoaW5raW5nXHUyMDI2Jyk7XG4gIF9zZXRMaXZlTGxtU3RhdGUoJ2Nvbm5lY3RpbmcnLCAnQ29ubmVjdGluZ1x1MjAyNicsICdcdTI5RDcnLCAnU2VuZGluZyByZXF1ZXN0IHRvIHByb3ZpZGVyLicpO1xuICBsZXQgdGVybWluYWxTdGF0ZSA9IG51bGw7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgbGxtRmV0Y2goJy9hcGkvbWVzc2FnZScsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IG1lc3NhZ2U6IHRleHQgfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IF9wYXJzZUFwaUpzb25SZXNwb25zZShyZXMsICcvYXBpL21lc3NhZ2UnKTtcblxuICAgIGlmIChkYXRhLmVycm9yKSB7XG4gICAgICBjb25zdCBlcnJvck1zZyA9IGRhdGEuZXJyb3IudG9TdHJpbmcoKTtcbiAgICAgIGNvbnN0IGRlcml2ZWQgPSBfZGVyaXZlRXJyb3JTdGF0ZShuZXcgRXJyb3IoZXJyb3JNc2cpKTtcbiAgICAgIF9zZXRMaXZlTGxtU3RhdGUoZGVyaXZlZC5raW5kLCBkZXJpdmVkLnRleHQsIGRlcml2ZWQuaWNvbiwgZGVyaXZlZC50b29sdGlwKTtcbiAgICAgIF9zY2hlZHVsZVJldHJ5KHRleHQsIGRlcml2ZWQsIG5ldyBFcnJvcihlcnJvck1zZykpO1xuICAgICAgdGVybWluYWxTdGF0ZSA9IGRlcml2ZWQ7XG4gICAgICBsb2cuZXJyb3IoJ1NlcnZlciBlcnJvcjonLCBkYXRhLmVycm9yKTtcbiAgICB9IGVsc2UgaWYgKGRhdGEucmVzcG9uc2UpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNsZWFuUmVzcG9uc2UgPSBkYXRhLnJlc3BvbnNlO1xuICAgICAgICBjb25zdCBwYXJzZWRDdXN0b21pemF0aW9uID0gZXh0cmFjdEZpcnN0SnNvbk9iamVjdChjbGVhblJlc3BvbnNlKTtcbiAgICAgICAgaWYgKHBhcnNlZEN1c3RvbWl6YXRpb24gJiYgKHBhcnNlZEN1c3RvbWl6YXRpb24ucmVjb21tZW5kZWRfZXhwZXJpZW5jZXMgfHwgcGFyc2VkQ3VzdG9taXphdGlvbi5yZWNvbW1lbmRlZF9za2lsbHMpKSB7XG4gICAgICAgICAgY29uc3QganNvblN0YXJ0ID0gY2xlYW5SZXNwb25zZS5pbmRleE9mKCd7Jyk7XG4gICAgICAgICAgY29uc3QgdGV4dEJlZm9yZUpzb24gPSBqc29uU3RhcnQgPiAwID8gY2xlYW5SZXNwb25zZS5zdWJzdHJpbmcoMCwganNvblN0YXJ0KS50cmltKCkgOiAnJztcbiAgICAgICAgICBpZiAodGV4dEJlZm9yZUpzb24gJiYgIXRleHRCZWZvcmVKc29uLmluY2x1ZGVzKCd7XCJhY3Rpb25cIjonKSkge1xuICAgICAgICAgICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgdGV4dEJlZm9yZUpzb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhd2FpdCBoYW5kbGVDdXN0b21pemF0aW9uUmVzcG9uc2UocGFyc2VkQ3VzdG9taXphdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGNsZWFuUmVzcG9uc2UudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIGNsZWFuUmVzcG9uc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZy5lcnJvcignRXJyb3IgcHJvY2Vzc2luZyBtZXNzYWdlIHJlc3BvbnNlOicsIGVyciwgZGF0YS5yZXNwb25zZSk7XG4gICAgICAgIGNvbnN0IGRlcml2ZWQgPSBfZGVyaXZlRXJyb3JTdGF0ZShlcnIpO1xuICAgICAgICBfc2V0TGl2ZUxsbVN0YXRlKGRlcml2ZWQua2luZCwgZGVyaXZlZC50ZXh0LCBkZXJpdmVkLmljb24sIGRlcml2ZWQudG9vbHRpcCk7XG4gICAgICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsIGBcdTI2QTBcdUZFMEYgSSBlbmNvdW50ZXJlZCBhbiBpc3N1ZSBwcm9jZXNzaW5nIHRoYXQgcmVzcG9uc2U6ICR7ZXJyLm1lc3NhZ2V9LiBUaGUgY29udmVyc2F0aW9uIGhhcyBiZWVuIHNhdmVkLmApO1xuICAgICAgICB0ZXJtaW5hbFN0YXRlID0gZGVyaXZlZDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbm5lY3RlZFN0YXRlID0geyBraW5kOiAnY29ubmVjdGVkJywgdGV4dDogJ0Nvbm5lY3RlZCcsIGljb246ICdcdTI3MTMnLCB0b29sdGlwOiAnUHJvdmlkZXIgcmVzcG9uZGVkIHN1Y2Nlc3NmdWxseSB0byBhIGxpdmUgcmVxdWVzdC4nIH07XG4gICAgICBfc2V0TGl2ZUxsbVN0YXRlKGNvbm5lY3RlZFN0YXRlLmtpbmQsIGNvbm5lY3RlZFN0YXRlLnRleHQsIGNvbm5lY3RlZFN0YXRlLmljb24sIGNvbm5lY3RlZFN0YXRlLnRvb2x0aXApO1xuICAgICAgdGVybWluYWxTdGF0ZSA9IGNvbm5lY3RlZFN0YXRlO1xuICAgICAgX3JldHJ5QXR0ZW1wdENvdW50ID0gMDtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nLmVycm9yKCc9PT0gTUVTU0FHRSBFUlJPUiA9PT0nLCBlcnJvci5uYW1lLCBlcnJvci5tZXNzYWdlLCBlcnJvci5zdGFjayk7XG4gICAgaWYgKGVycm9yLm5hbWUgPT09ICdBYm9ydEVycm9yJykge1xuICAgICAgLy8gVXNlciBjbGlja2VkIFN0b3AgXHUyMDE0IG1lc3NhZ2UgYWxyZWFkeSBzaG93biBieSBhYm9ydEN1cnJlbnRSZXF1ZXN0KCkuXG4gICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZGVyaXZlZCA9IF9kZXJpdmVFcnJvclN0YXRlKGVycm9yKTtcbiAgICBfc2V0TGl2ZUxsbVN0YXRlKGRlcml2ZWQua2luZCwgZGVyaXZlZC50ZXh0LCBkZXJpdmVkLmljb24sIGRlcml2ZWQudG9vbHRpcCk7XG4gICAgX3NjaGVkdWxlUmV0cnkodGV4dCwgZGVyaXZlZCwgZXJyb3IpO1xuICAgIHRlcm1pbmFsU3RhdGUgPSBkZXJpdmVkO1xuICB9XG4gIHNldExvYWRpbmcoZmFsc2UpO1xuICBhd2FpdCBmZXRjaFN0YXR1cygpO1xuICBpZiAodGVybWluYWxTdGF0ZSkge1xuICAgIF9zZXRMaXZlTGxtU3RhdGUodGVybWluYWxTdGF0ZS5raW5kLCB0ZXJtaW5hbFN0YXRlLnRleHQsIHRlcm1pbmFsU3RhdGUuaWNvbiwgdGVybWluYWxTdGF0ZS50b29sdGlwKTtcbiAgfVxuICBpZiAodHlwZW9mIGZldGNoQW5kRGlzcGxheUxsbUxvZyA9PT0gJ2Z1bmN0aW9uJykgZmV0Y2hBbmREaXNwbGF5TGxtTG9nKCk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gTWVzc2FnZSBkaXNwYXRjaCB0YWJsZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8vIEhhbmRsZXJzIGNoZWNrZWQgaW4gb3JkZXI7IGZpcnN0IG1hdGNoaW5nIHRlc3QoKSB3aW5zLlxuY29uc3QgX21lc3NhZ2VIYW5kbGVycyA9IFtcbiAge1xuICAgIHRlc3Q6IHQgPT4gdC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdyZXZpZXcgcmVjb21tZW5kYXRpb25zJykgfHwgdC50b0xvd2VyQ2FzZSgpID09PSAncmV2aWV3JyxcbiAgICBoYW5kbGU6IGFzeW5jICgpID0+IHNob3dUYWJsZUJhc2VkUmV2aWV3KCksXG4gIH0sXG4gIHtcbiAgICB0ZXN0OiAoKSA9PiB3aW5kb3cud2FpdGluZ0ZvckV4cGVyaWVuY2VSZXNwb25zZSxcbiAgICBoYW5kbGU6IGFzeW5jIHQgPT4gaGFuZGxlRXhwZXJpZW5jZVJlc3BvbnNlKHQpLFxuICB9LFxuICB7XG4gICAgdGVzdDogKCkgPT4gd2luZG93LndhaXRpbmdGb3JTa2lsbHNSZXNwb25zZSxcbiAgICBoYW5kbGU6IGFzeW5jIHQgPT4gaGFuZGxlU2tpbGxzUmVzcG9uc2UodCksXG4gIH0sXG4gIHtcbiAgICAvLyBQb3N0LWFuYWx5c2lzIHF1ZXN0aW9uIHJlc3BvbnNlIFx1MjAxNCBsb2NhbCBoYW5kbGVyICsgYmFja2VuZCBzYXZlLlxuICAgIHRlc3Q6ICgpID0+IHdpbmRvdy53YWl0aW5nRm9yUXVlc3Rpb25SZXNwb25zZSxcbiAgICBoYW5kbGU6IGFzeW5jIHQgPT4ge1xuICAgICAgY29uc3QgcXVlc3Rpb25IYW5kbGVkID0gaGFuZGxlUXVlc3Rpb25SZXNwb25zZSh0KTtcbiAgICAgIHNldExvYWRpbmcodHJ1ZSwgJ1RoaW5raW5nXHUyMDI2Jyk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBsbG1GZXRjaCgnL2FwaS9tZXNzYWdlJywge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgbWVzc2FnZTogdCB9KSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBfcGFyc2VBcGlKc29uUmVzcG9uc2UocmVzLCAnL2FwaS9tZXNzYWdlJyk7XG4gICAgICAgIGlmIChkYXRhLmVycm9yKSB7XG4gICAgICAgICAgbG9nLmVycm9yKCdCYWNrZW5kIGVycm9yIHNhdmluZyBxdWVzdGlvbiByZXNwb25zZTonLCBkYXRhLmVycm9yKTtcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLnJlc3BvbnNlICYmICFxdWVzdGlvbkhhbmRsZWQpIHtcbiAgICAgICAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCBkYXRhLnJlc3BvbnNlKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChlcnIubmFtZSAhPT0gJ0Fib3J0RXJyb3InKSBsb2cuZXJyb3IoJz09PSBRVUVTVElPTiBSRVNQT05TRSBTQVZFIEVSUk9SID09PScsIGVycik7XG4gICAgICB9XG4gICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICAgIGlmICghcXVlc3Rpb25IYW5kbGVkKSBhd2FpdCBfaGFuZGxlTExNTWVzc2FnZSh0KTtcbiAgICB9LFxuICB9LFxuICB7XG4gICAgdGVzdDogdCA9PiB0LnRvTG93ZXJDYXNlKCkgPT09ICdwcm9jZWVkJyxcbiAgICBoYW5kbGU6IGFzeW5jICgpID0+IHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zXG4gICAgICA/IHNob3dUYWJsZUJhc2VkUmV2aWV3KClcbiAgICAgIDogc2VuZEFjdGlvbigncmVjb21tZW5kX2N1c3RvbWl6YXRpb25zJyksXG4gIH0sXG4gIHtcbiAgICB0ZXN0OiAoKSA9PiB0cnVlLFxuICAgIGhhbmRsZTogX2hhbmRsZUxMTU1lc3NhZ2UsXG4gIH0sXG5dO1xuXG5hc3luYyBmdW5jdGlvbiBzZW5kTWVzc2FnZSgpIHtcbiAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWVzc2FnZS1pbnB1dCcpO1xuICBjb25zdCB0ZXh0ID0gbm9ybWFsaXplVGV4dChpbnB1dC52YWx1ZSk7XG4gIGlmICghdGV4dCB8fCBzdGF0ZU1hbmFnZXIuaXNMb2FkaW5nKCkpIHJldHVybjtcblxuICBpZiAoIWdldFNlc3Npb25JZEZyb21VUkwoKSkge1xuICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsICdcdTI2QTBcdUZFMEYgTm8gYWN0aXZlIHNlc3Npb24uIENyZWF0ZSBvciBsb2FkIGEgc2Vzc2lvbiBiZWZvcmUgc2VuZGluZyBtZXNzYWdlcy4nKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBhcHBlbmRNZXNzYWdlKCd1c2VyJywgdGV4dCk7XG4gIGlucHV0LnZhbHVlID0gJyc7XG5cbiAgZm9yIChjb25zdCBoYW5kbGVyIG9mIF9tZXNzYWdlSGFuZGxlcnMpIHtcbiAgICBpZiAoaGFuZGxlci50ZXN0KHRleHQpKSB7XG4gICAgICBhd2FpdCBoYW5kbGVyLmhhbmRsZSh0ZXh0KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBJbnRha2UgY29uZmlybWF0aW9uIGNhcmQgKEdBUC0yMylcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5hc3luYyBmdW5jdGlvbiBfc2hvd0ludGFrZUNvbmZpcm1DYXJkKGNvbnRpbnVhdGlvbiA9IG51bGwpIHtcbiAgaWYgKHR5cGVvZiBjb250aW51YXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICBfcGVuZGluZ1Bvc3RJbnRha2VDb250aW51YXRpb24gPSBjb250aW51YXRpb247XG4gIH1cblxuICBsZXQgZXh0cmFjdGVkID0ge3JvbGU6ICcnLCBjb21wYW55OiAnJywgZGF0ZV9hcHBsaWVkOiAnJ307XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGxsbUZldGNoKCcvYXBpL2ludGFrZS1tZXRhZGF0YScpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLmNvbmZpcm1lZCkge1xuICAgICAgYXdhaXQgX3Byb2NlZWRBZnRlckludGFrZShjb250aW51YXRpb24pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBleHRyYWN0ZWQgPSBkYXRhO1xuICB9IGNhdGNoIChfZSkgeyAvKiBmYWxsIHRocm91Z2ggd2l0aCBlbXB0eSBkZWZhdWx0cyAqLyB9XG5cbiAgY29uc3QgdG9kYXkgPSBleHRyYWN0ZWQuZGF0ZV9hcHBsaWVkIHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zbGljZSgwLCAxMCk7XG4gIGNvbnN0IGNhcmRIdG1sID0gYFxuICAgIDxkaXYgY2xhc3M9XCJpbnRha2UtY29uZmlybS1jYXJkXCIgaWQ9XCJpbnRha2UtY29uZmlybS1jYXJkXCIgcm9sZT1cImZvcm1cIiBhcmlhLWxhYmVsPVwiQ29uZmlybSBqb2IgZGV0YWlsc1wiPlxuICAgICAgPGgzPlx1RDgzRFx1RENDQiBDb25maXJtIGpvYiBkZXRhaWxzPC9oMz5cbiAgICAgIDxwPlJldmlldyB0aGUgZXh0cmFjdGVkIGRldGFpbHMgYmVmb3JlIGFuYWx5c2lzIGJlZ2lucy4gRWRpdCBhbnkgZmllbGQgaWYgbmVlZGVkLjwvcD5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbnRha2UtZmllbGQtcm93XCI+XG4gICAgICAgIDxsYWJlbCBmb3I9XCJpbnRha2Utcm9sZS1pbnB1dFwiPlJvbGUgLyBKb2IgVGl0bGU8L2xhYmVsPlxuICAgICAgICA8aW5wdXQgaWQ9XCJpbnRha2Utcm9sZS1pbnB1dFwiIHR5cGU9XCJ0ZXh0XCIgdmFsdWU9XCIke2VzY2FwZUh0bWwoZXh0cmFjdGVkLnJvbGUgfHwgJycpfVwiXG4gICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gU2VuaW9yIFNvZnR3YXJlIEVuZ2luZWVyXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbnRha2UtZmllbGQtcm93XCI+XG4gICAgICAgIDxsYWJlbCBmb3I9XCJpbnRha2UtY29tcGFueS1pbnB1dFwiPkNvbXBhbnk8L2xhYmVsPlxuICAgICAgICA8aW5wdXQgaWQ9XCJpbnRha2UtY29tcGFueS1pbnB1dFwiIHR5cGU9XCJ0ZXh0XCIgdmFsdWU9XCIke2VzY2FwZUh0bWwoZXh0cmFjdGVkLmNvbXBhbnkgfHwgJycpfVwiXG4gICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gQWNtZSBDb3JwXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbnRha2UtZmllbGQtcm93XCI+XG4gICAgICAgIDxsYWJlbCBmb3I9XCJpbnRha2UtZGF0ZS1pbnB1dFwiPkRhdGUgQXBwbGllZDwvbGFiZWw+XG4gICAgICAgIDxpbnB1dCBpZD1cImludGFrZS1kYXRlLWlucHV0XCIgdHlwZT1cImRhdGVcIiB2YWx1ZT1cIiR7ZXNjYXBlSHRtbCh0b2RheSl9XCI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbnRha2UtYWN0aW9uc1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLXNlY29uZGFyeVwiIG9uY2xpY2s9XCJfc2tpcEludGFrZUNhcmQoKVwiIHR5cGU9XCJidXR0b25cIj5Ta2lwPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4tcHJpbWFyeVwiICAgb25jbGljaz1cIl9zdWJtaXRJbnRha2VDYXJkKClcIiB0eXBlPVwiYnV0dG9uXCIgaWQ9XCJpbnRha2UtY29uZmlybS1idG5cIj5Db25maXJtICZhbXA7IENvbnRpbnVlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xuICBhcHBlbmRSYXdIdG1sKGNhcmRIdG1sKTtcblxuICBjb25zdCByb2xlSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW50YWtlLXJvbGUtaW5wdXQnKTtcbiAgaWYgKHJvbGVJbnB1dCAmJiAhcm9sZUlucHV0LnZhbHVlLnRyaW0oKSkgcm9sZUlucHV0LmZvY3VzKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9zdWJtaXRJbnRha2VDYXJkKGNvbnRpbnVhdGlvbiA9IG51bGwpIHtcbiAgY29uc3Qgcm9sZSAgICAgICAgID0gKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnRha2Utcm9sZS1pbnB1dCcpPy52YWx1ZSAgICB8fCAnJykudHJpbSgpO1xuICBjb25zdCBjb21wYW55ICAgICAgPSAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ludGFrZS1jb21wYW55LWlucHV0Jyk/LnZhbHVlIHx8ICcnKS50cmltKCk7XG4gIGNvbnN0IGRhdGVfYXBwbGllZCA9IChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW50YWtlLWRhdGUtaW5wdXQnKT8udmFsdWUgICAgfHwgJycpLnRyaW0oKTtcblxuICBjb25zdCBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW50YWtlLWNvbmZpcm0tYnRuJyk7XG4gIGlmIChidG4pIGJ0bi5kaXNhYmxlZCA9IHRydWU7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBsbG1GZXRjaCgnL2FwaS9jb25maXJtLWludGFrZScsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeydDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbid9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe3JvbGUsIGNvbXBhbnksIGRhdGVfYXBwbGllZH0pLFxuICAgIH0pO1xuICB9IGNhdGNoIChfZSkgeyAvKiBub24tZmF0YWwgKi8gfVxuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnRha2UtY29uZmlybS1jYXJkJyk/LnJlbW92ZSgpO1xuICBhd2FpdCBfcHJvY2VlZEFmdGVySW50YWtlKGNvbnRpbnVhdGlvbik7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9za2lwSW50YWtlQ2FyZChjb250aW51YXRpb24gPSBudWxsKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnRha2UtY29uZmlybS1jYXJkJyk/LnJlbW92ZSgpO1xuICBhd2FpdCBfcHJvY2VlZEFmdGVySW50YWtlKGNvbnRpbnVhdGlvbik7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9wcm9jZWVkQWZ0ZXJJbnRha2UoY29udGludWF0aW9uID0gbnVsbCkge1xuICBjb25zdCBlZmZlY3RpdmVDb250aW51YXRpb24gPVxuICAgICh0eXBlb2YgY29udGludWF0aW9uID09PSAnZnVuY3Rpb24nICYmIGNvbnRpbnVhdGlvbilcbiAgICB8fCBfcGVuZGluZ1Bvc3RJbnRha2VDb250aW51YXRpb25cbiAgICB8fCAoYXN5bmMgKCkgPT4gYW5hbHl6ZUpvYigpKTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBsbG1GZXRjaCgnL2FwaS9wcmlvci1jbGFyaWZpY2F0aW9ucycpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLmZvdW5kICYmIGRhdGEubWF0Y2hlcyAmJiBkYXRhLm1hdGNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgYmVzdCA9IGRhdGEubWF0Y2hlc1swXTtcbiAgICAgIF9wZW5kaW5nUG9zdEludGFrZUNvbnRpbnVhdGlvbiA9IGVmZmVjdGl2ZUNvbnRpbnVhdGlvbjtcbiAgICAgIGF3YWl0IF9vZmZlclByaW9yQ2xhcmlmaWNhdGlvbnMoYmVzdCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9IGNhdGNoIChfZSkgeyAvKiBmYWxsIHRocm91Z2ggKi8gfVxuXG4gIF9wZW5kaW5nUG9zdEludGFrZUNvbnRpbnVhdGlvbiA9IG51bGw7XG4gIGF3YWl0IGVmZmVjdGl2ZUNvbnRpbnVhdGlvbigpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBfb2ZmZXJQcmlvckNsYXJpZmljYXRpb25zKG1hdGNoKSB7XG4gIGNvbnN0IHJvbGVOYW1lID0gZXNjYXBlSHRtbChtYXRjaC5yb2xlIHx8IG1hdGNoLnBvc2l0aW9uX25hbWUgfHwgJ2Egc2ltaWxhciByb2xlJyk7XG4gIGNvbnN0IGJhbm5lckh0bWwgPSBgXG4gICAgPGRpdiBjbGFzcz1cInByaW9yLWNsYXJpZmljYXRpb25zLWJhbm5lclwiIGlkPVwicHJpb3ItY2xhci1iYW5uZXJcIiByb2xlPVwic3RhdHVzXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicGNiLXRleHRcIj5cbiAgICAgICAgXHVEODNEXHVEQ0ExIEZvdW5kIHByaW9yIGFuc3dlcnMgZnJvbSA8c3BhbiBjbGFzcz1cInBjYi1yb2xlXCI+JHtyb2xlTmFtZX08L3NwYW4+LlxuICAgICAgICBMb2FkIHRoZW0gYXMgZGVmYXVsdHMgZm9yIHRoZSBjbGFyaWZpY2F0aW9uIHF1ZXN0aW9ucz9cbiAgICAgIDwvZGl2PlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1zZWNvbmRhcnlcIiBvbmNsaWNrPVwiX2Rpc21pc3NQcmlvckNsYXJpZmljYXRpb25zKClcIiB0eXBlPVwiYnV0dG9uXCI+Tm8gdGhhbmtzPC9idXR0b24+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLXByaW1hcnlcIiAgIG9uY2xpY2s9XCJfbG9hZFByaW9yQ2xhcmlmaWNhdGlvbnMoKVwiIHR5cGU9XCJidXR0b25cIiBpZD1cInBjYi1sb2FkLWJ0blwiPkxvYWQgZGVmYXVsdHM8L2J1dHRvbj5cbiAgICA8L2Rpdj5gO1xuICBhcHBlbmRSYXdIdG1sKGJhbm5lckh0bWwpO1xuXG4gIHdpbmRvdy5fcGVuZGluZ1ByaW9yQW5zd2VycyA9IG1hdGNoLmFuc3dlcnMgfHwge307XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9kaXNtaXNzUHJpb3JDbGFyaWZpY2F0aW9ucygpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ByaW9yLWNsYXItYmFubmVyJyk/LnJlbW92ZSgpO1xuICBkZWxldGUgd2luZG93Ll9wZW5kaW5nUHJpb3JBbnN3ZXJzO1xuICBjb25zdCBjb250aW51YXRpb24gPSBfcGVuZGluZ1Bvc3RJbnRha2VDb250aW51YXRpb24gfHwgKGFzeW5jICgpID0+IGFuYWx5emVKb2IoKSk7XG4gIF9wZW5kaW5nUG9zdEludGFrZUNvbnRpbnVhdGlvbiA9IG51bGw7XG4gIGF3YWl0IGNvbnRpbnVhdGlvbigpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBfbG9hZFByaW9yQ2xhcmlmaWNhdGlvbnMoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcmlvci1jbGFyLWJhbm5lcicpPy5yZW1vdmUoKTtcbiAgY29uc3QgYW5zd2VycyA9IHdpbmRvdy5fcGVuZGluZ1ByaW9yQW5zd2VycyB8fCB7fTtcbiAgZGVsZXRlIHdpbmRvdy5fcGVuZGluZ1ByaW9yQW5zd2VycztcbiAgaWYgKHR5cGVvZiBxdWVzdGlvbkFuc3dlcnMgPT09ICdvYmplY3QnICYmIHF1ZXN0aW9uQW5zd2VycyAhPT0gbnVsbCkge1xuICAgIE9iamVjdC5hc3NpZ24ocXVlc3Rpb25BbnN3ZXJzLCBhbnN3ZXJzKTtcbiAgfSBlbHNlIHtcbiAgICB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgYW5zd2Vycyk7XG4gIH1cbiAgY29uc3QgY29udGludWF0aW9uID0gX3BlbmRpbmdQb3N0SW50YWtlQ29udGludWF0aW9uIHx8IChhc3luYyAoKSA9PiBhbmFseXplSm9iKCkpO1xuICBfcGVuZGluZ1Bvc3RJbnRha2VDb250aW51YXRpb24gPSBudWxsO1xuICBhd2FpdCBjb250aW51YXRpb24oKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEVTIG1vZHVsZSBleHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuZXhwb3J0IHtcbiAgX2hhbmRsZUxMTU1lc3NhZ2UsXG4gIF9tZXNzYWdlSGFuZGxlcnMsXG4gIHNlbmRNZXNzYWdlLFxuICBfc2hvd0ludGFrZUNvbmZpcm1DYXJkLFxuICBfc3VibWl0SW50YWtlQ2FyZCxcbiAgX3NraXBJbnRha2VDYXJkLFxuICBfcHJvY2VlZEFmdGVySW50YWtlLFxuICBfb2ZmZXJQcmlvckNsYXJpZmljYXRpb25zLFxuICBfZGlzbWlzc1ByaW9yQ2xhcmlmaWNhdGlvbnMsXG4gIF9sb2FkUHJpb3JDbGFyaWZpY2F0aW9ucyxcbn07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9xdWVzdGlvbnMtcGFuZWwuanNcbiAqIFBvc3QtYW5hbHlzaXMgY2xhcmlmeWluZyBxdWVzdGlvbnMgcGFuZWw6IHJlbmRlciwgZHJhZnQsIHN1Ym1pdC5cbiAqXG4gKiBERVBFTkRFTkNJRVMgKGFsbCBvbiBnbG9iYWxUaGlzIGF0IHJ1bnRpbWUpOlxuICogICAtIGNsZWFuSnNvblJlc3BvbnNlICh1dGlscy5qcylcbiAqICAgLSBtZXJnZVBvc3RBbmFseXNpc1F1ZXN0aW9ucywgbm9ybWFsaXplUG9zdEFuYWx5c2lzUXVlc3Rpb25zIChqb2ItYW5hbHlzaXMuanMpXG4gKiAgIC0gYnVpbGRGYWxsYmFja1Bvc3RBbmFseXNpc1F1ZXN0aW9ucyAocmVjb21tZW5kYXRpb24taGVscGVycy5qcylcbiAqICAgLSBhcHBlbmRNZXNzYWdlIChtZXNzYWdlLXF1ZXVlLmpzKVxuICogICAtIHNlbmRBY3Rpb24gKHNlc3Npb24tYWN0aW9ucy5qcylcbiAqICAgLSBlc2NhcGVIdG1sICh1dGlscy5qcylcbiAqICAgLSBzd2l0Y2hUYWIgKHJldmlldy10YWJsZS1iYXNlLmpzLCBUaWVyIDQpXG4gKiAgIC0gc3RhdGVNYW5hZ2VyIChzdGF0ZS1tYW5hZ2VyLmpzIFx1MjAxNCBnZXRUYWJEYXRhKCkpXG4gKiAgIC0gcG9zdEFuYWx5c2lzUXVlc3Rpb25zLCBxdWVzdGlvbkFuc3dlcnMgKHdpbmRvdyBnbG9iYWxzKVxuICovXG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmNvbnN0IGxvZyA9IGdldExvZ2dlcigncXVlc3Rpb25zLXBhbmVsJyk7XG5cbmltcG9ydCB7IHN0YXRlTWFuYWdlciB9IGZyb20gJy4vc3RhdGUtbWFuYWdlci5qcyc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU3RhdGUgcGVyc2lzdGVuY2UgaGVscGVyc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmFzeW5jIGZ1bmN0aW9uIHBlcnNpc3RQb3N0QW5hbHlzaXNTdGF0ZSgpIHtcbiAgdHJ5IHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkod2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucykpIHtcbiAgICAgIHdpbmRvdy5wb3N0QW5hbHlzaXNRdWVzdGlvbnMgPSBbXTtcbiAgICB9XG4gICAgaWYgKCF3aW5kb3cucXVlc3Rpb25BbnN3ZXJzIHx8IHR5cGVvZiB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzICE9PSAnb2JqZWN0Jykge1xuICAgICAgd2luZG93LnF1ZXN0aW9uQW5zd2VycyA9IHt9O1xuICAgIH1cblxuICAgIGF3YWl0IGZldGNoKCcvYXBpL3Bvc3QtYW5hbHlzaXMtcmVzcG9uc2VzJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgcXVlc3Rpb25zOiB3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zLFxuICAgICAgICBhbnN3ZXJzOiB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzXG4gICAgICB9KVxuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy53YXJuKCdGYWlsZWQgdG8gcGVyc2lzdCBwb3N0LWFuYWx5c2lzIHN0YXRlOicsIGVycm9yKTtcbiAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIE1hcmtkb3duIHJlbmRlcmVyIGZvciBxdWVzdGlvbiB0ZXh0XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gcmVuZGVyUXVlc3Rpb25NYXJrZG93bihtYXJrZG93blRleHQpIHtcbiAgY29uc3Qgc2FmZSA9IGVzY2FwZUh0bWwobWFya2Rvd25UZXh0IHx8ICcnKTtcbiAgcmV0dXJuIHNhZmVcbiAgICAucmVwbGFjZSgvXFwqXFwqKC4rPylcXCpcXCovZywgJzxzdHJvbmc+JDE8L3N0cm9uZz4nKVxuICAgIC5yZXBsYWNlKC9cXCooLis/KVxcKi9nLCAnPGVtPiQxPC9lbT4nKVxuICAgIC5yZXBsYWNlKC9gKFteYF0rKWAvZywgJzxjb2RlPiQxPC9jb2RlPicpXG4gICAgLnJlcGxhY2UoL1xcbi9nLCAnPGJyPicpO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEFQSSBmZXRjaCBmb3IgcXVlc3Rpb25zXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hQb3N0QW5hbHlzaXNRdWVzdGlvbnNGcm9tQXBpKGFuYWx5c2lzRGF0YSkge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3Bvc3QtYW5hbHlzaXMtcXVlc3Rpb25zJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgYW5hbHlzaXM6IGFuYWx5c2lzRGF0YSB9KVxuICAgIH0pO1xuICAgIGlmICghcmVzLm9rKSByZXR1cm4gW107XG4gICAgY29uc3QgcGF5bG9hZCA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZVBvc3RBbmFseXNpc1F1ZXN0aW9ucyhwYXlsb2FkLnF1ZXN0aW9ucyk7XG4gIH0gY2F0Y2ggKGFwaUVycm9yKSB7XG4gICAgbG9nLndhcm4oJ0ZhaWxlZCB0byBmZXRjaCBwb3N0LWFuYWx5c2lzIHF1ZXN0aW9uczonLCBhcGlFcnJvcik7XG4gICAgcmV0dXJuIFtdO1xuICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gTWFpbiBvcmNoZXN0cmF0b3I6IGNhbGxlZCBhZnRlciBhbmFseXplSm9iIGNvbXBsZXRlc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmFzeW5jIGZ1bmN0aW9uIGFza1Bvc3RBbmFseXNpc1F1ZXN0aW9ucyhhbmFseXNpc1Jlc3VsdCwgcHJlZmVycmVkUXVlc3Rpb25zID0gbnVsbCkge1xuICB0cnkge1xuICAgIGxldCBkYXRhO1xuICAgIGlmIChhbmFseXNpc1Jlc3VsdCAhPT0gbnVsbCAmJiB0eXBlb2YgYW5hbHlzaXNSZXN1bHQgPT09ICdvYmplY3QnKSB7XG4gICAgICBkYXRhID0gYW5hbHlzaXNSZXN1bHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNsZWFuUmVzdWx0ID0gY2xlYW5Kc29uUmVzcG9uc2UoYW5hbHlzaXNSZXN1bHQpO1xuICAgICAgZGF0YSA9IHR5cGVvZiBjbGVhblJlc3VsdCA9PT0gJ3N0cmluZycgPyBKU09OLnBhcnNlKGNsZWFuUmVzdWx0KSA6IGNsZWFuUmVzdWx0O1xuICAgIH1cblxuICAgIHdpbmRvdy5wb3N0QW5hbHlzaXNRdWVzdGlvbnMgPSBtZXJnZVBvc3RBbmFseXNpc1F1ZXN0aW9ucyhbXSwgcHJlZmVycmVkUXVlc3Rpb25zKTtcblxuICAgIGlmICh3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgd2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucyA9IGF3YWl0IGZldGNoUG9zdEFuYWx5c2lzUXVlc3Rpb25zRnJvbUFwaShkYXRhKTtcbiAgICB9XG5cbiAgICBpZiAod2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHdpbmRvdy5wb3N0QW5hbHlzaXNRdWVzdGlvbnMgPSBidWlsZEZhbGxiYWNrUG9zdEFuYWx5c2lzUXVlc3Rpb25zKGRhdGEpO1xuICAgIH1cblxuICAgIGlmICghd2luZG93LnF1ZXN0aW9uQW5zd2VycyB8fCB0eXBlb2Ygd2luZG93LnF1ZXN0aW9uQW5zd2VycyAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHdpbmRvdy5xdWVzdGlvbkFuc3dlcnMgPSB7fTtcbiAgICB9XG4gICAgYXdhaXQgcGVyc2lzdFBvc3RBbmFseXNpc1N0YXRlKCk7XG5cbiAgICBpZiAod2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICByZW5kZXJRdWVzdGlvbnNQYW5lbCgpO1xuICAgICAgc3dpdGNoVGFiKCdxdWVzdGlvbnMnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ0FuYWx5c2lzIGNvbXBsZXRlISBObyBjbGFyaWZ5aW5nIHF1ZXN0aW9ucyBuZWVkZWQuIEdlbmVyYXRpbmcgY3VzdG9taXphdGlvbiByZWNvbW1lbmRhdGlvbnNcdTIwMjYnKTtcbiAgICAgIGF3YWl0IHNlbmRBY3Rpb24oJ3JlY29tbWVuZF9jdXN0b21pemF0aW9ucycpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZy5lcnJvcignRXJyb3IgcGFyc2luZyBhbmFseXNpcyBmb3IgcXVlc3Rpb25zOicsIGUpO1xuICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsICdBbmFseXNpcyBjb21wbGV0ZSEgQ2xpY2sgXCJSZWNvbW1lbmQgQ3VzdG9taXphdGlvbnNcIiB3aGVuIHJlYWR5LicpO1xuICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVGFiIHBvcHVsYXRpb25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiBwb3B1bGF0ZVF1ZXN0aW9uc1RhYigpIHtcbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIGlmICghY29udGVudCkgcmV0dXJuO1xuXG4gIGlmICghc3RhdGVNYW5hZ2VyLmdldFRhYkRhdGEoJ2FuYWx5c2lzJykpIHtcbiAgICBjb250ZW50LmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwiZW1wdHktc3RhdGVcIj48ZGl2IGNsYXNzPVwiaWNvblwiPlx1RDgzRFx1RENBQzwvZGl2PjxoMz5ObyBRdWVzdGlvbnMgWWV0PC9oMz48cD5SdW4gXCJBbmFseXNlIEpvYlwiIGZpcnN0IHRvIGdlbmVyYXRlIGNsYXJpZnlpbmcgcXVlc3Rpb25zLjwvcD48L2Rpdj4nO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGhhc1F1ZXN0aW9ucyA9IEFycmF5LmlzQXJyYXkod2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucykgJiYgd2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucy5sZW5ndGggPiAwO1xuICBpZiAoIWhhc1F1ZXN0aW9ucykge1xuICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJlbXB0eS1zdGF0ZVwiPjxkaXYgY2xhc3M9XCJpY29uXCI+XHUyNzA1PC9kaXY+PGgzPlF1ZXN0aW9ucyBDb21wbGV0ZTwvaDM+PHA+Tm8gcGVuZGluZyBjbGFyaWZ5aW5nIHF1ZXN0aW9ucyBcdTIwMTQgY3VzdG9taXphdGlvbiByZWNvbW1lbmRhdGlvbnMgd2lsbCBiZSBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS48L3A+PC9kaXY+JztcbiAgICByZXR1cm47XG4gIH1cblxuICBfY3VycmVudEdyb3VwID0gMDtcbiAgY29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImFuYWx5c2lzLXBhZ2VcIj48ZGl2IGNsYXNzPVwiYW5hbHlzaXMtc2VjdGlvblwiPjxoMj5cdUQ4M0RcdURDQUMgQ2xhcmlmeWluZyBRdWVzdGlvbnM8L2gyPjxwIHN0eWxlPVwiY29sb3I6IzY0NzQ4YjsgbWFyZ2luOiAwO1wiPlBsZWFzZSBhbnN3ZXIgZWFjaCBxdWVzdGlvbiB0byBpbXByb3ZlIHJlY29tbWVuZGF0aW9uIHF1YWxpdHkuPC9wPjwvZGl2PjwvZGl2Pic7XG4gIHJlbmRlclF1ZXN0aW9uc1BhbmVsKCk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUGFuZWwgcmVuZGVyZXJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiByZW5kZXJRdWVzdGlvbnNQYW5lbCgpIHtcbiAgY29uc3QgcXMgPSB3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zIHx8IFtdO1xuICBpZiAocXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIGlmICghY29udGVudCkgcmV0dXJuO1xuXG4gIGNvbnN0IGV4aXN0aW5nID0gY29udGVudC5xdWVyeVNlbGVjdG9yKCcucXVlc3Rpb25zLXBhbmVsJyk7XG4gIGlmIChleGlzdGluZykgZXhpc3RpbmcucmVtb3ZlKCk7XG5cbiAgY29uc3QgdG90YWwgICAgICA9IHFzLmxlbmd0aDtcbiAgY29uc3QgbnVtR3JvdXBzICA9IE1hdGguY2VpbCh0b3RhbCAvIEdST1VQX1NJWkUpO1xuICAvLyBDbGFtcCBncm91cCBpbmRleCBpbiBjYXNlIHFzIHNocmFuayBzaW5jZSBsYXN0IHJlbmRlci5cbiAgX2N1cnJlbnRHcm91cCAgICA9IE1hdGgubWluKF9jdXJyZW50R3JvdXAsIG51bUdyb3VwcyAtIDEpO1xuICBjb25zdCBncm91cFN0YXJ0ID0gX2N1cnJlbnRHcm91cCAqIEdST1VQX1NJWkU7XG4gIGNvbnN0IGdyb3VwRW5kICAgPSBNYXRoLm1pbihncm91cFN0YXJ0ICsgR1JPVVBfU0laRSwgdG90YWwpO1xuICBjb25zdCBncm91cFFzICAgID0gcXMuc2xpY2UoZ3JvdXBTdGFydCwgZ3JvdXBFbmQpO1xuICBjb25zdCBpc0xhc3RHcm91cCA9IF9jdXJyZW50R3JvdXAgPT09IG51bUdyb3VwcyAtIDE7XG5cbiAgY29uc3QgZXhpc3RpbmdBbnN3ZXJzID0gKHdpbmRvdy5xdWVzdGlvbkFuc3dlcnMgJiYgdHlwZW9mIHdpbmRvdy5xdWVzdGlvbkFuc3dlcnMgPT09ICdvYmplY3QnKVxuICAgID8gd2luZG93LnF1ZXN0aW9uQW5zd2VycyA6IHt9O1xuXG4gIGNvbnN0IGdyb3VwTGFiZWwgPSBudW1Hcm91cHMgPiAxXG4gICAgPyBgR3JvdXAgJHtfY3VycmVudEdyb3VwICsgMX0gb2YgJHtudW1Hcm91cHN9YFxuICAgIDogYCR7dG90YWx9IHF1ZXN0aW9uJHt0b3RhbCA+IDEgPyAncycgOiAnJ31gO1xuXG4gIGNvbnN0IGdyb3VwTmF2SHRtbCA9IG51bUdyb3VwcyA+IDEgPyByZW5kZXJRR3JvdXBOYXYobnVtR3JvdXBzLCBxcywgZXhpc3RpbmdBbnN3ZXJzKSA6ICcnO1xuXG4gIGxldCBwYW5lbEh0bWwgPSBgPGRpdiBjbGFzcz1cInF1ZXN0aW9ucy1wYW5lbFwiIGlkPVwicXVlc3Rpb25zLXBhbmVsXCI+XG4gICAgPGgyPlx1RDgzRFx1RENBQyBBIGZldyBxdWljayBxdWVzdGlvbnM8L2gyPlxuICAgIDxwIGNsYXNzPVwicS1wcm9ncmVzc1wiIGlkPVwicS1wcm9ncmVzc1wiPiR7Z3JvdXBMYWJlbH0gXHUyMDE0IGFuc3dlciBlYWNoIHRvIGNvbnRpbnVlLjwvcD5cbiAgICAke2dyb3VwTmF2SHRtbH1gO1xuXG4gIGdyb3VwUXMuZm9yRWFjaCgocSwgbG9jYWxJZHgpID0+IHtcbiAgICBjb25zdCBpZHggPSBncm91cFN0YXJ0ICsgbG9jYWxJZHg7XG4gICAgY29uc3Qgc2F2ZWRBbnN3ZXIgPSAoZXhpc3RpbmdBbnN3ZXJzW3EudHlwZV0gfHwgJycpLnRvU3RyaW5nKCk7XG4gICAgY29uc3QgaXNBbnN3ZXJlZCAgPSBzYXZlZEFuc3dlci50cmltKCkubGVuZ3RoID4gMDtcbiAgICBjb25zdCByZW5kZXJlZFF1ZXN0aW9uID0gcmVuZGVyUXVlc3Rpb25NYXJrZG93bihxLnF1ZXN0aW9uKTtcbiAgICBjb25zdCBjaGlwcyA9IChxLmNob2ljZXMgfHwgW10pLm1hcCgoYywgY2kpID0+XG4gICAgICBgPGJ1dHRvbiBjbGFzcz1cInEtY2hpcFwiIGRhdGEtcWlkeD1cIiR7aWR4fVwiIGRhdGEtY2lkeD1cIiR7Y2l9XCIgb25jbGljaz1cInNlbGVjdFFDaGlwKHRoaXMsICR7aWR4fSlcIj4ke2VzY2FwZUh0bWwoYyl9PC9idXR0b24+YFxuICAgICkuam9pbignJyk7XG4gICAgcGFuZWxIdG1sICs9IGBcbiAgICAgIDxkaXYgY2xhc3M9XCJxdWVzdGlvbi1pdGVtJHtpc0Fuc3dlcmVkID8gJyBhbnN3ZXJlZCcgOiAnJ31cIiBpZD1cInEtaXRlbS0ke2lkeH1cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInEtaGVhZGVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInEtdGV4dFwiPiR7aWR4ICsgMX0uICR7cmVuZGVyZWRRdWVzdGlvbn08L2Rpdj5cbiAgICAgICAgICAke2lzQW5zd2VyZWQgPyAnPHNwYW4gY2xhc3M9XCJxLWFuc3dlcmVkLWJhZGdlXCI+XHUyNzEzIEFuc3dlcmVkPC9zcGFuPicgOiAnJ31cbiAgICAgICAgPC9kaXY+XG4gICAgICAgICR7Y2hpcHMgPyBgPGRpdiBjbGFzcz1cInEtY2hpcHNcIj4ke2NoaXBzfTwvZGl2PmAgOiAnJ31cbiAgICAgICAgPGRpdiBjbGFzcz1cInEtYW5zd2VyLXJvd1wiPlxuICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cInEtaW5wdXRcIiBpZD1cInEtaW5wdXQtJHtpZHh9XCIgcGxhY2Vob2xkZXI9XCJZb3VyIGFuc3dlclx1MjAyNlwiIG9uaW5wdXQ9XCJvblFJbnB1dENoYW5nZSgke2lkeH0pXCI+JHtlc2NhcGVIdG1sKHNhdmVkQW5zd2VyKX08L3RleHRhcmVhPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJxLWRyYWZ0LWJ0blwiIGlkPVwicS1kcmFmdC1idG4tJHtpZHh9XCIgb25jbGljaz1cImRyYWZ0UXVlc3Rpb25SZXNwb25zZSgke2lkeH0pXCIgdGl0bGU9XCJHZW5lcmF0ZSBhIGRyYWZ0IGFuc3dlciB1c2luZyBBSVwiPlx1MjcyOCBEcmFmdDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PmA7XG4gIH0pO1xuXG4gIGlmIChpc0xhc3RHcm91cCkge1xuICAgIHBhbmVsSHRtbCArPSBgPGJ1dHRvbiBjbGFzcz1cInF1ZXN0aW9ucy1zdWJtaXQtYnRuXCIgaWQ9XCJxLXN1Ym1pdC1idG5cIiBvbmNsaWNrPVwic3VibWl0QWxsQW5zd2VycygpXCIgZGlzYWJsZWQ+U3VibWl0IEFuc3dlcnM8L2J1dHRvbj5gO1xuICB9IGVsc2Uge1xuICAgIHBhbmVsSHRtbCArPSBgPGJ1dHRvbiBjbGFzcz1cInF1ZXN0aW9ucy1zdWJtaXQtYnRuXCIgaWQ9XCJxLXN1Ym1pdC1idG5cIiBvbmNsaWNrPVwiYWR2YW5jZVFHcm91cCgpXCIgZGlzYWJsZWQ+Q29udGludWUgXHUyMTkyIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjAuOGVtO2ZvbnQtd2VpZ2h0OjQwMDtcIj4oJHtncm91cEVuZH0gb2YgJHt0b3RhbH0gYW5zd2VyZWQpPC9zcGFuPjwvYnV0dG9uPmA7XG4gIH1cbiAgcGFuZWxIdG1sICs9ICc8L2Rpdj4nO1xuXG4gIGNvbnRlbnQuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCBwYW5lbEh0bWwpO1xuXG4gIC8vIFJlc3RvcmUgY2hpcCBzZWxlY3Rpb24gZm9yIGFueSBxdWVzdGlvbiB3aG9zZSBzYXZlZCBhbnN3ZXIgbWF0Y2hlcyBhIGNoaXAgbGFiZWwuXG4gIGdyb3VwUXMuZm9yRWFjaCgocSwgbG9jYWxJZHgpID0+IHtcbiAgICBjb25zdCBpZHggPSBncm91cFN0YXJ0ICsgbG9jYWxJZHg7XG4gICAgY29uc3Qgc2F2ZWQgPSAoZXhpc3RpbmdBbnN3ZXJzW3EudHlwZV0gfHwgJycpLnRvU3RyaW5nKCkudHJpbSgpO1xuICAgIGlmICghc2F2ZWQpIHJldHVybjtcbiAgICBjb25zdCBpdGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHEtaXRlbS0ke2lkeH1gKTtcbiAgICBpZiAoIWl0ZW0pIHJldHVybjtcbiAgICBpdGVtLnF1ZXJ5U2VsZWN0b3JBbGwoJy5xLWNoaXAnKS5mb3JFYWNoKGNoaXAgPT4ge1xuICAgICAgaWYgKChjaGlwLnRleHRDb250ZW50IHx8ICcnKS50cmltKCkgPT09IHNhdmVkKSBjaGlwLmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHVwZGF0ZVFQcm9ncmVzcygpO1xufVxuXG4vLyBHcm91cC1uYXZpZ2F0aW9uIHN0cmlwIChHQVAtMTYgUGFydCBEKTogbGV0cyB0aGUgdXNlciBqdW1wIGJhY2sgdG8gYW5cbi8vIGVhcmxpZXIgZ3JvdXAgdG8gcmV2aWV3L2VkaXQgaXQgd2l0aG91dCBsb3NpbmcgZm9yd2FyZCBwcm9ncmVzcy4gVGhlc2Vcbi8vIGFyZSBwbGFpbiBidXR0b25zLCBub3QgYW4gQVJJQSB0YWJsaXN0IFx1MjAxNCBubyBhcnJvdy1rZXkgcm92aW5nIGlzIGltcGxlbWVudGVkLFxuLy8gc28gYSB0YWIvdGFibGlzdCByb2xlIHdvdWxkIHNldCBhIGZhbHNlIGV4cGVjdGF0aW9uIGZvciBzY3JlZW4gcmVhZGVycy5cbmZ1bmN0aW9uIF9pc0dyb3VwRnVsbHlBbnN3ZXJlZChncm91cElkeCwgcXMsIGV4aXN0aW5nQW5zd2Vycykge1xuICBjb25zdCBncm91cFN0YXJ0ID0gZ3JvdXBJZHggKiBHUk9VUF9TSVpFO1xuICBjb25zdCBncm91cEVuZCAgICA9IE1hdGgubWluKGdyb3VwU3RhcnQgKyBHUk9VUF9TSVpFLCBxcy5sZW5ndGgpO1xuICBmb3IgKGxldCBpZHggPSBncm91cFN0YXJ0OyBpZHggPCBncm91cEVuZDsgaWR4KyspIHtcbiAgICBjb25zdCBxID0gcXNbaWR4XTtcbiAgICBpZiAoIXEpIGNvbnRpbnVlO1xuICAgIGlmICghKGV4aXN0aW5nQW5zd2Vyc1txLnR5cGVdIHx8ICcnKS50b1N0cmluZygpLnRyaW0oKSkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiByZW5kZXJRR3JvdXBOYXYobnVtR3JvdXBzLCBxcywgZXhpc3RpbmdBbnN3ZXJzKSB7XG4gIGNvbnN0IGRvdHMgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1Hcm91cHM7IGkrKykge1xuICAgIGNvbnN0IGlzQWN0aXZlID0gaSA9PT0gX2N1cnJlbnRHcm91cDtcbiAgICBjb25zdCBpc0RvbmUgICA9ICFpc0FjdGl2ZSAmJiBfaXNHcm91cEZ1bGx5QW5zd2VyZWQoaSwgcXMsIGV4aXN0aW5nQW5zd2Vycyk7XG4gICAgY29uc3QgY2xzID0gWydxLWdyb3VwLWRvdCddO1xuICAgIGlmIChpc0FjdGl2ZSkgY2xzLnB1c2goJ2FjdGl2ZScpO1xuICAgIGlmIChpc0RvbmUpIGNscy5wdXNoKCdkb25lJyk7XG4gICAgY29uc3Qgc3RhdGVMYWJlbCA9IGlzQWN0aXZlID8gJ2N1cnJlbnQnIDogaXNEb25lID8gJ2NvbXBsZXRlZCcgOiAnbm90IHlldCBhbnN3ZXJlZCc7XG4gICAgY29uc3QgYXJpYUxhYmVsID0gYFJldmlldyBhbnN3ZXJzIGZvciBHcm91cCAke2kgKyAxfSwgJHtzdGF0ZUxhYmVsfSBcdTIwMTQgbm8gcmVzdWJtaXNzaW9uYDtcbiAgICBkb3RzLnB1c2goXG4gICAgICBgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCIke2Nscy5qb2luKCcgJyl9XCIgZGF0YS1ncm91cD1cIiR7aX1cImAgK1xuICAgICAgYCR7aXNBY3RpdmUgPyAnIGFyaWEtY3VycmVudD1cInN0ZXBcIicgOiAnJ30gYXJpYS1sYWJlbD1cIiR7ZXNjYXBlSHRtbChhcmlhTGFiZWwpfVwiYCArXG4gICAgICBgIG9uY2xpY2s9XCJqdW1wVG9RR3JvdXAoJHtpfSlcIj4ke2lzRG9uZSA/ICdcdTI3MTMnIDogaSArIDF9PC9idXR0b24+YFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGA8ZGl2IGNsYXNzPVwicS1ncm91cC1uYXZcIiBhcmlhLWxhYmVsPVwiUXVlc3Rpb24gZ3JvdXBzXCI+JHtkb3RzLmpvaW4oJycpfTwvZGl2PmA7XG59XG5cbi8vIEZsdXNoIHRoZSBjdXJyZW50IGdyb3VwJ3MgdGV4dGFyZWEgdmFsdWVzIGludG8gd2luZG93LnF1ZXN0aW9uQW5zd2Vycy5cbi8vIFNoYXJlZCBieSBhZHZhbmNlUUdyb3VwKCkgKGZvcndhcmQgcHJvZ3Jlc3Npb24pIGFuZCBqdW1wVG9RR3JvdXAoKVxuLy8gKGJhY2t3YXJkIG5hdmlnYXRpb24pIHNvIGJvdGggcGVyc2lzdCBpbi1wcm9ncmVzcyBlZGl0cyB0aGUgc2FtZSB3YXkuXG5mdW5jdGlvbiBfZmx1c2hDdXJyZW50R3JvdXBBbnN3ZXJzKCkge1xuICBjb25zdCBxcyA9IHdpbmRvdy5wb3N0QW5hbHlzaXNRdWVzdGlvbnMgfHwgW107XG4gIGNvbnN0IGdyb3VwU3RhcnQgPSBfY3VycmVudEdyb3VwICogR1JPVVBfU0laRTtcbiAgY29uc3QgZ3JvdXBFbmQgICA9IE1hdGgubWluKGdyb3VwU3RhcnQgKyBHUk9VUF9TSVpFLCBxcy5sZW5ndGgpO1xuICBmb3IgKGxldCBpZHggPSBncm91cFN0YXJ0OyBpZHggPCBncm91cEVuZDsgaWR4KyspIHtcbiAgICBjb25zdCBxICA9IHFzW2lkeF07XG4gICAgY29uc3QgdGEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcS1pbnB1dC0ke2lkeH1gKTtcbiAgICBpZiAocSAmJiB0YSAmJiB0YS52YWx1ZS50cmltKCkpIHtcbiAgICAgIGlmICghd2luZG93LnF1ZXN0aW9uQW5zd2Vycykgd2luZG93LnF1ZXN0aW9uQW5zd2VycyA9IHt9O1xuICAgICAgd2luZG93LnF1ZXN0aW9uQW5zd2Vyc1txLnR5cGVdID0gdGEudmFsdWUudHJpbSgpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhZHZhbmNlUUdyb3VwKCkge1xuICBfZmx1c2hDdXJyZW50R3JvdXBBbnN3ZXJzKCk7XG4gIHBlcnNpc3RQb3N0QW5hbHlzaXNTdGF0ZSgpO1xuICBfY3VycmVudEdyb3VwKys7XG4gIHJlbmRlclF1ZXN0aW9uc1BhbmVsKCk7XG59XG5cbi8vIEp1bXAgYmFjayAob3IgZm9yd2FyZCkgdG8gYSBzcGVjaWZpYyBncm91cCB3aXRob3V0IHJlcXVpcmluZyB0aGUgY3VycmVudFxuLy8gZ3JvdXAgdG8gYmUgY29tcGxldGUuIEZsdXNoZXMgaW4tcHJvZ3Jlc3MgYW5zd2VycyBmaXJzdCBzbyBub3RoaW5nIHR5cGVkXG4vLyBzbyBmYXIgaXMgbG9zdCwgYnV0IFx1MjAxNCB1bmxpa2UgYWR2YW5jZVFHcm91cCgpIFx1MjAxNCBkb2VzIG5vdCBnYXRlIG9uIGNvbXBsZXRlbmVzc1xuLy8gYW5kIGRvZXMgbm90IHJlc3VibWl0IGFueXRoaW5nLlxuZnVuY3Rpb24ganVtcFRvUUdyb3VwKHRhcmdldEdyb3VwKSB7XG4gIF9mbHVzaEN1cnJlbnRHcm91cEFuc3dlcnMoKTtcbiAgcGVyc2lzdFBvc3RBbmFseXNpc1N0YXRlKCk7XG4gIF9jdXJyZW50R3JvdXAgPSB0YXJnZXRHcm91cDtcbiAgcmVuZGVyUXVlc3Rpb25zUGFuZWwoKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBJbnRlcmFjdGlvbiBoYW5kbGVyc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmFzeW5jIGZ1bmN0aW9uIGRyYWZ0UXVlc3Rpb25SZXNwb25zZShpZHgpIHtcbiAgY29uc3QgcXMgPSB3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zIHx8IFtdO1xuICBjb25zdCBxICA9IHFzW2lkeF07XG4gIGlmICghcSkgcmV0dXJuO1xuXG4gIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBxLWRyYWZ0LWJ0bi0ke2lkeH1gKTtcbiAgY29uc3QgdGEgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHEtaW5wdXQtJHtpZHh9YCk7XG4gIGlmICghYnRuIHx8ICF0YSkgcmV0dXJuO1xuXG4gIGJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gIGJ0bi5pbm5lckhUTUwgPSAnPHNwYW4gY2xhc3M9XCJzcGlubmVyXCIgc3R5bGU9XCJkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDoxMXB4O2hlaWdodDoxMXB4O2JvcmRlcjoycHggc29saWQgY3VycmVudENvbG9yO2JvcmRlci10b3AtY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyLXJhZGl1czo1MCU7YW5pbWF0aW9uOnNwaW4gMC43cyBsaW5lYXIgaW5maW5pdGU7dmVydGljYWwtYWxpZ246bWlkZGxlO1wiPjwvc3Bhbj4nO1xuXG4gIHRyeSB7XG4gICAgbGV0IGFuYWx5c2lzUGF5bG9hZCA9IG51bGw7XG4gICAgY29uc3QgYW5hbHlzaXNTdGF0ZSA9IHN0YXRlTWFuYWdlci5nZXRUYWJEYXRhKCdhbmFseXNpcycpO1xuICAgIGlmIChhbmFseXNpc1N0YXRlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjbGVhbmVkID0gY2xlYW5Kc29uUmVzcG9uc2UoYW5hbHlzaXNTdGF0ZSk7XG4gICAgICAgIGFuYWx5c2lzUGF5bG9hZCA9IHR5cGVvZiBjbGVhbmVkID09PSAnc3RyaW5nJyA/IEpTT04ucGFyc2UoY2xlYW5lZCkgOiBjbGVhbmVkO1xuICAgICAgfSBjYXRjaCAoXykgeyAvKiB1c2UgbnVsbCAqLyB9XG4gICAgfVxuXG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvcG9zdC1hbmFseXNpcy1kcmFmdC1yZXNwb25zZScsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHF1ZXN0aW9uOiBxLnF1ZXN0aW9uLCBxdWVzdGlvbl90eXBlOiBxLnR5cGUsIGFuYWx5c2lzOiBhbmFseXNpc1BheWxvYWQgfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEub2sgJiYgZGF0YS50ZXh0KSB7XG4gICAgICB0YS52YWx1ZSA9IGRhdGEudGV4dDtcbiAgICAgIHVwZGF0ZVFQcm9ncmVzcygpO1xuICAgICAgY29uc3QgaXRlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBxLWl0ZW0tJHtpZHh9YCk7XG4gICAgICBpZiAoaXRlbSkgaXRlbS5xdWVyeVNlbGVjdG9yQWxsKCcucS1jaGlwJykuZm9yRWFjaChjID0+IGMuY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKSk7XG4gICAgICBzaG93RHJhZnRFcnJvcihpZHgsIG51bGwpO1xuICAgICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgYFx1MjcyOCBEcmFmdCBhbnN3ZXIgZm9yIFEke2lkeCArIDF9OlxcblxcbiR7ZGF0YS50ZXh0fVxcblxcblJldmlldyBhbmQgZWRpdCBpbiB0aGUgZmllbGQgYmVsb3cgYmVmb3JlIHN1Ym1pdHRpbmcuYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZy53YXJuKCdEcmFmdCBnZW5lcmF0aW9uIGZhaWxlZDonLCBkYXRhLmVycm9yKTtcbiAgICAgIHNob3dEcmFmdEVycm9yKGlkeCwgZGF0YS5lcnJvciB8fCAnRHJhZnQgZmFpbGVkIFx1MjAxNCBwbGVhc2UgdHJ5IGFnYWluLicpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLmVycm9yKCdEcmFmdCBmZXRjaCBlcnJvcjonLCBlcnIpO1xuICAgIHNob3dEcmFmdEVycm9yKGlkeCwgJ05ldHdvcmsgZXJyb3IgXHUyMDE0IHBsZWFzZSB0cnkgYWdhaW4uJyk7XG4gIH0gZmluYWxseSB7XG4gICAgYnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgYnRuLmlubmVySFRNTCA9ICdcdTI3MjggRHJhZnQnO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNlbGVjdFFDaGlwKGJ0biwgcUlkeCkge1xuICBjb25zdCBwYW5lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBxLWl0ZW0tJHtxSWR4fWApO1xuICBpZiAocGFuZWwpIHtcbiAgICBwYW5lbC5xdWVyeVNlbGVjdG9yQWxsKCcucS1jaGlwJykuZm9yRWFjaChjID0+IGMuY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKSk7XG4gIH1cbiAgYnRuLmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7XG4gIGNvbnN0IHRleHRhcmVhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHEtaW5wdXQtJHtxSWR4fWApO1xuICBpZiAodGV4dGFyZWEpIHtcbiAgICB0ZXh0YXJlYS52YWx1ZSA9IGJ0bi50ZXh0Q29udGVudDtcbiAgICB1cGRhdGVRUHJvZ3Jlc3MoKTtcbiAgfVxuICAvLyBQZXJzaXN0IHRoZSBjaGlwIGFuc3dlciBpbW1lZGlhdGVseSBzbyBpdCBzdXJ2aXZlcyB0YWIgbmF2aWdhdGlvbi5cbiAgY29uc3QgcSA9ICh3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zIHx8IFtdKVtxSWR4XTtcbiAgaWYgKHEpIHtcbiAgICBpZiAoIXdpbmRvdy5xdWVzdGlvbkFuc3dlcnMgfHwgdHlwZW9mIHdpbmRvdy5xdWVzdGlvbkFuc3dlcnMgIT09ICdvYmplY3QnKSB7XG4gICAgICB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzID0ge307XG4gICAgfVxuICAgIHdpbmRvdy5xdWVzdGlvbkFuc3dlcnNbcS50eXBlXSA9IGJ0bi50ZXh0Q29udGVudDtcbiAgICBwZXJzaXN0UG9zdEFuYWx5c2lzU3RhdGUoKTtcbiAgfVxufVxuXG4vLyBDdXJyZW50IHF1ZXN0aW9uLWdyb3VwIGluZGV4IChcdTIyNjQzLXBlci1ncm91cCBmbG93LCBHQVAtMjAxKS5cbmxldCBfY3VycmVudEdyb3VwID0gMDtcbmNvbnN0IEdST1VQX1NJWkUgPSAzO1xuXG4vLyBEZWJvdW5jZSB0aW1lciBmb3IgcGVyc2lzdGluZyBhbnN3ZXJzIHdoaWxlIHRoZSB1c2VyIHR5cGVzLlxubGV0IF9wZXJzaXN0RGVib3VuY2VUaW1lciA9IG51bGw7XG5cbmZ1bmN0aW9uIG9uUUlucHV0Q2hhbmdlKGlkeCkge1xuICB1cGRhdGVRUHJvZ3Jlc3MoKTtcbiAgY29uc3QgcSA9ICh3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zIHx8IFtdKVtpZHhdO1xuICBpZiAoIXEpIHJldHVybjtcbiAgY29uc3QgdGEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcS1pbnB1dC0ke2lkeH1gKTtcbiAgaWYgKCF0YSkgcmV0dXJuO1xuICBpZiAoIXdpbmRvdy5xdWVzdGlvbkFuc3dlcnMgfHwgdHlwZW9mIHdpbmRvdy5xdWVzdGlvbkFuc3dlcnMgIT09ICdvYmplY3QnKSB7XG4gICAgd2luZG93LnF1ZXN0aW9uQW5zd2VycyA9IHt9O1xuICB9XG4gIHdpbmRvdy5xdWVzdGlvbkFuc3dlcnNbcS50eXBlXSA9IHRhLnZhbHVlO1xuXG4gIC8vIERlYm91bmNlLXBlcnNpc3Qgc28gYW5zd2VycyBzdXJ2aXZlIHRhYiBuYXZpZ2F0aW9uIGFuZCBzdGF0dXMgcG9sbGluZy5cbiAgY2xlYXJUaW1lb3V0KF9wZXJzaXN0RGVib3VuY2VUaW1lcik7XG4gIF9wZXJzaXN0RGVib3VuY2VUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gcGVyc2lzdFBvc3RBbmFseXNpc1N0YXRlKCksIDUwMCk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVFQcm9ncmVzcygpIHtcbiAgY29uc3QgcXMgPSB3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zIHx8IFtdO1xuICBjb25zdCBzdG9yZWRBbnN3ZXJzID0gd2luZG93LnF1ZXN0aW9uQW5zd2VycyB8fCB7fTtcbiAgY29uc3QgZ3JvdXBTdGFydCA9IF9jdXJyZW50R3JvdXAgKiBHUk9VUF9TSVpFO1xuICBjb25zdCBncm91cEVuZCAgID0gTWF0aC5taW4oZ3JvdXBTdGFydCArIEdST1VQX1NJWkUsIHFzLmxlbmd0aCk7XG5cbiAgLy8gQ291bnQgYW5zd2VyczogdXNlIERPTSB2YWx1ZXMgZm9yIHRoZSBjdXJyZW50IGdyb3VwIChsaXZlKSwgc3RvcmVkIGZvciBvdGhlcnMuXG4gIGNvbnN0IGFuc3dlcmVkID0gcXMuZmlsdGVyKChxLCBpZHgpID0+IHtcbiAgICBpZiAoaWR4ID49IGdyb3VwU3RhcnQgJiYgaWR4IDwgZ3JvdXBFbmQpIHtcbiAgICAgIGNvbnN0IHRhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHEtaW5wdXQtJHtpZHh9YCk7XG4gICAgICByZXR1cm4gdGEgPyB0YS52YWx1ZS50cmltKCkubGVuZ3RoID4gMCA6ICEhKHN0b3JlZEFuc3dlcnNbcS50eXBlXSB8fCAnJykudHJpbSgpO1xuICAgIH1cbiAgICByZXR1cm4gISEoc3RvcmVkQW5zd2Vyc1txLnR5cGVdIHx8ICcnKS50cmltKCk7XG4gIH0pLmxlbmd0aDtcblxuICBjb25zdCBncm91cEFuc3dlcmVkID0gcXMuc2xpY2UoZ3JvdXBTdGFydCwgZ3JvdXBFbmQpLmZpbHRlcigocSwgbGkpID0+IHtcbiAgICBjb25zdCB0YSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBxLWlucHV0LSR7Z3JvdXBTdGFydCArIGxpfWApO1xuICAgIHJldHVybiB0YSA/IHRhLnZhbHVlLnRyaW0oKS5sZW5ndGggPiAwIDogISEoc3RvcmVkQW5zd2Vyc1txLnR5cGVdIHx8ICcnKS50cmltKCk7XG4gIH0pLmxlbmd0aDtcblxuICBjb25zdCBudW1Hcm91cHMgID0gTWF0aC5jZWlsKHFzLmxlbmd0aCAvIEdST1VQX1NJWkUpO1xuICBjb25zdCBncm91cExhYmVsID0gbnVtR3JvdXBzID4gMVxuICAgID8gYEdyb3VwICR7X2N1cnJlbnRHcm91cCArIDF9IG9mICR7bnVtR3JvdXBzfWBcbiAgICA6IGAke3FzLmxlbmd0aH0gcXVlc3Rpb24ke3FzLmxlbmd0aCA+IDEgPyAncycgOiAnJ31gO1xuXG4gIGNvbnN0IHByb2dyZXNzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncS1wcm9ncmVzcycpO1xuICBpZiAocHJvZ3Jlc3NFbCkge1xuICAgIHByb2dyZXNzRWwudGV4dENvbnRlbnQgPSBgJHtncm91cExhYmVsfSBcdTIwMTQgJHthbnN3ZXJlZH0gb2YgJHtxcy5sZW5ndGh9IGFuc3dlcmVkYDtcbiAgfVxuICBjb25zdCBzdWJtaXRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncS1zdWJtaXQtYnRuJyk7XG4gIGlmIChzdWJtaXRCdG4pIHtcbiAgICBjb25zdCBjdXJyZW50R3JvdXBTaXplID0gZ3JvdXBFbmQgLSBncm91cFN0YXJ0O1xuICAgIHN1Ym1pdEJ0bi5kaXNhYmxlZCA9IGdyb3VwQW5zd2VyZWQgPCBjdXJyZW50R3JvdXBTaXplO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN1Ym1pdEFsbEFuc3dlcnMoKSB7XG4gIC8qIGR1Y2tmbG93OlxuICAgKiAgIGlkOiBxdWVzdGlvbnNfdWlfc3VibWl0X2xpdmVcbiAgICogICBraW5kOiB1aVxuICAgKiAgIHRpbWVzdGFtcDogJzIwMjYtMDMtMjVUMjE6Mzk6NDhaJ1xuICAgKiAgIHN0YXR1czogbGl2ZVxuICAgKiAgIGhhbmRsZXM6XG4gICAqICAgLSB1aTpxdWVzdGlvbnMuc3VibWl0LWFsbFxuICAgKiAgIGNhbGxzOlxuICAgKiAgIC0gUE9TVCAvYXBpL3Bvc3QtYW5hbHlzaXMtcmVzcG9uc2VzXG4gICAqICAgLSBQT1NUIC9hcGkvYWN0aW9uXG4gICAqICAgcmVhZHM6XG4gICAqICAgLSB3aW5kb3c6cG9zdEFuYWx5c2lzUXVlc3Rpb25zXG4gICAqICAgLSBkb206cS1pbnB1dC0qLnZhbHVlXG4gICAqICAgd3JpdGVzOlxuICAgKiAgIC0gd2luZG93OnF1ZXN0aW9uQW5zd2Vyc1xuICAgKiAgIC0gcmVxdWVzdDpQT1NUIC9hcGkvcG9zdC1hbmFseXNpcy1yZXNwb25zZXMuYW5zd2Vyc1xuICAgKiAgIG5vdGVzOiBDb2xsZWN0cyB0aGUgY2xhcmlmeWluZy1xdWVzdGlvbiBhbnN3ZXJzIGZyb20gdGhlIFVJLCBwZXJzaXN0cyB0aGVtIHRvIHNlc3Npb24gc3RhdGUsIGFuZCB0aGVuIGFkdmFuY2VzIGludG8gY3VzdG9taXphdGlvbiByZWNvbW1lbmRhdGlvbiBnZW5lcmF0aW9uLlxuICAgKi9cbiAgY29uc3QgcXMgPSB3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zIHx8IFtdO1xuICBxcy5mb3JFYWNoKChxLCBpZHgpID0+IHtcbiAgICBjb25zdCB0YSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBxLWlucHV0LSR7aWR4fWApO1xuICAgIGlmICh0YSAmJiB0YS52YWx1ZS50cmltKCkpIHtcbiAgICAgIHdpbmRvdy5xdWVzdGlvbkFuc3dlcnNbcS50eXBlXSA9IHRhLnZhbHVlLnRyaW0oKTtcbiAgICB9XG4gIH0pO1xuICBhd2FpdCBwZXJzaXN0UG9zdEFuYWx5c2lzU3RhdGUoKTtcblxuICBjb25zdCBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncS1zdWJtaXQtYnRuJyk7XG4gIGlmIChidG4pIHtcbiAgICBidG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgIGJ0bi5pbm5lckhUTUwgPSAnPHNwYW4gY2xhc3M9XCJzcGlubmVyXCIgc3R5bGU9XCJkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDoxNHB4O2hlaWdodDoxNHB4O2JvcmRlcjoycHggc29saWQgI2ZmZjtib3JkZXItdG9wLWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlci1yYWRpdXM6NTAlO2FuaW1hdGlvbjpzcGluIDAuN3MgbGluZWFyIGluZmluaXRlO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTttYXJnaW4tcmlnaHQ6NnB4O1wiPjwvc3Bhbj5Qcm9jZXNzaW5nXHUyMDI2JztcbiAgfVxuXG4gIHRyeSB7XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgYFx1MjcxMyBUaGFuayB5b3UhICR7cXMubGVuZ3RofSBhbnN3ZXIke3FzLmxlbmd0aCA+IDEgPyAncycgOiAnJ30gc2F2ZWQuIEdlbmVyYXRpbmcgY3VzdG9taXphdGlvbiByZWNvbW1lbmRhdGlvbnNcdTIwMjZgKTtcbiAgICBhd2FpdCBzZW5kQWN0aW9uKCdyZWNvbW1lbmRfY3VzdG9taXphdGlvbnMnKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoYnRuKSB7XG4gICAgICBidG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIGJ0bi5pbm5lckhUTUwgPSAnU3VibWl0IEFuc3dlcnMnO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzaG93RHJhZnRFcnJvcihpZHgsIG1lc3NhZ2UpIHtcbiAgY29uc3Qgcm93ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgI3EtaXRlbS0ke2lkeH0gLnEtYW5zd2VyLXJvd2ApO1xuICBpZiAoIXJvdykgcmV0dXJuO1xuICBsZXQgZXJyRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcS1kcmFmdC1lcnItJHtpZHh9YCk7XG4gIGlmICghbWVzc2FnZSkge1xuICAgIGlmIChlcnJFbCkgZXJyRWwucmVtb3ZlKCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICghZXJyRWwpIHtcbiAgICBlcnJFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGVyckVsLmlkID0gYHEtZHJhZnQtZXJyLSR7aWR4fWA7XG4gICAgZXJyRWwuY2xhc3NOYW1lID0gJ3EtZHJhZnQtZXJyb3InO1xuICAgIHJvdy5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyZW5kJywgZXJyRWwpO1xuICB9XG4gIGVyckVsLnRleHRDb250ZW50ID0gYFx1MjZBMCAke21lc3NhZ2V9YDtcbn1cblxuLy8gTGVnYWN5IGNvbXBhdGliaWxpdHkgc2hpbVxuZnVuY3Rpb24gc2hvd05leHRRdWVzdGlvbigpIHsgcmVuZGVyUXVlc3Rpb25zUGFuZWwoKTsgfVxuXG5mdW5jdGlvbiBoYW5kbGVRdWVzdGlvblJlc3BvbnNlKG1lc3NhZ2UpIHtcbiAgaWYgKCF3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zIHx8IHdpbmRvdy5wb3N0QW5hbHlzaXNRdWVzdGlvbnMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gIGlmICghd2luZG93LndhaXRpbmdGb3JRdWVzdGlvblJlc3BvbnNlKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGlkeCA9IHdpbmRvdy5jdXJyZW50UXVlc3Rpb25JbmRleCB8fCAwO1xuICBjb25zdCBxID0gd2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9uc1tpZHhdO1xuICBpZiAoIXEpIHJldHVybiBmYWxzZTtcbiAgd2luZG93LnF1ZXN0aW9uQW5zd2Vyc1txLnR5cGVdID0gbWVzc2FnZTtcbiAgd2luZG93LndhaXRpbmdGb3JRdWVzdGlvblJlc3BvbnNlID0gZmFsc2U7XG4gIHdpbmRvdy5jdXJyZW50UXVlc3Rpb25JbmRleCA9IGlkeCArIDE7XG4gIHBlcnNpc3RQb3N0QW5hbHlzaXNTdGF0ZSgpO1xuICByZW5kZXJRdWVzdGlvbnNQYW5lbCgpO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gZmluaXNoUG9zdEFuYWx5c2lzUXVlc3Rpb25zKCkge1xuICB3aW5kb3cud2FpdGluZ0ZvclF1ZXN0aW9uUmVzcG9uc2UgPSBmYWxzZTtcbiAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ1RoYW5rIHlvdSBmb3IgdGhvc2UgaW5zaWdodHMhIENsaWNrIFwiUmVjb21tZW5kIEN1c3RvbWl6YXRpb25zXCIgd2hlbiB5b3VcXCdyZSByZWFkeS4nKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEVTIG1vZHVsZSBleHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuZXhwb3J0IHtcbiAgcGVyc2lzdFBvc3RBbmFseXNpc1N0YXRlLFxuICByZW5kZXJRdWVzdGlvbk1hcmtkb3duLFxuICBmZXRjaFBvc3RBbmFseXNpc1F1ZXN0aW9uc0Zyb21BcGksXG4gIGFza1Bvc3RBbmFseXNpc1F1ZXN0aW9ucyxcbiAgcG9wdWxhdGVRdWVzdGlvbnNUYWIsXG4gIHJlbmRlclF1ZXN0aW9uc1BhbmVsLFxuICBkcmFmdFF1ZXN0aW9uUmVzcG9uc2UsXG4gIHNlbGVjdFFDaGlwLFxuICBvblFJbnB1dENoYW5nZSxcbiAgdXBkYXRlUVByb2dyZXNzLFxuICBzdWJtaXRBbGxBbnN3ZXJzLFxuICBzaG93RHJhZnRFcnJvcixcbiAgc2hvd05leHRRdWVzdGlvbixcbiAgaGFuZGxlUXVlc3Rpb25SZXNwb25zZSxcbiAgZmluaXNoUG9zdEFuYWx5c2lzUXVlc3Rpb25zLFxuICBhZHZhbmNlUUdyb3VwLFxuICBqdW1wVG9RR3JvdXAsXG59O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuZnVuY3Rpb24gZXllU2xhc2hJY29uKCkge1xuICByZXR1cm4gYFxuICAgIDxzdmcgY2xhc3M9XCJpY29uLWdseXBoXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIGZvY3VzYWJsZT1cImZhbHNlXCI+XG4gICAgICA8cGF0aCBkPVwiTTMgM2wxOCAxOFwiPjwvcGF0aD5cbiAgICAgIDxwYXRoIGQ9XCJNMTAuNTggMTAuNThhMiAyIDAgMCAwIDIuODMgMi44M1wiPjwvcGF0aD5cbiAgICAgIDxwYXRoIGQ9XCJNOS44OCA1LjA5QTEwLjk0IDEwLjk0IDAgMCAxIDEyIDVjNSAwIDkuMjcgMy4xMSAxMSA3LTEuMDQgMi4zNS0yLjc4IDQuMzItNC45NiA1LjQ1XCI+PC9wYXRoPlxuICAgICAgPHBhdGggZD1cIk02LjYxIDYuNjFDNC42MiA3LjkgMy4wMyA5Ljc5IDIgMTJjMS43MyAzLjg5IDYgNyAxMCA3IDEuNTIgMCAyLjk4LS4zNiA0LjI5LTFcIj48L3BhdGg+XG4gICAgPC9zdmc+XG4gIGA7XG59XG5cbmV4cG9ydCB7IGV5ZVNsYXNoSWNvbiB9O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvZXhwZXJpZW5jZS1yZXZpZXcuanNcbiAqIEV4cGVyaWVuY2UtcmV2aWV3IHRhYmxlOiBmZXRjaCwgcmVuZGVyLCByb3ctcmVvcmRlciwgYW5kIHN1Ym1pdCBkZWNpc2lvbnMuXG4gKlxuICogRGVwZW5kZW5jaWVzIChyZXNvbHZlZCB0aHJvdWdoIGdsb2JhbFRoaXMgYXQgcnVudGltZSk6XG4gKiAgIHVzZXJTZWxlY3Rpb25zLCBwZW5kaW5nUmVjb21tZW5kYXRpb25zLCBfc2F2ZWREZWNpc2lvbnMsIF9leHBlcmllbmNlc09yZGVyZWQsXG4gKiAgIHBhcnNlU3RhdHVzUmVzcG9uc2UsIGdldEV4cGVyaWVuY2VSZWNvbW1lbmRhdGlvbiwgZ2V0Q29uZmlkZW5jZUxldmVsLFxuICogICBnZXRFeHBlcmllbmNlUmVhc29uaW5nLCBlc2NhcGVIdG1sLCBzaG93QnVsbGV0UmVvcmRlcixcbiAqICAgaGFuZGxlQWN0aW9uQ2xpY2ssIGJ1bGtBY3Rpb24sIF91cGRhdGVQYWdlRXN0aW1hdGUsXG4gKiAgIHVwZGF0ZUluY2x1c2lvbkNvdW50cywgc3dpdGNoVGFiLFxuICogICBzaG93QWxlcnRNb2RhbCwgc2hvd1RvYXN0LCBzY2hlZHVsZUF0c1JlZnJlc2gsXG4gKiAgICQsICQuZm4uRGF0YVRhYmxlIChqUXVlcnkgKyBEYXRhVGFibGVzKVxuICovXG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmNvbnN0IGxvZyA9IGdldExvZ2dlcignZXhwZXJpZW5jZS1yZXZpZXcnKTtcblxuaW1wb3J0IHsgc3RhdGVNYW5hZ2VyIH0gZnJvbSAnLi9zdGF0ZS1tYW5hZ2VyLmpzJztcbmltcG9ydCB7IGV5ZVNsYXNoSWNvbiB9IGZyb20gJy4vcmV2aWV3LWljb25zLmpzJztcblxuZnVuY3Rpb24gX2ZpbmRFeHBlcmllbmNlUmVjb21tZW5kYXRpb25SZWNvcmQoZXhwSWQsIGRhdGEpIHtcbiAgaWYgKCFkYXRhIHx8ICFBcnJheS5pc0FycmF5KGRhdGEuZXhwZXJpZW5jZV9yZWNvbW1lbmRhdGlvbnMpKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIGRhdGEuZXhwZXJpZW5jZV9yZWNvbW1lbmRhdGlvbnMuZmluZCgocmVjKSA9PiBTdHJpbmcocmVjPy5pZCB8fCByZWM/LmV4cGVyaWVuY2VfaWQgfHwgJycpID09PSBTdHJpbmcoZXhwSWQpKSB8fCBudWxsO1xufVxuXG5mdW5jdGlvbiBfZm9ybWF0U3VnZ2VzdGVkT3JkZXJTdW1tYXJ5KG9yZGVyKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShvcmRlcikgfHwgb3JkZXIubGVuZ3RoIDwgMikgcmV0dXJuICcnO1xuICByZXR1cm4gb3JkZXIubWFwKChpZHgpID0+IFN0cmluZyhOdW1iZXIoaWR4KSArIDEpKS5qb2luKCcgLT4gJyk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFeHBlcmllbmNlIGRldGFpbHMgZmV0Y2ggXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIGdldEV4cGVyaWVuY2VEZXRhaWxzKGV4cElkKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvZXhwZXJpZW5jZS1kZXRhaWxzJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgZXhwZXJpZW5jZV9pZDogZXhwSWQgfSlcbiAgICB9KTtcblxuICAgIGlmIChyZXMub2spIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgcmV0dXJuIGRhdGEuZXhwZXJpZW5jZSB8fCBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2cud2FybignQ291bGQgbm90IGZldGNoIGV4cGVyaWVuY2UgZGV0YWlscyBmb3InLCBleHBJZCk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nLndhcm4oJ0Vycm9yIGZldGNoaW5nIGV4cGVyaWVuY2UgZGV0YWlsczonLCBlcnJvcik7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIFJlcnVuIHNuYXBzaG90IChjaGFuZ2UgYmFkZ2UgZm9yIGV4cGVyaWVuY2VzKSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmZ1bmN0aW9uIF9leHBTbmFwc2hvdEtleSgpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzaWQgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpLmdldCgnc2Vzc2lvbicpO1xuICAgIHJldHVybiBzaWQgPyBgZXhwX3NuYXBfJHtzaWR9YCA6IG51bGw7XG4gIH0gY2F0Y2ggKF8pIHsgcmV0dXJuIG51bGw7IH1cbn1cbmZ1bmN0aW9uIF9zYXZlRXhwU25hcHNob3QocmVjb21tZW5kZWRJZHMpIHtcbiAgY29uc3Qga2V5ID0gX2V4cFNuYXBzaG90S2V5KCk7XG4gIGlmICgha2V5KSByZXR1cm47XG4gIHRyeSB7IGxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgSlNPTi5zdHJpbmdpZnkoWy4uLnJlY29tbWVuZGVkSWRzXSkpOyB9IGNhdGNoIChfKSB7fVxufVxuZnVuY3Rpb24gX2dldEV4cFNuYXBzaG90KCkge1xuICBjb25zdCBrZXkgPSBfZXhwU25hcHNob3RLZXkoKTtcbiAgaWYgKCFrZXkpIHJldHVybiBudWxsO1xuICB0cnkge1xuICAgIGNvbnN0IHJhdyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7XG4gICAgcmV0dXJuIHJhdyA/IG5ldyBTZXQoSlNPTi5wYXJzZShyYXcpKSA6IG51bGw7XG4gIH0gY2F0Y2ggKF8pIHsgcmV0dXJuIG51bGw7IH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIEJ1aWxkIHJldmlldyB0YWJsZSAoZmV0Y2ggKyBpbml0aWFsaXNlKSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gYnVpbGRFeHBlcmllbmNlUmV2aWV3VGFibGUoKSB7XG4gIGNvbnN0IGRhdGEgPSB3aW5kb3cucGVuZGluZ1JlY29tbWVuZGF0aW9ucztcbiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cGVyaWVuY2UtdGFibGUtY29udGFpbmVyJyk7XG4gIGlmICghY29udGFpbmVyKSByZXR1cm47XG5cbiAgY29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwiZW1wdHktc3RhdGVcIj48ZGl2IGNsYXNzPVwibG9hZGluZy1zcGlubmVyXCI+PC9kaXY+PHAgc3R5bGU9XCJtYXJnaW4tdG9wOjEycHg7Y29sb3I6IzY0NzQ4YjtcIj5Mb2FkaW5nIGV4cGVyaWVuY2UgcmVjb21tZW5kYXRpb25zXHUyMDI2PC9wPjwvZGl2Pic7XG5cbiAgbGV0IGFsbEV4cGVyaWVuY2VJZHMgPSBbXTtcbiAgbGV0IHNhdmVkUm93T3JkZXIgPSBbXTtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0dXNSZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9zdGF0dXMnKTtcbiAgICBjb25zdCBzdGF0dXNEYXRhID0gcGFyc2VTdGF0dXNSZXNwb25zZShhd2FpdCBzdGF0dXNSZXMuanNvbigpKTtcbiAgICBhbGxFeHBlcmllbmNlSWRzID0gc3RhdHVzRGF0YS5hbGxfZXhwZXJpZW5jZV9pZHMgfHwgZGF0YS5yZWNvbW1lbmRlZF9leHBlcmllbmNlcyB8fCBbXTtcbiAgICBzYXZlZFJvd09yZGVyICAgID0gQXJyYXkuaXNBcnJheShzdGF0dXNEYXRhLmV4cGVyaWVuY2Vfcm93X29yZGVyKSA/IHN0YXR1c0RhdGEuZXhwZXJpZW5jZV9yb3dfb3JkZXIgOiBbXTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBhbGxFeHBlcmllbmNlSWRzID0gZGF0YS5yZWNvbW1lbmRlZF9leHBlcmllbmNlcyB8fCBbXTtcbiAgfVxuXG4gIGNvbnN0IHJlY29tbWVuZGVkU2V0ID0gbmV3IFNldChkYXRhLnJlY29tbWVuZGVkX2V4cGVyaWVuY2VzIHx8IFtdKTtcblxuICAvLyBGZXRjaCBhbGwgZXhwZXJpZW5jZSBkZXRhaWxzXG4gIGNvbnN0IGV4cGVyaWVuY2VzV2l0aERldGFpbHMgPSBbXTtcbiAgZm9yIChjb25zdCBleHBJZCBvZiBhbGxFeHBlcmllbmNlSWRzKSB7XG4gICAgY29uc3QgZGV0YWlscyA9IGF3YWl0IGdldEV4cGVyaWVuY2VEZXRhaWxzKGV4cElkKTtcbiAgICBleHBlcmllbmNlc1dpdGhEZXRhaWxzLnB1c2goeyBpZDogZXhwSWQsIGRldGFpbHMgfSk7XG4gIH1cblxuICAvLyBPbiBmaXJzdCBsb2FkOiByZXN0b3JlIHVzZXIncyBzYXZlZCBvcmRlciBpZiBwcmVzZW50OyBvdGhlcndpc2UgZGVmYXVsdC1zb3J0XG4gIC8vIHdpdGggcHJlc2VudC9jdXJyZW50IHBvc2l0aW9ucyBmaXJzdCwgdGhlbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgYnkgZW5kIGRhdGUuXG4gIC8vIE9uIHJlLXJlbmRlciwgcHJlc2VydmUgdGhlIGluLW1lbW9yeSB1c2VyIG9yZGVyLlxuICBpZiAoIXdpbmRvdy5fZXhwZXJpZW5jZXNPcmRlcmVkKSB7XG4gICAgaWYgKHNhdmVkUm93T3JkZXIubGVuZ3RoID4gMCkge1xuICAgICAgLy8gUmVzdG9yZSB1c2VyJ3MgZXhwbGljaXRseSBzYXZlZCBvcmRlcmluZyBmcm9tIHRoZSBzZXNzaW9uXG4gICAgICBjb25zdCBvcmRlck1hcCA9IE9iamVjdC5mcm9tRW50cmllcyhzYXZlZFJvd09yZGVyLm1hcCgoaWQsIGkpID0+IFtpZCwgaV0pKTtcbiAgICAgIGV4cGVyaWVuY2VzV2l0aERldGFpbHMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICBjb25zdCBhaSA9IG9yZGVyTWFwW2EuaWRdID8/IHNhdmVkUm93T3JkZXIubGVuZ3RoO1xuICAgICAgICBjb25zdCBiaSA9IG9yZGVyTWFwW2IuaWRdID8/IHNhdmVkUm93T3JkZXIubGVuZ3RoO1xuICAgICAgICByZXR1cm4gYWkgLSBiaTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEZWZhdWx0OiBzb3J0IGJ5IExMTSByZWNvbW1lbmRhdGlvbiBzdHJlbmd0aCBmaXJzdCwgdGhlbiByZXZlcnNlLWNocm9ub2xvZ2ljYWxcbiAgICAgIGNvbnN0IF9BQ1RJT05fUkFOSyA9IHsgZW1waGFzaXplOiAwLCBpbmNsdWRlOiAxLCAnZGUtZW1waGFzaXplJzogMiwgZXhjbHVkZTogMyB9O1xuICAgICAgY29uc3QgX3BhcnNlRW5kS2V5ID0gKGV4cCkgPT4ge1xuICAgICAgICBjb25zdCByYXcgPSAoZXhwLmRldGFpbHM/LmVuZF9kYXRlIHx8IGV4cC5kZXRhaWxzPy5lbmQgfHwgJycpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoIXJhdyB8fCBbJ3ByZXNlbnQnLCAnY3VycmVudCcsICdub3cnLCAnb25nb2luZyddLmluY2x1ZGVzKHJhdykpIHJldHVybiAnOTk5OS0xMic7XG4gICAgICAgIGlmICgvXlxcZHs0fSQvLnRlc3QocmF3KSkgcmV0dXJuIHJhdyArICctMTInO1xuICAgICAgICByZXR1cm4gcmF3O1xuICAgICAgfTtcbiAgICAgIGNvbnN0IF9nZXRBY3Rpb25SYW5rID0gKGV4cCkgPT4ge1xuICAgICAgICBjb25zdCByZWMgPSBnZXRFeHBlcmllbmNlUmVjb21tZW5kYXRpb24oZXhwLmlkLCBkYXRhKTtcbiAgICAgICAgaWYgKCFyZWMpIHJldHVybiAxOyAvLyBkZWZhdWx0IHRvICdpbmNsdWRlJyByYW5rIHdoZW4gbm8gcmVjb21tZW5kYXRpb25cbiAgICAgICAgaWYgKHJlYyA9PT0gJ0VtcGhhc2l6ZScpICAgIHJldHVybiAwO1xuICAgICAgICBpZiAocmVjID09PSAnSW5jbHVkZScpICAgICAgcmV0dXJuIDE7XG4gICAgICAgIGlmIChyZWMgPT09ICdEZS1lbXBoYXNpemUnKSByZXR1cm4gMjtcbiAgICAgICAgaWYgKHJlYyA9PT0gJ09taXQnKSAgICAgICAgIHJldHVybiAzO1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH07XG4gICAgICBleHBlcmllbmNlc1dpdGhEZXRhaWxzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgY29uc3QgcmFua0RpZmYgPSBfZ2V0QWN0aW9uUmFuayhhKSAtIF9nZXRBY3Rpb25SYW5rKGIpO1xuICAgICAgICBpZiAocmFua0RpZmYgIT09IDApIHJldHVybiByYW5rRGlmZjtcbiAgICAgICAgcmV0dXJuIF9wYXJzZUVuZEtleShiKS5sb2NhbGVDb21wYXJlKF9wYXJzZUVuZEtleShhKSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgd2luZG93Ll9leHBlcmllbmNlc09yZGVyZWQgPSBleHBlcmllbmNlc1dpdGhEZXRhaWxzO1xuICB9IGVsc2Uge1xuICAgIC8vIE1lcmdlIGFueSBuZXdseSBkaXNjb3ZlcmVkIGV4cGVyaWVuY2VzIGludG8gdGhlIGNhY2hlZCBvcmRlclxuICAgIGNvbnN0IGtub3duSWRzID0gbmV3IFNldCh3aW5kb3cuX2V4cGVyaWVuY2VzT3JkZXJlZC5tYXAoZSA9PiBlLmlkKSk7XG4gICAgZm9yIChjb25zdCBleHAgb2YgZXhwZXJpZW5jZXNXaXRoRGV0YWlscykge1xuICAgICAgaWYgKCFrbm93bklkcy5oYXMoZXhwLmlkKSkgd2luZG93Ll9leHBlcmllbmNlc09yZGVyZWQucHVzaChleHApO1xuICAgIH1cbiAgfVxuXG4gIC8vIENvbXB1dGUgd2hpY2ggcmVjb21tZW5kYXRpb25zIGFyZSBuZXcgc2luY2UgbGFzdCByZW5kZXIgKHJlcnVuIGNoYW5nZSBiYWRnZXMpXG4gIGNvbnN0IHByZXZFeHBTbmFwID0gX2dldEV4cFNuYXBzaG90KCk7XG4gIGNvbnN0IG5ld1JlY29tbWVuZGVkRXhwcyA9IHByZXZFeHBTbmFwXG4gICAgPyBuZXcgU2V0KFsuLi5yZWNvbW1lbmRlZFNldF0uZmlsdGVyKGlkID0+ICFwcmV2RXhwU25hcC5oYXMoaWQpKSlcbiAgICA6IG5ldyBTZXQoKTtcbiAgX3NhdmVFeHBTbmFwc2hvdChyZWNvbW1lbmRlZFNldCk7XG5cbiAgLy8gSW5pdGlhbGlzZSBzYXZlZCBkZWNpc2lvbnNcbiAgY29uc3Qgc2F2ZWRFeHBEZWNzID0gd2luZG93Ll9zYXZlZERlY2lzaW9ucz8uZXhwZXJpZW5jZV9kZWNpc2lvbnMgfHwge307XG4gIGZvciAoY29uc3QgeyBpZDogZXhwSWQgfSBvZiB3aW5kb3cuX2V4cGVyaWVuY2VzT3JkZXJlZCkge1xuICAgIGNvbnN0IHJlY29tbWVuZGF0aW9uID0gZ2V0RXhwZXJpZW5jZVJlY29tbWVuZGF0aW9uKGV4cElkLCBkYXRhKTtcbiAgICBjb25zdCBpc1JlY29tbWVuZGVkICA9IHJlY29tbWVuZGVkU2V0LmhhcyhleHBJZCk7XG4gICAgbGV0IGRlZmF1bHRBY3Rpb24gPSAnZXhjbHVkZSc7XG4gICAgaWYgICAgICAocmVjb21tZW5kYXRpb24gPT09ICdFbXBoYXNpemUnKSAgICBkZWZhdWx0QWN0aW9uID0gJ2VtcGhhc2l6ZSc7XG4gICAgZWxzZSBpZiAocmVjb21tZW5kYXRpb24gPT09ICdJbmNsdWRlJykgICAgICBkZWZhdWx0QWN0aW9uID0gJ2luY2x1ZGUnO1xuICAgIGVsc2UgaWYgKHJlY29tbWVuZGF0aW9uID09PSAnRGUtZW1waGFzaXplJykgZGVmYXVsdEFjdGlvbiA9ICdkZS1lbXBoYXNpemUnO1xuICAgIGVsc2UgaWYgKHJlY29tbWVuZGF0aW9uID09PSAnT21pdCcpICAgICAgICAgZGVmYXVsdEFjdGlvbiA9ICdleGNsdWRlJztcbiAgICBlbHNlIGlmIChpc1JlY29tbWVuZGVkKSAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRBY3Rpb24gPSAnaW5jbHVkZSc7XG4gICAgdXNlclNlbGVjdGlvbnMuZXhwZXJpZW5jZXNbZXhwSWRdID0gc2F2ZWRFeHBEZWNzW2V4cElkXSB8fCBkZWZhdWx0QWN0aW9uO1xuICB9XG5cbiAgX3JlbmRlckV4cGVyaWVuY2VUYWJsZShjb250YWluZXIsIHJlY29tbWVuZGVkU2V0LCBkYXRhLCBuZXdSZWNvbW1lbmRlZEV4cHMpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgUmVuZGVyIHRhYmxlIEhUTUwgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIF9yZW5kZXJFeHBlcmllbmNlVGFibGUoY29udGFpbmVyLCByZWNvbW1lbmRlZFNldCwgZGF0YSwgbmV3UmVjb21tZW5kZWRFeHBzID0gbmV3IFNldCgpKSB7XG4gIGlmICghY29udGFpbmVyKSBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwZXJpZW5jZS10YWJsZS1jb250YWluZXInKTtcbiAgaWYgKCFjb250YWluZXIpIHJldHVybjtcbiAgaWYgKCFyZWNvbW1lbmRlZFNldCkgcmVjb21tZW5kZWRTZXQgPSBuZXcgU2V0KCh3aW5kb3cucGVuZGluZ1JlY29tbWVuZGF0aW9ucz8ucmVjb21tZW5kZWRfZXhwZXJpZW5jZXMpIHx8IFtdKTtcbiAgaWYgKCFkYXRhKSBkYXRhID0gd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnM7XG5cbiAgLy8gRGVzdHJveSBhbnkgZXhpc3RpbmcgRGF0YVRhYmxlIGJlZm9yZSByZWJ1aWxkaW5nXG4gIGlmICgkLmZuLkRhdGFUYWJsZS5pc0RhdGFUYWJsZSgnI2V4cGVyaWVuY2UtcmV2aWV3LXRhYmxlJykpIHtcbiAgICAkKCcjZXhwZXJpZW5jZS1yZXZpZXctdGFibGUnKS5EYXRhVGFibGUoKS5kZXN0cm95KCk7XG4gIH1cblxuICBjb25zdCBleHBzID0gd2luZG93Ll9leHBlcmllbmNlc09yZGVyZWQgfHwgW107XG4gIGxldCB0YWJsZUhUTUwgPSBgXG4gICAgPHRhYmxlIGlkPVwiZXhwZXJpZW5jZS1yZXZpZXctdGFibGVcIiBjbGFzcz1cInJldmlldy10YWJsZVwiPlxuICAgICAgPHRoZWFkPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRoPkV4cGVyaWVuY2U8L3RoPlxuICAgICAgICAgIDx0aD5EYXRlczwvdGg+XG4gICAgICAgICAgPHRoPlJlY29tbWVuZGF0aW9uPC90aD5cbiAgICAgICAgICA8dGg+Q29uZmlkZW5jZTwvdGg+XG4gICAgICAgICAgPHRoPlJlYXNvbmluZzwvdGg+XG4gICAgICAgICAgPHRoPllvdXIgU2VsZWN0aW9uPC90aD5cbiAgICAgICAgPC90cj5cbiAgICAgIDwvdGhlYWQ+XG4gICAgICA8dGJvZHk+XG4gIGA7XG5cbiAgZXhwcy5mb3JFYWNoKCh7IGlkOiBleHBJZCwgZGV0YWlscyB9LCByb3dJZHgpID0+IHtcbiAgICBjb25zdCByZWNvbW1lbmRhdGlvbiAgICA9IGdldEV4cGVyaWVuY2VSZWNvbW1lbmRhdGlvbihleHBJZCwgZGF0YSk7XG4gICAgY29uc3QgY29uZmlkZW5jZSAgICAgICAgPSBnZXRDb25maWRlbmNlTGV2ZWwoZXhwSWQsIGRhdGEpO1xuICAgIGNvbnN0IHJlYXNvbmluZyAgICAgICAgID0gZ2V0RXhwZXJpZW5jZVJlYXNvbmluZyhleHBJZCwgZGF0YSk7XG4gICAgY29uc3QgcmVjUmVjb3JkICAgICAgICAgPSBfZmluZEV4cGVyaWVuY2VSZWNvbW1lbmRhdGlvblJlY29yZChleHBJZCwgZGF0YSk7XG4gICAgY29uc3QgYnVsbGV0T3JkZXIgICAgICAgPSByZWNSZWNvcmQgJiYgdHlwZW9mIHJlY1JlY29yZC5idWxsZXRfb3JkZXIgPT09ICdvYmplY3QnID8gcmVjUmVjb3JkLmJ1bGxldF9vcmRlciA6IG51bGw7XG4gICAgY29uc3QgYnVsbGV0T3JkZXJTdW1tYXJ5ID0gX2Zvcm1hdFN1Z2dlc3RlZE9yZGVyU3VtbWFyeShidWxsZXRPcmRlcj8ub3JkZXIpO1xuICAgIGNvbnN0IHRpdGxlICAgICAgICAgICAgID0gZGV0YWlscyA/IGRldGFpbHMudGl0bGUgICA6IGV4cElkO1xuICAgIGNvbnN0IGNvbXBhbnkgICAgICAgICAgID0gZGV0YWlscyA/IGRldGFpbHMuY29tcGFueSA6ICcnO1xuICAgIGNvbnN0IHN0YXJ0RGF0ZSAgICAgICAgID0gZGV0YWlscz8uc3RhcnRfZGF0ZSB8fCAnJztcbiAgICBjb25zdCBlbmREYXRlICAgICAgICAgICA9IGRldGFpbHM/LmVuZF9kYXRlICAgfHwgJ3ByZXNlbnQnO1xuICAgIGNvbnN0IGR1cmF0aW9uICAgICAgICAgID0gc3RhcnREYXRlID8gYCR7c3RhcnREYXRlfSAtICR7ZW5kRGF0ZX1gIDogKGRldGFpbHM/LmR1cmF0aW9uIHx8ICcnKTtcbiAgICBjb25zdCBkZWZhdWx0QWN0aW9uICAgICA9IHVzZXJTZWxlY3Rpb25zLmV4cGVyaWVuY2VzW2V4cElkXSB8fCAnaW5jbHVkZSc7XG4gICAgY29uc3QgcmVjb21tZW5kYXRpb25UZXh0ID0gcmVjb21tZW5kYXRpb24gfHwgJ0luY2x1ZGUnO1xuICAgIGNvbnN0IGNvbmZpZGVuY2VCYWRnZSAgID0gYDxzcGFuIGNsYXNzPVwiY29uZmlkZW5jZS1iYWRnZSBjb25maWRlbmNlLSR7Y29uZmlkZW5jZS5sZXZlbH1cIj4ke2NvbmZpZGVuY2UudGV4dH08L3NwYW4+YDtcbiAgICBjb25zdCByZWFzb25pbmdTZWdtZW50cyA9IFtyZWFzb25pbmcgfHwgJ1RoaXMgZXhwZXJpZW5jZSB3YXMgc2VsZWN0ZWQgYmFzZWQgb24gaXRzIHJlbGV2YW5jZSB0byB0aGUgcG9zaXRpb24gcmVxdWlyZW1lbnRzLiddO1xuICAgIGlmIChidWxsZXRPcmRlclN1bW1hcnkpIHJlYXNvbmluZ1NlZ21lbnRzLnB1c2goYFN1Z2dlc3RlZCBidWxsZXQgb3JkZXI6ICR7YnVsbGV0T3JkZXJTdW1tYXJ5fS5gKTtcbiAgICBpZiAoYnVsbGV0T3JkZXI/LnJlYXNvbmluZykgcmVhc29uaW5nU2VnbWVudHMucHVzaChTdHJpbmcoYnVsbGV0T3JkZXIucmVhc29uaW5nKSk7XG4gICAgaWYgKGJ1bGxldE9yZGVyPy5hdHNfaW1wYWN0KSByZWFzb25pbmdTZWdtZW50cy5wdXNoKGBBVFMgaW1wYWN0OiAke2J1bGxldE9yZGVyLmF0c19pbXBhY3R9YCk7XG4gICAgaWYgKGJ1bGxldE9yZGVyPy5wYWdlX2xlbmd0aF9pbXBhY3QpIHJlYXNvbmluZ1NlZ21lbnRzLnB1c2goYFBhZ2UgbGVuZ3RoIGltcGFjdDogJHtidWxsZXRPcmRlci5wYWdlX2xlbmd0aF9pbXBhY3R9YCk7XG4gICAgY29uc3QgcmVhc29uaW5nVGV4dCAgICAgPSByZWFzb25pbmdTZWdtZW50cy5qb2luKCcgJyk7XG4gICAgY29uc3QgaXNGaXJzdCAgICAgICAgICAgPSByb3dJZHggPT09IDA7XG4gICAgY29uc3QgaXNMYXN0ICAgICAgICAgICAgPSByb3dJZHggPT09IGV4cHMubGVuZ3RoIC0gMTtcbiAgICBjb25zdCB0aXRsZUVzYyAgICAgICAgICA9IGVzY2FwZUh0bWwodGl0bGUpO1xuICAgIGNvbnN0IHJlcnVuTmV3QmFkZ2UgPSBuZXdSZWNvbW1lbmRlZEV4cHMuaGFzKGV4cElkKVxuICAgICAgPyAnPHNwYW4gY2xhc3M9XCJydy1jaGFuZ2UtYmFkZ2UgcnctY2hhbmdlLW5ld1wiIGFyaWEtbGFiZWw9XCJOZXcgcmVjb21tZW5kYXRpb24gc2luY2UgcHJldmlvdXMgcnVuXCI+XHVEODNDXHVERDk1IE5ldzwvc3Bhbj4nXG4gICAgICA6ICcnO1xuXG4gICAgdGFibGVIVE1MICs9IGBcbiAgICAgIDx0ciBkYXRhLWV4cC1pZD1cIiR7ZXhwSWR9XCIgZGF0YS1zdGFydC1kYXRlPVwiJHtzdGFydERhdGV9XCI+XG4gICAgICAgIDx0ZD5cbiAgICAgICAgICA8c3Ryb25nPiR7dGl0bGVFc2N9PC9zdHJvbmc+JHtyZXJ1bk5ld0JhZGdlfTxicj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiM2YjcyODA7XCI+JHtlc2NhcGVIdG1sKGNvbXBhbnkpfTwvc3Bhbj5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwid2hpdGUtc3BhY2U6bm93cmFwO1wiPiR7ZXNjYXBlSHRtbChkdXJhdGlvbil9PC90ZD5cbiAgICAgICAgPHRkPjxzdHJvbmc+JHtlc2NhcGVIdG1sKHJlY29tbWVuZGF0aW9uVGV4dCl9PC9zdHJvbmc+PC90ZD5cbiAgICAgICAgPHRkPiR7Y29uZmlkZW5jZUJhZGdlfTwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cIm1heC13aWR0aDozMDBweDtcIj48c21hbGw+JHtlc2NhcGVIdG1sKHJlYXNvbmluZ1RleHQpfTwvc21hbGw+PC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwiYWN0aW9uLWJ0bnNcIiBzdHlsZT1cIndoaXRlLXNwYWNlOm5vd3JhcDtcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG4gJHtkZWZhdWx0QWN0aW9uID09PSAnZW1waGFzaXplJyAgICA/ICdhY3RpdmUnIDogJyd9XCIgZGF0YS1hY3Rpb249XCJlbXBoYXNpemVcIiAgICBhcmlhLWxhYmVsPVwiRW1waGFzaXplICR7dGl0bGVFc2N9XCIgICAgICAgYXJpYS1wcmVzc2VkPVwiJHtkZWZhdWx0QWN0aW9uID09PSAnZW1waGFzaXplJ31cIiAgICB0aXRsZT1cIkVtcGhhc2l6ZSBcdTIwMTQgZmVhdHVyZSBwcm9taW5lbnRseVwiIHN0eWxlPVwiY29sb3I6IzEwYjk4MTtcIj5cdTI3OTU8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG4gJHtkZWZhdWx0QWN0aW9uID09PSAnaW5jbHVkZScgICAgICA/ICdhY3RpdmUnIDogJyd9XCIgZGF0YS1hY3Rpb249XCJpbmNsdWRlXCIgICAgICBhcmlhLWxhYmVsPVwiSW5jbHVkZSAke3RpdGxlRXNjfVwiICAgICAgICAgYXJpYS1wcmVzc2VkPVwiJHtkZWZhdWx0QWN0aW9uID09PSAnaW5jbHVkZSd9XCIgICAgICB0aXRsZT1cIkluY2x1ZGUgXHUyMDE0IHN0YW5kYXJkIHRyZWF0bWVudFwiPlx1MjcxMzwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0biAke2RlZmF1bHRBY3Rpb24gPT09ICdkZS1lbXBoYXNpemUnID8gJ2FjdGl2ZScgOiAnJ31cIiBkYXRhLWFjdGlvbj1cImRlLWVtcGhhc2l6ZVwiIGFyaWEtbGFiZWw9XCJEZS1lbXBoYXNpemUgJHt0aXRsZUVzY31cIiAgICBhcmlhLXByZXNzZWQ9XCIke2RlZmF1bHRBY3Rpb24gPT09ICdkZS1lbXBoYXNpemUnfVwiIHRpdGxlPVwiRGUtZW1waGFzaXplIFx1MjAxNCBicmllZiBtZW50aW9uXCIgICAgc3R5bGU9XCJjb2xvcjojZjU5ZTBiO1wiPlx1Mjc5NjwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0biAke2RlZmF1bHRBY3Rpb24gPT09ICdleGNsdWRlJyAgICAgID8gJ2FjdGl2ZScgOiAnJ31cIiBkYXRhLWFjdGlvbj1cImV4Y2x1ZGVcIiAgICAgIGFyaWEtbGFiZWw9XCJFeGNsdWRlICR7dGl0bGVFc2N9XCIgICAgICAgICBhcmlhLXByZXNzZWQ9XCIke2RlZmF1bHRBY3Rpb24gPT09ICdleGNsdWRlJ31cIiAgICAgIHRpdGxlPVwiRXhjbHVkZSBcdTIwMTQgb21pdCBmcm9tIENWXCIgICAgICAgICAgc3R5bGU9XCJjb2xvcjojZWY0NDQ0O1wiPiR7ZXllU2xhc2hJY29uKCl9PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgZGF0YS1hY3Rpb249XCJyZW9yZGVyXCIgYXJpYS1sYWJlbD1cIlJlb3JkZXIgYnVsbGV0cyBmb3IgJHt0aXRsZUVzY31cIiB0aXRsZT1cIiR7YnVsbGV0T3JkZXJTdW1tYXJ5ID8gYFJlb3JkZXIgYnVsbGV0IHBvaW50cyAoQUkgc3VnZ2VzdGVkIG9yZGVyICR7YnVsbGV0T3JkZXJTdW1tYXJ5fSlgIDogJ1Jlb3JkZXIgYnVsbGV0IHBvaW50cyd9XCIgc3R5bGU9XCJjb2xvcjojNjM2NmYxO1wiPlx1MjE5NTwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIGRhdGEtYWN0aW9uPVwicm93LXVwXCIgICBhcmlhLWxhYmVsPVwiTW92ZSAke3RpdGxlRXNjfSBlYXJsaWVyIGluIENWXCIgdGl0bGU9XCJNb3ZlIHVwIGluIENWXCIgICAke2lzRmlyc3QgPyAnZGlzYWJsZWQnIDogJyd9Plx1MjE5MTwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIGRhdGEtYWN0aW9uPVwicm93LWRvd25cIiBhcmlhLWxhYmVsPVwiTW92ZSAke3RpdGxlRXNjfSBsYXRlciBpbiBDVlwiICAgdGl0bGU9XCJNb3ZlIGRvd24gaW4gQ1ZcIiAke2lzTGFzdCAgPyAnZGlzYWJsZWQnIDogJyd9Plx1MjE5MzwvYnV0dG9uPlxuICAgICAgICA8L3RkPlxuICAgICAgPC90cj5cbiAgICBgO1xuICB9KTtcblxuICB0YWJsZUhUTUwgKz0gJzwvdGJvZHk+PC90YWJsZT4nO1xuICBjb250YWluZXIuaW5uZXJIVE1MID0gdGFibGVIVE1MO1xuXG4gIC8vIERlbGVnYXRlZCBjbGljayBoYW5kbGVyXG4gIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcjZXhwZXJpZW5jZS1yZXZpZXctdGFibGUgdGJvZHknKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBlID0+IHtcbiAgICBjb25zdCBidG4gPSBlLnRhcmdldC5jbG9zZXN0KCcuaWNvbi1idG4nKTtcbiAgICBpZiAoIWJ0bikgcmV0dXJuO1xuICAgIGNvbnN0IHRyID0gYnRuLmNsb3Nlc3QoJ3RyW2RhdGEtZXhwLWlkXScpO1xuICAgIGlmICghdHIpIHJldHVybjtcbiAgICBjb25zdCBleHBJZCAgPSB0ci5kYXRhc2V0LmV4cElkO1xuICAgIGNvbnN0IGFjdGlvbiA9IGJ0bi5kYXRhc2V0LmFjdGlvbjtcbiAgICBpZiAoYWN0aW9uID09PSAncmVvcmRlcicpIHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBjb25zdCB0aXRsZUVsID0gdHIucXVlcnlTZWxlY3Rvcignc3Ryb25nJyk7XG4gICAgICBzaG93QnVsbGV0UmVvcmRlcihleHBJZCwgdGl0bGVFbCA/IHRpdGxlRWwudGV4dENvbnRlbnQgOiAnJyk7XG4gICAgfSBlbHNlIGlmIChhY3Rpb24gPT09ICdyb3ctdXAnKSB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgbW92ZUV4cGVyaWVuY2VSb3coZXhwSWQsIC0xKTtcbiAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PT0gJ3Jvdy1kb3duJykge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIG1vdmVFeHBlcmllbmNlUm93KGV4cElkLCArMSk7XG4gICAgfSBlbHNlIGlmIChhY3Rpb24pIHtcbiAgICAgIGhhbmRsZUFjdGlvbkNsaWNrKGV4cElkLCBhY3Rpb24sICdleHBlcmllbmNlJyk7XG4gICAgfVxuICB9KTtcblxuICAvLyBCdWxrIHRvb2xiYXJcbiAgY29uc3QgZXhwVG9vbGJhciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBleHBUb29sYmFyLmNsYXNzTmFtZSA9ICdidWxrLXRvb2xiYXInO1xuICBleHBUb29sYmFyLmlubmVySFRNTCA9IGBcbiAgICA8c3Bhbj5CdWxrOjwvc3Bhbj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnVsay1idG4gYnVsay1yZWNvbW1lbmRlZFwiIG9uY2xpY2s9XCJidWxrQWN0aW9uKCdyZWNvbW1lbmRlZCcsJ2V4cGVyaWVuY2UnKVwiIHRpdGxlPVwiU2V0IGFsbCB0byB0aGUgTExNIHJlY29tbWVuZGF0aW9uXCI+XHUyNzI4IEFjY2VwdCBBbGwgUmVjb21tZW5kZWQ8L2J1dHRvbj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnVsay1idG4gYnVsay1lbXBoYXNpemVcIiAgIG9uY2xpY2s9XCJidWxrQWN0aW9uKCdlbXBoYXNpemUnLCdleHBlcmllbmNlJylcIj5cdTI3OTUgRW1waGFzaXplIEFsbDwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJidWxrLWJ0biBidWxrLWluY2x1ZGVcIiAgICAgb25jbGljaz1cImJ1bGtBY3Rpb24oJ2luY2x1ZGUnLCdleHBlcmllbmNlJylcIj5cdTI3MTMgSW5jbHVkZSBBbGw8L2J1dHRvbj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnVsay1idG4gYnVsay1leGNsdWRlXCIgICAgIG9uY2xpY2s9XCJidWxrQWN0aW9uKCdleGNsdWRlJywnZXhwZXJpZW5jZScpXCI+JHtleWVTbGFzaEljb24oKX0gRXhjbHVkZSBBbGw8L2J1dHRvbj5cbiAgYDtcbiAgY29udGFpbmVyLmluc2VydEJlZm9yZShleHBUb29sYmFyLCBjb250YWluZXIuZmlyc3RDaGlsZCk7XG5cbiAgLy8gSW5pdGlhbGl6ZSBEYXRhVGFibGUgd2l0aCBubyBhdXRvLXNvcnQgKHJvd3Mgc3RheSBpbiB1c2VyLXNwZWNpZmllZCBvcmRlcilcbiAgJCgnI2V4cGVyaWVuY2UtcmV2aWV3LXRhYmxlJykuRGF0YVRhYmxlKHtcbiAgICBwYWdpbmc6IGZhbHNlLFxuICAgIG9yZGVyOiBbXSxcbiAgICBsYW5ndWFnZTogeyBzZWFyY2g6ICdGaWx0ZXIgZXhwZXJpZW5jZXM6JyB9XG4gIH0pO1xuICBfdXBkYXRlUGFnZUVzdGltYXRlKCk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBSb3cgcmVvcmRlciBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gbW92ZUV4cGVyaWVuY2VSb3coZXhwSWQsIGRpcmVjdGlvbikge1xuICBjb25zdCBhcnIgPSB3aW5kb3cuX2V4cGVyaWVuY2VzT3JkZXJlZDtcbiAgaWYgKCFhcnIpIHJldHVybjtcbiAgY29uc3QgaWR4ID0gYXJyLmZpbmRJbmRleChlID0+IGUuaWQgPT09IGV4cElkKTtcbiAgaWYgKGlkeCA8IDApIHJldHVybjtcbiAgY29uc3QgbmV3SWR4ID0gaWR4ICsgZGlyZWN0aW9uO1xuICBpZiAobmV3SWR4IDwgMCB8fCBuZXdJZHggPj0gYXJyLmxlbmd0aCkgcmV0dXJuO1xuICBbYXJyW2lkeF0sIGFycltuZXdJZHhdXSA9IFthcnJbbmV3SWR4XSwgYXJyW2lkeF1dO1xuICB3aW5kb3cuX2V4cGVyaWVuY2VzT3JkZXJlZCA9IGFycjtcbiAgX3JlbmRlckV4cGVyaWVuY2VUYWJsZShudWxsLCBudWxsLCBudWxsKTtcbiAgLy8gUGVyc2lzdCB0aGUgbmV3IG9yZGVyIHRvIHRoZSBiYWNrZW5kIChmaXJlLWFuZC1mb3JnZXQ7IG5vIFVJIGJsb2NrKVxuICBmZXRjaCgnL2FwaS9yZW9yZGVyLXJvd3MnLCB7XG4gICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyB0eXBlOiAnZXhwZXJpZW5jZScsIG9yZGVyZWRfaWRzOiBhcnIubWFwKGUgPT4gZS5pZCkgfSlcbiAgfSkuY2F0Y2goKCkgPT4ge30pO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgTGVnYWN5IGludGVyYWN0aXZlLW1vZGUgcmVzcG9uc2UgaGFuZGxlciBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gaGFuZGxlRXhwZXJpZW5jZVJlc3BvbnNlKG1lc3NhZ2UpIHtcbiAgd2luZG93LndhaXRpbmdGb3JFeHBlcmllbmNlUmVzcG9uc2UgPSBmYWxzZTtcbiAgY29uc3QgcmVzcG9uc2UgPSBtZXNzYWdlLnRvTG93ZXJDYXNlKCk7XG5cbiAgaWYgKHJlc3BvbnNlLmluY2x1ZGVzKCd5ZXMnKSkge1xuICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsICdHcmVhdCEgSVxcJ2xsIGluY2x1ZGUgdGhpcyBleHBlcmllbmNlIHByb21pbmVudGx5LicpO1xuICB9IGVsc2UgaWYgKHJlc3BvbnNlLmluY2x1ZGVzKCdubycpKSB7XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ1VuZGVyc3Rvb2QuIElcXCdsbCBleGNsdWRlIHRoaXMgZXhwZXJpZW5jZSBmcm9tIHRoZSBmaW5hbCBDVi4nKTtcbiAgfSBlbHNlIGlmIChyZXNwb25zZS5pbmNsdWRlcygnbWF5YmUnKSkge1xuICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsICdJXFwnbGwgaW5jbHVkZSBpdCBidXQgd2l0aCBsZXNzIGVtcGhhc2lzLicpO1xuICB9IGVsc2Uge1xuICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsICdJXFwnbGwgbm90ZSB5b3VyIGZlZWRiYWNrIG9uIHRoaXMgZXhwZXJpZW5jZS4nKTtcbiAgfVxuXG4gIC8vIE1vdmUgdG8gbmV4dCBleHBlcmllbmNlIChjdXJyZW50SW5kZXggYWxyZWFkeSBpbmNyZW1lbnRlZCBpbiBzaG93TmV4dEV4cGVyaWVuY2UpXG4gIHNldFRpbWVvdXQoKCkgPT4gc2hvd05leHRFeHBlcmllbmNlKCksIDgwMCk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBTdWJtaXQgZGVjaXNpb25zIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBzdWJtaXRFeHBlcmllbmNlRGVjaXNpb25zKCkge1xuICAvKiBkdWNrZmxvdzpcbiAgICogICBpZDogZXhwZXJpZW5jZV91aV9zdWJtaXRfbGl2ZVxuICAgKiAgIGtpbmQ6IHVpXG4gICAqICAgdGltZXN0YW1wOiAnMjAyNi0wMy0yNVQyMTozOTo0OFonXG4gICAqICAgc3RhdHVzOiBsaXZlXG4gICAqICAgaGFuZGxlczpcbiAgICogICAtIHVpOmV4cGVyaWVuY2UtcmV2aWV3LnN1Ym1pdFxuICAgKiAgIGNhbGxzOlxuICAgKiAgIC0gUE9TVCAvYXBpL3Jldmlldy1kZWNpc2lvbnNcbiAgICogICAtIFBPU1QgL2FwaS9jdi9sYXlvdXQtZXN0aW1hdGVcbiAgICogICByZWFkczpcbiAgICogICAtIHdpbmRvdzp1c2VyU2VsZWN0aW9ucy5leHBlcmllbmNlc1xuICAgKiAgIHdyaXRlczpcbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL3Jldmlldy1kZWNpc2lvbnMuZGVjaXNpb25zXG4gICAqICAgLSB3aW5kb3c6X3NhdmVkRGVjaXNpb25zLmV4cGVyaWVuY2VfZGVjaXNpb25zXG4gICAqICAgbm90ZXM6IFBlcnNpc3RzIHBlci1leHBlcmllbmNlIGluY2x1c2lvbiBkZWNpc2lvbnMgYW5kIHRyaWdnZXJzIGRvd25zdHJlYW0gQVRTL2xheW91dCByZWZyZXNoZXMgdGhhdCBkZXBlbmQgb24gdGhlIHNhbWUgcmV2aWV3IGNob2ljZXMuXG4gICAqL1xuICBjb25zdCBkZWNpc2lvbnMgPSB1c2VyU2VsZWN0aW9ucy5leHBlcmllbmNlcztcbiAgY29uc3QgY291bnQgPSBPYmplY3Qua2V5cyhkZWNpc2lvbnMpLmxlbmd0aDtcblxuICBpZiAoY291bnQgPT09IDApIHtcbiAgICBzaG93QWxlcnRNb2RhbCgnTm8gU2VsZWN0aW9ucycsICdQbGVhc2Ugc2VsZWN0IGFjdGlvbnMgZm9yIGF0IGxlYXN0IG9uZSBleHBlcmllbmNlIGJlZm9yZSBzdWJtaXR0aW5nLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9yZXZpZXctZGVjaXNpb25zJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgdHlwZTogJ2V4cGVyaWVuY2VzJyxcbiAgICAgICAgZGVjaXNpb25zOiBkZWNpc2lvbnNcbiAgICAgIH0pXG4gICAgfSk7XG5cbiAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgIHN0YXRlTWFuYWdlci5tYXJrQ29udGVudENoYW5nZWQoKTtcbiAgICAgIHNob3dUb2FzdChgRXhwZXJpZW5jZSBkZWNpc2lvbnMgc2F2ZWQgKCR7Y291bnR9IGl0ZW1zKWApO1xuICAgICAgc2NoZWR1bGVBdHNSZWZyZXNoKCk7XG4gICAgICAvLyBQZXJzaXN0IHNhdmVkIGRlY2lzaW9ucyBsb2NhbGx5IHNvIHRoZSBVSSByZWZsZWN0cyB0aGVtIGltbWVkaWF0ZWx5XG4gICAgICB3aW5kb3cuX3NhdmVkRGVjaXNpb25zID0gd2luZG93Ll9zYXZlZERlY2lzaW9ucyB8fCB7fTtcbiAgICAgIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMuZXhwZXJpZW5jZV9kZWNpc2lvbnMgPSBkZWNpc2lvbnM7XG4gICAgICB1c2VyU2VsZWN0aW9ucy5leHBlcmllbmNlcyA9IHsgLi4uZGVjaXNpb25zIH07XG4gICAgICBpZiAodHlwZW9mIHVwZGF0ZUluY2x1c2lvbkNvdW50cyA9PT0gJ2Z1bmN0aW9uJykgdXBkYXRlSW5jbHVzaW9uQ291bnRzKCk7XG4gICAgICBzd2l0Y2hUYWIoJ2FjaC1lZGl0b3InKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZXJyb3IgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICBzaG93VG9hc3QoYEVycm9yOiAke2Vycm9yLmVycm9yIHx8ICdGYWlsZWQgdG8gc2F2ZSBkZWNpc2lvbnMnfWAsICdlcnJvcicpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cuZXJyb3IoJ0Vycm9yIHN1Ym1pdHRpbmcgZXhwZXJpZW5jZSBkZWNpc2lvbnM6JywgZXJyb3IpO1xuICAgIHNob3dUb2FzdCgnRmFpbGVkIHRvIHNhdmUgZGVjaXNpb25zLiBQbGVhc2UgdHJ5IGFnYWluLicsICdlcnJvcicpO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFeHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5leHBvcnQge1xuICBnZXRFeHBlcmllbmNlRGV0YWlscyxcbiAgYnVpbGRFeHBlcmllbmNlUmV2aWV3VGFibGUsXG4gIF9yZW5kZXJFeHBlcmllbmNlVGFibGUsXG4gIG1vdmVFeHBlcmllbmNlUm93LFxuICBoYW5kbGVFeHBlcmllbmNlUmVzcG9uc2UsXG4gIHN1Ym1pdEV4cGVyaWVuY2VEZWNpc2lvbnMsXG59O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvc2tpbGxzLXJldmlldy5qc1xuICogU2tpbGxzLXJldmlldyB0YWJsZTogZmV0Y2gsIHJlbmRlciwgcm93LXJlb3JkZXIsIGFuZCBzdWJtaXQgZGVjaXNpb25zLlxuICpcbiAqIERlcGVuZGVuY2llcyAocmVzb2x2ZWQgdGhyb3VnaCBnbG9iYWxUaGlzIGF0IHJ1bnRpbWUpOlxuICogICB1c2VyU2VsZWN0aW9ucywgcGVuZGluZ1JlY29tbWVuZGF0aW9ucywgX3NhdmVkRGVjaXNpb25zLCBfc2tpbGxzT3JkZXJlZCxcbiAqICAgX25ld1NraWxsc0Zyb21MTE0sIHRhYkRhdGEsIHBhcnNlU3RhdHVzUmVzcG9uc2UsXG4gKiAgIGdldFNraWxsUmVjb21tZW5kYXRpb24sIGdldFNraWxsQ29uZmlkZW5jZSwgZ2V0U2tpbGxSZWFzb25pbmcsXG4gKiAgIGVzY2FwZUh0bWwsIGhhbmRsZUFjdGlvbkNsaWNrLCBidWxrQWN0aW9uLCBfdXBkYXRlUGFnZUVzdGltYXRlLFxuICogICB1cGRhdGVJbmNsdXNpb25Db3VudHMsIHN3aXRjaFRhYixcbiAqICAgc2hvd0FsZXJ0TW9kYWwsIHNob3dUb2FzdCwgc2NoZWR1bGVBdHNSZWZyZXNoLFxuICogICAkLCAkLmZuLkRhdGFUYWJsZSAoalF1ZXJ5ICsgRGF0YVRhYmxlcylcbiAqL1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5jb25zdCBsb2cgPSBnZXRMb2dnZXIoJ3NraWxscy1yZXZpZXcnKTtcblxuaW1wb3J0IHsgc3RhdGVNYW5hZ2VyIH0gZnJvbSAnLi9zdGF0ZS1tYW5hZ2VyLmpzJztcbmltcG9ydCB7IGV5ZVNsYXNoSWNvbiB9IGZyb20gJy4vcmV2aWV3LWljb25zLmpzJztcblxuLy8gXHUyNTAwXHUyNTAwIFllYXJzLWZyb20tZXhwZXJpZW5jZSBoZWxwZXJzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBfcGFyc2VZZWFyRnJvbVN0cihzdHIpIHtcbiAgaWYgKCFzdHIpIHJldHVybiBudWxsO1xuICBjb25zdCBzID0gU3RyaW5nKHN0cikudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gIGlmIChbJ2N1cnJlbnQnLCAncHJlc2VudCcsICdub3cnLCAnb25nb2luZyddLmluY2x1ZGVzKHMpKSByZXR1cm4gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpO1xuICBjb25zdCBtID0gcy5tYXRjaCgvXFxiKDE5fDIwKVxcZHsyfVxcYi8pO1xuICByZXR1cm4gbSA/IHBhcnNlSW50KG1bMF0sIDEwKSA6IG51bGw7XG59XG5cbi8qKlxuICogR2l2ZW4gYSBsaXN0IG9mIGV4cGVyaWVuY2UgSURzIGFuZCB0aGUgZnVsbCBleHBlcmllbmNlcyBhcnJheSwgcmV0dXJuXG4gKiB0aGUgdG90YWwgeWVhcnMgb2YgZXhwZXJpZW5jZSAoc3VtIG9mIGR1cmF0aW9uIG9mIG1hdGNoZWQgZW50cmllcykuXG4gKiBSZXR1cm5zIG51bGwgaWYgbm8gbWF0Y2hpbmcgZW50cmllcyBmb3VuZC5cbiAqL1xuZnVuY3Rpb24gX2NvbXB1dGVZZWFyc0Zyb21JZHMoaWRzLCBhbGxFeHBlcmllbmNlcykge1xuICBjb25zdCBpZFNldCA9IG5ldyBTZXQoKGlkcyB8fCBbXSkubWFwKHggPT4gU3RyaW5nKHgpLnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pKTtcbiAgaWYgKGlkU2V0LnNpemUgPT09IDApIHJldHVybiBudWxsO1xuICBsZXQgdG90YWwgPSAwO1xuICBjb25zdCBjdXJyZW50WWVhciA9IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKTtcbiAgZm9yIChjb25zdCBleHAgb2YgKGFsbEV4cGVyaWVuY2VzIHx8IFtdKSkge1xuICAgIGlmICghZXhwIHx8IHR5cGVvZiBleHAgIT09ICdvYmplY3QnKSBjb250aW51ZTtcbiAgICBjb25zdCBleHBJZCA9IFN0cmluZyhleHAuaWQgfHwgJycpLnRyaW0oKTtcbiAgICBpZiAoIWlkU2V0LmhhcyhleHBJZCkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHN0YXJ0WWVhciA9IF9wYXJzZVllYXJGcm9tU3RyKGV4cC5zdGFydF9kYXRlIHx8IGV4cC5zdGFydCk7XG4gICAgY29uc3QgZW5kWWVhciAgID0gX3BhcnNlWWVhckZyb21TdHIoZXhwLmVuZF9kYXRlICAgfHwgZXhwLmVuZCkgPz8gY3VycmVudFllYXI7XG4gICAgdG90YWwgKz0gc3RhcnRZZWFyID09IG51bGwgPyAxIDogTWF0aC5tYXgoMSwgZW5kWWVhciAtIHN0YXJ0WWVhciArIDEpO1xuICB9XG4gIHJldHVybiB0b3RhbCA+IDAgPyB0b3RhbCA6IG51bGw7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNhdmVTa2lsbEdyb3VwT3ZlcnJpZGUoc2tpbGxOYW1lLCBncm91cE5hbWUpIHtcbiAgY29uc3Qgbm9ybWFsaXplZEdyb3VwID0gZ3JvdXBOYW1lID09IG51bGwgPyBudWxsIDogU3RyaW5nKGdyb3VwTmFtZSkudHJpbSgpIHx8IG51bGw7XG4gIGNvbnN0IHNrID0gKHdpbmRvdy5fc2tpbGxzT3JkZXJlZCB8fCBbXSkuZmluZChzID0+ICh0eXBlb2YgcyA9PT0gJ3N0cmluZycgPyBzIDogcy5uYW1lIHx8IHMpID09PSBza2lsbE5hbWUpO1xuICBpZiAoc2sgJiYgdHlwZW9mIHNrID09PSAnb2JqZWN0Jykgc2suZ3JvdXAgPSBub3JtYWxpemVkR3JvdXAgfHwgJyc7XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9yZXZpZXctc2tpbGwtZ3JvdXAnLCB7XG4gICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBza2lsbDogc2tpbGxOYW1lLCBncm91cDogbm9ybWFsaXplZEdyb3VwIH0pLFxuICB9KTtcblxuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgY29uc3QgZXJyb3IgPSBhd2FpdCByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGVycm9yLmVycm9yIHx8ICdGYWlsZWQgdG8gc2F2ZSBza2lsbCBncm91cCcpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3BvbnNlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzYXZlU2tpbGxDYXRlZ29yeU92ZXJyaWRlKHNraWxsTmFtZSwgY2F0ZWdvcnlOYW1lKSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRDYXRlZ29yeSA9IGNhdGVnb3J5TmFtZSA9PSBudWxsID8gbnVsbCA6IFN0cmluZyhjYXRlZ29yeU5hbWUpLnRyaW0oKSB8fCBudWxsO1xuICBjb25zdCBzayA9ICh3aW5kb3cuX3NraWxsc09yZGVyZWQgfHwgW10pLmZpbmQocyA9PiAodHlwZW9mIHMgPT09ICdzdHJpbmcnID8gcyA6IHMubmFtZSB8fCBzKSA9PT0gc2tpbGxOYW1lKTtcbiAgaWYgKHNrICYmIHR5cGVvZiBzayA9PT0gJ29iamVjdCcpIHtcbiAgICBpZiAobm9ybWFsaXplZENhdGVnb3J5KSBzay5jYXRlZ29yeSA9IG5vcm1hbGl6ZWRDYXRlZ29yeTtcbiAgICBlbHNlIGRlbGV0ZSBzay5jYXRlZ29yeTtcbiAgfVxuXG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvcmV2aWV3LXNraWxsLWNhdGVnb3J5Jywge1xuICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgc2tpbGw6IHNraWxsTmFtZSwgY2F0ZWdvcnk6IG5vcm1hbGl6ZWRDYXRlZ29yeSB9KSxcbiAgfSk7XG5cbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIGNvbnN0IGVycm9yID0gYXdhaXQgcmVzcG9uc2UuanNvbigpLmNhdGNoKCgpID0+ICh7fSkpO1xuICAgIHRocm93IG5ldyBFcnJvcihlcnJvci5lcnJvciB8fCAnRmFpbGVkIHRvIHNhdmUgc2tpbGwgY2F0ZWdvcnknKTtcbiAgfVxuXG4gIHJldHVybiByZXNwb25zZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVuYW1lU2tpbGxDYXRlZ29yeShvbGRDYXRlZ29yeSwgbmV3Q2F0ZWdvcnkpIHtcbiAgY29uc3Qgbm9ybWFsaXplZE9sZCA9IFN0cmluZyhvbGRDYXRlZ29yeSB8fCAnJykudHJpbSgpO1xuICBjb25zdCBub3JtYWxpemVkTmV3ID0gU3RyaW5nKG5ld0NhdGVnb3J5IHx8ICcnKS50cmltKCk7XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9yZXZpZXctc2tpbGwtY2F0ZWdvcmllcycsIHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBhY3Rpb246ICdyZW5hbWUnLFxuICAgICAgb2xkX2NhdGVnb3J5OiBub3JtYWxpemVkT2xkLFxuICAgICAgbmV3X2NhdGVnb3J5OiBub3JtYWxpemVkTmV3LFxuICAgIH0pLFxuICB9KTtcblxuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgY29uc3QgZXJyb3IgPSBhd2FpdCByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGVycm9yLmVycm9yIHx8ICdGYWlsZWQgdG8gcmVuYW1lIHNraWxsIGNhdGVnb3J5Jyk7XG4gIH1cblxuICByZXR1cm4gcmVzcG9uc2U7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNhdmVTa2lsbENhdGVnb3J5T3JkZXIob3JkZXJlZENhdGVnb3JpZXMpIHtcbiAgY29uc3Qgbm9ybWFsaXplZE9yZGVyID0gQXJyYXkuZnJvbShuZXcgU2V0KFxuICAgIChvcmRlcmVkQ2F0ZWdvcmllcyB8fCBbXSlcbiAgICAgIC5tYXAoY2F0ZWdvcnkgPT4gU3RyaW5nKGNhdGVnb3J5IHx8ICcnKS50cmltKCkpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pLFxuICApKTtcblxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3Jldmlldy1za2lsbC1jYXRlZ29yaWVzJywge1xuICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGFjdGlvbjogJ3Jlb3JkZXInLFxuICAgICAgb3JkZXJlZF9jYXRlZ29yaWVzOiBub3JtYWxpemVkT3JkZXIsXG4gICAgfSksXG4gIH0pO1xuXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICBjb25zdCBlcnJvciA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3IuZXJyb3IgfHwgJ0ZhaWxlZCB0byBzYXZlIHNraWxsIGNhdGVnb3J5IG9yZGVyJyk7XG4gIH1cblxuICByZXR1cm4gcmVzcG9uc2U7XG59XG5cbmZ1bmN0aW9uIF9ub3JtYWxpemVTa2lsbFN1YnNraWxscyh2YWx1ZSkge1xuICBjb25zdCByYXdWYWx1ZXMgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogU3RyaW5nKHZhbHVlIHx8ICcnKS5zcGxpdCgnLCcpO1xuICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KFxuICAgIHJhd1ZhbHVlc1xuICAgICAgLm1hcChpdGVtID0+IFN0cmluZyhpdGVtIHx8ICcnKS50cmltKCkpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pLFxuICApKTtcbn1cblxuZnVuY3Rpb24gX3NraWxsTmFtZShza2lsbCkge1xuICByZXR1cm4gdHlwZW9mIHNraWxsID09PSAnc3RyaW5nJyA/IHNraWxsIDogU3RyaW5nKHNraWxsPy5uYW1lIHx8IHNraWxsIHx8ICcnKS50cmltKCk7XG59XG5cbmZ1bmN0aW9uIF9ub3JtYWxpemVFeHRyYVNraWxsRW50cnkocmF3U2tpbGwsIHsgdXNlckNyZWF0ZWQgPSBmYWxzZSB9ID0ge30pIHtcbiAgaWYgKHR5cGVvZiByYXdTa2lsbCA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCBuYW1lID0gcmF3U2tpbGwudHJpbSgpO1xuICAgIHJldHVybiBuYW1lID8geyBuYW1lLCBfaXNOZXc6IHRydWUgfSA6IG51bGw7XG4gIH1cbiAgaWYgKCFyYXdTa2lsbCB8fCB0eXBlb2YgcmF3U2tpbGwgIT09ICdvYmplY3QnKSByZXR1cm4gbnVsbDtcblxuICBjb25zdCBuYW1lID0gU3RyaW5nKHJhd1NraWxsLm5hbWUgfHwgJycpLnRyaW0oKTtcbiAgaWYgKCFuYW1lKSByZXR1cm4gbnVsbDtcblxuICBjb25zdCBub3JtYWxpemVkID0ge1xuICAgIC4uLnJhd1NraWxsLFxuICAgIG5hbWUsXG4gICAgX2lzTmV3OiB0cnVlLFxuICB9O1xuICBjb25zdCBzdWJza2lsbHMgPSBfbm9ybWFsaXplU2tpbGxTdWJza2lsbHMocmF3U2tpbGwuc3Vic2tpbGxzIHx8IHJhd1NraWxsLnN1Yl9za2lsbHMgfHwgW10pO1xuICBpZiAoc3Vic2tpbGxzLmxlbmd0aCA+IDApIG5vcm1hbGl6ZWQuc3Vic2tpbGxzID0gc3Vic2tpbGxzO1xuICBlbHNlIGRlbGV0ZSBub3JtYWxpemVkLnN1YnNraWxscztcblxuICBpZiAodXNlckNyZWF0ZWQgfHwgcmF3U2tpbGwudXNlcl9jcmVhdGVkIHx8IHJhd1NraWxsLl9pc1VzZXJDcmVhdGVkKSB7XG4gICAgbm9ybWFsaXplZC51c2VyX2NyZWF0ZWQgPSB0cnVlO1xuICAgIG5vcm1hbGl6ZWQuX2lzVXNlckNyZWF0ZWQgPSB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG59XG5cbmZ1bmN0aW9uIF9za2lsbElubGluZUxhYmVsKHNraWxsKSB7XG4gIGlmICghc2tpbGwgfHwgdHlwZW9mIHNraWxsID09PSAnc3RyaW5nJykgcmV0dXJuIF9za2lsbE5hbWUoc2tpbGwpO1xuICBjb25zdCBuYW1lID0gX3NraWxsTmFtZShza2lsbCk7XG4gIGNvbnN0IHBhcmVudGhldGljYWwgPSBTdHJpbmcoc2tpbGwucGFyZW50aGV0aWNhbCB8fCAnJykudHJpbSgpO1xuICBpZiAocGFyZW50aGV0aWNhbCkgcmV0dXJuIGAke25hbWV9ICgke3BhcmVudGhldGljYWx9KWA7XG5cbiAgY29uc3QgcXVhbGlmaWVyUGFydHMgPSBbXTtcbiAgY29uc3QgcHJvZmljaWVuY3kgPSBTdHJpbmcoc2tpbGwucHJvZmljaWVuY3kgfHwgJycpLnRyaW0oKTtcbiAgaWYgKHByb2ZpY2llbmN5KSBxdWFsaWZpZXJQYXJ0cy5wdXNoKHByb2ZpY2llbmN5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcHJvZmljaWVuY3kuc2xpY2UoMSkpO1xuICBfbm9ybWFsaXplU2tpbGxTdWJza2lsbHMoc2tpbGwuc3Vic2tpbGxzIHx8IHNraWxsLnN1Yl9za2lsbHMgfHwgW10pLmZvckVhY2goaXRlbSA9PiBxdWFsaWZpZXJQYXJ0cy5wdXNoKGl0ZW0pKTtcbiAgaWYgKHF1YWxpZmllclBhcnRzLmxlbmd0aCA+IDApIHJldHVybiBgJHtuYW1lfSAoJHtxdWFsaWZpZXJQYXJ0cy5qb2luKCcsICcpfSlgO1xuICByZXR1cm4gbmFtZTtcbn1cblxuZnVuY3Rpb24gX2ZpbmRTa2lsbFJlY29tbWVuZGF0aW9uUmVjb3JkKHNraWxsTmFtZSwgZGF0YSkge1xuICBpZiAoIWRhdGEgfHwgIUFycmF5LmlzQXJyYXkoZGF0YS5za2lsbF9yZWNvbW1lbmRhdGlvbnMpKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIGRhdGEuc2tpbGxfcmVjb21tZW5kYXRpb25zLmZpbmQoKHJlYykgPT4ge1xuICAgIGNvbnN0IHJlY05hbWUgPSBTdHJpbmcocmVjPy5za2lsbCB8fCByZWM/Lm5hbWUgfHwgJycpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiByZWNOYW1lID09PSBTdHJpbmcoc2tpbGxOYW1lIHx8ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgfSkgfHwgbnVsbDtcbn1cblxuZnVuY3Rpb24gX2J1aWxkU2tpbGxHcm91cGluZ1N1Z2dlc3Rpb24ocmVjLCBza2lsbCkge1xuICBjb25zdCBncm91cGluZyA9IHJlYyAmJiB0eXBlb2YgcmVjLmdyb3VwaW5nID09PSAnb2JqZWN0JyA/IHJlYy5ncm91cGluZyA6IG51bGw7XG4gIGlmICghZ3JvdXBpbmcpIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IGN1cnJlbnRDYXRlZ29yeSA9IHR5cGVvZiBza2lsbCA9PT0gJ29iamVjdCcgPyBTdHJpbmcoc2tpbGwuY2F0ZWdvcnkgfHwgJycpLnRyaW0oKSA6ICcnO1xuICBjb25zdCBjdXJyZW50R3JvdXAgPSB0eXBlb2Ygc2tpbGwgPT09ICdvYmplY3QnID8gU3RyaW5nKHNraWxsLmdyb3VwIHx8ICcnKS50cmltKCkgOiAnJztcbiAgY29uc3Qgc3VnZ2VzdGVkQ2F0ZWdvcnkgPSBTdHJpbmcoZ3JvdXBpbmcuY2F0ZWdvcnkgfHwgJycpLnRyaW0oKTtcbiAgY29uc3Qgc3VnZ2VzdGVkR3JvdXAgPSBTdHJpbmcoZ3JvdXBpbmcuZ3JvdXAgfHwgJycpLnRyaW0oKTtcbiAgY29uc3QgY2F0ZWdvcnlDaGFuZ2VkID0gQm9vbGVhbihzdWdnZXN0ZWRDYXRlZ29yeSAmJiBzdWdnZXN0ZWRDYXRlZ29yeSAhPT0gY3VycmVudENhdGVnb3J5KTtcbiAgY29uc3QgZ3JvdXBDaGFuZ2VkID0gQm9vbGVhbihzdWdnZXN0ZWRHcm91cCAmJiBzdWdnZXN0ZWRHcm91cCAhPT0gY3VycmVudEdyb3VwKTtcblxuICBpZiAoIWNhdGVnb3J5Q2hhbmdlZCAmJiAhZ3JvdXBDaGFuZ2VkKSByZXR1cm4gbnVsbDtcblxuICBjb25zdCBjaGFuZ2VQYXJ0cyA9IFtdO1xuICBpZiAoY2F0ZWdvcnlDaGFuZ2VkKSB7XG4gICAgY2hhbmdlUGFydHMucHVzaChgQ2F0ZWdvcnk6ICR7Y3VycmVudENhdGVnb3J5IHx8ICdVbmNhdGVnb3JpemVkJ30gLT4gJHtzdWdnZXN0ZWRDYXRlZ29yeX1gKTtcbiAgfVxuICBpZiAoZ3JvdXBDaGFuZ2VkKSB7XG4gICAgY2hhbmdlUGFydHMucHVzaChgR3JvdXA6ICR7Y3VycmVudEdyb3VwIHx8ICdOb25lJ30gLT4gJHtzdWdnZXN0ZWRHcm91cH1gKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY2F0ZWdvcnk6IHN1Z2dlc3RlZENhdGVnb3J5LFxuICAgIGdyb3VwOiBzdWdnZXN0ZWRHcm91cCxcbiAgICBjYXRlZ29yeUNoYW5nZWQsXG4gICAgZ3JvdXBDaGFuZ2VkLFxuICAgIGNoYW5nZVRleHQ6IGNoYW5nZVBhcnRzLmpvaW4oJyB8ICcpLFxuICAgIHJlYXNvbmluZzogU3RyaW5nKGdyb3VwaW5nLnJlYXNvbmluZyB8fCAnJykudHJpbSgpLFxuICAgIGF0c0ltcGFjdDogU3RyaW5nKGdyb3VwaW5nLmF0c19pbXBhY3QgfHwgJycpLnRyaW0oKSxcbiAgICBwYWdlTGVuZ3RoSW1wYWN0OiBTdHJpbmcoZ3JvdXBpbmcucGFnZV9sZW5ndGhfaW1wYWN0IHx8ICcnKS50cmltKCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIF9jc3NFc2NhcGUodmFsdWUpIHtcbiAgaWYgKGdsb2JhbFRoaXMuQ1NTICYmIHR5cGVvZiBnbG9iYWxUaGlzLkNTUy5lc2NhcGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZ2xvYmFsVGhpcy5DU1MuZXNjYXBlKFN0cmluZyh2YWx1ZSkpO1xuICB9XG4gIHJldHVybiBTdHJpbmcodmFsdWUpLnJlcGxhY2UoL1xcXFwvZywgJ1xcXFxcXFxcJykucmVwbGFjZSgvXCIvZywgJ1xcXFxcIicpO1xufVxuXG5mdW5jdGlvbiBfYnVpbGRHcm91cFdhcm5pbmdzKHNraWxscykge1xuICBjb25zdCB3YXJuaW5nTWFwID0gbmV3IE1hcCgpO1xuICBjb25zdCBncm91cHMgPSBuZXcgTWFwKCk7XG4gIGZvciAoY29uc3Qgc2tpbGwgb2Ygc2tpbGxzIHx8IFtdKSB7XG4gICAgaWYgKCFza2lsbCB8fCB0eXBlb2Ygc2tpbGwgIT09ICdvYmplY3QnKSBjb250aW51ZTtcbiAgICBjb25zdCBza2lsbE5hbWUgPSBfc2tpbGxOYW1lKHNraWxsKTtcbiAgICBjb25zdCBncm91cE5hbWUgPSBTdHJpbmcoc2tpbGwuZ3JvdXAgfHwgJycpLnRyaW0oKTtcbiAgICBpZiAoIXNraWxsTmFtZSB8fCAhZ3JvdXBOYW1lKSBjb250aW51ZTtcbiAgICBpZiAoIWdyb3Vwcy5oYXMoZ3JvdXBOYW1lKSkgZ3JvdXBzLnNldChncm91cE5hbWUsIFtdKTtcbiAgICBncm91cHMuZ2V0KGdyb3VwTmFtZSkucHVzaChfc2tpbGxJbmxpbmVMYWJlbChza2lsbCkpO1xuICB9XG5cbiAgZ3JvdXBzLmZvckVhY2goKGxhYmVscywgZ3JvdXBOYW1lKSA9PiB7XG4gICAgY29uc3QgcHJldmlldyA9IGxhYmVscy5qb2luKCcsICcpO1xuICAgIGNvbnN0IGNyb3dkZWQgPSBwcmV2aWV3Lmxlbmd0aCA+PSA5MCB8fCBsYWJlbHMubGVuZ3RoID49IDU7XG4gICAgaWYgKCFjcm93ZGVkKSByZXR1cm47XG4gICAgd2FybmluZ01hcC5zZXQoZ3JvdXBOYW1lLCB7XG4gICAgICBwcmV2aWV3LFxuICAgICAgbWVtYmVyQ291bnQ6IGxhYmVscy5sZW5ndGgsXG4gICAgICBtZXNzYWdlOiBgSW5saW5lIGJ1bGxldCBtYXkgYmUgaGFyZCB0byBzY2FuICgke2xhYmVscy5sZW5ndGh9IHNraWxscywgJHtwcmV2aWV3Lmxlbmd0aH0gY2hhcnMpLmAsXG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiB3YXJuaW5nTWFwO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzYXZlU2tpbGxRdWFsaWZpZXJPdmVycmlkZShza2lsbE5hbWUsIHF1YWxpZmllcnMpIHtcbiAgY29uc3Qgbm9ybWFsaXplZFNraWxsID0gU3RyaW5nKHNraWxsTmFtZSB8fCAnJykudHJpbSgpO1xuICBpZiAoIW5vcm1hbGl6ZWRTa2lsbCkgdGhyb3cgbmV3IEVycm9yKCdTa2lsbCBuYW1lIGlzIHJlcXVpcmVkJyk7XG5cbiAgY29uc3Qgbm9ybWFsaXplZFByb2ZpY2llbmN5ID0gU3RyaW5nKHF1YWxpZmllcnM/LnByb2ZpY2llbmN5IHx8ICcnKS50cmltKCk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRTdWJza2lsbHMgPSBfbm9ybWFsaXplU2tpbGxTdWJza2lsbHMocXVhbGlmaWVycz8uc3Vic2tpbGxzKTtcbiAgY29uc3Qgbm9ybWFsaXplZFBhcmVudGhldGljYWwgPSBTdHJpbmcocXVhbGlmaWVycz8ucGFyZW50aGV0aWNhbCB8fCAnJykudHJpbSgpO1xuICBjb25zdCBub3JtYWxpemVkU2tpbGxUeXBlID0gU3RyaW5nKHF1YWxpZmllcnM/LnNraWxsX3R5cGUgfHwgJycpLnRyaW0oKS50b0xvd2VyQ2FzZSgpIHx8IG51bGw7XG5cbiAgY29uc3Qgc2sgPSAod2luZG93Ll9za2lsbHNPcmRlcmVkIHx8IFtdKS5maW5kKHMgPT4gKHR5cGVvZiBzID09PSAnc3RyaW5nJyA/IHMgOiBzLm5hbWUgfHwgcykgPT09IG5vcm1hbGl6ZWRTa2lsbCk7XG4gIGlmIChzayAmJiB0eXBlb2Ygc2sgPT09ICdvYmplY3QnKSB7XG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9maWNpZW5jeSkgc2sucHJvZmljaWVuY3kgPSBub3JtYWxpemVkUHJvZmljaWVuY3k7XG4gICAgZWxzZSBkZWxldGUgc2sucHJvZmljaWVuY3k7XG5cbiAgICBpZiAobm9ybWFsaXplZFN1YnNraWxscy5sZW5ndGggPiAwKSBzay5zdWJza2lsbHMgPSBub3JtYWxpemVkU3Vic2tpbGxzO1xuICAgIGVsc2UgZGVsZXRlIHNrLnN1YnNraWxscztcblxuICAgIGlmIChub3JtYWxpemVkUGFyZW50aGV0aWNhbCkgc2sucGFyZW50aGV0aWNhbCA9IG5vcm1hbGl6ZWRQYXJlbnRoZXRpY2FsO1xuICAgIGVsc2UgZGVsZXRlIHNrLnBhcmVudGhldGljYWw7XG4gIH1cblxuICBjb25zdCBwYXlsb2FkID0ge1xuICAgIHNraWxsOiBub3JtYWxpemVkU2tpbGwsXG4gICAgcHJvZmljaWVuY3k6IG5vcm1hbGl6ZWRQcm9maWNpZW5jeSxcbiAgICBzdWJza2lsbHM6IG5vcm1hbGl6ZWRTdWJza2lsbHMsXG4gICAgcGFyZW50aGV0aWNhbDogbm9ybWFsaXplZFBhcmVudGhldGljYWwsXG4gIH07XG4gIGlmICgnc2tpbGxfdHlwZScgaW4gKHF1YWxpZmllcnMgfHwge30pKSB7XG4gICAgcGF5bG9hZC5za2lsbF90eXBlID0gbm9ybWFsaXplZFNraWxsVHlwZTtcbiAgfVxuXG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvcmV2aWV3LXNraWxsLXF1YWxpZmllcnMnLCB7XG4gICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkocGF5bG9hZCksXG4gIH0pO1xuXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICBjb25zdCBlcnJvciA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3IuZXJyb3IgfHwgJ0ZhaWxlZCB0byBzYXZlIHNraWxsIHF1YWxpZmllcnMnKTtcbiAgfVxuXG4gIHJldHVybiByZXNwb25zZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZVVzZXJDcmVhdGVkU2tpbGwoc2tpbGwpIHtcbiAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICBuYW1lOiBTdHJpbmcoc2tpbGw/Lm5hbWUgfHwgJycpLnRyaW0oKSxcbiAgICBjYXRlZ29yeTogU3RyaW5nKHNraWxsPy5jYXRlZ29yeSB8fCAnJykudHJpbSgpLFxuICAgIGdyb3VwOiBTdHJpbmcoc2tpbGw/Lmdyb3VwIHx8ICcnKS50cmltKCksXG4gICAgcHJvZmljaWVuY3k6IFN0cmluZyhza2lsbD8ucHJvZmljaWVuY3kgfHwgJycpLnRyaW0oKSxcbiAgICBzdWJza2lsbHM6IF9ub3JtYWxpemVTa2lsbFN1YnNraWxscyhza2lsbD8uc3Vic2tpbGxzKSxcbiAgICBwYXJlbnRoZXRpY2FsOiBTdHJpbmcoc2tpbGw/LnBhcmVudGhldGljYWwgfHwgJycpLnRyaW0oKSxcbiAgfTtcbiAgaWYgKCFwYXlsb2FkLm5hbWUpIHRocm93IG5ldyBFcnJvcignU2tpbGwgbmFtZSBpcyByZXF1aXJlZCcpO1xuXG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvcmV2aWV3LXNraWxsLWFkZCcsIHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeShwYXlsb2FkKSxcbiAgfSk7XG5cbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIGNvbnN0IGVycm9yID0gYXdhaXQgcmVzcG9uc2UuanNvbigpLmNhdGNoKCgpID0+ICh7fSkpO1xuICAgIHRocm93IG5ldyBFcnJvcihlcnJvci5lcnJvciB8fCAnRmFpbGVkIHRvIGFkZCBza2lsbCcpO1xuICB9XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICBjb25zdCBub3JtYWxpemVkID0gX25vcm1hbGl6ZUV4dHJhU2tpbGxFbnRyeShyZXN1bHQuc2tpbGwsIHsgdXNlckNyZWF0ZWQ6IHRydWUgfSk7XG4gIGlmICghbm9ybWFsaXplZCkgdGhyb3cgbmV3IEVycm9yKCdTZXJ2ZXIgZGlkIG5vdCByZXR1cm4gYSBza2lsbCcpO1xuXG4gIGNvbnN0IGN1cnJlbnQgPSBBcnJheS5pc0FycmF5KHdpbmRvdy5fc2tpbGxzT3JkZXJlZCkgPyB3aW5kb3cuX3NraWxsc09yZGVyZWQgOiBbXTtcbiAgd2luZG93Ll9za2lsbHNPcmRlcmVkID0gW25vcm1hbGl6ZWQsIC4uLmN1cnJlbnQuZmlsdGVyKHNraWxsID0+IF9za2lsbE5hbWUoc2tpbGwpICE9PSBub3JtYWxpemVkLm5hbWUpXTtcblxuICB3aW5kb3cuX3NhdmVkRGVjaXNpb25zID0gd2luZG93Ll9zYXZlZERlY2lzaW9ucyB8fCB7fTtcbiAgY29uc3QgZXhpc3RpbmdFeHRyYXMgPSBBcnJheS5pc0FycmF5KHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMuZXh0cmFfc2tpbGxzKVxuICAgID8gd2luZG93Ll9zYXZlZERlY2lzaW9ucy5leHRyYV9za2lsbHNcbiAgICA6IFtdO1xuICB3aW5kb3cuX3NhdmVkRGVjaXNpb25zLmV4dHJhX3NraWxscyA9IFtcbiAgICBub3JtYWxpemVkLFxuICAgIC4uLmV4aXN0aW5nRXh0cmFzLmZpbHRlcihza2lsbCA9PiBfc2tpbGxOYW1lKHNraWxsKSAhPT0gbm9ybWFsaXplZC5uYW1lKSxcbiAgXTtcblxuICB1c2VyU2VsZWN0aW9ucy5za2lsbHNbbm9ybWFsaXplZC5uYW1lXSA9IHVzZXJTZWxlY3Rpb25zLnNraWxsc1tub3JtYWxpemVkLm5hbWVdIHx8ICdpbmNsdWRlJztcbiAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG59XG5cbmZ1bmN0aW9uIF9lZmZlY3RpdmVTa2lsbENhdGVnb3J5KHNraWxsKSB7XG4gIGlmICghc2tpbGwgfHwgdHlwZW9mIHNraWxsID09PSAnc3RyaW5nJykgcmV0dXJuICcnO1xuICByZXR1cm4gU3RyaW5nKHNraWxsLmNhdGVnb3J5IHx8ICcnKS50cmltKCkgfHwgJ0dlbmVyYWwnO1xufVxuXG5mdW5jdGlvbiBfc3luY1NraWxsQ2F0ZWdvcnlPcmRlcigpIHtcbiAgY29uc3Qgc2tpbGxzID0gQXJyYXkuaXNBcnJheSh3aW5kb3cuX3NraWxsc09yZGVyZWQpID8gd2luZG93Ll9za2lsbHNPcmRlcmVkIDogW107XG4gIGNvbnN0IG9yZGVyZWQgPSBbXTtcbiAgZm9yIChjb25zdCBza2lsbCBvZiBza2lsbHMpIHtcbiAgICBjb25zdCBjYXRlZ29yeSA9IF9lZmZlY3RpdmVTa2lsbENhdGVnb3J5KHNraWxsKTtcbiAgICBpZiAoY2F0ZWdvcnkgJiYgIW9yZGVyZWQuaW5jbHVkZXMoY2F0ZWdvcnkpKSBvcmRlcmVkLnB1c2goY2F0ZWdvcnkpO1xuICB9XG4gIHdpbmRvdy5fc2tpbGxDYXRlZ29yeU9yZGVyID0gb3JkZXJlZDtcbiAgcmV0dXJuIG9yZGVyZWQ7XG59XG5cbmZ1bmN0aW9uIF9yZW5hbWVTa2lsbENhdGVnb3J5TG9jYWxseShvbGRDYXRlZ29yeSwgbmV3Q2F0ZWdvcnkpIHtcbiAgY29uc3Qgbm9ybWFsaXplZE9sZCA9IFN0cmluZyhvbGRDYXRlZ29yeSB8fCAnJykudHJpbSgpO1xuICBjb25zdCBub3JtYWxpemVkTmV3ID0gU3RyaW5nKG5ld0NhdGVnb3J5IHx8ICcnKS50cmltKCk7XG4gIGlmICghbm9ybWFsaXplZE9sZCB8fCAhbm9ybWFsaXplZE5ldykgcmV0dXJuO1xuXG4gIGZvciAoY29uc3Qgc2tpbGwgb2YgKHdpbmRvdy5fc2tpbGxzT3JkZXJlZCB8fCBbXSkpIHtcbiAgICBpZiAoIXNraWxsIHx8IHR5cGVvZiBza2lsbCAhPT0gJ29iamVjdCcpIGNvbnRpbnVlO1xuICAgIGlmIChfZWZmZWN0aXZlU2tpbGxDYXRlZ29yeShza2lsbCkgPT09IG5vcm1hbGl6ZWRPbGQpIHtcbiAgICAgIHNraWxsLmNhdGVnb3J5ID0gbm9ybWFsaXplZE5ldztcbiAgICB9XG4gIH1cblxuICBjb25zdCBjdXJyZW50T3JkZXIgPSBBcnJheS5pc0FycmF5KHdpbmRvdy5fc2tpbGxDYXRlZ29yeU9yZGVyKVxuICAgID8gd2luZG93Ll9za2lsbENhdGVnb3J5T3JkZXJcbiAgICA6IF9zeW5jU2tpbGxDYXRlZ29yeU9yZGVyKCk7XG4gIHdpbmRvdy5fc2tpbGxDYXRlZ29yeU9yZGVyID0gY3VycmVudE9yZGVyLm1hcChjYXRlZ29yeSA9PiAoXG4gICAgY2F0ZWdvcnkgPT09IG5vcm1hbGl6ZWRPbGQgPyBub3JtYWxpemVkTmV3IDogY2F0ZWdvcnlcbiAgKSkuZmlsdGVyKChjYXRlZ29yeSwgaW5kZXgsIGFycikgPT4gY2F0ZWdvcnkgJiYgYXJyLmluZGV4T2YoY2F0ZWdvcnkpID09PSBpbmRleCk7XG59XG5cbmZ1bmN0aW9uIF9tb3ZlU2tpbGxDYXRlZ29yeUxvY2FsbHkoY2F0ZWdvcnlOYW1lLCBkaXJlY3Rpb24pIHtcbiAgY29uc3Qgbm9ybWFsaXplZENhdGVnb3J5ID0gU3RyaW5nKGNhdGVnb3J5TmFtZSB8fCAnJykudHJpbSgpO1xuICBjb25zdCBvcmRlciA9IEFycmF5LmlzQXJyYXkod2luZG93Ll9za2lsbENhdGVnb3J5T3JkZXIpXG4gICAgPyBbLi4ud2luZG93Ll9za2lsbENhdGVnb3J5T3JkZXJdXG4gICAgOiBfc3luY1NraWxsQ2F0ZWdvcnlPcmRlcigpO1xuICBjb25zdCBpbmRleCA9IG9yZGVyLmluZGV4T2Yobm9ybWFsaXplZENhdGVnb3J5KTtcbiAgaWYgKGluZGV4IDwgMCkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IG5leHRJbmRleCA9IGluZGV4ICsgZGlyZWN0aW9uO1xuICBpZiAobmV4dEluZGV4IDwgMCB8fCBuZXh0SW5kZXggPj0gb3JkZXIubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgW29yZGVyW2luZGV4XSwgb3JkZXJbbmV4dEluZGV4XV0gPSBbb3JkZXJbbmV4dEluZGV4XSwgb3JkZXJbaW5kZXhdXTtcbiAgd2luZG93Ll9za2lsbENhdGVnb3J5T3JkZXIgPSBvcmRlcjtcbiAgcmV0dXJuIG9yZGVyO1xufVxuXG5mdW5jdGlvbiBfYnVpbGRTa2lsbENhdGVnb3J5TWFuYWdlckh0bWwoKSB7XG4gIGNvbnN0IGNhdGVnb3JpZXMgPSBBcnJheS5pc0FycmF5KHdpbmRvdy5fc2tpbGxDYXRlZ29yeU9yZGVyKVxuICAgID8gd2luZG93Ll9za2lsbENhdGVnb3J5T3JkZXJcbiAgICA6IF9zeW5jU2tpbGxDYXRlZ29yeU9yZGVyKCk7XG4gIGlmIChjYXRlZ29yaWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuICcnO1xuXG4gIHJldHVybiBgXG4gICAgPGRpdiBjbGFzcz1cInNraWxsLWNhdGVnb3J5LW1hbmFnZXJcIiBzdHlsZT1cIm1hcmdpbjowIDAgMTJweDtwYWRkaW5nOjEycHg7Ym9yZGVyOjFweCBzb2xpZCAjZTVlN2ViO2JvcmRlci1yYWRpdXM6MTBweDtiYWNrZ3JvdW5kOiNmOGZhZmM7XCI+XG4gICAgICA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206OHB4O1wiPkNhdGVnb3J5IExheW91dDwvZGl2PlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Z2FwOjhweDtcIj5cbiAgICAgICAgJHtjYXRlZ29yaWVzLm1hcCgoY2F0ZWdvcnksIGluZGV4KSA9PiBgXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNraWxsLWNhdGVnb3J5LW1hbmFnZXItcm93XCIgZGF0YS1jYXRlZ29yeT1cIiR7ZXNjYXBlSHRtbChjYXRlZ29yeSl9XCIgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjhweDthbGlnbi1pdGVtczpjZW50ZXI7XCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICBjbGFzcz1cInNraWxsLWNhdGVnb3J5LW1hbmFnZXItaW5wdXRcIlxuICAgICAgICAgICAgICB2YWx1ZT1cIiR7ZXNjYXBlSHRtbChjYXRlZ29yeSl9XCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlJlbmFtZSBza2lsbCBjYXRlZ29yeSAke2VzY2FwZUh0bWwoY2F0ZWdvcnkpfVwiXG4gICAgICAgICAgICAgIHN0eWxlPVwiZmxleDoxO21pbi13aWR0aDowO3BhZGRpbmc6NnB4IDhweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo2cHg7XCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBkYXRhLWFjdGlvbj1cImNhdGVnb3J5LXVwXCIgZGF0YS1jYXRlZ29yeT1cIiR7ZXNjYXBlSHRtbChjYXRlZ29yeSl9XCIgYXJpYS1sYWJlbD1cIk1vdmUgJHtlc2NhcGVIdG1sKGNhdGVnb3J5KX0gY2F0ZWdvcnkgdXBcIiB0aXRsZT1cIk1vdmUgY2F0ZWdvcnkgdXBcIiAke2luZGV4ID09PSAwID8gJ2Rpc2FibGVkJyA6ICcnfT5cdTIxOTE8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIGRhdGEtYWN0aW9uPVwiY2F0ZWdvcnktZG93blwiIGRhdGEtY2F0ZWdvcnk9XCIke2VzY2FwZUh0bWwoY2F0ZWdvcnkpfVwiIGFyaWEtbGFiZWw9XCJNb3ZlICR7ZXNjYXBlSHRtbChjYXRlZ29yeSl9IGNhdGVnb3J5IGRvd25cIiB0aXRsZT1cIk1vdmUgY2F0ZWdvcnkgZG93blwiICR7aW5kZXggPT09IGNhdGVnb3JpZXMubGVuZ3RoIC0gMSA/ICdkaXNhYmxlZCcgOiAnJ30+XHUyMTkzPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIGApLmpvaW4oJycpfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGA7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBSZXJ1biBzbmFwc2hvdCAoY2hhbmdlIGJhZGdlIGZvciBza2lsbHMpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuZnVuY3Rpb24gX3NraWxsU25hcHNob3RLZXkoKSB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2lkID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKS5nZXQoJ3Nlc3Npb24nKTtcbiAgICByZXR1cm4gc2lkID8gYHNraWxsX3NuYXBfJHtzaWR9YCA6IG51bGw7XG4gIH0gY2F0Y2ggKF8pIHsgcmV0dXJuIG51bGw7IH1cbn1cbmZ1bmN0aW9uIF9zYXZlU2tpbGxTbmFwc2hvdChyZWNvbW1lbmRlZE5hbWVzKSB7XG4gIGNvbnN0IGtleSA9IF9za2lsbFNuYXBzaG90S2V5KCk7XG4gIGlmICgha2V5KSByZXR1cm47XG4gIHRyeSB7IGxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgSlNPTi5zdHJpbmdpZnkoWy4uLnJlY29tbWVuZGVkTmFtZXNdKSk7IH0gY2F0Y2ggKF8pIHt9XG59XG5mdW5jdGlvbiBfZ2V0U2tpbGxTbmFwc2hvdCgpIHtcbiAgY29uc3Qga2V5ID0gX3NraWxsU25hcHNob3RLZXkoKTtcbiAgaWYgKCFrZXkpIHJldHVybiBudWxsO1xuICB0cnkge1xuICAgIGNvbnN0IHJhdyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7XG4gICAgcmV0dXJuIHJhdyA/IG5ldyBTZXQoSlNPTi5wYXJzZShyYXcpKSA6IG51bGw7XG4gIH0gY2F0Y2ggKF8pIHsgcmV0dXJuIG51bGw7IH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIEJ1aWxkIHJldmlldyB0YWJsZSAoZmV0Y2ggKyBpbml0aWFsaXNlKSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gYnVpbGRTa2lsbHNSZXZpZXdUYWJsZSgpIHtcbiAgY29uc3QgZGF0YSA9IHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zO1xuICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGxzLXRhYmxlLWNvbnRhaW5lcicpO1xuXG4gIC8vIEJ1aWxkIHNraWxsLXR5cGUgbG9va3VwIGZyb20gam9iIGFuYWx5c2lzIChhdmFpbGFibGUgaW4gdGFiRGF0YS5hbmFseXNpcylcbiAgY29uc3Qgam9iQW5hbHlzaXMgPSBzdGF0ZU1hbmFnZXIuZ2V0VGFiRGF0YSgnYW5hbHlzaXMnKSB8fCB7fTtcbiAgY29uc3QgaGFyZFNraWxsU2V0ID0gbmV3IFNldCgoam9iQW5hbHlzaXMucmVxdWlyZWRfc2tpbGxzICAgIHx8IFtdKS5tYXAocyA9PiBzLnRvTG93ZXJDYXNlKCkpKTtcbiAgY29uc3Qgc29mdFNraWxsU2V0ID0gbmV3IFNldCgoam9iQW5hbHlzaXMubmljZV90b19oYXZlX3NraWxscyB8fCBbXSkubWFwKHMgPT4gcy50b0xvd2VyQ2FzZSgpKSk7XG5cbiAgLy8gR2V0IGFsbCBza2lsbHMgZnJvbSB0aGUgQVBJIHN0YXR1c1xuICBsZXQgYWxsU2tpbGxzID0gW107XG4gIGxldCBwZXJzaXN0ZWRFeHRyYVNraWxscyA9IFtdO1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXR1c1JlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3N0YXR1cycpO1xuICAgIGNvbnN0IHN0YXR1c0RhdGEgPSBwYXJzZVN0YXR1c1Jlc3BvbnNlKGF3YWl0IHN0YXR1c1Jlcy5qc29uKCkpO1xuICAgIGFsbFNraWxscyA9IHN0YXR1c0RhdGEuYWxsX3NraWxscyB8fCBbXTtcbiAgICBwZXJzaXN0ZWRFeHRyYVNraWxscyA9IHN0YXR1c0RhdGEuZXh0cmFfc2tpbGxzIHx8IFtdO1xuICAgIHdpbmRvdy5fYWxsRXhwZXJpZW5jZXMgPSBzdGF0dXNEYXRhLmFsbF9leHBlcmllbmNlcyB8fCBbXTtcbiAgICBjb25zdCBxdWFsT3ZlcnJpZGVzID0gc3RhdHVzRGF0YS5za2lsbF9xdWFsaWZpZXJfb3ZlcnJpZGVzIHx8IHt9O1xuICAgIHdpbmRvdy5fc2tpbGxUeXBlT3ZlcnJpZGVzID0gd2luZG93Ll9za2lsbFR5cGVPdmVycmlkZXMgfHwge307XG4gICAgZm9yIChjb25zdCBbc2tpbGxOYW1lLCBvdmVycmlkZXNdIG9mIE9iamVjdC5lbnRyaWVzKHF1YWxPdmVycmlkZXMpKSB7XG4gICAgICBpZiAob3ZlcnJpZGVzICYmIG92ZXJyaWRlcy5za2lsbF90eXBlKSB7XG4gICAgICAgIHdpbmRvdy5fc2tpbGxUeXBlT3ZlcnJpZGVzW3NraWxsTmFtZS50b0xvd2VyQ2FzZSgpXSA9IG92ZXJyaWRlcy5za2lsbF90eXBlO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cuZXJyb3IoJ0Vycm9yIGZldGNoaW5nIGFsbCBza2lsbHM6JywgZXJyb3IpO1xuICAgIC8vIEZhbGxiYWNrIHRvIGp1c3QgcmVjb21tZW5kZWQgc2tpbGxzXG4gICAgYWxsU2tpbGxzID0gZGF0YS5yZWNvbW1lbmRlZF9za2lsbHMgfHwgW107XG4gICAgd2luZG93Ll9hbGxFeHBlcmllbmNlcyA9IFtdO1xuICB9XG5cbiAgY29uc3Qgbm9ybWFsaXplZFBlcnNpc3RlZEV4dHJhU2tpbGxzID0gKHBlcnNpc3RlZEV4dHJhU2tpbGxzIHx8IFtdKVxuICAgIC5tYXAoc2tpbGwgPT4gX25vcm1hbGl6ZUV4dHJhU2tpbGxFbnRyeShza2lsbCwge1xuICAgICAgdXNlckNyZWF0ZWQ6IHR5cGVvZiBza2lsbCA9PT0gJ29iamVjdCcgJiYgISFza2lsbD8udXNlcl9jcmVhdGVkLFxuICAgIH0pKVxuICAgIC5maWx0ZXIoQm9vbGVhbik7XG4gIGlmIChub3JtYWxpemVkUGVyc2lzdGVkRXh0cmFTa2lsbHMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IG1lcmdlZFNraWxscyA9IFtdO1xuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0KCk7XG4gICAgbm9ybWFsaXplZFBlcnNpc3RlZEV4dHJhU2tpbGxzLmZvckVhY2goc2tpbGwgPT4ge1xuICAgICAgaWYgKHNlZW4uaGFzKHNraWxsLm5hbWUpKSByZXR1cm47XG4gICAgICBtZXJnZWRTa2lsbHMucHVzaChza2lsbCk7XG4gICAgICBzZWVuLmFkZChza2lsbC5uYW1lKTtcbiAgICB9KTtcbiAgICBhbGxTa2lsbHMuZm9yRWFjaChza2lsbCA9PiB7XG4gICAgICBjb25zdCBza2lsbE5hbWUgPSBfc2tpbGxOYW1lKHNraWxsKTtcbiAgICAgIGlmICghc2tpbGxOYW1lIHx8IHNlZW4uaGFzKHNraWxsTmFtZSkpIHJldHVybjtcbiAgICAgIG1lcmdlZFNraWxscy5wdXNoKHNraWxsKTtcbiAgICAgIHNlZW4uYWRkKHNraWxsTmFtZSk7XG4gICAgfSk7XG4gICAgYWxsU2tpbGxzID0gbWVyZ2VkU2tpbGxzO1xuICB9XG5cbiAgLy8gRGV0ZWN0IHNraWxscyByZWNvbW1lbmRlZCBieSBMTE0gdGhhdCBhcmVuJ3QgaW4gbWFzdGVyIENWIGFuZCBwcmVwZW5kIHRoZW1cbiAgY29uc3QgbWFzdGVyU2tpbGxOYW1lcyA9IG5ldyBTZXQoYWxsU2tpbGxzLm1hcChza2lsbCA9PiBfc2tpbGxOYW1lKHNraWxsKSkpO1xuICBjb25zdCBuZXdTa2lsbHMgPSAoZGF0YS5yZWNvbW1lbmRlZF9za2lsbHMgfHwgW10pLmZpbHRlcihzID0+ICFtYXN0ZXJTa2lsbE5hbWVzLmhhcyhzKSk7XG4gIHdpbmRvdy5fbmV3U2tpbGxzRnJvbUxMTSA9IG5ld1NraWxscztcbiAgaWYgKG5ld1NraWxscy5sZW5ndGggPiAwKSB7XG4gICAgYWxsU2tpbGxzID0gWy4uLm5ld1NraWxscy5tYXAocyA9PiAoeyBuYW1lOiBzLCBfaXNOZXc6IHRydWUgfSkpLCAuLi5hbGxTa2lsbHNdO1xuICB9XG5cbiAgaWYgKGFsbFNraWxscy5sZW5ndGggPT09IDApIHtcbiAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJzxwIHN0eWxlPVwicGFkZGluZzoyMHB4O3RleHQtYWxpZ246Y2VudGVyO2NvbG9yOiM2YjcyODA7XCI+Tm8gc2tpbGxzIGZvdW5kIGluIG1hc3RlciBDViBkYXRhLjwvcD4nO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIE9uIGZpcnN0IGxvYWQ6IHNvcnQgYnkgcmVjb21tZW5kYXRpb247IHByZXNlcnZlIHVzZXIgb3JkZXIgb24gcmUtcmVuZGVyXG4gIGlmICghd2luZG93Ll9za2lsbHNPcmRlcmVkKSB7XG4gICAgY29uc3QgcmVjb21tZW5kYXRpb25PcmRlciA9IHsgJ0VtcGhhc2l6ZSc6IDAsICdJbmNsdWRlJzogMSwgJ0RlLWVtcGhhc2l6ZSc6IDIsICdPbWl0JzogMyB9O1xuICAgIGNvbnN0IG1hc3RlclNraWxscyAgPSBhbGxTa2lsbHMuZmlsdGVyKHMgPT4gIXMuX2lzTmV3KTtcblxuICAgIC8vIFJvbGUtYXdhcmUgY2F0ZWdvcnkgc2NvcmluZzogY2F0ZWdvcmllcyB3aXRoIG1vcmUgcmVxdWlyZWQvbmljZS10by1oYXZlIGpvYiBza2lsbHMgcmFuayBoaWdoZXJcbiAgICBjb25zdCBjYXRlZ29yeVNjb3JlcyA9IHt9O1xuICAgIGZvciAoY29uc3Qgc2tpbGwgb2YgbWFzdGVyU2tpbGxzKSB7XG4gICAgICBjb25zdCBjYXQgID0gdHlwZW9mIHNraWxsID09PSAnb2JqZWN0JyA/IChza2lsbC5jYXRlZ29yeSB8fCAnJykgOiAnJztcbiAgICAgIGNvbnN0IG5hbWUgPSAodHlwZW9mIHNraWxsID09PSAnc3RyaW5nJyA/IHNraWxsIDogc2tpbGwubmFtZSB8fCBza2lsbCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmIChjYXQpIHtcbiAgICAgICAgY2F0ZWdvcnlTY29yZXNbY2F0XSA9IChjYXRlZ29yeVNjb3Jlc1tjYXRdIHx8IDApXG4gICAgICAgICAgKyAoaGFyZFNraWxsU2V0LmhhcyhuYW1lKSA/IDIgOiBzb2Z0U2tpbGxTZXQuaGFzKG5hbWUpID8gMSA6IDApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHNvcnRlZE1hc3RlciAgPSBtYXN0ZXJTa2lsbHMuc2xpY2UoKS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBjb25zdCBhTmFtZSAgPSB0eXBlb2YgYSA9PT0gJ3N0cmluZycgPyBhIDogYS5uYW1lIHx8IGE7XG4gICAgICBjb25zdCBiTmFtZSAgPSB0eXBlb2YgYiA9PT0gJ3N0cmluZycgPyBiIDogYi5uYW1lIHx8IGI7XG4gICAgICBjb25zdCBhUmVjICAgPSByZWNvbW1lbmRhdGlvbk9yZGVyW2dldFNraWxsUmVjb21tZW5kYXRpb24oYU5hbWUsIGRhdGEpXSA/PyAzO1xuICAgICAgY29uc3QgYlJlYyAgID0gcmVjb21tZW5kYXRpb25PcmRlcltnZXRTa2lsbFJlY29tbWVuZGF0aW9uKGJOYW1lLCBkYXRhKV0gPz8gMztcbiAgICAgIGlmIChhUmVjICE9PSBiUmVjKSByZXR1cm4gYVJlYyAtIGJSZWM7XG4gICAgICAvLyBXaXRoaW4gdGhlIHNhbWUgcmVjb21tZW5kYXRpb24gdGllciwgc3VyZmFjZSByb2xlLXJlbGV2YW50IGNhdGVnb3JpZXMgZmlyc3RcbiAgICAgIGNvbnN0IGFDYXQgICA9IHR5cGVvZiBhID09PSAnb2JqZWN0JyA/IChhLmNhdGVnb3J5IHx8ICcnKSA6ICcnO1xuICAgICAgY29uc3QgYkNhdCAgID0gdHlwZW9mIGIgPT09ICdvYmplY3QnID8gKGIuY2F0ZWdvcnkgfHwgJycpIDogJyc7XG4gICAgICByZXR1cm4gKGNhdGVnb3J5U2NvcmVzW2JDYXRdIHx8IDApIC0gKGNhdGVnb3J5U2NvcmVzW2FDYXRdIHx8IDApO1xuICAgIH0pO1xuICAgIHdpbmRvdy5fc2tpbGxzT3JkZXJlZCA9IFsuLi5hbGxTa2lsbHMuZmlsdGVyKHMgPT4gcy5faXNOZXcpLCAuLi5zb3J0ZWRNYXN0ZXJdO1xuXG4gICAgLy8gQXBwbHkgam9iLWFuYWx5c2lzLWRlcml2ZWQgY2F0ZWdvcnkgb3JkZXIgZnJvbSBiYWNrZW5kIChHQVAtODYpXG4gICAgY29uc3QgYmFja2VuZE9yZGVyID0gKHN0YXRlTWFuYWdlci5nZXRUYWJEYXRhKCdjdXN0b21pemF0aW9ucycpIHx8IHt9KS5za2lsbF9jYXRlZ29yeV9vcmRlcjtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShiYWNrZW5kT3JkZXIpICYmIGJhY2tlbmRPcmRlci5sZW5ndGggPiAwKSB7XG4gICAgICB3aW5kb3cuX3NraWxsQ2F0ZWdvcnlPcmRlciA9IGJhY2tlbmRPcmRlcjtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc3Qga25vd25OYW1lcyA9IG5ldyBTZXQod2luZG93Ll9za2lsbHNPcmRlcmVkLm1hcChzID0+ICh0eXBlb2YgcyA9PT0gJ3N0cmluZycgPyBzIDogcy5uYW1lIHx8IHMpKSk7XG4gICAgZm9yIChjb25zdCBzayBvZiBhbGxTa2lsbHMpIHtcbiAgICAgIGNvbnN0IG5tID0gdHlwZW9mIHNrID09PSAnc3RyaW5nJyA/IHNrIDogc2submFtZSB8fCBzaztcbiAgICAgIGlmICgha25vd25OYW1lcy5oYXMobm0pKSB3aW5kb3cuX3NraWxsc09yZGVyZWQucHVzaChzayk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcmVjb21tZW5kZWRTZXQgPSBuZXcgU2V0KGRhdGEucmVjb21tZW5kZWRfc2tpbGxzIHx8IFtdKTtcblxuICAvLyBDb21wdXRlIHdoaWNoIHJlY29tbWVuZGF0aW9ucyBhcmUgbmV3IHNpbmNlIGxhc3QgcmVuZGVyIChyZXJ1biBjaGFuZ2UgYmFkZ2VzKVxuICBjb25zdCBwcmV2U2tpbGxTbmFwID0gX2dldFNraWxsU25hcHNob3QoKTtcbiAgY29uc3QgbmV3UmVjb21tZW5kZWRTa2lsbHMgPSBwcmV2U2tpbGxTbmFwXG4gICAgPyBuZXcgU2V0KFsuLi5yZWNvbW1lbmRlZFNldF0uZmlsdGVyKG5hbWUgPT4gIXByZXZTa2lsbFNuYXAuaGFzKG5hbWUpKSlcbiAgICA6IG5ldyBTZXQoKTtcbiAgX3NhdmVTa2lsbFNuYXBzaG90KHJlY29tbWVuZGVkU2V0KTtcblxuICAvLyBJbml0aWFsaXNlIHNhdmVkIGRlY2lzaW9uc1xuICBjb25zdCBzYXZlZFNraWxsRGVjcyA9IHdpbmRvdy5fc2F2ZWREZWNpc2lvbnM/LnNraWxsX2RlY2lzaW9ucyB8fCB7fTtcbiAgZm9yIChjb25zdCBza2lsbCBvZiB3aW5kb3cuX3NraWxsc09yZGVyZWQpIHtcbiAgICBjb25zdCBza2lsbE5hbWUgICAgID0gdHlwZW9mIHNraWxsID09PSAnc3RyaW5nJyA/IHNraWxsIDogc2tpbGwubmFtZSB8fCBza2lsbDtcbiAgICBjb25zdCBpc05ldyAgICAgICAgID0gKHNraWxsLl9pc05ldyA9PT0gdHJ1ZSk7XG4gICAgY29uc3QgaXNSZWNvbW1lbmRlZCA9IHJlY29tbWVuZGVkU2V0Lmhhcyhza2lsbE5hbWUpO1xuICAgIGNvbnN0IHJlY29tbWVuZGF0aW9uID0gZ2V0U2tpbGxSZWNvbW1lbmRhdGlvbihza2lsbE5hbWUsIGRhdGEpO1xuICAgIGxldCBkZWZhdWx0QWN0aW9uID0gJ2V4Y2x1ZGUnO1xuICAgIGlmICAgICAgKHJlY29tbWVuZGF0aW9uID09PSAnRW1waGFzaXplJykgICAgZGVmYXVsdEFjdGlvbiA9ICdlbXBoYXNpemUnO1xuICAgIGVsc2UgaWYgKHJlY29tbWVuZGF0aW9uID09PSAnSW5jbHVkZScpICAgICAgZGVmYXVsdEFjdGlvbiA9ICdpbmNsdWRlJztcbiAgICBlbHNlIGlmIChyZWNvbW1lbmRhdGlvbiA9PT0gJ0RlLWVtcGhhc2l6ZScpIGRlZmF1bHRBY3Rpb24gPSAnZGUtZW1waGFzaXplJztcbiAgICBlbHNlIGlmIChyZWNvbW1lbmRhdGlvbiA9PT0gJ09taXQnKSAgICAgICAgIGRlZmF1bHRBY3Rpb24gPSAnZXhjbHVkZSc7XG4gICAgZWxzZSBpZiAoaXNSZWNvbW1lbmRlZCB8fCBpc05ldykgICAgICAgICAgICBkZWZhdWx0QWN0aW9uID0gJ2luY2x1ZGUnO1xuICAgIHVzZXJTZWxlY3Rpb25zLnNraWxsc1tza2lsbE5hbWVdID0gc2F2ZWRTa2lsbERlY3Nbc2tpbGxOYW1lXSB8fCBkZWZhdWx0QWN0aW9uO1xuICB9XG5cbiAgX3JlbmRlclNraWxsc1RhYmxlKGNvbnRhaW5lciwgcmVjb21tZW5kZWRTZXQsIGRhdGEsIGhhcmRTa2lsbFNldCwgc29mdFNraWxsU2V0LCBuZXdSZWNvbW1lbmRlZFNraWxscyk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBSZW5kZXIgdGFibGUgSFRNTCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gX3JlbmRlclNraWxsc1RhYmxlKGNvbnRhaW5lciwgcmVjb21tZW5kZWRTZXQsIGRhdGEsIGhhcmRTa2lsbFNldCwgc29mdFNraWxsU2V0LCBuZXdSZWNvbW1lbmRlZFNraWxscyA9IG5ldyBTZXQoKSkge1xuICBpZiAoIWNvbnRhaW5lcikgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NraWxscy10YWJsZS1jb250YWluZXInKTtcbiAgaWYgKCFjb250YWluZXIpIHJldHVybjtcbiAgaWYgKCFyZWNvbW1lbmRlZFNldCkgcmVjb21tZW5kZWRTZXQgPSBuZXcgU2V0KCh3aW5kb3cucGVuZGluZ1JlY29tbWVuZGF0aW9ucz8ucmVjb21tZW5kZWRfc2tpbGxzKSB8fCBbXSk7XG4gIGlmICghZGF0YSkgZGF0YSA9IHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zO1xuICBpZiAoIWhhcmRTa2lsbFNldCkge1xuICAgIGNvbnN0IGphID0gc3RhdGVNYW5hZ2VyLmdldFRhYkRhdGEoJ2FuYWx5c2lzJykgfHwge307XG4gICAgaGFyZFNraWxsU2V0ID0gbmV3IFNldCgoamEucmVxdWlyZWRfc2tpbGxzICAgICB8fCBbXSkubWFwKHMgPT4gcy50b0xvd2VyQ2FzZSgpKSk7XG4gICAgc29mdFNraWxsU2V0ID0gbmV3IFNldCgoamEubmljZV90b19oYXZlX3NraWxscyB8fCBbXSkubWFwKHMgPT4gcy50b0xvd2VyQ2FzZSgpKSk7XG4gIH1cblxuICBpZiAoJC5mbi5EYXRhVGFibGUuaXNEYXRhVGFibGUoJyNza2lsbHMtcmV2aWV3LXRhYmxlJykpIHtcbiAgICAkKCcjc2tpbGxzLXJldmlldy10YWJsZScpLkRhdGFUYWJsZSgpLmRlc3Ryb3koKTtcbiAgfVxuXG4gIGNvbnN0IHNraWxscyA9IHdpbmRvdy5fc2tpbGxzT3JkZXJlZCB8fCBbXTtcbiAgY29uc3QgZ3JvdXBXYXJuaW5ncyA9IF9idWlsZEdyb3VwV2FybmluZ3Moc2tpbGxzKTtcbiAgY29uc3QgY2F0ZWdvcnlTdWdnZXN0aW9ucyA9IEFycmF5LmZyb20obmV3IFNldChcbiAgICBza2lsbHNcbiAgICAgIC5tYXAoc2tpbGwgPT4gKHR5cGVvZiBza2lsbCA9PT0gJ29iamVjdCcgJiYgc2tpbGwuY2F0ZWdvcnkgPyBTdHJpbmcoc2tpbGwuY2F0ZWdvcnkpLnRyaW0oKSA6ICcnKSlcbiAgICAgIC5maWx0ZXIoQm9vbGVhbiksXG4gICkpLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiBsZWZ0LmxvY2FsZUNvbXBhcmUocmlnaHQpKTtcbiAgX3N5bmNTa2lsbENhdGVnb3J5T3JkZXIoKTtcbiAgY29uc3QgY2F0ZWdvcnlMaXN0SWQgPSAnc2tpbGwtY2F0ZWdvcnktc3VnZ2VzdGlvbnMnO1xuICBsZXQgdGFibGVIVE1MID0gYFxuICAgIDxkaXYgY2xhc3M9XCJza2lsbC1hZGQtcGFuZWxcIiBzdHlsZT1cIm1hcmdpbjowIDAgMTJweDtwYWRkaW5nOjEycHg7Ym9yZGVyOjFweCBzb2xpZCAjZGJlYWZlO2JvcmRlci1yYWRpdXM6MTBweDtiYWNrZ3JvdW5kOiNlZmY2ZmY7XCI+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTJweDtmbGV4LXdyYXA6d3JhcDtcIj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6NjAwO1wiPlNlc3Npb24tT25seSBTa2lsbHM8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtjb2xvcjojNDc1NTY5O1wiPkFkZCBhIHNraWxsIGZvciB0aGlzIENWIHdpdGhvdXQgY2hhbmdpbmcgdGhlIG1hc3RlciBwcm9maWxlLjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidWxrLWJ0blwiIGlkPVwidG9nZ2xlLWFkZC1za2lsbC1mb3JtXCI+KyBBZGQgU2tpbGw8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGZvcm0gaWQ9XCJhZGQtc2tpbGwtZm9ybVwiIHN0eWxlPVwiZGlzcGxheTpub25lO21hcmdpbi10b3A6MTJweDtcIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6cmVwZWF0KGF1dG8tZml0LG1pbm1heCgxODBweCwxZnIpKTtnYXA6OHB4O1wiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG5hbWU9XCJuYW1lXCIgcGxhY2Vob2xkZXI9XCJTa2lsbCBuYW1lXCIgYXJpYS1sYWJlbD1cIk5ldyBza2lsbCBuYW1lXCIgc3R5bGU9XCJwYWRkaW5nOjZweCA4cHg7Ym9yZGVyOjFweCBzb2xpZCAjYmZkYmZlO2JvcmRlci1yYWRpdXM6NnB4O1wiIC8+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cImNhdGVnb3J5XCIgcGxhY2Vob2xkZXI9XCJDYXRlZ29yeVwiIGFyaWEtbGFiZWw9XCJOZXcgc2tpbGwgY2F0ZWdvcnlcIiBsaXN0PVwiJHtjYXRlZ29yeUxpc3RJZH1cIiBzdHlsZT1cInBhZGRpbmc6NnB4IDhweDtib3JkZXI6MXB4IHNvbGlkICNiZmRiZmU7Ym9yZGVyLXJhZGl1czo2cHg7XCIgLz5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBuYW1lPVwiZ3JvdXBcIiBwbGFjZWhvbGRlcj1cIkdyb3VwIGtleVwiIGFyaWEtbGFiZWw9XCJOZXcgc2tpbGwgZ3JvdXBcIiBzdHlsZT1cInBhZGRpbmc6NnB4IDhweDtib3JkZXI6MXB4IHNvbGlkICNiZmRiZmU7Ym9yZGVyLXJhZGl1czo2cHg7XCIgLz5cbiAgICAgICAgICA8c2VsZWN0IG5hbWU9XCJwcm9maWNpZW5jeVwiIGFyaWEtbGFiZWw9XCJOZXcgc2tpbGwgcHJvZmljaWVuY3lcIiBzdHlsZT1cInBhZGRpbmc6NnB4IDhweDtib3JkZXI6MXB4IHNvbGlkICNiZmRiZmU7Ym9yZGVyLXJhZGl1czo2cHg7XCI+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+Tm8gcHJvZmljaWVuY3kgbGFiZWw8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJiZWdpbm5lclwiPkJlZ2lubmVyPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiZmFtaWxpYXJcIj5GYW1pbGlhcjwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImludGVybWVkaWF0ZVwiPkludGVybWVkaWF0ZTwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImFkdmFuY2VkXCI+QWR2YW5jZWQ8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJleHBlcnRcIj5FeHBlcnQ8L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBuYW1lPVwic3Vic2tpbGxzXCIgcGxhY2Vob2xkZXI9XCJTdWItc2tpbGxzXCIgYXJpYS1sYWJlbD1cIk5ldyBza2lsbCBzdWItc2tpbGxzXCIgc3R5bGU9XCJwYWRkaW5nOjZweCA4cHg7Ym9yZGVyOjFweCBzb2xpZCAjYmZkYmZlO2JvcmRlci1yYWRpdXM6NnB4O1wiIC8+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cInBhcmVudGhldGljYWxcIiBwbGFjZWhvbGRlcj1cIlBhcmVudGhldGljYWwgbm90ZVwiIGFyaWEtbGFiZWw9XCJOZXcgc2tpbGwgcGFyZW50aGV0aWNhbFwiIHN0eWxlPVwicGFkZGluZzo2cHggOHB4O2JvcmRlcjoxcHggc29saWQgI2JmZGJmZTtib3JkZXItcmFkaXVzOjZweDtcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6OHB4O2p1c3RpZnktY29udGVudDpmbGV4LWVuZDttYXJnaW4tdG9wOjEwcHg7XCI+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidWxrLWJ0biBidWxrLWV4Y2x1ZGVcIiBpZD1cImNhbmNlbC1hZGQtc2tpbGxcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBjbGFzcz1cImJ1bGstYnRuIGJ1bGstaW5jbHVkZVwiPlNhdmUgU2tpbGw8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Zvcm0+XG4gICAgPC9kaXY+XG4gICAgJHtfYnVpbGRTa2lsbENhdGVnb3J5TWFuYWdlckh0bWwoKX1cbiAgICA8ZGF0YWxpc3QgaWQ9XCIke2NhdGVnb3J5TGlzdElkfVwiPlxuICAgICAgJHtjYXRlZ29yeVN1Z2dlc3Rpb25zLm1hcChjYXRlZ29yeSA9PiBgPG9wdGlvbiB2YWx1ZT1cIiR7ZXNjYXBlSHRtbChjYXRlZ29yeSl9XCI+PC9vcHRpb24+YCkuam9pbignJyl9XG4gICAgPC9kYXRhbGlzdD5cbiAgICA8dGFibGUgaWQ9XCJza2lsbHMtcmV2aWV3LXRhYmxlXCIgY2xhc3M9XCJyZXZpZXctdGFibGVcIj5cbiAgICAgIDx0aGVhZD5cbiAgICAgICAgPHRyPlxuICAgICAgICAgIDx0aD5Ta2lsbDwvdGg+XG4gICAgICAgICAgPHRoPkNhdGVnb3J5PC90aD5cbiAgICAgICAgICA8dGg+R3JvdXA8L3RoPlxuICAgICAgICAgIDx0aD5Qcm9maWNpZW5jeTwvdGg+XG4gICAgICAgICAgPHRoPlN1Yi1za2lsbHM8L3RoPlxuICAgICAgICAgIDx0aD5QYXJlbnRoZXRpY2FsPC90aD5cbiAgICAgICAgICA8dGg+UmVjb21tZW5kYXRpb248L3RoPlxuICAgICAgICAgIDx0aD5Db25maWRlbmNlPC90aD5cbiAgICAgICAgICA8dGg+UmVhc29uaW5nPC90aD5cbiAgICAgICAgICA8dGg+TWF0Y2hlZCBFeHBlcmllbmNlczwvdGg+XG4gICAgICAgICAgPHRoPllvdXIgU2VsZWN0aW9uPC90aD5cbiAgICAgICAgPC90cj5cbiAgICAgIDwvdGhlYWQ+XG4gICAgICA8dGJvZHk+XG4gIGA7XG5cbiAgY29uc3QgYWxsRXhwZXJpZW5jZXMgPSBBcnJheS5pc0FycmF5KHdpbmRvdy5fYWxsRXhwZXJpZW5jZXMpID8gd2luZG93Ll9hbGxFeHBlcmllbmNlcyA6IFtdO1xuICBjb25zdCBzYXZlZE1hdGNoZXMgPSAod2luZG93Ll9zYXZlZERlY2lzaW9ucyAmJiB3aW5kb3cuX3NhdmVkRGVjaXNpb25zLmV4dHJhX3NraWxsX21hdGNoZXMpIHx8IHt9O1xuXG4gIGNvbnN0IGRlcml2ZU1hdGNoZXMgPSAoc2tpbGxOYW1lKSA9PiB7XG4gICAgY29uc3QgbmVlZGxlID0gc2tpbGxOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgaWRzID0gW107XG4gICAgYWxsRXhwZXJpZW5jZXMuZm9yRWFjaCgoZXhwKSA9PiB7XG4gICAgICBpZiAoIWV4cCB8fCB0eXBlb2YgZXhwICE9PSAnb2JqZWN0JykgcmV0dXJuO1xuICAgICAgY29uc3QgYWNoID0gQXJyYXkuaXNBcnJheShleHAuYWNoaWV2ZW1lbnRzKSA/IGV4cC5hY2hpZXZlbWVudHMuam9pbignICcpIDogJyc7XG4gICAgICBjb25zdCBoYXlzdGFjayA9IFtleHAudGl0bGUgfHwgJycsIGV4cC5jb21wYW55IHx8ICcnLCBhY2hdLmpvaW4oJyAnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKGhheXN0YWNrLmluY2x1ZGVzKG5lZWRsZSkgJiYgZXhwLmlkKSBpZHMucHVzaChleHAuaWQpO1xuICAgIH0pO1xuICAgIHJldHVybiBpZHM7XG4gIH07XG5cbiAgc2tpbGxzLmZvckVhY2goKHNraWxsLCByb3dJZHgpID0+IHtcbiAgICBjb25zdCBza2lsbE5hbWUgICAgICAgICAgICA9IHR5cGVvZiBza2lsbCA9PT0gJ3N0cmluZycgPyBza2lsbCA6IHNraWxsLm5hbWUgfHwgc2tpbGw7XG4gICAgY29uc3QgaXNOZXcgICAgICAgICAgICAgICAgPSAoc2tpbGwuX2lzTmV3ID09PSB0cnVlKTtcbiAgICBjb25zdCBpc0NhbmRpZGF0ZVRvQ29uZmlybSA9IHR5cGVvZiBza2lsbCA9PT0gJ29iamVjdCcgJiYgc2tpbGwuY2FuZGlkYXRlX3RvX2NvbmZpcm0gPT09IHRydWU7XG4gICAgY29uc3QgaXNSZWNvbW1lbmRlZCAgICAgICAgPSByZWNvbW1lbmRlZFNldC5oYXMoc2tpbGxOYW1lKTtcbiAgICBjb25zdCByZWNvbW1lbmRhdGlvbiA9IGdldFNraWxsUmVjb21tZW5kYXRpb24oc2tpbGxOYW1lLCBkYXRhKTtcbiAgICBjb25zdCBjb25maWRlbmNlICAgICA9IGdldFNraWxsQ29uZmlkZW5jZShza2lsbE5hbWUsIGRhdGEpO1xuICAgIGNvbnN0IHJlYXNvbmluZyAgICAgID0gZ2V0U2tpbGxSZWFzb25pbmcoc2tpbGxOYW1lLCBkYXRhKTtcbiAgICBjb25zdCBza2lsbFJlYyAgICAgICA9IF9maW5kU2tpbGxSZWNvbW1lbmRhdGlvblJlY29yZChza2lsbE5hbWUsIGRhdGEpO1xuICAgIGNvbnN0IGdyb3VwaW5nU3VnZ2VzdGlvbiA9IF9idWlsZFNraWxsR3JvdXBpbmdTdWdnZXN0aW9uKHNraWxsUmVjLCBza2lsbCk7XG4gICAgY29uc3QgZGVmYXVsdEFjdGlvbiAgPSB1c2VyU2VsZWN0aW9ucy5za2lsbHNbc2tpbGxOYW1lXSB8fCAnaW5jbHVkZSc7XG4gICAgY29uc3QgaXNGaXJzdCAgICAgICAgPSByb3dJZHggPT09IDA7XG4gICAgY29uc3QgaXNMYXN0ICAgICAgICAgPSByb3dJZHggPT09IHNraWxscy5sZW5ndGggLSAxO1xuICAgIGNvbnN0IHNraWxsTmFtZUVzYyAgID0gZXNjYXBlSHRtbChza2lsbE5hbWUpO1xuXG4gICAgY29uc3QgZ3JvdXBLZXkgPSB0eXBlb2Ygc2tpbGwgPT09ICdvYmplY3QnID8gKHNraWxsLmdyb3VwIHx8ICcnKSA6ICcnO1xuICAgIGNvbnN0IGdyb3VwV2FybmluZyA9IGdyb3VwV2FybmluZ3MuZ2V0KGdyb3VwS2V5KTtcbiAgICBjb25zdCBjYXRlZ29yeUtleSA9IHR5cGVvZiBza2lsbCA9PT0gJ29iamVjdCcgPyAoc2tpbGwuY2F0ZWdvcnkgfHwgJycpIDogJyc7XG4gICAgY29uc3QgcHJvZmljaWVuY3lLZXkgPSB0eXBlb2Ygc2tpbGwgPT09ICdvYmplY3QnID8gU3RyaW5nKHNraWxsLnByb2ZpY2llbmN5IHx8ICcnKS50cmltKCkgOiAnJztcbiAgICBjb25zdCBzdWJza2lsbHMgPSB0eXBlb2Ygc2tpbGwgPT09ICdvYmplY3QnXG4gICAgICA/IEFycmF5LmlzQXJyYXkoc2tpbGwuc3Vic2tpbGxzKVxuICAgICAgICA/IHNraWxsLnN1YnNraWxsc1xuICAgICAgICA6IEFycmF5LmlzQXJyYXkoc2tpbGwuc3ViX3NraWxscylcbiAgICAgICAgICA/IHNraWxsLnN1Yl9za2lsbHNcbiAgICAgICAgICA6IFtdXG4gICAgICA6IFtdO1xuICAgIGNvbnN0IHBhcmVudGhldGljYWxLZXkgPSB0eXBlb2Ygc2tpbGwgPT09ICdvYmplY3QnID8gU3RyaW5nKHNraWxsLnBhcmVudGhldGljYWwgfHwgJycpLnRyaW0oKSA6ICcnO1xuXG4gICAgY29uc3QgbmV3QmFkZ2UgPSBpc05ld1xuICAgICAgPyAoc2tpbGwuX2lzVXNlckNyZWF0ZWRcbiAgICAgICAgPyAnPHNwYW4gdGl0bGU9XCJBZGRlZCBmb3IgdGhpcyBzZXNzaW9uIG9ubHlcIiBzdHlsZT1cIm1hcmdpbi1sZWZ0OjZweDtmb250LXNpemU6MTBweDtjb2xvcjojMGY3NjZlO2JvcmRlcjoxcHggc29saWQgIzBmNzY2ZTtib3JkZXItcmFkaXVzOjNweDtwYWRkaW5nOjFweCA1cHg7Y3Vyc29yOmhlbHA7XCI+U2Vzc2lvbiBvbmx5PC9zcGFuPidcbiAgICAgICAgOiAnPHNwYW4gdGl0bGU9XCJBSSBzdWdnZXN0ZWQgXHUyMDE0IG5vdCB5ZXQgaW4gQ1YgcHJvZmlsZVwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6NnB4O2ZvbnQtc2l6ZToxMHB4O2NvbG9yOiNkYzc5MDA7Ym9yZGVyOjFweCBzb2xpZCAjZGM3OTAwO2JvcmRlci1yYWRpdXM6M3B4O3BhZGRpbmc6MXB4IDVweDtjdXJzb3I6aGVscDtcIj5cdTI2QTAgTm90IGluIENWIHByb2ZpbGU8L3NwYW4+JylcbiAgICAgIDogJyc7XG4gICAgY29uc3QgX2V2aWRlbmNlVGV4dCA9IGlzQ2FuZGlkYXRlVG9Db25maXJtICYmIHR5cGVvZiBza2lsbCA9PT0gJ29iamVjdCcgPyBTdHJpbmcoc2tpbGwuZXZpZGVuY2UgfHwgJycpLnRyaW0oKSA6ICcnO1xuICAgIGNvbnN0IF9ldmlkZW5jZUZhbGxiYWNrID0gJ0NvbmZpcm0gdGhpcyBza2lsbCBpcyBnZW51aW5lbHkgZGVtb25zdHJhdGVkIGluIHlvdXIgZXhwZXJpZW5jZSBiZWZvcmUgaW5jbHVkaW5nIGl0Lic7XG4gICAgY29uc3QgX2V2aWRlbmNlVGlwID0gX2V2aWRlbmNlVGV4dCA/IGBXZWFrIGV2aWRlbmNlIFx1MjAxNCAke19ldmlkZW5jZVRleHR9YCA6IGBXZWFrIGV2aWRlbmNlIFx1MjAxNCAke19ldmlkZW5jZUZhbGxiYWNrfWA7XG4gICAgY29uc3QgY2FuZGlkYXRlQmFkZ2UgPSBpc0NhbmRpZGF0ZVRvQ29uZmlybVxuICAgICAgPyBgPHNwYW4gdGl0bGU9XCIke2VzY2FwZUh0bWwoX2V2aWRlbmNlVGlwKX1cIiBhcmlhLWxhYmVsPVwiJHtlc2NhcGVIdG1sKF9ldmlkZW5jZVRpcCl9XCIgc3R5bGU9XCJtYXJnaW4tbGVmdDo2cHg7Zm9udC1zaXplOjEwcHg7Y29sb3I6IzlmMTIzOTtib3JkZXI6MXB4IHNvbGlkICM5ZjEyMzk7Ym9yZGVyLXJhZGl1czozcHg7cGFkZGluZzoxcHggNXB4O2N1cnNvcjpoZWxwO1wiPlx1MjZBMCAke19ldmlkZW5jZVRleHQgPyAnV2VhayBldmlkZW5jZScgOiAnVmVyaWZ5IGV2aWRlbmNlJ308L3NwYW4+YFxuICAgICAgOiAnJztcbiAgICBjb25zdCBldmlkZW5jZU5vdGUgPSBpc0NhbmRpZGF0ZVRvQ29uZmlybSAmJiBfZXZpZGVuY2VUZXh0XG4gICAgICA/IGA8c21hbGwgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO21hcmdpbi10b3A6M3B4O2ZvbnQtc2l6ZTowLjc4ZW07Y29sb3I6IzlmMTIzOTtcIj4ke2VzY2FwZUh0bWwoX2V2aWRlbmNlVGV4dCl9PC9zbWFsbD5gXG4gICAgICA6ICcnO1xuICAgIGNvbnN0IHJlcnVuTmV3QmFkZ2UgPSBuZXdSZWNvbW1lbmRlZFNraWxscy5oYXMoc2tpbGxOYW1lKVxuICAgICAgPyAnPHNwYW4gY2xhc3M9XCJydy1jaGFuZ2UtYmFkZ2UgcnctY2hhbmdlLW5ld1wiIGFyaWEtbGFiZWw9XCJOZXcgcmVjb21tZW5kYXRpb24gc2luY2UgcHJldmlvdXMgcnVuXCI+XHVEODNDXHVERDk1IE5ldzwvc3Bhbj4nXG4gICAgICA6ICcnO1xuICAgIGNvbnN0IHNraWxsTmFtZUxvd2VyICA9IHNraWxsTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IF90eXBlT3ZlcnJpZGUgICA9ICh3aW5kb3cuX3NraWxsVHlwZU92ZXJyaWRlcyB8fCB7fSlbc2tpbGxOYW1lTG93ZXJdO1xuICAgIGNvbnN0IF9iYXNlVHlwZSAgICAgICA9IGhhcmRTa2lsbFNldC5oYXMoc2tpbGxOYW1lTG93ZXIpID8gJ2hhcmQnXG4gICAgICA6IHNvZnRTa2lsbFNldD8uaGFzKHNraWxsTmFtZUxvd2VyKSA/ICdzb2Z0JyA6IG51bGw7XG4gICAgY29uc3QgX2VmZmVjdGl2ZVR5cGUgID0gX3R5cGVPdmVycmlkZSB8fCBfYmFzZVR5cGU7XG4gICAgY29uc3QgX2lzT3ZlcnJpZGRlbiAgID0gISFfdHlwZU92ZXJyaWRlICYmIF90eXBlT3ZlcnJpZGUgIT09IF9iYXNlVHlwZTtcbiAgICBjb25zdCBfdG9nZ2xlVGFyZ2V0ICAgPSBfZWZmZWN0aXZlVHlwZSA9PT0gJ2hhcmQnID8gJ3NvZnQnXG4gICAgICA6IF9lZmZlY3RpdmVUeXBlID09PSAnc29mdCcgPyBudWxsIDogJ2hhcmQnO1xuICAgIGNvbnN0IF9iYWRnZVRpdGxlICAgICA9IF9pc092ZXJyaWRkZW5cbiAgICAgID8gYFVzZXIgb3ZlcnJpZGU6ICR7X2VmZmVjdGl2ZVR5cGV9IChvcmlnaW5hbDogJHtfYmFzZVR5cGUgfHwgJ25vbmUnfSkgXHUyMDE0IGNsaWNrIHRvIGN5Y2xlYFxuICAgICAgOiBfZWZmZWN0aXZlVHlwZVxuICAgICAgICA/IGAke19lZmZlY3RpdmVUeXBlID09PSAnaGFyZCcgPyAnUmVxdWlyZWQnIDogJ05pY2UtdG8taGF2ZSd9IHBlciBqb2IgZGVzY3JpcHRpb24gXHUyMDE0IGNsaWNrIHRvIG92ZXJyaWRlYFxuICAgICAgICA6ICdOb3QgY2xhc3NpZmllZCBcdTIwMTQgY2xpY2sgdG8gbWFyayBhcyBIYXJkJztcbiAgICBjb25zdCBfYmFkZ2VTdHlsZSAgICAgPSBfZWZmZWN0aXZlVHlwZSA9PT0gJ2hhcmQnXG4gICAgICA/IGBtYXJnaW4tbGVmdDo1cHg7Zm9udC1zaXplOjEwcHg7Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOiMxZDRlZDg7YmFja2dyb3VuZDojZGJlYWZlO2JvcmRlci1yYWRpdXM6M3B4O3BhZGRpbmc6MXB4IDVweDtjdXJzb3I6cG9pbnRlcjske19pc092ZXJyaWRkZW4gPyAnb3V0bGluZToycHggc29saWQgIzFkNGVkODtvdXRsaW5lLW9mZnNldDoxcHg7JyA6ICcnfWBcbiAgICAgIDogX2VmZmVjdGl2ZVR5cGUgPT09ICdzb2Z0J1xuICAgICAgICA/IGBtYXJnaW4tbGVmdDo1cHg7Zm9udC1zaXplOjEwcHg7Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOiM2YjIxYTg7YmFja2dyb3VuZDojZjNlOGZmO2JvcmRlci1yYWRpdXM6M3B4O3BhZGRpbmc6MXB4IDVweDtjdXJzb3I6cG9pbnRlcjske19pc092ZXJyaWRkZW4gPyAnb3V0bGluZToycHggc29saWQgIzZiMjFhODtvdXRsaW5lLW9mZnNldDoxcHg7JyA6ICcnfWBcbiAgICAgICAgOiAnbWFyZ2luLWxlZnQ6NXB4O2ZvbnQtc2l6ZToxMHB4O2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjojNmI3MjgwO2JhY2tncm91bmQ6I2YzZjRmNjtib3JkZXItcmFkaXVzOjNweDtwYWRkaW5nOjFweCA1cHg7Y3Vyc29yOnBvaW50ZXI7Ym9yZGVyOjFweCBkYXNoZWQgIzljYTNhZjsnO1xuICAgIGNvbnN0IF9iYWRnZUxhYmVsICAgICA9IF9lZmZlY3RpdmVUeXBlID8gKF9lZmZlY3RpdmVUeXBlID09PSAnaGFyZCcgPyAnSGFyZCcgOiAnU29mdCcpIDogJysgVHlwZSc7XG4gICAgY29uc3Qgc2tpbGxUeXBlQmFkZ2UgID0gYDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2tpbGwtdHlwZS10b2dnbGVcIiBkYXRhLXNraWxsPVwiJHtza2lsbE5hbWVFc2N9XCIgZGF0YS10b2dnbGUtdG89XCIke190b2dnbGVUYXJnZXQgfHwgJyd9XCIgdGl0bGU9XCIke19iYWRnZVRpdGxlfVwiIHN0eWxlPVwiJHtfYmFkZ2VTdHlsZX1cIiBhcmlhLWxhYmVsPVwiU2tpbGwgdHlwZTogJHtfZWZmZWN0aXZlVHlwZSB8fCAndW5jbGFzc2lmaWVkJ30sIGNsaWNrIHRvIHRvZ2dsZVwiPiR7X2JhZGdlTGFiZWx9PC9idXR0b24+YDtcbiAgICBjb25zdCByZWNvbW1lbmRhdGlvblRleHQgPSByZWNvbW1lbmRhdGlvbiB8fCAoc2tpbGwuX2lzVXNlckNyZWF0ZWQgPyAnSW5jbHVkZSAoc2Vzc2lvbi1hZGRlZCknIDogKGlzTmV3ID8gJ0luY2x1ZGUgKEFJIHN1Z2dlc3RlZCknIDogJ09taXQnKSk7XG4gICAgY29uc3QgY29uZmlkZW5jZUJhZGdlICAgID0gYDxzcGFuIGNsYXNzPVwiY29uZmlkZW5jZS1iYWRnZSBjb25maWRlbmNlLSR7Y29uZmlkZW5jZS5sZXZlbH1cIj4ke2NvbmZpZGVuY2UudGV4dH08L3NwYW4+YDtcbiAgICBjb25zdCByZWFzb25pbmdUZXh0ICAgICAgPSByZWFzb25pbmcgfHwgKHNraWxsLl9pc1VzZXJDcmVhdGVkXG4gICAgICA/ICdZb3UgYWRkZWQgdGhpcyBza2lsbCBmb3IgdGhlIGN1cnJlbnQgQ1Ygc2Vzc2lvbiBvbmx5LidcbiAgICAgIDogKGlzTmV3XG4gICAgICAgID8gJ1JlY29tbWVuZGVkIGJ5IEFJIGJhc2VkIG9uIGpvYiByZXF1aXJlbWVudHMgYnV0IG5vdCBjdXJyZW50bHkgaW4geW91ciBtYXN0ZXIgQ1YuJ1xuICAgICAgICA6ICdUaGlzIHNraWxsIHdhcyBub3Qgc3BlY2lmaWNhbGx5IG1lbnRpb25lZCBpbiB0aGUgam9iIHJlcXVpcmVtZW50cy4nKSk7XG4gICAgY29uc3QgZ3JvdXBpbmdDaGFuZ2VUZXh0ID0gZ3JvdXBpbmdTdWdnZXN0aW9uPy5jaGFuZ2VUZXh0IHx8ICcnO1xuICAgIGNvbnN0IGdyb3VwaW5nUmVhc29uVGV4dCA9IGdyb3VwaW5nU3VnZ2VzdGlvbj8ucmVhc29uaW5nIHx8ICcnO1xuICAgIGNvbnN0IGdyb3VwaW5nQXRzSW1wYWN0ID0gZ3JvdXBpbmdTdWdnZXN0aW9uPy5hdHNJbXBhY3QgfHwgJyc7XG4gICAgY29uc3QgZ3JvdXBpbmdQYWdlSW1wYWN0ID0gZ3JvdXBpbmdTdWdnZXN0aW9uPy5wYWdlTGVuZ3RoSW1wYWN0IHx8ICcnO1xuICAgIGNvbnN0IHJlYXNvbmluZ1NlZ21lbnRzID0gW3JlYXNvbmluZ1RleHRdO1xuICAgIGlmIChncm91cGluZ0NoYW5nZVRleHQpIHJlYXNvbmluZ1NlZ21lbnRzLnB1c2goYENoYW5nZTogJHtncm91cGluZ0NoYW5nZVRleHR9YCk7XG4gICAgaWYgKGdyb3VwaW5nUmVhc29uVGV4dCkgcmVhc29uaW5nU2VnbWVudHMucHVzaChncm91cGluZ1JlYXNvblRleHQpO1xuICAgIGlmIChncm91cGluZ0F0c0ltcGFjdCkgcmVhc29uaW5nU2VnbWVudHMucHVzaChgQVRTIGltcGFjdDogJHtncm91cGluZ0F0c0ltcGFjdH1gKTtcbiAgICBpZiAoZ3JvdXBpbmdQYWdlSW1wYWN0KSByZWFzb25pbmdTZWdtZW50cy5wdXNoKGBQYWdlIGxlbmd0aCBpbXBhY3Q6ICR7Z3JvdXBpbmdQYWdlSW1wYWN0fWApO1xuICAgIGNvbnN0IGZ1bGxSZWFzb25pbmdUZXh0ID0gcmVhc29uaW5nU2VnbWVudHMuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgICBjb25zdCByb3dTdHlsZSAgICAgICAgICAgPSBpc05ldyA/ICdiYWNrZ3JvdW5kOiNmZmZiZWI7JyA6ICcnO1xuICAgIGNvbnN0IGRlZmF1bHRNYXRjaGVzID0gaXNOZXcgPyAoc2F2ZWRNYXRjaGVzW3NraWxsTmFtZV0gfHwgZGVyaXZlTWF0Y2hlcyhza2lsbE5hbWUpKSA6IFtdO1xuICAgIGNvbnN0IG1hdGNoVmFsdWUgPSBkZWZhdWx0TWF0Y2hlcy5qb2luKCcsICcpO1xuICAgIGNvbnN0IG1hdGNoSGVscCA9IGlzTmV3XG4gICAgICA/ICdDb21tYS1zZXBhcmF0ZWQgZXhwZXJpZW5jZSBJRHMuIEF1dG8tZGVyaXZlZDsgeW91IGNhbiBlZGl0IGJlZm9yZSBzdWJtaXQuJ1xuICAgICAgOiAnT25seSB1c2VkIGZvciBBSS1zdWdnZXN0ZWQgc2tpbGxzLic7XG4gICAgY29uc3QgZGVyaXZlZFllYXJzID0gaXNOZXcgPyBfY29tcHV0ZVllYXJzRnJvbUlkcyhkZWZhdWx0TWF0Y2hlcywgYWxsRXhwZXJpZW5jZXMpIDogbnVsbDtcbiAgICBjb25zdCB5ZWFyc0hpbnQgPSBkZXJpdmVkWWVhcnMgIT0gbnVsbFxuICAgICAgPyBgfiR7ZGVyaXZlZFllYXJzfSB5ciR7ZGVyaXZlZFllYXJzID09PSAxID8gJycgOiAncyd9YFxuICAgICAgOiAoaXNOZXcgPyAnbm8gbWF0Y2gnIDogJycpO1xuXG4gICAgdGFibGVIVE1MICs9IGBcbiAgICAgIDx0ciBkYXRhLXNraWxsPVwiJHtza2lsbE5hbWVFc2N9XCIgc3R5bGU9XCIke3Jvd1N0eWxlfVwiPlxuICAgICAgICA8dGQ+PHN0cm9uZz4ke3NraWxsTmFtZUVzY308L3N0cm9uZz4ke3NraWxsVHlwZUJhZGdlfSR7cmVydW5OZXdCYWRnZX0ke25ld0JhZGdlfSR7Y2FuZGlkYXRlQmFkZ2V9JHtldmlkZW5jZU5vdGV9PC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwibWluLXdpZHRoOjE0MHB4O1wiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwic2tpbGwtY2F0ZWdvcnktaW5wdXRcIiBkYXRhLXNraWxsPVwiJHtza2lsbE5hbWVFc2N9XCJcbiAgICAgICAgICAgIHZhbHVlPVwiJHtlc2NhcGVIdG1sKGNhdGVnb3J5S2V5KX1cIlxuICAgICAgICAgICAgbGlzdD1cIiR7Y2F0ZWdvcnlMaXN0SWR9XCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBQcm9ncmFtbWluZ1wiXG4gICAgICAgICAgICB0aXRsZT1cIlNlc3Npb24tb25seSBjYXRlZ29yeSBsYWJlbCB1c2VkIHdoZW4gZ3JvdXBpbmcgc2tpbGxzIGluIHRoZSBnZW5lcmF0ZWQgQ1ZcIlxuICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDoxMDAlO2ZvbnQtc2l6ZTowLjhlbTtwYWRkaW5nOjRweCA2cHg7Ym9yZGVyOjFweCBzb2xpZCAjZDFkNWRiO2JvcmRlci1yYWRpdXM6NHB4O1wiLz5cbiAgICAgICAgICAke2dyb3VwaW5nU3VnZ2VzdGlvbj8uY2F0ZWdvcnlDaGFuZ2VkID8gYDxkaXYgY2xhc3M9XCJza2lsbC1haS1oaW50XCIgc3R5bGU9XCJtYXJnaW4tdG9wOjRweDtmb250LXNpemU6MC43NWVtO2NvbG9yOiM0MzM4Y2E7XCI+XG4gICAgICAgICAgICBBSSBzdWdnZXN0aW9uOiAke2VzY2FwZUh0bWwoZ3JvdXBpbmdTdWdnZXN0aW9uLmNhdGVnb3J5KX1cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJza2lsbC1hcHBseS1haVwiIGRhdGEtc2tpbGw9XCIke3NraWxsTmFtZUVzY31cIiBkYXRhLWFpLWZpZWxkPVwiY2F0ZWdvcnlcIiBkYXRhLWFpLXZhbHVlPVwiJHtlc2NhcGVIdG1sKGdyb3VwaW5nU3VnZ2VzdGlvbi5jYXRlZ29yeSl9XCIgc3R5bGU9XCJtYXJnaW4tbGVmdDo2cHg7Ym9yZGVyOjFweCBzb2xpZCAjYzdkMmZlO2JhY2tncm91bmQ6I2VlZjJmZjtjb2xvcjojNDMzOGNhO2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6MXB4IDZweDtjdXJzb3I6cG9pbnRlcjtcIj5BcHBseTwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PmAgOiAnJ31cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwibWluLXdpZHRoOjEwMHB4O1wiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwic2tpbGwtZ3JvdXAtaW5wdXRcIiBkYXRhLXNraWxsPVwiJHtza2lsbE5hbWVFc2N9XCJcbiAgICAgICAgICAgIHZhbHVlPVwiJHtlc2NhcGVIdG1sKGdyb3VwS2V5KX1cIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIGNfZmFtaWx5XCJcbiAgICAgICAgICAgIHRpdGxlPVwiU2tpbGxzIHdpdGggdGhlIHNhbWUgZ3JvdXAga2V5IHJlbmRlciBhcyBvbmUgY29tbWEtc2VwYXJhdGVkIGJ1bGxldFwiXG4gICAgICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Zm9udC1zaXplOjAuOGVtO3BhZGRpbmc6NHB4IDZweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo0cHg7XCIvPlxuICAgICAgICAgICR7Z3JvdXBpbmdTdWdnZXN0aW9uPy5ncm91cENoYW5nZWQgPyBgPGRpdiBjbGFzcz1cInNraWxsLWFpLWhpbnRcIiBzdHlsZT1cIm1hcmdpbi10b3A6NHB4O2ZvbnQtc2l6ZTowLjc1ZW07Y29sb3I6IzQzMzhjYTtcIj5cbiAgICAgICAgICAgIEFJIHN1Z2dlc3Rpb246ICR7ZXNjYXBlSHRtbChncm91cGluZ1N1Z2dlc3Rpb24uZ3JvdXApfVxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNraWxsLWFwcGx5LWFpXCIgZGF0YS1za2lsbD1cIiR7c2tpbGxOYW1lRXNjfVwiIGRhdGEtYWktZmllbGQ9XCJncm91cFwiIGRhdGEtYWktdmFsdWU9XCIke2VzY2FwZUh0bWwoZ3JvdXBpbmdTdWdnZXN0aW9uLmdyb3VwKX1cIiBzdHlsZT1cIm1hcmdpbi1sZWZ0OjZweDtib3JkZXI6MXB4IHNvbGlkICNjN2QyZmU7YmFja2dyb3VuZDojZWVmMmZmO2NvbG9yOiM0MzM4Y2E7Ym9yZGVyLXJhZGl1czo0cHg7cGFkZGluZzoxcHggNnB4O2N1cnNvcjpwb2ludGVyO1wiPkFwcGx5PC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+YCA6ICcnfVxuICAgICAgICAgICR7Z3JvdXBXYXJuaW5nID8gYDxkaXYgY2xhc3M9XCJza2lsbC1ncm91cC13YXJuaW5nXCIgdGl0bGU9XCIke2VzY2FwZUh0bWwoZ3JvdXBXYXJuaW5nLnByZXZpZXcpfVwiIHN0eWxlPVwibWFyZ2luLXRvcDo0cHg7Zm9udC1zaXplOjAuNzVlbTtjb2xvcjojYjQ1MzA5O1wiPlx1MjZBMCAke2VzY2FwZUh0bWwoZ3JvdXBXYXJuaW5nLm1lc3NhZ2UpfTwvZGl2PmAgOiAnJ31cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwibWluLXdpZHRoOjEyMHB4O1wiPlxuICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJza2lsbC1wcm9maWNpZW5jeS1pbnB1dFwiIGRhdGEtc2tpbGw9XCIke3NraWxsTmFtZUVzY31cIlxuICAgICAgICAgICAgdGl0bGU9XCJTZXNzaW9uLW9ubHkgcHJvZmljaWVuY3kgbGFiZWwgdXNlZCB3aGVuIHJlbmRlcmluZyBpbmxpbmUgc2tpbGwgYnVsbGV0c1wiXG4gICAgICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Zm9udC1zaXplOjAuOGVtO3BhZGRpbmc6NHB4IDZweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo0cHg7XCI+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCIgJHshcHJvZmljaWVuY3lLZXkgPyAnc2VsZWN0ZWQnIDogJyd9Pk5vbmU8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJiZWdpbm5lclwiICR7cHJvZmljaWVuY3lLZXkgPT09ICdiZWdpbm5lcicgPyAnc2VsZWN0ZWQnIDogJyd9PkJlZ2lubmVyPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiZmFtaWxpYXJcIiAke3Byb2ZpY2llbmN5S2V5ID09PSAnZmFtaWxpYXInID8gJ3NlbGVjdGVkJyA6ICcnfT5GYW1pbGlhcjwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImludGVybWVkaWF0ZVwiICR7cHJvZmljaWVuY3lLZXkgPT09ICdpbnRlcm1lZGlhdGUnID8gJ3NlbGVjdGVkJyA6ICcnfT5JbnRlcm1lZGlhdGU8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJhZHZhbmNlZFwiICR7cHJvZmljaWVuY3lLZXkgPT09ICdhZHZhbmNlZCcgPyAnc2VsZWN0ZWQnIDogJyd9PkFkdmFuY2VkPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiZXhwZXJ0XCIgJHtwcm9maWNpZW5jeUtleSA9PT0gJ2V4cGVydCcgPyAnc2VsZWN0ZWQnIDogJyd9PkV4cGVydDwvb3B0aW9uPlxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJtaW4td2lkdGg6MTgwcHg7XCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJza2lsbC1zdWJza2lsbHMtaW5wdXRcIiBkYXRhLXNraWxsPVwiJHtza2lsbE5hbWVFc2N9XCJcbiAgICAgICAgICAgIHZhbHVlPVwiJHtlc2NhcGVIdG1sKHN1YnNraWxscy5qb2luKCcsICcpKX1cIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIFBhbmRhcywgTnVtUHlcIlxuICAgICAgICAgICAgdGl0bGU9XCJDb21tYS1zZXBhcmF0ZWQgc3ViLXNraWxscyB1c2VkIGluIGlubGluZSBza2lsbCBidWxsZXRzXCJcbiAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTtmb250LXNpemU6MC44ZW07cGFkZGluZzo0cHggNnB4O2JvcmRlcjoxcHggc29saWQgI2QxZDVkYjtib3JkZXItcmFkaXVzOjRweDtcIi8+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cIm1pbi13aWR0aDoxODBweDtcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cInNraWxsLXBhcmVudGhldGljYWwtaW5wdXRcIiBkYXRhLXNraWxsPVwiJHtza2lsbE5hbWVFc2N9XCJcbiAgICAgICAgICAgIHZhbHVlPVwiJHtlc2NhcGVIdG1sKHBhcmVudGhldGljYWxLZXkpfVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIk9wdGlvbmFsIGlubGluZSBub3RlXCJcbiAgICAgICAgICAgIHRpdGxlPVwiRnJlZS1mb3JtIHBhcmVudGhldGljYWwgb3ZlcnJpZGUgZm9yIHRoZSByZW5kZXJlZCBpbmxpbmUgc2tpbGwgbGFiZWxcIlxuICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDoxMDAlO2ZvbnQtc2l6ZTowLjhlbTtwYWRkaW5nOjRweCA2cHg7Ym9yZGVyOjFweCBzb2xpZCAjZDFkNWRiO2JvcmRlci1yYWRpdXM6NHB4O1wiLz5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkPjxzdHJvbmc+JHtlc2NhcGVIdG1sKHJlY29tbWVuZGF0aW9uVGV4dCl9PC9zdHJvbmc+PC90ZD5cbiAgICAgICAgPHRkPiR7Y29uZmlkZW5jZUJhZGdlfTwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cIm1heC13aWR0aDozMDBweDtcIj48c21hbGw+JHtlc2NhcGVIdG1sKGZ1bGxSZWFzb25pbmdUZXh0KX08L3NtYWxsPjwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cIm1pbi13aWR0aDoyNjBweDtcIj5cbiAgICAgICAgICAke2lzTmV3ID8gYDxpbnB1dFxuICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgY2xhc3M9XCJza2lsbC1tYXRjaC1pbnB1dFwiXG4gICAgICAgICAgICBkYXRhLXNraWxsPVwiJHtza2lsbE5hbWVFc2N9XCJcbiAgICAgICAgICAgIHZhbHVlPVwiJHtlc2NhcGVIdG1sKG1hdGNoVmFsdWUpfVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cImV4cF8xLCBleHBfMlwiXG4gICAgICAgICAgICB0aXRsZT1cIiR7ZXNjYXBlSHRtbChtYXRjaEhlbHApfVwiXG4gICAgICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Zm9udC1zaXplOjAuODVlbTtwYWRkaW5nOjZweCA4cHg7Ym9yZGVyOjFweCBzb2xpZCAjZDFkNWRiO2JvcmRlci1yYWRpdXM6NnB4O1wiXG4gICAgICAgICAgLz48c3BhbiBjbGFzcz1cImRlcml2ZWQteWVhcnMtaGludFwiIGRhdGEtc2tpbGw9XCIke3NraWxsTmFtZUVzY31cIiB0aXRsZT1cIkVzdGltYXRlZCB5ZWFycyBkZXJpdmVkIGZyb20gbWF0Y2hlZCBleHBlcmllbmNlIGVudHJpZXNcIiBzdHlsZT1cImRpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbi10b3A6NHB4O2ZvbnQtc2l6ZTowLjhlbTtjb2xvcjojNmI3MjgwO1wiPiR7ZXNjYXBlSHRtbCh5ZWFyc0hpbnQpfTwvc3Bhbj5gIDogJzxzcGFuIHN0eWxlPVwiY29sb3I6IzljYTNhZjtcIj5cdTIwMTQ8L3NwYW4+J31cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwiYWN0aW9uLWJ0bnNcIiBzdHlsZT1cIndoaXRlLXNwYWNlOm5vd3JhcDtcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG4gJHtkZWZhdWx0QWN0aW9uID09PSAnZW1waGFzaXplJyAgICA/ICdhY3RpdmUnIDogJyd9XCIgZGF0YS1hY3Rpb249XCJlbXBoYXNpemVcIiAgICBhcmlhLWxhYmVsPVwiRW1waGFzaXplICR7c2tpbGxOYW1lRXNjfVwiICAgIGFyaWEtcHJlc3NlZD1cIiR7ZGVmYXVsdEFjdGlvbiA9PT0gJ2VtcGhhc2l6ZSd9XCIgICAgdGl0bGU9XCJFbXBoYXNpemUgXHUyMDE0IGZlYXR1cmUgcHJvbWluZW50bHlcIiBzdHlsZT1cImNvbG9yOiMxMGI5ODE7XCI+XHUyNzk1PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuICR7ZGVmYXVsdEFjdGlvbiA9PT0gJ2luY2x1ZGUnICAgICAgPyAnYWN0aXZlJyA6ICcnfVwiIGRhdGEtYWN0aW9uPVwiaW5jbHVkZVwiICAgICAgYXJpYS1sYWJlbD1cIkluY2x1ZGUgJHtza2lsbE5hbWVFc2N9XCIgICAgICBhcmlhLXByZXNzZWQ9XCIke2RlZmF1bHRBY3Rpb24gPT09ICdpbmNsdWRlJ31cIiAgICAgIHRpdGxlPVwiSW5jbHVkZSBcdTIwMTQgc3RhbmRhcmQgbGlzdGluZ1wiPlx1MjcxMzwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0biAke2RlZmF1bHRBY3Rpb24gPT09ICdkZS1lbXBoYXNpemUnID8gJ2FjdGl2ZScgOiAnJ31cIiBkYXRhLWFjdGlvbj1cImRlLWVtcGhhc2l6ZVwiIGFyaWEtbGFiZWw9XCJEZS1lbXBoYXNpemUgJHtza2lsbE5hbWVFc2N9XCIgYXJpYS1wcmVzc2VkPVwiJHtkZWZhdWx0QWN0aW9uID09PSAnZGUtZW1waGFzaXplJ31cIiB0aXRsZT1cIkRlLWVtcGhhc2l6ZSBcdTIwMTQgYnJpZWYgbWVudGlvblwiICAgIHN0eWxlPVwiY29sb3I6I2Y1OWUwYjtcIj5cdTI3OTY8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG4gJHtkZWZhdWx0QWN0aW9uID09PSAnZXhjbHVkZScgICAgICA/ICdhY3RpdmUnIDogJyd9XCIgZGF0YS1hY3Rpb249XCJleGNsdWRlXCIgICAgICBhcmlhLWxhYmVsPVwiRXhjbHVkZSAke3NraWxsTmFtZUVzY31cIiAgICAgIGFyaWEtcHJlc3NlZD1cIiR7ZGVmYXVsdEFjdGlvbiA9PT0gJ2V4Y2x1ZGUnfVwiICAgICAgdGl0bGU9XCJFeGNsdWRlIFx1MjAxNCBvbWl0IGZyb20gQ1ZcIiAgICAgICAgICBzdHlsZT1cImNvbG9yOiNlZjQ0NDQ7XCI+JHtleWVTbGFzaEljb24oKX08L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBkYXRhLWFjdGlvbj1cInJvdy11cFwiICAgYXJpYS1sYWJlbD1cIk1vdmUgJHtza2lsbE5hbWVFc2N9IGVhcmxpZXJcIiB0aXRsZT1cIk1vdmUgdXBcIiAgICR7aXNGaXJzdCA/ICdkaXNhYmxlZCcgOiAnJ30+XHUyMTkxPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgZGF0YS1hY3Rpb249XCJyb3ctZG93blwiIGFyaWEtbGFiZWw9XCJNb3ZlICR7c2tpbGxOYW1lRXNjfSBsYXRlclwiICAgdGl0bGU9XCJNb3ZlIGRvd25cIiAke2lzTGFzdCAgPyAnZGlzYWJsZWQnIDogJyd9Plx1MjE5MzwvYnV0dG9uPlxuICAgICAgICA8L3RkPlxuICAgICAgPC90cj5cbiAgICBgO1xuICB9KTtcblxuICB0YWJsZUhUTUwgKz0gJzwvdGJvZHk+PC90YWJsZT4nO1xuICBjb250YWluZXIuaW5uZXJIVE1MID0gdGFibGVIVE1MO1xuXG4gIC8vIFNhdmUgZ3JvdXAga2V5IGZvciB0aGlzIHNlc3Npb24gd2hlbiB1c2VyIGZpbmlzaGVzIGVkaXRpbmdcbiAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5za2lsbC1jYXRlZ29yeS1tYW5hZ2VyJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGUgPT4ge1xuICAgIGNvbnN0IGNhdGVnb3J5TWFuYWdlcklucHV0ID0gZS50YXJnZXQuY2xvc2VzdCgnLnNraWxsLWNhdGVnb3J5LW1hbmFnZXItaW5wdXQnKTtcbiAgICBpZiAoY2F0ZWdvcnlNYW5hZ2VySW5wdXQpIHtcbiAgICAgIGNvbnN0IG1hbmFnZXJSb3cgPSBjYXRlZ29yeU1hbmFnZXJJbnB1dC5jbG9zZXN0KCcuc2tpbGwtY2F0ZWdvcnktbWFuYWdlci1yb3cnKTtcbiAgICAgIGNvbnN0IG9sZENhdGVnb3J5ID0gbWFuYWdlclJvdz8uZGF0YXNldC5jYXRlZ29yeSB8fCAnJztcbiAgICAgIGNvbnN0IG5ld0NhdGVnb3J5ID0gY2F0ZWdvcnlNYW5hZ2VySW5wdXQudmFsdWUudHJpbSgpO1xuICAgICAgaWYgKCFvbGRDYXRlZ29yeSB8fCAhbmV3Q2F0ZWdvcnkgfHwgb2xkQ2F0ZWdvcnkgPT09IG5ld0NhdGVnb3J5KSB7XG4gICAgICAgIGlmIChtYW5hZ2VyUm93KSBjYXRlZ29yeU1hbmFnZXJJbnB1dC52YWx1ZSA9IG9sZENhdGVnb3J5O1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBfcmVuYW1lU2tpbGxDYXRlZ29yeUxvY2FsbHkob2xkQ2F0ZWdvcnksIG5ld0NhdGVnb3J5KTtcbiAgICAgIHJlbmFtZVNraWxsQ2F0ZWdvcnkob2xkQ2F0ZWdvcnksIG5ld0NhdGVnb3J5KVxuICAgICAgICAudGhlbigoKSA9PiBfcmVuZGVyU2tpbGxzVGFibGUoY29udGFpbmVyLCByZWNvbW1lbmRlZFNldCwgZGF0YSwgaGFyZFNraWxsU2V0LCBzb2Z0U2tpbGxTZXQpKVxuICAgICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgIF9yZW5hbWVTa2lsbENhdGVnb3J5TG9jYWxseShuZXdDYXRlZ29yeSwgb2xkQ2F0ZWdvcnkpO1xuICAgICAgICAgIGlmIChtYW5hZ2VyUm93KSBjYXRlZ29yeU1hbmFnZXJJbnB1dC52YWx1ZSA9IG9sZENhdGVnb3J5O1xuICAgICAgICAgIHNob3dUb2FzdCgnRmFpbGVkIHRvIHJlbmFtZSBza2lsbCBjYXRlZ29yeS4nLCAnZXJyb3InKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9KTtcblxuICBjb250YWluZXIucXVlcnlTZWxlY3RvcignI3NraWxscy1yZXZpZXctdGFibGUgdGJvZHknKT8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZSA9PiB7XG4gICAgY29uc3QgY2F0ZWdvcnlJbnB1dCA9IGUudGFyZ2V0LmNsb3Nlc3QoJy5za2lsbC1jYXRlZ29yeS1pbnB1dCcpO1xuXG4gIGNvbnN0IGFkZFNraWxsRm9ybSA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcjYWRkLXNraWxsLWZvcm0nKTtcbiAgY29uc3QgdG9nZ2xlQWRkU2tpbGxGb3JtID0gKCkgPT4ge1xuICAgIGlmICghYWRkU2tpbGxGb3JtKSByZXR1cm47XG4gICAgYWRkU2tpbGxGb3JtLnN0eWxlLmRpc3BsYXkgPSBhZGRTa2lsbEZvcm0uc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnID8gJ2Jsb2NrJyA6ICdub25lJztcbiAgfTtcbiAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJyN0b2dnbGUtYWRkLXNraWxsLWZvcm0nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0b2dnbGVBZGRTa2lsbEZvcm0pO1xuICBjb250YWluZXIucXVlcnlTZWxlY3RvcignI2NhbmNlbC1hZGQtc2tpbGwnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgaWYgKCFhZGRTa2lsbEZvcm0pIHJldHVybjtcbiAgICBhZGRTa2lsbEZvcm0ucmVzZXQoKTtcbiAgICBhZGRTa2lsbEZvcm0uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgfSk7XG4gIGFkZFNraWxsRm9ybT8uYWRkRXZlbnRMaXN0ZW5lcignc3VibWl0JywgYXN5bmMgZSA9PiB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKGFkZFNraWxsRm9ybSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHNhdmVVc2VyQ3JlYXRlZFNraWxsKHtcbiAgICAgICAgbmFtZTogZm9ybURhdGEuZ2V0KCduYW1lJyksXG4gICAgICAgIGNhdGVnb3J5OiBmb3JtRGF0YS5nZXQoJ2NhdGVnb3J5JyksXG4gICAgICAgIGdyb3VwOiBmb3JtRGF0YS5nZXQoJ2dyb3VwJyksXG4gICAgICAgIHByb2ZpY2llbmN5OiBmb3JtRGF0YS5nZXQoJ3Byb2ZpY2llbmN5JyksXG4gICAgICAgIHN1YnNraWxsczogZm9ybURhdGEuZ2V0KCdzdWJza2lsbHMnKSxcbiAgICAgICAgcGFyZW50aGV0aWNhbDogZm9ybURhdGEuZ2V0KCdwYXJlbnRoZXRpY2FsJyksXG4gICAgICB9KTtcbiAgICAgIHNob3dUb2FzdCgnU2Vzc2lvbi1vbmx5IHNraWxsIGFkZGVkLicpO1xuICAgICAgYWRkU2tpbGxGb3JtLnJlc2V0KCk7XG4gICAgICBhZGRTa2lsbEZvcm0uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIF9yZW5kZXJTa2lsbHNUYWJsZShjb250YWluZXIsIHJlY29tbWVuZGVkU2V0LCBkYXRhLCBoYXJkU2tpbGxTZXQsIHNvZnRTa2lsbFNldCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHNob3dUb2FzdChlcnJvci5tZXNzYWdlIHx8ICdGYWlsZWQgdG8gYWRkIHNraWxsLicsICdlcnJvcicpO1xuICAgIH1cbiAgfSk7XG4gICAgaWYgKGNhdGVnb3J5SW5wdXQpIHtcbiAgICAgIGNvbnN0IHNraWxsTmFtZSA9IGNhdGVnb3J5SW5wdXQuZGF0YXNldC5za2lsbDtcbiAgICAgIGNvbnN0IG5ld0NhdGVnb3J5ID0gY2F0ZWdvcnlJbnB1dC52YWx1ZS50cmltKCk7XG4gICAgICBzYXZlU2tpbGxDYXRlZ29yeU92ZXJyaWRlKHNraWxsTmFtZSwgbmV3Q2F0ZWdvcnkpLmNhdGNoKCgpID0+IHtcbiAgICAgICAgc2hvd1RvYXN0KCdGYWlsZWQgdG8gc2F2ZSBza2lsbCBjYXRlZ29yeS4nLCAnZXJyb3InKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGlucHV0ID0gZS50YXJnZXQuY2xvc2VzdCgnLnNraWxsLWdyb3VwLWlucHV0Jyk7XG4gICAgaWYgKGlucHV0KSB7XG4gICAgICBjb25zdCBza2lsbE5hbWUgPSBpbnB1dC5kYXRhc2V0LnNraWxsO1xuICAgICAgY29uc3QgbmV3R3JvdXAgPSBpbnB1dC52YWx1ZS50cmltKCk7XG4gICAgICBzYXZlU2tpbGxHcm91cE92ZXJyaWRlKHNraWxsTmFtZSwgbmV3R3JvdXApLmNhdGNoKCgpID0+IHtcbiAgICAgICAgc2hvd1RvYXN0KCdGYWlsZWQgdG8gc2F2ZSBza2lsbCBncm91cC4nLCAnZXJyb3InKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHF1YWxpZmllcklucHV0ID0gZS50YXJnZXQuY2xvc2VzdCgnLnNraWxsLXByb2ZpY2llbmN5LWlucHV0LCAuc2tpbGwtc3Vic2tpbGxzLWlucHV0LCAuc2tpbGwtcGFyZW50aGV0aWNhbC1pbnB1dCcpO1xuICAgIGlmICghcXVhbGlmaWVySW5wdXQpIHJldHVybjtcbiAgICBjb25zdCBza2lsbE5hbWUgPSBxdWFsaWZpZXJJbnB1dC5kYXRhc2V0LnNraWxsO1xuICAgIGNvbnN0IHJvdyA9IHF1YWxpZmllcklucHV0LmNsb3Nlc3QoJ3RyW2RhdGEtc2tpbGxdJyk7XG4gICAgaWYgKCFza2lsbE5hbWUgfHwgIXJvdykgcmV0dXJuO1xuICAgIGNvbnN0IHByb2ZpY2llbmN5ID0gcm93LnF1ZXJ5U2VsZWN0b3IoJy5za2lsbC1wcm9maWNpZW5jeS1pbnB1dCcpPy52YWx1ZSB8fCAnJztcbiAgICBjb25zdCBzdWJza2lsbHNWYWx1ZSA9IHJvdy5xdWVyeVNlbGVjdG9yKCcuc2tpbGwtc3Vic2tpbGxzLWlucHV0Jyk/LnZhbHVlIHx8ICcnO1xuICAgIGNvbnN0IHBhcmVudGhldGljYWwgPSByb3cucXVlcnlTZWxlY3RvcignLnNraWxsLXBhcmVudGhldGljYWwtaW5wdXQnKT8udmFsdWUgfHwgJyc7XG4gICAgc2F2ZVNraWxsUXVhbGlmaWVyT3ZlcnJpZGUoc2tpbGxOYW1lLCB7XG4gICAgICBwcm9maWNpZW5jeSxcbiAgICAgIHN1YnNraWxsczogc3Vic2tpbGxzVmFsdWUsXG4gICAgICBwYXJlbnRoZXRpY2FsLFxuICAgIH0pLmNhdGNoKCgpID0+IHtcbiAgICAgIHNob3dUb2FzdCgnRmFpbGVkIHRvIHNhdmUgc2tpbGwgcXVhbGlmaWVycy4nLCAnZXJyb3InKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gVXBkYXRlIGRlcml2ZWQteWVhcnMgaGludCBsaXZlIGFzIHVzZXIgZWRpdHMgdGhlIGV4cGVyaWVuY2UgbWF0Y2ggaW5wdXRcbiAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJyNza2lsbHMtcmV2aWV3LXRhYmxlIHRib2R5Jyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgZSA9PiB7XG4gICAgY29uc3QgaW5wdXQgPSBlLnRhcmdldC5jbG9zZXN0KCcuc2tpbGwtbWF0Y2gtaW5wdXQnKTtcbiAgICBpZiAoIWlucHV0KSByZXR1cm47XG4gICAgY29uc3Qgc2tpbGxOYW1lID0gaW5wdXQuZGF0YXNldC5za2lsbDtcbiAgICBjb25zdCBpZHMgPSBpbnB1dC52YWx1ZS5zcGxpdCgnLCcpLm1hcCh4ID0+IHgudHJpbSgpKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgY29uc3QgeWVhcnMgPSBfY29tcHV0ZVllYXJzRnJvbUlkcyhpZHMsIGFsbEV4cGVyaWVuY2VzKTtcbiAgICBjb25zdCBoaW50ID0geWVhcnMgIT0gbnVsbCA/IGB+JHt5ZWFyc30geXIke3llYXJzID09PSAxID8gJycgOiAncyd9YCA6ICdubyBtYXRjaCc7XG4gICAgY29uc3Qgc3BhbiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKGAuZGVyaXZlZC15ZWFycy1oaW50W2RhdGEtc2tpbGw9XCIke0NTUy5lc2NhcGUoc2tpbGxOYW1lKX1cIl1gKTtcbiAgICBpZiAoc3Bhbikgc3Bhbi50ZXh0Q29udGVudCA9IGhpbnQ7XG4gIH0pO1xuXG4gIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcjc2tpbGxzLXJldmlldy10YWJsZSB0Ym9keScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGUgPT4ge1xuICAgIGNvbnN0IHR5cGVUb2dnbGUgPSBlLnRhcmdldC5jbG9zZXN0KCcuc2tpbGwtdHlwZS10b2dnbGUnKTtcbiAgICBpZiAodHlwZVRvZ2dsZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGNvbnN0IHNraWxsTmFtZSA9IHR5cGVUb2dnbGUuZGF0YXNldC5za2lsbDtcbiAgICAgIGNvbnN0IHRvZ2dsZVRvID0gdHlwZVRvZ2dsZS5kYXRhc2V0LnRvZ2dsZVRvIHx8IG51bGw7XG4gICAgICB3aW5kb3cuX3NraWxsVHlwZU92ZXJyaWRlcyA9IHdpbmRvdy5fc2tpbGxUeXBlT3ZlcnJpZGVzIHx8IHt9O1xuICAgICAgaWYgKHRvZ2dsZVRvKSB7XG4gICAgICAgIHdpbmRvdy5fc2tpbGxUeXBlT3ZlcnJpZGVzW3NraWxsTmFtZS50b0xvd2VyQ2FzZSgpXSA9IHRvZ2dsZVRvO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHdpbmRvdy5fc2tpbGxUeXBlT3ZlcnJpZGVzW3NraWxsTmFtZS50b0xvd2VyQ2FzZSgpXTtcbiAgICAgIH1cbiAgICAgIHNhdmVTa2lsbFF1YWxpZmllck92ZXJyaWRlKHNraWxsTmFtZSwge1xuICAgICAgICBwcm9maWNpZW5jeTogY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoYC5za2lsbC1wcm9maWNpZW5jeS1pbnB1dFtkYXRhLXNraWxsPVwiJHtfY3NzRXNjYXBlKHNraWxsTmFtZSl9XCJdYCk/LnZhbHVlIHx8ICcnLFxuICAgICAgICBzdWJza2lsbHM6IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKGAuc2tpbGwtc3Vic2tpbGxzLWlucHV0W2RhdGEtc2tpbGw9XCIke19jc3NFc2NhcGUoc2tpbGxOYW1lKX1cIl1gKT8udmFsdWUgfHwgJycsXG4gICAgICAgIHBhcmVudGhldGljYWw6IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKGAuc2tpbGwtcGFyZW50aGV0aWNhbC1pbnB1dFtkYXRhLXNraWxsPVwiJHtfY3NzRXNjYXBlKHNraWxsTmFtZSl9XCJdYCk/LnZhbHVlIHx8ICcnLFxuICAgICAgICBza2lsbF90eXBlOiB0b2dnbGVUbyB8fCAnJyxcbiAgICAgIH0pLnRoZW4oKCkgPT4gX3JlbmRlclNraWxsc1RhYmxlKGNvbnRhaW5lciwgcmVjb21tZW5kZWRTZXQsIGRhdGEsIGhhcmRTa2lsbFNldCwgc29mdFNraWxsU2V0KSlcbiAgICAgICAgLmNhdGNoKCgpID0+IHNob3dUb2FzdCgnRmFpbGVkIHRvIHNhdmUgc2tpbGwgdHlwZSBvdmVycmlkZS4nLCAnZXJyb3InKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYWlCdG4gPSBlLnRhcmdldC5jbG9zZXN0KCcuc2tpbGwtYXBwbHktYWknKTtcbiAgICBpZiAoYWlCdG4pIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBjb25zdCBza2lsbE5hbWUgPSBhaUJ0bi5kYXRhc2V0LnNraWxsO1xuICAgICAgY29uc3QgZmllbGQgPSBhaUJ0bi5kYXRhc2V0LmFpRmllbGQ7XG4gICAgICBjb25zdCB2YWx1ZSA9IGFpQnRuLmRhdGFzZXQuYWlWYWx1ZSB8fCAnJztcbiAgICAgIGlmIChmaWVsZCA9PT0gJ2NhdGVnb3J5Jykge1xuICAgICAgICBjb25zdCBpbnB1dCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKGAuc2tpbGwtY2F0ZWdvcnktaW5wdXRbZGF0YS1za2lsbD1cIiR7X2Nzc0VzY2FwZShza2lsbE5hbWUpfVwiXWApO1xuICAgICAgICBpZiAoaW5wdXQpIGlucHV0LnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHNhdmVTa2lsbENhdGVnb3J5T3ZlcnJpZGUoc2tpbGxOYW1lLCB2YWx1ZSlcbiAgICAgICAgICAudGhlbigoKSA9PiBfcmVuZGVyU2tpbGxzVGFibGUoY29udGFpbmVyLCByZWNvbW1lbmRlZFNldCwgZGF0YSwgaGFyZFNraWxsU2V0LCBzb2Z0U2tpbGxTZXQpKVxuICAgICAgICAgIC5jYXRjaCgoKSA9PiBzaG93VG9hc3QoJ0ZhaWxlZCB0byBhcHBseSBBSSBjYXRlZ29yeSBzdWdnZXN0aW9uLicsICdlcnJvcicpKTtcbiAgICAgIH0gZWxzZSBpZiAoZmllbGQgPT09ICdncm91cCcpIHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcihgLnNraWxsLWdyb3VwLWlucHV0W2RhdGEtc2tpbGw9XCIke19jc3NFc2NhcGUoc2tpbGxOYW1lKX1cIl1gKTtcbiAgICAgICAgaWYgKGlucHV0KSBpbnB1dC52YWx1ZSA9IHZhbHVlO1xuICAgICAgICBzYXZlU2tpbGxHcm91cE92ZXJyaWRlKHNraWxsTmFtZSwgdmFsdWUpXG4gICAgICAgICAgLnRoZW4oKCkgPT4gX3JlbmRlclNraWxsc1RhYmxlKGNvbnRhaW5lciwgcmVjb21tZW5kZWRTZXQsIGRhdGEsIGhhcmRTa2lsbFNldCwgc29mdFNraWxsU2V0KSlcbiAgICAgICAgICAuY2F0Y2goKCkgPT4gc2hvd1RvYXN0KCdGYWlsZWQgdG8gYXBwbHkgQUkgZ3JvdXAgc3VnZ2VzdGlvbi4nLCAnZXJyb3InKSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGJ0biA9IGUudGFyZ2V0LmNsb3Nlc3QoJy5pY29uLWJ0bicpO1xuICAgIGlmICghYnRuKSByZXR1cm47XG4gICAgY29uc3QgdHIgPSBidG4uY2xvc2VzdCgndHJbZGF0YS1za2lsbF0nKTtcbiAgICBpZiAoIXRyKSByZXR1cm47XG4gICAgY29uc3Qgc2tpbGxOYW1lID0gdHIuZGF0YXNldC5za2lsbDtcbiAgICBjb25zdCBhY3Rpb24gICAgPSBidG4uZGF0YXNldC5hY3Rpb247XG4gICAgaWYgKGFjdGlvbiA9PT0gJ3Jvdy11cCcpIHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBtb3ZlU2tpbGxSb3coc2tpbGxOYW1lLCAtMSk7XG4gICAgfSBlbHNlIGlmIChhY3Rpb24gPT09ICdyb3ctZG93bicpIHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBtb3ZlU2tpbGxSb3coc2tpbGxOYW1lLCArMSk7XG4gICAgfSBlbHNlIGlmIChhY3Rpb24pIHtcbiAgICAgIGhhbmRsZUFjdGlvbkNsaWNrKHNraWxsTmFtZSwgYWN0aW9uLCAnc2tpbGwnKTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcuc2tpbGwtY2F0ZWdvcnktbWFuYWdlcicpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGUgPT4ge1xuICAgIGNvbnN0IGJ0biA9IGUudGFyZ2V0LmNsb3Nlc3QoJy5pY29uLWJ0bltkYXRhLWFjdGlvbl49XCJjYXRlZ29yeS1cIl0nKTtcbiAgICBpZiAoIWJ0bikgcmV0dXJuO1xuICAgIGNvbnN0IGNhdGVnb3J5TmFtZSA9IGJ0bi5kYXRhc2V0LmNhdGVnb3J5IHx8ICcnO1xuICAgIGNvbnN0IGRpcmVjdGlvbiA9IGJ0bi5kYXRhc2V0LmFjdGlvbiA9PT0gJ2NhdGVnb3J5LXVwJyA/IC0xIDogMTtcbiAgICBjb25zdCB1cGRhdGVkT3JkZXIgPSBfbW92ZVNraWxsQ2F0ZWdvcnlMb2NhbGx5KGNhdGVnb3J5TmFtZSwgZGlyZWN0aW9uKTtcbiAgICBpZiAoIXVwZGF0ZWRPcmRlcikgcmV0dXJuO1xuICAgIHNhdmVTa2lsbENhdGVnb3J5T3JkZXIodXBkYXRlZE9yZGVyKVxuICAgICAgLnRoZW4oKCkgPT4gX3JlbmRlclNraWxsc1RhYmxlKGNvbnRhaW5lciwgcmVjb21tZW5kZWRTZXQsIGRhdGEsIGhhcmRTa2lsbFNldCwgc29mdFNraWxsU2V0KSlcbiAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgIF9tb3ZlU2tpbGxDYXRlZ29yeUxvY2FsbHkoY2F0ZWdvcnlOYW1lLCAtZGlyZWN0aW9uKTtcbiAgICAgICAgc2hvd1RvYXN0KCdGYWlsZWQgdG8gc2F2ZSBza2lsbCBjYXRlZ29yeSBvcmRlci4nLCAnZXJyb3InKTtcbiAgICAgIH0pO1xuICB9KTtcblxuICBjb25zdCBza2lsbFRvb2xiYXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgc2tpbGxUb29sYmFyLmNsYXNzTmFtZSA9ICdidWxrLXRvb2xiYXInO1xuICBza2lsbFRvb2xiYXIuaW5uZXJIVE1MID0gYFxuICAgIDxzcGFuPkJ1bGs6PC9zcGFuPlxuICAgIDxidXR0b24gY2xhc3M9XCJidWxrLWJ0biBidWxrLXJlY29tbWVuZGVkXCIgb25jbGljaz1cImJ1bGtBY3Rpb24oJ3JlY29tbWVuZGVkJywnc2tpbGwnKVwiIHRpdGxlPVwiU2V0IGFsbCB0byB0aGUgTExNIHJlY29tbWVuZGF0aW9uXCI+XHUyNzI4IEFjY2VwdCBBbGwgUmVjb21tZW5kZWQ8L2J1dHRvbj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnVsay1idG4gYnVsay1lbXBoYXNpemVcIiAgIG9uY2xpY2s9XCJidWxrQWN0aW9uKCdlbXBoYXNpemUnLCdza2lsbCcpXCI+XHUyNzk1IEVtcGhhc2l6ZSBBbGw8L2J1dHRvbj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnVsay1idG4gYnVsay1pbmNsdWRlXCIgICAgIG9uY2xpY2s9XCJidWxrQWN0aW9uKCdpbmNsdWRlJywnc2tpbGwnKVwiPlx1MjcxMyBJbmNsdWRlIEFsbDwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJidWxrLWJ0biBidWxrLWV4Y2x1ZGVcIiAgICAgb25jbGljaz1cImJ1bGtBY3Rpb24oJ2V4Y2x1ZGUnLCdza2lsbCcpXCI+JHtleWVTbGFzaEljb24oKX0gRXhjbHVkZSBBbGw8L2J1dHRvbj5cbiAgYDtcbiAgY29udGFpbmVyLmluc2VydEJlZm9yZShza2lsbFRvb2xiYXIsIGNvbnRhaW5lci5maXJzdENoaWxkKTtcblxuICAkKCcjc2tpbGxzLXJldmlldy10YWJsZScpLkRhdGFUYWJsZSh7XG4gICAgcGFnaW5nOiBmYWxzZSxcbiAgICBvcmRlcjogW10sXG4gICAgbGFuZ3VhZ2U6IHsgc2VhcmNoOiAnRmlsdGVyIHNraWxsczonIH1cbiAgfSk7XG4gIF91cGRhdGVQYWdlRXN0aW1hdGUoKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFJvdyByZW9yZGVyIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBtb3ZlU2tpbGxSb3coc2tpbGxOYW1lLCBkaXJlY3Rpb24pIHtcbiAgY29uc3QgYXJyID0gd2luZG93Ll9za2lsbHNPcmRlcmVkO1xuICBpZiAoIWFycikgcmV0dXJuO1xuICBjb25zdCBpZHggPSBhcnIuZmluZEluZGV4KHMgPT4gKHR5cGVvZiBzID09PSAnc3RyaW5nJyA/IHMgOiBzLm5hbWUgfHwgcykgPT09IHNraWxsTmFtZSk7XG4gIGlmIChpZHggPCAwKSByZXR1cm47XG4gIGNvbnN0IG5ld0lkeCA9IGlkeCArIGRpcmVjdGlvbjtcbiAgaWYgKG5ld0lkeCA8IDAgfHwgbmV3SWR4ID49IGFyci5sZW5ndGgpIHJldHVybjtcbiAgW2FycltpZHhdLCBhcnJbbmV3SWR4XV0gPSBbYXJyW25ld0lkeF0sIGFycltpZHhdXTtcbiAgd2luZG93Ll9za2lsbHNPcmRlcmVkID0gYXJyO1xuICBfcmVuZGVyU2tpbGxzVGFibGUobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7XG4gIGZldGNoKCcvYXBpL3Jlb3JkZXItcm93cycsIHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHR5cGU6ICdza2lsbCcsIG9yZGVyZWRfaWRzOiBhcnIubWFwKHMgPT4gKHR5cGVvZiBzID09PSAnc3RyaW5nJyA/IHMgOiBzLm5hbWUgfHwgcykpIH0pXG4gIH0pLmNhdGNoKCgpID0+IHt9KTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIExlZ2FjeSBpbnRlcmFjdGl2ZS1tb2RlIHJlc3BvbnNlIGhhbmRsZXIgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZVNraWxsc1Jlc3BvbnNlKG1lc3NhZ2UpIHtcbiAgd2luZG93LndhaXRpbmdGb3JTa2lsbHNSZXNwb25zZSA9IGZhbHNlO1xuICBjb25zdCByZXNwb25zZSA9IG1lc3NhZ2UudG9Mb3dlckNhc2UoKTtcblxuICBpZiAocmVzcG9uc2UuaW5jbHVkZXMoJ3llcycpKSB7XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ0V4Y2VsbGVudCEgSVxcJ2xsIHVzZSB0aGlzIHNraWxscyBzdHJhdGVneSBpbiB5b3VyIENWLicpO1xuICB9IGVsc2UgaWYgKHJlc3BvbnNlLmluY2x1ZGVzKCdubycpIHx8IHJlc3BvbnNlLmluY2x1ZGVzKCdtb2RpZnknKSkge1xuICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsICdJIHVuZGVyc3RhbmQuIFdoYXQgY2hhbmdlcyB3b3VsZCB5b3UgbGlrZSBtZSB0byBtYWtlIHRvIHRoZSBza2lsbHMgZW1waGFzaXM/Jyk7XG4gIH0gZWxzZSB7XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ0lcXCdsbCBub3RlIHlvdXIgZmVlZGJhY2sgb24gdGhlIHNraWxscyBzdHJhdGVneS4nKTtcbiAgfVxuXG4gIGZpbmlzaEludGVyYWN0aXZlUmV2aWV3KCk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBTdWJtaXQgZGVjaXNpb25zIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBzdWJtaXRTa2lsbERlY2lzaW9ucygpIHtcbiAgLyogZHVja2Zsb3c6XG4gICAqICAgaWQ6IHNraWxsc191aV9zdWJtaXRfbGl2ZVxuICAgKiAgIGtpbmQ6IHVpXG4gICAqICAgdGltZXN0YW1wOiAnMjAyNi0wMy0yNVQyMTozOTo0OFonXG4gICAqICAgc3RhdHVzOiBsaXZlXG4gICAqICAgaGFuZGxlczpcbiAgICogICAtIHVpOnNraWxscy1yZXZpZXcuc3VibWl0XG4gICAqICAgY2FsbHM6XG4gICAqICAgLSBQT1NUIC9hcGkvcmV2aWV3LWRlY2lzaW9uc1xuICAgKiAgIC0gUE9TVCAvYXBpL2N2L2xheW91dC1lc3RpbWF0ZVxuICAgKiAgIHJlYWRzOlxuICAgKiAgIC0gd2luZG93OnVzZXJTZWxlY3Rpb25zLnNraWxsc1xuICAgKiAgIC0gd2luZG93Ol9za2lsbHNPcmRlcmVkXG4gICAqICAgLSBkb206LnNraWxsLW1hdGNoLWlucHV0LnZhbHVlXG4gICAqICAgd3JpdGVzOlxuICAgKiAgIC0gcmVxdWVzdDpQT1NUIC9hcGkvcmV2aWV3LWRlY2lzaW9ucy5kZWNpc2lvbnNcbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL3Jldmlldy1kZWNpc2lvbnMuZXh0cmFfc2tpbGxzXG4gICAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9yZXZpZXctZGVjaXNpb25zLmV4dHJhX3NraWxsX21hdGNoZXNcbiAgICogICAtIHdpbmRvdzpfc2F2ZWREZWNpc2lvbnMuc2tpbGxfZGVjaXNpb25zXG4gICAqICAgLSB3aW5kb3c6X3NhdmVkRGVjaXNpb25zLmV4dHJhX3NraWxsc1xuICAgKiAgIC0gd2luZG93Ol9zYXZlZERlY2lzaW9ucy5leHRyYV9za2lsbF9tYXRjaGVzXG4gICAqICAgbm90ZXM6IFN1Ym1pdHMgc2tpbGwgaW5jbHVzaW9uIGRlY2lzaW9ucyB0b2dldGhlciB3aXRoIHNlc3Npb24tb25seSBleHRyYSBza2lsbHMgYW5kIGV4cGVyaWVuY2UtbWF0Y2ggZXZpZGVuY2Ugc28gYmFja2VuZCBnZW5lcmF0aW9uIGNhbiBtYXRlcmlhbGl6ZSB0aGUgc2FtZSBvdmVybGF5IHN0YXRlLlxuICAgKi9cbiAgY29uc3QgZGVjaXNpb25zID0gdXNlclNlbGVjdGlvbnMuc2tpbGxzO1xuICBjb25zdCBjb3VudCA9IE9iamVjdC5rZXlzKGRlY2lzaW9ucykubGVuZ3RoO1xuXG4gIGlmIChjb3VudCA9PT0gMCkge1xuICAgIHNob3dBbGVydE1vZGFsKCdObyBTZWxlY3Rpb25zJywgJ1BsZWFzZSBzZWxlY3QgYWN0aW9ucyBmb3IgYXQgbGVhc3Qgb25lIHNraWxsIGJlZm9yZSBzdWJtaXR0aW5nLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgZXh0cmFTa2lsbHMgPSAod2luZG93Ll9za2lsbHNPcmRlcmVkIHx8IFtdKVxuICAgICAgLmZpbHRlcihza2lsbCA9PiBza2lsbCAmJiB0eXBlb2Ygc2tpbGwgPT09ICdvYmplY3QnICYmIHNraWxsLl9pc05ldylcbiAgICAgIC5maWx0ZXIoc2tpbGwgPT4ge1xuICAgICAgICBjb25zdCBhY3Rpb24gPSBkZWNpc2lvbnNbX3NraWxsTmFtZShza2lsbCldO1xuICAgICAgICByZXR1cm4gYWN0aW9uID09PSAnaW5jbHVkZScgfHwgYWN0aW9uID09PSAnZW1waGFzaXplJyB8fCBhY3Rpb24gPT09ICdkZS1lbXBoYXNpemUnO1xuICAgICAgfSlcbiAgICAgIC5tYXAoc2tpbGwgPT4ge1xuICAgICAgICBpZiAoc2tpbGwuX2lzVXNlckNyZWF0ZWQpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogX3NraWxsTmFtZShza2lsbCksXG4gICAgICAgICAgICBjYXRlZ29yeTogU3RyaW5nKHNraWxsLmNhdGVnb3J5IHx8ICcnKS50cmltKCksXG4gICAgICAgICAgICBncm91cDogU3RyaW5nKHNraWxsLmdyb3VwIHx8ICcnKS50cmltKCksXG4gICAgICAgICAgICBwcm9maWNpZW5jeTogU3RyaW5nKHNraWxsLnByb2ZpY2llbmN5IHx8ICcnKS50cmltKCksXG4gICAgICAgICAgICBzdWJza2lsbHM6IF9ub3JtYWxpemVTa2lsbFN1YnNraWxscyhza2lsbC5zdWJza2lsbHMgfHwgc2tpbGwuc3ViX3NraWxscyB8fCBbXSksXG4gICAgICAgICAgICBwYXJlbnRoZXRpY2FsOiBTdHJpbmcoc2tpbGwucGFyZW50aGV0aWNhbCB8fCAnJykudHJpbSgpLFxuICAgICAgICAgICAgdXNlcl9jcmVhdGVkOiB0cnVlLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9za2lsbE5hbWUoc2tpbGwpO1xuICAgICAgfSk7XG4gICAgY29uc3QgZXh0cmFTa2lsbE5hbWVzID0gZXh0cmFTa2lsbHMubWFwKHNraWxsID0+IHR5cGVvZiBza2lsbCA9PT0gJ3N0cmluZycgPyBza2lsbCA6IHNraWxsLm5hbWUpO1xuXG4gICAgY29uc3QgbWF0Y2hJbnB1dHMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5za2lsbC1tYXRjaC1pbnB1dCcpKTtcbiAgICBjb25zdCBhbGxvd2VkID0gbmV3IFNldCgod2luZG93Ll9hbGxFeHBlcmllbmNlcyB8fCBbXSkubWFwKGUgPT4gZS5pZCkuZmlsdGVyKEJvb2xlYW4pKTtcbiAgICBjb25zdCBleHRyYVNraWxsTWF0Y2hlcyA9IHt9O1xuICAgIGZvciAoY29uc3QgaW5wdXQgb2YgbWF0Y2hJbnB1dHMpIHtcbiAgICAgIGNvbnN0IHNraWxsTmFtZSA9IGlucHV0LmRhdGFzZXQuc2tpbGw7XG4gICAgICBpZiAoIXNraWxsTmFtZSB8fCAhZXh0cmFTa2lsbE5hbWVzLmluY2x1ZGVzKHNraWxsTmFtZSkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgaWRzID0gU3RyaW5nKGlucHV0LnZhbHVlIHx8ICcnKVxuICAgICAgICAuc3BsaXQoJywnKVxuICAgICAgICAubWFwKCh4KSA9PiB4LnRyaW0oKSlcbiAgICAgICAgLmZpbHRlcigoeCkgPT4geCAmJiBhbGxvd2VkLmhhcyh4KSk7XG4gICAgICBpZiAoaWRzLmxlbmd0aCA+IDApIGV4dHJhU2tpbGxNYXRjaGVzW3NraWxsTmFtZV0gPSBpZHM7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9yZXZpZXctZGVjaXNpb25zJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgdHlwZTogJ3NraWxscycsXG4gICAgICAgIGRlY2lzaW9uczogZGVjaXNpb25zLFxuICAgICAgICBleHRyYV9za2lsbHM6IGV4dHJhU2tpbGxzLFxuICAgICAgICBleHRyYV9za2lsbF9tYXRjaGVzOiBleHRyYVNraWxsTWF0Y2hlcyxcbiAgICAgIH0pXG4gICAgfSk7XG5cbiAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgIHN0YXRlTWFuYWdlci5tYXJrQ29udGVudENoYW5nZWQoKTtcbiAgICAgIGNvbnN0IGV4dHJhTm90ZSA9IGV4dHJhU2tpbGxzLmxlbmd0aCA+IDBcbiAgICAgICAgPyBgICgke2V4dHJhU2tpbGxzLmxlbmd0aH0gbmV3IHNraWxsKHMpIGFkZGVkIFx1MjAxNCBhdmFpbGFibGUgZm9yIHdyaXRlLWJhY2sgdG8gbWFzdGVyIENWIGluIHRoZSBIYXJ2ZXN0IHRhYilgXG4gICAgICAgIDogJyc7XG4gICAgICBzaG93VG9hc3QoYFNraWxsIGRlY2lzaW9ucyBzYXZlZCAoJHtjb3VudH0gaXRlbXMpJHtleHRyYU5vdGV9YCk7XG4gICAgICBzY2hlZHVsZUF0c1JlZnJlc2goKTtcbiAgICAgIC8vIFBlcnNpc3Qgc2F2ZWQgZGVjaXNpb25zIGxvY2FsbHkgc28gdGhlIFVJIHJlZmxlY3RzIHRoZW0gaW1tZWRpYXRlbHlcbiAgICAgIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMgPSB3aW5kb3cuX3NhdmVkRGVjaXNpb25zIHx8IHt9O1xuICAgICAgd2luZG93Ll9zYXZlZERlY2lzaW9ucy5za2lsbF9kZWNpc2lvbnMgPSBkZWNpc2lvbnM7XG4gICAgICBpZiAoIXdpbmRvdy5fc2F2ZWREZWNpc2lvbnMuZXh0cmFfc2tpbGxzKSB3aW5kb3cuX3NhdmVkRGVjaXNpb25zLmV4dHJhX3NraWxscyA9IFtdO1xuICAgICAgaWYgKGV4dHJhU2tpbGxzLmxlbmd0aCA+IDApIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMuZXh0cmFfc2tpbGxzID0gZXh0cmFTa2lsbHM7XG4gICAgICB3aW5kb3cuX3NhdmVkRGVjaXNpb25zLmV4dHJhX3NraWxsX21hdGNoZXMgPSBleHRyYVNraWxsTWF0Y2hlcztcbiAgICAgIHVzZXJTZWxlY3Rpb25zLnNraWxscyA9IHsgLi4uZGVjaXNpb25zIH07XG4gICAgICBpZiAodHlwZW9mIHVwZGF0ZUluY2x1c2lvbkNvdW50cyA9PT0gJ2Z1bmN0aW9uJykgdXBkYXRlSW5jbHVzaW9uQ291bnRzKCk7XG4gICAgICBzd2l0Y2hUYWIoJ2FjaGlldmVtZW50cy1yZXZpZXcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZXJyb3IgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICBzaG93VG9hc3QoYEVycm9yOiAke2Vycm9yLmVycm9yIHx8ICdGYWlsZWQgdG8gc2F2ZSBkZWNpc2lvbnMnfWAsICdlcnJvcicpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cuZXJyb3IoJ0Vycm9yIHN1Ym1pdHRpbmcgc2tpbGwgZGVjaXNpb25zOicsIGVycm9yKTtcbiAgICBzaG93VG9hc3QoJ0ZhaWxlZCB0byBzYXZlIGRlY2lzaW9ucy4gUGxlYXNlIHRyeSBhZ2Fpbi4nLCAnZXJyb3InKTtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgRXhwb3J0cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZXhwb3J0IHtcbiAgX3BhcnNlWWVhckZyb21TdHIsXG4gIF9jb21wdXRlWWVhcnNGcm9tSWRzLFxuICBzYXZlU2tpbGxHcm91cE92ZXJyaWRlLFxuICBzYXZlU2tpbGxDYXRlZ29yeU92ZXJyaWRlLFxuICByZW5hbWVTa2lsbENhdGVnb3J5LFxuICBzYXZlU2tpbGxDYXRlZ29yeU9yZGVyLFxuICBzYXZlU2tpbGxRdWFsaWZpZXJPdmVycmlkZSxcbiAgc2F2ZVVzZXJDcmVhdGVkU2tpbGwsXG4gIGJ1aWxkU2tpbGxzUmV2aWV3VGFibGUsXG4gIF9yZW5kZXJTa2lsbHNUYWJsZSxcbiAgbW92ZVNraWxsUm93LFxuICBoYW5kbGVTa2lsbHNSZXNwb25zZSxcbiAgc3VibWl0U2tpbGxEZWNpc2lvbnMsXG59O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiBhY2hpZXZlbWVudHMtcmV2aWV3LmpzXG4gKiBFUyBtb2R1bGUgXHUyMDE0IEFjaGlldmVtZW50cyByZXZpZXcgdGFibGUsIGFjaGlldmVtZW50cyBlZGl0b3IsIGFuZCBBSSByZXdyaXRlIG1vZGFsLlxuICpcbiAqIERlcGVuZGVuY2llcyByZXNvbHZlZCB0aHJvdWdoIGdsb2JhbFRoaXMgYXQgcnVudGltZTpcbiAqICAgLSBwZW5kaW5nUmVjb21tZW5kYXRpb25zICAgICAgICAod2luZG93KVxuICogICAtIGFjaGlldmVtZW50RGVjaXNpb25zICAgICAgICAgICh3aW5kb3cgXHUyMDE0IGFsc28gaW5pdGlhbGlzZWQgaGVyZSlcbiAqICAgLSBfYWNoaWV2ZW1lbnRzT3JkZXJlZCAgICAgICAgICAod2luZG93IFx1MjAxNCBhbHNvIGluaXRpYWxpc2VkIGhlcmUpXG4gKiAgIC0gX3N1Z2dlc3RlZEFjaHNPcmRlcmVkICAgICAgICAgKHdpbmRvdylcbiAqICAgLSBfc2F2ZWREZWNpc2lvbnMgICAgICAgICAgICAgICAod2luZG93KVxuICogICAtIGFjaGlldmVtZW50RWRpdHMgICAgICAgICAgICAgICh3aW5kb3cpXG4gKiAgIC0gdXNlclNlbGVjdGlvbnMgICAgICAgICAgICAgICAgKHdpbmRvdylcbiAqICAgLSBnZXRBY2hpZXZlbWVudFJlY29tbWVuZGF0aW9uICAoZ2xvYmFsVGhpcyBmdW5jdGlvbilcbiAqICAgLSBnZXRBY2hpZXZlbWVudENvbmZpZGVuY2UgICAgICAoZ2xvYmFsVGhpcyBmdW5jdGlvbilcbiAqICAgLSBnZXRBY2hpZXZlbWVudFJlYXNvbmluZyAgICAgICAoZ2xvYmFsVGhpcyBmdW5jdGlvbilcbiAqICAgLSBlc2NhcGVIdG1sICAgICAgICAgICAgICAgICAgICAoZ2xvYmFsVGhpcyBmdW5jdGlvbilcbiAqICAgLSBoYW5kbGVBY2hpZXZlbWVudEFjdGlvbiAgICAgICAoZ2xvYmFsVGhpcyAvIHRoaXMgbW9kdWxlKVxuICogICAtIGJ1bGtBY2hpZXZlbWVudEFjdGlvbiAgICAgICAgIChnbG9iYWxUaGlzIC8gdGhpcyBtb2R1bGUpXG4gKiAgIC0gbW92ZUFjaGlldmVtZW50Um93ICAgICAgICAgICAgKGdsb2JhbFRoaXMgLyB0aGlzIG1vZHVsZSlcbiAqICAgLSBtb3ZlU3VnZ2VzdGVkQWNoaWV2ZW1lbnRSb3cgICAoZ2xvYmFsVGhpcyAvIHRoaXMgbW9kdWxlKVxuICogICAtIHNhdmVUb3BMZXZlbEFjaGlldmVtZW50RmllbGQgIChnbG9iYWxUaGlzIC8gdGhpcyBtb2R1bGUpXG4gKiAgIC0gc2F2ZVN1Z2dlc3RlZEFjaGlldmVtZW50RmllbGQgKGdsb2JhbFRoaXMgLyB0aGlzIG1vZHVsZSlcbiAqICAgLSBhaVJld3JpdGVUb3BMZXZlbEFjaGlldmVtZW50ICAoZ2xvYmFsVGhpcyAvIHRoaXMgbW9kdWxlKVxuICogICAtIGFpUmV3cml0ZVN1Z2dlc3RlZEFjaGlldmVtZW50IChnbG9iYWxUaGlzIC8gdGhpcyBtb2R1bGUpXG4gKiAgIC0gZGVsZXRlVG9wTGV2ZWxBY2hpZXZlbWVudCAgICAgKGdsb2JhbFRoaXMgLyB0aGlzIG1vZHVsZSlcbiAqICAgLSBkZWxldGVTdWdnZXN0ZWRBY2hpZXZlbWVudCAgICAoZ2xvYmFsVGhpcyAvIHRoaXMgbW9kdWxlKVxuICogICAtIHNob3dUb2FzdCAgICAgICAgICAgICAgICAgICAgIChnbG9iYWxUaGlzIGZ1bmN0aW9uKVxuICogICAtIHNjaGVkdWxlQXRzUmVmcmVzaCAgICAgICAgICAgIChnbG9iYWxUaGlzIGZ1bmN0aW9uKVxuICogICAtIHVwZGF0ZUluY2x1c2lvbkNvdW50cyAgICAgICAgIChnbG9iYWxUaGlzIGZ1bmN0aW9uKVxuICogICAtIHN3aXRjaFRhYiAgICAgICAgICAgICAgICAgICAgIChnbG9iYWxUaGlzIGZ1bmN0aW9uKVxuICogICAtIGNvbmZpcm1EaWFsb2cgICAgICAgICAgICAgICAgIChnbG9iYWxUaGlzIGZ1bmN0aW9uKVxuICogICAtIGNsb3NlQWxlcnRNb2RhbCAgICAgICAgICAgICAgIChnbG9iYWxUaGlzIGZ1bmN0aW9uKVxuICogICAtIHNldEluaXRpYWxGb2N1cyAgICAgICAgICAgICAgIChnbG9iYWxUaGlzIGZ1bmN0aW9uKVxuICogICAtIHRyYXBGb2N1cyAgICAgICAgICAgICAgICAgICAgIChnbG9iYWxUaGlzIGZ1bmN0aW9uKVxuICogICAtIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsICAgIChnbG9iYWxUaGlzKVxuICogICAtIENTUy5lc2NhcGUgICAgICAgICAgICAgICAgICAgIChicm93c2VyIGJ1aWx0LWluKVxuICovXG5cbmltcG9ydCB7IHN0YXRlTWFuYWdlciB9IGZyb20gJy4vc3RhdGUtbWFuYWdlci5qcyc7XG5pbXBvcnQgeyBleWVTbGFzaEljb24gfSBmcm9tICcuL3Jldmlldy1pY29ucy5qcyc7XG5cbi8vIE1vZHVsZS1sZXZlbCBzdGF0ZVxubGV0IF9yZXdyaXRlU3VnZ2VzdGlvbkhpc3RvcnkgPSBbXTtcbmxldCBfbGFzdFJld3JpdGVMb2dJZCA9IG51bGw7XG4vLyBDYWxsYmFja3MgZm9yIHRoZSBhY3RpdmUgcmV3cml0ZSBtb2RhbDogeyBleHBlcmllbmNlSW5kZXgsIG9uQWNjZXB0IH1cbmxldCBfcmV3cml0ZUNhbGxiYWNrcyA9IG51bGw7XG4vLyBUcmFja3MgYWNoaWV2ZW1lbnRzIHRoYXQgYXJlIG5ld2x5IHJlY29tbWVuZGVkIHNpbmNlIHRoZSBwcmV2aW91cyByZW5kZXIgKGZvciBcdUQ4M0NcdUREOTUgYmFkZ2VzKVxubGV0IF9uZXdSZWNvbW1lbmRlZEFjaHMgPSBuZXcgU2V0KCk7XG5cbmZ1bmN0aW9uIF9ub3JtYWxpemVBY2hpZXZlbWVudEVkaXRFbnRyeShlbnRyeSkge1xuICBpZiAoZW50cnkgJiYgdHlwZW9mIGVudHJ5ID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShlbnRyeSkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdGV4dDogU3RyaW5nKGVudHJ5LnRleHQgPz8gZW50cnkuZGVzY3JpcHRpb24gPz8gZW50cnkuY29udGVudCA/PyAnJyksXG4gICAgICBoaWRkZW46IEJvb2xlYW4oZW50cnkuaGlkZGVuKSxcbiAgICB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgdGV4dDogU3RyaW5nKGVudHJ5ID8/ICcnKSxcbiAgICBoaWRkZW46IGZhbHNlLFxuICB9O1xufVxuXG5mdW5jdGlvbiBfbm9ybWFsaXplQWNoaWV2ZW1lbnRFZGl0TGlzdChlbnRyaWVzKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShlbnRyaWVzKSkgcmV0dXJuIFtdO1xuICByZXR1cm4gZW50cmllcy5tYXAoX25vcm1hbGl6ZUFjaGlldmVtZW50RWRpdEVudHJ5KTtcbn1cblxuZnVuY3Rpb24gX2FjaGlldmVtZW50RW50cnlUZXh0KGVudHJ5KSB7XG4gIHJldHVybiBfbm9ybWFsaXplQWNoaWV2ZW1lbnRFZGl0RW50cnkoZW50cnkpLnRleHQ7XG59XG5cbmZ1bmN0aW9uIF9hY2hpZXZlbWVudEVudHJ5SGlkZGVuKGVudHJ5KSB7XG4gIHJldHVybiBfbm9ybWFsaXplQWNoaWV2ZW1lbnRFZGl0RW50cnkoZW50cnkpLmhpZGRlbjtcbn1cblxud2luZG93LmFjaGlldmVtZW50RGVjaXNpb25zID0ge307XG53aW5kb3cuX2FjaGlldmVtZW50c09yZGVyZWQgPSBudWxsO1xuXG4vLyBTbWFsbCBmZXRjaCBoZWxwZXIgd2l0aCB0aW1lb3V0IHRvIGF2b2lkIGxlYXZpbmcgbG9hZGVycyB2aXNpYmxlIG9uIGhhbmdpbmcgcmVxdWVzdHNcbmFzeW5jIGZ1bmN0aW9uIGZldGNoSnNvbldpdGhUaW1lb3V0KHVybCwgb3B0cyA9IHt9LCB0aW1lb3V0ID0gNzAwMCkge1xuICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICBjb25zdCBzaWduYWwgPSBjb250cm9sbGVyLnNpZ25hbDtcbiAgY29uc3QgaWQgPSBzZXRUaW1lb3V0KCgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKSwgdGltZW91dCk7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2godXJsLCBPYmplY3QuYXNzaWduKHt9LCBvcHRzLCB7IHNpZ25hbCB9KSk7XG4gICAgY2xlYXJUaW1lb3V0KGlkKTtcbiAgICByZXR1cm4gcmVzO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjbGVhclRpbWVvdXQoaWQpO1xuICAgIHRocm93IGVycjtcbiAgfVxufVxuXG5mdW5jdGlvbiBfYWNoU25hcHNob3RLZXkoKSB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2lkID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKS5nZXQoJ3Nlc3Npb24nKTtcbiAgICByZXR1cm4gc2lkID8gYGFjaF9zbmFwXyR7c2lkfWAgOiBudWxsO1xuICB9IGNhdGNoIChfKSB7IHJldHVybiBudWxsOyB9XG59XG5mdW5jdGlvbiBfc2F2ZUFjaFNuYXBzaG90KHJlY29tbWVuZGVkSWRzKSB7XG4gIGNvbnN0IGtleSA9IF9hY2hTbmFwc2hvdEtleSgpO1xuICBpZiAoIWtleSkgcmV0dXJuO1xuICB0cnkgeyBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIEpTT04uc3RyaW5naWZ5KFsuLi5yZWNvbW1lbmRlZElkc10pKTsgfSBjYXRjaCAoXykge31cbn1cbmZ1bmN0aW9uIF9nZXRBY2hTbmFwc2hvdCgpIHtcbiAgY29uc3Qga2V5ID0gX2FjaFNuYXBzaG90S2V5KCk7XG4gIGlmICgha2V5KSByZXR1cm4gbnVsbDtcbiAgdHJ5IHtcbiAgICBjb25zdCByYXcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuICAgIHJldHVybiByYXcgPyBuZXcgU2V0KEpTT04ucGFyc2UocmF3KSkgOiBudWxsO1xuICB9IGNhdGNoIChfKSB7IHJldHVybiBudWxsOyB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkQWNoaWV2ZW1lbnRzUmV2aWV3VGFibGUoKSB7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhY2hpZXZlbWVudHMtdGFibGUtY29udGFpbmVyJyk7XG4gIGlmICghY29udGFpbmVyKSByZXR1cm47XG5cbiAgY29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTJweDtwYWRkaW5nOjIwcHg7Y29sb3I6IzZiNzI4MDtcIj48ZGl2IGNsYXNzPVwibG9hZGluZy1zcGlubmVyXCIgc3R5bGU9XCJ3aWR0aDoyMHB4O2hlaWdodDoyMHB4O2JvcmRlci13aWR0aDoycHg7ZmxleC1zaHJpbms6MDtcIj48L2Rpdj48c3Bhbj5Mb2FkaW5nIGFjaGlldmVtZW50c1x1MjAyNjwvc3Bhbj48L2Rpdj4nO1xuXG4gIC8vIFByZWZlciBzZXNzaW9uLWF3YXJlIHN0YXR1cyBkYXRhIHNvIHJldmlldy10aW1lIG92ZXJsYXlzIGFyZSByZWZsZWN0ZWQuXG4gIGxldCBhbGxBY2hpZXZlbWVudHMgPSBbXTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaEpzb25XaXRoVGltZW91dCgnL2FwaS9zdGF0dXMnLCB7fSwgNzAwMCk7XG4gICAgaWYgKCFyZXMub2spIHRocm93IG5ldyBFcnJvcignc3RhdHVzIG5vdCBvaycpO1xuICAgIGNvbnN0IHN0YXR1c0RhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGFsbEFjaGlldmVtZW50cyA9IHN0YXR1c0RhdGEuYWxsX2FjaGlldmVtZW50cyB8fCBbXTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gU2Vjb25kYXJ5IGZhbGxiYWNrOiByYXcgbWFzdGVyIGZpZWxkcy5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzMiA9IGF3YWl0IGZldGNoSnNvbldpdGhUaW1lb3V0KCcvYXBpL21hc3Rlci1maWVsZHMnLCB7fSwgNzAwMCk7XG4gICAgICBpZiAoIXJlczIub2spIHRocm93IG5ldyBFcnJvcignbWFzdGVyLWZpZWxkcyBub3Qgb2snKTtcbiAgICAgIGNvbnN0IG1hc3RlckRhdGEgPSBhd2FpdCByZXMyLmpzb24oKTtcbiAgICAgIGFsbEFjaGlldmVtZW50cyA9IG1hc3RlckRhdGEuc2VsZWN0ZWRfYWNoaWV2ZW1lbnRzIHx8IFtdO1xuICAgIH0gY2F0Y2ggKGVycjIpIHtcbiAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnPHAgc3R5bGU9XCJjb2xvcjojZWY0NDQ0O3BhZGRpbmc6MjBweDtcIj5GYWlsZWQgdG8gbG9hZCBhY2hpZXZlbWVudHMuPC9wPic7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaWYgKGFsbEFjaGlldmVtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJzxwIHN0eWxlPVwicGFkZGluZzoyMHB4O2NvbG9yOiM2YjcyODA7XCI+Tm8ga2V5IGFjaGlldmVtZW50cyBmb3VuZCBpbiBtYXN0ZXIgQ1YgZGF0YS48L3A+JztcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBXcmFwIGluaXRpYWxpc2F0aW9uICsgcmVuZGVyIHNvIGFuIHVuZXhwZWN0ZWQgZXhjZXB0aW9uIHJlcGxhY2VzIHRoZVxuICAvLyBzcGlubmVyIGluc3RlYWQgb2YgbGVhdmluZyBpdCBmcm96ZW4gaW5kZWZpbml0ZWx5LlxuICB0cnkge1xuICAgIGNvbnN0IGRhdGEgPSB3aW5kb3cucGVuZGluZ1JlY29tbWVuZGF0aW9ucyB8fCB7fTtcbiAgICBjb25zdCByZWNvbW1lbmRlZFNldCA9IG5ldyBTZXQoZGF0YS5yZWNvbW1lbmRlZF9hY2hpZXZlbWVudHMgfHwgW10pO1xuXG4gICAgLy8gU29ydDogcmVjb21tZW5kZWQgZmlyc3QsIHRoZW4gYnkgaW1wb3J0YW5jZSBkZXNjZW5kaW5nIChvbmx5IG9uIGZpcnN0IGxvYWQpXG4gICAgaWYgKCF3aW5kb3cuX2FjaGlldmVtZW50c09yZGVyZWQpIHtcbiAgICAgIGFsbEFjaGlldmVtZW50cyA9IFsuLi5hbGxBY2hpZXZlbWVudHNdLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgY29uc3QgYVJlYyA9IHJlY29tbWVuZGVkU2V0LmhhcyhhLmlkKSA/IDEgOiAwO1xuICAgICAgICBjb25zdCBiUmVjID0gcmVjb21tZW5kZWRTZXQuaGFzKGIuaWQpID8gMSA6IDA7XG4gICAgICAgIGlmIChiUmVjICE9PSBhUmVjKSByZXR1cm4gYlJlYyAtIGFSZWM7XG4gICAgICAgIHJldHVybiAoYi5pbXBvcnRhbmNlIHx8IDApIC0gKGEuaW1wb3J0YW5jZSB8fCAwKTtcbiAgICAgIH0pO1xuICAgICAgd2luZG93Ll9hY2hpZXZlbWVudHNPcmRlcmVkID0gYWxsQWNoaWV2ZW1lbnRzO1xuICAgIH1cblxuICAgIC8vIEluaXRpYWxpc2UgZGVjaXNpb25zXG4gICAgd2luZG93LmFjaGlldmVtZW50RGVjaXNpb25zID0ge307XG4gICAgd2luZG93Ll9hY2hpZXZlbWVudHNPcmRlcmVkLmZvckVhY2goYWNoID0+IHtcbiAgICAgIGNvbnN0IHJlYyA9IGdldEFjaGlldmVtZW50UmVjb21tZW5kYXRpb24oYWNoLmlkLCBkYXRhKTtcbiAgICAgIGxldCBkZWZhdWx0QWN0aW9uID0gJ2luY2x1ZGUnO1xuICAgICAgaWYgKHJlYyA9PT0gJ0VtcGhhc2l6ZScpICAgICAgICAgZGVmYXVsdEFjdGlvbiA9ICdlbXBoYXNpemUnO1xuICAgICAgZWxzZSBpZiAocmVjID09PSAnSW5jbHVkZScpICAgICAgZGVmYXVsdEFjdGlvbiA9ICdpbmNsdWRlJztcbiAgICAgIGVsc2UgaWYgKHJlYyA9PT0gJ0RlLWVtcGhhc2l6ZScpIGRlZmF1bHRBY3Rpb24gPSAnZGUtZW1waGFzaXplJztcbiAgICAgIGVsc2UgaWYgKHJlYyA9PT0gJ09taXQnKSAgICAgICAgIGRlZmF1bHRBY3Rpb24gPSAnZXhjbHVkZSc7XG4gICAgICB3aW5kb3cuYWNoaWV2ZW1lbnREZWNpc2lvbnNbYWNoLmlkXSA9IGRlZmF1bHRBY3Rpb247XG4gICAgfSk7XG4gICAgLy8gQXBwbHkgYW55IHByZXZpb3VzbHkgc2F2ZWQgdXNlciBkZWNpc2lvbnMgb3ZlciB0aGUgTExNIGRlZmF1bHRzXG4gICAgY29uc3Qgc2F2ZWRBY2hEZWNzID0gd2luZG93Ll9zYXZlZERlY2lzaW9ucz8uYWNoaWV2ZW1lbnRfZGVjaXNpb25zIHx8IHt9O1xuICAgIGlmIChPYmplY3Qua2V5cyhzYXZlZEFjaERlY3MpLmxlbmd0aCA+IDApIE9iamVjdC5hc3NpZ24od2luZG93LmFjaGlldmVtZW50RGVjaXNpb25zLCBzYXZlZEFjaERlY3MpO1xuXG4gICAgLy8gQWxzbyBoYW5kbGUgQUktc3VnZ2VzdGVkIGFjaGlldmVtZW50cyBcdTIwMTQgYXNzaWduIHN0YWJsZSBJRHMgb25jZSBvbiBmaXJzdCBsb2FkXG4gICAgLy8gc28gdGhhdCByZW9yZGVyIC8gZGVsZXRlIG9wZXJhdGlvbnMgbmV2ZXIgbmVlZCB0byByZW1hcCBkZWNpc2lvbiBrZXlzLlxuICAgIGlmICghd2luZG93Ll9zdWdnZXN0ZWRBY2hzT3JkZXJlZCkge1xuICAgICAgbGV0IGNvdW50ZXIgPSAwO1xuICAgICAgd2luZG93Ll9zdWdnZXN0ZWRBY2hzT3JkZXJlZCA9IChkYXRhLnN1Z2dlc3RlZF9hY2hpZXZlbWVudHMgfHwgW10pLm1hcChzID0+IHtcbiAgICAgICAgY29uc3QgaXRlbSA9IE9iamVjdC5hc3NpZ24oe30sIHMpO1xuICAgICAgICBpdGVtLl9zdWdnSWQgPSBgc3VnZzo6JHtjb3VudGVyKyt9YDtcbiAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICB9KTtcbiAgICB9XG4gICAgd2luZG93Ll9zdWdnZXN0ZWRBY2hzT3JkZXJlZC5mb3JFYWNoKHMgPT4ge1xuICAgICAgaWYgKCEocy5fc3VnZ0lkIGluIHdpbmRvdy5hY2hpZXZlbWVudERlY2lzaW9ucykpIHdpbmRvdy5hY2hpZXZlbWVudERlY2lzaW9uc1tzLl9zdWdnSWRdID0gJ2luY2x1ZGUnO1xuICAgIH0pO1xuXG4gICAgY29uc3QgcHJldkFjaFNuYXAgPSBfZ2V0QWNoU25hcHNob3QoKTtcbiAgICBfbmV3UmVjb21tZW5kZWRBY2hzID0gcHJldkFjaFNuYXBcbiAgICAgID8gbmV3IFNldChbLi4ucmVjb21tZW5kZWRTZXRdLmZpbHRlcihpZCA9PiAhcHJldkFjaFNuYXAuaGFzKGlkKSkpXG4gICAgICA6IG5ldyBTZXQoKTtcbiAgICBfc2F2ZUFjaFNuYXBzaG90KHJlY29tbWVuZGVkU2V0KTtcblxuICAgIF9yZW5kZXJBY2hpZXZlbWVudHNSZXZpZXdUYWJsZShjb250YWluZXIpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZSAqL1xuICAgIGNvbnNvbGUuZXJyb3IoJ2J1aWxkQWNoaWV2ZW1lbnRzUmV2aWV3VGFibGU6IHJlbmRlciBlcnJvcjonLCBlcnIpO1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnPHAgc3R5bGU9XCJjb2xvcjojZWY0NDQ0O3BhZGRpbmc6MjBweDtcIj5FcnJvciByZW5kZXJpbmcgYWNoaWV2ZW1lbnRzIHRhYmxlLiBQbGVhc2UgcmVsb2FkIGFuZCB0cnkgYWdhaW4uPC9wPic7XG4gIH1cbn1cblxuZnVuY3Rpb24gX3JlbmRlckFjaGlldmVtZW50c1Jldmlld1RhYmxlKGNvbnRhaW5lcikge1xuICBpZiAoIWNvbnRhaW5lcikgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaGlldmVtZW50cy10YWJsZS1jb250YWluZXInKTtcbiAgaWYgKCFjb250YWluZXIpIHJldHVybjtcblxuICBjb25zdCBkYXRhID0gd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnMgfHwge307XG4gIGNvbnN0IG9yZGVyZWRBY2hzICA9IHdpbmRvdy5fYWNoaWV2ZW1lbnRzT3JkZXJlZCB8fCBbXTtcbiAgY29uc3Qgc3VnZ2VzdGVkQWNocyA9IHdpbmRvdy5fc3VnZ2VzdGVkQWNoc09yZGVyZWQgfHwgW107XG5cbiAgLy8gQnVpbGQgZmlsdGVyICsgdGFibGUgSFRNTFxuICBsZXQgaHRtbCA9IGBcbiAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDoxMnB4O2FsaWduLWl0ZW1zOmNlbnRlcjttYXJnaW4tYm90dG9tOjEycHg7XCI+XG4gICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImFjaC1yZXZpZXctZmlsdGVyXCJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCJGaWx0ZXIgYWNoaWV2ZW1lbnRzXHUyMDI2XCJcbiAgICAgICAgb25pbnB1dD1cIl9maWx0ZXJBY2hpZXZlbWVudHNUYWJsZSh0aGlzLnZhbHVlKVwiXG4gICAgICAgIHN0eWxlPVwiZmxleDoxO3BhZGRpbmc6NnB4IDEwcHg7Ym9yZGVyOjFweCBzb2xpZCAjZDFkNWRiO2JvcmRlci1yYWRpdXM6NnB4O2ZvbnQtc2l6ZTowLjllbTtcIj5cbiAgICAgIDxzcGFuIGlkPVwiYWNoLXJldmlldy1jb3VudFwiIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtjb2xvcjojNmI3MjgwO3doaXRlLXNwYWNlOm5vd3JhcDtcIj4ke29yZGVyZWRBY2hzLmxlbmd0aCArIHN1Z2dlc3RlZEFjaHMubGVuZ3RofSBhY2hpZXZlbWVudHM8L3NwYW4+XG4gICAgPC9kaXY+XG4gICAgPHRhYmxlIGlkPVwiYWNoaWV2ZW1lbnRzLXJldmlldy10YWJsZVwiIGNsYXNzPVwicmV2aWV3LXRhYmxlXCIgc3R5bGU9XCJ3aWR0aDoxMDAlO2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTtcIj5cbiAgICAgIDx0aGVhZD5cbiAgICAgICAgPHRyPlxuICAgICAgICAgIDx0aD5BY2hpZXZlbWVudDwvdGg+XG4gICAgICAgICAgPHRoPlJlY29tbWVuZGF0aW9uPC90aD5cbiAgICAgICAgICA8dGg+Q29uZmlkZW5jZTwvdGg+XG4gICAgICAgICAgPHRoPlJlYXNvbmluZzwvdGg+XG4gICAgICAgICAgPHRoPlNlbGVjdGlvbjwvdGg+XG4gICAgICAgIDwvdHI+XG4gICAgICA8L3RoZWFkPlxuICAgICAgPHRib2R5PlxuICBgO1xuXG4gIG9yZGVyZWRBY2hzLmZvckVhY2goKGFjaCwgcm93SWR4KSA9PiB7XG4gICAgY29uc3QgaWQgICAgICAgICAgICAgPSBhY2guaWQgfHwgYWNoLnRpdGxlIHx8ICcnO1xuICAgIGNvbnN0IHRpdGxlICAgICAgICAgID0gYWNoLnRpdGxlIHx8IGlkO1xuICAgIGNvbnN0IGRlc2MgICAgICAgICAgID0gYWNoLmRlc2NyaXB0aW9uIHx8ICcnO1xuICAgIGNvbnN0IHJlY29tbWVuZGF0aW9uID0gZ2V0QWNoaWV2ZW1lbnRSZWNvbW1lbmRhdGlvbihpZCwgZGF0YSk7XG4gICAgY29uc3QgY29uZmlkZW5jZSAgICAgPSBnZXRBY2hpZXZlbWVudENvbmZpZGVuY2UoaWQsIGRhdGEsIGFjaC5pbXBvcnRhbmNlKTtcbiAgICBjb25zdCByZWFzb25pbmcgICAgICA9IGdldEFjaGlldmVtZW50UmVhc29uaW5nKGlkLCBkYXRhLCBhY2gpO1xuICAgIGNvbnN0IGRlZmF1bHRBY3Rpb24gID0gd2luZG93LmFjaGlldmVtZW50RGVjaXNpb25zW2lkXSB8fCAnaW5jbHVkZSc7XG4gICAgY29uc3QgY29uZmlkZW5jZUJhZGdlID0gYDxzcGFuIGNsYXNzPVwiY29uZmlkZW5jZS1iYWRnZSBjb25maWRlbmNlLSR7Y29uZmlkZW5jZS5sZXZlbH1cIj4ke2NvbmZpZGVuY2UudGV4dH08L3NwYW4+YDtcbiAgICBjb25zdCByZXJ1bk5ld0JhZGdlID0gX25ld1JlY29tbWVuZGVkQWNocy5oYXMoaWQpXG4gICAgICA/ICc8c3BhbiBjbGFzcz1cInJ3LWNoYW5nZS1iYWRnZSBydy1jaGFuZ2UtbmV3XCIgYXJpYS1sYWJlbD1cIk5ldyByZWNvbW1lbmRhdGlvbiBzaW5jZSBwcmV2aW91cyBydW5cIj5cdUQ4M0NcdUREOTUgTmV3PC9zcGFuPidcbiAgICAgIDogJyc7XG4gICAgY29uc3QgaXNGaXJzdCA9IHJvd0lkeCA9PT0gMDtcbiAgICBjb25zdCBpc0xhc3QgID0gcm93SWR4ID09PSBvcmRlcmVkQWNocy5sZW5ndGggLSAxO1xuXG4gICAgaHRtbCArPSBgXG4gICAgICA8dHIgZGF0YS1hY2gtaWQ9XCIke2VzY2FwZUh0bWwoaWQpfVwiPlxuICAgICAgICA8dGQgc3R5bGU9XCJtaW4td2lkdGg6MjIwcHg7XCI+XG4gICAgICAgICAgPGlucHV0IGlkPVwiYWNoLXRpdGxlLSR7ZXNjYXBlSHRtbChpZCl9XCJcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCIgdmFsdWU9XCIke2VzY2FwZUh0bWwodGl0bGUpfVwiXG4gICAgICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Zm9udC13ZWlnaHQ6NjAwO3BhZGRpbmc6M3B4IDZweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo0cHg7Zm9udC1zaXplOjAuOWVtO2JveC1zaXppbmc6Ym9yZGVyLWJveDtcIlxuICAgICAgICAgICAgb25ibHVyPVwic2F2ZVRvcExldmVsQWNoaWV2ZW1lbnRGaWVsZCgnJHtlc2NhcGVIdG1sKGlkKX0nLCAndGl0bGUnLCB0aGlzLnZhbHVlKVwiXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiQWNoaWV2ZW1lbnQgdGl0bGVcIj4ke3JlcnVuTmV3QmFkZ2V9XG4gICAgICAgICAgPHRleHRhcmVhIGlkPVwiYWNoLWRlc2MtJHtlc2NhcGVIdG1sKGlkKX1cIlxuICAgICAgICAgICAgcm93cz1cIjJcIlxuICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDoxMDAlO21hcmdpbi10b3A6NHB4O3BhZGRpbmc6M3B4IDZweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo0cHg7Zm9udC1zaXplOjAuODVlbTtyZXNpemU6dmVydGljYWw7Ym94LXNpemluZzpib3JkZXItYm94O1wiXG4gICAgICAgICAgICBvbmJsdXI9XCJzYXZlVG9wTGV2ZWxBY2hpZXZlbWVudEZpZWxkKCcke2VzY2FwZUh0bWwoaWQpfScsICdkZXNjcmlwdGlvbicsIHRoaXMudmFsdWUpXCJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJBY2hpZXZlbWVudCBkZXNjcmlwdGlvblwiXG4gICAgICAgICAgPiR7ZXNjYXBlSHRtbChkZXNjKX08L3RleHRhcmVhPlxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQ+PHN0cm9uZz4ke2VzY2FwZUh0bWwocmVjb21tZW5kYXRpb24pfTwvc3Ryb25nPjwvdGQ+XG4gICAgICAgIDx0ZD4ke2NvbmZpZGVuY2VCYWRnZX08L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJtYXgtd2lkdGg6MjAwcHg7XCI+PHNtYWxsPiR7ZXNjYXBlSHRtbChyZWFzb25pbmcpfTwvc21hbGw+PC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwiYWN0aW9uLWJ0bnNcIiBzdHlsZT1cIndoaXRlLXNwYWNlOm5vd3JhcDtcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG4gJHtkZWZhdWx0QWN0aW9uID09PSAnZW1waGFzaXplJyAgICA/ICdhY3RpdmUnIDogJyd9XCIgZGF0YS1hY3Rpb249XCJlbXBoYXNpemVcIiAgICBhcmlhLWxhYmVsPVwiRW1waGFzaXplICR7ZXNjYXBlSHRtbCh0aXRsZSl9XCIgICAgdGl0bGU9XCJFbXBoYXNpemUgXHUyMDE0IGZlYXR1cmUgcHJvbWluZW50bHlcIiAgc3R5bGU9XCJjb2xvcjojMTBiOTgxO1wiPlx1Mjc5NTwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0biAke2RlZmF1bHRBY3Rpb24gPT09ICdpbmNsdWRlJyAgICAgID8gJ2FjdGl2ZScgOiAnJ31cIiBkYXRhLWFjdGlvbj1cImluY2x1ZGVcIiAgICAgIGFyaWEtbGFiZWw9XCJJbmNsdWRlICR7ZXNjYXBlSHRtbCh0aXRsZSl9XCIgICAgICB0aXRsZT1cIkluY2x1ZGUgXHUyMDE0IHN0YW5kYXJkIHRyZWF0bWVudFwiPlx1MjcxMzwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0biAke2RlZmF1bHRBY3Rpb24gPT09ICdkZS1lbXBoYXNpemUnID8gJ2FjdGl2ZScgOiAnJ31cIiBkYXRhLWFjdGlvbj1cImRlLWVtcGhhc2l6ZVwiIGFyaWEtbGFiZWw9XCJEZS1lbXBoYXNpemUgJHtlc2NhcGVIdG1sKHRpdGxlKX1cIiB0aXRsZT1cIkRlLWVtcGhhc2l6ZSBcdTIwMTQgYnJpZWYgbWVudGlvbiBvbmx5XCIgIHN0eWxlPVwiY29sb3I6I2Y1OWUwYjtcIj5cdTI3OTY8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG4gJHtkZWZhdWx0QWN0aW9uID09PSAnZXhjbHVkZScgICAgICA/ICdhY3RpdmUnIDogJyd9XCIgZGF0YS1hY3Rpb249XCJleGNsdWRlXCIgICAgICBhcmlhLWxhYmVsPVwiRXhjbHVkZSAke2VzY2FwZUh0bWwodGl0bGUpfVwiICAgICAgdGl0bGU9XCJFeGNsdWRlIFx1MjAxNCBvbWl0IGZyb20gQ1ZcIiAgICAgICAgICAgIHN0eWxlPVwiY29sb3I6I2VmNDQ0NDtcIj4ke2V5ZVNsYXNoSWNvbigpfTwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIGFyaWEtbGFiZWw9XCJBSSByZXdyaXRlICR7ZXNjYXBlSHRtbCh0aXRsZSl9XCIgdGl0bGU9XCJBSSByZXdyaXRlIGRlc2NyaXB0aW9uXCIgb25jbGljaz1cImFpUmV3cml0ZVRvcExldmVsQWNoaWV2ZW1lbnQoJyR7ZXNjYXBlSHRtbChpZCl9JylcIj5cdTI3Mjg8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBhcmlhLWxhYmVsPVwiTW92ZSAke2VzY2FwZUh0bWwodGl0bGUpfSBlYXJsaWVyXCIgdGl0bGU9XCJNb3ZlIHVwXCIgICAke2lzRmlyc3QgPyAnZGlzYWJsZWQnIDogJyd9IG9uY2xpY2s9XCJtb3ZlQWNoaWV2ZW1lbnRSb3coJyR7ZXNjYXBlSHRtbChpZCl9JywtMSlcIj5cdTIxOTE8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBhcmlhLWxhYmVsPVwiTW92ZSAke2VzY2FwZUh0bWwodGl0bGUpfSBsYXRlclwiICAgdGl0bGU9XCJNb3ZlIGRvd25cIiAke2lzTGFzdCAgPyAnZGlzYWJsZWQnIDogJyd9IG9uY2xpY2s9XCJtb3ZlQWNoaWV2ZW1lbnRSb3coJyR7ZXNjYXBlSHRtbChpZCl9JywrMSlcIj5cdTIxOTM8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBhcmlhLWxhYmVsPVwiRGVsZXRlICR7ZXNjYXBlSHRtbCh0aXRsZSl9XCIgdGl0bGU9XCJEZWxldGUgYWNoaWV2ZW1lbnRcIiBvbmNsaWNrPVwiZGVsZXRlVG9wTGV2ZWxBY2hpZXZlbWVudCgnJHtlc2NhcGVIdG1sKGlkKX0nKVwiIHN0eWxlPVwiY29sb3I6I2VmNDQ0NDtcIj5cdUQ4M0RcdURERDE8L2J1dHRvbj5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvdHI+XG4gICAgYDtcbiAgfSk7XG5cbiAgLy8gQUktc3VnZ2VzdGVkIGFjaGlldmVtZW50cyBcdTIwMTQgZnVsbCBlZGl0aW5nL2NvbnRyb2wgcGFyaXR5IHdpdGggdXNlciBhY2hpZXZlbWVudHNcbiAgc3VnZ2VzdGVkQWNocy5mb3JFYWNoKChzdWdnLCByb3dJZHgpID0+IHtcbiAgICBjb25zdCBzdWdnSWQgICAgICA9IHN1Z2cuX3N1Z2dJZDtcbiAgICBjb25zdCBjb25mUmF3ICAgICA9IChzdWdnLmNvbmZpZGVuY2UgfHwgJ01lZGl1bScpLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgY29uZkxldmVsICAgPSBjb25mUmF3LmluY2x1ZGVzKCdoaWdoJykgPyAnaGlnaCcgOiBjb25mUmF3LmluY2x1ZGVzKCdsb3cnKSA/ICdsb3cnIDogJ21lZGl1bSc7XG4gICAgY29uc3QgY29uZlRleHQgICAgPSBzdWdnLmNvbmZpZGVuY2UgfHwgJ01lZGl1bSc7XG4gICAgY29uc3QgZGVmYXVsdEFjdGlvbiA9IHdpbmRvdy5hY2hpZXZlbWVudERlY2lzaW9uc1tzdWdnSWRdIHx8ICdpbmNsdWRlJztcbiAgICBjb25zdCBpc0ZpcnN0ICAgICA9IHJvd0lkeCA9PT0gMDtcbiAgICBjb25zdCBpc0xhc3QgICAgICA9IHJvd0lkeCA9PT0gc3VnZ2VzdGVkQWNocy5sZW5ndGggLSAxO1xuXG4gICAgaHRtbCArPSBgXG4gICAgICA8dHIgZGF0YS1hY2gtaWQ9XCIke2VzY2FwZUh0bWwoc3VnZ0lkKX1cIiBzdHlsZT1cImJhY2tncm91bmQ6I2ZlZmNlODtcIj5cbiAgICAgICAgPHRkIHN0eWxlPVwibWluLXdpZHRoOjIyMHB4O1wiPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZGlzcGxheTppbmxpbmUtYmxvY2s7YmFja2dyb3VuZDojZjU5ZTBiO2NvbG9yOiNmZmY7Zm9udC1zaXplOjAuN2VtO2ZvbnQtd2VpZ2h0OjcwMDtwYWRkaW5nOjFweCA2cHg7Ym9yZGVyLXJhZGl1czoxMHB4O21hcmdpbi1ib3R0b206NHB4O3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtcIj5cdTJCNTAgQUkgU3VnZ2VzdGVkPC9zcGFuPlxuICAgICAgICAgIDxpbnB1dCBpZD1cImFjaC10aXRsZS0ke2VzY2FwZUh0bWwoc3VnZ0lkKX1cIlxuICAgICAgICAgICAgdHlwZT1cInRleHRcIiB2YWx1ZT1cIiR7ZXNjYXBlSHRtbChzdWdnLnRpdGxlIHx8ICcnKX1cIlxuICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDoxMDAlO2ZvbnQtd2VpZ2h0OjYwMDtwYWRkaW5nOjNweCA2cHg7Ym9yZGVyOjFweCBzb2xpZCAjZDFkNWRiO2JvcmRlci1yYWRpdXM6NHB4O2ZvbnQtc2l6ZTowLjllbTtib3gtc2l6aW5nOmJvcmRlci1ib3g7XCJcbiAgICAgICAgICAgIG9uYmx1cj1cInNhdmVTdWdnZXN0ZWRBY2hpZXZlbWVudEZpZWxkKCcke2VzY2FwZUh0bWwoc3VnZ0lkKX0nLCAndGl0bGUnLCB0aGlzLnZhbHVlKVwiXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiQWNoaWV2ZW1lbnQgdGl0bGVcIj5cbiAgICAgICAgICA8dGV4dGFyZWEgaWQ9XCJhY2gtZGVzYy0ke2VzY2FwZUh0bWwoc3VnZ0lkKX1cIlxuICAgICAgICAgICAgcm93cz1cIjJcIlxuICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDoxMDAlO21hcmdpbi10b3A6NHB4O3BhZGRpbmc6M3B4IDZweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo0cHg7Zm9udC1zaXplOjAuODVlbTtyZXNpemU6dmVydGljYWw7Ym94LXNpemluZzpib3JkZXItYm94O1wiXG4gICAgICAgICAgICBvbmJsdXI9XCJzYXZlU3VnZ2VzdGVkQWNoaWV2ZW1lbnRGaWVsZCgnJHtlc2NhcGVIdG1sKHN1Z2dJZCl9JywgJ2Rlc2NyaXB0aW9uJywgdGhpcy52YWx1ZSlcIlxuICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkFjaGlldmVtZW50IGRlc2NyaXB0aW9uXCJcbiAgICAgICAgICA+JHtlc2NhcGVIdG1sKHN1Z2cuZGVzY3JpcHRpb24gfHwgJycpfTwvdGV4dGFyZWE+XG4gICAgICAgICAgJHtzdWdnLmV4cGVyaWVuY2VfaWQgPyBgPHNtYWxsIHN0eWxlPVwiY29sb3I6IzljYTNhZjtcIj5FeHBlcmllbmNlOiAke2VzY2FwZUh0bWwoc3VnZy5leHBlcmllbmNlX2lkKX08L3NtYWxsPmAgOiAnJ31cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkPjxzdHJvbmc+QWRkIE5ldzwvc3Ryb25nPjwvdGQ+XG4gICAgICAgIDx0ZD48c3BhbiBjbGFzcz1cImNvbmZpZGVuY2UtYmFkZ2UgY29uZmlkZW5jZS0ke2NvbmZMZXZlbH1cIj4ke2VzY2FwZUh0bWwoY29uZlRleHQpfTwvc3Bhbj48L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJtYXgtd2lkdGg6MjAwcHg7XCI+PHNtYWxsPiR7ZXNjYXBlSHRtbChzdWdnLnJhdGlvbmFsZSB8fCAnJyl9PC9zbWFsbD48L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJhY3Rpb24tYnRuc1wiIHN0eWxlPVwid2hpdGUtc3BhY2U6bm93cmFwO1wiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0biAke2RlZmF1bHRBY3Rpb24gPT09ICdlbXBoYXNpemUnICAgID8gJ2FjdGl2ZScgOiAnJ31cIiBkYXRhLWFjdGlvbj1cImVtcGhhc2l6ZVwiICAgIGFyaWEtbGFiZWw9XCJFbXBoYXNpemVcIiAgICB0aXRsZT1cIkVtcGhhc2l6ZSBcdTIwMTQgZmVhdHVyZSBwcm9taW5lbnRseVwiICBzdHlsZT1cImNvbG9yOiMxMGI5ODE7XCI+XHUyNzk1PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuICR7ZGVmYXVsdEFjdGlvbiA9PT0gJ2luY2x1ZGUnICAgICAgPyAnYWN0aXZlJyA6ICcnfVwiIGRhdGEtYWN0aW9uPVwiaW5jbHVkZVwiICAgICAgYXJpYS1sYWJlbD1cIkluY2x1ZGVcIiAgICAgIHRpdGxlPVwiSW5jbHVkZSBcdTIwMTQgYWRkIHRvIENWXCI+XHUyNzEzPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuICR7ZGVmYXVsdEFjdGlvbiA9PT0gJ2RlLWVtcGhhc2l6ZScgPyAnYWN0aXZlJyA6ICcnfVwiIGRhdGEtYWN0aW9uPVwiZGUtZW1waGFzaXplXCIgYXJpYS1sYWJlbD1cIkRlLWVtcGhhc2l6ZVwiIHRpdGxlPVwiRGUtZW1waGFzaXplIFx1MjAxNCBicmllZiBtZW50aW9uIG9ubHlcIiAgc3R5bGU9XCJjb2xvcjojZjU5ZTBiO1wiPlx1Mjc5NjwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0biAke2RlZmF1bHRBY3Rpb24gPT09ICdleGNsdWRlJyAgICAgID8gJ2FjdGl2ZScgOiAnJ31cIiBkYXRhLWFjdGlvbj1cImV4Y2x1ZGVcIiAgICAgIGFyaWEtbGFiZWw9XCJFeGNsdWRlXCIgICAgICB0aXRsZT1cIlNraXAgXHUyMDE0IGRvIG5vdCBhZGRcIiAgICAgICAgICAgICAgICAgc3R5bGU9XCJjb2xvcjojZWY0NDQ0O1wiPiR7ZXllU2xhc2hJY29uKCl9PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgYXJpYS1sYWJlbD1cIkFJIHJld3JpdGVcIiB0aXRsZT1cIkFJIHJld3JpdGUgZGVzY3JpcHRpb25cIiBvbmNsaWNrPVwiYWlSZXdyaXRlU3VnZ2VzdGVkQWNoaWV2ZW1lbnQoJyR7ZXNjYXBlSHRtbChzdWdnSWQpfScpXCI+XHUyNzI4PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgYXJpYS1sYWJlbD1cIk1vdmUgZWFybGllclwiIHRpdGxlPVwiTW92ZSB1cFwiICAgJHtpc0ZpcnN0ID8gJ2Rpc2FibGVkJyA6ICcnfSBvbmNsaWNrPVwibW92ZVN1Z2dlc3RlZEFjaGlldmVtZW50Um93KCcke2VzY2FwZUh0bWwoc3VnZ0lkKX0nLC0xKVwiPlx1MjE5MTwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIGFyaWEtbGFiZWw9XCJNb3ZlIGxhdGVyXCIgICB0aXRsZT1cIk1vdmUgZG93blwiICR7aXNMYXN0ICA/ICdkaXNhYmxlZCcgOiAnJ30gb25jbGljaz1cIm1vdmVTdWdnZXN0ZWRBY2hpZXZlbWVudFJvdygnJHtlc2NhcGVIdG1sKHN1Z2dJZCl9JywrMSlcIj5cdTIxOTM8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBhcmlhLWxhYmVsPVwiUmVtb3ZlIHN1Z2dlc3Rpb25cIiB0aXRsZT1cIlJlbW92ZSBzdWdnZXN0aW9uXCIgb25jbGljaz1cImRlbGV0ZVN1Z2dlc3RlZEFjaGlldmVtZW50KCcke2VzY2FwZUh0bWwoc3VnZ0lkKX0nKVwiIHN0eWxlPVwiY29sb3I6I2VmNDQ0NDtcIj5cdUQ4M0RcdURERDE8L2J1dHRvbj5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvdHI+XG4gICAgYDtcbiAgfSk7XG5cbiAgaHRtbCArPSAnPC90Ym9keT48L3RhYmxlPic7XG4gIGNvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sO1xuXG4gIC8vIEJ1bGsgdG9vbGJhciBhYm92ZSB0aGUgZmlsdGVyIHJvd1xuICBjb25zdCBhY2hUb29sYmFyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGFjaFRvb2xiYXIuY2xhc3NOYW1lID0gJ2J1bGstdG9vbGJhcic7XG4gIGFjaFRvb2xiYXIuaW5uZXJIVE1MID0gYFxuICAgIDxzcGFuPkJ1bGs6PC9zcGFuPlxuICAgIDxidXR0b24gY2xhc3M9XCJidWxrLWJ0biBidWxrLXJlY29tbWVuZGVkXCIgb25jbGljaz1cImJ1bGtBY2hpZXZlbWVudEFjdGlvbigncmVjb21tZW5kZWQnKVwiIHRpdGxlPVwiU2V0IGFsbCB0byB0aGUgTExNIHJlY29tbWVuZGF0aW9uXCI+XHUyNzI4IEFjY2VwdCBBbGwgUmVjb21tZW5kZWQ8L2J1dHRvbj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnVsay1idG4gYnVsay1lbXBoYXNpemVcIiAgIG9uY2xpY2s9XCJidWxrQWNoaWV2ZW1lbnRBY3Rpb24oJ2VtcGhhc2l6ZScpXCI+XHUyNzk1IEVtcGhhc2l6ZSBBbGw8L2J1dHRvbj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnVsay1idG4gYnVsay1pbmNsdWRlXCIgICAgIG9uY2xpY2s9XCJidWxrQWNoaWV2ZW1lbnRBY3Rpb24oJ2luY2x1ZGUnKVwiPlx1MjcxMyBJbmNsdWRlIEFsbDwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJidWxrLWJ0biBidWxrLWV4Y2x1ZGVcIiAgICAgb25jbGljaz1cImJ1bGtBY2hpZXZlbWVudEFjdGlvbignZXhjbHVkZScpXCI+JHtleWVTbGFzaEljb24oKX0gRXhjbHVkZSBBbGw8L2J1dHRvbj5cbiAgYDtcbiAgY29udGFpbmVyLmluc2VydEJlZm9yZShhY2hUb29sYmFyLCBjb250YWluZXIuZmlyc3RDaGlsZCk7XG5cbiAgLy8gRGVsZWdhdGVkIGNsaWNrIGhhbmRsZXIgZm9yIGRlY2lzaW9uIGJ1dHRvbnNcbiAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ3Rib2R5Jyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZSA9PiB7XG4gICAgY29uc3QgYnRuID0gZS50YXJnZXQuY2xvc2VzdCgnLmljb24tYnRuW2RhdGEtYWN0aW9uXScpO1xuICAgIGlmICghYnRuKSByZXR1cm47XG4gICAgY29uc3QgdHIgPSBidG4uY2xvc2VzdCgndHJbZGF0YS1hY2gtaWRdJyk7XG4gICAgaWYgKCF0cikgcmV0dXJuO1xuICAgIGNvbnN0IGFjdGlvbiA9IGJ0bi5kYXRhc2V0LmFjdGlvbjtcbiAgICBpZiAoYWN0aW9uKSBoYW5kbGVBY2hpZXZlbWVudEFjdGlvbih0ci5kYXRhc2V0LmFjaElkLCBhY3Rpb24pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gYnVsa0FjaGlldmVtZW50QWN0aW9uKGFjdGlvbikge1xuICBjb25zdCBkYXRhID0gd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnMgfHwge307XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNhY2hpZXZlbWVudHMtcmV2aWV3LXRhYmxlIHRib2R5IHRyW2RhdGEtYWNoLWlkXScpLmZvckVhY2gocm93ID0+IHtcbiAgICBpZiAocm93LnN0eWxlLmRpc3BsYXkgPT09ICdub25lJykgcmV0dXJuOyAgIC8vIHJlc3BlY3QgZmlsdGVyXG4gICAgY29uc3QgYWNoSWQgPSByb3cuZGF0YXNldC5hY2hJZDtcbiAgICBpZiAoIWFjaElkKSByZXR1cm47XG4gICAgbGV0IHJlc29sdmVkQWN0aW9uID0gYWN0aW9uO1xuICAgIGlmIChhY3Rpb24gPT09ICdyZWNvbW1lbmRlZCcpIHtcbiAgICAgIGlmIChhY2hJZC5zdGFydHNXaXRoKCdzdWdnOjonKSkge1xuICAgICAgICByZXNvbHZlZEFjdGlvbiA9ICdpbmNsdWRlJzsgLy8gQUktc3VnZ2VzdGVkIGl0ZW1zIGRlZmF1bHQgdG8gaW5jbHVkZSB3aGVuIGFjY2VwdGluZyBhbGxcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlYyA9IGdldEFjaGlldmVtZW50UmVjb21tZW5kYXRpb24oYWNoSWQsIGRhdGEpO1xuICAgICAgICBpZiAocmVjID09PSAnRW1waGFzaXplJykgICAgICAgICByZXNvbHZlZEFjdGlvbiA9ICdlbXBoYXNpemUnO1xuICAgICAgICBlbHNlIGlmIChyZWMgPT09ICdJbmNsdWRlJykgICAgICByZXNvbHZlZEFjdGlvbiA9ICdpbmNsdWRlJztcbiAgICAgICAgZWxzZSBpZiAocmVjID09PSAnRGUtZW1waGFzaXplJykgcmVzb2x2ZWRBY3Rpb24gPSAnZGUtZW1waGFzaXplJztcbiAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRBY3Rpb24gPSAnZXhjbHVkZSc7XG4gICAgICB9XG4gICAgfVxuICAgIGhhbmRsZUFjaGlldmVtZW50QWN0aW9uKGFjaElkLCByZXNvbHZlZEFjdGlvbik7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBoYW5kbGVBY2hpZXZlbWVudEFjdGlvbihhY2hJZCwgYWN0aW9uKSB7XG4gIHdpbmRvdy5hY2hpZXZlbWVudERlY2lzaW9uc1thY2hJZF0gPSBhY3Rpb247XG4gIGNvbnN0IHJvdyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYHRyW2RhdGEtYWNoLWlkPVwiJHtDU1MuZXNjYXBlKGFjaElkKX1cIl1gKTtcbiAgaWYgKCFyb3cpIHJldHVybjtcbiAgcm93LnF1ZXJ5U2VsZWN0b3JBbGwoJy5pY29uLWJ0bicpLmZvckVhY2goYnRuID0+IGJ0bi5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKSk7XG4gIGNvbnN0IGFjdGl2ZUJ0biA9IHJvdy5xdWVyeVNlbGVjdG9yKGBbZGF0YS1hY3Rpb249XCIke2FjdGlvbn1cIl1gKTtcbiAgaWYgKGFjdGl2ZUJ0bikgYWN0aXZlQnRuLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzdWJtaXRBY2hpZXZlbWVudERlY2lzaW9ucygpIHtcbiAgLyogZHVja2Zsb3c6XG4gICAqICAgaWQ6IGFjaGlldmVtZW50c191aV9zdWJtaXRfbGl2ZVxuICAgKiAgIGtpbmQ6IHVpXG4gICAqICAgdGltZXN0YW1wOiAnMjAyNi0wMy0yNVQyMTozOTo0OFonXG4gICAqICAgc3RhdHVzOiBsaXZlXG4gICAqICAgaGFuZGxlczpcbiAgICogICAtIHVpOmFjaGlldmVtZW50cy1yZXZpZXcuc3VibWl0XG4gICAqICAgY2FsbHM6XG4gICAqICAgLSBQT1NUIC9hcGkvcmV2aWV3LWRlY2lzaW9uc1xuICAgKiAgIC0gUE9TVCAvYXBpL2N2L2xheW91dC1lc3RpbWF0ZVxuICAgKiAgIHJlYWRzOlxuICAgKiAgIC0gd2luZG93OmFjaGlldmVtZW50RGVjaXNpb25zXG4gICAqICAgLSB3aW5kb3c6X3N1Z2dlc3RlZEFjaHNPcmRlcmVkXG4gICAqICAgd3JpdGVzOlxuICAgKiAgIC0gcmVxdWVzdDpQT1NUIC9hcGkvcmV2aWV3LWRlY2lzaW9ucy5kZWNpc2lvbnNcbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL3Jldmlldy1kZWNpc2lvbnMuYWNjZXB0ZWRfc3VnZ2VzdGlvbnNcbiAgICogICAtIHdpbmRvdzpfc2F2ZWREZWNpc2lvbnMuYWNoaWV2ZW1lbnRfZGVjaXNpb25zXG4gICAqICAgLSB3aW5kb3c6X3NhdmVkRGVjaXNpb25zLmFjY2VwdGVkX3N1Z2dlc3RlZF9hY2hpZXZlbWVudHNcbiAgICogICBub3RlczogUGVyc2lzdHMgYWNoaWV2ZW1lbnQgaW5jbHVzaW9uIGRlY2lzaW9ucyBhbmQgdGhlIGFjY2VwdGVkIEFJLXN1Z2dlc3RlZCBhY2hpZXZlbWVudHMgdGhhdCBzaG91bGQgcmVtYWluIHNlc3Npb24tb25seSB1bnRpbCBhbiBleHBsaWNpdCBoYXJ2ZXN0IHN0ZXAuXG4gICAqL1xuICBjb25zdCBhbGxEZWNpc2lvbnMgPSB3aW5kb3cuYWNoaWV2ZW1lbnREZWNpc2lvbnMgfHwge307XG4gIC8vIFNlcGFyYXRlIGV4aXN0aW5nIGFjaGlldmVtZW50cyBmcm9tIEFJLXN1Z2dlc3RlZCBvbmVzXG4gIGNvbnN0IGRlY2lzaW9ucyA9IHt9O1xuICBjb25zdCBzdWdnZXN0ZWREZWNpc2lvbnMgPSB7fTtcbiAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMoYWxsRGVjaXNpb25zKSkge1xuICAgIGlmIChrLnN0YXJ0c1dpdGgoJ3N1Z2c6OicpKSBzdWdnZXN0ZWREZWNpc2lvbnNba10gPSB2O1xuICAgIGVsc2UgZGVjaXNpb25zW2tdID0gdjtcbiAgfVxuICBjb25zdCBjb3VudCA9IE9iamVjdC5rZXlzKGFsbERlY2lzaW9ucykubGVuZ3RoO1xuICBpZiAoY291bnQgPT09IDApIHJldHVybjtcbiAgLy8gUmVzb2x2ZSBzdWdnZXN0ZWQgYWNoaWV2ZW1lbnQgb2JqZWN0cyB0aGF0IHdlcmUgYWNjZXB0ZWRcbiAgY29uc3Qgc3VnZ2VzdGVkQWNocyA9IHdpbmRvdy5fc3VnZ2VzdGVkQWNoc09yZGVyZWQgfHwgW107XG4gIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbnMgPSBzdWdnZXN0ZWRBY2hzXG4gICAgLmZpbHRlcihzID0+IHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IHN1Z2dlc3RlZERlY2lzaW9uc1tzLl9zdWdnSWRdO1xuICAgICAgcmV0dXJuIGFjdGlvbiA9PT0gJ2luY2x1ZGUnIHx8IGFjdGlvbiA9PT0gJ2VtcGhhc2l6ZSc7XG4gICAgfSlcbiAgICAubWFwKHMgPT4gKHsgdGl0bGU6IHMudGl0bGUsIGRlc2NyaXB0aW9uOiBzLmRlc2NyaXB0aW9uLCBleHBlcmllbmNlX2lkOiBzLmV4cGVyaWVuY2VfaWQsIHJhdGlvbmFsZTogcy5yYXRpb25hbGUgfSkpO1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvcmV2aWV3LWRlY2lzaW9ucycsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHR5cGU6ICdhY2hpZXZlbWVudHMnLCBkZWNpc2lvbnMsIGFjY2VwdGVkX3N1Z2dlc3Rpb25zOiBhY2NlcHRlZFN1Z2dlc3Rpb25zIH0pXG4gICAgfSk7XG4gICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICBzdGF0ZU1hbmFnZXIubWFya0NvbnRlbnRDaGFuZ2VkKCk7XG4gICAgICBzaG93VG9hc3QoYEFjaGlldmVtZW50IHNlbGVjdGlvbnMgc2F2ZWQgKCR7Y291bnR9IGl0ZW1zKWApO1xuICAgICAgc2NoZWR1bGVBdHNSZWZyZXNoKCk7XG4gICAgICAvLyBQZXJzaXN0IGxvY2FsbHkgc28gdGhlIHJldmlldyBVSSBpbW1lZGlhdGVseSByZWZsZWN0cyBzYXZlZCBjaG9pY2VzXG4gICAgICB3aW5kb3cuX3NhdmVkRGVjaXNpb25zID0gd2luZG93Ll9zYXZlZERlY2lzaW9ucyB8fCB7fTtcbiAgICAgIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMuYWNoaWV2ZW1lbnRfZGVjaXNpb25zID0gZGVjaXNpb25zO1xuICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbnMgJiYgYWNjZXB0ZWRTdWdnZXN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMuYWNjZXB0ZWRfc3VnZ2VzdGVkX2FjaGlldmVtZW50cyA9IGFjY2VwdGVkU3VnZ2VzdGlvbnM7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHVwZGF0ZUluY2x1c2lvbkNvdW50cyA9PT0gJ2Z1bmN0aW9uJykgdXBkYXRlSW5jbHVzaW9uQ291bnRzKCk7XG4gICAgICBzd2l0Y2hUYWIoJ3RhZ2xpbmUtcmV2aWV3Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGVyciA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIHNob3dUb2FzdChgRXJyb3I6ICR7ZXJyLmVycm9yIHx8ICdGYWlsZWQgdG8gc2F2ZSBzZWxlY3Rpb25zJ31gLCAnZXJyb3InKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBzaG93VG9hc3QoJ0ZhaWxlZCB0byBzYXZlIGFjaGlldmVtZW50IHNlbGVjdGlvbnMuIFBsZWFzZSB0cnkgYWdhaW4uJywgJ2Vycm9yJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbW92ZUFjaGlldmVtZW50Um93KGFjaElkLCBkaXJlY3Rpb24pIHtcbiAgY29uc3QgYXJyID0gd2luZG93Ll9hY2hpZXZlbWVudHNPcmRlcmVkO1xuICBpZiAoIWFycikgcmV0dXJuO1xuICBjb25zdCBpZHggPSBhcnIuZmluZEluZGV4KGEgPT4gYS5pZCA9PT0gYWNoSWQpO1xuICBpZiAoaWR4IDwgMCkgcmV0dXJuO1xuICBjb25zdCBuZXdJZHggPSBpZHggKyBkaXJlY3Rpb247XG4gIGlmIChuZXdJZHggPCAwIHx8IG5ld0lkeCA+PSBhcnIubGVuZ3RoKSByZXR1cm47XG4gIFthcnJbaWR4XSwgYXJyW25ld0lkeF1dID0gW2FycltuZXdJZHhdLCBhcnJbaWR4XV07XG4gIHdpbmRvdy5fYWNoaWV2ZW1lbnRzT3JkZXJlZCA9IGFycjtcbiAgX3JlbmRlckFjaGlldmVtZW50c1Jldmlld1RhYmxlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhY2hpZXZlbWVudHMtdGFibGUtY29udGFpbmVyJykpO1xufVxuXG4vLyA9PT09IEFjaGlldmVtZW50cyBFZGl0b3IgVGFiID09PT1cblxuLyoqXG4gKiBCdWlsZCB0aGUgcGVyLWV4cGVyaWVuY2UgYWNoaWV2ZW1lbnRzIGVkaXRvciB0YWIuXG4gKiBFYWNoIGV4cGVyaWVuY2UgZ2V0cyBhIGNvbGxhcHNpYmxlIGNhcmQgd2l0aCBpdHMgYWNoaWV2ZW1lbnRzIGxpc3RlZC5cbiAqIEVhY2ggYWNoaWV2ZW1lbnQgc3VwcG9ydHM6IGlubGluZSBlZGl0LCByZW9yZGVyIChcdTIxOTFcdTIxOTMpLCBkZWxldGUsIGFuZCBMTE0gcmV3cml0ZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYnVpbGRBY2hpZXZlbWVudHNFZGl0b3IoKSB7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIGlmICghY29udGFpbmVyKSByZXR1cm47XG5cbiAgY29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTJweDtwYWRkaW5nOjIwcHg7Y29sb3I6IzZiNzI4MDtcIj48ZGl2IGNsYXNzPVwibG9hZGluZy1zcGlubmVyXCIgc3R5bGU9XCJ3aWR0aDoyMHB4O2hlaWdodDoyMHB4O2JvcmRlci13aWR0aDoycHg7ZmxleC1zaHJpbms6MDtcIj48L2Rpdj48c3Bhbj5Mb2FkaW5nIGV4cGVyaWVuY2UgYnVsbGV0cyBlZGl0b3JcdTIwMjY8L3NwYW4+PC9kaXY+JztcblxuICAvLyBGZXRjaCBleHBlcmllbmNlcyArIHRoZWlyIGFjaGlldmVtZW50cyBmcm9tIG1hc3RlciBmaWVsZHNcbiAgbGV0IGV4cGVyaWVuY2VzID0gW107XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWZpZWxkcycpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGV4cGVyaWVuY2VzID0gZGF0YS5leHBlcmllbmNlcyB8fCBbXTtcbiAgfSBjYXRjaCAoXykge31cblxuICBpZiAoZXhwZXJpZW5jZXMubGVuZ3RoID09PSAwKSB7XG4gICAgY29udGFpbmVyLmlubmVySFRNTCA9ICc8cCBzdHlsZT1cInBhZGRpbmc6MjBweDtjb2xvcjojNmI3MjgwO1wiPk5vIGV4cGVyaWVuY2VzIGZvdW5kIGluIG1hc3RlciBDVi48L3A+JztcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBJbml0aWFsaXNlIGVkaXRzIHN0b3JlIFx1MjAxNCBrZXllZCBieSBleHBlcmllbmNlIGluZGV4LCB2YWx1ZSBpcyBhcnJheSBvZiB7IHRleHQsIGhpZGRlbiB9XG4gIHdpbmRvdy5hY2hpZXZlbWVudEVkaXRzID0gd2luZG93LmFjaGlldmVtZW50RWRpdHMgfHwge307XG4gIGV4cGVyaWVuY2VzLmZvckVhY2goKGV4cCwgZXhwSWR4KSA9PiB7XG4gICAgaWYgKCF3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0c1tleHBJZHhdKSB7XG4gICAgICB3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0c1tleHBJZHhdID0gKGV4cC5rZXlfYWNoaWV2ZW1lbnRzIHx8IGV4cC5hY2hpZXZlbWVudHMgfHwgW10pLm1hcChhID0+XG4gICAgICAgIF9ub3JtYWxpemVBY2hpZXZlbWVudEVkaXRFbnRyeShcbiAgICAgICAgICB0eXBlb2YgYSA9PT0gJ3N0cmluZycgPyBhIDogKGEgJiYgKGEudGV4dCB8fCBhLmRlc2NyaXB0aW9uIHx8IGEuY29udGVudCB8fCAnJykpIHx8ICcnXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdpbmRvdy5hY2hpZXZlbWVudEVkaXRzW2V4cElkeF0gPSBfbm9ybWFsaXplQWNoaWV2ZW1lbnRFZGl0TGlzdCh3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0c1tleHBJZHhdKTtcbiAgICB9XG4gIH0pO1xuXG4gIGxldCBodG1sID0gYFxuICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nOjE2cHg7XCI+XG4gICAgICA8aDIgc3R5bGU9XCJtYXJnaW46MCAwIDRweDtcIj5cdTI3MEZcdUZFMEYgRXhwZXJpZW5jZSBCdWxsZXRzPC9oMj5cbiAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDttYXJnaW46MCAwIDE2cHg7Zm9udC1zaXplOjAuOWVtO1wiPlxuICAgICAgICBFZGl0LCByZW9yZGVyLCBkZWxldGUsIG9yIEFJLXJld3JpdGUgaW5kaXZpZHVhbCBleHBlcmllbmNlIGJ1bGxldHMgcGVyIHJvbGUuXG4gICAgICAgIENoYW5nZXMgYXJlIHNhdmVkIGF1dG9tYXRpY2FsbHkgYW5kIHVzZWQgZHVyaW5nIENWIGdlbmVyYXRpb24uXG4gICAgICA8L3A+XG4gIGA7XG5cbiAgLy8gRmlsdGVyIG91dCBleHBlcmllbmNlcyB0aGF0IHVzZXIgbWFya2VkIGFzIGV4Y2x1ZGVkIChwZXJzaXN0ZWQgZGVjaXNpb25zKVxuICBjb25zdCBleHBEZWNpc2lvbnMgPSAod2luZG93Ll9zYXZlZERlY2lzaW9ucyAmJiB3aW5kb3cuX3NhdmVkRGVjaXNpb25zLmV4cGVyaWVuY2VfZGVjaXNpb25zKSB8fCB1c2VyU2VsZWN0aW9ucy5leHBlcmllbmNlcyB8fCB7fTtcbiAgZXhwZXJpZW5jZXMuZm9yRWFjaCgoZXhwLCBleHBJZHgpID0+IHtcbiAgICBjb25zdCBleHBJZCA9IGV4cC5pZCB8fCBleHAuZXhwZXJpZW5jZV9pZCB8fCBgZXhwOjoke2V4cElkeH1gO1xuICAgIGNvbnN0IGRlY2lzaW9uID0gZXhwRGVjaXNpb25zW2V4cElkXTtcbiAgICBpZiAoZGVjaXNpb24gPT09ICdleGNsdWRlJykgcmV0dXJuOyAvLyBvbWl0IGV4Y2x1ZGVkIGV4cGVyaWVuY2VzIGZyb20gZWRpdG9yXG4gICAgY29uc3QgdGl0bGUgICAgPSBlc2NhcGVIdG1sKGV4cC50aXRsZSB8fCBleHAucG9zaXRpb24gfHwgYEV4cGVyaWVuY2UgJHtleHBJZHggKyAxfWApO1xuICAgIGNvbnN0IGNvbXBhbnkgID0gZXNjYXBlSHRtbChleHAuY29tcGFueSB8fCBleHAub3JnYW5pemF0aW9uIHx8ICcnKTtcbiAgICBjb25zdCBhY2hDb3VudCA9IHdpbmRvdy5hY2hpZXZlbWVudEVkaXRzW2V4cElkeF0ubGVuZ3RoO1xuXG4gICAgaHRtbCArPSBgXG4gICAgICA8ZGV0YWlscyBvcGVuIHN0eWxlPVwibWFyZ2luLWJvdHRvbToxMnB4O2JvcmRlcjoxcHggc29saWQgI2U1ZTdlYjtib3JkZXItcmFkaXVzOjhweDtvdmVyZmxvdzpoaWRkZW47XCI+XG4gICAgICAgIDxzdW1tYXJ5IHN0eWxlPVwicGFkZGluZzoxMnB4IDE2cHg7YmFja2dyb3VuZDojZjlmYWZiO2N1cnNvcjpwb2ludGVyO2ZvbnQtd2VpZ2h0OjYwMDtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDo4cHg7XCI+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJmbGV4OjE7XCI+JHt0aXRsZX0ke2NvbXBhbnkgPyBgIDxzcGFuIHN0eWxlPVwiZm9udC13ZWlnaHQ6NDAwO2NvbG9yOiM2YjcyODA7XCI+QCAke2NvbXBhbnl9PC9zcGFuPmAgOiAnJ308L3NwYW4+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC44ZW07Y29sb3I6IzljYTNhZjtcIj4ke2FjaENvdW50fSBidWxsZXQke2FjaENvdW50ICE9PSAxID8gJ3MnIDogJyd9PC9zcGFuPlxuICAgICAgICA8L3N1bW1hcnk+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nOjEycHggMTZweDtcIiBpZD1cImFjaC1lZGl0b3ItZXhwLSR7ZXhwSWR4fVwiPlxuICAgICAgICAgIDxkaXYgaWQ9XCJhY2gtbGlzdC0ke2V4cElkeH1cIj48L2Rpdj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLXNlY29uZGFyeVwiIHN0eWxlPVwibWFyZ2luLXRvcDo4cHg7Zm9udC1zaXplOjAuODVlbTtcIlxuICAgICAgICAgICAgb25jbGljaz1cImFkZEFjaGlldmVtZW50Um93KCR7ZXhwSWR4fSlcIj4rIEFkZCBCdWxsZXQ8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2RldGFpbHM+XG4gICAgYDtcbiAgfSk7XG5cbiAgaHRtbCArPSBgXG4gICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6MjBweDtkaXNwbGF5OmZsZXg7Z2FwOjEycHg7YWxpZ24taXRlbXM6Y2VudGVyO1wiPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImJhY2stYnRuXCIgb25jbGljaz1cInN3aXRjaFRhYignZXhwLXJldmlldycpXCI+XHUyMTkwIEJhY2sgdG8gRXhwZXJpZW5jZXM8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJjb250aW51ZS1idG5cIiBvbmNsaWNrPVwic2F2ZUFjaGlldmVtZW50RWRpdHNBbmRDb250aW51ZSgpXCI+U2F2ZSAmYW1wOyBDb250aW51ZSB0byBTa2lsbHMgXHUyMTkyPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGA7XG5cbiAgY29udGFpbmVyLmlubmVySFRNTCA9IGh0bWw7XG5cbiAgLy8gUmVuZGVyIGFjaGlldmVtZW50IHJvd3MgZm9yIGVhY2ggZXhwZXJpZW5jZVxuICBleHBlcmllbmNlcy5mb3JFYWNoKChfLCBleHBJZHgpID0+IHJlbmRlckFjaGlldmVtZW50RWRpdG9yUm93cyhleHBJZHgpKTtcbn1cblxuLy8gVmVyYnMgdGhhdCBnZW5lcmF0ZSBhIHdlYWstdmVyYiB3YXJuaW5nIGJhZGdlIGluIHRoZSBidWxsZXQgZWRpdG9yLlxuY29uc3QgX0FDSF9QQVNTSVZFX1NUQVJUUyA9IG5ldyBTZXQoWyd3YXMnLCd3ZXJlJywnaXMnLCdhcmUnLCdiZWVuJ10pO1xuY29uc3QgX0FDSF9XRUFLX1ZFUkJTID0gbmV3IFNldChbXG4gICdhc3Npc3RlZCcsJ2NvbnRyaWJ1dGVkJywnaGVscGVkJywncGFydGljaXBhdGVkJywnc3VwcG9ydGVkJyxcbiAgJ3N1cGVydmlzZWQnLCd3b3JrZWQnLCdjb2xsYWJvcmF0ZWQnLCdjb29wZXJhdGVkJyxcbl0pO1xuY29uc3QgX0FDSF9TVFJPTkdfVkVSQlMgPSBuZXcgU2V0KFtcbiAgJ2FjY2VsZXJhdGVkJywnYWNoaWV2ZWQnLCdhcmNoaXRlY3RlZCcsJ2F1dG9tYXRlZCcsJ2J1aWx0JyxcbiAgJ2NoYW1waW9uZWQnLCdjb2luZWQnLCdjb25jZWl2ZWQnLCdjb25kdWN0ZWQnLCdjb25zb2xpZGF0ZWQnLFxuICAnY3JlYXRlZCcsJ2N1dCcsJ2RlbGl2ZXJlZCcsJ2RlbW9uc3RyYXRlZCcsJ2RlcGxveWVkJyxcbiAgJ2Rlc2lnbmVkJywnZGV2ZWxvcGVkJywnZGlyZWN0ZWQnLCdkb3VibGVkJywnZHJvdmUnLFxuICAnZW5hYmxlZCcsJ2VzdGFibGlzaGVkJywnZXhwYW5kZWQnLCdmb3VuZGVkJywnZ2VuZXJhdGVkJyxcbiAgJ2dyZXcnLCdpbXBsZW1lbnRlZCcsJ2ltcHJvdmVkJywnaW5jcmVhc2VkJywnaW50ZWdyYXRlZCcsXG4gICdpbnZlbnRlZCcsJ2xhdW5jaGVkJywnbGVkJywnbWFuYWdlZCcsJ29wdGltaXplZCcsJ3Bpb25lZXJlZCcsXG4gICdwcm92aWRlZCcsJ3B1Ymxpc2hlZCcsJ3JhaXNlZCcsJ3JlZHVjZWQnLCdyZWZhY3RvcmVkJywnc2NhbGVkJyxcbiAgJ3NlY3VyZWQnLCdzaGlwcGVkJywnc3BlYXJoZWFkZWQnLCdzdHJlYW1saW5lZCcsJ3RhdWdodCcsXG4gICd0cmFuc2Zvcm1lZCcsJ3RyYW5zbGF0ZWQnLCd0cmlwbGVkJyxcbl0pO1xuXG5mdW5jdGlvbiBfYWNoVmVyYldhcm5pbmcodGV4dCkge1xuICBjb25zdCBmaXJzdFdvcmQgPSAodGV4dCB8fCAnJykudHJpbSgpLnNwbGl0KC9bXFxzLC46O10vKVswXS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1teYS16XS9nLCAnJyk7XG4gIGlmICghZmlyc3RXb3JkKSByZXR1cm4gbnVsbDtcbiAgaWYgKF9BQ0hfUEFTU0lWRV9TVEFSVFMuaGFzKGZpcnN0V29yZCkpIHJldHVybiB7IGxldmVsOiAncGFzc2l2ZScsIHdvcmQ6IGZpcnN0V29yZCB9O1xuICBpZiAoX0FDSF9XRUFLX1ZFUkJTLmhhcyhmaXJzdFdvcmQpKSByZXR1cm4geyBsZXZlbDogJ3dlYWsnLCAgICB3b3JkOiBmaXJzdFdvcmQgfTtcbiAgaWYgKCFfQUNIX1NUUk9OR19WRVJCUy5oYXMoZmlyc3RXb3JkKSkgcmV0dXJuIHsgbGV2ZWw6ICduZXV0cmFsJywgd29yZDogZmlyc3RXb3JkIH07XG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIFJlbmRlciB0aGUgZWRpdGFibGUgYWNoaWV2ZW1lbnQgcm93cyBmb3Igb25lIGV4cGVyaWVuY2UuXG4gKi9cbmZ1bmN0aW9uIHJlbmRlckFjaGlldmVtZW50RWRpdG9yUm93cyhleHBJZHgpIHtcbiAgY29uc3QgbGlzdEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYGFjaC1saXN0LSR7ZXhwSWR4fWApO1xuICBpZiAoIWxpc3RFbCkgcmV0dXJuO1xuICBjb25zdCBhY2hzID0gX25vcm1hbGl6ZUFjaGlldmVtZW50RWRpdExpc3Qod2luZG93LmFjaGlldmVtZW50RWRpdHNbZXhwSWR4XSB8fCBbXSk7XG4gIHdpbmRvdy5hY2hpZXZlbWVudEVkaXRzW2V4cElkeF0gPSBhY2hzO1xuXG4gIGlmIChhY2hzLmxlbmd0aCA9PT0gMCkge1xuICAgIGxpc3RFbC5pbm5lckhUTUwgPSAnPHAgc3R5bGU9XCJjb2xvcjojOWNhM2FmO2ZvbnQtc2l6ZTowLjg1ZW07cGFkZGluZzo0cHggMDtcIj5ObyBleHBlcmllbmNlIGJ1bGxldHMgeWV0LjwvcD4nO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxpc3RFbC5pbm5lckhUTUwgPSBhY2hzLm1hcCgoZW50cnksIGFjaElkeCkgPT4ge1xuICAgIGNvbnN0IHRleHQgPSBfYWNoaWV2ZW1lbnRFbnRyeVRleHQoZW50cnkpO1xuICAgIGNvbnN0IGhpZGRlbiA9IF9hY2hpZXZlbWVudEVudHJ5SGlkZGVuKGVudHJ5KTtcbiAgICBjb25zdCB2ZXJiV2FybiA9IF9hY2hWZXJiV2FybmluZyh0ZXh0KTtcbiAgICBjb25zdCB2ZXJiQmFkZ2UgPSB2ZXJiV2FyblxuICAgICAgPyAodmVyYldhcm4ubGV2ZWwgPT09ICdwYXNzaXZlJ1xuICAgICAgICAgID8gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC43OGVtO2NvbG9yOiM5ZjEyMzk7YmFja2dyb3VuZDojZmZmMWYyO2JvcmRlcjoxcHggc29saWQgI2ZlY2RkMztib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjJweCA2cHg7bWFyZ2luLXRvcDozcHg7XCIgdGl0bGU9XCJCdWxsZXQgb3BlbnMgd2l0aCBwYXNzaXZlIHZvaWNlICgnJHt2ZXJiV2Fybi53b3JkfScpIFx1MjAxNCByZXdyaXRlIHdpdGggYW4gYWN0aXZlIG9wZW5pbmcgdmVyYlwiPlx1MjZBMCBQYXNzaXZlIHZvaWNlIFx1MjAxNCByZXdyaXRlIHdpdGggYW4gYWN0aXZlIG9wZW5pbmcgdmVyYjwvZGl2PmBcbiAgICAgICAgICA6IHZlcmJXYXJuLmxldmVsID09PSAnd2VhaydcbiAgICAgICAgICA/IGA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuNzhlbTtjb2xvcjojYjQ1MzA5O2JhY2tncm91bmQ6I2ZmZmJlYjtib3JkZXI6MXB4IHNvbGlkICNmZGU2OGE7Ym9yZGVyLXJhZGl1czo0cHg7cGFkZGluZzoycHggNnB4O21hcmdpbi10b3A6M3B4O1wiIHRpdGxlPVwiT3BlbmluZyB2ZXJiICcke3ZlcmJXYXJuLndvcmR9JyBpcyB3ZWFrIFx1MjAxNCBjb25zaWRlciBMZWQsIEJ1aWx0LCBEcm92ZSwgZXRjLlwiPlx1MjZBMCBXZWFrIG9wZW5pbmcgdmVyYiBcdTIwMTQgdXNlIGEgc3Ryb25nZXIgYWN0aW9uIHZlcmI8L2Rpdj5gXG4gICAgICAgICAgOiBgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjc4ZW07Y29sb3I6IzZiNzI4MDtiYWNrZ3JvdW5kOiNmOWZhZmI7Ym9yZGVyOjFweCBzb2xpZCAjZTVlN2ViO2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6MnB4IDZweDttYXJnaW4tdG9wOjNweDtcIiB0aXRsZT1cIicke3ZlcmJXYXJuLndvcmR9JyBpcyBub3QgaW4gdGhlIHN0cm9uZy12ZXJiIGxpc3QgXHUyMDE0IHZlcmlmeSBpdCBtYWtlcyBhbiBpbXBhY3Qgc3RhdGVtZW50XCI+XHUyMTM5IE9wZW5pbmcgdmVyYiBub3QgaW4gc3Ryb25nLXZlcmIgbGlzdDwvZGl2PmBcbiAgICAgICAgKVxuICAgICAgOiAnJztcbiAgICByZXR1cm4gYFxuICAgIDxkaXYgaWQ9XCJhY2gtcm93LSR7ZXhwSWR4fS0ke2FjaElkeH1cIiBjbGFzcz1cIiR7aGlkZGVuID8gJ2FjaGlldmVtZW50LXJvdy1oaWRkZW4nIDogJyd9XCIgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjhweDthbGlnbi1pdGVtczpmbGV4LXN0YXJ0O21hcmdpbi1ib3R0b206OHB4O1wiPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Z2FwOjJweDtwYWRkaW5nLXRvcDo0cHg7XCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIHRpdGxlPVwiTW92ZSB1cFwiICAgYXJpYS1sYWJlbD1cIk1vdmUgYnVsbGV0IHVwXCIgICBvbmNsaWNrPVwibW92ZUFjaGlldmVtZW50KCR7ZXhwSWR4fSwke2FjaElkeH0sLTEpXCI+XHUyNUIyPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIHRpdGxlPVwiTW92ZSBkb3duXCIgYXJpYS1sYWJlbD1cIk1vdmUgYnVsbGV0IGRvd25cIiBvbmNsaWNrPVwibW92ZUFjaGlldmVtZW50KCR7ZXhwSWR4fSwke2FjaElkeH0sKzEpXCI+XHUyNUJDPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgc3R5bGU9XCJmbGV4OjE7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtcIj5cbiAgICAgIDx0ZXh0YXJlYSBpZD1cImFjaC10ZXh0LSR7ZXhwSWR4fS0ke2FjaElkeH1cIlxuICAgICAgICByb3dzPVwiMlwiXG4gICAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTtwYWRkaW5nOjZweCA4cHg7Ym9yZGVyOjFweCBzb2xpZCAke2hpZGRlbiA/ICcjZjU5ZTBiJyA6IHZlcmJXYXJuPy5sZXZlbCA9PT0gJ3Bhc3NpdmUnID8gJyNmZWNkZDMnIDogdmVyYldhcm4/LmxldmVsID09PSAnd2VhaycgPyAnI2ZkZTY4YScgOiAnI2QxZDVkYid9O2JvcmRlci1yYWRpdXM6NnB4O2ZvbnQtc2l6ZTowLjllbTtyZXNpemU6dmVydGljYWw7Ym94LXNpemluZzpib3JkZXItYm94OyR7aGlkZGVuID8gJ2JhY2tncm91bmQ6I2ZmZmJlYjtjb2xvcjojOTI0MDBlOycgOiAnJ31cIlxuICAgICAgICBvbmNoYW5nZT1cInVwZGF0ZUFjaGlldmVtZW50VGV4dCgke2V4cElkeH0sJHthY2hJZHh9LHRoaXMudmFsdWUpXCJcbiAgICAgICAgb25ibHVyPVwidXBkYXRlQWNoaWV2ZW1lbnRUZXh0KCR7ZXhwSWR4fSwke2FjaElkeH0sdGhpcy52YWx1ZSlcIlxuICAgICAgPiR7ZXNjYXBlSHRtbCh0ZXh0KX08L3RleHRhcmVhPlxuICAgICAgJHt2ZXJiQmFkZ2V9XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2dhcDo0cHg7cGFkZGluZy10b3A6MnB4O1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG4gJHtoaWRkZW4gPyAnYWN0aXZlJyA6ICcnfVwiIHRpdGxlPVwiJHtoaWRkZW4gPyAnU2hvdyBidWxsZXQgaW4gZ2VuZXJhdGVkIENWJyA6ICdIaWRlIGJ1bGxldCBmcm9tIGdlbmVyYXRlZCBDVid9XCJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiJHtoaWRkZW4gPyAnU2hvdyBidWxsZXQgaW4gZ2VuZXJhdGVkIENWJyA6ICdIaWRlIGJ1bGxldCBmcm9tIGdlbmVyYXRlZCBDVid9XCIgYXJpYS1wcmVzc2VkPVwiJHtoaWRkZW59XCJcbiAgICAgICAgICBvbmNsaWNrPVwidG9nZ2xlQWNoaWV2ZW1lbnRIaWRkZW4oJHtleHBJZHh9LCR7YWNoSWR4fSlcIlxuICAgICAgICAgIHN0eWxlPVwiY29sb3I6JHtoaWRkZW4gPyAnI2I0NTMwOScgOiAnIzY0NzQ4Yid9O1wiPiR7ZXllU2xhc2hJY29uKCl9PC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIHRpdGxlPVwiQXNrIEFJIHRvIHJld3JpdGVcIlxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJBc2sgQUkgdG8gcmV3cml0ZSB0aGlzIGJ1bGxldFwiXG4gICAgICAgICAgb25jbGljaz1cInJld3JpdGVBY2hpZXZlbWVudFdpdGhMTE0oJHtleHBJZHh9LCR7YWNoSWR4fSlcIlxuICAgICAgICAgID5cdTI3Mjg8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgdGl0bGU9XCJEZWxldGVcIlxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJEZWxldGUgdGhpcyBidWxsZXRcIlxuICAgICAgICAgIG9uY2xpY2s9XCJkZWxldGVBY2hpZXZlbWVudCgke2V4cElkeH0sJHthY2hJZHh9KVwiXG4gICAgICAgICAgc3R5bGU9XCJjb2xvcjojZWY0NDQ0O1wiPlx1RDgzRFx1REREMTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGA7XG4gIH0pLmpvaW4oJycpO1xufVxuXG4vLyBEZWJvdW5jZSB0aW1lciBmb3IgYXV0by1wZXJzaXN0aW5nIGFjaGlldmVtZW50IHRleHQgZWRpdHMuXG5sZXQgX2FjaFBlcnNpc3RUaW1lciA9IG51bGw7XG5cbmZ1bmN0aW9uIHVwZGF0ZUFjaGlldmVtZW50VGV4dChleHBJZHgsIGFjaElkeCwgdmFsdWUpIHtcbiAgaWYgKCF3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0c1tleHBJZHhdKSByZXR1cm47XG4gIGNvbnN0IGV4aXN0aW5nID0gX25vcm1hbGl6ZUFjaGlldmVtZW50RWRpdEVudHJ5KHdpbmRvdy5hY2hpZXZlbWVudEVkaXRzW2V4cElkeF1bYWNoSWR4XSk7XG4gIGV4aXN0aW5nLnRleHQgPSB2YWx1ZTtcbiAgd2luZG93LmFjaGlldmVtZW50RWRpdHNbZXhwSWR4XVthY2hJZHhdID0gZXhpc3Rpbmc7XG5cbiAgLy8gRGVib3VuY2UtcGVyc2lzdCBzbyBlZGl0cyBzdXJ2aXZlIHRhYiBuYXZpZ2F0aW9uIGFuZCBzdGF0dXMgcG9sbGluZy5cbiAgY2xlYXJUaW1lb3V0KF9hY2hQZXJzaXN0VGltZXIpO1xuICBfYWNoUGVyc2lzdFRpbWVyID0gc2V0VGltZW91dChhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZldGNoKCcvYXBpL3NhdmUtYWNoaWV2ZW1lbnQtZWRpdHMnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBlZGl0czogd2luZG93LmFjaGlldmVtZW50RWRpdHMgfSksXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChfZSkgeyAvKiBzaWxlbnQgXHUyMDE0IHVzZXIgc3RpbGwgaGFzIGluLW1lbW9yeSBzdGF0ZSAqLyB9XG4gIH0sIDUwMCk7XG59XG5cbmZ1bmN0aW9uIHRvZ2dsZUFjaGlldmVtZW50SGlkZGVuKGV4cElkeCwgYWNoSWR4KSB7XG4gIGlmICghd2luZG93LmFjaGlldmVtZW50RWRpdHNbZXhwSWR4XSkgcmV0dXJuO1xuICBjb25zdCBleGlzdGluZyA9IF9ub3JtYWxpemVBY2hpZXZlbWVudEVkaXRFbnRyeSh3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0c1tleHBJZHhdW2FjaElkeF0pO1xuICBleGlzdGluZy5oaWRkZW4gPSAhZXhpc3RpbmcuaGlkZGVuO1xuICB3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0c1tleHBJZHhdW2FjaElkeF0gPSBleGlzdGluZztcbiAgcmVuZGVyQWNoaWV2ZW1lbnRFZGl0b3JSb3dzKGV4cElkeCk7XG59XG5cbmZ1bmN0aW9uIG1vdmVBY2hpZXZlbWVudChleHBJZHgsIGFjaElkeCwgZGlyKSB7XG4gIGNvbnN0IGFjaHMgPSB3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0c1tleHBJZHhdO1xuICBpZiAoIWFjaHMpIHJldHVybjtcbiAgY29uc3QgbmV3SWR4ID0gYWNoSWR4ICsgZGlyO1xuICBpZiAobmV3SWR4IDwgMCB8fCBuZXdJZHggPj0gYWNocy5sZW5ndGgpIHJldHVybjtcbiAgLy8gRmx1c2ggY3VycmVudCB0ZXh0YXJlYSB2YWx1ZSBiZWZvcmUgbW92aW5nXG4gIGNvbnN0IHRhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYGFjaC10ZXh0LSR7ZXhwSWR4fS0ke2FjaElkeH1gKTtcbiAgaWYgKHRhKSB1cGRhdGVBY2hpZXZlbWVudFRleHQoZXhwSWR4LCBhY2hJZHgsIHRhLnZhbHVlKTtcbiAgW2FjaHNbYWNoSWR4XSwgYWNoc1tuZXdJZHhdXSA9IFthY2hzW25ld0lkeF0sIGFjaHNbYWNoSWR4XV07XG4gIHJlbmRlckFjaGlldmVtZW50RWRpdG9yUm93cyhleHBJZHgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVBY2hpZXZlbWVudChleHBJZHgsIGFjaElkeCkge1xuICBjb25zdCBhY2hzID0gd2luZG93LmFjaGlldmVtZW50RWRpdHNbZXhwSWR4XTtcbiAgaWYgKCFhY2hzKSByZXR1cm47XG4gIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IGNvbmZpcm1EaWFsb2coXG4gICAgJ0RlbGV0ZSB0aGlzIGJ1bGxldCBmcm9tIHRoaXMgc2Vzc2lvbj8gSGlkZGVuIGJ1bGxldHMgcmVtYWluIGF2YWlsYWJsZSBmb3IgbGF0ZXIgaGFydmVzdCwgYnV0IGRlbGV0ZSByZW1vdmVzIHRoZSBlZGl0ZWQgcm93IGVudGlyZWx5LicsXG4gICAgeyBjb25maXJtTGFiZWw6ICdEZWxldGUnLCBjYW5jZWxMYWJlbDogJ0NhbmNlbCcsIGRhbmdlcjogdHJ1ZSB9LFxuICApO1xuICBpZiAoIWNvbmZpcm1lZCkgcmV0dXJuO1xuICBhY2hzLnNwbGljZShhY2hJZHgsIDEpO1xuICByZW5kZXJBY2hpZXZlbWVudEVkaXRvclJvd3MoZXhwSWR4KTtcbn1cblxuZnVuY3Rpb24gYWRkQWNoaWV2ZW1lbnRSb3coZXhwSWR4KSB7XG4gIGlmICghd2luZG93LmFjaGlldmVtZW50RWRpdHNbZXhwSWR4XSkgd2luZG93LmFjaGlldmVtZW50RWRpdHNbZXhwSWR4XSA9IFtdO1xuICB3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0c1tleHBJZHhdLnB1c2goeyB0ZXh0OiAnJywgaGlkZGVuOiBmYWxzZSB9KTtcbiAgcmVuZGVyQWNoaWV2ZW1lbnRFZGl0b3JSb3dzKGV4cElkeCk7XG4gIC8vIEZvY3VzIHRoZSBuZXcgdGV4dGFyZWFcbiAgY29uc3QgbmV3SWR4ID0gd2luZG93LmFjaGlldmVtZW50RWRpdHNbZXhwSWR4XS5sZW5ndGggLSAxO1xuICBjb25zdCB0YSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBhY2gtdGV4dC0ke2V4cElkeH0tJHtuZXdJZHh9YCk7XG4gIGlmICh0YSkgdGEuZm9jdXMoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmV3cml0ZUFjaGlldmVtZW50V2l0aExMTShleHBJZHgsIGFjaElkeCkge1xuICBjb25zdCB0YSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBhY2gtdGV4dC0ke2V4cElkeH0tJHthY2hJZHh9YCk7XG4gIGlmICghdGEpIHJldHVybjtcbiAgY29uc3Qgb3JpZ2luYWxUZXh0ID0gdGEudmFsdWUudHJpbSgpO1xuICBpZiAoIW9yaWdpbmFsVGV4dCkgeyBzaG93VG9hc3QoJ1BsZWFzZSBlbnRlciBhIGJ1bGxldCBmaXJzdC4nLCAnZXJyb3InKTsgcmV0dXJuOyB9XG5cbiAgX3Jld3JpdGVTdWdnZXN0aW9uSGlzdG9yeSA9IFtdO1xuICBfbGFzdFJld3JpdGVMb2dJZCA9IG51bGw7XG4gIF9vcGVuUmV3cml0ZU1vZGFsKG9yaWdpbmFsVGV4dCwgJycsIG51bGwsIHtcbiAgICBleHBlcmllbmNlSW5kZXg6IGV4cElkeCxcbiAgICBhY2hpZXZlbWVudEluZGV4OiBhY2hJZHgsXG4gICAgb25BY2NlcHQ6IGFzeW5jIChzdWdnZXN0aW9uKSA9PiB7XG4gICAgICB1cGRhdGVBY2hpZXZlbWVudFRleHQoZXhwSWR4LCBhY2hJZHgsIHN1Z2dlc3Rpb24pO1xuICAgICAgaWYgKHRhKSB0YS52YWx1ZSA9IHN1Z2dlc3Rpb247XG4gICAgICBfcmVjb3JkUmV3cml0ZU91dGNvbWUoJ2FjY2VwdGVkJywgc3VnZ2VzdGlvbik7XG4gICAgICBzaG93VG9hc3QoJ0J1bGxldCB1cGRhdGVkLicpO1xuICAgIH0sXG4gIH0pO1xuICBhd2FpdCBfcnVuUmV3cml0ZShvcmlnaW5hbFRleHQpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBhaVJld3JpdGVUb3BMZXZlbEFjaGlldmVtZW50KGFjaElkKSB7XG4gIGNvbnN0IGFjaCA9ICh3aW5kb3cuX2FjaGlldmVtZW50c09yZGVyZWQgfHwgW10pLmZpbmQoYSA9PiBhLmlkID09PSBhY2hJZCk7XG4gIGlmICghYWNoKSByZXR1cm47XG4gIGNvbnN0IG9yaWdpbmFsVGV4dCA9IGFjaC5kZXNjcmlwdGlvbiB8fCAnJztcbiAgaWYgKCFvcmlnaW5hbFRleHQpIHsgc2hvd1RvYXN0KCdQbGVhc2UgZW50ZXIgYSBkZXNjcmlwdGlvbiBmaXJzdC4nLCAnZXJyb3InKTsgcmV0dXJuOyB9XG5cbiAgX3Jld3JpdGVTdWdnZXN0aW9uSGlzdG9yeSA9IFtdO1xuICBfbGFzdFJld3JpdGVMb2dJZCA9IG51bGw7XG4gIF9vcGVuUmV3cml0ZU1vZGFsKG9yaWdpbmFsVGV4dCwgJycsIG51bGwsIHtcbiAgICBleHBlcmllbmNlSW5kZXg6IG51bGwsXG4gICAgb25BY2NlcHQ6IGFzeW5jIChzdWdnZXN0aW9uKSA9PiB7XG4gICAgICBhd2FpdCBzYXZlVG9wTGV2ZWxBY2hpZXZlbWVudEZpZWxkKGFjaElkLCAnZGVzY3JpcHRpb24nLCBzdWdnZXN0aW9uKTtcbiAgICAgIGNvbnN0IGRlc2NFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBhY2gtZGVzYy0ke0NTUy5lc2NhcGUoYWNoSWQpfWApO1xuICAgICAgaWYgKGRlc2NFbCkgZGVzY0VsLnZhbHVlID0gc3VnZ2VzdGlvbjtcbiAgICAgIF9yZWNvcmRSZXdyaXRlT3V0Y29tZSgnYWNjZXB0ZWQnLCBzdWdnZXN0aW9uKTtcbiAgICAgIHNob3dUb2FzdCgnQWNoaWV2ZW1lbnQgdXBkYXRlZC4nKTtcbiAgICB9LFxuICB9KTtcbiAgYXdhaXQgX3J1blJld3JpdGUob3JpZ2luYWxUZXh0KTtcbn1cblxuZnVuY3Rpb24gX29wZW5SZXdyaXRlTW9kYWwob3JpZ2luYWxUZXh0LCBjdXJyZW50SW5zdHJ1Y3Rpb25zLCBjdXJyZW50U3VnZ2VzdGlvbiwgY2FsbGJhY2tzKSB7XG4gIF9yZXdyaXRlQ2FsbGJhY2tzID0gY2FsbGJhY2tzO1xuXG4gIGNvbnN0IHN1Z2dlc3RlZEh0bWwgPSBjdXJyZW50U3VnZ2VzdGlvbiAhPSBudWxsXG4gICAgPyBgPHAgaWQ9XCJhY2gtcmV3cml0ZS1zdWdnZXN0aW9uXCIgc3R5bGU9XCJtYXJnaW46NHB4IDAgMDttaW4taGVpZ2h0OjIuNGVtO1wiPiR7ZXNjYXBlSHRtbChjdXJyZW50U3VnZ2VzdGlvbil9PC9wPmBcbiAgICA6IGA8cCBpZD1cImFjaC1yZXdyaXRlLXN1Z2dlc3Rpb25cIiBzdHlsZT1cIm1hcmdpbjo0cHggMCAwO21pbi1oZWlnaHQ6Mi40ZW07Y29sb3I6IzljYTNhZjtmb250LXN0eWxlOml0YWxpYztcIj5cdTIzRjMgR2VuZXJhdGluZ1x1MjAyNjwvcD5gO1xuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhbGVydC1tb2RhbC10aXRsZScpLnRleHRDb250ZW50ID0gJ1x1MjcyOCBBSSBSZXdyaXRlJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FsZXJ0LW1vZGFsLW1lc3NhZ2UnKS5pbm5lckhUTUwgPSBgXG4gICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTBweDtcIj5cbiAgICAgIDxzdHJvbmc+T3JpZ2luYWw6PC9zdHJvbmc+XG4gICAgICA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7bWFyZ2luOjRweCAwIDA7Zm9udC1zdHlsZTppdGFsaWM7Zm9udC1zaXplOjAuOTJlbTtcIj4ke2VzY2FwZUh0bWwob3JpZ2luYWxUZXh0KX08L3A+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTJweDtcIj5cbiAgICAgIDxzdHJvbmc+U3VnZ2VzdGVkOjwvc3Ryb25nPlxuICAgICAgJHtzdWdnZXN0ZWRIdG1sfVxuICAgIDwvZGl2PlxuICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE2cHg7XCI+XG4gICAgICA8bGFiZWwgZm9yPVwiYWNoLXJld3JpdGUtaW5zdHJ1Y3Rpb25zXCIgc3R5bGU9XCJmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjAuOTJlbTtkaXNwbGF5OmJsb2NrO21hcmdpbi1ib3R0b206NHB4O1wiPkluc3RydWN0aW9ucyA8c3BhbiBzdHlsZT1cImZvbnQtd2VpZ2h0OjQwMDtjb2xvcjojNmI3MjgwO1wiPihvcHRpb25hbCk8L3NwYW4+PC9sYWJlbD5cbiAgICAgIDx0ZXh0YXJlYSBpZD1cImFjaC1yZXdyaXRlLWluc3RydWN0aW9uc1wiXG4gICAgICAgIHJvd3M9XCIyXCJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIG1ha2UgaXQgbW9yZSBjb25jaXNlLCBlbXBoYXNpc2UgbGVhZGVyc2hpcCwgYWRkIGEgbWV0cmljXCJcbiAgICAgICAgc3R5bGU9XCJ3aWR0aDoxMDAlO2JveC1zaXppbmc6Ym9yZGVyLWJveDtwYWRkaW5nOjZweCA4cHg7Ym9yZGVyOjFweCBzb2xpZCAjZDFkNWRiO2JvcmRlci1yYWRpdXM6NnB4O2ZvbnQtc2l6ZTowLjllbTtyZXNpemU6dmVydGljYWw7XCJcbiAgICAgID4ke2VzY2FwZUh0bWwoY3VycmVudEluc3RydWN0aW9ucyl9PC90ZXh0YXJlYT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDo4cHg7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kO1wiPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1zZWNvbmRhcnlcIiBpZD1cImFjaC1yZXdyaXRlLXJlamVjdC1idG5cIiBvbmNsaWNrPVwiX3JlY29yZFJld3JpdGVPdXRjb21lKCdyZWplY3RlZCcpOyBjbG9zZUFsZXJ0TW9kYWwoKVwiPlJlamVjdDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1zZWNvbmRhcnlcIiBpZD1cImFjaC1yZXdyaXRlLWdlbmVyYXRlLWJ0blwiPkdlbmVyYXRlPC9idXR0b24+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiY29udGludWUtYnRuXCIgIGlkPVwiYWNoLXJld3JpdGUtYWNjZXB0LWJ0blwiPkFjY2VwdDwvYnV0dG9uPlxuICAgIDwvZGl2PmA7XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FsZXJ0LW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBzZXRJbml0aWFsRm9jdXMoJ2FsZXJ0LW1vZGFsLW92ZXJsYXknKTtcbiAgdHJhcEZvY3VzKCdhbGVydC1tb2RhbC1vdmVybGF5Jyk7XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaC1yZXdyaXRlLWdlbmVyYXRlLWJ0bicpLm9uY2xpY2sgPSAoKSA9PiBfcnVuUmV3cml0ZShvcmlnaW5hbFRleHQpO1xuXG4gIF91cGRhdGVSZXdyaXRlQWNjZXB0QnRuKGN1cnJlbnRTdWdnZXN0aW9uKTtcbn1cblxuZnVuY3Rpb24gX3VwZGF0ZVJld3JpdGVBY2NlcHRCdG4oc3VnZ2VzdGlvbikge1xuICBjb25zdCBhY2NlcHRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLXJld3JpdGUtYWNjZXB0LWJ0bicpO1xuICBpZiAoIWFjY2VwdEJ0bikgcmV0dXJuO1xuICBhY2NlcHRCdG4uZGlzYWJsZWQgPSBzdWdnZXN0aW9uID09IG51bGw7XG4gIGFjY2VwdEJ0bi5vbmNsaWNrID0gc3VnZ2VzdGlvbiA9PSBudWxsID8gbnVsbCA6IGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBfcmV3cml0ZUNhbGxiYWNrcy5vbkFjY2VwdChzdWdnZXN0aW9uKTtcbiAgICBjbG9zZUFsZXJ0TW9kYWwoKTtcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gX3JlY29yZFJld3JpdGVPdXRjb21lKG91dGNvbWUsIGFjY2VwdGVkVGV4dCkge1xuICBpZiAoIV9sYXN0UmV3cml0ZUxvZ0lkKSByZXR1cm47XG4gIGNvbnN0IGxvZ0lkID0gX2xhc3RSZXdyaXRlTG9nSWQ7XG4gIF9sYXN0UmV3cml0ZUxvZ0lkID0gbnVsbDtcbiAgY29uc3QgYm9keSA9IHsgbG9nX2lkOiBsb2dJZCwgb3V0Y29tZSB9O1xuICBpZiAoYWNjZXB0ZWRUZXh0ICE9IG51bGwpIGJvZHkuYWNjZXB0ZWRfdGV4dCA9IGFjY2VwdGVkVGV4dDtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmZXRjaCgnL2FwaS9yZXdyaXRlLWFjaGlldmVtZW50LW91dGNvbWUnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgfSk7XG4gIH0gY2F0Y2ggKF8pIHsgLyogZmlyZS1hbmQtZm9yZ2V0IFx1MjAxNCBkb24ndCBkaXNydXB0IHRoZSBVSSAqLyB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9ydW5SZXdyaXRlKG9yaWdpbmFsVGV4dCkge1xuICBjb25zdCBpbnN0cnVjdGlvbnNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhY2gtcmV3cml0ZS1pbnN0cnVjdGlvbnMnKTtcbiAgY29uc3QgdXNlckluc3RydWN0aW9ucyA9IGluc3RydWN0aW9uc0VsID8gaW5zdHJ1Y3Rpb25zRWwudmFsdWUudHJpbSgpIDogJyc7XG5cbiAgY29uc3QgZ2VuZXJhdGVCdG4gID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaC1yZXdyaXRlLWdlbmVyYXRlLWJ0bicpO1xuICBjb25zdCBhY2NlcHRCdG4gICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLXJld3JpdGUtYWNjZXB0LWJ0bicpO1xuICBjb25zdCByZWplY3RCdG4gICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLXJld3JpdGUtcmVqZWN0LWJ0bicpO1xuICBjb25zdCBzdWdnZXN0aW9uRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLXJld3JpdGUtc3VnZ2VzdGlvbicpO1xuXG4gIC8vIENhcHR1cmUgdGhlIGN1cnJlbnQgc3VnZ2VzdGlvbiBhcyBhIHByaW9yIGF0dGVtcHQgYmVmb3JlIG92ZXJ3cml0aW5nXG4gIGlmIChzdWdnZXN0aW9uRWwpIHtcbiAgICBjb25zdCBwcmV2ID0gc3VnZ2VzdGlvbkVsLnRleHRDb250ZW50LnRyaW0oKTtcbiAgICBpZiAocHJldiAmJiBwcmV2ICE9PSAnR2VuZXJhdGluZ1x1MjAyNicgJiYgIXByZXYuc3RhcnRzV2l0aCgnRXJyb3I6JykgJiYgIV9yZXdyaXRlU3VnZ2VzdGlvbkhpc3RvcnkuaW5jbHVkZXMocHJldikpIHtcbiAgICAgIF9yZXdyaXRlU3VnZ2VzdGlvbkhpc3RvcnkucHVzaChwcmV2KTtcbiAgICB9XG4gIH1cblxuICBpZiAoZ2VuZXJhdGVCdG4pIHsgZ2VuZXJhdGVCdG4uZGlzYWJsZWQgPSB0cnVlOyBnZW5lcmF0ZUJ0bi5pbm5lckhUTUwgPSAnPHNwYW4gY2xhc3M9XCJidG4tc3Bpbm5lclwiPjwvc3Bhbj5HZW5lcmF0aW5nXFx1MjAyNic7IH1cbiAgaWYgKGFjY2VwdEJ0bikgICB7IGFjY2VwdEJ0bi5kaXNhYmxlZCA9IHRydWU7IH1cbiAgaWYgKHN1Z2dlc3Rpb25FbCkgeyBzdWdnZXN0aW9uRWwuc3R5bGUuY29sb3IgPSAnIzljYTNhZic7IHN1Z2dlc3Rpb25FbC5zdHlsZS5mb250U3R5bGUgPSAnaXRhbGljJzsgc3VnZ2VzdGlvbkVsLnRleHRDb250ZW50ID0gJ0dlbmVyYXRpbmdcdTIwMjYnOyB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9yZXdyaXRlLWFjaGlldmVtZW50Jywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgYWNoaWV2ZW1lbnRfdGV4dDogICAgIG9yaWdpbmFsVGV4dCxcbiAgICAgICAgZXhwZXJpZW5jZV9pbmRleDogICAgIF9yZXdyaXRlQ2FsbGJhY2tzPy5leHBlcmllbmNlSW5kZXggPz8gbnVsbCxcbiAgICAgICAgYWNoaWV2ZW1lbnRfaW5kZXg6ICAgIF9yZXdyaXRlQ2FsbGJhY2tzPy5hY2hpZXZlbWVudEluZGV4ID8/IG51bGwsXG4gICAgICAgIHVzZXJfaW5zdHJ1Y3Rpb25zOiAgICB1c2VySW5zdHJ1Y3Rpb25zLFxuICAgICAgICBwcmV2aW91c19zdWdnZXN0aW9uczogX3Jld3JpdGVTdWdnZXN0aW9uSGlzdG9yeSxcbiAgICAgIH0pXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKCFyZXMub2spIHRocm93IG5ldyBFcnJvcihkYXRhLmVycm9yIHx8ICdSZXdyaXRlIGZhaWxlZCcpO1xuXG4gICAgY29uc3QgcmV3cml0dGVuID0gZGF0YS5yZXdyaXR0ZW4gfHwgJyc7XG4gICAgX2xhc3RSZXdyaXRlTG9nSWQgPSBkYXRhLmxvZ19pZCB8fCBudWxsO1xuICAgIGlmIChzdWdnZXN0aW9uRWwpIHtcbiAgICAgIHN1Z2dlc3Rpb25FbC5zdHlsZS5jb2xvciA9ICcnO1xuICAgICAgc3VnZ2VzdGlvbkVsLnN0eWxlLmZvbnRTdHlsZSA9ICcnO1xuICAgICAgc3VnZ2VzdGlvbkVsLnRleHRDb250ZW50ID0gcmV3cml0dGVuO1xuICAgIH1cbiAgICBfdXBkYXRlUmV3cml0ZUFjY2VwdEJ0bihyZXdyaXR0ZW4pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoc3VnZ2VzdGlvbkVsKSB7IHN1Z2dlc3Rpb25FbC5zdHlsZS5jb2xvciA9ICcjZWY0NDQ0Jzsgc3VnZ2VzdGlvbkVsLnN0eWxlLmZvbnRTdHlsZSA9ICcnOyBzdWdnZXN0aW9uRWwudGV4dENvbnRlbnQgPSBgRXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YDsgfVxuICAgIHNob3dUb2FzdChgQUkgcmV3cml0ZSBmYWlsZWQ6ICR7ZXJyLm1lc3NhZ2V9YCwgJ2Vycm9yJyk7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKGdlbmVyYXRlQnRuKSB7IGdlbmVyYXRlQnRuLmRpc2FibGVkID0gZmFsc2U7IGdlbmVyYXRlQnRuLnRleHRDb250ZW50ID0gJ0dlbmVyYXRlJzsgfVxuICAgIGlmIChyZWplY3RCdG4pICAgeyByZWplY3RCdG4uZGlzYWJsZWQgPSBmYWxzZTsgfVxuICB9XG59XG5cbi8qKlxuICogU2F2ZSBhIHNpbmdsZSBmaWVsZCBvZiBhIHRvcC1sZXZlbCBhY2hpZXZlbWVudCBpbiBzZXNzaW9uIHN0YXRlIGFuZCB1cGRhdGUgdGhlIGxvY2FsIGNhY2hlLlxuICovXG5hc3luYyBmdW5jdGlvbiBzYXZlVG9wTGV2ZWxBY2hpZXZlbWVudEZpZWxkKGFjaElkLCBmaWVsZCwgdmFsdWUpIHtcbiAgY29uc3QgYWNoID0gKHdpbmRvdy5fYWNoaWV2ZW1lbnRzT3JkZXJlZCB8fCBbXSkuZmluZChhID0+IGEuaWQgPT09IGFjaElkKTtcbiAgY29uc3QgcHJldmlvdXMgPSBhY2ggPyBhY2hbZmllbGRdIDogdW5kZWZpbmVkO1xuICBpZiAoYWNoKSBhY2hbZmllbGRdID0gdmFsdWU7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvcmV2aWV3LWFjaGlldmVtZW50Jywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgaWQ6IGFjaElkLCBmaWVsZCwgdmFsdWUgfSksXG4gICAgfSk7XG4gICAgaWYgKCFyZXMub2spIHRocm93IG5ldyBFcnJvcigoYXdhaXQgcmVzLmpzb24oKSkuZXJyb3IgfHwgJ1NhdmUgZmFpbGVkJyk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIFJvbGwgYmFjayB0aGUgb3B0aW1pc3RpYyB1cGRhdGVcbiAgICBpZiAoYWNoICYmIHByZXZpb3VzICE9PSB1bmRlZmluZWQpIGFjaFtmaWVsZF0gPSBwcmV2aW91cztcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGZpZWxkID09PSAndGl0bGUnID8gYGFjaC10aXRsZS0ke0NTUy5lc2NhcGUoYWNoSWQpfWAgOiBgYWNoLWRlc2MtJHtDU1MuZXNjYXBlKGFjaElkKX1gKTtcbiAgICBpZiAoZWwpIGVsLnZhbHVlID0gcHJldmlvdXMgPz8gJyc7XG4gICAgc2hvd1RvYXN0KGBGYWlsZWQgdG8gc2F2ZSBhY2hpZXZlbWVudDogJHtlcnIubWVzc2FnZX1gLCAnZXJyb3InKTtcbiAgfVxufVxuXG4vKipcbiAqIEhpZGUgYSB0b3AtbGV2ZWwgYWNoaWV2ZW1lbnQgZm9yIHRoaXMgc2Vzc2lvbiBhZnRlciBjb25maXJtYXRpb24uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZVRvcExldmVsQWNoaWV2ZW1lbnQoYWNoSWQpIHtcbiAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgY29uZmlybURpYWxvZyhcbiAgICAnSGlkZSB0aGlzIGFjaGlldmVtZW50IGZvciB0aGlzIENWIG9ubHk/IFlvdSBjYW4gcmVzdG9yZSBpdCBieSBzdGFydGluZyBvdmVyIG9yIGNoYW5naW5nIHRoZSBzZXNzaW9uIHNlbGVjdGlvbnMuJyxcbiAgICB7IGNvbmZpcm1MYWJlbDogJ0hpZGUnLCBjYW5jZWxMYWJlbDogJ0NhbmNlbCcsIGRhbmdlcjogdHJ1ZSB9LFxuICApO1xuICBpZiAoIWNvbmZpcm1lZCkgcmV0dXJuO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3Jldmlldy1hY2hpZXZlbWVudCcsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGlkOiBhY2hJZCwgYWN0aW9uOiAnZGVsZXRlJyB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgd2luZG93Ll9hY2hpZXZlbWVudHNPcmRlcmVkID0gKHdpbmRvdy5fYWNoaWV2ZW1lbnRzT3JkZXJlZCB8fCBbXSkuZmlsdGVyKGEgPT4gYS5pZCAhPT0gYWNoSWQpO1xuICAgICAgZGVsZXRlIHdpbmRvdy5hY2hpZXZlbWVudERlY2lzaW9uc1thY2hJZF07XG4gICAgICBfcmVuZGVyQWNoaWV2ZW1lbnRzUmV2aWV3VGFibGUoKTtcbiAgICAgIHNob3dUb2FzdCgnQWNoaWV2ZW1lbnQgaGlkZGVuIGZvciB0aGlzIHNlc3Npb24uJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3dUb2FzdChkYXRhLmVycm9yIHx8ICdEZWxldGUgZmFpbGVkLicsICdlcnJvcicpO1xuICAgIH1cbiAgfSBjYXRjaCAoXykge1xuICAgIHNob3dUb2FzdCgnRmFpbGVkIHRvIGRlbGV0ZSBhY2hpZXZlbWVudC4nLCAnZXJyb3InKTtcbiAgfVxufVxuXG4vKipcbiAqIFNhdmUgYW4gZWRpdGVkIGZpZWxkIG9uIGFuIEFJLXN1Z2dlc3RlZCBhY2hpZXZlbWVudCAoaW4tbWVtb3J5IG9ubHk7XG4gKiBzdWdnZXN0aW9ucyBhcmUgbm90IHBlcnNpc3RlZCB0byB0aGUgc2VydmVyIHVudGlsIGFjY2VwdGVkKS5cbiAqL1xuZnVuY3Rpb24gc2F2ZVN1Z2dlc3RlZEFjaGlldmVtZW50RmllbGQoc3VnZ0lkLCBmaWVsZCwgdmFsdWUpIHtcbiAgY29uc3Qgc3VnZyA9ICh3aW5kb3cuX3N1Z2dlc3RlZEFjaHNPcmRlcmVkIHx8IFtdKS5maW5kKHMgPT4gcy5fc3VnZ0lkID09PSBzdWdnSWQpO1xuICBpZiAoc3VnZykgc3VnZ1tmaWVsZF0gPSB2YWx1ZTtcbn1cblxuLyoqXG4gKiBPcGVuIHRoZSBBSSByZXdyaXRlIG1vZGFsIGZvciBhIHN1Z2dlc3RlZCBhY2hpZXZlbWVudCBkZXNjcmlwdGlvbi5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYWlSZXdyaXRlU3VnZ2VzdGVkQWNoaWV2ZW1lbnQoc3VnZ0lkKSB7XG4gIGNvbnN0IHN1Z2cgPSAod2luZG93Ll9zdWdnZXN0ZWRBY2hzT3JkZXJlZCB8fCBbXSkuZmluZChzID0+IHMuX3N1Z2dJZCA9PT0gc3VnZ0lkKTtcbiAgaWYgKCFzdWdnKSByZXR1cm47XG4gIGNvbnN0IG9yaWdpbmFsVGV4dCA9IHN1Z2cuZGVzY3JpcHRpb24gfHwgJyc7XG4gIGlmICghb3JpZ2luYWxUZXh0KSB7IHNob3dUb2FzdCgnUGxlYXNlIGVudGVyIGEgZGVzY3JpcHRpb24gZmlyc3QuJywgJ2Vycm9yJyk7IHJldHVybjsgfVxuXG4gIF9yZXdyaXRlU3VnZ2VzdGlvbkhpc3RvcnkgPSBbXTtcbiAgX2xhc3RSZXdyaXRlTG9nSWQgPSBudWxsO1xuICBfb3BlblJld3JpdGVNb2RhbChvcmlnaW5hbFRleHQsICcnLCBudWxsLCB7XG4gICAgZXhwZXJpZW5jZUluZGV4OiBudWxsLFxuICAgIG9uQWNjZXB0OiBhc3luYyAoc3VnZ2VzdGlvbikgPT4ge1xuICAgICAgc2F2ZVN1Z2dlc3RlZEFjaGlldmVtZW50RmllbGQoc3VnZ0lkLCAnZGVzY3JpcHRpb24nLCBzdWdnZXN0aW9uKTtcbiAgICAgIGNvbnN0IGRlc2NFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBhY2gtZGVzYy0ke3N1Z2dJZH1gKTtcbiAgICAgIGlmIChkZXNjRWwpIGRlc2NFbC52YWx1ZSA9IHN1Z2dlc3Rpb247XG4gICAgICBfcmVjb3JkUmV3cml0ZU91dGNvbWUoJ2FjY2VwdGVkJywgc3VnZ2VzdGlvbik7XG4gICAgICBzaG93VG9hc3QoJ0FjaGlldmVtZW50IHVwZGF0ZWQuJyk7XG4gICAgfSxcbiAgfSk7XG4gIGF3YWl0IF9ydW5SZXdyaXRlKG9yaWdpbmFsVGV4dCk7XG59XG5cbi8qKlxuICogTW92ZSBhIHN1Z2dlc3RlZCBhY2hpZXZlbWVudCB1cCBvciBkb3duIHdpdGhpbiB0aGUgZGlzcGxheSBvcmRlci5cbiAqIFN0YWJsZSBJRHMgbWVhbiBubyBkZWNpc2lvbiByZW1hcHBpbmcgaXMgbmVlZGVkLlxuICovXG5mdW5jdGlvbiBtb3ZlU3VnZ2VzdGVkQWNoaWV2ZW1lbnRSb3coc3VnZ0lkLCBkaXJlY3Rpb24pIHtcbiAgY29uc3QgYXJyID0gd2luZG93Ll9zdWdnZXN0ZWRBY2hzT3JkZXJlZDtcbiAgaWYgKCFhcnIpIHJldHVybjtcbiAgY29uc3QgaWR4ID0gYXJyLmZpbmRJbmRleChzID0+IHMuX3N1Z2dJZCA9PT0gc3VnZ0lkKTtcbiAgaWYgKGlkeCA8IDApIHJldHVybjtcbiAgY29uc3QgbmV3SWR4ID0gaWR4ICsgZGlyZWN0aW9uO1xuICBpZiAobmV3SWR4IDwgMCB8fCBuZXdJZHggPj0gYXJyLmxlbmd0aCkgcmV0dXJuO1xuICBbYXJyW2lkeF0sIGFycltuZXdJZHhdXSA9IFthcnJbbmV3SWR4XSwgYXJyW2lkeF1dO1xuICBfcmVuZGVyQWNoaWV2ZW1lbnRzUmV2aWV3VGFibGUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaGlldmVtZW50cy10YWJsZS1jb250YWluZXInKSk7XG59XG5cbi8qKlxuICogUmVtb3ZlIGEgc3VnZ2VzdGVkIGFjaGlldmVtZW50IGZyb20gdGhlIGxpc3QgYWZ0ZXIgY29uZmlybWF0aW9uLlxuICogU3RhYmxlIElEcyBtZWFuIG5vIG90aGVyIGRlY2lzaW9uIGtleXMgbmVlZCByZW1hcHBpbmcuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZVN1Z2dlc3RlZEFjaGlldmVtZW50KHN1Z2dJZCkge1xuICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCBjb25maXJtRGlhbG9nKCdSZW1vdmUgdGhpcyBBSSBzdWdnZXN0aW9uPycsIHsgY29uZmlybUxhYmVsOiAnUmVtb3ZlJywgZGFuZ2VyOiB0cnVlIH0pO1xuICBpZiAoIWNvbmZpcm1lZCkgcmV0dXJuO1xuICB3aW5kb3cuX3N1Z2dlc3RlZEFjaHNPcmRlcmVkID0gKHdpbmRvdy5fc3VnZ2VzdGVkQWNoc09yZGVyZWQgfHwgW10pLmZpbHRlcihzID0+IHMuX3N1Z2dJZCAhPT0gc3VnZ0lkKTtcbiAgZGVsZXRlIHdpbmRvdy5hY2hpZXZlbWVudERlY2lzaW9uc1tzdWdnSWRdO1xuICBfcmVuZGVyQWNoaWV2ZW1lbnRzUmV2aWV3VGFibGUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaGlldmVtZW50cy10YWJsZS1jb250YWluZXInKSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNhdmVBY2hpZXZlbWVudEVkaXRzQW5kQ29udGludWUoKSB7XG4gIHRyeSB7XG4gICAgLy8gRmx1c2ggYW55IGN1cnJlbnRseS1mb2N1c2VkIHRleHRhcmVhc1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tpZF49XCJhY2gtdGV4dC1cIl0nKS5mb3JFYWNoKHRhID0+IHtcbiAgICAgIGNvbnN0IHBhcnRzID0gdGEuaWQuc3BsaXQoJy0nKTtcbiAgICAgIGlmIChwYXJ0cy5sZW5ndGggPj0gNCkge1xuICAgICAgICBjb25zdCBleHBJZHggPSBwYXJzZUludChwYXJ0c1syXSk7XG4gICAgICAgIGNvbnN0IGFjaElkeCA9IHBhcnNlSW50KHBhcnRzWzNdKTtcbiAgICAgICAgaWYgKCFpc05hTihleHBJZHgpICYmICFpc05hTihhY2hJZHgpICYmIHdpbmRvdy5hY2hpZXZlbWVudEVkaXRzW2V4cElkeF0pIHtcbiAgICAgICAgICB1cGRhdGVBY2hpZXZlbWVudFRleHQoZXhwSWR4LCBhY2hJZHgsIHRhLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvc2F2ZS1hY2hpZXZlbWVudC1lZGl0cycsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGVkaXRzOiB3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0cyB9KVxuICAgIH0pO1xuICAgIGlmICghcmVzLm9rKSB7XG4gICAgICBjb25zdCBlcnIgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgc2hvd1RvYXN0KGBFcnJvciBzYXZpbmc6ICR7ZXJyLmVycm9yIHx8ICdVbmtub3duIGVycm9yJ31gLCAnZXJyb3InKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3RhdGVNYW5hZ2VyLm1hcmtDb250ZW50Q2hhbmdlZCgpO1xuICAgIHNob3dUb2FzdCgnQWNoaWV2ZW1lbnQgZWRpdHMgc2F2ZWQuJyk7XG4gICAgc3dpdGNoVGFiKCdza2lsbHMtcmV2aWV3Jyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBzaG93VG9hc3QoJ0ZhaWxlZCB0byBzYXZlIGFjaGlldmVtZW50IGVkaXRzLicsICdlcnJvcicpO1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIGZldGNoSnNvbldpdGhUaW1lb3V0LFxuICBfYWNoVmVyYldhcm5pbmcsXG4gIF9hY2hTbmFwc2hvdEtleSxcbiAgX3NhdmVBY2hTbmFwc2hvdCxcbiAgX2dldEFjaFNuYXBzaG90LFxuICBidWlsZEFjaGlldmVtZW50c1Jldmlld1RhYmxlLFxuICBfcmVuZGVyQWNoaWV2ZW1lbnRzUmV2aWV3VGFibGUsXG4gIGJ1bGtBY2hpZXZlbWVudEFjdGlvbixcbiAgaGFuZGxlQWNoaWV2ZW1lbnRBY3Rpb24sXG4gIHN1Ym1pdEFjaGlldmVtZW50RGVjaXNpb25zLFxuICBtb3ZlQWNoaWV2ZW1lbnRSb3csXG4gIGJ1aWxkQWNoaWV2ZW1lbnRzRWRpdG9yLFxuICByZW5kZXJBY2hpZXZlbWVudEVkaXRvclJvd3MsXG4gIHVwZGF0ZUFjaGlldmVtZW50VGV4dCxcbiAgdG9nZ2xlQWNoaWV2ZW1lbnRIaWRkZW4sXG4gIG1vdmVBY2hpZXZlbWVudCxcbiAgZGVsZXRlQWNoaWV2ZW1lbnQsXG4gIGFkZEFjaGlldmVtZW50Um93LFxuICByZXdyaXRlQWNoaWV2ZW1lbnRXaXRoTExNLFxuICBhaVJld3JpdGVUb3BMZXZlbEFjaGlldmVtZW50LFxuICBfb3BlblJld3JpdGVNb2RhbCxcbiAgX3VwZGF0ZVJld3JpdGVBY2NlcHRCdG4sXG4gIF9yZWNvcmRSZXdyaXRlT3V0Y29tZSxcbiAgX3J1blJld3JpdGUsXG4gIHNhdmVUb3BMZXZlbEFjaGlldmVtZW50RmllbGQsXG4gIGRlbGV0ZVRvcExldmVsQWNoaWV2ZW1lbnQsXG4gIHNhdmVTdWdnZXN0ZWRBY2hpZXZlbWVudEZpZWxkLFxuICBhaVJld3JpdGVTdWdnZXN0ZWRBY2hpZXZlbWVudCxcbiAgbW92ZVN1Z2dlc3RlZEFjaGlldmVtZW50Um93LFxuICBkZWxldGVTdWdnZXN0ZWRBY2hpZXZlbWVudCxcbiAgc2F2ZUFjaGlldmVtZW50RWRpdHNBbmRDb250aW51ZSxcbn07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi90YWdsaW5lLXJldmlldy5qc1xuICogQXBwbGljYW50IHRhZ2xpbmUgKGhlYWRsaW5lKSByZXZpZXc6IGRpc3BsYXkgQUktcHJvcG9zZWQgdGFnbGluZSxcbiAqIGFsbG93IGVkaXRpbmcsIHJlcXVpcmUgZXhwbGljaXQgdXNlciBjb25maXJtYXRpb24gYmVmb3JlIGNvbnRpbnVpbmcuXG4gKlxuICogVGhlIHRhZ2xpbmUgaXMgdGhlIG9uZS1saW5lIHByb2Zlc3Npb25hbCBpZGVudGl0eSBzaG93biB1bmRlciB0aGVcbiAqIGFwcGxpY2FudCdzIG5hbWUgb24gdGhlIENWLiAgSXQgaXMgTk9UIHRoZSBzYW1lIGFzIHRoZSBqb2IgdGl0bGUgXHUyMDE0XG4gKiBpdCBkZXNjcmliZXMgdGhlIGFwcGxpY2FudCAoZS5nLiBcIlNlbmlvciBEYXRhIFNjaWVudGlzdCBzcGVjaWFsaXNpbmdcbiAqIGluIGJpb3N0YXRpc3RpY3MgYW5kIE1MXCIpLCBub3QgdGhlIHJvbGUgYmVpbmcgYXBwbGllZCBmb3IuXG4gKlxuICogVXNlciBNVVNUIGNsaWNrIFwiQ29uZmlybSBUYWdsaW5lXCIgYmVmb3JlIGdlbmVyYXRpb24gaXMgYWxsb3dlZC5cbiAqIFRoZSBjb25maXJtZWQgdGV4dCBpcyBzdG9yZWQgdmlhIFBPU1QgL2FwaS9yZXZpZXctZGVjaXNpb25zICh0eXBlOiAndGFnbGluZScpLlxuICpcbiAqIERlcGVuZGVuY2llcyAocmVzb2x2ZWQgdGhyb3VnaCBnbG9iYWxUaGlzIGF0IHJ1bnRpbWUpOlxuICogICBlc2NhcGVIdG1sLCBzaG93VG9hc3QsIHN3aXRjaFRhYiwgc3RhdGVNYW5hZ2VyXG4gKi9cblxuaW1wb3J0IHsgc3RhdGVNYW5hZ2VyIH0gZnJvbSAnLi9zdGF0ZS1tYW5hZ2VyLmpzJztcblxuLy8gXHUyNTAwXHUyNTAwIEJ1aWxkIHRhZ2xpbmUtcmV2aWV3IHNlY3Rpb24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8qKlxuICogZHVja2Zsb3c6XG4gKiAgIGlkOiB0YWdsaW5lX3VpX2J1aWxkXG4gKiAgIGtpbmQ6IHVpXG4gKiAgIHRpbWVzdGFtcDogXCIyMDI2LTA1LTI4VDAwOjAwOjAwWlwiXG4gKiAgIHN0YXR1czogbGl2ZVxuICogICBoYW5kbGVzOiBbXCJ1aTp0YWdsaW5lLXJldmlldy5idWlsZFwiXVxuICogICByZWFkczpcbiAqICAgICAtIFwid2luZG93OnBlbmRpbmdSZWNvbW1lbmRhdGlvbnNcIlxuICogICAgIC0gXCJyZXNwb25zZTpHRVQgL2FwaS9zdGF0dXMudGFnbGluZV9vdmVycmlkZVwiXG4gKiAgICAgLSBcInJlc3BvbnNlOkdFVCAvYXBpL3N0YXR1cy5kZWNpc2lvbnNfY29uZmlybWVkXCJcbiAqICAgd3JpdGVzOiBbXCJkb206I3RhZ2xpbmUtcmV2aWV3LWNvbnRhaW5lclwiXVxuICogICBub3RlczogXCJSZW5kZXJzIHByb3Bvc2VkIHRhZ2xpbmUgKGZyb20gTExNIGN1c3RvbWl6YXRpb25zKSB3aXRoIGFuIGVkaXRhYmxlIGlucHV0IGFuZCBjb25maXJtIGJ1dHRvbi5cIlxuICovXG5hc3luYyBmdW5jdGlvbiBidWlsZFRhZ2xpbmVSZXZpZXdTZWN0aW9uKCkge1xuICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFnbGluZS1yZXZpZXctY29udGFpbmVyJyk7XG4gIGlmICghY29udGFpbmVyKSByZXR1cm47XG5cbiAgLy8gRmV0Y2ggY3VycmVudCBzdGF0dXMgdG8gZ2V0IHRhZ2xpbmVfb3ZlcnJpZGUgKyBwcm9wb3NlZCB0YWdsaW5lXG4gIGxldCBwcm9wb3NlZFRhZ2xpbmUgID0gJyc7XG4gIGxldCBjb25maXJtZWRUYWdsaW5lID0gJyc7XG4gIGxldCBhbHJlYWR5Q29uZmlybWVkID0gZmFsc2U7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgICAgPSBhd2FpdCBmZXRjaCgnL2FwaS9zdGF0dXMnKTtcbiAgICBjb25zdCBzdGF0dXMgPSByZXMub2sgPyBhd2FpdCByZXMuanNvbigpIDoge307XG5cbiAgICAvLyB0YWdsaW5lX292ZXJyaWRlIGlzIHRoZSB1c2VyLWNvbmZpcm1lZCB2YWx1ZSAobWF5IGJlIG51bGwpXG4gICAgY29uZmlybWVkVGFnbGluZSA9IHN0YXR1cy50YWdsaW5lX292ZXJyaWRlIHx8ICcnO1xuICAgIGFscmVhZHlDb25maXJtZWQgPSAhIShzdGF0dXMuZGVjaXNpb25zX2NvbmZpcm1lZCAmJiBzdGF0dXMuZGVjaXNpb25zX2NvbmZpcm1lZC50YWdsaW5lKTtcblxuICAgIC8vIFByb3Bvc2VkIHRhZ2xpbmUgZnJvbSB0aGUgTExNIHJlY29tbWVuZGF0aW9uc1xuICAgIGNvbnN0IGN1c3RvbWl6YXRpb25zID0gc3RhdHVzLmN1c3RvbWl6YXRpb25zIHx8IHt9O1xuICAgIHByb3Bvc2VkVGFnbGluZSA9IGN1c3RvbWl6YXRpb25zLmFwcGxpY2FudF90YWdsaW5lIHx8ICcnO1xuICB9IGNhdGNoIChfZSkge1xuICAgIC8vIE5ldHdvcmsgZmFpbHVyZSBcdTIwMTQgbGVhdmUgZmllbGRzIGVtcHR5LCB1c2VyIGNhbiBzdGlsbCB0eXBlIG1hbnVhbGx5XG4gIH1cblxuICBjb25zdCBpbml0aWFsICAgPSBjb25maXJtZWRUYWdsaW5lIHx8IHByb3Bvc2VkVGFnbGluZTtcbiAgY29uc3Qgc3RhdHVzTXNnID0gYWxyZWFkeUNvbmZpcm1lZFxuICAgID8gJzxzcGFuIHN0eWxlPVwiY29sb3I6IzA2NWY0Njtmb250LXdlaWdodDo2MDA7XCI+XHUyNzEzIENvbmZpcm1lZDwvc3Bhbj4nXG4gICAgOiAnPHNwYW4gc3R5bGU9XCJjb2xvcjojOTI0MDBlO1wiPlJlcXVpcmVzIHlvdXIgY29uZmlybWF0aW9uIGJlZm9yZSBnZW5lcmF0aW5nPC9zcGFuPic7XG5cbiAgY29udGFpbmVyLmlubmVySFRNTCA9IGBcbiAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNnB4O1wiPlxuICAgICAgPHAgc3R5bGU9XCJjb2xvcjojMzc0MTUxO2ZvbnQtc2l6ZTowLjk1ZW07bGluZS1oZWlnaHQ6MS42O21hcmdpbjowIDAgOHB4O1wiPlxuICAgICAgICBUaGUgPHN0cm9uZz50YWdsaW5lPC9zdHJvbmc+IGFwcGVhcnMgZGlyZWN0bHkgdW5kZXIgeW91ciBuYW1lIG9uIHRoZSBDVi5cbiAgICAgICAgSXQgc2hvdWxkIGRlc2NyaWJlIDxlbT53aG8geW91IGFyZTwvZW0+IGFzIGEgcHJvZmVzc2lvbmFsIFx1MjAxNCBub3QgdGhlIGpvYiB0aXRsZSB5b3UgYXJlIGFwcGx5aW5nIGZvci5cbiAgICAgIDwvcD5cbiAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtmb250LXNpemU6MC44NWVtO21hcmdpbjowO1wiPlxuICAgICAgICBFeGFtcGxlOiA8ZW0+XCJTZW5pb3IgRGF0YSBTY2llbnRpc3Qgc3BlY2lhbGlzaW5nIGluIGJpb3N0YXRpc3RpY3MgYW5kIG1hY2hpbmUgbGVhcm5pbmdcIjwvZW0+XG4gICAgICA8L3A+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IHN0eWxlPVwiYm9yZGVyOjFweCBzb2xpZCAjZDFmYWU1O2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MTZweDttYXJnaW4tYm90dG9tOjIwcHg7YmFja2dyb3VuZDojZjBmZGY0O1wiPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDttYXJnaW4tYm90dG9tOjEwcHg7XCI+XG4gICAgICAgIDxzdHJvbmcgc3R5bGU9XCJjb2xvcjojMDY1ZjQ2O1wiPkFwcGxpY2FudCBUYWdsaW5lPC9zdHJvbmc+XG4gICAgICAgIDxzcGFuIGlkPVwidGFnbGluZS1jb25maXJtLXN0YXR1c1wiIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtcIj4ke3N0YXR1c01zZ308L3NwYW4+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGxhYmVsIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtmb250LXdlaWdodDo2MDA7Y29sb3I6IzM3NDE1MTtkaXNwbGF5OmJsb2NrO21hcmdpbi1ib3R0b206NHB4O1wiXG4gICAgICAgICAgICAgZm9yPVwidGFnbGluZS1pbnB1dFwiPlxuICAgICAgICBFZGl0IHRhZ2xpbmUgKHJlcXVpcmVkKTpcbiAgICAgIDwvbGFiZWw+XG4gICAgICA8aW5wdXQgaWQ9XCJ0YWdsaW5lLWlucHV0XCIgdHlwZT1cInRleHRcIlxuICAgICAgICB2YWx1ZT1cIiR7ZXNjYXBlSHRtbChpbml0aWFsKX1cIlxuICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gU2VuaW9yIERhdGEgU2NpZW50aXN0IHNwZWNpYWxpc2luZyBpbiBiaW9zdGF0aXN0aWNzIGFuZCBNTFwiXG4gICAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTtib3gtc2l6aW5nOmJvcmRlci1ib3g7cGFkZGluZzo4cHggMTBweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo0cHg7Zm9udC1zaXplOjAuOTVlbTtcIlxuICAgICAgICBvbmlucHV0PVwib25UYWdsaW5lSW5wdXRDaGFuZ2UoKVwiIC8+XG5cbiAgICAgICR7cHJvcG9zZWRUYWdsaW5lICYmIHByb3Bvc2VkVGFnbGluZSAhPT0gY29uZmlybWVkVGFnbGluZSA/IGBcbiAgICAgIDxwIHN0eWxlPVwibWFyZ2luOjZweCAwIDA7Zm9udC1zaXplOjAuOGVtO2NvbG9yOiM2YjcyODA7XCI+XG4gICAgICAgIEFJIHByb3Bvc2VkOiA8ZW0+JHtlc2NhcGVIdG1sKHByb3Bvc2VkVGFnbGluZSl9PC9lbT5cbiAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPVwicmVzZXRUYWdsaW5lVG9Qcm9wb3NlZCgpXCIgc3R5bGU9XCJiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOm5vbmU7Y3Vyc29yOnBvaW50ZXI7Y29sb3I6IzI1NjNlYjtmb250LXNpemU6MC44ZW07cGFkZGluZzowIDRweDt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO1wiPlVzZSB0aGlzPC9idXR0b24+XG4gICAgICA8L3A+YCA6ICcnfVxuXG4gICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDoxMnB4O1wiPlxuICAgICAgICA8YnV0dG9uIGlkPVwidGFnbGluZS1jb25maXJtLWJ0blwiIGNsYXNzPVwic3VibWl0LWJ0blwiIHN0eWxlPVwiZm9udC1zaXplOjAuOWVtO3BhZGRpbmc6OHB4IDIwcHg7YmFja2dyb3VuZDojMTBiOTgxO1wiXG4gICAgICAgICAgb25jbGljaz1cImNvbmZpcm1UYWdsaW5lKClcIj5cbiAgICAgICAgICBcdTI3MTMgQ29uZmlybSBUYWdsaW5lXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAke2FscmVhZHlDb25maXJtZWQgPyAnPHNwYW4gaWQ9XCJ0YWdsaW5lLWNvbmZpcm1lZC1iYWRnZVwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6MTBweDtmb250LXNpemU6MC44NWVtO2NvbG9yOiMwNjVmNDY7XCI+U2F2ZWQgXHUyNzEzPC9zcGFuPicgOiAnPHNwYW4gaWQ9XCJ0YWdsaW5lLWNvbmZpcm1lZC1iYWRnZVwiIHN0eWxlPVwiZGlzcGxheTpub25lO21hcmdpbi1sZWZ0OjEwcHg7Zm9udC1zaXplOjAuODVlbTtjb2xvcjojMDY1ZjQ2O1wiPlNhdmVkIFx1MjcxMzwvc3Bhbj4nfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwibmF2LWJ1dHRvbnNcIiBzdHlsZT1cIm1hcmdpbi10b3A6MTZweDtcIj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJiYWNrLWJ0blwiIG9uY2xpY2s9XCJzd2l0Y2hUYWIoJ2FjaGlldmVtZW50cy1yZXZpZXcnKVwiPlx1MjE5MCBCYWNrIHRvIEFjaGlldmVtZW50czwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiBpZD1cInRhZ2xpbmUtY29udGludWUtYnRuXCIgY2xhc3M9XCJjb250aW51ZS1idG5cIlxuICAgICAgICBzdHlsZT1cIiR7YWxyZWFkeUNvbmZpcm1lZCA/ICcnIDogJ29wYWNpdHk6MC41O2N1cnNvcjpub3QtYWxsb3dlZDsnfVwiXG4gICAgICAgIG9uY2xpY2s9XCJ0YWdsaW5lQ29udGludWUoKVwiXG4gICAgICAgICR7YWxyZWFkeUNvbmZpcm1lZCA/ICcnIDogJ3RpdGxlPVwiUGxlYXNlIGNvbmZpcm0gdGhlIHRhZ2xpbmUgYmVmb3JlIGNvbnRpbnVpbmdcIid9PlxuICAgICAgICBDb250aW51ZSB0byBTdW1tYXJ5IFx1MjE5MlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+YDtcblxuICAvLyBFeHBvc2UgcHJvcG9zZWQgdGFnbGluZSBmb3IgdGhlIHJlc2V0IGJ1dHRvblxuICB3aW5kb3cuX3Byb3Bvc2VkVGFnbGluZSA9IHByb3Bvc2VkVGFnbGluZTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIElucHV0IGNoYW5nZSBoYW5kbGVyIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBvblRhZ2xpbmVJbnB1dENoYW5nZSgpIHtcbiAgLy8gV2hlbiB1c2VyIGVkaXRzIHRoZSB0ZXh0LCB1bi1jb25maXJtIHRoZSBwcmV2aW91cyBzYXZlIHNvIHRoZXkgbXVzdCByZS1jb25maXJtXG4gIGNvbnN0IGJhZGdlICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFnbGluZS1jb25maXJtZWQtYmFkZ2UnKTtcbiAgY29uc3Qgc3RhdHVzU3BhbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWdsaW5lLWNvbmZpcm0tc3RhdHVzJyk7XG4gIGlmIChiYWRnZSkgICAgICBiYWRnZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBpZiAoc3RhdHVzU3Bhbikgc3RhdHVzU3Bhbi5pbm5lckhUTUwgPSAnPHNwYW4gc3R5bGU9XCJjb2xvcjojOTI0MDBlO1wiPlJlcXVpcmVzIHlvdXIgY29uZmlybWF0aW9uIGJlZm9yZSBnZW5lcmF0aW5nPC9zcGFuPic7XG4gIGNvbnN0IGNvbnRpbnVlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhZ2xpbmUtY29udGludWUtYnRuJyk7XG4gIGlmIChjb250aW51ZUJ0bikge1xuICAgIGNvbnRpbnVlQnRuLnN0eWxlLm9wYWNpdHkgICAgICAgPSAnMC41JztcbiAgICBjb250aW51ZUJ0bi5zdHlsZS5jdXJzb3IgICAgICAgID0gJ25vdC1hbGxvd2VkJztcbiAgICBjb250aW51ZUJ0bi50aXRsZSAgICAgICAgICAgICAgID0gJ1BsZWFzZSBjb25maXJtIHRoZSB0YWdsaW5lIGJlZm9yZSBjb250aW51aW5nJztcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgUmVzZXQgdG8gQUktcHJvcG9zZWQgdGFnbGluZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gcmVzZXRUYWdsaW5lVG9Qcm9wb3NlZCgpIHtcbiAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFnbGluZS1pbnB1dCcpO1xuICBpZiAoaW5wdXQgJiYgd2luZG93Ll9wcm9wb3NlZFRhZ2xpbmUpIHtcbiAgICBpbnB1dC52YWx1ZSA9IHdpbmRvdy5fcHJvcG9zZWRUYWdsaW5lO1xuICAgIG9uVGFnbGluZUlucHV0Q2hhbmdlKCk7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIENvbmZpcm0gYW5kIHBlcnNpc3QgdGFnbGluZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLyoqXG4gKiBkdWNrZmxvdzpcbiAqICAgaWQ6IHRhZ2xpbmVfdWlfY29uZmlybVxuICogICBraW5kOiB1aVxuICogICB0aW1lc3RhbXA6IFwiMjAyNi0wNS0yOFQwMDowMDowMFpcIlxuICogICBzdGF0dXM6IGxpdmVcbiAqICAgaGFuZGxlczogW1widWk6dGFnbGluZS1yZXZpZXcuY29uZmlybVwiXVxuICogICBjYWxsczogW1wiUE9TVCAvYXBpL3Jldmlldy1kZWNpc2lvbnNcIl1cbiAqICAgcmVhZHM6IFtcImRvbTojdGFnbGluZS1pbnB1dFwiXVxuICogICB3cml0ZXM6XG4gKiAgICAgLSBcInJlcXVlc3Q6UE9TVCAvYXBpL3Jldmlldy1kZWNpc2lvbnMudHlwZT10YWdsaW5lXCJcbiAqICAgICAtIFwicmVxdWVzdDpQT1NUIC9hcGkvcmV2aWV3LWRlY2lzaW9ucy5kZWNpc2lvbnNcIlxuICogICBub3RlczogXCJQT1NUcyB0aGUgY29uZmlybWVkIHRhZ2xpbmUgdGV4dDsgZW5hYmxlcyB0aGUgY29udGludWUgYnV0dG9uIG9uIHN1Y2Nlc3MuXCJcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY29uZmlybVRhZ2xpbmUoKSB7XG4gIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhZ2xpbmUtaW5wdXQnKTtcbiAgaWYgKCFpbnB1dCkgcmV0dXJuO1xuXG4gIGNvbnN0IHRhZ2xpbmVUZXh0ID0gaW5wdXQudmFsdWUudHJpbSgpO1xuICBpZiAoIXRhZ2xpbmVUZXh0KSB7XG4gICAgc2hvd1RvYXN0KCdQbGVhc2UgZW50ZXIgYSB0YWdsaW5lIGJlZm9yZSBjb25maXJtaW5nLicsICdlcnJvcicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWdsaW5lLWNvbmZpcm0tYnRuJyk7XG4gIGlmIChidG4pIGJ0bi5kaXNhYmxlZCA9IHRydWU7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3Jldmlldy1kZWNpc2lvbnMnLCB7XG4gICAgICBtZXRob2Q6ICAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6ICAgIEpTT04uc3RyaW5naWZ5KHsgdHlwZTogJ3RhZ2xpbmUnLCBkZWNpc2lvbnM6IHRhZ2xpbmVUZXh0IH0pLFxuICAgIH0pO1xuXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgY29uc3QgZXJyID0gYXdhaXQgcmVzcG9uc2UuanNvbigpLmNhdGNoKCgpID0+ICh7fSkpO1xuICAgICAgc2hvd1RvYXN0KGBGYWlsZWQgdG8gc2F2ZSB0YWdsaW5lOiAke2Vyci5lcnJvciB8fCByZXNwb25zZS5zdGF0dXNUZXh0fWAsICdlcnJvcicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBVSSB0byBzaG93IGNvbmZpcm1lZCBzdGF0ZVxuICAgIGNvbnN0IGJhZGdlICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFnbGluZS1jb25maXJtZWQtYmFkZ2UnKTtcbiAgICBjb25zdCBzdGF0dXNTcGFuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhZ2xpbmUtY29uZmlybS1zdGF0dXMnKTtcbiAgICBpZiAoYmFkZ2UpICAgICAgeyBiYWRnZS5zdHlsZS5kaXNwbGF5ID0gJyc7IH1cbiAgICBpZiAoc3RhdHVzU3BhbikgeyBzdGF0dXNTcGFuLmlubmVySFRNTCA9ICc8c3BhbiBzdHlsZT1cImNvbG9yOiMwNjVmNDY7Zm9udC13ZWlnaHQ6NjAwO1wiPlx1MjcxMyBDb25maXJtZWQ8L3NwYW4+JzsgfVxuXG4gICAgY29uc3QgY29udGludWVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFnbGluZS1jb250aW51ZS1idG4nKTtcbiAgICBpZiAoY29udGludWVCdG4pIHtcbiAgICAgIGNvbnRpbnVlQnRuLnN0eWxlLm9wYWNpdHkgPSAnJztcbiAgICAgIGNvbnRpbnVlQnRuLnN0eWxlLmN1cnNvciAgPSAnJztcbiAgICAgIGNvbnRpbnVlQnRuLnRpdGxlICAgICAgICAgPSAnJztcbiAgICB9XG5cbiAgICBzdGF0ZU1hbmFnZXIubWFya0NvbnRlbnRDaGFuZ2VkKCk7XG4gICAgc2hvd1RvYXN0KCdUYWdsaW5lIGNvbmZpcm1lZC4nKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dUb2FzdCgnTmV0d29yayBlcnJvciBzYXZpbmcgdGFnbGluZS4nLCAnZXJyb3InKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoYnRuKSBidG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgQ29udGludWUgbmF2aWdhdGlvbiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gdGFnbGluZUNvbnRpbnVlKCkge1xuICAvLyBHdWFyZDogbXVzdCBiZSBjb25maXJtZWQgYmVmb3JlIHByb2NlZWRpbmdcbiAgY29uc3QgY29udGludWVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFnbGluZS1jb250aW51ZS1idG4nKTtcbiAgaWYgKGNvbnRpbnVlQnRuICYmIGNvbnRpbnVlQnRuLnN0eWxlLmN1cnNvciA9PT0gJ25vdC1hbGxvd2VkJykge1xuICAgIHNob3dUb2FzdCgnUGxlYXNlIGNvbmZpcm0gdGhlIHRhZ2xpbmUgYmVmb3JlIGNvbnRpbnVpbmcuJywgJ2Vycm9yJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHN3aXRjaFRhYignc3VtbWFyeS1yZXZpZXcnKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEV4cG9ydHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmV4cG9ydCB7XG4gIGJ1aWxkVGFnbGluZVJldmlld1NlY3Rpb24sXG4gIG9uVGFnbGluZUlucHV0Q2hhbmdlLFxuICByZXNldFRhZ2xpbmVUb1Byb3Bvc2VkLFxuICBjb25maXJtVGFnbGluZSxcbiAgdGFnbGluZUNvbnRpbnVlLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL3N1bW1hcnktcmV2aWV3LmpzXG4gKiBTdW1tYXJ5LWZvY3VzIHNlbGVjdGlvbjogQUkgZ2VuZXJhdGlvbiwgc3RvcmVkIHZhcmlhbnRzLCBzdWJtaXQgZGVjaXNpb24uXG4gKlxuICogRGVwZW5kZW5jaWVzIChyZXNvbHZlZCB0aHJvdWdoIGdsb2JhbFRoaXMgYXQgcnVudGltZSk6XG4gKiAgIHBlbmRpbmdSZWNvbW1lbmRhdGlvbnMsIHNlbGVjdGVkU3VtbWFyeUtleSwgX2FpR2VuZXJhdGVkU3VtbWFyeSxcbiAqICAgZXNjYXBlSHRtbCwgc2hvd1RvYXN0LCBzd2l0Y2hUYWIsIHNldExvYWRpbmcsIHNjaGVkdWxlQXRzUmVmcmVzaFxuICovXG5cbmltcG9ydCB7IHN0YXRlTWFuYWdlciB9IGZyb20gJy4vc3RhdGUtbWFuYWdlci5qcyc7XG5cbi8vIFx1MjUwMFx1MjUwMCBCdWlsZCBzdW1tYXJ5LWZvY3VzIHNlY3Rpb24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8qKlxuICogZHVja2Zsb3c6XG4gKiAgIGlkOiBzdW1tYXJ5X3VpX2J1aWxkXG4gKiAgIGtpbmQ6IHVpXG4gKiAgIHRpbWVzdGFtcDogXCIyMDI2LTAzLTI3VDAxOjIzOjI4WlwiXG4gKiAgIHN0YXR1czogc2hhcmVkXG4gKiAgIGhhbmRsZXM6IFtcInVpOnN1bW1hcnktcmV2aWV3LmJ1aWxkXCJdXG4gKiAgIGNhbGxzOiBbXCJHRVQgL2FwaS9tYXN0ZXItZmllbGRzXCIsIFwiR0VUIC9hcGkvc3RhdHVzXCIsIFwidWk6c3VtbWFyeS1yZXZpZXcuZ2VuZXJhdGVcIl1cbiAqICAgcmVhZHM6XG4gKiAgICAgLSBcIndpbmRvdzpwZW5kaW5nUmVjb21tZW5kYXRpb25zXCJcbiAqICAgICAtIFwicmVzcG9uc2U6R0VUIC9hcGkvbWFzdGVyLWZpZWxkcy5wcm9mZXNzaW9uYWxfc3VtbWFyaWVzXCJcbiAqICAgICAtIFwicmVzcG9uc2U6R0VUIC9hcGkvc3RhdHVzLnByb2Zlc3Npb25hbF9zdW1tYXJpZXNcIlxuICogICAgIC0gXCJzdGF0ZTpzZXNzaW9uX3N1bW1hcmllcy5haV9nZW5lcmF0ZWRcIlxuICogICB3cml0ZXM6IFtcImRvbTojc3VtbWFyeS1mb2N1cy1jb250YWluZXJcIiwgXCJ3aW5kb3c6c2VsZWN0ZWRTdW1tYXJ5S2V5XCJdXG4gKiAgIG5vdGVzOiBcIkJ1aWxkcyB0aGUgc3VtbWFyeSByZXZpZXcgVUkgZnJvbSBtYXN0ZXIgdmFyaWFudHMgcGx1cyBzZXNzaW9uIG92ZXJyaWRlcyBhbmQgc2VlZHMgdGhlIHNlbGVjdGVkIGtleS5cIlxuICovXG5cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkU3VtbWFyeUZvY3VzU2VjdGlvbigpIHtcbiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1bW1hcnktZm9jdXMtY29udGFpbmVyJyk7XG4gIGlmICghY29udGFpbmVyKSByZXR1cm47XG5cbiAgY29uc3QgZGF0YSA9IHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zO1xuXG4gIC8vIFx1MjUwMFx1MjUwMCBMb2FkIGFsbCBrbm93biBzdW1tYXJpZXMgKG1hc3RlciBiYXNlICsgc2Vzc2lvbiBvdmVycmlkZXMpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAvLyBGZXRjaCBtYXN0ZXIgZmllbGRzIGFuZCBzdGF0dXMgaW4gcGFyYWxsZWw7IHNlc3Npb24gc3VtbWFyaWVzIG92ZXJ3cml0ZSBtYXN0ZXIgdmFyaWFudHMuXG4gIGxldCBwcm9mZXNzaW9uYWxTdW1tYXJpZXMgPSB7fTtcbiAgY29uc3QgW21mUmVzdWx0LCBzdGF0dXNSZXN1bHRdID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFtcbiAgICBmZXRjaCgnL2FwaS9tYXN0ZXItZmllbGRzJykudGhlbihyID0+IHIuanNvbigpKSxcbiAgICBmZXRjaCgnL2FwaS9zdGF0dXMnKS50aGVuKHIgPT4gci5qc29uKCkpLFxuICBdKTtcbiAgaWYgKG1mUmVzdWx0LnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcgJiYgbWZSZXN1bHQudmFsdWUgJiYgbWZSZXN1bHQudmFsdWUub2spIHtcbiAgICBPYmplY3QuYXNzaWduKHByb2Zlc3Npb25hbFN1bW1hcmllcywgbWZSZXN1bHQudmFsdWUucHJvZmVzc2lvbmFsX3N1bW1hcmllcyB8fCB7fSk7XG4gIH1cbiAgaWYgKHN0YXR1c1Jlc3VsdC5zdGF0dXMgPT09ICdmdWxmaWxsZWQnICYmIHN0YXR1c1Jlc3VsdC52YWx1ZSkge1xuICAgIC8vIFNlc3Npb24gc3VtbWFyaWVzIChlLmcuIGFpX2dlbmVyYXRlZCkgb3ZlcndyaXRlIG1hc3RlciB2YXJpYW50c1xuICAgIE9iamVjdC5hc3NpZ24ocHJvZmVzc2lvbmFsU3VtbWFyaWVzLCBzdGF0dXNSZXN1bHQudmFsdWUucHJvZmVzc2lvbmFsX3N1bW1hcmllcyB8fCB7fSk7XG4gIH1cblxuICAvLyBcdTI1MDBcdTI1MDAgU3VnZ2VzdGVkIGNvbnRlbnQgcmVvcmRlcmluZyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgY29uc3QgcmVvcmRlcmluZ1RleHQgPSAoZGF0YSAmJiBkYXRhLnN1Z2dlc3RlZF9jb250ZW50X3Jlb3JkZXJpbmcpIHx8ICcnO1xuICBjb25zdCByZW9yZGVyaW5nSFRNTCA9IHJlb3JkZXJpbmdUZXh0XG4gICAgPyBgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2VmZjZmZjtib3JkZXI6MXB4IHNvbGlkICNiZmRiZmU7Ym9yZGVyLXJhZGl1czo2cHg7cGFkZGluZzoxMnB4O21hcmdpbi1ib3R0b206MTZweDtcIj5cbiAgICAgICAgPHN0cm9uZyBzdHlsZT1cImNvbG9yOiMxZTQwYWY7XCI+XHVEODNEXHVEQ0NCIFN1Z2dlc3RlZCBDb250ZW50IE9yZGVyOjwvc3Ryb25nPlxuICAgICAgICA8cCBzdHlsZT1cIm1hcmdpbjo2cHggMCAwO2NvbG9yOiMxZTNhOGE7Zm9udC1zaXplOjAuOWVtO3doaXRlLXNwYWNlOnByZS1saW5lO1wiPiR7ZXNjYXBlSHRtbChyZW9yZGVyaW5nVGV4dCl9PC9wPlxuICAgICAgIDwvZGl2PmBcbiAgICA6ICcnO1xuXG4gIC8vIFx1MjUwMFx1MjUwMCBSZW5kZXIgc2tlbGV0b24gd2hpbGUgd2UgZ2VuZXJhdGUgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIGNvbnRhaW5lci5pbm5lckhUTUwgPSBgXG4gICAgJHtyZW9yZGVyaW5nSFRNTH1cbiAgICA8ZGl2IGlkPVwiYWktc3VtbWFyeS1wYW5lbFwiIHN0eWxlPVwiYm9yZGVyOjFweCBzb2xpZCAjZDFmYWU1O2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MTZweDttYXJnaW4tYm90dG9tOjIwcHg7YmFja2dyb3VuZDojZjBmZGY0O1wiPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDttYXJnaW4tYm90dG9tOjEwcHg7XCI+XG4gICAgICAgIDxzdHJvbmcgc3R5bGU9XCJjb2xvcjojMDY1ZjQ2O1wiPlx1RDgzRVx1REQxNiBBSS1Qcm9wb3NlZCBTdW1tYXJ5PC9zdHJvbmc+XG4gICAgICAgIDxzcGFuIGlkPVwiYWktc3VtbWFyeS1zdGF0dXNcIiBzdHlsZT1cImZvbnQtc2l6ZTowLjhlbTtjb2xvcjojNmI3MjgwO1wiPkdlbmVyYXRpbmdcdTIwMjY8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgaWQ9XCJhaS1zdW1tYXJ5LWxvYWRpbmdcIiBzdHlsZT1cImZvbnQtc2l6ZTowLjllbTtjb2xvcjojOWNhM2FmO21pbi1oZWlnaHQ6NDBweDtcIj48ZW0+R2VuZXJhdGluZyBhIHRhaWxvcmVkIHN1bW1hcnkgZm9yIHRoaXMgYXBwbGljYXRpb25cdTIwMjY8L2VtPjwvZGl2PlxuICAgICAgPHRleHRhcmVhIGlkPVwiYWktc3VtbWFyeS10ZXh0XCIgcm93cz1cIjdcIiBvbmlucHV0PVwib25TdW1tYXJ5VGV4dENoYW5nZSgpXCJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCJHZW5lcmF0aW5nXHUyMDI2XCJcbiAgICAgICAgc3R5bGU9XCJ3aWR0aDoxMDAlO2JveC1zaXppbmc6Ym9yZGVyLWJveDtwYWRkaW5nOjhweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo0cHg7Zm9udC1zaXplOjAuOWVtO2xpbmUtaGVpZ2h0OjEuNjtyZXNpemU6dmVydGljYWw7ZGlzcGxheTpub25lO1wiPjwvdGV4dGFyZWE+XG4gICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDoxMnB4O1wiPlxuICAgICAgICA8bGFiZWwgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjojMzc0MTUxO2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWJvdHRvbTo0cHg7XCI+UmVxdWVzdCBjaGFuZ2VzIChvcHRpb25hbCk6PC9sYWJlbD5cbiAgICAgICAgPHRleHRhcmVhIGlkPVwic3VtbWFyeS1yZWZpbmVtZW50LWlucHV0XCIgcm93cz1cIjJcIlxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiAnTWFrZSBpdCBtb3JlIGNvbmNpc2UnLCAnRW1waGFzaXNlIG15IGxlYWRlcnNoaXAgZXhwZXJpZW5jZScsICdVc2UgYSBtb3JlIGZvcm1hbCB0b25lJ1x1MjAyNlwiXG4gICAgICAgICAgc3R5bGU9XCJ3aWR0aDoxMDAlO2JveC1zaXppbmc6Ym9yZGVyLWJveDtwYWRkaW5nOjhweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo0cHg7Zm9udC1zaXplOjAuODVlbTtyZXNpemU6dmVydGljYWw7XCI+PC90ZXh0YXJlYT5cbiAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6OHB4O2Rpc3BsYXk6ZmxleDtnYXA6OHB4O2ZsZXgtd3JhcDp3cmFwO1wiPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJhaS1yZWdlbmVyYXRlLWJ0blwiIGNsYXNzPVwic3VibWl0LWJ0blwiIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtwYWRkaW5nOjZweCAxNHB4O1wiXG4gICAgICAgICAgICBvbmNsaWNrPVwicmVnZW5lcmF0ZUFJU3VtbWFyeSgpXCI+UmVnZW5lcmF0ZTwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzdWJtaXQtYnRuXCIgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO3BhZGRpbmc6NnB4IDE0cHg7YmFja2dyb3VuZDojMTBiOTgxO1wiXG4gICAgICAgICAgICBvbmNsaWNrPVwidXNlQUlTdW1tYXJ5KClcIj5Vc2UgVGhpcyBTdW1tYXJ5PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBpZD1cInN1bW1hcnktc3RvcmVkLXNlY3Rpb25cIj5cbiAgICAgIDxkZXRhaWxzIHN0eWxlPVwibWFyZ2luLWJvdHRvbTo4cHg7XCI+XG4gICAgICAgIDxzdW1tYXJ5IHN0eWxlPVwiY3Vyc29yOnBvaW50ZXI7Zm9udC1zaXplOjAuODVlbTtjb2xvcjojNmI3MjgwO3VzZXItc2VsZWN0Om5vbmU7XCI+XG4gICAgICAgICAgVXNlIGEgc3RvcmVkIHN1bW1hcnkgdmFyaWFudCBpbnN0ZWFkXG4gICAgICAgIDwvc3VtbWFyeT5cbiAgICAgICAgPGRpdiBpZD1cInN1bW1hcnktcmFkaW9zXCIgc3R5bGU9XCJtYXJnaW4tdG9wOjEwcHg7XCI+PC9kaXY+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOjhweDtcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic3VibWl0LWJ0blwiIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtwYWRkaW5nOjZweCAxNHB4O1wiXG4gICAgICAgICAgICBvbmNsaWNrPVwic3VibWl0U3VtbWFyeUZvY3VzRGVjaXNpb24oKVwiPlVzZSBTZWxlY3RlZCBTdG9yZWQgU3VtbWFyeTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGV0YWlscz5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibmF2LWJ1dHRvbnNcIiBzdHlsZT1cIm1hcmdpbi10b3A6MTZweDtcIj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJiYWNrLWJ0blwiIG9uY2xpY2s9XCJzd2l0Y2hUYWIoJ3RhZ2xpbmUtcmV2aWV3JylcIj5cdTIxOTAgQmFjayB0byBUYWdsaW5lPC9idXR0b24+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiY29udGludWUtYnRuXCIgb25jbGljaz1cInN1Ym1pdFN1bW1hcnlGb2N1c0RlY2lzaW9uKClcIj5Db250aW51ZSB0byBQdWJsaWNhdGlvbnMgXHUyMTkyPC9idXR0b24+XG4gICAgPC9kaXY+YDtcblxuICAvLyBSZW5kZXIgc3RvcmVkIHN1bW1hcmllcyBpbiB0aGUgY29sbGFwc2libGUgc2VjdGlvblxuICBfcmVuZGVyU3RvcmVkU3VtbWFyeVJhZGlvcyhwcm9mZXNzaW9uYWxTdW1tYXJpZXMpO1xuXG4gIC8vIFx1MjUwMFx1MjUwMCBBdXRvLWdlbmVyYXRlIG9yIGxvYWQgY2FjaGVkIEFJIHN1bW1hcnkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIGNvbnN0IGNhY2hlZFN1bW1hcnkgPSBwcm9mZXNzaW9uYWxTdW1tYXJpZXNbJ2FpX2dlbmVyYXRlZCddIHx8ICcnO1xuICBpZiAoY2FjaGVkU3VtbWFyeSkge1xuICAgIF9zaG93QUlTdW1tYXJ5KGNhY2hlZFN1bW1hcnksICcoY2FjaGVkIFx1MjAxNCBjbGljayBSZWdlbmVyYXRlIHRvIHJlZnJlc2gpJyk7XG4gICAgd2luZG93LnNlbGVjdGVkU3VtbWFyeUtleSA9ICdhaV9nZW5lcmF0ZWQnO1xuICAgIGF3YWl0IHNhdmVTdW1tYXJ5Rm9jdXNUb0JhY2tlbmQoJ2FpX2dlbmVyYXRlZCcpO1xuICB9IGVsc2Uge1xuICAgIGF3YWl0IF9jYWxsR2VuZXJhdGVTdW1tYXJ5KG51bGwsIG51bGwpO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBSZW5kZXIgc3RvcmVkIHN1bW1hcnkgcmFkaW8gYnV0dG9ucyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gX3JlbmRlclN0b3JlZFN1bW1hcnlSYWRpb3MocHJvZmVzc2lvbmFsU3VtbWFyaWVzKSB7XG4gIGNvbnN0IHJhZGlvc0NvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdW1tYXJ5LXJhZGlvcycpO1xuICBpZiAoIXJhZGlvc0NvbnRhaW5lcikgcmV0dXJuO1xuICBjb25zdCBtYXN0ZXJLZXlzID0gT2JqZWN0LmtleXMocHJvZmVzc2lvbmFsU3VtbWFyaWVzKS5maWx0ZXIoayA9PiBrICE9PSAnYWlfZ2VuZXJhdGVkJyk7XG4gIGlmIChtYXN0ZXJLZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJhZGlvc0NvbnRhaW5lci5pbm5lckhUTUwgPSAnPHAgc3R5bGU9XCJjb2xvcjojOWNhM2FmO2ZvbnQtc2l6ZTowLjg1ZW07XCI+Tm8gc3RvcmVkIHN1bW1hcmllcyBhdmFpbGFibGUuPC9wPic7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGN1cnJlbnRLZXkgPSB3aW5kb3cuc2VsZWN0ZWRTdW1tYXJ5S2V5IHx8ICcnO1xuICByYWRpb3NDb250YWluZXIuaW5uZXJIVE1MID0gbWFzdGVyS2V5cy5tYXAoa2V5ID0+IHtcbiAgICBjb25zdCBwcmV2aWV3ID0gKHByb2Zlc3Npb25hbFN1bW1hcmllc1trZXldIHx8ICcnKS5zbGljZSgwLCAyMDApO1xuICAgIGNvbnN0IGxhYmVsID0ga2V5LnJlcGxhY2UoL18vZywgJyAnKS5yZXBsYWNlKC9cXGJcXHcvZywgYyA9PiBjLnRvVXBwZXJDYXNlKCkpO1xuICAgIGNvbnN0IGNoZWNrZWQgPSBrZXkgPT09IGN1cnJlbnRLZXkgPyAnY2hlY2tlZCcgOiAnJztcbiAgICByZXR1cm4gYFxuICAgICAgPGxhYmVsIHN0eWxlPVwiZGlzcGxheTpibG9jaztib3JkZXI6MXB4IHNvbGlkICNlNWU3ZWI7Ym9yZGVyLXJhZGl1czo2cHg7cGFkZGluZzoxMnB4O21hcmdpbi1ib3R0b206OHB4O2N1cnNvcjpwb2ludGVyOyR7Y2hlY2tlZCA/ICdib3JkZXItY29sb3I6IzEwYjk4MTtiYWNrZ3JvdW5kOiNmMGZkZjQ7JyA6ICcnfVwiPlxuICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cInN1bW1hcnlfa2V5XCIgdmFsdWU9XCIke2VzY2FwZUh0bWwoa2V5KX1cIiAke2NoZWNrZWR9XG4gICAgICAgICAgb25jaGFuZ2U9XCJzZWxlY3RTdW1tYXJ5S2V5KCcke2VzY2FwZUh0bWwoa2V5KX0nKVwiIHN0eWxlPVwibWFyZ2luLXJpZ2h0OjhweDtcIj5cbiAgICAgICAgPHN0cm9uZz4ke2VzY2FwZUh0bWwobGFiZWwpfTwvc3Ryb25nPiA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjc1ZW07cGFkZGluZzoxcHggNnB4O2JvcmRlci1yYWRpdXM6OTk5cHg7YmFja2dyb3VuZDojZWZmNmZmO2NvbG9yOiMxZDRlZDg7Ym9yZGVyOjFweCBzb2xpZCAjYmZkYmZlO2ZvbnQtd2VpZ2h0OjYwMDtcIj5cdUQ4M0RcdURDQzQgRnJvbSB5b3VyIE1hc3RlciBDVjwvc3Bhbj5cbiAgICAgICAgPHAgc3R5bGU9XCJtYXJnaW46NnB4IDAgMDtmb250LXNpemU6MC44NWVtO2NvbG9yOiM2YjcyODA7XCI+JHtlc2NhcGVIdG1sKHByZXZpZXcpfSR7cHJldmlldy5sZW5ndGggPT09IDIwMCA/ICdcdTIwMjYnIDogJyd9PC9wPlxuICAgICAgPC9sYWJlbD5gO1xuICB9KS5qb2luKCcnKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFNob3cgQUktZ2VuZXJhdGVkIHN1bW1hcnkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIF9zaG93QUlTdW1tYXJ5KHRleHQsIHN0YXR1c0xhYmVsKSB7XG4gIGNvbnN0IHRleHRFbCAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhaS1zdW1tYXJ5LXRleHQnKTtcbiAgY29uc3QgbG9hZGluZ0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FpLXN1bW1hcnktbG9hZGluZycpO1xuICBjb25zdCBzdGF0dXNFbCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWktc3VtbWFyeS1zdGF0dXMnKTtcbiAgaWYgKHRleHRFbCkge1xuICAgIHRleHRFbC52YWx1ZSA9IHRleHQ7XG4gICAgdGV4dEVsLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgfVxuICBpZiAobG9hZGluZ0VsKSBsb2FkaW5nRWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgaWYgKHN0YXR1c0VsKSAgc3RhdHVzRWwudGV4dENvbnRlbnQgPSBzdGF0dXNMYWJlbCB8fCAnJztcbiAgd2luZG93Ll9haUdlbmVyYXRlZFN1bW1hcnkgPSB0ZXh0O1xuICBfdXBkYXRlU3VtbWFyeVNwZWNpZmljaXR5QmFkZ2UodGV4dCk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBTdW1tYXJ5IHNwZWNpZmljaXR5IHZhbGlkYXRvciBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gX2NoZWNrU3VtbWFyeVNwZWNpZmljaXR5KHRleHQpIHtcbiAgaWYgKCF0ZXh0IHx8ICF0ZXh0LnRyaW0oKSkgcmV0dXJuIFtdO1xuICBjb25zdCB3YXJuaW5ncyA9IFtdO1xuICAvLyBDaGVjayAxOiBxdWFudGlmaWVkIGNsYWltIChudW1iZXIsIHBlcmNlbnRhZ2UsIG9yIHllYXIgcmFuZ2UpXG4gIGNvbnN0IGhhc1F1YW50aWZpZWQgPSAvXFxiXFxkW1xcZCxdKlxccyooJXxwZXJjZW50fHlycz98eWVhcnM/fG1vbnRocz98eFxcYnxcXCt8a1xcYnxtXFxifFxcLlxcZCkvaS50ZXN0KHRleHQpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAvXFxiXFxkK1xcK1xccyooeWVhcnM/fHlycz98bW9udGhzPykvaS50ZXN0KHRleHQpO1xuICBpZiAoIWhhc1F1YW50aWZpZWQpIHtcbiAgICB3YXJuaW5ncy5wdXNoKCdObyBxdWFudGlmaWVkIGNsYWltIGRldGVjdGVkIChlLmcuIFwiNSsgeWVhcnNcIiwgXCIzMCUgcmVkdWN0aW9uXCIsIFwiJDJNXCIpLiBBZGRpbmcgYSBudW1iZXIgc3RyZW5ndGhlbnMgY3JlZGliaWxpdHkuJyk7XG4gIH1cbiAgLy8gQ2hlY2sgMjogdGFyZ2V0IHJvbGUga2V5d29yZCBwcmVzZW50XG4gIGNvbnN0IGFuYWx5c2lzID0gd2luZG93Ll9sYXN0QW5hbHlzaXNEYXRhIHx8XG4gICAgKHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zICYmIHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zLmpvYl9hbmFseXNpcykgfHwge307XG4gIGNvbnN0IHJvbGVUaXRsZSA9IChhbmFseXNpcy50aXRsZSB8fCBhbmFseXNpcy5qb2JfdGl0bGUgfHwgJycpLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICBpZiAocm9sZVRpdGxlICYmIHJvbGVUaXRsZS5sZW5ndGggPiAzKSB7XG4gICAgY29uc3Qgcm9sZVBhcnRzID0gcm9sZVRpdGxlLnNwbGl0KC9bXFxzLyxdKy8pLmZpbHRlcih3ID0+IHcubGVuZ3RoID4gMyk7XG4gICAgY29uc3QgaW5UZXh0ID0gcm9sZVBhcnRzLnNvbWUocGFydCA9PiB0ZXh0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocGFydCkpO1xuICAgIGlmICghaW5UZXh0KSB7XG4gICAgICB3YXJuaW5ncy5wdXNoKGBUYXJnZXQgcm9sZSAoXCIke2VzY2FwZUh0bWwocm9sZVRpdGxlKX1cIikgbm90IG1lbnRpb25lZCBcdTIwMTQgY29uc2lkZXIgZWNob2luZyB0aGUgcm9sZSBvciBhIHN5bm9ueW0uYCk7XG4gICAgfVxuICB9XG4gIC8vIENoZWNrIDM6IGZhbGxiYWNrIGdlbmVyaWMgcGxhY2Vob2xkZXJcbiAgY29uc3QgZ2VuZXJpY1BocmFzZXMgPSBbJ2V4cGVyaWVuY2VkIHByb2Zlc3Npb25hbCcsICd0cmFjayByZWNvcmQgb2Ygc3VjY2VzcycsICdzZWVraW5nIGEgY2hhbGxlbmdpbmcnXTtcbiAgZm9yIChjb25zdCBwaHJhc2Ugb2YgZ2VuZXJpY1BocmFzZXMpIHtcbiAgICBpZiAodGV4dC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHBocmFzZSkpIHtcbiAgICAgIHdhcm5pbmdzLnB1c2goYEdlbmVyaWMgcGxhY2Vob2xkZXIgcGhyYXNlIGRldGVjdGVkIChcIiR7cGhyYXNlfVwiKSBcdTIwMTQgcmVwbGFjZSB3aXRoIHNwZWNpZmljIGFjaGlldmVtZW50cy5gKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHdhcm5pbmdzO1xufVxuXG5mdW5jdGlvbiBfdXBkYXRlU3VtbWFyeVNwZWNpZmljaXR5QmFkZ2UodGV4dCkge1xuICBsZXQgYmFkZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3VtbWFyeS1zcGVjaWZpY2l0eS1iYWRnZScpO1xuICBpZiAoIWJhZGdlKSB7XG4gICAgY29uc3QgdGV4dEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FpLXN1bW1hcnktdGV4dCcpO1xuICAgIGlmICghdGV4dEVsIHx8ICF0ZXh0RWwucGFyZW50Tm9kZSkgcmV0dXJuO1xuICAgIGJhZGdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgYmFkZ2UuaWQgPSAnc3VtbWFyeS1zcGVjaWZpY2l0eS1iYWRnZSc7XG4gICAgYmFkZ2Uuc3R5bGUuY3NzVGV4dCA9ICdtYXJnaW4tdG9wOjZweDtmb250LXNpemU6MC44MmVtOyc7XG4gICAgdGV4dEVsLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGJhZGdlLCB0ZXh0RWwubmV4dFNpYmxpbmcpO1xuICB9XG4gIGNvbnN0IHdhcm5pbmdzID0gX2NoZWNrU3VtbWFyeVNwZWNpZmljaXR5KHRleHQpO1xuICBpZiAod2FybmluZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgYmFkZ2UuaW5uZXJIVE1MID0gJzxzcGFuIHN0eWxlPVwiY29sb3I6IzEwYjk4MTtcIj5cdTI3MTMgU3VtbWFyeSBoYXMgc3BlY2lmaWMsIHF1YW50aWZpZWQgY29udGVudC48L3NwYW4+JztcbiAgfSBlbHNlIHtcbiAgICBiYWRnZS5pbm5lckhUTUwgPSB3YXJuaW5ncy5tYXAodyA9PlxuICAgICAgYDxkaXYgc3R5bGU9XCJjb2xvcjojYjQ1MzA5O21hcmdpbi10b3A6MnB4O1wiPlx1MjZBMCAke3d9PC9kaXY+YFxuICAgICkuam9pbignJyk7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIENhbGwgZ2VuZXJhdGUtc3VtbWFyeSBBUEkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8qKlxuICogZHVja2Zsb3c6XG4gKiAgIGlkOiBzdW1tYXJ5X3VpX2dlbmVyYXRlXG4gKiAgIGtpbmQ6IHVpXG4gKiAgIHRpbWVzdGFtcDogXCIyMDI2LTAzLTI3VDAxOjIzOjI4WlwiXG4gKiAgIHN0YXR1czogc2hhcmVkXG4gKiAgIGhhbmRsZXM6IFtcInVpOnN1bW1hcnktcmV2aWV3LmdlbmVyYXRlXCJdXG4gKiAgIGNhbGxzOiBbXCJQT1NUIC9hcGkvZ2VuZXJhdGUtc3VtbWFyeVwiLCBcInVpOnN1bW1hcnktcmV2aWV3LnBlcnNpc3RcIl1cbiAqICAgcmVhZHM6IFtcInJlc3BvbnNlOlBPU1QgL2FwaS9nZW5lcmF0ZS1zdW1tYXJ5LnN1bW1hcnlcIiwgXCJ3aW5kb3c6X2FpR2VuZXJhdGVkU3VtbWFyeVwiXVxuICogICB3cml0ZXM6IFtcImRvbTojYWktc3VtbWFyeS10ZXh0XCIsIFwiZG9tOiNhaS1zdW1tYXJ5LXN0YXR1c1wiLCBcIndpbmRvdzpfYWlHZW5lcmF0ZWRTdW1tYXJ5XCIsIFwid2luZG93OnNlbGVjdGVkU3VtbWFyeUtleVwiXVxuICogICBub3RlczogXCJSZXF1ZXN0cyBhIGdlbmVyYXRlZCBvciByZWZpbmVkIHN1bW1hcnksIHVwZGF0ZXMgdGhlIGxvY2FsIFVJLCBhbmQgcGVyc2lzdHMgdGhlIHNlbGVjdGVkIHN1bW1hcnkga2V5LlwiXG4gKi9cblxuYXN5bmMgZnVuY3Rpb24gX2NhbGxHZW5lcmF0ZVN1bW1hcnkocmVmaW5lbWVudFByb21wdCwgcHJldmlvdXNTdW1tYXJ5KSB7XG4gIGNvbnN0IGJ0biAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FpLXJlZ2VuZXJhdGUtYnRuJyk7XG4gIGNvbnN0IHN0YXR1c0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FpLXN1bW1hcnktc3RhdHVzJyk7XG4gIGNvbnN0IHRleHRFbCAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FpLXN1bW1hcnktdGV4dCcpO1xuICBjb25zdCBsb2FkaW5nRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWktc3VtbWFyeS1sb2FkaW5nJyk7XG4gIGlmIChidG4pICAgICAgYnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgaWYgKHN0YXR1c0VsKSBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICdHZW5lcmF0aW5nXHUyMDI2JztcbiAgLy8gU2hvdyBsb2FkaW5nIGluZGljYXRvcjsgaGlkZSB0aGUgdGV4dGFyZWEgd2hpbGUgZ2VuZXJhdGluZy5cbiAgaWYgKGxvYWRpbmdFbCkgeyBsb2FkaW5nRWwuaW5uZXJIVE1MID0gJzxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDoxMHB4O2NvbG9yOiM2YjcyODA7cGFkZGluZzo4cHggMDtcIj48ZGl2IGNsYXNzPVwibG9hZGluZy1zcGlubmVyXCIgc3R5bGU9XCJ3aWR0aDoyMHB4O2hlaWdodDoyMHB4O2JvcmRlci13aWR0aDoycHg7XCI+PC9kaXY+PGVtPkdlbmVyYXRpbmcgYSB0YWlsb3JlZCBzdW1tYXJ5XHUyMDI2PC9lbT48L2Rpdj4nOyBsb2FkaW5nRWwuc3R5bGUuZGlzcGxheSA9ICcnOyB9XG4gIGlmICh0ZXh0RWwpICAgdGV4dEVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgLy8gVXNlIHRoZSBnbG9iYWwgTExNIHN0YXR1cyBiYXIgZm9yIHZpc2liaWxpdHlcbiAgc2V0TG9hZGluZyh0cnVlLCAnR2VuZXJhdGluZyBzdW1tYXJ5XHUyMDI2Jyk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBib2R5ID0ge307XG4gICAgaWYgKHJlZmluZW1lbnRQcm9tcHQpIGJvZHkucmVmaW5lbWVudF9wcm9tcHQgPSByZWZpbmVtZW50UHJvbXB0O1xuICAgIGlmIChwcmV2aW91c1N1bW1hcnkpICBib2R5LnByZXZpb3VzX3N1bW1hcnkgID0gcHJldmlvdXNTdW1tYXJ5O1xuXG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL2dlbmVyYXRlLXN1bW1hcnknLCB7XG4gICAgICBtZXRob2Q6ICAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6ICAgIEpTT04uc3RyaW5naWZ5KGJvZHkpLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuXG4gICAgaWYgKGRhdGEub2spIHtcbiAgICAgIF9zaG93QUlTdW1tYXJ5KGRhdGEuc3VtbWFyeSwgJ1x1MjcxMyBnZW5lcmF0ZWQnKTtcbiAgICAgIHdpbmRvdy5zZWxlY3RlZFN1bW1hcnlLZXkgPSAnYWlfZ2VuZXJhdGVkJztcbiAgICAgIGF3YWl0IHNhdmVTdW1tYXJ5Rm9jdXNUb0JhY2tlbmQoJ2FpX2dlbmVyYXRlZCcpO1xuICAgICAgc2NoZWR1bGVBdHNSZWZyZXNoKCdyZXZpZXdfY2hlY2twb2ludCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJ1x1MjZBMCBlcnJvcic7XG4gICAgICBpZiAodGV4dEVsKSAgIHRleHRFbC5pbm5lckhUTUwgPSBgPHNwYW4gc3R5bGU9XCJjb2xvcjojZWY0NDQ0O1wiPiR7ZXNjYXBlSHRtbChkYXRhLmVycm9yIHx8ICdHZW5lcmF0aW9uIGZhaWxlZC4nKX08L3NwYW4+YDtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnXHUyNkEwIG5ldHdvcmsgZXJyb3InO1xuICAgIGlmICh0ZXh0RWwpICAgdGV4dEVsLmlubmVySFRNTCA9ICc8c3BhbiBzdHlsZT1cImNvbG9yOiNlZjQ0NDQ7XCI+TmV0d29yayBlcnJvciBcdTIwMTQgcGxlYXNlIHRyeSBhZ2Fpbi48L3NwYW4+JztcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoYnRuKSBidG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgUmVnZW5lcmF0ZSAvIHVzZSBBSSBzdW1tYXJ5IFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiByZWdlbmVyYXRlQUlTdW1tYXJ5KCkge1xuICBjb25zdCBpbnB1dCAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1bW1hcnktcmVmaW5lbWVudC1pbnB1dCcpO1xuICBjb25zdCBwcm9tcHQgID0gaW5wdXQgPyBpbnB1dC52YWx1ZS50cmltKCkgOiAnJztcbiAgY29uc3QgY3VycmVudCA9IHdpbmRvdy5fYWlHZW5lcmF0ZWRTdW1tYXJ5IHx8ICcnO1xuICBhd2FpdCBfY2FsbEdlbmVyYXRlU3VtbWFyeShwcm9tcHQgfHwgbnVsbCwgY3VycmVudCB8fCBudWxsKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdXNlQUlTdW1tYXJ5KCkge1xuICB3aW5kb3cuc2VsZWN0ZWRTdW1tYXJ5S2V5ID0gJ2FpX2dlbmVyYXRlZCc7XG4gIGNvbnN0IHRleHRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhaS1zdW1tYXJ5LXRleHQnKTtcbiAgY29uc3QgY3VycmVudFRleHQgPSB0ZXh0RWwgPyB0ZXh0RWwudmFsdWUudHJpbSgpIDogKHdpbmRvdy5fYWlHZW5lcmF0ZWRTdW1tYXJ5IHx8ICcnKTtcbiAgYXdhaXQgc2F2ZVN1bW1hcnlGb2N1c1RvQmFja2VuZCgnYWlfZ2VuZXJhdGVkJywgY3VycmVudFRleHQpO1xuICBzY2hlZHVsZUF0c1JlZnJlc2goJ3Jldmlld19jaGVja3BvaW50Jyk7XG4gIHNob3dUb2FzdCgnQUktZ2VuZXJhdGVkIHN1bW1hcnkgc2VsZWN0ZWQgZm9yIHlvdXIgQ1YnKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFNlbGVjdCBzdG9yZWQgc3VtbWFyeSBrZXkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIHNlbGVjdFN1bW1hcnlLZXkoa2V5KSB7XG4gIHdpbmRvdy5zZWxlY3RlZFN1bW1hcnlLZXkgPSBrZXk7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNzdW1tYXJ5LXJhZGlvcyBsYWJlbCcpLmZvckVhY2gobGFiZWwgPT4ge1xuICAgIGNvbnN0IHJhZGlvID0gbGFiZWwucXVlcnlTZWxlY3RvcignaW5wdXRbdHlwZT1yYWRpb10nKTtcbiAgICBjb25zdCBpc1NlbGVjdGVkID0gcmFkaW8gJiYgcmFkaW8udmFsdWUgPT09IGtleTtcbiAgICBsYWJlbC5zdHlsZS5ib3JkZXJDb2xvciA9IGlzU2VsZWN0ZWQgPyAnIzEwYjk4MScgOiAnI2U1ZTdlYic7XG4gICAgbGFiZWwuc3R5bGUuYmFja2dyb3VuZCAgPSBpc1NlbGVjdGVkID8gJyNmMGZkZjQnIDogJyc7XG4gIH0pO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgU2F2ZSAvIHN1Ym1pdCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLyoqXG4gKiBkdWNrZmxvdzpcbiAqICAgaWQ6IHN1bW1hcnlfdWlfcGVyc2lzdFxuICogICBraW5kOiB1aVxuICogICB0aW1lc3RhbXA6IFwiMjAyNi0wMy0yN1QwMToyMzoyOFpcIlxuICogICBzdGF0dXM6IHNoYXJlZFxuICogICBoYW5kbGVzOiBbXCJ1aTpzdW1tYXJ5LXJldmlldy5wZXJzaXN0XCJdXG4gKiAgIGNhbGxzOiBbXCJQT1NUIC9hcGkvcmV2aWV3LWRlY2lzaW9uc1wiXVxuICogICByZWFkczogW1wid2luZG93OnNlbGVjdGVkU3VtbWFyeUtleVwiXVxuICogICB3cml0ZXM6IFtcInJlcXVlc3Q6UE9TVCAvYXBpL3Jldmlldy1kZWNpc2lvbnMuc3VtbWFyeV9mb2N1c1wiXVxuICogICBub3RlczogXCJQZXJzaXN0cyBvbmx5IHRoZSBzZWxlY3RlZCBzdW1tYXJ5IGtleSBzbyBiYWNrZW5kIHN0YXRlIGNhbiByZXNvbHZlIHRoZSBhY3RpdmUgc3VtbWFyeSB2YXJpYW50IGxhdGVyLlwiXG4gKi9cblxuLy8gRGVib3VuY2UgdGltZXIgZm9yIGF1dG8tcGVyc2lzdGluZyBlZGl0cyB0byB0aGUgc3VtbWFyeSB0ZXh0LlxubGV0IF9zdW1tYXJ5UGVyc2lzdFRpbWVyID0gbnVsbDtcblxuZnVuY3Rpb24gb25TdW1tYXJ5VGV4dENoYW5nZSgpIHtcbiAgY29uc3QgdGV4dEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FpLXN1bW1hcnktdGV4dCcpO1xuICBpZiAoIXRleHRFbCkgcmV0dXJuO1xuICB3aW5kb3cuX2FpR2VuZXJhdGVkU3VtbWFyeSA9IHRleHRFbC52YWx1ZTtcbiAgX3VwZGF0ZVN1bW1hcnlTcGVjaWZpY2l0eUJhZGdlKHRleHRFbC52YWx1ZSk7XG4gIGNsZWFyVGltZW91dChfc3VtbWFyeVBlcnNpc3RUaW1lcik7XG4gIF9zdW1tYXJ5UGVyc2lzdFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgc2F2ZVN1bW1hcnlGb2N1c1RvQmFja2VuZCgnYWlfZ2VuZXJhdGVkJywgdGV4dEVsLnZhbHVlLnRyaW0oKSk7XG4gIH0sIDUwMCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNhdmVTdW1tYXJ5Rm9jdXNUb0JhY2tlbmQoa2V5LCB0ZXh0KSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGF5bG9hZCA9IHsgdHlwZTogJ3N1bW1hcnlfZm9jdXMnLCBkZWNpc2lvbnM6IGtleSB9O1xuICAgIGlmICh0ZXh0ICE9PSB1bmRlZmluZWQgJiYgdGV4dCAhPT0gbnVsbCkgcGF5bG9hZC5zdW1tYXJ5X3RleHQgPSB0ZXh0O1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvcmV2aWV3LWRlY2lzaW9ucycsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShwYXlsb2FkKVxuICAgIH0pO1xuICAgIHJldHVybiByZXNwb25zZS5vaztcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBzdWJtaXRTdW1tYXJ5Rm9jdXNEZWNpc2lvbigpIHtcbiAgY29uc3Qga2V5ID0gd2luZG93LnNlbGVjdGVkU3VtbWFyeUtleTtcbiAgaWYgKCFrZXkpIHJldHVybjtcbiAgY29uc3Qgc2F2ZWQgPSBhd2FpdCBzYXZlU3VtbWFyeUZvY3VzVG9CYWNrZW5kKGtleSk7XG4gIGlmICghc2F2ZWQpIHtcbiAgICBzaG93VG9hc3QoJ0ZhaWxlZCB0byBzYXZlIHN1bW1hcnkgc2VsZWN0aW9uLicsICdlcnJvcicpO1xuICAgIHJldHVybjtcbiAgfVxuICBzdGF0ZU1hbmFnZXIubWFya0NvbnRlbnRDaGFuZ2VkKCk7XG4gIHNjaGVkdWxlQXRzUmVmcmVzaCgncmV2aWV3X2NoZWNrcG9pbnQnKTtcbiAgc2hvd1RvYXN0KGBTdW1tYXJ5IHNlbGVjdGlvbiBzYXZlZDogXCIke2tleS5yZXBsYWNlKC9fL2csICcgJyl9XCJgKTtcbiAgc3dpdGNoVGFiKCdwdWJsaWNhdGlvbnMtcmV2aWV3Jyk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFeHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5leHBvcnQge1xuICBidWlsZFN1bW1hcnlGb2N1c1NlY3Rpb24sXG4gIF9yZW5kZXJTdG9yZWRTdW1tYXJ5UmFkaW9zLFxuICBfc2hvd0FJU3VtbWFyeSxcbiAgX2NhbGxHZW5lcmF0ZVN1bW1hcnksXG4gIHJlZ2VuZXJhdGVBSVN1bW1hcnksXG4gIHVzZUFJU3VtbWFyeSxcbiAgb25TdW1tYXJ5VGV4dENoYW5nZSxcbiAgc2VsZWN0U3VtbWFyeUtleSxcbiAgc2F2ZVN1bW1hcnlGb2N1c1RvQmFja2VuZCxcbiAgX2NoZWNrU3VtbWFyeVNwZWNpZmljaXR5LFxuICBfdXBkYXRlU3VtbWFyeVNwZWNpZmljaXR5QmFkZ2UsXG4gIHN1Ym1pdFN1bW1hcnlGb2N1c0RlY2lzaW9uLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL3B1YmxpY2F0aW9ucy1yZXZpZXcuanNcbiAqIFB1YmxpY2F0aW9ucyByZXZpZXcgdGFibGU6IGZldGNoLCByZW5kZXIsIHRvZ2dsZSBhY2NlcHQvcmVqZWN0LCBzdWJtaXQgZGVjaXNpb25zLlxuICpcbiAqIERlcGVuZGVuY2llcyAocmVzb2x2ZWQgdGhyb3VnaCBnbG9iYWxUaGlzIGF0IHJ1bnRpbWUpOlxuICogICBwdWJsaWNhdGlvbkRlY2lzaW9ucywgX3NhdmVkRGVjaXNpb25zLFxuICogICBlc2NhcGVIdG1sLCBzaG93VG9hc3QsIGZldGNoQW5kUmV2aWV3UmV3cml0ZXMsIENTU1xuICovXG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmNvbnN0IGxvZyA9IGdldExvZ2dlcigncHVibGljYXRpb25zLXJldmlldycpO1xuXG5pbXBvcnQgeyBzdGF0ZU1hbmFnZXIgfSBmcm9tICcuL3N0YXRlLW1hbmFnZXIuanMnO1xuaW1wb3J0IHsgZXllU2xhc2hJY29uIH0gZnJvbSAnLi9yZXZpZXctaWNvbnMuanMnO1xuXG4vLyBUcmFjayBwdWJsaWNhdGlvbiBhY2NlcHQvcmVqZWN0IGRlY2lzaW9uczogY2l0ZV9rZXkgXHUyMTkyIHRydWUgKGFjY2VwdCkgfCBmYWxzZSAocmVqZWN0KVxud2luZG93LnB1YmxpY2F0aW9uRGVjaXNpb25zID0ge307XG4vLyBPcmRlcmVkIGxpc3Qgb2YgcHVibGljYXRpb24gb2JqZWN0czsgbXV0YXRlZCBieSBtb3ZlUHViUm93KClcbndpbmRvdy5fcHVibGljYXRpb25zT3JkZXJlZCA9IFtdO1xuXG4vLyBcdTI1MDBcdTI1MDAgQnVpbGQgcHVibGljYXRpb25zIHJldmlldyB0YWJsZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gYnVpbGRQdWJsaWNhdGlvbnNSZXZpZXdUYWJsZSgpIHtcbiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1YmxpY2F0aW9ucy10YWJsZS1jb250YWluZXInKTtcbiAgLy8gSW4gdGhlIG5ldyBzdWItdGFiIGxheW91dCwgd2UgdXNlIHRoZSBwYW5lIHdyYXBwZXIgaW5zdGVhZCBvZiB0aGUgb2xkIHNlY3Rpb25cbiAgY29uc3Qgc2VjdGlvbiAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1YmxpY2F0aW9ucy1yZXZpZXctc2VjdGlvbicpIHx8XG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXZpZXctcGFuZS1wdWJsaWNhdGlvbnMnKTtcbiAgY29uc3QgcHViVGFiQnRuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnJldmlldy1zdWJ0YWJbZGF0YS1wYW5lPVwicHVibGljYXRpb25zXCJdJyk7XG4gIGlmICghY29udGFpbmVyKSByZXR1cm47XG5cbiAgY29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTJweDtwYWRkaW5nOjIwcHg7Y29sb3I6IzZiNzI4MDtcIj48ZGl2IGNsYXNzPVwibG9hZGluZy1zcGlubmVyXCIgc3R5bGU9XCJ3aWR0aDoyMHB4O2hlaWdodDoyMHB4O2JvcmRlci13aWR0aDoycHg7ZmxleC1zaHJpbms6MDtcIj48L2Rpdj48c3Bhbj5Mb2FkaW5nIHB1YmxpY2F0aW9uIHJlY29tbWVuZGF0aW9uc1xcdTIwMjY8L3NwYW4+PC9kaXY+JztcblxuICBsZXQgcmVjb21tZW5kYXRpb25zID0gW107XG4gIGxldCB0b3RhbENvdW50ID0gMDtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvcHVibGljYXRpb24tcmVjb21tZW5kYXRpb25zJyk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKCFkYXRhLm9rKSB7IGNvbnRhaW5lci5pbm5lckhUTUwgPSBgPHAgY2xhc3M9XCJlcnJvci1tZXNzYWdlXCI+JHtlc2NhcGVIdG1sKGRhdGEuZXJyb3IgfHwgJ0ZhaWxlZCB0byBsb2FkIHB1YmxpY2F0aW9ucy4nKX08L3A+YDsgcmV0dXJuOyB9XG4gICAgcmVjb21tZW5kYXRpb25zID0gZGF0YS5yZWNvbW1lbmRhdGlvbnMgfHwgW107XG4gICAgdG90YWxDb3VudCA9IGRhdGEudG90YWxfY291bnQgfHwgcmVjb21tZW5kYXRpb25zLmxlbmd0aDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLmVycm9yKCdFcnJvciBmZXRjaGluZyBwdWJsaWNhdGlvbiByZWNvbW1lbmRhdGlvbnM6JywgZXJyKTtcbiAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJzxwIHN0eWxlPVwiY29sb3I6ICNlZjQ0NDQ7IHBhZGRpbmc6IDIwcHg7XCI+RmFpbGVkIHRvIGxvYWQgcHVibGljYXRpb24gcmVjb21tZW5kYXRpb25zLjwvcD4nO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChyZWNvbW1lbmRhdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgLy8gTm8gcHVibGljYXRpb25zIFx1MjAxNCBoaWRlIHRoZSBwYW5lIGFuZCBkaXNhYmxlIHRoZSB0YWIgYnV0dG9uXG4gICAgaWYgKHNlY3Rpb24pIHNlY3Rpb24uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBpZiAocHViVGFiQnRuKSBwdWJUYWJCdG4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJzxwIHN0eWxlPVwicGFkZGluZzoyMHB4O2NvbG9yOiM2YjcyODA7XCI+Tm8gcHVibGljYXRpb25zIGZvdW5kLjwvcD4nO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFNob3cgc2VjdGlvbiBhbmQgdGFiIGJ1dHRvblxuICBpZiAocHViVGFiQnRuKSBwdWJUYWJCdG4uc3R5bGUuZGlzcGxheSA9ICcnO1xuXG4gIC8vIFVwZGF0ZSBoZWFkaW5nIGNvdW50IChoYW5kbGUgYm90aCBwYW5lIGFwcHJvYWNoIGFuZCBsZWdhY3kgc2VjdGlvbiBhcHByb2FjaClcbiAgY29uc3QgaGVhZGluZyA9IHNlY3Rpb24gPyBzZWN0aW9uLnF1ZXJ5U2VsZWN0b3IoJ2gyJykgOiBudWxsO1xuICBpZiAoaGVhZGluZykge1xuICAgIGhlYWRpbmcudGV4dENvbnRlbnQgPSBgXHVEODNEXHVEQ0M0IFNlbGVjdGVkIFB1YmxpY2F0aW9uc2A7XG4gIH1cblxuICAvLyBDb3VudCByZWNvbW1lbmRlZCB2cyB0b3RhbFxuICBjb25zdCByZWNvbW1lbmRlZENvdW50ID0gcmVjb21tZW5kYXRpb25zLmZpbHRlcihwID0+IHAuaXNfcmVjb21tZW5kZWQgIT09IGZhbHNlKS5sZW5ndGg7XG4gIGNvbnN0IGNvbnRleHROb3RlID0gYDxzdHJvbmc+JHtyZWNvbW1lbmRlZENvdW50fTwvc3Ryb25nPiBvZiA8c3Ryb25nPiR7dG90YWxDb3VudH08L3N0cm9uZz4gcHVibGljYXRpb25zIHJlY29tbWVuZGVkIGZvciB0aGlzIHJvbGUuIGAgK1xuICAgIGBSZWNvbW1lbmRlZCBwdWJsaWNhdGlvbnMgKHRvcCkgYXJlIHByZS1zZWxlY3RlZCBmb3IgaW5jbHVzaW9uOyBvdGhlcnMgKGJlbG93IHRoZSBkaXZpZGVyKSBhcmUgcHJlLWV4Y2x1ZGVkLiBBZGp1c3QgdXNpbmcgdGhlIHRvZ2dsZXMuYDtcblxuICAvLyBJbml0aWFsaXNlIGRlY2lzaW9ucyBcdTIwMTQgcmVjb21tZW5kZWQ9YWNjZXB0LCBub3QtcmVjb21tZW5kZWQ9cmVqZWN0IGJ5IGRlZmF1bHRcbiAgd2luZG93LnB1YmxpY2F0aW9uRGVjaXNpb25zID0ge307XG4gIHJlY29tbWVuZGF0aW9ucy5mb3JFYWNoKHB1YiA9PiB7XG4gICAgd2luZG93LnB1YmxpY2F0aW9uRGVjaXNpb25zW3B1Yi5jaXRlX2tleV0gPSBwdWIuaXNfcmVjb21tZW5kZWQgIT09IGZhbHNlO1xuICB9KTtcbiAgLy8gQXBwbHkgYW55IHByZXZpb3VzbHkgc2F2ZWQgdXNlciBkZWNpc2lvbnMgb3ZlciB0aGUgQVBJIGRlZmF1bHRzXG4gIGNvbnN0IHNhdmVkUHViRGVjcyA9IHdpbmRvdy5fc2F2ZWREZWNpc2lvbnM/LnB1YmxpY2F0aW9uX2RlY2lzaW9ucyB8fCB7fTtcbiAgaWYgKE9iamVjdC5rZXlzKHNhdmVkUHViRGVjcykubGVuZ3RoID4gMCkgT2JqZWN0LmFzc2lnbih3aW5kb3cucHVibGljYXRpb25EZWNpc2lvbnMsIHNhdmVkUHViRGVjcyk7XG5cbiAgLy8gU2VlZCB0aGUgb3JkZXJlZCBsaXN0IGZvciByZW9yZGVyIGNvbnRyb2xzXG4gIHdpbmRvdy5fcHVibGljYXRpb25zT3JkZXJlZCA9IFsuLi5yZWNvbW1lbmRhdGlvbnNdO1xuXG4gIGxldCB0YWJsZUhUTUwgPSBgXG4gICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO2ZvbnQtc2l6ZTowLjllbTttYXJnaW4tYm90dG9tOjEycHg7XCI+JHtjb250ZXh0Tm90ZX08L3A+XG4gICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjEycHg7ZmxleC13cmFwOndyYXA7bWFyZ2luLWJvdHRvbToxMHB4O1wiPlxuICAgICAgPGxhYmVsIHN0eWxlPVwiZm9udC1zaXplOjAuOWVtO2NvbG9yOiMzNzQxNTE7XCI+RmlsdGVyIHB1YmxpY2F0aW9uczpcbiAgICAgICAgPGlucHV0IHR5cGU9XCJzZWFyY2hcIiBpZD1cInB1Yi1maWx0ZXItaW5wdXRcIiBwbGFjZWhvbGRlcj1cIlR5cGUgdG8gZmlsdGVyXHUyMDI2XCJcbiAgICAgICAgICBzdHlsZT1cIm1hcmdpbi1sZWZ0OjhweDtwYWRkaW5nOjRweCA4cHg7Ym9yZGVyOjFweCBzb2xpZCAjZDFkNWRiO2JvcmRlci1yYWRpdXM6NHB4O2ZvbnQtc2l6ZTowLjllbTtcIlxuICAgICAgICAgIG9uaW5wdXQ9XCJmaWx0ZXJQdWJsaWNhdGlvbnNUYWJsZSh0aGlzLnZhbHVlKVwiPlxuICAgICAgPC9sYWJlbD5cbiAgICAgIDxzcGFuIHN0eWxlPVwibWFyZ2luLWxlZnQ6YXV0bztkaXNwbGF5OmZsZXg7Z2FwOjhweDthbGlnbi1pdGVtczpjZW50ZXI7XCI+XG4gICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjAuODJlbTtjb2xvcjojNmI3MjgwO1wiPkJ1bGs6PC9zcGFuPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBzZWNvbmRhcnlcIiBzdHlsZT1cImZvbnQtc2l6ZTowLjhlbTtwYWRkaW5nOjRweCAxMHB4O1wiXG4gICAgICAgICAgb25jbGljaz1cImJ1bGtQdWJBY3Rpb24oJ3JlY29tbWVuZGVkJylcIiB0aXRsZT1cIkFjY2VwdCBhbGwgcmVjb21tZW5kZWQgYW5kIHJlamVjdCB0aGUgcmVzdFwiPkFjY2VwdCBSZWNvbW1lbmRlZDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBzZWNvbmRhcnlcIiBzdHlsZT1cImZvbnQtc2l6ZTowLjhlbTtwYWRkaW5nOjRweCAxMHB4O1wiXG4gICAgICAgICAgb25jbGljaz1cImJ1bGtQdWJBY3Rpb24oJ2FjY2VwdC1hbGwnKVwiIHRpdGxlPVwiQWNjZXB0IGFsbCBwdWJsaWNhdGlvbnNcIj5BY2NlcHQgQWxsPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHNlY29uZGFyeVwiIHN0eWxlPVwiZm9udC1zaXplOjAuOGVtO3BhZGRpbmc6NHB4IDEwcHg7XCJcbiAgICAgICAgICBvbmNsaWNrPVwiYnVsa1B1YkFjdGlvbigncmVqZWN0LWFsbCcpXCIgdGl0bGU9XCJSZWplY3QgYWxsIHB1YmxpY2F0aW9uc1wiPlJlamVjdCBBbGw8L2J1dHRvbj5cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8dGFibGUgaWQ9XCJwdWJsaWNhdGlvbnMtcmV2aWV3LXRhYmxlXCIgY2xhc3M9XCJyZXZpZXctdGFibGVcIj5cbiAgICAgIDx0aGVhZD5cbiAgICAgICAgPHRyPlxuICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOjQwcHg7XCI+UmFuazwvdGg+XG4gICAgICAgICAgPHRoPkNpdGF0aW9uPC90aD5cbiAgICAgICAgICA8dGg+WWVhcjwvdGg+XG4gICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6MzZweDt0ZXh0LWFsaWduOmNlbnRlcjtcIiB0aXRsZT1cIkZpcnN0IGF1dGhvclwiPjFzdFx1MjYwNTwvdGg+XG4gICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6NTBweDtcIj5TY29yZTwvdGg+XG4gICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6ODBweDtcIj5Db25maWRlbmNlPC90aD5cbiAgICAgICAgICA8dGg+UmVhc29uaW5nPC90aD5cbiAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDo4MHB4O1wiPkluY2x1ZGU/PC90aD5cbiAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDo1NnB4O3RleHQtYWxpZ246Y2VudGVyO1wiPk9yZGVyPC90aD5cbiAgICAgICAgPC90cj5cbiAgICAgIDwvdGhlYWQ+XG4gICAgICA8dGJvZHk+XG4gIGA7XG5cbiAgbGV0IGRpdmlkZXJJbnNlcnRlZCA9IGZhbHNlO1xuICByZWNvbW1lbmRhdGlvbnMuZm9yRWFjaCgocHViLCBpZHgpID0+IHtcbiAgICAvLyBJbnNlcnQgYSBzZWN0aW9uIGRpdmlkZXIgYmVmb3JlIHRoZSBmaXJzdCBub24tcmVjb21tZW5kZWQgcHVibGljYXRpb25cbiAgICBpZiAoIWRpdmlkZXJJbnNlcnRlZCAmJiBwdWIuaXNfcmVjb21tZW5kZWQgPT09IGZhbHNlKSB7XG4gICAgICBkaXZpZGVySW5zZXJ0ZWQgPSB0cnVlO1xuICAgICAgY29uc3QgZGl2aWRlclN0eWxlID0gJ2JhY2tncm91bmQ6I2YzZjRmNjtib3JkZXItdG9wOjJweCBzb2xpZCAjZDFkNWRiO3BhZGRpbmc6MDsnO1xuICAgICAgdGFibGVIVE1MICs9IGBcbiAgICAgICAgPHRyIGNsYXNzPVwicHViLWRpdmlkZXItcm93XCI+XG4gICAgICAgICAgPHRkIHN0eWxlPVwiJHtkaXZpZGVyU3R5bGV9XCI+PC90ZD5cbiAgICAgICAgICA8dGQgc3R5bGU9XCIke2RpdmlkZXJTdHlsZX1jb2xvcjojNmI3MjgwO2ZvbnQtc2l6ZTowLjgyZW07Zm9udC1zdHlsZTppdGFsaWM7cGFkZGluZzo2cHggMTJweDt0ZXh0LWFsaWduOmNlbnRlcjtcIj5cbiAgICAgICAgICAgIFx1MjAxNCBQdWJsaWNhdGlvbnMgYmVsb3cgd2VyZSBub3QgcmVjb21tZW5kZWQgZm9yIHRoaXMgcm9sZSAocHJlLWV4Y2x1ZGVkKSBcdTIwMTRcbiAgICAgICAgICA8L3RkPlxuICAgICAgICAgIDx0ZCBzdHlsZT1cIiR7ZGl2aWRlclN0eWxlfVwiPjwvdGQ+XG4gICAgICAgICAgPHRkIHN0eWxlPVwiJHtkaXZpZGVyU3R5bGV9XCI+PC90ZD5cbiAgICAgICAgICA8dGQgc3R5bGU9XCIke2RpdmlkZXJTdHlsZX1cIj48L3RkPlxuICAgICAgICAgIDx0ZCBzdHlsZT1cIiR7ZGl2aWRlclN0eWxlfVwiPjwvdGQ+XG4gICAgICAgICAgPHRkIHN0eWxlPVwiJHtkaXZpZGVyU3R5bGV9XCI+PC90ZD5cbiAgICAgICAgICA8dGQgc3R5bGU9XCIke2RpdmlkZXJTdHlsZX1cIj48L3RkPlxuICAgICAgICAgIDx0ZCBzdHlsZT1cIiR7ZGl2aWRlclN0eWxlfVwiPjwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgICBgO1xuICAgIH1cblxuICAgIGNvbnN0IHJhbmsgICAgICAgPSBpZHggKyAxO1xuICAgIGNvbnN0IGNpdGF0aW9uICAgPSBwdWIuZm9ybWF0dGVkX2NpdGF0aW9uIHx8IFtwdWIudGl0bGUsIHB1Yi52ZW51ZSwgcHViLnllYXJdLmZpbHRlcihCb29sZWFuKS5qb2luKCcuICcpO1xuICAgIGNvbnN0IHllYXIgICAgICAgPSBwdWIueWVhciB8fCAnXHUyMDE0JztcbiAgICBjb25zdCBmaXJzdEF1dGggID0gcHViLmlzX2ZpcnN0X2F1dGhvciA/ICc8c3BhbiBzdHlsZT1cImNvbG9yOiMxMGI5ODE7Zm9udC13ZWlnaHQ6NzAwO1wiIHRpdGxlPVwiRmlyc3QgYXV0aG9yXCI+XHUyNjA1PC9zcGFuPicgOiAnPHNwYW4gc3R5bGU9XCJjb2xvcjojZDFkNWRiO1wiPlx1MjYwNjwvc3Bhbj4nO1xuICAgIGNvbnN0IHNjb3JlICAgICAgPSBwdWIucmVsZXZhbmNlX3Njb3JlID8gcHViLnJlbGV2YW5jZV9zY29yZSA6ICdcdTIwMTQnO1xuICAgIGNvbnN0IGNvbmZpZGVuY2UgPSBwdWIuY29uZmlkZW5jZSB8fCAnJztcbiAgICBjb25zdCBjb25mQ29sb3IgID0gY29uZmlkZW5jZSA9PT0gJ0hpZ2gnID8gJyMxMGI5ODEnIDogY29uZmlkZW5jZSA9PT0gJ0xvdycgPyAnI2VmNDQ0NCcgOiAnI2Y1OWUwYic7XG4gICAgY29uc3QgY29uZkJhZGdlICA9IGNvbmZpZGVuY2UgPyBgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MTFweDtjb2xvcjoke2NvbmZDb2xvcn07Zm9udC13ZWlnaHQ6NjAwO1wiPiR7ZXNjYXBlSHRtbChjb25maWRlbmNlKX08L3NwYW4+YCA6ICcnO1xuICAgIGNvbnN0IHJlYXNvbmluZyAgPSBwdWIucmF0aW9uYWxlID8gYDxzbWFsbD4ke2VzY2FwZUh0bWwocHViLnJhdGlvbmFsZSl9PC9zbWFsbD5gIDogJyc7XG4gICAgY29uc3QgdmVudWVXYXJuICA9IHB1Yi52ZW51ZV93YXJuaW5nID8gYCA8c3BhbiB0aXRsZT1cIiR7ZXNjYXBlSHRtbChwdWIudmVudWVfd2FybmluZyl9XCIgc3R5bGU9XCJjb2xvcjojZGM3OTAwO2N1cnNvcjpoZWxwO1wiPlx1MjZBMDwvc3Bhbj5gIDogJyc7XG4gICAgY29uc3QgY2l0ZUtleSAgICA9IHB1Yi5jaXRlX2tleSB8fCAnJztcbiAgICBjb25zdCBpc0FjY2VwdGVkID0gd2luZG93LnB1YmxpY2F0aW9uRGVjaXNpb25zW2NpdGVLZXldICE9PSBmYWxzZTtcbiAgICBjb25zdCByb3dTdHlsZSAgID0gcHViLmlzX3JlY29tbWVuZGVkID09PSBmYWxzZSA/ICdvcGFjaXR5OjAuNzsnIDogJyc7XG5cbiAgICBjb25zdCBpc0ZpcnN0ID0gaWR4ID09PSAwO1xuICAgIGNvbnN0IGlzTGFzdCAgPSBpZHggPT09IHJlY29tbWVuZGF0aW9ucy5sZW5ndGggLSAxO1xuICAgIHRhYmxlSFRNTCArPSBgXG4gICAgICA8dHIgZGF0YS1jaXRlLWtleT1cIiR7ZXNjYXBlSHRtbChjaXRlS2V5KX1cIiBzdHlsZT1cIiR7cm93U3R5bGV9XCI+XG4gICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO2ZvbnQtd2VpZ2h0OjcwMDtcIj4ke3Jhbmt9PC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwiZm9udC1zaXplOjAuODdlbTtcIj4ke2VzY2FwZUh0bWwoY2l0YXRpb24pfSR7dmVudWVXYXJufTwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO1wiPiR7eWVhcn08L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjtcIj4ke2ZpcnN0QXV0aH08L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjtcIj4ke3Njb3JlICE9PSAnXHUyMDE0JyA/IGA8c3Ryb25nPiR7c2NvcmV9PC9zdHJvbmc+LzEwYCA6ICdcdTIwMTQnfTwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO1wiPiR7Y29uZkJhZGdlfTwvdGQ+XG4gICAgICAgIDx0ZD4ke3JlYXNvbmluZ308L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJhY3Rpb24tYnRuc1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuJHtpc0FjY2VwdGVkID8gJyBhY3RpdmUnIDogJyd9XCIgZGF0YS1hY3Rpb249XCJhY2NlcHRcIiBhcmlhLWxhYmVsPVwiSW5jbHVkZSBwdWJsaWNhdGlvbiAke2VzY2FwZUh0bWwoY2l0ZUtleSl9XCIgdGl0bGU9XCJJbmNsdWRlIGluIENWXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJjb2xvcjojMTBiOTgxO1wiIGlkPVwicHViLWFjY2VwdC0ke3Jhbmt9XCI+XHUyNzEzPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG4keyFpc0FjY2VwdGVkID8gJyBhY3RpdmUnIDogJyd9XCIgZGF0YS1hY3Rpb249XCJyZWplY3RcIiBhcmlhLWxhYmVsPVwiRXhjbHVkZSBwdWJsaWNhdGlvbiAke2VzY2FwZUh0bWwoY2l0ZUtleSl9XCIgdGl0bGU9XCJFeGNsdWRlIGZyb20gQ1ZcIlxuICAgICAgICAgICAgICBzdHlsZT1cImNvbG9yOiNlZjQ0NDQ7XCIgaWQ9XCJwdWItcmVqZWN0LSR7cmFua31cIj4ke2V5ZVNsYXNoSWNvbigpfTwvYnV0dG9uPlxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjt3aGl0ZS1zcGFjZTpub3dyYXA7XCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgZGF0YS1hY3Rpb249XCJwdWItdXBcIiBkYXRhLWNpdGUta2V5PVwiJHtlc2NhcGVIdG1sKGNpdGVLZXkpfVwiXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiTW92ZSBwdWJsaWNhdGlvbiB1cFwiIHRpdGxlPVwiTW92ZSB1cFwiICR7aXNGaXJzdCA/ICdkaXNhYmxlZCBzdHlsZT1cIm9wYWNpdHk6MC4zO1wiJyA6ICcnfT5cdTIxOTE8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBkYXRhLWFjdGlvbj1cInB1Yi1kb3duXCIgZGF0YS1jaXRlLWtleT1cIiR7ZXNjYXBlSHRtbChjaXRlS2V5KX1cIlxuICAgICAgICAgICAgYXJpYS1sYWJlbD1cIk1vdmUgcHVibGljYXRpb24gZG93blwiIHRpdGxlPVwiTW92ZSBkb3duXCIgJHtpc0xhc3QgPyAnZGlzYWJsZWQgc3R5bGU9XCJvcGFjaXR5OjAuMztcIicgOiAnJ30+XHUyMTkzPC9idXR0b24+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L3RyPlxuICAgIGA7XG4gIH0pO1xuXG4gIHRhYmxlSFRNTCArPSAnPC90Ym9keT48L3RhYmxlPic7XG4gIGNvbnRhaW5lci5pbm5lckhUTUwgPSB0YWJsZUhUTUw7XG4gIC8vIERlbGVnYXRlZCBjbGljayBoYW5kbGVyIGZvciBwdWJsaWNhdGlvbiBhY3Rpb24gYnV0dG9ucyAoZGF0YS1jaXRlLWtleSBvbiA8dHI+IGF2b2lkcyBvbmNsaWNrIGluamVjdGlvbilcbiAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJyNwdWJsaWNhdGlvbnMtcmV2aWV3LXRhYmxlIHRib2R5Jyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZSA9PiB7XG4gICAgY29uc3QgYnRuID0gZS50YXJnZXQuY2xvc2VzdCgnLmljb24tYnRuJyk7XG4gICAgaWYgKCFidG4gfHwgYnRuLmRpc2FibGVkKSByZXR1cm47XG4gICAgY29uc3QgdHIgPSBidG4uY2xvc2VzdCgndHJbZGF0YS1jaXRlLWtleV0nKTtcbiAgICBpZiAoIXRyKSByZXR1cm47XG4gICAgY29uc3QgYWN0aW9uID0gYnRuLmRhdGFzZXQuYWN0aW9uO1xuICAgIGlmICAgICAgKGFjdGlvbiA9PT0gJ2FjY2VwdCcpICAgaGFuZGxlUHViQWN0aW9uKHRyLmRhdGFzZXQuY2l0ZUtleSwgdHJ1ZSk7XG4gICAgZWxzZSBpZiAoYWN0aW9uID09PSAncmVqZWN0JykgICBoYW5kbGVQdWJBY3Rpb24odHIuZGF0YXNldC5jaXRlS2V5LCBmYWxzZSk7XG4gICAgZWxzZSBpZiAoYWN0aW9uID09PSAncHViLXVwJykgICBtb3ZlUHViUm93KGJ0bi5kYXRhc2V0LmNpdGVLZXksIC0xKTtcbiAgICBlbHNlIGlmIChhY3Rpb24gPT09ICdwdWItZG93bicpIG1vdmVQdWJSb3coYnRuLmRhdGFzZXQuY2l0ZUtleSwgKzEpO1xuICB9KTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEZpbHRlciB0YWJsZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gZmlsdGVyUHVibGljYXRpb25zVGFibGUocXVlcnkpIHtcbiAgY29uc3QgcSA9IHF1ZXJ5LnRvTG93ZXJDYXNlKCk7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNwdWJsaWNhdGlvbnMtcmV2aWV3LXRhYmxlIHRib2R5IHRyOm5vdCgucHViLWRpdmlkZXItcm93KScpLmZvckVhY2gocm93ID0+IHtcbiAgICByb3cuc3R5bGUuZGlzcGxheSA9IHEgPT09ICcnIHx8IHJvdy50ZXh0Q29udGVudC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpID8gJycgOiAnbm9uZSc7XG4gIH0pO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgUmVvcmRlciByb3dzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBtb3ZlUHViUm93KGNpdGVLZXksIGRpcmVjdGlvbikge1xuICBjb25zdCBhcnIgPSB3aW5kb3cuX3B1YmxpY2F0aW9uc09yZGVyZWQ7XG4gIGlmICghYXJyIHx8ICFhcnIubGVuZ3RoKSByZXR1cm47XG4gIGNvbnN0IGlkeCA9IGFyci5maW5kSW5kZXgocCA9PiBwLmNpdGVfa2V5ID09PSBjaXRlS2V5KTtcbiAgaWYgKGlkeCA8IDApIHJldHVybjtcbiAgY29uc3QgbmV3SWR4ID0gaWR4ICsgZGlyZWN0aW9uO1xuICBpZiAobmV3SWR4IDwgMCB8fCBuZXdJZHggPj0gYXJyLmxlbmd0aCkgcmV0dXJuO1xuICBbYXJyW2lkeF0sIGFycltuZXdJZHhdXSA9IFthcnJbbmV3SWR4XSwgYXJyW2lkeF1dO1xuICBfcmVidWlsZFB1YlRhYmxlQm9keShhcnIpO1xuICAvLyBQZXJzaXN0IG9yZGVyIHRvIGJhY2tlbmQgKGZpcmUtYW5kLWZvcmdldClcbiAgZmV0Y2goJy9hcGkvcmVvcmRlci1yb3dzJywge1xuICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgdHlwZTogJ3B1YmxpY2F0aW9uJywgb3JkZXJlZF9pZHM6IGFyci5tYXAocCA9PiBwLmNpdGVfa2V5KSB9KSxcbiAgfSkuY2F0Y2goKCkgPT4ge30pO1xufVxuXG5mdW5jdGlvbiBfcmVidWlsZFB1YlRhYmxlQm9keShyZWNvbW1lbmRhdGlvbnMpIHtcbiAgY29uc3QgdGJvZHkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcHVibGljYXRpb25zLXJldmlldy10YWJsZSB0Ym9keScpO1xuICBpZiAoIXRib2R5KSByZXR1cm47XG4gIGxldCBodG1sID0gJyc7XG4gIGxldCBkaXZpZGVySW5zZXJ0ZWQgPSBmYWxzZTtcbiAgcmVjb21tZW5kYXRpb25zLmZvckVhY2goKHB1YiwgaWR4KSA9PiB7XG4gICAgaWYgKCFkaXZpZGVySW5zZXJ0ZWQgJiYgcHViLmlzX3JlY29tbWVuZGVkID09PSBmYWxzZSkge1xuICAgICAgZGl2aWRlckluc2VydGVkID0gdHJ1ZTtcbiAgICAgIGNvbnN0IGRzID0gJ2JhY2tncm91bmQ6I2YzZjRmNjtib3JkZXItdG9wOjJweCBzb2xpZCAjZDFkNWRiO3BhZGRpbmc6MDsnO1xuICAgICAgaHRtbCArPSBgPHRyIGNsYXNzPVwicHViLWRpdmlkZXItcm93XCI+PHRkIHN0eWxlPVwiJHtkc31cIj48L3RkPjx0ZCBzdHlsZT1cIiR7ZHN9Y29sb3I6IzZiNzI4MDtmb250LXNpemU6MC44MmVtO2ZvbnQtc3R5bGU6aXRhbGljO3BhZGRpbmc6NnB4IDEycHg7dGV4dC1hbGlnbjpjZW50ZXI7XCI+XHUyMDE0IFB1YmxpY2F0aW9ucyBiZWxvdyB3ZXJlIG5vdCByZWNvbW1lbmRlZCBmb3IgdGhpcyByb2xlIChwcmUtZXhjbHVkZWQpIFx1MjAxNDwvdGQ+PHRkIHN0eWxlPVwiJHtkc31cIj48L3RkPjx0ZCBzdHlsZT1cIiR7ZHN9XCI+PC90ZD48dGQgc3R5bGU9XCIke2RzfVwiPjwvdGQ+PHRkIHN0eWxlPVwiJHtkc31cIj48L3RkPjx0ZCBzdHlsZT1cIiR7ZHN9XCI+PC90ZD48dGQgc3R5bGU9XCIke2RzfVwiPjwvdGQ+PHRkIHN0eWxlPVwiJHtkc31cIj48L3RkPjwvdHI+YDtcbiAgICB9XG4gICAgY29uc3QgcmFuayAgICAgICA9IGlkeCArIDE7XG4gICAgY29uc3QgY2l0ZUtleSAgICA9IHB1Yi5jaXRlX2tleSB8fCAnJztcbiAgICBjb25zdCBjaXRhdGlvbiAgID0gcHViLmZvcm1hdHRlZF9jaXRhdGlvbiB8fCBbcHViLnRpdGxlLCBwdWIudmVudWUsIHB1Yi55ZWFyXS5maWx0ZXIoQm9vbGVhbikuam9pbignLiAnKTtcbiAgICBjb25zdCB5ZWFyICAgICAgID0gcHViLnllYXIgfHwgJ1x1MjAxNCc7XG4gICAgY29uc3QgZmlyc3RBdXRoICA9IHB1Yi5pc19maXJzdF9hdXRob3IgPyAnPHNwYW4gc3R5bGU9XCJjb2xvcjojMTBiOTgxO2ZvbnQtd2VpZ2h0OjcwMDtcIiB0aXRsZT1cIkZpcnN0IGF1dGhvclwiPlx1MjYwNTwvc3Bhbj4nIDogJzxzcGFuIHN0eWxlPVwiY29sb3I6I2QxZDVkYjtcIj5cdTI2MDY8L3NwYW4+JztcbiAgICBjb25zdCBzY29yZSAgICAgID0gcHViLnJlbGV2YW5jZV9zY29yZSA/IHB1Yi5yZWxldmFuY2Vfc2NvcmUgOiAnXHUyMDE0JztcbiAgICBjb25zdCBjb25maWRlbmNlID0gcHViLmNvbmZpZGVuY2UgfHwgJyc7XG4gICAgY29uc3QgY29uZkNvbG9yICA9IGNvbmZpZGVuY2UgPT09ICdIaWdoJyA/ICcjMTBiOTgxJyA6IGNvbmZpZGVuY2UgPT09ICdMb3cnID8gJyNlZjQ0NDQnIDogJyNmNTllMGInO1xuICAgIGNvbnN0IGNvbmZCYWRnZSAgPSBjb25maWRlbmNlID8gYDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjExcHg7Y29sb3I6JHtjb25mQ29sb3J9O2ZvbnQtd2VpZ2h0OjYwMDtcIj4ke2VzY2FwZUh0bWwoY29uZmlkZW5jZSl9PC9zcGFuPmAgOiAnJztcbiAgICBjb25zdCByZWFzb25pbmcgID0gcHViLnJhdGlvbmFsZSA/IGA8c21hbGw+JHtlc2NhcGVIdG1sKHB1Yi5yYXRpb25hbGUpfTwvc21hbGw+YCA6ICcnO1xuICAgIGNvbnN0IHZlbnVlV2FybiAgPSBwdWIudmVudWVfd2FybmluZyA/IGAgPHNwYW4gdGl0bGU9XCIke2VzY2FwZUh0bWwocHViLnZlbnVlX3dhcm5pbmcpfVwiIHN0eWxlPVwiY29sb3I6I2RjNzkwMDtjdXJzb3I6aGVscDtcIj5cdTI2QTA8L3NwYW4+YCA6ICcnO1xuICAgIGNvbnN0IGlzQWNjZXB0ZWQgPSB3aW5kb3cucHVibGljYXRpb25EZWNpc2lvbnNbY2l0ZUtleV0gIT09IGZhbHNlO1xuICAgIGNvbnN0IHJvd1N0eWxlICAgPSBwdWIuaXNfcmVjb21tZW5kZWQgPT09IGZhbHNlID8gJ29wYWNpdHk6MC43OycgOiAnJztcbiAgICBjb25zdCBpc0ZpcnN0ICAgID0gaWR4ID09PSAwO1xuICAgIGNvbnN0IGlzTGFzdCAgICAgPSBpZHggPT09IHJlY29tbWVuZGF0aW9ucy5sZW5ndGggLSAxO1xuICAgIGh0bWwgKz0gYDx0ciBkYXRhLWNpdGUta2V5PVwiJHtlc2NhcGVIdG1sKGNpdGVLZXkpfVwiIHN0eWxlPVwiJHtyb3dTdHlsZX1cIj5cbiAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO2ZvbnQtd2VpZ2h0OjcwMDtcIj4ke3Jhbmt9PC90ZD5cbiAgICAgIDx0ZCBzdHlsZT1cImZvbnQtc2l6ZTowLjg3ZW07XCI+JHtlc2NhcGVIdG1sKGNpdGF0aW9uKX0ke3ZlbnVlV2Fybn08L3RkPlxuICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7XCI+JHt5ZWFyfTwvdGQ+XG4gICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjtcIj4ke2ZpcnN0QXV0aH08L3RkPlxuICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7XCI+JHtzY29yZSAhPT0gJ1x1MjAxNCcgPyBgPHN0cm9uZz4ke3Njb3JlfTwvc3Ryb25nPi8xMGAgOiAnXHUyMDE0J308L3RkPlxuICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7XCI+JHtjb25mQmFkZ2V9PC90ZD5cbiAgICAgIDx0ZD4ke3JlYXNvbmluZ308L3RkPlxuICAgICAgPHRkIGNsYXNzPVwiYWN0aW9uLWJ0bnNcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuJHtpc0FjY2VwdGVkID8gJyBhY3RpdmUnIDogJyd9XCIgZGF0YS1hY3Rpb249XCJhY2NlcHRcIiBhcmlhLWxhYmVsPVwiSW5jbHVkZSBwdWJsaWNhdGlvbiAke2VzY2FwZUh0bWwoY2l0ZUtleSl9XCIgdGl0bGU9XCJJbmNsdWRlIGluIENWXCIgc3R5bGU9XCJjb2xvcjojMTBiOTgxO1wiIGlkPVwicHViLWFjY2VwdC0ke3Jhbmt9XCI+XHUyNzEzPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0biR7IWlzQWNjZXB0ZWQgPyAnIGFjdGl2ZScgOiAnJ31cIiBkYXRhLWFjdGlvbj1cInJlamVjdFwiIGFyaWEtbGFiZWw9XCJFeGNsdWRlIHB1YmxpY2F0aW9uICR7ZXNjYXBlSHRtbChjaXRlS2V5KX1cIiB0aXRsZT1cIkV4Y2x1ZGUgZnJvbSBDVlwiIHN0eWxlPVwiY29sb3I6I2VmNDQ0NDtcIiBpZD1cInB1Yi1yZWplY3QtJHtyYW5rfVwiPiR7ZXllU2xhc2hJY29uKCl9PC9idXR0b24+XG4gICAgICA8L3RkPlxuICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7d2hpdGUtc3BhY2U6bm93cmFwO1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBkYXRhLWFjdGlvbj1cInB1Yi11cFwiIGRhdGEtY2l0ZS1rZXk9XCIke2VzY2FwZUh0bWwoY2l0ZUtleSl9XCIgYXJpYS1sYWJlbD1cIk1vdmUgcHVibGljYXRpb24gdXBcIiB0aXRsZT1cIk1vdmUgdXBcIiAke2lzRmlyc3QgPyAnZGlzYWJsZWQgc3R5bGU9XCJvcGFjaXR5OjAuMztcIicgOiAnJ30+XHUyMTkxPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIGRhdGEtYWN0aW9uPVwicHViLWRvd25cIiBkYXRhLWNpdGUta2V5PVwiJHtlc2NhcGVIdG1sKGNpdGVLZXkpfVwiIGFyaWEtbGFiZWw9XCJNb3ZlIHB1YmxpY2F0aW9uIGRvd25cIiB0aXRsZT1cIk1vdmUgZG93blwiICR7aXNMYXN0ID8gJ2Rpc2FibGVkIHN0eWxlPVwib3BhY2l0eTowLjM7XCInIDogJyd9Plx1MjE5MzwvYnV0dG9uPlxuICAgICAgPC90ZD5cbiAgICA8L3RyPmA7XG4gIH0pO1xuICB0Ym9keS5pbm5lckhUTUwgPSBodG1sO1xuICAvLyBSZS1hcHBseSBhbnkgYWN0aXZlIGZpbHRlclxuICBjb25zdCBmaWx0ZXJWYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLWZpbHRlci1pbnB1dCcpPy52YWx1ZSB8fCAnJztcbiAgaWYgKGZpbHRlclZhbCkgZmlsdGVyUHVibGljYXRpb25zVGFibGUoZmlsdGVyVmFsKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFRvZ2dsZSBhY2NlcHQgLyByZWplY3QgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIGhhbmRsZVB1YkFjdGlvbihjaXRlS2V5LCBhY2NlcHQpIHtcbiAgd2luZG93LnB1YmxpY2F0aW9uRGVjaXNpb25zW2NpdGVLZXldID0gYWNjZXB0O1xuICAvLyB1cGRhdGUgYnV0dG9uIGFjdGl2ZSBzdGF0ZXMgaW4gdGhlIHJvd1xuICBjb25zdCByb3cgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGB0cltkYXRhLWNpdGUta2V5PVwiJHtDU1MuZXNjYXBlKGNpdGVLZXkpfVwiXWApO1xuICBpZiAoIXJvdykgcmV0dXJuO1xuICByb3cucXVlcnlTZWxlY3RvckFsbCgnLmljb24tYnRuJykuZm9yRWFjaChidG4gPT4gYnRuLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpKTtcbiAgY29uc3QgYWN0aW9uID0gYWNjZXB0ID8gJ2FjY2VwdCcgOiAncmVqZWN0JztcbiAgY29uc3QgYnRuID0gcm93LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWFjdGlvbj1cIiR7YWN0aW9ufVwiXWApO1xuICBpZiAoYnRuKSBidG4uY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBCdWxrIGFjdGlvbnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIGJ1bGtQdWJBY3Rpb24obW9kZSkge1xuICBjb25zdCBwdWJzID0gd2luZG93Ll9wdWJsaWNhdGlvbnNPcmRlcmVkIHx8IFtdO1xuICBpZiAoIXB1YnMubGVuZ3RoKSByZXR1cm47XG5cbiAgcHVicy5mb3JFYWNoKHB1YiA9PiB7XG4gICAgY29uc3QgY2l0ZUtleSA9IHB1Yi5jaXRlX2tleTtcbiAgICBsZXQgYWNjZXB0O1xuICAgIGlmIChtb2RlID09PSAncmVjb21tZW5kZWQnKSB7XG4gICAgICBhY2NlcHQgPSBwdWIuaXNfcmVjb21tZW5kZWQgIT09IGZhbHNlO1xuICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gJ2FjY2VwdC1hbGwnKSB7XG4gICAgICBhY2NlcHQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBhY2NlcHQgPSBmYWxzZTtcbiAgICB9XG4gICAgd2luZG93LnB1YmxpY2F0aW9uRGVjaXNpb25zW2NpdGVLZXldID0gYWNjZXB0O1xuICAgIC8vIFVwZGF0ZSBidXR0b24gc3RhdGVzIGluIHRoZSBET01cbiAgICBjb25zdCByb3cgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGB0cltkYXRhLWNpdGUta2V5PVwiJHtDU1MuZXNjYXBlKGNpdGVLZXkpfVwiXWApO1xuICAgIGlmICghcm93KSByZXR1cm47XG4gICAgcm93LnF1ZXJ5U2VsZWN0b3JBbGwoJy5pY29uLWJ0bltkYXRhLWFjdGlvbj1cImFjY2VwdFwiXSxbZGF0YS1hY3Rpb249XCJyZWplY3RcIl0nKS5mb3JFYWNoKGJ0biA9PiBidG4uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJykpO1xuICAgIGNvbnN0IHRhcmdldCA9IHJvdy5xdWVyeVNlbGVjdG9yKGBbZGF0YS1hY3Rpb249XCIke2FjY2VwdCA/ICdhY2NlcHQnIDogJ3JlamVjdCd9XCJdYCk7XG4gICAgaWYgKHRhcmdldCkgdGFyZ2V0LmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICB9KTtcblxuICBjb25zdCBhY2NlcHRlZCA9IE9iamVjdC52YWx1ZXMod2luZG93LnB1YmxpY2F0aW9uRGVjaXNpb25zKS5maWx0ZXIoQm9vbGVhbikubGVuZ3RoO1xuICBzaG93VG9hc3QoYEJ1bGsgYWN0aW9uIGFwcGxpZWQ6ICR7YWNjZXB0ZWR9IGFjY2VwdGVkLCAke3B1YnMubGVuZ3RoIC0gYWNjZXB0ZWR9IGV4Y2x1ZGVkYCk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBTdWJtaXQgZGVjaXNpb25zIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBzdWJtaXRQdWJsaWNhdGlvbkRlY2lzaW9ucygpIHtcbiAgLyogZHVja2Zsb3c6XG4gICAqICAgaWQ6IHB1YmxpY2F0aW9uc191aV9zdWJtaXRfbGl2ZVxuICAgKiAgIGtpbmQ6IHVpXG4gICAqICAgdGltZXN0YW1wOiAnMjAyNi0wMy0yNVQyMTozOTo0OFonXG4gICAqICAgc3RhdHVzOiBsaXZlXG4gICAqICAgaGFuZGxlczpcbiAgICogICAtIHVpOnB1YmxpY2F0aW9ucy1yZXZpZXcuc3VibWl0XG4gICAqICAgY2FsbHM6XG4gICAqICAgLSBQT1NUIC9hcGkvcmV2aWV3LWRlY2lzaW9uc1xuICAgKiAgIC0gR0VUIC9hcGkvcmV3cml0ZXNcbiAgICogICByZWFkczpcbiAgICogICAtIHdpbmRvdzpwdWJsaWNhdGlvbkRlY2lzaW9uc1xuICAgKiAgIHdyaXRlczpcbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL3Jldmlldy1kZWNpc2lvbnMuZGVjaXNpb25zXG4gICAqICAgbm90ZXM6IFBlcnNpc3RzIHB1YmxpY2F0aW9uIGluY2x1ZGUvZXhjbHVkZSBkZWNpc2lvbnMgYmVmb3JlIHRoZSByZXdyaXRlIHN0YWdlIGRlcml2ZXMgZG93bnN0cmVhbSBjb250ZW50IHByb3Bvc2FscyBmcm9tIHRoZSBhY2NlcHRlZCBwdWJsaWNhdGlvbiBzZXQuXG4gICAqL1xuICBjb25zdCBkZWNpc2lvbnMgPSB3aW5kb3cucHVibGljYXRpb25EZWNpc2lvbnMgfHwge307XG4gIGNvbnN0IGNvdW50ID0gT2JqZWN0LmtleXMoZGVjaXNpb25zKS5sZW5ndGg7XG4gIGlmIChjb3VudCA9PT0gMCkge1xuICAgIHNob3dUb2FzdCgnTm8gcHVibGljYXRpb24gZGVjaXNpb25zIHRvIHNhdmUuJywgJ2Vycm9yJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gUGVyc2lzdCBhcyBhIHN0cnVjdHVyZWQgYW5zd2VyIGluIHNlc3Npb24gc3RhdGVcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3Jldmlldy1kZWNpc2lvbnMnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyB0eXBlOiAncHVibGljYXRpb25zJywgZGVjaXNpb25zOiB3aW5kb3cucHVibGljYXRpb25EZWNpc2lvbnMgfSlcbiAgICB9KTtcblxuICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgc3RhdGVNYW5hZ2VyLm1hcmtDb250ZW50Q2hhbmdlZCgpO1xuICAgICAgY29uc3QgYWNjZXB0ZWQgPSBPYmplY3QudmFsdWVzKHdpbmRvdy5wdWJsaWNhdGlvbkRlY2lzaW9ucykuZmlsdGVyKEJvb2xlYW4pLmxlbmd0aDtcbiAgICAgIGNvbnN0IHJlamVjdGVkID0gY291bnQgLSBhY2NlcHRlZDtcbiAgICAgIHNob3dUb2FzdChgUHVibGljYXRpb24gc2VsZWN0aW9ucyBzYXZlZDogJHthY2NlcHRlZH0ga2VwdCwgJHtyZWplY3RlZH0gZXhjbHVkZWRgKTtcbiAgICAgIGF3YWl0IGZldGNoQW5kUmV2aWV3UmV3cml0ZXMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZXJyID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgc2hvd1RvYXN0KGBFcnJvcjogJHtlcnIuZXJyb3IgfHwgJ0ZhaWxlZCB0byBzYXZlIHB1YmxpY2F0aW9uIHNlbGVjdGlvbnMnfWAsICdlcnJvcicpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLmVycm9yKCdFcnJvciBzYXZpbmcgcHVibGljYXRpb24gZGVjaXNpb25zOicsIGVycik7XG4gICAgc2hvd1RvYXN0KCdGYWlsZWQgdG8gc2F2ZSBwdWJsaWNhdGlvbiBzZWxlY3Rpb25zLiBQbGVhc2UgdHJ5IGFnYWluLicsICdlcnJvcicpO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFeHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5leHBvcnQge1xuICBidWlsZFB1YmxpY2F0aW9uc1Jldmlld1RhYmxlLFxuICBidWxrUHViQWN0aW9uLFxuICBmaWx0ZXJQdWJsaWNhdGlvbnNUYWJsZSxcbiAgaGFuZGxlUHViQWN0aW9uLFxuICBzdWJtaXRQdWJsaWNhdGlvbkRlY2lzaW9ucyxcbn07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9yZXdyaXRlLXJldmlldy5qc1xuICogUmV3cml0ZSByZXZpZXcgcGFuZWw6IGZldGNoIHJld3JpdGVzLCByZW5kZXIgY2FyZHMgd2l0aCB3b3JkLWRpZmYsXG4gKiBhY2NlcHQvZWRpdC9yZWplY3QgZGVjaXNpb25zLCBzdWJtaXQuXG4gKlxuICogRGVwZW5kZW5jaWVzIChyZXNvbHZlZCB0aHJvdWdoIGdsb2JhbFRoaXMgYXQgcnVudGltZSk6XG4gKiAgIGFwcGVuZExvYWRpbmdNZXNzYWdlLCByZW1vdmVMb2FkaW5nTWVzc2FnZSwgYXBwZW5kUmV0cnlNZXNzYWdlLCBhcHBlbmRNZXNzYWdlLFxuICogICBzZXRMb2FkaW5nLCBzZW5kQWN0aW9uLCBzd2l0Y2hUYWIsIHNjaGVkdWxlQXRzUmVmcmVzaCxcbiAqICAgZXNjYXBlSHRtbCwgcGFyc2VSZXdyaXRlc1Jlc3BvbnNlLCBQSEFTRVNcbiAqL1xuXG5pbXBvcnQgeyBzdGF0ZU1hbmFnZXIgfSBmcm9tICcuL3N0YXRlLW1hbmFnZXIuanMnO1xuXG4vLyBNb2R1bGUtbGV2ZWwgc3RhdGVcbmxldCByZXdyaXRlRGVjaXNpb25zID0ge307XG5sZXQgX3Jld3JpdGVQYW5lbENhY2hlID0gbnVsbDtcbmxldCBwZXJzdWFzaW9uV2FybmluZ3NBY2tub3dsZWRnZWQgPSBmYWxzZTtcbmxldCBfd2FybmluZ3NCeVJld3JpdGVJZCA9IHt9OyAgLy8gTWFwIGZyb20gcmV3cml0ZSBpZCBcdTIxOTIgd2FybmluZyBsaXN0IChQYXRoIDEpXG5sZXQgX3Jlc3RvcmVUb2FzdFNob3duID0gZmFsc2U7XG5cbmZ1bmN0aW9uIHN5bmNSZXdyaXRlR2xvYmFscygpIHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHdpbmRvdy5yZXdyaXRlRGVjaXNpb25zID0gcmV3cml0ZURlY2lzaW9ucztcbiAgd2luZG93Ll9yZXdyaXRlUGFuZWxDYWNoZSA9IF9yZXdyaXRlUGFuZWxDYWNoZTtcbiAgd2luZG93LmFjY2VwdEFsbFJld3JpdGVzID0gYWNjZXB0QWxsUmV3cml0ZXM7XG4gIHdpbmRvdy5yZWplY3RBbGxSZXdyaXRlcyA9IHJlamVjdEFsbFJld3JpdGVzO1xuICB3aW5kb3cudG9nZ2xlUmV3cml0ZUNvbXBhY3RNb2RlID0gdG9nZ2xlUmV3cml0ZUNvbXBhY3RNb2RlO1xufVxuXG5mdW5jdGlvbiBfZGVjaXNpb25zS2V5KCkge1xuICB0cnkge1xuICAgIGNvbnN0IHNpZCA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCkuZ2V0KCdzZXNzaW9uJyk7XG4gICAgcmV0dXJuIHNpZCA/IGByd19kZWNpc2lvbnNfJHtzaWR9YCA6IG51bGw7XG4gIH0gY2F0Y2ggKF8pIHsgcmV0dXJuIG51bGw7IH1cbn1cblxuZnVuY3Rpb24gX3BlcnNpc3REZWNpc2lvbnMoKSB7XG4gIGNvbnN0IGtleSA9IF9kZWNpc2lvbnNLZXkoKTtcbiAgaWYgKCFrZXkpIHJldHVybjtcbiAgdHJ5IHsgbG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCBKU09OLnN0cmluZ2lmeShyZXdyaXRlRGVjaXNpb25zKSk7IH0gY2F0Y2ggKF8pIHt9XG59XG5cbi8vIEZhbGxiYWNrIGF1ZGl0IGZyb20gdGhlIGxhc3QgL2FwaS9yZXdyaXRlcyByZXNwb25zZSBcdTIwMTQgdXNlZCBmb3IgY29sZC1yZXN0b3JlIChHQVAtMTg2KS5cbmxldCBfYmFja2VuZFJld3JpdGVBdWRpdCA9IFtdO1xuXG5mdW5jdGlvbiBfcmVzdG9yZURlY2lzaW9ucygpIHtcbiAgY29uc3Qga2V5ID0gX2RlY2lzaW9uc0tleSgpO1xuICBpZiAoIWtleSkgcmV0dXJuO1xuICBjb25zdCBoYWREZWNpc2lvbnMgPSBPYmplY3Qua2V5cyhyZXdyaXRlRGVjaXNpb25zKS5sZW5ndGggPiAwO1xuICB0cnkge1xuICAgIGNvbnN0IHNhdmVkID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpIHx8ICdudWxsJyk7XG4gICAgaWYgKHNhdmVkICYmIHR5cGVvZiBzYXZlZCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoc2F2ZWQpKSB7XG4gICAgICBPYmplY3QuYXNzaWduKHJld3JpdGVEZWNpc2lvbnMsIHNhdmVkKTtcbiAgICAgIHN5bmNSZXdyaXRlR2xvYmFscygpO1xuICAgICAgaWYgKCFoYWREZWNpc2lvbnMgJiYgIV9yZXN0b3JlVG9hc3RTaG93biAmJiBPYmplY3Qua2V5cyhyZXdyaXRlRGVjaXNpb25zKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIF9yZXN0b3JlVG9hc3RTaG93biA9IHRydWU7XG4gICAgICAgIGlmICh0eXBlb2Ygc2hvd1RvYXN0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgc2hvd1RvYXN0KCdZb3VyIHByZXZpb3VzIHJld3JpdGUgZGVjaXNpb25zIGhhdmUgYmVlbiByZXN0b3JlZCBcdTIwMTQgeW91IGNhbiBzdGlsbCBjaGFuZ2UgdGhlbS4nLCAnd2FybmluZycsIDYwMDApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9IGNhdGNoIChfKSB7fVxuXG4gIC8vIENvbGQtcmVzdG9yZSBmYWxsYmFjazogc2VlZCBkZWNpc2lvbnMgZnJvbSBiYWNrZW5kIHJld3JpdGVfYXVkaXQgd2hlblxuICAvLyBsb2NhbFN0b3JhZ2UgaGFzIG5vdGhpbmcgKGRpZmZlcmVudCBkZXZpY2UsIGluY29nbml0bywgY2xlYXJlZCBzdG9yYWdlKS5cbiAgaWYgKF9iYWNrZW5kUmV3cml0ZUF1ZGl0Lmxlbmd0aCA+IDApIHtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIF9iYWNrZW5kUmV3cml0ZUF1ZGl0KSB7XG4gICAgICBjb25zdCBpZCA9IGVudHJ5LmlkO1xuICAgICAgaWYgKCFpZCB8fCAhZW50cnkub3V0Y29tZSkgY29udGludWU7XG4gICAgICByZXdyaXRlRGVjaXNpb25zW2lkXSA9IHtcbiAgICAgICAgb3V0Y29tZTogZW50cnkub3V0Y29tZSxcbiAgICAgICAgZmluYWxfdGV4dDogZW50cnkub3V0Y29tZSA9PT0gJ2VkaXQnID8gKGVudHJ5LmZpbmFsID8/IG51bGwpIDogbnVsbCxcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChPYmplY3Qua2V5cyhyZXdyaXRlRGVjaXNpb25zKS5sZW5ndGggPiAwKSB7XG4gICAgICBzeW5jUmV3cml0ZUdsb2JhbHMoKTtcbiAgICAgIF9wZXJzaXN0RGVjaXNpb25zKCk7XG4gICAgICBpZiAoIWhhZERlY2lzaW9ucyAmJiAhX3Jlc3RvcmVUb2FzdFNob3duKSB7XG4gICAgICAgIF9yZXN0b3JlVG9hc3RTaG93biA9IHRydWU7XG4gICAgICAgIGlmICh0eXBlb2Ygc2hvd1RvYXN0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgc2hvd1RvYXN0KCdZb3VyIHByZXZpb3VzIHJld3JpdGUgZGVjaXNpb25zIGhhdmUgYmVlbiByZXN0b3JlZCBcdTIwMTQgeW91IGNhbiBzdGlsbCBjaGFuZ2UgdGhlbS4nLCAnd2FybmluZycsIDYwMDApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIF9jbGVhclBlcnNpc3RlZERlY2lzaW9ucygpIHtcbiAgY29uc3Qga2V5ID0gX2RlY2lzaW9uc0tleSgpO1xuICBpZiAoIWtleSkgcmV0dXJuO1xuICB0cnkgeyBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpOyB9IGNhdGNoIChfKSB7fVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgUmV3cml0ZSBzbmFwc2hvdCAoY2hhbmdlZC1pdGVtIGhpZ2hsaWdodGluZykgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5mdW5jdGlvbiBfc25hcHNob3RLZXkoKSB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2lkID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKS5nZXQoJ3Nlc3Npb24nKTtcbiAgICByZXR1cm4gc2lkID8gYHJ3X3NuYXBzaG90XyR7c2lkfWAgOiBudWxsO1xuICB9IGNhdGNoIChfKSB7IHJldHVybiBudWxsOyB9XG59XG5cbmZ1bmN0aW9uIF9zYXZlUmV3cml0ZVNuYXBzaG90KHJld3JpdGVzKSB7XG4gIGNvbnN0IGtleSA9IF9zbmFwc2hvdEtleSgpO1xuICBpZiAoIWtleSkgcmV0dXJuO1xuICBjb25zdCBtYXAgPSB7fTtcbiAgZm9yIChjb25zdCByIG9mIHJld3JpdGVzKSB7XG4gICAgY29uc3QgY2FyZElkID0gU3RyaW5nKHIuaWQpLnJlcGxhY2UoL1teYS16QS1aMC05Xy1dL2csICdfJyk7XG4gICAgbWFwW2NhcmRJZF0gPSByLnByb3Bvc2VkIHx8ICcnO1xuICB9XG4gIHRyeSB7IGxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgSlNPTi5zdHJpbmdpZnkobWFwKSk7IH0gY2F0Y2ggKF8pIHt9XG59XG5cbmZ1bmN0aW9uIF9nZXRSZXdyaXRlU25hcHNob3QoKSB7XG4gIGNvbnN0IGtleSA9IF9zbmFwc2hvdEtleSgpO1xuICBpZiAoIWtleSkgcmV0dXJuIG51bGw7XG4gIHRyeSB7IHJldHVybiBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSkgfHwgJ251bGwnKTsgfSBjYXRjaCAoXykgeyByZXR1cm4gbnVsbDsgfVxufVxuXG5mdW5jdGlvbiBfY2xlYXJSZXdyaXRlU25hcHNob3QoKSB7XG4gIGNvbnN0IGtleSA9IF9zbmFwc2hvdEtleSgpO1xuICBpZiAoIWtleSkgcmV0dXJuO1xuICB0cnkgeyBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpOyB9IGNhdGNoIChfKSB7fVxufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaEFuZFJldmlld1Jld3JpdGVzKCkge1xuICBjb25zdCBsb2FkaW5nTXNnID0gYXBwZW5kTG9hZGluZ01lc3NhZ2UoJ0NoZWNraW5nIGZvciB0ZXh0IGltcHJvdmVtZW50cy4uLicpO1xuICBzZXRMb2FkaW5nKHRydWUsICdSZXZpZXdpbmcgcmV3cml0ZXNcdTIwMjYnKTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9yZXdyaXRlcycpO1xuICAgIGNvbnN0IGRhdGEgPSBwYXJzZVJld3JpdGVzUmVzcG9uc2UoYXdhaXQgcmVzLmpzb24oKSk7XG4gICAgcmVtb3ZlTG9hZGluZ01lc3NhZ2UobG9hZGluZ01zZyk7XG4gICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgaWYgKCFyZXMub2spIHtcbiAgICAgIGFwcGVuZFJldHJ5TWVzc2FnZSgnXHUyNzRDIEVycm9yIGNoZWNraW5nIHJld3JpdGVzOiAnICsgKGRhdGEuZXJyb3IgfHwgJ1Vua25vd24gZXJyb3InKSwgZmV0Y2hBbmRSZXZpZXdSZXdyaXRlcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJld3JpdGVzID0gZGF0YS5yZXdyaXRlcyB8fCBbXTtcbiAgICBjb25zdCB3YXJuaW5ncyA9IGRhdGEucGVyc3Vhc2lvbl93YXJuaW5ncyB8fCBbXTsgIC8vIFBoYXNlIDEwXG4gICAgX2JhY2tlbmRSZXdyaXRlQXVkaXQgPSBkYXRhLnJld3JpdGVfYXVkaXQgfHwgW107XG5cbiAgICAvLyBTaG93IHBlcnN1YXNpb24gd2FybmluZ3MgZmlyc3QgKFBoYXNlIDEwKVxuICAgIHBlcnN1YXNpb25XYXJuaW5nc0Fja25vd2xlZGdlZCA9IHdhcm5pbmdzLmxlbmd0aCA9PT0gMDsgIC8vIE1hcmsgYWNrbm93bGVkZ2VkIGlmIG5vIHdhcm5pbmdzXG4gICAgaWYgKHdhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG1zZyA9IGBcdTI2QTBcdUZFMEYgKioke3dhcm5pbmdzLmxlbmd0aH0qKiBwZXJzdWFzaW9uIGNoZWNrJHt3YXJuaW5ncy5sZW5ndGggPiAxID8gJ3MnIDogJyd9IGZsYWdnZWQuIFJldmlldyB0aGVzZSBiZWZvcmUgc3VibWl0dGluZy5gO1xuICAgICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgbXNnKTtcbiAgICB9XG5cbiAgICAvLyBTaG93IHJld3JpdGUgcmV2aWV3IHBhbmVsXG4gICAgcmV3cml0ZURlY2lzaW9ucyA9IHt9O1xuICAgIHN5bmNSZXdyaXRlR2xvYmFscygpO1xuICAgIHJlbmRlclJld3JpdGVQYW5lbChyZXdyaXRlcywgd2FybmluZ3MpOyAgLy8gUGFzcyB3YXJuaW5ncyB0byBwYW5lbFxuICAgIHN3aXRjaFRhYigncmV3cml0ZScpO1xuICAgIGNvbnN0IG4gPSByZXdyaXRlcy5sZW5ndGg7XG4gICAgaWYgKG4gPT09IDApIHtcbiAgICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsICdcdTI3MEZcdUZFMEYgTm8gcmV3cml0ZSBzdWdnZXN0aW9ucyB3ZXJlIG5lZWRlZCBcdTIwMTQgeW91ciBzZWxlY3RlZCBjb250ZW50IGFscmVhZHkgdXNlcyB0aGUgam9iXFwncyB0ZXJtaW5vbG9neSB3ZWxsLiBUaGUgKipSZXdyaXRlcyoqIHRhYiBpcyBzdGlsbCBhdmFpbGFibGUgc28geW91IGNhbiBjb25maXJtIGFuZCBjb250aW51ZSB0byAqKlNwZWxsIENoZWNrKiogd2hlbiByZWFkeS4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgYFx1MjcwRlx1RkUwRiBZb3UndmUgY29uZmlybWVkIHlvdXIgZXhwZXJpZW5jZSwgc2tpbGwsIGFuZCBhY2hpZXZlbWVudCBzZWxlY3Rpb25zLiBIZXJlIGFyZSB0aGUgQUkncyAqKiR7bn0qKiB0ZXh0IGltcHJvdmVtZW50IHN1Z2dlc3Rpb24ke24gPiAxID8gJ3MnIDogJyd9IGZvciB0aGUgaW5jbHVkZWQgYnVsbGV0cyBcdTIwMTQgZWFjaCBvbmUgaW50cm9kdWNlcyBqb2ItcmVsZXZhbnQga2V5d29yZHMgd2hpbGUgcHJlc2VydmluZyB5b3VyIGZhY3RzLiBSZXZpZXcgZWFjaCBzdWdnZXN0aW9uIGluIHRoZSAqKlJld3JpdGVzKiogdGFiLCB0aGVuIGFjY2VwdCwgZWRpdCwgb3IgcmVqZWN0IGJlZm9yZSBjb250aW51aW5nIHRvIHNwZWxsIGNoZWNrLmApO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmVtb3ZlTG9hZGluZ01lc3NhZ2UobG9hZGluZ01zZyk7XG4gICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgYXBwZW5kUmV0cnlNZXNzYWdlKCdcdTI3NEMgRXJyb3I6ICcgKyBlcnIubWVzc2FnZSwgZmV0Y2hBbmRSZXZpZXdSZXdyaXRlcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX3JlbmRlclJld3JpdGVBdWRpdExvZygpIHtcbiAgaWYgKCFfYmFja2VuZFJld3JpdGVBdWRpdCB8fCBfYmFja2VuZFJld3JpdGVBdWRpdC5sZW5ndGggPT09IDApIHJldHVybiAnJztcblxuICBjb25zdCBPVVRDT01FX0lDT04gPSB7IGFjY2VwdDogJ1x1MjcwNScsIHJlamVjdDogJ1x1Mjc0QycsIGVkaXQ6ICdcdTI3MEZcdUZFMEYnIH07XG4gIGNvbnN0IE9VVENPTUVfTEFCRUwgPSB7IGFjY2VwdDogJ0FjY2VwdGVkJywgcmVqZWN0OiAnUmVqZWN0ZWQnLCBlZGl0OiAnRWRpdGVkJyB9O1xuXG4gIGNvbnN0IHJvd3MgPSBfYmFja2VuZFJld3JpdGVBdWRpdC5tYXAoZW50cnkgPT4ge1xuICAgIGNvbnN0IGljb24gID0gT1VUQ09NRV9JQ09OW2VudHJ5Lm91dGNvbWVdIHx8ICdcdTI3NTMnO1xuICAgIGNvbnN0IGxhYmVsID0gT1VUQ09NRV9MQUJFTFtlbnRyeS5vdXRjb21lXSB8fCBlbnRyeS5vdXRjb21lO1xuICAgIGNvbnN0IGxvYyAgID0gZXNjYXBlSHRtbChlbnRyeS5sb2NhdGlvbiB8fCBlbnRyeS5maWVsZCB8fCAnJyk7XG4gICAgY29uc3Qgb3JpZyAgPSBlc2NhcGVIdG1sKGVudHJ5Lm9yaWdpbmFsIHx8ICcnKTtcbiAgICBjb25zdCBwcm9wICA9IGVzY2FwZUh0bWwoZW50cnkucHJvcG9zZWQgfHwgJycpO1xuICAgIGNvbnN0IGZpbiAgID0gZW50cnkub3V0Y29tZSA9PT0gJ2VkaXQnICYmIGVudHJ5LmZpbmFsXG4gICAgICA/IGA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDo0cHg7Y29sb3I6IzFkNGVkODtmb250LXNpemU6MC44NWVtO1wiPkZpbmFsOiAke2VzY2FwZUh0bWwoZW50cnkuZmluYWwpfTwvZGl2PmBcbiAgICAgIDogJyc7XG4gICAgcmV0dXJuIGBcbiAgICAgIDxkaXYgc3R5bGU9XCJib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZTJlOGYwO3BhZGRpbmc6OHB4IDA7Zm9udC1zaXplOjAuODhlbTtcIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjZweDttYXJnaW4tYm90dG9tOjRweDtcIj5cbiAgICAgICAgICA8c3BhbiB0aXRsZT1cIiR7bGFiZWx9XCI+JHtpY29ufTwvc3Bhbj5cbiAgICAgICAgICA8c3Ryb25nIHN0eWxlPVwiY29sb3I6IzM3NDE1MTtcIj4ke2xhYmVsfTwvc3Ryb25nPlxuICAgICAgICAgICR7bG9jID8gYDxzcGFuIHN0eWxlPVwiY29sb3I6IzljYTNhZjtmb250LXNpemU6MC44NWVtO1wiPlx1MjAxNCAke2xvY308L3NwYW4+YCA6ICcnfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImNvbG9yOiM2YjcyODA7dGV4dC1kZWNvcmF0aW9uOmxpbmUtdGhyb3VnaDtmb250LXNpemU6MC44NWVtO1wiPiR7b3JpZ308L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImNvbG9yOiMzNzQxNTE7Zm9udC1zaXplOjAuODVlbTtcIj4ke3Byb3B9PC9kaXY+XG4gICAgICAgICR7ZmlufVxuICAgICAgPC9kaXY+YDtcbiAgfSkuam9pbignJyk7XG5cbiAgcmV0dXJuIGBcbiAgICA8ZGV0YWlscyBzdHlsZT1cIm1hcmdpbi10b3A6MjRweDtib3JkZXI6MXB4IHNvbGlkICNlMmU4ZjA7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzoxMnB4IDE2cHg7XCI+XG4gICAgICA8c3VtbWFyeSBzdHlsZT1cImN1cnNvcjpwb2ludGVyO2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjojMzc0MTUxO2xpc3Qtc3R5bGU6bm9uZTtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDo4cHg7XCI+XG4gICAgICAgIDxzcGFuPlx1RDgzRFx1RENDQjwvc3Bhbj5cbiAgICAgICAgPHNwYW4+UmV3cml0ZSBBdWRpdCBMb2cgKCR7X2JhY2tlbmRSZXdyaXRlQXVkaXQubGVuZ3RofSBkZWNpc2lvbiR7X2JhY2tlbmRSZXdyaXRlQXVkaXQubGVuZ3RoID09PSAxID8gJycgOiAncyd9KTwvc3Bhbj5cbiAgICAgICAgPHNwYW4gc3R5bGU9XCJtYXJnaW4tbGVmdDphdXRvO2NvbG9yOiM5Y2EzYWY7Zm9udC1zaXplOjAuODVlbTtcIj5cdTI1QkMgc2hvdzwvc3Bhbj5cbiAgICAgIDwvc3VtbWFyeT5cbiAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOjEycHg7XCI+JHtyb3dzfTwvZGl2PlxuICAgIDwvZGV0YWlscz5gO1xufVxuXG5mdW5jdGlvbiByZW5kZXJSZXdyaXRlUGFuZWwocmV3cml0ZXMsIHdhcm5pbmdzID0gW10pIHtcbiAgX3Jld3JpdGVQYW5lbENhY2hlID0geyByZXdyaXRlcywgd2FybmluZ3MgfTtcbiAgLy8gQnVpbGQgcGVyLWNhcmQgd2FybmluZyBpbmRleCBmb3IgUGF0aCAxIGJhZGdlc1xuICBfd2FybmluZ3NCeVJld3JpdGVJZCA9IHt9O1xuICBmb3IgKGNvbnN0IHcgb2Ygd2FybmluZ3MpIHtcbiAgICBpZiAoIV93YXJuaW5nc0J5UmV3cml0ZUlkW3cuaWRdKSBfd2FybmluZ3NCeVJld3JpdGVJZFt3LmlkXSA9IFtdO1xuICAgIF93YXJuaW5nc0J5UmV3cml0ZUlkW3cuaWRdLnB1c2godyk7XG4gIH1cbiAgc3luY1Jld3JpdGVHbG9iYWxzKCk7XG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9jdW1lbnQtY29udGVudCcpO1xuICBjb25zdCBoYXNSZXdyaXRlcyA9IHJld3JpdGVzLmxlbmd0aCA+IDA7XG5cbiAgLy8gQnVpbGQgcGVyc3Vhc2lvbiB3YXJuaW5ncyBzZWN0aW9uIChQaGFzZSAxMClcbiAgbGV0IHdhcm5pbmdzSHRtbCA9ICcnO1xuICBpZiAod2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IHdhcm5pbmdzQnlUeXBlID0ge307XG4gICAgd2FybmluZ3MuZm9yRWFjaCh3ID0+IHtcbiAgICAgIGlmICghd2FybmluZ3NCeVR5cGVbdy5mbGFnX3R5cGVdKSB3YXJuaW5nc0J5VHlwZVt3LmZsYWdfdHlwZV0gPSAwO1xuICAgICAgd2FybmluZ3NCeVR5cGVbdy5mbGFnX3R5cGVdKys7XG4gICAgfSk7XG4gICAgY29uc3Qgd2FybmluZ0NvdW50cyA9IE9iamVjdC5lbnRyaWVzKHdhcm5pbmdzQnlUeXBlKVxuICAgICAgLm1hcCgoW3R5cGUsIGNvdW50XSkgPT4gYCR7Y291bnR9ICR7dHlwZS5yZXBsYWNlKC9fL2csICcgJyl9YClcbiAgICAgIC5qb2luKCcsICcpO1xuXG4gICAgd2FybmluZ3NIdG1sID0gYFxuICAgICAgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2ZlZjJmMjtib3JkZXI6MXB4IHNvbGlkICNmZWNhY2E7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzoxNHB4O21hcmdpbi1ib3R0b206MjBweDtcIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjEwcHg7bWFyZ2luLWJvdHRvbToxMHB4O2N1cnNvcjpwb2ludGVyO1wiIG9uY2xpY2s9XCJ0aGlzLnBhcmVudEVsZW1lbnQucXVlcnlTZWxlY3RvcignI3dhcm5pbmdzLWRldGFpbCcpLnN0eWxlLmRpc3BsYXkgPSB0aGlzLnBhcmVudEVsZW1lbnQucXVlcnlTZWxlY3RvcignI3dhcm5pbmdzLWRldGFpbCcpLnN0eWxlLmRpc3BsYXkgPT09ICdub25lJyA/ICdibG9jaycgOiAnbm9uZSc7XCI+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MjBweDtcIj5cdTI2QTBcdUZFMEY8L3NwYW4+XG4gICAgICAgICAgPHN0cm9uZyBzdHlsZT1cImNvbG9yOiM5OTFiMWI7XCI+UGVyc3Vhc2lvbiBjaGVja3M6ICR7d2FybmluZ0NvdW50c308L3N0cm9uZz5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cIm1hcmdpbi1sZWZ0OmF1dG87Y29sb3I6IzdmMWQxZDtcIj5cdTI1QkM8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwid2FybmluZ3MtZGV0YWlsXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7bWFyZ2luLXRvcDoxMHB4O3BhZGRpbmctdG9wOjEwcHg7Ym9yZGVyLXRvcDoxcHggc29saWQgI2ZlY2FjYTtcIj5cbiAgICAgICAgICAke3dhcm5pbmdzLm1hcCh3ID0+IGBcbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nOjhweDttYXJnaW4tYm90dG9tOjhweDtiYWNrZ3JvdW5kOiNmZmY3ZWQ7Ym9yZGVyLWxlZnQ6M3B4IHNvbGlkICNmOTczMTY7Ym9yZGVyLXJhZGl1czo0cHg7Zm9udC1zaXplOjAuOWVtO1wiPlxuICAgICAgICAgICAgICA8c3Ryb25nPiR7dy5mbGFnX3R5cGUucmVwbGFjZSgvXy9nLCAnICcpfTwvc3Ryb25nPiBhdCAke3cubG9jYXRpb259PGJyPlxuICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiM3YzJkMTI7XCI+JHt3LmRldGFpbHN9PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgYCkuam9pbignJyl9XG4gICAgICAgICAgPGJ1dHRvbiBzdHlsZT1cIm1hcmdpbi10b3A6MTBweDtwYWRkaW5nOjhweCAxMnB4O2JhY2tncm91bmQ6Izk5MWIxYjtjb2xvcjp3aGl0ZTtib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjRweDtjdXJzb3I6cG9pbnRlcjtcIiBvbmNsaWNrPVwic2V0UGVyc3Vhc2lvbldhcm5pbmdzQWNrbm93bGVkZ2VkKHRydWUpOyB0aGlzLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAuNic7IHVwZGF0ZVJld3JpdGVUYWxseSgpO1wiPlxuICAgICAgICAgICAgXHUyNzEzIEFja25vd2xlZGdlZFxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIGA7XG4gIH1cblxuICAvLyBDb21wdXRlIHBlci1jYXJkIGNoYW5nZSBzdGF0dXMgcmVsYXRpdmUgdG8gcHJldmlvdXMgcmVuZGVyJ3Mgc25hcHNob3QuXG4gIGNvbnN0IHByZXZTbmFwc2hvdCA9IF9nZXRSZXdyaXRlU25hcHNob3QoKTtcbiAgY29uc3QgY2hhbmdlU3RhdHVzTWFwID0ge307XG4gIGlmIChwcmV2U25hcHNob3QpIHtcbiAgICBmb3IgKGNvbnN0IHIgb2YgcmV3cml0ZXMpIHtcbiAgICAgIGNvbnN0IGNhcmRJZCA9IFN0cmluZyhyLmlkKS5yZXBsYWNlKC9bXmEtekEtWjAtOV8tXS9nLCAnXycpO1xuICAgICAgaWYgKCEoY2FyZElkIGluIHByZXZTbmFwc2hvdCkpIHtcbiAgICAgICAgY2hhbmdlU3RhdHVzTWFwW2NhcmRJZF0gPSAnbmV3JztcbiAgICAgIH0gZWxzZSBpZiAocHJldlNuYXBzaG90W2NhcmRJZF0gIT09IChyLnByb3Bvc2VkIHx8ICcnKSkge1xuICAgICAgICBjaGFuZ2VTdGF0dXNNYXBbY2FyZElkXSA9ICd1cGRhdGVkJztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLy8gU2F2ZSBjdXJyZW50IHJld3JpdGVzIGFzIHNuYXBzaG90IGZvciBuZXh0IHJlbmRlciBjb21wYXJpc29uLlxuICBfc2F2ZVJld3JpdGVTbmFwc2hvdChyZXdyaXRlcyk7XG5cbiAgY29udGVudC5pbm5lckhUTUwgPSB3YXJuaW5nc0h0bWwgKyBgXG4gICAgPGRpdiBpZD1cInJld3JpdGUtcGFuZWxcIj5cbiAgICAgIDxoMT5cdTI3MEZcdUZFMEYgUmV2aWV3IFRleHQgSW1wcm92ZW1lbnRzPC9oMT5cbiAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDttYXJnaW4tYm90dG9tOjIwcHg7XCI+XG4gICAgICAgICR7aGFzUmV3cml0ZXNcbiAgICA/ICdSZXZpZXcgZWFjaCBzdWdnZXN0ZWQgdGV4dCBpbXByb3ZlbWVudC4gQWNjZXB0LCBlZGl0LCBvciByZWplY3QgYWxsIHN1Z2dlc3Rpb25zIGJlZm9yZSBwcm9jZWVkaW5nIHRvIHNwZWxsIGNoZWNrLidcbiAgICA6ICdObyB0ZXh0IGltcHJvdmVtZW50cyB3ZXJlIHN1Z2dlc3RlZCBmb3IgdGhpcyBDVi4gQ29udGludWUgd2hlbiB5b3UgYXJlIHJlYWR5IHRvIG1vdmUgdG8gc3BlbGwgY2hlY2suJ31cbiAgICAgIDwvcD5cbiAgICAgIDxkaXYgY2xhc3M9XCJyZXdyaXRlLXRhbGx5LWJhclwiIGlkPVwicmV3cml0ZS10YWxseVwiICR7aGFzUmV3cml0ZXMgPyAnJyA6ICdzdHlsZT1cImRpc3BsYXk6bm9uZVwiJ30+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidGFsbHktYWNjZXB0ZWRcIj5cdTI3MTMgQWNjZXB0ZWQ6IDxzdHJvbmcgaWQ9XCJ0YWxseS1hY2NlcHRlZFwiPjA8L3N0cm9uZz48L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidGFsbHktcmVqZWN0ZWRcIj5cdTI3MTcgUmVqZWN0ZWQ6IDxzdHJvbmcgaWQ9XCJ0YWxseS1yZWplY3RlZFwiPjA8L3N0cm9uZz48L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidGFsbHktcGVuZGluZ1wiPlx1MjNGMyBQZW5kaW5nOiA8c3Ryb25nIGlkPVwidGFsbHktcGVuZGluZ1wiPiR7cmV3cml0ZXMubGVuZ3RofTwvc3Ryb25nPjwvc3Bhbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInJ3LWJ1bGstYnRuXCIgb25jbGljaz1cImFjY2VwdEFsbFJld3JpdGVzKClcIiB0aXRsZT1cIkFjY2VwdCBhbGwgcGVuZGluZyBzdWdnZXN0aW9uc1wiPlx1MjcxMyBBY2NlcHQgQWxsPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJydy1idWxrLWJ0biBydy1idWxrLXJlamVjdFwiIG9uY2xpY2s9XCJyZWplY3RBbGxSZXdyaXRlcygpXCIgdGl0bGU9XCJSZWplY3QgYWxsIHBlbmRpbmcgc3VnZ2VzdGlvbnNcIj5cdTI3MTcgUmVqZWN0IEFsbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwicnctY29tcGFjdC10b2dnbGVcIiBpZD1cInJ3LWNvbXBhY3QtYnRuXCIgb25jbGljaz1cInRvZ2dsZVJld3JpdGVDb21wYWN0TW9kZSgpXCIgdGl0bGU9XCJTd2l0Y2ggdG8gY29tcGFjdCBzaW5nbGUtbGluZSB2aWV3IGZvciByYXBpZCByZXZpZXdcIj5cdTIyOUUgQ29tcGFjdDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwic3VibWl0LXJld3JpdGVzLWJ0blwiIGlkPVwic3VibWl0LXJld3JpdGVzLWJ0blwiIGRpc2FibGVkXG4gICAgICAgICAgICAgICAgb25jbGljaz1cInN1Ym1pdFJld3JpdGVEZWNpc2lvbnMoKVwiPlN1Ym1pdCBBbGwgRGVjaXNpb25zPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgaWQ9XCJyZXdyaXRlLWNhcmRzXCI+XG4gICAgICAgICR7aGFzUmV3cml0ZXNcbiAgICA/IHJld3JpdGVzLm1hcChyID0+IHtcbiAgICAgICAgY29uc3QgY2FyZElkID0gU3RyaW5nKHIuaWQpLnJlcGxhY2UoL1teYS16QS1aMC05Xy1dL2csICdfJyk7XG4gICAgICAgIHJldHVybiByZW5kZXJSZXdyaXRlQ2FyZChyLCBfd2FybmluZ3NCeVJld3JpdGVJZFtyLmlkXSB8fCBbXSwgY2hhbmdlU3RhdHVzTWFwW2NhcmRJZF0gfHwgbnVsbCk7XG4gICAgICB9KS5qb2luKCcnKVxuICAgIDogYFxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJlbXB0eS1zdGF0ZVwiIHN0eWxlPVwibWFyZ2luLXRvcDoyNHB4O1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImljb25cIj5cdTI3MEZcdUZFMEY8L2Rpdj5cbiAgICAgICAgICAgIDxoMz5ObyBSZXdyaXRlIFN1Z2dlc3Rpb25zPC9oMz5cbiAgICAgICAgICAgIDxwPlRoaXMgZHJhZnQgYWxyZWFkeSBwYXNzZXMgdGhlIHJld3JpdGUgc3RhZ2Ugd2l0aG91dCBzdWdnZXN0ZWQgd29yZGluZyBjaGFuZ2VzLjwvcD5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzdWJtaXQtYnRuXCIgaWQ9XCJzdWJtaXQtcmV3cml0ZXMtYnRuXCIgb25jbGljaz1cInN1Ym1pdFJld3JpdGVEZWNpc2lvbnMoKVwiPkNvbnRpbnVlIHRvIFNwZWxsIENoZWNrPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIGB9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICAke19yZW5kZXJSZXdyaXRlQXVkaXRMb2coKX1cbiAgYDtcblxuICAvLyBSZXN0b3JlIGRlY2lzaW9ucyBwZXJzaXN0ZWQgZnJvbSBhIHByZXZpb3VzIHBhZ2UgbG9hZCAoR0FQLTE2NikuXG4gIF9yZXN0b3JlRGVjaXNpb25zKCk7XG4gIC8vIFJlLWFwcGx5IGFueSBkZWNpc2lvbnMgbWFkZSBiZWZvcmUgdGhlIGxhc3QgdGFiIG5hdmlnYXRpb24uXG4gIGlmIChPYmplY3Qua2V5cyhyZXdyaXRlRGVjaXNpb25zKS5sZW5ndGggPiAwKSB7XG4gICAgZm9yIChjb25zdCBbaWQsIGRlY10gb2YgT2JqZWN0LmVudHJpZXMocmV3cml0ZURlY2lzaW9ucykpIHtcbiAgICAgIGlmICghZGVjIHx8ICFkZWMub3V0Y29tZSkgY29udGludWU7XG4gICAgICBpZiAoZGVjLm91dGNvbWUgPT09ICdlZGl0JyAmJiBkZWMuZmluYWxfdGV4dCAhPSBudWxsKSB7XG4gICAgICAgIC8vIEVudGVyIGVkaXQgbW9kZSwgaW5qZWN0IHRoZSBzYXZlZCB0ZXh0LCB0aGVuIHNhdmUgc28gdGhlIGNhcmRcbiAgICAgICAgLy8gc2hvd3MgYXMgYWNjZXB0ZWQgd2l0aCB0aGUgY29ycmVjdCBkaWZmIHJlbmRlcmVkLlxuICAgICAgICBhcHBseVJld3JpdGVBY3Rpb24oaWQsICdlZGl0Jyk7XG4gICAgICAgIGNvbnN0IHRhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHJ3LXRleHRhcmVhLSR7aWR9YCk7XG4gICAgICAgIGlmICh0YSkge1xuICAgICAgICAgIHRhLnZhbHVlID0gZGVjLmZpbmFsX3RleHQ7XG4gICAgICAgICAgc2F2ZVJld3JpdGVFZGl0KGlkKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXBwbHlSZXdyaXRlQWN0aW9uKGlkLCBkZWMub3V0Y29tZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHVwZGF0ZVJld3JpdGVUYWxseSgpO1xuICB9XG59XG5cbi8qKlxuICogY29tcHV0ZVdvcmREaWZmKG9yaWdpbmFsLCBwcm9wb3NlZCkgXHUyMDE0IExDUyB3b3JkLWxldmVsIGRpZmYuXG4gKlxuICogVG9rZW5pc2VzIGJvdGggc3RyaW5ncyBieSBzcGxpdHRpbmcgb24gd2hpdGVzcGFjZSBib3VuZGFyaWVzIHdoaWxlXG4gKiBwcmVzZXJ2aW5nIHRoZSB3aGl0ZXNwYWNlIHRva2VucyBzbyB0aGUgcmVuZGVyZWQgZGlmZiBoYXMgdGhlIHNhbWVcbiAqIHNwYWNpbmcgYXMgdGhlIHNvdXJjZSB0ZXh0LiAgUmV0dXJucyBhbiBhcnJheSBvZlxuICoge3Rva2VuOiBzdHJpbmcsIHR5cGU6ICd1bmNoYW5nZWQnfCdyZW1vdmVkJ3wnYWRkZWQnfS5cbiAqL1xuZnVuY3Rpb24gY29tcHV0ZVdvcmREaWZmKG9yaWdpbmFsLCBwcm9wb3NlZCkge1xuICAvLyBTcGxpdCBvbiB3aGl0ZXNwYWNlIGJ1dCBrZWVwIHRoZSBzZXBhcmF0b3JzIGFzIHRva2Vucy5cbiAgZnVuY3Rpb24gdG9rZW5pemUoc3RyKSB7IHJldHVybiAoc3RyIHx8ICcnKS5zcGxpdCgvKFxccyspLyk7IH1cblxuICBjb25zdCBhID0gdG9rZW5pemUob3JpZ2luYWwpO1xuICBjb25zdCBiID0gdG9rZW5pemUocHJvcG9zZWQpO1xuICBjb25zdCBtID0gYS5sZW5ndGg7XG4gIGNvbnN0IG4gPSBiLmxlbmd0aDtcblxuICAvLyBCdWlsZCBMQ1MgRFAgdGFibGUgKE8obSpuKSBcdTIwMTQgYWNjZXB0YWJsZSBmb3IgQ1YgYnVsbGV0IGxlbmd0aHMpLlxuICBjb25zdCBkcCA9IEFycmF5LmZyb20oe2xlbmd0aDogbSArIDF9LCAoKSA9PiBuZXcgQXJyYXkobiArIDEpLmZpbGwoMCkpO1xuICBmb3IgKGxldCBpID0gMTsgaSA8PSBtOyBpKyspIHtcbiAgICBmb3IgKGxldCBqID0gMTsgaiA8PSBuOyBqKyspIHtcbiAgICAgIGRwW2ldW2pdID0gYVtpIC0gMV0gPT09IGJbaiAtIDFdXG4gICAgICAgID8gZHBbaSAtIDFdW2ogLSAxXSArIDFcbiAgICAgICAgOiBNYXRoLm1heChkcFtpIC0gMV1bal0sIGRwW2ldW2ogLSAxXSk7XG4gICAgfVxuICB9XG5cbiAgLy8gQmFja3RyYWNrIHRvIHByb2R1Y2UgdGhlIGRpZmYgc2VxdWVuY2UuXG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBsZXQgaSA9IG0sIGogPSBuO1xuICB3aGlsZSAoaSA+IDAgfHwgaiA+IDApIHtcbiAgICBpZiAoaSA+IDAgJiYgaiA+IDAgJiYgYVtpIC0gMV0gPT09IGJbaiAtIDFdKSB7XG4gICAgICByZXN1bHQudW5zaGlmdCh7dG9rZW46IGFbaSAtIDFdLCB0eXBlOiAndW5jaGFuZ2VkJ30pO1xuICAgICAgaS0tOyBqLS07XG4gICAgfSBlbHNlIGlmIChqID4gMCAmJiAoaSA9PT0gMCB8fCBkcFtpXVtqIC0gMV0gPj0gZHBbaSAtIDFdW2pdKSkge1xuICAgICAgcmVzdWx0LnVuc2hpZnQoe3Rva2VuOiBiW2ogLSAxXSwgdHlwZTogJ2FkZGVkJ30pO1xuICAgICAgai0tO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQudW5zaGlmdCh7dG9rZW46IGFbaSAtIDFdLCB0eXBlOiAncmVtb3ZlZCd9KTtcbiAgICAgIGktLTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqIFJlbmRlciBhIHt0b2tlbiwgdHlwZX0gZGlmZiBhcnJheSBpbnRvIGFuIEhUTUwgc3RyaW5nLiAqL1xuZnVuY3Rpb24gcmVuZGVyRGlmZkh0bWwodG9rZW5zKSB7XG4gIHJldHVybiB0b2tlbnMubWFwKHQgPT4ge1xuICAgIGlmICh0LnR5cGUgPT09ICdyZW1vdmVkJykgcmV0dXJuIGA8ZGVsIGNsYXNzPVwiZGlmZi1yZW1vdmVkXCI+JHtlc2NhcGVIdG1sKHQudG9rZW4pfTwvZGVsPmA7XG4gICAgaWYgKHQudHlwZSA9PT0gJ2FkZGVkJykgICByZXR1cm4gYDxpbnMgY2xhc3M9XCJkaWZmLWFkZGVkXCI+JHtlc2NhcGVIdG1sKHQudG9rZW4pfTwvaW5zPmA7XG4gICAgcmV0dXJuIGVzY2FwZUh0bWwodC50b2tlbik7XG4gIH0pLmpvaW4oJycpO1xufVxuXG5mdW5jdGlvbiByZW5kZXJSZXdyaXRlQ2FyZChyLCBjYXJkV2FybmluZ3MgPSBbXSwgY2hhbmdlU3RhdHVzID0gbnVsbCkge1xuICBjb25zdCBpc1dlYWtTa2lsbEFkZCA9IHIudHlwZSA9PT0gJ3NraWxsX2FkZCcgJiYgci5ldmlkZW5jZV9zdHJlbmd0aCA9PT0gJ3dlYWsnO1xuICBjb25zdCB3ZWFrQmFkZ2UgICAgID0gaXNXZWFrU2tpbGxBZGRcbiAgICA/IGA8c3BhbiBjbGFzcz1cIndlYWstYmFkZ2VcIj5cdTI2QTAgQ2FuZGlkYXRlIHRvIGNvbmZpcm08L3NwYW4+YFxuICAgIDogJyc7XG4gIGNvbnN0IGNoYW5nZUJhZGdlICAgPSBjaGFuZ2VTdGF0dXMgPT09ICduZXcnXG4gICAgPyBgPHNwYW4gY2xhc3M9XCJydy1jaGFuZ2UtYmFkZ2UgcnctY2hhbmdlLW5ld1wiIGFyaWEtbGFiZWw9XCJOZXcgc3VnZ2VzdGlvbiBub3QgaW4gcHJldmlvdXMgcnVuXCI+XHVEODNDXHVERDk1IE5ldzwvc3Bhbj5gXG4gICAgOiBjaGFuZ2VTdGF0dXMgPT09ICd1cGRhdGVkJ1xuICAgICAgPyBgPHNwYW4gY2xhc3M9XCJydy1jaGFuZ2UtYmFkZ2UgcnctY2hhbmdlLXVwZGF0ZWRcIiBhcmlhLWxhYmVsPVwiU3VnZ2VzdGlvbiBjaGFuZ2VkIHNpbmNlIHByZXZpb3VzIHJ1blwiPlx1MjFCQiBVcGRhdGVkPC9zcGFuPmBcbiAgICAgIDogJyc7XG4gIC8vIEtleXdvcmQgcGlsbHMgd2l0aCBwb3NpdGlvbi1iYXNlZCByYW5rIGJhZGdlICgjMSwgIzIsIFx1MjAyNilcbiAgY29uc3Qga2V5d29yZFBpbGxzICA9IChyLmtleXdvcmRzX2ludHJvZHVjZWQgfHwgW10pXG4gICAgLm1hcCgoaywgaWR4KSA9PiBgPHNwYW4gY2xhc3M9XCJyZXdyaXRlLWtleXdvcmRcIj48c3BhbiBjbGFzcz1cImt3LXJhbmtcIj4jJHtpZHggKyAxfTwvc3Bhbj4ke2VzY2FwZUh0bWwoayl9PC9zcGFuPmApXG4gICAgLmpvaW4oJycpO1xuICBjb25zdCB0eXBlTGFiZWwgPSAoci50eXBlIHx8ICdyZXdyaXRlJykucmVwbGFjZSgvXy9nLCAnICcpO1xuICAvLyBTYW5pdGl6ZSBJRDoga2VlcCBvbmx5IGFscGhhbnVtZXJpYywgdW5kZXJzY29yZSwgYW5kIGh5cGhlbiBzbyBpdCBpc1xuICAvLyBzYWZlIGFzIGJvdGggYW4gSFRNTCBhdHRyaWJ1dGUgdmFsdWUgYW5kIGEgSlMgc3RyaW5nIGxpdGVyYWwgaW4gb25jbGljay5cbiAgY29uc3QgY2FyZElkICAgID0gU3RyaW5nKHIuaWQpLnJlcGxhY2UoL1teYS16QS1aMC05Xy1dL2csICdfJyk7XG5cbiAgLy8gQ29tcHV0ZSB3b3JkLWxldmVsIGRpZmYgZm9yIHRoZSBpbmxpbmUgZGlzcGxheS5cbiAgY29uc3QgZGlmZlRva2VucyA9IGNvbXB1dGVXb3JkRGlmZihyLm9yaWdpbmFsIHx8ICcnLCByLnByb3Bvc2VkIHx8ICcnKTtcbiAgY29uc3QgZGlmZkh0bWwgICA9IHJlbmRlckRpZmZIdG1sKGRpZmZUb2tlbnMpO1xuXG4gIHJldHVybiBgXG4gICAgPGRpdiBjbGFzcz1cInJld3JpdGUtY2FyZFwiIGlkPVwicnctY2FyZC0ke2NhcmRJZH1cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJyZXdyaXRlLWNhcmQtaGVhZGVyXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwicmV3cml0ZS1jYXJkLXR5cGVcIj4ke2VzY2FwZUh0bWwodHlwZUxhYmVsKX08L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwicmV3cml0ZS1jYXJkLXRpdGxlXCI+JHtlc2NhcGVIdG1sKHIubG9jYXRpb24gfHwgci5pZCl9PC9zcGFuPlxuICAgICAgICAke3dlYWtCYWRnZX0ke2NoYW5nZUJhZGdlfVxuICAgICAgICA8c3BhbiBpZD1cInJ3LWRlY2lzaW9uLWJhZGdlLSR7Y2FyZElkfVwiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiIHN0eWxlPVwiZGlzcGxheTpub25lO2ZvbnQtc2l6ZTowLjc4ZW07Zm9udC13ZWlnaHQ6NjAwO3BhZGRpbmc6MXB4IDdweDtib3JkZXItcmFkaXVzOjlweDttYXJnaW4tbGVmdDphdXRvO1wiPjwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInJld3JpdGUtY2FyZC1ib2R5XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyZXdyaXRlLWlubGluZS1kaWZmXCIgaWQ9XCJydy1kaWZmLSR7Y2FyZElkfVwiXG4gICAgICAgICAgICAgZGF0YS1vcmlnaW5hbD1cIiR7ZXNjYXBlSHRtbChyLm9yaWdpbmFsIHx8ICcnKX1cIj4ke2RpZmZIdG1sfTwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicmV3cml0ZS1hZnRlclwiIGlkPVwicnctYWZ0ZXItJHtjYXJkSWR9XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmVcIj5cbiAgICAgICAgICA8c3BhbiBpZD1cInJ3LWFmdGVyLXRleHQtJHtjYXJkSWR9XCI+JHtlc2NhcGVIdG1sKHIucHJvcG9zZWQgfHwgJycpfTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgICR7a2V5d29yZFBpbGxzID8gYDxkaXYgY2xhc3M9XCJyZXdyaXRlLWtleXdvcmRzXCI+JHtrZXl3b3JkUGlsbHN9PC9kaXY+YCA6ICcnfVxuICAgICAgICAke3IucmF0aW9uYWxlID8gYFxuICAgICAgICA8ZGV0YWlscyBjbGFzcz1cInJld3JpdGUtcmF0aW9uYWxlXCI+XG4gICAgICAgICAgPHN1bW1hcnk+UmF0aW9uYWxlICZhbXA7IEV2aWRlbmNlPC9zdW1tYXJ5PlxuICAgICAgICAgIDxwIHN0eWxlPVwibWFyZ2luOjZweCAwIDA7XCI+JHtlc2NhcGVIdG1sKHIucmF0aW9uYWxlKX08L3A+XG4gICAgICAgICAgJHtyLmV2aWRlbmNlID8gYDxwIHN0eWxlPVwiY29sb3I6IzljYTNhZjtmb250LXNpemU6MC44NWVtO21hcmdpbjo0cHggMCAwO1wiPiR7ZXNjYXBlSHRtbChyLmV2aWRlbmNlKX08L3A+YCA6ICcnfVxuICAgICAgICA8L2RldGFpbHM+YCA6ICcnfVxuICAgICAgICAke2NhcmRXYXJuaW5ncy5sZW5ndGggPiAwID8gYFxuICAgICAgICA8ZGl2IGNsYXNzPVwicmV3cml0ZS1wZXJzdWFzaW9uLWJhZGdlc1wiPlxuICAgICAgICAgICR7Y2FyZFdhcm5pbmdzLm1hcCh3ID0+IGA8c3BhbiBjbGFzcz1cInBlcnN1YXNpb24tYmFkZ2UgcGVyc3Vhc2lvbi1iYWRnZS0tJHt3LnNldmVyaXR5fVwiIHRpdGxlPVwiJHtlc2NhcGVIdG1sKHcuZGV0YWlscyl9XCI+XHUyNkEwICR7ZXNjYXBlSHRtbCh3LmZsYWdfdHlwZS5yZXBsYWNlKC9fL2csICcgJykpfTwvc3Bhbj5gKS5qb2luKCcnKX1cbiAgICAgICAgPC9kaXY+YCA6ICcnfVxuICAgICAgICA8ZGl2IGNsYXNzPVwicmV3cml0ZS1hY3Rpb25zXCI+XG4gICAgICAgICAgPGEgY2xhc3M9XCJydy1iYWNrLWxpbmtcIiBocmVmPVwiI1wiIG9uY2xpY2s9XCJldmVudC5wcmV2ZW50RGVmYXVsdCgpOyBzd2l0Y2hUYWIoJ2N1c3RvbWl6YXRpb25zJylcIiB0aXRsZT1cIkdvIGJhY2sgdG8gQ3VzdG9taXNlIHRvIHJlY29uc2lkZXIgd2hldGhlciB0byBpbmNsdWRlIHRoaXMgY29udGVudFwiPlx1MjFBOSBSZWNvbnNpZGVyIGluY2x1c2lvbjwvYT5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicnctYnRuIGFjY2VwdFwiIGlkPVwicnctYWNjZXB0LSR7Y2FyZElkfVwiIGFyaWEtcHJlc3NlZD1cImZhbHNlXCIgb25jbGljaz1cImFwcGx5UmV3cml0ZUFjdGlvbignJHtjYXJkSWR9JywgJ2FjY2VwdCcpXCI+XHUyNzEzIEFjY2VwdDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJydy1idG4gZWRpdFwiICAgaWQ9XCJydy1lZGl0LSR7Y2FyZElkfVwiICAgYXJpYS1wcmVzc2VkPVwiZmFsc2VcIiBvbmNsaWNrPVwiYXBwbHlSZXdyaXRlQWN0aW9uKCcke2NhcmRJZH0nLCAnZWRpdCcpXCI+XHUyNzBFIEVkaXQ8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicnctYnRuIHJlamVjdFwiIGlkPVwicnctcmVqZWN0LSR7Y2FyZElkfVwiIGFyaWEtcHJlc3NlZD1cImZhbHNlXCIgb25jbGljaz1cImFwcGx5UmV3cml0ZUFjdGlvbignJHtjYXJkSWR9JywgJ3JlamVjdCcpXCI+XHUyNzE3IFJlamVjdDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PmA7XG59XG5cbmZ1bmN0aW9uIGFwcGx5UmV3cml0ZUFjdGlvbihpZCwgb3V0Y29tZSkge1xuICBjb25zdCBjYXJkICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHJ3LWNhcmQtJHtpZH1gKTtcbiAgY29uc3QgYWZ0ZXJFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBydy1hZnRlci0ke2lkfWApO1xuICBjb25zdCBkaWZmRWwgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHJ3LWRpZmYtJHtpZH1gKTtcbiAgaWYgKCFjYXJkIHx8ICFhZnRlckVsKSByZXR1cm47XG5cbiAgLy8gQ2xlYXIgYW55IHByZXZpb3VzIG91dGNvbWUgc3R5bGluZ1xuICBjYXJkLmNsYXNzTGlzdC5yZW1vdmUoJ2FjY2VwdGVkJywgJ3JlamVjdGVkJyk7XG4gIFsnYWNjZXB0JywgJ2VkaXQnLCAncmVqZWN0J10uZm9yRWFjaChhID0+IHtcbiAgICBjb25zdCBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcnctJHthfS0ke2lkfWApO1xuICAgIGJ0bj8uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gICAgaWYgKGJ0bikgYnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJywgJ2ZhbHNlJyk7XG4gIH0pO1xuICBjb25zdCBfZGVjaXNpb25CYWRnZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBydy1kZWNpc2lvbi1iYWRnZS0ke2lkfWApO1xuICBpZiAoX2RlY2lzaW9uQmFkZ2UpIF9kZWNpc2lvbkJhZGdlLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgaWYgKG91dGNvbWUgPT09ICdlZGl0Jykge1xuICAgIC8vIEtlZXAgdGhlIGlubGluZSBkaWZmIHZpc2libGUgYXMgYSByZWZlcmVuY2U7IHNob3cgdGhlIGVkaXRhYmxlIHRleHRhcmVhIGJlbG93IGl0LlxuICAgIGNvbnN0IGN1cnJlbnRUZXh0ID0gYWZ0ZXJFbC5xdWVyeVNlbGVjdG9yKGAjcnctYWZ0ZXItdGV4dC0ke2lkfWApPy50ZXh0Q29udGVudFxuICAgICAgICAgICAgICAgICAgICAgPz8gcmV3cml0ZURlY2lzaW9uc1tpZF0/LmZpbmFsX3RleHRcbiAgICAgICAgICAgICAgICAgICAgID8/ICcnO1xuICAgIGlmIChkaWZmRWwpIHtcbiAgICAgIGRpZmZFbC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICBkaWZmRWwuc3R5bGUub3BhY2l0eSA9ICcwLjU1JztcbiAgICAgIGRpZmZFbC5zdHlsZS5ib3JkZXJMZWZ0ID0gJzNweCBzb2xpZCAjOTNjNWZkJztcbiAgICB9XG4gICAgYWZ0ZXJFbC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICBhZnRlckVsLmlubmVySFRNTCA9IGBcbiAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC43OGVtO2NvbG9yOiM2YjcyODA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+XHUyNzBFIFlvdXIgZWRpdCAoQUkgc3VnZ2VzdGlvbiBzaG93biBhYm92ZSBmb3IgcmVmZXJlbmNlKTo8L2Rpdj5cbiAgICAgIDx0ZXh0YXJlYSBpZD1cInJ3LXRleHRhcmVhLSR7aWR9XCI+JHtlc2NhcGVIdG1sKGN1cnJlbnRUZXh0KX08L3RleHRhcmVhPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cInJ3LXNhdmUtZWRpdC1idG5cIiBzdHlsZT1cIm1hcmdpbi10b3A6NnB4XCJcbiAgICAgICAgICAgICAgb25jbGljaz1cInNhdmVSZXdyaXRlRWRpdCgnJHtpZH0nKVwiPlNhdmU8L2J1dHRvbj5cbiAgICBgO1xuICAgIGNvbnN0IGVkaXRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcnctZWRpdC0ke2lkfWApO1xuICAgIGVkaXRCdG4/LmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgIGlmIChlZGl0QnRuKSBlZGl0QnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJywgJ3RydWUnKTtcbiAgICAvLyBEZWNpc2lvbiBpcyByZWNvcmRlZCBvbmx5IHdoZW4gdGhlIHVzZXIgY2xpY2tzIFNhdmVcbiAgfSBlbHNlIHtcbiAgICAvLyBSZXN0b3JlIHRoZSBhZnRlci10ZXh0IHNwYW4gaWYgd2UgcHJldmlvdXNseSBlbnRlcmVkIGVkaXQgbW9kZVxuICAgIGNvbnN0IHRleHRhcmVhID0gYWZ0ZXJFbC5xdWVyeVNlbGVjdG9yKCd0ZXh0YXJlYScpO1xuICAgIGlmICh0ZXh0YXJlYSkge1xuICAgICAgY29uc3QgdHh0ID0gdGV4dGFyZWEudmFsdWU7XG4gICAgICBhZnRlckVsLmlubmVySFRNTCA9IGA8c3BhbiBpZD1cInJ3LWFmdGVyLXRleHQtJHtpZH1cIj4ke2VzY2FwZUh0bWwodHh0KX08L3NwYW4+YDtcbiAgICB9XG4gICAgLy8gUmUtc2hvdyB0aGUgaW5saW5lIGRpZmYgcGFuZWwgYXQgZnVsbCBvcGFjaXR5OyBoaWRlIHRoZSBlZGl0IGFyZWEuXG4gICAgaWYgKGRpZmZFbCkgeyBkaWZmRWwuc3R5bGUuZGlzcGxheSA9ICcnOyBkaWZmRWwuc3R5bGUub3BhY2l0eSA9ICcnOyBkaWZmRWwuc3R5bGUuYm9yZGVyTGVmdCA9ICcnOyB9XG4gICAgYWZ0ZXJFbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgcmV3cml0ZURlY2lzaW9uc1tpZF0gPSB7IG91dGNvbWUsIGZpbmFsX3RleHQ6IG51bGwgfTtcbiAgICBfcGVyc2lzdERlY2lzaW9ucygpO1xuICAgIGNhcmQuY2xhc3NMaXN0LmFkZChvdXRjb21lID09PSAnYWNjZXB0JyA/ICdhY2NlcHRlZCcgOiAncmVqZWN0ZWQnKTtcbiAgICBjb25zdCBhY3RpdmVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcnctJHtvdXRjb21lfS0ke2lkfWApO1xuICAgIGFjdGl2ZUJ0bj8uY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgaWYgKGFjdGl2ZUJ0bikgYWN0aXZlQnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJywgJ3RydWUnKTtcbiAgICBjb25zdCBkZWNCYWRnZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBydy1kZWNpc2lvbi1iYWRnZS0ke2lkfWApO1xuICAgIGlmIChkZWNCYWRnZSkge1xuICAgICAgZGVjQmFkZ2UudGV4dENvbnRlbnQgPSBvdXRjb21lID09PSAnYWNjZXB0JyA/ICdcdTI3MTMgQWNjZXB0ZWQnIDogJ1x1MjcxNyBSZWplY3RlZCc7XG4gICAgICBkZWNCYWRnZS5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICBkZWNCYWRnZS5zdHlsZS5iYWNrZ3JvdW5kID0gb3V0Y29tZSA9PT0gJ2FjY2VwdCcgPyAnI2JiZjdkMCcgOiAnI2ZlY2FjYSc7XG4gICAgICBkZWNCYWRnZS5zdHlsZS5jb2xvciAgICAgID0gb3V0Y29tZSA9PT0gJ2FjY2VwdCcgPyAnIzA2NWY0NicgOiAnIzk5MWIxYic7XG4gICAgfVxuICAgIHN5bmNSZXdyaXRlR2xvYmFscygpO1xuICAgIHVwZGF0ZVJld3JpdGVUYWxseSgpO1xuICAgIF9zY3JvbGxUb05leHRQZW5kaW5nUmV3cml0ZShpZCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX3Njcm9sbFRvTmV4dFBlbmRpbmdSZXdyaXRlKGFmdGVySWQpIHtcbiAgY29uc3QgYWxsQ2FyZHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbaWRePVwicnctY2FyZC1cIl0nKTtcbiAgbGV0IGZvdW5kID0gZmFsc2U7XG4gIGZvciAoY29uc3QgY2FyZCBvZiBhbGxDYXJkcykge1xuICAgIGNvbnN0IGlkID0gY2FyZC5pZC5yZXBsYWNlKCdydy1jYXJkLScsICcnKTtcbiAgICBpZiAoaWQgPT09IGFmdGVySWQpIHsgZm91bmQgPSB0cnVlOyBjb250aW51ZTsgfVxuICAgIGlmICghZm91bmQpIGNvbnRpbnVlO1xuICAgIGlmICghcmV3cml0ZURlY2lzaW9uc1tpZF0pIHtcbiAgICAgIGNhcmQuc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnY2VudGVyJyB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2F2ZVJld3JpdGVFZGl0KGlkKSB7XG4gIGNvbnN0IHRleHRhcmVhICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcnctdGV4dGFyZWEtJHtpZH1gKTtcbiAgY29uc3QgZWRpdGVkVGV4dCA9IHRleHRhcmVhID8gdGV4dGFyZWEudmFsdWUgOiAnJztcbiAgY29uc3QgYWZ0ZXJFbCAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBydy1hZnRlci0ke2lkfWApO1xuICBjb25zdCBkaWZmRWwgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHJ3LWRpZmYtJHtpZH1gKTtcbiAgY29uc3QgY2FyZCAgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBydy1jYXJkLSR7aWR9YCk7XG4gIGlmICghYWZ0ZXJFbCB8fCAhY2FyZCkgcmV0dXJuO1xuXG4gIC8vIFJlcGxhY2UgdGV4dGFyZWEgd2l0aCBmaW5hbCBzcGFuIChoaWRkZW4gXHUyMDE0IHByZXNlcnZlcyB0ZXh0IGZvciBmdXR1cmUgZWRpdHMpLlxuICBhZnRlckVsLmlubmVySFRNTCA9IGA8c3BhbiBpZD1cInJ3LWFmdGVyLXRleHQtJHtpZH1cIj4ke2VzY2FwZUh0bWwoZWRpdGVkVGV4dCl9PC9zcGFuPmA7XG4gIGFmdGVyRWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAvLyBSZWdlbmVyYXRlIHRoZSBpbmxpbmUgZGlmZiBhZ2FpbnN0IHRoZSBvcmlnaW5hbCB0ZXh0IGFuZCByZS1zaG93IGl0IChmdWxsIG9wYWNpdHkpLlxuICBpZiAoZGlmZkVsKSB7XG4gICAgY29uc3Qgb3JpZ2luYWwgPSBkaWZmRWwuZGF0YXNldC5vcmlnaW5hbCB8fCAnJztcbiAgICBkaWZmRWwuaW5uZXJIVE1MID0gcmVuZGVyRGlmZkh0bWwoY29tcHV0ZVdvcmREaWZmKG9yaWdpbmFsLCBlZGl0ZWRUZXh0KSk7XG4gICAgZGlmZkVsLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICBkaWZmRWwuc3R5bGUub3BhY2l0eSA9ICcnO1xuICAgIGRpZmZFbC5zdHlsZS5ib3JkZXJMZWZ0ID0gJyc7XG4gIH1cblxuICByZXdyaXRlRGVjaXNpb25zW2lkXSA9IHsgb3V0Y29tZTogJ2VkaXQnLCBmaW5hbF90ZXh0OiBlZGl0ZWRUZXh0IH07XG4gIF9wZXJzaXN0RGVjaXNpb25zKCk7XG4gIGNhcmQuY2xhc3NMaXN0LnJlbW92ZSgncmVqZWN0ZWQnKTtcbiAgY2FyZC5jbGFzc0xpc3QuYWRkKCdhY2NlcHRlZCcpO1xuICBbJ2FjY2VwdCcsICdyZWplY3QnXS5mb3JFYWNoKGEgPT4ge1xuICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBydy0ke2F9LSR7aWR9YCk7XG4gICAgYnRuPy5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICBpZiAoYnRuKSBidG4uc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCAnZmFsc2UnKTtcbiAgfSk7XG4gIGNvbnN0IHNhdmVFZGl0QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHJ3LWVkaXQtJHtpZH1gKTtcbiAgc2F2ZUVkaXRCdG4/LmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICBpZiAoc2F2ZUVkaXRCdG4pIHNhdmVFZGl0QnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJywgJ3RydWUnKTtcbiAgY29uc3QgZWRpdERlY0JhZGdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHJ3LWRlY2lzaW9uLWJhZGdlLSR7aWR9YCk7XG4gIGlmIChlZGl0RGVjQmFkZ2UpIHtcbiAgICBlZGl0RGVjQmFkZ2UudGV4dENvbnRlbnQgPSAnXHUyNzEzIEFjY2VwdGVkIChlZGl0ZWQpJztcbiAgICBlZGl0RGVjQmFkZ2Uuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgIGVkaXREZWNCYWRnZS5zdHlsZS5iYWNrZ3JvdW5kID0gJyNiYmY3ZDAnO1xuICAgIGVkaXREZWNCYWRnZS5zdHlsZS5jb2xvciAgICAgID0gJyMwNjVmNDYnO1xuICB9XG4gIHN5bmNSZXdyaXRlR2xvYmFscygpO1xuICB1cGRhdGVSZXdyaXRlVGFsbHkoKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlUmV3cml0ZVRhbGx5KCkge1xuICBjb25zdCBjYXJkcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5yZXdyaXRlLWNhcmQnKTtcbiAgbGV0IGFjY2VwdGVkID0gMCwgcmVqZWN0ZWQgPSAwLCBwZW5kaW5nID0gMDtcbiAgY2FyZHMuZm9yRWFjaChjYXJkID0+IHtcbiAgICBjb25zdCBpZCAgPSBjYXJkLmlkLnJlcGxhY2UoJ3J3LWNhcmQtJywgJycpO1xuICAgIGNvbnN0IGRlYyA9IHJld3JpdGVEZWNpc2lvbnNbaWRdO1xuICAgIGlmICAgICAgKCFkZWMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmcrKztcbiAgICBlbHNlIGlmIChkZWMub3V0Y29tZSA9PT0gJ2FjY2VwdCcgfHwgZGVjLm91dGNvbWUgPT09ICdlZGl0JykgYWNjZXB0ZWQrKztcbiAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3RlZCsrO1xuICB9KTtcblxuICBjb25zdCBhY2NlcHRlZEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhbGx5LWFjY2VwdGVkJyk7XG4gIGNvbnN0IHJlamVjdGVkRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFsbHktcmVqZWN0ZWQnKTtcbiAgY29uc3QgcGVuZGluZ0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhbGx5LXBlbmRpbmcnKTtcblxuICBpZiAoYWNjZXB0ZWRFbCkgYWNjZXB0ZWRFbC50ZXh0Q29udGVudCA9IGFjY2VwdGVkO1xuICBpZiAocmVqZWN0ZWRFbCkgcmVqZWN0ZWRFbC50ZXh0Q29udGVudCA9IHJlamVjdGVkO1xuICBpZiAocGVuZGluZ0VsKSBwZW5kaW5nRWwudGV4dENvbnRlbnQgID0gcGVuZGluZztcblxuICBjb25zdCBzdWJtaXRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3VibWl0LXJld3JpdGVzLWJ0bicpO1xuICBpZiAoc3VibWl0QnRuKSB7XG4gICAgY29uc3QgbmVlZHNBY2sgPSAhcGVyc3Vhc2lvbldhcm5pbmdzQWNrbm93bGVkZ2VkO1xuICAgIHN1Ym1pdEJ0bi5kaXNhYmxlZCA9IChwZW5kaW5nID4gMCkgfHwgbmVlZHNBY2s7XG4gICAgc3VibWl0QnRuLnRpdGxlID0gbmVlZHNBY2tcbiAgICAgID8gJ0Fja25vd2xlZGdlIHRoZSBwZXJzdWFzaW9uIHdhcm5pbmdzIGFib3ZlIGJlZm9yZSBzdWJtaXR0aW5nJ1xuICAgICAgOiAnJztcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBzdWJtaXRSZXdyaXRlRGVjaXNpb25zKCkge1xuICBpZiAoIXBlcnN1YXNpb25XYXJuaW5nc0Fja25vd2xlZGdlZCkge1xuICAgIGNvbnN0IHByb2NlZWQgPSBhd2FpdCBzaG93Q29uZmlybU1vZGFsKFxuICAgICAgJ1x1MjZBMFx1RkUwRiBQZXJzdWFzaW9uIENoZWNrcycsXG4gICAgICAnVGhlcmUgYXJlIHVuYWNrbm93bGVkZ2VkIHBlcnN1YXNpb24gd2FybmluZ3MuIEl0IGlzIHJlY29tbWVuZGVkIHlvdSByZXZpZXcgYW5kIGFja25vd2xlZGdlIHRoZW0gZmlyc3QuXFxuXFxuUHJvY2VlZCBhbnl3YXk/JyxcbiAgICAgICdTdWJtaXQgQW55d2F5J1xuICAgICk7XG4gICAgaWYgKCFwcm9jZWVkKSByZXR1cm47XG4gIH1cbiAgLyogZHVja2Zsb3c6XG4gICAqICAgaWQ6IHJld3JpdGVfdWlfc3VibWl0X2xpdmVcbiAgICogICBraW5kOiB1aVxuICAgKiAgIHRpbWVzdGFtcDogJzIwMjYtMDMtMjVUMjE6Mzk6NDhaJ1xuICAgKiAgIHN0YXR1czogbGl2ZVxuICAgKiAgIGhhbmRsZXM6XG4gICAqICAgLSB1aTpyZXdyaXRlLXJldmlldy5zdWJtaXRcbiAgICogICBjYWxsczpcbiAgICogICAtIFBPU1QgL2FwaS9yZXdyaXRlcy9hcHByb3ZlXG4gICAqICAgLSBQT1NUIC9hcGkvY3YvbGF5b3V0LWVzdGltYXRlXG4gICAqICAgcmVhZHM6XG4gICAqICAgLSB3aW5kb3c6cmV3cml0ZURlY2lzaW9uc1xuICAgKiAgIHdyaXRlczpcbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL3Jld3JpdGVzL2FwcHJvdmUuZGVjaXNpb25zXG4gICAqICAgbm90ZXM6IFN1Ym1pdHMgdGhlIGZpbmFsIHBlci1yZXdyaXRlIG91dGNvbWVzIGFuZCBlZGl0ZWQgdGV4dCBzbyBiYWNrZW5kIHN0YXRlIGNhbiBwZXJzaXN0IGFwcHJvdmVkIHJld3JpdGVzIGFuZCB0aGUgZnVsbCByZXdyaXRlIGF1ZGl0IGJlZm9yZSBzcGVsbC1jaGVjay5cbiAgICovXG4gIGNvbnN0IGRlY2lzaW9ucyA9IE9iamVjdC5lbnRyaWVzKHJld3JpdGVEZWNpc2lvbnMpLm1hcCgoW2lkLCBkZWNdKSA9PiAoe1xuICAgIGlkLFxuICAgIG91dGNvbWU6ICAgIGRlYy5vdXRjb21lLFxuICAgIGZpbmFsX3RleHQ6IGRlYy5maW5hbF90ZXh0ID8/IG51bGxcbiAgfSkpO1xuXG4gIGNvbnN0IGxvYWRpbmdNc2cgPSBhcHBlbmRMb2FkaW5nTWVzc2FnZSgnU3VibWl0dGluZyByZXdyaXRlIGRlY2lzaW9ucy4uLicpO1xuICBzZXRMb2FkaW5nKHRydWUsICdTdWJtaXR0aW5nIHJld3JpdGUgZGVjaXNpb25zXHUyMDI2Jyk7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvcmV3cml0ZXMvYXBwcm92ZScsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGRlY2lzaW9ucyB9KVxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIHJlbW92ZUxvYWRpbmdNZXNzYWdlKGxvYWRpbmdNc2cpO1xuICAgIHNldExvYWRpbmcoZmFsc2UpO1xuXG4gICAgaWYgKCFyZXMub2spIHtcbiAgICAgIGFwcGVuZFJldHJ5TWVzc2FnZSgnXHUyNzRDIEVycm9yOiAnICsgKGRhdGEuZXJyb3IgfHwgJ0ZhaWxlZCB0byBzdWJtaXQgcmV3cml0ZSBkZWNpc2lvbnMnKSwgc3VibWl0UmV3cml0ZURlY2lzaW9ucyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYWNjZXB0ZWQgPSBkYXRhLmFwcHJvdmVkX2NvdW50IHx8IDA7XG4gICAgY29uc3QgcmVqZWN0ZWQgPSBkYXRhLnJlamVjdGVkX2NvdW50IHx8IDA7XG4gICAgc3RhdGVNYW5hZ2VyLm1hcmtDb250ZW50Q2hhbmdlZCgpO1xuICAgIF9jbGVhclBlcnNpc3RlZERlY2lzaW9ucygpO1xuICAgIF9jbGVhclJld3JpdGVTbmFwc2hvdCgpO1xuICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIGBcdTI3MDUgUmV3cml0ZSBkZWNpc2lvbnMgcmVjb3JkZWQ6ICR7YWNjZXB0ZWR9IGFjY2VwdGVkLCAke3JlamVjdGVkfSByZWplY3RlZC4gU3RhcnRpbmcgc3BlbGwgY2hlY2tcdTIwMjZgKTtcbiAgICBzY2hlZHVsZUF0c1JlZnJlc2goJ3Jldmlld19jaGVja3BvaW50Jyk7XG4gICAgc3dpdGNoVGFiKCdzcGVsbCcpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZW1vdmVMb2FkaW5nTWVzc2FnZShsb2FkaW5nTXNnKTtcbiAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICBhcHBlbmRSZXRyeU1lc3NhZ2UoJ1x1Mjc0QyBFcnJvcjogJyArIGVyci5tZXNzYWdlLCBzdWJtaXRSZXdyaXRlRGVjaXNpb25zKTtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgRXhwb3J0cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmZ1bmN0aW9uIHNldFBlcnN1YXNpb25XYXJuaW5nc0Fja25vd2xlZGdlZCh2YWx1ZSkge1xuICBwZXJzdWFzaW9uV2FybmluZ3NBY2tub3dsZWRnZWQgPSB2YWx1ZTtcbn1cblxuLyoqIEJ1bGstYWNjZXB0IGFsbCBwZW5kaW5nIHJld3JpdGUgY2FyZHMuICovXG5mdW5jdGlvbiBhY2NlcHRBbGxSZXdyaXRlcygpIHtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnJld3JpdGUtY2FyZCcpLmZvckVhY2goY2FyZCA9PiB7XG4gICAgY29uc3QgaWQgPSBjYXJkLmlkLnJlcGxhY2UoJ3J3LWNhcmQtJywgJycpO1xuICAgIGlmICghcmV3cml0ZURlY2lzaW9uc1tpZF0pIGFwcGx5UmV3cml0ZUFjdGlvbihpZCwgJ2FjY2VwdCcpO1xuICB9KTtcbiAgdXBkYXRlUmV3cml0ZVRhbGx5KCk7XG59XG5cbi8qKiBCdWxrLXJlamVjdCBhbGwgcGVuZGluZyByZXdyaXRlIGNhcmRzLiAqL1xuZnVuY3Rpb24gcmVqZWN0QWxsUmV3cml0ZXMoKSB7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5yZXdyaXRlLWNhcmQnKS5mb3JFYWNoKGNhcmQgPT4ge1xuICAgIGNvbnN0IGlkID0gY2FyZC5pZC5yZXBsYWNlKCdydy1jYXJkLScsICcnKTtcbiAgICBpZiAoIXJld3JpdGVEZWNpc2lvbnNbaWRdKSBhcHBseVJld3JpdGVBY3Rpb24oaWQsICdyZWplY3QnKTtcbiAgfSk7XG4gIHVwZGF0ZVJld3JpdGVUYWxseSgpO1xufVxuXG4vKiogVG9nZ2xlIGNvbXBhY3QgKHNpbmdsZS1saW5lKSBjYXJkIGRpc3BsYXkgZm9yIHJhcGlkIHJldmlldy4gKi9cbmZ1bmN0aW9uIHRvZ2dsZVJld3JpdGVDb21wYWN0TW9kZSgpIHtcbiAgY29uc3QgY2FyZHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmV3cml0ZS1jYXJkcycpO1xuICBjb25zdCBidG4gICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdydy1jb21wYWN0LWJ0bicpO1xuICBpZiAoIWNhcmRzKSByZXR1cm47XG4gIGNvbnN0IGlzQ29tcGFjdCA9IGNhcmRzLmNsYXNzTGlzdC50b2dnbGUoJ2NvbXBhY3QtbW9kZScpO1xuICBpZiAoYnRuKSB7XG4gICAgYnRuLmNsYXNzTGlzdC50b2dnbGUoJ2FjdGl2ZScsIGlzQ29tcGFjdCk7XG4gICAgYnRuLnRleHRDb250ZW50ID0gaXNDb21wYWN0ID8gJ1x1MjI5RiBGdWxsIFZpZXcnIDogJ1x1MjI5RSBDb21wYWN0JztcbiAgICBidG4udGl0bGUgPSBpc0NvbXBhY3QgPyAnU3dpdGNoIHRvIGZ1bGwgY2FyZCB2aWV3JyA6ICdTd2l0Y2ggdG8gY29tcGFjdCBzaW5nbGUtbGluZSB2aWV3IGZvciByYXBpZCByZXZpZXcnO1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIHJld3JpdGVEZWNpc2lvbnMsXG4gIF9yZXdyaXRlUGFuZWxDYWNoZSxcbiAgcGVyc3Vhc2lvbldhcm5pbmdzQWNrbm93bGVkZ2VkLFxuICBzZXRQZXJzdWFzaW9uV2FybmluZ3NBY2tub3dsZWRnZWQsXG4gIGZldGNoQW5kUmV2aWV3UmV3cml0ZXMsXG4gIHJlbmRlclJld3JpdGVQYW5lbCxcbiAgY29tcHV0ZVdvcmREaWZmLFxuICByZW5kZXJEaWZmSHRtbCxcbiAgcmVuZGVyUmV3cml0ZUNhcmQsXG4gIGFwcGx5UmV3cml0ZUFjdGlvbixcbiAgc2F2ZVJld3JpdGVFZGl0LFxuICB1cGRhdGVSZXdyaXRlVGFsbHksXG4gIHN1Ym1pdFJld3JpdGVEZWNpc2lvbnMsXG4gIGFjY2VwdEFsbFJld3JpdGVzLFxuICByZWplY3RBbGxSZXdyaXRlcyxcbiAgdG9nZ2xlUmV3cml0ZUNvbXBhY3RNb2RlLFxufTtcblxuc3luY1Jld3JpdGVHbG9iYWxzKCk7XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9zcGVsbC1jaGVjay5qc1xuICogU3BlbGwgJiBncmFtbWFyIGNoZWNrIHRhYjogZmV0Y2ggc2VjdGlvbnMsIHJlbmRlciBzdWdnZXN0aW9ucyxcbiAqIGFwcGx5L2Rpc21pc3MgY29ycmVjdGlvbnMsIHN1Ym1pdCBhdWRpdC5cbiAqXG4gKiBEZXBlbmRlbmNpZXMgKHJlc29sdmVkIHRocm91Z2ggZ2xvYmFsVGhpcyBhdCBydW50aW1lKTpcbiAqICAgZXNjYXBlSHRtbCwgYXBwZW5kTG9hZGluZ01lc3NhZ2UsIHJlbW92ZUxvYWRpbmdNZXNzYWdlLCBhcHBlbmRNZXNzYWdlLFxuICogICBzaG93QWxlcnRNb2RhbCwgc2hvd0NvbmZpcm1Nb2RhbCwgc2V0TG9hZGluZywgZmV0Y2hTdGF0dXMsIHNlbmRBY3Rpb24sXG4gKiAgIHNjaGVkdWxlQXRzUmVmcmVzaCwgQ1NTXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdzcGVsbC1jaGVjaycpO1xuXG5pbXBvcnQgeyBzdGF0ZU1hbmFnZXIgfSBmcm9tICcuL3N0YXRlLW1hbmFnZXIuanMnO1xuXG4vLyBNb2R1bGUtbGV2ZWwgc3RhdGVcbmxldCBzcGVsbEF1ZGl0ID0gW107XG5sZXQgX3NwZWxsQ2hlY2tDYWNoZSA9IG51bGw7XG5cbi8vIFx1MjUwMFx1MjUwMCBQb3B1bGF0ZSBzcGVsbC1jaGVjayB0YWIgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIHBvcHVsYXRlU3BlbGxDaGVja1RhYigpIHtcbiAgLy8gSWYgd2UgaGF2ZSBjYWNoZWQgcmVzdWx0cyBmcm9tIGEgcHJldmlvdXMgcnVuLCByZS1yZW5kZXIgZnJvbSBjYWNoZVxuICAvLyBpbnN0ZWFkIG9mIHJlLXJ1bm5pbmcgTGFuZ3VhZ2VUb29sIG9uIGV2ZXJ5IGJhY2stbmF2aWdhdGlvbi5cbiAgaWYgKHdpbmRvdy5fc3BlbGxDaGVja0NhY2hlKSB7XG4gICAgY29uc3QgYyA9IHdpbmRvdy5fc3BlbGxDaGVja0NhY2hlO1xuICAgIGlmIChjLnR5cGUgPT09ICd6ZXJvJykge1xuICAgICAgcmVuZGVyU3BlbGxDaGVja1plcm9TdGF0ZShjLm1lc3NhZ2UsIGMuc3RhdHNMaW5lLCBjLmN1c3RvbURpY3RTaXplKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gICAgICBjb250ZW50LmlubmVySFRNTCA9IGBcbiAgICAgICAgPGgxPlx1RDgzRFx1REQyNCBTcGVsbCAmYW1wOyBHcmFtbWFyIENoZWNrPC9oMT5cbiAgICAgICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO21hcmdpbi1ib3R0b206MjRweDtcIj5SZXZpZXcgc3BlbGxpbmcgYW5kIGdyYW1tYXIgc3VnZ2VzdGlvbnMuPC9wPlxuICAgICAgICA8ZGl2IGlkPVwic3BlbGwtcmVzdWx0c1wiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPjwvZGl2PlxuICAgICAgYDtcbiAgICAgIHJlbmRlclNwZWxsU3VnZ2VzdGlvbnMoYy5mbGFnZ2VkU2VjdGlvbnMsIGMudG90YWxTZWN0aW9ucywgYy5zdGF0cywgYy5jdXN0b21EaWN0U2l6ZSk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9jdW1lbnQtY29udGVudCcpO1xuICBjb250ZW50LmlubmVySFRNTCA9IGBcbiAgICA8aDE+XHVEODNEXHVERDI0IFNwZWxsICZhbXA7IEdyYW1tYXIgQ2hlY2s8L2gxPlxuICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDttYXJnaW4tYm90dG9tOjI0cHg7XCI+Q2hlY2tpbmcgQ1Ygc2VjdGlvbnMgZm9yIHNwZWxsaW5nIGFuZCBncmFtbWFyIGlzc3Vlc1x1MjAyNjwvcD5cbiAgICA8ZGl2IGlkPVwic3BlbGwtbG9hZGluZ1wiIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7cGFkZGluZzo0MHB4O1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImxvYWRpbmctc3Bpbm5lclwiPjwvZGl2PlxuICAgICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO21hcmdpbi10b3A6MTJweDtcIj5SdW5uaW5nIExhbmd1YWdlVG9vbCBjaGVja3NcdTIwMjY8L3A+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBpZD1cInNwZWxsLXJlc3VsdHNcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj48L2Rpdj5cbiAgYDtcbiAgc3BlbGxBdWRpdCA9IFtdO1xuICB3aW5kb3cuX3NwZWxsU3VnTWFwID0ge307XG5cbiAgdHJ5IHtcbiAgICAvLyBGZXRjaCBzZWN0aW9ucyB0byBjaGVja1xuICAgIGNvbnN0IHNlY3Rpb25zUmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvc3BlbGwtY2hlY2stc2VjdGlvbnMnKTtcbiAgICBjb25zdCBzZWN0aW9uc0RhdGEgPSBhd2FpdCBzZWN0aW9uc1Jlcy5qc29uKCk7XG4gICAgaWYgKCFzZWN0aW9uc0RhdGEub2spIHtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzcGVsbC1sb2FkaW5nJykuaW5uZXJIVE1MID0gYDxwIGNsYXNzPVwiZXJyb3ItbWVzc2FnZVwiPkZhaWxlZCB0byBsb2FkIHNlY3Rpb25zOiAke3NlY3Rpb25zRGF0YS5lcnJvciB8fCAnVW5rbm93biBlcnJvcid9PC9wPmA7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2VjdGlvbnMgPSBzZWN0aW9uc0RhdGEuc2VjdGlvbnMgfHwgW107XG4gICAgaWYgKHNlY3Rpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmVuZGVyU3BlbGxDaGVja1plcm9TdGF0ZSgnTm8gQ1Ygc2VjdGlvbnMgYXJlIGF2YWlsYWJsZSB0byBjaGVjay4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBlYWNoIHNlY3Rpb25cbiAgICBjb25zdCBmbGFnZ2VkU2VjdGlvbnMgPSBbXTtcbiAgICBjb25zdCBhZ2dyZWdhdGVTdGF0cyA9IHNlY3Rpb25zRGF0YS5hZ2dyZWdhdGVfc3RhdHMgfHwge307XG4gICAgbGV0IGluY29ycmVjdFdvcmRzID0gMDtcbiAgICBsZXQgZ3JhbW1hcklzc3VlcyA9IDA7XG4gICAgbGV0IGN1c3RvbURpY3RTaXplID0gc2VjdGlvbnNEYXRhLmN1c3RvbV9kaWN0X3NpemUgfHwgMDtcbiAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2Ygc2VjdGlvbnMpIHtcbiAgICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9zcGVsbC1jaGVjaycsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHRleHQ6IHNlY3Rpb24udGV4dCwgY29udGV4dDogc2VjdGlvbi5jb250ZXh0IH0pXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3RhdHMpIHtcbiAgICAgICAgaWYgKGRhdGEuY3VzdG9tX2RpY3Rfc2l6ZSkgY3VzdG9tRGljdFNpemUgPSBkYXRhLmN1c3RvbV9kaWN0X3NpemU7XG4gICAgICAgIGluY29ycmVjdFdvcmRzICs9IGRhdGEuc3RhdHMudW5rbm93bl93b3JkX2NvdW50IHx8IDA7XG4gICAgICAgIGdyYW1tYXJJc3N1ZXMgKz0gZGF0YS5zdGF0cy5ncmFtbWFyX2lzc3VlX2NvdW50IHx8IDA7XG4gICAgICB9XG4gICAgICBpZiAoZGF0YS5vayAmJiBkYXRhLnN1Z2dlc3Rpb25zICYmIGRhdGEuc3VnZ2VzdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICBmbGFnZ2VkU2VjdGlvbnMucHVzaCh7IHNlY3Rpb24sIHN1Z2dlc3Rpb25zOiBkYXRhLnN1Z2dlc3Rpb25zIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzcGVsbC1sb2FkaW5nJykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgIGlmIChmbGFnZ2VkU2VjdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZW5kZXJTcGVsbENoZWNrWmVyb1N0YXRlKFxuICAgICAgICAnU3BlbGwgY2hlY2sgcGFzc2VkIFx1MjAxNCBubyBpc3N1ZXMgZm91bmQuJyxcbiAgICAgICAgYnVpbGRTcGVsbFN0YXRzU3VtbWFyeSh7XG4gICAgICAgICAgdG90YWxfc2VjdGlvbnM6IHNlY3Rpb25zLmxlbmd0aCxcbiAgICAgICAgICB0b3RhbF93b3JkczogYWdncmVnYXRlU3RhdHMud29yZF9jb3VudCB8fCAwLFxuICAgICAgICAgIHVuaXF1ZV93b3JkczogYWdncmVnYXRlU3RhdHMudW5pcXVlX3dvcmRzIHx8IDAsXG4gICAgICAgICAgY3VzdG9tX2RpY3Rfd29yZHM6IGFnZ3JlZ2F0ZVN0YXRzLmN1c3RvbV9kaWN0X3dvcmRzIHx8IDAsXG4gICAgICAgICAgaW5jb3JyZWN0X3dvcmRzOiBpbmNvcnJlY3RXb3JkcyxcbiAgICAgICAgICBncmFtbWFyX2lzc3VlczogZ3JhbW1hcklzc3VlcyxcbiAgICAgICAgfSksXG4gICAgICAgIGN1c3RvbURpY3RTaXplLFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBSZW5kZXIgc3VnZ2VzdGlvbnMgcGFuZWxcbiAgICByZW5kZXJTcGVsbFN1Z2dlc3Rpb25zKGZsYWdnZWRTZWN0aW9ucywgc2VjdGlvbnMubGVuZ3RoLCB7XG4gICAgICB0b3RhbF9zZWN0aW9uczogc2VjdGlvbnMubGVuZ3RoLFxuICAgICAgdG90YWxfd29yZHM6IGFnZ3JlZ2F0ZVN0YXRzLndvcmRfY291bnQgfHwgMCxcbiAgICAgIHVuaXF1ZV93b3JkczogYWdncmVnYXRlU3RhdHMudW5pcXVlX3dvcmRzIHx8IDAsXG4gICAgICBjdXN0b21fZGljdF93b3JkczogYWdncmVnYXRlU3RhdHMuY3VzdG9tX2RpY3Rfd29yZHMgfHwgMCxcbiAgICAgIGluY29ycmVjdF93b3JkczogaW5jb3JyZWN0V29yZHMsXG4gICAgICBncmFtbWFyX2lzc3VlczogZ3JhbW1hcklzc3VlcyxcbiAgICB9LCBjdXN0b21EaWN0U2l6ZSk7XG5cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLmVycm9yKCdTcGVsbCBjaGVjayBlcnJvcjonLCBlcnIpO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzcGVsbC1sb2FkaW5nJykuaW5uZXJIVE1MID0gYDxwIHN0eWxlPVwiY29sb3I6I2VmNDQ0NDtwYWRkaW5nOjIwcHg7XCI+U3BlbGwgY2hlY2sgZmFpbGVkOiAke2Vyci5tZXNzYWdlfTwvcD5gO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBaZXJvLXN0YXRlIHNwZWxsIHN0YWdlIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiByZW5kZXJTcGVsbENoZWNrWmVyb1N0YXRlKG1lc3NhZ2UsIHN0YXRzTGluZSA9ICcnLCBjdXN0b21EaWN0U2l6ZSA9IDApIHtcbiAgd2luZG93Ll9zcGVsbENoZWNrQ2FjaGUgPSB7IHR5cGU6ICd6ZXJvJywgbWVzc2FnZSwgc3RhdHNMaW5lLCBjdXN0b21EaWN0U2l6ZSB9O1xuICBfc3BlbGxDaGVja0NhY2hlID0gd2luZG93Ll9zcGVsbENoZWNrQ2FjaGU7XG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9jdW1lbnQtY29udGVudCcpO1xuICBjb25zdCBzdGF0c1BhcnRzID0gW107XG4gIGlmIChzdGF0c0xpbmUpIHN0YXRzUGFydHMucHVzaChgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO2ZvbnQtc2l6ZTowLjk1ZW07bWFyZ2luOjhweCAwIDA7XCI+JHtlc2NhcGVIdG1sKHN0YXRzTGluZSl9PC9wPmApO1xuICBpZiAoY3VzdG9tRGljdFNpemUgPiAwKSBzdGF0c1BhcnRzLnB1c2goYDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtmb250LXNpemU6MC45ZW07bWFyZ2luOjRweCAwIDA7XCI+Q3VzdG9tIGRpY3Rpb25hcnk6ICR7Y3VzdG9tRGljdFNpemUudG9Mb2NhbGVTdHJpbmcoKX0gd29yZCR7Y3VzdG9tRGljdFNpemUgIT09IDEgPyAncycgOiAnJ308L3A+YCk7XG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjtwYWRkaW5nOjYwcHggMjBweDtcIj5cbiAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6M2VtO21hcmdpbi1ib3R0b206MTZweDtcIj5cdTI3MDU8L2Rpdj5cbiAgICAgIDxoMiBzdHlsZT1cImNvbG9yOiMxNjY1MzQ7XCI+JHtlc2NhcGVIdG1sKG1lc3NhZ2UpfTwvaDI+XG4gICAgICAke3N0YXRzUGFydHMuam9pbignXFxuJyl9XG4gICAgICA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7bWFyZ2luOjE2cHggMCAyNHB4O1wiPkNvbnRpbnVlIHdoZW4geW91IGFyZSByZWFkeSB0byBnZW5lcmF0ZSB5b3VyIENWLjwvcD5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJzdWJtaXQtYnRuXCIgb25jbGljaz1cInN1Ym1pdEVtcHR5U3BlbGxDaGVjaygpXCIgdGl0bGU9XCJHZW5lcmF0ZSBhbiBIVE1MIHByZXZpZXcgb2YgeW91ciBDViBcdTIwMTQgeW91IHdpbGwgcmV2aWV3IHRoZSBsYXlvdXQgYmVmb3JlIGZpbmFsIERPQ1gvUERGIGZpbGVzIGFyZSBwcm9kdWNlZFwiPkdlbmVyYXRlIFByZXZpZXcgXHUyMTkyPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIGA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN1Ym1pdEVtcHR5U3BlbGxDaGVjaygpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvc3BlbGwtY2hlY2stY29tcGxldGUnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBzcGVsbF9hdWRpdDogW10gfSlcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoIXJlcy5vaykge1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsIGBGYWlsZWQgdG8gc2F2ZSBzcGVsbCBjaGVjazogJHtkYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yJ31gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcHJvY2VlZCA9IGF3YWl0IF9jb25maXJtUHJvY2VlZFRvR2VuZXJhdGUoKTtcbiAgICBpZiAoIXByb2NlZWQpIHJldHVybjtcbiAgICBzdGF0ZU1hbmFnZXIubWFya0NvbnRlbnRDaGFuZ2VkKCk7XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ1x1MjcwNSBTcGVsbCBjaGVjayBjb21wbGV0ZSBcdTIwMTQgbm8gaXNzdWVzIHJlcXVpcmVkIGNoYW5nZXMuIEdlbmVyYXRpbmcgeW91ciBDVlx1MjAyNicpO1xuICAgIHNjaGVkdWxlQXRzUmVmcmVzaCgncmV2aWV3X2NoZWNrcG9pbnQnKTtcbiAgICBhd2FpdCBmZXRjaFN0YXR1cygpO1xuICAgIGF3YWl0IHNlbmRBY3Rpb24oJ2dlbmVyYXRlX2N2Jyk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCBgU3BlbGwgY2hlY2sgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIFN0YXRzIHN1bW1hcnkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIGJ1aWxkU3BlbGxTdGF0c1N1bW1hcnkoc3RhdHMgPSB7fSkge1xuICByZXR1cm4gW1xuICAgIGAkeyhzdGF0cy50b3RhbF9zZWN0aW9ucyB8fCAwKS50b0xvY2FsZVN0cmluZygpfSBzZWN0aW9uJHtzdGF0cy50b3RhbF9zZWN0aW9ucyA9PT0gMSA/ICcnIDogJ3MnfSBjaGVja2VkYCxcbiAgICBgJHsoc3RhdHMudG90YWxfd29yZHMgfHwgMCkudG9Mb2NhbGVTdHJpbmcoKX0gd29yZHNgLFxuICAgIGAkeyhzdGF0cy51bmlxdWVfd29yZHMgfHwgMCkudG9Mb2NhbGVTdHJpbmcoKX0gdW5pcXVlYCxcbiAgICBgJHsoc3RhdHMuY3VzdG9tX2RpY3Rfd29yZHMgfHwgMCkudG9Mb2NhbGVTdHJpbmcoKX0gY3VzdG9tIGRpY3Rpb25hcnkgbWF0Y2gke3N0YXRzLmN1c3RvbV9kaWN0X3dvcmRzID09PSAxID8gJycgOiAnZXMnfWAsXG4gICAgYCR7KHN0YXRzLmluY29ycmVjdF93b3JkcyB8fCAwKS50b0xvY2FsZVN0cmluZygpfSB1bmtub3duL2luY29ycmVjdGAsXG4gICAgYCR7KHN0YXRzLmdyYW1tYXJfaXNzdWVzIHx8IDApLnRvTG9jYWxlU3RyaW5nKCl9IGdyYW1tYXIgaXNzdWUke3N0YXRzLmdyYW1tYXJfaXNzdWVzID09PSAxID8gJycgOiAncyd9YCxcbiAgXS5qb2luKCcgXHUwMEI3ICcpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgUmVuZGVyIHN1Z2dlc3Rpb25zIHBhbmVsIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiByZW5kZXJTcGVsbFN1Z2dlc3Rpb25zKGZsYWdnZWRTZWN0aW9ucywgdG90YWxTZWN0aW9ucywgc3RhdHMgPSB7fSwgY3VzdG9tRGljdFNpemUgPSAwKSB7XG4gIHdpbmRvdy5fc3BlbGxDaGVja0NhY2hlID0geyB0eXBlOiAnc3VnZ2VzdGlvbnMnLCBmbGFnZ2VkU2VjdGlvbnMsIHRvdGFsU2VjdGlvbnMsIHN0YXRzLCBjdXN0b21EaWN0U2l6ZSB9O1xuICBfc3BlbGxDaGVja0NhY2hlID0gd2luZG93Ll9zcGVsbENoZWNrQ2FjaGU7XG4gIGNvbnN0IHJlc3VsdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3BlbGwtcmVzdWx0cycpO1xuICByZXN1bHRzLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgY29uc3Qgc3RhdHNMaW5lID0gYnVpbGRTcGVsbFN0YXRzU3VtbWFyeShzdGF0cyk7XG5cbiAgbGV0IGh0bWwgPSBgXG4gICAgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2ZlZjljMztib3JkZXI6MXB4IHNvbGlkICNmZGUwNDc7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzoxMnB4IDE2cHg7bWFyZ2luLWJvdHRvbToyNHB4O1wiPlxuICAgICAgPHN0cm9uZz5cdTI2QTAgJHtmbGFnZ2VkU2VjdGlvbnMucmVkdWNlKCh0LCBmKSA9PiB0ICsgZi5zdWdnZXN0aW9ucy5sZW5ndGgsIDApfSBpc3N1ZSR7ZmxhZ2dlZFNlY3Rpb25zLnJlZHVjZSgodCwgZikgPT4gdCArIGYuc3VnZ2VzdGlvbnMubGVuZ3RoLCAwKSAhPT0gMSA/ICdzJyA6ICcnfTwvc3Ryb25nPiBmb3VuZFxuICAgICAgYWNyb3NzICR7ZmxhZ2dlZFNlY3Rpb25zLmxlbmd0aH0gb2YgJHt0b3RhbFNlY3Rpb25zfSBzZWN0aW9uJHt0b3RhbFNlY3Rpb25zICE9PSAxID8gJ3MnIDogJyd9LlxuICAgICAgUmV2aWV3IGVhY2ggc3VnZ2VzdGlvbiBiZWxvdywgdGhlbiBjbGljayA8c3Ryb25nPkRvbmU8L3N0cm9uZz4uXG4gICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDo4cHg7Zm9udC1zaXplOjAuOTJlbTtjb2xvcjojNmI3MjgwO1wiPiR7ZXNjYXBlSHRtbChzdGF0c0xpbmUpfTwvZGl2PlxuICAgICAgJHtjdXN0b21EaWN0U2l6ZSA+IDAgPyBgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6NHB4O2ZvbnQtc2l6ZTowLjg4ZW07Y29sb3I6IzZiNzI4MDtcIj5DdXN0b20gZGljdGlvbmFyeSBzaXplOiAke2N1c3RvbURpY3RTaXplLnRvTG9jYWxlU3RyaW5nKCl9IHdvcmQke2N1c3RvbURpY3RTaXplICE9PSAxID8gJ3MnIDogJyd9PC9kaXY+YCA6ICcnfVxuICAgIDwvZGl2PlxuICBgO1xuXG4gIGNvbnN0IF9zdWdTZXZlcml0eSA9IChzdWcpID0+IHtcbiAgICBjb25zdCByaWQgPSAoc3VnLnJ1bGVfaWQgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgY2F0ID0gKHN1Zy5jYXRlZ29yeSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoL3NwZWxsfHR5cG98bWlzc3BlbGwvLnRlc3QocmlkKSB8fCAvdHlwby8udGVzdChjYXQpKSByZXR1cm4gMDtcbiAgICBpZiAoL2dyYW1tYXJ8YWdyZWVtZW50fHZlcmJ8dGVuc2V8YXJ0aWNsZS8udGVzdChyaWQpIHx8IC9ncmFtbWFyLy50ZXN0KGNhdCkpIHJldHVybiAxO1xuICAgIGlmICgvc3R5bGV8cmVkdW5kYW58d29yZHkvLnRlc3QocmlkKSB8fCAvc3R5bGUvLnRlc3QoY2F0KSkgcmV0dXJuIDI7XG4gICAgcmV0dXJuIDM7XG4gIH07XG5cbiAgZmxhZ2dlZFNlY3Rpb25zLmZvckVhY2goKHsgc2VjdGlvbiwgc3VnZ2VzdGlvbnM6IHJhd1N1Z2dlc3Rpb25zIH0pID0+IHtcbiAgICBjb25zdCBzdWdnZXN0aW9ucyA9IFsuLi5yYXdTdWdnZXN0aW9uc10uc29ydCgoYSwgYikgPT4gX3N1Z1NldmVyaXR5KGEpIC0gX3N1Z1NldmVyaXR5KGIpKTtcbiAgICBodG1sICs9IGA8ZGl2IGNsYXNzPVwicmV2aWV3LXNlY3Rpb25cIiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MjRweDtcIj5cbiAgICAgIDxoMyBzdHlsZT1cImZvbnQtc2l6ZToxZW07Zm9udC13ZWlnaHQ6NzAwO2NvbG9yOiMzNzQxNTE7bWFyZ2luLWJvdHRvbToxMnB4O1wiPiR7ZXNjYXBlSHRtbChzZWN0aW9uLmxhYmVsKX08L2gzPlxuICAgICAgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2Y4ZmFmYztib3JkZXI6MXB4IHNvbGlkICNlMmU4ZjA7Ym9yZGVyLXJhZGl1czo2cHg7cGFkZGluZzoxMHB4IDE0cHg7bWFyZ2luLWJvdHRvbToxMHB4O2ZvbnQtc2l6ZTowLjllbTt3aGl0ZS1zcGFjZTpwcmUtd3JhcDtcIj4ke2VzY2FwZUh0bWwoc2VjdGlvbi50ZXh0KX08L2Rpdj5cbiAgICBgO1xuICAgIHN1Z2dlc3Rpb25zLmZvckVhY2goKHN1ZywgaWR4KSA9PiB7XG4gICAgICBjb25zdCBzdWdJZCA9IGBzdWdfJHtzZWN0aW9uLmlkfV8ke2lkeH1gO1xuICAgICAgY29uc3QgcmVwcyA9IHN1Zy5yZXBsYWNlbWVudHMgfHwgW107XG4gICAgICBodG1sICs9IGBcbiAgICAgICAgPGRpdiBjbGFzcz1cInNwZWxsLXN1Z2dlc3Rpb25cIiBpZD1cIiR7c3VnSWR9XCIgZGF0YS1zZWN0aW9uLWlkPVwiJHtlc2NhcGVIdG1sKHNlY3Rpb24uaWQpfVwiIGRhdGEtaWR4PVwiJHtpZHh9XCJcbiAgICAgICAgICAgICBzdHlsZT1cImJvcmRlcjoxcHggc29saWQgI2UyZThmMDtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjEwcHggMTRweDttYXJnaW4tYm90dG9tOjhweDtiYWNrZ3JvdW5kOiNmZmY7XCI+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpmbGV4LXN0YXJ0O2dhcDoxMHB4O1wiPlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZsZXg6MTtcIj5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjg4ZW07Y29sb3I6IzZiNzI4MDttYXJnaW4tYm90dG9tOjRweDtcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cImJhY2tncm91bmQ6I2ZlZTJlMjtjb2xvcjojZGMyNjI2O2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6MXB4IDZweDtmb250LXdlaWdodDo2MDA7XCI+JHtlc2NhcGVIdG1sKHN1Zy5mbGFnZ2VkKX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJtYXJnaW4tbGVmdDo4cHg7XCI+JHtlc2NhcGVIdG1sKHN1Zy5tZXNzYWdlKX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zdHlsZTppdGFsaWM7Zm9udC1zaXplOjAuODVlbTtjb2xvcjojMzc0MTUxO21hcmdpbi1ib3R0b206OHB4O1wiPiR7ZXNjYXBlSHRtbChzdWcuc25pcHBldCl9PC9kaXY+XG4gICAgICAgICAgICAgICR7cmVwcy5sZW5ndGggPiAwID8gYFxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2ZsZXgtd3JhcDp3cmFwO2dhcDo2cHg7bWFyZ2luLWJvdHRvbTo4cHg7XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC44MmVtO2NvbG9yOiM2YjcyODA7YWxpZ24tc2VsZjpjZW50ZXI7XCI+U3VnZ2VzdGlvbnM6PC9zcGFuPlxuICAgICAgICAgICAgICAgICR7cmVwcy5tYXAoKHIsIHJpKSA9PiBgPGJ1dHRvbiBjbGFzcz1cInJld3JpdGUta2V5d29yZFwiIG9uY2xpY2s9XCJhcHBseVNwZWxsUmVwbGFjZW1lbnQoJyR7ZXNjYXBlSHRtbChzZWN0aW9uLmlkKX0nLCAke2lkeH0sICR7cml9KVwiXG4gICAgICAgICAgICAgICAgICBzdHlsZT1cImN1cnNvcjpwb2ludGVyO2JvcmRlcjoxcHggc29saWQgIzNiODJmNjtiYWNrZ3JvdW5kOiNkYmVhZmU7XCI+JHtlc2NhcGVIdG1sKHIpfTwvYnV0dG9uPmApLmpvaW4oJycpfVxuICAgICAgICAgICAgICA8L2Rpdj5gIDogJyd9XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDo2cHg7bWFyZ2luLWJvdHRvbTo4cHg7XCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJlZGl0XyR7c3VnSWR9XCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiVHlwZSBjdXN0b20gY29ycmVjdGlvblx1MjAyNlwiXG4gICAgICAgICAgICAgICAgICB2YWx1ZT1cIiR7ZXNjYXBlSHRtbChyZXBzWzBdIHx8ICcnKX1cIlxuICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmbGV4OjE7Zm9udC1zaXplOjAuODhlbTtwYWRkaW5nOjRweCA4cHg7Ym9yZGVyOjFweCBzb2xpZCAjZDFkNWRiO2JvcmRlci1yYWRpdXM6NHB4O1wiXG4gICAgICAgICAgICAgICAgICBvbmtleWRvd249XCJpZihldmVudC5rZXk9PT0nRW50ZXInKXtldmVudC5wcmV2ZW50RGVmYXVsdCgpO2FwcGx5Q3VzdG9tU3BlbGxDb3JyZWN0aW9uKCcke2VzY2FwZUh0bWwoc2VjdGlvbi5pZCl9Jywke2lkeH0pO31cIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBvbmNsaWNrPVwiYXBwbHlDdXN0b21TcGVsbENvcnJlY3Rpb24oJyR7ZXNjYXBlSHRtbChzZWN0aW9uLmlkKX0nLCR7aWR4fSlcIiB0aXRsZT1cIkFwcGx5IGN1c3RvbSBjb3JyZWN0aW9uXCIgYXJpYS1sYWJlbD1cIkFwcGx5IGN1c3RvbSBjb3JyZWN0aW9uXCI+QXBwbHk8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjhweDtmbGV4LXdyYXA6d3JhcDtcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBvbmNsaWNrPVwiZGlzbWlzc1NwZWxsU3VnZ2VzdGlvbignJHtlc2NhcGVIdG1sKHN1Z0lkKX0nLCAnJHtlc2NhcGVIdG1sKHNlY3Rpb24uaWQpfScsICR7aWR4fSwgJyR7ZXNjYXBlSHRtbChzdWcuZmxhZ2dlZCl9JylcIlxuICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIklnbm9yZSB0aGlzIHN1Z2dlc3Rpb25cIiBhcmlhLWxhYmVsPVwiSWdub3JlIHRoaXMgc3VnZ2VzdGlvblwiPklnbm9yZTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIG9uY2xpY2s9XCJhZGRTcGVsbFdvcmQoJyR7ZXNjYXBlSHRtbChzdWcuZmxhZ2dlZCl9JywgJyR7ZXNjYXBlSHRtbChzdWdJZCl9JylcIlxuICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIkFkZCB0byBjdXN0b20gZGljdGlvbmFyeVwiIGFyaWEtbGFiZWw9XCJBZGQgdG8gY3VzdG9tIGRpY3Rpb25hcnlcIj5BZGQgdG8gRGljdGlvbmFyeTwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIGA7XG4gICAgICAvLyBSZWdpc3RlciBpbiBhdWRpdCBhcyBwZW5kaW5nXG4gICAgICBpZiAoIXdpbmRvdy5fc3BlbGxTdWdNYXApIHdpbmRvdy5fc3BlbGxTdWdNYXAgPSB7fTtcbiAgICAgIHdpbmRvdy5fc3BlbGxTdWdNYXBbYCR7c2VjdGlvbi5pZH1fJHtpZHh9YF0gPSB7XG4gICAgICAgIHNlY3Rpb25faWQ6ICAgIHNlY3Rpb24uaWQsXG4gICAgICAgIGNvbnRleHRfdHlwZTogc2VjdGlvbi5jb250ZXh0LFxuICAgICAgICBsb2NhdGlvbjogICAgIHNlY3Rpb24ubGFiZWwsXG4gICAgICAgIG9yaWdpbmFsOiAgICAgc3VnLmZsYWdnZWQsXG4gICAgICAgIHN1Z2dlc3Rpb246ICAgKHJlcHNbMF0gfHwgJycpLFxuICAgICAgICBvZmZzZXQ6ICAgICAgIHN1Zy5vZmZzZXQsXG4gICAgICAgIGxlbmd0aDogICAgICAgc3VnLmxlbmd0aCxcbiAgICAgICAgcnVsZTogICAgICAgICBzdWcucnVsZV9pZCB8fCAnJyxcbiAgICAgICAgb3V0Y29tZTogICAgICAncGVuZGluZycsXG4gICAgICAgIGZpbmFsOiAgICAgICAgc3VnLmZsYWdnZWQsXG4gICAgICB9O1xuICAgIH0pO1xuICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gIH0pO1xuXG4gIGh0bWwgKz0gYFxuICAgIDxkaXYgY2xhc3M9XCJuYXYtYnV0dG9uc1wiIHN0eWxlPVwibWFyZ2luOjI0cHggMDtcIj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJzdWJtaXQtYnRuXCIgb25jbGljaz1cInN1Ym1pdFNwZWxsQ2hlY2tEZWNpc2lvbnMoKVwiPkdlbmVyYXRlIFByZXZpZXcgXHUyMTkyPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIGA7XG4gIHJlc3VsdHMuaW5uZXJIVE1MID0gaHRtbDtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEFwcGx5IC8gZGlzbWlzcyBjb3JyZWN0aW9ucyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gYXBwbHlDdXN0b21TcGVsbENvcnJlY3Rpb24oc2VjdGlvbklkLCBpZHgpIHtcbiAgY29uc3Qga2V5ICAgID0gYCR7c2VjdGlvbklkfV8ke2lkeH1gO1xuICBjb25zdCBlbnRyeSAgPSAod2luZG93Ll9zcGVsbFN1Z01hcCB8fCB7fSlba2V5XTtcbiAgaWYgKCFlbnRyeSkgcmV0dXJuO1xuICBjb25zdCBpbnB1dCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgZWRpdF9zdWdfJHtzZWN0aW9uSWR9XyR7aWR4fWApO1xuICBjb25zdCBjdXN0b20gPSBpbnB1dCA/IGlucHV0LnZhbHVlLnRyaW0oKSA6ICcnO1xuICBpZiAoIWN1c3RvbSkgcmV0dXJuO1xuICBlbnRyeS5vdXRjb21lID0gJ2FjY2VwdCc7XG4gIGVudHJ5LmZpbmFsICAgPSBjdXN0b207XG4gIGNvbnN0IHN1Z0VsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgLnNwZWxsLXN1Z2dlc3Rpb25bZGF0YS1zZWN0aW9uLWlkPVwiJHtDU1MuZXNjYXBlKHNlY3Rpb25JZCl9XCJdW2RhdGEtaWR4PVwiJHtpZHh9XCJdYCk7XG4gIGlmICghc3VnRWwpIHJldHVybjtcbiAgY29uc3QgZmxhZ2dlZFNwYW4gPSBzdWdFbC5xdWVyeVNlbGVjdG9yKCdzcGFuW3N0eWxlKj1cImJhY2tncm91bmQ6I2ZlZTJlMlwiXScpO1xuICBpZiAoZmxhZ2dlZFNwYW4pIHtcbiAgICBmbGFnZ2VkU3Bhbi5vdXRlckhUTUwgPSBgPGRlbCBzdHlsZT1cImNvbG9yOiNkYzI2MjY7XCI+JHtlc2NhcGVIdG1sKGVudHJ5Lm9yaWdpbmFsKX08L2RlbD4gXHUyMTkyIDxpbnMgc3R5bGU9XCJjb2xvcjojMTY2NTM0O3RleHQtZGVjb3JhdGlvbjpub25lO1wiPiR7ZXNjYXBlSHRtbChjdXN0b20pfTwvaW5zPmA7XG4gIH1cbiAgc3VnRWwuc3R5bGUub3BhY2l0eSA9ICcwLjUnO1xufVxuXG5mdW5jdGlvbiBhcHBseVNwZWxsUmVwbGFjZW1lbnQoc2VjdGlvbklkLCBpZHgsIHJlcElkeCkge1xuICBjb25zdCBrZXkgID0gYCR7c2VjdGlvbklkfV8ke2lkeH1gO1xuICBjb25zdCBlbnRyeSA9ICh3aW5kb3cuX3NwZWxsU3VnTWFwIHx8IHt9KVtrZXldO1xuICBpZiAoIWVudHJ5KSByZXR1cm47XG4gIC8vIFRoZSByZXBsYWNlbWVudHMgbGlzdCBpcyBub3QgZGlyZWN0bHkgYWNjZXNzaWJsZSBoZXJlIFx1MjAxNCByZWFkIGZyb20gRE9NIHN1Z2dlc3Rpb25cbiAgY29uc3Qgc3VnRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuc3BlbGwtc3VnZ2VzdGlvbltkYXRhLXNlY3Rpb24taWQ9XCIke0NTUy5lc2NhcGUoc2VjdGlvbklkKX1cIl1bZGF0YS1pZHg9XCIke2lkeH1cIl1gKTtcbiAgaWYgKCFzdWdFbCkgcmV0dXJuO1xuICBjb25zdCBidXR0b25zID0gc3VnRWwucXVlcnlTZWxlY3RvckFsbCgnLnJld3JpdGUta2V5d29yZCcpO1xuICBjb25zdCByZXAgPSBidXR0b25zW3JlcElkeF0gPyBidXR0b25zW3JlcElkeF0udGV4dENvbnRlbnQudHJpbSgpIDogJyc7XG4gIGVudHJ5Lm91dGNvbWUgPSAnYWNjZXB0JztcbiAgZW50cnkuZmluYWwgICA9IHJlcDtcbiAgLy8gVmlzdWFsIGZlZWRiYWNrOiBzdHJpa2UgdGhlIGZsYWdnZWQgd29yZCwgc2hvdyByZXBsYWNlbWVudFxuICBjb25zdCBmbGFnZ2VkU3BhbiA9IHN1Z0VsLnF1ZXJ5U2VsZWN0b3IoJ3NwYW5bc3R5bGUqPVwiYmFja2dyb3VuZDojZmVlMmUyXCJdJyk7XG4gIGlmIChmbGFnZ2VkU3Bhbikge1xuICAgIGZsYWdnZWRTcGFuLm91dGVySFRNTCA9IGA8ZGVsIHN0eWxlPVwiY29sb3I6I2RjMjYyNjtcIj4ke2VzY2FwZUh0bWwoZW50cnkub3JpZ2luYWwpfTwvZGVsPiBcdTIxOTIgPGlucyBzdHlsZT1cImNvbG9yOiMxNjY1MzQ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7XCI+JHtlc2NhcGVIdG1sKHJlcCl9PC9pbnM+YDtcbiAgfVxuICBzdWdFbC5zdHlsZS5vcGFjaXR5ID0gJzAuNSc7XG59XG5cbmZ1bmN0aW9uIGRpc21pc3NTcGVsbFN1Z2dlc3Rpb24oc3VnSWQsIHNlY3Rpb25JZCwgaWR4LCB3b3JkKSB7XG4gIGNvbnN0IGtleSAgID0gYCR7c2VjdGlvbklkfV8ke2lkeH1gO1xuICBjb25zdCBlbnRyeSA9ICh3aW5kb3cuX3NwZWxsU3VnTWFwIHx8IHt9KVtrZXldO1xuICBpZiAoZW50cnkpIHsgZW50cnkub3V0Y29tZSA9ICdyZWplY3QnOyBlbnRyeS5maW5hbCA9IHdvcmQ7IH1cbiAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzdWdJZCk7XG4gIGlmIChlbCkgZWwuc3R5bGUub3BhY2l0eSA9ICcwLjQnO1xufVxuXG5hc3luYyBmdW5jdGlvbiBhZGRTcGVsbFdvcmQod29yZCwgc3VnSWQpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9jdXN0b20tZGljdGlvbmFyeScsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHdvcmQgfSlcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzdWdJZCk7XG4gICAgICBpZiAoZWwpIHtcbiAgICAgICAgZWwuc3R5bGUub3BhY2l0eSA9ICcwLjQnO1xuICAgICAgICBjb25zdCBtc2cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgbXNnLnN0eWxlLmNzc1RleHQgPSAnY29sb3I6IzE2NjUzNDtmb250LXNpemU6MC44NWVtO21hcmdpbi10b3A6NHB4Oyc7XG4gICAgICAgIG1zZy50ZXh0Q29udGVudCA9IGBcIiR7d29yZH1cIiBhZGRlZCB0byBkaWN0aW9uYXJ5LmA7XG4gICAgICAgIGVsLmFwcGVuZENoaWxkKG1zZyk7XG4gICAgICB9XG4gICAgICAvLyBBbHNvIHJlY29yZCBpbiBhdWRpdFxuICAgICAgY29uc3QgcGFydHMgPSBzdWdJZC5yZXBsYWNlKC9ec3VnXy8sICcnKS5zcGxpdCgnXycpO1xuICAgICAgY29uc3QgaWR4ID0gcGFyc2VJbnQocGFydHMucG9wKCksIDEwKTtcbiAgICAgIGNvbnN0IHNlY3Rpb25JZCA9IHBhcnRzLmpvaW4oJ18nKTtcbiAgICAgIGNvbnN0IGtleSA9IGAke3NlY3Rpb25JZH1fJHtpZHh9YDtcbiAgICAgIGNvbnN0IGVudHJ5ID0gKHdpbmRvdy5fc3BlbGxTdWdNYXAgfHwge30pW2tleV07XG4gICAgICBpZiAoZW50cnkpIHsgZW50cnkub3V0Y29tZSA9ICdhZGRfZGljdCc7IGVudHJ5LmZpbmFsID0gd29yZDsgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLmVycm9yKCdFcnJvciBhZGRpbmcgdG8gZGljdGlvbmFyeTonLCBlcnIpO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBQcmUtZ2VuZXJhdGlvbiBjb25maXJtYXRpb24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIF9jb25maXJtUHJvY2VlZFRvR2VuZXJhdGUoKSB7XG4gIC8vIEdhdGU6IHRhZ2xpbmUgbXVzdCBiZSBleHBsaWNpdGx5IGNvbmZpcm1lZCBiZWZvcmUgZ2VuZXJhdGluZ1xuICBjb25zdCBzdGF0dXMgPSBhd2FpdCBmZXRjaFN0YXR1cygpLmNhdGNoKCgpID0+ICh7fSkpO1xuICBpZiAoIXN0YXR1cz8uZGVjaXNpb25zX2NvbmZpcm1lZD8udGFnbGluZSkge1xuICAgIGF3YWl0IHNob3dBbGVydE1vZGFsKFxuICAgICAgJ1x1MjZBMCBUYWdsaW5lIE5vdCBDb25maXJtZWQnLFxuICAgICAgJ1lvdSBtdXN0IGNvbmZpcm0geW91ciBhcHBsaWNhbnQgdGFnbGluZSBiZWZvcmUgZ2VuZXJhdGluZy5cXG5cXG5HbyB0byB0aGUgXHVEODNDXHVERkY3XHVGRTBGIFRhZ2xpbmUgdGFiIGluIEN1c3RvbWl6YXRpb25zIHRvIGNvbmZpcm0gaXQuJ1xuICAgICk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IGF0c1Njb3JlID0gc3RhdGVNYW5hZ2VyLmdldEF0c1Njb3JlKCk7XG4gIGNvbnN0IGZyZXNobmVzcyA9IHN0YXRlTWFuYWdlci5nZXRMYXlvdXRGcmVzaG5lc3MoKTtcbiAgY29uc3QgZ2VuU3RhdGUgPSBzdGF0ZU1hbmFnZXIuZ2V0R2VuZXJhdGlvblN0YXRlKCk7XG4gIGNvbnN0IGRlY2lzaW9uc0NvbmZpcm1lZCA9IHN0YXR1cz8uZGVjaXNpb25zX2NvbmZpcm1lZCB8fCB7fTtcbiAgY29uc3QgbGluZXMgPSBbJ1lvdXIgQ1YgaXMgcmVhZHkgdG8gZ2VuZXJhdGUuJ107XG4gIGlmIChhdHNTY29yZSAhPT0gbnVsbCAmJiBhdHNTY29yZSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBhdHNTY29yZS5vdmVyYWxsID09PSAnbnVtYmVyJykge1xuICAgIGxpbmVzLnB1c2goYEN1cnJlbnQgQVRTIHNjb3JlOiAke01hdGgucm91bmQoYXRzU2NvcmUub3ZlcmFsbCl9JWApO1xuICB9XG4gIGlmIChnZW5TdGF0ZS5wYWdlV2FybmluZykge1xuICAgIGNvbnN0IHBjID0gZ2VuU3RhdGUucGFnZUNvdW50RXhhY3QgPz8gZ2VuU3RhdGUucGFnZUNvdW50RXN0aW1hdGU7XG4gICAgY29uc3QgcGNMYWJlbCA9IHBjICE9PSBudWxsID8gKGdlblN0YXRlLnBhZ2VDb3VudEV4YWN0ICE9PSBudWxsID8gYCR7cGN9YCA6IGB+JHtwY31gKSA6IG51bGw7XG4gICAgY29uc3Qgb2tQYWdlID0gYXdhaXQgc2hvd0NvbmZpcm1Nb2RhbChcbiAgICAgICdcdTI2QTAgUGFnZSBDb3VudCBPdXQgb2YgUmFuZ2UnLFxuICAgICAgYFRoZSBDViBpcyBlc3RpbWF0ZWQgYXQgJHtwY0xhYmVsID8gYCR7cGNMYWJlbH0gcGFnZSR7cGMgIT09IDEgPyAncycgOiAnJ31gIDogJ2FuIHVudXN1YWwgcGFnZSBjb3VudCd9LCB3aGljaCBpcyBvdXRzaWRlIHRoZSByZWNvbW1lbmRlZCByYW5nZSBmb3IgYSBzZW5pb3IgY2FuZGlkYXRlICgyXHUyMDEzMyBwYWdlcykuXFxuXFxuQ29uc2lkZXIgYWRqdXN0aW5nIHlvdXIgbGF5b3V0IGluc3RydWN0aW9ucyBiZWZvcmUgZ2VuZXJhdGluZy5cXG5cXG5Qcm9jZWVkIGFueXdheT9gLFxuICAgICAgJ0dlbmVyYXRlIEFueXdheSdcbiAgICApO1xuICAgIGlmICghb2tQYWdlKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGZyZXNobmVzcy5pc1N0YWxlKSB7XG4gICAgbGluZXMucHVzaChgXHUyNkEwICR7ZnJlc2huZXNzLmFyaWFMYWJlbH1gKTtcbiAgfVxuICBjb25zdCByZXZpZXdlZFNlY3Rpb25zID0gWydleHBlcmllbmNlcycsICdza2lsbHMnLCAnYWNoaWV2ZW1lbnRzJ10uZmlsdGVyKGsgPT4gZGVjaXNpb25zQ29uZmlybWVkW2tdKTtcbiAgaWYgKHJldmlld2VkU2VjdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgbGluZXMucHVzaCgnXHUyNkEwIE5vIGN1c3RvbWlzYXRpb24gc2VjdGlvbnMgcmV2aWV3ZWQgXHUyMDE0IGV4cGVyaWVuY2UsIHNraWxsLCBhbmQgYWNoaWV2ZW1lbnQgc2VsZWN0aW9ucyBhcmUgYWxsIExMTSBkZWZhdWx0cy4nKTtcbiAgfVxuICBsZXQgd2Vha0J1bGxldENvdW50ID0gMCwgcGFzc2l2ZUJ1bGxldENvdW50ID0gMDtcbiAgT2JqZWN0LnZhbHVlcyh3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0cyB8fCB7fSkuZm9yRWFjaChsaXN0ID0+IHtcbiAgICAobGlzdCB8fCBbXSkuZm9yRWFjaChlID0+IHtcbiAgICAgIGNvbnN0IHR4dCA9IHR5cGVvZiBlID09PSAnc3RyaW5nJyA/IGUgOiAoKGUgJiYgZS50ZXh0KSB8fCAnJyk7XG4gICAgICBpZiAoIXR4dC50cmltKCkgfHwgKGUgJiYgZS5oaWRkZW4pKSByZXR1cm47XG4gICAgICBjb25zdCB3YXJuID0gdHlwZW9mIF9hY2hWZXJiV2FybmluZyA9PT0gJ2Z1bmN0aW9uJyA/IF9hY2hWZXJiV2FybmluZyh0eHQpIDogbnVsbDtcbiAgICAgIGlmICh3YXJuPy5sZXZlbCA9PT0gJ3Bhc3NpdmUnKSBwYXNzaXZlQnVsbGV0Q291bnQrKztcbiAgICAgIGVsc2UgaWYgKHdhcm4/LmxldmVsID09PSAnd2VhaycpIHdlYWtCdWxsZXRDb3VudCsrO1xuICAgIH0pO1xuICB9KTtcbiAgaWYgKHdlYWtCdWxsZXRDb3VudCA+IDAgfHwgcGFzc2l2ZUJ1bGxldENvdW50ID4gMCkge1xuICAgIGNvbnN0IHBhcnRzID0gW107XG4gICAgaWYgKHBhc3NpdmVCdWxsZXRDb3VudCA+IDApIHBhcnRzLnB1c2goYCR7cGFzc2l2ZUJ1bGxldENvdW50fSB3aXRoIHBhc3NpdmUgdm9pY2VgKTtcbiAgICBpZiAod2Vha0J1bGxldENvdW50ID4gMCkgcGFydHMucHVzaChgJHt3ZWFrQnVsbGV0Q291bnR9IHdpdGggd2VhayBvcGVuaW5nIHZlcmIke3dlYWtCdWxsZXRDb3VudCAhPT0gMSA/ICdzJyA6ICcnfWApO1xuICAgIGxpbmVzLnB1c2goYFx1MjZBMCAke3BhcnRzLmpvaW4oJywgJyl9IGluIGV4cGVyaWVuY2UgYnVsbGV0cyBcdTIwMTQgY29uc2lkZXIgQUkgcmV3cml0ZXMgaW4gdGhlIEV4cGVyaWVuY2UgQnVsbGV0cyBlZGl0b3IuYCk7XG4gIH1cbiAgbGluZXMucHVzaCgnXFxuUHJvY2VlZD8nKTtcbiAgcmV0dXJuIHNob3dDb25maXJtTW9kYWwoJ1x1RDgzRFx1RENDNCBQcm9jZWVkIHRvIEdlbmVyYXRlPycsIGxpbmVzLmpvaW4oJ1xcbicpLCAnR2VuZXJhdGUgTm93Jyk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBTdWJtaXQgYXVkaXQgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIHN1Ym1pdFNwZWxsQ2hlY2tEZWNpc2lvbnMoKSB7XG4gIC8qIGR1Y2tmbG93OlxuICAgKiAgIGlkOiBzcGVsbF91aV9zdWJtaXRfbGl2ZVxuICAgKiAgIGtpbmQ6IHVpXG4gICAqICAgdGltZXN0YW1wOiAnMjAyNi0wNC0yMVQxODowMDowMFonXG4gICAqICAgc3RhdHVzOiBsaXZlXG4gICAqICAgaGFuZGxlczpcbiAgICogICAtIHVpOnNwZWxsLWNoZWNrLnN1Ym1pdFxuICAgKiAgIGNhbGxzOlxuICAgKiAgIC0gUE9TVCAvYXBpL3NwZWxsLWNoZWNrLWNvbXBsZXRlXG4gICAqICAgLSBQT1NUIC9hcGkvYWN0aW9uXG4gICAqICAgcmVhZHM6XG4gICAqICAgLSB3aW5kb3c6X3NwZWxsU3VnTWFwXG4gICAqICAgd3JpdGVzOlxuICAgKiAgIC0gcmVxdWVzdDpQT1NUIC9hcGkvc3BlbGwtY2hlY2stY29tcGxldGUuc3BlbGxfYXVkaXRcbiAgICogICAtIHdpbmRvdzpzcGVsbEF1ZGl0XG4gICAqICAgbm90ZXM6IENvbGxhcHNlcyByZXZpZXdlZCBzcGVsbCBzdWdnZXN0aW9ucyBpbnRvIHRoZSBjYW5vbmljYWwgc3BlbGwgYXVkaXQsIHBlcnNpc3RzIHRoYXQgYXVkaXQgaW4gc2Vzc2lvbiBzdGF0ZSwgc2hvd3MgYSBwcmUtZ2VuZXJhdGlvbiBjb25maXJtYXRpb24gbW9kYWwsIGFuZCB0aGVuIHRyaWdnZXJzIGdlbmVyYXRpb24gdXNpbmcgdGhlIGNvcnJlY3RlZCBjb250ZW50LlxuICAgKi9cbiAgLy8gQ291bnQgaXRlbXMgc3RpbGwgbWFya2VkICdwZW5kaW5nJyAobm90IGV4cGxpY2l0bHkgcmV2aWV3ZWQpXG4gIGNvbnN0IHBlbmRpbmdFbnRyaWVzID0gT2JqZWN0LnZhbHVlcyh3aW5kb3cuX3NwZWxsU3VnTWFwIHx8IHt9KS5maWx0ZXIoZSA9PiBlLm91dGNvbWUgPT09ICdwZW5kaW5nJyk7XG4gIGlmIChwZW5kaW5nRW50cmllcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgbiA9IHBlbmRpbmdFbnRyaWVzLmxlbmd0aDtcbiAgICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCBzaG93Q29uZmlybU1vZGFsKFxuICAgICAgJ1x1MjZBMCBVbnJldmlld2VkIElzc3VlcycsXG4gICAgICBgJHtufSBpc3N1ZSR7biAhPT0gMSA/ICdzIGhhdmUnIDogJyBoYXMnfSBub3QgYmVlbiByZXZpZXdlZCBhbmQgd2lsbCBiZSBpZ25vcmVkLlxcblByb2NlZWQgYW55d2F5P2AsXG4gICAgICAnUHJvY2VlZCdcbiAgICApO1xuICAgIGlmICghY29uZmlybWVkKSByZXR1cm47XG4gIH1cblxuICAvLyBDb2xsZWN0IGF1ZGl0IGZyb20gX3NwZWxsU3VnTWFwXG4gIGNvbnN0IGF1ZGl0ID0gT2JqZWN0LnZhbHVlcyh3aW5kb3cuX3NwZWxsU3VnTWFwIHx8IHt9KS5maWx0ZXIoZSA9PiBlLm91dGNvbWUgIT09ICdwZW5kaW5nJyk7XG4gIC8vIFJlbWFpbmluZyAncGVuZGluZycgaXRlbXMgYXJlIGV4cGxpY2l0bHkgYXV0by1pZ25vcmVkIGFmdGVyIGNvbmZpcm1hdGlvbiBhYm92ZVxuICBPYmplY3QudmFsdWVzKHdpbmRvdy5fc3BlbGxTdWdNYXAgfHwge30pLmZvckVhY2goZSA9PiB7XG4gICAgaWYgKGUub3V0Y29tZSA9PT0gJ3BlbmRpbmcnKSB7IGUub3V0Y29tZSA9ICdpZ25vcmUnOyBhdWRpdC5wdXNoKGUpOyB9XG4gIH0pO1xuICBzcGVsbEF1ZGl0ID0gYXVkaXQ7XG5cbiAgY29uc3QgbG9hZGluZ01zZyA9IGFwcGVuZExvYWRpbmdNZXNzYWdlKCdTYXZpbmcgc3BlbGwgY2hlY2sgZGVjaXNpb25zXHUyMDI2Jyk7XG4gIHNldExvYWRpbmcodHJ1ZSwgJ1NhdmluZyBzcGVsbC1jaGVjayBkZWNpc2lvbnNcdTIwMjYnKTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvc3BlbGwtY2hlY2stY29tcGxldGUnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBzcGVsbF9hdWRpdDogc3BlbGxBdWRpdCB9KVxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIHJlbW92ZUxvYWRpbmdNZXNzYWdlKGxvYWRpbmdNc2cpO1xuICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgIGlmICghcmVzLm9rKSB7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgYEZhaWxlZCB0byBzYXZlIHNwZWxsIGNoZWNrOiAke2RhdGEuZXJyb3IgfHwgJ1Vua25vd24gZXJyb3InfWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzdGF0ZU1hbmFnZXIubWFya0NvbnRlbnRDaGFuZ2VkKCk7XG4gICAgY29uc3QgcHJvY2VlZCA9IGF3YWl0IF9jb25maXJtUHJvY2VlZFRvR2VuZXJhdGUoKTtcbiAgICBpZiAoIXByb2NlZWQpIHJldHVybjtcbiAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCBgXHUyNzA1IFNwZWxsIGNoZWNrIGNvbXBsZXRlIFx1MjAxNCAke3NwZWxsQXVkaXQubGVuZ3RofSBpdGVtJHtzcGVsbEF1ZGl0Lmxlbmd0aCAhPT0gMSA/ICdzJyA6ICcnfSByZXZpZXdlZC4gR2VuZXJhdGluZyB5b3VyIENWXHUyMDI2YCk7XG4gICAgc2NoZWR1bGVBdHNSZWZyZXNoKCdyZXZpZXdfY2hlY2twb2ludCcpO1xuICAgIGF3YWl0IGZldGNoU3RhdHVzKCk7XG4gICAgYXdhaXQgc2VuZEFjdGlvbignZ2VuZXJhdGVfY3YnKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmVtb3ZlTG9hZGluZ01lc3NhZ2UobG9hZGluZ01zZyk7XG4gICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsIGBTcGVsbCBjaGVjayBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgRXhwb3J0cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZXhwb3J0IHtcbiAgc3BlbGxBdWRpdCxcbiAgcG9wdWxhdGVTcGVsbENoZWNrVGFiLFxuICByZW5kZXJTcGVsbENoZWNrWmVyb1N0YXRlLFxuICBzdWJtaXRFbXB0eVNwZWxsQ2hlY2ssXG4gIGJ1aWxkU3BlbGxTdGF0c1N1bW1hcnksXG4gIHJlbmRlclNwZWxsU3VnZ2VzdGlvbnMsXG4gIGFwcGx5Q3VzdG9tU3BlbGxDb3JyZWN0aW9uLFxuICBhcHBseVNwZWxsUmVwbGFjZW1lbnQsXG4gIGRpc21pc3NTcGVsbFN1Z2dlc3Rpb24sXG4gIGFkZFNwZWxsV29yZCxcbiAgc3VibWl0U3BlbGxDaGVja0RlY2lzaW9ucyxcbn07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9kb3dubG9hZC10YWIuanNcbiAqIEZpbGUgUmV2aWV3IHRhYjogQVRTIHZhbGlkYXRpb24sIGdlbmVyYXRlZC1maWxlIGRvd25sb2FkcywgcGVyc3Vhc2lvbiBjaGVjayxcbiAqIGFuZCByZWZpbmVtZW50IHNob3J0Y3V0cy5cbiAqXG4gKiBEZXBlbmRlbmNpZXMgKHJlc29sdmVkIHRocm91Z2ggZ2xvYmFsVGhpcyBhdCBydW50aW1lKTpcbiAqICAgZXNjYXBlSHRtbCwgYmFja1RvUGhhc2VcbiAqL1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5jb25zdCBsb2cgPSBnZXRMb2dnZXIoJ2Rvd25sb2FkLXRhYicpO1xuXG5pbXBvcnQgeyBzdGF0ZU1hbmFnZXIgfSBmcm9tICcuL3N0YXRlLW1hbmFnZXIuanMnO1xuXG5mdW5jdGlvbiBfY29sbGVjdERvd25sb2FkYWJsZUZpbGVzKGN2RGF0YSA9IHt9KSB7XG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0KCk7XG4gIGNvbnN0IGZpbGVzID0gW107XG4gIGNvbnN0IHJhd0ZpbGVzID0gQXJyYXkuaXNBcnJheShjdkRhdGEuZmlsZXMpID8gY3ZEYXRhLmZpbGVzIDogW107XG4gIGNvbnN0IGNhbmRpZGF0ZUZpbGVzID0gW1xuICAgIC4uLnJhd0ZpbGVzLFxuICAgIGN2RGF0YS5maW5hbF9odG1sLFxuICAgIGN2RGF0YS5maW5hbF9wZGYsXG4gICAgY3ZEYXRhLmh0bWwsXG4gICAgY3ZEYXRhLnBkZixcbiAgICBjdkRhdGEuZG9jeCxcbiAgICBjdkRhdGEuYXRzX2RvY3gsXG4gIF0uZmlsdGVyKEJvb2xlYW4pO1xuXG4gIGZvciAoY29uc3QgZmlsZW5hbWUgb2YgY2FuZGlkYXRlRmlsZXMpIHtcbiAgICBpZiAoc2Vlbi5oYXMoZmlsZW5hbWUpKSBjb250aW51ZTtcbiAgICBzZWVuLmFkZChmaWxlbmFtZSk7XG5cbiAgICBsZXQgaWNvbiA9ICdcdUQ4M0RcdURDQzEnO1xuICAgIGxldCBkZXNjcmlwdGlvbiA9ICdHZW5lcmF0ZWQgZmlsZSc7XG4gICAgbGV0IGZvcm1hdCA9ICdvdGhlcic7XG5cbiAgICBpZiAoZmlsZW5hbWUuZW5kc1dpdGgoJy5wZGYnKSkge1xuICAgICAgaWNvbiA9IGZpbGVuYW1lLmluY2x1ZGVzKCdBVFMnKSA/ICdcdUQ4M0VcdUREMTYnIDogJ1x1RDgzRFx1RENDNCc7XG4gICAgICBkZXNjcmlwdGlvbiA9IGZpbGVuYW1lLmluY2x1ZGVzKCdBVFMnKVxuICAgICAgICA/ICdBVFMtb3B0aW1pc2VkIFBERiBcdTIwMTQgbWFjaGluZS1yZWFkYWJsZSBmb3IgYXV0b21hdGVkIHNjcmVlbmluZydcbiAgICAgICAgOiAnSHVtYW4tcmVhZGFibGUgUERGIFx1MjAxNCBmb3IgaHVtYW4gcmV2aWV3ZXJzIGFuZCBwcmludGluZyc7XG4gICAgICBmb3JtYXQgPSAncGRmJztcbiAgICB9IGVsc2UgaWYgKGZpbGVuYW1lLmVuZHNXaXRoKCcuZG9jeCcpKSB7XG4gICAgICBpY29uID0gJ1x1RDgzRFx1RENERCc7XG4gICAgICBpZiAoZmlsZW5hbWUuc3RhcnRzV2l0aCgnQ292ZXJMZXR0ZXJfJykpIHtcbiAgICAgICAgZGVzY3JpcHRpb24gPSAnQ292ZXIgbGV0dGVyIFx1MjAxNCBXb3JkIGRvY3VtZW50IGZvciB0aGUgYXBwbGljYXRpb24nO1xuICAgICAgfSBlbHNlIGlmIChmaWxlbmFtZS5zdGFydHNXaXRoKCdTY3JlZW5pbmdfJykpIHtcbiAgICAgICAgZGVzY3JpcHRpb24gPSAnU2NyZWVuaW5nIHF1ZXN0aW9uIHJlc3BvbnNlcyBcdTIwMTQgV29yZCBkb2N1bWVudCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZXNjcmlwdGlvbiA9IGZpbGVuYW1lLmluY2x1ZGVzKCdBVFMnKVxuICAgICAgICAgID8gJ0FUUy1vcHRpbWlzZWQgV29yZCBkb2N1bWVudCBcdTIwMTQga2V5d29yZC1vcHRpbWlzZWQgZm9yIGpvYiBhcHBsaWNhdGlvbnMnXG4gICAgICAgICAgOiAnSHVtYW4tcmVhZGFibGUgV29yZCBkb2N1bWVudCBcdTIwMTQgZWRpdGFibGUgZm9ybWF0JztcbiAgICAgIH1cbiAgICAgIGZvcm1hdCA9ICdkb2N4JztcbiAgICB9IGVsc2UgaWYgKGZpbGVuYW1lLmVuZHNXaXRoKCcuaHRtbCcpKSB7XG4gICAgICBpY29uID0gJ1x1RDgzQ1x1REYxMCc7XG4gICAgICBjb25zdCBpc1ByZXZpZXcgPSAvcHJldmlldy9pLnRlc3QoZmlsZW5hbWUpO1xuICAgICAgZGVzY3JpcHRpb24gPSBpc1ByZXZpZXdcbiAgICAgICAgPyAnTGF5b3V0IHByZXZpZXcgXHUyMDE0IGludGVybWVkaWF0ZSB3b3JraW5nIGZpbGUsIG5vdCBmb3Igc3VibWlzc2lvbidcbiAgICAgICAgOiAnSFRNTCBmb3JtYXQgd2l0aCBlbWJlZGRlZCBKU09OLUxEIHN0cnVjdHVyZWQgZGF0YSc7XG4gICAgICBmb3JtYXQgPSBpc1ByZXZpZXcgPyAncHJldmlldycgOiAnaHRtbCc7XG4gICAgfSBlbHNlIGlmIChmaWxlbmFtZSA9PT0gJ2pvYl9kZXNjcmlwdGlvbi50eHQnKSB7XG4gICAgICBpY29uID0gJ1x1RDgzRFx1RENDQic7XG4gICAgICBkZXNjcmlwdGlvbiA9ICdPcmlnaW5hbCBqb2IgZGVzY3JpcHRpb24gcmVmZXJlbmNlJztcbiAgICB9XG5cbiAgICBmaWxlcy5wdXNoKHsgZmlsZW5hbWUsIGRlc2NyaXB0aW9uLCBpY29uLCBmb3JtYXQgfSk7XG4gIH1cblxuICByZXR1cm4gZmlsZXM7XG59XG5cbmZ1bmN0aW9uIF9yZW5kZXJWYWxpZGF0aW9uU3VtbWFyeShjaGVja3MsIHN1bW1hcnksIHBhZ2VDb3VudCwgYXRzRXJyb3IpIHtcbiAgbGV0IGh0bWwgPSAnJztcblxuICBpZiAocGFnZUNvdW50ICE9PSBudWxsKSB7XG4gICAgY29uc3QgcGFnZVdhcm5pbmcgPSBwYWdlQ291bnQgPCAxLjUgfHwgcGFnZUNvdW50ID4gMztcbiAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwiZGlzcGxheTppbmxpbmUtZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDtcbiAgICAgICAgICAgICAgYmFja2dyb3VuZDoke3BhZ2VXYXJuaW5nID8gJyNmZWY5YzMnIDogJyNmMGZkZjQnfTtcbiAgICAgICAgICAgICAgYm9yZGVyOjFweCBzb2xpZCAke3BhZ2VXYXJuaW5nID8gJyNmZGUwNDcnIDogJyNiYmY3ZDAnfTtcbiAgICAgICAgICAgICAgYm9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzo4cHggMTRweDttYXJnaW4tYm90dG9tOjE2cHg7XCI+XG4gICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZToxLjNlbTtcIj5cdUQ4M0RcdURDQzQ8L3NwYW4+XG4gICAgICA8c3Ryb25nPiR7cGFnZUNvdW50fSBwYWdlJHtwYWdlQ291bnQgIT09IDEgPyAncycgOiAnJ308L3N0cm9uZz5cbiAgICAgICR7cGFnZVdhcm5pbmdcbiAgICAgICAgPyAnPHNwYW4gc3R5bGU9XCJjb2xvcjojZDk3NzA2O2ZvbnQtc2l6ZTowLjg4ZW07XCI+XHUyNkEwIFNlbmlvciBjYW5kaWRhdGUgdGFyZ2V0IGlzIDJcdTIwMTMzIHBhZ2VzPC9zcGFuPidcbiAgICAgICAgOiAnPHNwYW4gc3R5bGU9XCJjb2xvcjojMTY2NTM0O2ZvbnQtc2l6ZTowLjg4ZW07XCI+XHUyNzEzIEdvb2QgbGVuZ3RoPC9zcGFuPid9XG4gICAgPC9kaXY+YDtcbiAgfVxuXG4gIGlmIChhdHNFcnJvcikge1xuICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZWUyZTI7Ym9yZGVyOjFweCBzb2xpZCAjZmNhNWE1O2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MTJweCAxNnB4O21hcmdpbi1ib3R0b206MjBweDtcIj5cbiAgICAgIDxzdHJvbmc+XHUyNkEwIEFUUyB2YWxpZGF0aW9uIGVycm9yOjwvc3Ryb25nPiAke2VzY2FwZUh0bWwoYXRzRXJyb3IpfVxuICAgIDwvZGl2PmA7XG4gICAgcmV0dXJuIGh0bWw7XG4gIH1cblxuICBpZiAoIWNoZWNrcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gaHRtbDtcbiAgfVxuXG4gIGNvbnN0IGtleXdvcmRGYWlsID0gY2hlY2tzLnNvbWUoKGNoZWNrKSA9PiBjaGVjay5uYW1lID09PSAnYXRzX2tleXdvcmRfcHJlc2VuY2UnICYmIGNoZWNrLnN0YXR1cyA9PT0gJ2ZhaWwnKTtcbiAgY29uc3Qgc3RhdHVzQ29sb3VyID0gc3VtbWFyeS5mYWlsID4gMCA/ICcjZGMyNjI2JyA6IHN1bW1hcnkud2FybiA+IDAgPyAnI2Q5NzcwNicgOiAnIzE2NjUzNCc7XG4gIGNvbnN0IHN0YXR1c0ljb24gPSBzdW1tYXJ5LmZhaWwgPiAwID8gJ1x1Mjc0QycgOiBzdW1tYXJ5Lndhcm4gPiAwID8gJ1x1MjZBMCcgOiAnXHUyNzA1JztcblxuICBodG1sICs9IGBcbiAgICA8ZGV0YWlscyBvcGVuIHN0eWxlPVwibWFyZ2luLWJvdHRvbToyMHB4O1wiPlxuICAgICAgPHN1bW1hcnkgc3R5bGU9XCJjdXJzb3I6cG9pbnRlcjtmb250LXdlaWdodDo3MDA7Zm9udC1zaXplOjFlbTtwYWRkaW5nOjhweCAwO2NvbG9yOiR7c3RhdHVzQ29sb3VyfTtcIj5cbiAgICAgICAgJHtzdGF0dXNJY29ufSBBVFMgUmVwb3J0IFx1MjAxNCAke3N1bW1hcnkucGFzc30gcGFzcywgJHtzdW1tYXJ5Lndhcm59IHdhcm4sICR7c3VtbWFyeS5mYWlsfSBmYWlsXG4gICAgICA8L3N1bW1hcnk+XG4gICAgICA8dGFibGUgY2xhc3M9XCJyZXZpZXctdGFibGVcIiBzdHlsZT1cIm1hcmdpbi10b3A6MTBweDtmb250LXNpemU6MC44N2VtO1wiPlxuICAgICAgICA8dGhlYWQ+PHRyPjx0aD5DaGVjazwvdGg+PHRoPkZvcm1hdDwvdGg+PHRoPlN0YXR1czwvdGg+PHRoPkRldGFpbDwvdGg+PC90cj48L3RoZWFkPlxuICAgICAgICA8dGJvZHk+YDtcblxuICBmb3IgKGNvbnN0IGNoZWNrIG9mIGNoZWNrcykge1xuICAgIGNvbnN0IGJhY2tncm91bmQgPSBjaGVjay5zdGF0dXMgPT09ICdwYXNzJyA/ICcjZjBmZGY0JyA6IGNoZWNrLnN0YXR1cyA9PT0gJ3dhcm4nID8gJyNmZWY5YzMnIDogJyNmZWUyZTInO1xuICAgIGNvbnN0IGljb24gPSBjaGVjay5zdGF0dXMgPT09ICdwYXNzJyA/ICdcdTI3MDUnIDogY2hlY2suc3RhdHVzID09PSAnd2FybicgPyAnXHUyNkEwJyA6ICdcdTI3NEMnO1xuICAgIGNvbnN0IGZvcm1hdEJhZGdlID0gYDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjExcHg7YmFja2dyb3VuZDojZTBlN2ZmO2NvbG9yOiMzNzMwYTM7Ym9yZGVyLXJhZGl1czo2cHg7cGFkZGluZzoxcHggNXB4O1wiPiR7ZXNjYXBlSHRtbChjaGVjay5mb3JtYXQpfTwvc3Bhbj5gO1xuXG4gICAgaHRtbCArPSBgPHRyIHN0eWxlPVwiYmFja2dyb3VuZDoke2JhY2tncm91bmR9O1wiPlxuICAgICAgPHRkIHN0eWxlPVwiZm9udC13ZWlnaHQ6NjAwO1wiPiR7ZXNjYXBlSHRtbChjaGVjay5sYWJlbCl9PC90ZD5cbiAgICAgIDx0ZD4ke2Zvcm1hdEJhZGdlfTwvdGQ+XG4gICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjtcIj4ke2ljb259PC90ZD5cbiAgICAgIDx0ZD48c21hbGw+JHtlc2NhcGVIdG1sKGNoZWNrLmRldGFpbCl9PC9zbWFsbD48L3RkPlxuICAgIDwvdHI+YDtcbiAgfVxuXG4gIGh0bWwgKz0gJzwvdGJvZHk+PC90YWJsZT48L2RldGFpbHM+JztcblxuICBpZiAoc3VtbWFyeS5mYWlsID4gMCkge1xuICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZWUyZTI7Ym9yZGVyOjFweCBzb2xpZCAjZmNhNWE1O2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MTBweCAxNnB4O21hcmdpbi1ib3R0b206MjBweDtcIj5cbiAgICAgIDxzdHJvbmc+XHUyNzRDIEZpeCByZXF1aXJlZDo8L3N0cm9uZz4gU29tZSBjaGVja3MgZmFpbGVkLiBCbG9ja2VkIGZvcm1hdHMgYXJlIGdyZXllZCBvdXQgYmVsb3cuXG4gICAgICAke2tleXdvcmRGYWlsXG4gICAgICAgID8gJzxicj48c3Ryb25nPkFUUyBrZXl3b3JkIGZhaWx1cmUgYmxvY2tzIGFsbCBkb3dubG9hZHM8L3N0cm9uZz4gXHUyMDE0IHJlLXJ1biBjdXN0b21pc2F0aW9ucyB0byBpbXByb3ZlIGtleXdvcmQgY292ZXJhZ2UuJ1xuICAgICAgICA6ICcnfVxuICAgIDwvZGl2PmA7XG4gIH1cblxuICByZXR1cm4gaHRtbDtcbn1cblxuLy8gQ2hlY2tzIHRoYXQgYXJlIGFkdmlzb3J5IG9ubHkgXHUyMDE0IHRoZXkgd2FybiBidXQgbmV2ZXIgYmxvY2sgdGhlIGRvd25sb2FkIGJ1dHRvbi5cbi8vIE9ubHkgZ2VudWluZWx5IGNyaXRpY2FsIGZhaWx1cmVzIChmaWxlIG5vdCBmb3VuZCwgUERGIHVucmVhZGFibGUsIGJyb2tlbiBvdXRwdXQpXG4vLyBzaG91bGQgcHJldmVudCBhIHVzZXIgZnJvbSBkb3dubG9hZGluZy5cbmNvbnN0IF9OT05fQkxPQ0tJTkdfQ0hFQ0tTID0gbmV3IFNldChbXG4gICdjdl9wYWdlX2NvdW50JywgICAgICAgICAgICAgICAvLyBhZHZpc29yeTogcGFnZSBsZW5ndGggb3V0c2lkZSBpZGVhbCByYW5nZVxuICAncGRmX3VzX2xldHRlcicsICAgICAgICAgICAgICAgLy8gYWR2aXNvcnk6IHBhZ2Ugc2l6ZVxuICAnZG9jeF96ZXJvX3NoYXBlcycsICAgICAgICAgICAgLy8gYWR2aXNvcnk6IEFUUyBmb3JtYXR0aW5nIGhpbnRcbiAgJ2RvY3hfc3RhbmRhcmRfaGVhZGluZ3MnLCAgICAgIC8vIGFkdmlzb3J5OiBBVFMgaGVhZGluZyB0ZXh0XG4gICdkb2N4X2hlYWRpbmcxX3ByZXNlbnQnLCAgICAgICAvLyBhZHZpc29yeTogQVRTIGhlYWRpbmcgc3R5bGVcbiAgJ2RvY3hfZGF0ZV9mb3JtYXRfY29uc2lzdGVudCcsIC8vIGFkdmlzb3J5OiBkYXRlIGZvcm1hdCBjb25zaXN0ZW5jeVxuICAnZG9jeF9wdWJsaWNhdGlvbnNfaGVhZGluZycsICAgLy8gYWR2aXNvcnk6IHB1YmxpY2F0aW9ucyBoZWFkaW5nIHRleHRcbiAgJ2h0bWxfanNvbmxkX3ZhbGlkX3BlcnNvbicsICAgIC8vIGFkdmlzb3J5OiBKU09OLUxEIHNjaGVtYSB0eXBlXG4gICdodG1sX2pzb25sZF9rbm93c19hYm91dCcsICAgICAvLyBhZHZpc29yeTogSlNPTi1MRCBza2lsbHMgcG9wdWxhdGlvblxuXSk7XG5cbmZ1bmN0aW9uIF9yZW5kZXJEb3dubG9hZEdyaWQoZmlsZXMsIGNoZWNrcywgc3VtbWFyeSwgZ2VuZXJhdGVkQXQgPSBudWxsLCBnZW5lcmF0aW9uUnVuID0gbnVsbCkge1xuICBjb25zdCBrZXl3b3JkRmFpbCA9IGNoZWNrcy5zb21lKChjaGVjaykgPT4gY2hlY2submFtZSA9PT0gJ2F0c19rZXl3b3JkX3ByZXNlbmNlJyAmJiBjaGVjay5zdGF0dXMgPT09ICdmYWlsJyk7XG4gIGNvbnN0IGlzQ3JpdGljYWxGYWlsID0gKGNoZWNrKSA9PiBjaGVjay5zdGF0dXMgPT09ICdmYWlsJyAmJiAhX05PTl9CTE9DS0lOR19DSEVDS1MuaGFzKGNoZWNrLm5hbWUpO1xuICBjb25zdCBibG9ja0RvY3ggPSBrZXl3b3JkRmFpbCB8fCBjaGVja3Muc29tZSgoY2hlY2spID0+IGNoZWNrLmZvcm1hdCA9PT0gJ2RvY3gnICYmIGlzQ3JpdGljYWxGYWlsKGNoZWNrKSk7XG4gIGNvbnN0IGJsb2NrSHRtbCA9IGtleXdvcmRGYWlsIHx8IGNoZWNrcy5zb21lKChjaGVjaykgPT4gY2hlY2suZm9ybWF0ID09PSAnaHRtbCcgJiYgaXNDcml0aWNhbEZhaWwoY2hlY2spKTtcbiAgY29uc3QgYmxvY2tQZGYgID0ga2V5d29yZEZhaWwgfHwgY2hlY2tzLnNvbWUoKGNoZWNrKSA9PiBjaGVjay5mb3JtYXQgPT09ICdwZGYnICAmJiBpc0NyaXRpY2FsRmFpbChjaGVjaykpO1xuXG4gIGxldCBnZW5lcmF0ZWRMYWJlbCA9ICcnO1xuICBpZiAoZ2VuZXJhdGVkQXQpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZCA9IG5ldyBEYXRlKGdlbmVyYXRlZEF0KTtcbiAgICAgIGNvbnN0IGRhdGVTdHIgPSBkLnRvTG9jYWxlU3RyaW5nKCdlbi1VUycsIHtcbiAgICAgICAgbW9udGg6ICdzaG9ydCcsIGRheTogJ251bWVyaWMnLCB5ZWFyOiAnbnVtZXJpYycsXG4gICAgICAgIGhvdXI6ICdudW1lcmljJywgbWludXRlOiAnMi1kaWdpdCcsXG4gICAgICB9KTtcbiAgICAgIGdlbmVyYXRlZExhYmVsID0gKGdlbmVyYXRpb25SdW4gJiYgZ2VuZXJhdGlvblJ1biA+IDEpXG4gICAgICAgID8gYFJ1biAjJHtnZW5lcmF0aW9uUnVufSBcdTIwMTQgJHtkYXRlU3RyfWBcbiAgICAgICAgOiBkYXRlU3RyO1xuICAgIH0gY2F0Y2ggKF8pIHsgLyogaWdub3JlICovIH1cbiAgfVxuXG4gIGxldCBodG1sID0gJzxkaXYgY2xhc3M9XCJkb3dubG9hZC1zZWN0aW9uXCI+PGRpdiBjbGFzcz1cImRvd25sb2FkLWdyaWRcIj4nO1xuICBpZiAoIWZpbGVzLmxlbmd0aCkge1xuICAgIGh0bWwgKz0gJzxwPk5vIGRvd25sb2FkYWJsZSBmaWxlcyBmb3VuZC4gUGxlYXNlIHRyeSBnZW5lcmF0aW5nIHlvdXIgQ1YgYWdhaW4uPC9wPic7XG4gICAgaHRtbCArPSAnPC9kaXY+PC9kaXY+JztcbiAgICByZXR1cm4gaHRtbDtcbiAgfVxuXG4gIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgIGNvbnN0IGJsb2NrZWQgPSAoZmlsZS5mb3JtYXQgPT09ICdkb2N4JyAmJiBibG9ja0RvY3gpXG4gICAgICB8fCAoZmlsZS5mb3JtYXQgPT09ICdodG1sJyAmJiBibG9ja0h0bWwpXG4gICAgICB8fCAoZmlsZS5mb3JtYXQgPT09ICdwZGYnICYmIGJsb2NrUGRmKTtcbiAgICBjb25zdCBibG9ja2VkU3R5bGUgPSBibG9ja2VkXG4gICAgICA/ICdjdXJzb3I6bm90LWFsbG93ZWQ7b3BhY2l0eTowLjQ7YmFja2dyb3VuZDojOWNhM2FmO2JvcmRlci1jb2xvcjojOWNhM2FmOydcbiAgICAgIDogJyc7XG4gICAgY29uc3QgYmxvY2tlZE1lc3NhZ2UgPSBibG9ja2VkXG4gICAgICA/ICc8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuNzhlbTtjb2xvcjojZGMyNjI2O21hcmdpbi10b3A6NHB4O1wiPlx1MjZENCBCbG9ja2VkIFx1MjAxNCBvdXRwdXQgZmlsZSBjb3VsZCBub3QgYmUgZ2VuZXJhdGVkPC9kaXY+J1xuICAgICAgOiAnJztcbiAgICBjb25zdCB0aW1lc3RhbXBMaW5lID0gZ2VuZXJhdGVkTGFiZWxcbiAgICAgID8gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC43NWVtO2NvbG9yOiM5Y2EzYWY7bWFyZ2luLXRvcDozcHg7XCI+R2VuZXJhdGVkICR7Z2VuZXJhdGVkTGFiZWx9PC9kaXY+YFxuICAgICAgOiAnPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjc1ZW07Y29sb3I6I2MwYzRjYzttYXJnaW4tdG9wOjNweDtcIj5Ob3QgeWV0IGdlbmVyYXRlZDwvZGl2Pic7XG5cbiAgICBjb25zdCBwcmV2aWV3QmFkZ2UgPSBmaWxlLmZvcm1hdCA9PT0gJ3ByZXZpZXcnXG4gICAgICA/ICc8c3BhbiBzdHlsZT1cImRpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbi1sZWZ0OjZweDtmb250LXNpemU6MC43NWVtO2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjojOTI0MDBlO2JhY2tncm91bmQ6I2ZlZjNjNztib3JkZXI6MXB4IHNvbGlkICNmY2QzNGQ7Ym9yZGVyLXJhZGl1czo0cHg7cGFkZGluZzoxcHggNXB4O3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtcIj5Xb3JraW5nIGZpbGUgXHUyMDE0IG5vdCBmb3Igc3VibWlzc2lvbjwvc3Bhbj4nXG4gICAgICA6ICcnO1xuXG4gICAgaHRtbCArPSBgXG4gICAgICA8ZGl2IGNsYXNzPVwiZG93bmxvYWQtaXRlbVwiIHN0eWxlPVwiJHtibG9ja2VkID8gJ29wYWNpdHk6MC43NTsnIDogJyd9JHtmaWxlLmZvcm1hdCA9PT0gJ3ByZXZpZXcnID8gJ2JvcmRlci1zdHlsZTpkYXNoZWQ7JyA6ICcnfVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZG93bmxvYWQtaWNvblwiPiR7ZmlsZS5pY29ufTwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZG93bmxvYWQtaW5mb1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkb3dubG9hZC1uYW1lXCI+JHtlc2NhcGVIdG1sKGZpbGUuZmlsZW5hbWUpfSR7cHJldmlld0JhZGdlfTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkb3dubG9hZC1kZXNjcmlwdGlvblwiPiR7ZXNjYXBlSHRtbChmaWxlLmRlc2NyaXB0aW9uKX08L2Rpdj5cbiAgICAgICAgICAke3RpbWVzdGFtcExpbmV9XG4gICAgICAgICAgJHtibG9ja2VkTWVzc2FnZX1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgICR7YmxvY2tlZFxuICAgICAgICAgID8gYDxidXR0b24gY2xhc3M9XCJidG4tZG93bmxvYWRcIiBkaXNhYmxlZCBzdHlsZT1cIiR7YmxvY2tlZFN0eWxlfVwiPkJsb2NrZWQ8L2J1dHRvbj5gXG4gICAgICAgICAgOiAoKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBfc2lkID0gdHlwZW9mIGdldFNlc3Npb25JZEZyb21VUkwgPT09ICdmdW5jdGlvbicgPyBnZXRTZXNzaW9uSWRGcm9tVVJMKCkgOiBudWxsO1xuICAgICAgICAgICAgICBjb25zdCBfc3AgID0gX3NpZCA/IGA/c2Vzc2lvbl9pZD0ke2VuY29kZVVSSUNvbXBvbmVudChfc2lkKX1gIDogJyc7XG4gICAgICAgICAgICAgIHJldHVybiBgPGEgaHJlZj1cIi9hcGkvZG93bmxvYWQvJHtlbmNvZGVVUklDb21wb25lbnQoZmlsZS5maWxlbmFtZSl9JHtfc3B9XCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1kb3dubG9hZCBkb3dubG9hZC1saW5rXCIgZG93bmxvYWQ9XCIke2VzY2FwZUh0bWwoZmlsZS5maWxlbmFtZSl9XCJcbiAgICAgICAgICAgICAgICBzdHlsZT1cInRleHQtZGVjb3JhdGlvbjpub25lO2Rpc3BsYXk6aW5saW5lLWZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7XCI+RG93bmxvYWQ8L2E+YDtcbiAgICAgICAgICAgIH0pKCl9XG4gICAgICA8L2Rpdj5gO1xuICB9XG5cbiAgaHRtbCArPSAnPC9kaXY+PC9kaXY+JztcbiAgaWYgKHN1bW1hcnkuZmFpbCA+IDAgJiYgZmlsZXMubGVuZ3RoKSB7XG4gICAgaHRtbCArPSAnPHAgc3R5bGU9XCJtYXJnaW4tdG9wOjEycHg7Y29sb3I6IzZiNzI4MDtmb250LXNpemU6MC44OGVtO1wiPkJsb2NrZWQgZm9ybWF0cyByZWZsZWN0IEFUUyB2YWxpZGF0aW9uIGZhaWx1cmVzIGZvciB0aGUgY29ycmVzcG9uZGluZyBvdXRwdXQgdHlwZXMuPC9wPic7XG4gIH1cbiAgcmV0dXJuIGh0bWw7XG59XG5cbmZ1bmN0aW9uIF9yZW5kZXJSZWZpbmVtZW50UGFuZWwoKSB7XG4gIHJldHVybiBgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6MjRweDtwYWRkaW5nOjE2cHg7YmFja2dyb3VuZDojZjhmYWZjO2JvcmRlcjoxcHggc29saWQgI2UyZThmMDtcbiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6OHB4O1wiPlxuICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbToxMHB4O2NvbG9yOiMzNzQxNTE7XCI+XHUyMUJCIEl0ZXJhdGl2ZSBSZWZpbmVtZW50PC9kaXY+XG4gICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjllbTtjb2xvcjojNmI3MjgwO21hcmdpbi1ib3R0b206MTJweDtcIj5cbiAgICAgIEdvIGJhY2sgdG8gcmVmaW5lIGFuIGVhcmxpZXIgc3RlcCBcdTIwMTQgYWxsIHByaW9yIGRlY2lzaW9ucyBhbmQgYXBwcm92YWxzIGFyZSBwcmVzZXJ2ZWQuXG4gICAgPC9kaXY+XG4gICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6MTBweDtmbGV4LXdyYXA6d3JhcDtcIj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJidG4tc2Vjb25kYXJ5XCIgb25jbGljaz1cImJhY2tUb1BoYXNlKCdjdXN0b21pemF0aW9ucycpXCIgdGl0bGU9XCJSZXR1cm4gdG8gQ3VzdG9taXNlIHN0ZXBcIj5cbiAgICAgICAgXHUyMUJCIFJlZmluZSBDdXN0b21pc2VcbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1zZWNvbmRhcnlcIiBvbmNsaWNrPVwiYmFja1RvUGhhc2UoJ3Jld3JpdGUnKVwiIHRpdGxlPVwiUmV0dXJuIHRvIFJld3JpdGUgUmV2aWV3IHN0ZXBcIj5cbiAgICAgICAgXHUyMUJCIFJlZmluZSBSZXdyaXRlc1xuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLXNlY29uZGFyeVwiIG9uY2xpY2s9XCJiYWNrVG9QaGFzZSgnYW5hbHlzaXMnKVwiIHRpdGxlPVwiUmV0dXJuIHRvIEFuYWx5c2lzIHN0ZXBcIj5cbiAgICAgICAgXHUyMUJCIFJlLWFuYWx5c2UgSm9iXG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gX2ZldGNoUGVyc3Vhc2lvbkh0bWwoKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9wZXJzdWFzaW9uLWNoZWNrJyk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICBpZiAoIXJlc3BvbnNlLm9rIHx8ICFkYXRhLm9rKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgY29uc3Qgc3VtbWFyeSA9IGRhdGEuc3VtbWFyeSB8fCB7IGZsYWdnZWQ6IDAsIHN0cm9uZ19jb3VudDogMCwgdG90YWxfYnVsbGV0czogMCB9O1xuICAgIGNvbnN0IGZpbmRpbmdzID0gQXJyYXkuaXNBcnJheShkYXRhLmZpbmRpbmdzKSA/IGRhdGEuZmluZGluZ3MgOiBbXTtcbiAgICBjb25zdCBzY29yZUNvbG9yID0gc3VtbWFyeS5mbGFnZ2VkID09PSAwID8gJyMxMGI5ODEnIDogc3VtbWFyeS5mbGFnZ2VkIDw9IDMgPyAnI2Y1OWUwYicgOiAnI2VmNDQ0NCc7XG4gICAgY29uc3Qgc2NvcmVMYWJlbCA9IHN1bW1hcnkuZmxhZ2dlZCA9PT0gMFxuICAgICAgPyAnRXhjZWxsZW50J1xuICAgICAgOiBzdW1tYXJ5LmZsYWdnZWQgPD0gM1xuICAgICAgICA/ICdHb29kIFx1MjAxNCBtaW5vciBpbXByb3ZlbWVudHMgcG9zc2libGUnXG4gICAgICAgIDogJ05lZWRzIGF0dGVudGlvbic7XG5cbiAgICBsZXQgaHRtbCA9IGA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDoyMHB4O2JvcmRlcjoxcHggc29saWQgI2UyZThmMDtib3JkZXItcmFkaXVzOjhweDtvdmVyZmxvdzpoaWRkZW47XCI+XG4gICAgICA8ZGl2IHN0eWxlPVwicGFkZGluZzoxNHB4IDE2cHg7YmFja2dyb3VuZDojZjhmYWZjO2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjthbGlnbi1pdGVtczpjZW50ZXI7Y3Vyc29yOnBvaW50ZXI7XCJcbiAgICAgICAgICAgb25jbGljaz1cInRoaXMubmV4dEVsZW1lbnRTaWJsaW5nLnN0eWxlLmRpc3BsYXk9dGhpcy5uZXh0RWxlbWVudFNpYmxpbmcuc3R5bGUuZGlzcGxheT09PSdub25lJz8nYmxvY2snOidub25lJ1wiPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC13ZWlnaHQ6NjAwO2NvbG9yOiMxZjI5Mzc7XCI+XHVEODNEXHVEQ0FBIEJ1bGxldCBQZXJzdWFzaXZlbmVzczwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cIm1hcmdpbi1sZWZ0OjEycHg7YmFja2dyb3VuZDoke3Njb3JlQ29sb3J9O2NvbG9yOiNmZmY7Ym9yZGVyLXJhZGl1czo0cHg7cGFkZGluZzoycHggOHB4O2ZvbnQtc2l6ZTowLjhlbTtcIj4ke3Njb3JlTGFiZWx9PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07Y29sb3I6IzZiNzI4MDtcIj5cbiAgICAgICAgICAke3N1bW1hcnkuc3Ryb25nX2NvdW50fS8ke3N1bW1hcnkudG90YWxfYnVsbGV0c30gc3Ryb25nIFx1MDBCNyAke3N1bW1hcnkuZmxhZ2dlZH0gZmxhZ2dlZCBcdTAwQjcgY2xpY2sgdG8gJHtzdW1tYXJ5LmZsYWdnZWQgPiAwID8gJ2V4cGFuZCcgOiAnY29sbGFwc2UnfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PmA7XG5cbiAgICBpZiAoZmluZGluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cInBhZGRpbmc6MTJweCAxNnB4O2Rpc3BsYXk6JHtzdW1tYXJ5LmZsYWdnZWQgPD0gMyA/ICdibG9jaycgOiAnbm9uZSd9O1wiPmA7XG4gICAgICBmb3IgKGNvbnN0IGZpbmRpbmcgb2YgZmluZGluZ3MpIHtcbiAgICAgICAgY29uc3Qgc2V2ZXJpdHkgPSBmaW5kaW5nLnNldmVyaXR5ID09PSAnd2FybmluZydcbiAgICAgICAgICA/IHsgYmFja2dyb3VuZDogJyNmZmY3ZWQnLCBib3JkZXI6ICcjZjU5ZTBiJywgbGFiZWw6ICdcdTI2QTAgV2FybmluZycgfVxuICAgICAgICAgIDogeyBiYWNrZ3JvdW5kOiAnI2YwZjlmZicsIGJvcmRlcjogJyMzYjgyZjYnLCBsYWJlbDogJ1x1MjEzOSBJbmZvJyB9O1xuICAgICAgICBjb25zdCB0cnVuY2F0ZWRUZXh0ID0gZmluZGluZy50ZXh0ICYmIGZpbmRpbmcudGV4dC5sZW5ndGggPiAxMjBcbiAgICAgICAgICA/IGAke2ZpbmRpbmcudGV4dC5zbGljZSgwLCAxMjApfVx1MjAyNmBcbiAgICAgICAgICA6IGZpbmRpbmcudGV4dCB8fCAnJztcbiAgICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTJweDtwYWRkaW5nOjEwcHggMTJweDtiYWNrZ3JvdW5kOiR7c2V2ZXJpdHkuYmFja2dyb3VuZH07Ym9yZGVyLWxlZnQ6M3B4IHNvbGlkICR7c2V2ZXJpdHkuYm9yZGVyfTtib3JkZXItcmFkaXVzOjAgNnB4IDZweCAwO1wiPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC44ZW07Y29sb3I6IzZiNzI4MDttYXJnaW4tYm90dG9tOjRweDtcIj5cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiYmFja2dyb3VuZDoke3NldmVyaXR5LmJvcmRlcn07Y29sb3I6I2ZmZjtib3JkZXItcmFkaXVzOjNweDtwYWRkaW5nOjFweCA2cHg7Zm9udC1zaXplOjAuOWVtO1wiPiR7c2V2ZXJpdHkubGFiZWx9PC9zcGFuPlxuICAgICAgICAgICAgQnVsbGV0ICR7KGZpbmRpbmcuYnVsbGV0X2luZGV4ID8/IDApICsgMX0ke2ZpbmRpbmcuZXhwX2lkID8gYCBcdTAwQjcgJHtlc2NhcGVIdG1sKGZpbmRpbmcuZXhwX2lkKX1gIDogJyd9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjllbTtjb2xvcjojMzc0MTUxO21hcmdpbi1ib3R0b206NnB4O1wiPlwiJHtlc2NhcGVIdG1sKHRydW5jYXRlZFRleHQpfVwiPC9kaXY+XG4gICAgICAgICAgPHVsIHN0eWxlPVwibWFyZ2luOjA7cGFkZGluZy1sZWZ0OjE4cHg7XCI+YDtcbiAgICAgICAgZm9yIChjb25zdCBpc3N1ZSBvZiBmaW5kaW5nLmlzc3VlcyB8fCBbXSkge1xuICAgICAgICAgIGh0bWwgKz0gYDxsaSBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07Y29sb3I6IzZiNzI4MDttYXJnaW4tYm90dG9tOjJweDtcIj4ke2VzY2FwZUh0bWwoaXNzdWUuc3VnZ2VzdGlvbil9PC9saT5gO1xuICAgICAgICB9XG4gICAgICAgIGh0bWwgKz0gJzwvdWw+PC9kaXY+JztcbiAgICAgIH1cbiAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgfSBlbHNlIHtcbiAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJwYWRkaW5nOjEycHggMTZweDtjb2xvcjojMTBiOTgxO2ZvbnQtc2l6ZTowLjllbTtcIj5BbGwgYnVsbGV0cyBtZWV0IHBlcnN1YXNpdmVuZXNzIGNyaXRlcmlhLjwvZGl2Pic7XG4gICAgfVxuXG4gICAgLy8gTmFycmF0aXZlLXRocmVhZCBhZHZpc29yeSAoR0FQLTI4MSlcbiAgICBjb25zdCBudGEgPSBzdW1tYXJ5Lm5hcnJhdGl2ZV90aHJlYWRfYWR2aXNvcnk7XG4gICAgaWYgKG50YSkge1xuICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cInBhZGRpbmc6MTBweCAxNnB4O2JhY2tncm91bmQ6I2ZlZjljMztib3JkZXItdG9wOjFweCBzb2xpZCAjZmRlNjhhO1wiPlxuICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtd2VpZ2h0OjYwMDtjb2xvcjojOTI0MDBlO1wiPlx1RDgzRVx1RERGNSBOYXJyYXRpdmUgZm9jdXMgYWR2aXNvcnk6PC9zcGFuPlxuICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjllbTtjb2xvcjojNzgzNTBmO21hcmdpbi1sZWZ0OjZweDtcIj4ke2VzY2FwZUh0bWwobnRhLmRldGFpbCl9PC9zcGFuPlxuICAgICAgPC9kaXY+YDtcbiAgICB9XG5cbiAgICAvLyBOYXJyYXRpdmUtYXJjIGFkdmlzb3J5IChHQVAtMTcpOiByZWNlbnQgcm9sZSBzaG91bGQgc2hvdyBzdHJvbmdlc3QgdmVyYnNcbiAgICBjb25zdCBuYWEgPSBzdW1tYXJ5Lm5hcnJhdGl2ZV9hcmNfYWR2aXNvcnk7XG4gICAgaWYgKG5hYSkge1xuICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cInBhZGRpbmc6MTBweCAxNnB4O2JhY2tncm91bmQ6I2ZmZjdlZDtib3JkZXItdG9wOjFweCBzb2xpZCAjZmVkN2FhO1wiPlxuICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtd2VpZ2h0OjYwMDtjb2xvcjojOWEzNDEyO1wiPlx1RDgzRFx1RENDOCBOYXJyYXRpdmUgYXJjIGFkdmlzb3J5Ojwvc3Bhbj5cbiAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC45ZW07Y29sb3I6IzdjMmQxMjttYXJnaW4tbGVmdDo2cHg7XCI+JHtlc2NhcGVIdG1sKG5hYS5kZXRhaWwpfTwvc3Bhbj5cbiAgICAgIDwvZGl2PmA7XG4gICAgfVxuXG4gICAgaHRtbCArPSAnPC9kaXY+JztcbiAgICByZXR1cm4gaHRtbDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cud2FybignUGVyc3Vhc2lvbiBjaGVjayBmYWlsZWQ6JywgZXJyb3IpO1xuICAgIHJldHVybiAnJztcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBwb3B1bGF0ZURvd25sb2FkVGFiKGN2RGF0YSkge1xuICBzdGF0ZU1hbmFnZXIuc2V0VGFiRGF0YSgnY3YnLCBjdkRhdGEpO1xuXG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9jdW1lbnQtY29udGVudCcpO1xuICBpZiAoIWNvbnRlbnQpIHJldHVybjtcblxuICBpZiAoIWN2RGF0YSB8fCAodHlwZW9mIGN2RGF0YSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMoY3ZEYXRhKS5sZW5ndGggPT09IDApKSB7XG4gICAgY29udGVudC5pbm5lckhUTUwgPSAnPGgxPlx1MkIwN1x1RkUwRiBEb3dubG9hZCBHZW5lcmF0ZWQgRmlsZXM8L2gxPjxkaXYgY2xhc3M9XCJlbXB0eS1zdGF0ZVwiPjxkaXYgY2xhc3M9XCJpY29uXCI+XHUyQjA3XHVGRTBGPC9kaXY+PGgzPk5vIEZpbGVzIEF2YWlsYWJsZTwvaDM+PHA+R2VuZXJhdGUgYSBDViBmaXJzdCB0byBzZWUgZG93bmxvYWQgb3B0aW9ucy48L3A+PC9kaXY+JztcbiAgICByZXR1cm47XG4gIH1cblxuICBjb250ZW50LmlubmVySFRNTCA9ICc8aDE+XHUyQjA3XHVGRTBGIERvd25sb2FkIEdlbmVyYXRlZCBGaWxlczwvaDE+PHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO21hcmdpbi1ib3R0b206MTZweDtcIj5SdW5uaW5nIEFUUyB2YWxpZGF0aW9uXHUyMDI2PC9wPic7XG5cbiAgbGV0IGNoZWNrcyA9IFtdO1xuICBsZXQgcGFnZUNvdW50ID0gbnVsbDtcbiAgbGV0IHN1bW1hcnkgPSB7IHBhc3M6IDAsIHdhcm46IDAsIGZhaWw6IDAgfTtcbiAgbGV0IGF0c0Vycm9yID0gbnVsbDtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL2F0cy12YWxpZGF0ZScpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgaWYgKGRhdGEub2spIHtcbiAgICAgIGNoZWNrcyA9IGRhdGEuY2hlY2tzIHx8IFtdO1xuICAgICAgcGFnZUNvdW50ID0gZGF0YS5wYWdlX2NvdW50ID8/IG51bGw7XG4gICAgICBzdW1tYXJ5ID0gZGF0YS5zdW1tYXJ5IHx8IHN1bW1hcnk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF0c0Vycm9yID0gZGF0YS5lcnJvciB8fCAnVmFsaWRhdGlvbiBmYWlsZWQnO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBhdHNFcnJvciA9IGBOZXR3b3JrIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YDtcbiAgfVxuXG4gIGNvbnN0IGZpbGVzID0gX2NvbGxlY3REb3dubG9hZGFibGVGaWxlcyhjdkRhdGEpO1xuICBsZXQgaHRtbCA9ICc8aDE+XHUyQjA3XHVGRTBGIEZpbGUgUmV2aWV3PC9oMT4nO1xuICBodG1sICs9ICc8cCBzdHlsZT1cImZvbnQtc2l6ZTowLjgzZW07Y29sb3I6Izk0YTNiODttYXJnaW4tYm90dG9tOjE2cHg7cGFkZGluZzo4cHggMTJweDtiYWNrZ3JvdW5kOiNmOGZhZmM7Ym9yZGVyLXJhZGl1czo2cHg7Ym9yZGVyLWxlZnQ6M3B4IHNvbGlkICNlMmU4ZjA7XCI+XHUyNzA1IDxlbT5UaGlzIGlzIHRoZSA8c3Ryb25nPmNvbXBsZXRlbmVzcyBjaGVjazwvc3Ryb25nPiBzdGVwIFx1MjAxNCBBVFMgdmFsaWRhdGlvbiBydW5zIGhlcmUgYW5kIHlvdSBjYW4gYXJjaGl2ZSB0aGUgYXBwbGljYXRpb24uIFRvIGRvd25sb2FkIGZpbGVzIGltbWVkaWF0ZWx5IGFmdGVyIGdlbmVyYXRpb24sIHVzZSB0aGUgPHN0cm9uZz5HZW5lcmF0ZWQgRmlsZXM8L3N0cm9uZz4gdGFiLjwvZW0+PC9wPic7XG4gIGh0bWwgKz0gX3JlbmRlclZhbGlkYXRpb25TdW1tYXJ5KGNoZWNrcywgc3VtbWFyeSwgcGFnZUNvdW50LCBhdHNFcnJvcik7XG5cbiAgY29uc3Qgc3VtbWFyeVdhcm5pbmdzID0gKGN2RGF0YS5tZXRhZGF0YT8uc3VtbWFyeV93YXJuaW5ncyB8fCBbXSk7XG4gIGlmIChzdW1tYXJ5V2FybmluZ3MubGVuZ3RoKSB7XG4gICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2ZlZjljMztib3JkZXI6MXB4IHNvbGlkICNmY2QzNGQ7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzoxMnB4IDE2cHg7bWFyZ2luLWJvdHRvbToxNnB4O1wiPlxuICAgICAgPHN0cm9uZz5cdTI2QTAgUHJvZmVzc2lvbmFsIFN1bW1hcnkgcXVhbGl0eSBub3RpY2VzICgke3N1bW1hcnlXYXJuaW5ncy5sZW5ndGh9KTo8L3N0cm9uZz5cbiAgICAgIDx1bCBzdHlsZT1cIm1hcmdpbjo4cHggMCAwIDA7cGFkZGluZy1sZWZ0OjE4cHg7XCI+XG4gICAgICAgICR7c3VtbWFyeVdhcm5pbmdzLm1hcCh3ID0+IGA8bGkgc3R5bGU9XCJmb250LXNpemU6MC45ZW07XCI+JHtlc2NhcGVIdG1sKHcpfTwvbGk+YCkuam9pbignJyl9XG4gICAgICA8L3VsPlxuICAgICAgPHAgc3R5bGU9XCJtYXJnaW46OHB4IDAgMDtmb250LXNpemU6MC44N2VtO2NvbG9yOiM3ODM1MGY7XCI+VGhlc2UgYXJlIGFkdmlzb3J5IHdhcm5pbmdzIFx1MjAxNCByZXZpZXcgdGhlIFN1bW1hcnkgdGFiIGlmIHlvdSB3aXNoIHRvIHVwZGF0ZSB0aGUgc3VtbWFyeSBiZWZvcmUgc3VibWl0dGluZy48L3A+XG4gICAgPC9kaXY+YDtcbiAgfVxuXG4gIGNvbnN0IHB1YmxpY2F0aW9uV2FybmluZ3MgPSAoY3ZEYXRhLm1ldGFkYXRhPy5wdWJsaWNhdGlvbl93YXJuaW5ncyB8fCBbXSk7XG4gIGlmIChwdWJsaWNhdGlvbldhcm5pbmdzLmxlbmd0aCkge1xuICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZWY5YzM7Ym9yZGVyOjFweCBzb2xpZCAjZmNkMzRkO2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MTJweCAxNnB4O21hcmdpbi1ib3R0b206MTZweDtcIj5cbiAgICAgIDxzdHJvbmc+XHUyNkEwIFB1YmxpY2F0aW9uIHZlbnVlIGluZm9ybWF0aW9uIGluY29tcGxldGUgKCR7cHVibGljYXRpb25XYXJuaW5ncy5sZW5ndGh9KTo8L3N0cm9uZz5cbiAgICAgIDx1bCBzdHlsZT1cIm1hcmdpbjo4cHggMCAwIDA7cGFkZGluZy1sZWZ0OjE4cHg7XCI+XG4gICAgICAgICR7cHVibGljYXRpb25XYXJuaW5ncy5tYXAodyA9PiBgPGxpIHN0eWxlPVwiZm9udC1zaXplOjAuOWVtO1wiPiR7ZXNjYXBlSHRtbCh3KX08L2xpPmApLmpvaW4oJycpfVxuICAgICAgPC91bD5cbiAgICAgIDxwIHN0eWxlPVwibWFyZ2luOjhweCAwIDA7Zm9udC1zaXplOjAuODdlbTtjb2xvcjojNzgzNTBmO1wiPkFkZCBtaXNzaW5nIGpvdXJuYWwgb3IgY29uZmVyZW5jZSBuYW1lcyB0byB5b3VyIE1hc3RlciBDViBiZWZvcmUgc3VibWl0dGluZyBcdTIwMTQgaW5jb21wbGV0ZSB2ZW51ZSBkZXRhaWxzIHdlYWtlbiBjcmVkaWJpbGl0eS48L3A+XG4gICAgPC9kaXY+YDtcbiAgfVxuXG4gIGNvbnN0IGxvbmdCdWxsZXRXYXJuaW5ncyA9IChjdkRhdGEubWV0YWRhdGE/LmxvbmdfYnVsbGV0X3dhcm5pbmdzIHx8IFtdKTtcbiAgaWYgKGxvbmdCdWxsZXRXYXJuaW5ncy5sZW5ndGgpIHtcbiAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZmVmOWMzO2JvcmRlcjoxcHggc29saWQgI2ZjZDM0ZDtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjEycHggMTZweDttYXJnaW4tYm90dG9tOjE2cHg7XCI+XG4gICAgICA8c3Ryb25nPlx1MjZBMCBMb25nIGJ1bGxldCBwb2ludHMgZGV0ZWN0ZWQgKCR7bG9uZ0J1bGxldFdhcm5pbmdzLmxlbmd0aH0pIFx1MjAxNCBtYXkgZXhjZWVkIDIgbGluZXM6PC9zdHJvbmc+XG4gICAgICA8dWwgc3R5bGU9XCJtYXJnaW46OHB4IDAgMCAwO3BhZGRpbmctbGVmdDoxOHB4O2xpc3Qtc3R5bGU6bm9uZTtcIj5cbiAgICAgICAgJHtsb25nQnVsbGV0V2FybmluZ3MubWFwKHcgPT4gYDxsaSBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07bWFyZ2luLWJvdHRvbTo0cHg7XCI+PHN0cm9uZz4ke2VzY2FwZUh0bWwody5jb21wYW55KX0gXHUwMEI3ICR7ZXNjYXBlSHRtbCh3LnRpdGxlKX08L3N0cm9uZz4gKCR7dy5jaGFyX2NvdW50fSBjaGFycyk8YnI+PHNwYW4gc3R5bGU9XCJjb2xvcjojNmI3MjgwO1wiPlwiJHtlc2NhcGVIdG1sKHcuYnVsbGV0X3RleHQpfVwiPC9zcGFuPjwvbGk+YCkuam9pbignJyl9XG4gICAgICA8L3VsPlxuICAgICAgPHAgc3R5bGU9XCJtYXJnaW46OHB4IDAgMDtmb250LXNpemU6MC44N2VtO2NvbG9yOiM3ODM1MGY7XCI+Q29uc2lkZXIgc2hvcnRlbmluZyB0aGVzZSBidWxsZXRzIFx1MjAxNCBhaW0gZm9yIFx1MjI2NDIwMCBjaGFyYWN0ZXJzIGVhY2ggZm9yIGNsZWFuIDItbGluZSByZW5kZXJpbmcgaW4gdGhlIERPQ1guPC9wPlxuICAgIDwvZGl2PmA7XG4gIH1cblxuICBjb25zdCBzcGFyc2VFeHBXYXJuaW5ncyA9IChjdkRhdGEubWV0YWRhdGE/LnNwYXJzZV9leHBlcmllbmNlX3dhcm5pbmdzIHx8IFtdKTtcbiAgaWYgKHNwYXJzZUV4cFdhcm5pbmdzLmxlbmd0aCkge1xuICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZWY5YzM7Ym9yZGVyOjFweCBzb2xpZCAjZmNkMzRkO2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MTJweCAxNnB4O21hcmdpbi1ib3R0b206MTZweDtcIj5cbiAgICAgIDxzdHJvbmc+XHUyNkEwIFNwYXJzZSBleHBlcmllbmNlIGVudHJpZXMgKCR7c3BhcnNlRXhwV2FybmluZ3MubGVuZ3RofSkgXHUyMDE0IGZld2VyIHRoYW4gMiBidWxsZXRzOjwvc3Ryb25nPlxuICAgICAgPHVsIHN0eWxlPVwibWFyZ2luOjhweCAwIDAgMDtwYWRkaW5nLWxlZnQ6MThweDtsaXN0LXN0eWxlOm5vbmU7XCI+XG4gICAgICAgICR7c3BhcnNlRXhwV2FybmluZ3MubWFwKHcgPT4gYDxsaSBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07bWFyZ2luLWJvdHRvbToycHg7XCI+PHN0cm9uZz4ke2VzY2FwZUh0bWwody5jb21wYW55KX0gXHUwMEI3ICR7ZXNjYXBlSHRtbCh3LnRpdGxlKX08L3N0cm9uZz4gXHUyMDE0ICR7dy5idWxsZXRfY291bnQgPT09IDAgPyAnbm8gYnVsbGV0cyBzZWxlY3RlZCcgOiAnMSBidWxsZXQgc2VsZWN0ZWQnfTwvbGk+YCkuam9pbignJyl9XG4gICAgICA8L3VsPlxuICAgICAgPHAgc3R5bGU9XCJtYXJnaW46OHB4IDAgMDtmb250LXNpemU6MC44N2VtO2NvbG9yOiM3ODM1MGY7XCI+SW5jbHVkZSBhdCBsZWFzdCAyIGJ1bGxldHMgcGVyIHJvbGUgdG8gZGVtb25zdHJhdGUgaW1wYWN0LiBSZXR1cm4gdG8gdGhlIEV4cGVyaWVuY2UgdGFiIHRvIGFkZCBtb3JlLjwvcD5cbiAgICA8L2Rpdj5gO1xuICB9XG5cbiAgY29uc3QgeWVhck9ubHlEYXRlV2FybmluZ3MgPSAoY3ZEYXRhLm1ldGFkYXRhPy55ZWFyX29ubHlfZGF0ZV93YXJuaW5ncyB8fCBbXSk7XG4gIGlmICh5ZWFyT25seURhdGVXYXJuaW5ncy5sZW5ndGgpIHtcbiAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZmVmOWMzO2JvcmRlcjoxcHggc29saWQgI2ZjZDM0ZDtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjEycHggMTZweDttYXJnaW4tYm90dG9tOjE2cHg7XCI+XG4gICAgICA8c3Ryb25nPlx1MjZBMCBZZWFyLW9ubHkgZGF0ZXMgZGV0ZWN0ZWQgKCR7eWVhck9ubHlEYXRlV2FybmluZ3MubGVuZ3RofSkgXHUyMDE0IG1vbnRoL3llYXIgZm9ybWF0IHJlY29tbWVuZGVkOjwvc3Ryb25nPlxuICAgICAgPHVsIHN0eWxlPVwibWFyZ2luOjhweCAwIDAgMDtwYWRkaW5nLWxlZnQ6MThweDtsaXN0LXN0eWxlOm5vbmU7XCI+XG4gICAgICAgICR7eWVhck9ubHlEYXRlV2FybmluZ3MubWFwKHcgPT4gYDxsaSBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07bWFyZ2luLWJvdHRvbToycHg7XCI+PHN0cm9uZz4ke2VzY2FwZUh0bWwody5jb21wYW55KX0gXHUwMEI3ICR7ZXNjYXBlSHRtbCh3LnRpdGxlKX08L3N0cm9uZz4gXHUyMDE0ICR7dy5maWVsZCA9PT0gJ3N0YXJ0X2RhdGUnID8gJ3N0YXJ0JyA6ICdlbmQnfSBkYXRlIGlzIFwiJHtlc2NhcGVIdG1sKHcuZGF0ZV92YWx1ZSl9XCI8L2xpPmApLmpvaW4oJycpfVxuICAgICAgPC91bD5cbiAgICAgIDxwIHN0eWxlPVwibWFyZ2luOjhweCAwIDA7Zm9udC1zaXplOjAuODdlbTtjb2xvcjojNzgzNTBmO1wiPlllYXItb25seSBkYXRlcyByZWR1Y2UgY2hyb25vbG9naWNhbCBwcmVjaXNpb24uIFVwZGF0ZSB0byBNb250aCBZWVlZIGZvcm1hdCAoZS5nLiBcIkphbiAyMDIwXCIpIGluIHRoZSBNYXN0ZXIgQ1YgZm9yIGJlc3QgQVRTIGNvbXBhdGliaWxpdHkuPC9wPlxuICAgIDwvZGl2PmA7XG4gIH1cblxuICBjb25zdCByZXdyaXRlQXVkaXRNaXNtYXRjaGVzID0gKGN2RGF0YS5tZXRhZGF0YT8ucmV3cml0ZV9hdWRpdF9taXNtYXRjaGVzIHx8IFtdKTtcbiAgaWYgKHJld3JpdGVBdWRpdE1pc21hdGNoZXMubGVuZ3RoKSB7XG4gICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2ZlZjJmMjtib3JkZXI6MXB4IHNvbGlkICNmY2E1YTU7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzoxMnB4IDE2cHg7bWFyZ2luLWJvdHRvbToxNnB4O1wiPlxuICAgICAgPHN0cm9uZz5cdTI2QTAgUmV3cml0ZSBjb250ZW50IG1pc21hdGNoICgke3Jld3JpdGVBdWRpdE1pc21hdGNoZXMubGVuZ3RofSkgXHUyMDE0IGFjY2VwdGVkIHJld3JpdGVzIG5vdCBmb3VuZCBpbiBnZW5lcmF0ZWQgdGV4dDo8L3N0cm9uZz5cbiAgICAgIDx1bCBzdHlsZT1cIm1hcmdpbjo4cHggMCAwIDA7cGFkZGluZy1sZWZ0OjE4cHg7bGlzdC1zdHlsZTpub25lO1wiPlxuICAgICAgICAke3Jld3JpdGVBdWRpdE1pc21hdGNoZXMubWFwKG0gPT4gYDxsaSBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07bWFyZ2luLWJvdHRvbTo2cHg7XCI+PHN0cm9uZz4ke2VzY2FwZUh0bWwobS5sb2NhdGlvbiB8fCBtLnR5cGUpfTwvc3Ryb25nPjxicj48c3BhbiBzdHlsZT1cImNvbG9yOiMzNzQxNTE7XCI+RXhwZWN0ZWQ6IDxlbT5cIiR7ZXNjYXBlSHRtbCgobS5leHBlY3RlZCB8fCAnJykuc2xpY2UoMCwgMTIwKSl9JHsobS5leHBlY3RlZCB8fCAnJykubGVuZ3RoID4gMTIwID8gJ1x1MjAyNicgOiAnJ31cIjwvZW0+PC9zcGFuPjxicj48c3BhbiBzdHlsZT1cImNvbG9yOiM5Y2EzYWY7XCI+QWN0dWFsOiA8ZW0+XCIke2VzY2FwZUh0bWwoKG0uYWN0dWFsIHx8ICcnKS5zbGljZSgwLCAxMjApKX0keyhtLmFjdHVhbCB8fCAnJykubGVuZ3RoID4gMTIwID8gJ1x1MjAyNicgOiAnJ31cIjwvZW0+PC9zcGFuPjwvbGk+YCkuam9pbignJyl9XG4gICAgICA8L3VsPlxuICAgICAgPHAgc3R5bGU9XCJtYXJnaW46OHB4IDAgMDtmb250LXNpemU6MC44N2VtO2NvbG9yOiM3ZjFkMWQ7XCI+VGhlc2UgYWNjZXB0ZWQgcmV3cml0ZXMgbWF5IG5vdCBoYXZlIGJlZW4gYXBwbGllZC4gUmUtZ2VuZXJhdGUgdGhlIENWIG9yIGNoZWNrIHRoZSByZXdyaXRlIHJldmlldyBzdGVwLjwvcD5cbiAgICA8L2Rpdj5gO1xuICB9XG5cbiAgY29uc3Qgb3ZlcmxhcFdhcm5pbmdzID0gKGN2RGF0YS5kYXRlX292ZXJsYXBfd2FybmluZ3MgfHwgW10pO1xuICBpZiAob3ZlcmxhcFdhcm5pbmdzLmxlbmd0aCkge1xuICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZWY5YzM7Ym9yZGVyOjFweCBzb2xpZCAjZmRlMDQ3O2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MTJweCAxNnB4O21hcmdpbi1ib3R0b206MTZweDtcIj5cbiAgICAgIDxzdHJvbmc+XHUyNkEwIEVtcGxveW1lbnQgZGF0ZSBvdmVybGFwcyBkZXRlY3RlZCAoJHtvdmVybGFwV2FybmluZ3MubGVuZ3RofSk6PC9zdHJvbmc+XG4gICAgICA8dWwgc3R5bGU9XCJtYXJnaW46OHB4IDAgMCAwO3BhZGRpbmctbGVmdDoxOHB4O1wiPlxuICAgICAgICAke292ZXJsYXBXYXJuaW5ncy5tYXAodyA9PiBgPGxpPjxzdHJvbmc+JHtlc2NhcGVIdG1sKHcuZW50cnlfYSl9PC9zdHJvbmc+IG92ZXJsYXBzIHdpdGggPHN0cm9uZz4ke2VzY2FwZUh0bWwody5lbnRyeV9iKX08L3N0cm9uZz48YnI+PHNtYWxsIHN0eWxlPVwiY29sb3I6IzkyNDAwZTtcIj4ke2VzY2FwZUh0bWwody5vdmVybGFwX2Rlc2NyaXB0aW9uKX08L3NtYWxsPjwvbGk+YCkuam9pbignJyl9XG4gICAgICA8L3VsPlxuICAgICAgPHAgc3R5bGU9XCJtYXJnaW46OHB4IDAgMDtmb250LXNpemU6MC44N2VtO2NvbG9yOiM3ODM1MGY7XCI+UmV2aWV3IHRoZXNlIGVudHJpZXMgaW4gdGhlIEV4cGVyaWVuY2UgdGFiIGJlZm9yZSBzdWJtaXR0aW5nIHlvdXIgYXBwbGljYXRpb24uPC9wPlxuICAgIDwvZGl2PmA7XG4gIH1cblxuICBjb25zdCBnZW5lcmF0ZWRBdCA9IGN2RGF0YS5tZXRhZGF0YT8uZ2VuZXJhdGlvbl9kYXRlID8/IG51bGw7XG4gIGNvbnN0IGdlbmVyYXRpb25SdW4gPSBjdkRhdGEubWV0YWRhdGE/LmdlbmVyYXRpb25fcnVuID8/IG51bGw7XG4gIGh0bWwgKz0gX3JlbmRlckRvd25sb2FkR3JpZChmaWxlcywgY2hlY2tzLCBzdW1tYXJ5LCBnZW5lcmF0ZWRBdCwgZ2VuZXJhdGlvblJ1bik7XG5cbiAgaWYgKGN2RGF0YS5vdXRwdXRfZGlyKSB7XG4gICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6MjBweDtwYWRkaW5nOjEycHg7YmFja2dyb3VuZDojZjFmNWY5O2JvcmRlci1yYWRpdXM6NnB4O2ZvbnQtc2l6ZToxNHB4O2NvbG9yOiM2NDc0OGI7XCI+XG4gICAgICA8c3Ryb25nPk91dHB1dCBEaXJlY3Rvcnk6PC9zdHJvbmc+ICR7ZXNjYXBlSHRtbChjdkRhdGEub3V0cHV0X2Rpcil9XG4gICAgPC9kaXY+YDtcbiAgfVxuXG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gYCR7aHRtbH08cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7bWFyZ2luLXRvcDoxNnB4O2ZvbnQtc2l6ZTowLjllbTtcIj5BbmFseXNpbmcgYnVsbGV0IHBlcnN1YXNpdmVuZXNzXHUyMDI2PC9wPmA7XG4gIGh0bWwgKz0gYXdhaXQgX2ZldGNoUGVyc3Vhc2lvbkh0bWwoKTtcbiAgaHRtbCArPSBfcmVuZGVyUmVmaW5lbWVudFBhbmVsKCk7XG4gIGh0bWwgKz0gYDxkaXYgY2xhc3M9XCJuYXYtYnV0dG9ucyBuYXYtZW5kXCIgc3R5bGU9XCJtYXJnaW4tdG9wOjE2cHg7XCI+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImNvbnRpbnVlLWJ0blwiIG9uY2xpY2s9XCJoYW5kbGVTdGVwQ2xpY2soJ2NvdmVyX2xldHRlcicpXCI+XG4gICAgICBcdUQ4M0RcdURDRTkgUHJvY2VlZCB0byBDb3ZlciBMZXR0ZXIgXHUyMTkyXG4gICAgPC9idXR0b24+XG4gIDwvZGl2PmA7XG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gaHRtbDtcbn1cblxuZXhwb3J0IHsgcG9wdWxhdGVEb3dubG9hZFRhYiB9OyIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL2ZpbmFsLWdlbmVyYXRlLmpzXG4gKiBGaW5hbCBnZW5lcmF0aW9uIHN0ZXA6IHNob3dzIGRvd25sb2FkIGxpbmtzIGZvciB0aGUgZ2VuZXJhdGVkIGZpbGVzXG4gKiAoUERGLCBBVFMgRE9DWCwgaHVtYW4gRE9DWCkgYW5kIGEgXCJQcm9jZWVkIHRvIERvd25sb2FkIFJldmlldyBcdTIxOTJcIiBidXR0b25cbiAqIHRoYXQgYWR2YW5jZXMgdGhlIHdvcmtmbG93IHRvIHRoZSBkb3dubG9hZCBzdGVwLlxuICpcbiAqIERlcGVuZGVuY2llcyAocmVzb2x2ZWQgdGhyb3VnaCBnbG9iYWxUaGlzIGF0IHJ1bnRpbWUpOlxuICogICBhcGlDYWxsLCBhcHBlbmRNZXNzYWdlLCBlc2NhcGVIdG1sLCBzdGF0ZU1hbmFnZXIsIHN3aXRjaFRhYlxuICovXG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmNvbnN0IGxvZyA9IGdldExvZ2dlcignZmluYWwtZ2VuZXJhdGUnKTtcblxuaW1wb3J0IHsgc3RhdGVNYW5hZ2VyIH0gZnJvbSAnLi9zdGF0ZS1tYW5hZ2VyLmpzJztcblxuLy8gXHUyNTAwXHUyNTAwIFByZXZpZXcgc3RhdGUgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmxldCBfcHJldmlld09wZW4gPSB0cnVlO1xuXG4vLyBcdTI1MDBcdTI1MDAgRmlsZSB0eXBlIGhlbHBlcnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIF9maWxlTGFiZWwoZmlsZW5hbWUpIHtcbiAgaWYgKCFmaWxlbmFtZSkgcmV0dXJuICcnO1xuICBjb25zdCBiYXNlID0gZmlsZW5hbWUuc3BsaXQoJy8nKS5wb3AoKTtcbiAgaWYgKGJhc2UuZW5kc1dpdGgoJy5wZGYnKSAmJiBiYXNlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2F0cycpKVxuICAgIHJldHVybiAnQVRTIFBERic7XG4gIGlmIChiYXNlLmVuZHNXaXRoKCcucGRmJykpXG4gICAgcmV0dXJuICdIdW1hbiBQREYnO1xuICBpZiAoYmFzZS5lbmRzV2l0aCgnLmRvY3gnKSAmJiBiYXNlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2F0cycpKVxuICAgIHJldHVybiAnQVRTIFdvcmQnO1xuICBpZiAoYmFzZS5lbmRzV2l0aCgnLmRvY3gnKSlcbiAgICByZXR1cm4gJ0h1bWFuIFdvcmQnO1xuICBpZiAoYmFzZS5lbmRzV2l0aCgnLmh0bWwnKSlcbiAgICByZXR1cm4gJ0hUTUwnO1xuICByZXR1cm4gYmFzZTtcbn1cblxuZnVuY3Rpb24gX2ZpbGVJY29uKGZpbGVuYW1lKSB7XG4gIGlmICghZmlsZW5hbWUpIHJldHVybiAnXHVEODNEXHVEQ0MxJztcbiAgY29uc3QgZiA9IGZpbGVuYW1lLnRvTG93ZXJDYXNlKCk7XG4gIGlmIChmLmVuZHNXaXRoKCcucGRmJykpICByZXR1cm4gZi5pbmNsdWRlcygnYXRzJykgPyAnXHVEODNFXHVERDE2JyA6ICdcdUQ4M0RcdURDQzQnO1xuICBpZiAoZi5lbmRzV2l0aCgnLmRvY3gnKSkgcmV0dXJuICdcdUQ4M0RcdURDREQnO1xuICBpZiAoZi5lbmRzV2l0aCgnLmh0bWwnKSkgcmV0dXJuICdcdUQ4M0NcdURGMTAnO1xuICByZXR1cm4gJ1x1RDgzRFx1RENDMSc7XG59XG5cbmZ1bmN0aW9uIF9maWxlRGVzY3JpcHRpb24oZmlsZW5hbWUpIHtcbiAgaWYgKCFmaWxlbmFtZSkgcmV0dXJuICcnO1xuICBjb25zdCBmID0gZmlsZW5hbWUudG9Mb3dlckNhc2UoKTtcbiAgaWYgKGYuZW5kc1dpdGgoJy5wZGYnKSAmJiBmLmluY2x1ZGVzKCdhdHMnKSlcbiAgICByZXR1cm4gJ0FUUy1vcHRpbWlzZWQgUERGIFx1MjAxNCBtYWNoaW5lLXJlYWRhYmxlIGZvciBhdXRvbWF0ZWQgc2NyZWVuaW5nJztcbiAgaWYgKGYuZW5kc1dpdGgoJy5wZGYnKSlcbiAgICByZXR1cm4gJ0h1bWFuLXJlYWRhYmxlIFBERiBcdTIwMTQgZm9yIGh1bWFuIHJldmlld2VycyBhbmQgcHJpbnRpbmcnO1xuICBpZiAoZi5lbmRzV2l0aCgnLmRvY3gnKSAmJiBmLmluY2x1ZGVzKCdhdHMnKSlcbiAgICByZXR1cm4gJ0FUUyBXb3JkIGRvY3VtZW50IFx1MjAxNCBrZXl3b3JkLW9wdGltaXNlZCBmb3Igam9iIGFwcGxpY2F0aW9ucyc7XG4gIGlmIChmLmVuZHNXaXRoKCcuZG9jeCcpKVxuICAgIHJldHVybiAnSHVtYW4tcmVhZGFibGUgV29yZCBkb2N1bWVudCBcdTIwMTQgZWRpdGFibGUgZm9ybWF0JztcbiAgaWYgKGYuZW5kc1dpdGgoJy5odG1sJykpXG4gICAgcmV0dXJuICdIVE1MIGZvcm1hdCB3aXRoIGVtYmVkZGVkIEpTT04tTEQgc3RydWN0dXJlZCBkYXRhJztcbiAgcmV0dXJuICdHZW5lcmF0ZWQgZmlsZSc7XG59XG5cbmZ1bmN0aW9uIF9odG1sUHJldmlld0ZpbGUoZmlsZXMpIHtcbiAgLy8gUHJlZmVyIGh1bWFuLXJlYWRhYmxlIEhUTUwgKENWXyouaHRtbCwgbm90IEFUUylcbiAgY29uc3QgaHVtYW4gPSBmaWxlcy5maW5kKGYgPT4gZi5lbmRzV2l0aCgnLmh0bWwnKSAmJiAhZi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdhdHMnKSk7XG4gIHJldHVybiBodW1hbiB8fCBmaWxlcy5maW5kKGYgPT4gZi5lbmRzV2l0aCgnLmh0bWwnKSkgfHwgbnVsbDtcbn1cblxuZnVuY3Rpb24gX3JlbmRlclByZXZpZXdQYW5lKGh0bWxGaWxlKSB7XG4gIGlmICghaHRtbEZpbGUpIHJldHVybiAnJztcbiAgY29uc3QgYmFzZSA9IGh0bWxGaWxlLnNwbGl0KCcvJykucG9wKCk7XG4gIGNvbnN0IHNyYyA9IGAvYXBpL2Rvd25sb2FkLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGJhc2UpfWA7XG4gIHJldHVybiBgXG4gICAgPGRpdiBpZD1cImZpbmFsLXByZXZpZXctcGFuZVwiIHN0eWxlPVwibWFyZ2luLWJvdHRvbToyNHB4O2JvcmRlcjoxcHggc29saWQgI2UyZThmMDtib3JkZXItcmFkaXVzOjEwcHg7b3ZlcmZsb3c6aGlkZGVuOyR7X3ByZXZpZXdPcGVuID8gJycgOiAnZGlzcGxheTpub25lOyd9XCI+XG4gICAgICA8ZGl2IHN0eWxlPVwicGFkZGluZzoxMHB4IDE2cHg7YmFja2dyb3VuZDojZjFmNWY5O2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjEwcHg7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2UyZThmMDtcIj5cbiAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC45ZW07Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOiMxZTI5M2I7XCI+XHVEODNDXHVERjEwIEhUTUwgUHJldmlldzwvc3Bhbj5cbiAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC44ZW07Y29sb3I6IzY0NzQ4YjtmbGV4OjE7XCI+JHtlc2NhcGVIdG1sKGJhc2UpfTwvc3Bhbj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWQ9XCJmaW5hbC1wcmV2aWV3LWNsb3NlLWJ0blwiXG4gICAgICAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6MC44ZW07cGFkZGluZzozcHggMTBweDtib3JkZXI6MXB4IHNvbGlkICNjYmQ1ZTE7Ym9yZGVyLXJhZGl1czo1cHg7YmFja2dyb3VuZDojZmZmO2N1cnNvcjpwb2ludGVyO2NvbG9yOiM0NzU1Njk7XCJcbiAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiSGlkZSBwcmV2aWV3XCI+SGlkZTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IHN0eWxlPVwicG9zaXRpb246cmVsYXRpdmU7d2lkdGg6MTAwJTtwYWRkaW5nLXRvcDo1Ni4yNSU7YmFja2dyb3VuZDojZjhmYWZjO1wiPlxuICAgICAgICA8aWZyYW1lIGlkPVwiZmluYWwtY3YtcHJldmlld1wiXG4gICAgICAgICAgICAgICAgc3JjPVwiJHtzcmN9XCJcbiAgICAgICAgICAgICAgICB0aXRsZT1cIkZpbmFsIENWIEhUTUwgUHJldmlld1wiXG4gICAgICAgICAgICAgICAgc2FuZGJveD1cImFsbG93LXNhbWUtb3JpZ2luXCJcbiAgICAgICAgICAgICAgICByZWZlcnJlcnBvbGljeT1cIm5vLXJlZmVycmVyXCJcbiAgICAgICAgICAgICAgICBzdHlsZT1cInBvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JvcmRlcjpub25lO1wiXG4gICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkZpbmFsIGdlbmVyYXRlZCBDViBwcmV2aWV3XCI+PC9pZnJhbWU+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgVGFiIHJlbmRlcmVyIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4vKipcbiAqIFBvcHVsYXRlIHRoZSBcIkdlbmVyYXRlXCIgKGZpbmFsX2dlbmVyYXRlKSB0YWIgY29udGVudC5cbiAqIFNob3dzIGRvd25sb2FkIGxpbmtzIGZvciBhbGwgZmluYWwtZ2VuZXJhdGVkIGZpbGVzIGFuZCBhIFwiUHJvY2VlZCB0byBGaW5hbGlzZVwiIGJ1dHRvbi5cbiAqIEBwYXJhbSB7T2JqZWN0fSBjdkRhdGEgLSBDViBkYXRhIG9iamVjdCBmcm9tIHN0YXRlTWFuYWdlci5nZXRUYWJEYXRhKCdjdicpXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBvcHVsYXRlRmluYWxHZW5lcmF0ZVRhYihjdkRhdGEgPSB7fSkge1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgaWYgKCFjb250ZW50KSByZXR1cm47XG5cbiAgLy8gQ29sbGVjdCBjYW5kaWRhdGUgZmlsZXMsIGRlZHVwbGljYXRlXG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0KCk7XG4gIGNvbnN0IGNhbmRpZGF0ZXMgPSBbXG4gICAgY3ZEYXRhLmZpbmFsX2h0bWwsXG4gICAgY3ZEYXRhLmZpbmFsX3BkZixcbiAgICBjdkRhdGEuaHRtbCxcbiAgICBjdkRhdGEucGRmLFxuICAgIGN2RGF0YS5kb2N4LFxuICAgIGN2RGF0YS5hdHNfZG9jeCxcbiAgICBjdkRhdGEuaHVtYW5fZG9jeCxcbiAgICAuLi4oQXJyYXkuaXNBcnJheShjdkRhdGEuZmlsZXMpID8gY3ZEYXRhLmZpbGVzIDogW10pLFxuICBdLmZpbHRlcihCb29sZWFuKTtcblxuICBjb25zdCBmaWxlcyA9IFtdO1xuICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICBpZiAoc2Vlbi5oYXMoZmlsZW5hbWUpKSBjb250aW51ZTtcbiAgICBzZWVuLmFkZChmaWxlbmFtZSk7XG4gICAgaWYgKGZpbGVuYW1lLmVuZHNXaXRoKCcudHh0JykgfHwgZmlsZW5hbWUgPT09ICdqb2JfZGVzY3JpcHRpb24udHh0JykgY29udGludWU7XG4gICAgZmlsZXMucHVzaChmaWxlbmFtZSk7XG4gIH1cblxuICBjb25zdCBodG1sUHJldmlld0ZpbGUgPSBfaHRtbFByZXZpZXdGaWxlKGZpbGVzKTtcblxuICBsZXQgaHRtbCA9ICc8aDE+XHVEODNEXHVEQ0M0IEdlbmVyYXRlZCBGaWxlczwvaDE+JztcbiAgaHRtbCArPSAnPHAgc3R5bGU9XCJjb2xvcjojNDc1NTY5O21hcmdpbi1ib3R0b206OHB4O1wiPllvdXIgQ1YgZmlsZXMgYXJlIHJlYWR5IHRvIGRvd25sb2FkLiBQcmV2aWV3IHRoZSBIVE1MIHZlcnNpb24gYmVsb3csIHRoZW4gY2xpY2sgPHN0cm9uZz5Qcm9jZWVkIHRvIERvd25sb2FkIFJldmlldzwvc3Ryb25nPiB0byBydW4gQVRTIHZhbGlkYXRpb24gYW5kIGFyY2hpdmUgeW91ciBhcHBsaWNhdGlvbi48L3A+JztcbiAgaHRtbCArPSAnPHAgc3R5bGU9XCJmb250LXNpemU6MC44M2VtO2NvbG9yOiM5NGEzYjg7bWFyZ2luLWJvdHRvbToyMHB4O3BhZGRpbmc6OHB4IDEycHg7YmFja2dyb3VuZDojZjhmYWZjO2JvcmRlci1yYWRpdXM6NnB4O2JvcmRlci1sZWZ0OjNweCBzb2xpZCAjZTJlOGYwO1wiPlx1RDgzRFx1RENBMSA8ZW0+VGhpcyB0YWIgbGV0cyB5b3UgZG93bmxvYWQgZmlsZXMgaW1tZWRpYXRlbHkuIFRoZSA8c3Ryb25nPkZpbGUgUmV2aWV3PC9zdHJvbmc+IHN1Yi10YWIgaW4gRmluYWxpc2UgcnVucyBBVFMgY2hlY2tzLCBjb25maXJtcyB0aGUgcGFja2FnZSBpcyBjb21wbGV0ZSwgYW5kIGxldHMgeW91IGFyY2hpdmUgdGhlIGFwcGxpY2F0aW9uLjwvZW0+PC9wPic7XG5cbiAgaWYgKGh0bWxQcmV2aWV3RmlsZSkge1xuICAgIGNvbnN0IHNob3dIaWRlID0gX3ByZXZpZXdPcGVuID8gJ0hpZGUgcHJldmlldycgOiAnU2hvdyBwcmV2aWV3JztcbiAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxMnB4O2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDtcIj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlkPVwiZmluYWwtcHJldmlldy10b2dnbGUtYnRuXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO3BhZGRpbmc6NXB4IDE0cHg7Ym9yZGVyOjFweCBzb2xpZCAjM2I4MmY2O2JvcmRlci1yYWRpdXM6NnB4O2JhY2tncm91bmQ6JHtfcHJldmlld09wZW4gPyAnI2VmZjZmZicgOiAnI2ZmZid9O2NvbG9yOiMzYjgyZjY7Y3Vyc29yOnBvaW50ZXI7Zm9udC13ZWlnaHQ6NjAwO1wiXG4gICAgICAgICAgICAgIGFyaWEtZXhwYW5kZWQ9XCIke19wcmV2aWV3T3Blbn1cIlxuICAgICAgICAgICAgICBhcmlhLWNvbnRyb2xzPVwiZmluYWwtcHJldmlldy1wYW5lXCI+XG4gICAgICAgIFx1RDgzQ1x1REYxMCAke3Nob3dIaWRlfVxuICAgICAgPC9idXR0b24+XG4gICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjhlbTtjb2xvcjojOTRhM2I4O1wiPkluLWJyb3dzZXIgSFRNTCBwcmV2aWV3PC9zcGFuPlxuICAgIDwvZGl2PmA7XG4gICAgaHRtbCArPSBfcmVuZGVyUHJldmlld1BhbmUoaHRtbFByZXZpZXdGaWxlKTtcbiAgfVxuXG4gIGlmIChmaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICBodG1sICs9ICc8cCBzdHlsZT1cImNvbG9yOiM5Y2EzYWY7cGFkZGluZzoxNnB4O1wiPk5vIGZpbGVzIGdlbmVyYXRlZCB5ZXQuPC9wPic7XG4gIH0gZWxzZSB7XG4gICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cImRpc3BsYXk6Z3JpZDtnYXA6MTJweDttYXJnaW4tYm90dG9tOjI4cHg7XCI+JztcbiAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIGZpbGVzKSB7XG4gICAgICBjb25zdCBiYXNlICAgPSBmaWxlbmFtZS5zcGxpdCgnLycpLnBvcCgpO1xuICAgICAgY29uc3QgaWNvbiAgID0gX2ZpbGVJY29uKGZpbGVuYW1lKTtcbiAgICAgIGNvbnN0IGxhYmVsICA9IF9maWxlTGFiZWwoZmlsZW5hbWUpO1xuICAgICAgY29uc3QgZGVzYyAgID0gX2ZpbGVEZXNjcmlwdGlvbihmaWxlbmFtZSk7XG4gICAgICBodG1sICs9IGBcbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjE0cHg7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6I2Y4ZmFmYztib3JkZXI6MXB4IHNvbGlkICNlMmU4ZjA7XG4gICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MTRweCAxOHB4O1wiPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjEuOGVtO1wiPiR7aWNvbn08L3NwYW4+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImZsZXg6MTttaW4td2lkdGg6MDtcIj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjAuOTVlbTtjb2xvcjojMWUyOTNiO1wiPiR7ZXNjYXBlSHRtbChsYWJlbCl9PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuODNlbTtjb2xvcjojNjQ3NDhiO21hcmdpbi10b3A6MnB4O1wiPiR7ZXNjYXBlSHRtbChkZXNjKX08L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8YSBocmVmPVwiL2FwaS9kb3dubG9hZC8ke2VuY29kZVVSSUNvbXBvbmVudChiYXNlKX1cIlxuICAgICAgICAgICAgIGRvd25sb2FkPVwiJHtlc2NhcGVIdG1sKGJhc2UpfVwiXG4gICAgICAgICAgICAgc3R5bGU9XCJkaXNwbGF5OmlubGluZS1mbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6NnB4O1xuICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiMzYjgyZjY7Y29sb3I6I2ZmZjtcbiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzo3cHggMTZweDtib3JkZXItcmFkaXVzOjZweDtcbiAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOjAuODhlbTtmb250LXdlaWdodDo2MDA7dGV4dC1kZWNvcmF0aW9uOm5vbmU7XG4gICAgICAgICAgICAgICAgICAgIHdoaXRlLXNwYWNlOm5vd3JhcDtcIj5cbiAgICAgICAgICAgIFx1MkIwN1x1RkUwRiBEb3dubG9hZFxuICAgICAgICAgIDwvYT5cbiAgICAgICAgPC9kaXY+YDtcbiAgICB9XG4gICAgaHRtbCArPSAnPC9kaXY+JztcbiAgfVxuXG4gIGlmIChjdkRhdGEub3V0cHV0X2Rpcikge1xuICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjI0cHg7cGFkZGluZzoxMHB4IDE0cHg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6I2YxZjVmOTtib3JkZXItcmFkaXVzOjZweDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOjEzcHg7Y29sb3I6IzY0NzQ4YjtcIj5cbiAgICAgIDxzdHJvbmc+T3V0cHV0IGRpcmVjdG9yeTo8L3N0cm9uZz4gJHtlc2NhcGVIdG1sKGN2RGF0YS5vdXRwdXRfZGlyKX1cbiAgICA8L2Rpdj5gO1xuICB9XG5cbiAgaHRtbCArPSBgXG4gICAgPGRpdiBjbGFzcz1cIm5hdi1idXR0b25zIG5hdi1lbmRcIiBzdHlsZT1cIm1hcmdpbi10b3A6MjRweDtcIj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJjb250aW51ZS1idG5cIiBpZD1cImZpbmFsLWdlbmVyYXRlLWNvbnRpbnVlLWJ0blwiXG4gICAgICAgICAgICAgIG9uY2xpY2s9XCJmaW5hbEdlbmVyYXRpb25Db21wbGV0ZSgpXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6MWVtO3BhZGRpbmc6MTBweCAyNHB4O1wiPlxuICAgICAgICBcdTI3MDUgUHJvY2VlZCB0byBEb3dubG9hZCBSZXZpZXcgXHUyMTkyXG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5gO1xuXG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gaHRtbDtcblxuICAvLyBXaXJlIHVwIHByZXZpZXcgdG9nZ2xlXG4gIGlmIChodG1sUHJldmlld0ZpbGUpIHtcbiAgICBjb25zdCB0b2dnbGVCdG4gID0gY29udGVudC5xdWVyeVNlbGVjdG9yKCcjZmluYWwtcHJldmlldy10b2dnbGUtYnRuJyk7XG4gICAgY29uc3QgY2xvc2VCdG4gICA9IGNvbnRlbnQucXVlcnlTZWxlY3RvcignI2ZpbmFsLXByZXZpZXctY2xvc2UtYnRuJyk7XG4gICAgY29uc3QgcHJldmlld1BhbmUgPSBjb250ZW50LnF1ZXJ5U2VsZWN0b3IoJyNmaW5hbC1wcmV2aWV3LXBhbmUnKTtcblxuICAgIGNvbnN0IHNldFByZXZpZXdPcGVuID0gKG9wZW4pID0+IHtcbiAgICAgIF9wcmV2aWV3T3BlbiA9IG9wZW47XG4gICAgICBpZiAocHJldmlld1BhbmUpIHByZXZpZXdQYW5lLnN0eWxlLmRpc3BsYXkgPSBvcGVuID8gJycgOiAnbm9uZSc7XG4gICAgICBpZiAodG9nZ2xlQnRuKSB7XG4gICAgICAgIHRvZ2dsZUJ0bi50ZXh0Q29udGVudCA9IG9wZW4gPyAnXHVEODNDXHVERjEwIEhpZGUgcHJldmlldycgOiAnXHVEODNDXHVERjEwIFNob3cgcHJldmlldyc7XG4gICAgICAgIHRvZ2dsZUJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCBTdHJpbmcob3BlbikpO1xuICAgICAgICB0b2dnbGVCdG4uc3R5bGUuYmFja2dyb3VuZCA9IG9wZW4gPyAnI2VmZjZmZicgOiAnI2ZmZic7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRvZ2dsZUJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBzZXRQcmV2aWV3T3BlbighX3ByZXZpZXdPcGVuKSk7XG4gICAgY2xvc2VCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgICgpID0+IHNldFByZXZpZXdPcGVuKGZhbHNlKSk7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIFBoYXNlIHRyYW5zaXRpb24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8qKlxuICogQWR2YW5jZSB3b3JrZmxvdyBmcm9tIGZpbmFsX2dlbmVyYXRpb24gXHUyMTkyIHJlZmluZW1lbnQuXG4gKiBDYWxscyBQT1NUIC9hcGkvZmluYWwtZ2VuZXJhdGlvbi1jb21wbGV0ZSwgdXBkYXRlcyBmcm9udGVuZCBwaGFzZSwgYW5kXG4gKiBzd2l0Y2hlcyB0byB0aGUgZG93bmxvYWQgdGFiLlxuICovXG5hc3luYyBmdW5jdGlvbiBmaW5hbEdlbmVyYXRpb25Db21wbGV0ZSgpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGlDYWxsKCdQT1NUJywgJy9hcGkvZmluYWwtZ2VuZXJhdGlvbi1jb21wbGV0ZScsIHt9KTtcbiAgICBpZiAoIXJlcz8ub2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihyZXM/LmVycm9yIHx8ICdGYWlsZWQgdG8gYWR2YW5jZSB0byBGaWxlIFJldmlldyBzdGVwLicpO1xuICAgIH1cbiAgICBzdGF0ZU1hbmFnZXIuc2V0UGhhc2UoJ3JlZmluZW1lbnQnKTtcbiAgICBzd2l0Y2hUYWIoJ2Rvd25sb2FkJyk7XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ1x1MjcwNSBGaWxlcyBnZW5lcmF0ZWQuIFlvdSBjYW4gbm93IGZpbmFsaXNlIHlvdXIgYXBwbGljYXRpb24uJyk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy5lcnJvcignZmluYWxHZW5lcmF0aW9uQ29tcGxldGUgZXJyb3I6JywgZXJyKTtcbiAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCBgXHUyNzRDICR7ZXJyLm1lc3NhZ2V9YCk7XG4gIH1cbn1cblxuZXhwb3J0IHsgcG9wdWxhdGVGaW5hbEdlbmVyYXRlVGFiLCBmaW5hbEdlbmVyYXRpb25Db21wbGV0ZSB9O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiBcIlVwZGF0ZSB2aWEgQUlcIiBwYW5lbCAoR0FQLTAxKTogbmF0dXJhbC1sYW5ndWFnZSBpbnN0cnVjdGlvbiBvclxuICogZG9jdW1lbnQtaW5nZXN0aW9uIHVwZGF0ZXMgdG8gTWFzdGVyX0NWX0RhdGEuanNvbiwgcHJvcG9zZWQgYnkgYW4gTExNLFxuICogcmV2aWV3ZWQgYXMgYSBkaWZmLCBhbmQgd3JpdHRlbiBvbmx5IG9uIGV4cGxpY2l0IGNvbmZpcm1hdGlvbi5cbiAqXG4gKiBSZW5kZXJlZCBpbnNpZGUgdGhlIE1hc3RlciBDViB0YWIgKHNlZSB3ZWIvbWFzdGVyLWN2LmpzKSwgY29sbGFwc2VkIGJ5XG4gKiBkZWZhdWx0LiBSZXVzZXMgd2ViL3Byb3Bvc2FsLXJldmlldy5qcydzIHJvdyByZW5kZXJlciBmb3IgdGhlIGRpZmYgcmV2aWV3XG4gKiBsaXN0IHJhdGhlciB0aGFuIGZvcmtpbmcgYSB0aGlyZCBjb3B5IG9mIHRoYXQgVUkgKGhhcnZlc3QuanMgYW5kXG4gKiBsYXlvdXQtaW5zdHJ1Y3Rpb24uanMncyByZW5kZXJDb250ZW50UHJvcG9zYWxzIGFscmVhZHkgZXhpc3QpLlxuICpcbiAqIFB1YmxpYyBleHBvcnRzIChhc3NpZ25lZCB0byB3aW5kb3cgYnkgd2ViL3NyYy9tYWluLmpzJ3MgYnVuZGxlKTpcbiAqICAgcmVuZGVyTWFzdGVyRGF0YUFpVXBkYXRlUGFuZWwoKVxuICogICB0b2dnbGVNYXN0ZXJEYXRhQWlQYW5lbCgpXG4gKiAgIHNldE1hc3RlckRhdGFBaU1vZGUobW9kZSlcbiAqICAgaGFuZGxlTWFzdGVyRGF0YUFpRmlsZVVwbG9hZChldmVudClcbiAqICAgc3VibWl0TWFzdGVyRGF0YUFpUHJvcG9zZSgpXG4gKiAgIGRpc2NhcmRNYXN0ZXJEYXRhQWlQcm9wb3NhbCgpXG4gKiAgIGNvbmZpcm1NYXN0ZXJEYXRhQWlVcGRhdGUoKVxuICpcbiAqIEtleWJvYXJkOiBDdHJsL0NtZCtFbnRlciBvbiBlaXRoZXIgaW5wdXQgdGV4dGFyZWEgc3VibWl0cyBcIlByb3Bvc2UgVXBkYXRlXCJcbiAqICh3aXJlZCBsb2NhbGx5IHZpYSBvbmtleWRvd24sIG5vdCBrZXlib2FyZC1zaG9ydGN1dHMuanMncyBnbG9iYWxcbiAqIF9UQUJfQUNUSU9OX0JUTiBtYXAgXHUyMDE0IHRoZSBNYXN0ZXIgQ1YgdGFiIGhhcyBzZXZlcmFsIGluZGVwZW5kZW50IGZvcm1zIHdpdGhcbiAqIG5vIHNpbmdsZSBwcmltYXJ5IGFjdGlvbiwgc28gY2xhaW1pbmcgdGhpcyBwYW5lbCBhcyAqdGhlKiB0YWItd2lkZVxuICogQ3RybCtFbnRlciB0YXJnZXQgd291bGQgYmUgbWlzbGVhZGluZy9yZWdyZXNzIHRoZSB0YWIncyBvdGhlciBzYXZlXG4gKiBhY3Rpb25zOyBhIGxvY2FsLCBzY29wZWQgc2hvcnRjdXQgaXMgdGhlIGNvcnJlY3QgZml0IGhlcmUgaW5zdGVhZCkuXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZXNjLCByZW5kZXJQcm9wb3NhbFJvdywgYXR0YWNoUHJvcG9zYWxSb3dMaXN0ZW5lcnMgfSBmcm9tICcuL3Byb3Bvc2FsLXJldmlldy5qcyc7XG5cbmNvbnN0IGxvZyA9IGdldExvZ2dlcignbWFzdGVyLWRhdGEtYWktdXBkYXRlJyk7XG5cbi8vIFx1MjUwMFx1MjUwMCBTdGF0ZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbi8vIENsb3N1cmUtc2NvcGVkLCBjb25zaXN0ZW50IHdpdGggaG93IGhhcnZlc3QuanMgbWFuYWdlcyBpdHMgb3duIGxvY2FsIHN0YXRlIFx1MjAxNFxuLy8gdGhpcyBwYW5lbCBkb2Vzbid0IG5lZWQgdG8gcGFydGljaXBhdGUgaW4gc3RhdGUtbWFuYWdlci5qcydzIGdsb2JhbHMuXG5cbmxldCBfbWR1TW9kZSA9ICdubF9pbnN0cnVjdGlvbic7ICAgICAgICAgICAvLyAnbmxfaW5zdHJ1Y3Rpb24nIHwgJ2RvY3VtZW50X2luZ2VzdGlvbidcbmxldCBfbWR1UGVuZGluZ1Byb3Bvc2FsID0gbnVsbDsgICAgICAgICAgICAvLyB7IHByb3Bvc2FsSWQsIHNvdXJjZSwgY2hhbmdlcyB9XG5sZXQgX21kdVByaW9yQ2xhcmlmaWNhdGlvbnMgPSBbXTsgICAgICAgICAgLy8gW3txdWVzdGlvbiwgYW5zd2VyfSwgLi4uXVxuXG5mdW5jdGlvbiBfbWR1UmVzZXRTdGF0ZSgpIHtcbiAgX21kdU1vZGUgPSAnbmxfaW5zdHJ1Y3Rpb24nO1xuICBfbWR1UGVuZGluZ1Byb3Bvc2FsID0gbnVsbDtcbiAgX21kdVByaW9yQ2xhcmlmaWNhdGlvbnMgPSBbXTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFBhbmVsIHNoZWxsIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiByZW5kZXJNYXN0ZXJEYXRhQWlVcGRhdGVQYW5lbCgpIHtcbiAgLy8gUmVzZXQgbW9kdWxlIHN0YXRlIG9uIGV2ZXJ5IGZyZXNoIHJlbmRlciAobm90IGp1c3QgcGFnZSBsb2FkKSBcdTIwMTQgdGhlIERPTVxuICAvLyB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYWx3YXlzIGRlcGljdHMgdGhlIG5sX2luc3RydWN0aW9uL25vLXByb3Bvc2FsXG4gIC8vIGRlZmF1bHQsIHNvIGFueSBjYXJyaWVkLW92ZXIgc3RhdGUgZnJvbSBhIHByaW9yIHJlbmRlciAoZS5nLiB0aGUgdXNlclxuICAvLyBzd2l0Y2hlZCB0YWJzIG1pZC1wcm9wb3NhbCBhbmQgcG9wdWxhdGVNYXN0ZXJUYWIoKSByZS1yZW5kZXJlZCB0aGlzXG4gIC8vIHBhbmVsKSBtdXN0IGJlIGRpc2NhcmRlZCB0byBhdm9pZCB0aGUgdHdvIGdvaW5nIG91dCBvZiBzeW5jLlxuICBfbWR1UmVzZXRTdGF0ZSgpO1xuICByZXR1cm4gYFxuICAgIDxkaXYgaWQ9XCJtZHUtcGFuZWxcIiBzdHlsZT1cIm1hcmdpbjoxNnB4IDA7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1jdi1ib3JkZXIpO2JvcmRlci1yYWRpdXM6OHB4O292ZXJmbG93OmhpZGRlbjtcIj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlkPVwibWR1LXRvZ2dsZS1idG5cIiBvbmNsaWNrPVwidG9nZ2xlTWFzdGVyRGF0YUFpUGFuZWwoKVwiXG4gICAgICAgIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiIGFyaWEtY29udHJvbHM9XCJtZHUtcGFuZWwtYm9keVwiXG4gICAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTt0ZXh0LWFsaWduOmxlZnQ7YmFja2dyb3VuZDp2YXIoLS1jdi1iZy1saWdodCk7Ym9yZGVyOm5vbmU7cGFkZGluZzoxMnB4IDE2cHg7Zm9udC1zaXplOjAuOTVlbTtmb250LXdlaWdodDo3MDA7Y29sb3I6dmFyKC0tY3YtdGV4dC1wcmltYXJ5KTtjdXJzb3I6cG9pbnRlcjtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDo4cHg7XCI+XG4gICAgICAgIDxzcGFuIGlkPVwibWR1LXRvZ2dsZS1pY29uXCI+XHUyNUI4PC9zcGFuPiBcdUQ4M0VcdUREMTYgVXBkYXRlIHZpYSBBSVxuICAgICAgPC9idXR0b24+XG4gICAgICA8ZGl2IGlkPVwibWR1LXBhbmVsLWJvZHlcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtwYWRkaW5nOjE2cHg7XCI+XG4gICAgICAgIDxwIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtjb2xvcjp2YXIoLS1jdi10ZXh0LXNlY29uZGFyeSk7bWFyZ2luOjAgMCAxNHB4O1wiPlxuICAgICAgICAgIFByZWZlciBwbGFpbiBFbmdsaXNoLCBvciBoYXZlIGFuIG9sZCBDViBvciBMaW5rZWRJbiBleHBvcnQ/IERlc2NyaWJlIGEgY2hhbmdlIG9yIHBhc3RlL3VwbG9hZCBhXG4gICAgICAgICAgZG9jdW1lbnQgYW5kIEFJIHdpbGwgZHJhZnQgaXQgZm9yIHlvdSB0byByZXZpZXcgXHUyMDE0IG5vdGhpbmcgaXMgc2F2ZWQgdW50aWwgeW91IGNvbmZpcm0uXG4gICAgICAgIDwvcD5cblxuICAgICAgICA8ZGl2IHJvbGU9XCJ0YWJsaXN0XCIgYXJpYS1sYWJlbD1cIlVwZGF0ZSBtZXRob2RcIiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6NnB4O21hcmdpbi1ib3R0b206MTJweDtcIj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBpZD1cIm1kdS1tb2RlLW5sX2luc3RydWN0aW9uLWJ0blwiIHJvbGU9XCJ0YWJcIiBhcmlhLXNlbGVjdGVkPVwidHJ1ZVwiXG4gICAgICAgICAgICBvbmNsaWNrPVwic2V0TWFzdGVyRGF0YUFpTW9kZSgnbmxfaW5zdHJ1Y3Rpb24nKVwiXG4gICAgICAgICAgICBzdHlsZT1cInBhZGRpbmc6NnB4IDE0cHg7Zm9udC1zaXplOjAuODVlbTtib3JkZXItcmFkaXVzOjZweCA2cHggMCAwO2JvcmRlcjoxcHggc29saWQgdmFyKC0tY3YtYm9yZGVyKTtib3JkZXItYm90dG9tOm5vbmU7YmFja2dyb3VuZDp2YXIoLS1jdi13aGl0ZSk7Y29sb3I6dmFyKC0tY3YtdGV4dC1wcmltYXJ5KTtmb250LXdlaWdodDo2MDA7Y3Vyc29yOnBvaW50ZXI7XCI+XG4gICAgICAgICAgICBEZXNjcmliZSBhIGNoYW5nZVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlkPVwibWR1LW1vZGUtZG9jdW1lbnRfaW5nZXN0aW9uLWJ0blwiIHJvbGU9XCJ0YWJcIiBhcmlhLXNlbGVjdGVkPVwiZmFsc2VcIlxuICAgICAgICAgICAgb25jbGljaz1cInNldE1hc3RlckRhdGFBaU1vZGUoJ2RvY3VtZW50X2luZ2VzdGlvbicpXCJcbiAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZzo2cHggMTRweDtmb250LXNpemU6MC44NWVtO2JvcmRlci1yYWRpdXM6NnB4IDZweCAwIDA7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1jdi1ib3JkZXIpO2JvcmRlci1ib3R0b206bm9uZTtiYWNrZ3JvdW5kOnZhcigtLWN2LWJnLXN1YnRsZSk7Y29sb3I6dmFyKC0tY3YtdGV4dC1zZWNvbmRhcnkpO2N1cnNvcjpwb2ludGVyO1wiPlxuICAgICAgICAgICAgUGFzdGUgb3IgdXBsb2FkIGEgZG9jdW1lbnRcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBpZD1cIm1kdS1ubF9pbnN0cnVjdGlvbi1pbnB1dC1hcmVhXCI+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cIm1kdS1ubC10ZXh0YXJlYVwiIHN0eWxlPVwiZm9udC1zaXplOjAuODJlbTtmb250LXdlaWdodDo2MDA7Y29sb3I6dmFyKC0tY3YtdGV4dC1tdXRlZCk7ZGlzcGxheTpibG9jazttYXJnaW4tYm90dG9tOjRweDtcIj5cbiAgICAgICAgICAgIERlc2NyaWJlIHRoZSBjaGFuZ2VcbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDx0ZXh0YXJlYSBpZD1cIm1kdS1ubC10ZXh0YXJlYVwiIHJvd3M9XCIzXCIgbWF4bGVuZ3RoPVwiNDAwMFwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gJnF1b3Q7SSBqdXN0IGZpbmlzaGVkIGEgcHJvamVjdCBhdCBBY21lIHVzaW5nIEt1YmVybmV0ZXMgXHUyMDE0IGFkZCBpdCB0byB0aGF0IHJvbGUncyBhY2hpZXZlbWVudHMuJnF1b3Q7XCJcbiAgICAgICAgICAgIG9ua2V5ZG93bj1cImlmKChldmVudC5jdHJsS2V5fHxldmVudC5tZXRhS2V5KSYmZXZlbnQua2V5PT09J0VudGVyJyl7ZXZlbnQucHJldmVudERlZmF1bHQoKTtzdWJtaXRNYXN0ZXJEYXRhQWlQcm9wb3NlKCk7fVwiXG4gICAgICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Ym94LXNpemluZzpib3JkZXItYm94O3BhZGRpbmc6OHB4O2JvcmRlcjoxcHggc29saWQgdmFyKC0tY3YtYm9yZGVyKTtib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6MC44OGVtO3Jlc2l6ZTp2ZXJ0aWNhbDtcIj48L3RleHRhcmVhPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGlkPVwibWR1LWRvY3VtZW50X2luZ2VzdGlvbi1pbnB1dC1hcmVhXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cIm1kdS1kb2MtdGV4dGFyZWFcIiBzdHlsZT1cImZvbnQtc2l6ZTowLjgyZW07Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOnZhcigtLWN2LXRleHQtbXV0ZWQpO2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWJvdHRvbTo0cHg7XCI+XG4gICAgICAgICAgICBQYXN0ZSBkb2N1bWVudCB0ZXh0LCBvciB1cGxvYWQgYSBmaWxlXG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8dGV4dGFyZWEgaWQ9XCJtZHUtZG9jLXRleHRhcmVhXCIgcm93cz1cIjRcIiBtYXhsZW5ndGg9XCI2MDAwMFwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlBhc3RlIGFuIG9sZCBDViBvciBMaW5rZWRJbiBleHBvcnQuLi5cIlxuICAgICAgICAgICAgb25rZXlkb3duPVwiaWYoKGV2ZW50LmN0cmxLZXl8fGV2ZW50Lm1ldGFLZXkpJiZldmVudC5rZXk9PT0nRW50ZXInKXtldmVudC5wcmV2ZW50RGVmYXVsdCgpO3N1Ym1pdE1hc3RlckRhdGFBaVByb3Bvc2UoKTt9XCJcbiAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTtib3gtc2l6aW5nOmJvcmRlci1ib3g7cGFkZGluZzo4cHg7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1jdi1ib3JkZXIpO2JvcmRlci1yYWRpdXM6NHB4O2ZvbnQtc2l6ZTowLjg4ZW07cmVzaXplOnZlcnRpY2FsO21hcmdpbi1ib3R0b206OHB4O1wiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgaWQ9XCJtZHUtZG9jLWZpbGUtaW5wdXRcIiBhY2NlcHQ9XCIudHh0LC5tZCwucnN0LC5odG1sLC5odG0sLnBkZiwuZG9jeCwucnRmXCJcbiAgICAgICAgICAgIG9uY2hhbmdlPVwiaGFuZGxlTWFzdGVyRGF0YUFpRmlsZVVwbG9hZChldmVudClcIiBhcmlhLWRlc2NyaWJlZGJ5PVwibWR1LXVwbG9hZC1kaXNjbG9zdXJlXCJcbiAgICAgICAgICAgIHN0eWxlPVwiZm9udC1zaXplOjAuODJlbTtcIj5cbiAgICAgICAgICA8cCBpZD1cIm1kdS11cGxvYWQtZGlzY2xvc3VyZVwiIHN0eWxlPVwiZm9udC1zaXplOjAuNzhlbTtjb2xvcjp2YXIoLS1jdi10ZXh0LXNlY29uZGFyeSk7bWFyZ2luOjZweCAwIDA7XCI+XG4gICAgICAgICAgICBUaGlzIGRvY3VtZW50IHdpbGwgYmUgc2VudCB0byB5b3VyIGNvbmZpZ3VyZWQgQUkgcHJvdmlkZXIgXHUyMDE0IHNlZSB0aGUgZGF0YSBoYW5kbGluZyBiYWRnZSBhYm92ZS5cbiAgICAgICAgICAgIEFuIG9sZCBDViBvciBMaW5rZWRJbiBleHBvcnQgY2FuIGNhcnJ5IG1vcmUgcGVyc29uYWwgaW5mb3JtYXRpb24gdGhhbiBhIGpvYiBkZXNjcmlwdGlvbi5cbiAgICAgICAgICA8L3A+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjhweDthbGlnbi1pdGVtczpjZW50ZXI7bWFyZ2luLXRvcDoxMnB4O1wiPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlkPVwibWR1LXByb3Bvc2UtYnRuXCIgb25jbGljaz1cInN1Ym1pdE1hc3RlckRhdGFBaVByb3Bvc2UoKVwiXG4gICAgICAgICAgICBzdHlsZT1cInBhZGRpbmc6OHB4IDE4cHg7Zm9udC1zaXplOjAuODhlbTtmb250LXdlaWdodDo2MDA7Y3Vyc29yOnBvaW50ZXI7YmFja2dyb3VuZDp2YXIoLS1jdi1hY2NlbnQpO2NvbG9yOnZhcigtLWN2LXdoaXRlKTtib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjZweDtcIj5cbiAgICAgICAgICAgIFByb3Bvc2UgVXBkYXRlXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWQ9XCJtZHUtZGlzY2FyZC1idG5cIiBvbmNsaWNrPVwiZGlzY2FyZE1hc3RlckRhdGFBaVByb3Bvc2FsKClcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtwYWRkaW5nOjhweCAxNHB4O2ZvbnQtc2l6ZTowLjg1ZW07Y3Vyc29yOnBvaW50ZXI7YmFja2dyb3VuZDp2YXIoLS1jdi13aGl0ZSk7Y29sb3I6dmFyKC0tY3YtdGV4dC1zZWNvbmRhcnkpO2JvcmRlcjoxcHggc29saWQgdmFyKC0tY3YtYm9yZGVyKTtib3JkZXItcmFkaXVzOjZweDtcIj5cbiAgICAgICAgICAgIERpc2NhcmRcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBpZD1cIm1kdS1zdGF0dXNcIiByb2xlPVwic3RhdHVzXCIgYXJpYS1saXZlPVwicG9saXRlXCIgc3R5bGU9XCJtYXJnaW4tdG9wOjEwcHg7Zm9udC1zaXplOjAuODVlbTtjb2xvcjp2YXIoLS1jdi10ZXh0LXNlY29uZGFyeSk7XCI+PC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJtZHUtY2xhcmlmaWNhdGlvbi1jb250YWluZXJcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cIm1kdS1yZXZpZXctYXJlYVwiIHN0eWxlPVwibWFyZ2luLXRvcDoxMnB4O1wiPjwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwibWR1LXJlc3VsdFwiIHN0eWxlPVwibWFyZ2luLXRvcDoxMnB4O1wiPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+YDtcbn1cblxuZnVuY3Rpb24gcmVuZGVyTWFzdGVyRGF0YUFpVXBkYXRlRGlzYWJsZWROb3RlKCkge1xuICByZXR1cm4gYFxuICAgIDxkaXYgc3R5bGU9XCJtYXJnaW46MTZweCAwO3BhZGRpbmc6MTBweCAxNHB4O2JhY2tncm91bmQ6dmFyKC0tY3YtYmctc3VidGxlKTtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWN2LWJvcmRlcik7Ym9yZGVyLXJhZGl1czo2cHg7Zm9udC1zaXplOjAuODVlbTtjb2xvcjp2YXIoLS1jdi10ZXh0LXNlY29uZGFyeSk7XCI+XG4gICAgICBcdUQ4M0VcdUREMTYgVXBkYXRlIHZpYSBBSSBpcyBhdmFpbGFibGUgYmVmb3JlIGFuYWx5c2lzIHN0YXJ0cyBvciBkdXJpbmcgcmVmaW5lbWVudC5cbiAgICA8L2Rpdj5gO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgUGFuZWwgZXhwYW5kL2NvbGxhcHNlICsgbW9kZSB0b2dnbGUgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIHRvZ2dsZU1hc3RlckRhdGFBaVBhbmVsKCkge1xuICBjb25zdCBib2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1wYW5lbC1ib2R5Jyk7XG4gIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtdG9nZ2xlLWJ0bicpO1xuICBjb25zdCBpY29uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS10b2dnbGUtaWNvbicpO1xuICBpZiAoIWJvZHkgfHwgIWJ0bikgcmV0dXJuO1xuICBjb25zdCBleHBhbmRlZCA9IGJvZHkuc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnO1xuICBib2R5LnN0eWxlLmRpc3BsYXkgPSBleHBhbmRlZCA/ICdub25lJyA6ICdibG9jayc7XG4gIGJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCBTdHJpbmcoIWV4cGFuZGVkKSk7XG4gIGlmIChpY29uKSBpY29uLnRleHRDb250ZW50ID0gZXhwYW5kZWQgPyAnXHUyNUI4JyA6ICdcdTI1QkUnO1xufVxuXG5mdW5jdGlvbiBzZXRNYXN0ZXJEYXRhQWlNb2RlKG1vZGUpIHtcbiAgX21kdU1vZGUgPSBtb2RlO1xuICBmb3IgKGNvbnN0IG0gb2YgWydubF9pbnN0cnVjdGlvbicsICdkb2N1bWVudF9pbmdlc3Rpb24nXSkge1xuICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBtZHUtbW9kZS0ke219LWJ0bmApO1xuICAgIGNvbnN0IGFyZWEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgbWR1LSR7bX0taW5wdXQtYXJlYWApO1xuICAgIGNvbnN0IGFjdGl2ZSA9IG0gPT09IG1vZGU7XG4gICAgaWYgKGJ0bikge1xuICAgICAgYnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1zZWxlY3RlZCcsIFN0cmluZyhhY3RpdmUpKTtcbiAgICAgIGJ0bi5zdHlsZS5iYWNrZ3JvdW5kID0gYWN0aXZlID8gJ3ZhcigtLWN2LXdoaXRlKScgOiAndmFyKC0tY3YtYmctc3VidGxlKSc7XG4gICAgICBidG4uc3R5bGUuY29sb3IgPSBhY3RpdmUgPyAndmFyKC0tY3YtdGV4dC1wcmltYXJ5KScgOiAndmFyKC0tY3YtdGV4dC1zZWNvbmRhcnkpJztcbiAgICAgIGJ0bi5zdHlsZS5mb250V2VpZ2h0ID0gYWN0aXZlID8gJzYwMCcgOiAnNDAwJztcbiAgICB9XG4gICAgaWYgKGFyZWEpIGFyZWEuc3R5bGUuZGlzcGxheSA9IGFjdGl2ZSA/ICdibG9jaycgOiAnbm9uZSc7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIERvY3VtZW50IHVwbG9hZCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gaGFuZGxlTWFzdGVyRGF0YUFpRmlsZVVwbG9hZChldmVudCkge1xuICBjb25zdCBmaWxlID0gZXZlbnQudGFyZ2V0LmZpbGVzICYmIGV2ZW50LnRhcmdldC5maWxlc1swXTtcbiAgaWYgKCFmaWxlKSByZXR1cm47XG4gIGNvbnN0IHN0YXR1c0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1zdGF0dXMnKTtcbiAgaWYgKHN0YXR1c0VsKSBzdGF0dXNFbC50ZXh0Q29udGVudCA9IGBSZWFkaW5nICR7ZmlsZS5uYW1lfVx1MjAyNmA7XG4gIHRyeSB7XG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ2ZpbGUnLCBmaWxlKTtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2goJy9hcGkvdXBsb2FkLWZpbGUnLCB7IG1ldGhvZDogJ1BPU1QnLCBib2R5OiBmb3JtRGF0YSB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcC5qc29uKCk7XG4gICAgaWYgKCFyZXNwLm9rIHx8IGRhdGEuZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihkYXRhLm1lc3NhZ2UgfHwgZGF0YS5lcnJvciB8fCBgU2VydmVyIGVycm9yICR7cmVzcC5zdGF0dXN9YCk7XG4gICAgfVxuICAgIGNvbnN0IHRleHRhcmVhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1kb2MtdGV4dGFyZWEnKTtcbiAgICBpZiAodGV4dGFyZWEpIHRleHRhcmVhLnZhbHVlID0gZGF0YS50ZXh0O1xuICAgIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSBgTG9hZGVkICR7ZGF0YS5jb250ZW50X2xlbmd0aC50b0xvY2FsZVN0cmluZygpfSBjaGFyYWN0ZXJzIGZyb20gXCIke2RhdGEuZmlsZW5hbWV9XCIuYDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLmVycm9yKCdoYW5kbGVNYXN0ZXJEYXRhQWlGaWxlVXBsb2FkOiBmYWlsZWQnLCBlcnIpO1xuICAgIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSBgRXJyb3IgcmVhZGluZyBmaWxlOiAke2Vyci5tZXNzYWdlfWA7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIFByb3Bvc2UgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIF9tZHVFbmRwb2ludEZvck1vZGUobW9kZSkge1xuICByZXR1cm4gbW9kZSA9PT0gJ25sX2luc3RydWN0aW9uJyA/ICcvYXBpL21hc3Rlci1kYXRhL25sLXVwZGF0ZS9wcm9wb3NlJyA6ICcvYXBpL21hc3Rlci1kYXRhL2luZ2VzdC1kb2N1bWVudC9wcm9wb3NlJztcbn1cblxuZnVuY3Rpb24gX21kdUlucHV0Rm9yTW9kZShtb2RlKSB7XG4gIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobW9kZSA9PT0gJ25sX2luc3RydWN0aW9uJyA/ICdtZHUtbmwtdGV4dGFyZWEnIDogJ21kdS1kb2MtdGV4dGFyZWEnKTtcbiAgcmV0dXJuIGVsID8gZWwudmFsdWUudHJpbSgpIDogJyc7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN1Ym1pdE1hc3RlckRhdGFBaVByb3Bvc2UoKSB7XG4gIGNvbnN0IGlucHV0ID0gX21kdUlucHV0Rm9yTW9kZShfbWR1TW9kZSk7XG4gIGNvbnN0IHN0YXR1c0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1zdGF0dXMnKTtcbiAgY29uc3QgcmV2aWV3QXJlYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtcmV2aWV3LWFyZWEnKTtcbiAgY29uc3QgcmVzdWx0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWR1LXJlc3VsdCcpO1xuICBjb25zdCBwcm9wb3NlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1wcm9wb3NlLWJ0bicpO1xuXG4gIGlmICghaW5wdXQpIHtcbiAgICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gX21kdU1vZGUgPT09ICdubF9pbnN0cnVjdGlvbidcbiAgICAgID8gJ1BsZWFzZSBkZXNjcmliZSB0aGUgY2hhbmdlIGZpcnN0LidcbiAgICAgIDogJ1BsZWFzZSBwYXN0ZSBvciB1cGxvYWQgZG9jdW1lbnQgdGV4dCBmaXJzdC4nO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChyZXZpZXdBcmVhKSByZXZpZXdBcmVhLmlubmVySFRNTCA9ICcnO1xuICBpZiAocmVzdWx0RWwpIHJlc3VsdEVsLmlubmVySFRNTCA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWR1LWNsYXJpZmljYXRpb24tY29udGFpbmVyJykuaW5uZXJIVE1MID0gJyc7XG4gIGlmIChwcm9wb3NlQnRuKSB7IHByb3Bvc2VCdG4uZGlzYWJsZWQgPSB0cnVlOyBwcm9wb3NlQnRuLnRleHRDb250ZW50ID0gJ0FuYWx5emluZ1x1MjAyNic7IH1cbiAgaWYgKHN0YXR1c0VsKSBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICdBbmFseXppbmdcdTIwMjYnO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgYm9keSA9IHsgcHJpb3JfY2xhcmlmaWNhdGlvbnM6IF9tZHVQcmlvckNsYXJpZmljYXRpb25zIH07XG4gICAgYm9keVtfbWR1TW9kZSA9PT0gJ25sX2luc3RydWN0aW9uJyA/ICdpbnN0cnVjdGlvbicgOiAndGV4dCddID0gaW5wdXQ7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKF9tZHVFbmRwb2ludEZvck1vZGUoX21kdU1vZGUpLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3AuanNvbigpO1xuXG4gICAgaWYgKCFyZXNwLm9rIHx8IGRhdGEub2sgPT09IGZhbHNlKSB7XG4gICAgICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gYEVycm9yOiAke2VzYyhkYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yJyl9YDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZGF0YS5yZXF1aXJlc19jbGFyaWZpY2F0aW9uKSB7XG4gICAgICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJyc7XG4gICAgICBfbWR1U2hvd0NsYXJpZmljYXRpb25EaWFsb2coZGF0YS5jbGFyaWZpY2F0aW9uX3F1ZXN0aW9uLCBpbnB1dCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgX21kdVByaW9yQ2xhcmlmaWNhdGlvbnMgPSBbXTtcbiAgICBjb25zdCBjaGFuZ2VzID0gZGF0YS5jaGFuZ2VzIHx8IFtdO1xuICAgIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnJztcblxuICAgIGlmIChjaGFuZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaWYgKHJldmlld0FyZWEpIHJldmlld0FyZWEuaW5uZXJIVE1MID0gYDxwIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtjb2xvcjp2YXIoLS1jdi10ZXh0LXNlY29uZGFyeSk7XCI+Tm8gY2hhbmdlcyBjb3VsZCBiZSBwcm9wb3NlZCBmcm9tIHRoYXQgXHUyMDE0IHRyeSBhZGRpbmcgbW9yZSBkZXRhaWwuPC9wPmA7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgX21kdVBlbmRpbmdQcm9wb3NhbCA9IHsgcHJvcG9zYWxJZDogZGF0YS5wcm9wb3NhbF9pZCwgc291cmNlOiBfbWR1TW9kZSwgY2hhbmdlcyB9O1xuICAgIF9tZHVSZW5kZXJSZXZpZXdBcmVhKCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy5lcnJvcignc3VibWl0TWFzdGVyRGF0YUFpUHJvcG9zZTogZmFpbGVkJywgZXJyKTtcbiAgICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gYE5ldHdvcmsgZXJyb3I6ICR7ZXNjKGVyci5tZXNzYWdlKX1gO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChwcm9wb3NlQnRuKSB7IHByb3Bvc2VCdG4uZGlzYWJsZWQgPSBmYWxzZTsgcHJvcG9zZUJ0bi50ZXh0Q29udGVudCA9ICdQcm9wb3NlIFVwZGF0ZSc7IH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkaXNjYXJkTWFzdGVyRGF0YUFpUHJvcG9zYWwoKSB7XG4gIF9tZHVQZW5kaW5nUHJvcG9zYWwgPSBudWxsO1xuICBfbWR1UHJpb3JDbGFyaWZpY2F0aW9ucyA9IFtdO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWR1LXJldmlldy1hcmVhJykuaW5uZXJIVE1MID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtcmVzdWx0JykuaW5uZXJIVE1MID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtZGlzY2FyZC1idG4nKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBjb25zdCBzdGF0dXNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtc3RhdHVzJyk7XG4gIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnRGlzY2FyZGVkLic7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBDbGFyaWZpY2F0aW9uIGRpYWxvZyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbi8vIE1vZGVsZWQgb24gc2hvd0NsYXJpZmljYXRpb25EaWFsb2coKSBpbiB3ZWIvbGF5b3V0LWluc3RydWN0aW9uLmpzLCBub3QgYVxuLy8gbGl0ZXJhbCBjb3B5LXBhc3RlIHBvcnQ6IHRoYXQgdmVyc2lvbiBoYXJkLWNvZGVzIGl0cyBtb3VudCBwb2ludCBhbmQgdXNlc1xuLy8gbm9uLW5hbWVzcGFjZWQgZWxlbWVudCBpZHMgKGxheW91dC1jbGFyaWZpY2F0aW9uLSopLCB3aGljaCB3b3VsZCBjb2xsaWRlXG4vLyB3aXRoIHRoaXMgcGFuZWwncyBvd24gaWRzIGlmIGJvdGggdGFicyBhcmUgcHJlc2VudCBpbiB0aGUgRE9NIGF0IG9uY2Vcbi8vIChDU1MtaGlkZGVuIHRhYnMgYXJlbid0IHVubW91bnRlZCkuIFRoaXMgdmVyc2lvbiBtb3VudHMgaW50byB0aGUgcGFuZWwnc1xuLy8gb3duICNtZHUtY2xhcmlmaWNhdGlvbi1jb250YWluZXIgYW5kIHVzZXMgYW4gbWR1LSogaWQgbmFtZXNwYWNlIHRocm91Z2hvdXQuXG5cbmZ1bmN0aW9uIF9tZHVTaG93Q2xhcmlmaWNhdGlvbkRpYWxvZyhxdWVzdGlvbiwgb3JpZ2luYWxJbnN0cnVjdGlvbikge1xuICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWR1LWNsYXJpZmljYXRpb24tY29udGFpbmVyJyk7XG4gIGlmICghY29udGFpbmVyKSB7XG4gICAgbG9nLndhcm4oJ19tZHVTaG93Q2xhcmlmaWNhdGlvbkRpYWxvZzogI21kdS1jbGFyaWZpY2F0aW9uLWNvbnRhaW5lciBub3QgZm91bmQnKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBvcmlnaW5hdGluZ0J0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtcHJvcG9zZS1idG4nKTtcblxuICBjb25zdCBwYW5lbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBwYW5lbC5pZCA9ICdtZHUtY2xhcmlmaWNhdGlvbi1wYW5lbCc7XG4gIHBhbmVsLnNldEF0dHJpYnV0ZSgncm9sZScsICdhbGVydCcpO1xuICBwYW5lbC5zdHlsZS5jc3NUZXh0ID0gJ2JhY2tncm91bmQ6dmFyKC0tY3Ytd2Fybi1iZyk7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1jdi13YXJuLWxpZ2h0KTtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjE0cHg7bWFyZ2luLXRvcDoxMHB4Oyc7XG4gIHBhbmVsLmlubmVySFRNTCA9IGBcbiAgICA8cCBzdHlsZT1cIm1hcmdpbjowIDAgNnB4O2ZvbnQtc2l6ZTowLjg1ZW07Y29sb3I6dmFyKC0tY3Ytd2Fybi10ZXh0KTtmb250LXdlaWdodDo2MDA7XCI+XG4gICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj5cdTI3NTM8L3NwYW4+IEFsbW9zdCB0aGVyZSBcdTIwMTQgYSBiaXQgbW9yZSBkZXRhaWwgd291bGQgaGVscDpcbiAgICA8L3A+XG4gICAgPHAgc3R5bGU9XCJtYXJnaW46MCAwIDEwcHg7Zm9udC1zaXplOjAuODhlbTtjb2xvcjp2YXIoLS1jdi13YXJuLXRleHQpO1wiPiR7ZXNjKHF1ZXN0aW9uKX08L3A+XG4gICAgPGxhYmVsIGZvcj1cIm1kdS1jbGFyaWZpY2F0aW9uLWlucHV0XCIgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjp2YXIoLS1jdi10ZXh0LW11dGVkKTtkaXNwbGF5OmJsb2NrO21hcmdpbi1ib3R0b206NHB4O1wiPlxuICAgICAgWW91ciBjbGFyaWZpY2F0aW9uOlxuICAgIDwvbGFiZWw+XG4gICAgPHRleHRhcmVhIGlkPVwibWR1LWNsYXJpZmljYXRpb24taW5wdXRcIiByb3dzPVwiMlwiXG4gICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Ym94LXNpemluZzpib3JkZXItYm94O3BhZGRpbmc6OHB4O2JvcmRlcjoxcHggc29saWQgdmFyKC0tY3Ytd2Fybi1saWdodCk7Ym9yZGVyLXJhZGl1czo0cHg7Zm9udC1zaXplOjAuODhlbTtyZXNpemU6dmVydGljYWw7XCJcbiAgICAgIGFyaWEtbGFiZWw9XCJDbGFyaWZpY2F0aW9uIGZvciBtYXN0ZXIgZGF0YSB1cGRhdGVcIj4ke2VzYyhvcmlnaW5hbEluc3RydWN0aW9uKX08L3RleHRhcmVhPlxuICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjhweDttYXJnaW4tdG9wOjhweDtcIj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlkPVwibWR1LWNsYXJpZmljYXRpb24tc3VibWl0XCJcbiAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOnZhcigtLWN2LXdhcm4pO2NvbG9yOnZhcigtLWN2LXdoaXRlKTtib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjZweCAxNHB4O2ZvbnQtc2l6ZTowLjg1ZW07Y3Vyc29yOnBvaW50ZXI7Zm9udC13ZWlnaHQ6NjAwO1wiPlxuICAgICAgICBTdWJtaXQgY2xhcmlmaWNhdGlvblxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBpZD1cIm1kdS1jbGFyaWZpY2F0aW9uLWNhbmNlbFwiXG4gICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDpub25lO2JvcmRlcjoxcHggc29saWQgdmFyKC0tY3Ytd2Fybik7Y29sb3I6dmFyKC0tY3Ytd2Fybi10ZXh0KTtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjZweCAxNHB4O2ZvbnQtc2l6ZTowLjg1ZW07Y3Vyc29yOnBvaW50ZXI7XCI+XG4gICAgICAgIENhbmNlbFxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+YDtcblxuICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG4gIGNvbnRhaW5lci5hcHBlbmRDaGlsZChwYW5lbCk7XG5cbiAgY29uc3QgY2xhcklucHV0ID0gcGFuZWwucXVlcnlTZWxlY3RvcignI21kdS1jbGFyaWZpY2F0aW9uLWlucHV0Jyk7XG4gIGNvbnN0IHN1Ym1pdEJ0biA9IHBhbmVsLnF1ZXJ5U2VsZWN0b3IoJyNtZHUtY2xhcmlmaWNhdGlvbi1zdWJtaXQnKTtcbiAgY29uc3QgY2FuY2VsQnRuID0gcGFuZWwucXVlcnlTZWxlY3RvcignI21kdS1jbGFyaWZpY2F0aW9uLWNhbmNlbCcpO1xuXG4gIGNsYXJJbnB1dC5mb2N1cygpO1xuICBjbGFySW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2UoY2xhcklucHV0LnZhbHVlLmxlbmd0aCwgY2xhcklucHV0LnZhbHVlLmxlbmd0aCk7XG5cbiAgY29uc3QgY2xvc2VBbmRSZXN0b3JlRm9jdXMgPSAoKSA9PiB7XG4gICAgcGFuZWwucmVtb3ZlKCk7XG4gICAgaWYgKG9yaWdpbmF0aW5nQnRuKSBvcmlnaW5hdGluZ0J0bi5mb2N1cygpO1xuICB9O1xuXG4gIHN1Ym1pdEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBjb25zdCByZWZpbmVkID0gY2xhcklucHV0LnZhbHVlLnRyaW0oKTtcbiAgICBpZiAocmVmaW5lZCkge1xuICAgICAgX21kdVByaW9yQ2xhcmlmaWNhdGlvbnMgPSBbLi4uX21kdVByaW9yQ2xhcmlmaWNhdGlvbnMsIHsgcXVlc3Rpb24sIGFuc3dlcjogcmVmaW5lZCB9XTtcbiAgICAgIGNvbnN0IGlucHV0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChfbWR1TW9kZSA9PT0gJ25sX2luc3RydWN0aW9uJyA/ICdtZHUtbmwtdGV4dGFyZWEnIDogJ21kdS1kb2MtdGV4dGFyZWEnKTtcbiAgICAgIGlmIChpbnB1dEVsKSBpbnB1dEVsLnZhbHVlID0gcmVmaW5lZDtcbiAgICB9XG4gICAgY2xvc2VBbmRSZXN0b3JlRm9jdXMoKTtcbiAgICBpZiAocmVmaW5lZCkgc3VibWl0TWFzdGVyRGF0YUFpUHJvcG9zZSgpO1xuICB9KTtcbiAgY2FuY2VsQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xvc2VBbmRSZXN0b3JlRm9jdXMpO1xuICBjbGFySW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChlKSA9PiB7XG4gICAgaWYgKGUua2V5ID09PSAnRW50ZXInICYmICFlLnNoaWZ0S2V5KSB7IGUucHJldmVudERlZmF1bHQoKTsgc3VibWl0QnRuLmNsaWNrKCk7IH1cbiAgICBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSBjYW5jZWxCdG4uY2xpY2soKTtcbiAgfSk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBSZXZpZXcgYXJlYSAocHJvcG9zYWwgcm93cykgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIF9tZHVDaGFuZ2VEaXNwbGF5VGV4dChjaGFuZ2UpIHtcbiAgY29uc3QgcHJvcG9zZWQgPSBjaGFuZ2UucHJvcG9zZWQ7XG4gIGlmICh0eXBlb2YgcHJvcG9zZWQgPT09ICdzdHJpbmcnKSByZXR1cm4gcHJvcG9zZWQ7XG4gIGlmIChwcm9wb3NlZCAmJiB0eXBlb2YgcHJvcG9zZWQgPT09ICdvYmplY3QnKSB7XG4gICAgaWYgKCd0ZXh0JyBpbiBwcm9wb3NlZCkgcmV0dXJuIHByb3Bvc2VkLnRleHQ7XG4gICAgaWYgKCduYW1lJyBpbiBwcm9wb3NlZCkgcmV0dXJuIHByb3Bvc2VkLm5hbWU7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHByb3Bvc2VkKTtcbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIF9tZHVGbGFnSHRtbChjaGFuZ2UpIHtcbiAgaWYgKGNoYW5nZS5wb3NzaWJsZV9kdXBsaWNhdGVfb2YpIHtcbiAgICByZXR1cm4gYDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjZweDtwYWRkaW5nOjZweCA4cHg7YmFja2dyb3VuZDp2YXIoLS1jdi13YXJuLWJnKTtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWN2LXdhcm4tYm9yZGVyKTtib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6MC44ZW07Y29sb3I6dmFyKC0tY3Ytd2Fybi10ZXh0KTtcIj5cbiAgICAgIFx1MjZBMCBwb3NzaWJsZSBkdXBsaWNhdGUgb2YgJHtlc2MoY2hhbmdlLnBvc3NpYmxlX2R1cGxpY2F0ZV9vZil9XG4gICAgPC9kaXY+YDtcbiAgfVxuICBpZiAoY2hhbmdlLnBlcnN1YXNpb25fZmxhZ3MgJiYgY2hhbmdlLnBlcnN1YXNpb25fZmxhZ3MubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTo2cHg7cGFkZGluZzo2cHggOHB4O2JhY2tncm91bmQ6dmFyKC0tY3Ytd2Fybi1iZyk7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1jdi13YXJuLWJvcmRlcik7Ym9yZGVyLXJhZGl1czo0cHg7Zm9udC1zaXplOjAuOGVtO2NvbG9yOnZhcigtLWN2LXdhcm4tdGV4dCk7XCI+XG4gICAgICBcdTI2QTAgcXVhbGl0eSBhZHZpc29yeTogJHtlc2MoY2hhbmdlLnBlcnN1YXNpb25fZmxhZ3Muam9pbignLCAnKSl9XG4gICAgPC9kaXY+YDtcbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIF9tZHVBcmlhU3VmZml4KGNoYW5nZSkge1xuICBjb25zdCBwYXJ0cyA9IFtdO1xuICBpZiAoY2hhbmdlLnBvc3NpYmxlX2R1cGxpY2F0ZV9vZikgcGFydHMucHVzaChgcG9zc2libGUgZHVwbGljYXRlIG9mICR7Y2hhbmdlLnBvc3NpYmxlX2R1cGxpY2F0ZV9vZn1gKTtcbiAgaWYgKGNoYW5nZS5wZXJzdWFzaW9uX2ZsYWdzICYmIGNoYW5nZS5wZXJzdWFzaW9uX2ZsYWdzLmxlbmd0aCkgcGFydHMucHVzaChgcXVhbGl0eSBhZHZpc29yeTogJHtjaGFuZ2UucGVyc3Vhc2lvbl9mbGFncy5qb2luKCcsICcpfWApO1xuICByZXR1cm4gcGFydHMubGVuZ3RoID8gYCwgJHtwYXJ0cy5qb2luKCcsICcpfWAgOiAnJztcbn1cblxuZnVuY3Rpb24gX21kdVJlbmRlclJldmlld0FyZWEoKSB7XG4gIGNvbnN0IHJldmlld0FyZWEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWR1LXJldmlldy1hcmVhJyk7XG4gIGNvbnN0IGRpc2NhcmRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWR1LWRpc2NhcmQtYnRuJyk7XG4gIGlmICghcmV2aWV3QXJlYSB8fCAhX21kdVBlbmRpbmdQcm9wb3NhbCkgcmV0dXJuO1xuXG4gIGNvbnN0IGNoYW5nZXMgPSBfbWR1UGVuZGluZ1Byb3Bvc2FsLmNoYW5nZXM7XG4gIGNvbnN0IHJvd3NIdG1sID0gY2hhbmdlcy5tYXAoKGMpID0+IHJlbmRlclByb3Bvc2FsUm93KHtcbiAgICBpZDogYy5pZCxcbiAgICB0eXBlTGFiZWw6IGMuc2VjdGlvbixcbiAgICBsYWJlbDogYy5sYWJlbCxcbiAgICBwcm9wb3NlZDogX21kdUNoYW5nZURpc3BsYXlUZXh0KGMpLFxuICAgIGRldGFpbFRleHQ6IGMucmF0aW9uYWxlLFxuICAgIGZsYWdIdG1sOiBfbWR1RmxhZ0h0bWwoYyksXG4gICAgY2hlY2tlZDogZmFsc2UsXG4gIH0sIHtcbiAgICBpZFByZWZpeDogJ21kdScsXG4gICAgY2hlY2tib3hEYXRhQXR0cjogJ21kdS1pZCcsXG4gICAgYXJpYUxhYmVsU3VmZml4OiBfbWR1QXJpYVN1ZmZpeChjKSxcbiAgfSkpLmpvaW4oJycpO1xuXG4gIGNvbnN0IGZsYWdnZWRDb3VudCA9IGNoYW5nZXMuZmlsdGVyKGMgPT4gYy5wb3NzaWJsZV9kdXBsaWNhdGVfb2YgfHwgKGMucGVyc3Vhc2lvbl9mbGFncyAmJiBjLnBlcnN1YXNpb25fZmxhZ3MubGVuZ3RoKSkubGVuZ3RoO1xuXG4gIHJldmlld0FyZWEuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgcm9sZT1cImdyb3VwXCIgYXJpYS1sYWJlbD1cIlByb3Bvc2VkIGNoYW5nZXMsICR7Y2hhbmdlcy5sZW5ndGh9IGl0ZW1zLCAwIHNlbGVjdGVkXCIgaWQ9XCJtZHUtcm93LWdyb3VwXCI+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2FsaWduLWl0ZW1zOmNlbnRlcjttYXJnaW4tYm90dG9tOjhweDtcIj5cbiAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2NvbG9yOnZhcigtLWN2LXRleHQtc2Vjb25kYXJ5KTtcIj4ke2NoYW5nZXMubGVuZ3RofSBwcm9wb3NlZCBjaGFuZ2Uke2NoYW5nZXMubGVuZ3RoID09PSAxID8gJycgOiAncyd9PC9zcGFuPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBvbmNsaWNrPVwic2VsZWN0TWFzdGVyRGF0YUFpTm9uRmxhZ2dlZCgpXCIgc3R5bGU9XCJmb250LXNpemU6MC44ZW07cGFkZGluZzo0cHggMTBweDtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWN2LWJvcmRlcik7Ym9yZGVyLXJhZGl1czo0cHg7YmFja2dyb3VuZDp2YXIoLS1jdi13aGl0ZSk7Y29sb3I6dmFyKC0tY3YtdGV4dC1wcmltYXJ5KTtjdXJzb3I6cG9pbnRlcjtcIj5cbiAgICAgICAgICBTZWxlY3QgYWxsIG5vbi1mbGFnZ2VkXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8dGFibGUgc3R5bGU9XCJ3aWR0aDoxMDAlO2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTtcIj4ke3Jvd3NIdG1sfTwvdGFibGU+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBpZD1cIm1kdS1zZWxlY3Rpb24tbGl2ZVwiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiIGNsYXNzPVwic3Itb25seVwiIHN0eWxlPVwicG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O2hlaWdodDoxcHg7b3ZlcmZsb3c6aGlkZGVuO1wiPjwvZGl2PlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlkPVwibWR1LWNvbmZpcm0tYnRuXCIgb25jbGljaz1cImNvbmZpcm1NYXN0ZXJEYXRhQWlVcGRhdGUoKVwiIGRpc2FibGVkXG4gICAgICBzdHlsZT1cIm1hcmdpbi10b3A6MTBweDtwYWRkaW5nOjlweCAyMHB4O2ZvbnQtc2l6ZTowLjllbTtmb250LXdlaWdodDo2MDA7Y3Vyc29yOm5vdC1hbGxvd2VkO2JhY2tncm91bmQ6dmFyKC0tY3Ytc2xhdGUtMzAwKTtjb2xvcjp2YXIoLS1jdi13aGl0ZSk7Ym9yZGVyOm5vbmU7Ym9yZGVyLXJhZGl1czo2cHg7XCI+XG4gICAgICBDb25maXJtIGFuZCBXcml0ZVxuICAgIDwvYnV0dG9uPlxuICAgICR7ZmxhZ2dlZENvdW50ID8gYDxwIHN0eWxlPVwiZm9udC1zaXplOjAuNzhlbTtjb2xvcjp2YXIoLS1jdi13YXJuLXRleHQpO21hcmdpbi10b3A6NnB4O1wiPiR7ZmxhZ2dlZENvdW50fSBpdGVtJHtmbGFnZ2VkQ291bnQgPT09IDEgPyAnJyA6ICdzJ30gZmxhZ2dlZCBmb3IgcmV2aWV3IGFib3ZlLjwvcD5gIDogJyd9YDtcblxuICBpZiAoZGlzY2FyZEJ0bikgZGlzY2FyZEJ0bi5zdHlsZS5kaXNwbGF5ID0gJ2lubGluZS1ibG9jayc7XG5cbiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1yZXZpZXctYXJlYScpO1xuICBhdHRhY2hQcm9wb3NhbFJvd0xpc3RlbmVycyhjb250YWluZXIsICdtZHUnKTtcbiAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W2RhdGEtbWR1LWlkXScpLmZvckVhY2goKGNiKSA9PiB7XG4gICAgY2IuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgX21kdVVwZGF0ZUNvbmZpcm1CdXR0b25TdGF0ZSk7XG4gIH0pO1xuICBfbWR1VXBkYXRlQ29uZmlybUJ1dHRvblN0YXRlKCk7XG59XG5cbmZ1bmN0aW9uIF9tZHVVcGRhdGVDb25maXJtQnV0dG9uU3RhdGUoKSB7XG4gIGNvbnN0IGNoZWNrZWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtkYXRhLW1kdS1pZF06Y2hlY2tlZCcpO1xuICBjb25zdCBjb25maXJtQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1jb25maXJtLWJ0bicpO1xuICBjb25zdCBncm91cCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtcm93LWdyb3VwJyk7XG4gIGNvbnN0IGxpdmVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtc2VsZWN0aW9uLWxpdmUnKTtcbiAgY29uc3QgdG90YWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtkYXRhLW1kdS1pZF0nKS5sZW5ndGg7XG4gIGlmIChjb25maXJtQnRuKSB7XG4gICAgY29uZmlybUJ0bi5kaXNhYmxlZCA9IGNoZWNrZWQubGVuZ3RoID09PSAwO1xuICAgIGNvbmZpcm1CdG4uc3R5bGUuY3Vyc29yID0gY2hlY2tlZC5sZW5ndGggPT09IDAgPyAnbm90LWFsbG93ZWQnIDogJ3BvaW50ZXInO1xuICAgIGNvbmZpcm1CdG4uc3R5bGUuYmFja2dyb3VuZCA9IGNoZWNrZWQubGVuZ3RoID09PSAwID8gJ3ZhcigtLWN2LXNsYXRlLTMwMCknIDogJ3ZhcigtLWN2LXN1Y2Nlc3MtbWQpJztcbiAgfVxuICBpZiAoZ3JvdXApIGdyb3VwLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIGBQcm9wb3NlZCBjaGFuZ2VzLCAke3RvdGFsfSBpdGVtcywgJHtjaGVja2VkLmxlbmd0aH0gc2VsZWN0ZWRgKTtcbiAgaWYgKGxpdmVFbCkgbGl2ZUVsLnRleHRDb250ZW50ID0gYCR7Y2hlY2tlZC5sZW5ndGh9IG9mICR7dG90YWx9IHNlbGVjdGVkYDtcbn1cblxuZnVuY3Rpb24gc2VsZWN0TWFzdGVyRGF0YUFpTm9uRmxhZ2dlZCgpIHtcbiAgaWYgKCFfbWR1UGVuZGluZ1Byb3Bvc2FsKSByZXR1cm47XG4gIGNvbnN0IGZsYWdnZWRJZHMgPSBuZXcgU2V0KFxuICAgIF9tZHVQZW5kaW5nUHJvcG9zYWwuY2hhbmdlc1xuICAgICAgLmZpbHRlcihjID0+IGMucG9zc2libGVfZHVwbGljYXRlX29mIHx8IChjLnBlcnN1YXNpb25fZmxhZ3MgJiYgYy5wZXJzdWFzaW9uX2ZsYWdzLmxlbmd0aCkpXG4gICAgICAubWFwKGMgPT4gYy5pZCksXG4gICk7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W2RhdGEtbWR1LWlkXScpLmZvckVhY2goKGNiKSA9PiB7XG4gICAgaWYgKCFmbGFnZ2VkSWRzLmhhcyhjYi5kYXRhc2V0Lm1kdUlkKSkgY2IuY2hlY2tlZCA9IHRydWU7XG4gIH0pO1xuICBfbWR1VXBkYXRlQ29uZmlybUJ1dHRvblN0YXRlKCk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBDb25maXJtIGFuZCB3cml0ZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gY29uZmlybU1hc3RlckRhdGFBaVVwZGF0ZSgpIHtcbiAgaWYgKCFfbWR1UGVuZGluZ1Byb3Bvc2FsKSByZXR1cm47XG4gIGNvbnN0IHNlbGVjdGVkSWRzID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtkYXRhLW1kdS1pZF06Y2hlY2tlZCcpKS5tYXAoY2IgPT4gY2IuZGF0YXNldC5tZHVJZCk7XG4gIGlmIChzZWxlY3RlZElkcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBjb25zdCBzb3VyY2VMYWJlbCA9IF9tZHVQZW5kaW5nUHJvcG9zYWwuc291cmNlID09PSAnbmxfaW5zdHJ1Y3Rpb24nID8gJ3lvdXIgaW5zdHJ1Y3Rpb24nIDogJ3RoZSB1cGxvYWRlZCBkb2N1bWVudCc7XG4gIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0ICh0eXBlb2Ygc2hvd0NvbmZpcm1Nb2RhbCA9PT0gJ2Z1bmN0aW9uJ1xuICAgID8gc2hvd0NvbmZpcm1Nb2RhbChcbiAgICAgICAgYFdyaXRlICR7c2VsZWN0ZWRJZHMubGVuZ3RofSBjaGFuZ2Uke3NlbGVjdGVkSWRzLmxlbmd0aCA9PT0gMSA/ICcnIDogJ3MnfSB0byBNYXN0ZXIgQ1Y/YCxcbiAgICAgICAgYFRoZXNlICR7c2VsZWN0ZWRJZHMubGVuZ3RofSBjaGFuZ2Uke3NlbGVjdGVkSWRzLmxlbmd0aCA9PT0gMSA/ICcnIDogJ3MnfSB3ZXJlIHByb3Bvc2VkIGJ5IEFJIGZyb20gJHtzb3VyY2VMYWJlbH0gYW5kIGhhdmUgbm90IGJlZW4gcHJldmlvdXNseSByZXZpZXdlZC4gYCArXG4gICAgICAgIGBDb25maXJtaW5nIHdpbGwgcGVybWFuZW50bHkgd3JpdGUgdGhlbSB0byBNYXN0ZXJfQ1ZfRGF0YS5qc29uLiBBIGJhY2t1cCB3aWxsIGJlIGNyZWF0ZWQgZmlyc3QgXHUyMDE0IHNlZSBcdUQ4M0RcdURENTAgQmFja3VwcyBhYm92ZSB0byByZXN0b3JlIGl0IGlmIG5lZWRlZC5gLFxuICAgICAgKVxuICAgIDogUHJvbWlzZS5yZXNvbHZlKHdpbmRvdy5jb25maXJtKGBXcml0ZSAke3NlbGVjdGVkSWRzLmxlbmd0aH0gY2hhbmdlKHMpIHRvIE1hc3RlciBDVj8gVGhpcyB3aWxsIHBlcm1hbmVudGx5IHdyaXRlIGNoYW5nZXMgdG8gTWFzdGVyX0NWX0RhdGEuanNvbi5gKSkpO1xuXG4gIGlmICghY29uZmlybWVkKSByZXR1cm47XG5cbiAgY29uc3QgY29uZmlybUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtY29uZmlybS1idG4nKTtcbiAgY29uc3QgcmVzdWx0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWR1LXJlc3VsdCcpO1xuICBpZiAoY29uZmlybUJ0bikgeyBjb25maXJtQnRuLmRpc2FibGVkID0gdHJ1ZTsgY29uZmlybUJ0bi50ZXh0Q29udGVudCA9ICdXcml0aW5nXHUyMDI2JzsgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL2NvbmZpcm0tdXBkYXRlJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcHJvcG9zYWxfaWQ6IF9tZHVQZW5kaW5nUHJvcG9zYWwucHJvcG9zYWxJZCwgc2VsZWN0ZWRfaWRzOiBzZWxlY3RlZElkcyB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcC5qc29uKCk7XG5cbiAgICBpZiAoZGF0YS5vayA9PT0gZmFsc2UgJiYgZGF0YS5zdGFsZV9jaGFuZ2VzKSB7XG4gICAgICBfbWR1SGFuZGxlU3RhbGVDaGFuZ2VzKGRhdGEuc3RhbGVfY2hhbmdlcywgZGF0YS5hcHBsaWNhYmxlX2NoYW5nZXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWRhdGEub2spIHtcbiAgICAgIGlmIChyZXN1bHRFbCkgcmVzdWx0RWwuaW5uZXJIVE1MID0gYDxwIGNsYXNzPVwiZXJyb3ItbWVzc2FnZVwiPkNvbmZpcm0gZmFpbGVkOiAke2VzYyhkYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yJyl9PC9wPmA7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY2hhbmdlc0J5SWQgPSBPYmplY3QuZnJvbUVudHJpZXMoX21kdVBlbmRpbmdQcm9wb3NhbC5jaGFuZ2VzLm1hcChjID0+IFtjLmlkLCBjXSkpO1xuICAgIGNvbnN0IHdyaXR0ZW5MaW5lcyA9IChkYXRhLmRpZmZfc3VtbWFyeSB8fCBbXSlcbiAgICAgIC5maWx0ZXIoZCA9PiBkLmFwcGxpZWQpXG4gICAgICAubWFwKGQgPT4gYDxsaT4ke2VzYyhkLmxhYmVsIHx8IGQuaWQpfSR7Y2hhbmdlc0J5SWRbZC5pZF0/LnJhdGlvbmFsZSA/IGAgXHUyMDE0ICR7ZXNjKGNoYW5nZXNCeUlkW2QuaWRdLnJhdGlvbmFsZSl9YCA6ICcnfTwvbGk+YClcbiAgICAgIC5qb2luKCcnKTtcblxuICAgIGNvbnN0IGNvbW1pdEluZm8gPSBkYXRhLmNvbW1pdF9oYXNoID8gYCAoY29tbWl0ICR7ZXNjKGRhdGEuY29tbWl0X2hhc2gpfSlgIDogJyc7XG4gICAgY29uc3QgZ2l0V2FybmluZyA9IGRhdGEuZ2l0X2Vycm9yXG4gICAgICA/IGA8cCBzdHlsZT1cImNvbG9yOnZhcigtLWN2LXdhcm4tdGV4dCk7Zm9udC1zaXplOjAuODdlbTtcIj5cdTI2QTBcdUZFMEYgR2l0IGNvbW1pdCBza2lwcGVkOiAke2VzYyhkYXRhLmdpdF9lcnJvcj8ubWVzc2FnZSB8fCBkYXRhLmdpdF9lcnJvcil9PC9wPmBcbiAgICAgIDogJyc7XG4gICAgY29uc3QgcHVzaFdhcm5pbmcgPSBkYXRhLnB1c2hfZXJyb3JcbiAgICAgID8gYDxwIHN0eWxlPVwiY29sb3I6dmFyKC0tY3Ytd2Fybi10ZXh0KTtmb250LXNpemU6MC44N2VtO1wiPlx1MjZBMFx1RkUwRiBHaXQgcHVzaCBza2lwcGVkOiAke2VzYyhkYXRhLnB1c2hfZXJyb3IpfTwvcD5gXG4gICAgICA6ICcnO1xuXG4gICAgaWYgKHJlc3VsdEVsKSB7XG4gICAgICByZXN1bHRFbC5pbm5lckhUTUwgPSBgXG4gICAgICAgIDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOnZhcigtLWN2LXN1Y2Nlc3MtYmcpO2JvcmRlcjoxcHggc29saWQgdmFyKC0tY3Ytc3VjY2Vzcy1ib3JkZXIpO2JvcmRlci1yYWRpdXM6NnB4O3BhZGRpbmc6MTJweCAxNnB4O1wiPlxuICAgICAgICAgIDxwIHN0eWxlPVwiY29sb3I6dmFyKC0tY3Ytc3VjY2Vzcy10ZXh0KTtmb250LXdlaWdodDo2MDA7bWFyZ2luOjAgMCA2cHg7XCI+XG4gICAgICAgICAgICBcdTI3MDUgJHtkYXRhLndyaXR0ZW5fY291bnR9IGl0ZW0ke2RhdGEud3JpdHRlbl9jb3VudCA9PT0gMSA/ICcnIDogJ3MnfSB3cml0dGVuIHRvIG1hc3RlciBDViR7Y29tbWl0SW5mb30uXG4gICAgICAgICAgPC9wPlxuICAgICAgICAgICR7d3JpdHRlbkxpbmVzID8gYDx1bCBzdHlsZT1cImZvbnQtc2l6ZTowLjgyZW07Y29sb3I6dmFyKC0tY3YtdGV4dC1tdXRlZCk7bWFyZ2luOjRweCAwIDA7cGFkZGluZy1sZWZ0OjE4cHg7XCI+JHt3cml0dGVuTGluZXN9PC91bD5gIDogJyd9XG4gICAgICAgICAgJHtnaXRXYXJuaW5nfSR7cHVzaFdhcm5pbmd9XG4gICAgICAgIDwvZGl2PmA7XG4gICAgfVxuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1yZXZpZXctYXJlYScpLmlubmVySFRNTCA9ICcnO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtZGlzY2FyZC1idG4nKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIF9tZHVQZW5kaW5nUHJvcG9zYWwgPSBudWxsO1xuICAgIF9tZHVQcmlvckNsYXJpZmljYXRpb25zID0gW107XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy5lcnJvcignY29uZmlybU1hc3RlckRhdGFBaVVwZGF0ZTogZmFpbGVkJywgZXJyKTtcbiAgICBpZiAocmVzdWx0RWwpIHJlc3VsdEVsLmlubmVySFRNTCA9IGA8cCBjbGFzcz1cImVycm9yLW1lc3NhZ2VcIj5OZXR3b3JrIGVycm9yOiAke2VzYyhlcnIubWVzc2FnZSl9PC9wPmA7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKGNvbmZpcm1CdG4pIHsgY29uZmlybUJ0bi5kaXNhYmxlZCA9IGZhbHNlOyBjb25maXJtQnRuLnRleHRDb250ZW50ID0gJ0NvbmZpcm0gYW5kIFdyaXRlJzsgfVxuICB9XG59XG5cbmZ1bmN0aW9uIF9tZHVIYW5kbGVTdGFsZUNoYW5nZXMoc3RhbGVDaGFuZ2VzLCBhcHBsaWNhYmxlQ2hhbmdlcykge1xuICBjb25zdCByZXN1bHRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtcmVzdWx0Jyk7XG4gIGNvbnN0IHN0YWxlSWRzID0gbmV3IFNldChzdGFsZUNoYW5nZXMubWFwKHMgPT4gcy5pZCkpO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W2RhdGEtbWR1LWlkXScpLmZvckVhY2goKGNiKSA9PiB7XG4gICAgaWYgKHN0YWxlSWRzLmhhcyhjYi5kYXRhc2V0Lm1kdUlkKSkge1xuICAgICAgY2IuY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgY2IuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgY29uc3Qgcm93ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYG1kdS1yb3ctJHtjYi5kYXRhc2V0Lm1kdUlkfWApO1xuICAgICAgaWYgKHJvdykgcm93LnN0eWxlLm9wYWNpdHkgPSAnMC41JztcbiAgICB9XG4gIH0pO1xuICBfbWR1VXBkYXRlQ29uZmlybUJ1dHRvblN0YXRlKCk7XG5cbiAgY29uc3QgbGl2ZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1zZWxlY3Rpb24tbGl2ZScpO1xuICBjb25zdCBzdW1tYXJ5ID0gYCR7c3RhbGVDaGFuZ2VzLmxlbmd0aH0gaXRlbSR7c3RhbGVDaGFuZ2VzLmxlbmd0aCA9PT0gMSA/ICcgaXMnIDogJ3MgYXJlJ30gbm8gbG9uZ2VyIHZhbGlkIGFuZCAke3N0YWxlQ2hhbmdlcy5sZW5ndGggPT09IDEgPyAnd2FzJyA6ICd3ZXJlJ30gZGVzZWxlY3RlZDsgcmV2aWV3IGFuZCBjb25maXJtIGFnYWluLmA7XG4gIGlmIChsaXZlRWwpIGxpdmVFbC50ZXh0Q29udGVudCA9IHN1bW1hcnk7XG5cbiAgY29uc3Qgc3RhbGVMaXN0ID0gc3RhbGVDaGFuZ2VzLm1hcChzID0+IGA8bGk+JHtlc2Mocy5sYWJlbCB8fCBzLmlkKX0gXHUyMDE0ICR7ZXNjKHMucmVhc29uKX08L2xpPmApLmpvaW4oJycpO1xuICBpZiAocmVzdWx0RWwpIHtcbiAgICByZXN1bHRFbC5pbm5lckhUTUwgPSBgXG4gICAgICA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDp2YXIoLS1jdi1iZy1zdWJ0bGUpO2JvcmRlcjoxcHggc29saWQgdmFyKC0tY3Ytc2xhdGUtMzAwKTtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjEycHggMTZweDtcIj5cbiAgICAgICAgPHAgc3R5bGU9XCJjb2xvcjp2YXIoLS1jdi10ZXh0LW11dGVkKTtmb250LXdlaWdodDo2MDA7bWFyZ2luOjAgMCA2cHg7XCI+Tm90aGluZyB3YXMgd3JpdHRlbiBcdTIwMTQgJHtzdW1tYXJ5fTwvcD5cbiAgICAgICAgPHVsIHN0eWxlPVwiZm9udC1zaXplOjAuODJlbTtjb2xvcjp2YXIoLS1jdi10ZXh0LW11dGVkKTttYXJnaW46NHB4IDAgMDtwYWRkaW5nLWxlZnQ6MThweDtcIj4ke3N0YWxlTGlzdH08L3VsPlxuICAgICAgICA8cCBzdHlsZT1cImZvbnQtc2l6ZTowLjgyZW07Y29sb3I6dmFyKC0tY3YtdGV4dC1zZWNvbmRhcnkpO21hcmdpbi10b3A6OHB4O1wiPiR7YXBwbGljYWJsZUNoYW5nZXMubGVuZ3RofSBpdGVtJHthcHBsaWNhYmxlQ2hhbmdlcy5sZW5ndGggPT09IDEgPyAnJyA6ICdzJ30gJHthcHBsaWNhYmxlQ2hhbmdlcy5sZW5ndGggPT09IDEgPyAnaXMnIDogJ2FyZSd9IHN0aWxsIHZhbGlkIFx1MjAxNCBjbGljayBcIkNvbmZpcm0gYW5kIFdyaXRlXCIgYWdhaW4gdG8gYXBwbHkganVzdCB0aG9zZS48L3A+XG4gICAgICA8L2Rpdj5gO1xuICB9XG59XG5cbi8vIE5vdGU6IG5vIGNsaWVudC1zaWRlIFwicmVzdW1lIGFuIGluLXByb2dyZXNzIHByb3Bvc2FsXCIgYWZmb3JkYW5jZSBcdTIwMTQgdGhlXG4vLyBwYW5lbCByZXNldHMgaXRzIHN0YXRlIG9uIGV2ZXJ5IHJlbmRlciAoc2VlIF9tZHVSZXNldFN0YXRlLCBjYWxsZWQgZnJvbVxuLy8gcmVuZGVyTWFzdGVyRGF0YUFpVXBkYXRlUGFuZWwpLCBhbmQgcGVuZGluZyBwcm9wb3NhbHMgbGl2ZSBzZXJ2ZXItc2lkZVxuLy8ga2V5ZWQgYnkgcHJvcG9zYWxfaWQgd2l0aCB0aGVpciBvd24gVFRMIChzZWUgbWFzdGVyX2RhdGFfcm91dGVzLnB5KS5cbi8vIFJlc3VtaW5nIHdvdWxkIHJlcXVpcmUgYSBzZXNzaW9uLXN0YXR1cy1kcml2ZW4gY2hlY2sgZm9yIGFuIGV4aXN0aW5nXG4vLyBwZW5kaW5nIHByb3Bvc2FsIGJlZm9yZSB0aGUgcGFuZWwgZmlyc3QgcmVuZGVyczsgdHJhY2tlZCBhcyBhIGtub3duIHYxXG4vLyBsaW1pdGF0aW9uLCBub3Qgc2lsZW50bHkgYWJzZW50LlxuXG5leHBvcnQge1xuICByZW5kZXJNYXN0ZXJEYXRhQWlVcGRhdGVQYW5lbCxcbiAgcmVuZGVyTWFzdGVyRGF0YUFpVXBkYXRlRGlzYWJsZWROb3RlLFxuICB0b2dnbGVNYXN0ZXJEYXRhQWlQYW5lbCxcbiAgc2V0TWFzdGVyRGF0YUFpTW9kZSxcbiAgaGFuZGxlTWFzdGVyRGF0YUFpRmlsZVVwbG9hZCxcbiAgc3VibWl0TWFzdGVyRGF0YUFpUHJvcG9zZSxcbiAgZGlzY2FyZE1hc3RlckRhdGFBaVByb3Bvc2FsLFxuICBzZWxlY3RNYXN0ZXJEYXRhQWlOb25GbGFnZ2VkLFxuICBjb25maXJtTWFzdGVyRGF0YUFpVXBkYXRlLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL21hc3Rlci1jdi5qc1xuICogTWFzdGVyIENWIG1hbmFnZW1lbnQgdGFiOiBmZXRjaCwgcmVuZGVyLCBhbmQgQ1JVRCBmb3IgcGVyc29uYWwgaW5mbyxcbiAqIGV4cGVyaWVuY2VzLCBza2lsbHMsIGVkdWNhdGlvbiwgYXdhcmRzLCBhY2hpZXZlbWVudHMsIHN1bW1hcmllcy5cbiAqXG4gKiBEZXBlbmRlbmNpZXMgKHJlc29sdmVkIHRocm91Z2ggZ2xvYmFsVGhpcyBhdCBydW50aW1lKTpcbiAqICAgZXNjYXBlSHRtbCwgc2hvd1RvYXN0LCBzaG93QWxlcnRNb2RhbCwgY29uZmlybURpYWxvZyxcbiAqICAgYXBwZW5kTG9hZGluZ01lc3NhZ2UsIHJlbW92ZUxvYWRpbmdNZXNzYWdlLFxuICogICBzZXRMb2FkaW5nLCBzd2l0Y2hUYWIsIGFwcGVuZE1lc3NhZ2UsXG4gKiAgIHJlbmRlck1hc3RlckRhdGFBaVVwZGF0ZVBhbmVsLCByZW5kZXJNYXN0ZXJEYXRhQWlVcGRhdGVEaXNhYmxlZE5vdGVcbiAqICAgICAoZnJvbSB3ZWIvbWFzdGVyLWRhdGEtYWktdXBkYXRlLmpzLCBHQVAtMDEpXG4gKi9cblxubGV0IF9tYXN0ZXJDaGFuZ2VOb3RpY2UgPSAnJztcblxuLy8gVHJhY2tzIHRoZSBhY3RpdmUgcmVuZGVyIHRhcmdldDogbW9kYWwgYm9keSBkaXYgd2hlbiBvcGVuZWQgZnJvbSBoZWFkZXIsXG4vLyBudWxsIHdoZW4gcmVuZGVyZWQgaW50byB0aGUgbm9ybWFsIHRhYiB2aWV3ZXIuXG5sZXQgX21hc3RlckN2QWN0aXZlQ29udGFpbmVyID0gbnVsbDtcblxuLy8gRmlsZW5hbWUgb2YgdGhlIHNhZmV0eSBiYWNrdXAgY3JlYXRlZCBieSB0aGUgbW9zdCByZWNlbnQgdW5kbywgcmVzdG9yYWJsZVxuLy8gdmlhIHJlZG8uIFNpbmdsZS1sZXZlbCBieSBkZXNpZ24gKEdBUC0xOSAxNi43IHYxIHNjb3BlKSBcdTIwMTQgZnVydGhlci1iYWNrXG4vLyByZWNvdmVyeSByZW1haW5zIGF2YWlsYWJsZSB2aWEgdGhlIGZ1bGwgXCJcdUQ4M0RcdURENTAgQmFja3Vwc1wiIGhpc3RvcnkgbW9kYWwuXG4vLyBSZXNldCB0byBudWxsIGF0IHRoZSB0b3Agb2YgZXZlcnkgcG9wdWxhdGVNYXN0ZXJUYWIoKSByZS1yZW5kZXIgc28gYW55XG4vLyBvdGhlciBzYXZlIGFjdGlvbiAoc3RydWN0dXJlZCBlZGl0LCBBSS11cGRhdGUgY29uZmlybSwgaGFydmVzdCBhcHBseSlcbi8vIGludmFsaWRhdGVzIGEgc3RhbGUgcmVkbyB0YXJnZXQuIHVuZG9NYXN0ZXJEYXRhQ2hhbmdlKCkgc2V0c1xuLy8gX21hc3RlckN2U3VwcHJlc3NSZWRvUmVzZXQgYmVmb3JlIGl0cyBvd24gcG9wdWxhdGVNYXN0ZXJUYWIoKSBjYWxsIHNvIGl0c1xuLy8gZnJlc2hseS1zZXQgcmVkbyB0YXJnZXQgc3Vydml2ZXMgdGhhdCBvbmUgcmVuZGVyLlxubGV0IF9tYXN0ZXJDdlJlZG9CYWNrdXAgPSBudWxsO1xubGV0IF9tYXN0ZXJDdlN1cHByZXNzUmVkb1Jlc2V0ID0gZmFsc2U7XG5cbmZ1bmN0aW9uIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2Uoc2VjdGlvbiwgYWN0aW9uKSB7XG4gIGNvbnN0IGNsZWFuU2VjdGlvbiA9IFN0cmluZyhzZWN0aW9uIHx8ICdNYXN0ZXIgQ1YnKS50cmltKCk7XG4gIGNvbnN0IGNsZWFuQWN0aW9uID0gU3RyaW5nKGFjdGlvbiB8fCAndXBkYXRlZCcpLnRyaW0oKTtcbiAgX21hc3RlckNoYW5nZU5vdGljZSA9IGAke2NsZWFuU2VjdGlvbn0gJHtjbGVhbkFjdGlvbn0uYDtcbn1cblxuZnVuY3Rpb24gX3JlbmRlck1hc3RlckNoYW5nZU5vdGljZSgpIHtcbiAgaWYgKCFfbWFzdGVyQ2hhbmdlTm90aWNlKSByZXR1cm4gJyc7XG4gIHJldHVybiBgXG4gICAgPGRpdiBzdHlsZT1cIm1hcmdpbjoxMnB4IDAgMThweDtwYWRkaW5nOjEwcHggMTJweDtib3JkZXI6MXB4IHNvbGlkICNiYmY3ZDA7YmFja2dyb3VuZDojZjBmZGY0O2JvcmRlci1yYWRpdXM6OHB4O2NvbG9yOiMxNDUzMmQ7XCI+XG4gICAgICA8c3Ryb25nPkxhc3Qgc2F2ZWQgY2hhbmdlOjwvc3Ryb25nPiAke2VzY2FwZUh0bWwoX21hc3RlckNoYW5nZU5vdGljZSl9XG4gICAgPC9kaXY+XG4gIGA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHBvcHVsYXRlTWFzdGVyVGFiKGNvbnRhaW5lciA9IG51bGwpIHtcbiAgaWYgKGNvbnRhaW5lciAhPT0gbnVsbCkgX21hc3RlckN2QWN0aXZlQ29udGFpbmVyID0gY29udGFpbmVyO1xuICBpZiAoX21hc3RlckN2U3VwcHJlc3NSZWRvUmVzZXQpIHtcbiAgICBfbWFzdGVyQ3ZTdXBwcmVzc1JlZG9SZXNldCA9IGZhbHNlO1xuICB9IGVsc2Uge1xuICAgIF9tYXN0ZXJDdlJlZG9CYWNrdXAgPSBudWxsO1xuICB9XG4gIGNvbnN0IGNvbnRlbnQgPSBfbWFzdGVyQ3ZBY3RpdmVDb250YWluZXIgfHwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgY29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImVtcHR5LXN0YXRlXCI+PGRpdiBjbGFzcz1cImxvYWRpbmctc3Bpbm5lclwiPjwvZGl2PjxwIHN0eWxlPVwibWFyZ2luLXRvcDoxMnB4O2NvbG9yOiM2NDc0OGI7XCI+TG9hZGluZyBtYXN0ZXIgQ1YgZGF0YVx1MjAyNjwvcD48L2Rpdj4nO1xuXG4gIGxldCBvdmVydmlldyA9IHt9O1xuICBsZXQgZnVsbERhdGEgID0ge307XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBbb3ZSZXMsIGZkUmVzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL292ZXJ2aWV3JyksXG4gICAgICBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS9mdWxsJyksXG4gICAgXSk7XG4gICAgb3ZlcnZpZXcgPSAoYXdhaXQgb3ZSZXMuanNvbigpKSB8fCB7fTtcbiAgICBmdWxsRGF0YSAgPSAoYXdhaXQgZmRSZXMuanNvbigpKSB8fCB7fTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY29udGVudC5pbm5lckhUTUwgPSAnPHAgc3R5bGU9XCJjb2xvcjojZWY0NDQ0O3BhZGRpbmc6MjBweDtcIj5GYWlsZWQgdG8gbG9hZCBtYXN0ZXIgQ1YgZGF0YS48L3A+JztcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwZXJzb25hbEluZm8gPSBmdWxsRGF0YS5wZXJzb25hbF9pbmZvIHx8IHt9O1xuICBjb25zdCBleHBlcmllbmNlcyAgICAgPSBmdWxsRGF0YS5leHBlcmllbmNlIHx8IFtdO1xuICB3aW5kb3cuX21hc3RlckV4cGVyaWVuY2VPcHRpb25zID0gZXhwZXJpZW5jZXNcbiAgICAubWFwKChleHApID0+ICh7XG4gICAgICBpZDogZXhwLmlkIHx8ICcnLFxuICAgICAgbGFiZWw6IGAke2V4cC50aXRsZSB8fCAnUm9sZSd9IEAgJHtleHAuY29tcGFueSB8fCAnQ29tcGFueSd9YCxcbiAgICB9KSlcbiAgICAuZmlsdGVyKCh4KSA9PiB4LmlkKTtcbiAgLy8gRnVsbCBleHBlcmllbmNlIG9iamVjdHMgKGluY2x1ZGluZyBhY2hpZXZlbWVudHMpLCBrZXllZCBieSBpZCwgc29cbiAgLy8gZWRpdE1hc3RlckV4cGVyaWVuY2UoKSBjYW4gbG9vayB1cCBuZXN0ZWQgYWNoaWV2ZW1lbnRzIHdpdGhvdXRcbiAgLy8gZW1iZWRkaW5nIGFyYml0cmFyeSBhY2hpZXZlbWVudCB0ZXh0IGluc2lkZSBhbiBpbmxpbmUgb25jbGljayBhdHRyaWJ1dGUuXG4gIHdpbmRvdy5fbWFzdGVyRXhwZXJpZW5jZUZ1bGxEYXRhID0gZXhwZXJpZW5jZXM7XG4gIGNvbnN0IHNraWxscyAgICAgICAgICA9IGZ1bGxEYXRhLnNraWxscyB8fCBbXTtcbiAgY29uc3QgZWR1Y2F0aW9uICAgICAgID0gZnVsbERhdGEuZWR1Y2F0aW9uIHx8IFtdO1xuICBjb25zdCBhd2FyZHMgICAgICAgICAgPSBmdWxsRGF0YS5hd2FyZHMgfHwgW107XG4gIGNvbnN0IGNlcnRpZmljYXRpb25zICA9IGZ1bGxEYXRhLmNlcnRpZmljYXRpb25zIHx8IFtdO1xuICBjb25zdCBhY2hpZXZlbWVudHMgICAgPSBmdWxsRGF0YS5zZWxlY3RlZF9hY2hpZXZlbWVudHMgfHwgW107XG4gIGNvbnN0IHN1bW1hcmllcyAgICAgICA9IGZ1bGxEYXRhLnByb2Zlc3Npb25hbF9zdW1tYXJpZXMgfHwge307XG5cbiAgY29uc3QgY3VycmVudFBoYXNlID0gKHR5cGVvZiBzdGF0ZU1hbmFnZXIgIT09ICd1bmRlZmluZWQnICYmIHN0YXRlTWFuYWdlci5nZXRQaGFzZSlcbiAgICA/IHN0YXRlTWFuYWdlci5nZXRQaGFzZSgpXG4gICAgOiBudWxsO1xuICBjb25zdCBFRElUQUJMRV9QSEFTRVMgPSBuZXcgU2V0KFsnaW5pdCcsICdyZWZpbmVtZW50JywgbnVsbCwgdW5kZWZpbmVkLCAnJ10pO1xuICBjb25zdCBpc0VkaXRhYmxlID0gRURJVEFCTEVfUEhBU0VTLmhhcyhjdXJyZW50UGhhc2UpO1xuXG4gIGNvbnN0IHBoYXNlTG9ja0Jhbm5lciA9IGlzRWRpdGFibGUgPyAnJyA6IGBcbiAgICA8ZGl2IHJvbGU9XCJzdGF0dXNcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIlxuICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZWYyZjI7Ym9yZGVyOjFweCBzb2xpZCAjZmNhNWE1O2JvcmRlci1yYWRpdXM6NnB4O1xuICAgICAgICAgICAgICAgIHBhZGRpbmc6MTBweCAxNHB4O21hcmdpbi1ib3R0b206MTZweDtmb250LXNpemU6MC44OGVtO2NvbG9yOiM5OTFiMWI7XCI+XG4gICAgICA8c3Ryb25nPlx1RDgzRFx1REQxMiBSZWFkLW9ubHkgXHUyMDE0IGVkaXRpbmcgbG9ja2VkPC9zdHJvbmc+PGJyPlxuICAgICAgTWFzdGVyIENWIGVkaXRpbmcgaXMgb25seSBhdmFpbGFibGUgYmVmb3JlIGpvYiBhbmFseXNpcyBiZWdpbnMgb3IgZHVyaW5nIHRoZVxuICAgICAgUmVmaW5lbWVudCBzdGFnZS4gVGhlIGN1cnJlbnQgc3RhZ2UgaXMgPHN0cm9uZz4ke2VzY2FwZUh0bWwoY3VycmVudFBoYXNlIHx8ICd1bmtub3duJyl9PC9zdHJvbmc+LlxuICAgICAgU2F2ZSBvciBjb21wbGV0ZSB0aGUgY3VycmVudCBzdGFnZSB0byByZS1lbmFibGUgZWRpdGluZy5cbiAgICA8L2Rpdj5gO1xuXG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2ZsZXgtd3JhcDp3cmFwO2dhcDo4cHg7bWFyZ2luLWJvdHRvbTo0cHg7XCI+XG4gICAgICA8aDEgc3R5bGU9XCJtYXJnaW46MDtcIj5cdUQ4M0RcdURDREEgTWFzdGVyIENWIFByb2ZpbGU8L2gxPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6OHB4O2ZsZXgtd3JhcDp3cmFwO1wiPlxuICAgICAgICA8YnV0dG9uIGlkPVwibWFzdGVyLWN2LXVuZG8tYnRuXCIgY2xhc3M9XCJhY3Rpb24tYnRuIHNlY29uZGFyeVwiIG9uY2xpY2s9XCJ1bmRvTWFzdGVyRGF0YUNoYW5nZSgpXCJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJVbmRvIHRoZSBtb3N0IHJlY2VudCBNYXN0ZXIgQ1YgY2hhbmdlXCIgdGl0bGU9XCJVbmRvIChDdHJsK1opXCI+XG4gICAgICAgICAgXHUyMUE5IFVuZG9cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gaWQ9XCJtYXN0ZXItY3YtcmVkby1idG5cIiBjbGFzcz1cImFjdGlvbi1idG4gc2Vjb25kYXJ5XCIgb25jbGljaz1cInJlZG9NYXN0ZXJEYXRhQ2hhbmdlKClcIlxuICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlJlZG8gdGhlIHByZXZpb3VzbHkgdW5kb25lIE1hc3RlciBDViBjaGFuZ2VcIiB0aXRsZT1cIlJlZG8gKEN0cmwrU2hpZnQrWilcIiR7IV9tYXN0ZXJDdlJlZG9CYWNrdXAgPyAnIGRpc2FibGVkJyA6ICcnfT5cbiAgICAgICAgICBcdTIxQUEgUmVkb1xuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG4gc2Vjb25kYXJ5XCIgb25jbGljaz1cIm9wZW5CYWNrdXBIaXN0b3J5TW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJWaWV3IGJhY2t1cCBoaXN0b3J5XCI+XG4gICAgICAgICAgXHVEODNEXHVERDUwIEJhY2t1cHNcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHNlY29uZGFyeVwiIG9uY2xpY2s9XCJvcGVuRnVsbERhdGFQcmV2aWV3TW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJQcmV2aWV3IGZ1bGwgbWFzdGVyIENWIGRhdGFcIj5cbiAgICAgICAgICBcdUQ4M0RcdURDNDEgUHJldmlldyBGdWxsIERhdGFcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHNlY29uZGFyeVwiIG9uY2xpY2s9XCJleHBvcnRNYXN0ZXJDVigpXCIgYXJpYS1sYWJlbD1cIkRvd25sb2FkIE1hc3Rlcl9DVl9EYXRhLmpzb25cIj5cbiAgICAgICAgICBcdTJCMDdcdUZFMEYgRXhwb3J0IEpTT05cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHNlY29uZGFyeVwiIG9uY2xpY2s9XCJ0cmlnZ2VyTWFzdGVyQ3ZJbXBvcnQoKVwiIGFyaWEtbGFiZWw9XCJJbXBvcnQgYSBmdWxsIE1hc3Rlcl9DVl9EYXRhLmpzb24gZmlsZVwiJHtpc0VkaXRhYmxlID8gJycgOiAnIGRpc2FibGVkJ30+XG4gICAgICAgICAgXHUyQjA2XHVGRTBGIEltcG9ydCBKU09OXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiBpZD1cIm1hc3Rlci1jdi1pbXBvcnQtZmlsZS1pbnB1dFwiIGFjY2VwdD1cImFwcGxpY2F0aW9uL2pzb24sLmpzb25cIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIlxuICAgICAgICAgICAgb25jaGFuZ2U9XCJoYW5kbGVNYXN0ZXJDdkltcG9ydEZpbGUoZXZlbnQpXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDttYXJnaW4tYm90dG9tOjEycHg7XCI+XG4gICAgICBUaGlzIGlzIHlvdXIgcGVyc2lzdGVudCBtYXN0ZXIgQ1YgcHJvZmlsZS4gQ2hhbmdlcyBoZXJlIHVwZGF0ZVxuICAgICAgPGNvZGU+TWFzdGVyX0NWX0RhdGEuanNvbjwvY29kZT4gZGlyZWN0bHkgYW5kIHBlcnNpc3QgYWNyb3NzIGFsbCBzZXNzaW9ucy5cbiAgICA8L3A+XG5cbiAgICAke3BoYXNlTG9ja0Jhbm5lcn1cblxuICAgIDwhLS0gR292ZXJuYW5jZSBiYW5uZXIgLS0+XG4gICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1nb3Zlcm5hbmNlLW5vdGVcIiBzdHlsZT1cImJhY2tncm91bmQ6I2ZmZmJlYjtib3JkZXI6MXB4IHNvbGlkICNmY2QzNGQ7Ym9yZGVyLXJhZGl1czo2cHg7cGFkZGluZzoxMHB4IDE0cHg7bWFyZ2luLWJvdHRvbToxNnB4O2ZvbnQtc2l6ZTowLjg4ZW07Y29sb3I6Izc4MzUwZjtcIj5cbiAgICAgIDxzdHJvbmc+XHUyNkEwXHVGRTBGIFBlcnNpc3RlbnQgc3RvcmFnZSBcdTIwMTQgdGhpcyB0YWIgb25seTo8L3N0cm9uZz4gRWRpdHMgbWFkZSBoZXJlICh0aGUgc3RydWN0dXJlZFxuICAgICAgZWRpdG9ycyBiZWxvdywgYW5kIFwiVXBkYXRlIHZpYSBBSVwiKSB3cml0ZSBkaXJlY3RseSB0byA8Y29kZT5NYXN0ZXJfQ1ZfRGF0YS5qc29uPC9jb2RlPlxuICAgICAgaW1tZWRpYXRlbHkgYW5kIHBlcnNpc3QgYWNyb3NzIGV2ZXJ5IGZ1dHVyZSBqb2IgYXBwbGljYXRpb24uXG4gICAgICBKb2Itc3BlY2lmaWMgY2hvaWNlcyB5b3UgbWFrZSBlbHNld2hlcmUgaW4gdGhlIGFwcCBcdTIwMTQgd2hpY2ggc2tpbGxzL2V4cGVyaWVuY2VzIHRvIGZlYXR1cmUsXG4gICAgICByZXdyaXR0ZW4gYnVsbGV0IHRleHQsIGNvdmVyLWxldHRlciB0b25lIFx1MjAxNCBsaXZlIG9ubHkgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbiBhbmQgYXJlXG4gICAgICA8ZW0+bmV2ZXI8L2VtPiB3cml0dGVuIGhlcmUgYXV0b21hdGljYWxseS4gVG8gY2FycnkgYSBzZXNzaW9uJ3MgaW1wcm92ZW1lbnRzIGludG8geW91clxuICAgICAgcGVybWFuZW50IHByb2ZpbGUsIHVzZSBcIlx1RDgzRFx1RENFNSBVcGRhdGUgTWFzdGVyIENWIERhdGFcIiBvbiB0aGUgRmluYWxpc2Ugc3RlcC5cbiAgICA8L2Rpdj5cblxuICAgICR7aXNFZGl0YWJsZSA/IHJlbmRlck1hc3RlckRhdGFBaVVwZGF0ZVBhbmVsKCkgOiByZW5kZXJNYXN0ZXJEYXRhQWlVcGRhdGVEaXNhYmxlZE5vdGUoKX1cblxuICAgICR7X3JlbmRlck1hc3RlckNoYW5nZU5vdGljZSgpfVxuXG4gICAgPCEtLSBQcm9maWxlIG92ZXJ2aWV3IGNhcmQgLS0+XG4gICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1wcm9maWxlLWNhcmRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItcHJvZmlsZS1uYW1lXCI+JHtlc2NhcGVIdG1sKG92ZXJ2aWV3Lm5hbWUgfHwgJ1lvdXIgUHJvZmlsZScpfTwvZGl2PlxuICAgICAgJHtvdmVydmlldy5oZWFkbGluZSA/IGA8ZGl2IGNsYXNzPVwibWFzdGVyLXByb2ZpbGUtaGVhZGxpbmVcIj4ke2VzY2FwZUh0bWwob3ZlcnZpZXcuaGVhZGxpbmUpfTwvZGl2PmAgOiAnJ31cbiAgICAgICR7b3ZlcnZpZXcuZW1haWwgICAgPyBgPGRpdiBjbGFzcz1cIm1hc3Rlci1wcm9maWxlLWVtYWlsXCI+XHUyNzA5XHVGRTBGICR7ZXNjYXBlSHRtbChvdmVydmlldy5lbWFpbCl9PC9kaXY+YCA6ICcnfVxuICAgICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1zdGF0c1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXN0YXRcIj48c3BhbiBjbGFzcz1cIm1hc3Rlci1zdGF0LXZhbHVlXCI+JHtvdmVydmlldy5leHBlcmllbmNlX2NvdW50ID8/ICdcdTIwMTQnfTwvc3Bhbj48c3BhbiBjbGFzcz1cIm1hc3Rlci1zdGF0LWxhYmVsXCI+RXhwZXJpZW5jZXM8L3NwYW4+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc3RhdFwiPjxzcGFuIGNsYXNzPVwibWFzdGVyLXN0YXQtdmFsdWVcIj4ke292ZXJ2aWV3LnNraWxsX2NvdW50ID8/ICdcdTIwMTQnfTwvc3Bhbj48c3BhbiBjbGFzcz1cIm1hc3Rlci1zdGF0LWxhYmVsXCI+U2tpbGxzPC9zcGFuPjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXN0YXRcIj48c3BhbiBjbGFzcz1cIm1hc3Rlci1zdGF0LXZhbHVlXCI+JHtvdmVydmlldy5hY2hpZXZlbWVudF9jb3VudCA/PyAnXHUyMDE0J308L3NwYW4+PHNwYW4gY2xhc3M9XCJtYXN0ZXItc3RhdC1sYWJlbFwiPkFjaGlldmVtZW50czwvc3Bhbj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1zdGF0XCI+PHNwYW4gY2xhc3M9XCJtYXN0ZXItc3RhdC12YWx1ZVwiPiR7b3ZlcnZpZXcuc3VtbWFyeV9jb3VudCA/PyAnXHUyMDE0J308L3NwYW4+PHNwYW4gY2xhc3M9XCJtYXN0ZXItc3RhdC1sYWJlbFwiPlN1bW1hcmllczwvc3Bhbj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1zdGF0XCI+PHNwYW4gY2xhc3M9XCJtYXN0ZXItc3RhdC12YWx1ZVwiPiR7b3ZlcnZpZXcuZWR1Y2F0aW9uX2NvdW50ID8/ICdcdTIwMTQnfTwvc3Bhbj48c3BhbiBjbGFzcz1cIm1hc3Rlci1zdGF0LWxhYmVsXCI+RWR1Y2F0aW9uPC9zcGFuPjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXN0YXRcIj48c3BhbiBjbGFzcz1cIm1hc3Rlci1zdGF0LXZhbHVlXCI+JHtvdmVydmlldy5wdWJsaWNhdGlvbl9jb3VudCA/PyAnXHUyMDE0J308L3NwYW4+PHNwYW4gY2xhc3M9XCJtYXN0ZXItc3RhdC1sYWJlbFwiPlB1YmxpY2F0aW9uczwvc3Bhbj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBQZXJzb25hbCBJbmZvIHNlY3Rpb24gLS0+XG4gICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1zZWN0aW9uXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXNlY3Rpb24taGVhZGVyXCI+XG4gICAgICAgIDxoMj5cdUQ4M0RcdURDNjQgUGVyc29uYWwgSW5mb3JtYXRpb248L2gyPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0blwiIG9uY2xpY2s9XCJzaG93RWRpdFBlcnNvbmFsSW5mb01vZGFsKClcIiBhcmlhLWxhYmVsPVwiRWRpdCBwZXJzb25hbCBpbmZvcm1hdGlvblwiPlxuICAgICAgICAgIFx1MjcwRlx1RkUwRiBFZGl0XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGlkPVwibWFzdGVyLXBlcnNvbmFsLWluZm8tY29udGFpbmVyXCI+XG4gICAgICAgICR7X3JlbmRlclBlcnNvbmFsSW5mb0NhcmQocGVyc29uYWxJbmZvKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBFeHBlcmllbmNlcyBzZWN0aW9uIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc2VjdGlvblwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1zZWN0aW9uLWhlYWRlclwiPlxuICAgICAgICA8aDI+XHVEODNEXHVEQ0JDIFdvcmsgRXhwZXJpZW5jZTwvaDI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgb25jbGljaz1cInNob3dBZGRFeHBlcmllbmNlTW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJBZGQgbmV3IHdvcmsgZXhwZXJpZW5jZVwiPlxuICAgICAgICAgICsgQWRkIEV4cGVyaWVuY2VcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgaWQ9XCJtYXN0ZXItZXhwZXJpZW5jZXMtY29udGFpbmVyXCI+XG4gICAgICAgICR7X3JlbmRlckV4cGVyaWVuY2VzTGlzdChleHBlcmllbmNlcyl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gU2tpbGxzIHNlY3Rpb24gLS0+XG4gICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1zZWN0aW9uXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXNlY3Rpb24taGVhZGVyXCI+XG4gICAgICAgIDxoMj5cdUQ4M0RcdURFRTBcdUZFMEYgU2tpbGxzPC9oMj5cbiAgICAgICAgJHtBcnJheS5pc0FycmF5KHNraWxscykgPyBgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwic2hvd0FkZFNraWxsTW9kYWwoJycsIHRydWUpXCIgYXJpYS1sYWJlbD1cIkFkZCBuZXcgc2tpbGxcIj4rIEFkZCBTa2lsbDwvYnV0dG9uPmAgOiAnJ31cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBpZD1cIm1hc3Rlci1za2lsbHMtY29udGFpbmVyXCI+XG4gICAgICAgICR7X3JlbmRlclNraWxsc1NlY3Rpb24oc2tpbGxzKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBFZHVjYXRpb24gc2VjdGlvbiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXNlY3Rpb25cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc2VjdGlvbi1oZWFkZXJcIj5cbiAgICAgICAgPGgyPlx1RDgzQ1x1REY5MyBFZHVjYXRpb248L2gyPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0blwiIG9uY2xpY2s9XCJzaG93QWRkRWR1Y2F0aW9uTW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJBZGQgZWR1Y2F0aW9uIGVudHJ5XCI+XG4gICAgICAgICAgKyBBZGQgRWR1Y2F0aW9uXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGlkPVwibWFzdGVyLWVkdWNhdGlvbi1jb250YWluZXJcIj5cbiAgICAgICAgJHtfcmVuZGVyRWR1Y2F0aW9uTGlzdChlZHVjYXRpb24pfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFB1YmxpY2F0aW9ucyBzZWN0aW9uIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc2VjdGlvblwiIGlkPVwibWFzdGVyLXB1YmxpY2F0aW9ucy1zZWN0aW9uXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXNlY3Rpb24taGVhZGVyXCI+XG4gICAgICAgIDxoMj5cdUQ4M0RcdURDRDYgUHVibGljYXRpb25zPC9oMj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDtcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBzZWNvbmRhcnlcIiBpZD1cIm1hc3Rlci1wdWItaW1wb3J0LWJ0blwiXG4gICAgICAgICAgICAgIG9uY2xpY2s9XCJzaG93SW1wb3J0UHVibGljYXRpb25zTW9kYWwoKVwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJJbXBvcnQgQmliVGVYIHB1YmxpY2F0aW9uc1wiPlxuICAgICAgICAgICAgXHUyQjA2XHVGRTBGIEltcG9ydCBCaWJUZVhcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBzZWNvbmRhcnlcIiBpZD1cIm1hc3Rlci1wdWItY29udmVydC1idG5cIlxuICAgICAgICAgICAgICBvbmNsaWNrPVwic2hvd0NvbnZlcnRQdWJsaWNhdGlvbnNNb2RhbCgpXCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkNvbnZlcnQgY2l0YXRpb24gdGV4dCB0byBCaWJUZVhcIj5cbiAgICAgICAgICAgIFx1RDgzRVx1REU4NCBDb252ZXJ0IFRleHRcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBzZWNvbmRhcnlcIiBpZD1cIm1hc3Rlci1wdWItdG9nZ2xlLWJ0blwiXG4gICAgICAgICAgICAgIG9uY2xpY2s9XCJ0b2dnbGVQdWJsaWNhdGlvbnNWaWV3KClcIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiVG9nZ2xlIGJldHdlZW4gc3RydWN0dXJlZCBDUlVEIHZpZXcgYW5kIHJhdyBCaWJUZVggZWRpdG9yXCI+XG4gICAgICAgICAgICBcdTI3MEZcdUZFMEYgUmF3IEJpYlRlWFxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgaWQ9XCJtYXN0ZXItcHViLWFkZC1idG5cIlxuICAgICAgICAgICAgICBvbmNsaWNrPVwic2hvd0FkZFB1YmxpY2F0aW9uTW9kYWwoKVwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJBZGQgcHVibGljYXRpb25cIj5cbiAgICAgICAgICAgICsgQWRkIFB1YmxpY2F0aW9uXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8IS0tIENSVUQgc3RydWN0dXJlZCB2aWV3IChkZWZhdWx0KSAtLT5cbiAgICAgIDxkaXYgaWQ9XCJtYXN0ZXItcHViLWNydWQtdmlld1wiPlxuICAgICAgICA8ZGl2IGlkPVwibWFzdGVyLXB1Yi1jcnVkLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtwYWRkaW5nOjEycHggMDtcIj5Mb2FkaW5nIHB1YmxpY2F0aW9uc1x1MjAyNjwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDwhLS0gUmF3IEJpYlRlWCBlZGl0b3IgKGhpZGRlbiBieSBkZWZhdWx0KSAtLT5cbiAgICAgIDxkaXYgaWQ9XCJtYXN0ZXItcHViLXJhdy12aWV3XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+XG4gICAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtmb250LXNpemU6MC45ZW07bWFyZ2luLWJvdHRvbToxMHB4O1wiPlxuICAgICAgICAgIEVkaXQgeW91ciBCaWJUZVggYmlibGlvZ3JhcGh5IGZpbGUgZGlyZWN0bHkuIENoYW5nZXMgYXJlIHNhdmVkIHRvXG4gICAgICAgICAgPGNvZGU+cHVibGljYXRpb25zLmJpYjwvY29kZT4gYW5kIGEgdGltZXN0YW1wZWQgYmFja3VwIGlzIGNyZWF0ZWRcbiAgICAgICAgICBhdXRvbWF0aWNhbGx5LiBDb250ZW50IGlzIHZhbGlkYXRlZCBiZWZvcmUgd3JpdGluZy5cbiAgICAgICAgPC9wPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6OHB4O21hcmdpbi1ib3R0b206OHB4O1wiPlxuICAgICAgICAgIDxzcGFuIGlkPVwibWFzdGVyLXB1Yi1jb3VudFwiIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtmb250LXNpemU6MC45ZW07XCI+PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZmxleDoxO1wiPjwvc3Bhbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBzZWNvbmRhcnlcIiBvbmNsaWNrPVwidmFsaWRhdGVQdWJsaWNhdGlvbnNCaWIoKVwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJWYWxpZGF0ZSBCaWJUZVggd2l0aG91dCBzYXZpbmdcIj5cdUQ4M0RcdUREMEQgVmFsaWRhdGU8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBzZWNvbmRhcnlcIiBvbmNsaWNrPVwibG9hZFB1YmxpY2F0aW9uc0JpYigpXCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlJlbG9hZCBwdWJsaWNhdGlvbnMuYmliIGZyb20gZGlza1wiPlx1RDgzRFx1REQwNCBSZWxvYWQ8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBwcmltYXJ5XCIgaWQ9XCJtYXN0ZXItcHViLXNhdmUtYnRuXCJcbiAgICAgICAgICAgICAgb25jbGljaz1cInNhdmVQdWJsaWNhdGlvbnNCaWIoKVwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJTYXZlIEJpYlRlWCB0byBkaXNrXCI+XHVEODNEXHVEQ0JFIFNhdmU8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDx0ZXh0YXJlYSBpZD1cIm1hc3Rlci1wdWItdGV4dGFyZWFcIlxuICAgICAgICAgIGNsYXNzPVwiZWRpdC1pbnB1dFwiXG4gICAgICAgICAgcm93cz1cIjIwXCJcbiAgICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Zm9udC1mYW1pbHk6bW9ub3NwYWNlO2ZvbnQtc2l6ZTowLjg1ZW07cmVzaXplOnZlcnRpY2FsO1wiXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJMb2FkaW5nXHUyMDI2XCJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiQmliVGVYIGJpYmxpb2dyYXBoeSBjb250ZW50XCJcbiAgICAgICAgICBzcGVsbGNoZWNrPVwiZmFsc2VcIlxuICAgICAgICA+PC90ZXh0YXJlYT5cbiAgICAgICAgPGRpdiBpZD1cIm1hc3Rlci1wdWItc3RhdHVzXCJcbiAgICAgICAgICAgIHN0eWxlPVwibWFyZ2luLXRvcDo2cHg7Zm9udC1zaXplOjAuODVlbTtjb2xvcjojNmI3MjgwO1wiXG4gICAgICAgICAgICBhcmlhLWxpdmU9XCJwb2xpdGVcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBBd2FyZHMgc2VjdGlvbiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXNlY3Rpb25cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc2VjdGlvbi1oZWFkZXJcIj5cbiAgICAgICAgPGgyPlx1RDgzQ1x1REZDNSBBd2FyZHMgJmFtcDsgSG9ub3VyczwvaDI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgb25jbGljaz1cInNob3dBZGRBd2FyZE1vZGFsKClcIiBhcmlhLWxhYmVsPVwiQWRkIGF3YXJkXCI+XG4gICAgICAgICAgKyBBZGQgQXdhcmRcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgaWQ9XCJtYXN0ZXItYXdhcmRzLWNvbnRhaW5lclwiPlxuICAgICAgICAke19yZW5kZXJBd2FyZHNMaXN0KGF3YXJkcyl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gQ2VydGlmaWNhdGlvbnMgc2VjdGlvbiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXNlY3Rpb25cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc2VjdGlvbi1oZWFkZXJcIj5cbiAgICAgICAgPGgyPlx1RDgzQ1x1REY5MyBDZXJ0aWZpY2F0aW9uczwvaDI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgb25jbGljaz1cInNob3dBZGRDZXJ0aWZpY2F0aW9uTW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJBZGQgY2VydGlmaWNhdGlvblwiPlxuICAgICAgICAgICsgQWRkIENlcnRpZmljYXRpb25cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgaWQ9XCJtYXN0ZXItY2VydGlmaWNhdGlvbnMtY29udGFpbmVyXCI+XG4gICAgICAgICR7X3JlbmRlckNlcnRpZmljYXRpb25zTGlzdChjZXJ0aWZpY2F0aW9ucyl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gU2VsZWN0ZWQgQWNoaWV2ZW1lbnRzIHNlY3Rpb24gLS0+XG4gICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1zZWN0aW9uXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXNlY3Rpb24taGVhZGVyXCI+XG4gICAgICAgIDxoMj5cdUQ4M0NcdURGQzYgU2VsZWN0ZWQgQWNoaWV2ZW1lbnRzPC9oMj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwic2hvd0FkZEFjaGlldmVtZW50TW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJBZGQgbmV3IGFjaGlldmVtZW50IHRvIG1hc3RlciBDVlwiPlxuICAgICAgICAgICsgQWRkIEFjaGlldmVtZW50XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7Zm9udC1zaXplOjAuOWVtO21hcmdpbi1ib3R0b206MTJweDtcIj5cbiAgICAgICAgVGhlc2UgYXJlIGNyb3NzLXJvbGUgaGlnaGxpZ2h0cyBzaG93biBpbiB0aGUgQWNoaWV2ZW1lbnRzIHJldmlldyBkdXJpbmcgY3VzdG9taXNhdGlvbi5cbiAgICAgICAgVGhlIEhhcnZlc3QgZmVhdHVyZSAoSGFydmVzdCB0YWIpIGNhbiBhZGQgbmV3IG9uZXMgZnJvbSB5b3VyIGN1cnJlbnQgc2Vzc2lvbi5cbiAgICAgIDwvcD5cbiAgICAgIDxkaXYgaWQ9XCJtYXN0ZXItYWNoaWV2ZW1lbnRzLWNvbnRhaW5lclwiPlxuICAgICAgICAke19yZW5kZXJNYXN0ZXJBY2hpZXZlbWVudHNUYWJsZShhY2hpZXZlbWVudHMpfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFByb2Zlc3Npb25hbCBTdW1tYXJpZXMgc2VjdGlvbiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXNlY3Rpb25cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc2VjdGlvbi1oZWFkZXJcIj5cbiAgICAgICAgPGgyPlx1RDgzRFx1RENERCBQcm9mZXNzaW9uYWwgU3VtbWFyaWVzPC9oMj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwic2hvd0FkZFN1bW1hcnlNb2RhbCgpXCIgYXJpYS1sYWJlbD1cIkFkZCBuZXcgcHJvZmVzc2lvbmFsIHN1bW1hcnkgdmFyaWFudFwiPlxuICAgICAgICAgICsgQWRkIFN1bW1hcnlcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtmb250LXNpemU6MC45ZW07bWFyZ2luLWJvdHRvbToxMnB4O1wiPlxuICAgICAgICBOYW1lZCBzdW1tYXJ5IHZhcmlhbnRzIGxldCB5b3UgdGFpbG9yIHlvdXIgcHJvZmVzc2lvbmFsIHN0YXRlbWVudCBmb3IgZGlmZmVyZW50IHJvbGUgdHlwZXNcbiAgICAgICAgd2l0aG91dCByZWdlbmVyYXRpbmcgZnJvbSBzY3JhdGNoLiBUaGUgQUkgd2lsbCByZWNvbW1lbmQgdGhlIG1vc3QgcmVsZXZhbnQgdmFyaWFudFxuICAgICAgICBkdXJpbmcgdGhlIFN1bW1hcnkgRm9jdXMgc3RlcC5cbiAgICAgIDwvcD5cbiAgICAgIDxkaXYgaWQ9XCJtYXN0ZXItc3VtbWFyaWVzLWNvbnRhaW5lclwiPlxuICAgICAgICAke19yZW5kZXJTdW1tYXJpZXNMaXN0KHN1bW1hcmllcyl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gUHVibGljYXRpb24gYWRkL2VkaXQgbW9kYWwgLS0+XG4gICAgPGRpdiBpZD1cIm1hc3Rlci1wdWItbW9kYWwtb3ZlcmxheVwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLW1vZGFsPVwidHJ1ZVwiXG4gICAgICAgIGFyaWEtbGFiZWxsZWRieT1cIm1hc3Rlci1wdWItbW9kYWwtdGl0bGVcIiBjbGFzcz1cIm1vZGFsLW92ZXJsYXlcIlxuICAgICAgICBvbmNsaWNrPVwiaWYoZXZlbnQudGFyZ2V0PT09dGhpcyljbG9zZVB1YmxpY2F0aW9uTW9kYWwoKVwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsXCIgc3R5bGU9XCJtYXgtd2lkdGg6NTgwcHg7XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cbiAgICAgICAgICA8aDIgaWQ9XCJtYXN0ZXItcHViLW1vZGFsLXRpdGxlLWhlYWRpbmdcIiBpZD1cInB1Yi1tb2RhbC10aXRsZS1oZWFkaW5nXCI+QWRkIFB1YmxpY2F0aW9uPC9oMj5cbiAgICAgICAgICA8YnV0dG9uIG9uY2xpY2s9XCJjbG9zZVB1YmxpY2F0aW9uTW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJDbG9zZSBwdWJsaWNhdGlvbiBlZGl0b3JcIlxuICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6bm9uZTtib3JkZXI6bm9uZTtmb250LXNpemU6MS40ZW07Y3Vyc29yOnBvaW50ZXI7Y29sb3I6IzY0NzQ4YjtcIj4mdGltZXM7PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiIHN0eWxlPVwicGFkZGluZzoyMHB4O1wiPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjEycHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwicHViLW1vZGFsLWtleVwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+Q2l0ZSBLZXkgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+Kjwvc3Bhbj48L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJwdWItbW9kYWwta2V5XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiIGFyaWEtcmVxdWlyZWQ9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gc21pdGgyMDI0bWxcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjEycHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwicHViLW1vZGFsLXR5cGVcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkVudHJ5IFR5cGUgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+Kjwvc3Bhbj48L2xhYmVsPlxuICAgICAgICAgICAgPHNlbGVjdCBpZD1cInB1Yi1tb2RhbC10eXBlXCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiYXJ0aWNsZVwiPmFydGljbGU8L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImlucHJvY2VlZGluZ3NcIj5pbnByb2NlZWRpbmdzPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJib29rXCI+Ym9vazwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiaW5jb2xsZWN0aW9uXCI+aW5jb2xsZWN0aW9uPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ0ZWNocmVwb3J0XCI+dGVjaHJlcG9ydDwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicGhkdGhlc2lzXCI+cGhkdGhlc2lzPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJtYXN0ZXJzdGhlc2lzXCI+bWFzdGVyc3RoZXNpczwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwibWlzY1wiPm1pc2M8L29wdGlvbj5cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjEycHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgaWQ9XCJwdWItbW9kYWwtYXV0aG9yLWxhYmVsXCIgZm9yPVwicHViLW1vZGFsLWF1dGhvclwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+QXV0aG9yKHMpIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPio8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwicHViLW1vZGFsLWF1dGhvclwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiTGFzdCwgRmlyc3QgYW5kIExhc3QyLCBGaXJzdDJcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjEycHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwicHViLW1vZGFsLXRpdGxlXCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5UaXRsZSA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4qPC9zcGFuPjwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInB1Yi1tb2RhbC10aXRsZVwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIiBhcmlhLXJlcXVpcmVkPVwidHJ1ZVwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6MTJweDttYXJnaW4tYm90dG9tOjEycHg7XCI+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDowIDAgMTAwcHg7XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwdWItbW9kYWwteWVhclwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+WWVhciA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4qPC9zcGFuPjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJwdWItbW9kYWwteWVhclwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwcHg7XCJcbiAgICAgICAgICAgICAgICAgIG1pbj1cIjE5MDBcIiBtYXg9XCIyMTAwXCIgYXJpYS1yZXF1aXJlZD1cInRydWVcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDoxO1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicHViLW1vZGFsLWpvdXJuYWxcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkpvdXJuYWwgLyBCb29rdGl0bGU8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInB1Yi1tb2RhbC1qb3VybmFsXCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxMnB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cInB1Yi1tb2RhbC1kb2lcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkRPSSAvIFVSTDwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInB1Yi1tb2RhbC1kb2lcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIjEwLnh4eHgveHh4eHhcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjRweDtcIj5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwdWItbW9kYWwtZXh0cmFcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkV4dHJhIGZpZWxkcyA8c3BhbiBzdHlsZT1cImZvbnQtd2VpZ2h0OjQwMDtjb2xvcjojNmI3MjgwO1wiPihrZXk9dmFsdWUsIG9uZSBwZXIgbGluZSk8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD1cInB1Yi1tb2RhbC1leHRyYVwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHJvd3M9XCIzXCIgc3R5bGU9XCJ3aWR0aDoxMDAlO3Jlc2l6ZTp2ZXJ0aWNhbDtmb250LWZhbWlseTptb25vc3BhY2U7Zm9udC1zaXplOjAuODVlbTtcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwidm9sdW1lPTEyJiMxMDtwYWdlcz0xLS0yMFwiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCIgc3R5bGU9XCJkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kO2dhcDo4cHg7cGFkZGluZzoxNnB4IDIwcHg7XCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwiY2xvc2VQdWJsaWNhdGlvbk1vZGFsKClcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBwcmltYXJ5XCIgb25jbGljaz1cInNhdmVNYXN0ZXJQdWJsaWNhdGlvbigpXCI+U2F2ZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBpZD1cIm1hc3Rlci1wdWItaW1wb3J0LW1vZGFsLW92ZXJsYXlcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1tb2RhbD1cInRydWVcIlxuICAgICAgICBhcmlhLWxhYmVsbGVkYnk9XCJtYXN0ZXItcHViLWltcG9ydC1tb2RhbC10aXRsZVwiIGNsYXNzPVwibW9kYWwtb3ZlcmxheVwiXG4gICAgICAgIG9uY2xpY2s9XCJpZihldmVudC50YXJnZXQ9PT10aGlzKWNsb3NlSW1wb3J0UHVibGljYXRpb25zTW9kYWwoKVwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsXCIgc3R5bGU9XCJtYXgtd2lkdGg6NjgwcHg7XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cbiAgICAgICAgICA8aDIgaWQ9XCJtYXN0ZXItcHViLWltcG9ydC1tb2RhbC10aXRsZVwiPkltcG9ydCBCaWJUZVggUHVibGljYXRpb25zPC9oMj5cbiAgICAgICAgICA8YnV0dG9uIG9uY2xpY2s9XCJjbG9zZUltcG9ydFB1YmxpY2F0aW9uc01vZGFsKClcIiBhcmlhLWxhYmVsPVwiQ2xvc2UgQmliVGVYIGltcG9ydCBkaWFsb2dcIlxuICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6bm9uZTtib3JkZXI6bm9uZTtmb250LXNpemU6MS40ZW07Y3Vyc29yOnBvaW50ZXI7Y29sb3I6IzY0NzQ4YjtcIj4mdGltZXM7PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiIHN0eWxlPVwicGFkZGluZzoyMHB4O1wiPlxuICAgICAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtmb250LXNpemU6MC45ZW07bWFyZ2luOjAgMCAxMnB4O1wiPlxuICAgICAgICAgICAgUGFzdGUgb25lIG9yIG1vcmUgQmliVGVYIGVudHJpZXMgdG8gbWVyZ2UgdGhlbSBpbnRvIDxjb2RlPnB1YmxpY2F0aW9ucy5iaWI8L2NvZGU+LlxuICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8dGV4dGFyZWEgaWQ9XCJtYXN0ZXItcHViLWltcG9ydC10ZXh0YXJlYVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZWRpdC1pbnB1dFwiXG4gICAgICAgICAgICAgIHJvd3M9XCIxMlwiXG4gICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTtmb250LWZhbWlseTptb25vc3BhY2U7Zm9udC1zaXplOjAuODVlbTtyZXNpemU6dmVydGljYWw7XCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJAYXJ0aWNsZXtzbWl0aDIwMjUsLi4ufVwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJCaWJUZVggaW1wb3J0IGNvbnRlbnRcIlxuICAgICAgICAgICAgICBzcGVsbGNoZWNrPVwiZmFsc2VcIj48L3RleHRhcmVhPlxuICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDttYXJnaW4tdG9wOjEycHg7Y29sb3I6IzMzNDE1NTtcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cIm1hc3Rlci1wdWItaW1wb3J0LW92ZXJ3cml0ZVwiIC8+XG4gICAgICAgICAgICBPdmVyd3JpdGUgZXhpc3RpbmcgZW50cmllcyB3aGVuIGNpdGUga2V5cyBhbHJlYWR5IGV4aXN0XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8ZGl2IGlkPVwibWFzdGVyLXB1Yi1pbXBvcnQtc3RhdHVzXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJtYXJnaW4tdG9wOjEwcHg7Zm9udC1zaXplOjAuODVlbTtjb2xvcjojNmI3MjgwO1wiXG4gICAgICAgICAgICAgIGFyaWEtbGl2ZT1cInBvbGl0ZVwiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiIHN0eWxlPVwiZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpmbGV4LWVuZDtnYXA6OHB4O3BhZGRpbmc6MTZweCAyMHB4O1wiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgb25jbGljaz1cImNsb3NlSW1wb3J0UHVibGljYXRpb25zTW9kYWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHByaW1hcnlcIiBpZD1cIm1hc3Rlci1wdWItaW1wb3J0LXN1Ym1pdC1idG5cIlxuICAgICAgICAgICAgICBvbmNsaWNrPVwiaW1wb3J0UHVibGljYXRpb25zQmliKClcIj5JbXBvcnQ8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgaWQ9XCJtYXN0ZXItcHViLWNvbnZlcnQtbW9kYWwtb3ZlcmxheVwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLW1vZGFsPVwidHJ1ZVwiXG4gICAgICAgIGFyaWEtbGFiZWxsZWRieT1cIm1hc3Rlci1wdWItY29udmVydC1tb2RhbC10aXRsZVwiIGNsYXNzPVwibW9kYWwtb3ZlcmxheVwiXG4gICAgICAgIG9uY2xpY2s9XCJpZihldmVudC50YXJnZXQ9PT10aGlzKWNsb3NlQ29udmVydFB1YmxpY2F0aW9uc01vZGFsKClcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbFwiIHN0eWxlPVwibWF4LXdpZHRoOjc2MHB4O1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XG4gICAgICAgICAgPGgyIGlkPVwibWFzdGVyLXB1Yi1jb252ZXJ0LW1vZGFsLXRpdGxlXCI+Q29udmVydCBDaXRhdGlvbiBUZXh0IHRvIEJpYlRlWDwvaDI+XG4gICAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPVwiY2xvc2VDb252ZXJ0UHVibGljYXRpb25zTW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJDbG9zZSBjaXRhdGlvbiBjb252ZXJzaW9uIGRpYWxvZ1wiXG4gICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDpub25lO2JvcmRlcjpub25lO2ZvbnQtc2l6ZToxLjRlbTtjdXJzb3I6cG9pbnRlcjtjb2xvcjojNjQ3NDhiO1wiPiZ0aW1lczs8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCIgc3R5bGU9XCJwYWRkaW5nOjIwcHg7XCI+XG4gICAgICAgICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO2ZvbnQtc2l6ZTowLjllbTttYXJnaW46MCAwIDEycHg7XCI+XG4gICAgICAgICAgICBQYXN0ZSBmcmVlLWZvcm0gY2l0YXRpb24gdGV4dCwgcmV2aWV3IHRoZSBnZW5lcmF0ZWQgQmliVGVYLCB0aGVuIGltcG9ydCBpdCB3aGVuIGl0IGxvb2tzIGNvcnJlY3QuXG4gICAgICAgICAgPC9wPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmdyaWQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmcjtnYXA6MTRweDtcIj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJtYXN0ZXItcHViLWNvbnZlcnQtaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkNpdGF0aW9uIFRleHQ8L2xhYmVsPlxuICAgICAgICAgICAgICA8dGV4dGFyZWEgaWQ9XCJtYXN0ZXItcHViLWNvbnZlcnQtaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJlZGl0LWlucHV0XCJcbiAgICAgICAgICAgICAgICAgIHJvd3M9XCI3XCJcbiAgICAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTtyZXNpemU6dmVydGljYWw7XCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRG9lLCBKLiAoMjAyNSkuIEFydGljbGUgdGl0bGUuIEpvdXJuYWwgTmFtZSwgMTIoMyksIDEtMTAuXCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJDaXRhdGlvbiB0ZXh0IHRvIGNvbnZlcnRcIj48L3RleHRhcmVhPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwibWFzdGVyLXB1Yi1jb252ZXJ0LW91dHB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+R2VuZXJhdGVkIEJpYlRlWCBQcmV2aWV3PC9sYWJlbD5cbiAgICAgICAgICAgICAgPHRleHRhcmVhIGlkPVwibWFzdGVyLXB1Yi1jb252ZXJ0LW91dHB1dFwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImVkaXQtaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgcm93cz1cIjEwXCJcbiAgICAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTtmb250LWZhbWlseTptb25vc3BhY2U7Zm9udC1zaXplOjAuODVlbTtyZXNpemU6dmVydGljYWw7XCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQ29udmVydGVkIEJpYlRlWCB3aWxsIGFwcGVhciBoZXJlXCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJHZW5lcmF0ZWQgQmliVGVYIHByZXZpZXdcIlxuICAgICAgICAgICAgICAgICAgc3BlbGxjaGVjaz1cImZhbHNlXCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDttYXJnaW4tdG9wOjEycHg7Y29sb3I6IzMzNDE1NTtcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cIm1hc3Rlci1wdWItY29udmVydC1vdmVyd3JpdGVcIiAvPlxuICAgICAgICAgICAgT3ZlcndyaXRlIGV4aXN0aW5nIGVudHJpZXMgd2hlbiBpbXBvcnRpbmcgdGhlIGdlbmVyYXRlZCBCaWJUZVhcbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxkaXYgaWQ9XCJtYXN0ZXItcHViLWNvbnZlcnQtc3RhdHVzXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJtYXJnaW4tdG9wOjEwcHg7Zm9udC1zaXplOjAuODVlbTtjb2xvcjojNmI3MjgwO1wiXG4gICAgICAgICAgICAgIGFyaWEtbGl2ZT1cInBvbGl0ZVwiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiIHN0eWxlPVwiZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpmbGV4LWVuZDtnYXA6OHB4O3BhZGRpbmc6MTZweCAyMHB4O1wiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgb25jbGljaz1cImNsb3NlQ29udmVydFB1YmxpY2F0aW9uc01vZGFsKClcIj5DbG9zZTwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHNlY29uZGFyeVwiIGlkPVwibWFzdGVyLXB1Yi1jb252ZXJ0LXN1Ym1pdC1idG5cIlxuICAgICAgICAgICAgICBvbmNsaWNrPVwiY29udmVydFB1YmxpY2F0aW9uVGV4dCgpXCI+R2VuZXJhdGUgQmliVGVYPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG4gcHJpbWFyeVwiIGlkPVwibWFzdGVyLXB1Yi1jb252ZXJ0LWltcG9ydC1idG5cIlxuICAgICAgICAgICAgICBvbmNsaWNrPVwiaW1wb3J0Q29udmVydGVkUHVibGljYXRpb25UZXh0KClcIj5JbXBvcnQgUHJldmlldzwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBQZXJzb25hbCBJbmZvIG1vZGFsIC0tPlxuICAgIDxkaXYgaWQ9XCJtYXN0ZXItcGktbW9kYWwtb3ZlcmxheVwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLW1vZGFsPVwidHJ1ZVwiXG4gICAgICAgIGFyaWEtbGFiZWxsZWRieT1cIm1hc3Rlci1waS1tb2RhbC10aXRsZVwiIGNsYXNzPVwibW9kYWwtb3ZlcmxheVwiXG4gICAgICAgIG9uY2xpY2s9XCJpZihldmVudC50YXJnZXQ9PT10aGlzKWNsb3NlUGVyc29uYWxJbmZvTW9kYWwoKVwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsXCIgc3R5bGU9XCJtYXgtd2lkdGg6NjIwcHg7XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cbiAgICAgICAgICA8aDIgaWQ9XCJtYXN0ZXItcGktbW9kYWwtdGl0bGVcIj5FZGl0IFBlcnNvbmFsIEluZm9ybWF0aW9uPC9oMj5cbiAgICAgICAgICA8YnV0dG9uIG9uY2xpY2s9XCJjbG9zZVBlcnNvbmFsSW5mb01vZGFsKClcIiBhcmlhLWxhYmVsPVwiQ2xvc2UgcGVyc29uYWwgaW5mbyBlZGl0b3JcIlxuICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6bm9uZTtib3JkZXI6bm9uZTtmb250LXNpemU6MS40ZW07Y3Vyc29yOnBvaW50ZXI7Y29sb3I6IzY0NzQ4YjtcIj4mdGltZXM7PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiIHN0eWxlPVwicGFkZGluZzoyMHB4O1wiPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmdyaWQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmciAxZnI7Z2FwOjE0cHg7XCI+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZ3JpZC1jb2x1bW46MS8tMTtcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBpLW5hbWUtaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkZ1bGwgTmFtZTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwicGktbmFtZS1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIiBwbGFjZWhvbGRlcj1cImUuZy4gSmFuZSBTbWl0aCwgUGguRC5cIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZ3JpZC1jb2x1bW46MS8tMTtcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBpLXRpdGxlLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5Qcm9mZXNzaW9uYWwgVGl0bGUgLyBIZWFkbGluZTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwicGktdGl0bGUtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgcGxhY2Vob2xkZXI9XCJlLmcuIFNlbmlvciBEYXRhIFNjaWVudGlzdFwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwaS1lbWFpbC1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+RW1haWw8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImVtYWlsXCIgaWQ9XCJwaS1lbWFpbC1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIiBwbGFjZWhvbGRlcj1cInlvdUBleGFtcGxlLmNvbVwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwaS1waG9uZS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+UGhvbmU8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRlbFwiIGlkPVwicGktcGhvbmUtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgcGxhY2Vob2xkZXI9XCI1NTUtMTIzLTQ1NjdcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicGktbGlua2VkaW4taW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkxpbmtlZEluIFVSTDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidXJsXCIgaWQ9XCJwaS1saW5rZWRpbi1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIiBwbGFjZWhvbGRlcj1cImh0dHBzOi8vbGlua2VkaW4uY29tL2luL3lvdVwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwaS13ZWJzaXRlLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5XZWJzaXRlPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ1cmxcIiBpZD1cInBpLXdlYnNpdGUtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgcGxhY2Vob2xkZXI9XCJodHRwczovL3lvdXJzaXRlLmNvbVwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwaS1jaXR5LWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5DaXR5PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJwaS1jaXR5LWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiIHBsYWNlaG9sZGVyPVwiUm9jaGVzdGVyXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBpLXN0YXRlLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5TdGF0ZSAvIFJlZ2lvbjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwicGktc3RhdGUtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgcGxhY2Vob2xkZXI9XCJOWVwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0blwiIG9uY2xpY2s9XCJjbG9zZVBlcnNvbmFsSW5mb01vZGFsKClcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBwcmltYXJ5XCIgb25jbGljaz1cInNhdmVQZXJzb25hbEluZm8oKVwiPlNhdmU8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gRXhwZXJpZW5jZSBtb2RhbCAtLT5cbiAgICA8ZGl2IGlkPVwibWFzdGVyLWV4cC1tb2RhbC1vdmVybGF5XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCIgcm9sZT1cImRpYWxvZ1wiIGFyaWEtbW9kYWw9XCJ0cnVlXCJcbiAgICAgICAgYXJpYS1sYWJlbGxlZGJ5PVwibWFzdGVyLWV4cC1tb2RhbC10aXRsZVwiIGNsYXNzPVwibW9kYWwtb3ZlcmxheVwiXG4gICAgICAgIG9uY2xpY2s9XCJpZihldmVudC50YXJnZXQ9PT10aGlzKWNsb3NlRXhwZXJpZW5jZU1vZGFsKClcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbFwiIHN0eWxlPVwibWF4LXdpZHRoOjY0MHB4O1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XG4gICAgICAgICAgPGgyIGlkPVwibWFzdGVyLWV4cC1tb2RhbC10aXRsZVwiPldvcmsgRXhwZXJpZW5jZTwvaDI+XG4gICAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPVwiY2xvc2VFeHBlcmllbmNlTW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJDbG9zZSBleHBlcmllbmNlIGVkaXRvclwiXG4gICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDpub25lO2JvcmRlcjpub25lO2ZvbnQtc2l6ZToxLjRlbTtjdXJzb3I6cG9pbnRlcjtjb2xvcjojNjQ3NDhiO1wiPiZ0aW1lczs8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCIgc3R5bGU9XCJwYWRkaW5nOjIwcHg7XCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBpZD1cImV4cC1tb2RhbC1pZFwiIC8+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6MWZyIDFmcjtnYXA6MTRweDtcIj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJncmlkLWNvbHVtbjoxLy0xO1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZXhwLXRpdGxlLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5Kb2IgVGl0bGUgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+Kjwvc3Bhbj48L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImV4cC10aXRsZS1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIiBhcmlhLXJlcXVpcmVkPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gU2VuaW9yIERhdGEgU2NpZW50aXN0XCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImdyaWQtY29sdW1uOjEvLTE7XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJleHAtY29tcGFueS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+Q29tcGFueSA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4qPC9zcGFuPjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZXhwLWNvbXBhbnktaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgYXJpYS1yZXF1aXJlZD1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIEFjbWUgQ29ycFwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJleHAtY2l0eS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+Q2l0eTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZXhwLWNpdHktaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgcGxhY2Vob2xkZXI9XCJCb3N0b25cIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZXhwLXN0YXRlLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5TdGF0ZSAvIFJlZ2lvbjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZXhwLXN0YXRlLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiIHBsYWNlaG9sZGVyPVwiTUFcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZXhwLXN0YXJ0LWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5TdGFydCBEYXRlPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJleHAtc3RhcnQtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgcGxhY2Vob2xkZXI9XCIyMDIwLTAxXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImV4cC1lbmQtaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkVuZCBEYXRlIChibGFuayA9IHByZXNlbnQpPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJleHAtZW5kLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiIHBsYWNlaG9sZGVyPVwiMjAyNC0wNiBvciBsZWF2ZSBibGFua1wiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJleHAtdHlwZS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+RW1wbG95bWVudCBUeXBlPC9sYWJlbD5cbiAgICAgICAgICAgICAgPHNlbGVjdCBpZD1cImV4cC10eXBlLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiPlxuICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJmdWxsX3RpbWVcIj5GdWxsLXRpbWU8L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicGFydF90aW1lXCI+UGFydC10aW1lPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImNvbnRyYWN0XCI+Q29udHJhY3Q8L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiY29uc3VsdGluZ1wiPkNvbnN1bHRpbmc8L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiaW50ZXJuc2hpcFwiPkludGVybnNoaXA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwic2VsZl9lbXBsb3llZFwiPlNlbGYtZW1wbG95ZWQ8L29wdGlvbj5cbiAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJleHAtaW1wb3J0YW5jZS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+SW1wb3J0YW5jZSAoMVx1MjAxMzEwKTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJleHAtaW1wb3J0YW5jZS1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6ODBweDtcIlxuICAgICAgICAgICAgICAgICAgbWluPVwiMVwiIG1heD1cIjEwXCIgdmFsdWU9XCI1XCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImdyaWQtY29sdW1uOjEvLTE7XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJleHAtdGFncy1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+VGFncyAoY29tbWEtc2VwYXJhdGVkKTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZXhwLXRhZ3MtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBtbCwgbGVhZGVyc2hpcCwgcHl0aG9uXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImdyaWQtY29sdW1uOjEvLTE7Ym9yZGVyLXRvcDoxcHggc29saWQgdmFyKC0tY3YtYm9yZGVyKTtwYWRkaW5nLXRvcDoxNHB4O21hcmdpbi10b3A6NHB4O1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjZweDtcIj5BY2hpZXZlbWVudHM8L2xhYmVsPlxuICAgICAgICAgICAgICA8ZGl2IGlkPVwiZXhwLWFjaGlldmVtZW50cy1lZGl0b3ItbGlzdFwiPjwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDo2cHg7bWFyZ2luLXRvcDo2cHg7XCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJleHAtYWNoLW5ldy1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwiZmxleDoxO1wiXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQWRkIGFuIGFjaGlldmVtZW50IG9yIGJ1bGxldFx1MjAyNlwiXG4gICAgICAgICAgICAgICAgICAgIG9ua2V5ZG93bj1cImlmKGV2ZW50LmtleT09PSdFbnRlcicpe2V2ZW50LnByZXZlbnREZWZhdWx0KCk7X2FkZEV4cEFjaGlldmVtZW50KCk7fVwiIC8+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhY3Rpb24tYnRuIHNlY29uZGFyeVwiIG9uY2xpY2s9XCJfYWRkRXhwQWNoaWV2ZW1lbnQoKVwiPisgQWRkPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwiY2xvc2VFeHBlcmllbmNlTW9kYWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHByaW1hcnlcIiBvbmNsaWNrPVwic2F2ZU1hc3RlckV4cGVyaWVuY2UoKVwiPlNhdmU8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gU2tpbGwgYWRkIG1vZGFsIC0tPlxuICAgIDxkaXYgaWQ9XCJtYXN0ZXItc2tpbGwtbW9kYWwtb3ZlcmxheVwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLW1vZGFsPVwidHJ1ZVwiXG4gICAgICAgIGFyaWEtbGFiZWxsZWRieT1cIm1hc3Rlci1za2lsbC1tb2RhbC10aXRsZVwiIGNsYXNzPVwibW9kYWwtb3ZlcmxheVwiXG4gICAgICAgIG9uY2xpY2s9XCJpZihldmVudC50YXJnZXQ9PT10aGlzKWNsb3NlU2tpbGxNb2RhbCgpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWxcIiBzdHlsZT1cIm1heC13aWR0aDo0ODBweDtcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuICAgICAgICAgIDxoMiBpZD1cIm1hc3Rlci1za2lsbC1tb2RhbC10aXRsZVwiPkFkZCBTa2lsbDwvaDI+XG4gICAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPVwiY2xvc2VTa2lsbE1vZGFsKClcIiBhcmlhLWxhYmVsPVwiQ2xvc2Ugc2tpbGwgZWRpdG9yXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOm5vbmU7Zm9udC1zaXplOjEuNGVtO2N1cnNvcjpwb2ludGVyO2NvbG9yOiM2NDc0OGI7XCI+JnRpbWVzOzwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIiBzdHlsZT1cInBhZGRpbmc6MjBweDtcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImhpZGRlblwiIGlkPVwic2tpbGwtbW9kYWwtY2F0ZWdvcnlcIiAvPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJza2lsbC1tb2RhbC1pcy1mbGF0XCIgLz5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImhpZGRlblwiIGlkPVwic2tpbGwtbW9kYWwtb3JpZ2luYWwtbmFtZVwiIC8+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTRweDtcIiBpZD1cInNraWxsLWNhdGVnb3J5LXJvd1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cInNraWxsLWNhdGVnb3J5LWRpc3BsYXlcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkNhdGVnb3J5PC9sYWJlbD5cbiAgICAgICAgICAgIDxzcGFuIGlkPVwic2tpbGwtY2F0ZWdvcnktZGlzcGxheVwiIHN0eWxlPVwiZm9udC13ZWlnaHQ6NTAwO2NvbG9yOiMzMzQxNTU7XCI+PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwic2tpbGwtbmFtZS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+U2tpbGwgTmFtZSA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4qPC9zcGFuPjwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInNraWxsLW5hbWUtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgYXJpYS1yZXF1aXJlZD1cInRydWVcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBQeXRob25cIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwic2tpbGwtZXhwZXJpZW5jZXMtaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkFzc29jaWF0ZWQgRXhwZXJpZW5jZSBJRHMgKG9wdGlvbmFsKTwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInNraWxsLWV4cGVyaWVuY2VzLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIGV4cF8xMjMsIGV4cF80NTZcIiAvPlxuICAgICAgICAgICAgPHNtYWxsIHN0eWxlPVwiZGlzcGxheTpibG9jazttYXJnaW4tdG9wOjRweDtjb2xvcjojNjQ3NDhiO1wiPkNvbW1hLXNlcGFyYXRlZCBJRHMuIEEgc2tpbGwgY2FuIGJlIGxpbmtlZCB0byBtdWx0aXBsZSBleHBlcmllbmNlcy48L3NtYWxsPlxuICAgICAgICAgICAgPGRpdiBpZD1cInNraWxsLWV4cGVyaWVuY2UtaGludHNcIiBzdHlsZT1cIm1hcmdpbi10b3A6NnB4O2ZvbnQtc2l6ZTowLjhlbTtjb2xvcjojOTRhM2I4O1wiPjwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwic2tpbGwtYWxpYXNlcy1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+QWxpYXNlcyAoY29tbWEtc2VwYXJhdGVkLCBvcHRpb25hbCk8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJza2lsbC1hbGlhc2VzLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIEpTLCBFQ01BU2NyaXB0XCIgLz5cbiAgICAgICAgICAgIDxzbWFsbCBzdHlsZT1cImRpc3BsYXk6YmxvY2s7bWFyZ2luLXRvcDo0cHg7Y29sb3I6IzY0NzQ4YjtcIj5BbHRlcm5hdGUgbmFtZXMgYW4gQVRTIG9yIHJldmlld2VyIG1pZ2h0IHNlYXJjaCBmb3IuPC9zbWFsbD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cInNraWxsLXllYXJzLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5ZZWFycyBvZiBFeHBlcmllbmNlIChvcHRpb25hbCk8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cInNraWxsLXllYXJzLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMjBweDtcIiBtaW49XCIwXCIgc3RlcD1cIjAuNVwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwiY2xvc2VTa2lsbE1vZGFsKClcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBwcmltYXJ5XCIgaWQ9XCJtYXN0ZXItc2tpbGwtc2F2ZS1idG5cIiBvbmNsaWNrPVwic2F2ZU1hc3RlclNraWxsKClcIj5BZGQgU2tpbGw8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gRWR1Y2F0aW9uIG1vZGFsIC0tPlxuICAgIDxkaXYgaWQ9XCJtYXN0ZXItZWR1LW1vZGFsLW92ZXJsYXlcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1tb2RhbD1cInRydWVcIlxuICAgICAgICBhcmlhLWxhYmVsbGVkYnk9XCJtYXN0ZXItZWR1LW1vZGFsLXRpdGxlXCIgY2xhc3M9XCJtb2RhbC1vdmVybGF5XCJcbiAgICAgICAgb25jbGljaz1cImlmKGV2ZW50LnRhcmdldD09PXRoaXMpY2xvc2VFZHVjYXRpb25Nb2RhbCgpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWxcIiBzdHlsZT1cIm1heC13aWR0aDo1ODBweDtcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuICAgICAgICAgIDxoMiBpZD1cIm1hc3Rlci1lZHUtbW9kYWwtdGl0bGVcIj5FZHVjYXRpb248L2gyPlxuICAgICAgICAgIDxidXR0b24gb25jbGljaz1cImNsb3NlRWR1Y2F0aW9uTW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJDbG9zZSBlZHVjYXRpb24gZWRpdG9yXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOm5vbmU7Zm9udC1zaXplOjEuNGVtO2N1cnNvcjpwb2ludGVyO2NvbG9yOiM2NDc0OGI7XCI+JnRpbWVzOzwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIiBzdHlsZT1cInBhZGRpbmc6MjBweDtcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImhpZGRlblwiIGlkPVwiZWR1LW1vZGFsLWlkeFwiIHZhbHVlPVwiLTFcIiAvPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmdyaWQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmciAxZnI7Z2FwOjE0cHg7XCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZWR1LWRlZ3JlZS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+RGVncmVlIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPio8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJlZHUtZGVncmVlLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiIGFyaWEtcmVxdWlyZWQ9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBQaC5ELlwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJlZHUtZmllbGQtaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkZpZWxkIG9mIFN0dWR5PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJlZHUtZmllbGQtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBCaW9zdGF0aXN0aWNzXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImdyaWQtY29sdW1uOjEvLTE7XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJlZHUtaW5zdGl0dXRpb24taW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkluc3RpdHV0aW9uIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPio8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJlZHUtaW5zdGl0dXRpb24taW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgYXJpYS1yZXF1aXJlZD1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIFVuaXZlcnNpdHkgb2YgV2FzaGluZ3RvblwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJlZHUtY2l0eS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+Q2l0eTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZWR1LWNpdHktaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgcGxhY2Vob2xkZXI9XCJTZWF0dGxlXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImVkdS1zdGF0ZS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+U3RhdGU8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImVkdS1zdGF0ZS1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIiBwbGFjZWhvbGRlcj1cIldBXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImVkdS1zdGFydC15ZWFyLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5TdGFydCBZZWFyPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cImVkdS1zdGFydC15ZWFyLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiXG4gICAgICAgICAgICAgICAgICBtaW49XCIxOTUwXCIgbWF4PVwiMjA5OVwiIHBsYWNlaG9sZGVyPVwiMTk5NVwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJlZHUtZW5kLXllYXItaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkVuZCBZZWFyPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cImVkdS1lbmQteWVhci1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIlxuICAgICAgICAgICAgICAgICAgbWluPVwiMTk1MFwiIG1heD1cIjIwOTlcIiBwbGFjZWhvbGRlcj1cIjIwMDBcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwiY2xvc2VFZHVjYXRpb25Nb2RhbCgpXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG4gcHJpbWFyeVwiIG9uY2xpY2s9XCJzYXZlTWFzdGVyRWR1Y2F0aW9uKClcIj5TYXZlPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEF3YXJkIG1vZGFsIC0tPlxuICAgIDxkaXYgaWQ9XCJtYXN0ZXItYXdhcmQtbW9kYWwtb3ZlcmxheVwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLW1vZGFsPVwidHJ1ZVwiXG4gICAgICAgIGFyaWEtbGFiZWxsZWRieT1cIm1hc3Rlci1hd2FyZC1tb2RhbC10aXRsZVwiIGNsYXNzPVwibW9kYWwtb3ZlcmxheVwiXG4gICAgICAgIG9uY2xpY2s9XCJpZihldmVudC50YXJnZXQ9PT10aGlzKWNsb3NlQXdhcmRNb2RhbCgpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWxcIiBzdHlsZT1cIm1heC13aWR0aDo1ODBweDtcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuICAgICAgICAgIDxoMiBpZD1cIm1hc3Rlci1hd2FyZC1tb2RhbC10aXRsZVwiPkF3YXJkIC8gSG9ub3VyPC9oMj5cbiAgICAgICAgICA8YnV0dG9uIG9uY2xpY2s9XCJjbG9zZUF3YXJkTW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJDbG9zZSBhd2FyZCBlZGl0b3JcIlxuICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6bm9uZTtib3JkZXI6bm9uZTtmb250LXNpemU6MS40ZW07Y3Vyc29yOnBvaW50ZXI7Y29sb3I6IzY0NzQ4YjtcIj4mdGltZXM7PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiIHN0eWxlPVwicGFkZGluZzoyMHB4O1wiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJhd2FyZC1tb2RhbC1pZHhcIiB2YWx1ZT1cIi0xXCIgLz5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cImF3YXJkLXRpdGxlLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5UaXRsZSA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4qPC9zcGFuPjwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImF3YXJkLXRpdGxlLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiIGFyaWEtcmVxdWlyZWQ9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gRW1wbG95ZWUgb2YgdGhlIFllYXJcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwiYXdhcmQteWVhci1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+WWVhcjwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiYXdhcmQteWVhci1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwcHg7XCJcbiAgICAgICAgICAgICAgICBtaW49XCIxOTUwXCIgbWF4PVwiMjA5OVwiIHBsYWNlaG9sZGVyPVwiMjAyMlwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTRweDtcIj5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJhd2FyZC1kZXNjLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5EZXNjcmlwdGlvbjwvbGFiZWw+XG4gICAgICAgICAgICA8dGV4dGFyZWEgaWQ9XCJhd2FyZC1kZXNjLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgcm93cz1cIjNcIiBzdHlsZT1cIndpZHRoOjEwMCU7cmVzaXplOnZlcnRpY2FsO1wiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJCcmllZiBjb250ZXh0IG9yIGFjaGlldmVtZW50IGRlc2NyaXB0aW9uXCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cImF3YXJkLXJlbGV2YW50LWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5SZWxldmFudCBmb3IgKGNvbW1hLXNlcGFyYXRlZCk8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJhd2FyZC1yZWxldmFudC1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBsZWFkZXJzaGlwLCBwaGFybWFcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgb25jbGljaz1cImNsb3NlQXdhcmRNb2RhbCgpXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG4gcHJpbWFyeVwiIG9uY2xpY2s9XCJzYXZlTWFzdGVyQXdhcmQoKVwiPlNhdmU8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gQ2VydGlmaWNhdGlvbiBtb2RhbCAtLT5cbiAgICA8ZGl2IGlkPVwibWFzdGVyLWNlcnQtbW9kYWwtb3ZlcmxheVwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLW1vZGFsPVwidHJ1ZVwiXG4gICAgICAgIGFyaWEtbGFiZWxsZWRieT1cIm1hc3Rlci1jZXJ0LW1vZGFsLXRpdGxlXCIgY2xhc3M9XCJtb2RhbC1vdmVybGF5XCJcbiAgICAgICAgb25jbGljaz1cImlmKGV2ZW50LnRhcmdldD09PXRoaXMpY2xvc2VDZXJ0aWZpY2F0aW9uTW9kYWwoKVwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsXCIgc3R5bGU9XCJtYXgtd2lkdGg6NTAwcHg7XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cbiAgICAgICAgICA8aDIgaWQ9XCJtYXN0ZXItY2VydC1tb2RhbC10aXRsZVwiPkNlcnRpZmljYXRpb248L2gyPlxuICAgICAgICAgIDxidXR0b24gb25jbGljaz1cImNsb3NlQ2VydGlmaWNhdGlvbk1vZGFsKClcIiBhcmlhLWxhYmVsPVwiQ2xvc2UgY2VydGlmaWNhdGlvbiBlZGl0b3JcIlxuICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6bm9uZTtib3JkZXI6bm9uZTtmb250LXNpemU6MS40ZW07Y3Vyc29yOnBvaW50ZXI7Y29sb3I6IzY0NzQ4YjtcIj4mdGltZXM7PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiIHN0eWxlPVwicGFkZGluZzoyMHB4O1wiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJjZXJ0LW1vZGFsLWlkeFwiIHZhbHVlPVwiLTFcIiAvPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwiY2VydC1uYW1lLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5OYW1lIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPio8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiY2VydC1uYW1lLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiIGFyaWEtcmVxdWlyZWQ9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gQVdTIENlcnRpZmllZCBTb2x1dGlvbnMgQXJjaGl0ZWN0XCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNlcnQtaXNzdWVyLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5Jc3N1ZXI8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJjZXJ0LWlzc3Vlci1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBBbWF6b24gV2ViIFNlcnZpY2VzXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNlcnQteWVhci1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+WWVhcjwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiY2VydC15ZWFyLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDBweDtcIlxuICAgICAgICAgICAgICAgIG1pbj1cIjE5NTBcIiBtYXg9XCIyMDk5XCIgcGxhY2Vob2xkZXI9XCIyMDIzXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0blwiIG9uY2xpY2s9XCJjbG9zZUNlcnRpZmljYXRpb25Nb2RhbCgpXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG4gcHJpbWFyeVwiIG9uY2xpY2s9XCJzYXZlTWFzdGVyQ2VydGlmaWNhdGlvbigpXCI+U2F2ZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBBY2hpZXZlbWVudCBlZGl0IG1vZGFsIC0tPlxuICAgIDxkaXYgaWQ9XCJtYXN0ZXItYWNoLW1vZGFsLW92ZXJsYXlcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1tb2RhbD1cInRydWVcIlxuICAgICAgICBhcmlhLWxhYmVsbGVkYnk9XCJtYXN0ZXItYWNoLW1vZGFsLXRpdGxlXCIgY2xhc3M9XCJtb2RhbC1vdmVybGF5XCJcbiAgICAgICAgb25jbGljaz1cImlmKGV2ZW50LnRhcmdldD09PXRoaXMpY2xvc2VNYXN0ZXJBY2hNb2RhbCgpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWxcIiBzdHlsZT1cIm1heC13aWR0aDo2MDBweDtcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuICAgICAgICAgIDxoMiBpZD1cIm1hc3Rlci1hY2gtbW9kYWwtdGl0bGVcIj5BY2hpZXZlbWVudDwvaDI+XG4gICAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPVwiY2xvc2VNYXN0ZXJBY2hNb2RhbCgpXCIgYXJpYS1sYWJlbD1cIkNsb3NlIGFjaGlldmVtZW50IGVkaXRvclwiXG4gICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDpub25lO2JvcmRlcjpub25lO2ZvbnQtc2l6ZToxLjRlbTtjdXJzb3I6cG9pbnRlcjtjb2xvcjojNjQ3NDhiO1wiPiZ0aW1lczs8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCIgc3R5bGU9XCJwYWRkaW5nOjIwcHg7XCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBpZD1cImFjaC1tb2RhbC1pZFwiIC8+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTRweDtcIj5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJhY2gtbW9kYWwtdGl0bGUtaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPlRpdGxlIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPio8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiYWNoLW1vZGFsLXRpdGxlLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiIGFyaWEtcmVxdWlyZWQ9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gTGVkIDNcdTAwRDcgcmV2ZW51ZSBncm93dGggaW5pdGlhdGl2ZVwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTRweDtcIj5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJhY2gtbW9kYWwtZGVzYy1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+RGVzY3JpcHRpb248L2xhYmVsPlxuICAgICAgICAgICAgPHRleHRhcmVhIGlkPVwiYWNoLW1vZGFsLWRlc2MtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiByb3dzPVwiM1wiIHN0eWxlPVwid2lkdGg6MTAwJTtyZXNpemU6dmVydGljYWw7XCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIk9wdGlvbmFsIGRldGFpbCBvciBtZXRyaWNcIj48L3RleHRhcmVhPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwiYWNoLW1vZGFsLXJlbGV2YW50LWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5SZWxldmFudCBmb3IgKGNvbW1hLXNlcGFyYXRlZCByb2xlcy9kb21haW5zKTwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImFjaC1tb2RhbC1yZWxldmFudC1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBsZWFkZXJzaGlwLCBNTCBlbmdpbmVlcmluZywgZGF0YSBzY2llbmNlXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cImFjaC1tb2RhbC1pbXBvcnRhbmNlLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5JbXBvcnRhbmNlICgxXHUyMDEzMTApPC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJhY2gtbW9kYWwtaW1wb3J0YW5jZS1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6ODBweDtcIlxuICAgICAgICAgICAgICAgIG1pbj1cIjFcIiBtYXg9XCIxMFwiIHZhbHVlPVwiN1wiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwiY2xvc2VNYXN0ZXJBY2hNb2RhbCgpXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG4gcHJpbWFyeVwiIG9uY2xpY2s9XCJzYXZlTWFzdGVyQWNoaWV2ZW1lbnQoKVwiPlNhdmU8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gU3VtbWFyeSBlZGl0IG1vZGFsIC0tPlxuICAgIDxkaXYgaWQ9XCJtYXN0ZXItc3VtLW1vZGFsLW92ZXJsYXlcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1tb2RhbD1cInRydWVcIlxuICAgICAgICBhcmlhLWxhYmVsbGVkYnk9XCJtYXN0ZXItc3VtLW1vZGFsLXRpdGxlXCIgY2xhc3M9XCJtb2RhbC1vdmVybGF5XCJcbiAgICAgICAgb25jbGljaz1cImlmKGV2ZW50LnRhcmdldD09PXRoaXMpY2xvc2VNYXN0ZXJTdW1Nb2RhbCgpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWxcIiBzdHlsZT1cIm1heC13aWR0aDo2MDBweDtcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuICAgICAgICAgIDxoMiBpZD1cIm1hc3Rlci1zdW0tbW9kYWwtdGl0bGVcIj5Qcm9mZXNzaW9uYWwgU3VtbWFyeTwvaDI+XG4gICAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPVwiY2xvc2VNYXN0ZXJTdW1Nb2RhbCgpXCIgYXJpYS1sYWJlbD1cIkNsb3NlIHN1bW1hcnkgZWRpdG9yXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOm5vbmU7Zm9udC1zaXplOjEuNGVtO2N1cnNvcjpwb2ludGVyO2NvbG9yOiM2NDc0OGI7XCI+JnRpbWVzOzwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIiBzdHlsZT1cInBhZGRpbmc6MjBweDtcIj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cInN1bS1tb2RhbC1rZXktaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPktleS9uYW1lIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPio8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwic3VtLW1vZGFsLWtleS1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIiBhcmlhLXJlcXVpcmVkPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIG1sX2VuZ2luZWVyaW5nIG9yIGxlYWRlcnNoaXBcIiAvPlxuICAgICAgICAgICAgPHAgc3R5bGU9XCJmb250LXNpemU6MC44MmVtO2NvbG9yOiM2YjcyODA7bWFyZ2luOjRweCAwIDA7XCI+VXNlIGxvd2VyY2FzZV91bmRlcnNjb3JlIFx1MjAxNCB0aGlzIGlzIHRoZSBrZXkgdXNlZCBpbnRlcm5hbGx5IGFuZCBzaG93biBpbiB0aGUgU3VtbWFyeSBGb2N1cyBzdGVwLjwvcD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cInN1bS1tb2RhbC10ZXh0LWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5TdW1tYXJ5IHRleHQgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+Kjwvc3Bhbj48L2xhYmVsPlxuICAgICAgICAgICAgPHRleHRhcmVhIGlkPVwic3VtLW1vZGFsLXRleHQtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiByb3dzPVwiNVwiIHN0eWxlPVwid2lkdGg6MTAwJTtyZXNpemU6dmVydGljYWw7XCIgYXJpYS1yZXF1aXJlZD1cInRydWVcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiV3JpdGUgeW91ciBwcm9mZXNzaW9uYWwgc3VtbWFyeSB2YXJpYW50IGhlcmVcdTIwMjZcIj48L3RleHRhcmVhPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgb25jbGljaz1cImNsb3NlTWFzdGVyU3VtTW9kYWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHByaW1hcnlcIiBvbmNsaWNrPVwic2F2ZU1hc3RlclN1bW1hcnkoKVwiPlNhdmU8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYDtcbiAgLy8gRGlzYWJsZSB3cml0ZSBjb250cm9scyB3aGVuIHRoZSB3b3JrZmxvdyBwaGFzZSBkb2VzIG5vdCBwZXJtaXQgTWFzdGVyIENWIGVkaXRzLlxuICBpZiAoIWlzRWRpdGFibGUpIHtcbiAgICBjb25zdCBTQUZFX09OQ0xJQ0sgPSAvXihleHBvcnRNYXN0ZXJDVnx2YWxpZGF0ZVB1YmxpY2F0aW9uc0JpYnxvcGVuQmFja3VwSGlzdG9yeU1vZGFsfHJlc3RvcmVCYWNrdXB8b3BlbkZ1bGxEYXRhUHJldmlld01vZGFsKVxcKC87XG4gICAgY29udGVudC5xdWVyeVNlbGVjdG9yQWxsKCdidXR0b24nKS5mb3JFYWNoKGJ0biA9PiB7XG4gICAgICBjb25zdCBvbmNsaWNrID0gKGJ0bi5nZXRBdHRyaWJ1dGUoJ29uY2xpY2snKSB8fCAnJykudHJpbSgpO1xuICAgICAgaWYgKFNBRkVfT05DTElDSy50ZXN0KG9uY2xpY2spKSByZXR1cm47XG4gICAgICBidG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgYnRuLnN0eWxlLm9wYWNpdHkgPSAnMC40NSc7XG4gICAgICBidG4uc3R5bGUuY3Vyc29yID0gJ25vdC1hbGxvd2VkJztcbiAgICAgIGJ0bi5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgJ0VkaXRpbmcgbG9ja2VkIFx1MjAxNCBjb21wbGV0ZSB0aGUgY3VycmVudCBzdGFnZSB0byByZS1lbmFibGUnKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIExvYWQgcHVibGljYXRpb25zIGFzeW5jaHJvbm91c2x5IGFmdGVyIHRoZSBET00gaXMgcmVhZHkuXG4gIGxvYWRQdWJsaWNhdGlvbnMoKTtcbn1cblxuZnVuY3Rpb24gX3JlbmRlclBlcnNvbmFsSW5mb0NhcmQocGkpIHtcbiAgY29uc3QgY29udGFjdCA9IHBpLmNvbnRhY3QgfHwge307XG4gIGNvbnN0IGFkZHJlc3MgPSBjb250YWN0LmFkZHJlc3MgfHwge307XG4gIGNvbnN0IHJvd3MgPSBbXG4gICAgWydOYW1lJywgICAgICBwaS5uYW1lIHx8ICcnXSxcbiAgICBbJ1RpdGxlJywgICAgIHBpLnRpdGxlIHx8IHBpLmhlYWRsaW5lIHx8ICcnXSxcbiAgICBbJ0VtYWlsJywgICAgIGNvbnRhY3QuZW1haWwgfHwgcGkuZW1haWwgfHwgJyddLFxuICAgIFsnUGhvbmUnLCAgICAgY29udGFjdC5waG9uZSB8fCAnJ10sXG4gICAgWydMaW5rZWRJbicsICBjb250YWN0LmxpbmtlZGluIHx8ICcnXSxcbiAgICBbJ1dlYnNpdGUnLCAgIGNvbnRhY3Qud2Vic2l0ZSB8fCAnJ10sXG4gICAgWydMb2NhdGlvbicsICBbYWRkcmVzcy5jaXR5LCBhZGRyZXNzLnN0YXRlXS5maWx0ZXIoQm9vbGVhbikuam9pbignLCAnKV0sXG4gIF0uZmlsdGVyKChbLCB2XSkgPT4gdik7XG4gIGlmICghcm93cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gJzxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtwYWRkaW5nOjEycHggMDtcIj5ObyBwZXJzb25hbCBpbmZvcm1hdGlvbiBvbiBmaWxlLiBDbGljayBcIlx1MjcwRlx1RkUwRiBFZGl0XCIgYWJvdmUgdG8gYWRkIHlvdXIgZGV0YWlscy48L3A+JztcbiAgfVxuICByZXR1cm4gYDxkbCBjbGFzcz1cIm1hc3Rlci1pbmZvLWdyaWRcIj4ke3Jvd3MubWFwKChbbGFiZWwsIHZhbHVlXSkgPT5cbiAgICBgPGRpdiBjbGFzcz1cIm1hc3Rlci1pbmZvLXJvd1wiPjxkdD4ke2VzY2FwZUh0bWwobGFiZWwpfTwvZHQ+PGRkPiR7ZXNjYXBlSHRtbCh2YWx1ZSl9PC9kZD48L2Rpdj5gXG4gICkuam9pbignJyl9PC9kbD5gO1xufVxuXG5mdW5jdGlvbiBfcmVuZGVyRXhwZXJpZW5jZXNMaXN0KGV4cGVyaWVuY2VzKSB7XG4gIGlmICghZXhwZXJpZW5jZXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuICc8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7cGFkZGluZzoxMnB4IDA7XCI+Tm8gZXhwZXJpZW5jZSBlbnRyaWVzIHlldC4gQ2xpY2sgXCIrIEFkZCBFeHBlcmllbmNlXCIgYWJvdmUuPC9wPic7XG4gIH1cbiAgY29uc3Qgcm93cyA9IGV4cGVyaWVuY2VzLm1hcCgoZXhwLCBpZHgpID0+IHtcbiAgICBjb25zdCB0aXRsZSAgID0gZXNjYXBlSHRtbChleHAudGl0bGUgfHwgJycpO1xuICAgIGNvbnN0IGNvbXBhbnkgPSBlc2NhcGVIdG1sKGV4cC5jb21wYW55IHx8ICcnKTtcbiAgICBjb25zdCBsb2MgICAgID0gZXhwLmxvY2F0aW9uIHx8IHt9O1xuICAgIGNvbnN0IGxvY2F0aW9uID0gZXNjYXBlSHRtbChbbG9jLmNpdHksIGxvYy5zdGF0ZV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJywgJykpO1xuICAgIGNvbnN0IGRhdGVzICAgPSBlc2NhcGVIdG1sKFtleHAuc3RhcnRfZGF0ZSwgZXhwLmVuZF9kYXRlIHx8ICdQcmVzZW50J10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyBcdTIwMTMgJykpO1xuICAgIGNvbnN0IGFjaENvdW50ID0gKGV4cC5hY2hpZXZlbWVudHMgfHwgW10pLmxlbmd0aDtcbiAgICBjb25zdCBleHBJZCA9IGVzY2FwZUh0bWwoZXhwLmlkIHx8ICcnKTtcbiAgICByZXR1cm4gYFxuICAgICAgPHRyPlxuICAgICAgICA8dGQ+XG4gICAgICAgICAgPHN0cm9uZz4ke3RpdGxlfTwvc3Ryb25nPjxicj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiM0NzU1Njk7XCI+JHtjb21wYW55fTwvc3Bhbj5cbiAgICAgICAgICAke2xvY2F0aW9uID8gYDxzcGFuIHN0eWxlPVwiY29sb3I6Izk0YTNiODtmb250LXNpemU6MC44NWVtO1wiPiBcdTAwQjcgJHtsb2NhdGlvbn08L3NwYW4+YCA6ICcnfVxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2NvbG9yOiM0NzU1Njk7d2hpdGUtc3BhY2U6bm93cmFwO1wiPiR7ZGF0ZXN9PC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7Y29sb3I6Izk0YTNiODtmb250LXNpemU6MC44NWVtO1wiPiR7YWNoQ291bnR9PC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwiYWN0aW9uLWJ0bnNcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBvbmNsaWNrPVwiZWRpdE1hc3RlckV4cGVyaWVuY2UoJyR7ZXhwSWR9JylcIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiRWRpdCBleHBlcmllbmNlOiAke3RpdGxlfVwiIHRpdGxlPVwiRWRpdFwiPlx1MjcwRlx1RkUwRjwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIG9uY2xpY2s9XCJkZWxldGVNYXN0ZXJFeHBlcmllbmNlKCcke2VzY2FwZUh0bWwoZXhwLmlkIHx8ICcnKX0nLCAnJHt0aXRsZX0nKVwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJEZWxldGUgZXhwZXJpZW5jZTogJHt0aXRsZX1cIiB0aXRsZT1cIkRlbGV0ZVwiPlx1RDgzRFx1REREMVx1RkUwRjwvYnV0dG9uPlxuICAgICAgICA8L3RkPlxuICAgICAgPC90cj5gO1xuICB9KS5qb2luKCcnKTtcbiAgcmV0dXJuIGBcbiAgICA8dGFibGUgY2xhc3M9XCJyZXZpZXctdGFibGVcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCI+XG4gICAgICA8dGhlYWQ+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8dGg+Um9sZSAvIENvbXBhbnk8L3RoPlxuICAgICAgICAgIDx0aD5EYXRlczwvdGg+XG4gICAgICAgICAgPHRoIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7d2lkdGg6NjBweDtcIj5CdWxsZXRzPC90aD5cbiAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDo4MHB4O1wiPkFjdGlvbnM8L3RoPlxuICAgICAgICA8L3RyPlxuICAgICAgPC90aGVhZD5cbiAgICAgIDx0Ym9keT4ke3Jvd3N9PC90Ym9keT5cbiAgICA8L3RhYmxlPmA7XG59XG5cbmZ1bmN0aW9uIF9yZW5kZXJTa2lsbHNTZWN0aW9uKHNraWxscykge1xuICBjb25zdCBub3JtYWxpemVTa2lsbCA9IChzKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBzID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHsgbmFtZTogcywgZXhwZXJpZW5jZXM6IFtdIH07XG4gICAgfVxuICAgIGlmIChzICYmIHR5cGVvZiBzID09PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogcy5uYW1lIHx8ICcnLFxuICAgICAgICBleHBlcmllbmNlczogQXJyYXkuaXNBcnJheShzLmV4cGVyaWVuY2VzKSA/IHMuZXhwZXJpZW5jZXMgOiBbXSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7IG5hbWU6IFN0cmluZyhzIHx8ICcnKSwgZXhwZXJpZW5jZXM6IFtdIH07XG4gIH07XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoc2tpbGxzKSkge1xuICAgIGlmICghc2tpbGxzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuICc8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7cGFkZGluZzoxMnB4IDA7XCI+Tm8gc2tpbGxzIG9uIGZpbGUuIENsaWNrIFwiKyBBZGQgU2tpbGxcIiBhYm92ZS48L3A+JztcbiAgICB9XG4gICAgY29uc3QgY2hpcHMgPSBza2lsbHMubWFwKHMgPT4ge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZVNraWxsKHMpO1xuICAgICAgY29uc3QgbmFtZSA9IGVzY2FwZUh0bWwobm9ybWFsaXplZC5uYW1lKTtcbiAgICAgIGNvbnN0IHJhdyA9IGVzY2FwZUh0bWwobm9ybWFsaXplZC5uYW1lKTtcbiAgICAgIGNvbnN0IGJhZGdlID0gbm9ybWFsaXplZC5leHBlcmllbmNlcy5sZW5ndGhcbiAgICAgICAgPyBgPHNtYWxsIHN0eWxlPVwiY29sb3I6IzY0NzQ4YjttYXJnaW4tbGVmdDo2cHg7XCI+KCR7bm9ybWFsaXplZC5leHBlcmllbmNlcy5sZW5ndGh9IGV4cCk8L3NtYWxsPmBcbiAgICAgICAgOiAnJztcbiAgICAgIGNvbnN0IHNraWxsSnNvbiA9IGVzY2FwZUh0bWwoSlNPTi5zdHJpbmdpZnkoeyBuYW1lOiBub3JtYWxpemVkLm5hbWUsIGV4cGVyaWVuY2VzOiBub3JtYWxpemVkLmV4cGVyaWVuY2VzIH0pKTtcbiAgICAgIHJldHVybiBgPHNwYW4gY2xhc3M9XCJza2lsbC1jaGlwXCI+JHtuYW1lfSR7YmFkZ2V9PGJ1dHRvbiBjbGFzcz1cInNraWxsLWNoaXAtZGVsXCIgb25jbGljaz1cImVkaXRNYXN0ZXJTa2lsbCgke3NraWxsSnNvbn0sICcnLCB0cnVlKVwiIGFyaWEtbGFiZWw9XCJFZGl0IHNraWxsICR7bmFtZX1cIiB0aXRsZT1cIkVkaXRcIj5cdTI3MEZcdUZFMEY8L2J1dHRvbj48YnV0dG9uIGNsYXNzPVwic2tpbGwtY2hpcC1kZWxcIiBvbmNsaWNrPVwiZGVsZXRlTWFzdGVyU2tpbGwoJyR7cmF3fScsICcnLCB0cnVlKVwiIGFyaWEtbGFiZWw9XCJSZW1vdmUgc2tpbGwgJHtuYW1lfVwiIHRpdGxlPVwiUmVtb3ZlXCI+XHUwMEQ3PC9idXR0b24+PC9zcGFuPmA7XG4gICAgfSkuam9pbignJyk7XG4gICAgcmV0dXJuIGA8ZGl2IGNsYXNzPVwic2tpbGwtY2hpcHMtY29udGFpbmVyXCI+JHtjaGlwc308L2Rpdj5gO1xuICB9XG4gIGlmICh0eXBlb2Ygc2tpbGxzID09PSAnb2JqZWN0JyAmJiBza2lsbHMgIT09IG51bGwpIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoc2tpbGxzKTtcbiAgICBpZiAoIWtleXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gJzxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtwYWRkaW5nOjEycHggMDtcIj5ObyBza2lsbCBjYXRlZ29yaWVzIG9uIGZpbGUuPC9wPic7XG4gICAgfVxuICAgIHJldHVybiBrZXlzLm1hcChjYXRLZXkgPT4ge1xuICAgICAgY29uc3QgY2F0VmFsICA9IHNraWxsc1tjYXRLZXldO1xuICAgICAgY29uc3QgY2F0TmFtZSAgPSB0eXBlb2YgY2F0VmFsID09PSAnb2JqZWN0JyAmJiBjYXRWYWwuY2F0ZWdvcnkgPyBjYXRWYWwuY2F0ZWdvcnkgOiBjYXRLZXk7XG4gICAgICBjb25zdCBjYXRMaXN0ICA9IEFycmF5LmlzQXJyYXkoY2F0VmFsKSA/IGNhdFZhbFxuICAgICAgICAgICAgICAgICAgICAgOiBBcnJheS5pc0FycmF5KGNhdFZhbD8uc2tpbGxzKSA/IGNhdFZhbC5za2lsbHMgOiBbXTtcbiAgICAgIGNvbnN0IGNoaXBzICAgPSBjYXRMaXN0Lm1hcChzID0+IHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZVNraWxsKHMpO1xuICAgICAgICBjb25zdCBuYW1lID0gZXNjYXBlSHRtbChub3JtYWxpemVkLm5hbWUpO1xuICAgICAgICBjb25zdCBiYWRnZSA9IG5vcm1hbGl6ZWQuZXhwZXJpZW5jZXMubGVuZ3RoXG4gICAgICAgICAgPyBgPHNtYWxsIHN0eWxlPVwiY29sb3I6IzY0NzQ4YjttYXJnaW4tbGVmdDo2cHg7XCI+KCR7bm9ybWFsaXplZC5leHBlcmllbmNlcy5sZW5ndGh9IGV4cCk8L3NtYWxsPmBcbiAgICAgICAgICA6ICcnO1xuICAgICAgICBjb25zdCBza2lsbEpzb24gPSBlc2NhcGVIdG1sKEpTT04uc3RyaW5naWZ5KHsgbmFtZTogbm9ybWFsaXplZC5uYW1lLCBleHBlcmllbmNlczogbm9ybWFsaXplZC5leHBlcmllbmNlcyB9KSk7XG4gICAgICAgIHJldHVybiBgPHNwYW4gY2xhc3M9XCJza2lsbC1jaGlwXCI+JHtuYW1lfSR7YmFkZ2V9PGJ1dHRvbiBjbGFzcz1cInNraWxsLWNoaXAtZGVsXCIgb25jbGljaz1cImVkaXRNYXN0ZXJTa2lsbCgke3NraWxsSnNvbn0sICcke2VzY2FwZUh0bWwoY2F0S2V5KX0nLCBmYWxzZSlcIiBhcmlhLWxhYmVsPVwiRWRpdCAke25hbWV9XCIgdGl0bGU9XCJFZGl0XCI+XHUyNzBGXHVGRTBGPC9idXR0b24+PGJ1dHRvbiBjbGFzcz1cInNraWxsLWNoaXAtZGVsXCIgb25jbGljaz1cImRlbGV0ZU1hc3RlclNraWxsKCcke25hbWV9JywgJyR7ZXNjYXBlSHRtbChjYXRLZXkpfScsIGZhbHNlKVwiIGFyaWEtbGFiZWw9XCJSZW1vdmUgJHtuYW1lfVwiIHRpdGxlPVwiUmVtb3ZlXCI+XHUwMEQ3PC9idXR0b24+PC9zcGFuPmA7XG4gICAgICB9KS5qb2luKCcnKTtcbiAgICAgIGNvbnN0IGNhdEtleUVzYyAgPSBlc2NhcGVIdG1sKGNhdEtleSk7XG4gICAgICBjb25zdCBjYXROYW1lRXNjID0gZXNjYXBlSHRtbChjYXROYW1lKTtcbiAgICAgIHJldHVybiBgXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc2tpbGwtY2F0ZWdvcnlcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXNraWxsLWNhdC1oZWFkZXJcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWFzdGVyLXNraWxsLWNhdC1uYW1lXCI+JHtjYXROYW1lRXNjfTwvc3Bhbj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuLXNtXCIgb25jbGljaz1cInNob3dBZGRTa2lsbE1vZGFsKCcke2NhdEtleUVzY30nLCBmYWxzZSlcIlxuICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJBZGQgc2tpbGwgdG8gJHtjYXROYW1lRXNjfVwiPisgQWRkPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNraWxsLWNoaXBzLWNvbnRhaW5lclwiPiR7Y2hpcHMgfHwgJzxzcGFuIHN0eWxlPVwiY29sb3I6Izk0YTNiODtmb250LXNpemU6MC44NWVtO1wiPk5vIHNraWxscyBpbiB0aGlzIGNhdGVnb3J5PC9zcGFuPid9PC9kaXY+XG4gICAgICAgIDwvZGl2PmA7XG4gICAgfSkuam9pbignJyk7XG4gIH1cbiAgcmV0dXJuICc8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7XCI+U2tpbGxzIGRhdGEgZm9ybWF0IG5vdCByZWNvZ25pc2VkLjwvcD4nO1xufVxuXG5mdW5jdGlvbiBfcmVuZGVyRWR1Y2F0aW9uTGlzdChlZHVjYXRpb24pIHtcbiAgaWYgKCFlZHVjYXRpb24ubGVuZ3RoKSB7XG4gICAgcmV0dXJuICc8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7cGFkZGluZzoxMnB4IDA7XCI+Tm8gZWR1Y2F0aW9uIGVudHJpZXMgeWV0LiBDbGljayBcIisgQWRkIEVkdWNhdGlvblwiIGFib3ZlLjwvcD4nO1xuICB9XG4gIGNvbnN0IHJvd3MgPSBlZHVjYXRpb24ubWFwKChlZHUsIGlkeCkgPT4ge1xuICAgIGNvbnN0IGRlZ3JlZSAgICAgID0gZXNjYXBlSHRtbChlZHUuZGVncmVlIHx8ICcnKTtcbiAgICBjb25zdCBmaWVsZCAgICAgICA9IGVzY2FwZUh0bWwoZWR1LmZpZWxkIHx8ICcnKTtcbiAgICBjb25zdCBpbnN0aXR1dGlvbiA9IGVzY2FwZUh0bWwoZWR1Lmluc3RpdHV0aW9uIHx8ICcnKTtcbiAgICBjb25zdCBsb2MgICAgICAgICA9IGVkdS5sb2NhdGlvbiB8fCB7fTtcbiAgICBjb25zdCBsb2NhdGlvbiAgICA9IGVzY2FwZUh0bWwoW2xvYy5jaXR5LCBsb2Muc3RhdGVdLmZpbHRlcihCb29sZWFuKS5qb2luKCcsICcpKTtcbiAgICBjb25zdCB5ZWFycyAgICAgICA9IFtlZHUuc3RhcnRfeWVhciwgZWR1LmVuZF95ZWFyXS5maWx0ZXIoQm9vbGVhbikuam9pbignXHUyMDEzJyk7XG4gICAgY29uc3QgZWR1SnNvbiA9IGVzY2FwZUh0bWwoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZGVncmVlOiBlZHUuZGVncmVlIHx8ICcnLCBmaWVsZDogZWR1LmZpZWxkIHx8ICcnLCBpbnN0aXR1dGlvbjogZWR1Lmluc3RpdHV0aW9uIHx8ICcnLFxuICAgICAgY2l0eTogbG9jLmNpdHkgfHwgJycsIHN0YXRlOiBsb2Muc3RhdGUgfHwgJycsXG4gICAgICBzdGFydF95ZWFyOiBlZHUuc3RhcnRfeWVhciB8fCAnJywgZW5kX3llYXI6IGVkdS5lbmRfeWVhciB8fCAnJyxcbiAgICB9KSk7XG4gICAgcmV0dXJuIGBcbiAgICAgIDx0cj5cbiAgICAgICAgPHRkPlxuICAgICAgICAgIDxzdHJvbmc+JHtkZWdyZWV9JHtmaWVsZCA/IGAsICR7ZmllbGR9YCA6ICcnfTwvc3Ryb25nPjxicj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiM0NzU1Njk7XCI+JHtpbnN0aXR1dGlvbn08L3NwYW4+XG4gICAgICAgICAgJHtsb2NhdGlvbiA/IGA8c3BhbiBzdHlsZT1cImNvbG9yOiM5NGEzYjg7Zm9udC1zaXplOjAuODVlbTtcIj4gXHUwMEI3ICR7bG9jYXRpb259PC9zcGFuPmAgOiAnJ31cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtjb2xvcjojNDc1NTY5O3doaXRlLXNwYWNlOm5vd3JhcDtcIj4ke3llYXJzIHx8ICdcdTIwMTQnfTwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cImFjdGlvbi1idG5zXCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgb25jbGljaz1cImVkaXRNYXN0ZXJFZHVjYXRpb24oJHtlZHVKc29ufSwgJHtpZHh9KVwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJFZGl0IGVkdWNhdGlvbjogJHtpbnN0aXR1dGlvbn1cIiB0aXRsZT1cIkVkaXRcIj5cdTI3MEZcdUZFMEY8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBvbmNsaWNrPVwiZGVsZXRlTWFzdGVyRWR1Y2F0aW9uKCR7aWR4fSwgJyR7aW5zdGl0dXRpb259JylcIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiRGVsZXRlIGVkdWNhdGlvbjogJHtpbnN0aXR1dGlvbn1cIiB0aXRsZT1cIkRlbGV0ZVwiPlx1RDgzRFx1REREMVx1RkUwRjwvYnV0dG9uPlxuICAgICAgICA8L3RkPlxuICAgICAgPC90cj5gO1xuICB9KS5qb2luKCcnKTtcbiAgcmV0dXJuIGBcbiAgICA8dGFibGUgY2xhc3M9XCJyZXZpZXctdGFibGVcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCI+XG4gICAgICA8dGhlYWQ+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8dGg+RGVncmVlIC8gSW5zdGl0dXRpb248L3RoPlxuICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOjEwMHB4O1wiPlllYXJzPC90aD5cbiAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDo4MHB4O1wiPkFjdGlvbnM8L3RoPlxuICAgICAgICA8L3RyPlxuICAgICAgPC90aGVhZD5cbiAgICAgIDx0Ym9keT4ke3Jvd3N9PC90Ym9keT5cbiAgICA8L3RhYmxlPmA7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUHVibGljYXRpb25zIFx1MjAxNCBDUlVEICsgcmF3IEJpYlRlWCB0b2dnbGVcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogQ3VycmVudCB2aWV3IG1vZGU6ICdjcnVkJyB8ICdyYXcnICovXG5sZXQgX3B1YlZpZXdNb2RlID0gJ2NydWQnO1xubGV0IF9wdWJTb3J0TW9kZSA9ICd5ZWFyX2Rlc2MnO1xubGV0IF9wdWJHcm91cE1vZGUgPSAnbm9uZSc7XG4vKiogVHJ1ZSB3aGVuIHRoZSBlbnRyeSBiZWluZyBlZGl0ZWQgaGFkIGFuIGBlZGl0b3JgIGZpZWxkIGJ1dCBubyBgYXV0aG9yYC4gKi9cbmxldCBfcHViTW9kYWxVc2VzRWRpdG9yRmllbGQgPSBmYWxzZTtcblxuZnVuY3Rpb24gdG9nZ2xlUHVibGljYXRpb25zVmlldygpIHtcbiAgX3B1YlZpZXdNb2RlID0gX3B1YlZpZXdNb2RlID09PSAnY3J1ZCcgPyAncmF3JyA6ICdjcnVkJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItY3J1ZC12aWV3Jykuc3R5bGUuZGlzcGxheSA9IF9wdWJWaWV3TW9kZSA9PT0gJ2NydWQnID8gJycgOiAnbm9uZSc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLXJhdy12aWV3Jykuc3R5bGUuZGlzcGxheSAgPSBfcHViVmlld01vZGUgPT09ICdyYXcnICA/ICcnIDogJ25vbmUnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1hZGQtYnRuJykuc3R5bGUuZGlzcGxheSAgID0gX3B1YlZpZXdNb2RlID09PSAnY3J1ZCcgPyAnJyA6ICdub25lJztcbiAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItdG9nZ2xlLWJ0bicpO1xuICBpZiAoYnRuKSBidG4udGV4dENvbnRlbnQgPSBfcHViVmlld01vZGUgPT09ICdjcnVkJyA/ICdcdTI3MEZcdUZFMEYgUmF3IEJpYlRlWCcgOiAnXHVEODNEXHVEQ0NCIFN0cnVjdHVyZWQgVmlldyc7XG4gIGlmIChfcHViVmlld01vZGUgPT09ICdyYXcnKSBsb2FkUHVibGljYXRpb25zQmliKCk7XG59XG5cbi8qKiBMb2FkIGJvdGggc3RydWN0dXJlZCBsaXN0IGFuZCByYXcgY29udGVudCBmcm9tIGEgc2luZ2xlIEFQSSBjYWxsLiAqL1xuYXN5bmMgZnVuY3Rpb24gbG9hZFB1YmxpY2F0aW9ucygpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvcHVibGljYXRpb25zJyk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEub2spIHtcbiAgICAgIF9yZW5kZXJQdWJsaWNhdGlvbnNDcnVkTGlzdChkYXRhLnB1YmxpY2F0aW9ucyB8fCBbXSk7XG4gICAgICBjb25zdCB0YSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLXRleHRhcmVhJyk7XG4gICAgICBpZiAodGEpIHRhLnZhbHVlID0gZGF0YS5jb250ZW50IHx8ICcnO1xuICAgICAgX3VwZGF0ZVB1YkNvdW50KGRhdGEuY291bnQgPz8gMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNydWQtY29udGFpbmVyJykuaW5uZXJIVE1MID1cbiAgICAgICAgYDxwIHN0eWxlPVwiY29sb3I6I2VmNDQ0NDtwYWRkaW5nOjEycHggMDtcIj5cdTI2QTBcdUZFMEYgJHtlc2NhcGVIdG1sKGRhdGEuZXJyb3IgfHwgJ0ZhaWxlZCB0byBsb2FkJyl9PC9wPmA7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1jcnVkLWNvbnRhaW5lcicpLmlubmVySFRNTCA9XG4gICAgICBgPHAgc3R5bGU9XCJjb2xvcjojZWY0NDQ0O3BhZGRpbmc6MTJweCAwO1wiPlx1MjZBMFx1RkUwRiBGYWlsZWQgdG8gbG9hZDogJHtlc2NhcGVIdG1sKGVyci5tZXNzYWdlKX08L3A+YDtcbiAgfVxufVxuXG4vKiogUmVsb2FkIG9ubHkgdGhlIHJhdyB0ZXh0YXJlYSBjb250ZW50IChjYWxsZWQgd2hlbiBzd2l0Y2hpbmcgdG8gcmF3IHZpZXcpLiAqL1xuYXN5bmMgZnVuY3Rpb24gbG9hZFB1YmxpY2F0aW9uc0JpYigpIHtcbiAgY29uc3QgdGEgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItdGV4dGFyZWEnKTtcbiAgY29uc3Qgc3RhdHVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItc3RhdHVzJyk7XG4gIGlmICghdGEpIHJldHVybjtcbiAgdGEuZGlzYWJsZWQgICAgPSB0cnVlO1xuICB0YS5wbGFjZWhvbGRlciA9ICdMb2FkaW5nXHUyMDI2JztcbiAgaWYgKHN0YXR1cykgc3RhdHVzLnRleHRDb250ZW50ID0gJyc7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL3B1YmxpY2F0aW9ucycpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICB0YS52YWx1ZSA9IGRhdGEuY29udGVudCB8fCAnJztcbiAgICAgIF91cGRhdGVQdWJDb3VudChkYXRhLmNvdW50ID8/IDApO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc3RhdHVzKSBzdGF0dXMudGV4dENvbnRlbnQgPSAnXHUyNkEwXHVGRTBGICcgKyAoZGF0YS5lcnJvciB8fCAnRmFpbGVkIHRvIGxvYWQnKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChzdGF0dXMpIHN0YXR1cy50ZXh0Q29udGVudCA9ICdcdTI2QTBcdUZFMEYgRmFpbGVkIHRvIGxvYWQ6ICcgKyBlcnIubWVzc2FnZTtcbiAgfSBmaW5hbGx5IHtcbiAgICB0YS5kaXNhYmxlZCAgICA9IGZhbHNlO1xuICAgIHRhLnBsYWNlaG9sZGVyID0gJyc7XG4gIH1cbn1cblxuZnVuY3Rpb24gX3VwZGF0ZVB1YkNvdW50KG4pIHtcbiAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1jb3VudCcpO1xuICBpZiAoZWwpIGVsLnRleHRDb250ZW50ID0gYCR7bn0gcHVibGljYXRpb24ke24gIT09IDEgPyAncycgOiAnJ30gb24gZmlsZWA7XG59XG5cbmZ1bmN0aW9uIF9zZXRQdWJsaWNhdGlvblN0YXR1cyhlbGVtZW50SWQsIHRleHQsIGNvbG9yID0gJyM2YjcyODAnKSB7XG4gIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbWVudElkKTtcbiAgaWYgKCFlbCkgcmV0dXJuO1xuICBlbC50ZXh0Q29udGVudCA9IHRleHQ7XG4gIGVsLnN0eWxlLmNvbG9yID0gY29sb3I7XG59XG5cbmZ1bmN0aW9uIHNldFB1YmxpY2F0aW9uU29ydE1vZGUobW9kZSkge1xuICBfcHViU29ydE1vZGUgPSBtb2RlIHx8ICd5ZWFyX2Rlc2MnO1xuICB2b2lkIGxvYWRQdWJsaWNhdGlvbnMoKTtcbn1cblxuZnVuY3Rpb24gc2V0UHVibGljYXRpb25Hcm91cE1vZGUobW9kZSkge1xuICBfcHViR3JvdXBNb2RlID0gbW9kZSB8fCAnbm9uZSc7XG4gIHZvaWQgbG9hZFB1YmxpY2F0aW9ucygpO1xufVxuXG5mdW5jdGlvbiBfZ2V0UHVibGljYXRpb25ZZWFyKHB1Yikge1xuICBjb25zdCByYXdZZWFyID0gcHViPy5maWVsZHM/LnllYXIgPz8gcHViPy55ZWFyID8/ICcnO1xuICBjb25zdCBtYXRjaCA9IFN0cmluZyhyYXdZZWFyKS5tYXRjaCgvXFxkezR9Lyk7XG4gIHJldHVybiBtYXRjaCA/IE51bWJlcihtYXRjaFswXSkgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBfY29tcGFyZVB1YmxpY2F0aW9ucyhsZWZ0LCByaWdodCkge1xuICBjb25zdCBsZWZ0WWVhciA9IF9nZXRQdWJsaWNhdGlvblllYXIobGVmdCkgPz8gLUluZmluaXR5O1xuICBjb25zdCByaWdodFllYXIgPSBfZ2V0UHVibGljYXRpb25ZZWFyKHJpZ2h0KSA/PyAtSW5maW5pdHk7XG4gIGNvbnN0IGxlZnRUeXBlID0gU3RyaW5nKGxlZnQ/LnR5cGUgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IHJpZ2h0VHlwZSA9IFN0cmluZyhyaWdodD8udHlwZSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgbGVmdEtleSA9IFN0cmluZyhsZWZ0Py5rZXkgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IHJpZ2h0S2V5ID0gU3RyaW5nKHJpZ2h0Py5rZXkgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG5cbiAgc3dpdGNoIChfcHViU29ydE1vZGUpIHtcbiAgICBjYXNlICd5ZWFyX2FzYyc6XG4gICAgICByZXR1cm4gKGxlZnRZZWFyIC0gcmlnaHRZZWFyKSB8fCBsZWZ0VHlwZS5sb2NhbGVDb21wYXJlKHJpZ2h0VHlwZSkgfHwgbGVmdEtleS5sb2NhbGVDb21wYXJlKHJpZ2h0S2V5KTtcbiAgICBjYXNlICd0eXBlX2FzYyc6XG4gICAgICByZXR1cm4gbGVmdFR5cGUubG9jYWxlQ29tcGFyZShyaWdodFR5cGUpIHx8IChyaWdodFllYXIgLSBsZWZ0WWVhcikgfHwgbGVmdEtleS5sb2NhbGVDb21wYXJlKHJpZ2h0S2V5KTtcbiAgICBjYXNlICd0eXBlX2Rlc2MnOlxuICAgICAgcmV0dXJuIHJpZ2h0VHlwZS5sb2NhbGVDb21wYXJlKGxlZnRUeXBlKSB8fCAocmlnaHRZZWFyIC0gbGVmdFllYXIpIHx8IGxlZnRLZXkubG9jYWxlQ29tcGFyZShyaWdodEtleSk7XG4gICAgY2FzZSAneWVhcl9kZXNjJzpcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIChyaWdodFllYXIgLSBsZWZ0WWVhcikgfHwgbGVmdFR5cGUubG9jYWxlQ29tcGFyZShyaWdodFR5cGUpIHx8IGxlZnRLZXkubG9jYWxlQ29tcGFyZShyaWdodEtleSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2dyb3VwUHVibGljYXRpb25MYWJlbChwdWIpIHtcbiAgaWYgKF9wdWJHcm91cE1vZGUgPT09ICd5ZWFyJykge1xuICAgIHJldHVybiBTdHJpbmcoX2dldFB1YmxpY2F0aW9uWWVhcihwdWIpID8/ICdVbmtub3duIHllYXInKTtcbiAgfVxuICBpZiAoX3B1Ykdyb3VwTW9kZSA9PT0gJ3R5cGUnKSB7XG4gICAgcmV0dXJuIHB1Yj8udHlwZSA/IFN0cmluZyhwdWIudHlwZSkgOiAnVW5rbm93biB0eXBlJztcbiAgfVxuICByZXR1cm4gJ1B1YmxpY2F0aW9ucyc7XG59XG5cbmZ1bmN0aW9uIF9yZW5kZXJQdWJsaWNhdGlvbnNDcnVkTGlzdChwdWJzKSB7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNydWQtY29udGFpbmVyJyk7XG4gIGlmICghY29udGFpbmVyKSByZXR1cm47XG4gIGNvbnN0IGNvbnRyb2xzSHRtbCA9IGBcbiAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2ZsZXgtd3JhcDp3cmFwO2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTJweDttYXJnaW4tYm90dG9tOjEycHg7XCI+XG4gICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDo2cHg7Y29sb3I6IzQ3NTU2OTtmb250LXNpemU6MC45ZW07XCI+XG4gICAgICAgIFNvcnRcbiAgICAgICAgPHNlbGVjdCBpZD1cIm1hc3Rlci1wdWItc29ydC1zZWxlY3RcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOmF1dG87bWluLXdpZHRoOjE1MHB4O1wiIG9uY2hhbmdlPVwic2V0UHVibGljYXRpb25Tb3J0TW9kZSh0aGlzLnZhbHVlKVwiPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ5ZWFyX2Rlc2NcIiAke19wdWJTb3J0TW9kZSA9PT0gJ3llYXJfZGVzYycgPyAnc2VsZWN0ZWQnIDogJyd9PlllYXIgbmV3ZXN0IGZpcnN0PC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInllYXJfYXNjXCIgJHtfcHViU29ydE1vZGUgPT09ICd5ZWFyX2FzYycgPyAnc2VsZWN0ZWQnIDogJyd9PlllYXIgb2xkZXN0IGZpcnN0PC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInR5cGVfYXNjXCIgJHtfcHViU29ydE1vZGUgPT09ICd0eXBlX2FzYycgPyAnc2VsZWN0ZWQnIDogJyd9PlR5cGUgQVx1MjAxM1o8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwidHlwZV9kZXNjXCIgJHtfcHViU29ydE1vZGUgPT09ICd0eXBlX2Rlc2MnID8gJ3NlbGVjdGVkJyA6ICcnfT5UeXBlIFpcdTIwMTNBPC9vcHRpb24+XG4gICAgICAgIDwvc2VsZWN0PlxuICAgICAgPC9sYWJlbD5cbiAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjZweDtjb2xvcjojNDc1NTY5O2ZvbnQtc2l6ZTowLjllbTtcIj5cbiAgICAgICAgR3JvdXBcbiAgICAgICAgPHNlbGVjdCBpZD1cIm1hc3Rlci1wdWItZ3JvdXAtc2VsZWN0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDphdXRvO21pbi13aWR0aDoxNDBweDtcIiBvbmNoYW5nZT1cInNldFB1YmxpY2F0aW9uR3JvdXBNb2RlKHRoaXMudmFsdWUpXCI+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIm5vbmVcIiAke19wdWJHcm91cE1vZGUgPT09ICdub25lJyA/ICdzZWxlY3RlZCcgOiAnJ30+Tm8gZ3JvdXBpbmc8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwieWVhclwiICR7X3B1Ykdyb3VwTW9kZSA9PT0gJ3llYXInID8gJ3NlbGVjdGVkJyA6ICcnfT5CeSB5ZWFyPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInR5cGVcIiAke19wdWJHcm91cE1vZGUgPT09ICd0eXBlJyA/ICdzZWxlY3RlZCcgOiAnJ30+QnkgdHlwZTwvb3B0aW9uPlxuICAgICAgICA8L3NlbGVjdD5cbiAgICAgIDwvbGFiZWw+XG4gICAgPC9kaXY+YDtcbiAgaWYgKCFwdWJzLmxlbmd0aCkge1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBgJHtjb250cm9sc0h0bWx9PHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO3BhZGRpbmc6MTJweCAwO1wiPk5vIHB1YmxpY2F0aW9ucyBvbiBmaWxlLiBDbGljayBcIisgQWRkIFB1YmxpY2F0aW9uXCIgYWJvdmUsIG9yIHN3aXRjaCB0byBSYXcgQmliVGVYIHRvIHBhc3RlL2ltcG9ydCBlbnRyaWVzLjwvcD5gO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBzb3J0ZWQgPSBbLi4ucHVic10uc29ydChfY29tcGFyZVB1YmxpY2F0aW9ucyk7XG4gIGNvbnN0IGdyb3VwcyA9IFtdO1xuICBmb3IgKGNvbnN0IHB1YiBvZiBzb3J0ZWQpIHtcbiAgICBjb25zdCBsYWJlbCA9IF9ncm91cFB1YmxpY2F0aW9uTGFiZWwocHViKTtcbiAgICBsZXQgZ3JvdXAgPSBncm91cHMuZmluZCgoZW50cnkpID0+IGVudHJ5LmxhYmVsID09PSBsYWJlbCk7XG4gICAgaWYgKCFncm91cCkge1xuICAgICAgZ3JvdXAgPSB7IGxhYmVsLCBpdGVtczogW10gfTtcbiAgICAgIGdyb3Vwcy5wdXNoKGdyb3VwKTtcbiAgICB9XG4gICAgZ3JvdXAuaXRlbXMucHVzaChwdWIpO1xuICB9XG4gIGNvbnN0IHNlY3Rpb25IdG1sID0gZ3JvdXBzLm1hcCgoeyBsYWJlbCwgaXRlbXMgfSkgPT4ge1xuICAgIGNvbnN0IGhlYWRpbmdIdG1sID0gX3B1Ykdyb3VwTW9kZSA9PT0gJ25vbmUnXG4gICAgICA/ICcnXG4gICAgICA6IGA8ZGl2IHN0eWxlPVwibWFyZ2luOjE2cHggMCA4cHg7Zm9udC1zaXplOjAuOWVtO2ZvbnQtd2VpZ2h0OjcwMDtjb2xvcjojMzM0MTU1O1wiPiR7ZXNjYXBlSHRtbChsYWJlbCl9PC9kaXY+YDtcbiAgICBjb25zdCByb3dzID0gaXRlbXMubWFwKHB1YiA9PiB7XG4gICAgY29uc3Qga2V5ICAgICAgPSBlc2NhcGVIdG1sKHB1Yi5rZXkgfHwgJycpO1xuICAgIGNvbnN0IHR5cGUgICAgID0gZXNjYXBlSHRtbChwdWIudHlwZSB8fCAnJyk7XG4gICAgY29uc3QgY2l0YXRpb24gPSBlc2NhcGVIdG1sKChwdWIuZm9ybWF0dGVkX2NpdGF0aW9uIHx8ICcnKS5zbGljZSgwLCAxNjApKTtcbiAgICBjb25zdCBmdWxsICAgICA9IHB1Yi5mb3JtYXR0ZWRfY2l0YXRpb24gfHwgJyc7XG4gICAgY29uc3QgcHViSnNvbiAgPSBlc2NhcGVIdG1sKEpTT04uc3RyaW5naWZ5KHB1YikpO1xuICAgIHJldHVybiBgXG4gICAgICA8dHI+XG4gICAgICAgIDx0ZD5cbiAgICAgICAgICA8Y29kZSBzdHlsZT1cImZvbnQtc2l6ZTowLjhlbTtjb2xvcjojNDc1NTY5O1wiPiR7a2V5fTwvY29kZT5cbiAgICAgICAgICAke2NpdGF0aW9uID8gYDxicj48c21hbGwgc3R5bGU9XCJjb2xvcjojNmI3MjgwO1wiPiR7Y2l0YXRpb259JHtmdWxsLmxlbmd0aCA+IDE2MCA/ICdcdTIwMjYnIDogJyd9PC9zbWFsbD5gIDogJyd9XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO2NvbG9yOiM0NzU1Njk7Zm9udC1zaXplOjAuODVlbTtcIj4ke3R5cGV9PC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwiYWN0aW9uLWJ0bnNcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBvbmNsaWNrPVwiZWRpdE1hc3RlclB1YmxpY2F0aW9uKCR7cHViSnNvbn0pXCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkVkaXQgcHVibGljYXRpb246ICR7a2V5fVwiIHRpdGxlPVwiRWRpdFwiPlx1MjcwRlx1RkUwRjwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIG9uY2xpY2s9XCJkZWxldGVNYXN0ZXJQdWJsaWNhdGlvbignJHtrZXl9JylcIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiRGVsZXRlIHB1YmxpY2F0aW9uOiAke2tleX1cIiB0aXRsZT1cIkRlbGV0ZVwiPlx1RDgzRFx1REREMVx1RkUwRjwvYnV0dG9uPlxuICAgICAgICA8L3RkPlxuICAgICAgPC90cj5gO1xuICAgIH0pLmpvaW4oJycpO1xuICAgIHJldHVybiBgJHtoZWFkaW5nSHRtbH1cbiAgICA8dGFibGUgY2xhc3M9XCJyZXZpZXctdGFibGVcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCI+XG4gICAgICA8dGhlYWQ+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8dGg+UHVibGljYXRpb248L3RoPlxuICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOjExMHB4O3RleHQtYWxpZ246Y2VudGVyO1wiPlR5cGU8L3RoPlxuICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOjgwcHg7XCI+QWN0aW9uczwvdGg+XG4gICAgICAgIDwvdHI+XG4gICAgICA8L3RoZWFkPlxuICAgICAgPHRib2R5PiR7cm93c308L3Rib2R5PlxuICAgIDwvdGFibGU+YDtcbiAgfSkuam9pbignJyk7XG4gIGNvbnRhaW5lci5pbm5lckhUTUwgPSBgJHtjb250cm9sc0h0bWx9JHtzZWN0aW9uSHRtbH1gO1xufVxuXG4vKiogVmFsaWRhdGUgQmliVGVYIGluIHRoZSB0ZXh0YXJlYSB3aXRob3V0IHNhdmluZy4gKi9cbmFzeW5jIGZ1bmN0aW9uIHZhbGlkYXRlUHVibGljYXRpb25zQmliKCkge1xuICBjb25zdCB0YSAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi10ZXh0YXJlYScpO1xuICBjb25zdCBzdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1zdGF0dXMnKTtcbiAgaWYgKCF0YSB8fCAhc3RhdHVzKSByZXR1cm47XG4gIGNvbnN0IHRleHQgPSB0YS52YWx1ZTtcbiAgaWYgKCF0ZXh0LnRyaW0oKSkge1xuICAgIHN0YXR1cy50ZXh0Q29udGVudCA9ICdcdTIxMzlcdUZFMEYgRW1wdHkgXHUyMDE0IG5vdGhpbmcgdG8gdmFsaWRhdGUuJztcbiAgICBzdGF0dXMuc3R5bGUuY29sb3IgPSAnIzZiNzI4MCc7XG4gICAgcmV0dXJuO1xuICB9XG4gIHN0YXR1cy50ZXh0Q29udGVudCA9ICdcdUQ4M0RcdUREMEQgVmFsaWRhdGluZ1x1MjAyNic7XG4gIHN0YXR1cy5zdHlsZS5jb2xvciA9ICcjNmI3MjgwJztcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvcHVibGljYXRpb25zL3ZhbGlkYXRlJywge1xuICAgICAgbWV0aG9kOiAgJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiAgICBKU09OLnN0cmluZ2lmeSh7IGJpYnRleF90ZXh0OiB0ZXh0IH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBjb25zdCBuID0gZGF0YS5jb3VudCA/PyAwO1xuICAgICAgc3RhdHVzLnRleHRDb250ZW50ID0gYFx1MjcwNSBWYWxpZCBcdTIwMTQgJHtufSBlbnRyJHtuICE9PSAxID8gJ2llcycgOiAneSd9IGZvdW5kLmA7XG4gICAgICBzdGF0dXMuc3R5bGUuY29sb3IgPSAnIzE1ODAzZCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXR1cy50ZXh0Q29udGVudCA9ICdcdTI3NEMgJyArIChkYXRhLmVycm9yIHx8ICdWYWxpZGF0aW9uIGZhaWxlZCcpO1xuICAgICAgc3RhdHVzLnN0eWxlLmNvbG9yID0gJyNkYzI2MjYnO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgc3RhdHVzLnRleHRDb250ZW50ID0gJ1x1Mjc0QyAnICsgZXJyLm1lc3NhZ2U7XG4gICAgc3RhdHVzLnN0eWxlLmNvbG9yID0gJyNkYzI2MjYnO1xuICB9XG59XG5cbi8qKiBTYXZlIHJhdyBCaWJUZVggKHZhbGlkYXRlcyBzZXJ2ZXItc2lkZSBiZWZvcmUgd3JpdGluZykuICovXG5hc3luYyBmdW5jdGlvbiBzYXZlUHVibGljYXRpb25zQmliKCkge1xuICBjb25zdCB0YSAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi10ZXh0YXJlYScpO1xuICBjb25zdCBzdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1zdGF0dXMnKTtcbiAgY29uc3QgYnRuICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItc2F2ZS1idG4nKTtcbiAgaWYgKCF0YSkgcmV0dXJuO1xuICBjb25zdCBjb250ZW50ID0gdGEudmFsdWU7XG4gIGlmIChidG4pIHsgYnRuLmRpc2FibGVkID0gdHJ1ZTsgYnRuLnRleHRDb250ZW50ID0gJ1x1MjNGMyBTYXZpbmdcdTIwMjYnOyB9XG4gIGlmIChzdGF0dXMpIHsgc3RhdHVzLnRleHRDb250ZW50ID0gJyc7IHN0YXR1cy5zdHlsZS5jb2xvciA9ICcjNmI3MjgwJzsgfVxuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS9wdWJsaWNhdGlvbnMnLCB7XG4gICAgICBtZXRob2Q6ICAnUFVUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogICAgSlNPTi5zdHJpbmdpZnkoeyBjb250ZW50IH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBjb25zdCBuID0gZGF0YS5jb3VudCA/PyAwO1xuICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICBzdGF0dXMudGV4dENvbnRlbnQgPSBgXHUyNzA1IFNhdmVkIFx1MjAxNCAke259IGVudHIke24gIT09IDEgPyAnaWVzJyA6ICd5J30gcGFyc2VkLmA7XG4gICAgICAgIHN0YXR1cy5zdHlsZS5jb2xvciA9ICcjMTU4MDNkJztcbiAgICAgIH1cbiAgICAgIF91cGRhdGVQdWJDb3VudChuKTtcbiAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ1B1YmxpY2F0aW9ucycsICd1cGRhdGVkJyk7XG4gICAgICAvLyBSZWZyZXNoIENSVUQgbGlzdCB0byBzdGF5IGluIHN5bmNcbiAgICAgIGF3YWl0IGxvYWRQdWJsaWNhdGlvbnMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICBzdGF0dXMudGV4dENvbnRlbnQgPSAnXHUyNzRDICcgKyAoZGF0YS5lcnJvciB8fCAnU2F2ZSBmYWlsZWQnKTtcbiAgICAgICAgc3RhdHVzLnN0eWxlLmNvbG9yID0gJyNkYzI2MjYnO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKHN0YXR1cykge1xuICAgICAgc3RhdHVzLnRleHRDb250ZW50ID0gJ1x1Mjc0QyAnICsgZXJyLm1lc3NhZ2U7XG4gICAgICBzdGF0dXMuc3R5bGUuY29sb3IgPSAnI2RjMjYyNic7XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIGlmIChidG4pIHsgYnRuLmRpc2FibGVkID0gZmFsc2U7IGJ0bi50ZXh0Q29udGVudCA9ICdcdUQ4M0RcdURDQkUgU2F2ZSc7IH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzaG93SW1wb3J0UHVibGljYXRpb25zTW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWltcG9ydC10ZXh0YXJlYScpLnZhbHVlID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWltcG9ydC1vdmVyd3JpdGUnKS5jaGVja2VkID0gZmFsc2U7XG4gIF9zZXRQdWJsaWNhdGlvblN0YXR1cygnbWFzdGVyLXB1Yi1pbXBvcnQtc3RhdHVzJywgJycpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1pbXBvcnQtbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgc2V0SW5pdGlhbEZvY3VzKCdtYXN0ZXItcHViLWltcG9ydC1tb2RhbC1vdmVybGF5Jyk7XG4gIHRyYXBGb2N1cygnbWFzdGVyLXB1Yi1pbXBvcnQtbW9kYWwtb3ZlcmxheScpO1xufVxuXG5mdW5jdGlvbiBjbG9zZUltcG9ydFB1YmxpY2F0aW9uc01vZGFsKCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1pbXBvcnQtbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHJlc3RvcmVGb2N1cygpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBpbXBvcnRQdWJsaWNhdGlvbnNCaWIoKSB7XG4gIGNvbnN0IHRleHRhcmVhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItaW1wb3J0LXRleHRhcmVhJyk7XG4gIGNvbnN0IG92ZXJ3cml0ZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWltcG9ydC1vdmVyd3JpdGUnKTtcbiAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItaW1wb3J0LXN1Ym1pdC1idG4nKTtcbiAgaWYgKCF0ZXh0YXJlYSkgcmV0dXJuO1xuICBjb25zdCBiaWJ0ZXhUZXh0ID0gdGV4dGFyZWEudmFsdWUudHJpbSgpO1xuICBpZiAoIWJpYnRleFRleHQpIHtcbiAgICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItaW1wb3J0LXN0YXR1cycsICdcdTI2QTBcdUZFMEYgUGFzdGUgQmliVGVYIGVudHJpZXMgdG8gaW1wb3J0LicsICcjZGMyNjI2Jyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChidXR0b24pIHtcbiAgICBidXR0b24uZGlzYWJsZWQgPSB0cnVlO1xuICAgIGJ1dHRvbi50ZXh0Q29udGVudCA9ICdcdTIzRjMgSW1wb3J0aW5nXHUyMDI2JztcbiAgfVxuICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItaW1wb3J0LXN0YXR1cycsICdJbXBvcnRpbmcgQmliVGVYXHUyMDI2Jyk7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvcHVibGljYXRpb25zL2ltcG9ydCcsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGJpYnRleF90ZXh0OiBiaWJ0ZXhUZXh0LFxuICAgICAgICBvdmVyd3JpdGU6IEJvb2xlYW4ob3ZlcndyaXRlPy5jaGVja2VkKSxcbiAgICAgIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBjb25zdCBwYXJ0cyA9IFtcbiAgICAgICAgYCR7ZGF0YS5hZGRlZCB8fCAwfSBhZGRlZGAsXG4gICAgICAgIGAke2RhdGEudXBkYXRlZCB8fCAwfSB1cGRhdGVkYCxcbiAgICAgICAgYCR7ZGF0YS5za2lwcGVkIHx8IDB9IHNraXBwZWRgLFxuICAgICAgXTtcbiAgICAgIGlmIChkYXRhLmludmFsaWQpIHBhcnRzLnB1c2goYCR7ZGF0YS5pbnZhbGlkfSByZWplY3RlZCAobWlzc2luZyByZXF1aXJlZCBmaWVsZHMpYCk7XG4gICAgICBjb25zdCBza2lwcGVkRGV0YWlsID0gKGRhdGEuc2tpcHBlZF9rZXlzPy5sZW5ndGgpXG4gICAgICAgID8gYFxcblxcblNraXBwZWQgKGFscmVhZHkgZXhpc3QgXHUyMDE0IGVuYWJsZSBcIk92ZXJ3cml0ZVwiIHRvIHVwZGF0ZSk6XFxuXHUyMDIyICR7ZGF0YS5za2lwcGVkX2tleXMuam9pbignXFxuXHUyMDIyICcpfWBcbiAgICAgICAgOiAnJztcbiAgICAgIGNvbnN0IGludmFsaWREZXRhaWwgPSAoZGF0YS5pbnZhbGlkX2tleXM/Lmxlbmd0aClcbiAgICAgICAgPyBgXFxuXFxuUmVqZWN0ZWQgKG1pc3NpbmcgdGl0bGUsIHllYXIsIG9yIGF1dGhvcik6XFxuXHUyMDIyICR7ZGF0YS5pbnZhbGlkX2tleXMuam9pbignXFxuXHUyMDIyICcpfWBcbiAgICAgICAgOiAnJztcbiAgICAgIF9zZXRQdWJsaWNhdGlvblN0YXR1cygnbWFzdGVyLXB1Yi1pbXBvcnQtc3RhdHVzJywgYFx1MjcwNSBJbXBvcnRlZDogJHtwYXJ0cy5qb2luKCcsICcpfS5gLCAnIzE1ODAzZCcpO1xuICAgICAgX3NldE1hc3RlckNoYW5nZU5vdGljZSgnUHVibGljYXRpb25zJywgJ2ltcG9ydGVkJyk7XG4gICAgICBhd2FpdCBsb2FkUHVibGljYXRpb25zKCk7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzA1IEltcG9ydGVkJywgYEltcG9ydGVkIEJpYlRlWCBlbnRyaWVzOiAke3BhcnRzLmpvaW4oJywgJyl9LiR7c2tpcHBlZERldGFpbH0ke2ludmFsaWREZXRhaWx9YCk7XG4gICAgICBjbG9zZUltcG9ydFB1YmxpY2F0aW9uc01vZGFsKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIF9zZXRQdWJsaWNhdGlvblN0YXR1cygnbWFzdGVyLXB1Yi1pbXBvcnQtc3RhdHVzJywgYFx1Mjc0QyAke2RhdGEuZXJyb3IgfHwgJ0ltcG9ydCBmYWlsZWQnfWAsICcjZGMyNjI2Jyk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItaW1wb3J0LXN0YXR1cycsIGBcdTI3NEMgJHtlcnIubWVzc2FnZX1gLCAnI2RjMjYyNicpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChidXR0b24pIHtcbiAgICAgIGJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgYnV0dG9uLnRleHRDb250ZW50ID0gJ0ltcG9ydCc7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNob3dDb252ZXJ0UHVibGljYXRpb25zTW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNvbnZlcnQtaW5wdXQnKS52YWx1ZSA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1jb252ZXJ0LW91dHB1dCcpLnZhbHVlID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNvbnZlcnQtb3ZlcndyaXRlJykuY2hlY2tlZCA9IGZhbHNlO1xuICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItY29udmVydC1zdGF0dXMnLCAnJyk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNvbnZlcnQtbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgc2V0SW5pdGlhbEZvY3VzKCdtYXN0ZXItcHViLWNvbnZlcnQtbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ21hc3Rlci1wdWItY29udmVydC1tb2RhbC1vdmVybGF5Jyk7XG59XG5cbmZ1bmN0aW9uIGNsb3NlQ29udmVydFB1YmxpY2F0aW9uc01vZGFsKCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1jb252ZXJ0LW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICByZXN0b3JlRm9jdXMoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29udmVydFB1YmxpY2F0aW9uVGV4dCgpIHtcbiAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1jb252ZXJ0LWlucHV0Jyk7XG4gIGNvbnN0IG91dHB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNvbnZlcnQtb3V0cHV0Jyk7XG4gIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNvbnZlcnQtc3VibWl0LWJ0bicpO1xuICBpZiAoIWlucHV0IHx8ICFvdXRwdXQpIHJldHVybjtcbiAgY29uc3QgdGV4dCA9IGlucHV0LnZhbHVlLnRyaW0oKTtcbiAgaWYgKCF0ZXh0KSB7XG4gICAgX3NldFB1YmxpY2F0aW9uU3RhdHVzKCdtYXN0ZXItcHViLWNvbnZlcnQtc3RhdHVzJywgJ1x1MjZBMFx1RkUwRiBQYXN0ZSBjaXRhdGlvbiB0ZXh0IHRvIGNvbnZlcnQuJywgJyNkYzI2MjYnKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGJ1dHRvbikge1xuICAgIGJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7XG4gICAgYnV0dG9uLnRleHRDb250ZW50ID0gJ1x1MjNGMyBHZW5lcmF0aW5nXHUyMDI2JztcbiAgfVxuICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItY29udmVydC1zdGF0dXMnLCAnR2VuZXJhdGluZyBCaWJUZVggcHJldmlld1x1MjAyNicpO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL3B1YmxpY2F0aW9ucy9jb252ZXJ0Jywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgdGV4dCB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgb3V0cHV0LnZhbHVlID0gZGF0YS5iaWJ0ZXggfHwgJyc7XG4gICAgICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItY29udmVydC1zdGF0dXMnLCAnXHUyNzA1IFJldmlldyB0aGUgZ2VuZXJhdGVkIEJpYlRlWCwgdGhlbiBpbXBvcnQgaXQgaWYgaXQgbG9va3MgY29ycmVjdC4nLCAnIzE1ODAzZCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItY29udmVydC1zdGF0dXMnLCBgXHUyNzRDICR7ZGF0YS5lcnJvciB8fCAnQ29udmVyc2lvbiBmYWlsZWQnfWAsICcjZGMyNjI2Jyk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItY29udmVydC1zdGF0dXMnLCBgXHUyNzRDICR7ZXJyLm1lc3NhZ2V9YCwgJyNkYzI2MjYnKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoYnV0dG9uKSB7XG4gICAgICBidXR0b24uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIGJ1dHRvbi50ZXh0Q29udGVudCA9ICdHZW5lcmF0ZSBCaWJUZVgnO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBpbXBvcnRDb252ZXJ0ZWRQdWJsaWNhdGlvblRleHQoKSB7XG4gIGNvbnN0IG91dHB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNvbnZlcnQtb3V0cHV0Jyk7XG4gIGNvbnN0IG92ZXJ3cml0ZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNvbnZlcnQtb3ZlcndyaXRlJyk7XG4gIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNvbnZlcnQtaW1wb3J0LWJ0bicpO1xuICBpZiAoIW91dHB1dCkgcmV0dXJuO1xuICBjb25zdCBiaWJ0ZXhUZXh0ID0gb3V0cHV0LnZhbHVlLnRyaW0oKTtcbiAgaWYgKCFiaWJ0ZXhUZXh0KSB7XG4gICAgX3NldFB1YmxpY2F0aW9uU3RhdHVzKCdtYXN0ZXItcHViLWNvbnZlcnQtc3RhdHVzJywgJ1x1MjZBMFx1RkUwRiBHZW5lcmF0ZSBvciBlZGl0IEJpYlRlWCBiZWZvcmUgaW1wb3J0aW5nLicsICcjZGMyNjI2Jyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChidXR0b24pIHtcbiAgICBidXR0b24uZGlzYWJsZWQgPSB0cnVlO1xuICAgIGJ1dHRvbi50ZXh0Q29udGVudCA9ICdcdTIzRjMgSW1wb3J0aW5nXHUyMDI2JztcbiAgfVxuICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItY29udmVydC1zdGF0dXMnLCAnSW1wb3J0aW5nIHJldmlld2VkIEJpYlRlWFx1MjAyNicpO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL3B1YmxpY2F0aW9ucy9pbXBvcnQnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBiaWJ0ZXhfdGV4dDogYmlidGV4VGV4dCxcbiAgICAgICAgb3ZlcndyaXRlOiBCb29sZWFuKG92ZXJ3cml0ZT8uY2hlY2tlZCksXG4gICAgICB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgY29uc3QgcGFydHMgPSBbXG4gICAgICAgIGAke2RhdGEuYWRkZWQgfHwgMH0gYWRkZWRgLFxuICAgICAgICBgJHtkYXRhLnVwZGF0ZWQgfHwgMH0gdXBkYXRlZGAsXG4gICAgICAgIGAke2RhdGEuc2tpcHBlZCB8fCAwfSBza2lwcGVkYCxcbiAgICAgIF07XG4gICAgICBpZiAoZGF0YS5pbnZhbGlkKSBwYXJ0cy5wdXNoKGAke2RhdGEuaW52YWxpZH0gcmVqZWN0ZWQgKG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzKWApO1xuICAgICAgY29uc3Qgc2tpcHBlZERldGFpbCA9IChkYXRhLnNraXBwZWRfa2V5cz8ubGVuZ3RoKVxuICAgICAgICA/IGBcXG5cXG5Ta2lwcGVkIChhbHJlYWR5IGV4aXN0IFx1MjAxNCBlbmFibGUgXCJPdmVyd3JpdGVcIiB0byB1cGRhdGUpOlxcblx1MjAyMiAke2RhdGEuc2tpcHBlZF9rZXlzLmpvaW4oJ1xcblx1MjAyMiAnKX1gXG4gICAgICAgIDogJyc7XG4gICAgICBjb25zdCBpbnZhbGlkRGV0YWlsID0gKGRhdGEuaW52YWxpZF9rZXlzPy5sZW5ndGgpXG4gICAgICAgID8gYFxcblxcblJlamVjdGVkIChtaXNzaW5nIHRpdGxlLCB5ZWFyLCBvciBhdXRob3IpOlxcblx1MjAyMiAke2RhdGEuaW52YWxpZF9rZXlzLmpvaW4oJ1xcblx1MjAyMiAnKX1gXG4gICAgICAgIDogJyc7XG4gICAgICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItY29udmVydC1zdGF0dXMnLCBgXHUyNzA1IEltcG9ydGVkIHByZXZpZXc6ICR7cGFydHMuam9pbignLCAnKX0uYCwgJyMxNTgwM2QnKTtcbiAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ1B1YmxpY2F0aW9ucycsICdpbXBvcnRlZCcpO1xuICAgICAgYXdhaXQgbG9hZFB1YmxpY2F0aW9ucygpO1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjcwNSBJbXBvcnRlZCcsIGBJbXBvcnRlZCBnZW5lcmF0ZWQgQmliVGVYOiAke3BhcnRzLmpvaW4oJywgJyl9LiR7c2tpcHBlZERldGFpbH0ke2ludmFsaWREZXRhaWx9YCk7XG4gICAgICBjbG9zZUNvbnZlcnRQdWJsaWNhdGlvbnNNb2RhbCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItY29udmVydC1zdGF0dXMnLCBgXHUyNzRDICR7ZGF0YS5lcnJvciB8fCAnSW1wb3J0IGZhaWxlZCd9YCwgJyNkYzI2MjYnKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIF9zZXRQdWJsaWNhdGlvblN0YXR1cygnbWFzdGVyLXB1Yi1jb252ZXJ0LXN0YXR1cycsIGBcdTI3NEMgJHtlcnIubWVzc2FnZX1gLCAnI2RjMjYyNicpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChidXR0b24pIHtcbiAgICAgIGJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgYnV0dG9uLnRleHRDb250ZW50ID0gJ0ltcG9ydCBQcmV2aWV3JztcbiAgICB9XG4gIH1cbn1cblxuLy8gLS0tLSBQdWJsaWNhdGlvbiBhZGQvZWRpdCBtb2RhbCAtLS0tXG5cbmZ1bmN0aW9uIHNob3dBZGRQdWJsaWNhdGlvbk1vZGFsKCkge1xuICBfcHViTW9kYWxVc2VzRWRpdG9yRmllbGQgPSBmYWxzZTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1rZXknKS52YWx1ZSAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLW1vZGFsLXR5cGUnKS52YWx1ZSAgID0gJ2FydGljbGUnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLW1vZGFsLWF1dGhvcicpLnZhbHVlID0gJyc7XG4gIGNvbnN0IGF1dGhvckxhYmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1hdXRob3ItbGFiZWwnKTtcbiAgaWYgKGF1dGhvckxhYmVsKSBhdXRob3JMYWJlbC50ZXh0Q29udGVudCA9ICdBdXRob3IocyknO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLW1vZGFsLXRpdGxlJykudmFsdWUgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWItbW9kYWwteWVhcicpLnZhbHVlICAgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1qb3VybmFsJykudmFsdWUgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1kb2knKS52YWx1ZSAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLW1vZGFsLWV4dHJhJykudmFsdWUgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWItbW9kYWwta2V5JykuZGlzYWJsZWQgPSBmYWxzZTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC10aXRsZS1oZWFkaW5nJykudGV4dENvbnRlbnQgPSAnQWRkIFB1YmxpY2F0aW9uJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgc2V0SW5pdGlhbEZvY3VzKCdtYXN0ZXItcHViLW1vZGFsLW92ZXJsYXknKTtcbiAgdHJhcEZvY3VzKCdtYXN0ZXItcHViLW1vZGFsLW92ZXJsYXknKTtcbn1cblxuZnVuY3Rpb24gZWRpdE1hc3RlclB1YmxpY2F0aW9uKHB1Yikge1xuICBjb25zdCBmaWVsZHMgPSBwdWIuZmllbGRzIHx8IHt9O1xuICAvLyBUcmFjayB3aGV0aGVyIHRoaXMgZW50cnkgdXNlcyBgZWRpdG9yYCBzbyB3ZSBwcmVzZXJ2ZSBpdCBvbiBzYXZlXG4gIF9wdWJNb2RhbFVzZXNFZGl0b3JGaWVsZCA9ICFmaWVsZHMuYXV0aG9yICYmICEhZmllbGRzLmVkaXRvcjtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1rZXknKS52YWx1ZSAgICAgPSBwdWIua2V5IHx8ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLW1vZGFsLXR5cGUnKS52YWx1ZSAgICA9IHB1Yi50eXBlIHx8ICdhcnRpY2xlJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1hdXRob3InKS52YWx1ZSAgPSBmaWVsZHMuYXV0aG9yIHx8IGZpZWxkcy5lZGl0b3IgfHwgJyc7XG4gIC8vIFVwZGF0ZSB0aGUgQXV0aG9yL0VkaXRvciBsYWJlbCBzbyB0aGUgdXNlciBrbm93cyB3aGljaCBmaWVsZCBpcyBiZWluZyBlZGl0ZWRcbiAgY29uc3QgYXV0aG9yTGFiZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLW1vZGFsLWF1dGhvci1sYWJlbCcpO1xuICBpZiAoYXV0aG9yTGFiZWwpIGF1dGhvckxhYmVsLnRleHRDb250ZW50ID0gX3B1Yk1vZGFsVXNlc0VkaXRvckZpZWxkID8gJ0VkaXRvcihzKScgOiAnQXV0aG9yKHMpJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC10aXRsZScpLnZhbHVlICAgPSBmaWVsZHMudGl0bGUgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWItbW9kYWwteWVhcicpLnZhbHVlICAgID0gZmllbGRzLnllYXIgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWItbW9kYWwtam91cm5hbCcpLnZhbHVlID0gZmllbGRzLmpvdXJuYWwgfHwgZmllbGRzLmJvb2t0aXRsZSB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1kb2knKS52YWx1ZSAgICAgPSBmaWVsZHMuZG9pIHx8ICcnO1xuICAvLyBFeHRyYTogcmVtYWluaW5nIG5vbi1zdGFuZGFyZCBmaWVsZHMgYXMga2V5PXZhbHVlIGxpbmVzXG4gIGNvbnN0IGtub3duID0gbmV3IFNldChbJ2F1dGhvcicsJ2VkaXRvcicsJ3RpdGxlJywneWVhcicsJ2pvdXJuYWwnLCdib29rdGl0bGUnLCdkb2knXSk7XG4gIGNvbnN0IGV4dHJhID0gT2JqZWN0LmVudHJpZXMoZmllbGRzKVxuICAgIC5maWx0ZXIoKFtrXSkgPT4gIWtub3duLmhhcyhrKSlcbiAgICAubWFwKChbaywgdl0pID0+IGAke2t9PSR7dn1gKVxuICAgIC5qb2luKCdcXG4nKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1leHRyYScpLnZhbHVlICAgPSBleHRyYTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1rZXknKS5kaXNhYmxlZCAgPSB0cnVlOyAgLy8ga2V5IGlzIGltbXV0YWJsZSBvbiBlZGl0XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWItbW9kYWwtdGl0bGUtaGVhZGluZycpLnRleHRDb250ZW50ID0gJ0VkaXQgUHVibGljYXRpb24nO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBzZXRJbml0aWFsRm9jdXMoJ21hc3Rlci1wdWItbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ21hc3Rlci1wdWItbW9kYWwtb3ZlcmxheScpO1xufVxuXG5mdW5jdGlvbiBjbG9zZVB1YmxpY2F0aW9uTW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICByZXN0b3JlRm9jdXMoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZU1hc3RlclB1YmxpY2F0aW9uKCkge1xuICBjb25zdCBrZXlFbCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLW1vZGFsLWtleScpO1xuICBjb25zdCBrZXkgICAgPSBrZXlFbC52YWx1ZS50cmltKCk7XG4gIGNvbnN0IGFjdGlvbiA9IGtleUVsLmRpc2FibGVkID8gJ3VwZGF0ZScgOiAnYWRkJztcbiAgaWYgKCFrZXkpIHsgc2hvd0FsZXJ0TW9kYWwoJ1x1MjZBMFx1RkUwRiBWYWxpZGF0aW9uJywgJ0NpdGUga2V5IGlzIHJlcXVpcmVkLicpOyByZXR1cm47IH1cbiAgY29uc3QgdHlwZSAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC10eXBlJykudmFsdWUudHJpbSgpIHx8ICdhcnRpY2xlJztcbiAgY29uc3QgYXV0aG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1hdXRob3InKS52YWx1ZS50cmltKCk7XG4gIGNvbnN0IHRpdGxlICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWItbW9kYWwtdGl0bGUnKS52YWx1ZS50cmltKCk7XG4gIGNvbnN0IHllYXIgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWItbW9kYWwteWVhcicpLnZhbHVlLnRyaW0oKTtcbiAgaWYgKCF0aXRsZSkgIHsgc2hvd0FsZXJ0TW9kYWwoJ1x1MjZBMFx1RkUwRiBWYWxpZGF0aW9uJywgJ1RpdGxlIGlzIHJlcXVpcmVkLicpOyByZXR1cm47IH1cbiAgaWYgKCF5ZWFyKSAgIHsgc2hvd0FsZXJ0TW9kYWwoJ1x1MjZBMFx1RkUwRiBWYWxpZGF0aW9uJywgJ1llYXIgaXMgcmVxdWlyZWQuJyk7IHJldHVybjsgfVxuICBpZiAoIWF1dGhvcikgeyBzaG93QWxlcnRNb2RhbCgnXHUyNkEwXHVGRTBGIFZhbGlkYXRpb24nLCAnQXV0aG9yIG9yIGVkaXRvciBpcyByZXF1aXJlZC4nKTsgcmV0dXJuOyB9XG4gIC8vIFByZXNlcnZlIHRoZSBvcmlnaW5hbCBmaWVsZCBuYW1lOiBlZGl0b3IgZW50cmllcyBtdXN0IG5vdCBiZSBzYXZlZCBhcyBhdXRob3JcbiAgY29uc3QgZmllbGRzID0gX3B1Yk1vZGFsVXNlc0VkaXRvckZpZWxkID8geyBlZGl0b3I6IGF1dGhvciwgdGl0bGUsIHllYXIgfSA6IHsgYXV0aG9yLCB0aXRsZSwgeWVhciB9O1xuICBjb25zdCBqb3VybmFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1qb3VybmFsJykudmFsdWUudHJpbSgpO1xuICBpZiAoam91cm5hbCkge1xuICAgIGZpZWxkc1t0eXBlID09PSAnaW5wcm9jZWVkaW5ncycgPyAnYm9va3RpdGxlJyA6ICdqb3VybmFsJ10gPSBqb3VybmFsO1xuICB9XG4gIGNvbnN0IGRvaSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWItbW9kYWwtZG9pJykudmFsdWUudHJpbSgpO1xuICBpZiAoZG9pKSBmaWVsZHMuZG9pID0gZG9pO1xuICAvLyBQYXJzZSBleHRyYSBmaWVsZHMgKGtleT12YWx1ZSBwZXIgbGluZSlcbiAgY29uc3QgZXh0cmEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLW1vZGFsLWV4dHJhJykudmFsdWU7XG4gIGZvciAoY29uc3QgbGluZSBvZiBleHRyYS5zcGxpdCgnXFxuJykpIHtcbiAgICBjb25zdCBlcSA9IGxpbmUuaW5kZXhPZignPScpO1xuICAgIGlmIChlcSA+IDApIHtcbiAgICAgIGNvbnN0IGsgPSBsaW5lLnNsaWNlKDAsIGVxKS50cmltKCk7XG4gICAgICBjb25zdCB2ID0gbGluZS5zbGljZShlcSArIDEpLnRyaW0oKTtcbiAgICAgIGlmIChrICYmIHYpIGZpZWxkc1trXSA9IHY7XG4gICAgfVxuICB9XG4gIGNvbnN0IGJvZHkgPSB7IGFjdGlvbiwga2V5LCB0eXBlLCBmaWVsZHMgfTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvcHVibGljYXRpb24nLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBjbG9zZVB1YmxpY2F0aW9uTW9kYWwoKTtcbiAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ1B1YmxpY2F0aW9ucycsIGRhdGEuYWN0aW9uIHx8ICd1cGRhdGVkJyk7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzA1IFNhdmVkJywgYFB1YmxpY2F0aW9uIFwiJHtrZXl9XCIgJHtkYXRhLmFjdGlvbn0uYCk7XG4gICAgICBhd2FpdCBsb2FkUHVibGljYXRpb25zKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCBkYXRhLmVycm9yIHx8ICdTYXZlIGZhaWxlZCcpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIHNhdmUgcHVibGljYXRpb24nKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVNYXN0ZXJQdWJsaWNhdGlvbihrZXkpIHtcbiAgc2hvd0NvbmZpcm1Nb2RhbChcbiAgICAnXHVEODNEXHVEREQxXHVGRTBGIERlbGV0ZSBQdWJsaWNhdGlvbicsXG4gICAgYERlbGV0ZSBcIiR7a2V5fVwiPyBUaGlzIGNhbm5vdCBiZSB1bmRvbmUuYCxcbiAgICBhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvcHVibGljYXRpb24nLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgYWN0aW9uOiAnZGVsZXRlJywga2V5IH0pLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICAgICAgX3NldE1hc3RlckNoYW5nZU5vdGljZSgnUHVibGljYXRpb25zJywgJ2RlbGV0ZWQnKTtcbiAgICAgICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzA1IERlbGV0ZWQnLCBgUHVibGljYXRpb24gXCIke2tleX1cIiByZW1vdmVkLmApO1xuICAgICAgICAgIGF3YWl0IGxvYWRQdWJsaWNhdGlvbnMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgZGF0YS5lcnJvciB8fCAnRGVsZXRlIGZhaWxlZCcpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIGRlbGV0ZSBwdWJsaWNhdGlvbicpO1xuICAgICAgfVxuICAgIH1cbiAgKTtcbn1cblxuZnVuY3Rpb24gX3JlbmRlckF3YXJkc0xpc3QoYXdhcmRzKSB7XG4gIGlmICghYXdhcmRzLmxlbmd0aCkge1xuICAgIHJldHVybiAnPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO3BhZGRpbmc6MTJweCAwO1wiPk5vIGF3YXJkcyBvbiBmaWxlLiBDbGljayBcIisgQWRkIEF3YXJkXCIgYWJvdmUuPC9wPic7XG4gIH1cbiAgY29uc3Qgcm93cyA9IGF3YXJkcy5tYXAoKGF3YXJkLCBpZHgpID0+IHtcbiAgICBjb25zdCB0aXRsZSA9IGVzY2FwZUh0bWwoYXdhcmQudGl0bGUgfHwgJycpO1xuICAgIGNvbnN0IHllYXIgID0gYXdhcmQueWVhciA/IFN0cmluZyhhd2FyZC55ZWFyKSA6ICdcdTIwMTQnO1xuICAgIGNvbnN0IGRlc2MgID0gZXNjYXBlSHRtbCgoYXdhcmQuZGVzY3JpcHRpb24gfHwgJycpLnNsaWNlKDAsIDEwMCkpO1xuICAgIGNvbnN0IGF3YXJkSnNvbiA9IGVzY2FwZUh0bWwoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgdGl0bGU6IGF3YXJkLnRpdGxlIHx8ICcnLCB5ZWFyOiBhd2FyZC55ZWFyIHx8ICcnLFxuICAgICAgZGVzY3JpcHRpb246IGF3YXJkLmRlc2NyaXB0aW9uIHx8ICcnLFxuICAgICAgcmVsZXZhbnRfZm9yOiAoYXdhcmQucmVsZXZhbnRfZm9yIHx8IFtdKS5qb2luKCcsICcpLFxuICAgIH0pKTtcbiAgICByZXR1cm4gYFxuICAgICAgPHRyPlxuICAgICAgICA8dGQ+XG4gICAgICAgICAgPHN0cm9uZz4ke3RpdGxlfTwvc3Ryb25nPlxuICAgICAgICAgICR7ZGVzYyA/IGA8YnI+PHNtYWxsIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtcIj4ke2Rlc2N9JHsoYXdhcmQuZGVzY3JpcHRpb258fCcnKS5sZW5ndGggPiAxMDAgPyAnXHUyMDI2JyA6ICcnfTwvc21hbGw+YCA6ICcnfVxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjtjb2xvcjojNDc1NTY5O1wiPiR7eWVhcn08L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJhY3Rpb24tYnRuc1wiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIG9uY2xpY2s9XCJlZGl0TWFzdGVyQXdhcmQoJHthd2FyZEpzb259LCAke2lkeH0pXCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkVkaXQgYXdhcmQ6ICR7dGl0bGV9XCIgdGl0bGU9XCJFZGl0XCI+XHUyNzBGXHVGRTBGPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgb25jbGljaz1cImRlbGV0ZU1hc3RlckF3YXJkKCR7aWR4fSwgJyR7dGl0bGV9JylcIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiRGVsZXRlIGF3YXJkOiAke3RpdGxlfVwiIHRpdGxlPVwiRGVsZXRlXCI+XHVEODNEXHVEREQxXHVGRTBGPC9idXR0b24+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L3RyPmA7XG4gIH0pLmpvaW4oJycpO1xuICByZXR1cm4gYFxuICAgIDx0YWJsZSBjbGFzcz1cInJldmlldy10YWJsZVwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIj5cbiAgICAgIDx0aGVhZD5cbiAgICAgICAgPHRyPlxuICAgICAgICAgIDx0aD5Bd2FyZDwvdGg+XG4gICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6NzBweDt0ZXh0LWFsaWduOmNlbnRlcjtcIj5ZZWFyPC90aD5cbiAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDo4MHB4O1wiPkFjdGlvbnM8L3RoPlxuICAgICAgICA8L3RyPlxuICAgICAgPC90aGVhZD5cbiAgICAgIDx0Ym9keT4ke3Jvd3N9PC90Ym9keT5cbiAgICA8L3RhYmxlPmA7XG59XG5cblxuZnVuY3Rpb24gX3JlbmRlckNlcnRpZmljYXRpb25zTGlzdChjZXJ0cykge1xuICBpZiAoIWNlcnRzLmxlbmd0aCkge1xuICAgIHJldHVybiAnPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO3BhZGRpbmc6MTJweCAwO1wiPk5vIGNlcnRpZmljYXRpb25zIG9uIGZpbGUuIENsaWNrIFwiKyBBZGQgQ2VydGlmaWNhdGlvblwiIGFib3ZlLjwvcD4nO1xuICB9XG4gIGNvbnN0IHJvd3MgPSBjZXJ0cy5tYXAoKGNlcnQsIGlkeCkgPT4ge1xuICAgIGNvbnN0IG5hbWUgICA9IGVzY2FwZUh0bWwoY2VydC5uYW1lIHx8ICcnKTtcbiAgICBjb25zdCBpc3N1ZXIgPSBlc2NhcGVIdG1sKGNlcnQuaXNzdWVyIHx8ICdcdTIwMTQnKTtcbiAgICBjb25zdCB5ZWFyICAgPSBjZXJ0LnllYXIgPyBTdHJpbmcoY2VydC55ZWFyKSA6ICdcdTIwMTQnO1xuICAgIGNvbnN0IGNlcnRKc29uID0gZXNjYXBlSHRtbChKU09OLnN0cmluZ2lmeSh7XG4gICAgICBuYW1lOiBjZXJ0Lm5hbWUgfHwgJycsIGlzc3VlcjogY2VydC5pc3N1ZXIgfHwgJycsIHllYXI6IGNlcnQueWVhciB8fCAnJyxcbiAgICB9KSk7XG4gICAgcmV0dXJuIGBcbiAgICAgIDx0cj5cbiAgICAgICAgPHRkPjxzdHJvbmc+JHtuYW1lfTwvc3Ryb25nPjwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cImNvbG9yOiM0NzU1Njk7XCI+JHtpc3N1ZXJ9PC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7Y29sb3I6IzQ3NTU2OTtcIj4ke3llYXJ9PC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwiYWN0aW9uLWJ0bnNcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBvbmNsaWNrPVwiZWRpdE1hc3RlckNlcnRpZmljYXRpb24oJHtjZXJ0SnNvbn0sICR7aWR4fSlcIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiRWRpdCBjZXJ0aWZpY2F0aW9uOiAke25hbWV9XCIgdGl0bGU9XCJFZGl0XCI+XHUyNzBGXHVGRTBGPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgb25jbGljaz1cImRlbGV0ZU1hc3RlckNlcnRpZmljYXRpb24oJHtpZHh9LCAnJHtuYW1lfScpXCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkRlbGV0ZSBjZXJ0aWZpY2F0aW9uOiAke25hbWV9XCIgdGl0bGU9XCJEZWxldGVcIj5cdUQ4M0RcdURERDFcdUZFMEY8L2J1dHRvbj5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvdHI+YDtcbiAgfSkuam9pbignJyk7XG4gIHJldHVybiBgXG4gICAgPHRhYmxlIGNsYXNzPVwicmV2aWV3LXRhYmxlXCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiPlxuICAgICAgPHRoZWFkPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRoPk5hbWU8L3RoPlxuICAgICAgICAgIDx0aD5Jc3N1ZXI8L3RoPlxuICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOjcwcHg7dGV4dC1hbGlnbjpjZW50ZXI7XCI+WWVhcjwvdGg+XG4gICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6ODBweDtcIj5BY3Rpb25zPC90aD5cbiAgICAgICAgPC90cj5cbiAgICAgIDwvdGhlYWQ+XG4gICAgICA8dGJvZHk+JHtyb3dzfTwvdGJvZHk+XG4gICAgPC90YWJsZT5gO1xufVxuXG5cbmZ1bmN0aW9uIF9yZW5kZXJNYXN0ZXJBY2hpZXZlbWVudHNUYWJsZShhY2hpZXZlbWVudHMpIHtcbiAgaWYgKCFhY2hpZXZlbWVudHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuICc8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7cGFkZGluZzoxMnB4IDA7XCI+Tm8gc2VsZWN0ZWQgYWNoaWV2ZW1lbnRzIHlldC4gVXNlIHRoZSBIYXJ2ZXN0IGZlYXR1cmUgdG8gYWRkIGFjaGlldmVtZW50cyBmcm9tIGEgY29tcGxldGVkIHNlc3Npb24sIG9yIGNsaWNrIFwiKyBBZGQgQWNoaWV2ZW1lbnRcIiBhYm92ZS48L3A+JztcbiAgfVxuICBsZXQgcm93cyA9IGFjaGlldmVtZW50cy5tYXAoYWNoID0+IHtcbiAgICBjb25zdCBpZCAgICAgID0gZXNjYXBlSHRtbChhY2guaWQgfHwgJycpO1xuICAgIGNvbnN0IHRpdGxlICAgPSBlc2NhcGVIdG1sKGFjaC50aXRsZSB8fCAnJyk7XG4gICAgY29uc3QgZGVzYyAgICA9IGVzY2FwZUh0bWwoKGFjaC5kZXNjcmlwdGlvbiB8fCAnJykuc2xpY2UoMCwgMTAwKSk7XG4gICAgY29uc3QgaW1wICAgICA9IGFjaC5pbXBvcnRhbmNlID8/ICdcdTIwMTQnO1xuICAgIGNvbnN0IHJlbEZvciAgPSBlc2NhcGVIdG1sKChhY2gucmVsZXZhbnRfZm9yIHx8IFtdKS5qb2luKCcsICcpKTtcbiAgICByZXR1cm4gYFxuICAgICAgPHRyPlxuICAgICAgICA8dGQ+PHN0cm9uZz4ke3RpdGxlfTwvc3Ryb25nPiR7ZGVzYyA/IGA8YnI+PHNtYWxsIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtcIj4ke2Rlc2N9JHsoYWNoLmRlc2NyaXB0aW9ufHwnJykubGVuZ3RoID4gMTAwID8gJ1x1MjAyNicgOiAnJ308L3NtYWxsPmAgOiAnJ308L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjtcIj4ke2ltcH08L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2NvbG9yOiM0NzU1Njk7XCI+JHtyZWxGb3IgfHwgJ1x1MjAxNCd9PC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwiYWN0aW9uLWJ0bnNcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBvbmNsaWNrPVwiZWRpdE1hc3RlckFjaGlldmVtZW50KCR7ZXNjYXBlSHRtbChKU09OLnN0cmluZ2lmeSh7aWQ6IGFjaC5pZHx8JycsIHRpdGxlOiBhY2gudGl0bGV8fCcnLCBkZXNjcmlwdGlvbjogYWNoLmRlc2NyaXB0aW9ufHwnJywgcmVsZXZhbnRfZm9yOiBhY2gucmVsZXZhbnRfZm9yfHxbXSwgaW1wb3J0YW5jZTogYWNoLmltcG9ydGFuY2V8fDd9KSl9KVwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJFZGl0IGFjaGlldmVtZW50OiAke3RpdGxlfVwiIHRpdGxlPVwiRWRpdFwiPlx1MjcwRlx1RkUwRjwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIG9uY2xpY2s9XCJkZWxldGVNYXN0ZXJBY2hpZXZlbWVudCgnJHtpZH0nLCAnJHt0aXRsZX0nKVwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJEZWxldGUgYWNoaWV2ZW1lbnQ6ICR7dGl0bGV9XCIgdGl0bGU9XCJEZWxldGVcIj5cdUQ4M0RcdURERDFcdUZFMEY8L2J1dHRvbj5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvdHI+YDtcbiAgfSkuam9pbignJyk7XG4gIHJldHVybiBgXG4gICAgPHRhYmxlIGNsYXNzPVwicmV2aWV3LXRhYmxlXCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiPlxuICAgICAgPHRoZWFkPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRoPkFjaGlldmVtZW50PC90aD5cbiAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDo2MHB4O3RleHQtYWxpZ246Y2VudGVyO1wiPkltcG9ydGFuY2U8L3RoPlxuICAgICAgICAgIDx0aD5SZWxldmFudCBmb3I8L3RoPlxuICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOjgwcHg7XCI+QWN0aW9uczwvdGg+XG4gICAgICAgIDwvdHI+XG4gICAgICA8L3RoZWFkPlxuICAgICAgPHRib2R5PiR7cm93c308L3Rib2R5PlxuICAgIDwvdGFibGU+YDtcbn1cblxuZnVuY3Rpb24gX3JlbmRlclN1bW1hcmllc0xpc3Qoc3VtbWFyaWVzKSB7XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhzdW1tYXJpZXMpO1xuICBpZiAoIWtleXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuICc8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7cGFkZGluZzoxMnB4IDA7XCI+Tm8gcHJvZmVzc2lvbmFsIHN1bW1hcnkgdmFyaWFudHMgeWV0LiBDbGljayBcIisgQWRkIFN1bW1hcnlcIiBhYm92ZSB0byBjcmVhdGUgeW91ciBmaXJzdCBvbmUuPC9wPic7XG4gIH1cbiAgcmV0dXJuIGtleXMubWFwKGtleSA9PiB7XG4gICAgY29uc3QgdGV4dCAgICA9IHR5cGVvZiBzdW1tYXJpZXNba2V5XSA9PT0gJ3N0cmluZycgPyBzdW1tYXJpZXNba2V5XSA6IEpTT04uc3RyaW5naWZ5KHN1bW1hcmllc1trZXldKTtcbiAgICBjb25zdCBwcmV2aWV3ID0gZXNjYXBlSHRtbCh0ZXh0LnNsaWNlKDAsIDIwMCkpO1xuICAgIGNvbnN0IGtleUVzYyAgPSBlc2NhcGVIdG1sKGtleSk7XG4gICAgcmV0dXJuIGBcbiAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc3VtbWFyeS1jYXJkXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc3VtbWFyeS1oZWFkZXJcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hc3Rlci1zdW1tYXJ5LWtleVwiPiR7a2V5RXNjfTwvc3Bhbj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWJ0bnNcIiBzdHlsZT1cImdhcDo0cHg7XCI+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBvbmNsaWNrPVwiZWRpdE1hc3RlclN1bW1hcnkoJHtlc2NhcGVIdG1sKEpTT04uc3RyaW5naWZ5KHtrZXksIHRleHR9KSl9KVwiXG4gICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkVkaXQgc3VtbWFyeTogJHtrZXlFc2N9XCIgdGl0bGU9XCJFZGl0XCI+XHUyNzBGXHVGRTBGPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBvbmNsaWNrPVwiZGVsZXRlTWFzdGVyU3VtbWFyeSgnJHtrZXlFc2N9JylcIlxuICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJEZWxldGUgc3VtbWFyeTogJHtrZXlFc2N9XCIgdGl0bGU9XCJEZWxldGVcIj5cdUQ4M0RcdURERDFcdUZFMEY8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc3VtbWFyeS1wcmV2aWV3XCI+JHtwcmV2aWV3fSR7dGV4dC5sZW5ndGggPiAyMDAgPyAnXHUyMDI2JyA6ICcnfTwvZGl2PlxuICAgICAgPC9kaXY+YDtcbiAgfSkuam9pbignJyk7XG59XG5cbmZ1bmN0aW9uIHNob3dBZGRBY2hpZXZlbWVudE1vZGFsKCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLW1vZGFsLWlkJykudmFsdWUgICAgICAgICAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLW1vZGFsLXRpdGxlLWlucHV0JykudmFsdWUgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLW1vZGFsLWRlc2MtaW5wdXQnKS52YWx1ZSAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLW1vZGFsLXJlbGV2YW50LWlucHV0JykudmFsdWUgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaC1tb2RhbC1pbXBvcnRhbmNlLWlucHV0JykudmFsdWUgPSAnNyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItYWNoLW1vZGFsLXRpdGxlJykudGV4dENvbnRlbnQgPSAnQWRkIEFjaGlldmVtZW50JztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1hY2gtbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgc2V0SW5pdGlhbEZvY3VzKCdtYXN0ZXItYWNoLW1vZGFsLW92ZXJsYXknKTtcbiAgdHJhcEZvY3VzKCdtYXN0ZXItYWNoLW1vZGFsLW92ZXJsYXknKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaC1tb2RhbC10aXRsZS1pbnB1dCcpLmZvY3VzKCk7XG59XG5cbmZ1bmN0aW9uIGVkaXRNYXN0ZXJBY2hpZXZlbWVudChhY2gpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaC1tb2RhbC1pZCcpLnZhbHVlICAgICAgICAgICAgICA9IGFjaC5pZCB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaC1tb2RhbC10aXRsZS1pbnB1dCcpLnZhbHVlICAgICA9IGFjaC50aXRsZSB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaC1tb2RhbC1kZXNjLWlucHV0JykudmFsdWUgICAgICA9IGFjaC5kZXNjcmlwdGlvbiB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaC1tb2RhbC1yZWxldmFudC1pbnB1dCcpLnZhbHVlICA9IChhY2gucmVsZXZhbnRfZm9yIHx8IFtdKS5qb2luKCcsICcpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLW1vZGFsLWltcG9ydGFuY2UtaW5wdXQnKS52YWx1ZSA9IGFjaC5pbXBvcnRhbmNlIHx8IDc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItYWNoLW1vZGFsLXRpdGxlJykudGV4dENvbnRlbnQgPSAnRWRpdCBBY2hpZXZlbWVudCc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItYWNoLW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICBfZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIHNldEluaXRpYWxGb2N1cygnbWFzdGVyLWFjaC1tb2RhbC1vdmVybGF5Jyk7XG4gIHRyYXBGb2N1cygnbWFzdGVyLWFjaC1tb2RhbC1vdmVybGF5Jyk7XG59XG5cbmZ1bmN0aW9uIGNsb3NlTWFzdGVyQWNoTW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItYWNoLW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICByZXN0b3JlRm9jdXMoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZU1hc3RlckFjaGlldmVtZW50KCkge1xuICBjb25zdCBpZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhY2gtbW9kYWwtaWQnKS52YWx1ZS50cmltKCkgfHxcbiAgICAgICAgICAgICAnc2FfJyArIERhdGUubm93KCk7XG4gIGNvbnN0IHRpdGxlICAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaC1tb2RhbC10aXRsZS1pbnB1dCcpLnZhbHVlLnRyaW0oKTtcbiAgY29uc3QgZGVzY3JpcHRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLW1vZGFsLWRlc2MtaW5wdXQnKS52YWx1ZS50cmltKCk7XG4gIGNvbnN0IHJlbGV2YW50UmF3ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaC1tb2RhbC1yZWxldmFudC1pbnB1dCcpLnZhbHVlO1xuICBjb25zdCBpbXBvcnRhbmNlICA9IHBhcnNlSW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhY2gtbW9kYWwtaW1wb3J0YW5jZS1pbnB1dCcpLnZhbHVlLCAxMCkgfHwgNztcblxuICBpZiAoIXRpdGxlKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjZBMFx1RkUwRiBWYWxpZGF0aW9uJywgJ1RpdGxlIGlzIHJlcXVpcmVkLicpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCByZWxldmFudF9mb3IgPSByZWxldmFudFJhdy5zcGxpdCgnLCcpLm1hcChzID0+IHMudHJpbSgpKS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS91cGRhdGUtYWNoaWV2ZW1lbnQnLCB7XG4gICAgICBtZXRob2Q6ICAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6ICAgIEpTT04uc3RyaW5naWZ5KHsgaWQsIHRpdGxlLCBkZXNjcmlwdGlvbiwgcmVsZXZhbnRfZm9yLCBpbXBvcnRhbmNlIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBjbG9zZU1hc3RlckFjaE1vZGFsKCk7XG4gICAgICBfc2V0TWFzdGVyQ2hhbmdlTm90aWNlKCdTZWxlY3RlZCBBY2hpZXZlbWVudHMnLCBkYXRhLmFjdGlvbiB8fCAndXBkYXRlZCcpO1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjcwNSBTYXZlZCcsIGBBY2hpZXZlbWVudCBcIiR7dGl0bGV9XCIgJHtkYXRhLmFjdGlvbn0uYCk7XG4gICAgICBhd2FpdCBwb3B1bGF0ZU1hc3RlclRhYigpOyAgLy8gcmVmcmVzaFxuICAgIH0gZWxzZSB7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgZGF0YS5lcnJvciB8fCAnU2F2ZSBmYWlsZWQnKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgJ0ZhaWxlZCB0byBzYXZlIGFjaGlldmVtZW50Jyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvd0FkZFN1bW1hcnlNb2RhbCgpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1bS1tb2RhbC1rZXktaW5wdXQnKS52YWx1ZSAgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1bS1tb2RhbC10ZXh0LWlucHV0JykudmFsdWUgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1zdW0tbW9kYWwtdGl0bGUnKS50ZXh0Q29udGVudCA9ICdBZGQgUHJvZmVzc2lvbmFsIFN1bW1hcnknO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXN1bS1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBzZXRJbml0aWFsRm9jdXMoJ21hc3Rlci1zdW0tbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ21hc3Rlci1zdW0tbW9kYWwtb3ZlcmxheScpO1xufVxuXG5mdW5jdGlvbiBlZGl0TWFzdGVyU3VtbWFyeShvYmopIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1bS1tb2RhbC1rZXktaW5wdXQnKS52YWx1ZSAgPSBvYmoua2V5ICB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1bS1tb2RhbC10ZXh0LWlucHV0JykudmFsdWUgPSBvYmoudGV4dCB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1zdW0tbW9kYWwtdGl0bGUnKS50ZXh0Q29udGVudCA9ICdFZGl0IFByb2Zlc3Npb25hbCBTdW1tYXJ5JztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1zdW0tbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgc2V0SW5pdGlhbEZvY3VzKCdtYXN0ZXItc3VtLW1vZGFsLW92ZXJsYXknKTtcbiAgdHJhcEZvY3VzKCdtYXN0ZXItc3VtLW1vZGFsLW92ZXJsYXknKTtcbn1cblxuZnVuY3Rpb24gY2xvc2VNYXN0ZXJTdW1Nb2RhbCgpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1zdW0tbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHJlc3RvcmVGb2N1cygpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzYXZlTWFzdGVyU3VtbWFyeSgpIHtcbiAgY29uc3Qga2V5ICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdW0tbW9kYWwta2V5LWlucHV0JykudmFsdWUudHJpbSgpO1xuICBjb25zdCB0ZXh0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1bS1tb2RhbC10ZXh0LWlucHV0JykudmFsdWUudHJpbSgpO1xuICBpZiAoIWtleSB8fCAhdGV4dCkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI2QTBcdUZFMEYgVmFsaWRhdGlvbicsICdCb3RoIEtleSBhbmQgU3VtbWFyeSB0ZXh0IGFyZSByZXF1aXJlZC4nKTtcbiAgICByZXR1cm47XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS91cGRhdGUtc3VtbWFyeScsIHtcbiAgICAgIG1ldGhvZDogICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogICAgSlNPTi5zdHJpbmdpZnkoeyBrZXksIHRleHQgfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEub2spIHtcbiAgICAgIGNsb3NlTWFzdGVyU3VtTW9kYWwoKTtcbiAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ1Byb2Zlc3Npb25hbCBTdW1tYXJpZXMnLCBkYXRhLmFjdGlvbiB8fCAndXBkYXRlZCcpO1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjcwNSBTYXZlZCcsIGBTdW1tYXJ5IFwiJHtrZXl9XCIgJHtkYXRhLmFjdGlvbn0uYCk7XG4gICAgICBhd2FpdCBwb3B1bGF0ZU1hc3RlclRhYigpOyAgLy8gcmVmcmVzaFxuICAgIH0gZWxzZSB7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgZGF0YS5lcnJvciB8fCAnU2F2ZSBmYWlsZWQnKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgJ0ZhaWxlZCB0byBzYXZlIHN1bW1hcnknKTtcbiAgfVxufVxuXG4vLyAtLS0tIFBlcnNvbmFsIEluZm8gbW9kYWwgaGFuZGxlcnMgLS0tLVxuXG5mdW5jdGlvbiBzaG93RWRpdFBlcnNvbmFsSW5mb01vZGFsKCkge1xuICBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS9mdWxsJylcbiAgICAudGhlbihyID0+IHIuanNvbigpKVxuICAgIC50aGVuKGRhdGEgPT4ge1xuICAgICAgY29uc3QgcGkgICAgICA9IGRhdGEucGVyc29uYWxfaW5mbyB8fCB7fTtcbiAgICAgIGNvbnN0IGNvbnRhY3QgPSBwaS5jb250YWN0IHx8IHt9O1xuICAgICAgY29uc3QgYWRkcmVzcyA9IGNvbnRhY3QuYWRkcmVzcyB8fCB7fTtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwaS1uYW1lLWlucHV0JykudmFsdWUgICAgPSBwaS5uYW1lIHx8ICcnO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BpLXRpdGxlLWlucHV0JykudmFsdWUgICA9IHBpLnRpdGxlIHx8IHBpLmhlYWRsaW5lIHx8ICcnO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BpLWVtYWlsLWlucHV0JykudmFsdWUgICA9IGNvbnRhY3QuZW1haWwgfHwgcGkuZW1haWwgfHwgJyc7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGktcGhvbmUtaW5wdXQnKS52YWx1ZSAgID0gY29udGFjdC5waG9uZSB8fCAnJztcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwaS1saW5rZWRpbi1pbnB1dCcpLnZhbHVlID0gY29udGFjdC5saW5rZWRpbiB8fCAnJztcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwaS13ZWJzaXRlLWlucHV0JykudmFsdWUgID0gY29udGFjdC53ZWJzaXRlIHx8ICcnO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BpLWNpdHktaW5wdXQnKS52YWx1ZSAgICA9IGFkZHJlc3MuY2l0eSB8fCAnJztcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwaS1zdGF0ZS1pbnB1dCcpLnZhbHVlICAgPSBhZGRyZXNzLnN0YXRlIHx8ICcnO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1waS1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICAgIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICAgIHNldEluaXRpYWxGb2N1cygnbWFzdGVyLXBpLW1vZGFsLW92ZXJsYXknKTtcbiAgICAgIHRyYXBGb2N1cygnbWFzdGVyLXBpLW1vZGFsLW92ZXJsYXknKTtcbiAgICB9KVxuICAgIC5jYXRjaCgoKSA9PiBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgJ0NvdWxkIG5vdCBsb2FkIHBlcnNvbmFsIGluZm8nKSk7XG59XG5cbmZ1bmN0aW9uIGNsb3NlUGVyc29uYWxJbmZvTW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcGktbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHJlc3RvcmVGb2N1cygpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzYXZlUGVyc29uYWxJbmZvKCkge1xuICBjb25zdCBib2R5ID0ge1xuICAgIG5hbWU6ICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGktbmFtZS1pbnB1dCcpLnZhbHVlLnRyaW0oKSxcbiAgICB0aXRsZTogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BpLXRpdGxlLWlucHV0JykudmFsdWUudHJpbSgpLFxuICAgIGVtYWlsOiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGktZW1haWwtaW5wdXQnKS52YWx1ZS50cmltKCksXG4gICAgcGhvbmU6ICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwaS1waG9uZS1pbnB1dCcpLnZhbHVlLnRyaW0oKSxcbiAgICBsaW5rZWRpbjogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BpLWxpbmtlZGluLWlucHV0JykudmFsdWUudHJpbSgpLFxuICAgIHdlYnNpdGU6ICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGktd2Vic2l0ZS1pbnB1dCcpLnZhbHVlLnRyaW0oKSxcbiAgICBjaXR5OiAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BpLWNpdHktaW5wdXQnKS52YWx1ZS50cmltKCksXG4gICAgc3RhdGU6ICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwaS1zdGF0ZS1pbnB1dCcpLnZhbHVlLnRyaW0oKSxcbiAgfTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvcGVyc29uYWwtaW5mbycsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSwgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEub2spIHtcbiAgICAgIGNsb3NlUGVyc29uYWxJbmZvTW9kYWwoKTtcbiAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ1BlcnNvbmFsIEluZm9ybWF0aW9uJywgJ3VwZGF0ZWQnKTtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3MDUgU2F2ZWQnLCAnUGVyc29uYWwgaW5mb3JtYXRpb24gdXBkYXRlZC4nKTtcbiAgICAgIGF3YWl0IHBvcHVsYXRlTWFzdGVyVGFiKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCBkYXRhLmVycm9yIHx8ICdTYXZlIGZhaWxlZCcpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIHNhdmUgcGVyc29uYWwgaW5mbycpO1xuICB9XG59XG5cbi8vIC0tLS0gRXhwZXJpZW5jZSBtb2RhbCBoYW5kbGVycyAtLS0tXG5cbmZ1bmN0aW9uIHNob3dBZGRFeHBlcmllbmNlTW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtbW9kYWwtaWQnKS52YWx1ZSAgICAgICAgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC10aXRsZS1pbnB1dCcpLnZhbHVlICAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLWNvbXBhbnktaW5wdXQnKS52YWx1ZSAgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtY2l0eS1pbnB1dCcpLnZhbHVlICAgICAgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC1zdGF0ZS1pbnB1dCcpLnZhbHVlICAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLXN0YXJ0LWlucHV0JykudmFsdWUgICAgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtZW5kLWlucHV0JykudmFsdWUgICAgICAgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC10eXBlLWlucHV0JykudmFsdWUgICAgICA9ICdmdWxsX3RpbWUnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLWltcG9ydGFuY2UtaW5wdXQnKS52YWx1ZSA9ICc1JztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC10YWdzLWlucHV0JykudmFsdWUgICAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWV4cC1tb2RhbC10aXRsZScpLnRleHRDb250ZW50ID0gJ0FkZCBXb3JrIEV4cGVyaWVuY2UnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWV4cC1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgX21hc3RlckV4cE1vZGFsQWNoaWV2ZW1lbnRzID0gW107XG4gIF9yZW5kZXJFeHBBY2hpZXZlbWVudHNFZGl0b3IoKTtcbiAgX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBzZXRJbml0aWFsRm9jdXMoJ21hc3Rlci1leHAtbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ21hc3Rlci1leHAtbW9kYWwtb3ZlcmxheScpO1xufVxuXG4vLyBXb3JraW5nIGNvcHkgb2YgdGhlIGN1cnJlbnRseS1lZGl0ZWQgZXhwZXJpZW5jZSdzIGFjaGlldmVtZW50cyB3aGlsZSB0aGVcbi8vIG1vZGFsIGlzIG9wZW4gKEdBUC0xOSAxNi4xMSkuIGVkaXRNYXN0ZXJFeHBlcmllbmNlKCkgdGFrZXMgYW4gaWQgKG5vdCB0aGVcbi8vIGZ1bGwgb2JqZWN0KSBhbmQgbG9va3MgaXQgdXAgZnJvbSB3aW5kb3cuX21hc3RlckV4cGVyaWVuY2VGdWxsRGF0YSBcdTIwMTRcbi8vIGFjaGlldmVtZW50IHRleHQgY2FuIGNvbnRhaW4gcXVvdGVzL3VuaWNvZGUgdGhhdCB3b3VsZCBiZSBmcmFnaWxlIHRvXG4vLyBlbWJlZCBkaXJlY3RseSBpbnNpZGUgYW4gaW5saW5lIG9uY2xpY2sgYXR0cmlidXRlLlxubGV0IF9tYXN0ZXJFeHBNb2RhbEFjaGlldmVtZW50cyA9IFtdO1xuXG5mdW5jdGlvbiBfYWNoaWV2ZW1lbnRUZXh0KGEpIHtcbiAgcmV0dXJuIHR5cGVvZiBhID09PSAnc3RyaW5nJyA/IGEgOiAoYSAmJiBhLnRleHQpIHx8ICcnO1xufVxuXG5mdW5jdGlvbiBfcmVuZGVyRXhwQWNoaWV2ZW1lbnRzRWRpdG9yKCkge1xuICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLWFjaGlldmVtZW50cy1lZGl0b3ItbGlzdCcpO1xuICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuO1xuICBjb25zdCBsYXN0SWR4ID0gX21hc3RlckV4cE1vZGFsQWNoaWV2ZW1lbnRzLmxlbmd0aCAtIDE7XG4gIGNvbnRhaW5lci5pbm5lckhUTUwgPSBfbWFzdGVyRXhwTW9kYWxBY2hpZXZlbWVudHMubWFwKChhY2gsIGlkeCkgPT4gYFxuICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjZweDthbGlnbi1pdGVtczpjZW50ZXI7bWFyZ2luLWJvdHRvbTo2cHg7XCI+XG4gICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImVkaXQtaW5wdXQgZXhwLWFjaC10ZXh0LWlucHV0XCIgZGF0YS1pZHg9XCIke2lkeH1cIiBzdHlsZT1cImZsZXg6MTtcIlxuICAgICAgICAgIHZhbHVlPVwiJHtlc2NhcGVIdG1sKF9hY2hpZXZlbWVudFRleHQoYWNoKSl9XCIgYXJpYS1sYWJlbD1cIkFjaGlldmVtZW50ICR7aWR4ICsgMX0gdGV4dFwiIC8+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImljb24tYnRuXCIgb25jbGljaz1cIl9tb3ZlRXhwQWNoaWV2ZW1lbnQoJHtpZHh9LCAtMSlcIlxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJNb3ZlIGFjaGlldmVtZW50ICR7aWR4ICsgMX0gdXBcIiB0aXRsZT1cIk1vdmUgdXBcIiAke2lkeCA9PT0gMCA/ICdkaXNhYmxlZCcgOiAnJ30+XHUyMTkxPC9idXR0b24+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImljb24tYnRuXCIgb25jbGljaz1cIl9tb3ZlRXhwQWNoaWV2ZW1lbnQoJHtpZHh9LCAxKVwiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIk1vdmUgYWNoaWV2ZW1lbnQgJHtpZHggKyAxfSBkb3duXCIgdGl0bGU9XCJNb3ZlIGRvd25cIiAke2lkeCA9PT0gbGFzdElkeCA/ICdkaXNhYmxlZCcgOiAnJ30+XHUyMTkzPC9idXR0b24+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImljb24tYnRuXCIgb25jbGljaz1cIl9kZWxldGVFeHBBY2hpZXZlbWVudCgke2lkeH0pXCJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiRGVsZXRlIGFjaGlldmVtZW50ICR7aWR4ICsgMX1cIiB0aXRsZT1cIkRlbGV0ZVwiPlx1RDgzRFx1REREMVx1RkUwRjwvYnV0dG9uPlxuICAgIDwvZGl2PmApLmpvaW4oJycpIHx8ICc8cCBzdHlsZT1cImNvbG9yOiM5NGEzYjg7Zm9udC1zaXplOjAuODVlbTttYXJnaW46MCAwIDZweDtcIj5ObyBhY2hpZXZlbWVudHMgeWV0LjwvcD4nO1xufVxuXG4vLyBSZWFkIGFueSBpbi1wcm9ncmVzcyBlZGl0cyBvdXQgb2YgdGhlIGFjaGlldmVtZW50IHRleHQgaW5wdXRzIGJlZm9yZSBhXG4vLyByZW9yZGVyL2RlbGV0ZS9zYXZlIHJlYnVpbGRzIHRoZSBsaXN0IGZyb20gX21hc3RlckV4cE1vZGFsQWNoaWV2ZW1lbnRzIFx1MjAxNFxuLy8gb3RoZXJ3aXNlIGFuIHVuLXN1Ym1pdHRlZCB0ZXh0IGVkaXQgd291bGQgYmUgc2lsZW50bHkgbG9zdCBvbiByZS1yZW5kZXIuXG5mdW5jdGlvbiBfc3luY0V4cEFjaGlldmVtZW50c0Zyb21JbnB1dHMoKSB7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5leHAtYWNoLXRleHQtaW5wdXQnKS5mb3JFYWNoKChpbnB1dCkgPT4ge1xuICAgIGNvbnN0IGlkeCA9IHBhcnNlSW50KGlucHV0LmRhdGFzZXQuaWR4LCAxMCk7XG4gICAgY29uc3QgYWNoID0gX21hc3RlckV4cE1vZGFsQWNoaWV2ZW1lbnRzW2lkeF07XG4gICAgaWYgKHR5cGVvZiBhY2ggPT09ICdzdHJpbmcnIHx8IGFjaCA9PSBudWxsKSB7XG4gICAgICBfbWFzdGVyRXhwTW9kYWxBY2hpZXZlbWVudHNbaWR4XSA9IGlucHV0LnZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBhY2gudGV4dCA9IGlucHV0LnZhbHVlO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIF9hZGRFeHBBY2hpZXZlbWVudCgpIHtcbiAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLWFjaC1uZXctaW5wdXQnKTtcbiAgY29uc3QgdGV4dCA9IChpbnB1dC52YWx1ZSB8fCAnJykudHJpbSgpO1xuICBpZiAoIXRleHQpIHJldHVybjtcbiAgX3N5bmNFeHBBY2hpZXZlbWVudHNGcm9tSW5wdXRzKCk7XG4gIF9tYXN0ZXJFeHBNb2RhbEFjaGlldmVtZW50cy5wdXNoKHRleHQpO1xuICBpbnB1dC52YWx1ZSA9ICcnO1xuICBfcmVuZGVyRXhwQWNoaWV2ZW1lbnRzRWRpdG9yKCk7XG59XG5cbmZ1bmN0aW9uIF9tb3ZlRXhwQWNoaWV2ZW1lbnQoaWR4LCBkZWx0YSkge1xuICBfc3luY0V4cEFjaGlldmVtZW50c0Zyb21JbnB1dHMoKTtcbiAgY29uc3QgdGFyZ2V0ID0gaWR4ICsgZGVsdGE7XG4gIGlmICh0YXJnZXQgPCAwIHx8IHRhcmdldCA+PSBfbWFzdGVyRXhwTW9kYWxBY2hpZXZlbWVudHMubGVuZ3RoKSByZXR1cm47XG4gIGNvbnN0IFtpdGVtXSA9IF9tYXN0ZXJFeHBNb2RhbEFjaGlldmVtZW50cy5zcGxpY2UoaWR4LCAxKTtcbiAgX21hc3RlckV4cE1vZGFsQWNoaWV2ZW1lbnRzLnNwbGljZSh0YXJnZXQsIDAsIGl0ZW0pO1xuICBfcmVuZGVyRXhwQWNoaWV2ZW1lbnRzRWRpdG9yKCk7XG59XG5cbmZ1bmN0aW9uIF9kZWxldGVFeHBBY2hpZXZlbWVudChpZHgpIHtcbiAgX3N5bmNFeHBBY2hpZXZlbWVudHNGcm9tSW5wdXRzKCk7XG4gIF9tYXN0ZXJFeHBNb2RhbEFjaGlldmVtZW50cy5zcGxpY2UoaWR4LCAxKTtcbiAgX3JlbmRlckV4cEFjaGlldmVtZW50c0VkaXRvcigpO1xufVxuXG5mdW5jdGlvbiBlZGl0TWFzdGVyRXhwZXJpZW5jZShpZCkge1xuICBjb25zdCBleHAgPSAod2luZG93Ll9tYXN0ZXJFeHBlcmllbmNlRnVsbERhdGEgfHwgW10pLmZpbmQoKGUpID0+IGUuaWQgPT09IGlkKTtcbiAgaWYgKCFleHApIHtcbiAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgJ0NvdWxkIG5vdCBmaW5kIHRoYXQgZXhwZXJpZW5jZSBlbnRyeSBcdTIwMTQgdHJ5IHJlZnJlc2hpbmcgdGhlIHRhYi4nKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgbG9jID0gZXhwLmxvY2F0aW9uIHx8IHt9O1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLW1vZGFsLWlkJykudmFsdWUgICAgICAgICA9IGV4cC5pZCB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC10aXRsZS1pbnB1dCcpLnZhbHVlICAgICAgPSBleHAudGl0bGUgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtY29tcGFueS1pbnB1dCcpLnZhbHVlICAgID0gZXhwLmNvbXBhbnkgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtY2l0eS1pbnB1dCcpLnZhbHVlICAgICAgID0gbG9jLmNpdHkgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtc3RhdGUtaW5wdXQnKS52YWx1ZSAgICAgID0gbG9jLnN0YXRlIHx8ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLXN0YXJ0LWlucHV0JykudmFsdWUgICAgICA9IGV4cC5zdGFydF9kYXRlIHx8ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLWVuZC1pbnB1dCcpLnZhbHVlICAgICAgICA9IGV4cC5lbmRfZGF0ZSB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC10eXBlLWlucHV0JykudmFsdWUgICAgICAgPSBleHAuZW1wbG95bWVudF90eXBlIHx8ICdmdWxsX3RpbWUnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLWltcG9ydGFuY2UtaW5wdXQnKS52YWx1ZSAgPSBleHAuaW1wb3J0YW5jZSB8fCA1O1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLXRhZ3MtaW5wdXQnKS52YWx1ZSAgICAgICA9IHR5cGVvZiBleHAudGFncyA9PT0gJ3N0cmluZycgPyBleHAudGFnc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoZXhwLnRhZ3MgfHwgW10pLmpvaW4oJywgJyk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItZXhwLW1vZGFsLXRpdGxlJykudGV4dENvbnRlbnQgPSAnRWRpdCBXb3JrIEV4cGVyaWVuY2UnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWV4cC1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgX21hc3RlckV4cE1vZGFsQWNoaWV2ZW1lbnRzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShleHAuYWNoaWV2ZW1lbnRzIHx8IFtdKSk7XG4gIF9yZW5kZXJFeHBBY2hpZXZlbWVudHNFZGl0b3IoKTtcbiAgX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBzZXRJbml0aWFsRm9jdXMoJ21hc3Rlci1leHAtbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ21hc3Rlci1leHAtbW9kYWwtb3ZlcmxheScpO1xufVxuXG5mdW5jdGlvbiBjbG9zZUV4cGVyaWVuY2VNb2RhbCgpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1leHAtbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHJlc3RvcmVGb2N1cygpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzYXZlTWFzdGVyRXhwZXJpZW5jZSgpIHtcbiAgY29uc3QgaWQgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC1tb2RhbC1pZCcpLnZhbHVlLnRyaW0oKTtcbiAgY29uc3QgdGl0bGUgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC10aXRsZS1pbnB1dCcpLnZhbHVlLnRyaW0oKTtcbiAgY29uc3QgY29tcGFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtY29tcGFueS1pbnB1dCcpLnZhbHVlLnRyaW0oKTtcbiAgaWYgKCF0aXRsZSB8fCAhY29tcGFueSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI2QTBcdUZFMEYgVmFsaWRhdGlvbicsICdKb2IgdGl0bGUgYW5kIGNvbXBhbnkgYXJlIHJlcXVpcmVkLicpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB0YWdzUmF3ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC10YWdzLWlucHV0JykudmFsdWU7XG4gIF9zeW5jRXhwQWNoaWV2ZW1lbnRzRnJvbUlucHV0cygpO1xuICBjb25zdCBleHBEYXRhID0ge1xuICAgIHRpdGxlLCBjb21wYW55LFxuICAgIGNpdHk6ICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC1jaXR5LWlucHV0JykudmFsdWUudHJpbSgpLFxuICAgIHN0YXRlOiAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC1zdGF0ZS1pbnB1dCcpLnZhbHVlLnRyaW0oKSxcbiAgICBzdGFydF9kYXRlOiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtc3RhcnQtaW5wdXQnKS52YWx1ZS50cmltKCksXG4gICAgZW5kX2RhdGU6ICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLWVuZC1pbnB1dCcpLnZhbHVlLnRyaW0oKSxcbiAgICBlbXBsb3ltZW50X3R5cGU6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtdHlwZS1pbnB1dCcpLnZhbHVlLFxuICAgIGltcG9ydGFuY2U6ICAgICAgcGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC1pbXBvcnRhbmNlLWlucHV0JykudmFsdWUsIDEwKSB8fCA1LFxuICAgIHRhZ3M6ICAgICAgICAgICAgdGFnc1Jhdy5zcGxpdCgnLCcpLm1hcChzID0+IHMudHJpbSgpKS5maWx0ZXIoQm9vbGVhbiksXG4gICAgYWNoaWV2ZW1lbnRzOiAgICBfbWFzdGVyRXhwTW9kYWxBY2hpZXZlbWVudHMsXG4gIH07XG4gIGNvbnN0IGFjdGlvbiA9IGlkID8gJ3VwZGF0ZScgOiAnYWRkJztcbiAgY29uc3QgYm9keSAgID0gYWN0aW9uID09PSAndXBkYXRlJyA/IHsgYWN0aW9uLCBpZCwgZXhwZXJpZW5jZTogZXhwRGF0YSB9IDogeyBhY3Rpb24sIGV4cGVyaWVuY2U6IGV4cERhdGEgfTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvZXhwZXJpZW5jZScsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSwgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEub2spIHtcbiAgICAgIGNsb3NlRXhwZXJpZW5jZU1vZGFsKCk7XG4gICAgICBfc2V0TWFzdGVyQ2hhbmdlTm90aWNlKCdXb3JrIEV4cGVyaWVuY2UnLCBkYXRhLmFjdGlvbiB8fCAndXBkYXRlZCcpO1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjcwNSBTYXZlZCcsIGBFeHBlcmllbmNlIFwiJHt0aXRsZX1cIiAke2RhdGEuYWN0aW9ufS5gKTtcbiAgICAgIGF3YWl0IHBvcHVsYXRlTWFzdGVyVGFiKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCBkYXRhLmVycm9yIHx8ICdTYXZlIGZhaWxlZCcpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIHNhdmUgZXhwZXJpZW5jZScpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZU1hc3RlckV4cGVyaWVuY2UoaWQsIHRpdGxlKSB7XG4gIHNob3dDb25maXJtTW9kYWwoXG4gICAgJ1x1RDgzRFx1REREMVx1RkUwRiBEZWxldGUgRXhwZXJpZW5jZScsXG4gICAgYERlbGV0ZSBcIiR7dGl0bGV9XCI/IFRoaXMgY2Fubm90IGJlIHVuZG9uZS5gLFxuICAgIGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS9leHBlcmllbmNlJywge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGFjdGlvbjogJ2RlbGV0ZScsIGlkIH0pLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICAgICAgX3NldE1hc3RlckNoYW5nZU5vdGljZSgnV29yayBFeHBlcmllbmNlJywgZGF0YS5hY3Rpb24gfHwgJ2RlbGV0ZWQnKTtcbiAgICAgICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzA1IERlbGV0ZWQnLCBgRXhwZXJpZW5jZSBcIiR7dGl0bGV9XCIgcmVtb3ZlZC5gKTtcbiAgICAgICAgICBhd2FpdCBwb3B1bGF0ZU1hc3RlclRhYigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCBkYXRhLmVycm9yIHx8ICdEZWxldGUgZmFpbGVkJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsICdGYWlsZWQgdG8gZGVsZXRlIGV4cGVyaWVuY2UnKTtcbiAgICAgIH1cbiAgICB9XG4gICk7XG59XG5cbi8vIC0tLS0gU2tpbGwgbW9kYWwgaGFuZGxlcnMgLS0tLVxuXG5mdW5jdGlvbiBzaG93QWRkU2tpbGxNb2RhbChjYXRlZ29yeUtleSwgaXNGbGF0KSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1tb2RhbC1jYXRlZ29yeScpLnZhbHVlID0gY2F0ZWdvcnlLZXkgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1tb2RhbC1pcy1mbGF0JykudmFsdWUgID0gaXNGbGF0ID8gJzEnIDogJzAnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtbW9kYWwtb3JpZ2luYWwtbmFtZScpLnZhbHVlID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1uYW1lLWlucHV0JykudmFsdWUgICAgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1leHBlcmllbmNlcy1pbnB1dCcpLnZhbHVlID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1hbGlhc2VzLWlucHV0JykudmFsdWUgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC15ZWFycy1pbnB1dCcpLnZhbHVlICAgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItc2tpbGwtbW9kYWwtdGl0bGUnKS50ZXh0Q29udGVudCA9ICdBZGQgU2tpbGwnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXNraWxsLXNhdmUtYnRuJykudGV4dENvbnRlbnQgPSAnQWRkIFNraWxsJztcbiAgY29uc3QgaGludHMgPSAod2luZG93Ll9tYXN0ZXJFeHBlcmllbmNlT3B0aW9ucyB8fCBbXSlcbiAgICAuc2xpY2UoMCwgOClcbiAgICAubWFwKCh4KSA9PiBgJHt4LmlkfSAoJHt4LmxhYmVsfSlgKVxuICAgIC5qb2luKCcgXHUwMEI3ICcpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtZXhwZXJpZW5jZS1oaW50cycpLnRleHRDb250ZW50ID0gaGludHMgPyBgQXZhaWxhYmxlOiAke2hpbnRzfWAgOiAnJztcbiAgY29uc3QgY2F0Um93ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NraWxsLWNhdGVnb3J5LXJvdycpO1xuICBpZiAoY2F0ZWdvcnlLZXkpIHtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtY2F0ZWdvcnktZGlzcGxheScpLnRleHRDb250ZW50ID0gY2F0ZWdvcnlLZXk7XG4gICAgY2F0Um93LnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgfSBlbHNlIHtcbiAgICBjYXRSb3cuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgfVxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXNraWxsLW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICBfZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIHNldEluaXRpYWxGb2N1cygnbWFzdGVyLXNraWxsLW1vZGFsLW92ZXJsYXknKTtcbiAgdHJhcEZvY3VzKCdtYXN0ZXItc2tpbGwtbW9kYWwtb3ZlcmxheScpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtbmFtZS1pbnB1dCcpLmZvY3VzKCk7XG59XG5cbmZ1bmN0aW9uIGVkaXRNYXN0ZXJTa2lsbChza2lsbE9iaiwgY2F0ZWdvcnlLZXksIGlzRmxhdCkge1xuICBjb25zdCBuYW1lID0gdHlwZW9mIHNraWxsT2JqID09PSAnc3RyaW5nJyA/IHNraWxsT2JqIDogKHNraWxsT2JqPy5uYW1lIHx8ICcnKTtcbiAgY29uc3QgZXhwZXJpZW5jZXMgPSBBcnJheS5pc0FycmF5KHNraWxsT2JqPy5leHBlcmllbmNlcykgPyBza2lsbE9iai5leHBlcmllbmNlcyA6IFtdO1xuICBjb25zdCBhbGlhc2VzID0gQXJyYXkuaXNBcnJheShza2lsbE9iaj8uYWxpYXNlcykgPyBza2lsbE9iai5hbGlhc2VzIDogW107XG4gIGNvbnN0IHllYXJzID0gKHR5cGVvZiBza2lsbE9iaiA9PT0gJ29iamVjdCcgJiYgc2tpbGxPYmo/LnllYXJzICE9IG51bGwpID8gc2tpbGxPYmoueWVhcnMgOiAnJztcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtbW9kYWwtY2F0ZWdvcnknKS52YWx1ZSA9IGNhdGVnb3J5S2V5IHx8ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtbW9kYWwtaXMtZmxhdCcpLnZhbHVlICA9IGlzRmxhdCA/ICcxJyA6ICcwJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NraWxsLW1vZGFsLW9yaWdpbmFsLW5hbWUnKS52YWx1ZSA9IG5hbWU7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1uYW1lLWlucHV0JykudmFsdWUgPSBuYW1lO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtZXhwZXJpZW5jZXMtaW5wdXQnKS52YWx1ZSA9IGV4cGVyaWVuY2VzLmpvaW4oJywgJyk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1hbGlhc2VzLWlucHV0JykudmFsdWUgPSBhbGlhc2VzLmpvaW4oJywgJyk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC15ZWFycy1pbnB1dCcpLnZhbHVlID0geWVhcnM7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItc2tpbGwtbW9kYWwtdGl0bGUnKS50ZXh0Q29udGVudCA9ICdFZGl0IFNraWxsJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1za2lsbC1zYXZlLWJ0bicpLnRleHRDb250ZW50ID0gJ1NhdmUgU2tpbGwnO1xuXG4gIGNvbnN0IGhpbnRzID0gKHdpbmRvdy5fbWFzdGVyRXhwZXJpZW5jZU9wdGlvbnMgfHwgW10pXG4gICAgLnNsaWNlKDAsIDgpXG4gICAgLm1hcCgoeCkgPT4gYCR7eC5pZH0gKCR7eC5sYWJlbH0pYClcbiAgICAuam9pbignIFx1MDBCNyAnKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NraWxsLWV4cGVyaWVuY2UtaGludHMnKS50ZXh0Q29udGVudCA9IGhpbnRzID8gYEF2YWlsYWJsZTogJHtoaW50c31gIDogJyc7XG5cbiAgY29uc3QgY2F0Um93ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NraWxsLWNhdGVnb3J5LXJvdycpO1xuICBpZiAoY2F0ZWdvcnlLZXkpIHtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtY2F0ZWdvcnktZGlzcGxheScpLnRleHRDb250ZW50ID0gY2F0ZWdvcnlLZXk7XG4gICAgY2F0Um93LnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgfSBlbHNlIHtcbiAgICBjYXRSb3cuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgfVxuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItc2tpbGwtbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgc2V0SW5pdGlhbEZvY3VzKCdtYXN0ZXItc2tpbGwtbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ21hc3Rlci1za2lsbC1tb2RhbC1vdmVybGF5Jyk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1uYW1lLWlucHV0JykuZm9jdXMoKTtcbn1cblxuZnVuY3Rpb24gY2xvc2VTa2lsbE1vZGFsKCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXNraWxsLW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICByZXN0b3JlRm9jdXMoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZU1hc3RlclNraWxsKCkge1xuICBjb25zdCBza2lsbCAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1uYW1lLWlucHV0JykudmFsdWUudHJpbSgpO1xuICBjb25zdCBjYXRlZ29yeSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1tb2RhbC1jYXRlZ29yeScpLnZhbHVlLnRyaW0oKTtcbiAgY29uc3QgaXNGbGF0ICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtbW9kYWwtaXMtZmxhdCcpLnZhbHVlID09PSAnMSc7XG4gIGNvbnN0IG9yaWdpbmFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NraWxsLW1vZGFsLW9yaWdpbmFsLW5hbWUnKS52YWx1ZS50cmltKCk7XG4gIGNvbnN0IGV4cGVyaWVuY2VzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NraWxsLWV4cGVyaWVuY2VzLWlucHV0JykudmFsdWVcbiAgICAuc3BsaXQoJywnKVxuICAgIC5tYXAoKHMpID0+IHMudHJpbSgpKVxuICAgIC5maWx0ZXIoQm9vbGVhbik7XG4gIGNvbnN0IGFsaWFzZXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtYWxpYXNlcy1pbnB1dCcpLnZhbHVlXG4gICAgLnNwbGl0KCcsJylcbiAgICAubWFwKChzKSA9PiBzLnRyaW0oKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pO1xuICBjb25zdCB5ZWFyc1JhdyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC15ZWFycy1pbnB1dCcpLnZhbHVlLnRyaW0oKTtcbiAgY29uc3QgeWVhcnMgPSB5ZWFyc1JhdyA9PT0gJycgPyBudWxsIDogcGFyc2VGbG9hdCh5ZWFyc1Jhdyk7XG4gIGlmICghc2tpbGwpIHtcbiAgICBzaG93QWxlcnRNb2RhbCgnXHUyNkEwXHVGRTBGIFZhbGlkYXRpb24nLCAnU2tpbGwgbmFtZSBpcyByZXF1aXJlZC4nKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHllYXJzICE9PSBudWxsICYmICFOdW1iZXIuaXNGaW5pdGUoeWVhcnMpKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjZBMFx1RkUwRiBWYWxpZGF0aW9uJywgJ1llYXJzIG9mIGV4cGVyaWVuY2UgbXVzdCBiZSBhIGZpbml0ZSBudW1iZXIuJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGlzVXBkYXRlID0gQm9vbGVhbihvcmlnaW5hbCk7XG4gIGNvbnN0IGJhc2VCb2R5ID0ge1xuICAgIGFjdGlvbjogaXNVcGRhdGUgPyAndXBkYXRlJyA6ICdhZGQnLFxuICAgIHNraWxsOiBpc1VwZGF0ZSA/IG9yaWdpbmFsIDogc2tpbGwsXG4gICAgLi4uKGlzVXBkYXRlID8geyBza2lsbF9uZXc6IHNraWxsIH0gOiB7fSksXG4gICAgZXhwZXJpZW5jZXMsXG4gICAgYWxpYXNlcyxcbiAgICB5ZWFycyxcbiAgfTtcbiAgY29uc3QgYm9keSA9IGlzRmxhdCA/IGJhc2VCb2R5IDogeyAuLi5iYXNlQm9keSwgY2F0ZWdvcnkgfTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvc2tpbGwnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBjbG9zZVNraWxsTW9kYWwoKTtcbiAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ1NraWxscycsIGRhdGEuYWN0aW9uIHx8ICd1cGRhdGVkJyk7XG4gICAgICBhd2FpdCBwb3B1bGF0ZU1hc3RlclRhYigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgZGF0YS5lcnJvciB8fCAnQ291bGQgbm90IGFkZCBza2lsbCcpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIGFkZCBza2lsbCcpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZU1hc3RlclNraWxsKHNraWxsLCBjYXRlZ29yeSwgaXNGbGF0KSB7XG4gIGNvbnN0IGJvZHkgPSBpc0ZsYXQgPyB7IGFjdGlvbjogJ2RlbGV0ZScsIHNraWxsIH0gOiB7IGFjdGlvbjogJ2RlbGV0ZScsIHNraWxsLCBjYXRlZ29yeSB9O1xuICBjb25zdCBzY29wZSA9IGlzRmxhdCA/ICdTa2lsbHMnIDogYFNraWxscyBcdTIxOTIgJHtjYXRlZ29yeX1gO1xuICBzaG93Q29uZmlybU1vZGFsKFxuICAgICdcdUQ4M0RcdURERDFcdUZFMEYgRGVsZXRlIFNraWxsJyxcbiAgICBgRGVsZXRlIHNraWxsIFwiJHtza2lsbH1cIiBmcm9tICR7c2NvcGV9PyBUaGlzIGNhbm5vdCBiZSB1bmRvbmUuYCxcbiAgICBhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvc2tpbGwnLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LCBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICBpZiAoZGF0YS5vaykge1xuICAgICAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ1NraWxscycsIGRhdGEuYWN0aW9uIHx8ICd1cGRhdGVkJyk7XG4gICAgICAgICAgYXdhaXQgcG9wdWxhdGVNYXN0ZXJUYWIoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgZGF0YS5lcnJvciB8fCAnQ291bGQgbm90IHJlbW92ZSBza2lsbCcpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIHJlbW92ZSBza2lsbCcpO1xuICAgICAgfVxuICAgIH1cbiAgKTtcbn1cblxuLy8gLS0tLSBFZHVjYXRpb24gbW9kYWwgaGFuZGxlcnMgLS0tLVxuXG5mdW5jdGlvbiBzaG93QWRkRWR1Y2F0aW9uTW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtbW9kYWwtaWR4JykudmFsdWUgICAgICAgICAgICA9ICctMSc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtZGVncmVlLWlucHV0JykudmFsdWUgICAgICAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LWZpZWxkLWlucHV0JykudmFsdWUgICAgICAgICAgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkdS1pbnN0aXR1dGlvbi1pbnB1dCcpLnZhbHVlICAgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtY2l0eS1pbnB1dCcpLnZhbHVlICAgICAgICAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LXN0YXRlLWlucHV0JykudmFsdWUgICAgICAgICAgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkdS1zdGFydC15ZWFyLWlucHV0JykudmFsdWUgICAgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtZW5kLXllYXItaW5wdXQnKS52YWx1ZSAgICAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWVkdS1tb2RhbC10aXRsZScpLnRleHRDb250ZW50ID0gJ0FkZCBFZHVjYXRpb24nO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWVkdS1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBzZXRJbml0aWFsRm9jdXMoJ21hc3Rlci1lZHUtbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ21hc3Rlci1lZHUtbW9kYWwtb3ZlcmxheScpO1xufVxuXG5mdW5jdGlvbiBlZGl0TWFzdGVyRWR1Y2F0aW9uKGVkdSwgaWR4KSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtbW9kYWwtaWR4JykudmFsdWUgICAgICAgICA9IGlkeDtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkdS1kZWdyZWUtaW5wdXQnKS52YWx1ZSAgICAgID0gZWR1LmRlZ3JlZSB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkdS1maWVsZC1pbnB1dCcpLnZhbHVlICAgICAgID0gZWR1LmZpZWxkIHx8ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LWluc3RpdHV0aW9uLWlucHV0JykudmFsdWUgPSBlZHUuaW5zdGl0dXRpb24gfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtY2l0eS1pbnB1dCcpLnZhbHVlICAgICAgICA9IGVkdS5jaXR5IHx8ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LXN0YXRlLWlucHV0JykudmFsdWUgICAgICAgPSBlZHUuc3RhdGUgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtc3RhcnQteWVhci1pbnB1dCcpLnZhbHVlICA9IGVkdS5zdGFydF95ZWFyIHx8ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LWVuZC15ZWFyLWlucHV0JykudmFsdWUgICAgPSBlZHUuZW5kX3llYXIgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItZWR1LW1vZGFsLXRpdGxlJykudGV4dENvbnRlbnQgPSAnRWRpdCBFZHVjYXRpb24nO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWVkdS1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBzZXRJbml0aWFsRm9jdXMoJ21hc3Rlci1lZHUtbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ21hc3Rlci1lZHUtbW9kYWwtb3ZlcmxheScpO1xufVxuXG5mdW5jdGlvbiBjbG9zZUVkdWNhdGlvbk1vZGFsKCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWVkdS1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgcmVzdG9yZUZvY3VzKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNhdmVNYXN0ZXJFZHVjYXRpb24oKSB7XG4gIGNvbnN0IGlkeCAgICAgPSBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LW1vZGFsLWlkeCcpLnZhbHVlLCAxMCk7XG4gIGNvbnN0IGRlZ3JlZSAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LWRlZ3JlZS1pbnB1dCcpLnZhbHVlLnRyaW0oKTtcbiAgY29uc3QgaW5zdGl0dXRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LWluc3RpdHV0aW9uLWlucHV0JykudmFsdWUudHJpbSgpO1xuICBpZiAoIWRlZ3JlZSB8fCAhaW5zdGl0dXRpb24pIHtcbiAgICBzaG93QWxlcnRNb2RhbCgnXHUyNkEwXHVGRTBGIFZhbGlkYXRpb24nLCAnRGVncmVlIGFuZCBpbnN0aXR1dGlvbiBhcmUgcmVxdWlyZWQuJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGFjdGlvbiA9IGlkeCA+PSAwID8gJ3VwZGF0ZScgOiAnYWRkJztcbiAgY29uc3QgYm9keSA9IHtcbiAgICBhY3Rpb24sXG4gICAgZGVncmVlLFxuICAgIGZpZWxkOiAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LWZpZWxkLWlucHV0JykudmFsdWUudHJpbSgpLFxuICAgIGluc3RpdHV0aW9uLFxuICAgIGNpdHk6ICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LWNpdHktaW5wdXQnKS52YWx1ZS50cmltKCksXG4gICAgc3RhdGU6ICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtc3RhdGUtaW5wdXQnKS52YWx1ZS50cmltKCksXG4gICAgc3RhcnRfeWVhcjogIHBhcnNlSW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtc3RhcnQteWVhci1pbnB1dCcpLnZhbHVlLCAxMCkgfHwgbnVsbCxcbiAgICBlbmRfeWVhcjogICAgcGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkdS1lbmQteWVhci1pbnB1dCcpLnZhbHVlLCAxMCkgfHwgbnVsbCxcbiAgICAuLi4oYWN0aW9uID09PSAndXBkYXRlJyA/IHsgaWR4IH0gOiB7fSksXG4gIH07XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL2VkdWNhdGlvbicsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSwgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEub2spIHtcbiAgICAgIGNsb3NlRWR1Y2F0aW9uTW9kYWwoKTtcbiAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ0VkdWNhdGlvbicsIGRhdGEuYWN0aW9uIHx8ICd1cGRhdGVkJyk7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzA1IFNhdmVkJywgYEVkdWNhdGlvbiBcIiR7ZGVncmVlfSBcdTIwMTMgJHtpbnN0aXR1dGlvbn1cIiAke2RhdGEuYWN0aW9ufS5gKTtcbiAgICAgIGF3YWl0IHBvcHVsYXRlTWFzdGVyVGFiKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCBkYXRhLmVycm9yIHx8ICdTYXZlIGZhaWxlZCcpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIHNhdmUgZWR1Y2F0aW9uJyk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlTWFzdGVyRWR1Y2F0aW9uKGlkeCwgaW5zdGl0dXRpb24pIHtcbiAgc2hvd0NvbmZpcm1Nb2RhbChcbiAgICAnXHVEODNEXHVEREQxXHVGRTBGIERlbGV0ZSBFZHVjYXRpb24nLFxuICAgIGBEZWxldGUgXCIke2luc3RpdHV0aW9ufVwiPyBUaGlzIGNhbm5vdCBiZSB1bmRvbmUuYCxcbiAgICBhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvZWR1Y2F0aW9uJywge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGFjdGlvbjogJ2RlbGV0ZScsIGlkeCB9KSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICBpZiAoZGF0YS5vaykge1xuICAgICAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ0VkdWNhdGlvbicsIGRhdGEuYWN0aW9uIHx8ICdkZWxldGVkJyk7XG4gICAgICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjcwNSBEZWxldGVkJywgYEVkdWNhdGlvbiBlbnRyeSByZW1vdmVkLmApO1xuICAgICAgICAgIGF3YWl0IHBvcHVsYXRlTWFzdGVyVGFiKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsIGRhdGEuZXJyb3IgfHwgJ0RlbGV0ZSBmYWlsZWQnKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgJ0ZhaWxlZCB0byBkZWxldGUgZWR1Y2F0aW9uIGVudHJ5Jyk7XG4gICAgICB9XG4gICAgfVxuICApO1xufVxuXG4vLyAtLS0tIEF3YXJkIG1vZGFsIGhhbmRsZXJzIC0tLS1cblxuZnVuY3Rpb24gc2hvd0FkZEF3YXJkTW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhd2FyZC1tb2RhbC1pZHgnKS52YWx1ZSAgICA9ICctMSc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhd2FyZC10aXRsZS1pbnB1dCcpLnZhbHVlICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXdhcmQteWVhci1pbnB1dCcpLnZhbHVlICAgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F3YXJkLWRlc2MtaW5wdXQnKS52YWx1ZSAgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhd2FyZC1yZWxldmFudC1pbnB1dCcpLnZhbHVlID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItYXdhcmQtbW9kYWwtdGl0bGUnKS50ZXh0Q29udGVudCA9ICdBZGQgQXdhcmQgLyBIb25vdXInO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWF3YXJkLW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICBfZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIHNldEluaXRpYWxGb2N1cygnbWFzdGVyLWF3YXJkLW1vZGFsLW92ZXJsYXknKTtcbiAgdHJhcEZvY3VzKCdtYXN0ZXItYXdhcmQtbW9kYWwtb3ZlcmxheScpO1xufVxuXG5mdW5jdGlvbiBlZGl0TWFzdGVyQXdhcmQoYXdhcmQsIGlkeCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXdhcmQtbW9kYWwtaWR4JykudmFsdWUgICAgID0gaWR4O1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXdhcmQtdGl0bGUtaW5wdXQnKS52YWx1ZSAgID0gYXdhcmQudGl0bGUgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhd2FyZC15ZWFyLWlucHV0JykudmFsdWUgICAgPSBhd2FyZC55ZWFyIHx8ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXdhcmQtZGVzYy1pbnB1dCcpLnZhbHVlICAgID0gYXdhcmQuZGVzY3JpcHRpb24gfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhd2FyZC1yZWxldmFudC1pbnB1dCcpLnZhbHVlID0gdHlwZW9mIGF3YXJkLnJlbGV2YW50X2ZvciA9PT0gJ3N0cmluZydcbiAgICA/IGF3YXJkLnJlbGV2YW50X2ZvciA6IChhd2FyZC5yZWxldmFudF9mb3IgfHwgW10pLmpvaW4oJywgJyk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItYXdhcmQtbW9kYWwtdGl0bGUnKS50ZXh0Q29udGVudCA9ICdFZGl0IEF3YXJkIC8gSG9ub3VyJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1hd2FyZC1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBzZXRJbml0aWFsRm9jdXMoJ21hc3Rlci1hd2FyZC1tb2RhbC1vdmVybGF5Jyk7XG4gIHRyYXBGb2N1cygnbWFzdGVyLWF3YXJkLW1vZGFsLW92ZXJsYXknKTtcbn1cblxuZnVuY3Rpb24gY2xvc2VBd2FyZE1vZGFsKCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWF3YXJkLW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICByZXN0b3JlRm9jdXMoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZU1hc3RlckF3YXJkKCkge1xuICBjb25zdCBpZHggICA9IHBhcnNlSW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhd2FyZC1tb2RhbC1pZHgnKS52YWx1ZSwgMTApO1xuICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhd2FyZC10aXRsZS1pbnB1dCcpLnZhbHVlLnRyaW0oKTtcbiAgaWYgKCF0aXRsZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI2QTBcdUZFMEYgVmFsaWRhdGlvbicsICdBd2FyZCB0aXRsZSBpcyByZXF1aXJlZC4nKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgYWN0aW9uID0gaWR4ID49IDAgPyAndXBkYXRlJyA6ICdhZGQnO1xuICBjb25zdCByZWxldmFudFJhdyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhd2FyZC1yZWxldmFudC1pbnB1dCcpLnZhbHVlO1xuICBjb25zdCBib2R5ID0ge1xuICAgIGFjdGlvbiwgdGl0bGUsXG4gICAgeWVhcjogICAgICAgICBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXdhcmQteWVhci1pbnB1dCcpLnZhbHVlLCAxMCkgfHwgbnVsbCxcbiAgICBkZXNjcmlwdGlvbjogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhd2FyZC1kZXNjLWlucHV0JykudmFsdWUudHJpbSgpLFxuICAgIHJlbGV2YW50X2ZvcjogcmVsZXZhbnRSYXcuc3BsaXQoJywnKS5tYXAocyA9PiBzLnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pLFxuICAgIC4uLihhY3Rpb24gPT09ICd1cGRhdGUnID8geyBpZHggfSA6IHt9KSxcbiAgfTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvYXdhcmQnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBjbG9zZUF3YXJkTW9kYWwoKTtcbiAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ0F3YXJkcyAmIEhvbm91cnMnLCBkYXRhLmFjdGlvbiB8fCAndXBkYXRlZCcpO1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjcwNSBTYXZlZCcsIGBBd2FyZCBcIiR7dGl0bGV9XCIgJHtkYXRhLmFjdGlvbn0uYCk7XG4gICAgICBhd2FpdCBwb3B1bGF0ZU1hc3RlclRhYigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgZGF0YS5lcnJvciB8fCAnU2F2ZSBmYWlsZWQnKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgJ0ZhaWxlZCB0byBzYXZlIGF3YXJkJyk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlTWFzdGVyQXdhcmQoaWR4LCB0aXRsZSkge1xuICBzaG93Q29uZmlybU1vZGFsKFxuICAgICdcdUQ4M0RcdURERDFcdUZFMEYgRGVsZXRlIEF3YXJkJyxcbiAgICBgRGVsZXRlIFwiJHt0aXRsZX1cIj8gVGhpcyBjYW5ub3QgYmUgdW5kb25lLmAsXG4gICAgYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL2F3YXJkJywge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGFjdGlvbjogJ2RlbGV0ZScsIGlkeCB9KSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICBpZiAoZGF0YS5vaykge1xuICAgICAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ0F3YXJkcyAmIEhvbm91cnMnLCBkYXRhLmFjdGlvbiB8fCAnZGVsZXRlZCcpO1xuICAgICAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3MDUgRGVsZXRlZCcsIGBBd2FyZCByZW1vdmVkLmApO1xuICAgICAgICAgIGF3YWl0IHBvcHVsYXRlTWFzdGVyVGFiKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsIGRhdGEuZXJyb3IgfHwgJ0RlbGV0ZSBmYWlsZWQnKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgJ0ZhaWxlZCB0byBkZWxldGUgYXdhcmQnKTtcbiAgICAgIH1cbiAgICB9XG4gICk7XG59XG5cbi8vIC0tLS0gQ2VydGlmaWNhdGlvbiBDUlVEIGhhbmRsZXJzIC0tLS1cblxuZnVuY3Rpb24gc2hvd0FkZENlcnRpZmljYXRpb25Nb2RhbCgpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NlcnQtbW9kYWwtaWR4JykudmFsdWUgICAgPSAnLTEnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2VydC1uYW1lLWlucHV0JykudmFsdWUgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2VydC1pc3N1ZXItaW5wdXQnKS52YWx1ZSA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2VydC15ZWFyLWlucHV0JykudmFsdWUgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWNlcnQtbW9kYWwtdGl0bGUnKS50ZXh0Q29udGVudCA9ICdBZGQgQ2VydGlmaWNhdGlvbic7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItY2VydC1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBzZXRJbml0aWFsRm9jdXMoJ21hc3Rlci1jZXJ0LW1vZGFsLW92ZXJsYXknKTtcbiAgdHJhcEZvY3VzKCdtYXN0ZXItY2VydC1tb2RhbC1vdmVybGF5Jyk7XG59XG5cbmZ1bmN0aW9uIGVkaXRNYXN0ZXJDZXJ0aWZpY2F0aW9uKGNlcnQsIGlkeCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2VydC1tb2RhbC1pZHgnKS52YWx1ZSAgICA9IGlkeDtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NlcnQtbmFtZS1pbnB1dCcpLnZhbHVlICAgPSBjZXJ0Lm5hbWUgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjZXJ0LWlzc3Vlci1pbnB1dCcpLnZhbHVlID0gY2VydC5pc3N1ZXIgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjZXJ0LXllYXItaW5wdXQnKS52YWx1ZSAgID0gY2VydC55ZWFyIHx8ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWNlcnQtbW9kYWwtdGl0bGUnKS50ZXh0Q29udGVudCA9ICdFZGl0IENlcnRpZmljYXRpb24nO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWNlcnQtbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgc2V0SW5pdGlhbEZvY3VzKCdtYXN0ZXItY2VydC1tb2RhbC1vdmVybGF5Jyk7XG4gIHRyYXBGb2N1cygnbWFzdGVyLWNlcnQtbW9kYWwtb3ZlcmxheScpO1xufVxuXG5mdW5jdGlvbiBjbG9zZUNlcnRpZmljYXRpb25Nb2RhbCgpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1jZXJ0LW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICByZXN0b3JlRm9jdXMoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZU1hc3RlckNlcnRpZmljYXRpb24oKSB7XG4gIGNvbnN0IGlkeCAgPSBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2VydC1tb2RhbC1pZHgnKS52YWx1ZSwgMTApO1xuICBjb25zdCBuYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NlcnQtbmFtZS1pbnB1dCcpLnZhbHVlLnRyaW0oKTtcbiAgaWYgKCFuYW1lKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjZBMFx1RkUwRiBWYWxpZGF0aW9uJywgJ0NlcnRpZmljYXRpb24gbmFtZSBpcyByZXF1aXJlZC4nKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgYWN0aW9uID0gaWR4ID49IDAgPyAndXBkYXRlJyA6ICdhZGQnO1xuICBjb25zdCBib2R5ID0ge1xuICAgIGFjdGlvbiwgbmFtZSxcbiAgICBpc3N1ZXI6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjZXJ0LWlzc3Vlci1pbnB1dCcpLnZhbHVlLnRyaW0oKSxcbiAgICB5ZWFyOiAgIHBhcnNlSW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjZXJ0LXllYXItaW5wdXQnKS52YWx1ZSwgMTApIHx8IG51bGwsXG4gICAgLi4uKGFjdGlvbiA9PT0gJ3VwZGF0ZScgPyB7IGlkeCB9IDoge30pLFxuICB9O1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS9jZXJ0aWZpY2F0aW9uJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LCBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgY2xvc2VDZXJ0aWZpY2F0aW9uTW9kYWwoKTtcbiAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ0NlcnRpZmljYXRpb25zJywgZGF0YS5hY3Rpb24gfHwgJ3VwZGF0ZWQnKTtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3MDUgU2F2ZWQnLCBgQ2VydGlmaWNhdGlvbiBcIiR7bmFtZX1cIiAke2RhdGEuYWN0aW9ufS5gKTtcbiAgICAgIGF3YWl0IHBvcHVsYXRlTWFzdGVyVGFiKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCBkYXRhLmVycm9yIHx8ICdTYXZlIGZhaWxlZCcpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIHNhdmUgY2VydGlmaWNhdGlvbicpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZU1hc3RlckNlcnRpZmljYXRpb24oaWR4LCBuYW1lKSB7XG4gIHNob3dDb25maXJtTW9kYWwoXG4gICAgJ1x1RDgzRFx1REREMVx1RkUwRiBEZWxldGUgQ2VydGlmaWNhdGlvbicsXG4gICAgYERlbGV0ZSBcIiR7bmFtZX1cIj8gVGhpcyBjYW5ub3QgYmUgdW5kb25lLmAsXG4gICAgYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL2NlcnRpZmljYXRpb24nLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgYWN0aW9uOiAnZGVsZXRlJywgaWR4IH0pLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICAgICAgX3NldE1hc3RlckNoYW5nZU5vdGljZSgnQ2VydGlmaWNhdGlvbnMnLCBkYXRhLmFjdGlvbiB8fCAnZGVsZXRlZCcpO1xuICAgICAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3MDUgRGVsZXRlZCcsIGBDZXJ0aWZpY2F0aW9uIHJlbW92ZWQuYCk7XG4gICAgICAgICAgYXdhaXQgcG9wdWxhdGVNYXN0ZXJUYWIoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgZGF0YS5lcnJvciB8fCAnRGVsZXRlIGZhaWxlZCcpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIGRlbGV0ZSBjZXJ0aWZpY2F0aW9uJyk7XG4gICAgICB9XG4gICAgfVxuICApO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgQmFja3VwIEhpc3RvcnkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIG9wZW5CYWNrdXBIaXN0b3J5TW9kYWwoKSB7XG4gIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgb3ZlcmxheS5pZCA9ICdiYWNrdXAtaGlzdG9yeS1vdmVybGF5JztcbiAgb3ZlcmxheS5zdHlsZS5jc3NUZXh0ID0gJ3Bvc2l0aW9uOmZpeGVkO2luc2V0OjA7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLDAuNSk7ei1pbmRleDoxMDAwMDtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7JztcbiAgb3ZlcmxheS5pbm5lckhUTUwgPSBgXG4gICAgPGRpdiByb2xlPVwiZGlhbG9nXCIgYXJpYS1tb2RhbD1cInRydWVcIiBhcmlhLWxhYmVsbGVkYnk9XCJiYWNrdXAtbW9kYWwtdGl0bGVcIlxuICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZmY7Ym9yZGVyLXJhZGl1czoxMHB4O3BhZGRpbmc6MjRweCAyOHB4O21heC13aWR0aDo1NjBweDt3aWR0aDo5NCU7XG4gICAgICAgICAgICAgICAgbWF4LWhlaWdodDo4MHZoO292ZXJmbG93LXk6YXV0bztib3gtc2hhZG93OjAgMjBweCA2MHB4IHJnYmEoMCwwLDAsMC4zKTtcIj5cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO21hcmdpbi1ib3R0b206MTZweDtcIj5cbiAgICAgICAgPGgzIGlkPVwiYmFja3VwLW1vZGFsLXRpdGxlXCIgc3R5bGU9XCJtYXJnaW46MDtmb250LXNpemU6MS4xZW07Y29sb3I6IzFlMjkzYjtcIj5cdUQ4M0RcdURENTAgQmFja3VwIEhpc3Rvcnk8L2gzPlxuICAgICAgICA8YnV0dG9uIGlkPVwiYmFja3VwLW1vZGFsLWNsb3NlXCIgc3R5bGU9XCJiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOm5vbmU7Zm9udC1zaXplOjEuM2VtO2N1cnNvcjpwb2ludGVyO2NvbG9yOiM2NDc0OGI7XCIgYXJpYS1sYWJlbD1cIkNsb3NlXCI+XHUyNzE1PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxwIHN0eWxlPVwiZm9udC1zaXplOjAuODhlbTtjb2xvcjojNjQ3NDhiO21hcmdpbi1ib3R0b206MTZweDtcIj5cbiAgICAgICAgQSBiYWNrdXAgaXMgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IGJlZm9yZSBldmVyeSBzYXZlLiBSZXN0b3Jpbmcgd2lsbCBwcmVzZXJ2ZSB0aGUgY3VycmVudCB2ZXJzaW9uIGFzIGEgbmV3IGJhY2t1cCBmaXJzdC5cbiAgICAgIDwvcD5cbiAgICAgIDxkaXYgaWQ9XCJiYWNrdXAtbGlzdC1ib2R5XCIgc3R5bGU9XCJmb250LXNpemU6MC45ZW07XCI+TG9hZGluZ1x1MjAyNjwvZGl2PlxuICAgIDwvZGl2PmA7XG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQob3ZlcmxheSk7XG4gIGlmICh0eXBlb2YgdHJhcEZvY3VzID09PSAnZnVuY3Rpb24nKSB0cmFwRm9jdXMoJ2JhY2t1cC1oaXN0b3J5LW92ZXJsYXknKTtcbiAgY29uc3QgY2xvc2UgPSAoKSA9PiB7IG92ZXJsYXkucmVtb3ZlKCk7IGlmICh0eXBlb2YgcmVzdG9yZUZvY3VzID09PSAnZnVuY3Rpb24nKSByZXN0b3JlRm9jdXMoKTsgfTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhY2t1cC1tb2RhbC1jbG9zZScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xvc2UpO1xuICBvdmVybGF5LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZSA9PiB7IGlmIChlLnRhcmdldCA9PT0gb3ZlcmxheSkgY2xvc2UoKTsgfSk7XG4gIG92ZXJsYXkuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGUgPT4geyBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSBjbG9zZSgpOyB9KTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL2hpc3RvcnknKTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBjb25zdCBib2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhY2t1cC1saXN0LWJvZHknKTtcbiAgICBpZiAoIWJvZHkpIHJldHVybjtcbiAgICBpZiAoIWRhdGEub2sgfHwgIWRhdGEuc25hcHNob3RzPy5sZW5ndGgpIHtcbiAgICAgIGJvZHkudGV4dENvbnRlbnQgPSAnTm8gYmFja3VwcyBmb3VuZC4nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByb3dzID0gZGF0YS5zbmFwc2hvdHMubWFwKHMgPT4ge1xuICAgICAgY29uc3QgZHQgPSBuZXcgRGF0ZShzLm10aW1lICogMTAwMCkudG9Mb2NhbGVTdHJpbmcoKTtcbiAgICAgIGNvbnN0IGtiID0gKHMuc2l6ZSAvIDEwMjQpLnRvRml4ZWQoMSk7XG4gICAgICByZXR1cm4gYDx0cj5cbiAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzo2cHggOHB4O2NvbG9yOiMxZTI5M2I7XCI+JHtlc2NhcGVIdG1sKGR0KX08L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOjZweCA4cHg7Y29sb3I6IzY0NzQ4Yjt3aGl0ZS1zcGFjZTpub3dyYXA7XCI+JHtrYn0gS0I8L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOjZweCA4cHg7XCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG4gc2Vjb25kYXJ5XCIgc3R5bGU9XCJwYWRkaW5nOjNweCAxMHB4O2ZvbnQtc2l6ZTowLjgyZW07XCJcbiAgICAgICAgICAgIG9uY2xpY2s9XCJyZXN0b3JlQmFja3VwKCR7SlNPTi5zdHJpbmdpZnkocy5maWxlbmFtZSl9KVwiPlJlc3RvcmU8L2J1dHRvbj5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvdHI+YDtcbiAgICB9KS5qb2luKCcnKTtcbiAgICBib2R5LmlubmVySFRNTCA9IGA8dGFibGUgc3R5bGU9XCJ3aWR0aDoxMDAlO2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTtcIj5cbiAgICAgIDx0aGVhZD48dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZTJlOGYwO1wiPlxuICAgICAgICA8dGggc3R5bGU9XCJwYWRkaW5nOjRweCA4cHg7dGV4dC1hbGlnbjpsZWZ0O2NvbG9yOiM0NzU1Njk7Zm9udC13ZWlnaHQ6NjAwO1wiPlNhdmVkPC90aD5cbiAgICAgICAgPHRoIHN0eWxlPVwicGFkZGluZzo0cHggOHB4O3RleHQtYWxpZ246bGVmdDtjb2xvcjojNDc1NTY5O2ZvbnQtd2VpZ2h0OjYwMDtcIj5TaXplPC90aD5cbiAgICAgICAgPHRoPjwvdGg+XG4gICAgICA8L3RyPjwvdGhlYWQ+XG4gICAgICA8dGJvZHk+JHtyb3dzfTwvdGJvZHk+XG4gICAgPC90YWJsZT5gO1xuICB9IGNhdGNoIChfKSB7XG4gICAgY29uc3QgYm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYWNrdXAtbGlzdC1ib2R5Jyk7XG4gICAgaWYgKGJvZHkpIGJvZHkudGV4dENvbnRlbnQgPSAnRmFpbGVkIHRvIGxvYWQgYmFja3VwIGhpc3RvcnkuJztcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZXN0b3JlQmFja3VwKGZpbGVuYW1lKSB7XG4gIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0ICh0eXBlb2YgY29uZmlybURpYWxvZyA9PT0gJ2Z1bmN0aW9uJ1xuICAgID8gY29uZmlybURpYWxvZygnUmVzdG9yZSB0aGlzIGJhY2t1cD8gVGhlIGN1cnJlbnQgdmVyc2lvbiB3aWxsIGJlIHNhdmVkIGFzIGEgbmV3IGJhY2t1cCBmaXJzdC4nKVxuICAgIDogUHJvbWlzZS5yZXNvbHZlKHdpbmRvdy5jb25maXJtKCdSZXN0b3JlIHRoaXMgYmFja3VwPyBUaGUgY3VycmVudCB2ZXJzaW9uIHdpbGwgYmUgc2F2ZWQgYXMgYSBuZXcgYmFja3VwIGZpcnN0LicpKSk7XG4gIGlmICghY29uZmlybWVkKSByZXR1cm47XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvcmVzdG9yZScsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGZpbGVuYW1lIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja3VwLWhpc3Rvcnktb3ZlcmxheScpPy5yZW1vdmUoKTtcbiAgICAgIGlmICh0eXBlb2YgcmVzdG9yZUZvY3VzID09PSAnZnVuY3Rpb24nKSByZXN0b3JlRm9jdXMoKTtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3MDUgUmVzdG9yZWQnLCAnTWFzdGVyIENWIHJlc3RvcmVkIGZyb20gYmFja3VwLiBSZWxvYWQgdGhlIHRhYiB0byBzZWUgdGhlIHVwZGF0ZWQgZGF0YS4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsIGRhdGEuZXJyb3IgfHwgJ1Jlc3RvcmUgZmFpbGVkLicpO1xuICAgIH1cbiAgfSBjYXRjaCAoXykge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIHJlc3RvcmUgYmFja3VwLicpO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBVbmRvIC8gUmVkbyAoR0FQLTE5IDE2LjcpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuLy8gU2luZ2xlLWxldmVsOiBVbmRvIHJlc3RvcmVzIHRoZSBtb3N0IHJlY2VudCBiYWNrdXAgc25hcHNob3QgKGkuZS4gdGhlXG4vLyBzdGF0ZSBiZWZvcmUgdGhlIGxhc3Qgc2F2ZSk7IFJlZG8gcmVzdG9yZXMgdGhlIHNhZmV0eSBiYWNrdXAgdGhlIHJlc3RvcmVcbi8vIGVuZHBvaW50IHRvb2sgb2YgdGhlIHByZS11bmRvIHN0YXRlLiBCb3RoIHJldXNlIHRoZSBleGlzdGluZ1xuLy8gL2FwaS9tYXN0ZXItZGF0YS9oaXN0b3J5ICsgL2FwaS9tYXN0ZXItZGF0YS9yZXN0b3JlIGVuZHBvaW50cyByYXRoZXIgdGhhblxuLy8gYWRkaW5nIG5ldyBiYWNrZW5kIHN1cmZhY2UgXHUyMDE0IHNlZSBfbWFzdGVyQ3ZSZWRvQmFja3VwIGFib3ZlIGZvciB0aGUgcmVzZXRcbi8vIGNvbnRyYWN0IHdpdGggcG9wdWxhdGVNYXN0ZXJUYWIoKS5cblxuYXN5bmMgZnVuY3Rpb24gdW5kb01hc3RlckRhdGFDaGFuZ2UoKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvaGlzdG9yeScpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmICghZGF0YS5vayB8fCAhZGF0YS5zbmFwc2hvdHM/Lmxlbmd0aCkge1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjEzOVx1RkUwRiBOb3RoaW5nIHRvIHVuZG8nLCAnTm8gYmFja3VwIHNuYXBzaG90cyBhcmUgYXZhaWxhYmxlIHlldC4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbW9zdFJlY2VudCA9IGRhdGEuc25hcHNob3RzWzBdOyAvLyBoaXN0b3J5IHJvdXRlIHJldHVybnMgbmV3ZXN0LWZpcnN0XG4gICAgY29uc3Qgd2hlbiA9IG5ldyBEYXRlKG1vc3RSZWNlbnQubXRpbWUgKiAxMDAwKS50b0xvY2FsZVN0cmluZygpO1xuICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0ICh0eXBlb2YgY29uZmlybURpYWxvZyA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgPyBjb25maXJtRGlhbG9nKGBVbmRvIHRoZSBtb3N0IHJlY2VudCBjaGFuZ2U/IFRoaXMgcmVzdG9yZXMgdGhlIHZlcnNpb24gc2F2ZWQgJHt3aGVufS4gVGhlIGN1cnJlbnQgdmVyc2lvbiB3aWxsIGJlIHNhdmVkIGFzIGEgbmV3IGJhY2t1cCBmaXJzdC5gKVxuICAgICAgOiBQcm9taXNlLnJlc29sdmUod2luZG93LmNvbmZpcm0oYFVuZG8gdGhlIG1vc3QgcmVjZW50IGNoYW5nZT8gVGhpcyByZXN0b3JlcyB0aGUgdmVyc2lvbiBzYXZlZCAke3doZW59LmApKSk7XG4gICAgaWYgKCFjb25maXJtZWQpIHJldHVybjtcblxuICAgIGNvbnN0IHJlc3RvcmVSZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS9yZXN0b3JlJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgZmlsZW5hbWU6IG1vc3RSZWNlbnQuZmlsZW5hbWUgfSksXG4gICAgfSk7XG4gICAgY29uc3QgcmVzdG9yZURhdGEgPSBhd2FpdCByZXN0b3JlUmVzLmpzb24oKTtcbiAgICBpZiAocmVzdG9yZURhdGEub2spIHtcbiAgICAgIC8vIE11c3QgYmUgc2V0ICpiZWZvcmUqIHBvcHVsYXRlTWFzdGVyVGFiKCkgcmVuZGVycyB0aGUgUmVkbyBidXR0b24sXG4gICAgICAvLyBub3QgYWZ0ZXIgXHUyMDE0IHRoZSBidXR0b24ncyBkaXNhYmxlZCBzdGF0ZSBpcyBiYWtlZCBpbnRvIHRoYXQgcmVuZGVyLlxuICAgICAgX21hc3RlckN2UmVkb0JhY2t1cCA9IHJlc3RvcmVEYXRhLnNhZmV0eV9iYWNrdXAgfHwgbnVsbDtcbiAgICAgIF9tYXN0ZXJDdlN1cHByZXNzUmVkb1Jlc2V0ID0gdHJ1ZTtcbiAgICAgIGF3YWl0IHBvcHVsYXRlTWFzdGVyVGFiKCk7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzA1IFVuZG9uZScsICdNYXN0ZXIgQ1YgcmV2ZXJ0ZWQgdG8gdGhlIHByZXZpb3VzIHNhdmVkIHZlcnNpb24uJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCByZXN0b3JlRGF0YS5lcnJvciB8fCAnVW5kbyBmYWlsZWQuJyk7XG4gICAgfVxuICB9IGNhdGNoIChfKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsICdGYWlsZWQgdG8gdW5kby4nKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZWRvTWFzdGVyRGF0YUNoYW5nZSgpIHtcbiAgaWYgKCFfbWFzdGVyQ3ZSZWRvQmFja3VwKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjEzOVx1RkUwRiBOb3RoaW5nIHRvIHJlZG8nLCAnVGhlcmUgaXMgbm8gdW5kb25lIGNoYW5nZSB0byByZXN0b3JlLicpO1xuICAgIHJldHVybjtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL3Jlc3RvcmUnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBmaWxlbmFtZTogX21hc3RlckN2UmVkb0JhY2t1cCB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgLy8gRGVsaWJlcmF0ZWx5IGRvIG5vdCByZS1hcm0gcmVkbyBcdTIwMTQgdGhpcyByZXN0b3JlIGNvbnN1bWVzIHRoZSByZWRvXG4gICAgICAvLyB0YXJnZXQsIGFuZCBwb3B1bGF0ZU1hc3RlclRhYigpJ3MgZGVmYXVsdCByZXNldCBjbGVhcnMgaXQuXG4gICAgICBhd2FpdCBwb3B1bGF0ZU1hc3RlclRhYigpO1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjcwNSBSZWRvbmUnLCAnTWFzdGVyIENWIHJlc3RvcmVkIHRvIHRoZSB2ZXJzaW9uIGJlZm9yZSB0aGUgdW5kby4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsIGRhdGEuZXJyb3IgfHwgJ1JlZG8gZmFpbGVkLicpO1xuICAgIH1cbiAgfSBjYXRjaCAoXykge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIHJlZG8uJyk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZXhwb3J0TWFzdGVyQ1YoKSB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2Vzc2lvbklkID0gd2luZG93Ll9jdXJyZW50U2Vzc2lvbklkO1xuICAgIGNvbnN0IHVybCA9IGAvYXBpL21hc3Rlci1kYXRhL2V4cG9ydCR7c2Vzc2lvbklkID8gYD9zZXNzaW9uX2lkPSR7c2Vzc2lvbklkfWAgOiAnJ31gO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgaWYgKCFyZXMub2spIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRXhwb3J0IGZhaWxlZCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBibG9iID0gYXdhaXQgcmVzLmJsb2IoKTtcbiAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgIGEuaHJlZiA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgYS5kb3dubG9hZCA9ICdNYXN0ZXJfQ1ZfRGF0YS5qc29uJztcbiAgICBhLmNsaWNrKCk7XG4gICAgVVJMLnJldm9rZU9iamVjdFVSTChhLmhyZWYpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsICdGYWlsZWQgdG8gZXhwb3J0IG1hc3RlciBDVicpO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBGdWxsIGRhdGEgcHJldmlldyAoR0FQLTE5IDE2LjE1KSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gb3BlbkZ1bGxEYXRhUHJldmlld01vZGFsKCkge1xuICBjb25zdCBvdmVybGF5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIG92ZXJsYXkuaWQgPSAnbWFzdGVyLWN2LXByZXZpZXctb3ZlcmxheSc7XG4gIG92ZXJsYXkuc3R5bGUuY3NzVGV4dCA9ICdwb3NpdGlvbjpmaXhlZDtpbnNldDowO2JhY2tncm91bmQ6cmdiYSgwLDAsMCwwLjUpO3otaW5kZXg6MTAwMDA7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyOyc7XG4gIG92ZXJsYXkuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgcm9sZT1cImRpYWxvZ1wiIGFyaWEtbW9kYWw9XCJ0cnVlXCIgYXJpYS1sYWJlbGxlZGJ5PVwibWFzdGVyLWN2LXByZXZpZXctdGl0bGVcIlxuICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZmY7Ym9yZGVyLXJhZGl1czoxMHB4O3BhZGRpbmc6MjRweCAyOHB4O21heC13aWR0aDo3NjBweDt3aWR0aDo5NCU7XG4gICAgICAgICAgICAgICAgbWF4LWhlaWdodDo4NXZoO292ZXJmbG93LXk6YXV0bztib3gtc2hhZG93OjAgMjBweCA2MHB4IHJnYmEoMCwwLDAsMC4zKTtcIj5cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO21hcmdpbi1ib3R0b206MTZweDtcIj5cbiAgICAgICAgPGgzIGlkPVwibWFzdGVyLWN2LXByZXZpZXctdGl0bGVcIiBzdHlsZT1cIm1hcmdpbjowO2ZvbnQtc2l6ZToxLjFlbTtjb2xvcjojMWUyOTNiO1wiPlx1RDgzRFx1REM0MSBGdWxsIE1hc3RlciBDViBEYXRhIChyZWFkLW9ubHkpPC9oMz5cbiAgICAgICAgPGJ1dHRvbiBpZD1cIm1hc3Rlci1jdi1wcmV2aWV3LWNsb3NlXCIgc3R5bGU9XCJiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOm5vbmU7Zm9udC1zaXplOjEuM2VtO2N1cnNvcjpwb2ludGVyO2NvbG9yOiM2NDc0OGI7XCIgYXJpYS1sYWJlbD1cIkNsb3NlXCI+XHUyNzE1PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxwIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtjb2xvcjojNjQ3NDhiO21hcmdpbi1ib3R0b206MTJweDtcIj5cbiAgICAgICAgVGhlIGNvbXBsZXRlLCB1bmZpbHRlcmVkIGNvbnRlbnRzIG9mIDxjb2RlPk1hc3Rlcl9DVl9EYXRhLmpzb248L2NvZGU+IFx1MjAxNCBpbmNsdWRpbmcgYW55IGZpZWxkcyB0aGUgc3RydWN0dXJlZCBlZGl0b3JzIGFib3ZlIGRvbid0IHN1cmZhY2UuXG4gICAgICA8L3A+XG4gICAgICA8cHJlIGlkPVwibWFzdGVyLWN2LXByZXZpZXctYm9keVwiIHN0eWxlPVwiYmFja2dyb3VuZDojZjhmYWZjO2JvcmRlcjoxcHggc29saWQgI2UyZThmMDtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjEycHg7Zm9udC1zaXplOjAuOGVtO2xpbmUtaGVpZ2h0OjEuNTt3aGl0ZS1zcGFjZTpwcmUtd3JhcDt3b3JkLWJyZWFrOmJyZWFrLXdvcmQ7XCI+TG9hZGluZ1x1MjAyNjwvcHJlPlxuICAgIDwvZGl2PmA7XG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQob3ZlcmxheSk7XG4gIGlmICh0eXBlb2YgdHJhcEZvY3VzID09PSAnZnVuY3Rpb24nKSB0cmFwRm9jdXMoJ21hc3Rlci1jdi1wcmV2aWV3LW92ZXJsYXknKTtcbiAgY29uc3QgY2xvc2UgPSAoKSA9PiB7IG92ZXJsYXkucmVtb3ZlKCk7IGlmICh0eXBlb2YgcmVzdG9yZUZvY3VzID09PSAnZnVuY3Rpb24nKSByZXN0b3JlRm9jdXMoKTsgfTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1jdi1wcmV2aWV3LWNsb3NlJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjbG9zZSk7XG4gIG92ZXJsYXkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4geyBpZiAoZS50YXJnZXQgPT09IG92ZXJsYXkpIGNsb3NlKCk7IH0pO1xuICBvdmVybGF5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4geyBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSBjbG9zZSgpOyB9KTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL2Z1bGwnKTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBjb25zdCBib2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1jdi1wcmV2aWV3LWJvZHknKTtcbiAgICBpZiAoYm9keSkgYm9keS50ZXh0Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsIDIpO1xuICB9IGNhdGNoIChfKSB7XG4gICAgY29uc3QgYm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItY3YtcHJldmlldy1ib2R5Jyk7XG4gICAgaWYgKGJvZHkpIGJvZHkudGV4dENvbnRlbnQgPSAnRmFpbGVkIHRvIGxvYWQgbWFzdGVyIENWIGRhdGEuJztcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgRnVsbC1maWxlIEpTT04gaW1wb3J0IHdpdGggZGlmZiByZXZpZXcgKEdBUC0xOSAxNi4xNikgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4vL1xuLy8gTm90IGEgbWVyZ2U6IGltcG9ydC1jb25maXJtIHJlcGxhY2VzIHRoZSBlbnRpcmUgZmlsZS4gVGhlIGltcG9ydC1wcmV2aWV3XG4vLyBzdGVwJ3Mgc2VjdGlvbi1sZXZlbCBjaGFuZ2VkL2NvdW50IHN1bW1hcnkgaXMgdGhlIHVzZXIncyBjaGFuY2UgdG8gY2F0Y2hcbi8vIGFuIHVuaW50ZW5kZWQgb3ZlcndyaXRlIGJlZm9yZSBjb25maXJtaW5nIFx1MjAxNCBmdWxsIGZpZWxkLWxldmVsIGRpZmZpbmdcbi8vIHdpdGhpbiBhIGNoYW5nZWQgc2VjdGlvbiBpcyBhIGtub3duIHYxIGxpbWl0YXRpb24gKHRoZSBzYW1lIHBvc3R1cmVcbi8vIGFscmVhZHkgYWNjZXB0ZWQgZm9yIG90aGVyIGFkdmlzb3J5LW9ubHkgcmV2aWV3IHN1cmZhY2VzIGluIHRoaXMgdGFiKS5cblxubGV0IF9tYXN0ZXJDdkltcG9ydERhdGEgPSBudWxsO1xuXG5mdW5jdGlvbiB0cmlnZ2VyTWFzdGVyQ3ZJbXBvcnQoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItY3YtaW1wb3J0LWZpbGUtaW5wdXQnKT8uY2xpY2soKTtcbn1cblxuZnVuY3Rpb24gaGFuZGxlTWFzdGVyQ3ZJbXBvcnRGaWxlKGV2ZW50KSB7XG4gIGNvbnN0IGZpbGUgPSBldmVudC50YXJnZXQ/LmZpbGVzPy5bMF07XG4gIGV2ZW50LnRhcmdldC52YWx1ZSA9ICcnOyAvLyBhbGxvdyByZS1zZWxlY3RpbmcgdGhlIHNhbWUgZmlsZW5hbWUgbGF0ZXJcbiAgaWYgKCFmaWxlKSByZXR1cm47XG4gIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gIHJlYWRlci5vbmxvYWQgPSBhc3luYyAoKSA9PiB7XG4gICAgbGV0IHBhcnNlZDtcbiAgICB0cnkge1xuICAgICAgcGFyc2VkID0gSlNPTi5wYXJzZShTdHJpbmcocmVhZGVyLnJlc3VsdCkpO1xuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnVGhhdCBmaWxlIGlzIG5vdCB2YWxpZCBKU09OLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXBhcnNlZCB8fCB0eXBlb2YgcGFyc2VkICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHBhcnNlZCkpIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRXhwZWN0ZWQgYSBKU09OIG9iamVjdCAoTWFzdGVyX0NWX0RhdGEuanNvbiBzaGFwZSksIG5vdCBhbiBhcnJheSBvciBzY2FsYXIuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IF9zdWJtaXRNYXN0ZXJDdkltcG9ydFByZXZpZXcocGFyc2VkKTtcbiAgfTtcbiAgcmVhZGVyLm9uZXJyb3IgPSAoKSA9PiBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgJ0ZhaWxlZCB0byByZWFkIHRoZSBzZWxlY3RlZCBmaWxlLicpO1xuICByZWFkZXIucmVhZEFzVGV4dChmaWxlKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gX3N1Ym1pdE1hc3RlckN2SW1wb3J0UHJldmlldyhwYXJzZWQpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS9pbXBvcnQtcHJldmlldycsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgZGF0YTogcGFyc2VkIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmICghZGF0YS5vaykge1xuICAgICAgY29uc3QgZGV0YWlsID0gKGRhdGEudmFsaWRhdGlvbl9lcnJvcnMgfHwgW10pLmpvaW4oJzsgJyk7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgZGV0YWlsID8gYCR7ZGF0YS5lcnJvcn06ICR7ZGV0YWlsfWAgOiAoZGF0YS5lcnJvciB8fCAnSW1wb3J0IHByZXZpZXcgZmFpbGVkLicpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgX21hc3RlckN2SW1wb3J0RGF0YSA9IHBhcnNlZDtcbiAgICBfc2hvd01hc3RlckN2SW1wb3J0UHJldmlld01vZGFsKGRhdGEuc2VjdGlvbnMgfHwgW10pO1xuICB9IGNhdGNoIChfKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsICdGYWlsZWQgdG8gcHJldmlldyB0aGUgaW1wb3J0LicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9zaG93TWFzdGVyQ3ZJbXBvcnRQcmV2aWV3TW9kYWwoc2VjdGlvbnMpIHtcbiAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBvdmVybGF5LmlkID0gJ21hc3Rlci1jdi1pbXBvcnQtb3ZlcmxheSc7XG4gIG92ZXJsYXkuc3R5bGUuY3NzVGV4dCA9ICdwb3NpdGlvbjpmaXhlZDtpbnNldDowO2JhY2tncm91bmQ6cmdiYSgwLDAsMCwwLjUpO3otaW5kZXg6MTAwMDA7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyOyc7XG4gIGNvbnN0IGNoYW5nZWRTZWN0aW9ucyA9IHNlY3Rpb25zLmZpbHRlcigocykgPT4gcy5jaGFuZ2VkKTtcbiAgY29uc3Qgcm93cyA9IHNlY3Rpb25zLm1hcCgocykgPT4gYFxuICAgIDx0ciBzdHlsZT1cIiR7cy5jaGFuZ2VkID8gJ2JhY2tncm91bmQ6dmFyKC0tY3Ytd2FybmluZy1iZywgI2ZmZmJlYik7JyA6ICcnfVwiPlxuICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzo2cHggOHB4O2NvbG9yOiMxZTI5M2I7XCI+JHtlc2NhcGVIdG1sKHMuc2VjdGlvbil9PC90ZD5cbiAgICAgIDx0ZCBzdHlsZT1cInBhZGRpbmc6NnB4IDhweDt0ZXh0LWFsaWduOmNlbnRlcjtjb2xvcjojNjQ3NDhiO1wiPiR7cy5jdXJyZW50X2NvdW50fTwvdGQ+XG4gICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOjZweCA4cHg7dGV4dC1hbGlnbjpjZW50ZXI7Y29sb3I6IzY0NzQ4YjtcIj4ke3MubmV3X2NvdW50fTwvdGQ+XG4gICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOjZweCA4cHg7XCI+JHtzLmNoYW5nZWQgPyAnXHUyNkEwIGNoYW5nZWQnIDogJ1x1MjAxNCd9PC90ZD5cbiAgICA8L3RyPmApLmpvaW4oJycpO1xuICBvdmVybGF5LmlubmVySFRNTCA9IGBcbiAgICA8ZGl2IHJvbGU9XCJkaWFsb2dcIiBhcmlhLW1vZGFsPVwidHJ1ZVwiIGFyaWEtbGFiZWxsZWRieT1cIm1hc3Rlci1jdi1pbXBvcnQtdGl0bGVcIlxuICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZmY7Ym9yZGVyLXJhZGl1czoxMHB4O3BhZGRpbmc6MjRweCAyOHB4O21heC13aWR0aDo2NDBweDt3aWR0aDo5NCU7XG4gICAgICAgICAgICAgICAgbWF4LWhlaWdodDo4NXZoO292ZXJmbG93LXk6YXV0bztib3gtc2hhZG93OjAgMjBweCA2MHB4IHJnYmEoMCwwLDAsMC4zKTtcIj5cbiAgICAgIDxoMyBpZD1cIm1hc3Rlci1jdi1pbXBvcnQtdGl0bGVcIiBzdHlsZT1cIm1hcmdpbjowIDAgMTJweDtmb250LXNpemU6MS4xZW07Y29sb3I6IzFlMjkzYjtcIj5cdTJCMDZcdUZFMEYgSW1wb3J0IE1hc3RlciBDViBEYXRhIFx1MjAxNCBSZXZpZXc8L2gzPlxuICAgICAgPGRpdiByb2xlPVwiYWxlcnRcIiBzdHlsZT1cImJhY2tncm91bmQ6I2ZlZjJmMjtib3JkZXI6MXB4IHNvbGlkICNmY2E1YTU7Ym9yZGVyLXJhZGl1czo2cHg7cGFkZGluZzoxMHB4IDE0cHg7bWFyZ2luLWJvdHRvbToxNHB4O2ZvbnQtc2l6ZTowLjg2ZW07Y29sb3I6Izk5MWIxYjtcIj5cbiAgICAgICAgPHN0cm9uZz5UaGlzIHJlcGxhY2VzIHRoZSBlbnRpcmUgZmlsZTwvc3Ryb25nPiwgbm90IGp1c3QgdGhlIGNoYW5nZWQgc2VjdGlvbnMuIEEgYmFja3VwIGlzIGNyZWF0ZWRcbiAgICAgICAgYXV0b21hdGljYWxseSBiZWZvcmUgdGhlIHdyaXRlIFx1MjAxNCBzZWUgXHVEODNEXHVERDUwIEJhY2t1cHMgYWJvdmUgdG8gcmVzdG9yZSBpdCBpZiBuZWVkZWQuXG4gICAgICA8L2Rpdj5cbiAgICAgIDxwIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtjb2xvcjojNjQ3NDhiO21hcmdpbi1ib3R0b206OHB4O1wiPlxuICAgICAgICAke2NoYW5nZWRTZWN0aW9ucy5sZW5ndGggPyBgJHtjaGFuZ2VkU2VjdGlvbnMubGVuZ3RofSBzZWN0aW9uKHMpIHdvdWxkIGNoYW5nZTpgIDogJ05vIHNlY3Rpb25zIHdvdWxkIGNoYW5nZSBcdTIwMTQgdGhlIHVwbG9hZGVkIGZpbGUgbWF0Y2hlcyB0aGUgY3VycmVudCBkYXRhLid9XG4gICAgICA8L3A+XG4gICAgICA8dGFibGUgc3R5bGU9XCJ3aWR0aDoxMDAlO2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTtmb250LXNpemU6MC44NWVtO21hcmdpbi1ib3R0b206MTZweDtcIj5cbiAgICAgICAgPHRoZWFkPjx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206MXB4IHNvbGlkICNlMmU4ZjA7XCI+XG4gICAgICAgICAgPHRoIHN0eWxlPVwicGFkZGluZzo0cHggOHB4O3RleHQtYWxpZ246bGVmdDtjb2xvcjojNDc1NTY5O1wiPlNlY3Rpb248L3RoPlxuICAgICAgICAgIDx0aCBzdHlsZT1cInBhZGRpbmc6NHB4IDhweDtjb2xvcjojNDc1NTY5O1wiPkN1cnJlbnQ8L3RoPlxuICAgICAgICAgIDx0aCBzdHlsZT1cInBhZGRpbmc6NHB4IDhweDtjb2xvcjojNDc1NTY5O1wiPk5ldzwvdGg+XG4gICAgICAgICAgPHRoIHN0eWxlPVwicGFkZGluZzo0cHggOHB4O3RleHQtYWxpZ246bGVmdDtjb2xvcjojNDc1NTY5O1wiPjwvdGg+XG4gICAgICAgIDwvdHI+PC90aGVhZD5cbiAgICAgICAgPHRib2R5PiR7cm93c308L3Rib2R5PlxuICAgICAgPC90YWJsZT5cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kO2dhcDo4cHg7XCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgaWQ9XCJtYXN0ZXItY3YtaW1wb3J0LWNhbmNlbFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBwcmltYXJ5XCIgaWQ9XCJtYXN0ZXItY3YtaW1wb3J0LWNvbmZpcm1cIiR7Y2hhbmdlZFNlY3Rpb25zLmxlbmd0aCA/ICcnIDogJyBkaXNhYmxlZCd9PkNvbmZpcm0gSW1wb3J0PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG92ZXJsYXkpO1xuICBpZiAodHlwZW9mIHRyYXBGb2N1cyA9PT0gJ2Z1bmN0aW9uJykgdHJhcEZvY3VzKCdtYXN0ZXItY3YtaW1wb3J0LW92ZXJsYXknKTtcbiAgY29uc3QgY2xvc2UgPSAoKSA9PiB7IG92ZXJsYXkucmVtb3ZlKCk7IF9tYXN0ZXJDdkltcG9ydERhdGEgPSBudWxsOyBpZiAodHlwZW9mIHJlc3RvcmVGb2N1cyA9PT0gJ2Z1bmN0aW9uJykgcmVzdG9yZUZvY3VzKCk7IH07XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItY3YtaW1wb3J0LWNhbmNlbCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xvc2UpO1xuICBvdmVybGF5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4geyBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSBjbG9zZSgpOyB9KTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1jdi1pbXBvcnQtY29uZmlybScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gY29uZmlybU1hc3RlckN2SW1wb3J0KCkpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb25maXJtTWFzdGVyQ3ZJbXBvcnQoKSB7XG4gIGlmICghX21hc3RlckN2SW1wb3J0RGF0YSkgcmV0dXJuO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL2ltcG9ydC1jb25maXJtJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBkYXRhOiBfbWFzdGVyQ3ZJbXBvcnREYXRhIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItY3YtaW1wb3J0LW92ZXJsYXknKT8ucmVtb3ZlKCk7XG4gICAgX21hc3RlckN2SW1wb3J0RGF0YSA9IG51bGw7XG4gICAgaWYgKHR5cGVvZiByZXN0b3JlRm9jdXMgPT09ICdmdW5jdGlvbicpIHJlc3RvcmVGb2N1cygpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBfc2V0TWFzdGVyQ2hhbmdlTm90aWNlKCdNYXN0ZXIgQ1YgRGF0YScsICdpbXBvcnRlZCcpO1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoXG4gICAgICAgICdcdTI3MDUgSW1wb3J0ZWQnLFxuICAgICAgICBgTWFzdGVyIENWIGRhdGEgcmVwbGFjZWQuJHtkYXRhLmNvbW1pdF9oYXNoID8gYCBDb21taXQ6ICR7ZGF0YS5jb21taXRfaGFzaC5zbGljZSgwLCAxMCl9LmAgOiAnJ30ke2RhdGEuZ2l0X2Vycm9yID8gYCAoZ2l0IHdhcm5pbmc6ICR7ZGF0YS5naXRfZXJyb3J9KWAgOiAnJ31gXG4gICAgICApO1xuICAgICAgYXdhaXQgcG9wdWxhdGVNYXN0ZXJUYWIoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZGV0YWlsID0gKGRhdGEudmFsaWRhdGlvbl9lcnJvcnMgfHwgW10pLmpvaW4oJzsgJyk7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgZGV0YWlsID8gYCR7ZGF0YS5lcnJvcn06ICR7ZGV0YWlsfWAgOiAoZGF0YS5lcnJvciB8fCAnSW1wb3J0IGZhaWxlZC4nKSk7XG4gICAgfVxuICB9IGNhdGNoIChfKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsICdGYWlsZWQgdG8gaW1wb3J0IG1hc3RlciBDViBkYXRhLicpO1xuICB9XG59XG5cbi8vIC0tLS0gQWNoaWV2ZW1lbnQvU3VtbWFyeSBkZWxldGUgaGFuZGxlcnMgLS0tLVxuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVNYXN0ZXJBY2hpZXZlbWVudChpZCwgdGl0bGUpIHtcbiAgc2hvd0NvbmZpcm1Nb2RhbChcbiAgICAnXHVEODNEXHVEREQxXHVGRTBGIERlbGV0ZSBBY2hpZXZlbWVudCcsXG4gICAgYERlbGV0ZSBcIiR7dGl0bGV9XCI/IFRoaXMgY2Fubm90IGJlIHVuZG9uZS5gLFxuICAgIGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS91cGRhdGUtYWNoaWV2ZW1lbnQnLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgYWN0aW9uOiAnZGVsZXRlJywgaWQgfSksXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgaWYgKGRhdGEub2spIHtcbiAgICAgICAgICBfc2V0TWFzdGVyQ2hhbmdlTm90aWNlKCdTZWxlY3RlZCBBY2hpZXZlbWVudHMnLCBkYXRhLmFjdGlvbiB8fCAnZGVsZXRlZCcpO1xuICAgICAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3MDUgRGVsZXRlZCcsIGBBY2hpZXZlbWVudCByZW1vdmVkLmApO1xuICAgICAgICAgIGF3YWl0IHBvcHVsYXRlTWFzdGVyVGFiKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsIGRhdGEuZXJyb3IgfHwgJ0RlbGV0ZSBmYWlsZWQnKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgJ0ZhaWxlZCB0byBkZWxldGUgYWNoaWV2ZW1lbnQnKTtcbiAgICAgIH1cbiAgICB9XG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZU1hc3RlclN1bW1hcnkoa2V5KSB7XG4gIHNob3dDb25maXJtTW9kYWwoXG4gICAgJ1x1RDgzRFx1REREMVx1RkUwRiBEZWxldGUgU3VtbWFyeScsXG4gICAgYERlbGV0ZSBzdW1tYXJ5IHZhcmlhbnQgXCIke2tleX1cIj8gVGhpcyBjYW5ub3QgYmUgdW5kb25lLmAsXG4gICAgYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL3VwZGF0ZS1zdW1tYXJ5Jywge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGFjdGlvbjogJ2RlbGV0ZScsIGtleSB9KSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICBpZiAoZGF0YS5vaykge1xuICAgICAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ1Byb2Zlc3Npb25hbCBTdW1tYXJpZXMnLCBkYXRhLmFjdGlvbiB8fCAnZGVsZXRlZCcpO1xuICAgICAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3MDUgRGVsZXRlZCcsIGBTdW1tYXJ5IFwiJHtrZXl9XCIgcmVtb3ZlZC5gKTtcbiAgICAgICAgICBhd2FpdCBwb3B1bGF0ZU1hc3RlclRhYigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCBkYXRhLmVycm9yIHx8ICdEZWxldGUgZmFpbGVkJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsICdGYWlsZWQgdG8gZGVsZXRlIHN1bW1hcnknKTtcbiAgICAgIH1cbiAgICB9XG4gICk7XG59XG5cbmZ1bmN0aW9uIG9wZW5NYXN0ZXJDdk1vZGFsKCkge1xuICBjb25zdCBvdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1jdi1tb2RhbC1vdmVybGF5Jyk7XG4gIGlmICghb3ZlcmxheSkgcmV0dXJuO1xuICBfZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWN2LW1vZGFsLWJvZHknKTtcbiAgcG9wdWxhdGVNYXN0ZXJUYWIoY29udGFpbmVyKTtcbiAgc2V0SW5pdGlhbEZvY3VzKCdtYXN0ZXItY3YtbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ21hc3Rlci1jdi1tb2RhbC1vdmVybGF5Jyk7XG59XG5cbmZ1bmN0aW9uIGNsb3NlTWFzdGVyQ3ZNb2RhbCgpIHtcbiAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItY3YtbW9kYWwtb3ZlcmxheScpO1xuICBpZiAob3ZlcmxheSkgb3ZlcmxheS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBfbWFzdGVyQ3ZBY3RpdmVDb250YWluZXIgPSBudWxsO1xuICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJyc7XG4gIHJlc3RvcmVGb2N1cygpO1xufVxuXG5leHBvcnQge1xuICBwb3B1bGF0ZU1hc3RlclRhYixcbiAgb3Blbk1hc3RlckN2TW9kYWwsXG4gIGNsb3NlTWFzdGVyQ3ZNb2RhbCxcbiAgX3JlbmRlclBlcnNvbmFsSW5mb0NhcmQsXG4gIF9yZW5kZXJFeHBlcmllbmNlc0xpc3QsXG4gIF9yZW5kZXJTa2lsbHNTZWN0aW9uLFxuICBfcmVuZGVyRWR1Y2F0aW9uTGlzdCxcbiAgX3JlbmRlckF3YXJkc0xpc3QsXG4gIF9yZW5kZXJDZXJ0aWZpY2F0aW9uc0xpc3QsXG4gIF9yZW5kZXJNYXN0ZXJBY2hpZXZlbWVudHNUYWJsZSxcbiAgX3JlbmRlclN1bW1hcmllc0xpc3QsXG4gIHNob3dBZGRBY2hpZXZlbWVudE1vZGFsLFxuICBlZGl0TWFzdGVyQWNoaWV2ZW1lbnQsXG4gIGNsb3NlTWFzdGVyQWNoTW9kYWwsXG4gIHNhdmVNYXN0ZXJBY2hpZXZlbWVudCxcbiAgc2hvd0FkZFN1bW1hcnlNb2RhbCxcbiAgZWRpdE1hc3RlclN1bW1hcnksXG4gIGNsb3NlTWFzdGVyU3VtTW9kYWwsXG4gIHNhdmVNYXN0ZXJTdW1tYXJ5LFxuICBzaG93RWRpdFBlcnNvbmFsSW5mb01vZGFsLFxuICBjbG9zZVBlcnNvbmFsSW5mb01vZGFsLFxuICBzYXZlUGVyc29uYWxJbmZvLFxuICBzaG93QWRkRXhwZXJpZW5jZU1vZGFsLFxuICBlZGl0TWFzdGVyRXhwZXJpZW5jZSxcbiAgY2xvc2VFeHBlcmllbmNlTW9kYWwsXG4gIHNhdmVNYXN0ZXJFeHBlcmllbmNlLFxuICBkZWxldGVNYXN0ZXJFeHBlcmllbmNlLFxuICBfYWRkRXhwQWNoaWV2ZW1lbnQsXG4gIF9tb3ZlRXhwQWNoaWV2ZW1lbnQsXG4gIF9kZWxldGVFeHBBY2hpZXZlbWVudCxcbiAgc2hvd0FkZFNraWxsTW9kYWwsXG4gIGVkaXRNYXN0ZXJTa2lsbCxcbiAgY2xvc2VTa2lsbE1vZGFsLFxuICBzYXZlTWFzdGVyU2tpbGwsXG4gIGRlbGV0ZU1hc3RlclNraWxsLFxuICBzaG93QWRkRWR1Y2F0aW9uTW9kYWwsXG4gIGVkaXRNYXN0ZXJFZHVjYXRpb24sXG4gIGNsb3NlRWR1Y2F0aW9uTW9kYWwsXG4gIHNhdmVNYXN0ZXJFZHVjYXRpb24sXG4gIGRlbGV0ZU1hc3RlckVkdWNhdGlvbixcbiAgc2hvd0FkZEF3YXJkTW9kYWwsXG4gIGVkaXRNYXN0ZXJBd2FyZCxcbiAgY2xvc2VBd2FyZE1vZGFsLFxuICBzYXZlTWFzdGVyQXdhcmQsXG4gIGRlbGV0ZU1hc3RlckF3YXJkLFxuICBzaG93QWRkQ2VydGlmaWNhdGlvbk1vZGFsLFxuICBlZGl0TWFzdGVyQ2VydGlmaWNhdGlvbixcbiAgY2xvc2VDZXJ0aWZpY2F0aW9uTW9kYWwsXG4gIHNhdmVNYXN0ZXJDZXJ0aWZpY2F0aW9uLFxuICBkZWxldGVNYXN0ZXJDZXJ0aWZpY2F0aW9uLFxuICBleHBvcnRNYXN0ZXJDVixcbiAgb3BlbkJhY2t1cEhpc3RvcnlNb2RhbCxcbiAgcmVzdG9yZUJhY2t1cCxcbiAgdW5kb01hc3RlckRhdGFDaGFuZ2UsXG4gIHJlZG9NYXN0ZXJEYXRhQ2hhbmdlLFxuICBvcGVuRnVsbERhdGFQcmV2aWV3TW9kYWwsXG4gIHRyaWdnZXJNYXN0ZXJDdkltcG9ydCxcbiAgaGFuZGxlTWFzdGVyQ3ZJbXBvcnRGaWxlLFxuICBjb25maXJtTWFzdGVyQ3ZJbXBvcnQsXG4gIGRlbGV0ZU1hc3RlckFjaGlldmVtZW50LFxuICBkZWxldGVNYXN0ZXJTdW1tYXJ5LFxuICBsb2FkUHVibGljYXRpb25zLFxuICBsb2FkUHVibGljYXRpb25zQmliLFxuICB0b2dnbGVQdWJsaWNhdGlvbnNWaWV3LFxuICBzZXRQdWJsaWNhdGlvblNvcnRNb2RlLFxuICBzZXRQdWJsaWNhdGlvbkdyb3VwTW9kZSxcbiAgdmFsaWRhdGVQdWJsaWNhdGlvbnNCaWIsXG4gIHNhdmVQdWJsaWNhdGlvbnNCaWIsXG4gIHNob3dJbXBvcnRQdWJsaWNhdGlvbnNNb2RhbCxcbiAgY2xvc2VJbXBvcnRQdWJsaWNhdGlvbnNNb2RhbCxcbiAgaW1wb3J0UHVibGljYXRpb25zQmliLFxuICBzaG93Q29udmVydFB1YmxpY2F0aW9uc01vZGFsLFxuICBjbG9zZUNvbnZlcnRQdWJsaWNhdGlvbnNNb2RhbCxcbiAgY29udmVydFB1YmxpY2F0aW9uVGV4dCxcbiAgaW1wb3J0Q29udmVydGVkUHVibGljYXRpb25UZXh0LFxuICBzaG93QWRkUHVibGljYXRpb25Nb2RhbCxcbiAgZWRpdE1hc3RlclB1YmxpY2F0aW9uLFxuICBjbG9zZVB1YmxpY2F0aW9uTW9kYWwsXG4gIHNhdmVNYXN0ZXJQdWJsaWNhdGlvbixcbiAgZGVsZXRlTWFzdGVyUHVibGljYXRpb24sXG59O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvY292ZXItbGV0dGVyLmpzXG4gKiBDb3ZlciBsZXR0ZXIgdGFiOiBnZW5lcmF0ZSwgc2F2ZSwgdmFsaWRhdGUsIGNvbnNpc3RlbmN5IHJlcG9ydC5cbiAqXG4gKiBEZXBlbmRlbmNpZXMgKHJlc29sdmVkIHRocm91Z2ggZ2xvYmFsVGhpcyBhdCBydW50aW1lKTpcbiAqICAgZXNjYXBlSHRtbCwgc2hvd0FsZXJ0TW9kYWwsIHRhYkRhdGEsIHBlbmRpbmdSZWNvbW1lbmRhdGlvbnMsIENTU1xuICovXG5cbmltcG9ydCB7IHN0YXRlTWFuYWdlciB9IGZyb20gJy4vc3RhdGUtbWFuYWdlci5qcyc7XG5cbi8vIFx1MjUwMFx1MjUwMCBNb2R1bGUtbGV2ZWwgc3RhdGUgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmNvbnN0IENPVkVSX0xFVFRFUl9UT05FUyA9IFtcbiAgeyB2YWx1ZTogJ3N0YXJ0dXAvdGVjaCcsICAgbGFiZWw6ICdTdGFydHVwIC8gVGVjaCcgICAgfSxcbiAgeyB2YWx1ZTogJ3BoYXJtYS9iaW90ZWNoJywgbGFiZWw6ICdQaGFybWEgLyBCaW90ZWNoJyAgfSxcbiAgeyB2YWx1ZTogJ2FjYWRlbWlhJywgICAgICAgbGFiZWw6ICdBY2FkZW1pYScgICAgICAgICAgIH0sXG4gIHsgdmFsdWU6ICdmaW5hbmNpYWwnLCAgICAgIGxhYmVsOiAnRmluYW5jaWFsIFNlcnZpY2VzJyB9LFxuICB7IHZhbHVlOiAnbGVhZGVyc2hpcCcsICAgICBsYWJlbDogJ0xlYWRlcnNoaXAgLyBFeGVjJyAgfSxcbl07XG5cbmNvbnN0IENPVkVSX0xFVFRFUl9PUEVOSU5HUyA9IFtcbiAgeyB2YWx1ZTogJ2Zvcm1hbCcsICAgIGxhYmVsOiAnRm9ybWFsIHNhbHV0YXRpb24gXHUyMDE0IFx1MjAxQ0RlYXIgW25hbWVdLFx1MjAxRCcgfSxcbiAgeyB2YWx1ZTogJ2hvb2snLCAgICAgIGxhYmVsOiAnQXR0ZW50aW9uIGhvb2sgXHUyMDE0IGJvbGQgY2xhaW0gb3IgYWNoaWV2ZW1lbnQnIH0sXG4gIHsgdmFsdWU6ICduYXJyYXRpdmUnLCBsYWJlbDogJ05hcnJhdGl2ZSBvcGVuZXIgXHUyMDE0IHZpdmlkIHNjZW5lIG9yIHN0b3J5JyB9LFxuXTtcblxubGV0IF9jb3ZlckxldHRlclByaW9yU2Vzc2lvbnMgPSBbXTtcblxuLyoqIFN1cnZpdmVzIHRhYiBuYXZpZ2F0aW9uOiBmb3JtIGlucHV0cyBhbmQgdGhlIGdlbmVyYXRlZCBsZXR0ZXIgYm9keS4gKi9cbmxldCBfY292ZXJMZXR0ZXJGb3JtU3RhdGUgPSB7XG4gIHRvbmU6ICAgICAgICAgICAnJyxcbiAgb3BlbmluZ1N0eWxlOiAgICcnLFxuICBoaXJpbmdNYW5hZ2VyOiAgJycsXG4gIGNvbXBhbnlBZGRyZXNzOiAnJyxcbiAgaGlnaGxpZ2h0OiAgICAgICcnLFxuICBjb21wYW55Q29udGV4dDogJycsXG4gIGxldHRlclRleHQ6ICAgICAnJyxcbiAgbGV0dGVyVmlzaWJsZTogIGZhbHNlLFxufTtcblxuLy8gXHUyNTAwXHUyNTAwIFBvcHVsYXRlIGNvdmVyIGxldHRlciB0YWIgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIHBvcHVsYXRlQ292ZXJMZXR0ZXJUYWIoKSB7XG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9jdW1lbnQtY29udGVudCcpO1xuICBjb250ZW50LmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwiZW1wdHktc3RhdGVcIj48ZGl2IGNsYXNzPVwibG9hZGluZy1zcGlubmVyXCI+PC9kaXY+PHAgc3R5bGU9XCJtYXJnaW4tdG9wOjEycHg7Y29sb3I6IzY0NzQ4YjtcIj5Mb2FkaW5nIGNvdmVyIGxldHRlclx1MjAyNjwvcD48L2Rpdj4nO1xuXG4gIC8vIEZldGNoIHByaW9yIHNlc3Npb25zIHdpdGggY292ZXIgbGV0dGVyc1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9jb3Zlci1sZXR0ZXIvcHJpb3InKTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBfY292ZXJMZXR0ZXJQcmlvclNlc3Npb25zID0gKGRhdGEuc2Vzc2lvbnMgfHwgW10pO1xuICB9IGNhdGNoIChfKSB7XG4gICAgX2NvdmVyTGV0dGVyUHJpb3JTZXNzaW9ucyA9IFtdO1xuICB9XG5cbiAgY29uc3QgdG9uZU9wdGlvbnMgPSBDT1ZFUl9MRVRURVJfVE9ORVMubWFwKHQgPT5cbiAgICBgPG9wdGlvbiB2YWx1ZT1cIiR7dC52YWx1ZX1cIj4ke2VzY2FwZUh0bWwodC5sYWJlbCl9PC9vcHRpb24+YFxuICApLmpvaW4oJycpO1xuXG4gIGNvbnN0IG9wZW5pbmdPcHRpb25zID0gQ09WRVJfTEVUVEVSX09QRU5JTkdTLm1hcChvID0+XG4gICAgYDxvcHRpb24gdmFsdWU9XCIke28udmFsdWV9XCI+JHtlc2NhcGVIdG1sKG8ubGFiZWwpfTwvb3B0aW9uPmBcbiAgKS5qb2luKCcnKTtcblxuICBjb25zdCBwcmlvclNlY3Rpb24gPSBfY292ZXJMZXR0ZXJQcmlvclNlc3Npb25zLmxlbmd0aCA/IGBcbiAgICA8ZGl2IGNsYXNzPVwiY2wtcHJpb3Itc2VjdGlvblwiPlxuICAgICAgPGgzPlx1RDgzRFx1RENDQiBQcmlvciBDb3ZlciBMZXR0ZXJzPC9oMz5cbiAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtmb250LXNpemU6MC44NWVtO21hcmdpbi1ib3R0b206MTBweDtcIj5cbiAgICAgICAgU2VsZWN0IGEgcHJpb3IgbGV0dGVyIHRvIHVzZSBhcyBhIHN0YXJ0aW5nIHBvaW50LlxuICAgICAgPC9wPlxuICAgICAgPGRpdiBpZD1cImNsLXByaW9yLWxpc3RcIj5cbiAgICAgICAgJHtfY292ZXJMZXR0ZXJQcmlvclNlc3Npb25zLm1hcCgocywgaSkgPT4gYFxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbC1wcmlvci1jYXJkXCIgaWQ9XCJjbC1wcmlvci0ke2l9XCI+XG4gICAgICAgICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjEwcHg7YWxpZ24taXRlbXM6ZmxleC1zdGFydDtjdXJzb3I6cG9pbnRlcjtcIj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJjbC1wcmlvclwiIHZhbHVlPVwiJHtpfVwiIHN0eWxlPVwibWFyZ2luLXRvcDozcHg7XCIgLz5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8c3Ryb25nPiR7ZXNjYXBlSHRtbChzLnJvbGUgfHwgJ1JvbGUnKX0gYXQgJHtlc2NhcGVIdG1sKHMuY29tcGFueSB8fCAnQ29tcGFueScpfTwvc3Ryb25nPlxuICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6Izk0YTNiODtmb250LXNpemU6MC44MmVtO21hcmdpbi1sZWZ0OjZweDtcIj4ke2VzY2FwZUh0bWwocy5kYXRlIHx8ICcnKX08L3NwYW4+XG4gICAgICAgICAgICAgICAgJHtzLnRvbmUgPyBgPHNwYW4gY2xhc3M9XCJjbC10b25lLWJhZGdlXCI+JHtlc2NhcGVIdG1sKHMudG9uZSl9PC9zcGFuPmAgOiAnJ31cbiAgICAgICAgICAgICAgICA8cCBzdHlsZT1cImNvbG9yOiM2NDc0OGI7Zm9udC1zaXplOjAuODVlbTttYXJnaW46NHB4IDAgMDtcIj4ke2VzY2FwZUh0bWwoKHMucHJldmlldyB8fCAnJykuc2xpY2UoMCwgMTIwKSl9XHUyMDI2PC9wPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPC9kaXY+YCkuam9pbignJyl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gIDogJyc7XG5cbiAgY29udGVudC5pbm5lckhUTUwgPSBgXG4gICAgPGgxPlx1RDgzRFx1RENFOSBDb3ZlciBMZXR0ZXI8L2gxPlxuICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDttYXJnaW4tYm90dG9tOjIwcHg7XCI+XG4gICAgICBHZW5lcmF0ZSBhIHRhaWxvcmVkIGNvdmVyIGxldHRlciBmb3IgdGhpcyBhcHBsaWNhdGlvbiB1c2luZyB5b3VyIENWIGNvbnRlbnRcbiAgICAgIGFuZCBqb2IgYW5hbHlzaXMgYXMgY29udGV4dC5cbiAgICA8L3A+XG5cbiAgICAke3ByaW9yU2VjdGlvbn1cblxuICAgIDxkaXYgY2xhc3M9XCJjbC1mb3JtLXNlY3Rpb25cIj5cbiAgICAgIDxoMz5HZW5lcmF0aW9uIE9wdGlvbnM8L2gzPlxuICAgICAgPGRpdiBjbGFzcz1cImNsLWZvcm0tZ3JpZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2wtZm9ybS1maWVsZFwiPlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJjbC10b25lLXNlbGVjdFwiPlRvbmUgLyBJbmR1c3RyeTwvbGFiZWw+XG4gICAgICAgICAgPHNlbGVjdCBpZD1cImNsLXRvbmUtc2VsZWN0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCI+JHt0b25lT3B0aW9uc308L3NlbGVjdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjbC1mb3JtLWZpZWxkXCI+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cImNsLW9wZW5pbmctc3R5bGVcIj5PcGVuaW5nIFN0eWxlPC9sYWJlbD5cbiAgICAgICAgICA8c2VsZWN0IGlkPVwiY2wtb3BlbmluZy1zdHlsZVwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiPiR7b3BlbmluZ09wdGlvbnN9PC9zZWxlY3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2wtZm9ybS1maWVsZFwiPlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJjbC1oaXJpbmctbWFuYWdlclwiPkhpcmluZyBNYW5hZ2VyIE5hbWUvVGl0bGUgPHNwYW4gc3R5bGU9XCJjb2xvcjojOTRhM2I4O2ZvbnQtd2VpZ2h0OjQwMDtcIj4ob3B0aW9uYWwpPC9zcGFuPjwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJjbC1oaXJpbmctbWFuYWdlclwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBEci4gSmFuZSBTbWl0aCwgSGVhZCBvZiBEYXRhIFNjaWVuY2VcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNsLWZvcm0tZmllbGRcIiBzdHlsZT1cIm1hcmdpbi10b3A6MTJweDtcIj5cbiAgICAgICAgPGxhYmVsIGZvcj1cImNsLWNvbXBhbnktYWRkcmVzc1wiPkNvbXBhbnkgQWRkcmVzcyA8c3BhbiBzdHlsZT1cImNvbG9yOiM5NGEzYjg7Zm9udC13ZWlnaHQ6NDAwO1wiPihvcHRpb25hbCk8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgPHRleHRhcmVhIGlkPVwiY2wtY29tcGFueS1hZGRyZXNzXCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgcm93cz1cIjJcIlxuICAgICAgICAgICAgc3R5bGU9XCJyZXNpemU6dmVydGljYWw7XCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBBY21lIENvcnAsIDEyMyBNYWluIFN0LCBCb3N0b24gTUEgMDIxMzRcIj48L3RleHRhcmVhPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2wtZm9ybS1maWVsZFwiIHN0eWxlPVwibWFyZ2luLXRvcDoxMnB4O1wiPlxuICAgICAgICA8bGFiZWwgZm9yPVwiY2wtaGlnaGxpZ2h0XCI+U3BlY2lmaWMgYWNoaWV2ZW1lbnQgb3IgcHJvamVjdCB0byBoaWdobGlnaHQgPHNwYW4gc3R5bGU9XCJjb2xvcjojOTRhM2I4O2ZvbnQtd2VpZ2h0OjQwMDtcIj4ob3B0aW9uYWwpPC9zcGFuPjwvbGFiZWw+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiY2wtaGlnaGxpZ2h0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBMZWQgdGhlIG1pZ3JhdGlvbiB0byBLdWJlcm5ldGVzIHNhdmluZyAzMCUgaW5mcmEgY29zdFwiIC8+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjbC1mb3JtLWZpZWxkXCIgc3R5bGU9XCJtYXJnaW4tdG9wOjEycHg7XCI+XG4gICAgICAgIDxsYWJlbCBmb3I9XCJjbC1jb21wYW55LWNvbnRleHRcIj5Db21wYW55IGNvbnRleHQgPHNwYW4gc3R5bGU9XCJjb2xvcjojOTRhM2I4O2ZvbnQtd2VpZ2h0OjQwMDtcIj4ob3B0aW9uYWwgXHUyMDE0IHBhc3RlIHNwZWNpZmljIGluaXRpYXRpdmVzLCBwcm9kdWN0cywgdmFsdWVzLCBvciByZWNlbnQgbmV3cyk8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgPHRleHRhcmVhIGlkPVwiY2wtY29tcGFueS1jb250ZXh0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgcm93cz1cIjNcIlxuICAgICAgICAgICAgc3R5bGU9XCJyZXNpemU6dmVydGljYWw7XCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBUaGV5IGp1c3QgbGF1bmNoZWQgYSBuZXcgQUkgcGxhdGZvcm0gZm9yIGhlYWx0aGNhcmU7IHRoZWlyIENUTyB3cm90ZSBhYm91dCBwcmlvcml0aXNpbmcgcmVsaWFiaWxpdHkgb3ZlciBzcGVlZFx1MjAyNlwiPjwvdGV4dGFyZWE+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOjE2cHg7XCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHByaW1hcnlcIiBpZD1cImNsLWdlbmVyYXRlLWJ0blwiIG9uY2xpY2s9XCJnZW5lcmF0ZUNvdmVyTGV0dGVyKClcIj5cbiAgICAgICAgICBcdTI3MjggR2VuZXJhdGUgQ292ZXIgTGV0dGVyXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGlkPVwiY2wtcmVzdWx0LXNlY3Rpb25cIiBzdHlsZT1cImRpc3BsYXk6bm9uZTttYXJnaW4tdG9wOjI0cHg7XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2wtcmVzdWx0LWhlYWRlclwiPlxuICAgICAgICA8aDM+R2VuZXJhdGVkIENvdmVyIExldHRlcjwvaDM+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjhweDtmbGV4LXdyYXA6d3JhcDtcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0blwiIG9uY2xpY2s9XCJnZW5lcmF0ZUNvdmVyTGV0dGVyKClcIiB0aXRsZT1cIlJlZ2VuZXJhdGVcIj5cdUQ4M0RcdUREMDQgUmVnZW5lcmF0ZTwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHByaW1hcnlcIiBvbmNsaWNrPVwic2F2ZUNvdmVyTGV0dGVyKClcIiBpZD1cImNsLXNhdmUtYnRuXCI+XHVEODNEXHVEQ0JFIFNhdmUgQ292ZXIgTGV0dGVyPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7Zm9udC1zaXplOjAuODVlbTttYXJnaW4tYm90dG9tOjhweDtcIj5cbiAgICAgICAgRWRpdCB0aGUgdGV4dCBiZWxvdyBiZWZvcmUgc2F2aW5nLlxuICAgICAgPC9wPlxuICAgICAgPHRleHRhcmVhIGlkPVwiY2wtbGV0dGVyLXRleHRhcmVhXCIgY2xhc3M9XCJjbC1sZXR0ZXItdGV4dGFyZWFcIiByb3dzPVwiMjJcIlxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJDb3ZlciBsZXR0ZXIgdGV4dCBcdTIwMTQgZWRpdCBhcyBuZWVkZWRcIlxuICAgICAgICAgIG9uaW5wdXQ9XCJfZGVib3VuY2VkVmFsaWRhdGVDTCgpOyBfY292ZXJMZXR0ZXJGb3JtU3RhdGUubGV0dGVyVGV4dCA9IHRoaXMudmFsdWU7XCI+PC90ZXh0YXJlYT5cbiAgICAgIDxkaXYgaWQ9XCJjbC12YWxpZGF0aW9uLXBhbmVsXCIgY2xhc3M9XCJjbC12YWxpZGF0aW9uLXBhbmVsXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+XG4gICAgICAgIDxoND5cdUQ4M0RcdURDQ0EgUXVhbGl0eSBDaGVja3M8L2g0PlxuICAgICAgICA8ZGl2IGlkPVwiY2wtY2hlY2tzLWNvbnRhaW5lclwiPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwibmF2LWJ1dHRvbnMgbmF2LWVuZFwiIHN0eWxlPVwibWFyZ2luLXRvcDoyNHB4O1wiPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbnRpbnVlLWJ0blwiIG9uY2xpY2s9XCJoYW5kbGVTdGVwQ2xpY2soJ3NjcmVlbmluZycpXCI+XHVEODNEXHVEQ0NCIFByb2NlZWQgdG8gU2NyZWVuaW5nIFx1MjE5MjwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICBgO1xuXG4gIC8vIFJlc3RvcmUgc2F2ZWQgZm9ybSBzdGF0ZSBhbmQgd2lyZSB1cCBzYXZlLW9uLWNoYW5nZSBsaXN0ZW5lcnMuXG4gIF9yZXN0b3JlQ292ZXJMZXR0ZXJGb3JtU3RhdGUoKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIENvdmVyIGxldHRlciBmb3JtIHN0YXRlIGhlbHBlcnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIF9yZXN0b3JlQ292ZXJMZXR0ZXJGb3JtU3RhdGUoKSB7XG4gIGNvbnN0IHRvbmVFbCAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC10b25lLXNlbGVjdCcpO1xuICBjb25zdCBvcGVuaW5nRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtb3BlbmluZy1zdHlsZScpO1xuICBjb25zdCBobUVsICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtaGlyaW5nLW1hbmFnZXInKTtcbiAgY29uc3QgYWRkckVsICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWNvbXBhbnktYWRkcmVzcycpO1xuICBjb25zdCBobEVsICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtaGlnaGxpZ2h0Jyk7XG4gIGNvbnN0IGN0eEVsICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1jb21wYW55LWNvbnRleHQnKTtcbiAgY29uc3QgcmVzdWx0RWwgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLXJlc3VsdC1zZWN0aW9uJyk7XG4gIGNvbnN0IGxldHRlckVsICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1sZXR0ZXItdGV4dGFyZWEnKTtcblxuICBpZiAodG9uZUVsICYmIF9jb3ZlckxldHRlckZvcm1TdGF0ZS50b25lKVxuICAgIHRvbmVFbC52YWx1ZSA9IF9jb3ZlckxldHRlckZvcm1TdGF0ZS50b25lO1xuICBpZiAob3BlbmluZ0VsICYmIF9jb3ZlckxldHRlckZvcm1TdGF0ZS5vcGVuaW5nU3R5bGUpXG4gICAgb3BlbmluZ0VsLnZhbHVlID0gX2NvdmVyTGV0dGVyRm9ybVN0YXRlLm9wZW5pbmdTdHlsZTtcbiAgaWYgKGhtRWwgJiYgX2NvdmVyTGV0dGVyRm9ybVN0YXRlLmhpcmluZ01hbmFnZXIpXG4gICAgaG1FbC52YWx1ZSA9IF9jb3ZlckxldHRlckZvcm1TdGF0ZS5oaXJpbmdNYW5hZ2VyO1xuICBpZiAoYWRkckVsICYmIF9jb3ZlckxldHRlckZvcm1TdGF0ZS5jb21wYW55QWRkcmVzcylcbiAgICBhZGRyRWwudmFsdWUgPSBfY292ZXJMZXR0ZXJGb3JtU3RhdGUuY29tcGFueUFkZHJlc3M7XG4gIGlmIChobEVsICYmIF9jb3ZlckxldHRlckZvcm1TdGF0ZS5oaWdobGlnaHQpXG4gICAgaGxFbC52YWx1ZSA9IF9jb3ZlckxldHRlckZvcm1TdGF0ZS5oaWdobGlnaHQ7XG4gIGlmIChjdHhFbCAmJiBfY292ZXJMZXR0ZXJGb3JtU3RhdGUuY29tcGFueUNvbnRleHQpXG4gICAgY3R4RWwudmFsdWUgPSBfY292ZXJMZXR0ZXJGb3JtU3RhdGUuY29tcGFueUNvbnRleHQ7XG5cbiAgaWYgKF9jb3ZlckxldHRlckZvcm1TdGF0ZS5sZXR0ZXJWaXNpYmxlICYmIF9jb3ZlckxldHRlckZvcm1TdGF0ZS5sZXR0ZXJUZXh0KSB7XG4gICAgaWYgKHJlc3VsdEVsKSByZXN1bHRFbC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICBpZiAobGV0dGVyRWwpIHtcbiAgICAgIGxldHRlckVsLnZhbHVlID0gX2NvdmVyTGV0dGVyRm9ybVN0YXRlLmxldHRlclRleHQ7XG4gICAgICBfdmFsaWRhdGVDb3ZlckxldHRlcihsZXR0ZXJFbC52YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gV2lyZSB1cCBzYXZlLW9uLWNoYW5nZSBsaXN0ZW5lcnMgKGlubGluZSBvbmlucHV0IGFscmVhZHkgaGFuZGxlcyBsZXR0ZXJUZXh0KS5cbiAgaWYgKHRvbmVFbCkgICAgdG9uZUVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICAgKCkgPT4geyBfY292ZXJMZXR0ZXJGb3JtU3RhdGUudG9uZSA9IHRvbmVFbC52YWx1ZTsgfSk7XG4gIGlmIChvcGVuaW5nRWwpIG9wZW5pbmdFbC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7IF9jb3ZlckxldHRlckZvcm1TdGF0ZS5vcGVuaW5nU3R5bGUgPSBvcGVuaW5nRWwudmFsdWU7IH0pO1xuICBpZiAoaG1FbCkgICAgICBobUVsLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgICAgICAoKSA9PiB7IF9jb3ZlckxldHRlckZvcm1TdGF0ZS5oaXJpbmdNYW5hZ2VyID0gaG1FbC52YWx1ZTsgfSk7XG4gIGlmIChhZGRyRWwpICAgIGFkZHJFbC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICAgICgpID0+IHsgX2NvdmVyTGV0dGVyRm9ybVN0YXRlLmNvbXBhbnlBZGRyZXNzID0gYWRkckVsLnZhbHVlOyB9KTtcbiAgaWYgKGhsRWwpICAgICAgaGxFbC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICAgICAgKCkgPT4geyBfY292ZXJMZXR0ZXJGb3JtU3RhdGUuaGlnaGxpZ2h0ID0gaGxFbC52YWx1ZTsgfSk7XG4gIGlmIChjdHhFbCkgICAgIGN0eEVsLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgICAgICgpID0+IHsgX2NvdmVyTGV0dGVyRm9ybVN0YXRlLmNvbXBhbnlDb250ZXh0ID0gY3R4RWwudmFsdWU7IH0pO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgR2VuZXJhdGUgY292ZXIgbGV0dGVyIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUNvdmVyTGV0dGVyKCkge1xuICAvKiBkdWNrZmxvdzpcbiAgICogICBpZDogY292ZXJfbGV0dGVyX3VpX2dlbmVyYXRlX2xpdmVcbiAgICogICBraW5kOiB1aVxuICAgKiAgIHRpbWVzdGFtcDogJzIwMjYtMDQtMjFUMTg6MDA6MDBaJ1xuICAgKiAgIHN0YXR1czogbGl2ZVxuICAgKiAgIGhhbmRsZXM6XG4gICAqICAgLSB1aTpjb3Zlci1sZXR0ZXIuZ2VuZXJhdGVcbiAgICogICBjYWxsczpcbiAgICogICAtIFBPU1QgL2FwaS9jb3Zlci1sZXR0ZXIvZ2VuZXJhdGVcbiAgICogICByZWFkczpcbiAgICogICAtIGRvbTojY2wtdG9uZS1zZWxlY3QudmFsdWVcbiAgICogICAtIGRvbTojY2wtb3BlbmluZy1zdHlsZS52YWx1ZVxuICAgKiAgIC0gZG9tOiNjbC1oaXJpbmctbWFuYWdlci52YWx1ZVxuICAgKiAgIC0gZG9tOiNjbC1jb21wYW55LWFkZHJlc3MudmFsdWVcbiAgICogICAtIGRvbTojY2wtaGlnaGxpZ2h0LnZhbHVlXG4gICAqICAgLSBkb206aW5wdXRbbmFtZT1jbC1wcmlvcl0uY2hlY2tlZFxuICAgKiAgIHdyaXRlczpcbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL2NvdmVyLWxldHRlci9nZW5lcmF0ZS50b25lXG4gICAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9jb3Zlci1sZXR0ZXIvZ2VuZXJhdGUub3BlbmluZ19zdHlsZVxuICAgKiAgIC0gcmVxdWVzdDpQT1NUIC9hcGkvY292ZXItbGV0dGVyL2dlbmVyYXRlLmhpcmluZ19tYW5hZ2VyXG4gICAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9jb3Zlci1sZXR0ZXIvZ2VuZXJhdGUuY29tcGFueV9hZGRyZXNzXG4gICAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9jb3Zlci1sZXR0ZXIvZ2VuZXJhdGUuaGlnaGxpZ2h0XG4gICAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9jb3Zlci1sZXR0ZXIvZ2VuZXJhdGUucmV1c2VfYm9keVxuICAgKiAgIC0gZG9tOiNjbC1sZXR0ZXItdGV4dGFyZWEudmFsdWVcbiAgICogICBub3RlczogU3VibWl0cyBjb3Zlci1sZXR0ZXIgcHJvbXB0IGlucHV0cyAoaW5jbHVkaW5nIGNvbmZpZ3VyYWJsZSBvcGVuaW5nIHN0eWxlKSBhbmQgb3B0aW9uYWwgcmV1c2UgdGV4dCwgdGhlbiB3cml0ZXMgdGhlIGdlbmVyYXRlZCBib2R5IGludG8gdGhlIGVkaXRhYmxlIGNvdmVyLWxldHRlciB0ZXh0YXJlYS5cbiAgICovXG4gIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1nZW5lcmF0ZS1idG4nKTtcbiAgYnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgYnRuLnRleHRDb250ZW50ID0gJ1x1MjNGMyBHZW5lcmF0aW5nXHUyMDI2JztcblxuICBjb25zdCB0b25lICAgICAgICAgICAgPSAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLXRvbmUtc2VsZWN0JykgICAgICB8fCB7fSkudmFsdWUgfHwgJ3N0YXJ0dXAvdGVjaCc7XG4gIGNvbnN0IG9wZW5pbmdfc3R5bGUgICA9IChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtb3BlbmluZy1zdHlsZScpICAgIHx8IHt9KS52YWx1ZSB8fCAnZm9ybWFsJztcbiAgY29uc3QgaGlyaW5nX21hbmFnZXIgID0gKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1oaXJpbmctbWFuYWdlcicpICAgfHwge30pLnZhbHVlIHx8ICcnO1xuICBjb25zdCBjb21wYW55X2FkZHJlc3MgPSAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWNvbXBhbnktYWRkcmVzcycpICB8fCB7fSkudmFsdWUgfHwgJyc7XG4gIGNvbnN0IGhpZ2hsaWdodCAgICAgICA9IChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtaGlnaGxpZ2h0JykgICAgICAgICB8fCB7fSkudmFsdWUgfHwgJyc7XG4gIGNvbnN0IGNvbXBhbnlfY29udGV4dCA9IChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtY29tcGFueS1jb250ZXh0JykgIHx8IHt9KS52YWx1ZSB8fCAnJztcblxuICAvLyBDaGVjayBmb3IgcHJpb3IgbGV0dGVyIHNlbGVjdGlvblxuICBsZXQgcmV1c2VfYm9keSA9ICcnO1xuICBjb25zdCBjaGVja2VkUHJpb3IgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFtuYW1lPVwiY2wtcHJpb3JcIl06Y2hlY2tlZCcpO1xuICBpZiAoY2hlY2tlZFByaW9yKSB7XG4gICAgY29uc3QgaWR4ID0gcGFyc2VJbnQoY2hlY2tlZFByaW9yLnZhbHVlLCAxMCk7XG4gICAgcmV1c2VfYm9keSA9IChfY292ZXJMZXR0ZXJQcmlvclNlc3Npb25zW2lkeF0gfHwge30pLmZ1bGxfdGV4dCB8fCAnJztcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL2NvdmVyLWxldHRlci9nZW5lcmF0ZScsIHtcbiAgICAgIG1ldGhvZDogICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogICAgSlNPTi5zdHJpbmdpZnkoeyB0b25lLCBvcGVuaW5nX3N0eWxlLCBoaXJpbmdfbWFuYWdlciwgY29tcGFueV9hZGRyZXNzLCBoaWdobGlnaHQsIGNvbXBhbnlfY29udGV4dCwgcmV1c2VfYm9keSB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcblxuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBjb25zdCByZXN1bHRTZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLXJlc3VsdC1zZWN0aW9uJyk7XG4gICAgICBjb25zdCB0ZXh0YXJlYSAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWxldHRlci10ZXh0YXJlYScpO1xuICAgICAgaWYgKHJlc3VsdFNlY3Rpb24pIHJlc3VsdFNlY3Rpb24uc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICBpZiAodGV4dGFyZWEpIHtcbiAgICAgICAgdGV4dGFyZWEudmFsdWUgPSBkYXRhLnRleHQ7XG4gICAgICAgIF92YWxpZGF0ZUNvdmVyTGV0dGVyKHRleHRhcmVhLnZhbHVlKTtcbiAgICAgIH1cbiAgICAgIF9jb3ZlckxldHRlckZvcm1TdGF0ZS5sZXR0ZXJUZXh0ICAgID0gZGF0YS50ZXh0O1xuICAgICAgX2NvdmVyTGV0dGVyRm9ybVN0YXRlLmxldHRlclZpc2libGUgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEdlbmVyYXRpb24gRmFpbGVkJywgZGF0YS5lcnJvciB8fCAnTExNIGRpZCBub3QgcmV0dXJuIGEgY292ZXIgbGV0dGVyLicpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIGNvbnRhY3Qgc2VydmVyLicpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChidG4pIHtcbiAgICAgIGJ0bi5kaXNhYmxlZCAgICA9IGZhbHNlO1xuICAgICAgYnRuLnRleHRDb250ZW50ID0gJ1x1MjcyOCBHZW5lcmF0ZSBDb3ZlciBMZXR0ZXInO1xuICAgIH1cbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgU2F2ZSBjb3ZlciBsZXR0ZXIgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIHNhdmVDb3ZlckxldHRlcigpIHtcbiAgLyogZHVja2Zsb3c6XG4gICAqICAgaWQ6IGNvdmVyX2xldHRlcl91aV9zYXZlX2xpdmVcbiAgICogICBraW5kOiB1aVxuICAgKiAgIHRpbWVzdGFtcDogJzIwMjYtMDMtMjVUMjE6Mzk6NDhaJ1xuICAgKiAgIHN0YXR1czogbGl2ZVxuICAgKiAgIGhhbmRsZXM6XG4gICAqICAgLSB1aTpjb3Zlci1sZXR0ZXIuc2F2ZVxuICAgKiAgIGNhbGxzOlxuICAgKiAgIC0gUE9TVCAvYXBpL2NvdmVyLWxldHRlci9zYXZlXG4gICAqICAgcmVhZHM6XG4gICAqICAgLSBkb206I2NsLWxldHRlci10ZXh0YXJlYS52YWx1ZVxuICAgKiAgIHdyaXRlczpcbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL2NvdmVyLWxldHRlci9zYXZlLnRleHRcbiAgICogICBub3RlczogU3VibWl0cyB0aGUgdXNlci1lZGl0ZWQgY292ZXItbGV0dGVyIGJvZHkgZm9yIHNlc3Npb24gcGVyc2lzdGVuY2UsIG1ldGFkYXRhIHdyaXRlLXRocm91Z2gsIGFuZCBhcmNoaXZlIGFydGlmYWN0IGdlbmVyYXRpb24uXG4gICAqL1xuICBjb25zdCB0ZXh0YXJlYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1sZXR0ZXItdGV4dGFyZWEnKTtcbiAgaWYgKCF0ZXh0YXJlYSkgcmV0dXJuO1xuICBjb25zdCB0ZXh0ID0gdGV4dGFyZWEudmFsdWUudHJpbSgpO1xuICBpZiAoIXRleHQpIHtcbiAgICBzaG93QWxlcnRNb2RhbCgnXHUyNkEwXHVGRTBGIEVtcHR5IExldHRlcicsICdQbGVhc2UgZ2VuZXJhdGUgb3IgdHlwZSBhIGNvdmVyIGxldHRlciBiZWZvcmUgc2F2aW5nLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1zYXZlLWJ0bicpO1xuICBpZiAoYnRuKSB7IGJ0bi5kaXNhYmxlZCA9IHRydWU7IGJ0bi50ZXh0Q29udGVudCA9ICdcdTIzRjMgU2F2aW5nXHUyMDI2JzsgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL2NvdmVyLWxldHRlci9zYXZlJywge1xuICAgICAgbWV0aG9kOiAgJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiAgICBKU09OLnN0cmluZ2lmeSh7IHRleHQgfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG5cbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjcwNSBTYXZlZCcsIGBDb3ZlciBsZXR0ZXIgc2F2ZWQgYXMgPHN0cm9uZz4ke2VzY2FwZUh0bWwoZGF0YS5maWxlbmFtZSl9PC9zdHJvbmc+IGluIHlvdXIgYXBwbGljYXRpb24gZm9sZGVyLmApO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIFNhdmUgRmFpbGVkJywgZGF0YS5lcnJvciB8fCAnQ291bGQgbm90IHNhdmUgY292ZXIgbGV0dGVyLicpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIGNvbnRhY3Qgc2VydmVyLicpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChidG4pIHsgYnRuLmRpc2FibGVkID0gZmFsc2U7IGJ0bi50ZXh0Q29udGVudCA9ICdcdUQ4M0RcdURDQkUgU2F2ZSBDb3ZlciBMZXR0ZXInOyB9XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIENyb3NzLWRvY3VtZW50IGNvbnNpc3RlbmN5IHJlcG9ydCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLyoqXG4gKiBCdWlsZCBhbmQgcmVuZGVyIHRoZSBjcm9zcy1kb2N1bWVudCBjb25zaXN0ZW5jeSByZXBvcnQgaW4gdGhlIEZpbmFsaXNlIHRhYi5cbiAqIENoZWNrcyBjb21wYW55IG5hbWUsIGpvYiB0aXRsZSwgQVRTIGtleXdvcmRzLCBhbmQgZGF0ZSBmb3JtYXR0aW5nIGFjcm9zc1xuICogdGhlIENWICh0YWJEYXRhLmN2KSBhbmQgY292ZXIgbGV0dGVyICgjY2wtbGV0dGVyLXRleHRhcmVhKS5cbiAqL1xuZnVuY3Rpb24gX3JlbmRlckNvbnNpc3RlbmN5UmVwb3J0KHN0YXR1c0RhdGEpIHtcbiAgY29uc3QgcGFuZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29uc2lzdGVuY3ktcmVwb3J0Jyk7XG4gIGlmICghcGFuZWwpIHJldHVybjtcblxuICBjb25zdCBhbmFseXNpcyAgICA9IHN0YXR1c0RhdGEuam9iX2FuYWx5c2lzIHx8IHt9O1xuICBjb25zdCBjb21wYW55ICAgICA9IChhbmFseXNpcy5jb21wYW55ICB8fCAnJykudHJpbSgpO1xuICBjb25zdCBqb2JUaXRsZSAgICA9IChhbmFseXNpcy50aXRsZSAgICB8fCAnJykudHJpbSgpO1xuICBjb25zdCBhdHNLZXl3b3JkcyA9IChhbmFseXNpcy5hdHNfa2V5d29yZHMgfHwgW10pLmZpbHRlcihCb29sZWFuKS5zbGljZSgwLCA4KTtcblxuICAvLyBTdHJpcCBIVE1MIHRhZ3MgZnJvbSBDViBjb250ZW50IGZvciB0ZXh0IHNlYXJjaFxuICBjb25zdCBjdlN0YXRlID0gc3RhdGVNYW5hZ2VyLmdldFRhYkRhdGEoJ2N2JykgfHwgJyc7XG4gIGNvbnN0IGN2SHRtbCA9IHR5cGVvZiBjdlN0YXRlID09PSAnc3RyaW5nJyA/IGN2U3RhdGUgOiAoY3ZTdGF0ZT8uWycqLmh0bWwnXSB8fCAnJyk7XG4gIGNvbnN0IGN2VGV4dCA9IGN2SHRtbC5yZXBsYWNlKC88W14+XSs+L2csICcgJykucmVwbGFjZSgvXFxzKy9nLCAnICcpLnRvTG93ZXJDYXNlKCk7XG5cbiAgLy8gR2V0IGNvdmVyIGxldHRlciB0ZXh0IGlmIHByZXNlbnRcbiAgY29uc3QgY2xFbCAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWxldHRlci10ZXh0YXJlYScpO1xuICBjb25zdCBjbFJhdyAgPSBjbEVsID8gY2xFbC52YWx1ZSA6ICcnO1xuICBjb25zdCBjbFRleHQgPSBjbFJhdy50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBoYXNDTCAgPSBjbFJhdy50cmltKCkubGVuZ3RoID4gNTA7XG5cbiAgaWYgKCFjb21wYW55ICYmICFqb2JUaXRsZSAmJiAhYXRzS2V5d29yZHMubGVuZ3RoKSB7XG4gICAgcGFuZWwuaW5uZXJIVE1MID0gJyc7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY2hlY2tzID0gW107XG5cbiAgLy8gXHUyNTAwXHUyNTAwIDEuIENvbXBhbnkgbmFtZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgaWYgKGNvbXBhbnkpIHtcbiAgICBjb25zdCBjb21wTGMgPSBjb21wYW55LnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgaW5DViAgID0gY3ZUZXh0LmluY2x1ZGVzKGNvbXBMYyk7XG4gICAgY29uc3QgaW5DTCAgID0gaGFzQ0wgJiYgY2xUZXh0LmluY2x1ZGVzKGNvbXBMYyk7XG4gICAgY29uc3QgbWlzc2luZyA9IFtdO1xuICAgIGlmICghaW5DVikgICAgICAgICAgbWlzc2luZy5wdXNoKCdDVicpO1xuICAgIGlmIChoYXNDTCAmJiAhaW5DTCkgbWlzc2luZy5wdXNoKCdjb3ZlciBsZXR0ZXInKTtcbiAgICBjb25zdCBzdGF0dXMgPSBtaXNzaW5nLmxlbmd0aCA9PT0gMCA/ICdwYXNzJyA6IG1pc3NpbmcubGVuZ3RoIDwgMiAmJiBoYXNDTCA/ICd3YXJuJyA6ICdmYWlsJztcbiAgICBjaGVja3MucHVzaCh7XG4gICAgICBzdGF0dXMsXG4gICAgICBsYWJlbDogICdDb21wYW55IG5hbWUnLFxuICAgICAgZGV0YWlsOiBzdGF0dXMgPT09ICdwYXNzJ1xuICAgICAgICA/IGBcXHUyMDFjJHtlc2NhcGVIdG1sKGNvbXBhbnkpfVxcdTIwMWQgZm91bmQgaW4gYWxsIGRvY3VtZW50cy5gXG4gICAgICAgIDogYFxcdTIwMWMke2VzY2FwZUh0bWwoY29tcGFueSl9XFx1MjAxZCBtaXNzaW5nIGZyb206ICR7bWlzc2luZy5qb2luKCcsICcpfS5gLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gXHUyNTAwXHUyNTAwIDIuIEpvYiB0aXRsZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgaWYgKGpvYlRpdGxlKSB7XG4gICAgY29uc3QgdGl0bGVMYyAgID0gam9iVGl0bGUudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCB0aXRsZUNvcmUgPSB0aXRsZUxjLnJlcGxhY2UoL14oc2VuaW9yfGp1bmlvcnxsZWFkfHByaW5jaXBhbHxzdGFmZnxhc3NvY2lhdGUpXFxzKy8sICcnKTtcbiAgICBjb25zdCBpbkNWICAgICAgPSBjdlRleHQuaW5jbHVkZXModGl0bGVMYykgfHwgY3ZUZXh0LmluY2x1ZGVzKHRpdGxlQ29yZSk7XG4gICAgY29uc3QgaW5DTCAgICAgID0gaGFzQ0wgJiYgKGNsVGV4dC5pbmNsdWRlcyh0aXRsZUxjKSB8fCBjbFRleHQuaW5jbHVkZXModGl0bGVDb3JlKSk7XG4gICAgY29uc3QgbWlzc2luZyAgID0gW107XG4gICAgaWYgKCFpbkNWKSAgICAgICAgICBtaXNzaW5nLnB1c2goJ0NWJyk7XG4gICAgaWYgKGhhc0NMICYmICFpbkNMKSBtaXNzaW5nLnB1c2goJ2NvdmVyIGxldHRlcicpO1xuICAgIGNvbnN0IHN0YXR1cyA9IG1pc3NpbmcubGVuZ3RoID09PSAwID8gJ3Bhc3MnIDogbWlzc2luZy5sZW5ndGggPCAyICYmIGhhc0NMID8gJ3dhcm4nIDogJ2ZhaWwnO1xuICAgIGNoZWNrcy5wdXNoKHtcbiAgICAgIHN0YXR1cyxcbiAgICAgIGxhYmVsOiAgJ0pvYiB0aXRsZScsXG4gICAgICBkZXRhaWw6IHN0YXR1cyA9PT0gJ3Bhc3MnXG4gICAgICAgID8gYFxcdTIwMWMke2VzY2FwZUh0bWwoam9iVGl0bGUpfVxcdTIwMWQgZm91bmQgaW4gYWxsIGRvY3VtZW50cy5gXG4gICAgICAgIDogYFxcdTIwMWMke2VzY2FwZUh0bWwoam9iVGl0bGUpfVxcdTIwMWQgbWlzc2luZyBmcm9tOiAke21pc3Npbmcuam9pbignLCAnKX0uYCxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFx1MjUwMFx1MjUwMCAzLiBBVFMga2V5d29yZHMgKHRvcCA4KSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgaWYgKGF0c0tleXdvcmRzLmxlbmd0aCkge1xuICAgIGNvbnN0IG1pc3NpbmdDViA9IGF0c0tleXdvcmRzLmZpbHRlcihrdyA9PiAhY3ZUZXh0LmluY2x1ZGVzKGt3LnRvTG93ZXJDYXNlKCkpKTtcbiAgICBjb25zdCBtaXNzaW5nQ0wgPSBoYXNDTCA/IGF0c0tleXdvcmRzLmZpbHRlcihrdyA9PiAhY2xUZXh0LmluY2x1ZGVzKGt3LnRvTG93ZXJDYXNlKCkpKSA6IFtdO1xuICAgIGNvbnN0IHRvdGFsTWlzc2luZyA9IG5ldyBTZXQoWy4uLm1pc3NpbmdDViwgLi4ubWlzc2luZ0NMXSkuc2l6ZTtcbiAgICBjb25zdCBzdGF0dXMgPSB0b3RhbE1pc3NpbmcgPT09IDAgPyAncGFzcycgOiB0b3RhbE1pc3NpbmcgPD0gMyA/ICd3YXJuJyA6ICdmYWlsJztcbiAgICBjb25zdCBwYXJ0cyAgPSBbXTtcbiAgICBpZiAobWlzc2luZ0NWLmxlbmd0aCkgcGFydHMucHVzaChgTWlzc2luZyBmcm9tIENWOiAke21pc3NpbmdDVi5tYXAoayA9PiBgPGVtPiR7ZXNjYXBlSHRtbChrKX08L2VtPmApLmpvaW4oJywgJyl9YCk7XG4gICAgaWYgKG1pc3NpbmdDTC5sZW5ndGgpIHBhcnRzLnB1c2goYE1pc3NpbmcgZnJvbSBjb3ZlciBsZXR0ZXI6ICR7bWlzc2luZ0NMLm1hcChrID0+IGA8ZW0+JHtlc2NhcGVIdG1sKGspfTwvZW0+YCkuam9pbignLCAnKX1gKTtcbiAgICBjaGVja3MucHVzaCh7XG4gICAgICBzdGF0dXMsXG4gICAgICBsYWJlbDogIGBBVFMga2V5d29yZHMgKCR7YXRzS2V5d29yZHMubGVuZ3RofSBjaGVja2VkKWAsXG4gICAgICBkZXRhaWw6IHBhcnRzLmxlbmd0aCA/IHBhcnRzLmpvaW4oJy4gJykgKyAnLicgOiBgQWxsICR7YXRzS2V5d29yZHMubGVuZ3RofSBrZXl3b3JkcyBwcmVzZW50IGluIGRvY3VtZW50cy5gLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gXHUyNTAwXHUyNTAwIDQuIERhdGUgZm9ybWF0IGNvbnNpc3RlbmN5IChDVikgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIGlmIChjdlRleHQpIHtcbiAgICBjb25zdCBoYXNXcml0dGVuID0gL1xcYihqYW58ZmVifG1hcnxhcHJ8bWF5fGp1bnxqdWx8YXVnfHNlcHxvY3R8bm92fGRlYylcXHcqXFxzK1xcZHs0fVxcYi9pLnRlc3QoY3ZUZXh0KTtcbiAgICBjb25zdCBoYXNJU08gICAgID0gL1xcYlxcZHs0fS1cXGR7Mn1cXGIvLnRlc3QoY3ZUZXh0KTtcbiAgICBjb25zdCBoYXNTbGFzaCAgID0gL1xcYlxcZHsxLDJ9XFwvXFxkezR9XFxiLy50ZXN0KGN2VGV4dCk7XG4gICAgY29uc3QgZm9ybWF0Q291bnQgPSBbaGFzV3JpdHRlbiwgaGFzSVNPLCBoYXNTbGFzaF0uZmlsdGVyKEJvb2xlYW4pLmxlbmd0aDtcbiAgICBjaGVja3MucHVzaCh7XG4gICAgICBzdGF0dXM6IGZvcm1hdENvdW50IDw9IDEgPyAncGFzcycgOiAnd2FybicsXG4gICAgICBsYWJlbDogICdEYXRlIGZvcm1hdHMgKENWKScsXG4gICAgICBkZXRhaWw6IGZvcm1hdENvdW50IDw9IDFcbiAgICAgICAgPyAnQ29uc2lzdGVudCBkYXRlIGZvcm1hdCB0aHJvdWdob3V0IENWLidcbiAgICAgICAgOiAnTWl4ZWQgZGF0ZSBmb3JtYXRzIGRldGVjdGVkIChlLmcuIFxcdTIwMWNKYW4gMjAyMFxcdTIwMWQgYW5kIFxcdTIwMWMyMDIwLTAxXFx1MjAxZCkgXFx1MjAxNCBzdGFuZGFyZGlzZSBmb3IgYSBwb2xpc2hlZCBsb29rLicsXG4gICAgfSk7XG4gIH1cblxuICAvLyBcXHUyNTAwXFx1MjUwMCA1LiBDcm9zcy1kb2N1bWVudCB0ZXJtaW5vbG9neSBjb25zaXN0ZW5jeSBcXHUyNTAwXFx1MjUwMFxcdTI1MDBcXHUyNTAwXFx1MjUwMFxcdTI1MDBcXHUyNTAwXFx1MjUwMFxcdTI1MDBcXHUyNTAwXFx1MjUwMFxcdTI1MDBcXHUyNTAwXFx1MjUwMFxcdTI1MDBcXHUyNTAwXFx1MjUwMFxcdTI1MDBcXHUyNTAwXFx1MjUwMFxcdTI1MDBcbiAgY29uc3Qgc3FUZXh0cyA9IFsuLi5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCd0ZXh0YXJlYVtpZF49XCJzYy10ZXh0LVwiXScpXVxuICAgIC5tYXAoZWwgPT4gZWwudmFsdWUudG9Mb3dlckNhc2UoKSkuZmlsdGVyKEJvb2xlYW4pO1xuICBjb25zdCBhbGxEb2NUZXh0ID0gW2N2VGV4dCwgY2xUZXh0LCAuLi5zcVRleHRzXTtcblxuICBjb25zdCBfVEVSTV9QQUlSUyA9IFtcbiAgICBbJ21hY2hpbmUgbGVhcm5pbmcnLCAnbWwnXSwgWydhcnRpZmljaWFsIGludGVsbGlnZW5jZScsICdhaSddLFxuICAgIFsnbmF0dXJhbCBsYW5ndWFnZSBwcm9jZXNzaW5nJywgJ25scCddLCBbJ2RlZXAgbGVhcm5pbmcnLCAnZGwnXSxcbiAgICBbJ2xhcmdlIGxhbmd1YWdlIG1vZGVsJywgJ2xsbSddLCBbJ3VzZXIgaW50ZXJmYWNlJywgJ3VpJ10sXG4gICAgWyd1c2VyIGV4cGVyaWVuY2UnLCAndXgnXSwgWydhcHBsaWNhdGlvbiBwcm9ncmFtbWluZyBpbnRlcmZhY2UnLCAnYXBpJ10sXG4gICAgWydrdWJlcm5ldGVzJywgJ2s4cyddLCBbJ2NvbnRpbnVvdXMgaW50ZWdyYXRpb24nLCAnY2kvY2QnXSxcbiAgXTtcbiAgY29uc3QgdGVybU1pc21hdGNoZXMgPSBbXTtcbiAgZm9yIChjb25zdCBbbG9uZywgc2hvcnRdIG9mIF9URVJNX1BBSVJTKSB7XG4gICAgY29uc3QgcmUgPSBuZXcgUmVnRXhwKGBcXFxcYiR7c2hvcnQucmVwbGFjZSgnLycsICdcXFxcLycpfVxcXFxiYCk7XG4gICAgaWYgKGFsbERvY1RleHQuc29tZSh0ID0+IHQuaW5jbHVkZXMobG9uZykpICYmIGFsbERvY1RleHQuc29tZSh0ID0+IHJlLnRlc3QodCkpKSB7XG4gICAgICB0ZXJtTWlzbWF0Y2hlcy5wdXNoKGBcXHUyMDFjJHtsb25nfVxcdTIwMWQgLyBcXHUyMDFjJHtzaG9ydC50b1VwcGVyQ2FzZSgpfVxcdTIwMWRgKTtcbiAgICB9XG4gIH1cbiAgaWYgKHRlcm1NaXNtYXRjaGVzLmxlbmd0aCA+IDApIHtcbiAgICBjaGVja3MucHVzaCh7XG4gICAgICBzdGF0dXM6ICd3YXJuJyxcbiAgICAgIGxhYmVsOiAgJ1Rlcm1pbm9sb2d5IGNvbnNpc3RlbmN5JyxcbiAgICAgIGRldGFpbDogYE1peGVkIGZvcm1zIGRldGVjdGVkIGFjcm9zcyBkb2N1bWVudHM6ICR7dGVybU1pc21hdGNoZXMuam9pbignOyAnKX0uIFN0YW5kYXJkaXNlIHRvIG9uZSBmb3JtIHBlciBjb25jZXB0LmAsXG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoYWxsRG9jVGV4dC5zb21lKHQgPT4gdC5sZW5ndGggPiA1MCkpIHtcbiAgICBjaGVja3MucHVzaCh7XG4gICAgICBzdGF0dXM6ICdwYXNzJyxcbiAgICAgIGxhYmVsOiAgJ1Rlcm1pbm9sb2d5IGNvbnNpc3RlbmN5JyxcbiAgICAgIGRldGFpbDogJ05vIG1peGVkIGFiYnJldmlhdGlvbi9leHBhbnNpb24gcGFpcnMgZGV0ZWN0ZWQgYWNyb3NzIENWLCBjb3ZlciBsZXR0ZXIsIGFuZCBzY3JlZW5pbmcgYW5zd2Vycy4nLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gXHUyNTAwXHUyNTAwIFJlbmRlciBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgY29uc3QgaWNvbnMgPSB7IHBhc3M6ICdcXHUyNzA1Jywgd2FybjogJ1xcdTI2YTBcXHVmZTBmJywgZmFpbDogJ1xcdTI3NGMnIH07XG4gIGNvbnN0IG92ZXJhbGxGYWlsICAgPSBjaGVja3Muc29tZShjID0+IGMuc3RhdHVzID09PSAnZmFpbCcpO1xuICBjb25zdCBvdmVyYWxsV2FybiAgID0gY2hlY2tzLnNvbWUoYyA9PiBjLnN0YXR1cyA9PT0gJ3dhcm4nKTtcbiAgY29uc3Qgb3ZlcmFsbFN0YXR1cyA9IG92ZXJhbGxGYWlsID8gJ2ZhaWwnIDogb3ZlcmFsbFdhcm4gPyAnd2FybicgOiAncGFzcyc7XG4gIGNvbnN0IG92ZXJhbGxNc2cgICAgPSBvdmVyYWxsRmFpbFxuICAgID8gJ0lzc3VlcyBmb3VuZCBcXHUyMDE0IHJldmlldyBiZWZvcmUgc2VuZGluZydcbiAgICA6IG92ZXJhbGxXYXJuID8gJ01pbm9yIGluY29uc2lzdGVuY2llcyBkZXRlY3RlZCcgOiAnQWxsIGNoZWNrcyBwYXNzZWQnO1xuXG4gIHBhbmVsLmlubmVySFRNTCA9IGBcbiAgICA8ZGl2IGNsYXNzPVwiY29uc2lzdGVuY3ktcmVwb3J0XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3ItaGVhZGVyXCI+XG4gICAgICAgIDxoMyBzdHlsZT1cIm1hcmdpbjowO2ZvbnQtc2l6ZToxZW07XCI+JHtpY29uc1tvdmVyYWxsU3RhdHVzXX0gQ3Jvc3MtRG9jdW1lbnQgQ29uc2lzdGVuY3k8L2gzPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImNyLWJhZGdlIGNyLSR7b3ZlcmFsbFN0YXR1c31cIj4ke2VzY2FwZUh0bWwob3ZlcmFsbE1zZyl9PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7Zm9udC1zaXplOjAuODNlbTttYXJnaW46MCAwIDEycHg7XCI+XG4gICAgICAgIENoZWNrcyBjb21wYW55IG5hbWUsIGpvYiB0aXRsZSwgQVRTIGtleXdvcmRzLCBkYXRlIGZvcm1hdHRpbmcsIGFuZCB0ZXJtaW5vbG9neSBjb25zaXN0ZW5jeSBhY3Jvc3MgQ1YsIGNvdmVyIGxldHRlciwgYW5kIHNjcmVlbmluZyBhbnN3ZXJzLlxuICAgICAgPC9wPlxuICAgICAgPGRpdiBjbGFzcz1cImNyLWNoZWNrc1wiPlxuICAgICAgICAke2NoZWNrcy5tYXAoYyA9PiBgXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNyLWNoZWNrIGNyLSR7Yy5zdGF0dXN9XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNyLWljb25cIj4ke2ljb25zW2Muc3RhdHVzXX08L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNyLWxhYmVsXCI+JHtlc2NhcGVIdG1sKGMubGFiZWwpfTwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3ItZGV0YWlsXCI+JHtjLmRldGFpbH08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+YCkuam9pbignJyl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgRGVib3VuY2VkIHZhbGlkYXRpb24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmxldCBfY2xWYWxpZGF0ZVRpbWVyID0gbnVsbDtcbmZ1bmN0aW9uIF9kZWJvdW5jZWRWYWxpZGF0ZUNMKCkge1xuICBjbGVhclRpbWVvdXQoX2NsVmFsaWRhdGVUaW1lcik7XG4gIF9jbFZhbGlkYXRlVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICBjb25zdCB0YSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1sZXR0ZXItdGV4dGFyZWEnKTtcbiAgICBpZiAodGEpIF92YWxpZGF0ZUNvdmVyTGV0dGVyKHRhLnZhbHVlKTtcbiAgfSwgNjAwKTtcbn1cblxuLyoqXG4gKiBDbGllbnQtc2lkZSBjb3ZlciBsZXR0ZXIgcXVhbGl0eSBjaGVja3MuXG4gKiA1IHJ1bGVzOiBvcGVuaW5nLCBJLWZpcnN0IGdhdGUsIGNvbXBhbnkgbmFtZSwgd29yZCBjb3VudCAocm9sZS1kaWZmZXJlbnRpYXRlZCksIGNhbGwtdG8tYWN0aW9uLlxuICovXG5mdW5jdGlvbiBfdmFsaWRhdGVDb3ZlckxldHRlcih0ZXh0KSB7XG4gIGNvbnN0IHBhbmVsICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC12YWxpZGF0aW9uLXBhbmVsJyk7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1jaGVja3MtY29udGFpbmVyJyk7XG4gIGlmICghcGFuZWwgfHwgIWNvbnRhaW5lciB8fCAhdGV4dC50cmltKCkpIHJldHVybjtcblxuICAvLyBcdTI1MDBcdTI1MDAgUnVsZSAxOiBPcGVuaW5nIHBhdHRlcm4gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIGNvbnN0IGZpcnN0TGluZSA9ICh0ZXh0LnNwbGl0KCdcXG4nKS5maW5kKGwgPT4gbC50cmltKCkpIHx8ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgZ2VuZXJpY09wZW5pbmdzID0gW1xuICAgIC9eZGVhciBoaXJpbmcgbWFuYWdlci8sXG4gICAgL15kZWFyIHNpciBvciBtYWRhbS8sXG4gICAgL150byB3aG9tIGl0IG1heSBjb25jZXJuLyxcbiAgICAvXmRlYXIgcmVjcnVpdGVyLyxcbiAgICAvXmRlYXIgaHVtYW4gcmVzb3VyY2VzLyxcbiAgICAvXmRlYXIgaHIvLFxuICBdO1xuICBjb25zdCBnZW5lcmljT3BlbmluZyA9IGdlbmVyaWNPcGVuaW5ncy5zb21lKHJlID0+IHJlLnRlc3QoZmlyc3RMaW5lKSk7XG4gIGNvbnN0IG9wZW5pbmdDaGVjayA9IHtcbiAgICBwYXNzOiAhZ2VuZXJpY09wZW5pbmcsXG4gICAgbGFiZWw6ICdPcGVuaW5nIHNhbHV0YXRpb24nLFxuICAgIGRldGFpbDogZ2VuZXJpY09wZW5pbmdcbiAgICAgID8gJ1VzZXMgYSBnZW5lcmljIG9wZW5lciAoXCJEZWFyIEhpcmluZyBNYW5hZ2VyXCIgZXRjLikgXHUyMDE0IHBlcnNvbmFsaXNlIHdpdGggYSBuYW1lIG9yIHJvbGUuJ1xuICAgICAgOiAnUGVyc29uYWxpc2VkIG9wZW5lciBcdTIwMTQgZ29vZC4nLFxuICB9O1xuXG4gIC8vIFx1MjUwMFx1MjUwMCBSdWxlIDFiOiBCb2R5IG11c3Qgbm90IG9wZW4gd2l0aCBcIklcIiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgY29uc3QgYWxsTGluZXMgPSB0ZXh0LnNwbGl0KCdcXG4nKS5tYXAobCA9PiBsLnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pO1xuICBjb25zdCBzYWx1dGF0aW9uSWR4ID0gYWxsTGluZXMuZmluZEluZGV4KFxuICAgIGwgPT4gbC50b0xvd2VyQ2FzZSgpID09PSBmaXJzdExpbmUudG9Mb3dlckNhc2UoKVxuICApO1xuICBjb25zdCBib2R5TGluZXMgPSBhbGxMaW5lcy5zbGljZShNYXRoLm1heCgwLCBzYWx1dGF0aW9uSWR4ICsgMSkpO1xuICBjb25zdCBmaXJzdEJvZHlXb3JkID0gKGJvZHlMaW5lcy5maW5kKGwgPT4gbC50cmltKCkpIHx8ICcnKS5zcGxpdCgvXFxzKy8pWzBdIHx8ICcnO1xuICAvLyBTcGxpdCBvbiBub24tYWxwaGEgc28gXCJJJ21cIiBcdTIxOTIgdG9rZW4gXCJJXCIsIFwiSW5cIiBcdTIxOTIgdG9rZW4gXCJJblwiXG4gIGNvbnN0IGZpcnN0Qm9keVRva2VuID0gZmlyc3RCb2R5V29yZC5zcGxpdCgvW15hLXpBLVpdLylbMF0gfHwgJyc7XG4gIGNvbnN0IGJvZHlTdGFydHNXaXRoSSA9IGZpcnN0Qm9keVRva2VuLnRvTG93ZXJDYXNlKCkgPT09ICdpJztcbiAgY29uc3QgaUZpcnN0Q2hlY2sgPSB7XG4gICAgcGFzczogIWJvZHlTdGFydHNXaXRoSSxcbiAgICBsYWJlbDogJ09wZW5pbmcgd29yZCcsXG4gICAgZGV0YWlsOiBib2R5U3RhcnRzV2l0aElcbiAgICAgID8gJ0JvZHkgb3BlbnMgd2l0aCBcIklcIiBcdTIwMTQgbGVhZCB3aXRoIHlvdXIgdmFsdWUsIHRoZSByb2xlLCBvciB0aGUgY29tcGFueSBpbnN0ZWFkLidcbiAgICAgIDogJ0JvZHkgZG9lcyBub3Qgb3BlbiB3aXRoIFwiSVwiIFx1MjAxNCBnb29kLicsXG4gIH07XG5cbiAgLy8gXHUyNTAwXHUyNTAwIFJ1bGUgMjogQ29tcGFueS1zcGVjaWZpYyByZWZlcmVuY2UgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIGNvbnN0IGNvbXBhbnlOYW1lID0gX2dldENvbXBhbnlOYW1lRm9yQ0woKTtcbiAgbGV0IGNvbXBhbnlDaGVjaztcbiAgaWYgKCFjb21wYW55TmFtZSkge1xuICAgIGNvbXBhbnlDaGVjayA9IHsgd2FybjogdHJ1ZSwgbGFiZWw6ICdDb21wYW55IHJlZmVyZW5jZScsIGRldGFpbDogJ0NvbXBhbnkgbmFtZSBub3QgZGV0ZWN0ZWQgZnJvbSBqb2IgZGVzY3JpcHRpb24gXHUyMDE0IHZlcmlmeSBtYW51YWxseS4nIH07XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgbWVudGlvbnMgPSAodGV4dC50b0xvd2VyQ2FzZSgpLm1hdGNoKG5ldyBSZWdFeHAoY29tcGFueU5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgJ1xcXFwkJicpLCAnZycpKSB8fCBbXSkubGVuZ3RoO1xuICAgIGNvbXBhbnlDaGVjayA9IHtcbiAgICAgIHBhc3M6IG1lbnRpb25zID49IDIsXG4gICAgICB3YXJuOiBtZW50aW9ucyA9PT0gMSxcbiAgICAgIGxhYmVsOiAnQ29tcGFueSByZWZlcmVuY2UnLFxuICAgICAgZGV0YWlsOiBtZW50aW9ucyA9PT0gMFxuICAgICAgICA/IGBcIiR7ZXNjYXBlSHRtbChjb21wYW55TmFtZSl9XCIgbm90IG1lbnRpb25lZCBcdTIwMTQgYWRkIHNwZWNpZmljIHJlZmVyZW5jZXMuYFxuICAgICAgICA6IG1lbnRpb25zID09PSAxXG4gICAgICAgICAgPyBgXCIke2VzY2FwZUh0bWwoY29tcGFueU5hbWUpfVwiIG1lbnRpb25lZCBvbmNlIFx1MjAxNCBhIHNlY29uZCBzcGVjaWZpYyByZWZlcmVuY2Ugc3RyZW5ndGhlbnMgdGhlIGxldHRlci5gXG4gICAgICAgICAgOiBgXCIke2VzY2FwZUh0bWwoY29tcGFueU5hbWUpfVwiIG1lbnRpb25lZCAke21lbnRpb25zfSB0aW1lcyBcdTIwMTQgZ29vZCBzcGVjaWZpY2l0eS5gLFxuICAgIH07XG4gIH1cblxuICAvLyBcdTI1MDBcdTI1MDAgUnVsZSAzOiBXb3JkIGNvdW50IChyb2xlLWRpZmZlcmVudGlhdGVkIHRhcmdldCkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIGNvbnN0IF9yb2xlQW5hbHlzaXMgPSB3aW5kb3cuX2xhc3RBbmFseXNpc0RhdGEgfHxcbiAgICAod2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnMgJiYgd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnMuam9iX2FuYWx5c2lzKSB8fCB7fTtcbiAgY29uc3QgX3JvbGVMZXZlbCAgPSAoX3JvbGVBbmFseXNpcy5yb2xlX2xldmVsIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBfcm9sZURvbWFpbiA9IChfcm9sZUFuYWx5c2lzLmRvbWFpbiB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgaXNFeGVjICAgICAgPSAvZXhlY3x2cHxjLXN1aXRlfGNoaWVmfGRpcmVjdG9yfHByZXNpZGVudHxwYXJ0bmVyLy50ZXN0KF9yb2xlTGV2ZWwpO1xuICBjb25zdCBpc0FjYWRlbWljICA9IC9hY2FkZW1pY3xyZXNlYXJjaHxmYWN1bHR5fHByb2Zlc3Nvcnxwb3N0ZG9jLy50ZXN0KF9yb2xlRG9tYWluICsgJyAnICsgX3JvbGVMZXZlbCk7XG4gIGNvbnN0IHdjVGFyZ2V0ICAgID0gaXNBY2FkZW1pYyA/IHsgbG86IDUwMCwgaGk6IDYwMCwgd2FybkxvOiA0MDAsIHdhcm5IaTogNjUwIH1cbiAgICAgICAgICAgICAgICAgICAgOiBpc0V4ZWMgICAgID8geyBsbzogNDAwLCBoaTogNTAwLCB3YXJuTG86IDMwMCwgd2FybkhpOiA1NTAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7IGxvOiAyNTAsIGhpOiAzMDAsIHdhcm5MbzogMjAwLCB3YXJuSGk6IDQwMCB9O1xuICBjb25zdCB3Y0xhYmVsICAgICA9IGlzQWNhZGVtaWMgPyBgJHt3Y1RhcmdldC5sb31cdTIwMTMke3djVGFyZ2V0LmhpfSAoYWNhZGVtaWMvcmVzZWFyY2gpYFxuICAgICAgICAgICAgICAgICAgICA6IGlzRXhlYyAgICAgPyBgJHt3Y1RhcmdldC5sb31cdTIwMTMke3djVGFyZ2V0LmhpfSAoZXhlY3V0aXZlKWBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYFx1MjI2NCR7d2NUYXJnZXQuaGl9IChzdGFuZGFyZClgO1xuXG4gIGNvbnN0IHdvcmRzICAgID0gdGV4dC50cmltKCkuc3BsaXQoL1xccysvKS5maWx0ZXIoQm9vbGVhbikubGVuZ3RoO1xuICBjb25zdCB3Y1BjdCAgICA9IE1hdGgubWluKDEwMCwgKHdvcmRzIC8gd2NUYXJnZXQuaGkpICogMTAwKTtcbiAgY29uc3Qgd2NDb2xvdXIgPSB3b3JkcyA8IHdjVGFyZ2V0Lndhcm5MbyA/ICcjZWY0NDQ0J1xuICAgICAgICAgICAgICAgICA6IHdvcmRzIDwgd2NUYXJnZXQubG8gICAgICA/ICcjZjU5ZTBiJ1xuICAgICAgICAgICAgICAgICA6IHdvcmRzIDw9IHdjVGFyZ2V0LmhpICAgICA/ICcjMjJjNTVlJ1xuICAgICAgICAgICAgICAgICA6IHdvcmRzIDw9IHdjVGFyZ2V0Lndhcm5IaSA/ICcjZjU5ZTBiJ1xuICAgICAgICAgICAgICAgICA6ICcjZWY0NDQ0JztcbiAgY29uc3Qgd2NTdGF0dXMgPSB3b3JkcyA+PSB3Y1RhcmdldC5sbyAmJiB3b3JkcyA8PSB3Y1RhcmdldC5oaSA/ICdwYXNzJ1xuICAgICAgICAgICAgICAgICA6IHdvcmRzID49IHdjVGFyZ2V0Lndhcm5MbyAmJiB3b3JkcyA8PSB3Y1RhcmdldC53YXJuSGkgPyAnd2FybidcbiAgICAgICAgICAgICAgICAgOiAnZmFpbCc7XG4gIGNvbnN0IHdjQmFyICAgID0gYDxzcGFuIGNsYXNzPVwiY2wtd2MtYmFyXCI+PHNwYW4gY2xhc3M9XCJjbC13Yy1maWxsXCIgc3R5bGU9XCJ3aWR0aDoke3djUGN0fSU7YmFja2dyb3VuZDoke3djQ29sb3VyfTtcIj48L3NwYW4+PC9zcGFuPmA7XG4gIGNvbnN0IHdvcmRDb3VudENoZWNrID0ge1xuICAgIFt3Y1N0YXR1c106IHRydWUsXG4gICAgbGFiZWw6IGBXb3JkIGNvdW50ICgke3djTGFiZWx9KWAsXG4gICAgZGV0YWlsOiBgJHt3b3Jkc30gd29yZHMgJHt3Y0Jhcn0gXHUyMDE0ICR7XG4gICAgICB3b3JkcyA8IHdjVGFyZ2V0LmxvID8gYHRvbyBzaG9ydDsgYWltIGZvciAke3djVGFyZ2V0LmxvfVx1MjAxMyR7d2NUYXJnZXQuaGl9LmBcbiAgICAgIDogd29yZHMgPiB3Y1RhcmdldC5oaSA/IGB0b28gbG9uZzsgdHJpbSB0byAke3djVGFyZ2V0LmhpfSB3b3Jkcy5gXG4gICAgICA6ICd3aXRoaW4gdGFyZ2V0IHJhbmdlLidcbiAgICB9YCxcbiAgfTtcblxuICAvLyBcdTI1MDBcdTI1MDAgUnVsZSA0OiBDYWxsLXRvLWFjdGlvbiBjbG9zaW5nIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICBjb25zdCBsYXN0UGFyYSA9IHRleHQuc3BsaXQoL1xcbnsyLH0vKS5maWx0ZXIocCA9PiBwLnRyaW0oKSkuc2xpY2UoLTEpWzBdIHx8ICcnO1xuICAvLyBBc3NlcnRpdmUgQ1RBczogY2FuZGlkYXRlIHRha2VzIGluaXRpYXRpdmUgKHBhc3MpXG4gIGNvbnN0IGFzc2VydGl2ZUN0YVBhdHRlcm5zID0gW1xuICAgIC9pbnRlcnZpZXcvaSwgL2Rpc2N1c3MvaSwgL29wcG9ydHVuaXR5IHRvIChzcGVha3x0YWxrfG1lZXR8Y29ubmVjdCkvaSxcbiAgICAvaSB3aWxsIChjYWxsfGZvbGxvdy4/dXB8cmVhY2ggb3V0fGNvbnRhY3R8c2VuZCkvaSxcbiAgICAvaSAocGxhbnxpbnRlbmQpIHRvL2ksIC93ZWxjb21lIHRoZSBjaGFuY2UvaSxcbiAgICAvYXZhaWxhYmxlIChmb3J8dG8pL2ksIC9jb250YWN0IG1lL2ksXG4gIF07XG4gIC8vIFBhc3NpdmUgQ1RBczogd2FpdGluZyBmb3IgYSByZXNwb25zZSAoZmFpbCBcdTIwMTQgc3RvcnkgVVMtUDUgcmVxdWlyZXMgcmVqZWN0aW9uKVxuICBjb25zdCBwYXNzaXZlQ3RhUGF0dGVybnMgPSBbXG4gICAgL2hlYXIgZnJvbSB5b3UvaSwgL2xvb2sgZm9yd2FyZCB0byAoeW91cnxoZWFyaW5nKS9pLFxuICAgIC9hd2FpdChpbmcpPyB5b3VyL2ksIC9ob3BlIHRvIChoZWFyfG1lZXQpL2ksXG4gIF07XG4gIGNvbnN0IGhhc0Fzc2VydGl2ZUN0YSA9IGFzc2VydGl2ZUN0YVBhdHRlcm5zLnNvbWUocmUgPT4gcmUudGVzdChsYXN0UGFyYSkpO1xuICBjb25zdCBoYXNQYXNzaXZlQ3RhICAgPSBwYXNzaXZlQ3RhUGF0dGVybnMuc29tZShyZSA9PiByZS50ZXN0KGxhc3RQYXJhKSk7XG4gIGNvbnN0IGN0YUNoZWNrID0ge1xuICAgIHBhc3M6IGhhc0Fzc2VydGl2ZUN0YSxcbiAgICBmYWlsOiAhaGFzQXNzZXJ0aXZlQ3RhICYmIGhhc1Bhc3NpdmVDdGEsXG4gICAgbGFiZWw6ICdDYWxsLXRvLWFjdGlvbiBjbG9zaW5nJyxcbiAgICBkZXRhaWw6IGhhc0Fzc2VydGl2ZUN0YVxuICAgICAgPyAnQXNzZXJ0aXZlIGNhbGwtdG8tYWN0aW9uIFx1MjAxNCB0YWtlcyBpbml0aWF0aXZlLidcbiAgICAgIDogaGFzUGFzc2l2ZUN0YVxuICAgICAgICA/ICdQYXNzaXZlIGNsb3NpbmcgcmVqZWN0ZWQgXHUyMDE0IHBocmFzZXMgbGlrZSBcIkkgbG9vayBmb3J3YXJkIHRvIGhlYXJpbmcgZnJvbSB5b3VcIiBhcmUgdG9vIHBhc3NpdmUuIFJlcGxhY2Ugd2l0aCBhIGRpcmVjdCBpbnRlcnZpZXcgcmVxdWVzdDogXCJJIHdvdWxkIHdlbGNvbWUgdGhlIG9wcG9ydHVuaXR5IHRvIGludGVydmlld1wiIG9yIFwiSSB3aWxsIGZvbGxvdyB1cCBuZXh0IHdlZWsuXCInXG4gICAgICAgIDogJ05vIGNhbGwtdG8tYWN0aW9uIGZvdW5kIFx1MjAxNCBhZGQgYSBkaXJlY3QgaW50ZXJ2aWV3IHJlcXVlc3Qgb3IgcHJvYWN0aXZlIGZvbGxvdy11cCBzdGF0ZW1lbnQuJyxcbiAgfTtcblxuICAvLyBcdTI1MDBcdTI1MDAgUnVsZSA1OiBOYW1lZCBvciBxdWFudGlmaWVkIGFjaGlldmVtZW50IFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICBjb25zdCBhY2hpZXZlbWVudFBhdHRlcm5zID0gW1xuICAgIC9cXGQrJS8sICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwZXJjZW50YWdlc1xuICAgIC9cXCRbXFxkLF0rLywgICAgICAgICAgICAgICAgICAgICAgLy8gZG9sbGFyIGFtb3VudHNcbiAgICAvXFxkKyAodGltZXN8eHxmb2xkfHllYXJ8bW9udGh8d2Vla3xkYXl8dGVhbXxwZW9wbGV8c3RhZmZ8Y2xpZW50fGN1c3RvbWVyfHByb2plY3R8cHJvZHVjdHxzeXN0ZW18YXdhcmR8cGF0ZW50KS9pLFxuICAgIC9yZWR1Y2VkfGluY3JlYXNlZHxncmV3fGdyZXd8ZG91YmxlZHx0cmlwbGVkfHNhdmVkfGdlbmVyYXRlZHxkZWxpdmVyZWR8bGF1bmNoZWR8bGVkfGJ1aWx0fGRlc2lnbmVkfGFyY2hpdGVjdGVkfHBpb25lZXJlZHx3b258YXdhcmRlZHxlYXJuZWR8YWNoaWV2ZWQvaSxcbiAgXTtcbiAgY29uc3QgaGFzQWNoaWV2ZW1lbnQgPSBhY2hpZXZlbWVudFBhdHRlcm5zLnNvbWUocmUgPT4gcmUudGVzdCh0ZXh0KSk7XG4gIGNvbnN0IGFjaGlldmVtZW50Q2hlY2sgPSB7XG4gICAgcGFzczogaGFzQWNoaWV2ZW1lbnQsXG4gICAgd2FybjogIWhhc0FjaGlldmVtZW50LFxuICAgIGxhYmVsOiAnU3BlY2lmaWMgYWNoaWV2ZW1lbnQnLFxuICAgIGRldGFpbDogaGFzQWNoaWV2ZW1lbnRcbiAgICAgID8gJ0NvbnRhaW5zIGEgcXVhbnRpZmllZCBvciBuYW1lZCBhY2hpZXZlbWVudCBcdTIwMTQgZ29vZC4nXG4gICAgICA6ICdObyBxdWFudGlmaWVkIGFjaGlldmVtZW50IGRldGVjdGVkIFx1MjAxNCBhZGQgYXQgbGVhc3Qgb25lIHNwZWNpZmljIHJlc3VsdCAoZS5nLiwgXCJpbmNyZWFzZWQgcmV2ZW51ZSBieSAzMCVcIiwgXCJsZWQgYSB0ZWFtIG9mIDhcIikuJyxcbiAgfTtcblxuICAvLyBcdTI1MDBcdTI1MDAgUnVsZSA3OiBHZW5lcmljIGZpbGxlciBwaHJhc2VzIChHQVAtMTcpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICBjb25zdCBfQ0xfRklMTEVSID0gW1xuICAgICdpIGFtIHdyaXRpbmcgdG8gYXBwbHknLCAnaSBhbSBleGNpdGVkIHRvIGFwcGx5JywgJ2kgYW0gcGxlYXNlZCB0byBhcHBseScsXG4gICAgJ3BsZWFzZSBmaW5kIG15JywgJ2F0dGFjaGVkIHBsZWFzZSBmaW5kJywgJ2VuY2xvc2VkIHBsZWFzZSBmaW5kJyxcbiAgICAndGhpcyBsZXR0ZXIgaXMgdG8gZXhwcmVzcycsICdpIGZlZWwgaSB3b3VsZCBiZSBhIGdyZWF0IGZpdCcsXG4gICAgJ2kgYmVsaWV2ZSBpIHdvdWxkIGJlIGEgcGVyZmVjdCBmaXQnLCAnaSBhbSBjb25maWRlbnQgdGhhdCBpJyxcbiAgICAncmVzdWx0cy1kcml2ZW4nLCAnZGV0YWlsLW9yaWVudGVkJywgJ3NlYXNvbmVkIHByb2Zlc3Npb25hbCcsXG4gICAgJ3Bhc3Npb25hdGUgYWJvdXQnLCAnZHluYW1pYyBwcm9mZXNzaW9uYWwnLCAnaGlnaGx5IG1vdGl2YXRlZCcsXG4gICAgJ3RlYW0gcGxheWVyJywgJ3NlbGYtc3RhcnRlcicsICdoYXJkIHdvcmtpbmcnLFxuICBdO1xuICBjb25zdCBfdGV4dExjICAgID0gdGV4dC50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBmb3VuZEZpbGwgID0gX0NMX0ZJTExFUi5maWx0ZXIocCA9PiBfdGV4dExjLmluY2x1ZGVzKHApKTtcbiAgY29uc3QgZmlsbGVyQ2hlY2sgPSB7XG4gICAgcGFzczogZm91bmRGaWxsLmxlbmd0aCA9PT0gMCxcbiAgICB3YXJuOiBmb3VuZEZpbGwubGVuZ3RoID4gMCAmJiBmb3VuZEZpbGwubGVuZ3RoIDw9IDIsXG4gICAgZmFpbDogZm91bmRGaWxsLmxlbmd0aCA+IDIsXG4gICAgbGFiZWw6ICdGaWxsZXIgcGhyYXNlcycsXG4gICAgZGV0YWlsOiBmb3VuZEZpbGwubGVuZ3RoID09PSAwXG4gICAgICA/ICdObyBnZW5lcmljIGZpbGxlciBwaHJhc2VzIGRldGVjdGVkIFx1MjAxNCBnb29kLidcbiAgICAgIDogYEdlbmVyaWMgcGhyYXNlJHtmb3VuZEZpbGwubGVuZ3RoID4gMSA/ICdzJyA6ICcnfSBkZXRlY3RlZDogJHtmb3VuZEZpbGwuc2xpY2UoMCwgMykubWFwKHAgPT4gYFx1MjAxQyR7cH1cdTIwMURgKS5qb2luKCcsICcpfSR7Zm91bmRGaWxsLmxlbmd0aCA+IDMgPyAnXHUyMDI2JyA6ICcnfSBcdTIwMTQgcmVwbGFjZSB3aXRoIHNwZWNpZmljIHZhbHVlIGNsYWltcy5gLFxuICB9O1xuXG4gIC8vIFx1MjUwMFx1MjUwMCBSZW5kZXIgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIGNvbnN0IGNoZWNrcyA9IFtvcGVuaW5nQ2hlY2ssIGlGaXJzdENoZWNrLCBjb21wYW55Q2hlY2ssIHdvcmRDb3VudENoZWNrLCBjdGFDaGVjaywgYWNoaWV2ZW1lbnRDaGVjaywgZmlsbGVyQ2hlY2tdO1xuICBjb250YWluZXIuaW5uZXJIVE1MID0gY2hlY2tzLm1hcChjID0+IHtcbiAgICBjb25zdCBzdGF0ZSA9IGMucGFzcyA/ICdwYXNzJyA6IGMud2FybiA/ICd3YXJuJyA6ICdmYWlsJztcbiAgICByZXR1cm4gYDxkaXYgY2xhc3M9XCJjbC1jaGVjayAke3N0YXRlfVwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjYy1pY29uXCI+PC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjYy1sYWJlbFwiPiR7ZXNjYXBlSHRtbChjLmxhYmVsKX08L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cImNjLWRldGFpbFwiPiR7Yy5kZXRhaWx9PC9zcGFuPlxuICAgIDwvZGl2PmA7XG4gIH0pLmpvaW4oJycpO1xuXG4gIHBhbmVsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgR2V0IGNvbXBhbnkgbmFtZSBmb3IgY292ZXIgbGV0dGVyIHZhbGlkYXRpb24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIF9nZXRDb21wYW55TmFtZUZvckNMKCkge1xuICAvLyBUcnkgYW5hbHlzaXMgZGF0YSBmaXJzdCwgdGhlbiBmYWxsIGJhY2sgdG8gam9iIGRlc2NyaXB0aW9uIGZpcnN0IGxpbmVcbiAgY29uc3QgYW5hbHlzaXMgPSB3aW5kb3cuX2xhc3RBbmFseXNpc0RhdGEgfHwgKHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zICYmIHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zLmpvYl9hbmFseXNpcyk7XG4gIGlmIChhbmFseXNpcyAmJiBhbmFseXNpcy5jb21wYW55X25hbWUpIHJldHVybiBhbmFseXNpcy5jb21wYW55X25hbWU7XG4gIGlmIChhbmFseXNpcyAmJiBhbmFseXNpcy5jb21wYW55KSAgICAgIHJldHVybiBhbmFseXNpcy5jb21wYW55O1xuICAvLyBGYWxsIGJhY2s6IGZpcnN0IG5vbi1lbXB0eSBsaW5lIG9mIGpvYiBkZXNjcmlwdGlvbiBpbiB0YWJEYXRhXG4gIGNvbnN0IGpkID0gc3RhdGVNYW5hZ2VyLmdldFRhYkRhdGEoJ2pvYicpIHx8ICcnO1xuICBjb25zdCBmaXJzdExpbmUgPSBqZC5zcGxpdCgnXFxuJykuZmluZChsID0+IGwudHJpbSgpKTtcbiAgcmV0dXJuIGZpcnN0TGluZSA/IGZpcnN0TGluZS50cmltKCkuc2xpY2UoMCwgNjApIDogJyc7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFeHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5leHBvcnQge1xuICBDT1ZFUl9MRVRURVJfVE9ORVMsXG4gIF9jb3ZlckxldHRlckZvcm1TdGF0ZSxcbiAgcG9wdWxhdGVDb3ZlckxldHRlclRhYixcbiAgZ2VuZXJhdGVDb3ZlckxldHRlcixcbiAgc2F2ZUNvdmVyTGV0dGVyLFxuICBfcmVuZGVyQ29uc2lzdGVuY3lSZXBvcnQsXG4gIF9kZWJvdW5jZWRWYWxpZGF0ZUNMLFxuICBfdmFsaWRhdGVDb3ZlckxldHRlcixcbiAgX2dldENvbXBhbnlOYW1lRm9yQ0wsXG59O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvc2NyZWVuaW5nLXF1ZXN0aW9ucy5qc1xuICogU2NyZWVuaW5nIHF1ZXN0aW9ucyB0YWI6IHBhcnNlLCBzZWFyY2gsIGdlbmVyYXRlLCBzYXZlIHJlc3BvbnNlcy5cbiAqXG4gKiBEZXBlbmRlbmNpZXMgKHJlc29sdmVkIHRocm91Z2ggZ2xvYmFsVGhpcyBhdCBydW50aW1lKTpcbiAqICAgZXNjYXBlSHRtbCwgc2hvd0FsZXJ0TW9kYWxcbiAqL1xuXG4vLyBcdTI1MDBcdTI1MDAgTW9kdWxlLWxldmVsIHN0YXRlIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4vKiogUGVyLXF1ZXN0aW9uIGRyYWZ0IHN0YXRlOiB7IGZvcm1hdCwgZXhwZXJpZW5jZUluZGljZXMsIHJlc3BvbnNlVGV4dCwgdG9waWNUYWcsIHByaW9yUmVzcG9uc2UgfSAqL1xuY29uc3QgX3NjcmVlbmluZ1N0YXRlID0ge307XG5cbi8qKiBSYXcgdGV4dCBmcm9tIHRoZSBzYy1pbnB1dCB0ZXh0YXJlYSBcdTIwMTQgc3Vydml2ZXMgdGFiIG5hdmlnYXRpb24uICovXG5sZXQgX3NjcmVlbmluZ0lucHV0VGV4dCA9ICcnO1xuXG4vKiogUmVzZXQgZnVuY3Rpb24gZm9yIHRlc3RpbmcgXHUyMDE0IGNsZWFycyBzYXZlZCB0ZXh0YXJlYSBzdGF0ZS4gKi9cbmZ1bmN0aW9uIF9yZXNldFNjcmVlbmluZ0lucHV0VGV4dCgpIHsgX3NjcmVlbmluZ0lucHV0VGV4dCA9ICcnOyB9XG5cbi8vIFx1MjUwMFx1MjUwMCBQb3B1bGF0ZSBzY3JlZW5pbmcgdGFiIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBwb3B1bGF0ZVNjcmVlbmluZ1RhYigpIHtcbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgc3R5bGU9XCJtYXgtd2lkdGg6OTAwcHg7bWFyZ2luOjAgYXV0bztwYWRkaW5nOjIwcHggMTBweDtcIj5cbiAgICAgIDxoMiBzdHlsZT1cImZvbnQtc2l6ZToxLjNlbTtmb250LXdlaWdodDo3MDA7bWFyZ2luLWJvdHRvbTo4cHg7XCI+XHVEODNEXHVEQ0NCIFNjcmVlbmluZyBRdWVzdGlvbnM8L2gyPlxuICAgICAgPHAgY2xhc3M9XCJzYy1pbnRyb1wiPlBhc3RlIG9uZSBvciBtb3JlIHNjcmVlbmluZyBxdWVzdGlvbnMgYmVsb3cgXHUyMDE0IG9uZSBwZXIgbGluZSwgb3Igc2VwYXJhdGVkIGJ5IGJsYW5rIGxpbmVzLiBDbGljayA8c3Ryb25nPlBhcnNlIFF1ZXN0aW9uczwvc3Ryb25nPiB0byBnZW5lcmF0ZSB0YWlsb3JlZCBkcmFmdCByZXNwb25zZXMuPC9wPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6MTBweDthbGlnbi1pdGVtczpmbGV4LXN0YXJ0O21hcmdpbi1ib3R0b206MjBweDtcIj5cbiAgICAgICAgPHRleHRhcmVhIGlkPVwic2MtaW5wdXRcIiByb3dzPVwiNlwiIHN0eWxlPVwiZmxleDoxO3BhZGRpbmc6MTJweDtib3JkZXI6MXB4IHNvbGlkICNlMmU4ZjA7Ym9yZGVyLXJhZGl1czo4cHg7Zm9udC1zaXplOjAuOTNlbTtyZXNpemU6dmVydGljYWw7XCIgcGxhY2Vob2xkZXI9XCJQYXN0ZSBzY3JlZW5pbmcgcXVlc3Rpb25zIGhlcmVcdTIwMjYmIzEwOyYjMTA7RS5nLiYjMTA7RGVzY3JpYmUgYSB0aW1lIHlvdSBsZWQgYSBjcm9zcy1mdW5jdGlvbmFsIHByb2plY3QuJiMxMDsmIzEwO0hvdyBkbyB5b3UgaGFuZGxlIHRpZ2h0IGRlYWRsaW5lcz9cIj48L3RleHRhcmVhPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLXByaW1hcnlcIiBvbmNsaWNrPVwicGFyc2VTY3JlZW5pbmdRdWVzdGlvbnMoKVwiPlBhcnNlIFF1ZXN0aW9uczwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGlkPVwic2MtcXVlc3Rpb25zLWNvbnRhaW5lclwiPjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInNjLXNhdmUtYmFyXCIgaWQ9XCJzYy1zYXZlLWJhclwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29udGludWUtYnRuXCIgaWQ9XCJzYy1zYXZlLWJ0blwiIG9uY2xpY2s9XCJzYXZlU2NyZWVuaW5nUmVzcG9uc2VzKClcIj5cdUQ4M0RcdURDQkUgU2F2ZSBBbGwgUmVzcG9uc2VzPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJuYXYtYnV0dG9ucyBuYXYtZW5kXCIgc3R5bGU9XCJtYXJnaW4tdG9wOjI0cHg7XCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJjb250aW51ZS1idG5cIiBvbmNsaWNrPVwiaGFuZGxlU3RlcENsaWNrKCdpbnRlcnZpZXdfcHJlcCcpXCI+XHVEODNDXHVERkE0IFByb2NlZWQgdG8gSW50ZXJ2aWV3IFByZXAgXHUyMTkyPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xuXG4gIC8vIFJlc3RvcmUgdGhlIHJhdyBpbnB1dCB0ZXh0IGFuZCB3aXJlIHVwIHNhdmUtb24taW5wdXQgbGlzdGVuZXIuXG4gIGNvbnN0IHNjSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2MtaW5wdXQnKTtcbiAgaWYgKHNjSW5wdXQpIHtcbiAgICBpZiAoX3NjcmVlbmluZ0lucHV0VGV4dCkgc2NJbnB1dC52YWx1ZSA9IF9zY3JlZW5pbmdJbnB1dFRleHQ7XG4gICAgc2NJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHsgX3NjcmVlbmluZ0lucHV0VGV4dCA9IHNjSW5wdXQudmFsdWU7IH0pO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBQYXJzZSBxdWVzdGlvbnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIHBhcnNlU2NyZWVuaW5nUXVlc3Rpb25zKCkge1xuICBjb25zdCByYXcgPSAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NjLWlucHV0Jyk/LnZhbHVlIHx8ICcnKS50cmltKCk7XG4gIGlmICghcmF3KSB7IHNob3dBbGVydE1vZGFsKCdcdTI2QTBcdUZFMEYgTm8gSW5wdXQnLCAnUGxlYXNlIHBhc3RlIGF0IGxlYXN0IG9uZSBzY3JlZW5pbmcgcXVlc3Rpb24gZmlyc3QuJyk7IHJldHVybjsgfVxuXG4gIC8vIFNwbGl0IG9uIGJsYW5rIGxpbmVzIChwcmVmZXJyZWQpIG9yIG51bWJlcmVkIGxpc3QgcGF0dGVybnM7IGZpbHRlciBlbXB0eSByZXN1bHRzXG4gIGxldCBxdWVzdGlvbnMgPSByYXcuc3BsaXQoL1xcblxccypcXG4rLykubWFwKHEgPT4gcS50cmltKCkpLmZpbHRlcihCb29sZWFuKTtcbiAgaWYgKHF1ZXN0aW9ucy5sZW5ndGggPT09IDEpIHtcbiAgICAvLyBUcnkgbnVtYmVyZWQgcGF0dGVybnMgbGlrZSBcIjEuIFwiIG9yIFwiMSkgXCIgb3IgXCJRMTpcIiB3aXRob3V0IHJlcXVpcmluZyBzcGFjZSBhZnRlclxuICAgIGNvbnN0IG51bWJlcmVkID0gcmF3LnNwbGl0KC9cXG4oPz1cXGQrWy5cXCldXFxzKig/PVtBLVpdKXxRXFxkK1s6XFwuXT9cXHMqKD89W0EtWl0pKS8pXG4gICAgICAubWFwKHEgPT4gcS50cmltKCkpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGlmIChudW1iZXJlZC5sZW5ndGggPiAxKSBxdWVzdGlvbnMgPSBudW1iZXJlZDtcbiAgfVxuICBpZiAocXVlc3Rpb25zLmxlbmd0aCA9PT0gMSkge1xuICAgIC8vIExhc3QgcmVzb3J0OiBzcGxpdCBvbiBhbnkgc2luZ2xlIG5ld2xpbmUgaWYgd2Ugc3RpbGwgaGF2ZSBqdXN0IG9uZSBcInF1ZXN0aW9uXCJcbiAgICBjb25zdCBzaW5nbGVMaW5lID0gcmF3LnNwbGl0KC9cXG4rLykubWFwKHEgPT4gcS50cmltKCkpLmZpbHRlcihxID0+IHEubGVuZ3RoID4gMCk7XG4gICAgaWYgKHNpbmdsZUxpbmUubGVuZ3RoID4gMSkgcXVlc3Rpb25zID0gc2luZ2xlTGluZTtcbiAgfVxuXG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzYy1xdWVzdGlvbnMtY29udGFpbmVyJyk7XG4gIGNvbnRhaW5lci5pbm5lckhUTUwgPSBxdWVzdGlvbnMubWFwKChxLCBpKSA9PiByZW5kZXJRdWVzdGlvbkJsb2NrKHEsIGkpKS5qb2luKCcnKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NjLXNhdmUtYmFyJykuc3R5bGUuZGlzcGxheSA9IHF1ZXN0aW9ucy5sZW5ndGggPyAnJyA6ICdub25lJztcblxuICAvLyBLaWNrIG9mZiBzZWFyY2hlcyBpbiBwYXJhbGxlbFxuICBxdWVzdGlvbnMuZm9yRWFjaCgocSwgaSkgPT4gc2VhcmNoRm9yUXVlc3Rpb24ocSwgaSkpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgUmVuZGVyIHF1ZXN0aW9uIGJsb2NrIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiByZW5kZXJRdWVzdGlvbkJsb2NrKHF1ZXN0aW9uLCBpZHgpIHtcbiAgcmV0dXJuIGBcbiAgICA8ZGl2IGNsYXNzPVwic2MtcXVlc3Rpb24tYmxvY2tcIiBpZD1cInNjLWJsb2NrLSR7aWR4fVwiIGRhdGEtcXVlc3Rpb249XCIke2VzY2FwZUh0bWwocXVlc3Rpb24pfVwiPlxuICAgICAgPGRpdiBjbGFzcz1cInNjLXF1ZXN0aW9uLWhlYWRlclwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInNjLXF1ZXN0aW9uLW51bVwiPiR7aWR4ICsgMX08L3NwYW4+XG4gICAgICAgIDxzcGFuPiR7ZXNjYXBlSHRtbChxdWVzdGlvbil9PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwic2MtcXVlc3Rpb24tYm9keVwiPlxuICAgICAgICA8ZGl2IGlkPVwic2MtcHJpb3ItJHtpZHh9XCI+PGVtIHN0eWxlPVwiY29sb3I6Izk0YTNiODtmb250LXNpemU6MC44N2VtO1wiPlNlYXJjaGluZyByZXNwb25zZSBsaWJyYXJ5XHUyMDI2PC9lbT48L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cInNjLWV4cC0ke2lkeH1cIj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNjLWZvcm1hdC1yb3dcIiBpZD1cInNjLWZtdC0ke2lkeH1cIj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOiMzNzQxNTE7YWxpZ24tc2VsZjpjZW50ZXI7XCI+Rm9ybWF0Ojwvc3Bhbj5cbiAgICAgICAgICAke1snZGlyZWN0Jywnc3RhcicsJ3RlY2huaWNhbCddLm1hcChmID0+IGBcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzYy1mb3JtYXQtYnRuJHtmID09PSAnZGlyZWN0JyA/ICcgYWN0aXZlJyA6ICcnfVwiIGRhdGEtZm10PVwiJHtmfVwiIG9uY2xpY2s9XCJzZWxlY3RGb3JtYXQoJHtpZHh9LCcke2Z9Jyx0aGlzKVwiPiR7X2ZtdExhYmVsKGYpfTwvYnV0dG9uPmApLmpvaW4oJycpfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1wcmltYXJ5XCIgaWQ9XCJzYy1nZW4tYnRuLSR7aWR4fVwiIG9uY2xpY2s9XCJnZW5lcmF0ZVNjcmVlbmluZ1Jlc3BvbnNlKCR7aWR4fSlcIj5cdTI3MjggR2VuZXJhdGUgRHJhZnQ8L2J1dHRvbj5cbiAgICAgICAgPGRpdiBpZD1cInNjLXJlc3VsdC0ke2lkeH1cIiBzdHlsZT1cIm1hcmdpbi10b3A6MTJweDtcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNjLXRvcGljLXJvd1wiIGlkPVwic2MtdG9waWMtcm93LSR7aWR4fVwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJzYy10b3BpYy0ke2lkeH1cIj5Ub3BpYyB0YWc6PC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJzYy10b3BpYy1pbnB1dFwiIGlkPVwic2MtdG9waWMtJHtpZHh9XCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cImUuZy4gbGVhZGVyc2hpcCwgY3Jvc3MtZnVuY3Rpb25hbCwgZGVhZGxpbmUtbWFuYWdlbWVudFwiPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PmA7XG59XG5cbmZ1bmN0aW9uIF9mbXRMYWJlbChmbXQpIHtcbiAgcmV0dXJuIHsgZGlyZWN0OiAnRGlyZWN0L0NvbmNpc2UgKDE1MFx1MjAxMzIwMHcpJywgc3RhcjogJ1NUQVIgKDI1MFx1MjAxMzM1MHcpJywgdGVjaG5pY2FsOiAnVGVjaG5pY2FsIERldGFpbCAoNDAwXHUyMDEzNTAwdyknIH1bZm10XSB8fCBmbXQ7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBGb3JtYXQgc2VsZWN0aW9uIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBzZWxlY3RGb3JtYXQoaWR4LCBmbXQsIGJ0bikge1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGAjc2MtZm10LSR7aWR4fSAuc2MtZm9ybWF0LWJ0bmApLmZvckVhY2goYiA9PiBiLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpKTtcbiAgYnRuLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICBpZiAoIV9zY3JlZW5pbmdTdGF0ZVtpZHhdKSBfc2NyZWVuaW5nU3RhdGVbaWR4XSA9IHt9O1xuICBfc2NyZWVuaW5nU3RhdGVbaWR4XS5mb3JtYXQgPSBmbXQ7XG59XG5cbmZ1bmN0aW9uIF9nZXRTZWxlY3RlZEZvcm1hdChpZHgpIHtcbiAgY29uc3QgYWN0aXZlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgI3NjLWZtdC0ke2lkeH0gLnNjLWZvcm1hdC1idG4uYWN0aXZlYCk7XG4gIHJldHVybiBhY3RpdmUgPyBhY3RpdmUuZ2V0QXR0cmlidXRlKCdkYXRhLWZtdCcpIDogJ2RpcmVjdCc7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBTZWFyY2ggZm9yIHByaW9yIHJlc3BvbnNlcyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gc2VhcmNoRm9yUXVlc3Rpb24ocXVlc3Rpb24sIGlkeCkge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9zY3JlZW5pbmcvc2VhcmNoJywge1xuICAgICAgbWV0aG9kOiAgJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiAgICBKU09OLnN0cmluZ2lmeSh7IHF1ZXN0aW9uIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmICghZGF0YS5vaykgeyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc2MtcHJpb3ItJHtpZHh9YCkuaW5uZXJIVE1MID0gJyc7IHJldHVybjsgfVxuXG4gICAgLy8gUmVuZGVyIHByaW9yIG1hdGNoXG4gICAgY29uc3QgcHJpb3JFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzYy1wcmlvci0ke2lkeH1gKTtcbiAgICBpZiAoZGF0YS5wcmlvcikge1xuICAgICAgY29uc3QgcCA9IGRhdGEucHJpb3I7XG4gICAgICBwcmlvckVsLmlubmVySFRNTCA9IGBcbiAgICAgICAgPGRpdiBjbGFzcz1cInNjLXByaW9yLW1hdGNoXCI+XG4gICAgICAgICAgPHN0cm9uZz5cdUQ4M0RcdURDREEgU2ltaWxhciBwcmlvciByZXNwb25zZSBmb3VuZDwvc3Ryb25nPiBcdTIwMTQgJHtlc2NhcGVIdG1sKHAuY29tcGFueSB8fCAnJyl9ICgke2VzY2FwZUh0bWwocC5kYXRlIHx8ICcnKX0pPGJyPlxuICAgICAgICAgIDxlbSBzdHlsZT1cImNvbG9yOiM3ODM1MGY7XCI+XCIke2VzY2FwZUh0bWwoKHAucXVlc3Rpb24gfHwgJycpLnN1YnN0cmluZygwLCAxMjApKX1cdTIwMjZcIjwvZW0+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6NnB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtcIj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwic2MtdXNlLXByaW9yLSR7aWR4fVwiIG9uY2hhbmdlPVwidG9nZ2xlUHJpb3JVc2UoJHtpZHh9KVwiPiBVc2UgYXMgc3RhcnRpbmcgcG9pbnRcbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PmA7XG4gICAgICBpZiAoIV9zY3JlZW5pbmdTdGF0ZVtpZHhdKSBfc2NyZWVuaW5nU3RhdGVbaWR4XSA9IHt9O1xuICAgICAgX3NjcmVlbmluZ1N0YXRlW2lkeF0ucHJpb3JSZXNwb25zZSA9IHAucmVzcG9uc2VfdGV4dCB8fCAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgcHJpb3JFbC5pbm5lckhUTUwgPSAnJztcbiAgICB9XG5cbiAgICAvLyBSZW5kZXIgZXhwZXJpZW5jZSBjYXJkc1xuICAgIGNvbnN0IGV4cEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNjLWV4cC0ke2lkeH1gKTtcbiAgICBpZiAoZGF0YS5leHBlcmllbmNlcyAmJiBkYXRhLmV4cGVyaWVuY2VzLmxlbmd0aCkge1xuICAgICAgY29uc3QgY2FyZHMgPSBkYXRhLmV4cGVyaWVuY2VzLm1hcChlID0+IGBcbiAgICAgICAgPGxhYmVsIGNsYXNzPVwic2MtZXhwLWNhcmRcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1pZHg9XCIke2UuaWR4fVwiIGNoZWNrZWQgb25jaGFuZ2U9XCJ1cGRhdGVFeHBTZWxlY3Rpb24oJHtpZHh9KVwiPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmbGV4OjE7XCI+XG4gICAgICAgICAgICA8c3Ryb25nPiR7ZXNjYXBlSHRtbChlLnRpdGxlKX08L3N0cm9uZz4gXHUwMEI3ICR7ZXNjYXBlSHRtbChlLmNvbXBhbnkpfVxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYy1zY29yZS1iYWRnZVwiPiR7TWF0aC5yb3VuZChlLnNjb3JlICogMTAwKX0lIG1hdGNoPC9zcGFuPlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImNvbG9yOiM2NDc0OGI7bWFyZ2luLXRvcDoycHg7XCI+JHtlc2NhcGVIdG1sKGUuc3VtbWFyeSl9PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbGFiZWw+YCkuam9pbignJyk7XG4gICAgICBleHBFbC5pbm5lckhUTUwgPSBgPHAgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjojMzc0MTUxO21hcmdpbi1ib3R0b206NnB4O1wiPlJlbGV2YW50IGV4cGVyaWVuY2U6PC9wPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2MtZXhwLWxpc3RcIj4ke2NhcmRzfTwvZGl2PmA7XG4gICAgICBpZiAoIV9zY3JlZW5pbmdTdGF0ZVtpZHhdKSBfc2NyZWVuaW5nU3RhdGVbaWR4XSA9IHt9O1xuICAgICAgX3NjcmVlbmluZ1N0YXRlW2lkeF0uZXhwZXJpZW5jZUluZGljZXMgPSBkYXRhLmV4cGVyaWVuY2VzLm1hcChlID0+IGUuaWR4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXhwRWwuaW5uZXJIVE1MID0gJyc7XG4gICAgfVxuICB9IGNhdGNoIChfKSB7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNjLXByaW9yLSR7aWR4fWApLmlubmVySFRNTCA9ICcnO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBUb2dnbGUgcHJpb3IgdXNlIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiB0b2dnbGVQcmlvclVzZShpZHgpIHtcbiAgY29uc3QgY2IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc2MtdXNlLXByaW9yLSR7aWR4fWApO1xuICBpZiAoIV9zY3JlZW5pbmdTdGF0ZVtpZHhdKSBfc2NyZWVuaW5nU3RhdGVbaWR4XSA9IHt9O1xuICBfc2NyZWVuaW5nU3RhdGVbaWR4XS51c2VQcmlvciA9IGNiPy5jaGVja2VkID8/IGZhbHNlO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVFeHBTZWxlY3Rpb24oaWR4KSB7XG4gIGNvbnN0IGJsb2NrICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzYy1ibG9jay0ke2lkeH1gKTtcbiAgY29uc3QgY2hlY2tlZCAgID0gQXJyYXkuZnJvbShibG9jay5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFt0eXBlPWNoZWNrYm94XVtkYXRhLWlkeF0nKSlcbiAgICAuZmlsdGVyKGNiID0+IGNiLmNoZWNrZWQpXG4gICAgLm1hcChjYiA9PiBwYXJzZUludChjYi5nZXRBdHRyaWJ1dGUoJ2RhdGEtaWR4JyksIDEwKSk7XG4gIGlmICghX3NjcmVlbmluZ1N0YXRlW2lkeF0pIF9zY3JlZW5pbmdTdGF0ZVtpZHhdID0ge307XG4gIF9zY3JlZW5pbmdTdGF0ZVtpZHhdLmV4cGVyaWVuY2VJbmRpY2VzID0gY2hlY2tlZDtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEdlbmVyYXRlIHNjcmVlbmluZyByZXNwb25zZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVTY3JlZW5pbmdSZXNwb25zZShpZHgpIHtcbiAgLyogZHVja2Zsb3c6XG4gICAqICAgaWQ6IHNjcmVlbmluZ191aV9nZW5lcmF0ZV9saXZlXG4gICAqICAga2luZDogdWlcbiAgICogICB0aW1lc3RhbXA6ICcyMDI2LTAzLTI1VDIxOjM5OjQ4WidcbiAgICogICBzdGF0dXM6IGxpdmVcbiAgICogICBoYW5kbGVzOlxuICAgKiAgIC0gdWk6c2NyZWVuaW5nLmdlbmVyYXRlLXJlc3BvbnNlXG4gICAqICAgY2FsbHM6XG4gICAqICAgLSBQT1NUIC9hcGkvc2NyZWVuaW5nL2dlbmVyYXRlXG4gICAqICAgcmVhZHM6XG4gICAqICAgLSBkb206c2MtcXVlc3Rpb24tYmxvY2sucXVlc3Rpb25cbiAgICogICAtIHdpbmRvdzpfc2NyZWVuaW5nU3RhdGUuZm9ybWF0XG4gICAqICAgLSB3aW5kb3c6X3NjcmVlbmluZ1N0YXRlLnByaW9yUmVzcG9uc2VcbiAgICogICAtIHdpbmRvdzpfc2NyZWVuaW5nU3RhdGUuZXhwZXJpZW5jZUluZGljZXNcbiAgICogICB3cml0ZXM6XG4gICAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9zY3JlZW5pbmcvZ2VuZXJhdGUucXVlc3Rpb25cbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL3NjcmVlbmluZy9nZW5lcmF0ZS5mb3JtYXRcbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL3NjcmVlbmluZy9nZW5lcmF0ZS5leHBlcmllbmNlX2luZGljZXNcbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL3NjcmVlbmluZy9nZW5lcmF0ZS5wcmlvcl9yZXNwb25zZVxuICAgKiAgIC0gd2luZG93Ol9zY3JlZW5pbmdTdGF0ZS5yZXNwb25zZVRleHRcbiAgICogICAtIHdpbmRvdzpfc2NyZWVuaW5nU3RhdGUuZm9ybWF0XG4gICAqICAgbm90ZXM6IEdlbmVyYXRlcyBhIHNpbmdsZSBzY3JlZW5pbmcgcmVzcG9uc2UgZnJvbSB0aGUgc2VsZWN0ZWQgZm9ybWF0LCBwcmlvci1yZXNwb25zZSBzZWVkLCBhbmQgY2hvc2VuIGV4cGVyaWVuY2UgZXZpZGVuY2UsIHRoZW4gc3RvcmVzIHRoZSBkcmFmdCBiYWNrIGludG8gVUkgc3RhdGUgZm9yIGVkaXRpbmcuXG4gICAqL1xuICBjb25zdCBidG4gICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzYy1nZW4tYnRuLSR7aWR4fWApO1xuICBpZiAoYnRuKSB7IGJ0bi5kaXNhYmxlZCA9IHRydWU7IGJ0bi50ZXh0Q29udGVudCA9ICdcdTIzRjMgR2VuZXJhdGluZ1x1MjAyNic7IH1cblxuICBjb25zdCBxdWVzdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzYy1ibG9jay0ke2lkeH1gKT8uZGF0YXNldC5xdWVzdGlvbiB8fCAnJztcbiAgY29uc3Qgc3RhdGUgICAgPSBfc2NyZWVuaW5nU3RhdGVbaWR4XSB8fCB7fTtcbiAgY29uc3QgZm10ICAgICAgPSBfZ2V0U2VsZWN0ZWRGb3JtYXQoaWR4KTtcbiAgY29uc3QgcHJpb3IgICAgPSAoc3RhdGUudXNlUHJpb3IgJiYgc3RhdGUucHJpb3JSZXNwb25zZSkgPyBzdGF0ZS5wcmlvclJlc3BvbnNlIDogJyc7XG4gIGNvbnN0IGV4cElkeCAgID0gc3RhdGUuZXhwZXJpZW5jZUluZGljZXMgPz8gW107XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvc2NyZWVuaW5nL2dlbmVyYXRlJywge1xuICAgICAgbWV0aG9kOiAgJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIHF1ZXN0aW9uLFxuICAgICAgICBmb3JtYXQ6ICAgICAgICAgICAgICBmbXQsXG4gICAgICAgIGV4cGVyaWVuY2VfaW5kaWNlczogIGV4cElkeCxcbiAgICAgICAgcHJpb3JfcmVzcG9uc2U6ICAgICAgcHJpb3IsXG4gICAgICB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoIWRhdGEub2spIHsgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsIGRhdGEuZXJyb3IgfHwgJ0dlbmVyYXRpb24gZmFpbGVkLicpOyByZXR1cm47IH1cblxuICAgIGlmICghX3NjcmVlbmluZ1N0YXRlW2lkeF0pIF9zY3JlZW5pbmdTdGF0ZVtpZHhdID0ge307XG4gICAgX3NjcmVlbmluZ1N0YXRlW2lkeF0ucmVzcG9uc2VUZXh0ID0gZGF0YS50ZXh0O1xuICAgIF9zY3JlZW5pbmdTdGF0ZVtpZHhdLmZvcm1hdCAgICAgICA9IGZtdDtcblxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzYy1yZXN1bHQtJHtpZHh9YCkuaW5uZXJIVE1MID0gYFxuICAgICAgPHRleHRhcmVhIGNsYXNzPVwic2MtcmVzcG9uc2UtdGV4dGFyZWFcIiBpZD1cInNjLXRleHQtJHtpZHh9XCIgcm93cz1cIjdcIlxuICAgICAgICBvbmlucHV0PVwiX3NjcmVlbmluZ1N0YXRlWyR7aWR4fV0gPSBfc2NyZWVuaW5nU3RhdGVbJHtpZHh9XSB8fCB7fTsgX3NjcmVlbmluZ1N0YXRlWyR7aWR4fV0ucmVzcG9uc2VUZXh0ID0gdGhpcy52YWx1ZTtcIlxuICAgICAgPiR7ZXNjYXBlSHRtbChkYXRhLnRleHQpfTwvdGV4dGFyZWE+YDtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc2MtdG9waWMtcm93LSR7aWR4fWApLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIGNvbnRhY3Qgc2VydmVyLicpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChidG4pIHsgYnRuLmRpc2FibGVkID0gZmFsc2U7IGJ0bi50ZXh0Q29udGVudCA9ICdcdTI3MjggR2VuZXJhdGUgRHJhZnQnOyB9XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIFNhdmUgcmVzcG9uc2VzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBzYXZlU2NyZWVuaW5nUmVzcG9uc2VzKCkge1xuICAvKiBkdWNrZmxvdzpcbiAgICogICBpZDogc2NyZWVuaW5nX3VpX3NhdmVfbGl2ZVxuICAgKiAgIGtpbmQ6IHVpXG4gICAqICAgdGltZXN0YW1wOiAnMjAyNi0wMy0yNVQyMTozOTo0OFonXG4gICAqICAgc3RhdHVzOiBsaXZlXG4gICAqICAgaGFuZGxlczpcbiAgICogICAtIHVpOnNjcmVlbmluZy5zYXZlLWFsbFxuICAgKiAgIGNhbGxzOlxuICAgKiAgIC0gUE9TVCAvYXBpL3NjcmVlbmluZy9zYXZlXG4gICAqICAgcmVhZHM6XG4gICAqICAgLSB3aW5kb3c6X3NjcmVlbmluZ1N0YXRlXG4gICAqICAgLSBkb206LnNjLXF1ZXN0aW9uLWJsb2NrXG4gICAqICAgLSBkb206I3NjLXRleHQtKi52YWx1ZVxuICAgKiAgIC0gZG9tOiNzYy10b3BpYy0qLnZhbHVlXG4gICAqICAgd3JpdGVzOlxuICAgKiAgIC0gcmVxdWVzdDpQT1NUIC9hcGkvc2NyZWVuaW5nL3NhdmUucmVzcG9uc2VzXG4gICAqICAgbm90ZXM6IEFnZ3JlZ2F0ZXMgdGhlIGVkaXRlZCBzY3JlZW5pbmcgcmVzcG9uc2VzIGFuZCB0b3BpYyB0YWdzIGZyb20gdGhlIFVJIGludG8gdGhlIHN0cnVjdHVyZWQgcGF5bG9hZCB0aGF0IGJhY2tlbmQgc3RhdGUsIG1ldGFkYXRhLCBhcmNoaXZlIERPQ1gsIGFuZCB0aGUgcmVzcG9uc2UgbGlicmFyeSBhbGwgcGVyc2lzdC5cbiAgICovXG4gIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzYy1zYXZlLWJ0bicpO1xuICBpZiAoYnRuKSB7IGJ0bi5kaXNhYmxlZCA9IHRydWU7IGJ0bi50ZXh0Q29udGVudCA9ICdcdTIzRjMgU2F2aW5nXHUyMDI2JzsgfVxuXG4gIGNvbnN0IHJlc3BvbnNlcyA9IFtdO1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2MtcXVlc3Rpb24tYmxvY2snKS5mb3JFYWNoKChibG9jaywgaSkgPT4ge1xuICAgIGNvbnN0IHFFbCAgICA9IGJsb2NrLnF1ZXJ5U2VsZWN0b3IoJy5zYy1xdWVzdGlvbi1oZWFkZXIgc3BhbjpsYXN0LWNoaWxkJyk7XG4gICAgY29uc3QgdGV4dEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNjLXRleHQtJHtpfWApO1xuICAgIGNvbnN0IHRvcGljRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc2MtdG9waWMtJHtpfWApO1xuICAgIGlmICghdGV4dEVsKSByZXR1cm47IC8vIG5vdCB5ZXQgZ2VuZXJhdGVkIFx1MjAxNCBza2lwXG5cbiAgICBjb25zdCBxdWVzdGlvbiAgICAgPSBxRWwgPyBxRWwudGV4dENvbnRlbnQudHJpbSgpIDogJyc7XG4gICAgY29uc3QgcmVzcG9uc2VUZXh0ID0gKF9zY3JlZW5pbmdTdGF0ZVtpXT8ucmVzcG9uc2VUZXh0KSB8fCB0ZXh0RWwudmFsdWUgfHwgJyc7XG4gICAgY29uc3QgZm10ICAgICAgICAgID0gX2dldFNlbGVjdGVkRm9ybWF0KGkpO1xuICAgIGNvbnN0IHRvcGljVGFnICAgICA9IHRvcGljRWwgPyB0b3BpY0VsLnZhbHVlLnRyaW0oKSA6ICcnO1xuXG4gICAgcmVzcG9uc2VzLnB1c2goeyBxdWVzdGlvbiwgdG9waWNfdGFnOiB0b3BpY1RhZywgZm9ybWF0OiBmbXQsIHJlc3BvbnNlX3RleHQ6IHJlc3BvbnNlVGV4dCB9KTtcbiAgfSk7XG5cbiAgaWYgKCFyZXNwb25zZXMubGVuZ3RoKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjZBMFx1RkUwRiBOb3RoaW5nIHRvIFNhdmUnLCAnUGxlYXNlIGdlbmVyYXRlIGF0IGxlYXN0IG9uZSByZXNwb25zZSBiZWZvcmUgc2F2aW5nLicpO1xuICAgIGlmIChidG4pIHsgYnRuLmRpc2FibGVkID0gZmFsc2U7IGJ0bi50ZXh0Q29udGVudCA9ICdcdUQ4M0RcdURDQkUgU2F2ZSBBbGwgUmVzcG9uc2VzJzsgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL3NjcmVlbmluZy9zYXZlJywge1xuICAgICAgbWV0aG9kOiAgJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiAgICBKU09OLnN0cmluZ2lmeSh7IHJlc3BvbnNlcyB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjcwNSBTYXZlZCcsIGAke2RhdGEuY291bnR9IHJlc3BvbnNlJHtkYXRhLmNvdW50ICE9PSAxID8gJ3MnIDogJyd9IHNhdmVkIGFzIDxzdHJvbmc+JHtlc2NhcGVIdG1sKGRhdGEuZmlsZW5hbWUpfTwvc3Ryb25nPiBhbmQgYWRkZWQgdG8geW91ciByZXNwb25zZSBsaWJyYXJ5LmApO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIFNhdmUgRmFpbGVkJywgZGF0YS5lcnJvciB8fCAnQ291bGQgbm90IHNhdmUgcmVzcG9uc2VzLicpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIGNvbnRhY3Qgc2VydmVyLicpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChidG4pIHsgYnRuLmRpc2FibGVkID0gZmFsc2U7IGJ0bi50ZXh0Q29udGVudCA9ICdcdUQ4M0RcdURDQkUgU2F2ZSBBbGwgUmVzcG9uc2VzJzsgfVxuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFeHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5leHBvcnQge1xuICBfc2NyZWVuaW5nU3RhdGUsXG4gIF9zY3JlZW5pbmdJbnB1dFRleHQsXG4gIF9yZXNldFNjcmVlbmluZ0lucHV0VGV4dCxcbiAgcG9wdWxhdGVTY3JlZW5pbmdUYWIsXG4gIHBhcnNlU2NyZWVuaW5nUXVlc3Rpb25zLFxuICByZW5kZXJRdWVzdGlvbkJsb2NrLFxuICBfZm10TGFiZWwsXG4gIHNlbGVjdEZvcm1hdCxcbiAgX2dldFNlbGVjdGVkRm9ybWF0LFxuICBzZWFyY2hGb3JRdWVzdGlvbixcbiAgdG9nZ2xlUHJpb3JVc2UsXG4gIHVwZGF0ZUV4cFNlbGVjdGlvbixcbiAgZ2VuZXJhdGVTY3JlZW5pbmdSZXNwb25zZSxcbiAgc2F2ZVNjcmVlbmluZ1Jlc3BvbnNlcyxcbn07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9maW5hbGlzZS5qc1xuICogRmluYWxpc2UgJiBhcmNoaXZlIHRhYjogZmluYWxpc2UgYXBwbGljYXRpb24sIGhhcnZlc3QgY2FuZGlkYXRlcyxcbiAqIGFwcGx5IHNlbGVjdGVkIHVwZGF0ZXMgdG8gbWFzdGVyIENWIGRhdGEuXG4gKlxuICogRGVwZW5kZW5jaWVzIChyZXNvbHZlZCB0aHJvdWdoIGdsb2JhbFRoaXMgYXQgcnVudGltZSk6XG4gKiAgIGVzY2FwZUh0bWwsIF9yZW5kZXJDb25zaXN0ZW5jeVJlcG9ydFxuICovXG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IGZvcm1hdEF0c1Njb3JlU3VtbWFyeSB9IGZyb20gJy4vYXRzLXJlZmluZW1lbnQuanMnO1xuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdmaW5hbGlzZScpO1xuXG5mdW5jdGlvbiBfZm9ybWF0RHVyYXRpb24oc2Vjcykge1xuICBpZiAoc2VjcyA9PSBudWxsIHx8IHNlY3MgPCAwKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgaCA9IE1hdGguZmxvb3Ioc2VjcyAvIDM2MDApO1xuICBjb25zdCBtID0gTWF0aC5mbG9vcigoc2VjcyAlIDM2MDApIC8gNjApO1xuICBjb25zdCBzID0gc2VjcyAlIDYwO1xuICBpZiAoaCA+IDApIHJldHVybiBgJHtofWggJHttfW1gO1xuICBpZiAobSA+IDApIHJldHVybiBgJHttfW0gJHtzfXNgO1xuICByZXR1cm4gYCR7c31zYDtcbn1cblxuZnVuY3Rpb24gX3JlbmRlckZpbmFsaXNlQXRzSXRlbXMoc2NvcmUsIGF0c0tleXdvcmRzKSB7XG4gIGlmICghc2NvcmUgfHwgdHlwZW9mIHNjb3JlLm92ZXJhbGwgIT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGA8bGk+QVRTIGtleXdvcmRzIHRyYWNrZWQ6ICR7YXRzS2V5d29yZHMubGVuZ3RofTwvbGk+YDtcbiAgfVxuXG4gIGNvbnN0IHN1bW1hcnkgPSBmb3JtYXRBdHNTY29yZVN1bW1hcnkoc2NvcmUpO1xuICBjb25zdCBoYXJkU2NvcmUgPSB0eXBlb2Ygc2NvcmUuaGFyZF9yZXF1aXJlbWVudF9zY29yZSA9PT0gJ251bWJlcidcbiAgICA/IGAke01hdGgucm91bmQoc2NvcmUuaGFyZF9yZXF1aXJlbWVudF9zY29yZSl9JWBcbiAgICA6ICduL2EnO1xuICBjb25zdCBzb2Z0U2NvcmUgPSB0eXBlb2Ygc2NvcmUuc29mdF9yZXF1aXJlbWVudF9zY29yZSA9PT0gJ251bWJlcidcbiAgICA/IGAke01hdGgucm91bmQoc2NvcmUuc29mdF9yZXF1aXJlbWVudF9zY29yZSl9JWBcbiAgICA6ICduL2EnO1xuXG4gIHJldHVybiBbXG4gICAgYDxsaT5BVFMgc2NvcmU6IDxzdHJvbmc+JHtzdW1tYXJ5Lm92ZXJhbGx9JTwvc3Ryb25nPiA8c3BhbiBzdHlsZT1cImNvbG9yOiM0NzU1Njk7XCI+KGhhcmQgJHtoYXJkU2NvcmV9IFx1MjAyMiBzb2Z0ICR7c29mdFNjb3JlfSk8L3NwYW4+PC9saT5gLFxuICAgIGA8bGk+QVRTIGNvdmVyYWdlOiAke2VzY2FwZUh0bWwoc3VtbWFyeS5saW5lKX08L2xpPmAsXG4gICAgYDxsaT5BVFMgZGV0YWlsOiAke2VzY2FwZUh0bWwoc3VtbWFyeS5kZXRhaWwpfTwvbGk+YCxcbiAgXS5qb2luKCcnKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFBvcHVsYXRlIGZpbmFsaXNlIHRhYiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gcG9wdWxhdGVGaW5hbGlzZVRhYigpIHtcbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG5cbiAgLy8gRmV0Y2ggY3VycmVudCBzdGF0dXMgdG8gZ2V0IGdlbmVyYXRlZCBmaWxlcyBhbmQgam9iIGFuYWx5c2lzIGZvciBjb25zaXN0ZW5jeSBjaGVja1xuICBsZXQgZ2VuZXJhdGVkICA9IG51bGw7XG4gIGxldCBzdGF0dXNEYXRhID0gbnVsbDtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvc3RhdHVzJyk7XG4gICAgc3RhdHVzRGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgZ2VuZXJhdGVkICA9IHN0YXR1c0RhdGEuZ2VuZXJhdGVkX2ZpbGVzIHx8IG51bGw7XG4gIH0gY2F0Y2ggKGVycikgeyBsb2cud2FybignRmFpbGVkIHRvIGZldGNoIHN0YXR1cyBmb3IgZmluYWxpc2UgdGFiOicsIGVycik7IH1cblxuICBpZiAoIWdlbmVyYXRlZCB8fCAhZ2VuZXJhdGVkLm91dHB1dF9kaXIpIHtcbiAgICBjb250ZW50LmlubmVySFRNTCA9IGBcbiAgICAgIDxoMT5cdTI3MDUgRmluYWxpc2UgQXBwbGljYXRpb248L2gxPlxuICAgICAgPGRpdiBjbGFzcz1cImVtcHR5LXN0YXRlXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpY29uXCI+XHVEODNEXHVEQ0MyPC9kaXY+XG4gICAgICAgIDxoMz5ObyBDViBHZW5lcmF0ZWQgWWV0PC9oMz5cbiAgICAgICAgPHA+UGxlYXNlIGdlbmVyYXRlIGEgQ1YgZmlyc3QgYmVmb3JlIGZpbmFsaXNpbmcuPC9wPlxuICAgICAgPC9kaXY+YDtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBmaWxlcyA9IGdlbmVyYXRlZC5maWxlcyB8fCBbXTtcblxuICBsZXQgaHRtbCA9IGBcbiAgICA8aDE+XHUyNzA1IEZpbmFsaXNlIEFwcGxpY2F0aW9uPC9oMT5cbiAgICA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7bWFyZ2luLWJvdHRvbToyNHB4O1wiPlxuICAgICAgQXJjaGl2ZSB0aGlzIGFwcGxpY2F0aW9uIHRvIHlvdXIgQ1YgaGlzdG9yeSwgdXBkYXRlIHRoZSByZXNwb25zZSBsaWJyYXJ5LCBhbmQgb3B0aW9uYWxseVxuICAgICAgd3JpdGUgYW55IGltcHJvdmVtZW50cyBiYWNrIHRvIE1hc3RlciBDViBEYXRhLlxuICAgIDwvcD5cblxuICAgIDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmMGZkZjQ7Ym9yZGVyOjFweCBzb2xpZCAjYmJmN2QwO2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MTZweDttYXJnaW4tYm90dG9tOjI0cHg7XCI+XG4gICAgICA8aDMgc3R5bGU9XCJtYXJnaW46MCAwIDEwcHg7XCI+XHVEODNEXHVEQ0MyIEdlbmVyYXRlZCBGaWxlczwvaDM+XG4gICAgICA8dWwgc3R5bGU9XCJtYXJnaW46MDtwYWRkaW5nLWxlZnQ6MjBweDtsaW5lLWhlaWdodDoxLjg7XCI+XG4gICAgICAgICR7ZmlsZXMubWFwKGYgPT4gYDxsaT48Y29kZSBzdHlsZT1cImZvbnQtc2l6ZTowLjllbTtcIj4ke2VzY2FwZUh0bWwoZil9PC9jb2RlPjwvbGk+YCkuam9pbignJykgfHwgJzxsaT4obm9uZSk8L2xpPid9XG4gICAgICA8L3VsPlxuICAgICAgPHAgc3R5bGU9XCJtYXJnaW46OHB4IDAgMDtmb250LXNpemU6MC44NWVtO2NvbG9yOiMxNjY1MzQ7XCI+T3V0cHV0IGRpcjogPGNvZGU+JHtlc2NhcGVIdG1sKGdlbmVyYXRlZC5vdXRwdXRfZGlyKX08L2NvZGU+PC9wPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBpZD1cInJlYWRpbmVzcy1jaGVja2xpc3RcIj48L2Rpdj5cbiAgICA8ZGl2IGlkPVwiY29uc2lzdGVuY3ktcmVwb3J0XCI+PC9kaXY+XG4gICAgPGRpdiBpZD1cInJld3JpdGUtYXVkaXQtbG9nXCI+PC9kaXY+XG5cbiAgICA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZmZmO2JvcmRlcjoxcHggc29saWQgI2UyZThmMDtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjIwcHg7bWFyZ2luLWJvdHRvbToyNHB4O1wiPlxuICAgICAgPGgzIHN0eWxlPVwibWFyZ2luOjAgMCAxNnB4O1wiPlx1RDgzRFx1RENDQiBBcHBsaWNhdGlvbiBTdGF0dXM8L2gzPlxuXG4gICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNnB4O1wiPlxuICAgICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjZweDtcIiBmb3I9XCJmaW5hbGlzZS1zdGF0dXNcIj5TdGF0dXM8L2xhYmVsPlxuICAgICAgICA8c2VsZWN0IGlkPVwiZmluYWxpc2Utc3RhdHVzXCIgc3R5bGU9XCJ3aWR0aDoyMjBweDtwYWRkaW5nOjhweCAxMHB4O2JvcmRlcjoxcHggc29saWQgI2NiZDVlMTtib3JkZXItcmFkaXVzOjZweDtmb250LXNpemU6MC45NWVtO1wiPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJkcmFmdFwiPkRyYWZ0IFx1MjAxNCBub3QgeWV0IHNlbnQ8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicmVhZHlcIiBzZWxlY3RlZD5SZWFkeSB0byBzZW5kPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInNlbnRcIj5TZW50PC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImludGVydmlld1wiPkludGVydmlldyBzY2hlZHVsZWQ8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicmVqZWN0ZWRcIj5SZWplY3RlZDwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJhY2NlcHRlZFwiPkFjY2VwdGVkPC9vcHRpb24+XG4gICAgICAgIDwvc2VsZWN0PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjIwcHg7XCI+XG4gICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NnB4O1wiIGZvcj1cImZpbmFsaXNlLW5vdGVzXCI+Tm90ZXM8L2xhYmVsPlxuICAgICAgICA8dGV4dGFyZWEgaWQ9XCJmaW5hbGlzZS1ub3Rlc1wiIHJvd3M9XCI0XCIgbWF4bGVuZ3RoPVwiMjAwMFwiXG4gICAgICAgICAgb25pbnB1dD1cImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaW5hbGlzZS1ub3Rlcy1jb3VudGVyJykudGV4dENvbnRlbnQ9dGhpcy52YWx1ZS5sZW5ndGgrJyAvIDIwMDAnO2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaW5hbGlzZS1ub3Rlcy1jb3VudGVyJykuc3R5bGUuY29sb3I9dGhpcy52YWx1ZS5sZW5ndGg+MTgwMD8nI2RjMjYyNic6dGhpcy52YWx1ZS5sZW5ndGg+MTYwMD8nI2Q5NzcwNic6JyM2YjcyODAnXCJcbiAgICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7cGFkZGluZzoxMHB4O2JvcmRlcjoxcHggc29saWQgI2NiZDVlMTtib3JkZXItcmFkaXVzOjZweDtcbiAgICAgICAgICAgICAgICAgZm9udC1zaXplOjAuOTJlbTtyZXNpemU6dmVydGljYWw7Ym94LXNpemluZzpib3JkZXItYm94O1wiXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJSZWNydWl0ZXIgbmFtZSwgc2FsYXJ5IGluZm8sIGZvbGxvdy11cCBkYXRlLCBpbnRlcnZpZXcgbm90ZXNcdTIwMjZcIj48L3RleHRhcmVhPlxuICAgICAgICA8ZGl2IGlkPVwiZmluYWxpc2Utbm90ZXMtY291bnRlclwiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiIHN0eWxlPVwidGV4dC1hbGlnbjpyaWdodDtmb250LXNpemU6MC44ZW07Y29sb3I6IzZiNzI4MDttYXJnaW4tdG9wOjJweDtcIj4wIC8gMjAwMDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxidXR0b24gaWQ9XCJmaW5hbGlzZS1idG5cIiBvbmNsaWNrPVwiZmluYWxpc2VBcHBsaWNhdGlvbigpXCJcbiAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiMwNTk2Njk7Y29sb3I6I2ZmZjtib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjZweDtcbiAgICAgICAgICAgICAgIHBhZGRpbmc6MTBweCAyNHB4O2ZvbnQtc2l6ZToxZW07Zm9udC13ZWlnaHQ6NjAwO2N1cnNvcjpwb2ludGVyO1wiPlxuICAgICAgICBcdTI3MDUgRmluYWxpc2UgJmFtcDsgQXJjaGl2ZVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGlkPVwiZmluYWxpc2UtcmVzdWx0XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+PC9kaXY+XG4gICAgPGRpdiBpZD1cImhhcnZlc3Qtc2VjdGlvblwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPjwvZGl2PlxuICBgO1xuXG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gaHRtbDtcbiAgX3JlbmRlclJlYWRpbmVzc0NoZWNrbGlzdChmaWxlcywgc3RhdHVzRGF0YSk7XG4gIGlmIChzdGF0dXNEYXRhKSBfcmVuZGVyQ29uc2lzdGVuY3lSZXBvcnQoc3RhdHVzRGF0YSk7XG4gIF9yZW5kZXJSZXdyaXRlQXVkaXRMb2coKTtcbiAgX3Jlc3RvcmVGaW5hbGlzZU1ldGEoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gX3Jlc3RvcmVGaW5hbGlzZU1ldGEoKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvZmluYWxpc2UtbWV0YScpO1xuICAgIGlmICghcmVzLm9rKSByZXR1cm47XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgY29uc3Qgc3RhdHVzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmluYWxpc2Utc3RhdHVzJyk7XG4gICAgY29uc3Qgbm90ZXNFbCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmluYWxpc2Utbm90ZXMnKTtcbiAgICBpZiAoc3RhdHVzRWwgJiYgZGF0YS5hcHBsaWNhdGlvbl9zdGF0dXMpIHN0YXR1c0VsLnZhbHVlID0gZGF0YS5hcHBsaWNhdGlvbl9zdGF0dXM7XG4gICAgaWYgKG5vdGVzRWwgICYmIGRhdGEubm90ZXMpIHtcbiAgICAgIG5vdGVzRWwudmFsdWUgPSBkYXRhLm5vdGVzO1xuICAgICAgY29uc3QgY291bnRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaW5hbGlzZS1ub3Rlcy1jb3VudGVyJyk7XG4gICAgICBpZiAoY291bnRlcikge1xuICAgICAgICBjb25zdCBsZW4gPSBkYXRhLm5vdGVzLmxlbmd0aDtcbiAgICAgICAgY291bnRlci50ZXh0Q29udGVudCA9IGAke2xlbn0gLyAyMDAwYDtcbiAgICAgICAgY291bnRlci5zdHlsZS5jb2xvciA9IGxlbiA+IDE4MDAgPyAnI2RjMjYyNicgOiBsZW4gPiAxNjAwID8gJyNkOTc3MDYnIDogJyM2YjcyODAnO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoXykge31cbn1cblxuLy8gXHUyNTAwXHUyNTAwIFN1Ym1pc3Npb24gcmVhZGluZXNzIGNoZWNrbGlzdCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gX3JlbmRlclJlYWRpbmVzc0NoZWNrbGlzdChmaWxlcywgc3RhdHVzRGF0YSkge1xuICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWFkaW5lc3MtY2hlY2tsaXN0Jyk7XG4gIGlmICghZWwpIHJldHVybjtcblxuICBjb25zdCBmaWxlU2V0ID0gbmV3IFNldCgoZmlsZXMgfHwgW10pLm1hcChmID0+IChmIHx8ICcnKS50b0xvd2VyQ2FzZSgpKSk7XG4gIGNvbnN0IGhhc1BkZiAgPSBbLi4uZmlsZVNldF0uc29tZShmID0+IGYuZW5kc1dpdGgoJy5wZGYnKSAmJiAhZi5pbmNsdWRlcygnY292ZXJsZXR0ZXInKSAmJiAhZi5pbmNsdWRlcygnY292ZXJfbGV0dGVyJykpO1xuICBjb25zdCBoYXNEb2N4ID0gWy4uLmZpbGVTZXRdLnNvbWUoZiA9PiBmLmVuZHNXaXRoKCcuZG9jeCcpICYmICFmLmluY2x1ZGVzKCdjb3ZlcmxldHRlcicpICYmICFmLmluY2x1ZGVzKCdjb3Zlcl9sZXR0ZXInKSAmJiAhZi5pbmNsdWRlcygnc2NyZWVuaW5nJykpO1xuICBjb25zdCBoYXNIdG1sID0gWy4uLmZpbGVTZXRdLnNvbWUoZiA9PiBmLmVuZHNXaXRoKCcuaHRtbCcpKTtcbiAgY29uc3QgaGFzQ2wgICA9IFsuLi5maWxlU2V0XS5zb21lKGYgPT4gZi5pbmNsdWRlcygnY292ZXJsZXR0ZXInKSB8fCBmLmluY2x1ZGVzKCdjb3Zlcl9sZXR0ZXInKSk7XG4gIGNvbnN0IGhhc1NjciAgPSBbLi4uZmlsZVNldF0uc29tZShmID0+IGYuaW5jbHVkZXMoJ3NjcmVlbmluZycpKTtcblxuICBjb25zdCBhdHNDaGVja3MgID0gc3RhdHVzRGF0YT8uYXRzX2NoZWNrcyB8fCBbXTtcbiAgY29uc3QgYXRzRmFpbHMgICA9IChhdHNDaGVja3MpLmZpbHRlcihjID0+IGMuc3RhdHVzID09PSAnZmFpbCcgfHwgYy5zdGF0dXMgPT09ICdlcnJvcicpLmxlbmd0aDtcbiAgY29uc3QgYXRzU2Nhbm5lZCA9IGF0c0NoZWNrcy5sZW5ndGggPiAwO1xuXG4gIGNvbnN0IGxheW91dEZyZXNoID0gc3RhdHVzRGF0YT8ubGF5b3V0X2ZyZXNobmVzcyAhPT0gJ3N0YWxlJztcblxuICBjb25zdCBpdGVtcyA9IFtcbiAgICB7IG9rOiBoYXNQZGYsICAgbGFiZWw6ICdDViBQREYgZ2VuZXJhdGVkJywgICAgICAgIHdhcm46IGZhbHNlIH0sXG4gICAgeyBvazogaGFzRG9jeCwgIGxhYmVsOiAnQ1YgRE9DWCBnZW5lcmF0ZWQnLCAgICAgICB3YXJuOiBmYWxzZSB9LFxuICAgIHsgb2s6IGhhc0h0bWwsICBsYWJlbDogJ0NWIEhUTUwgZ2VuZXJhdGVkJywgICAgICAgd2FybjogZmFsc2UgfSxcbiAgICB7IG9rOiBoYXNDbCwgICAgbGFiZWw6ICdDb3ZlciBsZXR0ZXIgZ2VuZXJhdGVkJywgIHdhcm46IHRydWUgIH0sXG4gICAgeyBvazogaGFzU2NyLCAgIGxhYmVsOiAnU2NyZWVuaW5nIFEmQSBnZW5lcmF0ZWQnLCB3YXJuOiB0cnVlICB9LFxuICAgIHsgb2s6IGF0c1NjYW5uZWQgJiYgYXRzRmFpbHMgPT09IDAsIHdhcm46IHRydWUsXG4gICAgICBsYWJlbDogYXRzU2Nhbm5lZFxuICAgICAgICA/IChhdHNGYWlscyA+IDAgPyBgQVRTIHZhbGlkYXRpb24gXHUyMDE0ICR7YXRzRmFpbHN9IGlzc3VlJHthdHNGYWlscyAhPT0gMSA/ICdzJyA6ICcnfSBmb3VuZGAgOiAnQVRTIHZhbGlkYXRpb24gcGFzc2VkJylcbiAgICAgICAgOiAnQVRTIHZhbGlkYXRpb24gbm90IHlldCBydW4nIH0sXG4gICAgeyBvazogbGF5b3V0RnJlc2gsIHdhcm46IHRydWUsIGxhYmVsOiAnTGF5b3V0IGlzIGN1cnJlbnQgKG5vdCBzdGFsZSknIH0sXG4gIF07XG5cbiAgY29uc3Qgcm93cyA9IGl0ZW1zLm1hcCgoeyBvaywgbGFiZWwsIHdhcm4gfSkgPT4ge1xuICAgIGNvbnN0IGljb24gID0gb2sgPyAnXHUyNzA1JyA6ICh3YXJuID8gJ1x1MjZBMCcgOiAnXHUyNzRDJyk7XG4gICAgY29uc3QgY29sb3IgPSBvayA/ICcjMDY1ZjQ2JyA6ICh3YXJuID8gJyM5MjQwMGUnIDogJyM5OTFiMWInKTtcbiAgICBjb25zdCBiZyAgICA9IG9rID8gJyNmMGZkZjQnIDogKHdhcm4gPyAnI2ZmZmJlYicgOiAnI2ZlZjJmMicpO1xuICAgIHJldHVybiBgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjEwcHg7cGFkZGluZzo4cHggMTJweDtiYWNrZ3JvdW5kOiR7Ymd9O2JvcmRlci1yYWRpdXM6NnB4O21hcmdpbi1ib3R0b206NnB4O1wiPlxuICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCIgc3R5bGU9XCJmb250LXNpemU6MS4xZW07XCI+JHtpY29ufTwvc3Bhbj5cbiAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6JHtjb2xvcn07Zm9udC1zaXplOjAuOTJlbTtcIj4ke2VzY2FwZUh0bWwobGFiZWwpfTwvc3Bhbj5cbiAgICA8L2Rpdj5gO1xuICB9KS5qb2luKCcnKTtcblxuICBjb25zdCBhbGxSZXF1aXJlZCA9IGhhc1BkZiAmJiBoYXNEb2N4ICYmIGhhc0h0bWw7XG4gIGNvbnN0IGhlYWRlckNvbG9yID0gYWxsUmVxdWlyZWQgPyAnIzA2NWY0NicgOiAnIzkyNDAwZSc7XG4gIGVsLmlubmVySFRNTCA9IGBcbiAgICA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZmZmO2JvcmRlcjoxcHggc29saWQgI2UyZThmMDtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjE2cHggMjBweDttYXJnaW4tYm90dG9tOjI0cHg7XCI+XG4gICAgICA8aDMgc3R5bGU9XCJtYXJnaW46MCAwIDEycHg7Y29sb3I6JHtoZWFkZXJDb2xvcn07XCI+XHVEODNEXHVEQ0NCIFN1Ym1pc3Npb24gUmVhZGluZXNzPC9oMz5cbiAgICAgICR7cm93c31cbiAgICAgIDxwIHN0eWxlPVwibWFyZ2luOjEwcHggMCAwO2ZvbnQtc2l6ZTowLjgyZW07Y29sb3I6IzY0NzQ4YjtcIj5cbiAgICAgICAgXHUyNkEwIGl0ZW1zIGFyZSBvcHRpb25hbCBcdTIwMTQgdGhleSB3YXJuIGJ1dCBkbyBub3QgYmxvY2sgYXJjaGl2aW5nLlxuICAgICAgICBcdTI3NEMgaXRlbXMgbXVzdCBiZSByZXNvbHZlZCBiZWZvcmUgc3VibWl0dGluZy5cbiAgICAgIDwvcD5cbiAgICA8L2Rpdj5gO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgUmV3cml0ZSBhdWRpdCBsb2cgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIF9yZW5kZXJSZXdyaXRlQXVkaXRMb2coKSB7XG4gIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jld3JpdGUtYXVkaXQtbG9nJyk7XG4gIGlmICghZWwpIHJldHVybjtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvcmV3cml0ZXMnKTtcbiAgICBpZiAoIXJlcy5vaykgcmV0dXJuO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGNvbnN0IGF1ZGl0ID0gZGF0YS5yZXdyaXRlX2F1ZGl0IHx8IFtdO1xuICAgIGlmIChhdWRpdC5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICBjb25zdCByb3dzID0gYXVkaXQubWFwKGVudHJ5ID0+IHtcbiAgICAgIGNvbnN0IG91dGNvbWUgPSBlbnRyeS5vdXRjb21lIHx8IGVudHJ5LmRlY2lzaW9uIHx8ICdcdTIwMTQnO1xuICAgICAgY29uc3QgaWNvbiA9IG91dGNvbWUgPT09ICdhY2NlcHRlZCcgPyAnXHUyNzA1JyA6IG91dGNvbWUgPT09ICdlZGl0ZWQnID8gJ1x1MjcwRlx1RkUwRicgOiBvdXRjb21lID09PSAncmVqZWN0ZWQnID8gJ1x1Mjc0QycgOiAnXHUyMDE0JztcbiAgICAgIGNvbnN0IG9yaWdpbmFsICA9IGVzY2FwZUh0bWwoKGVudHJ5Lm9yaWdpbmFsX3RleHQgfHwgZW50cnkub3JpZ2luYWwgfHwgJycpLnNsaWNlKDAsIDEyMCkpO1xuICAgICAgY29uc3QgZmluYWwgICAgID0gZXNjYXBlSHRtbCgoZW50cnkuZmluYWxfdGV4dCB8fCBlbnRyeS5yZXdyaXR0ZW4gfHwgZW50cnkuc3VnZ2VzdGVkIHx8ICcnKS5zbGljZSgwLCAxMjApKTtcbiAgICAgIGNvbnN0IGZpZWxkICAgICA9IGVzY2FwZUh0bWwoZW50cnkuZmllbGQgfHwgZW50cnkudHlwZSB8fCAnXHUyMDE0Jyk7XG4gICAgICByZXR1cm4gYDx0cj5cbiAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzo2cHggOHB4O2ZvbnQtc2l6ZTowLjhlbTtjb2xvcjojNmI3MjgwO1wiPiR7ZmllbGR9PC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzo2cHggOHB4O2ZvbnQtc2l6ZTowLjhlbTtjb2xvcjojMzc0MTUxO1wiPiR7b3JpZ2luYWx9JHtvcmlnaW5hbC5sZW5ndGggPT09IDEyMCA/ICdcdTIwMjYnIDogJyd9PC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzo2cHggOHB4O2ZvbnQtc2l6ZTowLjhlbTtjb2xvcjojMzc0MTUxO1wiPiR7ZmluYWx9JHtmaW5hbC5sZW5ndGggPT09IDEyMCA/ICdcdTIwMjYnIDogJyd9PC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzo2cHggOHB4O2ZvbnQtc2l6ZTowLjhlbTt0ZXh0LWFsaWduOmNlbnRlcjtcIj4ke2ljb259ICR7ZXNjYXBlSHRtbChvdXRjb21lKX08L3RkPlxuICAgICAgPC90cj5gO1xuICAgIH0pLmpvaW4oJycpO1xuICAgIGVsLmlubmVySFRNTCA9IGBcbiAgICAgIDxkZXRhaWxzIHN0eWxlPVwibWFyZ2luLWJvdHRvbToyNHB4O1wiPlxuICAgICAgICA8c3VtbWFyeSBzdHlsZT1cImN1cnNvcjpwb2ludGVyO2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MC45NWVtO3BhZGRpbmc6MTBweCAwO2NvbG9yOiMzNzQxNTE7dXNlci1zZWxlY3Q6bm9uZTtcIj5cbiAgICAgICAgICBcdUQ4M0RcdURDQ0IgUmV3cml0ZSBhdWRpdCBsb2cgKCR7YXVkaXQubGVuZ3RofSBkZWNpc2lvbiR7YXVkaXQubGVuZ3RoICE9PSAxID8gJ3MnIDogJyd9KVxuICAgICAgICA8L3N1bW1hcnk+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJvdmVyZmxvdy14OmF1dG87bWFyZ2luLXRvcDoxMHB4O1wiPlxuICAgICAgICAgIDx0YWJsZSBzdHlsZT1cIndpZHRoOjEwMCU7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlO2ZvbnQtc2l6ZTowLjg1ZW07XCI+XG4gICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgIDx0ciBzdHlsZT1cImJhY2tncm91bmQ6I2Y4ZmFmYztib3JkZXItYm90dG9tOjJweCBzb2xpZCAjZTJlOGYwO1wiPlxuICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cInBhZGRpbmc6OHB4O3RleHQtYWxpZ246bGVmdDtjb2xvcjojMzc0MTUxO2ZvbnQtd2VpZ2h0OjYwMDtcIj5GaWVsZDwvdGg+XG4gICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwicGFkZGluZzo4cHg7dGV4dC1hbGlnbjpsZWZ0O2NvbG9yOiMzNzQxNTE7Zm9udC13ZWlnaHQ6NjAwO1wiPk9yaWdpbmFsPC90aD5cbiAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJwYWRkaW5nOjhweDt0ZXh0LWFsaWduOmxlZnQ7Y29sb3I6IzM3NDE1MTtmb250LXdlaWdodDo2MDA7XCI+RmluYWw8L3RoPlxuICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cInBhZGRpbmc6OHB4O3RleHQtYWxpZ246Y2VudGVyO2NvbG9yOiMzNzQxNTE7Zm9udC13ZWlnaHQ6NjAwO1wiPk91dGNvbWU8L3RoPlxuICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICAgIDx0Ym9keT4ke3Jvd3N9PC90Ym9keT5cbiAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGV0YWlscz5gO1xuICB9IGNhdGNoIHsgLyogbm9uLWZhdGFsICovIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIEZpbmFsaXNlIGFwcGxpY2F0aW9uIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBmaW5hbGlzZUFwcGxpY2F0aW9uKCkge1xuICAvKiBkdWNrZmxvdzpcbiAgICogICBpZDogZmluYWxpc2VfdWlfc3VibWl0X2xpdmVcbiAgICogICBraW5kOiB1aVxuICAgKiAgIHRpbWVzdGFtcDogJzIwMjYtMDMtMjVUMjE6Mzk6NDhaJ1xuICAgKiAgIHN0YXR1czogbGl2ZVxuICAgKiAgIGhhbmRsZXM6XG4gICAqICAgLSB1aTpmaW5hbGlzZS5zdWJtaXRcbiAgICogICBjYWxsczpcbiAgICogICAtIFBPU1QgL2FwaS9maW5hbGlzZVxuICAgKiAgIHJlYWRzOlxuICAgKiAgIC0gZG9tOiNmaW5hbGlzZS1zdGF0dXMudmFsdWVcbiAgICogICAtIGRvbTojZmluYWxpc2Utbm90ZXMudmFsdWVcbiAgICogICB3cml0ZXM6XG4gICAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9maW5hbGlzZS5zdGF0dXNcbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL2ZpbmFsaXNlLm5vdGVzXG4gICAqICAgLSBkb206I2ZpbmFsaXNlLXJlc3VsdFxuICAgKiAgIG5vdGVzOiBTdWJtaXRzIGZpbmFsIGFwcGxpY2F0aW9uIHN0YXR1cyBhbmQgbm90ZXMgc28gYmFja2VuZCBtZXRhZGF0YSwgYXJjaGl2ZSBzdGF0ZSwgYW5kIG9wdGlvbmFsIGdpdCBmaW5hbGl6YXRpb24gY2FuIGJlIHdyaXR0ZW4gZnJvbSB0aGUgY3VycmVudCBzZXNzaW9uLlxuICAgKi9cbiAgY29uc3QgYnRuICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbmFsaXNlLWJ0bicpO1xuICBjb25zdCByZXN1bHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmluYWxpc2UtcmVzdWx0Jyk7XG4gIGNvbnN0IHN0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaW5hbGlzZS1zdGF0dXMnKS52YWx1ZTtcbiAgY29uc3Qgbm90ZXMgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbmFsaXNlLW5vdGVzJykudmFsdWU7XG5cbiAgYnRuLmRpc2FibGVkICAgID0gdHJ1ZTtcbiAgYnRuLnRleHRDb250ZW50ID0gJ1x1MjNGMyBGaW5hbGlzaW5nXHUyMDI2JztcbiAgcmVzdWx0LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHJlc3VsdC5pbm5lckhUTUwgICAgID0gJyc7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvZmluYWxpc2UnLCB7XG4gICAgICBtZXRob2Q6ICAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6ICAgIEpTT04uc3RyaW5naWZ5KHsgc3RhdHVzLCBub3RlcyB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcblxuICAgIGlmICghcmVzLm9rIHx8ICFkYXRhLm9rKSB7XG4gICAgICByZXN1bHQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICByZXN1bHQuaW5uZXJIVE1MID0gYDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZWUyZTI7Ym9yZGVyOjFweCBzb2xpZCAjZmNhNWE1O2JvcmRlci1yYWRpdXM6OHB4O1xuICAgICAgICBwYWRkaW5nOjE0cHggMThweDtjb2xvcjojOTkxYjFiO1wiPlxuICAgICAgICA8c3Ryb25nPlx1Mjc0QyBFcnJvcjo8L3N0cm9uZz4gJHtlc2NhcGVIdG1sKGRhdGEuZXJyb3IgfHwgJ0ZpbmFsaXNlIGZhaWxlZCcpfVxuICAgICAgPC9kaXY+YDtcbiAgICAgIGJ0bi5kaXNhYmxlZCAgICA9IGZhbHNlO1xuICAgICAgYnRuLnRleHRDb250ZW50ID0gJ1x1MjcwNSBGaW5hbGlzZSAmIEFyY2hpdmUnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN1bW1hcnkgPSBkYXRhLnN1bW1hcnkgfHwge307XG4gICAgY29uc3QgaGFzaCAgICA9IGRhdGEuY29tbWl0X2hhc2ggPyBgPGNvZGUgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO1wiPiR7ZXNjYXBlSHRtbChkYXRhLmNvbW1pdF9oYXNoKX08L2NvZGU+YCA6ICcobm8gY29tbWl0KSc7XG4gICAgY29uc3QgZ2l0V2FybiA9IGRhdGEuZ2l0X2Vycm9yXG4gICAgICA/IGA8cCBzdHlsZT1cImNvbG9yOiNkOTc3MDY7Zm9udC1zaXplOjAuODdlbTttYXJnaW4tdG9wOjhweDtcIj5cdTI2QTAgR2l0OiAke2VzY2FwZUh0bWwoZGF0YS5naXRfZXJyb3IpfTwvcD5gXG4gICAgICA6ICcnO1xuICAgIGNvbnN0IGFwcHJvdmVkQ291bnQgPSBzdW1tYXJ5LmFwcHJvdmVkX3Jld3JpdGVzID8/IDA7XG4gICAgY29uc3QgYXRzS2V5d29yZHMgICA9IHN1bW1hcnkuYXRzX2tleXdvcmRzIHx8IFtdO1xuICAgIGNvbnN0IGF0c1Njb3JlICAgICAgPSBzdW1tYXJ5LmF0c19zY29yZSB8fCBudWxsO1xuICAgIGNvbnN0IGR1cmF0aW9uU2VjcyAgPSBzdW1tYXJ5LnNlc3Npb25fZHVyYXRpb25fc2VjcztcbiAgICBjb25zdCBkdXJhdGlvblN0ciAgID0gZHVyYXRpb25TZWNzICE9IG51bGwgPyBfZm9ybWF0RHVyYXRpb24oZHVyYXRpb25TZWNzKSA6IG51bGw7XG5cbiAgICByZXN1bHQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgcmVzdWx0LmlubmVySFRNTCA9IGBcbiAgICAgIDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmMGZkZjQ7Ym9yZGVyOjFweCBzb2xpZCAjODZlZmFjO2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MTZweCAyMHB4O21hcmdpbi1ib3R0b206MjBweDtcIj5cbiAgICAgICAgPHN0cm9uZz5cdTI3MDUgQXBwbGljYXRpb24gYXJjaGl2ZWQhPC9zdHJvbmc+XG4gICAgICAgIDx1bCBzdHlsZT1cIm1hcmdpbjo4cHggMCAwO3BhZGRpbmctbGVmdDoyMHB4O2xpbmUtaGVpZ2h0OjEuODtmb250LXNpemU6MC45MmVtO1wiPlxuICAgICAgICAgIDxsaT5TdGF0dXM6IDxzdHJvbmc+JHtlc2NhcGVIdG1sKHN0YXR1cyl9PC9zdHJvbmc+PC9saT5cbiAgICAgICAgICA8bGk+QXBwcm92ZWQgcmV3cml0ZXM6ICR7YXBwcm92ZWRDb3VudH08L2xpPlxuICAgICAgICAgICR7X3JlbmRlckZpbmFsaXNlQXRzSXRlbXMoYXRzU2NvcmUsIGF0c0tleXdvcmRzKX1cbiAgICAgICAgICAke2R1cmF0aW9uU3RyID8gYDxsaT5TZXNzaW9uIGR1cmF0aW9uOiAke2VzY2FwZUh0bWwoZHVyYXRpb25TdHIpfTwvbGk+YCA6ICcnfVxuICAgICAgICAgIDxsaT5HaXQgY29tbWl0OiAke2hhc2h9PC9saT5cbiAgICAgICAgPC91bD5cbiAgICAgICAgJHtnaXRXYXJufVxuICAgICAgPC9kaXY+YDtcblxuICAgIGJ0bi50ZXh0Q29udGVudCA9ICdcdTI3MDUgQXJjaGl2ZWQnO1xuXG4gICAgLy8gU2hvdyBoYXJ2ZXN0IHNlY3Rpb25cbiAgICBhd2FpdCBzaG93SGFydmVzdFNlY3Rpb24oKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmVzdWx0LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgIHJlc3VsdC5pbm5lckhUTUwgPSBgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2ZlZTJlMjtib3JkZXI6MXB4IHNvbGlkICNmY2E1YTU7Ym9yZGVyLXJhZGl1czo4cHg7XG4gICAgICBwYWRkaW5nOjE0cHggMThweDtjb2xvcjojOTkxYjFiO1wiPlxuICAgICAgPHN0cm9uZz5cdTI3NEMgTmV0d29yayBlcnJvcjo8L3N0cm9uZz4gJHtlc2NhcGVIdG1sKGVyci5tZXNzYWdlKX1cbiAgICA8L2Rpdj5gO1xuICAgIGJ0bi5kaXNhYmxlZCAgICA9IGZhbHNlO1xuICAgIGJ0bi50ZXh0Q29udGVudCA9ICdcdTI3MDUgRmluYWxpc2UgJiBBcmNoaXZlJztcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgU2hvdyBoYXJ2ZXN0IHNlY3Rpb24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIHNob3dIYXJ2ZXN0U2VjdGlvbigpIHtcbiAgY29uc3Qgc2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoYXJ2ZXN0LXNlY3Rpb24nKTtcbiAgc2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgc2VjdGlvbi5pbm5lckhUTUwgPSBgXG4gICAgPGgyIHN0eWxlPVwibWFyZ2luLXRvcDowO1wiPlx1RDgzRFx1RENFNSBVcGRhdGUgTWFzdGVyIENWIERhdGE8L2gyPlxuICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDttYXJnaW4tYm90dG9tOjE2cHg7XCI+TG9hZGluZyBpbXByb3ZlbWVudCBjYW5kaWRhdGVzIGZyb20gdGhpcyBzZXNzaW9uXHUyMDI2PC9wPlxuICAgIDxkaXYgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjtwYWRkaW5nOjI0cHg7XCI+PGRpdiBjbGFzcz1cImxvYWRpbmctc3Bpbm5lclwiPjwvZGl2PjwvZGl2PmA7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvaGFydmVzdC9jYW5kaWRhdGVzJyk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG5cbiAgICBpZiAoIWRhdGEub2spIHtcbiAgICAgIHNlY3Rpb24uaW5uZXJIVE1MID0gYFxuICAgICAgICA8aDIgc3R5bGU9XCJtYXJnaW4tdG9wOjA7XCI+XHVEODNEXHVEQ0U1IFVwZGF0ZSBNYXN0ZXIgQ1YgRGF0YTwvaDI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZWUyZTI7Ym9yZGVyOjFweCBzb2xpZCAjZmNhNWE1O2JvcmRlci1yYWRpdXM6OHB4O1xuICAgICAgICAgIHBhZGRpbmc6MTJweCAxNnB4O2NvbG9yOiM5OTFiMWI7XCI+XG4gICAgICAgICAgXHUyNzRDICR7ZXNjYXBlSHRtbChkYXRhLmVycm9yIHx8ICdGYWlsZWQgdG8gbG9hZCBjYW5kaWRhdGVzJyl9XG4gICAgICAgIDwvZGl2PmA7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY2FuZGlkYXRlcyA9IGRhdGEuY2FuZGlkYXRlcyB8fCBbXTtcblxuICAgIGlmIChjYW5kaWRhdGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgc2VjdGlvbi5pbm5lckhUTUwgPSBgXG4gICAgICAgIDxoMiBzdHlsZT1cIm1hcmdpbi10b3A6MDtcIj5cdUQ4M0RcdURDRTUgVXBkYXRlIE1hc3RlciBDViBEYXRhPC9oMj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImVtcHR5LXN0YXRlXCIgc3R5bGU9XCJwYWRkaW5nOjI0cHggMDtcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWNvblwiPlx1RDgzRFx1RENDQjwvZGl2PlxuICAgICAgICAgIDxoMz5ObyBVcGRhdGUgQ2FuZGlkYXRlczwvaDM+XG4gICAgICAgICAgPHA+Tm90aGluZyBmcm9tIHRoaXMgc2Vzc2lvbiB3YXJyYW50cyB3cml0aW5nIGJhY2sgdG8gdGhlIG1hc3RlciBDVi48L3A+XG4gICAgICAgIDwvZGl2PmA7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdHlwZUljb25zID0ge1xuICAgICAgaW1wcm92ZWRfYnVsbGV0OiAgICAnXHUyNzBGXHVGRTBGJyxcbiAgICAgIG5ld19za2lsbDogICAgICAgICAgJ1x1RDgzRFx1REVFMCcsXG4gICAgICBzdW1tYXJ5X3ZhcmlhbnQ6ICAgICdcdUQ4M0RcdURDREQnLFxuICAgICAgc2tpbGxfZ2FwX2NvbmZpcm1lZDonXHUyNzA1JyxcbiAgICB9O1xuXG4gICAgbGV0IGh0bWwgPSBgXG4gICAgICA8aDIgc3R5bGU9XCJtYXJnaW4tdG9wOjA7XCI+XHVEODNEXHVEQ0U1IFVwZGF0ZSBNYXN0ZXIgQ1YgRGF0YTwvaDI+XG4gICAgICA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7bWFyZ2luLWJvdHRvbToxNnB4O1wiPlxuICAgICAgICBTZWxlY3QgaW1wcm92ZW1lbnRzIGZyb20gdGhpcyBzZXNzaW9uIHRvIHdyaXRlIGJhY2sgdG8gPGNvZGU+TWFzdGVyX0NWX0RhdGEuanNvbjwvY29kZT4uXG4gICAgICAgIE5vIGl0ZW1zIGFyZSBwcmUtc2VsZWN0ZWQgXHUyMDE0IGNob29zZSBvbmx5IHdoYXQgeW91IHdhbnQgdG8ga2VlcC5cbiAgICAgIDwvcD5cbiAgICAgIDx0YWJsZSBjbGFzcz1cInJldmlldy10YWJsZVwiIHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNnB4O1wiPlxuICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgPHRyPlxuICAgICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6MzZweDt0ZXh0LWFsaWduOmNlbnRlcjtcIj5JbmNsdWRlPC90aD5cbiAgICAgICAgICAgIDx0aD5UeXBlPC90aD5cbiAgICAgICAgICAgIDx0aD5DaGFuZ2U8L3RoPlxuICAgICAgICAgICAgPHRoPlJhdGlvbmFsZTwvdGg+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgPC90aGVhZD5cbiAgICAgICAgPHRib2R5PmA7XG5cbiAgICBmb3IgKGNvbnN0IGMgb2YgY2FuZGlkYXRlcykge1xuICAgICAgY29uc3QgaWNvbiAgICAgPSB0eXBlSWNvbnNbYy50eXBlXSB8fCAnXHVEODNEXHVEQ0NDJztcbiAgICAgIGNvbnN0IG9yaWdpbmFsID0gYy5vcmlnaW5hbCAmJiBjLm9yaWdpbmFsICE9PSAnKG5vdCBpbiBtYXN0ZXIgZGF0YSknXG4gICAgICAgID8gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC44MmVtO2NvbG9yOiM2YjcyODA7bWFyZ2luLXRvcDo0cHg7bWFyZ2luLWJvdHRvbToycHg7XG4gICAgICAgICAgICAgICB0ZXh0LWRlY29yYXRpb246bGluZS10aHJvdWdoO1wiPiR7ZXNjYXBlSHRtbChjLm9yaWdpbmFsKX08L2Rpdj5gXG4gICAgICAgIDogJyc7XG4gICAgICBodG1sICs9IGBcbiAgICAgICAgPHRyIGlkPVwiaGFydmVzdC1yb3ctJHtlc2NhcGVIdG1sKGMuaWQpfVwiPlxuICAgICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO1wiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiaGFydmVzdC1jaGstJHtlc2NhcGVIdG1sKGMuaWQpfVwiXG4gICAgICAgICAgICAgIGRhdGEtaGFydmVzdC1pZD1cIiR7ZXNjYXBlSHRtbChjLmlkKX1cIiBzdHlsZT1cIndpZHRoOjE2cHg7aGVpZ2h0OjE2cHg7Y3Vyc29yOnBvaW50ZXI7XCI+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICA8c3BhbiB0aXRsZT1cIiR7ZXNjYXBlSHRtbChjLnR5cGUpfVwiPiR7aWNvbn08L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07Y29sb3I6IzQ3NTU2OTttYXJnaW4tbGVmdDo0cHg7XCI+JHtlc2NhcGVIdG1sKGMudHlwZS5yZXBsYWNlKC9fL2csJyAnKSl9PC9zcGFuPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPHRkPlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtd2VpZ2h0OjUwMDtcIj4ke2VzY2FwZUh0bWwoYy5sYWJlbCl9PC9kaXY+XG4gICAgICAgICAgICAke29yaWdpbmFsfVxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjg4ZW07Y29sb3I6IzFlMjkzYjttYXJnaW4tdG9wOjJweDtcIj4ke2VzY2FwZUh0bWwoYy5wcm9wb3NlZCl9PC9kaXY+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8dGQgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2NvbG9yOiM2NDc0OGI7XCI+JHtlc2NhcGVIdG1sKGMucmF0aW9uYWxlKX08L3RkPlxuICAgICAgICA8L3RyPmA7XG4gICAgfVxuXG4gICAgaHRtbCArPSBgXG4gICAgICAgIDwvdGJvZHk+XG4gICAgICA8L3RhYmxlPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6MTJweDthbGlnbi1pdGVtczpjZW50ZXI7XCI+XG4gICAgICAgIDxidXR0b24gb25jbGljaz1cImFwcGx5SGFydmVzdFNlbGVjdGlvbnMoKVwiXG4gICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiMwZWE1ZTk7Y29sb3I6I2ZmZjtib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjZweDtcbiAgICAgICAgICAgICAgICAgcGFkZGluZzoxMHB4IDI0cHg7Zm9udC1zaXplOjFlbTtmb250LXdlaWdodDo2MDA7Y3Vyc29yOnBvaW50ZXI7XCIgaWQ9XCJoYXJ2ZXN0LWFwcGx5LWJ0blwiPlxuICAgICAgICAgIFx1RDgzRFx1RENFNSBBcHBseSBTZWxlY3RlZCBVcGRhdGVzXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIG9uY2xpY2s9XCJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGFydmVzdC1zZWN0aW9uJykuc3R5bGUuZGlzcGxheT0nbm9uZSdcIlxuICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDojZjFmNWY5O2NvbG9yOiM0NzU1Njk7Ym9yZGVyOjFweCBzb2xpZCAjY2JkNWUxO2JvcmRlci1yYWRpdXM6NnB4O1xuICAgICAgICAgICAgICAgICBwYWRkaW5nOjEwcHggMjBweDtmb250LXNpemU6MC45NWVtO2N1cnNvcjpwb2ludGVyO1wiPlxuICAgICAgICAgIFNraXBcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgaWQ9XCJoYXJ2ZXN0LXJlc3VsdFwiIHN0eWxlPVwibWFyZ2luLXRvcDoxNnB4O1wiPjwvZGl2PmA7XG5cbiAgICBzZWN0aW9uLmlubmVySFRNTCA9IGh0bWw7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHNlY3Rpb24uaW5uZXJIVE1MID0gYFxuICAgICAgPGgyIHN0eWxlPVwibWFyZ2luLXRvcDowO1wiPlx1RDgzRFx1RENFNSBVcGRhdGUgTWFzdGVyIENWIERhdGE8L2gyPlxuICAgICAgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2ZlZTJlMjtib3JkZXI6MXB4IHNvbGlkICNmY2E1YTU7Ym9yZGVyLXJhZGl1czo4cHg7XG4gICAgICAgIHBhZGRpbmc6MTJweCAxNnB4O2NvbG9yOiM5OTFiMWI7XCI+XG4gICAgICAgIFx1Mjc0QyBOZXR3b3JrIGVycm9yOiAke2VzY2FwZUh0bWwoZXJyLm1lc3NhZ2UpfVxuICAgICAgPC9kaXY+YDtcbiAgfVxufVxuXG4vLyBhcHBseUhhcnZlc3RTZWxlY3Rpb25zKCkgKGJvdW5kIHZpYSB0aGUgYnV0dG9uJ3Mgb25jbGljayBhYm92ZSkgbGl2ZXMgaW5cbi8vIHdlYi9oYXJ2ZXN0LmpzLCBub3QgaGVyZSBcdTIwMTQgdGhpcyBmaWxlIHVzZWQgdG8gY2FycnkgaXRzIG93biBkaXZlcmdlbnRcbi8vIGR1cGxpY2F0ZSAoZGlmZmVyZW50IGNvbmZpcm0vbWVzc2FnZSBjb3B5LCBubyBjb25maXJtLW1vZGFsIHN0ZXApLCBidXRcbi8vIHNpbmNlIGJvdGggZmlsZXMgcmVuZGVyIGEgYnV0dG9uIHdpdGggdGhlIHNhbWUgb25jbGljayBhbmQgd2luZG93IHJlc29sdmVzXG4vLyBiYXJlIGlkZW50aWZpZXJzIGF0IGNsaWNrIHRpbWUsIGhhcnZlc3QuanMncyB2ZXJzaW9uIHdhcyBhbHdheXMgdGhlIG9uZVxuLy8gYWN0dWFsbHkgaW52b2tlZCBpbiBwcm9kdWN0aW9uIHJlZ2FyZGxlc3M7IHRoaXMgY29weSB3YXMgdW5yZWFjaGFibGUgZGVhZFxuLy8gY29kZS4gUmVtb3ZlZDsgc2VlIHdlYi9oYXJ2ZXN0LmpzLlxuXG4vLyBcdTI1MDBcdTI1MDAgRXhwb3J0cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZXhwb3J0IHtcbiAgcG9wdWxhdGVGaW5hbGlzZVRhYixcbiAgZmluYWxpc2VBcHBsaWNhdGlvbixcbiAgc2hvd0hhcnZlc3RTZWN0aW9uLFxuICBfcmVuZGVyUmVhZGluZXNzQ2hlY2tsaXN0LFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL2ludGVydmlldy1wcmVwLmpzXG4gKiBJbnRlcnZpZXcgUHJlcGFyYXRpb24gcGhhc2UgXHUyMDE0IHBsYWNlaG9sZGVyIGNvbnRlbnQgd2l0aCBuYXZpZ2F0aW9uLlxuICpcbiAqIERlcGVuZGVuY2llcyAocmVzb2x2ZWQgdGhyb3VnaCBnbG9iYWxUaGlzIGF0IHJ1bnRpbWUpOlxuICogICBoYW5kbGVTdGVwQ2xpY2tcbiAqL1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5jb25zdCBsb2cgPSBnZXRMb2dnZXIoJ2ludGVydmlldy1wcmVwJyk7XG5cbmFzeW5jIGZ1bmN0aW9uIHBvcHVsYXRlSW50ZXJ2aWV3UHJlcFRhYigpIHtcbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIGlmICghY29udGVudCkgcmV0dXJuO1xuXG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgc3R5bGU9XCJtYXgtd2lkdGg6NzAwcHg7bWFyZ2luOjAgYXV0bztwYWRkaW5nOjQwcHggMjBweDt0ZXh0LWFsaWduOmNlbnRlcjtcIj5cbiAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6M2VtO21hcmdpbi1ib3R0b206MTZweDtcIj5cdUQ4M0NcdURGQTQ8L2Rpdj5cbiAgICAgIDxoMiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTJweDtcIj5JbnRlcnZpZXcgUHJlcGFyYXRpb248L2gyPlxuICAgICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO21hcmdpbi1ib3R0b206OHB4O1wiPlxuICAgICAgICBBSS1nZW5lcmF0ZWQgaW50ZXJ2aWV3IHByZXBhcmF0aW9uIGJhc2VkIG9uIHRoaXMgam9iIGFuZCB5b3VyIENWIGlzIGNvbWluZyBzb29uLlxuICAgICAgPC9wPlxuICAgICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO2ZvbnQtc2l6ZTowLjllbTtcIj5cbiAgICAgICAgVGhpcyB3aWxsIGluY2x1ZGUgbGlrZWx5IGludGVydmlldyBxdWVzdGlvbnMsIHN1Z2dlc3RlZCB0YWxraW5nIHBvaW50cywgYW5kXG4gICAgICAgIFNUQVItZm9ybWF0IGFuc3dlcnMgZHJhd24gZnJvbSB5b3VyIGV4cGVyaWVuY2UuXG4gICAgICA8L3A+XG4gICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDo0MHB4O1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLXByaW1hcnlcIiBvbmNsaWNrPVwiaGFuZGxlU3RlcENsaWNrKCd0aGFua195b3UnKVwiXG4gICAgICAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6MWVtO3BhZGRpbmc6MTBweCAyNHB4O1wiPlxuICAgICAgICAgIFByb2NlZWQgdG8gVGhhbmsgWW91IExldHRlciBcdTIxOTJcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xuXG4gIGxvZy5kZWJ1ZygnSW50ZXJ2aWV3IHByZXAgcGxhY2Vob2xkZXIgcmVuZGVyZWQnKTtcbn1cblxuZXhwb3J0IHsgcG9wdWxhdGVJbnRlcnZpZXdQcmVwVGFiIH07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi90aGFuay15b3UuanNcbiAqIFRoYW5rIFlvdSBMZXR0ZXIgcGhhc2UgXHUyMDE0IHBsYWNlaG9sZGVyIGNvbnRlbnQgd2l0aCBuYXZpZ2F0aW9uLlxuICpcbiAqIERlcGVuZGVuY2llcyAocmVzb2x2ZWQgdGhyb3VnaCBnbG9iYWxUaGlzIGF0IHJ1bnRpbWUpOlxuICogICBoYW5kbGVTdGVwQ2xpY2tcbiAqL1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5jb25zdCBsb2cgPSBnZXRMb2dnZXIoJ3RoYW5rLXlvdScpO1xuXG5hc3luYyBmdW5jdGlvbiBwb3B1bGF0ZVRoYW5rWW91VGFiKCkge1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgaWYgKCFjb250ZW50KSByZXR1cm47XG5cbiAgY29udGVudC5pbm5lckhUTUwgPSBgXG4gICAgPGRpdiBzdHlsZT1cIm1heC13aWR0aDo3MDBweDttYXJnaW46MCBhdXRvO3BhZGRpbmc6NDBweCAyMHB4O3RleHQtYWxpZ246Y2VudGVyO1wiPlxuICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTozZW07bWFyZ2luLWJvdHRvbToxNnB4O1wiPlx1RDgzRFx1REU0RjwvZGl2PlxuICAgICAgPGgyIHN0eWxlPVwibWFyZ2luLWJvdHRvbToxMnB4O1wiPlRoYW5rIFlvdSBMZXR0ZXI8L2gyPlxuICAgICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO21hcmdpbi1ib3R0b206OHB4O1wiPlxuICAgICAgICBBSS1nZW5lcmF0ZWQgdGhhbmsgeW91IGxldHRlciB0ZW1wbGF0ZXMgYXJlIGNvbWluZyBzb29uLlxuICAgICAgPC9wPlxuICAgICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO2ZvbnQtc2l6ZTowLjllbTtcIj5cbiAgICAgICAgQWZ0ZXIgeW91ciBpbnRlcnZpZXcsIHVzZSB0aGlzIHRvIGdlbmVyYXRlIGEgcGVyc29uYWxpc2VkIHRoYW5rIHlvdSBub3RlXG4gICAgICAgIHRoYXQgcmVpbmZvcmNlcyB5b3VyIGZpdCBmb3IgdGhlIHJvbGUuXG4gICAgICA8L3A+XG4gICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDo0MHB4O1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLXByaW1hcnlcIiBvbmNsaWNrPVwiaGFuZGxlU3RlcENsaWNrKCdoYXJ2ZXN0JylcIlxuICAgICAgICAgICAgICAgIHN0eWxlPVwiZm9udC1zaXplOjFlbTtwYWRkaW5nOjEwcHggMjRweDtcIj5cbiAgICAgICAgICBQcm9jZWVkIHRvIEhhcnZlc3QgSW1wcm92ZW1lbnRzIFx1MjE5MlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PmA7XG5cbiAgbG9nLmRlYnVnKCdUaGFuayB5b3UgbGV0dGVyIHBsYWNlaG9sZGVyIHJlbmRlcmVkJyk7XG59XG5cbmV4cG9ydCB7IHBvcHVsYXRlVGhhbmtZb3VUYWIgfTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogSGFydmVzdCB0YWI6IExMTS1zY29yZWQgZ3JvdXBlZCB2aWV3IG9mIG1hc3Rlci1DViBpbXByb3ZlbWVudCBjYW5kaWRhdGVzLlxuICpcbiAqIFB1YmxpYyBleHBvcnRzOlxuICogICBwb3B1bGF0ZUhhcnZlc3RUYWIoKSAgICAgICAgXHUyMDE0IGNhbGxlZCBieSByZXZpZXctdGFibGUtYmFzZS5qcyBvbiB0YWIgc3dpdGNoXG4gKiAgIGFwcGx5SGFydmVzdFNlbGVjdGlvbnMoKSAgICBcdTIwMTQgY2FsbGVkIGJ5IGlubGluZSBvbmNsaWNrIG9uIHRoZSBBcHBseSBidXR0b25cbiAqICAgcmVmcmVzaEhhcnZlc3RBbmFseXNpcygpICAgIFx1MjAxNCBjYWxsZWQgYnkgaW5saW5lIG9uY2xpY2sgb24gdGhlIFJlZnJlc2ggYnV0dG9uXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZXNjLCByZW5kZXJQcm9wb3NhbFJvdywgYXR0YWNoUHJvcG9zYWxSb3dMaXN0ZW5lcnMgfSBmcm9tICcuL3Byb3Bvc2FsLXJldmlldy5qcyc7XG5cbmNvbnN0IGxvZyA9IGdldExvZ2dlcignaGFydmVzdCcpO1xuXG4vLyBcdTI1MDBcdTI1MDAgRGlzcGxheSBjb25maWcgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8qKlxuICogTWVyZ2VkIGRpc3BsYXkgdHlwZSBjb25maWcuXG4gKiBuZXdfc2tpbGwgYW5kIHNraWxsX2dhcF9jb25maXJtZWQgYm90aCBtYXAgdG8gdGhlICdza2lsbCcgZGlzcGxheSBncm91cC5cbiAqL1xuY29uc3QgSEFSVkVTVF9UWVBFX0NPTkZJRyA9IHtcbiAgaW1wcm92ZWRfYnVsbGV0OiAgICAgeyBsYWJlbDogJ0V4cGVyaWVuY2UgQnVsbGV0cycsICAgICBpY29uOiAnXHUyNzBGXHVGRTBGJywgIHNvcnQ6IDEsIGRpc3BsYXlUeXBlOiAnaW1wcm92ZWRfYnVsbGV0JyAgICAgfSxcbiAgbmV3X3NraWxsOiAgICAgICAgICAgeyBsYWJlbDogJ1NraWxscycsICAgICAgICAgICAgICAgICBpY29uOiAnXHVEODNEXHVERUUwXHVGRTBGJywgIHNvcnQ6IDIsIGRpc3BsYXlUeXBlOiAnc2tpbGwnICAgICAgICAgICAgICAgfSxcbiAgc2tpbGxfZ2FwX2NvbmZpcm1lZDogeyBsYWJlbDogJ1NraWxscycsICAgICAgICAgICAgICAgICBpY29uOiAnXHVEODNEXHVERUUwXHVGRTBGJywgIHNvcnQ6IDIsIGRpc3BsYXlUeXBlOiAnc2tpbGwnICAgICAgICAgICAgICAgfSxcbiAgc3VtbWFyeV92YXJpYW50OiAgICAgeyBsYWJlbDogJ1Byb2Zlc3Npb25hbCBTdW1tYXJ5JywgICBpY29uOiAnXHVEODNEXHVEQ0REJywgIHNvcnQ6IDMsIGRpc3BsYXlUeXBlOiAnc3VtbWFyeV92YXJpYW50JyAgICAgfSxcbiAgc2tpbGxfdHlwZV91cGRhdGU6ICAgeyBsYWJlbDogJ1NraWxsIENsYXNzaWZpY2F0aW9uJywgICBpY29uOiAnXHVEODNDXHVERkY3XHVGRTBGJywgIHNvcnQ6IDQsIGRpc3BsYXlUeXBlOiAnc2tpbGxfdHlwZV91cGRhdGUnICB9LFxufTtcblxuY29uc3QgSEFSVkVTVF9UWVBFX0RFU0NSSVBUSU9OUyA9IHtcbiAgaW1wcm92ZWRfYnVsbGV0OiAgICAgICdSZXdyaXR0ZW4gYWNoaWV2ZW1lbnQgYnVsbGV0cyB5b3UgYXBwcm92ZWQgaW4gdGhlIFJld3JpdGVzIHN0ZXAuIFByb21vdGluZyB1cGRhdGVzIHRoZSBidWxsZXQgdGV4dCBpbiB5b3VyIG1hc3RlciBDVi4nLFxuICBza2lsbDogICAgICAgICAgICAgICAgJ1NraWxscyBhYnNlbnQgZnJvbSB5b3VyIG1hc3RlciBDViBcdTIwMTQgZWl0aGVyIGFkZGVkIChcdUQ4M0NcdUREOTUgQWRkZWQpIGR1cmluZyB0aGUgU2tpbGxzIFJldmlldyBvciBjb25maXJtZWQgd2hlbiBhc2tlZCAoXHUyNzA1IENvbmZpcm1lZCkuIFByb21vdGluZyBhZGRzIHRoZW0gdG8geW91ciBza2lsbHMgc2VjdGlvbi4nLFxuICBzdW1tYXJ5X3ZhcmlhbnQ6ICAgICAgJ0EgcmV3cml0dGVuIHZlcnNpb24gb2YgeW91ciBwcm9mZXNzaW9uYWwgc3VtbWFyeS4gUHJvbW90aW5nIHN0b3JlcyBpdCBhcyBhIG5hbWVkIHZhcmlhbnQgaW4geW91ciBtYXN0ZXIgQ1YuJyxcbiAgc2tpbGxfdHlwZV91cGRhdGU6ICAgICdIYXJkL3NvZnQgc2tpbGwgY2xhc3NpZmljYXRpb25zIHlvdSBjaGFuZ2VkIGR1cmluZyB0aGlzIHNlc3Npb24uIFByb21vdGluZyBwZXJzaXN0cyB0aGUgbmV3IHR5cGUgc28gaXQgaXMgbm90IHJlLWNsYXNzaWZpZWQgb24gZXZlcnkgYXBwbGljYXRpb24uJyxcbn07XG5cbmNvbnN0IEhBUlZFU1RfU09VUkNFX0JBREdFID0ge1xuICBuZXdfc2tpbGw6ICAgICAgICAgICAnPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC43NWVtO2JhY2tncm91bmQ6I2RiZWFmZTtjb2xvcjojMWQ0ZWQ4O2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6MXB4IDZweDttYXJnaW4tbGVmdDo2cHg7d2hpdGUtc3BhY2U6bm93cmFwO1wiPlx1RDgzQ1x1REQ5NSBBZGRlZDwvc3Bhbj4nLFxuICBza2lsbF9nYXBfY29uZmlybWVkOiAnPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC43NWVtO2JhY2tncm91bmQ6I2RjZmNlNztjb2xvcjojMTY2NTM0O2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6MXB4IDZweDttYXJnaW4tbGVmdDo2cHg7d2hpdGUtc3BhY2U6bm93cmFwO1wiPlx1MjcwNSBDb25maXJtZWQ8L3NwYW4+JyxcbiAgc2tpbGxfdHlwZV91cGRhdGU6ICAgJzxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjAuNzVlbTtiYWNrZ3JvdW5kOiNmZWY5YzM7Y29sb3I6Izg1NGQwZTtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjFweCA2cHg7bWFyZ2luLWxlZnQ6NnB4O3doaXRlLXNwYWNlOm5vd3JhcDtcIj5cdUQ4M0NcdURGRjdcdUZFMEYgUmVjbGFzc2lmaWVkPC9zcGFuPicsXG59O1xuXG5jb25zdCBSRUNfQ09ORklHID0ge1xuICBwcm9tb3RlOiB7IGxhYmVsOiAnUHJvbW90ZScsICAgICAgaWNvbjogJ1x1MkIwNlx1RkUwRicsICBjb2xvcjogJyMxNjY1MzQnLCBiZzogJyNmMGZkZjQnLCBzb3J0OiAwIH0sXG4gIHNraXA6ICAgIHsgbGFiZWw6ICdTa2lwJywgICAgICAgICBpY29uOiAnXHUyM0VEXHVGRTBGJywgIGNvbG9yOiAnIzlhMzQxMicsIGJnOiAnI2ZmZjdlZCcsIHNvcnQ6IDEgfSxcbiAgbnVsbDogICAgeyBsYWJlbDogJ1VuYW5hbHl6ZWQnLCAgIGljb246ICdcdTI3NTMnLCAgY29sb3I6ICcjNGI1NTYzJywgYmc6ICcjZjlmYWZiJywgc29ydDogMiB9LFxufTtcblxuY29uc3QgQ09ORl9DT05GSUcgPSB7XG4gIGhpZ2g6ICAgeyBsYWJlbDogJ0hpZ2gnLCAgIGNvbG9yOiAnIzE1ODAzZCcsIGJnOiAnI2YwZmRmNCcsIHNvcnQ6IDAgfSxcbiAgbWVkaXVtOiB7IGxhYmVsOiAnTWVkaXVtJywgY29sb3I6ICcjYjQ1MzA5JywgYmc6ICcjZmZmYmViJywgc29ydDogMSB9LFxuICBsb3c6ICAgIHsgbGFiZWw6ICdMb3cnLCAgICBjb2xvcjogJyNiOTFjMWMnLCBiZzogJyNmZWYyZjInLCBzb3J0OiAyIH0sXG4gIG51bGw6ICAgeyBsYWJlbDogJycsICAgICAgIGNvbG9yOiAnIzZiNzI4MCcsIGJnOiAnI2Y5ZmFmYicsIHNvcnQ6IDMgfSxcbn07XG5cbi8vIFx1MjUwMFx1MjUwMCBHcm91cGluZyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gZ2V0RGlzcGxheVR5cGUoY2FuZGlkYXRlKSB7XG4gIHJldHVybiBIQVJWRVNUX1RZUEVfQ09ORklHW2NhbmRpZGF0ZS50eXBlXT8uZGlzcGxheVR5cGUgPz8gY2FuZGlkYXRlLnR5cGU7XG59XG5cbi8qKlxuICogR3JvdXAgZW5yaWNoZWQgY2FuZGlkYXRlcyBpbnRvIGEgbmVzdGVkIHN0cnVjdHVyZTpcbiAqICAgeyBkaXNwbGF5VHlwZSBcdTIxOTIgeyByZWMgXHUyMTkyIHsgY29uZmlkZW5jZSBcdTIxOTIgW2NhbmRpZGF0ZSwgXHUyMDI2XSB9IH0gfVxuICovXG5mdW5jdGlvbiBncm91cENhbmRpZGF0ZXMoZW5yaWNoZWQpIHtcbiAgY29uc3QgZ3JvdXBzID0ge307XG4gIGZvciAoY29uc3QgYyBvZiBlbnJpY2hlZCkge1xuICAgIGNvbnN0IGR0ICAgPSBnZXREaXNwbGF5VHlwZShjKTtcbiAgICBjb25zdCByZWMgID0gYy5yZWNvbW1lbmRhdGlvbiA/PyAnbnVsbCc7XG4gICAgY29uc3QgY29uZiA9IGMuY29uZmlkZW5jZSAgICAgPz8gJ251bGwnO1xuICAgIGlmICghZ3JvdXBzW2R0XSkgICAgICAgICAgICAgICAgZ3JvdXBzW2R0XSAgICAgICA9IHt9O1xuICAgIGlmICghZ3JvdXBzW2R0XVtyZWNdKSAgICAgICAgICAgZ3JvdXBzW2R0XVtyZWNdICA9IHt9O1xuICAgIGlmICghZ3JvdXBzW2R0XVtyZWNdW2NvbmZdKSAgICAgZ3JvdXBzW2R0XVtyZWNdW2NvbmZdID0gW107XG4gICAgZ3JvdXBzW2R0XVtyZWNdW2NvbmZdLnB1c2goYyk7XG4gIH1cbiAgcmV0dXJuIGdyb3Vwcztcbn1cblxuZnVuY3Rpb24gc29ydGVkS2V5cyhvYmosIGNvbmZpZ01hcCkge1xuICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5zb3J0KChhLCBiKSA9PiB7XG4gICAgY29uc3Qgc2EgPSBjb25maWdNYXBbYV0/LnNvcnQgPz8gOTk7XG4gICAgY29uc3Qgc2IgPSBjb25maWdNYXBbYl0/LnNvcnQgPz8gOTk7XG4gICAgcmV0dXJuIHNhIC0gc2I7XG4gIH0pO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgUHJlLWNoZWNrIGxvZ2ljIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuLy8gQWxsIGhhcnZlc3QgaXRlbXMgc3RhcnQgdW5jaGVja2VkIFx1MjAxNCBtYXN0ZXIgQ1YgdXBkYXRlcyBhcmUgb3B0LWluIG9ubHkgKFVTLUExMSkuXG4vLyBHcm91cHMgd2l0aCBoaWdoL21lZGl1bSBjb25maWRlbmNlIHByb21vdGlvbnMgYXJlIGV4cGFuZGVkIHNvIGNhbmRpZGF0ZXMgYXJlXG4vLyBwcm9taW5lbnQsIGJ1dCBubyBjaGVja2JveCBpcyBwcmUtc2VsZWN0ZWQuXG5cbmZ1bmN0aW9uIHNob3VsZFByZUNoZWNrKF9jYW5kaWRhdGUpIHtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgQ29sbGFwc2UgZGVmYXVsdCBsb2dpYyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gdHlwZUdyb3VwRXhwYW5kZWQoZHRDYW5kaWRhdGVzKSB7XG4gIHJldHVybiBkdENhbmRpZGF0ZXMuc29tZShjID0+IGMucmVjb21tZW5kYXRpb24gPT09ICdwcm9tb3RlJyAmJlxuICAgIChjLmNvbmZpZGVuY2UgPT09ICdoaWdoJyB8fCBjLmNvbmZpZGVuY2UgPT09ICdtZWRpdW0nKSk7XG59XG5cbmZ1bmN0aW9uIHJlY0dyb3VwRXhwYW5kZWQocmVjLCBjb25mQ2FuZGlkYXRlcykge1xuICBpZiAocmVjICE9PSAncHJvbW90ZScpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGNvbmZDYW5kaWRhdGVzLnNvbWUoYyA9PiBjLmNvbmZpZGVuY2UgPT09ICdoaWdoJyB8fCBjLmNvbmZpZGVuY2UgPT09ICdtZWRpdW0nKTtcbn1cblxuZnVuY3Rpb24gY29uZlRpZXJFeHBhbmRlZChyZWMsIGNvbmYpIHtcbiAgcmV0dXJuIHJlYyA9PT0gJ3Byb21vdGUnICYmIChjb25mID09PSAnaGlnaCcgfHwgY29uZiA9PT0gJ21lZGl1bScpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgUmVuZGVyaW5nIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiByZW5kZXJDb25maWRlbmNlQmFkZ2UoY29uZikge1xuICBjb25zdCBjZmcgPSBDT05GX0NPTkZJR1tjb25mXSA/PyBDT05GX0NPTkZJR1snbnVsbCddO1xuICBpZiAoIWNmZy5sYWJlbCkgcmV0dXJuICcnO1xuICByZXR1cm4gYDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjAuN2VtO2ZvbnQtd2VpZ2h0OjYwMDtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjFweCA2cHg7YmFja2dyb3VuZDoke2NmZy5iZ307Y29sb3I6JHtjZmcuY29sb3J9O2JvcmRlcjoxcHggc29saWQgJHtjZmcuY29sb3J9MzA7d2hpdGUtc3BhY2U6bm93cmFwO1wiPiR7ZXNjKGNmZy5sYWJlbCl9PC9zcGFuPmA7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclJlY29tbWVuZGF0aW9uQmFkZ2UocmVjKSB7XG4gIGNvbnN0IGNmZyA9IFJFQ19DT05GSUdbcmVjXSA/PyBSRUNfQ09ORklHWydudWxsJ107XG4gIHJldHVybiBgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC43NWVtO2ZvbnQtd2VpZ2h0OjYwMDtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjJweCA4cHg7YmFja2dyb3VuZDoke2NmZy5iZ307Y29sb3I6JHtjZmcuY29sb3J9O3doaXRlLXNwYWNlOm5vd3JhcDtcIj4ke2NmZy5pY29ufSAke2VzYyhjZmcubGFiZWwpfTwvc3Bhbj5gO1xufVxuXG5mdW5jdGlvbiByZW5kZXJDYW5kaWRhdGVSb3coYywgaWR4KSB7XG4gIGNvbnN0IHR5cGVDZmcgICA9IEhBUlZFU1RfVFlQRV9DT05GSUdbYy50eXBlXSA/PyB7fTtcbiAgY29uc3QgcmVjQmFkZ2UgID0gYy5yZWNvbW1lbmRhdGlvbiA/IHJlbmRlclJlY29tbWVuZGF0aW9uQmFkZ2UoYy5yZWNvbW1lbmRhdGlvbikgOiAnJztcbiAgY29uc3QgY29uZkJhZGdlID0gYy5jb25maWRlbmNlID8gcmVuZGVyQ29uZmlkZW5jZUJhZGdlKGMuY29uZmlkZW5jZSkgOiAnJztcbiAgY29uc3QgaGFzUmVhc29uaW5nID0gYy5hbmFseXNpc0F2YWlsYWJsZSAmJiBjLnJlYXNvbmluZztcblxuICByZXR1cm4gcmVuZGVyUHJvcG9zYWxSb3coe1xuICAgIGlkOiAgICAgICAgICAgICAgYy5pZCxcbiAgICB0eXBlTGFiZWw6ICAgICAgIHR5cGVDZmcubGFiZWwgPz8gYy50eXBlLFxuICAgIHNvdXJjZUJhZGdlSHRtbDogSEFSVkVTVF9TT1VSQ0VfQkFER0VbYy50eXBlXSA/PyAnJyxcbiAgICBsYWJlbDogICAgICAgICAgIGMubGFiZWwsXG4gICAgb3JpZ2luYWw6ICAgICAgICBjLm9yaWdpbmFsLFxuICAgIHByb3Bvc2VkOiAgICAgICAgYy5wcm9wb3NlZCxcbiAgICBkZXRhaWxUZXh0OiAgICAgIGhhc1JlYXNvbmluZyA/IGMucmVhc29uaW5nIDogbnVsbCxcbiAgICBiYWRnZXNIdG1sOiAgICAgICBgJHtyZWNCYWRnZX0ke2NvbmZCYWRnZX1gLFxuICAgIGNoZWNrZWQ6ICAgICAgICAgc2hvdWxkUHJlQ2hlY2soYyksXG4gIH0sIHtcbiAgICBpZFByZWZpeDogICAgICAgICAnaGFydmVzdCcsXG4gICAgY2hlY2tib3hEYXRhQXR0cjogJ2hhcnZlc3QtaWQnLFxuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVuZGVyQ29uZmlkZW5jZVRpZXIocmVjLCBjb25mLCBjYW5kaWRhdGVzKSB7XG4gIGNvbnN0IGNmZyAgICAgID0gQ09ORl9DT05GSUdbY29uZl0gPz8gQ09ORl9DT05GSUdbJ251bGwnXTtcbiAgY29uc3QgZXhwYW5kZWQgPSBjb25mVGllckV4cGFuZGVkKHJlYywgY29uZik7XG4gIGNvbnN0IHRpZXJJZCAgID0gYGhhcnZlc3QtY29uZi0ke3JlY30tJHtjb25mfS0ke0RhdGUubm93KCl9YDtcbiAgY29uc3QgY291bnQgICAgPSBjYW5kaWRhdGVzLmxlbmd0aDtcblxuICBpZiAoIWNmZy5sYWJlbCkge1xuICAgIC8vIE5vLWFuYWx5c2lzIHRpZXIgXHUyMDE0IHJlbmRlciByb3dzIGRpcmVjdGx5IHdpdGhvdXQgYSBzdWItaGVhZGVyXG4gICAgcmV0dXJuIGNhbmRpZGF0ZXMubWFwKChjLCBpKSA9PiByZW5kZXJDYW5kaWRhdGVSb3coYywgaSkpLmpvaW4oJycpO1xuICB9XG5cbiAgY29uc3QgdG9nZ2xlSWNvbiA9IGV4cGFuZGVkID8gJ1x1MjVCRScgOiAnXHUyNUI4JztcbiAgY29uc3QgaGVhZGVySHRtbCA9IGBcbiAgICA8dHIgY2xhc3M9XCJoYXJ2ZXN0LWNvbmYtaGVhZGVyXCIgc3R5bGU9XCJjdXJzb3I6cG9pbnRlcjtiYWNrZ3JvdW5kOiNmYWZhZmE7XCIgb25jbGljaz1cInRvZ2dsZUhhcnZlc3RTZWN0aW9uKCcke3RpZXJJZH0nKVwiPlxuICAgICAgPHRkIGNvbHNwYW49XCIyXCIgc3R5bGU9XCJwYWRkaW5nOjZweCAxMnB4IDZweCAzNnB4O2ZvbnQtc2l6ZTowLjhlbTtjb2xvcjoke2NmZy5jb2xvcn07Zm9udC13ZWlnaHQ6NjAwO1wiPlxuICAgICAgICA8c3BhbiBpZD1cIiR7dGllcklkfS1pY29uXCI+JHt0b2dnbGVJY29ufTwvc3Bhbj5cbiAgICAgICAgJHtlc2MoY2ZnLmxhYmVsKX0gY29uZmlkZW5jZVxuICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07Zm9udC13ZWlnaHQ6NDAwO2NvbG9yOiM5Y2EzYWY7bWFyZ2luLWxlZnQ6NnB4O1wiPigke2NvdW50fSk8L3NwYW4+XG4gICAgICA8L3RkPlxuICAgIDwvdHI+XG4gICAgPHRib2R5IGlkPVwiJHt0aWVySWR9XCIgc3R5bGU9XCIke2V4cGFuZGVkID8gJycgOiAnZGlzcGxheTpub25lOyd9XCI+XG4gICAgICAke2NhbmRpZGF0ZXMubWFwKChjLCBpKSA9PiByZW5kZXJDYW5kaWRhdGVSb3coYywgaSkpLmpvaW4oJycpfVxuICAgIDwvdGJvZHk+YDtcbiAgcmV0dXJuIGhlYWRlckh0bWw7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclJlY0dyb3VwKGR0LCByZWMsIGNvbmZNYXApIHtcbiAgY29uc3QgY2ZnID0gUkVDX0NPTkZJR1tyZWNdID8/IFJFQ19DT05GSUdbJ251bGwnXTtcbiAgY29uc3QgYWxsQ2FuZHMgPSBPYmplY3QudmFsdWVzKGNvbmZNYXApLmZsYXQoKTtcbiAgY29uc3QgZXhwYW5kZWQgPSByZWNHcm91cEV4cGFuZGVkKHJlYywgYWxsQ2FuZHMpO1xuICBjb25zdCBncm91cElkICA9IGBoYXJ2ZXN0LXJlYy0ke2R0fS0ke3JlY30tJHtEYXRlLm5vdygpfWA7XG4gIGNvbnN0IGNvdW50ICAgID0gYWxsQ2FuZHMubGVuZ3RoO1xuXG4gIGNvbnN0IGNvbmZzICAgID0gc29ydGVkS2V5cyhjb25mTWFwLCBDT05GX0NPTkZJRyk7XG4gIGNvbnN0IGhhc011bHRpcGxlQ29uZnMgPSBjb25mcy5sZW5ndGggPiAxIHx8IChjb25mcy5sZW5ndGggPT09IDEgJiYgQ09ORl9DT05GSUdbY29uZnNbMF1dPy5sYWJlbCk7XG5cbiAgY29uc3QgaW5uZXJSb3dzID0gY29uZnMubWFwKGNvbmYgPT4gcmVuZGVyQ29uZmlkZW5jZVRpZXIocmVjLCBjb25mLCBjb25mTWFwW2NvbmZdKSkuam9pbignJyk7XG5cbiAgY29uc3QgdG9nZ2xlSWNvbiA9IGV4cGFuZGVkID8gJ1x1MjVCRScgOiAnXHUyNUI4JztcbiAgcmV0dXJuIGBcbiAgICA8dHIgY2xhc3M9XCJoYXJ2ZXN0LXJlYy1oZWFkZXJcIiBzdHlsZT1cImN1cnNvcjpwb2ludGVyO2JhY2tncm91bmQ6JHtjZmcuYmd9O1wiIG9uY2xpY2s9XCJ0b2dnbGVIYXJ2ZXN0U2VjdGlvbignJHtncm91cElkfScpXCI+XG4gICAgICA8dGQgY29sc3Bhbj1cIjJcIiBzdHlsZT1cInBhZGRpbmc6OHB4IDEycHggOHB4IDI0cHg7Zm9udC1zaXplOjAuODVlbTtjb2xvcjoke2NmZy5jb2xvcn07Zm9udC13ZWlnaHQ6NzAwO1wiPlxuICAgICAgICA8c3BhbiBpZD1cIiR7Z3JvdXBJZH0taWNvblwiPiR7dG9nZ2xlSWNvbn08L3NwYW4+XG4gICAgICAgICR7Y2ZnLmljb259ICR7ZXNjKGNmZy5sYWJlbCl9XG4gICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtmb250LXdlaWdodDo0MDA7Y29sb3I6IzljYTNhZjttYXJnaW4tbGVmdDo2cHg7XCI+KCR7Y291bnR9KTwvc3Bhbj5cbiAgICAgIDwvdGQ+XG4gICAgPC90cj5cbiAgICA8dGJvZHkgaWQ9XCIke2dyb3VwSWR9XCIgc3R5bGU9XCIke2V4cGFuZGVkID8gJycgOiAnZGlzcGxheTpub25lOyd9XCI+XG4gICAgICAke2hhc011bHRpcGxlQ29uZnMgPyBpbm5lclJvd3MgOiBhbGxDYW5kcy5tYXAoKGMsIGkpID0+IHJlbmRlckNhbmRpZGF0ZVJvdyhjLCBpKSkuam9pbignJyl9XG4gICAgPC90Ym9keT5gO1xufVxuXG5mdW5jdGlvbiByZW5kZXJUeXBlR3JvdXAoZHQsIHJlY01hcCwgYWxsRHRDYW5kaWRhdGVzKSB7XG4gIGNvbnN0IGNmZyAgICAgID0gSEFSVkVTVF9UWVBFX0NPTkZJR1tkdF0gPz8geyBsYWJlbDogZHQsIGljb246ICdcdUQ4M0RcdURDQ0InLCBzb3J0OiA5OSB9O1xuICBjb25zdCBleHBhbmRlZCA9IHR5cGVHcm91cEV4cGFuZGVkKGFsbER0Q2FuZGlkYXRlcyk7XG4gIGNvbnN0IGdyb3VwSWQgID0gYGhhcnZlc3QtdHlwZS0ke2R0fS0ke0RhdGUubm93KCl9YDtcbiAgY29uc3QgY291bnQgICAgPSBhbGxEdENhbmRpZGF0ZXMubGVuZ3RoO1xuICBjb25zdCBkZXNjICAgICA9IEhBUlZFU1RfVFlQRV9ERVNDUklQVElPTlNbZHRdID8/ICcnO1xuXG4gIGNvbnN0IHJlY3MgICAgICAgID0gc29ydGVkS2V5cyhyZWNNYXAsIFJFQ19DT05GSUcpO1xuICBjb25zdCBoYXNNdWx0aXBsZVJlY3MgPSByZWNzLmxlbmd0aCA+IDE7XG5cbiAgY29uc3QgaW5uZXJIdG1sID0gcmVjcy5tYXAocmVjID0+IHtcbiAgICBpZiAoIWhhc011bHRpcGxlUmVjcykge1xuICAgICAgLy8gU3VwcHJlc3MgdGhlIHJlYy1sZXZlbCBoZWFkZXI7IHJlbmRlciBjb25maWRlbmNlIHRpZXJzIGRpcmVjdGx5XG4gICAgICBjb25zdCBjb25mTWFwICA9IHJlY01hcFtyZWNdO1xuICAgICAgY29uc3QgY29uZnMgICAgPSBzb3J0ZWRLZXlzKGNvbmZNYXAsIENPTkZfQ09ORklHKTtcbiAgICAgIGNvbnN0IGhhc0NvbmZzID0gY29uZnMubGVuZ3RoID4gMSB8fCAoY29uZnMubGVuZ3RoID09PSAxICYmIENPTkZfQ09ORklHW2NvbmZzWzBdXT8ubGFiZWwpO1xuICAgICAgcmV0dXJuIGhhc0NvbmZzXG4gICAgICAgID8gY29uZnMubWFwKGNvbmYgPT4gcmVuZGVyQ29uZmlkZW5jZVRpZXIocmVjLCBjb25mLCBjb25mTWFwW2NvbmZdKSkuam9pbignJylcbiAgICAgICAgOiBjb25mTWFwW2NvbmZzWzBdXS5tYXAoKGMsIGkpID0+IHJlbmRlckNhbmRpZGF0ZVJvdyhjLCBpKSkuam9pbignJyk7XG4gICAgfVxuICAgIHJldHVybiByZW5kZXJSZWNHcm91cChkdCwgcmVjLCByZWNNYXBbcmVjXSk7XG4gIH0pLmpvaW4oJycpO1xuXG4gIGNvbnN0IHRvZ2dsZUljb24gPSBleHBhbmRlZCA/ICdcdTI1QkUnIDogJ1x1MjVCOCc7XG4gIHJldHVybiBgXG4gICAgPGRpdiBjbGFzcz1cImhhcnZlc3QtdHlwZS1zZWN0aW9uXCIgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjI0cHg7Ym9yZGVyOjFweCBzb2xpZCAjZTJlOGYwO2JvcmRlci1yYWRpdXM6OHB4O292ZXJmbG93OmhpZGRlbjtcIj5cbiAgICAgIDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmOGZhZmM7cGFkZGluZzoxMnB4IDE2cHg7Y3Vyc29yOnBvaW50ZXI7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTBweDtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZTJlOGYwO1wiXG4gICAgICAgICAgIG9uY2xpY2s9XCJ0b2dnbGVIYXJ2ZXN0U2VjdGlvbignJHtncm91cElkfScpXCI+XG4gICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjEuMjVlbTtcIj4ke2NmZy5pY29ufTwvc3Bhbj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImZsZXg6MTtcIj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6NzAwO2NvbG9yOiMwZjE3MmE7Zm9udC1zaXplOjAuOTVlbTtcIj5cbiAgICAgICAgICAgIDxzcGFuIGlkPVwiJHtncm91cElkfS1pY29uXCI+JHt0b2dnbGVJY29ufTwvc3Bhbj5cbiAgICAgICAgICAgICR7ZXNjKGNmZy5sYWJlbCl9XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjgyZW07Zm9udC13ZWlnaHQ6NDAwO2NvbG9yOiM5NGEzYjg7bWFyZ2luLWxlZnQ6NnB4O1wiPigke2NvdW50fSk8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgJHtkZXNjID8gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC43OGVtO2NvbG9yOiM2NDc0OGI7bWFyZ2luLXRvcDoycHg7XCI+JHtlc2MoZGVzYyl9PC9kaXY+YCA6ICcnfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBpZD1cIiR7Z3JvdXBJZH1cIiBzdHlsZT1cIiR7ZXhwYW5kZWQgPyAnJyA6ICdkaXNwbGF5Om5vbmU7J31cIj5cbiAgICAgICAgPHRhYmxlIHN0eWxlPVwid2lkdGg6MTAwJTtib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7XCI+XG4gICAgICAgICAgJHtpbm5lckh0bWx9XG4gICAgICAgIDwvdGFibGU+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xufVxuXG5mdW5jdGlvbiByZW5kZXJIYXJ2ZXN0VGFiSHRtbChlbnJpY2hlZCwgYW5hbHlzaXNPaywgYW5hbHlzaXNFcnJvcikge1xuICBjb25zdCBncm91cHMgPSBncm91cENhbmRpZGF0ZXMoZW5yaWNoZWQpO1xuICBjb25zdCBkdEtleXMgPSBzb3J0ZWRLZXlzKGdyb3VwcywgT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKEhBUlZFU1RfVFlQRV9DT05GSUcpLm1hcCgoW2ssIHZdKSA9PiBbdi5kaXNwbGF5VHlwZSwgdl0pXG4gICkpO1xuXG4gIGNvbnN0IHRvdGFsQ291bnQgPSBlbnJpY2hlZC5sZW5ndGg7XG5cbiAgY29uc3QgYW5hbHlzaXNXYXJuaW5nID0gIWFuYWx5c2lzT2tcbiAgICA/IGA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZmZmYmViO2JvcmRlcjoxcHggc29saWQgI2ZjZDM0ZDtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjEwcHggMTRweDttYXJnaW4tYm90dG9tOjE2cHg7Zm9udC1zaXplOjAuODdlbTtjb2xvcjojOTI0MDBlO1wiPlxuICAgICAgICBcdTI2QTBcdUZFMEYgTExNIGFuYWx5c2lzIHVuYXZhaWxhYmxlJHthbmFseXNpc0Vycm9yID8gYDogJHtlc2MoYW5hbHlzaXNFcnJvcil9YCA6ICcnfS4gQ2hlY2tib3hlcyBhcmUgdW5jaGVja2VkIFx1MjAxNCByZXZpZXcgbWFudWFsbHkuXG4gICAgICAgIDxidXR0b24gb25jbGljaz1cInJlZnJlc2hIYXJ2ZXN0QW5hbHlzaXMoKVwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6MTBweDtmb250LXNpemU6MC44NWVtO3BhZGRpbmc6MnB4IDEwcHg7Ym9yZGVyOjFweCBzb2xpZCAjZDk3NzA2O2JvcmRlci1yYWRpdXM6NHB4O2JhY2tncm91bmQ6d2hpdGU7Y29sb3I6I2I0NTMwOTtjdXJzb3I6cG9pbnRlcjtcIj5SZXRyeSBhbmFseXNpczwvYnV0dG9uPlxuICAgICAgPC9kaXY+YFxuICAgIDogJyc7XG5cbiAgY29uc3Qgc2VjdGlvbnNIdG1sID0gZHRLZXlzLm1hcChkdCA9PiB7XG4gICAgY29uc3QgcmVjTWFwICAgICAgPSBncm91cHNbZHRdO1xuICAgIGNvbnN0IGFsbER0Q2FuZHMgID0gT2JqZWN0LnZhbHVlcyhyZWNNYXApLmZsYXRNYXAoY29uZk1hcCA9PiBPYmplY3QudmFsdWVzKGNvbmZNYXApLmZsYXQoKSk7XG4gICAgcmV0dXJuIHJlbmRlclR5cGVHcm91cChkdCwgcmVjTWFwLCBhbGxEdENhbmRzKTtcbiAgfSkuam9pbignJyk7XG5cbiAgcmV0dXJuIGBcbiAgICA8aDE+XHVEODNDXHVERjNFIEhhcnZlc3QgSW1wcm92ZW1lbnRzPC9oMT5cbiAgICA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7bWFyZ2luLWJvdHRvbTo4cHg7XCI+XG4gICAgICBSZXZpZXcgTExNLXNjb3JlZCBjYW5kaWRhdGVzIGZvciBwcm9tb3Rpb24gdG8geW91ciBtYXN0ZXIgQ1YuXG4gICAgICBDaGVjayB0aGUgaXRlbXMgeW91IHdhbnQgdG8gYXBwbHkgKCR7dG90YWxDb3VudH0gY2FuZGlkYXRlJHt0b3RhbENvdW50ID09PSAxID8gJycgOiAncyd9IGZvdW5kKS5cbiAgICA8L3A+XG4gICAgJHthbmFseXNpc1dhcm5pbmd9XG4gICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6MTBweDthbGlnbi1pdGVtczpjZW50ZXI7bWFyZ2luLWJvdHRvbToyMHB4O2ZsZXgtd3JhcDp3cmFwO1wiPlxuICAgICAgPGJ1dHRvbiBpZD1cImhhcnZlc3QtYXBwbHktYnRuXCIgb25jbGljaz1cImFwcGx5SGFydmVzdFNlbGVjdGlvbnMoKVwiXG4gICAgICAgIHN0eWxlPVwicGFkZGluZzoxMHB4IDI0cHg7Zm9udC1zaXplOjFlbTtmb250LXdlaWdodDo2MDA7Y3Vyc29yOnBvaW50ZXI7YmFja2dyb3VuZDojMTZhMzRhO2NvbG9yOndoaXRlO2JvcmRlcjpub25lO2JvcmRlci1yYWRpdXM6NnB4O1wiPlxuICAgICAgICBcdTI3MDUgQXBwbHkgU2VsZWN0ZWQgdG8gTWFzdGVyIENWXG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gb25jbGljaz1cInJlZnJlc2hIYXJ2ZXN0QW5hbHlzaXMoKVwiXG4gICAgICAgIHN0eWxlPVwicGFkZGluZzoxMHB4IDE4cHg7Zm9udC1zaXplOjAuOWVtO2N1cnNvcjpwb2ludGVyO2JhY2tncm91bmQ6d2hpdGU7Y29sb3I6IzQ3NTU2OTtib3JkZXI6MXB4IHNvbGlkICNjYmQ1ZTE7Ym9yZGVyLXJhZGl1czo2cHg7XCI+XG4gICAgICAgIFx1RDgzRFx1REQwNCBSZS1hbmFseXNlXG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtjb2xvcjojOTRhM2I4O1wiPlxuICAgICAgICAke3RvdGFsQ291bnR9IGNhbmRpZGF0ZSR7dG90YWxDb3VudCAhPT0gMSA/ICdzJyA6ICcnfVxuICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuICAgICR7c2VjdGlvbnNIdG1sfVxuICAgIDxkaXYgaWQ9XCJoYXJ2ZXN0LXJlc3VsdFwiIHN0eWxlPVwibWFyZ2luLXRvcDoyMHB4O1wiPjwvZGl2PmA7XG59XG5cbmZ1bmN0aW9uIHJlbmRlckVtcHR5U3RhdGVIdG1sKCkge1xuICByZXR1cm4gYFxuICAgIDxoMT5cdUQ4M0NcdURGM0UgSGFydmVzdCBJbXByb3ZlbWVudHM8L2gxPlxuICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtcIj5ObyBoYXJ2ZXN0IGNhbmRpZGF0ZXMgZm91bmQgZm9yIHRoaXMgc2Vzc2lvbi48L3A+XG4gICAgPHAgc3R5bGU9XCJjb2xvcjojOTRhM2I4O2ZvbnQtc2l6ZTowLjllbTtcIj5cbiAgICAgIENhbmRpZGF0ZXMgYXJlIGdlbmVyYXRlZCBmcm9tIGFwcHJvdmVkIHJld3JpdGVzLCBza2lsbHMgYWRkZWQgZHVyaW5nIHJldmlldyxcbiAgICAgIGFuZCBzdW1tYXJ5IHZhcmlhbnRzIGNyZWF0ZWQgZHVyaW5nIHRoZSBzZXNzaW9uLlxuICAgIDwvcD5gO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgQVBJIGNhbGxzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaENhbmRpZGF0ZXMoKSB7XG4gIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9oYXJ2ZXN0L2NhbmRpZGF0ZXMnKTtcbiAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gIHJldHVybiBkYXRhO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaEFuYWx5c2lzKGZvcmNlUmVmcmVzaCA9IGZhbHNlKSB7XG4gIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9oYXJ2ZXN0L2FuYWx5emUnLCB7XG4gICAgbWV0aG9kOiAgJ1BPU1QnLFxuICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgIGJvZHk6ICAgIEpTT04uc3RyaW5naWZ5KHsgZm9yY2VfcmVmcmVzaDogZm9yY2VSZWZyZXNoIH0pLFxuICB9KTtcbiAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gIHJldHVybiBkYXRhO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgVG9nZ2xlIGhlbHBlcnMgKGNhbGxlZCBieSBpbmxpbmUgb25jbGljaykgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIHRvZ2dsZUhhcnZlc3RTZWN0aW9uKGlkKSB7XG4gIGNvbnN0IGVsICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gIGNvbnN0IGljb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtpZH0taWNvbmApO1xuICBpZiAoIWVsKSByZXR1cm47XG4gIGNvbnN0IGhpZGRlbiA9IGVsLnN0eWxlLmRpc3BsYXkgPT09ICdub25lJztcbiAgZWwuc3R5bGUuZGlzcGxheSA9IGhpZGRlbiA/ICcnIDogJ25vbmUnO1xuICBpZiAoaWNvbikgaWNvbi50ZXh0Q29udGVudCA9IGhpZGRlbiA/ICdcdTI1QkUnIDogJ1x1MjVCOCc7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBNYWluIGVudHJ5IHBvaW50cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gcG9wdWxhdGVIYXJ2ZXN0VGFiKCkge1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgaWYgKCFjb250ZW50KSByZXR1cm47XG5cbiAgY29udGVudC5pbm5lckhUTUwgPSBgXG4gICAgPGgxPlx1RDgzQ1x1REYzRSBIYXJ2ZXN0IEltcHJvdmVtZW50czwvaDE+XG4gICAgPGRpdiBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO3BhZGRpbmc6NDBweDtcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJsb2FkaW5nLXNwaW5uZXJcIj48L2Rpdj5cbiAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDttYXJnaW4tdG9wOjEycHg7XCI+TG9hZGluZyBjYW5kaWRhdGVzIGFuZCBydW5uaW5nIExMTSBhbmFseXNpc1x1MjAyNjwvcD5cbiAgICA8L2Rpdj5gO1xuXG4gIGxldCBjYW5kaWRhdGVzID0gW107XG4gIGxldCBhbmFseXNpc09rID0gZmFsc2U7XG4gIGxldCBhbmFseXNlcyAgID0gW107XG4gIGxldCBhbmFseXNpc0Vycm9yID0gbnVsbDtcblxuICB0cnkge1xuICAgIGNvbnN0IGNhbmREYXRhID0gYXdhaXQgZmV0Y2hDYW5kaWRhdGVzKCk7XG4gICAgaWYgKCFjYW5kRGF0YS5vaykge1xuICAgICAgY29udGVudC5pbm5lckhUTUwgPSBgPGgxPlx1RDgzQ1x1REYzRSBIYXJ2ZXN0IEltcHJvdmVtZW50czwvaDE+PHAgY2xhc3M9XCJlcnJvci1tZXNzYWdlXCI+RmFpbGVkIHRvIGxvYWQgY2FuZGlkYXRlczogJHtlc2MoY2FuZERhdGEuZXJyb3IgfHwgJ1Vua25vd24gZXJyb3InKX08L3A+YDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY2FuZGlkYXRlcyA9IGNhbmREYXRhLmNhbmRpZGF0ZXMgfHwgW107XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy5lcnJvcigncG9wdWxhdGVIYXJ2ZXN0VGFiOiBjYW5kaWRhdGVzIGZldGNoIGZhaWxlZCcsIGVycik7XG4gICAgY29udGVudC5pbm5lckhUTUwgPSBgPGgxPlx1RDgzQ1x1REYzRSBIYXJ2ZXN0IEltcHJvdmVtZW50czwvaDE+PHAgY2xhc3M9XCJlcnJvci1tZXNzYWdlXCI+TmV0d29yayBlcnJvciBsb2FkaW5nIGNhbmRpZGF0ZXMuPC9wPmA7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGNhbmRpZGF0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgY29udGVudC5pbm5lckhUTUwgPSByZW5kZXJFbXB0eVN0YXRlSHRtbCgpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgYW5hbHlzaXNEYXRhID0gYXdhaXQgZmV0Y2hBbmFseXNpcyhmYWxzZSk7XG4gICAgaWYgKGFuYWx5c2lzRGF0YS5vaykge1xuICAgICAgYW5hbHlzaXNPayA9IHRydWU7XG4gICAgICBhbmFseXNlcyAgID0gYW5hbHlzaXNEYXRhLmFuYWx5c2VzIHx8IFtdO1xuICAgIH0gZWxzZSB7XG4gICAgICBhbmFseXNpc0Vycm9yID0gYW5hbHlzaXNEYXRhLmVycm9yIHx8ICdBbmFseXNpcyBmYWlsZWQnO1xuICAgICAgbG9nLndhcm4oJ3BvcHVsYXRlSGFydmVzdFRhYjogYW5hbHlzaXMgbm90IG9rJywgYW5hbHlzaXNFcnJvcik7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cuZXJyb3IoJ3BvcHVsYXRlSGFydmVzdFRhYjogYW5hbHlzaXMgZmV0Y2ggZmFpbGVkJywgZXJyKTtcbiAgICBhbmFseXNpc0Vycm9yID0gZXJyLm1lc3NhZ2U7XG4gIH1cblxuICBjb25zdCBhbmFseXNlc0J5SWQgPSBPYmplY3QuZnJvbUVudHJpZXMoYW5hbHlzZXMubWFwKGEgPT4gW2EuaWQsIGFdKSk7XG4gIGNvbnN0IGVucmljaGVkID0gY2FuZGlkYXRlcy5tYXAoYyA9PiAoe1xuICAgIC4uLmMsXG4gICAgcmVjb21tZW5kYXRpb246ICAgIGFuYWx5c2VzQnlJZFtjLmlkXT8ucmVjb21tZW5kYXRpb24gPz8gbnVsbCxcbiAgICBjb25maWRlbmNlOiAgICAgICAgYW5hbHlzZXNCeUlkW2MuaWRdPy5jb25maWRlbmNlICAgICA/PyBudWxsLFxuICAgIHJlYXNvbmluZzogICAgICAgICBhbmFseXNlc0J5SWRbYy5pZF0/LnJlYXNvbmluZyAgICAgID8/IG51bGwsXG4gICAgYW5hbHlzaXNBdmFpbGFibGU6IGFuYWx5c2lzT2ssXG4gIH0pKTtcblxuICBjb250ZW50LmlubmVySFRNTCA9IHJlbmRlckhhcnZlc3RUYWJIdG1sKGVucmljaGVkLCBhbmFseXNpc09rLCBhbmFseXNpc0Vycm9yKTtcbiAgYXR0YWNoUHJvcG9zYWxSb3dMaXN0ZW5lcnMoY29udGVudCwgJ2hhcnZlc3QnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVmcmVzaEhhcnZlc3RBbmFseXNpcygpIHtcbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIGlmICghY29udGVudCkgcmV0dXJuO1xuXG4gIC8vIFNob3cgc3Bpbm5lciBpbmxpbmUgd2hpbGUgcmUtZmV0Y2hpbmdcbiAgY29uc3QgYXBwbHlCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGFydmVzdC1hcHBseS1idG4nKTtcbiAgaWYgKGFwcGx5QnRuKSBhcHBseUJ0bi5kaXNhYmxlZCA9IHRydWU7XG5cbiAgLy8gUmUtcnVuIGZ1bGwgcG9wdWxhdGUgd2l0aCBmb3JjZSByZWZyZXNoXG4gIHRyeSB7XG4gICAgY29uc3QgY2FuZERhdGEgPSBhd2FpdCBmZXRjaENhbmRpZGF0ZXMoKTtcbiAgICBjb25zdCBjYW5kaWRhdGVzID0gKGNhbmREYXRhLm9rICYmIGNhbmREYXRhLmNhbmRpZGF0ZXMpID8gY2FuZERhdGEuY2FuZGlkYXRlcyA6IFtdO1xuXG4gICAgaWYgKGNhbmRpZGF0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb250ZW50LmlubmVySFRNTCA9IHJlbmRlckVtcHR5U3RhdGVIdG1sKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGFuYWx5c2lzT2sgPSBmYWxzZTtcbiAgICBsZXQgYW5hbHlzZXMgICA9IFtdO1xuICAgIGxldCBhbmFseXNpc0Vycm9yID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYW5hbHlzaXNEYXRhID0gYXdhaXQgZmV0Y2hBbmFseXNpcyh0cnVlKTtcbiAgICAgIGlmIChhbmFseXNpc0RhdGEub2spIHtcbiAgICAgICAgYW5hbHlzaXNPayA9IHRydWU7XG4gICAgICAgIGFuYWx5c2VzICAgPSBhbmFseXNpc0RhdGEuYW5hbHlzZXMgfHwgW107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhbmFseXNpc0Vycm9yID0gYW5hbHlzaXNEYXRhLmVycm9yIHx8ICdBbmFseXNpcyBmYWlsZWQnO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgYW5hbHlzaXNFcnJvciA9IGVyci5tZXNzYWdlO1xuICAgIH1cblxuICAgIGNvbnN0IGFuYWx5c2VzQnlJZCA9IE9iamVjdC5mcm9tRW50cmllcyhhbmFseXNlcy5tYXAoYSA9PiBbYS5pZCwgYV0pKTtcbiAgICBjb25zdCBlbnJpY2hlZCA9IGNhbmRpZGF0ZXMubWFwKGMgPT4gKHtcbiAgICAgIC4uLmMsXG4gICAgICByZWNvbW1lbmRhdGlvbjogICAgYW5hbHlzZXNCeUlkW2MuaWRdPy5yZWNvbW1lbmRhdGlvbiA/PyBudWxsLFxuICAgICAgY29uZmlkZW5jZTogICAgICAgIGFuYWx5c2VzQnlJZFtjLmlkXT8uY29uZmlkZW5jZSAgICAgPz8gbnVsbCxcbiAgICAgIHJlYXNvbmluZzogICAgICAgICBhbmFseXNlc0J5SWRbYy5pZF0/LnJlYXNvbmluZyAgICAgID8/IG51bGwsXG4gICAgICBhbmFseXNpc0F2YWlsYWJsZTogYW5hbHlzaXNPayxcbiAgICB9KSk7XG5cbiAgICBjb250ZW50LmlubmVySFRNTCA9IHJlbmRlckhhcnZlc3RUYWJIdG1sKGVucmljaGVkLCBhbmFseXNpc09rLCBhbmFseXNpc0Vycm9yKTtcbiAgICBhdHRhY2hQcm9wb3NhbFJvd0xpc3RlbmVycyhjb250ZW50LCAnaGFydmVzdCcpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cuZXJyb3IoJ3JlZnJlc2hIYXJ2ZXN0QW5hbHlzaXM6IGZhaWxlZCcsIGVycik7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gYXBwbHlIYXJ2ZXN0U2VsZWN0aW9ucygpIHtcbiAgY29uc3QgY2hlY2tib3hlcyAgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtkYXRhLWhhcnZlc3QtaWRdOmNoZWNrZWQnKTtcbiAgY29uc3Qgc2VsZWN0ZWRJZHMgPSBBcnJheS5mcm9tKGNoZWNrYm94ZXMpLm1hcChjYiA9PiBjYi5kYXRhc2V0LmhhcnZlc3RJZCk7XG4gIGNvbnN0IHJlc3VsdERpdiAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hhcnZlc3QtcmVzdWx0Jyk7XG4gIGNvbnN0IGFwcGx5QnRuICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hhcnZlc3QtYXBwbHktYnRuJyk7XG5cbiAgaWYgKHNlbGVjdGVkSWRzLmxlbmd0aCA9PT0gMCkge1xuICAgIGlmIChyZXN1bHREaXYpIHJlc3VsdERpdi5pbm5lckhUTUwgPSAnPHAgc3R5bGU9XCJjb2xvcjojYjQ1MzA5O1wiPk5vIGl0ZW1zIHNlbGVjdGVkLjwvcD4nO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0ICh0eXBlb2Ygc2hvd0NvbmZpcm1Nb2RhbCA9PT0gJ2Z1bmN0aW9uJ1xuICAgID8gc2hvd0NvbmZpcm1Nb2RhbChcbiAgICAgICAgYFByb21vdGUgJHtzZWxlY3RlZElkcy5sZW5ndGh9IGl0ZW0ke3NlbGVjdGVkSWRzLmxlbmd0aCAhPT0gMSA/ICdzJyA6ICcnfSB0byBtYXN0ZXIgQ1Y/YCxcbiAgICAgICAgJ1RoaXMgd2lsbCBwZXJtYW5lbnRseSB3cml0ZSBjaGFuZ2VzIHRvIHlvdXIgTWFzdGVyX0NWX0RhdGEuanNvbi4gQSBiYWNrdXAgd2lsbCBiZSBjcmVhdGVkIGZpcnN0LicsXG4gICAgICApXG4gICAgOiBQcm9taXNlLnJlc29sdmUod2luZG93LmNvbmZpcm0oYFByb21vdGUgJHtzZWxlY3RlZElkcy5sZW5ndGh9IGl0ZW0ocykgdG8gbWFzdGVyIENWP1xcblxcblRoaXMgd2lsbCBwZXJtYW5lbnRseSB3cml0ZSBjaGFuZ2VzIHRvIHlvdXIgTWFzdGVyX0NWX0RhdGEuanNvbi5gKSkpO1xuXG4gIGlmICghY29uZmlybWVkKSByZXR1cm47XG5cbiAgaWYgKGFwcGx5QnRuKSB7IGFwcGx5QnRuLmRpc2FibGVkID0gdHJ1ZTsgYXBwbHlCdG4udGV4dENvbnRlbnQgPSAnQXBwbHlpbmdcdTIwMjYnOyB9XG4gIGlmIChyZXN1bHREaXYpIHJlc3VsdERpdi5pbm5lckhUTUwgPSAnJztcblxuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9oYXJ2ZXN0L2FwcGx5Jywge1xuICAgICAgbWV0aG9kOiAgJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiAgICBKU09OLnN0cmluZ2lmeSh7IHNlbGVjdGVkX2lkczogc2VsZWN0ZWRJZHMgfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG5cbiAgICBpZiAoIWRhdGEub2spIHtcbiAgICAgIGlmIChyZXN1bHREaXYpIHJlc3VsdERpdi5pbm5lckhUTUwgPSBgPHAgY2xhc3M9XCJlcnJvci1tZXNzYWdlXCI+QXBwbHkgZmFpbGVkOiAke2VzYyhkYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yJyl9PC9wPmA7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgd3JpdHRlbkNvdW50ID0gZGF0YS53cml0dGVuX2NvdW50ID8/IDA7XG4gICAgY29uc3QgY29tbWl0SGFzaCAgID0gZGF0YS5jb21taXRfaGFzaCAgID8gYCAoY29tbWl0ICR7ZXNjKGRhdGEuY29tbWl0X2hhc2gpfSlgIDogJyc7XG4gICAgY29uc3QgYmFja3VwTm90ZSAgID0gZGF0YS5iYWNrdXBfcGF0aCAgID8gYCBCYWNrdXAgc2F2ZWQgdG8gPGNvZGU+JHtlc2MoZGF0YS5iYWNrdXBfcGF0aCl9PC9jb2RlPi5gIDogJyc7XG4gICAgY29uc3QgZ2l0V2FybmluZyAgID0gZGF0YS5naXRfZXJyb3JcbiAgICAgID8gYDxwIHN0eWxlPVwiY29sb3I6I2I0NTMwOTtmb250LXNpemU6MC44N2VtO1wiPlx1MjZBMFx1RkUwRiBHaXQgY29tbWl0IHNraXBwZWQ6ICR7ZXNjKGRhdGEuZ2l0X2Vycm9yPy5tZXNzYWdlIHx8IGRhdGEuZ2l0X2Vycm9yKX08L3A+YFxuICAgICAgOiAnJztcblxuICAgIGlmIChyZXN1bHREaXYpIHtcbiAgICAgIHJlc3VsdERpdi5pbm5lckhUTUwgPSBgXG4gICAgICAgIDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmMGZkZjQ7Ym9yZGVyOjFweCBzb2xpZCAjODZlZmFjO2JvcmRlci1yYWRpdXM6NnB4O3BhZGRpbmc6MTJweCAxNnB4O1wiPlxuICAgICAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzE2NjUzNDtmb250LXdlaWdodDo2MDA7bWFyZ2luOjAgMCA0cHg7XCI+XG4gICAgICAgICAgICBcdTI3MDUgJHt3cml0dGVuQ291bnR9IGl0ZW0ke3dyaXR0ZW5Db3VudCAhPT0gMSA/ICdzJyA6ICcnfSB3cml0dGVuIHRvIG1hc3RlciBDViR7Y29tbWl0SGFzaH0uXG4gICAgICAgICAgPC9wPlxuICAgICAgICAgICR7YmFja3VwTm90ZSA/IGA8cCBzdHlsZT1cImZvbnQtc2l6ZTowLjgyZW07Y29sb3I6IzZiNzI4MDttYXJnaW46NHB4IDAgMDtcIj4ke2JhY2t1cE5vdGV9PC9wPmAgOiAnJ31cbiAgICAgICAgICAke2dpdFdhcm5pbmd9XG4gICAgICAgIDwvZGl2PmA7XG4gICAgfVxuXG4gICAgLy8gRGlzYWJsZSBjaGVja2JveGVzIGZvciBhcHBsaWVkIGl0ZW1zXG4gICAgZm9yIChjb25zdCBpZCBvZiBzZWxlY3RlZElkcykge1xuICAgICAgY29uc3QgY2IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgaGFydmVzdC1jaGstJHtpZH1gKTtcbiAgICAgIGlmIChjYikgeyBjYi5kaXNhYmxlZCA9IHRydWU7IGNiLmNoZWNrZWQgPSBmYWxzZTsgfVxuICAgICAgY29uc3Qgcm93ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYGhhcnZlc3Qtcm93LSR7aWR9YCk7XG4gICAgICBpZiAocm93KSByb3cuc3R5bGUub3BhY2l0eSA9ICcwLjQ1JztcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy5lcnJvcignYXBwbHlIYXJ2ZXN0U2VsZWN0aW9uczogZmFpbGVkJywgZXJyKTtcbiAgICBpZiAocmVzdWx0RGl2KSByZXN1bHREaXYuaW5uZXJIVE1MID0gYDxwIGNsYXNzPVwiZXJyb3ItbWVzc2FnZVwiPk5ldHdvcmsgZXJyb3I6ICR7ZXNjKGVyci5tZXNzYWdlKX08L3A+YDtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoYXBwbHlCdG4pIHsgYXBwbHlCdG4uZGlzYWJsZWQgPSBmYWxzZTsgYXBwbHlCdG4udGV4dENvbnRlbnQgPSAnXHUyNzA1IEFwcGx5IFNlbGVjdGVkIHRvIE1hc3RlciBDVic7IH1cbiAgfVxufVxuXG5leHBvcnQgeyBwb3B1bGF0ZUhhcnZlc3RUYWIsIGFwcGx5SGFydmVzdFNlbGVjdGlvbnMsIHJlZnJlc2hIYXJ2ZXN0QW5hbHlzaXMsIHRvZ2dsZUhhcnZlc3RTZWN0aW9uIH07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9lYXJseS1wcmV2aWV3LXBhbmVsLmpzXG4gKiBHQVAtMTYgUGFydCBCOiBhIHBlcnNpc3RlbnQsIGNvbGxhcHNpYmxlIENWIHByZXZpZXcgc2hvd24gZHVyaW5nIHRoZVxuICogY3VzdG9taXphdGlvbi9yZXdyaXRlL3NwZWxsLWNoZWNrIHBpcGVsaW5lLCBzbyB0aGUgdXNlciBzZWVzIGEgcmVuZGVyZWRcbiAqIENWIHdlbGwgYmVmb3JlIExheW91dCBSZXZpZXcuXG4gKlxuICogU0FGRVRZIEJPVU5EQVJZIChkbyBub3Qgd2Vha2VuIHdpdGhvdXQgcmUtcmVhZGluZyB0aGUgR0FQLTE2IHBsYW4nc1xuICogY29tbWl0dGVlLXJldmlldyBzZWN0aW9uIG9uIHRoaXMgbW9kdWxlKTogdGhpcyBmaWxlIG11c3Qgb25seSBldmVyIGNhbGxcbiAqIHRoZSByZWFkLW9ubHkgR0VUIC9hcGkvbGF5b3V0LWh0bWwgZW5kcG9pbnQuIEl0IG11c3QgbmV2ZXIgY2FsbFxuICogUE9TVCAvYXBpL2N2L2dlbmVyYXRlLXByZXZpZXcgb3IgUE9TVCAvYXBpL2N2L3NtYXJ0LWluc3RydWN0aW9uIFx1MjAxNCBib3RoXG4gKiBtdXRhdGUgZ2VuZXJhdGlvbl9zdGF0ZSAoc3RhdGVNYW5hZ2VyLm1hcmtQcmV2aWV3R2VuZXJhdGVkKCkgZm9yY2libHlcbiAqIGFkdmFuY2VzIHRoZSB3b3JrZmxvdyBwaGFzZSB0byBMQVlPVVRfUkVWSUVXKSwgd2hpY2ggd291bGQgc2lsZW50bHlcbiAqIGZhc3QtZm9yd2FyZCB0aGUgdXNlcidzIHN0YWdlIHdoaWxlIHRoZXkncmUgc3RpbGwgb24gYW4gZWFybGllciB0YWIuXG4gKiBUaGUgcmVuZGVyaW5nIHN0ZXAgaXMgZGVsZWdhdGVkIHRvIHByZXZpZXctcmVuZGVyLmpzLCBhIHNoYXJlZCB1dGlsIHdpdGhcbiAqIG5vIHJlZmVyZW5jZSB0byBhcGlDYWxsL3N0YXRlTWFuYWdlciBhdCBhbGwsIHNwZWNpZmljYWxseSBzbyBhIGZ1dHVyZVxuICogZWRpdCB0byB0aGUgbXV0YXRpbmcgbGF5b3V0LXJldmlldyBmbG93IGNhbm5vdCBwdWxsIHRoZSBtdXRhdGluZyBwYXRoIGluXG4gKiBoZXJlIHZpYSBhIHNoYXJlZCBpbXBvcnQuXG4gKi9cblxuaW1wb3J0IHsgYXBpQ2FsbCwgU3RvcmFnZUtleXMgfSBmcm9tICcuL2FwaS1jbGllbnQuanMnO1xuaW1wb3J0IHsgc3RhdGVNYW5hZ2VyIH0gZnJvbSAnLi9zdGF0ZS1tYW5hZ2VyLmpzJztcbmltcG9ydCB7IHJlbmRlckh0bWxJbnRvSWZyYW1lIH0gZnJvbSAnLi9wcmV2aWV3LXJlbmRlci5qcyc7XG5cbmNvbnN0IEVBUkxZX1BSRVZJRVdfVEFCUyA9IG5ldyBTZXQoW1xuICAnZXhwLXJldmlldycsICdhY2gtZWRpdG9yJywgJ3NraWxscy1yZXZpZXcnLCAnYWNoaWV2ZW1lbnRzLXJldmlldycsXG4gICd0YWdsaW5lLXJldmlldycsICdzdW1tYXJ5LXJldmlldycsICdwdWJsaWNhdGlvbnMtcmV2aWV3JywgLy8gY3VzdG9taXphdGlvbnNcbiAgJ3Jld3JpdGUnLCAnc3BlbGwnLFxuXSk7XG5cbmxldCBfY29sbGFwc2VkID0gZmFsc2U7XG50cnkge1xuICBfY29sbGFwc2VkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oU3RvcmFnZUtleXMuRUFSTFlfUFJFVklFV19DT0xMQVBTRUQpID09PSAndHJ1ZSc7XG59IGNhdGNoIChfZSkge1xuICAvLyBsb2NhbFN0b3JhZ2UgdW5hdmFpbGFibGUgXHUyMDE0IGRlZmF1bHQgdG8gZXhwYW5kZWQuXG59XG5cbmZ1bmN0aW9uIF9zZXRDb2xsYXBzZWQoY29sbGFwc2VkKSB7XG4gIF9jb2xsYXBzZWQgPSBjb2xsYXBzZWQ7XG4gIHRyeSB7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oU3RvcmFnZUtleXMuRUFSTFlfUFJFVklFV19DT0xMQVBTRUQsIFN0cmluZyhjb2xsYXBzZWQpKTtcbiAgfSBjYXRjaCAoX2UpIHtcbiAgICAvLyBOb24tZmF0YWwgXHUyMDE0IGNvbGxhcHNlIHN0YXRlIGp1c3Qgd29uJ3QgcGVyc2lzdCBhY3Jvc3MgcmVsb2Fkcy5cbiAgfVxuICBjb25zdCBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWFybHktcHJldmlldy10b2dnbGUtYnRuJyk7XG4gIGlmIChidG4pIHtcbiAgICBidG4udGV4dENvbnRlbnQgPSBjb2xsYXBzZWQgPyAnU2hvdycgOiAnSGlkZSc7XG4gICAgYnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsIFN0cmluZyghY29sbGFwc2VkKSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gX3JlbmRlckVhcmx5UHJldmlld0JvZHkoKSB7XG4gIGNvbnN0IGJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWFybHktcHJldmlldy1ib2R5Jyk7XG4gIGNvbnN0IG5vdGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWFybHktcHJldmlldy1zdGF0dXMtbm90ZScpO1xuICBpZiAoIWJvZHkpIHJldHVybjtcblxuICBpZiAoX2NvbGxhcHNlZCkge1xuICAgIGJvZHkuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICByZXR1cm47XG4gIH1cbiAgYm9keS5zdHlsZS5kaXNwbGF5ID0gJyc7XG5cbiAgbGV0IGRhdGE7XG4gIHRyeSB7XG4gICAgLy8gUmVhZC1vbmx5IGZldGNoIG9ubHkgXHUyMDE0IHNlZSB0aGUgbW9kdWxlLWhlYWRlciBzYWZldHkgYm91bmRhcnkuXG4gICAgZGF0YSA9IGF3YWl0IGFwaUNhbGwoJ0dFVCcsICcvYXBpL2xheW91dC1odG1sJyk7XG4gIH0gY2F0Y2ggKF9lKSB7XG4gICAgLy8gNDA0L2Vycm9yIChubyBwcmV2aWV3IGdlbmVyYXRlZCB5ZXQgdGhpcyBzZXNzaW9uKSBcdTIwMTQgZW1wdHkgc3RhdGUgYmVsb3cuXG4gICAgZGF0YSA9IG51bGw7XG4gIH1cblxuICBpZiAoZGF0YSAmJiBkYXRhLm9rICYmIGRhdGEuaHRtbCkge1xuICAgIGNvbnN0IGZyZXNobmVzcyA9ICh0eXBlb2Ygc3RhdGVNYW5hZ2VyPy5nZXRMYXlvdXRGcmVzaG5lc3MgPT09ICdmdW5jdGlvbicpXG4gICAgICA/IHN0YXRlTWFuYWdlci5nZXRMYXlvdXRGcmVzaG5lc3MoKSA6IHsgaXNTdGFsZTogZmFsc2UgfTtcblxuICAgIGJvZHkuaW5uZXJIVE1MID0gJzxpZnJhbWUgaWQ9XCJlYXJseS1wcmV2aWV3LWlmcmFtZVwiIHNhbmRib3g9XCJhbGxvdy1zYW1lLW9yaWdpblwiICcgK1xuICAgICAgJ3JlZmVycmVycG9saWN5PVwibm8tcmVmZXJyZXJcIiBzdHlsZT1cIndpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7Ym9yZGVyOm5vbmU7XCI+PC9pZnJhbWU+JztcbiAgICBjb25zdCBpZnJhbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWFybHktcHJldmlldy1pZnJhbWUnKTtcbiAgICBjb25zdCBzdGF0ZUxhYmVsID0gZnJlc2huZXNzLmlzU3RhbGUgPyAnc3RhbGUnIDogJ2ZyZXNoJztcbiAgICBpZnJhbWUudGl0bGUgPSBgQ1YgcHJldmlldyBcdTIwMTQgJHtzdGF0ZUxhYmVsfWA7XG4gICAgaWZyYW1lLmNsYXNzTGlzdC50b2dnbGUoJ2Vhcmx5LXByZXZpZXctaWZyYW1lLXN0YWxlJywgQm9vbGVhbihmcmVzaG5lc3MuaXNTdGFsZSkpO1xuICAgIHJlbmRlckh0bWxJbnRvSWZyYW1lKGlmcmFtZSwgZGF0YS5odG1sKTtcblxuICAgIGlmIChub3RlKSB7XG4gICAgICBub3RlLnRleHRDb250ZW50ID0gZnJlc2huZXNzLmlzU3RhbGVcbiAgICAgICAgPyAnUHJldmlldyByZWZsZWN0cyBhbiBlYXJsaWVyIHZlcnNpb24gXHUyMDE0IHZpc2l0IExheW91dCBSZXZpZXcgdG8gcmVmcmVzaC4nXG4gICAgICAgIDogJyc7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIGJvZHkuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJlYXJseS1wcmV2aWV3LWVtcHR5XCI+Tm8gQ1YgcHJldmlldyB5ZXQgXHUyMDE0IGF2YWlsYWJsZSBhZnRlciB5b3UgcmVhY2ggTGF5b3V0IFJldmlldy48L2Rpdj4nO1xuICBpZiAobm90ZSkgbm90ZS50ZXh0Q29udGVudCA9ICcnO1xufVxuXG4vKipcbiAqIFNob3cgb3IgaGlkZSB0aGUgcGFuZWwgZm9yIHRoZSBnaXZlbiB0YWIsIGFuZCAocmUpcmVuZGVyIGl0cyBib2R5IHdoZW5cbiAqIHNob3duLiBDYWxsZWQgZnJvbSBzd2l0Y2hUYWIoKSBcdTIwMTQgdGhpcyBmdW5jdGlvbidzIG93biBpbi1zY29wZSBjaGVja1xuICogZGVjaWRlcyB2aXNpYmlsaXR5LCBzbyB0aGUgY2FsbGVyIGRvZXNuJ3QgbmVlZCB0byBrbm93IHRoZSB0YWIgbGlzdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWJcbiAqL1xuYXN5bmMgZnVuY3Rpb24gdG9nZ2xlRWFybHlQcmV2aWV3UGFuZWwodGFiKSB7XG4gIGNvbnN0IHBhbmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Vhcmx5LXByZXZpZXctcGFuZWwnKTtcbiAgaWYgKCFwYW5lbCkgcmV0dXJuO1xuICBpZiAoIUVBUkxZX1BSRVZJRVdfVEFCUy5oYXModGFiKSkge1xuICAgIHBhbmVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgcmV0dXJuO1xuICB9XG4gIHBhbmVsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICBhd2FpdCBfcmVuZGVyRWFybHlQcmV2aWV3Qm9keSgpO1xufVxuXG5mdW5jdGlvbiBpbml0RWFybHlQcmV2aWV3UGFuZWwoKSB7XG4gIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlYXJseS1wcmV2aWV3LXRvZ2dsZS1idG4nKTtcbiAgaWYgKCFidG4pIHJldHVybjtcbiAgYnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsIFN0cmluZyghX2NvbGxhcHNlZCkpO1xuICBidG4udGV4dENvbnRlbnQgPSBfY29sbGFwc2VkID8gJ1Nob3cnIDogJ0hpZGUnO1xuICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgX3NldENvbGxhcHNlZCghX2NvbGxhcHNlZCk7XG4gICAgX3JlbmRlckVhcmx5UHJldmlld0JvZHkoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCB7IGluaXRFYXJseVByZXZpZXdQYW5lbCwgdG9nZ2xlRWFybHlQcmV2aWV3UGFuZWwgfTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL3Nlc3Npb24tc3dpdGNoZXItdWkuanNcbiAqIFNlc3Npb24gbWFuYWdlbWVudCBtb2RhbCwgdHJhc2ggdmlldywgYW5kIG93bmVyc2hpcCBjb25mbGljdCBkaWFsb2cuXG4gKlxuICogVGhlIHNlc3Npb24tY29uZmxpY3QgcmV0cnkgYmFubmVyIChzaG93U2Vzc2lvbkNvbmZsaWN0QmFubmVyL1xuICogY29uZmxpY3RSZXRyeU5vdy9jb25mbGljdERpc21pc3MpIGxpdmVzIGluIHdlYi9mZXRjaC11dGlscy5qcywgd2hpY2ggb3duc1xuICogaGFuZGxlNDA5Q29uZmxpY3QgKHRoZSBhY3R1YWwgdHJpZ2dlcikgXHUyMDE0IHRoaXMgZmlsZSB1c2VkIHRvIGNhcnJ5IGl0cyBvd25cbiAqIGJ5dGUtZm9yLWJ5dGUgZHVwbGljYXRlIHdpdGggYSBzZXBhcmF0ZSByZXRyeSBxdWV1ZS90aW1lciwgd2hpY2ggbWVhbnRcbiAqIGNsaWNraW5nIFwiUmV0cnkgTm93XCIgY291bGQgc2lsZW50bHkgZHJhaW4gdGhlIHdyb25nIChhbHdheXMtZW1wdHkpIHF1ZXVlXG4gKiBkZXBlbmRpbmcgb24gd2ViL3NyYy9tYWluLmpzJ3MgbW9kdWxlIGxvYWQgb3JkZXIsIG5ldmVyIGFjdHVhbGx5XG4gKiByZXNvbHZpbmcgdGhlIHBlbmRpbmcgcmV0cmllZCByZXF1ZXN0LiBSZW1vdmVkOyBzZWUgd2ViL2ZldGNoLXV0aWxzLmpzLlxuICpcbiAqIERlcGVuZGVuY2llcyAocmVzb2x2ZWQgdGhyb3VnaCBnbG9iYWxUaGlzIGF0IHJ1bnRpbWUpOlxuICogICBlc2NhcGVIdG1sLCBwYXJzZVNlc3Npb25MaXN0UmVzcG9uc2UsIGZvcm1hdFNlc3Npb25QaGFzZUxhYmVsLFxuICogICBmb3JtYXRTZXNzaW9uVGltZXN0YW1wLCBidWlsZFNlc3Npb25Td2l0Y2hlckxhYmVsLFxuICogICBnZXRBY3RpdmVTZXNzaW9uT3duZXJzaGlwTWV0YSwgX2dldEN1cnJlbnRTZXNzaW9uSWRWYWx1ZSxcbiAqICAgbG9hZFNlc3Npb25GaWxlLCBjcmVhdGVOZXdTZXNzaW9uQW5kTmF2aWdhdGUsIGZldGNoU3RhdHVzLFxuICogICBzZXRJbml0aWFsRm9jdXMsIHRyYXBGb2N1cywgcmVzdG9yZUZvY3VzLCBjb25maXJtRGlhbG9nXG4gKi9cblxuLy8gXHUyNTAwXHUyNTAwIFNvcnQgc3RhdGUgJiBzZXNzaW9uIGNhY2hlIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuY29uc3QgX1NNX1NUT1JBR0VfS0VZID0gJ2N2X3NtX3NvcnRfa2V5JztcbmNvbnN0IF9TTV9TVE9SQUdFX0RJUiA9ICdjdl9zbV9zb3J0X2Rpcic7XG5cbmxldCBfc21Tb3J0S2V5ID0gKCgpID0+IHsgdHJ5IHsgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKF9TTV9TVE9SQUdFX0tFWSkgfHwgJ2xhc3RNb2RpZmllZCc7IH0gY2F0Y2ggKF8pIHsgcmV0dXJuICdsYXN0TW9kaWZpZWQnOyB9IH0pKCk7XG5sZXQgX3NtU29ydERpciA9ICgoKSA9PiB7IHRyeSB7IHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShfU01fU1RPUkFHRV9ESVIpIHx8ICdkZXNjJzsgICAgICAgICB9IGNhdGNoIChfKSB7IHJldHVybiAnZGVzYyc7ICAgICAgICAgfSB9KSgpO1xuXG5sZXQgX3NtQWN0aXZlQ2FjaGUgPSBbXTtcbmxldCBfc21TYXZlZENhY2hlICA9IFtdO1xuXG4vLyBcdTI1MDBcdTI1MDAgUmVuZGVyIGhlbHBlcnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIF9yZW5kZXJBY3RpdmVTZXNzaW9uUm93cyhhY3RpdmVTZXNzaW9ucykge1xuICBpZiAoIWFjdGl2ZVNlc3Npb25zLmxlbmd0aCkge1xuICAgIHJldHVybiAnPHAgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLWVtcHR5XCI+Tm8gYWN0aXZlIGluLW1lbW9yeSBzZXNzaW9ucy48L3A+JztcbiAgfVxuXG4gIGNvbnN0IGN1cnJlbnRTZXNzaW9uSWQgPSBfZ2V0Q3VycmVudFNlc3Npb25JZFZhbHVlKCk7XG5cbiAgcmV0dXJuIGA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1saXN0XCI+JHthY3RpdmVTZXNzaW9ucy5tYXAoc2Vzc2lvbiA9PiB7XG4gICAgY29uc3Qgb3duZXJzaGlwID0gZ2V0QWN0aXZlU2Vzc2lvbk93bmVyc2hpcE1ldGEoc2Vzc2lvbiwgeyBjdXJyZW50U2Vzc2lvbklkIH0pO1xuICAgIGNvbnN0IG9wZW5IcmVmID0gYC8/c2Vzc2lvbj0ke2VuY29kZVVSSUNvbXBvbmVudChzZXNzaW9uLnNlc3Npb25faWQgfHwgJycpfWA7XG4gICAgY29uc3QgYWN0aW9uSHRtbCA9IG93bmVyc2hpcC5pc0N1cnJlbnRcbiAgICAgID8gJzxzcGFuIGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1idG5cIiBhcmlhLWRpc2FibGVkPVwidHJ1ZVwiPkN1cnJlbnQ8L3NwYW4+J1xuICAgICAgOiBgPGEgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLWxpbmtcIiBocmVmPVwiJHtvcGVuSHJlZn1cIj5PcGVuPC9hPmA7XG4gICAgcmV0dXJuIGBcbiAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLXJvd1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1yb3ctbWFpblwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLXJvdy10aXRsZVwiPlxuICAgICAgICAgICAgPHN0cm9uZz4ke2VzY2FwZUh0bWwoc2Vzc2lvbi5wb3NpdGlvbl9uYW1lIHx8ICdVbnRpdGxlZCcpfTwvc3Ryb25nPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZXNzaW9uLXN0YXR1cy1waWxsICR7b3duZXJzaGlwLmNsYXNzTmFtZX1cIj48c3BhbiBjbGFzcz1cInNlc3Npb24tc3RhdHVzLWRvdFwiPjwvc3Bhbj4ke2VzY2FwZUh0bWwob3duZXJzaGlwLmxhYmVsKX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNlc3Npb24tc3dpdGNoZXItcm93LW1ldGFcIj5cbiAgICAgICAgICAgICR7ZXNjYXBlSHRtbChmb3JtYXRTZXNzaW9uUGhhc2VMYWJlbChzZXNzaW9uLnBoYXNlKSl9IFx1MDBCNyBDcmVhdGVkICR7ZXNjYXBlSHRtbChmb3JtYXRTZXNzaW9uVGltZXN0YW1wKHNlc3Npb24uY3JlYXRlZCkpfSBcdTAwQjcgTGFzdCBtb2RpZmllZCAke2VzY2FwZUh0bWwoZm9ybWF0U2Vzc2lvblRpbWVzdGFtcChzZXNzaW9uLmxhc3RfbW9kaWZpZWQpKX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLWFjdGlvbnNcIj4ke2FjdGlvbkh0bWx9PC9kaXY+XG4gICAgICA8L2Rpdj5gO1xuICB9KS5qb2luKCcnKX08L2Rpdj5gO1xufVxuXG5mdW5jdGlvbiBfcmVuZGVyU2F2ZWRTZXNzaW9uUm93cyhzYXZlZFNlc3Npb25zLCB7IGluY2x1ZGVNYW5hZ2VtZW50ID0gZmFsc2UgfSA9IHt9KSB7XG4gIGlmICghc2F2ZWRTZXNzaW9ucy5sZW5ndGgpIHtcbiAgICByZXR1cm4gJzxwIGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1lbXB0eVwiPk5vIHNhdmVkIHNlc3Npb25zIGZvdW5kLjwvcD4nO1xuICB9XG5cbiAgZnVuY3Rpb24gX2NyZWF0ZWRJc29Gcm9tU2Vzc2lvblBhdGgoc2Vzc2lvblBhdGgpIHtcbiAgICBpZiAoIXNlc3Npb25QYXRoKSByZXR1cm4gJyc7XG4gICAgY29uc3QgcGF0aFRleHQgPSBTdHJpbmcoc2Vzc2lvblBhdGgpO1xuICAgIGNvbnN0IHBhcnRzID0gcGF0aFRleHQuc3BsaXQoL1tcXFxcL10vKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCA8IDIpIHJldHVybiAnJztcblxuICAgIGNvbnN0IGRpck5hbWUgPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAyXTtcbiAgICBjb25zdCBtYXRjaCA9IGRpck5hbWUubWF0Y2goLyhcXGR7NH0pKFxcZHsyfSkoXFxkezJ9KVtfLV0/KFxcZHsyfSkoXFxkezJ9KShcXGR7Mn0pLyk7XG4gICAgaWYgKCFtYXRjaCkgcmV0dXJuICcnO1xuXG4gICAgY29uc3QgWywgeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmRdID0gbWF0Y2g7XG4gICAgcmV0dXJuIGAke3llYXJ9LSR7bW9udGh9LSR7ZGF5fVQke2hvdXJ9OiR7bWludXRlfToke3NlY29uZH1aYDtcbiAgfVxuXG4gIHJldHVybiBgPGRpdiBjbGFzcz1cInNlc3Npb24tc3dpdGNoZXItbGlzdFwiPiR7c2F2ZWRTZXNzaW9ucy5tYXAoKHNlc3Npb24sIGluZGV4KSA9PiB7XG4gICAgY29uc3QgZXNjYXBlZFBhdGggPSBlc2NhcGVIdG1sKHNlc3Npb24ucGF0aCB8fCAnJyk7XG4gICAgY29uc3QgY3JlYXRlZElzbyA9IF9jcmVhdGVkSXNvRnJvbVNlc3Npb25QYXRoKHNlc3Npb24ucGF0aCk7XG4gICAgY29uc3QgY3JlYXRlZExhYmVsID0gY3JlYXRlZElzbyA/IGZvcm1hdFNlc3Npb25UaW1lc3RhbXAoY3JlYXRlZElzbykgOiAnXHUyMDE0JztcbiAgICBjb25zdCBzYXZlZExhYmVsID0gZm9ybWF0U2Vzc2lvblRpbWVzdGFtcChzZXNzaW9uLnRpbWVzdGFtcCk7XG4gICAgY29uc3Qgc2F2ZWRNZXRhID0gc2F2ZWRMYWJlbCA9PT0gJ1x1MjAxNCcgPyAnJyA6IGAgXHUwMEI3IFNhdmVkICR7ZXNjYXBlSHRtbChzYXZlZExhYmVsKX1gO1xuICAgIGNvbnN0IG1hbmFnZW1lbnRIdG1sID0gaW5jbHVkZU1hbmFnZW1lbnRcbiAgICAgID8gYFxuICAgICAgICA8YnV0dG9uIGRhdGEtc20tYWN0aW9uPVwicmVuYW1lXCIgZGF0YS1zbS1wYXRoPVwiJHtlc2NhcGVkUGF0aH1cIiBkYXRhLXNtLWlkeD1cIiR7aW5kZXh9XCIgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLWJ0blwiIHRpdGxlPVwiUmVuYW1lIHNlc3Npb25cIj5SZW5hbWU8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBkYXRhLXNtLWFjdGlvbj1cImRlbGV0ZVwiIGRhdGEtc20tcGF0aD1cIiR7ZXNjYXBlZFBhdGh9XCIgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLWJ0biBkYW5nZXJcIiB0aXRsZT1cIk1vdmUgc2Vzc2lvbiB0byBUcmFzaFwiPk1vdmUgdG8gVHJhc2g8L2J1dHRvbj5gXG4gICAgICA6ICcnO1xuXG4gICAgcmV0dXJuIGBcbiAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLXJvd1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1yb3ctbWFpblwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLXJvdy10aXRsZVwiPlxuICAgICAgICAgICAgPHN0cm9uZyBpZD1cInNtLW5hbWUtJHtpbmRleH1cIj4ke2VzY2FwZUh0bWwoc2Vzc2lvbi5wb3NpdGlvbl9uYW1lIHx8ICdVbnRpdGxlZCcpfTwvc3Ryb25nPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZXNzaW9uLXN0YXR1cy1waWxsIHNlc3Npb24tc3RhdHVzLXNhdmVkXCI+PHNwYW4gY2xhc3M9XCJzZXNzaW9uLXN0YXR1cy1kb3RcIj48L3NwYW4+U2F2ZWQ8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBpZD1cInNtLXJlbmFtZS0ke2luZGV4fVwiIHN0eWxlPVwiZGlzcGxheTpub25lO2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6NnB4O21hcmdpbjo4cHggMCA0cHg7XCI+XG4gICAgICAgICAgICA8aW5wdXQgaWQ9XCJzbS1pbnB1dC0ke2luZGV4fVwiIHR5cGU9XCJ0ZXh0XCIgdmFsdWU9XCIke2VzY2FwZUh0bWwoc2Vzc2lvbi5wb3NpdGlvbl9uYW1lIHx8ICcnKX1cIiBjbGFzcz1cInNtLWtleS1pbnB1dFwiIGRhdGEtc20tcGF0aD1cIiR7ZXNjYXBlZFBhdGh9XCIgZGF0YS1zbS1pZHg9XCIke2luZGV4fVwiIHN0eWxlPVwiYm9yZGVyOjFweCBzb2xpZCAjM2I4MmY2O2JvcmRlci1yYWRpdXM6NnB4O3BhZGRpbmc6NnB4IDEwcHg7Zm9udC1zaXplOjEzcHg7ZmxleDoxO21pbi13aWR0aDowO1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLXNtLWFjdGlvbj1cInN1Ym1pdC1yZW5hbWVcIiBkYXRhLXNtLXBhdGg9XCIke2VzY2FwZWRQYXRofVwiIGRhdGEtc20taWR4PVwiJHtpbmRleH1cIiBjbGFzcz1cInNlc3Npb24tc3dpdGNoZXItYnRuXCI+U2F2ZTwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLXNtLWFjdGlvbj1cImNhbmNlbC1yZW5hbWVcIiBkYXRhLXNtLWlkeD1cIiR7aW5kZXh9XCIgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLWJ0blwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLXJvdy1tZXRhXCI+XG4gICAgICAgICAgICAke2VzY2FwZUh0bWwoZm9ybWF0U2Vzc2lvblBoYXNlTGFiZWwoc2Vzc2lvbi5waGFzZSkpfSBcdTAwQjcgQ3JlYXRlZCAke2VzY2FwZUh0bWwoY3JlYXRlZExhYmVsKX0ke3NhdmVkTWV0YX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLWFjdGlvbnNcIj5cbiAgICAgICAgICA8YnV0dG9uIGRhdGEtc20tYWN0aW9uPVwibG9hZFwiIGRhdGEtc20tcGF0aD1cIiR7ZXNjYXBlZFBhdGh9XCIgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLWxpbmtcIj5Mb2FkPC9idXR0b24+XG4gICAgICAgICAgJHttYW5hZ2VtZW50SHRtbH1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5gO1xuICB9KS5qb2luKCcnKX08L2Rpdj5gO1xufVxuXG5mdW5jdGlvbiBfcmVuZGVyU2Vzc2lvblN3aXRjaGVyU2VjdGlvbnMoYWN0aXZlU2Vzc2lvbnMsIHNhdmVkU2Vzc2lvbnMsIHsgaW5jbHVkZVNhdmVkTWFuYWdlbWVudCA9IGZhbHNlIH0gPSB7fSkge1xuICBjb25zdCBzYXZlZFNlY3Rpb25Ob3RlID0gaW5jbHVkZVNhdmVkTWFuYWdlbWVudFxuICAgID8gJ0xvYWQgZnJvbSBkaXNrLCByZW5hbWUsIG9yIG1vdmUgc2F2ZWQgd29yayB0byBUcmFzaC4nXG4gICAgOiAnTG9hZCBzYXZlZCB3b3JrIGZyb20gZGlzay4nO1xuXG4gIHJldHVybiBgXG4gICAgPGRpdiBjbGFzcz1cInNlc3Npb24tc3dpdGNoZXItc2VjdGlvbnNcIj5cbiAgICAgIDxzZWN0aW9uIGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1zZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLXNlY3Rpb24taGVhZGVyXCI+XG4gICAgICAgICAgPGgzPkFjdGl2ZSBTZXNzaW9uczwvaDM+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLXNlY3Rpb24tbm90ZVwiPkluLW1lbW9yeSBzZXNzaW9ucyB0aGF0IGNhbiBiZSBvcGVuZWQgZGlyZWN0bHkuPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgJHtfcmVuZGVyQWN0aXZlU2Vzc2lvblJvd3MoYWN0aXZlU2Vzc2lvbnMpfVxuICAgICAgPC9zZWN0aW9uPlxuICAgICAgPHNlY3Rpb24gY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLXNlY3Rpb25cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNlc3Npb24tc3dpdGNoZXItc2VjdGlvbi1oZWFkZXJcIj5cbiAgICAgICAgICA8aDM+U2F2ZWQgU2Vzc2lvbnM8L2gzPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1zZWN0aW9uLW5vdGVcIj4ke3NhdmVkU2VjdGlvbk5vdGV9PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgJHtfcmVuZGVyU2F2ZWRTZXNzaW9uUm93cyhzYXZlZFNlc3Npb25zLCB7IGluY2x1ZGVNYW5hZ2VtZW50OiBpbmNsdWRlU2F2ZWRNYW5hZ2VtZW50IH0pfVxuICAgICAgPC9zZWN0aW9uPlxuICAgIDwvZGl2PmA7XG59XG5cbmZ1bmN0aW9uIF91cGRhdGVTZXNzaW9uU3dpdGNoZXJIZWFkZXIoc3RhdHVzID0ge30pIHtcbiAgY29uc3QgbGFiZWwgPSBidWlsZFNlc3Npb25Td2l0Y2hlckxhYmVsKHN0YXR1cyk7XG4gIGNvbnN0IHN3aXRjaGVyTGFiZWxFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXNzaW9uLXN3aXRjaGVyLWxhYmVsJyk7XG4gIGNvbnN0IHN3aXRjaGVyQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Nlc3Npb24tc3dpdGNoZXItYnRuJyk7XG4gIGNvbnN0IHN1YnRpdGxlRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhZGVyLXNlc3Npb24tbmFtZScpO1xuICBjb25zdCBoYXNTZXNzaW9uID0gQm9vbGVhbihfZ2V0Q3VycmVudFNlc3Npb25JZFZhbHVlKCkpO1xuXG4gIGlmIChzd2l0Y2hlckxhYmVsRWwpIHN3aXRjaGVyTGFiZWxFbC50ZXh0Q29udGVudCA9IGxhYmVsO1xuICBpZiAoc3dpdGNoZXJCdG4pIHN3aXRjaGVyQnRuLmNsYXNzTGlzdC50b2dnbGUoJ2lzLXNlc3Npb24tYWN0aXZlJywgaGFzU2Vzc2lvbik7XG4gIGlmIChzdWJ0aXRsZUVsKSB7XG4gICAgc3VidGl0bGVFbC50ZXh0Q29udGVudCA9IGhhc1Nlc3Npb24gPyBgQ3VycmVudCBzZXNzaW9uOiAke2xhYmVsfWAgOiAnU2VsZWN0IG9yIGNyZWF0ZSBhIHNlc3Npb24nO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBPd25lcnNoaXAgY29uZmxpY3QgZGlhbG9nIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBzaG93T3duZXJzaGlwQ29uZmxpY3REaWFsb2cobWVzc2FnZSA9ICdUaGlzIHNlc3Npb24gaXMgY3VycmVudGx5IGNsYWltZWQgYnkgYW5vdGhlciBicm93c2VyIHRhYi4nKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICBjb25zdCBvdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ293bmVyc2hpcC1jb25mbGljdC1vdmVybGF5Jyk7XG4gICAgY29uc3QgbWVzc2FnZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ293bmVyc2hpcC1jb25mbGljdC1tZXNzYWdlJyk7XG4gICAgY29uc3QgbG9hZERpZmZlcmVudEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvd25lcnNoaXAtbG9hZC1kaWZmZXJlbnQtYnRuJyk7XG4gICAgY29uc3QgbmV3U2Vzc2lvbkJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvd25lcnNoaXAtbmV3LXNlc3Npb24tYnRuJyk7XG4gICAgY29uc3QgdGFrZW92ZXJCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3duZXJzaGlwLXRha2VvdmVyLWJ0bicpO1xuICAgIGlmICghb3ZlcmxheSB8fCAhbWVzc2FnZUVsIHx8ICFsb2FkRGlmZmVyZW50QnRuIHx8ICFuZXdTZXNzaW9uQnRuIHx8ICF0YWtlb3ZlckJ0bikge1xuICAgICAgcmVzb2x2ZSgnZGlmZmVyZW50Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY2xlYW51cCA9IChjaG9pY2UpID0+IHtcbiAgICAgIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIHJlc3RvcmVGb2N1cygpO1xuICAgICAgbG9hZERpZmZlcmVudEJ0bi5vbmNsaWNrID0gbnVsbDtcbiAgICAgIG5ld1Nlc3Npb25CdG4ub25jbGljayA9IG51bGw7XG4gICAgICB0YWtlb3ZlckJ0bi5vbmNsaWNrID0gbnVsbDtcbiAgICAgIHJlc29sdmUoY2hvaWNlKTtcbiAgICB9O1xuXG4gICAgbWVzc2FnZUVsLnRleHRDb250ZW50ID0gbWVzc2FnZTtcbiAgICBvdmVybGF5LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgd2luZG93Ll9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICBzZXRJbml0aWFsRm9jdXMoJ293bmVyc2hpcC1jb25mbGljdC1vdmVybGF5Jyk7XG4gICAgdHJhcEZvY3VzKCdvd25lcnNoaXAtY29uZmxpY3Qtb3ZlcmxheScpO1xuXG4gICAgbG9hZERpZmZlcmVudEJ0bi5vbmNsaWNrID0gKCkgPT4gY2xlYW51cCgnZGlmZmVyZW50Jyk7XG4gICAgbmV3U2Vzc2lvbkJ0bi5vbmNsaWNrID0gKCkgPT4gY2xlYW51cCgnbmV3Jyk7XG4gICAgdGFrZW92ZXJCdG4ub25jbGljayA9ICgpID0+IGNsZWFudXAoJ3Rha2VvdmVyJyk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjbG9zZU93bmVyc2hpcENvbmZsaWN0RGlhbG9nKGNob2ljZSA9ICdkaWZmZXJlbnQnKSB7XG4gIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3duZXJzaGlwLWNvbmZsaWN0LW92ZXJsYXknKTtcbiAgaWYgKG92ZXJsYXkpIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgcmVzdG9yZUZvY3VzKCk7XG4gIGNvbnN0IGxvYWREaWZmZXJlbnRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3duZXJzaGlwLWxvYWQtZGlmZmVyZW50LWJ0bicpO1xuICBpZiAobG9hZERpZmZlcmVudEJ0biAmJiB0eXBlb2YgbG9hZERpZmZlcmVudEJ0bi5vbmNsaWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgbG9hZERpZmZlcmVudEJ0bi5vbmNsaWNrKCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHJldHVybiBjaG9pY2U7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBTZXNzaW9uIGZpbGUtYnJvd3NlciB0YWJsZSBoZWxwZXJzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBfc2V0U21Tb3J0KGtleSkge1xuICBpZiAoX3NtU29ydEtleSA9PT0ga2V5KSB7XG4gICAgX3NtU29ydERpciA9IF9zbVNvcnREaXIgPT09ICdhc2MnID8gJ2Rlc2MnIDogJ2FzYyc7XG4gIH0gZWxzZSB7XG4gICAgX3NtU29ydEtleSA9IGtleTtcbiAgICBfc21Tb3J0RGlyID0ga2V5ID09PSAnbGFzdE1vZGlmaWVkJyA/ICdkZXNjJyA6ICdhc2MnO1xuICB9XG4gIHRyeSB7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oX1NNX1NUT1JBR0VfS0VZLCBfc21Tb3J0S2V5KTtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShfU01fU1RPUkFHRV9ESVIsIF9zbVNvcnREaXIpO1xuICB9IGNhdGNoIChfKSB7IC8qIHN0b3JhZ2UgdW5hdmFpbGFibGUgKi8gfVxuICBfcmVuZGVyU2Vzc2lvblRhYmxlRnJvbUNhY2hlKCk7XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVkSXNvRnJvbVNlc3Npb25QYXRoKHNlc3Npb25QYXRoKSB7XG4gIGlmICghc2Vzc2lvblBhdGgpIHJldHVybiAnJztcbiAgY29uc3QgcGF0aFRleHQgPSBTdHJpbmcoc2Vzc2lvblBhdGgpO1xuICBjb25zdCBwYXJ0cyAgICA9IHBhdGhUZXh0LnNwbGl0KC9bXFxcXC9dLykuZmlsdGVyKEJvb2xlYW4pO1xuICBpZiAocGFydHMubGVuZ3RoIDwgMikgcmV0dXJuICcnO1xuICBjb25zdCBkaXJOYW1lICA9IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDJdO1xuICBjb25zdCBtYXRjaCAgICA9IGRpck5hbWUubWF0Y2goLyhcXGR7NH0pKFxcZHsyfSkoXFxkezJ9KVtfLV0/KFxcZHsyfSkoXFxkezJ9KShcXGR7Mn0pLyk7XG4gIGlmICghbWF0Y2gpIHJldHVybiAnJztcbiAgY29uc3QgWywgeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmRdID0gbWF0Y2g7XG4gIHJldHVybiBgJHt5ZWFyfS0ke21vbnRofS0ke2RheX1UJHtob3VyfToke21pbnV0ZX06JHtzZWNvbmR9WmA7XG59XG5cbmZ1bmN0aW9uIF9ub3JtYWxpemVTZXNzaW9uc0ZvclRhYmxlKGFjdGl2ZVNlc3Npb25zLCBzYXZlZFNlc3Npb25zKSB7XG4gIGNvbnN0IGN1cnJlbnRTZXNzaW9uSWQgPSBfZ2V0Q3VycmVudFNlc3Npb25JZFZhbHVlKCk7XG4gIGNvbnN0IHJvd3MgPSBbXTtcblxuICBmb3IgKGNvbnN0IHMgb2YgYWN0aXZlU2Vzc2lvbnMpIHtcbiAgICBjb25zdCBvd25lcnNoaXAgPSBnZXRBY3RpdmVTZXNzaW9uT3duZXJzaGlwTWV0YShzLCB7IGN1cnJlbnRTZXNzaW9uSWQgfSk7XG4gICAgcm93cy5wdXNoKHtcbiAgICAgIHR5cGU6ICAgICAgICAgICAgICAnYWN0aXZlJyxcbiAgICAgIG5hbWU6ICAgICAgICAgICAgICAgcy5wb3NpdGlvbl9uYW1lIHx8ICdVbnRpdGxlZCcsXG4gICAgICBjb21wYW55OiAgICAgICAgICAgIHMuY29tcGFueSB8fCAnJyxcbiAgICAgIHBoYXNlOiAgICAgICAgICAgICAgcy5waGFzZSAgICAgICAgIHx8ICcnLFxuICAgICAgYXBwbGljYXRpb25TdGF0dXM6ICBzLmFwcGxpY2F0aW9uX3N0YXR1cyB8fCAnJyxcbiAgICAgIGF0c1Njb3JlOiAgICAgICAgICAgcy5hdHNfc2NvcmUgPz8gbnVsbCxcbiAgICAgIGxhc3RNb2RpZmllZDogICAgICAgcy5sYXN0X21vZGlmaWVkICA/IG5ldyBEYXRlKHMubGFzdF9tb2RpZmllZCkgOiBudWxsLFxuICAgICAgY3JlYXRlZDogICAgICAgICAgICBzLmNyZWF0ZWQgICAgICAgID8gbmV3IERhdGUocy5jcmVhdGVkKSAgICAgICA6IG51bGwsXG4gICAgICBvd25lcnNoaXAsXG4gICAgICBzZXNzaW9uSWQ6ICAgICAgICAgIHMuc2Vzc2lvbl9pZCxcbiAgICAgIHBhdGg6ICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgIGlkeDogICAgICAgICAgICAgICAgbnVsbCxcbiAgICB9KTtcbiAgfVxuXG4gIHNhdmVkU2Vzc2lvbnMuZm9yRWFjaCgocywgaWR4KSA9PiB7XG4gICAgY29uc3QgY3JlYXRlZElzbyA9IF9jcmVhdGVkSXNvRnJvbVNlc3Npb25QYXRoKHMucGF0aCk7XG4gICAgcm93cy5wdXNoKHtcbiAgICAgIHR5cGU6ICAgICAgICAgICAgICAnc2F2ZWQnLFxuICAgICAgbmFtZTogICAgICAgICAgICAgICBzLnBvc2l0aW9uX25hbWUgfHwgJ1VudGl0bGVkJyxcbiAgICAgIGNvbXBhbnk6ICAgICAgICAgICAgcy5jb21wYW55IHx8ICcnLFxuICAgICAgcGhhc2U6ICAgICAgICAgICAgICBzLnBoYXNlICAgICAgICAgfHwgJycsXG4gICAgICBhcHBsaWNhdGlvblN0YXR1czogIHMuYXBwbGljYXRpb25fc3RhdHVzIHx8ICcnLFxuICAgICAgbm90ZXM6ICAgICAgICAgICAgICBzLm5vdGVzIHx8ICcnLFxuICAgICAgYXRzU2NvcmU6ICAgICAgICAgICBzLmF0c19zY29yZSA/PyBudWxsLFxuICAgICAgbGFzdE1vZGlmaWVkOiAgICAgICBzLnRpbWVzdGFtcCAgPyBuZXcgRGF0ZShzLnRpbWVzdGFtcCkgIDogbnVsbCxcbiAgICAgIGNyZWF0ZWQ6ICAgICAgICAgICAgY3JlYXRlZElzbyAgID8gbmV3IERhdGUoY3JlYXRlZElzbykgICA6IG51bGwsXG4gICAgICBvd25lcnNoaXA6ICAgICAgICAgIG51bGwsXG4gICAgICBzZXNzaW9uSWQ6ICAgICAgICAgIG51bGwsXG4gICAgICBwYXRoOiAgICAgICAgICAgICAgIHMucGF0aCxcbiAgICAgIGlkeCxcbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHJvd3M7XG59XG5cbmZ1bmN0aW9uIF9zb3J0U2Vzc2lvblJvd3Mocm93cywga2V5LCBkaXIpIHtcbiAgcmV0dXJuIFsuLi5yb3dzXS5zb3J0KChhLCBiKSA9PiB7XG4gICAgbGV0IGF2LCBidjtcbiAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgY2FzZSAnbmFtZSc6XG4gICAgICAgIGF2ID0gKGEubmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgYnYgPSAoYi5uYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICByZXR1cm4gZGlyID09PSAnYXNjJyA/IGF2LmxvY2FsZUNvbXBhcmUoYnYpIDogYnYubG9jYWxlQ29tcGFyZShhdik7XG4gICAgICBjYXNlICdzdGF0dXMnOiB7XG4gICAgICAgIGNvbnN0IHJhbmsgPSByID0+IHIudHlwZSA9PT0gJ2FjdGl2ZScgPyAoci5vd25lcnNoaXA/LmlzQ3VycmVudCA/IDAgOiAxKSA6IDI7XG4gICAgICAgIGF2ID0gcmFuayhhKTsgYnYgPSByYW5rKGIpO1xuICAgICAgICByZXR1cm4gZGlyID09PSAnYXNjJyA/IGF2IC0gYnYgOiBidiAtIGF2O1xuICAgICAgfVxuICAgICAgY2FzZSAncGhhc2UnOlxuICAgICAgICBhdiA9IChhLnBoYXNlIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBidiA9IChiLnBoYXNlIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICByZXR1cm4gZGlyID09PSAnYXNjJyA/IGF2LmxvY2FsZUNvbXBhcmUoYnYpIDogYnYubG9jYWxlQ29tcGFyZShhdik7XG4gICAgICBjYXNlICdsYXN0TW9kaWZpZWQnOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYXYgPSBhLmxhc3RNb2RpZmllZCA/IGEubGFzdE1vZGlmaWVkLmdldFRpbWUoKSA6IDA7XG4gICAgICAgIGJ2ID0gYi5sYXN0TW9kaWZpZWQgPyBiLmxhc3RNb2RpZmllZC5nZXRUaW1lKCkgOiAwO1xuICAgICAgICByZXR1cm4gZGlyID09PSAnYXNjJyA/IGF2IC0gYnYgOiBidiAtIGF2O1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIF9yZW5kZXJTZXNzaW9uVGFibGVIZWFkZXIoKSB7XG4gIGNvbnN0IGNvbHMgPSBbXG4gICAgeyBrZXk6ICduYW1lJywgICAgICAgICBsYWJlbDogJ05hbWUnICAgICB9LFxuICAgIHsga2V5OiAnc3RhdHVzJywgICAgICAgbGFiZWw6ICdTdGF0dXMnICAgfSxcbiAgICB7IGtleTogJ3BoYXNlJywgICAgICAgIGxhYmVsOiAnUGhhc2UnICAgIH0sXG4gICAgeyBrZXk6ICdsYXN0TW9kaWZpZWQnLCBsYWJlbDogJ01vZGlmaWVkJyB9LFxuICBdO1xuICBjb25zdCBjZWxscyA9IGNvbHMubWFwKCh7IGtleSwgbGFiZWwgfSkgPT4ge1xuICAgIGNvbnN0IGFjdGl2ZSA9IF9zbVNvcnRLZXkgPT09IGtleTtcbiAgICBjb25zdCBpY29uICAgPSBhY3RpdmUgPyAoX3NtU29ydERpciA9PT0gJ2FzYycgPyAnXFx1MjViMicgOiAnXFx1MjViYycpIDogJ1xcdTIxYzUnO1xuICAgIHJldHVybiBgPHNwYW4gY2xhc3M9XCJzbS10aCR7YWN0aXZlID8gJyBzbS10aC1zb3J0ZWQnIDogJyd9XCIgZGF0YS1zbS1zb3J0PVwiJHtrZXl9XCIgcm9sZT1cImJ1dHRvblwiIHRhYmluZGV4PVwiMFwiIHRpdGxlPVwiU29ydCBieSAke2xhYmVsfVwiPiR7ZXNjYXBlSHRtbChsYWJlbCl9IDxzcGFuIGNsYXNzPVwic20tc29ydC1pY29uJHthY3RpdmUgPyAnIHNtLXNvcnQtYWN0aXZlJyA6ICcnfVwiPiR7aWNvbn08L3NwYW4+PC9zcGFuPmA7XG4gIH0pO1xuICByZXR1cm4gYDxkaXYgY2xhc3M9XCJzbS10aGVhZFwiPiR7Y2VsbHMuam9pbignJyl9PHNwYW4gY2xhc3M9XCJzbS10aCBzbS10aC1hY3Rpb25zXCI+QWN0aW9uczwvc3Bhbj48L2Rpdj5gO1xufVxuXG5mdW5jdGlvbiBfZm10RGF0ZUNvbXBhY3QoZCkge1xuICBpZiAoIWQpIHJldHVybiAnXFx1MjAxNCc7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGQudG9Mb2NhbGVTdHJpbmcoJ2VuLVVTJywge1xuICAgICAgbW9udGg6ICdudW1lcmljJywgZGF5OiAnbnVtZXJpYycsIHllYXI6ICcyLWRpZ2l0JyxcbiAgICAgIGhvdXI6ICdudW1lcmljJywgbWludXRlOiAnMi1kaWdpdCcsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKF8pIHsgcmV0dXJuICdcXHUyMDE0JzsgfVxufVxuXG5mdW5jdGlvbiBfcmVuZGVyU2Vzc2lvblRhYmxlUm93KHJvdykge1xuICBjb25zdCBwaGFzZUxhYmVsID0gZXNjYXBlSHRtbChmb3JtYXRTZXNzaW9uUGhhc2VMYWJlbChyb3cucGhhc2UpKTtcbiAgY29uc3QgbW9kTGFiZWwgICA9IGVzY2FwZUh0bWwoX2ZtdERhdGVDb21wYWN0KHJvdy5sYXN0TW9kaWZpZWQpKTtcblxuICBjb25zdCBzdGF0dXNQaWxsID0gcm93LnR5cGUgPT09ICdhY3RpdmUnXG4gICAgPyBgPHNwYW4gY2xhc3M9XCJzZXNzaW9uLXN0YXR1cy1waWxsICR7cm93Lm93bmVyc2hpcC5jbGFzc05hbWV9XCI+PHNwYW4gY2xhc3M9XCJzZXNzaW9uLXN0YXR1cy1kb3RcIj48L3NwYW4+JHtlc2NhcGVIdG1sKHJvdy5vd25lcnNoaXAubGFiZWwpfTwvc3Bhbj5gXG4gICAgOiBgPHNwYW4gY2xhc3M9XCJzZXNzaW9uLXN0YXR1cy1waWxsIHNlc3Npb24tc3RhdHVzLXNhdmVkXCI+PHNwYW4gY2xhc3M9XCJzZXNzaW9uLXN0YXR1cy1kb3RcIj48L3NwYW4+U2F2ZWQ8L3NwYW4+YDtcblxuICBsZXQgYWN0aW9uSHRtbDtcbiAgaWYgKHJvdy50eXBlID09PSAnYWN0aXZlJykge1xuICAgIGNvbnN0IGhyZWYgPSBgLz9zZXNzaW9uPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHJvdy5zZXNzaW9uSWQgfHwgJycpfWA7XG4gICAgYWN0aW9uSHRtbCA9IHJvdy5vd25lcnNoaXAuaXNDdXJyZW50XG4gICAgICA/ICc8c3BhbiBjbGFzcz1cInNtLWJ0biBzbS1idG4tZGlzYWJsZWRcIiBhcmlhLWRpc2FibGVkPVwidHJ1ZVwiPkN1cnJlbnQ8L3NwYW4+J1xuICAgICAgOiBgPGEgY2xhc3M9XCJzbS1idG4gc20tYnRuLW9wZW5cIiBocmVmPVwiJHtocmVmfVwiPk9wZW48L2E+YDtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBlcCAgPSBlc2NhcGVIdG1sKHJvdy5wYXRoIHx8ICcnKTtcbiAgICBjb25zdCBpZHggPSByb3cuaWR4O1xuICAgIGFjdGlvbkh0bWwgPVxuICAgICAgYDxidXR0b24gZGF0YS1zbS1hY3Rpb249XCJsb2FkXCIgICBkYXRhLXNtLXBhdGg9XCIke2VwfVwiIGNsYXNzPVwic20tYnRuIHNtLWJ0bi1vcGVuIHNtLWJ0bi1pY29uXCIgdGl0bGU9XCJMb2FkIHNlc3Npb25cIiBhcmlhLWxhYmVsPVwiTG9hZCBzZXNzaW9uXCI+PGkgY2xhc3M9XCJmYS1zb2xpZCBmYS1mb2xkZXItb3BlblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT48L2J1dHRvbj5gICtcbiAgICAgIGA8YnV0dG9uIGRhdGEtc20tYWN0aW9uPVwicmVuYW1lXCIgZGF0YS1zbS1wYXRoPVwiJHtlcH1cIiBkYXRhLXNtLWlkeD1cIiR7aWR4fVwiIGNsYXNzPVwic20tYnRuIHNtLWJ0bi1pY29uXCIgdGl0bGU9XCJSZW5hbWUgc2Vzc2lvblwiIGFyaWEtbGFiZWw9XCJSZW5hbWUgc2Vzc2lvblwiPjxpIGNsYXNzPVwiZmEtc29saWQgZmEtcGVuY2lsXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPjwvYnV0dG9uPmAgK1xuICAgICAgYDxidXR0b24gZGF0YS1zbS1hY3Rpb249XCJkdXBsaWNhdGVcIiBkYXRhLXNtLXBhdGg9XCIke2VwfVwiIGNsYXNzPVwic20tYnRuIHNtLWJ0bi1pY29uXCIgdGl0bGU9XCJEdXBsaWNhdGUgc2Vzc2lvblwiIGFyaWEtbGFiZWw9XCJEdXBsaWNhdGUgc2Vzc2lvblwiPjxpIGNsYXNzPVwiZmEtc29saWQgZmEtY29weVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT48L2J1dHRvbj5gICtcbiAgICAgIGA8YnV0dG9uIGRhdGEtc20tYWN0aW9uPVwiZGVsZXRlXCIgZGF0YS1zbS1wYXRoPVwiJHtlcH1cIiBjbGFzcz1cInNtLWJ0biBzbS1idG4tZGFuZ2VyIHNtLWJ0bi1pY29uXCIgdGl0bGU9XCJNb3ZlIHRvIFRyYXNoXCIgYXJpYS1sYWJlbD1cIk1vdmUgc2Vzc2lvbiB0byBUcmFzaFwiPjxpIGNsYXNzPVwiZmEtc29saWQgZmEtdHJhc2hcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+PC9idXR0b24+YDtcbiAgfVxuXG4gIGNvbnN0IHJvd0NsYXNzID0gKHJvdy50eXBlID09PSAnYWN0aXZlJyAmJiByb3cub3duZXJzaGlwLmlzQ3VycmVudCkgPyAnc20tdHIgc20tdHItY3VycmVudCcgOiAnc20tdHInO1xuXG4gIGNvbnN0IGNvbXBhbnlTdWIgPSByb3cuY29tcGFueVxuICAgID8gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC44ZW07Y29sb3I6Izk0YTNiODttYXJnaW4tdG9wOjFweDtcIj4ke2VzY2FwZUh0bWwocm93LmNvbXBhbnkpfTwvZGl2PmBcbiAgICA6ICcnO1xuICBjb25zdCBuYW1lQ2VsbCA9IHJvdy50eXBlID09PSAnc2F2ZWQnXG4gICAgPyBgPHNwYW4gaWQ9XCJzbS1uYW1lLSR7cm93LmlkeH1cIj4ke2VzY2FwZUh0bWwocm93Lm5hbWUpfTwvc3Bhbj5gICtcbiAgICAgIGAke2NvbXBhbnlTdWJ9YCArXG4gICAgICBgPHNwYW4gaWQ9XCJzbS1yZW5hbWUtJHtyb3cuaWR4fVwiIHN0eWxlPVwiZGlzcGxheTpub25lO2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6NHB4O21hcmdpbi10b3A6M3B4O1wiPmAgK1xuICAgICAgICBgPGlucHV0IGlkPVwic20taW5wdXQtJHtyb3cuaWR4fVwiIHR5cGU9XCJ0ZXh0XCIgdmFsdWU9XCIke2VzY2FwZUh0bWwocm93Lm5hbWUpfVwiIGNsYXNzPVwic20ta2V5LWlucHV0XCJgICtcbiAgICAgICAgICBgIGRhdGEtc20tcGF0aD1cIiR7ZXNjYXBlSHRtbChyb3cucGF0aCB8fCAnJyl9XCIgZGF0YS1zbS1pZHg9XCIke3Jvdy5pZHh9XCJgICtcbiAgICAgICAgICBgIHN0eWxlPVwiYm9yZGVyOjFweCBzb2xpZCAjM2I4MmY2O2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6M3B4IDhweDtmb250LXNpemU6MTJweDtmbGV4OjE7bWluLXdpZHRoOjYwcHg7XCI+YCArXG4gICAgICAgIGA8YnV0dG9uIGRhdGEtc20tYWN0aW9uPVwic3VibWl0LXJlbmFtZVwiIGRhdGEtc20tcGF0aD1cIiR7ZXNjYXBlSHRtbChyb3cucGF0aCB8fCAnJyl9XCIgZGF0YS1zbS1pZHg9XCIke3Jvdy5pZHh9XCIgY2xhc3M9XCJzbS1idG5cIiB0aXRsZT1cIlNhdmUgcmVuYW1lXCIgYXJpYS1sYWJlbD1cIlNhdmUgcmVuYW1lXCI+XFx1MjcxMzwvYnV0dG9uPmAgK1xuICAgICAgICBgPGJ1dHRvbiBkYXRhLXNtLWFjdGlvbj1cImNhbmNlbC1yZW5hbWVcIiBkYXRhLXNtLWlkeD1cIiR7cm93LmlkeH1cIiBjbGFzcz1cInNtLWJ0blwiIHRpdGxlPVwiQ2FuY2VsIHJlbmFtZVwiIGFyaWEtbGFiZWw9XCJDYW5jZWwgcmVuYW1lXCI+XFx1MjcxNTwvYnV0dG9uPmAgK1xuICAgICAgYDwvc3Bhbj5gXG4gICAgOiBgPHNwYW4+JHtlc2NhcGVIdG1sKHJvdy5uYW1lKX08L3NwYW4+JHtjb21wYW55U3VifWA7XG5cbiAgY29uc3QgYXBwU3RhdHVzTGFiZWxzID0ge1xuICAgIGRyYWZ0OiAnRHJhZnQnLCByZWFkeTogJ1JlYWR5Jywgc2VudDogJ1NlbnQnLCBxdWV1ZWQ6ICdRdWV1ZWQnLFxuICAgIGludGVydmlldzogJ0ludGVydmlldycsIHJlamVjdGVkOiAnUmVqZWN0ZWQnLCBhY2NlcHRlZDogJ0FjY2VwdGVkJyxcbiAgICBwYXJrZWQ6ICdQYXJrZWQnLFxuICB9O1xuICBjb25zdCBhcHBTdGF0dXNDb2xvcnMgPSB7XG4gICAgZHJhZnQ6ICcjOTRhM2I4JywgcmVhZHk6ICcjM2I4MmY2Jywgc2VudDogJyMyMmM1NWUnLCBxdWV1ZWQ6ICcjZWFiMzA4JyxcbiAgICBpbnRlcnZpZXc6ICcjYTg1NWY3JywgcmVqZWN0ZWQ6ICcjZWY0NDQ0JywgYWNjZXB0ZWQ6ICcjMDU5NjY5JyxcbiAgICBwYXJrZWQ6ICcjZjk3MzE2JyxcbiAgfTtcbiAgY29uc3QgYXBwU3RhdHVzID0gcm93LmFwcGxpY2F0aW9uU3RhdHVzIHx8ICcnO1xuICBjb25zdCBhcHBTdGF0dXNCYWRnZSA9IGFwcFN0YXR1cyAmJiBhcHBTdGF0dXNMYWJlbHNbYXBwU3RhdHVzXVxuICAgID8gYCA8c3BhbiBpZD1cInNtLXN0YXR1cy1iYWRnZS0ke3Jvdy5pZHh9XCIgc3R5bGU9XCJmb250LXNpemU6MC43NWVtO3BhZGRpbmc6MXB4IDZweDtib3JkZXItcmFkaXVzOjlweDtiYWNrZ3JvdW5kOiR7YXBwU3RhdHVzQ29sb3JzW2FwcFN0YXR1c119O2NvbG9yOiNmZmY7dmVydGljYWwtYWxpZ246bWlkZGxlO1wiPiR7YXBwU3RhdHVzTGFiZWxzW2FwcFN0YXR1c119PC9zcGFuPmBcbiAgICA6IGA8c3BhbiBpZD1cInNtLXN0YXR1cy1iYWRnZS0ke3Jvdy5pZHh9XCI+PC9zcGFuPmA7XG5cbiAgLy8gU3RhdHVzLWVkaXQgaW5saW5lIHdpZGdldCAoc2F2ZWQgcm93cyBvbmx5KVxuICBjb25zdCBzdGF0dXNFZGl0V2lkZ2V0ID0gcm93LnR5cGUgPT09ICdzYXZlZCdcbiAgICA/IGA8c3BhbiBpZD1cInNtLXN0YXR1cy1lZGl0LSR7cm93LmlkeH1cIiBzdHlsZT1cImRpc3BsYXk6bm9uZTthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjRweDttYXJnaW4tdG9wOjJweDtcIj5gICtcbiAgICAgICAgYDxzZWxlY3QgaWQ9XCJzbS1zdGF0dXMtc2VsLSR7cm93LmlkeH1cIiBjbGFzcz1cInNtLWtleS1pbnB1dFwiIHN0eWxlPVwiYm9yZGVyOjFweCBzb2xpZCAjM2I4MmY2O2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6MnB4IDRweDtmb250LXNpemU6MTJweDtcIiBhcmlhLWxhYmVsPVwiU2VsZWN0IGFwcGxpY2F0aW9uIHN0YXR1c1wiPmAgK1xuICAgICAgICAgIGA8b3B0aW9uIHZhbHVlPVwiXCI+LS0gY2xlYXIgLS08L29wdGlvbj5gICtcbiAgICAgICAgICBPYmplY3QuZW50cmllcyhhcHBTdGF0dXNMYWJlbHMpLm1hcCgoW3YsIGxdKSA9PlxuICAgICAgICAgICAgYDxvcHRpb24gdmFsdWU9XCIke3Z9XCIke2FwcFN0YXR1cyA9PT0gdiA/ICcgc2VsZWN0ZWQnIDogJyd9PiR7bH08L29wdGlvbj5gXG4gICAgICAgICAgKS5qb2luKCcnKSArXG4gICAgICAgIGA8L3NlbGVjdD5gICtcbiAgICAgICAgYDxidXR0b24gZGF0YS1zbS1hY3Rpb249XCJzdWJtaXQtc3RhdHVzXCIgZGF0YS1zbS1wYXRoPVwiJHtlc2NhcGVIdG1sKHJvdy5wYXRoIHx8ICcnKX1cIiBkYXRhLXNtLWlkeD1cIiR7cm93LmlkeH1cIiBjbGFzcz1cInNtLWJ0blwiIHRpdGxlPVwiU2F2ZSBzdGF0dXNcIiBhcmlhLWxhYmVsPVwiU2F2ZSBzdGF0dXNcIj4mIzEwMDAzOzwvYnV0dG9uPmAgK1xuICAgICAgICBgPGJ1dHRvbiBkYXRhLXNtLWFjdGlvbj1cImNhbmNlbC1zdGF0dXNcIiBkYXRhLXNtLWlkeD1cIiR7cm93LmlkeH1cIiBjbGFzcz1cInNtLWJ0blwiIHRpdGxlPVwiQ2FuY2VsXCIgYXJpYS1sYWJlbD1cIkNhbmNlbCBzdGF0dXMgZWRpdFwiPiYjMTAwMDU7PC9idXR0b24+YCArXG4gICAgICBgPC9zcGFuPmBcbiAgICA6ICcnO1xuXG4gIC8vIE5vdGVzLWVkaXQgaW5saW5lIHdpZGdldCAoc2F2ZWQgcm93cyBvbmx5KVxuICBjb25zdCBub3Rlc1ByZXZpZXcgPSByb3cubm90ZXNcbiAgICA/IGA8ZGl2IGlkPVwic20tbm90ZXMtcHJldmlldy0ke3Jvdy5pZHh9XCIgc3R5bGU9XCJmb250LXNpemU6MC43OGVtO2NvbG9yOiM5NGEzYjg7bWFyZ2luLXRvcDoycHg7bWF4LXdpZHRoOjI2MHB4O292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3doaXRlLXNwYWNlOm5vd3JhcDtcIiB0aXRsZT1cIiR7ZXNjYXBlSHRtbChyb3cubm90ZXMpfVwiPiR7ZXNjYXBlSHRtbChyb3cubm90ZXMpfTwvZGl2PmBcbiAgICA6IGA8ZGl2IGlkPVwic20tbm90ZXMtcHJldmlldy0ke3Jvdy5pZHh9XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7Zm9udC1zaXplOjAuNzhlbTtjb2xvcjojOTRhM2I4O21hcmdpbi10b3A6MnB4O1wiPjwvZGl2PmA7XG4gIGNvbnN0IG5vdGVzRWRpdFdpZGdldCA9IHJvdy50eXBlID09PSAnc2F2ZWQnXG4gICAgPyBgPHNwYW4gaWQ9XCJzbS1ub3Rlcy1lZGl0LSR7cm93LmlkeH1cIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Z2FwOjRweDttYXJnaW4tdG9wOjRweDt3aWR0aDoxMDAlO1wiPmAgK1xuICAgICAgICBgPHRleHRhcmVhIGlkPVwic20tbm90ZXMtdGEtJHtyb3cuaWR4fVwiIHJvd3M9XCIyXCIgbWF4bGVuZ3RoPVwiMjAwMFwiYCArXG4gICAgICAgICAgYCBzdHlsZT1cIndpZHRoOjEwMCU7Zm9udC1zaXplOjEycHg7cGFkZGluZzo0cHg7Ym9yZGVyOjFweCBzb2xpZCAjM2I4MmY2O2JvcmRlci1yYWRpdXM6NHB4O3Jlc2l6ZTp2ZXJ0aWNhbDtcImAgK1xuICAgICAgICAgIGAgYXJpYS1sYWJlbD1cIlNlc3Npb24gbm90ZXNcIiBwbGFjZWhvbGRlcj1cImUuZy4sIEludGVydmlld2VkIDIwMjUtMDMtMTAsIGF3YWl0aW5nIGNhbGxiYWNrXCI+JHtlc2NhcGVIdG1sKHJvdy5ub3RlcyB8fCAnJyl9PC90ZXh0YXJlYT5gICtcbiAgICAgICAgYDxzcGFuIHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDo0cHg7XCI+YCArXG4gICAgICAgICAgYDxidXR0b24gZGF0YS1zbS1hY3Rpb249XCJzdWJtaXQtbm90ZXNcIiBkYXRhLXNtLXBhdGg9XCIke2VzY2FwZUh0bWwocm93LnBhdGggfHwgJycpfVwiIGRhdGEtc20taWR4PVwiJHtyb3cuaWR4fVwiIGNsYXNzPVwic20tYnRuXCIgdGl0bGU9XCJTYXZlIG5vdGVzXCIgYXJpYS1sYWJlbD1cIlNhdmUgbm90ZXNcIj4mIzEwMDAzOzwvYnV0dG9uPmAgK1xuICAgICAgICAgIGA8YnV0dG9uIGRhdGEtc20tYWN0aW9uPVwiY2FuY2VsLW5vdGVzXCIgZGF0YS1zbS1pZHg9XCIke3Jvdy5pZHh9XCIgY2xhc3M9XCJzbS1idG5cIiB0aXRsZT1cIkNhbmNlbFwiIGFyaWEtbGFiZWw9XCJDYW5jZWwgbm90ZXMgZWRpdFwiPiYjMTAwMDU7PC9idXR0b24+YCArXG4gICAgICAgIGA8L3NwYW4+YCArXG4gICAgICBgPC9zcGFuPmBcbiAgICA6ICcnO1xuXG4gIGlmIChyb3cudHlwZSA9PT0gJ3NhdmVkJykge1xuICAgIGFjdGlvbkh0bWwgKz1cbiAgICAgIGA8YnV0dG9uIGRhdGEtc20tYWN0aW9uPVwiZWRpdC1zdGF0dXNcIiBkYXRhLXNtLXBhdGg9XCIke2VzY2FwZUh0bWwocm93LnBhdGggfHwgJycpfVwiIGRhdGEtc20taWR4PVwiJHtyb3cuaWR4fVwiIGNsYXNzPVwic20tYnRuIHNtLWJ0bi1pY29uXCIgdGl0bGU9XCJVcGRhdGUgYXBwbGljYXRpb24gc3RhdHVzXCIgYXJpYS1sYWJlbD1cIlVwZGF0ZSBhcHBsaWNhdGlvbiBzdGF0dXNcIj48aSBjbGFzcz1cImZhLXNvbGlkIGZhLXRhZ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT48L2J1dHRvbj5gO1xuICAgIGFjdGlvbkh0bWwgKz1cbiAgICAgIGA8YnV0dG9uIGRhdGEtc20tYWN0aW9uPVwiZWRpdC1ub3Rlc1wiIGRhdGEtc20tcGF0aD1cIiR7ZXNjYXBlSHRtbChyb3cucGF0aCB8fCAnJyl9XCIgZGF0YS1zbS1pZHg9XCIke3Jvdy5pZHh9XCIgY2xhc3M9XCJzbS1idG4gc20tYnRuLWljb25cIiB0aXRsZT1cIkVkaXQgbm90ZXNcIiBhcmlhLWxhYmVsPVwiRWRpdCBub3Rlc1wiPjxpIGNsYXNzPVwiZmEtc29saWQgZmEtbm90ZS1zdGlja3lcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+PC9idXR0b24+YDtcbiAgfVxuXG4gIGNvbnN0IGF0c1Njb3JlTGFiZWwgPSByb3cuYXRzU2NvcmUgIT0gbnVsbFxuICAgID8gKCgpID0+IHtcbiAgICAgICAgY29uc3QgcyA9IE51bWJlcihyb3cuYXRzU2NvcmUpO1xuICAgICAgICBjb25zdCBjb2xvciA9IHMgPj0gNzUgPyAnIzA1OTY2OScgOiBzID49IDUwID8gJyNkOTc3MDYnIDogJyNkYzI2MjYnO1xuICAgICAgICByZXR1cm4gYCA8c3BhbiB0aXRsZT1cIkFUUyBtYXRjaCBzY29yZVwiIHN0eWxlPVwiZm9udC1zaXplOjAuNzhlbTtwYWRkaW5nOjFweCA1cHg7Ym9yZGVyLXJhZGl1czo5cHg7YmFja2dyb3VuZDoke2NvbG9yfTtjb2xvcjojZmZmO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtmb250LXdlaWdodDo2MDA7XCI+JHtzfSU8L3NwYW4+YDtcbiAgICAgIH0pKClcbiAgICA6ICcnO1xuXG4gIHJldHVybiBgPGRpdiBjbGFzcz1cIiR7cm93Q2xhc3N9XCI+YCArXG4gICAgYDxzcGFuIGNsYXNzPVwic20tdGQgc20tdGQtbmFtZVwiPiR7bmFtZUNlbGx9PC9zcGFuPmAgK1xuICAgIGA8c3BhbiBjbGFzcz1cInNtLXRkIHNtLXRkLXN0YXR1c1wiPiR7c3RhdHVzUGlsbH08L3NwYW4+YCArXG4gICAgYDxzcGFuIGNsYXNzPVwic20tdGQgc20tdGQtcGhhc2VcIj48c3BhbiBpZD1cInNtLXBoYXNlLSR7cm93LmlkeH1cIj4ke3BoYXNlTGFiZWx9JHthdHNTY29yZUxhYmVsfSR7YXBwU3RhdHVzQmFkZ2V9PC9zcGFuPiR7c3RhdHVzRWRpdFdpZGdldH0ke25vdGVzUHJldmlld30ke25vdGVzRWRpdFdpZGdldH08L3NwYW4+YCArXG4gICAgYDxzcGFuIGNsYXNzPVwic20tdGQgc20tdGQtZGF0ZVwiPiR7bW9kTGFiZWx9PC9zcGFuPmAgK1xuICAgIGA8c3BhbiBjbGFzcz1cInNtLXRkIHNtLXRkLWFjdGlvbnNcIj4ke2FjdGlvbkh0bWx9PC9zcGFuPmAgK1xuICAgIGA8L2Rpdj5gO1xufVxuXG5mdW5jdGlvbiBfcmVuZGVyUmVjZW50c1N0cmlwKHJlY2VudFJvd3MpIHtcbiAgaWYgKCFyZWNlbnRSb3dzLmxlbmd0aCkgcmV0dXJuICcnO1xuICBjb25zdCBpdGVtcyA9IHJlY2VudFJvd3MubWFwKHJvdyA9PiB7XG4gICAgY29uc3QgbGFiZWwgICAgPSBlc2NhcGVIdG1sKHJvdy5uYW1lKTtcbiAgICBjb25zdCBkb3RDbGFzcyA9IHJvdy50eXBlID09PSAnYWN0aXZlJ1xuICAgICAgPyAocm93Lm93bmVyc2hpcC5pc0N1cnJlbnQgPyAnc20tcmVjZW50LWRvdC1jdXJyZW50JyA6ICdzbS1yZWNlbnQtZG90LW90aGVyJylcbiAgICAgIDogJ3NtLXJlY2VudC1kb3Qtc2F2ZWQnO1xuICAgIGNvbnN0IGRvdCA9IGA8c3BhbiBjbGFzcz1cInNtLXJlY2VudC1kb3QgJHtkb3RDbGFzc31cIj48L3NwYW4+YDtcbiAgICBpZiAocm93LnR5cGUgPT09ICdhY3RpdmUnKSB7XG4gICAgICBjb25zdCBocmVmICA9IGAvP3Nlc3Npb249JHtlbmNvZGVVUklDb21wb25lbnQocm93LnNlc3Npb25JZCB8fCAnJyl9YDtcbiAgICAgIGNvbnN0IGV4dHJhID0gcm93Lm93bmVyc2hpcC5pc0N1cnJlbnQgPyAnIHNtLXJlY2VudC1jdXJyZW50JyA6ICcnO1xuICAgICAgcmV0dXJuIGA8YSBjbGFzcz1cInNtLXJlY2VudC1pdGVtJHtleHRyYX1cIiBocmVmPVwiJHtocmVmfVwiPiR7ZG90fSR7bGFiZWx9PC9hPmA7XG4gICAgfVxuICAgIHJldHVybiBgPGJ1dHRvbiBjbGFzcz1cInNtLXJlY2VudC1pdGVtXCIgZGF0YS1zbS1hY3Rpb249XCJsb2FkXCIgZGF0YS1zbS1wYXRoPVwiJHtlc2NhcGVIdG1sKHJvdy5wYXRoIHx8ICcnKX1cIj4ke2RvdH0ke2xhYmVsfTwvYnV0dG9uPmA7XG4gIH0pLmpvaW4oJycpO1xuICByZXR1cm4gYDxkaXYgY2xhc3M9XCJzbS1yZWNlbnRzXCI+PGRpdiBjbGFzcz1cInNtLXJlY2VudHMtbGFiZWxcIj5SZWNlbnQ8L2Rpdj48ZGl2IGNsYXNzPVwic20tcmVjZW50cy1saXN0XCI+JHtpdGVtc308L2Rpdj48L2Rpdj5gO1xufVxuXG5mdW5jdGlvbiBfcmVuZGVyU2Vzc2lvblRhYmxlRnJvbUNhY2hlKCkge1xuICBjb25zdCBib2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Nlc3Npb25zLW1vZGFsLWJvZHknKTtcbiAgaWYgKCFib2R5KSByZXR1cm47XG5cbiAgY29uc3Qgcm93cyAgID0gX25vcm1hbGl6ZVNlc3Npb25zRm9yVGFibGUoX3NtQWN0aXZlQ2FjaGUsIF9zbVNhdmVkQ2FjaGUpO1xuICBjb25zdCBieURhdGUgPSBfc29ydFNlc3Npb25Sb3dzKHJvd3MsICdsYXN0TW9kaWZpZWQnLCAnZGVzYycpO1xuICBjb25zdCBzb3J0ZWQgPSBfc29ydFNlc3Npb25Sb3dzKHJvd3MsIF9zbVNvcnRLZXksIF9zbVNvcnREaXIpO1xuXG4gIGlmIChzb3J0ZWQubGVuZ3RoID09PSAwKSB7XG4gICAgYm9keS5pbm5lckhUTUwgPSAnPHAgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLWVtcHR5XCIgc3R5bGU9XCJwYWRkaW5nOjI0cHggMTZweDtcIj5ObyBzZXNzaW9ucyBmb3VuZC4gQ3JlYXRlIG9uZSB0byBnZXQgc3RhcnRlZC48L3A+JztcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwYXJ0cyA9IFtcbiAgICBfc21BY3RpdmVDYWNoZS5sZW5ndGggPyBgJHtfc21BY3RpdmVDYWNoZS5sZW5ndGh9IGFjdGl2ZWAgOiAnJyxcbiAgICBfc21TYXZlZENhY2hlLmxlbmd0aCAgPyBgJHtfc21TYXZlZENhY2hlLmxlbmd0aH0gc2F2ZWRgICAgOiAnJyxcbiAgXS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgYm9keS5pbm5lckhUTUwgPVxuICAgIF9yZW5kZXJSZWNlbnRzU3RyaXAoYnlEYXRlLnNsaWNlKDAsIDUpKSArXG4gICAgYDxkaXYgY2xhc3M9XCJzbS10YWJsZS13cmFwXCI+YCArXG4gICAgICBgPGRpdiBjbGFzcz1cInNtLXRhYmxlLWluZm9cIj4ke3BhcnRzLmpvaW4oJyBcXHUwMGI3ICcpfTwvZGl2PmAgK1xuICAgICAgX3JlbmRlclNlc3Npb25UYWJsZUhlYWRlcigpICtcbiAgICAgIGA8ZGl2IGNsYXNzPVwic20tdGJvZHlcIj4ke3NvcnRlZC5tYXAoX3JlbmRlclNlc3Npb25UYWJsZVJvdykuam9pbignJyl9PC9kaXY+YCArXG4gICAgYDwvZGl2PmA7XG59XG5cbmZ1bmN0aW9uIF9oYW5kbGVTZXNzaW9uTW9kYWxDbGljayhlKSB7XG4gIGNvbnN0IHNvcnRCdG4gPSBlLnRhcmdldC5jbG9zZXN0KCdbZGF0YS1zbS1zb3J0XScpO1xuICBpZiAoc29ydEJ0bikgeyBfc2V0U21Tb3J0KHNvcnRCdG4uZGF0YXNldC5zbVNvcnQpOyByZXR1cm47IH1cblxuICBjb25zdCBidG4gPSBlLnRhcmdldC5jbG9zZXN0KCdbZGF0YS1zbS1hY3Rpb25dJyk7XG4gIGlmICghYnRuKSByZXR1cm47XG4gIGNvbnN0IHBhdGggICA9IGJ0bi5kYXRhc2V0LnNtUGF0aDtcbiAgY29uc3QgaWR4ICAgID0gcGFyc2VJbnQoYnRuLmRhdGFzZXQuc21JZHggPz8gJy0xJywgMTApO1xuICBjb25zdCBhY3Rpb24gPSBidG4uZGF0YXNldC5zbUFjdGlvbjtcbiAgaWYgICAgICAoYWN0aW9uID09PSAncmVuYW1lJykgICAgICAgIHN0YXJ0U2Vzc2lvbk1vZGFsUmVuYW1lKHBhdGgsIGlkeCk7XG4gIGVsc2UgaWYgKGFjdGlvbiA9PT0gJ3N1Ym1pdC1yZW5hbWUnKSBzdWJtaXRTZXNzaW9uTW9kYWxSZW5hbWUocGF0aCwgaWR4KTtcbiAgZWxzZSBpZiAoYWN0aW9uID09PSAnY2FuY2VsLXJlbmFtZScpIGNhbmNlbFNlc3Npb25Nb2RhbFJlbmFtZShpZHgpO1xuICBlbHNlIGlmIChhY3Rpb24gPT09ICdlZGl0LXN0YXR1cycpICAgc3RhcnRTZXNzaW9uU3RhdHVzRWRpdChpZHgpO1xuICBlbHNlIGlmIChhY3Rpb24gPT09ICdzdWJtaXQtc3RhdHVzJykgc3VibWl0U2Vzc2lvblN0YXR1c0VkaXQocGF0aCwgaWR4KTtcbiAgZWxzZSBpZiAoYWN0aW9uID09PSAnY2FuY2VsLXN0YXR1cycpIGNhbmNlbFNlc3Npb25TdGF0dXNFZGl0KGlkeCk7XG4gIGVsc2UgaWYgKGFjdGlvbiA9PT0gJ2VkaXQtbm90ZXMnKSAgICBzdGFydFNlc3Npb25Ob3Rlc0VkaXQoaWR4KTtcbiAgZWxzZSBpZiAoYWN0aW9uID09PSAnc3VibWl0LW5vdGVzJykgIHN1Ym1pdFNlc3Npb25Ob3Rlc0VkaXQocGF0aCwgaWR4KTtcbiAgZWxzZSBpZiAoYWN0aW9uID09PSAnY2FuY2VsLW5vdGVzJykgIGNhbmNlbFNlc3Npb25Ob3Rlc0VkaXQoaWR4KTtcbiAgZWxzZSBpZiAoYWN0aW9uID09PSAnbG9hZCcpICAgICAgICAgIGxvYWRTZXNzaW9uQW5kQ2xvc2VNb2RhbChwYXRoKTtcbiAgZWxzZSBpZiAoYWN0aW9uID09PSAnZHVwbGljYXRlJykgICAgIF9kdXBsaWNhdGVTZXNzaW9uRnJvbU1vZGFsKHBhdGgpO1xuICBlbHNlIGlmIChhY3Rpb24gPT09ICdkZWxldGUnKSAgICAgICAgX2RlbGV0ZVNlc3Npb25Gcm9tTW9kYWwocGF0aCwgZSk7XG59XG5cbmZ1bmN0aW9uIF9oYW5kbGVTZXNzaW9uTW9kYWxLZXlkb3duKGUpIHtcbiAgaWYgKChlLmtleSA9PT0gJ0VudGVyJyB8fCBlLmtleSA9PT0gJyAnKSAmJiBlLnRhcmdldC5jbG9zZXN0KCdbZGF0YS1zbS1zb3J0XScpKSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIF9zZXRTbVNvcnQoZS50YXJnZXQuY2xvc2VzdCgnW2RhdGEtc20tc29ydF0nKS5kYXRhc2V0LnNtU29ydCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGlucHV0ID0gZS50YXJnZXQuY2xvc2VzdCgnLnNtLWtleS1pbnB1dCcpO1xuICBpZiAoIWlucHV0KSByZXR1cm47XG4gIGNvbnN0IHBhdGggPSBpbnB1dC5kYXRhc2V0LnNtUGF0aDtcbiAgY29uc3QgaWR4ICA9IHBhcnNlSW50KGlucHV0LmRhdGFzZXQuc21JZHgsIDEwKTtcbiAgaWYgICAgICAoZS5rZXkgPT09ICdFbnRlcicpICBzdWJtaXRTZXNzaW9uTW9kYWxSZW5hbWUocGF0aCwgaWR4KTtcbiAgZWxzZSBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSBjYW5jZWxTZXNzaW9uTW9kYWxSZW5hbWUoaWR4KTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFNlc3Npb25zIG1vZGFsIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBvcGVuU2Vzc2lvbnNNb2RhbCh7IHJlcXVpcmVkID0gZmFsc2UgfSA9IHt9KSB7XG4gIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2Vzc2lvbnMtbW9kYWwtb3ZlcmxheScpO1xuICBpZiAoIW92ZXJsYXkpIHJldHVybjtcbiAgb3ZlcmxheS5kYXRhc2V0LmRpc21pc3NEaXNhYmxlZCA9IHJlcXVpcmVkID8gJzEnIDogJyc7XG4gIGNvbnN0IGNsb3NlWCAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Nlc3Npb25zLW1vZGFsLWNsb3NlLXgnKTtcbiAgY29uc3QgY2xvc2VGb290ZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2Vzc2lvbnMtbW9kYWwtY2xvc2UtZm9vdGVyJyk7XG4gIGlmIChjbG9zZVgpICAgICAgY2xvc2VYLnN0eWxlLmRpc3BsYXkgICAgICA9IHJlcXVpcmVkID8gJ25vbmUnIDogJyc7XG4gIGlmIChjbG9zZUZvb3RlcikgY2xvc2VGb290ZXIuc3R5bGUuZGlzcGxheSA9IHJlcXVpcmVkID8gJ25vbmUnIDogJyc7XG4gIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgd2luZG93Ll9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgYXdhaXQgX3JlbmRlclNlc3Npb25zTW9kYWxCb2R5KCk7XG4gIF9yZWZyZXNoVHJhc2hCYWRnZSgpO1xuICB0cmFwRm9jdXMoJ3Nlc3Npb25zLW1vZGFsLW92ZXJsYXknKTtcbiAgc2V0SW5pdGlhbEZvY3VzKCdzZXNzaW9ucy1tb2RhbC1vdmVybGF5Jyk7XG59XG5cbmZ1bmN0aW9uIGNsb3NlU2Vzc2lvbnNNb2RhbCgpIHtcbiAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXNzaW9ucy1tb2RhbC1vdmVybGF5Jyk7XG4gIGlmICghb3ZlcmxheSkgcmV0dXJuO1xuICBpZiAob3ZlcmxheS5kYXRhc2V0LmRpc21pc3NEaXNhYmxlZCA9PT0gJzEnKSByZXR1cm47XG4gIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgcmVzdG9yZUZvY3VzKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9yZW5kZXJTZXNzaW9uc01vZGFsQm9keSgpIHtcbiAgY29uc3QgYm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXNzaW9ucy1tb2RhbC1ib2R5Jyk7XG4gIGlmICghYm9keSkgcmV0dXJuO1xuICBib2R5LmlubmVySFRNTCA9ICc8ZGl2IHN0eWxlPVwicGFkZGluZzoyNHB4O2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjtnYXA6MTBweDtjb2xvcjojNmI3MjgwO1wiPjxzcGFuIGNsYXNzPVwibG9hZGluZy1zcGlubmVyXCI+PC9zcGFuPiBMb2FkaW5nIHNlc3Npb25zXFx1MjAyNjwvZGl2Pic7XG4gIHRyeSB7XG4gICAgY29uc3QgW2FjdGl2ZVJlcywgc2F2ZWRSZXNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgZmV0Y2goJy9hcGkvc2Vzc2lvbnMvYWN0aXZlJyksXG4gICAgICBmZXRjaCgnL2FwaS9zZXNzaW9ucycpLFxuICAgIF0pO1xuICAgIF9zbUFjdGl2ZUNhY2hlID0gYWN0aXZlUmVzLm9rID8gKChhd2FpdCBhY3RpdmVSZXMuanNvbigpKS5zZXNzaW9ucyB8fCBbXSkgOiBbXTtcbiAgICBjb25zdCBzYXZlZERhdGEgPSBzYXZlZFJlcy5vayA/IHBhcnNlU2Vzc2lvbkxpc3RSZXNwb25zZShhd2FpdCBzYXZlZFJlcy5qc29uKCkpIDogeyBzZXNzaW9uczogW10gfTtcbiAgICBfc21TYXZlZENhY2hlICAgPSBzYXZlZERhdGEuc2Vzc2lvbnMgfHwgW107XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBib2R5LmlubmVySFRNTCA9IGA8cCBzdHlsZT1cInBhZGRpbmc6MjBweDtjb2xvcjojZWY0NDQ0O1wiPkNvdWxkIG5vdCBsb2FkIHNlc3Npb25zOiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX08L3A+YDtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gV2lyZSBldmVudCBkZWxlZ2F0aW9uIG9uY2U7IHBlcnNpc3RzIGFjcm9zcyByZS1yZW5kZXJzIHNpbmNlIGJvZHkgZWxlbWVudCBpcyBzdGFibGVcbiAgaWYgKCFib2R5Ll9zbUxpc3RlbmVyQXR0YWNoZWQpIHtcbiAgICBib2R5Ll9zbUxpc3RlbmVyQXR0YWNoZWQgPSB0cnVlO1xuICAgIGJvZHkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAgIF9oYW5kbGVTZXNzaW9uTW9kYWxDbGljayk7XG4gICAgYm9keS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgX2hhbmRsZVNlc3Npb25Nb2RhbEtleWRvd24pO1xuICB9XG4gIF9yZW5kZXJTZXNzaW9uVGFibGVGcm9tQ2FjaGUoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9hZFNlc3Npb25BbmRDbG9zZU1vZGFsKHBhdGgpIHtcbiAgLy8gQ2xlYXIgZGlzbWlzc0Rpc2FibGVkIHNvIGxvYWRpbmcgYSBzZXNzaW9uIGFsd2F5cyBjbG9zZXMgdGhlIG1vZGFsLFxuICAvLyBldmVuIHdoZW4gaXQgd2FzIG9wZW5lZCBpbiByZXF1aXJlZCAoc3RhcnR1cCkgbW9kZS5cbiAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXNzaW9ucy1tb2RhbC1vdmVybGF5Jyk7XG4gIGlmIChvdmVybGF5KSBvdmVybGF5LmRhdGFzZXQuZGlzbWlzc0Rpc2FibGVkID0gJyc7XG4gIGNsb3NlU2Vzc2lvbnNNb2RhbCgpO1xuICBhd2FpdCBsb2FkU2Vzc2lvbkZpbGUocGF0aCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG5ld1Nlc3Npb25Gcm9tTW9kYWwoKSB7XG4gIGNsb3NlU2Vzc2lvbnNNb2RhbCgpO1xuICBhd2FpdCBjcmVhdGVOZXdTZXNzaW9uQW5kTmF2aWdhdGUoKTtcbn1cblxuZnVuY3Rpb24gc3RhcnRTZXNzaW9uTW9kYWxSZW5hbWUocGF0aCwgaWR4KSB7XG4gIGNvbnN0IG5hbWVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzbS1uYW1lLSR7aWR4fWApO1xuICBjb25zdCBmb3JtICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc20tcmVuYW1lLSR7aWR4fWApO1xuICBpZiAobmFtZUVsKSBuYW1lRWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgaWYgKGZvcm0pICAgZm9ybS5zdHlsZS5kaXNwbGF5ICAgPSAnZmxleCc7XG4gIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNtLWlucHV0LSR7aWR4fWApO1xuICBpZiAoaW5wdXQpIHsgaW5wdXQuZm9jdXMoKTsgaW5wdXQuc2VsZWN0KCk7IH1cbn1cblxuZnVuY3Rpb24gY2FuY2VsU2Vzc2lvbk1vZGFsUmVuYW1lKGlkeCkge1xuICBjb25zdCBuYW1lRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc20tbmFtZS0ke2lkeH1gKTtcbiAgY29uc3QgZm9ybSAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNtLXJlbmFtZS0ke2lkeH1gKTtcbiAgaWYgKGZvcm0pICAgZm9ybS5zdHlsZS5kaXNwbGF5ICAgPSAnbm9uZSc7XG4gIGlmIChuYW1lRWwpIG5hbWVFbC5zdHlsZS5kaXNwbGF5ID0gJyc7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN1Ym1pdFNlc3Npb25Nb2RhbFJlbmFtZShwYXRoLCBpZHgpIHtcbiAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc20taW5wdXQtJHtpZHh9YCk7XG4gIGlmICghaW5wdXQpIHJldHVybjtcbiAgY29uc3QgbmV3TmFtZSA9IGlucHV0LnZhbHVlLnRyaW0oKTtcbiAgaWYgKCFuZXdOYW1lKSByZXR1cm47XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL3JlbmFtZS1zZXNzaW9uJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBwYXRoLCBuZXdfbmFtZTogbmV3TmFtZSB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgY29uc3QgbmFtZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNtLW5hbWUtJHtpZHh9YCk7XG4gICAgICBpZiAobmFtZUVsKSBuYW1lRWwudGV4dENvbnRlbnQgPSBuZXdOYW1lO1xuICAgICAgY2FuY2VsU2Vzc2lvbk1vZGFsUmVuYW1lKGlkeCk7XG4gICAgICBhd2FpdCBmZXRjaFN0YXR1cygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHlwZW9mIHNob3dUb2FzdCA9PT0gJ2Z1bmN0aW9uJykgc2hvd1RvYXN0KGBSZW5hbWUgZmFpbGVkOiAke2RhdGEuZXJyb3J9YCwgJ2Vycm9yJyk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7IGlmICh0eXBlb2Ygc2hvd1RvYXN0ID09PSAnZnVuY3Rpb24nKSBzaG93VG9hc3QoYFJlbmFtZSBlcnJvcjogJHtlLm1lc3NhZ2V9YCwgJ2Vycm9yJyk7IH1cbn1cblxuZnVuY3Rpb24gc3RhcnRTZXNzaW9uU3RhdHVzRWRpdChpZHgpIHtcbiAgY29uc3QgcGhhc2VFbCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc20tcGhhc2UtJHtpZHh9YCk7XG4gIGNvbnN0IGVkaXRXaWRnZXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc20tc3RhdHVzLWVkaXQtJHtpZHh9YCk7XG4gIGlmIChwaGFzZUVsKSAgICBwaGFzZUVsLnN0eWxlLmRpc3BsYXkgICAgPSAnbm9uZSc7XG4gIGlmIChlZGl0V2lkZ2V0KSBlZGl0V2lkZ2V0LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIGNvbnN0IHNlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzbS1zdGF0dXMtc2VsLSR7aWR4fWApO1xuICBpZiAoc2VsKSBzZWwuZm9jdXMoKTtcbn1cblxuZnVuY3Rpb24gY2FuY2VsU2Vzc2lvblN0YXR1c0VkaXQoaWR4KSB7XG4gIGNvbnN0IHBoYXNlRWwgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc20tcGhhc2UtJHtpZHh9YCk7XG4gIGNvbnN0IGVkaXRXaWRnZXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc20tc3RhdHVzLWVkaXQtJHtpZHh9YCk7XG4gIGlmIChlZGl0V2lkZ2V0KSBlZGl0V2lkZ2V0LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIGlmIChwaGFzZUVsKSAgICBwaGFzZUVsLnN0eWxlLmRpc3BsYXkgICAgPSAnJztcbn1cblxuYXN5bmMgZnVuY3Rpb24gc3VibWl0U2Vzc2lvblN0YXR1c0VkaXQocGF0aCwgaWR4KSB7XG4gIGNvbnN0IHNlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzbS1zdGF0dXMtc2VsLSR7aWR4fWApO1xuICBpZiAoIXNlbCkgcmV0dXJuO1xuICBjb25zdCBuZXdTdGF0dXMgPSBzZWwudmFsdWU7XG4gIGNvbnN0IF9hcHBTdGF0dXNMYWJlbHMgPSB7XG4gICAgZHJhZnQ6ICdEcmFmdCcsIHJlYWR5OiAnUmVhZHknLCBzZW50OiAnU2VudCcsIHF1ZXVlZDogJ1F1ZXVlZCcsXG4gICAgaW50ZXJ2aWV3OiAnSW50ZXJ2aWV3JywgcmVqZWN0ZWQ6ICdSZWplY3RlZCcsIGFjY2VwdGVkOiAnQWNjZXB0ZWQnLFxuICAgIHBhcmtlZDogJ1BhcmtlZCcsXG4gIH07XG4gIGNvbnN0IF9hcHBTdGF0dXNDb2xvcnMgPSB7XG4gICAgZHJhZnQ6ICcjOTRhM2I4JywgcmVhZHk6ICcjM2I4MmY2Jywgc2VudDogJyMyMmM1NWUnLCBxdWV1ZWQ6ICcjZWFiMzA4JyxcbiAgICBpbnRlcnZpZXc6ICcjYTg1NWY3JywgcmVqZWN0ZWQ6ICcjZWY0NDQ0JywgYWNjZXB0ZWQ6ICcjMDU5NjY5JyxcbiAgICBwYXJrZWQ6ICcjZjk3MzE2JyxcbiAgfTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvc2Vzc2lvbnMvbWV0YWRhdGEnLCB7XG4gICAgICBtZXRob2Q6ICdQQVRDSCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBwYXRoLCBhcHBsaWNhdGlvbl9zdGF0dXM6IG5ld1N0YXR1cyB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgY29uc3QgYmFkZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc20tc3RhdHVzLWJhZGdlLSR7aWR4fWApO1xuICAgICAgaWYgKGJhZGdlKSB7XG4gICAgICAgIGlmIChuZXdTdGF0dXMgJiYgX2FwcFN0YXR1c0xhYmVsc1tuZXdTdGF0dXNdKSB7XG4gICAgICAgICAgYmFkZ2UudGV4dENvbnRlbnQgPSBfYXBwU3RhdHVzTGFiZWxzW25ld1N0YXR1c107XG4gICAgICAgICAgYmFkZ2Uuc3R5bGUuY3NzVGV4dCA9IGBmb250LXNpemU6MC43NWVtO3BhZGRpbmc6MXB4IDZweDtib3JkZXItcmFkaXVzOjlweDtiYWNrZ3JvdW5kOiR7X2FwcFN0YXR1c0NvbG9yc1tuZXdTdGF0dXNdfTtjb2xvcjojZmZmO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtgO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJhZGdlLnRleHRDb250ZW50ID0gJyc7XG4gICAgICAgICAgYmFkZ2Uuc3R5bGUuY3NzVGV4dCA9ICcnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjYW5jZWxTZXNzaW9uU3RhdHVzRWRpdChpZHgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHlwZW9mIHNob3dUb2FzdCA9PT0gJ2Z1bmN0aW9uJykgc2hvd1RvYXN0KGBTdGF0dXMgdXBkYXRlIGZhaWxlZDogJHtkYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yJ31gLCAnZXJyb3InKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAodHlwZW9mIHNob3dUb2FzdCA9PT0gJ2Z1bmN0aW9uJykgc2hvd1RvYXN0KGBTdGF0dXMgdXBkYXRlIGVycm9yOiAke2UubWVzc2FnZX1gLCAnZXJyb3InKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzdGFydFNlc3Npb25Ob3Rlc0VkaXQoaWR4KSB7XG4gIGNvbnN0IGVkaXRXaWRnZXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc20tbm90ZXMtZWRpdC0ke2lkeH1gKTtcbiAgY29uc3QgcHJldmlldyAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzbS1ub3Rlcy1wcmV2aWV3LSR7aWR4fWApO1xuICBpZiAocHJldmlldykgICAgcHJldmlldy5zdHlsZS5kaXNwbGF5ICAgID0gJ25vbmUnO1xuICBpZiAoZWRpdFdpZGdldCkgZWRpdFdpZGdldC5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICBjb25zdCB0YSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzbS1ub3Rlcy10YS0ke2lkeH1gKTtcbiAgaWYgKHRhKSB7IHRhLmZvY3VzKCk7IHRhLnNlbGVjdGlvblN0YXJ0ID0gdGEuc2VsZWN0aW9uRW5kID0gdGEudmFsdWUubGVuZ3RoOyB9XG59XG5cbmZ1bmN0aW9uIGNhbmNlbFNlc3Npb25Ob3Rlc0VkaXQoaWR4KSB7XG4gIGNvbnN0IGVkaXRXaWRnZXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc20tbm90ZXMtZWRpdC0ke2lkeH1gKTtcbiAgY29uc3QgcHJldmlldyAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzbS1ub3Rlcy1wcmV2aWV3LSR7aWR4fWApO1xuICBpZiAoZWRpdFdpZGdldCkgZWRpdFdpZGdldC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBpZiAocHJldmlldykgICAgcHJldmlldy5zdHlsZS5kaXNwbGF5ICAgID0gJyc7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN1Ym1pdFNlc3Npb25Ob3Rlc0VkaXQocGF0aCwgaWR4KSB7XG4gIGNvbnN0IHRhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNtLW5vdGVzLXRhLSR7aWR4fWApO1xuICBpZiAoIXRhKSByZXR1cm47XG4gIGNvbnN0IG5ld05vdGVzID0gdGEudmFsdWU7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL3Nlc3Npb25zL21ldGFkYXRhJywge1xuICAgICAgbWV0aG9kOiAnUEFUQ0gnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcGF0aCwgbm90ZXM6IG5ld05vdGVzIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBjb25zdCBwcmV2aWV3ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNtLW5vdGVzLXByZXZpZXctJHtpZHh9YCk7XG4gICAgICBpZiAocHJldmlldykge1xuICAgICAgICBwcmV2aWV3LnRleHRDb250ZW50ID0gbmV3Tm90ZXM7XG4gICAgICAgIHByZXZpZXcudGl0bGUgICAgICAgPSBuZXdOb3RlcztcbiAgICAgICAgcHJldmlldy5zdHlsZS5kaXNwbGF5ID0gbmV3Tm90ZXMgPyAnJyA6ICdub25lJztcbiAgICAgIH1cbiAgICAgIGNhbmNlbFNlc3Npb25Ob3Rlc0VkaXQoaWR4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHNob3dUb2FzdChgTm90ZXMgdXBkYXRlIGZhaWxlZDogJHtkYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yJ31gLCAnZXJyb3InKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAodHlwZW9mIHNob3dUb2FzdCA9PT0gJ2Z1bmN0aW9uJykgc2hvd1RvYXN0KGBOb3RlcyB1cGRhdGUgZXJyb3I6ICR7ZS5tZXNzYWdlfWAsICdlcnJvcicpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9kZWxldGVTZXNzaW9uRnJvbU1vZGFsKHBhdGgsIGV2ZW50KSB7XG4gIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICBpZiAodHlwZW9mIGNvbmZpcm1EaWFsb2cgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25zdCBvayA9IGF3YWl0IGNvbmZpcm1EaWFsb2coJ01vdmUgdGhpcyBzZXNzaW9uIHRvIFRyYXNoPyBZb3UgY2FuIHJlc3RvcmUgaXQgZnJvbSB0aGUgVHJhc2ggdmlldy4nKTtcbiAgICBpZiAoIW9rKSByZXR1cm47XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvZGVsZXRlLXNlc3Npb24nLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHBhdGggfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgYXdhaXQgX3JlbmRlclNlc3Npb25zTW9kYWxCb2R5KCk7XG4gICAgICBhd2FpdCBfcmVmcmVzaFRyYXNoQmFkZ2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHNob3dUb2FzdChgRmFpbGVkIHRvIG1vdmUgc2Vzc2lvbiB0byBUcmFzaDogJHtkYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yJ31gLCAnZXJyb3InKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHsgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHNob3dUb2FzdChgRXJyb3I6ICR7ZS5tZXNzYWdlfWAsICdlcnJvcicpOyB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBEdXBsaWNhdGUgc2Vzc2lvbiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gX2R1cGxpY2F0ZVNlc3Npb25Gcm9tTW9kYWwocGF0aCkge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9zZXNzaW9ucy9kdXBsaWNhdGUnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHBhdGggfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEub2spIHtcbiAgICAgIGF3YWl0IF9yZW5kZXJTZXNzaW9uc01vZGFsQm9keSgpO1xuICAgICAgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHNob3dUb2FzdChgU2Vzc2lvbiBkdXBsaWNhdGVkOiBcIiR7ZGF0YS5uZXdfbmFtZX1cImApO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHlwZW9mIHNob3dUb2FzdCA9PT0gJ2Z1bmN0aW9uJykgc2hvd1RvYXN0KGBGYWlsZWQgdG8gZHVwbGljYXRlIHNlc3Npb246ICR7ZGF0YS5lcnJvciB8fCAnVW5rbm93biBlcnJvcid9YCwgJ2Vycm9yJyk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7IGlmICh0eXBlb2Ygc2hvd1RvYXN0ID09PSAnZnVuY3Rpb24nKSBzaG93VG9hc3QoYEVycm9yOiAke2UubWVzc2FnZX1gLCAnZXJyb3InKTsgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgVHJhc2ggYmFkZ2UgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIF9yZWZyZXNoVHJhc2hCYWRnZSgpIHtcbiAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Nlc3Npb25zLXRyYXNoLWJ0bicpO1xuICBpZiAoIWJ0bikgcmV0dXJuO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS90cmFzaCcpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGNvbnN0IG4gPSAoZGF0YS5pdGVtcyB8fCBbXSkubGVuZ3RoO1xuICAgIGJ0bi50ZXh0Q29udGVudCA9IG4gPiAwID8gYFx1RDgzRFx1REREMSBUcmFzaCAoJHtufSlgIDogJ1x1RDgzRFx1REREMSBUcmFzaCc7XG4gIH0gY2F0Y2ggKF8pIHsgLyogaWdub3JlICovIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIFRyYXNoIHZpZXcgKGlubGluZSBpbiBzZXNzaW9ucyBtb2RhbCkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIG9wZW5UcmFzaFZpZXcoKSB7XG4gIGNvbnN0IGJvZHkgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXNzaW9ucy1tb2RhbC1ib2R5Jyk7XG4gIGNvbnN0IGZvb3RlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzZXNzaW9ucy1tb2RhbC1vdmVybGF5IC5tb2RhbC1mb290ZXInKTtcbiAgaWYgKCFib2R5KSByZXR1cm47XG5cbiAgYm9keS5pbm5lckhUTUwgPSAnPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjEycHg7cGFkZGluZzoyNHB4O2NvbG9yOiM2YjcyODA7XCI+PGRpdiBjbGFzcz1cImxvYWRpbmctc3Bpbm5lclwiIHN0eWxlPVwid2lkdGg6MjBweDtoZWlnaHQ6MjBweDtib3JkZXItd2lkdGg6MnB4O2ZsZXgtc2hyaW5rOjA7XCI+PC9kaXY+PHNwYW4+TG9hZGluZyB0cmFzaFx1MjAyNjwvc3Bhbj48L2Rpdj4nO1xuXG4gIGlmIChmb290ZXIpIHtcbiAgICBmb290ZXIuaW5uZXJIVE1MID0gYFxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwiZW1wdHlUcmFzaCgpXCJcbiAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZWUyZTI7Y29sb3I6I2RjMjYyNjtib3JkZXItY29sb3I6I2ZlY2FjYTtcIj5FbXB0eSBUcmFzaDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwiY2xvc2VUcmFzaFZpZXcoKVwiPlx1MjE5MCBCYWNrPC9idXR0b24+YDtcbiAgfVxuXG4gIGF3YWl0IF9yZW5kZXJUcmFzaFZpZXcoKTtcbn1cblxuZnVuY3Rpb24gY2xvc2VUcmFzaFZpZXcoKSB7XG4gIGNvbnN0IGZvb3RlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzZXNzaW9ucy1tb2RhbC1vdmVybGF5IC5tb2RhbC1mb290ZXInKTtcbiAgaWYgKGZvb3Rlcikge1xuICAgIGZvb3Rlci5pbm5lckhUTUwgPSBgXG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0blwiIG9uY2xpY2s9XCJuZXdTZXNzaW9uRnJvbU1vZGFsKClcIlxuICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6IzEwYjk4MTtjb2xvcjojZmZmO2JvcmRlci1jb2xvcjojMTBiOTgxO1wiPlx1RkYwQiBOZXcgU2Vzc2lvbjwvYnV0dG9uPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6OHB4O2FsaWduLWl0ZW1zOmNlbnRlcjtcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInNlc3Npb25zLXRyYXNoLWJ0blwiIGNsYXNzPVwiYWN0aW9uLWJ0blwiXG4gICAgICAgICAgb25jbGljaz1cIm9wZW5UcmFzaFZpZXcoKVwiXG4gICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmMWY1Zjk7Y29sb3I6IzY0NzQ4Yjtib3JkZXItY29sb3I6I2UyZThmMDtcIj5cdUQ4M0RcdURERDEgVHJhc2g8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwiY2xvc2VTZXNzaW9uc01vZGFsKClcIj5DbG9zZTwvYnV0dG9uPlxuICAgICAgPC9kaXY+YDtcbiAgfVxuICBfcmVuZGVyU2Vzc2lvbnNNb2RhbEJvZHkoKTtcbiAgX3JlZnJlc2hUcmFzaEJhZGdlKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9yZW5kZXJUcmFzaFZpZXcoKSB7XG4gIGNvbnN0IGJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2Vzc2lvbnMtbW9kYWwtYm9keScpO1xuICBpZiAoIWJvZHkpIHJldHVybjtcbiAgbGV0IGl0ZW1zID0gW107XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL3RyYXNoJyk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaXRlbXMgPSBkYXRhLml0ZW1zIHx8IFtdO1xuICB9IGNhdGNoIChlKSB7XG4gICAgYm9keS5pbm5lckhUTUwgPSBgPHAgc3R5bGU9XCJwYWRkaW5nOjIwcHg7Y29sb3I6I2VmNDQ0NDtcIj5Db3VsZCBub3QgbG9hZCB0cmFzaDogJHtlc2NhcGVIdG1sKGUubWVzc2FnZSl9PC9wPmA7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChpdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICBib2R5LmlubmVySFRNTCA9ICc8cCBzdHlsZT1cInBhZGRpbmc6MjRweDt0ZXh0LWFsaWduOmNlbnRlcjtjb2xvcjojNmI3MjgwO1wiPlRyYXNoIGlzIGVtcHR5LjwvcD4nO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZtdERhdGUodHMpIHtcbiAgICBpZiAoIXRzKSByZXR1cm4gJyc7XG4gICAgdHJ5IHsgcmV0dXJuIG5ldyBEYXRlKHRzKS50b0xvY2FsZURhdGVTdHJpbmcoJ2VuLVVTJywgeyBtb250aDogJ3Nob3J0JywgZGF5OiAnbnVtZXJpYycsIHllYXI6ICdudW1lcmljJyB9KTsgfVxuICAgIGNhdGNoIHsgcmV0dXJuIHRzLnNsaWNlKDAsIDEwKTsgfVxuICB9XG5cbiAgbGV0IGh0bWwgPSAnPHRhYmxlIHN0eWxlPVwid2lkdGg6MTAwJTtib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7XCI+JztcbiAgaXRlbXMuZm9yRWFjaChzID0+IHtcbiAgICBjb25zdCBlcCA9IGVzY2FwZUh0bWwocy5wYXRoKTtcbiAgICBodG1sICs9IGBcbiAgICAgIDx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206MXB4IHNvbGlkICNmMWY1Zjk7dmVydGljYWwtYWxpZ246dG9wO1wiPlxuICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOjEycHggMTZweDtcIj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6NjAwO2NvbG9yOiMxZTI5M2I7XCI+JHtlc2NhcGVIdG1sKHMucG9zaXRpb25fbmFtZSB8fCAnVW50aXRsZWQnKX08L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjEycHg7Y29sb3I6Izk0YTNiODttYXJnaW4tdG9wOjJweDtcIj4ke2ZtdERhdGUocy50aW1lc3RhbXApfSR7cy5waGFzZSA/ICcgXHUwMEI3ICcgKyBlc2NhcGVIdG1sKHMucGhhc2UpIDogJyd9PC9kaXY+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cInBhZGRpbmc6MTJweCAxNnB4O3doaXRlLXNwYWNlOm5vd3JhcDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7XCI+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6NnB4O1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLXRyYXNoLWFjdGlvbj1cInJlc3RvcmVcIiBkYXRhLXRyYXNoLXBhdGg9XCIke2VwfVwiXG4gICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDojZGJlYWZlO2NvbG9yOiMxZDRlZDg7Ym9yZGVyOjFweCBzb2xpZCAjYmZkYmZlO2JvcmRlci1yYWRpdXM6NnB4O3BhZGRpbmc6NnB4IDEycHg7Zm9udC1zaXplOjEzcHg7Zm9udC13ZWlnaHQ6NjAwO2N1cnNvcjpwb2ludGVyO1wiPlJlc3RvcmU8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gZGF0YS10cmFzaC1hY3Rpb249XCJkZWxldGUtZm9yZXZlclwiIGRhdGEtdHJhc2gtcGF0aD1cIiR7ZXB9XCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZWUyZTI7Y29sb3I6I2RjMjYyNjtib3JkZXI6MXB4IHNvbGlkICNmZWNhY2E7Ym9yZGVyLXJhZGl1czo2cHg7cGFkZGluZzo2cHggOHB4O2ZvbnQtc2l6ZToxM3B4O2N1cnNvcjpwb2ludGVyO1wiIHRpdGxlPVwiRGVsZXRlIHBlcm1hbmVudGx5XCIgYXJpYS1sYWJlbD1cIkRlbGV0ZSBwZXJtYW5lbnRseVwiPlx1MjcxNTwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3RkPlxuICAgICAgPC90cj5gO1xuICB9KTtcbiAgaHRtbCArPSAnPC90YWJsZT4nO1xuICBjb25zdCB0cmFzaFdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgdHJhc2hXcmFwcGVyLmlubmVySFRNTCA9IGh0bWw7XG4gIGJvZHkuaW5uZXJIVE1MID0gJyc7XG4gIGJvZHkuYXBwZW5kQ2hpbGQodHJhc2hXcmFwcGVyKTtcbiAgLy8gV2lyZSB1cCB0cmFzaCBhY3Rpb24gYnV0dG9ucyB2aWEgZXZlbnQgZGVsZWdhdGlvblxuICB0cmFzaFdyYXBwZXIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBlID0+IHtcbiAgICBjb25zdCBidG4gPSBlLnRhcmdldC5jbG9zZXN0KCdbZGF0YS10cmFzaC1hY3Rpb25dJyk7XG4gICAgaWYgKCFidG4pIHJldHVybjtcbiAgICBjb25zdCBwYXRoICAgPSBidG4uZGF0YXNldC50cmFzaFBhdGg7XG4gICAgY29uc3QgYWN0aW9uID0gYnRuLmRhdGFzZXQudHJhc2hBY3Rpb247XG4gICAgaWYgICAgICAoYWN0aW9uID09PSAncmVzdG9yZScpICAgICAgICByZXN0b3JlRnJvbVRyYXNoKHBhdGgpO1xuICAgIGVsc2UgaWYgKGFjdGlvbiA9PT0gJ2RlbGV0ZS1mb3JldmVyJykgZGVsZXRlRm9yZXZlcihwYXRoKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc3RvcmVGcm9tVHJhc2gocGF0aCkge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS90cmFzaC9yZXN0b3JlJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBwYXRoIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHsgYXdhaXQgX3JlbmRlclRyYXNoVmlldygpOyBhd2FpdCBfcmVmcmVzaFRyYXNoQmFkZ2UoKTsgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHNob3dUb2FzdChgUmVzdG9yZSBmYWlsZWQ6ICR7ZGF0YS5lcnJvciB8fCAnVW5rbm93biBlcnJvcid9YCwgJ2Vycm9yJyk7XG4gIH0gY2F0Y2ggKGUpIHsgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHNob3dUb2FzdChgRXJyb3I6ICR7ZS5tZXNzYWdlfWAsICdlcnJvcicpOyB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUZvcmV2ZXIocGF0aCkge1xuICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCBjb25maXJtRGlhbG9nKFxuICAgICdQZXJtYW5lbnRseSBkZWxldGUgdGhpcyBzZXNzaW9uPyBUaGlzIGNhbm5vdCBiZSB1bmRvbmUuJyxcbiAgICB7IGNvbmZpcm1MYWJlbDogJ0RlbGV0ZSBGb3JldmVyJywgY2FuY2VsTGFiZWw6ICdDYW5jZWwnLCBkYW5nZXI6IHRydWUgfVxuICApO1xuICBpZiAoIWNvbmZpcm1lZCkgcmV0dXJuO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS90cmFzaC9kZWxldGUnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHBhdGggfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEuc3VjY2VzcykgeyBhd2FpdCBfcmVuZGVyVHJhc2hWaWV3KCk7IGF3YWl0IF9yZWZyZXNoVHJhc2hCYWRnZSgpOyB9XG4gICAgZWxzZSBpZiAodHlwZW9mIHNob3dUb2FzdCA9PT0gJ2Z1bmN0aW9uJykgc2hvd1RvYXN0KGBEZWxldGUgZmFpbGVkOiAke2RhdGEuZXJyb3IgfHwgJ1Vua25vd24gZXJyb3InfWAsICdlcnJvcicpO1xuICB9IGNhdGNoIChlKSB7IGlmICh0eXBlb2Ygc2hvd1RvYXN0ID09PSAnZnVuY3Rpb24nKSBzaG93VG9hc3QoYEVycm9yOiAke2UubWVzc2FnZX1gLCAnZXJyb3InKTsgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBlbXB0eVRyYXNoKCkge1xuICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCBjb25maXJtRGlhbG9nKFxuICAgICdQZXJtYW5lbnRseSBkZWxldGUgYWxsIGl0ZW1zIGluIFRyYXNoPyBUaGlzIGNhbm5vdCBiZSB1bmRvbmUuJyxcbiAgICB7IGNvbmZpcm1MYWJlbDogJ0VtcHR5IFRyYXNoJywgY2FuY2VsTGFiZWw6ICdDYW5jZWwnLCBkYW5nZXI6IHRydWUgfVxuICApO1xuICBpZiAoIWNvbmZpcm1lZCkgcmV0dXJuO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS90cmFzaC9lbXB0eScsIHsgbWV0aG9kOiAnUE9TVCcgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEuc3VjY2VzcykgeyBhd2FpdCBfcmVuZGVyVHJhc2hWaWV3KCk7IGF3YWl0IF9yZWZyZXNoVHJhc2hCYWRnZSgpOyB9XG4gICAgZWxzZSBpZiAodHlwZW9mIHNob3dUb2FzdCA9PT0gJ2Z1bmN0aW9uJykgc2hvd1RvYXN0KGBGYWlsZWQgdG8gZW1wdHkgdHJhc2g6ICR7ZGF0YS5lcnJvciB8fCAnVW5rbm93biBlcnJvcid9YCwgJ2Vycm9yJyk7XG4gIH0gY2F0Y2ggKGUpIHsgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHNob3dUb2FzdChgRXJyb3I6ICR7ZS5tZXNzYWdlfWAsICdlcnJvcicpOyB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFeHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5leHBvcnQge1xuICBfcmVuZGVyQWN0aXZlU2Vzc2lvblJvd3MsXG4gIF9yZW5kZXJTYXZlZFNlc3Npb25Sb3dzLFxuICBfcmVuZGVyU2Vzc2lvblN3aXRjaGVyU2VjdGlvbnMsXG4gIF91cGRhdGVTZXNzaW9uU3dpdGNoZXJIZWFkZXIsXG4gIHNob3dPd25lcnNoaXBDb25mbGljdERpYWxvZyxcbiAgY2xvc2VPd25lcnNoaXBDb25mbGljdERpYWxvZyxcbiAgb3BlblNlc3Npb25zTW9kYWwsXG4gIGNsb3NlU2Vzc2lvbnNNb2RhbCxcbiAgX3JlbmRlclNlc3Npb25zTW9kYWxCb2R5LFxuICBsb2FkU2Vzc2lvbkFuZENsb3NlTW9kYWwsXG4gIG5ld1Nlc3Npb25Gcm9tTW9kYWwsXG4gIHN0YXJ0U2Vzc2lvbk1vZGFsUmVuYW1lLFxuICBjYW5jZWxTZXNzaW9uTW9kYWxSZW5hbWUsXG4gIHN1Ym1pdFNlc3Npb25Nb2RhbFJlbmFtZSxcbiAgX2RlbGV0ZVNlc3Npb25Gcm9tTW9kYWwsXG4gIF9kdXBsaWNhdGVTZXNzaW9uRnJvbU1vZGFsLFxuICBfcmVmcmVzaFRyYXNoQmFkZ2UsXG4gIG9wZW5UcmFzaFZpZXcsXG4gIGNsb3NlVHJhc2hWaWV3LFxuICBfcmVuZGVyVHJhc2hWaWV3LFxuICByZXN0b3JlRnJvbVRyYXNoLFxuICBkZWxldGVGb3JldmVyLFxuICBlbXB0eVRyYXNoLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL2tleWJvYXJkLXNob3J0Y3V0cy5qcyBcdTIwMTQgR2xvYmFsIGtleWJvYXJkIHNob3J0Y3V0cyBmb3Igd29ya2Zsb3cgbmF2aWdhdGlvbi5cbiAqXG4gKiBTaG9ydGN1dHMgaW1wbGVtZW50ZWQ6XG4gKiAgIEN0cmwrRW50ZXIgICAgICAgVHJpZ2dlciB0aGUgcHJpbWFyeSBhY3Rpb24gYnV0dG9uIG9uIHRoZSBjdXJyZW50IHRhYlxuICogICBDdHJsK1NoaWZ0K1IgICAgIFJlLXJ1biB0aGUgY3VycmVudCB3b3JrZmxvdyBwaGFzZSAoY2FsbHMgY29uZmlybVJlUnVuUGhhc2UpXG4gKiAgIEEgICAgICAgICAgICAgICAgQWNjZXB0IHRoZSBmb2N1c2VkIHJldmlldyBjYXJkIChyZXdyaXRlIC8gc3BlbGwtY2hlY2sgdGFicylcbiAqICAgUiAgICAgICAgICAgICAgICBSZWplY3QgdGhlIGZvY3VzZWQgcmV2aWV3IGNhcmQgKHJld3JpdGUgLyBzcGVsbC1jaGVjayB0YWJzKVxuICogICBcdTIxOTEgLyBcdTIxOTMgICAgICAgICAgICBOYXZpZ2F0ZSBiZXR3ZWVuIHJldmlldyBjYXJkcyBvbiByZXZpZXcgdGFic1xuICogICBDdHJsK1ogICAgICAgICAgIFVuZG8gdGhlIG1vc3QgcmVjZW50IE1hc3RlciBDViBkYXRhIGNoYW5nZSAoTWFzdGVyIENWIG1vZGFsIG9ubHkpXG4gKiAgIEN0cmwrU2hpZnQrWiAgICAgUmVkbyB0aGUgcHJldmlvdXNseSB1bmRvbmUgTWFzdGVyIENWIGRhdGEgY2hhbmdlIChNYXN0ZXIgQ1YgbW9kYWwgb25seSlcbiAqICAgPyAgICAgICAgICAgICAgICBUb2dnbGUga2V5Ym9hcmQgc2hvcnRjdXQgaGVscCBwYW5lbFxuICovXG5cbi8qKiBUcmFjayB3aGljaCBjYXJkIGlzIGtleWJvYXJkLWZvY3VzZWQgb24gdGhlIGN1cnJlbnQgcmV2aWV3IHRhYi4gKi9cbmxldCBfZm9jdXNlZENhcmRJbmRleCA9IC0xO1xuXG4vKiogUmV0dXJucyB0cnVlIGlmIGZvY3VzIGlzIGluc2lkZSBhIHRleHQgaW5wdXQsIHNvIEEvUi9cdTIxOTEvXHUyMTkzIHNob3VsZCBub3QgZmlyZS4gKi9cbmZ1bmN0aW9uIF9pblRleHRJbnB1dCgpIHtcbiAgY29uc3QgZWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBpZiAoIWVsKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHRhZyA9IGVsLnRhZ05hbWU7XG4gIHJldHVybiB0YWcgPT09ICdJTlBVVCcgfHwgdGFnID09PSAnVEVYVEFSRUEnIHx8IHRhZyA9PT0gJ1NFTEVDVCcgfHwgZWwuaXNDb250ZW50RWRpdGFibGU7XG59XG5cbi8qKiBSZXR1cm5zIHRydWUgaWYgYW55IG1vZGFsIG92ZXJsYXkgaXMgY3VycmVudGx5IHZpc2libGUuICovXG5mdW5jdGlvbiBfbW9kYWxPcGVuKCkge1xuICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW3JvbGU9XCJkaWFsb2dcIl06bm90KFtzdHlsZSo9XCJkaXNwbGF5OiBub25lXCJdKTpub3QoW3N0eWxlKj1cImRpc3BsYXk6bm9uZVwiXSknKSAhPT0gbnVsbDtcbn1cblxuLyoqIFJldHVybnMgdHJ1ZSBpZiB0aGUgTWFzdGVyIENWIG1vZGFsICh3ZWIvaW5kZXguaHRtbCNtYXN0ZXItY3YtbW9kYWwtb3ZlcmxheSkgaXMgb3Blbi4gKi9cbmZ1bmN0aW9uIF9tYXN0ZXJDdk1vZGFsT3BlbigpIHtcbiAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWN2LW1vZGFsLW92ZXJsYXknKTtcbiAgcmV0dXJuICEhZWwgJiYgZWwuc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnO1xufVxuXG4vKipcbiAqIE1hcCB0YWIgSURzIHRvIHRoZWlyIHByaW1hcnkgYWN0aW9uIGJ1dHRvbiBJRHMuXG4gKiBCdXR0b25zIHRoYXQgbWlnaHQgYmUgZGlzYWJsZWQgYXQgcnVudGltZSBhcmUgc3RpbGwgY2xpY2tlZCBcdTIwMTQgdGhlIGJ1dHRvbidzXG4gKiBvd24gZGlzYWJsZWQgY2hlY2sgcHJldmVudHMgYWNjaWRlbnRhbCBzdWJtaXNzaW9uLlxuICovXG5jb25zdCBfVEFCX0FDVElPTl9CVE4gPSB7XG4gICdqb2InOiAgICAgICAgICAgICAgICAgICAnc2VuZC1idG4nLFxuICAnYW5hbHlzaXMnOiAgICAgICAgICAgICAgJ2FuYWx5emUtYnRuJyxcbiAgJ2dvYWxzJzogICAgICAgICAgICAgICAgICdyZWNvbW1lbmQtYnRuJyxcbiAgJ3Jld3JpdGUnOiAgICAgICAgICAgICAgICdyZXdyaXRlLWJ0bicsXG4gICdzcGVsbCc6ICAgICAgICAgICAgICAgICAnc3BlbGwtYnRuJyxcbiAgJ2ZpbmFsX2dlbmVyYXRlJzogICAgICAgICdnZW5lcmF0ZS1idG4nLFxuICAnbGF5b3V0JzogICAgICAgICAgICAgICAgJ2xheW91dC1idG4nLFxuICAnZG93bmxvYWQnOiAgICAgICAgICAgICAgJ2ZpbmFsLWdlbmVyYXRlLXByb2NlZWQtYnRuJyxcbiAgJ2ZpbmFsaXNlJzogICAgICAgICAgICAgICdmaW5hbGlzZS1hY3Rpb24tYnRuJyxcbn07XG5cbi8qKiBDbGljayB0aGUgcHJpbWFyeSBhY3Rpb24gYnV0dG9uIGZvciB0aGUgY3VycmVudCB0YWIgKEN0cmwrRW50ZXIpLiAqL1xuZnVuY3Rpb24gX3RyaWdnZXJQcmltYXJ5QWN0aW9uKCkge1xuICBjb25zdCB0YWIgPSB0eXBlb2Ygc3RhdGVNYW5hZ2VyICE9PSAndW5kZWZpbmVkJyA/IHN0YXRlTWFuYWdlci5nZXRDdXJyZW50VGFiKCkgOiBudWxsO1xuICBpZiAoIXRhYikgcmV0dXJuO1xuICBjb25zdCBidG5JZCA9IF9UQUJfQUNUSU9OX0JUTlt0YWJdO1xuICBpZiAoIWJ0bklkKSByZXR1cm47XG4gIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJ0bklkKTtcbiAgaWYgKGJ0biAmJiAhYnRuLmRpc2FibGVkKSBidG4uY2xpY2soKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIENhcmQgbmF2aWdhdGlvbiBoZWxwZXJzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4vKiogUmV0dXJuIHZpc2libGUgcmV2aWV3IGNhcmRzIGZvciB0aGUgY3VycmVudCB0YWIuICovXG5mdW5jdGlvbiBfZ2V0Q2FyZHMoKSB7XG4gIGNvbnN0IHRhYiA9IHR5cGVvZiBzdGF0ZU1hbmFnZXIgIT09ICd1bmRlZmluZWQnID8gc3RhdGVNYW5hZ2VyLmdldEN1cnJlbnRUYWIoKSA6IG51bGw7XG4gIGlmICh0YWIgPT09ICdyZXdyaXRlJykgcmV0dXJuIFsuLi5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucmV3cml0ZS1jYXJkJyldO1xuICBpZiAodGFiID09PSAnc3BlbGwnKSAgIHJldHVybiBbLi4uZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnNwZWxsLWNhcmQnKV07XG4gIHJldHVybiBbXTtcbn1cblxuLyoqIFZpc3VhbGx5IGhpZ2hsaWdodCBhIGNhcmQgYXMga2V5Ym9hcmQtZm9jdXNlZC4gKi9cbmZ1bmN0aW9uIF9oaWdobGlnaHRDYXJkKGNhcmRzLCBpZHgpIHtcbiAgY2FyZHMuZm9yRWFjaCgoYywgaSkgPT4ge1xuICAgIGlmIChpID09PSBpZHgpIHtcbiAgICAgIGMuY2xhc3NMaXN0LmFkZCgna2ItZm9jdXNlZCcpO1xuICAgICAgYy5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnbmVhcmVzdCcsIGJlaGF2aW9yOiAnc21vb3RoJyB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYy5jbGFzc0xpc3QucmVtb3ZlKCdrYi1mb2N1c2VkJyk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqIE1vdmUgdGhlIGtleWJvYXJkIGZvY3VzIHRvIGNhcmQgYXQgZGVsdGEgb2Zmc2V0IGZyb20gY3VycmVudC4gKi9cbmZ1bmN0aW9uIF9tb3ZlQ2FyZEZvY3VzKGRlbHRhKSB7XG4gIGNvbnN0IGNhcmRzID0gX2dldENhcmRzKCk7XG4gIGlmICghY2FyZHMubGVuZ3RoKSByZXR1cm47XG4gIF9mb2N1c2VkQ2FyZEluZGV4ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oY2FyZHMubGVuZ3RoIC0gMSwgX2ZvY3VzZWRDYXJkSW5kZXggKyBkZWx0YSkpO1xuICBfaGlnaGxpZ2h0Q2FyZChjYXJkcywgX2ZvY3VzZWRDYXJkSW5kZXgpO1xufVxuXG4vKiogQWNjZXB0IHRoZSBjdXJyZW50bHkga2V5Ym9hcmQtZm9jdXNlZCByZXdyaXRlIGNhcmQuICovXG5mdW5jdGlvbiBfYWNjZXB0Rm9jdXNlZENhcmQoKSB7XG4gIGNvbnN0IHRhYiA9IHR5cGVvZiBzdGF0ZU1hbmFnZXIgIT09ICd1bmRlZmluZWQnID8gc3RhdGVNYW5hZ2VyLmdldEN1cnJlbnRUYWIoKSA6IG51bGw7XG4gIGlmICh0YWIgPT09ICdyZXdyaXRlJykge1xuICAgIGNvbnN0IGNhcmRzID0gX2dldENhcmRzKCk7XG4gICAgaWYgKF9mb2N1c2VkQ2FyZEluZGV4IDwgMCB8fCBfZm9jdXNlZENhcmRJbmRleCA+PSBjYXJkcy5sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCBjYXJkID0gY2FyZHNbX2ZvY3VzZWRDYXJkSW5kZXhdO1xuICAgIGNvbnN0IGlkID0gY2FyZC5pZC5yZXBsYWNlKCdydy1jYXJkLScsICcnKTtcbiAgICBpZiAodHlwZW9mIGFwcGx5UmV3cml0ZUFjdGlvbiA9PT0gJ2Z1bmN0aW9uJykgYXBwbHlSZXdyaXRlQWN0aW9uKGlkLCAnYWNjZXB0Jyk7XG4gIH0gZWxzZSBpZiAodGFiID09PSAnc3BlbGwnKSB7XG4gICAgY29uc3QgY2FyZHMgPSBfZ2V0Q2FyZHMoKTtcbiAgICBpZiAoX2ZvY3VzZWRDYXJkSW5kZXggPCAwIHx8IF9mb2N1c2VkQ2FyZEluZGV4ID49IGNhcmRzLmxlbmd0aCkgcmV0dXJuO1xuICAgIC8vIHNwZWxsIGNhcmRzOiBmaW5kIHRoZSBhY2NlcHQgYnV0dG9uIHdpdGhpbiB0aGUgZm9jdXNlZCBjYXJkXG4gICAgY29uc3QgYnRuID0gY2FyZHNbX2ZvY3VzZWRDYXJkSW5kZXhdLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWFjdGlvbj1cImtlZXBcIl0sIC5zcGVsbC1rZWVwLWJ0bicpO1xuICAgIGlmIChidG4pIGJ0bi5jbGljaygpO1xuICB9XG59XG5cbi8qKiBSZWplY3QgdGhlIGN1cnJlbnRseSBrZXlib2FyZC1mb2N1c2VkIHJldmlldyBjYXJkLiAqL1xuZnVuY3Rpb24gX3JlamVjdEZvY3VzZWRDYXJkKCkge1xuICBjb25zdCB0YWIgPSB0eXBlb2Ygc3RhdGVNYW5hZ2VyICE9PSAndW5kZWZpbmVkJyA/IHN0YXRlTWFuYWdlci5nZXRDdXJyZW50VGFiKCkgOiBudWxsO1xuICBpZiAodGFiID09PSAncmV3cml0ZScpIHtcbiAgICBjb25zdCBjYXJkcyA9IF9nZXRDYXJkcygpO1xuICAgIGlmIChfZm9jdXNlZENhcmRJbmRleCA8IDAgfHwgX2ZvY3VzZWRDYXJkSW5kZXggPj0gY2FyZHMubGVuZ3RoKSByZXR1cm47XG4gICAgY29uc3QgY2FyZCA9IGNhcmRzW19mb2N1c2VkQ2FyZEluZGV4XTtcbiAgICBjb25zdCBpZCA9IGNhcmQuaWQucmVwbGFjZSgncnctY2FyZC0nLCAnJyk7XG4gICAgaWYgKHR5cGVvZiBhcHBseVJld3JpdGVBY3Rpb24gPT09ICdmdW5jdGlvbicpIGFwcGx5UmV3cml0ZUFjdGlvbihpZCwgJ3JlamVjdCcpO1xuICB9IGVsc2UgaWYgKHRhYiA9PT0gJ3NwZWxsJykge1xuICAgIGNvbnN0IGNhcmRzID0gX2dldENhcmRzKCk7XG4gICAgaWYgKF9mb2N1c2VkQ2FyZEluZGV4IDwgMCB8fCBfZm9jdXNlZENhcmRJbmRleCA+PSBjYXJkcy5sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCBidG4gPSBjYXJkc1tfZm9jdXNlZENhcmRJbmRleF0ucXVlcnlTZWxlY3RvcignW2RhdGEtYWN0aW9uPVwiYXBwbHlcIl0sIC5zcGVsbC1hcHBseS1idG4nKTtcbiAgICBpZiAoYnRuKSBidG4uY2xpY2soKTtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgU2hvcnRjdXQgaGVscCBwYW5lbCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuY29uc3QgX1BBTkVMX0lEID0gJ2tiLXNob3J0Y3V0cy1wYW5lbCc7XG5cbi8qKiBUb2dnbGUgdGhlIGtleWJvYXJkIHNob3J0Y3V0IGhlbHAgcGFuZWwuICovXG5leHBvcnQgZnVuY3Rpb24gc2hvd0tleWJvYXJkU2hvcnRjdXRzUGFuZWwoKSB7XG4gIGNvbnN0IGV4aXN0aW5nID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoX1BBTkVMX0lEKTtcbiAgaWYgKGV4aXN0aW5nKSB7IGV4aXN0aW5nLnJlbW92ZSgpOyByZXR1cm47IH1cblxuICBjb25zdCBwYW5lbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBwYW5lbC5pZCA9IF9QQU5FTF9JRDtcbiAgcGFuZWwuc2V0QXR0cmlidXRlKCdyb2xlJywgJ2RpYWxvZycpO1xuICBwYW5lbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbW9kYWwnLCAndHJ1ZScpO1xuICBwYW5lbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnS2V5Ym9hcmQgc2hvcnRjdXRzJyk7XG4gIHBhbmVsLmlubmVySFRNTCA9IGBcbiAgICA8ZGl2IGlkPVwia2Itc2hvcnRjdXRzLWlubmVyXCI+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2FsaWduLWl0ZW1zOmNlbnRlcjttYXJnaW4tYm90dG9tOjEycHhcIj5cbiAgICAgICAgPHN0cm9uZz5LZXlib2FyZCBTaG9ydGN1dHM8L3N0cm9uZz5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImtiLXNob3J0Y3V0cy1jbG9zZVwiIGFyaWEtbGFiZWw9XCJDbG9zZSBrZXlib2FyZCBzaG9ydGN1dHNcIiBzdHlsZT1cImJhY2tncm91bmQ6bm9uZTtib3JkZXI6bm9uZTtmb250LXNpemU6MS4yZW07Y3Vyc29yOnBvaW50ZXI7cGFkZGluZzoycHggNnB4XCI+XHUyNzE1PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDx0YWJsZSBzdHlsZT1cImJvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTt3aWR0aDoxMDAlXCI+XG4gICAgICAgIDx0Ym9keT5cbiAgICAgICAgICA8dHI+PHRkIHN0eWxlPVwicGFkZGluZzo0cHggMTJweCA0cHggMFwiPjxrYmQ+Q3RybDwva2JkPis8a2JkPkVudGVyPC9rYmQ+PC90ZD48dGQ+VHJpZ2dlciBwcmltYXJ5IGFjdGlvbiBvbiBjdXJyZW50IHN0ZXA8L3RkPjwvdHI+XG4gICAgICAgICAgPHRyPjx0ZCBzdHlsZT1cInBhZGRpbmc6NHB4IDEycHggNHB4IDBcIj48a2JkPkN0cmw8L2tiZD4rPGtiZD5TaGlmdDwva2JkPis8a2JkPlI8L2tiZD48L3RkPjx0ZD5SZS1ydW4gY3VycmVudCB3b3JrZmxvdyBwaGFzZTwvdGQ+PC90cj5cbiAgICAgICAgICA8dHI+PHRkIHN0eWxlPVwicGFkZGluZzo0cHggMTJweCA0cHggMFwiPjxrYmQ+XHUyMTkxPC9rYmQ+IC8gPGtiZD5cdTIxOTM8L2tiZD48L3RkPjx0ZD5OYXZpZ2F0ZSBiZXR3ZWVuIHJldmlldyBjYXJkczwvdGQ+PC90cj5cbiAgICAgICAgICA8dHI+PHRkIHN0eWxlPVwicGFkZGluZzo0cHggMTJweCA0cHggMFwiPjxrYmQ+QTwva2JkPjwvdGQ+PHRkPkFjY2VwdCBmb2N1c2VkIGNhcmQgKHJld3JpdGUgLyBzcGVsbCk8L3RkPjwvdHI+XG4gICAgICAgICAgPHRyPjx0ZCBzdHlsZT1cInBhZGRpbmc6NHB4IDEycHggNHB4IDBcIj48a2JkPlI8L2tiZD48L3RkPjx0ZD5SZWplY3QgZm9jdXNlZCBjYXJkIChyZXdyaXRlIC8gc3BlbGwpPC90ZD48L3RyPlxuICAgICAgICAgIDx0cj48dGQgc3R5bGU9XCJwYWRkaW5nOjRweCAxMnB4IDRweCAwXCI+PGtiZD5DdHJsPC9rYmQ+KzxrYmQ+Wjwva2JkPjwvdGQ+PHRkPlVuZG8gTWFzdGVyIENWIGNoYW5nZSAoTWFzdGVyIENWIG1vZGFsKTwvdGQ+PC90cj5cbiAgICAgICAgICA8dHI+PHRkIHN0eWxlPVwicGFkZGluZzo0cHggMTJweCA0cHggMFwiPjxrYmQ+Q3RybDwva2JkPis8a2JkPlNoaWZ0PC9rYmQ+KzxrYmQ+Wjwva2JkPjwvdGQ+PHRkPlJlZG8gTWFzdGVyIENWIGNoYW5nZSAoTWFzdGVyIENWIG1vZGFsKTwvdGQ+PC90cj5cbiAgICAgICAgICA8dHI+PHRkIHN0eWxlPVwicGFkZGluZzo0cHggMTJweCA0cHggMFwiPjxrYmQ+Pzwva2JkPjwvdGQ+PHRkPlRvZ2dsZSB0aGlzIGhlbHAgcGFuZWw8L3RkPjwvdHI+XG4gICAgICAgICAgPHRyPjx0ZCBzdHlsZT1cInBhZGRpbmc6NHB4IDEycHggNHB4IDBcIj48a2JkPkVzYzwva2JkPjwvdGQ+PHRkPkNsb3NlIG1vZGFscyAvIHRoaXMgcGFuZWw8L3RkPjwvdHI+XG4gICAgICAgIDwvdGJvZHk+XG4gICAgICA8L3RhYmxlPlxuICAgIDwvZGl2PmA7XG4gIE9iamVjdC5hc3NpZ24ocGFuZWwuc3R5bGUsIHtcbiAgICBwb3NpdGlvbjogICAnZml4ZWQnLFxuICAgIGJvdHRvbTogICAgICc4MHB4JyxcbiAgICByaWdodDogICAgICAnMjRweCcsXG4gICAgYmFja2dyb3VuZDogJyMxZjI5MzcnLFxuICAgIGNvbG9yOiAgICAgICcjZjlmYWZiJyxcbiAgICBib3JkZXI6ICAgICAnMXB4IHNvbGlkICMzNzQxNTEnLFxuICAgIGJvcmRlclJhZGl1czogJzhweCcsXG4gICAgcGFkZGluZzogICAgJzE2cHggMjBweCcsXG4gICAgekluZGV4OiAgICAgJzEwMDAwJyxcbiAgICBmb250U2l6ZTogICAnMC44NWVtJyxcbiAgICBtaW5XaWR0aDogICAnMzQwcHgnLFxuICAgIGJveFNoYWRvdzogICcwIDRweCAyMHB4IHJnYmEoMCwwLDAsMC41KScsXG4gIH0pO1xuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHBhbmVsKTtcbiAgcGFuZWwucXVlcnlTZWxlY3RvcignI2tiLXNob3J0Y3V0cy1jbG9zZScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gcGFuZWwucmVtb3ZlKCkpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgUmVzZXQgY2FyZCBmb2N1cyB3aGVuIHRhYiBjaGFuZ2VzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4vKiogQ2FsbGVkIHdoZW5ldmVyIHRoZSBhY3RpdmUgdGFiIGNoYW5nZXMgc28gY2FyZCBmb2N1cyByZXNldHMuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzZXRDYXJkRm9jdXMoKSB7XG4gIF9mb2N1c2VkQ2FyZEluZGV4ID0gLTE7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5rYi1mb2N1c2VkJykuZm9yRWFjaChlbCA9PiBlbC5jbGFzc0xpc3QucmVtb3ZlKCdrYi1mb2N1c2VkJykpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgR2xvYmFsIGtleWRvd24gaGFuZGxlciBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gX29uS2V5RG93bihlKSB7XG4gIC8vIEN0cmwrRW50ZXIgXHUyMTkyIHByaW1hcnkgYWN0aW9uIChhbHdheXMsIGV2ZW4gaW4gdGV4dCBpbnB1dHMgd2hlbiB0aGUgbWFpblxuICAvLyBzZW5kLWJveCBpcyBmb2N1c2VkLCB0byBtYXRjaCB0aGUgZXhpc3RpbmcgRW50ZXIgYmVoYXZpb3VyIHRoZXJlKS5cbiAgaWYgKGUuY3RybEtleSAmJiBlLmtleSA9PT0gJ0VudGVyJykge1xuICAgIF90cmlnZ2VyUHJpbWFyeUFjdGlvbigpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEN0cmwrU2hpZnQrUiBcdTIxOTIgcmUtcnVuIGN1cnJlbnQgcGhhc2VcbiAgaWYgKGUuY3RybEtleSAmJiBlLnNoaWZ0S2V5ICYmIGUua2V5ID09PSAnUicpIHtcbiAgICBjb25zdCBhY3RpdmVFbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tpZF49XCJzdGVwLVwiXS5hY3RpdmUnKTtcbiAgICBjb25zdCBzdGVwID0gYWN0aXZlRWwgPyBhY3RpdmVFbC5pZC5yZXBsYWNlKCdzdGVwLScsICcnKSA6IG51bGw7XG4gICAgaWYgKHN0ZXAgJiYgdHlwZW9mIGNvbmZpcm1SZVJ1blBoYXNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBjb25maXJtUmVSdW5QaGFzZShzdGVwKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gQ3RybCtaIC8gQ3RybCtTaGlmdCtaIFx1MjE5MiB1bmRvL3JlZG8gdGhlIG1vc3QgcmVjZW50IE1hc3RlciBDViBkYXRhIGNoYW5nZS5cbiAgLy8gU2NvcGVkIHRvIHdoZW4gdGhlIE1hc3RlciBDViBtb2RhbCBpcyBvcGVuIFx1MjAxNCBhbmQgbm8gbmVzdGVkIHN1Yi1tb2RhbFxuICAvLyAoZS5nLiB0aGUgYmFja3VwLWhpc3RvcnkgYnJvd3NlcikgaXMgc3RhY2tlZCBvbiB0b3Agb2YgaXQgXHUyMDE0IGFuZCBmb2N1c1xuICAvLyBpc24ndCBpbiBhIHRleHQgZmllbGQsIHNpbmNlIEN0cmwrWiBpbnNpZGUgYSB0ZXh0YXJlYSBtdXN0IHN0aWxsIHBlcmZvcm1cbiAgLy8gbmF0aXZlIHRleHQtdW5kbyByYXRoZXIgdGhhbiBiZWluZyBoaWphY2tlZCBieSB0aGlzIHNob3J0Y3V0LlxuICBpZiAoZS5jdHJsS2V5ICYmICFlLmFsdEtleSAmJiAoZS5rZXkgPT09ICd6JyB8fCBlLmtleSA9PT0gJ1onKVxuICAgICAgJiYgX21hc3RlckN2TW9kYWxPcGVuKCkgJiYgIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYWNrdXAtaGlzdG9yeS1vdmVybGF5JylcbiAgICAgICYmICFfaW5UZXh0SW5wdXQoKSkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBpZiAoZS5zaGlmdEtleSkge1xuICAgICAgaWYgKHR5cGVvZiByZWRvTWFzdGVyRGF0YUNoYW5nZSA9PT0gJ2Z1bmN0aW9uJykgcmVkb01hc3RlckRhdGFDaGFuZ2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR5cGVvZiB1bmRvTWFzdGVyRGF0YUNoYW5nZSA9PT0gJ2Z1bmN0aW9uJykgdW5kb01hc3RlckRhdGFDaGFuZ2UoKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gQWxsIHNpbmdsZS1rZXkgc2hvcnRjdXRzIGFyZSBzdXBwcmVzc2VkIHdoZW4gdHlwaW5nIGludG8gYW4gaW5wdXQuXG4gIGlmIChfaW5UZXh0SW5wdXQoKSkgcmV0dXJuO1xuICAvLyBBbGwgc2luZ2xlLWtleSBzaG9ydGN1dHMgYXJlIHN1cHByZXNzZWQgd2hlbiBhIG1vZGFsIGRpYWxvZyBpcyBvcGVuLFxuICAvLyBleGNlcHQgRXNjYXBlIChoYW5kbGVkIGJ5IHVpLWNvcmUuanMpLlxuICBpZiAoX21vZGFsT3BlbigpKSByZXR1cm47XG5cbiAgc3dpdGNoIChlLmtleSkge1xuICAgIGNhc2UgJz8nOlxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgc2hvd0tleWJvYXJkU2hvcnRjdXRzUGFuZWwoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgX21vdmVDYXJkRm9jdXMoLTEpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIF9tb3ZlQ2FyZEZvY3VzKDEpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYSc6XG4gICAgY2FzZSAnQSc6XG4gICAgICBfYWNjZXB0Rm9jdXNlZENhcmQoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3InOlxuICAgIGNhc2UgJ1InOlxuICAgICAgX3JlamVjdEZvY3VzZWRDYXJkKCk7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgYnJlYWs7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIEluaXRpYWxpc2F0aW9uIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4vKipcbiAqIEF0dGFjaCB0aGUgZ2xvYmFsIGtleWJvYXJkLXNob3J0Y3V0IGxpc3RlbmVyLlxuICogQ2FsbGVkIG9uY2UgZnJvbSBhcHAuanMgYWZ0ZXIgRE9NQ29udGVudExvYWRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRLZXlib2FyZFNob3J0Y3V0cygpIHtcbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIF9vbktleURvd24pO1xufVxuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLy8gT3JjaGVzdHJhdG9yIGVudHJ5LXBvaW50IFx1MjAxNCBhbGwgbW9kdWxlIGZ1bmN0aW9ucyBhcmUgZXhwb3NlZCBhcyBnbG9iYWxzIGJ5IGJ1bmRsZS5qcy5cbi8vIE5vdGU6IGFwcC5qcyBpcyBhIHBsYWluIGxlZ2FjeSBzY3JpcHQgKG5vdCBidW5kbGVkKS4gbG9nbGV2ZWwgaXMgYXZhaWxhYmxlXG4vLyB2aWEgZ2xvYmFsVGhpcy5sb2dsZXZlbCAoc2V0IGJ5IGJ1bmRsZS5qcyB3aGljaCBpbmNsdWRlcyB3ZWIvbG9nZ2VyLmpzKS5cbmNvbnN0IF9hcHBMb2cgPSAodHlwZW9mIGxvZ2xldmVsICE9PSAndW5kZWZpbmVkJykgPyBsb2dsZXZlbC5nZXRMb2dnZXIoJ2FwcCcpIDogY29uc29sZTtcbi8vIFRoaXMgZmlsZSBjb250YWlucyBvbmx5IGluaXQoKSBhbmQgdG9wLWxldmVsIGV2ZW50LXdpcmluZyAoXHUyMjY0IDMwMCBsaW5lcykuXG5cbmxldCBfbGlzdGVuZXJzUmVnaXN0ZXJlZCA9IGZhbHNlO1xuXG5mdW5jdGlvbiBfc2V0Q29ubmVjdGlvbk1lc3NhZ2UobWVzc2FnZU5vZGUsIHRleHQsIGtpbmQgPSAnaW5mbycpIHtcbiAgaWYgKCFtZXNzYWdlTm9kZSkgcmV0dXJuO1xuICBjb25zdCBjb250ZW50ID0gbWVzc2FnZU5vZGUucXVlcnlTZWxlY3RvcignLmNvbnRlbnQnKTtcbiAgaWYgKCFjb250ZW50KSByZXR1cm47XG4gIGNvbnRlbnQudGV4dENvbnRlbnQgPSB0ZXh0O1xuICBjb250ZW50LnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lLWJsb2NrJztcbiAgY29udGVudC5zdHlsZS5wYWRkaW5nID0gJzZweCAxMHB4JztcbiAgY29udGVudC5zdHlsZS5ib3JkZXJSYWRpdXMgPSAnOTk5cHgnO1xuICBjb250ZW50LnN0eWxlLmZvbnRXZWlnaHQgPSAnNjAwJztcbiAgY29udGVudC5zdHlsZS5mb250U2l6ZSA9ICcwLjg4ZW0nO1xuICBjb250ZW50LnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgI2NiZDVlMSc7XG4gIGlmIChraW5kID09PSAnc3VjY2VzcycpIHtcbiAgICBjb250ZW50LnN0eWxlLmNvbG9yID0gJyMxNjY1MzQnO1xuICAgIGNvbnRlbnQuc3R5bGUuYmFja2dyb3VuZCA9ICcjZWNmZGY1JztcbiAgICBjb250ZW50LnN0eWxlLmJvcmRlckNvbG9yID0gJyM4NmVmYWMnO1xuICB9IGVsc2UgaWYgKGtpbmQgPT09ICdlcnJvcicpIHtcbiAgICBjb250ZW50LnN0eWxlLmNvbG9yID0gJyNiOTFjMWMnO1xuICAgIGNvbnRlbnQuc3R5bGUuYmFja2dyb3VuZCA9ICcjZmVmMmYyJztcbiAgICBjb250ZW50LnN0eWxlLmJvcmRlckNvbG9yID0gJyNmZWNhY2EnO1xuICB9IGVsc2Uge1xuICAgIGNvbnRlbnQuc3R5bGUuY29sb3IgPSAnIzFlNDBhZic7XG4gICAgY29udGVudC5zdHlsZS5iYWNrZ3JvdW5kID0gJyNlZmY2ZmYnO1xuICAgIGNvbnRlbnQuc3R5bGUuYm9yZGVyQ29sb3IgPSAnI2JmZGJmZSc7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gaW5pdCgpIHtcbiAgLy8gSW5pdGlhbGl6ZSBhYm9ydCBjb250cm9sbGVyIHRvIG51bGwgKHNldCB0byBuZXcgQWJvcnRDb250cm9sbGVyIGJ5IHNldExvYWRpbmcodHJ1ZSkpXG4gIHdpbmRvdy5fY3VycmVudEFib3J0Q29udHJvbGxlciA9IG51bGw7XG5cbiAgLy8gRmx1c2ggYW55IG1lc3NhZ2VzIHRoYXQgd2VyZSBxdWV1ZWQgYmVmb3JlIERPTUNvbnRlbnRMb2FkZWQgKGRlZmVuc2l2ZSBcdTIwMTQgc2hvdWxkIGJlIGVtcHR5IGluIHByYWN0aWNlKS5cbiAgX2ZsdXNoTWVzc2FnZVF1ZXVlKCk7XG5cbiAgY29uc3QgaGFzQWN0aXZlU2Vzc2lvbiA9IGF3YWl0IGVuc3VyZVNlc3Npb25Db250ZXh0KCk7XG4gIGlmICghaGFzQWN0aXZlU2Vzc2lvbikge1xuICAgIGNvbnN0IGZhaWxlZE1lc3NhZ2UgPSBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnXHUyNkEwXHVGRTBGIENvdWxkIG5vdCBlc3RhYmxpc2ggYSBzZXNzaW9uLiBDcmVhdGUgb3IgbG9hZCBhIHNlc3Npb24gdG8gY29udGludWUuJyk7XG4gICAgX3NldENvbm5lY3Rpb25NZXNzYWdlKGZhaWxlZE1lc3NhZ2UsICdcdTI2QTBcdUZFMEYgQ291bGQgbm90IGVzdGFibGlzaCBhIHNlc3Npb24uIENyZWF0ZSBvciBsb2FkIGEgc2Vzc2lvbiB0byBjb250aW51ZS4nLCAnZXJyb3InKTtcbiAgICBzZXR1cEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gU2hvdyB3ZWxjb21lL29uYm9hcmRpbmcgbW9kYWwgb24gZXZlcnkgc3RhcnR1cCB1bnRpbCB1c2VyIGRpc21pc3NlcyBpdC5cbiAgYXdhaXQgbWF5YmVTaG93V2VsY29tZU1vZGFsKCk7XG5cbiAgLy8gUmVzdG9yZSBzZXNzaW9uIHN0YXRlIGZpcnN0XG4gIGF3YWl0IHJlc3RvcmVTZXNzaW9uKCk7XG5cbiAgLy8gU2hvdyBjb25uZWN0aW9uIHN0YXR1cyBhZnRlciByZXN0b3JlU2Vzc2lvbiBzbyBpdCBpcyBub3QgcmVtb3ZlZCBieSBoaXN0b3J5IHJlc3RvcmUuXG4gIGNvbnN0IGNvbm5lY3Rpb25NZXNzYWdlID0gYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgJ1x1RDgzRFx1REQwNCBDb25uZWN0aW5nIHRvIENWIEJ1aWxkZXIuLi4nKTtcbiAgX3NldENvbm5lY3Rpb25NZXNzYWdlKGNvbm5lY3Rpb25NZXNzYWdlLCAnXHVEODNEXHVERDA0IENvbm5lY3RpbmcgdG8gQ1YgQnVpbGRlci4uLicsICdpbmZvJyk7XG5cbiAgLy8gUmVzdG9yZSBBVFMgYmFkZ2UgZnJvbSBjYWNoZWQgc2NvcmUgKGlmIGFueSlcbiAgdXBkYXRlQXRzQmFkZ2Uoc3RhdGVNYW5hZ2VyLmdldEF0c1Njb3JlKCkpO1xuXG4gIC8vIEluaXRpYWxpemUgdGhlIHJlc3RcbiAgYXdhaXQgZmV0Y2hTdGF0dXMoKTtcbiAgY29uc3QgY29ubmVjdGVkTWVzc2FnZSA9IGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsICdcdTI3MDUgQ29ubmVjdGlvbiBzdWNjZXNzZnVsLicpO1xuICBfc2V0Q29ubmVjdGlvbk1lc3NhZ2UoY29ubmVjdGVkTWVzc2FnZSwgJ1x1MjcwNSBDb25uZWN0aW9uIHN1Y2Nlc3NmdWwuJywgJ3N1Y2Nlc3MnKTtcbiAgaWYgKHN0YXRlTWFuYWdlci5nZXRDdXJyZW50VGFiKCkgPT09ICdqb2InKSBhd2FpdCBwb3B1bGF0ZUpvYlRhYigpO1xuICBzZXR1cEV2ZW50TGlzdGVuZXJzKCk7XG5cbiAgLy8gU2V0IHVwIHBlcmlvZGljIHN0YXRlIHNhdmluZ1xuICBzZXRJbnRlcnZhbChzYXZlVGFiRGF0YSwgNTAwMCk7IC8vIFNhdmUgZXZlcnkgNSBzZWNvbmRzXG5cbiAgLy8gU2F2ZSBzdGF0ZSBiZWZvcmUgcGFnZSB1bmxvYWRcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsICgpID0+IHtcbiAgICBzYXZlVGFiRGF0YSgpO1xuICAgIGNvbnN0IGFjdGl2ZVNlc3Npb25JZCA9IHN0YXRlTWFuYWdlci5nZXRTZXNzaW9uSWQoKTtcbiAgICBpZiAoYWN0aXZlU2Vzc2lvbklkKSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShTdG9yYWdlS2V5cy5TRVNTSU9OX0lELCBhY3RpdmVTZXNzaW9uSWQpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gUHJvbXB0IHVzZXIgdG8gYW5hbHl6ZSBpZiBhIGpvYiBkZXNjcmlwdGlvbiBpcyBsb2FkZWQgYnV0IG5vdCB5ZXQgYW5hbHl6ZWQuXG4gIC8vIERvIE5PVCBhdXRvLWZpcmUgXHUyMDE0IGEgcmV0dXJuaW5nIHVzZXIgbWF5IGhhdmUgaW50ZW50aW9uYWxseSBsZWZ0IGl0IHVuYW5hbHl6ZWRcbiAgLy8gKGUuZy4gbWlkLWVkaXQpLiBMZXQgdGhlbSBjbGljayBBbmFseXNlIEpvYiBleHBsaWNpdGx5IChHQVAtMjQ4KS5cbiAgaWYgKCFzdGF0ZU1hbmFnZXIuaXNSZWNvbm5lY3RpbmcoKSkge1xuICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IGZldGNoU3RhdHVzKCk7XG4gICAgaWYgKCFzdGF0dXMuX2Vycm9yICYmIHN0YXR1cy5qb2JfZGVzY3JpcHRpb24gJiYgIXN0YXR1cy5qb2JfYW5hbHlzaXMpIHtcbiAgICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsICdcdUQ4M0RcdURDQ0IgSm9iIGRlc2NyaXB0aW9uIGRldGVjdGVkIFx1MjAxNCBjbGljayA8c3Ryb25nPkFuYWx5c2UgSm9iPC9zdHJvbmc+IHdoZW4gcmVhZHkgdG8gYmVnaW4uJyk7XG4gICAgICBjb25zdCBhbmFseXplQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FuYWx5emUtYnRuJyk7XG4gICAgICBpZiAoYW5hbHl6ZUJ0bikge1xuICAgICAgICBhbmFseXplQnRuLnN0eWxlLm91dGxpbmUgPSAnMnB4IHNvbGlkICMzYjgyZjYnO1xuICAgICAgICBhbmFseXplQnRuLnN0eWxlLm91dGxpbmVPZmZzZXQgPSAnMnB4JztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHN0YXR1cy5qb2JfYW5hbHlzaXMpIHtcbiAgICAgIF9hcHBMb2cuaW5mbygnSm9iIGFuYWx5c2lzIGFscmVhZHkgY29tcGxldGUsIHNraXBwaW5nIGF1dG8tYW5hbHlzaXMnKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgX2FwcExvZy5pbmZvKCdSZWNvbm5lY3RpbmcgdG8gZXhpc3Rpbmcgc2Vzc2lvbiwgc2tpcHBpbmcgYXV0by1hbmFseXNpcycpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNldHVwRXZlbnRMaXN0ZW5lcnMoKSB7XG4gIGlmIChfbGlzdGVuZXJzUmVnaXN0ZXJlZCkgcmV0dXJuO1xuICBfbGlzdGVuZXJzUmVnaXN0ZXJlZCA9IHRydWU7XG5cbiAgLy8gVGFiIHN3aXRjaGluZ1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudGFiJykuZm9yRWFjaCh0YWIgPT4ge1xuICAgIHRhYi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHN3aXRjaFRhYih0YWIuZGF0YXNldC50YWIpKTtcbiAgfSk7XG5cbiAgLy8gTWVzc2FnZSBzZW5kaW5nXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZW5kLWJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc2VuZE1lc3NhZ2UpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWVzc2FnZS1pbnB1dCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2tleXByZXNzJywgKGUpID0+IHtcbiAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicpIHNlbmRNZXNzYWdlKCk7XG4gIH0pO1xuXG4gIC8vIEFjdGlvbiBidXR0b25zIFx1MjAxNCBvbmUgcGVyIHdvcmtmbG93IHN0YWdlXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhbmFseXplLWJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYW5hbHl6ZUpvYik7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWNvbW1lbmQtYnRuJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBzZW5kQWN0aW9uKCdyZWNvbW1lbmRfY3VzdG9taXphdGlvbnMnKSk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnZW5lcmF0ZS1idG4nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICAvLyBTb2Z0IGdhdGU6IHdhcm4gaWYgY3VzdG9taXNhdGlvbiBpdGVtcyBoYXZlIG5ldmVyIGJlZW4gaW5kaXZpZHVhbGx5IHJldmlld2VkIChHQVAtMTE2KVxuICAgIGNvbnN0IHJldmlld2VkID0gd2luZG93Ll9leHBsaWNpdGx5UmV2aWV3ZWQgfHwgeyBleHBlcmllbmNlczogbmV3IFNldCgpLCBza2lsbHM6IG5ldyBTZXQoKSB9O1xuICAgIGNvbnN0IHRvdGFsRXhwID0gKHdpbmRvdy5fZXhwZXJpZW5jZXNPcmRlcmVkIHx8IFtdKS5sZW5ndGg7XG4gICAgY29uc3QgdG90YWxTa2lsbCA9IE9iamVjdC5rZXlzKHVzZXJTZWxlY3Rpb25zPy5za2lsbHMgfHwge30pLmxlbmd0aDtcbiAgICBjb25zdCB1bnJldmlld2VkRXhwID0gdG90YWxFeHAgLSByZXZpZXdlZC5leHBlcmllbmNlcy5zaXplO1xuICAgIGNvbnN0IHVucmV2aWV3ZWRTa2lsbCA9IHRvdGFsU2tpbGwgLSByZXZpZXdlZC5za2lsbHMuc2l6ZTtcbiAgICBjb25zdCB1bnJldmlld2VkVG90YWwgPSBNYXRoLm1heCgwLCB1bnJldmlld2VkRXhwKSArIE1hdGgubWF4KDAsIHVucmV2aWV3ZWRTa2lsbCk7XG4gICAgaWYgKHVucmV2aWV3ZWRUb3RhbCA+IDApIHtcbiAgICAgIGNvbnN0IHBhcnRzID0gW107XG4gICAgICBpZiAodW5yZXZpZXdlZEV4cCA+IDApIHBhcnRzLnB1c2goYCR7dW5yZXZpZXdlZEV4cH0gZXhwZXJpZW5jZSBlbnRyJHt1bnJldmlld2VkRXhwID09PSAxID8gJ3knIDogJ2llcyd9YCk7XG4gICAgICBpZiAodW5yZXZpZXdlZFNraWxsID4gMCkgcGFydHMucHVzaChgJHt1bnJldmlld2VkU2tpbGx9IHNraWxsJHt1bnJldmlld2VkU2tpbGwgPT09IDEgPyAnJyA6ICdzJ31gKTtcbiAgICAgIGNvbnN0IG9rID0gd2luZG93LmNvbmZpcm0oXG4gICAgICAgIGAke3BhcnRzLmpvaW4oJyBhbmQgJyl9IG5vdCBpbmRpdmlkdWFsbHkgcmV2aWV3ZWQgXHUyMDE0IHRoZSBBSSdzIHJlY29tbWVuZGF0aW9uIHdpbGwgYmUgdXNlZCBmb3IgdGhlc2UuXFxuXFxuUHJvY2VlZCBhbnl3YXk/YFxuICAgICAgKTtcbiAgICAgIGlmICghb2spIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHVzZXJTZWxlY3Rpb25zICYmIChPYmplY3Qua2V5cyh1c2VyU2VsZWN0aW9ucy5leHBlcmllbmNlcykubGVuZ3RoID4gMCB8fCBPYmplY3Qua2V5cyh1c2VyU2VsZWN0aW9ucy5za2lsbHMpLmxlbmd0aCA+IDApKSB7XG4gICAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnQXBwbHlpbmcgeW91ciByZXZpZXcgZGVjaXNpb25zLi4uJyk7XG4gICAgICAvLyBEZWNpc2lvbnMgd2VyZSBhbHJlYWR5IHN1Ym1pdHRlZCB2aWEgc3VibWl0RXhwZXJpZW5jZURlY2lzaW9ucy9zdWJtaXRTa2lsbERlY2lzaW9uc1xuICAgICAgLy8gQmFja2VuZCBoYXMgdGhlbSBpbiBjb252ZXJzYXRpb24uc3RhdGVbJ2V4cGVyaWVuY2VfZGVjaXNpb25zJ10gYW5kIFsnc2tpbGxfZGVjaXNpb25zJ11cbiAgICB9XG4gICAgYXdhaXQgZmV0Y2hBbmRSZXZpZXdSZXdyaXRlcygpO1xuICB9KTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jld3JpdGUtYnRuJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzdWJtaXRSZXdyaXRlRGVjaXNpb25zKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NwZWxsLWJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc3VibWl0U3BlbGxDaGVja0RlY2lzaW9ucyk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnZW5lcmF0ZS1wcm9jZWVkLWJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gc3dpdGNoVGFiKCdsYXlvdXQnKSk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYXlvdXQtYnRuJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVMYXlvdXRQcmltYXJ5QWN0aW9uKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbmFsLWdlbmVyYXRlLXByb2NlZWQtYnRuJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmaW5hbEdlbmVyYXRpb25Db21wbGV0ZSk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaW5hbGlzZS1hY3Rpb24tYnRuJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBzd2l0Y2hUYWIoJ2ZpbmFsaXNlJykpO1xuXG4gIGlmICh0eXBlb2YgaW5pdEtleWJvYXJkU2hvcnRjdXRzID09PSAnZnVuY3Rpb24nKSBpbml0S2V5Ym9hcmRTaG9ydGN1dHMoKTtcbiAgaWYgKHR5cGVvZiBpbml0RWFybHlQcmV2aWV3UGFuZWwgPT09ICdmdW5jdGlvbicpIGluaXRFYXJseVByZXZpZXdQYW5lbCgpO1xufVxuXG4vLyBUZXN0cyBub3cgaW1wb3J0IGhlbHBlciBmdW5jdGlvbnMgZnJvbSB0aGVpciBjYW5vbmljYWwgRVMgbW9kdWxlcyBkaXJlY3RseS5cblxuZXhwb3J0IHsgaW5pdCwgc2V0dXBFdmVudExpc3RlbmVycyB9O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvc3JjL21haW4uanMgXHUyMDE0IGVzYnVpbGQgZW50cnkgcG9pbnQgZm9yIHRoZSBmdWxsIGJyb3dzZXIgYnVuZGxlLlxuICpcbiAqIFBoYXNlIDIgbW9kdWxlczogdXRpbHMsIGFwaS1jbGllbnQsIHN0YXRlLW1hbmFnZXIsIHVpLWNvcmUsIGxheW91dC1pbnN0cnVjdGlvblxuICogUGhhc2UgMyBtb2R1bGVzOiBhbGwgZG9tYWluIHNwbGl0IG1vZHVsZXMgKFRpZXIgMFx1MjAxMzcpIGZyb20gdGhlIGFwcC5qcyBtb2R1bGFyaXNhdGlvbi5cbiAqXG4gKiBFdmVyeSBleHBvcnQgaXMgYXNzaWduZWQgdG8gYHdpbmRvd2Agc28gdGhhdCBsZWdhY3kgaW5saW5lIG9uY2xpY2s9XCJmbigpXCJcbiAqIGhhbmRsZXJzIGFuZCBhcHAuanMgY29udGludWUgdG8gd29yayB1bmNoYW5nZWQuXG4gKlxuICogQnVpbGQ6ICBucG0gcnVuIGJ1aWxkICAgICAgICAgIFx1MjE5MiB3ZWIvYnVuZGxlLmpzIChkZXZlbG9wbWVudCwgdW5taW5pZmllZClcbiAqICAgICAgICAgbnBtIHJ1biBidWlsZDpwcm9kICAgICBcdTIxOTIgd2ViL2J1bmRsZS5qcyAobWluaWZpZWQpXG4gKiAgICAgICAgIG5wbSBydW4gYnVpbGQ6d2F0Y2ggICAgXHUyMTkyIHJlYnVpbGQgb24gZXZlcnkgc291cmNlIGNoYW5nZVxuICovXG5cbi8vIFx1MjUwMFx1MjUwMCBMb2dnZXIgKG11c3QgYmUgZmlyc3Qgc28gbmFtZWQgbG9nZ2VycyBhcmUgYXZhaWxhYmxlIHRvIGFsbCBtb2R1bGVzKSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmltcG9ydCAqIGFzIExvZ2dlciBmcm9tICcuLi9sb2dnZXIuanMnO1xuXG4vLyBcdTI1MDBcdTI1MDAgUGhhc2UgMiAob3JpZ2luYWwgYnVuZGxlKSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmltcG9ydCAqIGFzIFV0aWxzICAgICAgICAgICAgIGZyb20gJy4uL3V0aWxzLmpzJztcbmltcG9ydCAqIGFzIEFwaUNsaWVudCAgICAgICAgIGZyb20gJy4uL2FwaS1jbGllbnQuanMnO1xuaW1wb3J0ICogYXMgU3RhdGUgICAgICAgICAgICAgZnJvbSAnLi4vc3RhdGUtbWFuYWdlci5qcyc7XG5pbXBvcnQgKiBhcyBQcm92aWRlckluZm8gICAgICBmcm9tICcuLi9wcm92aWRlci1pbmZvLmpzJztcbmltcG9ydCAqIGFzIFVpQ29yZSAgICAgICAgICAgIGZyb20gJy4uL3VpLWNvcmUuanMnO1xuaW1wb3J0ICogYXMgTGF5b3V0SW5zdHJ1Y3Rpb24gZnJvbSAnLi4vbGF5b3V0LWluc3RydWN0aW9uLmpzJztcblxuLy8gXHUyNTAwXHUyNTAwIFRpZXIgMCBcdTIwMTQgbm8gZGVwZW5kZW5jaWVzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuaW1wb3J0ICogYXMgVmFsaWRhdG9ycyAgICAgICAgICAgIGZyb20gJy4uL3ZhbGlkYXRvcnMuanMnO1xuaW1wb3J0ICogYXMgUmVjb21tZW5kYXRpb25IZWxwZXJzIGZyb20gJy4uL3JlY29tbWVuZGF0aW9uLWhlbHBlcnMuanMnO1xuaW1wb3J0ICogYXMgVWlIZWxwZXJzICAgICAgICAgICAgIGZyb20gJy4uL3VpLWhlbHBlcnMuanMnO1xuaW1wb3J0ICogYXMgUHJvcG9zYWxSZXZpZXcgICAgICAgIGZyb20gJy4uL3Byb3Bvc2FsLXJldmlldy5qcyc7XG5cbi8vIFx1MjUwMFx1MjUwMCBUaWVyIDEgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5pbXBvcnQgKiBhcyBGZXRjaFV0aWxzICAgZnJvbSAnLi4vZmV0Y2gtdXRpbHMuanMnO1xuaW1wb3J0ICogYXMgTWVzc2FnZVF1ZXVlIGZyb20gJy4uL21lc3NhZ2UtcXVldWUuanMnO1xuaW1wb3J0ICogYXMgTGxtTG9nICAgICAgIGZyb20gJy4uL2xsbS1sb2cuanMnO1xuXG4vLyBcdTI1MDBcdTI1MDAgVGllciAyIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuaW1wb3J0ICogYXMgQXV0aFByb3ZpZGVyICAgZnJvbSAnLi4vYXV0aC1wcm92aWRlci5qcyc7XG5pbXBvcnQgKiBhcyBBdHNSZWZpbmVtZW50ICBmcm9tICcuLi9hdHMtcmVmaW5lbWVudC5qcyc7XG5pbXBvcnQgKiBhcyBBdHNNb2RhbHMgICAgICBmcm9tICcuLi9hdHMtbW9kYWxzLmpzJztcbmltcG9ydCAqIGFzIFNlc3Npb25BY3Rpb25zIGZyb20gJy4uL3Nlc3Npb24tYWN0aW9ucy5qcyc7XG5pbXBvcnQgKiBhcyBKb2JBbmFseXNpcyAgICBmcm9tICcuLi9qb2ItYW5hbHlzaXMuanMnO1xuXG4vLyBcdTI1MDBcdTI1MDAgVGllciAzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuaW1wb3J0ICogYXMgR29hbHMgICAgICAgICAgIGZyb20gJy4uL2dvYWxzLmpzJztcbmltcG9ydCAqIGFzIFNlc3Npb25NYW5hZ2VyICBmcm9tICcuLi9zZXNzaW9uLW1hbmFnZXIuanMnO1xuaW1wb3J0ICogYXMgSm9iSW5wdXQgICAgICAgIGZyb20gJy4uL2pvYi1pbnB1dC5qcyc7XG5pbXBvcnQgKiBhcyBNZXNzYWdlRGlzcGF0Y2ggZnJvbSAnLi4vbWVzc2FnZS1kaXNwYXRjaC5qcyc7XG5pbXBvcnQgKiBhcyBRdWVzdGlvbnNQYW5lbCAgZnJvbSAnLi4vcXVlc3Rpb25zLXBhbmVsLmpzJztcblxuLy8gXHUyNTAwXHUyNTAwIFRpZXIgNCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmltcG9ydCAqIGFzIFJldmlld0ljb25zICAgIGZyb20gJy4uL3Jldmlldy1pY29ucy5qcyc7XG5pbXBvcnQgKiBhcyBSZXZpZXdUYWJsZUJhc2UgZnJvbSAnLi4vcmV2aWV3LXRhYmxlLWJhc2UuanMnO1xuXG4vLyBcdTI1MDBcdTI1MDAgVGllciA1IFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuaW1wb3J0ICogYXMgRXhwZXJpZW5jZVJldmlldyAgIGZyb20gJy4uL2V4cGVyaWVuY2UtcmV2aWV3LmpzJztcbmltcG9ydCAqIGFzIFNraWxsc1JldmlldyAgICAgICBmcm9tICcuLi9za2lsbHMtcmV2aWV3LmpzJztcbmltcG9ydCAqIGFzIEFjaGlldmVtZW50c1JldmlldyBmcm9tICcuLi9hY2hpZXZlbWVudHMtcmV2aWV3LmpzJztcbmltcG9ydCAqIGFzIFRhZ2xpbmVSZXZpZXcgICAgICBmcm9tICcuLi90YWdsaW5lLXJldmlldy5qcyc7XG5pbXBvcnQgKiBhcyBTdW1tYXJ5UmV2aWV3ICAgICAgZnJvbSAnLi4vc3VtbWFyeS1yZXZpZXcuanMnO1xuaW1wb3J0ICogYXMgUHVibGljYXRpb25zUmV2aWV3IGZyb20gJy4uL3B1YmxpY2F0aW9ucy1yZXZpZXcuanMnO1xuXG4vLyBcdTI1MDBcdTI1MDAgVGllciA2IFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuaW1wb3J0ICogYXMgUmV3cml0ZVJldmlldyAgICAgIGZyb20gJy4uL3Jld3JpdGUtcmV2aWV3LmpzJztcbmltcG9ydCAqIGFzIFNwZWxsQ2hlY2sgICAgICAgICBmcm9tICcuLi9zcGVsbC1jaGVjay5qcyc7XG5pbXBvcnQgKiBhcyBEb3dubG9hZFRhYiAgICAgICAgZnJvbSAnLi4vZG93bmxvYWQtdGFiLmpzJztcbmltcG9ydCAqIGFzIEZpbmFsR2VuZXJhdGUgICAgICBmcm9tICcuLi9maW5hbC1nZW5lcmF0ZS5qcyc7XG5pbXBvcnQgKiBhcyBXb3JrZmxvd1N0ZXBzICAgICAgZnJvbSAnLi4vd29ya2Zsb3ctc3RlcHMuanMnO1xuaW1wb3J0ICogYXMgTWFzdGVyRGF0YUFpVXBkYXRlIGZyb20gJy4uL21hc3Rlci1kYXRhLWFpLXVwZGF0ZS5qcyc7XG5pbXBvcnQgKiBhcyBNYXN0ZXJDdiAgICAgICAgICAgZnJvbSAnLi4vbWFzdGVyLWN2LmpzJztcbmltcG9ydCAqIGFzIENvdmVyTGV0dGVyICAgICAgICBmcm9tICcuLi9jb3Zlci1sZXR0ZXIuanMnO1xuaW1wb3J0ICogYXMgU2NyZWVuaW5nUXVlc3Rpb25zIGZyb20gJy4uL3NjcmVlbmluZy1xdWVzdGlvbnMuanMnO1xuaW1wb3J0ICogYXMgRmluYWxpc2UgICAgICAgICAgIGZyb20gJy4uL2ZpbmFsaXNlLmpzJztcbmltcG9ydCAqIGFzIEludGVydmlld1ByZXAgICAgICBmcm9tICcuLi9pbnRlcnZpZXctcHJlcC5qcyc7XG5pbXBvcnQgKiBhcyBUaGFua1lvdSAgICAgICAgICAgZnJvbSAnLi4vdGhhbmsteW91LmpzJztcbmltcG9ydCAqIGFzIEhhcnZlc3QgICAgICAgICAgICBmcm9tICcuLi9oYXJ2ZXN0LmpzJztcbmltcG9ydCAqIGFzIEVhcmx5UHJldmlld1BhbmVsICBmcm9tICcuLi9lYXJseS1wcmV2aWV3LXBhbmVsLmpzJztcblxuLy8gXHUyNTAwXHUyNTAwIFRpZXIgNyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmltcG9ydCAqIGFzIFNlc3Npb25Td2l0Y2hlclVpICBmcm9tICcuLi9zZXNzaW9uLXN3aXRjaGVyLXVpLmpzJztcbmltcG9ydCAqIGFzIEtleWJvYXJkU2hvcnRjdXRzICBmcm9tICcuLi9rZXlib2FyZC1zaG9ydGN1dHMuanMnO1xuXG4vLyBcdTI1MDBcdTI1MDAgQXBwIG9yY2hlc3RyYXRvciAoZm9sZGVkIGludG8gYnVuZGxlIFx1MjAxNCBHQVAtNjQpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuaW1wb3J0ICogYXMgQXBwIGZyb20gJy4uL2FwcC5qcyc7XG5cbi8vIFx1MjUwMFx1MjUwMCBBc3NpZ24gYWxsIGV4cG9ydHMgdG8gZ2xvYmFsVGhpcyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbi8vIFBoYXNlIDIgbW9kdWxlcyBmaXJzdDsgcGhhc2UgMyBkb21haW4gbW9kdWxlcyBmb2xsb3cgc28gZnVsbHktZmVhdHVyZWRcbi8vIGltcGxlbWVudGF0aW9ucyBvdmVycmlkZSBhbnkgcGxhY2Vob2xkZXIgc3R1YnMgKGUuZy4gc2hvd1Nlc3Npb25Db25mbGljdEJhbm5lclxuLy8gaW4gc2Vzc2lvbi1zd2l0Y2hlci11aSBvdmVycmlkZXMgdGhlIHNpbXBsZSBzdHViIGluIHVpLWNvcmUpLlxuT2JqZWN0LmFzc2lnbihnbG9iYWxUaGlzLFxuICBMb2dnZXIsIFV0aWxzLCBBcGlDbGllbnQsIFN0YXRlLCBQcm92aWRlckluZm8sIFVpQ29yZSwgTGF5b3V0SW5zdHJ1Y3Rpb24sXG4gIFZhbGlkYXRvcnMsIFJlY29tbWVuZGF0aW9uSGVscGVycywgVWlIZWxwZXJzLCBQcm9wb3NhbFJldmlldyxcbiAgRmV0Y2hVdGlscywgTWVzc2FnZVF1ZXVlLCBMbG1Mb2csXG4gIEF1dGhQcm92aWRlciwgQXRzUmVmaW5lbWVudCwgQXRzTW9kYWxzLCBTZXNzaW9uQWN0aW9ucywgSm9iQW5hbHlzaXMsXG4gIEdvYWxzLFxuICBTZXNzaW9uTWFuYWdlciwgSm9iSW5wdXQsIE1lc3NhZ2VEaXNwYXRjaCwgUXVlc3Rpb25zUGFuZWwsXG4gIFJldmlld1RhYmxlQmFzZSxcbiAgRXhwZXJpZW5jZVJldmlldywgU2tpbGxzUmV2aWV3LCBBY2hpZXZlbWVudHNSZXZpZXcsIFRhZ2xpbmVSZXZpZXcsIFN1bW1hcnlSZXZpZXcsIFB1YmxpY2F0aW9uc1JldmlldywgUmV2aWV3SWNvbnMsXG4gIFJld3JpdGVSZXZpZXcsIFNwZWxsQ2hlY2ssIERvd25sb2FkVGFiLCBGaW5hbEdlbmVyYXRlLCBXb3JrZmxvd1N0ZXBzLCBNYXN0ZXJEYXRhQWlVcGRhdGUsIE1hc3RlckN2LFxuICBDb3ZlckxldHRlciwgU2NyZWVuaW5nUXVlc3Rpb25zLCBGaW5hbGlzZSwgSW50ZXJ2aWV3UHJlcCwgVGhhbmtZb3UsIEhhcnZlc3QsIEVhcmx5UHJldmlld1BhbmVsLFxuICBTZXNzaW9uU3dpdGNoZXJVaSwgS2V5Ym9hcmRTaG9ydGN1dHMsXG4gIEFwcCxcbik7XG5cbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBBcHAuaW5pdCk7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFNQSxPQUFDLFNBQVUsTUFBTSxZQUFZO0FBQ3pCO0FBQ0EsWUFBSSxPQUFPLFdBQVcsY0FBYyxPQUFPLEtBQUs7QUFDNUMsaUJBQU8sVUFBVTtBQUFBLFFBQ3JCLFdBQVcsT0FBTyxXQUFXLFlBQVksT0FBTyxTQUFTO0FBQ3JELGlCQUFPLFVBQVUsV0FBVztBQUFBLFFBQ2hDLE9BQU87QUFDSCxlQUFLLE1BQU0sV0FBVztBQUFBLFFBQzFCO0FBQUEsTUFDSixHQUFFLFNBQU0sV0FBWTtBQUNoQjtBQUdBLFlBQUksT0FBTyxXQUFXO0FBQUEsUUFBQztBQUN2QixZQUFJLGdCQUFnQjtBQUNwQixZQUFJLE9BQVEsT0FBTyxXQUFXLGlCQUFtQixPQUFPLE9BQU8sY0FBYyxpQkFDekUsa0JBQWtCLEtBQUssT0FBTyxVQUFVLFNBQVM7QUFHckQsWUFBSSxhQUFhO0FBQUEsVUFDYjtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxRQUNKO0FBRUEsWUFBSSxpQkFBaUIsQ0FBQztBQUN0QixZQUFJLGdCQUFnQjtBQUdwQixpQkFBUyxXQUFXLEtBQUssWUFBWTtBQUNqQyxjQUFJLFNBQVMsSUFBSSxVQUFVO0FBQzNCLGNBQUksT0FBTyxPQUFPLFNBQVMsWUFBWTtBQUNuQyxtQkFBTyxPQUFPLEtBQUssR0FBRztBQUFBLFVBQzFCLE9BQU87QUFDSCxnQkFBSTtBQUNBLHFCQUFPLFNBQVMsVUFBVSxLQUFLLEtBQUssUUFBUSxHQUFHO0FBQUEsWUFDbkQsU0FBUyxHQUFHO0FBRVIscUJBQU8sV0FBVztBQUNkLHVCQUFPLFNBQVMsVUFBVSxNQUFNLE1BQU0sUUFBUSxDQUFDLEtBQUssU0FBUyxD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QUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsVUE4RS9CLGtCQUFrQixNQUFNLENBQUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxVQWF6QiwwQkFBMEIsY0FBYyxDQUFDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxVQWlCekMsK0JBQStCLFlBQVksQ0FBQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxVQWtCNUMscUJBQXFCLFNBQVMsQ0FBQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FB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QUFFcEcsUUFBSSxPQUFPLDBCQUEwQixXQUFZLHVCQUFzQjtBQUN2RSxRQUFJLE9BQU8sMEJBQTBCLFdBQVksdUJBQXNCO0FBQUEsRUFDekU7OztBQy9EQSxTQUFPO0FBQUEsSUFBTztBQUFBLElBQ1o7QUFBQSxJQUFRO0FBQUEsSUFBTztBQUFBLElBQVc7QUFBQSxJQUFPO0FBQUEsSUFBYztBQUFBLElBQVE7QUFBQSxJQUN2RDtBQUFBLElBQVk7QUFBQSxJQUF1QjtBQUFBLElBQVc7QUFBQSxJQUM5QztBQUFBLElBQVk7QUFBQSxJQUFjO0FBQUEsSUFDMUI7QUFBQSxJQUFjO0FBQUEsSUFBZTtBQUFBLElBQVc7QUFBQSxJQUFnQjtBQUFBLElBQ3hEO0FBQUEsSUFDQTtBQUFBLElBQWdCO0FBQUEsSUFBVTtBQUFBLElBQWlCO0FBQUEsSUFDM0M7QUFBQSxJQUNBO0FBQUEsSUFBa0I7QUFBQSxJQUFjO0FBQUEsSUFBb0I7QUFBQSxJQUFlO0FBQUEsSUFBZTtBQUFBLElBQW9CO0FBQUEsSUFDdEc7QUFBQSxJQUFlO0FBQUEsSUFBWTtBQUFBLElBQWE7QUFBQSxJQUFlO0FBQUEsSUFBZTtBQUFBLElBQW9CO0FBQUEsSUFDMUY7QUFBQSxJQUFhO0FBQUEsSUFBb0I7QUFBQSxJQUFVO0FBQUEsSUFBZTtBQUFBLElBQVU7QUFBQSxJQUFTO0FBQUEsSUFDN0U7QUFBQSxJQUFtQjtBQUFBLElBQ25CO0FBQUEsRUFDRjtBQUVBLFdBQVMsaUJBQWlCLG9CQUF3QixJQUFJOyIsCiAgIm5hbWVzIjogWyJnZXRMb2dnZXIiLCAibG9nZ2VyIiwgImxvZ2xldmVsIiwgImNsZWFuSnNvblJlc3BvbnNlIiwgImVzY2FwZUh0bWwiLCAiZXh0cmFjdEZpcnN0SnNvbk9iamVjdCIsICJleHRyYWN0VGl0bGVBbmRDb21wYW55RnJvbUpvYlRleHQiLCAiZm9ybWF0U2Vzc2lvblBoYXNlTGFiZWwiLCAibm9ybWFsaXplUG9zaXRpb25MYWJlbCIsICJub3JtYWxpemVUZXh0IiwgInRleHQiLCAibSIsICJodG1sIiwgInYiLCAiU3RvcmFnZUtleXMiLCAiYXBpQ2FsbCIsICJjcmVhdGVTZXNzaW9uIiwgImZldGNoU3RhdHVzIiwgImdldE93bmVyVG9rZW4iLCAiZ2V0U2NvcGVkVGFiRGF0YVN0b3JhZ2VLZXkiLCAiZ2V0U2Vzc2lvbklkRnJvbVVSTCIsICJfdXBkYXRlTExNU3RhdHVzQmFyIiwgImxsbUZldGNoIiwgInNldExvYWRpbmciLCAiXyIsICJpbml0IiwgImNoYXRBcmVhIiwgIlN0b3JhZ2VLZXlzIiwgImdldFNlc3Npb25JZEZyb21VUkwiLCAiZ2V0T3duZXJUb2tlbiIsICJnZXRTY29wZWRUYWJEYXRhU3RvcmFnZUtleSIsICJzZXNzaW9uSWQiLCAiaW5pdCIsICJfIiwgImFwaUNhbGwiLCAiY3JlYXRlU2Vzc2lvbiIsICJmZXRjaFN0YXR1cyIsICJQSEFTRVMiLCAic3RhdGVNYW5hZ2VyIiwgImxvZyIsICJQSEFTRVMiLCAic3RhdGVNYW5hZ2VyIiwgIlN0b3JhZ2VLZXlzIiwgImdldFByb3ZpZGVySW5mbyIsICJsb2FkUHJvdmlkZXJJbmZvIiwgInByb3ZpZGVySW5mb1BvcG92ZXJDb250ZW50IiwgImxvYWRQcm92aWRlckluZm8iLCAiZ2V0UHJvdmlkZXJJbmZvIiwgInByb3ZpZGVySW5mb1BvcG92ZXJDb250ZW50IiwgImVzY2FwZUh0bWwiLCAiX3VwZGF0ZUxsbVN0YXR1c1BpbGwiLCAiY2xvc2VNb2RlbE1vZGFsIiwgImNvbmZpcm1EaWFsb2ciLCAiZ2V0U3RhZ2VGb3JUYWIiLCAicHVzaEZvY3VzU3RhY2siLCAicmVzdG9yZUZvY3VzIiwgInNldEluaXRpYWxGb2N1cyIsICJ0cmFwRm9jdXMiLCAidXBkYXRlVGFiQmFyRm9yU3RhZ2UiLCAiX3VwZGF0ZVZpZXdpbmdJbmRpY2F0b3IiLCAiY29uZmlybVJlUnVuUGhhc2UiLCAic2hvd0J1bGxldFJlb3JkZXIiLCAibG9nIiwgInN0YXRlTWFuYWdlciIsICJnZW5lcmF0aW9uU3RhdGUiLCAiY29uZmlybVJlUnVuUGhhc2UiLCAiX3VwZGF0ZVZpZXdpbmdJbmRpY2F0b3IiLCAicSIsICJjbG9zZU1vZGFsIiwgIl9lIiwgInNob3dCdWxsZXRSZW9yZGVyIiwgIl8iLCAidGV4dCIsICJsb2ciLCAiZmV0Y2hTdGF0dXMiLCAiYXBpQ2FsbCIsICJfIiwgInNldEluaXRpYWxGb2N1cyIsICJ0cmFwRm9jdXMiLCAicmVzdG9yZUZvY3VzIiwgInB1c2hGb2N1c1N0YWNrIiwgImNvbmZpcm1EaWFsb2ciLCAiZ2V0U3RhZ2VGb3JUYWIiLCAic3RhdGVNYW5hZ2VyIiwgInVwZGF0ZVRhYkJhckZvclN0YWdlIiwgIlN0b3JhZ2VLZXlzIiwgIl91cGRhdGVMbG1TdGF0dXNQaWxsIiwgInRleHQiLCAiYiIsICJlc2NhcGVIdG1sIiwgImNsb3NlTW9kZWxNb2RhbCIsICJ2IiwgIm0iLCAiZXZlbnQiLCAidXBkYXRlV29ya2Zsb3dTdGVwc0NsaWNrYWJsZSIsICJoYW5kbGVMYXlvdXRQcmltYXJ5QWN0aW9uIiwgImluaXRpYXRlTGF5b3V0SW5zdHJ1Y3Rpb25zIiwgInJlZnJlc2hBdHNTY29yZSIsICJzY2hlZHVsZUF0c1JlZnJlc2giLCAidXBkYXRlQXRzQmFkZ2UiLCAidGV4dCIsICJnZW5lcmF0aW9uU3RhdGUiLCAic2Vzc2lvbklkIiwgIl9lIiwgIl9mbHVzaE1lc3NhZ2VRdWV1ZSIsICJhcHBlbmRGb3JtYXR0ZWRBbmFseXNpcyIsICJhcHBlbmRMb2FkaW5nTWVzc2FnZSIsICJhcHBlbmRNZXNzYWdlIiwgImFwcGVuZFJhd0h0bWwiLCAiYXBwZW5kUmV0cnlNZXNzYWdlIiwgInJlbW92ZUxvYWRpbmdNZXNzYWdlIiwgImxvZyIsICJfZmx1c2hNZXNzYWdlUXVldWUiLCAidGV4dCIsICJhcHBlbmRNZXNzYWdlIiwgImFwcGVuZExvYWRpbmdNZXNzYWdlIiwgInJlbW92ZUxvYWRpbmdNZXNzYWdlIiwgImh0bWwiLCAiZXNjYXBlSHRtbCIsICJhcHBlbmRSZXRyeU1lc3NhZ2UiLCAiYXBwZW5kRm9ybWF0dGVkQW5hbHlzaXMiLCAiY2xlYW5Kc29uUmVzcG9uc2UiLCAiYXBwZW5kUmF3SHRtbCIsICJfdXBkYXRlUGFnZUVzdGltYXRlIiwgImhhbmRsZUFjdGlvbkNsaWNrIiwgImhhbmRsZUN1c3RvbWl6YXRpb25SZXNwb25zZSIsICJzaG93VGFibGVCYXNlZFJldmlldyIsICJzd2l0Y2hUYWIiLCAidXBkYXRlSW5jbHVzaW9uQ291bnRzIiwgInVzZXJTZWxlY3Rpb25zIiwgImxvZyIsICJ1c2VyU2VsZWN0aW9ucyIsICJzdGF0ZU1hbmFnZXIiLCAidXBkYXRlSW5jbHVzaW9uQ291bnRzIiwgInYiLCAic3dpdGNoVGFiIiwgInRhYkRhdGEiLCAic2hvd1RhYmxlQmFzZWRSZXZpZXciLCAic2Vzc2lvbklkIiwgIl8iLCAiaHRtbCIsICJoYW5kbGVDdXN0b21pemF0aW9uUmVzcG9uc2UiLCAic3RhdGVNYW5hZ2VyIiwgIl91cGRhdGVQYWdlRXN0aW1hdGUiLCAidXNlclNlbGVjdGlvbnMiLCAiaGFuZGxlQWN0aW9uQ2xpY2siLCAiaHRtbCIsICJsb2ciLCAic3RhdGVNYW5hZ2VyIiwgImh0bWwiLCAic2Vzc2lvbklkIiwgImVzY2FwZUh0bWwiLCAidGV4dCIsICJnZW5lcmF0aW9uU3RhdGUiLCAiaW5pdGlhdGVMYXlvdXRJbnN0cnVjdGlvbnMiLCAiXyIsICJhcHBlbmRNZXNzYWdlIiwgImNvbmZpcm1SZVJ1blBoYXNlIiwgImFwaUNhbGwiLCAidyIsICJfZSIsICJzY2hlZHVsZUF0c1JlZnJlc2giLCAic3dpdGNoVGFiIiwgImhhbmRsZUxheW91dFByaW1hcnlBY3Rpb24iLCAicGFyc2VNZXNzYWdlUmVzcG9uc2UiLCAicGFyc2VSZXdyaXRlc1Jlc3BvbnNlIiwgInBhcnNlU2Vzc2lvbkxpc3RSZXNwb25zZSIsICJwYXJzZVN0YXR1c1Jlc3BvbnNlIiwgImxvZyIsICJwYXJzZVN0YXR1c1Jlc3BvbnNlIiwgImsiLCAicGFyc2VTZXNzaW9uTGlzdFJlc3BvbnNlIiwgInBhcnNlUmV3cml0ZXNSZXNwb25zZSIsICJwYXJzZU1lc3NhZ2VSZXNwb25zZSIsICJidWlsZEZhbGxiYWNrUG9zdEFuYWx5c2lzUXVlc3Rpb25zIiwgImdldEFjaGlldmVtZW50Q29uZmlkZW5jZSIsICJnZXRBY2hpZXZlbWVudFJlYXNvbmluZyIsICJnZXRBY2hpZXZlbWVudFJlY29tbWVuZGF0aW9uIiwgImdldENvbmZpZGVuY2VMZXZlbCIsICJnZXRFeHBlcmllbmNlUmVhc29uaW5nIiwgImdldEV4cGVyaWVuY2VSZWNvbW1lbmRhdGlvbiIsICJnZXRTa2lsbENvbmZpZGVuY2UiLCAiZ2V0U2tpbGxSZWFzb25pbmciLCAiZ2V0U2tpbGxSZWNvbW1lbmRhdGlvbiIsICJsb2ciLCAiZ2V0RXhwZXJpZW5jZVJlY29tbWVuZGF0aW9uIiwgImdldENvbmZpZGVuY2VMZXZlbCIsICJnZXRFeHBlcmllbmNlUmVhc29uaW5nIiwgImdldFNraWxsUmVjb21tZW5kYXRpb24iLCAiZ2V0U2tpbGxDb25maWRlbmNlIiwgImdldFNraWxsUmVhc29uaW5nIiwgImdldEFjaGlldmVtZW50UmVjb21tZW5kYXRpb24iLCAiZ2V0QWNoaWV2ZW1lbnRDb25maWRlbmNlIiwgImdldEFjaGlldmVtZW50UmVhc29uaW5nIiwgImJ1aWxkRmFsbGJhY2tQb3N0QW5hbHlzaXNRdWVzdGlvbnMiLCAiY2xvc2VBbGVydE1vZGFsIiwgInNob3dBbGVydE1vZGFsIiwgInNob3dDb25maXJtTW9kYWwiLCAic2hvd1RvYXN0IiwgInVwZGF0ZUFjdGlvbkJ1dHRvbnMiLCAic2hvd0FsZXJ0TW9kYWwiLCAiY2xvc2VBbGVydE1vZGFsIiwgInNob3dDb25maXJtTW9kYWwiLCAic2hvd1RvYXN0IiwgInN0YXRlTWFuYWdlciIsICJnZW5lcmF0aW9uU3RhdGUiLCAidXBkYXRlQWN0aW9uQnV0dG9ucyIsICJldmVudCIsICJmZXRjaEFuZERpc3BsYXlMbG1Mb2ciLCAibG9nIiwgInRleHQiLCAiZXNjYXBlSHRtbCIsICJtIiwgImh0bWwiLCAiZmV0Y2hBbmREaXNwbGF5TGxtTG9nIiwgInNlc3Npb25JZCIsICJnZXRTZXNzaW9uSWRGcm9tVVJMIiwgInVwZGF0ZUF1dGhCYWRnZSIsICJ1cGRhdGVBdXRoQmFkZ2UiLCAidGV4dCIsICJnZXRQcm92aWRlckluZm8iLCAicG9wdWxhdGVBdHNTY29yZVRhYiIsICJzZXNzaW9uSWQiLCAic3RhdGVNYW5hZ2VyIiwgIl8iLCAiZXNjYXBlSHRtbCIsICJwdXNoRm9jdXNTdGFjayIsICJ0cmFwRm9jdXMiLCAidXBkYXRlQXRzQmFkZ2UiLCAicmVzdG9yZUZvY3VzIiwgImsiLCAicG9wdWxhdGVBdHNTY29yZVRhYiIsICJfQUNUSU9OX0xBQkVMUyIsICJzZW5kQWN0aW9uIiwgInVwZGF0ZVBvc2l0aW9uVGl0bGUiLCAibG9nIiwgIl9BQ1RJT05fTEFCRUxTIiwgInNlbmRBY3Rpb24iLCAic3RhdGVNYW5hZ2VyIiwgIl9lIiwgIlN0b3JhZ2VLZXlzIiwgInRleHQiLCAidXBkYXRlUG9zaXRpb25UaXRsZSIsICJhbmFseXplSm9iIiwgIm1lcmdlUG9zdEFuYWx5c2lzUXVlc3Rpb25zIiwgIm5vcm1hbGl6ZVBvc3RBbmFseXNpc1F1ZXN0aW9ucyIsICJsb2ciLCAibm9ybWFsaXplUG9zdEFuYWx5c2lzUXVlc3Rpb25zIiwgInEiLCAidGV4dCIsICJtZXJnZVBvc3RBbmFseXNpc1F1ZXN0aW9ucyIsICJhbmFseXplSm9iIiwgInN0YXRlTWFuYWdlciIsICJTdG9yYWdlS2V5cyIsICJfZSIsICJwb3B1bGF0ZUdvYWxzVGFiIiwgImxvZyIsICJwb3B1bGF0ZUdvYWxzVGFiIiwgIl9nZXRDdXJyZW50U2Vzc2lvbklkVmFsdWUiLCAiYnVpbGRTZXNzaW9uU3dpdGNoZXJMYWJlbCIsICJjcmVhdGVOZXdTZXNzaW9uQW5kTmF2aWdhdGUiLCAiZW5zdXJlU2Vzc2lvbkNvbnRleHQiLCAiZm9ybWF0U2Vzc2lvblBoYXNlTGFiZWwiLCAiZm9ybWF0U2Vzc2lvblRpbWVzdGFtcCIsICJnZXRBY3RpdmVTZXNzaW9uT3duZXJzaGlwTWV0YSIsICJsb2FkU2Vzc2lvbkZpbGUiLCAibWF5YmVTaG93V2VsY29tZU1vZGFsIiwgInJlc3RvcmVTZXNzaW9uIiwgInNhdmVUYWJEYXRhIiwgImxvZyIsICJmb3JtYXRTZXNzaW9uUGhhc2VMYWJlbCIsICJfZ2V0Q3VycmVudFNlc3Npb25JZFZhbHVlIiwgIl8iLCAiYnVpbGRTZXNzaW9uU3dpdGNoZXJMYWJlbCIsICJnZXRBY3RpdmVTZXNzaW9uT3duZXJzaGlwTWV0YSIsICJmb3JtYXRTZXNzaW9uVGltZXN0YW1wIiwgIm1heWJlU2hvd1dlbGNvbWVNb2RhbCIsICJjcmVhdGVOZXdTZXNzaW9uQW5kTmF2aWdhdGUiLCAic3RhdGVNYW5hZ2VyIiwgIlBIQVNFUyIsICJlbnN1cmVTZXNzaW9uQ29udGV4dCIsICJyZXN0b3JlU2Vzc2lvbiIsICJrIiwgInYiLCAiX2UiLCAibG9hZFNlc3Npb25GaWxlIiwgInNhdmVUYWJEYXRhIiwgInBvcHVsYXRlSm9iVGFiIiwgInNob3dMb2FkSm9iUGFuZWwiLCAiX2dldERlZmF1bHRzIiwgIl9kZWZhdWx0cyIsICJjaGFuZ2VEZWZhdWx0cyIsICJuZXdEZWZhdWx0cyIsICJub29wVGVzdCIsICJlZGl0IiwgInJlZ2V4IiwgIm9wdCIsICJzb3VyY2UiLCAib2JqIiwgIm5hbWUiLCAidmFsIiwgInZhbFNvdXJjZSIsICJvdGhlciIsICJzdXBwb3J0c0xvb2tiZWhpbmQiLCAiYnVsbCIsICJpbmRlbnQiLCAibmV3bGluZSIsICJibG9ja0NvZGUiLCAiZmVuY2VzIiwgImhyIiwgImhlYWRpbmciLCAiYnVsbGV0IiwgImxoZWFkaW5nQ29yZSIsICJsaGVhZGluZyIsICJsaGVhZGluZ0dmbSIsICJfcGFyYWdyYXBoIiwgImJsb2NrVGV4dCIsICJfYmxvY2tMYWJlbCIsICJkZWYiLCAibGlzdCIsICJfdGFnIiwgIl9jb21tZW50IiwgImh0bWwiLCAicGFyYWdyYXBoIiwgImJsb2NrcXVvdGUiLCAiYmxvY2tOb3JtYWwiLCAiZ2ZtVGFibGUiLCAiYmxvY2tHZm0iLCAiYmxvY2tQZWRhbnRpYyIsICJlc2NhcGUiLCAiaW5saW5lQ29kZSIsICJiciIsICJpbmxpbmVUZXh0IiwgIl9wdW5jdHVhdGlvbiIsICJfcHVuY3R1YXRpb25PclNwYWNlIiwgIl9ub3RQdW5jdHVhdGlvbk9yU3BhY2UiLCAicHVuY3R1YXRpb24iLCAiX3B1bmN0dWF0aW9uR2ZtU3Ryb25nRW0iLCAiX3B1bmN0dWF0aW9uT3JTcGFjZUdmbVN0cm9uZ0VtIiwgIl9ub3RQdW5jdHVhdGlvbk9yU3BhY2VHZm1TdHJvbmdFbSIsICJibG9ja1NraXAiLCAiZW1TdHJvbmdMRGVsaW1Db3JlIiwgImVtU3Ryb25nTERlbGltIiwgImVtU3Ryb25nTERlbGltR2ZtIiwgImVtU3Ryb25nUkRlbGltQXN0Q29yZSIsICJlbVN0cm9uZ1JEZWxpbUFzdCIsICJlbVN0cm9uZ1JEZWxpbUFzdEdmbSIsICJlbVN0cm9uZ1JEZWxpbVVuZCIsICJkZWxMRGVsaW0iLCAiZGVsUkRlbGltQ29yZSIsICJkZWxSRGVsaW0iLCAiYW55UHVuY3R1YXRpb24iLCAiYXV0b2xpbmsiLCAiX2lubGluZUNvbW1lbnQiLCAidGFnIiwgIl9pbmxpbmVMYWJlbCIsICJsaW5rIiwgInJlZmxpbmsiLCAibm9saW5rIiwgInJlZmxpbmtTZWFyY2giLCAiX2Nhc2VJbnNlbnNpdGl2ZVByb3RvY29sIiwgImlubGluZU5vcm1hbCIsICJpbmxpbmVQZWRhbnRpYyIsICJpbmxpbmVHZm0iLCAiaW5saW5lQnJlYWtzIiwgImJsb2NrIiwgImlubGluZSIsICJlc2NhcGVSZXBsYWNlbWVudHMiLCAiZ2V0RXNjYXBlUmVwbGFjZW1lbnQiLCAiY2giLCAiZXNjYXBlSHRtbEVudGl0aWVzIiwgImVuY29kZSIsICJjbGVhblVybCIsICJocmVmIiwgInNwbGl0Q2VsbHMiLCAidGFibGVSb3ciLCAiY291bnQiLCAicm93IiwgIm1hdGNoIiwgIm9mZnNldCIsICJzdHIiLCAiZXNjYXBlZCIsICJjdXJyIiwgImNlbGxzIiwgImkiLCAicnRyaW0iLCAiYyIsICJpbnZlcnQiLCAibCIsICJzdWZmTGVuIiwgImN1cnJDaGFyIiwgImZpbmRDbG9zaW5nQnJhY2tldCIsICJiIiwgImxldmVsIiwgImV4cGFuZFRhYnMiLCAibGluZSIsICJjb2wiLCAiZXhwYW5kZWQiLCAiY2hhciIsICJhZGRlZCIsICJvdXRwdXRMaW5rIiwgImNhcCIsICJyYXciLCAibGV4ZXIiLCAicnVsZXMiLCAidGl0bGUiLCAidGV4dCIsICJ0b2tlbiIsICJpbmRlbnRDb2RlQ29tcGVuc2F0aW9uIiwgIm1hdGNoSW5kZW50VG9Db2RlIiwgImluZGVudFRvQ29kZSIsICJub2RlIiwgIm1hdGNoSW5kZW50SW5Ob2RlIiwgImluZGVudEluTm9kZSIsICJfVG9rZW5pemVyIiwgIm9wdGlvbnMiLCAic3JjIiwgInRyaW1tZWQiLCAibGluZXMiLCAidG9rZW5zIiwgImluQmxvY2txdW90ZSIsICJjdXJyZW50TGluZXMiLCAiY3VycmVudFJhdyIsICJjdXJyZW50VGV4dCIsICJ0b3AiLCAibGFzdFRva2VuIiwgIm9sZFRva2VuIiwgIm5ld1RleHQiLCAibmV3VG9rZW4iLCAiaXNvcmRlcmVkIiwgIml0ZW1SZWdleCIsICJlbmRzV2l0aEJsYW5rTGluZSIsICJlbmRFYXJseSIsICJpdGVtQ29udGVudHMiLCAibmV4dExpbmUiLCAiYmxhbmtMaW5lIiwgIm5leHRCdWxsZXRSZWdleCIsICJoclJlZ2V4IiwgImZlbmNlc0JlZ2luUmVnZXgiLCAiaGVhZGluZ0JlZ2luUmVnZXgiLCAiaHRtbEJlZ2luUmVnZXgiLCAiYmxvY2txdW90ZUJlZ2luUmVnZXgiLCAicmF3TGluZSIsICJuZXh0TGluZVdpdGhvdXRUYWJzIiwgImxhc3RJdGVtIiwgIml0ZW0iLCAidGFza1JhdyIsICJjaGVja2JveFRva2VuIiwgInNwYWNlcnMiLCAidCIsICJoYXNNdWx0aXBsZUxpbmVCcmVha3MiLCAiaGVhZGVycyIsICJhbGlnbnMiLCAicm93cyIsICJhbGlnbiIsICJjZWxsIiwgInRyaW1tZWRVcmwiLCAicnRyaW1TbGFzaCIsICJsYXN0UGFyZW5JbmRleCIsICJsaW5rTGVuIiwgImxpbmtzIiwgImxpbmtTdHJpbmciLCAibWFza2VkU3JjIiwgInByZXZDaGFyIiwgImxMZW5ndGgiLCAickRlbGltIiwgInJMZW5ndGgiLCAiZGVsaW1Ub3RhbCIsICJtaWREZWxpbVRvdGFsIiwgImVuZFJlZyIsICJsYXN0Q2hhckxlbmd0aCIsICJoYXNOb25TcGFjZUNoYXJzIiwgImhhc1NwYWNlQ2hhcnNPbkJvdGhFbmRzIiwgInByZXZDYXBaZXJvIiwgIl9MZXhlciIsICJfX0xleGVyIiwgIm5leHQiLCAibGFzdFBhcmFncmFwaENsaXBwZWQiLCAiZXh0VG9rZW5pemVyIiwgImN1dFNyYyIsICJzdGFydEluZGV4IiwgInRlbXBTcmMiLCAidGVtcFN0YXJ0IiwgImdldFN0YXJ0SW5kZXgiLCAiZXJyTXNnIiwgImtlZXBQcmV2Q2hhciIsICJfUmVuZGVyZXIiLCAibGFuZyIsICJsYW5nU3RyaW5nIiwgImNvZGUiLCAiZGVwdGgiLCAib3JkZXJlZCIsICJzdGFydCIsICJib2R5IiwgImoiLCAidHlwZSIsICJzdGFydEF0dHIiLCAiY2hlY2tlZCIsICJoZWFkZXIiLCAiayIsICJjb250ZW50IiwgImNsZWFuSHJlZiIsICJvdXQiLCAiX1RleHRSZW5kZXJlciIsICJfUGFyc2VyIiwgIl9fUGFyc2VyIiwgImFueVRva2VuIiwgImdlbmVyaWNUb2tlbiIsICJyZXQiLCAicmVuZGVyZXIiLCAiX0hvb2tzIiwgIm1hcmtkb3duIiwgIk1hcmtlZCIsICJhcmdzIiwgImNhbGxiYWNrIiwgInZhbHVlcyIsICJ0YWJsZVRva2VuIiwgImxpc3RUb2tlbiIsICJjaGlsZFRva2VucyIsICJleHRlbnNpb25zIiwgInBhY2siLCAib3B0cyIsICJleHQiLCAicHJldlJlbmRlcmVyIiwgImV4dExldmVsIiwgInByb3AiLCAicmVuZGVyZXJQcm9wIiwgInJlbmRlcmVyRnVuYyIsICJ0b2tlbml6ZXIiLCAidG9rZW5pemVyUHJvcCIsICJ0b2tlbml6ZXJGdW5jIiwgInByZXZUb2tlbml6ZXIiLCAiaG9va3MiLCAiaG9va3NQcm9wIiwgImhvb2tzRnVuYyIsICJwcmV2SG9vayIsICJhcmciLCAid2Fsa1Rva2VucyIsICJwYWNrV2Fsa3Rva2VucyIsICJibG9ja1R5cGUiLCAib3JpZ09wdCIsICJ0aHJvd0Vycm9yIiwgInByb2Nlc3NlZFNyYyIsICJwcm9jZXNzZWRUb2tlbnMiLCAiZSIsICJzaWxlbnQiLCAiYXN5bmMiLCAibXNnIiwgIm1hcmtlZEluc3RhbmNlIiwgIm1hcmtlZCIsICJzZXRPcHRpb25zIiwgInVzZSIsICJwYXJzZUlubGluZSIsICJwYXJzZXIiLCAiX1BhcnNlciIsICJsZXhlciIsICJfTGV4ZXIiLCAiZW50cmllcyIsICJzZXRQcm90b3R5cGVPZiIsICJpc0Zyb3plbiIsICJnZXRQcm90b3R5cGVPZiIsICJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCAiT2JqZWN0IiwgImZyZWV6ZSIsICJzZWFsIiwgImNyZWF0ZSIsICJhcHBseSIsICJjb25zdHJ1Y3QiLCAiUmVmbGVjdCIsICJ4IiwgImZ1bmMiLCAidGhpc0FyZyIsICJfbGVuIiwgImFyZ3VtZW50cyIsICJsZW5ndGgiLCAiYXJncyIsICJBcnJheSIsICJfa2V5IiwgIkZ1bmMiLCAiX2xlbjIiLCAiX2tleTIiLCAiYXJyYXlGb3JFYWNoIiwgInVuYXBwbHkiLCAicHJvdG90eXBlIiwgImZvckVhY2giLCAiYXJyYXlMYXN0SW5kZXhPZiIsICJsYXN0SW5kZXhPZiIsICJhcnJheVBvcCIsICJwb3AiLCAiYXJyYXlQdXNoIiwgInB1c2giLCAiYXJyYXlTcGxpY2UiLCAic3BsaWNlIiwgInN0cmluZ1RvTG93ZXJDYXNlIiwgIlN0cmluZyIsICJ0b0xvd2VyQ2FzZSIsICJzdHJpbmdUb1N0cmluZyIsICJ0b1N0cmluZyIsICJzdHJpbmdNYXRjaCIsICJtYXRjaCIsICJzdHJpbmdSZXBsYWNlIiwgInJlcGxhY2UiLCAic3RyaW5nSW5kZXhPZiIsICJpbmRleE9mIiwgInN0cmluZ1RyaW0iLCAidHJpbSIsICJvYmplY3RIYXNPd25Qcm9wZXJ0eSIsICJoYXNPd25Qcm9wZXJ0eSIsICJyZWdFeHBUZXN0IiwgIlJlZ0V4cCIsICJ0ZXN0IiwgInR5cGVFcnJvckNyZWF0ZSIsICJ1bmNvbnN0cnVjdCIsICJUeXBlRXJyb3IiLCAibGFzdEluZGV4IiwgIl9sZW4zIiwgIl9rZXkzIiwgIl9sZW40IiwgIl9rZXk0IiwgImFkZFRvU2V0IiwgInNldCIsICJhcnJheSIsICJ0cmFuc2Zvcm1DYXNlRnVuYyIsICJsIiwgImVsZW1lbnQiLCAibGNFbGVtZW50IiwgImNsZWFuQXJyYXkiLCAiaW5kZXgiLCAiaXNQcm9wZXJ0eUV4aXN0IiwgImNsb25lIiwgIm9iamVjdCIsICJuZXdPYmplY3QiLCAicHJvcGVydHkiLCAidmFsdWUiLCAiaXNBcnJheSIsICJjb25zdHJ1Y3RvciIsICJsb29rdXBHZXR0ZXIiLCAicHJvcCIsICJkZXNjIiwgImdldCIsICJmYWxsYmFja1ZhbHVlIiwgImh0bWwiLCAic3ZnIiwgInN2Z0ZpbHRlcnMiLCAic3ZnRGlzYWxsb3dlZCIsICJtYXRoTWwiLCAibWF0aE1sRGlzYWxsb3dlZCIsICJ0ZXh0IiwgInhtbCIsICJNVVNUQUNIRV9FWFBSIiwgIkVSQl9FWFBSIiwgIlRNUExJVF9FWFBSIiwgIkRBVEFfQVRUUiIsICJBUklBX0FUVFIiLCAiSVNfQUxMT1dFRF9VUkkiLCAiSVNfU0NSSVBUX09SX0RBVEEiLCAiQVRUUl9XSElURVNQQUNFIiwgIkRPQ1RZUEVfTkFNRSIsICJDVVNUT01fRUxFTUVOVCIsICJOT0RFX1RZUEUiLCAiYXR0cmlidXRlIiwgImNkYXRhU2VjdGlvbiIsICJlbnRpdHlSZWZlcmVuY2UiLCAiZW50aXR5Tm9kZSIsICJwcm9ncmVzc2luZ0luc3RydWN0aW9uIiwgImNvbW1lbnQiLCAiZG9jdW1lbnQiLCAiZG9jdW1lbnRUeXBlIiwgImRvY3VtZW50RnJhZ21lbnQiLCAibm90YXRpb24iLCAiZ2V0R2xvYmFsIiwgIndpbmRvdyIsICJfY3JlYXRlVHJ1c3RlZFR5cGVzUG9saWN5IiwgInRydXN0ZWRUeXBlcyIsICJwdXJpZnlIb3N0RWxlbWVudCIsICJjcmVhdGVQb2xpY3kiLCAic3VmZml4IiwgIkFUVFJfTkFNRSIsICJoYXNBdHRyaWJ1dGUiLCAiZ2V0QXR0cmlidXRlIiwgInBvbGljeU5hbWUiLCAiY3JlYXRlSFRNTCIsICJjcmVhdGVTY3JpcHRVUkwiLCAic2NyaXB0VXJsIiwgIl8iLCAiY29uc29sZSIsICJ3YXJuIiwgIl9jcmVhdGVIb29rc01hcCIsICJhZnRlclNhbml0aXplQXR0cmlidXRlcyIsICJhZnRlclNhbml0aXplRWxlbWVudHMiLCAiYWZ0ZXJTYW5pdGl6ZVNoYWRvd0RPTSIsICJiZWZvcmVTYW5pdGl6ZUF0dHJpYnV0ZXMiLCAiYmVmb3JlU2FuaXRpemVFbGVtZW50cyIsICJiZWZvcmVTYW5pdGl6ZVNoYWRvd0RPTSIsICJ1cG9uU2FuaXRpemVBdHRyaWJ1dGUiLCAidXBvblNhbml0aXplRWxlbWVudCIsICJ1cG9uU2FuaXRpemVTaGFkb3dOb2RlIiwgImNyZWF0ZURPTVB1cmlmeSIsICJ1bmRlZmluZWQiLCAiRE9NUHVyaWZ5IiwgInJvb3QiLCAidmVyc2lvbiIsICJWRVJTSU9OIiwgInJlbW92ZWQiLCAibm9kZVR5cGUiLCAiRWxlbWVudCIsICJpc1N1cHBvcnRlZCIsICJvcmlnaW5hbERvY3VtZW50IiwgImN1cnJlbnRTY3JpcHQiLCAiRG9jdW1lbnRGcmFnbWVudCIsICJIVE1MVGVtcGxhdGVFbGVtZW50IiwgIk5vZGUiLCAiTm9kZUZpbHRlciIsICJOYW1lZE5vZGVNYXAiLCAiTW96TmFtZWRBdHRyTWFwIiwgIkhUTUxGb3JtRWxlbWVudCIsICJET01QYXJzZXIiLCAiRWxlbWVudFByb3RvdHlwZSIsICJjbG9uZU5vZGUiLCAicmVtb3ZlIiwgImdldE5leHRTaWJsaW5nIiwgImdldENoaWxkTm9kZXMiLCAiZ2V0UGFyZW50Tm9kZSIsICJ0ZW1wbGF0ZSIsICJjcmVhdGVFbGVtZW50IiwgImNvbnRlbnQiLCAib3duZXJEb2N1bWVudCIsICJ0cnVzdGVkVHlwZXNQb2xpY3kiLCAiZW1wdHlIVE1MIiwgImltcGxlbWVudGF0aW9uIiwgImNyZWF0ZU5vZGVJdGVyYXRvciIsICJjcmVhdGVEb2N1bWVudEZyYWdtZW50IiwgImdldEVsZW1lbnRzQnlUYWdOYW1lIiwgImltcG9ydE5vZGUiLCAiaG9va3MiLCAiY3JlYXRlSFRNTERvY3VtZW50IiwgIkVYUFJFU1NJT05TIiwgIkFMTE9XRURfVEFHUyIsICJERUZBVUxUX0FMTE9XRURfVEFHUyIsICJUQUdTIiwgIkFMTE9XRURfQVRUUiIsICJERUZBVUxUX0FMTE9XRURfQVRUUiIsICJBVFRSUyIsICJDVVNUT01fRUxFTUVOVF9IQU5ETElORyIsICJ0YWdOYW1lQ2hlY2siLCAid3JpdGFibGUiLCAiY29uZmlndXJhYmxlIiwgImVudW1lcmFibGUiLCAiYXR0cmlidXRlTmFtZUNoZWNrIiwgImFsbG93Q3VzdG9taXplZEJ1aWx0SW5FbGVtZW50cyIsICJGT1JCSURfVEFHUyIsICJGT1JCSURfQVRUUiIsICJFWFRSQV9FTEVNRU5UX0hBTkRMSU5HIiwgInRhZ0NoZWNrIiwgImF0dHJpYnV0ZUNoZWNrIiwgIkFMTE9XX0FSSUFfQVRUUiIsICJBTExPV19EQVRBX0FUVFIiLCAiQUxMT1dfVU5LTk9XTl9QUk9UT0NPTFMiLCAiQUxMT1dfU0VMRl9DTE9TRV9JTl9BVFRSIiwgIlNBRkVfRk9SX1RFTVBMQVRFUyIsICJTQUZFX0ZPUl9YTUwiLCAiV0hPTEVfRE9DVU1FTlQiLCAiU0VUX0NPTkZJRyIsICJGT1JDRV9CT0RZIiwgIlJFVFVSTl9ET00iLCAiUkVUVVJOX0RPTV9GUkFHTUVOVCIsICJSRVRVUk5fVFJVU1RFRF9UWVBFIiwgIlNBTklUSVpFX0RPTSIsICJTQU5JVElaRV9OQU1FRF9QUk9QUyIsICJTQU5JVElaRV9OQU1FRF9QUk9QU19QUkVGSVgiLCAiS0VFUF9DT05URU5UIiwgIklOX1BMQUNFIiwgIlVTRV9QUk9GSUxFUyIsICJGT1JCSURfQ09OVEVOVFMiLCAiREVGQVVMVF9GT1JCSURfQ09OVEVOVFMiLCAiREFUQV9VUklfVEFHUyIsICJERUZBVUxUX0RBVEFfVVJJX1RBR1MiLCAiVVJJX1NBRkVfQVRUUklCVVRFUyIsICJERUZBVUxUX1VSSV9TQUZFX0FUVFJJQlVURVMiLCAiTUFUSE1MX05BTUVTUEFDRSIsICJTVkdfTkFNRVNQQUNFIiwgIkhUTUxfTkFNRVNQQUNFIiwgIk5BTUVTUEFDRSIsICJJU19FTVBUWV9JTlBVVCIsICJBTExPV0VEX05BTUVTUEFDRVMiLCAiREVGQVVMVF9BTExPV0VEX05BTUVTUEFDRVMiLCAiTUFUSE1MX1RFWFRfSU5URUdSQVRJT05fUE9JTlRTIiwgIkhUTUxfSU5URUdSQVRJT05fUE9JTlRTIiwgIkNPTU1PTl9TVkdfQU5EX0hUTUxfRUxFTUVOVFMiLCAiUEFSU0VSX01FRElBX1RZUEUiLCAiU1VQUE9SVEVEX1BBUlNFUl9NRURJQV9UWVBFUyIsICJERUZBVUxUX1BBUlNFUl9NRURJQV9UWVBFIiwgIkNPTkZJRyIsICJmb3JtRWxlbWVudCIsICJpc1JlZ2V4T3JGdW5jdGlvbiIsICJ0ZXN0VmFsdWUiLCAiRnVuY3Rpb24iLCAiX3BhcnNlQ29uZmlnIiwgImNmZyIsICJBRERfVVJJX1NBRkVfQVRUUiIsICJBRERfREFUQV9VUklfVEFHUyIsICJBTExPV0VEX1VSSV9SRUdFWFAiLCAiQUREX1RBR1MiLCAiQUREX0FUVFIiLCAiQUREX0ZPUkJJRF9DT05URU5UUyIsICJ0YWJsZSIsICJ0Ym9keSIsICJUUlVTVEVEX1RZUEVTX1BPTElDWSIsICJBTExfU1ZHX1RBR1MiLCAiQUxMX01BVEhNTF9UQUdTIiwgIl9jaGVja1ZhbGlkTmFtZXNwYWNlIiwgInBhcmVudCIsICJ0YWdOYW1lIiwgIm5hbWVzcGFjZVVSSSIsICJwYXJlbnRUYWdOYW1lIiwgIkJvb2xlYW4iLCAiX2ZvcmNlUmVtb3ZlIiwgIm5vZGUiLCAicmVtb3ZlQ2hpbGQiLCAiX3JlbW92ZUF0dHJpYnV0ZSIsICJuYW1lIiwgImdldEF0dHJpYnV0ZU5vZGUiLCAiZnJvbSIsICJyZW1vdmVBdHRyaWJ1dGUiLCAic2V0QXR0cmlidXRlIiwgIl9pbml0RG9jdW1lbnQiLCAiZGlydHkiLCAiZG9jIiwgImxlYWRpbmdXaGl0ZXNwYWNlIiwgIm1hdGNoZXMiLCAiZGlydHlQYXlsb2FkIiwgInBhcnNlRnJvbVN0cmluZyIsICJkb2N1bWVudEVsZW1lbnQiLCAiY3JlYXRlRG9jdW1lbnQiLCAiaW5uZXJIVE1MIiwgImJvZHkiLCAiaW5zZXJ0QmVmb3JlIiwgImNyZWF0ZVRleHROb2RlIiwgImNoaWxkTm9kZXMiLCAiY2FsbCIsICJfY3JlYXRlTm9kZUl0ZXJhdG9yIiwgIlNIT1dfRUxFTUVOVCIsICJTSE9XX0NPTU1FTlQiLCAiU0hPV19URVhUIiwgIlNIT1dfUFJPQ0VTU0lOR19JTlNUUlVDVElPTiIsICJTSE9XX0NEQVRBX1NFQ1RJT04iLCAiX2lzQ2xvYmJlcmVkIiwgIm5vZGVOYW1lIiwgInRleHRDb250ZW50IiwgImF0dHJpYnV0ZXMiLCAiaGFzQ2hpbGROb2RlcyIsICJfaXNOb2RlIiwgIl9leGVjdXRlSG9va3MiLCAiY3VycmVudE5vZGUiLCAiZGF0YSIsICJob29rIiwgIl9zYW5pdGl6ZUVsZW1lbnRzIiwgImFsbG93ZWRUYWdzIiwgImZpcnN0RWxlbWVudENoaWxkIiwgIl9pc0Jhc2ljQ3VzdG9tRWxlbWVudCIsICJwYXJlbnROb2RlIiwgImNoaWxkQ291bnQiLCAiaSIsICJjaGlsZENsb25lIiwgIl9fcmVtb3ZhbENvdW50IiwgImV4cHIiLCAiX2lzVmFsaWRBdHRyaWJ1dGUiLCAibGNUYWciLCAibGNOYW1lIiwgIl9zYW5pdGl6ZUF0dHJpYnV0ZXMiLCAiaG9va0V2ZW50IiwgImF0dHJOYW1lIiwgImF0dHJWYWx1ZSIsICJrZWVwQXR0ciIsICJhbGxvd2VkQXR0cmlidXRlcyIsICJmb3JjZUtlZXBBdHRyIiwgImF0dHIiLCAiaW5pdFZhbHVlIiwgImdldEF0dHJpYnV0ZVR5cGUiLCAic2V0QXR0cmlidXRlTlMiLCAiX3Nhbml0aXplU2hhZG93RE9NIiwgImZyYWdtZW50IiwgInNoYWRvd05vZGUiLCAic2hhZG93SXRlcmF0b3IiLCAibmV4dE5vZGUiLCAic2FuaXRpemUiLCAiaW1wb3J0ZWROb2RlIiwgInJldHVybk5vZGUiLCAiYXBwZW5kQ2hpbGQiLCAiZmlyc3RDaGlsZCIsICJub2RlSXRlcmF0b3IiLCAic2hhZG93cm9vdCIsICJzaGFkb3dyb290bW9kZSIsICJzZXJpYWxpemVkSFRNTCIsICJvdXRlckhUTUwiLCAiZG9jdHlwZSIsICJzZXRDb25maWciLCAiY2xlYXJDb25maWciLCAiaXNWYWxpZEF0dHJpYnV0ZSIsICJ0YWciLCAiYWRkSG9vayIsICJlbnRyeVBvaW50IiwgImhvb2tGdW5jdGlvbiIsICJyZW1vdmVIb29rIiwgInJlbW92ZUhvb2tzIiwgInJlbW92ZUFsbEhvb2tzIiwgImxvZyIsICJ0ZXh0IiwgInBvcHVsYXRlSm9iVGFiIiwgImh0bWwiLCAiUEhBU0VTIiwgInNob3dMb2FkSm9iUGFuZWwiLCAic3RhdGVNYW5hZ2VyIiwgImV2ZW50IiwgIm0iLCAidSIsICJfcHJvY2VlZEFmdGVySW50YWtlIiwgIl9zaG93SW50YWtlQ29uZmlybUNhcmQiLCAic2VuZE1lc3NhZ2UiLCAibG9nIiwgIlJFVFJZX1BPTElDWV9TVE9SQUdFX0tFWSIsICJ0ZXh0IiwgInNlbmRNZXNzYWdlIiwgInN0YXRlTWFuYWdlciIsICJnZXRTZXNzaW9uSWRGcm9tVVJMIiwgIl9zaG93SW50YWtlQ29uZmlybUNhcmQiLCAiX3Byb2NlZWRBZnRlckludGFrZSIsICJfZSIsICJhc2tQb3N0QW5hbHlzaXNRdWVzdGlvbnMiLCAiaGFuZGxlUXVlc3Rpb25SZXNwb25zZSIsICJwb3B1bGF0ZVF1ZXN0aW9uc1RhYiIsICJsb2ciLCAiYXNrUG9zdEFuYWx5c2lzUXVlc3Rpb25zIiwgInBvcHVsYXRlUXVlc3Rpb25zVGFiIiwgInN0YXRlTWFuYWdlciIsICJxIiwgIl8iLCAiaGFuZGxlUXVlc3Rpb25SZXNwb25zZSIsICJidWlsZEV4cGVyaWVuY2VSZXZpZXdUYWJsZSIsICJoYW5kbGVFeHBlcmllbmNlUmVzcG9uc2UiLCAibG9nIiwgIl9maW5kRXhwZXJpZW5jZVJlY29tbWVuZGF0aW9uUmVjb3JkIiwgIl8iLCAiYnVpbGRFeHBlcmllbmNlUmV2aWV3VGFibGUiLCAiYiIsICJoYW5kbGVFeHBlcmllbmNlUmVzcG9uc2UiLCAic3RhdGVNYW5hZ2VyIiwgImJ1aWxkU2tpbGxzUmV2aWV3VGFibGUiLCAiaGFuZGxlU2tpbGxzUmVzcG9uc2UiLCAibG9nIiwgIm0iLCAieCIsICJuYW1lIiwgInNraWxsIiwgIl8iLCAiYnVpbGRTa2lsbHNSZXZpZXdUYWJsZSIsICJzdGF0ZU1hbmFnZXIiLCAiYiIsICJlIiwgInNraWxsTmFtZSIsICJoYW5kbGVTa2lsbHNSZXNwb25zZSIsICJfYWNoVmVyYldhcm5pbmciLCAiYnVpbGRBY2hpZXZlbWVudHNFZGl0b3IiLCAiYnVpbGRBY2hpZXZlbWVudHNSZXZpZXdUYWJsZSIsICJlbnRyaWVzIiwgIl8iLCAiYnVpbGRBY2hpZXZlbWVudHNSZXZpZXdUYWJsZSIsICJiIiwgImh0bWwiLCAiayIsICJ2IiwgInN0YXRlTWFuYWdlciIsICJidWlsZEFjaGlldmVtZW50c0VkaXRvciIsICJfYWNoVmVyYldhcm5pbmciLCAidGV4dCIsICJfZSIsICJidWlsZFRhZ2xpbmVSZXZpZXdTZWN0aW9uIiwgImJ1aWxkVGFnbGluZVJldmlld1NlY3Rpb24iLCAiX2UiLCAic3RhdGVNYW5hZ2VyIiwgImJ1aWxkU3VtbWFyeUZvY3VzU2VjdGlvbiIsICJidWlsZFN1bW1hcnlGb2N1c1NlY3Rpb24iLCAiayIsICJ0ZXh0IiwgInciLCAic3RhdGVNYW5hZ2VyIiwgImJ1aWxkUHVibGljYXRpb25zUmV2aWV3VGFibGUiLCAibG9nIiwgImJ1aWxkUHVibGljYXRpb25zUmV2aWV3VGFibGUiLCAicSIsICJodG1sIiwgImJ0biIsICJzdGF0ZU1hbmFnZXIiLCAiYXBwbHlSZXdyaXRlQWN0aW9uIiwgImZldGNoQW5kUmV2aWV3UmV3cml0ZXMiLCAicmVuZGVyUmV3cml0ZVBhbmVsIiwgInJld3JpdGVEZWNpc2lvbnMiLCAic3VibWl0UmV3cml0ZURlY2lzaW9ucyIsICJyZXdyaXRlRGVjaXNpb25zIiwgIl8iLCAiZmV0Y2hBbmRSZXZpZXdSZXdyaXRlcyIsICJyZW5kZXJSZXdyaXRlUGFuZWwiLCAidyIsICJhcHBseVJld3JpdGVBY3Rpb24iLCAiYiIsICJtIiwgImkiLCAiaiIsICJrIiwgInN1Ym1pdFJld3JpdGVEZWNpc2lvbnMiLCAic3RhdGVNYW5hZ2VyIiwgInBvcHVsYXRlU3BlbGxDaGVja1RhYiIsICJzdWJtaXRTcGVsbENoZWNrRGVjaXNpb25zIiwgImxvZyIsICJwb3B1bGF0ZVNwZWxsQ2hlY2tUYWIiLCAiY29udGVudCIsICJzdGF0ZU1hbmFnZXIiLCAiaHRtbCIsICJiIiwgImF0c1Njb3JlIiwgImsiLCAic3VibWl0U3BlbGxDaGVja0RlY2lzaW9ucyIsICJwb3B1bGF0ZURvd25sb2FkVGFiIiwgImxvZyIsICJodG1sIiwgIl8iLCAicG9wdWxhdGVEb3dubG9hZFRhYiIsICJzdGF0ZU1hbmFnZXIiLCAidyIsICJtIiwgImZpbmFsR2VuZXJhdGlvbkNvbXBsZXRlIiwgImxvZyIsICJodG1sIiwgImZpbmFsR2VuZXJhdGlvbkNvbXBsZXRlIiwgInN0YXRlTWFuYWdlciIsICJyZW5kZXJNYXN0ZXJEYXRhQWlVcGRhdGVEaXNhYmxlZE5vdGUiLCAicmVuZGVyTWFzdGVyRGF0YUFpVXBkYXRlUGFuZWwiLCAibG9nIiwgInJlbmRlck1hc3RlckRhdGFBaVVwZGF0ZVBhbmVsIiwgInJlbmRlck1hc3RlckRhdGFBaVVwZGF0ZURpc2FibGVkTm90ZSIsICJtIiwgImV2ZW50IiwgIm9wZW5NYXN0ZXJDdk1vZGFsIiwgInBvcHVsYXRlTWFzdGVyVGFiIiwgInJlZG9NYXN0ZXJEYXRhQ2hhbmdlIiwgInVuZG9NYXN0ZXJEYXRhQ2hhbmdlIiwgIngiLCAidiIsICJ0ZXh0IiwgImsiLCAiXyIsICJzZXNzaW9uSWQiLCAiZXZlbnQiLCAiX3JlbmRlckNvbnNpc3RlbmN5UmVwb3J0IiwgInBvcHVsYXRlQ292ZXJMZXR0ZXJUYWIiLCAicG9wdWxhdGVDb3ZlckxldHRlclRhYiIsICJfIiwgInRleHQiLCAiX3JlbmRlckNvbnNpc3RlbmN5UmVwb3J0IiwgInN0YXRlTWFuYWdlciIsICJrIiwgInJlIiwgInBvcHVsYXRlU2NyZWVuaW5nVGFiIiwgInEiLCAiYiIsICJfIiwgInBvcHVsYXRlRmluYWxpc2VUYWIiLCAibG9nIiwgIm0iLCAicG9wdWxhdGVGaW5hbGlzZVRhYiIsICJodG1sIiwgIl9yZW5kZXJSZXdyaXRlQXVkaXRMb2ciLCAiXyIsICJhdHNTY29yZSIsICJwb3B1bGF0ZUludGVydmlld1ByZXBUYWIiLCAibG9nIiwgInBvcHVsYXRlSW50ZXJ2aWV3UHJlcFRhYiIsICJwb3B1bGF0ZVRoYW5rWW91VGFiIiwgImxvZyIsICJwb3B1bGF0ZVRoYW5rWW91VGFiIiwgInBvcHVsYXRlSGFydmVzdFRhYiIsICJsb2ciLCAiYiIsICJrIiwgInYiLCAicG9wdWxhdGVIYXJ2ZXN0VGFiIiwgImluaXRFYXJseVByZXZpZXdQYW5lbCIsICJ0b2dnbGVFYXJseVByZXZpZXdQYW5lbCIsICJTdG9yYWdlS2V5cyIsICJfZSIsICJhcGlDYWxsIiwgInN0YXRlTWFuYWdlciIsICJ0b2dnbGVFYXJseVByZXZpZXdQYW5lbCIsICJpbml0RWFybHlQcmV2aWV3UGFuZWwiLCAiX3VwZGF0ZVNlc3Npb25Td2l0Y2hlckhlYWRlciIsICJvcGVuU2Vzc2lvbnNNb2RhbCIsICJzaG93T3duZXJzaGlwQ29uZmxpY3REaWFsb2ciLCAiXyIsICJfY3JlYXRlZElzb0Zyb21TZXNzaW9uUGF0aCIsICJiIiwgInYiLCAiZXZlbnQiLCAiZm10RGF0ZSIsICJodG1sIiwgImluaXRLZXlib2FyZFNob3J0Y3V0cyIsICJyZXNldENhcmRGb2N1cyIsICJzZXR1cEV2ZW50TGlzdGVuZXJzIiwgInRleHQiXQp9Cg== +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbm9kZV9tb2R1bGVzL2xvZ2xldmVsL2xpYi9sb2dsZXZlbC5qcyIsICJsb2dnZXIuanMiLCAidXRpbHMuanMiLCAiYXBpLWNsaWVudC5qcyIsICJmZXRjaC11dGlscy5qcyIsICJzdGF0ZS1tYW5hZ2VyLmpzIiwgInByb3ZpZGVyLWluZm8uanMiLCAidWktY29yZS5qcyIsICJ3b3JrZmxvdy1zdGVwcy5qcyIsICJsYXlvdXQtaW5zdHJ1Y3Rpb24uanMiLCAiYXRzLXJlZmluZW1lbnQuanMiLCAibWVzc2FnZS1xdWV1ZS5qcyIsICJyZXZpZXctdGFibGUtYmFzZS5qcyIsICJwcmV2aWV3LXJlbmRlci5qcyIsICJ2YWxpZGF0b3JzLmpzIiwgInJlY29tbWVuZGF0aW9uLWhlbHBlcnMuanMiLCAidWktaGVscGVycy5qcyIsICJwcm9wb3NhbC1yZXZpZXcuanMiLCAibGxtLWxvZy5qcyIsICJhdXRoLXByb3ZpZGVyLmpzIiwgImF0cy1tb2RhbHMuanMiLCAic2Vzc2lvbi1hY3Rpb25zLmpzIiwgImpvYi1hbmFseXNpcy5qcyIsICJnb2Fscy5qcyIsICJzZXNzaW9uLW1hbmFnZXIuanMiLCAiam9iLWlucHV0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tYXJrZWQvc3JjL2RlZmF1bHRzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9tYXJrZWQvc3JjL3J1bGVzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9tYXJrZWQvc3JjL2hlbHBlcnMudHMiLCAiLi4vbm9kZV9tb2R1bGVzL21hcmtlZC9zcmMvVG9rZW5pemVyLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9tYXJrZWQvc3JjL0xleGVyLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9tYXJrZWQvc3JjL1JlbmRlcmVyLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9tYXJrZWQvc3JjL1RleHRSZW5kZXJlci50cyIsICIuLi9ub2RlX21vZHVsZXMvbWFya2VkL3NyYy9QYXJzZXIudHMiLCAiLi4vbm9kZV9tb2R1bGVzL21hcmtlZC9zcmMvSG9va3MudHMiLCAiLi4vbm9kZV9tb2R1bGVzL21hcmtlZC9zcmMvSW5zdGFuY2UudHMiLCAiLi4vbm9kZV9tb2R1bGVzL21hcmtlZC9zcmMvbWFya2VkLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9kb21wdXJpZnkvc3JjL3V0aWxzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9kb21wdXJpZnkvc3JjL3RhZ3MudHMiLCAiLi4vbm9kZV9tb2R1bGVzL2RvbXB1cmlmeS9zcmMvYXR0cnMudHMiLCAiLi4vbm9kZV9tb2R1bGVzL2RvbXB1cmlmeS9zcmMvcmVnZXhwLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9kb21wdXJpZnkvc3JjL3B1cmlmeS50cyIsICJtZXNzYWdlLWRpc3BhdGNoLmpzIiwgInF1ZXN0aW9ucy1wYW5lbC5qcyIsICJyZXZpZXctaWNvbnMuanMiLCAiZXhwZXJpZW5jZS1yZXZpZXcuanMiLCAic2tpbGxzLXJldmlldy5qcyIsICJhY2hpZXZlbWVudHMtcmV2aWV3LmpzIiwgInRhZ2xpbmUtcmV2aWV3LmpzIiwgInN1bW1hcnktcmV2aWV3LmpzIiwgInB1YmxpY2F0aW9ucy1yZXZpZXcuanMiLCAicmV3cml0ZS1yZXZpZXcuanMiLCAic3BlbGwtY2hlY2suanMiLCAiZG93bmxvYWQtdGFiLmpzIiwgImZpbmFsLWdlbmVyYXRlLmpzIiwgIm1hc3Rlci1kYXRhLWFpLXVwZGF0ZS5qcyIsICJtYXN0ZXItY3YuanMiLCAiY292ZXItbGV0dGVyLmpzIiwgInNjcmVlbmluZy1xdWVzdGlvbnMuanMiLCAiZmluYWxpc2UuanMiLCAiaW50ZXJ2aWV3LXByZXAuanMiLCAidGhhbmsteW91LmpzIiwgImhhcnZlc3QuanMiLCAiZWFybHktcHJldmlldy1wYW5lbC5qcyIsICJzZXNzaW9uLXN3aXRjaGVyLXVpLmpzIiwgImtleWJvYXJkLXNob3J0Y3V0cy5qcyIsICJhcHAuanMiLCAic3JjL21haW4uanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qXG4qIGxvZ2xldmVsIC0gaHR0cHM6Ly9naXRodWIuY29tL3BpbXRlcnJ5L2xvZ2xldmVsXG4qXG4qIENvcHlyaWdodCAoYykgMjAxMyBUaW0gUGVycnlcbiogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuKi9cbihmdW5jdGlvbiAocm9vdCwgZGVmaW5pdGlvbikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcbiAgICAgICAgZGVmaW5lKGRlZmluaXRpb24pO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBkZWZpbml0aW9uKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcm9vdC5sb2cgPSBkZWZpbml0aW9uKCk7XG4gICAgfVxufSh0aGlzLCBmdW5jdGlvbiAoKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAvLyBTbGlnaHRseSBkdWJpb3VzIHRyaWNrcyB0byBjdXQgZG93biBtaW5pbWl6ZWQgZmlsZSBzaXplXG4gICAgdmFyIG5vb3AgPSBmdW5jdGlvbigpIHt9O1xuICAgIHZhciB1bmRlZmluZWRUeXBlID0gXCJ1bmRlZmluZWRcIjtcbiAgICB2YXIgaXNJRSA9ICh0eXBlb2Ygd2luZG93ICE9PSB1bmRlZmluZWRUeXBlKSAmJiAodHlwZW9mIHdpbmRvdy5uYXZpZ2F0b3IgIT09IHVuZGVmaW5lZFR5cGUpICYmIChcbiAgICAgICAgL1RyaWRlbnRcXC98TVNJRSAvLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpXG4gICAgKTtcblxuICAgIHZhciBsb2dNZXRob2RzID0gW1xuICAgICAgICBcInRyYWNlXCIsXG4gICAgICAgIFwiZGVidWdcIixcbiAgICAgICAgXCJpbmZvXCIsXG4gICAgICAgIFwid2FyblwiLFxuICAgICAgICBcImVycm9yXCJcbiAgICBdO1xuXG4gICAgdmFyIF9sb2dnZXJzQnlOYW1lID0ge307XG4gICAgdmFyIGRlZmF1bHRMb2dnZXIgPSBudWxsO1xuXG4gICAgLy8gQ3Jvc3MtYnJvd3NlciBiaW5kIGVxdWl2YWxlbnQgdGhhdCB3b3JrcyBhdCBsZWFzdCBiYWNrIHRvIElFNlxuICAgIGZ1bmN0aW9uIGJpbmRNZXRob2Qob2JqLCBtZXRob2ROYW1lKSB7XG4gICAgICAgIHZhciBtZXRob2QgPSBvYmpbbWV0aG9kTmFtZV07XG4gICAgICAgIGlmICh0eXBlb2YgbWV0aG9kLmJpbmQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBtZXRob2QuYmluZChvYmopO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQuY2FsbChtZXRob2QsIG9iaik7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgLy8gTWlzc2luZyBiaW5kIHNoaW0gb3IgSUU4ICsgTW9kZXJuaXpyLCBmYWxsYmFjayB0byB3cmFwcGluZ1xuICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5hcHBseShtZXRob2QsIFtvYmosIGFyZ3VtZW50c10pO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUcmFjZSgpIGRvZXNuJ3QgcHJpbnQgdGhlIG1lc3NhZ2UgaW4gSUUsIHNvIGZvciB0aGF0IGNhc2Ugd2UgbmVlZCB0byB3cmFwIGl0XG4gICAgZnVuY3Rpb24gdHJhY2VGb3JJRSgpIHtcbiAgICAgICAgaWYgKGNvbnNvbGUubG9nKSB7XG4gICAgICAgICAgICBpZiAoY29uc29sZS5sb2cuYXBwbHkpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZy5hcHBseShjb25zb2xlLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBJbiBvbGQgSUUsIG5hdGl2ZSBjb25zb2xlIG1ldGhvZHMgdGhlbXNlbHZlcyBkb24ndCBoYXZlIGFwcGx5KCkuXG4gICAgICAgICAgICAgICAgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmFwcGx5KGNvbnNvbGUubG9nLCBbY29uc29sZSwgYXJndW1lbnRzXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnNvbGUudHJhY2UpIGNvbnNvbGUudHJhY2UoKTtcbiAgICB9XG5cbiAgICAvLyBCdWlsZCB0aGUgYmVzdCBsb2dnaW5nIG1ldGhvZCBwb3NzaWJsZSBmb3IgdGhpcyBlbnZcbiAgICAvLyBXaGVyZXZlciBwb3NzaWJsZSB3ZSB3YW50IHRvIGJpbmQsIG5vdCB3cmFwLCB0byBwcmVzZXJ2ZSBzdGFjayB0cmFjZXNcbiAgICBmdW5jdGlvbiByZWFsTWV0aG9kKG1ldGhvZE5hbWUpIHtcbiAgICAgICAgaWYgKG1ldGhvZE5hbWUgPT09ICdkZWJ1ZycpIHtcbiAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAnbG9nJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgY29uc29sZSA9PT0gdW5kZWZpbmVkVHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBObyBtZXRob2QgcG9zc2libGUsIGZvciBub3cgLSBmaXhlZCBsYXRlciBieSBlbmFibGVMb2dnaW5nV2hlbkNvbnNvbGVBcnJpdmVzXG4gICAgICAgIH0gZWxzZSBpZiAobWV0aG9kTmFtZSA9PT0gJ3RyYWNlJyAmJiBpc0lFKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJhY2VGb3JJRTtcbiAgICAgICAgfSBlbHNlIGlmIChjb25zb2xlW21ldGhvZE5hbWVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBiaW5kTWV0aG9kKGNvbnNvbGUsIG1ldGhvZE5hbWUpO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnNvbGUubG9nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBiaW5kTWV0aG9kKGNvbnNvbGUsICdsb2cnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBub29wO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhlc2UgcHJpdmF0ZSBmdW5jdGlvbnMgYWx3YXlzIG5lZWQgYHRoaXNgIHRvIGJlIHNldCBwcm9wZXJseVxuXG4gICAgZnVuY3Rpb24gcmVwbGFjZUxvZ2dpbmdNZXRob2RzKCkge1xuICAgICAgICAvKmpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqL1xuICAgICAgICB2YXIgbGV2ZWwgPSB0aGlzLmdldExldmVsKCk7XG5cbiAgICAgICAgLy8gUmVwbGFjZSB0aGUgYWN0dWFsIG1ldGhvZHMuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbG9nTWV0aG9kcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIG1ldGhvZE5hbWUgPSBsb2dNZXRob2RzW2ldO1xuICAgICAgICAgICAgdGhpc1ttZXRob2ROYW1lXSA9IChpIDwgbGV2ZWwpID9cbiAgICAgICAgICAgICAgICBub29wIDpcbiAgICAgICAgICAgICAgICB0aGlzLm1ldGhvZEZhY3RvcnkobWV0aG9kTmFtZSwgbGV2ZWwsIHRoaXMubmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWZpbmUgbG9nLmxvZyBhcyBhbiBhbGlhcyBmb3IgbG9nLmRlYnVnXG4gICAgICAgIHRoaXMubG9nID0gdGhpcy5kZWJ1ZztcblxuICAgICAgICAvLyBSZXR1cm4gYW55IGltcG9ydGFudCB3YXJuaW5ncy5cbiAgICAgICAgaWYgKHR5cGVvZiBjb25zb2xlID09PSB1bmRlZmluZWRUeXBlICYmIGxldmVsIDwgdGhpcy5sZXZlbHMuU0lMRU5UKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJObyBjb25zb2xlIGF2YWlsYWJsZSBmb3IgbG9nZ2luZ1wiO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gSW4gb2xkIElFIHZlcnNpb25zLCB0aGUgY29uc29sZSBpc24ndCBwcmVzZW50IHVudGlsIHlvdSBmaXJzdCBvcGVuIGl0LlxuICAgIC8vIFdlIGJ1aWxkIHJlYWxNZXRob2QoKSByZXBsYWNlbWVudHMgaGVyZSB0aGF0IHJlZ2VuZXJhdGUgbG9nZ2luZyBtZXRob2RzXG4gICAgZnVuY3Rpb24gZW5hYmxlTG9nZ2luZ1doZW5Db25zb2xlQXJyaXZlcyhtZXRob2ROYW1lKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09IHVuZGVmaW5lZFR5cGUpIHtcbiAgICAgICAgICAgICAgICByZXBsYWNlTG9nZ2luZ01ldGhvZHMuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgICAgICB0aGlzW21ldGhvZE5hbWVdLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQnkgZGVmYXVsdCwgd2UgdXNlIGNsb3NlbHkgYm91bmQgcmVhbCBtZXRob2RzIHdoZXJldmVyIHBvc3NpYmxlLCBhbmRcbiAgICAvLyBvdGhlcndpc2Ugd2Ugd2FpdCBmb3IgYSBjb25zb2xlIHRvIGFwcGVhciwgYW5kIHRoZW4gdHJ5IGFnYWluLlxuICAgIGZ1bmN0aW9uIGRlZmF1bHRNZXRob2RGYWN0b3J5KG1ldGhvZE5hbWUsIF9sZXZlbCwgX2xvZ2dlck5hbWUpIHtcbiAgICAgICAgLypqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi9cbiAgICAgICAgcmV0dXJuIHJlYWxNZXRob2QobWV0aG9kTmFtZSkgfHxcbiAgICAgICAgICAgICAgIGVuYWJsZUxvZ2dpbmdXaGVuQ29uc29sZUFycml2ZXMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBMb2dnZXIobmFtZSwgZmFjdG9yeSkge1xuICAgICAgLy8gUHJpdmF0ZSBpbnN0YW5jZSB2YXJpYWJsZXMuXG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAvKipcbiAgICAgICAqIFRoZSBsZXZlbCBpbmhlcml0ZWQgZnJvbSBhIHBhcmVudCBsb2dnZXIgKG9yIGEgZ2xvYmFsIGRlZmF1bHQpLiBXZVxuICAgICAgICogY2FjaGUgdGhpcyBoZXJlIHJhdGhlciB0aGFuIGRlbGVnYXRpbmcgdG8gdGhlIHBhcmVudCBzbyB0aGF0IGl0IHN0YXlzXG4gICAgICAgKiBpbiBzeW5jIHdpdGggdGhlIGFjdHVhbCBsb2dnaW5nIG1ldGhvZHMgdGhhdCB3ZSBoYXZlIGluc3RhbGxlZCAodGhlXG4gICAgICAgKiBwYXJlbnQgY291bGQgY2hhbmdlIGxldmVscyBidXQgd2UgbWlnaHQgbm90IGhhdmUgcmVidWlsdCB0aGUgbG9nZ2Vyc1xuICAgICAgICogaW4gdGhpcyBjaGlsZCB5ZXQpLlxuICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAqL1xuICAgICAgdmFyIGluaGVyaXRlZExldmVsO1xuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBsZXZlbCBmb3IgdGhpcyBsb2dnZXIsIGlmIGFueS4gSWYgc2V0LCB0aGlzIG92ZXJyaWRlc1xuICAgICAgICogYGluaGVyaXRlZExldmVsYC5cbiAgICAgICAqIEB0eXBlIHtudW1iZXJ8bnVsbH1cbiAgICAgICAqL1xuICAgICAgdmFyIGRlZmF1bHRMZXZlbDtcbiAgICAgIC8qKlxuICAgICAgICogQSB1c2VyLXNwZWNpZmljIGxldmVsIGZvciB0aGlzIGxvZ2dlci4gSWYgc2V0LCB0aGlzIG92ZXJyaWRlc1xuICAgICAgICogYGRlZmF1bHRMZXZlbGAuXG4gICAgICAgKiBAdHlwZSB7bnVtYmVyfG51bGx9XG4gICAgICAgKi9cbiAgICAgIHZhciB1c2VyTGV2ZWw7XG5cbiAgICAgIHZhciBzdG9yYWdlS2V5ID0gXCJsb2dsZXZlbFwiO1xuICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHN0b3JhZ2VLZXkgKz0gXCI6XCIgKyBuYW1lO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzeW1ib2xcIikge1xuICAgICAgICBzdG9yYWdlS2V5ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBwZXJzaXN0TGV2ZWxJZlBvc3NpYmxlKGxldmVsTnVtKSB7XG4gICAgICAgICAgdmFyIGxldmVsTmFtZSA9IChsb2dNZXRob2RzW2xldmVsTnVtXSB8fCAnc2lsZW50JykudG9VcHBlckNhc2UoKTtcblxuICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSB1bmRlZmluZWRUeXBlIHx8ICFzdG9yYWdlS2V5KSByZXR1cm47XG5cbiAgICAgICAgICAvLyBVc2UgbG9jYWxTdG9yYWdlIGlmIGF2YWlsYWJsZVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Vbc3RvcmFnZUtleV0gPSBsZXZlbE5hbWU7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG5cbiAgICAgICAgICAvLyBVc2Ugc2Vzc2lvbiBjb29raWUgYXMgZmFsbGJhY2tcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuY29va2llID1cbiAgICAgICAgICAgICAgICBlbmNvZGVVUklDb21wb25lbnQoc3RvcmFnZUtleSkgKyBcIj1cIiArIGxldmVsTmFtZSArIFwiO1wiO1xuICAgICAgICAgIH0gY2F0Y2ggKGlnbm9yZSkge31cbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gZ2V0UGVyc2lzdGVkTGV2ZWwoKSB7XG4gICAgICAgICAgdmFyIHN0b3JlZExldmVsO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IHVuZGVmaW5lZFR5cGUgfHwgIXN0b3JhZ2VLZXkpIHJldHVybjtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHN0b3JlZExldmVsID0gd2luZG93LmxvY2FsU3RvcmFnZVtzdG9yYWdlS2V5XTtcbiAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG5cbiAgICAgICAgICAvLyBGYWxsYmFjayB0byBjb29raWVzIGlmIGxvY2FsIHN0b3JhZ2UgZ2l2ZXMgdXMgbm90aGluZ1xuICAgICAgICAgIGlmICh0eXBlb2Ygc3RvcmVkTGV2ZWwgPT09IHVuZGVmaW5lZFR5cGUpIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIHZhciBjb29raWUgPSB3aW5kb3cuZG9jdW1lbnQuY29va2llO1xuICAgICAgICAgICAgICAgICAgdmFyIGNvb2tpZU5hbWUgPSBlbmNvZGVVUklDb21wb25lbnQoc3RvcmFnZUtleSk7XG4gICAgICAgICAgICAgICAgICB2YXIgbG9jYXRpb24gPSBjb29raWUuaW5kZXhPZihjb29raWVOYW1lICsgXCI9XCIpO1xuICAgICAgICAgICAgICAgICAgaWYgKGxvY2F0aW9uICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgIHN0b3JlZExldmVsID0gL14oW147XSspLy5leGVjKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb29raWUuc2xpY2UobG9jYXRpb24gKyBjb29raWVOYW1lLmxlbmd0aCArIDEpXG4gICAgICAgICAgICAgICAgICAgICAgKVsxXTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBjYXRjaCAoaWdub3JlKSB7fVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIElmIHRoZSBzdG9yZWQgbGV2ZWwgaXMgbm90IHZhbGlkLCB0cmVhdCBpdCBhcyBpZiBub3RoaW5nIHdhcyBzdG9yZWQuXG4gICAgICAgICAgaWYgKHNlbGYubGV2ZWxzW3N0b3JlZExldmVsXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHN0b3JlZExldmVsID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBzdG9yZWRMZXZlbDtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gY2xlYXJQZXJzaXN0ZWRMZXZlbCgpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gdW5kZWZpbmVkVHlwZSB8fCAhc3RvcmFnZUtleSkgcmV0dXJuO1xuXG4gICAgICAgICAgLy8gVXNlIGxvY2FsU3RvcmFnZSBpZiBhdmFpbGFibGVcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oc3RvcmFnZUtleSk7XG4gICAgICAgICAgfSBjYXRjaCAoaWdub3JlKSB7fVxuXG4gICAgICAgICAgLy8gVXNlIHNlc3Npb24gY29va2llIGFzIGZhbGxiYWNrXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgd2luZG93LmRvY3VtZW50LmNvb2tpZSA9XG4gICAgICAgICAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KHN0b3JhZ2VLZXkpICsgXCI9OyBleHBpcmVzPVRodSwgMDEgSmFuIDE5NzAgMDA6MDA6MDAgVVRDXCI7XG4gICAgICAgICAgfSBjYXRjaCAoaWdub3JlKSB7fVxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBub3JtYWxpemVMZXZlbChpbnB1dCkge1xuICAgICAgICAgIHZhciBsZXZlbCA9IGlucHV0O1xuICAgICAgICAgIGlmICh0eXBlb2YgbGV2ZWwgPT09IFwic3RyaW5nXCIgJiYgc2VsZi5sZXZlbHNbbGV2ZWwudG9VcHBlckNhc2UoKV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBsZXZlbCA9IHNlbGYubGV2ZWxzW2xldmVsLnRvVXBwZXJDYXNlKCldO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHlwZW9mIGxldmVsID09PSBcIm51bWJlclwiICYmIGxldmVsID49IDAgJiYgbGV2ZWwgPD0gc2VsZi5sZXZlbHMuU0lMRU5UKSB7XG4gICAgICAgICAgICAgIHJldHVybiBsZXZlbDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwibG9nLnNldExldmVsKCkgY2FsbGVkIHdpdGggaW52YWxpZCBsZXZlbDogXCIgKyBpbnB1dCk7XG4gICAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvKlxuICAgICAgICpcbiAgICAgICAqIFB1YmxpYyBsb2dnZXIgQVBJIC0gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9waW10ZXJyeS9sb2dsZXZlbCBmb3IgZGV0YWlsc1xuICAgICAgICpcbiAgICAgICAqL1xuXG4gICAgICBzZWxmLm5hbWUgPSBuYW1lO1xuXG4gICAgICBzZWxmLmxldmVscyA9IHsgXCJUUkFDRVwiOiAwLCBcIkRFQlVHXCI6IDEsIFwiSU5GT1wiOiAyLCBcIldBUk5cIjogMyxcbiAgICAgICAgICBcIkVSUk9SXCI6IDQsIFwiU0lMRU5UXCI6IDV9O1xuXG4gICAgICBzZWxmLm1ldGhvZEZhY3RvcnkgPSBmYWN0b3J5IHx8IGRlZmF1bHRNZXRob2RGYWN0b3J5O1xuXG4gICAgICBzZWxmLmdldExldmVsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICh1c2VyTGV2ZWwgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHVzZXJMZXZlbDtcbiAgICAgICAgICB9IGVsc2UgaWYgKGRlZmF1bHRMZXZlbCAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmYXVsdExldmVsO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gaW5oZXJpdGVkTGV2ZWw7XG4gICAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgc2VsZi5zZXRMZXZlbCA9IGZ1bmN0aW9uIChsZXZlbCwgcGVyc2lzdCkge1xuICAgICAgICAgIHVzZXJMZXZlbCA9IG5vcm1hbGl6ZUxldmVsKGxldmVsKTtcbiAgICAgICAgICBpZiAocGVyc2lzdCAhPT0gZmFsc2UpIHsgIC8vIGRlZmF1bHRzIHRvIHRydWVcbiAgICAgICAgICAgICAgcGVyc2lzdExldmVsSWZQb3NzaWJsZSh1c2VyTGV2ZWwpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIE5PVEU6IGluIHYyLCB0aGlzIHNob3VsZCBjYWxsIHJlYnVpbGQoKSwgd2hpY2ggdXBkYXRlcyBjaGlsZHJlbi5cbiAgICAgICAgICByZXR1cm4gcmVwbGFjZUxvZ2dpbmdNZXRob2RzLmNhbGwoc2VsZik7XG4gICAgICB9O1xuXG4gICAgICBzZWxmLnNldERlZmF1bHRMZXZlbCA9IGZ1bmN0aW9uIChsZXZlbCkge1xuICAgICAgICAgIGRlZmF1bHRMZXZlbCA9IG5vcm1hbGl6ZUxldmVsKGxldmVsKTtcbiAgICAgICAgICBpZiAoIWdldFBlcnNpc3RlZExldmVsKCkpIHtcbiAgICAgICAgICAgICAgc2VsZi5zZXRMZXZlbChsZXZlbCwgZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHNlbGYucmVzZXRMZXZlbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB1c2VyTGV2ZWwgPSBudWxsO1xuICAgICAgICAgIGNsZWFyUGVyc2lzdGVkTGV2ZWwoKTtcbiAgICAgICAgICByZXBsYWNlTG9nZ2luZ01ldGhvZHMuY2FsbChzZWxmKTtcbiAgICAgIH07XG5cbiAgICAgIHNlbGYuZW5hYmxlQWxsID0gZnVuY3Rpb24ocGVyc2lzdCkge1xuICAgICAgICAgIHNlbGYuc2V0TGV2ZWwoc2VsZi5sZXZlbHMuVFJBQ0UsIHBlcnNpc3QpO1xuICAgICAgfTtcblxuICAgICAgc2VsZi5kaXNhYmxlQWxsID0gZnVuY3Rpb24ocGVyc2lzdCkge1xuICAgICAgICAgIHNlbGYuc2V0TGV2ZWwoc2VsZi5sZXZlbHMuU0lMRU5ULCBwZXJzaXN0KTtcbiAgICAgIH07XG5cbiAgICAgIHNlbGYucmVidWlsZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoZGVmYXVsdExvZ2dlciAhPT0gc2VsZikge1xuICAgICAgICAgICAgICBpbmhlcml0ZWRMZXZlbCA9IG5vcm1hbGl6ZUxldmVsKGRlZmF1bHRMb2dnZXIuZ2V0TGV2ZWwoKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlcGxhY2VMb2dnaW5nTWV0aG9kcy5jYWxsKHNlbGYpO1xuXG4gICAgICAgICAgaWYgKGRlZmF1bHRMb2dnZXIgPT09IHNlbGYpIHtcbiAgICAgICAgICAgICAgZm9yICh2YXIgY2hpbGROYW1lIGluIF9sb2dnZXJzQnlOYW1lKSB7XG4gICAgICAgICAgICAgICAgX2xvZ2dlcnNCeU5hbWVbY2hpbGROYW1lXS5yZWJ1aWxkKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICAvLyBJbml0aWFsaXplIGFsbCB0aGUgaW50ZXJuYWwgbGV2ZWxzLlxuICAgICAgaW5oZXJpdGVkTGV2ZWwgPSBub3JtYWxpemVMZXZlbChcbiAgICAgICAgICBkZWZhdWx0TG9nZ2VyID8gZGVmYXVsdExvZ2dlci5nZXRMZXZlbCgpIDogXCJXQVJOXCJcbiAgICAgICk7XG4gICAgICB2YXIgaW5pdGlhbExldmVsID0gZ2V0UGVyc2lzdGVkTGV2ZWwoKTtcbiAgICAgIGlmIChpbml0aWFsTGV2ZWwgIT0gbnVsbCkge1xuICAgICAgICAgIHVzZXJMZXZlbCA9IG5vcm1hbGl6ZUxldmVsKGluaXRpYWxMZXZlbCk7XG4gICAgICB9XG4gICAgICByZXBsYWNlTG9nZ2luZ01ldGhvZHMuY2FsbChzZWxmKTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqXG4gICAgICogVG9wLWxldmVsIEFQSVxuICAgICAqXG4gICAgICovXG5cbiAgICBkZWZhdWx0TG9nZ2VyID0gbmV3IExvZ2dlcigpO1xuXG4gICAgZGVmYXVsdExvZ2dlci5nZXRMb2dnZXIgPSBmdW5jdGlvbiBnZXRMb2dnZXIobmFtZSkge1xuICAgICAgICBpZiAoKHR5cGVvZiBuYW1lICE9PSBcInN5bWJvbFwiICYmIHR5cGVvZiBuYW1lICE9PSBcInN0cmluZ1wiKSB8fCBuYW1lID09PSBcIlwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiWW91IG11c3Qgc3VwcGx5IGEgbmFtZSB3aGVuIGNyZWF0aW5nIGEgbG9nZ2VyLlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBsb2dnZXIgPSBfbG9nZ2Vyc0J5TmFtZVtuYW1lXTtcbiAgICAgICAgaWYgKCFsb2dnZXIpIHtcbiAgICAgICAgICAgIGxvZ2dlciA9IF9sb2dnZXJzQnlOYW1lW25hbWVdID0gbmV3IExvZ2dlcihcbiAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgIGRlZmF1bHRMb2dnZXIubWV0aG9kRmFjdG9yeVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbG9nZ2VyO1xuICAgIH07XG5cbiAgICAvLyBHcmFiIHRoZSBjdXJyZW50IGdsb2JhbCBsb2cgdmFyaWFibGUgaW4gY2FzZSBvZiBvdmVyd3JpdGVcbiAgICB2YXIgX2xvZyA9ICh0eXBlb2Ygd2luZG93ICE9PSB1bmRlZmluZWRUeXBlKSA/IHdpbmRvdy5sb2cgOiB1bmRlZmluZWQ7XG4gICAgZGVmYXVsdExvZ2dlci5ub0NvbmZsaWN0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSB1bmRlZmluZWRUeXBlICYmXG4gICAgICAgICAgICAgICB3aW5kb3cubG9nID09PSBkZWZhdWx0TG9nZ2VyKSB7XG4gICAgICAgICAgICB3aW5kb3cubG9nID0gX2xvZztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkZWZhdWx0TG9nZ2VyO1xuICAgIH07XG5cbiAgICBkZWZhdWx0TG9nZ2VyLmdldExvZ2dlcnMgPSBmdW5jdGlvbiBnZXRMb2dnZXJzKCkge1xuICAgICAgICByZXR1cm4gX2xvZ2dlcnNCeU5hbWU7XG4gICAgfTtcblxuICAgIC8vIEVTNiBkZWZhdWx0IGV4cG9ydCwgZm9yIGNvbXBhdGliaWxpdHlcbiAgICBkZWZhdWx0TG9nZ2VyWydkZWZhdWx0J10gPSBkZWZhdWx0TG9nZ2VyO1xuXG4gICAgcmV0dXJuIGRlZmF1bHRMb2dnZXI7XG59KSk7XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9sb2dnZXIuanNcbiAqIENlbnRyYWxpc2VkIGxvZ2dpbmcgdXNpbmcgdGhlIGxvZ2xldmVsIGxpYnJhcnkuXG4gKlxuICogVXNhZ2UgKHBlci1tb2R1bGUgbmFtZWQgbG9nZ2Vycyk6XG4gKiAgIGltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbiAqICAgY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdhcGktY2xpZW50Jyk7XG4gKiAgIGxvZy5pbmZvKCdyZXF1ZXN0IHN0YXJ0ZWQnLCBlbmRwb2ludCk7XG4gKiAgIGxvZy53YXJuKCdzZXNzaW9uIGNvbmZsaWN0Jyk7XG4gKiAgIGxvZy5lcnJvcignZmF0YWwnLCBlcnJvcik7XG4gKlxuICogUm9vdCBsb2dnZXIgKHVuY2hhbmdlZCBnbG9iYWwgbGV2ZWwpOlxuICogICBpbXBvcnQgbG9nIGZyb20gJy4vbG9nZ2VyLmpzJztcbiAqICAgbG9nLnNldExldmVsKCdkZWJ1ZycpOyAgIC8vIGxvd2VyIHRoZSBnbG9iYWwgbWluaW11bVxuICpcbiAqIFRoZSBkZWZhdWx0IGxldmVsIGlzICd3YXJuJyBpbiBwcm9kdWN0aW9uIGJ1aWxkcyAoTk9ERV9FTlY9cHJvZHVjdGlvbikgYW5kXG4gKiAnZGVidWcnIGluIGRldmVsb3BtZW50LiAgSW5kaXZpZHVhbCBtb2R1bGUgbGV2ZWxzIGNhbiBiZSBvdmVycmlkZGVuIGF0XG4gKiBydW50aW1lIHZpYSB0aGUgYnJvd3NlciBjb25zb2xlOlxuICogICBsb2dsZXZlbC5nZXRMb2dnZXIoJ2FwaS1jbGllbnQnKS5zZXRMZXZlbCgndHJhY2UnKTtcbiAqXG4gKiBERVBFTkRFTkNJRVM6IGxvZ2xldmVsIChucG0pXG4gKi9cblxuaW1wb3J0IGxvZ2xldmVsIGZyb20gJ2xvZ2xldmVsJztcblxuLy8gRGVmYXVsdCBsZXZlbDogZGVidWcgaW4gZGV2LCB3YXJuIGluIHByb2QuXG5jb25zdCBERUZBVUxUX0xFVkVMID0gKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLmVudiAmJiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKVxuICA/ICd3YXJuJ1xuICA6ICdkZWJ1Zyc7XG5cbmxvZ2xldmVsLnNldERlZmF1bHRMZXZlbChERUZBVUxUX0xFVkVMKTtcblxuLyoqXG4gKiBHZXQgKG9yIGNyZWF0ZSkgYSBuYW1lZCBjaGlsZCBsb2dnZXIuXG4gKiBOYW1lZCBsb2dnZXJzIGluaGVyaXQgdGhlIHJvb3QgZGVmYXVsdCBsZXZlbCBidXQgY2FuIGJlIHR1bmVkIGluZGVwZW5kZW50bHkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBNb2R1bGUgbmFtZSwgZS5nLiAnYXBpLWNsaWVudCdcbiAqIEByZXR1cm5zIHtpbXBvcnQoJ2xvZ2xldmVsJykuTG9nZ2VyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TG9nZ2VyKG5hbWUpIHtcbiAgcmV0dXJuIGxvZ2xldmVsLmdldExvZ2dlcihuYW1lKTtcbn1cblxuLy8gRXhwb3NlIHJvb3QgbG9nbGV2ZWwgaW5zdGFuY2Ugb24gZ2xvYmFsVGhpcyBzbyB0aGUgYnJvd3NlciBjb25zb2xlIGNhblxuLy8gYWRqdXN0IGxldmVscyBhdCBydW50aW1lIHdpdGhvdXQgYSBidWlsZCBzdGVwOlxuLy8gICBsb2dsZXZlbC5zZXRMZXZlbCgnZGVidWcnKTtcbi8vICAgbG9nbGV2ZWwuZ2V0TG9nZ2VyKCdhcGktY2xpZW50Jykuc2V0TGV2ZWwoJ3RyYWNlJyk7XG5pZiAodHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnKSB7XG4gIGdsb2JhbFRoaXMubG9nbGV2ZWwgPSBsb2dsZXZlbDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgbG9nbGV2ZWw7XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHV0aWxzLmpzXG4gKiBVdGlsaXR5IGZ1bmN0aW9ucyBmb3IgdGV4dCBwcm9jZXNzaW5nLCBmb3JtYXR0aW5nLCBhbmQgZGF0YSBtYW5pcHVsYXRpb24uXG4gKiBObyBkZXBlbmRlbmNpZXMgb24gRE9NIG9yIGNvbXBsZXggc3RhdGUuIFB1cmUgZnVuY3Rpb25zLlxuICovXG5cbi8qKlxuICogTm9ybWFsaXplIHdoaXRlc3BhY2UgaW4gdGV4dDpcbiAqIC0gUmVtb3ZlIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZVxuICogLSBDb2xsYXBzZSBpbnRlcm5hbCB3aGl0ZXNwYWNlIHRvIHNpbmdsZSBzcGFjZXNcbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplVGV4dCh0ZXh0KSB7XG4gIHJldHVybiB0ZXh0XG4gICAgLnRyaW0oKSAgLy8gUmVtb3ZlIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZVxuICAgIC5yZXBsYWNlKC9cXHMrL2csICcgJykgIC8vIENvbGxhcHNlIGludGVybmFsIHdoaXRlc3BhY2VcbiAgICAudHJpbSgpO1xufVxuXG4vKipcbiAqIEZvcm1hdCBhIFVuaXggdGltZXN0YW1wIGFzIGh1bWFuLXJlYWRhYmxlIGRhdGUgc3RyaW5nLlxuICogRXhhbXBsZTogMTcwOTIzNjgwMCBcdTIxOTIgXCJNYXIgMSwgMjAyNFwiXG4gKi9cbmZ1bmN0aW9uIGZtdERhdGUodHMpIHtcbiAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHRzICogMTAwMCk7XG4gIHJldHVybiBkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZygnZW4tVVMnLCB7IG1vbnRoOiAnc2hvcnQnLCBkYXk6ICdudW1lcmljJywgeWVhcjogJ251bWVyaWMnIH0pO1xufVxuXG4vKipcbiAqIENsZWFuIEpTT04gcmVzcG9uc2UgYnkgcmVtb3ZpbmcgbWFya2Rvd24gY29kZSBibG9ja3MuXG4gKiBIYW5kbGVzIGNvbW1vbiBwYXR0ZXJuczpcbiAqIC0gYGBganNvbiAuLi4gYGBgXG4gKiAtIGBgYFxuICogICAuLi5cbiAqIGBgYFxuICovXG5mdW5jdGlvbiBjbGVhbkpzb25SZXNwb25zZSh0ZXh0KSB7XG4gIGlmICh0eXBlb2YgdGV4dCAhPT0gJ3N0cmluZycpIHJldHVybiB0ZXh0O1xuICBsZXQgY2xlYW5lZCA9IHRleHQ7XG4gIC8vIFJlbW92ZSBgYGBqc29uIHdyYXBwZXJcbiAgY2xlYW5lZCA9IGNsZWFuZWQucmVwbGFjZSgvXmBgYGpzb25cXHMqL2ksICcnKS5yZXBsYWNlKC9gYGBcXHMqJC9pLCAnJyk7XG4gIC8vIFJlbW92ZSBgYGAgd3JhcHBlclxuICBjbGVhbmVkID0gY2xlYW5lZC5yZXBsYWNlKC9eYGBgXFxzKi9pLCAnJykucmVwbGFjZSgvYGBgXFxzKiQvaSwgJycpO1xuICByZXR1cm4gY2xlYW5lZC50cmltKCk7XG59XG5cbi8qKlxuICogRXh0cmFjdCBhbmQgcGFyc2UgdGhlIGZpcnN0IHZhbGlkIEpTT04gb2JqZWN0IGVtYmVkZGVkIGluIGZyZWUtZm9ybSB0ZXh0LlxuICogUmV0dXJucyBudWxsIHdoZW4gbm8gY29tcGxldGUgcGFyc2VhYmxlIG9iamVjdCBpcyBmb3VuZC5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdEZpcnN0SnNvbk9iamVjdCh0ZXh0KSB7XG4gIGlmICh0ZXh0ID09IG51bGwgfHwgdHlwZW9mIHRleHQgIT09ICdzdHJpbmcnKSByZXR1cm4gbnVsbDtcblxuICBjb25zdCBjbGVhbmVkID0gY2xlYW5Kc29uUmVzcG9uc2UodGV4dCk7XG5cbiAgZm9yIChsZXQgc3RhcnQgPSAwOyBzdGFydCA8IGNsZWFuZWQubGVuZ3RoOyBzdGFydCArPSAxKSB7XG4gICAgaWYgKGNsZWFuZWRbc3RhcnRdICE9PSAneycpIGNvbnRpbnVlO1xuXG4gICAgbGV0IGRlcHRoID0gMDtcbiAgICBsZXQgaW5TdHJpbmcgPSBmYWxzZTtcbiAgICBsZXQgaXNFc2NhcGVkID0gZmFsc2U7XG5cbiAgICBmb3IgKGxldCBpbmRleCA9IHN0YXJ0OyBpbmRleCA8IGNsZWFuZWQubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICBjb25zdCBjaGFyID0gY2xlYW5lZFtpbmRleF07XG5cbiAgICAgIGlmIChpblN0cmluZykge1xuICAgICAgICBpZiAoaXNFc2NhcGVkKSB7XG4gICAgICAgICAgaXNFc2NhcGVkID0gZmFsc2U7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYXIgPT09ICdcXFxcJykge1xuICAgICAgICAgIGlzRXNjYXBlZCA9IHRydWU7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYXIgPT09ICdcIicpIHtcbiAgICAgICAgICBpblN0cmluZyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hhciA9PT0gJ1wiJykge1xuICAgICAgICBpblN0cmluZyA9IHRydWU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hhciA9PT0gJ3snKSB7XG4gICAgICAgIGRlcHRoICs9IDE7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hhciAhPT0gJ30nKSBjb250aW51ZTtcblxuICAgICAgZGVwdGggLT0gMTtcbiAgICAgIGlmIChkZXB0aCAhPT0gMCkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IGNsZWFuZWQuc2xpY2Uoc3RhcnQsIGluZGV4ICsgMSk7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShjYW5kaWRhdGUpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIEVzY2FwZSBIVE1MIHNwZWNpYWwgY2hhcmFjdGVycyB0byBwcmV2ZW50IGluamVjdGlvbi5cbiAqIENvbnZlcnRzOiAmIDwgPiBcIiAnXG4gKi9cbmZ1bmN0aW9uIGVzY2FwZUh0bWwodGV4dCkge1xuICBpZiAodGV4dCA9PSBudWxsKSByZXR1cm4gJyc7XG4gIGlmICh0eXBlb2YgdGV4dCAhPT0gJ3N0cmluZycpIHJldHVybiBlc2NhcGVIdG1sKFN0cmluZyh0ZXh0KSk7XG4gIGNvbnN0IG1hcCA9IHtcbiAgICAnJic6ICcmYW1wOycsXG4gICAgJzwnOiAnJmx0OycsXG4gICAgJz4nOiAnJmd0OycsXG4gICAgJ1wiJzogJyZxdW90OycsXG4gICAgXCInXCI6ICcmIzAzOTsnXG4gIH07XG4gIHJldHVybiB0ZXh0LnJlcGxhY2UoL1smPD5cIiddL2csIG0gPT4gbWFwW21dKTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0IHRpdGxlIGFuZCBjb21wYW55IGZyb20gam9iIGRlc2NyaXB0aW9uIHRleHQuXG4gKiBQYXR0ZXJuczpcbiAqIC0gXCJUaXRsZSB8IENvbXBhbnlcIlxuICogLSBcIlRpdGxlIGF0IENvbXBhbnlcIlxuICogLSBGaXJzdCBsaW5lIGNvbnRhaW5pbmcgXCJ0aXRsZVwiLCBcInBvc2l0aW9uXCIsIFwicm9sZVwiLCBcImFyY2hpdGVjdFwiLCBldGMuXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RUaXRsZUFuZENvbXBhbnlGcm9tSm9iVGV4dChqb2JUZXh0KSB7XG4gIGNvbnN0IGxpbmVzID0gam9iVGV4dC5zcGxpdCgnXFxuJykubWFwKGwgPT4gbC50cmltKCkpLmZpbHRlcihsID0+IGwubGVuZ3RoID4gMCk7XG5cbiAgLy8gTG9vayBmb3IgcGF0dGVybnM6IFwiVGl0bGUgfCBDb21wYW55XCIgb3IgXCJUaXRsZSBhdCBDb21wYW55XCJcbiAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgaWYgKGxpbmUuaW5jbHVkZXMoJ3wnKSkge1xuICAgICAgY29uc3QgW3RpdGxlLCBjb21wYW55XSA9IGxpbmUuc3BsaXQoJ3wnKS5tYXAocyA9PiBzLnRyaW0oKSk7XG4gICAgICBpZiAodGl0bGUgJiYgY29tcGFueSkge1xuICAgICAgICByZXR1cm4geyB0aXRsZSwgY29tcGFueSB9O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobGluZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCcgYXQgJykpIHtcbiAgICAgIGNvbnN0IFt0aXRsZSwgY29tcGFueV0gPSBsaW5lLnNwbGl0KC9cXHMrYXRcXHMrL2kpLm1hcChzID0+IHMudHJpbSgpKTtcbiAgICAgIGlmICh0aXRsZSAmJiBjb21wYW55KSB7XG4gICAgICAgIHJldHVybiB7IHRpdGxlLCBjb21wYW55IH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gRmFsbGJhY2s6IHVzZSBmaXJzdCBub24tZW1wdHkgbGluZSBhcyB0aXRsZVxuICBjb25zdCB0aXRsZUxpbmUgPSBsaW5lc1swXTtcbiAgcmV0dXJuIHtcbiAgICB0aXRsZTogdGl0bGVMaW5lIHx8ICdVbnRpdGxlZCBQb3NpdGlvbicsXG4gICAgY29tcGFueTogbGluZXMuZmluZChsID0+IGwudG9Mb3dlckNhc2UoKSAhPT0gdGl0bGVMaW5lLnRvTG93ZXJDYXNlKCkpIHx8ICdVbmtub3duIENvbXBhbnknXG4gIH07XG59XG5cbi8qKlxuICogTm9ybWFsaXplIHBvc2l0aW9uIGxhYmVsOlxuICogLSBDYXBpdGFsaXplIGVhY2ggd29yZFxuICogLSBSZW1vdmUgdHJhaWxpbmcgXCJyb2xlXCIsIFwicG9zaXRpb25cIiwgXCJ0aXRsZVwiLCBcImpvYlwiXG4gKiBFeGFtcGxlczpcbiAqIC0gXCJzZW5pb3IgZGF0YSBzY2llbnRpc3RcIiBcdTIxOTIgXCJTZW5pb3IgRGF0YSBTY2llbnRpc3RcIlxuICogLSBcImRpcmVjdG9yIG9mIGVuZ2luZWVyaW5nXCIgXHUyMTkyIFwiRGlyZWN0b3Igb2YgRW5naW5lZXJpbmdcIlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVQb3NpdGlvbkxhYmVsKHRpdGxlLCBjb21wYW55KSB7XG4gIGxldCBub3JtYWxpemVkID0gdGl0bGVcbiAgICAuc3BsaXQoJyAnKVxuICAgIC5tYXAod29yZCA9PiB3b3JkLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgd29yZC5zbGljZSgxKS50b0xvd2VyQ2FzZSgpKVxuICAgIC5qb2luKCcgJyk7XG5cbiAgLy8gUmVtb3ZlIGNvbW1vbiBzdWZmaXhlc1xuICBub3JtYWxpemVkID0gbm9ybWFsaXplZFxuICAgIC5yZXBsYWNlKC9cXHMrKHJvbGV8cG9zaXRpb258dGl0bGV8am9iKVxccyokL2ksICcnKVxuICAgIC50cmltKCk7XG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWQgfHwgJ1Byb2Zlc3Npb25hbCBSb2xlJztcbn1cblxuLyoqXG4gKiBTdHJpcCBIVE1MIHRhZ3MgZnJvbSBzdHJpbmcuXG4gKiBVc2VzIGFuIGluZXJ0IHRlbXBsYXRlIGVsZW1lbnQsIHRoZW4gcmVtb3ZlcyBleGVjdXRhYmxlL25vbi12aXNpYmxlIG5vZGVzLlxuICovXG5mdW5jdGlvbiBzdHJpcEh0bWwoaHRtbCkge1xuICBjb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7XG4gIHRlbXBsYXRlLmlubmVySFRNTCA9IFN0cmluZyhodG1sID8/ICcnKTtcbiAgdGVtcGxhdGUuY29udGVudC5xdWVyeVNlbGVjdG9yQWxsKCdzY3JpcHQsIHN0eWxlLCBub3NjcmlwdCwgdGVtcGxhdGUnKS5mb3JFYWNoKG5vZGUgPT4gbm9kZS5yZW1vdmUoKSk7XG4gIHJldHVybiB0ZW1wbGF0ZS5jb250ZW50LnRleHRDb250ZW50IHx8ICcnO1xufVxuXG4vKipcbiAqIFRydW5jYXRlIHRleHQgdG8gbWF4IGxlbmd0aCB3aXRoIGVsbGlwc2lzLlxuICogUHJlc2VydmVzIHdvcmQgYm91bmRhcmllcyB3aGVuIHBvc3NpYmxlLlxuICovXG5mdW5jdGlvbiB0cnVuY2F0ZVRleHQodGV4dCwgbWF4TGVuZ3RoID0gMTAwKSB7XG4gIGlmICh0ZXh0Lmxlbmd0aCA8PSBtYXhMZW5ndGgpIHJldHVybiB0ZXh0O1xuXG4gIC8vIFRydW5jYXRlIGF0IG1heCBsZW5ndGhcbiAgbGV0IHRydW5jYXRlZCA9IHRleHQuc3Vic3RyaW5nKDAsIG1heExlbmd0aCk7XG5cbiAgLy8gVHJ5IHRvIGZpbmQgdGhlIGxhc3Qgc3BhY2UgdG8gYXZvaWQgY3V0dGluZyB3b3Jkc1xuICBjb25zdCBsYXN0U3BhY2UgPSB0cnVuY2F0ZWQubGFzdEluZGV4T2YoJyAnKTtcbiAgaWYgKGxhc3RTcGFjZSA+IE1hdGguZmxvb3IobWF4TGVuZ3RoICogMC43NSkpIHtcbiAgICB0cnVuY2F0ZWQgPSB0cnVuY2F0ZWQuc3Vic3RyaW5nKDAsIGxhc3RTcGFjZSk7XG4gIH1cblxuICByZXR1cm4gdHJ1bmNhdGVkICsgJ1x1MjAyNic7XG59XG5cbi8qKlxuICogQ2FwaXRhbGl6ZSBmaXJzdCBsZXR0ZXIgb2YgZWFjaCB3b3JkLlxuICovXG5mdW5jdGlvbiBjYXBpdGFsaXplV29yZHModGV4dCkge1xuICByZXR1cm4gdGV4dFxuICAgIC5zcGxpdCgnICcpXG4gICAgLm1hcCh3b3JkID0+IHdvcmQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB3b3JkLnNsaWNlKDEpLnRvTG93ZXJDYXNlKCkpXG4gICAgLmpvaW4oJyAnKTtcbn1cblxuLyoqXG4gKiBDb25kaXRpb25hbCBwbHVyYWxpemF0aW9uIGhlbHBlci5cbiAqIEV4YW1wbGU6IHBsdXJhbGl6ZSgxLCAnaXRlbScsICdpdGVtcycpIFx1MjE5MiAnaXRlbSdcbiAqICAgICAgICAgIHBsdXJhbGl6ZSgzLCAnaXRlbScsICdpdGVtcycpIFx1MjE5MiAnaXRlbXMnXG4gKi9cbmZ1bmN0aW9uIHBsdXJhbGl6ZShjb3VudCwgc2luZ3VsYXIsIHBsdXJhbCkge1xuICByZXR1cm4gY291bnQgPT09IDEgPyBzaW5ndWxhciA6IHBsdXJhbDtcbn1cblxuLyoqXG4gKiBIdW1hbi1yZWFkYWJsZSB0aW1lIGR1cmF0aW9uLlxuICogRXhhbXBsZTogNTAwMCBcdTIxOTIgXCI1IHNlY29uZHNcIiwgNjUwMDAgXHUyMTkyIFwiMSBtaW51dGVcIlxuICovXG5mdW5jdGlvbiBmb3JtYXREdXJhdGlvbihtcykge1xuICBjb25zdCBzZWNvbmRzID0gTWF0aC5mbG9vcihtcyAvIDEwMDApO1xuICBjb25zdCBtaW51dGVzID0gTWF0aC5mbG9vcihzZWNvbmRzIC8gNjApO1xuICBjb25zdCBob3VycyA9IE1hdGguZmxvb3IobWludXRlcyAvIDYwKTtcblxuICBpZiAoaG91cnMgPiAwKSByZXR1cm4gYCR7aG91cnN9aCAke21pbnV0ZXMgJSA2MH1tYDtcbiAgaWYgKG1pbnV0ZXMgPiAwKSByZXR1cm4gYCR7bWludXRlc31tICR7c2Vjb25kcyAlIDYwfXNgO1xuICByZXR1cm4gYCR7c2Vjb25kc31zYDtcbn1cblxuLyoqXG4gKiBPcmRpbmFsIG51bWJlciBzdWZmaXguXG4gKiBFeGFtcGxlOiAxIFx1MjE5MiBcIjFzdFwiLCAyIFx1MjE5MiBcIjJuZFwiLCAzIFx1MjE5MiBcIjNyZFwiLCA0IFx1MjE5MiBcIjR0aFwiXG4gKi9cbmZ1bmN0aW9uIG9yZGluYWwobikge1xuICBjb25zdCBzID0gWyd0aCcsICdzdCcsICduZCcsICdyZCddO1xuICBjb25zdCB2ID0gbiAlIDEwMDtcbiAgcmV0dXJuIG4gKyAoc1sodiAtIDIwKSAlIDEwXSB8fCBzW3ZdIHx8IHNbMF0pO1xufVxuXG4vLyBVdGlsaXR5IGZ1bmN0aW9ucyBmb3Igc2Vzc2lvbiBtYW5hZ2VtZW50IGFuZCBmb3JtYXR0aW5nXG5cbi8vIEZ1bGwtbGVuZ3RoIHBoYXNlIGxhYmVscyBcdTIwMTQgdXNlZCBieSB3b3JrZmxvdyBzdGVwIGRpc3BsYXksIHN0YXR1cyB0ZXh0LCBldGMuXG5jb25zdCBTRVNTSU9OX1BIQVNFX0xBQkVMUyA9IHtcbiAgaW5pdDogICAgICAgICAgICAgJ0dldHRpbmcgU3RhcnRlZCcsXG4gIGpvYl9hbmFseXNpczogICAgICdKb2IgQW5hbHlzaXMnLFxuICBjdXN0b21pemF0aW9uOiAgICAnQ3VzdG9taXNhdGlvbicsXG4gIHJld3JpdGVfcmV2aWV3OiAgICdSZXdyaXRlIFJldmlldycsXG4gIHNwZWxsX2NoZWNrOiAgICAgICdTcGVsbCBDaGVjaycsXG4gIGdlbmVyYXRpb246ICAgICAgICdHZW5lcmF0aW9uJyxcbiAgbGF5b3V0X3JldmlldzogICAgJ0xheW91dCBSZXZpZXcnLFxuICByZWZpbmVtZW50OiAgICAgICAnRmluYWxpc2UnLFxuICBmaW5hbF9nZW5lcmF0aW9uOiAnRmluYWwgR2VuZXJhdGlvbicsXG59O1xuXG4vLyBBYmJyZXZpYXRlZCBwaGFzZSBsYWJlbHMgXHUyMDE0IHVzZWQgYnkgdGhlIGNvbXBhY3Qgc2Vzc2lvbi1zd2l0Y2hlciBVSS5cbi8vIEludGVudGlvbmFsbHkgc2VwYXJhdGUgZnJvbSBTRVNTSU9OX1BIQVNFX0xBQkVMUzogdGhlIHR3byBzZXRzIHNlcnZlIGRpZmZlcmVudFxuLy8gVUkgY29udGV4dHMgKHNwYWNlLWNvbnN0cmFpbmVkIGhlYWRlciBjaGlwIHZzLiBmdWxsIHdvcmtmbG93IHN0ZXAgbGFiZWwpLlxuY29uc3QgU0VTU0lPTl9QSEFTRV9MQUJFTFNfU0hPUlQgPSB7XG4gIGluaXQ6ICAgICAgICAgICAgICdTZXR1cCcsXG4gIGpvYl9hbmFseXNpczogICAgICdBbmFseXNpcycsXG4gIGN1c3RvbWl6YXRpb246ICAgICdDdXN0b21pc2luZycsXG4gIHJld3JpdGVfcmV2aWV3OiAgICdSZXdyaXRlcycsXG4gIHNwZWxsX2NoZWNrOiAgICAgICdTcGVsbCBDaGVjaycsXG4gIGdlbmVyYXRpb246ICAgICAgICdHZW5lcmF0ZScsXG4gIGxheW91dF9yZXZpZXc6ICAgICdMYXlvdXQnLFxuICByZWZpbmVtZW50OiAgICAgICAnRmluYWxpc2UnLFxuICBmaW5hbF9nZW5lcmF0aW9uOiAnRmluYWwgR2VuJyxcbn07XG5cbi8qKlxuICogRm9ybWF0IHNlc3Npb24gcGhhc2UgbGFiZWxzIChmdWxsIGZvcm0pLlxuICogQHBhcmFtIHtzdHJpbmd9IHBoYXNlIC0gVGhlIHBoYXNlIHN0cmluZyB0byBmb3JtYXQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSBmb3JtYXR0ZWQgcGhhc2UgbGFiZWwuXG4gKi9cbmZ1bmN0aW9uIGZvcm1hdFNlc3Npb25QaGFzZUxhYmVsKHBoYXNlKSB7XG4gIGlmICghcGhhc2UpIHJldHVybiAnaW5pdCc7XG4gIHJldHVybiBTRVNTSU9OX1BIQVNFX0xBQkVMU1twaGFzZV0gfHwgU3RyaW5nKHBoYXNlKS5yZXBsYWNlKC9fL2csICcgJyk7XG59XG5cbi8qKlxuICogRm9ybWF0IHNlc3Npb24gdGltZXN0YW1wcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0aW1lc3RhbXAgLSBUaGUgdGltZXN0YW1wIHRvIGZvcm1hdC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIC0gRm9ybWF0dGluZyBvcHRpb25zLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5pbmNsdWRlVGltZT10cnVlXSAtIFdoZXRoZXIgdG8gaW5jbHVkZSB0aW1lIGluIHRoZSBvdXRwdXQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICovXG5mdW5jdGlvbiBmb3JtYXRTZXNzaW9uVGltZXN0YW1wKHRpbWVzdGFtcCwgeyBpbmNsdWRlVGltZSA9IHRydWUgfSA9IHt9KSB7XG4gIGlmICghdGltZXN0YW1wKSByZXR1cm4gJ1x1MjAxNCc7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHRpbWVzdGFtcCkudG9Mb2NhbGVTdHJpbmcoJ2VuLVVTJywge1xuICAgICAgbW9udGg6ICdzaG9ydCcsIGRheTogJ251bWVyaWMnLCB5ZWFyOiAnbnVtZXJpYycsXG4gICAgICAuLi4oaW5jbHVkZVRpbWUgPyB7IGhvdXI6ICdudW1lcmljJywgbWludXRlOiAnMi1kaWdpdCcgfSA6IHt9KSxcbiAgICB9KTtcbiAgfSBjYXRjaCAoXykge1xuICAgIHJldHVybiBTdHJpbmcodGltZXN0YW1wKS5yZXBsYWNlKCdUJywgJyAnKS5zbGljZSgwLCBpbmNsdWRlVGltZSA/IDE2IDogMTApO1xuICB9XG59XG5cbi8vIFN0cnVjdHVyZWQgbG9nZ2luZyBoZWxwZXIgKGdsb2JhbCBhbmQgdGVzdC1mcmllbmRseSkuXG5jb25zdCBMT0dfTEVWRUxTID0geyBkZWJ1ZzogMTAsIGluZm86IDIwLCB3YXJuOiAzMCwgZXJyb3I6IDQwIH07XG5jb25zdCBERUZBVUxUX0xPR19MRVZFTCA9ICdpbmZvJztcblxuZnVuY3Rpb24gY3JlYXRlTG9nRW50cnkobGV2ZWwsIG1lc3NhZ2UsIG1ldGFkYXRhID0ge30pIHtcbiAgY29uc3QgZW50cnkgPSB7XG4gICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgbGV2ZWwsXG4gICAgbWVzc2FnZTogU3RyaW5nKG1lc3NhZ2UpLFxuICAgIC4uLm1ldGFkYXRhLFxuICB9O1xuICByZXR1cm4gZW50cnk7XG59XG5cbmNvbnN0IGxvZ2dlciA9IHtcbiAgbGV2ZWw6IERFRkFVTFRfTE9HX0xFVkVMLFxuXG4gIHNldExldmVsKG5ld0xldmVsKSB7XG4gICAgaWYgKExPR19MRVZFTFNbbmV3TGV2ZWxdICE9IG51bGwpIHtcbiAgICAgIHRoaXMubGV2ZWwgPSBuZXdMZXZlbDtcbiAgICB9XG4gIH0sXG5cbiAgc2hvdWxkTG9nKGxldmVsKSB7XG4gICAgaWYgKExPR19MRVZFTFNbbGV2ZWxdID09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gTE9HX0xFVkVMU1tsZXZlbF0gPj0gTE9HX0xFVkVMU1t0aGlzLmxldmVsXTtcbiAgfSxcblxuICBsb2cobGV2ZWwsIG1lc3NhZ2UsIG1ldGFkYXRhID0ge30pIHtcbiAgICBpZiAoIXRoaXMuc2hvdWxkTG9nKGxldmVsKSkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBlbnRyeSA9IGNyZWF0ZUxvZ0VudHJ5KGxldmVsLCBtZXNzYWdlLCBtZXRhZGF0YSk7XG4gICAgY29uc3QgZm9ybWF0dGVkID0gSlNPTi5zdHJpbmdpZnkoZW50cnkpO1xuXG4gICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgaWYgKGxldmVsID09PSAnZXJyb3InKSBjb25zb2xlLmVycm9yKGZvcm1hdHRlZCk7XG4gICAgICBlbHNlIGlmIChsZXZlbCA9PT0gJ3dhcm4nKSBjb25zb2xlLndhcm4oZm9ybWF0dGVkKTtcbiAgICAgIGVsc2UgY29uc29sZS5sb2coZm9ybWF0dGVkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZW50cnk7XG4gIH0sXG5cbiAgZGVidWcobWVzc2FnZSwgbWV0YWRhdGEgPSB7fSkgeyByZXR1cm4gdGhpcy5sb2coJ2RlYnVnJywgbWVzc2FnZSwgbWV0YWRhdGEpOyB9LFxuICBpbmZvKG1lc3NhZ2UsIG1ldGFkYXRhID0ge30pIHsgcmV0dXJuIHRoaXMubG9nKCdpbmZvJywgbWVzc2FnZSwgbWV0YWRhdGEpOyB9LFxuICB3YXJuKG1lc3NhZ2UsIG1ldGFkYXRhID0ge30pIHsgcmV0dXJuIHRoaXMubG9nKCd3YXJuJywgbWVzc2FnZSwgbWV0YWRhdGEpOyB9LFxuICBlcnJvcihtZXNzYWdlLCBtZXRhZGF0YSA9IHt9KSB7IHJldHVybiB0aGlzLmxvZygnZXJyb3InLCBtZXNzYWdlLCBtZXRhZGF0YSk7IH0sXG5cbiAgZXZlbnQoYWN0aW9uLCBtZXRhZGF0YSA9IHt9KSB7XG4gICAgcmV0dXJuIHRoaXMuaW5mbyhgZXZlbnQ6JHthY3Rpb259YCwgeyBhY3Rpb24sIC4uLm1ldGFkYXRhIH0pO1xuICB9LFxufTtcblxuaWYgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJykge1xuICBnbG9iYWxUaGlzLmxvZ2dlciA9IGxvZ2dlcjtcbn1cblxuZXhwb3J0IHtcbiAgbm9ybWFsaXplVGV4dCwgZm10RGF0ZSwgY2xlYW5Kc29uUmVzcG9uc2UsIGV4dHJhY3RGaXJzdEpzb25PYmplY3QsIGVzY2FwZUh0bWwsXG4gIGV4dHJhY3RUaXRsZUFuZENvbXBhbnlGcm9tSm9iVGV4dCwgbm9ybWFsaXplUG9zaXRpb25MYWJlbCxcbiAgc3RyaXBIdG1sLCB0cnVuY2F0ZVRleHQsIGNhcGl0YWxpemVXb3JkcywgcGx1cmFsaXplLFxuICBmb3JtYXREdXJhdGlvbiwgb3JkaW5hbCxcbiAgU0VTU0lPTl9QSEFTRV9MQUJFTFMsIFNFU1NJT05fUEhBU0VfTEFCRUxTX1NIT1JULFxuICBmb3JtYXRTZXNzaW9uUGhhc2VMYWJlbCxcbiAgbG9nZ2VyLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogYXBpLWNsaWVudC5qc1xuICogQ2VudHJhbGl6ZWQgSFRUUCBjb21tdW5pY2F0aW9uIGxheWVyLiBBbGwgQVBJIGNhbGxzIGdvIHRocm91Z2ggYXBpQ2FsbCgpLlxuICogUHJvdmlkZXMgZXJyb3IgaGFuZGxpbmcsIGxvZ2dpbmcsIGFuZCByZXRyeSBsb2dpYy5cbiAqL1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBoYW5kbGU0MDlDb25mbGljdCB9IGZyb20gJy4vZmV0Y2gtdXRpbHMuanMnO1xuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdhcGktY2xpZW50Jyk7XG5cbi8qKlxuICogQ2VudHJhbGl6ZWQgbG9jYWxTdG9yYWdlIGtleSBtYW5hZ2VtZW50IHRvIGF2b2lkIGR1cGxpY2F0aW9uXG4gKi9cbmNvbnN0IFN0b3JhZ2VLZXlzID0ge1xuICBTRVNTSU9OX0lEOiAgICAgICAgICAgICAgJ2N2LWJ1aWxkZXItc2Vzc2lvbi1pZCcsXG4gIFNFU1NJT05fUEFUSDogICAgICAgICAgICAnY3YtYnVpbGRlci1zZXNzaW9uLXBhdGgnLFxuICBUQUJfREFUQTogICAgICAgICAgICAgICAgJ2N2LWJ1aWxkZXItdGFiLWRhdGEnLFxuICBDVVJSRU5UX1RBQjogICAgICAgICAgICAgJ2N2LWJ1aWxkZXItY3VycmVudC10YWInLFxuICBDSEFUX0NPTExBUFNFRDogICAgICAgICAgJ2N2LWJ1aWxkZXItY2hhdC1jb2xsYXBzZWQnLFxuICBMTE1fRElTQ0xPU1VSRV9TSE9XTjogICAgJ2N2LWJ1aWxkZXItbGxtLWRpc2Nsb3N1cmUtc2hvd24nLFxuICBFQVJMWV9QUkVWSUVXX0NPTExBUFNFRDogJ2N2LWJ1aWxkZXItZWFybHktcHJldmlldy1jb2xsYXBzZWQnLFxufTtcblxuY29uc3QgT1dORVJfVE9LRU5fS0VZID0gJ2N2LWJ1aWxkZXItb3duZXItdG9rZW4nO1xuXG5mdW5jdGlvbiBnZXRTZXNzaW9uSWRGcm9tVVJMKCkge1xuICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIXdpbmRvdy5sb2NhdGlvbikgcmV0dXJuIG51bGw7XG4gIHJldHVybiBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpLmdldCgnc2Vzc2lvbicpO1xufVxuXG5mdW5jdGlvbiBnZXRPd25lclRva2VuKCkge1xuICBpZiAodHlwZW9mIHNlc3Npb25TdG9yYWdlID09PSAndW5kZWZpbmVkJykgcmV0dXJuIG51bGw7XG4gIGxldCB0b2tlbiA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oT1dORVJfVE9LRU5fS0VZKTtcbiAgaWYgKCF0b2tlbikge1xuICAgIGlmICh0eXBlb2YgY3J5cHRvICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgY3J5cHRvLnJhbmRvbVVVSUQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRva2VuID0gY3J5cHRvLnJhbmRvbVVVSUQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdG9rZW4gPSBgdGFiLSR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDE2KS5zbGljZSgyLCAxMCl9YDtcbiAgICB9XG4gICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShPV05FUl9UT0tFTl9LRVksIHRva2VuKTtcbiAgfVxuICByZXR1cm4gdG9rZW47XG59XG5cbmZ1bmN0aW9uIGdldFNjb3BlZFRhYkRhdGFTdG9yYWdlS2V5KHNlc3Npb25JZCA9IG51bGwpIHtcbiAgY29uc3Qgc2NvcGVkU2Vzc2lvbklkID0gc2Vzc2lvbklkIHx8IGdldFNlc3Npb25JZEZyb21VUkwoKTtcbiAgcmV0dXJuIHNjb3BlZFNlc3Npb25JZFxuICAgID8gYCR7U3RvcmFnZUtleXMuVEFCX0RBVEF9LSR7c2NvcGVkU2Vzc2lvbklkfWBcbiAgICA6IFN0b3JhZ2VLZXlzLlRBQl9EQVRBO1xufVxuXG5mdW5jdGlvbiBfaXNTZXNzaW9uTWFuYWdlbWVudFBhdGgocGF0aG5hbWUpIHtcbiAgcmV0dXJuIHBhdGhuYW1lID09PSAnL2FwaS9zZXNzaW9ucy9uZXcnXG4gICAgfHwgcGF0aG5hbWUgPT09ICcvYXBpL3Nlc3Npb25zL2NsYWltJ1xuICAgIHx8IHBhdGhuYW1lID09PSAnL2FwaS9zZXNzaW9ucy90YWtlb3Zlcic7XG59XG5cbmZ1bmN0aW9uIF9idWlsZFNlc3Npb25Bd2FyZVJlcXVlc3QoaW5wdXQsIGluaXQgPSB7fSkge1xuICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIXdpbmRvdy5sb2NhdGlvbikge1xuICAgIHJldHVybiBbaW5wdXQsIGluaXRdO1xuICB9XG5cbiAgY29uc3QgdXJsID0gbmV3IFVSTCh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnID8gaW5wdXQgOiBpbnB1dC51cmwsIHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4pO1xuICBpZiAoIXVybC5wYXRobmFtZS5zdGFydHNXaXRoKCcvYXBpLycpKSB7XG4gICAgcmV0dXJuIFtpbnB1dCwgaW5pdF07XG4gIH1cblxuICBjb25zdCBvd25lclRva2VuID0gZ2V0T3duZXJUb2tlbigpO1xuICBpZiAoIXVybC5zZWFyY2hQYXJhbXMuaGFzKCdvd25lcl90b2tlbicpICYmICFfaXNTZXNzaW9uTWFuYWdlbWVudFBhdGgodXJsLnBhdGhuYW1lKSAmJiBvd25lclRva2VuKSB7XG4gICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ293bmVyX3Rva2VuJywgb3duZXJUb2tlbik7XG4gIH1cblxuICBjb25zdCBzZXNzaW9uSWQgPSBnZXRTZXNzaW9uSWRGcm9tVVJMKCk7XG4gIGlmICghc2Vzc2lvbklkKSB7XG4gICAgcmV0dXJuIFt1cmwudG9TdHJpbmcoKSwgaW5pdF07XG4gIH1cblxuICBjb25zdCBtZXRob2QgPSAoaW5pdC5tZXRob2QgfHwgJ0dFVCcpLnRvVXBwZXJDYXNlKCk7XG4gIGNvbnN0IG5leHRJbml0ID0geyAuLi5pbml0IH07XG4gIGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycyhpbml0LmhlYWRlcnMgfHwge30pO1xuXG4gIGlmICghdXJsLnNlYXJjaFBhcmFtcy5oYXMoJ3Nlc3Npb25faWQnKSAmJiAhX2lzU2Vzc2lvbk1hbmFnZW1lbnRQYXRoKHVybC5wYXRobmFtZSkpIHtcbiAgICB1cmwuc2VhcmNoUGFyYW1zLnNldCgnc2Vzc2lvbl9pZCcsIHNlc3Npb25JZCk7XG4gIH1cblxuICBjb25zdCBuZWVkc0JvZHlDb250ZXh0ID0gIVsnR0VUJywgJ0hFQUQnXS5pbmNsdWRlcyhtZXRob2QpO1xuICBjb25zdCBib2R5ID0gbmV4dEluaXQuYm9keTtcbiAgY29uc3QgaXNGb3JtRGF0YSA9IHR5cGVvZiBGb3JtRGF0YSAhPT0gJ3VuZGVmaW5lZCcgJiYgYm9keSBpbnN0YW5jZW9mIEZvcm1EYXRhO1xuICBjb25zdCBpc1VSTFNlYXJjaFBhcmFtcyA9IHR5cGVvZiBVUkxTZWFyY2hQYXJhbXMgIT09ICd1bmRlZmluZWQnICYmIGJvZHkgaW5zdGFuY2VvZiBVUkxTZWFyY2hQYXJhbXM7XG4gIGNvbnN0IGNvbnRlbnRUeXBlID0gaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpIHx8ICcnO1xuXG4gIGlmIChuZWVkc0JvZHlDb250ZXh0ICYmICFpc0Zvcm1EYXRhICYmICFpc1VSTFNlYXJjaFBhcmFtcykge1xuICAgIGxldCBwYXlsb2FkID0ge307XG4gICAgaWYgKHR5cGVvZiBib2R5ID09PSAnc3RyaW5nJyAmJiBib2R5LnRyaW0oKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcGF5bG9hZCA9IEpTT04ucGFyc2UoYm9keSk7XG4gICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgIHJldHVybiBbdXJsLnRvU3RyaW5nKCksIG5leHRJbml0XTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGJvZHkgPT0gbnVsbCkge1xuICAgICAgcGF5bG9hZCA9IHt9O1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGJvZHkgPT09ICdvYmplY3QnKSB7XG4gICAgICBwYXlsb2FkID0geyAuLi5ib2R5IH07XG4gICAgfVxuXG4gICAgaWYgKHBheWxvYWQuc2Vzc2lvbl9pZCA9PSBudWxsICYmICFfaXNTZXNzaW9uTWFuYWdlbWVudFBhdGgodXJsLnBhdGhuYW1lKSkge1xuICAgICAgcGF5bG9hZC5zZXNzaW9uX2lkID0gc2Vzc2lvbklkO1xuICAgIH1cbiAgICBpZiAocGF5bG9hZC5vd25lcl90b2tlbiA9PSBudWxsICYmICFfaXNTZXNzaW9uTWFuYWdlbWVudFBhdGgodXJsLnBhdGhuYW1lKSkge1xuICAgICAgaWYgKG93bmVyVG9rZW4pIHBheWxvYWQub3duZXJfdG9rZW4gPSBvd25lclRva2VuO1xuICAgIH1cblxuICAgIG5leHRJbml0LmJvZHkgPSBKU09OLnN0cmluZ2lmeShwYXlsb2FkKTtcbiAgICBpZiAoIWNvbnRlbnRUeXBlKSB7XG4gICAgICBoZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL2pzb24nKTtcbiAgICB9XG4gIH1cblxuICBuZXh0SW5pdC5oZWFkZXJzID0gaGVhZGVycztcbiAgcmV0dXJuIFt1cmwudG9TdHJpbmcoKSwgbmV4dEluaXRdO1xufVxuXG5jb25zdCBfbmF0aXZlRmV0Y2ggPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93LmZldGNoID09PSAnZnVuY3Rpb24nXG4gID8gd2luZG93LmZldGNoLmJpbmQod2luZG93KVxuICA6ICh0eXBlb2YgZ2xvYmFsVGhpcy5mZXRjaCA9PT0gJ2Z1bmN0aW9uJyA/IGdsb2JhbFRoaXMuZmV0Y2guYmluZChnbG9iYWxUaGlzKSA6IG51bGwpO1xuXG5hc3luYyBmdW5jdGlvbiBzZXNzaW9uQXdhcmVGZXRjaChpbnB1dCwgaW5pdCA9IHt9KSB7XG4gIGlmIChfbmF0aXZlRmV0Y2ggPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignZmV0Y2ggaXMgbm90IGF2YWlsYWJsZScpO1xuICB9XG4gIGNvbnN0IFtuZXh0SW5wdXQsIG5leHRJbml0XSA9IF9idWlsZFNlc3Npb25Bd2FyZVJlcXVlc3QoaW5wdXQsIGluaXQpO1xuICBsZXQgcmVzcCA9IGF3YWl0IF9uYXRpdmVGZXRjaChuZXh0SW5wdXQsIG5leHRJbml0KTtcbiAgaWYgKHJlc3Auc3RhdHVzID09PSA0MDkpIHtcbiAgICBjb25zdCBzaG91bGRSZXRyeSA9IGF3YWl0IGhhbmRsZTQwOUNvbmZsaWN0KG5leHRJbnB1dCwgbmV4dEluaXQsIHJlc3ApO1xuICAgIGlmIChzaG91bGRSZXRyeSkgcmVzcCA9IGF3YWl0IF9uYXRpdmVGZXRjaChuZXh0SW5wdXQsIG5leHRJbml0KTtcbiAgfVxuICByZXR1cm4gcmVzcDtcbn1cblxuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuZmV0Y2ggPT09ICdmdW5jdGlvbicpIHtcbiAgd2luZG93LmZldGNoID0gc2Vzc2lvbkF3YXJlRmV0Y2g7XG59XG5cbi8qKlxuICogQmFzZSBBUEkgY2FsbCBmdW5jdGlvbiB3aXRoIGVycm9yIGhhbmRsaW5nIGFuZCBsb2dnaW5nLlxuICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZCAtIEhUVFAgbWV0aG9kIChHRVQsIFBPU1QsIGV0Yy4pXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5kcG9pbnQgLSBBUEkgZW5kcG9pbnQgKGUuZy4sICcvYXBpL3N0YXR1cycpXG4gKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIFJlcXVlc3QgYm9keSBkYXRhIChmb3IgUE9TVC9QVVQpXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxvYmplY3Q+fSBQYXJzZWQgSlNPTiByZXNwb25zZVxuICovXG5hc3luYyBmdW5jdGlvbiBhcGlDYWxsKG1ldGhvZCwgZW5kcG9pbnQsIGRhdGEgPSBudWxsKSB7XG4gIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgbWV0aG9kLFxuICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9XG4gIH07XG5cbiAgaWYgKGRhdGEgJiYgKG1ldGhvZCA9PT0gJ1BPU1QnIHx8IG1ldGhvZCA9PT0gJ1BVVCcpKSB7XG4gICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2Vzc2lvbkF3YXJlRmV0Y2goZW5kcG9pbnQsIG9wdGlvbnMpO1xuXG4gICAgLy8gSGFuZGxlIDQwOSBDb25mbGljdCAoc2Vzc2lvbiBhbHJlYWR5IGFjdGl2ZSlcbiAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDkpIHtcbiAgICAgIGxvZy53YXJuKGBTZXNzaW9uIGNvbmZsaWN0IG9uICR7ZW5kcG9pbnR9YCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Nlc3Npb24gYWxyZWFkeSBhY3RpdmUgaW4gYW5vdGhlciB0YWInKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICBsb2cuZXJyb3IoYEFQSSBlcnJvciBvbiAke21ldGhvZH0gJHtlbmRwb2ludH06YCwgcmVzcG9uc2Uuc3RhdHVzLCByZXNwb25zZS5zdGF0dXNUZXh0KTtcbiAgICAgIGxldCBlcnJvck1lc3NhZ2UgPSByZXNwb25zZS5zdGF0dXNUZXh0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZXJyb3JKc29uID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICBpZiAoZXJyb3JKc29uICYmIHR5cGVvZiBlcnJvckpzb24gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgZXJyb3JNZXNzYWdlID0gZXJyb3JKc29uLmVycm9yIHx8IGVycm9ySnNvbi5tZXNzYWdlIHx8IGVycm9yTWVzc2FnZTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAvLyBGYWxsIGJhY2sgdG8gc3RhdHVzIHRleHQgd2hlbiByZXNwb25zZSBpcyBub3QgSlNPTi5cbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtyZXNwb25zZS5zdGF0dXN9OiAke2Vycm9yTWVzc2FnZX1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgIHJldHVybiBqc29uO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy5lcnJvcihgQVBJIGNhbGwgZmFpbGVkOiAke21ldGhvZH0gJHtlbmRwb2ludH1gLCBlcnJvcik7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT1cbi8vIFNlc3Npb24gTWFuYWdlbWVudFxuLy8gPT09PT09PT09PT09PT09PT09PT1cblxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlU2Vzc2lvbigpIHtcbiAgcmV0dXJuIGFwaUNhbGwoJ1BPU1QnLCAnL2FwaS9zZXNzaW9ucy9uZXcnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hTdGF0dXMoKSB7XG4gIGNvbnN0IHN0YXR1cyA9IGF3YWl0IGFwaUNhbGwoJ0dFVCcsICcvYXBpL3N0YXR1cycpO1xuXG4gIC8vIEtlZXAgcHJvdmlkZXIvYXV0aCBVSSBpbiBzeW5jIHdoZW5ldmVyIHN0YXR1cyBpcyBmZXRjaGVkLlxuICBjb25zdCBwcm92aWRlciA9IHN0YXR1cz8ubGxtX3Byb3ZpZGVyIHx8IG51bGw7XG4gIGlmIChwcm92aWRlcikge1xuICAgIGdsb2JhbFRoaXMuY3VycmVudFByb3ZpZGVyID0gcHJvdmlkZXI7XG4gIH1cbiAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzLnVwZGF0ZUF1dGhCYWRnZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGdsb2JhbFRoaXMudXBkYXRlQXV0aEJhZGdlKHN0YXR1cz8uY29waWxvdF9hdXRoIHx8IHt9LCBwcm92aWRlcik7XG4gIH1cblxuICAvLyBVcGRhdGUgd29ya2Zsb3cgc3RlcCBiYXIgKGNsaWNrYWJsZS9jb21wbGV0ZWQvYWN0aXZlIHN0YXRlKSBvbiBldmVyeSBzdGF0dXMgZmV0Y2guXG4gIGlmICh0eXBlb2YgZ2xvYmFsVGhpcy51cGRhdGVXb3JrZmxvd1N0ZXBzID09PSAnZnVuY3Rpb24nICYmIHN0YXR1cyAmJiAhc3RhdHVzLl9lcnJvcikge1xuICAgIGdsb2JhbFRoaXMudXBkYXRlV29ya2Zsb3dTdGVwcyhzdGF0dXMpO1xuICB9XG5cbiAgcmV0dXJuIHN0YXR1cztcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT1cbi8vIFNldHRpbmdzXG4vLyA9PT09PT09PT09PT09PT09PT09PVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaFNldHRpbmdzKCkge1xuICByZXR1cm4gYXBpQ2FsbCgnR0VUJywgJy9hcGkvc2V0dGluZ3MnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlU2V0dGluZ3Moc2V0dGluZ3MpIHtcbiAgcmV0dXJuIGFwaUNhbGwoJ1BVVCcsICcvYXBpL3NldHRpbmdzJywgeyBzZXR0aW5ncyB9KTtcbn1cblxuZXhwb3J0IHtcbiAgU3RvcmFnZUtleXMsXG4gIE9XTkVSX1RPS0VOX0tFWSxcbiAgYXBpQ2FsbCxcbiAgZ2V0U2Vzc2lvbklkRnJvbVVSTCxcbiAgZ2V0T3duZXJUb2tlbixcbiAgZ2V0U2NvcGVkVGFiRGF0YVN0b3JhZ2VLZXksXG4gIHNlc3Npb25Bd2FyZUZldGNoLFxuICBjcmVhdGVTZXNzaW9uLFxuICBmZXRjaFN0YXR1cyxcbiAgZmV0Y2hTZXR0aW5ncywgdXBkYXRlU2V0dGluZ3MsXG59O1xuXG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9mZXRjaC11dGlscy5qc1xuICogR2xvYmFsIGZldGNoIGludGVyY2VwdG9yLCA0MDktY29uZmxpY3QgcmV0cnkgcXVldWUsIExMTSBidXN5IG92ZXJsYXksIGFuZFxuICogdGhlIHNldExvYWRpbmcgaGVscGVyIHRoYXQgZHJpdmVzIGJ1dHRvbnMvcHJvZ3Jlc3MgYmFyL2Fib3J0IGNvbnRyb2xsZXIuXG4gKlxuICogREVQRU5ERU5DSUVTOiB1aS1jb3JlLmpzIGV4cG9ydHMgKHRyYXBGb2N1cyBldGMuKSBhdmFpbGFibGUgb24gZ2xvYmFsVGhpcy5cbiAqICAgICAgICAgICAgICAgc2V0TG9hZGluZyBjYWxscyBfdXBkYXRlTExNT3ZlcmxheSAoZGVmaW5lZCBoZXJlKSBhbmRcbiAqICAgICAgICAgICAgICAgYXBwZW5kTWVzc2FnZSAoZGVmaW5lZCBpbiBtZXNzYWdlLXF1ZXVlLmpzLCBvbiBnbG9iYWxUaGlzKS5cbiAqL1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIDQwOSBDb25mbGljdCByZXRyeSBxdWV1ZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IF9jb25mbGljdFJldHJ5UXVldWUgPSBbXTtcbmxldCAgIF9jb25mbGljdFRpbWVySWQgICAgPSBudWxsO1xubGV0ICAgX2NvbmZsaWN0Q291bnRkb3duICA9IDA7XG5cbi8qKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHJlcXVlc3Qgc2hvdWxkIGJlIGludGVyY2VwdGVkIGJ5IHRoZSA0MDkgaGFuZGxlci4gKi9cbmZ1bmN0aW9uIF9zaG91bGRIYW5kbGVCdXN5Q29uZmxpY3QoYXJncykge1xuICB0cnkge1xuICAgIGNvbnN0IHJhd1VybCA9IHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJyA/IGFyZ3NbMF0gOiBhcmdzWzBdPy51cmw7XG4gICAgaWYgKCFyYXdVcmwpIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocmF3VXJsLCB3aW5kb3cubG9jYXRpb24ub3JpZ2luKTtcbiAgICByZXR1cm4gdXJsLnBhdGhuYW1lICE9PSAnL2FwaS9zZXNzaW9ucy9jbGFpbScgJiYgdXJsLnBhdGhuYW1lICE9PSAnL2FwaS9zZXNzaW9ucy90YWtlb3Zlcic7XG4gIH0gY2F0Y2ggKF8pIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG4vKipcbiAqIEhhbmRsZSBhIDQwOSBDb25mbGljdCByZXNwb25zZTogc2hvdyB0aGUgYW1iZXIgYmFubmVyIGFuZCBhd2FpdCB1c2VyIGNob2ljZS5cbiAqIFJldHVybnMgYSBQcm9taXNlPGJvb2xlYW4+IFx1MjAxNCB0cnVlIG1lYW5zIFwicmV0cnlcIiwgZmFsc2UgbWVhbnMgXCJkaXNtaXNzXCIuXG4gKiBDYWxsZWQgZnJvbSBhcGktY2xpZW50LmpzIGluc2lkZSBzZXNzaW9uQXdhcmVGZXRjaCBzbyB0aGUgZnVsbCBmZXRjaCBwaXBlbGluZVxuICogaXMgb3duZWQgYnkgYSBzaW5nbGUgbW9kdWxlLWxldmVsIHdpbmRvdy5mZXRjaCBhc3NpZ25tZW50IHRoZXJlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfFJlcXVlc3R9IGlucHV0IC0gVGhlIHJlcXVlc3QgVVJML29iamVjdCAodXNlZCBmb3IgcGF0aCBmaWx0ZXJpbmcpLlxuICogQHBhcmFtIHtvYmplY3R9IGluaXQgLSBUaGUgZmV0Y2ggaW5pdCBvcHRpb25zLlxuICogQHBhcmFtIHtSZXNwb25zZX0gW3Jlc3BvbnNlXSAtIFRoZSA0MDkgcmVzcG9uc2UgKHVzZWQgdG8gY2hlY2sgY29uZmxpY3RfdHlwZSkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZTQwOUNvbmZsaWN0KGlucHV0LCBpbml0LCByZXNwb25zZSkge1xuICBpZiAoIV9zaG91bGRIYW5kbGVCdXN5Q29uZmxpY3QoW2lucHV0LCBpbml0XSkpIHJldHVybiBmYWxzZTtcbiAgaWYgKHJlc3BvbnNlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCByZXNwb25zZS5jbG9uZSgpLmpzb24oKTtcbiAgICAgIGlmIChib2R5ICYmIGJvZHkuY29uZmxpY3RfdHlwZSAmJiBib2R5LmNvbmZsaWN0X3R5cGUgIT09ICdzZXNzaW9uX293bmVyc2hpcCcpIHJldHVybiBmYWxzZTtcbiAgICB9IGNhdGNoIChfKSB7IC8qIG5vbi1KU09OIGJvZHkgXHUyMDE0IHByb2NlZWQgdG8gYmFubmVyICovIH1cbiAgfVxuICBzaG93U2Vzc2lvbkNvbmZsaWN0QmFubmVyKCk7XG4gIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IF9jb25mbGljdFJldHJ5UXVldWUucHVzaChyZXNvbHZlKSk7XG59XG5cbmZ1bmN0aW9uIHNob3dTZXNzaW9uQ29uZmxpY3RCYW5uZXIoKSB7XG4gIGNvbnN0IGJhbm5lciAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Nlc3Npb24tY29uZmxpY3QtYmFubmVyJyk7XG4gIGNvbnN0IGJhbm5lclRleHQgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbmZsaWN0LWJhbm5lci10ZXh0Jyk7XG4gIGNvbnN0IGNvdW50ZG93bkVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbmZsaWN0LWNvdW50ZG93bicpO1xuICBpZiAoIWJhbm5lcikgcmV0dXJuO1xuICBiYW5uZXIuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gIGlmIChfY29uZmxpY3RUaW1lcklkKSB7IGNsZWFySW50ZXJ2YWwoX2NvbmZsaWN0VGltZXJJZCk7IF9jb25mbGljdFRpbWVySWQgPSBudWxsOyB9XG4gIF9jb25mbGljdENvdW50ZG93biA9IDMwO1xuICBpZiAoYmFubmVyVGV4dCkgIGJhbm5lclRleHQudGV4dENvbnRlbnQgID0gJ1x1MjZBMCBBbm90aGVyIG9wZXJhdGlvbiBpcyBpbiBwcm9ncmVzcy4gQXV0by1yZXRyeWluZyBpbiAnO1xuICBpZiAoY291bnRkb3duRWwpIGNvdW50ZG93bkVsLnRleHRDb250ZW50ID0gYCR7X2NvbmZsaWN0Q291bnRkb3dufXNcdTIwMjZgO1xuICBfY29uZmxpY3RUaW1lcklkID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgIF9jb25mbGljdENvdW50ZG93bi0tO1xuICAgIGlmIChfY29uZmxpY3RDb3VudGRvd24gPD0gMCkge1xuICAgICAgY2xlYXJJbnRlcnZhbChfY29uZmxpY3RUaW1lcklkKTsgX2NvbmZsaWN0VGltZXJJZCA9IG51bGw7XG4gICAgICBjb25mbGljdFJldHJ5Tm93KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChjb3VudGRvd25FbCkgY291bnRkb3duRWwudGV4dENvbnRlbnQgPSBgJHtfY29uZmxpY3RDb3VudGRvd259c1x1MjAyNmA7XG4gICAgfVxuICB9LCAxMDAwKTtcbn1cblxuZnVuY3Rpb24gY29uZmxpY3RSZXRyeU5vdygpIHtcbiAgaWYgKF9jb25mbGljdFRpbWVySWQpIHsgY2xlYXJJbnRlcnZhbChfY29uZmxpY3RUaW1lcklkKTsgX2NvbmZsaWN0VGltZXJJZCA9IG51bGw7IH1cbiAgY29uc3QgYmFubmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Nlc3Npb24tY29uZmxpY3QtYmFubmVyJyk7XG4gIGlmIChiYW5uZXIpIGJhbm5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICB3aGlsZSAoX2NvbmZsaWN0UmV0cnlRdWV1ZS5sZW5ndGgpIF9jb25mbGljdFJldHJ5UXVldWUuc2hpZnQoKSh0cnVlKTtcbn1cblxuZnVuY3Rpb24gY29uZmxpY3REaXNtaXNzKCkge1xuICBpZiAoX2NvbmZsaWN0VGltZXJJZCkgeyBjbGVhckludGVydmFsKF9jb25mbGljdFRpbWVySWQpOyBfY29uZmxpY3RUaW1lcklkID0gbnVsbDsgfVxuICBjb25zdCBiYW5uZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2Vzc2lvbi1jb25mbGljdC1iYW5uZXInKTtcbiAgaWYgKGJhbm5lcikgYmFubmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHdoaWxlIChfY29uZmxpY3RSZXRyeVF1ZXVlLmxlbmd0aCkgX2NvbmZsaWN0UmV0cnlRdWV1ZS5zaGlmdCgpKGZhbHNlKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBMTE0gZmV0Y2ggd3JhcHBlciAoYXR0YWNoZXMgYWJvcnQgc2lnbmFsKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIGxsbUZldGNoKHVybCwgb3B0aW9ucyA9IHt9KSB7XG4gIGlmICh3aW5kb3cuX2N1cnJlbnRBYm9ydENvbnRyb2xsZXIpIHtcbiAgICBvcHRpb25zLnNpZ25hbCA9IHdpbmRvdy5fY3VycmVudEFib3J0Q29udHJvbGxlci5zaWduYWw7XG4gIH1cbiAgcmV0dXJuIGZldGNoKHVybCwgb3B0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIGFib3J0Q3VycmVudFJlcXVlc3QoKSB7XG4gIGlmICh3aW5kb3cuX2N1cnJlbnRBYm9ydENvbnRyb2xsZXIpIHtcbiAgICB3aW5kb3cuX2N1cnJlbnRBYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICB3aW5kb3cuX2N1cnJlbnRBYm9ydENvbnRyb2xsZXIgPSBudWxsO1xuICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgIGlmICh0eXBlb2YgYXBwZW5kTWVzc2FnZSA9PT0gJ2Z1bmN0aW9uJykgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgJ1x1MjNGOSBSZXF1ZXN0IHN0b3BwZWQuJyk7XG4gIH1cbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBMTE0gYnVzeSBvdmVybGF5XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxubGV0IF9sbG1FbGFwc2VkVGltZXIgPSBudWxsO1xubGV0IF9sbG1TdGFydFRpbWUgICAgPSBudWxsO1xuXG5mdW5jdGlvbiBfdXBkYXRlTExNT3ZlcmxheShsb2FkaW5nLCBsYWJlbCkge1xuICBjb25zdCBvdmVybGF5ICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG0tYnVzeS1vdmVybGF5Jyk7XG4gIGNvbnN0IGxhYmVsRWwgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbS1idXN5LWxhYmVsJyk7XG4gIGNvbnN0IGVsYXBzZWQgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbS1idXN5LWVsYXBzZWQnKTtcbiAgaWYgKCFvdmVybGF5KSByZXR1cm47XG5cbiAgaWYgKGxvYWRpbmcpIHtcbiAgICBvdmVybGF5LmNsYXNzTGlzdC5hZGQoJ3Zpc2libGUnKTtcbiAgICBvdmVybGF5LmNsYXNzTGlzdC5yZW1vdmUoJ3Nsb3cnKTtcbiAgICBpZiAobGFiZWxFbCkgbGFiZWxFbC50ZXh0Q29udGVudCA9IGxhYmVsIHx8ICdSZWFzb25pbmdcdTIwMjYnO1xuICAgIGlmIChlbGFwc2VkKSAgZWxhcHNlZC50ZXh0Q29udGVudCA9ICcwOjAwJztcblxuICAgIF9sbG1TdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGNsZWFySW50ZXJ2YWwoX2xsbUVsYXBzZWRUaW1lcik7XG4gICAgX2xsbUVsYXBzZWRUaW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIGNvbnN0IHNlY3MgPSBNYXRoLmZsb29yKChEYXRlLm5vdygpIC0gX2xsbVN0YXJ0VGltZSkgLyAxMDAwKTtcbiAgICAgIGNvbnN0IG1tID0gU3RyaW5nKE1hdGguZmxvb3Ioc2VjcyAvIDYwKSkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICAgIGNvbnN0IHNzID0gU3RyaW5nKHNlY3MgJSA2MCkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICAgIGlmIChlbGFwc2VkKSBlbGFwc2VkLnRleHRDb250ZW50ID0gYCR7bW19OiR7c3N9YDtcbiAgICAgIGlmIChzZWNzID49IDMwICYmICFvdmVybGF5LmNsYXNzTGlzdC5jb250YWlucygnc2xvdycpKSB7XG4gICAgICAgIG92ZXJsYXkuY2xhc3NMaXN0LmFkZCgnc2xvdycpO1xuICAgICAgfVxuICAgIH0sIDEwMDApO1xuICB9IGVsc2Uge1xuICAgIGNsZWFySW50ZXJ2YWwoX2xsbUVsYXBzZWRUaW1lcik7XG4gICAgX2xsbUVsYXBzZWRUaW1lciA9IG51bGw7XG4gICAgX2xsbVN0YXJ0VGltZSAgICA9IG51bGw7XG4gICAgb3ZlcmxheS5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJywgJ3Nsb3cnKTtcbiAgICBpZiAobGFiZWxFbCkgbGFiZWxFbC50ZXh0Q29udGVudCA9ICdSZWFzb25pbmdcdTIwMjYnO1xuICAgIGlmIChlbGFwc2VkKSAgZWxhcHNlZC50ZXh0Q29udGVudCA9ICcwOjAwJztcbiAgICBfcmVmcmVzaENvbnRleHRTdGF0cygpO1xuICB9XG59XG5cbi8vIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkgZm9yIHRlc3RzL2ltcG9ydHMgdGhhdCBzdGlsbCByZWZlcmVuY2UgdGhlIG9sZCBuYW1lLlxuZnVuY3Rpb24gX3VwZGF0ZUxMTVN0YXR1c0Jhcihsb2FkaW5nLCBsYWJlbCkge1xuICBfdXBkYXRlTExNT3ZlcmxheShsb2FkaW5nLCBsYWJlbCk7XG5cbiAgY29uc3QgYmFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbS1zdGF0dXMtYmFyJyk7XG4gIGNvbnN0IHRoaW5raW5nID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbS10aGlua2luZycpO1xuICBjb25zdCBzdGVwTGFiZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtLXN0ZXAtbGFiZWwnKTtcbiAgY29uc3QgYWJvcnRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtLWFib3J0LWJ0bicpO1xuICBpZiAoIWJhcikgcmV0dXJuO1xuXG4gIGlmIChsb2FkaW5nKSB7XG4gICAgYmFyLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgaWYgKHRoaW5raW5nKSB0aGlua2luZy5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICAgIGlmIChzdGVwTGFiZWwpIHN0ZXBMYWJlbC50ZXh0Q29udGVudCA9IGxhYmVsIHx8ICdSZWFzb25pbmdcdTIwMjYnO1xuICAgIGlmIChhYm9ydEJ0bikge1xuICAgICAgYWJvcnRCdG4uc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgYWJvcnRCdG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKHRoaW5raW5nKSB0aGlua2luZy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGlmIChhYm9ydEJ0bikgYWJvcnRCdG4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBiYXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBfcmVmcmVzaENvbnRleHRTdGF0cygpIHtcbiAgY29uc3QgdG9rZW5FbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG0tdG9rZW4tY291bnQnKTtcbiAgaWYgKCF0b2tlbkVsKSByZXR1cm47XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL2NvbnRleHQtc3RhdHMnKTtcbiAgICBpZiAoIXJlcy5vaykgcmV0dXJuO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmICghZGF0YS5vaykgcmV0dXJuO1xuICAgIGNvbnN0IGVzdCAgICA9IGRhdGEuZXN0aW1hdGVkX3Rva2VucyB8fCAwO1xuICAgIGNvbnN0IHdpbiAgICA9IGRhdGEuY29udGV4dF93aW5kb3cgICB8fCAxMjhfMDAwO1xuICAgIGNvbnN0IGV4YWN0ICA9IGRhdGEudG9rZW5fc291cmNlID09PSAnZXhhY3QnO1xuICAgIGNvbnN0IHBjdCAgICA9IE1hdGgucm91bmQoKGVzdCAvIHdpbikgKiAxMDApO1xuICAgIGNvbnN0IGVzdFN0ciA9IGVzdCA+PSAxMDAwID8gYCR7KGVzdCAvIDEwMDApLnRvRml4ZWQoMSl9S2AgOiBgJHtlc3R9YDtcbiAgICBjb25zdCB3aW5TdHIgPSB3aW4gPj0gMTAwMCA/IGAke01hdGgucm91bmQod2luIC8gMTAwMCl9S2AgIDogYCR7d2lufWA7XG4gICAgdG9rZW5FbC50ZXh0Q29udGVudCA9IGAke2V4YWN0ID8gJycgOiAnfid9JHtlc3RTdHJ9IC8gJHt3aW5TdHJ9ICgke3BjdH0lKWA7XG4gIH0gY2F0Y2ggKF8pIHsgLyogc2lsZW50bHkgaWdub3JlICovIH1cbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBMb2FkaW5nIHN0YXRlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gc2V0TG9hZGluZyhsb2FkaW5nLCBsYWJlbCkge1xuICBpZiAodHlwZW9mIHN0YXRlTWFuYWdlciAhPT0gJ3VuZGVmaW5lZCcgJiYgc3RhdGVNYW5hZ2VyPy5zZXRMb2FkaW5nKSB7XG4gICAgc3RhdGVNYW5hZ2VyLnNldExvYWRpbmcobG9hZGluZyk7XG4gIH1cblxuICBpZiAobG9hZGluZykge1xuICAgIHdpbmRvdy5fY3VycmVudEFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAvLyBFeHBhbmQgY2hhdCBwYW5lbCBpZiBjb2xsYXBzZWRcbiAgICBjb25zdCBjaGF0QXJlYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaGF0LWFyZWEnKTtcbiAgICBjb25zdCB2aWV3ZXJBcmVhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ZpZXdlci1hcmVhJyk7XG4gICAgY29uc3QgdG9nZ2xlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvZ2dsZS1jaGF0Jyk7XG4gICAgaWYgKGNoYXRBcmVhPy5jbGFzc0xpc3QuY29udGFpbnMoJ2NvbGxhcHNlZCcpKSB7XG4gICAgICBjaGF0QXJlYS5jbGFzc0xpc3QucmVtb3ZlKCdjb2xsYXBzZWQnKTtcbiAgICAgIHZpZXdlckFyZWE/LmNsYXNzTGlzdC5yZW1vdmUoJ2V4cGFuZGVkJyk7XG4gICAgICBpZiAodG9nZ2xlQnRuKSB0b2dnbGVCdG4udGV4dENvbnRlbnQgPSAnXHUyNUMwJztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgd2luZG93Ll9jdXJyZW50QWJvcnRDb250cm9sbGVyID0gbnVsbDtcbiAgfVxuXG4gIF91cGRhdGVMTE1TdGF0dXNCYXIobG9hZGluZywgbGFiZWwpO1xuXG4gIC8vIE9ubHkgZGlzYWJsZSBidXR0b25zIGluc2lkZSB0aGUgY2hhdC9pbnRlcmFjdGlvbiBhcmVhIFx1MjAxNCBub3QgdGhlIHdob2xlIHBhZ2UuXG4gIGNvbnN0IGNoYXRBcmVhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NoYXQtYXJlYScpO1xuICBjb25zdCBzY29wZSA9IGNoYXRBcmVhIHx8IGRvY3VtZW50O1xuICBzY29wZS5xdWVyeVNlbGVjdG9yQWxsKCdidXR0b24nKS5mb3JFYWNoKGJ0biA9PiB7IGJ0bi5kaXNhYmxlZCA9IGxvYWRpbmc7IH0pO1xuICBjb25zdCBzdG9wQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbS1idXN5LXN0b3AnKTtcbiAgaWYgKHN0b3BCdG4pIHN0b3BCdG4uZGlzYWJsZWQgPSBmYWxzZTtcblxuICBsZXQgYmFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvYWRpbmctcHJvZ3Jlc3MtYmFyJyk7XG4gIGlmIChsb2FkaW5nKSB7XG4gICAgaWYgKCFiYXIpIHtcbiAgICAgIGJhciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgYmFyLmlkID0gJ2xvYWRpbmctcHJvZ3Jlc3MtYmFyJztcbiAgICAgIGRvY3VtZW50LmJvZHkucHJlcGVuZChiYXIpO1xuICAgIH1cbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4geyBiYXIuc3R5bGUud2lkdGggPSAnNzAlJzsgfSk7XG4gICAgaWYgKGxhYmVsKSBiYXIudGl0bGUgPSBsYWJlbDtcbiAgfSBlbHNlIHtcbiAgICBpZiAoYmFyKSB7XG4gICAgICBiYXIuc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IGJhci5yZW1vdmUoKSwgNDAwKTtcbiAgICB9XG4gIH1cblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc3RlcC5hY3RpdmUnKS5mb3JFYWNoKGVsID0+IHtcbiAgICBlbC5jbGFzc0xpc3QudG9nZ2xlKCdsb2FkaW5nLXN0ZXAnLCBsb2FkaW5nKTtcbiAgfSk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFUyBtb2R1bGUgZXhwb3J0cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmV4cG9ydCB7XG4gIGhhbmRsZTQwOUNvbmZsaWN0LFxuICBzaG93U2Vzc2lvbkNvbmZsaWN0QmFubmVyLCBjb25mbGljdFJldHJ5Tm93LCBjb25mbGljdERpc21pc3MsXG4gIGxsbUZldGNoLCBhYm9ydEN1cnJlbnRSZXF1ZXN0LFxuICBfdXBkYXRlTExNU3RhdHVzQmFyLFxuICBfdXBkYXRlTExNT3ZlcmxheSwgX3JlZnJlc2hDb250ZXh0U3RhdHMsXG4gIHNldExvYWRpbmcsXG59O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiBzdGF0ZS1tYW5hZ2VyLmpzXG4gKiBNYW5hZ2VzIHNlc3Npb24gc3RhdGUsIGxvY2FsU3RvcmFnZSBwZXJzaXN0ZW5jZSwgYW5kIHN0YXRlIGluaXRpYWxpemF0aW9uLlxuICogQ2VudHJhbGl6ZXMgYWxsIHN0YXRlIG1hbmFnZW1lbnQgbG9naWMgKGN1cnJlbnRUYWIsIGludGVyYWN0aXZlU3RhdGUsIHNlc3Npb25JZCwgZXRjLilcbiAqL1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5jb25zdCBsb2cgPSBnZXRMb2dnZXIoJ3N0YXRlLW1hbmFnZXInKTtcblxuaW1wb3J0IHsgU3RvcmFnZUtleXMgfSBmcm9tICcuL2FwaS1jbGllbnQuanMnO1xuXG4vKipcbiAqIE1pcnJvciBvZiB0aGUgUHl0aG9uIFBoYXNlIGVudW0gaW4gc2NyaXB0cy91dGlscy9jb252ZXJzYXRpb25fbWFuYWdlci5weS5cbiAqIFB5dGhvbiBpcyB0aGUgU09VUkNFIE9GIFRSVVRIIFx1MjAxNCB1cGRhdGUgYm90aCBmaWxlcyB0b2dldGhlciB3aGVuZXZlciBhZGRpbmdcbiAqIG9yIHJlbmFtaW5nIGEgcGhhc2UuXG4gKi9cbmNvbnN0IFBIQVNFUyA9IHtcbiAgSU5JVDogICAgICAgICAgICAgJ2luaXQnLFxuICBKT0JfQU5BTFlTSVM6ICAgICAnam9iX2FuYWx5c2lzJyxcbiAgQ1VTVE9NSVpBVElPTjogICAgJ2N1c3RvbWl6YXRpb24nLFxuICBSRVdSSVRFX1JFVklFVzogICAncmV3cml0ZV9yZXZpZXcnLFxuICBTUEVMTF9DSEVDSzogICAgICAnc3BlbGxfY2hlY2snLFxuICBHRU5FUkFUSU9OOiAgICAgICAnZ2VuZXJhdGlvbicsXG4gIExBWU9VVF9SRVZJRVc6ICAgICdsYXlvdXRfcmV2aWV3JyxcbiAgRklOQUxfR0VORVJBVElPTjogJ2ZpbmFsX2dlbmVyYXRpb24nLFxuICBSRUZJTkVNRU5UOiAgICAgICAncmVmaW5lbWVudCcsXG59O1xuXG5jb25zdCBQSEFTRV9UT19TVEVQID0ge1xuICBbUEhBU0VTLklOSVRdOiAgICAgICAgICAgICAnam9iJyxcbiAgW1BIQVNFUy5KT0JfQU5BTFlTSVNdOiAgICAgJ2FuYWx5c2lzJyxcbiAgW1BIQVNFUy5DVVNUT01JWkFUSU9OXTogICAgJ2N1c3RvbWl6YXRpb25zJyxcbiAgW1BIQVNFUy5SRVdSSVRFX1JFVklFV106ICAgJ3Jld3JpdGUnLFxuICBbUEhBU0VTLlNQRUxMX0NIRUNLXTogICAgICAnc3BlbGwnLFxuICBbUEhBU0VTLkdFTkVSQVRJT05dOiAgICAgICAnbGF5b3V0JyxcbiAgW1BIQVNFUy5MQVlPVVRfUkVWSUVXXTogICAgJ2xheW91dCcsXG4gIFtQSEFTRVMuRklOQUxfR0VORVJBVElPTl06ICdkb3dubG9hZCcsXG4gIFtQSEFTRVMuUkVGSU5FTUVOVF06ICAgICAgICdkb3dubG9hZCcsXG59O1xuXG5mdW5jdGlvbiBnZXRXb3JrZmxvd1N0ZXBGb3JQaGFzZShwaGFzZSkge1xuICByZXR1cm4gUEhBU0VfVE9fU1RFUFtwaGFzZV0gfHwgJ2pvYic7XG59XG5cbi8qKlxuICogU3RhZ2VkIGdlbmVyYXRpb24gd29ya2Zsb3cgcGhhc2VzIChHQVAtMjAgaW1wbGVtZW50YXRpb24pLlxuICogVGhlc2UgdHJhY2sgdGhlIHByZXZpZXcvbGF5b3V0IHJldmlldyBcdTIxOTIgY29uZmlybWVkIFx1MjE5MiBmaW5hbCBwaXBlbGluZVxuICogaW5kZXBlbmRlbnRseSBvZiB0aGUgbWFpbiBjb252ZXJzYXRpb24gUEhBU0VTIGFib3ZlLlxuICogQmFja2VuZCBzb3VyY2Ugb2YgdHJ1dGggaXMgc2Vzc2lvbl9kYXRhWydnZW5lcmF0aW9uX3N0YXRlJ11bJ3BoYXNlJ10uXG4gKi9cbmNvbnN0IEdFTkVSQVRJT05fUEhBU0VTID0ge1xuICBJRExFOiAgICAgICAgICAgJ2lkbGUnLFxuICBMQVlPVVRfUkVWSUVXOiAgJ2xheW91dF9yZXZpZXcnLFxuICBDT05GSVJNRUQ6ICAgICAgJ2NvbmZpcm1lZCcsXG4gIEZJTkFMX0NPTVBMRVRFOiAnZmluYWxfY29tcGxldGUnLFxufTtcblxuY29uc3QgR0VORVJBVElPTl9TVEFURV9FVkVOVCA9ICdjdmJ1aWxkZXI6Z2VuZXJhdGlvbi1zdGF0ZS1jaGFuZ2VkJztcblxuZnVuY3Rpb24gY3JlYXRlRGVmYXVsdEdlbmVyYXRpb25TdGF0ZSgpIHtcbiAgcmV0dXJuIHtcbiAgICBwaGFzZTogR0VORVJBVElPTl9QSEFTRVMuSURMRSxcbiAgICBwcmV2aWV3QXZhaWxhYmxlOiBmYWxzZSxcbiAgICBwcmV2aWV3T3V0cHV0czogbnVsbCxcbiAgICBsYXlvdXRDb25maXJtZWQ6IGZhbHNlLFxuICAgIHBhZ2VDb3VudEVzdGltYXRlOiBudWxsLFxuICAgIHBhZ2VDb3VudEV4YWN0OiBudWxsLFxuICAgIHBhZ2VDb3VudENvbmZpZGVuY2U6IG51bGwsXG4gICAgcGFnZUNvdW50U291cmNlOiBudWxsLFxuICAgIHBhZ2VOZWVkc0V4YWN0UmVjaGVjazogZmFsc2UsXG4gICAgcGFnZVdhcm5pbmc6IGZhbHNlLFxuICAgIGxheW91dEluc3RydWN0aW9uc0NvdW50OiAwLFxuICAgIGZpbmFsR2VuZXJhdGVkQXQ6IG51bGwsXG4gICAgcHJldmlld0dlbmVyYXRlZEF0OiBudWxsLFxuICAgIHByZXZpZXdSZXF1ZXN0SWQ6IG51bGwsXG4gICAgY29uZmlybWVkQXQ6IG51bGwsXG4gICAgY29udGVudFJldmlzaW9uOiAwLFxuICAgIGxhc3RQcmV2aWV3Q29udGVudFJldmlzaW9uOiBudWxsLFxuICAgIGxhc3RGaW5hbENvbnRlbnRSZXZpc2lvbjogbnVsbCxcbiAgICBkaXJ0eVBoYXNlczogW10sXG4gICAgZWFybGllc3REaXJ0eVN0ZXA6IG51bGwsXG4gIH07XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJldmlzaW9uKHZhbHVlKSB7XG4gIHJldHVybiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpID8gdmFsdWUgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBnZXRMYXN0UmVuZGVyZWRDb250ZW50UmV2aXNpb24oc3RhdGUpIHtcbiAgY29uc3QgcmV2aXNpb25zID0gW1xuICAgIG5vcm1hbGl6ZVJldmlzaW9uKHN0YXRlLmxhc3RQcmV2aWV3Q29udGVudFJldmlzaW9uKSxcbiAgICBub3JtYWxpemVSZXZpc2lvbihzdGF0ZS5sYXN0RmluYWxDb250ZW50UmV2aXNpb24pLFxuICBdLmZpbHRlcih2YWx1ZSA9PiB2YWx1ZSAhPT0gbnVsbCk7XG4gIHJldHVybiByZXZpc2lvbnMubGVuZ3RoID4gMCA/IE1hdGgubWF4KC4uLnJldmlzaW9ucykgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZVNlc3Npb25JZCgpIHtcbiAgY29uc3QgY3J5cHRvQXBpID0gZ2xvYmFsVGhpcy5jcnlwdG87XG4gIGlmIChjcnlwdG9BcGk/LnJhbmRvbVVVSUQpIHtcbiAgICByZXR1cm4gYHNlc3Npb24tJHtjcnlwdG9BcGkucmFuZG9tVVVJRCgpfWA7XG4gIH1cblxuICBpZiAoY3J5cHRvQXBpPy5nZXRSYW5kb21WYWx1ZXMpIHtcbiAgICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KDE2KTtcbiAgICBjcnlwdG9BcGkuZ2V0UmFuZG9tVmFsdWVzKGJ5dGVzKTtcbiAgICBjb25zdCB0b2tlbiA9IEFycmF5LmZyb20oYnl0ZXMsIGJ5dGUgPT4gYnl0ZS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKSkuam9pbignJyk7XG4gICAgcmV0dXJuIGBzZXNzaW9uLSR7dG9rZW59YDtcbiAgfVxuXG4gIGxvZy53YXJuKCdXZWIgQ3J5cHRvIEFQSSB1bmF2YWlsYWJsZTsgZmFsbGluZyBiYWNrIHRvIHRpbWVzdGFtcC1wbHVzLXJhbmRvbSBzZXNzaW9uIGlkIGdlbmVyYXRpb24uJyk7XG4gIHJldHVybiBgc2Vzc2lvbi0ke0RhdGUubm93KCkudG9TdHJpbmcoMzYpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDExKX1gO1xufVxuXG5mdW5jdGlvbiBnZXRMYXlvdXRGcmVzaG5lc3NGcm9tU3RhdGUoc3RhdGUpIHtcbiAgY29uc3QgcHJldmlld0F2YWlsYWJsZSA9IEJvb2xlYW4oc3RhdGUucHJldmlld0F2YWlsYWJsZSk7XG4gIGNvbnN0IGhhc0ZpbmFsT3V0cHV0cyA9IEJvb2xlYW4oXG4gICAgc3RhdGUuZmluYWxHZW5lcmF0ZWRBdFxuICAgICAgfHwgc3RhdGUucGhhc2UgPT09IEdFTkVSQVRJT05fUEhBU0VTLkZJTkFMX0NPTVBMRVRFXG4gICAgICB8fCBub3JtYWxpemVSZXZpc2lvbihzdGF0ZS5sYXN0RmluYWxDb250ZW50UmV2aXNpb24pICE9PSBudWxsXG4gICk7XG5cbiAgaWYgKCFwcmV2aWV3QXZhaWxhYmxlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNob3dDaGlwOiBmYWxzZSxcbiAgICAgIGlzU3RhbGU6IGZhbHNlLFxuICAgICAgaXNDcml0aWNhbDogZmFsc2UsXG4gICAgICBoYXNGaW5hbE91dHB1dHMsXG4gICAgICBsYWJlbDogJycsXG4gICAgICBhcmlhTGFiZWw6ICcnLFxuICAgICAgdG9uZTogJ2hpZGRlbicsXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IGNvbnRlbnRSZXZpc2lvbiA9IG5vcm1hbGl6ZVJldmlzaW9uKHN0YXRlLmNvbnRlbnRSZXZpc2lvbikgPz8gMDtcbiAgY29uc3QgbGFzdFJlbmRlcmVkUmV2aXNpb24gPSBnZXRMYXN0UmVuZGVyZWRDb250ZW50UmV2aXNpb24oc3RhdGUpO1xuICBjb25zdCBpc1N0YWxlID0gbGFzdFJlbmRlcmVkUmV2aXNpb24gIT09IG51bGwgJiYgY29udGVudFJldmlzaW9uID4gbGFzdFJlbmRlcmVkUmV2aXNpb247XG4gIGNvbnN0IGlzQ3JpdGljYWwgPSBpc1N0YWxlICYmIGhhc0ZpbmFsT3V0cHV0cztcblxuICBpZiAoaXNDcml0aWNhbCkge1xuICAgIHJldHVybiB7XG4gICAgICBzaG93Q2hpcDogdHJ1ZSxcbiAgICAgIGlzU3RhbGUsXG4gICAgICBpc0NyaXRpY2FsLFxuICAgICAgaGFzRmluYWxPdXRwdXRzLFxuICAgICAgbGFiZWw6ICdGaWxlcyBvdXRkYXRlZCcsXG4gICAgICBhcmlhTGFiZWw6ICdGaWxlcyBvdXRkYXRlZC4gQWN0aXZhdGUgdG8gcmV2aWV3IGxheW91dCBhbmQgcmVnZW5lcmF0ZSBvdXRwdXRzLicsXG4gICAgICB0b25lOiAnY3JpdGljYWwnLFxuICAgIH07XG4gIH1cblxuICBpZiAoaXNTdGFsZSkge1xuICAgIHJldHVybiB7XG4gICAgICBzaG93Q2hpcDogdHJ1ZSxcbiAgICAgIGlzU3RhbGUsXG4gICAgICBpc0NyaXRpY2FsLFxuICAgICAgaGFzRmluYWxPdXRwdXRzLFxuICAgICAgbGFiZWw6ICdMYXlvdXQgb3V0ZGF0ZWQnLFxuICAgICAgYXJpYUxhYmVsOiAnTGF5b3V0IG91dGRhdGVkLiBBY3RpdmF0ZSB0byByZXZpZXcgYW5kIHJlZ2VuZXJhdGUgcHJldmlldy4nLFxuICAgICAgdG9uZTogJ3N0YWxlJyxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzaG93Q2hpcDogdHJ1ZSxcbiAgICBpc1N0YWxlLFxuICAgIGlzQ3JpdGljYWwsXG4gICAgaGFzRmluYWxPdXRwdXRzLFxuICAgIGxhYmVsOiAnTGF5b3V0IGN1cnJlbnQnLFxuICAgIGFyaWFMYWJlbDogJ0xheW91dCBjdXJyZW50LiBQcmV2aWV3IG1hdGNoZXMgbGF0ZXN0IGNvbnRlbnQuJyxcbiAgICB0b25lOiAnZnJlc2gnLFxuICB9O1xufVxuXG5mdW5jdGlvbiBlbWl0R2VuZXJhdGlvblN0YXRlQ2hhbmdlZCgpIHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiB3aW5kb3cuZGlzcGF0Y2hFdmVudCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybjtcbiAgfVxuICB3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoR0VORVJBVElPTl9TVEFURV9FVkVOVCwge1xuICAgIGRldGFpbDoge1xuICAgICAgZ2VuZXJhdGlvblN0YXRlOiB7IC4uLmdlbmVyYXRpb25TdGF0ZSB9LFxuICAgICAgbGF5b3V0RnJlc2huZXNzOiBnZXRMYXlvdXRGcmVzaG5lc3NGcm9tU3RhdGUoZ2VuZXJhdGlvblN0YXRlKSxcbiAgICB9LFxuICB9KSk7XG59XG5cbi8vIEdsb2JhbCBzdGF0ZSB2YXJpYWJsZXMgKG1vdmVkIGludG8gbW9kdWxlIGZvciBjbGFyaXR5KVxubGV0IGN1cnJlbnRUYWIgPSAnam9iJztcbmxldCBpc0xvYWRpbmcgPSBmYWxzZTtcbmxldCB0YWJEYXRhID0ge1xuICBhbmFseXNpczogbnVsbCxcbiAgY3VzdG9taXphdGlvbnM6IG51bGwsXG4gIGN2OiBudWxsXG59O1xubGV0IGludGVyYWN0aXZlU3RhdGUgPSB7XG4gIGlzUmV2aWV3aW5nOiBmYWxzZSxcbiAgY3VycmVudEluZGV4OiAwLFxuICB0eXBlOiBudWxsLCAvLyAnZXhwZXJpZW5jZXMnIG9yICdza2lsbHMnXG4gIGRhdGE6IG51bGxcbn07XG5sZXQgc2Vzc2lvbklkID0gbnVsbDtcbmxldCBsYXN0S25vd25QaGFzZSA9IFBIQVNFUy5JTklUO1xubGV0IGlzUmVjb25uZWN0aW5nID0gZmFsc2U7XG5jb25zdCBfcGhhc2VDaGFuZ2VMaXN0ZW5lcnMgPSBbXTtcbi8vIEN1cnJlbnQgbW9kZWwvcHJvdmlkZXIgc2VsZWN0aW9uIChwZXJzaXN0ZWQgdG8gbG9jYWxTdG9yYWdlKVxubGV0IGN1cnJlbnRNb2RlbFByb3ZpZGVyID0gbnVsbDtcbmxldCBjdXJyZW50TW9kZWxOYW1lID0gbnVsbDtcblxuXG4vLyBTdGFnZWQgZ2VuZXJhdGlvbiBzdGF0ZSAoR0FQLTIwKTogdHJhY2tzIHByZXZpZXcgXHUyMTkyIGNvbmZpcm0gXHUyMTkyIGZpbmFsIHBpcGVsaW5lLlxuLy8gU3luY2VkIGZyb20gL2FwaS9jdi9nZW5lcmF0aW9uLXN0YXRlIG9uIHBhZ2UgbG9hZCBhbmQgYWZ0ZXIga2V5IHRyYW5zaXRpb25zLlxubGV0IGdlbmVyYXRpb25TdGF0ZSA9IGNyZWF0ZURlZmF1bHRHZW5lcmF0aW9uU3RhdGUoKTtcblxuLy8gQVRTIHNjb3JlIHN0YXRlIChHQVAtMjEpOiBjYWNoZWQgc2NvcmUgZnJvbSAvYXBpL2N2L2F0cy1zY29yZS5cbi8vIE51bGwgdW50aWwgZmlyc3Qgc2NvcmUgaXMgZmV0Y2hlZC5cbmxldCBhdHNTY29yZSA9IG51bGw7XG5cbi8vIEV4cG9ydCBzdGF0ZSBnZXR0ZXJzL3NldHRlcnNcbmNvbnN0IHN0YXRlTWFuYWdlciA9IHtcbiAgLy8gVGFiIHN0YXRlXG4gIGdldEN1cnJlbnRUYWI6ICgpID0+IGN1cnJlbnRUYWIsXG4gIHNldEN1cnJlbnRUYWI6ICh0YWIpID0+IHsgY3VycmVudFRhYiA9IHRhYjsgc2F2ZVN0YXRlVG9Mb2NhbFN0b3JhZ2UoKTsgfSxcbiAgZ2V0Q3VycmVudFN0YWdlOiAoKSA9PiBnZXRXb3JrZmxvd1N0ZXBGb3JQaGFzZShsYXN0S25vd25QaGFzZSksXG5cbiAgLy8gTG9hZGluZyBzdGF0ZVxuICBpc0xvYWRpbmc6ICgpID0+IGlzTG9hZGluZyxcbiAgc2V0TG9hZGluZzogKGxvYWRpbmcpID0+IHtcbiAgICBpc0xvYWRpbmcgPSBsb2FkaW5nO1xuICB9LFxuXG4gIC8vIFRhYiBkYXRhIChhbmFseXNpcywgY3VzdG9taXphdGlvbnMsIENWKVxuICBnZXRUYWJEYXRhOiAodGFiKSA9PiB0YWJEYXRhW3RhYl0sXG4gIGdldEFsbFRhYkRhdGE6ICgpID0+ICh7IC4uLnRhYkRhdGEgfSksXG4gIHNldFRhYkRhdGE6ICh0YWIsIGRhdGEpID0+IHsgdGFiRGF0YVt0YWJdID0gZGF0YTsgc2F2ZVN0YXRlVG9Mb2NhbFN0b3JhZ2UoKTsgfSxcblxuICAvLyBJbnRlcmFjdGl2ZSBzdGF0ZSAoZm9yIGV4cGVyaWVuY2Uvc2tpbGwgc2VsZWN0aW9uIHJldmlldylcbiAgZ2V0SW50ZXJhY3RpdmVTdGF0ZTogKCkgPT4gaW50ZXJhY3RpdmVTdGF0ZSxcbiAgc2V0SW50ZXJhY3RpdmVTdGF0ZTogKHN0YXRlKSA9PiB7IGludGVyYWN0aXZlU3RhdGUgPSB7IC4uLmludGVyYWN0aXZlU3RhdGUsIC4uLnN0YXRlIH07IHNhdmVTdGF0ZVRvTG9jYWxTdG9yYWdlKCk7IH0sXG5cbiAgLy8gUmVjb25uZWN0IHN0YXRlXG4gIGlzUmVjb25uZWN0aW5nOiAoKSA9PiBpc1JlY29ubmVjdGluZyxcbiAgc2V0SXNSZWNvbm5lY3Rpbmc6IChyZWNvbm5lY3RpbmcpID0+IHsgaXNSZWNvbm5lY3RpbmcgPSBCb29sZWFuKHJlY29ubmVjdGluZyk7IH0sXG5cbiAgLy8gU2Vzc2lvbiBtYW5hZ2VtZW50XG4gIGdldFNlc3Npb25JZDogKCkgPT4gc2Vzc2lvbklkLFxuICBzZXRTZXNzaW9uSWQ6IChpZCkgPT4geyBzZXNzaW9uSWQgPSBpZDsgbG9jYWxTdG9yYWdlLnNldEl0ZW0oU3RvcmFnZUtleXMuU0VTU0lPTl9JRCwgaWQpOyB9LFxuXG4gIC8vIE1vZGVsL3Byb3ZpZGVyIHNlbGVjdGlvblxuICBnZXRDdXJyZW50TW9kZWxQcm92aWRlcjogKCkgPT4gY3VycmVudE1vZGVsUHJvdmlkZXIsXG4gIGdldEN1cnJlbnRNb2RlbE5hbWU6ICgpID0+IGN1cnJlbnRNb2RlbE5hbWUsXG4gIHNldEN1cnJlbnRNb2RlbDogKHByb3ZpZGVyLCBtb2RlbCkgPT4geyBjdXJyZW50TW9kZWxQcm92aWRlciA9IHByb3ZpZGVyIHx8IG51bGw7IGN1cnJlbnRNb2RlbE5hbWUgPSBtb2RlbCB8fCBudWxsOyBzYXZlU3RhdGVUb0xvY2FsU3RvcmFnZSgpOyB9LFxuXG4gIC8vIFBoYXNlIHRyYWNraW5nXG4gIGdldFBoYXNlOiAoKSA9PiBsYXN0S25vd25QaGFzZSxcbiAgc2V0UGhhc2U6IChwaGFzZSkgPT4ge1xuICAgIGxhc3RLbm93blBoYXNlID0gcGhhc2U7XG4gICAgc2F2ZVN0YXRlVG9Mb2NhbFN0b3JhZ2UoKTtcbiAgICBfcGhhc2VDaGFuZ2VMaXN0ZW5lcnMuZm9yRWFjaChmbiA9PiB7IHRyeSB7IGZuKHBoYXNlKTsgfSBjYXRjaCAoZSkgeyAvKiBpZ25vcmUgKi8gfSB9KTtcbiAgfSxcbiAgb25QaGFzZUNoYW5nZTogKGZuKSA9PiB7IGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIF9waGFzZUNoYW5nZUxpc3RlbmVycy5wdXNoKGZuKTsgfSxcbiAgZ2V0V29ya2Zsb3dTdGVwOiAoKSA9PiBnZXRXb3JrZmxvd1N0ZXBGb3JQaGFzZShsYXN0S25vd25QaGFzZSksXG5cbiAgLy8gUG9zdC1hbmFseXNpcyBxdWVzdGlvbnNcbiAgZ2V0UG9zdEFuYWx5c2lzUXVlc3Rpb25zOiAoKSA9PiB3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zIHx8IFtdLFxuICBzZXRQb3N0QW5hbHlzaXNRdWVzdGlvbnM6IChxdWVzdGlvbnMpID0+IHsgd2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucyA9IHF1ZXN0aW9uczsgfSxcblxuICAvLyBRdWVzdGlvbiBhbnN3ZXJzXG4gIGdldFF1ZXN0aW9uQW5zd2VyczogKCkgPT4gd2luZG93LnF1ZXN0aW9uQW5zd2VycyB8fCB7fSxcbiAgc2V0UXVlc3Rpb25BbnN3ZXJzOiAoYW5zd2VycykgPT4geyB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzID0gYW5zd2VyczsgfSxcblxuICAvLyBQZW5kaW5nIHJlY29tbWVuZGF0aW9uc1xuICBnZXRQZW5kaW5nUmVjb21tZW5kYXRpb25zOiAoKSA9PiB3aW5kb3cucGVuZGluZ1JlY29tbWVuZGF0aW9ucyB8fCBudWxsLFxuICBzZXRQZW5kaW5nUmVjb21tZW5kYXRpb25zOiAocmVjKSA9PiB7IHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zID0gcmVjOyBzYXZlU3RhdGVUb0xvY2FsU3RvcmFnZSgpOyB9LFxuXG4gIC8vIEFUUyBzY29yZSBzdGF0ZSAoR0FQLTIxKVxuICBnZXRBdHNTY29yZTogKCkgPT4gYXRzU2NvcmUsXG4gIHNldEF0c1Njb3JlOiAoc2NvcmUpID0+IHsgYXRzU2NvcmUgPSBzY29yZTsgc2F2ZVN0YXRlVG9Mb2NhbFN0b3JhZ2UoKTsgfSxcbiAgY2xlYXJBdHNTY29yZTogKCkgPT4geyBhdHNTY29yZSA9IG51bGw7IHNhdmVTdGF0ZVRvTG9jYWxTdG9yYWdlKCk7IH0sXG5cbiAgLy8gU3RhZ2VkIGdlbmVyYXRpb24gc3RhdGUgKEdBUC0yMClcbiAgZ2V0R2VuZXJhdGlvblN0YXRlOiAoKSA9PiBnZW5lcmF0aW9uU3RhdGUsXG4gIGdldExheW91dEZyZXNobmVzczogKCkgPT4gZ2V0TGF5b3V0RnJlc2huZXNzRnJvbVN0YXRlKGdlbmVyYXRpb25TdGF0ZSksXG4gIHNldEdlbmVyYXRpb25TdGF0ZTogKHVwZGF0ZSkgPT4ge1xuICAgIGdlbmVyYXRpb25TdGF0ZSA9IHsgLi4uZ2VuZXJhdGlvblN0YXRlLCAuLi51cGRhdGUgfTtcbiAgICBzYXZlU3RhdGVUb0xvY2FsU3RvcmFnZSgpO1xuICAgIGVtaXRHZW5lcmF0aW9uU3RhdGVDaGFuZ2VkKCk7XG4gIH0sXG4gIG1hcmtDb250ZW50Q2hhbmdlZDogKCkgPT4ge1xuICAgIGdlbmVyYXRpb25TdGF0ZSA9IHtcbiAgICAgIC4uLmdlbmVyYXRpb25TdGF0ZSxcbiAgICAgIGNvbnRlbnRSZXZpc2lvbjogKG5vcm1hbGl6ZVJldmlzaW9uKGdlbmVyYXRpb25TdGF0ZS5jb250ZW50UmV2aXNpb24pID8/IDApICsgMSxcbiAgICB9O1xuICAgIHNhdmVTdGF0ZVRvTG9jYWxTdG9yYWdlKCk7XG4gICAgZW1pdEdlbmVyYXRpb25TdGF0ZUNoYW5nZWQoKTtcbiAgfSxcbiAgbWFya1ByZXZpZXdHZW5lcmF0ZWQ6ICh1cGRhdGUgPSB7fSkgPT4ge1xuICAgIGNvbnN0IGNvbnRlbnRSZXZpc2lvbiA9IG5vcm1hbGl6ZVJldmlzaW9uKGdlbmVyYXRpb25TdGF0ZS5jb250ZW50UmV2aXNpb24pID8/IDA7XG4gICAgZ2VuZXJhdGlvblN0YXRlID0ge1xuICAgICAgLi4uZ2VuZXJhdGlvblN0YXRlLFxuICAgICAgLi4udXBkYXRlLFxuICAgICAgcGhhc2U6IEdFTkVSQVRJT05fUEhBU0VTLkxBWU9VVF9SRVZJRVcsXG4gICAgICBwcmV2aWV3QXZhaWxhYmxlOiB0cnVlLFxuICAgICAgbGF5b3V0Q29uZmlybWVkOiBmYWxzZSxcbiAgICAgIGxhc3RQcmV2aWV3Q29udGVudFJldmlzaW9uOiBjb250ZW50UmV2aXNpb24sXG4gICAgfTtcbiAgICBzYXZlU3RhdGVUb0xvY2FsU3RvcmFnZSgpO1xuICAgIGVtaXRHZW5lcmF0aW9uU3RhdGVDaGFuZ2VkKCk7XG4gIH0sXG4gIG1hcmtMYXlvdXRDb25maXJtZWQ6ICh1cGRhdGUgPSB7fSkgPT4ge1xuICAgIGdlbmVyYXRpb25TdGF0ZSA9IHtcbiAgICAgIC4uLmdlbmVyYXRpb25TdGF0ZSxcbiAgICAgIC4uLnVwZGF0ZSxcbiAgICAgIHBoYXNlOiBHRU5FUkFUSU9OX1BIQVNFUy5DT05GSVJNRUQsXG4gICAgICBsYXlvdXRDb25maXJtZWQ6IHRydWUsXG4gICAgfTtcbiAgICBzYXZlU3RhdGVUb0xvY2FsU3RvcmFnZSgpO1xuICAgIGVtaXRHZW5lcmF0aW9uU3RhdGVDaGFuZ2VkKCk7XG4gIH0sXG4gIG1hcmtGaW5hbEdlbmVyYXRlZDogKGdlbmVyYXRlZEF0ID0gbnVsbCwgdXBkYXRlID0ge30pID0+IHtcbiAgICBjb25zdCBjb250ZW50UmV2aXNpb24gPSBub3JtYWxpemVSZXZpc2lvbihnZW5lcmF0aW9uU3RhdGUuY29udGVudFJldmlzaW9uKSA/PyAwO1xuICAgIGdlbmVyYXRpb25TdGF0ZSA9IHtcbiAgICAgIC4uLmdlbmVyYXRpb25TdGF0ZSxcbiAgICAgIC4uLnVwZGF0ZSxcbiAgICAgIHBoYXNlOiBHRU5FUkFUSU9OX1BIQVNFUy5GSU5BTF9DT01QTEVURSxcbiAgICAgIGxheW91dENvbmZpcm1lZDogdHJ1ZSxcbiAgICAgIGZpbmFsR2VuZXJhdGVkQXQ6IGdlbmVyYXRlZEF0IHx8IHVwZGF0ZS5maW5hbEdlbmVyYXRlZEF0IHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIGxhc3RGaW5hbENvbnRlbnRSZXZpc2lvbjogY29udGVudFJldmlzaW9uLFxuICAgIH07XG4gICAgc2F2ZVN0YXRlVG9Mb2NhbFN0b3JhZ2UoKTtcbiAgICBlbWl0R2VuZXJhdGlvblN0YXRlQ2hhbmdlZCgpO1xuICB9LFxuICByZXNldEdlbmVyYXRpb25TdGF0ZTogKCkgPT4ge1xuICAgIGdlbmVyYXRpb25TdGF0ZSA9IGNyZWF0ZURlZmF1bHRHZW5lcmF0aW9uU3RhdGUoKTtcbiAgICBzYXZlU3RhdGVUb0xvY2FsU3RvcmFnZSgpO1xuICAgIGVtaXRHZW5lcmF0aW9uU3RhdGVDaGFuZ2VkKCk7XG4gIH0sXG4gIHNldERpcnR5UGhhc2VzOiAocGhhc2VzLCBlYXJsaWVzdFN0ZXApID0+IHtcbiAgICBnZW5lcmF0aW9uU3RhdGUgPSB7XG4gICAgICAuLi5nZW5lcmF0aW9uU3RhdGUsXG4gICAgICBkaXJ0eVBoYXNlczogICAgICAgQXJyYXkuaXNBcnJheShwaGFzZXMpID8gcGhhc2VzIDogW10sXG4gICAgICBlYXJsaWVzdERpcnR5U3RlcDogZWFybGllc3RTdGVwIHx8IG51bGwsXG4gICAgfTtcbiAgICBzYXZlU3RhdGVUb0xvY2FsU3RvcmFnZSgpO1xuICAgIGVtaXRHZW5lcmF0aW9uU3RhdGVDaGFuZ2VkKCk7XG4gIH0sXG4gIGNsZWFyRGlydHlQaGFzZXM6ICgpID0+IHtcbiAgICBnZW5lcmF0aW9uU3RhdGUgPSB7XG4gICAgICAuLi5nZW5lcmF0aW9uU3RhdGUsXG4gICAgICBkaXJ0eVBoYXNlczogICAgICAgW10sXG4gICAgICBlYXJsaWVzdERpcnR5U3RlcDogbnVsbCxcbiAgICB9O1xuICAgIHNhdmVTdGF0ZVRvTG9jYWxTdG9yYWdlKCk7XG4gICAgZW1pdEdlbmVyYXRpb25TdGF0ZUNoYW5nZWQoKTtcbiAgfSxcbiAgZ2V0RGlydHlQaGFzZXM6ICAgICAgICgpID0+IGdlbmVyYXRpb25TdGF0ZS5kaXJ0eVBoYXNlcyB8fCBbXSxcbiAgZ2V0RWFybGllc3REaXJ0eVN0ZXA6ICgpID0+IGdlbmVyYXRpb25TdGF0ZS5lYXJsaWVzdERpcnR5U3RlcCB8fCBudWxsLFxufTtcblxuLyoqXG4gKiBJbml0aWFsaXplIGZyZXNoIHN0YXRlIG9iamVjdCB3aXRoIGFsbCBkZWZhdWx0IHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gaW5pdGlhbGl6ZVN0YXRlKCkge1xuICBjdXJyZW50VGFiID0gJ2pvYic7XG4gIGlzTG9hZGluZyA9IGZhbHNlO1xuICB0YWJEYXRhID0ge1xuICAgIGFuYWx5c2lzOiBudWxsLFxuICAgIGN1c3RvbWl6YXRpb25zOiBudWxsLFxuICAgIGN2OiBudWxsXG4gIH07XG4gIGludGVyYWN0aXZlU3RhdGUgPSB7XG4gICAgaXNSZXZpZXdpbmc6IGZhbHNlLFxuICAgIGN1cnJlbnRJbmRleDogMCxcbiAgICB0eXBlOiBudWxsLFxuICAgIGRhdGE6IG51bGxcbiAgfTtcbiAgd2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucyA9IFtdO1xuICB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzID0ge307XG4gIGxhc3RLbm93blBoYXNlID0gUEhBU0VTLklOSVQ7XG4gIGdlbmVyYXRpb25TdGF0ZSA9IGNyZWF0ZURlZmF1bHRHZW5lcmF0aW9uU3RhdGUoKTtcblxuICAvLyBHZXQgb3IgZ2VuZXJhdGUgc2Vzc2lvbiBJRFxuICBsZXQgc3RvcmVkSWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShTdG9yYWdlS2V5cy5TRVNTSU9OX0lEKTtcbiAgaWYgKCFzdG9yZWRJZCkge1xuICAgIHN0b3JlZElkID0gZ2VuZXJhdGVTZXNzaW9uSWQoKTtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShTdG9yYWdlS2V5cy5TRVNTSU9OX0lELCBzdG9yZWRJZCk7XG4gIH1cbiAgc2Vzc2lvbklkID0gc3RvcmVkSWQ7XG5cbiAgc2F2ZVN0YXRlVG9Mb2NhbFN0b3JhZ2UoKTtcbiAgZW1pdEdlbmVyYXRpb25TdGF0ZUNoYW5nZWQoKTtcbn1cblxuLyoqXG4gKiBMb2FkIHN0YXRlIGZyb20gYnJvd3NlciBsb2NhbFN0b3JhZ2UuXG4gKi9cbmZ1bmN0aW9uIGxvYWRTdGF0ZUZyb21Mb2NhbFN0b3JhZ2UoKSB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2F2ZWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShTdG9yYWdlS2V5cy5UQUJfREFUQSk7XG4gICAgaWYgKCFzYXZlZCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2Uoc2F2ZWQpO1xuXG4gICAgLy8gT25seSByZXN0b3JlIGlmIGRhdGEgaXMgcmVjZW50ICh3aXRoaW4gMjQgaG91cnMpXG4gICAgY29uc3QgYWdlID0gRGF0ZS5ub3coKSAtIChkYXRhLnRpbWVzdGFtcCB8fCAwKTtcbiAgICBpZiAoYWdlID4gMjQgKiA2MCAqIDYwICogMTAwMCkge1xuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oU3RvcmFnZUtleXMuVEFCX0RBVEEpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFJlc3RvcmUgdGFiIGRhdGFcbiAgICBpZiAoZGF0YS50YWJEYXRhKSB7XG4gICAgICB0YWJEYXRhID0geyAuLi50YWJEYXRhLCAuLi5kYXRhLnRhYkRhdGEgfTtcbiAgICB9XG5cbiAgICBpZiAoZGF0YS5jdXJyZW50VGFiKSB7XG4gICAgICBjdXJyZW50VGFiID0gZGF0YS5jdXJyZW50VGFiO1xuICAgIH1cblxuICAgIC8vIFJlc3RvcmUgaW50ZXJhY3RpdmUgc3RhdGVcbiAgICBpZiAoZGF0YS5pbnRlcmFjdGl2ZVN0YXRlKSB7XG4gICAgICBpbnRlcmFjdGl2ZVN0YXRlID0geyAuLi5pbnRlcmFjdGl2ZVN0YXRlLCAuLi5kYXRhLmludGVyYWN0aXZlU3RhdGUgfTtcbiAgICB9XG5cbiAgICAvLyBSZXN0b3JlIHBlbmRpbmcgcmVjb21tZW5kYXRpb25zXG4gICAgaWYgKGRhdGEucGVuZGluZ1JlY29tbWVuZGF0aW9ucykge1xuICAgICAgd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnMgPSBkYXRhLnBlbmRpbmdSZWNvbW1lbmRhdGlvbnM7XG4gICAgfVxuXG4gICAgLy8gUmVzdG9yZSBzYXZlZCBtb2RlbC9wcm92aWRlciBzZWxlY3Rpb25cbiAgICBpZiAoZGF0YS5jdXJyZW50TW9kZWxQcm92aWRlcikge1xuICAgICAgY3VycmVudE1vZGVsUHJvdmlkZXIgPSBkYXRhLmN1cnJlbnRNb2RlbFByb3ZpZGVyO1xuICAgIH1cbiAgICBpZiAoZGF0YS5jdXJyZW50TW9kZWxOYW1lKSB7XG4gICAgICBjdXJyZW50TW9kZWxOYW1lID0gZGF0YS5jdXJyZW50TW9kZWxOYW1lO1xuICAgIH1cblxuICAgIC8vIFJlc3RvcmUgcG9zdC1hbmFseXNpcyBzdGF0ZVxuICAgIGlmIChkYXRhLnBvc3RBbmFseXNpc1F1ZXN0aW9ucykge1xuICAgICAgd2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucyA9IGRhdGEucG9zdEFuYWx5c2lzUXVlc3Rpb25zO1xuICAgIH1cbiAgICBpZiAoZGF0YS5xdWVzdGlvbkFuc3dlcnMpIHtcbiAgICAgIHdpbmRvdy5xdWVzdGlvbkFuc3dlcnMgPSBkYXRhLnF1ZXN0aW9uQW5zd2VycztcbiAgICB9XG5cbiAgICAvLyBSZXN0b3JlIHBoYXNlXG4gICAgaWYgKGRhdGEubGFzdEtub3duUGhhc2UpIHtcbiAgICAgIGxhc3RLbm93blBoYXNlID0gZGF0YS5sYXN0S25vd25QaGFzZTtcbiAgICB9XG5cbiAgICAvLyBSZXN0b3JlIHN0YWdlZCBnZW5lcmF0aW9uIHN0YXRlXG4gICAgaWYgKGRhdGEuZ2VuZXJhdGlvblN0YXRlKSB7XG4gICAgICBnZW5lcmF0aW9uU3RhdGUgPSB7IC4uLmdlbmVyYXRpb25TdGF0ZSwgLi4uZGF0YS5nZW5lcmF0aW9uU3RhdGUgfTtcbiAgICB9XG5cbiAgICAvLyBSZXN0b3JlIEFUUyBzY29yZVxuICAgIGlmIChkYXRhLmF0c1Njb3JlKSB7XG4gICAgICBhdHNTY29yZSA9IGRhdGEuYXRzU2NvcmU7XG4gICAgfVxuXG4gICAgZW1pdEdlbmVyYXRpb25TdGF0ZUNoYW5nZWQoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cud2FybignRmFpbGVkIHRvIGxvYWQgc3RhdGUgZnJvbSBsb2NhbFN0b3JhZ2U6JywgZXJyb3IpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFNhdmUgY3VycmVudCBzdGF0ZSB0byBicm93c2VyIGxvY2FsU3RvcmFnZS5cbiAqL1xuZnVuY3Rpb24gc2F2ZVN0YXRlVG9Mb2NhbFN0b3JhZ2UoKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgZGF0YVRvU2F2ZSA9IHtcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIHRhYkRhdGEsXG4gICAgICBpbnRlcmFjdGl2ZVN0YXRlLFxuICAgICAgcGVuZGluZ1JlY29tbWVuZGF0aW9uczogd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnMsXG4gICAgICBwb3N0QW5hbHlzaXNRdWVzdGlvbnM6IHdpbmRvdy5wb3N0QW5hbHlzaXNRdWVzdGlvbnMsXG4gICAgICBxdWVzdGlvbkFuc3dlcnM6IHdpbmRvdy5xdWVzdGlvbkFuc3dlcnMsXG4gICAgICBsYXN0S25vd25QaGFzZSxcbiAgICAgIGN1cnJlbnRUYWIsXG4gICAgICAvLyBQZXJzaXN0IGxhc3Qtc2VsZWN0ZWQgbW9kZWwvcHJvdmlkZXIgc28gVUkgc2VsZWN0aW9ucyBzdXJ2aXZlIHJlbG9hZHNcbiAgICAgIGN1cnJlbnRNb2RlbFByb3ZpZGVyLFxuICAgICAgY3VycmVudE1vZGVsTmFtZSxcbiAgICAgIGdlbmVyYXRpb25TdGF0ZSxcbiAgICAgIGF0c1Njb3JlLFxuICAgIH07XG5cbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShTdG9yYWdlS2V5cy5UQUJfREFUQSwgSlNPTi5zdHJpbmdpZnkoZGF0YVRvU2F2ZSkpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy53YXJuKCdGYWlsZWQgdG8gc2F2ZSBzdGF0ZSB0byBsb2NhbFN0b3JhZ2U6JywgZXJyb3IpO1xuICB9XG59XG5cbi8qKlxuICogQ2xlYXIgYWxsIHN0YXRlIChvbiBuZXcgc2Vzc2lvbiBvciByZXNldCBhY3Rpb24pLlxuICovXG5mdW5jdGlvbiBjbGVhclN0YXRlKCkge1xuICBpbml0aWFsaXplU3RhdGUoKTtcbiAgT2JqZWN0LnZhbHVlcyhTdG9yYWdlS2V5cykuZm9yRWFjaChrZXkgPT4gbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KSk7XG59XG5cbi8vIFRoZSBhdXRob3JpdGF0aXZlIHJlc3RvcmVTZXNzaW9uL3Jlc3RvcmVCYWNrZW5kU3RhdGUvbG9hZFNlc3Npb25GaWxlXG4vLyBpbXBsZW1lbnRhdGlvbnMgbGl2ZSBpbiBgd2ViL2FwcC5qc2AuIFJlbW92ZSBkdXBsaWNhdGUgaW1wbGVtZW50YXRpb25zXG4vLyBmcm9tIHRoaXMgbW9kdWxlIHRvIGF2b2lkIGNvbmZsaWN0aW5nIGJlaGF2aW9yIGFuZCBlbnN1cmUgYSBzaW5nbGVcbi8vIHJlc3RvcmUgcGF0aCBpcyB1c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbi5cblxuZXhwb3J0IHtcbiAgUEhBU0VTLFxuICBQSEFTRV9UT19TVEVQLFxuICBHRU5FUkFUSU9OX1BIQVNFUyxcbiAgR0VORVJBVElPTl9TVEFURV9FVkVOVCxcbiAgc3RhdGVNYW5hZ2VyLFxuICBnZXRXb3JrZmxvd1N0ZXBGb3JQaGFzZSxcbiAgaW5pdGlhbGl6ZVN0YXRlLCBsb2FkU3RhdGVGcm9tTG9jYWxTdG9yYWdlLCBzYXZlU3RhdGVUb0xvY2FsU3RvcmFnZSxcbiAgY2xlYXJTdGF0ZSxcbn07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9wcm92aWRlci1pbmZvLmpzIFx1MjAxNCBMTE0gcHJvdmlkZXIgZGlzcGxheSBtZXRhZGF0YSBjbGllbnQuXG4gKlxuICogUHJvdmlkZXIgZGF0YSBpcyBub3cgdGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggaW4gc2NyaXB0cy91dGlscy9wcm92aWRlcl9yZWdpc3RyeS5weVxuICogYW5kIHNlcnZlZCBieSBHRVQgL2FwaS9wcm92aWRlcnMuIFRoaXMgbW9kdWxlIGZldGNoZXMgYW5kIGNhY2hlcyB0aGF0IGRhdGEuXG4gKlxuICogQWxsIHByb3ZpZGVyIGRlc2NyaXB0aW9ucywgVVJMcywgYW5kIHRpZXIvcHJpdmFjeSBmbGFncyBzaG91bGQgYmUgZWRpdGVkIGluXG4gKiBwcm92aWRlcl9yZWdpc3RyeS5weSByYXRoZXIgdGhhbiBoZXJlLlxuICpcbiAqIFNlcnZlciBmaWVsZCBuYW1lcyAoc25ha2VfY2FzZSwgbWF0Y2hpbmcgUHl0aG9uKTpcbiAqICAgZnJlZV90aWVyICAgXHUyMDE0IHdoZXRoZXIgYSBuby1jb3N0IEFQSSBlbnRyeSB0aWVyIGlzIGF2YWlsYWJsZVxuICogICBjb25maWRlbnRpYWwgXHUyMDE0IHdoZXRoZXIgdGhlIHByb3ZpZGVyIGNvbW1pdHMgbm90IHRvIHRyYWluIG9uIEFQSSByZXF1ZXN0IGRhdGFcbiAqICAgbm90ZSAgICAgICAgXHUyMDE0IG9uZS1zZW50ZW5jZSBwbGFpbi10ZXh0IGRlc2NyaXB0aW9uXG4gKiAgIGhvbWVwYWdlICAgIFx1MjAxNCBwcm92aWRlciBsYW5kaW5nIHBhZ2UgVVJMIChudWxsIGlmIG5vdCBhcHBsaWNhYmxlKVxuICogICBwcmljaW5nX3VybCBcdTIwMTQgcHJpY2luZyAvIHBsYW5zIHBhZ2UgVVJMIChudWxsIGlmIG5vdCBhcHBsaWNhYmxlKVxuICogICBwcml2YWN5X3VybCBcdTIwMTQgcHJpdmFjeSBwb2xpY3kgb3IgZGF0YS11c2UgcG9saWN5IFVSTCAobnVsbCBpZiBub3QgYXBwbGljYWJsZSlcbiAqL1xuXG5pbXBvcnQgeyBlc2NhcGVIdG1sIH0gZnJvbSAnLi91dGlscy5qcyc7XG5cbi8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgb2JqZWN0PnxudWxsfSAqL1xubGV0IF9jYWNoZSA9IG51bGw7XG5cbi8qKlxuICogRmV0Y2ggcHJvdmlkZXIgZGlzcGxheSBtZXRhZGF0YSBmcm9tIHRoZSBzZXJ2ZXIgYW5kIGNhY2hlIGl0LlxuICogU2FmZSB0byBjYWxsIG11bHRpcGxlIHRpbWVzIFx1MjAxNCByZXR1cm5zIHRoZSBjYWNoZSBpZiBwb3B1bGF0ZWQsIHJldHJpZXMgaWZcbiAqIHRoZSBpbml0aWFsIGZldGNoIGZhaWxlZCAobm9uLWZhdGFsLCBwb3BvdmVycyB3aWxsIGp1c3Qgbm90IGFwcGVhcikuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBvYmplY3Q+fG51bGw+fVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFByb3ZpZGVySW5mbygpIHtcbiAgaWYgKF9jYWNoZSAhPT0gbnVsbCkgcmV0dXJuIF9jYWNoZTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2goJy9hcGkvcHJvdmlkZXJzJyk7XG4gICAgaWYgKHJlc3Aub2spIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwLmpzb24oKTtcbiAgICAgIF9jYWNoZSA9IGRhdGEucHJvdmlkZXJzIHx8IHt9O1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gTm9uLWZhdGFsOiBwb3BvdmVycyBzaW1wbHkgd29uJ3QgYXBwZWFyLlxuICB9XG4gIHJldHVybiBfY2FjaGU7XG59XG5cbi8qKlxuICogUmV0dXJuIGNhY2hlZCBkaXNwbGF5IGluZm8gZm9yIGEgcHJvdmlkZXIsIG9yIG51bGwgaWYgbm90IGxvYWRlZCAvIHVua25vd24uXG4gKiBDYWxsIGxvYWRQcm92aWRlckluZm8oKSBmaXJzdCAoZS5nLiBpbiBvcGVuTW9kZWxNb2RhbCkuXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvdmlkZXJcbiAqIEByZXR1cm5zIHtvYmplY3R8bnVsbH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFByb3ZpZGVySW5mbyhwcm92aWRlcikge1xuICByZXR1cm4gX2NhY2hlID8gKF9jYWNoZVtwcm92aWRlcl0gfHwgbnVsbCkgOiBudWxsO1xufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBIVE1MIGNvbnRlbnQgc3RyaW5nIGZvciBhIHByb3ZpZGVyIGluZm8gQm9vdHN0cmFwIDUgcG9wb3Zlci5cbiAqIFVzZXMgc25ha2VfY2FzZSBmaWVsZCBuYW1lcyBhcyByZXR1cm5lZCBieSBHRVQgL2FwaS9wcm92aWRlcnMuXG4gKiBAcGFyYW0ge29iamVjdH0gaW5mbyAtIFByb3ZpZGVyIGluZm8gZW50cnkgZnJvbSBnZXRQcm92aWRlckluZm8oKVxuICogQHJldHVybnMge3N0cmluZ30gSFRNTCBzdHJpbmcgKHNhZmUgdG8gcGFzcyB0byBCUzUgUG9wb3ZlciB3aXRoIHNhbml0aXplOmZhbHNlKVxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZXJJbmZvUG9wb3ZlckNvbnRlbnQoaW5mbykge1xuICBjb25zdCB0aWVySWNvbiAgPSBpbmZvLmZyZWVfdGllciAgICA/ICcmIzEwMDAzOyBGcmVlIHRpZXIgYXZhaWxhYmxlJyAgICA6ICcmIzEwMDA3OyBQYWlkIG9ubHkgKG5vIGZyZWUgQVBJIHRpZXIpJztcbiAgY29uc3QgcHJpdkljb24gID0gaW5mby5jb25maWRlbnRpYWwgPyAnJiMxMjgyNzQ7IERhdGEgY29uZmlkZW50aWFsJyAgICAgOiAnJiM5ODg4OyYjNjUwMzk7IERhdGEgbWF5IGJlIHJldmlld2VkL3JldGFpbmVkJztcbiAgY29uc3QgdGllckNvbG9yID0gaW5mby5mcmVlX3RpZXIgICAgPyAnIzA2NWY0NicgOiAnIzkyNDAwZSc7XG4gIGNvbnN0IHByaXZDb2xvciA9IGluZm8uY29uZmlkZW50aWFsID8gJyMxZTQwYWYnIDogJyM5MjQwMGUnO1xuXG4gIGNvbnN0IGxpbmtzID0gW1xuICAgIGluZm8uaG9tZXBhZ2UgICAgPyBgPGEgaHJlZj1cIiR7ZXNjYXBlSHRtbChpbmZvLmhvbWVwYWdlKX1cIiAgICB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCI+SG9tZXBhZ2U8L2E+YCAgICAgICAgICAgOiAnJyxcbiAgICBpbmZvLnByaWNpbmdfdXJsID8gYDxhIGhyZWY9XCIke2VzY2FwZUh0bWwoaW5mby5wcmljaW5nX3VybCl9XCIgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiPlByaWNpbmcgJmFtcDsgcGxhbnM8L2E+YCA6ICcnLFxuICAgIGluZm8ucHJpdmFjeV91cmwgPyBgPGEgaHJlZj1cIiR7ZXNjYXBlSHRtbChpbmZvLnByaXZhY3lfdXJsKX1cIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCI+UHJpdmFjeSBwb2xpY3k8L2E+YCAgICAgIDogJycsXG4gIF0uZmlsdGVyKEJvb2xlYW4pO1xuXG4gIHJldHVybiAnPGRpdiBzdHlsZT1cIm1pbi13aWR0aDoyMjBweDttYXgtd2lkdGg6MzAwcHg7Zm9udC1zaXplOjAuODJlbTtsaW5lLWhlaWdodDoxLjU7XCI+J1xuICAgICsgYDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjZweDtcIj48c3BhbiBzdHlsZT1cImNvbG9yOiR7dGllckNvbG9yfTtcIj4ke3RpZXJJY29ufTwvc3Bhbj48L2Rpdj5gXG4gICAgKyBgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206OHB4O1wiPjxzcGFuIHN0eWxlPVwiY29sb3I6JHtwcml2Q29sb3J9O1wiPiR7cHJpdkljb259PC9zcGFuPjwvZGl2PmBcbiAgICArIGA8cCBzdHlsZT1cIm1hcmdpbjowIDAgOHB4O2NvbG9yOiMzNzQxNTE7XCI+JHtlc2NhcGVIdG1sKGluZm8ubm90ZSl9PC9wPmBcbiAgICArIChsaW5rcy5sZW5ndGggPyAnPHVsIHN0eWxlPVwibWFyZ2luOjA7cGFkZGluZy1sZWZ0OjE2cHg7XCI+JyArIGxpbmtzLm1hcChsID0+IGA8bGk+JHtsfTwvbGk+YCkuam9pbignJykgKyAnPC91bD4nIDogJycpXG4gICAgKyAnPC9kaXY+Jztcbn1cbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogdWktY29yZS5qc1xuICogQ29yZSBVSSByb3V0aW5nLCB0YWIgbWFuYWdlbWVudCwgbW9kYWwgbWFuYWdlbWVudCwgYW5kIHBhZ2UgaW5pdGlhbGl6YXRpb24uXG4gKiBFbnRyeSBwb2ludCBmb3IgdGhlIGFwcGxpY2F0aW9uIC0gbG9hZHMgb24gRE9NQ29udGVudExvYWRlZC5cbiAqL1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5jb25zdCBsb2cgPSBnZXRMb2dnZXIoJ3VpLWNvcmUnKTtcblxuaW1wb3J0IHsgZXNjYXBlSHRtbCB9IGZyb20gJy4vdXRpbHMuanMnO1xuaW1wb3J0IHsgU3RvcmFnZUtleXMsIGFwaUNhbGwsIGZldGNoU3RhdHVzLCBmZXRjaFNldHRpbmdzLCB1cGRhdGVTZXR0aW5ncyB9IGZyb20gJy4vYXBpLWNsaWVudC5qcyc7XG5pbXBvcnQge1xuICBnZXRXb3JrZmxvd1N0ZXBGb3JQaGFzZSxcbiAgaW5pdGlhbGl6ZVN0YXRlLFxuICBsb2FkU3RhdGVGcm9tTG9jYWxTdG9yYWdlLFxuICBzdGF0ZU1hbmFnZXIsXG59IGZyb20gJy4vc3RhdGUtbWFuYWdlci5qcyc7XG5pbXBvcnQgeyBfU1RFUF9ESVNQTEFZIH0gZnJvbSAnLi93b3JrZmxvdy1zdGVwcy5qcyc7XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuLy8gQWNjZXNzaWJpbGl0eTogRm9jdXMgTWFuYWdlbWVudCBmb3IgTW9kYWxzXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLyoqIFN0YWNrIG9mIGVsZW1lbnRzIHRoYXQgb3BlbmVkIGVhY2ggbW9kYWwgKHN1cHBvcnRzIG5lc3RlZCBtb2RhbHMpLiAqL1xuY29uc3QgX2ZvY3VzU3RhY2sgPSBbXTtcblxuLyoqIFN0YWNrIG9mIGZvY3VzLXRyYXAgbGlzdGVuZXJzIChvbmUgcGVyIG9wZW4gbW9kYWwpLiAqL1xuY29uc3QgX2ZvY3VzVHJhcFN0YWNrID0gW107XG5sZXQgX3NldHRpbmdzRGF0YSA9IG51bGw7XG5jb25zdCBSRVRSWV9QT0xJQ1lfU1RPUkFHRV9LRVkgPSAnY3YtYnVpbGRlci1yZXRyeS1wb2xpY3knO1xuXG5mdW5jdGlvbiBfZ2V0UmV0cnlQb2xpY3lGcm9tU3RvcmFnZSgpIHtcbiAgY29uc3QgZGVmYXVsdHMgPSB7XG4gICAgYmFzZU1zOiAxNTAwLFxuICAgIGNhcE1zOiA2MDAwMCxcbiAgICBtYXhBdHRlbXB0czogNixcbiAgICBhdXRvUmV0cnk6IHRydWUsXG4gIH07XG4gIHRyeSB7XG4gICAgY29uc3QgcmF3ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oUkVUUllfUE9MSUNZX1NUT1JBR0VfS0VZKTtcbiAgICBpZiAoIXJhdykgcmV0dXJuIGRlZmF1bHRzO1xuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UocmF3KTtcbiAgICByZXR1cm4ge1xuICAgICAgYmFzZU1zOiBNYXRoLm1heCgyMDAsIE51bWJlcihwYXJzZWQuYmFzZU1zIHx8IGRlZmF1bHRzLmJhc2VNcykpLFxuICAgICAgY2FwTXM6IE1hdGgubWF4KDEwMDAsIE51bWJlcihwYXJzZWQuY2FwTXMgfHwgZGVmYXVsdHMuY2FwTXMpKSxcbiAgICAgIG1heEF0dGVtcHRzOiBNYXRoLm1heCgxLCBOdW1iZXIocGFyc2VkLm1heEF0dGVtcHRzIHx8IGRlZmF1bHRzLm1heEF0dGVtcHRzKSksXG4gICAgICBhdXRvUmV0cnk6IHBhcnNlZC5hdXRvUmV0cnkgIT09IGZhbHNlLFxuICAgIH07XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBkZWZhdWx0cztcbiAgfVxufVxuXG5mdW5jdGlvbiBfc2F2ZVJldHJ5UG9saWN5VG9TdG9yYWdlKHBvbGljeSkge1xuICB0cnkge1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFJFVFJZX1BPTElDWV9TVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkocG9saWN5KSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nLndhcm4oJ0NvdWxkIG5vdCBzYXZlIHJldHJ5IHBvbGljeSBwcmVmZXJlbmNlOicsIGVycm9yKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfc2V0dGluZ3NTb3VyY2VMYWJlbChtZXRhLCBrZXksIHJ1bnRpbWVPdmVycmlkZXMgPSBudWxsKSB7XG4gIGlmIChydW50aW1lT3ZlcnJpZGVzICYmIGtleSBpbiBydW50aW1lT3ZlcnJpZGVzKSB7XG4gICAgcmV0dXJuICdTb3VyY2U6IHJ1bnRpbWUgc2VsZWN0aW9uJztcbiAgfVxuICBjb25zdCBzb3VyY2UgPSBtZXRhPy5zb3VyY2VzPy5ba2V5XSB8fCAnZGVmYXVsdCc7XG4gIGNvbnN0IGVudktleSA9IG1ldGE/LmVudl9rZXlzPy5ba2V5XSB8fCBudWxsO1xuICBpZiAoc291cmNlID09PSAnZW52JykgcmV0dXJuIGBTb3VyY2U6IGVudmlyb25tZW50IHZhcmlhYmxlICgke2VudktleSB8fCAnbG9ja2VkJ30pYDtcbiAgaWYgKHNvdXJjZSA9PT0gJ2RvdGVudicpIHJldHVybiBgU291cmNlOiAuZW52ICgke2VudktleSB8fCAnbG9ja2VkJ30pYDtcbiAgaWYgKHNvdXJjZSA9PT0gJ2NvbmZpZycpIHJldHVybiAnU291cmNlOiBjb25maWcueWFtbCc7XG4gIHJldHVybiAnU291cmNlOiBidWlsdC1pbiBkZWZhdWx0Jztcbn1cblxuZnVuY3Rpb24gX3JlbmRlclNldHRpbmdzU291cmNlcyhtZXRhLCBydW50aW1lT3ZlcnJpZGVzID0gbnVsbCkge1xuICBjb25zdCBzb3VyY2VUYXJnZXRzID0gW1xuICAgICdsbG0uZGVmYXVsdF9wcm92aWRlcicsXG4gICAgJ2xsbS5kZWZhdWx0X21vZGVsJyxcbiAgICAnbGxtLnJlcXVlc3RfdGltZW91dF9zZWNvbmRzJyxcbiAgICAnbGxtLnRlbXBlcmF0dXJlJyxcbiAgICAnZ2VuZXJhdGlvbi5tYXhfc2tpbGxzJyxcbiAgICAnZ2VuZXJhdGlvbi5tYXhfYWNoaWV2ZW1lbnRzJyxcbiAgICAnZ2VuZXJhdGlvbi5tYXhfcHVibGljYXRpb25zJyxcbiAgICAnZ2VuZXJhdGlvbi5za2lsbHNfc2VjdGlvbl90aXRsZScsXG4gICAgJ2dlbmVyYXRpb24uZm9ybWF0cy5hdHNfZG9jeCcsXG4gICAgJ2dlbmVyYXRpb24uZm9ybWF0cy5odW1hbl9wZGYnLFxuICAgICdnZW5lcmF0aW9uLmZvcm1hdHMuaHVtYW5fZG9jeCcsXG4gIF07XG4gIHNvdXJjZVRhcmdldHMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc291cmNlLSR7a2V5fWApO1xuICAgIGlmICghZWwpIHJldHVybjtcbiAgICBlbC50ZXh0Q29udGVudCA9IF9zZXR0aW5nc1NvdXJjZUxhYmVsKG1ldGEsIGtleSwgcnVudGltZU92ZXJyaWRlcyk7XG4gICAgY29uc3QgcnVudGltZUtleSA9IHJ1bnRpbWVPdmVycmlkZXMgJiYga2V5IGluIHJ1bnRpbWVPdmVycmlkZXM7XG4gICAgY29uc3QgaXNMb2NrZWQgPSBCb29sZWFuKG1ldGE/LmxvY2tlZD8uW2tleV0pO1xuICAgIGVsLnN0eWxlLmNvbG9yID0gcnVudGltZUtleSA/ICcjMWU0MGFmJyA6IChpc0xvY2tlZCA/ICcjYjQ1MzA5JyA6ICcjNjQ3NDhiJyk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBfc2V0U2V0dGluZ3NTdGF0dXMobWVzc2FnZSwga2luZCA9ICdpbmZvJykge1xuICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR0aW5ncy1zdGF0dXMtbXNnJyk7XG4gIGlmICghZWwpIHJldHVybjtcbiAgZWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuICBpZiAoa2luZCA9PT0gJ3N1Y2Nlc3MnKSB7XG4gICAgZWwuc3R5bGUuYmFja2dyb3VuZCA9ICcjZWNmZGY1JztcbiAgICBlbC5zdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkICM4NmVmYWMnO1xuICAgIGVsLnN0eWxlLmNvbG9yID0gJyMxNjY1MzQnO1xuICB9IGVsc2UgaWYgKGtpbmQgPT09ICdlcnJvcicpIHtcbiAgICBlbC5zdHlsZS5iYWNrZ3JvdW5kID0gJyNmZWYyZjInO1xuICAgIGVsLnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgI2ZlY2FjYSc7XG4gICAgZWwuc3R5bGUuY29sb3IgPSAnIzk5MWIxYic7XG4gIH0gZWxzZSB7XG4gICAgZWwuc3R5bGUuYmFja2dyb3VuZCA9ICcjZWZmNmZmJztcbiAgICBlbC5zdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkICNiZmRiZmUnO1xuICAgIGVsLnN0eWxlLmNvbG9yID0gJyMxZTQwYWYnO1xuICB9XG4gIGVsLnRleHRDb250ZW50ID0gbWVzc2FnZTtcbn1cblxuZnVuY3Rpb24gX2NvbGxlY3RTZXR0aW5nc1BheWxvYWRGcm9tRm9ybSgpIHtcbiAgcmV0dXJuIHtcbiAgICBsbG06IHtcbiAgICAgIGRlZmF1bHRfcHJvdmlkZXI6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR0aW5ncy1sbG0tZGVmYXVsdC1wcm92aWRlcicpPy52YWx1ZT8udHJpbSgpIHx8IG51bGwsXG4gICAgICBkZWZhdWx0X21vZGVsOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dGluZ3MtbGxtLWRlZmF1bHQtbW9kZWwnKT8udmFsdWU/LnRyaW0oKSB8fCBudWxsLFxuICAgICAgcmVxdWVzdF90aW1lb3V0X3NlY29uZHM6IE51bWJlcihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dGluZ3MtbGxtLXJlcXVlc3QtdGltZW91dCcpPy52YWx1ZSB8fCAxMjApLFxuICAgICAgdGVtcGVyYXR1cmU6IE51bWJlcihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dGluZ3MtbGxtLXRlbXBlcmF0dXJlJyk/LnZhbHVlIHx8IDAuNyksXG4gICAgfSxcbiAgICBnZW5lcmF0aW9uOiB7XG4gICAgICBtYXhfc2tpbGxzOiBOdW1iZXIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHRpbmdzLWdlbi1tYXgtc2tpbGxzJyk/LnZhbHVlIHx8IDIwKSxcbiAgICAgIG1heF9hY2hpZXZlbWVudHM6IE51bWJlcihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dGluZ3MtZ2VuLW1heC1hY2hpZXZlbWVudHMnKT8udmFsdWUgfHwgNSksXG4gICAgICBtYXhfcHVibGljYXRpb25zOiBOdW1iZXIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHRpbmdzLWdlbi1tYXgtcHVibGljYXRpb25zJyk/LnZhbHVlIHx8IDEwKSxcbiAgICAgIHNraWxsc19zZWN0aW9uX3RpdGxlOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dGluZ3MtZ2VuLXNraWxscy10aXRsZScpPy52YWx1ZT8udHJpbSgpIHx8ICdTa2lsbHMnLFxuICAgICAgZm9ybWF0czoge1xuICAgICAgICBhdHNfZG9jeDogQm9vbGVhbihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dGluZ3MtZm9ybWF0LWF0cy1kb2N4Jyk/LmNoZWNrZWQpLFxuICAgICAgICBodW1hbl9wZGY6IEJvb2xlYW4oZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHRpbmdzLWZvcm1hdC1odW1hbi1wZGYnKT8uY2hlY2tlZCksXG4gICAgICAgIGh1bWFuX2RvY3g6IEJvb2xlYW4oZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHRpbmdzLWZvcm1hdC1odW1hbi1kb2N4Jyk/LmNoZWNrZWQpLFxuICAgICAgfSxcbiAgICAgIGFpX2F0dHJpYnV0aW9uOiBCb29sZWFuKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR0aW5ncy1nZW4tYWktYXR0cmlidXRpb24nKT8uY2hlY2tlZCksXG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gX2NvbGxlY3RSZXRyeVBvbGljeUZyb21Gb3JtKCkge1xuICByZXR1cm4ge1xuICAgIGJhc2VNczogTnVtYmVyKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR0aW5ncy1yZXRyeS1iYXNlLW1zJyk/LnZhbHVlIHx8IDE1MDApLFxuICAgIGNhcE1zOiBOdW1iZXIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHRpbmdzLXJldHJ5LWNhcC1tcycpPy52YWx1ZSB8fCA2MDAwMCksXG4gICAgbWF4QXR0ZW1wdHM6IE51bWJlcihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dGluZ3MtcmV0cnktbWF4LWF0dGVtcHRzJyk/LnZhbHVlIHx8IDYpLFxuICAgIGF1dG9SZXRyeTogQm9vbGVhbihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dGluZ3MtcmV0cnktYXV0bycpPy5jaGVja2VkKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gX3JlbmRlclNldHRpbmdzVG9Gb3JtKHBheWxvYWQpIHtcbiAgY29uc3Qgc2V0dGluZ3MgPSBwYXlsb2FkPy5zZXR0aW5ncyB8fCB7fTtcbiAgY29uc3QgbGxtID0gc2V0dGluZ3MubGxtIHx8IHt9O1xuICBjb25zdCBnZW5lcmF0aW9uID0gc2V0dGluZ3MuZ2VuZXJhdGlvbiB8fCB7fTtcbiAgY29uc3QgZm9ybWF0cyA9IGdlbmVyYXRpb24uZm9ybWF0cyB8fCB7fTtcbiAgY29uc3QgcnVudGltZVByb3ZpZGVyID0gcGF5bG9hZD8ucnVudGltZT8ubGxtPy5wcm92aWRlciB8fCBudWxsO1xuICBjb25zdCBydW50aW1lTW9kZWwgPSBwYXlsb2FkPy5ydW50aW1lPy5sbG0/Lm1vZGVsIHx8IG51bGw7XG4gIGNvbnN0IHJ1bnRpbWVPdmVycmlkZXMgPSB7fTtcbiAgaWYgKHJ1bnRpbWVQcm92aWRlcikgcnVudGltZU92ZXJyaWRlc1snbGxtLmRlZmF1bHRfcHJvdmlkZXInXSA9IHJ1bnRpbWVQcm92aWRlcjtcbiAgaWYgKHJ1bnRpbWVNb2RlbCkgcnVudGltZU92ZXJyaWRlc1snbGxtLmRlZmF1bHRfbW9kZWwnXSA9IHJ1bnRpbWVNb2RlbDtcblxuICBjb25zdCBzZXRWYWx1ZSA9IChpZCwgdmFsdWUpID0+IHtcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICBpZiAoZWwpIGVsLnZhbHVlID0gdmFsdWUgPz8gJyc7XG4gIH07XG4gIGNvbnN0IHNldENoZWNrZWQgPSAoaWQsIHZhbHVlKSA9PiB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgaWYgKGVsKSBlbC5jaGVja2VkID0gQm9vbGVhbih2YWx1ZSk7XG4gIH07XG5cbiAgc2V0VmFsdWUoJ3NldHRpbmdzLWxsbS1kZWZhdWx0LXByb3ZpZGVyJywgcnVudGltZVByb3ZpZGVyIHx8IGxsbS5kZWZhdWx0X3Byb3ZpZGVyIHx8ICcnKTtcbiAgc2V0VmFsdWUoJ3NldHRpbmdzLWxsbS1kZWZhdWx0LW1vZGVsJywgcnVudGltZU1vZGVsIHx8IGxsbS5kZWZhdWx0X21vZGVsIHx8ICcnKTtcbiAgc2V0VmFsdWUoJ3NldHRpbmdzLWxsbS1yZXF1ZXN0LXRpbWVvdXQnLCBsbG0ucmVxdWVzdF90aW1lb3V0X3NlY29uZHMgPz8gMTIwKTtcbiAgc2V0VmFsdWUoJ3NldHRpbmdzLWxsbS10ZW1wZXJhdHVyZScsIGxsbS50ZW1wZXJhdHVyZSA/PyAwLjcpO1xuXG4gIHNldFZhbHVlKCdzZXR0aW5ncy1nZW4tbWF4LXNraWxscycsIGdlbmVyYXRpb24ubWF4X3NraWxscyA/PyAyMCk7XG4gIHNldFZhbHVlKCdzZXR0aW5ncy1nZW4tbWF4LWFjaGlldmVtZW50cycsIGdlbmVyYXRpb24ubWF4X2FjaGlldmVtZW50cyA/PyA1KTtcbiAgc2V0VmFsdWUoJ3NldHRpbmdzLWdlbi1tYXgtcHVibGljYXRpb25zJywgZ2VuZXJhdGlvbi5tYXhfcHVibGljYXRpb25zID8/IDEwKTtcbiAgc2V0VmFsdWUoJ3NldHRpbmdzLWdlbi1za2lsbHMtdGl0bGUnLCBnZW5lcmF0aW9uLnNraWxsc19zZWN0aW9uX3RpdGxlIHx8ICdTa2lsbHMnKTtcblxuICBzZXRDaGVja2VkKCdzZXR0aW5ncy1mb3JtYXQtYXRzLWRvY3gnLCBmb3JtYXRzLmF0c19kb2N4KTtcbiAgc2V0Q2hlY2tlZCgnc2V0dGluZ3MtZm9ybWF0LWh1bWFuLXBkZicsIGZvcm1hdHMuaHVtYW5fcGRmKTtcbiAgc2V0Q2hlY2tlZCgnc2V0dGluZ3MtZm9ybWF0LWh1bWFuLWRvY3gnLCBmb3JtYXRzLmh1bWFuX2RvY3gpO1xuICBzZXRDaGVja2VkKCdzZXR0aW5ncy1nZW4tYWktYXR0cmlidXRpb24nLCBnZW5lcmF0aW9uLmFpX2F0dHJpYnV0aW9uKTtcblxuICBjb25zdCByZXRyeVBvbGljeSA9IF9nZXRSZXRyeVBvbGljeUZyb21TdG9yYWdlKCk7XG4gIHNldFZhbHVlKCdzZXR0aW5ncy1yZXRyeS1iYXNlLW1zJywgcmV0cnlQb2xpY3kuYmFzZU1zKTtcbiAgc2V0VmFsdWUoJ3NldHRpbmdzLXJldHJ5LWNhcC1tcycsIHJldHJ5UG9saWN5LmNhcE1zKTtcbiAgc2V0VmFsdWUoJ3NldHRpbmdzLXJldHJ5LW1heC1hdHRlbXB0cycsIHJldHJ5UG9saWN5Lm1heEF0dGVtcHRzKTtcbiAgc2V0Q2hlY2tlZCgnc2V0dGluZ3MtcmV0cnktYXV0bycsIHJldHJ5UG9saWN5LmF1dG9SZXRyeSk7XG5cbiAgX3JlbmRlclNldHRpbmdzU291cmNlcyhwYXlsb2FkLm1ldGEgfHwge30sIHJ1bnRpbWVPdmVycmlkZXMpO1xuXG4gIGNvbnN0IHBhdGhFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR0aW5ncy1jb25maWctcGF0aCcpO1xuICBpZiAocGF0aEVsKSB7XG4gICAgcGF0aEVsLnRleHRDb250ZW50ID0gcGF5bG9hZD8ubWV0YT8uY29uZmlnX3BhdGhcbiAgICAgID8gYENvbmZpZyBmaWxlOiAke3BheWxvYWQubWV0YS5jb25maWdfcGF0aH1gXG4gICAgICA6ICcnO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbG9hZFNldHRpbmdzTW9kYWwoKSB7XG4gIHRyeSB7XG4gICAgX3NldFNldHRpbmdzU3RhdHVzKCdMb2FkaW5nIHNldHRpbmdzLi4uJywgJ2luZm8nKTtcbiAgICBjb25zdCBbcmVzdWx0LCBzdGF0dXNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW2ZldGNoU2V0dGluZ3MoKSwgZmV0Y2hTdGF0dXMoKS5jYXRjaCgoKSA9PiBudWxsKV0pO1xuICAgIF9yZW5kZXJTZXR0aW5nc1RvRm9ybShyZXN1bHQpO1xuICAgIC8vIGFpX2F0dHJpYnV0aW9uIGlzIHBlci1zZXNzaW9uLCBub3QgaW4gY29uZmlnLnlhbWwgXHUyMDE0IHJlYWQgZnJvbSBzZXNzaW9uIHN0YXR1c1xuICAgIGNvbnN0IGF0dHJFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR0aW5ncy1nZW4tYWktYXR0cmlidXRpb24nKTtcbiAgICBpZiAoYXR0ckVsICYmIHN0YXR1cykgYXR0ckVsLmNoZWNrZWQgPSBCb29sZWFuKHN0YXR1cy5haV9hdHRyaWJ1dGlvbik7XG4gICAgX3NldFNldHRpbmdzU3RhdHVzKCdTZXR0aW5ncyBsb2FkZWQuJywgJ3N1Y2Nlc3MnKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBfc2V0U2V0dGluZ3NTdGF0dXMoYEZhaWxlZCB0byBsb2FkIHNldHRpbmdzOiAke2Vycm9yLm1lc3NhZ2UgfHwgZXJyb3J9YCwgJ2Vycm9yJyk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZVNldHRpbmdzTW9kYWwoKSB7XG4gIGNvbnN0IHNhdmVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dGluZ3Mtc2F2ZS1idG4nKTtcbiAgdHJ5IHtcbiAgICBpZiAoc2F2ZUJ0bikge1xuICAgICAgc2F2ZUJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICBzYXZlQnRuLnRleHRDb250ZW50ID0gJ1NhdmluZy4uLic7XG4gICAgfVxuICAgIF9zZXRTZXR0aW5nc1N0YXR1cygnU2F2aW5nIHNldHRpbmdzLi4uJywgJ2luZm8nKTtcbiAgICBjb25zdCBwYXlsb2FkID0gX2NvbGxlY3RTZXR0aW5nc1BheWxvYWRGcm9tRm9ybSgpO1xuICAgIGNvbnN0IGFpQXR0cmlidXRpb24gPSBCb29sZWFuKHBheWxvYWQuZ2VuZXJhdGlvbj8uYWlfYXR0cmlidXRpb24pO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHVwZGF0ZVNldHRpbmdzKHBheWxvYWQpO1xuICAgIF9zYXZlUmV0cnlQb2xpY3lUb1N0b3JhZ2UoX2NvbGxlY3RSZXRyeVBvbGljeUZyb21Gb3JtKCkpO1xuICAgIF9zZXR0aW5nc0RhdGEgPSByZXN1bHQ7XG4gICAgX3JlbmRlclNldHRpbmdzVG9Gb3JtKHJlc3VsdCk7XG4gICAgLy8gYWlfYXR0cmlidXRpb24gaXMgcGVyLXNlc3Npb24gc3RhdGUsIG5vdCBhIGNvbmZpZy55YW1sIGtleSBcdTIwMTQgc2F2ZSBpdCBzZXBhcmF0ZWx5XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGFwaUNhbGwoJ1BPU1QnLCAnL2FwaS9nZW5lcmF0aW9uLXNldHRpbmdzJywgeyBhaV9hdHRyaWJ1dGlvbjogYWlBdHRyaWJ1dGlvbiB9KTtcbiAgICB9IGNhdGNoIChfKSB7IC8qIG5vbi1mYXRhbCAqLyB9XG4gICAgX3NldFNldHRpbmdzU3RhdHVzKCdTZXR0aW5ncyBzYXZlZCBzdWNjZXNzZnVsbHkuJywgJ3N1Y2Nlc3MnKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBfc2V0U2V0dGluZ3NTdGF0dXMoYEZhaWxlZCB0byBzYXZlIHNldHRpbmdzOiAke2Vycm9yLm1lc3NhZ2UgfHwgZXJyb3J9YCwgJ2Vycm9yJyk7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKHNhdmVCdG4pIHtcbiAgICAgIHNhdmVCdG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIHNhdmVCdG4udGV4dENvbnRlbnQgPSAnU2F2ZSBTZXR0aW5ncyc7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG9wZW5TZXR0aW5nc01vZGFsKCkge1xuICBjb25zdCBvdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHRpbmdzLW1vZGFsLW92ZXJsYXknKTtcbiAgaWYgKCFvdmVybGF5KSByZXR1cm47XG4gIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgX2ZvY3VzU3RhY2sucHVzaChkb2N1bWVudC5hY3RpdmVFbGVtZW50KTtcbiAgc2V0SW5pdGlhbEZvY3VzKCdzZXR0aW5ncy1tb2RhbC1vdmVybGF5Jyk7XG4gIHRyYXBGb2N1cygnc2V0dGluZ3MtbW9kYWwtb3ZlcmxheScpO1xuICBhd2FpdCByZWxvYWRTZXR0aW5nc01vZGFsKCk7XG59XG5cbmZ1bmN0aW9uIGNsb3NlU2V0dGluZ3NNb2RhbCgpIHtcbiAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR0aW5ncy1tb2RhbC1vdmVybGF5Jyk7XG4gIGlmIChvdmVybGF5KSBvdmVybGF5LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHJlc3RvcmVGb2N1cygpO1xufVxuXG4vKipcbiAqIEdldCBhbGwgZm9jdXNhYmxlIGVsZW1lbnRzIHdpdGhpbiBhIGNvbnRhaW5lci5cbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGNvbnRhaW5lciAtIFRoZSBtb2RhbCBvciBjb250YWluZXIgZWxlbWVudFxuICogQHJldHVybnMge0hUTUxFbGVtZW50W119IEFycmF5IG9mIGZvY3VzYWJsZSBlbGVtZW50c1xuICovXG5mdW5jdGlvbiBnZXRGb2N1c2FibGVFbGVtZW50cyhjb250YWluZXIpIHtcbiAgY29uc3QgZm9jdXNhYmxlU2VsZWN0b3JzID0gW1xuICAgICdhW2hyZWZdJywgJ2J1dHRvbjpub3QoW2Rpc2FibGVkXSknLCAnaW5wdXQ6bm90KFtkaXNhYmxlZF0pJyxcbiAgICAndGV4dGFyZWE6bm90KFtkaXNhYmxlZF0pJywgJ3NlbGVjdDpub3QoW2Rpc2FibGVkXSknLFxuICAgICdbdGFiaW5kZXhdOm5vdChbdGFiaW5kZXg9XCItMVwiXSknLFxuICBdLmpvaW4oJywgJyk7XG4gIHJldHVybiBBcnJheS5mcm9tKGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKGZvY3VzYWJsZVNlbGVjdG9ycykpO1xufVxuXG4vKipcbiAqIFNldCBpbml0aWFsIGZvY3VzIHRvIHRoZSBmaXJzdCBmb2N1c2FibGUgZWxlbWVudCBpbiBhIG1vZGFsLlxuICogUHJpb3JpdGl6ZXMgZWxlbWVudHMgd2l0aCBpZD1cIlttb2RhbElkXS1mb2N1cy10YXJnZXRcIiBpZiBwcmVzZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGFsSWQgLSBJRCBvZiB0aGUgbW9kYWxcbiAqL1xuZnVuY3Rpb24gc2V0SW5pdGlhbEZvY3VzKG1vZGFsSWQpIHtcbiAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChtb2RhbElkKTtcbiAgaWYgKCFtb2RhbCkgcmV0dXJuO1xuXG4gIC8vIFRyeSB0byBmb2N1cyBhbiBleHBsaWNpdCB0YXJnZXQgKGUuZy4sIGlucHV0IGZpZWxkIHdpdGggY2xhc3MvaWQpXG4gIGNvbnN0IGZvY3VzVGFyZ2V0ID0gbW9kYWwucXVlcnlTZWxlY3RvcignW2RhdGEtZm9jdXMtdGFyZ2V0PVwidHJ1ZVwiXScpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgbW9kYWwucXVlcnlTZWxlY3RvcignaW5wdXRbdHlwZT1cInRleHRcIl0nKSB8fFxuICAgICAgICAgICAgICAgICAgICAgIG1vZGFsLnF1ZXJ5U2VsZWN0b3IoJ2J1dHRvbicpO1xuXG4gIGlmIChmb2N1c1RhcmdldCkge1xuICAgIC8vIFNtYWxsIGRlbGF5IHRvIGVuc3VyZSBtb2RhbCByZW5kZXIgKyBhY3R1YWwgZGlzcGxheVxuICAgIHNldFRpbWVvdXQoKCkgPT4gZm9jdXNUYXJnZXQuZm9jdXMoKSwgNTApO1xuICB9XG59XG5cbi8qKlxuICogVHJhcCBmb2N1cyB3aXRoaW4gYSBtb2RhbCB1c2luZyBUYWIvU2hpZnQrVGFiLlxuICogUHJldmVudHMgdXNlciB0YWJiaW5nIHRvIGVsZW1lbnRzIG91dHNpZGUgdGhlIG1vZGFsLlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGFsSWQgLSBJRCBvZiB0aGUgbW9kYWxcbiAqL1xuZnVuY3Rpb24gdHJhcEZvY3VzKG1vZGFsSWQpIHtcbiAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChtb2RhbElkKTtcbiAgaWYgKCFtb2RhbCkgcmV0dXJuO1xuXG4gIGNvbnN0IGZvY3VzYWJsZUVsZW1lbnRzID0gZ2V0Rm9jdXNhYmxlRWxlbWVudHMobW9kYWwpO1xuICBpZiAoZm9jdXNhYmxlRWxlbWVudHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgY29uc3QgZmlyc3RFbGVtZW50ID0gZm9jdXNhYmxlRWxlbWVudHNbMF07XG4gIGNvbnN0IGxhc3RFbGVtZW50ID0gZm9jdXNhYmxlRWxlbWVudHNbZm9jdXNhYmxlRWxlbWVudHMubGVuZ3RoIC0gMV07XG5cbiAgY29uc3QgbGlzdGVuZXIgPSAoZSkgPT4ge1xuICAgIGlmIChlLmtleSAhPT0gJ1RhYicpIHJldHVybjtcblxuICAgIGNvbnN0IGlzU2hpZnQgPSBlLnNoaWZ0S2V5O1xuICAgIGNvbnN0IGFjdGl2ZUVsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcblxuICAgIGlmIChpc1NoaWZ0KSB7XG4gICAgICBpZiAoYWN0aXZlRWwgPT09IGZpcnN0RWxlbWVudCkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGxhc3RFbGVtZW50LmZvY3VzKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChhY3RpdmVFbCA9PT0gbGFzdEVsZW1lbnQpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBmaXJzdEVsZW1lbnQuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGxpc3RlbmVyKTtcbiAgX2ZvY3VzVHJhcFN0YWNrLnB1c2gobGlzdGVuZXIpO1xufVxuXG4vKipcbiAqIFJlc3RvcmUgZm9jdXMgdG8gdGhlIGVsZW1lbnQgdGhhdCBvcGVuZWQgdGhlIG1vZGFsLlxuICovXG5mdW5jdGlvbiByZXN0b3JlRm9jdXMoKSB7XG4gIGNvbnN0IGVsID0gX2ZvY3VzU3RhY2sucG9wKCk7XG4gIGlmIChlbCAmJiB0eXBlb2YgZWwuZm9jdXMgPT09ICdmdW5jdGlvbicpIGVsLmZvY3VzKCk7XG5cbiAgY29uc3QgbGlzdGVuZXIgPSBfZm9jdXNUcmFwU3RhY2sucG9wKCk7XG4gIGlmIChsaXN0ZW5lcikgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGxpc3RlbmVyKTtcbn1cblxuZnVuY3Rpb24gcHVzaEZvY3VzU3RhY2soZWwpIHtcbiAgX2ZvY3VzU3RhY2sucHVzaChlbCB8fCBkb2N1bWVudC5hY3RpdmVFbGVtZW50KTtcbn1cblxuLyoqIE1hcHMgZWFjaCB3b3JrZmxvdyBzdGFnZSAodG9wIGJhcikgdG8gdGhlIHRhYnMgc2hvd24gaW4gdGhlIHNlY29uZCBuYXYgYmFyLiAqL1xuY29uc3QgU1RBR0VfVEFCUyA9IHtcbiAgam9iOiAgICAgICAgICAgIFsnam9iJywgJ21hc3RlciddLFxuICBhbmFseXNpczogICAgICAgWydhbmFseXNpcyddLFxuICBjdXN0b21pemF0aW9uczogWydnb2FscycsICdxdWVzdGlvbnMnLCAnZXhwLXJldmlldycsICdhY2gtZWRpdG9yJywgJ3NraWxscy1yZXZpZXcnLCAnYWNoaWV2ZW1lbnRzLXJldmlldycsICd0YWdsaW5lLXJldmlldycsICdzdW1tYXJ5LXJldmlldycsICdwdWJsaWNhdGlvbnMtcmV2aWV3JywgJ2F0cy1zY29yZSddLFxuICByZXdyaXRlOiAgICAgICAgWydyZXdyaXRlJ10sXG4gIHNwZWxsOiAgICAgICAgICBbJ3NwZWxsJ10sXG4gIGxheW91dDogICAgICAgICBbJ2xheW91dCddLFxuICBkb3dubG9hZDogICAgICAgWydmaW5hbF9nZW5lcmF0ZScsICdkb3dubG9hZCddLFxuICBjb3Zlcl9sZXR0ZXI6ICAgWydjb3Zlci1sZXR0ZXInXSxcbiAgc2NyZWVuaW5nOiAgICAgIFsnc2NyZWVuaW5nJ10sXG4gIGludGVydmlld19wcmVwOiBbJ2ludGVydmlldy1wcmVwJ10sXG4gIHRoYW5rX3lvdTogICAgICBbJ3RoYW5rLXlvdSddLFxuICBoYXJ2ZXN0OiAgICAgICAgWydoYXJ2ZXN0J10sXG59O1xuXG4vKipcbiAqIEN1c3RvbSBjb25maXJtIGRpYWxvZyBcdTIwMTQgcmV0dXJucyBhIFByb21pc2U8Ym9vbGVhbj4uXG4gKiBSZXBsYWNlcyBicm93c2VyIGNvbmZpcm0oKSB3aGljaCBjYW4gYmUgc2lsZW50bHkgc3VwcHJlc3NlZCBvbmNlIHRoZSB1c2VyXG4gKiBjaGVja3MgXCJQcmV2ZW50IHRoaXMgcGFnZSBmcm9tIGNyZWF0aW5nIGFkZGl0aW9uYWwgZGlhbG9nc1wiLlxuICpcbiAqIFVzYWdlOiAgaWYgKGF3YWl0IGNvbmZpcm1EaWFsb2coJ0FyZSB5b3Ugc3VyZT8nKSkgeyAuLi4gfVxuICovXG5mdW5jdGlvbiBjb25maXJtRGlhbG9nKG1lc3NhZ2UsIHsgY29uZmlybUxhYmVsID0gJ09LJywgY2FuY2VsTGFiZWwgPSAnQ2FuY2VsJywgZGFuZ2VyID0gZmFsc2UgfSA9IHt9KSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICBjb25zdCBwcmV2aW91c0ZvY3VzID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcblxuICAgIC8vIFJldXNlIG9yIGNyZWF0ZSB0aGUgc2hhcmVkIG92ZXJsYXkgZWxlbWVudFxuICAgIGxldCBvdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbmZpcm0tZGlhbG9nLW92ZXJsYXknKTtcbiAgICBpZiAoIW92ZXJsYXkpIHtcbiAgICAgIG92ZXJsYXkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIG92ZXJsYXkuaWQgPSAnY29uZmlybS1kaWFsb2ctb3ZlcmxheSc7XG4gICAgICBvdmVybGF5LnN0eWxlLmNzc1RleHQgPVxuICAgICAgICAnZGlzcGxheTpub25lOyBwb3NpdGlvbjpmaXhlZDsgaW5zZXQ6MDsgYmFja2dyb3VuZDpyZ2JhKDAsMCwwLDAuNDUpOyB6LWluZGV4Ojk5OTk7JyArXG4gICAgICAgICdhbGlnbi1pdGVtczpjZW50ZXI7IGp1c3RpZnktY29udGVudDpjZW50ZXI7JztcbiAgICAgIG92ZXJsYXkuaW5uZXJIVE1MID1cbiAgICAgICAgJzxkaXYgaWQ9XCJjb25maXJtLWRpYWxvZy1ib3hcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1tb2RhbD1cInRydWVcIicgK1xuICAgICAgICAnIGFyaWEtbGFiZWxsZWRieT1cImNvbmZpcm0tZGlhbG9nLW1zZ1wiJyArXG4gICAgICAgICcgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZmY7IGJvcmRlci1yYWRpdXM6OHB4OyBwYWRkaW5nOjI0cHggMjhweDsnICtcbiAgICAgICAgJ21heC13aWR0aDo0MDBweDsgd2lkdGg6OTAlOyBib3gtc2hhZG93OjAgOHB4IDMycHggcmdiYSgwLDAsMCwwLjE4KTsgZm9udC1mYW1pbHk6aW5oZXJpdDtcIj4nICtcbiAgICAgICAgJzxwIGlkPVwiY29uZmlybS1kaWFsb2ctbXNnXCIgc3R5bGU9XCJtYXJnaW46MCAwIDIwcHg7IGZvbnQtc2l6ZTowLjk1ZW07IGNvbG9yOiMxZTI5M2I7IHdoaXRlLXNwYWNlOnByZS13cmFwO1wiPjwvcD4nICtcbiAgICAgICAgJzxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7IGdhcDo4cHg7IGp1c3RpZnktY29udGVudDpmbGV4LWVuZDtcIj4nICtcbiAgICAgICAgJzxidXR0b24gaWQ9XCJjb25maXJtLWRpYWxvZy1jYW5jZWxcIiBzdHlsZT1cInBhZGRpbmc6NnB4IDE2cHg7IGJvcmRlcjoxcHggc29saWQgI2NiZDVlMTsnICtcbiAgICAgICAgJ2JvcmRlci1yYWRpdXM6NXB4OyBiYWNrZ3JvdW5kOiNmOGZhZmM7IGN1cnNvcjpwb2ludGVyOyBjb2xvcjojNDc1NTY5O1wiPjwvYnV0dG9uPicgK1xuICAgICAgICAnPGJ1dHRvbiBpZD1cImNvbmZpcm0tZGlhbG9nLW9rXCIgc3R5bGU9XCJwYWRkaW5nOjZweCAxNnB4OyBib3JkZXI6bm9uZTsnICtcbiAgICAgICAgJ2JvcmRlci1yYWRpdXM6NXB4OyBjdXJzb3I6cG9pbnRlcjsgY29sb3I6I2ZmZjsgZm9udC13ZWlnaHQ6NjAwO1wiPjwvYnV0dG9uPicgK1xuICAgICAgICAnPC9kaXY+PC9kaXY+JztcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQob3ZlcmxheSk7XG4gICAgfVxuXG4gICAgY29uc3Qgb2tCdG4gICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbmZpcm0tZGlhbG9nLW9rJyk7XG4gICAgY29uc3QgY2FuY2VsQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbmZpcm0tZGlhbG9nLWNhbmNlbCcpO1xuICAgIGNvbnN0IG1zZ0VsICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb25maXJtLWRpYWxvZy1tc2cnKTtcblxuICAgIG1zZ0VsLnRleHRDb250ZW50ICAgICAgICAgID0gbWVzc2FnZTtcbiAgICBva0J0bi50ZXh0Q29udGVudCAgICAgICAgICA9IGNvbmZpcm1MYWJlbDtcbiAgICBjYW5jZWxCdG4udGV4dENvbnRlbnQgICAgICA9IGNhbmNlbExhYmVsO1xuICAgIG9rQnRuLnN0eWxlLmJhY2tncm91bmQgICAgID0gZGFuZ2VyID8gJyNkYzI2MjYnIDogJyMzYjgyZjYnO1xuXG4gICAgb3ZlcmxheS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICAgIG9rQnRuLmZvY3VzKCk7XG5cbiAgICAvLyBGb2N1cyB0cmFwIFx1MjAxNCBrZWVwIFRhYi9TaGlmdCtUYWIgaW5zaWRlIHRoZSB0d28gYnV0dG9uc1xuICAgIGNvbnN0IHRyYXBGb2N1cyA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5rZXkgIT09ICdUYWInKSByZXR1cm47XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBjb25zdCBmb2N1c2VkID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICAgIGlmIChlLnNoaWZ0S2V5KSB7XG4gICAgICAgIChmb2N1c2VkID09PSBjYW5jZWxCdG4gPyBva0J0biA6IGNhbmNlbEJ0bikuZm9jdXMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIChmb2N1c2VkID09PSBva0J0biA/IGNhbmNlbEJ0biA6IG9rQnRuKS5mb2N1cygpO1xuICAgICAgfVxuICAgIH07XG4gICAgb3ZlcmxheS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdHJhcEZvY3VzKTtcblxuICAgIGNvbnN0IGZpbmlzaCA9IChyZXN1bHQpID0+IHtcbiAgICAgIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIG92ZXJsYXkucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRyYXBGb2N1cyk7XG4gICAgICAvLyBSZW1vdmUgbGlzdGVuZXJzIHRvIGF2b2lkIHN0YWNraW5nIGhhbmRsZXJzXG4gICAgICBva0J0bi5yZXBsYWNlV2l0aChva0J0bi5jbG9uZU5vZGUodHJ1ZSkpO1xuICAgICAgY2FuY2VsQnRuLnJlcGxhY2VXaXRoKGNhbmNlbEJ0bi5jbG9uZU5vZGUodHJ1ZSkpO1xuICAgICAgaWYgKHByZXZpb3VzRm9jdXMgJiYgdHlwZW9mIHByZXZpb3VzRm9jdXMuZm9jdXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcHJldmlvdXNGb2N1cy5mb2N1cygpO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgIH07XG5cbiAgICAvLyBFc2NhcGUga2V5IGNhbmNlbHNcbiAgICBvdmVybGF5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4geyBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSBmaW5pc2goZmFsc2UpOyB9LCB7IG9uY2U6IHRydWUgfSk7XG5cbiAgICAvLyBSZWJpbmQgY2xvbmVkIGJ1dHRvbnNcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29uZmlybS1kaWFsb2ctb2snKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICAgICAoKSA9PiBmaW5pc2godHJ1ZSksICB7IG9uY2U6IHRydWUgfSk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbmZpcm0tZGlhbG9nLWNhbmNlbCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gZmluaXNoKGZhbHNlKSwgeyBvbmNlOiB0cnVlIH0pO1xuICAgIG92ZXJsYXkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBlID0+IHsgaWYgKGUudGFyZ2V0ID09PSBvdmVybGF5KSBmaW5pc2goZmFsc2UpOyB9LCB7IG9uY2U6IHRydWUgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEluaXRpYWxpemUgdGhlIGFwcGxpY2F0aW9uIG9uIERPTSByZWFkeS5cbiAqIFNldHMgdXAgZXZlbnQgbGlzdGVuZXJzLCByZXN0b3JlcyBzZXNzaW9uLCBhbmQgbG9hZHMgaW5pdGlhbCB0YWIuXG4gKi9cbi8qKlxuICogU2V0IHVwIGFsbCBnbG9iYWwgZXZlbnQgbGlzdGVuZXJzLlxuICovXG5mdW5jdGlvbiBzZXR1cEV2ZW50TGlzdGVuZXJzKCkge1xuICAvLyBUYWIgYnV0dG9uc1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudGFiJykuZm9yRWFjaCh0YWIgPT4ge1xuICAgIHRhYi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICBjb25zdCB0YWJOYW1lID0gZS50YXJnZXQuaWQucmVwbGFjZSgndGFiLScsICcnKTtcbiAgICAgIHN3aXRjaFRhYih0YWJOYW1lKTtcbiAgICB9KTtcblxuICAgIC8vIEtleWJvYXJkIG5hdmlnYXRpb24gZm9yIHRhYnMgKFdDQUcgMi4xIEFBIHRhYmxpc3QgcGF0dGVybilcbiAgICB0YWIuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChlKSA9PiB7XG4gICAgICAvLyBFbnRlci9TcGFjZSBhY3RpdmF0ZSB0aGUgZm9jdXNlZCB0YWJcbiAgICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJyB8fCBlLmtleSA9PT0gJyAnKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS50YXJnZXQuY2xpY2soKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gQXJyb3cvSG9tZS9FbmQgbmF2aWdhdGUgYW5kIGFjdGl2YXRlXG4gICAgICBpZiAoWydBcnJvd0xlZnQnLCAnQXJyb3dSaWdodCcsICdIb21lJywgJ0VuZCddLmluY2x1ZGVzKGUua2V5KSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGNvbnN0IHRhYnMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50YWI6bm90KFtzdHlsZSo9XCJkaXNwbGF5OiBub25lXCJdKScpKTtcbiAgICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gdGFicy5pbmRleE9mKGUudGFyZ2V0KTtcblxuICAgICAgICBsZXQgbmV4dFRhYjtcbiAgICAgICAgaWYgKGUua2V5ID09PSAnQXJyb3dMZWZ0JyB8fCBlLmtleSA9PT0gJ0hvbWUnKSB7XG4gICAgICAgICAgbmV4dFRhYiA9IGUua2V5ID09PSAnSG9tZScgPyB0YWJzWzBdIDogdGFic1soY3VycmVudEluZGV4IC0gMSArIHRhYnMubGVuZ3RoKSAlIHRhYnMubGVuZ3RoXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXh0VGFiID0gZS5rZXkgPT09ICdFbmQnID8gdGFic1t0YWJzLmxlbmd0aCAtIDFdIDogdGFic1soY3VycmVudEluZGV4ICsgMSkgJSB0YWJzLmxlbmd0aF07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV4dFRhYikge1xuICAgICAgICAgIG5leHRUYWIuZm9jdXMoKTtcbiAgICAgICAgICBuZXh0VGFiLmNsaWNrKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gTWVzc2FnZSBpbnB1dCAoRW50ZXIga2V5IHRvIHNlbmQpXG4gIGNvbnN0IG1lc3NhZ2VJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZXNzYWdlLWlucHV0Jyk7XG4gIGlmIChtZXNzYWdlSW5wdXQpIHtcbiAgICBtZXNzYWdlSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5cHJlc3MnLCAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSAnRW50ZXInICYmICFlLnNoaWZ0S2V5KSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzLnNlbmRNZXNzYWdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgZ2xvYmFsVGhpcy5zZW5kTWVzc2FnZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBNb2RhbCBjbG9zZSBvbiBFU0Mga2V5XG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4ge1xuICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgIGNsb3NlQWxsTW9kYWxzKCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBDbG9zZSBtb2RhbHMgb24gYmFja2dyb3VuZCBjbGlja1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbcm9sZT1cImRpYWxvZ1wiXScpLmZvckVhY2gobW9kYWwgPT4ge1xuICAgIG1vZGFsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgIGlmIChlLnRhcmdldCA9PT0gbW9kYWwpIHtcbiAgICAgICAgY2xvc2VNb2RhbChtb2RhbC5pZCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJldHVybiB0aGUgc3RhZ2UgdGhhdCBvd25zIGEgZ2l2ZW4gdGFiLCBvciBudWxsIGlmIHVubWFwcGVkLlxuICogQHBhcmFtIHtzdHJpbmd9IHRhYlxuICogQHJldHVybnMge3N0cmluZ3xudWxsfVxuICovXG5mdW5jdGlvbiBnZXRTdGFnZUZvclRhYih0YWIpIHtcbiAgZm9yIChjb25zdCBbc3RhZ2UsIHRhYnNdIG9mIE9iamVjdC5lbnRyaWVzKFNUQUdFX1RBQlMpKSB7XG4gICAgaWYgKHRhYnMuaW5jbHVkZXModGFiKSkgcmV0dXJuIHN0YWdlO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBnZXRWaXNpYmxlU3RhZ2UoKSB7XG4gIGNvbnN0IGFjdGl2ZVRhYiA9IHN0YXRlTWFuYWdlci5nZXRDdXJyZW50VGFiKCk7XG4gIHJldHVybiBnZXRTdGFnZUZvclRhYihhY3RpdmVUYWIpIHx8IGdldFdvcmtmbG93U3RlcEZvclBoYXNlKHN0YXRlTWFuYWdlci5nZXRQaGFzZSgpKTtcbn1cblxuLyoqXG4gKiBTaG93L2hpZGUgdGhlIHNjcm9sbCBhcnJvdyBidXR0b25zIGJhc2VkIG9uIHdoZXRoZXIgdGhlIHRhYiBiYXIgaXMgc2Nyb2xsYWJsZS5cbiAqL1xuZnVuY3Rpb24gdXBkYXRlVGFiU2Nyb2xsQnV0dG9ucygpIHtcbiAgY29uc3QgdGFiQmFyICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWItYmFyJyk7XG4gIGNvbnN0IGxlZnRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFiLXNjcm9sbC1sZWZ0Jyk7XG4gIGNvbnN0IHJpZ2h0QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYi1zY3JvbGwtcmlnaHQnKTtcbiAgaWYgKCF0YWJCYXIgfHwgIWxlZnRCdG4gfHwgIXJpZ2h0QnRuKSByZXR1cm47XG4gIGxlZnRCdG4uc3R5bGUuZGlzcGxheSAgPSB0YWJCYXIuc2Nyb2xsTGVmdCA+IDAgPyAnJyA6ICdub25lJztcbiAgcmlnaHRCdG4uc3R5bGUuZGlzcGxheSA9IHRhYkJhci5zY3JvbGxMZWZ0IDwgdGFiQmFyLnNjcm9sbFdpZHRoIC0gdGFiQmFyLmNsaWVudFdpZHRoIC0gMSA/ICcnIDogJ25vbmUnO1xufVxuXG4vKipcbiAqIFNob3cgb25seSB0aGUgdGFicyB0aGF0IGJlbG9uZyB0byB0aGUgZ2l2ZW4gc3RhZ2UgaW4gdGhlIHNlY29uZCBuYXYgYmFyLlxuICogQHBhcmFtIHtzdHJpbmd9IHN0YWdlIC0gS2V5IGZyb20gU1RBR0VfVEFCU1xuICovXG5mdW5jdGlvbiB1cGRhdGVUYWJCYXJGb3JTdGFnZShzdGFnZSkge1xuICBjb25zdCBzdGFnZVRhYnMgPSBTVEFHRV9UQUJTW3N0YWdlXSB8fCBbXTtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnRhYicpLmZvckVhY2godGFiID0+IHtcbiAgICB0YWIuc3R5bGUuZGlzcGxheSA9IHN0YWdlVGFicy5pbmNsdWRlcyh0YWIuZGF0YXNldC50YWIpID8gJycgOiAnbm9uZSc7XG4gIH0pO1xuICAvLyBSZXNldCBzY3JvbGwgcG9zaXRpb24gdG8gc2hvdyBhY3RpdmUgdGFiLCB0aGVuIHJlZnJlc2ggYXJyb3cgdmlzaWJpbGl0eVxuICBjb25zdCB0YWJCYXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFiLWJhcicpO1xuICBpZiAodGFiQmFyKSB0YWJCYXIuc2Nyb2xsTGVmdCA9IDA7XG4gIHVwZGF0ZVRhYlNjcm9sbEJ1dHRvbnMoKTtcblxuICAvLyBHQVAtMTYgKFBhcnQgQSk6IHN1cmZhY2Ugd2hpY2ggd29ya2Zsb3cgc3RlcCdzIHN1Yi10YWJzIGFyZSBjdXJyZW50bHlcbiAgLy8gc2hvd24uIFZpc2libGUtb25seSBsYWJlbCBcdTIwMTQgbm8gYXJpYS1saXZlIGhlcmU7IHN3aXRjaFRhYigpIGluXG4gIC8vIHJldmlldy10YWJsZS1iYXNlLmpzIGlzIHRoZSBzb2xlIGxpdmUtc3BlZWNoIHNvdXJjZSBmb3IgdGhpcyBldmVudCwgdG9cbiAgLy8gYXZvaWQgYSBkb3VibGUtYW5ub3VuY2UgZnJvbSB0d28gaW5kZXBlbmRlbnQgbGl2ZSByZWdpb25zLlxuICBjb25zdCBsYWJlbEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYi1zdGFnZS1sYWJlbCcpO1xuICBpZiAobGFiZWxFbCkge1xuICAgIGNvbnN0IHN0ZXBMYWJlbCA9IF9TVEVQX0RJU1BMQVlbc3RhZ2VdIHx8IHN0YWdlO1xuICAgIGxhYmVsRWwudGV4dENvbnRlbnQgPSBzdGVwTGFiZWwgPyBgTm93IHZpZXdpbmc6ICR7c3RlcExhYmVsfWAgOiAnJztcbiAgfVxufVxuXG4vLyBsb2FkVGFiQ29udGVudCgpIGxpdmVzIGluIHdlYi9yZXZpZXctdGFibGUtYmFzZS5qcywgd2hpY2ggb3ducyB0aGVcbi8vIGZ1bGwgfjIwLWNhc2UgdGFiIGRpc3BhdGNoICh0aGlzIGZpbGUncyBjb3B5IG9ubHkgZXZlciBoYW5kbGVkIDUgb2YgdGhlbVxuLy8gYW5kIHdhcyBuZXZlciBjYWxsZWQgaW50ZXJuYWxseSBcdTIwMTQgZGVhZCBjb2RlLCBzdXBlcnNlZGVkIG9uY2UgdGhlIHRhYlxuLy8gc3lzdGVtIGdyZXcpLiByZXZpZXctdGFibGUtYmFzZS5qcydzIHZlcnNpb24gbm93IGNhcnJpZXMgdGhlIHNhbWVcbi8vIHNhZmUgdGV4dENvbnRlbnQtYmFzZWQgZXJyb3IgcmVuZGVyaW5nIHRoaXMgY29weSBoYWQ7IHNlZSBpdHMgb3duXG4vLyB0cnkvY2F0Y2guIFJlbW92ZWQgaGVyZSByYXRoZXIgdGhhbiBsZWZ0IHRvIGRyaWZ0IGZ1cnRoZXIgb3V0IG9mIHN5bmMuXG5cbi8qKlxuICogVG9nZ2xlIGNvbGxhcHNpYmxlIGNoYXQgcGFuZWwgKGludGVyYWN0aW9uIGFyZWEpLlxuICovXG5mdW5jdGlvbiB0b2dnbGVDaGF0KCkge1xuICBjb25zdCBpbnRlcmFjdGlvbkFyZWEgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaW50ZXJhY3Rpb24tYXJlYScpO1xuICBjb25zdCB2aWV3ZXJBcmVhID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnZpZXdlci1hcmVhJyk7XG5cbiAgaWYgKGludGVyYWN0aW9uQXJlYSkge1xuICAgIGNvbnN0IGlzQ29sbGFwc2VkID0gaW50ZXJhY3Rpb25BcmVhLmNsYXNzTGlzdC50b2dnbGUoJ2NvbGxhcHNlZCcpO1xuICAgIGlmICh2aWV3ZXJBcmVhKSB7XG4gICAgICB2aWV3ZXJBcmVhLnN0eWxlLmZsZXggPSBpc0NvbGxhcHNlZCA/ICcxIDEgMTAwJScgOiAnMCAxIDYwJSc7XG4gICAgfVxuICAgIC8vIEtlZXAgYXJpYS1sYWJlbCBhbmQgYXJpYS1leHBhbmRlZCBpbiBzeW5jIHdpdGggY29sbGFwc2VkIHN0YXRlXG4gICAgY29uc3QgdG9nZ2xlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvZ2dsZS1jaGF0Jyk7XG4gICAgaWYgKHRvZ2dsZUJ0bikge1xuICAgICAgdG9nZ2xlQnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsIFN0cmluZyghaXNDb2xsYXBzZWQpKTtcbiAgICAgIHRvZ2dsZUJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCBpc0NvbGxhcHNlZCA/ICdFeHBhbmQgY2hhdCBwYW5lbCcgOiAnQ29sbGFwc2UgY2hhdCBwYW5lbCcpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oU3RvcmFnZUtleXMuQ0hBVF9DT0xMQVBTRUQsIGlzQ29sbGFwc2VkKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2cud2FybignQ291bGQgbm90IHNhdmUgY2hhdCBzdGF0ZScpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIE9wZW4gYSBtb2RhbCBieSBJRC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RhbElkIC0gSUQgb2YgbW9kYWwgZWxlbWVudFxuICovXG5mdW5jdGlvbiBvcGVuTW9kYWwobW9kYWxJZCkge1xuICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG1vZGFsSWQpO1xuICBpZiAobW9kYWwpIHtcbiAgICAvLyBTYXZlIGZvY3VzIGJlZm9yZSBvcGVuaW5nIG1vZGFsXG4gICAgX2ZvY3VzU3RhY2sucHVzaChkb2N1bWVudC5hY3RpdmVFbGVtZW50KTtcblxuICAgIG1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Zpc2libGUnKTtcbiAgICBtb2RhbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ2ZhbHNlJyk7XG4gICAgLy8gTG9jayBib2R5IHNjcm9sbFxuICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcblxuICAgIC8vIFNldCBpbml0aWFsIGZvY3VzIGFuZCB0cmFwIGZvY3VzIHdpdGhpbiBtb2RhbFxuICAgIHNldEluaXRpYWxGb2N1cyhtb2RhbElkKTtcbiAgICB0cmFwRm9jdXMobW9kYWxJZCk7XG4gIH1cbn1cblxuLyoqXG4gKiBDbG9zZSBhIG1vZGFsIGJ5IElELlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGFsSWQgLSBJRCBvZiBtb2RhbCBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIGNsb3NlTW9kYWwobW9kYWxJZCkge1xuICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG1vZGFsSWQpO1xuICBpZiAobW9kYWwpIHtcbiAgICBpZiAobW9kYWwuZGF0YXNldC5kaXNtaXNzRGlzYWJsZWQgPT09ICcxJykgcmV0dXJuO1xuICAgIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Zpc2libGUnKTtcbiAgICBtb2RhbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTtcbiAgICAvLyBSZXN0b3JlIGJvZHkgc2Nyb2xsXG4gICAgaWYgKCFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbcm9sZT1cImRpYWxvZ1wiXS52aXNpYmxlJykpIHtcbiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnJztcbiAgICB9XG4gICAgLy8gUmVzdG9yZSBmb2N1c1xuICAgIHJlc3RvcmVGb2N1cygpO1xuICB9XG59XG5cbi8qKlxuICogQ2xvc2UgYWxsIG9wZW4gbW9kYWxzLlxuICovXG5mdW5jdGlvbiBjbG9zZUFsbE1vZGFscygpIHtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW3JvbGU9XCJkaWFsb2dcIl0nKS5mb3JFYWNoKG1vZGFsID0+IHtcbiAgICBpZiAobW9kYWwuZGF0YXNldC5kaXNtaXNzRGlzYWJsZWQgPT09ICcxJykgcmV0dXJuO1xuICAgIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Zpc2libGUnKTtcbiAgICBtb2RhbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTtcbiAgICBpZiAobW9kYWwuc3R5bGUuZGlzcGxheSAmJiBtb2RhbC5zdHlsZS5kaXNwbGF5ICE9PSAnbm9uZScpIHtcbiAgICAgIG1vZGFsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgfVxuICB9KTtcbiAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICcnO1xuICAvLyBSZXN0b3JlIGZvY3VzXG4gIHJlc3RvcmVGb2N1cygpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgTW9kZWwgc2VsZWN0b3IgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmxldCBfbW9kZWxEYXRhID0gbnVsbDsgLy8gY2FjaGVkIGZyb20gbGFzdCBsb2FkTW9kZWxTZWxlY3RvcigpIGNhbGxcbmxldCBfbW9kZWxEYXRhVGFibGUgPSBudWxsO1xubGV0IF9zZWxlY3RlZE1vZGVsUHJvdmlkZXJzID0gbmV3IFNldCgpO1xubGV0IF9tb2RlbFNlbGVjdG9yTG9hZGluZyA9IGZhbHNlOyAgIC8vIGd1YXJkOiBsb2FkTW9kZWxTZWxlY3RvcigpIGluIGZsaWdodFxubGV0IF9jYXRhbG9nUmVmcmVzaGluZyA9IGZhbHNlOyAgICAgIC8vIGd1YXJkOiBfcmVmcmVzaE1vZGVsQ2F0YWxvZ0ZvclNlbGVjdGlvbigpIGluIGZsaWdodFxubGV0IF9jYXRhbG9nUmVmcmVzaFBlbmRpbmcgPSBmYWxzZTsgIC8vIHF1ZXVlIG9uZSByZXJ1biB3aGVuIHRvZ2dsZXMgaGFwcGVuIG1pZC1yZWZyZXNoXG5sZXQgX3Nob3dGdWxsTW9kZWxDYXRhbG9nID0gZmFsc2U7XG5sZXQgX2NvcGlsb3RBdXRoUG9sbFRpbWVyID0gbnVsbDtcbmxldCBfbW9kZWxXaXphcmRTdGVwID0gMTtcbmxldCBfbW9kZWxXaXphcmRTZWxlY3RlZFByb3ZpZGVyID0gbnVsbDtcblxuXG5mdW5jdGlvbiBfZ2V0TW9kZWxQcmVmc0Zyb21TdG9yYWdlKCkge1xuICB0cnkge1xuICAgIGNvbnN0IHNhdmVkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oU3RvcmFnZUtleXMuVEFCX0RBVEEpO1xuICAgIHJldHVybiBzYXZlZCA/IChKU09OLnBhcnNlKHNhdmVkKSB8fCB7fSkgOiB7fTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG59XG5cbmZ1bmN0aW9uIF9zYXZlTW9kZWxQcmVmc1RvU3RvcmFnZShwYXRjaCkge1xuICB0cnkge1xuICAgIGNvbnN0IHBhcnNlZCA9IF9nZXRNb2RlbFByZWZzRnJvbVN0b3JhZ2UoKTtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShTdG9yYWdlS2V5cy5UQUJfREFUQSwgSlNPTi5zdHJpbmdpZnkoeyAuLi5wYXJzZWQsIC4uLnBhdGNoIH0pKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZy53YXJuKCdGYWlsZWQgdG8gcGVyc2lzdCBtb2RlbCBwcmVmZXJlbmNlcyBsb2NhbGx5OicsIGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9hcHBlbmRSZWNlbnRNb2RlbChwcm92aWRlciwgbW9kZWwpIHtcbiAgaWYgKCFwcm92aWRlciB8fCAhbW9kZWwpIHJldHVybjtcbiAgY29uc3QgcGFyc2VkID0gX2dldE1vZGVsUHJlZnNGcm9tU3RvcmFnZSgpO1xuICBjb25zdCBleGlzdGluZyA9IEFycmF5LmlzQXJyYXkocGFyc2VkLnJlY2VudE1vZGVscykgPyBwYXJzZWQucmVjZW50TW9kZWxzIDogW107XG4gIGNvbnN0IGZpbHRlcmVkID0gZXhpc3RpbmcuZmlsdGVyKChpdGVtKSA9PiAhKGl0ZW0ucHJvdmlkZXIgPT09IHByb3ZpZGVyICYmIGl0ZW0ubW9kZWwgPT09IG1vZGVsKSk7XG4gIGZpbHRlcmVkLnVuc2hpZnQoeyBwcm92aWRlciwgbW9kZWwgfSk7XG4gIF9zYXZlTW9kZWxQcmVmc1RvU3RvcmFnZSh7IHJlY2VudE1vZGVsczogZmlsdGVyZWQuc2xpY2UoMCwgNikgfSk7XG59XG5cbmZ1bmN0aW9uIF91cGRhdGVMbG1TdGF0dXNQaWxsKGtpbmQsIHRleHQsIGljb24gPSAnJywgdG9vbHRpcCA9ICcnKSB7XG4gIGNvbnN0IHBpbGwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtLXN0YXR1cy1waWxsJyk7XG4gIGNvbnN0IGxhYmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbS1zdGF0dXMtbGFiZWwnKTtcbiAgY29uc3QgaWNvbkVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbS1zdGF0dXMtaWNvbicpO1xuICBpZiAoIXBpbGwgfHwgIWxhYmVsKSByZXR1cm47XG5cbiAgY29uc3QgYWxpYXNlcyA9IHtcbiAgICBhdXRoZW50aWNhdGVkOiAnY29ubmVjdGVkJyxcbiAgICB1bmF1dGhlbnRpY2F0ZWQ6ICd1bmNvbmZpZ3VyZWQnLFxuICAgIHBvbGxpbmc6ICdjb25uZWN0aW5nJyxcbiAgfTtcbiAgY29uc3Qgbm9ybWFsaXplZEtpbmQgPSBhbGlhc2VzW2tpbmRdIHx8IGtpbmQgfHwgJ3VuY29uZmlndXJlZCc7XG4gIGNvbnN0IGRlZmF1bHRUb29sdGlwID0ge1xuICAgIHVuY29uZmlndXJlZDogJ05vIHByb3ZpZGVyL21vZGVsIGlzIGNvbmZpZ3VyZWQgeWV0LicsXG4gICAgY29uZmlndXJlZDogJ1Byb3ZpZGVyL21vZGVsIGlzIGNvbmZpZ3VyZWQuIENvbm5lY3Rpdml0eSBub3QgeWV0IHZlcmlmaWVkLicsXG4gICAgY29ubmVjdGluZzogJ1Rlc3Rpbmcgb3IgY29ubmVjdGluZyB0byB0aGUgc2VsZWN0ZWQgcHJvdmlkZXIuJyxcbiAgICBjb25uZWN0ZWQ6ICdQcm92aWRlciByZXNwb25kZWQgc3VjY2Vzc2Z1bGx5IHRvIGEgbGl2ZSByZXF1ZXN0LicsXG4gICAgJ2F1dGgtcmVxdWlyZWQnOiAnQXV0aGVudGljYXRpb24gaXMgcmVxdWlyZWQuIENoZWNrIEFQSSBrZXkgb3Igc2lnbiBpbi4nLFxuICAgICdyYXRlLWxpbWl0ZWQnOiAnUmF0ZSBsaW1pdCByZWFjaGVkLiBXYWl0IGJlZm9yZSByZXRyeWluZyByZXF1ZXN0cy4nLFxuICAgIHVuYXZhaWxhYmxlOiAnUHJvdmlkZXIgaXMgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGUgb3IgdW5yZWFjaGFibGUuJyxcbiAgICBlcnJvcjogJ0Nvbm5lY3Rpb24gZmFpbGVkLiBPcGVuIG1vZGVsIHNldHRpbmdzIGZvciBkZXRhaWxzLicsXG4gIH07XG4gIHBpbGwuY2xhc3NMaXN0LnJlbW92ZSgnYXV0aGVudGljYXRlZCcsICd1bmF1dGhlbnRpY2F0ZWQnLCAncG9sbGluZycsICd1bmNvbmZpZ3VyZWQnLCAnY29uZmlndXJlZCcsICdjb25uZWN0aW5nJywgJ2Nvbm5lY3RlZCcsICdhdXRoLXJlcXVpcmVkJywgJ3JhdGUtbGltaXRlZCcsICd1bmF2YWlsYWJsZScsICdlcnJvcicpO1xuICBpZiAobm9ybWFsaXplZEtpbmQpIHBpbGwuY2xhc3NMaXN0LmFkZChub3JtYWxpemVkS2luZCk7XG4gIGxhYmVsLnRleHRDb250ZW50ID0gdGV4dDtcbiAgY29uc3QgaWNvbkJ5S2luZCA9IHtcbiAgICB1bmNvbmZpZ3VyZWQ6ICdcdTI1Q0InLFxuICAgIGNvbmZpZ3VyZWQ6ICdcdTI1RDQnLFxuICAgIGNvbm5lY3Rpbmc6ICdcdTI5RDcnLFxuICAgIGNvbm5lY3RlZDogJ1x1MjcxMycsXG4gICAgJ2F1dGgtcmVxdWlyZWQnOiAnXHVEODNEXHVERDExJyxcbiAgICAncmF0ZS1saW1pdGVkJzogJ1x1MjNGMycsXG4gICAgdW5hdmFpbGFibGU6ICdcdTI2MDEnLFxuICAgIGVycm9yOiAnXHUyNkEwJyxcbiAgfTtcbiAgY29uc3QgaWNvblRleHQgPSBpY29uIHx8IGljb25CeUtpbmRbbm9ybWFsaXplZEtpbmRdIHx8ICdcdTI2QTAnO1xuICBpZiAoaWNvbkVsKSBpY29uRWwudGV4dENvbnRlbnQgPSBpY29uVGV4dDtcbiAgY29uc3QgdG9vbHRpcFRleHQgPSB0b29sdGlwIHx8IGRlZmF1bHRUb29sdGlwW25vcm1hbGl6ZWRLaW5kXSB8fCAnJztcbiAgcGlsbC50aXRsZSA9IHRvb2x0aXBUZXh0O1xuICBpZiAoaWNvbkVsKSBpY29uRWwudGl0bGUgPSB0b29sdGlwVGV4dDtcbiAgbGFiZWwudGl0bGUgPSB0b29sdGlwVGV4dDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9hZE1vZGVsU2VsZWN0b3IoKSB7XG4gIGlmIChfbW9kZWxTZWxlY3RvckxvYWRpbmcpIHJldHVybjtcbiAgX21vZGVsU2VsZWN0b3JMb2FkaW5nID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICBfbW9kZWxEYXRhID0gYXdhaXQgYXBpQ2FsbCgnR0VUJywgJy9hcGkvbW9kZWwnKTtcbiAgICAvLyBJZiBiYWNrZW5kIGRpZG4ndCByZXR1cm4gYSBwZXJzaXN0ZW50IHNlbGVjdGlvbiwgcHJlZmVyIGEgbG9jYWxseS1zYXZlZCBjaG9pY2VcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2F2ZWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShTdG9yYWdlS2V5cy5UQUJfREFUQSk7XG4gICAgICBpZiAoc2F2ZWQpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShzYXZlZCk7XG4gICAgICAgIGlmIChwYXJzZWQgJiYgIShfbW9kZWxEYXRhICYmIF9tb2RlbERhdGEucHJvdmlkZXIpICYmIHBhcnNlZC5jdXJyZW50TW9kZWxQcm92aWRlcikge1xuICAgICAgICAgIF9tb2RlbERhdGEgPSBfbW9kZWxEYXRhIHx8IHt9O1xuICAgICAgICAgIF9tb2RlbERhdGEucHJvdmlkZXIgPSBwYXJzZWQuY3VycmVudE1vZGVsUHJvdmlkZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcnNlZCAmJiAhKF9tb2RlbERhdGEgJiYgX21vZGVsRGF0YS5tb2RlbCkgJiYgcGFyc2VkLmN1cnJlbnRNb2RlbE5hbWUpIHtcbiAgICAgICAgICBfbW9kZWxEYXRhID0gX21vZGVsRGF0YSB8fCB7fTtcbiAgICAgICAgICBfbW9kZWxEYXRhLm1vZGVsID0gcGFyc2VkLmN1cnJlbnRNb2RlbE5hbWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2cud2FybignQ291bGQgbm90IHJlYWQgc2F2ZWQgbW9kZWwgZnJvbSBsb2NhbFN0b3JhZ2U6JywgZSk7XG4gICAgfVxuICAgIGNvbnN0IGxhYmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLWN1cnJlbnQtbGFiZWwnKTtcbiAgICBpZiAobGFiZWwpIHtcbiAgICAgIGNvbnN0IHByb3YgID0gX21vZGVsRGF0YS5wcm92aWRlcjtcbiAgICAgIGNvbnN0IG1vZGVsID0gX21vZGVsRGF0YS5tb2RlbCB8fCAnXHUyMDE0JztcbiAgICAgIGxhYmVsLnRleHRDb250ZW50ID0gcHJvdiA/IGAke3Byb3Z9IFx1MDBCNyAke21vZGVsfWAgOiBtb2RlbDtcbiAgICB9XG4gICAgaWYgKF9tb2RlbERhdGEgJiYgX21vZGVsRGF0YS5wcm92aWRlcikge1xuICAgICAgX3NlbGVjdGVkTW9kZWxQcm92aWRlcnMgPSBuZXcgU2V0KFtfbW9kZWxEYXRhLnByb3ZpZGVyXSk7XG4gICAgICBfdXBkYXRlTGxtU3RhdHVzUGlsbCgnY29uZmlndXJlZCcsIGAke19tb2RlbERhdGEucHJvdmlkZXJ9IGNvbmZpZ3VyZWRgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgX3VwZGF0ZUxsbVN0YXR1c1BpbGwoJ3VuY29uZmlndXJlZCcsICdOb3QgY29uZmlndXJlZCcpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZy53YXJuKCdDb3VsZCBub3QgbG9hZCBtb2RlbCBsaXN0OicsIGUpO1xuICB9IGZpbmFsbHkge1xuICAgIF9tb2RlbFNlbGVjdG9yTG9hZGluZyA9IGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9wcm92aWRlclN0YWdlTGFiZWwocHJvdmlkZXIsIGNhcGFibGVTZXQpIHtcbiAgY29uc3QgaXNDYXBhYmxlID0gY2FwYWJsZVNldC5oYXMocHJvdmlkZXIpO1xuICByZXR1cm4gaXNDYXBhYmxlID8gJ2xpc3RfbW9kZWxzJyA6ICdmYWxsYmFjayc7XG59XG5cbmZ1bmN0aW9uIF9wcm92aWRlckRpc3BsYXlMYWJlbChwcm92aWRlcikge1xuICBjb25zdCBkZXByZWNhdGVkID0ge1xuICAgICdjb3BpbG90LW9hdXRoJzogJ0NvcGlsb3QgT0F1dGggKGRlcHJlY2F0ZWQpJyxcbiAgICBjb3BpbG90OiAnQ29waWxvdCAoZGVwcmVjYXRlZCknLFxuICAgIGdpdGh1YjogJ0dpdEh1YiBNb2RlbHMgKGRlcHJlY2F0ZWQpJyxcbiAgICAnY29waWxvdC1zZGsnOiAnQ29waWxvdCBTREsgKHJlY29tbWVuZGVkKScsXG4gIH07XG4gIGlmIChkZXByZWNhdGVkW3Byb3ZpZGVyXSkgcmV0dXJuIGRlcHJlY2F0ZWRbcHJvdmlkZXJdO1xuICByZXR1cm4gcHJvdmlkZXI7XG59XG5cbmZ1bmN0aW9uIF9nZXRRdWlja01vZGVsQ2FuZGlkYXRlcyhyb3dzKSB7XG4gIGNvbnN0IHBhcnNlZCA9IF9nZXRNb2RlbFByZWZzRnJvbVN0b3JhZ2UoKTtcbiAgY29uc3QgcmVjZW50cyA9IEFycmF5LmlzQXJyYXkocGFyc2VkLnJlY2VudE1vZGVscykgPyBwYXJzZWQucmVjZW50TW9kZWxzIDogW107XG4gIGNvbnN0IHJhbmtlZCA9IFtdO1xuXG4gIGZvciAoY29uc3QgcmVjZW50IG9mIHJlY2VudHMpIHtcbiAgICBjb25zdCBoaXQgPSByb3dzLmZpbmQoKHJvdykgPT4gcm93LnByb3ZpZGVyID09PSByZWNlbnQucHJvdmlkZXIgJiYgcm93Lm1vZGVsID09PSByZWNlbnQubW9kZWwpO1xuICAgIGlmIChoaXQpIHJhbmtlZC5wdXNoKGhpdCk7XG4gIH1cblxuICBjb25zdCBwb3B1bGFyID0gWy4uLnJvd3NdXG4gICAgLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGNvbnN0IGFtID0gTnVtYmVyKGEuY29waWxvdF9tdWx0aXBsaWVyID8/IDk5OSk7XG4gICAgICBjb25zdCBibSA9IE51bWJlcihiLmNvcGlsb3RfbXVsdGlwbGllciA/PyA5OTkpO1xuICAgICAgaWYgKGFtICE9PSBibSkgcmV0dXJuIGFtIC0gYm07XG4gICAgICBjb25zdCBhYyA9IE51bWJlcihhLmNvbnRleHRfd2luZG93IHx8IDApO1xuICAgICAgY29uc3QgYmMgPSBOdW1iZXIoYi5jb250ZXh0X3dpbmRvdyB8fCAwKTtcbiAgICAgIHJldHVybiBiYyAtIGFjO1xuICAgIH0pO1xuXG4gIGZvciAoY29uc3QgaXRlbSBvZiBwb3B1bGFyKSB7XG4gICAgaWYgKCFyYW5rZWQuc29tZSgocikgPT4gci5wcm92aWRlciA9PT0gaXRlbS5wcm92aWRlciAmJiByLm1vZGVsID09PSBpdGVtLm1vZGVsKSkge1xuICAgICAgcmFua2VkLnB1c2goaXRlbSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJhbmtlZC5zbGljZSgwLCA4KTtcbn1cblxuZnVuY3Rpb24gX3JlbmRlclF1aWNrTW9kZWxMaXN0KHJvd3MpIHtcbiAgY29uc3QgcXVpY2tFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1xdWljay1saXN0Jyk7XG4gIGlmICghcXVpY2tFbCkgcmV0dXJuO1xuICBxdWlja0VsLmlubmVySFRNTCA9ICcnO1xuXG4gIGNvbnN0IGNhbmRpZGF0ZXMgPSBfZ2V0UXVpY2tNb2RlbENhbmRpZGF0ZXMocm93cyB8fCBbXSk7XG4gIGZvciAoY29uc3QgaXRlbSBvZiBjYW5kaWRhdGVzKSB7XG4gICAgY29uc3QgaXNBY3RpdmUgPSBpdGVtLnByb3ZpZGVyID09PSBfbW9kZWxEYXRhPy5wcm92aWRlciAmJiBpdGVtLm1vZGVsID09PSBfbW9kZWxEYXRhPy5tb2RlbDtcbiAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICBidXR0b24uY2xhc3NOYW1lID0gJ2hlYWRlci1waWxsLWJ0bic7XG4gICAgYnV0dG9uLnN0eWxlLnBhZGRpbmcgPSAnNXB4IDEwcHgnO1xuICAgIGJ1dHRvbi5zdHlsZS5mb250U2l6ZSA9ICcwLjgyZW0nO1xuICAgIGJ1dHRvbi5zdHlsZS5iYWNrZ3JvdW5kID0gaXNBY3RpdmUgPyAnI2RiZWFmZScgOiAnI2Y4ZmFmYyc7XG4gICAgYnV0dG9uLnN0eWxlLmNvbG9yID0gaXNBY3RpdmUgPyAnIzFlM2E4YScgOiAnIzMzNDE1NSc7XG4gICAgYnV0dG9uLnN0eWxlLmJvcmRlckNvbG9yID0gaXNBY3RpdmUgPyAnIzkzYzVmZCcgOiAnI2NiZDVlMSc7XG4gICAgYnV0dG9uLnRpdGxlID0gYCR7aXRlbS5wcm92aWRlcn0gXHUwMEI3ICR7aXRlbS5tb2RlbH1gO1xuICAgIGJ1dHRvbi50ZXh0Q29udGVudCA9IGAke2l0ZW0ucHJvdmlkZXJ9IFx1MDBCNyAke2l0ZW0ubW9kZWx9YDtcbiAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBzZXRNb2RlbChpdGVtLm1vZGVsLCBpdGVtLnByb3ZpZGVyKTtcbiAgICB9KTtcbiAgICBxdWlja0VsLmFwcGVuZENoaWxkKGJ1dHRvbik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX3N5bmNDYXRhbG9nVmlzaWJpbGl0eSgpIHtcbiAgY29uc3Qgd3JhcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1mdWxsLXRhYmxlLXdyYXAnKTtcbiAgY29uc3Qgc2VhcmNoID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLWdsb2JhbC1zZWFyY2gnKTtcbiAgY29uc3QgdG9nZ2xlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLXNob3ctYWxsLWJ0bicpO1xuICBpZiAod3JhcCkgd3JhcC5zdHlsZS5kaXNwbGF5ID0gX3Nob3dGdWxsTW9kZWxDYXRhbG9nID8gJycgOiAnbm9uZSc7XG4gIGlmIChzZWFyY2gpIHNlYXJjaC5zdHlsZS5kaXNwbGF5ID0gX3Nob3dGdWxsTW9kZWxDYXRhbG9nID8gJycgOiAnbm9uZSc7XG4gIGlmICh0b2dnbGUpIHRvZ2dsZS50ZXh0Q29udGVudCA9IF9zaG93RnVsbE1vZGVsQ2F0YWxvZyA/ICdIaWRlIEZ1bGwgQ2F0YWxvZycgOiAnU2hvdyBGdWxsIENhdGFsb2cnO1xufVxuXG5mdW5jdGlvbiB0b2dnbGVNb2RlbENhdGFsb2dWaXNpYmlsaXR5KCkge1xuICBfc2hvd0Z1bGxNb2RlbENhdGFsb2cgPSAhX3Nob3dGdWxsTW9kZWxDYXRhbG9nO1xuICBfc3luY0NhdGFsb2dWaXNpYmlsaXR5KCk7XG59XG5cbi8vIF9yZW5kZXJBdXRoU3RlcCBcdTIwMTQgY2FsbGVkIGJ5IF9zZXRNb2RlbFdpemFyZFN0ZXAgd2hlbiBlbnRlcmluZyBTdGVwIDIuXG4vLyBSZW5kZXJzIHByb3ZpZGVyLXNwZWNpZmljIGNvbnRlbnQgaW50byAjbW9kZWwtYXV0aC1zdGVwLWNvbnRlbnQgYW5kIHNob3dzXG4vLyB0aGUgYXBwcm9wcmlhdGUgc3ViLXBhbmVsIChrZXkgaW5wdXQsIGRldmljZS1mbG93LCBDTEkgbm90aWNlLCBvciBub25lKS5cbmFzeW5jIGZ1bmN0aW9uIF9yZW5kZXJBdXRoU3RlcChwcm92aWRlcikge1xuICBjb25zdCBjb250ZW50ICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLWF1dGgtc3RlcC1jb250ZW50Jyk7XG4gIGNvbnN0IGtleVBhbmVsICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtYXV0aC1rZXktcGFuZWwnKTtcbiAgY29uc3QgZGV2UGFuZWwgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1hdXRoLWRldmljZS1wYW5lbCcpO1xuICBjb25zdCBrZXlJbnB1dCAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLWF1dGgta2V5LWlucHV0Jyk7XG4gIGNvbnN0IGtleVN0YXR1cyAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtYXV0aC1rZXktc3RhdHVzJyk7XG5cbiAgaWYgKCFjb250ZW50KSByZXR1cm47XG5cbiAgLy8gUmVzZXQgc3ViLXBhbmVsc1xuICBpZiAoa2V5UGFuZWwpICBrZXlQYW5lbC5zdHlsZS5kaXNwbGF5ICA9ICdub25lJztcbiAgaWYgKGRldlBhbmVsKSAgZGV2UGFuZWwuc3R5bGUuZGlzcGxheSAgPSAnbm9uZSc7XG4gIGlmIChrZXlJbnB1dCkgIGtleUlucHV0LnZhbHVlID0gJyc7XG4gIGlmIChrZXlTdGF0dXMpIGtleVN0YXR1cy50ZXh0Q29udGVudCA9ICcnO1xuXG4gIGlmICghcHJvdmlkZXIpIHtcbiAgICBjb250ZW50LmlubmVySFRNTCA9ICc8cCBzdHlsZT1cImNvbG9yOiM2NDc0OGI7XCI+U2VsZWN0IGEgcHJvdmlkZXIgaW4gU3RlcCAxIGZpcnN0LjwvcD4nO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBjcmVkRGF0YSA9IG51bGw7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKCcvYXBpL3NldHRpbmdzL2NyZWRlbnRpYWxzL3N0YXR1cycpO1xuICAgIGlmIChyZXNwLm9rKSB7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcC5qc29uKCk7XG4gICAgICBjcmVkRGF0YSA9IChkYXRhLnByb3ZpZGVycyB8fCB7fSlbcHJvdmlkZXJdIHx8IG51bGw7XG4gICAgfVxuICB9IGNhdGNoIHsgLyogbm9uLWZhdGFsICovIH1cblxuICBjb25zdCBhdXRoVHlwZSAgID0gY3JlZERhdGE/LmF1dGhfdHlwZSAgfHwgJ2FwaV9rZXknO1xuICBjb25zdCBsYWJlbCAgICAgID0gY3JlZERhdGE/LmxhYmVsICAgICAgfHwgcHJvdmlkZXI7XG4gIGNvbnN0IGhlbHBUZXh0ICAgPSBjcmVkRGF0YT8uaGVscF90ZXh0ICB8fCAnJztcbiAgY29uc3QgZ2V0S2V5VXJsICA9IGNyZWREYXRhPy5nZXRfa2V5X3VybCB8fCAnJztcbiAgY29uc3QgaXNTZXQgICAgICA9IGNyZWREYXRhPy5pc19zZXQgICAgIHx8IGZhbHNlO1xuICBjb25zdCBzb3VyY2UgICAgID0gY3JlZERhdGE/LnNvdXJjZSAgICAgfHwgJ3Vuc2V0JztcbiAgY29uc3QgZW52VmFyICAgICA9IGNyZWREYXRhPy5lbnZfdmFyICAgIHx8IG51bGw7XG4gIGNvbnN0IGlzTG9ja2VkICAgPSBjcmVkRGF0YT8ubG9ja2VkICAgICB8fCBmYWxzZTtcblxuICBjb25zdCBpc1NldEJhZGdlID0gaXNTZXRcbiAgICA/ICc8c3BhbiBzdHlsZT1cImRpc3BsYXk6aW5saW5lLWJsb2NrO3BhZGRpbmc6MnB4IDhweDtib3JkZXItcmFkaXVzOjk5OXB4O2JhY2tncm91bmQ6I2QxZmFlNTtjb2xvcjojMDY1ZjQ2O2ZvbnQtc2l6ZTowLjhlbTtmb250LXdlaWdodDo2MDA7XCI+JiMxMDAwMzsgS2V5IHNhdmVkPC9zcGFuPidcbiAgICA6ICc8c3BhbiBzdHlsZT1cImRpc3BsYXk6aW5saW5lLWJsb2NrO3BhZGRpbmc6MnB4IDhweDtib3JkZXItcmFkaXVzOjk5OXB4O2JhY2tncm91bmQ6I2ZlZTJlMjtjb2xvcjojOTkxYjFiO2ZvbnQtc2l6ZTowLjhlbTtmb250LXdlaWdodDo2MDA7XCI+Tm90IGNvbmZpZ3VyZWQ8L3NwYW4+JztcblxuICAvLyBTb3VyY2UgbGFiZWwgKyBcdTI0RDggdG9vbHRpcCBcdTIwMTQgbWlycm9ycyB0aGUgc2V0dGluZ3MgZGlhbG9nIHBhdHRlcm4uXG4gIGxldCBzb3VyY2VMYWJlbCA9ICcnO1xuICBsZXQgdG9vbHRpcFRleHQgPSAnJztcbiAgaWYgKHNvdXJjZSA9PT0gJ2VudicpIHtcbiAgICBzb3VyY2VMYWJlbCA9IGBTb3VyY2U6IGVudmlyb25tZW50IHZhcmlhYmxlICgke2VudlZhciB8fCAnbG9ja2VkJ30pYDtcbiAgICB0b29sdGlwVGV4dCA9IGBDdXJyZW50bHkgbG9hZGVkIGZyb20gdGhlICR7ZW52VmFyfSBlbnZpcm9ubWVudCB2YXJpYWJsZS4gYCArXG4gICAgICBgVG8gY2hhbmdlIGl0IHBlcm1hbmVudGx5LCB1cGRhdGUgeW91ciBzaGVsbCBjb25maWcgKGUuZy4gfi8uenNocmMpIGFuZCByZXN0YXJ0IHRoZSBzZXJ2ZXIuIGAgK1xuICAgICAgYFlvdSBjYW4gc3RpbGwgc2F2ZSBhIHZhbHVlIGJlbG93IFx1MjAxNCBpdCB0YWtlcyBlZmZlY3QgaW1tZWRpYXRlbHkgYnV0IHdpbGwgYmUgb3ZlcnJpZGRlbiBieSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgb24gbmV4dCByZXN0YXJ0LmA7XG4gIH0gZWxzZSBpZiAoc291cmNlID09PSAnZG90ZW52Jykge1xuICAgIHNvdXJjZUxhYmVsID0gYFNvdXJjZTogLmVudiBmaWxlICgke2VudlZhciB8fCAnbG9ja2VkJ30pYDtcbiAgICB0b29sdGlwVGV4dCA9IGBDdXJyZW50bHkgbG9hZGVkIGZyb20gJHtlbnZWYXJ9IGluIHlvdXIgLmVudiBmaWxlLiBgICtcbiAgICAgIGBUbyBjaGFuZ2UgaXQgcGVybWFuZW50bHksIGVkaXQgdGhlIC5lbnYgZmlsZSBpbiB0aGUgcHJvamVjdCBkaXJlY3RvcnkgYW5kIHJlc3RhcnQgdGhlIHNlcnZlci4gYCArXG4gICAgICBgWW91IGNhbiBzdGlsbCBzYXZlIGEgdmFsdWUgYmVsb3cgXHUyMDE0IGl0IHRha2VzIGVmZmVjdCBpbW1lZGlhdGVseSBidXQgd2lsbCBiZSBvdmVycmlkZGVuIGJ5IC5lbnYgb24gbmV4dCByZXN0YXJ0LmA7XG4gIH0gZWxzZSBpZiAoc291cmNlID09PSAnY29uZmlnJykge1xuICAgIHNvdXJjZUxhYmVsID0gJ1NvdXJjZTogY29uZmlnLnlhbWwnO1xuICAgIHRvb2x0aXBUZXh0ID0gJ1N0b3JlZCBpbiBjb25maWcueWFtbC4gVXBkYXRlIGl0IHVzaW5nIHRoZSBpbnB1dCBiZWxvdy4nO1xuICB9XG5cbiAgY29uc3QgaW5mb0ljb24gPSB0b29sdGlwVGV4dFxuICAgID8gYCA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiB0aXRsZT1cIiR7ZXNjYXBlSHRtbCh0b29sdGlwVGV4dCl9XCIgYXJpYS1sYWJlbD1cIldoZXJlIGlzIHRoaXMga2V5IHN0b3JlZD9cIiBgICtcbiAgICAgIGBzdHlsZT1cImJhY2tncm91bmQ6bm9uZTtib3JkZXI6bm9uZTtjdXJzb3I6aGVscDtjb2xvcjojNjQ3NDhiO2ZvbnQtc2l6ZTowLjg1ZW07cGFkZGluZzowIDJweDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7bGluZS1oZWlnaHQ6MTtcIj5cdTI0RDg8L2J1dHRvbj5gXG4gICAgOiAnJztcblxuICBjb25zdCBzb3VyY2VMYWJlbEh0bWwgPSBzb3VyY2VMYWJlbFxuICAgID8gYDxzcGFuIHN0eWxlPVwibWFyZ2luLWxlZnQ6MTBweDtmb250LXNpemU6MC44ZW07Y29sb3I6JHtpc0xvY2tlZCA/ICcjYjQ1MzA5JyA6ICcjNjQ3NDhiJ307XCI+JHtlc2NhcGVIdG1sKHNvdXJjZUxhYmVsKX0ke2luZm9JY29ufTwvc3Bhbj5gXG4gICAgOiAnJztcblxuICAvLyBBbWJlciB3YXJuaW5nIHdoZW4gYSBsb2NrZWQgc291cmNlIGV4aXN0cyBcdTIwMTQgaW5wdXQgcmVtYWlucyBlbmFibGVkIHNvIHRoZVxuICAvLyB1c2VyIGNhbiBzYXZlIGEgc2Vzc2lvbi9jb25maWcgb3ZlcnJpZGUsIGJ1dCB0aGUgcHJlY2VkZW5jZSBydWxlIGlzIGNsZWFyLlxuICBjb25zdCBzb3VyY2VEZXNjID0gc291cmNlID09PSAnZW52JyA/ICdlbnZpcm9ubWVudCB2YXJpYWJsZScgOiAnLmVudiBmaWxlJztcbiAgY29uc3Qgc291cmNlUmVmICA9IGVudlZhclxuICAgID8gYCR7c291cmNlRGVzY30gPGNvZGU+JHtlc2NhcGVIdG1sKGVudlZhcil9PC9jb2RlPmBcbiAgICA6IHNvdXJjZURlc2M7XG4gIGNvbnN0IGxvY2tlZFdhcm5IdG1sID0gaXNMb2NrZWRcbiAgICA/IGA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZmVmM2M3O2JvcmRlcjoxcHggc29saWQgI2Y1OWUwYjtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjhweCAxMnB4O21hcmdpbjo4cHggMDtmb250LXNpemU6MC44NWVtO2NvbG9yOiM5MjQwMGU7XCI+YCArXG4gICAgICBgXHUyNkEwIFRoaXMga2V5IGlzIGxvYWRlZCBmcm9tIHRoZSA8c3Ryb25nPiR7c291cmNlUmVmfTwvc3Ryb25nPi4gYCArXG4gICAgICBgQW55IHZhbHVlIHNhdmVkIGJlbG93IHRha2VzIGVmZmVjdCBpbW1lZGlhdGVseSBmb3IgdGhlIGN1cnJlbnQgc2Vzc2lvbiwgYnV0IHdpbGwgYmUgYCArXG4gICAgICBgPHN0cm9uZz5vdmVycmlkZGVuIGJ5IHRoZSAke3NvdXJjZURlc2N9IHdoZW4gdGhlIHNlcnZlciByZXN0YXJ0cyBvciByZWxvYWRzPC9zdHJvbmc+LjwvZGl2PmBcbiAgICA6ICcnO1xuXG4gIGNvbnN0IGdldEtleUxpbmsgPSBnZXRLZXlVcmxcbiAgICA/IGA8YSBocmVmPVwiJHtlc2NhcGVIdG1sKGdldEtleVVybCl9XCIgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiIHN0eWxlPVwiY29sb3I6IzI1NjNlYjtcIj5HZXQgeW91ciBrZXkgJiM4NTk5OzwvYT5gXG4gICAgOiAnJztcblxuICBjb250ZW50LmlubmVySFRNTCA9XG4gICAgYDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjEwcHg7XCI+YCArXG4gICAgYCAgPHN0cm9uZz4ke2VzY2FwZUh0bWwobGFiZWwpfTwvc3Ryb25nPiAke2lzU2V0QmFkZ2V9JHtzb3VyY2VMYWJlbEh0bWx9YCArXG4gICAgKGdldEtleUxpbmsgPyBgICA8c3BhbiBzdHlsZT1cIm1hcmdpbi1sZWZ0OjEwcHg7XCI+JHtnZXRLZXlMaW5rfTwvc3Bhbj5gIDogJycpICtcbiAgICBgPC9kaXY+YCArXG4gICAgKGhlbHBUZXh0ID8gYDxwIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtjb2xvcjojNDc1NTY5O21hcmdpbjowIDAgMTJweDtcIj4ke2VzY2FwZUh0bWwoaGVscFRleHQpfTwvcD5gIDogJycpICtcbiAgICBsb2NrZWRXYXJuSHRtbDtcblxuICBpZiAoYXV0aFR5cGUgPT09ICdhcGlfa2V5Jykge1xuICAgIGlmIChrZXlQYW5lbCkge1xuICAgICAga2V5UGFuZWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgaWYgKGtleUlucHV0KSB7XG4gICAgICAgIC8vIEFsd2F5cyBlbmFibGUgaW5wdXQgXHUyMDE0IHVzZXIgY2FuIHNhdmUgYSBuZXcgdmFsdWUgZXZlbiB3aGVuIGVudi9kb3RlbnYgaXMgdGhlIGN1cnJlbnRcbiAgICAgICAgLy8gc291cmNlLiBUaGUgd2FybmluZyBiYW5uZXIgYWJvdmUgY29tbXVuaWNhdGVzIHRoZSByZXN0YXJ0LXByZWNlZGVuY2UgYmVoYXZpb3VyLlxuICAgICAgICBrZXlJbnB1dC5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICBrZXlJbnB1dC5zdHlsZS5vcGFjaXR5ID0gJyc7XG4gICAgICAgIGtleUlucHV0LnBsYWNlaG9sZGVyID0gaXNTZXQgPyAnRW50ZXIgbmV3IGtleSB0byByZXBsYWNlIHRoZSBzYXZlZCBvbmUnIDogJ1Bhc3RlIHlvdXIgQVBJIGtleSBoZXJlJztcbiAgICAgICAga2V5SW5wdXQuZGF0YXNldC5wcm92aWRlciA9IHByb3ZpZGVyO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChhdXRoVHlwZSA9PT0gJ2RldmljZV9mbG93Jykge1xuICAgIGlmIChkZXZQYW5lbCkge1xuICAgICAgZGV2UGFuZWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgYXdhaXQgX3JlZnJlc2hDb3BpbG90QXV0aFN0YXR1cygpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChhdXRoVHlwZSA9PT0gJ2NsaScpIHtcbiAgICBjb250ZW50LmlubmVySFRNTCArPVxuICAgICAgYDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmMGZkZjQ7Ym9yZGVyOjFweCBzb2xpZCAjYmJmN2QwO2JvcmRlci1yYWRpdXM6NnB4O3BhZGRpbmc6MTBweCAxNHB4O2ZvbnQtc2l6ZTowLjg4ZW07XCI+YCArXG4gICAgICBgPHAgc3R5bGU9XCJtYXJnaW46MCAwIDZweDtcIj5SdW4gdGhpcyBjb21tYW5kIGluIGEgdGVybWluYWwsIHRoZW4gcmV0dXJuIGhlcmUgYW5kIGNsaWNrIDxzdHJvbmc+TmV4dDwvc3Ryb25nPjo8L3A+YCArXG4gICAgICBgPGNvZGUgc3R5bGU9XCJmb250LXNpemU6MWVtO1wiPmdoIGF1dGggbG9naW48L2NvZGU+PC9kaXY+YDtcbiAgfSBlbHNlIHtcbiAgICBjb250ZW50LmlubmVySFRNTCArPVxuICAgICAgYDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmOGZhZmM7Ym9yZGVyOjFweCBzb2xpZCAjZTJlOGYwO2JvcmRlci1yYWRpdXM6NnB4O3BhZGRpbmc6MTBweCAxNHB4O2ZvbnQtc2l6ZTowLjg4ZW07Y29sb3I6IzQ3NTU2OTtcIj5gICtcbiAgICAgIGBObyBhdXRoZW50aWNhdGlvbiByZXF1aXJlZCBmb3IgdGhpcyBwcm92aWRlci48L2Rpdj5gO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9yZWZyZXNoQ29waWxvdEF1dGhTdGF0dXMoKSB7XG4gIGNvbnN0IHN0YXR1c0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLWF1dGgtc3RhdHVzJyk7XG4gIGNvbnN0IHN0YXJ0QnRuICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1hdXRoLXN0YXJ0LWJ0bicpO1xuICBjb25zdCBsb2dvdXRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtYXV0aC1sb2dvdXQtYnRuJyk7XG4gIGNvbnN0IGNvZGVFbCAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1hdXRoLWNvZGUnKTtcbiAgY29uc3QgbGlua0VsICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLWF1dGgtbGluaycpO1xuICBpZiAoIXN0YXR1c0VsKSByZXR1cm47XG5cbiAgaWYgKGNvZGVFbCkgIGNvZGVFbC50ZXh0Q29udGVudCA9ICcnO1xuICBpZiAobGlua0VsKSAgbGlua0VsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBzdCA9IGF3YWl0IGZldGNoKCcvYXBpL2NvcGlsb3QtYXV0aC9zdGF0dXMnKS50aGVuKChyZXMpID0+IHJlcy5qc29uKCkpO1xuICAgIGlmIChzdC5hdXRoZW50aWNhdGVkKSB7XG4gICAgICBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICdBdXRoZW50aWNhdGVkIHdpdGggR2l0SHViIENvcGlsb3QuJztcbiAgICAgIGlmIChzdGFydEJ0bikgc3RhcnRCdG4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIGlmIChsb2dvdXRCdG4pIGxvZ291dEJ0bi5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICBfdXBkYXRlTGxtU3RhdHVzUGlsbCgnYXV0aGVudGljYXRlZCcsICdDb3BpbG90IHJlYWR5Jyk7XG4gICAgfSBlbHNlIGlmIChzdC5wb2xsaW5nKSB7XG4gICAgICBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICdXYWl0aW5nIGZvciBkZXZpY2UgYXBwcm92YWxcdTIwMjYnO1xuICAgICAgaWYgKHN0YXJ0QnRuKSBzdGFydEJ0bi5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICBpZiAobG9nb3V0QnRuKSBsb2dvdXRCdG4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIF91cGRhdGVMbG1TdGF0dXNQaWxsKCdwb2xsaW5nJywgJ0NvcGlsb3QgYXV0aCBwZW5kaW5nJywgJ1x1MjlENycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICdOb3QgYXV0aGVudGljYXRlZC4gU3RhcnQgc2lnbi1pbiB0byBlbmFibGUgQ29waWxvdCBPQXV0aC4nO1xuICAgICAgaWYgKHN0YXJ0QnRuKSBzdGFydEJ0bi5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICBpZiAobG9nb3V0QnRuKSBsb2dvdXRCdG4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIF91cGRhdGVMbG1TdGF0dXNQaWxsKCd1bmF1dGhlbnRpY2F0ZWQnLCAnQ29waWxvdCBub3QgYXV0aGVudGljYXRlZCcpO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnVW5hYmxlIHRvIGxvYWQgYXV0aCBzdGF0dXMuJztcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBzYXZlUHJvdmlkZXJBcGlLZXkoKSB7XG4gIGNvbnN0IGtleUlucHV0ICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1hdXRoLWtleS1pbnB1dCcpO1xuICBjb25zdCBrZXlTdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtYXV0aC1rZXktc3RhdHVzJyk7XG4gIGNvbnN0IHByb3ZpZGVyICA9IGtleUlucHV0Py5kYXRhc2V0Py5wcm92aWRlciB8fCBfbW9kZWxXaXphcmRTZWxlY3RlZFByb3ZpZGVyO1xuICBjb25zdCB2YWx1ZSAgICAgPSAoa2V5SW5wdXQ/LnZhbHVlIHx8ICcnKS50cmltKCk7XG5cbiAgaWYgKCF2YWx1ZSkge1xuICAgIGlmIChrZXlTdGF0dXMpIHsga2V5U3RhdHVzLnRleHRDb250ZW50ID0gJ1BsZWFzZSBlbnRlciBhIGtleSB2YWx1ZS4nOyBrZXlTdGF0dXMuc3R5bGUuY29sb3IgPSAnI2I5MWMxYyc7IH1cbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCFwcm92aWRlcikge1xuICAgIGlmIChrZXlTdGF0dXMpIHsga2V5U3RhdHVzLnRleHRDb250ZW50ID0gJ05vIHByb3ZpZGVyIHNlbGVjdGVkLic7IGtleVN0YXR1cy5zdHlsZS5jb2xvciA9ICcjYjkxYzFjJzsgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChrZXlTdGF0dXMpIHsga2V5U3RhdHVzLnRleHRDb250ZW50ID0gJ1NhdmluZ1x1MjAyNic7IGtleVN0YXR1cy5zdHlsZS5jb2xvciA9ICcjNDc1NTY5JzsgfVxuICB0cnkge1xuICAgIGF3YWl0IGFwaUNhbGwoJ1BPU1QnLCAnL2FwaS9zZXR0aW5ncy9jcmVkZW50aWFscycsIHsgcHJvdmlkZXIsIGtleV92YWx1ZTogdmFsdWUgfSk7XG4gICAgaWYgKGtleUlucHV0KSAga2V5SW5wdXQudmFsdWUgPSAnJztcbiAgICBpZiAoa2V5U3RhdHVzKSB7XG4gICAgICBrZXlTdGF0dXMudGV4dENvbnRlbnQgPSAnS2V5IHNhdmVkIHN1Y2Nlc3NmdWxseS4nO1xuICAgICAga2V5U3RhdHVzLnN0eWxlLmNvbG9yID0gJyMwNjVmNDYnO1xuICAgIH1cbiAgICAvLyBSZS1yZW5kZXIgYmFkZ2UgdG8gc2hvdyBrZXkgaXMgbm93IHNldFxuICAgIGF3YWl0IF9yZW5kZXJBdXRoU3RlcChwcm92aWRlcik7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoa2V5U3RhdHVzKSB7IGtleVN0YXR1cy50ZXh0Q29udGVudCA9IGBFcnJvcjogJHtlLm1lc3NhZ2UgfHwgZX1gOyBrZXlTdGF0dXMuc3R5bGUuY29sb3IgPSAnI2I5MWMxYyc7IH1cbiAgfVxufVxuXG5mdW5jdGlvbiB0b2dnbGVBcGlLZXlWaXNpYmlsaXR5KCkge1xuICBjb25zdCBpbnB1dCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtYXV0aC1rZXktaW5wdXQnKTtcbiAgY29uc3QgdG9nZ2xlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLWF1dGgta2V5LXRvZ2dsZScpO1xuICBpZiAoIWlucHV0KSByZXR1cm47XG4gIGNvbnN0IGlzSGlkZGVuID0gaW5wdXQudHlwZSA9PT0gJ3Bhc3N3b3JkJztcbiAgaW5wdXQudHlwZSA9IGlzSGlkZGVuID8gJ3RleHQnIDogJ3Bhc3N3b3JkJztcbiAgaWYgKHRvZ2dsZSkgdG9nZ2xlLnRleHRDb250ZW50ID0gaXNIaWRkZW4gPyAnXHVEODNEXHVERTQ4JyA6ICdcdUQ4M0RcdURDNDEnO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzdGFydENvcGlsb3RBdXRoRnJvbVdpemFyZCgpIHtcbiAgY29uc3Qgc3RhdHVzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtYXV0aC1zdGF0dXMnKTtcbiAgY29uc3QgY29kZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLWF1dGgtY29kZScpO1xuICBjb25zdCBsaW5rRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtYXV0aC1saW5rJyk7XG4gIGlmICghc3RhdHVzRWwgfHwgIWNvZGVFbCB8fCAhbGlua0VsKSByZXR1cm47XG5cbiAgX3Nob3dNb2RlbFdpemFyZEJ1c3koJ1N0YXJ0aW5nIEdpdEh1YiBkZXZpY2UgYXV0aG9yaXphdGlvbi4uLicpO1xuICB0cnkge1xuICAgIGNvbnN0IGZsb3dSZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9jb3BpbG90LWF1dGgvc3RhcnQnLCB7IG1ldGhvZDogJ1BPU1QnIH0pO1xuICAgIGlmICghZmxvd1Jlcy5vaykgdGhyb3cgbmV3IEVycm9yKGF3YWl0IGZsb3dSZXMudGV4dCgpKTtcbiAgICBjb25zdCBmbG93ID0gYXdhaXQgZmxvd1Jlcy5qc29uKCk7XG5cbiAgICBjb2RlRWwudGV4dENvbnRlbnQgPSBmbG93LnVzZXJfY29kZSB8fCAnJztcbiAgICBsaW5rRWwuaHJlZiA9IGZsb3cudmVyaWZpY2F0aW9uX3VyaSB8fCAnaHR0cHM6Ly9naXRodWIuY29tL2xvZ2luL2RldmljZSc7XG4gICAgbGlua0VsLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICdPcGVuIEdpdEh1YiwgZW50ZXIgdGhlIGNvZGUsIHRoZW4gcmV0dXJuIGhlcmUuJztcbiAgICB3aW5kb3cub3BlbihsaW5rRWwuaHJlZiwgJ19ibGFuaycpO1xuXG4gICAgYXdhaXQgZmV0Y2goJy9hcGkvY29waWxvdC1hdXRoL3BvbGwnLCB7IG1ldGhvZDogJ1BPU1QnIH0pO1xuICAgIF91cGRhdGVMbG1TdGF0dXNQaWxsKCdwb2xsaW5nJywgJ0NvcGlsb3QgYXV0aCBwZW5kaW5nJywgJ1x1MjlENycpO1xuICAgIGlmIChfY29waWxvdEF1dGhQb2xsVGltZXIpIGNsZWFySW50ZXJ2YWwoX2NvcGlsb3RBdXRoUG9sbFRpbWVyKTtcbiAgICBfY29waWxvdEF1dGhQb2xsVGltZXIgPSBzZXRJbnRlcnZhbChhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzdCA9IGF3YWl0IGZldGNoKCcvYXBpL2NvcGlsb3QtYXV0aC9zdGF0dXMnKS50aGVuKChyZXMpID0+IHJlcy5qc29uKCkpO1xuICAgICAgICBpZiAoc3QuYXV0aGVudGljYXRlZCkge1xuICAgICAgICAgIGNsZWFySW50ZXJ2YWwoX2NvcGlsb3RBdXRoUG9sbFRpbWVyKTtcbiAgICAgICAgICBfY29waWxvdEF1dGhQb2xsVGltZXIgPSBudWxsO1xuICAgICAgICAgIGF3YWl0IF9yZWZyZXNoQ29waWxvdEF1dGhTdGF0dXMoKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIGtlZXAgcG9sbGluZyBzaWxlbnRseSB1bnRpbCBjbG9zZVxuICAgICAgfVxuICAgIH0sIDUwMDApO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHN0YXR1c0VsLnRleHRDb250ZW50ID0gYEF1dGggc3RhcnQgZmFpbGVkOiAke2Vycm9yLm1lc3NhZ2UgfHwgZXJyb3J9YDtcbiAgfSBmaW5hbGx5IHtcbiAgICBfaGlkZU1vZGVsV2l6YXJkQnVzeSgpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxvZ291dENvcGlsb3RBdXRoRnJvbVdpemFyZCgpIHtcbiAgYXdhaXQgZmV0Y2goJy9hcGkvY29waWxvdC1hdXRoL2xvZ291dCcsIHsgbWV0aG9kOiAnUE9TVCcgfSk7XG4gIGF3YWl0IF9yZWZyZXNoQ29waWxvdEF1dGhTdGF0dXMoKTtcbn1cblxuZnVuY3Rpb24gX3dpcmVHbG9iYWxNb2RlbFNlYXJjaCgpIHtcbiAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtZ2xvYmFsLXNlYXJjaCcpO1xuICBpZiAoIWlucHV0KSByZXR1cm47XG4gIGlucHV0Lm9uaW5wdXQgPSAoKSA9PiB7XG4gICAgaWYgKF9tb2RlbERhdGFUYWJsZSAmJiB0eXBlb2YgX21vZGVsRGF0YVRhYmxlLnNlYXJjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgX21vZGVsRGF0YVRhYmxlLnNlYXJjaChpbnB1dC52YWx1ZSB8fCAnJykuZHJhdygpO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gX3JlbmRlclByb3ZpZGVyU2VsZWN0b3IoKSB7XG4gIGNvbnN0IGxpc3RFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1wcm92aWRlci1saXN0Jyk7XG4gIGlmICghbGlzdEVsIHx8ICFfbW9kZWxEYXRhKSByZXR1cm47XG5cbiAgY29uc3QgcHJvdmlkZXJzID0gQXJyYXkuaXNBcnJheShfbW9kZWxEYXRhLnByb3ZpZGVycylcbiAgICA/IF9tb2RlbERhdGEucHJvdmlkZXJzXG4gICAgOiBBcnJheS5mcm9tKG5ldyBTZXQoKF9tb2RlbERhdGEuYWxsX21vZGVscyB8fCBbXSkubWFwKHIgPT4gci5wcm92aWRlcikuZmlsdGVyKEJvb2xlYW4pKSkuc29ydCgpO1xuICBjb25zdCBjYXBhYmxlU2V0ID0gbmV3IFNldChfbW9kZWxEYXRhLmxpc3RfbW9kZWxzX2NhcGFibGUgfHwgW10pO1xuXG4gIGlmICghX21vZGVsV2l6YXJkU2VsZWN0ZWRQcm92aWRlcikge1xuICAgIF9tb2RlbFdpemFyZFNlbGVjdGVkUHJvdmlkZXIgPSBfbW9kZWxEYXRhLnByb3ZpZGVyIHx8IHByb3ZpZGVyc1swXSB8fCBudWxsO1xuICB9XG4gIGlmIChfbW9kZWxXaXphcmRTZWxlY3RlZFByb3ZpZGVyKSB7XG4gICAgX3NlbGVjdGVkTW9kZWxQcm92aWRlcnMgPSBuZXcgU2V0KFtfbW9kZWxXaXphcmRTZWxlY3RlZFByb3ZpZGVyXSk7XG4gIH1cblxuICAvLyBEaXNwb3NlIGFueSBleGlzdGluZyBCUzUgcG9wb3ZlcnMgYmVmb3JlIGNsZWFyaW5nIHRoZSBsaXN0LlxuICBsaXN0RWwucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtYnMtdG9nZ2xlPVwicG9wb3ZlclwiXScpLmZvckVhY2goZWwgPT4ge1xuICAgIHdpbmRvdy5ib290c3RyYXA/LlBvcG92ZXI/LmdldEluc3RhbmNlKGVsKT8uZGlzcG9zZSgpO1xuICB9KTtcblxuICBsaXN0RWwuaW5uZXJIVE1MID0gJyc7XG4gIHByb3ZpZGVycy5mb3JFYWNoKHByb3ZpZGVyID0+IHtcbiAgICBjb25zdCBjaGVja2VkID0gcHJvdmlkZXIgPT09IF9tb2RlbFdpemFyZFNlbGVjdGVkUHJvdmlkZXI7XG4gICAgY29uc3Qgc291cmNlTGFiZWwgPSBfcHJvdmlkZXJTdGFnZUxhYmVsKHByb3ZpZGVyLCBjYXBhYmxlU2V0KTtcbiAgICBjb25zdCBpbmZvID0gZ2V0UHJvdmlkZXJJbmZvKHByb3ZpZGVyKTtcblxuICAgIGNvbnN0IGxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGFiZWwnKTtcbiAgICBsYWJlbC5zdHlsZS5jc3NUZXh0ID0gJ2Rpc3BsYXk6ZmxleDsgYWxpZ24taXRlbXM6Y2VudGVyOyBnYXA6NnB4OyBwYWRkaW5nOjRweCA4cHg7IGJvcmRlcjoxcHggc29saWQgI2NiZDVlMTsgYm9yZGVyLXJhZGl1czo5OTlweDsgZm9udC1zaXplOjAuODJlbTsgYmFja2dyb3VuZDojZmZmOyBjdXJzb3I6cG9pbnRlcjsnO1xuICAgIGxhYmVsLmlubmVySFRNTCA9XG4gICAgICBgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJtb2RlbC1wcm92aWRlci1jaG9pY2VcIiB2YWx1ZT1cIiR7ZXNjYXBlSHRtbChwcm92aWRlcil9XCIgJHtjaGVja2VkID8gJ2NoZWNrZWQnIDogJyd9IHN0eWxlPVwibWFyZ2luOjA7XCIgLz5gICtcbiAgICAgIGA8c3Bhbj4ke2VzY2FwZUh0bWwoX3Byb3ZpZGVyRGlzcGxheUxhYmVsKHByb3ZpZGVyKSl9PC9zcGFuPmAgK1xuICAgICAgYDxzcGFuIHN0eWxlPVwiY29sb3I6IzY0NzQ4YjsgZm9udC1zaXplOjAuOGVtO1wiPigke2VzY2FwZUh0bWwoc291cmNlTGFiZWwpfSk8L3NwYW4+YDtcblxuICAgIC8vIEFwcGVuZCBhIFx1MjREOCBidXR0b24gd2lyZWQgdG8gYSBCUzUgSFRNTCBwb3BvdmVyIHNvIGxpbmtzIGluc2lkZSBhcmUgY2xpY2thYmxlLlxuICAgIGlmIChpbmZvKSB7XG4gICAgICBjb25zdCBidG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICAgIGJ0bi50eXBlID0gJ2J1dHRvbic7XG4gICAgICBidG4uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgJ1Byb3ZpZGVyIGluZm8nKTtcbiAgICAgIGJ0bi5zZXRBdHRyaWJ1dGUoJ2RhdGEtYnMtdG9nZ2xlJywgJ3BvcG92ZXInKTtcbiAgICAgIGJ0bi5zZXRBdHRyaWJ1dGUoJ2RhdGEtYnMtdHJpZ2dlcicsICdjbGljaycpO1xuICAgICAgYnRuLnNldEF0dHJpYnV0ZSgnZGF0YS1icy1wbGFjZW1lbnQnLCAncmlnaHQnKTtcbiAgICAgIGJ0bi5zZXRBdHRyaWJ1dGUoJ2RhdGEtYnMtaHRtbCcsICd0cnVlJyk7XG4gICAgICBidG4uc2V0QXR0cmlidXRlKCdkYXRhLWJzLWNvbnRhaW5lcicsICdib2R5Jyk7XG4gICAgICBidG4uc2V0QXR0cmlidXRlKCdkYXRhLWJzLWNvbnRlbnQnLCBwcm92aWRlckluZm9Qb3BvdmVyQ29udGVudChpbmZvKSk7XG4gICAgICBidG4uc3R5bGUuY3NzVGV4dCA9ICdiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOm5vbmU7Y3Vyc29yOnBvaW50ZXI7Y29sb3I6IzY0NzQ4Yjtmb250LXNpemU6MC45ZW07cGFkZGluZzowIDFweDtsaW5lLWhlaWdodDoxO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTsnO1xuICAgICAgYnRuLnRleHRDb250ZW50ID0gJ1x1MjREOCc7XG4gICAgICAvLyBQcmV2ZW50IHRoZSByYWRpby1sYWJlbCBjbGljayBmcm9tIHByb3BhZ2F0aW5nIHRvIHRoZSByYWRpbyBidXR0b24uXG4gICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBlID0+IGUuc3RvcFByb3BhZ2F0aW9uKCkpO1xuICAgICAgbGFiZWwuYXBwZW5kQ2hpbGQoYnRuKTtcblxuICAgICAgLy8gSW5pdGlhbGlzZSBhZnRlciBhcHBlbmQgXHUyMDE0IEJTNSBtdXN0IGZpbmQgdGhlIGVsZW1lbnQgaW4gdGhlIERPTS5cbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIGlmICh3aW5kb3cuYm9vdHN0cmFwPy5Qb3BvdmVyKSB7XG4gICAgICAgICAgbmV3IHdpbmRvdy5ib290c3RyYXAuUG9wb3ZlcihidG4sIHsgc2FuaXRpemU6IGZhbHNlIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBjaGVja2JveCA9IGxhYmVsLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7XG4gICAgY2hlY2tib3guYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgaWYgKCFjaGVja2JveC5jaGVja2VkKSByZXR1cm47XG4gICAgICBfbW9kZWxXaXphcmRTZWxlY3RlZFByb3ZpZGVyID0gcHJvdmlkZXI7XG4gICAgICBfc2VsZWN0ZWRNb2RlbFByb3ZpZGVycyA9IG5ldyBTZXQoW3Byb3ZpZGVyXSk7XG4gICAgICBfdXBkYXRlTW9kZWxXaXphcmROYXYoKTtcbiAgICB9KTtcblxuICAgIGxpc3RFbC5hcHBlbmRDaGlsZChsYWJlbCk7XG4gIH0pO1xuXG4gIF91cGRhdGVNb2RlbFdpemFyZE5hdigpO1xufVxuXG5mdW5jdGlvbiBfc2hvd01vZGVsV2l6YXJkQnVzeShtZXNzYWdlKSB7XG4gIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtd2l6YXJkLWJ1c3ktb3ZlcmxheScpO1xuICBjb25zdCBtZXNzYWdlRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtd2l6YXJkLWJ1c3ktbWVzc2FnZScpO1xuICBpZiAobWVzc2FnZUVsKSBtZXNzYWdlRWwudGV4dENvbnRlbnQgPSBtZXNzYWdlIHx8ICdXb3JraW5nLi4uJztcbiAgaWYgKG92ZXJsYXkpIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICdmbGV4Jztcbn1cblxuZnVuY3Rpb24gX2hpZGVNb2RlbFdpemFyZEJ1c3koKSB7XG4gIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtd2l6YXJkLWJ1c3ktb3ZlcmxheScpO1xuICBpZiAob3ZlcmxheSkgb3ZlcmxheS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xufVxuXG5mdW5jdGlvbiBfc2V0TW9kZWxXaXphcmRTdGVwKHN0ZXApIHtcbiAgX21vZGVsV2l6YXJkU3RlcCA9IFsxLCAyLCAzLCA0XS5pbmNsdWRlcyhzdGVwKSA/IHN0ZXAgOiAxO1xuICBjb25zdCBwYW5lcyA9IHtcbiAgICAxOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtc3RlcC1wcm92aWRlcicpLFxuICAgIDI6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1zdGVwLWF1dGgnKSxcbiAgICAzOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtc3RlcC1tb2RlbHMnKSxcbiAgICA0OiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtc3RlcC1zdWNjZXNzJyksXG4gIH07XG4gIE9iamVjdC5lbnRyaWVzKHBhbmVzKS5mb3JFYWNoKChbbnVtLCBlbF0pID0+IHtcbiAgICBpZiAoZWwpIGVsLnN0eWxlLmRpc3BsYXkgPSBOdW1iZXIobnVtKSA9PT0gX21vZGVsV2l6YXJkU3RlcCA/ICcnIDogJ25vbmUnO1xuICB9KTtcbiAgaWYgKF9tb2RlbFdpemFyZFN0ZXAgPT09IDIpIHtcbiAgICBfcmVuZGVyQXV0aFN0ZXAoX21vZGVsV2l6YXJkU2VsZWN0ZWRQcm92aWRlcik7XG4gIH1cbiAgX3VwZGF0ZU1vZGVsV2l6YXJkTmF2KCk7XG59XG5cbmZ1bmN0aW9uIF91cGRhdGVNb2RlbFdpemFyZFByb2dyZXNzQmFyKCkge1xuICBbMSwgMiwgMywgNF0uZm9yRWFjaCgoc3RlcE51bSkgPT4ge1xuICAgIGNvbnN0IHN0ZXBFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBtb2RlbC1wcm9ncmVzcy1zdGVwLSR7c3RlcE51bX1gKTtcbiAgICBpZiAoIXN0ZXBFbCkgcmV0dXJuO1xuICAgIGNvbnN0IGJhZGdlRWwgPSBzdGVwRWwucXVlcnlTZWxlY3RvcignLm1vZGVsLXByb2dyZXNzLWJhZGdlJyk7XG4gICAgc3RlcEVsLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWFjdGl2ZScsICdpcy1jb21wbGV0ZScsICdpcy11cGNvbWluZycpO1xuICAgIGlmIChzdGVwTnVtIDwgX21vZGVsV2l6YXJkU3RlcCkge1xuICAgICAgc3RlcEVsLmNsYXNzTGlzdC5hZGQoJ2lzLWNvbXBsZXRlJyk7XG4gICAgICBzdGVwRWwuc2V0QXR0cmlidXRlKCdhcmlhLWN1cnJlbnQnLCAnZmFsc2UnKTtcbiAgICAgIGlmIChiYWRnZUVsKSBiYWRnZUVsLnRleHRDb250ZW50ID0gJ1x1MjcxMyc7XG4gICAgfSBlbHNlIGlmIChzdGVwTnVtID09PSBfbW9kZWxXaXphcmRTdGVwKSB7XG4gICAgICBzdGVwRWwuY2xhc3NMaXN0LmFkZCgnaXMtYWN0aXZlJyk7XG4gICAgICBzdGVwRWwuc2V0QXR0cmlidXRlKCdhcmlhLWN1cnJlbnQnLCAnc3RlcCcpO1xuICAgICAgaWYgKGJhZGdlRWwpIGJhZGdlRWwudGV4dENvbnRlbnQgPSBTdHJpbmcoc3RlcE51bSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ZXBFbC5jbGFzc0xpc3QuYWRkKCdpcy11cGNvbWluZycpO1xuICAgICAgc3RlcEVsLnNldEF0dHJpYnV0ZSgnYXJpYS1jdXJyZW50JywgJ2ZhbHNlJyk7XG4gICAgICBpZiAoYmFkZ2VFbCkgYmFkZ2VFbC50ZXh0Q29udGVudCA9IFN0cmluZyhzdGVwTnVtKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBfdXBkYXRlTW9kZWxXaXphcmROYXYoKSB7XG4gIGNvbnN0IHN0ZXBMYWJlbCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtd2l6YXJkLXN0ZXAtbGFiZWwnKTtcbiAgY29uc3QgYmFja0J0biAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC13aXphcmQtYmFjay1idG4nKTtcbiAgY29uc3QgbmV4dEJ0biAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC13aXphcmQtbmV4dC1idG4nKTtcbiAgY29uc3QgdGVzdEJ0biAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC10ZXN0LWJ0bicpO1xuICBjb25zdCByZWZyZXNoQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ByaWNpbmctcmVmcmVzaC1idG4nKTtcbiAgY29uc3QgZm9vdGVyICAgICA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5tb2RlbC13aXphcmQtZm9vdGVyJyk7XG5cbiAgX3VwZGF0ZU1vZGVsV2l6YXJkUHJvZ3Jlc3NCYXIoKTtcblxuICBpZiAoc3RlcExhYmVsKSB7XG4gICAgY29uc3QgbGFiZWxzID0ge1xuICAgICAgMTogJ1N0ZXAgMSBvZiA0OiBDaG9vc2UgcHJvdmlkZXInLFxuICAgICAgMjogJ1N0ZXAgMiBvZiA0OiBTZXQgdXAgYXV0aGVudGljYXRpb24nLFxuICAgICAgMzogJ1N0ZXAgMyBvZiA0OiBDaG9vc2UgbW9kZWwgYW5kIHRlc3QgY29ubmVjdGlvbicsXG4gICAgICA0OiAnU3RlcCA0IG9mIDQ6IENvbXBsZXRlJyxcbiAgICB9O1xuICAgIHN0ZXBMYWJlbC50ZXh0Q29udGVudCA9IGxhYmVsc1tfbW9kZWxXaXphcmRTdGVwXSB8fCAnJztcbiAgfVxuXG4gIGlmIChiYWNrQnRuKSB7XG4gICAgYmFja0J0bi5kaXNhYmxlZCA9IF9tb2RlbFdpemFyZFN0ZXAgPT09IDE7XG4gICAgYmFja0J0bi5zdHlsZS5kaXNwbGF5ID0gX21vZGVsV2l6YXJkU3RlcCA9PT0gNCA/ICdub25lJyA6ICcnO1xuICB9XG4gIC8vIE5leHQgYnV0dG9uOiB2aXNpYmxlIG9uIHN0ZXBzIDEgYW5kIDJcbiAgaWYgKG5leHRCdG4pIHtcbiAgICBuZXh0QnRuLnN0eWxlLmRpc3BsYXkgPSAoX21vZGVsV2l6YXJkU3RlcCA9PT0gMSB8fCBfbW9kZWxXaXphcmRTdGVwID09PSAyKSA/ICcnIDogJ25vbmUnO1xuICAgIG5leHRCdG4uZGlzYWJsZWQgPSBfbW9kZWxXaXphcmRTdGVwID09PSAxICYmICFfbW9kZWxXaXphcmRTZWxlY3RlZFByb3ZpZGVyO1xuICAgIG5leHRCdG4udGV4dENvbnRlbnQgPSBfbW9kZWxXaXphcmRTdGVwID09PSAyID8gJ05leHQnIDogJ05leHQnO1xuICB9XG4gIGlmICh0ZXN0QnRuKSAgICB0ZXN0QnRuLnN0eWxlLmRpc3BsYXkgICAgPSBfbW9kZWxXaXphcmRTdGVwID09PSAzID8gJycgOiAnbm9uZSc7XG4gIGlmIChyZWZyZXNoQnRuKSByZWZyZXNoQnRuLnN0eWxlLmRpc3BsYXkgPSBfbW9kZWxXaXphcmRTdGVwID09PSAzID8gJycgOiAnbm9uZSc7XG4gIGlmIChmb290ZXIpIGZvb3Rlci5zdHlsZS5qdXN0aWZ5Q29udGVudCAgPSBfbW9kZWxXaXphcmRTdGVwID09PSA0ID8gJ2NlbnRlcicgOiAnc3BhY2UtYmV0d2Vlbic7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9sb2FkTW9kZWxzRm9yU2VsZWN0ZWRQcm92aWRlcigpIHtcbiAgaWYgKCFfbW9kZWxXaXphcmRTZWxlY3RlZFByb3ZpZGVyKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgbG9hZGluZ0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLW1vZGVscy1sb2FkaW5nJyk7XG4gIGlmIChsb2FkaW5nRWwpIHtcbiAgICBsb2FkaW5nRWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgIGxvYWRpbmdFbC5zdHlsZS5jb2xvciA9ICcjNDc1NTY5JztcbiAgICBsb2FkaW5nRWwuaW5uZXJIVE1MID0gJzxzcGFuIGNsYXNzPVwibG9hZGluZy1zcGlubmVyXCIgc3R5bGU9XCJ3aWR0aDoxNHB4O2hlaWdodDoxNHB4O2JvcmRlci13aWR0aDoycHg7dmVydGljYWwtYWxpZ246bWlkZGxlO21hcmdpbi1yaWdodDo2cHg7XCI+PC9zcGFuPkxvYWRpbmcgbW9kZWxzIGZvciBzZWxlY3RlZCBwcm92aWRlci4uLic7XG4gIH1cblxuICBfc2hvd01vZGVsV2l6YXJkQnVzeSgnUXVlcnlpbmcgYXZhaWxhYmxlIG1vZGVscy4uLicpO1xuICB0cnkge1xuICAgIF9zZWxlY3RlZE1vZGVsUHJvdmlkZXJzID0gbmV3IFNldChbX21vZGVsV2l6YXJkU2VsZWN0ZWRQcm92aWRlcl0pO1xuICAgIF9tb2RlbERhdGEucHJvdmlkZXIgPSBfbW9kZWxXaXphcmRTZWxlY3RlZFByb3ZpZGVyO1xuICAgIGF3YWl0IF9yZWZyZXNoTW9kZWxDYXRhbG9nRm9yU2VsZWN0aW9uKCk7XG4gICAgaWYgKGxvYWRpbmdFbCkge1xuICAgICAgbG9hZGluZ0VsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICBsb2FkaW5nRWwudGV4dENvbnRlbnQgPSAnJztcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nLndhcm4oJ0NvdWxkIG5vdCBsb2FkIG1vZGVscyBmb3Igc2VsZWN0ZWQgcHJvdmlkZXI6JywgZXJyb3IpO1xuICAgIGlmIChsb2FkaW5nRWwpIHtcbiAgICAgIGxvYWRpbmdFbC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICBsb2FkaW5nRWwudGV4dENvbnRlbnQgPSAnRmFpbGVkIHRvIGxvYWQgbW9kZWxzIGZvciBzZWxlY3RlZCBwcm92aWRlci4nO1xuICAgICAgbG9hZGluZ0VsLnN0eWxlLmNvbG9yID0gJyNiOTFjMWMnO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZmluYWxseSB7XG4gICAgX2hpZGVNb2RlbFdpemFyZEJ1c3koKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBuZXh0V2l6YXJkU3RlcCgpIHtcbiAgaWYgKF9tb2RlbFdpemFyZFN0ZXAgPT09IDEpIHtcbiAgICBpZiAoIV9tb2RlbFdpemFyZFNlbGVjdGVkUHJvdmlkZXIpIHJldHVybjtcbiAgICBfc2V0TW9kZWxXaXphcmRTdGVwKDIpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoX21vZGVsV2l6YXJkU3RlcCA9PT0gMikge1xuICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IF9sb2FkTW9kZWxzRm9yU2VsZWN0ZWRQcm92aWRlcigpO1xuICAgIGlmICghbG9hZGVkKSByZXR1cm47XG4gICAgX3NldE1vZGVsV2l6YXJkU3RlcCgzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmV2aW91c1dpemFyZFN0ZXAoKSB7XG4gIGlmIChfbW9kZWxXaXphcmRTdGVwID09PSAyKSB7IF9zZXRNb2RlbFdpemFyZFN0ZXAoMSk7IHJldHVybjsgfVxuICBpZiAoX21vZGVsV2l6YXJkU3RlcCA9PT0gMykgeyBfc2V0TW9kZWxXaXphcmRTdGVwKDIpOyByZXR1cm47IH1cbiAgaWYgKF9tb2RlbFdpemFyZFN0ZXAgPT09IDQpIHsgX3NldE1vZGVsV2l6YXJkU3RlcCgzKTsgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBfcmVmcmVzaE1vZGVsQ2F0YWxvZ0ZvclNlbGVjdGlvbigpIHtcbiAgaWYgKCFfbW9kZWxEYXRhKSByZXR1cm47XG4gIGlmIChfY2F0YWxvZ1JlZnJlc2hpbmcpIHtcbiAgICBfY2F0YWxvZ1JlZnJlc2hQZW5kaW5nID0gdHJ1ZTtcbiAgICByZXR1cm47XG4gIH1cbiAgX2NhdGFsb2dSZWZyZXNoaW5nID0gdHJ1ZTtcblxuICB0cnkge1xuICAgIGNvbnN0IHNlbGVjdGVkID0gQXJyYXkuZnJvbShfc2VsZWN0ZWRNb2RlbFByb3ZpZGVycyk7XG4gICAgaWYgKCFzZWxlY3RlZC5sZW5ndGgpIHtcbiAgICAgIF9zZWxlY3RlZE1vZGVsUHJvdmlkZXJzID0gbmV3IFNldChbX21vZGVsRGF0YS5wcm92aWRlcl0pO1xuICAgIH1cblxuICAgIGNvbnN0IHByb3ZpZGVyc1BhcmFtID0gZW5jb2RlVVJJQ29tcG9uZW50KEFycmF5LmZyb20oX3NlbGVjdGVkTW9kZWxQcm92aWRlcnMpLmpvaW4oJywnKSk7XG4gICAgY29uc3QgY2F0YWxvZyA9IGF3YWl0IGFwaUNhbGwoJ0dFVCcsIGAvYXBpL21vZGVsLWNhdGFsb2c/cHJvdmlkZXJzPSR7cHJvdmlkZXJzUGFyYW19YCk7XG4gICAgX21vZGVsRGF0YS5hbGxfbW9kZWxzID0gY2F0YWxvZy5hbGxfbW9kZWxzIHx8IFtdO1xuICAgIF9tb2RlbERhdGEucHJpY2luZ191cGRhdGVkX2F0ID0gY2F0YWxvZy5wcmljaW5nX3VwZGF0ZWRfYXQgfHwgX21vZGVsRGF0YS5wcmljaW5nX3VwZGF0ZWRfYXQ7XG4gICAgX21vZGVsRGF0YS5wcmljaW5nX3NvdXJjZSA9IGNhdGFsb2cucHJpY2luZ19zb3VyY2UgfHwgX21vZGVsRGF0YS5wcmljaW5nX3NvdXJjZTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjYXRhbG9nLnByb3ZpZGVycykgJiYgY2F0YWxvZy5wcm92aWRlcnMubGVuZ3RoKSB7XG4gICAgICBfbW9kZWxEYXRhLnByb3ZpZGVycyA9IGNhdGFsb2cucHJvdmlkZXJzO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShjYXRhbG9nLmxpc3RfbW9kZWxzX2NhcGFibGUpKSB7XG4gICAgICBfbW9kZWxEYXRhLmxpc3RfbW9kZWxzX2NhcGFibGUgPSBjYXRhbG9nLmxpc3RfbW9kZWxzX2NhcGFibGU7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy53YXJuKCdDb3VsZCBub3QgcmVmcmVzaCBtb2RlbCBjYXRhbG9nIGZvciBzZWxlY3RlZCBwcm92aWRlcnM6JywgZXJyb3IpO1xuICB9IGZpbmFsbHkge1xuICAgIF9jYXRhbG9nUmVmcmVzaGluZyA9IGZhbHNlO1xuICB9XG5cbiAgX3JlbmRlclByb3ZpZGVyU2VsZWN0b3IoKTtcbiAgX2J1aWxkTW9kZWxUYWJsZSgpO1xuXG4gIGlmIChfY2F0YWxvZ1JlZnJlc2hQZW5kaW5nKSB7XG4gICAgX2NhdGFsb2dSZWZyZXNoUGVuZGluZyA9IGZhbHNlO1xuICAgIGF3YWl0IF9yZWZyZXNoTW9kZWxDYXRhbG9nRm9yU2VsZWN0aW9uKCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gb3Blbk1vZGVsTW9kYWwoKSB7XG4gIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtbW9kYWwtb3ZlcmxheScpO1xuICBpZiAoIW92ZXJsYXkpIHJldHVybjtcblxuICBpZiAoIV9tb2RlbERhdGEpIHtcbiAgICBhd2FpdCBsb2FkTW9kZWxTZWxlY3RvcigpO1xuICB9XG4gIGF3YWl0IGxvYWRQcm92aWRlckluZm8oKTtcbiAgaWYgKCFfbW9kZWxXaXphcmRTZWxlY3RlZFByb3ZpZGVyKSB7XG4gICAgX21vZGVsV2l6YXJkU2VsZWN0ZWRQcm92aWRlciA9IF9tb2RlbERhdGE/LnByb3ZpZGVyIHx8IG51bGw7XG4gIH1cbiAgY29uc3Qgc3VjY2Vzc1N1bW1hcnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtc3VjY2Vzcy1zdW1tYXJ5Jyk7XG4gIGlmIChzdWNjZXNzU3VtbWFyeSkge1xuICAgIHN1Y2Nlc3NTdW1tYXJ5LnRleHRDb250ZW50ID0gJ1Byb3ZpZGVyIGFuZCBtb2RlbCBhcmUgY29uZmlndXJlZCBhbmQgdGhlIGNvbm5lY3Rpb24gY2hlY2sgc3VjY2VlZGVkLic7XG4gIH1cbiAgX3JlbmRlclByb3ZpZGVyU2VsZWN0b3IoKTtcbiAgX3N5bmNDYXRhbG9nVmlzaWJpbGl0eSgpO1xuICBfd2lyZUdsb2JhbE1vZGVsU2VhcmNoKCk7XG4gIF9zZXRNb2RlbFdpemFyZFN0ZXAoMSk7XG4gIF9oaWRlTW9kZWxXaXphcmRCdXN5KCk7XG4gIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgX2ZvY3VzU3RhY2sucHVzaChkb2N1bWVudC5hY3RpdmVFbGVtZW50KTtcbiAgc2V0SW5pdGlhbEZvY3VzKCdtb2RlbC1tb2RhbC1vdmVybGF5Jyk7XG4gIHRyYXBGb2N1cygnbW9kZWwtbW9kYWwtb3ZlcmxheScpO1xufVxuXG5mdW5jdGlvbiBjbG9zZU1vZGVsTW9kYWwoKSB7XG4gIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtbW9kYWwtb3ZlcmxheScpO1xuICBpZiAob3ZlcmxheSkgb3ZlcmxheS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBfc2V0TW9kZWxXaXphcmRTdGVwKDEpO1xuICBfaGlkZU1vZGVsV2l6YXJkQnVzeSgpO1xuICBpZiAoX2NvcGlsb3RBdXRoUG9sbFRpbWVyKSB7XG4gICAgY2xlYXJJbnRlcnZhbChfY29waWxvdEF1dGhQb2xsVGltZXIpO1xuICAgIF9jb3BpbG90QXV0aFBvbGxUaW1lciA9IG51bGw7XG4gIH1cbiAgcmVzdG9yZUZvY3VzKCk7XG59XG5cbmZ1bmN0aW9uIF9hcHBseU1vZGVsUm93VmlzdWFsU3RhdGUodHIsIGlzQWN0aXZlKSB7XG4gIHRyLmNsYXNzTGlzdC50b2dnbGUoJ21vZGVsLXJvdy1hY3RpdmUnLCBpc0FjdGl2ZSk7XG4gIHRyLnN0eWxlLmNzc1RleHQgPSBpc0FjdGl2ZVxuICAgID8gJ2JhY2tncm91bmQ6I2VmZjZmZjsgZm9udC13ZWlnaHQ6NjAwOyBjdXJzb3I6cG9pbnRlcjsnXG4gICAgOiAnY3Vyc29yOnBvaW50ZXI7JztcblxuICBjb25zdCBtb2RlbCA9IHRyLmdldEF0dHJpYnV0ZSgnZGF0YS1tb2RlbCcpIHx8ICcnO1xuICBjb25zdCBtb2RlbENlbGwgPSB0ci5jZWxscyAmJiB0ci5jZWxsc1sxXTtcbiAgaWYgKG1vZGVsQ2VsbCkge1xuICAgIG1vZGVsQ2VsbC5pbm5lckhUTUwgPSBgJHtlc2NhcGVIdG1sKG1vZGVsKX1gICtcbiAgICAgIChpc0FjdGl2ZSA/ICcgPHNwYW4gc3R5bGU9XCJjb2xvcjojM2I4MmY2OyBmb250LXNpemU6MC43NWVtO1wiPiYjMTAwMDM7IGFjdGl2ZTwvc3Bhbj4nIDogJycpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9zeW5jTW9kZWxUYWJsZVNlbGVjdGlvbigpIHtcbiAgY29uc3QgdGJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtdGFibGUtYm9keScpO1xuICBpZiAoIXRib2R5IHx8ICFfbW9kZWxEYXRhKSByZXR1cm47XG5cbiAgY29uc3QgYWN0aXZlUHJvdmlkZXIgPSBfbW9kZWxEYXRhLnByb3ZpZGVyO1xuICBjb25zdCBhY3RpdmVNb2RlbCA9IF9tb2RlbERhdGEubW9kZWw7XG4gIHRib2R5LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RyJykuZm9yRWFjaCh0ciA9PiB7XG4gICAgY29uc3QgaXNBY3RpdmUgPSAoXG4gICAgICB0ci5nZXRBdHRyaWJ1dGUoJ2RhdGEtcHJvdmlkZXInKSA9PT0gYWN0aXZlUHJvdmlkZXIgJiZcbiAgICAgIHRyLmdldEF0dHJpYnV0ZSgnZGF0YS1tb2RlbCcpID09PSBhY3RpdmVNb2RlbFxuICAgICk7XG4gICAgX2FwcGx5TW9kZWxSb3dWaXN1YWxTdGF0ZSh0ciwgaXNBY3RpdmUpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gX2J1aWxkTW9kZWxUYWJsZSgpIHtcbiAgY29uc3QgdGJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtdGFibGUtYm9keScpO1xuICBjb25zdCB0aGVhZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC10YWJsZS1oZWFkJyk7XG4gIGlmICghdGJvZHkgfHwgIV9tb2RlbERhdGEpIHJldHVybjtcblxuICBjb25zdCBjdXJyZW50UHJvdmlkZXIgPSBfbW9kZWxEYXRhLnByb3ZpZGVyO1xuICBjb25zdCBjdXJyZW50TW9kZWwgICAgPSBfbW9kZWxEYXRhLm1vZGVsO1xuXG4gIC8vIEZpeGVkIDctY29sdW1uIGhlYWRlcnMgXHUyMDE0IG5vIGR5bmFtaWMgcmVidWlsZGluZyBuZWVkZWRcbiAgaWYgKHRoZWFkKSB7XG4gICAgY29uc3QgdGhTID0gJ3BhZGRpbmc6MTBweCAxNHB4OyB3aGl0ZS1zcGFjZTpub3dyYXA7JztcbiAgICB0aGVhZC5pbm5lckhUTUwgPVxuICAgICAgYDx0ciBzdHlsZT1cImJhY2tncm91bmQ6I2YxZjVmOTsgdGV4dC1hbGlnbjpsZWZ0O1wiPmAgK1xuICAgICAgICBgPHRoIHN0eWxlPVwiJHt0aFN9XCI+UHJvdmlkZXI8L3RoPmAgK1xuICAgICAgICBgPHRoIHN0eWxlPVwiJHt0aFN9XCI+TW9kZWw8L3RoPmAgK1xuICAgICAgICBgPHRoIHN0eWxlPVwiJHt0aFN9IHRleHQtYWxpZ246cmlnaHQ7XCI+Q29udGV4dDwvdGg+YCArXG4gICAgICAgIGA8dGggc3R5bGU9XCIke3RoU30gdGV4dC1hbGlnbjpyaWdodDtcIiB0aXRsZT1cIlVTRCBwZXIgMU0gaW5wdXQgdG9rZW5zIChkaXJlY3QgQVBJIGJpbGxpbmcpXCI+JC8xTSBpbjwvdGg+YCArXG4gICAgICAgIGA8dGggc3R5bGU9XCIke3RoU30gdGV4dC1hbGlnbjpyaWdodDtcIiB0aXRsZT1cIlVTRCBwZXIgMU0gb3V0cHV0IHRva2VucyAoZGlyZWN0IEFQSSBiaWxsaW5nKVwiPiQvMU0gb3V0PC90aD5gICtcbiAgICAgICAgYDx0aCBzdHlsZT1cIiR7dGhTfSB0ZXh0LWFsaWduOnJpZ2h0O1wiIHRpdGxlPVwiR2l0SHViIENvcGlsb3QgcHJlbWl1bS1yZXF1ZXN0IG11bHRpcGxpZXIgKDAgPSBmcmVlIGZvciBwYWlkIHN1YnNjcmliZXJzKVwiPkNvcGlsb3Q8L3RoPmAgK1xuICAgICAgICBgPHRoIHN0eWxlPVwiJHt0aFN9XCI+U291cmNlPC90aD5gICtcbiAgICAgICAgYDx0aCBzdHlsZT1cIiR7dGhTfVwiPk5vdGVzPC90aD5gICtcbiAgICAgIGA8L3RyPmA7XG4gIH1cblxuICAvLyBUZWFyIGRvd24gYW55IGV4aXN0aW5nIERhdGFUYWJsZSBiZWZvcmUgcmVidWlsZGluZyByb3dzLlxuICBpZiAod2luZG93LiQgJiYgJC5mbiAmJiAkLmZuLkRhdGFUYWJsZSAmJiAkLmZuLkRhdGFUYWJsZS5pc0RhdGFUYWJsZSgnI21vZGVsLXRhYmxlJykpIHtcbiAgICB0cnkge1xuICAgICAgX21vZGVsRGF0YVRhYmxlID0gJCgnI21vZGVsLXRhYmxlJykuRGF0YVRhYmxlKCk7XG4gICAgICBfbW9kZWxEYXRhVGFibGUuZGVzdHJveSgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZy53YXJuKCdEYXRhVGFibGUuZGVzdHJveSgpIGZhaWxlZCAodGFibGUgbWF5IGFscmVhZHkgYmUgdG9ybiBkb3duKTonLCBlKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgX21vZGVsRGF0YVRhYmxlID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvLyBQcmVmZXIgY3Jvc3MtcHJvdmlkZXIgbGlzdDsgZmFsbCBiYWNrIHRvIGN1cnJlbnQtcHJvdmlkZXIgYXZhaWxhYmxlIGxpc3RcbiAgbGV0IHJvd3MgPSAoX21vZGVsRGF0YS5hbGxfbW9kZWxzICYmIF9tb2RlbERhdGEuYWxsX21vZGVscy5sZW5ndGgpXG4gICAgPyBfbW9kZWxEYXRhLmFsbF9tb2RlbHMuZmlsdGVyKHIgPT4gci5tb2RlbClcbiAgICA6IChfbW9kZWxEYXRhLmF2YWlsYWJsZSB8fCBbXSkubWFwKHIgPT5cbiAgICAgICAgdHlwZW9mIHIgPT09ICdvYmplY3QnXG4gICAgICAgICAgPyB7IC4uLnIsIHByb3ZpZGVyOiBjdXJyZW50UHJvdmlkZXIgfVxuICAgICAgICAgIDogeyBtb2RlbDogciwgcHJvdmlkZXI6IGN1cnJlbnRQcm92aWRlciB9XG4gICAgICApO1xuXG4gIF9yZW5kZXJRdWlja01vZGVsTGlzdChyb3dzKTtcbiAgdGJvZHkuaW5uZXJIVE1MID0gJyc7XG4gIGNvbnN0IHRkQmFzZSAgPSAncGFkZGluZzo5cHggMTRweDsgYm9yZGVyLWJvdHRvbToxcHggc29saWQgI2UyZThmMDsnO1xuICBjb25zdCBmbXRDb3N0ID0gdiA9PiAodiAhPSBudWxsKSA/ICckJyArIE51bWJlcih2KS50b0ZpeGVkKHYgPCAxID8gMyA6IDIpIDogJ1x1MjAxNCc7XG4gIGNvbnN0IGZtdFByaWNlSGludCA9IHNvdXJjZSA9PiB7XG4gICAgaWYgKHNvdXJjZSA9PT0gJ3J1bnRpbWVfY2FjaGUnKSB7XG4gICAgICByZXR1cm4gJzxzcGFuIHRpdGxlPVwiUHJpY2UgZnJvbSBydW50aW1lIGNhY2hlXCIgc3R5bGU9XCJtYXJnaW4tbGVmdDo2cHg7IGRpc3BsYXk6aW5saW5lLWJsb2NrOyBwYWRkaW5nOjFweCA1cHg7IGJvcmRlci1yYWRpdXM6OTk5cHg7IGJhY2tncm91bmQ6I2VjZmVmZjsgY29sb3I6IzBmNzY2ZTsgZm9udC1zaXplOjAuNzJlbTsgZm9udC13ZWlnaHQ6NjAwOyB2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7XCI+Y2FjaGU8L3NwYW4+JztcbiAgICB9XG4gICAgcmV0dXJuICc8c3BhbiB0aXRsZT1cIlByaWNlIGZyb20gc3RhdGljIGJhc2VsaW5lXCIgc3R5bGU9XCJtYXJnaW4tbGVmdDo2cHg7IGRpc3BsYXk6aW5saW5lLWJsb2NrOyBwYWRkaW5nOjFweCA1cHg7IGJvcmRlci1yYWRpdXM6OTk5cHg7IGJhY2tncm91bmQ6I2Y4ZmFmYzsgY29sb3I6IzY0NzQ4YjsgZm9udC1zaXplOjAuNzJlbTsgZm9udC13ZWlnaHQ6NjAwOyB2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7XCI+c3RhdGljPC9zcGFuPic7XG4gIH07XG4gIGNvbnN0IGZtdFNvdXJjZSA9IHMgPT4ge1xuICAgIGlmIChzID09PSAnbGlzdF9tb2RlbHMnKSB7XG4gICAgICByZXR1cm4gJzxzcGFuIHN0eWxlPVwiZGlzcGxheTppbmxpbmUtYmxvY2s7IHBhZGRpbmc6MnB4IDZweDsgYm9yZGVyLXJhZGl1czo5OTlweDsgYmFja2dyb3VuZDojZWNmZWZmOyBjb2xvcjojMGY3NjZlOyBmb250LXNpemU6MC43OGVtOyBmb250LXdlaWdodDo2MDA7XCI+bGlzdF9tb2RlbHM8L3NwYW4+JztcbiAgICB9XG4gICAgcmV0dXJuICc8c3BhbiBzdHlsZT1cImRpc3BsYXk6aW5saW5lLWJsb2NrOyBwYWRkaW5nOjJweCA2cHg7IGJvcmRlci1yYWRpdXM6OTk5cHg7IGJhY2tncm91bmQ6I2YxZjVmOTsgY29sb3I6IzQ3NTU2OTsgZm9udC1zaXplOjAuNzhlbTsgZm9udC13ZWlnaHQ6NjAwO1wiPmZhbGxiYWNrX3N0YXRpYzwvc3Bhbj4nO1xuICB9O1xuICBjb25zdCBmbXRNdWx0ID0gdiA9PiB7XG4gICAgaWYgKHYgPT0gbnVsbCkgcmV0dXJuICdcdTIwMTQnO1xuICAgIGlmICh2ID09PSAwKSAgIHJldHVybiAnPHNwYW4gc3R5bGU9XCJjb2xvcjojMTZhMzRhOyBmb250LXdlaWdodDo2MDA7XCI+ZnJlZTwvc3Bhbj4nO1xuICAgIHJldHVybiBOdW1iZXIodikudG9GaXhlZCh2ICUgMSA9PT0gMCA/IDAgOiAyKSArICcmdGltZXM7JztcbiAgfTtcblxuICByb3dzLmZvckVhY2goaXRlbSA9PiB7XG4gICAgY29uc3QgcHJvdmlkZXIgICA9IGl0ZW0ucHJvdmlkZXIgfHwgY3VycmVudFByb3ZpZGVyO1xuICAgIGNvbnN0IG0gICAgICAgICAgPSBpdGVtLm1vZGVsO1xuICAgIGNvbnN0IGN0eCAgICAgICAgPSBpdGVtLmNvbnRleHRfd2luZG93ID8gTnVtYmVyKGl0ZW0uY29udGV4dF93aW5kb3cpLnRvTG9jYWxlU3RyaW5nKCkgOiAnXHUyMDE0JztcbiAgICBjb25zdCBzb3VyY2UgICAgID0gaXRlbS5zb3VyY2UgfHwgJ2ZhbGxiYWNrX3N0YXRpYyc7XG4gICAgY29uc3QgcHJpY2VTb3VyY2UgPSBpdGVtLnByaWNlX3NvdXJjZSB8fCAnc3RhdGljX2Jhc2VsaW5lJztcbiAgICBjb25zdCBub3RlcyAgICAgID0gaXRlbS5ub3RlcyB8fCAnJztcbiAgICBjb25zdCBpc1NlbGVjdGVkID0gKHByb3ZpZGVyID09PSBjdXJyZW50UHJvdmlkZXIgJiYgbSA9PT0gY3VycmVudE1vZGVsKTtcblxuICAgIGNvbnN0IHRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTtcbiAgICB0ci5zZXRBdHRyaWJ1dGUoJ2RhdGEtcHJvdmlkZXInLCBwcm92aWRlcik7XG4gICAgdHIuc2V0QXR0cmlidXRlKCdkYXRhLW1vZGVsJywgbSk7XG4gICAgX2FwcGx5TW9kZWxSb3dWaXN1YWxTdGF0ZSh0ciwgaXNTZWxlY3RlZCk7XG4gICAgdHIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgKCkgPT4ge1xuICAgICAgaWYgKCF0ci5jbGFzc0xpc3QuY29udGFpbnMoJ21vZGVsLXJvdy1hY3RpdmUnKSkgdHIuc3R5bGUuYmFja2dyb3VuZCA9ICcjZjhmYWZjJztcbiAgICB9KTtcbiAgICB0ci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsICgpID0+IHtcbiAgICAgIGlmICghdHIuY2xhc3NMaXN0LmNvbnRhaW5zKCdtb2RlbC1yb3ctYWN0aXZlJykpIHRyLnN0eWxlLmJhY2tncm91bmQgPSAnJztcbiAgICB9KTtcblxuICAgIHRyLmlubmVySFRNTCA9XG4gICAgICBgPHRkIHN0eWxlPVwiJHt0ZEJhc2V9IGNvbG9yOiM2NDc0OGI7IHdoaXRlLXNwYWNlOm5vd3JhcDtcIj4ke2VzY2FwZUh0bWwoX3Byb3ZpZGVyRGlzcGxheUxhYmVsKHByb3ZpZGVyKSl9PC90ZD5gICtcbiAgICAgIGA8dGQgc3R5bGU9XCIke3RkQmFzZX1cIj4ke2VzY2FwZUh0bWwobSl9PC90ZD5gICtcbiAgICAgIGA8dGQgc3R5bGU9XCIke3RkQmFzZX0gd2hpdGUtc3BhY2U6bm93cmFwOyB0ZXh0LWFsaWduOnJpZ2h0OyBmb250LXZhcmlhbnQtbnVtZXJpYzp0YWJ1bGFyLW51bXM7XCI+JHtjdHh9PC90ZD5gICtcbiAgICAgIGA8dGQgc3R5bGU9XCIke3RkQmFzZX0gdGV4dC1hbGlnbjpyaWdodDsgZm9udC12YXJpYW50LW51bWVyaWM6dGFidWxhci1udW1zOyB3aGl0ZS1zcGFjZTpub3dyYXA7XCI+JHtmbXRDb3N0KGl0ZW0uY29zdF9pbnB1dCl9JHtmbXRQcmljZUhpbnQocHJpY2VTb3VyY2UpfTwvdGQ+YCArXG4gICAgICBgPHRkIHN0eWxlPVwiJHt0ZEJhc2V9IHRleHQtYWxpZ246cmlnaHQ7IGZvbnQtdmFyaWFudC1udW1lcmljOnRhYnVsYXItbnVtczsgd2hpdGUtc3BhY2U6bm93cmFwO1wiPiR7Zm10Q29zdChpdGVtLmNvc3Rfb3V0cHV0KX0ke2ZtdFByaWNlSGludChwcmljZVNvdXJjZSl9PC90ZD5gICtcbiAgICAgIGA8dGQgc3R5bGU9XCIke3RkQmFzZX0gdGV4dC1hbGlnbjpyaWdodDsgZm9udC12YXJpYW50LW51bWVyaWM6dGFidWxhci1udW1zOyB3aGl0ZS1zcGFjZTpub3dyYXA7XCI+JHtmbXRNdWx0KGl0ZW0uY29waWxvdF9tdWx0aXBsaWVyKX08L3RkPmAgK1xuICAgICAgYDx0ZCBzdHlsZT1cIiR7dGRCYXNlfSB3aGl0ZS1zcGFjZTpub3dyYXA7XCI+JHtmbXRTb3VyY2Uoc291cmNlKX08L3RkPmAgK1xuICAgICAgYDx0ZCBzdHlsZT1cIiR7dGRCYXNlfSBjb2xvcjojNjQ3NDhiO1wiPiR7ZXNjYXBlSHRtbChub3Rlcyl9PC90ZD5gO1xuICAgIHRib2R5LmFwcGVuZENoaWxkKHRyKTtcbiAgfSk7XG5cbiAgLy8gUmViaW5kIHJvdyBjbGljayB1c2luZyBkZWxlZ2F0aW9uIHNvIHNvcnRpbmcvZmlsdGVyIHJlZHJhd3Mgc3RpbGwgd29yay5cbiAgdGJvZHkub25jbGljayA9IGFzeW5jIChldmVudCkgPT4ge1xuICAgIGNvbnN0IHRyID0gZXZlbnQudGFyZ2V0LmNsb3Nlc3QoJ3RyJyk7XG4gICAgaWYgKCF0cikgcmV0dXJuO1xuICAgIGNvbnN0IHByb3ZpZGVyID0gdHIuZ2V0QXR0cmlidXRlKCdkYXRhLXByb3ZpZGVyJyk7XG4gICAgY29uc3QgbW9kZWwgPSB0ci5nZXRBdHRyaWJ1dGUoJ2RhdGEtbW9kZWwnKTtcbiAgICBpZiAoIW1vZGVsKSByZXR1cm47XG5cbiAgICAvLyBJbW1lZGlhdGUgZmVlZGJhY2sgd2hpbGUgdGhlIEFQSSBjYWxsIGlzIGluLWZsaWdodFxuICAgIHRyLnN0eWxlLmNzc1RleHQgPSAnYmFja2dyb3VuZDojZmVmM2M3OyBjdXJzb3I6d2FpdDsgb3BhY2l0eTowLjg1Oyc7XG4gICAgY29uc3QgbW9kZWxDZWxsID0gdHIuY2VsbHMgJiYgdHIuY2VsbHNbMV07XG4gICAgaWYgKG1vZGVsQ2VsbCkge1xuICAgICAgbW9kZWxDZWxsLmlubmVySFRNTCA9XG4gICAgICAgIGA8c3BhbiBjbGFzcz1cImxvYWRpbmctc3Bpbm5lclwiIHN0eWxlPVwid2lkdGg6MTRweDtoZWlnaHQ6MTRweDtib3JkZXItd2lkdGg6MnB4O3ZlcnRpY2FsLWFsaWduOm1pZGRsZTttYXJnaW4tcmlnaHQ6NnB4O1wiPjwvc3Bhbj4ke2VzY2FwZUh0bWwobW9kZWwpfWA7XG4gICAgfVxuICAgIGNvbnN0IHN0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC10ZXN0LXN0YXR1cycpO1xuICAgIGlmIChzdGF0dXMpIHtcbiAgICAgIHN0YXR1cy5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICBzdGF0dXMuc3R5bGUuY29sb3IgICA9ICcjOTI0MDBlJztcbiAgICAgIHN0YXR1cy5pbm5lckhUTUwgICAgID1cbiAgICAgICAgYDxzcGFuIGNsYXNzPVwibG9hZGluZy1zcGlubmVyXCIgc3R5bGU9XCJ3aWR0aDoxNHB4O2hlaWdodDoxNHB4O2JvcmRlci13aWR0aDoycHg7dmVydGljYWwtYWxpZ246bWlkZGxlO21hcmdpbi1yaWdodDo2cHg7XCI+PC9zcGFuPiBTd2l0Y2hpbmcgdG8gJHtlc2NhcGVIdG1sKG1vZGVsKX1cXHUyMDI2YDtcbiAgICB9XG5cbiAgICBhd2FpdCBzZXRNb2RlbChtb2RlbCwgcHJvdmlkZXIpO1xuICB9O1xuXG4gIC8vIEVuaGFuY2Ugd2l0aCBEYXRhVGFibGVzIGZvciBzb3J0aW5nL3NlYXJjaGluZzsga2VlcCBwYWdpbmcgZGlzYWJsZWQuXG4gIGlmICh3aW5kb3cuJCAmJiAkLmZuICYmICQuZm4uRGF0YVRhYmxlKSB7XG4gICAgX21vZGVsRGF0YVRhYmxlID0gJCgnI21vZGVsLXRhYmxlJykuRGF0YVRhYmxlKHtcbiAgICAgIHBhZ2luZzogZmFsc2UsXG4gICAgICBzZWFyY2hpbmc6IHRydWUsXG4gICAgICBpbmZvOiBmYWxzZSxcbiAgICAgIG9yZGVyQ2VsbHNUb3A6IHRydWUsXG4gICAgICBvcmRlcjogW1swLCAnYXNjJ10sIFsxLCAnYXNjJ11dLFxuICAgICAgYXV0b1dpZHRoOiBmYWxzZSxcbiAgICAgIGxhbmd1YWdlOiB7IHNlYXJjaDogJ0ZpbHRlcjonIH0sXG4gICAgICBpbml0Q29tcGxldGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICBjb25zdCBhcGkgPSB0aGlzLmFwaSgpO1xuICAgICAgICBjb25zdCAkdGhlYWQgPSAkKCcjbW9kZWwtdGFibGUgdGhlYWQnKTtcbiAgICAgICAgY29uc3QgaGFzRmlsdGVyUm93ID0gJHRoZWFkLmZpbmQoJ3RyLm1vZGVsLWZpbHRlci1yb3cnKS5sZW5ndGggPiAwO1xuICAgICAgICBpZiAoIWhhc0ZpbHRlclJvdykge1xuICAgICAgICAgIGNvbnN0ICRmaWx0ZXJSb3cgPSAkKCc8dHIgY2xhc3M9XCJtb2RlbC1maWx0ZXItcm93XCI+PC90cj4nKTtcbiAgICAgICAgICBhcGkuY29sdW1ucygpLmV2ZXJ5KGZ1bmN0aW9uKGNvbElkeCkge1xuICAgICAgICAgICAgY29uc3QgdGl0bGUgPSAkKGFwaS5jb2x1bW4oY29sSWR4KS5oZWFkZXIoKSkudGV4dCgpLnRyaW0oKTtcbiAgICAgICAgICAgIGNvbnN0ICR0aCA9ICQoJzx0aCBzdHlsZT1cInBhZGRpbmc6NnB4IDEwcHg7IGJhY2tncm91bmQ6I2Y4ZmFmYzsgYm9yZGVyLXRvcDoxcHggc29saWQgI2UyZThmMDtcIj48L3RoPicpO1xuICAgICAgICAgICAgY29uc3QgJGlucHV0ID0gJCgnPGlucHV0PicsIHtcbiAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogdGl0bGUsXG4gICAgICAgICAgICAgIHN0eWxlOiAnd2lkdGg6MTAwJTsgcGFkZGluZzo0cHggNnB4OyBib3JkZXI6MXB4IHNvbGlkICNjYmQ1ZTE7IGJvcmRlci1yYWRpdXM6NHB4OyBmb250LXNpemU6MC44MmVtOycsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICR0aC5hcHBlbmQoJGlucHV0KTtcbiAgICAgICAgICAgICRmaWx0ZXJSb3cuYXBwZW5kKCR0aCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgJHRoZWFkLmFwcGVuZCgkZmlsdGVyUm93KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFwaS5jb2x1bW5zKCkuZXZlcnkoZnVuY3Rpb24oY29sSWR4KSB7XG4gICAgICAgICAgY29uc3QgJGlucHV0ID0gJCgnI21vZGVsLXRhYmxlIHRoZWFkIHRyLm1vZGVsLWZpbHRlci1yb3cgdGgnKS5lcShjb2xJZHgpLmZpbmQoJ2lucHV0Jyk7XG4gICAgICAgICAgaWYgKCEkaW5wdXQubGVuZ3RoKSByZXR1cm47XG4gICAgICAgICAgJGlucHV0Lm9mZignY2xpY2subW9kZWxGaWx0ZXIga2V5dXAubW9kZWxGaWx0ZXIgY2hhbmdlLm1vZGVsRmlsdGVyJyk7XG4gICAgICAgICAgJGlucHV0Lm9uKCdjbGljay5tb2RlbEZpbHRlcicsIGZ1bmN0aW9uKGV2ZW50KSB7IGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyB9KTtcbiAgICAgICAgICAkaW5wdXQub24oJ2tleXVwLm1vZGVsRmlsdGVyIGNoYW5nZS5tb2RlbEZpbHRlcicsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgICAgICAgICAgaWYgKGFwaS5jb2x1bW4oY29sSWR4KS5zZWFyY2goKSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgICAgYXBpLmNvbHVtbihjb2xJZHgpLnNlYXJjaCh2YWx1ZSkuZHJhdygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBfc3luY01vZGVsVGFibGVTZWxlY3Rpb24oKTtcblxuICAvLyBVcGRhdGUgcHJpY2luZyBmcmVzaG5lc3MgZm9vdGVyXG4gIF91cGRhdGVQcmljaW5nRm9vdGVyKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldE1vZGVsKG1vZGVsLCBwcm92aWRlcikge1xuICBpZiAoIW1vZGVsKSByZXR1cm47XG4gIF9zaG93TW9kZWxXaXphcmRCdXN5KGBBcHBseWluZyBtb2RlbCAke21vZGVsfS4uLmApO1xuICB0cnkge1xuICAgIGNvbnN0IHBheWxvYWQgPSBwcm92aWRlciA/IHsgbW9kZWwsIHByb3ZpZGVyIH0gOiB7IG1vZGVsIH07XG4gICAgYXdhaXQgYXBpQ2FsbCgnUE9TVCcsICcvYXBpL21vZGVsJywgcGF5bG9hZCk7XG4gICAgaWYgKF9tb2RlbERhdGEpIHtcbiAgICAgIF9tb2RlbERhdGEubW9kZWwgPSBtb2RlbDtcbiAgICAgIGlmIChwcm92aWRlcikgX21vZGVsRGF0YS5wcm92aWRlciA9IHByb3ZpZGVyO1xuICAgIH1cbiAgICBjb25zdCBlZmZlY3RpdmVQcm92aWRlciA9IChfbW9kZWxEYXRhICYmIF9tb2RlbERhdGEucHJvdmlkZXIpIHx8IHByb3ZpZGVyO1xuICAgIGNvbnN0IGxhYmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLWN1cnJlbnQtbGFiZWwnKTtcbiAgICBpZiAobGFiZWwpIHtcbiAgICAgIGxhYmVsLnRleHRDb250ZW50ID0gZWZmZWN0aXZlUHJvdmlkZXIgPyBgJHtlZmZlY3RpdmVQcm92aWRlcn0gXHUwMEI3ICR7bW9kZWx9YCA6IG1vZGVsO1xuICAgIH1cbiAgICBfYXBwZW5kUmVjZW50TW9kZWwoZWZmZWN0aXZlUHJvdmlkZXIsIG1vZGVsKTtcbiAgICBfc3luY01vZGVsVGFibGVTZWxlY3Rpb24oKTtcbiAgICBfcmVuZGVyUXVpY2tNb2RlbExpc3QoKF9tb2RlbERhdGEgJiYgX21vZGVsRGF0YS5hbGxfbW9kZWxzKSB8fCBbXSk7XG4gICAgX3VwZGF0ZUxsbVN0YXR1c1BpbGwoJ2NvbmZpZ3VyZWQnLCBgJHtlZmZlY3RpdmVQcm92aWRlciB8fCAnUHJvdmlkZXInfSBjb25maWd1cmVkYCk7XG5cbiAgICBfc2F2ZU1vZGVsUHJlZnNUb1N0b3JhZ2Uoe1xuICAgICAgY3VycmVudE1vZGVsUHJvdmlkZXI6IGVmZmVjdGl2ZVByb3ZpZGVyIHx8IG51bGwsXG4gICAgICBjdXJyZW50TW9kZWxOYW1lOiBtb2RlbCB8fCBudWxsLFxuICAgIH0pO1xuICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcy51cGRhdGVBdXRoQmFkZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGdsb2JhbFRoaXMudXBkYXRlQXV0aEJhZGdlKHt9LCBlZmZlY3RpdmVQcm92aWRlciB8fCBudWxsKTtcbiAgICB9XG4gICAgYXdhaXQgX3JlZnJlc2hDb3BpbG90QXV0aFN0YXR1cygpO1xuICAgIGF3YWl0IHRlc3RDdXJyZW50TW9kZWwoKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZy5lcnJvcignRmFpbGVkIHRvIHN3aXRjaCBtb2RlbDonLCBlKTtcbiAgICBjb25zdCBtc2cgPSBlLm1lc3NhZ2UgfHwgU3RyaW5nKGUpO1xuICAgIF9zeW5jTW9kZWxUYWJsZVNlbGVjdGlvbigpO1xuICAgIGNvbnN0IHN0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC10ZXN0LXN0YXR1cycpO1xuICAgIGlmIChzdGF0dXMpIHtcbiAgICAgIHN0YXR1cy5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICBzdGF0dXMuc3R5bGUuY29sb3IgPSAnI2RjMjYyNic7XG4gICAgICBzdGF0dXMudGV4dENvbnRlbnQgPSBgXHUyNzRDICR7bXNnfWA7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgYXBwZW5kTWVzc2FnZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgYFx1Mjc0QyBNb2RlbCBzd2l0Y2ggZmFpbGVkOiAke21zZ31gKTtcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgX2hpZGVNb2RlbFdpemFyZEJ1c3koKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiB0ZXN0Q3VycmVudE1vZGVsKCkge1xuICAvLyBVcGRhdGUgYm90aCB0aGUgaGVhZGVyIGJhZGdlIGFuZCB0aGUgbW9kYWwgc3RhdHVzIGxpbmVcbiAgY29uc3QgYmFkZ2UgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLXRlc3QtYmFkZ2UnKTtcbiAgY29uc3Qgc3RhdHVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVsLXRlc3Qtc3RhdHVzJyk7XG4gIGNvbnN0IGJ0biAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC10ZXN0LWJ0bicpO1xuXG4gIGNvbnN0IFNQSU4gPSAnXHUyM0YzJztcbiAgY29uc3QgT0sgICA9ICdcdTI3MDUnO1xuICBjb25zdCBGQUlMID0gJ1x1Mjc0Qyc7XG5cbiAgY29uc3Qgc2V0UnVubmluZyA9ICgpID0+IHtcbiAgICBpZiAoYmFkZ2UpICB7IGJhZGdlLnRleHRDb250ZW50ICA9IFNQSU47IGJhZGdlLnN0eWxlLmRpc3BsYXkgID0gJyc7IGJhZGdlLnRpdGxlICA9ICdUZXN0aW5nXHUyMDI2JzsgfVxuICAgIGlmIChzdGF0dXMpIHsgc3RhdHVzLmlubmVySFRNTCAgID0gYCR7U1BJTn0gVGVzdGluZyBjb25uZWN0aW9uXHUyMDI2YDsgc3RhdHVzLnN0eWxlLmRpc3BsYXkgPSAnJzsgfVxuICAgIGlmIChidG4pICAgIHsgYnRuLmRpc2FibGVkID0gdHJ1ZTsgYnRuLnRleHRDb250ZW50ID0gJ1x1MjNGMyBUZXN0aW5nXHUyMDI2JzsgfVxuICAgIF91cGRhdGVMbG1TdGF0dXNQaWxsKCdjb25uZWN0aW5nJywgJ0Nvbm5lY3RpbmdcdTIwMjYnLCAnXHUyOUQ3Jyk7XG4gIH07XG5cbiAgY29uc3Qgc2V0T2sgPSAobGF0ZW5jeU1zKSA9PiB7XG4gICAgY29uc3QgdGlwID0gYENvbm5lY3RlZCBcdTIwMTQgJHtsYXRlbmN5TXN9bXNgO1xuICAgIGlmIChiYWRnZSkgIHsgYmFkZ2UudGV4dENvbnRlbnQgID0gT0s7ICBiYWRnZS5zdHlsZS5kaXNwbGF5ICA9ICcnOyBiYWRnZS50aXRsZSAgPSB0aXA7IH1cbiAgICBpZiAoc3RhdHVzKSB7IHN0YXR1cy5pbm5lckhUTUwgICA9IGAke09LfSAke3RpcH1gOyBzdGF0dXMuc3R5bGUuY29sb3IgPSAnIzE2YTM0YSc7IHN0YXR1cy5zdHlsZS5kaXNwbGF5ID0gJyc7IH1cbiAgICBpZiAoYnRuKSAgICB7IGJ0bi5kaXNhYmxlZCA9IGZhbHNlOyBidG4uaW5uZXJIVE1MID0gJyYjMTAwMDM7IFRlc3QgY29ubmVjdGlvbic7IH1cbiAgICBfdXBkYXRlTGxtU3RhdHVzUGlsbCgnY29ubmVjdGVkJywgYEhlYWx0aHkgKCR7bGF0ZW5jeU1zfW1zKWAsICdcdTI3MTMnKTtcbiAgICBjb25zdCBzdWNjZXNzU3VtbWFyeSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbC1zdWNjZXNzLXN1bW1hcnknKTtcbiAgICBpZiAoc3VjY2Vzc1N1bW1hcnkpIHtcbiAgICAgIHN1Y2Nlc3NTdW1tYXJ5LnRleHRDb250ZW50ID0gYENvbm5lY3Rpb24gdmVyaWZpZWQgaW4gJHtsYXRlbmN5TXN9bXMuIFlvdSBjYW4gY2xvc2UgdGhlIHdpemFyZCBhbmQgY29udGludWUuYDtcbiAgICB9XG4gICAgX3NldE1vZGVsV2l6YXJkU3RlcCg0KTtcbiAgfTtcblxuICBjb25zdCBzZXRGYWlsID0gKGVyck1zZykgPT4ge1xuICAgIGlmIChiYWRnZSkgIHsgYmFkZ2UudGV4dENvbnRlbnQgID0gRkFJTDsgYmFkZ2Uuc3R5bGUuZGlzcGxheSAgPSAnJzsgYmFkZ2UudGl0bGUgID0gZXJyTXNnOyB9XG4gICAgaWYgKHN0YXR1cykge1xuICAgICAgc3RhdHVzLmlubmVySFRNTCAgID0gYCR7RkFJTH0gPHNwYW4gdGl0bGU9XCIke2Vyck1zZy5yZXBsYWNlKC9cIi9nLCAnJnF1b3Q7Jyl9XCIgc3R5bGU9XCJjdXJzb3I6aGVscDsgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZSBkb3R0ZWQ7XCI+Q29ubmVjdGlvbiBmYWlsZWQ8L3NwYW4+YDtcbiAgICAgIHN0YXR1cy5zdHlsZS5jb2xvciA9ICcjZGMyNjI2JztcbiAgICAgIHN0YXR1cy5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgfVxuICAgIGlmIChidG4pICAgIHsgYnRuLmRpc2FibGVkID0gZmFsc2U7IGJ0bi5pbm5lckhUTUwgPSAnJiMxMDAwMzsgVGVzdCBjb25uZWN0aW9uJzsgfVxuICAgIF91cGRhdGVMbG1TdGF0dXNQaWxsKCdlcnJvcicsICdDb25uZWN0aW9uIGZhaWxlZCcsICdcdTI2QTAnLCBlcnJNc2cpO1xuICAgIGlmIChfbW9kZWxXaXphcmRTdGVwID09PSAzKSB7XG4gICAgICBfc2V0TW9kZWxXaXphcmRTdGVwKDIpO1xuICAgIH1cbiAgfTtcblxuICBzZXRSdW5uaW5nKCk7XG4gIF9zaG93TW9kZWxXaXphcmRCdXN5KCdUZXN0aW5nIG1vZGVsIGNvbm5lY3Rpb24uLi4nKTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhcGlDYWxsKCdQT1NUJywgJy9hcGkvbW9kZWwvdGVzdCcpO1xuICAgIGlmIChyZXN1bHQub2spIHtcbiAgICAgIHNldE9rKHJlc3VsdC5sYXRlbmN5X21zKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBzZXRGYWlsKHJlc3VsdC5lcnJvciB8fCAnVW5rbm93biBlcnJvcicpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHNldEZhaWwoZS5tZXNzYWdlIHx8IFN0cmluZyhlKSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGZpbmFsbHkge1xuICAgIF9oaWRlTW9kZWxXaXphcmRCdXN5KCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX3VwZGF0ZVByaWNpbmdGb290ZXIoKSB7XG4gIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ByaWNpbmctdXBkYXRlZC1sYWJlbCcpO1xuICBpZiAoIWVsIHx8ICFfbW9kZWxEYXRhKSByZXR1cm47XG4gIGNvbnN0IHRzICAgICA9IF9tb2RlbERhdGEucHJpY2luZ191cGRhdGVkX2F0O1xuICBjb25zdCBzb3VyY2UgPSBfbW9kZWxEYXRhLnByaWNpbmdfc291cmNlO1xuXG4gIGNvbnN0IHNvdXJjZUxhYmVsID0gKHNvdXJjZSA9PT0gJ29wZW5yb3V0ZXInKVxuICAgID8gJzxhIGhyZWY9XCJodHRwczovL29wZW5yb3V0ZXIuYWlcIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lclwiICcgK1xuICAgICAgJ3N0eWxlPVwiY29sb3I6aW5oZXJpdDsgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZSBkb3R0ZWQ7XCI+T3BlblJvdXRlcjwvYT4nXG4gICAgOiAnc3RhdGljIGJhc2VsaW5lIChNYXJjaCAyMDI2KSc7XG5cbiAgaWYgKCF0cykgeyBlbC5pbm5lckhUTUwgPSBgUHJpY2VzOiAke3NvdXJjZUxhYmVsfWA7IHJldHVybjsgfVxuICB0cnkge1xuICAgIGNvbnN0IGQgICA9IG5ldyBEYXRlKHRzKTtcbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgIGNvbnN0IGggICA9IE1hdGgucm91bmQoKG5vdyAtIGQpIC8gM182MDBfMDAwKTtcbiAgICBjb25zdCBhZ2UgPSBoIDwgMSA/ICdqdXN0IG5vdycgOiBoIDwgMjQgPyBgJHtofWggYWdvYCA6IGAke01hdGgucm91bmQoaCAvIDI0KX1kIGFnb2A7XG4gICAgZWwuaW5uZXJIVE1MID0gYFByaWNlcyB2aWEgJHtzb3VyY2VMYWJlbH0gJm1pZGRvdDsgdXBkYXRlZCAke2FnZX1gO1xuICB9IGNhdGNoIHsgZWwuaW5uZXJIVE1MID0gYFByaWNlczogJHtzb3VyY2VMYWJlbH1gOyB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlZnJlc2hNb2RlbFByaWNpbmcoKSB7XG4gIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcmljaW5nLXJlZnJlc2gtYnRuJyk7XG4gIGNvbnN0IGxibCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcmljaW5nLXVwZGF0ZWQtbGFiZWwnKTtcbiAgaWYgKGJ0bikgeyBidG4uZGlzYWJsZWQgPSB0cnVlOyBidG4udGV4dENvbnRlbnQgPSAnUmVmcmVzaGluZ1x1MjAyNic7IH1cbiAgX3Nob3dNb2RlbFdpemFyZEJ1c3koJ1JlZnJlc2hpbmcgbW9kZWwgcHJpY2luZy4uLicpO1xuICB0cnkge1xuICAgIGF3YWl0IGFwaUNhbGwoJ1BPU1QnLCAnL2FwaS9tb2RlbC1wcmljaW5nL3JlZnJlc2gnKTtcbiAgICAvLyBSZS1mZXRjaCBtb2RlbCBkYXRhIHNvIHRoZSB0YWJsZSBnZXRzIGZyZXNoIHByaWNlc1xuICAgIF9tb2RlbERhdGEgPSBhd2FpdCBhcGlDYWxsKCdHRVQnLCAnL2FwaS9tb2RlbCcpO1xuICAgIF9idWlsZE1vZGVsVGFibGUoKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmIChsYmwpIGxibC50ZXh0Q29udGVudCA9ICdSZWZyZXNoIGZhaWxlZCc7XG4gICAgbG9nLmVycm9yKCdQcmljaW5nIHJlZnJlc2ggZmFpbGVkOicsIGUpO1xuICB9IGZpbmFsbHkge1xuICAgIF9oaWRlTW9kZWxXaXphcmRCdXN5KCk7XG4gICAgaWYgKGJ0bikgeyBidG4uZGlzYWJsZWQgPSBmYWxzZTsgYnRuLnRleHRDb250ZW50ID0gJ1x1MjFCQiBSZWZyZXNoIHByaWNlcyc7IH1cbiAgfVxufVxuXG5cbi8vIEhlbHBlcjogdXBkYXRlIHdvcmtmbG93IHN0ZXAgYmFyIGNsaWNrYWJsZSBzdGF0ZVxuZnVuY3Rpb24gdXBkYXRlV29ya2Zsb3dTdGVwc0NsaWNrYWJsZShjdXJyZW50UGhhc2UpIHtcbiAgLy8gU2VxdWVudGlhbCBwcmUtbGF5b3V0IHN0ZXBzIHVubG9jayBvbmUtYnktb25lIGFzIHRoZSB1c2VyIHByb2dyZXNzZXMuXG4gIGNvbnN0IHNlcXVlbnRpYWxTdGVwcyA9IFtcbiAgICAnc3RlcC1qb2InLFxuICAgICdzdGVwLWFuYWx5c2lzJyxcbiAgICAnc3RlcC1jdXN0b21pemF0aW9ucycsXG4gICAgJ3N0ZXAtcmV3cml0ZScsXG4gICAgJ3N0ZXAtc3BlbGwnLFxuICAgICdzdGVwLWxheW91dCcsXG4gIF07XG4gIC8vIFBvc3QtbGF5b3V0IHN0ZXBzIGFsbCB1bmxvY2sgc2ltdWx0YW5lb3VzbHkgb25jZSBsYXlvdXQgaXMgY29uZmlybWVkLlxuICBjb25zdCBwb3N0TGF5b3V0U3RlcHMgPSBbXG4gICAgJ3N0ZXAtZG93bmxvYWQnLFxuICAgICdzdGVwLWNvdmVyX2xldHRlcicsXG4gICAgJ3N0ZXAtc2NyZWVuaW5nJyxcbiAgICAnc3RlcC1pbnRlcnZpZXdfcHJlcCcsXG4gICAgJ3N0ZXAtdGhhbmtfeW91JyxcbiAgICAnc3RlcC1oYXJ2ZXN0JyxcbiAgXTtcbiAgLy8gTWFwIGJhY2tlbmQgcGhhc2Ugc3RyaW5ncyB0byBob3cgbWFueSBzZXF1ZW50aWFsIHN0ZXBzIGFyZSB1bmxvY2tlZCAoMC1iYXNlZCBpbmRleCkuXG4gIGNvbnN0IHBoYXNlVG9JbmRleCA9IHtcbiAgICAnaW5pdCc6ICAgICAgICAgICAgIDAsXG4gICAgJ2pvYl9hbmFseXNpcyc6ICAgICAxLFxuICAgICdjdXN0b21pemF0aW9uJzogICAgMixcbiAgICAncmV3cml0ZV9yZXZpZXcnOiAgIDMsXG4gICAgJ3NwZWxsX2NoZWNrJzogICAgICA0LFxuICAgICdnZW5lcmF0aW9uJzogICAgICAgNSxcbiAgICAnbGF5b3V0X3Jldmlldyc6ICAgIDUsXG4gICAgJ2ZpbmFsX2dlbmVyYXRpb24nOiA1LFxuICAgICdyZWZpbmVtZW50JzogICAgICAgNSxcbiAgICAvLyBMZWdhY3kgZmFsbGJhY2tzIChzdGVwIG5hbWVzIHNvbWV0aW1lcyBwYXNzZWQgb24gRE9NQ29udGVudExvYWRlZClcbiAgICAnam9iJzogICAgICAgICAgICAgIDAsXG4gICAgJ2xheW91dCc6ICAgICAgICAgICA1LFxuICAgICdmaW5hbGlzZSc6ICAgICAgICAgNSxcbiAgfTtcbiAgY29uc3QgcG9zdExheW91dFVubG9ja2VkID0gWydmaW5hbF9nZW5lcmF0aW9uJywgJ3JlZmluZW1lbnQnXS5pbmNsdWRlcyhjdXJyZW50UGhhc2UpO1xuICBjb25zdCBjdXJyZW50SWR4ID0gcGhhc2VUb0luZGV4W2N1cnJlbnRQaGFzZV0gPz8gMDtcblxuICBmdW5jdGlvbiBfbWFrZVN0ZXBDbGlja2FibGUoZWwpIHtcbiAgICBpZiAoIWVsIHx8IGVsLmNsYXNzTGlzdC5jb250YWlucygnY2xpY2thYmxlJykpIHJldHVybjtcbiAgICBlbC5jbGFzc0xpc3QuYWRkKCdjbGlja2FibGUnKTtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnYnV0dG9uJyk7XG4gICAgZWwuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICcwJyk7XG4gICAgaWYgKCFlbC5fc3RlcEtleUhhbmRsZXIpIHtcbiAgICAgIGVsLl9zdGVwS2V5SGFuZGxlciA9IChlKSA9PiB7XG4gICAgICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJyB8fCBlLmtleSA9PT0gJyAnKSB7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGVsLmNsaWNrKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZWwuX3N0ZXBLZXlIYW5kbGVyKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBfbWFrZVN0ZXBJbmVydChlbCkge1xuICAgIGlmICghZWwpIHJldHVybjtcbiAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCdjbGlja2FibGUnKTtcbiAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoJ3JvbGUnKTtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJy0xJyk7XG4gICAgaWYgKGVsLl9zdGVwS2V5SGFuZGxlcikge1xuICAgICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGVsLl9zdGVwS2V5SGFuZGxlcik7XG4gICAgICBkZWxldGUgZWwuX3N0ZXBLZXlIYW5kbGVyO1xuICAgIH1cbiAgfVxuXG4gIHNlcXVlbnRpYWxTdGVwcy5mb3JFYWNoKChpZCwgaWR4KSA9PiB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIGlmIChpZHggPD0gY3VycmVudElkeCB8fCBwb3N0TGF5b3V0VW5sb2NrZWQpIHtcbiAgICAgIF9tYWtlU3RlcENsaWNrYWJsZShlbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIF9tYWtlU3RlcEluZXJ0KGVsKTtcbiAgICB9XG4gIH0pO1xuXG4gIHBvc3RMYXlvdXRTdGVwcy5mb3JFYWNoKGlkID0+IHtcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICBpZiAoIWVsKSByZXR1cm47XG4gICAgaWYgKHBvc3RMYXlvdXRVbmxvY2tlZCkge1xuICAgICAgX21ha2VTdGVwQ2xpY2thYmxlKGVsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgX21ha2VTdGVwSW5lcnQoZWwpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gTWFyayB0aGUgY3VycmVudGx5IGFjdGl2ZSBzdGVwIGZvciBzY3JlZW4gcmVhZGVycy5cbiAgY29uc3QgYWxsU3RlcElkcyA9IFsuLi5zZXF1ZW50aWFsU3RlcHMsIC4uLnBvc3RMYXlvdXRTdGVwc107XG4gIGFsbFN0ZXBJZHMuZm9yRWFjaChpZCA9PiB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgaWYgKGVsKSBlbC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtY3VycmVudCcpO1xuICB9KTtcbiAgLy8gRm9yIHBvc3QtbGF5b3V0IHBoYXNlcywgbWFyayBzdGVwLWRvd25sb2FkIGFzIHRoZSBhY3RpdmUgc3RlcCBzbyBzY3JlZW4gcmVhZGVyc1xuICAvLyBoYXZlIGEgcHJvZ3JhbW1hdGljIGN1cnJlbnQtcG9zaXRpb24gaW5kaWNhdG9yLlxuICBjb25zdCBhY3RpdmVTdGVwSWQgPSBwb3N0TGF5b3V0VW5sb2NrZWQgPyAnc3RlcC1kb3dubG9hZCcgOiBzZXF1ZW50aWFsU3RlcHNbY3VycmVudElkeF07XG4gIGlmIChhY3RpdmVTdGVwSWQpIHtcbiAgICBjb25zdCBhY3RpdmVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFjdGl2ZVN0ZXBJZCk7XG4gICAgaWYgKGFjdGl2ZUVsKSBhY3RpdmVFbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtY3VycmVudCcsICdzdGVwJyk7XG4gIH1cbn1cblxuLy8gSW5pdGlhbGl6ZSBvbiBwYWdlIGxvYWQgXHUyMDE0IGRlbGVnYXRlcyB0byBhcHAuanMgaW5pdCgpIHdoaWNoIGlzIGxvYWRlZCBhZnRlciB0aGlzIGZpbGVcbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB7XG4gIGxvYWRNb2RlbFNlbGVjdG9yKCk7XG5cbiAgLy8gV2lyZSB1cCB0YWIgc2Nyb2xsIGFycm93IGJ1dHRvbnNcbiAgY29uc3QgdGFiQmFyICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFiLWJhcicpO1xuICBjb25zdCBsZWZ0QnRuICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWItc2Nyb2xsLWxlZnQnKTtcbiAgY29uc3QgcmlnaHRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFiLXNjcm9sbC1yaWdodCcpO1xuICBpZiAodGFiQmFyICYmIGxlZnRCdG4gJiYgcmlnaHRCdG4pIHtcbiAgICBsZWZ0QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgICgpID0+IHsgdGFiQmFyLnNjcm9sbEJ5KHsgbGVmdDogLTE2MCwgYmVoYXZpb3I6ICdzbW9vdGgnIH0pOyB9KTtcbiAgICByaWdodEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHsgdGFiQmFyLnNjcm9sbEJ5KHsgbGVmdDogIDE2MCwgYmVoYXZpb3I6ICdzbW9vdGgnIH0pOyB9KTtcbiAgICB0YWJCYXIuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdXBkYXRlVGFiU2Nyb2xsQnV0dG9ucyk7XG4gICAgbmV3IFJlc2l6ZU9ic2VydmVyKHVwZGF0ZVRhYlNjcm9sbEJ1dHRvbnMpLm9ic2VydmUodGFiQmFyKTtcbiAgfVxuXG4gIC8vIFNob3cgb25seSB0aGUgSm9iIHRhYiB1bnRpbCBmZXRjaFN0YXR1cyByZXNvbHZlcyB0aGUgYWN0dWFsIHN0YWdlXG4gIHVwZGF0ZVRhYkJhckZvclN0YWdlKCdqb2InKTtcbiAgdXBkYXRlV29ya2Zsb3dTdGVwc0NsaWNrYWJsZSgnam9iJyk7XG5cbiAgLy8gTGlzdGVuIGZvciBwaGFzZSBjaGFuZ2VzIHRvIHVwZGF0ZSBjbGlja2FibGUgc3RlcHNcbiAgaWYgKHR5cGVvZiBzdGF0ZU1hbmFnZXI/Lm9uUGhhc2VDaGFuZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICBzdGF0ZU1hbmFnZXIub25QaGFzZUNoYW5nZSgocGhhc2UpID0+IHtcbiAgICAgIHVwZGF0ZVdvcmtmbG93U3RlcHNDbGlja2FibGUocGhhc2UpO1xuICAgIH0pO1xuICB9XG5cbn0pO1xuXG4vLyBcdTI1MDBcdTI1MDAgRVMgbW9kdWxlIGV4cG9ydHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5leHBvcnQge1xuICAvLyBGb2N1cyAvIGFjY2Vzc2liaWxpdHlcbiAgc2V0SW5pdGlhbEZvY3VzLCB0cmFwRm9jdXMsIHJlc3RvcmVGb2N1cywgcHVzaEZvY3VzU3RhY2ssXG4gIC8vIERpYWxvZ3MgJiBtb2RhbHNcbiAgY29uZmlybURpYWxvZywgb3Blbk1vZGFsLCBjbG9zZU1vZGFsLCBjbG9zZUFsbE1vZGFscyxcbiAgLy8gVGFiICYgc3RhZ2UgbWFuYWdlbWVudFxuICBzZXR1cEV2ZW50TGlzdGVuZXJzLCBnZXRTdGFnZUZvclRhYiwgZ2V0VmlzaWJsZVN0YWdlLCB1cGRhdGVUYWJCYXJGb3JTdGFnZSxcbiAgLy8gQ2hhdFxuICB0b2dnbGVDaGF0LFxuICAvLyBNb2RlbCBzZWxlY3RvclxuICBsb2FkTW9kZWxTZWxlY3Rvciwgb3Blbk1vZGVsTW9kYWwsIGNsb3NlTW9kZWxNb2RhbCwgc2V0TW9kZWwsIHRlc3RDdXJyZW50TW9kZWwsIHJlZnJlc2hNb2RlbFByaWNpbmcsXG4gIHRvZ2dsZU1vZGVsQ2F0YWxvZ1Zpc2liaWxpdHksIHN0YXJ0Q29waWxvdEF1dGhGcm9tV2l6YXJkLCBsb2dvdXRDb3BpbG90QXV0aEZyb21XaXphcmQsXG4gIG5leHRXaXphcmRTdGVwLCBwcmV2aW91c1dpemFyZFN0ZXAsXG4gIHNhdmVQcm92aWRlckFwaUtleSwgdG9nZ2xlQXBpS2V5VmlzaWJpbGl0eSxcbiAgX3VwZGF0ZUxsbVN0YXR1c1BpbGwsXG4gIC8vIFNldHRpbmdzIG1vZGFsXG4gIG9wZW5TZXR0aW5nc01vZGFsLCBjbG9zZVNldHRpbmdzTW9kYWwsIHNhdmVTZXR0aW5nc01vZGFsLCByZWxvYWRTZXR0aW5nc01vZGFsLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL3dvcmtmbG93LXN0ZXBzLmpzXG4gKiBXb3JrZmxvdyBwcm9ncmVzcyBiYXIsIHBoYXNlIHJlLXJ1bi9iYWNrLW5hdiwgYW5kIGJ1bGxldCByZW9yZGVyIG1vZGFsLlxuICpcbiAqIERlcGVuZGVuY2llcyAocmVzb2x2ZWQgdGhyb3VnaCBnbG9iYWxUaGlzIGF0IHJ1bnRpbWUpOlxuICogICBQSEFTRVMsIGVzY2FwZUh0bWwsXG4gKiAgIGFwcGVuZExvYWRpbmdNZXNzYWdlLCByZW1vdmVMb2FkaW5nTWVzc2FnZSwgYXBwZW5kUmV0cnlNZXNzYWdlLCBhcHBlbmRNZXNzYWdlLFxuICogICBzZXRMb2FkaW5nLCBmZXRjaFN0YXR1cywgc3dpdGNoVGFiLCBzZW5kQWN0aW9uLFxuICogICBzaG93TG9hZEpvYlBhbmVsLCB1cGRhdGVBY3Rpb25CdXR0b25zLCB1cGRhdGVUYWJCYXJGb3JTdGFnZSxcbiAqICAgdHJhcEZvY3VzLCByZXN0b3JlRm9jdXMsIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsLFxuICogICBwb3N0QW5hbHlzaXNRdWVzdGlvbnMsIHF1ZXN0aW9uQW5zd2VycywgQ1NTXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCd3b3JrZmxvdy1zdGVwcycpO1xuXG5pbXBvcnQgeyBzdGF0ZU1hbmFnZXIsIEdFTkVSQVRJT05fU1RBVEVfRVZFTlQgfSBmcm9tICcuL3N0YXRlLW1hbmFnZXIuanMnO1xuXG5mdW5jdGlvbiBfZmluZEV4cGVyaWVuY2VSZWNvbW1lbmRhdGlvblJlY29yZChleHBJZCkge1xuICBjb25zdCBkYXRhID0gZ2xvYmFsVGhpcy53aW5kb3c/LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnM7XG4gIGlmICghZGF0YSB8fCAhQXJyYXkuaXNBcnJheShkYXRhLmV4cGVyaWVuY2VfcmVjb21tZW5kYXRpb25zKSkgcmV0dXJuIG51bGw7XG4gIHJldHVybiBkYXRhLmV4cGVyaWVuY2VfcmVjb21tZW5kYXRpb25zLmZpbmQoKHJlYykgPT4gU3RyaW5nKHJlYz8uaWQgfHwgcmVjPy5leHBlcmllbmNlX2lkIHx8ICcnKSA9PT0gU3RyaW5nKGV4cElkKSkgfHwgbnVsbDtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFN0ZXAtb3JkZXIgY29uc3RhbnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5jb25zdCBfU1RFUF9PUkRFUiA9IFtcbiAgJ2pvYicsICdhbmFseXNpcycsICdjdXN0b21pemF0aW9ucycsICdyZXdyaXRlJywgJ3NwZWxsJywgJ2xheW91dCcsXG4gICdkb3dubG9hZCcsICdjb3Zlcl9sZXR0ZXInLCAnc2NyZWVuaW5nJywgJ2ludGVydmlld19wcmVwJywgJ3RoYW5rX3lvdScsICdoYXJ2ZXN0Jyxcbl07XG5jb25zdCBfU1RFUF9ESVNQTEFZID0ge1xuICBqb2I6ICAgICAgICAgICAgJ0pvYiBJbnB1dCcsXG4gIGFuYWx5c2lzOiAgICAgICAnSm9iIEFuYWx5c2lzJyxcbiAgY3VzdG9taXphdGlvbnM6ICdDdXN0b21pc2UnLFxuICByZXdyaXRlOiAgICAgICAgJ1Jld3JpdGUgUmV2aWV3JyxcbiAgc3BlbGw6ICAgICAgICAgICdTcGVsbCBDaGVjaycsXG4gIGxheW91dDogICAgICAgICAnTGF5b3V0IFJldmlldycsXG4gIGRvd25sb2FkOiAgICAgICAnRmlsZSBSZXZpZXcnLFxuICBjb3Zlcl9sZXR0ZXI6ICAgJ0NvdmVyIExldHRlcicsXG4gIHNjcmVlbmluZzogICAgICAnU2NyZWVuaW5nJyxcbiAgaW50ZXJ2aWV3X3ByZXA6ICdJbnRlcnZpZXcgUHJlcCcsXG4gIHRoYW5rX3lvdTogICAgICAnVGhhbmsgWW91JyxcbiAgaGFydmVzdDogICAgICAgICdIYXJ2ZXN0Jyxcbn07XG5jb25zdCBfQUNUSU9OX0xBQkVMUyA9IHtcbiAgcmVjb21tZW5kX2N1c3RvbWl6YXRpb25zOiAnU2VsZWN0aW5nIGV4cGVyaWVuY2VzICYgc2tpbGxzXHUyMDI2JyxcbiAgZ2VuZXJhdGVfY3Y6ICdHZW5lcmF0aW5nIENWXHUyMDI2Jyxcbn07XG5cbmNvbnN0IF9OQVZfVEFCX0xBQkVMUyA9IHtcbiAgZG93bmxvYWQ6ICdcdTJCMDdcdUZFMEYgRmlsZSBSZXZpZXcnLFxufTtcblxuZnVuY3Rpb24gYXBwbHlMYXlvdXRGcmVzaG5lc3NOYXZpZ2F0aW9uU3RhdGUoKSB7XG4gIGNvbnN0IGZyZXNobmVzcyA9IHN0YXRlTWFuYWdlci5nZXRMYXlvdXRGcmVzaG5lc3MoKTtcbiAgY29uc3QgZ2VuZXJhdGlvblN0YXRlID0gc3RhdGVNYW5hZ2VyLmdldEdlbmVyYXRpb25TdGF0ZSgpO1xuICBjb25zdCBsYXlvdXRTdGVwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0ZXAtbGF5b3V0Jyk7XG5cbiAgaWYgKGxheW91dFN0ZXApIHtcbiAgICBsYXlvdXRTdGVwLmNsYXNzTGlzdC5yZW1vdmUoJ3N0YWxlJywgJ3N0YWxlLWNyaXRpY2FsJyk7XG4gICAgY29uc3QgcmVydW4gPSBsYXlvdXRTdGVwLnF1ZXJ5U2VsZWN0b3IoJy5zdGVwLXJlcnVuJyk/Lm91dGVySFRNTCB8fCAnJztcbiAgICBjb25zdCByZWZpbmVCYWRnZSA9IGxheW91dFN0ZXAucXVlcnlTZWxlY3RvcignLnN0ZXAtaW5saW5lLWJhZGdlJyk/Lm91dGVySFRNTCB8fCAnJztcbiAgICBjb25zdCBzdGFsZUJhZGdlID0gZnJlc2huZXNzLmlzU3RhbGVcbiAgICAgID8gJyA8c3BhbiBjbGFzcz1cInN0ZXAtaW5saW5lLWJhZGdlIHN0ZXAtc3RhbGUtYmFkZ2VcIj5PdXRkYXRlZDwvc3Bhbj4nXG4gICAgICA6ICcnO1xuICAgIGlmIChmcmVzaG5lc3MuaXNTdGFsZSkge1xuICAgICAgbGF5b3V0U3RlcC5jbGFzc0xpc3QuYWRkKCdzdGFsZScpO1xuICAgICAgaWYgKGZyZXNobmVzcy5pc0NyaXRpY2FsKSBsYXlvdXRTdGVwLmNsYXNzTGlzdC5hZGQoJ3N0YWxlLWNyaXRpY2FsJyk7XG4gICAgfVxuICAgIGxheW91dFN0ZXAuaW5uZXJIVE1MID0gYFx1RDgzQ1x1REZBOCBMYXlvdXQgUmV2aWV3JHtzdGFsZUJhZGdlfSR7cmVmaW5lQmFkZ2UgPyBgICR7cmVmaW5lQmFkZ2V9YCA6ICcnfSR7cmVydW4gPyBgICR7cmVydW59YCA6ICcnfWA7XG4gIH1cblxuICBjb25zdCBzaG93RG93bnN0cmVhbUJhZGdlID0gZnJlc2huZXNzLmlzU3RhbGUgJiYgQm9vbGVhbihcbiAgICBnZW5lcmF0aW9uU3RhdGUuZmluYWxHZW5lcmF0ZWRBdCB8fCBnZW5lcmF0aW9uU3RhdGUucGhhc2UgPT09ICdmaW5hbF9jb21wbGV0ZSdcbiAgKTtcbiAgT2JqZWN0LmVudHJpZXMoX05BVl9UQUJfTEFCRUxTKS5mb3JFYWNoKChbdGFiLCBsYWJlbF0pID0+IHtcbiAgICBjb25zdCB0YWJFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGB0YWItJHt0YWJ9YCk7XG4gICAgaWYgKCF0YWJFbCkgcmV0dXJuO1xuICAgIHRhYkVsLmNsYXNzTGlzdC5yZW1vdmUoJ3RhYi1zdGFsZScsICd0YWItc3RhbGUtY3JpdGljYWwnKTtcbiAgICBpZiAoc2hvd0Rvd25zdHJlYW1CYWRnZSkge1xuICAgICAgdGFiRWwuY2xhc3NMaXN0LmFkZCgndGFiLXN0YWxlJyk7XG4gICAgICBpZiAoZnJlc2huZXNzLmlzQ3JpdGljYWwpIHRhYkVsLmNsYXNzTGlzdC5hZGQoJ3RhYi1zdGFsZS1jcml0aWNhbCcpO1xuICAgICAgdGFiRWwuaW5uZXJIVE1MID0gYCR7bGFiZWx9IDxzcGFuIGNsYXNzPVwidGFiLXN0YWxlLWJhZGdlXCI+T3V0ZGF0ZWQ8L3NwYW4+YDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGFiRWwudGV4dENvbnRlbnQgPSBsYWJlbDtcbiAgICB9XG4gIH0pO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgQmFjayB0byBwaGFzZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gYmFja1RvUGhhc2Uoc3RlcCwgZmVlZGJhY2spIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBib2R5ID0gZmVlZGJhY2sgPyB7cGhhc2U6IHN0ZXAsIGZlZWRiYWNrfSA6IHtwaGFzZTogc3RlcH07XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL2JhY2stdG8tcGhhc2UnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmICghcmVzLm9rIHx8ICFkYXRhLm9rKSB7XG4gICAgICBhcHBlbmRSZXRyeU1lc3NhZ2UoJ1x1MjZBMCBDb3VsZCBub3QgbmF2aWdhdGUgYmFjazogJyArIChkYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yJyksICgpID0+IGJhY2tUb1BoYXNlKHN0ZXAsIGZlZWRiYWNrKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIGBcdTIxQkIgTmF2aWdhdGluZyBiYWNrIHRvICR7c3RlcH0uIFByaW9yIGRlY2lzaW9ucyBhbmQgYXBwcm92YWxzIGFyZSBwcmVzZXJ2ZWQuYCk7XG4gICAgaWYgKGZlZWRiYWNrKSBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCBgUmVmaW5lbWVudCBmZWVkYmFjayBxdWV1ZWQ6IFwiJHtmZWVkYmFja31cImApO1xuICAgIGF3YWl0IGZldGNoU3RhdHVzKCk7XG5cbiAgICAvLyBTd2l0Y2ggdG8gdGhlIGFwcHJvcHJpYXRlIHZpZXdlciB0YWJcbiAgICBjb25zdCB0YWJNYXAgPSB7XG4gICAgICBqb2I6ICAgICAgICAgICAgbnVsbCxcbiAgICAgIGFuYWx5c2lzOiAgICAgICAnYW5hbHlzaXMnLFxuICAgICAgY3VzdG9taXphdGlvbnM6ICdnb2FscycsXG4gICAgICByZXdyaXRlOiAgICAgICAgJ3Jld3JpdGUnLFxuICAgICAgc3BlbGw6ICAgICAgICAgICdzcGVsbCcsXG4gICAgfTtcbiAgICBjb25zdCByZXNvbHZlZFRhYiA9IHRhYk1hcFtzdGVwXSB8fCB0YWJNYXBbZGF0YS5waGFzZV0gfHwgbnVsbDtcbiAgICBpZiAocmVzb2x2ZWRUYWIpIHN3aXRjaFRhYihyZXNvbHZlZFRhYik7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGFwcGVuZFJldHJ5TWVzc2FnZSgnXHUyNkEwIE5ldHdvcmsgZXJyb3IgaW4gYmFja1RvUGhhc2U6ICcgKyBlcnIubWVzc2FnZSwgKCkgPT4gYmFja1RvUGhhc2Uoc3RlcCkpO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBSZS1ydW4gY29uZmlybSBtb2RhbCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLyoqXG4gKiBTaG93IGEgZG93bnN0cmVhbS1hd2FyZSBjb25maXJtYXRpb24gbW9kYWwgYmVmb3JlIHJlLXJ1bm5pbmcgb3IgYmFjay1uYXZpZ2F0aW5nLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgc3RlcCAgICAgIC0gVGhlIHRhcmdldCBzdGVwIGtleVxuICogQHBhcmFtIHsncmVydW4nfCdiYWNrLW5hdid9IG1vZGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IG9uQ29uZmlybSAtIENhbGxlZCBpZiB0aGUgdXNlciBjbGlja3MgUHJvY2VlZFxuICovXG5mdW5jdGlvbiBfc2hvd1JlUnVuQ29uZmlybU1vZGFsKHN0ZXAsIG1vZGUsIG9uQ29uZmlybSkge1xuICBjb25zdCBzdGVwSWR4ICAgID0gX1NURVBfT1JERVIuaW5kZXhPZihzdGVwKTtcbiAgLy8gT25seSBzaG93IGRvd25zdHJlYW0gc3RhZ2VzIHRoYXQgaGF2ZSBhY3R1YWxseSBiZWVuIGNvbXBsZXRlZFxuICBjb25zdCBkb3duc3RyZWFtID0gX1NURVBfT1JERVIuc2xpY2Uoc3RlcElkeCArIDEpLmZpbHRlcihzID0+IHtcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzdGVwLSR7c31gKTtcbiAgICByZXR1cm4gZWwgJiYgZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdjb21wbGV0ZWQnKTtcbiAgfSk7XG4gIGNvbnN0IHN0ZXBMYWJlbCAgPSBfU1RFUF9ESVNQTEFZW3N0ZXBdIHx8IHN0ZXA7XG5cbiAgY29uc3QgdGl0bGUgPSBtb2RlID09PSAncmVydW4nXG4gICAgPyBgXHUyMUJCIFJlLXJ1biAke3N0ZXBMYWJlbH0/YFxuICAgIDogYFx1MjE5MCBOYXZpZ2F0ZSBiYWNrIHRvICR7c3RlcExhYmVsfT9gO1xuICBjb25zdCBib2R5VGV4dCA9IG1vZGUgPT09ICdyZXJ1bidcbiAgICA/ICdUaGUgZm9sbG93aW5nIHN0YWdlcyB3aWxsIHNlZSB1cGRhdGVkIGlucHV0cyBhbmQgbWF5IHNob3cgY2hhbmdlZCByZWNvbW1lbmRhdGlvbnM6J1xuICAgIDogJ1lvdSBhcmUgbmF2aWdhdGluZyBiYWNrIHBhc3QgdGhlIGZvbGxvd2luZyBjb21wbGV0ZWQgc3RhZ2VzOic7XG4gIGNvbnN0IG5vdGUgPSAnQWxsIGV4aXN0aW5nIGFwcHJvdmFscyBhbmQgcmV3cml0ZXMgYXJlIHByZXNlcnZlZCBhcyBjb250ZXh0Lic7XG5cbiAgY29uc3QgbGlzdEh0bWwgPSBkb3duc3RyZWFtXG4gICAgLm1hcChzID0+IGA8bGkgc3R5bGU9XCJwYWRkaW5nOjJweCAwO1wiPiR7X1NURVBfRElTUExBWVtzXSB8fCBzfTwvbGk+YClcbiAgICAuam9pbignJyk7XG5cbiAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBvdmVybGF5LmlkID0gJ3JlcnVuLWNvbmZpcm0tb3ZlcmxheSc7XG4gIG92ZXJsYXkuc3R5bGUuY3NzVGV4dCA9IGBwb3NpdGlvbjpmaXhlZDtpbnNldDowO2JhY2tncm91bmQ6cmdiYSgwLDAsMCwwLjUpO1xuICAgIHotaW5kZXg6MTAwMDA7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2A7XG4gIG92ZXJsYXkuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgcm9sZT1cImRpYWxvZ1wiIGFyaWEtbW9kYWw9XCJ0cnVlXCIgYXJpYS1sYWJlbGxlZGJ5PVwicmVydW4tY29uZmlybS10aXRsZVwiXG4gICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6I2ZmZjtib3JkZXItcmFkaXVzOjEwcHg7cGFkZGluZzoyNHB4IDI4cHg7bWF4LXdpZHRoOjQ0MHB4O1xuICAgICAgICAgICAgICAgIHdpZHRoOjkyJTtib3gtc2hhZG93OjAgMjBweCA2MHB4IHJnYmEoMCwwLDAsMC4zKTtcIj5cbiAgICAgIDxoMyBpZD1cInJlcnVuLWNvbmZpcm0tdGl0bGVcIiBzdHlsZT1cIm1hcmdpbjowIDAgMTBweDtmb250LXNpemU6MS4xZW07Y29sb3I6IzFlMjkzYjtcIj5cbiAgICAgICAgJHtlc2NhcGVIdG1sKHRpdGxlKX08L2gzPlxuICAgICAgPHAgc3R5bGU9XCJtYXJnaW46MCAwIDhweDtmb250LXNpemU6MC45ZW07Y29sb3I6IzQ3NTU2OTtcIj4ke2VzY2FwZUh0bWwoYm9keVRleHQpfTwvcD5cbiAgICAgIDx1bCBzdHlsZT1cIm1hcmdpbjowIDAgMTJweDtwYWRkaW5nLWxlZnQ6MjBweDtmb250LXNpemU6MC45ZW07Y29sb3I6IzM3NDE1MTtcIj4ke2xpc3RIdG1sfTwvdWw+XG4gICAgICA8cCBzdHlsZT1cIm1hcmdpbjowIDAgMThweDtmb250LXNpemU6MC44NWVtO2NvbG9yOiM2YjcyODA7XCI+JHtlc2NhcGVIdG1sKG5vdGUpfTwvcD5cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjEwcHg7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kO1wiPlxuICAgICAgICA8YnV0dG9uIGlkPVwicmVydW4tY2FuY2VsLWJ0blwiIGNsYXNzPVwiYnRuLXNlY29uZGFyeVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwicmVydW4tcHJvY2VlZC1idG5cIiBjbGFzcz1cImJ0bi1wcmltYXJ5XCI+UHJvY2VlZDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+YDtcblxuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG92ZXJsYXkpO1xuICBfZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIGlmICh0eXBlb2YgdHJhcEZvY3VzID09PSAnZnVuY3Rpb24nKSB0cmFwRm9jdXMoJ3JlcnVuLWNvbmZpcm0tb3ZlcmxheScpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVydW4tcHJvY2VlZC1idG4nKS5mb2N1cygpO1xuXG4gIGNvbnN0IGNsb3NlID0gKCkgPT4geyBvdmVybGF5LnJlbW92ZSgpOyByZXN0b3JlRm9jdXMoKTsgfTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlcnVuLWNhbmNlbC1idG4nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNsb3NlKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlcnVuLXByb2NlZWQtYnRuJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7IGNsb3NlKCk7IG9uQ29uZmlybSgpOyB9KTtcbiAgb3ZlcmxheS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGUgPT4geyBpZiAoZS50YXJnZXQgPT09IG92ZXJsYXkpIGNsb3NlKCk7IH0pO1xuICBvdmVybGF5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBlID0+IHsgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgY2xvc2UoKTsgfSk7XG59XG5cbmZ1bmN0aW9uIGNvbmZpcm1SZVJ1blBoYXNlKHN0ZXApIHtcbiAgX3Nob3dSZVJ1bkNvbmZpcm1Nb2RhbChzdGVwLCAncmVydW4nLCAoKSA9PiBiYWNrVG9QaGFzZShzdGVwKSk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBWaWV3LWN1cnNvciBpbmRpY2F0b3IgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8qKlxuICogUmV0dXJuIGEgdG9vbHRpcCBzdHJpbmcgZm9yIGEgc3RlcCBwaWxsIGJhc2VkIG9uIGl0cyBjb21iaW5lZCBzdGF0ZS5cbiAqL1xuZnVuY3Rpb24gX2dldFN0ZXBUb29sdGlwKHN0ZXAsIGlzQWN0aXZlLCBpc1ZpZXdpbmcsIGlzQnJvd3NpbmdBd2F5LCBpc0NvbXBsZXRlZCwgaXNTdGFsZSwgaXNTdGFsZUNyaXRpY2FsKSB7XG4gIGlmIChpc1N0YWxlQ3JpdGljYWwpIHJldHVybiBpc1ZpZXdpbmcgPyAnQ3JpdGljYWwgY2hhbmdlcyBcdTIwMTQgcmV2aWV3IHJlcXVpcmVkLiBDbGljayBcdTIxQkIgdG8gcmVydW4uJyA6ICdDcml0aWNhbCBjaGFuZ2VzIFx1MjAxNCByZXZpZXcgcmVxdWlyZWQuJztcbiAgaWYgKGlzU3RhbGUpICAgICAgICAgcmV0dXJuIGlzVmlld2luZyA/ICdSZXN1bHRzIG1heSBiZSBvdXRkYXRlZC4gQ2xpY2sgXHUyMUJCIHRvIHJlcnVuLicgICAgICAgICAgIDogJ1Jlc3VsdHMgbWF5IGJlIG91dGRhdGVkLic7XG4gIGlmIChpc0Jyb3dzaW5nQXdheSkgIHJldHVybiAnQWN0aXZlIHN0ZXAgXHUyMDE0IGNsaWNrIHRvIHJldHVybic7XG4gIGlmIChpc0FjdGl2ZSAmJiBpc1ZpZXdpbmcpICAgIHJldHVybiAnQ3VycmVudCBzdGVwJztcbiAgaWYgKGlzQ29tcGxldGVkICYmIGlzVmlld2luZykgcmV0dXJuICdDbGljayBcdTIxQkIgdG8gcmVydW4gZnJvbSBoZXJlJztcbiAgaWYgKGlzQ29tcGxldGVkKSAgICAgICAgICAgICAgcmV0dXJuICdDbGljayB0byB2aWV3JztcbiAgcmV0dXJuICcnO1xufVxuXG4vKipcbiAqIFN5bmMgdGhlIGJsdWUgcmluZyAodmlldyBjdXJzb3IpIGFuZCBhbWJlciBwdWxzaW5nIHJpbmcgKGJyb3dzaW5nLWF3YXkpXG4gKiB0byB0aGUgY3VycmVudGx5IHZpc2libGUgdGFiLiBDYWxsZWQgYWZ0ZXIgZXZlcnkgdGFiIHN3aXRjaCBhbmQgc3RhdHVzIHVwZGF0ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWJOYW1lIC0gVGhlIGN1cnJlbnRseSB2aXNpYmxlIHRhYiBpZCAoZS5nLiAnYW5hbHlzaXMnLCAnZXhwLXJldmlldycpXG4gKi9cbmZ1bmN0aW9uIF91cGRhdGVWaWV3aW5nSW5kaWNhdG9yKHRhYk5hbWUpIHtcbiAgY29uc3QgdGFiVG9TdGVwID0ge1xuICAgICdqb2InOiAgICAgICAgICAgJ2pvYicsXG4gICAgJ2FuYWx5c2lzJzogICAgICAnYW5hbHlzaXMnLFxuICAgICdxdWVzdGlvbnMnOiAgICAgJ2FuYWx5c2lzJyxcbiAgICAnZXhwLXJldmlldyc6ICAgICdjdXN0b21pemF0aW9ucycsXG4gICAgJ3Jld3JpdGUnOiAgICAgICAncmV3cml0ZScsXG4gICAgJ3NwZWxsJzogICAgICAgICAnc3BlbGwnLFxuICAgICdsYXlvdXQnOiAgICAgICAgJ2xheW91dCcsXG4gICAgJ2ZpbmFsX2dlbmVyYXRlJzonZG93bmxvYWQnLFxuICAgICdkb3dubG9hZCc6ICAgICAgJ2Rvd25sb2FkJyxcbiAgICAnY292ZXItbGV0dGVyJzogICdjb3Zlcl9sZXR0ZXInLFxuICAgICdzY3JlZW5pbmcnOiAgICAgJ3NjcmVlbmluZycsXG4gICAgJ2ludGVydmlldy1wcmVwJzonaW50ZXJ2aWV3X3ByZXAnLFxuICAgICd0aGFuay15b3UnOiAgICAgJ3RoYW5rX3lvdScsXG4gICAgJ2hhcnZlc3QnOiAgICAgICAnaGFydmVzdCcsXG4gIH07XG4gIGNvbnN0IHZpZXdlZFN0ZXAgPSB0YWJUb1N0ZXBbdGFiTmFtZV0gfHwgbnVsbDtcblxuICBsZXQgYWN0aXZlU3RlcCA9IG51bGw7XG4gIF9TVEVQX09SREVSLmZvckVhY2goc3RlcCA9PiB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc3RlcC0ke3N0ZXB9YCk7XG4gICAgaWYgKGVsICYmIGVsLmNsYXNzTGlzdC5jb250YWlucygnYWN0aXZlJykpIGFjdGl2ZVN0ZXAgPSBzdGVwO1xuICB9KTtcblxuICBfU1RFUF9PUkRFUi5mb3JFYWNoKHN0ZXAgPT4ge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHN0ZXAtJHtzdGVwfWApO1xuICAgIGlmICghZWwpIHJldHVybjtcblxuICAgIGNvbnN0IGlzVmlld2luZyAgICAgID0gc3RlcCA9PT0gdmlld2VkU3RlcDtcbiAgICBjb25zdCBpc0FjdGl2ZSAgICAgICA9IHN0ZXAgPT09IGFjdGl2ZVN0ZXA7XG4gICAgY29uc3QgaXNCcm93c2luZ0F3YXkgPSBpc0FjdGl2ZSAmJiAhIXZpZXdlZFN0ZXAgJiYgdmlld2VkU3RlcCAhPT0gYWN0aXZlU3RlcDtcbiAgICBjb25zdCBpc0NvbXBsZXRlZCAgICA9IGVsLmNsYXNzTGlzdC5jb250YWlucygnY29tcGxldGVkJyk7XG4gICAgY29uc3QgaXNTdGFsZSAgICAgICAgPSBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ3N0YWxlJyk7XG4gICAgY29uc3QgaXNTdGFsZUNyaXRpY2FsID0gZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdzdGFsZS1jcml0aWNhbCcpO1xuXG4gICAgZWwuY2xhc3NMaXN0LnRvZ2dsZSgndmlld2luZycsICAgICAgIGlzVmlld2luZyk7XG4gICAgZWwuY2xhc3NMaXN0LnRvZ2dsZSgnYnJvd3NpbmctYXdheScsIGlzQnJvd3NpbmdBd2F5KTtcblxuICAgIGNvbnN0IHRvb2x0aXBUZXh0ID0gX2dldFN0ZXBUb29sdGlwKHN0ZXAsIGlzQWN0aXZlLCBpc1ZpZXdpbmcsIGlzQnJvd3NpbmdBd2F5LCBpc0NvbXBsZXRlZCwgaXNTdGFsZSwgaXNTdGFsZUNyaXRpY2FsKTtcbiAgICBpZiAodG9vbHRpcFRleHQpIHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZSgnZGF0YS1icy10b2dnbGUnLCAgICAndG9vbHRpcCcpO1xuICAgICAgZWwuc2V0QXR0cmlidXRlKCdkYXRhLWJzLXBsYWNlbWVudCcsICdib3R0b20nKTtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZSgnZGF0YS1icy10aXRsZScsICAgICB0b29sdGlwVGV4dCk7XG4gICAgICBpZiAodHlwZW9mIGJvb3RzdHJhcCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY29uc3QgdGlwID0gYm9vdHN0cmFwLlRvb2x0aXAuZ2V0SW5zdGFuY2UoZWwpO1xuICAgICAgICBpZiAodGlwKSB0aXAuc2V0Q29udGVudCh7ICcudG9vbHRpcC1pbm5lcic6IHRvb2x0aXBUZXh0IH0pO1xuICAgICAgICBlbHNlICAgICBuZXcgYm9vdHN0cmFwLlRvb2x0aXAoZWwpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtYnMtdG9nZ2xlJyk7XG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtYnMtdGl0bGUnKTtcbiAgICAgIGlmICh0eXBlb2YgYm9vdHN0cmFwICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBjb25zdCB0aXAgPSBib290c3RyYXAuVG9vbHRpcC5nZXRJbnN0YW5jZShlbCk7XG4gICAgICAgIGlmICh0aXApIHRpcC5kaXNwb3NlKCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFJlLXJ1biBwaGFzZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLyoqXG4gKiBTaG93IGFuIGFtZW5kLWNsYXJpZmljYXRpb25zIG1vZGFsIGJlZm9yZSByZS1ydW5uaW5nIHRoZSBhbmFseXNpcyBwaGFzZS5cbiAqIENhbGxzIG9uUHJvY2VlZCgpIGlmIHRoZSB1c2VyIGNvbmZpcm1zICh3aXRoIG9yIHdpdGhvdXQgdXBkYXRpbmcgYW5zd2VycykuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIF9zaG93QW5hbHlzaXNDbGFyaWZpY2F0aW9uQW1lbmRNb2RhbChvblByb2NlZWQpIHtcbiAgY29uc3QgcXVlc3Rpb25zID0gd2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucyB8fCBbXTtcbiAgY29uc3QgYW5zd2VycyAgID0gd2luZG93LnF1ZXN0aW9uQW5zd2VycyB8fCB7fTtcblxuICAvLyBObyBwcmlvciBxdWVzdGlvbnMgXHUyMDE0IHNraXAgdGhlIG1vZGFsIGFuZCBwcm9jZWVkIGRpcmVjdGx5LlxuICBpZiAoIXF1ZXN0aW9ucy5sZW5ndGgpIHsgYXdhaXQgb25Qcm9jZWVkKCk7IHJldHVybjsgfVxuXG4gIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgb3ZlcmxheS5pZCA9ICdjbGFyLWFtZW5kLW92ZXJsYXknO1xuICBvdmVybGF5LnN0eWxlLmNzc1RleHQgPSAncG9zaXRpb246Zml4ZWQ7aW5zZXQ6MDtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsMC41KTt6LWluZGV4OjEwMDAwO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjtvdmVyZmxvdy15OmF1dG87JztcblxuICBjb25zdCBmb3JtUm93cyA9IHF1ZXN0aW9ucy5tYXAoKHEsIGkpID0+IHtcbiAgICBjb25zdCBxdHlwZSAgPSBxLnR5cGUgfHwgYGNsYXJpZmljYXRpb25fJHtpICsgMX1gO1xuICAgIGNvbnN0IHF0ZXh0ICA9IGVzY2FwZUh0bWwocS5xdWVzdGlvbiB8fCAnJyk7XG4gICAgY29uc3QgY3VyQW5zID0gZXNjYXBlSHRtbChhbnN3ZXJzW3F0eXBlXSB8fCAnJyk7XG4gICAgY29uc3QgY2hvaWNlcyA9IEFycmF5LmlzQXJyYXkocS5jaG9pY2VzKSA/IHEuY2hvaWNlcyA6IFtdO1xuXG4gICAgaWYgKGNob2ljZXMubGVuZ3RoKSB7XG4gICAgICBjb25zdCByYWRpb3MgPSBjaG9pY2VzLm1hcChjID0+IGBcbiAgICAgICAgPGxhYmVsIHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6NnB4O21hcmdpbi1ib3R0b206NHB4O2N1cnNvcjpwb2ludGVyO1wiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwiY2xhci0ke2VzY2FwZUh0bWwocXR5cGUpfVwiIHZhbHVlPVwiJHtlc2NhcGVIdG1sKGMpfVwiXG4gICAgICAgICAgICAke2Fuc3dlcnNbcXR5cGVdID09PSBjID8gJ2NoZWNrZWQnIDogJyd9IHN0eWxlPVwiZmxleC1zaHJpbms6MDtcIj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjllbTtcIj4ke2VzY2FwZUh0bWwoYyl9PC9zcGFuPlxuICAgICAgICA8L2xhYmVsPmApLmpvaW4oJycpO1xuICAgICAgcmV0dXJuIGBcbiAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTRweDtcIj5cbiAgICAgICAgICA8bGFiZWwgc3R5bGU9XCJmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjAuOWVtO2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWJvdHRvbTo2cHg7XCI+JHtxdGV4dH08L2xhYmVsPlxuICAgICAgICAgICR7cmFkaW9zfVxuICAgICAgICA8L2Rpdj5gO1xuICAgIH1cbiAgICByZXR1cm4gYFxuICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTRweDtcIj5cbiAgICAgICAgPGxhYmVsIGZvcj1cImNsYXItYW5zLSR7ZXNjYXBlSHRtbChxdHlwZSl9XCIgc3R5bGU9XCJmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjAuOWVtO2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWJvdHRvbTo0cHg7XCI+JHtxdGV4dH08L2xhYmVsPlxuICAgICAgICA8dGV4dGFyZWEgaWQ9XCJjbGFyLWFucy0ke2VzY2FwZUh0bWwocXR5cGUpfVwiIG5hbWU9XCJjbGFyLSR7ZXNjYXBlSHRtbChxdHlwZSl9XCIgcm93cz1cIjJcIlxuICAgICAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTtib3gtc2l6aW5nOmJvcmRlci1ib3g7cGFkZGluZzo2cHggOHB4O2JvcmRlcjoxcHggc29saWQgI2QxZDVkYjtib3JkZXItcmFkaXVzOjZweDtmb250LXNpemU6MC45ZW07cmVzaXplOnZlcnRpY2FsO1wiXG4gICAgICAgID4ke2N1ckFuc308L3RleHRhcmVhPlxuICAgICAgPC9kaXY+YDtcbiAgfSkuam9pbignJyk7XG5cbiAgb3ZlcmxheS5pbm5lckhUTUwgPSBgXG4gICAgPGRpdiByb2xlPVwiZGlhbG9nXCIgYXJpYS1tb2RhbD1cInRydWVcIiBhcmlhLWxhYmVsbGVkYnk9XCJjbGFyLWFtZW5kLXRpdGxlXCJcbiAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDojZmZmO2JvcmRlci1yYWRpdXM6MTBweDtwYWRkaW5nOjI0cHggMjhweDttYXgtd2lkdGg6NTAwcHg7d2lkdGg6OTQlO1xuICAgICAgICAgICAgICAgIGJveC1zaGFkb3c6MCAyMHB4IDYwcHggcmdiYSgwLDAsMCwwLjMpO21hcmdpbjoyMHB4IGF1dG87XCI+XG4gICAgICA8aDMgaWQ9XCJjbGFyLWFtZW5kLXRpdGxlXCIgc3R5bGU9XCJtYXJnaW46MCAwIDZweDtmb250LXNpemU6MS4xZW07Y29sb3I6IzFlMjkzYjtcIj5cdTIxQkIgQW1lbmQgQ2xhcmlmaWNhdGlvbiBBbnN3ZXJzPC9oMz5cbiAgICAgIDxwIHN0eWxlPVwibWFyZ2luOjAgMCAxNnB4O2ZvbnQtc2l6ZTowLjg1ZW07Y29sb3I6IzZiNzI4MDtcIj5cbiAgICAgICAgVXBkYXRlIHlvdXIgYW5zd2VycyBiZWZvcmUgcmVydW5uaW5nIGFuYWx5c2lzLCBvciBrZWVwIHRoZW0gYXMtaXMuXG4gICAgICA8L3A+XG4gICAgICA8Zm9ybSBpZD1cImNsYXItYW1lbmQtZm9ybVwiIG9uc3VibWl0PVwicmV0dXJuIGZhbHNlO1wiPlxuICAgICAgICAke2Zvcm1Sb3dzfVxuICAgICAgPC9mb3JtPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6MTBweDtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmQ7bWFyZ2luLXRvcDo4cHg7ZmxleC13cmFwOndyYXA7XCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJjbGFyLWFtZW5kLWNhbmNlbFwiIGNsYXNzPVwiYnRuLXNlY29uZGFyeVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwiY2xhci1hbWVuZC1rZWVwXCIgICBjbGFzcz1cImJ0bi1zZWNvbmRhcnlcIj5LZWVwIEV4aXN0aW5nIEFuc3dlcnM8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImNsYXItYW1lbmQtc2F2ZVwiICAgY2xhc3M9XCJidG4tcHJpbWFyeVwiPlVwZGF0ZSAmYW1wOyBSZXJ1bjwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+YDtcblxuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG92ZXJsYXkpO1xuICBpZiAodHlwZW9mIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsICE9PSAndW5kZWZpbmVkJykgd2luZG93Ll9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgaWYgKHR5cGVvZiB0cmFwRm9jdXMgPT09ICdmdW5jdGlvbicpIHRyYXBGb2N1cygnY2xhci1hbWVuZC1vdmVybGF5Jyk7XG4gIG92ZXJsYXkucXVlcnlTZWxlY3RvcignI2NsYXItYW1lbmQtc2F2ZScpLmZvY3VzKCk7XG5cbiAgZnVuY3Rpb24gY2xvc2VNb2RhbCgpIHtcbiAgICBvdmVybGF5LnJlbW92ZSgpO1xuICAgIGlmICh0eXBlb2YgcmVzdG9yZUZvY3VzID09PSAnZnVuY3Rpb24nKSByZXN0b3JlRm9jdXMoKTtcbiAgfVxuXG4gIG92ZXJsYXkucXVlcnlTZWxlY3RvcignI2NsYXItYW1lbmQtY2FuY2VsJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjbG9zZU1vZGFsKTtcbiAgb3ZlcmxheS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGUgPT4geyBpZiAoZS50YXJnZXQgPT09IG92ZXJsYXkpIGNsb3NlTW9kYWwoKTsgfSk7XG4gIG92ZXJsYXkuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGUgPT4geyBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSBjbG9zZU1vZGFsKCk7IH0pO1xuXG4gIG92ZXJsYXkucXVlcnlTZWxlY3RvcignI2NsYXItYW1lbmQta2VlcCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGNsb3NlTW9kYWwoKTtcbiAgICBvblByb2NlZWQoKTtcbiAgfSk7XG5cbiAgb3ZlcmxheS5xdWVyeVNlbGVjdG9yKCcjY2xhci1hbWVuZC1zYXZlJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZm9ybSAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbGFyLWFtZW5kLWZvcm0nKTtcbiAgICBjb25zdCB1cGRhdGVkID0ge307XG4gICAgcXVlc3Rpb25zLmZvckVhY2goKHEsIGkpID0+IHtcbiAgICAgIGNvbnN0IHF0eXBlID0gcS50eXBlIHx8IGBjbGFyaWZpY2F0aW9uXyR7aSArIDF9YDtcbiAgICAgIGNvbnN0IGVsICAgID0gZm9ybS5xdWVyeVNlbGVjdG9yKGBbbmFtZT1cImNsYXItJHtxdHlwZX1cIl1gKTtcbiAgICAgIGlmICghZWwpIHJldHVybjtcbiAgICAgIGlmIChlbC50eXBlID09PSAncmFkaW8nKSB7XG4gICAgICAgIGNvbnN0IGNoZWNrZWQgPSBmb3JtLnF1ZXJ5U2VsZWN0b3IoYFtuYW1lPVwiY2xhci0ke3F0eXBlfVwiXTpjaGVja2VkYCk7XG4gICAgICAgIGlmIChjaGVja2VkKSB1cGRhdGVkW3F0eXBlXSA9IGNoZWNrZWQudmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB2YWwgPSBlbC52YWx1ZS50cmltKCk7XG4gICAgICAgIGlmICh2YWwpIHVwZGF0ZWRbcXR5cGVdID0gdmFsO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY2xvc2VNb2RhbCgpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmZXRjaCgnL2FwaS9wb3N0LWFuYWx5c2lzLXJlc3BvbnNlcycsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHF1ZXN0aW9ucywgYW5zd2VyczogdXBkYXRlZCB9KSxcbiAgICAgIH0pO1xuICAgICAgd2luZG93LnF1ZXN0aW9uQW5zd2VycyA9IHVwZGF0ZWQ7XG4gICAgfSBjYXRjaCAoX2UpIHsgLyogc2lsZW50IFx1MjAxNCBwcm9jZWVkIHdpdGggd2hhdGV2ZXIgdGhlIGJhY2tlbmQgYWxyZWFkeSBoYXMgKi8gfVxuICAgIGF3YWl0IG9uUHJvY2VlZCgpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVSdW5QaGFzZShzdGVwKSB7XG4gIC8vIEludGVyY2VwdCBhbmFseXNpcyByZXJ1bnMgdG8gbGV0IHRoZSB1c2VyIGFtZW5kIHByaW9yIGNsYXJpZmljYXRpb24gYW5zd2Vycy5cbiAgaWYgKHN0ZXAgPT09ICdhbmFseXNpcycpIHtcbiAgICBhd2FpdCBfc2hvd0FuYWx5c2lzQ2xhcmlmaWNhdGlvbkFtZW5kTW9kYWwoKCkgPT4gX2V4ZWN1dGVSZVJ1blBoYXNlKCdhbmFseXNpcycpKTtcbiAgICByZXR1cm47XG4gIH1cbiAgYXdhaXQgX2V4ZWN1dGVSZVJ1blBoYXNlKHN0ZXApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBfZXhlY3V0ZVJlUnVuUGhhc2Uoc3RlcCkge1xuICBjb25zdCBsb2FkaW5nTXNnID0gYXBwZW5kTG9hZGluZ01lc3NhZ2UoYFx1MjFCQiBSZS1ydW5uaW5nICR7c3RlcH1cdTIwMjZgKTtcbiAgc2V0TG9hZGluZyh0cnVlLCBgUmUtcnVubmluZyAke3N0ZXB9XHUyMDI2YCk7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL3JlLXJ1bi1waGFzZScsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeydDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbid9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe3BoYXNlOiBzdGVwfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgcmVtb3ZlTG9hZGluZ01lc3NhZ2UobG9hZGluZ01zZyk7XG4gICAgc2V0TG9hZGluZyhmYWxzZSk7XG5cbiAgICBpZiAoIXJlcy5vayB8fCAhZGF0YS5vaykge1xuICAgICAgYXBwZW5kUmV0cnlNZXNzYWdlKCdcdTI2QTAgUmUtcnVuIGZhaWxlZDogJyArIChkYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yJyksICgpID0+IHJlUnVuUGhhc2Uoc3RlcCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIGBcdTI3MDUgJHtzdGVwfSByZS1ydW4gY29tcGxldGUuIFJldmlldyB0aGUgdXBkYXRlZCByZXN1bHRzIFx1MjAxNCBjaGFuZ2VkIGl0ZW1zIGFyZSBoaWdobGlnaHRlZC5gKTtcbiAgICBhd2FpdCBmZXRjaFN0YXR1cygpO1xuXG4gICAgLy8gQ2xlYXIgcGVyLXBoYXNlIGNhY2hlcyBzbyBiYWNrLW5hdmlnYXRpb24gZmV0Y2hlcyBmcmVzaCByZXN1bHRzXG4gICAgaWYgKHN0ZXAgPT09ICdzcGVsbCcpICAgd2luZG93Ll9zcGVsbENoZWNrQ2FjaGUgID0gbnVsbDtcbiAgICBpZiAoc3RlcCA9PT0gJ3Jld3JpdGUnKSB3aW5kb3cuX3Jld3JpdGVQYW5lbENhY2hlID0gbnVsbDtcblxuICAgIC8vIE5hdmlnYXRlIHRvIHRoZSBzdGVwJ3Mgdmlld2VyIHRhYlxuICAgIGNvbnN0IHRhYk1hcCA9IHtcbiAgICAgIGFuYWx5c2lzOiAgICAgICAnYW5hbHlzaXMnLFxuICAgICAgY3VzdG9taXphdGlvbnM6ICdnb2FscycsXG4gICAgICByZXdyaXRlOiAgICAgICAgJ3Jld3JpdGUnLFxuICAgICAgc3BlbGw6ICAgICAgICAgICdzcGVsbCcsXG4gICAgfTtcbiAgICBpZiAodGFiTWFwW3N0ZXBdKSBzd2l0Y2hUYWIodGFiTWFwW3N0ZXBdKTtcblxuICAgIC8vIENvbXB1dGUgY2hhbmdlZC1pdGVtIElEcyBmcm9tIHByaW9yIHZzIG5ldyBvdXRwdXQgYW5kIGhpZ2hsaWdodCB0aGVtLlxuICAgIGlmIChkYXRhLnByaW9yX291dHB1dCAmJiBkYXRhLm5ld19vdXRwdXQpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gX2hpZ2hsaWdodENoYW5nZWRJdGVtcyhzdGVwLCBkYXRhLnByaW9yX291dHB1dCwgZGF0YS5uZXdfb3V0cHV0KSwgMzAwKTtcbiAgICB9XG5cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmVtb3ZlTG9hZGluZ01lc3NhZ2UobG9hZGluZ01zZyk7XG4gICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgYXBwZW5kUmV0cnlNZXNzYWdlKCdcdTI2QTAgTmV0d29yayBlcnJvciBpbiByZVJ1blBoYXNlOiAnICsgZXJyLm1lc3NhZ2UsICgpID0+IHJlUnVuUGhhc2Uoc3RlcCkpO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBIaWdobGlnaHQgY2hhbmdlZCBpdGVtcyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLyoqXG4gKiBDb21wYXJlIHByaW9yIGFuZCBuZXcgcmUtcnVuIG91dHB1dHM7IG1hcmsgRE9NIGVsZW1lbnRzIGZvciBjaGFuZ2VkIGVudGl0aWVzLlxuICpcbiAqIFN0cmF0ZWdpZXMgYnkgc3RlcDpcbiAqICAgcmV3cml0ZSAgICAgICAgXHUyMDE0IGNvbXBhcmUgcmV3cml0ZSBJRHM7IG1hcmsgcnctY2FyZC08aWQ+XG4gKiAgIGN1c3RvbWl6YXRpb25zIFx1MjAxNCBjb21wYXJlIGV4cGVyaWVuY2UgSURzOyBtYXJrIHRyW2RhdGEtZXhwLWlkXSBhbmQgdHJbZGF0YS1za2lsbF1cbiAqICAgYW5hbHlzaXMgICAgICAgXHUyMDE0IG5vIHBlci1lbnRpdHkgRE9NIHRhcmdldGluZzsgc2tpcFxuICovXG5mdW5jdGlvbiBfaGlnaGxpZ2h0Q2hhbmdlZEl0ZW1zKHN0ZXAsIHByaW9yT3V0cHV0LCBuZXdPdXRwdXQpIHtcbiAgaWYgKHN0ZXAgPT09ICdyZXdyaXRlJykge1xuICAgIGNvbnN0IHByaW9ySWRzID0gbmV3IFNldCgocHJpb3JPdXRwdXQucGVuZGluZ19yZXdyaXRlcyB8fCBbXSkubWFwKHIgPT4gU3RyaW5nKHIuaWQpKSk7XG4gICAgY29uc3QgbmV3SXRlbXMgID0gbmV3T3V0cHV0LnBlbmRpbmdfcmV3cml0ZXMgIHx8IFtdO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBuZXdJdGVtcykge1xuICAgICAgY29uc3QgaWQgICAgICA9IFN0cmluZyhpdGVtLmlkIHx8ICcnKTtcbiAgICAgIGNvbnN0IGNhcmRJZCAgPSBpZC5yZXBsYWNlKC9bXmEtekEtWjAtOV8tXS9nLCAnXycpO1xuICAgICAgY29uc3QgZWwgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBydy1jYXJkLSR7Y2FyZElkfWApO1xuICAgICAgaWYgKCFlbCkgY29udGludWU7XG4gICAgICBjb25zdCBpc05ldyAgICAgPSAhcHJpb3JJZHMuaGFzKGlkKTtcbiAgICAgIGNvbnN0IHByaW9ySXRlbSA9IChwcmlvck91dHB1dC5wZW5kaW5nX3Jld3JpdGVzIHx8IFtdKS5maW5kKHIgPT4gU3RyaW5nKHIuaWQpID09PSBpZCk7XG4gICAgICBjb25zdCBjaGFuZ2VkICAgPSBpc05ldyB8fCAocHJpb3JJdGVtICYmIHByaW9ySXRlbS5wcm9wb3NlZCAhPT0gaXRlbS5wcm9wb3NlZCk7XG4gICAgICBpZiAoY2hhbmdlZCkgX21hcmtDaGFuZ2VkKGVsKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHN0ZXAgPT09ICdjdXN0b21pemF0aW9ucycpIHtcbiAgICBjb25zdCBwcmlvckV4cElkcyA9IG5ldyBTZXQoXG4gICAgICAocHJpb3JPdXRwdXQuY3VzdG9taXphdGlvbnM/LmV4cGVyaWVuY2VfcmVjb21tZW5kYXRpb25zIHx8IFtdKS5tYXAociA9PiBTdHJpbmcoci5pZCkpXG4gICAgKTtcbiAgICBjb25zdCBuZXdFeHBSZWNzICA9IG5ld091dHB1dC5jdXN0b21pemF0aW9ucz8uZXhwZXJpZW5jZV9yZWNvbW1lbmRhdGlvbnMgfHwgW107XG4gICAgZm9yIChjb25zdCByZWMgb2YgbmV3RXhwUmVjcykge1xuICAgICAgY29uc3QgaWQgICA9IFN0cmluZyhyZWMuaWQgfHwgJycpO1xuICAgICAgY29uc3QgZWwgICA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYHRyW2RhdGEtZXhwLWlkPVwiJHtDU1MuZXNjYXBlKGlkKX1cIl1gKTtcbiAgICAgIGlmICghZWwpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgcHJpb3IgPSAocHJpb3JPdXRwdXQuY3VzdG9taXphdGlvbnM/LmV4cGVyaWVuY2VfcmVjb21tZW5kYXRpb25zIHx8IFtdKS5maW5kKHIgPT4gU3RyaW5nKHIuaWQpID09PSBpZCk7XG4gICAgICBpZiAoIXByaW9yRXhwSWRzLmhhcyhpZCkgfHwgKHByaW9yICYmIHByaW9yLnJlY29tbWVuZGF0aW9uICE9PSByZWMucmVjb21tZW5kYXRpb24pKSB7XG4gICAgICAgIF9tYXJrQ2hhbmdlZChlbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcHJpb3JTa2lsbHMgPSBuZXcgU2V0KFxuICAgICAgKHByaW9yT3V0cHV0LmN1c3RvbWl6YXRpb25zPy5za2lsbF9yZWNvbW1lbmRhdGlvbnMgfHwgW10pLm1hcChyID0+IChyLnNraWxsIHx8ICcnKS50b0xvd2VyQ2FzZSgpKVxuICAgICk7XG4gICAgY29uc3QgbmV3U2tpbGxSZWNzID0gbmV3T3V0cHV0LmN1c3RvbWl6YXRpb25zPy5za2lsbF9yZWNvbW1lbmRhdGlvbnMgfHwgW107XG4gICAgZm9yIChjb25zdCByZWMgb2YgbmV3U2tpbGxSZWNzKSB7XG4gICAgICBjb25zdCBuYW1lID0gKHJlYy5za2lsbCB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IGVsICAgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGB0cltkYXRhLXNraWxsPVwiJHtDU1MuZXNjYXBlKG5hbWUpfVwiXWApO1xuICAgICAgaWYgKCFlbCkgY29udGludWU7XG4gICAgICBjb25zdCBwcmlvciA9IChwcmlvck91dHB1dC5jdXN0b21pemF0aW9ucz8uc2tpbGxfcmVjb21tZW5kYXRpb25zIHx8IFtdKS5maW5kKFxuICAgICAgICByID0+IChyLnNraWxsIHx8ICcnKS50b0xvd2VyQ2FzZSgpID09PSBuYW1lXG4gICAgICApO1xuICAgICAgaWYgKCFwcmlvclNraWxscy5oYXMobmFtZSkgfHwgKHByaW9yICYmIHByaW9yLnJlY29tbWVuZGF0aW9uICE9PSByZWMucmVjb21tZW5kYXRpb24pKSB7XG4gICAgICAgIF9tYXJrQ2hhbmdlZChlbCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxufVxuXG4vKiogQXBwbHkgZGF0YS1jaGFuZ2VkIGF0dHJpYnV0ZSBhbmQgdHJpZ2dlciBoaWdobGlnaHQgYW5pbWF0aW9uIG9uIGFuIGVsZW1lbnQuICovXG5mdW5jdGlvbiBfbWFya0NoYW5nZWQoZWwpIHtcbiAgZWwuc2V0QXR0cmlidXRlKCdkYXRhLWNoYW5nZWQnLCAndHJ1ZScpO1xuICAvLyBSZW1vdmUgdGhlIGF0dHJpYnV0ZSBhZnRlciB0aGUgYW5pbWF0aW9uIGNvbXBsZXRlcyBzbyBpdCBjYW4gYmUgcmUtdHJpZ2dlcmVkIG9uIGEgc2Vjb25kIHJlcnVuLlxuICBzZXRUaW1lb3V0KCgpID0+IGVsLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1jaGFuZ2VkJyksIDI1MDApO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgQnVsbGV0IHJlb3JkZXIgbW9kYWwgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIHNob3dCdWxsZXRSZW9yZGVyKGV4cElkLCBleHBUaXRsZSkge1xuICAvLyBGZXRjaCBhY2hpZXZlbWVudHMgKHJlcXVpcmVkKSBhbmQgc3VnZ2VzdGVkIG9yZGVyIChiZXN0LWVmZm9ydCkuXG4gIGxldCBhY2hpZXZlbWVudHMgPSBbXTtcbiAgbGV0IHByb3Bvc2VkT3JkZXIgPSBudWxsO1xuICBsZXQgaGFzSm9iQW5hbHlzaXMgPSBmYWxzZTtcbiAgbGV0IHByb3Bvc2VkUmVhc29uaW5nID0gJyc7XG4gIGxldCBwcm9wb3NlZEF0c0ltcGFjdCA9ICcnO1xuICBsZXQgcHJvcG9zZWRQYWdlSW1wYWN0ID0gJyc7XG4gIHRyeSB7XG4gICAgY29uc3QgZGV0YWlsc1JlcyA9IGF3YWl0IGZldGNoKCcvYXBpL2V4cGVyaWVuY2UtZGV0YWlscycsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7J0NvbnRlbnQtVHlwZSc6J2FwcGxpY2F0aW9uL2pzb24nfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtleHBlcmllbmNlX2lkOiBleHBJZH0pLFxuICAgIH0pO1xuICAgIGlmICghZGV0YWlsc1Jlcy5vaykge1xuICAgICAgbGV0IGRldGFpbHNFcnIgPSBgSFRUUCAke2RldGFpbHNSZXMuc3RhdHVzfWA7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXlsb2FkID0gYXdhaXQgZGV0YWlsc1Jlcy5qc29uKCk7XG4gICAgICAgIGRldGFpbHNFcnIgPSBwYXlsb2FkLmVycm9yIHx8IHBheWxvYWQubWVzc2FnZSB8fCBkZXRhaWxzRXJyO1xuICAgICAgfSBjYXRjaCAoXykgeyAvKiBrZWVwIHN0YXR1cy1iYXNlZCBlcnJvciAqLyB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZGV0YWlsc0Vycik7XG4gICAgfVxuXG4gICAgY29uc3QgZGV0YWlsc0RhdGEgPSBhd2FpdCBkZXRhaWxzUmVzLmpzb24oKTtcbiAgICBhY2hpZXZlbWVudHMgID0gKGRldGFpbHNEYXRhLmV4cGVyaWVuY2UgJiYgZGV0YWlsc0RhdGEuZXhwZXJpZW5jZS5hY2hpZXZlbWVudHMpIHx8IFtdO1xuXG4gICAgY29uc3QgcmVjUmVjb3JkID0gX2ZpbmRFeHBlcmllbmNlUmVjb21tZW5kYXRpb25SZWNvcmQoZXhwSWQpO1xuICAgIGNvbnN0IGxsbUJ1bGxldE9yZGVyID0gcmVjUmVjb3JkICYmIHR5cGVvZiByZWNSZWNvcmQuYnVsbGV0X29yZGVyID09PSAnb2JqZWN0J1xuICAgICAgPyByZWNSZWNvcmQuYnVsbGV0X29yZGVyXG4gICAgICA6IG51bGw7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkobGxtQnVsbGV0T3JkZXI/Lm9yZGVyKSAmJiBsbG1CdWxsZXRPcmRlci5vcmRlci5sZW5ndGggPiAxKSB7XG4gICAgICBwcm9wb3NlZE9yZGVyID0gbGxtQnVsbGV0T3JkZXIub3JkZXI7XG4gICAgICBoYXNKb2JBbmFseXNpcyA9IHRydWU7XG4gICAgICBwcm9wb3NlZFJlYXNvbmluZyA9IFN0cmluZyhsbG1CdWxsZXRPcmRlci5yZWFzb25pbmcgfHwgJycpLnRyaW0oKTtcbiAgICAgIHByb3Bvc2VkQXRzSW1wYWN0ID0gU3RyaW5nKGxsbUJ1bGxldE9yZGVyLmF0c19pbXBhY3QgfHwgJycpLnRyaW0oKTtcbiAgICAgIHByb3Bvc2VkUGFnZUltcGFjdCA9IFN0cmluZyhsbG1CdWxsZXRPcmRlci5wYWdlX2xlbmd0aF9pbXBhY3QgfHwgJycpLnRyaW0oKTtcbiAgICB9XG5cbiAgICAvLyBTdWdnZXN0ZWQgb3JkZXIgaXMgb3B0aW9uYWw7IGZhaWx1cmVzIHNob3VsZCBub3QgYmxvY2sgb3BlbmluZyB0aGUgbW9kYWwuXG4gICAgaWYgKCFwcm9wb3NlZE9yZGVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwcm9wb3NlZFJlcyA9IGF3YWl0IGZldGNoKGAvYXBpL3Byb3Bvc2VkLWJ1bGxldC1vcmRlcj9leHBlcmllbmNlX2lkPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGV4cElkKX1gKTtcbiAgICAgICAgaWYgKHByb3Bvc2VkUmVzLm9rKSB7XG4gICAgICAgICAgY29uc3QgcHJvcG9zZWREYXRhID0gYXdhaXQgcHJvcG9zZWRSZXMuanNvbigpO1xuICAgICAgICAgIHByb3Bvc2VkT3JkZXIgPSBwcm9wb3NlZERhdGEucHJvcG9zZWRfb3JkZXIgfHwgbnVsbDtcbiAgICAgICAgICBoYXNKb2JBbmFseXNpcyA9IHByb3Bvc2VkRGF0YS5oYXNfam9iX2FuYWx5c2lzIHx8IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvZy53YXJuKCdDb3VsZCBub3QgbG9hZCBzdWdnZXN0ZWQgYnVsbGV0IG9yZGVyOicsIHByb3Bvc2VkUmVzLnN0YXR1cyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nLndhcm4oJ0NvdWxkIG5vdCBsb2FkIHN1Z2dlc3RlZCBidWxsZXQgb3JkZXI6JywgZSk7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc3QgZXJyb3JUZXh0ID0gZS5tZXNzYWdlID09PSAnRmFpbGVkIHRvIGZldGNoJ1xuICAgICAgPyAnRmFpbGVkIHRvIGZldGNoIChzZXJ2ZXIgdW5hdmFpbGFibGUpLidcbiAgICAgIDogZS5tZXNzYWdlO1xuICAgIGFwcGVuZFJldHJ5TWVzc2FnZSgnXHUyNkEwIENvdWxkIG5vdCBsb2FkIGJ1bGxldHM6ICcgKyBlcnJvclRleHQsICgpID0+IHNob3dCdWxsZXRSZW9yZGVyKGV4cElkLCBleHBUaXRsZSkpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIWFjaGlldmVtZW50cy5sZW5ndGgpIHtcbiAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnTm8gYnVsbGV0IHBvaW50cyBmb3VuZCBmb3IgdGhpcyBleHBlcmllbmNlLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFNhdmUgZm9jdXMgb3JpZ2luIGZvciByZXN0b3JhdGlvbiBvbiBjbG9zZSAoR0FQLTE3NilcbiAgaWYgKHR5cGVvZiBfZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBfZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIH1cblxuICAvLyBCdWlsZCBtb2RhbCBjb250ZW50XG4gIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIG1vZGFsLmlkID0gJ2J1bGxldC1yZW9yZGVyLW1vZGFsJztcbiAgbW9kYWwuc2V0QXR0cmlidXRlKCdyb2xlJywgJ2RpYWxvZycpO1xuICBtb2RhbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbW9kYWwnLCAndHJ1ZScpO1xuICBtb2RhbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWxsZWRieScsICdidWxsZXQtcmVvcmRlci10aXRsZScpO1xuICBtb2RhbC5zdHlsZS5jc3NUZXh0ID0gYFxuICAgIHBvc2l0aW9uOmZpeGVkO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JhY2tncm91bmQ6cmdiYSgwLDAsMCwwLjUpO1xuICAgIHotaW5kZXg6OTk5OTtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7YDtcblxuICBjb25zdCBzdWdnZXN0ZWRCdG4gPSBoYXNKb2JBbmFseXNpc1xuICAgID8gYDxidXR0b24gY2xhc3M9XCJidG4tc2Vjb25kYXJ5XCIgaWQ9XCJ1c2UtbGxtLW9yZGVyLWJ0blwiIHRpdGxlPVwiQXBwbHkgam9iLXJlbGV2YW5jZSByYW5raW5nIGZyb20geW91ciBqb2IgYW5hbHlzaXNcIlxuICAgICAgICAgc3R5bGU9XCJjb2xvcjojNjM2NmYxO2JvcmRlci1jb2xvcjojNjM2NmYxO1wiPlx1MjcyOCBVc2UgU3VnZ2VzdGVkIE9yZGVyPC9idXR0b24+YFxuICAgIDogJyc7XG4gIGNvbnN0IHN1Z2dlc3Rpb25NZXRhID0gcHJvcG9zZWRSZWFzb25pbmcgfHwgcHJvcG9zZWRBdHNJbXBhY3QgfHwgcHJvcG9zZWRQYWdlSW1wYWN0XG4gICAgPyBgPGRpdiBpZD1cImJ1bGxldC1vcmRlci1haS1ub3RlXCIgc3R5bGU9XCJmb250LXNpemU6MC44MmVtO2NvbG9yOiM0MzM4Y2E7YmFja2dyb3VuZDojZWVmMmZmO2JvcmRlcjoxcHggc29saWQgI2M3ZDJmZTtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjEwcHggMTJweDttYXJnaW4tYm90dG9tOjEycHg7XCI+XG4gICAgICAgICR7cHJvcG9zZWRSZWFzb25pbmcgPyBgPGRpdj48c3Ryb25nPkFJIHJhdGlvbmFsZTo8L3N0cm9uZz4gJHtlc2NhcGVIdG1sKHByb3Bvc2VkUmVhc29uaW5nKX08L2Rpdj5gIDogJyd9XG4gICAgICAgICR7cHJvcG9zZWRBdHNJbXBhY3QgPyBgPGRpdj48c3Ryb25nPkFUUyBpbXBhY3Q6PC9zdHJvbmc+ICR7ZXNjYXBlSHRtbChwcm9wb3NlZEF0c0ltcGFjdCl9PC9kaXY+YCA6ICcnfVxuICAgICAgICAke3Byb3Bvc2VkUGFnZUltcGFjdCA/IGA8ZGl2PjxzdHJvbmc+UGFnZSBsZW5ndGggaW1wYWN0Ojwvc3Ryb25nPiAke2VzY2FwZUh0bWwocHJvcG9zZWRQYWdlSW1wYWN0KX08L2Rpdj5gIDogJyd9XG4gICAgICA8L2Rpdj5gXG4gICAgOiAnJztcblxuICBtb2RhbC5pbm5lckhUTUwgPSBgXG4gICAgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2ZmZjtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjI0cHg7bWF4LXdpZHRoOjY0MHB4O3dpZHRoOjkyJTtcbiAgICAgICAgICAgICAgICBtYXgtaGVpZ2h0Ojgwdmg7b3ZlcmZsb3cteTphdXRvO2JveC1zaGFkb3c6MCAyMHB4IDYwcHggcmdiYSgwLDAsMCwwLjMpO1wiPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjthbGlnbi1pdGVtczpmbGV4LXN0YXJ0O21hcmdpbi1ib3R0b206MTZweDtcIj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8aDMgaWQ9XCJidWxsZXQtcmVvcmRlci10aXRsZVwiIHN0eWxlPVwibWFyZ2luOjA7Y29sb3I6IzFmMjkzNztcIj5cdTIxOTUgUmVvcmRlciBCdWxsZXRzPC9oMz5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiY29sb3I6IzZiNzI4MDtmb250LXNpemU6MC45ZW07bWFyZ2luLXRvcDo0cHg7XCI+JHtleHBUaXRsZX08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxidXR0b24gYXJpYS1sYWJlbD1cIkNsb3NlIHJlb3JkZXIgZGlhbG9nXCJcbiAgICAgICAgICBvbmNsaWNrPVwicmVzdG9yZUZvY3VzKCk7ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J1bGxldC1yZW9yZGVyLW1vZGFsJykucmVtb3ZlKClcIlxuICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDpub25lO2JvcmRlcjpub25lO2ZvbnQtc2l6ZToxLjRlbTtjdXJzb3I6cG9pbnRlcjtjb2xvcjojNmI3MjgwO1wiPlx1MjcxNTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtjb2xvcjojNmI3MjgwO21hcmdpbi1ib3R0b206MTJweDtcIj5cbiAgICAgICAgVXNlIFx1MjE5MSBcdTIxOTMgdG8gcmVvcmRlci4gQnVsbGV0cyBoaWdoZXIgaW4gdGhlIGxpc3QgYXBwZWFyIGZpcnN0IG9uIHlvdXIgQ1YuXG4gICAgICAgIFRoZSBtb3N0IHJlbGV2YW50IGJ1bGxldCB3aWxsIGJlIGF1dG8tcmFua2VkIGhpZ2hlc3QgaWYgeW91IHJlc2V0LlxuICAgICAgPC9kaXY+XG4gICAgICAke3N1Z2dlc3Rpb25NZXRhfVxuICAgICAgPG9sIGlkPVwiYnVsbGV0LXJlb3JkZXItbGlzdFwiIHN0eWxlPVwicGFkZGluZzowO21hcmdpbjowO2xpc3Qtc3R5bGU6bm9uZTtcIj5cbiAgICAgIDwvb2w+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDoxMHB4O21hcmdpbi10b3A6MThweDtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmQ7XCI+XG4gICAgICAgICR7c3VnZ2VzdGVkQnRufVxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLXNlY29uZGFyeVwiIG9uY2xpY2s9XCJyZXNldEJ1bGxldE9yZGVyKCcke2V4cElkfScpXCI+XHUyMUJBIFJlc2V0IHRvIEF1dG88L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1wcmltYXJ5XCIgICBvbmNsaWNrPVwic2F2ZUJ1bGxldE9yZGVyKCcke2V4cElkfScpO3Jlc3RvcmVGb2N1cygpXCI+U2F2ZSBPcmRlcjwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+YDtcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChtb2RhbCk7XG4gIGlmICh0eXBlb2YgdHJhcEZvY3VzID09PSAnZnVuY3Rpb24nKSB0cmFwRm9jdXMoJ2J1bGxldC1yZW9yZGVyLW1vZGFsJyk7XG4gIGlmICh0eXBlb2Ygc2V0SW5pdGlhbEZvY3VzID09PSAnZnVuY3Rpb24nKSBzZXRJbml0aWFsRm9jdXMoJ2J1bGxldC1yZW9yZGVyLW1vZGFsJyk7XG5cbiAgLy8gQ2xvc2Ugb24gRXNjYXBlXG4gIGNvbnN0IGVzY0hhbmRsZXIgPSAoZSkgPT4ge1xuICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHJlc3RvcmVGb2N1cygpO1xuICAgICAgbW9kYWwucmVtb3ZlKCk7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZXNjSGFuZGxlcik7XG4gICAgfVxuICB9O1xuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZXNjSGFuZGxlcik7XG5cbiAgLy8gUG9wdWxhdGUgbGlzdCBpdGVtc1xuICBjb25zdCBsaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J1bGxldC1yZW9yZGVyLWxpc3QnKTtcbiAgYWNoaWV2ZW1lbnRzLmZvckVhY2goKGFjaCwgaWR4KSA9PiB7XG4gICAgY29uc3QgdGV4dCA9ICh0eXBlb2YgYWNoID09PSAnb2JqZWN0JyA/IChhY2gudGV4dCB8fCAnJykgOiBTdHJpbmcoYWNoKSk7XG4gICAgY29uc3QgbGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpO1xuICAgIGxpLmRhdGFzZXQub3JpZ0luZGV4ID0gaWR4O1xuICAgIGxpLnN0eWxlLmNzc1RleHQgPSBgZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmZsZXgtc3RhcnQ7Z2FwOjhweDtwYWRkaW5nOjhweDttYXJnaW4tYm90dG9tOjZweDtcbiAgICAgIGJhY2tncm91bmQ6I2Y4ZmFmYztib3JkZXI6MXB4IHNvbGlkICNlMmU4ZjA7Ym9yZGVyLXJhZGl1czo2cHg7YDtcbiAgICBsaS5pbm5lckhUTUwgPSBgXG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtnYXA6MnB4O2ZsZXgtc2hyaW5rOjA7XCI+XG4gICAgICAgIDxidXR0b24gdGl0bGU9XCJNb3ZlIHVwXCIgYXJpYS1sYWJlbD1cIk1vdmUgYnVsbGV0IHVwXCJcbiAgICAgICAgICBvbmNsaWNrPVwibW92ZUJ1bGxldCh0aGlzLC0xKVwiXG4gICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOjFweCBzb2xpZCAjZDFkNWRiO2JvcmRlci1yYWRpdXM6M3B4O1xuICAgICAgICAgICAgICAgICBjdXJzb3I6cG9pbnRlcjtwYWRkaW5nOjFweCA1cHg7bGluZS1oZWlnaHQ6MS4yO2ZvbnQtc2l6ZTowLjllbTtcIj5cdTIxOTE8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiB0aXRsZT1cIk1vdmUgZG93blwiIGFyaWEtbGFiZWw9XCJNb3ZlIGJ1bGxldCBkb3duXCJcbiAgICAgICAgICBvbmNsaWNrPVwibW92ZUJ1bGxldCh0aGlzLCsxKVwiXG4gICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOjFweCBzb2xpZCAjZDFkNWRiO2JvcmRlci1yYWRpdXM6M3B4O1xuICAgICAgICAgICAgICAgICBjdXJzb3I6cG9pbnRlcjtwYWRkaW5nOjFweCA1cHg7bGluZS1oZWlnaHQ6MS4yO2ZvbnQtc2l6ZTowLjllbTtcIj5cdTIxOTM8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPHNwYW4gc3R5bGU9XCJmbGV4OjE7Zm9udC1zaXplOjAuOWVtO1wiPiR7dGV4dH08L3NwYW4+YDtcbiAgICBsaXN0LmFwcGVuZENoaWxkKGxpKTtcbiAgfSk7XG4gIF91cGRhdGVCdWxsZXRBcnJvd3MoKTtcblxuICAvLyBXaXJlIHVwIFwiVXNlIFN1Z2dlc3RlZCBPcmRlclwiIGJ1dHRvbiBpZiBqb2IgYW5hbHlzaXMgaXMgYXZhaWxhYmxlXG4gIGlmIChoYXNKb2JBbmFseXNpcyAmJiBwcm9wb3NlZE9yZGVyKSB7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VzZS1sbG0tb3JkZXItYnRuJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgX2FwcGx5QnVsbGV0T3JkZXIocHJvcG9zZWRPcmRlcik7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2FwcGx5QnVsbGV0T3JkZXIob3JkZXIpIHtcbiAgY29uc3QgbGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidWxsZXQtcmVvcmRlci1saXN0Jyk7XG4gIGlmICghbGlzdCkgcmV0dXJuO1xuICBjb25zdCBpdGVtcyA9IEFycmF5LmZyb20obGlzdC5xdWVyeVNlbGVjdG9yQWxsKCdsaScpKTtcbiAgLy8gQnVpbGQgYSBtYXAgZnJvbSBvcmlnSW5kZXggXHUyMTkyIGxpIGVsZW1lbnRcbiAgY29uc3QgYnlPcmlnID0ge307XG4gIGl0ZW1zLmZvckVhY2gobGkgPT4geyBieU9yaWdbcGFyc2VJbnQobGkuZGF0YXNldC5vcmlnSW5kZXgsIDEwKV0gPSBsaTsgfSk7XG4gIC8vIFJlLWFwcGVuZCBpbiBwcm9wb3NlZCBvcmRlciwgdGhlbiBhbnkgbm90IGxpc3RlZFxuICBjb25zdCBsaXN0ZWQgPSBuZXcgU2V0KG9yZGVyLm1hcChOdW1iZXIpKTtcbiAgb3JkZXIuZm9yRWFjaChpZHggPT4geyBpZiAoYnlPcmlnW2lkeF0pIGxpc3QuYXBwZW5kQ2hpbGQoYnlPcmlnW2lkeF0pOyB9KTtcbiAgaXRlbXMuZm9yRWFjaChsaSA9PiB7XG4gICAgaWYgKCFsaXN0ZWQuaGFzKHBhcnNlSW50KGxpLmRhdGFzZXQub3JpZ0luZGV4LCAxMCkpKSBsaXN0LmFwcGVuZENoaWxkKGxpKTtcbiAgfSk7XG4gIF91cGRhdGVCdWxsZXRBcnJvd3MoKTtcbn1cblxuZnVuY3Rpb24gbW92ZUJ1bGxldChidG4sIGRpcmVjdGlvbikge1xuICBjb25zdCBsaSAgID0gYnRuLmNsb3Nlc3QoJ2xpJyk7XG4gIGNvbnN0IGxpc3QgPSBsaS5wYXJlbnROb2RlO1xuICBpZiAoZGlyZWN0aW9uID09PSAtMSAmJiBsaS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nKSB7XG4gICAgbGlzdC5pbnNlcnRCZWZvcmUobGksIGxpLnByZXZpb3VzRWxlbWVudFNpYmxpbmcpO1xuICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gKzEgJiYgbGkubmV4dEVsZW1lbnRTaWJsaW5nKSB7XG4gICAgbGlzdC5pbnNlcnRCZWZvcmUobGkubmV4dEVsZW1lbnRTaWJsaW5nLCBsaSk7XG4gIH1cbiAgX3VwZGF0ZUJ1bGxldEFycm93cygpO1xufVxuXG5mdW5jdGlvbiBfdXBkYXRlQnVsbGV0QXJyb3dzKCkge1xuICBjb25zdCBsaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J1bGxldC1yZW9yZGVyLWxpc3QnKTtcbiAgaWYgKCFsaXN0KSByZXR1cm47XG4gIGNvbnN0IGl0ZW1zID0gbGlzdC5xdWVyeVNlbGVjdG9yQWxsKCdsaScpO1xuICBpdGVtcy5mb3JFYWNoKChsaSwgaWR4KSA9PiB7XG4gICAgY29uc3QgW3VwQnRuLCBkb3duQnRuXSA9IGxpLnF1ZXJ5U2VsZWN0b3JBbGwoJ2J1dHRvbicpO1xuICAgIHVwQnRuLmRpc2FibGVkICAgPSBpZHggPT09IDA7XG4gICAgZG93bkJ0bi5kaXNhYmxlZCA9IGlkeCA9PT0gaXRlbXMubGVuZ3RoIC0gMTtcbiAgICB1cEJ0bi5zdHlsZS5vcGFjaXR5ICAgPSB1cEJ0bi5kaXNhYmxlZCAgID8gJzAuMycgOiAnMSc7XG4gICAgZG93bkJ0bi5zdHlsZS5vcGFjaXR5ID0gZG93bkJ0bi5kaXNhYmxlZCA/ICcwLjMnIDogJzEnO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZUJ1bGxldE9yZGVyKGV4cElkKSB7XG4gIGNvbnN0IGxpc3QgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J1bGxldC1yZW9yZGVyLWxpc3QnKTtcbiAgY29uc3QgaXRlbXMgPSBsaXN0ID8gbGlzdC5xdWVyeVNlbGVjdG9yQWxsKCdsaScpIDogW107XG4gIGNvbnN0IG9yZGVyID0gQXJyYXkuZnJvbShpdGVtcykubWFwKGxpID0+IHBhcnNlSW50KGxpLmRhdGFzZXQub3JpZ0luZGV4LCAxMCkpO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9yZW9yZGVyLWJ1bGxldHMnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeydDb250ZW50LVR5cGUnOidhcHBsaWNhdGlvbi9qc29uJ30sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7ZXhwZXJpZW5jZV9pZDogZXhwSWQsIG9yZGVyfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKCFyZXMub2sgfHwgIWRhdGEub2spIHtcbiAgICAgIGFwcGVuZFJldHJ5TWVzc2FnZSgnXHUyNkEwIENvdWxkIG5vdCBzYXZlIGJ1bGxldCBvcmRlcjogJyArIChkYXRhLmVycm9yfHwnVW5rbm93bicpLCAoKSA9PiBzYXZlQnVsbGV0T3JkZXIoZXhwSWQpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ1x1MjE5NSBCdWxsZXQgb3JkZXIgc2F2ZWQuIEl0IHdpbGwgYXBwbHkgd2hlbiB5b3UgZ2VuZXJhdGUgdGhlIENWLicpO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidWxsZXQtcmVvcmRlci1tb2RhbCcpPy5yZW1vdmUoKTtcbiAgfSBjYXRjaChlKSB7XG4gICAgYXBwZW5kUmV0cnlNZXNzYWdlKCdcdTI2QTAgTmV0d29yayBlcnJvciBzYXZpbmcgYnVsbGV0IG9yZGVyOiAnICsgZS5tZXNzYWdlLCAoKSA9PiBzYXZlQnVsbGV0T3JkZXIoZXhwSWQpKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZXNldEJ1bGxldE9yZGVyKGV4cElkKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL3Jlb3JkZXItYnVsbGV0cycsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7J0NvbnRlbnQtVHlwZSc6J2FwcGxpY2F0aW9uL2pzb24nfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtleHBlcmllbmNlX2lkOiBleHBJZCwgb3JkZXI6IFtdfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKCFyZXMub2sgfHwgIWRhdGEub2spIHtcbiAgICAgIGFwcGVuZFJldHJ5TWVzc2FnZSgnXHUyNkEwIENvdWxkIG5vdCByZXNldCBidWxsZXQgb3JkZXI6ICcgKyAoZGF0YS5lcnJvcnx8J1Vua25vd24nKSwgKCkgPT4gcmVzZXRCdWxsZXRPcmRlcihleHBJZCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCAnXHUyMUJBIEJ1bGxldCBvcmRlciByZXNldC4gUmVsZXZhbmNlLWJhc2VkIG9yZGVyaW5nIHdpbGwgYXBwbHkuJyk7XG4gICAgcmVzdG9yZUZvY3VzKCk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J1bGxldC1yZW9yZGVyLW1vZGFsJyk/LnJlbW92ZSgpO1xuICB9IGNhdGNoKGUpIHtcbiAgICBhcHBlbmRSZXRyeU1lc3NhZ2UoJ1x1MjZBMCBOZXR3b3JrIGVycm9yIHJlc2V0dGluZyBidWxsZXQgb3JkZXI6ICcgKyBlLm1lc3NhZ2UsICgpID0+IHJlc2V0QnVsbGV0T3JkZXIoZXhwSWQpKTtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgRm9yd2FyZC1za2lwIHBoYXNlIHdhdGVybWFyayAoR0FQLTEwMSkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8vIEJhY2tlbmQgcGhhc2Ugb3JkZXJpbmcgKG1hdGNoZXMgY29udmVyc2F0aW9uX21hbmFnZXIucHkgX1BIQVNFX09SREVSKS5cbmNvbnN0IF9QSEFTRV9QUk9HUkVTU0lPTiA9IFtcbiAgJ2luaXQnLCAnam9iX2FuYWx5c2lzJywgJ2N1c3RvbWl6YXRpb24nLCAncmV3cml0ZV9yZXZpZXcnLFxuICAnc3BlbGxfY2hlY2snLCAnZ2VuZXJhdGlvbicsICdsYXlvdXRfcmV2aWV3JywgJ2ZpbmFsX2dlbmVyYXRpb24nLCAncmVmaW5lbWVudCcsXG5dO1xuXG4vLyBNaW5pbXVtIGhpZ2hlc3RQaGFzZSBpbmRleCByZXF1aXJlZCBmb3IgZWFjaCBzdGVwIHRvIGJlIGZvcndhcmQtc2tpcHBhYmxlLlxuY29uc3QgX1NURVBfRldEX1BIQVNFX01JTiA9IHtcbiAgYW5hbHlzaXM6ICAgICAgIDEsICAgLy8gam9iX2FuYWx5c2lzXG4gIGN1c3RvbWl6YXRpb25zOiAyLCAgIC8vIGN1c3RvbWl6YXRpb25cbiAgcmV3cml0ZTogICAgICAgIDMsICAgLy8gcmV3cml0ZV9yZXZpZXdcbiAgc3BlbGw6ICAgICAgICAgIDQsICAgLy8gc3BlbGxfY2hlY2tcbiAgbGF5b3V0OiAgICAgICAgIDUsICAgLy8gZ2VuZXJhdGlvblxuICBkb3dubG9hZDogICAgICAgNywgICAvLyBmaW5hbF9nZW5lcmF0aW9uXG4gIGNvdmVyX2xldHRlcjogICA3LFxuICBzY3JlZW5pbmc6ICAgICAgNyxcbiAgaW50ZXJ2aWV3X3ByZXA6IDcsXG4gIHRoYW5rX3lvdTogICAgICA3LFxuICBoYXJ2ZXN0OiAgICAgICAgNyxcbn07XG5cbi8vIFx1MjUwMFx1MjUwMCBXb3JrZmxvdyBzdGVwIGJhciBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gdXBkYXRlV29ya2Zsb3dTdGVwcyhzdGF0dXMpIHtcbiAgLy8gMTItc3RlcCB3b3JrZmxvdyBiYXI6IEpvYiBJbnB1dCBcdTIxOTIgQW5hbHlzaXMgXHUyMTkyIEN1c3RvbWlzZSBcdTIxOTIgUmV3cml0ZXMgXHUyMTkyXG4gIC8vICAgU3BlbGwgQ2hlY2sgXHUyMTkyIExheW91dCBSZXZpZXcgXHUyMTkyIERvd25sb2FkIFx1MjE5MiBDb3ZlciBMZXR0ZXIgXHUyMTkyIFNjcmVlbmluZyBcdTIxOTJcbiAgLy8gICBJbnRlcnZpZXcgUHJlcCBcdTIxOTIgVGhhbmsgWW91IFx1MjE5MiBIYXJ2ZXN0XG4gIC8vXG4gIGNvbnN0IFVQQ09NSU5HID0gbmV3IFNldCgpO1xuXG4gIC8vIFN0ZXBzIHRoYXQgc3VwcG9ydCBMTE0gcmUtZXhlY3V0aW9uIHZpYSAvYXBpL3JlLXJ1bi1waGFzZVxuICBjb25zdCBSRV9SVU5fU1RFUFMgPSBuZXcgU2V0KFsnYW5hbHlzaXMnLCAnY3VzdG9taXphdGlvbnMnLCAncmV3cml0ZScsICdzcGVsbCcsICdsYXlvdXQnXSk7XG5cbiAgLy8gQmFzZSBsYWJlbCBmb3IgZWFjaCBzdGVwICh1c2VkIHdoZW4gaW5qZWN0aW5nIFx1MjFCQiBidXR0b24pXG4gIGNvbnN0IFNURVBfTEFCRUxTID0ge1xuICAgIGpvYjogICAgICAgICAgICAnXHVEODNEXHVEQ0U1IEpvYiBJbnB1dCcsXG4gICAgYW5hbHlzaXM6ICAgICAgICdcdUQ4M0RcdUREMEQgQW5hbHlzaXMnLFxuICAgIGN1c3RvbWl6YXRpb25zOiAnXHUyNjk5XHVGRTBGIEN1c3RvbWlzZScsXG4gICAgcmV3cml0ZTogICAgICAgICdcdTI3MEZcdUZFMEYgUmV3cml0ZXMnLFxuICAgIHNwZWxsOiAgICAgICAgICAnXHVEODNEXHVERDI0IFNwZWxsIENoZWNrJyxcbiAgICBsYXlvdXQ6ICAgICAgICAgJ1x1RDgzQ1x1REZBOCBMYXlvdXQgUmV2aWV3JyxcbiAgICBkb3dubG9hZDogICAgICAgJ1x1MkIwN1x1RkUwRiBEb3dubG9hZCBGaWxlcycsXG4gICAgY292ZXJfbGV0dGVyOiAgICdcdUQ4M0RcdURDRTkgQ292ZXIgTGV0dGVyJyxcbiAgICBzY3JlZW5pbmc6ICAgICAgJ1x1RDgzRFx1RENDQiBTY3JlZW5pbmcnLFxuICAgIGludGVydmlld19wcmVwOiAnXHVEODNDXHVERkE0IEludGVydmlldyBQcmVwJyxcbiAgICB0aGFua195b3U6ICAgICAgJ1x1RDgzRFx1REU0RiBUaGFuayBZb3UnLFxuICAgIGhhcnZlc3Q6ICAgICAgICAnXHVEODNDXHVERjNFIEhhcnZlc3QnLFxuICB9O1xuXG4gIC8vIERldGVybWluZSB3aGljaCBzdGVwcyBhcmUgZG9uZSBiYXNlZCBvbiBzZXNzaW9uIHN0YXRlIGZpZWxkcy5cbiAgY29uc3QgcGhhc2UgPSBzdGF0dXMucGhhc2UgfHwgJyc7XG4gIC8vIEFsbCBwb3N0LWxheW91dCBwaGFzZXMgdW5sb2NrIHNpbXVsdGFuZW91c2x5IG9uY2UgbGF5b3V0IGlzIGNvbmZpcm1lZC5cbiAgY29uc3QgcG9zdExheW91dCA9IHBoYXNlID09PSBQSEFTRVMuRklOQUxfR0VORVJBVElPTiB8fCBwaGFzZSA9PT0gUEhBU0VTLlJFRklORU1FTlQ7XG4gIGNvbnN0IGRvbmUgPSB7XG4gICAgam9iOiAgICAgICAgICAgICEhc3RhdHVzLmpvYl9kZXNjcmlwdGlvbixcbiAgICBhbmFseXNpczogICAgICAgISFzdGF0dXMuam9iX2FuYWx5c2lzLFxuICAgIGN1c3RvbWl6YXRpb25zOiAhIXN0YXR1cy5jdXN0b21pemF0aW9ucyxcbiAgICByZXdyaXRlOiAgICAgICAgcGhhc2UgIT09IFBIQVNFUy5SRVdSSVRFX1JFVklFVyAmJiAoISFzdGF0dXMuY3VzdG9taXphdGlvbnMpLFxuICAgIHNwZWxsOiAgICAgICAgICBwaGFzZSA9PT0gUEhBU0VTLkdFTkVSQVRJT04gfHwgcGhhc2UgPT09IFBIQVNFUy5MQVlPVVRfUkVWSUVXIHx8XG4gICAgICAgICAgICAgICAgICAgIHBoYXNlID09PSBQSEFTRVMuRklOQUxfR0VORVJBVElPTiB8fCBwaGFzZSA9PT0gUEhBU0VTLlJFRklORU1FTlQsXG4gICAgbGF5b3V0OiAgICAgICAgIHBvc3RMYXlvdXQsXG4gICAgZG93bmxvYWQ6ICAgICAgIHBvc3RMYXlvdXQsXG4gICAgY292ZXJfbGV0dGVyOiAgIHBvc3RMYXlvdXQsXG4gICAgc2NyZWVuaW5nOiAgICAgIHBvc3RMYXlvdXQsXG4gICAgaW50ZXJ2aWV3X3ByZXA6IHBvc3RMYXlvdXQsXG4gICAgdGhhbmtfeW91OiAgICAgIHBvc3RMYXlvdXQsXG4gICAgaGFydmVzdDogICAgICAgIHBvc3RMYXlvdXQsXG4gIH07XG5cbiAgLy8gRm9yd2FyZC1za2lwIHdhdGVybWFyayAoR0FQLTEwMSk6IHN0ZXBzIHByZXZpb3VzbHkgcmVhY2hlZCBidXQgbm90IGN1cnJlbnRseVxuICAvLyBcImRvbmVcIiBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgcGhhc2UgYXJlIHN0aWxsIG5hdmlnYWJsZSB3aXRoIGEgY29uZmlybWF0aW9uLlxuICBjb25zdCBoaWdoZXN0UGhhc2VJZHggPSBfUEhBU0VfUFJPR1JFU1NJT04uaW5kZXhPZihzdGF0dXMuaGlnaGVzdF9waGFzZSB8fCAnJyk7XG4gIGNvbnN0IGN1cnJlbnRQaGFzZUlkeCA9IF9QSEFTRV9QUk9HUkVTU0lPTi5pbmRleE9mKHBoYXNlKTtcblxuICAvLyBEZXRlcm1pbmUgdGhlIGFjdGl2ZSBzdGVwIGZyb20gdGhlIGJhY2tlbmQgcGhhc2Ugc3RyaW5nLlxuICBjb25zdCBwaGFzZVRvU3RlcCA9IHtcbiAgICAnaW5pdCc6ICAgICAgICAgICAgICdqb2InLFxuICAgICdqb2JfYW5hbHlzaXMnOiAgICAgJ2FuYWx5c2lzJyxcbiAgICAnY3VzdG9taXphdGlvbic6ICAgICdjdXN0b21pemF0aW9ucycsXG4gICAgJ3Jld3JpdGVfcmV2aWV3JzogICAncmV3cml0ZScsXG4gICAgJ3NwZWxsX2NoZWNrJzogICAgICAnc3BlbGwnLFxuICAgICdnZW5lcmF0aW9uJzogICAgICAgJ2xheW91dCcsXG4gICAgJ2xheW91dF9yZXZpZXcnOiAgICAnbGF5b3V0JyxcbiAgICAnZmluYWxfZ2VuZXJhdGlvbic6ICdkb3dubG9hZCcsXG4gICAgJ3JlZmluZW1lbnQnOiAgICAgICAnZG93bmxvYWQnLFxuICB9O1xuICBjb25zdCBhY3RpdmVTdGVwID0gcGhhc2VUb1N0ZXBbcGhhc2VdIHx8ICdqb2InO1xuXG4gIC8vIFJlc29sdmUgdGhlIHJlZW50cnkgc3RlcCBmb3IgdGhlIFwiUmVmaW5pbmdcIiBiYWRnZVxuICBjb25zdCBfcGhhc2VUb1N0ZXAyID0gT2JqZWN0LmFzc2lnbih7J2luaXQnOiAnam9iJ30sIHBoYXNlVG9TdGVwKTtcbiAgY29uc3QgcmVlbnRyeVN0ZXAgPSBzdGF0dXMuaXRlcmF0aW5nXG4gICAgPyAoX3BoYXNlVG9TdGVwMltzdGF0dXMucmVlbnRyeV9waGFzZV0gfHwgc3RhdHVzLnJlZW50cnlfcGhhc2UgfHwgbnVsbClcbiAgICA6IG51bGw7XG5cbiAgY29uc3Qgc3RlcElkcyA9IFtcbiAgICAnam9iJywgJ2FuYWx5c2lzJywgJ2N1c3RvbWl6YXRpb25zJywgJ3Jld3JpdGUnLCAnc3BlbGwnLCAnbGF5b3V0JyxcbiAgICAnZG93bmxvYWQnLCAnY292ZXJfbGV0dGVyJywgJ3NjcmVlbmluZycsICdpbnRlcnZpZXdfcHJlcCcsICd0aGFua195b3UnLCAnaGFydmVzdCcsXG4gIF07XG4gIGNvbnN0IHN0YWxlU3RlcHMgPSBuZXcgU2V0KHN0YXR1cy5zdGFsZV9zdGVwcyB8fCBbXSk7XG4gIHN0ZXBJZHMuZm9yRWFjaChzdGVwID0+IHtcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzdGVwLSR7c3RlcH1gKTtcbiAgICBpZiAoIWVsKSByZXR1cm47XG4gICAgLy8gVXBjb21pbmcgc3RlcHMgYXJlIGZpeGVkIFx1MjAxNCBuZXZlciBjaGFuZ2UgdGhlaXIgY2xhc3MuXG4gICAgaWYgKFVQQ09NSU5HLmhhcyhzdGVwKSkgcmV0dXJuO1xuICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScsICdjb21wbGV0ZWQnLCAnY2xpY2thYmxlJywgJ3VwY29taW5nJywgJ3N0YWxlJywgJ2ZvcndhcmQtc2tpcCcpO1xuXG4gICAgbGV0IGxhYmVsID0gU1RFUF9MQUJFTFNbc3RlcF0gfHwgc3RlcDtcblxuICAgIGlmIChzdGVwID09PSBhY3RpdmVTdGVwKSB7XG4gICAgICBlbC5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICAgIC8vIFwiXHUyMUJCIFJlZmluaW5nXCIgYmFkZ2Ugc2hvd24gb24gdGhlIGFjdGl2ZSBzdGVwIHdoZW4gaXRlcmF0aW5nXG4gICAgICBpZiAoc3RhdHVzLml0ZXJhdGluZyAmJiByZWVudHJ5U3RlcCA9PT0gc3RlcCkge1xuICAgICAgICBsYWJlbCArPSAnIDxzcGFuIGNsYXNzPVwic3RlcC1pbmxpbmUtYmFkZ2VcIj5cdTIxQkIgUmVmaW5pbmc8L3NwYW4+JztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGRvbmVbc3RlcF0pIHtcbiAgICAgIGVsLmNsYXNzTGlzdC5hZGQoJ2NvbXBsZXRlZCcpO1xuICAgICAgLy8gQ29tcGxldGVkIHN0ZXBzIGFyZSBjbGlja2FibGUgZm9yIGJhY2stbmF2aWdhdGlvbi5cbiAgICAgIGVsLmNsYXNzTGlzdC5hZGQoJ2NsaWNrYWJsZScpO1xuICAgICAgLy8gQWRkIFx1MjFCQiByZS1ydW4gYnV0dG9uIGZvciBzdGVwcyB0aGF0IHN1cHBvcnQgTExNIHJlLWV4ZWN1dGlvblxuICAgICAgaWYgKFJFX1JVTl9TVEVQUy5oYXMoc3RlcCkpIHtcbiAgICAgICAgY29uc3QgcmVydW5MYWJlbCA9IF9TVEVQX0RJU1BMQVlbc3RlcF0gfHwgc3RlcDtcbiAgICAgICAgbGFiZWwgKz0gYCA8YnV0dG9uIGNsYXNzPVwic3RlcC1yZXJ1blwiIGFyaWEtbGFiZWw9XCJSZS1ydW4gJHtyZXJ1bkxhYmVsfVwiXG4gICAgICAgICAgdGl0bGU9XCJSZS1ydW4gJHtzdGVwfSB3aXRoIHVwZGF0ZWQgaW5wdXRzXCJcbiAgICAgICAgICBvbmNsaWNrPVwiZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7Y29uZmlybVJlUnVuUGhhc2UoJyR7c3RlcH0nKVwiXG4gICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6MC44ZW07b3BhY2l0eTowLjM1O3RyYW5zaXRpb246b3BhY2l0eSAwLjE1czttYXJnaW4tbGVmdDoycHg7Y3Vyc29yOnBvaW50ZXI7YmFja2dyb3VuZDpub25lO2JvcmRlcjpub25lO3BhZGRpbmc6MDtjb2xvcjppbmhlcml0O2xpbmUtaGVpZ2h0OjE7XCI+XHUyMUJCPC9idXR0b24+YDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGhpZ2hlc3RQaGFzZUlkeCA+PSAwICYmIChfU1RFUF9GV0RfUEhBU0VfTUlOW3N0ZXBdID8/IEluZmluaXR5KSA8PSBoaWdoZXN0UGhhc2VJZHhcbiAgICAgICAgICAgICAgICYmIGhpZ2hlc3RQaGFzZUlkeCA+IGN1cnJlbnRQaGFzZUlkeCkge1xuICAgICAgLy8gRm9yd2FyZC1za2lwOiBzdGVwIHdhcyBjb21wbGV0ZWQgaW4gYSBwcmlvciBpdGVyYXRpb24gYnV0IGlzIGFoZWFkIG9mIGN1cnJlbnQgcGhhc2UuXG4gICAgICBlbC5jbGFzc0xpc3QuYWRkKCdmb3J3YXJkLXNraXAnLCAnY2xpY2thYmxlJyk7XG4gICAgICBsYWJlbCArPSAnIDxzcGFuIGNsYXNzPVwic3RlcC1pbmxpbmUtYmFkZ2Ugc3RlcC1md2QtYmFkZ2VcIiB0aXRsZT1cIlByZXZpb3VzbHkgY29tcGxldGVkIFx1MjAxNCBjbGljayB0byBqdW1wIGFoZWFkXCI+XHUyM0U5PC9zcGFuPic7XG4gICAgfVxuXG4gICAgLy8gQXBwbHkgc3RhbGUgY2xhc3MgZm9yIHN0ZXBzIGRvd25zdHJlYW0gb2YgYSByZS1ydW5cbiAgICBpZiAoc3RhbGVTdGVwcy5oYXMoc3RlcCkpIGVsLmNsYXNzTGlzdC5hZGQoJ3N0YWxlJyk7XG5cbiAgICAvLyBBcHBlbmQgc3Itb25seSBzdGF0ZSBkZXNjcmlwdGlvbiBmb3Igc2NyZWVuIHJlYWRlciB1c2Vyc1xuICAgIGNvbnN0IGlzU3RhbGUgICAgICAgICA9IHN0YWxlU3RlcHMuaGFzKHN0ZXApO1xuICAgIGNvbnN0IGlzU3RhbGVDcml0aWNhbCA9IGVsLmNsYXNzTGlzdC5jb250YWlucygnc3RhbGUtY3JpdGljYWwnKTtcbiAgICBjb25zdCBpc0FjdGl2ZSAgICAgICAgPSBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2FjdGl2ZScpO1xuICAgIGNvbnN0IGlzQ29tcGxldGVkICAgICA9IGVsLmNsYXNzTGlzdC5jb250YWlucygnY29tcGxldGVkJyk7XG4gICAgY29uc3QgaXNGd2RTa2lwICAgICAgID0gZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdmb3J3YXJkLXNraXAnKTtcbiAgICBjb25zdCBzclN0YXRlID0gaXNTdGFsZUNyaXRpY2FsID8gJyAoY3JpdGljYWwgXHUyMDE0IHJldmlldyByZXF1aXJlZCknXG4gICAgICA6IGlzU3RhbGUgICAgID8gJyAoc3RhbGUgXHUyMDE0IHJlc3VsdHMgbWF5IGJlIG91dGRhdGVkKSdcbiAgICAgIDogaXNBY3RpdmUgICAgPyAnIChjdXJyZW50IHN0ZXApJ1xuICAgICAgOiBpc0NvbXBsZXRlZCA/ICcgKGNvbXBsZXRlZCknXG4gICAgICA6IGlzRndkU2tpcCAgID8gJyAocHJldmlvdXNseSBjb21wbGV0ZWQgXHUyMDE0IGNsaWNrIHRvIGp1bXAgYWhlYWQpJ1xuICAgICAgOiAnJztcbiAgICBpZiAoc3JTdGF0ZSkgbGFiZWwgKz0gYDxzcGFuIGNsYXNzPVwic3Itb25seVwiPiR7c3JTdGF0ZX08L3NwYW4+YDtcblxuICAgIGVsLmlubmVySFRNTCA9IGxhYmVsO1xuICB9KTtcblxuICBhcHBseUxheW91dEZyZXNobmVzc05hdmlnYXRpb25TdGF0ZSgpO1xuXG4gIC8vIFNob3cgXHUyMUJCIGljb25zIHZpYSBDU1MgOmhvdmVyIG9uIHRoZSBwYXJlbnQgLmNvbXBsZXRlZCBzdGVwXG4gIC8vIChpbmplY3QgYSA8c3R5bGU+IG9ubHkgb25jZSlcbiAgaWYgKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RlcC1yZXJ1bi1zdHlsZScpKSB7XG4gICAgY29uc3QgcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgcy5pZCA9ICdzdGVwLXJlcnVuLXN0eWxlJztcbiAgICBzLnRleHRDb250ZW50ID0gJy5zdGVwLmNvbXBsZXRlZDpob3ZlciAuc3RlcC1yZXJ1biwgLnN0ZXAuY29tcGxldGVkOmZvY3VzLXdpdGhpbiAuc3RlcC1yZXJ1biB7IG9wYWNpdHk6IDEgIWltcG9ydGFudDsgfSAuc3RlcC1yZXJ1bjpmb2N1cy12aXNpYmxlIHsgb3V0bGluZTogMnB4IHNvbGlkICMzYjgyZjY7IG91dGxpbmUtb2Zmc2V0OiAycHg7IG9wYWNpdHk6IDEgIWltcG9ydGFudDsgfSc7XG4gICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzKTtcbiAgfVxuXG4gIC8vIFN5bmMgc2Vjb25kLWJhciB0YWIgdmlzaWJpbGl0eSBhbmQgYWN0aW9uIGJ1dHRvbnMgdG8gdGhlIGFjdGl2ZSB3b3JrZmxvdyBzdGVwXG4gIGlmICh0eXBlb2YgdXBkYXRlVGFiQmFyRm9yU3RhZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICB1cGRhdGVUYWJCYXJGb3JTdGFnZShhY3RpdmVTdGVwKTtcbiAgfVxuICB1cGRhdGVBY3Rpb25CdXR0b25zKGFjdGl2ZVN0ZXApO1xuXG4gIC8vIFN5bmMgdmlldy1jdXJzb3IgcmluZyB0byB0aGUgY3VycmVudGx5IHZpc2libGUgdGFiXG4gIF91cGRhdGVWaWV3aW5nSW5kaWNhdG9yKHN0YXRlTWFuYWdlci5nZXRDdXJyZW50VGFiKCkpO1xufVxuXG5pZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoR0VORVJBVElPTl9TVEFURV9FVkVOVCwgYXBwbHlMYXlvdXRGcmVzaG5lc3NOYXZpZ2F0aW9uU3RhdGUpO1xuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihHRU5FUkFUSU9OX1NUQVRFX0VWRU5ULCBhcHBseURpcnR5UGhhc2VOYXZpZ2F0aW9uU3RhdGUpO1xufVxuXG4vKipcbiAqIE1hcmsgb3IgdW5tYXJrIHdvcmtmbG93IHN0ZXAgcGlsbHMgYXMgc3RhbGUgYmFzZWQgb24gZGlydHkgcGhhc2VzIHNldCBieVxuICogbGF5b3V0LXBoYXNlIGNvbnRlbnQgZWRpdHMgKFBPU1QgL2FwaS9jdi9hcHBseS1jb250ZW50LWNoYW5nZXMpLlxuICpcbiAqIE9ubHkgYWZmZWN0cyBzdGVwcyBsaXN0ZWQgaW4gc3RhdGVNYW5hZ2VyLmdldERpcnR5UGhhc2VzKCkgdGhhdCBhcmUgTk9UXG4gKiBhbHJlYWR5IGhhbmRsZWQgYnkgYXBwbHlMYXlvdXRGcmVzaG5lc3NOYXZpZ2F0aW9uU3RhdGUgKGkuZS4gbm90ICdsYXlvdXQnKS5cbiAqL1xuZnVuY3Rpb24gYXBwbHlEaXJ0eVBoYXNlTmF2aWdhdGlvblN0YXRlKCkge1xuICBjb25zdCBkaXJ0eVBoYXNlcyA9IHN0YXRlTWFuYWdlci5nZXREaXJ0eVBoYXNlcygpO1xuICBjb25zdCBzdGVwc1RvQ2xlYXIgPSBbXTsgICAgLy8gc3RlcHMgd2UgbWFuYWdlIGhlcmUgKG5vdCAnbGF5b3V0JylcblxuICBzdGVwc1RvQ2xlYXIuZm9yRWFjaChzdGVwID0+IHtcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzdGVwLSR7c3RlcH1gKTtcbiAgICBpZiAoIWVsKSByZXR1cm47XG5cbiAgICBjb25zdCBpc0RpcnR5ID0gZGlydHlQaGFzZXMuaW5jbHVkZXMoc3RlcCk7XG4gICAgZWwuY2xhc3NMaXN0LnRvZ2dsZSgnc3RhbGUnLCBpc0RpcnR5KTtcblxuICAgIC8vIFByZXNlcnZlIGV4aXN0aW5nIHJlcnVuIGJ1dHRvbiBtYXJrdXAsIHVwZGF0ZSB0ZXh0ICsgYmFkZ2VcbiAgICBjb25zdCByZXJ1bkh0bWwgPSBlbC5xdWVyeVNlbGVjdG9yKCcuc3RlcC1yZXJ1bicpPy5vdXRlckhUTUwgfHwgJyc7XG4gICAgY29uc3QgbGFiZWwgICAgID0gX1NURVBfRElTUExBWVtzdGVwXSB8fCBzdGVwO1xuICAgIGNvbnN0IGJhZGdlICAgICA9IGlzRGlydHlcbiAgICAgID8gJyA8c3BhbiBjbGFzcz1cInN0ZXAtaW5saW5lLWJhZGdlIHN0ZXAtc3RhbGUtYmFkZ2VcIj5Db250ZW50IGNoYW5nZWQ8L3NwYW4+J1xuICAgICAgOiAnJztcbiAgICBlbC5pbm5lckhUTUwgPSBgJHtsYWJlbH0ke2JhZGdlfSR7cmVydW5IdG1sID8gYCAke3JlcnVuSHRtbH1gIDogJyd9YDtcbiAgfSk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBTdGVwIG5hdmlnYXRpb24gaGVscGVyIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBfZG9TdGVwTmF2aWdhdGUoc3RlcCkge1xuICBjb25zdCBzdGVwVG9UYWIgPSB7XG4gICAgYW5hbHlzaXM6ICAgICAgICdhbmFseXNpcycsXG4gICAgY3VzdG9taXphdGlvbnM6ICdnb2FscycsXG4gICAgcmV3cml0ZTogICAgICAgICdyZXdyaXRlJyxcbiAgICBzcGVsbDogICAgICAgICAgJ3NwZWxsJyxcbiAgICBsYXlvdXQ6ICAgICAgICAgJ2xheW91dCcsXG4gICAgZG93bmxvYWQ6ICAgICAgICdmaW5hbF9nZW5lcmF0ZScsXG4gICAgY292ZXJfbGV0dGVyOiAgICdjb3Zlci1sZXR0ZXInLFxuICAgIHNjcmVlbmluZzogICAgICAnc2NyZWVuaW5nJyxcbiAgICBpbnRlcnZpZXdfcHJlcDogJ2ludGVydmlldy1wcmVwJyxcbiAgICB0aGFua195b3U6ICAgICAgJ3RoYW5rLXlvdScsXG4gICAgaGFydmVzdDogICAgICAgICdoYXJ2ZXN0JyxcbiAgfTtcbiAgY29uc3QgdGFiTmFtZSA9IHN0ZXBUb1RhYltzdGVwXTtcbiAgaWYgKCF0YWJOYW1lKSByZXR1cm47XG4gIGlmICh0eXBlb2YgdXBkYXRlVGFiQmFyRm9yU3RhZ2UgPT09ICdmdW5jdGlvbicpIHVwZGF0ZVRhYkJhckZvclN0YWdlKHN0ZXApO1xuICBzd2l0Y2hUYWIodGFiTmFtZSk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBTdGVwIGNsaWNrIChiYWNrLW5hdikgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8vIEJhY2stbmF2aWdhdGlvbjogY2xpY2tpbmcgYSBjb21wbGV0ZWQgd29ya2Zsb3cgc3RlcCBuYXZpZ2F0ZXMgdG8gaXRzIHZpZXdlciB0YWIuXG4vLyBDbGlja2luZyB0aGUgam9iIHN0ZXAgYWx3YXlzIG9wZW5zIHRoZSBsb2FkLWpvYiBwYW5lbC5cbmZ1bmN0aW9uIGhhbmRsZVN0ZXBDbGljayhzdGVwKSB7XG4gIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHN0ZXAtJHtzdGVwfWApO1xuICBpZiAoIWVsKSByZXR1cm47XG5cbiAgLy8gSm9iIHN0ZXA6IHNob3cgam9iIGNvbnRlbnQgaWYgYSBqb2IgaXMgbG9hZGVkLCBvdGhlcndpc2Ugb3BlbiB0aGUgbG9hZCBwYW5lbC5cbiAgaWYgKHN0ZXAgPT09ICdqb2InKSB7XG4gICAgaWYgKGVsLmNsYXNzTGlzdC5jb250YWlucygnY29tcGxldGVkJykgfHwgZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdhY3RpdmUnKSkge1xuICAgICAgc3dpdGNoVGFiKCdqb2InKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2hvd0xvYWRKb2JQYW5lbCgpO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBGb3J3YXJkLXNraXA6IHByZXZpb3VzbHkgcmVhY2hlZCBzdGFnZSB0aGF0IGlzIGFoZWFkIG9mIGN1cnJlbnQgcGhhc2UuXG4gIGlmIChlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2ZvcndhcmQtc2tpcCcpKSB7XG4gICAgY29uc3QgbGFiZWwgPSBfU1RFUF9ESVNQTEFZW3N0ZXBdIHx8IHN0ZXA7XG4gICAgaWYgKHR5cGVvZiBjb25maXJtRGlhbG9nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25maXJtRGlhbG9nKFxuICAgICAgICBgSnVtcCBhaGVhZCB0byAke2xhYmVsfT9cXG5cXG5JbnRlcm1lZGlhdGUgc3RhZ2VzIG1heSBuZWVkIHJlLXJ1bm5pbmcgaWYgeW91IG1ha2UgY2hhbmdlcyBoZXJlLmAsXG4gICAgICAgIHsgY29uZmlybUxhYmVsOiAnSnVtcCBhaGVhZCcsIGNhbmNlbExhYmVsOiAnU3RheSBoZXJlJyB9XG4gICAgICApLnRoZW4oY29uZmlybWVkID0+IHsgaWYgKGNvbmZpcm1lZCkgX2RvU3RlcE5hdmlnYXRlKHN0ZXApOyB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgX2RvU3RlcE5hdmlnYXRlKHN0ZXApO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBPbmx5IG5hdmlnYXRlIGlmIHRoZSBzdGVwIGlzIGNvbXBsZXRlZCAoYmFjay1uYXYpIG9yIGFjdGl2ZS5cbiAgaWYgKCFlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2NvbXBsZXRlZCcpICYmICFlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2FjdGl2ZScpKSByZXR1cm47XG5cbiAgY29uc3QgaGFzVW5hbnN3ZXJlZFBvc3RBbmFseXNpc1F1ZXN0aW9ucyA9ICgpID0+IHtcbiAgICBjb25zdCBxcyA9IEFycmF5LmlzQXJyYXkod2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucykgPyB3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zIDogW107XG4gICAgaWYgKHFzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGFuc3dlcnMgPSAod2luZG93LnF1ZXN0aW9uQW5zd2VycyAmJiB0eXBlb2Ygd2luZG93LnF1ZXN0aW9uQW5zd2VycyA9PT0gJ29iamVjdCcpXG4gICAgICA/IHdpbmRvdy5xdWVzdGlvbkFuc3dlcnNcbiAgICAgIDoge307XG4gICAgcmV0dXJuIHFzLnNvbWUocSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGFuc3dlcnNbcS50eXBlXTtcbiAgICAgIHJldHVybiAhdmFsdWUgfHwgIVN0cmluZyh2YWx1ZSkudHJpbSgpO1xuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IHN0ZXBUb1RhYiA9IHtcbiAgICBhbmFseXNpczogICAgICAgaGFzVW5hbnN3ZXJlZFBvc3RBbmFseXNpc1F1ZXN0aW9ucygpID8gJ3F1ZXN0aW9ucycgOiAnYW5hbHlzaXMnLFxuICAgIGN1c3RvbWl6YXRpb25zOiAnZ29hbHMnLFxuICAgIHJld3JpdGU6ICAgICAgICAncmV3cml0ZScsXG4gICAgc3BlbGw6ICAgICAgICAgICdzcGVsbCcsXG4gICAgbGF5b3V0OiAgICAgICAgICdsYXlvdXQnLFxuICAgIGRvd25sb2FkOiAgICAgICAnZmluYWxfZ2VuZXJhdGUnLFxuICAgIGNvdmVyX2xldHRlcjogICAnY292ZXItbGV0dGVyJyxcbiAgICBzY3JlZW5pbmc6ICAgICAgJ3NjcmVlbmluZycsXG4gICAgaW50ZXJ2aWV3X3ByZXA6ICdpbnRlcnZpZXctcHJlcCcsXG4gICAgdGhhbmtfeW91OiAgICAgICd0aGFuay15b3UnLFxuICAgIGhhcnZlc3Q6ICAgICAgICAnaGFydmVzdCcsXG4gIH07XG4gIGNvbnN0IHRhYk5hbWUgPSBzdGVwVG9UYWJbc3RlcF07XG4gIGlmICghdGFiTmFtZSkgcmV0dXJuO1xuXG4gIGNvbnN0IGRvTmF2aWdhdGUgPSAoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB1cGRhdGVUYWJCYXJGb3JTdGFnZSA9PT0gJ2Z1bmN0aW9uJykgdXBkYXRlVGFiQmFyRm9yU3RhZ2Uoc3RlcCk7XG4gICAgc3dpdGNoVGFiKHRhYk5hbWUpO1xuICB9O1xuXG4gIC8vIFNob3cgYSBkb3duc3RyZWFtLWF3YXJlbmVzcyBkaWFsb2cgd2hlbiBiYWNrLW5hdmlnYXRpbmcgdG8gYSBjb21wbGV0ZWQgc3RlcFxuICAvLyB0aGF0IGhhcyBkb3duc3RyZWFtIGNvbXBsZXRlZCBzdGVwcyAobm90IHdoZW4gdGhlIHN0ZXAgaXMgYWN0aXZlKS5cbiAgaWYgKGVsLmNsYXNzTGlzdC5jb250YWlucygnY29tcGxldGVkJykgJiYgIWVsLmNsYXNzTGlzdC5jb250YWlucygnYWN0aXZlJykpIHtcbiAgICBjb25zdCBzdGVwSWR4ID0gX1NURVBfT1JERVIuaW5kZXhPZihzdGVwKTtcbiAgICBjb25zdCBoYXNEb3duc3RyZWFtQ29tcGxldGVkID0gX1NURVBfT1JERVIuc2xpY2Uoc3RlcElkeCArIDEpLnNvbWUocyA9PiB7XG4gICAgICBjb25zdCBkb3duc3RyZWFtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHN0ZXAtJHtzfWApO1xuICAgICAgcmV0dXJuIGRvd25zdHJlYW0gJiYgZG93bnN0cmVhbS5jbGFzc0xpc3QuY29udGFpbnMoJ2NvbXBsZXRlZCcpO1xuICAgIH0pO1xuICAgIGlmIChoYXNEb3duc3RyZWFtQ29tcGxldGVkKSB7XG4gICAgICBfc2hvd1JlUnVuQ29uZmlybU1vZGFsKHN0ZXAsICdiYWNrLW5hdicsIGRvTmF2aWdhdGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGRvTmF2aWdhdGUoKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEV4cG9ydHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmV4cG9ydCB7XG4gIF9TVEVQX09SREVSLFxuICBfU1RFUF9ESVNQTEFZLFxuICBiYWNrVG9QaGFzZSxcbiAgX3Nob3dSZVJ1bkNvbmZpcm1Nb2RhbCxcbiAgX3Nob3dBbmFseXNpc0NsYXJpZmljYXRpb25BbWVuZE1vZGFsLFxuICBjb25maXJtUmVSdW5QaGFzZSxcbiAgcmVSdW5QaGFzZSxcbiAgX2V4ZWN1dGVSZVJ1blBoYXNlLFxuICBfZ2V0U3RlcFRvb2x0aXAsXG4gIF91cGRhdGVWaWV3aW5nSW5kaWNhdG9yLFxuICBfaGlnaGxpZ2h0Q2hhbmdlZEl0ZW1zLFxuICBfbWFya0NoYW5nZWQsXG4gIGFwcGx5TGF5b3V0RnJlc2huZXNzTmF2aWdhdGlvblN0YXRlLFxuICBhcHBseURpcnR5UGhhc2VOYXZpZ2F0aW9uU3RhdGUsXG4gIHNob3dCdWxsZXRSZW9yZGVyLFxuICBfYXBwbHlCdWxsZXRPcmRlcixcbiAgbW92ZUJ1bGxldCxcbiAgX3VwZGF0ZUJ1bGxldEFycm93cyxcbiAgc2F2ZUJ1bGxldE9yZGVyLFxuICByZXNldEJ1bGxldE9yZGVyLFxuICB1cGRhdGVXb3JrZmxvd1N0ZXBzLFxuICBoYW5kbGVTdGVwQ2xpY2ssXG4gIF9BQ1RJT05fTEFCRUxTLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogbGF5b3V0LWluc3RydWN0aW9uLmpzXG4gKiBGcm9udGVuZCBVSSBmb3IgbmF0dXJhbC1sYW5ndWFnZSBsYXlvdXQgaW5zdHJ1Y3Rpb24gd29ya2Zsb3cuXG4gKiBIYW5kbGVzIGluc3RydWN0aW9uIHN1Ym1pc3Npb24sIHByZXZpZXcgdXBkYXRlcywgYW5kIGluc3RydWN0aW9uIGhpc3RvcnkuXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdsYXlvdXQtaW5zdHJ1Y3Rpb24nKTtcblxuaW1wb3J0IHsgYXBpQ2FsbCB9IGZyb20gJy4vYXBpLWNsaWVudC5qcyc7XG5pbXBvcnQgeyBzY2hlZHVsZUF0c1JlZnJlc2ggfSBmcm9tICcuL2F0cy1yZWZpbmVtZW50LmpzJztcbmltcG9ydCB7IGFwcGVuZE1lc3NhZ2UsIGFwcGVuZE1lc3NhZ2VIdG1sIH0gZnJvbSAnLi9tZXNzYWdlLXF1ZXVlLmpzJztcbmltcG9ydCB7IHN3aXRjaFRhYiB9IGZyb20gJy4vcmV2aWV3LXRhYmxlLWJhc2UuanMnO1xuaW1wb3J0IHsgc3RhdGVNYW5hZ2VyLCBHRU5FUkFUSU9OX1NUQVRFX0VWRU5ULCBHRU5FUkFUSU9OX1BIQVNFUyB9IGZyb20gJy4vc3RhdGUtbWFuYWdlci5qcyc7XG5pbXBvcnQgeyBlc2NhcGVIdG1sIH0gZnJvbSAnLi91dGlscy5qcyc7XG5pbXBvcnQgeyBjb25maXJtUmVSdW5QaGFzZSB9IGZyb20gJy4vd29ya2Zsb3ctc3RlcHMuanMnO1xuaW1wb3J0IHsgcmVuZGVySHRtbEludG9JZnJhbWUgfSBmcm9tICcuL3ByZXZpZXctcmVuZGVyLmpzJztcblxubGV0IGRpc21pc3NlZFN0YWxlQ2FsbG91dFJldmlzaW9uID0gbnVsbDtcblxuLyoqXG4gKiBDb252ZXJ0IGEgQ1NTIHBpeGVsIHZhbHVlIHRvIGl0cyB0eXBvZ3JhcGhpYyBwb2ludCBlcXVpdmFsZW50LlxuICogQXNzdW1lcyB0aGUgc3RhbmRhcmQgc2NyZWVuIHJlc29sdXRpb24gY29udmVudGlvbjogOTYgcHgvaW4sIDcyIHB0L2luLFxuICogc28gMXB4ID0gMC43NSBwdC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBweFxuICogQHJldHVybnMge251bWJlcn0gcHQgdmFsdWUgcm91bmRlZCB0byBvbmUgZGVjaW1hbCBwbGFjZVxuICovXG5leHBvcnQgZnVuY3Rpb24gcHhUb1B0KHB4KSB7XG4gIHJldHVybiBNYXRoLnJvdW5kKHB4ICogMC43NSAqIDEwKSAvIDEwO1xufVxuXG5mdW5jdGlvbiBjb2VyY2VCb29sZWFuKHZhbHVlLCBkZWZhdWx0VmFsdWUgPSBmYWxzZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHJldHVybiB2YWx1ZTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCBub3JtYWxpemVkID0gdmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKFsnMScsICd0cnVlJywgJ3llcycsICdvbiddLmluY2x1ZGVzKG5vcm1hbGl6ZWQpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoWycwJywgJ2ZhbHNlJywgJ25vJywgJ29mZiddLmluY2x1ZGVzKG5vcm1hbGl6ZWQpKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gIHJldHVybiBCb29sZWFuKHZhbHVlKTtcbn1cblxuLy8gVW5kbyBzdGFjayBcdTIwMTQgZWFjaCBlbnRyeSBpcyB7IGh0bWwsIGluc3RydWN0aW9ucyB9IHNuYXBzaG90dGVkIGJlZm9yZSBhXG4vLyBsYXlvdXQgaW5zdHJ1Y3Rpb24gaXMgYXBwbGllZC4gIENhcCBhdCAyMCBlbnRyaWVzIHRvIGJvdW5kIG1lbW9yeS5cbmNvbnN0IF9sYXlvdXRVbmRvU3RhY2sgPSBbXTtcbmNvbnN0IF9VTkRPX1NUQUNLX01BWCA9IDIwO1xuXG5mdW5jdGlvbiBnZXRDdkFydGlmYWN0cygpIHtcbiAgcmV0dXJuIHN0YXRlTWFuYWdlci5nZXRUYWJEYXRhKCdjdicpIHx8IHt9O1xufVxuXG5mdW5jdGlvbiB1cGRhdGVDdkFydGlmYWN0cyhuZXh0Q3ZBcnRpZmFjdHMpIHtcbiAgc3RhdGVNYW5hZ2VyLnNldFRhYkRhdGEoJ2N2JywgbmV4dEN2QXJ0aWZhY3RzKTtcbn1cblxuZnVuY3Rpb24gc2V0UHJldmlld0h0bWwoaHRtbCkge1xuICB1cGRhdGVDdkFydGlmYWN0cyh7IC4uLmdldEN2QXJ0aWZhY3RzKCksICcqLmh0bWwnOiBodG1sIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRQcmV2aWV3T3V0cHV0cygpIHtcbiAgcmV0dXJuIHN0YXRlTWFuYWdlcj8uZ2V0R2VuZXJhdGlvblN0YXRlPy4oKT8ucHJldmlld091dHB1dHMgfHwgbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0UHJldmlld091dHB1dFVybChyZW5kZXJlcikge1xuICBjb25zdCBzZXNzaW9uSWQgPSBzdGF0ZU1hbmFnZXI/LmdldFNlc3Npb25JZD8uKCk7XG4gIGNvbnN0IHN1ZmZpeCA9IHNlc3Npb25JZFxuICAgID8gYD9zZXNzaW9uX2lkPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHNlc3Npb25JZCl9YFxuICAgIDogJyc7XG4gIHJldHVybiBgL2FwaS9jdi9wcmV2aWV3LW91dHB1dC8ke2VuY29kZVVSSUNvbXBvbmVudChyZW5kZXJlcil9JHtzdWZmaXh9YDtcbn1cblxuZnVuY3Rpb24gcmVuZGVyUHJldmlld091dHB1dFN0YXR1cyhwcmV2aWV3T3V0cHV0cyA9IG51bGwpIHtcbiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ByZXZpZXctb3V0cHV0LXN0YXR1cycpO1xuICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuO1xuXG4gIGNvbnN0IHBkZnMgPSBwcmV2aWV3T3V0cHV0cz8ucGRmcyB8fCB7fTtcbiAgY29uc3QgcmVuZGVyZXJPcmRlciA9IFsnY2hyb21lJywgJ3dlYXN5cHJpbnQnXTtcbiAgY29uc3QgYXZhaWxhYmxlUmVuZGVyZXJzID0gcmVuZGVyZXJPcmRlci5maWx0ZXIoKHJlbmRlcmVyS2V5KSA9PiByZW5kZXJlcktleSBpbiBwZGZzKTtcblxuICBpZiAoYXZhaWxhYmxlUmVuZGVyZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBgXG4gICAgICA8ZGl2IGNsYXNzPVwicHJldmlldy1vdXRwdXQtZW1wdHlcIj5cbiAgICAgICAgUHJldmlldyBQREZzIHdpbGwgYXBwZWFyIGhlcmUgYWZ0ZXIgdGhlIGN1cnJlbnQgbGF5b3V0IGlzIHJlbmRlcmVkLlxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCByZW5kZXJlckxhYmVscyA9IHtcbiAgICBjaHJvbWU6ICdDaHJvbWUnLFxuICAgIHdlYXN5cHJpbnQ6ICdXZWFzeVByaW50JyxcbiAgfTtcblxuICBjb250YWluZXIuaW5uZXJIVE1MID0gYXZhaWxhYmxlUmVuZGVyZXJzLm1hcCgocmVuZGVyZXJLZXkpID0+IHtcbiAgICBjb25zdCByZW5kZXJlciA9IHBkZnNbcmVuZGVyZXJLZXldIHx8IHt9O1xuICAgIGNvbnN0IG9rID0gQm9vbGVhbihyZW5kZXJlci5vayk7XG4gICAgY29uc3QgZGV0YWlsID0gcmVuZGVyZXIucmVuZGVyZXJfZGV0YWlsIHx8IHJlbmRlcmVyLmVycm9yIHx8ICdObyBkZXRhaWwgYXZhaWxhYmxlJztcbiAgICBjb25zdCByZW5kZXJlckxhYmVsID0gcmVuZGVyZXJMYWJlbHNbcmVuZGVyZXJLZXldIHx8IHJlbmRlcmVyS2V5O1xuICAgIGNvbnN0IGJhZGdlTWFya3VwID0gb2tcbiAgICAgID8gYDxhIGNsYXNzPVwicHJldmlldy1vdXRwdXQtYmFkZ2UgcHJldmlldy1vdXRwdXQtYmFkZ2UtbGluayBpcy1yZWFkeVwiIGhyZWY9XCIke2dldFByZXZpZXdPdXRwdXRVcmwocmVuZGVyZXJLZXkpfVwiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyXCI+JHtyZW5kZXJlckxhYmVsfSBSZWFkeTwvYT5gXG4gICAgICA6IGA8c3BhbiBjbGFzcz1cInByZXZpZXctb3V0cHV0LWJhZGdlIGlzLWZhaWxlZFwiPiR7cmVuZGVyZXJMYWJlbH0gRmFpbGVkPC9zcGFuPmA7XG5cbiAgICByZXR1cm4gYFxuICAgICAgPGRpdiBjbGFzcz1cInByZXZpZXctb3V0cHV0LXJvdyAke29rID8gJ2lzLXJlYWR5JyA6ICdpcy1mYWlsZWQnfVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHJldmlldy1vdXRwdXQtY29weVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcmV2aWV3LW91dHB1dC10aXRsZS1yb3dcIj5cbiAgICAgICAgICAgICR7YmFkZ2VNYXJrdXB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInByZXZpZXctb3V0cHV0LWRldGFpbFwiPiR7ZXNjYXBlSHRtbChkZXRhaWwpfTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIGA7XG4gIH0pLmpvaW4oJycpO1xufVxuXG5mdW5jdGlvbiBhcHBlbmRMYXlvdXRTYWZldHlBbGVydChzYWZldHlBbGVydCkge1xuICBpZiAoIXNhZmV0eUFsZXJ0Py5mbGFnZ2VkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgaXNzdWVzID0gKHNhZmV0eUFsZXJ0Lmlzc3VlcyB8fCBbXSlcbiAgICAubWFwKGlzc3VlID0+IHtcbiAgICAgIGNvbnN0IHRleHQgPSB0eXBlb2YgaXNzdWUgPT09ICdzdHJpbmcnXG4gICAgICAgID8gaXNzdWVcbiAgICAgICAgOiAoaXNzdWU/LmRldGFpbCB8fCBpc3N1ZT8uaXNzdWUgfHwgSlNPTi5zdHJpbmdpZnkoaXNzdWUpKTtcbiAgICAgIHJldHVybiBgPGxpPiR7ZXNjYXBlSHRtbCh0ZXh0KX08L2xpPmA7XG4gICAgfSlcbiAgICAuam9pbignJyk7XG5cbiAgYXBwZW5kTWVzc2FnZUh0bWwoXG4gICAgJ3N5c3RlbScsXG4gICAgYDxzdHJvbmc+XHUyNkEwXHVGRTBGIExheW91dCBzYWZldHkgc2FuaXRpemF0aW9uIGFwcGxpZWQuPC9zdHJvbmc+PGJyPiR7ZXNjYXBlSHRtbChzYWZldHlBbGVydC5tZXNzYWdlIHx8ICdQb3RlbnRpYWwgcHJvbXB0IHBheWxvYWRzIG9yIHVuc2FmZSBIVE1MIHdlcmUgcmVtb3ZlZCBiZWZvcmUgYXBwbHlpbmcgdGhlIGNoYW5nZS4nKX08YnI+PHVsIHN0eWxlPVwibWFyZ2luOjZweCAwIDAgMThweFwiPiR7aXNzdWVzfTwvdWw+YCxcbiAgKTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTGF5b3V0SW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb24gPSB7fSkge1xuICByZXR1cm4ge1xuICAgIHRpbWVzdGFtcDogaW5zdHJ1Y3Rpb24udGltZXN0YW1wIHx8ICcnLFxuICAgIGluc3RydWN0aW9uX3RleHQ6IGluc3RydWN0aW9uLmluc3RydWN0aW9uX3RleHQgfHwgaW5zdHJ1Y3Rpb24uaW5zdHJ1Y3Rpb24gfHwgJycsXG4gICAgY2hhbmdlX3N1bW1hcnk6IGluc3RydWN0aW9uLmNoYW5nZV9zdW1tYXJ5IHx8IGluc3RydWN0aW9uLnN1bW1hcnkgfHwgJycsXG4gICAgY29uZmlybWF0aW9uOiBpbnN0cnVjdGlvbi5jb25maXJtYXRpb24gIT09IGZhbHNlLFxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRDdXJyZW50Q29udGVudFJldmlzaW9uKCkge1xuICByZXR1cm4gc3RhdGVNYW5hZ2VyLmdldEdlbmVyYXRpb25TdGF0ZSgpLmNvbnRlbnRSZXZpc2lvbiA/PyAwO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRHZW5lcmF0aW9uVGltZXN0YW1wKHRpbWVzdGFtcCkge1xuICBpZiAoIXRpbWVzdGFtcCkgcmV0dXJuICcnO1xuICBjb25zdCBwYXJzZWQgPSBuZXcgRGF0ZSh0aW1lc3RhbXApO1xuICBpZiAoTnVtYmVyLmlzTmFOKHBhcnNlZC5nZXRUaW1lKCkpKSByZXR1cm4gJyc7XG4gIHJldHVybiBwYXJzZWQudG9Mb2NhbGVTdHJpbmcoW10sIHsgbW9udGg6ICdzaG9ydCcsIGRheTogJ251bWVyaWMnLCBob3VyOiAnbnVtZXJpYycsIG1pbnV0ZTogJzItZGlnaXQnIH0pO1xufVxuXG5mdW5jdGlvbiBidWlsZExheW91dEZyZXNobmVzc0NoaXBNYXJrdXAoZnJlc2huZXNzKSB7XG4gIGlmICghZnJlc2huZXNzPy5zaG93Q2hpcCkgcmV0dXJuICcnO1xuICBjb25zdCBpY29uID0gZnJlc2huZXNzLmlzQ3JpdGljYWwgPyAnXHUyMUJCJyA6IChmcmVzaG5lc3MuaXNTdGFsZSA/ICchJyA6ICdcdTI3MTMnKTtcbiAgcmV0dXJuIGA8c3BhbiBjbGFzcz1cImxheW91dC1mcmVzaG5lc3MtY2hpcCAke2ZyZXNobmVzcy50b25lfSBsYXlvdXQtcGFuZS1mcmVzaG5lc3MtY2hpcFwiXG4gICAgYXJpYS1sYWJlbD1cIiR7ZXNjYXBlSHRtbChmcmVzaG5lc3MuYXJpYUxhYmVsIHx8ICcnKX1cIj5cbiAgICA8c3BhbiBjbGFzcz1cImxheW91dC1mcmVzaG5lc3MtaWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiR7aWNvbn08L3NwYW4+XG4gICAgPHNwYW4gY2xhc3M9XCJsYXlvdXQtZnJlc2huZXNzLWxhYmVsXCI+JHtlc2NhcGVIdG1sKGZyZXNobmVzcy5sYWJlbCB8fCAnJyl9PC9zcGFuPlxuICA8L3NwYW4+YDtcbn1cblxuZnVuY3Rpb24gcmVuZGVyTGF5b3V0UHJldmlld1N0YXR1cygpIHtcbiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xheW91dC1wcmV2aWV3LXN0YXR1cycpO1xuICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuO1xuICBjb25zdCBmcmVzaG5lc3MgPSBzdGF0ZU1hbmFnZXIuZ2V0TGF5b3V0RnJlc2huZXNzKCk7XG4gIGNvbnN0IGdlbmVyYXRpb25TdGF0ZSA9IHN0YXRlTWFuYWdlci5nZXRHZW5lcmF0aW9uU3RhdGUoKTtcbiAgaWYgKCFnZW5lcmF0aW9uU3RhdGUucHJldmlld0F2YWlsYWJsZSkge1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcbiAgICBjb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgbGFzdFByZXZpZXdSZXZpc2lvbiA9IE51bWJlci5pc0Zpbml0ZShnZW5lcmF0aW9uU3RhdGUubGFzdFByZXZpZXdDb250ZW50UmV2aXNpb24pXG4gICAgPyBnZW5lcmF0aW9uU3RhdGUubGFzdFByZXZpZXdDb250ZW50UmV2aXNpb24gOiBudWxsO1xuICBjb25zdCBjdXJyZW50UmV2aXNpb24gPSBOdW1iZXIuaXNGaW5pdGUoZ2VuZXJhdGlvblN0YXRlLmNvbnRlbnRSZXZpc2lvbilcbiAgICA/IGdlbmVyYXRpb25TdGF0ZS5jb250ZW50UmV2aXNpb24gOiBudWxsO1xuICBjb25zdCBwZW5kaW5nUmV2aXNpb25Db3VudCA9IGxhc3RQcmV2aWV3UmV2aXNpb24gIT09IG51bGwgJiYgY3VycmVudFJldmlzaW9uICE9PSBudWxsXG4gICAgPyBNYXRoLm1heCgwLCBjdXJyZW50UmV2aXNpb24gLSBsYXN0UHJldmlld1JldmlzaW9uKSA6IDA7XG4gIGNvbnN0IHRpbWVzdGFtcExhYmVsID0gZm9ybWF0R2VuZXJhdGlvblRpbWVzdGFtcChnZW5lcmF0aW9uU3RhdGUucHJldmlld0dlbmVyYXRlZEF0KTtcbiAgY29uc3QgZGV0YWlsTGluZXMgPSBbXTtcbiAgaWYgKHRpbWVzdGFtcExhYmVsKSBkZXRhaWxMaW5lcy5wdXNoKGBQcmV2aWV3IGdlbmVyYXRlZCAke3RpbWVzdGFtcExhYmVsfWApO1xuICBpZiAoZ2VuZXJhdGlvblN0YXRlLmxheW91dENvbmZpcm1lZCAmJiBnZW5lcmF0aW9uU3RhdGUuY29uZmlybWVkQXQpIHtcbiAgICBjb25zdCBjb25maXJtZWRMYWJlbCA9IGZvcm1hdEdlbmVyYXRpb25UaW1lc3RhbXAoZ2VuZXJhdGlvblN0YXRlLmNvbmZpcm1lZEF0KTtcbiAgICBpZiAoY29uZmlybWVkTGFiZWwpIGRldGFpbExpbmVzLnB1c2goYExheW91dCBjb25maXJtZWQgJHtjb25maXJtZWRMYWJlbH1gKTtcbiAgfVxuICBpZiAoZnJlc2huZXNzLmlzU3RhbGUpIHtcbiAgICBpZiAocGVuZGluZ1JldmlzaW9uQ291bnQgPiAwKSB7XG4gICAgICBkZXRhaWxMaW5lcy5wdXNoKGAke3BlbmRpbmdSZXZpc2lvbkNvdW50fSBjb250ZW50IGNoYW5nZSR7cGVuZGluZ1JldmlzaW9uQ291bnQgPT09IDEgPyAnJyA6ICdzJ30gc2luY2UgdGhpcyBwcmV2aWV3YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRldGFpbExpbmVzLnB1c2goJ0NvbnRlbnQgY2hhbmdlZCBhZnRlciB0aGlzIHByZXZpZXcgd2FzIGdlbmVyYXRlZCcpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChnZW5lcmF0aW9uU3RhdGUubGF5b3V0Q29uZmlybWVkIHx8IGdlbmVyYXRpb25TdGF0ZS5waGFzZSA9PT0gJ2NvbmZpcm1lZCcpIHtcbiAgICBkZXRhaWxMaW5lcy5wdXNoKCdDb25maXJtZWQgcHJldmlldyBtYXRjaGVzIHRoZSBsYXRlc3QgYXBwcm92ZWQgY29udGVudCcpO1xuICB9IGVsc2Uge1xuICAgIGRldGFpbExpbmVzLnB1c2goJ1ByZXZpZXcgbWF0Y2hlcyB0aGUgbGF0ZXN0IGFwcHJvdmVkIGNvbnRlbnQnKTtcbiAgfVxuICBjb25zdCBzdGFnZUxhYmVsID0gZ2VuZXJhdGlvblN0YXRlLmxheW91dENvbmZpcm1lZCB8fCBnZW5lcmF0aW9uU3RhdGUucGhhc2UgPT09ICdjb25maXJtZWQnXG4gICAgPyAnUmVhZHkgZm9yIGZpbmFsIGZpbGVzJyA6ICdSZWFkeSBmb3IgbGF5b3V0IHJldmlldyc7XG4gIC8vIFBhZ2UgY291bnQgYmFkZ2U6IHNob3duIHdoZW4gYSBwYWdlIGNvdW50IGlzIGF2YWlsYWJsZSBmcm9tIHRoZSBwcmV2aWV3XG4gIGNvbnN0IHBjID0gZ2VuZXJhdGlvblN0YXRlLnBhZ2VDb3VudEV4YWN0ID8/IGdlbmVyYXRpb25TdGF0ZS5wYWdlQ291bnRFc3RpbWF0ZTtcbiAgbGV0IHBhZ2VDb3VudEJhZGdlID0gJyc7XG4gIGlmIChwYyAhPT0gbnVsbCAmJiBwYyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgcGNMYWJlbCAgPSBnZW5lcmF0aW9uU3RhdGUucGFnZUNvdW50RXhhY3QgIT09IG51bGwgPyBgJHtwY30gcGFnZSR7cGMgIT09IDEgPyAncycgOiAnJ31gIDogYH4ke3BjfSBwYWdlJHtwYyAhPT0gMSA/ICdzJyA6ICcnfWA7XG4gICAgY29uc3QgcGNXYXJuICAgPSBnZW5lcmF0aW9uU3RhdGUucGFnZVdhcm5pbmc7XG4gICAgcGFnZUNvdW50QmFkZ2UgPSBgPHNwYW4gY2xhc3M9XCJsYXlvdXQtcGFnZS1jb3VudC1iYWRnZSR7cGNXYXJuID8gJyB3YXJuJyA6ICcnfVwiIHRpdGxlPVwiJHtwY1dhcm4gPyAnUGFnZSBjb3VudCBvdXRzaWRlIHJlY29tbWVuZGVkIHJhbmdlJyA6ICdQYWdlIGNvdW50IHdpdGhpbiByYW5nZSd9XCI+JHtwY1dhcm4gPyAnXHUyNkEwICcgOiAnXHVEODNEXHVEQ0M0ICd9JHtlc2NhcGVIdG1sKHBjTGFiZWwpfTwvc3Bhbj5gO1xuICB9XG4gIGNvbnRhaW5lci5pbm5lckhUTUwgPSBgXG4gICAgPGRpdiBjbGFzcz1cImxheW91dC1wcmV2aWV3LXN0YXR1cy1jYXJkICR7ZnJlc2huZXNzLnRvbmV9XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibGF5b3V0LXByZXZpZXctc3RhdHVzLWhlYWRlclwiPlxuICAgICAgICAke2J1aWxkTGF5b3V0RnJlc2huZXNzQ2hpcE1hcmt1cChmcmVzaG5lc3MpfVxuICAgICAgICA8c3BhbiBjbGFzcz1cImxheW91dC1wcmV2aWV3LXN0YXR1cy1zdGFnZVwiPiR7ZXNjYXBlSHRtbChzdGFnZUxhYmVsKX08L3NwYW4+XG4gICAgICAgICR7cGFnZUNvdW50QmFkZ2V9XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJsYXlvdXQtcHJldmlldy1zdGF0dXMtZGV0YWlsc1wiPlxuICAgICAgICAke2RldGFpbExpbmVzLm1hcCgobGluZSkgPT4gYDxkaXY+JHtlc2NhcGVIdG1sKGxpbmUpfTwvZGl2PmApLmpvaW4oJycpfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+YDtcbiAgY29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xufVxuXG5mdW5jdGlvbiByZW5kZXJMYXlvdXRTdGFsZUNhbGxvdXQoKSB7XG4gIGNvbnN0IGNhbGxvdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGF5b3V0LXN0YWxlLWNhbGxvdXQnKTtcbiAgaWYgKCFjYWxsb3V0KSByZXR1cm47XG5cbiAgY29uc3QgZnJlc2huZXNzID0gc3RhdGVNYW5hZ2VyLmdldExheW91dEZyZXNobmVzcygpO1xuICBjb25zdCBjb250ZW50UmV2aXNpb24gPSBnZXRDdXJyZW50Q29udGVudFJldmlzaW9uKCk7XG4gIGNvbnN0IGlzRGlzbWlzc2VkID0gZGlzbWlzc2VkU3RhbGVDYWxsb3V0UmV2aXNpb24gPT09IGNvbnRlbnRSZXZpc2lvbjtcblxuICBpZiAoIWZyZXNobmVzcy5pc1N0YWxlIHx8IGlzRGlzbWlzc2VkKSB7XG4gICAgaWYgKCFmcmVzaG5lc3MuaXNTdGFsZSkgZGlzbWlzc2VkU3RhbGVDYWxsb3V0UmV2aXNpb24gPSBudWxsO1xuICAgIGNhbGxvdXQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICByZXR1cm47XG4gIH1cblxuICBjYWxsb3V0LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xufVxuXG5mdW5jdGlvbiByZWZyZXNoTGF5b3V0UmV2aWV3U3RhdGUoKSB7XG4gIGNvbnN0IGZyZXNobmVzcyA9IHN0YXRlTWFuYWdlci5nZXRMYXlvdXRGcmVzaG5lc3MoKTtcbiAgY29uc3QgZ2VuZXJhdGlvblN0YXRlID0gc3RhdGVNYW5hZ2VyLmdldEdlbmVyYXRpb25TdGF0ZSgpO1xuICBjb25zdCBjb25maXJtQnRuICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb25maXJtLWxheW91dC1idG4nKTtcbiAgY29uc3QgZmluYWxCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJvY2VlZC10by1maW5hbGlzZS1idG4nKTtcblxuICByZW5kZXJMYXlvdXRQcmV2aWV3U3RhdHVzKCk7XG4gIHJlbmRlckxheW91dFN0YWxlQ2FsbG91dCgpO1xuICByZW5kZXJEaXJ0eVBoYXNlc0NhbGxvdXQoKTtcblxuICBjb25zdCBkaXJ0eVBoYXNlcyA9IHN0YXRlTWFuYWdlci5nZXREaXJ0eVBoYXNlcygpO1xuICBjb25zdCBoYXNEaXJ0eSA9IGRpcnR5UGhhc2VzLmxlbmd0aCA+IDA7XG5cbiAgY29uc3Qgc2hvd0NvbmZpcm0gPSBnZW5lcmF0aW9uU3RhdGUucHJldmlld0F2YWlsYWJsZSAmJiAhZnJlc2huZXNzLmlzU3RhbGUgJiYgIWdlbmVyYXRpb25TdGF0ZS5sYXlvdXRDb25maXJtZWQgJiYgIWhhc0RpcnR5XG4gICAgPyAnYmxvY2snXG4gICAgOiAnbm9uZSc7XG5cbiAgaWYgKGNvbmZpcm1CdG4pICBjb25maXJtQnRuLnN0eWxlLmRpc3BsYXkgID0gc2hvd0NvbmZpcm07XG4gIGNvbnN0IGhpbnRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYXlvdXQtdHdvLXN0ZXAtaGludCcpO1xuICBpZiAoaGludEVsKSBoaW50RWwuc3R5bGUuZGlzcGxheSA9IHNob3dDb25maXJtO1xuXG4gIGlmIChmaW5hbEJ0bikge1xuICAgIGZpbmFsQnRuLnN0eWxlLmRpc3BsYXkgPSBnZW5lcmF0aW9uU3RhdGUucHJldmlld0F2YWlsYWJsZVxuICAgICAgJiYgIWZyZXNobmVzcy5pc1N0YWxlXG4gICAgICAmJiAhaGFzRGlydHlcbiAgICAgICYmIChnZW5lcmF0aW9uU3RhdGUubGF5b3V0Q29uZmlybWVkIHx8IGdlbmVyYXRpb25TdGF0ZS5waGFzZSA9PT0gJ2NvbmZpcm1lZCcpXG4gICAgICA/ICdibG9jaydcbiAgICAgIDogJ25vbmUnO1xuICB9XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBsYXlvdXQgaW5zdHJ1Y3Rpb24gVUkgYW5kIGV2ZW50IGhhbmRsZXJzLlxuICogQ2FsbGVkIHdoZW4gbGF5b3V0IHRhYiBpcyBhY3RpdmF0ZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGluaXRpYXRlTGF5b3V0SW5zdHJ1Y3Rpb25zKCkge1xuICBjb25zdCBpbnN0cnVjdGlvblRhYiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIGlmICghaW5zdHJ1Y3Rpb25UYWIpIHJldHVybjtcblxuICAvLyBDcmVhdGUgdHdvLWNvbHVtbiBsYXlvdXQgaWYgaXQgZG9lc24ndCBleGlzdFxuICBpZiAoIWluc3RydWN0aW9uVGFiLnF1ZXJ5U2VsZWN0b3IoJy5sYXlvdXQtaW5zdHJ1Y3Rpb24tcGFuZWwnKSkge1xuICAgIGluc3RydWN0aW9uVGFiLmlubmVySFRNTCA9IGBcbiAgICAgIDxkaXYgY2xhc3M9XCJsYXlvdXQtaW5zdHJ1Y3Rpb24tcGFuZWxcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxheW91dC1wcmV2aWV3LXBhbmVcIj5cbiAgICAgICAgICA8aDM+Q3VycmVudCBMYXlvdXQgUHJldmlldzwvaDM+XG4gICAgICAgICAgPGRpdiBpZD1cImxheW91dC1wcmV2aWV3LXN0YXR1c1wiIGNsYXNzPVwibGF5b3V0LXByZXZpZXctc3RhdHVzXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInByZXZpZXctaWZyYW1lLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGRpdiBpZD1cInByZXZpZXctbG9hZGluZy1vdmVybGF5XCIgY2xhc3M9XCJwcmV2aWV3LWxvYWRpbmctb3ZlcmxheVwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Bpbm5lclwiPjwvZGl2PlxuICAgICAgICAgICAgICA8cCBjbGFzcz1cInByZXZpZXctbG9hZGluZy1sYWJlbFwiPlJlbmRlcmluZyBwcmV2aWV3XHUyMDI2PC9wPlxuICAgICAgICAgICAgICA8cCBpZD1cInByZXZpZXctbG9hZGluZy1sb2dcIiBjbGFzcz1cInByZXZpZXctbG9hZGluZy1sb2dcIj48L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxpZnJhbWUgaWQ9XCJsYXlvdXQtcHJldmlld1wiIGNsYXNzPVwibGF5b3V0LXByZXZpZXctaWZyYW1lXCIgdGl0bGU9XCJDViBMYXlvdXQgUHJldmlld1wiIHNhbmRib3g9XCJhbGxvdy1zYW1lLW9yaWdpblwiIHJlZmVycmVycG9saWN5PVwibm8tcmVmZXJyZXJcIj48L2lmcmFtZT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxheW91dC1pbnB1dC1wYW5lXCI+XG4gICAgICAgICAgPGgzPkxheW91dCBSZXZpZXc8L2gzPlxuICAgICAgICAgIDxwIGNsYXNzPVwibGF5b3V0LXNjb3BlLWxhYmVsXCI+XHVEODNEXHVEQ0ExIERlc2NyaWJlIGEgbGF5b3V0IGNoYW5nZSAoc3BhY2luZywgbWFyZ2lucywgY29sdW1uIHdpZHRocywgc2VjdGlvbiBvcmRlcikuIFRleHQgY29udGVudCBpcyBmaW5hbGlzZWQgXHUyMDE0IGNvbnRlbnQgZWRpdHMgYXJlIG5vdCBhcHBsaWVkIGhlcmUuPC9wPlxuICAgICAgICAgIDxkaXYgaWQ9XCJsYXlvdXQtcGFnZS1lc3RpbWF0ZVwiIHN0eWxlPVwiZGlzcGxheTpub25lO21hcmdpbi1ib3R0b206MTBweDtcIj48L2Rpdj5cblxuICAgICAgICAgIDxkaXYgaWQ9XCJsYXlvdXQtc3RhbGUtY2FsbG91dFwiIGNsYXNzPVwibGF5b3V0LXN0YWxlLWNhbGxvdXRcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj5cbiAgICAgICAgICAgIDxoND5MYXlvdXQgcHJldmlldyBpcyBvdXQgb2YgZGF0ZTwvaDQ+XG4gICAgICAgICAgICA8cD5Zb3UgY2hhbmdlZCBDViBjb250ZW50IGFmdGVyIHRoZSBjdXJyZW50IHByZXZpZXcgd2FzIGdlbmVyYXRlZC4gUmVnZW5lcmF0ZSB0aGUgcHJldmlldyBiZWZvcmUgdHJ1c3RpbmcgcGFnZSBjb3VudCwgbGF5b3V0IGZlZWRiYWNrLCBvciBmaW5hbCBmaWxlcy48L3A+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGF5b3V0LXN0YWxlLWNhbGxvdXQtYWN0aW9uc1wiPlxuICAgICAgICAgICAgICA8YnV0dG9uIGlkPVwicmVnZW5lcmF0ZS1sYXlvdXQtcHJldmlldy1idG5cIiBjbGFzcz1cImJ0bi13YXJuaW5nIGxheW91dC1hY3Rpb24tYnRuXCI+UmVnZW5lcmF0ZSBwcmV2aWV3PC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b24gaWQ9XCJkaXNtaXNzLWxheW91dC1zdGFsZS1idG5cIiBjbGFzcz1cImJ0bi1zZWNvbmRhcnkgbGF5b3V0LWFjdGlvbi1idG5cIj5LZWVwIHJldmlld2luZyBjdXJyZW50IHByZXZpZXc8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInByZXZpZXctb3V0cHV0LWNhcmRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcmV2aWV3LW91dHB1dC1jYXJkLWhlYWRlclwiPlxuICAgICAgICAgICAgICA8aDQ+UHJldmlldyBQREZzPC9oND5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwcmV2aWV3LW91dHB1dC1jYXJkLW5vdGVcIj5DaHJvbWUgYW5kIFdlYXN5UHJpbnQgcmVuZGVyIGluIHBhcmFsbGVsPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGlkPVwicHJldmlldy1vdXRwdXQtc3RhdHVzXCIgY2xhc3M9XCJwcmV2aWV3LW91dHB1dC1zdGF0dXNcIj48L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYXlvdXQtc2V0dGluZ3Mtcm93XCIgc3R5bGU9XCJkaXNwbGF5OmZsZXg7IGZsZXgtd3JhcDp3cmFwOyBhbGlnbi1pdGVtczpjZW50ZXI7IGdhcDoxMHB4OyBtYXJnaW4tYm90dG9tOjE0cHg7IHBhZGRpbmc6OHB4IDEwcHg7IGJhY2tncm91bmQ6I2Y4ZmFmYzsgYm9yZGVyOjFweCBzb2xpZCAjZTJlOGYwOyBib3JkZXItcmFkaXVzOjZweDtcIj5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJiYXNlLWZvbnQtc2l6ZS1pbnB1dFwiIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTsgZm9udC13ZWlnaHQ6NjAwOyBjb2xvcjojNDc1NTY5OyB3aGl0ZS1zcGFjZTpub3dyYXA7XCI+QmFzZSBmb250IHNpemU6PC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBpZD1cImJhc2UtZm9udC1zaXplLWlucHV0XCJcbiAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgIG1pbj1cIjZcIiBtYXg9XCIxNlwiIHN0ZXA9XCIwLjVcIlxuICAgICAgICAgICAgICB2YWx1ZT1cIjEzXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDo2MHB4OyBwYWRkaW5nOjNweCA2cHg7IGJvcmRlcjoxcHggc29saWQgI2NiZDVlMTsgYm9yZGVyLXJhZGl1czo0cHg7IGZvbnQtc2l6ZTowLjllbTtcIlxuICAgICAgICAgICAgICB0aXRsZT1cIkNvbnRyb2xzIHRoZSByb290IGZvbnQgc2l6ZSBmb3IgdGhlIENWLiBBbGwgcmVtLWJhc2VkIHNpemVzIHNjYWxlIHdpdGggdGhpcyB2YWx1ZS5cIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxzcGFuIGlkPVwiZm9udC1zaXplLXB0LWRpc3BsYXlcIiBzdHlsZT1cImZvbnQtc2l6ZTowLjgyZW07IGNvbG9yOiM2NDc0OGI7IHdoaXRlLXNwYWNlOm5vd3JhcDtcIj5weCZuYnNwOyg5LjgmbmJzcDtwdCk8L3NwYW4+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwicGFnZS1tYXJnaW4taW5wdXRcIiBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07IGZvbnQtd2VpZ2h0OjYwMDsgY29sb3I6IzQ3NTU2OTsgd2hpdGUtc3BhY2U6bm93cmFwOyBtYXJnaW4tbGVmdDo4cHg7XCI+UGFnZSBtYXJnaW4gKGluKTo8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIGlkPVwicGFnZS1tYXJnaW4taW5wdXRcIlxuICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgbWluPVwiMC41XCIgbWF4PVwiMS41XCIgc3RlcD1cIjAuMDVcIlxuICAgICAgICAgICAgICB2YWx1ZT1cIjAuNVwiXG4gICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6NzJweDsgcGFkZGluZzozcHggNnB4OyBib3JkZXI6MXB4IHNvbGlkICNjYmQ1ZTE7IGJvcmRlci1yYWRpdXM6NHB4OyBmb250LXNpemU6MC45ZW07XCJcbiAgICAgICAgICAgICAgdGl0bGU9XCJDb250cm9scyB0aGUgcHJpbnQgcGFnZSBtYXJnaW5zIGZvciBhbGwgUERGIHBhZ2VzLlwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cInB1YmxpY2F0aW9ucy1zdGFydC1uZXctcGFnZS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTppbmxpbmUtZmxleDsgYWxpZ24taXRlbXM6Y2VudGVyOyBnYXA6NnB4OyBmb250LXNpemU6MC44M2VtOyBjb2xvcjojMzM0MTU1OyBtYXJnaW4tbGVmdDo4cHg7XCI+XG4gICAgICAgICAgICAgIDxpbnB1dCBpZD1cInB1YmxpY2F0aW9ucy1zdGFydC1uZXctcGFnZS1pbnB1dFwiIHR5cGU9XCJjaGVja2JveFwiIC8+XG4gICAgICAgICAgICAgIFN0YXJ0IFB1YmxpY2F0aW9ucyBvbiBuZXcgcGFnZVxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJza2lsbHMtc2hvdy1leHBlcmllbmNlLXNlbGVjdFwiIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTsgZm9udC13ZWlnaHQ6NjAwOyBjb2xvcjojNDc1NTY5OyB3aGl0ZS1zcGFjZTpub3dyYXA7IG1hcmdpbi1sZWZ0OjhweDtcIj5Ta2lsbCBleHBlcmllbmNlIGxldmVsOjwvbGFiZWw+XG4gICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgIGlkPVwic2tpbGxzLXNob3ctZXhwZXJpZW5jZS1zZWxlY3RcIlxuICAgICAgICAgICAgICBzdHlsZT1cInBhZGRpbmc6M3B4IDZweDsgYm9yZGVyOjFweCBzb2xpZCAjY2JkNWUxOyBib3JkZXItcmFkaXVzOjRweDsgZm9udC1zaXplOjAuOWVtO1wiXG4gICAgICAgICAgICAgIHRpdGxlPVwiQ29udHJvbHMgd2hldGhlciB5ZWFycyBvZiBleHBlcmllbmNlIGFyZSBzaG93biBuZXh0IHRvIGVhY2ggc2tpbGwuXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImluZGl2aWR1YWxcIj5JbmRpdmlkdWFsIHNldHRpbmc8L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImFsd2F5c1wiPkFsd2F5czwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwibmV2ZXJcIj5OZXZlcjwvb3B0aW9uPlxuICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwiYXBwbHktbGF5b3V0LXNldHRpbmdzLWJ0blwiIGNsYXNzPVwiYnRuLXNlY29uZGFyeVwiIHN0eWxlPVwicGFkZGluZzozcHggMTBweDsgZm9udC1zaXplOjAuODVlbTtcIj5BcHBseTwvYnV0dG9uPlxuICAgICAgICAgICAgPHNwYW4gaWQ9XCJsYXlvdXQtc2V0dGluZ3Mtc3RhdHVzXCIgc3R5bGU9XCJmb250LXNpemU6MC44ZW07IGNvbG9yOiM2NDc0OGI7XCI+PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPHRleHRhcmVhXG4gICAgICAgICAgICBpZD1cImluc3RydWN0aW9uLWlucHV0XCJcbiAgICAgICAgICAgIGNsYXNzPVwibGF5b3V0LWluc3RydWN0aW9uLXRleHRhcmVhXCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiwgTW92ZSBQdWJsaWNhdGlvbnMgc2VjdGlvbiBhZnRlciBTa2lsbHMmIzEwO29yOiBTaG9ydGVuIHRoZSBzZWNvbmQgYnVsbGV0IHVuZGVyIEdlbmVudGVjaCB0byBmb2N1cyBvbiBpbXBhY3QmIzEwO29yOiBLZWVwIHRoZSBHZW5lbnRlY2ggZW50cnkgb24gb25lIHBhZ2VcIlxuICAgICAgICAgICAgcm93cz1cIjZcIj48L3RleHRhcmVhPlxuXG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImFwcGx5LWluc3RydWN0aW9uLWJ0blwiIGNsYXNzPVwiYnRuLXByaW1hcnkgbGF5b3V0LWFjdGlvbi1idG5cIj5cbiAgICAgICAgICAgIEFwcGx5XG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiY29uZmlybS1sYXlvdXQtYnRuXCIgY2xhc3M9XCJjb250aW51ZS1idG4gbGF5b3V0LWFjdGlvbi1idG5cIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj5cbiAgICAgICAgICAgIENvbmZpcm0gTGF5b3V0XG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8cCBpZD1cImxheW91dC10d28tc3RlcC1oaW50XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7Zm9udC1zaXplOjAuODJlbTtjb2xvcjojNmI3MjgwO21hcmdpbjo2cHggMCAycHg7XCI+XG4gICAgICAgICAgICBPbmNlIHRoZSBwcmV2aWV3IGxvb2tzIHJpZ2h0LCBjb25maXJtIHRoZSBsYXlvdXQgXHUyMDE0IHRoZW4gZ2VuZXJhdGUgeW91ciBmaW5hbCBzdWJtaXNzaW9uIGZpbGVzLlxuICAgICAgICAgIDwvcD5cblxuICAgICAgICAgIDxkaXYgaWQ9XCJwcm9jZXNzaW5nLWluZGljYXRvclwiIGNsYXNzPVwicHJvY2Vzc2luZy1pbmRpY2F0b3JcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Bpbm5lclwiPjwvZGl2PlxuICAgICAgICAgICAgPHA+QXBwbHlpbmcgaW5zdHJ1Y3Rpb24uLi48L3A+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGlkPVwiY29uZmlybWF0aW9uLW1lc3NhZ2VcIiBjbGFzcz1cImNvbmZpcm1hdGlvbi1tZXNzYWdlXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPjwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImxheW91dC1oaXN0b3J5LXNlY3Rpb25cIj5cbiAgICAgICAgICAgIDxoND5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoaXN0b3J5LXRvZ2dsZVwiPlx1MjVCQzwvc3Bhbj5cbiAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gSGlzdG9yeSAoPHNwYW4gaWQ9XCJpbnN0cnVjdGlvbi1jb3VudFwiPjA8L3NwYW4+KVxuICAgICAgICAgICAgPC9oND5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJpbnN0cnVjdGlvbi1oaXN0b3J5XCIgY2xhc3M9XCJpbnN0cnVjdGlvbi1oaXN0b3J5LWxpc3RcIj48L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxidXR0b24gaWQ9XCJwcm9jZWVkLXRvLWZpbmFsaXNlLWJ0blwiIGNsYXNzPVwiY29udGludWUtYnRuIGxheW91dC1hY3Rpb24tYnRuXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxuICAgICAgICAgICAgR2VuZXJhdGUgRmluYWwgRmlsZXNcbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDxkaXYgaWQ9XCJjb250ZW50LXByb3Bvc2FsLXByb2Nlc3NpbmdcIiBjbGFzcz1cInByb2Nlc3NpbmctaW5kaWNhdG9yXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Bpbm5lclwiPjwvZGl2PlxuICAgICAgICAgICAgPHA+R2VuZXJhdGluZyBjb250ZW50IHByb3Bvc2Fsc1x1MjAyNjwvcD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGlkPVwiY29udGVudC1wcm9wb3NhbHMtcGFuZWxcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj48L2Rpdj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiYXBwbHktY29udGVudC1jaGFuZ2VzLWJ0blwiIGNsYXNzPVwiYnRuLXdhcm5pbmcgbGF5b3V0LWFjdGlvbi1idG5cIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj5cbiAgICAgICAgICAgIEFwcGx5IEFwcHJvdmVkIENoYW5nZXNcbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDxkaXYgaWQ9XCJkaXJ0eS1waGFzZXMtY2FsbG91dFwiIGNsYXNzPVwiZGlydHktcGhhc2VzLWNhbGxvdXRcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj5cbiAgICAgICAgICAgIDxoND5cdTI2QTAgQ29udGVudCBDaGFuZ2VkIFx1MjAxNCBSZS1ydW4gUmVxdWlyZWQ8L2g0PlxuICAgICAgICAgICAgPHA+VGV4dCBlZGl0cyBoYXZlIGJlZW4gc3RhZ2VkLiBUaGUgY3VycmVudCBwcmV2aWV3IG5vIGxvbmdlciByZWZsZWN0cyB0aGUgdXBkYXRlZCBjb250ZW50LjwvcD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYXlvdXQtc3RhbGUtY2FsbG91dC1hY3Rpb25zXCI+XG4gICAgICAgICAgICAgIDxidXR0b24gaWQ9XCJyZXR1cm4tdG8tZWFybGllc3QtZGlydHktYnRuXCIgY2xhc3M9XCJidG4td2FybmluZyBsYXlvdXQtYWN0aW9uLWJ0blwiPlx1MjFCQiBSZXR1cm4gdG8gR2VuZXJhdGUgQ1Y8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIGA7XG5cbiAgICAvLyBXaXJlIHVwIGV2ZW50IGxpc3RlbmVyc1xuICAgIHNldHVwTGF5b3V0SW5zdHJ1Y3Rpb25MaXN0ZW5lcnMoKTtcbiAgfVxuXG4gIC8vIFJlc3RvcmUgc2F2ZWQgZm9udCBzaXplIGZyb20gc2Vzc2lvbiBzdGF0ZSBpZiBhdmFpbGFibGVcbiAgY29uc3Qgc2F2ZWRGb250U2l6ZSA9IHN0YXRlTWFuYWdlcj8uZ2V0U2Vzc2lvblN0YXRlPy4oKT8uYmFzZV9mb250X3NpemU7XG4gIGlmIChzYXZlZEZvbnRTaXplKSB7XG4gICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFzZS1mb250LXNpemUtaW5wdXQnKTtcbiAgICBpZiAoaW5wdXQpIHtcbiAgICAgIGNvbnN0IHB4ID0gcGFyc2VGbG9hdChzYXZlZEZvbnRTaXplKSB8fCAxMztcbiAgICAgIGlucHV0LnZhbHVlID0gcHg7XG4gICAgICBjb25zdCBwdERpc3BsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZm9udC1zaXplLXB0LWRpc3BsYXknKTtcbiAgICAgIGlmIChwdERpc3BsYXkpIHB0RGlzcGxheS50ZXh0Q29udGVudCA9IGBweFxcdTAwYTAoJHtweFRvUHQocHgpfVxcdTAwYTBwdClgO1xuICAgIH1cbiAgfVxuICBjb25zdCBzYXZlZFBhZ2VNYXJnaW4gPSBzdGF0ZU1hbmFnZXI/LmdldFNlc3Npb25TdGF0ZT8uKCk/LnBhZ2VfbWFyZ2luO1xuICBpZiAoc2F2ZWRQYWdlTWFyZ2luKSB7XG4gICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGFnZS1tYXJnaW4taW5wdXQnKTtcbiAgICBpZiAoaW5wdXQpIGlucHV0LnZhbHVlID0gcGFyc2VGbG9hdChzYXZlZFBhZ2VNYXJnaW4pIHx8IDAuNTtcbiAgfVxuICBjb25zdCBwdWJsaWNhdGlvbnNTdGFydElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1YmxpY2F0aW9ucy1zdGFydC1uZXctcGFnZS1pbnB1dCcpO1xuICBpZiAocHVibGljYXRpb25zU3RhcnRJbnB1dCkge1xuICAgIGNvbnN0IHNlc3Npb25TdGF0ZSA9IHN0YXRlTWFuYWdlcj8uZ2V0U2Vzc2lvblN0YXRlPy4oKSB8fCB7fTtcbiAgICBjb25zdCBjdXN0b21pemF0aW9uU3RhdGUgPSBzdGF0ZU1hbmFnZXI/LmdldFRhYkRhdGE/LignY3VzdG9taXphdGlvbnMnKSB8fCB7fTtcbiAgICBjb25zdCBzYXZlZFB1YmxpY2F0aW9uc1N0YXJ0ID1cbiAgICAgIHNlc3Npb25TdGF0ZS5wdWJsaWNhdGlvbnNfc3RhcnRfbmV3X3BhZ2VcbiAgICAgID8/IHNlc3Npb25TdGF0ZT8uY3VzdG9taXphdGlvbnM/LnB1YmxpY2F0aW9uc19zdGFydF9uZXdfcGFnZVxuICAgICAgPz8gY3VzdG9taXphdGlvblN0YXRlLnB1YmxpY2F0aW9uc19zdGFydF9uZXdfcGFnZVxuICAgICAgPz8gY3VzdG9taXphdGlvblN0YXRlLnB1YmxpY2F0aW9uc19wYWdlX2JyZWFrXG4gICAgICA/PyBjdXN0b21pemF0aW9uU3RhdGUuc3RhcnRfcHVibGljYXRpb25zX29uX25ld19wYWdlXG4gICAgICA/PyBmYWxzZTtcbiAgICBwdWJsaWNhdGlvbnNTdGFydElucHV0LmNoZWNrZWQgPSBjb2VyY2VCb29sZWFuKHNhdmVkUHVibGljYXRpb25zU3RhcnQsIGZhbHNlKTtcbiAgfVxuICBjb25zdCBza2lsbHNTaG93RXhwZXJpZW5jZVNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbHMtc2hvdy1leHBlcmllbmNlLXNlbGVjdCcpO1xuICBpZiAoc2tpbGxzU2hvd0V4cGVyaWVuY2VTZWxlY3QpIHtcbiAgICBjb25zdCBzZXNzaW9uU3RhdGUgPSBzdGF0ZU1hbmFnZXI/LmdldFNlc3Npb25TdGF0ZT8uKCkgfHwge307XG4gICAgY29uc3QgY3VzdG9taXphdGlvblN0YXRlID0gc3RhdGVNYW5hZ2VyPy5nZXRUYWJEYXRhPy4oJ2N1c3RvbWl6YXRpb25zJykgfHwge307XG4gICAgY29uc3Qgc2F2ZWRTa2lsbHNFeHAgPVxuICAgICAgc2Vzc2lvblN0YXRlLnNraWxsc19zaG93X2V4cGVyaWVuY2VcbiAgICAgID8/IHNlc3Npb25TdGF0ZT8uY3VzdG9taXphdGlvbnM/LnNraWxsc19zaG93X2V4cGVyaWVuY2VcbiAgICAgID8/IGN1c3RvbWl6YXRpb25TdGF0ZS5za2lsbHNfc2hvd19leHBlcmllbmNlXG4gICAgICA/PyAnaW5kaXZpZHVhbCc7XG4gICAgY29uc3QgdmFsaWQgPSBbJ2Fsd2F5cycsICduZXZlcicsICdpbmRpdmlkdWFsJ107XG4gICAgc2tpbGxzU2hvd0V4cGVyaWVuY2VTZWxlY3QudmFsdWUgPSB2YWxpZC5pbmNsdWRlcyhzYXZlZFNraWxsc0V4cCkgPyBzYXZlZFNraWxsc0V4cCA6ICdpbmRpdmlkdWFsJztcbiAgfVxuXG4gIHJlbmRlclByZXZpZXdPdXRwdXRTdGF0dXMoZ2V0UHJldmlld091dHB1dHMoKSk7XG5cbiAgLy8gTG9hZCBhbmQgZGlzcGxheSBjdXJyZW50IEhUTUwgcHJldmlldyB2aWEgdGhlIHN0YWdlZCBnZW5lcmF0aW9uIGNvbnRyYWN0LlxuICAvLyAvYXBpL2N2L2dlbmVyYXRlLXByZXZpZXcgZ2VuZXJhdGVzIGZyZXNoIEhUTUwgYW5kIHN0b3JlcyBpdCBpbiBzZXNzaW9uIHN0YXRlLlxuICAvLyBGYWxsIGJhY2sgdG8gdGhlIGxlZ2FjeSAvYXBpL2xheW91dC1odG1sIGVuZHBvaW50IGlmIHRoZSBzZXNzaW9uIGhhcyBub1xuICAvLyBjdXN0b21pemF0aW9uIGRhdGEgeWV0IChlLmcuIHNlc3Npb24gcmVzdG9yZWQgYWZ0ZXIgZnVsbCBnZW5lcmF0aW9uKS5cbiAgY29uc3QgY2FjaGVkSHRtbCA9IGdldEN2QXJ0aWZhY3RzKClbJyouaHRtbCddIHx8ICcnO1xuICBpZiAoY2FjaGVkSHRtbCkge1xuICAgIGRpc3BsYXlMYXlvdXRQcmV2aWV3KGNhY2hlZEh0bWwpO1xuICB9IGVsc2Uge1xuICAgIF9mZXRjaEFuZERpc3BsYXlMYXlvdXRQcmV2aWV3KCk7XG4gIH1cblxuICAvLyBSZXN0b3JlIGFueSBwcmlvciBpbnN0cnVjdGlvbnMgZnJvbSBzZXNzaW9uXG4gIGF3YWl0IHJlc3RvcmVJbnN0cnVjdGlvbkhpc3RvcnkoKTtcbiAgcmVmcmVzaExheW91dFJldmlld1N0YXRlKCk7XG5cbiAgLy8gU2hvdyBhIHByb2FjdGl2ZSBwYWdlLWxlbmd0aCBlc3RpbWF0ZSBzbyB1c2VycyBjYW4gYWRqdXN0IGNvbnRlbnQgYmVmb3JlIGdlbmVyYXRpbmdcbiAgX2ZldGNoUGFnZUVzdGltYXRlKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9mZXRjaFBhZ2VFc3RpbWF0ZSgpIHtcbiAgY29uc3QgYmFubmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xheW91dC1wYWdlLWVzdGltYXRlJyk7XG4gIGlmICghYmFubmVyKSByZXR1cm47XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvZXN0aW1hdGUtcGFnZXMnKTtcbiAgICBpZiAoIXJlcy5vaykgcmV0dXJuO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmICghZGF0YS5vayB8fCAhZGF0YS5lc3RpbWF0ZWRfcGFnZXMpIHJldHVybjtcbiAgICBjb25zdCBwYWdlcyA9IGRhdGEuZXN0aW1hdGVkX3BhZ2VzO1xuICAgIGNvbnN0IGlzT3ZlciA9IHBhZ2VzID4gMztcbiAgICBjb25zdCBjb2xvciA9IGlzT3ZlciA/ICcjOTI0MDBlJyA6ICcjMTY2NTM0JztcbiAgICBjb25zdCBiZyAgICA9IGlzT3ZlciA/ICcjZmVmM2M3JyA6ICcjZjBmZGY0JztcbiAgICBjb25zdCBib3JkZXIgPSBpc092ZXIgPyAnI2ZjZDM0ZCcgOiAnI2JiZjdkMCc7XG4gICAgY29uc3QgbXNnICAgPSBpc092ZXJcbiAgICAgID8gYFx1MjZBMCBFc3RpbWF0ZWQgfiR7cGFnZXN9IHBhZ2VzIFx1MjAxNCBzZW5pb3IgY2FuZGlkYXRlIHRhcmdldCBpcyAyXHUyMDEzMyBwYWdlcy4gQ29uc2lkZXIgcmVkdWNpbmcgc2VsZWN0ZWQgYnVsbGV0IHBvaW50cyBiZWZvcmUgZ2VuZXJhdGluZy5gXG4gICAgICA6IGBcdTI3MTMgRXN0aW1hdGVkIH4ke3BhZ2VzfSBwYWdlcyBcdTIwMTQgd2l0aGluIHRoZSAyXHUyMDEzMyBwYWdlIHRhcmdldCBmb3Igc2VuaW9yIGNhbmRpZGF0ZXMuYDtcbiAgICBiYW5uZXIuc3R5bGUuY3NzVGV4dCA9IGBkaXNwbGF5OmJsb2NrO3BhZGRpbmc6OHB4IDEycHg7Ym9yZGVyLXJhZGl1czo2cHg7Ym9yZGVyOjFweCBzb2xpZCAke2JvcmRlcn07YmFja2dyb3VuZDoke2JnfTtjb2xvcjoke2NvbG9yfTtmb250LXNpemU6MC44N2VtO2A7XG4gICAgYmFubmVyLnRleHRDb250ZW50ID0gbXNnO1xuICB9IGNhdGNoIChfKSB7IC8qIHNpbGVudCBcdTIwMTQgbm9uLWNyaXRpY2FsICovIH1cbn1cblxuLyoqXG4gKiBTZXQgdXAgZXZlbnQgbGlzdGVuZXJzIGZvciBsYXlvdXQgaW5zdHJ1Y3Rpb24gVUkuXG4gKi9cbmZ1bmN0aW9uIHNldHVwTGF5b3V0SW5zdHJ1Y3Rpb25MaXN0ZW5lcnMoKSB7XG4gIGNvbnN0IGFwcGx5QnRuICAgICAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FwcGx5LWluc3RydWN0aW9uLWJ0bicpO1xuICBjb25zdCBjb25maXJtQnRuICAgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb25maXJtLWxheW91dC1idG4nKTtcbiAgY29uc3QgcHJvY2VlZEJ0biAgICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJvY2VlZC10by1maW5hbGlzZS1idG4nKTtcbiAgY29uc3QgcmVnZW5lcmF0ZUJ0biAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVnZW5lcmF0ZS1sYXlvdXQtcHJldmlldy1idG4nKTtcbiAgY29uc3QgZGlzbWlzc0NhbGxvdXRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGlzbWlzcy1sYXlvdXQtc3RhbGUtYnRuJyk7XG4gIGNvbnN0IGluc3RydWN0aW9uSW5wdXQgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2luc3RydWN0aW9uLWlucHV0Jyk7XG4gIGNvbnN0IGhpc3RvcnlUb2dnbGUgICAgID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmhpc3RvcnktdG9nZ2xlJyk7XG4gIGNvbnN0IGFwcGx5U2V0dGluZ3NCdG4gID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FwcGx5LWxheW91dC1zZXR0aW5ncy1idG4nKTtcbiAgY29uc3QgZm9udFNpemVJbnB1dCAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFzZS1mb250LXNpemUtaW5wdXQnKTtcbiAgY29uc3QgcGFnZU1hcmdpbklucHV0ICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGFnZS1tYXJnaW4taW5wdXQnKTtcbiAgY29uc3QgcHVibGljYXRpb25zU3RhcnRJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWJsaWNhdGlvbnMtc3RhcnQtbmV3LXBhZ2UtaW5wdXQnKTtcbiAgY29uc3Qgc2tpbGxzU2hvd0V4cGVyaWVuY2VTZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGxzLXNob3ctZXhwZXJpZW5jZS1zZWxlY3QnKTtcblxuICBpZiAoYXBwbHlTZXR0aW5nc0J0biAmJiBmb250U2l6ZUlucHV0ICYmIHBhZ2VNYXJnaW5JbnB1dCAmJiBwdWJsaWNhdGlvbnNTdGFydElucHV0KSB7XG4gICAgYXBwbHlTZXR0aW5nc0J0bi5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgJ2NsaWNrJyxcbiAgICAgICgpID0+IGFwcGx5TGF5b3V0U2V0dGluZ3MoXG4gICAgICAgIGZvbnRTaXplSW5wdXQudmFsdWUsXG4gICAgICAgIHBhZ2VNYXJnaW5JbnB1dC52YWx1ZSxcbiAgICAgICAgcHVibGljYXRpb25zU3RhcnRJbnB1dC5jaGVja2VkLFxuICAgICAgICBza2lsbHNTaG93RXhwZXJpZW5jZVNlbGVjdD8udmFsdWUgfHwgJ2luZGl2aWR1YWwnLFxuICAgICAgKSxcbiAgICApO1xuICAgIGZvbnRTaXplSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwdERpc3BsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZm9udC1zaXplLXB0LWRpc3BsYXknKTtcbiAgICAgIGlmIChwdERpc3BsYXkpIHtcbiAgICAgICAgY29uc3QgcHggPSBwYXJzZUZsb2F0KGZvbnRTaXplSW5wdXQudmFsdWUpO1xuICAgICAgICBwdERpc3BsYXkudGV4dENvbnRlbnQgPSBpc05hTihweCkgPyAncHgnIDogYHB4XFx1MDBhMCgke3B4VG9QdChweCl9XFx1MDBhMHB0KWA7XG4gICAgICB9XG4gICAgfSk7XG4gICAgZm9udFNpemVJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdrZXlwcmVzcycsIChlKSA9PiB7XG4gICAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicpIHtcbiAgICAgICAgYXBwbHlMYXlvdXRTZXR0aW5ncyhcbiAgICAgICAgICBmb250U2l6ZUlucHV0LnZhbHVlLFxuICAgICAgICAgIHBhZ2VNYXJnaW5JbnB1dC52YWx1ZSxcbiAgICAgICAgICBwdWJsaWNhdGlvbnNTdGFydElucHV0LmNoZWNrZWQsXG4gICAgICAgICAgc2tpbGxzU2hvd0V4cGVyaWVuY2VTZWxlY3Q/LnZhbHVlIHx8ICdpbmRpdmlkdWFsJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBwYWdlTWFyZ2luSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5cHJlc3MnLCAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSAnRW50ZXInKSB7XG4gICAgICAgIGFwcGx5TGF5b3V0U2V0dGluZ3MoXG4gICAgICAgICAgZm9udFNpemVJbnB1dC52YWx1ZSxcbiAgICAgICAgICBwYWdlTWFyZ2luSW5wdXQudmFsdWUsXG4gICAgICAgICAgcHVibGljYXRpb25zU3RhcnRJbnB1dC5jaGVja2VkLFxuICAgICAgICAgIHNraWxsc1Nob3dFeHBlcmllbmNlU2VsZWN0Py52YWx1ZSB8fCAnaW5kaXZpZHVhbCcsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBpZiAoYXBwbHlCdG4pIHtcbiAgICBhcHBseUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IGluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb25JbnB1dC52YWx1ZS50cmltKCk7XG4gICAgICBpZiAoIWluc3RydWN0aW9uKSB7XG4gICAgICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsICdcdTI2QTBcdUZFMEYgUGxlYXNlIGVudGVyIGFuIGluc3RydWN0aW9uIGJlZm9yZSBzdWJtaXR0aW5nLicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzdWJtaXRTbWFydEluc3RydWN0aW9uKGluc3RydWN0aW9uKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChjb25maXJtQnRuKSB7XG4gICAgY29uZmlybUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNvbmZpcm1MYXlvdXRSZXZpZXcpO1xuICB9XG5cbiAgaWYgKHByb2NlZWRCdG4pIHtcbiAgICBwcm9jZWVkQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZ2VuZXJhdGVGaW5hbE91dHB1dHMpO1xuICB9XG5cbiAgaWYgKHJlZ2VuZXJhdGVCdG4pIHtcbiAgICByZWdlbmVyYXRlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlUmVnZW5lcmF0ZVByZXZpZXdBY3Rpb24pO1xuICB9XG5cbiAgaWYgKGRpc21pc3NDYWxsb3V0QnRuKSB7XG4gICAgZGlzbWlzc0NhbGxvdXRCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBkaXNtaXNzZWRTdGFsZUNhbGxvdXRSZXZpc2lvbiA9IGdldEN1cnJlbnRDb250ZW50UmV2aXNpb24oKTtcbiAgICAgIHJlbmRlckxheW91dFN0YWxlQ2FsbG91dCgpO1xuICAgIH0pO1xuICB9XG5cbiAgaWYgKGhpc3RvcnlUb2dnbGUpIHtcbiAgICBoaXN0b3J5VG9nZ2xlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgIGUudGFyZ2V0LnRleHRDb250ZW50ID0gZS50YXJnZXQudGV4dENvbnRlbnQgPT09ICdcdTI1QkMnID8gJ1x1MjVCNicgOiAnXHUyNUJDJztcbiAgICAgIGNvbnN0IGhpc3RvcnlMaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2luc3RydWN0aW9uLWhpc3RvcnknKTtcbiAgICAgIGlmIChoaXN0b3J5TGlzdCkge1xuICAgICAgICBoaXN0b3J5TGlzdC5jbGFzc0xpc3QudG9nZ2xlKCdjb2xsYXBzZWQnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIEFsbG93IEVudGVyIGtleSB0byBzdWJtaXQgaW4gdGV4dGFyZWEgKFNoaWZ0K0VudGVyIGZvciBuZXcgbGluZSlcbiAgaWYgKGluc3RydWN0aW9uSW5wdXQpIHtcbiAgICBpbnN0cnVjdGlvbklucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXByZXNzJywgKGUpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJyAmJiAhZS5zaGlmdEtleSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGFwcGx5QnRuPy5jbGljaygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gQ29udGVudCBwcm9wb3NhbCBhbmQgZGlydHktcGhhc2UgYnV0dG9uc1xuICBjb25zdCBhcHBseUNvbnRlbnRDaGFuZ2VzQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FwcGx5LWNvbnRlbnQtY2hhbmdlcy1idG4nKTtcbiAgY29uc3QgcmV0dXJuVG9EaXJ0eUJ0biAgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXR1cm4tdG8tZWFybGllc3QtZGlydHktYnRuJyk7XG5cbiAgaWYgKGFwcGx5Q29udGVudENoYW5nZXNCdG4pIHtcbiAgICBhcHBseUNvbnRlbnRDaGFuZ2VzQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXBwbHlBY2NlcHRlZFByb3Bvc2Fscyk7XG4gIH1cblxuICBpZiAocmV0dXJuVG9EaXJ0eUJ0bikge1xuICAgIHJldHVyblRvRGlydHlCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBzdGVwID0gc3RhdGVNYW5hZ2VyLmdldEVhcmxpZXN0RGlydHlTdGVwKCkgfHwgJ2dlbmVyYXRlJztcbiAgICAgIGNvbmZpcm1SZVJ1blBoYXNlKHN0ZXApO1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogU2F2ZSBsYXlvdXQgZGlzcGxheSBzZXR0aW5ncyB0byBzZXNzaW9uIHN0YXRlLCB0aGVuIHJlLXJlbmRlciB0aGUgcHJldmlldy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYXBwbHlMYXlvdXRTZXR0aW5ncyhmb250U2l6ZVZhbHVlLCBwYWdlTWFyZ2luVmFsdWUsIHB1YmxpY2F0aW9uc1N0YXJ0TmV3UGFnZSA9IGZhbHNlLCBza2lsbHNTaG93RXhwZXJpZW5jZSA9ICdpbmRpdmlkdWFsJykge1xuICBjb25zdCBzdGF0dXNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYXlvdXQtc2V0dGluZ3Mtc3RhdHVzJyk7XG4gIGNvbnN0IHBhcnNlZEZvbnRTaXplID0gcGFyc2VGbG9hdChmb250U2l6ZVZhbHVlKTtcbiAgY29uc3QgcGFyc2VkUGFnZU1hcmdpbiA9IHBhcnNlRmxvYXQocGFnZU1hcmdpblZhbHVlKTtcbiAgaWYgKGlzTmFOKHBhcnNlZEZvbnRTaXplKSB8fCBwYXJzZWRGb250U2l6ZSA8IDYgfHwgcGFyc2VkRm9udFNpemUgPiAxNikge1xuICAgIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnXHUyNkEwXHVGRTBGIEZvbnQgbXVzdCBiZSA2XHUyMDEzMTYnO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoaXNOYU4ocGFyc2VkUGFnZU1hcmdpbikgfHwgcGFyc2VkUGFnZU1hcmdpbiA8IDAuNSB8fCBwYXJzZWRQYWdlTWFyZ2luID4gMS41KSB7XG4gICAgaWYgKHN0YXR1c0VsKSBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICdcdTI2QTBcdUZFMEYgTWFyZ2luIG11c3QgYmUgMC41XHUyMDEzMS41JztcbiAgICByZXR1cm47XG4gIH1cbiAgdHJ5IHtcbiAgICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJ1NhdmluZ1x1MjAyNic7XG4gICAgY29uc3Qgc2F2ZVJlcyA9IGF3YWl0IGFwaUNhbGwoJ1BPU1QnLCAnL2FwaS9sYXlvdXQtc2V0dGluZ3MnLCB7XG4gICAgICBiYXNlX2ZvbnRfc2l6ZTogYCR7cGFyc2VkRm9udFNpemV9cHhgLFxuICAgICAgcGFnZV9tYXJnaW46IGAke3BhcnNlZFBhZ2VNYXJnaW59aW5gLFxuICAgICAgcHVibGljYXRpb25zX3N0YXJ0X25ld19wYWdlOiBCb29sZWFuKHB1YmxpY2F0aW9uc1N0YXJ0TmV3UGFnZSksXG4gICAgICBza2lsbHNfc2hvd19leHBlcmllbmNlOiBza2lsbHNTaG93RXhwZXJpZW5jZSxcbiAgICB9KTtcbiAgICBpZiAoIXNhdmVSZXMub2spIHRocm93IG5ldyBFcnJvcihzYXZlUmVzLmVycm9yIHx8ICdzYXZlIGZhaWxlZCcpO1xuXG4gICAgaWYgKHN0YXR1c0VsKSBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICdSZS1yZW5kZXJpbmdcdTIwMjYnO1xuICAgIGNvbnN0IHByZXZpZXdSZXMgPSBhd2FpdCBhcGlDYWxsKCdQT1NUJywgJy9hcGkvY3YvZ2VuZXJhdGUtcHJldmlldycsIHsgY29udGVudF9yZXZpc2lvbjogZ2V0Q3VycmVudENvbnRlbnRSZXZpc2lvbigpIH0pO1xuICAgIGlmIChwcmV2aWV3UmVzLm9rICYmIHByZXZpZXdSZXMuaHRtbCkge1xuICAgICAgZGlzcGxheUxheW91dFByZXZpZXcocHJldmlld1Jlcy5odG1sKTtcbiAgICAgIHNldFByZXZpZXdIdG1sKHByZXZpZXdSZXMuaHRtbCk7XG4gICAgICBkaXNtaXNzZWRTdGFsZUNhbGxvdXRSZXZpc2lvbiA9IG51bGw7XG4gICAgICBzdGF0ZU1hbmFnZXI/Lm1hcmtQcmV2aWV3R2VuZXJhdGVkPy4oe1xuICAgICAgICBwcmV2aWV3QXZhaWxhYmxlOiB0cnVlLFxuICAgICAgICBwcmV2aWV3T3V0cHV0czogcHJldmlld1Jlcy5wcmV2aWV3X291dHB1dHMgfHwgbnVsbCxcbiAgICAgICAgcGFnZUNvdW50RXN0aW1hdGU6IHByZXZpZXdSZXMucGFnZV9jb3VudF9lc3RpbWF0ZSA/PyBudWxsLFxuICAgICAgICBwYWdlQ291bnRFeGFjdDogcHJldmlld1Jlcy5wYWdlX2NvdW50X2V4YWN0ID8/IG51bGwsXG4gICAgICAgIHBhZ2VDb3VudENvbmZpZGVuY2U6IHByZXZpZXdSZXMucGFnZV9jb3VudF9jb25maWRlbmNlID8/IG51bGwsXG4gICAgICAgIHBhZ2VDb3VudFNvdXJjZTogcHJldmlld1Jlcy5wYWdlX2NvdW50X3NvdXJjZSB8fCBudWxsLFxuICAgICAgICBwYWdlV2FybmluZzogQm9vbGVhbihwcmV2aWV3UmVzLnBhZ2VfbGVuZ3RoX3dhcm5pbmcpLFxuICAgICAgICBwcmV2aWV3R2VuZXJhdGVkQXQ6IHByZXZpZXdSZXMucHJldmlld19nZW5lcmF0ZWRfYXQgfHwgbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICBwcmV2aWV3UmVxdWVzdElkOiBwcmV2aWV3UmVzLnByZXZpZXdfcmVxdWVzdF9pZCB8fCBudWxsLFxuICAgICAgfSk7XG4gICAgICByZW5kZXJQcmV2aWV3T3V0cHV0U3RhdHVzKHByZXZpZXdSZXMucHJldmlld19vdXRwdXRzIHx8IG51bGwpO1xuICAgICAgcmVmcmVzaExheW91dFJldmlld1N0YXRlKCk7XG4gICAgICAocHJldmlld1Jlcy5jb250ZW50X3dhcm5pbmdzIHx8IFtdKS5mb3JFYWNoKHcgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHNob3dUb2FzdCA9PT0gJ2Z1bmN0aW9uJykgc2hvd1RvYXN0KHcubWVzc2FnZSwgJ3dhcm5pbmcnLCA4MDAwKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoc3RhdHVzRWwpIHsgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnXHUyNzA1IEFwcGxpZWQnOyBzZXRUaW1lb3V0KCgpID0+IHsgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnJzsgfSwgMjAwMCk7IH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKHN0YXR1c0VsKSBzdGF0dXNFbC50ZXh0Q29udGVudCA9IGBcdTI3NEMgRmFpbGVkIHRvIGFwcGx5IFx1MjAxNCB0cnkgYWdhaW4gb3IgcmVmcmVzaC5gO1xuICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsIGBcdTI3NEMgQ291bGQgbm90IGFwcGx5IHRoZSBpbnN0cnVjdGlvbi4gVHJ5IHJlcGhyYXNpbmcgaXQgb3IgcmVmcmVzaCB0aGUgcGFnZSBpZiB0aGUgcHJvYmxlbSBwZXJzaXN0cy5gKTtcbiAgfVxufVxuXG4vKipcbiAqIFN1Ym1pdCBhbiBpbnN0cnVjdGlvbiB0aHJvdWdoIHRoZSB1bmlmaWVkIHNtYXJ0LWluc3RydWN0aW9uIGVuZHBvaW50LlxuICogVGhlIGJhY2tlbmQgY2xhc3NpZmllcyB0aGUgaW5zdHJ1Y3Rpb24gYXMgbGF5b3V0IG9yIGNvbnRlbnQgYW5kIGRlbGVnYXRlc1xuICogdG8gdGhlIGFwcHJvcHJpYXRlIGhhbmRsZXIuIFRoZSByZXNwb25zZSBpcyByb3V0ZWQgYWNjb3JkaW5nbHkgaGVyZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3VibWl0U21hcnRJbnN0cnVjdGlvbihpbnN0cnVjdGlvblRleHQpIHtcbiAgY29uc3QgY3VycmVudEh0bWwgPSBnZXRDdkFydGlmYWN0cygpWycqLmh0bWwnXSB8fCAnJztcbiAgLy8gU25hcHNob3Qgc3RhdGUgZm9yIHVuZG8gYmVmb3JlIGFwcGx5aW5nLlxuICBfbGF5b3V0VW5kb1N0YWNrLnB1c2goe1xuICAgIGh0bWw6IGN1cnJlbnRIdG1sLFxuICAgIGluc3RydWN0aW9uczogKHdpbmRvdy5sYXlvdXRJbnN0cnVjdGlvbnMgfHwgW10pLm1hcChpID0+ICh7IC4uLmkgfSkpLFxuICB9KTtcbiAgaWYgKF9sYXlvdXRVbmRvU3RhY2subGVuZ3RoID4gX1VORE9fU1RBQ0tfTUFYKSB7XG4gICAgX2xheW91dFVuZG9TdGFjay5zaGlmdCgpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBzaG93UHJvY2Vzc2luZyh0cnVlKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGFwaUNhbGwoJ1BPU1QnLCAnL2FwaS9jdi9zbWFydC1pbnN0cnVjdGlvbicsIHsgaW5zdHJ1Y3Rpb246IGluc3RydWN0aW9uVGV4dCB9KTtcblxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIGlmIChyZXNwb25zZS5lcnJvciA9PT0gJ2NsYXJpZnknKSB7XG4gICAgICAgIHNob3dDbGFyaWZpY2F0aW9uRGlhbG9nKHJlc3BvbnNlLnF1ZXN0aW9uLCBpbnN0cnVjdGlvblRleHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXBwZW5kTGF5b3V0U2FmZXR5QWxlcnQocmVzcG9uc2Uuc2FmZXR5X2FsZXJ0KTtcbiAgICAgICAgbGV0IGVycm9ySHRtbCA9IGBcdTI2QTBcdUZFMEYgRXJyb3I6ICR7ZXNjYXBlSHRtbChyZXNwb25zZS5lcnJvcil9IFx1MjAxNCAke2VzY2FwZUh0bWwocmVzcG9uc2UuZGV0YWlscyB8fCAnJyl9YDtcbiAgICAgICAgaWYgKHJlc3BvbnNlLnJhd19yZXNwb25zZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZXJyb3JIdG1sICs9IGA8YnI+PGRldGFpbHMgc3R5bGU9XCJtYXJnaW4tdG9wOjZweFwiPjxzdW1tYXJ5IHN0eWxlPVwiY3Vyc29yOnBvaW50ZXI7Zm9udC1zaXplOjAuODVlbTtjb2xvcjojNjQ3NDhiXCI+UmF3IExMTSByZXNwb25zZTwvc3VtbWFyeT48cHJlIHN0eWxlPVwiZm9udC1zaXplOjAuNzVlbTt3aGl0ZS1zcGFjZTpwcmUtd3JhcDt3b3JkLWJyZWFrOmJyZWFrLWFsbDttYXgtaGVpZ2h0OjIwMHB4O292ZXJmbG93LXk6YXV0bztiYWNrZ3JvdW5kOiNmOGZhZmM7Ym9yZGVyOjFweCBzb2xpZCAjZTJlOGYwO2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6OHB4O21hcmdpbi10b3A6NHB4XCI+JHtlc2NhcGVIdG1sKHJlc3BvbnNlLnJhd19yZXNwb25zZSB8fCAnKGVtcHR5KScpfTwvcHJlPjwvZGV0YWlscz5gO1xuICAgICAgICB9XG4gICAgICAgIGFwcGVuZE1lc3NhZ2VIdG1sKCdzeXN0ZW0nLCBlcnJvckh0bWwpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGluc3RydWN0aW9uVHlwZSA9IHJlc3BvbnNlLmluc3RydWN0aW9uX3R5cGUgfHwgJ2xheW91dCc7XG5cbiAgICBpZiAoaW5zdHJ1Y3Rpb25UeXBlID09PSAnY29udGVudCcpIHtcbiAgICAgIC8vIENvbnRlbnQgcGF0aDogcmVuZGVyIHByb3Bvc2FscyBmb3IgcmV2aWV3XG4gICAgICBjb25zdCBwcm9wb3NhbHMgPSByZXNwb25zZS5wcm9wb3NhbHMgfHwgW107XG4gICAgICBpZiAocHJvcG9zYWxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnXHUyNkEwXHVGRTBGIE5vIGNvbnRlbnQgcHJvcG9zYWxzIHdlcmUgZ2VuZXJhdGVkLiBUcnkgcmVwaHJhc2luZyB5b3VyIGluc3RydWN0aW9uLicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVuZGVyQ29udGVudFByb3Bvc2Fscyhwcm9wb3NhbHMpO1xuICAgICAgICBjb25zdCBwYW5lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb250ZW50LXByb3Bvc2Fscy1wYW5lbCcpO1xuICAgICAgICBpZiAocGFuZWwpIHBhbmVsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgfVxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2luc3RydWN0aW9uLWlucHV0JykudmFsdWUgPSAnJztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBMYXlvdXQgcGF0aDogdXBkYXRlIHByZXZpZXdcbiAgICBjb25zdCBuZXdIdG1sID0gcmVzcG9uc2UuaHRtbDtcbiAgICBkaXNwbGF5TGF5b3V0UHJldmlldyhuZXdIdG1sKTtcbiAgICBhcHBlbmRMYXlvdXRTYWZldHlBbGVydChyZXNwb25zZS5zYWZldHlfYWxlcnQpO1xuICAgIHNldFByZXZpZXdIdG1sKG5ld0h0bWwpO1xuICAgIGRpc21pc3NlZFN0YWxlQ2FsbG91dFJldmlzaW9uID0gbnVsbDtcbiAgICBzdGF0ZU1hbmFnZXI/Lm1hcmtQcmV2aWV3R2VuZXJhdGVkPy4oe1xuICAgICAgcHJldmlld0F2YWlsYWJsZTogdHJ1ZSxcbiAgICAgIHByZXZpZXdPdXRwdXRzOiByZXNwb25zZS5wcmV2aWV3X291dHB1dHMgfHwgbnVsbCxcbiAgICAgIGxheW91dENvbmZpcm1lZDogZmFsc2UsXG4gICAgICBwYWdlQ291bnRFc3RpbWF0ZTogcmVzcG9uc2UucGFnZV9jb3VudF9lc3RpbWF0ZSA/PyBudWxsLFxuICAgICAgcGFnZUNvdW50RXhhY3Q6IHJlc3BvbnNlLnBhZ2VfY291bnRfZXhhY3QgPz8gbnVsbCxcbiAgICAgIHBhZ2VDb3VudENvbmZpZGVuY2U6IHJlc3BvbnNlLnBhZ2VfY291bnRfY29uZmlkZW5jZSA/PyBudWxsLFxuICAgICAgcGFnZUNvdW50U291cmNlOiByZXNwb25zZS5wYWdlX2NvdW50X3NvdXJjZSB8fCBudWxsLFxuICAgICAgcGFnZVdhcm5pbmc6IEJvb2xlYW4ocmVzcG9uc2UucGFnZV9sZW5ndGhfd2FybmluZyksXG4gICAgICBwcmV2aWV3R2VuZXJhdGVkQXQ6IHJlc3BvbnNlLnByZXZpZXdfZ2VuZXJhdGVkX2F0IHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHByZXZpZXdSZXF1ZXN0SWQ6IHJlc3BvbnNlLnByZXZpZXdfcmVxdWVzdF9pZCB8fCBudWxsLFxuICAgIH0pO1xuICAgIHJlbmRlclByZXZpZXdPdXRwdXRTdGF0dXMocmVzcG9uc2UucHJldmlld19vdXRwdXRzIHx8IG51bGwpO1xuXG4gICAgY29uc3QgaW5zdHJ1Y3Rpb24gPSB7XG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9Mb2NhbGVUaW1lU3RyaW5nKCksXG4gICAgICBpbnN0cnVjdGlvbl90ZXh0OiBpbnN0cnVjdGlvblRleHQsXG4gICAgICBjaGFuZ2Vfc3VtbWFyeTogcmVzcG9uc2Uuc3VtbWFyeSxcbiAgICAgIGNvbmZpcm1hdGlvbjogdHJ1ZSxcbiAgICB9O1xuICAgIGFkZFRvSW5zdHJ1Y3Rpb25IaXN0b3J5KGluc3RydWN0aW9uKTtcbiAgICBzaG93Q29uZmlybWF0aW9uTWVzc2FnZShgJHtyZXNwb25zZS5zYWZldHlfYWxlcnQ/LmZsYWdnZWQgPyAnXHUyNkEwXHVGRTBGICcgOiAnXHUyNzA1ICd9JHtyZXNwb25zZS5zdW1tYXJ5fWApO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnN0cnVjdGlvbi1pbnB1dCcpLnZhbHVlID0gJyc7XG4gICAgcmVmcmVzaExheW91dFJldmlld1N0YXRlKCk7XG5cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCBgXHUyNzRDIENvdWxkIG5vdCBhcHBseSB0aGUgaW5zdHJ1Y3Rpb24uIFRyeSByZXBocmFzaW5nIGl0LCBvciBjbGljayBcIlJlZ2VuZXJhdGUgUHJldmlld1wiIHRvIHJlc2V0IHRoZSBwcmV2aWV3IGFuZCB0cnkgYWdhaW4uYCk7XG4gIH0gZmluYWxseSB7XG4gICAgc2hvd1Byb2Nlc3NpbmcoZmFsc2UpO1xuICB9XG59XG5cbi8qKlxuICogU3VibWl0IGxheW91dCBpbnN0cnVjdGlvbiB0byBiYWNrZW5kIGZvciBwcm9jZXNzaW5nLlxuICpcbiAqIFVzZXMgUE9TVCAvYXBpL2N2L2xheW91dC1yZWZpbmUgKHN0YWdlZCBnZW5lcmF0aW9uIGNvbnRyYWN0KSB3aGVuIGFcbiAqIHNlc3Npb24tc3RvcmVkIHByZXZpZXcgaXMgYXZhaWxhYmxlLiAgRmFsbHMgYmFjayB0byB0aGUgbGVnYWN5XG4gKiBQT1NUIC9hcGkvbGF5b3V0LWluc3RydWN0aW9uIGVuZHBvaW50ICh3aGljaCByZXF1aXJlcyB0aGUgSFRNTCBpbiB0aGVcbiAqIHJlcXVlc3QgYm9keSkgd2hlbiBubyBzZXNzaW9uIHByZXZpZXcgZXhpc3RzLlxuICovXG5hc3luYyBmdW5jdGlvbiBzdWJtaXRMYXlvdXRJbnN0cnVjdGlvbihpbnN0cnVjdGlvblRleHQpIHtcbiAgLyogZHVja2Zsb3c6XG4gICAqICAgaWQ6IGxheW91dF91aV9yZWZpbmVfbGl2ZVxuICAgKiAgIGtpbmQ6IHVpXG4gICAqICAgdGltZXN0YW1wOiAnMjAyNi0wMy0yNlQwMDoyNDowMFonXG4gICAqICAgc3RhdHVzOiBsaXZlXG4gICAqICAgaGFuZGxlczpcbiAgICogICAtIHVpOmxheW91dC5zdWJtaXQtaW5zdHJ1Y3Rpb25cbiAgICogICBjYWxsczpcbiAgICogICAtIFBPU1QgL2FwaS9jdi9sYXlvdXQtcmVmaW5lXG4gICAqICAgLSBQT1NUIC9hcGkvbGF5b3V0LWluc3RydWN0aW9uXG4gICAqICAgcmVhZHM6XG4gICAqICAgLSBkb206I2luc3RydWN0aW9uLWlucHV0LnZhbHVlXG4gICAqICAgLSBzdGF0ZTpnZW5lcmF0aW9uX3N0YXRlLnByZXZpZXdBdmFpbGFibGVcbiAgICogICAtIHN0YXRlOmdlbmVyYXRpb25fc3RhdGUucGhhc2VcbiAgICogICAtIHdpbmRvdzpsYXlvdXRJbnN0cnVjdGlvbnNcbiAgICogICB3cml0ZXM6XG4gICAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9jdi9sYXlvdXQtcmVmaW5lLmluc3RydWN0aW9uXG4gICAqICAgLSBkb206I2xheW91dC1wcmV2aWV3XG4gICAqICAgLSB3aW5kb3c6bGF5b3V0SW5zdHJ1Y3Rpb25zXG4gICAqICAgLSBzdGF0ZTpnZW5lcmF0aW9uX3N0YXRlLnByZXZpZXdfb3V0cHV0c1xuICAgKiAgIG5vdGVzOiBTdWJtaXRzIGEgbmF0dXJhbC1sYW5ndWFnZSBsYXlvdXQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCB0aGUgc3RhZ2VkIHByZXZpZXcgd2hlbiBhdmFpbGFibGUsIHRoZW4gcmVmcmVzaGVzIHRoZSBwcmV2aWV3IGFuZCBsb2NhbCBpbnN0cnVjdGlvbiBoaXN0b3J5IGZyb20gdGhlIHJldHVybmVkIEhUTUwuXG4gICAqL1xuICBjb25zdCBjdXJyZW50SHRtbCA9IGdldEN2QXJ0aWZhY3RzKClbJyouaHRtbCddIHx8ICcnO1xuICBjb25zdCBwcmlvckluc3RydWN0aW9ucyA9IHdpbmRvdy5sYXlvdXRJbnN0cnVjdGlvbnMgfHwgW107XG5cbiAgLy8gU25hcHNob3Qgc3RhdGUgYmVmb3JlIGFwcGx5aW5nIHNvIFVuZG8gY2FuIHJlc3RvcmUgaXQuXG4gIF9sYXlvdXRVbmRvU3RhY2sucHVzaCh7XG4gICAgaHRtbDogY3VycmVudEh0bWwsXG4gICAgaW5zdHJ1Y3Rpb25zOiAod2luZG93LmxheW91dEluc3RydWN0aW9ucyB8fCBbXSkubWFwKGkgPT4gKHsgLi4uaSB9KSksXG4gIH0pO1xuICBpZiAoX2xheW91dFVuZG9TdGFjay5sZW5ndGggPiBfVU5ET19TVEFDS19NQVgpIHtcbiAgICBfbGF5b3V0VW5kb1N0YWNrLnNoaWZ0KCk7XG4gIH1cblxuICB0cnkge1xuICAgIHNob3dQcm9jZXNzaW5nKHRydWUpO1xuXG4gICAgLy8gUHJlZmVyIHRoZSBzZXNzaW9uLWJhY2tlZCBlbmRwb2ludDsgaXQgbWFuYWdlcyBIVE1MIHNlcnZlci1zaWRlLlxuICAgIGxldCByZXNwb25zZTtcbiAgICBjb25zdCBnZW5TdGF0ZSA9IHN0YXRlTWFuYWdlcj8uZ2V0R2VuZXJhdGlvblN0YXRlPy4oKSB8fCB7fTtcbiAgICBjb25zdCB1c2VTZXNzaW9uRW5kcG9pbnQgPSBnZW5TdGF0ZS5wcmV2aWV3QXZhaWxhYmxlIHx8IGdlblN0YXRlLnBoYXNlID09PSAnbGF5b3V0X3Jldmlldyc7XG5cbiAgICBpZiAodXNlU2Vzc2lvbkVuZHBvaW50KSB7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IGFwaUNhbGwoJ1BPU1QnLCAnL2FwaS9jdi9sYXlvdXQtcmVmaW5lJywge1xuICAgICAgICBpbnN0cnVjdGlvbjogaW5zdHJ1Y3Rpb25UZXh0LFxuICAgICAgICBjb250ZW50X3JldmlzaW9uOiBnZXRDdXJyZW50Q29udGVudFJldmlzaW9uKCksXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCBhcGlDYWxsKCdQT1NUJywgJy9hcGkvbGF5b3V0LWluc3RydWN0aW9uJywge1xuICAgICAgICBpbnN0cnVjdGlvbjogaW5zdHJ1Y3Rpb25UZXh0LFxuICAgICAgICBjdXJyZW50X2h0bWw6IGN1cnJlbnRIdG1sLFxuICAgICAgICBwcmlvcl9pbnN0cnVjdGlvbnM6IHByaW9ySW5zdHJ1Y3Rpb25zLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgaWYgKHJlc3BvbnNlLmVycm9yID09PSAnY2xhcmlmeScpIHtcbiAgICAgICAgc2hvd0NsYXJpZmljYXRpb25EaWFsb2cocmVzcG9uc2UucXVlc3Rpb24sIGluc3RydWN0aW9uVGV4dCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhcHBlbmRMYXlvdXRTYWZldHlBbGVydChyZXNwb25zZS5zYWZldHlfYWxlcnQpO1xuICAgICAgICBsZXQgZXJyb3JIdG1sID0gYFx1MjZBMFx1RkUwRiBFcnJvcjogJHtlc2NhcGVIdG1sKHJlc3BvbnNlLmVycm9yKX0gXHUyMDE0ICR7ZXNjYXBlSHRtbChyZXNwb25zZS5kZXRhaWxzIHx8ICcnKX1gO1xuICAgICAgICBpZiAocmVzcG9uc2UucmF3X3Jlc3BvbnNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBlcnJvckh0bWwgKz0gYDxicj48ZGV0YWlscyBzdHlsZT1cIm1hcmdpbi10b3A6NnB4XCI+PHN1bW1hcnkgc3R5bGU9XCJjdXJzb3I6cG9pbnRlcjtmb250LXNpemU6MC44NWVtO2NvbG9yOiM2NDc0OGJcIj5SYXcgTExNIHJlc3BvbnNlPC9zdW1tYXJ5PjxwcmUgc3R5bGU9XCJmb250LXNpemU6MC43NWVtO3doaXRlLXNwYWNlOnByZS13cmFwO3dvcmQtYnJlYWs6YnJlYWstYWxsO21heC1oZWlnaHQ6MjAwcHg7b3ZlcmZsb3cteTphdXRvO2JhY2tncm91bmQ6I2Y4ZmFmYztib3JkZXI6MXB4IHNvbGlkICNlMmU4ZjA7Ym9yZGVyLXJhZGl1czo0cHg7cGFkZGluZzo4cHg7bWFyZ2luLXRvcDo0cHhcIj4ke2VzY2FwZUh0bWwocmVzcG9uc2UucmF3X3Jlc3BvbnNlIHx8ICcoZW1wdHkpJyl9PC9wcmU+PC9kZXRhaWxzPmA7XG4gICAgICAgIH1cbiAgICAgICAgYXBwZW5kTWVzc2FnZUh0bWwoJ3N5c3RlbScsIGVycm9ySHRtbCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHByZXZpZXcgd2l0aCBuZXcgSFRNTFxuICAgIGNvbnN0IG5ld0h0bWwgPSByZXNwb25zZS5odG1sO1xuICAgIGRpc3BsYXlMYXlvdXRQcmV2aWV3KG5ld0h0bWwpO1xuXG4gICAgYXBwZW5kTGF5b3V0U2FmZXR5QWxlcnQocmVzcG9uc2Uuc2FmZXR5X2FsZXJ0KTtcblxuICAgIC8vIFVwZGF0ZSBzdGF0ZVxuICAgIHNldFByZXZpZXdIdG1sKG5ld0h0bWwpO1xuICAgIGRpc21pc3NlZFN0YWxlQ2FsbG91dFJldmlzaW9uID0gbnVsbDtcbiAgICBzdGF0ZU1hbmFnZXI/Lm1hcmtQcmV2aWV3R2VuZXJhdGVkPy4oe1xuICAgICAgcHJldmlld0F2YWlsYWJsZTogdHJ1ZSxcbiAgICAgIHByZXZpZXdPdXRwdXRzOiByZXNwb25zZS5wcmV2aWV3X291dHB1dHMgfHwgbnVsbCxcbiAgICAgIGxheW91dENvbmZpcm1lZDogZmFsc2UsXG4gICAgICBwYWdlQ291bnRFc3RpbWF0ZTogcmVzcG9uc2UucGFnZV9jb3VudF9lc3RpbWF0ZSA/PyBudWxsLFxuICAgICAgcGFnZUNvdW50RXhhY3Q6IHJlc3BvbnNlLnBhZ2VfY291bnRfZXhhY3QgPz8gbnVsbCxcbiAgICAgIHBhZ2VDb3VudENvbmZpZGVuY2U6IHJlc3BvbnNlLnBhZ2VfY291bnRfY29uZmlkZW5jZSA/PyBudWxsLFxuICAgICAgcGFnZUNvdW50U291cmNlOiByZXNwb25zZS5wYWdlX2NvdW50X3NvdXJjZSB8fCBudWxsLFxuICAgICAgcGFnZVdhcm5pbmc6IEJvb2xlYW4ocmVzcG9uc2UucGFnZV9sZW5ndGhfd2FybmluZyksXG4gICAgICBwcmV2aWV3R2VuZXJhdGVkQXQ6IHJlc3BvbnNlLnByZXZpZXdfZ2VuZXJhdGVkX2F0IHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHByZXZpZXdSZXF1ZXN0SWQ6IHJlc3BvbnNlLnByZXZpZXdfcmVxdWVzdF9pZCB8fCBudWxsLFxuICAgIH0pO1xuICAgIHJlbmRlclByZXZpZXdPdXRwdXRTdGF0dXMocmVzcG9uc2UucHJldmlld19vdXRwdXRzIHx8IG51bGwpO1xuXG4gICAgLy8gQWRkIHRvIGluc3RydWN0aW9uIGhpc3RvcnlcbiAgICBjb25zdCBpbnN0cnVjdGlvbiA9IHtcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0xvY2FsZVRpbWVTdHJpbmcoKSxcbiAgICAgIGluc3RydWN0aW9uX3RleHQ6IGluc3RydWN0aW9uVGV4dCxcbiAgICAgIGNoYW5nZV9zdW1tYXJ5OiByZXNwb25zZS5zdW1tYXJ5LFxuICAgICAgY29uZmlybWF0aW9uOiB0cnVlXG4gICAgfTtcbiAgICBhZGRUb0luc3RydWN0aW9uSGlzdG9yeShpbnN0cnVjdGlvbik7XG5cbiAgICAvLyBTaG93IGNvbmZpcm1hdGlvblxuICAgIHNob3dDb25maXJtYXRpb25NZXNzYWdlKGAke3Jlc3BvbnNlLnNhZmV0eV9hbGVydD8uZmxhZ2dlZCA/ICdcdTI2QTBcdUZFMEYgJyA6ICdcdTI3MDUgJ30ke3Jlc3BvbnNlLnN1bW1hcnl9YCk7XG5cbiAgICAvLyBDbGVhciBpbnB1dCBhbmQgcmVmcmVzaCB0aGUgc3RhZ2VkIGNvbnRyb2xzLlxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnN0cnVjdGlvbi1pbnB1dCcpLnZhbHVlID0gJyc7XG4gICAgcmVmcmVzaExheW91dFJldmlld1N0YXRlKCk7XG5cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCBgXHUyNzRDIENvdWxkIG5vdCBhcHBseSB0aGUgbGF5b3V0IGluc3RydWN0aW9uLiBUcnkgcmVwaHJhc2luZyBpdCwgb3IgY2xpY2sgXCJSZWdlbmVyYXRlIFByZXZpZXdcIiB0byByZXNldCBhbmQgdHJ5IGFnYWluLmApO1xuICB9IGZpbmFsbHkge1xuICAgIHNob3dQcm9jZXNzaW5nKGZhbHNlKTtcbiAgfVxufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBtYXJrUHJldmlld0dlbmVyYXRlZCBwYXlsb2FkIGZyb20gYSAvYXBpL2N2L2dlbmVyYXRlLXByZXZpZXcgcmVzcG9uc2UuXG4gKiBAcGFyYW0ge09iamVjdH0gZGF0YSAtIFJlc3BvbnNlIGZyb20gdGhlIGdlbmVyYXRlLXByZXZpZXcgZW5kcG9pbnQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBQYXlsb2FkIHN1aXRhYmxlIGZvciBzdGF0ZU1hbmFnZXIubWFya1ByZXZpZXdHZW5lcmF0ZWQoKS5cbiAqL1xuZnVuY3Rpb24gX2J1aWxkUHJldmlld1BheWxvYWQoZGF0YSkge1xuICByZXR1cm4ge1xuICAgIHByZXZpZXdBdmFpbGFibGU6ICAgIHRydWUsXG4gICAgcHJldmlld091dHB1dHM6ICAgICAgZGF0YS5wcmV2aWV3X291dHB1dHMgICAgICB8fCBudWxsLFxuICAgIHBhZ2VDb3VudEVzdGltYXRlOiAgIGRhdGEucGFnZV9jb3VudF9lc3RpbWF0ZSAgPz8gbnVsbCxcbiAgICBwYWdlQ291bnRFeGFjdDogICAgICBkYXRhLnBhZ2VfY291bnRfZXhhY3QgICAgICA/PyBudWxsLFxuICAgIHBhZ2VDb3VudENvbmZpZGVuY2U6IGRhdGEucGFnZV9jb3VudF9jb25maWRlbmNlID8/IG51bGwsXG4gICAgcGFnZUNvdW50U291cmNlOiAgICAgZGF0YS5wYWdlX2NvdW50X3NvdXJjZSAgICAgfHwgbnVsbCxcbiAgICBwYWdlV2FybmluZzogICAgICAgICBCb29sZWFuKGRhdGEucGFnZV9sZW5ndGhfd2FybmluZyksXG4gICAgcHJldmlld0dlbmVyYXRlZEF0OiAgZGF0YS5wcmV2aWV3X2dlbmVyYXRlZF9hdCAgfHwgbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIHByZXZpZXdSZXF1ZXN0SWQ6ICAgIGRhdGEucHJldmlld19yZXF1ZXN0X2lkICAgIHx8IG51bGwsXG4gIH07XG59XG5cbi8qKlxuICogRmV0Y2ggdGhlIENWIEhUTUwgcHJldmlldyB2aWEgdGhlIHN0YWdlZCBnZW5lcmF0aW9uIGNvbnRyYWN0LlxuICpcbiAqIFN0cmF0ZWd5IGRlcGVuZHMgb24gdGhlIGN1cnJlbnQgZ2VuZXJhdGlvbiBzdGF0ZTpcbiAqXG4gKiAtIHBoYXNlIGlzIG5vdCBjb25maXJtZWQvZmluYWxfY29tcGxldGU6XG4gKiAgIEFsd2F5cyBjYWxscyBQT1NUIC9hcGkvY3YvZ2VuZXJhdGUtcHJldmlldywgd2hpY2ggc3RvcmVzIHByZXZpZXdfaHRtbCBpblxuICogICBnZW5lcmF0aW9uX3N0YXRlIChyZXF1aXJlZCBmb3IgY29uZmlybS1sYXlvdXQpIGFuZCBjYWxscyBtYXJrUHJldmlld0dlbmVyYXRlZC5cbiAqICAgVGhpcyBib290c3RyYXBzIHRoZSBzdGFnZWQgc3RhdGUgZXZlbiBhZnRlciBsZWdhY3kgZ2VuZXJhdGVfY3YgYWN0aW9ucyB0aGF0XG4gKiAgIHdyaXRlIGZpbGVzIHRvIGRpc2sgd2l0aG91dCBwb3B1bGF0aW5nIGdlbmVyYXRpb25fc3RhdGUucHJldmlld19odG1sLlxuICogICBGYWxscyBiYWNrIHRvIEdFVCAvYXBpL2xheW91dC1odG1sIChwYXNzaXZlLCBubyBzdGF0ZSBjaGFuZ2UpIHdoZW5cbiAqICAgZ2VuZXJhdGUtcHJldmlldyBpcyB1bmF2YWlsYWJsZSAoZS5nLiBzZXNzaW9uIGhhcyBubyBqb2JfYW5hbHlzaXMgeWV0KS5cbiAqXG4gKiAtIHBoYXNlIGlzIGNvbmZpcm1lZC9maW5hbF9jb21wbGV0ZSAocGFzc2l2ZSByZXN0b3JlKTpcbiAqICAgUmVhZHMgSFRNTCBmcm9tIGRpc2sgdmlhIEdFVCAvYXBpL2xheW91dC1odG1sIHdpdGhvdXQgdG91Y2hpbmcgc2Vzc2lvbiBzdGF0ZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gX2ZldGNoQW5kRGlzcGxheUxheW91dFByZXZpZXcoKSB7XG4gIGNvbnN0IGdlblN0YXRlICAgID0gc3RhdGVNYW5hZ2VyPy5nZXRHZW5lcmF0aW9uU3RhdGU/LigpIHx8IHt9O1xuICBjb25zdCBpc0NvbmZpcm1lZCA9IGdlblN0YXRlLnBoYXNlID09PSBHRU5FUkFUSU9OX1BIQVNFUy5DT05GSVJNRURcbiAgICAgICAgICAgICAgICAgICB8fCBnZW5TdGF0ZS5waGFzZSA9PT0gR0VORVJBVElPTl9QSEFTRVMuRklOQUxfQ09NUExFVEU7XG5cbiAgc2hvd1ByZXZpZXdMb2FkaW5nKHRydWUsIGlzQ29uZmlybWVkID8gJ0xvYWRpbmcgc2F2ZWQgbGF5b3V0XHUyMDI2JyA6ICdHZW5lcmF0aW5nIHByZXZpZXdcdTIwMjYnKTtcbiAgdHJ5IHtcbiAgICAvLyBGcmVzaC1yZW5kZXIgcGF0aDogYWx3YXlzIHBvcHVsYXRlIGdlbmVyYXRpb25fc3RhdGUucHJldmlld19odG1sIG9uIHRoZSBiYWNrZW5kXG4gICAgLy8gc28gdGhhdCBjb25maXJtLWxheW91dCBzdWNjZWVkcy4gQ292ZXJzIGJvdGggdGhlIG5vcm1hbCBzdGFnZWQgcGF0aCBhbmQgdGhlXG4gICAgLy8gbGVnYWN5IGdlbmVyYXRlX2N2IHBhdGggdGhhdCBkb2VzIG5vdCBjYWxsIGdlbmVyYXRlLXByZXZpZXcgaXRzZWxmLlxuICAgIGlmICghaXNDb25maXJtZWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBhcGlDYWxsKCdQT1NUJywgJy9hcGkvY3YvZ2VuZXJhdGUtcHJldmlldycsIHt9KTtcbiAgICAgICAgaWYgKGRhdGEub2sgJiYgZGF0YS5odG1sKSB7XG4gICAgICAgICAgZGlzcGxheUxheW91dFByZXZpZXcoZGF0YS5odG1sKTtcbiAgICAgICAgICBzZXRQcmV2aWV3SHRtbChkYXRhLmh0bWwpO1xuICAgICAgICAgIGRpc21pc3NlZFN0YWxlQ2FsbG91dFJldmlzaW9uID0gbnVsbDtcbiAgICAgICAgICBzdGF0ZU1hbmFnZXI/Lm1hcmtQcmV2aWV3R2VuZXJhdGVkPy4oX2J1aWxkUHJldmlld1BheWxvYWQoZGF0YSkpO1xuICAgICAgICAgIHJlbmRlclByZXZpZXdPdXRwdXRTdGF0dXMoZGF0YS5wcmV2aWV3X291dHB1dHMgfHwgbnVsbCk7XG4gICAgICAgICAgcmVmcmVzaExheW91dFJldmlld1N0YXRlKCk7XG4gICAgICAgICAgKGRhdGEuY29udGVudF93YXJuaW5ncyB8fCBbXSkuZm9yRWFjaCh3ID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc2hvd1RvYXN0ID09PSAnZnVuY3Rpb24nKSBzaG93VG9hc3Qody5tZXNzYWdlLCAnd2FybmluZycsIDgwMDApO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoX2UpIHtcbiAgICAgICAgLy8gZmFsbCB0aHJvdWdoIHRvIGxlZ2FjeSBkaXNrIHJlYWRcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQYXNzaXZlIHJlc3RvcmUgcGF0aDogbG9hZCBzdG9yZWQgSFRNTCBmcm9tIGRpc2sgd2l0aG91dCB0b3VjaGluZyBnZW5lcmF0aW9uIHN0YXRlLlxuICAgIC8vIFVzZWQgZm9yIGNvbmZpcm1lZC9maW5hbF9jb21wbGV0ZSBsYXlvdXRzLCBvciBhcyBmYWxsYmFjayB3aGVuIGdlbmVyYXRlLXByZXZpZXdcbiAgICAvLyBpcyB1bmF2YWlsYWJsZSAoZS5nLiBzZXNzaW9uIGhhcyBubyBqb2JfYW5hbHlzaXMgeWV0KS5cbiAgICB0cnkge1xuICAgICAgc2hvd1ByZXZpZXdMb2FkaW5nKHRydWUsICdMb2FkaW5nIHN0b3JlZCBsYXlvdXRcdTIwMjYnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBhcGlDYWxsKCdHRVQnLCAnL2FwaS9sYXlvdXQtaHRtbCcpO1xuICAgICAgaWYgKGRhdGEub2sgJiYgZGF0YS5odG1sKSB7XG4gICAgICAgIGRpc3BsYXlMYXlvdXRQcmV2aWV3KGRhdGEuaHRtbCk7XG4gICAgICAgIHNldFByZXZpZXdIdG1sKGRhdGEuaHRtbCk7XG4gICAgICAgIHJlZnJlc2hMYXlvdXRSZXZpZXdTdGF0ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsb2cud2FybignTGF5b3V0IHByZXZpZXcgbm90IGF2YWlsYWJsZTonLCBkYXRhLmVycm9yIHx8ICdubyBIVE1MIHJldHVybmVkJyk7XG4gICAgfSBjYXRjaCAoX2UpIHtcbiAgICAgIC8vIG5vIHByZXZpZXcgYXZhaWxhYmxlXG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIHNob3dQcmV2aWV3TG9hZGluZyhmYWxzZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBEaXNwbGF5IEhUTUwgcHJldmlldyBpbiBpZnJhbWUuXG4gKi9cbmZ1bmN0aW9uIGRpc3BsYXlMYXlvdXRQcmV2aWV3KGh0bWwpIHtcbiAgY29uc3QgcHJldmlldyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYXlvdXQtcHJldmlldycpO1xuICBpZiAoIXByZXZpZXcpIHJldHVybjtcblxuICBzaG93UHJldmlld0xvYWRpbmcoZmFsc2UpO1xuICBwcmV2aWV3Lm9ubG9hZCA9ICgpID0+IGZpdExheW91dFByZXZpZXdUb1BhbmUocHJldmlldyk7XG4gIHJlbmRlckh0bWxJbnRvSWZyYW1lKHByZXZpZXcsIGh0bWwpO1xuXG4gIGNvbnN0IGRvYyA9IHByZXZpZXcuY29udGVudERvY3VtZW50IHx8IHByZXZpZXcuY29udGVudFdpbmRvdz8uZG9jdW1lbnQ7XG4gIGlmIChkb2M/LnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScpIHtcbiAgICBmaXRMYXlvdXRQcmV2aWV3VG9QYW5lKHByZXZpZXcpO1xuICB9XG59XG5cbi8qKlxuICogU2NhbGUgdGhlIHByZXZpZXcgc28gYW4gZW50aXJlIENWIHBhZ2Ugd2lkdGggZml0cyB3aXRoaW4gdGhlIHByZXZpZXcgcGFuZS5cbiAqL1xuZnVuY3Rpb24gZml0TGF5b3V0UHJldmlld1RvUGFuZShwcmV2aWV3KSB7XG4gIGNvbnN0IGRvYyA9IHByZXZpZXc/LmNvbnRlbnREb2N1bWVudCB8fCBwcmV2aWV3Py5jb250ZW50V2luZG93Py5kb2N1bWVudDtcbiAgY29uc3QgY29udGFpbmVyID0gcHJldmlldz8uY2xvc2VzdCgnLnByZXZpZXctaWZyYW1lLWNvbnRhaW5lcicpO1xuICBpZiAoIWRvYyB8fCAhY29udGFpbmVyKSByZXR1cm47XG5cbiAgY29uc3QgcGFnZUNvbnRhaW5lciA9IGRvYy5xdWVyeVNlbGVjdG9yKCcucGFnZS1jb250YWluZXInKSB8fCBkb2MuYm9keTtcbiAgaWYgKCFwYWdlQ29udGFpbmVyKSByZXR1cm47XG5cbiAgY29uc3QgY29udGFpbmVyV2lkdGggPSBNYXRoLm1heChjb250YWluZXIuY2xpZW50V2lkdGggLSAyNCwgMSk7XG4gIGNvbnN0IGNvbnRlbnRXaWR0aCA9IE1hdGgubWF4KFxuICAgIE1hdGguY2VpbChwYWdlQ29udGFpbmVyLnNjcm9sbFdpZHRoIHx8IDApLFxuICAgIE1hdGguY2VpbChwYWdlQ29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoIHx8IDApLFxuICAgIDFcbiAgKTtcbiAgY29uc3Qgc2NhbGUgPSBNYXRoLm1pbigxLCBjb250YWluZXJXaWR0aCAvIGNvbnRlbnRXaWR0aCk7XG5cbiAgZG9jLmRvY3VtZW50RWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kID0gJyNmOGZhZmMnO1xuICBkb2MuYm9keS5zdHlsZS5tYXJnaW4gPSAnMCc7XG4gIGRvYy5ib2R5LnN0eWxlLnBhZGRpbmcgPSAnMCc7XG4gIGRvYy5ib2R5LnN0eWxlLmJhY2tncm91bmQgPSAnI2Y4ZmFmYyc7XG4gIGRvYy5ib2R5LnN0eWxlLm92ZXJmbG93WCA9ICdhdXRvJztcblxuICBwYWdlQ29udGFpbmVyLnN0eWxlLnpvb20gPSBgJHtzY2FsZX1gO1xuICBwYWdlQ29udGFpbmVyLnN0eWxlLnRyYW5zZm9ybSA9ICcnO1xuICBwYWdlQ29udGFpbmVyLnN0eWxlLnRyYW5zZm9ybU9yaWdpbiA9ICcnO1xuICBwYWdlQ29udGFpbmVyLnN0eWxlLm1hcmdpbiA9ICcxMnB4JztcbiAgcHJldmlldy5zdHlsZS5taW5XaWR0aCA9ICcnO1xufVxuXG4vKipcbiAqIEFkZCBpbnN0cnVjdGlvbiB0byBoaXN0b3J5IHBhbmVsLlxuICovXG5mdW5jdGlvbiBhZGRUb0luc3RydWN0aW9uSGlzdG9yeShpbnN0cnVjdGlvbikge1xuICAvLyBJbml0aWFsaXplIGdsb2JhbCBpbnN0cnVjdGlvbiBsaXN0IGlmIG5lZWRlZFxuICBpZiAoIXdpbmRvdy5sYXlvdXRJbnN0cnVjdGlvbnMpIHtcbiAgICB3aW5kb3cubGF5b3V0SW5zdHJ1Y3Rpb25zID0gW107XG4gIH1cblxuICB3aW5kb3cubGF5b3V0SW5zdHJ1Y3Rpb25zLnB1c2gobm9ybWFsaXplTGF5b3V0SW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb24pKTtcbiAgcmVuZGVySW5zdHJ1Y3Rpb25IaXN0b3J5KCk7XG59XG5cbi8qKlxuICogUmVuZGVyIGluc3RydWN0aW9uIGhpc3RvcnkgZnJvbSBjdXJyZW50IHN0YXRlIHdpdGhvdXQgbXV0YXRpbmcgaXQuXG4gKi9cbmZ1bmN0aW9uIHJlbmRlckluc3RydWN0aW9uSGlzdG9yeSgpIHtcbiAgY29uc3QgaGlzdG9yeUxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5zdHJ1Y3Rpb24taGlzdG9yeScpO1xuICBpZiAoIWhpc3RvcnlMaXN0KSByZXR1cm47XG5cbiAgY29uc3QgaW5zdHJ1Y3Rpb25zID0gd2luZG93LmxheW91dEluc3RydWN0aW9ucyB8fCBbXTtcbiAgaGlzdG9yeUxpc3QuaW5uZXJIVE1MID0gJyc7XG4gIGNvbnN0IGxhc3RJZHggPSBpbnN0cnVjdGlvbnMubGVuZ3RoIC0gMTtcbiAgaW5zdHJ1Y3Rpb25zLmZvckVhY2goKGluc3RydWN0aW9uLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IGVudHJ5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZW50cnkuY2xhc3NOYW1lID0gJ2luc3RydWN0aW9uLWhpc3RvcnktZW50cnknO1xuICAgIGNvbnN0IGlzTGFzdCA9IGluZGV4ID09PSBsYXN0SWR4O1xuICAgIGNvbnN0IHVuZG9IdG1sID0gaXNMYXN0XG4gICAgICA/IGA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0bi1zbVwiIG9uY2xpY2s9XCJ1bmRvSW5zdHJ1Y3Rpb24oJHtpbmRleH0pXCI+XHUyMUE5IFVuZG88L2J1dHRvbj5gXG4gICAgICA6IGA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0bi1zbVwiIGRpc2FibGVkIHRpdGxlPVwiVW5kbyBpcyBzZXF1ZW50aWFsIFx1MjAxNCB1bmRvIHRoZSBtb3N0IHJlY2VudCBpbnN0cnVjdGlvbiBmaXJzdFwiXG4gICAgICAgICAgIHN0eWxlPVwib3BhY2l0eTowLjM7Y3Vyc29yOm5vdC1hbGxvd2VkO1wiPlx1MjFBOSBVbmRvPC9idXR0b24+YDtcbiAgICBlbnRyeS5pbm5lckhUTUwgPSBgXG4gICAgICA8ZGl2IGNsYXNzPVwiaW5zdHJ1Y3Rpb24tdGltZVwiPiR7aW5zdHJ1Y3Rpb24udGltZXN0YW1wIHx8ICcnfTwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImluc3RydWN0aW9uLXRleHRcIj4ke2VzY2FwZUh0bWwoaW5zdHJ1Y3Rpb24uaW5zdHJ1Y3Rpb25fdGV4dCB8fCAnJyl9PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiaW5zdHJ1Y3Rpb24tc3VtbWFyeVwiPjxlbT4ke2VzY2FwZUh0bWwoaW5zdHJ1Y3Rpb24uY2hhbmdlX3N1bW1hcnkgfHwgJycpfTwvZW0+PC9kaXY+XG4gICAgICAke3VuZG9IdG1sfVxuICAgIGA7XG4gICAgaGlzdG9yeUxpc3QuYXBwZW5kQ2hpbGQoZW50cnkpO1xuICB9KTtcblxuICAvLyBVcGRhdGUgY291bnRcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2luc3RydWN0aW9uLWNvdW50JykudGV4dENvbnRlbnQgPSAod2luZG93LmxheW91dEluc3RydWN0aW9ucyB8fCBbXSkubGVuZ3RoO1xufVxuXG4vKipcbiAqIFJlc3RvcmUgaW5zdHJ1Y3Rpb24gaGlzdG9yeSBmcm9tIHNlc3Npb24gc3RhdGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxvYWRMYXlvdXRJbnN0cnVjdGlvbkhpc3RvcnkoKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBhcGlDYWxsKCdHRVQnLCAnL2FwaS9sYXlvdXQtaGlzdG9yeScpO1xuICAgIGlmICghcmVzcG9uc2U/Lmluc3RydWN0aW9ucyB8fCAhQXJyYXkuaXNBcnJheShyZXNwb25zZS5pbnN0cnVjdGlvbnMpKSB7XG4gICAgICByZXR1cm4gd2luZG93LmxheW91dEluc3RydWN0aW9ucyB8fCBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzcG9uc2UuaW5zdHJ1Y3Rpb25zLm1hcCgoaW5zdHJ1Y3Rpb24pID0+IG5vcm1hbGl6ZUxheW91dEluc3RydWN0aW9uKGluc3RydWN0aW9uKSk7XG4gIH0gY2F0Y2ggKF9lcnJvcikge1xuICAgIHJldHVybiB3aW5kb3cubGF5b3V0SW5zdHJ1Y3Rpb25zIHx8IFtdO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc3RvcmVJbnN0cnVjdGlvbkhpc3RvcnkoKSB7XG4gIHdpbmRvdy5sYXlvdXRJbnN0cnVjdGlvbnMgPSBhd2FpdCBsb2FkTGF5b3V0SW5zdHJ1Y3Rpb25IaXN0b3J5KCk7XG4gIHJlbmRlckluc3RydWN0aW9uSGlzdG9yeSgpO1xuICByZWZyZXNoTGF5b3V0UmV2aWV3U3RhdGUoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaGFuZGxlUmVnZW5lcmF0ZVByZXZpZXdBY3Rpb24oKSB7XG4gIHRyeSB7XG4gICAgc2hvd1Byb2Nlc3NpbmcodHJ1ZSk7XG4gICAgYXdhaXQgX2ZldGNoQW5kRGlzcGxheUxheW91dFByZXZpZXcoKTtcbiAgICBzaG93Q29uZmlybWF0aW9uTWVzc2FnZSgnXHUyNzA1IFByZXZpZXcgcmVnZW5lcmF0ZWQgZnJvbSB0aGUgbGF0ZXN0IGNvbnRlbnQuJyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgYFx1Mjc0QyBDb3VsZCBub3QgcmVnZW5lcmF0ZSB0aGUgcHJldmlldy4gQ2hlY2sgdGhhdCB5b3VyIHNlc3Npb24gaXMgYWN0aXZlIGFuZCB0cnkgYWdhaW4uIElmIHRoZSBwcm9ibGVtIHBlcnNpc3RzLCByZWxvYWQgdGhlIHBhZ2UuYCk7XG4gICAgc2hvd1ByZXZpZXdMb2FkaW5nKGZhbHNlKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBzaG93UHJvY2Vzc2luZyhmYWxzZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBTaG93IHByb2Nlc3Npbmcgc3Bpbm5lciAocmlnaHQtcGFuZSBpbmRpY2F0b3IgZm9yIGxheW91dC1pbnN0cnVjdGlvbiBhcHBseSkuXG4gKi9cbmZ1bmN0aW9uIHNob3dQcm9jZXNzaW5nKHNob3cpIHtcbiAgY29uc3QgaW5kaWNhdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Byb2Nlc3NpbmctaW5kaWNhdG9yJyk7XG4gIGlmIChpbmRpY2F0b3IpIHtcbiAgICBpbmRpY2F0b3Iuc3R5bGUuZGlzcGxheSA9IHNob3cgPyAnYmxvY2snIDogJ25vbmUnO1xuICB9XG59XG5cbi8qKlxuICogU2hvdyBvciBoaWRlIHRoZSBwcmV2aWV3LWFyZWEgbG9hZGluZyBvdmVybGF5LlxuICogQHBhcmFtIHtib29sZWFufSBzaG93XG4gKiBAcGFyYW0ge3N0cmluZ30gW2xvZ1RleHRdIE9wdGlvbmFsIHN0YXR1cyBsaW5lIHNob3duIGJlbG93IHRoZSBzcGlubmVyLlxuICovXG5mdW5jdGlvbiBzaG93UHJldmlld0xvYWRpbmcoc2hvdywgbG9nVGV4dCA9ICcnKSB7XG4gIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJldmlldy1sb2FkaW5nLW92ZXJsYXknKTtcbiAgaWYgKCFvdmVybGF5KSByZXR1cm47XG4gIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9IHNob3cgPyAnZmxleCcgOiAnbm9uZSc7XG4gIGNvbnN0IGxvZ0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ByZXZpZXctbG9hZGluZy1sb2cnKTtcbiAgaWYgKGxvZ0VsKSBsb2dFbC50ZXh0Q29udGVudCA9IGxvZ1RleHQ7XG59XG5cbi8qKlxuICogU2hvdyBjb25maXJtYXRpb24gbWVzc2FnZS5cbiAqL1xuZnVuY3Rpb24gc2hvd0NvbmZpcm1hdGlvbk1lc3NhZ2UobWVzc2FnZSkge1xuICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbmZpcm1hdGlvbi1tZXNzYWdlJyk7XG4gIGlmICghZWxlbWVudCkgcmV0dXJuO1xuXG4gIGVsZW1lbnQudGV4dENvbnRlbnQgPSBtZXNzYWdlO1xuICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuXG4gIC8vIEF1dG8taGlkZSBhZnRlciAzIHNlY29uZHNcbiAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICB9LCAzMDAwKTtcbn1cblxuLyoqXG4gKiBTaG93IGlubGluZSBjbGFyaWZpY2F0aW9uIHBhbmVsIHdoZW4gTExNIG5lZWRzIG1vcmUgaW5mby5cbiAqIFJlcGxhY2VzIHdpbmRvdy5wcm9tcHQoKSB3aXRoIGFuIGFjY2Vzc2libGUgaW5saW5lIGZvcm0uXG4gKi9cbmZ1bmN0aW9uIHNob3dDbGFyaWZpY2F0aW9uRGlhbG9nKHF1ZXN0aW9uLCBvcmlnaW5hbEluc3RydWN0aW9uKSB7XG4gIGNvbnN0IGlucHV0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5zdHJ1Y3Rpb24taW5wdXQnKTtcbiAgY29uc3QgY29udGFpbmVyID0gaW5wdXRFbCA/IGlucHV0RWwuY2xvc2VzdCgnZGl2JykgfHwgaW5wdXRFbC5wYXJlbnROb2RlIDogbnVsbDtcbiAgaWYgKCFjb250YWluZXIpIHJldHVybjtcblxuICBjb25zdCBleGlzdGluZ1BhbmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xheW91dC1jbGFyaWZpY2F0aW9uLXBhbmVsJyk7XG4gIGlmIChleGlzdGluZ1BhbmVsKSBleGlzdGluZ1BhbmVsLnJlbW92ZSgpO1xuXG4gIGNvbnN0IHBhbmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHBhbmVsLmlkID0gJ2xheW91dC1jbGFyaWZpY2F0aW9uLXBhbmVsJztcbiAgcGFuZWwuc2V0QXR0cmlidXRlKCdyb2xlJywgJ2FsZXJ0Jyk7XG4gIHBhbmVsLnN0eWxlLmNzc1RleHQgPSAnYmFja2dyb3VuZDojZmVmOWMzO2JvcmRlcjoxcHggc29saWQgI2ZkZTA0Nztib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjE0cHg7bWFyZ2luLXRvcDoxMHB4Oyc7XG4gIHBhbmVsLmlubmVySFRNTCA9IGBcbiAgICA8cCBzdHlsZT1cIm1hcmdpbjowIDAgOHB4O2ZvbnQtc2l6ZTowLjllbTtjb2xvcjojOTI0MDBlO2ZvbnQtd2VpZ2h0OjYwMDtcIj5cbiAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlx1Mjc1Mzwvc3Bhbj4gQ2xhcmlmaWNhdGlvbiBuZWVkZWRcbiAgICA8L3A+XG4gICAgPHAgc3R5bGU9XCJtYXJnaW46MCAwIDEwcHg7Zm9udC1zaXplOjAuODhlbTtjb2xvcjojNzgzNTBmO1wiPiR7ZXNjYXBlSHRtbChxdWVzdGlvbil9PC9wPlxuICAgIDxsYWJlbCBmb3I9XCJsYXlvdXQtY2xhcmlmaWNhdGlvbi1pbnB1dFwiIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtmb250LXdlaWdodDo2MDA7Y29sb3I6IzM3NDE1MTtkaXNwbGF5OmJsb2NrO21hcmdpbi1ib3R0b206NHB4O1wiPlxuICAgICAgWW91ciBjbGFyaWZpY2F0aW9uOlxuICAgIDwvbGFiZWw+XG4gICAgPHRleHRhcmVhIGlkPVwibGF5b3V0LWNsYXJpZmljYXRpb24taW5wdXRcIiByb3dzPVwiMlwiXG4gICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Ym94LXNpemluZzpib3JkZXItYm94O3BhZGRpbmc6OHB4O2JvcmRlcjoxcHggc29saWQgI2ZkZTA0Nztib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6MC44OGVtO3Jlc2l6ZTp2ZXJ0aWNhbDtcIlxuICAgICAgYXJpYS1sYWJlbD1cIkNsYXJpZmljYXRpb24gZm9yIGxheW91dCBpbnN0cnVjdGlvblwiPiR7ZXNjYXBlSHRtbChvcmlnaW5hbEluc3RydWN0aW9uKX08L3RleHRhcmVhPlxuICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjhweDttYXJnaW4tdG9wOjhweDtcIj5cbiAgICAgIDxidXR0b24gaWQ9XCJsYXlvdXQtY2xhcmlmaWNhdGlvbi1zdWJtaXRcIlxuICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6I2Q5NzcwNjtjb2xvcjojZmZmO2JvcmRlcjpub25lO2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6NnB4IDE0cHg7Zm9udC1zaXplOjAuODVlbTtjdXJzb3I6cG9pbnRlcjtmb250LXdlaWdodDo2MDA7XCI+XG4gICAgICAgIFN1Ym1pdCBjbGFyaWZpY2F0aW9uXG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gaWQ9XCJsYXlvdXQtY2xhcmlmaWNhdGlvbi1jYW5jZWxcIlxuICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6bm9uZTtib3JkZXI6MXB4IHNvbGlkICNkOTc3MDY7Y29sb3I6IzkyNDAwZTtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjZweCAxNHB4O2ZvbnQtc2l6ZTowLjg1ZW07Y3Vyc29yOnBvaW50ZXI7XCI+XG4gICAgICAgIENhbmNlbFxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+YDtcblxuICBjb250YWluZXIuYXBwZW5kQ2hpbGQocGFuZWwpO1xuXG4gIGNvbnN0IGNsYXJJbnB1dCAgPSBwYW5lbC5xdWVyeVNlbGVjdG9yKCcjbGF5b3V0LWNsYXJpZmljYXRpb24taW5wdXQnKTtcbiAgY29uc3Qgc3VibWl0QnRuICA9IHBhbmVsLnF1ZXJ5U2VsZWN0b3IoJyNsYXlvdXQtY2xhcmlmaWNhdGlvbi1zdWJtaXQnKTtcbiAgY29uc3QgY2FuY2VsQnRuICA9IHBhbmVsLnF1ZXJ5U2VsZWN0b3IoJyNsYXlvdXQtY2xhcmlmaWNhdGlvbi1jYW5jZWwnKTtcblxuICBjbGFySW5wdXQuZm9jdXMoKTtcbiAgY2xhcklucHV0LnNldFNlbGVjdGlvblJhbmdlKGNsYXJJbnB1dC52YWx1ZS5sZW5ndGgsIGNsYXJJbnB1dC52YWx1ZS5sZW5ndGgpO1xuXG4gIHN1Ym1pdEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBjb25zdCBjbGFyaWZpZWQgPSBjbGFySW5wdXQudmFsdWUudHJpbSgpO1xuICAgIHBhbmVsLnJlbW92ZSgpO1xuICAgIGlmIChjbGFyaWZpZWQgJiYgY2xhcmlmaWVkICE9PSBvcmlnaW5hbEluc3RydWN0aW9uKSB7XG4gICAgICBzdWJtaXRMYXlvdXRJbnN0cnVjdGlvbihjbGFyaWZpZWQpO1xuICAgIH1cbiAgfSk7XG4gIGNhbmNlbEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHBhbmVsLnJlbW92ZSgpKTtcbiAgY2xhcklucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBlID0+IHtcbiAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicgJiYgIWUuc2hpZnRLZXkpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyBzdWJtaXRCdG4uY2xpY2soKTsgfVxuICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIGNhbmNlbEJ0bi5jbGljaygpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBVbmRvIHRoZSBsYXN0IGxheW91dCBpbnN0cnVjdGlvbiBieSByZXN0b3JpbmcgdGhlIHByZXZpb3VzIHNuYXBzaG90LlxuICogVGhlIGluZGV4IHBhcmFtZXRlciBpcyBhY2NlcHRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBidXQgaXMgaWdub3JlZCBcdTIwMTRcbiAqIHRoZSB1bmRvIHN0YWNrIGFsd2F5cyByZXN0b3JlcyB0aGUgbW9zdCByZWNlbnQgcHJlLWluc3RydWN0aW9uIHN0YXRlLlxuICovXG5mdW5jdGlvbiB1bmRvSW5zdHJ1Y3Rpb24oX2luZGV4KSB7XG4gIGlmIChfbGF5b3V0VW5kb1N0YWNrLmxlbmd0aCA9PT0gMCkge1xuICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsICdcdTIxMzlcdUZFMEYgTm90aGluZyB0byB1bmRvLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHNuYXBzaG90ID0gX2xheW91dFVuZG9TdGFjay5wb3AoKTtcbiAgd2luZG93LmxheW91dEluc3RydWN0aW9ucyA9IHNuYXBzaG90Lmluc3RydWN0aW9ucztcblxuICBkaXNwbGF5TGF5b3V0UHJldmlldyhzbmFwc2hvdC5odG1sKTtcbiAgc2V0UHJldmlld0h0bWwoc25hcHNob3QuaHRtbCk7XG4gIHJlbmRlckluc3RydWN0aW9uSGlzdG9yeSgpO1xuICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnXHUyMUE5XHVGRTBGIExhc3QgbGF5b3V0IGluc3RydWN0aW9uIHVuZG9uZS4nKTtcbn1cblxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsICgpID0+IHtcbiAgY29uc3QgcHJldmlldyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYXlvdXQtcHJldmlldycpO1xuICBpZiAocHJldmlldykge1xuICAgIGZpdExheW91dFByZXZpZXdUb1BhbmUocHJldmlldyk7XG4gIH1cbn0pO1xuXG5hc3luYyBmdW5jdGlvbiBjb25maXJtTGF5b3V0UmV2aWV3KCkge1xuICB0cnkge1xuICAgIHNob3dQcm9jZXNzaW5nKHRydWUpO1xuXG4gICAgY29uc3QgZnJlc2huZXNzID0gc3RhdGVNYW5hZ2VyLmdldExheW91dEZyZXNobmVzcygpO1xuICAgIGlmIChmcmVzaG5lc3MuaXNTdGFsZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQcmV2aWV3IGlzIG91dGRhdGVkLiBSZWdlbmVyYXRlIHRoZSBwcmV2aWV3IGJlZm9yZSBjb25maXJtaW5nIGxheW91dC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb25maXJtUmVzID0gYXdhaXQgYXBpQ2FsbCgnUE9TVCcsICcvYXBpL2N2L2NvbmZpcm0tbGF5b3V0JywgeyBjb250ZW50X3JldmlzaW9uOiBnZXRDdXJyZW50Q29udGVudFJldmlzaW9uKCkgfSk7XG4gICAgaWYgKCFjb25maXJtUmVzPy5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGNvbmZpcm1SZXM/LmVycm9yIHx8ICdGYWlsZWQgdG8gY29uZmlybSBsYXlvdXQuJyk7XG4gICAgfVxuXG4gICAgc3RhdGVNYW5hZ2VyLm1hcmtMYXlvdXRDb25maXJtZWQoe1xuICAgICAgY29uZmlybWVkQXQ6IGNvbmZpcm1SZXMuY29uZmlybWVkX2F0IHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICB9KTtcbiAgICBzaG93Q29uZmlybWF0aW9uTWVzc2FnZSgnXHUyNzA1IExheW91dCBjb25maXJtZWQuIEdlbmVyYXRlIGZpbmFsIGZpbGVzIHdoZW4geW91IGFyZSByZWFkeS4nKTtcbiAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCAnXHUyNzA1IExheW91dCBjb25maXJtZWQuIFJldmlldyB0aGUgcHJldmlldyBpZiBuZWVkZWQsIHRoZW4gZ2VuZXJhdGUgdGhlIGZpbmFsIGZpbGVzLicpO1xuICAgIHJlZnJlc2hMYXlvdXRSZXZpZXdTdGF0ZSgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsIGBcdTI3NEMgQ291bGQgbm90IGNvbmZpcm0gdGhlIGxheW91dC4gVHJ5IGNsaWNraW5nIENvbmZpcm0gYWdhaW4uIElmIHRoZSBwcm9ibGVtIHBlcnNpc3RzLCByZWxvYWQgdGhlIHBhZ2UuYCk7XG4gIH0gZmluYWxseSB7XG4gICAgc2hvd1Byb2Nlc3NpbmcoZmFsc2UpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRmluYWxPdXRwdXRzKCkge1xuICAvKiBkdWNrZmxvdzpcbiAgICogICBpZDogbGF5b3V0X3VpX2dlbmVyYXRlX2ZpbmFsX2xpdmVcbiAgICogICBraW5kOiB1aVxuICAgKiAgIHRpbWVzdGFtcDogJzIwMjYtMDMtMjZUMDA6MjQ6MDBaJ1xuICAgKiAgIHN0YXR1czogbGl2ZVxuICAgKiAgIGhhbmRsZXM6XG4gICAqICAgLSB1aTpsYXlvdXQuZ2VuZXJhdGUtZmluYWxcbiAgICogICBjYWxsczpcbiAgICogICAtIFBPU1QgL2FwaS9jdi9nZW5lcmF0ZS1maW5hbFxuICAgKiAgIC0gUE9TVCAvYXBpL2xheW91dC1jb21wbGV0ZVxuICAgKiAgIHJlYWRzOlxuICAgKiAgIC0gc3RhdGU6Z2VuZXJhdGlvbl9zdGF0ZS5sYXlvdXRDb25maXJtZWRcbiAgICogICAtIHN0YXRlOmdlbmVyYXRpb25fc3RhdGUucGhhc2VcbiAgICogICAtIHN0YXRlOmxheW91dF9mcmVzaG5lc3NcbiAgICogICB3cml0ZXM6XG4gICAqICAgLSB0YWI6Y3ZBcnRpZmFjdHNcbiAgICogICAtIHN0YXRlOmdlbmVyYXRpb25fc3RhdGUuZmluYWxfZ2VuZXJhdGVkX2F0XG4gICAqICAgLSB1aTp3b3JrZmxvdy5yZWZpbmVtZW50XG4gICAqICAgbm90ZXM6IEdlbmVyYXRlcyB0aGUgZmluYWwgaHVtYW4tcmVhZGFibGUgb3V0cHV0cyBmcm9tIHRoZSBjb25maXJtZWQgcHJldmlldyBhbmQgYWR2YW5jZXMgdGhlIFVJIGludG8gZmlsZSByZXZpZXcvZmluYWxpc2Ugd2l0aCB0aGUgbmV3IGFydGlmYWN0IHNldC5cbiAgICovXG4gIHRyeSB7XG4gICAgc2hvd1Byb2Nlc3NpbmcodHJ1ZSk7XG5cbiAgICBjb25zdCBmcmVzaG5lc3MgPSBzdGF0ZU1hbmFnZXIuZ2V0TGF5b3V0RnJlc2huZXNzKCk7XG4gICAgY29uc3QgZ2VuZXJhdGlvblN0YXRlID0gc3RhdGVNYW5hZ2VyLmdldEdlbmVyYXRpb25TdGF0ZSgpO1xuICAgIGlmIChmcmVzaG5lc3MuaXNTdGFsZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQcmV2aWV3IGlzIG91dGRhdGVkLiBSZWdlbmVyYXRlIHRoZSBwcmV2aWV3IGJlZm9yZSBnZW5lcmF0aW5nIGZpbmFsIGZpbGVzLicpO1xuICAgIH1cbiAgICBpZiAoIWdlbmVyYXRpb25TdGF0ZS5sYXlvdXRDb25maXJtZWQgJiYgZ2VuZXJhdGlvblN0YXRlLnBoYXNlICE9PSAnY29uZmlybWVkJykge1xuICAgICAgY29uc3QgaGFzSW5zdHJ1Y3Rpb25zID0gKHdpbmRvdy5sYXlvdXRJbnN0cnVjdGlvbnMgfHwgW10pLmxlbmd0aCA+IDA7XG4gICAgICBpZiAoaGFzSW5zdHJ1Y3Rpb25zKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ29uZmlybSBsYXlvdXQgYmVmb3JlIGdlbmVyYXRpbmcgZmluYWwgZmlsZXMuJyk7XG4gICAgICB9XG4gICAgICAvLyBObyBpbnN0cnVjdGlvbnMgYWRkZWQgXHUyMDE0IGF1dG8tY29uZmlybSBzbyB1c2VycyBhcmVuJ3QgYmxvY2tlZCBieSBhIHJlZHVuZGFudCBjbGljay5cbiAgICAgIGNvbnN0IGNvbmZpcm1SZXMgPSBhd2FpdCBhcGlDYWxsKCdQT1NUJywgJy9hcGkvY3YvY29uZmlybS1sYXlvdXQnLCB7IGNvbnRlbnRfcmV2aXNpb246IGdldEN1cnJlbnRDb250ZW50UmV2aXNpb24oKSB9KTtcbiAgICAgIGlmICghY29uZmlybVJlcz8ub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGNvbmZpcm1SZXM/LmVycm9yIHx8ICdGYWlsZWQgdG8gYXV0by1jb25maXJtIGxheW91dC4nKTtcbiAgICAgIH1cbiAgICAgIHN0YXRlTWFuYWdlci5tYXJrTGF5b3V0Q29uZmlybWVkKHsgY29uZmlybWVkQXQ6IGNvbmZpcm1SZXMuY29uZmlybWVkX2F0IHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBmaW5hbFJlcyA9IGF3YWl0IGFwaUNhbGwoJ1BPU1QnLCAnL2FwaS9jdi9nZW5lcmF0ZS1maW5hbCcsIHt9KTtcbiAgICBpZiAoIWZpbmFsUmVzPy5vayB8fCAhZmluYWxSZXMub3V0cHV0cykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGZpbmFsUmVzPy5lcnJvciB8fCAnRmFpbGVkIHRvIGdlbmVyYXRlIGZpbmFsIENWIG91dHB1dC4nKTtcbiAgICB9XG5cbiAgICB1cGRhdGVDdkFydGlmYWN0cyhmaW5hbFJlcy5vdXRwdXRzKTtcbiAgICBzdGF0ZU1hbmFnZXIubWFya0ZpbmFsR2VuZXJhdGVkKGZpbmFsUmVzLmdlbmVyYXRlZF9hdCB8fCBudWxsLCB7XG4gICAgICBwYWdlQ291bnRFc3RpbWF0ZTogZmluYWxSZXMucGFnZV9jb3VudF9lc3RpbWF0ZSA/PyBudWxsLFxuICAgICAgcGFnZUNvdW50RXhhY3Q6IGZpbmFsUmVzLnBhZ2VfY291bnRfZXhhY3QgPz8gbnVsbCxcbiAgICB9KTtcblxuICAgIHNjaGVkdWxlQXRzUmVmcmVzaCgncG9zdF9nZW5lcmF0aW9uJyk7XG5cbiAgICBzdGF0ZU1hbmFnZXIuc2V0UGhhc2UoJ2ZpbmFsX2dlbmVyYXRpb24nKTtcbiAgICBzd2l0Y2hUYWIoJ2ZpbmFsX2dlbmVyYXRlJyk7XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ1x1MjcwNSBGaW5hbCBmaWxlcyBnZW5lcmF0ZWQgZnJvbSB0aGUgY29uZmlybWVkIGxheW91dC4nKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCBgXHUyNzRDIENvdWxkIG5vdCBnZW5lcmF0ZSBmaW5hbCBmaWxlczogJHtlcnJvci5tZXNzYWdlfSBUcnkgY2xpY2tpbmcgR2VuZXJhdGUgYWdhaW4uIElmIGxheW91dCBjb25maXJtYXRpb24gaXMgbmVlZGVkIGZpcnN0LCBjbGljayBDb25maXJtIExheW91dCwgdGhlbiB0cnkgYWdhaW4uYCk7XG4gIH0gZmluYWxseSB7XG4gICAgc2hvd1Byb2Nlc3NpbmcoZmFsc2UpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZUxheW91dFByaW1hcnlBY3Rpb24oKSB7XG4gIGNvbnN0IGZyZXNobmVzcyA9IHN0YXRlTWFuYWdlci5nZXRMYXlvdXRGcmVzaG5lc3MoKTtcbiAgY29uc3QgZ2VuZXJhdGlvblN0YXRlID0gc3RhdGVNYW5hZ2VyLmdldEdlbmVyYXRpb25TdGF0ZSgpO1xuICBpZiAoZnJlc2huZXNzLmlzU3RhbGUpIHJldHVybiBoYW5kbGVSZWdlbmVyYXRlUHJldmlld0FjdGlvbigpO1xuICBpZiAoZ2VuZXJhdGlvblN0YXRlLmxheW91dENvbmZpcm1lZCB8fCBnZW5lcmF0aW9uU3RhdGUucGhhc2UgPT09ICdjb25maXJtZWQnKSB7XG4gICAgcmV0dXJuIGdlbmVyYXRlRmluYWxPdXRwdXRzKCk7XG4gIH1cbiAgcmV0dXJuIGNvbmZpcm1MYXlvdXRSZXZpZXcoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29tcGxldGVMYXlvdXRSZXZpZXcoKSB7XG4gIHJldHVybiBoYW5kbGVMYXlvdXRQcmltYXJ5QWN0aW9uKCk7XG59XG5cbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihHRU5FUkFUSU9OX1NUQVRFX0VWRU5ULCByZWZyZXNoTGF5b3V0UmV2aWV3U3RhdGUpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgQ29udGVudCBwcm9wb3NhbCBmdW5jdGlvbnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8qKlxuICogU3VibWl0IGEgbmF0dXJhbC1sYW5ndWFnZSBjb250ZW50IGVkaXQgcmVxdWVzdCB0byB0aGUgYmFja2VuZCBhbmQgcmVuZGVyIHByb3Bvc2Fscy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3VibWl0Q29udGVudFByb3Bvc2FsKCkge1xuICBjb25zdCBpbnB1dCAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2luc3RydWN0aW9uLWlucHV0Jyk7XG4gIGNvbnN0IHByb2Nlc3NpbmcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGVudC1wcm9wb3NhbC1wcm9jZXNzaW5nJyk7XG4gIGNvbnN0IHBhbmVsICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGVudC1wcm9wb3NhbHMtcGFuZWwnKTtcblxuICBjb25zdCBpbnN0cnVjdGlvbiA9IGlucHV0Py52YWx1ZS50cmltKCk7XG4gIGlmICghaW5zdHJ1Y3Rpb24pIHtcbiAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnXHUyNkEwXHVGRTBGIFBsZWFzZSBkZXNjcmliZSB0aGUgY29udGVudCBjaGFuZ2UgeW91IHdhbnQgYmVmb3JlIHN1Ym1pdHRpbmcuJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHByb2Nlc3NpbmcpIHByb2Nlc3Npbmcuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgaWYgKHBhbmVsKSAgICAgICBwYW5lbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpQ2FsbCgnUE9TVCcsICcvYXBpL2N2L3Byb3Bvc2UtY29udGVudC1jaGFuZ2UnLCB7IGluc3RydWN0aW9uIH0pO1xuICAgIGlmICghcmVzPy5vaykge1xuICAgICAgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgYFx1Mjc0QyBDb3VsZCBub3QgZ2VuZXJhdGUgY29udGVudCBwcm9wb3NhbHMuIFRyeSByZXBocmFzaW5nIHlvdXIgaW5zdHJ1Y3Rpb24gb3IgY2hlY2sgdGhlIHNlc3Npb24gaXMgc3RpbGwgYWN0aXZlLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwcm9wb3NhbHMgPSByZXMucHJvcG9zYWxzIHx8IFtdO1xuICAgIGlmIChwcm9wb3NhbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnXHUyNkEwXHVGRTBGIE5vIHByb3Bvc2FscyB3ZXJlIGdlbmVyYXRlZC4gVHJ5IHJlcGhyYXNpbmcgeW91ciBpbnN0cnVjdGlvbi4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmVuZGVyQ29udGVudFByb3Bvc2Fscyhwcm9wb3NhbHMpO1xuICAgIGlmIChwYW5lbCkgcGFuZWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsIGBcdTI3NEMgQ291bGQgbm90IHN1Ym1pdCB0aGUgY29udGVudCBwcm9wb3NhbC4gQ2hlY2sgeW91ciBjb25uZWN0aW9uIGFuZCB0cnkgYWdhaW4uYCk7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKHByb2Nlc3NpbmcpIHByb2Nlc3Npbmcuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgfVxufVxuXG4vKipcbiAqIFJlbmRlciBhIGxpc3Qgb2YgY29udGVudCBwcm9wb3NhbHMgYXMgcmV2aWV3YWJsZSBjYXJkcyBpbnNpZGUgI2NvbnRlbnQtcHJvcG9zYWxzLXBhbmVsLlxuICogQHBhcmFtIHtBcnJheTx7aWQsIHR5cGUsIGxvY2F0aW9uLCBvcmlnaW5hbCwgcHJvcG9zZWQsIHJlYXNvbn0+fSBwcm9wb3NhbHNcbiAqL1xuZnVuY3Rpb24gcmVuZGVyQ29udGVudFByb3Bvc2Fscyhwcm9wb3NhbHMpIHtcbiAgY29uc3QgcGFuZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGVudC1wcm9wb3NhbHMtcGFuZWwnKTtcbiAgaWYgKCFwYW5lbCkgcmV0dXJuO1xuXG4gIGNvbnN0IGFwcGx5QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FwcGx5LWNvbnRlbnQtY2hhbmdlcy1idG4nKTtcblxuICBwYW5lbC5pbm5lckhUTUwgPSBgXG4gICAgPHAgY2xhc3M9XCJjb250ZW50LXByb3Bvc2Fscy1oZWFkaW5nXCI+JHtwcm9wb3NhbHMubGVuZ3RofSBwcm9wb3NhbCR7cHJvcG9zYWxzLmxlbmd0aCAhPT0gMSA/ICdzJyA6ICcnfSBcdTIwMTQgYXBwcm92ZSB0aGUgY2hhbmdlcyB5b3Ugd2FudCB0byBhcHBseTo8L3A+XG4gICAgJHtwcm9wb3NhbHMubWFwKChwLCBpKSA9PiBgXG4gICAgICA8ZGl2IGNsYXNzPVwiY29udGVudC1wcm9wb3NhbC1jYXJkXCIgZGF0YS1wcm9wb3NhbC1pZD1cIiR7ZXNjYXBlSHRtbChwLmlkKX1cIiBkYXRhLXByb3Bvc2FsLWluZGV4PVwiJHtpfVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHJvcG9zYWwtbWV0YVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwicHJvcG9zYWwtdHlwZS1iYWRnZVwiPiR7cC50eXBlID09PSAnc3VtbWFyeScgPyAnU3VtbWFyeScgOiAnQnVsbGV0J308L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJwcm9wb3NhbC1sb2NhdGlvblwiPiR7ZXNjYXBlSHRtbChwLmxvY2F0aW9uKX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHJvcG9zYWwtZGlmZlwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9wb3NhbC1vcmlnaW5hbFwiPjxzdHJvbmc+QmVmb3JlOjwvc3Ryb25nPiAke2VzY2FwZUh0bWwocC5vcmlnaW5hbCl9PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInByb3Bvc2FsLXByb3Bvc2VkXCI+PHN0cm9uZz5BZnRlcjo8L3N0cm9uZz4gJHtlc2NhcGVIdG1sKHAucHJvcG9zZWQpfTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgJHtwLnJlYXNvbiA/IGA8ZGl2IGNsYXNzPVwicHJvcG9zYWwtcmVhc29uXCI+PGVtPiR7ZXNjYXBlSHRtbChwLnJlYXNvbil9PC9lbT48L2Rpdj5gIDogJyd9XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwcm9wb3NhbC1hY3Rpb25zXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwicHJvcG9zYWwtYXBwcm92ZS1sYWJlbFwiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwicHJvcG9zYWwtYXBwcm92ZS1jaGVja2JveFwiIGNoZWNrZWQ+XG4gICAgICAgICAgICBBcHByb3ZlIHRoaXMgY2hhbmdlXG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5gKS5qb2luKCcnKX1cbiAgYDtcblxuICAvLyBTdG9yZSBwcm9wb3NhbHMgZm9yIGxhdGVyIHJldHJpZXZhbFxuICBwYW5lbC5kYXRhc2V0LnByb3Bvc2FscyA9IEpTT04uc3RyaW5naWZ5KHByb3Bvc2Fscyk7XG5cbiAgaWYgKGFwcGx5QnRuKSBhcHBseUJ0bi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbn1cblxuLyoqXG4gKiBDb2xsZWN0IGFwcHJvdmVkIHByb3Bvc2FscyBhbmQgUE9TVCB0aGVtIHRvIC9hcGkvY3YvYXBwbHktY29udGVudC1jaGFuZ2VzLlxuICogVXBkYXRlcyBkaXJ0eS1waGFzZSBzdGF0ZSBhbmQgc2hvd3MgdGhlIHJldHVybiBjYWxsb3V0LlxuICovXG5hc3luYyBmdW5jdGlvbiBhcHBseUFjY2VwdGVkUHJvcG9zYWxzKCkge1xuICBjb25zdCBwYW5lbCAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb250ZW50LXByb3Bvc2Fscy1wYW5lbCcpO1xuICBjb25zdCBhcHBseUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHBseS1jb250ZW50LWNoYW5nZXMtYnRuJyk7XG5cbiAgY29uc3QgYWxsUHJvcG9zYWxzID0gSlNPTi5wYXJzZShwYW5lbD8uZGF0YXNldC5wcm9wb3NhbHMgfHwgJ1tdJyk7XG4gIGNvbnN0IGNoZWNrYm94ZXMgICA9IHBhbmVsPy5xdWVyeVNlbGVjdG9yQWxsKCcucHJvcG9zYWwtYXBwcm92ZS1jaGVja2JveCcpIHx8IFtdO1xuXG4gIGNvbnN0IGFjY2VwdGVkID0gYWxsUHJvcG9zYWxzLmZpbHRlcigoXywgaSkgPT4gY2hlY2tib3hlc1tpXT8uY2hlY2tlZCk7XG4gIGlmIChhY2NlcHRlZC5sZW5ndGggPT09IDApIHtcbiAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnXHUyNkEwXHVGRTBGIE5vIHByb3Bvc2FscyBhcHByb3ZlZC4gVGljayBhdCBsZWFzdCBvbmUgY2hhbmdlIHRvIGFwcGx5LicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChhcHBseUJ0bikgYXBwbHlCdG4uZGlzYWJsZWQgPSB0cnVlO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpQ2FsbCgnUE9TVCcsICcvYXBpL2N2L2FwcGx5LWNvbnRlbnQtY2hhbmdlcycsIHsgYWNjZXB0ZWQgfSk7XG4gICAgaWYgKCFyZXM/Lm9rKSB7XG4gICAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCBgXHUyNzRDIEZhaWxlZCB0byBhcHBseSBjb250ZW50IGNoYW5nZXM6ICR7cmVzPy5lcnJvciB8fCAnVW5rbm93biBlcnJvcid9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3RhdGVNYW5hZ2VyLnNldERpcnR5UGhhc2VzKFxuICAgICAgcmVzLmRpcnR5X3BoYXNlcyB8fCBbJ2dlbmVyYXRlJywgJ2xheW91dCddLFxuICAgICAgcmVzLmVhcmxpZXN0X2RpcnR5X3N0ZXAgfHwgJ2dlbmVyYXRlJyxcbiAgICApO1xuXG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgYFx1MjcwNSAke3Jlcy5hcHBsaWVkX2NvdW50fSBjb250ZW50IGNoYW5nZSR7cmVzLmFwcGxpZWRfY291bnQgIT09IDEgPyAncycgOiAnJ30gc3RhZ2VkLiBSZXR1cm4gdG8gR2VuZXJhdGUgQ1YgdG8gYXBwbHkgdGhlbS5gKTtcblxuICAgIC8vIENsZWFyIHRoZSBwcm9wb3NhbCBwYW5lbFxuICAgIGlmIChwYW5lbCkgeyBwYW5lbC5pbm5lckhUTUwgPSAnJzsgcGFuZWwuc3R5bGUuZGlzcGxheSA9ICdub25lJzsgcGFuZWwuZGF0YXNldC5wcm9wb3NhbHMgPSAnW10nOyB9XG4gICAgaWYgKGFwcGx5QnRuKSBhcHBseUJ0bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgcmVmcmVzaExheW91dFJldmlld1N0YXRlKCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsIGBcdTI3NEMgQ291bGQgbm90IGFwcGx5IGNvbnRlbnQgY2hhbmdlcy4gQ2hlY2sgeW91ciBjb25uZWN0aW9uIGFuZCB0cnkgYWdhaW4uYCk7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKGFwcGx5QnRuKSBhcHBseUJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogU2hvdyBvciBoaWRlIHRoZSBkaXJ0eS1waGFzZXMgY2FsbG91dCBiYXNlZCBvbiBzdGF0ZU1hbmFnZXIuZ2V0RGlydHlQaGFzZXMoKS5cbiAqL1xuZnVuY3Rpb24gcmVuZGVyRGlydHlQaGFzZXNDYWxsb3V0KCkge1xuICBjb25zdCBjYWxsb3V0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RpcnR5LXBoYXNlcy1jYWxsb3V0Jyk7XG4gIGlmICghY2FsbG91dCkgcmV0dXJuO1xuICBjb25zdCBkaXJ0eSA9IHN0YXRlTWFuYWdlci5nZXREaXJ0eVBoYXNlcygpO1xuICBjYWxsb3V0LnN0eWxlLmRpc3BsYXkgPSBkaXJ0eS5sZW5ndGggPiAwID8gJ2Jsb2NrJyA6ICdub25lJztcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEVTIG1vZHVsZSBleHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuZXhwb3J0IHtcbiAgaW5pdGlhdGVMYXlvdXRJbnN0cnVjdGlvbnMsXG4gIGNvbXBsZXRlTGF5b3V0UmV2aWV3LFxuICBjb25maXJtTGF5b3V0UmV2aWV3LFxuICBnZW5lcmF0ZUZpbmFsT3V0cHV0cyxcbiAgaGFuZGxlTGF5b3V0UHJpbWFyeUFjdGlvbixcbiAgbG9hZExheW91dEluc3RydWN0aW9uSGlzdG9yeSxcbiAgcmVuZGVyUHJldmlld091dHB1dFN0YXR1cyxcbiAgcmVuZGVyTGF5b3V0UHJldmlld1N0YXR1cyxcbiAgZGlzcGxheUxheW91dFByZXZpZXcsXG4gIHN1Ym1pdExheW91dEluc3RydWN0aW9uLFxuICBzdWJtaXRTbWFydEluc3RydWN0aW9uLFxuICAvLyBoZWxwZXJzIGV4cG9ydGVkIGZvciB1bml0IHRlc3RzXG4gIHNob3dQcm9jZXNzaW5nLFxuICBzaG93Q29uZmlybWF0aW9uTWVzc2FnZSxcbiAgcmVuZGVySW5zdHJ1Y3Rpb25IaXN0b3J5LFxuICBhZGRUb0luc3RydWN0aW9uSGlzdG9yeSxcbiAgdW5kb0luc3RydWN0aW9uLFxuICAvLyBjb250ZW50IHByb3Bvc2FsXG4gIHN1Ym1pdENvbnRlbnRQcm9wb3NhbCxcbiAgcmVuZGVyQ29udGVudFByb3Bvc2FscyxcbiAgYXBwbHlBY2NlcHRlZFByb3Bvc2FscyxcbiAgcmVuZGVyRGlydHlQaGFzZXNDYWxsb3V0LFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL2F0cy1yZWZpbmVtZW50LmpzXG4gKiBBVFMgc2NvcmUgYmFkZ2UgZGlzcGxheSBhbmQgZGVib3VuY2VkIHJlZnJlc2ggc2NoZWR1bGluZy5cbiAqXG4gKiBERVBFTkRFTkNJRVM6XG4gKiAgIC0gZ2xvYmFsVGhpcy5zdGF0ZU1hbmFnZXIgZnJvbSBzdGF0ZS1tYW5hZ2VyLmpzIChhY2Nlc3NlZCB2aWEgZ2xvYmFsVGhpcyB0aHJvdWdob3V0KVxuICovXG5cbmZ1bmN0aW9uIF9kaXNwYXRjaEF0c1Njb3JlVXBkYXRlZCgpIHtcbiAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2F0cy1zY29yZS11cGRhdGVkJykpO1xufVxuXG5mdW5jdGlvbiBfc2FmZVRleHQodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZS50cmltKCkgOiAnJztcbn1cblxuZnVuY3Rpb24gX2NvZXJjZU9iamVjdCh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyA/IHZhbHVlIDoge307XG59XG5cbmZ1bmN0aW9uIF9mb3JtYXREYXRlTGFiZWwodmFsdWUpIHtcbiAgY29uc3QgdGV4dCA9IF9zYWZlVGV4dCh2YWx1ZSk7XG4gIGlmICghdGV4dCkgcmV0dXJuICcnO1xuXG4gIGlmICgvXlxcZHs0fS1cXGR7Mn0tXFxkezJ9JC8udGVzdCh0ZXh0KSkge1xuICAgIGNvbnN0IFt5ZWFyLCBtb250aCwgZGF5XSA9IHRleHQuc3BsaXQoJy0nKTtcbiAgICByZXR1cm4gYCR7bW9udGh9LyR7ZGF5fS8ke3llYXJ9YDtcbiAgfVxuXG4gIGNvbnN0IHBhcnNlZCA9IG5ldyBEYXRlKHRleHQpO1xuICBpZiAoIU51bWJlci5pc05hTihwYXJzZWQuZ2V0VGltZSgpKSkge1xuICAgIHJldHVybiBwYXJzZWQudG9JU09TdHJpbmcoKS5zbGljZSgwLCAxMCk7XG4gIH1cbiAgcmV0dXJuIHRleHQ7XG59XG5cbmZ1bmN0aW9uIF9nZXRQYWdlTGVuZ3RoTGFiZWwoKSB7XG4gIGNvbnN0IGdlbmVyYXRpb25TdGF0ZSA9IF9jb2VyY2VPYmplY3QoZ2xvYmFsVGhpcy5zdGF0ZU1hbmFnZXI/LmdldEdlbmVyYXRpb25TdGF0ZT8uKCkpO1xuICBjb25zdCBleGFjdCA9IE51bWJlcihnZW5lcmF0aW9uU3RhdGUucGFnZUNvdW50RXhhY3QpO1xuICBpZiAoTnVtYmVyLmlzRmluaXRlKGV4YWN0KSAmJiBleGFjdCA+IDApIHtcbiAgICByZXR1cm4gYExlbmd0aCAke2V4YWN0fSBwYWdlJHtleGFjdCA9PT0gMSA/ICcnIDogJ3MnfWA7XG4gIH1cblxuICBjb25zdCBlc3RpbWF0ZSA9IE51bWJlcihnZW5lcmF0aW9uU3RhdGUucGFnZUNvdW50RXN0aW1hdGUpO1xuICBpZiAoTnVtYmVyLmlzRmluaXRlKGVzdGltYXRlKSAmJiBlc3RpbWF0ZSA+IDApIHtcbiAgICByZXR1cm4gYExlbmd0aCAke2VzdGltYXRlLnRvRml4ZWQoMSl9IHBhZ2VzIGVzdGA7XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIF9nZXRKb2JTdW1tYXJ5TGFiZWwoKSB7XG4gIGNvbnN0IGludGFrZSA9IF9jb2VyY2VPYmplY3Qod2luZG93Ll9zdGF0dXNJbnRha2UpO1xuICBjb25zdCBhbmFseXNpcyA9IF9jb2VyY2VPYmplY3QoZ2xvYmFsVGhpcy5zdGF0ZU1hbmFnZXI/LmdldFRhYkRhdGE/LignYW5hbHlzaXMnKSk7XG4gIGNvbnN0IHBvc2l0aW9uRmFsbGJhY2sgPSBfc2FmZVRleHQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Bvc2l0aW9uLXRpdGxlJyk/LnRleHRDb250ZW50IHx8ICcnKTtcblxuICBjb25zdCByb2xlID0gX3NhZmVUZXh0KFxuICAgIGludGFrZS5yb2xlXG4gICAgICB8fCBhbmFseXNpcy5qb2JfdGl0bGVcbiAgICAgIHx8IGFuYWx5c2lzLnRpdGxlXG4gICAgICB8fCBhbmFseXNpcy5wb3NpdGlvbl9uYW1lXG4gICAgICB8fCAnJ1xuICApO1xuICBjb25zdCBjb21wYW55ID0gX3NhZmVUZXh0KGludGFrZS5jb21wYW55IHx8IGFuYWx5c2lzLmNvbXBhbnlfbmFtZSB8fCBhbmFseXNpcy5jb21wYW55IHx8ICcnKTtcbiAgY29uc3QgZGF0ZUFwcGxpZWQgPSBfZm9ybWF0RGF0ZUxhYmVsKFxuICAgIGludGFrZS5kYXRlX2FwcGxpZWRcbiAgICAgIHx8IGFuYWx5c2lzLmRhdGVfYXBwbGllZFxuICAgICAgfHwgYW5hbHlzaXMuYXBwbGljYXRpb25fZGF0ZVxuICAgICAgfHwgJydcbiAgKTtcblxuICBjb25zdCBwcmltYXJ5ID0gcm9sZSAmJiBjb21wYW55XG4gICAgPyBgJHtyb2xlfSBAICR7Y29tcGFueX1gXG4gICAgOiAocm9sZSB8fCBjb21wYW55IHx8IHBvc2l0aW9uRmFsbGJhY2spO1xuICBpZiAoIXByaW1hcnkpIHJldHVybiAnJztcbiAgaWYgKCFkYXRlQXBwbGllZCkgcmV0dXJuIHByaW1hcnk7XG4gIHJldHVybiBgJHtwcmltYXJ5fSAoJHtkYXRlQXBwbGllZH0pYDtcbn1cblxuZnVuY3Rpb24gX2tleXdvcmRDb3VudChrZXl3b3JkcywgdHlwZSwgc3RhdHVzZXMgPSBbJ21hdGNoZWQnLCAncGFydGlhbCddKSB7XG4gIHJldHVybiBrZXl3b3Jkcy5maWx0ZXIoa2V5d29yZCA9PiBrZXl3b3JkLnR5cGUgPT09IHR5cGUgJiYgc3RhdHVzZXMuaW5jbHVkZXMoa2V5d29yZC5zdGF0dXMpKS5sZW5ndGg7XG59XG5cbmZ1bmN0aW9uIF9idWlsZFN1bW1hcnlEZXRhaWwoc2NvcmUsIGtleXdvcmRzKSB7XG4gIGNvbnN0IG1pc3NpbmdIYXJkID0ga2V5d29yZHNcbiAgICAuZmlsdGVyKGtleXdvcmQgPT4ga2V5d29yZC50eXBlID09PSAnaGFyZCcgJiYga2V5d29yZC5zdGF0dXMgPT09ICdtaXNzaW5nJylcbiAgICAubWFwKGtleXdvcmQgPT4ga2V5d29yZC5rZXl3b3JkKVxuICAgIC5maWx0ZXIoQm9vbGVhbik7XG5cbiAgaWYgKG1pc3NpbmdIYXJkLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBwcmV2aWV3ID0gbWlzc2luZ0hhcmQuc2xpY2UoMCwgMikuam9pbignLCAnKTtcbiAgICBjb25zdCBzdWZmaXggPSBtaXNzaW5nSGFyZC5sZW5ndGggPiAyID8gYCArJHttaXNzaW5nSGFyZC5sZW5ndGggLSAyfSBtb3JlYCA6ICcnO1xuICAgIHJldHVybiBgTWlzc2luZyBoYXJkOiAke3ByZXZpZXd9JHtzdWZmaXh9YDtcbiAgfVxuXG4gIGNvbnN0IGV4YWN0ID0ga2V5d29yZHMuZmlsdGVyKGtleXdvcmQgPT4ga2V5d29yZC5tYXRjaF90eXBlID09PSAnZXhhY3QnIHx8IGtleXdvcmQubWF0Y2hfdHlwZSA9PT0gJ3N5bm9ueW0nKS5sZW5ndGg7XG4gIGNvbnN0IHBhcnRpYWwgPSBrZXl3b3Jkcy5maWx0ZXIoa2V5d29yZCA9PiBrZXl3b3JkLm1hdGNoX3R5cGUgPT09ICdwYXJ0aWFsJykubGVuZ3RoO1xuICBjb25zdCB0b3BTZWN0aW9ucyA9IE9iamVjdC5lbnRyaWVzKHNjb3JlLnNlY3Rpb25fc2NvcmVzIHx8IHt9KVxuICAgIC5maWx0ZXIoKFssIHZhbHVlXSkgPT4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiB2YWx1ZSA+IDApXG4gICAgLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiByaWdodFsxXSAtIGxlZnRbMV0pXG4gICAgLnNsaWNlKDAsIDIpXG4gICAgLm1hcCgoW3NlY3Rpb24sIHZhbHVlXSkgPT4gYCR7c2VjdGlvbn0gJHtNYXRoLnJvdW5kKHZhbHVlKX0lYCk7XG5cbiAgaWYgKHRvcFNlY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gYFRvcCBzZWN0aW9uczogJHt0b3BTZWN0aW9ucy5qb2luKCcgXHUyMDIyICcpfWA7XG4gIH1cblxuICBpZiAoZXhhY3QgPiAwIHx8IHBhcnRpYWwgPiAwKSB7XG4gICAgcmV0dXJuIGBNYXRjaCBxdWFsaXR5OiAke2V4YWN0fSBleGFjdCBcdTIwMjIgJHtwYXJ0aWFsfSBwYXJ0aWFsYDtcbiAgfVxuXG4gIHJldHVybiBgQmFzaXM6ICR7c2NvcmUuYmFzaXMgfHwgJ3Jldmlldyd9YDtcbn1cblxuZnVuY3Rpb24gZm9ybWF0QXRzU2NvcmVTdW1tYXJ5KHNjb3JlKSB7XG4gIGNvbnN0IGtleXdvcmRzID0gQXJyYXkuaXNBcnJheShzY29yZT8ua2V5d29yZF9zdGF0dXMpID8gc2NvcmUua2V5d29yZF9zdGF0dXMgOiBbXTtcbiAgY29uc3Qgb3ZlcmFsbCA9IHR5cGVvZiBzY29yZT8ub3ZlcmFsbCA9PT0gJ251bWJlcicgPyBNYXRoLnJvdW5kKHNjb3JlLm92ZXJhbGwpIDogbnVsbDtcblxuICBpZiAob3ZlcmFsbCA9PT0gbnVsbCkge1xuICAgIHJldHVybiB7IG92ZXJhbGw6IG51bGwsIGxpbmU6ICcnLCBkZXRhaWw6ICcnLCBrZXl3b3JkcyB9O1xuICB9XG5cbiAgaWYgKGtleXdvcmRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB7XG4gICAgICBvdmVyYWxsLFxuICAgICAgbGluZTogYE92ZXJhbGwgJHtvdmVyYWxsfSVgLFxuICAgICAgZGV0YWlsOiBgQmFzaXM6ICR7c2NvcmUuYmFzaXMgfHwgJ3Jldmlldyd9YCxcbiAgICAgIGtleXdvcmRzLFxuICAgIH07XG4gIH1cblxuICBjb25zdCBoYXJkVG90YWwgPSBrZXl3b3Jkcy5maWx0ZXIoa2V5d29yZCA9PiBrZXl3b3JkLnR5cGUgPT09ICdoYXJkJykubGVuZ3RoO1xuICBjb25zdCBzb2Z0VG90YWwgPSBrZXl3b3Jkcy5maWx0ZXIoa2V5d29yZCA9PiBrZXl3b3JkLnR5cGUgPT09ICdzb2Z0JykubGVuZ3RoO1xuICBjb25zdCBib251c1RvdGFsID0ga2V5d29yZHMuZmlsdGVyKGtleXdvcmQgPT4ga2V5d29yZC50eXBlID09PSAnYm9udXMnKS5sZW5ndGg7XG4gIGNvbnN0IHN1bW1hcnlQYXJ0cyA9IFtdO1xuXG4gIGlmIChoYXJkVG90YWwgPiAwKSB7XG4gICAgc3VtbWFyeVBhcnRzLnB1c2goYEhhcmQgJHtfa2V5d29yZENvdW50KGtleXdvcmRzLCAnaGFyZCcpfS8ke2hhcmRUb3RhbH1gKTtcbiAgfVxuICBpZiAoc29mdFRvdGFsID4gMCkge1xuICAgIHN1bW1hcnlQYXJ0cy5wdXNoKGBTb2Z0ICR7X2tleXdvcmRDb3VudChrZXl3b3JkcywgJ3NvZnQnKX0vJHtzb2Z0VG90YWx9YCk7XG4gIH1cbiAgaWYgKGJvbnVzVG90YWwgPiAwKSB7XG4gICAgc3VtbWFyeVBhcnRzLnB1c2goYEJvbnVzICR7X2tleXdvcmRDb3VudChrZXl3b3JkcywgJ2JvbnVzJyl9LyR7Ym9udXNUb3RhbH1gKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgb3ZlcmFsbCxcbiAgICBsaW5lOiBzdW1tYXJ5UGFydHMuam9pbignIFx1MjAyMiAnKSB8fCBgT3ZlcmFsbCAke292ZXJhbGx9JWAsXG4gICAgZGV0YWlsOiBfYnVpbGRTdW1tYXJ5RGV0YWlsKHNjb3JlLCBrZXl3b3JkcyksXG4gICAga2V5d29yZHMsXG4gIH07XG59XG5cbmZ1bmN0aW9uIF91cGRhdGVBdHNTdW1tYXJ5KHNjb3JlKSB7XG4gIGNvbnN0IGhlYWRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdHMtc2NvcmUtaGVhZGVyJyk7XG4gIGNvbnN0IHN1bW1hcnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXRzLXNjb3JlLXN1bW1hcnknKTtcbiAgY29uc3Qgc3VtbWFyeUxpbmUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXRzLXNjb3JlLXN1bW1hcnktbGluZScpO1xuICBjb25zdCBzdW1tYXJ5RGV0YWlsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F0cy1zY29yZS1zdW1tYXJ5LWRldGFpbCcpO1xuXG4gIGlmICghaGVhZGVyIHx8ICFzdW1tYXJ5IHx8ICFzdW1tYXJ5TGluZSB8fCAhc3VtbWFyeURldGFpbCkgcmV0dXJuO1xuXG4gIGNvbnN0IGtleXdvcmRzID0gQXJyYXkuaXNBcnJheShzY29yZT8ua2V5d29yZF9zdGF0dXMpID8gc2NvcmUua2V5d29yZF9zdGF0dXMgOiBbXTtcbiAgY29uc3QgaGFzU2NvcmUgPSBzY29yZSAmJiB0eXBlb2Ygc2NvcmUub3ZlcmFsbCA9PT0gJ251bWJlcic7XG4gIGNvbnN0IHBhZ2VMZW5ndGhMYWJlbCA9IF9nZXRQYWdlTGVuZ3RoTGFiZWwoKTtcbiAgY29uc3Qgam9iU3VtbWFyeUxhYmVsID0gX2dldEpvYlN1bW1hcnlMYWJlbCgpO1xuXG4gIGlmICghaGFzU2NvcmUpIHtcbiAgICBoZWFkZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBzdW1tYXJ5LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgc3VtbWFyeUxpbmUudGV4dENvbnRlbnQgPSAnJztcbiAgICBzdW1tYXJ5RGV0YWlsLnRleHRDb250ZW50ID0gJyc7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaGVhZGVyLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG5cbiAgY29uc3Qgc3VtbWFyeUNvbnRlbnQgPSBmb3JtYXRBdHNTY29yZVN1bW1hcnkoc2NvcmUpO1xuICBjb25zdCBsaW5lUGFydHMgPSBbc3VtbWFyeUNvbnRlbnQubGluZSwgcGFnZUxlbmd0aExhYmVsXS5maWx0ZXIoQm9vbGVhbik7XG4gIGNvbnN0IGRldGFpbFBhcnRzID0gW2pvYlN1bW1hcnlMYWJlbCwgc3VtbWFyeUNvbnRlbnQuZGV0YWlsXS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgaWYgKGxpbmVQYXJ0cy5sZW5ndGggPT09IDAgJiYgZGV0YWlsUGFydHMubGVuZ3RoID09PSAwICYmIGtleXdvcmRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHN1bW1hcnkuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBzdW1tYXJ5TGluZS50ZXh0Q29udGVudCA9ICcnO1xuICAgIHN1bW1hcnlEZXRhaWwudGV4dENvbnRlbnQgPSAnJztcbiAgICByZXR1cm47XG4gIH1cblxuICBzdW1tYXJ5TGluZS50ZXh0Q29udGVudCA9IGxpbmVQYXJ0cy5qb2luKCcgXHUyMDIyICcpO1xuICBzdW1tYXJ5RGV0YWlsLnRleHRDb250ZW50ID0gZGV0YWlsUGFydHMuam9pbignIFx1MjAyMiAnKTtcbiAgc3VtbWFyeS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVBdHNCYWRnZShzY29yZSkge1xuICBfdXBkYXRlQXRzU3VtbWFyeShzY29yZSk7XG5cbiAgY29uc3QgYmFkZ2UgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdHMtc2NvcmUtYmFkZ2UnKTtcbiAgY29uc3QgdmFsdWVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdHMtc2NvcmUtdmFsdWUnKTtcbiAgaWYgKCFiYWRnZSB8fCAhdmFsdWVFbCkge1xuICAgIF9kaXNwYXRjaEF0c1Njb3JlVXBkYXRlZCgpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICghc2NvcmUgfHwgdHlwZW9mIHNjb3JlLm92ZXJhbGwgIT09ICdudW1iZXInKSB7XG4gICAgYmFkZ2Uuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBfZGlzcGF0Y2hBdHNTY29yZVVwZGF0ZWQoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBvdmVyYWxsID0gTWF0aC5yb3VuZChzY29yZS5vdmVyYWxsKTtcbiAgdmFsdWVFbC50ZXh0Q29udGVudCA9IGAke292ZXJhbGx9JWA7XG4gIGJhZGdlLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG5cbiAgYmFkZ2UuY2xhc3NMaXN0LnJlbW92ZSgnc2NvcmUtaGlnaCcsICdzY29yZS1tZWRpdW0nLCAnc2NvcmUtbG93Jyk7XG4gIGlmIChvdmVyYWxsID49IDc1KSB7XG4gICAgYmFkZ2UuY2xhc3NMaXN0LmFkZCgnc2NvcmUtaGlnaCcpO1xuICB9IGVsc2UgaWYgKG92ZXJhbGwgPj0gNTApIHtcbiAgICBiYWRnZS5jbGFzc0xpc3QuYWRkKCdzY29yZS1tZWRpdW0nKTtcbiAgfSBlbHNlIHtcbiAgICBiYWRnZS5jbGFzc0xpc3QuYWRkKCdzY29yZS1sb3cnKTtcbiAgfVxuXG4gIGJhZGdlLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIGBBVFMgbWF0Y2ggc2NvcmU6ICR7b3ZlcmFsbH0lICgke3Njb3JlLmJhc2lzIHx8ICdyZXZpZXcnfSlgKTtcbiAgX2Rpc3BhdGNoQXRzU2NvcmVVcGRhdGVkKCk7XG59XG5cbi8qKlxuICogRmV0Y2ggQVRTIHNjb3JlIGZyb20gYmFja2VuZCBhbmQgdXBkYXRlIGJhZGdlICsgc3RhdGVNYW5hZ2VyLlxuICogU2FmZSB0byBjYWxsIGF0IGFueSBwaGFzZSBcdTIwMTQgZG9lcyBub3RoaW5nIHdoZW4gbm8gc2Vzc2lvbi9hbmFseXNpcyBhdmFpbGFibGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFtiYXNpc10gIFwiYW5hbHlzaXNcIiB8IFwicmV2aWV3X2NoZWNrcG9pbnRcIiB8IFwicG9zdF9nZW5lcmF0aW9uXCJcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVmcmVzaEF0c1Njb3JlKGJhc2lzID0gJ3Jldmlld19jaGVja3BvaW50Jykge1xuICBjb25zdCBzZXNzaW9uSWQgPSBnbG9iYWxUaGlzLnN0YXRlTWFuYWdlcj8uZ2V0U2Vzc2lvbklkPy4oKTtcbiAgaWYgKCFzZXNzaW9uSWQpIHJldHVybjtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9jdi9hdHMtc2NvcmUnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBzZXNzaW9uX2lkOiBzZXNzaW9uSWQsIGJhc2lzIH0pLFxuICAgIH0pO1xuICAgIGlmICghcmVzLm9rKSByZXR1cm47XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEub2sgJiYgZGF0YS5hdHNfc2NvcmUpIHtcbiAgICAgIGdsb2JhbFRoaXMuc3RhdGVNYW5hZ2VyPy5zZXRBdHNTY29yZT8uKGRhdGEuYXRzX3Njb3JlKTtcbiAgICAgIHVwZGF0ZUF0c0JhZGdlKGRhdGEuYXRzX3Njb3JlKTtcbiAgICB9XG4gIH0gY2F0Y2ggKF9lKSB7XG4gICAgLy8gTm9uLWZhdGFsIFx1MjAxNCBiYWRnZSBzdGF5cyBoaWRkZW4gb3Igc2hvd3Mgc3RhbGUgdmFsdWVcbiAgfVxufVxuXG4vKiogRGVib3VuY2VkOiBkZWZlcnMgcmVmcmVzaCA2MDBtcyBhZnRlciB0aGUgbGFzdCBjYWxsLiAqL1xubGV0IF9hdHNSZWZyZXNoVGltZXIgPSBudWxsO1xuZnVuY3Rpb24gc2NoZWR1bGVBdHNSZWZyZXNoKGJhc2lzID0gJ3Jldmlld19jaGVja3BvaW50Jykge1xuICBjbGVhclRpbWVvdXQoX2F0c1JlZnJlc2hUaW1lcik7XG4gIF9hdHNSZWZyZXNoVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHJlZnJlc2hBdHNTY29yZShiYXNpcyksIDYwMCk7XG59XG5cbmZ1bmN0aW9uIF9yZWZyZXNoU3VtbWFyeUZyb21TdGF0ZSgpIHtcbiAgY29uc3Qgc2NvcmUgPSBnbG9iYWxUaGlzLnN0YXRlTWFuYWdlcj8uZ2V0QXRzU2NvcmU/LigpO1xuICBpZiAoc2NvcmUgJiYgdHlwZW9mIHNjb3JlLm92ZXJhbGwgPT09ICdudW1iZXInKSB7XG4gICAgX3VwZGF0ZUF0c1N1bW1hcnkoc2NvcmUpO1xuICB9XG59XG5cbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignY3ZidWlsZGVyOmdlbmVyYXRpb24tc3RhdGUtY2hhbmdlZCcsICgpID0+IHtcbiAgICBfcmVmcmVzaFN1bW1hcnlGcm9tU3RhdGUoKTtcbiAgfSk7XG59XG5cbmlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gIGNvbnN0IHBvc2l0aW9uVGl0bGVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwb3NpdGlvbi10aXRsZScpO1xuICBpZiAocG9zaXRpb25UaXRsZUVsICYmIHR5cGVvZiBNdXRhdGlvbk9ic2VydmVyICE9PSAndW5kZWZpbmVkJykge1xuICAgIGNvbnN0IHRpdGxlT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7XG4gICAgICBfcmVmcmVzaFN1bW1hcnlGcm9tU3RhdGUoKTtcbiAgICB9KTtcbiAgICB0aXRsZU9ic2VydmVyLm9ic2VydmUocG9zaXRpb25UaXRsZUVsLCB7XG4gICAgICBjaGlsZExpc3Q6IHRydWUsXG4gICAgICBjaGFyYWN0ZXJEYXRhOiB0cnVlLFxuICAgICAgc3VidHJlZTogdHJ1ZSxcbiAgICB9KTtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgRVMgbW9kdWxlIGV4cG9ydHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5leHBvcnQgeyB1cGRhdGVBdHNCYWRnZSwgcmVmcmVzaEF0c1Njb3JlLCBzY2hlZHVsZUF0c1JlZnJlc2gsIGZvcm1hdEF0c1Njb3JlU3VtbWFyeSB9O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvbWVzc2FnZS1xdWV1ZS5qc1xuICogQ29udmVyc2F0aW9uIG1lc3NhZ2UgYXBwZW5kaW5nLCBsb2FkaW5nIG1lc3NhZ2VzLCBhbmQgdGhlIHByZS1ET00gYnVmZmVyXG4gKiBxdWV1ZSB0aGF0IGhvbGRzIG1lc3NhZ2VzIGVtaXR0ZWQgYmVmb3JlICNjb252ZXJzYXRpb24gZXhpc3RzLlxuICpcbiAqIERFUEVOREVOQ0lFUzpcbiAqICAgLSBjbGVhbkpzb25SZXNwb25zZSwgZXNjYXBlSHRtbCBmcm9tIHV0aWxzLmpzXG4gKiAgIC0gc2VuZE1lc3NhZ2UgZnJvbSBtZXNzYWdlLWRpc3BhdGNoLmpzIChvbiBnbG9iYWxUaGlzLCBmb3IgaW5saW5lIGJ1dHRvbnMpXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgY2xlYW5Kc29uUmVzcG9uc2UsIGVzY2FwZUh0bWwgfSBmcm9tICcuL3V0aWxzLmpzJztcbmNvbnN0IGxvZyA9IGdldExvZ2dlcignbWVzc2FnZS1xdWV1ZScpO1xuXG4vLyBCdWZmZXIgZm9yIG1lc3NhZ2VzIGVtaXR0ZWQgYmVmb3JlIHRoZSAjY29udmVyc2F0aW9uIGRpdiBleGlzdHMuXG4vLyBGbHVzaGVkIGF0IHRoZSBzdGFydCBvZiBpbml0KCkgb25jZSB0aGUgRE9NIGlzIGZ1bGx5IHJlYWR5LlxuY29uc3QgX21lc3NhZ2VRdWV1ZSA9IFtdO1xuXG5mdW5jdGlvbiBfZmx1c2hNZXNzYWdlUXVldWUoKSB7XG4gIHdoaWxlIChfbWVzc2FnZVF1ZXVlLmxlbmd0aCkge1xuICAgIGNvbnN0IHsgdHlwZSwgdGV4dCB9ID0gX21lc3NhZ2VRdWV1ZS5zaGlmdCgpO1xuICAgIGFwcGVuZE1lc3NhZ2UodHlwZSwgdGV4dCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYXBwZW5kTG9hZGluZ01lc3NhZ2UodGV4dCkge1xuICBjb25zdCBjb252ZXJzYXRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udmVyc2F0aW9uJyk7XG4gIGNvbnN0IG1lc3NhZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgbWVzc2FnZS5jbGFzc05hbWUgPSAnbWVzc2FnZSBzeXN0ZW0nO1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGNvbnRlbnQuY2xhc3NOYW1lID0gJ2NvbnRlbnQgbG9hZGluZy1tZXNzYWdlJztcbiAgY29udGVudC5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz1cImxvYWRpbmctc3Bpbm5lclwiPjwvZGl2PjxzcGFuPiR7dGV4dH08L3NwYW4+YDtcbiAgbWVzc2FnZS5hcHBlbmRDaGlsZChjb250ZW50KTtcbiAgY29udmVyc2F0aW9uLmFwcGVuZENoaWxkKG1lc3NhZ2UpO1xuICBjb252ZXJzYXRpb24uc2Nyb2xsVG9wID0gY29udmVyc2F0aW9uLnNjcm9sbEhlaWdodDtcbiAgcmV0dXJuIG1lc3NhZ2U7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUxvYWRpbmdNZXNzYWdlKG1lc3NhZ2VFbGVtZW50KSB7XG4gIGlmIChtZXNzYWdlRWxlbWVudCAmJiBtZXNzYWdlRWxlbWVudC5wYXJlbnROb2RlKSB7XG4gICAgbWVzc2FnZUVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChtZXNzYWdlRWxlbWVudCk7XG4gIH1cbn1cblxuLyoqIFJlc3RvcmVzIGEgcHJldmlvdXNseS1zYXZlZCBtZXNzYWdlIHdob3NlIGNvbnRlbnQgaXMgYWxyZWFkeSBIVE1MIChzYXZlZCB2aWEgaW5uZXJIVE1MKS4gKi9cbmZ1bmN0aW9uIGFwcGVuZE1lc3NhZ2VIdG1sKHR5cGUsIGh0bWwpIHtcbiAgY29uc3QgY29udmVyc2F0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbnZlcnNhdGlvbicpO1xuICBjb25zdCBtZXNzYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIG1lc3NhZ2UuY2xhc3NOYW1lID0gYG1lc3NhZ2UgJHt0eXBlfWA7XG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgY29udGVudC5jbGFzc05hbWUgPSAnY29udGVudCc7XG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gaHRtbDtcbiAgbWVzc2FnZS5hcHBlbmRDaGlsZChjb250ZW50KTtcbiAgY29udmVyc2F0aW9uLmFwcGVuZENoaWxkKG1lc3NhZ2UpO1xuICBjb252ZXJzYXRpb24uc2Nyb2xsVG9wID0gY29udmVyc2F0aW9uLnNjcm9sbEhlaWdodDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDb2xsYXBzaWJsZSBsb25nLWNvbnRlbnQgaGVscGVyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY29uc3QgQ09MTEFQU0VfTElORV9USFJFU0hPTEQgPSA4OyAgLy8gbGluZXMgYmVmb3JlIGNvbGxhcHNpbmdcbmNvbnN0IENPTExBUFNFX0NIQVJfVEhSRVNIT0xEID0gNDgwOyAvLyBjaGFycyBiZWZvcmUgY29sbGFwc2luZ1xuXG4vKipcbiAqIFdyYXAgcmVuZGVyZWQgSFRNTCBpbiBhIGNvbGxhcHNpYmxlIGNvbnRhaW5lciB3aGVuIHRoZSBjb250ZW50IGV4Y2VlZHMgdGhlXG4gKiB0aHJlc2hvbGQsIHNob3dpbmcgdGhlIGZpcnN0IGZldyBsaW5lcyB3aXRoIGEgdG9nZ2xlIGJ1dHRvbi5cbiAqL1xuZnVuY3Rpb24gX21ha2VDb2xsYXBzaWJsZUNvbnRlbnQoaHRtbCwgdGV4dFN0cikge1xuICBjb25zdCBsaW5lcyA9IHRleHRTdHIuc3BsaXQoJ1xcbicpO1xuICBpZiAobGluZXMubGVuZ3RoIDw9IENPTExBUFNFX0xJTkVfVEhSRVNIT0xEICYmIHRleHRTdHIubGVuZ3RoIDw9IENPTExBUFNFX0NIQVJfVEhSRVNIT0xEKSB7XG4gICAgcmV0dXJuIHsgaHRtbCwgY29sbGFwc2libGU6IGZhbHNlIH07XG4gIH1cblxuICAvLyBCdWlsZCBwcmV2aWV3OiBmaXJzdCBDT0xMQVBTRV9MSU5FX1RIUkVTSE9MRCBsaW5lcyB3b3J0aCBvZiBlc2NhcGVkIHRleHRcbiAgY29uc3QgcHJldmlld0xpbmVzID0gbGluZXMuc2xpY2UoMCwgQ09MTEFQU0VfTElORV9USFJFU0hPTEQpO1xuICBjb25zdCBwcmV2aWV3SHRtbCA9IGVzY2FwZUh0bWwocHJldmlld0xpbmVzLmpvaW4oJ1xcbicpKVxuICAgIC5yZXBsYWNlKC9cXCpcXCooLis/KVxcKlxcKi9nLCAnPHN0cm9uZz4kMTwvc3Ryb25nPicpXG4gICAgLnJlcGxhY2UoL1xcKiguKz8pXFwqL2csICc8ZW0+JDE8L2VtPicpXG4gICAgLnJlcGxhY2UoL2AoW15gXSspYC9nLCAnPGNvZGU+JDE8L2NvZGU+JylcbiAgICAucmVwbGFjZSgvXFxuL2csICc8YnI+Jyk7XG5cbiAgY29uc3Qgb3ZlcmZsb3cgPSBsaW5lcy5sZW5ndGggLSBDT0xMQVBTRV9MSU5FX1RIUkVTSE9MRDtcbiAgY29uc3QgaWQgPSBgY29sbGFwc2libGUtJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDcpfWA7XG5cbiAgY29uc3Qgd3JhcHBlZCA9IGBcbiAgICA8ZGl2IGNsYXNzPVwibXNnLXByZXZpZXdcIiBpZD1cIiR7aWR9LXByZXZpZXdcIj4ke3ByZXZpZXdIdG1sfTwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJtc2ctZnVsbFwiIGlkPVwiJHtpZH0tZnVsbFwiIHN0eWxlPVwiZGlzcGxheTpub25lXCI+JHtodG1sfTwvZGl2PlxuICAgIDxidXR0b24gY2xhc3M9XCJtc2ctdG9nZ2xlLWJ0blwiIG9uY2xpY2s9XCIoZnVuY3Rpb24oYnRuKXtcbiAgICAgIHZhciBwPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCcke2lkfS1wcmV2aWV3JyksXG4gICAgICAgICAgZj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnJHtpZH0tZnVsbCcpO1xuICAgICAgaWYoZi5zdHlsZS5kaXNwbGF5PT09J25vbmUnKXtcbiAgICAgICAgcC5zdHlsZS5kaXNwbGF5PSdub25lJzsgZi5zdHlsZS5kaXNwbGF5PSdibG9jayc7IGJ0bi50ZXh0Q29udGVudD0nU2hvdyBsZXNzJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHAuc3R5bGUuZGlzcGxheT0nJzsgZi5zdHlsZS5kaXNwbGF5PSdub25lJzsgYnRuLnRleHRDb250ZW50PSdTaG93ICR7b3ZlcmZsb3d9IG1vcmUgbGluZSR7b3ZlcmZsb3cgPT09IDEgPyAnJyA6ICdzJ31cdTIwMjYnO1xuICAgICAgfVxuICAgIH0pKHRoaXMpXCIgdHlwZT1cImJ1dHRvblwiPlNob3cgJHtvdmVyZmxvd30gbW9yZSBsaW5lJHtvdmVyZmxvdyA9PT0gMSA/ICcnIDogJ3MnfVx1MjAyNjwvYnV0dG9uPmA7XG5cbiAgcmV0dXJuIHsgaHRtbDogd3JhcHBlZCwgY29sbGFwc2libGU6IHRydWUgfTtcbn1cblxuZnVuY3Rpb24gYXBwZW5kTWVzc2FnZSh0eXBlLCB0ZXh0KSB7XG4gIGNvbnN0IGNvbnZlcnNhdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb252ZXJzYXRpb24nKTtcbiAgaWYgKCFjb252ZXJzYXRpb24pIHtcbiAgICAvLyBET00gbm90IHJlYWR5IHlldCBcdTIwMTQgYnVmZmVyIHVudGlsIF9mbHVzaE1lc3NhZ2VRdWV1ZSgpIGlzIGNhbGxlZCBmcm9tIGluaXQoKVxuICAgIF9tZXNzYWdlUXVldWUucHVzaCh7IHR5cGUsIHRleHQgfSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgbWVzc2FnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBtZXNzYWdlLmNsYXNzTmFtZSA9IGBtZXNzYWdlICR7dHlwZX1gO1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGNvbnRlbnQuY2xhc3NOYW1lID0gJ2NvbnRlbnQnO1xuXG4gIC8vIFNpbXBsZSBtYXJrZG93biByZW5kZXJpbmc6IGNvbnZlcnQgKip0ZXh0KiogdG8gPHN0cm9uZz4gYW5kIHByZXNlcnZlIG5ld2xpbmVzXG4gIGNvbnN0IHRleHRTdHIgPSB0eXBlb2YgdGV4dCA9PT0gJ3N0cmluZycgPyB0ZXh0IDogSlNPTi5zdHJpbmdpZnkodGV4dCwgbnVsbCwgMik7XG4gIGNvbnN0IHJlbmRlcmVkSHRtbCA9IGVzY2FwZUh0bWwodGV4dFN0cilcbiAgICAucmVwbGFjZSgvXFwqXFwqKC4rPylcXCpcXCovZywgJzxzdHJvbmc+JDE8L3N0cm9uZz4nKVxuICAgIC5yZXBsYWNlKC9cXCooLis/KVxcKi9nLCAnPGVtPiQxPC9lbT4nKVxuICAgIC5yZXBsYWNlKC9gKFteYF0rKWAvZywgJzxjb2RlPiQxPC9jb2RlPicpXG4gICAgLnJlcGxhY2UoL1xcbi9nLCAnPGJyPicpO1xuXG4gIC8vIEFwcGx5IGNvbGxhcHNpYmxlIHdyYXBwZXIgZm9yIGxvbmcgdXNlci9hc3Npc3RhbnQgbWVzc2FnZXNcbiAgaWYgKHR5cGUgPT09ICd1c2VyJyB8fCB0eXBlID09PSAnYXNzaXN0YW50Jykge1xuICAgIGNvbnN0IHsgaHRtbCwgY29sbGFwc2libGUgfSA9IF9tYWtlQ29sbGFwc2libGVDb250ZW50KHJlbmRlcmVkSHRtbCwgdGV4dFN0cik7XG4gICAgY29udGVudC5pbm5lckhUTUwgPSBodG1sO1xuICAgIGlmIChjb2xsYXBzaWJsZSkgY29udGVudC5jbGFzc0xpc3QuYWRkKCdjb2xsYXBzaWJsZS1tc2cnKTtcbiAgfSBlbHNlIHtcbiAgICBjb250ZW50LmlubmVySFRNTCA9IHJlbmRlcmVkSHRtbDtcbiAgfVxuICBtZXNzYWdlLmFwcGVuZENoaWxkKGNvbnRlbnQpO1xuXG4gIC8vIENoZWNrIGlmIG1lc3NhZ2UgZW5kcyB3aXRoIHJlc3BvbnNlIG9wdGlvbnMgbGlrZSAoeWVzL25vL21heWJlKVxuICBjb25zdCBvcHRpb25zTWF0Y2ggPSB0ZXh0U3RyLm1hdGNoKC9cXCgoW14pXStcXC9bXildKylcXClcXHMqJC8pO1xuICBpZiAob3B0aW9uc01hdGNoICYmIHR5cGUgPT09ICdhc3Npc3RhbnQnKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IG9wdGlvbnNNYXRjaFsxXS5zcGxpdCgnLycpLm1hcChvcHQgPT4gb3B0LnRyaW0oKSk7XG4gICAgY29uc3QgYnV0dG9uQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgYnV0dG9uQ29udGFpbmVyLnN0eWxlLmNzc1RleHQgPSAnbWFyZ2luLXRvcDogMTJweDsgZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IGZsZXgtd3JhcDogd3JhcDsnO1xuICAgIG9wdGlvbnMuZm9yRWFjaChvcHRpb24gPT4ge1xuICAgICAgY29uc3QgYnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgICBidG4udGV4dENvbnRlbnQgPSBvcHRpb247XG4gICAgICBidG4uY2xhc3NOYW1lID0gJ2FjdGlvbi1idG4nO1xuICAgICAgYnRuLnN0eWxlLmNzc1RleHQgPSAncGFkZGluZzogOHB4IDE2cHg7IGJhY2tncm91bmQ6ICMzYjgyZjY7IGNvbG9yOiB3aGl0ZTsgYm9yZGVyOiBub25lOyBib3JkZXItcmFkaXVzOiA2cHg7IGN1cnNvcjogcG9pbnRlcjsnO1xuICAgICAgYnRuLm9uY2xpY2sgPSAoKSA9PiB7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZXNzYWdlLWlucHV0JykudmFsdWUgPSBvcHRpb247XG4gICAgICAgIGlmICh0eXBlb2Ygc2VuZE1lc3NhZ2UgPT09ICdmdW5jdGlvbicpIHNlbmRNZXNzYWdlKCk7XG4gICAgICB9O1xuICAgICAgYnV0dG9uQ29udGFpbmVyLmFwcGVuZENoaWxkKGJ0bik7XG4gICAgfSk7XG4gICAgbWVzc2FnZS5hcHBlbmRDaGlsZChidXR0b25Db250YWluZXIpO1xuICB9XG5cbiAgY29udmVyc2F0aW9uLmFwcGVuZENoaWxkKG1lc3NhZ2UpO1xuICBjb252ZXJzYXRpb24uc2Nyb2xsVG9wID0gY29udmVyc2F0aW9uLnNjcm9sbEhlaWdodDtcbiAgcmV0dXJuIG1lc3NhZ2U7XG59XG5cbi8qKlxuICogQXBwZW5kcyBhIHN5c3RlbSBlcnJvciBtZXNzYWdlIHdpdGggYW4gb3B0aW9uYWwgUmV0cnkgYnV0dG9uLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgdGV4dCAgICAgICAtIEVycm9yIG1lc3NhZ2UgdGV4dCAoc3VwcG9ydHMgKipib2xkKiogbWFya2Rvd24pXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcmV0cnlGbl0gIC0gQ2FsbGVkIHdoZW4gUmV0cnkgaXMgY2xpY2tlZDsgb21pdCBmb3Igbm9uLXJldHJ5YWJsZSBlcnJvcnNcbiAqIEBwYXJhbSB7c3RyaW5nfSAgIFtyZXRyeUxhYmVsXSAtIFJldHJ5IGJ1dHRvbiBsYWJlbCAoZGVmYXVsdCAnUmV0cnknKVxuICovXG5mdW5jdGlvbiBhcHBlbmRSZXRyeU1lc3NhZ2UodGV4dCwgcmV0cnlGbiwgcmV0cnlMYWJlbCA9ICdSZXRyeScsIGNhbmNlbEZuID0gbnVsbCkge1xuICBjb25zdCBjb252ZXJzYXRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udmVyc2F0aW9uJyk7XG4gIGNvbnN0IG1lc3NhZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgbWVzc2FnZS5jbGFzc05hbWUgPSAnbWVzc2FnZSBzeXN0ZW0nO1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGNvbnRlbnQuY2xhc3NOYW1lID0gJ2NvbnRlbnQnO1xuICBjb25zdCBlc2NhcGVkID0gZXNjYXBlSHRtbCh0ZXh0KTtcbiAgY29udGVudC5pbm5lckhUTUwgPSBlc2NhcGVkXG4gICAgLnJlcGxhY2UoL1xcKlxcKiguKz8pXFwqXFwqL2csICc8c3Ryb25nPiQxPC9zdHJvbmc+JylcbiAgICAucmVwbGFjZSgvXFxuL2csICc8YnI+Jyk7XG4gIG1lc3NhZ2UuYXBwZW5kQ2hpbGQoY29udGVudCk7XG4gIGlmICh0eXBlb2YgcmV0cnlGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgIGJ0bi50ZXh0Q29udGVudCA9IHJldHJ5TGFiZWw7XG4gICAgYnRuLnN0eWxlLmNzc1RleHQgPSAnbWFyZ2luLXRvcDo4cHg7cGFkZGluZzo2cHggMTRweDtiYWNrZ3JvdW5kOiMzYjgyZjY7Y29sb3I6I2ZmZjtib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjZweDtjdXJzb3I6cG9pbnRlcjtmb250LXNpemU6MC44NXJlbTtkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW4tcmlnaHQ6OHB4Oyc7XG4gICAgYnRuLm9uY2xpY2sgPSAoKSA9PiB7IG1lc3NhZ2UucmVtb3ZlKCk7IHJldHJ5Rm4oKTsgfTtcbiAgICBtZXNzYWdlLmFwcGVuZENoaWxkKGJ0bik7XG4gIH1cbiAgaWYgKHR5cGVvZiBjYW5jZWxGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnN0IGNhbmNlbEJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgIGNhbmNlbEJ0bi50ZXh0Q29udGVudCA9ICdTdG9wIHJldHJpZXMnO1xuICAgIGNhbmNlbEJ0bi5zdHlsZS5jc3NUZXh0ID0gJ21hcmdpbi10b3A6OHB4O3BhZGRpbmc6NnB4IDE0cHg7YmFja2dyb3VuZDojNmI3MjgwO2NvbG9yOiNmZmY7Ym9yZGVyOm5vbmU7Ym9yZGVyLXJhZGl1czo2cHg7Y3Vyc29yOnBvaW50ZXI7Zm9udC1zaXplOjAuODVyZW07ZGlzcGxheTppbmxpbmUtYmxvY2s7JztcbiAgICBjYW5jZWxCdG4ub25jbGljayA9ICgpID0+IHsgbWVzc2FnZS5yZW1vdmUoKTsgY2FuY2VsRm4oKTsgfTtcbiAgICBtZXNzYWdlLmFwcGVuZENoaWxkKGNhbmNlbEJ0bik7XG4gIH1cbiAgY29udmVyc2F0aW9uLmFwcGVuZENoaWxkKG1lc3NhZ2UpO1xuICBjb252ZXJzYXRpb24uc2Nyb2xsVG9wID0gY29udmVyc2F0aW9uLnNjcm9sbEhlaWdodDtcbiAgcmV0dXJuIG1lc3NhZ2U7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZEZvcm1hdHRlZEFuYWx5c2lzKHJlc3VsdCkge1xuICB0cnkge1xuICAgIGNvbnN0IGNsZWFuUmVzdWx0ID0gY2xlYW5Kc29uUmVzcG9uc2UocmVzdWx0KTtcbiAgICBjb25zdCBkYXRhID0gdHlwZW9mIGNsZWFuUmVzdWx0ID09PSAnc3RyaW5nJyA/IEpTT04ucGFyc2UoY2xlYW5SZXN1bHQpIDogY2xlYW5SZXN1bHQ7XG5cbiAgICBpZiAoZGF0YSAmJiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiYgKGRhdGEudGl0bGUgfHwgZGF0YS5yZXF1aXJlZF9za2lsbHMpKSB7XG4gICAgICBjb25zdCBjb252ZXJzYXRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udmVyc2F0aW9uJyk7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBtZXNzYWdlLmNsYXNzTmFtZSA9ICdtZXNzYWdlIGFzc2lzdGFudCc7XG4gICAgICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBjb250ZW50LmNsYXNzTmFtZSA9ICdjb250ZW50IGpvYi1hbmFseXNpcyc7XG5cbiAgICAgIGxldCBodG1sID0gJzxoMz5cdUQ4M0RcdURDQ0IgSm9iIEFuYWx5c2lzIENvbXBsZXRlPC9oMz4nO1xuICAgICAgaWYgKGRhdGEudGl0bGUpICBodG1sICs9IGA8cD48c3Ryb25nPlBvc2l0aW9uOjwvc3Ryb25nPiAke2RhdGEudGl0bGV9IGF0ICR7ZGF0YS5jb21wYW55IHx8ICdDb21wYW55J308L3A+YDtcbiAgICAgIGlmIChkYXRhLmRvbWFpbikgaHRtbCArPSBgPHA+PHN0cm9uZz5Eb21haW46PC9zdHJvbmc+ICR7ZGF0YS5kb21haW59PC9wPmA7XG5cbiAgICAgIGlmIChkYXRhLnJlcXVpcmVkX3NraWxscz8ubGVuZ3RoKSB7XG4gICAgICAgIGh0bWwgKz0gJzxoND5cdUQ4M0NcdURGQUYgUmVxdWlyZWQgU2tpbGxzOjwvaDQ+PHVsPic7XG4gICAgICAgIGRhdGEucmVxdWlyZWRfc2tpbGxzLmZvckVhY2gocyA9PiB7IGh0bWwgKz0gYDxsaT4ke3N9PC9saT5gOyB9KTtcbiAgICAgICAgaHRtbCArPSAnPC91bD4nO1xuICAgICAgfVxuICAgICAgaWYgKGRhdGEucHJlZmVycmVkX3NraWxscz8ubGVuZ3RoKSB7XG4gICAgICAgIGh0bWwgKz0gJzxoND5cdTJCNTAgUHJlZmVycmVkIFNraWxsczo8L2g0Pjx1bD4nO1xuICAgICAgICBkYXRhLnByZWZlcnJlZF9za2lsbHMuZm9yRWFjaChzID0+IHsgaHRtbCArPSBgPGxpPiR7c308L2xpPmA7IH0pO1xuICAgICAgICBodG1sICs9ICc8L3VsPic7XG4gICAgICB9XG4gICAgICBpZiAoZGF0YS5uaWNlX3RvX2hhdmVfcmVxdWlyZW1lbnRzPy5sZW5ndGgpIHtcbiAgICAgICAgaHRtbCArPSAnPGg0Plx1MjcyOCBOaWNlIHRvIEhhdmU6PC9oND48dWw+JztcbiAgICAgICAgZGF0YS5uaWNlX3RvX2hhdmVfcmVxdWlyZW1lbnRzLmZvckVhY2gociA9PiB7IGh0bWwgKz0gYDxsaT4ke3J9PC9saT5gOyB9KTtcbiAgICAgICAgaHRtbCArPSAnPC91bD4nO1xuICAgICAgfVxuICAgICAgaWYgKGRhdGEuYXRzX2tleXdvcmRzPy5sZW5ndGgpIHtcbiAgICAgICAgaHRtbCArPSAnPGg0Plx1RDgzRFx1REQxMSBBVFMgS2V5d29yZHM6PC9oND48cCBzdHlsZT1cImxpbmUtaGVpZ2h0OiAyO1wiPic7XG4gICAgICAgIGRhdGEuYXRzX2tleXdvcmRzLmZvckVhY2goa3cgPT4ge1xuICAgICAgICAgIGh0bWwgKz0gYDxzcGFuIHN0eWxlPVwiZGlzcGxheTppbmxpbmUtYmxvY2s7YmFja2dyb3VuZDojZGJlYWZlO2NvbG9yOiMxZTQwYWY7Ym9yZGVyLXJhZGl1czo0cHg7cGFkZGluZzoycHggOHB4O21hcmdpbjoycHg7Zm9udC1zaXplOjAuODVlbTtcIj4ke2t3fTwvc3Bhbj5gO1xuICAgICAgICB9KTtcbiAgICAgICAgaHRtbCArPSAnPC9wPic7XG4gICAgICB9XG5cbiAgICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgIG1lc3NhZ2UuYXBwZW5kQ2hpbGQoY29udGVudCk7XG4gICAgICBjb252ZXJzYXRpb24uYXBwZW5kQ2hpbGQobWVzc2FnZSk7XG4gICAgICBjb252ZXJzYXRpb24uc2Nyb2xsVG9wID0gY29udmVyc2F0aW9uLnNjcm9sbEhlaWdodDtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgcmVzdWx0KTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2cuZXJyb3IoJ0FuYWx5c2lzIGRpc3BsYXkgZXJyb3I6JywgZSk7XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgcmVzdWx0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhcHBlbmRGb3JtYXR0ZWRSZXNwb25zZShyZXNwb25zZSkge1xuICB0cnkge1xuICAgIGNvbnN0IGRhdGEgPSB0eXBlb2YgcmVzcG9uc2UgPT09ICdzdHJpbmcnID8gSlNPTi5wYXJzZShyZXNwb25zZSkgOiByZXNwb25zZTtcbiAgICBpZiAoZGF0YSAmJiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiYgKGRhdGEudGl0bGUgfHwgZGF0YS5yZXF1aXJlZF9za2lsbHMpKSB7XG4gICAgICBhcHBlbmRGb3JtYXR0ZWRBbmFseXNpcyhyZXNwb25zZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIHJlc3BvbnNlKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCByZXNwb25zZSk7XG4gIH1cbn1cblxuLy8gYXBwZW5kUmF3SHRtbCBpcyBuZWVkZWQgYnkgbWVzc2FnZS1kaXNwYXRjaDsgZGVmaW5lZCBoZXJlIHNpbmNlIGl0IHVzZXMgdGhlXG4vLyBjb252ZXJzYXRpb24gZWxlbWVudCBwYXR0ZXJuLlxuZnVuY3Rpb24gYXBwZW5kUmF3SHRtbChodG1sKSB7XG4gIGNvbnN0IGNvbnZlcnNhdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb252ZXJzYXRpb24nKTtcbiAgaWYgKCFjb252ZXJzYXRpb24pIHJldHVybjtcbiAgY29udmVyc2F0aW9uLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJywgaHRtbCk7XG4gIGNvbnZlcnNhdGlvbi5zY3JvbGxUb3AgPSBjb252ZXJzYXRpb24uc2Nyb2xsSGVpZ2h0O1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgRVMgbW9kdWxlIGV4cG9ydHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5leHBvcnQge1xuICBfbWVzc2FnZVF1ZXVlLCBfZmx1c2hNZXNzYWdlUXVldWUsXG4gIGFwcGVuZExvYWRpbmdNZXNzYWdlLCByZW1vdmVMb2FkaW5nTWVzc2FnZSxcbiAgYXBwZW5kTWVzc2FnZUh0bWwsIGFwcGVuZE1lc3NhZ2UsXG4gIGFwcGVuZFJldHJ5TWVzc2FnZSxcbiAgYXBwZW5kRm9ybWF0dGVkQW5hbHlzaXMsIGFwcGVuZEZvcm1hdHRlZFJlc3BvbnNlLFxuICBhcHBlbmRSYXdIdG1sLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL3Jldmlldy10YWJsZS1iYXNlLmpzXG4gKiBUYWIgc3dpdGNoaW5nLCBhbmFseXNpcyB0YWIsIGN1c3RvbWl6YXRpb24gcmVzcG9uc2UgaGFuZGxlciwgcmV2aWV3LXBhbmVcbiAqIGNvb3JkaW5hdGlvbiwgYW5kIHRoZSBwYWdlLWVzdGltYXRlIHdpZGdldC5cbiAqXG4gKiBEZXBlbmRlbmNpZXMgKGFsbCByZXNvbHZlZCB0aHJvdWdoIGdsb2JhbFRoaXMgYXQgcnVudGltZSk6XG4gKiAgIGFwcGVuZE1lc3NhZ2UsIHNhdmVUYWJEYXRhLCBjbGVhbkpzb25SZXNwb25zZSwgZXNjYXBlSHRtbCxcbiAqICAgZ2V0U3RhZ2VGb3JUYWIsIHVwZGF0ZVRhYkJhckZvclN0YWdlLCB1cGRhdGVBY3Rpb25CdXR0b25zLFxuICogICBwb3B1bGF0ZUpvYlRhYiwgcG9wdWxhdGVRdWVzdGlvbnNUYWIsIGJ1aWxkQWNoaWV2ZW1lbnRzRWRpdG9yLFxuICogICByZW5kZXJSZXdyaXRlUGFuZWwsIHBvcHVsYXRlQ1ZFZGl0b3JUYWIsXG4gKiAgIHBvcHVsYXRlRG93bmxvYWRUYWIsIHBvcHVsYXRlU3BlbGxDaGVja1RhYiwgaW5pdGlhdGVMYXlvdXRJbnN0cnVjdGlvbnMsXG4gKiAgIHBvcHVsYXRlRmluYWxpc2VUYWIsIHBvcHVsYXRlTWFzdGVyVGFiLCBwb3B1bGF0ZUNvdmVyTGV0dGVyVGFiLFxuICogICBwb3B1bGF0ZVNjcmVlbmluZ1RhYiwgZXh0cmFjdEZpcnN0SnNvbk9iamVjdCxcbiAqICAgZmV0Y2hTdGF0dXMsIGFwaUNhbGwsXG4gKiAgIGJ1aWxkRXhwZXJpZW5jZVJldmlld1RhYmxlLCBidWlsZFNraWxsc1Jldmlld1RhYmxlLFxuICogICBidWlsZEFjaGlldmVtZW50c1Jldmlld1RhYmxlLCBidWlsZFN1bW1hcnlGb2N1c1NlY3Rpb24sXG4gKiAgIGJ1aWxkUHVibGljYXRpb25zUmV2aWV3VGFibGUsIGdldEV4cGVyaWVuY2VEZXRhaWxzLFxuICogICBnZXRFeHBlcmllbmNlUmVjb21tZW5kYXRpb24sIGFjaGlldmVtZW50RGVjaXNpb25zXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdyZXZpZXctdGFibGUtYmFzZScpO1xuXG5pbXBvcnQgeyBzdGF0ZU1hbmFnZXIgfSBmcm9tICcuL3N0YXRlLW1hbmFnZXIuanMnO1xuaW1wb3J0IHsgX1NURVBfRElTUExBWSB9IGZyb20gJy4vd29ya2Zsb3ctc3RlcHMuanMnO1xuXG4vLyBcdTI1MDBcdTI1MDAgTW9kdWxlLWxldmVsIHN0YXRlIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5sZXQgdXNlclNlbGVjdGlvbnMgPSB7XG4gIGV4cGVyaWVuY2VzOiB7fSwgIC8vIGV4cF9pZCAtPiAnZW1waGFzaXplJ3wnaW5jbHVkZSd8J2RlLWVtcGhhc2l6ZSd8J2V4Y2x1ZGUnXG4gIHNraWxsczoge30gICAgICAgIC8vIHNraWxsX25hbWUgLT4gJ2VtcGhhc2l6ZSd8J2luY2x1ZGUnfCdkZS1lbXBoYXNpemUnfCdleGNsdWRlJ1xufTtcbmxldCBwYWdlRXN0aW1hdGVUaW1lciA9IG51bGw7XG5sZXQgcGFnZUVzdGltYXRlUmVxdWVzdElkID0gMDtcblxuLy8gRHJhZnQgaW5wdXQgY2FjaGUgXHUyMDEzIHByZXNlcnZlcyB1c2VyLXR5cGVkIHZhbHVlcyBhY3Jvc3MgdGFiIHN3aXRjaGVzXG5jb25zdCBfZHJhZnRJbnB1dHMgPSB7fTtcblxuZnVuY3Rpb24gX3NhdmVEcmFmdElucHV0c0ZvclRhYih0YWJOYW1lKSB7XG4gIGlmICghdGFiTmFtZSkgcmV0dXJuO1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgaWYgKCFjb250ZW50KSByZXR1cm47XG4gIGNvbnN0IHNhdmVkID0ge307XG4gIGNvbnRlbnQucXVlcnlTZWxlY3RvckFsbCgndGV4dGFyZWEsIGlucHV0LCBzZWxlY3QnKS5mb3JFYWNoKGVsID0+IHtcbiAgICBpZiAoIWVsLmlkIHx8IGVsLnR5cGUgPT09ICdmaWxlJykgcmV0dXJuO1xuICAgIHNhdmVkW2VsLmlkXSA9IChlbC50eXBlID09PSAnY2hlY2tib3gnIHx8IGVsLnR5cGUgPT09ICdyYWRpbycpID8gZWwuY2hlY2tlZCA6IGVsLnZhbHVlO1xuICB9KTtcbiAgaWYgKE9iamVjdC5rZXlzKHNhdmVkKS5sZW5ndGggPiAwKSB7XG4gICAgX2RyYWZ0SW5wdXRzW3RhYk5hbWVdID0gc2F2ZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gX3Jlc3RvcmVEcmFmdElucHV0c0ZvclRhYih0YWJOYW1lKSB7XG4gIGNvbnN0IGNhY2hlZCA9IF9kcmFmdElucHV0c1t0YWJOYW1lXTtcbiAgaWYgKCFjYWNoZWQpIHJldHVybjtcbiAgT2JqZWN0LmVudHJpZXMoY2FjaGVkKS5mb3JFYWNoKChbaWQsIHZhbHVlXSkgPT4ge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgIGlmICghZWwgfHwgZWwucmVhZE9ubHkgfHwgZWwuZGlzYWJsZWQgfHwgZWwudHlwZSA9PT0gJ2ZpbGUnKSByZXR1cm47XG4gICAgaWYgKGVsLnR5cGUgPT09ICdjaGVja2JveCcgfHwgZWwudHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgZWwuY2hlY2tlZCA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbC52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGVuc3VyZVRhYkRhdGFTdGF0ZSgpIHtcbiAgcmV0dXJuIHN0YXRlTWFuYWdlci5nZXRBbGxUYWJEYXRhKCk7XG59XG5cbmZ1bmN0aW9uIGlzUmVjb25uZWN0SW5Qcm9ncmVzcygpIHtcbiAgcmV0dXJuIHN0YXRlTWFuYWdlci5pc1JlY29ubmVjdGluZygpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgSW5jbHVzaW9uIGNvdW50cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gdXBkYXRlSW5jbHVzaW9uQ291bnRzKCkge1xuICB0cnkge1xuICAgIGNvbnN0IGV4cERlY3MgPSAod2luZG93Ll9zYXZlZERlY2lzaW9ucyAmJiB3aW5kb3cuX3NhdmVkRGVjaXNpb25zLmV4cGVyaWVuY2VfZGVjaXNpb25zKSB8fCB1c2VyU2VsZWN0aW9ucy5leHBlcmllbmNlcyB8fCB7fTtcbiAgICBjb25zdCBza2lsbERlY3MgPSAod2luZG93Ll9zYXZlZERlY2lzaW9ucyAmJiB3aW5kb3cuX3NhdmVkRGVjaXNpb25zLnNraWxsX2RlY2lzaW9ucykgfHwgdXNlclNlbGVjdGlvbnMuc2tpbGxzIHx8IHt9O1xuICAgIGNvbnN0IGFjaERlY3MgPSAod2luZG93Ll9zYXZlZERlY2lzaW9ucyAmJiB3aW5kb3cuX3NhdmVkRGVjaXNpb25zLmFjaGlldmVtZW50X2RlY2lzaW9ucykgfHwgd2luZG93LmFjaGlldmVtZW50RGVjaXNpb25zIHx8IHt9O1xuXG4gICAgY29uc3QgZXhwSW5jbHVkZWQgPSBPYmplY3QudmFsdWVzKGV4cERlY3MpLmZpbHRlcih2ID0+IHYgIT09ICdleGNsdWRlJykubGVuZ3RoO1xuICAgIGNvbnN0IHNraWxsSW5jbHVkZWQgPSBPYmplY3QudmFsdWVzKHNraWxsRGVjcykuZmlsdGVyKHYgPT4gdiAhPT0gJ2V4Y2x1ZGUnKS5sZW5ndGg7XG4gICAgY29uc3QgYWNoSW5jbHVkZWQgPSBPYmplY3QudmFsdWVzKGFjaERlY3MpLmZpbHRlcih2ID0+IHYgIT09ICdleGNsdWRlJykubGVuZ3RoO1xuXG4gICAgY29uc3QgZXhwVGFiID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYi1leHAtcmV2aWV3Jyk7XG4gICAgY29uc3Qgc2tpbGxUYWIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFiLXNraWxscy1yZXZpZXcnKTtcbiAgICBjb25zdCBhY2hUYWIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFiLWFjaGlldmVtZW50cy1yZXZpZXcnKTtcblxuICAgIGlmIChleHBUYWIpIGV4cFRhYi50ZXh0Q29udGVudCA9IGBcdUQ4M0RcdURDQ0EgRXhwZXJpZW5jZXMke2V4cEluY2x1ZGVkID8gJyAoJyArIGV4cEluY2x1ZGVkICsgJyknIDogJyd9YDtcbiAgICBpZiAoc2tpbGxUYWIpIHNraWxsVGFiLnRleHRDb250ZW50ID0gYFx1RDgzRFx1REVFMFx1RkUwRiBTa2lsbHMke3NraWxsSW5jbHVkZWQgPyAnICgnICsgc2tpbGxJbmNsdWRlZCArICcpJyA6ICcnfWA7XG4gICAgaWYgKGFjaFRhYikgYWNoVGFiLnRleHRDb250ZW50ID0gYFx1RDgzQ1x1REZDNiBBY2hpZXZlbWVudHMke2FjaEluY2x1ZGVkID8gJyAoJyArIGFjaEluY2x1ZGVkICsgJyknIDogJyd9YDtcbiAgfSBjYXRjaCAoZSkgeyBsb2cud2FybignRmFpbGVkIHRvIHVwZGF0ZSBpbmNsdXNpb24gY291bnRzOicsIGUpOyB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBHZW5lcmF0ZSBDViB0YWIgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIF9wb3B1bGF0ZUdlbmVyYXRlVGFiKGN2RGF0YSwgY29udGVudCkge1xuICBpZiAoIWN2RGF0YSB8fCAhY3ZEYXRhLmZpbGVzIHx8ICFjdkRhdGEuZmlsZXMubGVuZ3RoKSB7XG4gICAgY29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImVtcHR5LXN0YXRlXCI+PGRpdiBjbGFzcz1cImljb25cIj5cdUQ4M0RcdURDQzQ8L2Rpdj48aDM+R2VuZXJhdGVkIENWPC9oMz48cD5HZW5lcmF0ZSBDViB0byBzZWUgcHJldmlldzwvcD48L2Rpdj4nO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG1ldGEgICAgID0gY3ZEYXRhLm1ldGFkYXRhIHx8IHt9O1xuICBjb25zdCByb2xlICAgICA9IG1ldGEucm9sZSAgICAgfHwgbWV0YS5wb3NpdGlvbiB8fCAnJztcbiAgY29uc3QgY29tcGFueSAgPSBtZXRhLmNvbXBhbnkgIHx8ICcnO1xuICBjb25zdCBzdWJ0aXRsZSA9IHJvbGUgJiYgY29tcGFueSA/IGAke3JvbGV9IFx1MjAxNCAke2NvbXBhbnl9YCA6IHJvbGUgfHwgY29tcGFueSB8fCAnQ1YgZ2VuZXJhdGVkJztcblxuICBjb25zdCBJQ09OUyA9IHsgJy5wZGYnOiAnXHVEODNEXHVEQ0M0JywgJy5kb2N4JzogJ1x1RDgzRFx1RENERCcsICcuaHRtbCc6ICdcdUQ4M0NcdURGMTAnIH07XG4gIGNvbnN0IExBQkVMUyA9IHtcbiAgICAnLnBkZic6ICBmID0+IGYuaW5jbHVkZXMoJ0FUUycpID8gJ0FUUyBQREYnICA6ICdIdW1hbiBQREYnLFxuICAgICcuZG9jeCc6IGYgPT4gZi5pbmNsdWRlcygnQVRTJykgPyAnQVRTIERPQ1gnIDogZi5zdGFydHNXaXRoKCdDb3ZlckxldHRlcl8nKSA/ICdDb3ZlciBMZXR0ZXInIDogJ0h1bWFuIERPQ1gnLFxuICAgICcuaHRtbCc6ICgpID0+ICdIVE1MJyxcbiAgfTtcblxuICBjb25zdCBkb3dubG9hZGFibGVFeHRzID0gbmV3IFNldChbJy5wZGYnLCAnLmRvY3gnLCAnLmh0bWwnXSk7XG4gIGNvbnN0IGZpbGVzID0gKGN2RGF0YS5maWxlcyB8fCBbXSkuZmlsdGVyKGYgPT4ge1xuICAgIGNvbnN0IGV4dCA9IGYuc2xpY2UoZi5sYXN0SW5kZXhPZignLicpKS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiBkb3dubG9hZGFibGVFeHRzLmhhcyhleHQpICYmIGYgIT09ICdqb2JfZGVzY3JpcHRpb24udHh0JztcbiAgfSk7XG5cbiAgY29uc3Qgc2lkID0gdHlwZW9mIGdldFNlc3Npb25JZEZyb21VUkwgPT09ICdmdW5jdGlvbicgPyBnZXRTZXNzaW9uSWRGcm9tVVJMKCkgOiBudWxsO1xuICBjb25zdCBzZXNzaW9uUGFyYW0gPSBzaWQgPyBgP3Nlc3Npb25faWQ9JHtlbmNvZGVVUklDb21wb25lbnQoc2lkKX1gIDogJyc7XG5cbiAgbGV0IGZpbGVSb3dzID0gJyc7XG4gIGZvciAoY29uc3QgZiBvZiBmaWxlcykge1xuICAgIGNvbnN0IGV4dCAgID0gZi5zbGljZShmLmxhc3RJbmRleE9mKCcuJykpLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgaWNvbiAgPSBJQ09OU1tleHRdICB8fCAnXHVEODNEXHVEQ0MxJztcbiAgICBjb25zdCBsYWJlbCA9IExBQkVMU1tleHRdID8gTEFCRUxTW2V4dF0oZikgOiBmO1xuICAgIGZpbGVSb3dzICs9IGBcbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDoxMnB4O3BhZGRpbmc6MTBweCAwO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNmMWY1Zjk7XCI+XG4gICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjEuNGVtO1wiPiR7aWNvbn08L3NwYW4+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJmbGV4OjE7bWluLXdpZHRoOjA7XCI+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOiMzNzQxNTE7XCI+JHtsYWJlbH08L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuNzhlbTtjb2xvcjojOWNhM2FmO3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztcIj4ke2VzY2FwZUh0bWwoZil9PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8YSBocmVmPVwiL2FwaS9kb3dubG9hZC8ke2VuY29kZVVSSUNvbXBvbmVudChmKX0ke3Nlc3Npb25QYXJhbX1cIiBkb3dubG9hZD1cIiR7ZXNjYXBlSHRtbChmKX1cIlxuICAgICAgICAgICBjbGFzcz1cImJ0bi1zZWNvbmRhcnlcIiBzdHlsZT1cInBhZGRpbmc6NnB4IDE0cHg7Zm9udC1zaXplOjAuODVlbTt0ZXh0LWRlY29yYXRpb246bm9uZTtkaXNwbGF5OmlubGluZS1ibG9jaztcIj5Eb3dubG9hZDwvYT5cbiAgICAgIDwvZGl2PmA7XG4gIH1cblxuICBjb250ZW50LmlubmVySFRNTCA9IGBcbiAgICA8ZGl2IHN0eWxlPVwibWF4LXdpZHRoOjY0MHB4O21hcmdpbjowIGF1dG87cGFkZGluZzoyNHB4IDA7XCI+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTJweDttYXJnaW4tYm90dG9tOjI0cHg7XCI+XG4gICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjJlbTtcIj5cdTI3MDU8L3NwYW4+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGgyIHN0eWxlPVwibWFyZ2luOjA7Zm9udC1zaXplOjEuMmVtO2NvbG9yOiMxMTE4Mjc7XCI+Q1YgR2VuZXJhdGVkPC9oMj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuOWVtO2NvbG9yOiM2YjcyODA7XCI+JHtlc2NhcGVIdG1sKHN1YnRpdGxlKX08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZmY7Ym9yZGVyOjFweCBzb2xpZCAjZTJlOGYwO2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MCAxNnB4O21hcmdpbi1ib3R0b206MjRweDtcIj5cbiAgICAgICAgJHtmaWxlUm93c31cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cIm5hdi1idXR0b25zIG5hdi1lbmRcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbnRpbnVlLWJ0blwiIG9uY2xpY2s9XCJzd2l0Y2hUYWIoJ2xheW91dCcpXCI+T3BlbiBMYXlvdXQgUmV2aWV3IFx1MjE5MjwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+YDtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFRhYiBzd2l0Y2hpbmcgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8vIFRyYWNrcyB3aGljaCBjdXN0b21pc2Utc3RhZ2Ugc3ViLXRhYnMgaGF2ZSBiZWVuIHZpZXdlZCB0aGlzIHNlc3Npb24gKEdBUC0yNjkpLlxuY29uc3QgX3Zpc2l0ZWRDdXN0b21pc2VUYWJzID0gbmV3IFNldCgpO1xuY29uc3QgX0NVU1RPTUlTRV9UQUJTID0gbmV3IFNldChbJ2dvYWxzJywgJ3F1ZXN0aW9ucycsICdleHAtcmV2aWV3JywgJ2FjaC1lZGl0b3InLCAnc2tpbGxzLXJldmlldycsICdhY2hpZXZlbWVudHMtcmV2aWV3JywgJ3RhZ2xpbmUtcmV2aWV3JywgJ3N1bW1hcnktcmV2aWV3JywgJ3B1YmxpY2F0aW9ucy1yZXZpZXcnLCAnYXRzLXNjb3JlJ10pO1xuXG5mdW5jdGlvbiBfdXBkYXRlVmlzaXRlZFRhYkluZGljYXRvcnMoKSB7XG4gIF92aXNpdGVkQ3VzdG9taXNlVGFicy5mb3JFYWNoKG5hbWUgPT4ge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHRhYi0ke25hbWV9YCk7XG4gICAgaWYgKGVsKSBlbC5jbGFzc0xpc3QuYWRkKCd0YWItLXZpc2l0ZWQnKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHN3aXRjaFRhYih0YWIpIHtcbiAgLy8gQ2xlYXIga2V5Ym9hcmQtZm9jdXNlZCBjYXJkIHN0YXRlIHdoZW4gbGVhdmluZyBhIHJldmlldyB0YWJcbiAgaWYgKHR5cGVvZiByZXNldENhcmRGb2N1cyA9PT0gJ2Z1bmN0aW9uJykgcmVzZXRDYXJkRm9jdXMoKTtcblxuICAvLyBTYXZlIHVuc2F2ZWQgdXNlciBpbnB1dCBmcm9tIHRoZSB0YWIgd2UgYXJlIGxlYXZpbmdcbiAgX3NhdmVEcmFmdElucHV0c0ZvclRhYihzdGF0ZU1hbmFnZXIuZ2V0Q3VycmVudFRhYigpKTtcblxuICAvLyBTeW5jIHNlY29uZC1iYXIgdmlzaWJpbGl0eSB0byB0aGlzIHRhYidzIHN0YWdlXG4gIGxldCBfc3dpdGNoVGFiU3RhZ2UgPSBudWxsO1xuICBpZiAodHlwZW9mIGdldFN0YWdlRm9yVGFiID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB1cGRhdGVUYWJCYXJGb3JTdGFnZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIF9zd2l0Y2hUYWJTdGFnZSA9IGdldFN0YWdlRm9yVGFiKHRhYik7XG4gICAgaWYgKF9zd2l0Y2hUYWJTdGFnZSkge1xuICAgICAgdXBkYXRlVGFiQmFyRm9yU3RhZ2UoX3N3aXRjaFRhYlN0YWdlKTtcbiAgICAgIHVwZGF0ZUFjdGlvbkJ1dHRvbnMoX3N3aXRjaFRhYlN0YWdlKTtcbiAgICB9XG4gIH1cbiAgLy8gQWx3YXlzIHVwZGF0ZSB3b3JrZmxvdyBjbGlja2FibGUgc3RhdGUgdXNpbmcgY3VycmVudCBwaGFzZVxuICBpZiAodHlwZW9mIHN0YXRlTWFuYWdlcj8uZ2V0UGhhc2UgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHVwZGF0ZVdvcmtmbG93U3RlcHNDbGlja2FibGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICB1cGRhdGVXb3JrZmxvd1N0ZXBzQ2xpY2thYmxlKHN0YXRlTWFuYWdlci5nZXRQaGFzZSgpKTtcbiAgfVxuXG4gIC8vIEdBUC0xNiBQYXJ0IEI6IHNob3cvaGlkZSBhbmQgKHJlKXJlbmRlciB0aGUgZWFybHkgQ1YgcHJldmlldyBwYW5lbCBmb3JcbiAgLy8gdGhpcyB0YWIuIHRvZ2dsZUVhcmx5UHJldmlld1BhbmVsJ3Mgb3duIGluLXNjb3BlIGNoZWNrIGRlY2lkZXMgdmlzaWJpbGl0eS5cbiAgaWYgKHR5cGVvZiB0b2dnbGVFYXJseVByZXZpZXdQYW5lbCA9PT0gJ2Z1bmN0aW9uJykgdG9nZ2xlRWFybHlQcmV2aWV3UGFuZWwodGFiKTtcblxuICAvLyBVcGRhdGUgYWN0aXZlIHRhYiwgQVJJQSBzdGF0ZSwgYW5kIHJvdmluZyB0YWJpbmRleCAoV0NBRyAyLjEgdGFibGlzdCBwYXR0ZXJuKVxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudGFiJykuZm9yRWFjaCh0ID0+IHtcbiAgICB0LmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgIHQuc2V0QXR0cmlidXRlKCdhcmlhLXNlbGVjdGVkJywgJ2ZhbHNlJyk7XG4gICAgdC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJy0xJyk7XG4gIH0pO1xuICBjb25zdCBhY3RpdmVUYWIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgdGFiLSR7dGFifWApO1xuICBpZiAoYWN0aXZlVGFiKSB7XG4gICAgYWN0aXZlVGFiLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgIGFjdGl2ZVRhYi5zZXRBdHRyaWJ1dGUoJ2FyaWEtc2VsZWN0ZWQnLCAndHJ1ZScpO1xuICAgIGFjdGl2ZVRhYi5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTtcbiAgICBjb25zdCB0YWJwYW5lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gICAgaWYgKHRhYnBhbmVsKSB0YWJwYW5lbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWxsZWRieScsIGB0YWItJHt0YWJ9YCk7XG4gIH1cbiAgc3RhdGVNYW5hZ2VyLnNldEN1cnJlbnRUYWIodGFiKTtcblxuICAvLyBNYXJrIHRoaXMgdGFiIGFzIHZpc2l0ZWQgYW5kIHJlZnJlc2ggdGhlIHZpc2l0ZWQgaW5kaWNhdG9ycyAoR0FQLTI2OSlcbiAgaWYgKF9DVVNUT01JU0VfVEFCUy5oYXModGFiKSkge1xuICAgIF92aXNpdGVkQ3VzdG9taXNlVGFicy5hZGQodGFiKTtcbiAgICBfdXBkYXRlVmlzaXRlZFRhYkluZGljYXRvcnMoKTtcbiAgfVxuXG4gIC8vIEFubm91bmNlIHRoZSB0YWIgY2hhbmdlIHRvIHNjcmVlbiByZWFkZXJzIChHQVAtNzMpLiBDb21iaW5lZCB3aXRoIHRoZVxuICAvLyBzdGFnZSBuYW1lIChHQVAtMTYgUGFydCBBKSBpbnRvIGEgc2luZ2xlIG1lc3NhZ2UgZnJvbSB0aGlzIG9uZSBjYWxsIHNpdGVcbiAgLy8gXHUyMDE0ICN0YWItc3RhZ2UtbGFiZWwgaXMgYSB2aXNpYmxlLW9ubHkgbGFiZWwsIG5vdCBhIHNlY29uZCBsaXZlIHJlZ2lvbiwgdG9cbiAgLy8gYXZvaWQgYSBkb3VibGUtYW5ub3VuY2Ugb2YgdGhlIHNhbWUgbmF2aWdhdGlvbiBldmVudC5cbiAgY29uc3QgYW5ub3VuY2VyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3dvcmtmbG93LXN0YWdlLWFubm91bmNlcicpO1xuICBpZiAoYW5ub3VuY2VyICYmIGFjdGl2ZVRhYikge1xuICAgIGNvbnN0IHN0YWdlTGFiZWwgPSBfc3dpdGNoVGFiU3RhZ2UgPyBfU1RFUF9ESVNQTEFZW19zd2l0Y2hUYWJTdGFnZV0gOiBudWxsO1xuICAgIGNvbnN0IHRhYkxhYmVsID0gYWN0aXZlVGFiLnRleHRDb250ZW50LnRyaW0oKTtcbiAgICBjb25zdCBtZXNzYWdlID0gc3RhZ2VMYWJlbCA/IGBOb3cgdmlld2luZzogJHtzdGFnZUxhYmVsfSBcdTIwMTQgJHt0YWJMYWJlbH1gIDogYE5vdyB2aWV3aW5nOiAke3RhYkxhYmVsfWA7XG4gICAgYW5ub3VuY2VyLnRleHRDb250ZW50ID0gJyc7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7IGFubm91bmNlci50ZXh0Q29udGVudCA9IG1lc3NhZ2U7IH0sIDUwKTtcbiAgfVxuXG4gIC8vIFN5bmMgdmlldy1jdXJzb3IgcmluZyB0byB0aGUgbmV3bHkgdmlzaWJsZSB0YWJcbiAgaWYgKHR5cGVvZiBfdXBkYXRlVmlld2luZ0luZGljYXRvciA9PT0gJ2Z1bmN0aW9uJykgX3VwZGF0ZVZpZXdpbmdJbmRpY2F0b3IodGFiKTtcblxuICAvLyBBbGwgdGFicyBleGNlcHQgJ2N2JyB1c2UgZnVsbC13aWR0aCBsYXlvdXQgKG5vIHBhcGVyLXNpemVkIGNlbnRlcmluZylcbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIGNvbnRlbnQuY2xhc3NMaXN0LnRvZ2dsZSgnZnVsbC13aWR0aCcsIHRhYiAhPT0gJ2dlbmVyYXRlJyk7XG5cbiAgLy8gTG9hZCBjb250ZW50IGZvciB0YWJcbiAgbG9hZFRhYkNvbnRlbnQodGFiKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9hZFRhYkNvbnRlbnQodGFiKSB7XG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9jdW1lbnQtY29udGVudCcpO1xuICBjb25zdCB0YWJEYXRhID0gZW5zdXJlVGFiRGF0YVN0YXRlKCk7XG5cbiAgdHJ5IHtcbiAgc3dpdGNoICh0YWIpIHtcbiAgICBjYXNlICdqb2InOlxuICAgICAgYXdhaXQgcG9wdWxhdGVKb2JUYWIoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2dvYWxzJzpcbiAgICAgIGlmICh0eXBlb2YgcG9wdWxhdGVHb2Fsc1RhYiA9PT0gJ2Z1bmN0aW9uJykgYXdhaXQgcG9wdWxhdGVHb2Fsc1RhYigpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYW5hbHlzaXMnOlxuICAgICAgaWYgKHRhYkRhdGEuYW5hbHlzaXMpIHtcbiAgICAgICAgcG9wdWxhdGVBbmFseXNpc1RhYih0YWJEYXRhLmFuYWx5c2lzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJlbXB0eS1zdGF0ZVwiPjxkaXYgY2xhc3M9XCJpY29uXCI+XHVEODNEXHVERDBEPC9kaXY+PGgzPkpvYiBBbmFseXNpczwvaDM+PHA+Q2xpY2sgXCJBbmFseXplIEpvYlwiIHRvIGdlbmVyYXRlIGFuYWx5c2lzPC9wPjwvZGl2Pic7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdxdWVzdGlvbnMnOlxuICAgICAgcG9wdWxhdGVRdWVzdGlvbnNUYWIoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2N1c3RvbWl6YXRpb25zJzpcbiAgICAgIHN3aXRjaFRhYignZXhwLXJldmlldycpO1xuICAgICAgcmV0dXJuO1xuICAgIGNhc2UgJ2V4cC1yZXZpZXcnOlxuICAgICAgYXdhaXQgcG9wdWxhdGVSZXZpZXdUYWIoJ2V4cGVyaWVuY2VzJyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdhY2gtZWRpdG9yJzpcbiAgICAgIGF3YWl0IGJ1aWxkQWNoaWV2ZW1lbnRzRWRpdG9yKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdza2lsbHMtcmV2aWV3JzpcbiAgICAgIGF3YWl0IHBvcHVsYXRlUmV2aWV3VGFiKCdza2lsbHMnKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2FjaGlldmVtZW50cy1yZXZpZXcnOlxuICAgICAgYXdhaXQgcG9wdWxhdGVSZXZpZXdUYWIoJ2FjaGlldmVtZW50cycpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndGFnbGluZS1yZXZpZXcnOlxuICAgICAgYXdhaXQgcG9wdWxhdGVUYWdsaW5lUmV2aWV3VGFiKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdzdW1tYXJ5LXJldmlldyc6XG4gICAgICBhd2FpdCBwb3B1bGF0ZVJldmlld1RhYignc3VtbWFyeScpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAncHVibGljYXRpb25zLXJldmlldyc6XG4gICAgICBhd2FpdCBwb3B1bGF0ZVJldmlld1RhYigncHVibGljYXRpb25zJyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdhdHMtc2NvcmUnOlxuICAgICAgaWYgKHR5cGVvZiBwb3B1bGF0ZUF0c1Njb3JlVGFiID09PSAnZnVuY3Rpb24nKSBhd2FpdCBwb3B1bGF0ZUF0c1Njb3JlVGFiKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdyZXdyaXRlJzpcbiAgICAgIGlmICh3aW5kb3cuX3Jld3JpdGVQYW5lbENhY2hlKSB7XG4gICAgICAgIHJlbmRlclJld3JpdGVQYW5lbChcbiAgICAgICAgICB3aW5kb3cuX3Jld3JpdGVQYW5lbENhY2hlLnJld3JpdGVzLFxuICAgICAgICAgIHdpbmRvdy5fcmV3cml0ZVBhbmVsQ2FjaGUud2FybmluZ3MsXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250ZW50LmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwiZW1wdHktc3RhdGVcIj48ZGl2IGNsYXNzPVwiaWNvblwiPlx1MjcwRlx1RkUwRjwvZGl2PjxoMz5SZXdyaXRlczwvaDM+PHA+TG9hZGluZyByZXdyaXRlc1x1MjAyNjwvcD48L2Rpdj4nO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBhcGlDYWxsKCdHRVQnLCAnL2FwaS9yZXdyaXRlcycpO1xuICAgICAgICAgIGlmIChkYXRhLnJld3JpdGVzKSB7XG4gICAgICAgICAgICByZW5kZXJSZXdyaXRlUGFuZWwoZGF0YS5yZXdyaXRlcywgZGF0YS5wZXJzdWFzaW9uX3dhcm5pbmdzIHx8IFtdKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImVtcHR5LXN0YXRlXCI+PGRpdiBjbGFzcz1cImljb25cIj5cdTI3MEZcdUZFMEY8L2Rpdj48aDM+UmV3cml0ZXM8L2gzPjxwPkNvbXBsZXRlIGN1c3RvbWl6YXRpb25zIHRvIHJlYWNoIHRoaXMgc3RlcDwvcD48L2Rpdj4nO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJlbXB0eS1zdGF0ZVwiPjxkaXYgY2xhc3M9XCJpY29uXCI+XHUyNzBGXHVGRTBGPC9kaXY+PGgzPlJld3JpdGVzPC9oMz48cD5Db21wbGV0ZSBjdXN0b21pemF0aW9ucyB0byByZWFjaCB0aGlzIHN0ZXA8L3A+PC9kaXY+JztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZWRpdG9yJzpcbiAgICAgIGF3YWl0IHBvcHVsYXRlQ1ZFZGl0b3JUYWIoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2dlbmVyYXRlJzpcbiAgICAgIF9wb3B1bGF0ZUdlbmVyYXRlVGFiKHRhYkRhdGEuY3YsIGNvbnRlbnQpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZG93bmxvYWQnOlxuICAgICAgaWYgKHRhYkRhdGEuY3YgJiYgT2JqZWN0LmtleXModGFiRGF0YS5jdikubGVuZ3RoID4gMCkge1xuICAgICAgICBhd2FpdCBwb3B1bGF0ZURvd25sb2FkVGFiKHRhYkRhdGEuY3YpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImVtcHR5LXN0YXRlXCI+PGRpdiBjbGFzcz1cImljb25cIj5cdTJCMDdcdUZFMEY8L2Rpdj48aDM+RG93bmxvYWQ8L2gzPjxwPkdlbmVyYXRlIENWIHRvIGVuYWJsZSBkb3dubG9hZHM8L3A+PC9kaXY+JztcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3NwZWxsJzpcbiAgICAgIGF3YWl0IHBvcHVsYXRlU3BlbGxDaGVja1RhYigpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnbGF5b3V0JzpcbiAgICAgIGluaXRpYXRlTGF5b3V0SW5zdHJ1Y3Rpb25zKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdmaW5hbGlzZSc6XG4gICAgICBhd2FpdCBwb3B1bGF0ZUZpbmFsaXNlVGFiKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdoYXJ2ZXN0JzpcbiAgICAgIGlmICh0eXBlb2YgcG9wdWxhdGVIYXJ2ZXN0VGFiID09PSAnZnVuY3Rpb24nKSBhd2FpdCBwb3B1bGF0ZUhhcnZlc3RUYWIoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2ludGVydmlldy1wcmVwJzpcbiAgICAgIGlmICh0eXBlb2YgcG9wdWxhdGVJbnRlcnZpZXdQcmVwVGFiID09PSAnZnVuY3Rpb24nKSBhd2FpdCBwb3B1bGF0ZUludGVydmlld1ByZXBUYWIoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3RoYW5rLXlvdSc6XG4gICAgICBpZiAodHlwZW9mIHBvcHVsYXRlVGhhbmtZb3VUYWIgPT09ICdmdW5jdGlvbicpIGF3YWl0IHBvcHVsYXRlVGhhbmtZb3VUYWIoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ21hc3Rlcic6XG4gICAgICBhd2FpdCBwb3B1bGF0ZU1hc3RlclRhYigpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnY292ZXItbGV0dGVyJzpcbiAgICAgIGF3YWl0IHBvcHVsYXRlQ292ZXJMZXR0ZXJUYWIoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3NjcmVlbmluZyc6XG4gICAgICBhd2FpdCBwb3B1bGF0ZVNjcmVlbmluZ1RhYigpO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cuZXJyb3IoYEVycm9yIGxvYWRpbmcgdGFiICR7dGFifTpgLCBlcnJvcik7XG4gICAgLy8gdGV4dENvbnRlbnQsIG5vdCBpbm5lckhUTUwgXHUyMDE0IGEgdGhyb3duIGVycm9yIG1lc3NhZ2UgbXVzdCBuZXZlciBiZVxuICAgIC8vIGludGVycHJldGVkIGFzIEhUTUwgKGUuZy4gYW4gZXJyb3Igc3RyaW5nIGNvbnRhaW5pbmcgYSBzdHJheSA8aW1nPikuXG4gICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpO1xuICAgIGVycm9yTWVzc2FnZS5zdHlsZS5jc3NUZXh0ID0gJ3BhZGRpbmc6IDIwcHg7IGNvbG9yOiAjYzQxZTNhOyc7XG4gICAgZXJyb3JNZXNzYWdlLnRleHRDb250ZW50ID0gYEVycm9yIGxvYWRpbmcgY29udGVudDogJHtlcnJvci5tZXNzYWdlfWA7XG4gICAgY29udGVudC5hcHBlbmRDaGlsZChlcnJvck1lc3NhZ2UpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFJlc3RvcmUgdW5zYXZlZCB1c2VyIGlucHV0IGZvciB0aGUgbmV3bHkgbG9hZGVkIHRhYlxuICBfcmVzdG9yZURyYWZ0SW5wdXRzRm9yVGFiKHRhYik7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBSZXZpZXcgdGFiIChmbGF0LCBvbmUgcGFuZSBwZXIgdG9wLWxldmVsIHRhYikgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIHNob3dUYWJsZUJhc2VkUmV2aWV3KCkge1xuICBpZiAoIXdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zKSB7XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ05vIHJlY29tbWVuZGF0aW9ucyB0byByZXZpZXcuIFBsZWFzZSBnZW5lcmF0ZSBjdXN0b21pemF0aW9ucyBmaXJzdC4nKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBzd2l0Y2hUYWIoJ2V4cC1yZXZpZXcnKTtcbiAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ1x1MjcwNSBDdXN0b21pemF0aW9ucyBnZW5lcmF0ZWQhIFBsZWFzZSByZXZpZXcgZWFjaCBzZWN0aW9uIGluIHRoZSAqKkN1c3RvbWl6YXRpb25zKiogdGFiIFx1MjAxNCBFeHBlcmllbmNlcywgQWNoaWV2ZW1lbnRzLCBTa2lsbHMsIFN1bW1hcnksIGFuZCBQdWJsaWNhdGlvbnMuIFNlbGVjdCB5b3VyIHByZWZlcmVuY2VzIHVzaW5nIHRoZSBhY3Rpb24gYnV0dG9ucywgdGhlbiBzdWJtaXQgeW91ciBkZWNpc2lvbnMuJyk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBBbmFseXNpcyB0YWIgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8vIENhY2hlZCBzeW5vbnltIG1hcDogYWxpYXMgKGxvd2VyKSBcdTIxOTIgY2Fub25pY2FsLCBhbmQgY2Fub25pY2FsIChsb3dlcikgXHUyMTkyIFthbGlhc2VzXVxubGV0IF9zeW5vbnltTWFwQ2FjaGUgPSBudWxsO1xuYXN5bmMgZnVuY3Rpb24gX2xvYWRTeW5vbnltTWFwKCkge1xuICBpZiAoX3N5bm9ueW1NYXBDYWNoZSkgcmV0dXJuIF9zeW5vbnltTWFwQ2FjaGU7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2Vzc2lvbklkID0gc3RhdGVNYW5hZ2VyLmdldFNlc3Npb25JZCAmJiBzdGF0ZU1hbmFnZXIuZ2V0U2Vzc2lvbklkKCk7XG4gICAgY29uc3QgdXJsID0gc2Vzc2lvbklkID8gYC9hcGkvc3lub255bS1tYXA/c2Vzc2lvbl9pZD0ke2VuY29kZVVSSUNvbXBvbmVudChzZXNzaW9uSWQpfWAgOiAnL2FwaS9zeW5vbnltLW1hcCc7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgaWYgKCFyZXMub2spIHJldHVybiAoX3N5bm9ueW1NYXBDYWNoZSA9IHt9KTtcbiAgICBjb25zdCByYXcgID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBjb25zdCBhbGlhc1RvQ2Fub24gPSB7fTtcbiAgICBjb25zdCBjYW5vblRvQWxpYXNlcyA9IHt9O1xuICAgIE9iamVjdC5lbnRyaWVzKHJhdykuZm9yRWFjaCgoW2FsaWFzLCBjYW5vbl0pID0+IHtcbiAgICAgIGFsaWFzVG9DYW5vblthbGlhcy50b0xvd2VyQ2FzZSgpXSA9IGNhbm9uO1xuICAgICAgY29uc3QgY2wgPSBjYW5vbi50b0xvd2VyQ2FzZSgpO1xuICAgICAgKGNhbm9uVG9BbGlhc2VzW2NsXSA9IGNhbm9uVG9BbGlhc2VzW2NsXSB8fCBbXSkucHVzaChhbGlhcyk7XG4gICAgfSk7XG4gICAgX3N5bm9ueW1NYXBDYWNoZSA9IHsgYWxpYXNUb0Nhbm9uLCBjYW5vblRvQWxpYXNlcyB9O1xuICB9IGNhdGNoIChfKSB7IF9zeW5vbnltTWFwQ2FjaGUgPSB7fTsgfVxuICByZXR1cm4gX3N5bm9ueW1NYXBDYWNoZTtcbn1cblxuZnVuY3Rpb24gX2t3U3lub255bUFubm90YXRpb24oa3csIHN5bk1hcCkge1xuICBpZiAoIXN5bk1hcCB8fCAoIXN5bk1hcC5hbGlhc1RvQ2Fub24gJiYgIXN5bk1hcC5jYW5vblRvQWxpYXNlcykpIHJldHVybiAnJztcbiAgY29uc3Qga2wgPSBrdy50b0xvd2VyQ2FzZSgpO1xuICAvLyBJcyBrdyBhbiBhbGlhcz8gU2hvdyBjYW5vbmljYWwgZm9ybS5cbiAgaWYgKHN5bk1hcC5hbGlhc1RvQ2Fub25ba2xdKSByZXR1cm4gYCA9ICR7c3luTWFwLmFsaWFzVG9DYW5vbltrbF19YDtcbiAgLy8gSXMga3cgYSBjYW5vbmljYWwgZm9ybT8gU2hvdyBhbGlhc2VzLlxuICBjb25zdCBhbGlhc2VzID0gc3luTWFwLmNhbm9uVG9BbGlhc2VzICYmIHN5bk1hcC5jYW5vblRvQWxpYXNlc1trbF07XG4gIGlmIChhbGlhc2VzICYmIGFsaWFzZXMubGVuZ3RoKSByZXR1cm4gYCAoJHthbGlhc2VzLmpvaW4oJywgJyl9KWA7XG4gIHJldHVybiAnJztcbn1cblxuYXN5bmMgZnVuY3Rpb24gcG9wdWxhdGVBbmFseXNpc1RhYihyZXN1bHQpIHtcbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIHRyeSB7XG4gICAgLy8gcmVzdWx0IG1heSBhbHJlYWR5IGJlIGEgcGFyc2VkIG9iamVjdCAoZS5nLiBjb21pbmcgZnJvbSBzdGF0ZU1hbmFnZXIpIG9yIGFcbiAgICAvLyByYXcgSlNPTiBzdHJpbmcuICBjbGVhbkpzb25SZXNwb25zZSBvbmx5IGhhbmRsZXMgc3RyaW5ncywgc28gc2tpcCBpdCB3aGVuXG4gICAgLy8gdGhlIHZhbHVlIGlzIGFscmVhZHkgYW4gb2JqZWN0IHRvIGF2b2lkIFwiY2xlYW5lZC5yZXBsYWNlIGlzIG5vdCBhIGZ1bmN0aW9uXCIuXG4gICAgbGV0IGRhdGE7XG4gICAgaWYgKHJlc3VsdCAhPT0gbnVsbCAmJiB0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0Jykge1xuICAgICAgZGF0YSA9IHJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY2xlYW5SZXN1bHQgPSBjbGVhbkpzb25SZXNwb25zZShyZXN1bHQpO1xuICAgICAgZGF0YSA9IHR5cGVvZiBjbGVhblJlc3VsdCA9PT0gJ3N0cmluZycgPyBKU09OLnBhcnNlKGNsZWFuUmVzdWx0KSA6IGNsZWFuUmVzdWx0O1xuICAgIH1cblxuICAgIC8vIFBlcnNpc3Qgb25seSBhZnRlciB0aGUgYW5hbHlzaXMgcGF5bG9hZCBoYXMgYmVlbiB2YWxpZGF0ZWQuXG4gICAgc3RhdGVNYW5hZ2VyLnNldFRhYkRhdGEoJ2FuYWx5c2lzJywgcmVzdWx0KTtcbiAgICBzYXZlVGFiRGF0YSgpO1xuXG4gICAgLy8gXHUyNTAwXHUyNTAwIFNlY3Rpb24gMTogUm9sZSAmIERvbWFpbiBjYXJkIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIGxldCBodG1sID0gJzxkaXYgY2xhc3M9XCJhbmFseXNpcy1wYWdlXCI+JztcbiAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwiYW5hbHlzaXMtcm9sZS1jYXJkXCI+JztcbiAgICBodG1sICs9IGA8aDE+JHtkYXRhLnRpdGxlIHx8ICdSb2xlJ308L2gxPmA7XG4gICAgaWYgKGRhdGEuY29tcGFueSkgaHRtbCArPSBgPHAgY2xhc3M9XCJjb21wYW55XCI+XHVEODNDXHVERkUyICR7ZGF0YS5jb21wYW55fTwvcD5gO1xuICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJtZXRhXCI+JztcbiAgICBpZiAoZGF0YS5kb21haW4pIHtcbiAgICAgIGNvbnN0IGNvbmYgPSBkYXRhLmRvbWFpbl9jb25maWRlbmNlO1xuICAgICAgbGV0IGNvbmZMYWJlbCA9ICcnO1xuICAgICAgbGV0IGNvbmZUaXRsZSA9ICcnO1xuICAgICAgaWYgKHR5cGVvZiBjb25mID09PSAnbnVtYmVyJykge1xuICAgICAgICBpZiAoY29uZiA+PSAwLjgpIHsgY29uZkxhYmVsID0gJyc7IGNvbmZUaXRsZSA9IGBEb21haW4gY29uZmlkZW5jZTogSGlnaCAoJHtNYXRoLnJvdW5kKGNvbmYgKiAxMDApfSUpYDsgfVxuICAgICAgICBlbHNlIGlmIChjb25mID49IDAuNikgeyBjb25mTGFiZWwgPSAnIFx1MjZBMCc7IGNvbmZUaXRsZSA9IGBEb21haW4gY29uZmlkZW5jZTogTWVkaXVtICgke01hdGgucm91bmQoY29uZiAqIDEwMCl9JSkgXHUyMDE0IHZlcmlmeSB0aGlzIGlzIGNvcnJlY3RgOyB9XG4gICAgICAgIGVsc2UgeyBjb25mTGFiZWwgPSAnIFx1MjZBMCc7IGNvbmZUaXRsZSA9IGBEb21haW4gY29uZmlkZW5jZTogTG93ICgke01hdGgucm91bmQoY29uZiAqIDEwMCl9JSkgXHUyMDE0IHRoZSBKRCBzcGFucyBtdWx0aXBsZSBkb21haW5zOyBjb25zaWRlciBvdmVycmlkaW5nYDsgfVxuICAgICAgfVxuICAgICAgaHRtbCArPSBgPHNwYW4gY2xhc3M9XCJtZXRhLWNoaXBcIiB0aXRsZT1cIiR7ZXNjYXBlSHRtbChjb25mVGl0bGUgfHwgJ0luZmVycmVkIHRlY2huaWNhbCBkb21haW4nKX1cIj5cdUQ4M0RcdUREMkMgJHtlc2NhcGVIdG1sKGRhdGEuZG9tYWluKX0ke2NvbmZMYWJlbH08L3NwYW4+YDtcbiAgICB9XG4gICAgaWYgKGRhdGEucm9sZV9sZXZlbCkgaHRtbCArPSBgPHNwYW4gY2xhc3M9XCJtZXRhLWNoaXBcIj5cdUQ4M0RcdURDQ0EgJHtkYXRhLnJvbGVfbGV2ZWx9PC9zcGFuPmA7XG4gICAgaWYgKGRhdGEuc3VnZ2VzdGVkX3N1bW1hcnkpIGh0bWwgKz0gYDxzcGFuIGNsYXNzPVwibWV0YS1jaGlwXCI+XHVEODNEXHVEQ0FDICR7ZGF0YS5zdWdnZXN0ZWRfc3VtbWFyeX08L3NwYW4+YDtcbiAgICBodG1sICs9ICc8L2Rpdj48L2Rpdj4nO1xuXG4gICAgLy8gXHUyNTAwXHUyNTAwIE1pc21hdGNoIGNhbGxvdXQgKGNvbXB1dGVkIGZyb20gbWFzdGVyIHNraWxscykgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgY29uc3QgcmVxdWlyZWRTa2lsbHMgPSBBcnJheS5pc0FycmF5KGRhdGEucmVxdWlyZWRfc2tpbGxzKSA/IGRhdGEucmVxdWlyZWRfc2tpbGxzIDogW107XG4gICAgY29uc3QgbWFzdGVyU2tpbGxzID0gd2luZG93Ll9tYXN0ZXJTa2lsbHMgfHwgW107XG4gICAgaWYgKHJlcXVpcmVkU2tpbGxzLmxlbmd0aCA+IDAgJiYgbWFzdGVyU2tpbGxzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG1pc3NpbmcgPSByZXF1aXJlZFNraWxscy5maWx0ZXIoc2tpbGwgPT5cbiAgICAgICAgIW1hc3RlclNraWxscy5zb21lKG1zID0+IG1zLmluY2x1ZGVzKHNraWxsLnRvTG93ZXJDYXNlKCkpIHx8IHNraWxsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobXMpKVxuICAgICAgKTtcbiAgICAgIGlmIChtaXNzaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaHRtbCArPSBgPGRpdiBjbGFzcz1cIm1pc21hdGNoLWNhbGxvdXRcIj5cdTI2QTAgPHN0cm9uZz4ke21pc3NpbmcubGVuZ3RofSByZXF1aXJlZCBza2lsbCR7bWlzc2luZy5sZW5ndGggPiAxID8gJ3MnIDogJyd9IG5vdCBmb3VuZCBpbiB5b3VyIG1hc3RlciBDVjo8L3N0cm9uZz4gJHttaXNzaW5nLmpvaW4oJywgJyl9PC9kaXY+YDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgU2VjdGlvbiAyOiBSZXF1aXJlZCBTa2lsbHMgZ3JpZCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICBpZiAocmVxdWlyZWRTa2lsbHMubGVuZ3RoID4gMCkge1xuICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cImFuYWx5c2lzLXNlY3Rpb25cIj48aDI+XHVEODNDXHVERkFGIFJlcXVpcmVkIFNraWxsczwvaDI+PGRpdiBjbGFzcz1cInNraWxsLWdyaWRcIj4nO1xuICAgICAgcmVxdWlyZWRTa2lsbHMuZm9yRWFjaChza2lsbCA9PiB7XG4gICAgICAgIGNvbnN0IGlzTWlzc2luZyA9IG1hc3RlclNraWxscy5sZW5ndGggPiAwICYmICFtYXN0ZXJTa2lsbHMuc29tZShcbiAgICAgICAgICBtcyA9PiBtcy5pbmNsdWRlcyhza2lsbC50b0xvd2VyQ2FzZSgpKSB8fCBza2lsbC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKG1zKVxuICAgICAgICApO1xuICAgICAgICBodG1sICs9IGA8c3BhbiBjbGFzcz1cInNraWxsLWJhZGdlJHtpc01pc3NpbmcgPyAnIG1pc3NpbmcnIDogJyd9XCIgdGl0bGU9XCIke2lzTWlzc2luZyA/ICdOb3QgaW4gbWFzdGVyIENWJyA6ICdGb3VuZCBpbiBtYXN0ZXIgQ1YnfVwiPiR7c2tpbGx9JHtpc01pc3NpbmcgPyAnPHNwYW4gY2xhc3M9XCJzci1vbmx5XCI+IChub3QgaW4gbWFzdGVyIENWKTwvc3Bhbj4nIDogJyd9PC9zcGFuPmA7XG4gICAgICB9KTtcbiAgICAgIGh0bWwgKz0gJzwvZGl2PjwvZGl2Pic7XG4gICAgfVxuXG4gICAgLy8gXHUyNTAwXHUyNTAwIFNlY3Rpb24gMzogUHJlZmVycmVkIC8gTmljZS10by1IYXZlIGxpc3QgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgY29uc3QgcHJlZmVycmVkID0gW1xuICAgICAgLi4uKEFycmF5LmlzQXJyYXkoZGF0YS5wcmVmZXJyZWRfc2tpbGxzKSA/IGRhdGEucHJlZmVycmVkX3NraWxscyA6IFtdKSxcbiAgICAgIC4uLihBcnJheS5pc0FycmF5KGRhdGEubmljZV90b19oYXZlX3JlcXVpcmVtZW50cykgPyBkYXRhLm5pY2VfdG9faGF2ZV9yZXF1aXJlbWVudHMgOiBbXSksXG4gICAgXTtcbiAgICBpZiAocHJlZmVycmVkLmxlbmd0aCA+IDApIHtcbiAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJhbmFseXNpcy1zZWN0aW9uXCI+PGgyPlx1MkI1MCBQcmVmZXJyZWQgLyBOaWNlLXRvLUhhdmU8L2gyPjx1bCBjbGFzcz1cInByZWZlcnJlZC1saXN0XCI+JztcbiAgICAgIHByZWZlcnJlZC5mb3JFYWNoKGl0ZW0gPT4geyBodG1sICs9IGA8bGk+JHtpdGVtfTwvbGk+YDsgfSk7XG4gICAgICBodG1sICs9ICc8L3VsPjwvZGl2Pic7XG4gICAgfVxuXG4gICAgLy8gXHUyNTAwXHUyNTAwIFNlY3Rpb24gNDogQVRTIEtleXdvcmRzIHdpdGggcmFuayBiYWRnZXMgYW5kIHN5bm9ueW0gYW5ub3RhdGlvbnMgXHUyNTAwXHUyNTAwXG4gICAgY29uc3QgYXRzS3dzID0gQXJyYXkuaXNBcnJheShkYXRhLmF0c19rZXl3b3JkcykgPyBkYXRhLmF0c19rZXl3b3JkcyA6IFtdO1xuICAgIGlmIChhdHNLd3MubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgc3luTWFwID0gYXdhaXQgX2xvYWRTeW5vbnltTWFwKCk7XG4gICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwiYW5hbHlzaXMtc2VjdGlvblwiPjxoMj5cdUQ4M0RcdUREMTEgQVRTIEtleXdvcmRzIDxzbWFsbCBzdHlsZT1cImZvbnQtd2VpZ2h0OjQwMDtjb2xvcjojNjQ3NDhiO2ZvbnQtc2l6ZToxMnB4O1wiPihoaWdoZXIgcmFuayA9IGhpZ2hlciBwcmlvcml0eSk8L3NtYWxsPjwvaDI+PGRpdiBjbGFzcz1cImt3LWJhZGdlc1wiPic7XG4gICAgICBhdHNLd3MuZm9yRWFjaCgoa3csIGlkeCkgPT4ge1xuICAgICAgICBjb25zdCBhbm5vdGF0aW9uID0gX2t3U3lub255bUFubm90YXRpb24oa3csIHN5bk1hcCk7XG4gICAgICAgIGNvbnN0IHRpdGxlQXR0ciAgPSBhbm5vdGF0aW9uID8gYCB0aXRsZT1cIlN5bm9ueW06ICR7ZXNjYXBlSHRtbChrdyArIGFubm90YXRpb24pfVwiYCA6ICcnO1xuICAgICAgICBjb25zdCBhbm5vdEh0bWwgID0gYW5ub3RhdGlvbiA/IGA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZToxMHB4O2NvbG9yOiM2NDc0OGI7bWFyZ2luLWxlZnQ6M3B4O1wiPiR7ZXNjYXBlSHRtbChhbm5vdGF0aW9uKX08L3NwYW4+YCA6ICcnO1xuICAgICAgICBodG1sICs9IGA8c3BhbiBjbGFzcz1cImt3LWJhZGdlXCIke3RpdGxlQXR0cn0+PHNwYW4gY2xhc3M9XCJrdy1yYW5rXCI+IyR7aWR4ICsgMX08L3NwYW4+JHtlc2NhcGVIdG1sKGt3KX0ke2Fubm90SHRtbH08L3NwYW4+YDtcbiAgICAgIH0pO1xuICAgICAgaHRtbCArPSAnPC9kaXY+PC9kaXY+JztcbiAgICB9XG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgQ3VsdHVyZSBpbmRpY2F0b3JzIChvcHRpb25hbCkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgY29uc3QgY3VsdHVyZSA9IEFycmF5LmlzQXJyYXkoZGF0YS5jdWx0dXJlX2luZGljYXRvcnMpID8gZGF0YS5jdWx0dXJlX2luZGljYXRvcnMgOiBbXTtcbiAgICBpZiAoY3VsdHVyZS5sZW5ndGggPiAwKSB7XG4gICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwiYW5hbHlzaXMtc2VjdGlvblwiPjxoMj5cdUQ4M0NcdURGRTIgQ3VsdHVyZSBJbmRpY2F0b3JzPC9oMj48dWwgY2xhc3M9XCJwcmVmZXJyZWQtbGlzdFwiPic7XG4gICAgICBjdWx0dXJlLmZvckVhY2goYyA9PiB7IGh0bWwgKz0gYDxsaT4ke2N9PC9saT5gOyB9KTtcbiAgICAgIGh0bWwgKz0gJzwvdWw+PC9kaXY+JztcbiAgICB9XG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgTXVzdC1oYXZlIHJlcXVpcmVtZW50cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICBjb25zdCBtdXN0SGF2ZSA9IEFycmF5LmlzQXJyYXkoZGF0YS5tdXN0X2hhdmVfcmVxdWlyZW1lbnRzKSA/IGRhdGEubXVzdF9oYXZlX3JlcXVpcmVtZW50cyA6IFtdO1xuICAgIGlmIChtdXN0SGF2ZS5sZW5ndGggPiAwKSB7XG4gICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwiYW5hbHlzaXMtc2VjdGlvblwiPjxoMj5cdTI3MDUgTXVzdC1IYXZlIFJlcXVpcmVtZW50czwvaDI+PHVsIGNsYXNzPVwicHJlZmVycmVkLWxpc3RcIj4nO1xuICAgICAgbXVzdEhhdmUuZm9yRWFjaChyID0+IHsgaHRtbCArPSBgPGxpPiR7cn08L2xpPmA7IH0pO1xuICAgICAgaHRtbCArPSAnPC91bD48L2Rpdj4nO1xuICAgIH1cblxuICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJuYXYtYnV0dG9ucyBuYXYtZW5kXCI+PGJ1dHRvbiBjbGFzcz1cImNvbnRpbnVlLWJ0blwiIG9uY2xpY2s9XCJzZW5kQWN0aW9uKFxcdTAwMjdyZWNvbW1lbmRfY3VzdG9taXphdGlvbnNcXHUwMDI3KVwiPkNvbnRpbnVlIHRvIEN1c3RvbWl6YXRpb25zIFx1MjE5MjwvYnV0dG9uPjwvZGl2Pic7XG4gICAgaHRtbCArPSAnPC9kaXY+JzsgLy8gLmFuYWx5c2lzLXBhZ2VcbiAgICBjb250ZW50LmlubmVySFRNTCA9IGh0bWw7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2cuZXJyb3IoJ0FuYWx5c2lzIHBhcnNpbmcgZXJyb3I6JywgZSwgJ09yaWdpbmFsIHJlc3VsdDonLCByZXN1bHQpO1xuICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJlbXB0eS1zdGF0ZVwiPjxkaXYgY2xhc3M9XCJpY29uXCI+XHUyNzRDPC9kaXY+PGgzPkFuYWx5c2lzIEVycm9yPC9oMz48cD5Db3VsZCBub3QgcGFyc2UgYW5hbHlzaXMgcmVzdWx0czogJHtlc2NhcGVIdG1sKGUubWVzc2FnZSl9PC9wPjxkZXRhaWxzPjxzdW1tYXJ5PkRlYnVnIEluZm88L3N1bW1hcnk+PHByZT4ke2VzY2FwZUh0bWwoSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKSl9PC9wcmU+PC9kZXRhaWxzPjwvZGl2PmA7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIEN1c3RvbWl6YXRpb24gcmVzcG9uc2UgaGFuZGxlciBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gaGFuZGxlQ3VzdG9taXphdGlvblJlc3BvbnNlKHJlc3BvbnNlKSB7XG4gIHRyeSB7XG4gICAgLy8gQWNjZXB0IGEgcHJlLXBhcnNlZCBvYmplY3Qgb3IgYSByYXcgc3RyaW5nIChwYXJzZSBhdCBib3VuZGFyeSkuXG4gICAgY29uc3QgZGF0YSA9IChyZXNwb25zZSAhPT0gbnVsbCAmJiB0eXBlb2YgcmVzcG9uc2UgPT09ICdvYmplY3QnKVxuICAgICAgPyByZXNwb25zZVxuICAgICAgOiBleHRyYWN0Rmlyc3RKc29uT2JqZWN0KHJlc3BvbnNlKTtcbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIHR5cGVvZiByZXNwb25zZSA9PT0gJ3N0cmluZycgPyByZXNwb25zZSA6ICcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZGF0YSAmJiAoZGF0YS5yZWNvbW1lbmRlZF9leHBlcmllbmNlcyB8fCBkYXRhLnJlY29tbWVuZGVkX3NraWxscykpIHtcbiAgICAgIHN0YXRlTWFuYWdlci5zZXRUYWJEYXRhKCdjdXN0b21pemF0aW9ucycsIGRhdGEpO1xuICAgICAgd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnMgPSBkYXRhO1xuICAgICAgc2F2ZVRhYkRhdGEoKTtcblxuICAgICAgaWYgKCFpc1JlY29ubmVjdEluUHJvZ3Jlc3MoKSkge1xuICAgICAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCAnXHUyNzA1IEN1c3RvbWl6YXRpb25zIGdlbmVyYXRlZCEgUGxlYXNlIHJldmlldyBlYWNoIHNlY3Rpb24gaW4gdGhlICoqQ3VzdG9taXphdGlvbnMqKiB0YWIgXHUyMDE0IEV4cGVyaWVuY2VzLCBBY2hpZXZlbWVudHMsIFNraWxscywgU3VtbWFyeSwgYW5kIFB1YmxpY2F0aW9ucy4gU2VsZWN0IHlvdXIgcHJlZmVyZW5jZXMgdXNpbmcgdGhlIGFjdGlvbiBidXR0b25zLCB0aGVuIHN1Ym1pdCB5b3VyIGRlY2lzaW9ucy4nKTtcbiAgICAgICAgc3dpdGNoVGFiKCdleHAtcmV2aWV3Jyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghaXNSZWNvbm5lY3RJblByb2dyZXNzKCkpIHtcbiAgICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIHJlc3BvbnNlKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2cuZXJyb3IoJ0N1c3RvbWl6YXRpb24gcmVzcG9uc2UgZXJyb3I6JywgZSk7XG4gICAgaWYgKCFpc1JlY29ubmVjdEluUHJvZ3Jlc3MoKSkge1xuICAgICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgcmVzcG9uc2UpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFN5bmMgdGhlIHNraWxscy10aXRsZSBzZWxlY3QvY3VzdG9tLWlucHV0IGNvbnRyb2xzIHRvIGEgZ2l2ZW4gdGl0bGUgdmFsdWUsXG4gKiBhbmQgYXR0YWNoIGNoYW5nZSBsaXN0ZW5lcnMgc28gdXBkYXRlcyBhcmUgc2F2ZWQgdmlhIHRoZSBBUEkuXG4gKiBkdWNrZmxvdzpcbiAqICAgaWQ6IGdlbmVyYXRpb25fc2V0dGluZ3Mud2ViX3Jldmlld190YWJsZV9iYXNlLkwzMzBcbiAqICAga2luZDogdWlcbiAqICAgdGltZXN0YW1wOiAnMjAyNi0wMy0yN1QwMToyMzoyOFonXG4gKiAgIHN0YXR1czogbGl2ZVxuICogICBoYW5kbGVzOlxuICogICAtIHVpOmdlbmVyYXRpb24tc2V0dGluZ3Muc3luYy1za2lsbHMtdGl0bGVcbiAqICAgY2FsbHM6XG4gKiAgIC0gUE9TVCAvYXBpL2dlbmVyYXRpb24tc2V0dGluZ3NcbiAqICAgcmVhZHM6XG4gKiAgIC0gcmVzcG9uc2U6R0VUIC9hcGkvc3RhdHVzLnNraWxsc19zZWN0aW9uX3RpdGxlXG4gKiAgIHdyaXRlczpcbiAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9nZW5lcmF0aW9uLXNldHRpbmdzLnNraWxsc19zZWN0aW9uX3RpdGxlXG4gKiAgIG5vdGVzOiBLZWVwcyB0aGUgVUkgc2tpbGxzLXRpdGxlIGNvbnRyb2xzIGluIHN5bmMgd2l0aCBzdGF0dXMgZGF0YSBhbmQgcGVyc2lzdHMgdGl0bGUgY2hhbmdlcyBiYWNrIHRvIHRoZSBzZXNzaW9uIHNldHRpbmdzIHJvdXRlLlxuICovXG5mdW5jdGlvbiBfc3luY1NraWxsc1RpdGxlQ29udHJvbHMoY3VycmVudFRpdGxlKSB7XG4gIGNvbnN0IGtub3duT3B0aW9ucyA9IFsnU2tpbGxzJywgJ1RlY2huaWNhbCBTa2lsbHMnLCAnS2V5IFNraWxscycsICdDb3JlIFNraWxscyddO1xuICBjb25zdCBzZWwgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NraWxscy10aXRsZS1zZWxlY3QnKTtcbiAgY29uc3QgY3VzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbHMtdGl0bGUtY3VzdG9tJyk7XG4gIGlmICghc2VsKSByZXR1cm47XG5cbiAgY29uc3QgaXNLbm93biA9IGtub3duT3B0aW9ucy5pbmNsdWRlcyhjdXJyZW50VGl0bGUpO1xuICBpZiAoaXNLbm93bikge1xuICAgIHNlbC52YWx1ZSA9IGN1cnJlbnRUaXRsZTtcbiAgICBpZiAoY3VzdCkgY3VzdC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICB9IGVsc2Uge1xuICAgIHNlbC52YWx1ZSA9ICdfX2N1c3RvbV9fJztcbiAgICBpZiAoY3VzdCkge1xuICAgICAgY3VzdC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICBjdXN0LnZhbHVlID0gY3VycmVudFRpdGxlO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHNhdmVUaXRsZSA9IGFzeW5jICh0aXRsZSkgPT4ge1xuICAgIHRyeSB7IGF3YWl0IGFwaUNhbGwoJ1BPU1QnLCAnL2FwaS9nZW5lcmF0aW9uLXNldHRpbmdzJywgeyBza2lsbHNfc2VjdGlvbl90aXRsZTogdGl0bGUgfSk7IH1cbiAgICBjYXRjaCAoZSkgeyBsb2cud2FybignRmFpbGVkIHRvIHNhdmUgc2tpbGxzX3NlY3Rpb25fdGl0bGUgc2V0dGluZzonLCBlKTsgfVxuICB9O1xuXG4gIHNlbC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgaWYgKHNlbC52YWx1ZSA9PT0gJ19fY3VzdG9tX18nKSB7XG4gICAgICBpZiAoY3VzdCkgeyBjdXN0LnN0eWxlLmRpc3BsYXkgPSAnJzsgY3VzdC5mb2N1cygpOyB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChjdXN0KSBjdXN0LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICBzYXZlVGl0bGUoc2VsLnZhbHVlKTtcbiAgICB9XG4gIH0pO1xuXG4gIGlmIChjdXN0KSB7XG4gICAgY3VzdC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCB2ID0gY3VzdC52YWx1ZS50cmltKCk7XG4gICAgICBpZiAodikgc2F2ZVRpdGxlKHYpO1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogUmVuZGVycyBvbmUgb2YgdGhlIDUgcmV2aWV3IHBhbmVzIGFzIGEgdG9wLWxldmVsIHRhYi5cbiAqIFJlcGxhY2VzIHRoZSBvbGQgc3ViLXRhYiBhcHByb2FjaCB3aXRoIGEgZmxhdCBzaW5nbGUtbGV2ZWwgdGFiIHN0cnVjdHVyZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcG9wdWxhdGVSZXZpZXdUYWIocGFuZSkge1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgY29uc3QgY3VzdG9taXphdGlvbnMgPSBzdGF0ZU1hbmFnZXIuZ2V0VGFiRGF0YSgnY3VzdG9taXphdGlvbnMnKTtcblxuICBpZiAoIXdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zIHx8ICFjdXN0b21pemF0aW9ucykge1xuICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJlbXB0eS1zdGF0ZVwiPjxkaXYgY2xhc3M9XCJpY29uXCI+XHUyNjk5XHVGRTBGPC9kaXY+PGgzPlJldmlldyBDdXN0b21pemF0aW9uczwvaDM+PHA+Q2xpY2sgXCJSZWNvbW1lbmQgQ3VzdG9taXphdGlvbnNcIiB0byBnZW5lcmF0ZSByZWNvbW1lbmRhdGlvbnMuPC9wPjwvZGl2Pic7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcGFuZUNvbmZpZyA9IHtcbiAgICBleHBlcmllbmNlczogICB7IHRpdGxlOiAnJywgZGVzYzogJ1NvcnRlZCBieSBkYXRlIChtb3N0IHJlY2VudCBmaXJzdCkuIENsaWNrIGFjdGlvbiBidXR0b25zIHRvIG92ZXJyaWRlIHJlY29tbWVuZGF0aW9ucy4nLCAgICAgICAgIGNvbnRhaW5lcjogJ2V4cGVyaWVuY2UtdGFibGUtY29udGFpbmVyJyAgIH0sXG4gICAgc2tpbGxzOiAgICAgICAgeyB0aXRsZTogJ1x1RDgzRFx1REVFMFx1RkUwRiBTa2lsbHMnLCAgICAgICAgICAgZGVzYzogJ1NvcnRlZCBieSByZWxldmFuY2UuIFNlbGVjdCBob3cgdG8gZmVhdHVyZSBlYWNoIHNraWxsLicsICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXI6ICdza2lsbHMtdGFibGUtY29udGFpbmVyJyAgICAgICB9LFxuICAgIGFjaGlldmVtZW50czogIHsgdGl0bGU6ICdcdUQ4M0NcdURGQzYgQWNoaWV2ZW1lbnRzJywgICAgICBkZXNjOiAnU2VsZWN0IGhvdyB0byBmZWF0dXJlIGVhY2gga2V5IGFjaGlldmVtZW50LiBBSSByZWNvbW1lbmRhdGlvbnMgYXJlIHByZS1zZWxlY3RlZC4nLCAgY29udGFpbmVyOiAnYWNoaWV2ZW1lbnRzLXRhYmxlLWNvbnRhaW5lcicgIH0sXG4gICAgc3VtbWFyeTogICAgICAgeyB0aXRsZTogJ1x1RDgzRFx1RENERCBQcm9mZXNzaW9uYWwgU3VtbWFyeScsIGRlc2M6ICdTZWxlY3Qgd2hpY2ggcHJvZmVzc2lvbmFsIHN1bW1hcnkgdG8gdXNlLiBUaGUgQUlcXCdzIHJlY29tbWVuZGF0aW9uIGlzIHByZS1zZWxlY3RlZC4nLCBjb250YWluZXI6ICdzdW1tYXJ5LWZvY3VzLWNvbnRhaW5lcicgICAgfSxcbiAgICBwdWJsaWNhdGlvbnM6ICB7IHRpdGxlOiAnXHVEODNEXHVEQ0M0IFB1YmxpY2F0aW9ucycsICAgICAgZGVzYzogJ0FsbCBwdWJsaWNhdGlvbnMgcmFua2VkIGJ5IHJlbGV2YW5jZS4gQWNjZXB0IG9yIHJlamVjdCBlYWNoIGZvciB5b3VyIENWLicsICAgICAgICAgIGNvbnRhaW5lcjogJ3B1YmxpY2F0aW9ucy10YWJsZS1jb250YWluZXInIH0sXG4gIH07XG4gIGNvbnN0IGNmZyA9IHBhbmVDb25maWdbcGFuZV0gfHwge307XG5cbiAgY29uc3QgaGVhZGVySHRtbCA9IHBhbmUgPT09ICdleHBlcmllbmNlcycgPyBgXG4gICAgPGgxPlx1MjY5OVx1RkUwRiBSZXZpZXcgQ3VzdG9taXphdGlvbiBSZWNvbW1lbmRhdGlvbnM8L2gxPlxuICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDttYXJnaW4tYm90dG9tOjE2cHg7XCI+UmV2aWV3IHRoZSBBSSdzIHJlY29tbWVuZGF0aW9ucy4gVXNlIHRoZSBhY3Rpb24gYnV0dG9ucyB0byBhZGp1c3QgZWFjaCBpdGVtLCB0aGVuIHNhdmUgeW91ciBkZWNpc2lvbnMgYmVmb3JlIGdlbmVyYXRpbmcgdGhlIENWLjwvcD5cbiAgICA8ZGl2IGlkPVwicGFnZS1lc3RpbWF0ZS13aWRnZXRcIiBjbGFzcz1cInBhZ2UtZXN0aW1hdGUgb2tcIj5cbiAgICAgIDxzcGFuIGlkPVwicGUtaWNvblwiPlx1RDgzRFx1RENDNDwvc3Bhbj5cbiAgICAgIDxzcGFuIGlkPVwicGUtbGFiZWxcIj5Fc3RpbWF0ZWQgbGVuZ3RoOiBjYWxjdWxhdGluZ1x1MjAyNjwvc3Bhbj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwZS1iYXJcIj48ZGl2IGNsYXNzPVwicGUtZmlsbFwiIGlkPVwicGUtZmlsbFwiIHN0eWxlPVwid2lkdGg6MCU7YmFja2dyb3VuZDojODZlZmFjO1wiPjwvZGl2PjwvZGl2PlxuICAgIDwvZGl2PlxuICBgIDogKGNmZy50aXRsZSA/IGA8aDIgc3R5bGU9XCJtYXJnaW46MCAwIDEycHg7XCI+JHtjZmcudGl0bGV9PC9oMj5gIDogJycpO1xuXG4gIGNvbnN0IG5hdkJhY2sgPSB7XG4gICAgc2tpbGxzOiAgICAgICBgPGJ1dHRvbiBjbGFzcz1cImJhY2stYnRuXCIgb25jbGljaz1cInN3aXRjaFRhYignYWNoLWVkaXRvcicpXCI+XHUyMTkwIEJhY2sgdG8gRXhwZXJpZW5jZSBCdWxsZXRzPC9idXR0b24+YCxcbiAgICBhY2hpZXZlbWVudHM6IGA8YnV0dG9uIGNsYXNzPVwiYmFjay1idG5cIiBvbmNsaWNrPVwic3dpdGNoVGFiKCdza2lsbHMtcmV2aWV3JylcIj5cdTIxOTAgQmFjayB0byBTa2lsbHM8L2J1dHRvbj5gLFxuICAgIHB1YmxpY2F0aW9uczogYDxidXR0b24gY2xhc3M9XCJiYWNrLWJ0blwiIG9uY2xpY2s9XCJzd2l0Y2hUYWIoJ3N1bW1hcnktcmV2aWV3JylcIj5cdTIxOTAgQmFjayB0byBTdW1tYXJ5PC9idXR0b24+YCxcbiAgfTtcbiAgY29uc3QgbmF2Q29udGludWUgPSB7XG4gICAgZXhwZXJpZW5jZXM6ICBgPGJ1dHRvbiBjbGFzcz1cImNvbnRpbnVlLWJ0blwiIG9uY2xpY2s9XCJzdWJtaXRFeHBlcmllbmNlRGVjaXNpb25zKClcIj5Db250aW51ZSB0byBFeHBlcmllbmNlIEJ1bGxldHMgXHUyMTkyPC9idXR0b24+YCxcbiAgICBza2lsbHM6ICAgICAgIGA8YnV0dG9uIGNsYXNzPVwiY29udGludWUtYnRuXCIgb25jbGljaz1cInN1Ym1pdFNraWxsRGVjaXNpb25zKClcIj5Db250aW51ZSB0byBBY2hpZXZlbWVudHMgXHUyMTkyPC9idXR0b24+YCxcbiAgICBhY2hpZXZlbWVudHM6IGA8YnV0dG9uIGNsYXNzPVwiY29udGludWUtYnRuXCIgb25jbGljaz1cInN1Ym1pdEFjaGlldmVtZW50RGVjaXNpb25zKClcIj5Db250aW51ZSB0byBUYWdsaW5lIFx1MjE5MjwvYnV0dG9uPmAsXG4gICAgcHVibGljYXRpb25zOiBgPGJ1dHRvbiBjbGFzcz1cImNvbnRpbnVlLWJ0blwiIG9uY2xpY2s9XCJzdWJtaXRQdWJsaWNhdGlvbkRlY2lzaW9ucygpXCI+Q29udGludWUgdG8gUmV3cml0ZSBcdTIxOTI8L2J1dHRvbj5gLFxuICB9O1xuICBjb25zdCBuYXZIdG1sID0gcGFuZSA9PT0gJ3N1bW1hcnknID8gJycgOiBgXG4gICAgPGRpdiBjbGFzcz1cIm5hdi1idXR0b25zJHtwYW5lID09PSAnZXhwZXJpZW5jZXMnID8gJyBuYXYtZW5kJyA6ICcnfVwiIHN0eWxlPVwibWFyZ2luOjE2cHggMDtcIj5cbiAgICAgICR7bmF2QmFja1twYW5lXSB8fCAnJ31cbiAgICAgICR7bmF2Q29udGludWVbcGFuZV0gfHwgJyd9XG4gICAgPC9kaXY+YDtcblxuICBjb250ZW50LmlubmVySFRNTCA9IGBcbiAgICAke2hlYWRlckh0bWx9XG4gICAgJHtjZmcuZGVzYyA/IGA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7Zm9udC1zaXplOjAuOTVlbTttYXJnaW4tYm90dG9tOjE2cHg7XCI+JHtlc2NhcGVIdG1sKGNmZy5kZXNjKX08L3A+YCA6ICcnfVxuICAgIDxkaXYgaWQ9XCIke2NmZy5jb250YWluZXJ9XCI+PC9kaXY+XG4gICAgJHtuYXZIdG1sfVxuICBgO1xuXG4gIHdpbmRvdy5fYWN0aXZlUmV2aWV3UGFuZSA9IHBhbmU7XG4gIHN3aXRjaCAocGFuZSkge1xuICAgIGNhc2UgJ2V4cGVyaWVuY2VzJzpcbiAgICAgIGF3YWl0IGJ1aWxkRXhwZXJpZW5jZVJldmlld1RhYmxlKCk7XG4gICAgICBfdXBkYXRlUGFnZUVzdGltYXRlKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdza2lsbHMnOlxuICAgICAgYXdhaXQgYnVpbGRTa2lsbHNSZXZpZXdUYWJsZSgpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYWNoaWV2ZW1lbnRzJzpcbiAgICAgIGF3YWl0IGJ1aWxkQWNoaWV2ZW1lbnRzUmV2aWV3VGFibGUoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3N1bW1hcnknOlxuICAgICAgYXdhaXQgYnVpbGRTdW1tYXJ5Rm9jdXNTZWN0aW9uKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdwdWJsaWNhdGlvbnMnOlxuICAgICAgYXdhaXQgYnVpbGRQdWJsaWNhdGlvbnNSZXZpZXdUYWJsZSgpO1xuICAgICAgYnJlYWs7XG4gIH1cbn1cblxuLy8gVHJhY2sgd2hpY2ggcGFuZSBpcyBjdXJyZW50bHkgYWN0aXZlXG53aW5kb3cuX2FjdGl2ZVJldmlld1BhbmUgPSAnZXhwZXJpZW5jZXMnO1xuXG5hc3luYyBmdW5jdGlvbiBzd2l0Y2hSZXZpZXdTdWJ0YWIocGFuZSkge1xuICAvLyBVcGRhdGUgYnV0dG9uIHN0YXRlc1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucmV2aWV3LXN1YnRhYicpLmZvckVhY2goYnRuID0+IHtcbiAgICBidG4uY2xhc3NMaXN0LnRvZ2dsZSgnYWN0aXZlJywgYnRuLmRhdGFzZXQucGFuZSA9PT0gcGFuZSk7XG4gIH0pO1xuXG4gIC8vIEhpZGUgYWxsIHBhbmVzLCBzaG93IHRoZSBzZWxlY3RlZCBvbmVcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnJldmlldy1wYW5lJykuZm9yRWFjaChwID0+IHAuc3R5bGUuZGlzcGxheSA9ICdub25lJyk7XG4gIGNvbnN0IHRhcmdldCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGByZXZpZXctcGFuZS0ke3BhbmV9YCk7XG4gIGlmICh0YXJnZXQpIHRhcmdldC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcblxuICB3aW5kb3cuX2FjdGl2ZVJldmlld1BhbmUgPSBwYW5lO1xuXG4gIC8vIExhenktbG9hZCBwYW5lIGNvbnRlbnQgb24gZmlyc3QgdmlzaXRcbiAgaWYgKCF3aW5kb3cuX3Jldmlld1BhbmVMb2FkZWQgfHwgIXdpbmRvdy5fcmV2aWV3UGFuZUxvYWRlZFtwYW5lXSkge1xuICAgIGF3YWl0IF9sb2FkUmV2aWV3UGFuZShwYW5lKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBfbG9hZFJldmlld1BhbmUocGFuZSkge1xuICBpZiAoIXdpbmRvdy5fcmV2aWV3UGFuZUxvYWRlZCkgd2luZG93Ll9yZXZpZXdQYW5lTG9hZGVkID0ge307XG4gIHRyeSB7XG4gICAgc3dpdGNoIChwYW5lKSB7XG4gICAgICBjYXNlICdleHBlcmllbmNlcyc6ICAgYXdhaXQgYnVpbGRFeHBlcmllbmNlUmV2aWV3VGFibGUoKTsgIGJyZWFrO1xuICAgICAgY2FzZSAnc2tpbGxzJzogICAgICAgIGF3YWl0IGJ1aWxkU2tpbGxzUmV2aWV3VGFibGUoKTsgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdhY2hpZXZlbWVudHMnOiAgYXdhaXQgYnVpbGRBY2hpZXZlbWVudHNSZXZpZXdUYWJsZSgpOyBicmVhaztcbiAgICAgIGNhc2UgJ3N1bW1hcnknOiAgICAgICBhd2FpdCBidWlsZFN1bW1hcnlGb2N1c1NlY3Rpb24oKTsgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncHVibGljYXRpb25zJzogIGF3YWl0IGJ1aWxkUHVibGljYXRpb25zUmV2aWV3VGFibGUoKTsgYnJlYWs7XG4gICAgICBkZWZhdWx0OiByZXR1cm47XG4gICAgfVxuICAgIHdpbmRvdy5fcmV2aWV3UGFuZUxvYWRlZFtwYW5lXSA9IHRydWU7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgZGVsZXRlIHdpbmRvdy5fcmV2aWV3UGFuZUxvYWRlZFtwYW5lXTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgUGFnZS1lc3RpbWF0ZSB3aWRnZXQgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIF91cGRhdGVQYWdlRXN0aW1hdGUoKSB7XG4gIGNvbnN0IHdpZGdldCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYWdlLWVzdGltYXRlLXdpZGdldCcpO1xuICBpZiAoIXdpZGdldCkgcmV0dXJuO1xuXG4gIGNvbnN0IGxhYmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BlLWxhYmVsJyk7XG4gIGNvbnN0IGZpbGwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGUtZmlsbCcpO1xuICBjb25zdCBpY29uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BlLWljb24nKTtcblxuICBpZiAobGFiZWwpIGxhYmVsLnRleHRDb250ZW50ID0gJ1VwZGF0aW5nIHNlcnZlciBsYXlvdXQgZXN0aW1hdGVcdTIwMjYnO1xuICBpZiAoZmlsbCkgZmlsbC5zdHlsZS53aWR0aCA9ICcwJSc7XG4gIGlmIChpY29uKSBpY29uLnRleHRDb250ZW50ID0gJ1x1MjNGMyc7XG5cbiAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICBleHBlcmllbmNlX2RlY2lzaW9uczoge1xuICAgICAgLi4uKCh3aW5kb3cuX3NhdmVkRGVjaXNpb25zICYmIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMuZXhwZXJpZW5jZV9kZWNpc2lvbnMpIHx8IHt9KSxcbiAgICAgIC4uLih1c2VyU2VsZWN0aW9ucy5leHBlcmllbmNlcyB8fCB7fSksXG4gICAgfSxcbiAgICBza2lsbF9kZWNpc2lvbnM6IHtcbiAgICAgIC4uLigod2luZG93Ll9zYXZlZERlY2lzaW9ucyAmJiB3aW5kb3cuX3NhdmVkRGVjaXNpb25zLnNraWxsX2RlY2lzaW9ucykgfHwge30pLFxuICAgICAgLi4uKHVzZXJTZWxlY3Rpb25zLnNraWxscyB8fCB7fSksXG4gICAgfSxcbiAgICBhY2hpZXZlbWVudF9kZWNpc2lvbnM6IChcbiAgICAgICh3aW5kb3cuX3NhdmVkRGVjaXNpb25zICYmIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMuYWNoaWV2ZW1lbnRfZGVjaXNpb25zKVxuICAgICAgfHwgd2luZG93LmFjaGlldmVtZW50RGVjaXNpb25zXG4gICAgICB8fCB7fVxuICAgICksXG4gICAgcHVibGljYXRpb25fZGVjaXNpb25zOiAoXG4gICAgICAod2luZG93Ll9zYXZlZERlY2lzaW9ucyAmJiB3aW5kb3cuX3NhdmVkRGVjaXNpb25zLnB1YmxpY2F0aW9uX2RlY2lzaW9ucylcbiAgICAgIHx8IHdpbmRvdy5wdWJsaWNhdGlvbkRlY2lzaW9uc1xuICAgICAgfHwge31cbiAgICApLFxuICAgIHN1bW1hcnlfZm9jdXNfb3ZlcnJpZGU6IHdpbmRvdy5zZWxlY3RlZFN1bW1hcnlLZXkgfHwgbnVsbCxcbiAgfTtcblxuICBjb25zdCByZXF1ZXN0SWQgPSArK3BhZ2VFc3RpbWF0ZVJlcXVlc3RJZDtcbiAgY2xlYXJUaW1lb3V0KHBhZ2VFc3RpbWF0ZVRpbWVyKTtcbiAgcGFnZUVzdGltYXRlVGltZXIgPSBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBhcGlDYWxsKCdQT1NUJywgJy9hcGkvY3YvbGF5b3V0LWVzdGltYXRlJywgcGF5bG9hZCk7XG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB0aHJvdyBuZXcgRXJyb3IocmVzcG9uc2UuZXJyb3IgfHwgJ2VzdGltYXRlIGZhaWxlZCcpO1xuICAgICAgaWYgKHJlcXVlc3RJZCAhPT0gcGFnZUVzdGltYXRlUmVxdWVzdElkKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHBhZ2VzID0gTnVtYmVyKHJlc3BvbnNlLnBhZ2VfY291bnRfZXN0aW1hdGUgfHwgMCk7XG4gICAgICBjb25zdCBwY3QgPSBNYXRoLm1pbigxMDAsIChwYWdlcyAvIDMpICogMTAwKTtcbiAgICAgIGNvbnN0IGNvbmZpZGVuY2UgPSBOdW1iZXIocmVzcG9uc2UucGFnZV9jb3VudF9jb25maWRlbmNlIHx8IDApO1xuXG4gICAgICBsZXQgY2xzID0gJ29rJztcbiAgICAgIGxldCBjb2xvdXIgPSAnIzIyYzU1ZSc7XG4gICAgICBsZXQgaWNvblRleHQgPSByZXNwb25zZS5wYWdlX2NvdW50X2V4YWN0ICE9IG51bGwgPyAnXHUyNzA1JyA6ICdcdUQ4M0RcdURDQzQnO1xuICAgICAgaWYgKHJlc3BvbnNlLnBhZ2VfbGVuZ3RoX3dhcm5pbmcpIHtcbiAgICAgICAgY2xzID0gcGFnZXMgPiAzID8gJ292ZXInIDogJ3dhcm4nO1xuICAgICAgICBjb2xvdXIgPSBwYWdlcyA+IDMgPyAnI2VmNDQ0NCcgOiAnI2Y1OWUwYic7XG4gICAgICAgIGljb25UZXh0ID0gcGFnZXMgPiAzID8gJ1x1RDgzRFx1REVBOCcgOiAnXHUyNkEwXHVGRTBGJztcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc291cmNlTGFiZWwgPSByZXNwb25zZS5wYWdlX2NvdW50X2V4YWN0ICE9IG51bGxcbiAgICAgICAgPyBgRXhhY3Q6ICR7cmVzcG9uc2UucGFnZV9jb3VudF9leGFjdH0gcGFnZSR7cmVzcG9uc2UucGFnZV9jb3VudF9leGFjdCA9PT0gMSA/ICcnIDogJ3MnfWBcbiAgICAgICAgOiBgRXN0aW1hdGVkOiAke3BhZ2VzLnRvRml4ZWQoMSl9IHBhZ2VzYDtcbiAgICAgIGNvbnN0IGNvbmZpZGVuY2VMYWJlbCA9IHJlc3BvbnNlLnBhZ2VfY291bnRfZXhhY3QgIT0gbnVsbFxuICAgICAgICA/ICcnXG4gICAgICAgIDogYCAoJHtNYXRoLnJvdW5kKGNvbmZpZGVuY2UgKiAxMDApfSUgY29uZmlkZW5jZSlgO1xuICAgICAgY29uc3QgY29udHJpYnV0b3JUZXh0ID0gQXJyYXkuaXNBcnJheShyZXNwb25zZS5jb250cmlidXRvcnMpICYmIHJlc3BvbnNlLmNvbnRyaWJ1dG9ycy5sZW5ndGggPiAwXG4gICAgICAgID8gYCAke3Jlc3BvbnNlLmNvbnRyaWJ1dG9yc1swXX0uYFxuICAgICAgICA6ICcnO1xuICAgICAgY29uc3QgcmVjaGVja1RleHQgPSByZXNwb25zZS5wYWdlX2NvdW50X25lZWRzX2V4YWN0X3JlY2hlY2sgJiYgcmVzcG9uc2UucGFnZV9jb3VudF9leGFjdCA9PSBudWxsXG4gICAgICAgID8gJyBFeGFjdCByZWNoZWNrIHJlY29tbWVuZGVkLidcbiAgICAgICAgOiAnJztcblxuICAgICAgd2lkZ2V0LmNsYXNzTmFtZSA9IGBwYWdlLWVzdGltYXRlICR7Y2xzfWA7XG4gICAgICBpZiAobGFiZWwpIHtcbiAgICAgICAgbGFiZWwudGV4dENvbnRlbnQgPSBgJHtzb3VyY2VMYWJlbH0ke2NvbmZpZGVuY2VMYWJlbH0uJHtjb250cmlidXRvclRleHR9JHtyZWNoZWNrVGV4dH1gLnRyaW0oKTtcbiAgICAgIH1cbiAgICAgIGlmIChmaWxsKSB7XG4gICAgICAgIGZpbGwuc3R5bGUud2lkdGggPSBgJHtwY3R9JWA7XG4gICAgICAgIGZpbGwuc3R5bGUuYmFja2dyb3VuZCA9IGNvbG91cjtcbiAgICAgIH1cbiAgICAgIGlmIChpY29uKSBpY29uLnRleHRDb250ZW50ID0gaWNvblRleHQ7XG5cbiAgICAgIHN0YXRlTWFuYWdlci5zZXRHZW5lcmF0aW9uU3RhdGUoe1xuICAgICAgICBwYWdlQ291bnRFc3RpbWF0ZTogcmVzcG9uc2UucGFnZV9jb3VudF9lc3RpbWF0ZSA/PyBudWxsLFxuICAgICAgICBwYWdlQ291bnRFeGFjdDogcmVzcG9uc2UucGFnZV9jb3VudF9leGFjdCA/PyBudWxsLFxuICAgICAgICBwYWdlQ291bnRDb25maWRlbmNlOiByZXNwb25zZS5wYWdlX2NvdW50X2NvbmZpZGVuY2UgPz8gbnVsbCxcbiAgICAgICAgcGFnZUNvdW50U291cmNlOiByZXNwb25zZS5wYWdlX2NvdW50X3NvdXJjZSB8fCBudWxsLFxuICAgICAgICBwYWdlTmVlZHNFeGFjdFJlY2hlY2s6IEJvb2xlYW4ocmVzcG9uc2UucGFnZV9jb3VudF9uZWVkc19leGFjdF9yZWNoZWNrKSxcbiAgICAgICAgcGFnZVdhcm5pbmc6IEJvb2xlYW4ocmVzcG9uc2UucGFnZV9sZW5ndGhfd2FybmluZyksXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKHJlcXVlc3RJZCAhPT0gcGFnZUVzdGltYXRlUmVxdWVzdElkKSByZXR1cm47XG4gICAgICB3aWRnZXQuY2xhc3NOYW1lID0gJ3BhZ2UtZXN0aW1hdGUgd2Fybic7XG4gICAgICBpZiAobGFiZWwpIGxhYmVsLnRleHRDb250ZW50ID0gYExheW91dCBlc3RpbWF0ZSB1bmF2YWlsYWJsZTogJHtlcnJvci5tZXNzYWdlfWA7XG4gICAgICBpZiAoZmlsbCkge1xuICAgICAgICBmaWxsLnN0eWxlLndpZHRoID0gJzAlJztcbiAgICAgICAgZmlsbC5zdHlsZS5iYWNrZ3JvdW5kID0gJyNmNTllMGInO1xuICAgICAgfVxuICAgICAgaWYgKGljb24pIGljb24udGV4dENvbnRlbnQgPSAnXHUyNkEwXHVGRTBGJztcbiAgICB9XG4gIH0sIDI1MCk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBTaGFyZWQgYWN0aW9uIGNsaWNrIGhhbmRsZXJzIChleHBlcmllbmNlICsgc2tpbGxzIHRhYmxlcykgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIGhhbmRsZUFjdGlvbkNsaWNrKGl0ZW1JZCwgYWN0aW9uLCB0eXBlKSB7XG4gIC8vIFJlbW92ZSBhY3RpdmUgY2xhc3MgZnJvbSBhbGwgYnV0dG9ucyBpbiB0aGlzIHJvd1xuICBjb25zdCByb3cgPSB0eXBlID09PSAnZXhwZXJpZW5jZSdcbiAgICA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYHRyW2RhdGEtZXhwLWlkPVwiJHtpdGVtSWR9XCJdYClcbiAgICA6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYHRyW2RhdGEtc2tpbGw9XCIke2l0ZW1JZH1cIl1gKTtcblxuICBjb25zdCBidXR0b25zID0gcm93LnF1ZXJ5U2VsZWN0b3JBbGwoJy5pY29uLWJ0bicpO1xuICBidXR0b25zLmZvckVhY2goYnRuID0+IHtcbiAgICBidG4uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gICAgaWYgKGJ0bi5oYXNBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcpKSBidG4uc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCAnZmFsc2UnKTtcbiAgfSk7XG5cbiAgLy8gQWRkIGFjdGl2ZSBjbGFzcyB0byBjbGlja2VkIGJ1dHRvblxuICBjb25zdCBjbGlja2VkQnRuID0gcm93LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWFjdGlvbj1cIiR7YWN0aW9ufVwiXWApO1xuICBjbGlja2VkQnRuLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICBpZiAoY2xpY2tlZEJ0bi5oYXNBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcpKSBjbGlja2VkQnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJywgJ3RydWUnKTtcblxuICAvLyBTdG9yZSBzZWxlY3Rpb24gYW5kIHJlY29yZCBleHBsaWNpdCByZXZpZXdcbiAgaWYgKHR5cGUgPT09ICdleHBlcmllbmNlJykge1xuICAgIHVzZXJTZWxlY3Rpb25zLmV4cGVyaWVuY2VzW2l0ZW1JZF0gPSBhY3Rpb247XG4gICAgd2luZG93Ll9leHBsaWNpdGx5UmV2aWV3ZWQgPSB3aW5kb3cuX2V4cGxpY2l0bHlSZXZpZXdlZCB8fCB7IGV4cGVyaWVuY2VzOiBuZXcgU2V0KCksIHNraWxsczogbmV3IFNldCgpIH07XG4gICAgd2luZG93Ll9leHBsaWNpdGx5UmV2aWV3ZWQuZXhwZXJpZW5jZXMuYWRkKGl0ZW1JZCk7XG4gIH0gZWxzZSB7XG4gICAgdXNlclNlbGVjdGlvbnMuc2tpbGxzW2l0ZW1JZF0gPSBhY3Rpb247XG4gICAgd2luZG93Ll9leHBsaWNpdGx5UmV2aWV3ZWQgPSB3aW5kb3cuX2V4cGxpY2l0bHlSZXZpZXdlZCB8fCB7IGV4cGVyaWVuY2VzOiBuZXcgU2V0KCksIHNraWxsczogbmV3IFNldCgpIH07XG4gICAgd2luZG93Ll9leHBsaWNpdGx5UmV2aWV3ZWQuc2tpbGxzLmFkZChpdGVtSWQpO1xuICB9XG4gIF91cGRhdGVQYWdlRXN0aW1hdGUoKTtcbn1cblxuLyoqXG4gKiBBcHBseSBhIGJ1bGsgYWN0aW9uIHRvIGFsbCB2aXNpYmxlIChEYXRhVGFibGUtZmlsdGVyZWQpIHJvd3MgaW4gb25lIHRhYmxlLlxuICogYWN0aW9uOiAnZW1waGFzaXplJyB8ICdpbmNsdWRlJyB8ICdkZS1lbXBoYXNpemUnIHwgJ2V4Y2x1ZGUnIHwgJ3JlY29tbWVuZGVkJ1xuICogdHlwZTogICAnZXhwZXJpZW5jZScgfCAnc2tpbGwnXG4gKi9cbmZ1bmN0aW9uIGJ1bGtBY3Rpb24oYWN0aW9uLCB0eXBlKSB7XG4gIGNvbnN0IHRhYmxlSWQgID0gdHlwZSA9PT0gJ2V4cGVyaWVuY2UnID8gJyNleHBlcmllbmNlLXJldmlldy10YWJsZScgOiAnI3NraWxscy1yZXZpZXctdGFibGUnO1xuICBjb25zdCBkYXRhICAgICA9IHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zIHx8IHt9O1xuICBjb25zdCBkdCAgICAgICA9ICQuZm4uRGF0YVRhYmxlLmlzRGF0YVRhYmxlKHRhYmxlSWQpID8gJCh0YWJsZUlkKS5EYXRhVGFibGUoKSA6IG51bGw7XG5cbiAgLy8gSXRlcmF0ZSBvbmx5IHRoZSByb3dzIHRoYXQgRGF0YVRhYmxlIGN1cnJlbnRseSBzaG93cyAocmVzcGVjdHMgc2VhcmNoIGZpbHRlcilcbiAgY29uc3Qgcm93cyA9IGR0XG4gICAgPyBkdC5yb3dzKHsgc2VhcmNoOiAnYXBwbGllZCcgfSkubm9kZXMoKS50b0FycmF5KClcbiAgICA6IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgJHt0YWJsZUlkfSB0Ym9keSB0cmApKTtcblxuICByb3dzLmZvckVhY2gocm93ID0+IHtcbiAgICBjb25zdCBleHBJZCAgICA9IHJvdy5kYXRhc2V0LmV4cElkO1xuICAgIGNvbnN0IHNraWxsSWQgID0gcm93LmRhdGFzZXQuc2tpbGw7XG4gICAgY29uc3QgaXRlbUlkICAgPSBleHBJZCB8fCBza2lsbElkO1xuICAgIGlmICghaXRlbUlkKSByZXR1cm47XG5cbiAgICBsZXQgcmVzb2x2ZWRBY3Rpb24gPSBhY3Rpb247XG4gICAgaWYgKGFjdGlvbiA9PT0gJ3JlY29tbWVuZGVkJykge1xuICAgICAgcmVzb2x2ZWRBY3Rpb24gPSB0eXBlID09PSAnZXhwZXJpZW5jZSdcbiAgICAgICAgPyBfcmVzb2x2ZWRFeHBBY3Rpb24oaXRlbUlkLCBkYXRhKVxuICAgICAgICA6IF9yZXNvbHZlZFNraWxsQWN0aW9uKGl0ZW1JZCwgZGF0YSk7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIGJ1dHRvbiBzdGF0ZXNcbiAgICByb3cucXVlcnlTZWxlY3RvckFsbCgnLmljb24tYnRuJykuZm9yRWFjaChidG4gPT4ge1xuICAgICAgYnRuLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgICAgaWYgKGJ0bi5oYXNBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcpKSBidG4uc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCAnZmFsc2UnKTtcbiAgICB9KTtcbiAgICBjb25zdCB0YXJnZXQgPSByb3cucXVlcnlTZWxlY3RvcihgW2RhdGEtYWN0aW9uPVwiJHtyZXNvbHZlZEFjdGlvbn1cIl1gKTtcbiAgICBpZiAodGFyZ2V0KSB7XG4gICAgICB0YXJnZXQuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgICBpZiAodGFyZ2V0Lmhhc0F0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJykpIHRhcmdldC5zZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsICd0cnVlJyk7XG4gICAgfVxuXG4gICAgLy8gU3RvcmUgc2VsZWN0aW9uXG4gICAgaWYgKHR5cGUgPT09ICdleHBlcmllbmNlJykge1xuICAgICAgdXNlclNlbGVjdGlvbnMuZXhwZXJpZW5jZXNbaXRlbUlkXSA9IHJlc29sdmVkQWN0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICB1c2VyU2VsZWN0aW9ucy5za2lsbHNbaXRlbUlkXSA9IHJlc29sdmVkQWN0aW9uO1xuICAgIH1cbiAgfSk7XG4gIF91cGRhdGVQYWdlRXN0aW1hdGUoKTtcbn1cblxuZnVuY3Rpb24gX3Jlc29sdmVkRXhwQWN0aW9uKGV4cElkLCBkYXRhKSB7XG4gIGNvbnN0IHJlYyA9IGdldEV4cGVyaWVuY2VSZWNvbW1lbmRhdGlvbihleHBJZCwgZGF0YSk7XG4gIGlmIChyZWMgPT09ICdFbXBoYXNpemUnKSAgICByZXR1cm4gJ2VtcGhhc2l6ZSc7XG4gIGlmIChyZWMgPT09ICdJbmNsdWRlJykgICAgICByZXR1cm4gJ2luY2x1ZGUnO1xuICBpZiAocmVjID09PSAnRGUtZW1waGFzaXplJykgcmV0dXJuICdkZS1lbXBoYXNpemUnO1xuICByZXR1cm4gJ2V4Y2x1ZGUnO1xufVxuXG5mdW5jdGlvbiBfcmVzb2x2ZWRTa2lsbEFjdGlvbihza2lsbE5hbWUsIGRhdGEpIHtcbiAgY29uc3QgcmVjID0gZ2V0U2tpbGxSZWNvbW1lbmRhdGlvbihza2lsbE5hbWUsIGRhdGEpO1xuICBpZiAocmVjID09PSAnRW1waGFzaXplJykgICAgcmV0dXJuICdlbXBoYXNpemUnO1xuICBpZiAocmVjID09PSAnSW5jbHVkZScpICAgICAgcmV0dXJuICdpbmNsdWRlJztcbiAgaWYgKHJlYyA9PT0gJ0RlLWVtcGhhc2l6ZScpIHJldHVybiAnZGUtZW1waGFzaXplJztcbiAgcmV0dXJuICdleGNsdWRlJztcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFRhZ2xpbmUgcmV2aWV3IHRhYiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gcG9wdWxhdGVUYWdsaW5lUmV2aWV3VGFiKCkge1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgaWYgKCFjb250ZW50KSByZXR1cm47XG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgIDxoMiBzdHlsZT1cIm1hcmdpbjowIDAgMTZweDtcIj5cdUQ4M0NcdURGRjdcdUZFMEYgQXBwbGljYW50IFRhZ2xpbmU8L2gyPlxuICAgIDxkaXYgaWQ9XCJ0YWdsaW5lLXJldmlldy1jb250YWluZXJcIj48L2Rpdj5cbiAgYDtcbiAgaWYgKHR5cGVvZiBidWlsZFRhZ2xpbmVSZXZpZXdTZWN0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgYXdhaXQgYnVpbGRUYWdsaW5lUmV2aWV3U2VjdGlvbigpO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFeHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5leHBvcnQge1xuICB1c2VyU2VsZWN0aW9ucyxcbiAgdXBkYXRlSW5jbHVzaW9uQ291bnRzLFxuICBzd2l0Y2hUYWIsXG4gIGxvYWRUYWJDb250ZW50LFxuICBwb3B1bGF0ZUFuYWx5c2lzVGFiLFxuICBoYW5kbGVDdXN0b21pemF0aW9uUmVzcG9uc2UsXG4gIHNob3dUYWJsZUJhc2VkUmV2aWV3LFxuICBwb3B1bGF0ZVJldmlld1RhYixcbiAgcG9wdWxhdGVUYWdsaW5lUmV2aWV3VGFiLFxuICBzd2l0Y2hSZXZpZXdTdWJ0YWIsXG4gIF9sb2FkUmV2aWV3UGFuZSxcbiAgX3VwZGF0ZVBhZ2VFc3RpbWF0ZSxcbiAgaGFuZGxlQWN0aW9uQ2xpY2ssXG4gIGJ1bGtBY3Rpb24sXG4gIF9yZXNvbHZlZEV4cEFjdGlvbixcbiAgX3Jlc29sdmVkU2tpbGxBY3Rpb24sXG59O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvcHJldmlldy1yZW5kZXIuanNcbiAqIFNoYXJlZCwgc2lkZS1lZmZlY3QtZnJlZSBoZWxwZXIgZm9yIHNhZmVseSByZW5kZXJpbmcgQ1YgSFRNTCBpbnRvIGFcbiAqIHNhbmRib3hlZCBpZnJhbWUuIERlbGliZXJhdGVseSBoYXMgbm8gcmVmZXJlbmNlIHRvIHN0YXRlTWFuYWdlciwgYXBpQ2FsbCxcbiAqIG9yIGFueSBmZXRjaCBsb2dpYyBcdTIwMTQgaXQgb25seSB0b3VjaGVzIHRoZSBET00gXHUyMDE0IHNvIGl0IGNhbiBiZSBzYWZlbHlcbiAqIGltcG9ydGVkIGJ5IGJvdGggdGhlIG11dGF0aW5nIGxheW91dC1yZXZpZXcgZmxvdyAobGF5b3V0LWluc3RydWN0aW9uLmpzKVxuICogYW5kIHRoZSByZWFkLW9ubHkgZWFybHktcHJldmlldyBwYW5lbCAoZWFybHktcHJldmlldy1wYW5lbC5qcykgd2l0aG91dFxuICogY3JlYXRpbmcgYSBzaGFyZWQgaW1wb3J0IHBhdGggYmFjayB0byBhbnkgbXV0YXRpbmcgZW5kcG9pbnQuXG4gKi9cblxuLyoqXG4gKiBSZW5kZXIgYW4gSFRNTCBzdHJpbmcgaW50byBhbiBpZnJhbWUgdmlhIHNyY2RvYywgd2l0aCB0aGUgc2FuZGJveFxuICogYXR0cmlidXRlcyBhbHJlYWR5IGVzdGFibGlzaGVkIGZvciBDViBwcmV2aWV3cyBlbHNld2hlcmUgaW4gdGhlIGFwcC5cbiAqIEBwYXJhbSB7SFRNTElGcmFtZUVsZW1lbnR9IGlmcmFtZUVsXG4gKiBAcGFyYW0ge3N0cmluZ30gaHRtbFxuICovXG5mdW5jdGlvbiByZW5kZXJIdG1sSW50b0lmcmFtZShpZnJhbWVFbCwgaHRtbCkge1xuICBpZiAoIWlmcmFtZUVsKSByZXR1cm47XG4gIGlmcmFtZUVsLnNldEF0dHJpYnV0ZSgnc2FuZGJveCcsICdhbGxvdy1zYW1lLW9yaWdpbicpO1xuICBpZnJhbWVFbC5zZXRBdHRyaWJ1dGUoJ3JlZmVycmVycG9saWN5JywgJ25vLXJlZmVycmVyJyk7XG4gIGlmcmFtZUVsLnNyY2RvYyA9IGh0bWw7XG59XG5cbmV4cG9ydCB7IHJlbmRlckh0bWxJbnRvSWZyYW1lIH07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi92YWxpZGF0b3JzLmpzXG4gKiBBUEkgcmVzcG9uc2UgdmFsaWRhdG9ycyBcdTIwMTQgRFRPIG1pcnJvcnMgb2YgUHl0aG9uIGRhdGFjbGFzc2VzIGluIHdlYl9hcHAucHkuXG4gKlxuICogRWFjaCBmdW5jdGlvbiBjaGVja3MgdGhhdCByZXF1aXJlZCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gYW4gQVBJIHJlc3BvbnNlIGFuZFxuICogbG9ncyBhIGNvbnNvbGUud2FybiBpZiBhbnkgYXJlIG1pc3Npbmcgb3IgaGF2ZSBhbiB1bmV4cGVjdGVkIHR5cGUuICBWYWxpZGF0b3JzXG4gKiByZXR1cm4gdGhlIG9yaWdpbmFsIGRhdGEgb2JqZWN0IHVuY2hhbmdlZCBzbyB0aGV5IGNhbiBiZSB1c2VkIGlubGluZS5cbiAqXG4gKiBVcGRhdGUgYm90aCB0aGlzIGZpbGUgYW5kIHRoZSBQeXRob24gZGF0YWNsYXNzZXMgaW4gd2ViX2FwcC5weSB0b2dldGhlclxuICogd2hlbmV2ZXIgYWRkaW5nIG9yIHJlbW92aW5nIHJlc3BvbnNlIGZpZWxkcy5cbiAqXG4gKiBERVBFTkRFTkNJRVM6IG5vbmVcbiAqL1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5jb25zdCBsb2cgPSBnZXRMb2dnZXIoJ3ZhbGlkYXRvcnMnKTtcblxuLyoqIFZhbGlkYXRlIEdFVCAvYXBpL3N0YXR1cyByZXNwb25zZS4gKi9cbmZ1bmN0aW9uIHBhcnNlU3RhdHVzUmVzcG9uc2UoZGF0YSkge1xuICBjb25zdCByZXF1aXJlZCA9IFtcbiAgICAncGhhc2UnLCAnbGxtX3Byb3ZpZGVyJywgJ2pvYl9kZXNjcmlwdGlvbicsXG4gICAgJ3Bvc3RfYW5hbHlzaXNfcXVlc3Rpb25zJywgJ3Bvc3RfYW5hbHlzaXNfYW5zd2VycycsXG4gICAgJ2FsbF9leHBlcmllbmNlX2lkcycsICdhbGxfZXhwZXJpZW5jZXMnLCAnYWxsX3NraWxscycsICdhbGxfYWNoaWV2ZW1lbnRzJyxcbiAgICAncHJvZmVzc2lvbmFsX3N1bW1hcmllcycsICdjb3BpbG90X2F1dGgnLCAnaXRlcmF0aW5nJyxcbiAgICAnZXhwZXJpZW5jZV9kZWNpc2lvbnMnLCAnc2tpbGxfZGVjaXNpb25zJyxcbiAgICAnYWNoaWV2ZW1lbnRfZGVjaXNpb25zJywgJ3B1YmxpY2F0aW9uX2RlY2lzaW9ucycsXG4gICAgJ2V4dHJhX3NraWxscycsICdleHRyYV9za2lsbF9tYXRjaGVzJywgJ3Nlc3Npb25fZmlsZScsXG4gIF07XG4gIGNvbnN0IG1pc3NpbmcgPSByZXF1aXJlZC5maWx0ZXIoayA9PiAhKGsgaW4gZGF0YSkpO1xuICBpZiAobWlzc2luZy5sZW5ndGgpIHtcbiAgICBsb2cud2FybignW3BhcnNlU3RhdHVzUmVzcG9uc2VdIE1pc3NpbmcgZmllbGRzOicsIG1pc3NpbmcsIGRhdGEpO1xuICB9XG4gIGlmICgncG9zdF9hbmFseXNpc19xdWVzdGlvbnMnIGluIGRhdGEgJiYgIUFycmF5LmlzQXJyYXkoZGF0YS5wb3N0X2FuYWx5c2lzX3F1ZXN0aW9ucykpIHtcbiAgICBsb2cud2FybignW3BhcnNlU3RhdHVzUmVzcG9uc2VdIHBvc3RfYW5hbHlzaXNfcXVlc3Rpb25zIHNob3VsZCBiZSBhbiBhcnJheTonLCBkYXRhLnBvc3RfYW5hbHlzaXNfcXVlc3Rpb25zKTtcbiAgfVxuICBpZiAoJ2FsbF9leHBlcmllbmNlX2lkcycgaW4gZGF0YSAmJiAhQXJyYXkuaXNBcnJheShkYXRhLmFsbF9leHBlcmllbmNlX2lkcykpIHtcbiAgICBsb2cud2FybignW3BhcnNlU3RhdHVzUmVzcG9uc2VdIGFsbF9leHBlcmllbmNlX2lkcyBzaG91bGQgYmUgYW4gYXJyYXk6JywgZGF0YS5hbGxfZXhwZXJpZW5jZV9pZHMpO1xuICB9XG4gIHJldHVybiBkYXRhO1xufVxuXG4vKiogVmFsaWRhdGUgR0VUIC9hcGkvc2Vzc2lvbnMgcmVzcG9uc2UuICovXG5mdW5jdGlvbiBwYXJzZVNlc3Npb25MaXN0UmVzcG9uc2UoZGF0YSkge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YS5zZXNzaW9ucykpIHtcbiAgICBsb2cud2FybignW3BhcnNlU2Vzc2lvbkxpc3RSZXNwb25zZV0gc2Vzc2lvbnMgc2hvdWxkIGJlIGFuIGFycmF5OicsIGRhdGEpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGl0ZW1SZXF1aXJlZCA9IFsncGF0aCcsICdwb3NpdGlvbl9uYW1lJywgJ3RpbWVzdGFtcCcsICdwaGFzZScsICdoYXNfam9iJywgJ2hhc19hbmFseXNpcycsICdoYXNfY3VzdG9taXphdGlvbnMnXTtcbiAgICBkYXRhLnNlc3Npb25zLmZvckVhY2goKHMsIGkpID0+IHtcbiAgICAgIGNvbnN0IG1pc3NpbmcgPSBpdGVtUmVxdWlyZWQuZmlsdGVyKGsgPT4gIShrIGluIHMpKTtcbiAgICAgIGlmIChtaXNzaW5nLmxlbmd0aCkgbG9nLndhcm4oYFtwYXJzZVNlc3Npb25MaXN0UmVzcG9uc2VdIHNlc3Npb25zWyR7aX1dIG1pc3NpbmcgZmllbGRzOmAsIG1pc3NpbmcsIHMpO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBkYXRhO1xufVxuXG4vKiogVmFsaWRhdGUgR0VUIC9hcGkvcmV3cml0ZXMgcmVzcG9uc2UuICovXG5mdW5jdGlvbiBwYXJzZVJld3JpdGVzUmVzcG9uc2UoZGF0YSkge1xuICBjb25zdCByZXF1aXJlZCA9IFsnb2snLCAncmV3cml0ZXMnLCAncGVyc3Vhc2lvbl93YXJuaW5ncycsICdwaGFzZSddO1xuICBjb25zdCBtaXNzaW5nID0gcmVxdWlyZWQuZmlsdGVyKGsgPT4gIShrIGluIGRhdGEpKTtcbiAgaWYgKG1pc3NpbmcubGVuZ3RoKSBsb2cud2FybignW3BhcnNlUmV3cml0ZXNSZXNwb25zZV0gTWlzc2luZyBmaWVsZHM6JywgbWlzc2luZywgZGF0YSk7XG4gIGlmICgncmV3cml0ZXMnIGluIGRhdGEgJiYgIUFycmF5LmlzQXJyYXkoZGF0YS5yZXdyaXRlcykpIHtcbiAgICBsb2cud2FybignW3BhcnNlUmV3cml0ZXNSZXNwb25zZV0gcmV3cml0ZXMgc2hvdWxkIGJlIGFuIGFycmF5OicsIGRhdGEucmV3cml0ZXMpO1xuICB9XG4gIHJldHVybiBkYXRhO1xufVxuXG4vKiogVmFsaWRhdGUgUE9TVCAvYXBpL21lc3NhZ2UgYW5kIFBPU1QgL2FwaS9hY3Rpb24gcmVzcG9uc2VzLiAqL1xuZnVuY3Rpb24gcGFyc2VNZXNzYWdlUmVzcG9uc2UoZGF0YSkge1xuICBpZiAoIWRhdGEub2sgJiYgIWRhdGEuZXJyb3IpIHtcbiAgICBsb2cud2FybignW3BhcnNlTWVzc2FnZVJlc3BvbnNlXSBSZXNwb25zZSBoYXMgbmVpdGhlciBvayBub3IgZXJyb3I6JywgZGF0YSk7XG4gIH1cbiAgcmV0dXJuIGRhdGE7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFUyBtb2R1bGUgZXhwb3J0cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmV4cG9ydCB7XG4gIHBhcnNlU3RhdHVzUmVzcG9uc2UsXG4gIHBhcnNlU2Vzc2lvbkxpc3RSZXNwb25zZSxcbiAgcGFyc2VSZXdyaXRlc1Jlc3BvbnNlLFxuICBwYXJzZU1lc3NhZ2VSZXNwb25zZSxcbn07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9yZWNvbW1lbmRhdGlvbi1oZWxwZXJzLmpzXG4gKiBQdXJlIGhlbHBlciBmdW5jdGlvbnMgZm9yIGxvb2tpbmcgdXAgTExNIHJlY29tbWVuZGF0aW9uIGRhdGEgZnJvbSB0aGVcbiAqIC9hcGkvc3RhdHVzIHJlc3BvbnNlIG9iamVjdC4gIFN1cHBvcnRzIGV4cGVyaWVuY2UsIHNraWxsLCBhbmQgYWNoaWV2ZW1lbnRcbiAqIHJlY29tbWVuZGF0aW9ucyB3aXRoIGJhY2t3YXJkcy1jb21wYXRpYmxlIGZsYXQtbGlzdCBmYWxsYmFja3MgZm9yIG9sZFxuICogc2Vzc2lvbiBkYXRhLlxuICpcbiAqIERFUEVOREVOQ0lFUzogbm9uZVxuICovXG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmNvbnN0IGxvZyA9IGdldExvZ2dlcigncmVjb21tZW5kYXRpb24taGVscGVycycpO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEludGVybmFsIGxvb2t1cCBoZWxwZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIExvb2sgdXAgYSBzaW5nbGUgZXhwZXJpZW5jZSBlbnRyeSBpbiBleHBlcmllbmNlX3JlY29tbWVuZGF0aW9ucy4gKi9cbmZ1bmN0aW9uIF9maW5kRXhwUmVjKGV4cElkLCBkYXRhKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShkYXRhLmV4cGVyaWVuY2VfcmVjb21tZW5kYXRpb25zKSkge1xuICAgIGxvZy53YXJuKCdbcmVjb21tZW5kYXRpb25dIGV4cGVyaWVuY2VfcmVjb21tZW5kYXRpb25zIG1pc3Npbmc7IHVzaW5nIGZsYXQtbGlzdCBmYWxsYmFjayBmb3InLCBleHBJZCk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIGRhdGEuZXhwZXJpZW5jZV9yZWNvbW1lbmRhdGlvbnMuZmluZChyID0+IHIuaWQgPT09IGV4cElkIHx8IHIuZXhwZXJpZW5jZV9pZCA9PT0gZXhwSWQpIHx8IG51bGw7XG59XG5cbi8qKiBMb29rIHVwIGEgc2luZ2xlIHNraWxsIGVudHJ5IGluIHNraWxsX3JlY29tbWVuZGF0aW9ucy4gKi9cbmZ1bmN0aW9uIF9maW5kU2tpbGxSZWMoc2tpbGwsIGRhdGEpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEuc2tpbGxfcmVjb21tZW5kYXRpb25zKSkge1xuICAgIGxvZy53YXJuKCdbcmVjb21tZW5kYXRpb25dIHNraWxsX3JlY29tbWVuZGF0aW9ucyBtaXNzaW5nOyB1c2luZyBmbGF0LWxpc3QgZmFsbGJhY2sgZm9yJywgc2tpbGwpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBkYXRhLnNraWxsX3JlY29tbWVuZGF0aW9ucy5maW5kKHIgPT4gci5za2lsbCA9PT0gc2tpbGwgfHwgci5uYW1lID09PSBza2lsbCkgfHwgbnVsbDtcbn1cblxuLyoqIFBhcnNlIGEgcmF3IGNvbmZpZGVuY2Ugc3RyaW5nIHRvIGEge2xldmVsLCB0ZXh0fSBvYmplY3QsIG9yIG51bGwgaWYgdW5yZWNvZ25pc2VkLiAqL1xuZnVuY3Rpb24gX3BhcnNlQ29uZmlkZW5jZShjb25mKSB7XG4gIGNvbnN0IGMgPSAoY29uZiB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgaWYgKGMuaW5jbHVkZXMoJ3ZlcnkgaGlnaCcpKSByZXR1cm4geyBsZXZlbDogJ3ZlcnktaGlnaCcsIHRleHQ6ICdWZXJ5IEhpZ2ggQ29uZmlkZW5jZScgfTtcbiAgaWYgKGMuaW5jbHVkZXMoJ3ZlcnkgbG93JykpICByZXR1cm4geyBsZXZlbDogJ3ZlcnktbG93JywgIHRleHQ6ICdWZXJ5IExvdyBDb25maWRlbmNlJyAgfTtcbiAgaWYgKGMuaW5jbHVkZXMoJ2hpZ2gnKSkgICAgICByZXR1cm4geyBsZXZlbDogJ2hpZ2gnLCAgICAgIHRleHQ6ICdIaWdoIENvbmZpZGVuY2UnICAgICAgfTtcbiAgaWYgKGMuaW5jbHVkZXMoJ21lZGl1bScpKSAgICByZXR1cm4geyBsZXZlbDogJ21lZGl1bScsICAgIHRleHQ6ICdNZWRpdW0gQ29uZmlkZW5jZScgICAgfTtcbiAgaWYgKGMuaW5jbHVkZXMoJ2xvdycpKSAgICAgICByZXR1cm4geyBsZXZlbDogJ2xvdycsICAgICAgIHRleHQ6ICdMb3cgQ29uZmlkZW5jZScgICAgICAgfTtcbiAgcmV0dXJuIG51bGw7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRXhwZXJpZW5jZSByZWNvbW1lbmRhdGlvbnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiBnZXRFeHBlcmllbmNlUmVjb21tZW5kYXRpb24oZXhwSWQsIGRhdGEpIHtcbiAgY29uc3QgcmVjID0gX2ZpbmRFeHBSZWMoZXhwSWQsIGRhdGEpO1xuICBpZiAocmVjICYmIHJlYy5yZWNvbW1lbmRhdGlvbikgcmV0dXJuIHJlYy5yZWNvbW1lbmRhdGlvbjtcbiAgLy8gQmFja3dhcmRzLWNvbXBhdCBmbGF0LWxpc3QgZmFsbGJhY2tcbiAgaWYgKGRhdGEub21pdHRlZF9leHBlcmllbmNlcyAgICAgJiYgZGF0YS5vbWl0dGVkX2V4cGVyaWVuY2VzLmluY2x1ZGVzKGV4cElkKSkgICAgIHJldHVybiAnT21pdCc7XG4gIGlmIChkYXRhLnJlY29tbWVuZGVkX2V4cGVyaWVuY2VzICYmIGRhdGEucmVjb21tZW5kZWRfZXhwZXJpZW5jZXMuaW5jbHVkZXMoZXhwSWQpKSByZXR1cm4gJ0VtcGhhc2l6ZSc7XG4gIHJldHVybiAnSW5jbHVkZSc7XG59XG5cbmZ1bmN0aW9uIGdldENvbmZpZGVuY2VMZXZlbChleHBJZCwgZGF0YSkge1xuICBjb25zdCByZWMgPSBfZmluZEV4cFJlYyhleHBJZCwgZGF0YSk7XG4gIHJldHVybiAocmVjICYmIF9wYXJzZUNvbmZpZGVuY2UocmVjLmNvbmZpZGVuY2UpKSB8fCB7IGxldmVsOiAnbWVkaXVtJywgdGV4dDogJ01lZGl1bSBDb25maWRlbmNlJyB9O1xufVxuXG5mdW5jdGlvbiBnZXRFeHBlcmllbmNlUmVhc29uaW5nKGV4cElkLCBkYXRhKSB7XG4gIGNvbnN0IHJlYyA9IF9maW5kRXhwUmVjKGV4cElkLCBkYXRhKTtcbiAgcmV0dXJuIChyZWMgJiYgcmVjLnJlYXNvbmluZykgfHwgJ1RoaXMgZXhwZXJpZW5jZSB3YXMgc2VsZWN0ZWQgYmFzZWQgb24gaXRzIHJlbGV2YW5jZSB0byB0aGUgcG9zaXRpb24gcmVxdWlyZW1lbnRzLic7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU2tpbGwgcmVjb21tZW5kYXRpb25zXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gZ2V0U2tpbGxSZWNvbW1lbmRhdGlvbihza2lsbCwgZGF0YSkge1xuICBjb25zdCByZWMgPSBfZmluZFNraWxsUmVjKHNraWxsLCBkYXRhKTtcbiAgaWYgKHJlYyAmJiByZWMucmVjb21tZW5kYXRpb24pIHJldHVybiByZWMucmVjb21tZW5kYXRpb247XG4gIGlmIChkYXRhLnJlY29tbWVuZGVkX3NraWxscyAmJiBkYXRhLnJlY29tbWVuZGVkX3NraWxscy5pbmNsdWRlcyhza2lsbCkpIHJldHVybiAnSW5jbHVkZSc7XG4gIHJldHVybiAnT21pdCc7XG59XG5cbmZ1bmN0aW9uIGdldFNraWxsQ29uZmlkZW5jZShza2lsbCwgZGF0YSkge1xuICBjb25zdCByZWMgPSBfZmluZFNraWxsUmVjKHNraWxsLCBkYXRhKTtcbiAgaWYgKHJlYykge1xuICAgIGNvbnN0IHBhcnNlZCA9IF9wYXJzZUNvbmZpZGVuY2UocmVjLmNvbmZpZGVuY2UpO1xuICAgIGlmIChwYXJzZWQpIHJldHVybiBwYXJzZWQ7XG4gIH1cbiAgaWYgKGRhdGEucmVjb21tZW5kZWRfc2tpbGxzICYmIGRhdGEucmVjb21tZW5kZWRfc2tpbGxzLmluY2x1ZGVzKHNraWxsKSkge1xuICAgIHJldHVybiB7IGxldmVsOiAnbWVkaXVtJywgdGV4dDogJ01lZGl1bSBDb25maWRlbmNlJyB9O1xuICB9XG4gIHJldHVybiB7IGxldmVsOiAnbG93JywgdGV4dDogJ0xvdyBDb25maWRlbmNlJyB9O1xufVxuXG5mdW5jdGlvbiBnZXRTa2lsbFJlYXNvbmluZyhza2lsbCwgZGF0YSkge1xuICBjb25zdCByZWMgPSBfZmluZFNraWxsUmVjKHNraWxsLCBkYXRhKTtcbiAgaWYgKHJlYyAmJiByZWMucmVhc29uaW5nKSByZXR1cm4gcmVjLnJlYXNvbmluZztcbiAgaWYgKGRhdGEucmVjb21tZW5kZWRfc2tpbGxzICYmIGRhdGEucmVjb21tZW5kZWRfc2tpbGxzLmluY2x1ZGVzKHNraWxsKSkge1xuICAgIHJldHVybiAnVGhpcyBza2lsbCB3YXMgaWRlbnRpZmllZCBhcyByZWxldmFudCB0byB0aGUgcG9zaXRpb24gcmVxdWlyZW1lbnRzLic7XG4gIH1cbiAgcmV0dXJuICdUaGlzIHNraWxsIHdhcyBub3Qgc3BlY2lmaWNhbGx5IG1lbnRpb25lZCBpbiB0aGUgam9iIHJlcXVpcmVtZW50cy4nO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEFjaGlldmVtZW50IHJlY29tbWVuZGF0aW9uc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIGdldEFjaGlldmVtZW50UmVjb21tZW5kYXRpb24oYWNoSWQsIGRhdGEpIHtcbiAgaWYgKGRhdGEuYWNoaWV2ZW1lbnRfcmVjb21tZW5kYXRpb25zICYmIEFycmF5LmlzQXJyYXkoZGF0YS5hY2hpZXZlbWVudF9yZWNvbW1lbmRhdGlvbnMpKSB7XG4gICAgY29uc3QgcmVjID0gZGF0YS5hY2hpZXZlbWVudF9yZWNvbW1lbmRhdGlvbnMuZmluZChyID0+IHIuaWQgPT09IGFjaElkKTtcbiAgICBpZiAocmVjICYmIHJlYy5yZWNvbW1lbmRhdGlvbikgcmV0dXJuIHJlYy5yZWNvbW1lbmRhdGlvbjtcbiAgfVxuICBpZiAoZGF0YS5yZWNvbW1lbmRlZF9hY2hpZXZlbWVudHMgJiYgZGF0YS5yZWNvbW1lbmRlZF9hY2hpZXZlbWVudHMuaW5jbHVkZXMoYWNoSWQpKSB7XG4gICAgcmV0dXJuICdJbmNsdWRlJztcbiAgfVxuICByZXR1cm4gJ0RlLWVtcGhhc2l6ZSc7XG59XG5cbmZ1bmN0aW9uIGdldEFjaGlldmVtZW50Q29uZmlkZW5jZShhY2hJZCwgZGF0YSwgYWNoSW1wb3J0YW5jZSkge1xuICBpZiAoZGF0YS5hY2hpZXZlbWVudF9yZWNvbW1lbmRhdGlvbnMgJiYgQXJyYXkuaXNBcnJheShkYXRhLmFjaGlldmVtZW50X3JlY29tbWVuZGF0aW9ucykpIHtcbiAgICBjb25zdCByZWMgPSBkYXRhLmFjaGlldmVtZW50X3JlY29tbWVuZGF0aW9ucy5maW5kKHIgPT4gci5pZCA9PT0gYWNoSWQpO1xuICAgIGlmIChyZWMgJiYgcmVjLmNvbmZpZGVuY2UpIHtcbiAgICAgIGNvbnN0IGNvbmYgPSByZWMuY29uZmlkZW5jZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKGNvbmYuaW5jbHVkZXMoJ3ZlcnkgaGlnaCcpKSByZXR1cm4geyBsZXZlbDogJ3ZlcnktaGlnaCcsIHRleHQ6ICdWZXJ5IEhpZ2gnIH07XG4gICAgICBpZiAoY29uZi5pbmNsdWRlcygnaGlnaCcpKSAgICAgIHJldHVybiB7IGxldmVsOiAnaGlnaCcsICAgICAgdGV4dDogJ0hpZ2gnICAgICAgfTtcbiAgICAgIGlmIChjb25mLmluY2x1ZGVzKCdtZWRpdW0nKSkgICAgcmV0dXJuIHsgbGV2ZWw6ICdtZWRpdW0nLCAgICB0ZXh0OiAnTWVkaXVtJyAgICB9O1xuICAgICAgaWYgKGNvbmYuaW5jbHVkZXMoJ3ZlcnkgbG93JykpICByZXR1cm4geyBsZXZlbDogJ3ZlcnktbG93JywgIHRleHQ6ICdWZXJ5IExvdycgIH07XG4gICAgICBpZiAoY29uZi5pbmNsdWRlcygnbG93JykpICAgICAgIHJldHVybiB7IGxldmVsOiAnbG93JywgICAgICAgdGV4dDogJ0xvdycgICAgICAgfTtcbiAgICB9XG4gIH1cbiAgY29uc3QgaW1wID0gYWNoSW1wb3J0YW5jZSB8fCA1O1xuICBpZiAoaW1wID49IDkpIHJldHVybiB7IGxldmVsOiAndmVyeS1oaWdoJywgdGV4dDogJ1ZlcnkgSGlnaCcgfTtcbiAgaWYgKGltcCA+PSA3KSByZXR1cm4geyBsZXZlbDogJ2hpZ2gnLCAgICAgIHRleHQ6ICdIaWdoJyAgICAgIH07XG4gIGlmIChpbXAgPj0gNSkgcmV0dXJuIHsgbGV2ZWw6ICdtZWRpdW0nLCAgICB0ZXh0OiAnTWVkaXVtJyAgICB9O1xuICBpZiAoaW1wID49IDMpIHJldHVybiB7IGxldmVsOiAnbG93JywgICAgICAgdGV4dDogJ0xvdycgICAgICAgfTtcbiAgcmV0dXJuIHsgbGV2ZWw6ICd2ZXJ5LWxvdycsIHRleHQ6ICdWZXJ5IExvdycgfTtcbn1cblxuZnVuY3Rpb24gZ2V0QWNoaWV2ZW1lbnRSZWFzb25pbmcoYWNoSWQsIGRhdGEsIGFjaCkge1xuICBpZiAoZGF0YS5hY2hpZXZlbWVudF9yZWNvbW1lbmRhdGlvbnMgJiYgQXJyYXkuaXNBcnJheShkYXRhLmFjaGlldmVtZW50X3JlY29tbWVuZGF0aW9ucykpIHtcbiAgICBjb25zdCByZWMgPSBkYXRhLmFjaGlldmVtZW50X3JlY29tbWVuZGF0aW9ucy5maW5kKHIgPT4gci5pZCA9PT0gYWNoSWQpO1xuICAgIGlmIChyZWMgJiYgcmVjLnJlYXNvbmluZykgcmV0dXJuIHJlYy5yZWFzb25pbmc7XG4gIH1cbiAgY29uc3QgcmVsZXZhbnRGb3IgPSAoYWNoLnJlbGV2YW50X2ZvciB8fCBbXSkuam9pbignLCAnKTtcbiAgaWYgKGRhdGEucmVjb21tZW5kZWRfYWNoaWV2ZW1lbnRzICYmIGRhdGEucmVjb21tZW5kZWRfYWNoaWV2ZW1lbnRzLmluY2x1ZGVzKGFjaElkKSkge1xuICAgIHJldHVybiByZWxldmFudEZvclxuICAgICAgPyBgUmVjb21tZW5kZWQgZm9yIHRoaXMgcm9sZS4gUmVsZXZhbnQgZm9yOiAke3JlbGV2YW50Rm9yfS5gXG4gICAgICA6ICdSZWNvbW1lbmRlZCBieSBBSSBhcyByZWxldmFudCB0byB0aGlzIHJvbGUuJztcbiAgfVxuICByZXR1cm4gcmVsZXZhbnRGb3JcbiAgICA/IGBSZWxldmFudCBmb3I6ICR7cmVsZXZhbnRGb3J9LiBOb3Qgc3BlY2lmaWNhbGx5IGhpZ2hsaWdodGVkIGZvciB0aGlzIHJvbGUuYFxuICAgIDogJ05vdCBzcGVjaWZpY2FsbHkgaGlnaGxpZ2h0ZWQgZm9yIHRoaXMgcm9sZSBiYXNlZCBvbiBqb2IgcmVxdWlyZW1lbnRzLic7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRmFsbGJhY2sgcXVlc3Rpb24gZ2VuZXJhdGlvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIGJ1aWxkRmFsbGJhY2tQb3N0QW5hbHlzaXNRdWVzdGlvbnMoZGF0YSkge1xuICBjb25zdCBxdWVzdGlvbnMgPSBbXTtcblxuICBpZiAoZGF0YS5yb2xlX2xldmVsKSB7XG4gICAgcXVlc3Rpb25zLnB1c2goe1xuICAgICAgcXVlc3Rpb246IGBUaGlzIHJvbGUgYXBwZWFycyB0byBiZSBhdCAke2RhdGEucm9sZV9sZXZlbH0gbGV2ZWwuIFNob3VsZCBJIGVtcGhhc2l6ZSB5b3VyIG1vc3Qgc2VuaW9yIGV4cGVyaWVuY2VzIG9yIGluY2x1ZGUgYSBicm9hZGVyIHJhbmdlIHRvIHNob3cgY2FyZWVyIHByb2dyZXNzaW9uP2AsXG4gICAgICB0eXBlOiAnZXhwZXJpZW5jZV9sZXZlbCcsXG4gICAgICBjaG9pY2VzOiBbJ0VtcGhhc2l6ZSBtb3N0IHNlbmlvcicsICdCcm9hZGVyIGNhcmVlciBwcm9ncmVzc2lvbicsICdMZXQgeW91IGRlY2lkZSBiYXNlZCBvbiBhbmFseXNpcyddLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKGRhdGEucmVxdWlyZWRfc2tpbGxzICYmIGRhdGEucmVxdWlyZWRfc2tpbGxzLnNvbWUoc2tpbGwgPT5cbiAgICAgIHNraWxsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2xlYWRlcnNoaXAnKSB8fFxuICAgICAgc2tpbGwudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnbWFuYWdlbWVudCcpIHx8XG4gICAgICBza2lsbC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCd0ZWFtJykpKSB7XG4gICAgcXVlc3Rpb25zLnB1c2goe1xuICAgICAgcXVlc3Rpb246ICdUaGlzIHJvbGUgaGFzIGxlYWRlcnNoaXAgY29tcG9uZW50cy4gV291bGQgeW91IHByZWZlciBtZSB0byBlbXBoYXNpemUgeW91ciBtYW5hZ2VtZW50IGV4cGVyaWVuY2Ugb3IgZm9jdXMgbW9yZSBvbiB5b3VyIHRlY2huaWNhbCBjb250cmlidXRpb25zPycsXG4gICAgICB0eXBlOiAnbGVhZGVyc2hpcF9mb2N1cycsXG4gICAgICBjaG9pY2VzOiBbJ0VtcGhhc2l6ZSBtYW5hZ2VtZW50JywgJ0ZvY3VzIG9uIHRlY2huaWNhbCcsICdCYWxhbmNlIGJvdGggZXF1YWxseSddLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKGRhdGEuZG9tYWluKSB7XG4gICAgcXVlc3Rpb25zLnB1c2goe1xuICAgICAgcXVlc3Rpb246IGBUaGUgcm9sZSBpcyBpbiAke2RhdGEuZG9tYWlufS4gRG8geW91IGhhdmUgcGFydGljdWxhciBwcm9qZWN0cyBvciBhY2hpZXZlbWVudHMgaW4gdGhpcyBkb21haW4gdGhhdCB5b3UnZCBsaWtlIG1lIHRvIGhpZ2hsaWdodD9gLFxuICAgICAgdHlwZTogJ2RvbWFpbl9leHBlcnRpc2UnLFxuICAgICAgY2hvaWNlczogWydIaWdobGlnaHQgZG9tYWluLXNwZWNpZmljIGFjaGlldmVtZW50cycsICdVc2UgYWxsIGF2YWlsYWJsZSBleHBlcmllbmNlJywgJ1ByaW9yaXRpemUgbW9zdCByZWNlbnQgd29yayddLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKGRhdGEuY29tcGFueSkge1xuICAgIHF1ZXN0aW9ucy5wdXNoKHtcbiAgICAgIHF1ZXN0aW9uOiBgRm9yICR7ZGF0YS5jb21wYW55fSwgd291bGQgeW91IGxpa2UgbWUgdG8gdGFpbG9yIGVtcGhhc2lzIHRvd2FyZCB0aGVpciBjdWx0dXJlIGFuZCB2YWx1ZXM/IElmIHNvLCB3aGF0IHNob3VsZCBJIHByaW9yaXRpemU/YCxcbiAgICAgIHR5cGU6ICdjb21wYW55X2N1bHR1cmUnLFxuICAgICAgY2hvaWNlczogWydSZXNlYXJjaC1kcml2ZW4gLyBhY2FkZW1pYycsICdJbmR1c3RyeSAvIGNvbW1lcmNpYWwgaW1wYWN0JywgJ0lubm92YXRpb24gLyBzdGFydHVwJywgJ1VzZSBjdWx0dXJhbCBpbmRpY2F0b3JzIGZyb20gam9iIGRlc2NyaXB0aW9uJ10sXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gcXVlc3Rpb25zO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgRVMgbW9kdWxlIGV4cG9ydHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5leHBvcnQge1xuICBnZXRFeHBlcmllbmNlUmVjb21tZW5kYXRpb24sIGdldENvbmZpZGVuY2VMZXZlbCwgZ2V0RXhwZXJpZW5jZVJlYXNvbmluZyxcbiAgZ2V0U2tpbGxSZWNvbW1lbmRhdGlvbiwgZ2V0U2tpbGxDb25maWRlbmNlLCBnZXRTa2lsbFJlYXNvbmluZyxcbiAgZ2V0QWNoaWV2ZW1lbnRSZWNvbW1lbmRhdGlvbiwgZ2V0QWNoaWV2ZW1lbnRDb25maWRlbmNlLCBnZXRBY2hpZXZlbWVudFJlYXNvbmluZyxcbiAgYnVpbGRGYWxsYmFja1Bvc3RBbmFseXNpc1F1ZXN0aW9ucyxcbn07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi91aS1oZWxwZXJzLmpzXG4gKiBMaWdodHdlaWdodCBET00gaGVscGVyczogdG9hc3RzLCBhbGVydC9jb25maXJtIG1vZGFscywgY2hhdCB0b2dnbGUsIGFuZFxuICogd29ya2Zsb3ctc3RhZ2UgYWN0aW9uLWJ1dHRvbiBtYW5hZ2VtZW50LlxuICpcbiAqIERFUEVOREVOQ0lFUzogdWktY29yZS5qcyBleHBvcnRzICh0cmFwRm9jdXMsIHJlc3RvcmVGb2N1cywgc2V0SW5pdGlhbEZvY3VzLFxuICogICAgICAgICAgICAgICBwdXNoRm9jdXNTdGFjaykgYXZhaWxhYmxlIG9uIGdsb2JhbFRoaXMgYXQgcnVudGltZS5cbiAqL1xuXG5pbXBvcnQgeyBzdGF0ZU1hbmFnZXIsIEdFTkVSQVRJT05fU1RBVEVfRVZFTlQgfSBmcm9tICcuL3N0YXRlLW1hbmFnZXIuanMnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEFsZXJ0IG1vZGFsIChpbmZvcm1hdGlvbmFsIFx1MjAxNCBzaW5nbGUgT0sgYnV0dG9uKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIF9zZXRNb2RhbFRleHQoZWwsIG1lc3NhZ2UpIHtcbiAgZWwudGV4dENvbnRlbnQgPSAnJztcbiAgY29uc3QgcGFydHMgPSBTdHJpbmcobWVzc2FnZSB8fCAnJykuc3BsaXQoJ1xcbicpO1xuICBwYXJ0cy5mb3JFYWNoKChwYXJ0LCBpKSA9PiB7XG4gICAgZWwuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUocGFydCkpO1xuICAgIGlmIChpIDwgcGFydHMubGVuZ3RoIC0gMSkgZWwuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnInKSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzaG93QWxlcnRNb2RhbCh0aXRsZSwgbWVzc2FnZSkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWxlcnQtbW9kYWwtdGl0bGUnKS50ZXh0Q29udGVudCA9IHRpdGxlO1xuICBfc2V0TW9kYWxUZXh0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhbGVydC1tb2RhbC1tZXNzYWdlJyksIG1lc3NhZ2UpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWxlcnQtbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAvLyBwdXNoRm9jdXNTdGFjayAoR0FQLTE5NykgcGFpcnMgd2l0aCB0cmFwRm9jdXMvcmVzdG9yZUZvY3VzIGJlbG93IFx1MjAxNCB1c2luZ1xuICAvLyB0aGUgc2hhcmVkIGZvY3VzLXN0YWNrIG1lY2hhbmlzbSwgbm90IGEgbG9jYWwgdmFyaWFibGUsIHNvIGNsb3NlQWxlcnRNb2RhbFxuICAvLyBhbHNvIHBvcHMgdGhlIGtleWRvd24gbGlzdGVuZXIgdHJhcEZvY3VzIHJlZ2lzdGVycyBvbiBkb2N1bWVudC4gQSBwcmlvclxuICAvLyB2ZXJzaW9uIHRyYWNrZWQgaXRzIG93biBgX2FsZXJ0UHJldmlvdXNGb2N1c2AgYW5kIG5ldmVyIGNhbGxlZFxuICAvLyByZXN0b3JlRm9jdXMoKSwgd2hpY2ggbGVmdCB0aGF0IHRyYXBGb2N1cyBsaXN0ZW5lciBwZXJtYW5lbnRseSBhdHRhY2hlZFxuICAvLyBhZnRlciBldmVyeSBhbGVydCBtb2RhbCBjbG9zZS5cbiAgaWYgKHR5cGVvZiBwdXNoRm9jdXNTdGFjayA9PT0gJ2Z1bmN0aW9uJykgcHVzaEZvY3VzU3RhY2soZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7XG4gIGlmICh0eXBlb2Ygc2V0SW5pdGlhbEZvY3VzID09PSAnZnVuY3Rpb24nKSBzZXRJbml0aWFsRm9jdXMoJ2FsZXJ0LW1vZGFsLW92ZXJsYXknKTtcbiAgaWYgKHR5cGVvZiB0cmFwRm9jdXMgPT09ICdmdW5jdGlvbicpIHRyYXBGb2N1cygnYWxlcnQtbW9kYWwtb3ZlcmxheScpO1xufVxuXG5mdW5jdGlvbiBjbG9zZUFsZXJ0TW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhbGVydC1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgaWYgKHR5cGVvZiByZXN0b3JlRm9jdXMgPT09ICdmdW5jdGlvbicpIHJlc3RvcmVGb2N1cygpO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIENvbmZpcm0gbW9kYWwgKHJldHVybnMgYSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdHJ1ZS9mYWxzZSlcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5sZXQgX2NvbmZpcm1SZXNvbHZlID0gbnVsbDtcbmxldCBfY29uZmlybVByZXZpb3VzRm9jdXMgPSBudWxsO1xuXG5mdW5jdGlvbiBzaG93Q29uZmlybU1vZGFsKHRpdGxlLCBtZXNzYWdlLCBva0xhYmVsID0gJ09LJykge1xuICBfY29uZmlybVByZXZpb3VzRm9jdXMgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29uZmlybS1tb2RhbC10aXRsZScpLnRleHRDb250ZW50ID0gdGl0bGU7XG4gIF9zZXRNb2RhbFRleHQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbmZpcm0tbW9kYWwtbWVzc2FnZScpLCBtZXNzYWdlKTtcbiAgY29uc3Qgb2tCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29uZmlybS1tb2RhbC1vaycpO1xuICBpZiAob2tCdG4pIG9rQnRuLnRleHRDb250ZW50ID0gb2tMYWJlbDtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbmZpcm0tbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICBpZiAob2tCdG4pIG9rQnRuLmZvY3VzKCk7XG4gIGlmICh0eXBlb2YgdHJhcEZvY3VzID09PSAnZnVuY3Rpb24nKSB0cmFwRm9jdXMoJ2NvbmZpcm0tbW9kYWwtb3ZlcmxheScpO1xuICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7IF9jb25maXJtUmVzb2x2ZSA9IHJlc29sdmU7IH0pO1xufVxuXG5mdW5jdGlvbiBjbG9zZUNvbmZpcm1Nb2RhbChyZXN1bHQpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbmZpcm0tbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIGlmICh0eXBlb2YgcmVzdG9yZUZvY3VzID09PSAnZnVuY3Rpb24nKSByZXN0b3JlRm9jdXMoKTtcbiAgaWYgKF9jb25maXJtUmVzb2x2ZSkgeyBfY29uZmlybVJlc29sdmUocmVzdWx0KTsgX2NvbmZpcm1SZXNvbHZlID0gbnVsbDsgfVxuICBpZiAoX2NvbmZpcm1QcmV2aW91c0ZvY3VzICYmIHR5cGVvZiBfY29uZmlybVByZXZpb3VzRm9jdXMuZm9jdXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBfY29uZmlybVByZXZpb3VzRm9jdXMuZm9jdXMoKTtcbiAgfVxuICBfY29uZmlybVByZXZpb3VzRm9jdXMgPSBudWxsO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFRvYXN0IG5vdGlmaWNhdGlvbnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiBzaG93VG9hc3QobWVzc2FnZSwgdHlwZSA9ICdzdWNjZXNzJywgZHVyYXRpb24gPSAzMDAwKSB7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2FzdC1jb250YWluZXInKTtcbiAgaWYgKCFjb250YWluZXIpIHJldHVybjtcbiAgY29uc3QgdG9hc3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgdG9hc3QuY2xhc3NOYW1lID0gYHRvYXN0IHRvYXN0LSR7dHlwZX1gO1xuICB0b2FzdC50ZXh0Q29udGVudCA9IG1lc3NhZ2U7XG4gIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0b2FzdCk7XG4gIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7IHRvYXN0LmNsYXNzTGlzdC5hZGQoJ3RvYXN0LXNob3cnKTsgfSk7IH0pO1xuICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICB0b2FzdC5jbGFzc0xpc3QucmVtb3ZlKCd0b2FzdC1zaG93Jyk7XG4gICAgdG9hc3QuYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsICgpID0+IHRvYXN0LnJlbW92ZSgpLCB7IG9uY2U6IHRydWUgfSk7XG4gIH0sIGR1cmF0aW9uKTtcbn1cblxuZnVuY3Rpb24gcmVmcmVzaExheW91dFN0YXR1c1VJKCkge1xuICBjb25zdCBsYXlvdXRDaGlwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xheW91dC1mcmVzaG5lc3MtY2hpcCcpO1xuICBjb25zdCBsYXlvdXRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGF5b3V0LWJ0bicpO1xuICBjb25zdCBmcmVzaG5lc3MgPSBzdGF0ZU1hbmFnZXIuZ2V0TGF5b3V0RnJlc2huZXNzKCk7XG4gIGNvbnN0IGdlbmVyYXRpb25TdGF0ZSA9IHN0YXRlTWFuYWdlci5nZXRHZW5lcmF0aW9uU3RhdGUoKTtcblxuICBpZiAobGF5b3V0Q2hpcCkge1xuICAgIGxheW91dENoaXAuc3R5bGUuZGlzcGxheSA9IGZyZXNobmVzcy5zaG93Q2hpcCA/ICcnIDogJ25vbmUnO1xuICAgIGxheW91dENoaXAuY2xhc3NOYW1lID0gYGxheW91dC1mcmVzaG5lc3MtY2hpcCAke2ZyZXNobmVzcy50b25lfWA7XG4gICAgbGF5b3V0Q2hpcC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCBmcmVzaG5lc3MuYXJpYUxhYmVsIHx8ICcnKTtcbiAgICBsYXlvdXRDaGlwLmlubmVySFRNTCA9IGZyZXNobmVzcy5zaG93Q2hpcFxuICAgICAgPyBgPHNwYW4gY2xhc3M9XCJsYXlvdXQtZnJlc2huZXNzLWljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj4ke2ZyZXNobmVzcy5pc0NyaXRpY2FsID8gJ1x1MjFCQicgOiAoZnJlc2huZXNzLmlzU3RhbGUgPyAnIScgOiAnXHUyNzEzJyl9PC9zcGFuPjxzcGFuIGNsYXNzPVwibGF5b3V0LWZyZXNobmVzcy1sYWJlbFwiPiR7ZnJlc2huZXNzLmxhYmVsfTwvc3Bhbj5gXG4gICAgICA6ICcnO1xuICB9XG5cbiAgaWYgKGxheW91dEJ0bikge1xuICAgIGlmIChmcmVzaG5lc3MuaXNTdGFsZSkge1xuICAgICAgbGF5b3V0QnRuLnRleHRDb250ZW50ID0gJ1x1MjFCQiBSZWdlbmVyYXRlIFByZXZpZXcnO1xuICAgICAgbGF5b3V0QnRuLnRpdGxlID0gJ1ByZXZpZXcgaXMgb3V0IG9mIGRhdGUgXHUyMDE0IHJlZ2VuZXJhdGUgYmVmb3JlIGNvbmZpcm1pbmcgbGF5b3V0JztcbiAgICB9IGVsc2UgaWYgKGdlbmVyYXRpb25TdGF0ZS5sYXlvdXRDb25maXJtZWQgfHwgZ2VuZXJhdGlvblN0YXRlLnBoYXNlID09PSAnY29uZmlybWVkJykge1xuICAgICAgbGF5b3V0QnRuLnRleHRDb250ZW50ID0gJ1x1MkIwN1x1RkUwRiBHZW5lcmF0ZSBGaW5hbCBGaWxlcyc7XG4gICAgICBsYXlvdXRCdG4udGl0bGUgPSAnTGF5b3V0IGNvbmZpcm1lZCBcdTIwMTQgcHJvZHVjZSBmaW5hbCBzdWJtaXNzaW9uLXJlYWR5IERPQ1ggYW5kIFBERiBmaWxlcyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxheW91dEJ0bi50ZXh0Q29udGVudCA9ICdcdTI3MDUgQ29uZmlybSBMYXlvdXQnO1xuICAgICAgbGF5b3V0QnRuLnRpdGxlID0gJ1N0ZXAgMiBvZiAzOiBDb25maXJtIHRoZSBsYXlvdXQgbG9va3MgcmlnaHQgYmVmb3JlIGdlbmVyYXRpbmcgZmluYWwgZmlsZXMnO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVMYXlvdXRGcmVzaG5lc3NDaGlwQ2xpY2soKSB7XG4gIGlmICh0eXBlb2YgdXBkYXRlVGFiQmFyRm9yU3RhZ2UgPT09ICdmdW5jdGlvbicpIHVwZGF0ZVRhYkJhckZvclN0YWdlKCdsYXlvdXQnKTtcbiAgaWYgKHR5cGVvZiB1cGRhdGVBY3Rpb25CdXR0b25zID09PSAnZnVuY3Rpb24nKSB1cGRhdGVBY3Rpb25CdXR0b25zKCdsYXlvdXQnKTtcbiAgaWYgKHR5cGVvZiBzd2l0Y2hUYWIgPT09ICdmdW5jdGlvbicpIHN3aXRjaFRhYignbGF5b3V0Jyk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gV29ya2Zsb3ctc3RhZ2UgcHJpbWFyeSBhY3Rpb24gYnV0dG9uc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBBbGwgc3RhZ2Utc3BlY2lmaWMgcHJpbWFyeSBhY3Rpb24gYnV0dG9uIElEcyAoZXhjbHVkZXMgcmVzZXQgd2hpY2ggaXMgYWx3YXlzIHZpc2libGUpLiAqL1xuY29uc3QgX1NUQUdFX0JVVFRPTlMgPSBbXG4gICdhbmFseXplLWJ0bicsICdyZWNvbW1lbmQtYnRuJywgJ2dlbmVyYXRlLWJ0bicsXG4gICdyZXdyaXRlLWJ0bicsICdzcGVsbC1idG4nLCAnZ2VuZXJhdGUtcHJvY2VlZC1idG4nLFxuICAnbGF5b3V0LWJ0bicsICdmaW5hbC1nZW5lcmF0ZS1wcm9jZWVkLWJ0bicsICdmaW5hbGlzZS1hY3Rpb24tYnRuJyxcbl07XG5cbi8qKiBNYXBzIGVhY2ggd29ya2Zsb3cgc3RhZ2UgdG8gaXRzIG9uZSBwcmltYXJ5IGFjdGlvbiBidXR0b24uICovXG5jb25zdCBfU1RBR0VfQlVUVE9OX01BUCA9IHtcbiAgam9iOiAgICAgICAgICAgICdhbmFseXplLWJ0bicsXG4gIGFuYWx5c2lzOiAgICAgICAncmVjb21tZW5kLWJ0bicsXG4gIGN1c3RvbWl6YXRpb25zOiAnZ2VuZXJhdGUtYnRuJyxcbiAgcmV3cml0ZTogICAgICAgICdyZXdyaXRlLWJ0bicsXG4gIHNwZWxsOiAgICAgICAgICAnc3BlbGwtYnRuJyxcbiAgZ2VuZXJhdGU6ICAgICAgICdnZW5lcmF0ZS1wcm9jZWVkLWJ0bicsXG4gIGxheW91dDogICAgICAgICAnbGF5b3V0LWJ0bicsXG4gIGZpbmFsX2dlbmVyYXRlOiAnZmluYWwtZ2VuZXJhdGUtcHJvY2VlZC1idG4nLFxuICBmaW5hbGlzZTogICAgICAgJ2ZpbmFsaXNlLWFjdGlvbi1idG4nLFxufTtcblxuLyoqXG4gKiBTaG93IG9ubHkgdGhlIHByaW1hcnkgYWN0aW9uIGJ1dHRvbiBmb3IgdGhlIGdpdmVuIHdvcmtmbG93IHN0YWdlLlxuICogUmVzZXQgaXMgYWx3YXlzIHZpc2libGUuICBBbGwgb3RoZXIgc3RhZ2UgYnV0dG9ucyBhcmUgaGlkZGVuLlxuICovXG5mdW5jdGlvbiB1cGRhdGVBY3Rpb25CdXR0b25zKHN0YWdlKSB7XG4gIGNvbnN0IGFjdGl2ZUlkID0gX1NUQUdFX0JVVFRPTl9NQVBbc3RhZ2VdIHx8IG51bGw7XG4gIF9TVEFHRV9CVVRUT05TLmZvckVhY2goaWQgPT4ge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgIGlmIChlbCkgZWwuc3R5bGUuZGlzcGxheSA9IChpZCA9PT0gYWN0aXZlSWQpID8gJycgOiAnbm9uZSc7XG4gIH0pO1xuICByZWZyZXNoTGF5b3V0U3RhdHVzVUkoKTtcbn1cblxuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEdFTkVSQVRJT05fU1RBVEVfRVZFTlQsIHJlZnJlc2hMYXlvdXRTdGF0dXNVSSk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFUyBtb2R1bGUgZXhwb3J0cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmV4cG9ydCB7XG4gIHNob3dBbGVydE1vZGFsLCBjbG9zZUFsZXJ0TW9kYWwsXG4gIHNob3dDb25maXJtTW9kYWwsIGNsb3NlQ29uZmlybU1vZGFsLFxuICBzaG93VG9hc3QsXG4gIHJlZnJlc2hMYXlvdXRTdGF0dXNVSSxcbiAgaGFuZGxlTGF5b3V0RnJlc2huZXNzQ2hpcENsaWNrLFxuICB1cGRhdGVBY3Rpb25CdXR0b25zLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogU2hhcmVkIHByb3Bvc2FsLXJldmlldyByb3cgcmVuZGVyZXIsIGV4dHJhY3RlZCBmcm9tIHdlYi9oYXJ2ZXN0LmpzIHNvIHRoZVxuICogR0FQLTAxIFwiVXBkYXRlIHZpYSBBSVwiIHBhbmVsICh3ZWIvbWFzdGVyLWRhdGEtYWktdXBkYXRlLmpzKSBkb2Vzbid0XG4gKiBkdXBsaWNhdGUgb3IgZm9yayB0aGUgc2FtZSBiZWZvcmUvYWZ0ZXIgZGlmZi1yb3cgVUkgYSB0aGlyZCB0aW1lLlxuICpcbiAqIFJvdyBtYXJrdXAgdXNlcyBgZGF0YS10b2dnbGUtcmVhc29uaW5nPVwiSURcImAgYXR0cmlidXRlcyBpbnN0ZWFkIG9mIGlubGluZVxuICogYG9uY2xpY2s9XCIuLi5cImAgaGFuZGxlcnMgXHUyMDE0IHRoZSBjYWxsZXIgYXR0YWNoZXMgT05FIGRlbGVnYXRlZCBjbGlja1xuICogbGlzdGVuZXIgKGF0dGFjaFByb3Bvc2FsUm93TGlzdGVuZXJzKSByYXRoZXIgdGhhbiBlYWNoIHJvdyB3aXJpbmcgaXRzIG93blxuICogaW5saW5lIGhhbmRsZXIuIFRoaXMgbWF0dGVycyBiZWNhdXNlIGhhcnZlc3QuanMncyBvcmlnaW5hbCBpbmxpbmUtb25jbGlja1xuICogdmVyc2lvbiBjYWxsZWQgaGFydmVzdC5qcy1zcGVjaWZpYyBnbG9iYWwgZnVuY3Rpb25zIGRpcmVjdGx5OyBhIHJvd1xuICogcmVuZGVyZWQgYnkgYSBkaWZmZXJlbnQgbW9kdWxlIChtYXN0ZXItZGF0YS1haS11cGRhdGUuanMpIG11c3Qgbm90XG4gKiBzaWxlbnRseSByZWZlcmVuY2UgZnVuY3Rpb25zIHRoYXQgZG9uJ3QgZXhpc3QgdGhlcmUuXG4gKlxuICogYGlkUHJlZml4YCBrZWVwcyBlYWNoIGNhbGxlcidzIGV4aXN0aW5nIERPTS1pZCBjb252ZW50aW9uIGludGFjdCAoZS5nLlxuICogaGFydmVzdC5qcydzIGBoYXJ2ZXN0LXJvdy0qYC9gaGFydmVzdC1jaGstKmAsIHJlZmVyZW5jZWQgZWxzZXdoZXJlIGluIHRoYXRcbiAqIGZpbGUsIG5vdGFibHkgYXBwbHlIYXJ2ZXN0U2VsZWN0aW9ucykgcmF0aGVyIHRoYW4gZm9yY2luZyBhIHJlbmFtZS5cbiAqXG4gKiBQdWJsaWMgZXhwb3J0czpcbiAqICAgZXNjKHN0cilcbiAqICAgcmVuZGVyUHJvcG9zYWxSb3coaXRlbSwgb3B0cylcbiAqICAgYXR0YWNoUHJvcG9zYWxSb3dMaXN0ZW5lcnMoY29udGFpbmVyRWwsIGlkUHJlZml4LCBoYW5kbGVycylcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXNjKHN0cikge1xuICByZXR1cm4gU3RyaW5nKHN0ciA/PyAnJylcbiAgICAucmVwbGFjZSgvJi9nLCAnJmFtcDsnKVxuICAgIC5yZXBsYWNlKC88L2csICcmbHQ7JylcbiAgICAucmVwbGFjZSgvPi9nLCAnJmd0OycpXG4gICAgLnJlcGxhY2UoL1wiL2csICcmcXVvdDsnKTtcbn1cblxuLyoqXG4gKiBSZW5kZXIgb25lIHByb3Bvc2FsLXJldmlldyByb3cgKGNoZWNrYm94ICsgYmVmb3JlL2FmdGVyICsgb3B0aW9uYWxcbiAqIGNvbGxhcHNpYmxlIGRldGFpbCArIG9wdGlvbmFsIGJhZGdlcy9mbGFnIGJhbm5lcikuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGl0ZW1cbiAqIEBwYXJhbSB7c3RyaW5nfSBpdGVtLmlkXG4gKiBAcGFyYW0ge3N0cmluZ30gaXRlbS50eXBlTGFiZWwgICAgIC0gc21hbGwgY2FwcyBsYWJlbCBhYm92ZSB0aGUgcm93IChlLmcuIHNlY3Rpb24gbmFtZSlcbiAqIEBwYXJhbSB7c3RyaW5nfSBbaXRlbS5zb3VyY2VCYWRnZUh0bWxdXG4gKiBAcGFyYW0ge3N0cmluZ30gaXRlbS5sYWJlbCAgICAgICAgIC0gc2Vjb25kYXJ5IHN1bW1hcnkgbGluZVxuICogQHBhcmFtIHtzdHJpbmd9IFtpdGVtLm9yaWdpbmFsXSAgICAtIFwiQmVmb3JlXCIgYmxvY2sgdGV4dCAob21pdCBmb3IgYWRkLW9ubHkgcHJvcG9zYWxzKVxuICogQHBhcmFtIHtzdHJpbmd9IFtpdGVtLnByb3Bvc2VkXSAgICAtIFwiQWZ0ZXJcIiBibG9jayB0ZXh0IChhbHJlYWR5IGRpc3BsYXktcmVhZHksIG5vdCBhIHJhdyBvYmplY3QpXG4gKiBAcGFyYW0ge3N0cmluZ30gW2l0ZW0uZGV0YWlsVGV4dF0gIC0gY29sbGFwc2libGUgZGV0YWlsIChoYXJ2ZXN0OiByZWFzb25pbmc7IEdBUC0wMTogcmF0aW9uYWxlKVxuICogQHBhcmFtIHtzdHJpbmd9IFtpdGVtLmJhZGdlc0h0bWxdICAtIHByZS1yZW5kZXJlZCByaWdodC1zaWRlIGJhZGdlIEhUTUwgKGNhbGxlci1zcGVjaWZpYylcbiAqIEBwYXJhbSB7c3RyaW5nfSBbaXRlbS5mbGFnSHRtbF0gICAgLSBwcmUtcmVuZGVyZWQgYWR2aXNvcnkvd2FybmluZyBiYW5uZXIgKGUuZy4gcG9zc2libGUtZHVwbGljYXRlLCBzdGFsZSlcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2l0ZW0uY2hlY2tlZF1cbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5pZFByZWZpeCAgICAgICAgICAtIHNoYXJlZCBwcmVmaXggZm9yIHJvdy9yZWFzb24vY2hlY2tib3ggaWRzLCBlLmcuICdoYXJ2ZXN0JyBvciAnbWR1J1xuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmNoZWNrYm94RGF0YUF0dHJdIC0ga2ViYWItY2FzZSBkYXRhLWF0dHJpYnV0ZSBzdWZmaXgsIGUuZy4gJ2hhcnZlc3QtaWQnIG9yICdtZHUtaWQnXG4gKiAgIChOT1QgY2FtZWxDYXNlIFx1MjAxNCB0aGlzIGlzIGludGVycG9sYXRlZCB2ZXJiYXRpbSBpbnRvIGBkYXRhLSR7Y2hlY2tib3hEYXRhQXR0cn1gIGluIHRoZSBIVE1MIHN0cmluZztcbiAqICAgYSBjYW1lbENhc2UgdmFsdWUgbGlrZSAnaGFydmVzdElkJyBwcm9kdWNlcyB0aGUgbGl0ZXJhbCBhdHRyaWJ1dGUgYGRhdGEtaGFydmVzdElkYCwgd2hpY2ggdGhlIEhUTUxcbiAqICAgcGFyc2VyIGxvd2VyY2FzZXMgdG8gYGRhdGEtaGFydmVzdGlkYCBvbiBpbnNlcnRpb24sIHNpbGVudGx5IGJyZWFraW5nIGAuZGF0YXNldC5oYXJ2ZXN0SWRgIC9cbiAqICAgYFtkYXRhLWhhcnZlc3QtaWRdYCBsb29rdXBzIGVsc2V3aGVyZS4gVGhpcyBiaXQgbWFzdGVyLWRhdGEtYWktdXBkYXRlLmpzJ3Mgb3duIGZpcnN0IGRyYWZ0LilcbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5hcmlhTGFiZWxTdWZmaXhdICAtIGFwcGVuZGVkIHRvIHRoZSBjaGVja2JveCdzIGFyaWEtbGFiZWwgYWZ0ZXIgYGxhYmVsYCAoZS5nLiBkdXBsaWNhdGUvZmxhZyB0ZXh0KVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyUHJvcG9zYWxSb3coaXRlbSwgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBpZFByZWZpeCA9ICdwcm9wb3NhbCcsXG4gICAgY2hlY2tib3hEYXRhQXR0ciA9ICdwcm9wb3NhbC1pZCcsXG4gICAgYXJpYUxhYmVsU3VmZml4ID0gJycsXG4gIH0gPSBvcHRzO1xuXG4gIGNvbnN0IGNoZWNrZWQgPSBpdGVtLmNoZWNrZWQgPyAnIGNoZWNrZWQnIDogJyc7XG4gIGNvbnN0IHJvd0lkID0gYCR7aWRQcmVmaXh9LXJvdy0ke2VzYyhpdGVtLmlkKX1gO1xuICBjb25zdCByZWFzb25JZCA9IGAke2lkUHJlZml4fS1yZWFzb24tJHtlc2MoaXRlbS5pZCl9YDtcbiAgY29uc3QgY2hlY2tib3hJZCA9IGAke2lkUHJlZml4fS1jaGstJHtlc2MoaXRlbS5pZCl9YDtcbiAgY29uc3QgYXJpYUxhYmVsID0gZXNjKGAke2l0ZW0ubGFiZWwgfHwgJyd9JHthcmlhTGFiZWxTdWZmaXh9YCk7XG5cbiAgY29uc3QgaGFzRGV0YWlsID0gQm9vbGVhbihpdGVtLmRldGFpbFRleHQpO1xuICBjb25zdCBkZXRhaWxUb2dnbGUgPSBoYXNEZXRhaWxcbiAgICA/IGA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLXRvZ2dsZS1yZWFzb25pbmc9XCIke2VzYyhpdGVtLmlkKX1cIiBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIiBhcmlhLWNvbnRyb2xzPVwiJHtyZWFzb25JZH1cIiBzdHlsZT1cImZvbnQtc2l6ZTowLjc1ZW07YmFja2dyb3VuZDpub25lO2JvcmRlcjpub25lO2NvbG9yOnZhcigtLWN2LWdyYXktNTAwKTtjdXJzb3I6cG9pbnRlcjtwYWRkaW5nOjAgNHB4O3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtcIiB0aXRsZT1cIlRvZ2dsZSBkZXRhaWxzXCI+XHVEODNEXHVEQ0FDPC9idXR0b24+YFxuICAgIDogJyc7XG4gIGNvbnN0IGRldGFpbEJsb2NrID0gaGFzRGV0YWlsXG4gICAgPyBgPGRpdiBpZD1cIiR7cmVhc29uSWR9XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7bWFyZ2luLXRvcDo2cHg7cGFkZGluZzo4cHggMTBweDtiYWNrZ3JvdW5kOnZhcigtLWN2LWJnLWxpZ2h0KTtib3JkZXItbGVmdDozcHggc29saWQgdmFyKC0tY3Ytc2xhdGUtNDAwKTtib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6MC44MmVtO2NvbG9yOnZhcigtLWN2LXRleHQtbXV0ZWQpO2xpbmUtaGVpZ2h0OjEuNTtcIj4ke2VzYyhpdGVtLmRldGFpbFRleHQpfTwvZGl2PmBcbiAgICA6ICcnO1xuXG4gIHJldHVybiBgXG4gICAgPHRyIGlkPVwiJHtyb3dJZH1cIiBzdHlsZT1cImJvcmRlci1ib3R0b206MXB4IHNvbGlkIHZhcigtLWN2LWJnLXN1YnRsZSk7XCI+XG4gICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOjEwcHggMTJweDt3aWR0aDozNnB4O3ZlcnRpY2FsLWFsaWduOnRvcDtcIj5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiJHtjaGVja2JveElkfVwiIGRhdGEtJHtjaGVja2JveERhdGFBdHRyfT1cIiR7ZXNjKGl0ZW0uaWQpfVwiJHtjaGVja2VkfVxuICAgICAgICAgIGFyaWEtbGFiZWw9XCIke2FyaWFMYWJlbH1cIlxuICAgICAgICAgIHN0eWxlPVwid2lkdGg6MTZweDtoZWlnaHQ6MTZweDtjdXJzb3I6cG9pbnRlcjttYXJnaW4tdG9wOjJweDtcIj5cbiAgICAgIDwvdGQ+XG4gICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOjEwcHggMTJweDtcIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpmbGV4LXN0YXJ0O2dhcDo4cHg7ZmxleC13cmFwOndyYXA7XCI+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImZsZXg6MTttaW4td2lkdGg6MjAwcHg7XCI+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuNzhlbTtmb250LXdlaWdodDo2MDA7Y29sb3I6dmFyKC0tY3YtdGV4dC1zZWNvbmRhcnkpO3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTtsZXR0ZXItc3BhY2luZzowLjA0ZW07bWFyZ2luLWJvdHRvbTo0cHg7XCI+XG4gICAgICAgICAgICAgICR7ZXNjKGl0ZW0udHlwZUxhYmVsIHx8ICcnKX0ke2l0ZW0uc291cmNlQmFkZ2VIdG1sIHx8ICcnfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuODdlbTtjb2xvcjp2YXIoLS1jdi1zbGF0ZS00MDApO21hcmdpbi1ib3R0b206NnB4O1wiPiR7ZXNjKGl0ZW0ubGFiZWwgfHwgJycpfTwvZGl2PlxuICAgICAgICAgICAgJHtpdGVtLmZsYWdIdG1sIHx8ICcnfVxuICAgICAgICAgICAgJHtpdGVtLm9yaWdpbmFsID8gYFxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206NnB4O1wiPlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuNzJlbTtmb250LXdlaWdodDo2MDA7Y29sb3I6dmFyKC0tY3YtZ3JheS01MDApO3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTtsZXR0ZXItc3BhY2luZzowLjAzZW07bWFyZ2luLWJvdHRvbToycHg7XCI+QmVmb3JlPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2NvbG9yOnZhcigtLWN2LWdyYXktNTAwKTtiYWNrZ3JvdW5kOnZhcigtLWN2LWJnLWxpZ2h0KTtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjZweCA4cHg7Ym9yZGVyLWxlZnQ6M3B4IHNvbGlkIHZhcigtLWN2LWdyYXktMzAwKTtsaW5lLWhlaWdodDoxLjU7XCI+JHtlc2MoaXRlbS5vcmlnaW5hbCl9PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5gIDogJyd9XG4gICAgICAgICAgICAke2l0ZW0ucHJvcG9zZWQgPyBgXG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTo0cHg7XCI+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC43MmVtO2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjp2YXIoLS1jdi1ncmF5LTUwMCk7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO2xldHRlci1zcGFjaW5nOjAuMDNlbTttYXJnaW4tYm90dG9tOjJweDtcIj5BZnRlcjwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtjb2xvcjp2YXIoLS1jdi10ZXh0LXByaW1hcnkpO2JhY2tncm91bmQ6dmFyKC0tY3Ytc3VjY2Vzcy1iZyk7Ym9yZGVyLXJhZGl1czo0cHg7cGFkZGluZzo2cHggOHB4O2JvcmRlci1sZWZ0OjNweCBzb2xpZCB2YXIoLS1jdi1zdWNjZXNzLWJvcmRlcik7bGluZS1oZWlnaHQ6MS41O1wiPiR7ZXNjKGl0ZW0ucHJvcG9zZWQpfTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+YCA6ICcnfVxuICAgICAgICAgICAgJHtkZXRhaWxCbG9ja31cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtnYXA6NHB4O2FsaWduLWl0ZW1zOmZsZXgtZW5kO2ZsZXgtc2hyaW5rOjA7XCI+XG4gICAgICAgICAgICAke2l0ZW0uYmFkZ2VzSHRtbCB8fCAnJ31cbiAgICAgICAgICAgICR7ZGV0YWlsVG9nZ2xlfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvdGQ+XG4gICAgPC90cj5gO1xufVxuXG4vKipcbiAqIEF0dGFjaCBvbmUgZGVsZWdhdGVkIGNsaWNrIGxpc3RlbmVyIHRvIGBjb250YWluZXJFbGAgY292ZXJpbmcgZXZlcnlcbiAqIGBbZGF0YS10b2dnbGUtcmVhc29uaW5nXWAgZWxlbWVudCByZW5kZXJlZCBieSByZW5kZXJQcm9wb3NhbFJvdyB3aXRoIHRoZVxuICogbWF0Y2hpbmcgYGlkUHJlZml4YC4gR3VhcmRzIGFnYWluc3QgZG91YmxlLWF0dGFjaGluZyBhY3Jvc3MgcmVwZWF0ZWRcbiAqIGNhbGxzIChlLmcuIGEgdGFiIGJlaW5nIHJlLXBvcHVsYXRlZCkgdmlhIGEgbWFya2VyIG9uIGBjb250YWluZXJFbGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhdHRhY2hQcm9wb3NhbFJvd0xpc3RlbmVycyhjb250YWluZXJFbCwgaWRQcmVmaXgsIGhhbmRsZXJzID0ge30pIHtcbiAgaWYgKCFjb250YWluZXJFbCkgcmV0dXJuO1xuICBjb25zdCBndWFyZEtleSA9IGBwcm9wb3NhbExpc3RlbmVyc0F0dGFjaGVkXyR7aWRQcmVmaXh9YDtcbiAgaWYgKGNvbnRhaW5lckVsLmRhdGFzZXRbZ3VhcmRLZXldKSByZXR1cm47XG4gIGNvbnRhaW5lckVsLmRhdGFzZXRbZ3VhcmRLZXldID0gJzEnO1xuXG4gIGNvbnRhaW5lckVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB7XG4gICAgY29uc3QgdG9nZ2xlID0gZXZlbnQudGFyZ2V0LmNsb3Nlc3QoJ1tkYXRhLXRvZ2dsZS1yZWFzb25pbmddJyk7XG4gICAgaWYgKCF0b2dnbGUpIHJldHVybjtcbiAgICBjb25zdCBpZCA9IHRvZ2dsZS5kYXRhc2V0LnRvZ2dsZVJlYXNvbmluZztcbiAgICBjb25zdCByZWFzb25FbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2lkUHJlZml4fS1yZWFzb24tJHtpZH1gKTtcbiAgICBpZiAocmVhc29uRWwpIHtcbiAgICAgIGNvbnN0IG5vd1Zpc2libGUgPSByZWFzb25FbC5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZSc7XG4gICAgICByZWFzb25FbC5zdHlsZS5kaXNwbGF5ID0gbm93VmlzaWJsZSA/ICdibG9jaycgOiAnbm9uZSc7XG4gICAgICB0b2dnbGUuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgU3RyaW5nKG5vd1Zpc2libGUpKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBoYW5kbGVycy5vblRvZ2dsZVJlYXNvbmluZyA9PT0gJ2Z1bmN0aW9uJykgaGFuZGxlcnMub25Ub2dnbGVSZWFzb25pbmcoaWQpO1xuICB9KTtcbn1cbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL2xsbS1sb2cuanNcbiAqIEZldGNoZXMgcmF3IExMTSBpbnRlcmFjdGlvbiBsb2cgZW50cmllcyBmcm9tIC9hcGkvbGxtLWxvZyBhbmQgZGlzcGxheXNcbiAqIHRoZW0gaW4gdGhlIENvbnZlcnNhdGlvbiBwYW5lbCBhcyBjb2xsYXBzaWJsZSB0cmFuc2NyaXB0IGVudHJpZXMuXG4gKlxuICogRWFjaCBMTE0gY2FsbCBzaG93czpcbiAqICAgLSBIZWFkZXI6IHRpbWVzdGFtcCBhbmQgbWVzc2FnZS1jb3VudCBzdW1tYXJ5XG4gKiAgIC0gUHJvbXB0IHNlY3Rpb246IGFsbCBtZXNzYWdlcyBzZW50IChyb2xlLXByZWZpeGVkKSwgY29sbGFwc2libGUgd2hlbiBsb25nXG4gKiAgIC0gUmVzcG9uc2Ugc2VjdGlvbjogcmF3IExMTSByZXNwb25zZSwgY29sbGFwc2libGUgd2hlbiBsb25nXG4gKlxuICogREVQRU5ERU5DSUVTIChnbG9iYWxUaGlzKTpcbiAqICAgLSBhcHBlbmRNZXNzYWdlSHRtbCAgKG1lc3NhZ2UtcXVldWUuanMpXG4gKiAgIC0gZ2V0U2Vzc2lvbklkRnJvbVVSTCAoYXBpLWNsaWVudC5qcylcbiAqL1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBlc2NhcGVIdG1sIH0gZnJvbSAnLi91dGlscy5qcyc7XG5pbXBvcnQgeyBnZXRTZXNzaW9uSWRGcm9tVVJMIH0gZnJvbSAnLi9hcGktY2xpZW50LmpzJztcblxuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdsbG0tbG9nJyk7XG5cbi8vIEN1cnNvciB0cmFja3MgdGhlIG5leHQgaW5kZXggdG8gZmV0Y2ggZnJvbSAvYXBpL2xsbS1sb2cuXG4vLyBJbmNyZW1lbnQgYWZ0ZXIgZWFjaCBzdWNjZXNzZnVsIGZldGNoIGJ5IGB0b3RhbGAgcmV0dXJuZWQgZnJvbSB0aGUgc2VydmVyLlxubGV0IF9sbG1Mb2dDdXJzb3IgPSAwO1xuXG4vKiogUmVzZXQgdGhlIGN1cnNvciB0byAwIChjYWxsIHdoZW4gYSBuZXcgc2Vzc2lvbiBpcyBsb2FkZWQpLiAqL1xuZnVuY3Rpb24gcmVzZXRMbG1Mb2dDdXJzb3IoKSB7XG4gIF9sbG1Mb2dDdXJzb3IgPSAwO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIENvbGxhcHNpYmxlIEhUTUwgYnVpbGRlciAobWlycm9ycyBfbWFrZUNvbGxhcHNpYmxlQ29udGVudCBpbiBtZXNzYWdlLXF1ZXVlLmpzKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IF9MT0dfQ09MTEFQU0VfTElORVMgPSA4O1xuY29uc3QgX0xPR19DT0xMQVBTRV9DSEFSUyA9IDQ4MDtcblxuLyoqXG4gKiBXcmFwIGB0ZXh0YCBpbiBhIGNvbGxhcHNpYmxlIDxwcmU+IGJsb2NrIHdoZW4gaXQgZXhjZWVkcyB0aGUgdGhyZXNob2xkLlxuICogUmV0dXJucyBhbiBIVE1MIHN0cmluZyByZWFkeSBmb3IgaW5zZXJ0aW9uIHZpYSBpbm5lckhUTUwuXG4gKi9cbmZ1bmN0aW9uIF9jb2xsYXBzaWJsZVByZSh0ZXh0KSB7XG4gIGNvbnN0IGVzY2FwZWQgPSBlc2NhcGVIdG1sKHRleHQpO1xuICBjb25zdCBsaW5lcyAgID0gdGV4dC5zcGxpdCgnXFxuJyk7XG5cbiAgaWYgKGxpbmVzLmxlbmd0aCA8PSBfTE9HX0NPTExBUFNFX0xJTkVTICYmIHRleHQubGVuZ3RoIDw9IF9MT0dfQ09MTEFQU0VfQ0hBUlMpIHtcbiAgICByZXR1cm4gYDxwcmUgY2xhc3M9XCJsbG0tbG9nLXRleHRcIj4ke2VzY2FwZWR9PC9wcmU+YDtcbiAgfVxuXG4gIGNvbnN0IHByZXZpZXdUZXh0ID0gbGluZXMuc2xpY2UoMCwgX0xPR19DT0xMQVBTRV9MSU5FUykuam9pbignXFxuJyk7XG4gIGNvbnN0IG92ZXJmbG93ICAgID0gbGluZXMubGVuZ3RoIC0gX0xPR19DT0xMQVBTRV9MSU5FUztcbiAgY29uc3QgaWQgICAgICAgICAgPSBgbGxtbG9nLSR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCA3KX1gO1xuICBjb25zdCBsYWJlbCAgICAgICA9IGBTaG93ICR7b3ZlcmZsb3d9IG1vcmUgbGluZSR7b3ZlcmZsb3cgPT09IDEgPyAnJyA6ICdzJ31cdTIwMjZgO1xuXG4gIHJldHVybiBgXG4gICAgPHByZSBjbGFzcz1cImxsbS1sb2ctdGV4dCBtc2ctcHJldmlld1wiIGlkPVwiJHtpZH0tcHJldmlld1wiPiR7ZXNjYXBlSHRtbChwcmV2aWV3VGV4dCl9XHUyMDI2PC9wcmU+XG4gICAgPHByZSBjbGFzcz1cImxsbS1sb2ctdGV4dCBtc2ctZnVsbFwiICAgIGlkPVwiJHtpZH0tZnVsbFwiIHN0eWxlPVwiZGlzcGxheTpub25lXCI+JHtlc2NhcGVkfTwvcHJlPlxuICAgIDxidXR0b24gY2xhc3M9XCJtc2ctdG9nZ2xlLWJ0blwiIHR5cGU9XCJidXR0b25cIlxuICAgICAgb25jbGljaz1cIihmdW5jdGlvbihidG4pe1xuICAgICAgICB2YXIgcD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnJHtpZH0tcHJldmlldycpLFxuICAgICAgICAgICAgZj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnJHtpZH0tZnVsbCcpO1xuICAgICAgICBpZihmLnN0eWxlLmRpc3BsYXk9PT0nbm9uZScpe1xuICAgICAgICAgIHAuc3R5bGUuZGlzcGxheT0nbm9uZSc7IGYuc3R5bGUuZGlzcGxheT0nYmxvY2snOyBidG4udGV4dENvbnRlbnQ9J1Nob3cgbGVzcyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcC5zdHlsZS5kaXNwbGF5PScnOyBmLnN0eWxlLmRpc3BsYXk9J25vbmUnOyBidG4udGV4dENvbnRlbnQ9JyR7bGFiZWx9JztcbiAgICAgICAgfVxuICAgICAgfSkodGhpcylcIj4ke2xhYmVsfTwvYnV0dG9uPmA7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUmVuZGVyIG9uZSBpbnRlcmFjdGlvbiBpbnRvIHRoZSBjb252ZXJzYXRpb24gcGFuZWxcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiBfcmVuZGVySW50ZXJhY3Rpb24oaXgpIHtcbiAgY29uc3QgY29udmVyc2F0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbnZlcnNhdGlvbicpO1xuICBpZiAoIWNvbnZlcnNhdGlvbikgcmV0dXJuO1xuXG4gIGNvbnN0IHRzID0gaXgudGltZXN0YW1wXG4gICAgPyBuZXcgRGF0ZShpeC50aW1lc3RhbXApLnRvTG9jYWxlVGltZVN0cmluZyhbXSwgeyBob3VyOiAnMi1kaWdpdCcsIG1pbnV0ZTogJzItZGlnaXQnLCBzZWNvbmQ6ICcyLWRpZ2l0JyB9KVxuICAgIDogJyc7XG5cbiAgY29uc3QgbXNncyAgICAgPSBBcnJheS5pc0FycmF5KGl4Lm1lc3NhZ2VzKSA/IGl4Lm1lc3NhZ2VzIDogW107XG4gIGNvbnN0IG1zZ0NvdW50ID0gbXNncy5sZW5ndGg7XG5cbiAgLy8gQnVpbGQgZm9ybWF0dGVkIHByb21wdCB0ZXh0OiBlYWNoIG1lc3NhZ2Ugb24gaXRzIG93biBsYWJlbGxlZCBibG9ja1xuICBjb25zdCBwcm9tcHRUZXh0ID0gbXNnc1xuICAgIC5tYXAobSA9PiBgWyR7KG0ucm9sZSB8fCAndW5rbm93bicpLnRvVXBwZXJDYXNlKCl9XVxcbiR7bS5jb250ZW50IHx8ICcnfWApXG4gICAgLmpvaW4oJ1xcblxcblx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxcblxcbicpO1xuXG4gIGNvbnN0IHJlc3BvbnNlVGV4dCA9IHR5cGVvZiBpeC5yZXNwb25zZSA9PT0gJ3N0cmluZycgPyBpeC5yZXNwb25zZSA6ICcnO1xuXG4gIGNvbnN0IGh0bWwgPSBgXG4gICAgPGRpdiBjbGFzcz1cImxsbS1sb2ctaGVhZGVyXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImxsbS1sb2ctaWNvblwiPlx1RDgzRVx1REQxNjwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwibGxtLWxvZy1sYWJlbFwiPkxMTSBJbnRlcmFjdGlvbjwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwibGxtLWxvZy1tZXRhXCI+JHttc2dDb3VudH0gbWVzc2FnZSR7bXNnQ291bnQgPT09IDEgPyAnJyA6ICdzJ308L3NwYW4+XG4gICAgICAke3RzID8gYDxzcGFuIGNsYXNzPVwibGxtLWxvZy10c1wiPiR7ZXNjYXBlSHRtbCh0cyl9PC9zcGFuPmAgOiAnJ31cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibGxtLWxvZy1zZWN0aW9uXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibGxtLWxvZy1zZWN0aW9uLWxhYmVsXCI+UHJvbXB0PC9kaXY+XG4gICAgICAke19jb2xsYXBzaWJsZVByZShwcm9tcHRUZXh0KX1cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibGxtLWxvZy1zZWN0aW9uXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibGxtLWxvZy1zZWN0aW9uLWxhYmVsXCI+UmVzcG9uc2U8L2Rpdj5cbiAgICAgICR7X2NvbGxhcHNpYmxlUHJlKHJlc3BvbnNlVGV4dCl9XG4gICAgPC9kaXY+YDtcblxuICBjb25zdCBtZXNzYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIG1lc3NhZ2UuY2xhc3NOYW1lID0gJ21lc3NhZ2UgbGxtLXJhdyc7XG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgY29udGVudC5jbGFzc05hbWUgPSAnY29udGVudCc7XG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gaHRtbDtcbiAgbWVzc2FnZS5hcHBlbmRDaGlsZChjb250ZW50KTtcbiAgY29udmVyc2F0aW9uLmFwcGVuZENoaWxkKG1lc3NhZ2UpO1xuICBjb252ZXJzYXRpb24uc2Nyb2xsVG9wID0gY29udmVyc2F0aW9uLnNjcm9sbEhlaWdodDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBQdWJsaWMgQVBJXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBGZXRjaCBMTE0gaW50ZXJhY3Rpb24gbG9nIGVudHJpZXMgYWRkZWQgc2luY2UgdGhlIGxhc3QgY2FsbCBhbmQgZGlzcGxheVxuICogZWFjaCBvbmUgaW4gdGhlIENvbnZlcnNhdGlvbiBwYW5lbC4gIFNhZmUgdG8gY2FsbCBhZnRlciBldmVyeSBiYWNrZW5kXG4gKiBvcGVyYXRpb24gdGhhdCBtYXkgdHJpZ2dlciBMTE0gY2FsbHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZldGNoQW5kRGlzcGxheUxsbUxvZygpIHtcbiAgY29uc3Qgc2Vzc2lvbklkID0gZ2V0U2Vzc2lvbklkRnJvbVVSTCgpO1xuICBpZiAoIXNlc3Npb25JZCkgcmV0dXJuO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goXG4gICAgICBgL2FwaS9sbG0tbG9nP3Nlc3Npb25faWQ9JHtlbmNvZGVVUklDb21wb25lbnQoc2Vzc2lvbklkKX0mc2luY2U9JHtfbGxtTG9nQ3Vyc29yfWAsXG4gICAgKTtcbiAgICBpZiAoIXJlcy5vaykge1xuICAgICAgbG9nLndhcm4oJ2xsbS1sb2cgZmV0Y2ggZmFpbGVkJywgcmVzLnN0YXR1cyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGRhdGEgICAgICAgICA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgY29uc3QgaW50ZXJhY3Rpb25zID0gQXJyYXkuaXNBcnJheShkYXRhLmludGVyYWN0aW9ucykgPyBkYXRhLmludGVyYWN0aW9ucyA6IFtdO1xuXG4gICAgZm9yIChjb25zdCBpeCBvZiBpbnRlcmFjdGlvbnMpIHtcbiAgICAgIF9yZW5kZXJJbnRlcmFjdGlvbihpeCk7XG4gICAgfVxuXG4gICAgLy8gQWR2YW5jZSBjdXJzb3IgdG8gdGhlIG5ldyB0b3RhbCBzbyB0aGUgbmV4dCBjYWxsIGZldGNoZXMgb25seSBuZXcgZW50cmllcy5cbiAgICBpZiAodHlwZW9mIGRhdGEudG90YWwgPT09ICdudW1iZXInKSB7XG4gICAgICBfbGxtTG9nQ3Vyc29yID0gZGF0YS50b3RhbDtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy5lcnJvcignZmV0Y2hBbmREaXNwbGF5TGxtTG9nIGVycm9yOicsIGVycik7XG4gIH1cbn1cblxuZXhwb3J0IHsgZmV0Y2hBbmREaXNwbGF5TGxtTG9nLCByZXNldExsbUxvZ0N1cnNvciB9O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvYXV0aC1wcm92aWRlci5qc1xuICogQ29waWxvdCAvIEdpdEh1YiBPQXV0aCBhdXRoIGZsb3csIGJhZGdlIHVwZGF0ZXMsIGFuZCBwcm92aWRlciBsYWJlbCBmb3JtYXR0aW5nLlxuICpcbiAqIERFUEVOREVOQ0lFUzpcbiAqICAgLSBjb25maXJtRGlhbG9nIGZyb20gdWktY29yZS5qcyAob24gZ2xvYmFsVGhpcylcbiAqICAgLSBzZXRJbml0aWFsRm9jdXMsIHRyYXBGb2N1cywgcmVzdG9yZUZvY3VzIGZyb20gdWktY29yZS5qcyAob24gZ2xvYmFsVGhpcylcbiAqICAgLSB1cGRhdGVBdXRoQmFkZ2UgKHNlbGYtcmVmZXJlbmNlOyBleHBvcnRlZCB0byBnbG9iYWxUaGlzKVxuICogICAtIGdldFByb3ZpZGVySW5mbyBmcm9tIHByb3ZpZGVyLWluZm8uanMgKGltcG9ydGVkIGRpcmVjdGx5KVxuICovXG5cbmltcG9ydCB7IGdldFByb3ZpZGVySW5mbyB9IGZyb20gJy4vcHJvdmlkZXItaW5mby5qcyc7XG5cbmxldCBfYXV0aFBvbGxUaW1lciA9IG51bGw7XG5cbmZ1bmN0aW9uIGZvcm1hdFByb3ZpZGVyTGFiZWwocHJvdmlkZXIpIHtcbiAgaWYgKCFwcm92aWRlciB8fCB0eXBlb2YgcHJvdmlkZXIgIT09ICdzdHJpbmcnKSByZXR1cm4gJ1Byb3ZpZGVyJztcbiAgY29uc3QgYWxpYXNlcyA9IHtcbiAgICBvcGVuYWk6ICdPcGVuQUknLFxuICAgICdjb3BpbG90LW9hdXRoJzogJ0NvcGlsb3QgT0F1dGggKGRlcHJlY2F0ZWQpJyxcbiAgICBjb3BpbG90OiAnQ29waWxvdCAoZGVwcmVjYXRlZCknLFxuICAgIGdpdGh1YjogJ0dpdEh1YiBNb2RlbHMgKGRlcHJlY2F0ZWQpJyxcbiAgICAnY29waWxvdC1zZGsnOiAnQ29waWxvdCBTREsgKHJlY29tbWVuZGVkKScsXG4gIH07XG4gIGlmIChhbGlhc2VzW3Byb3ZpZGVyXSkgcmV0dXJuIGFsaWFzZXNbcHJvdmlkZXJdO1xuICByZXR1cm4gcHJvdmlkZXJcbiAgICAuc3BsaXQoL1stX1xcc10rLylcbiAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgLm1hcChwYXJ0ID0+IHBhcnQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBwYXJ0LnNsaWNlKDEpLnRvTG93ZXJDYXNlKCkpXG4gICAgLmpvaW4oJyAnKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlQXV0aEJhZGdlKGF1dGhTdGF0dXMsIHByb3ZpZGVyID0gbnVsbCkge1xuICBjb25zdCBsZWdhY3lCYWRnZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb3BpbG90LWF1dGgtYmFkZ2UnKTtcbiAgY29uc3QgbGVnYWN5SWNvbiAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXV0aC1iYWRnZS1pY29uJyk7XG4gIGNvbnN0IGxlZ2FjeUxhYmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F1dGgtYmFkZ2UtbGFiZWwnKTtcblxuICBjb25zdCBwaWxsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbS1zdGF0dXMtcGlsbCcpO1xuICBjb25zdCBwaWxsSWNvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG0tc3RhdHVzLWljb24nKTtcbiAgY29uc3QgcGlsbExhYmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbS1zdGF0dXMtbGFiZWwnKTtcblxuICBjb25zdCBhcHBseVN0YXRlID0gKGtpbmQsIHRleHQsIGljb25UZXh0KSA9PiB7XG4gICAgaWYgKGxlZ2FjeUJhZGdlICYmIGxlZ2FjeUljb24gJiYgbGVnYWN5TGFiZWwpIHtcbiAgICAgIGxlZ2FjeUJhZGdlLmNsYXNzTGlzdC5yZW1vdmUoJ2F1dGhlbnRpY2F0ZWQnLCAndW5hdXRoZW50aWNhdGVkJywgJ3BvbGxpbmcnKTtcbiAgICAgIGxlZ2FjeUJhZGdlLmNsYXNzTGlzdC5hZGQoa2luZCk7XG4gICAgICBpZiAoa2luZCA9PT0gJ2Nvbm5lY3RlZCcgfHwga2luZCA9PT0gJ2NvbmZpZ3VyZWQnKSBsZWdhY3lCYWRnZS5jbGFzc0xpc3QuYWRkKCdhdXRoZW50aWNhdGVkJyk7XG4gICAgICBpZiAoa2luZCA9PT0gJ2Nvbm5lY3RpbmcnKSBsZWdhY3lCYWRnZS5jbGFzc0xpc3QuYWRkKCdwb2xsaW5nJyk7XG4gICAgICBpZiAoa2luZCA9PT0gJ3VuY29uZmlndXJlZCcgfHwga2luZCA9PT0gJ2F1dGgtcmVxdWlyZWQnIHx8IGtpbmQgPT09ICdyYXRlLWxpbWl0ZWQnIHx8IGtpbmQgPT09ICd1bmF2YWlsYWJsZScgfHwga2luZCA9PT0gJ2Vycm9yJykgbGVnYWN5QmFkZ2UuY2xhc3NMaXN0LmFkZCgndW5hdXRoZW50aWNhdGVkJyk7XG4gICAgICBsZWdhY3lJY29uLnRleHRDb250ZW50ID0gaWNvblRleHQ7XG4gICAgICBsZWdhY3lMYWJlbC50ZXh0Q29udGVudCA9IHRleHQ7XG4gICAgfVxuICAgIGlmIChwaWxsICYmIHBpbGxJY29uICYmIHBpbGxMYWJlbCkge1xuICAgICAgcGlsbC5jbGFzc0xpc3QucmVtb3ZlKCdhdXRoZW50aWNhdGVkJywgJ3VuYXV0aGVudGljYXRlZCcsICdwb2xsaW5nJywgJ3VuY29uZmlndXJlZCcsICdjb25maWd1cmVkJywgJ2Nvbm5lY3RpbmcnLCAnY29ubmVjdGVkJywgJ2F1dGgtcmVxdWlyZWQnLCAncmF0ZS1saW1pdGVkJywgJ3VuYXZhaWxhYmxlJywgJ2Vycm9yJyk7XG4gICAgICBwaWxsLmNsYXNzTGlzdC5hZGQoa2luZCk7XG4gICAgICBpZiAoa2luZCA9PT0gJ2Nvbm5lY3RlZCcgfHwga2luZCA9PT0gJ2NvbmZpZ3VyZWQnKSBwaWxsLmNsYXNzTGlzdC5hZGQoJ2F1dGhlbnRpY2F0ZWQnKTtcbiAgICAgIGlmIChraW5kID09PSAnY29ubmVjdGluZycpIHBpbGwuY2xhc3NMaXN0LmFkZCgncG9sbGluZycpO1xuICAgICAgaWYgKGtpbmQgPT09ICd1bmNvbmZpZ3VyZWQnIHx8IGtpbmQgPT09ICdhdXRoLXJlcXVpcmVkJyB8fCBraW5kID09PSAncmF0ZS1saW1pdGVkJyB8fCBraW5kID09PSAndW5hdmFpbGFibGUnIHx8IGtpbmQgPT09ICdlcnJvcicpIHBpbGwuY2xhc3NMaXN0LmFkZCgndW5hdXRoZW50aWNhdGVkJyk7XG4gICAgICBwaWxsSWNvbi50ZXh0Q29udGVudCA9IGljb25UZXh0O1xuICAgICAgcGlsbExhYmVsLnRleHRDb250ZW50ID0gdGV4dDtcbiAgICAgIGNvbnN0IHRvb2x0aXBNYXAgPSB7XG4gICAgICAgIHVuY29uZmlndXJlZDogJ05vIHByb3ZpZGVyL21vZGVsIGlzIGNvbmZpZ3VyZWQgeWV0LicsXG4gICAgICAgIGNvbmZpZ3VyZWQ6ICdQcm92aWRlci9tb2RlbCBpcyBjb25maWd1cmVkLiBDb25uZWN0aXZpdHkgbm90IHlldCB2ZXJpZmllZC4nLFxuICAgICAgICBjb25uZWN0aW5nOiAnVGVzdGluZyBvciBjb25uZWN0aW5nIHRvIHRoZSBzZWxlY3RlZCBwcm92aWRlci4nLFxuICAgICAgICBjb25uZWN0ZWQ6ICdQcm92aWRlciByZXNwb25kZWQgc3VjY2Vzc2Z1bGx5IHRvIGEgbGl2ZSByZXF1ZXN0LicsXG4gICAgICAgICdhdXRoLXJlcXVpcmVkJzogJ0F1dGhlbnRpY2F0aW9uIGlzIHJlcXVpcmVkLiBDaGVjayBBUEkga2V5IG9yIHNpZ24gaW4uJyxcbiAgICAgICAgJ3JhdGUtbGltaXRlZCc6ICdSYXRlIGxpbWl0IHJlYWNoZWQuIFdhaXQgYmVmb3JlIHJldHJ5aW5nIHJlcXVlc3RzLicsXG4gICAgICAgIHVuYXZhaWxhYmxlOiAnUHJvdmlkZXIgaXMgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGUgb3IgdW5yZWFjaGFibGUuJyxcbiAgICAgICAgZXJyb3I6ICdDb25uZWN0aW9uIGZhaWxlZC4gT3BlbiBtb2RlbCBzZXR0aW5ncyBmb3IgZGV0YWlscy4nLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHRpcCA9IHRvb2x0aXBNYXBba2luZF0gfHwgJyc7XG4gICAgICBwaWxsLnRpdGxlID0gdGlwO1xuICAgICAgcGlsbEljb24udGl0bGUgPSB0aXA7XG4gICAgICBwaWxsTGFiZWwudGl0bGUgPSB0aXA7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGFjdGl2ZVByb3ZpZGVyID0gcHJvdmlkZXIgfHwgd2luZG93LmN1cnJlbnRQcm92aWRlciB8fCBudWxsO1xuICBjb25zdCBpc0NvcGlsb3RPQXV0aCA9IGFjdGl2ZVByb3ZpZGVyID09PSAnY29waWxvdC1vYXV0aCc7XG5cbiAgLy8gTm9uLWNvbmZpZGVudGlhbCBiYWRnZTogc2hvdyB1bmxlc3MgdGhlIHByb3ZpZGVyIGV4cGxpY2l0bHkgbWFya3MgY29uZmlkZW50aWFsOnRydWUuXG4gIC8vIERlZmF1bHQgaXMgbm9uLWNvbmZpZGVudGlhbCAoZmFpbC1zYWZlIFx1MjAxNCBtb3N0IHByb3ZpZGVycyByZXRhaW4vcmV2aWV3IEFQSSBkYXRhKS5cbiAgY29uc3QgbmNCYWRnZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG0tbm9uLWNvbmZpZGVudGlhbC1iYWRnZScpO1xuICBpZiAobmNCYWRnZSAmJiBhY3RpdmVQcm92aWRlcikge1xuICAgIGNvbnN0IGluZm8gPSBnZXRQcm92aWRlckluZm8oYWN0aXZlUHJvdmlkZXIpO1xuICAgIG5jQmFkZ2Uuc3R5bGUuZGlzcGxheSA9IChpbmZvICYmIGluZm8uY29uZmlkZW50aWFsICE9PSB0cnVlKSA/ICcnIDogJ25vbmUnO1xuICB9XG5cbiAgaWYgKGFjdGl2ZVByb3ZpZGVyICYmICFpc0NvcGlsb3RPQXV0aCkge1xuICAgIGFwcGx5U3RhdGUoJ2NvbmZpZ3VyZWQnLCBgJHtmb3JtYXRQcm92aWRlckxhYmVsKGFjdGl2ZVByb3ZpZGVyKX0gY29uZmlndXJlZGAsICdcdTI1RDQnKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoYXV0aFN0YXR1cy5hdXRoZW50aWNhdGVkKSB7XG4gICAgYXBwbHlTdGF0ZSgnY29ubmVjdGVkJywgJ0NvcGlsb3QgcmVhZHknLCAnXHUyNzEzJyk7XG4gIH0gZWxzZSBpZiAoYXV0aFN0YXR1cy5wb2xsaW5nKSB7XG4gICAgYXBwbHlTdGF0ZSgnY29ubmVjdGluZycsICdXYWl0aW5nIGZvciBhcHByb3ZhbFx1MjAyNicsICdcdTI5RDcnKTtcbiAgfSBlbHNlIHtcbiAgICBhcHBseVN0YXRlKCdhdXRoLXJlcXVpcmVkJywgJ05vdCBhdXRoZW50aWNhdGVkJywgJ1x1RDgzRFx1REQxMScpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNsb3NlQ29waWxvdEF1dGhNb2RhbCgpIHtcbiAgaWYgKF9hdXRoUG9sbFRpbWVyKSB7IGNsZWFySW50ZXJ2YWwoX2F1dGhQb2xsVGltZXIpOyBfYXV0aFBvbGxUaW1lciA9IG51bGw7IH1cbiAgaWYgKHR5cGVvZiBjbG9zZU1vZGVsTW9kYWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjbG9zZU1vZGVsTW9kYWwoKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgbGVnYWN5T3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdXRoLW1vZGFsLW92ZXJsYXknKTtcbiAgaWYgKGxlZ2FjeU92ZXJsYXkpIGxlZ2FjeU92ZXJsYXkuY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZScpO1xuICBpZiAodHlwZW9mIHJlc3RvcmVGb2N1cyA9PT0gJ2Z1bmN0aW9uJykgcmVzdG9yZUZvY3VzKCk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFUyBtb2R1bGUgZXhwb3J0cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmV4cG9ydCB7XG4gIGZvcm1hdFByb3ZpZGVyTGFiZWwsIHVwZGF0ZUF1dGhCYWRnZSxcbiAgY2xvc2VDb3BpbG90QXV0aE1vZGFsLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogYXRzLW1vZGFscy5qc1xuICogQVRTIFJlcG9ydCBhbmQgSm9iIEFuYWx5c2lzIG1vZGFsIGRpYWxvZ3MgKyBBVFMgU2NvcmUgdGFiIHJlbmRlcmVyLlxuICpcbiAqIERFUEVOREVOQ0lFUzpcbiAqIC0gc3RhdGUtbWFuYWdlci5qcyBmb3IgcGVyc2lzdGVkIEFUUyBzY29yZSArIGFuYWx5c2lzIGRhdGFcbiAqIC0gdXRpbHMuanMgZm9yIEhUTUwgZXNjYXBpbmdcbiAqIC0gYXRzLXJlZmluZW1lbnQuanMgZm9yIEFUUyBmZXRjaC9iYWRnZSB1cGRhdGVzXG4gKiAtIGluZGV4Lmh0bWwgbW9kYWwgb3ZlcmxheXM6ICNhdHMtcmVwb3J0LW1vZGFsLW92ZXJsYXksICNqb2ItYW5hbHlzaXMtbW9kYWwtb3ZlcmxheVxuICovXG5cbmltcG9ydCB7IHJlZnJlc2hBdHNTY29yZSwgdXBkYXRlQXRzQmFkZ2UgfSBmcm9tICcuL2F0cy1yZWZpbmVtZW50LmpzJztcbmltcG9ydCB7IHN0YXRlTWFuYWdlciB9IGZyb20gJy4vc3RhdGUtbWFuYWdlci5qcyc7XG5pbXBvcnQgeyBlc2NhcGVIdG1sIH0gZnJvbSAnLi91dGlscy5qcyc7XG5pbXBvcnQgeyB0cmFwRm9jdXMsIHJlc3RvcmVGb2N1cywgcHVzaEZvY3VzU3RhY2sgfSBmcm9tICcuL3VpLWNvcmUuanMnO1xuXG5sZXQgX2F0c1N5bm9ueW1NYXBDYWNoZSA9IG51bGw7XG5cbmFzeW5jIGZ1bmN0aW9uIF9sb2FkQXRzU3lub255bU1hcCgpIHtcbiAgaWYgKF9hdHNTeW5vbnltTWFwQ2FjaGUpIHJldHVybiBfYXRzU3lub255bU1hcENhY2hlO1xuICB0cnkge1xuICAgIGNvbnN0IHNlc3Npb25JZCA9IHN0YXRlTWFuYWdlcj8uZ2V0U2Vzc2lvbklkPy4oKTtcbiAgICBjb25zdCB1cmwgPSBzZXNzaW9uSWQgPyBgL2FwaS9zeW5vbnltLW1hcD9zZXNzaW9uX2lkPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHNlc3Npb25JZCl9YCA6ICcvYXBpL3N5bm9ueW0tbWFwJztcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICAgIGlmICghcmVzLm9rKSByZXR1cm4gKF9hdHNTeW5vbnltTWFwQ2FjaGUgPSB7fSk7XG4gICAgY29uc3QgcmF3ID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBjb25zdCBhbGlhc1RvQ2Fub24gPSB7fTtcbiAgICBjb25zdCBjYW5vblRvQWxpYXNlcyA9IHt9O1xuICAgIE9iamVjdC5lbnRyaWVzKHJhdykuZm9yRWFjaCgoW2FsaWFzLCBjYW5vbl0pID0+IHtcbiAgICAgIGFsaWFzVG9DYW5vblthbGlhcy50b0xvd2VyQ2FzZSgpXSA9IGNhbm9uO1xuICAgICAgY29uc3QgY2wgPSBjYW5vbi50b0xvd2VyQ2FzZSgpO1xuICAgICAgKGNhbm9uVG9BbGlhc2VzW2NsXSA9IGNhbm9uVG9BbGlhc2VzW2NsXSB8fCBbXSkucHVzaChhbGlhcyk7XG4gICAgfSk7XG4gICAgX2F0c1N5bm9ueW1NYXBDYWNoZSA9IHsgYWxpYXNUb0Nhbm9uLCBjYW5vblRvQWxpYXNlcyB9O1xuICB9IGNhdGNoIChfKSB7IF9hdHNTeW5vbnltTWFwQ2FjaGUgPSB7fTsgfVxuICByZXR1cm4gX2F0c1N5bm9ueW1NYXBDYWNoZTtcbn1cblxuZnVuY3Rpb24gX2t3U3luQW5ub3RhdGlvbihrdywgc3luTWFwKSB7XG4gIGlmICghc3luTWFwIHx8ICghc3luTWFwLmFsaWFzVG9DYW5vbiAmJiAhc3luTWFwLmNhbm9uVG9BbGlhc2VzKSkgcmV0dXJuICcnO1xuICBjb25zdCBrbCA9IChrdyB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgaWYgKHN5bk1hcC5hbGlhc1RvQ2Fub24gJiYgc3luTWFwLmFsaWFzVG9DYW5vbltrbF0pIHJldHVybiBgPSAke3N5bk1hcC5hbGlhc1RvQ2Fub25ba2xdfWA7XG4gIGNvbnN0IGFsaWFzZXMgPSBzeW5NYXAuY2Fub25Ub0FsaWFzZXMgJiYgc3luTWFwLmNhbm9uVG9BbGlhc2VzW2tsXTtcbiAgaWYgKGFsaWFzZXMgJiYgYWxpYXNlcy5sZW5ndGgpIHJldHVybiBgYWxzbzogJHthbGlhc2VzLmpvaW4oJywgJyl9YDtcbiAgcmV0dXJuICcnO1xufVxuXG5jb25zdCBBVFNfR1JPVVBTID0gW1xuICBbJ2hhcmQnLCAnSGFyZCBSZXF1aXJlbWVudHMnXSxcbiAgWydzb2Z0JywgJ1ByZWZlcnJlZCBTa2lsbHMnXSxcbiAgWydib251cycsICdcdTI2MDUgQm9udXMgS2V5d29yZHMnXSxcbl07XG5cbmZ1bmN0aW9uIF9rZXl3b3JkU3RhdHVzKGtleXdvcmQpIHtcbiAgcmV0dXJuIGtleXdvcmQ/LnN0YXR1cyB8fCAoa2V5d29yZD8uZm91bmQgPyAnbWF0Y2hlZCcgOiAnbWlzc2luZycpO1xufVxuXG5mdW5jdGlvbiBfa2V5d29yZFR5cGUoa2V5d29yZCkge1xuICByZXR1cm4ga2V5d29yZD8udHlwZSB8fCAnb3RoZXInO1xufVxuXG5mdW5jdGlvbiBfaXNFeGFjdE1hdGNoKGtleXdvcmQpIHtcbiAgcmV0dXJuIF9rZXl3b3JkU3RhdHVzKGtleXdvcmQpID09PSAnbWF0Y2hlZCcgJiYga2V5d29yZD8ubWF0Y2hfdHlwZSAhPT0gJ3BhcnRpYWwnO1xufVxuXG5mdW5jdGlvbiBfaXNQYXJ0aWFsTWF0Y2goa2V5d29yZCkge1xuICByZXR1cm4gX2tleXdvcmRTdGF0dXMoa2V5d29yZCkgPT09ICdwYXJ0aWFsJyB8fCBrZXl3b3JkPy5tYXRjaF90eXBlID09PSAncGFydGlhbCc7XG59XG5cbmZ1bmN0aW9uIF9rZXl3b3JkU29ydFZhbHVlKGtleXdvcmQpIHtcbiAgaWYgKF9rZXl3b3JkU3RhdHVzKGtleXdvcmQpID09PSAnbWlzc2luZycpIHJldHVybiAwO1xuICBpZiAoX2lzUGFydGlhbE1hdGNoKGtleXdvcmQpKSByZXR1cm4gMTtcbiAgcmV0dXJuIDI7XG59XG5cbmZ1bmN0aW9uIF9rZXl3b3JkU3RhdHVzQmFkZ2Uoa2V5d29yZCkge1xuICBpZiAoX2tleXdvcmRTdGF0dXMoa2V5d29yZCkgPT09ICdtaXNzaW5nJykge1xuICAgIHJldHVybiAnPHNwYW4gc3R5bGU9XCJkaXNwbGF5OmlubGluZS1ibG9jaztwYWRkaW5nOjJweCA4cHg7Ym9yZGVyLXJhZGl1czo5OTlweDtiYWNrZ3JvdW5kOiNmZWUyZTI7Y29sb3I6Izk5MWIxYjtmb250LXNpemU6MC44ZW07Zm9udC13ZWlnaHQ6NjAwO1wiPlx1Mjc0QyBNaXNzaW5nPC9zcGFuPic7XG4gIH1cbiAgaWYgKF9pc1BhcnRpYWxNYXRjaChrZXl3b3JkKSkge1xuICAgIHJldHVybiAnPHNwYW4gc3R5bGU9XCJkaXNwbGF5OmlubGluZS1ibG9jaztwYWRkaW5nOjJweCA4cHg7Ym9yZGVyLXJhZGl1czo5OTlweDtiYWNrZ3JvdW5kOiNmZWYzYzc7Y29sb3I6IzkyNDAwZTtmb250LXNpemU6MC44ZW07Zm9udC13ZWlnaHQ6NjAwO1wiPlx1MjZBMCBQYXJ0aWFsPC9zcGFuPic7XG4gIH1cbiAgcmV0dXJuICc8c3BhbiBzdHlsZT1cImRpc3BsYXk6aW5saW5lLWJsb2NrO3BhZGRpbmc6MnB4IDhweDtib3JkZXItcmFkaXVzOjk5OXB4O2JhY2tncm91bmQ6I2RjZmNlNztjb2xvcjojMTY2NTM0O2ZvbnQtc2l6ZTowLjhlbTtmb250LXdlaWdodDo2MDA7XCI+XHUyNzA1IE1hdGNoZWQ8L3NwYW4+Jztcbn1cblxuZnVuY3Rpb24gX3JlbmRlcktleXdvcmRHcm91cCh0aXRsZSwga2V5d29yZHMsIHN5bk1hcCkge1xuICBpZiAoa2V5d29yZHMubGVuZ3RoID09PSAwKSByZXR1cm4gJyc7XG5cbiAgY29uc3QgZXhhY3RDb3VudCA9IGtleXdvcmRzLmZpbHRlcihfaXNFeGFjdE1hdGNoKS5sZW5ndGg7XG4gIGNvbnN0IHBhcnRpYWxDb3VudCA9IGtleXdvcmRzLmZpbHRlcihfaXNQYXJ0aWFsTWF0Y2gpLmxlbmd0aDtcbiAgY29uc3QgbWlzc2luZ0NvdW50ID0ga2V5d29yZHMuZmlsdGVyKGtleXdvcmQgPT4gX2tleXdvcmRTdGF0dXMoa2V5d29yZCkgPT09ICdtaXNzaW5nJykubGVuZ3RoO1xuICBjb25zdCBzb3J0ZWQgPSBbLi4ua2V5d29yZHNdLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiB7XG4gICAgY29uc3QgcHJpb3JpdHkgPSBfa2V5d29yZFNvcnRWYWx1ZShsZWZ0KSAtIF9rZXl3b3JkU29ydFZhbHVlKHJpZ2h0KTtcbiAgICBpZiAocHJpb3JpdHkgIT09IDApIHJldHVybiBwcmlvcml0eTtcbiAgICByZXR1cm4gU3RyaW5nKGxlZnQua2V5d29yZCB8fCBsZWZ0LnRlcm0gfHwgJycpLmxvY2FsZUNvbXBhcmUoU3RyaW5nKHJpZ2h0LmtleXdvcmQgfHwgcmlnaHQudGVybSB8fCAnJykpO1xuICB9KTtcblxuICByZXR1cm4gYFxuICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOjE2cHg7XCI+XG4gICAgICA8aDQgc3R5bGU9XCJtYXJnaW46MCAwIDhweDtmb250LXNpemU6MXJlbTtjb2xvcjojMzM0MTU1O1wiPiR7ZXNjYXBlSHRtbCh0aXRsZSl9PC9oND5cbiAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC44MmVtO2NvbG9yOiM2NDc0OGI7bWFyZ2luLWJvdHRvbTo4cHg7XCI+JHtleGFjdENvdW50fSBleGFjdCBcdTIwMjIgJHtwYXJ0aWFsQ291bnR9IHBhcnRpYWwgXHUyMDIyICR7bWlzc2luZ0NvdW50fSBtaXNzaW5nPC9kaXY+XG4gICAgICA8dGFibGUgc3R5bGU9XCJ3aWR0aDoxMDAlO2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTtmb250LXNpemU6MC45ZW07XCI+XG4gICAgICAgIDx0aGVhZD5cbiAgICAgICAgICA8dHIgc3R5bGU9XCJ0ZXh0LWFsaWduOmxlZnQ7Y29sb3I6IzY0NzQ4Yjtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZTJlOGYwO1wiPlxuICAgICAgICAgICAgPHRoIHN0eWxlPVwicGFkZGluZzo2cHggOHB4O1wiPktleXdvcmQ8L3RoPlxuICAgICAgICAgICAgPHRoIHN0eWxlPVwicGFkZGluZzo2cHggOHB4O1wiPkNvdmVyYWdlPC90aD5cbiAgICAgICAgICAgIDx0aCBzdHlsZT1cInBhZGRpbmc6NnB4IDhweDtcIj5TZWN0aW9uczwvdGg+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgPC90aGVhZD5cbiAgICAgICAgPHRib2R5PlxuICAgICAgICAgICR7c29ydGVkLm1hcChrZXl3b3JkID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGt3ID0ga2V5d29yZC5rZXl3b3JkIHx8IGtleXdvcmQudGVybSB8fCAnJztcbiAgICAgICAgICAgIGNvbnN0IHNlY3Rpb25zID0gQXJyYXkuaXNBcnJheShrZXl3b3JkLm1hdGNoZWRfaW5fc2VjdGlvbnMpICYmIGtleXdvcmQubWF0Y2hlZF9pbl9zZWN0aW9ucy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgID8ga2V5d29yZC5tYXRjaGVkX2luX3NlY3Rpb25zLmpvaW4oJywgJylcbiAgICAgICAgICAgICAgOiAnTm90IGZvdW5kJztcbiAgICAgICAgICAgIGNvbnN0IHN5bkFubm90ID0gX2t3U3luQW5ub3RhdGlvbihrdywgc3luTWFwKTtcbiAgICAgICAgICAgIGNvbnN0IHN5bkh0bWwgPSBzeW5Bbm5vdFxuICAgICAgICAgICAgICA/IGA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuNzhlbTtjb2xvcjojNjQ3NDhiO21hcmdpbi10b3A6MnB4O1wiIHRpdGxlPVwiU3lub255bSBncm91cGluZ1wiPiR7ZXNjYXBlSHRtbChzeW5Bbm5vdCl9PC9kaXY+YFxuICAgICAgICAgICAgICA6ICcnO1xuICAgICAgICAgICAgcmV0dXJuIGBcbiAgICAgICAgICAgICAgPHRyIHN0eWxlPVwiYm9yZGVyLWJvdHRvbToxcHggc29saWQgI2YxZjVmOTt2ZXJ0aWNhbC1hbGlnbjp0b3A7XCI+XG4gICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzo4cHg7XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6NjAwO2NvbG9yOiMxZTI5M2I7XCI+JHtlc2NhcGVIdG1sKGt3KX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC44ZW07Y29sb3I6Izk0YTNiODt0ZXh0LXRyYW5zZm9ybTpjYXBpdGFsaXplO1wiPiR7ZXNjYXBlSHRtbChfa2V5d29yZFR5cGUoa2V5d29yZCkpfTwvZGl2PlxuICAgICAgICAgICAgICAgICAgJHtzeW5IdG1sfVxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzo4cHg7XCI+JHtfa2V5d29yZFN0YXR1c0JhZGdlKGtleXdvcmQpfTwvdGQ+XG4gICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzo4cHg7Y29sb3I6IzQ3NTU2OTtcIj4ke2VzY2FwZUh0bWwoc2VjdGlvbnMpfTwvdGQ+XG4gICAgICAgICAgICAgIDwvdHI+YDtcbiAgICAgICAgICB9KS5qb2luKCcnKX1cbiAgICAgICAgPC90Ym9keT5cbiAgICAgIDwvdGFibGU+XG4gICAgPC9kaXY+YDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBBVFMgUmVwb3J0IE1vZGFsXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBPcGVuIHRoZSBBVFMgUmVwb3J0IG1vZGFsLiBSZW5kZXJzIHRoZSBjYWNoZWQgQVRTIHNjb3JlIGZyb20gc3RhdGUsIG9yXG4gKiBmZXRjaGVzIGEgZnJlc2ggc2NvcmUgaWYgbm9uZSBpcyBjYWNoZWQuXG4gKi9cbmZ1bmN0aW9uIF9hdHNFc2NhcGVIYW5kbGVyKGUpIHtcbiAgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgY2xvc2VBdHNSZXBvcnRNb2RhbCgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBvcGVuQXRzUmVwb3J0TW9kYWwoKSB7XG4gIHB1c2hGb2N1c1N0YWNrKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpO1xuICBjb25zdCBvdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F0cy1yZXBvcnQtbW9kYWwtb3ZlcmxheScpO1xuICBvdmVybGF5LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBfYXRzRXNjYXBlSGFuZGxlcik7XG4gIC8vIE1vdmUgZm9jdXMgdG8gdGhlIENsb3NlIGJ1dHRvbiBpbiB0aGUgbW9kYWwgZm9vdGVyXG4gIGNvbnN0IGNsb3NlQnRuID0gb3ZlcmxheS5xdWVyeVNlbGVjdG9yKCcubW9kYWwtZm9vdGVyIC5hY3Rpb24tYnRuJyk7XG4gIGlmIChjbG9zZUJ0bikgY2xvc2VCdG4uZm9jdXMoKTtcbiAgdHJhcEZvY3VzKCdhdHMtcmVwb3J0LW1vZGFsLW92ZXJsYXknKTtcbiAgY29uc3QgYm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdHMtcmVwb3J0LW1vZGFsLWJvZHknKTtcblxuICAvLyBBIGNhY2hlZCBzY29yZSByZW5kZXJzIGltbWVkaWF0ZWx5IHVzaW5nIHdoYXRldmVyIHN5bm9ueW0gbWFwIGlzIGFscmVhZHlcbiAgLy8gY2FjaGVkIChvciBub25lKSByYXRoZXIgdGhhbiBibG9ja2luZyBvbiBhIG5ldHdvcmsgcm91bmQtdHJpcCBmb3IgaXQgXHUyMDE0XG4gIC8vIHRoZSBhbm5vdGF0aW9ucyBhcmUgYW4gZW5yaWNobWVudCwgbm90IHJlcXVpcmVkIGZvciBfcmVuZGVyQXRzUmVwb3J0IHRvXG4gIC8vIHdvcmssIGFuZCBhIGNhY2hlZC1zY29yZSBvcGVuIHNob3VsZCBiZSBpbnN0YW50LlxuICBjb25zdCBjYWNoZWQgPSBzdGF0ZU1hbmFnZXI/LmdldEF0c1Njb3JlPy4oKTtcbiAgaWYgKGNhY2hlZCkge1xuICAgIGJvZHkuaW5uZXJIVE1MID0gX3JlbmRlckF0c1JlcG9ydChjYWNoZWQsIF9hdHNTeW5vbnltTWFwQ2FjaGUgfHwge30pO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGJvZHkuaW5uZXJIVE1MID0gJzxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDoxMnB4O3BhZGRpbmc6MjRweDtjb2xvcjojNmI3MjgwO1wiPjxkaXYgY2xhc3M9XCJsb2FkaW5nLXNwaW5uZXJcIiBzdHlsZT1cIndpZHRoOjIwcHg7aGVpZ2h0OjIwcHg7Ym9yZGVyLXdpZHRoOjJweDtmbGV4LXNocmluazowO1wiPjwvZGl2PjxzcGFuPkZldGNoaW5nIEFUUyBzY29yZVx1MjAyNjwvc3Bhbj48L2Rpdj4nO1xuICB0cnkge1xuICAgIGNvbnN0IHNlc3Npb25JZCA9IHN0YXRlTWFuYWdlcj8uZ2V0U2Vzc2lvbklkPy4oKTtcbiAgICBjb25zdCBbc3luTWFwLCByZXNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgX2xvYWRBdHNTeW5vbnltTWFwKCksXG4gICAgICBmZXRjaCgnL2FwaS9jdi9hdHMtc2NvcmUnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBzZXNzaW9uX2lkOiBzZXNzaW9uSWQsIGJhc2lzOiAncmV2aWV3X2NoZWNrcG9pbnQnIH0pLFxuICAgICAgfSksXG4gICAgXSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEub2sgJiYgZGF0YS5hdHNfc2NvcmUpIHtcbiAgICAgIHN0YXRlTWFuYWdlcj8uc2V0QXRzU2NvcmU/LihkYXRhLmF0c19zY29yZSk7XG4gICAgICB1cGRhdGVBdHNCYWRnZShkYXRhLmF0c19zY29yZSk7XG4gICAgICBib2R5LmlubmVySFRNTCA9IF9yZW5kZXJBdHNSZXBvcnQoZGF0YS5hdHNfc2NvcmUsIHN5bk1hcCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJvZHkuaW5uZXJIVE1MID0gYDxwIHN0eWxlPVwicGFkZGluZzoyNHB4O2NvbG9yOiNlZjQ0NDQ7XCI+Q291bGQgbm90IGxvYWQgQVRTIHJlcG9ydDogJHtlc2NhcGVIdG1sKGRhdGEuZXJyb3IgfHwgJ3Vua25vd24gZXJyb3InKX08L3A+YDtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBib2R5LmlubmVySFRNTCA9IGA8cCBzdHlsZT1cInBhZGRpbmc6MjRweDtjb2xvcjojZWY0NDQ0O1wiPkVycm9yOiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX08L3A+YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBjbG9zZUF0c1JlcG9ydE1vZGFsKCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXRzLXJlcG9ydC1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIF9hdHNFc2NhcGVIYW5kbGVyKTtcbiAgcmVzdG9yZUZvY3VzKCk7XG59XG5cbi8qKlxuICogUmVuZGVyIGFuIEFUUyBzY29yZSBvYmplY3QgaW50byBIVE1MIGZvciB0aGUgbW9kYWwgYm9keS5cbiAqL1xuZnVuY3Rpb24gX3JlbmRlckF0c1JlcG9ydChzY29yZSwgc3luTWFwKSB7XG4gIGNvbnN0IG92ZXJhbGwgPSBNYXRoLnJvdW5kKHNjb3JlLm92ZXJhbGwgPz8gMCk7XG4gIGNvbnN0IGhhcmQgPSBNYXRoLnJvdW5kKHNjb3JlLmhhcmRfcmVxdWlyZW1lbnRfc2NvcmUgPz8gMCk7XG4gIGNvbnN0IHNvZnQgPSBNYXRoLnJvdW5kKHNjb3JlLnNvZnRfcmVxdWlyZW1lbnRfc2NvcmUgPz8gMCk7XG5cbiAgY29uc3Qgc2NvcmVDb2xvciA9IG92ZXJhbGwgPj0gNzUgPyAnIzEwYjk4MScgOiBvdmVyYWxsID49IDUwID8gJyNmNTllMGInIDogJyNlZjQ0NDQnO1xuXG4gIGNvbnN0IGtleXdvcmRzID0gc2NvcmUua2V5d29yZF9zdGF0dXMgfHwgW107XG4gIGNvbnN0IG1pc3NpbmdLdyA9IGtleXdvcmRzLmZpbHRlcihrZXl3b3JkID0+IF9rZXl3b3JkU3RhdHVzKGtleXdvcmQpID09PSAnbWlzc2luZycpO1xuICBjb25zdCBtaXNzaW5nSGFyZCA9IG1pc3NpbmdLdy5maWx0ZXIoa2V5d29yZCA9PiBfa2V5d29yZFR5cGUoa2V5d29yZCkgPT09ICdoYXJkJyk7XG4gIGNvbnN0IGtleXdvcmRHcm91cHMgPSBBVFNfR1JPVVBTXG4gICAgLm1hcCgoW3R5cGUsIHRpdGxlXSkgPT4gX3JlbmRlcktleXdvcmRHcm91cCh0aXRsZSwga2V5d29yZHMuZmlsdGVyKGtleXdvcmQgPT4gX2tleXdvcmRUeXBlKGtleXdvcmQpID09PSB0eXBlKSwgc3luTWFwKSlcbiAgICAuam9pbignJyk7XG5cbiAgY29uc3Qgc2VjdGlvblNjb3JlcyA9IHNjb3JlLnNlY3Rpb25fc2NvcmVzIHx8IHt9O1xuICBjb25zdCBzZWN0SHRtbCA9IE9iamVjdC5rZXlzKHNlY3Rpb25TY29yZXMpLmxlbmd0aCA9PT0gMCA/ICcnIDogYFxuICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOjE2cHg7XCI+XG4gICAgICA8aDQgc3R5bGU9XCJtYXJnaW46MCAwIDhweDtmb250LXNpemU6MXJlbTtjb2xvcjojMzM0MTU1O1wiPlNlY3Rpb24gU2NvcmVzPC9oND5cbiAgICAgIDx0YWJsZSBzdHlsZT1cIndpZHRoOjEwMCU7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlO2ZvbnQtc2l6ZTowLjllbTtcIj5cbiAgICAgICAgJHtPYmplY3QuZW50cmllcyhzZWN0aW9uU2NvcmVzKS5tYXAoKFtzZWMsIHZhbF0pID0+IGBcbiAgICAgICAgICA8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZjFmNWY5O1wiPlxuICAgICAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzo0cHggOHB4O3RleHQtdHJhbnNmb3JtOmNhcGl0YWxpemU7Y29sb3I6IzQ3NTU2OTtcIj4ke2VzY2FwZUh0bWwoc2VjKX08L3RkPlxuICAgICAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzo0cHggOHB4O2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjojMWUyOTNiO1wiPiR7TWF0aC5yb3VuZCh2YWwpfSU8L3RkPlxuICAgICAgICAgIDwvdHI+YCkuam9pbignJyl9XG4gICAgICA8L3RhYmxlPlxuICAgIDwvZGl2PmA7XG5cbiAgcmV0dXJuIGBcbiAgICA8ZGl2IHN0eWxlPVwicGFkZGluZzoyMHB4O1wiPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjI0cHg7bWFyZ2luLWJvdHRvbToyMHB4O1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjIuNGVtO2ZvbnQtd2VpZ2h0OjcwMDtjb2xvcjoke3Njb3JlQ29sb3J9O1wiPiR7b3ZlcmFsbH0lPC9kaXY+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjllbTtjb2xvcjojNDc1NTY5O1wiPkhhcmQgcmVxdWlyZW1lbnRzOiA8c3Ryb25nPiR7aGFyZH0lPC9zdHJvbmc+PC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjllbTtjb2xvcjojNDc1NTY5O1wiPlByZWZlcnJlZCBza2lsbHM6IDxzdHJvbmc+JHtzb2Z0fSU8L3N0cm9uZz48L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuNzVlbTtjb2xvcjojOTRhM2I4O21hcmdpbi10b3A6MnB4O1wiPkJhc2lzOiAke2VzY2FwZUh0bWwoc2NvcmUuYmFzaXMgfHwgJ3JldmlldycpfTwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC43NWVtO2NvbG9yOiM5NGEzYjg7bWFyZ2luLXRvcDo0cHg7XCIgdGl0bGU9XCJTY29yZSB0aHJlc2hvbGRzXCI+XG4gICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIiBzdHlsZT1cImNvbG9yOiMxMGI5ODE7XCI+XHUyNUNGPC9zcGFuPiBcdTIyNjU3NSUgU3Ryb25nIG1hdGNoICZuYnNwO1xuICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCIgc3R5bGU9XCJjb2xvcjojZjU5ZTBiO1wiPlx1MjVDRjwvc3Bhbj4gNTBcdTIwMTM3NCUgUGFydGlhbCBtYXRjaCAmbmJzcDtcbiAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIHN0eWxlPVwiY29sb3I6I2VmNDQ0NDtcIj5cdTI1Q0Y8L3NwYW4+ICZsdDs1MCUgTG93IG1hdGNoXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICAke2tleXdvcmRHcm91cHN9XG4gICAgICAke3NlY3RIdG1sfVxuICAgICAgJHttaXNzaW5nSGFyZC5sZW5ndGggPiAwID8gYFxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDoxNnB4O3BhZGRpbmc6MTJweDtiYWNrZ3JvdW5kOiNmZmY3ZWQ7Ym9yZGVyOjFweCBzb2xpZCAjZmVkN2FhO2JvcmRlci1yYWRpdXM6NnB4O1wiPlxuICAgICAgICAgIDxzdHJvbmcgc3R5bGU9XCJjb2xvcjojOWEzNDEyO1wiPk1pc3NpbmcgaGFyZCByZXF1aXJlbWVudHMgKCR7bWlzc2luZ0hhcmQubGVuZ3RofSk6PC9zdHJvbmc+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjojN2MyZDEyO2ZvbnQtc2l6ZTowLjllbTtcIj4gJHttaXNzaW5nSGFyZC5tYXAoa2V5d29yZCA9PiBlc2NhcGVIdG1sKGtleXdvcmQua2V5d29yZCB8fCBrZXl3b3JkLnRlcm0gfHwgJycpKS5qb2luKCcsICcpfTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+YCA6ICcnfVxuICAgICAgJHttaXNzaW5nS3cubGVuZ3RoID4gbWlzc2luZ0hhcmQubGVuZ3RoID8gYFxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDoxNnB4O3BhZGRpbmc6MTJweDtiYWNrZ3JvdW5kOiNmZmY3ZWQ7Ym9yZGVyOjFweCBzb2xpZCAjZmVkN2FhO2JvcmRlci1yYWRpdXM6NnB4O1wiPlxuICAgICAgICAgIDxzdHJvbmcgc3R5bGU9XCJjb2xvcjojOWEzNDEyO1wiPlJlbWFpbmluZyBrZXl3b3JkIGdhcHMgKCR7bWlzc2luZ0t3Lmxlbmd0aCAtIG1pc3NpbmdIYXJkLmxlbmd0aH0pOjwvc3Ryb25nPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6IzdjMmQxMjtmb250LXNpemU6MC45ZW07XCI+ICR7bWlzc2luZ0t3LmZpbHRlcihrZXl3b3JkID0+IF9rZXl3b3JkVHlwZShrZXl3b3JkKSAhPT0gJ2hhcmQnKS5tYXAoa2V5d29yZCA9PiBlc2NhcGVIdG1sKGtleXdvcmQua2V5d29yZCB8fCBrZXl3b3JkLnRlcm0gfHwgJycpKS5qb2luKCcsICcpfTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+YCA6ICcnfVxuICAgIDwvZGl2PmA7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gSm9iIEFuYWx5c2lzIE1vZGFsXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBPcGVuIHRoZSBKb2IgQW5hbHlzaXMgbW9kYWwuIFJldXNlcyB0YWJEYXRhLmFuYWx5c2lzIGlmIGF2YWlsYWJsZS5cbiAqL1xuZnVuY3Rpb24gX2pvYkFuYWx5c2lzRXNjYXBlSGFuZGxlcihlKSB7XG4gIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIGNsb3NlSm9iQW5hbHlzaXNNb2RhbCgpO1xufVxuXG5mdW5jdGlvbiBvcGVuSm9iQW5hbHlzaXNNb2RhbCgpIHtcbiAgcHVzaEZvY3VzU3RhY2soZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7XG4gIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnam9iLWFuYWx5c2lzLW1vZGFsLW92ZXJsYXknKTtcbiAgb3ZlcmxheS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgX2pvYkFuYWx5c2lzRXNjYXBlSGFuZGxlcik7XG4gIGNvbnN0IGNsb3NlQnRuID0gb3ZlcmxheS5xdWVyeVNlbGVjdG9yKCcubW9kYWwtZm9vdGVyIC5hY3Rpb24tYnRuJyk7XG4gIGlmIChjbG9zZUJ0bikgY2xvc2VCdG4uZm9jdXMoKTtcbiAgdHJhcEZvY3VzKCdqb2ItYW5hbHlzaXMtbW9kYWwtb3ZlcmxheScpO1xuICBjb25zdCBib2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pvYi1hbmFseXNpcy1tb2RhbC1ib2R5Jyk7XG5cbiAgY29uc3QgYW5hbHlzaXMgPSBzdGF0ZU1hbmFnZXIuZ2V0VGFiRGF0YSgnYW5hbHlzaXMnKTtcbiAgaWYgKGFuYWx5c2lzKSB7XG4gICAgLy8gUmVuZGVyIGludG8gYSB0ZW1wIGRpdiB1c2luZyBwb3B1bGF0ZUFuYWx5c2lzVGFiJ3Mgb3V0cHV0IHBhdHRlcm5cbiAgICBjb25zdCB0bXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0bXAuc3R5bGUucGFkZGluZyA9ICcyMHB4JztcbiAgICBib2R5LmlubmVySFRNTCA9ICcnO1xuICAgIGJvZHkuYXBwZW5kQ2hpbGQodG1wKTtcbiAgICAvLyBwb3B1bGF0ZUFuYWx5c2lzVGFiIHdyaXRlcyB0byAjZG9jdW1lbnQtY29udGVudDsgdXNlIGEgc2hpbVxuICAgIF9yZW5kZXJBbmFseXNpc0ludG9FbCh0bXAsIGFuYWx5c2lzKTtcbiAgfSBlbHNlIHtcbiAgICBib2R5LmlubmVySFRNTCA9ICc8cCBzdHlsZT1cInBhZGRpbmc6MjRweDt0ZXh0LWFsaWduOmNlbnRlcjtjb2xvcjojNmI3MjgwO1wiPk5vIGpvYiBhbmFseXNpcyBhdmFpbGFibGUuIFJ1biBqb2IgYW5hbHlzaXMgZmlyc3QuPC9wPic7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2xvc2VKb2JBbmFseXNpc01vZGFsKCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnam9iLWFuYWx5c2lzLW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgX2pvYkFuYWx5c2lzRXNjYXBlSGFuZGxlcik7XG4gIHJlc3RvcmVGb2N1cygpO1xufVxuXG4vKipcbiAqIFJlbmRlciBqb2IgYW5hbHlzaXMgZGF0YSBpbnRvIGFuIGFyYml0cmFyeSBjb250YWluZXIgZWxlbWVudC5cbiAqIE1pcnJvcnMgdGhlIHN0cnVjdHVyZSBmcm9tIHBvcHVsYXRlQW5hbHlzaXNUYWIgaW4gYXBwLmpzLlxuICovXG5mdW5jdGlvbiBfcmVuZGVyQW5hbHlzaXNJbnRvRWwoZWwsIHJlc3VsdCkge1xuICBpZiAoIXJlc3VsdCkge1xuICAgIGVsLmlubmVySFRNTCA9ICc8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7XCI+Tm8gYW5hbHlzaXMgZGF0YS48L3A+JztcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBEZWR1cGxpY2F0ZSBsaXN0czogY2FzZS1pbnNlbnNpdGl2ZSwga2VlcCBmaXJzdCBvY2N1cnJlbmNlIG9mIGVhY2ggbm9ybWFsaXNlZCBmb3JtLlxuICBjb25zdCBfZGVkdXAgPSAoYXJyKSA9PiB7XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQoKTtcbiAgICByZXR1cm4gKGFyciB8fCBbXSkuZmlsdGVyKGl0ZW0gPT4ge1xuICAgICAgY29uc3Qga2V5ID0gU3RyaW5nKHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJyA/IGl0ZW0gOiBpdGVtLmtleXdvcmQgfHwgaXRlbS50ZXJtIHx8ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmICgha2V5IHx8IHNlZW4uaGFzKGtleSkpIHJldHVybiBmYWxzZTtcbiAgICAgIHNlZW4uYWRkKGtleSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgfTtcbiAgY29uc3QgcmVxID0gX2RlZHVwKHJlc3VsdC5yZXF1aXJlZF9za2lsbHMpO1xuICBjb25zdCBwcmVmID0gX2RlZHVwKHJlc3VsdC5wcmVmZXJyZWRfc2tpbGxzIHx8IHJlc3VsdC5uaWNlX3RvX2hhdmUpO1xuICBjb25zdCBrZXl3b3JkcyA9IF9kZWR1cChyZXN1bHQuYXRzX2tleXdvcmRzKTtcbiAgY29uc3QgY3VsdHVyZSA9IHJlc3VsdC5jdWx0dXJlX2luZGljYXRvcnMgfHwgW107XG4gIGNvbnN0IG11c3RIYXZlID0gcmVzdWx0Lm11c3RfaGF2ZV9yZXF1aXJlbWVudHMgfHwgW107XG4gIGNvbnN0IG1pc3NpbmcgPSByZXN1bHQubWlzc2luZ19yZXF1aXJlZCB8fCBbXTtcblxuICBlbC5pbm5lckhUTUwgPSBgXG4gICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjk1ZW07bGluZS1oZWlnaHQ6MS42O1wiPlxuICAgICAgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2Y4ZmFmYztib3JkZXI6MXB4IHNvbGlkICNlMmU4ZjA7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzoxNHB4IDE2cHg7bWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjEuMWVtO2ZvbnQtd2VpZ2h0OjcwMDtjb2xvcjojMWUyOTNiO1wiPiR7ZXNjYXBlSHRtbChyZXN1bHQuam9iX3RpdGxlIHx8IHJlc3VsdC50aXRsZSB8fCAnUm9sZScpfTwvZGl2PlxuICAgICAgICAke3Jlc3VsdC5jb21wYW55ID8gYDxkaXYgc3R5bGU9XCJjb2xvcjojNDc1NTY5O1wiPiR7ZXNjYXBlSHRtbChyZXN1bHQuY29tcGFueSl9PC9kaXY+YCA6ICcnfVxuICAgICAgICAke3Jlc3VsdC5kb21haW4gPyBgPHNwYW4gc3R5bGU9XCJkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW4tdG9wOjZweDtwYWRkaW5nOjJweCA4cHg7YmFja2dyb3VuZDojZGJlYWZlO2NvbG9yOiMxZTQwYWY7Ym9yZGVyLXJhZGl1czoxMHB4O2ZvbnQtc2l6ZTowLjhlbTtcIj4ke2VzY2FwZUh0bWwocmVzdWx0LmRvbWFpbil9PC9zcGFuPmAgOiAnJ31cbiAgICAgIDwvZGl2PlxuXG4gICAgICAke21pc3NpbmcubGVuZ3RoID4gMCA/IGBcbiAgICAgICAgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2ZmZjdlZDtib3JkZXI6MXB4IHNvbGlkICNmZWQ3YWE7Ym9yZGVyLXJhZGl1czo2cHg7cGFkZGluZzoxMHB4IDE0cHg7bWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgIDxzdHJvbmcgc3R5bGU9XCJjb2xvcjojOWEzNDEyO1wiPlx1MjZBMCBNaXNzaW5nIHJlcXVpcmVkIHNraWxsczo8L3N0cm9uZz5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiY29sb3I6IzdjMmQxMjttYXJnaW4tdG9wOjRweDtcIj4ke21pc3NpbmcubWFwKHMgPT4gZXNjYXBlSHRtbChzKSkuam9pbignIFx1MDBCNyAnKX08L2Rpdj5cbiAgICAgICAgPC9kaXY+YCA6ICcnfVxuXG4gICAgICAke3JlcS5sZW5ndGggPiAwID8gYFxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgIDxoNCBzdHlsZT1cIm1hcmdpbjowIDAgOHB4O2ZvbnQtc2l6ZTowLjk1ZW07dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO2xldHRlci1zcGFjaW5nOi41cHg7Y29sb3I6IzMzNDE1NTtcIj5SZXF1aXJlZCBTa2lsbHM8L2g0PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7ZmxleC13cmFwOndyYXA7Z2FwOjZweDtcIj5cbiAgICAgICAgICAgICR7cmVxLm1hcChzID0+IGA8c3BhbiBzdHlsZT1cInBhZGRpbmc6MnB4IDEwcHg7Ym9yZGVyLXJhZGl1czoxMnB4O2JhY2tncm91bmQ6JHttaXNzaW5nLmluY2x1ZGVzKHMpPycjZmVlMmUyJzonI2RjZmNlNyd9O2NvbG9yOiR7bWlzc2luZy5pbmNsdWRlcyhzKT8nIzk5MWIxYic6JyMxNjY1MzQnfTtmb250LXNpemU6MC44NWVtO1wiPiR7ZXNjYXBlSHRtbChzKX08L3NwYW4+YCkuam9pbignJyl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PmAgOiAnJ31cblxuICAgICAgJHtwcmVmLmxlbmd0aCA+IDAgPyBgXG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgICAgPGg0IHN0eWxlPVwibWFyZ2luOjAgMCA4cHg7Zm9udC1zaXplOjAuOTVlbTt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7bGV0dGVyLXNwYWNpbmc6LjVweDtjb2xvcjojMzM0MTU1O1wiPlByZWZlcnJlZCAvIE5pY2UtdG8taGF2ZTwvaDQ+XG4gICAgICAgICAgPHVsIHN0eWxlPVwibWFyZ2luOjA7cGFkZGluZy1sZWZ0OjE4cHg7Y29sb3I6IzQ3NTU2OTtcIj4ke3ByZWYubWFwKHMgPT4gYDxsaT4ke2VzY2FwZUh0bWwocyl9PC9saT5gKS5qb2luKCcnKX08L3VsPlxuICAgICAgICA8L2Rpdj5gIDogJyd9XG5cbiAgICAgICR7a2V5d29yZHMubGVuZ3RoID4gMCA/IGBcbiAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTRweDtcIj5cbiAgICAgICAgICA8aDQgc3R5bGU9XCJtYXJnaW46MCAwIDhweDtmb250LXNpemU6MC45NWVtO3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTtsZXR0ZXItc3BhY2luZzouNXB4O2NvbG9yOiMzMzQxNTU7XCI+QVRTIEtleXdvcmRzPC9oND5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2ZsZXgtd3JhcDp3cmFwO2dhcDo2cHg7XCI+XG4gICAgICAgICAgICAke2tleXdvcmRzLm1hcCgoaywgaSkgPT4gYDxzcGFuIHN0eWxlPVwicGFkZGluZzoycHggOHB4O2JvcmRlci1yYWRpdXM6MTJweDtiYWNrZ3JvdW5kOiNmMGY5ZmY7Ym9yZGVyOjFweCBzb2xpZCAjYmFlNmZkO2NvbG9yOiMwMzY5YTE7Zm9udC1zaXplOjAuODJlbTtcIj4ke2kgPCA1ID8gYDxzdHJvbmc+IyR7aSsxfTwvc3Ryb25nPiBgIDogJyd9JHtlc2NhcGVIdG1sKHR5cGVvZiBrID09PSAnc3RyaW5nJyA/IGsgOiBrLmtleXdvcmQgfHwgay50ZXJtIHx8ICcnKX08L3NwYW4+YCkuam9pbignJyl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PmAgOiAnJ31cblxuICAgICAgJHttdXN0SGF2ZS5sZW5ndGggPiAwID8gYFxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgIDxoNCBzdHlsZT1cIm1hcmdpbjowIDAgOHB4O2ZvbnQtc2l6ZTowLjk1ZW07dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO2xldHRlci1zcGFjaW5nOi41cHg7Y29sb3I6IzMzNDE1NTtcIj5NdXN0LWhhdmUgUmVxdWlyZW1lbnRzPC9oND5cbiAgICAgICAgICA8dWwgc3R5bGU9XCJtYXJnaW46MDtwYWRkaW5nLWxlZnQ6MThweDtjb2xvcjojNDc1NTY5O1wiPiR7bXVzdEhhdmUubWFwKHMgPT4gYDxsaT4ke2VzY2FwZUh0bWwocyl9PC9saT5gKS5qb2luKCcnKX08L3VsPlxuICAgICAgICA8L2Rpdj5gIDogJyd9XG5cbiAgICAgICR7Y3VsdHVyZS5sZW5ndGggPiAwID8gYFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxoNCBzdHlsZT1cIm1hcmdpbjowIDAgOHB4O2ZvbnQtc2l6ZTowLjk1ZW07dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO2xldHRlci1zcGFjaW5nOi41cHg7Y29sb3I6IzMzNDE1NTtcIj5DdWx0dXJlIEluZGljYXRvcnM8L2g0PlxuICAgICAgICAgIDx1bCBzdHlsZT1cIm1hcmdpbjowO3BhZGRpbmctbGVmdDoxOHB4O2NvbG9yOiM0NzU1Njk7XCI+JHtjdWx0dXJlLm1hcChzID0+IGA8bGk+JHtlc2NhcGVIdG1sKHMpfTwvbGk+YCkuam9pbignJyl9PC91bD5cbiAgICAgICAgPC9kaXY+YCA6ICcnfVxuICAgIDwvZGl2PmA7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQVRTIFNjb3JlIFRhYiAoaW4gY3VzdG9taXplIHBoYXNlKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogUG9wdWxhdGUgdGhlIEFUUyBTY29yZSB0YWIgY29udGVudCBhcmVhLlxuICogQ2FsbGVkIGJ5IGFwcC5qcyBzd2l0Y2hUYWIgd2hlbiBjYXNlICdhdHMtc2NvcmUnIGlzIHNlbGVjdGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBwb3B1bGF0ZUF0c1Njb3JlVGFiKCkge1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgaWYgKCFjb250ZW50KSByZXR1cm47XG5cbiAgY29uc3QgY2FjaGVkID0gc3RhdGVNYW5hZ2VyPy5nZXRBdHNTY29yZT8uKCk7XG4gIGlmIChjYWNoZWQpIHtcbiAgICBjb250ZW50LmlubmVySFRNTCA9IGA8ZGl2IHN0eWxlPVwibWF4LXdpZHRoOjY4MHB4O21hcmdpbjowIGF1dG87XCI+JHtfcmVuZGVyQXRzUmVwb3J0KGNhY2hlZCl9PC9kaXY+YDtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb250ZW50LmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwiZW1wdHktc3RhdGVcIj48ZGl2IGNsYXNzPVwiaWNvblwiPlx1RDgzRFx1RENDQTwvZGl2PjxoMz5BVFMgU2NvcmU8L2gzPjxwPkNvbXBsZXRlIGpvYiBhbmFseXNpcyBhbmQgc2tpbGxzIHJldmlldyB0byBzZWUgeW91ciBBVFMgc2NvcmU8L3A+PGJ1dHRvbiBjbGFzcz1cImJ0bi1wcmltYXJ5XCIgb25jbGljaz1cInJlZnJlc2hBdHNTY29yZShcXCdyZXZpZXdfY2hlY2twb2ludFxcJykudGhlbigoKT0+cG9wdWxhdGVBdHNTY29yZVRhYigpKVwiPkNvbXB1dGUgQVRTIFNjb3JlPC9idXR0b24+PC9kaXY+Jztcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTaG93L2hpZGUgdGhlIG1vZGFsIHNob3J0Y3V0IGJ1dHRvbnMgd2hlbiBBVFMgYmFkZ2UgYmVjb21lcyB2aXNpYmxlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBTaG93IG9yIGhpZGUgdGhlIEFUUyBSZXBvcnQgYW5kIEpvYiBBbmFseXNpcyBzaG9ydGN1dCBidXR0b25zLlxuICogRHJpdmVuIGJ5IHRoZSAnYXRzLXNjb3JlLXVwZGF0ZWQnIGN1c3RvbSBldmVudCBkaXNwYXRjaGVkIGJ5IGFwcC5qc1xuICogd2hlbmV2ZXIgdXBkYXRlQXRzQmFkZ2UoKSBydW5zLiBObyBtb25rZXktcGF0Y2hpbmcgcmVxdWlyZWQuXG4gKi9cbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2F0cy1zY29yZS11cGRhdGVkJywgKCkgPT4ge1xuICBjb25zdCBiYWRnZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdHMtc2NvcmUtYmFkZ2UnKTtcbiAgY29uc3QgdmlzaWJsZSA9IGJhZGdlICYmIGJhZGdlLnN0eWxlLmRpc3BsYXkgIT09ICdub25lJztcbiAgY29uc3QgcmVwb3J0QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F0cy1yZXBvcnQtYnRuJyk7XG4gIGNvbnN0IGFuYWx5c2lzQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pvYi1hbmFseXNpcy1idG4nKTtcbiAgaWYgKHJlcG9ydEJ0bikgcmVwb3J0QnRuLnN0eWxlLmRpc3BsYXkgPSB2aXNpYmxlID8gJ2lubGluZS1ibG9jaycgOiAnbm9uZSc7XG4gIGlmIChhbmFseXNpc0J0bikgYW5hbHlzaXNCdG4uc3R5bGUuZGlzcGxheSA9IHZpc2libGUgPyAnaW5saW5lLWJsb2NrJyA6ICdub25lJztcbn0pO1xuXG5leHBvcnQge1xuICBvcGVuQXRzUmVwb3J0TW9kYWwsXG4gIGNsb3NlQXRzUmVwb3J0TW9kYWwsXG4gIF9yZW5kZXJBdHNSZXBvcnQsXG4gIG9wZW5Kb2JBbmFseXNpc01vZGFsLFxuICBjbG9zZUpvYkFuYWx5c2lzTW9kYWwsXG4gIF9yZW5kZXJBbmFseXNpc0ludG9FbCxcbiAgcG9wdWxhdGVBdHNTY29yZVRhYixcbn07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9zZXNzaW9uLWFjdGlvbnMuanNcbiAqIFNlc3Npb24tbGV2ZWwgZGlzcGF0Y2ggKHNlbmRBY3Rpb24pLCBzYXZlLCBhbmQgcG9zaXRpb24gdGl0bGUgdXBkYXRlcy5cbiAqXG4gKiBERVBFTkRFTkNJRVMgKGFsbCBvbiBnbG9iYWxUaGlzIGF0IHJ1bnRpbWUpOlxuICogICAtIHN0YXRlTWFuYWdlciAoc3RhdGUtbWFuYWdlci5qcyBcdTIwMTQgaXNMb2FkaW5nKCkvc2V0VGFiRGF0YSgpKVxuICogICAtIHVzZXJTZWxlY3Rpb25zICh3aW5kb3cgZ2xvYmFsIGZyb20gYXBwKVxuICogICAtIGFwcGVuZExvYWRpbmdNZXNzYWdlLCByZW1vdmVMb2FkaW5nTWVzc2FnZSwgYXBwZW5kTWVzc2FnZSwgYXBwZW5kUmV0cnlNZXNzYWdlXG4gKiAgIC0gc2V0TG9hZGluZywgbGxtRmV0Y2ggKGZldGNoLXV0aWxzLmpzKVxuICogICAtIHBhcnNlTWVzc2FnZVJlc3BvbnNlLCBwYXJzZVN0YXR1c1Jlc3BvbnNlICh2YWxpZGF0b3JzLmpzKVxuICogICAtIGhhbmRsZUN1c3RvbWl6YXRpb25SZXNwb25zZSAocmV2aWV3LXRhYmxlLWJhc2UuanMsIFRpZXIgNClcbiAqICAgLSByZWZyZXNoQXRzU2NvcmUsIHN3aXRjaFRhYiwgZmV0Y2hTdGF0dXMgKGdsb2JhbFRoaXMpXG4gKiAgIC0gY2xlYXJTdGF0ZSwgU3RvcmFnZUtleXMgKHN0YXRlLW1hbmFnZXIuanMgLyBhcGktY2xpZW50LmpzKVxuICogICAtIHNob3dMb2FkSm9iUGFuZWwsIGNsZWFySm9iSW5wdXQsIGNsZWFyVVJMSW5wdXQsIF9jbGVhckZpZWxkRXJyb3IsXG4gKiAgICAgX3VwZGF0ZVBhc3RlQ2hhckNvdW50IChqb2ItaW5wdXQuanMsIFRpZXIgMylcbiAqICAgLSBub3JtYWxpemVQb3NpdGlvbkxhYmVsLCBleHRyYWN0VGl0bGVBbmRDb21wYW55RnJvbUpvYlRleHQsXG4gKiAgICAgY2xlYW5Kc29uUmVzcG9uc2UgKHV0aWxzLmpzKVxuICogICAtIF91cGRhdGVTZXNzaW9uU3dpdGNoZXJIZWFkZXIgKHNlc3Npb24tc3dpdGNoZXItdWkuanMsIFRpZXIgNylcbiAqL1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5jb25zdCBsb2cgPSBnZXRMb2dnZXIoJ3Nlc3Npb24tYWN0aW9ucycpO1xuXG5pbXBvcnQgeyBTdG9yYWdlS2V5cyB9IGZyb20gJy4vYXBpLWNsaWVudC5qcyc7XG5pbXBvcnQgeyBzdGF0ZU1hbmFnZXIgfSBmcm9tICcuL3N0YXRlLW1hbmFnZXIuanMnO1xuXG4vKiogTWFwcyBhY3Rpb24gaWRlbnRpZmllcnMgdG8gaHVtYW4tcmVhZGFibGUgTExNIHN0YXR1cyBiYXIgbGFiZWxzLiAqL1xuY29uc3QgX0FDVElPTl9MQUJFTFMgPSB7XG4gIGFuYWx5emVfam9iOiAgICAgICAgICAgICAgJ0FuYWx5c2luZyBqb2IgZGVzY3JpcHRpb25cdTIwMjYnLFxuICByZWNvbW1lbmRfY3VzdG9taXphdGlvbnM6ICdHZW5lcmF0aW5nIGN1c3RvbWlzYXRpb24gcmVjb21tZW5kYXRpb25zXHUyMDI2JyxcbiAgZ2VuZXJhdGVfY3Y6ICAgICAgICAgICAgICAnR2VuZXJhdGluZyBDViBmaWxlc1x1MjAyNicsXG59O1xuXG5hc3luYyBmdW5jdGlvbiBzZW5kQWN0aW9uKGFjdGlvbikge1xuICBpZiAoc3RhdGVNYW5hZ2VyLmlzTG9hZGluZygpKSByZXR1cm47XG5cbiAgY29uc3QgbG9hZGluZ01zZyA9IGFwcGVuZExvYWRpbmdNZXNzYWdlKGBFeGVjdXRpbmcgJHthY3Rpb259Li4uYCk7XG4gIHNldExvYWRpbmcodHJ1ZSwgX0FDVElPTl9MQUJFTFNbYWN0aW9uXSB8fCBgJHthY3Rpb24ucmVwbGFjZSgvXy9nLCAnICcpfVx1MjAyNmApO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcGF5bG9hZCA9IHsgYWN0aW9uIH07XG4gICAgaWYgKGFjdGlvbiA9PT0gJ3JlY29tbWVuZF9jdXN0b21pemF0aW9ucycgJiYgd2luZG93LnF1ZXN0aW9uQW5zd2Vycykge1xuICAgICAgcGF5bG9hZC51c2VyX3ByZWZlcmVuY2VzID0gd2luZG93LnF1ZXN0aW9uQW5zd2VycztcbiAgICB9XG5cbiAgICBjb25zdCByZXMgPSBhd2FpdCBsbG1GZXRjaCgnL2FwaS9hY3Rpb24nLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocGF5bG9hZCksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IHBhcnNlTWVzc2FnZVJlc3BvbnNlKGF3YWl0IHJlcy5qc29uKCkpO1xuXG4gICAgcmVtb3ZlTG9hZGluZ01lc3NhZ2UobG9hZGluZ01zZyk7XG5cbiAgICBpZiAoZGF0YS5lcnJvcikge1xuICAgICAgYXBwZW5kUmV0cnlNZXNzYWdlKCdcdTI3NEMgRXJyb3I6ICcgKyBkYXRhLmVycm9yLCAoKSA9PiBzZW5kQWN0aW9uKGFjdGlvbikpO1xuICAgIH0gZWxzZSBpZiAoYWN0aW9uID09PSAncmVjb21tZW5kX2N1c3RvbWl6YXRpb25zJykge1xuICAgICAgY29uc3QgY3VzdG9taXphdGlvbkRhdGEgPSBkYXRhLnJlc3VsdD8uY29udGV4dF9kYXRhPy5jdXN0b21pemF0aW9ucyA/PyBkYXRhLnJlc3VsdDtcbiAgICAgIGF3YWl0IGhhbmRsZUN1c3RvbWl6YXRpb25SZXNwb25zZShjdXN0b21pemF0aW9uRGF0YSk7XG4gICAgfSBlbHNlIGlmIChhY3Rpb24gPT09ICdnZW5lcmF0ZV9jdicpIHtcbiAgICAgIGNvbnN0IGdlbmVyYXRpb25Nc2cgPSBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCAnXHUyM0YzIEdlbmVyYXRpbmcgQ1YgZmlsZXMgKEFUUyBET0NYIFx1MjE5MiBIVE1MIFx1MjE5MiBIdW1hbiBET0NYKS4uLicpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMjA7IGkrKykge1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgNTAwKSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qgc3RhdHVzUmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL3N0YXR1cycpO1xuICAgICAgICAgIGNvbnN0IHN0YXR1c0RhdGEgPSBwYXJzZVN0YXR1c1Jlc3BvbnNlKGF3YWl0IHN0YXR1c1Jlcy5qc29uKCkpO1xuICAgICAgICAgIGNvbnN0IHByb2dyZXNzICAgPSBzdGF0dXNEYXRhLmdlbmVyYXRpb25fcHJvZ3Jlc3MgfHwgW107XG4gICAgICAgICAgaWYgKHByb2dyZXNzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHRvdGFsID0gcHJvZ3Jlc3MubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgZG9uZUNvdW50ID0gcHJvZ3Jlc3MuZmlsdGVyKHAgPT4gcC5zdGF0dXMgPT09ICdjb21wbGV0ZScpLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IGFjdGl2ZSA9IHByb2dyZXNzLmZpbmQocCA9PiBwLnN0YXR1cyAhPT0gJ2NvbXBsZXRlJyk7XG4gICAgICAgICAgICBjb25zdCBzdGVwTGFiZWwgPSBhY3RpdmVcbiAgICAgICAgICAgICAgPyBgJHthY3RpdmUuc3RlcC5yZXBsYWNlKC9fL2csICcgJyl9ICgke2RvbmVDb3VudCArIDF9IG9mICR7dG90YWx9KWBcbiAgICAgICAgICAgICAgOiBgJHt0b3RhbH0gb2YgJHt0b3RhbH0gY29tcGxldGVgO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBfdXBkYXRlTExNU3RhdHVzQmFyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgIF91cGRhdGVMTE1TdGF0dXNCYXIodHJ1ZSwgYEdlbmVyYXRpbmcgQ1Y6ICR7c3RlcExhYmVsfVx1MjAyNmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc3RlcHMgPSBwcm9ncmVzcy5tYXAocCA9PlxuICAgICAgICAgICAgICBgJHtwLnN0YXR1cyA9PT0gJ2NvbXBsZXRlJyA/ICdcdTI3MTMnIDogJ1x1MjNGMyd9ICR7cC5zdGVwLnJlcGxhY2UoL18vZywgJyAnKX0gJHtwLmVsYXBzZWRfbXMgPyBgKCR7cC5lbGFwc2VkX21zfW1zKWAgOiAnJ31gXG4gICAgICAgICAgICApLmpvaW4oJyBcdTIwMjIgJyk7XG4gICAgICAgICAgICBpZiAoZ2VuZXJhdGlvbk1zZykgZ2VuZXJhdGlvbk1zZy5xdWVyeVNlbGVjdG9yKCcuY29udGVudCcpLnRleHRDb250ZW50ID0gYEdlbmVyYXRpbmcgQ1Y6ICR7c3RlcHN9YDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHByb2dyZXNzLmV2ZXJ5KHAgPT4gcC5zdGF0dXMgPT09ICdjb21wbGV0ZScpICYmIHByb2dyZXNzLmxlbmd0aCA+IDApIGJyZWFrO1xuICAgICAgICB9IGNhdGNoIChfZSkgeyAvKiBwb2xsaW5nIGVycm9yIFx1MjAxNCBjb250aW51ZSAqLyB9XG4gICAgICB9XG4gICAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCAnQ1YgZ2VuZXJhdGVkIHN1Y2Nlc3NmdWxseSEgUmV2aWV3IHlvdXIgbGF5b3V0IGJlbG93LicpO1xuICAgICAgc3RhdGVNYW5hZ2VyLnNldFRhYkRhdGEoJ2N2JywgZGF0YS5yZXN1bHQpO1xuICAgICAgcmVmcmVzaEF0c1Njb3JlKCdwb3N0X2dlbmVyYXRpb24nKTtcbiAgICAgIHN3aXRjaFRhYignbGF5b3V0Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIGRhdGEucmVzdWx0KTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nLmVycm9yKCc9PT0gU0VORCBBQ1RJT04gRVJST1IgPT09JywgYWN0aW9uLCBlcnJvcik7XG4gICAgcmVtb3ZlTG9hZGluZ01lc3NhZ2UobG9hZGluZ01zZyk7XG4gICAgaWYgKGVycm9yLm5hbWUgIT09ICdBYm9ydEVycm9yJykge1xuICAgICAgYXBwZW5kUmV0cnlNZXNzYWdlKCdcdTI3NEMgRXJyb3I6ICcgKyBlcnJvci5tZXNzYWdlLCAoKSA9PiBzZW5kQWN0aW9uKGFjdGlvbikpO1xuICAgIH1cbiAgfVxuXG4gIHNldExvYWRpbmcoZmFsc2UpO1xuICBhd2FpdCBmZXRjaFN0YXR1cygpO1xuICBpZiAodHlwZW9mIGZldGNoQW5kRGlzcGxheUxsbUxvZyA9PT0gJ2Z1bmN0aW9uJykgZmV0Y2hBbmREaXNwbGF5TGxtTG9nKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNhdmVTZXNzaW9uKCkge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9zYXZlJywgeyBtZXRob2Q6ICdQT1NUJyB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgaWYgKGRhdGEuc2Vzc2lvbl9maWxlKSBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShTdG9yYWdlS2V5cy5TRVNTSU9OX1BBVEgsIGRhdGEuc2Vzc2lvbl9maWxlKTtcbiAgICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsICdTZXNzaW9uIHNhdmVkIHN1Y2Nlc3NmdWxseS4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwZW5kUmV0cnlNZXNzYWdlKCdcdTI3NEMgRXJyb3Igc2F2aW5nIHNlc3Npb246ICcgKyBkYXRhLmVycm9yLCBzYXZlU2Vzc2lvbik7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy5lcnJvcignPT09IFNBVkUgU0VTU0lPTiBFUlJPUiA9PT0nLCBlcnJvcik7XG4gICAgYXBwZW5kUmV0cnlNZXNzYWdlKCdcdTI3NEMgRXJyb3I6ICcgKyBlcnJvci5tZXNzYWdlLCBzYXZlU2Vzc2lvbik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2Zvcm1hdEJhckRhdGUodmFsdWUpIHtcbiAgY29uc3QgdGV4dCA9IFN0cmluZyh2YWx1ZSB8fCAnJykudHJpbSgpO1xuICBpZiAoIXRleHQpIHJldHVybiAnJztcbiAgaWYgKC9eXFxkezR9LVxcZHsyfS1cXGR7Mn0kLy50ZXN0KHRleHQpKSB7XG4gICAgY29uc3QgW3llYXIsIG1vbnRoLCBkYXldID0gdGV4dC5zcGxpdCgnLScpO1xuICAgIHJldHVybiBgJHttb250aH0vJHtkYXl9LyR7eWVhcn1gO1xuICB9XG4gIGNvbnN0IHBhcnNlZCA9IG5ldyBEYXRlKHRleHQpO1xuICBpZiAoIU51bWJlci5pc05hTihwYXJzZWQuZ2V0VGltZSgpKSkge1xuICAgIHJldHVybiBwYXJzZWQudG9JU09TdHJpbmcoKS5zbGljZSgwLCAxMCk7XG4gIH1cbiAgcmV0dXJuIHRleHQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVBvc2l0aW9uVGl0bGUoc3RhdHVzID0ge30pIHtcbiAgY29uc3QgcG9zaXRpb25FbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwb3NpdGlvbi10aXRsZScpO1xuICBpZiAoIXBvc2l0aW9uRWwpIHJldHVybjtcblxuICBjb25zdCBmYWxsYmFja0Jyb3dzZXJUaXRsZSA9ICdDViBCdWlsZGVyIFx1MjAxNCBQcm9mZXNzaW9uYWwgV2ViIFVJJztcbiAgbGV0IGxhYmVsID0gKHN0YXR1cy5wb3NpdGlvbl9uYW1lIHx8ICcnKS50b1N0cmluZygpLnRyaW0oKTtcbiAgbGV0IGNvbXBhbnkgPSAnJztcbiAgbGV0IGRhdGVBcHBsaWVkID0gJyc7XG5cbiAgaWYgKCFsYWJlbCAmJiBzdGF0dXMuam9iX2FuYWx5c2lzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGFuYWx5c2lzID0gdHlwZW9mIHN0YXR1cy5qb2JfYW5hbHlzaXMgPT09ICdzdHJpbmcnXG4gICAgICAgID8gSlNPTi5wYXJzZShjbGVhbkpzb25SZXNwb25zZShzdGF0dXMuam9iX2FuYWx5c2lzKSlcbiAgICAgICAgOiBzdGF0dXMuam9iX2FuYWx5c2lzO1xuICAgICAgY29uc3QgdGl0bGUgPSBhbmFseXNpcz8uam9iX3RpdGxlIHx8IGFuYWx5c2lzPy50aXRsZSB8fCBhbmFseXNpcz8ucG9zaXRpb25fbmFtZSB8fCAnJztcbiAgICAgIGxhYmVsID0gbm9ybWFsaXplUG9zaXRpb25MYWJlbCh0aXRsZSwgYW5hbHlzaXM/LmNvbXBhbnkpO1xuICAgICAgY29tcGFueSA9IChhbmFseXNpcz8uY29tcGFueV9uYW1lIHx8IGFuYWx5c2lzPy5jb21wYW55IHx8ICcnKS50cmltKCk7XG4gICAgICBkYXRlQXBwbGllZCA9IF9mb3JtYXRCYXJEYXRlKGFuYWx5c2lzPy5kYXRlX2FwcGxpZWQgfHwgYW5hbHlzaXM/LmFwcGxpY2F0aW9uX2RhdGUgfHwgJycpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2cud2FybignRmFpbGVkIHRvIHBhcnNlIGpvYl9hbmFseXNpcyBmb3IgdGl0bGU6JywgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIGlmICghbGFiZWwgJiYgc3RhdHVzLmpvYl9kZXNjcmlwdGlvbl90ZXh0KSB7XG4gICAgY29uc3QgcGFyc2VkID0gZXh0cmFjdFRpdGxlQW5kQ29tcGFueUZyb21Kb2JUZXh0KHN0YXR1cy5qb2JfZGVzY3JpcHRpb25fdGV4dCk7XG4gICAgbGFiZWwgPSBub3JtYWxpemVQb3NpdGlvbkxhYmVsKHBhcnNlZC50aXRsZSwgcGFyc2VkLmNvbXBhbnkpO1xuICAgIGlmICghY29tcGFueSkgY29tcGFueSA9IChwYXJzZWQuY29tcGFueSB8fCAnJykudHJpbSgpO1xuICB9XG5cbiAgcG9zaXRpb25FbC50ZXh0Q29udGVudCA9IGxhYmVsO1xuICBkb2N1bWVudC50aXRsZSA9IGxhYmVsID8gYCR7bGFiZWx9IFx1MjAxNCBDViBCdWlsZGVyYCA6IGZhbGxiYWNrQnJvd3NlclRpdGxlO1xuXG4gIGNvbnN0IHBvc2l0aW9uQ29tcGFueUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Bvc2l0aW9uLWNvbXBhbnknKTtcbiAgaWYgKHBvc2l0aW9uQ29tcGFueUVsKSB7XG4gICAgY29uc3QgaW50YWtlID0gd2luZG93Ll9zdGF0dXNJbnRha2UgfHwge307XG4gICAgY29uc3QgZmluYWxDb21wYW55ID0gKGludGFrZS5jb21wYW55IHx8ICcnKS50cmltKCkgfHwgY29tcGFueTtcbiAgICBjb25zdCBmaW5hbERhdGUgPSBkYXRlQXBwbGllZCB8fCBfZm9ybWF0QmFyRGF0ZShpbnRha2UuZGF0ZV9hcHBsaWVkIHx8ICcnKTtcbiAgICBjb25zdCBzdWJ0aXRsZSA9IFtmaW5hbENvbXBhbnksIGZpbmFsRGF0ZV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAgXHUwMEI3ICAnKTtcbiAgICBwb3NpdGlvbkNvbXBhbnlFbC50ZXh0Q29udGVudCA9IHN1YnRpdGxlO1xuICAgIHBvc2l0aW9uQ29tcGFueUVsLnN0eWxlLmRpc3BsYXkgPSBzdWJ0aXRsZSA/ICcnIDogJ25vbmUnO1xuICB9XG5cbiAgY29uc3QgcmVuYW1lQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlbmFtZS1zZXNzaW9uLWJ0bicpO1xuICBpZiAocmVuYW1lQnRuKSByZW5hbWVCdG4uc3R5bGUuZGlzcGxheSA9IGxhYmVsID8gJycgOiAnbm9uZSc7XG4gIGlmICh0eXBlb2YgX3VwZGF0ZVNlc3Npb25Td2l0Y2hlckhlYWRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIF91cGRhdGVTZXNzaW9uU3dpdGNoZXJIZWFkZXIoeyBwb3NpdGlvbl9uYW1lOiBsYWJlbCwgcGhhc2U6IHN0YXR1cy5waGFzZSB8fCBudWxsIH0pO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFUyBtb2R1bGUgZXhwb3J0cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmV4cG9ydCB7IHNlbmRBY3Rpb24sIHNhdmVTZXNzaW9uLCB1cGRhdGVQb3NpdGlvblRpdGxlLCBfQUNUSU9OX0xBQkVMUyB9O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvam9iLWFuYWx5c2lzLmpzXG4gKiBKb2IgYW5hbHlzaXMgb3JjaGVzdHJhdGlvbjogZmlyZXMgYW5hbHl6ZV9qb2IgYWN0aW9uLCBtZXJnZXMgcG9zdC1hbmFseXNpc1xuICogcXVlc3Rpb25zLCBhbmQgdHJhbnNpdGlvbnMgdGhlIFVJIHRvIHRoZSBhbmFseXNpcyB0YWIuXG4gKlxuICogREVQRU5ERU5DSUVTIChhbGwgb24gZ2xvYmFsVGhpcyBhdCBydW50aW1lKTpcbiAqICAgLSBzdGF0ZU1hbmFnZXIgKHN0YXRlLW1hbmFnZXIuanMgXHUyMDE0IGlzTG9hZGluZygpL3NldFRhYkRhdGEoKSlcbiAqICAgLSBsbG1GZXRjaCwgc2V0TG9hZGluZyAoZmV0Y2gtdXRpbHMuanMpXG4gKiAgIC0gYXBwZW5kTG9hZGluZ01lc3NhZ2UsIHJlbW92ZUxvYWRpbmdNZXNzYWdlLCBhcHBlbmRNZXNzYWdlLFxuICogICAgIGFwcGVuZFJldHJ5TWVzc2FnZSwgYXBwZW5kRm9ybWF0dGVkQW5hbHlzaXMgKG1lc3NhZ2UtcXVldWUuanMpXG4gKiAgIC0gcGFyc2VNZXNzYWdlUmVzcG9uc2UgKHZhbGlkYXRvcnMuanMpXG4gKiAgIC0gYXNrUG9zdEFuYWx5c2lzUXVlc3Rpb25zIChxdWVzdGlvbnMtcGFuZWwuanMpXG4gKiAgIC0gcmVmcmVzaEF0c1Njb3JlIChhdHMtcmVmaW5lbWVudC5qcylcbiAqICAgLSBzd2l0Y2hUYWIgKHJldmlldy10YWJsZS1iYXNlLmpzLCBUaWVyIDQpXG4gKiAgIC0gZmV0Y2hTdGF0dXMgKGFwcC5qcyBvcmNoZXN0cmF0b3IsIFRpZXIgOClcbiAqICAgLSBfc2hvd0ludGFrZUNvbmZpcm1DYXJkLCBfcHJvY2VlZEFmdGVySW50YWtlIChtZXNzYWdlLWRpc3BhdGNoLmpzLCBUaWVyIDMpXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdqb2ItYW5hbHlzaXMnKTtcblxuaW1wb3J0IHsgU3RvcmFnZUtleXMgfSBmcm9tICcuL2FwaS1jbGllbnQuanMnO1xuaW1wb3J0IHsgc3RhdGVNYW5hZ2VyIH0gZnJvbSAnLi9zdGF0ZS1tYW5hZ2VyLmpzJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBQb3N0LWFuYWx5c2lzIHF1ZXN0aW9uIGhlbHBlcnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogTm9ybWFsaXNlIGEgcmF3IHF1ZXN0aW9ucyBhcnJheSB0byBbe3F1ZXN0aW9uLCB0eXBlLCBjaG9pY2VzfV0uICovXG5mdW5jdGlvbiBub3JtYWxpemVQb3N0QW5hbHlzaXNRdWVzdGlvbnMocmF3UXVlc3Rpb25zKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShyYXdRdWVzdGlvbnMpKSByZXR1cm4gW107XG4gIHJldHVybiByYXdRdWVzdGlvbnNcbiAgICAuZmlsdGVyKHEgPT4gcSAmJiB0eXBlb2YgcS5xdWVzdGlvbiA9PT0gJ3N0cmluZycgJiYgcS5xdWVzdGlvbi50cmltKCkpXG4gICAgLm1hcCgocSwgaWR4KSA9PiAoe1xuICAgICAgcXVlc3Rpb246IHEucXVlc3Rpb24udHJpbSgpLFxuICAgICAgdHlwZTogICAgIChxLnR5cGUgfHwgYGNsYXJpZmljYXRpb25fJHtpZHggKyAxfWApLnRvU3RyaW5nKCksXG4gICAgICBjaG9pY2VzOiAgQXJyYXkuaXNBcnJheShxLmNob2ljZXMpID8gcS5jaG9pY2VzIDogW10sXG4gICAgfSkpO1xufVxuXG4vKipcbiAqIEV4dHJhY3QgbnVtYmVyZWQtbGlzdCBxdWVzdGlvbnMgZnJvbSB1bnN0cnVjdHVyZWQgYXNzaXN0YW50IHRleHQuXG4gKiBSZXR1cm5zIGF0IG1vc3QgNCBxdWVzdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RTdHJ1Y3R1cmVkUXVlc3Rpb25zRnJvbUFzc2lzdGFudFRleHQodGV4dCkge1xuICBpZiAodHlwZW9mIHRleHQgIT09ICdzdHJpbmcnIHx8ICF0ZXh0LnRyaW0oKSkgcmV0dXJuIFtdO1xuICBjb25zdCBub3JtYWxpemVkID0gdGV4dC5yZXBsYWNlKC9cXHJcXG4vZywgJ1xcbicpO1xuICBjb25zdCBibG9ja3MgPSBub3JtYWxpemVkLnNwbGl0KC9eXFxzKlxcZCtcXC5cXHMrL20pO1xuICBpZiAoYmxvY2tzLmxlbmd0aCA8PSAxKSByZXR1cm4gW107XG4gIHJldHVybiBibG9ja3NcbiAgICAuc2xpY2UoMSlcbiAgICAubWFwKChibG9jaywgaWR4KSA9PiB7XG4gICAgICBjb25zdCBxdWVzdGlvbiA9IGJsb2NrLnRyaW0oKTtcbiAgICAgIGlmICghcXVlc3Rpb24pIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIHsgcXVlc3Rpb246IHF1ZXN0aW9uLnNsaWNlKDAsIDQwMDApLCB0eXBlOiBgY2xhcmlmaWNhdGlvbl8ke2lkeCArIDF9YCwgY2hvaWNlczogW10gfTtcbiAgICB9KVxuICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAuc2xpY2UoMCwgNCk7XG59XG5cbi8qKlxuICogTWVyZ2Ugc2VydmVyLXByb3ZpZGVkIHF1ZXN0aW9ucyB3aXRoIHRob3NlIGV4dHJhY3RlZCBmcm9tIHRoZSBhc3Npc3RhbnQgdGV4dCxcbiAqIGRlLWR1cGxpY2F0aW5nIGJ5IHF1ZXN0aW9uIHRleHQgYW5kIHR5cGUuXG4gKi9cbmZ1bmN0aW9uIG1lcmdlUG9zdEFuYWx5c2lzUXVlc3Rpb25zKGV4aXN0aW5nUXVlc3Rpb25zLCBpbmNvbWluZ1F1ZXN0aW9ucykge1xuICBjb25zdCBleGlzdGluZyA9IG5vcm1hbGl6ZVBvc3RBbmFseXNpc1F1ZXN0aW9ucyhleGlzdGluZ1F1ZXN0aW9ucyk7XG4gIGNvbnN0IGluY29taW5nID0gbm9ybWFsaXplUG9zdEFuYWx5c2lzUXVlc3Rpb25zKGluY29taW5nUXVlc3Rpb25zKTtcblxuICBjb25zdCBtZXJnZWQgICAgICAgID0gWy4uLmV4aXN0aW5nXTtcbiAgY29uc3Qgc2VlbkJ5UXVlc3Rpb24gPSBuZXcgU2V0KGV4aXN0aW5nLm1hcChxID0+IHEucXVlc3Rpb24udG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXHMrL2csICcgJykudHJpbSgpKSk7XG4gIGNvbnN0IHVzZWRUeXBlcyAgICAgID0gbmV3IFNldChleGlzdGluZy5tYXAocSA9PiBxLnR5cGUpKTtcblxuICBpbmNvbWluZy5mb3JFYWNoKChxLCBpZHgpID0+IHtcbiAgICBjb25zdCBrZXkgPSBxLnF1ZXN0aW9uLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpLnRyaW0oKTtcbiAgICBpZiAoIWtleSB8fCBzZWVuQnlRdWVzdGlvbi5oYXMoa2V5KSkgcmV0dXJuO1xuICAgIGxldCB0eXBlID0gcS50eXBlIHx8IGBjbGFyaWZpY2F0aW9uXyR7bWVyZ2VkLmxlbmd0aCArIGlkeCArIDF9YDtcbiAgICBpZiAodXNlZFR5cGVzLmhhcyh0eXBlKSkgdHlwZSA9IGAke3R5cGV9XyR7bWVyZ2VkLmxlbmd0aCArIGlkeCArIDF9YDtcbiAgICBtZXJnZWQucHVzaCh7IHF1ZXN0aW9uOiBxLnF1ZXN0aW9uLCB0eXBlLCBjaG9pY2VzOiBBcnJheS5pc0FycmF5KHEuY2hvaWNlcykgPyBxLmNob2ljZXMgOiBbXSB9KTtcbiAgICBzZWVuQnlRdWVzdGlvbi5hZGQoa2V5KTtcbiAgICB1c2VkVHlwZXMuYWRkKHR5cGUpO1xuICB9KTtcblxuICByZXR1cm4gbWVyZ2VkO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIGFuYWx5emVKb2Jcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5hc3luYyBmdW5jdGlvbiBhbmFseXplSm9iKCkge1xuICBpZiAoc3RhdGVNYW5hZ2VyLmlzTG9hZGluZygpKSByZXR1cm47XG5cbiAgaWYgKCFsb2NhbFN0b3JhZ2UuZ2V0SXRlbShTdG9yYWdlS2V5cy5MTE1fRElTQ0xPU1VSRV9TSE9XTikpIHtcbiAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnXHUyMTM5XHVGRTBGIENvbnRlbnQgeW91IHN1Ym1pdCBpcyBzZW50IHRvIHRoZSBjb25maWd1cmVkIExMTSBwcm92aWRlciBmb3IgYW5hbHlzaXMuIFJldmlldyB5b3VyIHByb3ZpZGVyXFwncyBkYXRhIHBvbGljeSBmb3IgZGV0YWlscy4nKTtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShTdG9yYWdlS2V5cy5MTE1fRElTQ0xPU1VSRV9TSE9XTiwgJzEnKTtcbiAgfVxuXG4gIGNvbnN0IGxvYWRpbmdNc2cgPSBhcHBlbmRMb2FkaW5nTWVzc2FnZSgnQW5hbHl6aW5nIGpvYiBkZXNjcmlwdGlvbi4uLicpO1xuICBzZXRMb2FkaW5nKHRydWUsICdBbmFseXNpbmcgam9iIGRlc2NyaXB0aW9uXHUyMDI2Jyk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgbGxtRmV0Y2goJy9hcGkvYWN0aW9uJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgYWN0aW9uOiAnYW5hbHl6ZV9qb2InIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBwYXJzZU1lc3NhZ2VSZXNwb25zZShhd2FpdCByZXMuanNvbigpKTtcblxuICAgIHJlbW92ZUxvYWRpbmdNZXNzYWdlKGxvYWRpbmdNc2cpO1xuXG4gICAgaWYgKGRhdGEuZXJyb3IpIHtcbiAgICAgIGFwcGVuZFJldHJ5TWVzc2FnZSgnXHUyNzRDIEVycm9yOiAnICsgZGF0YS5lcnJvciwgYW5hbHl6ZUpvYik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJlc3VsdCAgICAgICA9IGRhdGEucmVzdWx0O1xuICAgICAgY29uc3QgYW5hbHlzaXNUZXh0ID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycgPyByZXN1bHQgOiAocmVzdWx0Py50ZXh0KSB8fCBudWxsO1xuICAgICAgY29uc3QgYW5hbHlzaXNEYXRhID0gdHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcgJiYgcmVzdWx0ICE9PSBudWxsXG4gICAgICAgID8gKHJlc3VsdC5jb250ZXh0X2RhdGE/LmpvYl9hbmFseXNpcyA/PyByZXN1bHQpXG4gICAgICAgIDogcmVzdWx0O1xuICAgICAgY29uc3QgY29udGV4dFF1ZXN0aW9ucyA9ICh0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0JyAmJiByZXN1bHQgIT09IG51bGwpXG4gICAgICAgID8gcmVzdWx0LmNvbnRleHRfZGF0YT8ucG9zdF9hbmFseXNpc19xdWVzdGlvbnNcbiAgICAgICAgOiBudWxsO1xuICAgICAgY29uc3Qgc3RydWN0dXJlZFF1ZXN0aW9ucyA9IG1lcmdlUG9zdEFuYWx5c2lzUXVlc3Rpb25zKFxuICAgICAgICBjb250ZXh0UXVlc3Rpb25zLFxuICAgICAgICAoY29udGV4dFF1ZXN0aW9ucyAmJiBjb250ZXh0UXVlc3Rpb25zLmxlbmd0aCA+IDApXG4gICAgICAgICAgPyBbXVxuICAgICAgICAgIDogZXh0cmFjdFN0cnVjdHVyZWRRdWVzdGlvbnNGcm9tQXNzaXN0YW50VGV4dChhbmFseXNpc1RleHQpLFxuICAgICAgKTtcblxuICAgICAgaWYgKGFuYWx5c2lzVGV4dCkgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgYW5hbHlzaXNUZXh0KTtcbiAgICAgIGFwcGVuZEZvcm1hdHRlZEFuYWx5c2lzKGFuYWx5c2lzRGF0YSk7XG4gICAgICBzdGF0ZU1hbmFnZXIuc2V0VGFiRGF0YSgnYW5hbHlzaXMnLCBhbmFseXNpc0RhdGEpO1xuICAgICAgcmVmcmVzaEF0c1Njb3JlKCdhbmFseXNpcycpO1xuICAgICAgc3dpdGNoVGFiKCdhbmFseXNpcycpO1xuXG4gICAgICBjb25zdCBjb250aW51ZUFmdGVySW50YWtlID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBhc2tQb3N0QW5hbHlzaXNRdWVzdGlvbnMoYW5hbHlzaXNEYXRhLCBzdHJ1Y3R1cmVkUXVlc3Rpb25zKTtcbiAgICAgIH07XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGludGFrZVJlcyAgPSBhd2FpdCBsbG1GZXRjaCgnL2FwaS9pbnRha2UtbWV0YWRhdGEnKTtcbiAgICAgICAgY29uc3QgaW50YWtlRGF0YSA9IGF3YWl0IGludGFrZVJlcy5qc29uKCk7XG4gICAgICAgIGlmIChpbnRha2VEYXRhLmNvbmZpcm1lZCkge1xuICAgICAgICAgIGF3YWl0IF9wcm9jZWVkQWZ0ZXJJbnRha2UoY29udGludWVBZnRlckludGFrZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgX3Nob3dJbnRha2VDb25maXJtQ2FyZChjb250aW51ZUFmdGVySW50YWtlKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoX2UpIHtcbiAgICAgICAgYXdhaXQgY29udGludWVBZnRlckludGFrZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cuZXJyb3IoJz09PSBBTkFMWVpFIEpPQiBFUlJPUiA9PT0nLCBlcnJvcik7XG4gICAgcmVtb3ZlTG9hZGluZ01lc3NhZ2UobG9hZGluZ01zZyk7XG4gICAgaWYgKGVycm9yLm5hbWUgIT09ICdBYm9ydEVycm9yJykge1xuICAgICAgYXBwZW5kUmV0cnlNZXNzYWdlKCdcdTI3NEMgRXJyb3I6ICcgKyBlcnJvci5tZXNzYWdlLCBhbmFseXplSm9iKTtcbiAgICB9XG4gIH1cblxuICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgLy8gVXBkYXRlIHRoZSBwb3NpdGlvbi10aXRsZSBiYXIgd2l0aCB0aGUgbGF0ZXN0IHNlc3Npb24gbmFtZSBhZnRlciBhbmFseXNpcy5cbiAgdHJ5IHtcbiAgICBjb25zdCBsYXRlc3RTdGF0dXMgPSBhd2FpdCBmZXRjaFN0YXR1cygpO1xuICAgIGlmIChsYXRlc3RTdGF0dXMgJiYgdHlwZW9mIHVwZGF0ZVBvc2l0aW9uVGl0bGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHVwZGF0ZVBvc2l0aW9uVGl0bGUobGF0ZXN0U3RhdHVzKTtcbiAgICB9XG4gIH0gY2F0Y2ggKF9lKSB7IC8qIG5vbi1mYXRhbCAqLyB9XG4gIGlmICh0eXBlb2YgZmV0Y2hBbmREaXNwbGF5TGxtTG9nID09PSAnZnVuY3Rpb24nKSBmZXRjaEFuZERpc3BsYXlMbG1Mb2coKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEVTIG1vZHVsZSBleHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuZXhwb3J0IHtcbiAgbm9ybWFsaXplUG9zdEFuYWx5c2lzUXVlc3Rpb25zLFxuICBleHRyYWN0U3RydWN0dXJlZFF1ZXN0aW9uc0Zyb21Bc3Npc3RhbnRUZXh0LFxuICBtZXJnZVBvc3RBbmFseXNpc1F1ZXN0aW9ucyxcbiAgYW5hbHl6ZUpvYixcbn07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9nb2Fscy5qcyBcdTIwMTQgR2VuZXJhdGlvbiBHb2FscyBjb25maWd1cmF0aW9uIHRhYi5cbiAqXG4gKiBBbGxvd3MgdGhlIHVzZXIgdG8gc2V0IGRvY3VtZW50LWxlbmd0aCBhbmQgY2hhcmFjdGVyLWNvdW50IGNvbnN0cmFpbnRzIHRoYXRcbiAqIGFyZSBpbmplY3RlZCBpbnRvIGV2ZXJ5IExMTSBwcm9tcHQgYW5kIHVzZWQgdG8gY29udHJvbCB0aGUgZmluYWwgUERGIGxlbmd0aC5cbiAqXG4gKiBGaWVsZHM6XG4gKiAgIHBkZl9wYWdlc19lbmFibGVkICAgIFx1MjAxNCB3aGV0aGVyIHRoZSBQREYgcGFnZSBnb2FsIGlzIGFjdGl2ZVxuICogICBtYXhfcGRmX3BhZ2VzX21vZGUgICBcdTIwMTQgJ2NvbWJpbmVkJyB8ICdzcGxpdCdcbiAqICAgbWF4X3BkZl9wYWdlcyAgICAgICAgXHUyMDE0IGNvbWJpbmVkIHRvdGFsIFBERiBwYWdlIGdvYWwgKG1vZGU9Y29tYmluZWQpXG4gKiAgIG1heF9wZGZfcmVzdW1lX3BhZ2VzIFx1MjAxNCByZXN1bWUtcG9ydGlvbiBwYWdlIGdvYWwgKG1vZGU9c3BsaXQpXG4gKiAgIG1heF9wZGZfY3ZfcGFnZXMgICAgIFx1MjAxNCBDVi9wdWJsaWNhdGlvbnMgcG9ydGlvbiBwYWdlIGdvYWwgKG1vZGU9c3BsaXQpXG4gKiAgIGF0c19wYWdlc19lbmFibGVkICAgIFx1MjAxNCB3aGV0aGVyIHRoZSBBVFMgcGFnZSBnb2FsIGlzIGFjdGl2ZVxuICogICBtYXhfYXRzX3BhZ2VzICAgICAgICBcdTIwMTQgdGFyZ2V0IHBhZ2UgY291bnQgZm9yIEFUUyBwbGFpbi10ZXh0IG91dHB1dFxuICogICBhdHNfY2hhcnNfZW5hYmxlZCAgICBcdTIwMTQgd2hldGhlciB0aGUgQVRTIGNoYXJhY3RlciBsaW1pdCBpcyBhY3RpdmUgKGRlZmF1bHQgZmFsc2UpXG4gKiAgIG1heF9hdHNfY2hhcnMgICAgICAgIFx1MjAxNCBtYXhpbXVtIGNoYXJhY3RlcnMgKGluY2x1ZGluZyBzcGFjZXMpIGZvciBBVFMgdGV4dFxuICpcbiAqIEVhY2ggZ29hbCBoYXMgYSBjaGVja2JveCB0byBlbmFibGUgb3IgZGlzYWJsZSBpdDsgZGlzYWJsZWQgZ29hbHMgYXJlIG5vdFxuICogc2VudCB0byB0aGUgYmFja2VuZCBhbmQgYXJlIG5vdCBpbmplY3RlZCBpbnRvIHByb21wdHMuXG4gKlxuICogREVQRU5ERU5DSUVTIChhdmFpbGFibGUgb24gZ2xvYmFsVGhpcyB2aWEgbWFpbi5qcyk6XG4gKiAgIGFwaUNhbGwgKGFwaS1jbGllbnQuanMpXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuXG5jb25zdCBsb2cgPSBnZXRMb2dnZXIoJ2dvYWxzJyk7XG5cbmNvbnN0IEdPQUxTX0RFRkFVTFRTID0ge1xuICBwZGZfcGFnZXNfZW5hYmxlZDogICAgdHJ1ZSxcbiAgbWF4X3BkZl9wYWdlc19tb2RlOiAgICdjb21iaW5lZCcsXG4gIG1heF9wZGZfcGFnZXM6ICAgICAgICAyLFxuICBtYXhfcGRmX3Jlc3VtZV9wYWdlczogMixcbiAgbWF4X3BkZl9jdl9wYWdlczogICAgIDEsXG4gIGF0c19wYWdlc19lbmFibGVkOiAgICB0cnVlLFxuICBtYXhfYXRzX3BhZ2VzOiAgICAgICAgMSxcbiAgYXRzX2NoYXJzX2VuYWJsZWQ6ICAgIGZhbHNlLFxuICBtYXhfYXRzX2NoYXJzOiAgICAgICAgNTAwMCxcbn07XG5cbi8qKiBTaGFyZWQgaW5saW5lIHN0eWxlcyAqL1xuY29uc3QgUyA9IHtcbiAgc2VjdGlvbjogICAgJ21hcmdpbi1ib3R0b206MjBweDtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJvcmRlciwjZTBlMGUwKTtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjE2cHgnLFxuICBoZWFkZXI6ICAgICAnZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTBweDttYXJnaW4tYm90dG9tOjEycHgnLFxuICBjaGVja2JveDogICAnd2lkdGg6MTZweDtoZWlnaHQ6MTZweDtjdXJzb3I6cG9pbnRlcjtmbGV4LXNocmluazowJyxcbiAgbGFiZWw6ICAgICAgJ2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MXJlbTtjdXJzb3I6cG9pbnRlcjttYXJnaW46MCcsXG4gIGhpbnQ6ICAgICAgICdmb250LXNpemU6MC44NzVyZW07Y29sb3I6dmFyKC0tdGV4dC1zZWNvbmRhcnksIzU1NSk7bWFyZ2luOjAgMCA4cHgnLFxuICBudW1JbnB1dDogICAncGFkZGluZzo2cHggMTBweDtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJvcmRlciwjY2NjKTtib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6MXJlbScsXG4gIHJvdzogICAgICAgICdkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDo4cHgnLFxuICBtdXRlZDogICAgICAnY29sb3I6dmFyKC0tdGV4dC1zZWNvbmRhcnksIzU1NSknLFxuICByYWRpb0xhYmVsOiAnZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmZsZXgtc3RhcnQ7Z2FwOjhweDtjdXJzb3I6cG9pbnRlcicsXG4gIHJhZGlvSW5wdXQ6ICdtYXJnaW4tdG9wOjNweCcsXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcG9wdWxhdGVHb2Fsc1RhYigpIHtcbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIGlmICghY29udGVudCkgcmV0dXJuO1xuXG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgY2xhc3M9XCJnb2Fscy1wYW5lbFwiIHN0eWxlPVwibWF4LXdpZHRoOjY0MHB4O21hcmdpbjowIGF1dG87cGFkZGluZzoyOHB4IDI0cHhcIj5cbiAgICAgIDxoMiBzdHlsZT1cIm1hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjhweFwiPlx1RDgzQ1x1REZBRiBHZW5lcmF0aW9uIEdvYWxzPC9oMj5cbiAgICAgIDxwIHN0eWxlPVwiJHtTLm11dGVkfTttYXJnaW4tYm90dG9tOjI0cHg7bGluZS1oZWlnaHQ6MS41XCI+XG4gICAgICAgIFNldCBvcHRpb25hbCBsZW5ndGggY29uc3RyYWludHMgZm9yIHRoZSBnZW5lcmF0ZWQgQ1YuXG4gICAgICAgIENoZWNrIGVhY2ggZ29hbCB5b3Ugd2FudCB0byBlbmZvcmNlOyB1bmNoZWNrZWQgZ29hbHMgYXJlIGlnbm9yZWQuXG4gICAgICAgIFRoZXNlIGd1aWRlIHRoZSBBSSBhdCBldmVyeSBlZGl0aW5nIHN0YWdlIGFuZCBjb250cm9sIHRoZSBmaW5hbCBkb2N1bWVudCBsZW5ndGguXG4gICAgICA8L3A+XG5cbiAgICAgIDwhLS0gXHUyNTAwXHUyNTAwIFBERiBQYWdlIExlbmd0aCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDAgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiZ29hbHMtc2VjdGlvblwiIHN0eWxlPVwiJHtTLnNlY3Rpb259XCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCIke1MuaGVhZGVyfVwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImdvYWxzLXBkZi1lbmFibGVkXCJcbiAgICAgICAgICAgICAgICAgb25jaGFuZ2U9XCJnb2Fsc1RvZ2dsZVNlY3Rpb24oJ3BkZicpXCJcbiAgICAgICAgICAgICAgICAgY2hlY2tlZCBzdHlsZT1cIiR7Uy5jaGVja2JveH1cIj5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwiZ29hbHMtcGRmLWVuYWJsZWRcIiBzdHlsZT1cIiR7Uy5sYWJlbH1cIj5QREYgUGFnZSBMZW5ndGg8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cImdvYWxzLXBkZi1ib2R5XCI+XG4gICAgICAgICAgPHAgc3R5bGU9XCIke1MuaGludH1cIj5cbiAgICAgICAgICAgIFRhcmdldCBwYWdlIGNvdW50IGZvciB0aGUgaHVtYW4tcmVhZGFibGUgUERGIChlLmcuIDFcdTIwMTMzKS5cbiAgICAgICAgICA8L3A+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Z2FwOjEycHhcIj5cblxuICAgICAgICAgICAgPCEtLSBcdTI1MDBcdTI1MDAgU2luZ2xlIHRvdGFsIG9wdGlvbiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDAgLS0+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgc3R5bGU9XCIke1MucmFkaW9MYWJlbH1cIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cImdvYWxzLXBkZi1tb2RlXCIgdmFsdWU9XCJjb21iaW5lZFwiXG4gICAgICAgICAgICAgICAgICAgICAgIGlkPVwiZ29hbHMtcGRmLW1vZGUtY29tYmluZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICBvbmNoYW5nZT1cImdvYWxzVXBkYXRlUGRmTW9kZSgpXCIgY2hlY2tlZFxuICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIiR7Uy5yYWRpb0lucHV0fVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICAgICAgPHN0cm9uZz5TaW5nbGUgdG90YWw8L3N0cm9uZz5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXNpemU6MC44NzVyZW07JHtTLm11dGVkfTttYXJnaW4tdG9wOjJweFwiPlxuICAgICAgICAgICAgICAgICAgICBPbmUgcGFnZSBnb2FsIGNvdmVyaW5nIHRoZSBlbnRpcmUgZG9jdW1lbnQsIGluY2x1ZGluZ1xuICAgICAgICAgICAgICAgICAgICBwdWJsaWNhdGlvbnMgYW5kIGNpdGF0aW9ucy5cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxkaXYgaWQ9XCJnb2Fscy1wZGYtY29tYmluZWRcIlxuICAgICAgICAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZy1sZWZ0OjI0cHg7bWFyZ2luLXRvcDo4cHg7JHtTLnJvd31cIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiZ29hbHMtbWF4LXBkZi1wYWdlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgIG1pbj1cIjFcIiBtYXg9XCIxMFwiIHN0ZXA9XCIxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCIke0dPQUxTX0RFRkFVTFRTLm1heF9wZGZfcGFnZXN9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDo5MHB4OyR7Uy5udW1JbnB1dH1cIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cIiR7Uy5tdXRlZH1cIj5wYWdlcyB0b3RhbDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBcdTI1MDBcdTI1MDAgU3BsaXQgcG9ydGlvbnMgb3B0aW9uIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMCAtLT5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBzdHlsZT1cIiR7Uy5yYWRpb0xhYmVsfVwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwiZ29hbHMtcGRmLW1vZGVcIiB2YWx1ZT1cInNwbGl0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJnb2Fscy1wZGYtbW9kZS1zcGxpdFwiXG4gICAgICAgICAgICAgICAgICAgICAgIG9uY2hhbmdlPVwiZ29hbHNVcGRhdGVQZGZNb2RlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIiR7Uy5yYWRpb0lucHV0fVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICAgICAgPHN0cm9uZz5TcGxpdCBwb3J0aW9uczwvc3Ryb25nPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtc2l6ZTowLjg3NXJlbTske1MubXV0ZWR9O21hcmdpbi10b3A6MnB4XCI+XG4gICAgICAgICAgICAgICAgICAgIFNlcGFyYXRlIHBhZ2UgZ29hbHMgZm9yIHRoZSByZXN1bWUgcG9ydGlvbiAoZXhwZXJpZW5jZSwgc2tpbGxzKVxuICAgICAgICAgICAgICAgICAgICBhbmQgdGhlIENWL3B1YmxpY2F0aW9ucyBwb3J0aW9uIChjaXRhdGlvbnMsIHB1YmxpY2F0aW9ucykuXG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICA8ZGl2IGlkPVwiZ29hbHMtcGRmLXNwbGl0XCJcbiAgICAgICAgICAgICAgICAgICBzdHlsZT1cInBhZGRpbmctbGVmdDoyNHB4O21hcmdpbi10b3A6OHB4O2Rpc3BsYXk6bm9uZTtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Z2FwOjhweFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCIke1Mucm93fVwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIHN0eWxlPVwibWluLXdpZHRoOjE4NXB4O2ZvbnQtc2l6ZTowLjlyZW1cIj5SZXN1bWUgcG9ydGlvbjo8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cImdvYWxzLW1heC1wZGYtcmVzdW1lLXBhZ2VzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICBtaW49XCIxXCIgbWF4PVwiMTBcIiBzdGVwPVwiMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCIke0dPQUxTX0RFRkFVTFRTLm1heF9wZGZfcmVzdW1lX3BhZ2VzfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDo5MHB4OyR7Uy5udW1JbnB1dH1cIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiJHtTLm11dGVkfVwiPnBhZ2VzPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCIke1Mucm93fVwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIHN0eWxlPVwibWluLXdpZHRoOjE4NXB4O2ZvbnQtc2l6ZTowLjlyZW1cIj5DViAvIFB1YmxpY2F0aW9ucyBwb3J0aW9uOjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiZ29hbHMtbWF4LXBkZi1jdi1wYWdlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgbWluPVwiMVwiIG1heD1cIjEwXCIgc3RlcD1cIjFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPVwiJHtHT0FMU19ERUZBVUxUUy5tYXhfcGRmX2N2X3BhZ2VzfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDo5MHB4OyR7Uy5udW1JbnB1dH1cIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiJHtTLm11dGVkfVwiPnBhZ2VzPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPC9kaXY+PCEtLSBlbmQgbW9kZSBvcHRpb25zIGNvbHVtbiAtLT5cbiAgICAgICAgPC9kaXY+PCEtLSBlbmQgZ29hbHMtcGRmLWJvZHkgLS0+XG4gICAgICA8L2Rpdj48IS0tIGVuZCBQREYgc2VjdGlvbiAtLT5cblxuICAgICAgPCEtLSBcdTI1MDBcdTI1MDAgQVRTIFBsYWluLVRleHQgUGFnZSBMZW5ndGggXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImdvYWxzLXNlY3Rpb25cIiBzdHlsZT1cIiR7Uy5zZWN0aW9ufVwiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiJHtTLmhlYWRlcn1cIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJnb2Fscy1hdHMtcGFnZXMtZW5hYmxlZFwiXG4gICAgICAgICAgICAgICAgIG9uY2hhbmdlPVwiZ29hbHNUb2dnbGVTZWN0aW9uKCdhdHMtcGFnZXMnKVwiXG4gICAgICAgICAgICAgICAgIGNoZWNrZWQgc3R5bGU9XCIke1MuY2hlY2tib3h9XCI+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cImdvYWxzLWF0cy1wYWdlcy1lbmFibGVkXCIgc3R5bGU9XCIke1MubGFiZWx9XCI+QVRTIFBsYWluLVRleHQgUGFnZSBMZW5ndGg8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cImdvYWxzLWF0cy1wYWdlcy1ib2R5XCI+XG4gICAgICAgICAgPHAgc3R5bGU9XCIke1MuaGludH1cIj5cbiAgICAgICAgICAgIFRhcmdldCBudW1iZXIgb2YgcGFnZXMgZm9yIHRoZSBBVFMtb3B0aW1pc2VkIHBsYWluLXRleHQgb3V0cHV0ICh0eXBpY2FsbHkgMVx1MjAxMzIpLlxuICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiJHtTLnJvd31cIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJnb2Fscy1tYXgtYXRzLXBhZ2VzXCJcbiAgICAgICAgICAgICAgICAgICBtaW49XCIxXCIgbWF4PVwiNVwiIHN0ZXA9XCIxXCJcbiAgICAgICAgICAgICAgICAgICB2YWx1ZT1cIiR7R09BTFNfREVGQVVMVFMubWF4X2F0c19wYWdlc31cIlxuICAgICAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6OTBweDske1MubnVtSW5wdXR9XCI+XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cIiR7Uy5tdXRlZH1cIj5wYWdlczwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBcdTI1MDBcdTI1MDAgQVRTIENoYXJhY3RlciBDb3VudCAoZGlzYWJsZWQgYnkgZGVmYXVsdCkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImdvYWxzLXNlY3Rpb25cIiBzdHlsZT1cIiR7Uy5zZWN0aW9ufTttYXJnaW4tYm90dG9tOjI4cHhcIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cIiR7Uy5oZWFkZXJ9XCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiZ29hbHMtYXRzLWNoYXJzLWVuYWJsZWRcIlxuICAgICAgICAgICAgICAgICBvbmNoYW5nZT1cImdvYWxzVG9nZ2xlU2VjdGlvbignYXRzLWNoYXJzJylcIlxuICAgICAgICAgICAgICAgICBzdHlsZT1cIiR7Uy5jaGVja2JveH1cIj5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwiZ29hbHMtYXRzLWNoYXJzLWVuYWJsZWRcIiBzdHlsZT1cIiR7Uy5sYWJlbH1cIj5BVFMgQ2hhcmFjdGVyIENvdW50IExpbWl0PC9sYWJlbD5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjhyZW07JHtTLm11dGVkfTtmb250LXN0eWxlOml0YWxpY1wiPihvcHRpb25hbCBcdTIwMTQgdW5jb21tb24pPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cImdvYWxzLWF0cy1jaGFycy1ib2R5XCIgc3R5bGU9XCJvcGFjaXR5OjAuNDtwb2ludGVyLWV2ZW50czpub25lXCI+XG4gICAgICAgICAgPHAgc3R5bGU9XCIke1MuaGludH1cIj5cbiAgICAgICAgICAgIE1heGltdW0gY2hhcmFjdGVycyAoaW5jbHVkaW5nIHNwYWNlcykgaW4gdGhlIEFUUyBwbGFpbi10ZXh0IG91dHB1dC5cbiAgICAgICAgICA8L3A+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cIiR7Uy5yb3d9XCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiZ29hbHMtbWF4LWF0cy1jaGFyc1wiXG4gICAgICAgICAgICAgICAgICAgbWluPVwiNTAwXCIgbWF4PVwiMjAwMDBcIiBzdGVwPVwiMTAwXCJcbiAgICAgICAgICAgICAgICAgICB2YWx1ZT1cIiR7R09BTFNfREVGQVVMVFMubWF4X2F0c19jaGFyc31cIlxuICAgICAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6MTEwcHg7JHtTLm51bUlucHV0fVwiPlxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCIke1MubXV0ZWR9XCI+Y2hhcmFjdGVyczwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBcdTI1MDBcdTI1MDAgR2VuZXJhdGlvbiBTZXR0aW5ncyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDAgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiZ29hbHMtc2VjdGlvblwiIHN0eWxlPVwiJHtTLnNlY3Rpb259O21hcmdpbi1ib3R0b206MjhweFwiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiJHtTLmhlYWRlcn1cIj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZToxLjFyZW1cIj5cdTI2OTlcdUZFMEY8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCIke1MubGFiZWx9XCI+R2VuZXJhdGlvbiBTZXR0aW5nczwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxwIHN0eWxlPVwiJHtTLmhpbnR9XCI+XG4gICAgICAgICAgQ29udHJvbHMgdGhlIHNoYXBlIG9mIHRoZSBnZW5lcmF0ZWQgQ1YgXHUyMDE0IGFwcGxpZWQgZHVyaW5nIGN1c3RvbWl6YXRpb24gYW5kIHJld3JpdGUgc3RlcHMuXG4gICAgICAgIDwvcD5cblxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtnYXA6MTRweFwiPlxuICAgICAgICAgIDwhLS0gTWF4IHNraWxscyAtLT5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTJweDtmbGV4LXdyYXA6d3JhcFwiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cImdvYWxzLW1heC1za2lsbHMtaW5wdXRcIiBzdHlsZT1cImZvbnQtc2l6ZTowLjlyZW07Y29sb3I6IzRiNTU2Mzt3aGl0ZS1zcGFjZTpub3dyYXA7bWluLXdpZHRoOjE2MHB4XCI+XG4gICAgICAgICAgICAgIE1heCBza2lsbHMgaW4gQ1Y6XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYW5nZVwiIGlkPVwiZ29hbHMtbWF4LXNraWxscy1pbnB1dFwiIG1pbj1cIjFcIiBtYXg9XCI2MFwiIHN0ZXA9XCIxXCIgdmFsdWU9XCIyMFwiXG4gICAgICAgICAgICAgICAgICAgb25pbnB1dD1cImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb2Fscy1tYXgtc2tpbGxzLXZhbHVlJykudGV4dENvbnRlbnQ9dGhpcy52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgb25jaGFuZ2U9XCJnb2Fsc0F1dG9TYXZlU2V0dGluZ3MoKVwiXG4gICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmbGV4OjE7bWluLXdpZHRoOjEyMHB4O2FjY2VudC1jb2xvcjojM2I4MmY2XCI+XG4gICAgICAgICAgICA8c3BhbiBpZD1cImdvYWxzLW1heC1za2lsbHMtdmFsdWVcIiBzdHlsZT1cImZvbnQtd2VpZ2h0OjYwMDtjb2xvcjojMWUyOTNiO21pbi13aWR0aDoyZW07dGV4dC1hbGlnbjpyaWdodFwiPjIwPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC44MmVtOyR7Uy5tdXRlZH1cIj4oZGVmYXVsdDogMjApPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBTa2lsbHMgc2VjdGlvbiB0aXRsZSAtLT5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTJweDtmbGV4LXdyYXA6d3JhcFwiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cImdvYWxzLXNraWxscy10aXRsZS1zZWxlY3RcIiBzdHlsZT1cImZvbnQtc2l6ZTowLjlyZW07Y29sb3I6IzRiNTU2Mzt3aGl0ZS1zcGFjZTpub3dyYXA7bWluLXdpZHRoOjE2MHB4XCI+XG4gICAgICAgICAgICAgIFNraWxscyBzZWN0aW9uIHRpdGxlOlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJnb2Fscy1za2lsbHMtdGl0bGUtc2VsZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgb25jaGFuZ2U9XCJnb2Fsc09uU2tpbGxzVGl0bGVTZWxlY3QoKVwiXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZm9udC1zaXplOjAuOWVtO2JvcmRlcjoxcHggc29saWQgI2QxZDVkYjtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjRweCA4cHg7Y29sb3I6IzFlMjkzYlwiPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiU2tpbGxzXCI+U2tpbGxzPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJUZWNobmljYWwgU2tpbGxzXCI+VGVjaG5pY2FsIFNraWxsczwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiS2V5IFNraWxsc1wiPktleSBTa2lsbHM8L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIkNvcmUgU2tpbGxzXCI+Q29yZSBTa2lsbHM8L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIl9fY3VzdG9tX19cIj5DdXN0b21cdTIwMjY8L29wdGlvbj5cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJnb2Fscy1za2lsbHMtdGl0bGUtY3VzdG9tXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBjdXN0b20gdGl0bGVcIlxuICAgICAgICAgICAgICAgICAgIG9uY2hhbmdlPVwiZ29hbHNBdXRvU2F2ZVNldHRpbmdzKClcIlxuICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZGlzcGxheTpub25lO2ZvbnQtc2l6ZTowLjllbTtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo0cHg7cGFkZGluZzo0cHggOHB4O2NvbG9yOiMxZTI5M2I7bWluLXdpZHRoOjE2MHB4XCI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8c3BhbiBpZD1cImdvYWxzLXNldHRpbmdzLXN0YXR1c1wiIHN0eWxlPVwiZGlzcGxheTpibG9jazttYXJnaW4tdG9wOjhweDtmb250LXNpemU6MC44MnJlbTt0cmFuc2l0aW9uOmNvbG9yIDAuMnNcIj48L3NwYW4+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBzdHlsZT1cIiR7Uy5yb3d9O2dhcDoxNHB4XCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJzYXZlLWdvYWxzLWJ0blwiXG4gICAgICAgICAgICAgICAgb25jbGljaz1cInNhdmVHZW5lcmF0aW9uR29hbHMoKVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4tcHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgc3R5bGU9XCJwYWRkaW5nOjhweCAyMnB4O2ZvbnQtc2l6ZTowLjk1cmVtXCI+XG4gICAgICAgICAgU2F2ZSBHb2Fsc1xuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPHNwYW4gaWQ9XCJnb2Fscy1zdGF0dXNcIlxuICAgICAgICAgICAgICBzdHlsZT1cImZvbnQtc2l6ZTowLjg3NXJlbTt0cmFuc2l0aW9uOmNvbG9yIDAuMnNcIj48L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYDtcblxuICAvLyBSZXN0b3JlIHNhdmVkIGdvYWxzIGZyb20gdGhlIGJhY2tlbmQgc2Vzc2lvbiBzdGF0ZS5cbiAgYXdhaXQgX2xvYWRHb2Fsc0Zyb21TdGF0dXMoKTtcbn1cblxuLyoqXG4gKiBUb2dnbGUgdGhlIGVuYWJsZWQvZGlzYWJsZWQgYXBwZWFyYW5jZSBvZiBhIGdvYWwgc2VjdGlvbi5cbiAqIEV4cG9ydGVkIHNvIHRoZSBpbmxpbmUgb25jaGFuZ2U9XCJnb2Fsc1RvZ2dsZVNlY3Rpb24oLi4uKVwiIGhhbmRsZXJzIHdvcmsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnb2Fsc1RvZ2dsZVNlY3Rpb24oc2VjdGlvbikge1xuICBjb25zdCBNQVAgPSB7XG4gICAgJ3BkZic6ICAgICAgIHsgY2I6ICdnb2Fscy1wZGYtZW5hYmxlZCcsICAgICAgIGJvZHk6ICdnb2Fscy1wZGYtYm9keScgICAgICAgfSxcbiAgICAnYXRzLXBhZ2VzJzogeyBjYjogJ2dvYWxzLWF0cy1wYWdlcy1lbmFibGVkJywgYm9keTogJ2dvYWxzLWF0cy1wYWdlcy1ib2R5JyB9LFxuICAgICdhdHMtY2hhcnMnOiB7IGNiOiAnZ29hbHMtYXRzLWNoYXJzLWVuYWJsZWQnLCBib2R5OiAnZ29hbHMtYXRzLWNoYXJzLWJvZHknIH0sXG4gIH07XG4gIGNvbnN0IHNlbCA9IE1BUFtzZWN0aW9uXTtcbiAgaWYgKCFzZWwpIHJldHVybjtcbiAgY29uc3QgY2IgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHNlbC5jYik7XG4gIGNvbnN0IGJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzZWwuYm9keSk7XG4gIGlmICghY2IgfHwgIWJvZHkpIHJldHVybjtcbiAgYm9keS5zdHlsZS5vcGFjaXR5ICAgICAgID0gY2IuY2hlY2tlZCA/ICcxJyAgICA6ICcwLjQnO1xuICBib2R5LnN0eWxlLnBvaW50ZXJFdmVudHMgPSBjYi5jaGVja2VkID8gJ2F1dG8nIDogJ25vbmUnO1xufVxuXG4vKipcbiAqIFNob3cvaGlkZSBjb21iaW5lZCB2cyBzcGxpdCBQREYgcGFnZSBpbnB1dHMgd2hlbiB0aGUgbW9kZSByYWRpbyBjaGFuZ2VzLlxuICogRXhwb3J0ZWQgc28gdGhlIGlubGluZSBvbmNoYW5nZT1cImdvYWxzVXBkYXRlUGRmTW9kZSgpXCIgaGFuZGxlciB3b3Jrcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdvYWxzVXBkYXRlUGRmTW9kZSgpIHtcbiAgY29uc3QgY29tYmluZWRSYWRpbyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb2Fscy1wZGYtbW9kZS1jb21iaW5lZCcpO1xuICBjb25zdCBpc0NvbWJpbmVkICAgID0gY29tYmluZWRSYWRpbz8uY2hlY2tlZCA/PyB0cnVlO1xuICBjb25zdCBjb21iaW5lZERpdiAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLXBkZi1jb21iaW5lZCcpO1xuICBjb25zdCBzcGxpdERpdiAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLXBkZi1zcGxpdCcpO1xuICBpZiAoY29tYmluZWREaXYpIGNvbWJpbmVkRGl2LnN0eWxlLmRpc3BsYXkgPSBpc0NvbWJpbmVkID8gJ2ZsZXgnICAgOiAnbm9uZSc7XG4gIGlmIChzcGxpdERpdikgICAgc3BsaXREaXYuc3R5bGUuZGlzcGxheSAgICA9IGlzQ29tYmluZWQgPyAnbm9uZScgICA6ICdmbGV4Jztcbn1cblxuLyoqXG4gKiBGZXRjaCBjdXJyZW50IGdlbmVyYXRpb24gZ29hbHMgZnJvbSB0aGUgc2Vzc2lvbiBhbmQgcG9wdWxhdGUgdGhlIGZvcm0gaW5wdXRzLlxuICogQHByaXZhdGVcbiAqL1xuYXN5bmMgZnVuY3Rpb24gX2xvYWRHb2Fsc0Zyb21TdGF0dXMoKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgZGF0YSAgPSBhd2FpdCBhcGlDYWxsKCdHRVQnLCAnL2FwaS9zdGF0dXMnKTtcbiAgICBjb25zdCBnb2FscyA9IGRhdGE/LmdlbmVyYXRpb25fZ29hbHM7XG4gICAgaWYgKCFnb2FscykgcmV0dXJuO1xuXG4gICAgLy8gXHUyNTAwXHUyNTAwIEVuYWJsZWQgY2hlY2tib3hlcyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICBjb25zdCBwZGZFbmFibGVkQ2IgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb2Fscy1wZGYtZW5hYmxlZCcpO1xuICAgIGNvbnN0IGF0c1BhZ2VFbmFibGVkQ2IgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLWF0cy1wYWdlcy1lbmFibGVkJyk7XG4gICAgY29uc3QgYXRzQ2hhcnNFbmFibGVkQ2IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtYXRzLWNoYXJzLWVuYWJsZWQnKTtcblxuICAgIGlmIChwZGZFbmFibGVkQ2IgICAgICAmJiBnb2Fscy5wZGZfcGFnZXNfZW5hYmxlZCAgIT0gbnVsbCkgcGRmRW5hYmxlZENiLmNoZWNrZWQgICAgICA9IGdvYWxzLnBkZl9wYWdlc19lbmFibGVkO1xuICAgIGlmIChhdHNQYWdlRW5hYmxlZENiICAmJiBnb2Fscy5hdHNfcGFnZXNfZW5hYmxlZCAgIT0gbnVsbCkgYXRzUGFnZUVuYWJsZWRDYi5jaGVja2VkICA9IGdvYWxzLmF0c19wYWdlc19lbmFibGVkO1xuICAgIGlmIChhdHNDaGFyc0VuYWJsZWRDYiAmJiBnb2Fscy5hdHNfY2hhcnNfZW5hYmxlZCAgIT0gbnVsbCkgYXRzQ2hhcnNFbmFibGVkQ2IuY2hlY2tlZCA9IGdvYWxzLmF0c19jaGFyc19lbmFibGVkO1xuXG4gICAgZ29hbHNUb2dnbGVTZWN0aW9uKCdwZGYnKTtcbiAgICBnb2Fsc1RvZ2dsZVNlY3Rpb24oJ2F0cy1wYWdlcycpO1xuICAgIGdvYWxzVG9nZ2xlU2VjdGlvbignYXRzLWNoYXJzJyk7XG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgUERGIG1vZGUgcmFkaW8gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgaWYgKGdvYWxzLm1heF9wZGZfcGFnZXNfbW9kZSkge1xuICAgICAgY29uc3QgcmFkaW8gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICBgaW5wdXRbbmFtZT1cImdvYWxzLXBkZi1tb2RlXCJdW3ZhbHVlPVwiJHtnb2Fscy5tYXhfcGRmX3BhZ2VzX21vZGV9XCJdYCk7XG4gICAgICBpZiAocmFkaW8pIHJhZGlvLmNoZWNrZWQgPSB0cnVlO1xuICAgICAgZ29hbHNVcGRhdGVQZGZNb2RlKCk7XG4gICAgfVxuXG4gICAgLy8gXHUyNTAwXHUyNTAwIE51bWVyaWMgdmFsdWVzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIGNvbnN0IHBkZklucHV0ICAgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb2Fscy1tYXgtcGRmLXBhZ2VzJyk7XG4gICAgY29uc3QgcGRmUmVzdW1lSW5wdXQgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLW1heC1wZGYtcmVzdW1lLXBhZ2VzJyk7XG4gICAgY29uc3QgcGRmQ3ZJbnB1dCAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLW1heC1wZGYtY3YtcGFnZXMnKTtcbiAgICBjb25zdCBhdHNQYWdlSW5wdXQgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtbWF4LWF0cy1wYWdlcycpO1xuICAgIGNvbnN0IGF0c0NoYXJJbnB1dCAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb2Fscy1tYXgtYXRzLWNoYXJzJyk7XG5cbiAgICBpZiAocGRmSW5wdXQgICAgICAgJiYgZ29hbHMubWF4X3BkZl9wYWdlcyAgICAgICAgICE9IG51bGwpIHBkZklucHV0LnZhbHVlICAgICAgID0gZ29hbHMubWF4X3BkZl9wYWdlcztcbiAgICBpZiAocGRmUmVzdW1lSW5wdXQgJiYgZ29hbHMubWF4X3BkZl9yZXN1bWVfcGFnZXMgICE9IG51bGwpIHBkZlJlc3VtZUlucHV0LnZhbHVlID0gZ29hbHMubWF4X3BkZl9yZXN1bWVfcGFnZXM7XG4gICAgaWYgKHBkZkN2SW5wdXQgICAgICYmIGdvYWxzLm1heF9wZGZfY3ZfcGFnZXMgICAgICAhPSBudWxsKSBwZGZDdklucHV0LnZhbHVlICAgICA9IGdvYWxzLm1heF9wZGZfY3ZfcGFnZXM7XG4gICAgaWYgKGF0c1BhZ2VJbnB1dCAgICYmIGdvYWxzLm1heF9hdHNfcGFnZXMgICAgICAgICAhPSBudWxsKSBhdHNQYWdlSW5wdXQudmFsdWUgICA9IGdvYWxzLm1heF9hdHNfcGFnZXM7XG4gICAgaWYgKGF0c0NoYXJJbnB1dCAgICYmIGdvYWxzLm1heF9hdHNfY2hhcnMgICAgICAgICAhPSBudWxsKSBhdHNDaGFySW5wdXQudmFsdWUgICA9IGdvYWxzLm1heF9hdHNfY2hhcnM7XG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgR2VuZXJhdGlvbiBTZXR0aW5ncyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICBjb25zdCBtYXhTa2lsbHNTbGlkZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtbWF4LXNraWxscy1pbnB1dCcpO1xuICAgIGNvbnN0IG1heFNraWxsc0xhYmVsICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb2Fscy1tYXgtc2tpbGxzLXZhbHVlJyk7XG4gICAgaWYgKG1heFNraWxsc1NsaWRlciAmJiBkYXRhLm1heF9za2lsbHMgIT0gbnVsbCkge1xuICAgICAgbWF4U2tpbGxzU2xpZGVyLnZhbHVlID0gZGF0YS5tYXhfc2tpbGxzO1xuICAgICAgaWYgKG1heFNraWxsc0xhYmVsKSBtYXhTa2lsbHNMYWJlbC50ZXh0Q29udGVudCA9IGRhdGEubWF4X3NraWxscztcbiAgICB9XG4gICAgY29uc3Qga25vd25UaXRsZXMgPSBbJ1NraWxscycsICdUZWNobmljYWwgU2tpbGxzJywgJ0tleSBTa2lsbHMnLCAnQ29yZSBTa2lsbHMnXTtcbiAgICBjb25zdCBjdXJyZW50VGl0bGUgPSBkYXRhLnNraWxsc19zZWN0aW9uX3RpdGxlIHx8ICdTa2lsbHMnO1xuICAgIGNvbnN0IHRpdGxlU2VsZWN0ICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb2Fscy1za2lsbHMtdGl0bGUtc2VsZWN0Jyk7XG4gICAgY29uc3QgdGl0bGVDdXN0b20gID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLXNraWxscy10aXRsZS1jdXN0b20nKTtcbiAgICBpZiAodGl0bGVTZWxlY3QpIHtcbiAgICAgIGNvbnN0IGlzS25vd24gPSBrbm93blRpdGxlcy5pbmNsdWRlcyhjdXJyZW50VGl0bGUpO1xuICAgICAgdGl0bGVTZWxlY3QudmFsdWUgPSBpc0tub3duID8gY3VycmVudFRpdGxlIDogJ19fY3VzdG9tX18nO1xuICAgICAgaWYgKHRpdGxlQ3VzdG9tKSB7XG4gICAgICAgIHRpdGxlQ3VzdG9tLnN0eWxlLmRpc3BsYXkgPSBpc0tub3duID8gJ25vbmUnIDogJyc7XG4gICAgICAgIGlmICghaXNLbm93bikgdGl0bGVDdXN0b20udmFsdWUgPSBjdXJyZW50VGl0bGU7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cud2FybignRmFpbGVkIHRvIGxvYWQgZ2VuZXJhdGlvbiBnb2FscyBmcm9tIGJhY2tlbmQ6JywgZXJyKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlYWQgdGhlIGZvcm0gaW5wdXRzLCB2YWxpZGF0ZSwgYW5kIFBPU1QgdG8gL2FwaS9nZW5lcmF0aW9uLWdvYWxzLlxuICogRXhwb3NlZCBvbiBnbG9iYWxUaGlzIHNvIHRoZSBpbmxpbmUgb25jbGljaz1cInNhdmVHZW5lcmF0aW9uR29hbHMoKVwiIHdvcmtzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2F2ZUdlbmVyYXRpb25Hb2FscygpIHtcbiAgY29uc3Qgc3RhdHVzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtc3RhdHVzJyk7XG5cbiAgLy8gXHUyNTAwXHUyNTAwIFJlYWQgZW5hYmxlZCBmbGFncyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgY29uc3QgcGRmRW5hYmxlZCAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLXBkZi1lbmFibGVkJyk/LmNoZWNrZWQgICAgICA/PyB0cnVlO1xuICBjb25zdCBhdHNQYWdlRW5hYmxlZCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtYXRzLXBhZ2VzLWVuYWJsZWQnKT8uY2hlY2tlZCA/PyB0cnVlO1xuICBjb25zdCBhdHNDaGFyc0VuYWJsZWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtYXRzLWNoYXJzLWVuYWJsZWQnKT8uY2hlY2tlZCA/PyBmYWxzZTtcblxuICAvLyBcdTI1MDBcdTI1MDAgUmVhZCBQREYgbW9kZSBhbmQgdmFsdWVzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICBjb25zdCBwZGZNb2RlICAgICAgICA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W25hbWU9XCJnb2Fscy1wZGYtbW9kZVwiXTpjaGVja2VkJyk/LnZhbHVlID8/ICdjb21iaW5lZCc7XG4gIGNvbnN0IHBkZlBhZ2VzICAgICAgID0gcGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLW1heC1wZGYtcGFnZXMnKT8udmFsdWUsICAgICAgICAxMCk7XG4gIGNvbnN0IHBkZlJlc3VtZVBhZ2VzID0gcGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLW1heC1wZGYtcmVzdW1lLXBhZ2VzJyk/LnZhbHVlLCAxMCk7XG4gIGNvbnN0IHBkZkN2UGFnZXMgICAgID0gcGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLW1heC1wZGYtY3YtcGFnZXMnKT8udmFsdWUsICAgICAxMCk7XG4gIGNvbnN0IGF0c1BhZ2VzICAgICAgID0gcGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLW1heC1hdHMtcGFnZXMnKT8udmFsdWUsICAgICAgICAxMCk7XG4gIGNvbnN0IGF0c0NoYXJzICAgICAgID0gcGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLW1heC1hdHMtY2hhcnMnKT8udmFsdWUsICAgICAgICAxMCk7XG5cbiAgLy8gXHUyNTAwXHUyNTAwIFZhbGlkYXRlIG9ubHkgZW5hYmxlZCBmaWVsZHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIGlmIChwZGZFbmFibGVkKSB7XG4gICAgaWYgKHBkZk1vZGUgPT09ICdjb21iaW5lZCcpIHtcbiAgICAgIGlmICghcGRmUGFnZXMgfHwgcGRmUGFnZXMgPCAxIHx8IHBkZlBhZ2VzID4gMTApIHtcbiAgICAgICAgX3NldFN0YXR1cyhzdGF0dXNFbCwgJ1x1MjZBMFx1RkUwRiBQREYgcGFnZXMgbXVzdCBiZSAxXHUyMDEzMTAuJywgJ3dhcm4nKTsgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIXBkZlJlc3VtZVBhZ2VzIHx8IHBkZlJlc3VtZVBhZ2VzIDwgMSB8fCBwZGZSZXN1bWVQYWdlcyA+IDEwKSB7XG4gICAgICAgIF9zZXRTdGF0dXMoc3RhdHVzRWwsICdcdTI2QTBcdUZFMEYgUmVzdW1lIHBvcnRpb24gcGFnZXMgbXVzdCBiZSAxXHUyMDEzMTAuJywgJ3dhcm4nKTsgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCFwZGZDdlBhZ2VzIHx8IHBkZkN2UGFnZXMgPCAxIHx8IHBkZkN2UGFnZXMgPiAxMCkge1xuICAgICAgICBfc2V0U3RhdHVzKHN0YXR1c0VsLCAnXHUyNkEwXHVGRTBGIENWIC8gUHVibGljYXRpb25zIHBvcnRpb24gcGFnZXMgbXVzdCBiZSAxXHUyMDEzMTAuJywgJ3dhcm4nKTsgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoYXRzUGFnZUVuYWJsZWQgICYmICghYXRzUGFnZXMgIHx8IGF0c1BhZ2VzICA8IDEgIHx8IGF0c1BhZ2VzICA+IDUpKSAgICAgeyBfc2V0U3RhdHVzKHN0YXR1c0VsLCAnXHUyNkEwXHVGRTBGIEFUUyBwYWdlcyBtdXN0IGJlIDFcdTIwMTM1LicsICAgICAgICAgICd3YXJuJyk7IHJldHVybjsgfVxuICBpZiAoYXRzQ2hhcnNFbmFibGVkICYmICghYXRzQ2hhcnMgIHx8IGF0c0NoYXJzICA8IDUwMCB8fCBhdHNDaGFycyA+IDIwMDAwKSkgeyBfc2V0U3RhdHVzKHN0YXR1c0VsLCAnXHUyNkEwXHVGRTBGIENoYXJhY3RlcnMgbXVzdCBiZSA1MDBcdTIwMTMyMCAwMDAuJywgJ3dhcm4nKTsgcmV0dXJuOyB9XG5cbiAgLy8gXHUyNTAwXHUyNTAwIEJ1aWxkIHBheWxvYWQgKGluY2x1ZGUgZW5hYmxlZCBmbGFncyArIGFjdGl2ZSB2YWx1ZXMgb25seSkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgcGRmX3BhZ2VzX2VuYWJsZWQ6ICBwZGZFbmFibGVkLFxuICAgIGF0c19wYWdlc19lbmFibGVkOiAgYXRzUGFnZUVuYWJsZWQsXG4gICAgYXRzX2NoYXJzX2VuYWJsZWQ6ICBhdHNDaGFyc0VuYWJsZWQsXG4gICAgbWF4X3BkZl9wYWdlc19tb2RlOiBwZGZNb2RlLFxuICB9O1xuXG4gIGlmIChwZGZFbmFibGVkKSB7XG4gICAgaWYgKHBkZk1vZGUgPT09ICdjb21iaW5lZCcpIHtcbiAgICAgIHBheWxvYWQubWF4X3BkZl9wYWdlcyA9IHBkZlBhZ2VzO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXlsb2FkLm1heF9wZGZfcmVzdW1lX3BhZ2VzID0gcGRmUmVzdW1lUGFnZXM7XG4gICAgICBwYXlsb2FkLm1heF9wZGZfY3ZfcGFnZXMgICAgID0gcGRmQ3ZQYWdlcztcbiAgICB9XG4gIH1cbiAgaWYgKGF0c1BhZ2VFbmFibGVkKSAgcGF5bG9hZC5tYXhfYXRzX3BhZ2VzID0gYXRzUGFnZXM7XG4gIGlmIChhdHNDaGFyc0VuYWJsZWQpIHBheWxvYWQubWF4X2F0c19jaGFycyA9IGF0c0NoYXJzO1xuXG4gIF9zZXRTdGF0dXMoc3RhdHVzRWwsICdTYXZpbmdcdTIwMjYnLCAnaW5mbycpO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgYXBpQ2FsbCgnUE9TVCcsICcvYXBpL2dlbmVyYXRpb24tZ29hbHMnLCBwYXlsb2FkKTtcbiAgICBfc2V0U3RhdHVzKHN0YXR1c0VsLCAnXHUyNzEzIFNhdmVkJywgJ29rJyk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7IGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnJzsgfSwgMzAwMCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy5lcnJvcignRmFpbGVkIHRvIHNhdmUgZ2VuZXJhdGlvbiBnb2FsczonLCBlcnIpO1xuICAgIF9zZXRTdGF0dXMoc3RhdHVzRWwsICdTYXZlIGZhaWxlZC4gUGxlYXNlIHRyeSBhZ2Fpbi4nLCAnZXJyb3InKTtcbiAgfVxufVxuXG4vKipcbiAqIFNob3cvaGlkZSB0aGUgY3VzdG9tLXRpdGxlIGlucHV0IHdoZW4gdGhlIHNraWxscy10aXRsZSBzZWxlY3QgY2hhbmdlcy5cbiAqIEV4cG9ydGVkIHNvIHRoZSBpbmxpbmUgb25jaGFuZ2U9XCJnb2Fsc09uU2tpbGxzVGl0bGVTZWxlY3QoKVwiIGhhbmRsZXIgd29ya3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnb2Fsc09uU2tpbGxzVGl0bGVTZWxlY3QoKSB7XG4gIGNvbnN0IHNlbCAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb2Fscy1za2lsbHMtdGl0bGUtc2VsZWN0Jyk7XG4gIGNvbnN0IGN1c3RvbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb2Fscy1za2lsbHMtdGl0bGUtY3VzdG9tJyk7XG4gIGlmICghc2VsKSByZXR1cm47XG4gIGlmIChzZWwudmFsdWUgPT09ICdfX2N1c3RvbV9fJykge1xuICAgIGlmIChjdXN0b20pIHsgY3VzdG9tLnN0eWxlLmRpc3BsYXkgPSAnJzsgY3VzdG9tLmZvY3VzKCk7IH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoY3VzdG9tKSBjdXN0b20uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBnb2Fsc0F1dG9TYXZlU2V0dGluZ3MoKTtcbiAgfVxufVxuXG4vKipcbiAqIEF1dG8tc2F2ZSB0aGUgZ2VuZXJhdGlvbiBzZXR0aW5ncyAobWF4X3NraWxscyArIHNraWxsc19zZWN0aW9uX3RpdGxlKVxuICogdmlhIFBPU1QgL2FwaS9nZW5lcmF0aW9uLXNldHRpbmdzIHdpdGhvdXQgYmxvY2tpbmcuXG4gKiBFeHBvcnRlZCBzbyBpbmxpbmUgb25jaGFuZ2U9XCJnb2Fsc0F1dG9TYXZlU2V0dGluZ3MoKVwiIGhhbmRsZXJzIHdvcmsuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnb2Fsc0F1dG9TYXZlU2V0dGluZ3MoKSB7XG4gIGNvbnN0IHN0YXR1c0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLXNldHRpbmdzLXN0YXR1cycpO1xuICBjb25zdCBzbGlkZXIgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb2Fscy1tYXgtc2tpbGxzLWlucHV0Jyk7XG4gIGNvbnN0IHNlbCAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvYWxzLXNraWxscy10aXRsZS1zZWxlY3QnKTtcbiAgY29uc3QgY3VzdG9tICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbHMtc2tpbGxzLXRpdGxlLWN1c3RvbScpO1xuXG4gIGNvbnN0IG1heFNraWxscyA9IHNsaWRlciA/IHBhcnNlSW50KHNsaWRlci52YWx1ZSwgMTApIDogbnVsbDtcbiAgY29uc3QgdGl0bGUgICAgID0gc2VsPy52YWx1ZSA9PT0gJ19fY3VzdG9tX18nXG4gICAgPyAoY3VzdG9tPy52YWx1ZT8udHJpbSgpIHx8IG51bGwpXG4gICAgOiAoc2VsPy52YWx1ZSB8fCBudWxsKTtcblxuICBpZiAoIW1heFNraWxscyAmJiAhdGl0bGUpIHJldHVybjtcblxuICBjb25zdCBwYXlsb2FkID0ge307XG4gIGlmIChtYXhTa2lsbHMgJiYgbWF4U2tpbGxzID49IDEpIHBheWxvYWQubWF4X3NraWxscyAgICAgICAgICA9IG1heFNraWxscztcbiAgaWYgKHRpdGxlKSAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZC5za2lsbHNfc2VjdGlvbl90aXRsZSA9IHRpdGxlO1xuXG4gIF9zZXRTdGF0dXMoc3RhdHVzRWwsICdTYXZpbmdcdTIwMjYnLCAnaW5mbycpO1xuICB0cnkge1xuICAgIGF3YWl0IGFwaUNhbGwoJ1BPU1QnLCAnL2FwaS9nZW5lcmF0aW9uLXNldHRpbmdzJywgcGF5bG9hZCk7XG4gICAgX3NldFN0YXR1cyhzdGF0dXNFbCwgJ1x1MjcxMyBTYXZlZCcsICdvaycpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4geyBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJyc7IH0sIDIwMDApO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cud2FybignRmFpbGVkIHRvIHNhdmUgZ2VuZXJhdGlvbiBzZXR0aW5nczonLCBlcnIpO1xuICAgIF9zZXRTdGF0dXMoc3RhdHVzRWwsICdTYXZlIGZhaWxlZCcsICdlcnJvcicpO1xuICB9XG59XG5cbi8qKiBAcHJpdmF0ZSAqL1xuZnVuY3Rpb24gX3NldFN0YXR1cyhlbCwgbWVzc2FnZSwgbGV2ZWwpIHtcbiAgaWYgKCFlbCkgcmV0dXJuO1xuICBjb25zdCBjb2xvdXJzID0ge1xuICAgIG9rOiAgICAndmFyKC0tc3VjY2VzcywjMmU3ZDMyKScsXG4gICAgZXJyb3I6ICd2YXIoLS1kYW5nZXIsI2M2MjgyOCknLFxuICAgIHdhcm46ICAndmFyKC0td2FybmluZywjZTY1MTAwKScsXG4gICAgaW5mbzogICd2YXIoLS10ZXh0LXNlY29uZGFyeSwjNTU1KScsXG4gIH07XG4gIGVsLnN0eWxlLmNvbG9yICA9IGNvbG91cnNbbGV2ZWxdIHx8IGNvbG91cnMuaW5mbztcbiAgZWwudGV4dENvbnRlbnQgID0gbWVzc2FnZTtcbn1cbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL3Nlc3Npb24tbWFuYWdlci5qc1xuICogU2Vzc2lvbiBsaWZlY3ljbGU6IGNyZWF0ZSwgY2xhaW0sIHJlc3RvcmUsIHNhdmUsIGxvYWQuXG4gKiBBbHNvIG93bnMgZm9ybWF0U2Vzc2lvblBoYXNlTGFiZWwgYW5kIHJlbGF0ZWQgc2Vzc2lvbi1sYWJlbCBoZWxwZXJzLlxuICpcbiAqIERFUEVOREVOQ0lFUyAoYWxsIG9uIGdsb2JhbFRoaXMgYXQgcnVudGltZSk6XG4gKiAgIC0gY3JlYXRlU2Vzc2lvbiwgZmV0Y2hTdGF0dXMgKGFwaS1jbGllbnQuanMpXG4gKiAgIC0gZ2V0U2Vzc2lvbklkRnJvbVVSTCwgZ2V0T3duZXJUb2tlbiwgU3RvcmFnZUtleXMsIGdldFNjb3BlZFRhYkRhdGFTdG9yYWdlS2V5IChzdGF0ZS1tYW5hZ2VyLmpzKVxuICogICAtIGFwcGVuZE1lc3NhZ2UsIGFwcGVuZFJldHJ5TWVzc2FnZSAobWVzc2FnZS1xdWV1ZS5qcylcbiAqICAgLSBwYXJzZVN0YXR1c1Jlc3BvbnNlLCBwYXJzZVJld3JpdGVzUmVzcG9uc2UgKHZhbGlkYXRvcnMuanMpXG4gKiAgIC0gcmVmcmVzaEF0c1Njb3JlIChhdHMtcmVmaW5lbWVudC5qcylcbiAqICAgLSB1cGRhdGVJbmNsdXNpb25Db3VudHMgKHJldmlldy10YWJsZS1iYXNlLmpzLCBUaWVyIDQpXG4gKiAgIC0gc3dpdGNoVGFiIChyZXZpZXctdGFibGUtYmFzZS5qcywgVGllciA0KVxuICogICAtIHJlbmRlclJld3JpdGVQYW5lbCAocmV3cml0ZS1yZXZpZXcuanMsIFRpZXIgNilcbiAqICAgLSBzaG93T3duZXJzaGlwQ29uZmxpY3REaWFsb2csIG9wZW5TZXNzaW9uc01vZGFsIChzZXNzaW9uLXN3aXRjaGVyLXVpLmpzLCBUaWVyIDcpXG4gKiAgIC0gdXBkYXRlQWN0aW9uQnV0dG9ucyAodWktaGVscGVycy5qcylcbiAqICAgLSB1cGRhdGVQb3NpdGlvblRpdGxlIChzZXNzaW9uLWFjdGlvbnMuanMpXG4gKiAgIC0gZXNjYXBlSHRtbCwgU0VTU0lPTl9QSEFTRV9MQUJFTFNfU0hPUlQgKHV0aWxzLmpzKVxuICogICAtIHN0YXRlTWFuYWdlciAoc3RhdGUtbWFuYWdlci5qcyBcdTIwMTQgZ2V0QWxsVGFiRGF0YSgpL2dldEN1cnJlbnRUYWIoKS9zZXRUYWJEYXRhKCkvc2V0Q3VycmVudFRhYigpKVxuICogICAtIHNlc3Npb25JZCwgaXNSZWNvbm5lY3RpbmcsIGxhc3RLbm93blBoYXNlLCBpbnRlcmFjdGl2ZVN0YXRlLFxuICogICAgIHJld3JpdGVEZWNpc2lvbnMsIFBIQVNFUyAod2luZG93IGdsb2JhbHMpXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdzZXNzaW9uLW1hbmFnZXInKTtcblxuaW1wb3J0IHsgU0VTU0lPTl9QSEFTRV9MQUJFTFNfU0hPUlQsIFNFU1NJT05fUEhBU0VfTEFCRUxTIH0gZnJvbSAnLi91dGlscy5qcyc7XG5pbXBvcnQgeyBQSEFTRVMsIHN0YXRlTWFuYWdlciB9IGZyb20gJy4vc3RhdGUtbWFuYWdlci5qcyc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU2Vzc2lvbiBwaGFzZSBsYWJlbHMgKGFiYnJldmlhdGVkIGZvcm0gXHUyMDE0IGZvciBjb21wYWN0IHNlc3Npb24tc3dpdGNoZXIgVUkpXG4vLyBGdWxsLWxlbmd0aCBsYWJlbHMgbGl2ZSBpbiB1dGlscy5qcyBTRVNTSU9OX1BIQVNFX0xBQkVMUy5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiBmb3JtYXRTZXNzaW9uUGhhc2VMYWJlbChwaGFzZSkge1xuICBpZiAoIXBoYXNlKSByZXR1cm4gJ2luaXQnO1xuICByZXR1cm4gU0VTU0lPTl9QSEFTRV9MQUJFTFNfU0hPUlRbcGhhc2VdIHx8IFN0cmluZyhwaGFzZSkucmVwbGFjZSgvXy9nLCAnICcpO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEN1cnJlbnQgc2Vzc2lvbiBpZGVudGl0eSBoZWxwZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gX2dldEN1cnJlbnRTZXNzaW9uSWRWYWx1ZSgpIHtcbiAgaWYgKHR5cGVvZiBnZXRTZXNzaW9uSWRGcm9tVVJMID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGdldFNlc3Npb25JZEZyb21VUkwoKTtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpLmdldCgnc2Vzc2lvbicpO1xuICB9IGNhdGNoIChfKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2dldEN1cnJlbnRPd25lclRva2VuVmFsdWUoKSB7XG4gIGlmICh0eXBlb2YgZ2V0T3duZXJUb2tlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBnZXRPd25lclRva2VuKCk7XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnY3YtYnVpbGRlci1vd25lci10b2tlbicpO1xuICB9IGNhdGNoIChfKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gYnVpbGRTZXNzaW9uU3dpdGNoZXJMYWJlbChzdGF0dXMgPSB7fSkge1xuICBjb25zdCBwb3NpdGlvbk5hbWUgPSAoc3RhdHVzLnBvc2l0aW9uX25hbWUgfHwgJycpLnRvU3RyaW5nKCkudHJpbSgpO1xuICBjb25zdCBwaGFzZSA9IGZvcm1hdFNlc3Npb25QaGFzZUxhYmVsKHN0YXR1cy5waGFzZSk7XG4gIGlmIChwb3NpdGlvbk5hbWUpIHtcbiAgICByZXR1cm4gYCR7cG9zaXRpb25OYW1lfSBcdTAwQjcgJHtwaGFzZX1gO1xuICB9XG4gIHJldHVybiBfZ2V0Q3VycmVudFNlc3Npb25JZFZhbHVlKCkgPyBgU2Vzc2lvbiBcdTAwQjcgJHtwaGFzZX1gIDogJ1x1RDgzRFx1RENDMiBTZXNzaW9ucyc7XG59XG5cbmZ1bmN0aW9uIGdldEFjdGl2ZVNlc3Npb25Pd25lcnNoaXBNZXRhKHNlc3Npb24sIHtcbiAgY3VycmVudFNlc3Npb25JZCA9IF9nZXRDdXJyZW50U2Vzc2lvbklkVmFsdWUoKSxcbn0gPSB7fSkge1xuICBpZiAoIXNlc3Npb24gfHwgdHlwZW9mIHNlc3Npb24gIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHsgbGFiZWw6ICdVbmtub3duJywgY2xhc3NOYW1lOiAnc2Vzc2lvbi1zdGF0dXMtdW5jbGFpbWVkJywgaXNDdXJyZW50OiBmYWxzZSB9O1xuICB9XG5cbiAgY29uc3QgaXNDdXJyZW50U2Vzc2lvbiA9IEJvb2xlYW4oY3VycmVudFNlc3Npb25JZCkgJiYgc2Vzc2lvbi5zZXNzaW9uX2lkID09PSBjdXJyZW50U2Vzc2lvbklkO1xuICBjb25zdCBzYW1lT3duZXIgPSBCb29sZWFuKHNlc3Npb24ub3duZWRfYnlfcmVxdWVzdGVyKTtcblxuICBpZiAoaXNDdXJyZW50U2Vzc2lvbikge1xuICAgIHJldHVybiB7IGxhYmVsOiAnQ3VycmVudCB0YWInLCBjbGFzc05hbWU6ICdzZXNzaW9uLXN0YXR1cy1jdXJyZW50JywgaXNDdXJyZW50OiB0cnVlIH07XG4gIH1cbiAgaWYgKHNhbWVPd25lcikge1xuICAgIHJldHVybiB7IGxhYmVsOiAnT3duZWQgYnkgdGhpcyB0YWInLCBjbGFzc05hbWU6ICdzZXNzaW9uLXN0YXR1cy1jdXJyZW50JywgaXNDdXJyZW50OiBmYWxzZSB9O1xuICB9XG4gIGlmIChzZXNzaW9uLmNsYWltZWQpIHtcbiAgICByZXR1cm4geyBsYWJlbDogJ093bmVkIGJ5IGFub3RoZXIgdGFiJywgY2xhc3NOYW1lOiAnc2Vzc2lvbi1zdGF0dXMtb3duZWQnLCBpc0N1cnJlbnQ6IGZhbHNlIH07XG4gIH1cbiAgcmV0dXJuIHsgbGFiZWw6ICdVbmNsYWltZWQnLCBjbGFzc05hbWU6ICdzZXNzaW9uLXN0YXR1cy11bmNsYWltZWQnLCBpc0N1cnJlbnQ6IGZhbHNlIH07XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFNlc3Npb25UaW1lc3RhbXAodGltZXN0YW1wLCB7IGluY2x1ZGVUaW1lID0gdHJ1ZSB9ID0ge30pIHtcbiAgaWYgKCF0aW1lc3RhbXApIHJldHVybiAnXHUyMDE0JztcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IERhdGUodGltZXN0YW1wKS50b0xvY2FsZVN0cmluZygnZW4tVVMnLCB7XG4gICAgICBtb250aDogJ3Nob3J0JywgZGF5OiAnbnVtZXJpYycsIHllYXI6ICdudW1lcmljJyxcbiAgICAgIC4uLihpbmNsdWRlVGltZSA/IHsgaG91cjogJ251bWVyaWMnLCBtaW51dGU6ICcyLWRpZ2l0JyB9IDoge30pLFxuICAgIH0pO1xuICB9IGNhdGNoIChfKSB7XG4gICAgcmV0dXJuIFN0cmluZyh0aW1lc3RhbXApLnJlcGxhY2UoJ1QnLCAnICcpLnNsaWNlKDAsIGluY2x1ZGVUaW1lID8gMTYgOiAxMCk7XG4gIH1cbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBXZWxjb21lIC8gb25ib2FyZGluZyBtb2RhbCAoR0FQLTM2IC8gR0FQLTM3KVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IF9XRUxDT01FX0RJU01JU1NFRF9LRVkgPSAnY3YtYnVpbGRlci13ZWxjb21lLWRpc21pc3NlZCc7XG5cbi8qKlxuICogU3dpdGNoIHdoaWNoIGNvbnRlbnQgc2VjdGlvbiBpcyB2aXNpYmxlIGluc2lkZSB0aGUgd2VsY29tZSBtb2RhbC5cbiAqIEBwYXJhbSB7J3ByZXNlbnQnfCdtaXNzaW5nJ30gc2VjdGlvblxuICovXG5mdW5jdGlvbiBfc2V0V2VsY29tZVNlY3Rpb24oc2VjdGlvbikge1xuICBjb25zdCBzUHJlc2VudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd3ZWxjb21lLXNlY3Rpb24tcHJlc2VudCcpO1xuICBjb25zdCBzRW1wdHkgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd3ZWxjb21lLXNlY3Rpb24tZW1wdHknKTtcbiAgY29uc3Qgc01pc3NpbmcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnd2VsY29tZS1zZWN0aW9uLW1pc3NpbmcnKTtcbiAgY29uc3QgZlByZXNlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnd2VsY29tZS1mb290ZXItcHJlc2VudCcpO1xuICBjb25zdCBmTWlzc2luZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd3ZWxjb21lLWZvb3Rlci1taXNzaW5nJyk7XG4gIGlmIChzUHJlc2VudCkgc1ByZXNlbnQuc3R5bGUuZGlzcGxheSA9IHNlY3Rpb24gPT09ICdwcmVzZW50JyA/ICcnIDogJ25vbmUnO1xuICBpZiAoc0VtcHR5KSAgIHNFbXB0eS5zdHlsZS5kaXNwbGF5ICAgPSBzZWN0aW9uID09PSAnZW1wdHknICAgPyAnJyA6ICdub25lJztcbiAgaWYgKHNNaXNzaW5nKSBzTWlzc2luZy5zdHlsZS5kaXNwbGF5ID0gc2VjdGlvbiA9PT0gJ21pc3NpbmcnID8gJycgOiAnbm9uZSc7XG4gIC8vIEVtcHR5IHNrZWxldG9uOiBzaG93IFwicHJlc2VudFwiIGZvb3RlciAoQ2xvc2UvZGlzbWlzcykgbm90IFwibWlzc2luZ1wiIGZvb3RlciAoQ3JlYXRlL1JlbG9hZClcbiAgaWYgKGZQcmVzZW50KSBmUHJlc2VudC5zdHlsZS5kaXNwbGF5ID0gKHNlY3Rpb24gPT09ICdwcmVzZW50JyB8fCBzZWN0aW9uID09PSAnZW1wdHknKSA/ICdmbGV4JyA6ICdub25lJztcbiAgaWYgKGZNaXNzaW5nKSBmTWlzc2luZy5zdHlsZS5kaXNwbGF5ID0gc2VjdGlvbiA9PT0gJ21pc3NpbmcnID8gJ2ZsZXgnIDogJ25vbmUnO1xuICAvLyBGb3IgZW1wdHkgc3RhdGU6IGNoYW5nZSBDVEEgdG8gbmF2aWdhdGUgdG8gTWFzdGVyIENWIGluc3RlYWQgb2YganVzdCBjbG9zaW5nXG4gIGNvbnN0IGdldFN0YXJ0ZWRCdG4gPSBmUHJlc2VudCA/IGZQcmVzZW50LnF1ZXJ5U2VsZWN0b3IoJ2J1dHRvbi5wcmltYXJ5JykgOiBudWxsO1xuICBpZiAoZ2V0U3RhcnRlZEJ0bikge1xuICAgIGlmIChzZWN0aW9uID09PSAnZW1wdHknKSB7XG4gICAgICBnZXRTdGFydGVkQnRuLnRleHRDb250ZW50ID0gJ09wZW4gTWFzdGVyIENWJztcbiAgICAgIGdldFN0YXJ0ZWRCdG4ub25jbGljayA9ICgpID0+IHsgY2xvc2VXZWxjb21lTW9kYWwoKTsgaWYgKHR5cGVvZiBvcGVuTWFzdGVyQ3ZNb2RhbCA9PT0gJ2Z1bmN0aW9uJykgb3Blbk1hc3RlckN2TW9kYWwoKTsgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2V0U3RhcnRlZEJ0bi50ZXh0Q29udGVudCA9ICdHZXQgU3RhcnRlZCc7XG4gICAgICBnZXRTdGFydGVkQnRuLm9uY2xpY2sgPSAoKSA9PiB7XG4gICAgICAgIGNsb3NlV2VsY29tZU1vZGFsKCk7XG4gICAgICAgIGlmICh0eXBlb2Ygc3dpdGNoVGFiID09PSAnZnVuY3Rpb24nKSBzd2l0Y2hUYWIoJ2pvYicpO1xuICAgICAgfTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBTaG93IHRoZSBvbmJvYXJkaW5nIG1vZGFsIGluIHRoZSBcIm1pc3NpbmcgbWFzdGVyIENWXCIgc3RhdGUuXG4gKiBDYWxsZWQgZnJvbSBjcmVhdGVOZXdTZXNzaW9uQW5kTmF2aWdhdGUoKSB3aGVuIHRoZSBiYWNrZW5kIHJldHVybnMgbWFzdGVyX2N2X21pc3NpbmcuXG4gKiBAcGFyYW0ge3N0cmluZ30gbWFzdGVyQ3ZQYXRoIC0gU2VydmVyLXJlcG9ydGVkIGV4cGVjdGVkIGZpbGUgcGF0aC5cbiAqL1xuZnVuY3Rpb24gc2hvd09uYm9hcmRpbmdNb2RhbChtYXN0ZXJDdlBhdGgpIHtcbiAgY29uc3Qgb3ZlcmxheSAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb25ib2FyZGluZy1tb2RhbC1vdmVybGF5Jyk7XG4gIGNvbnN0IHBhdGhFbCAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ29uYm9hcmRpbmctbWFzdGVyLWN2LXBhdGgnKTtcbiAgY29uc3Qgc3RhdHVzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb25ib2FyZGluZy1tb2RhbC1zdGF0dXMnKTtcbiAgaWYgKHBhdGhFbCkgICBwYXRoRWwudGV4dENvbnRlbnQgICA9IG1hc3RlckN2UGF0aCB8fCAnKHVua25vd24pJztcbiAgaWYgKHN0YXR1c0VsKSBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICcnO1xuICBfc2V0V2VsY29tZVNlY3Rpb24oJ21pc3NpbmcnKTtcbiAgaWYgKG92ZXJsYXkpIHtcbiAgICBvdmVybGF5LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgX29wZW5PbmJvYXJkaW5nRm9jdXNUcmFwKG92ZXJsYXkpO1xuICB9XG59XG5cbi8qKlxuICogU2hvdyB0aGUgd2VsY29tZSBtb2RhbCB1bmxlc3MgdGhlIHVzZXIgaGFzIGRpc21pc3NlZCBpdC5cbiAqIENhbGxzIC9hcGkvc2V0dXAvbWFzdGVyLWN2LXN0YXR1cyB0byBjaG9vc2Ugd2hpY2ggc2VjdGlvbiB0byBkaXNwbGF5LlxuICogU2FmZSB0byBjYWxsIG9uIGV2ZXJ5IHN0YXJ0dXAgXHUyMDE0IG5vLW9wcyBpbW1lZGlhdGVseSBpZiBkaXNtaXNzZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG1heWJlU2hvd1dlbGNvbWVNb2RhbCgpIHtcbiAgdHJ5IHtcbiAgICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0oX1dFTENPTUVfRElTTUlTU0VEX0tFWSkpIHJldHVybjtcbiAgfSBjYXRjaCAoXykge31cbiAgbGV0IHNlY3Rpb24gPSAncHJlc2VudCc7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvc2V0dXAvbWFzdGVyLWN2LXN0YXR1cycpO1xuICAgIGlmIChyZXMub2spIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpLmNhdGNoKCgpID0+ICh7fSkpO1xuICAgICAgaWYgKCFkYXRhLmV4aXN0cykge1xuICAgICAgICBjb25zdCBwYXRoRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb25ib2FyZGluZy1tYXN0ZXItY3YtcGF0aCcpO1xuICAgICAgICBpZiAocGF0aEVsKSBwYXRoRWwudGV4dENvbnRlbnQgPSBkYXRhLnBhdGggfHwgJyh1bmtub3duKSc7XG4gICAgICAgIHNlY3Rpb24gPSAnbWlzc2luZyc7XG4gICAgICB9IGVsc2UgaWYgKGRhdGEuaXNfZW1wdHkpIHtcbiAgICAgICAgc2VjdGlvbiA9ICdlbXB0eSc7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChfKSB7fVxuICBjb25zdCBzdGF0dXNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvbmJvYXJkaW5nLW1vZGFsLXN0YXR1cycpO1xuICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJyc7XG4gIF9zZXRXZWxjb21lU2VjdGlvbihzZWN0aW9uKTtcbiAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvbmJvYXJkaW5nLW1vZGFsLW92ZXJsYXknKTtcbiAgaWYgKG92ZXJsYXkpIHtcbiAgICBvdmVybGF5LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgX29wZW5PbmJvYXJkaW5nRm9jdXNUcmFwKG92ZXJsYXkpO1xuICB9XG59XG5cbi8qKiBXaXJlIGZvY3VzIHRyYXAgYW5kIEVzY2FwZSBoYW5kbGVyIGZvciB0aGUgb25ib2FyZGluZyBvdmVybGF5IChXQ0FHIDIuMS4yKS4gKi9cbmZ1bmN0aW9uIF9vcGVuT25ib2FyZGluZ0ZvY3VzVHJhcChvdmVybGF5KSB7XG4gIGlmICh0eXBlb2YgZ2xvYmFsVGhpcy5zZXRJbml0aWFsRm9jdXMgPT09ICdmdW5jdGlvbicpIGdsb2JhbFRoaXMuc2V0SW5pdGlhbEZvY3VzKCdvbmJvYXJkaW5nLW1vZGFsLW92ZXJsYXknKTtcbiAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzLnRyYXBGb2N1cyA9PT0gJ2Z1bmN0aW9uJykgICAgICAgZ2xvYmFsVGhpcy50cmFwRm9jdXMoJ29uYm9hcmRpbmctbW9kYWwtb3ZlcmxheScpO1xuICBpZiAoIW92ZXJsYXkuX29uYm9hcmRpbmdFc2NIYW5kbGVyKSB7XG4gICAgb3ZlcmxheS5fb25ib2FyZGluZ0VzY0hhbmRsZXIgPSAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgY2xvc2VXZWxjb21lTW9kYWwoKTtcbiAgICB9O1xuICAgIG92ZXJsYXkuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIG92ZXJsYXkuX29uYm9hcmRpbmdFc2NIYW5kbGVyKTtcbiAgfVxufVxuXG4vKipcbiAqIFNob3cgdGhlIHdlbGNvbWUgbW9kYWwgdW5jb25kaXRpb25hbGx5IChpZ25vcmVzIHRoZSBcImRvbid0IHNob3cgYWdhaW5cIiBmbGFnKS5cbiAqIFVzZWQgYnkgdGhlIEhlbHAgYnV0dG9uIHNvIHVzZXJzIGNhbiBhbHdheXMgcmVvcGVuIG9uYm9hcmRpbmcgbWlkLXNlc3Npb24uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNob3dXZWxjb21lTW9kYWwoKSB7XG4gIGxldCBzZWN0aW9uID0gJ3ByZXNlbnQnO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3NldHVwL21hc3Rlci1jdi1zdGF0dXMnKTtcbiAgICBpZiAocmVzLm9rKSB7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKTtcbiAgICAgIGlmICghZGF0YS5leGlzdHMpIHtcbiAgICAgICAgY29uc3QgcGF0aEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ29uYm9hcmRpbmctbWFzdGVyLWN2LXBhdGgnKTtcbiAgICAgICAgaWYgKHBhdGhFbCkgcGF0aEVsLnRleHRDb250ZW50ID0gZGF0YS5wYXRoIHx8ICcodW5rbm93biknO1xuICAgICAgICBzZWN0aW9uID0gJ21pc3NpbmcnO1xuICAgICAgfSBlbHNlIGlmIChkYXRhLmlzX2VtcHR5KSB7XG4gICAgICAgIHNlY3Rpb24gPSAnZW1wdHknO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoXykge31cbiAgY29uc3Qgc3RhdHVzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb25ib2FyZGluZy1tb2RhbC1zdGF0dXMnKTtcbiAgaWYgKHN0YXR1c0VsKSBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICcnO1xuICBfc2V0V2VsY29tZVNlY3Rpb24oc2VjdGlvbik7XG4gIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb25ib2FyZGluZy1tb2RhbC1vdmVybGF5Jyk7XG4gIGlmIChvdmVybGF5KSB7XG4gICAgb3ZlcmxheS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICAgIF9vcGVuT25ib2FyZGluZ0ZvY3VzVHJhcChvdmVybGF5KTtcbiAgfVxufVxuXG4vKipcbiAqIENsb3NlIHRoZSB3ZWxjb21lIG1vZGFsLlxuICogSWYgXCJEb24ndCBzaG93IGFnYWluXCIgaXMgY2hlY2tlZCwgcGVyc2lzdHMgdGhlIGRpc21pc3NhbCBpbiBsb2NhbFN0b3JhZ2UuXG4gKi9cbmZ1bmN0aW9uIGNsb3NlV2VsY29tZU1vZGFsKCkge1xuICBjb25zdCBvdmVybGF5ICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvbmJvYXJkaW5nLW1vZGFsLW92ZXJsYXknKTtcbiAgY29uc3QgY2hlY2tib3ggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnd2VsY29tZS1kb250LXNob3ctYWdhaW4nKTtcbiAgaWYgKG92ZXJsYXkpIHtcbiAgICBvdmVybGF5LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgaWYgKG92ZXJsYXkuX29uYm9hcmRpbmdFc2NIYW5kbGVyKSB7XG4gICAgICBvdmVybGF5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBvdmVybGF5Ll9vbmJvYXJkaW5nRXNjSGFuZGxlcik7XG4gICAgICBkZWxldGUgb3ZlcmxheS5fb25ib2FyZGluZ0VzY0hhbmRsZXI7XG4gICAgfVxuICB9XG4gIGlmIChjaGVja2JveCAmJiBjaGVja2JveC5jaGVja2VkKSB7XG4gICAgdHJ5IHsgbG9jYWxTdG9yYWdlLnNldEl0ZW0oX1dFTENPTUVfRElTTUlTU0VEX0tFWSwgJzEnKTsgfSBjYXRjaCAoXykge31cbiAgfVxuICBpZiAodHlwZW9mIGdsb2JhbFRoaXMucmVzdG9yZUZvY3VzID09PSAnZnVuY3Rpb24nKSBnbG9iYWxUaGlzLnJlc3RvcmVGb2N1cygpO1xufVxuXG4vKipcbiAqIENhbGxlZCBieSB0aGUgb25ib2FyZGluZyBtb2RhbCBcIkNyZWF0ZSBlbXB0eSBwcm9maWxlXCIgYnV0dG9uLlxuICogUE9TVHMgdG8gL2FwaS9zZXR1cC9jcmVhdGUtbWFzdGVyLWN2LCB0aGVuIG5hdmlnYXRlcyB0byBhIG5ldyBzZXNzaW9uLlxuICovXG5hc3luYyBmdW5jdGlvbiBvbmJvYXJkaW5nQ3JlYXRlRW1wdHlQcm9maWxlKCkge1xuICBjb25zdCBidG4gICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvbmJvYXJkaW5nLWNyZWF0ZS1idG4nKTtcbiAgY29uc3Qgc3RhdHVzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb25ib2FyZGluZy1tb2RhbC1zdGF0dXMnKTtcbiAgaWYgKGJ0bikgYnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgaWYgKHN0YXR1c0VsKSBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICdDcmVhdGluZyBwcm9maWxlXHUyMDI2JztcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvc2V0dXAvY3JlYXRlLW1hc3Rlci1jdicsIHsgbWV0aG9kOiAnUE9TVCcgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSk7XG4gICAgaWYgKCFyZXMub2spIHtcbiAgICAgIGNvbnN0IG1zZyA9IGRhdGEuZXJyb3IgPT09ICdhbHJlYWR5X2V4aXN0cydcbiAgICAgICAgPyAnRmlsZSBhbHJlYWR5IGV4aXN0cyBcdTIwMTQgcGxlYXNlIHJlbG9hZCB0aGUgcGFnZS4nXG4gICAgICAgIDogKGRhdGEuZXJyb3IgfHwgYFNlcnZlciBlcnJvciAke3Jlcy5zdGF0dXN9YCk7XG4gICAgICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gbXNnO1xuICAgICAgaWYgKGJ0bikgYnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEZpbGUgY3JlYXRlZCBcdTIwMTQgbm93IG5hdmlnYXRlIHRvIGEgbmV3IHNlc3Npb25cbiAgICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJ1Byb2ZpbGUgY3JlYXRlZCEgU3RhcnRpbmcgc2Vzc2lvblx1MjAyNic7XG4gICAgYXdhaXQgY3JlYXRlTmV3U2Vzc2lvbkFuZE5hdmlnYXRlKCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSBgRXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YDtcbiAgICBpZiAoYnRuKSBidG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNlc3Npb24gY3JlYXRpb25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVOZXdTZXNzaW9uQW5kTmF2aWdhdGUoKSB7XG4gIGNvbnN0IGRhdGEgPSBhd2FpdCBjcmVhdGVTZXNzaW9uKCk7XG4gIGlmIChkYXRhLmVycm9yID09PSAnbWFzdGVyX2N2X21pc3NpbmcnKSB7XG4gICAgc2hvd09uYm9hcmRpbmdNb2RhbChkYXRhLm1hc3Rlcl9jdl9wYXRoIHx8ICcnKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCFkYXRhLnNlc3Npb25faWQpIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGNyZWF0ZSBzZXNzaW9uJyk7XG4gIC8vIENsZWFyIGFueSBzdGFsZSBzZXNzaW9uIHBhdGggXHUyMDE0IHRoZSBuZXcgc2Vzc2lvbiBoYXMgbm8gc2F2ZWQgZmlsZSB5ZXQuXG4gIC8vIElmIFNFU1NJT05fUEFUSCB3ZXJlIGxlZnQgcG9pbnRpbmcgYXQgYSBwcmV2aW91cyBzZXNzaW9uJ3MgZmlsZSwgdGhlXG4gIC8vIGRpc2stcmVzdG9yZSBndWFyZCBpbiByZXN0b3JlQmFja2VuZFN0YXRlIGNvdWxkIGxvYWQgdGhlIHdyb25nIHNlc3Npb25cbiAgLy8gb24gdGhlIG5leHQgdmlzaXQgb25jZSBTRVNTSU9OX0lEIGlzIHVwZGF0ZWQgYnkgdGhlIGJlZm9yZXVubG9hZCBoYW5kbGVyLlxuICB0cnkgeyBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnY3YtYnVpbGRlci1zZXNzaW9uLXBhdGgnKTsgfSBjYXRjaCAoXykge31cbiAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihkYXRhLnJlZGlyZWN0X3VybCB8fCBgLz9zZXNzaW9uPSR7ZGF0YS5zZXNzaW9uX2lkfWApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVOZXdTZXNzaW9uSW5OZXdUYWIoKSB7XG4gIGNvbnN0IGRhdGEgPSBhd2FpdCBjcmVhdGVTZXNzaW9uKCk7XG4gIGlmIChkYXRhLmVycm9yID09PSAnbWFzdGVyX2N2X21pc3NpbmcnKSB7XG4gICAgc2hvd09uYm9hcmRpbmdNb2RhbChkYXRhLm1hc3Rlcl9jdl9wYXRoIHx8ICcnKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCFkYXRhLnNlc3Npb25faWQpIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGNyZWF0ZSBzZXNzaW9uJyk7XG4gIHdpbmRvdy5vcGVuKGRhdGEucmVkaXJlY3RfdXJsIHx8IGAvP3Nlc3Npb249JHtkYXRhLnNlc3Npb25faWR9YCwgJ19ibGFuaycsICdub29wZW5lcicpO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNlc3Npb24gY2xhaW0gLyBvd25lcnNoaXBcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5hc3luYyBmdW5jdGlvbiBfY2xhaW1DdXJyZW50U2Vzc2lvbihzZXNzaW9uSWRUb0NsYWltKSB7XG4gIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3Nlc3Npb25zL2NsYWltJywge1xuICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIHNlc3Npb25faWQ6IHNlc3Npb25JZFRvQ2xhaW0sXG4gICAgICBvd25lcl90b2tlbjogZ2V0T3duZXJUb2tlbigpLFxuICAgIH0pLFxuICB9KTtcblxuICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKTtcbiAgaWYgKHJlcy5vayAmJiBkYXRhLm9rICE9PSBmYWxzZSkgcmV0dXJuIHRydWU7XG5cbiAgaWYgKHJlcy5zdGF0dXMgPT09IDQwOSAmJiBkYXRhLmVycm9yID09PSAnc2Vzc2lvbl9vd25lZCcpIHtcbiAgICBjb25zdCBhY3Rpb24gPSBhd2FpdCBzaG93T3duZXJzaGlwQ29uZmxpY3REaWFsb2coXG4gICAgICAnVGhpcyBzZXNzaW9uIGlzIGN1cnJlbnRseSBjbGFpbWVkIGJ5IGFub3RoZXIgYnJvd3NlciB0YWIuIFlvdSBjYW4gdGFrZSBpdCBvdmVyLCBzdGFydCBhIG5ldyBzZXNzaW9uLCBvciBsb2FkIGEgZGlmZmVyZW50IG9uZS4nXG4gICAgKTtcbiAgICBpZiAoYWN0aW9uID09PSAnbmV3Jykge1xuICAgICAgYXdhaXQgY3JlYXRlTmV3U2Vzc2lvbkFuZE5hdmlnYXRlKCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChhY3Rpb24gIT09ICd0YWtlb3ZlcicpIHtcbiAgICAgIHNob3dTZXNzaW9uc0xhbmRpbmdQYW5lbCgnU2VsZWN0IGEgZGlmZmVyZW50IHNlc3Npb24gb3IgY3JlYXRlIGEgbmV3IG9uZS4nKTtcbiAgICAgIG9wZW5TZXNzaW9uc01vZGFsKHsgcmVxdWlyZWQ6IHRydWUgfSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgdGFrZW92ZXJSZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9zZXNzaW9ucy90YWtlb3ZlcicsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIHNlc3Npb25faWQ6IHNlc3Npb25JZFRvQ2xhaW0sXG4gICAgICAgIG93bmVyX3Rva2VuOiBnZXRPd25lclRva2VuKCksXG4gICAgICB9KSxcbiAgICB9KTtcbiAgICBjb25zdCB0YWtlb3ZlckRhdGEgPSBhd2FpdCB0YWtlb3ZlclJlcy5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSk7XG4gICAgaWYgKCF0YWtlb3ZlclJlcy5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHRha2VvdmVyRGF0YS5lcnJvciB8fCAnRmFpbGVkIHRvIHRha2Ugb3ZlciBzZXNzaW9uJyk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHJlcy5zdGF0dXMgPT09IDQwNCB8fCBkYXRhLmVycm9yID09PSAnc2Vzc2lvbl9ub3RfZm91bmQnKSB7XG4gICAgc2hvd1Nlc3Npb25zTGFuZGluZ1BhbmVsKCdUaGF0IHNlc3Npb24gaXMgbm8gbG9uZ2VyIGFjdGl2ZS4gTG9hZCBpdCBmcm9tIGRpc2sgb3IgY3JlYXRlIGEgbmV3IG9uZS4nKTtcbiAgICBvcGVuU2Vzc2lvbnNNb2RhbCh7IHJlcXVpcmVkOiB0cnVlIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihkYXRhLmVycm9yIHx8IGBGYWlsZWQgdG8gY2xhaW0gc2Vzc2lvbiAoJHtyZXMuc3RhdHVzfSlgKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTZXNzaW9uIG5hdmlnYXRpb24gZnJvbSBsYW5kaW5nIHBhZ2Vcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiBzaG93U2Vzc2lvbnNMYW5kaW5nUGFuZWwobWVzc2FnZSA9ICcnKSB7XG4gIHN0YXRlTWFuYWdlci5zZXRDdXJyZW50VGFiKCdqb2InKTtcbiAgc3RhdGVNYW5hZ2VyLnNldFBoYXNlKFBIQVNFUy5JTklUKTtcbiAgdXBkYXRlQWN0aW9uQnV0dG9ucygnam9iJyk7XG4gIHVwZGF0ZVBvc2l0aW9uVGl0bGUoe30pO1xuXG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9jdW1lbnQtY29udGVudCcpO1xuICBpZiAoIWNvbnRlbnQpIHJldHVybjtcblxuICBjb250ZW50LmlubmVySFRNTCA9IGBcbiAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1sYW5kaW5nLXNoZWxsXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1sYW5kaW5nLWhlYWRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1sYW5kaW5nLWNvcHlcIj5cbiAgICAgICAgICA8aDI+U2VsZWN0IGEgU2Vzc2lvbjwvaDI+XG4gICAgICAgICAgPHA+RWFjaCBicm93c2VyIHRhYiBub3cgd29ya3MgYWdhaW5zdCBpdHMgb3duIFVSTC1zY29wZWQgc2Vzc2lvbi48L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1sYW5kaW5nLWFjdGlvbnNcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0blwiIG9uY2xpY2s9XCJjcmVhdGVOZXdTZXNzaW9uSW5OZXdUYWIoKVwiPlx1RkYwQiBOZXcgU2Vzc2lvbiBpbiBOZXcgVGFiPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICAke21lc3NhZ2UgPyBgPHAgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjIwcHg7Y29sb3I6I2I0NTMwOTtmb250LXdlaWdodDo2MDA7XCI+JHtlc2NhcGVIdG1sKG1lc3NhZ2UpfTwvcD5gIDogJyd9XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDoxMnB4O21hcmdpbi1ib3R0b206MjRweDtmbGV4LXdyYXA6d3JhcDtcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG4gcHJpbWFyeVwiIG9uY2xpY2s9XCJjcmVhdGVOZXdTZXNzaW9uQW5kTmF2aWdhdGUoKVwiPisgTmV3IFNlc3Npb248L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgO1xufVxuXG5mdW5jdGlvbiBfcmVzdG9yZVRhYkZvclBoYXNlKHNlc3Npb25QaGFzZSkge1xuICBjb25zdCBwaGFzZVRhYk1hcCA9IHtcbiAgICBbUEhBU0VTLklOSVRdOiAgICAgICAgICAgICAnam9iJyxcbiAgICBbUEhBU0VTLkpPQl9BTkFMWVNJU106ICAgICAnYW5hbHlzaXMnLFxuICAgIFtQSEFTRVMuQ1VTVE9NSVpBVElPTl06ICAgICdleHAtcmV2aWV3JyxcbiAgICBbUEhBU0VTLlJFV1JJVEVfUkVWSUVXXTogICAncmV3cml0ZScsXG4gICAgW1BIQVNFUy5TUEVMTF9DSEVDS106ICAgICAgJ3NwZWxsJyxcbiAgICBbUEhBU0VTLkdFTkVSQVRJT05dOiAgICAgICAnbGF5b3V0JyxcbiAgICBbUEhBU0VTLkxBWU9VVF9SRVZJRVddOiAgICAnbGF5b3V0JyxcbiAgICBbUEhBU0VTLkZJTkFMX0dFTkVSQVRJT05dOiAnZmluYWxfZ2VuZXJhdGUnLFxuICAgIFtQSEFTRVMuUkVGSU5FTUVOVF06ICAgICAgICdkb3dubG9hZCcsXG4gIH07XG4gIGNvbnN0IHRhcmdldFRhYiA9IHBoYXNlVGFiTWFwW3Nlc3Npb25QaGFzZV0gfHwgJ2pvYic7XG5cbiAgaWYgKHR5cGVvZiBzd2l0Y2hUYWIgPT09ICdmdW5jdGlvbicpIHtcbiAgICBzd2l0Y2hUYWIodGFyZ2V0VGFiKTtcbiAgfSBlbHNlIHtcbiAgICBzdGF0ZU1hbmFnZXIuc2V0Q3VycmVudFRhYih0YXJnZXRUYWIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9yZXNvbHZlUmVzdG9yZWRQaGFzZShzdGF0dXNEYXRhKSB7XG4gIGNvbnN0IHBoYXNlID0gc3RhdHVzRGF0YT8ucGhhc2UgfHwgUEhBU0VTLklOSVQ7XG5cbiAgLy8gR3VhcmQ6IG5vIGpvYl9hbmFseXNpcyBtZWFucyB3ZSBjYW5ub3QgYmUgcGFzdCB0aGUgaW5pdGlhbCBpbnB1dCBzdGVwLlxuICBpZiAoIXN0YXR1c0RhdGE/LmpvYl9hbmFseXNpcykge1xuICAgIHJldHVybiBQSEFTRVMuSU5JVDtcbiAgfVxuXG4gIC8vIEd1YXJkOiBwaGFzZSBjbGFpbXMgY3VzdG9taXphdGlvbnMgd2VyZSByZXZpZXdlZCwgYnV0IHRoZXkgd2VyZSBuZXZlclxuICAvLyBnZW5lcmF0ZWQgKGUuZy4gYmFja2VuZCByZXN0YXJ0ZWQgYWZ0ZXIgYW5hbHl6ZV9qb2IgYnV0IGJlZm9yZVxuICAvLyByZWNvbW1lbmRfY3VzdG9taXphdGlvbnMgcmFuLCBvciBsZWdhY3kgc2Vzc2lvbnMgc2F2ZWQgd2l0aCB0aGUgb2xkXG4gIC8vIHByZW1hdHVyZS1DVVNUT01JWkFUSU9OIGJ1ZykuIEZhbGwgYmFjayBzbyB0aGUgdXNlciBzZWVzIHRoZSBBbmFseXNpc1xuICAvLyBzdGVwIGFuZCBjYW4gcnVuIFJlY29tbWVuZCBDdXN0b21pemF0aW9ucyBmcm9tIHRoZXJlLlxuICBpZiAoXG4gICAgKHBoYXNlID09PSBQSEFTRVMuQ1VTVE9NSVpBVElPTiB8fCBwaGFzZSA9PT0gUEhBU0VTLlJFV1JJVEVfUkVWSUVXKVxuICAgICYmICFzdGF0dXNEYXRhPy5jdXN0b21pemF0aW9uc1xuICApIHtcbiAgICByZXR1cm4gUEhBU0VTLkpPQl9BTkFMWVNJUztcbiAgfVxuXG4gIHJldHVybiBwaGFzZTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTZXNzaW9uIGNvbnRleHQgLyByZXN0b3JlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuYXN5bmMgZnVuY3Rpb24gZW5zdXJlU2Vzc2lvbkNvbnRleHQoKSB7XG4gIGNvbnN0IHVybFNlc3Npb25JZCA9IGdldFNlc3Npb25JZEZyb21VUkwoKTtcbiAgaWYgKCF1cmxTZXNzaW9uSWQpIHtcbiAgICBzaG93U2Vzc2lvbnNMYW5kaW5nUGFuZWwoKTtcbiAgICBvcGVuU2Vzc2lvbnNNb2RhbCh7IHJlcXVpcmVkOiB0cnVlIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHN0YXRlTWFuYWdlci5zZXRTZXNzaW9uSWQodXJsU2Vzc2lvbklkKTtcbiAgcmV0dXJuIF9jbGFpbUN1cnJlbnRTZXNzaW9uKHVybFNlc3Npb25JZCk7XG59XG5cbmZ1bmN0aW9uIF9hcHBlbmRSZXN0b3JlZERlY2lzaW9uc1N1bW1hcnkoKSB7XG4gIGNvbnN0IHBoYXNlID0gc3RhdGVNYW5hZ2VyLmdldFBoYXNlKCk7XG4gIGNvbnN0IGN1c3RvbWl6YXRpb25zID0gc3RhdGVNYW5hZ2VyLmdldFRhYkRhdGEoJ2N1c3RvbWl6YXRpb25zJykgfHwgd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnM7XG4gIGNvbnN0IHBhcnRzID0gW107XG5cbiAgaWYgKGN1c3RvbWl6YXRpb25zKSB7XG4gICAgY29uc3QgZXhwQ291bnQgPSAoY3VzdG9taXphdGlvbnMucmVjb21tZW5kZWRfZXhwZXJpZW5jZXMgfHwgW10pLmxlbmd0aDtcbiAgICBpZiAoZXhwQ291bnQgPiAwKSBwYXJ0cy5wdXNoKGAke2V4cENvdW50fSBleHBlcmllbmNlJHtleHBDb3VudCAhPT0gMSA/ICdzJyA6ICcnfSByZWNvbW1lbmRlZGApO1xuICAgIGNvbnN0IHNraWxsQ291bnQgPSAoY3VzdG9taXphdGlvbnMucmVjb21tZW5kZWRfc2tpbGxzIHx8IFtdKS5sZW5ndGg7XG4gICAgaWYgKHNraWxsQ291bnQgPiAwKSBwYXJ0cy5wdXNoKGAke3NraWxsQ291bnR9IHNraWxsJHtza2lsbENvdW50ICE9PSAxID8gJ3MnIDogJyd9IHJlY29tbWVuZGVkYCk7XG4gIH1cblxuICBjb25zdCBkZWNpc2lvbnMgPSB3aW5kb3cuX3NhdmVkRGVjaXNpb25zIHx8IHt9O1xuICBjb25zdCBhcHByb3ZlZFJld3JpdGVzID0gQXJyYXkuaXNBcnJheSh3aW5kb3cuYXBwcm92ZWRSZXdyaXRlcykgPyB3aW5kb3cuYXBwcm92ZWRSZXdyaXRlcy5sZW5ndGhcbiAgICA6IE9iamVjdC5rZXlzKGRlY2lzaW9ucy5leHBlcmllbmNlX2RlY2lzaW9ucyB8fCB7fSkubGVuZ3RoO1xuICBpZiAoYXBwcm92ZWRSZXdyaXRlcyA+IDApIHBhcnRzLnB1c2goYCR7YXBwcm92ZWRSZXdyaXRlc30gcmV3cml0ZSR7YXBwcm92ZWRSZXdyaXRlcyAhPT0gMSA/ICdzJyA6ICcnfSBhcHByb3ZlZGApO1xuXG4gIGNvbnN0IGF0cyA9IHN0YXRlTWFuYWdlci5nZXRBdHNTY29yZSgpO1xuICBpZiAoYXRzICYmIHR5cGVvZiBhdHMub3ZlcmFsbCA9PT0gJ251bWJlcicpIHtcbiAgICBwYXJ0cy5wdXNoKGBBVFMgc2NvcmUgJHtNYXRoLnJvdW5kKGF0cy5vdmVyYWxsKX0lYCk7XG4gIH1cblxuICBpZiAocGFydHMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IHBoYXNlTGFiZWwgPSBTRVNTSU9OX1BIQVNFX0xBQkVMU19TSE9SVFtwaGFzZV0gfHwgU3RyaW5nKHBoYXNlKS5yZXBsYWNlKC9fL2csICcgJyk7XG4gICAgY29uc3QgcG9zaXRpb25DdHggPSB3aW5kb3cuX3Jlc3RvcmVkUG9zaXRpb25OYW1lID8gYCBmb3IgJHt3aW5kb3cuX3Jlc3RvcmVkUG9zaXRpb25OYW1lfWAgOiAnJztcbiAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCBgXHVEODNEXHVEQ0NCIFJlc3RvcmVkJHtwb3NpdGlvbkN0eH0gYXQgc3RhZ2U6ICR7cGhhc2VMYWJlbH0gXHUyMDE0ICR7cGFydHMuam9pbignLCAnKX0uYCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVzdG9yZVNlc3Npb24oKSB7XG4gIHRyeSB7XG4gICAgc3RhdGVNYW5hZ2VyLnNldElzUmVjb25uZWN0aW5nKHRydWUpO1xuXG4gICAgY29uc3Qgc3RvcmVkU2Vzc2lvbklkID0gZ2V0U2Vzc2lvbklkRnJvbVVSTCgpIHx8IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFN0b3JhZ2VLZXlzLlNFU1NJT05fSUQpO1xuICAgIGlmICghc3RvcmVkU2Vzc2lvbklkKSB7XG4gICAgICBzdGF0ZU1hbmFnZXIuc2V0SXNSZWNvbm5lY3RpbmcoZmFsc2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzdGF0ZU1hbmFnZXIuc2V0U2Vzc2lvbklkKHN0b3JlZFNlc3Npb25JZCk7XG5cbiAgICAvLyBUcnkgdG8gcmVzdG9yZSBjb252ZXJzYXRpb24gaGlzdG9yeSBmcm9tIGJhY2tlbmRcbiAgICBjb25zdCBoaXN0b3J5UmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvaGlzdG9yeScpO1xuICAgIGlmIChoaXN0b3J5UmVzLm9rKSB7XG4gICAgICBjb25zdCBoaXN0b3J5RGF0YSA9IGF3YWl0IGhpc3RvcnlSZXMuanNvbigpO1xuXG4gICAgICAvLyBBbHdheXMgY2xlYXIgcGxhY2Vob2xkZXIgSFRNTCBjb250ZW50IG5vdyB0aGF0IHdlIGhhdmUgYSBsaXZlIHNlc3Npb24gcmVzcG9uc2UuXG4gICAgICBjb25zdCBjb252ZXJzYXRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udmVyc2F0aW9uJyk7XG4gICAgICBjb252ZXJzYXRpb24uaW5uZXJIVE1MID0gJyc7XG5cbiAgICAgIC8vIEFsd2F5cyByZXN0b3JlIGZyb20gdGhlIHNlcnZlciBzZXNzaW9uIGZpbGUgKGF1dGhvcml0YXRpdmUgaGlzdG9yeSBzb3VyY2UpLlxuICAgICAgaWYgKGhpc3RvcnlEYXRhLmhpc3RvcnkgJiYgaGlzdG9yeURhdGEuaGlzdG9yeS5sZW5ndGggPiAwKSB7XG5cbiAgICAgICAgaGlzdG9yeURhdGEuaGlzdG9yeS5mb3JFYWNoKG1zZyA9PiB7XG4gICAgICAgICAgaWYgKG1zZy5yb2xlID09PSAndXNlcicpIHtcbiAgICAgICAgICAgIGFwcGVuZE1lc3NhZ2UoJ3VzZXInLCBtc2cuY29udGVudCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChtc2cucm9sZSA9PT0gJ2Fzc2lzdGFudCcpIHtcbiAgICAgICAgICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIG1zZy5jb250ZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsICdcdUQ4M0RcdUREMDQgU2Vzc2lvbiByZXN0b3JlZCBmcm9tIHNlcnZlci4nKTtcbiAgICAgICAgbG9nLmluZm8oYFJlc3RvcmVkICR7aGlzdG9yeURhdGEuaGlzdG9yeS5sZW5ndGh9IG1lc3NhZ2VzIGZyb20gYmFja2VuZGApO1xuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgcGhhc2VcbiAgICAgIGlmIChoaXN0b3J5RGF0YS5waGFzZSkge1xuICAgICAgICBzdGF0ZU1hbmFnZXIuc2V0UGhhc2UoaGlzdG9yeURhdGEucGhhc2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRyeSB0byByZXN0b3JlIGJhY2tlbmQgc3RhdGUuXG4gICAgLy8gUmV0dXJucyB0cnVlIHdoZW4gc2VydmVyIGhhZCBsaXZlIHNlc3Npb24gZGF0YSAoaW4gbWVtb3J5IG9yIGxvYWRlZCBmcm9tIGRpc2spLlxuICAgIGNvbnN0IHNlcnZlckhhc0RhdGEgPSBhd2FpdCByZXN0b3JlQmFja2VuZFN0YXRlKCk7XG5cbiAgICAvLyBSZXN0b3JlIFVJLW9ubHkgcHJlZnMgKGFjdGl2ZVJldmlld1BhbmUpIGZyb20gbG9jYWxTdG9yYWdlLlxuICAgIHJlc3RvcmVUYWJEYXRhKHsgdWlQcmVmc09ubHk6IHNlcnZlckhhc0RhdGEgfSk7XG5cbiAgICAvLyBTaG93IGEgcmVzdG9yZWQtZGVjaXNpb25zIHN1bW1hcnkgd2hlbiB0aGUgYmFja2VuZCBoYWQgbGl2ZSBzZXNzaW9uIGRhdGEuXG4gICAgaWYgKHNlcnZlckhhc0RhdGEpIHtcbiAgICAgIF9hcHBlbmRSZXN0b3JlZERlY2lzaW9uc1N1bW1hcnkoKTtcbiAgICB9XG5cbiAgICBzdGF0ZU1hbmFnZXIuc2V0SXNSZWNvbm5lY3RpbmcoZmFsc2UpO1xuXG4gICAgLy8gUnVuIGEgYmFja2dyb3VuZCBoZWFsdGggY2hlY2sgc28gdGhlIHN0YXR1cyBwaWxsIHJlZmxlY3RzIGxpdmUgY29ubmVjdGl2aXR5LlxuICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcy50ZXN0Q3VycmVudE1vZGVsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBnbG9iYWxUaGlzLnRlc3RDdXJyZW50TW9kZWwoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgfVxuXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nLndhcm4oJ1Nlc3Npb24gcmVzdG9yYXRpb24gZmFpbGVkOicsIGVycm9yKTtcbiAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCBgXHUyNkEwXHVGRTBGIENvdWxkIG5vdCByZXN0b3JlIHByZXZpb3VzIHNlc3Npb24uIFN0YXJ0aW5nIGZyZXNoLiAoJHtlcnJvci5tZXNzYWdlfSlgKTtcbiAgICBzdGF0ZU1hbmFnZXIuc2V0SXNSZWNvbm5lY3RpbmcoZmFsc2UpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9oeWRyYXRlU3RhdHVzRGVyaXZlZFN0YXRlKHN0YXR1c0RhdGEpIHtcbiAgd2luZG93LmFjaGlldmVtZW50RWRpdHMgPSB7fTtcbiAgdHJ5IHtcbiAgICBpZiAoc3RhdHVzRGF0YS5hY2hpZXZlbWVudF9lZGl0cyAmJiBPYmplY3Qua2V5cyhzdGF0dXNEYXRhLmFjaGlldmVtZW50X2VkaXRzKS5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhzdGF0dXNEYXRhLmFjaGlldmVtZW50X2VkaXRzKSkge1xuICAgICAgICBjb25zdCBpZHggPSBwYXJzZUludChrLCAxMCk7XG4gICAgICAgIGNvbnN0IHJhd0l0ZW1zID0gQXJyYXkuaXNBcnJheSh2KSA/IHYgOiBbdl07XG4gICAgICAgIHdpbmRvdy5hY2hpZXZlbWVudEVkaXRzW2lkeF0gPSByYXdJdGVtcy5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgaWYgKGl0ZW0gJiYgdHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGl0ZW0pKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICB0ZXh0OiBTdHJpbmcoaXRlbS50ZXh0ID8/IGl0ZW0uZGVzY3JpcHRpb24gPz8gaXRlbS5jb250ZW50ID8/ICcnKSxcbiAgICAgICAgICAgICAgaGlkZGVuOiBCb29sZWFuKGl0ZW0uaGlkZGVuKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0ZXh0OiBTdHJpbmcoaXRlbSA/PyAnJyksXG4gICAgICAgICAgICBoaWRkZW46IGZhbHNlLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoX2UpIHsgLyogbm9uLWZhdGFsICovIH1cblxuICB3aW5kb3cuX3NhdmVkRGVjaXNpb25zID0ge1xuICAgIGV4cGVyaWVuY2VfZGVjaXNpb25zOiBzdGF0dXNEYXRhLmV4cGVyaWVuY2VfZGVjaXNpb25zIHx8IHt9LFxuICAgIHNraWxsX2RlY2lzaW9uczogICAgICBzdGF0dXNEYXRhLnNraWxsX2RlY2lzaW9ucyAgICAgIHx8IHt9LFxuICAgIGFjaGlldmVtZW50X2RlY2lzaW9uczpzdGF0dXNEYXRhLmFjaGlldmVtZW50X2RlY2lzaW9ucyB8fCB7fSxcbiAgICBwdWJsaWNhdGlvbl9kZWNpc2lvbnM6c3RhdHVzRGF0YS5wdWJsaWNhdGlvbl9kZWNpc2lvbnMgfHwge30sXG4gICAgc3VtbWFyeV9mb2N1c19vdmVycmlkZTogc3RhdHVzRGF0YS5zdW1tYXJ5X2ZvY3VzX292ZXJyaWRlIHx8IG51bGwsXG4gICAgZXh0cmFfc2tpbGxzOiAgICAgICAgICAgc3RhdHVzRGF0YS5leHRyYV9za2lsbHMgfHwgW10sXG4gICAgZXh0cmFfc2tpbGxfbWF0Y2hlczogICAgc3RhdHVzRGF0YS5leHRyYV9za2lsbF9tYXRjaGVzIHx8IHt9LFxuICB9O1xuICB3aW5kb3cuX2FsbEV4cGVyaWVuY2VzID0gc3RhdHVzRGF0YS5hbGxfZXhwZXJpZW5jZXMgfHwgW107XG4gIHdpbmRvdy5zZWxlY3RlZFN1bW1hcnlLZXkgPSBzdGF0dXNEYXRhLnN1bW1hcnlfZm9jdXNfb3ZlcnJpZGUgfHwgc3RhdHVzRGF0YS5zZWxlY3RlZF9zdW1tYXJ5X2tleSB8fCBudWxsO1xuICB3aW5kb3cuX25ld1NraWxsc0Zyb21MTE0gPSBzdGF0dXNEYXRhLm5ld19za2lsbHNfZnJvbV9sbG0gfHwgW107XG4gIHdpbmRvdy5fc3RhdHVzSW50YWtlID0gc3RhdHVzRGF0YS5pbnRha2UgJiYgdHlwZW9mIHN0YXR1c0RhdGEuaW50YWtlID09PSAnb2JqZWN0J1xuICAgID8gc3RhdHVzRGF0YS5pbnRha2VcbiAgICA6IHt9O1xuICB3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zID0gQXJyYXkuaXNBcnJheShzdGF0dXNEYXRhLnBvc3RfYW5hbHlzaXNfcXVlc3Rpb25zKVxuICAgID8gc3RhdHVzRGF0YS5wb3N0X2FuYWx5c2lzX3F1ZXN0aW9uc1xuICAgIDogW107XG4gIHdpbmRvdy5xdWVzdGlvbkFuc3dlcnMgPSAoc3RhdHVzRGF0YS5wb3N0X2FuYWx5c2lzX2Fuc3dlcnMgJiYgdHlwZW9mIHN0YXR1c0RhdGEucG9zdF9hbmFseXNpc19hbnN3ZXJzID09PSAnb2JqZWN0JylcbiAgICA/IHN0YXR1c0RhdGEucG9zdF9hbmFseXNpc19hbnN3ZXJzXG4gICAgOiB7fTtcbiAgd2luZG93Ll9yZXN0b3JlZFBvc2l0aW9uTmFtZSA9IHN0YXR1c0RhdGEucG9zaXRpb25fbmFtZSB8fCBudWxsO1xufVxuXG5mdW5jdGlvbiBfaHlkcmF0ZVN0YXR1c1RhYlN0YXRlKHN0YXR1c0RhdGEpIHtcbiAgY29uc3QgaGFzQW5hbHlzaXMgPSBzdGF0dXNEYXRhLmpvYl9hbmFseXNpcyAhPT0gdW5kZWZpbmVkICYmIHN0YXR1c0RhdGEuam9iX2FuYWx5c2lzICE9PSBudWxsO1xuICBjb25zdCBoYXNDdXN0b21pemF0aW9ucyA9IHN0YXR1c0RhdGEuY3VzdG9taXphdGlvbnMgIT09IHVuZGVmaW5lZCAmJiBzdGF0dXNEYXRhLmN1c3RvbWl6YXRpb25zICE9PSBudWxsO1xuICBjb25zdCBoYXNHZW5lcmF0ZWRGaWxlcyA9IHN0YXR1c0RhdGEuZ2VuZXJhdGVkX2ZpbGVzICE9PSB1bmRlZmluZWQgJiYgc3RhdHVzRGF0YS5nZW5lcmF0ZWRfZmlsZXMgIT09IG51bGw7XG5cbiAgc3RhdGVNYW5hZ2VyLnNldFRhYkRhdGEoJ2FuYWx5c2lzJywgaGFzQW5hbHlzaXMgPyBzdGF0dXNEYXRhLmpvYl9hbmFseXNpcyA6IG51bGwpO1xuICBzdGF0ZU1hbmFnZXIuc2V0VGFiRGF0YSgnY3VzdG9taXphdGlvbnMnLCBoYXNDdXN0b21pemF0aW9ucyA/IHN0YXR1c0RhdGEuY3VzdG9taXphdGlvbnMgOiBudWxsKTtcbiAgc3RhdGVNYW5hZ2VyLnNldFRhYkRhdGEoJ2N2JywgaGFzR2VuZXJhdGVkRmlsZXMgPyBzdGF0dXNEYXRhLmdlbmVyYXRlZF9maWxlcyA6IG51bGwpO1xuICB3aW5kb3cucGVuZGluZ1JlY29tbWVuZGF0aW9ucyA9IGhhc0N1c3RvbWl6YXRpb25zID8gc3RhdHVzRGF0YS5jdXN0b21pemF0aW9ucyA6IG51bGw7XG5cbiAgaWYgKGhhc0FuYWx5c2lzKSB7XG4gICAgcmVmcmVzaEF0c1Njb3JlKCdhbmFseXNpcycpO1xuICB9XG5cbiAgcmV0dXJuIGhhc0FuYWx5c2lzIHx8IGhhc0N1c3RvbWl6YXRpb25zIHx8IGhhc0dlbmVyYXRlZEZpbGVzO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXN0b3JlQmFja2VuZFN0YXRlKCkge1xuICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIHNlcnZlciBoYWQgYW55IGxpdmUgc2Vzc2lvbiBkYXRhLlxuICB0cnkge1xuICAgIGNvbnN0IHN0YXR1c1JlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3N0YXR1cycpO1xuICAgIGlmICghc3RhdHVzUmVzLm9rKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3Qgc3RhdHVzRGF0YSA9IHBhcnNlU3RhdHVzUmVzcG9uc2UoYXdhaXQgc3RhdHVzUmVzLmpzb24oKSk7XG5cbiAgICBpZiAodHlwZW9mIHVwZGF0ZUF1dGhCYWRnZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdXBkYXRlQXV0aEJhZGdlKHN0YXR1c0RhdGEuY29waWxvdF9hdXRoIHx8IHt9LCBzdGF0dXNEYXRhLmxsbV9wcm92aWRlciB8fCBudWxsKTtcbiAgICB9XG5cbiAgICBfaHlkcmF0ZVN0YXR1c0Rlcml2ZWRTdGF0ZShzdGF0dXNEYXRhKTtcblxuICAgIGxldCBzZXJ2ZXJIYXNEYXRhID0gX2h5ZHJhdGVTdGF0dXNUYWJTdGF0ZShzdGF0dXNEYXRhKTtcblxuICAgIGlmIChzdGF0dXNEYXRhLmpvYl9hbmFseXNpcyAhPT0gdW5kZWZpbmVkICYmIHN0YXR1c0RhdGEuam9iX2FuYWx5c2lzICE9PSBudWxsKSB7XG4gICAgICBsb2cuaW5mbygnUmVzdG9yZWQgYW5hbHlzaXMgZGF0YSBmcm9tIGJhY2tlbmQgbWVtb3J5Jyk7XG4gICAgfVxuICAgIGlmIChzdGF0dXNEYXRhLmN1c3RvbWl6YXRpb25zICE9PSB1bmRlZmluZWQgJiYgc3RhdHVzRGF0YS5jdXN0b21pemF0aW9ucyAhPT0gbnVsbCkge1xuICAgICAgbG9nLmluZm8oJ1Jlc3RvcmVkIGN1c3RvbWl6YXRpb25zIGRhdGEgZnJvbSBiYWNrZW5kIG1lbW9yeScpO1xuICAgIH1cbiAgICBpZiAoc3RhdHVzRGF0YS5nZW5lcmF0ZWRfZmlsZXMgIT09IHVuZGVmaW5lZCAmJiBzdGF0dXNEYXRhLmdlbmVyYXRlZF9maWxlcyAhPT0gbnVsbCkge1xuICAgICAgbG9nLmluZm8oJ1Jlc3RvcmVkIENWIGRhdGEgZnJvbSBiYWNrZW5kIG1lbW9yeScpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBnZW5lcmF0aW9uUmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvY3YvZ2VuZXJhdGlvbi1zdGF0ZScpO1xuICAgICAgaWYgKGdlbmVyYXRpb25SZXMub2spIHtcbiAgICAgICAgY29uc3QgZ2VuZXJhdGlvbkRhdGEgPSBhd2FpdCBnZW5lcmF0aW9uUmVzLmpzb24oKTtcbiAgICAgICAgaWYgKGdlbmVyYXRpb25EYXRhPy5vaykge1xuICAgICAgICAgIGNvbnN0IGhhc0NhY2hlZEF0c1Njb3JlID0gQm9vbGVhbihnZW5lcmF0aW9uRGF0YS5hdHNfc2NvcmUpO1xuICAgICAgICAgIGNvbnN0IGhhc1BlcnNpc3RlZEdlbmVyYXRpb25EYXRhID0gQm9vbGVhbihcbiAgICAgICAgICAgIGdlbmVyYXRpb25EYXRhLnByZXZpZXdfYXZhaWxhYmxlXG4gICAgICAgICAgICAgIHx8IGdlbmVyYXRpb25EYXRhLmZpbmFsX2dlbmVyYXRlZF9hdFxuICAgICAgICAgICAgICB8fCBoYXNDYWNoZWRBdHNTY29yZVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBzdGF0ZU1hbmFnZXIuc2V0R2VuZXJhdGlvblN0YXRlKHtcbiAgICAgICAgICAgIHBoYXNlOiBnZW5lcmF0aW9uRGF0YS5waGFzZSB8fCAnaWRsZScsXG4gICAgICAgICAgICBwcmV2aWV3QXZhaWxhYmxlOiBCb29sZWFuKGdlbmVyYXRpb25EYXRhLnByZXZpZXdfYXZhaWxhYmxlKSxcbiAgICAgICAgICAgIHByZXZpZXdPdXRwdXRzOiBnZW5lcmF0aW9uRGF0YS5wcmV2aWV3X291dHB1dHMgfHwgbnVsbCxcbiAgICAgICAgICAgIGxheW91dENvbmZpcm1lZDogQm9vbGVhbihnZW5lcmF0aW9uRGF0YS5sYXlvdXRfY29uZmlybWVkKSxcbiAgICAgICAgICAgIHBhZ2VDb3VudEVzdGltYXRlOiBnZW5lcmF0aW9uRGF0YS5wYWdlX2NvdW50X2VzdGltYXRlID8/IG51bGwsXG4gICAgICAgICAgICBwYWdlQ291bnRFeGFjdDogZ2VuZXJhdGlvbkRhdGEucGFnZV9jb3VudF9leGFjdCA/PyBudWxsLFxuICAgICAgICAgICAgcGFnZUNvdW50Q29uZmlkZW5jZTogZ2VuZXJhdGlvbkRhdGEucGFnZV9jb3VudF9jb25maWRlbmNlID8/IG51bGwsXG4gICAgICAgICAgICBwYWdlQ291bnRTb3VyY2U6IGdlbmVyYXRpb25EYXRhLnBhZ2VfY291bnRfc291cmNlIHx8IG51bGwsXG4gICAgICAgICAgICBwYWdlTmVlZHNFeGFjdFJlY2hlY2s6IEJvb2xlYW4oXG4gICAgICAgICAgICAgIGdlbmVyYXRpb25EYXRhLnBhZ2VfY291bnRfbmVlZHNfZXhhY3RfcmVjaGVjayxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBwYWdlV2FybmluZzogQm9vbGVhbihnZW5lcmF0aW9uRGF0YS5wYWdlX2xlbmd0aF93YXJuaW5nKSxcbiAgICAgICAgICAgIGxheW91dEluc3RydWN0aW9uc0NvdW50OiBnZW5lcmF0aW9uRGF0YS5sYXlvdXRfaW5zdHJ1Y3Rpb25zX2NvdW50IHx8IDAsXG4gICAgICAgICAgICBmaW5hbEdlbmVyYXRlZEF0OiBnZW5lcmF0aW9uRGF0YS5maW5hbF9nZW5lcmF0ZWRfYXQgfHwgbnVsbCxcbiAgICAgICAgICAgIHByZXZpZXdHZW5lcmF0ZWRBdDogZ2VuZXJhdGlvbkRhdGEucHJldmlld19nZW5lcmF0ZWRfYXQgfHwgbnVsbCxcbiAgICAgICAgICAgIHByZXZpZXdSZXF1ZXN0SWQ6IGdlbmVyYXRpb25EYXRhLnByZXZpZXdfcmVxdWVzdF9pZCB8fCBudWxsLFxuICAgICAgICAgICAgY29uZmlybWVkQXQ6IGdlbmVyYXRpb25EYXRhLmNvbmZpcm1lZF9hdCB8fCBudWxsLFxuICAgICAgICAgICAgLy8gT3B0aW9uYWwgc2VydmVyLXByb3ZpZGVkIHJldmlzaW9uIG1ldGFkYXRhIChpZiBiYWNrZW5kIGV4cG9zZXMgdGhlbSlcbiAgICAgICAgICAgIGNvbnRlbnRSZXZpc2lvbjogKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBjb25zdCB2ID0gZ2VuZXJhdGlvbkRhdGEuY29udGVudF9yZXZpc2lvbiA/PyBnZW5lcmF0aW9uRGF0YS5jb250ZW50UmV2aXNpb247XG4gICAgICAgICAgICAgIHJldHVybiAodiA9PT0gdW5kZWZpbmVkIHx8IHYgPT09IG51bGwpID8gMCA6IChOdW1iZXIuaXNGaW5pdGUoTnVtYmVyKHYpKSA/IE51bWJlcih2KSA6IDApO1xuICAgICAgICAgICAgfSkoKSxcbiAgICAgICAgICAgIGxhc3RQcmV2aWV3Q29udGVudFJldmlzaW9uOiBnZW5lcmF0aW9uRGF0YS5sYXN0X3ByZXZpZXdfY29udGVudF9yZXZpc2lvbiA/PyBnZW5lcmF0aW9uRGF0YS5sYXN0UHJldmlld0NvbnRlbnRSZXZpc2lvbiA/PyBudWxsLFxuICAgICAgICAgICAgbGFzdEZpbmFsQ29udGVudFJldmlzaW9uOiBnZW5lcmF0aW9uRGF0YS5sYXN0X2ZpbmFsX2NvbnRlbnRfcmV2aXNpb24gPz8gZ2VuZXJhdGlvbkRhdGEubGFzdEZpbmFsQ29udGVudFJldmlzaW9uID8/IG51bGwsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAoaGFzQ2FjaGVkQXRzU2NvcmUpIHtcbiAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zZXRBdHNTY29yZShnZW5lcmF0aW9uRGF0YS5hdHNfc2NvcmUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdGF0ZU1hbmFnZXIuY2xlYXJBdHNTY29yZSgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChoYXNQZXJzaXN0ZWRHZW5lcmF0aW9uRGF0YSkge1xuICAgICAgICAgICAgc2VydmVySGFzRGF0YSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoX2UpIHsgLyogbm9uLWZhdGFsICovIH1cblxuICAgIGNvbnN0IHJlc3RvcmVkUGhhc2UgPSBfcmVzb2x2ZVJlc3RvcmVkUGhhc2Uoc3RhdHVzRGF0YSk7XG4gICAgc3RhdGVNYW5hZ2VyLnNldFBoYXNlKHJlc3RvcmVkUGhhc2UpO1xuICAgIF9yZXN0b3JlVGFiRm9yUGhhc2UocmVzdG9yZWRQaGFzZSk7XG5cbiAgICAvLyBLZWVwIHRoZSBwb3NpdGlvbi10aXRsZSBlbGVtZW50IGluIHN5bmMgd2hlbmV2ZXIgd2UgcmVzdG9yZSBzdGF0dXMgZGF0YS5cbiAgICBpZiAodHlwZW9mIHVwZGF0ZVBvc2l0aW9uVGl0bGUgPT09ICdmdW5jdGlvbicpIHVwZGF0ZVBvc2l0aW9uVGl0bGUoc3RhdHVzRGF0YSk7XG5cbiAgICBpZiAodHlwZW9mIHVwZGF0ZUluY2x1c2lvbkNvdW50cyA9PT0gJ2Z1bmN0aW9uJykgdXBkYXRlSW5jbHVzaW9uQ291bnRzKCk7XG5cbiAgICBpZiAoIXN0YXR1c0RhdGEucG9zaXRpb25fbmFtZSAmJiAhc3RhdHVzRGF0YS5qb2JfYW5hbHlzaXMpIHtcbiAgICAgIGNvbnN0IHN0b3JlZFBhdGggICAgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShTdG9yYWdlS2V5cy5TRVNTSU9OX1BBVEgpO1xuICAgICAgY29uc3Qgc3RvcmVkU2Vzc2lvbiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFN0b3JhZ2VLZXlzLlNFU1NJT05fSUQpO1xuICAgICAgY29uc3QgY3VycmVudFNlc3Npb24gPSBnZXRTZXNzaW9uSWRGcm9tVVJMID8gZ2V0U2Vzc2lvbklkRnJvbVVSTCgpIDogbnVsbDtcbiAgICAgIC8vIE9ubHkgYXV0by1yZXN0b3JlIGZyb20gZGlzayB3aGVuIHJlY29ubmVjdGluZyB0byB0aGUgU0FNRSBzZXNzaW9uXG4gICAgICAvLyAoc3RvcmVkU2Vzc2lvbiBtYXRjaGVzIHRoZSBjdXJyZW50IFVSTCBzZXNzaW9uX2lkKS4gIEEgZnJlc2ggbmV3IHNlc3Npb25cbiAgICAgIC8vIHdpbGwgaGF2ZSBhIGRpZmZlcmVudCBJRCwgc28gdGhpcyBndWFyZCBwcmV2ZW50cyB0aGUgbmV3IHNlc3Npb24gZnJvbVxuICAgICAgLy8gc2lsZW50bHkgbG9hZGluZyB0aGUgcHJldmlvdXMgc2Vzc2lvbidzIGRhdGEgb2ZmIGRpc2suXG4gICAgICBpZiAoc3RvcmVkUGF0aCAmJiBzdG9yZWRTZXNzaW9uICYmIHN0b3JlZFNlc3Npb24gPT09IGN1cnJlbnRTZXNzaW9uKSB7XG4gICAgICAgIC8vIFBhc3MgcmVkaXJlY3RPbk1pc21hdGNoOmZhbHNlIHNvIHRoYXQgaWYgdGhlIGZpbGUgb24gZGlzayBiZWxvbmdzIHRvIGFcbiAgICAgICAgLy8gZGlmZmVyZW50IHNlc3Npb24gKGUuZy4gU0VTU0lPTl9QQVRIIHdhcyBuZXZlciB1cGRhdGVkIGFmdGVyIGEgbmV3XG4gICAgICAgIC8vIHNlc3Npb24gd2FzIGNyZWF0ZWQpLCB3ZSBzaWxlbnRseSBza2lwIHRoZSByZXN0b3JlIHJhdGhlciB0aGFuXG4gICAgICAgIC8vIG5hdmlnYXRpbmcgdGhlIGJyb3dzZXIgdG8gYSBzZXNzaW9uIHRoZSB1c2VyIGRpZG4ndCBhc2sgZm9yLlxuICAgICAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCBsb2FkU2Vzc2lvbkZpbGUoc3RvcmVkUGF0aCwgeyByZWRpcmVjdE9uTWlzbWF0Y2g6IGZhbHNlIH0pO1xuICAgICAgICBpZiAobG9hZGVkKSByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2VydmVySGFzRGF0YTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cud2FybignRmFpbGVkIHRvIHJlc3RvcmUgYmFja2VuZCBzdGF0ZTonLCBlcnJvcik7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxvYWRTZXNzaW9uRmlsZShwYXRoLCB7IHJlZGlyZWN0T25NaXNtYXRjaCA9IHRydWUgfSA9IHt9KSB7XG4gIHRyeSB7XG4gICAgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgJ1x1RDgzRFx1REQwNCBSZXN0b3Jpbmcgc2Vzc2lvbiBmcm9tIGZpbGUuLi4nKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9sb2FkLXNlc3Npb24nLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBwYXRoIH0pXG4gICAgfSk7XG4gICAgaWYgKCFyZXMub2spIHtcbiAgICAgIGNvbnN0IGVyciA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCBgXHUyNzRDIEZhaWxlZCB0byByZXN0b3JlIHNlc3Npb246ICR7ZXJyLmVycm9yfWApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcblxuICAgIGlmIChkYXRhLnJlZGlyZWN0X3VybCAmJiBnZXRTZXNzaW9uSWRGcm9tVVJMKCkgIT09IGRhdGEuc2Vzc2lvbl9pZCkge1xuICAgICAgaWYgKCFyZWRpcmVjdE9uTWlzbWF0Y2gpIHtcbiAgICAgICAgLy8gVGhlIGZpbGUgb24gZGlzayBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IHNlc3Npb24gdGhhbiB0aGUgb25lIGluIHRoZVxuICAgICAgICAvLyBVUkwuICBTaWxlbnRseSBhYm9ydCByYXRoZXIgdGhhbiByZWRpcmVjdGluZyB0aGUgYnJvd3NlciBcdTIwMTQgdGhlIGNhbGxlclxuICAgICAgICAvLyAocmVzdG9yZUJhY2tlbmRTdGF0ZSkgb25seSB3YW50cyB0byByZXN0b3JlIFRISVMgc2Vzc2lvbiwgbm90IGxvYWQgYVxuICAgICAgICAvLyBkaWZmZXJlbnQgb25lLlxuICAgICAgICBsb2cud2FybihcbiAgICAgICAgICAnbG9hZFNlc3Npb25GaWxlOiBzZXNzaW9uX2lkIG1pc21hdGNoICh1cmw9JXMsIGZpbGU9JXMpOyBza2lwcGluZyByZXN0b3JlJyxcbiAgICAgICAgICBnZXRTZXNzaW9uSWRGcm9tVVJMKCksIGRhdGEuc2Vzc2lvbl9pZCxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihkYXRhLnJlZGlyZWN0X3VybCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShTdG9yYWdlS2V5cy5TRVNTSU9OX1BBVEgsIGRhdGEuc2Vzc2lvbl9maWxlIHx8IHBhdGgpO1xuXG4gICAgLy8gUmVzZXQgc2Vzc2lvbi1zY29wZWQgc3VnZ2VzdGlvbiBzdGF0ZVxuICAgIHdpbmRvdy5fc3VnZ2VzdGVkQWNoc09yZGVyZWQgPSBudWxsO1xuXG4gICAgLy8gUmVsb2FkIGNvbnZlcnNhdGlvbiBoaXN0b3J5IGZyb20gdGhlIGZyZXNobHktbG9hZGVkIGJhY2tlbmRcbiAgICBjb25zdCBoaXN0b3J5UmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvaGlzdG9yeScpO1xuICAgIGlmIChoaXN0b3J5UmVzLm9rKSB7XG4gICAgICBjb25zdCBoaXN0b3J5RGF0YSA9IGF3YWl0IGhpc3RvcnlSZXMuanNvbigpO1xuICAgICAgY29uc3QgY29udiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb252ZXJzYXRpb24nKTtcbiAgICAgIGNvbnYuaW5uZXJIVE1MID0gJyc7XG4gICAgICAoaGlzdG9yeURhdGEuaGlzdG9yeSB8fCBbXSkuZm9yRWFjaChtc2cgPT4ge1xuICAgICAgICBpZiAobXNnLnJvbGUgIT09ICdzeXN0ZW0nKSBhcHBlbmRNZXNzYWdlKG1zZy5yb2xlLCBtc2cuY29udGVudCk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgJ1x1MjZBMCBDb3VsZCBub3QgcmVzdG9yZSBjb252ZXJzYXRpb24gaGlzdG9yeS4nKTtcbiAgICB9XG5cbiAgICBhd2FpdCBmZXRjaFN0YXR1cygpO1xuXG4gICAgLy8gUnVuIGEgYmFja2dyb3VuZCBoZWFsdGggY2hlY2sgc28gdGhlIHN0YXR1cyBwaWxsIHJlZmxlY3RzIGxpdmUgY29ubmVjdGl2aXR5LlxuICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcy50ZXN0Q3VycmVudE1vZGVsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBnbG9iYWxUaGlzLnRlc3RDdXJyZW50TW9kZWwoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgfVxuXG4gICAgLy8gUmVoeWRyYXRlIHRhYkRhdGEgYW5kIHN3aXRjaCB0byB0aGUgY29ycmVjdCB0YWIgZm9yIHRoZSByZXN0b3JlZCBwaGFzZVxuICAgIGNvbnN0IHNlc3Npb25QaGFzZSA9IGRhdGEucGhhc2UgfHwgUEhBU0VTLklOSVQ7XG4gICAgY29uc3QgcGhhc2VUYWJNYXAgPSB7XG4gICAgICBbUEhBU0VTLklOSVRdOiAgICAgICAgICAgICAnam9iJyxcbiAgICAgIFtQSEFTRVMuSk9CX0FOQUxZU0lTXTogICAgICdhbmFseXNpcycsXG4gICAgICBbUEhBU0VTLkNVU1RPTUlaQVRJT05dOiAgICAnZXhwLXJldmlldycsXG4gICAgICBbUEhBU0VTLlJFV1JJVEVfUkVWSUVXXTogICAncmV3cml0ZScsXG4gICAgICBbUEhBU0VTLlNQRUxMX0NIRUNLXTogICAgICAnc3BlbGwnLFxuICAgICAgW1BIQVNFUy5HRU5FUkFUSU9OXTogICAgICAgJ2xheW91dCcsXG4gICAgICBbUEhBU0VTLkxBWU9VVF9SRVZJRVddOiAgICAnbGF5b3V0JyxcbiAgICAgIFtQSEFTRVMuRklOQUxfR0VORVJBVElPTl06ICdmaW5hbF9nZW5lcmF0ZScsXG4gICAgICBbUEhBU0VTLlJFRklORU1FTlRdOiAgICAgICAnZG93bmxvYWQnLFxuICAgIH07XG4gICAgY29uc3QgdGFyZ2V0VGFiID0gcGhhc2VUYWJNYXBbc2Vzc2lvblBoYXNlXSB8fCAnam9iJztcblxuICAgIGNvbnN0IGN1c3RvbWl6YXRpb25QaGFzZXMgPSBbXG4gICAgICBQSEFTRVMuQ1VTVE9NSVpBVElPTiwgUEhBU0VTLlJFV1JJVEVfUkVWSUVXLCBQSEFTRVMuU1BFTExfQ0hFQ0ssXG4gICAgICBQSEFTRVMuR0VORVJBVElPTiwgUEhBU0VTLkxBWU9VVF9SRVZJRVcsIFBIQVNFUy5GSU5BTF9HRU5FUkFUSU9OLCBQSEFTRVMuUkVGSU5FTUVOVCxcbiAgICBdO1xuICAgIGlmIChjdXN0b21pemF0aW9uUGhhc2VzLmluY2x1ZGVzKHNlc3Npb25QaGFzZSkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHMyID0gYXdhaXQgZmV0Y2goJy9hcGkvc3RhdHVzJyk7XG4gICAgICAgIGNvbnN0IHNkID0gcGFyc2VTdGF0dXNSZXNwb25zZShhd2FpdCBzMi5qc29uKCkpO1xuICAgICAgICBfaHlkcmF0ZVN0YXR1c0Rlcml2ZWRTdGF0ZShzZCk7XG4gICAgICAgIF9oeWRyYXRlU3RhdHVzVGFiU3RhdGUoc2QpO1xuICAgICAgfSBjYXRjaCAoXykgeyAvKiBub24tZmF0YWwgKi8gfVxuICAgIH1cblxuICAgIC8vIEZvciByZXdyaXRlX3JldmlldyBwaGFzZSwgcHJlLXBvcHVsYXRlIHRoZSByZXdyaXRlIHBhbmVsIGNhY2hlXG4gICAgaWYgKHNlc3Npb25QaGFzZSA9PT0gUEhBU0VTLlJFV1JJVEVfUkVWSUVXKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByciA9IGF3YWl0IGZldGNoKCcvYXBpL3Jld3JpdGVzJyk7XG4gICAgICAgIGlmIChyci5vaykge1xuICAgICAgICAgIGNvbnN0IHJkID0gcGFyc2VSZXdyaXRlc1Jlc3BvbnNlKGF3YWl0IHJyLmpzb24oKSk7XG4gICAgICAgICAgY29uc3QgcmV3cml0ZXMgPSByZC5yZXdyaXRlcyB8fCBbXTtcbiAgICAgICAgICBjb25zdCB3YXJuaW5ncyA9IHJkLnBlcnN1YXNpb25fd2FybmluZ3MgfHwgW107XG4gICAgICAgICAgcmV3cml0ZURlY2lzaW9ucyA9IHt9O1xuICAgICAgICAgIHJlbmRlclJld3JpdGVQYW5lbChyZXdyaXRlcywgd2FybmluZ3MpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChfKSB7IC8qIG5vbi1mYXRhbCAqLyB9XG4gICAgfVxuXG4gICAgc3dpdGNoVGFiKHRhcmdldFRhYik7XG4gICAgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgYFx1MjcwNSBTZXNzaW9uIHJlc3RvcmVkOiAke2RhdGEucG9zaXRpb25fbmFtZSB8fCAnVW5uYW1lZCd9ICgke1NFU1NJT05fUEhBU0VfTEFCRUxTW2RhdGEucGhhc2VdIHx8IFN0cmluZyhkYXRhLnBoYXNlIHx8IFBIQVNFUy5JTklUKS5yZXBsYWNlKC9fL2csICcgJyl9KWApO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCBgXHUyNzRDIEVycm9yIHJlc3RvcmluZyBzZXNzaW9uOiAke2Vyci5tZXNzYWdlfWApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFJlbmFtZSAvIHRhYiBkYXRhIHBlcnNpc3RlbmNlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuYXN5bmMgZnVuY3Rpb24gcHJvbXB0UmVuYW1lQ3VycmVudFNlc3Npb24oKSB7XG4gIGNvbnN0IHRpdGxlRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncG9zaXRpb24tdGl0bGUnKTtcbiAgY29uc3QgcmVuYW1lQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlbmFtZS1zZXNzaW9uLWJ0bicpO1xuICBjb25zdCBjdXJyZW50ID0gKHRpdGxlRWw/LnRleHRDb250ZW50IHx8ICcnKS50cmltKCk7XG5cbiAgLy8gQnVpbGQgaW5saW5lIGlucHV0IHdpZGdldCBzbyB3ZSBuZXZlciBjYWxsIHdpbmRvdy5wcm9tcHQoKVxuICBjb25zdCB3cmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICB3cmFwcGVyLnN0eWxlLmNzc1RleHQgPSAnZGlzcGxheTppbmxpbmUtZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjRweDsnO1xuICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gIGlucHV0LnR5cGUgPSAndGV4dCc7XG4gIGlucHV0LnZhbHVlID0gY3VycmVudDtcbiAgaW5wdXQuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgJ05ldyBzZXNzaW9uIG5hbWUnKTtcbiAgaW5wdXQuc3R5bGUuY3NzVGV4dCA9ICdmb250LXNpemU6aW5oZXJpdDtwYWRkaW5nOjFweCA0cHg7Ym9yZGVyOjFweCBzb2xpZCAjOTRhM2I4O2JvcmRlci1yYWRpdXM6M3B4O3dpZHRoOjIyMHB4Oyc7XG4gIGNvbnN0IG9rQnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gIG9rQnRuLnRleHRDb250ZW50ID0gJ1x1MjcxMyc7XG4gIG9rQnRuLnRpdGxlID0gJ1NhdmUgcmVuYW1lJztcbiAgb2tCdG4uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgJ1NhdmUgcmVuYW1lJyk7XG4gIG9rQnRuLnN0eWxlLmNzc1RleHQgPSAnYmFja2dyb3VuZDojMTBiOTgxO2NvbG9yOiNmZmY7Ym9yZGVyOm5vbmU7Ym9yZGVyLXJhZGl1czozcHg7Y3Vyc29yOnBvaW50ZXI7cGFkZGluZzoxcHggNnB4O2ZvbnQtc2l6ZToxZW07JztcbiAgY29uc3QgY2FuY2VsQnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gIGNhbmNlbEJ0bi50ZXh0Q29udGVudCA9ICdcdTI3MTUnO1xuICBjYW5jZWxCdG4udGl0bGUgPSAnQ2FuY2VsIHJlbmFtZSc7XG4gIGNhbmNlbEJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnQ2FuY2VsIHJlbmFtZScpO1xuICBjYW5jZWxCdG4uc3R5bGUuY3NzVGV4dCA9ICdiYWNrZ3JvdW5kOiM2YjcyODA7Y29sb3I6I2ZmZjtib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjNweDtjdXJzb3I6cG9pbnRlcjtwYWRkaW5nOjFweCA2cHg7Zm9udC1zaXplOjFlbTsnO1xuICB3cmFwcGVyLmFwcGVuZChpbnB1dCwgb2tCdG4sIGNhbmNlbEJ0bik7XG5cbiAgaWYgKHRpdGxlRWwpIHRpdGxlRWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgaWYgKHJlbmFtZUJ0bikgcmVuYW1lQnRuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHRpdGxlRWw/LnBhcmVudEVsZW1lbnQ/Lmluc2VydEJlZm9yZSh3cmFwcGVyLCB0aXRsZUVsKTtcbiAgaW5wdXQuZm9jdXMoKTtcbiAgaW5wdXQuc2VsZWN0KCk7XG5cbiAgYXN5bmMgZnVuY3Rpb24gZG9SZW5hbWUoKSB7XG4gICAgY29uc3QgbmV3TmFtZSA9IGlucHV0LnZhbHVlLnRyaW0oKTtcbiAgICBjbGVhbnVwKCk7XG4gICAgaWYgKCFuZXdOYW1lIHx8IG5ld05hbWUgPT09IGN1cnJlbnQpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL3JlbmFtZS1jdXJyZW50LXNlc3Npb24nLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBuZXdfbmFtZTogbmV3TmFtZSB9KSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5vaykgYXdhaXQgZmV0Y2hTdGF0dXMoKTtcbiAgICAgIGVsc2UgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHNob3dUb2FzdChgUmVuYW1lIGZhaWxlZDogJHtkYXRhLmVycm9yfWAsICdlcnJvcicpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmICh0eXBlb2Ygc2hvd1RvYXN0ID09PSAnZnVuY3Rpb24nKSBzaG93VG9hc3QoYFJlbmFtZSBlcnJvcjogJHtlLm1lc3NhZ2V9YCwgJ2Vycm9yJyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY2xlYW51cCgpIHtcbiAgICB3cmFwcGVyLnJlbW92ZSgpO1xuICAgIGlmICh0aXRsZUVsKSB0aXRsZUVsLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICBpZiAocmVuYW1lQnRuKSByZW5hbWVCdG4uc3R5bGUuZGlzcGxheSA9ICcnO1xuICB9XG5cbiAgb2tCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBkb1JlbmFtZSk7XG4gIGNhbmNlbEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNsZWFudXApO1xuICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZSA9PiB7XG4gICAgaWYgKGUua2V5ID09PSAnRW50ZXInKSBkb1JlbmFtZSgpO1xuICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIGNsZWFudXAoKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHNhdmVUYWJEYXRhKCkge1xuICB0cnkge1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGdldFNjb3BlZFRhYkRhdGFTdG9yYWdlS2V5KHN0YXRlTWFuYWdlci5nZXRTZXNzaW9uSWQoKSksIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIHRhYkRhdGE6IHN0YXRlTWFuYWdlci5nZXRBbGxUYWJEYXRhKCksXG4gICAgICBjdXJyZW50VGFiOiBzdGF0ZU1hbmFnZXIuZ2V0Q3VycmVudFRhYigpLFxuICAgICAgcGVuZGluZ1JlY29tbWVuZGF0aW9uczogd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnMgfHwgbnVsbCxcbiAgICAgIGludGVyYWN0aXZlU3RhdGU6IHN0YXRlTWFuYWdlci5nZXRJbnRlcmFjdGl2ZVN0YXRlKCksXG4gICAgICBhY3RpdmVSZXZpZXdQYW5lOiB3aW5kb3cuX2FjdGl2ZVJldmlld1BhbmUgfHwgJ2V4cGVyaWVuY2VzJyxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKVxuICAgIH0pKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cud2FybignRmFpbGVkIHRvIHNhdmUgdGFiIGRhdGE6JywgZXJyb3IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc3RvcmVUYWJEYXRhKHsgdWlQcmVmc09ubHkgPSBmYWxzZSB9ID0ge30pIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzYXZlZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGdldFNjb3BlZFRhYkRhdGFTdG9yYWdlS2V5KHN0YXRlTWFuYWdlci5nZXRTZXNzaW9uSWQoKSkpO1xuICAgIGlmIChzYXZlZCkge1xuICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2Uoc2F2ZWQpO1xuXG4gICAgICBjb25zdCBhZ2UgPSBEYXRlLm5vdygpIC0gKGRhdGEudGltZXN0YW1wIHx8IDApO1xuICAgICAgaWYgKGFnZSA8IDI0ICogNjAgKiA2MCAqIDEwMDApIHtcbiAgICAgICAgaWYgKCF1aVByZWZzT25seSkge1xuICAgICAgICAgIGlmIChkYXRhLnRhYkRhdGEpIHtcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGRhdGEudGFiRGF0YSkuZm9yRWFjaCgoW3RhYiwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zZXRUYWJEYXRhKHRhYiwgdmFsdWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChkYXRhLnBlbmRpbmdSZWNvbW1lbmRhdGlvbnMpIHtcbiAgICAgICAgICAgIHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zID0gZGF0YS5wZW5kaW5nUmVjb21tZW5kYXRpb25zO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZGF0YS5pbnRlcmFjdGl2ZVN0YXRlKSB7XG4gICAgICAgICAgICBzdGF0ZU1hbmFnZXIuc2V0SW50ZXJhY3RpdmVTdGF0ZShkYXRhLmludGVyYWN0aXZlU3RhdGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YS5hY3RpdmVSZXZpZXdQYW5lKSB7XG4gICAgICAgICAgd2luZG93Ll9hY3RpdmVSZXZpZXdQYW5lID0gZGF0YS5hY3RpdmVSZXZpZXdQYW5lO1xuICAgICAgICB9XG5cbiAgICAgICAgbG9nLmluZm8oYFJlc3RvcmVkIHRhYiBkYXRhIGZyb20gbG9jYWxTdG9yYWdlICh1aVByZWZzT25seT0ke3VpUHJlZnNPbmx5fSlgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGdldFNjb3BlZFRhYkRhdGFTdG9yYWdlS2V5KHN0YXRlTWFuYWdlci5nZXRTZXNzaW9uSWQoKSkpO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cud2FybignRmFpbGVkIHRvIHJlc3RvcmUgdGFiIGRhdGE6JywgZXJyb3IpO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFUyBtb2R1bGUgZXhwb3J0cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmV4cG9ydCB7XG4gIGZvcm1hdFNlc3Npb25QaGFzZUxhYmVsLFxuICBfZ2V0Q3VycmVudFNlc3Npb25JZFZhbHVlLFxuICBfZ2V0Q3VycmVudE93bmVyVG9rZW5WYWx1ZSxcbiAgYnVpbGRTZXNzaW9uU3dpdGNoZXJMYWJlbCxcbiAgZ2V0QWN0aXZlU2Vzc2lvbk93bmVyc2hpcE1ldGEsXG4gIGZvcm1hdFNlc3Npb25UaW1lc3RhbXAsXG4gIGNyZWF0ZU5ld1Nlc3Npb25BbmROYXZpZ2F0ZSxcbiAgY3JlYXRlTmV3U2Vzc2lvbkluTmV3VGFiLFxuICBvbmJvYXJkaW5nQ3JlYXRlRW1wdHlQcm9maWxlLFxuICBzaG93T25ib2FyZGluZ01vZGFsLFxuICBtYXliZVNob3dXZWxjb21lTW9kYWwsXG4gIHNob3dXZWxjb21lTW9kYWwsXG4gIGNsb3NlV2VsY29tZU1vZGFsLFxuICBfY2xhaW1DdXJyZW50U2Vzc2lvbixcbiAgX3Jlc29sdmVSZXN0b3JlZFBoYXNlLFxuICBzaG93U2Vzc2lvbnNMYW5kaW5nUGFuZWwsXG4gIGVuc3VyZVNlc3Npb25Db250ZXh0LFxuICByZXN0b3JlU2Vzc2lvbixcbiAgcmVzdG9yZUJhY2tlbmRTdGF0ZSxcbiAgbG9hZFNlc3Npb25GaWxlLFxuICBwcm9tcHRSZW5hbWVDdXJyZW50U2Vzc2lvbixcbiAgc2F2ZVRhYkRhdGEsXG4gIHJlc3RvcmVUYWJEYXRhLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL2pvYi1pbnB1dC5qc1xuICogSm9iIGRlc2NyaXB0aW9uIGlucHV0IHBhbmVsOiBwYXN0ZSwgVVJMIGZldGNoLCBmaWxlIHVwbG9hZCwgbG9hZC1pdGVtcyB0YWJsZS5cbiAqXG4gKiBERVBFTkRFTkNJRVMgKGFsbCBvbiBnbG9iYWxUaGlzIGF0IHJ1bnRpbWUpOlxuICogICAtIG1hcmtlZCwgZG9tcHVyaWZ5IChucG0gXHUyMDE0IGJ1bmRsZWQ7IHVzZWQgaW50ZXJuYWxseSBmb3Igc2FmZSBtYXJrZG93biByZW5kZXJpbmcpXG4gKiAgIC0gZXNjYXBlSHRtbCAodXRpbHMuanMpXG4gKiAgIC0gYXBwZW5kTWVzc2FnZSwgYXBwZW5kUmV0cnlNZXNzYWdlIChtZXNzYWdlLXF1ZXVlLmpzKVxuICogICAtIHNldExvYWRpbmcgKGZldGNoLXV0aWxzLmpzKVxuICogICAtIHNhdmVUYWJEYXRhIChzZXNzaW9uLW1hbmFnZXIuanMpXG4gKiAgIC0gc3dpdGNoVGFiIChyZXZpZXctdGFibGUtYmFzZS5qcywgVGllciA0KVxuICogICAtIGFuYWx5emVKb2IgKGpvYi1hbmFseXNpcy5qcylcbiAqICAgLSBmZXRjaFN0YXR1cyAoYXBpLWNsaWVudC5qcylcbiAqICAgLSBzaG93QWxlcnRNb2RhbCAodWktaGVscGVycy5qcylcbiAqICAgLSBzdGF0ZU1hbmFnZXIgKHN0YXRlLW1hbmFnZXIuanMgXHUyMDE0IGdldEN1cnJlbnRUYWIoKS9zZXRUYWJEYXRhKCkpXG4gKiAgIC0gUEhBU0VTICh3aW5kb3cgZ2xvYmFsKVxuICpcbiAqIEdBUC0yMyBpbnRha2UgY29uZmlybWF0aW9uOlxuICogICBBbGwgam9iLXRleHQgc3VibWlzc2lvbnMgKHBhc3RlLCBVUkwsIGZpbGUpIHJvdXRlIGRpcmVjdGx5IHRvIGFuYWx5emVKb2IoKVxuICogICBzbyBldmVyeSBzb3VyY2UgZm9sbG93cyB0aGUgc2FtZSBwb3N0LWFuYWx5c2lzIGludGFrZSBwYXRoLlxuICovXG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmNvbnN0IGxvZyA9IGdldExvZ2dlcignam9iLWlucHV0Jyk7XG5cbmltcG9ydCB7IFBIQVNFUywgc3RhdGVNYW5hZ2VyIH0gZnJvbSAnLi9zdGF0ZS1tYW5hZ2VyLmpzJztcbmltcG9ydCB7IG1hcmtlZCB9IGZyb20gJ21hcmtlZCc7XG5pbXBvcnQgRE9NUHVyaWZ5IGZyb20gJ2RvbXB1cmlmeSc7XG5cbi8vIFJlbmRlciBqb2IgZGVzY3JpcHRpb24gdGV4dCBzYWZlbHk6IG1hcmtlZCBwYXJzZXMgR0ZNIChpbmNsdWRpbmcgZW1iZWRkZWQgSFRNTFxuLy8gYW5kIGF1dG9saW5rcyksIERPTVB1cmlmeSBzYW5pdGl6ZXMgdGhlIG91dHB1dCBiZWZvcmUgd3JpdGluZyB0byBpbm5lckhUTUwuXG4vLyBGT1JCSURfQVRUUjogWydzdHlsZSddIHN0cmlwcyBpbmxpbmUgQ1NTIGZyb20gSFRNTCBlbWJlZGRlZCBpbiB0aGUgam9iIHRleHRcbi8vIChlLmcuIFdvcmQtc3R5bGUgZm9udC1zaXplL2ZvbnQtZmFtaWx5IGZyb20gSlNPTi1MRCBkZXNjcmlwdGlvbiBmaWVsZHMpLFxuLy8gc28gdGhlIHBhZ2UncyBvd24gc3R5bGVzaGVldCBjb250cm9scyBmb250IHJlbmRlcmluZyBjb25zaXN0ZW50bHkuXG5mdW5jdGlvbiBfcmVuZGVySm9iVGV4dCh0ZXh0KSB7XG4gIGNvbnN0IHJhdyA9IG1hcmtlZC5wYXJzZSh0ZXh0LCB7IGdmbTogdHJ1ZSwgYnJlYWtzOiB0cnVlIH0pO1xuICByZXR1cm4gRE9NUHVyaWZ5LnNhbml0aXplKHJhdywgeyBGT1JCSURfQVRUUjogWydzdHlsZSddIH0pO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEpvYiB0YWIgZGlzcGxheVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmFzeW5jIGZ1bmN0aW9uIHBvcHVsYXRlSm9iVGFiKCkge1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9zdGF0dXMnKTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcblxuICAgIGlmIChkYXRhLmpvYl9kZXNjcmlwdGlvbl90ZXh0KSB7XG4gICAgICBjb25zdCBqb2JUZXh0ID0gZGF0YS5qb2JfZGVzY3JpcHRpb25fdGV4dDtcbiAgICAgIGNvbnN0IHBvc2l0aW9uTmFtZSA9IGRhdGEucG9zaXRpb25fbmFtZSB8fCBudWxsO1xuICAgICAgY29uc3Qgam9iVXJsID0gZGF0YS5qb2JfdXJsIHx8IG51bGw7XG4gICAgICBjb25zdCB0aXRsZVRleHQgPSBwb3NpdGlvbk5hbWVcbiAgICAgICAgPyBlc2NhcGVIdG1sKHBvc2l0aW9uTmFtZSlcbiAgICAgICAgOiAnPGVtIHN0eWxlPVwiY29sb3I6IzljYTNhZjtcIj5Qb3NpdGlvbiB0aXRsZSBub3QgeWV0IGV4dHJhY3RlZFx1MjAyNjwvZW0+JztcbiAgICAgIGNvbnN0IHRpdGxlQ29udGVudCA9IChwb3NpdGlvbk5hbWUgJiYgam9iVXJsKVxuICAgICAgICA/IGA8YSBocmVmPVwiJHtlc2NhcGVIdG1sKGpvYlVybCl9XCIgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiIHN0eWxlPVwiY29sb3I6aW5oZXJpdDt0ZXh0LWRlY29yYXRpb246bm9uZTtcIj4ke3RpdGxlVGV4dH08L2E+YFxuICAgICAgICA6IHRpdGxlVGV4dDtcbiAgICAgIGxldCBodG1sID0gJzxoMT4nICsgdGl0bGVDb250ZW50ICsgJzwvaDE+JztcbiAgICAgIGlmIChqb2JVcmwpIHtcbiAgICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cIm1heC13aWR0aDoxMDAlO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3doaXRlLXNwYWNlOm5vd3JhcDtjb2xvcjojNjQ3NDhiO2ZvbnQtc2l6ZTowLjg1ZW07bWFyZ2luOi04cHggMCA4cHggMDtcIiB0aXRsZT1cIiR7ZXNjYXBlSHRtbChqb2JVcmwpfVwiPjxhIGhyZWY9XCIke2VzY2FwZUh0bWwoam9iVXJsKX1cIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCIgc3R5bGU9XCJjb2xvcjojM2I4MmY2O3RleHQtZGVjb3JhdGlvbjpub25lO1wiPiR7ZXNjYXBlSHRtbChqb2JVcmwpfTwvYT48L2Rpdj5gO1xuICAgICAgfVxuXG4gICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwibGluZS1oZWlnaHQ6IDEuNjsgYmFja2dyb3VuZDogI2Y4ZjlmYTsgcGFkZGluZzogMjBweDsgYm9yZGVyLXJhZGl1czogOHB4OyBtYXJnaW46IDIwcHggMDtcIj4nICsgX3JlbmRlckpvYlRleHQoam9iVGV4dCkgKyAnPC9kaXY+JztcblxuICAgICAgY29uc3QgYW5hbHl6ZUJ0biA9IGRhdGEucGhhc2UgPT09IFBIQVNFUy5JTklUXG4gICAgICAgID8gJzxidXR0b24gb25jbGljaz1cImFuYWx5emVKb2IoKVwiIGNsYXNzPVwiYnRuLXByaW1hcnlcIiBzdHlsZT1cIm1hcmdpbi1yaWdodDo4cHg7XCI+XHVEODNEXHVERDBEIEFuYWx5c2UgSm9iPC9idXR0b24+J1xuICAgICAgICA6ICcnO1xuICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6MjBweDtcIj4nICsgYW5hbHl6ZUJ0biArICc8YnV0dG9uIG9uY2xpY2s9XCJzaG93TG9hZEpvYlBhbmVsKClcIiBjbGFzcz1cImJ0bi1zZWNvbmRhcnlcIj5cdUQ4M0RcdURDRTUgTG9hZCBEaWZmZXJlbnQgSm9iPC9idXR0b24+PC9kaXY+JztcbiAgICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gaHRtbDtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgc2hvd0xvYWRKb2JQYW5lbCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cuZXJyb3IoJ0Vycm9yIGxvYWRpbmcgam9iIGRlc2NyaXB0aW9uOicsIGVycm9yKTtcbiAgICBhd2FpdCBzaG93TG9hZEpvYlBhbmVsKCk7XG4gIH1cbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBMb2FkLWpvYiBwYW5lbCAoc2Vzc2lvbnMgKyBzZXJ2ZXIgZmlsZXMgdGFibGUgKyBpbnB1dCBtZXRob2RzKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmFzeW5jIGZ1bmN0aW9uIHNob3dMb2FkSm9iUGFuZWwoKSB7XG4gIGlmIChzdGF0ZU1hbmFnZXIuZ2V0Q3VycmVudFRhYigpICE9PSAnam9iJykge1xuICAgIHN3aXRjaFRhYignam9iJyk7XG4gIH1cblxuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgY29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImVtcHR5LXN0YXRlXCI+PGRpdiBjbGFzcz1cImxvYWRpbmctc3Bpbm5lclwiPjwvZGl2PjxwIHN0eWxlPVwibWFyZ2luLXRvcDoxMnB4O2NvbG9yOiM2NDc0OGI7XCI+TG9hZGluZ1x1MjAyNjwvcD48L2Rpdj4nO1xuXG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgc3R5bGU9XCJtYXgtd2lkdGg6ODIwcHg7bWFyZ2luOjAgYXV0bztwYWRkaW5nOjI0cHg7XCI+XG4gICAgICA8aDEgc3R5bGU9XCJmb250LXNpemU6MjJweDtmb250LXdlaWdodDo3MDA7Y29sb3I6IzFlMjkzYjttYXJnaW4tYm90dG9tOjZweDtcIj5cdUQ4M0RcdURDRTUgQWRkIEpvYiBEZXNjcmlwdGlvbjwvaDE+XG5cbiAgICAgIDxkaXYgc3R5bGU9XCJib3JkZXI6MXB4IHNvbGlkICNlMmU4ZjA7Ym9yZGVyLXJhZGl1czo4cHg7b3ZlcmZsb3c6dmlzaWJsZTtcIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2Y4ZmFmYztwYWRkaW5nOjEwcHggMTZweDtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZTJlOGYwO2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTNweDtjb2xvcjojNDc1NTY5O1wiPkFkZCBOZXcgSm9iIERlc2NyaXB0aW9uPC9kaXY+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nOjIwcHg7XCI+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtbWV0aG9kLXRhYnNcIiBzdHlsZT1cIm1hcmdpbi10b3A6MDtcIj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpbnB1dC10YWIgYWN0aXZlXCIgb25jbGljaz1cInN3aXRjaElucHV0TWV0aG9kKCdwYXN0ZScpXCI+XHVEODNEXHVEQ0REIFBhc3RlIFRleHQ8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpbnB1dC10YWJcIiBvbmNsaWNrPVwic3dpdGNoSW5wdXRNZXRob2QoJ3VybCcpXCI+XHVEODNEXHVERDE3IEZyb20gVVJMPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaW5wdXQtdGFiXCIgb25jbGljaz1cInN3aXRjaElucHV0TWV0aG9kKCdmaWxlJylcIj5cdUQ4M0RcdURDQzEgVXBsb2FkIEZpbGU8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1tZXRob2QgYWN0aXZlXCIgaWQ9XCJwYXN0ZS1tZXRob2RcIj5cbiAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD1cImpvYi10ZXh0LWlucHV0XCIgcGxhY2Vob2xkZXI9XCJQYXN0ZSB0aGUgam9iIGRlc2NyaXB0aW9uIGhlcmVcdTIwMjZcIiByb3dzPVwiMTJcIlxuICAgICAgICAgICAgICBhcmlhLXJlcXVpcmVkPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIGFyaWEtZGVzY3JpYmVkYnk9XCJwYXN0ZS1jaGFyLWNvdW50IHBhc3RlLWVycm9yXCJcbiAgICAgICAgICAgICAgb25ibHVyPVwiX3ZhbGlkYXRlUGFzdGVGaWVsZCgpXCIgb25pbnB1dD1cIl91cGRhdGVQYXN0ZUNoYXJDb3VudCgpXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDoxMDAlO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOjE0cHg7cGFkZGluZzoxMnB4O2JvcmRlcjoxcHggc29saWQgI2QxZDVkYjtib3JkZXItcmFkaXVzOjZweDtyZXNpemU6dmVydGljYWw7bWFyZ2luLXRvcDo4cHg7XCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJwYXN0ZS1jaGFyLWNvdW50XCIgYXJpYS1saXZlPVwicG9saXRlXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6MTJweDtjb2xvcjojOTRhM2I4O21hcmdpbi10b3A6NHB4O21pbi1oZWlnaHQ6MThweDtcIj48L2Rpdj5cbiAgICAgICAgICAgIDxzcGFuIGlkPVwicGFzdGUtZXJyb3JcIiBjbGFzcz1cImZpZWxkLWVycm9yXCIgYXJpYS1saXZlPVwicG9saXRlXCI+PC9zcGFuPlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6MTBweDtkaXNwbGF5OmZsZXg7Z2FwOjEycHg7XCI+XG4gICAgICAgICAgICAgIDxidXR0b24gb25jbGljaz1cInN1Ym1pdEpvYlRleHQoKVwiIGNsYXNzPVwiYnRuLXByaW1hcnlcIj5TdWJtaXQgSm9iIERlc2NyaXB0aW9uPC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b24gb25jbGljaz1cImNsZWFySm9iSW5wdXQoKVwiIGNsYXNzPVwiYnRuLXNlY29uZGFyeVwiPkNsZWFyPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1tZXRob2RcIiBpZD1cInVybC1tZXRob2RcIj5cbiAgICAgICAgICAgIDxwIHN0eWxlPVwibWFyZ2luOjhweCAwIDEwcHg7XCI+RW50ZXIgYSBVUkwgdG8gYXV0b21hdGljYWxseSBleHRyYWN0IHRoZSBqb2IgZGVzY3JpcHRpb246PC9wPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ1cmxcIiBpZD1cImpvYi11cmwtaW5wdXRcIiBwbGFjZWhvbGRlcj1cImh0dHBzOi8vY29tcGFueS5jb20vam9iLXBvc3RpbmdcIlxuICAgICAgICAgICAgICBhcmlhLXJlcXVpcmVkPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIGFyaWEtZGVzY3JpYmVkYnk9XCJ1cmwtZXJyb3JcIlxuICAgICAgICAgICAgICBvbmJsdXI9XCJfdmFsaWRhdGVVUkxGaWVsZCgpXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDoxMDAlO3BhZGRpbmc6MTJweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo2cHg7XCIgLz5cbiAgICAgICAgICAgIDxzcGFuIGlkPVwidXJsLWVycm9yXCIgY2xhc3M9XCJmaWVsZC1lcnJvclwiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOjEwcHg7ZGlzcGxheTpmbGV4O2dhcDoxMnB4O1wiPlxuICAgICAgICAgICAgICA8YnV0dG9uIG9uY2xpY2s9XCJmZXRjaEpvYkZyb21VUkwoKVwiIGNsYXNzPVwiYnRuLXByaW1hcnlcIj5GZXRjaCBKb2IgRGVzY3JpcHRpb248L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPVwiY2xlYXJVUkxJbnB1dCgpXCIgY2xhc3M9XCJidG4tc2Vjb25kYXJ5XCI+Q2xlYXI8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6MTRweDtkaXNwbGF5OmdyaWQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmciAxZnI7Z2FwOjEwcHg7Zm9udC1zaXplOjEzcHg7XCI+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmMGY5ZmY7Ym9yZGVyOjFweCBzb2xpZCAjMGVhNWU5O2JvcmRlci1yYWRpdXM6NnB4O3BhZGRpbmc6MTBweDtcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6NjAwO2NvbG9yOiMwMzY5YTE7bWFyZ2luLWJvdHRvbTo0cHg7XCI+XHUyNzA1IFdvcmtzIHdlbGwgd2l0aDo8L2Rpdj5cbiAgICAgICAgICAgICAgICA8dWwgc3R5bGU9XCJtYXJnaW46MDtwYWRkaW5nLWxlZnQ6MTZweDtjb2xvcjojMDM2OWExO2xpbmUtaGVpZ2h0OjEuNztcIj48bGk+Q29tcGFueSBjYXJlZXIgcGFnZXM8L2xpPjxsaT5BbmdlbExpc3QsIFJlbW90ZU9LPC9saT48bGk+R292ZXJubWVudCAmYW1wOyB1bml2ZXJzaXR5IHNpdGVzPC9saT48L3VsPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2ZlZjNjNztib3JkZXI6MXB4IHNvbGlkICNmNTllMGI7Ym9yZGVyLXJhZGl1czo2cHg7cGFkZGluZzoxMHB4O1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDo2MDA7Y29sb3I6IzkyNDAwZTttYXJnaW4tYm90dG9tOjRweDtcIj5cdTI2QTBcdUZFMEYgQ29weSBtYW51YWxseSBmcm9tOjwvZGl2PlxuICAgICAgICAgICAgICAgIDx1bCBzdHlsZT1cIm1hcmdpbjowO3BhZGRpbmctbGVmdDoxNnB4O2NvbG9yOiM5MjQwMGU7bGluZS1oZWlnaHQ6MS43O1wiPjxsaT48c3Ryb25nPkxpbmtlZEluPC9zdHJvbmc+IChsb2dpbiByZXF1aXJlZCk8L2xpPjxsaT48c3Ryb25nPkluZGVlZDwvc3Ryb25nPiAoYW50aS1ib3QpPC9saT48bGk+PHN0cm9uZz5HbGFzc2Rvb3I8L3N0cm9uZz4gKGF1dGggcmVxdWlyZWQpPC9saT48L3VsPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LW1ldGhvZFwiIGlkPVwiZmlsZS1tZXRob2RcIj5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJmaWxlLWRyb3Atem9uZVwiXG4gICAgICAgICAgICAgICAgIG9uZHJhZ292ZXI9XCJldmVudC5wcmV2ZW50RGVmYXVsdCgpOyB0aGlzLmNsYXNzTGlzdC5hZGQoJ2RyYWctb3ZlcicpXCJcbiAgICAgICAgICAgICAgICAgb25kcmFnbGVhdmU9XCJ0aGlzLmNsYXNzTGlzdC5yZW1vdmUoJ2RyYWctb3ZlcicpXCJcbiAgICAgICAgICAgICAgICAgb25kcm9wPVwiaGFuZGxlRmlsZURyb3AoZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgb25jbGljaz1cImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqb2ItZmlsZS1pbnB1dCcpLmNsaWNrKClcIlxuICAgICAgICAgICAgICAgICBzdHlsZT1cImJvcmRlcjoycHggZGFzaGVkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzozMnB4IDE2cHg7dGV4dC1hbGlnbjpjZW50ZXI7Y3Vyc29yOnBvaW50ZXI7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kIDAuMnMsYm9yZGVyLWNvbG9yIDAuMnM7bWFyZ2luOjhweCAwO1wiPlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjJyZW07bWFyZ2luLWJvdHRvbTo4cHg7XCI+XHVEODNEXHVEQ0M0PC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+RHJvcCBhIGZpbGUgaGVyZSwgb3IgY2xpY2sgdG8gYnJvd3NlPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC44NXJlbTtjb2xvcjojNjQ3NDhiO1wiPi50eHQgJm5ic3A7XHUwMEI3Jm5ic3A7IC5tZCAmbmJzcDtcdTAwQjcmbmJzcDsgLmh0bWwgJm5ic3A7XHUwMEI3Jm5ic3A7IC5wZGYgJm5ic3A7XHUwMEI3Jm5ic3A7IC5kb2N4ICZuYnNwO1x1MDBCNyZuYnNwOyAucnRmPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIGlkPVwiam9iLWZpbGUtaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6bm9uZVwiXG4gICAgICAgICAgICAgICAgICAgYWNjZXB0PVwiLnR4dCwubWQsLnJzdCwudGV4dCwuaHRtbCwuaHRtLC5wZGYsLmRvY3gsLmRvYywucnRmXCJcbiAgICAgICAgICAgICAgICAgICBhcmlhLWRlc2NyaWJlZGJ5PVwiZmlsZS11cGxvYWQtZXJyb3JcIlxuICAgICAgICAgICAgICAgICAgIG9uY2hhbmdlPVwiaGFuZGxlRmlsZVNlbGVjdGVkKHRoaXMuZmlsZXNbMF0pXCI+XG4gICAgICAgICAgICA8ZGl2IGlkPVwiZmlsZS1zZWxlY3RlZC1pbmZvXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7bWFyZ2luOjhweCAwO1wiPlxuICAgICAgICAgICAgICA8c3BhbiBpZD1cImZpbGUtc2VsZWN0ZWQtbmFtZVwiIHN0eWxlPVwiZm9udC13ZWlnaHQ6NjAwO1wiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gaWQ9XCJmaWxlLXNlbGVjdGVkLXNpemVcIiBzdHlsZT1cImNvbG9yOiM2NDc0OGI7bWFyZ2luLWxlZnQ6OHB4O1wiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPVwiY2xlYXJTZWxlY3RlZEZpbGUoKVwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6OHB4O2JhY2tncm91bmQ6bm9uZTtib3JkZXI6bm9uZTtjdXJzb3I6cG9pbnRlcjtjb2xvcjojNjQ3NDhiO1wiPlx1MjcxNTwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGlkPVwiZmlsZS11cGxvYWQtZXJyb3JcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtjb2xvcjojYzAzOTJiO21hcmdpbjo4cHggMDtmb250LXNpemU6MC44NXJlbTtcIj48L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJmaWxlLXNpemUtd2FybmluZ1wiIHN0eWxlPVwiZGlzcGxheTpub25lO2NvbG9yOiM5MjQwMGU7YmFja2dyb3VuZDojZmVmM2M3O2JvcmRlcjoxcHggc29saWQgI2ZjZDM0ZDtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjRweCA4cHg7bWFyZ2luOjRweCAwO2ZvbnQtc2l6ZTowLjg1cmVtO1wiPjwvZGl2PlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6OHB4O21hcmdpbi10b3A6NHB4O2FsaWduLWl0ZW1zOmNlbnRlcjtcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImZpbGUtdXBsb2FkLWJ0blwiIG9uY2xpY2s9XCJ1cGxvYWRKb2JGaWxlKClcIiBjbGFzcz1cImJ0bi1wcmltYXJ5XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+XHVEODNEXHVEQ0U0IFVzZSBUaGlzIEZpbGU8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGRpdiBpZD1cImZpbGUtdXBsb2FkLXNwaW5uZXJcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtmb250LXNpemU6MC44NXJlbTtjb2xvcjojNjQ3NDhiO1wiPlx1MjNGMyBQYXJzaW5nXHUyMDI2PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgO1xuICAvLyBTaG93IG1pbmltdW0tbGVuZ3RoIGhpbnQgaW1tZWRpYXRlbHkgb24gZmlyc3QgcmVuZGVyIChHQVAtMjg4KS5cbiAgX3VwZGF0ZVBhc3RlQ2hhckNvdW50KCk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gSW5wdXQgbWV0aG9kIHN3aXRjaGluZ1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIHN3aXRjaElucHV0TWV0aG9kKG1ldGhvZCkge1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuaW5wdXQtdGFiJykuZm9yRWFjaCh0YWIgPT4gdGFiLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpKTtcbiAgZXZlbnQudGFyZ2V0LmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5pbnB1dC1tZXRob2QnKS5mb3JFYWNoKHBhbmVsID0+IHBhbmVsLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobWV0aG9kICsgJy1tZXRob2QnKS5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBGaWxlIHVwbG9hZFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmxldCBfcGVuZGluZ1VwbG9hZEZpbGUgPSBudWxsO1xuXG5mdW5jdGlvbiBoYW5kbGVGaWxlRHJvcChldmVudCkge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmlsZS1kcm9wLXpvbmUnKS5jbGFzc0xpc3QucmVtb3ZlKCdkcmFnLW92ZXInKTtcbiAgY29uc3QgZmlsZSA9IGV2ZW50LmRhdGFUcmFuc2Zlci5maWxlc1swXTtcbiAgaWYgKGZpbGUpIGhhbmRsZUZpbGVTZWxlY3RlZChmaWxlKTtcbn1cblxuZnVuY3Rpb24gaGFuZGxlRmlsZVNlbGVjdGVkKGZpbGUpIHtcbiAgaWYgKCFmaWxlKSByZXR1cm47XG5cbiAgY29uc3Qgc2l6ZU1iICA9IChmaWxlLnNpemUgLyAoMTAyNCAqIDEwMjQpKS50b0ZpeGVkKDEpO1xuICBjb25zdCBzaXplU3RyID0gZmlsZS5zaXplID4gMTAyNCAqIDEwMjQgPyBgJHtzaXplTWJ9IE1CYCA6IGAkeyhmaWxlLnNpemUgLyAxMDI0KS50b0ZpeGVkKDEpfSBLQmA7XG4gIGNvbnN0IGVyckVsICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmlsZS11cGxvYWQtZXJyb3InKTtcbiAgY29uc3Qgd2FybkVsICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlLXNpemUtd2FybmluZycpO1xuXG4gIGNvbnN0IGFsbG93ZWRNaW1lcyA9IFsnYXBwbGljYXRpb24vcGRmJywgJ2FwcGxpY2F0aW9uL21zd29yZCcsXG4gICAgJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC53b3JkcHJvY2Vzc2luZ21sLmRvY3VtZW50JyxcbiAgICAndGV4dC9wbGFpbicsICd0ZXh0L2h0bWwnXTtcbiAgY29uc3QgYWxsb3dlZEV4dHMgID0gWycucGRmJywgJy5kb2MnLCAnLmRvY3gnLCAnLnR4dCcsICcuaHRtbCcsICcuaHRtJ107XG4gIGNvbnN0IGV4dCA9ICcuJyArIChmaWxlLm5hbWUuc3BsaXQoJy4nKS5wb3AoKSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgbWltZU9rID0gYWxsb3dlZE1pbWVzLnNvbWUobSA9PiBmaWxlLnR5cGUuc3RhcnRzV2l0aChtKSkgfHwgZmlsZS50eXBlID09PSAnJztcbiAgY29uc3QgZXh0T2sgID0gYWxsb3dlZEV4dHMuaW5jbHVkZXMoZXh0KTtcbiAgaWYgKCFtaW1lT2sgJiYgIWV4dE9rKSB7XG4gICAgZXJyRWwudGV4dENvbnRlbnQgICA9IGBVbnN1cHBvcnRlZCBmaWxlIHR5cGUgXCIke2V4dCB8fCBmaWxlLnR5cGV9XCIuIFN1cHBvcnRlZCBmb3JtYXRzOiBQREYsIFdvcmQgKC5kb2MvLmRvY3gpLCBwbGFpbiB0ZXh0LCBIVE1MLmA7XG4gICAgZXJyRWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgaWYgKHdhcm5FbCkgd2FybkVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGUtdXBsb2FkLWJ0bicpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGZpbGUuc2l6ZSA+IDIwICogMTAyNCAqIDEwMjQpIHtcbiAgICBlcnJFbC50ZXh0Q29udGVudCAgID0gYEZpbGUgaXMgdG9vIGxhcmdlICgke3NpemVNYn0gTUIpLiBNYXhpbXVtIGFsbG93ZWQgc2l6ZSBpcyAyMCBNQi5gO1xuICAgIGVyckVsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgIGlmICh3YXJuRWwpIHdhcm5FbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlLXVwbG9hZC1idG4nKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIF9wZW5kaW5nVXBsb2FkRmlsZSA9IGZpbGU7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlLXNlbGVjdGVkLW5hbWUnKS50ZXh0Q29udGVudCAgPSBmaWxlLm5hbWU7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlLXNlbGVjdGVkLXNpemUnKS50ZXh0Q29udGVudCAgPSBgKCR7c2l6ZVN0cn0pYDtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGUtc2VsZWN0ZWQtaW5mbycpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmlsZS11cGxvYWQtYnRuJykuc3R5bGUuZGlzcGxheSAgICA9ICdpbmxpbmUtYmxvY2snO1xuICBlcnJFbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gIGlmICh3YXJuRWwpIHtcbiAgICBpZiAoZmlsZS5zaXplID4gNSAqIDEwMjQgKiAxMDI0KSB7XG4gICAgICB3YXJuRWwudGV4dENvbnRlbnQgICA9IGBcdTI2QTAgTGFyZ2UgZmlsZSAoJHtzaXplTWJ9IE1CKSBcdTIwMTQgcGFyc2luZyBtYXkgdGFrZSBhIG1vbWVudC5gO1xuICAgICAgd2FybkVsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgIH0gZWxzZSB7XG4gICAgICB3YXJuRWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY2xlYXJTZWxlY3RlZEZpbGUoKSB7XG4gIF9wZW5kaW5nVXBsb2FkRmlsZSA9IG51bGw7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqb2ItZmlsZS1pbnB1dCcpLnZhbHVlID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlLXNlbGVjdGVkLWluZm8nKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmlsZS11cGxvYWQtYnRuJykuc3R5bGUuZGlzcGxheSAgID0gJ25vbmUnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmlsZS11cGxvYWQtZXJyb3InKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBjb25zdCB3YXJuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGUtc2l6ZS13YXJuaW5nJyk7XG4gIGlmICh3YXJuKSB3YXJuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwbG9hZEpvYkZpbGUoKSB7XG4gIGlmICghX3BlbmRpbmdVcGxvYWRGaWxlKSByZXR1cm47XG5cbiAgY29uc3QgZXJyRWwgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlLXVwbG9hZC1lcnJvcicpO1xuICBjb25zdCBzcGlubmVyICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGUtdXBsb2FkLXNwaW5uZXInKTtcbiAgY29uc3QgdXBsb2FkQnRuICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlLXVwbG9hZC1idG4nKTtcblxuICBlcnJFbC5zdHlsZS5kaXNwbGF5ICAgID0gJ25vbmUnO1xuICBzcGlubmVyLnN0eWxlLmRpc3BsYXkgID0gJ2lubGluZSc7XG4gIHVwbG9hZEJ0bi5kaXNhYmxlZCAgICAgPSB0cnVlO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ2ZpbGUnLCBfcGVuZGluZ1VwbG9hZEZpbGUpO1xuXG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKCcvYXBpL3VwbG9hZC1maWxlJywgeyBtZXRob2Q6ICdQT1NUJywgYm9keTogZm9ybURhdGEgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3AuanNvbigpO1xuXG4gICAgaWYgKCFyZXNwLm9rIHx8IGRhdGEuZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihkYXRhLm1lc3NhZ2UgfHwgZGF0YS5lcnJvciB8fCBgU2VydmVyIGVycm9yICR7cmVzcC5zdGF0dXN9YCk7XG4gICAgfVxuXG4gICAgY29uc3Qgam9iUmVzcCA9IGF3YWl0IGZldGNoKCcvYXBpL2pvYicsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGpvYl90ZXh0OiBkYXRhLnRleHQgfSlcbiAgICB9KTtcbiAgICBjb25zdCBqb2JEYXRhID0gYXdhaXQgam9iUmVzcC5qc29uKCk7XG4gICAgaWYgKCFqb2JSZXNwLm9rKSB0aHJvdyBuZXcgRXJyb3Ioam9iRGF0YS5lcnJvciB8fCAnRmFpbGVkIHRvIHByb2Nlc3Mgam9iIGRlc2NyaXB0aW9uJyk7XG5cbiAgICBpZiAoam9iRGF0YS5lcnJvcikge1xuICAgICAgYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgJ0Vycm9yOiAnICsgam9iRGF0YS5lcnJvcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlTWFuYWdlci5zZXRUYWJEYXRhKCdqb2InLCBkYXRhLnRleHQpO1xuICAgICAgc2F2ZVRhYkRhdGEoKTtcbiAgICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIGBcdTI3MDUgSm9iIGRlc2NyaXB0aW9uIGxvYWRlZCBmcm9tIFwiJHtkYXRhLmZpbGVuYW1lfVwiICgke2RhdGEuY29udGVudF9sZW5ndGgudG9Mb2NhbGVTdHJpbmcoKX0gY2hhcnMpLmApO1xuICAgICAgYXdhaXQgYW5hbHl6ZUpvYigpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZXJyRWwudGV4dENvbnRlbnQgICA9IGVyci5tZXNzYWdlO1xuICAgIGVyckVsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICB9IGZpbmFsbHkge1xuICAgIHNwaW5uZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB1cGxvYWRCdG4uZGlzYWJsZWQgICAgPSBmYWxzZTtcbiAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFBhc3RlIHRleHQgc3VibWlzc2lvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IFBBU1RFX01JTl9DSEFSUyA9IDIwMDtcblxuZnVuY3Rpb24gX3VwZGF0ZVBhc3RlQ2hhckNvdW50KCkge1xuICBjb25zdCB2YWwgPSAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pvYi10ZXh0LWlucHV0Jyk/LnZhbHVlIHx8ICcnKS50cmltKCk7XG4gIGNvbnN0IGNvdW50RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGFzdGUtY2hhci1jb3VudCcpO1xuICBpZiAoIWNvdW50RWwpIHJldHVybjtcbiAgY29uc3QgbiA9IHZhbC5sZW5ndGg7XG4gIGlmIChuID09PSAwKSB7XG4gICAgY291bnRFbC5zdHlsZS5jb2xvciA9ICcjOTRhM2I4JztcbiAgICBjb3VudEVsLnRleHRDb250ZW50ID0gYFBhc3RlIHRoZSBmdWxsIGpvYiBkZXNjcmlwdGlvbiAobWluaW11bSAke1BBU1RFX01JTl9DSEFSU30gY2hhcmFjdGVycyBmb3IgYmVzdCByZXN1bHRzKWA7XG4gIH0gZWxzZSBpZiAobiA8IFBBU1RFX01JTl9DSEFSUykge1xuICAgIGNvdW50RWwuc3R5bGUuY29sb3IgPSAnI2VmNDQ0NCc7XG4gICAgY291bnRFbC50ZXh0Q29udGVudCA9IGAke259IC8gJHtQQVNURV9NSU5fQ0hBUlN9IG1pbmltdW0gXHUyMDE0IFRvbyBzaG9ydCwgYWltIGZvciBhdCBsZWFzdCAke1BBU1RFX01JTl9DSEFSU30gY2hhcmFjdGVyc2A7XG4gIH0gZWxzZSB7XG4gICAgY291bnRFbC5zdHlsZS5jb2xvciA9ICcjMTZhMzRhJztcbiAgICBjb3VudEVsLnRleHRDb250ZW50ID0gYCR7bn0gLyAke1BBU1RFX01JTl9DSEFSU30gbWluaW11bSBcdTI3MTNgO1xuICB9XG59XG5cbmZ1bmN0aW9uIF92YWxpZGF0ZVBhc3RlRmllbGQoKSB7XG4gIGNvbnN0IHZhbCA9IChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnam9iLXRleHQtaW5wdXQnKT8udmFsdWUgfHwgJycpLnRyaW0oKTtcbiAgX3VwZGF0ZVBhc3RlQ2hhckNvdW50KCk7XG4gIGlmICh2YWwubGVuZ3RoID4gMCAmJiB2YWwubGVuZ3RoIDwgUEFTVEVfTUlOX0NIQVJTKSB7XG4gICAgX3Nob3dGaWVsZEVycm9yKCdqb2ItdGV4dC1pbnB1dCcsICdwYXN0ZS1lcnJvcicsIGBKb2IgZGVzY3JpcHRpb24gaXMgdG9vIHNob3J0IFx1MjAxNCBwbGVhc2UgcGFzdGUgYXQgbGVhc3QgJHtQQVNURV9NSU5fQ0hBUlN9IGNoYXJhY3RlcnMuYCk7XG4gIH0gZWxzZSB7XG4gICAgX2NsZWFyRmllbGRFcnJvcignam9iLXRleHQtaW5wdXQnLCAncGFzdGUtZXJyb3InKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBzdWJtaXRKb2JUZXh0KCkge1xuICAvKiBkdWNrZmxvdzpcbiAgICogICBpZDogam9iX3VpX3N1Ym1pdF9saXZlXG4gICAqICAga2luZDogdWlcbiAgICogICB0aW1lc3RhbXA6ICcyMDI2LTAzLTMxVDEyOjQ5OjQ3WidcbiAgICogICBzdGF0dXM6IGxpdmVcbiAgICogICBoYW5kbGVzOlxuICAgKiAgIC0gdWk6am9iLWlucHV0LnN1Ym1pdC10ZXh0XG4gICAqICAgY2FsbHM6XG4gICAqICAgLSBQT1NUIC9hcGkvam9iXG4gICAqICAgLSBhbmFseXplSm9iXG4gICAqICAgcmVhZHM6XG4gICAqICAgLSBkb206I2pvYi10ZXh0LWlucHV0LnZhbHVlXG4gICAqICAgd3JpdGVzOlxuICAgKiAgIC0gcmVxdWVzdDpQT1NUIC9hcGkvam9iLmpvYl90ZXh0XG4gICAqICAgLSB0YWI6am9iXG4gICAqICAgLSB1aTp3b3JrZmxvdy5qb2JcbiAgICogICBub3RlczogU3VibWl0cyBwYXN0ZWQgam9iIHRleHQgdG8gdGhlIGJhY2tlbmQsIGNhY2hlcyB0aGUgc2FtZSB0ZXh0IGluIHRhYiBzdGF0ZSwgdGhlbiBydW5zIGFuYWx5emVKb2IoKSBzbyBhbGwgam9iIHNvdXJjZXMgc2hhcmUgdGhlIHNhbWUgYW5hbHlzaXMgYW5kIGludGFrZSBmbG93LlxuICAgKi9cbiAgY29uc3QgdGV4dElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pvYi10ZXh0LWlucHV0Jyk7XG4gIGNvbnN0IGpvYlRleHQgPSB0ZXh0SW5wdXQudmFsdWUudHJpbSgpO1xuXG4gIGlmICgham9iVGV4dCkge1xuICAgIF9zaG93RmllbGRFcnJvcignam9iLXRleHQtaW5wdXQnLCAncGFzdGUtZXJyb3InLCAnUGxlYXNlIGVudGVyIGEgam9iIGRlc2NyaXB0aW9uIGJlZm9yZSBzdWJtaXR0aW5nLicpO1xuICAgIHRleHRJbnB1dC5mb2N1cygpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoam9iVGV4dC5sZW5ndGggPCBQQVNURV9NSU5fQ0hBUlMpIHtcbiAgICBfc2hvd0ZpZWxkRXJyb3IoJ2pvYi10ZXh0LWlucHV0JywgJ3Bhc3RlLWVycm9yJywgYEpvYiBkZXNjcmlwdGlvbiBpcyB0b28gc2hvcnQgXHUyMDE0IHBsZWFzZSBwYXN0ZSBhdCBsZWFzdCAke1BBU1RFX01JTl9DSEFSU30gY2hhcmFjdGVycy5gKTtcbiAgICB0ZXh0SW5wdXQuZm9jdXMoKTtcbiAgICByZXR1cm47XG4gIH1cbiAgX2NsZWFyRmllbGRFcnJvcignam9iLXRleHQtaW5wdXQnLCAncGFzdGUtZXJyb3InKTtcblxuICBzZXRMb2FkaW5nKHRydWUsICdBbmFseXNpbmcgam9iIGRlc2NyaXB0aW9uXHUyMDI2Jyk7XG4gIGFwcGVuZE1lc3NhZ2UoJ3VzZXInLCAnU3VibWl0dGluZyBqb2IgZGVzY3JpcHRpb24uLi4nKTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvam9iJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgam9iX3RleHQ6IGpvYlRleHQgfSlcbiAgICB9KTtcblxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICBpZiAoZGF0YS5lcnJvcikge1xuICAgICAgX3Nob3dGaWVsZEVycm9yKCdqb2ItdGV4dC1pbnB1dCcsICdwYXN0ZS1lcnJvcicsIGRhdGEuZXJyb3IpO1xuICAgICAgYXBwZW5kUmV0cnlNZXNzYWdlKCdcdTI3NEMgRXJyb3I6ICcgKyBkYXRhLmVycm9yLCBzdWJtaXRKb2JUZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgX2NsZWFyRmllbGRFcnJvcignam9iLXRleHQtaW5wdXQnLCAncGFzdGUtZXJyb3InKTtcbiAgICAgIHN0YXRlTWFuYWdlci5zZXRUYWJEYXRhKCdqb2InLCBqb2JUZXh0KTtcbiAgICAgIHNhdmVUYWJEYXRhKCk7XG4gICAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCAnXHUyNzA1IEpvYiBkZXNjcmlwdGlvbiBzdWJtaXR0ZWQgc3VjY2Vzc2Z1bGx5LicpO1xuXG4gICAgICBpZiAodHlwZW9mIHVwZGF0ZVRhYkJhckZvclN0YWdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHVwZGF0ZVRhYkJhckZvclN0YWdlKCdqb2InKTtcbiAgICAgIH1cbiAgICAgIHN3aXRjaFRhYignam9iJyk7XG4gICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICAgIGF3YWl0IGFuYWx5emVKb2IoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nLmVycm9yKCdFcnJvciBzdWJtaXR0aW5nIGpvYjonLCBlcnJvcik7XG4gICAgYXBwZW5kUmV0cnlNZXNzYWdlKCdcdTI3NEMgRXJyb3Igc3VibWl0dGluZyBqb2IgZGVzY3JpcHRpb246ICcgKyBlcnJvci5tZXNzYWdlLCBzdWJtaXRKb2JUZXh0KTtcbiAgfVxuXG4gIHNldExvYWRpbmcoZmFsc2UpO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFVSTCBmZXRjaFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIF92YWxpZGF0ZVVSTEZpZWxkKCkge1xuICBjb25zdCB2YWwgPSAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pvYi11cmwtaW5wdXQnKT8udmFsdWUgfHwgJycpLnRyaW0oKTtcbiAgaWYgKCF2YWwpIHsgX2NsZWFyRmllbGRFcnJvcignam9iLXVybC1pbnB1dCcsICd1cmwtZXJyb3InKTsgcmV0dXJuOyB9XG4gIHRyeSB7XG4gICAgY29uc3QgdSA9IG5ldyBVUkwodmFsKTtcbiAgICBpZiAoIVsnaHR0cDonLCAnaHR0cHM6J10uaW5jbHVkZXModS5wcm90b2NvbCkpIHRocm93IG5ldyBFcnJvcignUHJvdG9jb2wgbm90IGh0dHAvaHR0cHMnKTtcbiAgICBfY2xlYXJGaWVsZEVycm9yKCdqb2ItdXJsLWlucHV0JywgJ3VybC1lcnJvcicpO1xuICB9IGNhdGNoIHtcbiAgICBfc2hvd0ZpZWxkRXJyb3IoJ2pvYi11cmwtaW5wdXQnLCAndXJsLWVycm9yJywgJ1BsZWFzZSBlbnRlciBhIHZhbGlkIFVSTCBzdGFydGluZyB3aXRoIGh0dHBzOi8vIG9yIGh0dHA6Ly8nKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaEpvYkZyb21VUkwoKSB7XG4gIGNvbnN0IHVybElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pvYi11cmwtaW5wdXQnKTtcbiAgY29uc3QgdXJsID0gdXJsSW5wdXQudmFsdWUudHJpbSgpO1xuXG4gIGlmICghdXJsKSB7XG4gICAgX3Nob3dGaWVsZEVycm9yKCdqb2ItdXJsLWlucHV0JywgJ3VybC1lcnJvcicsICdQbGVhc2UgZW50ZXIgYSBVUkwgYmVmb3JlIGZldGNoaW5nLicpO1xuICAgIHVybElucHV0LmZvY3VzKCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgdSA9IG5ldyBVUkwodXJsKTtcbiAgICBpZiAoIVsnaHR0cDonLCAnaHR0cHM6J10uaW5jbHVkZXModS5wcm90b2NvbCkpIHRocm93IG5ldyBFcnJvcigpO1xuICAgIF9jbGVhckZpZWxkRXJyb3IoJ2pvYi11cmwtaW5wdXQnLCAndXJsLWVycm9yJyk7XG4gIH0gY2F0Y2gge1xuICAgIF9zaG93RmllbGRFcnJvcignam9iLXVybC1pbnB1dCcsICd1cmwtZXJyb3InLCAnUGxlYXNlIGVudGVyIGEgdmFsaWQgVVJMIHN0YXJ0aW5nIHdpdGggaHR0cHM6Ly8gb3IgaHR0cDovLycpO1xuICAgIHVybElucHV0LmZvY3VzKCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgc2V0TG9hZGluZyh0cnVlLCAnRmV0Y2hpbmcgam9iIGZyb20gVVJMXHUyMDI2Jyk7XG4gIGFwcGVuZE1lc3NhZ2UoJ3VzZXInLCBgRmV0Y2hpbmcgam9iIGRlc2NyaXB0aW9uIGZyb20gVVJMOiAke3VybH1gKTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvZmV0Y2gtam9iLXVybCcsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHVybDogdXJsIH0pXG4gICAgfSk7XG5cbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXG4gICAgaWYgKGRhdGEuZXJyb3IpIHtcbiAgICAgIGxldCBlcnJvck1lc3NhZ2UgPSBkYXRhLmVycm9yO1xuICAgICAgbGV0IGhlbHBNZXNzYWdlID0gZGF0YS5tZXNzYWdlIHx8ICcnO1xuXG4gICAgICBpZiAoZGF0YS5wcm90ZWN0ZWRfc2l0ZSkge1xuICAgICAgICBlcnJvck1lc3NhZ2UgPSBgJHtkYXRhLnNpdGVfbmFtZX0gUHJvdGVjdGlvbiBEZXRlY3RlZGA7XG4gICAgICAgIGhlbHBNZXNzYWdlID0gZGF0YS5tZXNzYWdlO1xuXG4gICAgICAgIGlmIChkYXRhLmluc3RydWN0aW9ucyAmJiBkYXRhLmluc3RydWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgaGVscE1lc3NhZ2UgKz0gJ1xcblxcbkhvdyB0byBwcm9jZWVkOlxcbicgKyBkYXRhLmluc3RydWN0aW9ucy5tYXAoKGluc3QsIGkpID0+IGAke2kgKyAxfS4gJHtpbnN0fWApLmpvaW4oJ1xcbicpO1xuICAgICAgICB9XG5cbiAgICAgICAgc2hvd1Byb3RlY3RlZFNpdGVNb2RhbChkYXRhLnNpdGVfbmFtZSwgZGF0YS5tZXNzYWdlLCBkYXRhLmluc3RydWN0aW9ucyk7XG4gICAgICB9IGVsc2UgaWYgKGRhdGEuaW5zdHJ1Y3Rpb25zKSB7XG4gICAgICAgIGhlbHBNZXNzYWdlICs9ICdcXG5cXG5TdWdnZXN0ZWQgc29sdXRpb25zOlxcbicgKyBkYXRhLmluc3RydWN0aW9ucy5tYXAoKGluc3QsIGkpID0+IGAke2kgKyAxfS4gJHtpbnN0fWApLmpvaW4oJ1xcbicpO1xuICAgICAgICBzaG93QWxlcnRNb2RhbCgnVVJMIEZldGNoIEVycm9yJywgYCR7ZXJyb3JNZXNzYWdlfVxcblxcbiR7aGVscE1lc3NhZ2V9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfc2hvd0ZpZWxkRXJyb3IoJ2pvYi11cmwtaW5wdXQnLCAndXJsLWVycm9yJywgZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgc2hvd0FsZXJ0TW9kYWwoJ0Vycm9yJywgYCR7ZXJyb3JNZXNzYWdlfSR7aGVscE1lc3NhZ2UgPyAnXFxuXFxuJyArIGhlbHBNZXNzYWdlIDogJyd9YCk7XG4gICAgICB9XG5cbiAgICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsIGBcdTI3NEMgJHtlcnJvck1lc3NhZ2V9OiAke2RhdGEubWVzc2FnZSB8fCAnUGxlYXNlIHRyeSBtYW51YWwgaW5wdXQuJ31gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGVNYW5hZ2VyLnNldFRhYkRhdGEoJ2pvYicsIGRhdGEuam9iX3RleHQpO1xuICAgICAgc2F2ZVRhYkRhdGEoKTtcbiAgICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIGBcdTI3MDUgJHtkYXRhLm1lc3NhZ2V9ISBGZXRjaGVkICR7ZGF0YS5jb250ZW50X2xlbmd0aCB8fCAnY29udGVudCd9IGNoYXJhY3RlcnMuIFJldmlldyB0aGUgam9iIGRlc2NyaXB0aW9uIGJlbG93LCB0aGVuIGNsaWNrIFwiXHVEODNEXHVERDBEIEFuYWx5c2UgSm9iXCIgdG8gY29udGludWUuYCk7XG4gICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICAgIHN3aXRjaFRhYignam9iJyk7XG4gICAgICBhd2FpdCBwb3B1bGF0ZUpvYlRhYigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cuZXJyb3IoJ0Vycm9yIGZldGNoaW5nIFVSTDonLCBlcnJvcik7XG4gICAgX3Nob3dGaWVsZEVycm9yKCdqb2ItdXJsLWlucHV0JywgJ3VybC1lcnJvcicsIGBOZXR3b3JrIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgYXBwZW5kUmV0cnlNZXNzYWdlKGBOZXR3b3JrIGVycm9yIG9jY3VycmVkOiAke2Vycm9yLm1lc3NhZ2V9LiBQbGVhc2UgY2hlY2sgeW91ciBjb25uZWN0aW9uIG9yIHRyeSBtYW51YWwgaW5wdXQuYCwgZmV0Y2hKb2JGcm9tVVJMKTtcbiAgICBzaG93QWxlcnRNb2RhbCgnTmV0d29yayBFcnJvcicsICdVbmFibGUgdG8gY29ubmVjdCB0byB0aGUgc2VydmVyLiBQbGVhc2UgdHJ5IGFnYWluIG9yIHVzZSB0aGUgXCJQYXN0ZSBUZXh0XCIgb3B0aW9uIHRvIGlucHV0IHRoZSBqb2IgZGVzY3JpcHRpb24gbWFudWFsbHkuJyk7XG4gIH1cblxuICBzZXRMb2FkaW5nKGZhbHNlKTtcbn1cblxuZnVuY3Rpb24gc2hvd1Byb3RlY3RlZFNpdGVNb2RhbChzaXRlTmFtZSwgbWVzc2FnZSwgaW5zdHJ1Y3Rpb25zKSB7XG4gIGxldCBpbnN0cnVjdGlvbnNMaXN0ID0gJyc7XG4gIGlmIChpbnN0cnVjdGlvbnMgJiYgaW5zdHJ1Y3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICBpbnN0cnVjdGlvbnNMaXN0ID0gJzxvbCBzdHlsZT1cIm1hcmdpbjogMTZweCAwOyBwYWRkaW5nLWxlZnQ6IDIwcHg7XCI+JyArXG4gICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zLm1hcChpbnN0ID0+IGA8bGkgc3R5bGU9XCJtYXJnaW46IDhweCAwO1wiPiR7aW5zdH08L2xpPmApLmpvaW4oJycpICtcbiAgICAgICAgICAgICAgICAgICAgICAnPC9vbD4nO1xuICB9XG5cbiAgY29uc3Qgc2FmZU5hbWUgPSBlc2NhcGVIdG1sKHNpdGVOYW1lKTtcbiAgY29uc3Qgc2FmZU1lc3NhZ2UgPSBlc2NhcGVIdG1sKG1lc3NhZ2UpO1xuICBjb25zdCBtb2RhbENvbnRlbnQgPSBgXG4gICAgPGRpdiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjsgbWFyZ2luLWJvdHRvbTogMTZweDtcIj5cbiAgICAgIFx1RDgzRFx1REQxMiA8c3Ryb25nPiR7c2FmZU5hbWV9IHJlcXVpcmVzIG1hbnVhbCBpbnB1dDwvc3Ryb25nPlxuICAgIDwvZGl2PlxuICAgIDxwPiR7c2FmZU1lc3NhZ2V9PC9wPlxuICAgICR7aW5zdHJ1Y3Rpb25zTGlzdH1cbiAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMjBweDsgcGFkZGluZzogMTJweDsgYmFja2dyb3VuZDogI2YwZjlmZjsgYm9yZGVyOiAxcHggc29saWQgIzBlYTVlOTsgYm9yZGVyLXJhZGl1czogNnB4O1wiPlxuICAgICAgPHN0cm9uZz5cdUQ4M0RcdURDQTEgVGlwOjwvc3Ryb25nPiBBZnRlciBjb3B5aW5nIHRoZSBqb2IgZGVzY3JpcHRpb24sIGNsaWNrIHRoZSBcIlBhc3RlIFRleHRcIiB0YWIgYWJvdmUgdG8gc3VibWl0IGl0IGRpcmVjdGx5LlxuICAgIDwvZGl2PlxuICBgO1xuXG4gIHNob3dBbGVydE1vZGFsKGAke3NhZmVOYW1lfSBJbnB1dCBSZXF1aXJlZGAsIG1vZGFsQ29udGVudCk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ2xlYXIgaGVscGVyc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIGNsZWFySm9iSW5wdXQoKSB7XG4gIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pvYi10ZXh0LWlucHV0Jyk7XG4gIGlmIChlbCkgZWwudmFsdWUgPSAnJztcbn1cblxuZnVuY3Rpb24gY2xlYXJVUkxJbnB1dCgpIHtcbiAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnam9iLXVybC1pbnB1dCcpO1xuICBpZiAoZWwpIGVsLnZhbHVlID0gJyc7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRmllbGQgZXJyb3IgaGVscGVyc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIF9zaG93RmllbGRFcnJvcihpbnB1dElkLCBlcnJvcklkLCBtc2cpIHtcbiAgY29uc3QgaW5wICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlucHV0SWQpO1xuICBjb25zdCBzcGFuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZXJyb3JJZCk7XG4gIGlmIChzcGFuKSAgeyBzcGFuLnRleHRDb250ZW50ID0gbXNnOyBzcGFuLmNsYXNzTGlzdC5hZGQoJ3Zpc2libGUnKTsgfVxuICBpZiAoaW5wKSAgIHtcbiAgICBpbnAuY2xhc3NMaXN0LmFkZCgnZmllbGQtaW52YWxpZCcpO1xuICAgIGlucC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaW52YWxpZCcsICd0cnVlJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2NsZWFyRmllbGRFcnJvcihpbnB1dElkLCBlcnJvcklkKSB7XG4gIGNvbnN0IGlucCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpbnB1dElkKTtcbiAgY29uc3Qgc3BhbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVycm9ySWQpO1xuICBpZiAoc3BhbikgIHsgc3Bhbi50ZXh0Q29udGVudCA9ICcnOyBzcGFuLmNsYXNzTGlzdC5yZW1vdmUoJ3Zpc2libGUnKTsgfVxuICBpZiAoaW5wKSAgIHtcbiAgICBpbnAuY2xhc3NMaXN0LnJlbW92ZSgnZmllbGQtaW52YWxpZCcpO1xuICAgIGlucC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaW52YWxpZCcsICdmYWxzZScpO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFUyBtb2R1bGUgZXhwb3J0cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmV4cG9ydCB7XG4gIHBvcHVsYXRlSm9iVGFiLFxuICBzaG93TG9hZEpvYlBhbmVsLFxuICBzd2l0Y2hJbnB1dE1ldGhvZCxcbiAgX3BlbmRpbmdVcGxvYWRGaWxlLFxuICBoYW5kbGVGaWxlRHJvcCxcbiAgaGFuZGxlRmlsZVNlbGVjdGVkLFxuICBjbGVhclNlbGVjdGVkRmlsZSxcbiAgdXBsb2FkSm9iRmlsZSxcbiAgUEFTVEVfTUlOX0NIQVJTLFxuICBfdXBkYXRlUGFzdGVDaGFyQ291bnQsXG4gIF92YWxpZGF0ZVBhc3RlRmllbGQsXG4gIHN1Ym1pdEpvYlRleHQsXG4gIF92YWxpZGF0ZVVSTEZpZWxkLFxuICBmZXRjaEpvYkZyb21VUkwsXG4gIHNob3dQcm90ZWN0ZWRTaXRlTW9kYWwsXG4gIGNsZWFySm9iSW5wdXQsXG4gIGNsZWFyVVJMSW5wdXQsXG4gIF9zaG93RmllbGRFcnJvcixcbiAgX2NsZWFyRmllbGRFcnJvcixcbn07XG4iLCAiaW1wb3J0IHR5cGUgeyBNYXJrZWRPcHRpb25zIH0gZnJvbSAnLi9NYXJrZWRPcHRpb25zLnRzJztcblxuLyoqXG4gKiBHZXRzIHRoZSBvcmlnaW5hbCBtYXJrZWQgZGVmYXVsdCBvcHRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gX2dldERlZmF1bHRzPFBhcnNlck91dHB1dCA9IHN0cmluZywgUmVuZGVyZXJPdXRwdXQgPSBzdHJpbmc+KCk6IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4ge1xuICByZXR1cm4ge1xuICAgIGFzeW5jOiBmYWxzZSxcbiAgICBicmVha3M6IGZhbHNlLFxuICAgIGV4dGVuc2lvbnM6IG51bGwsXG4gICAgZ2ZtOiB0cnVlLFxuICAgIGhvb2tzOiBudWxsLFxuICAgIHBlZGFudGljOiBmYWxzZSxcbiAgICByZW5kZXJlcjogbnVsbCxcbiAgICBzaWxlbnQ6IGZhbHNlLFxuICAgIHRva2VuaXplcjogbnVsbCxcbiAgICB3YWxrVG9rZW5zOiBudWxsLFxuICB9O1xufVxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBsZXQgX2RlZmF1bHRzOiBNYXJrZWRPcHRpb25zPGFueSwgYW55PiA9IF9nZXREZWZhdWx0cygpO1xuXG5leHBvcnQgZnVuY3Rpb24gY2hhbmdlRGVmYXVsdHM8UGFyc2VyT3V0cHV0ID0gc3RyaW5nLCBSZW5kZXJlck91dHB1dCA9IHN0cmluZz4obmV3RGVmYXVsdHM6IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4pIHtcbiAgX2RlZmF1bHRzID0gbmV3RGVmYXVsdHM7XG59XG4iLCAiY29uc3Qgbm9vcFRlc3QgPSB7IGV4ZWM6ICgpID0+IG51bGwgfSBhcyB1bmtub3duIGFzIFJlZ0V4cDtcblxuZnVuY3Rpb24gZWRpdChyZWdleDogc3RyaW5nIHwgUmVnRXhwLCBvcHQgPSAnJykge1xuICBsZXQgc291cmNlID0gdHlwZW9mIHJlZ2V4ID09PSAnc3RyaW5nJyA/IHJlZ2V4IDogcmVnZXguc291cmNlO1xuICBjb25zdCBvYmogPSB7XG4gICAgcmVwbGFjZTogKG5hbWU6IHN0cmluZyB8IFJlZ0V4cCwgdmFsOiBzdHJpbmcgfCBSZWdFeHApID0+IHtcbiAgICAgIGxldCB2YWxTb3VyY2UgPSB0eXBlb2YgdmFsID09PSAnc3RyaW5nJyA/IHZhbCA6IHZhbC5zb3VyY2U7XG4gICAgICB2YWxTb3VyY2UgPSB2YWxTb3VyY2UucmVwbGFjZShvdGhlci5jYXJldCwgJyQxJyk7XG4gICAgICBzb3VyY2UgPSBzb3VyY2UucmVwbGFjZShuYW1lLCB2YWxTb3VyY2UpO1xuICAgICAgcmV0dXJuIG9iajtcbiAgICB9LFxuICAgIGdldFJlZ2V4OiAoKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IFJlZ0V4cChzb3VyY2UsIG9wdCk7XG4gICAgfSxcbiAgfTtcbiAgcmV0dXJuIG9iajtcbn1cblxuY29uc3Qgc3VwcG9ydHNMb29rYmVoaW5kID0gKCgpID0+IHtcbnRyeSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItcmVnZXgtbGl0ZXJhbHNcbiAgcmV0dXJuICEhbmV3IFJlZ0V4cCgnKD88PTEpKD88ITEpJyk7XG59IGNhdGNoIHtcbiAgLy8gU2VlIGJyb3dzZXIgc3VwcG9ydCBoZXJlOlxuICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9SZWd1bGFyX2V4cHJlc3Npb25zL0xvb2tiZWhpbmRfYXNzZXJ0aW9uXG4gIHJldHVybiBmYWxzZTtcbn1cbn0pKCk7XG5cbmV4cG9ydCBjb25zdCBvdGhlciA9IHtcbiAgY29kZVJlbW92ZUluZGVudDogL14oPzogezEsNH18IHswLDN9XFx0KS9nbSxcbiAgb3V0cHV0TGlua1JlcGxhY2U6IC9cXFxcKFtcXFtcXF1dKS9nLFxuICBpbmRlbnRDb2RlQ29tcGVuc2F0aW9uOiAvXihcXHMrKSg/OmBgYCkvLFxuICBiZWdpbm5pbmdTcGFjZTogL15cXHMrLyxcbiAgZW5kaW5nSGFzaDogLyMkLyxcbiAgc3RhcnRpbmdTcGFjZUNoYXI6IC9eIC8sXG4gIGVuZGluZ1NwYWNlQ2hhcjogLyAkLyxcbiAgbm9uU3BhY2VDaGFyOiAvW14gXS8sXG4gIG5ld0xpbmVDaGFyR2xvYmFsOiAvXFxuL2csXG4gIHRhYkNoYXJHbG9iYWw6IC9cXHQvZyxcbiAgbXVsdGlwbGVTcGFjZUdsb2JhbDogL1xccysvZyxcbiAgYmxhbmtMaW5lOiAvXlsgXFx0XSokLyxcbiAgZG91YmxlQmxhbmtMaW5lOiAvXFxuWyBcXHRdKlxcblsgXFx0XSokLyxcbiAgYmxvY2txdW90ZVN0YXJ0OiAvXiB7MCwzfT4vLFxuICBibG9ja3F1b3RlU2V0ZXh0UmVwbGFjZTogL1xcbiB7MCwzfSgoPzo9K3wtKykgKikoPz1cXG58JCkvZyxcbiAgYmxvY2txdW90ZVNldGV4dFJlcGxhY2UyOiAvXiB7MCwzfT5bIFxcdF0/L2dtLFxuICBsaXN0UmVwbGFjZU5lc3Rpbmc6IC9eIHsxLDR9KD89KCB7NH0pKlteIF0pL2csXG4gIGxpc3RJc1Rhc2s6IC9eXFxbWyB4WF1cXF0gK1xcUy8sXG4gIGxpc3RSZXBsYWNlVGFzazogL15cXFtbIHhYXVxcXSArLyxcbiAgbGlzdFRhc2tDaGVja2JveDogL1xcW1sgeFhdXFxdLyxcbiAgYW55TGluZTogL1xcbi4qXFxuLyxcbiAgaHJlZkJyYWNrZXRzOiAvXjwoLiopPiQvLFxuICB0YWJsZURlbGltaXRlcjogL1s6fF0vLFxuICB0YWJsZUFsaWduQ2hhcnM6IC9eXFx8fFxcfCAqJC9nLFxuICB0YWJsZVJvd0JsYW5rTGluZTogL1xcblsgXFx0XSokLyxcbiAgdGFibGVBbGlnblJpZ2h0OiAvXiAqLSs6ICokLyxcbiAgdGFibGVBbGlnbkNlbnRlcjogL14gKjotKzogKiQvLFxuICB0YWJsZUFsaWduTGVmdDogL14gKjotKyAqJC8sXG4gIHN0YXJ0QVRhZzogL148YSAvaSxcbiAgZW5kQVRhZzogL148XFwvYT4vaSxcbiAgc3RhcnRQcmVTY3JpcHRUYWc6IC9ePChwcmV8Y29kZXxrYmR8c2NyaXB0KShcXHN8PikvaSxcbiAgZW5kUHJlU2NyaXB0VGFnOiAvXjxcXC8ocHJlfGNvZGV8a2JkfHNjcmlwdCkoXFxzfD4pL2ksXG4gIHN0YXJ0QW5nbGVCcmFja2V0OiAvXjwvLFxuICBlbmRBbmdsZUJyYWNrZXQ6IC8+JC8sXG4gIHBlZGFudGljSHJlZlRpdGxlOiAvXihbXidcIl0qW15cXHNdKVxccysoWydcIl0pKC4qKVxcMi8sXG4gIHVuaWNvZGVBbHBoYU51bWVyaWM6IC9bXFxwe0x9XFxwe059XS91LFxuICBlc2NhcGVUZXN0OiAvWyY8PlwiJ10vLFxuICBlc2NhcGVSZXBsYWNlOiAvWyY8PlwiJ10vZyxcbiAgZXNjYXBlVGVzdE5vRW5jb2RlOiAvWzw+XCInXXwmKD8hKCNcXGR7MSw3fXwjW1h4XVthLWZBLUYwLTldezEsNn18XFx3Kyk7KS8sXG4gIGVzY2FwZVJlcGxhY2VOb0VuY29kZTogL1s8PlwiJ118Jig/ISgjXFxkezEsN318I1tYeF1bYS1mQS1GMC05XXsxLDZ9fFxcdyspOykvZyxcbiAgY2FyZXQ6IC8oXnxbXlxcW10pXFxeL2csXG4gIHBlcmNlbnREZWNvZGU6IC8lMjUvZyxcbiAgZmluZFBpcGU6IC9cXHwvZyxcbiAgc3BsaXRQaXBlOiAvIFxcfC8sXG4gIHNsYXNoUGlwZTogL1xcXFxcXHwvZyxcbiAgY2FycmlhZ2VSZXR1cm46IC9cXHJcXG58XFxyL2csXG4gIHNwYWNlTGluZTogL14gKyQvZ20sXG4gIG5vdFNwYWNlU3RhcnQ6IC9eXFxTKi8sXG4gIGVuZGluZ05ld2xpbmU6IC9cXG4kLyxcbiAgbGlzdEl0ZW1SZWdleDogKGJ1bGw6IHN0cmluZykgPT4gbmV3IFJlZ0V4cChgXiggezAsM30ke2J1bGx9KSgoPzpbXFx0IF1bXlxcXFxuXSopPyg/OlxcXFxufCQpKWApLFxuICBuZXh0QnVsbGV0UmVnZXg6IChpbmRlbnQ6IG51bWJlcikgPT4gbmV3IFJlZ0V4cChgXiB7MCwke01hdGgubWluKDMsIGluZGVudCAtIDEpfX0oPzpbKistXXxcXFxcZHsxLDl9Wy4pXSkoKD86WyBcXHRdW15cXFxcbl0qKT8oPzpcXFxcbnwkKSlgKSxcbiAgaHJSZWdleDogKGluZGVudDogbnVtYmVyKSA9PiBuZXcgUmVnRXhwKGBeIHswLCR7TWF0aC5taW4oMywgaW5kZW50IC0gMSl9fSgoPzotICopezMsfXwoPzpfICopezMsfXwoPzpcXFxcKiAqKXszLH0pKD86XFxcXG4rfCQpYCksXG4gIGZlbmNlc0JlZ2luUmVnZXg6IChpbmRlbnQ6IG51bWJlcikgPT4gbmV3IFJlZ0V4cChgXiB7MCwke01hdGgubWluKDMsIGluZGVudCAtIDEpfX0oPzpcXGBcXGBcXGB8fn5+KWApLFxuICBoZWFkaW5nQmVnaW5SZWdleDogKGluZGVudDogbnVtYmVyKSA9PiBuZXcgUmVnRXhwKGBeIHswLCR7TWF0aC5taW4oMywgaW5kZW50IC0gMSl9fSNgKSxcbiAgaHRtbEJlZ2luUmVnZXg6IChpbmRlbnQ6IG51bWJlcikgPT4gbmV3IFJlZ0V4cChgXiB7MCwke01hdGgubWluKDMsIGluZGVudCAtIDEpfX08KD86W2Etel0uKj58IS0tKWAsICdpJyksXG4gIGJsb2NrcXVvdGVCZWdpblJlZ2V4OiAoaW5kZW50OiBudW1iZXIpID0+IG5ldyBSZWdFeHAoYF4gezAsJHtNYXRoLm1pbigzLCBpbmRlbnQgLSAxKX19PmApLFxufTtcblxuLyoqXG4gKiBCbG9jay1MZXZlbCBHcmFtbWFyXG4gKi9cblxuY29uc3QgbmV3bGluZSA9IC9eKD86WyBcXHRdKig/OlxcbnwkKSkrLztcbmNvbnN0IGJsb2NrQ29kZSA9IC9eKCg/OiB7NH18IHswLDN9XFx0KVteXFxuXSsoPzpcXG4oPzpbIFxcdF0qKD86XFxufCQpKSopPykrLztcbmNvbnN0IGZlbmNlcyA9IC9eIHswLDN9KGB7Myx9KD89W15gXFxuXSooPzpcXG58JCkpfH57Myx9KShbXlxcbl0qKSg/OlxcbnwkKSg/OnwoW1xcc1xcU10qPykoPzpcXG58JCkpKD86IHswLDN9XFwxW35gXSogKig/PVxcbnwkKXwkKS87XG5jb25zdCBociA9IC9eIHswLDN9KCg/Oi1bXFx0IF0qKXszLH18KD86X1sgXFx0XSopezMsfXwoPzpcXCpbIFxcdF0qKXszLH0pKD86XFxuK3wkKS87XG5jb25zdCBoZWFkaW5nID0gL14gezAsM30oI3sxLDZ9KSg/PVxcc3wkKSguKikoPzpcXG4rfCQpLztcbmNvbnN0IGJ1bGxldCA9IC8gezAsM30oPzpbKistXXxcXGR7MSw5fVsuKV0pLztcbmNvbnN0IGxoZWFkaW5nQ29yZSA9IC9eKD8hYnVsbCB8YmxvY2tDb2RlfGZlbmNlc3xibG9ja3F1b3RlfGhlYWRpbmd8aHRtbHx0YWJsZSkoKD86LnxcXG4oPyFcXHMqP1xcbnxidWxsIHxibG9ja0NvZGV8ZmVuY2VzfGJsb2NrcXVvdGV8aGVhZGluZ3xodG1sfHRhYmxlKSkrPylcXG4gezAsM30oPSt8LSspICooPzpcXG4rfCQpLztcbmNvbnN0IGxoZWFkaW5nID0gZWRpdChsaGVhZGluZ0NvcmUpXG4gIC5yZXBsYWNlKC9idWxsL2csIGJ1bGxldCkgLy8gbGlzdHMgY2FuIGludGVycnVwdFxuICAucmVwbGFjZSgvYmxvY2tDb2RlL2csIC8oPzogezR9fCB7MCwzfVxcdCkvKSAvLyBpbmRlbnRlZCBjb2RlIGJsb2NrcyBjYW4gaW50ZXJydXB0XG4gIC5yZXBsYWNlKC9mZW5jZXMvZywgLyB7MCwzfSg/OmB7Myx9fH57Myx9KS8pIC8vIGZlbmNlZCBjb2RlIGJsb2NrcyBjYW4gaW50ZXJydXB0XG4gIC5yZXBsYWNlKC9ibG9ja3F1b3RlL2csIC8gezAsM30+LykgLy8gYmxvY2txdW90ZSBjYW4gaW50ZXJydXB0XG4gIC5yZXBsYWNlKC9oZWFkaW5nL2csIC8gezAsM30jezEsNn0vKSAvLyBBVFggaGVhZGluZyBjYW4gaW50ZXJydXB0XG4gIC5yZXBsYWNlKC9odG1sL2csIC8gezAsM308W15cXG4+XSs+XFxuLykgLy8gYmxvY2sgaHRtbCBjYW4gaW50ZXJydXB0XG4gIC5yZXBsYWNlKC9cXHx0YWJsZS9nLCAnJykgLy8gdGFibGUgbm90IGluIGNvbW1vbm1hcmtcbiAgLmdldFJlZ2V4KCk7XG5jb25zdCBsaGVhZGluZ0dmbSA9IGVkaXQobGhlYWRpbmdDb3JlKVxuICAucmVwbGFjZSgvYnVsbC9nLCBidWxsZXQpIC8vIGxpc3RzIGNhbiBpbnRlcnJ1cHRcbiAgLnJlcGxhY2UoL2Jsb2NrQ29kZS9nLCAvKD86IHs0fXwgezAsM31cXHQpLykgLy8gaW5kZW50ZWQgY29kZSBibG9ja3MgY2FuIGludGVycnVwdFxuICAucmVwbGFjZSgvZmVuY2VzL2csIC8gezAsM30oPzpgezMsfXx+ezMsfSkvKSAvLyBmZW5jZWQgY29kZSBibG9ja3MgY2FuIGludGVycnVwdFxuICAucmVwbGFjZSgvYmxvY2txdW90ZS9nLCAvIHswLDN9Pi8pIC8vIGJsb2NrcXVvdGUgY2FuIGludGVycnVwdFxuICAucmVwbGFjZSgvaGVhZGluZy9nLCAvIHswLDN9I3sxLDZ9LykgLy8gQVRYIGhlYWRpbmcgY2FuIGludGVycnVwdFxuICAucmVwbGFjZSgvaHRtbC9nLCAvIHswLDN9PFteXFxuPl0rPlxcbi8pIC8vIGJsb2NrIGh0bWwgY2FuIGludGVycnVwdFxuICAucmVwbGFjZSgvdGFibGUvZywgLyB7MCwzfVxcfD8oPzpbOlxcLSBdKlxcfCkrW1xcOlxcLSBdKlxcbi8pIC8vIHRhYmxlIGNhbiBpbnRlcnJ1cHRcbiAgLmdldFJlZ2V4KCk7XG5jb25zdCBfcGFyYWdyYXBoID0gL14oW15cXG5dKyg/Olxcbig/IWhyfGhlYWRpbmd8bGhlYWRpbmd8YmxvY2txdW90ZXxmZW5jZXN8bGlzdHxodG1sfHRhYmxlfCArXFxuKVteXFxuXSspKikvO1xuY29uc3QgYmxvY2tUZXh0ID0gL15bXlxcbl0rLztcbmNvbnN0IF9ibG9ja0xhYmVsID0gLyg/IVxccypcXF0pKD86XFxcXFtcXHNcXFNdfFteXFxbXFxdXFxcXF0pKy87XG5jb25zdCBkZWYgPSBlZGl0KC9eIHswLDN9XFxbKGxhYmVsKVxcXTogKig/OlxcblsgXFx0XSopPyhbXjxcXHNdW15cXHNdKnw8Lio/PikoPzooPzogKyg/OlxcblsgXFx0XSopP3wgKlxcblsgXFx0XSopKHRpdGxlKSk/ICooPzpcXG4rfCQpLylcbiAgLnJlcGxhY2UoJ2xhYmVsJywgX2Jsb2NrTGFiZWwpXG4gIC5yZXBsYWNlKCd0aXRsZScsIC8oPzpcIig/OlxcXFxcIj98W15cIlxcXFxdKSpcInwnW14nXFxuXSooPzpcXG5bXidcXG5dKykqXFxuPyd8XFwoW14oKV0qXFwpKS8pXG4gIC5nZXRSZWdleCgpO1xuXG5jb25zdCBsaXN0ID0gZWRpdCgvXihidWxsKShbIFxcdF1bXlxcbl0rPyk/KD86XFxufCQpLylcbiAgLnJlcGxhY2UoL2J1bGwvZywgYnVsbGV0KVxuICAuZ2V0UmVnZXgoKTtcblxuY29uc3QgX3RhZyA9ICdhZGRyZXNzfGFydGljbGV8YXNpZGV8YmFzZXxiYXNlZm9udHxibG9ja3F1b3RlfGJvZHl8Y2FwdGlvbidcbiAgKyAnfGNlbnRlcnxjb2x8Y29sZ3JvdXB8ZGR8ZGV0YWlsc3xkaWFsb2d8ZGlyfGRpdnxkbHxkdHxmaWVsZHNldHxmaWdjYXB0aW9uJ1xuICArICd8ZmlndXJlfGZvb3Rlcnxmb3JtfGZyYW1lfGZyYW1lc2V0fGhbMS02XXxoZWFkfGhlYWRlcnxocnxodG1sfGlmcmFtZSdcbiAgKyAnfGxlZ2VuZHxsaXxsaW5rfG1haW58bWVudXxtZW51aXRlbXxtZXRhfG5hdnxub2ZyYW1lc3xvbHxvcHRncm91cHxvcHRpb24nXG4gICsgJ3xwfHBhcmFtfHNlYXJjaHxzZWN0aW9ufHN1bW1hcnl8dGFibGV8dGJvZHl8dGR8dGZvb3R8dGh8dGhlYWR8dGl0bGUnXG4gICsgJ3x0cnx0cmFja3x1bCc7XG5jb25zdCBfY29tbWVudCA9IC88IS0tKD86LT8+fFtcXHNcXFNdKj8oPzotLT58JCkpLztcbmNvbnN0IGh0bWwgPSBlZGl0KFxuICAnXiB7MCwzfSg/OicgLy8gb3B0aW9uYWwgaW5kZW50YXRpb25cbisgJzwoc2NyaXB0fHByZXxzdHlsZXx0ZXh0YXJlYSlbXFxcXHM+XVtcXFxcc1xcXFxTXSo/KD86PC9cXFxcMT5bXlxcXFxuXSpcXFxcbit8JCknIC8vICgxKVxuKyAnfGNvbW1lbnRbXlxcXFxuXSooXFxcXG4rfCQpJyAvLyAoMilcbisgJ3w8XFxcXD9bXFxcXHNcXFxcU10qPyg/OlxcXFw/PlxcXFxuKnwkKScgLy8gKDMpXG4rICd8PCFbQS1aXVtcXFxcc1xcXFxTXSo/KD86PlxcXFxuKnwkKScgLy8gKDQpXG4rICd8PCFcXFxcW0NEQVRBXFxcXFtbXFxcXHNcXFxcU10qPyg/OlxcXFxdXFxcXF0+XFxcXG4qfCQpJyAvLyAoNSlcbisgJ3w8Lz8odGFnKSg/OiArfFxcXFxufC8/PilbXFxcXHNcXFxcU10qPyg/Oig/OlxcXFxuWyBcXHRdKikrXFxcXG58JCknIC8vICg2KVxuKyAnfDwoPyFzY3JpcHR8cHJlfHN0eWxlfHRleHRhcmVhKShbYS16XVtcXFxcdy1dKikoPzphdHRyaWJ1dGUpKj8gKi8/Pig/PVsgXFxcXHRdKig/OlxcXFxufCQpKVtcXFxcc1xcXFxTXSo/KD86KD86XFxcXG5bIFxcdF0qKStcXFxcbnwkKScgLy8gKDcpIG9wZW4gdGFnXG4rICd8PC8oPyFzY3JpcHR8cHJlfHN0eWxlfHRleHRhcmVhKVthLXpdW1xcXFx3LV0qXFxcXHMqPig/PVsgXFxcXHRdKig/OlxcXFxufCQpKVtcXFxcc1xcXFxTXSo/KD86KD86XFxcXG5bIFxcdF0qKStcXFxcbnwkKScgLy8gKDcpIGNsb3NpbmcgdGFnXG4rICcpJywgJ2knKVxuICAucmVwbGFjZSgnY29tbWVudCcsIF9jb21tZW50KVxuICAucmVwbGFjZSgndGFnJywgX3RhZylcbiAgLnJlcGxhY2UoJ2F0dHJpYnV0ZScsIC8gK1thLXpBLVo6X11bXFx3LjotXSooPzogKj0gKlwiW15cIlxcbl0qXCJ8ICo9IConW14nXFxuXSonfCAqPSAqW15cXHNcIic9PD5gXSspPy8pXG4gIC5nZXRSZWdleCgpO1xuXG5jb25zdCBwYXJhZ3JhcGggPSBlZGl0KF9wYXJhZ3JhcGgpXG4gIC5yZXBsYWNlKCdocicsIGhyKVxuICAucmVwbGFjZSgnaGVhZGluZycsICcgezAsM30jezEsNn0oPzpcXFxcc3wkKScpXG4gIC5yZXBsYWNlKCd8bGhlYWRpbmcnLCAnJykgLy8gc2V0ZXh0IGhlYWRpbmdzIGRvbid0IGludGVycnVwdCBjb21tb25tYXJrIHBhcmFncmFwaHNcbiAgLnJlcGxhY2UoJ3x0YWJsZScsICcnKVxuICAucmVwbGFjZSgnYmxvY2txdW90ZScsICcgezAsM30+JylcbiAgLnJlcGxhY2UoJ2ZlbmNlcycsICcgezAsM30oPzpgezMsfSg/PVteYFxcXFxuXSpcXFxcbil8fnszLH0pW15cXFxcbl0qXFxcXG4nKVxuICAucmVwbGFjZSgnbGlzdCcsICcgezAsM30oPzpbKistXXwxWy4pXSlbIFxcXFx0XScpIC8vIG9ubHkgbGlzdHMgc3RhcnRpbmcgZnJvbSAxIGNhbiBpbnRlcnJ1cHRcbiAgLnJlcGxhY2UoJ2h0bWwnLCAnPC8/KD86dGFnKSg/OiArfFxcXFxufC8/Pil8PCg/OnNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWF8IS0tKScpXG4gIC5yZXBsYWNlKCd0YWcnLCBfdGFnKSAvLyBwYXJzIGNhbiBiZSBpbnRlcnJ1cHRlZCBieSB0eXBlICg2KSBodG1sIGJsb2Nrc1xuICAuZ2V0UmVnZXgoKTtcblxuY29uc3QgYmxvY2txdW90ZSA9IGVkaXQoL14oIHswLDN9PiA/KHBhcmFncmFwaHxbXlxcbl0qKSg/OlxcbnwkKSkrLylcbiAgLnJlcGxhY2UoJ3BhcmFncmFwaCcsIHBhcmFncmFwaClcbiAgLmdldFJlZ2V4KCk7XG5cbi8qKlxuICogTm9ybWFsIEJsb2NrIEdyYW1tYXJcbiAqL1xuXG5jb25zdCBibG9ja05vcm1hbCA9IHtcbiAgYmxvY2txdW90ZSxcbiAgY29kZTogYmxvY2tDb2RlLFxuICBkZWYsXG4gIGZlbmNlcyxcbiAgaGVhZGluZyxcbiAgaHIsXG4gIGh0bWwsXG4gIGxoZWFkaW5nLFxuICBsaXN0LFxuICBuZXdsaW5lLFxuICBwYXJhZ3JhcGgsXG4gIHRhYmxlOiBub29wVGVzdCxcbiAgdGV4dDogYmxvY2tUZXh0LFxufTtcblxudHlwZSBCbG9ja0tleXMgPSBrZXlvZiB0eXBlb2YgYmxvY2tOb3JtYWw7XG5cbi8qKlxuICogR0ZNIEJsb2NrIEdyYW1tYXJcbiAqL1xuXG5jb25zdCBnZm1UYWJsZSA9IGVkaXQoXG4gICdeICooW15cXFxcbiBdLiopXFxcXG4nIC8vIEhlYWRlclxuKyAnIHswLDN9KCg/OlxcXFx8ICopPzo/LSs6PyAqKD86XFxcXHwgKjo/LSs6PyAqKSooPzpcXFxcfCAqKT8pJyAvLyBBbGlnblxuKyAnKD86XFxcXG4oKD86KD8hICpcXFxcbnxocnxoZWFkaW5nfGJsb2NrcXVvdGV8Y29kZXxmZW5jZXN8bGlzdHxodG1sKS4qKD86XFxcXG58JCkpKilcXFxcbip8JCknKSAvLyBDZWxsc1xuICAucmVwbGFjZSgnaHInLCBocilcbiAgLnJlcGxhY2UoJ2hlYWRpbmcnLCAnIHswLDN9I3sxLDZ9KD86XFxcXHN8JCknKVxuICAucmVwbGFjZSgnYmxvY2txdW90ZScsICcgezAsM30+JylcbiAgLnJlcGxhY2UoJ2NvZGUnLCAnKD86IHs0fXwgezAsM31cXHQpW15cXFxcbl0nKVxuICAucmVwbGFjZSgnZmVuY2VzJywgJyB7MCwzfSg/OmB7Myx9KD89W15gXFxcXG5dKlxcXFxuKXx+ezMsfSlbXlxcXFxuXSpcXFxcbicpXG4gIC5yZXBsYWNlKCdsaXN0JywgJyB7MCwzfSg/OlsqKy1dfDFbLildKVsgXFxcXHRdJykgLy8gb25seSBsaXN0cyBzdGFydGluZyBmcm9tIDEgY2FuIGludGVycnVwdFxuICAucmVwbGFjZSgnaHRtbCcsICc8Lz8oPzp0YWcpKD86ICt8XFxcXG58Lz8+KXw8KD86c2NyaXB0fHByZXxzdHlsZXx0ZXh0YXJlYXwhLS0pJylcbiAgLnJlcGxhY2UoJ3RhZycsIF90YWcpIC8vIHRhYmxlcyBjYW4gYmUgaW50ZXJydXB0ZWQgYnkgdHlwZSAoNikgaHRtbCBibG9ja3NcbiAgLmdldFJlZ2V4KCk7XG5cbmNvbnN0IGJsb2NrR2ZtOiBSZWNvcmQ8QmxvY2tLZXlzLCBSZWdFeHA+ID0ge1xuICAuLi5ibG9ja05vcm1hbCxcbiAgbGhlYWRpbmc6IGxoZWFkaW5nR2ZtLFxuICB0YWJsZTogZ2ZtVGFibGUsXG4gIHBhcmFncmFwaDogZWRpdChfcGFyYWdyYXBoKVxuICAgIC5yZXBsYWNlKCdocicsIGhyKVxuICAgIC5yZXBsYWNlKCdoZWFkaW5nJywgJyB7MCwzfSN7MSw2fSg/OlxcXFxzfCQpJylcbiAgICAucmVwbGFjZSgnfGxoZWFkaW5nJywgJycpIC8vIHNldGV4dCBoZWFkaW5ncyBkb24ndCBpbnRlcnJ1cHQgY29tbW9ubWFyayBwYXJhZ3JhcGhzXG4gICAgLnJlcGxhY2UoJ3RhYmxlJywgZ2ZtVGFibGUpIC8vIGludGVycnVwdCBwYXJhZ3JhcGhzIHdpdGggdGFibGVcbiAgICAucmVwbGFjZSgnYmxvY2txdW90ZScsICcgezAsM30+JylcbiAgICAucmVwbGFjZSgnZmVuY2VzJywgJyB7MCwzfSg/OmB7Myx9KD89W15gXFxcXG5dKlxcXFxuKXx+ezMsfSlbXlxcXFxuXSpcXFxcbicpXG4gICAgLnJlcGxhY2UoJ2xpc3QnLCAnIHswLDN9KD86WyorLV18MVsuKV0pWyBcXFxcdF0nKSAvLyBvbmx5IGxpc3RzIHN0YXJ0aW5nIGZyb20gMSBjYW4gaW50ZXJydXB0XG4gICAgLnJlcGxhY2UoJ2h0bWwnLCAnPC8/KD86dGFnKSg/OiArfFxcXFxufC8/Pil8PCg/OnNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWF8IS0tKScpXG4gICAgLnJlcGxhY2UoJ3RhZycsIF90YWcpIC8vIHBhcnMgY2FuIGJlIGludGVycnVwdGVkIGJ5IHR5cGUgKDYpIGh0bWwgYmxvY2tzXG4gICAgLmdldFJlZ2V4KCksXG59O1xuXG4vKipcbiAqIFBlZGFudGljIGdyYW1tYXIgKG9yaWdpbmFsIEpvaG4gR3J1YmVyJ3MgbG9vc2UgbWFya2Rvd24gc3BlY2lmaWNhdGlvbilcbiAqL1xuXG5jb25zdCBibG9ja1BlZGFudGljOiBSZWNvcmQ8QmxvY2tLZXlzLCBSZWdFeHA+ID0ge1xuICAuLi5ibG9ja05vcm1hbCxcbiAgaHRtbDogZWRpdChcbiAgICAnXiAqKD86Y29tbWVudCAqKD86XFxcXG58XFxcXHMqJCknXG4gICAgKyAnfDwodGFnKVtcXFxcc1xcXFxTXSs/PC9cXFxcMT4gKig/OlxcXFxuezIsfXxcXFxccyokKScgLy8gY2xvc2VkIHRhZ1xuICAgICsgJ3w8dGFnKD86XCJbXlwiXSpcInxcXCdbXlxcJ10qXFwnfFxcXFxzW15cXCdcIi8+XFxcXHNdKikqPy8/PiAqKD86XFxcXG57Mix9fFxcXFxzKiQpKScpXG4gICAgLnJlcGxhY2UoJ2NvbW1lbnQnLCBfY29tbWVudClcbiAgICAucmVwbGFjZSgvdGFnL2csICcoPyEoPzonXG4gICAgICArICdhfGVtfHN0cm9uZ3xzbWFsbHxzfGNpdGV8cXxkZm58YWJicnxkYXRhfHRpbWV8Y29kZXx2YXJ8c2FtcHxrYmR8c3ViJ1xuICAgICAgKyAnfHN1cHxpfGJ8dXxtYXJrfHJ1Ynl8cnR8cnB8YmRpfGJkb3xzcGFufGJyfHdicnxpbnN8ZGVsfGltZyknXG4gICAgICArICdcXFxcYilcXFxcdysoPyE6fFteXFxcXHdcXFxcc0BdKkApXFxcXGInKVxuICAgIC5nZXRSZWdleCgpLFxuICBkZWY6IC9eICpcXFsoW15cXF1dKylcXF06ICo8PyhbXlxccz5dKyk+Pyg/OiArKFtcIihdW15cXG5dK1tcIildKSk/ICooPzpcXG4rfCQpLyxcbiAgaGVhZGluZzogL14oI3sxLDZ9KSguKikoPzpcXG4rfCQpLyxcbiAgZmVuY2VzOiBub29wVGVzdCwgLy8gZmVuY2VzIG5vdCBzdXBwb3J0ZWRcbiAgbGhlYWRpbmc6IC9eKC4rPylcXG4gezAsM30oPSt8LSspICooPzpcXG4rfCQpLyxcbiAgcGFyYWdyYXBoOiBlZGl0KF9wYXJhZ3JhcGgpXG4gICAgLnJlcGxhY2UoJ2hyJywgaHIpXG4gICAgLnJlcGxhY2UoJ2hlYWRpbmcnLCAnICojezEsNn0gKlteXFxuXScpXG4gICAgLnJlcGxhY2UoJ2xoZWFkaW5nJywgbGhlYWRpbmcpXG4gICAgLnJlcGxhY2UoJ3x0YWJsZScsICcnKVxuICAgIC5yZXBsYWNlKCdibG9ja3F1b3RlJywgJyB7MCwzfT4nKVxuICAgIC5yZXBsYWNlKCd8ZmVuY2VzJywgJycpXG4gICAgLnJlcGxhY2UoJ3xsaXN0JywgJycpXG4gICAgLnJlcGxhY2UoJ3xodG1sJywgJycpXG4gICAgLnJlcGxhY2UoJ3x0YWcnLCAnJylcbiAgICAuZ2V0UmVnZXgoKSxcbn07XG5cbi8qKlxuICogSW5saW5lLUxldmVsIEdyYW1tYXJcbiAqL1xuXG5jb25zdCBlc2NhcGUgPSAvXlxcXFwoWyFcIiMkJSYnKCkqKyxcXC0uLzo7PD0+P0BcXFtcXF1cXFxcXl9ge3x9fl0pLztcbmNvbnN0IGlubGluZUNvZGUgPSAvXihgKykoW15gXXxbXmBdW1xcc1xcU10qP1teYF0pXFwxKD8hYCkvO1xuY29uc3QgYnIgPSAvXiggezIsfXxcXFxcKVxcbig/IVxccyokKS87XG5jb25zdCBpbmxpbmVUZXh0ID0gL14oYCt8W15gXSkoPzooPz0gezIsfVxcbil8W1xcc1xcU10qPyg/Oig/PVtcXFxcPCFcXFtgKl9dfFxcYl98JCl8W14gXSg/PSB7Mix9XFxuKSkpLztcblxuLy8gbGlzdCBvZiB1bmljb2RlIHB1bmN0dWF0aW9uIG1hcmtzLCBwbHVzIGFueSBtaXNzaW5nIGNoYXJhY3RlcnMgZnJvbSBDb21tb25NYXJrIHNwZWNcbmNvbnN0IF9wdW5jdHVhdGlvbiA9IC9bXFxwe1B9XFxwe1N9XS91O1xuY29uc3QgX3B1bmN0dWF0aW9uT3JTcGFjZSA9IC9bXFxzXFxwe1B9XFxwe1N9XS91O1xuY29uc3QgX25vdFB1bmN0dWF0aW9uT3JTcGFjZSA9IC9bXlxcc1xccHtQfVxccHtTfV0vdTtcbmNvbnN0IHB1bmN0dWF0aW9uID0gZWRpdCgvXigoPyFbKl9dKXB1bmN0U3BhY2UpLywgJ3UnKVxuICAucmVwbGFjZSgvcHVuY3RTcGFjZS9nLCBfcHVuY3R1YXRpb25PclNwYWNlKS5nZXRSZWdleCgpO1xuXG4vLyBHRk0gYWxsb3dzIH4gaW5zaWRlIHN0cm9uZyBhbmQgZW0gZm9yIHN0cmlrZXRocm91Z2hcbmNvbnN0IF9wdW5jdHVhdGlvbkdmbVN0cm9uZ0VtID0gLyg/IX4pW1xccHtQfVxccHtTfV0vdTtcbmNvbnN0IF9wdW5jdHVhdGlvbk9yU3BhY2VHZm1TdHJvbmdFbSA9IC8oPyF+KVtcXHNcXHB7UH1cXHB7U31dL3U7XG5jb25zdCBfbm90UHVuY3R1YXRpb25PclNwYWNlR2ZtU3Ryb25nRW0gPSAvKD86W15cXHNcXHB7UH1cXHB7U31dfH4pL3U7XG5cbi8vIHNlcXVlbmNlcyBlbSBzaG91bGQgc2tpcCBvdmVyIFt0aXRsZV0obGluayksIGBjb2RlYCwgPGh0bWw+XG5jb25zdCBibG9ja1NraXAgPSBlZGl0KC9saW5rfHByZWNvZGUtY29kZXxodG1sLywgJ2cnKVxuICAucmVwbGFjZSgnbGluaycsIC9cXFsoPzpbXlxcW1xcXWBdfCg/PGE+YCspW15gXStcXGs8YT4oPyFgKSkqP1xcXVxcKCg/OlxcXFxbXFxzXFxTXXxbXlxcXFxcXChcXCldfFxcKCg/OlxcXFxbXFxzXFxTXXxbXlxcXFxcXChcXCldKSpcXCkpKlxcKS8pXG4gIC5yZXBsYWNlKCdwcmVjb2RlLScsIHN1cHBvcnRzTG9va2JlaGluZCA/ICcoPzwhYCkoKScgOiAnKF5efFteYF0pJylcbiAgLnJlcGxhY2UoJ2NvZGUnLCAvKD88Yj5gKylbXmBdK1xcazxiPig/IWApLylcbiAgLnJlcGxhY2UoJ2h0bWwnLCAvPCg/ISApW148Pl0qPz4vKVxuICAuZ2V0UmVnZXgoKTtcblxuY29uc3QgZW1TdHJvbmdMRGVsaW1Db3JlID0gL14oPzpcXCorKD86KCg/IVxcKilwdW5jdCl8KFteXFxzKl0pKT8pfF5fKyg/OigoPyFfKXB1bmN0KXwoW15cXHNfXSkpPy87XG5cbmNvbnN0IGVtU3Ryb25nTERlbGltID0gZWRpdChlbVN0cm9uZ0xEZWxpbUNvcmUsICd1JylcbiAgLnJlcGxhY2UoL3B1bmN0L2csIF9wdW5jdHVhdGlvbilcbiAgLmdldFJlZ2V4KCk7XG5cbmNvbnN0IGVtU3Ryb25nTERlbGltR2ZtID0gZWRpdChlbVN0cm9uZ0xEZWxpbUNvcmUsICd1JylcbiAgLnJlcGxhY2UoL3B1bmN0L2csIF9wdW5jdHVhdGlvbkdmbVN0cm9uZ0VtKVxuICAuZ2V0UmVnZXgoKTtcblxuY29uc3QgZW1TdHJvbmdSRGVsaW1Bc3RDb3JlID1cbiAgJ15bXl8qXSo/X19bXl8qXSo/XFxcXCpbXl8qXSo/KD89X18pJyAvLyBTa2lwIG9ycGhhbiBpbnNpZGUgc3Ryb25nXG4rICd8W14qXSsoPz1bXipdKScgLy8gQ29uc3VtZSB0byBkZWxpbVxuKyAnfCg/IVxcXFwqKXB1bmN0KFxcXFwqKykoPz1bXFxcXHNdfCQpJyAvLyAoMSkgIyoqKiBjYW4gb25seSBiZSBhIFJpZ2h0IERlbGltaXRlclxuKyAnfG5vdFB1bmN0U3BhY2UoXFxcXCorKSg/IVxcXFwqKSg/PXB1bmN0U3BhY2V8JCknIC8vICgyKSBhKioqIywgYSoqKiBjYW4gb25seSBiZSBhIFJpZ2h0IERlbGltaXRlclxuKyAnfCg/IVxcXFwqKXB1bmN0U3BhY2UoXFxcXCorKSg/PW5vdFB1bmN0U3BhY2UpJyAvLyAoMykgIyoqKmEsICoqKmEgY2FuIG9ubHkgYmUgTGVmdCBEZWxpbWl0ZXJcbisgJ3xbXFxcXHNdKFxcXFwqKykoPyFcXFxcKikoPz1wdW5jdCknIC8vICg0KSAqKiojIGNhbiBvbmx5IGJlIExlZnQgRGVsaW1pdGVyXG4rICd8KD8hXFxcXCopcHVuY3QoXFxcXCorKSg/IVxcXFwqKSg/PXB1bmN0KScgLy8gKDUpICMqKiojIGNhbiBiZSBlaXRoZXIgTGVmdCBvciBSaWdodCBEZWxpbWl0ZXJcbisgJ3xub3RQdW5jdFNwYWNlKFxcXFwqKykoPz1ub3RQdW5jdFNwYWNlKSc7IC8vICg2KSBhKioqYSBjYW4gYmUgZWl0aGVyIExlZnQgb3IgUmlnaHQgRGVsaW1pdGVyXG5cbmNvbnN0IGVtU3Ryb25nUkRlbGltQXN0ID0gZWRpdChlbVN0cm9uZ1JEZWxpbUFzdENvcmUsICdndScpXG4gIC5yZXBsYWNlKC9ub3RQdW5jdFNwYWNlL2csIF9ub3RQdW5jdHVhdGlvbk9yU3BhY2UpXG4gIC5yZXBsYWNlKC9wdW5jdFNwYWNlL2csIF9wdW5jdHVhdGlvbk9yU3BhY2UpXG4gIC5yZXBsYWNlKC9wdW5jdC9nLCBfcHVuY3R1YXRpb24pXG4gIC5nZXRSZWdleCgpO1xuXG5jb25zdCBlbVN0cm9uZ1JEZWxpbUFzdEdmbSA9IGVkaXQoZW1TdHJvbmdSRGVsaW1Bc3RDb3JlLCAnZ3UnKVxuICAucmVwbGFjZSgvbm90UHVuY3RTcGFjZS9nLCBfbm90UHVuY3R1YXRpb25PclNwYWNlR2ZtU3Ryb25nRW0pXG4gIC5yZXBsYWNlKC9wdW5jdFNwYWNlL2csIF9wdW5jdHVhdGlvbk9yU3BhY2VHZm1TdHJvbmdFbSlcbiAgLnJlcGxhY2UoL3B1bmN0L2csIF9wdW5jdHVhdGlvbkdmbVN0cm9uZ0VtKVxuICAuZ2V0UmVnZXgoKTtcblxuLy8gKDYpIE5vdCBhbGxvd2VkIGZvciBfXG5jb25zdCBlbVN0cm9uZ1JEZWxpbVVuZCA9IGVkaXQoXG4gICdeW15fKl0qP1xcXFwqXFxcXCpbXl8qXSo/X1teXypdKj8oPz1cXFxcKlxcXFwqKScgLy8gU2tpcCBvcnBoYW4gaW5zaWRlIHN0cm9uZ1xuKyAnfFteX10rKD89W15fXSknIC8vIENvbnN1bWUgdG8gZGVsaW1cbisgJ3woPyFfKXB1bmN0KF8rKSg/PVtcXFxcc118JCknIC8vICgxKSAjX19fIGNhbiBvbmx5IGJlIGEgUmlnaHQgRGVsaW1pdGVyXG4rICd8bm90UHVuY3RTcGFjZShfKykoPyFfKSg/PXB1bmN0U3BhY2V8JCknIC8vICgyKSBhX19fIywgYV9fXyBjYW4gb25seSBiZSBhIFJpZ2h0IERlbGltaXRlclxuKyAnfCg/IV8pcHVuY3RTcGFjZShfKykoPz1ub3RQdW5jdFNwYWNlKScgLy8gKDMpICNfX19hLCBfX19hIGNhbiBvbmx5IGJlIExlZnQgRGVsaW1pdGVyXG4rICd8W1xcXFxzXShfKykoPyFfKSg/PXB1bmN0KScgLy8gKDQpIF9fXyMgY2FuIG9ubHkgYmUgTGVmdCBEZWxpbWl0ZXJcbisgJ3woPyFfKXB1bmN0KF8rKSg/IV8pKD89cHVuY3QpJywgJ2d1JykgLy8gKDUpICNfX18jIGNhbiBiZSBlaXRoZXIgTGVmdCBvciBSaWdodCBEZWxpbWl0ZXJcbiAgLnJlcGxhY2UoL25vdFB1bmN0U3BhY2UvZywgX25vdFB1bmN0dWF0aW9uT3JTcGFjZSlcbiAgLnJlcGxhY2UoL3B1bmN0U3BhY2UvZywgX3B1bmN0dWF0aW9uT3JTcGFjZSlcbiAgLnJlcGxhY2UoL3B1bmN0L2csIF9wdW5jdHVhdGlvbilcbiAgLmdldFJlZ2V4KCk7XG5cbi8vIFRpbGRlIGxlZnQgZGVsaW1pdGVyIGZvciBzdHJpa2V0aHJvdWdoIChzaW1pbGFyIHRvIGVtU3Ryb25nTERlbGltIGZvciBhc3RlcmlzaylcbmNvbnN0IGRlbExEZWxpbSA9IGVkaXQoL15+fj8oPzooKD8hfilwdW5jdCl8W15cXHN+XSkvLCAndScpXG4gIC5yZXBsYWNlKC9wdW5jdC9nLCBfcHVuY3R1YXRpb24pXG4gIC5nZXRSZWdleCgpO1xuXG4vLyBUaWxkZSBkZWxpbWl0ZXIgcGF0dGVybnMgZm9yIHN0cmlrZXRocm91Z2ggKHNpbWlsYXIgdG8gYXN0ZXJpc2spXG5jb25zdCBkZWxSRGVsaW1Db3JlID1cbiAgJ15bXn5dKyg/PVtefl0pJyAvLyBDb25zdW1lIHRvIGRlbGltXG4rICd8KD8hfilwdW5jdCh+fj8pKD89W1xcXFxzXXwkKScgLy8gKDEpICN+fiBjYW4gb25seSBiZSBhIFJpZ2h0IERlbGltaXRlclxuKyAnfG5vdFB1bmN0U3BhY2Uofn4/KSg/IX4pKD89cHVuY3RTcGFjZXwkKScgLy8gKDIpIGF+fiMsIGF+fiBjYW4gb25seSBiZSBhIFJpZ2h0IERlbGltaXRlclxuKyAnfCg/IX4pcHVuY3RTcGFjZSh+fj8pKD89bm90UHVuY3RTcGFjZSknIC8vICgzKSAjfn5hLCB+fmEgY2FuIG9ubHkgYmUgTGVmdCBEZWxpbWl0ZXJcbisgJ3xbXFxcXHNdKH5+PykoPyF+KSg/PXB1bmN0KScgLy8gKDQpIH5+IyBjYW4gb25seSBiZSBMZWZ0IERlbGltaXRlclxuKyAnfCg/IX4pcHVuY3Qofn4/KSg/IX4pKD89cHVuY3QpJyAvLyAoNSkgI35+IyBjYW4gYmUgZWl0aGVyIExlZnQgb3IgUmlnaHQgRGVsaW1pdGVyXG4rICd8bm90UHVuY3RTcGFjZSh+fj8pKD89bm90UHVuY3RTcGFjZSknOyAvLyAoNikgYX5+YSBjYW4gYmUgZWl0aGVyIExlZnQgb3IgUmlnaHQgRGVsaW1pdGVyXG5cbmNvbnN0IGRlbFJEZWxpbSA9IGVkaXQoZGVsUkRlbGltQ29yZSwgJ2d1JylcbiAgLnJlcGxhY2UoL25vdFB1bmN0U3BhY2UvZywgX25vdFB1bmN0dWF0aW9uT3JTcGFjZSlcbiAgLnJlcGxhY2UoL3B1bmN0U3BhY2UvZywgX3B1bmN0dWF0aW9uT3JTcGFjZSlcbiAgLnJlcGxhY2UoL3B1bmN0L2csIF9wdW5jdHVhdGlvbilcbiAgLmdldFJlZ2V4KCk7XG5cbmNvbnN0IGFueVB1bmN0dWF0aW9uID0gZWRpdCgvXFxcXChwdW5jdCkvLCAnZ3UnKVxuICAucmVwbGFjZSgvcHVuY3QvZywgX3B1bmN0dWF0aW9uKVxuICAuZ2V0UmVnZXgoKTtcblxuY29uc3QgYXV0b2xpbmsgPSBlZGl0KC9ePChzY2hlbWU6W15cXHNcXHgwMC1cXHgxZjw+XSp8ZW1haWwpPi8pXG4gIC5yZXBsYWNlKCdzY2hlbWUnLCAvW2EtekEtWl1bYS16QS1aMC05Ky4tXXsxLDMxfS8pXG4gIC5yZXBsYWNlKCdlbWFpbCcsIC9bYS16QS1aMC05LiEjJCUmJyorLz0/Xl9ge3x9fi1dKyhAKVthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPyg/OlxcLlthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPykrKD8hWy1fXSkvKVxuICAuZ2V0UmVnZXgoKTtcblxuY29uc3QgX2lubGluZUNvbW1lbnQgPSBlZGl0KF9jb21tZW50KS5yZXBsYWNlKCcoPzotLT58JCknLCAnLS0+JykuZ2V0UmVnZXgoKTtcbmNvbnN0IHRhZyA9IGVkaXQoXG4gICdeY29tbWVudCdcbiAgICArICd8XjwvW2EtekEtWl1bXFxcXHc6LV0qXFxcXHMqPicgLy8gc2VsZi1jbG9zaW5nIHRhZ1xuICAgICsgJ3xePFthLXpBLVpdW1xcXFx3LV0qKD86YXR0cmlidXRlKSo/XFxcXHMqLz8+JyAvLyBvcGVuIHRhZ1xuICAgICsgJ3xePFxcXFw/W1xcXFxzXFxcXFNdKj9cXFxcPz4nIC8vIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24sIGUuZy4gPD9waHAgPz5cbiAgICArICd8XjwhW2EtekEtWl0rXFxcXHNbXFxcXHNcXFxcU10qPz4nIC8vIGRlY2xhcmF0aW9uLCBlLmcuIDwhRE9DVFlQRSBodG1sPlxuICAgICsgJ3xePCFcXFxcW0NEQVRBXFxcXFtbXFxcXHNcXFxcU10qP1xcXFxdXFxcXF0+JykgLy8gQ0RBVEEgc2VjdGlvblxuICAucmVwbGFjZSgnY29tbWVudCcsIF9pbmxpbmVDb21tZW50KVxuICAucmVwbGFjZSgnYXR0cmlidXRlJywgL1xccytbYS16QS1aOl9dW1xcdy46LV0qKD86XFxzKj1cXHMqXCJbXlwiXSpcInxcXHMqPVxccyonW14nXSonfFxccyo9XFxzKlteXFxzXCInPTw+YF0rKT8vKVxuICAuZ2V0UmVnZXgoKTtcblxuY29uc3QgX2lubGluZUxhYmVsID0gLyg/OlxcWyg/OlxcXFxbXFxzXFxTXXxbXlxcW1xcXVxcXFxdKSpcXF18XFxcXFtcXHNcXFNdfGArKD8hYClbXmBdKj9gKyg/IWApfGBgKyg/PVxcXSl8W15cXFtcXF1cXFxcYF0pKj8vO1xuXG5jb25zdCBsaW5rID0gZWRpdCgvXiE/XFxbKGxhYmVsKVxcXVxcKFxccyooaHJlZikoPzooPzpbIFxcdF0rKD86XFxuWyBcXHRdKik/fFxcblsgXFx0XSopKHRpdGxlKSk/XFxzKlxcKS8pXG4gIC5yZXBsYWNlKCdsYWJlbCcsIF9pbmxpbmVMYWJlbClcbiAgLnJlcGxhY2UoJ2hyZWYnLCAvPCg/OlxcXFwufFteXFxuPD5cXFxcXSkrPnxbXiBcXHRcXG5cXHgwMC1cXHgxZl0qLylcbiAgLnJlcGxhY2UoJ3RpdGxlJywgL1wiKD86XFxcXFwiP3xbXlwiXFxcXF0pKlwifCcoPzpcXFxcJz98W14nXFxcXF0pKid8XFwoKD86XFxcXFxcKT98W14pXFxcXF0pKlxcKS8pXG4gIC5nZXRSZWdleCgpO1xuXG5jb25zdCByZWZsaW5rID0gZWRpdCgvXiE/XFxbKGxhYmVsKVxcXVxcWyhyZWYpXFxdLylcbiAgLnJlcGxhY2UoJ2xhYmVsJywgX2lubGluZUxhYmVsKVxuICAucmVwbGFjZSgncmVmJywgX2Jsb2NrTGFiZWwpXG4gIC5nZXRSZWdleCgpO1xuXG5jb25zdCBub2xpbmsgPSBlZGl0KC9eIT9cXFsocmVmKVxcXSg/OlxcW1xcXSk/LylcbiAgLnJlcGxhY2UoJ3JlZicsIF9ibG9ja0xhYmVsKVxuICAuZ2V0UmVnZXgoKTtcblxuY29uc3QgcmVmbGlua1NlYXJjaCA9IGVkaXQoJ3JlZmxpbmt8bm9saW5rKD8hXFxcXCgpJywgJ2cnKVxuICAucmVwbGFjZSgncmVmbGluaycsIHJlZmxpbmspXG4gIC5yZXBsYWNlKCdub2xpbmsnLCBub2xpbmspXG4gIC5nZXRSZWdleCgpO1xuXG5jb25zdCBfY2FzZUluc2Vuc2l0aXZlUHJvdG9jb2wgPSAvW2hIXVt0VF1bdFRdW3BQXVtzU10/fFtmRl1bdFRdW3BQXS87XG5cbi8qKlxuICogTm9ybWFsIElubGluZSBHcmFtbWFyXG4gKi9cblxuY29uc3QgaW5saW5lTm9ybWFsID0ge1xuICBfYmFja3BlZGFsOiBub29wVGVzdCwgLy8gb25seSB1c2VkIGZvciBHRk0gdXJsXG4gIGFueVB1bmN0dWF0aW9uLFxuICBhdXRvbGluayxcbiAgYmxvY2tTa2lwLFxuICBicixcbiAgY29kZTogaW5saW5lQ29kZSxcbiAgZGVsOiBub29wVGVzdCxcbiAgZGVsTERlbGltOiBub29wVGVzdCxcbiAgZGVsUkRlbGltOiBub29wVGVzdCxcbiAgZW1TdHJvbmdMRGVsaW0sXG4gIGVtU3Ryb25nUkRlbGltQXN0LFxuICBlbVN0cm9uZ1JEZWxpbVVuZCxcbiAgZXNjYXBlLFxuICBsaW5rLFxuICBub2xpbmssXG4gIHB1bmN0dWF0aW9uLFxuICByZWZsaW5rLFxuICByZWZsaW5rU2VhcmNoLFxuICB0YWcsXG4gIHRleHQ6IGlubGluZVRleHQsXG4gIHVybDogbm9vcFRlc3QsXG59O1xuXG50eXBlIElubGluZUtleXMgPSBrZXlvZiB0eXBlb2YgaW5saW5lTm9ybWFsO1xuXG4vKipcbiAqIFBlZGFudGljIElubGluZSBHcmFtbWFyXG4gKi9cblxuY29uc3QgaW5saW5lUGVkYW50aWM6IFJlY29yZDxJbmxpbmVLZXlzLCBSZWdFeHA+ID0ge1xuICAuLi5pbmxpbmVOb3JtYWwsXG4gIGxpbms6IGVkaXQoL14hP1xcWyhsYWJlbClcXF1cXCgoLio/KVxcKS8pXG4gICAgLnJlcGxhY2UoJ2xhYmVsJywgX2lubGluZUxhYmVsKVxuICAgIC5nZXRSZWdleCgpLFxuICByZWZsaW5rOiBlZGl0KC9eIT9cXFsobGFiZWwpXFxdXFxzKlxcWyhbXlxcXV0qKVxcXS8pXG4gICAgLnJlcGxhY2UoJ2xhYmVsJywgX2lubGluZUxhYmVsKVxuICAgIC5nZXRSZWdleCgpLFxufTtcblxuLyoqXG4gKiBHRk0gSW5saW5lIEdyYW1tYXJcbiAqL1xuXG5jb25zdCBpbmxpbmVHZm06IFJlY29yZDxJbmxpbmVLZXlzLCBSZWdFeHA+ID0ge1xuICAuLi5pbmxpbmVOb3JtYWwsXG4gIGVtU3Ryb25nUkRlbGltQXN0OiBlbVN0cm9uZ1JEZWxpbUFzdEdmbSxcbiAgZW1TdHJvbmdMRGVsaW06IGVtU3Ryb25nTERlbGltR2ZtLFxuICBkZWxMRGVsaW0sXG4gIGRlbFJEZWxpbSxcbiAgdXJsOiBlZGl0KC9eKCg/OnByb3RvY29sKTpcXC9cXC98d3d3XFwuKSg/OlthLXpBLVowLTlcXC1dK1xcLj8pK1teXFxzPF0qfF5lbWFpbC8pXG4gICAgLnJlcGxhY2UoJ3Byb3RvY29sJywgX2Nhc2VJbnNlbnNpdGl2ZVByb3RvY29sKVxuICAgIC5yZXBsYWNlKCdlbWFpbCcsIC9bQS1aYS16MC05Ll8rLV0rKEApW2EtekEtWjAtOS1fXSsoPzpcXC5bYS16QS1aMC05LV9dKlthLXpBLVowLTldKSsoPyFbLV9dKS8pXG4gICAgLmdldFJlZ2V4KCksXG4gIF9iYWNrcGVkYWw6IC8oPzpbXj8hLiw6OypfJ1wifigpJl0rfFxcKFteKV0qXFwpfCYoPyFbYS16QS1aMC05XSs7JCl8Wz8hLiw6OypfJ1wifildKyg/ISQpKSsvLFxuICBkZWw6IC9eKH5+PykoPz1bXlxcc35dKSgoPzpcXFxcW1xcc1xcU118W15cXFxcXSkqPyg/OlxcXFxbXFxzXFxTXXxbXlxcc35cXFxcXSkpXFwxKD89W15+XXwkKS8sXG4gIHRleHQ6IGVkaXQoL14oW2B+XSt8W15gfl0pKD86KD89IHsyLH1cXG4pfCg/PVthLXpBLVowLTkuISMkJSYnKitcXC89P19ge1xcfH1+LV0rQCl8W1xcc1xcU10qPyg/Oig/PVtcXFxcPCFcXFtgKn5fXXxcXGJffHByb3RvY29sOlxcL1xcL3x3d3dcXC58JCl8W14gXSg/PSB7Mix9XFxuKXxbXmEtekEtWjAtOS4hIyQlJicqK1xcLz0/X2B7XFx8fX4tXSg/PVthLXpBLVowLTkuISMkJSYnKitcXC89P19ge1xcfH1+LV0rQCkpKS8pXG4gICAgLnJlcGxhY2UoJ3Byb3RvY29sJywgX2Nhc2VJbnNlbnNpdGl2ZVByb3RvY29sKVxuICAgIC5nZXRSZWdleCgpLFxufTtcblxuLyoqXG4gKiBHRk0gKyBMaW5lIEJyZWFrcyBJbmxpbmUgR3JhbW1hclxuICovXG5cbmNvbnN0IGlubGluZUJyZWFrczogUmVjb3JkPElubGluZUtleXMsIFJlZ0V4cD4gPSB7XG4gIC4uLmlubGluZUdmbSxcbiAgYnI6IGVkaXQoYnIpLnJlcGxhY2UoJ3syLH0nLCAnKicpLmdldFJlZ2V4KCksXG4gIHRleHQ6IGVkaXQoaW5saW5lR2ZtLnRleHQpXG4gICAgLnJlcGxhY2UoJ1xcXFxiXycsICdcXFxcYl98IHsyLH1cXFxcbicpXG4gICAgLnJlcGxhY2UoL1xcezIsXFx9L2csICcqJylcbiAgICAuZ2V0UmVnZXgoKSxcbn07XG5cbi8qKlxuICogZXhwb3J0c1xuICovXG5cbmV4cG9ydCBjb25zdCBibG9jayA9IHtcbiAgbm9ybWFsOiBibG9ja05vcm1hbCxcbiAgZ2ZtOiBibG9ja0dmbSxcbiAgcGVkYW50aWM6IGJsb2NrUGVkYW50aWMsXG59O1xuXG5leHBvcnQgY29uc3QgaW5saW5lID0ge1xuICBub3JtYWw6IGlubGluZU5vcm1hbCxcbiAgZ2ZtOiBpbmxpbmVHZm0sXG4gIGJyZWFrczogaW5saW5lQnJlYWtzLFxuICBwZWRhbnRpYzogaW5saW5lUGVkYW50aWMsXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFJ1bGVzIHtcbiAgb3RoZXI6IHR5cGVvZiBvdGhlclxuICBibG9jazogUmVjb3JkPEJsb2NrS2V5cywgUmVnRXhwPlxuICBpbmxpbmU6IFJlY29yZDxJbmxpbmVLZXlzLCBSZWdFeHA+XG59XG4iLCAiaW1wb3J0IHsgb3RoZXIgfSBmcm9tICcuL3J1bGVzLnRzJztcblxuLyoqXG4gKiBIZWxwZXJzXG4gKi9cbmNvbnN0IGVzY2FwZVJlcGxhY2VtZW50czogeyBbaW5kZXg6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAnJic6ICcmYW1wOycsXG4gICc8JzogJyZsdDsnLFxuICAnPic6ICcmZ3Q7JyxcbiAgJ1wiJzogJyZxdW90OycsXG4gIFwiJ1wiOiAnJiMzOTsnLFxufTtcbmNvbnN0IGdldEVzY2FwZVJlcGxhY2VtZW50ID0gKGNoOiBzdHJpbmcpID0+IGVzY2FwZVJlcGxhY2VtZW50c1tjaF07XG5cbmV4cG9ydCBmdW5jdGlvbiBlc2NhcGVIdG1sRW50aXRpZXMoaHRtbDogc3RyaW5nLCBlbmNvZGU/OiBib29sZWFuKSB7XG4gIGlmIChlbmNvZGUpIHtcbiAgICBpZiAob3RoZXIuZXNjYXBlVGVzdC50ZXN0KGh0bWwpKSB7XG4gICAgICByZXR1cm4gaHRtbC5yZXBsYWNlKG90aGVyLmVzY2FwZVJlcGxhY2UsIGdldEVzY2FwZVJlcGxhY2VtZW50KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKG90aGVyLmVzY2FwZVRlc3ROb0VuY29kZS50ZXN0KGh0bWwpKSB7XG4gICAgICByZXR1cm4gaHRtbC5yZXBsYWNlKG90aGVyLmVzY2FwZVJlcGxhY2VOb0VuY29kZSwgZ2V0RXNjYXBlUmVwbGFjZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBodG1sO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYW5VcmwoaHJlZjogc3RyaW5nKSB7XG4gIHRyeSB7XG4gICAgaHJlZiA9IGVuY29kZVVSSShocmVmKS5yZXBsYWNlKG90aGVyLnBlcmNlbnREZWNvZGUsICclJyk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBocmVmO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRDZWxscyh0YWJsZVJvdzogc3RyaW5nLCBjb3VudD86IG51bWJlcikge1xuICAvLyBlbnN1cmUgdGhhdCBldmVyeSBjZWxsLWRlbGltaXRpbmcgcGlwZSBoYXMgYSBzcGFjZVxuICAvLyBiZWZvcmUgaXQgdG8gZGlzdGluZ3Vpc2ggaXQgZnJvbSBhbiBlc2NhcGVkIHBpcGVcbiAgY29uc3Qgcm93ID0gdGFibGVSb3cucmVwbGFjZShvdGhlci5maW5kUGlwZSwgKG1hdGNoLCBvZmZzZXQsIHN0cikgPT4ge1xuICAgICAgbGV0IGVzY2FwZWQgPSBmYWxzZTtcbiAgICAgIGxldCBjdXJyID0gb2Zmc2V0O1xuICAgICAgd2hpbGUgKC0tY3VyciA+PSAwICYmIHN0cltjdXJyXSA9PT0gJ1xcXFwnKSBlc2NhcGVkID0gIWVzY2FwZWQ7XG4gICAgICBpZiAoZXNjYXBlZCkge1xuICAgICAgICAvLyBvZGQgbnVtYmVyIG9mIHNsYXNoZXMgbWVhbnMgfCBpcyBlc2NhcGVkXG4gICAgICAgIC8vIHNvIHdlIGxlYXZlIGl0IGFsb25lXG4gICAgICAgIHJldHVybiAnfCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBhZGQgc3BhY2UgYmVmb3JlIHVuZXNjYXBlZCB8XG4gICAgICAgIHJldHVybiAnIHwnO1xuICAgICAgfVxuICAgIH0pLFxuICAgIGNlbGxzID0gcm93LnNwbGl0KG90aGVyLnNwbGl0UGlwZSk7XG4gIGxldCBpID0gMDtcblxuICAvLyBGaXJzdC9sYXN0IGNlbGwgaW4gYSByb3cgY2Fubm90IGJlIGVtcHR5IGlmIGl0IGhhcyBubyBsZWFkaW5nL3RyYWlsaW5nIHBpcGVcbiAgaWYgKCFjZWxsc1swXS50cmltKCkpIHtcbiAgICBjZWxscy5zaGlmdCgpO1xuICB9XG4gIGlmIChjZWxscy5sZW5ndGggPiAwICYmICFjZWxscy5hdCgtMSk/LnRyaW0oKSkge1xuICAgIGNlbGxzLnBvcCgpO1xuICB9XG5cbiAgaWYgKGNvdW50KSB7XG4gICAgaWYgKGNlbGxzLmxlbmd0aCA+IGNvdW50KSB7XG4gICAgICBjZWxscy5zcGxpY2UoY291bnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB3aGlsZSAoY2VsbHMubGVuZ3RoIDwgY291bnQpIGNlbGxzLnB1c2goJycpO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoOyBpIDwgY2VsbHMubGVuZ3RoOyBpKyspIHtcbiAgICAvLyBsZWFkaW5nIG9yIHRyYWlsaW5nIHdoaXRlc3BhY2UgaXMgaWdub3JlZCBwZXIgdGhlIGdmbSBzcGVjXG4gICAgY2VsbHNbaV0gPSBjZWxsc1tpXS50cmltKCkucmVwbGFjZShvdGhlci5zbGFzaFBpcGUsICd8Jyk7XG4gIH1cbiAgcmV0dXJuIGNlbGxzO1xufVxuXG4vKipcbiAqIFJlbW92ZSB0cmFpbGluZyAnYydzLiBFcXVpdmFsZW50IHRvIHN0ci5yZXBsYWNlKC9jKiQvLCAnJykuXG4gKiAvYyokLyBpcyB2dWxuZXJhYmxlIHRvIFJFRE9TLlxuICpcbiAqIEBwYXJhbSBzdHJcbiAqIEBwYXJhbSBjXG4gKiBAcGFyYW0gaW52ZXJ0IFJlbW92ZSBzdWZmaXggb2Ygbm9uLWMgY2hhcnMgaW5zdGVhZC4gRGVmYXVsdCBmYWxzZXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydHJpbShzdHI6IHN0cmluZywgYzogc3RyaW5nLCBpbnZlcnQ/OiBib29sZWFuKSB7XG4gIGNvbnN0IGwgPSBzdHIubGVuZ3RoO1xuICBpZiAobCA9PT0gMCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIC8vIExlbmd0aCBvZiBzdWZmaXggbWF0Y2hpbmcgdGhlIGludmVydCBjb25kaXRpb24uXG4gIGxldCBzdWZmTGVuID0gMDtcblxuICAvLyBTdGVwIGxlZnQgdW50aWwgd2UgZmFpbCB0byBtYXRjaCB0aGUgaW52ZXJ0IGNvbmRpdGlvbi5cbiAgd2hpbGUgKHN1ZmZMZW4gPCBsKSB7XG4gICAgY29uc3QgY3VyckNoYXIgPSBzdHIuY2hhckF0KGwgLSBzdWZmTGVuIC0gMSk7XG4gICAgaWYgKGN1cnJDaGFyID09PSBjICYmICFpbnZlcnQpIHtcbiAgICAgIHN1ZmZMZW4rKztcbiAgICB9IGVsc2UgaWYgKGN1cnJDaGFyICE9PSBjICYmIGludmVydCkge1xuICAgICAgc3VmZkxlbisrO1xuICAgIH0gZWxzZSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3RyLnNsaWNlKDAsIGwgLSBzdWZmTGVuKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRDbG9zaW5nQnJhY2tldChzdHI6IHN0cmluZywgYjogc3RyaW5nKSB7XG4gIGlmIChzdHIuaW5kZXhPZihiWzFdKSA9PT0gLTEpIHtcbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICBsZXQgbGV2ZWwgPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgIGlmIChzdHJbaV0gPT09ICdcXFxcJykge1xuICAgICAgaSsrO1xuICAgIH0gZWxzZSBpZiAoc3RyW2ldID09PSBiWzBdKSB7XG4gICAgICBsZXZlbCsrO1xuICAgIH0gZWxzZSBpZiAoc3RyW2ldID09PSBiWzFdKSB7XG4gICAgICBsZXZlbC0tO1xuICAgICAgaWYgKGxldmVsIDwgMCkge1xuICAgICAgICByZXR1cm4gaTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKGxldmVsID4gMCkge1xuICAgIHJldHVybiAtMjtcbiAgfVxuXG4gIHJldHVybiAtMTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4cGFuZFRhYnMobGluZTogc3RyaW5nLCBpbmRlbnQgPSAwKSB7XG4gIGxldCBjb2wgPSBpbmRlbnQ7XG4gIGxldCBleHBhbmRlZCA9ICcnO1xuICBmb3IgKGNvbnN0IGNoYXIgb2YgbGluZSkge1xuICAgIGlmIChjaGFyID09PSAnXFx0Jykge1xuICAgICAgY29uc3QgYWRkZWQgPSA0IC0gKGNvbCAlIDQpO1xuICAgICAgZXhwYW5kZWQgKz0gJyAnLnJlcGVhdChhZGRlZCk7XG4gICAgICBjb2wgKz0gYWRkZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGV4cGFuZGVkICs9IGNoYXI7XG4gICAgICBjb2wrKztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXhwYW5kZWQ7XG59XG4iLCAiaW1wb3J0IHsgX2RlZmF1bHRzIH0gZnJvbSAnLi9kZWZhdWx0cy50cyc7XG5pbXBvcnQge1xuICBydHJpbSxcbiAgc3BsaXRDZWxscyxcbiAgZmluZENsb3NpbmdCcmFja2V0LFxuICBleHBhbmRUYWJzLFxufSBmcm9tICcuL2hlbHBlcnMudHMnO1xuaW1wb3J0IHR5cGUgeyBSdWxlcyB9IGZyb20gJy4vcnVsZXMudHMnO1xuaW1wb3J0IHR5cGUgeyBfTGV4ZXIgfSBmcm9tICcuL0xleGVyLnRzJztcbmltcG9ydCB0eXBlIHsgTGlua3MsIFRva2VucywgVG9rZW4gfSBmcm9tICcuL1Rva2Vucy50cyc7XG5pbXBvcnQgdHlwZSB7IE1hcmtlZE9wdGlvbnMgfSBmcm9tICcuL01hcmtlZE9wdGlvbnMudHMnO1xuXG5mdW5jdGlvbiBvdXRwdXRMaW5rKGNhcDogc3RyaW5nW10sIGxpbms6IFBpY2s8VG9rZW5zLkxpbmssICdocmVmJyB8ICd0aXRsZSc+LCByYXc6IHN0cmluZywgbGV4ZXI6IF9MZXhlciwgcnVsZXM6IFJ1bGVzKTogVG9rZW5zLkxpbmsgfCBUb2tlbnMuSW1hZ2Uge1xuICBjb25zdCBocmVmID0gbGluay5ocmVmO1xuICBjb25zdCB0aXRsZSA9IGxpbmsudGl0bGUgfHwgbnVsbDtcbiAgY29uc3QgdGV4dCA9IGNhcFsxXS5yZXBsYWNlKHJ1bGVzLm90aGVyLm91dHB1dExpbmtSZXBsYWNlLCAnJDEnKTtcblxuICBsZXhlci5zdGF0ZS5pbkxpbmsgPSB0cnVlO1xuICBjb25zdCB0b2tlbjogVG9rZW5zLkxpbmsgfCBUb2tlbnMuSW1hZ2UgPSB7XG4gICAgdHlwZTogY2FwWzBdLmNoYXJBdCgwKSA9PT0gJyEnID8gJ2ltYWdlJyA6ICdsaW5rJyxcbiAgICByYXcsXG4gICAgaHJlZixcbiAgICB0aXRsZSxcbiAgICB0ZXh0LFxuICAgIHRva2VuczogbGV4ZXIuaW5saW5lVG9rZW5zKHRleHQpLFxuICB9O1xuICBsZXhlci5zdGF0ZS5pbkxpbmsgPSBmYWxzZTtcbiAgcmV0dXJuIHRva2VuO1xufVxuXG5mdW5jdGlvbiBpbmRlbnRDb2RlQ29tcGVuc2F0aW9uKHJhdzogc3RyaW5nLCB0ZXh0OiBzdHJpbmcsIHJ1bGVzOiBSdWxlcykge1xuICBjb25zdCBtYXRjaEluZGVudFRvQ29kZSA9IHJhdy5tYXRjaChydWxlcy5vdGhlci5pbmRlbnRDb2RlQ29tcGVuc2F0aW9uKTtcblxuICBpZiAobWF0Y2hJbmRlbnRUb0NvZGUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gdGV4dDtcbiAgfVxuXG4gIGNvbnN0IGluZGVudFRvQ29kZSA9IG1hdGNoSW5kZW50VG9Db2RlWzFdO1xuXG4gIHJldHVybiB0ZXh0XG4gICAgLnNwbGl0KCdcXG4nKVxuICAgIC5tYXAobm9kZSA9PiB7XG4gICAgICBjb25zdCBtYXRjaEluZGVudEluTm9kZSA9IG5vZGUubWF0Y2gocnVsZXMub3RoZXIuYmVnaW5uaW5nU3BhY2UpO1xuICAgICAgaWYgKG1hdGNoSW5kZW50SW5Ob2RlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBbaW5kZW50SW5Ob2RlXSA9IG1hdGNoSW5kZW50SW5Ob2RlO1xuXG4gICAgICBpZiAoaW5kZW50SW5Ob2RlLmxlbmd0aCA+PSBpbmRlbnRUb0NvZGUubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBub2RlLnNsaWNlKGluZGVudFRvQ29kZS5sZW5ndGgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9KVxuICAgIC5qb2luKCdcXG4nKTtcbn1cblxuLyoqXG4gKiBUb2tlbml6ZXJcbiAqL1xuZXhwb3J0IGNsYXNzIF9Ub2tlbml6ZXI8UGFyc2VyT3V0cHV0ID0gc3RyaW5nLCBSZW5kZXJlck91dHB1dCA9IHN0cmluZz4ge1xuICBvcHRpb25zOiBNYXJrZWRPcHRpb25zPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+O1xuICBydWxlcyE6IFJ1bGVzOyAvLyBzZXQgYnkgdGhlIGxleGVyXG4gIGxleGVyITogX0xleGVyPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+OyAvLyBzZXQgYnkgdGhlIGxleGVyXG5cbiAgY29uc3RydWN0b3Iob3B0aW9ucz86IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4pIHtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IF9kZWZhdWx0cztcbiAgfVxuXG4gIHNwYWNlKHNyYzogc3RyaW5nKTogVG9rZW5zLlNwYWNlIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjYXAgPSB0aGlzLnJ1bGVzLmJsb2NrLm5ld2xpbmUuZXhlYyhzcmMpO1xuICAgIGlmIChjYXAgJiYgY2FwWzBdLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdzcGFjZScsXG4gICAgICAgIHJhdzogY2FwWzBdLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBjb2RlKHNyYzogc3RyaW5nKTogVG9rZW5zLkNvZGUgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuYmxvY2suY29kZS5leGVjKHNyYyk7XG4gICAgaWYgKGNhcCkge1xuICAgICAgY29uc3QgdGV4dCA9IGNhcFswXS5yZXBsYWNlKHRoaXMucnVsZXMub3RoZXIuY29kZVJlbW92ZUluZGVudCwgJycpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ2NvZGUnLFxuICAgICAgICByYXc6IGNhcFswXSxcbiAgICAgICAgY29kZUJsb2NrU3R5bGU6ICdpbmRlbnRlZCcsXG4gICAgICAgIHRleHQ6ICF0aGlzLm9wdGlvbnMucGVkYW50aWNcbiAgICAgICAgICA/IHJ0cmltKHRleHQsICdcXG4nKVxuICAgICAgICAgIDogdGV4dCxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgZmVuY2VzKHNyYzogc3RyaW5nKTogVG9rZW5zLkNvZGUgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuYmxvY2suZmVuY2VzLmV4ZWMoc3JjKTtcbiAgICBpZiAoY2FwKSB7XG4gICAgICBjb25zdCByYXcgPSBjYXBbMF07XG4gICAgICBjb25zdCB0ZXh0ID0gaW5kZW50Q29kZUNvbXBlbnNhdGlvbihyYXcsIGNhcFszXSB8fCAnJywgdGhpcy5ydWxlcyk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdjb2RlJyxcbiAgICAgICAgcmF3LFxuICAgICAgICBsYW5nOiBjYXBbMl0gPyBjYXBbMl0udHJpbSgpLnJlcGxhY2UodGhpcy5ydWxlcy5pbmxpbmUuYW55UHVuY3R1YXRpb24sICckMScpIDogY2FwWzJdLFxuICAgICAgICB0ZXh0LFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBoZWFkaW5nKHNyYzogc3RyaW5nKTogVG9rZW5zLkhlYWRpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuYmxvY2suaGVhZGluZy5leGVjKHNyYyk7XG4gICAgaWYgKGNhcCkge1xuICAgICAgbGV0IHRleHQgPSBjYXBbMl0udHJpbSgpO1xuXG4gICAgICAvLyByZW1vdmUgdHJhaWxpbmcgI3NcbiAgICAgIGlmICh0aGlzLnJ1bGVzLm90aGVyLmVuZGluZ0hhc2gudGVzdCh0ZXh0KSkge1xuICAgICAgICBjb25zdCB0cmltbWVkID0gcnRyaW0odGV4dCwgJyMnKTtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5wZWRhbnRpYykge1xuICAgICAgICAgIHRleHQgPSB0cmltbWVkLnRyaW0oKTtcbiAgICAgICAgfSBlbHNlIGlmICghdHJpbW1lZCB8fCB0aGlzLnJ1bGVzLm90aGVyLmVuZGluZ1NwYWNlQ2hhci50ZXN0KHRyaW1tZWQpKSB7XG4gICAgICAgICAgLy8gQ29tbW9uTWFyayByZXF1aXJlcyBzcGFjZSBiZWZvcmUgdHJhaWxpbmcgI3NcbiAgICAgICAgICB0ZXh0ID0gdHJpbW1lZC50cmltKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ2hlYWRpbmcnLFxuICAgICAgICByYXc6IGNhcFswXSxcbiAgICAgICAgZGVwdGg6IGNhcFsxXS5sZW5ndGgsXG4gICAgICAgIHRleHQsXG4gICAgICAgIHRva2VuczogdGhpcy5sZXhlci5pbmxpbmUodGV4dCksXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGhyKHNyYzogc3RyaW5nKTogVG9rZW5zLkhyIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjYXAgPSB0aGlzLnJ1bGVzLmJsb2NrLmhyLmV4ZWMoc3JjKTtcbiAgICBpZiAoY2FwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAnaHInLFxuICAgICAgICByYXc6IHJ0cmltKGNhcFswXSwgJ1xcbicpLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBibG9ja3F1b3RlKHNyYzogc3RyaW5nKTogVG9rZW5zLkJsb2NrcXVvdGUgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuYmxvY2suYmxvY2txdW90ZS5leGVjKHNyYyk7XG4gICAgaWYgKGNhcCkge1xuICAgICAgbGV0IGxpbmVzID0gcnRyaW0oY2FwWzBdLCAnXFxuJykuc3BsaXQoJ1xcbicpO1xuICAgICAgbGV0IHJhdyA9ICcnO1xuICAgICAgbGV0IHRleHQgPSAnJztcbiAgICAgIGNvbnN0IHRva2VuczogVG9rZW5bXSA9IFtdO1xuXG4gICAgICB3aGlsZSAobGluZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBsZXQgaW5CbG9ja3F1b3RlID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRMaW5lcyA9IFtdO1xuXG4gICAgICAgIGxldCBpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAvLyBnZXQgbGluZXMgdXAgdG8gYSBjb250aW51YXRpb25cbiAgICAgICAgICBpZiAodGhpcy5ydWxlcy5vdGhlci5ibG9ja3F1b3RlU3RhcnQudGVzdChsaW5lc1tpXSkpIHtcbiAgICAgICAgICAgIGN1cnJlbnRMaW5lcy5wdXNoKGxpbmVzW2ldKTtcbiAgICAgICAgICAgIGluQmxvY2txdW90ZSA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmICghaW5CbG9ja3F1b3RlKSB7XG4gICAgICAgICAgICBjdXJyZW50TGluZXMucHVzaChsaW5lc1tpXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsaW5lcyA9IGxpbmVzLnNsaWNlKGkpO1xuXG4gICAgICAgIGNvbnN0IGN1cnJlbnRSYXcgPSBjdXJyZW50TGluZXMuam9pbignXFxuJyk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRUZXh0ID0gY3VycmVudFJhd1xuICAgICAgICAgIC8vIHByZWNlZGUgc2V0ZXh0IGNvbnRpbnVhdGlvbiB3aXRoIDQgc3BhY2VzIHNvIGl0IGlzbid0IGEgc2V0ZXh0XG4gICAgICAgICAgLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5ibG9ja3F1b3RlU2V0ZXh0UmVwbGFjZSwgJ1xcbiAgICAkMScpXG4gICAgICAgICAgLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5ibG9ja3F1b3RlU2V0ZXh0UmVwbGFjZTIsICcnKTtcbiAgICAgICAgcmF3ID0gcmF3ID8gYCR7cmF3fVxcbiR7Y3VycmVudFJhd31gIDogY3VycmVudFJhdztcbiAgICAgICAgdGV4dCA9IHRleHQgPyBgJHt0ZXh0fVxcbiR7Y3VycmVudFRleHR9YCA6IGN1cnJlbnRUZXh0O1xuXG4gICAgICAgIC8vIHBhcnNlIGJsb2NrcXVvdGUgbGluZXMgYXMgdG9wIGxldmVsIHRva2Vuc1xuICAgICAgICAvLyBtZXJnZSBwYXJhZ3JhcGhzIGlmIHRoaXMgaXMgYSBjb250aW51YXRpb25cbiAgICAgICAgY29uc3QgdG9wID0gdGhpcy5sZXhlci5zdGF0ZS50b3A7XG4gICAgICAgIHRoaXMubGV4ZXIuc3RhdGUudG9wID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5sZXhlci5ibG9ja1Rva2VucyhjdXJyZW50VGV4dCwgdG9rZW5zLCB0cnVlKTtcbiAgICAgICAgdGhpcy5sZXhlci5zdGF0ZS50b3AgPSB0b3A7XG5cbiAgICAgICAgLy8gaWYgdGhlcmUgaXMgbm8gY29udGludWF0aW9uIHRoZW4gd2UgYXJlIGRvbmVcbiAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGFzdFRva2VuID0gdG9rZW5zLmF0KC0xKTtcblxuICAgICAgICBpZiAobGFzdFRva2VuPy50eXBlID09PSAnY29kZScpIHtcbiAgICAgICAgICAvLyBibG9ja3F1b3RlIGNvbnRpbnVhdGlvbiBjYW5ub3QgYmUgcHJlY2VkZWQgYnkgYSBjb2RlIGJsb2NrXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSBpZiAobGFzdFRva2VuPy50eXBlID09PSAnYmxvY2txdW90ZScpIHtcbiAgICAgICAgICAvLyBpbmNsdWRlIGNvbnRpbnVhdGlvbiBpbiBuZXN0ZWQgYmxvY2txdW90ZVxuICAgICAgICAgIGNvbnN0IG9sZFRva2VuID0gbGFzdFRva2VuIGFzIFRva2Vucy5CbG9ja3F1b3RlO1xuICAgICAgICAgIGNvbnN0IG5ld1RleHQgPSBvbGRUb2tlbi5yYXcgKyAnXFxuJyArIGxpbmVzLmpvaW4oJ1xcbicpO1xuICAgICAgICAgIGNvbnN0IG5ld1Rva2VuID0gdGhpcy5ibG9ja3F1b3RlKG5ld1RleHQpITtcbiAgICAgICAgICB0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdID0gbmV3VG9rZW47XG5cbiAgICAgICAgICByYXcgPSByYXcuc3Vic3RyaW5nKDAsIHJhdy5sZW5ndGggLSBvbGRUb2tlbi5yYXcubGVuZ3RoKSArIG5ld1Rva2VuLnJhdztcbiAgICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMCwgdGV4dC5sZW5ndGggLSBvbGRUb2tlbi50ZXh0Lmxlbmd0aCkgKyBuZXdUb2tlbi50ZXh0O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2UgaWYgKGxhc3RUb2tlbj8udHlwZSA9PT0gJ2xpc3QnKSB7XG4gICAgICAgICAgLy8gaW5jbHVkZSBjb250aW51YXRpb24gaW4gbmVzdGVkIGxpc3RcbiAgICAgICAgICBjb25zdCBvbGRUb2tlbiA9IGxhc3RUb2tlbiBhcyBUb2tlbnMuTGlzdDtcbiAgICAgICAgICBjb25zdCBuZXdUZXh0ID0gb2xkVG9rZW4ucmF3ICsgJ1xcbicgKyBsaW5lcy5qb2luKCdcXG4nKTtcbiAgICAgICAgICBjb25zdCBuZXdUb2tlbiA9IHRoaXMubGlzdChuZXdUZXh0KSE7XG4gICAgICAgICAgdG9rZW5zW3Rva2Vucy5sZW5ndGggLSAxXSA9IG5ld1Rva2VuO1xuXG4gICAgICAgICAgcmF3ID0gcmF3LnN1YnN0cmluZygwLCByYXcubGVuZ3RoIC0gbGFzdFRva2VuLnJhdy5sZW5ndGgpICsgbmV3VG9rZW4ucmF3O1xuICAgICAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cmluZygwLCB0ZXh0Lmxlbmd0aCAtIG9sZFRva2VuLnJhdy5sZW5ndGgpICsgbmV3VG9rZW4ucmF3O1xuICAgICAgICAgIGxpbmVzID0gbmV3VGV4dC5zdWJzdHJpbmcodG9rZW5zLmF0KC0xKSEucmF3Lmxlbmd0aCkuc3BsaXQoJ1xcbicpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdibG9ja3F1b3RlJyxcbiAgICAgICAgcmF3LFxuICAgICAgICB0b2tlbnMsXG4gICAgICAgIHRleHQsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGxpc3Qoc3JjOiBzdHJpbmcpOiBUb2tlbnMuTGlzdCB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGNhcCA9IHRoaXMucnVsZXMuYmxvY2subGlzdC5leGVjKHNyYyk7XG4gICAgaWYgKGNhcCkge1xuICAgICAgbGV0IGJ1bGwgPSBjYXBbMV0udHJpbSgpO1xuICAgICAgY29uc3QgaXNvcmRlcmVkID0gYnVsbC5sZW5ndGggPiAxO1xuXG4gICAgICBjb25zdCBsaXN0OiBUb2tlbnMuTGlzdCA9IHtcbiAgICAgICAgdHlwZTogJ2xpc3QnLFxuICAgICAgICByYXc6ICcnLFxuICAgICAgICBvcmRlcmVkOiBpc29yZGVyZWQsXG4gICAgICAgIHN0YXJ0OiBpc29yZGVyZWQgPyArYnVsbC5zbGljZSgwLCAtMSkgOiAnJyxcbiAgICAgICAgbG9vc2U6IGZhbHNlLFxuICAgICAgICBpdGVtczogW10sXG4gICAgICB9O1xuXG4gICAgICBidWxsID0gaXNvcmRlcmVkID8gYFxcXFxkezEsOX1cXFxcJHtidWxsLnNsaWNlKC0xKX1gIDogYFxcXFwke2J1bGx9YDtcblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5wZWRhbnRpYykge1xuICAgICAgICBidWxsID0gaXNvcmRlcmVkID8gYnVsbCA6ICdbKistXSc7XG4gICAgICB9XG5cbiAgICAgIC8vIEdldCBuZXh0IGxpc3QgaXRlbVxuICAgICAgY29uc3QgaXRlbVJlZ2V4ID0gdGhpcy5ydWxlcy5vdGhlci5saXN0SXRlbVJlZ2V4KGJ1bGwpO1xuICAgICAgbGV0IGVuZHNXaXRoQmxhbmtMaW5lID0gZmFsc2U7XG4gICAgICAvLyBDaGVjayBpZiBjdXJyZW50IGJ1bGxldCBwb2ludCBjYW4gc3RhcnQgYSBuZXcgTGlzdCBJdGVtXG4gICAgICB3aGlsZSAoc3JjKSB7XG4gICAgICAgIGxldCBlbmRFYXJseSA9IGZhbHNlO1xuICAgICAgICBsZXQgcmF3ID0gJyc7XG4gICAgICAgIGxldCBpdGVtQ29udGVudHMgPSAnJztcbiAgICAgICAgaWYgKCEoY2FwID0gaXRlbVJlZ2V4LmV4ZWMoc3JjKSkpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnJ1bGVzLmJsb2NrLmhyLnRlc3Qoc3JjKSkgeyAvLyBFbmQgbGlzdCBpZiBidWxsZXQgd2FzIGFjdHVhbGx5IEhSIChwb3NzaWJseSBtb3ZlIGludG8gaXRlbVJlZ2V4PylcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJhdyA9IGNhcFswXTtcbiAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyhyYXcubGVuZ3RoKTtcblxuICAgICAgICBsZXQgbGluZSA9IGV4cGFuZFRhYnMoY2FwWzJdLnNwbGl0KCdcXG4nLCAxKVswXSwgY2FwWzFdLmxlbmd0aCk7XG4gICAgICAgIGxldCBuZXh0TGluZSA9IHNyYy5zcGxpdCgnXFxuJywgMSlbMF07XG4gICAgICAgIGxldCBibGFua0xpbmUgPSAhbGluZS50cmltKCk7XG5cbiAgICAgICAgbGV0IGluZGVudCA9IDA7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMucGVkYW50aWMpIHtcbiAgICAgICAgICBpbmRlbnQgPSAyO1xuICAgICAgICAgIGl0ZW1Db250ZW50cyA9IGxpbmUudHJpbVN0YXJ0KCk7XG4gICAgICAgIH0gZWxzZSBpZiAoYmxhbmtMaW5lKSB7XG4gICAgICAgICAgaW5kZW50ID0gY2FwWzFdLmxlbmd0aCArIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaW5kZW50ID0gbGluZS5zZWFyY2godGhpcy5ydWxlcy5vdGhlci5ub25TcGFjZUNoYXIpOyAvLyBGaW5kIGZpcnN0IG5vbi1zcGFjZSBjaGFyXG4gICAgICAgICAgaW5kZW50ID0gaW5kZW50ID4gNCA/IDEgOiBpbmRlbnQ7IC8vIFRyZWF0IGluZGVudGVkIGNvZGUgYmxvY2tzICg+IDQgc3BhY2VzKSBhcyBoYXZpbmcgb25seSAxIGluZGVudFxuICAgICAgICAgIGl0ZW1Db250ZW50cyA9IGxpbmUuc2xpY2UoaW5kZW50KTtcbiAgICAgICAgICBpbmRlbnQgKz0gY2FwWzFdLmxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChibGFua0xpbmUgJiYgdGhpcy5ydWxlcy5vdGhlci5ibGFua0xpbmUudGVzdChuZXh0TGluZSkpIHsgLy8gSXRlbXMgYmVnaW4gd2l0aCBhdCBtb3N0IG9uZSBibGFuayBsaW5lXG4gICAgICAgICAgcmF3ICs9IG5leHRMaW5lICsgJ1xcbic7XG4gICAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyhuZXh0TGluZS5sZW5ndGggKyAxKTtcbiAgICAgICAgICBlbmRFYXJseSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWVuZEVhcmx5KSB7XG4gICAgICAgICAgY29uc3QgbmV4dEJ1bGxldFJlZ2V4ID0gdGhpcy5ydWxlcy5vdGhlci5uZXh0QnVsbGV0UmVnZXgoaW5kZW50KTtcbiAgICAgICAgICBjb25zdCBoclJlZ2V4ID0gdGhpcy5ydWxlcy5vdGhlci5oclJlZ2V4KGluZGVudCk7XG4gICAgICAgICAgY29uc3QgZmVuY2VzQmVnaW5SZWdleCA9IHRoaXMucnVsZXMub3RoZXIuZmVuY2VzQmVnaW5SZWdleChpbmRlbnQpO1xuICAgICAgICAgIGNvbnN0IGhlYWRpbmdCZWdpblJlZ2V4ID0gdGhpcy5ydWxlcy5vdGhlci5oZWFkaW5nQmVnaW5SZWdleChpbmRlbnQpO1xuICAgICAgICAgIGNvbnN0IGh0bWxCZWdpblJlZ2V4ID0gdGhpcy5ydWxlcy5vdGhlci5odG1sQmVnaW5SZWdleChpbmRlbnQpO1xuICAgICAgICAgIGNvbnN0IGJsb2NrcXVvdGVCZWdpblJlZ2V4ID0gdGhpcy5ydWxlcy5vdGhlci5ibG9ja3F1b3RlQmVnaW5SZWdleChpbmRlbnQpO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgZm9sbG93aW5nIGxpbmVzIHNob3VsZCBiZSBpbmNsdWRlZCBpbiBMaXN0IEl0ZW1cbiAgICAgICAgICB3aGlsZSAoc3JjKSB7XG4gICAgICAgICAgICBjb25zdCByYXdMaW5lID0gc3JjLnNwbGl0KCdcXG4nLCAxKVswXTtcbiAgICAgICAgICAgIGxldCBuZXh0TGluZVdpdGhvdXRUYWJzO1xuICAgICAgICAgICAgbmV4dExpbmUgPSByYXdMaW5lO1xuXG4gICAgICAgICAgICAvLyBSZS1hbGlnbiB0byBmb2xsb3cgY29tbW9ubWFyayBuZXN0aW5nIHJ1bGVzXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnBlZGFudGljKSB7XG4gICAgICAgICAgICAgIG5leHRMaW5lID0gbmV4dExpbmUucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLmxpc3RSZXBsYWNlTmVzdGluZywgJyAgJyk7XG4gICAgICAgICAgICAgIG5leHRMaW5lV2l0aG91dFRhYnMgPSBuZXh0TGluZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG5leHRMaW5lV2l0aG91dFRhYnMgPSBuZXh0TGluZS5yZXBsYWNlKHRoaXMucnVsZXMub3RoZXIudGFiQ2hhckdsb2JhbCwgJyAgICAnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRW5kIGxpc3QgaXRlbSBpZiBmb3VuZCBjb2RlIGZlbmNlc1xuICAgICAgICAgICAgaWYgKGZlbmNlc0JlZ2luUmVnZXgudGVzdChuZXh0TGluZSkpIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEVuZCBsaXN0IGl0ZW0gaWYgZm91bmQgc3RhcnQgb2YgbmV3IGhlYWRpbmdcbiAgICAgICAgICAgIGlmIChoZWFkaW5nQmVnaW5SZWdleC50ZXN0KG5leHRMaW5lKSkge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRW5kIGxpc3QgaXRlbSBpZiBmb3VuZCBzdGFydCBvZiBodG1sIGJsb2NrXG4gICAgICAgICAgICBpZiAoaHRtbEJlZ2luUmVnZXgudGVzdChuZXh0TGluZSkpIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEVuZCBsaXN0IGl0ZW0gaWYgZm91bmQgc3RhcnQgb2YgYmxvY2txdW90ZVxuICAgICAgICAgICAgaWYgKGJsb2NrcXVvdGVCZWdpblJlZ2V4LnRlc3QobmV4dExpbmUpKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBFbmQgbGlzdCBpdGVtIGlmIGZvdW5kIHN0YXJ0IG9mIG5ldyBidWxsZXRcbiAgICAgICAgICAgIGlmIChuZXh0QnVsbGV0UmVnZXgudGVzdChuZXh0TGluZSkpIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEhvcml6b250YWwgcnVsZSBmb3VuZFxuICAgICAgICAgICAgaWYgKGhyUmVnZXgudGVzdChuZXh0TGluZSkpIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChuZXh0TGluZVdpdGhvdXRUYWJzLnNlYXJjaCh0aGlzLnJ1bGVzLm90aGVyLm5vblNwYWNlQ2hhcikgPj0gaW5kZW50IHx8ICFuZXh0TGluZS50cmltKCkpIHsgLy8gRGVkZW50IGlmIHBvc3NpYmxlXG4gICAgICAgICAgICAgIGl0ZW1Db250ZW50cyArPSAnXFxuJyArIG5leHRMaW5lV2l0aG91dFRhYnMuc2xpY2UoaW5kZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIG5vdCBlbm91Z2ggaW5kZW50YXRpb25cbiAgICAgICAgICAgICAgaWYgKGJsYW5rTGluZSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gcGFyYWdyYXBoIGNvbnRpbnVhdGlvbiB1bmxlc3MgbGFzdCBsaW5lIHdhcyBhIGRpZmZlcmVudCBibG9jayBsZXZlbCBlbGVtZW50XG4gICAgICAgICAgICAgIGlmIChsaW5lLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci50YWJDaGFyR2xvYmFsLCAnICAgICcpLnNlYXJjaCh0aGlzLnJ1bGVzLm90aGVyLm5vblNwYWNlQ2hhcikgPj0gNCkgeyAvLyBpbmRlbnRlZCBjb2RlIGJsb2NrXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGZlbmNlc0JlZ2luUmVnZXgudGVzdChsaW5lKSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChoZWFkaW5nQmVnaW5SZWdleC50ZXN0KGxpbmUpKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGhyUmVnZXgudGVzdChsaW5lKSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaXRlbUNvbnRlbnRzICs9ICdcXG4nICsgbmV4dExpbmU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJsYW5rTGluZSA9ICFuZXh0TGluZS50cmltKCk7XG5cbiAgICAgICAgICAgIHJhdyArPSByYXdMaW5lICsgJ1xcbic7XG4gICAgICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHJhd0xpbmUubGVuZ3RoICsgMSk7XG4gICAgICAgICAgICBsaW5lID0gbmV4dExpbmVXaXRob3V0VGFicy5zbGljZShpbmRlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbGlzdC5sb29zZSkge1xuICAgICAgICAgIC8vIElmIHRoZSBwcmV2aW91cyBpdGVtIGVuZGVkIHdpdGggYSBibGFuayBsaW5lLCB0aGUgbGlzdCBpcyBsb29zZVxuICAgICAgICAgIGlmIChlbmRzV2l0aEJsYW5rTGluZSkge1xuICAgICAgICAgICAgbGlzdC5sb29zZSA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJ1bGVzLm90aGVyLmRvdWJsZUJsYW5rTGluZS50ZXN0KHJhdykpIHtcbiAgICAgICAgICAgIGVuZHNXaXRoQmxhbmtMaW5lID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsaXN0Lml0ZW1zLnB1c2goe1xuICAgICAgICAgIHR5cGU6ICdsaXN0X2l0ZW0nLFxuICAgICAgICAgIHJhdyxcbiAgICAgICAgICB0YXNrOiAhIXRoaXMub3B0aW9ucy5nZm0gJiYgdGhpcy5ydWxlcy5vdGhlci5saXN0SXNUYXNrLnRlc3QoaXRlbUNvbnRlbnRzKSxcbiAgICAgICAgICBsb29zZTogZmFsc2UsXG4gICAgICAgICAgdGV4dDogaXRlbUNvbnRlbnRzLFxuICAgICAgICAgIHRva2VuczogW10sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxpc3QucmF3ICs9IHJhdztcbiAgICAgIH1cblxuICAgICAgLy8gRG8gbm90IGNvbnN1bWUgbmV3bGluZXMgYXQgZW5kIG9mIGZpbmFsIGl0ZW0uIEFsdGVybmF0aXZlbHksIG1ha2UgaXRlbVJlZ2V4ICpzdGFydCogd2l0aCBhbnkgbmV3bGluZXMgdG8gc2ltcGxpZnkvc3BlZWQgdXAgZW5kc1dpdGhCbGFua0xpbmUgbG9naWNcbiAgICAgIGNvbnN0IGxhc3RJdGVtID0gbGlzdC5pdGVtcy5hdCgtMSk7XG4gICAgICBpZiAobGFzdEl0ZW0pIHtcbiAgICAgICAgbGFzdEl0ZW0ucmF3ID0gbGFzdEl0ZW0ucmF3LnRyaW1FbmQoKTtcbiAgICAgICAgbGFzdEl0ZW0udGV4dCA9IGxhc3RJdGVtLnRleHQudHJpbUVuZCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gbm90IGEgbGlzdCBzaW5jZSB0aGVyZSB3ZXJlIG5vIGl0ZW1zXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxpc3QucmF3ID0gbGlzdC5yYXcudHJpbUVuZCgpO1xuXG4gICAgICAvLyBJdGVtIGNoaWxkIHRva2VucyBoYW5kbGVkIGhlcmUgYXQgZW5kIGJlY2F1c2Ugd2UgbmVlZGVkIHRvIGhhdmUgdGhlIGZpbmFsIGl0ZW0gdG8gdHJpbSBpdCBmaXJzdFxuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGxpc3QuaXRlbXMpIHtcbiAgICAgICAgdGhpcy5sZXhlci5zdGF0ZS50b3AgPSBmYWxzZTtcbiAgICAgICAgaXRlbS50b2tlbnMgPSB0aGlzLmxleGVyLmJsb2NrVG9rZW5zKGl0ZW0udGV4dCwgW10pO1xuICAgICAgICBpZiAoaXRlbS50YXNrKSB7XG4gICAgICAgICAgLy8gUmVtb3ZlIGNoZWNrYm94IG1hcmtkb3duIGZyb20gaXRlbSB0b2tlbnNcbiAgICAgICAgICBpdGVtLnRleHQgPSBpdGVtLnRleHQucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLmxpc3RSZXBsYWNlVGFzaywgJycpO1xuICAgICAgICAgIGlmIChpdGVtLnRva2Vuc1swXT8udHlwZSA9PT0gJ3RleHQnIHx8IGl0ZW0udG9rZW5zWzBdPy50eXBlID09PSAncGFyYWdyYXBoJykge1xuICAgICAgICAgICAgaXRlbS50b2tlbnNbMF0ucmF3ID0gaXRlbS50b2tlbnNbMF0ucmF3LnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5saXN0UmVwbGFjZVRhc2ssICcnKTtcbiAgICAgICAgICAgIGl0ZW0udG9rZW5zWzBdLnRleHQgPSBpdGVtLnRva2Vuc1swXS50ZXh0LnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5saXN0UmVwbGFjZVRhc2ssICcnKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmxleGVyLmlubGluZVF1ZXVlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLnJ1bGVzLm90aGVyLmxpc3RJc1Rhc2sudGVzdCh0aGlzLmxleGVyLmlubGluZVF1ZXVlW2ldLnNyYykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxleGVyLmlubGluZVF1ZXVlW2ldLnNyYyA9IHRoaXMubGV4ZXIuaW5saW5lUXVldWVbaV0uc3JjLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5saXN0UmVwbGFjZVRhc2ssICcnKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHRhc2tSYXcgPSB0aGlzLnJ1bGVzLm90aGVyLmxpc3RUYXNrQ2hlY2tib3guZXhlYyhpdGVtLnJhdyk7XG4gICAgICAgICAgaWYgKHRhc2tSYXcpIHtcbiAgICAgICAgICAgIGNvbnN0IGNoZWNrYm94VG9rZW46IFRva2Vucy5DaGVja2JveCA9IHtcbiAgICAgICAgICAgICAgdHlwZTogJ2NoZWNrYm94JyxcbiAgICAgICAgICAgICAgcmF3OiB0YXNrUmF3WzBdICsgJyAnLFxuICAgICAgICAgICAgICBjaGVja2VkOiB0YXNrUmF3WzBdICE9PSAnWyBdJyxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpdGVtLmNoZWNrZWQgPSBjaGVja2JveFRva2VuLmNoZWNrZWQ7XG4gICAgICAgICAgICBpZiAobGlzdC5sb29zZSkge1xuICAgICAgICAgICAgICBpZiAoaXRlbS50b2tlbnNbMF0gJiYgWydwYXJhZ3JhcGgnLCAndGV4dCddLmluY2x1ZGVzKGl0ZW0udG9rZW5zWzBdLnR5cGUpICYmICd0b2tlbnMnIGluIGl0ZW0udG9rZW5zWzBdICYmIGl0ZW0udG9rZW5zWzBdLnRva2Vucykge1xuICAgICAgICAgICAgICAgIGl0ZW0udG9rZW5zWzBdLnJhdyA9IGNoZWNrYm94VG9rZW4ucmF3ICsgaXRlbS50b2tlbnNbMF0ucmF3O1xuICAgICAgICAgICAgICAgIGl0ZW0udG9rZW5zWzBdLnRleHQgPSBjaGVja2JveFRva2VuLnJhdyArIGl0ZW0udG9rZW5zWzBdLnRleHQ7XG4gICAgICAgICAgICAgICAgaXRlbS50b2tlbnNbMF0udG9rZW5zLnVuc2hpZnQoY2hlY2tib3hUb2tlbik7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaXRlbS50b2tlbnMudW5zaGlmdCh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiAncGFyYWdyYXBoJyxcbiAgICAgICAgICAgICAgICAgIHJhdzogY2hlY2tib3hUb2tlbi5yYXcsXG4gICAgICAgICAgICAgICAgICB0ZXh0OiBjaGVja2JveFRva2VuLnJhdyxcbiAgICAgICAgICAgICAgICAgIHRva2VuczogW2NoZWNrYm94VG9rZW5dLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpdGVtLnRva2Vucy51bnNoaWZ0KGNoZWNrYm94VG9rZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbGlzdC5sb29zZSkge1xuICAgICAgICAgIC8vIENoZWNrIGlmIGxpc3Qgc2hvdWxkIGJlIGxvb3NlXG4gICAgICAgICAgY29uc3Qgc3BhY2VycyA9IGl0ZW0udG9rZW5zLmZpbHRlcih0ID0+IHQudHlwZSA9PT0gJ3NwYWNlJyk7XG4gICAgICAgICAgY29uc3QgaGFzTXVsdGlwbGVMaW5lQnJlYWtzID0gc3BhY2Vycy5sZW5ndGggPiAwICYmIHNwYWNlcnMuc29tZSh0ID0+IHRoaXMucnVsZXMub3RoZXIuYW55TGluZS50ZXN0KHQucmF3KSk7XG5cbiAgICAgICAgICBsaXN0Lmxvb3NlID0gaGFzTXVsdGlwbGVMaW5lQnJlYWtzO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCBhbGwgaXRlbXMgdG8gbG9vc2UgaWYgbGlzdCBpcyBsb29zZVxuICAgICAgaWYgKGxpc3QubG9vc2UpIHtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGxpc3QuaXRlbXMpIHtcbiAgICAgICAgICBpdGVtLmxvb3NlID0gdHJ1ZTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHRva2VuIG9mIGl0ZW0udG9rZW5zKSB7XG4gICAgICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICAgICAgICAgIHRva2VuLnR5cGUgPSAncGFyYWdyYXBoJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGxpc3Q7XG4gICAgfVxuICB9XG5cbiAgaHRtbChzcmM6IHN0cmluZyk6IFRva2Vucy5IVE1MIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjYXAgPSB0aGlzLnJ1bGVzLmJsb2NrLmh0bWwuZXhlYyhzcmMpO1xuICAgIGlmIChjYXApIHtcbiAgICAgIGNvbnN0IHRva2VuOiBUb2tlbnMuSFRNTCA9IHtcbiAgICAgICAgdHlwZTogJ2h0bWwnLFxuICAgICAgICBibG9jazogdHJ1ZSxcbiAgICAgICAgcmF3OiBjYXBbMF0sXG4gICAgICAgIHByZTogY2FwWzFdID09PSAncHJlJyB8fCBjYXBbMV0gPT09ICdzY3JpcHQnIHx8IGNhcFsxXSA9PT0gJ3N0eWxlJyxcbiAgICAgICAgdGV4dDogY2FwWzBdLFxuICAgICAgfTtcbiAgICAgIHJldHVybiB0b2tlbjtcbiAgICB9XG4gIH1cblxuICBkZWYoc3JjOiBzdHJpbmcpOiBUb2tlbnMuRGVmIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjYXAgPSB0aGlzLnJ1bGVzLmJsb2NrLmRlZi5leGVjKHNyYyk7XG4gICAgaWYgKGNhcCkge1xuICAgICAgY29uc3QgdGFnID0gY2FwWzFdLnRvTG93ZXJDYXNlKCkucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLm11bHRpcGxlU3BhY2VHbG9iYWwsICcgJyk7XG4gICAgICBjb25zdCBocmVmID0gY2FwWzJdID8gY2FwWzJdLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5ocmVmQnJhY2tldHMsICckMScpLnJlcGxhY2UodGhpcy5ydWxlcy5pbmxpbmUuYW55UHVuY3R1YXRpb24sICckMScpIDogJyc7XG4gICAgICBjb25zdCB0aXRsZSA9IGNhcFszXSA/IGNhcFszXS5zdWJzdHJpbmcoMSwgY2FwWzNdLmxlbmd0aCAtIDEpLnJlcGxhY2UodGhpcy5ydWxlcy5pbmxpbmUuYW55UHVuY3R1YXRpb24sICckMScpIDogY2FwWzNdO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ2RlZicsXG4gICAgICAgIHRhZyxcbiAgICAgICAgcmF3OiBjYXBbMF0sXG4gICAgICAgIGhyZWYsXG4gICAgICAgIHRpdGxlLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICB0YWJsZShzcmM6IHN0cmluZyk6IFRva2Vucy5UYWJsZSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5ibG9jay50YWJsZS5leGVjKHNyYyk7XG4gICAgaWYgKCFjYXApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMucnVsZXMub3RoZXIudGFibGVEZWxpbWl0ZXIudGVzdChjYXBbMl0pKSB7XG4gICAgICAvLyBkZWxpbWl0ZXIgcm93IG11c3QgaGF2ZSBhIHBpcGUgKHwpIG9yIGNvbG9uICg6KSBvdGhlcndpc2UgaXQgaXMgYSBzZXRleHQgaGVhZGluZ1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGhlYWRlcnMgPSBzcGxpdENlbGxzKGNhcFsxXSk7XG4gICAgY29uc3QgYWxpZ25zID0gY2FwWzJdLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci50YWJsZUFsaWduQ2hhcnMsICcnKS5zcGxpdCgnfCcpO1xuICAgIGNvbnN0IHJvd3MgPSBjYXBbM10/LnRyaW0oKSA/IGNhcFszXS5yZXBsYWNlKHRoaXMucnVsZXMub3RoZXIudGFibGVSb3dCbGFua0xpbmUsICcnKS5zcGxpdCgnXFxuJykgOiBbXTtcblxuICAgIGNvbnN0IGl0ZW06IFRva2Vucy5UYWJsZSA9IHtcbiAgICAgIHR5cGU6ICd0YWJsZScsXG4gICAgICByYXc6IGNhcFswXSxcbiAgICAgIGhlYWRlcjogW10sXG4gICAgICBhbGlnbjogW10sXG4gICAgICByb3dzOiBbXSxcbiAgICB9O1xuXG4gICAgaWYgKGhlYWRlcnMubGVuZ3RoICE9PSBhbGlnbnMubGVuZ3RoKSB7XG4gICAgICAvLyBoZWFkZXIgYW5kIGFsaWduIGNvbHVtbnMgbXVzdCBiZSBlcXVhbCwgcm93cyBjYW4gYmUgZGlmZmVyZW50LlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgYWxpZ24gb2YgYWxpZ25zKSB7XG4gICAgICBpZiAodGhpcy5ydWxlcy5vdGhlci50YWJsZUFsaWduUmlnaHQudGVzdChhbGlnbikpIHtcbiAgICAgICAgaXRlbS5hbGlnbi5wdXNoKCdyaWdodCcpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnJ1bGVzLm90aGVyLnRhYmxlQWxpZ25DZW50ZXIudGVzdChhbGlnbikpIHtcbiAgICAgICAgaXRlbS5hbGlnbi5wdXNoKCdjZW50ZXInKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5ydWxlcy5vdGhlci50YWJsZUFsaWduTGVmdC50ZXN0KGFsaWduKSkge1xuICAgICAgICBpdGVtLmFsaWduLnB1c2goJ2xlZnQnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGl0ZW0uYWxpZ24ucHVzaChudWxsKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlYWRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGl0ZW0uaGVhZGVyLnB1c2goe1xuICAgICAgICB0ZXh0OiBoZWFkZXJzW2ldLFxuICAgICAgICB0b2tlbnM6IHRoaXMubGV4ZXIuaW5saW5lKGhlYWRlcnNbaV0pLFxuICAgICAgICBoZWFkZXI6IHRydWUsXG4gICAgICAgIGFsaWduOiBpdGVtLmFsaWduW2ldLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgICAgaXRlbS5yb3dzLnB1c2goc3BsaXRDZWxscyhyb3csIGl0ZW0uaGVhZGVyLmxlbmd0aCkubWFwKChjZWxsLCBpKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdGV4dDogY2VsbCxcbiAgICAgICAgICB0b2tlbnM6IHRoaXMubGV4ZXIuaW5saW5lKGNlbGwpLFxuICAgICAgICAgIGhlYWRlcjogZmFsc2UsXG4gICAgICAgICAgYWxpZ246IGl0ZW0uYWxpZ25baV0sXG4gICAgICAgIH07XG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGl0ZW07XG4gIH1cblxuICBsaGVhZGluZyhzcmM6IHN0cmluZyk6IFRva2Vucy5IZWFkaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjYXAgPSB0aGlzLnJ1bGVzLmJsb2NrLmxoZWFkaW5nLmV4ZWMoc3JjKTtcbiAgICBpZiAoY2FwKSB7XG4gICAgICBjb25zdCB0ZXh0ID0gY2FwWzFdLnRyaW0oKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdoZWFkaW5nJyxcbiAgICAgICAgcmF3OiBjYXBbMF0sXG4gICAgICAgIGRlcHRoOiBjYXBbMl0uY2hhckF0KDApID09PSAnPScgPyAxIDogMixcbiAgICAgICAgdGV4dCxcbiAgICAgICAgdG9rZW5zOiB0aGlzLmxleGVyLmlubGluZSh0ZXh0KSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcGFyYWdyYXBoKHNyYzogc3RyaW5nKTogVG9rZW5zLlBhcmFncmFwaCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5ibG9jay5wYXJhZ3JhcGguZXhlYyhzcmMpO1xuICAgIGlmIChjYXApIHtcbiAgICAgIGNvbnN0IHRleHQgPSBjYXBbMV0uY2hhckF0KGNhcFsxXS5sZW5ndGggLSAxKSA9PT0gJ1xcbidcbiAgICAgICAgPyBjYXBbMV0uc2xpY2UoMCwgLTEpXG4gICAgICAgIDogY2FwWzFdO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ3BhcmFncmFwaCcsXG4gICAgICAgIHJhdzogY2FwWzBdLFxuICAgICAgICB0ZXh0LFxuICAgICAgICB0b2tlbnM6IHRoaXMubGV4ZXIuaW5saW5lKHRleHQpLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICB0ZXh0KHNyYzogc3RyaW5nKTogVG9rZW5zLlRleHQgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuYmxvY2sudGV4dC5leGVjKHNyYyk7XG4gICAgaWYgKGNhcCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICByYXc6IGNhcFswXSxcbiAgICAgICAgdGV4dDogY2FwWzBdLFxuICAgICAgICB0b2tlbnM6IHRoaXMubGV4ZXIuaW5saW5lKGNhcFswXSksXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGVzY2FwZShzcmM6IHN0cmluZyk6IFRva2Vucy5Fc2NhcGUgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuaW5saW5lLmVzY2FwZS5leGVjKHNyYyk7XG4gICAgaWYgKGNhcCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ2VzY2FwZScsXG4gICAgICAgIHJhdzogY2FwWzBdLFxuICAgICAgICB0ZXh0OiBjYXBbMV0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHRhZyhzcmM6IHN0cmluZyk6IFRva2Vucy5UYWcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuaW5saW5lLnRhZy5leGVjKHNyYyk7XG4gICAgaWYgKGNhcCkge1xuICAgICAgaWYgKCF0aGlzLmxleGVyLnN0YXRlLmluTGluayAmJiB0aGlzLnJ1bGVzLm90aGVyLnN0YXJ0QVRhZy50ZXN0KGNhcFswXSkpIHtcbiAgICAgICAgdGhpcy5sZXhlci5zdGF0ZS5pbkxpbmsgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmxleGVyLnN0YXRlLmluTGluayAmJiB0aGlzLnJ1bGVzLm90aGVyLmVuZEFUYWcudGVzdChjYXBbMF0pKSB7XG4gICAgICAgIHRoaXMubGV4ZXIuc3RhdGUuaW5MaW5rID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMubGV4ZXIuc3RhdGUuaW5SYXdCbG9jayAmJiB0aGlzLnJ1bGVzLm90aGVyLnN0YXJ0UHJlU2NyaXB0VGFnLnRlc3QoY2FwWzBdKSkge1xuICAgICAgICB0aGlzLmxleGVyLnN0YXRlLmluUmF3QmxvY2sgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmxleGVyLnN0YXRlLmluUmF3QmxvY2sgJiYgdGhpcy5ydWxlcy5vdGhlci5lbmRQcmVTY3JpcHRUYWcudGVzdChjYXBbMF0pKSB7XG4gICAgICAgIHRoaXMubGV4ZXIuc3RhdGUuaW5SYXdCbG9jayA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAnaHRtbCcsXG4gICAgICAgIHJhdzogY2FwWzBdLFxuICAgICAgICBpbkxpbms6IHRoaXMubGV4ZXIuc3RhdGUuaW5MaW5rLFxuICAgICAgICBpblJhd0Jsb2NrOiB0aGlzLmxleGVyLnN0YXRlLmluUmF3QmxvY2ssXG4gICAgICAgIGJsb2NrOiBmYWxzZSxcbiAgICAgICAgdGV4dDogY2FwWzBdLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBsaW5rKHNyYzogc3RyaW5nKTogVG9rZW5zLkxpbmsgfCBUb2tlbnMuSW1hZ2UgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuaW5saW5lLmxpbmsuZXhlYyhzcmMpO1xuICAgIGlmIChjYXApIHtcbiAgICAgIGNvbnN0IHRyaW1tZWRVcmwgPSBjYXBbMl0udHJpbSgpO1xuICAgICAgaWYgKCF0aGlzLm9wdGlvbnMucGVkYW50aWMgJiYgdGhpcy5ydWxlcy5vdGhlci5zdGFydEFuZ2xlQnJhY2tldC50ZXN0KHRyaW1tZWRVcmwpKSB7XG4gICAgICAgIC8vIGNvbW1vbm1hcmsgcmVxdWlyZXMgbWF0Y2hpbmcgYW5nbGUgYnJhY2tldHNcbiAgICAgICAgaWYgKCEodGhpcy5ydWxlcy5vdGhlci5lbmRBbmdsZUJyYWNrZXQudGVzdCh0cmltbWVkVXJsKSkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlbmRpbmcgYW5nbGUgYnJhY2tldCBjYW5ub3QgYmUgZXNjYXBlZFxuICAgICAgICBjb25zdCBydHJpbVNsYXNoID0gcnRyaW0odHJpbW1lZFVybC5zbGljZSgwLCAtMSksICdcXFxcJyk7XG4gICAgICAgIGlmICgodHJpbW1lZFVybC5sZW5ndGggLSBydHJpbVNsYXNoLmxlbmd0aCkgJSAyID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBmaW5kIGNsb3NpbmcgcGFyZW50aGVzaXNcbiAgICAgICAgY29uc3QgbGFzdFBhcmVuSW5kZXggPSBmaW5kQ2xvc2luZ0JyYWNrZXQoY2FwWzJdLCAnKCknKTtcbiAgICAgICAgaWYgKGxhc3RQYXJlbkluZGV4ID09PSAtMikge1xuICAgICAgICAgIC8vIG1vcmUgb3BlbiBwYXJlbnMgdGhhbiBjbG9zZWRcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGFzdFBhcmVuSW5kZXggPiAtMSkge1xuICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gY2FwWzBdLmluZGV4T2YoJyEnKSA9PT0gMCA/IDUgOiA0O1xuICAgICAgICAgIGNvbnN0IGxpbmtMZW4gPSBzdGFydCArIGNhcFsxXS5sZW5ndGggKyBsYXN0UGFyZW5JbmRleDtcbiAgICAgICAgICBjYXBbMl0gPSBjYXBbMl0uc3Vic3RyaW5nKDAsIGxhc3RQYXJlbkluZGV4KTtcbiAgICAgICAgICBjYXBbMF0gPSBjYXBbMF0uc3Vic3RyaW5nKDAsIGxpbmtMZW4pLnRyaW0oKTtcbiAgICAgICAgICBjYXBbM10gPSAnJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGV0IGhyZWYgPSBjYXBbMl07XG4gICAgICBsZXQgdGl0bGUgPSAnJztcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMucGVkYW50aWMpIHtcbiAgICAgICAgLy8gc3BsaXQgcGVkYW50aWMgaHJlZiBhbmQgdGl0bGVcbiAgICAgICAgY29uc3QgbGluayA9IHRoaXMucnVsZXMub3RoZXIucGVkYW50aWNIcmVmVGl0bGUuZXhlYyhocmVmKTtcblxuICAgICAgICBpZiAobGluaykge1xuICAgICAgICAgIGhyZWYgPSBsaW5rWzFdO1xuICAgICAgICAgIHRpdGxlID0gbGlua1szXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGl0bGUgPSBjYXBbM10gPyBjYXBbM10uc2xpY2UoMSwgLTEpIDogJyc7XG4gICAgICB9XG5cbiAgICAgIGhyZWYgPSBocmVmLnRyaW0oKTtcbiAgICAgIGlmICh0aGlzLnJ1bGVzLm90aGVyLnN0YXJ0QW5nbGVCcmFja2V0LnRlc3QoaHJlZikpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5wZWRhbnRpYyAmJiAhKHRoaXMucnVsZXMub3RoZXIuZW5kQW5nbGVCcmFja2V0LnRlc3QodHJpbW1lZFVybCkpKSB7XG4gICAgICAgICAgLy8gcGVkYW50aWMgYWxsb3dzIHN0YXJ0aW5nIGFuZ2xlIGJyYWNrZXQgd2l0aG91dCBlbmRpbmcgYW5nbGUgYnJhY2tldFxuICAgICAgICAgIGhyZWYgPSBocmVmLnNsaWNlKDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGhyZWYgPSBocmVmLnNsaWNlKDEsIC0xKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG91dHB1dExpbmsoY2FwLCB7XG4gICAgICAgIGhyZWY6IGhyZWYgPyBocmVmLnJlcGxhY2UodGhpcy5ydWxlcy5pbmxpbmUuYW55UHVuY3R1YXRpb24sICckMScpIDogaHJlZixcbiAgICAgICAgdGl0bGU6IHRpdGxlID8gdGl0bGUucmVwbGFjZSh0aGlzLnJ1bGVzLmlubGluZS5hbnlQdW5jdHVhdGlvbiwgJyQxJykgOiB0aXRsZSxcbiAgICAgIH0sIGNhcFswXSwgdGhpcy5sZXhlciwgdGhpcy5ydWxlcyk7XG4gICAgfVxuICB9XG5cbiAgcmVmbGluayhzcmM6IHN0cmluZywgbGlua3M6IExpbmtzKTogVG9rZW5zLkxpbmsgfCBUb2tlbnMuSW1hZ2UgfCBUb2tlbnMuVGV4dCB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGNhcDtcbiAgICBpZiAoKGNhcCA9IHRoaXMucnVsZXMuaW5saW5lLnJlZmxpbmsuZXhlYyhzcmMpKVxuICAgICAgfHwgKGNhcCA9IHRoaXMucnVsZXMuaW5saW5lLm5vbGluay5leGVjKHNyYykpKSB7XG4gICAgICBjb25zdCBsaW5rU3RyaW5nID0gKGNhcFsyXSB8fCBjYXBbMV0pLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5tdWx0aXBsZVNwYWNlR2xvYmFsLCAnICcpO1xuICAgICAgY29uc3QgbGluayA9IGxpbmtzW2xpbmtTdHJpbmcudG9Mb3dlckNhc2UoKV07XG4gICAgICBpZiAoIWxpbmspIHtcbiAgICAgICAgY29uc3QgdGV4dCA9IGNhcFswXS5jaGFyQXQoMCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgIHJhdzogdGV4dCxcbiAgICAgICAgICB0ZXh0LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG91dHB1dExpbmsoY2FwLCBsaW5rLCBjYXBbMF0sIHRoaXMubGV4ZXIsIHRoaXMucnVsZXMpO1xuICAgIH1cbiAgfVxuXG4gIGVtU3Ryb25nKHNyYzogc3RyaW5nLCBtYXNrZWRTcmM6IHN0cmluZywgcHJldkNoYXIgPSAnJyk6IFRva2Vucy5FbSB8IFRva2Vucy5TdHJvbmcgfCB1bmRlZmluZWQge1xuICAgIGxldCBtYXRjaCA9IHRoaXMucnVsZXMuaW5saW5lLmVtU3Ryb25nTERlbGltLmV4ZWMoc3JjKTtcbiAgICBpZiAoIW1hdGNoKSByZXR1cm47XG4gICAgaWYgKCFtYXRjaFsxXSAmJiAhbWF0Y2hbMl0gJiYgIW1hdGNoWzNdICYmICFtYXRjaFs0XSkgcmV0dXJuO1xuXG4gICAgLy8gXyBjYW4ndCBiZSBiZXR3ZWVuIHR3byBhbHBoYW51bWVyaWNzLiBcXHB7TH1cXHB7Tn0gaW5jbHVkZXMgbm9uLWVuZ2xpc2ggYWxwaGFiZXQvbnVtYmVycyBhcyB3ZWxsXG4gICAgaWYgKG1hdGNoWzRdICYmIHByZXZDaGFyLm1hdGNoKHRoaXMucnVsZXMub3RoZXIudW5pY29kZUFscGhhTnVtZXJpYykpIHJldHVybjtcblxuICAgIGNvbnN0IG5leHRDaGFyID0gbWF0Y2hbMV0gfHwgbWF0Y2hbM10gfHwgJyc7XG5cbiAgICBpZiAoIW5leHRDaGFyIHx8ICFwcmV2Q2hhciB8fCB0aGlzLnJ1bGVzLmlubGluZS5wdW5jdHVhdGlvbi5leGVjKHByZXZDaGFyKSkge1xuICAgICAgLy8gdW5pY29kZSBSZWdleCBjb3VudHMgZW1vamkgYXMgMSBjaGFyOyBzcHJlYWQgaW50byBhcnJheSBmb3IgcHJvcGVyIGNvdW50ICh1c2VkIG11bHRpcGxlIHRpbWVzIGJlbG93KVxuICAgICAgY29uc3QgbExlbmd0aCA9IFsuLi5tYXRjaFswXV0ubGVuZ3RoIC0gMTtcbiAgICAgIGxldCByRGVsaW0sIHJMZW5ndGgsIGRlbGltVG90YWwgPSBsTGVuZ3RoLCBtaWREZWxpbVRvdGFsID0gMDtcblxuICAgICAgY29uc3QgZW5kUmVnID0gbWF0Y2hbMF1bMF0gPT09ICcqJyA/IHRoaXMucnVsZXMuaW5saW5lLmVtU3Ryb25nUkRlbGltQXN0IDogdGhpcy5ydWxlcy5pbmxpbmUuZW1TdHJvbmdSRGVsaW1VbmQ7XG4gICAgICBlbmRSZWcubGFzdEluZGV4ID0gMDtcblxuICAgICAgLy8gQ2xpcCBtYXNrZWRTcmMgdG8gc2FtZSBzZWN0aW9uIG9mIHN0cmluZyBhcyBzcmMgKG1vdmUgdG8gbGV4ZXI/KVxuICAgICAgbWFza2VkU3JjID0gbWFza2VkU3JjLnNsaWNlKC0xICogc3JjLmxlbmd0aCArIGxMZW5ndGgpO1xuXG4gICAgICB3aGlsZSAoKG1hdGNoID0gZW5kUmVnLmV4ZWMobWFza2VkU3JjKSkgIT0gbnVsbCkge1xuICAgICAgICByRGVsaW0gPSBtYXRjaFsxXSB8fCBtYXRjaFsyXSB8fCBtYXRjaFszXSB8fCBtYXRjaFs0XSB8fCBtYXRjaFs1XSB8fCBtYXRjaFs2XTtcblxuICAgICAgICBpZiAoIXJEZWxpbSkgY29udGludWU7IC8vIHNraXAgc2luZ2xlICogaW4gX19hYmMqYWJjX19cblxuICAgICAgICByTGVuZ3RoID0gWy4uLnJEZWxpbV0ubGVuZ3RoO1xuXG4gICAgICAgIGlmIChtYXRjaFszXSB8fCBtYXRjaFs0XSkgeyAvLyBmb3VuZCBhbm90aGVyIExlZnQgRGVsaW1cbiAgICAgICAgICBkZWxpbVRvdGFsICs9IHJMZW5ndGg7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSBpZiAobWF0Y2hbNV0gfHwgbWF0Y2hbNl0pIHsgLy8gZWl0aGVyIExlZnQgb3IgUmlnaHQgRGVsaW1cbiAgICAgICAgICBpZiAobExlbmd0aCAlIDMgJiYgISgobExlbmd0aCArIHJMZW5ndGgpICUgMykpIHtcbiAgICAgICAgICAgIG1pZERlbGltVG90YWwgKz0gckxlbmd0aDtcbiAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBDb21tb25NYXJrIEVtcGhhc2lzIFJ1bGVzIDktMTBcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBkZWxpbVRvdGFsIC09IHJMZW5ndGg7XG5cbiAgICAgICAgaWYgKGRlbGltVG90YWwgPiAwKSBjb250aW51ZTsgLy8gSGF2ZW4ndCBmb3VuZCBlbm91Z2ggY2xvc2luZyBkZWxpbWl0ZXJzXG5cbiAgICAgICAgLy8gUmVtb3ZlIGV4dHJhIGNoYXJhY3RlcnMuICphKioqIC0+ICphKlxuICAgICAgICByTGVuZ3RoID0gTWF0aC5taW4ockxlbmd0aCwgckxlbmd0aCArIGRlbGltVG90YWwgKyBtaWREZWxpbVRvdGFsKTtcbiAgICAgICAgLy8gY2hhciBsZW5ndGggY2FuIGJlID4xIGZvciB1bmljb2RlIGNoYXJhY3RlcnM7XG4gICAgICAgIGNvbnN0IGxhc3RDaGFyTGVuZ3RoID0gWy4uLm1hdGNoWzBdXVswXS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IHJhdyA9IHNyYy5zbGljZSgwLCBsTGVuZ3RoICsgbWF0Y2guaW5kZXggKyBsYXN0Q2hhckxlbmd0aCArIHJMZW5ndGgpO1xuXG4gICAgICAgIC8vIENyZWF0ZSBgZW1gIGlmIHNtYWxsZXN0IGRlbGltaXRlciBoYXMgb2RkIGNoYXIgY291bnQuICphKioqXG4gICAgICAgIGlmIChNYXRoLm1pbihsTGVuZ3RoLCByTGVuZ3RoKSAlIDIpIHtcbiAgICAgICAgICBjb25zdCB0ZXh0ID0gcmF3LnNsaWNlKDEsIC0xKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogJ2VtJyxcbiAgICAgICAgICAgIHJhdyxcbiAgICAgICAgICAgIHRleHQsXG4gICAgICAgICAgICB0b2tlbnM6IHRoaXMubGV4ZXIuaW5saW5lVG9rZW5zKHRleHQpLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDcmVhdGUgJ3N0cm9uZycgaWYgc21hbGxlc3QgZGVsaW1pdGVyIGhhcyBldmVuIGNoYXIgY291bnQuICoqYSoqKlxuICAgICAgICBjb25zdCB0ZXh0ID0gcmF3LnNsaWNlKDIsIC0yKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiAnc3Ryb25nJyxcbiAgICAgICAgICByYXcsXG4gICAgICAgICAgdGV4dCxcbiAgICAgICAgICB0b2tlbnM6IHRoaXMubGV4ZXIuaW5saW5lVG9rZW5zKHRleHQpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvZGVzcGFuKHNyYzogc3RyaW5nKTogVG9rZW5zLkNvZGVzcGFuIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjYXAgPSB0aGlzLnJ1bGVzLmlubGluZS5jb2RlLmV4ZWMoc3JjKTtcbiAgICBpZiAoY2FwKSB7XG4gICAgICBsZXQgdGV4dCA9IGNhcFsyXS5yZXBsYWNlKHRoaXMucnVsZXMub3RoZXIubmV3TGluZUNoYXJHbG9iYWwsICcgJyk7XG4gICAgICBjb25zdCBoYXNOb25TcGFjZUNoYXJzID0gdGhpcy5ydWxlcy5vdGhlci5ub25TcGFjZUNoYXIudGVzdCh0ZXh0KTtcbiAgICAgIGNvbnN0IGhhc1NwYWNlQ2hhcnNPbkJvdGhFbmRzID0gdGhpcy5ydWxlcy5vdGhlci5zdGFydGluZ1NwYWNlQ2hhci50ZXN0KHRleHQpICYmIHRoaXMucnVsZXMub3RoZXIuZW5kaW5nU3BhY2VDaGFyLnRlc3QodGV4dCk7XG4gICAgICBpZiAoaGFzTm9uU3BhY2VDaGFycyAmJiBoYXNTcGFjZUNoYXJzT25Cb3RoRW5kcykge1xuICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMSwgdGV4dC5sZW5ndGggLSAxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdjb2Rlc3BhbicsXG4gICAgICAgIHJhdzogY2FwWzBdLFxuICAgICAgICB0ZXh0LFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBicihzcmM6IHN0cmluZyk6IFRva2Vucy5CciB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5pbmxpbmUuYnIuZXhlYyhzcmMpO1xuICAgIGlmIChjYXApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdicicsXG4gICAgICAgIHJhdzogY2FwWzBdLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBkZWwoc3JjOiBzdHJpbmcsIG1hc2tlZFNyYzogc3RyaW5nLCBwcmV2Q2hhciA9ICcnKTogVG9rZW5zLkRlbCB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IG1hdGNoID0gdGhpcy5ydWxlcy5pbmxpbmUuZGVsTERlbGltLmV4ZWMoc3JjKTtcbiAgICBpZiAoIW1hdGNoKSByZXR1cm47XG5cbiAgICBjb25zdCBuZXh0Q2hhciA9IG1hdGNoWzFdIHx8ICcnO1xuXG4gICAgaWYgKCFuZXh0Q2hhciB8fCAhcHJldkNoYXIgfHwgdGhpcy5ydWxlcy5pbmxpbmUucHVuY3R1YXRpb24uZXhlYyhwcmV2Q2hhcikpIHtcbiAgICAgIC8vIHVuaWNvZGUgUmVnZXggY291bnRzIGVtb2ppIGFzIDEgY2hhcjsgc3ByZWFkIGludG8gYXJyYXkgZm9yIHByb3BlciBjb3VudFxuICAgICAgY29uc3QgbExlbmd0aCA9IFsuLi5tYXRjaFswXV0ubGVuZ3RoIC0gMTtcbiAgICAgIGxldCByRGVsaW0sIHJMZW5ndGgsIGRlbGltVG90YWwgPSBsTGVuZ3RoO1xuXG4gICAgICBjb25zdCBlbmRSZWcgPSB0aGlzLnJ1bGVzLmlubGluZS5kZWxSRGVsaW07XG4gICAgICBlbmRSZWcubGFzdEluZGV4ID0gMDtcblxuICAgICAgLy8gQ2xpcCBtYXNrZWRTcmMgdG8gc2FtZSBzZWN0aW9uIG9mIHN0cmluZyBhcyBzcmNcbiAgICAgIG1hc2tlZFNyYyA9IG1hc2tlZFNyYy5zbGljZSgtMSAqIHNyYy5sZW5ndGggKyBsTGVuZ3RoKTtcblxuICAgICAgd2hpbGUgKChtYXRjaCA9IGVuZFJlZy5leGVjKG1hc2tlZFNyYykpICE9IG51bGwpIHtcbiAgICAgICAgckRlbGltID0gbWF0Y2hbMV0gfHwgbWF0Y2hbMl0gfHwgbWF0Y2hbM10gfHwgbWF0Y2hbNF0gfHwgbWF0Y2hbNV0gfHwgbWF0Y2hbNl07XG5cbiAgICAgICAgaWYgKCFyRGVsaW0pIGNvbnRpbnVlO1xuXG4gICAgICAgIHJMZW5ndGggPSBbLi4uckRlbGltXS5sZW5ndGg7XG5cbiAgICAgICAgaWYgKHJMZW5ndGggIT09IGxMZW5ndGgpIGNvbnRpbnVlO1xuXG4gICAgICAgIGlmIChtYXRjaFszXSB8fCBtYXRjaFs0XSkgeyAvLyBmb3VuZCBhbm90aGVyIExlZnQgRGVsaW1cbiAgICAgICAgICBkZWxpbVRvdGFsICs9IHJMZW5ndGg7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBkZWxpbVRvdGFsIC09IHJMZW5ndGg7XG5cbiAgICAgICAgaWYgKGRlbGltVG90YWwgPiAwKSBjb250aW51ZTsgLy8gSGF2ZW4ndCBmb3VuZCBlbm91Z2ggY2xvc2luZyBkZWxpbWl0ZXJzXG5cbiAgICAgICAgLy8gUmVtb3ZlIGV4dHJhIGNoYXJhY3RlcnNcbiAgICAgICAgckxlbmd0aCA9IE1hdGgubWluKHJMZW5ndGgsIHJMZW5ndGggKyBkZWxpbVRvdGFsKTtcbiAgICAgICAgLy8gY2hhciBsZW5ndGggY2FuIGJlID4xIGZvciB1bmljb2RlIGNoYXJhY3RlcnNcbiAgICAgICAgY29uc3QgbGFzdENoYXJMZW5ndGggPSBbLi4ubWF0Y2hbMF1dWzBdLmxlbmd0aDtcbiAgICAgICAgY29uc3QgcmF3ID0gc3JjLnNsaWNlKDAsIGxMZW5ndGggKyBtYXRjaC5pbmRleCArIGxhc3RDaGFyTGVuZ3RoICsgckxlbmd0aCk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGRlbCB0b2tlbiAtIG9ubHkgc2luZ2xlIH4gb3IgZG91YmxlIH5+IHN1cHBvcnRlZFxuICAgICAgICBjb25zdCB0ZXh0ID0gcmF3LnNsaWNlKGxMZW5ndGgsIC1sTGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiAnZGVsJyxcbiAgICAgICAgICByYXcsXG4gICAgICAgICAgdGV4dCxcbiAgICAgICAgICB0b2tlbnM6IHRoaXMubGV4ZXIuaW5saW5lVG9rZW5zKHRleHQpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGF1dG9saW5rKHNyYzogc3RyaW5nKTogVG9rZW5zLkxpbmsgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuaW5saW5lLmF1dG9saW5rLmV4ZWMoc3JjKTtcbiAgICBpZiAoY2FwKSB7XG4gICAgICBsZXQgdGV4dCwgaHJlZjtcbiAgICAgIGlmIChjYXBbMl0gPT09ICdAJykge1xuICAgICAgICB0ZXh0ID0gY2FwWzFdO1xuICAgICAgICBocmVmID0gJ21haWx0bzonICsgdGV4dDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRleHQgPSBjYXBbMV07XG4gICAgICAgIGhyZWYgPSB0ZXh0O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAnbGluaycsXG4gICAgICAgIHJhdzogY2FwWzBdLFxuICAgICAgICB0ZXh0LFxuICAgICAgICBocmVmLFxuICAgICAgICB0b2tlbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICByYXc6IHRleHQsXG4gICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHVybChzcmM6IHN0cmluZyk6IFRva2Vucy5MaW5rIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgY2FwO1xuICAgIGlmIChjYXAgPSB0aGlzLnJ1bGVzLmlubGluZS51cmwuZXhlYyhzcmMpKSB7XG4gICAgICBsZXQgdGV4dCwgaHJlZjtcbiAgICAgIGlmIChjYXBbMl0gPT09ICdAJykge1xuICAgICAgICB0ZXh0ID0gY2FwWzBdO1xuICAgICAgICBocmVmID0gJ21haWx0bzonICsgdGV4dDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGRvIGV4dGVuZGVkIGF1dG9saW5rIHBhdGggdmFsaWRhdGlvblxuICAgICAgICBsZXQgcHJldkNhcFplcm87XG4gICAgICAgIGRvIHtcbiAgICAgICAgICBwcmV2Q2FwWmVybyA9IGNhcFswXTtcbiAgICAgICAgICBjYXBbMF0gPSB0aGlzLnJ1bGVzLmlubGluZS5fYmFja3BlZGFsLmV4ZWMoY2FwWzBdKT8uWzBdID8/ICcnO1xuICAgICAgICB9IHdoaWxlIChwcmV2Q2FwWmVybyAhPT0gY2FwWzBdKTtcbiAgICAgICAgdGV4dCA9IGNhcFswXTtcbiAgICAgICAgaWYgKGNhcFsxXSA9PT0gJ3d3dy4nKSB7XG4gICAgICAgICAgaHJlZiA9ICdodHRwOi8vJyArIGNhcFswXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBocmVmID0gY2FwWzBdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAnbGluaycsXG4gICAgICAgIHJhdzogY2FwWzBdLFxuICAgICAgICB0ZXh0LFxuICAgICAgICBocmVmLFxuICAgICAgICB0b2tlbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICByYXc6IHRleHQsXG4gICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGlubGluZVRleHQoc3JjOiBzdHJpbmcpOiBUb2tlbnMuVGV4dCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5pbmxpbmUudGV4dC5leGVjKHNyYyk7XG4gICAgaWYgKGNhcCkge1xuICAgICAgY29uc3QgZXNjYXBlZCA9IHRoaXMubGV4ZXIuc3RhdGUuaW5SYXdCbG9jaztcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgcmF3OiBjYXBbMF0sXG4gICAgICAgIHRleHQ6IGNhcFswXSxcbiAgICAgICAgZXNjYXBlZCxcbiAgICAgIH07XG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IHsgX1Rva2VuaXplciB9IGZyb20gJy4vVG9rZW5pemVyLnRzJztcbmltcG9ydCB7IF9kZWZhdWx0cyB9IGZyb20gJy4vZGVmYXVsdHMudHMnO1xuaW1wb3J0IHsgb3RoZXIsIGJsb2NrLCBpbmxpbmUgfSBmcm9tICcuL3J1bGVzLnRzJztcbmltcG9ydCB0eXBlIHsgVG9rZW4sIFRva2Vuc0xpc3QsIFRva2VucyB9IGZyb20gJy4vVG9rZW5zLnRzJztcbmltcG9ydCB0eXBlIHsgTWFya2VkT3B0aW9ucyB9IGZyb20gJy4vTWFya2VkT3B0aW9ucy50cyc7XG5cbi8qKlxuICogQmxvY2sgTGV4ZXJcbiAqL1xuZXhwb3J0IGNsYXNzIF9MZXhlcjxQYXJzZXJPdXRwdXQgPSBzdHJpbmcsIFJlbmRlcmVyT3V0cHV0ID0gc3RyaW5nPiB7XG4gIHRva2VuczogVG9rZW5zTGlzdDtcbiAgb3B0aW9uczogTWFya2VkT3B0aW9uczxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0PjtcbiAgc3RhdGU6IHtcbiAgICBpbkxpbms6IGJvb2xlYW47XG4gICAgaW5SYXdCbG9jazogYm9vbGVhbjtcbiAgICB0b3A6IGJvb2xlYW47XG4gIH07XG5cbiAgcHVibGljIGlubGluZVF1ZXVlOiB7IHNyYzogc3RyaW5nLCB0b2tlbnM6IFRva2VuW10gfVtdO1xuXG4gIHByaXZhdGUgdG9rZW5pemVyOiBfVG9rZW5pemVyPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+O1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBNYXJrZWRPcHRpb25zPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+KSB7XG4gICAgLy8gVG9rZW5MaXN0IGNhbm5vdCBiZSBjcmVhdGVkIGluIG9uZSBnb1xuICAgIHRoaXMudG9rZW5zID0gW10gYXMgdW5rbm93biBhcyBUb2tlbnNMaXN0O1xuICAgIHRoaXMudG9rZW5zLmxpbmtzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IF9kZWZhdWx0cztcbiAgICB0aGlzLm9wdGlvbnMudG9rZW5pemVyID0gdGhpcy5vcHRpb25zLnRva2VuaXplciB8fCBuZXcgX1Rva2VuaXplcjxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0PigpO1xuICAgIHRoaXMudG9rZW5pemVyID0gdGhpcy5vcHRpb25zLnRva2VuaXplcjtcbiAgICB0aGlzLnRva2VuaXplci5vcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgIHRoaXMudG9rZW5pemVyLmxleGVyID0gdGhpcztcbiAgICB0aGlzLmlubGluZVF1ZXVlID0gW107XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGluTGluazogZmFsc2UsXG4gICAgICBpblJhd0Jsb2NrOiBmYWxzZSxcbiAgICAgIHRvcDogdHJ1ZSxcbiAgICB9O1xuXG4gICAgY29uc3QgcnVsZXMgPSB7XG4gICAgICBvdGhlcixcbiAgICAgIGJsb2NrOiBibG9jay5ub3JtYWwsXG4gICAgICBpbmxpbmU6IGlubGluZS5ub3JtYWwsXG4gICAgfTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMucGVkYW50aWMpIHtcbiAgICAgIHJ1bGVzLmJsb2NrID0gYmxvY2sucGVkYW50aWM7XG4gICAgICBydWxlcy5pbmxpbmUgPSBpbmxpbmUucGVkYW50aWM7XG4gICAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbnMuZ2ZtKSB7XG4gICAgICBydWxlcy5ibG9jayA9IGJsb2NrLmdmbTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuYnJlYWtzKSB7XG4gICAgICAgIHJ1bGVzLmlubGluZSA9IGlubGluZS5icmVha3M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBydWxlcy5pbmxpbmUgPSBpbmxpbmUuZ2ZtO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnRva2VuaXplci5ydWxlcyA9IHJ1bGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9zZSBSdWxlc1xuICAgKi9cbiAgc3RhdGljIGdldCBydWxlcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYmxvY2ssXG4gICAgICBpbmxpbmUsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0aWMgTGV4IE1ldGhvZFxuICAgKi9cbiAgc3RhdGljIGxleDxQYXJzZXJPdXRwdXQgPSBzdHJpbmcsIFJlbmRlcmVyT3V0cHV0ID0gc3RyaW5nPihzcmM6IHN0cmluZywgb3B0aW9ucz86IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4pIHtcbiAgICBjb25zdCBsZXhlciA9IG5ldyBfTGV4ZXI8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4ob3B0aW9ucyk7XG4gICAgcmV0dXJuIGxleGVyLmxleChzcmMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXRpYyBMZXggSW5saW5lIE1ldGhvZFxuICAgKi9cbiAgc3RhdGljIGxleElubGluZTxQYXJzZXJPdXRwdXQgPSBzdHJpbmcsIFJlbmRlcmVyT3V0cHV0ID0gc3RyaW5nPihzcmM6IHN0cmluZywgb3B0aW9ucz86IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4pIHtcbiAgICBjb25zdCBsZXhlciA9IG5ldyBfTGV4ZXI8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4ob3B0aW9ucyk7XG4gICAgcmV0dXJuIGxleGVyLmlubGluZVRva2VucyhzcmMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXByb2Nlc3NpbmdcbiAgICovXG4gIGxleChzcmM6IHN0cmluZykge1xuICAgIHNyYyA9IHNyYy5yZXBsYWNlKG90aGVyLmNhcnJpYWdlUmV0dXJuLCAnXFxuJyk7XG5cbiAgICB0aGlzLmJsb2NrVG9rZW5zKHNyYywgdGhpcy50b2tlbnMpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmlubGluZVF1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBuZXh0ID0gdGhpcy5pbmxpbmVRdWV1ZVtpXTtcbiAgICAgIHRoaXMuaW5saW5lVG9rZW5zKG5leHQuc3JjLCBuZXh0LnRva2Vucyk7XG4gICAgfVxuICAgIHRoaXMuaW5saW5lUXVldWUgPSBbXTtcblxuICAgIHJldHVybiB0aGlzLnRva2VucztcbiAgfVxuXG4gIC8qKlxuICAgKiBMZXhpbmdcbiAgICovXG4gIGJsb2NrVG9rZW5zKHNyYzogc3RyaW5nLCB0b2tlbnM/OiBUb2tlbltdLCBsYXN0UGFyYWdyYXBoQ2xpcHBlZD86IGJvb2xlYW4pOiBUb2tlbltdO1xuICBibG9ja1Rva2VucyhzcmM6IHN0cmluZywgdG9rZW5zPzogVG9rZW5zTGlzdCwgbGFzdFBhcmFncmFwaENsaXBwZWQ/OiBib29sZWFuKTogVG9rZW5zTGlzdDtcbiAgYmxvY2tUb2tlbnMoc3JjOiBzdHJpbmcsIHRva2VuczogVG9rZW5bXSA9IFtdLCBsYXN0UGFyYWdyYXBoQ2xpcHBlZCA9IGZhbHNlKSB7XG4gICAgdGhpcy50b2tlbml6ZXIubGV4ZXIgPSB0aGlzO1xuICAgIGlmICh0aGlzLm9wdGlvbnMucGVkYW50aWMpIHtcbiAgICAgIHNyYyA9IHNyYy5yZXBsYWNlKG90aGVyLnRhYkNoYXJHbG9iYWwsICcgICAgJykucmVwbGFjZShvdGhlci5zcGFjZUxpbmUsICcnKTtcbiAgICB9XG5cbiAgICB3aGlsZSAoc3JjKSB7XG4gICAgICBsZXQgdG9rZW46IFRva2Vucy5HZW5lcmljIHwgdW5kZWZpbmVkO1xuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmV4dGVuc2lvbnM/LmJsb2NrPy5zb21lKChleHRUb2tlbml6ZXIpID0+IHtcbiAgICAgICAgaWYgKHRva2VuID0gZXh0VG9rZW5pemVyLmNhbGwoeyBsZXhlcjogdGhpcyB9LCBzcmMsIHRva2VucykpIHtcbiAgICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gbmV3bGluZVxuICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIuc3BhY2Uoc3JjKSkge1xuICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICBjb25zdCBsYXN0VG9rZW4gPSB0b2tlbnMuYXQoLTEpO1xuICAgICAgICBpZiAodG9rZW4ucmF3Lmxlbmd0aCA9PT0gMSAmJiBsYXN0VG9rZW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIGlmIHRoZXJlJ3MgYSBzaW5nbGUgXFxuIGFzIGEgc3BhY2VyLCBpdCdzIHRlcm1pbmF0aW5nIHRoZSBsYXN0IGxpbmUsXG4gICAgICAgICAgLy8gc28gbW92ZSBpdCB0aGVyZSBzbyB0aGF0IHdlIGRvbid0IGdldCB1bm5lY2Vzc2FyeSBwYXJhZ3JhcGggdGFnc1xuICAgICAgICAgIGxhc3RUb2tlbi5yYXcgKz0gJ1xcbic7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBjb2RlXG4gICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5jb2RlKHNyYykpIHtcbiAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgbGFzdFRva2VuID0gdG9rZW5zLmF0KC0xKTtcbiAgICAgICAgLy8gQW4gaW5kZW50ZWQgY29kZSBibG9jayBjYW5ub3QgaW50ZXJydXB0IGEgcGFyYWdyYXBoLlxuICAgICAgICBpZiAobGFzdFRva2VuPy50eXBlID09PSAncGFyYWdyYXBoJyB8fCBsYXN0VG9rZW4/LnR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgICAgIGxhc3RUb2tlbi5yYXcgKz0gKGxhc3RUb2tlbi5yYXcuZW5kc1dpdGgoJ1xcbicpID8gJycgOiAnXFxuJykgKyB0b2tlbi5yYXc7XG4gICAgICAgICAgbGFzdFRva2VuLnRleHQgKz0gJ1xcbicgKyB0b2tlbi50ZXh0O1xuICAgICAgICAgIHRoaXMuaW5saW5lUXVldWUuYXQoLTEpIS5zcmMgPSBsYXN0VG9rZW4udGV4dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGZlbmNlc1xuICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIuZmVuY2VzKHNyYykpIHtcbiAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gaGVhZGluZ1xuICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIuaGVhZGluZyhzcmMpKSB7XG4gICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGhyXG4gICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5ocihzcmMpKSB7XG4gICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGJsb2NrcXVvdGVcbiAgICAgIGlmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLmJsb2NrcXVvdGUoc3JjKSkge1xuICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBsaXN0XG4gICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5saXN0KHNyYykpIHtcbiAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gaHRtbFxuICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIuaHRtbChzcmMpKSB7XG4gICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGRlZlxuICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIuZGVmKHNyYykpIHtcbiAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgbGFzdFRva2VuID0gdG9rZW5zLmF0KC0xKTtcbiAgICAgICAgaWYgKGxhc3RUb2tlbj8udHlwZSA9PT0gJ3BhcmFncmFwaCcgfHwgbGFzdFRva2VuPy50eXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgICBsYXN0VG9rZW4ucmF3ICs9IChsYXN0VG9rZW4ucmF3LmVuZHNXaXRoKCdcXG4nKSA/ICcnIDogJ1xcbicpICsgdG9rZW4ucmF3O1xuICAgICAgICAgIGxhc3RUb2tlbi50ZXh0ICs9ICdcXG4nICsgdG9rZW4ucmF3O1xuICAgICAgICAgIHRoaXMuaW5saW5lUXVldWUuYXQoLTEpIS5zcmMgPSBsYXN0VG9rZW4udGV4dDtcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy50b2tlbnMubGlua3NbdG9rZW4udGFnXSkge1xuICAgICAgICAgIHRoaXMudG9rZW5zLmxpbmtzW3Rva2VuLnRhZ10gPSB7XG4gICAgICAgICAgICBocmVmOiB0b2tlbi5ocmVmLFxuICAgICAgICAgICAgdGl0bGU6IHRva2VuLnRpdGxlLFxuICAgICAgICAgIH07XG4gICAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyB0YWJsZSAoZ2ZtKVxuICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIudGFibGUoc3JjKSkge1xuICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBsaGVhZGluZ1xuICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIubGhlYWRpbmcoc3JjKSkge1xuICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyB0b3AtbGV2ZWwgcGFyYWdyYXBoXG4gICAgICAvLyBwcmV2ZW50IHBhcmFncmFwaCBjb25zdW1pbmcgZXh0ZW5zaW9ucyBieSBjbGlwcGluZyAnc3JjJyB0byBleHRlbnNpb24gc3RhcnRcbiAgICAgIGxldCBjdXRTcmMgPSBzcmM7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLmV4dGVuc2lvbnM/LnN0YXJ0QmxvY2spIHtcbiAgICAgICAgbGV0IHN0YXJ0SW5kZXggPSBJbmZpbml0eTtcbiAgICAgICAgY29uc3QgdGVtcFNyYyA9IHNyYy5zbGljZSgxKTtcbiAgICAgICAgbGV0IHRlbXBTdGFydDtcbiAgICAgICAgdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMuc3RhcnRCbG9jay5mb3JFYWNoKChnZXRTdGFydEluZGV4KSA9PiB7XG4gICAgICAgICAgdGVtcFN0YXJ0ID0gZ2V0U3RhcnRJbmRleC5jYWxsKHsgbGV4ZXI6IHRoaXMgfSwgdGVtcFNyYyk7XG4gICAgICAgICAgaWYgKHR5cGVvZiB0ZW1wU3RhcnQgPT09ICdudW1iZXInICYmIHRlbXBTdGFydCA+PSAwKSB7XG4gICAgICAgICAgICBzdGFydEluZGV4ID0gTWF0aC5taW4oc3RhcnRJbmRleCwgdGVtcFN0YXJ0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoc3RhcnRJbmRleCA8IEluZmluaXR5ICYmIHN0YXJ0SW5kZXggPj0gMCkge1xuICAgICAgICAgIGN1dFNyYyA9IHNyYy5zdWJzdHJpbmcoMCwgc3RhcnRJbmRleCArIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5zdGF0ZS50b3AgJiYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIucGFyYWdyYXBoKGN1dFNyYykpKSB7XG4gICAgICAgIGNvbnN0IGxhc3RUb2tlbiA9IHRva2Vucy5hdCgtMSk7XG4gICAgICAgIGlmIChsYXN0UGFyYWdyYXBoQ2xpcHBlZCAmJiBsYXN0VG9rZW4/LnR5cGUgPT09ICdwYXJhZ3JhcGgnKSB7XG4gICAgICAgICAgbGFzdFRva2VuLnJhdyArPSAobGFzdFRva2VuLnJhdy5lbmRzV2l0aCgnXFxuJykgPyAnJyA6ICdcXG4nKSArIHRva2VuLnJhdztcbiAgICAgICAgICBsYXN0VG9rZW4udGV4dCArPSAnXFxuJyArIHRva2VuLnRleHQ7XG4gICAgICAgICAgdGhpcy5pbmxpbmVRdWV1ZS5wb3AoKTtcbiAgICAgICAgICB0aGlzLmlubGluZVF1ZXVlLmF0KC0xKSEuc3JjID0gbGFzdFRva2VuLnRleHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICB9XG4gICAgICAgIGxhc3RQYXJhZ3JhcGhDbGlwcGVkID0gY3V0U3JjLmxlbmd0aCAhPT0gc3JjLmxlbmd0aDtcbiAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIHRleHRcbiAgICAgIGlmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLnRleHQoc3JjKSkge1xuICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICBjb25zdCBsYXN0VG9rZW4gPSB0b2tlbnMuYXQoLTEpO1xuICAgICAgICBpZiAobGFzdFRva2VuPy50eXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgICBsYXN0VG9rZW4ucmF3ICs9IChsYXN0VG9rZW4ucmF3LmVuZHNXaXRoKCdcXG4nKSA/ICcnIDogJ1xcbicpICsgdG9rZW4ucmF3O1xuICAgICAgICAgIGxhc3RUb2tlbi50ZXh0ICs9ICdcXG4nICsgdG9rZW4udGV4dDtcbiAgICAgICAgICB0aGlzLmlubGluZVF1ZXVlLnBvcCgpO1xuICAgICAgICAgIHRoaXMuaW5saW5lUXVldWUuYXQoLTEpIS5zcmMgPSBsYXN0VG9rZW4udGV4dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChzcmMpIHtcbiAgICAgICAgY29uc3QgZXJyTXNnID0gJ0luZmluaXRlIGxvb3Agb24gYnl0ZTogJyArIHNyYy5jaGFyQ29kZUF0KDApO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNpbGVudCkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyTXNnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyTXNnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc3RhdGUudG9wID0gdHJ1ZTtcbiAgICByZXR1cm4gdG9rZW5zO1xuICB9XG5cbiAgaW5saW5lKHNyYzogc3RyaW5nLCB0b2tlbnM6IFRva2VuW10gPSBbXSkge1xuICAgIHRoaXMuaW5saW5lUXVldWUucHVzaCh7IHNyYywgdG9rZW5zIH0pO1xuICAgIHJldHVybiB0b2tlbnM7XG4gIH1cblxuICAvKipcbiAgICogTGV4aW5nL0NvbXBpbGluZ1xuICAgKi9cbiAgaW5saW5lVG9rZW5zKHNyYzogc3RyaW5nLCB0b2tlbnM6IFRva2VuW10gPSBbXSk6IFRva2VuW10ge1xuICAgIHRoaXMudG9rZW5pemVyLmxleGVyID0gdGhpcztcbiAgICAvLyBTdHJpbmcgd2l0aCBsaW5rcyBtYXNrZWQgdG8gYXZvaWQgaW50ZXJmZXJlbmNlIHdpdGggZW0gYW5kIHN0cm9uZ1xuICAgIGxldCBtYXNrZWRTcmMgPSBzcmM7XG4gICAgbGV0IG1hdGNoOiBSZWdFeHBFeGVjQXJyYXkgfCBudWxsID0gbnVsbDtcblxuICAgIC8vIE1hc2sgb3V0IHJlZmxpbmtzXG4gICAgaWYgKHRoaXMudG9rZW5zLmxpbmtzKSB7XG4gICAgICBjb25zdCBsaW5rcyA9IE9iamVjdC5rZXlzKHRoaXMudG9rZW5zLmxpbmtzKTtcbiAgICAgIGlmIChsaW5rcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHdoaWxlICgobWF0Y2ggPSB0aGlzLnRva2VuaXplci5ydWxlcy5pbmxpbmUucmVmbGlua1NlYXJjaC5leGVjKG1hc2tlZFNyYykpICE9IG51bGwpIHtcbiAgICAgICAgICBpZiAobGlua3MuaW5jbHVkZXMobWF0Y2hbMF0uc2xpY2UobWF0Y2hbMF0ubGFzdEluZGV4T2YoJ1snKSArIDEsIC0xKSkpIHtcbiAgICAgICAgICAgIG1hc2tlZFNyYyA9IG1hc2tlZFNyYy5zbGljZSgwLCBtYXRjaC5pbmRleClcbiAgICAgICAgICAgICAgKyAnWycgKyAnYScucmVwZWF0KG1hdGNoWzBdLmxlbmd0aCAtIDIpICsgJ10nXG4gICAgICAgICAgICAgICsgbWFza2VkU3JjLnNsaWNlKHRoaXMudG9rZW5pemVyLnJ1bGVzLmlubGluZS5yZWZsaW5rU2VhcmNoLmxhc3RJbmRleCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTWFzayBvdXQgZXNjYXBlZCBjaGFyYWN0ZXJzXG4gICAgd2hpbGUgKChtYXRjaCA9IHRoaXMudG9rZW5pemVyLnJ1bGVzLmlubGluZS5hbnlQdW5jdHVhdGlvbi5leGVjKG1hc2tlZFNyYykpICE9IG51bGwpIHtcbiAgICAgIG1hc2tlZFNyYyA9IG1hc2tlZFNyYy5zbGljZSgwLCBtYXRjaC5pbmRleCkgKyAnKysnICsgbWFza2VkU3JjLnNsaWNlKHRoaXMudG9rZW5pemVyLnJ1bGVzLmlubGluZS5hbnlQdW5jdHVhdGlvbi5sYXN0SW5kZXgpO1xuICAgIH1cblxuICAgIC8vIE1hc2sgb3V0IG90aGVyIGJsb2Nrc1xuICAgIGxldCBvZmZzZXQ7XG4gICAgd2hpbGUgKChtYXRjaCA9IHRoaXMudG9rZW5pemVyLnJ1bGVzLmlubGluZS5ibG9ja1NraXAuZXhlYyhtYXNrZWRTcmMpKSAhPSBudWxsKSB7XG4gICAgICBvZmZzZXQgPSBtYXRjaFsyXSA/IG1hdGNoWzJdLmxlbmd0aCA6IDA7XG4gICAgICBtYXNrZWRTcmMgPSBtYXNrZWRTcmMuc2xpY2UoMCwgbWF0Y2guaW5kZXggKyBvZmZzZXQpICsgJ1snICsgJ2EnLnJlcGVhdChtYXRjaFswXS5sZW5ndGggLSBvZmZzZXQgLSAyKSArICddJyArIG1hc2tlZFNyYy5zbGljZSh0aGlzLnRva2VuaXplci5ydWxlcy5pbmxpbmUuYmxvY2tTa2lwLmxhc3RJbmRleCk7XG4gICAgfVxuXG4gICAgLy8gTWFzayBvdXQgYmxvY2tzIGZyb20gZXh0ZW5zaW9uc1xuICAgIG1hc2tlZFNyYyA9IHRoaXMub3B0aW9ucy5ob29rcz8uZW1TdHJvbmdNYXNrPy5jYWxsKHsgbGV4ZXI6IHRoaXMgfSwgbWFza2VkU3JjKSA/PyBtYXNrZWRTcmM7XG5cbiAgICBsZXQga2VlcFByZXZDaGFyID0gZmFsc2U7XG4gICAgbGV0IHByZXZDaGFyID0gJyc7XG4gICAgd2hpbGUgKHNyYykge1xuICAgICAgaWYgKCFrZWVwUHJldkNoYXIpIHtcbiAgICAgICAgcHJldkNoYXIgPSAnJztcbiAgICAgIH1cbiAgICAgIGtlZXBQcmV2Q2hhciA9IGZhbHNlO1xuXG4gICAgICBsZXQgdG9rZW46IFRva2Vucy5HZW5lcmljIHwgdW5kZWZpbmVkO1xuXG4gICAgICAvLyBleHRlbnNpb25zXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmV4dGVuc2lvbnM/LmlubGluZT8uc29tZSgoZXh0VG9rZW5pemVyKSA9PiB7XG4gICAgICAgIGlmICh0b2tlbiA9IGV4dFRva2VuaXplci5jYWxsKHsgbGV4ZXI6IHRoaXMgfSwgc3JjLCB0b2tlbnMpKSB7XG4gICAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGVzY2FwZVxuICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIuZXNjYXBlKHNyYykpIHtcbiAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gdGFnXG4gICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci50YWcoc3JjKSkge1xuICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBsaW5rXG4gICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5saW5rKHNyYykpIHtcbiAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gcmVmbGluaywgbm9saW5rXG4gICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5yZWZsaW5rKHNyYywgdGhpcy50b2tlbnMubGlua3MpKSB7XG4gICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IGxhc3RUb2tlbiA9IHRva2Vucy5hdCgtMSk7XG4gICAgICAgIGlmICh0b2tlbi50eXBlID09PSAndGV4dCcgJiYgbGFzdFRva2VuPy50eXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgICBsYXN0VG9rZW4ucmF3ICs9IHRva2VuLnJhdztcbiAgICAgICAgICBsYXN0VG9rZW4udGV4dCArPSB0b2tlbi50ZXh0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gZW0gJiBzdHJvbmdcbiAgICAgIGlmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLmVtU3Ryb25nKHNyYywgbWFza2VkU3JjLCBwcmV2Q2hhcikpIHtcbiAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gY29kZVxuICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIuY29kZXNwYW4oc3JjKSkge1xuICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBiclxuICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIuYnIoc3JjKSkge1xuICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBkZWwgKGdmbSlcbiAgICAgIGlmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLmRlbChzcmMsIG1hc2tlZFNyYywgcHJldkNoYXIpKSB7XG4gICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGF1dG9saW5rXG4gICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5hdXRvbGluayhzcmMpKSB7XG4gICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIHVybCAoZ2ZtKVxuICAgICAgaWYgKCF0aGlzLnN0YXRlLmluTGluayAmJiAodG9rZW4gPSB0aGlzLnRva2VuaXplci51cmwoc3JjKSkpIHtcbiAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gdGV4dFxuICAgICAgLy8gcHJldmVudCBpbmxpbmVUZXh0IGNvbnN1bWluZyBleHRlbnNpb25zIGJ5IGNsaXBwaW5nICdzcmMnIHRvIGV4dGVuc2lvbiBzdGFydFxuICAgICAgbGV0IGN1dFNyYyA9IHNyYztcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucz8uc3RhcnRJbmxpbmUpIHtcbiAgICAgICAgbGV0IHN0YXJ0SW5kZXggPSBJbmZpbml0eTtcbiAgICAgICAgY29uc3QgdGVtcFNyYyA9IHNyYy5zbGljZSgxKTtcbiAgICAgICAgbGV0IHRlbXBTdGFydDtcbiAgICAgICAgdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMuc3RhcnRJbmxpbmUuZm9yRWFjaCgoZ2V0U3RhcnRJbmRleCkgPT4ge1xuICAgICAgICAgIHRlbXBTdGFydCA9IGdldFN0YXJ0SW5kZXguY2FsbCh7IGxleGVyOiB0aGlzIH0sIHRlbXBTcmMpO1xuICAgICAgICAgIGlmICh0eXBlb2YgdGVtcFN0YXJ0ID09PSAnbnVtYmVyJyAmJiB0ZW1wU3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgc3RhcnRJbmRleCA9IE1hdGgubWluKHN0YXJ0SW5kZXgsIHRlbXBTdGFydCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHN0YXJ0SW5kZXggPCBJbmZpbml0eSAmJiBzdGFydEluZGV4ID49IDApIHtcbiAgICAgICAgICBjdXRTcmMgPSBzcmMuc3Vic3RyaW5nKDAsIHN0YXJ0SW5kZXggKyAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIuaW5saW5lVGV4dChjdXRTcmMpKSB7XG4gICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgIGlmICh0b2tlbi5yYXcuc2xpY2UoLTEpICE9PSAnXycpIHsgLy8gVHJhY2sgcHJldkNoYXIgYmVmb3JlIHN0cmluZyBvZiBfX19fIHN0YXJ0ZWRcbiAgICAgICAgICBwcmV2Q2hhciA9IHRva2VuLnJhdy5zbGljZSgtMSk7XG4gICAgICAgIH1cbiAgICAgICAga2VlcFByZXZDaGFyID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgbGFzdFRva2VuID0gdG9rZW5zLmF0KC0xKTtcbiAgICAgICAgaWYgKGxhc3RUb2tlbj8udHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICAgICAgbGFzdFRva2VuLnJhdyArPSB0b2tlbi5yYXc7XG4gICAgICAgICAgbGFzdFRva2VuLnRleHQgKz0gdG9rZW4udGV4dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChzcmMpIHtcbiAgICAgICAgY29uc3QgZXJyTXNnID0gJ0luZmluaXRlIGxvb3Agb24gYnl0ZTogJyArIHNyYy5jaGFyQ29kZUF0KDApO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNpbGVudCkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyTXNnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyTXNnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0b2tlbnM7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBfZGVmYXVsdHMgfSBmcm9tICcuL2RlZmF1bHRzLnRzJztcbmltcG9ydCB7XG4gIGNsZWFuVXJsLFxuICBlc2NhcGVIdG1sRW50aXRpZXMsXG59IGZyb20gJy4vaGVscGVycy50cyc7XG5pbXBvcnQgeyBvdGhlciB9IGZyb20gJy4vcnVsZXMudHMnO1xuaW1wb3J0IHR5cGUgeyBNYXJrZWRPcHRpb25zIH0gZnJvbSAnLi9NYXJrZWRPcHRpb25zLnRzJztcbmltcG9ydCB0eXBlIHsgVG9rZW5zIH0gZnJvbSAnLi9Ub2tlbnMudHMnO1xuaW1wb3J0IHR5cGUgeyBfUGFyc2VyIH0gZnJvbSAnLi9QYXJzZXIudHMnO1xuXG4vKipcbiAqIFJlbmRlcmVyXG4gKi9cbmV4cG9ydCBjbGFzcyBfUmVuZGVyZXI8UGFyc2VyT3V0cHV0ID0gc3RyaW5nLCBSZW5kZXJlck91dHB1dCA9IHN0cmluZz4ge1xuICBvcHRpb25zOiBNYXJrZWRPcHRpb25zPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+O1xuICBwYXJzZXIhOiBfUGFyc2VyPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+OyAvLyBzZXQgYnkgdGhlIHBhcnNlclxuICBjb25zdHJ1Y3RvcihvcHRpb25zPzogTWFya2VkT3B0aW9uczxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0Pikge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwgX2RlZmF1bHRzO1xuICB9XG5cbiAgc3BhY2UodG9rZW46IFRva2Vucy5TcGFjZSk6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICByZXR1cm4gJycgYXMgUmVuZGVyZXJPdXRwdXQ7XG4gIH1cblxuICBjb2RlKHsgdGV4dCwgbGFuZywgZXNjYXBlZCB9OiBUb2tlbnMuQ29kZSk6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICBjb25zdCBsYW5nU3RyaW5nID0gKGxhbmcgfHwgJycpLm1hdGNoKG90aGVyLm5vdFNwYWNlU3RhcnQpPy5bMF07XG5cbiAgICBjb25zdCBjb2RlID0gdGV4dC5yZXBsYWNlKG90aGVyLmVuZGluZ05ld2xpbmUsICcnKSArICdcXG4nO1xuXG4gICAgaWYgKCFsYW5nU3RyaW5nKSB7XG4gICAgICByZXR1cm4gJzxwcmU+PGNvZGU+J1xuICAgICAgICArIChlc2NhcGVkID8gY29kZSA6IGVzY2FwZUh0bWxFbnRpdGllcyhjb2RlLCB0cnVlKSlcbiAgICAgICAgKyAnPC9jb2RlPjwvcHJlPlxcbicgYXMgUmVuZGVyZXJPdXRwdXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuICc8cHJlPjxjb2RlIGNsYXNzPVwibGFuZ3VhZ2UtJ1xuICAgICAgKyBlc2NhcGVIdG1sRW50aXRpZXMobGFuZ1N0cmluZylcbiAgICAgICsgJ1wiPidcbiAgICAgICsgKGVzY2FwZWQgPyBjb2RlIDogZXNjYXBlSHRtbEVudGl0aWVzKGNvZGUsIHRydWUpKVxuICAgICAgKyAnPC9jb2RlPjwvcHJlPlxcbicgYXMgUmVuZGVyZXJPdXRwdXQ7XG4gIH1cblxuICBibG9ja3F1b3RlKHsgdG9rZW5zIH06IFRva2Vucy5CbG9ja3F1b3RlKTogUmVuZGVyZXJPdXRwdXQge1xuICAgIGNvbnN0IGJvZHkgPSB0aGlzLnBhcnNlci5wYXJzZSh0b2tlbnMpO1xuICAgIHJldHVybiBgPGJsb2NrcXVvdGU+XFxuJHtib2R5fTwvYmxvY2txdW90ZT5cXG5gIGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgaHRtbCh7IHRleHQgfTogVG9rZW5zLkhUTUwgfCBUb2tlbnMuVGFnKTogUmVuZGVyZXJPdXRwdXQge1xuICAgIHJldHVybiB0ZXh0IGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgZGVmKHRva2VuOiBUb2tlbnMuRGVmKTogUmVuZGVyZXJPdXRwdXQge1xuICAgIHJldHVybiAnJyBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIGhlYWRpbmcoeyB0b2tlbnMsIGRlcHRoIH06IFRva2Vucy5IZWFkaW5nKTogUmVuZGVyZXJPdXRwdXQge1xuICAgIHJldHVybiBgPGgke2RlcHRofT4ke3RoaXMucGFyc2VyLnBhcnNlSW5saW5lKHRva2Vucyl9PC9oJHtkZXB0aH0+XFxuYCBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIGhyKHRva2VuOiBUb2tlbnMuSHIpOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuICc8aHI+XFxuJyBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIGxpc3QodG9rZW46IFRva2Vucy5MaXN0KTogUmVuZGVyZXJPdXRwdXQge1xuICAgIGNvbnN0IG9yZGVyZWQgPSB0b2tlbi5vcmRlcmVkO1xuICAgIGNvbnN0IHN0YXJ0ID0gdG9rZW4uc3RhcnQ7XG5cbiAgICBsZXQgYm9keSA9ICcnO1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgdG9rZW4uaXRlbXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSB0b2tlbi5pdGVtc1tqXTtcbiAgICAgIGJvZHkgKz0gdGhpcy5saXN0aXRlbShpdGVtKTtcbiAgICB9XG5cbiAgICBjb25zdCB0eXBlID0gb3JkZXJlZCA/ICdvbCcgOiAndWwnO1xuICAgIGNvbnN0IHN0YXJ0QXR0ciA9IChvcmRlcmVkICYmIHN0YXJ0ICE9PSAxKSA/ICgnIHN0YXJ0PVwiJyArIHN0YXJ0ICsgJ1wiJykgOiAnJztcbiAgICByZXR1cm4gJzwnICsgdHlwZSArIHN0YXJ0QXR0ciArICc+XFxuJyArIGJvZHkgKyAnPC8nICsgdHlwZSArICc+XFxuJyBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIGxpc3RpdGVtKGl0ZW06IFRva2Vucy5MaXN0SXRlbSk6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICByZXR1cm4gYDxsaT4ke3RoaXMucGFyc2VyLnBhcnNlKGl0ZW0udG9rZW5zKX08L2xpPlxcbmAgYXMgUmVuZGVyZXJPdXRwdXQ7XG4gIH1cblxuICBjaGVja2JveCh7IGNoZWNrZWQgfTogVG9rZW5zLkNoZWNrYm94KTogUmVuZGVyZXJPdXRwdXQge1xuICAgIHJldHVybiAnPGlucHV0ICdcbiAgICAgICsgKGNoZWNrZWQgPyAnY2hlY2tlZD1cIlwiICcgOiAnJylcbiAgICAgICsgJ2Rpc2FibGVkPVwiXCIgdHlwZT1cImNoZWNrYm94XCI+ICcgYXMgUmVuZGVyZXJPdXRwdXQ7XG4gIH1cblxuICBwYXJhZ3JhcGgoeyB0b2tlbnMgfTogVG9rZW5zLlBhcmFncmFwaCk6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICByZXR1cm4gYDxwPiR7dGhpcy5wYXJzZXIucGFyc2VJbmxpbmUodG9rZW5zKX08L3A+XFxuYCBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIHRhYmxlKHRva2VuOiBUb2tlbnMuVGFibGUpOiBSZW5kZXJlck91dHB1dCB7XG4gICAgbGV0IGhlYWRlciA9ICcnO1xuXG4gICAgLy8gaGVhZGVyXG4gICAgbGV0IGNlbGwgPSAnJztcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRva2VuLmhlYWRlci5sZW5ndGg7IGorKykge1xuICAgICAgY2VsbCArPSB0aGlzLnRhYmxlY2VsbCh0b2tlbi5oZWFkZXJbal0pO1xuICAgIH1cbiAgICBoZWFkZXIgKz0gdGhpcy50YWJsZXJvdyh7IHRleHQ6IGNlbGwgYXMgUGFyc2VyT3V0cHV0IH0pO1xuXG4gICAgbGV0IGJvZHkgPSAnJztcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRva2VuLnJvd3MubGVuZ3RoOyBqKyspIHtcbiAgICAgIGNvbnN0IHJvdyA9IHRva2VuLnJvd3Nbal07XG5cbiAgICAgIGNlbGwgPSAnJztcbiAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgcm93Lmxlbmd0aDsgaysrKSB7XG4gICAgICAgIGNlbGwgKz0gdGhpcy50YWJsZWNlbGwocm93W2tdKTtcbiAgICAgIH1cblxuICAgICAgYm9keSArPSB0aGlzLnRhYmxlcm93KHsgdGV4dDogY2VsbCBhcyBQYXJzZXJPdXRwdXQgfSk7XG4gICAgfVxuICAgIGlmIChib2R5KSBib2R5ID0gYDx0Ym9keT4ke2JvZHl9PC90Ym9keT5gO1xuXG4gICAgcmV0dXJuICc8dGFibGU+XFxuJ1xuICAgICAgKyAnPHRoZWFkPlxcbidcbiAgICAgICsgaGVhZGVyXG4gICAgICArICc8L3RoZWFkPlxcbidcbiAgICAgICsgYm9keVxuICAgICAgKyAnPC90YWJsZT5cXG4nIGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgdGFibGVyb3coeyB0ZXh0IH06IFRva2Vucy5UYWJsZVJvdzxQYXJzZXJPdXRwdXQ+KTogUmVuZGVyZXJPdXRwdXQge1xuICAgIHJldHVybiBgPHRyPlxcbiR7dGV4dH08L3RyPlxcbmAgYXMgUmVuZGVyZXJPdXRwdXQ7XG4gIH1cblxuICB0YWJsZWNlbGwodG9rZW46IFRva2Vucy5UYWJsZUNlbGwpOiBSZW5kZXJlck91dHB1dCB7XG4gICAgY29uc3QgY29udGVudCA9IHRoaXMucGFyc2VyLnBhcnNlSW5saW5lKHRva2VuLnRva2Vucyk7XG4gICAgY29uc3QgdHlwZSA9IHRva2VuLmhlYWRlciA/ICd0aCcgOiAndGQnO1xuICAgIGNvbnN0IHRhZyA9IHRva2VuLmFsaWduXG4gICAgICA/IGA8JHt0eXBlfSBhbGlnbj1cIiR7dG9rZW4uYWxpZ259XCI+YFxuICAgICAgOiBgPCR7dHlwZX0+YDtcbiAgICByZXR1cm4gdGFnICsgY29udGVudCArIGA8LyR7dHlwZX0+XFxuYCBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBzcGFuIGxldmVsIHJlbmRlcmVyXG4gICAqL1xuICBzdHJvbmcoeyB0b2tlbnMgfTogVG9rZW5zLlN0cm9uZyk6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICByZXR1cm4gYDxzdHJvbmc+JHt0aGlzLnBhcnNlci5wYXJzZUlubGluZSh0b2tlbnMpfTwvc3Ryb25nPmAgYXMgUmVuZGVyZXJPdXRwdXQ7XG4gIH1cblxuICBlbSh7IHRva2VucyB9OiBUb2tlbnMuRW0pOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuIGA8ZW0+JHt0aGlzLnBhcnNlci5wYXJzZUlubGluZSh0b2tlbnMpfTwvZW0+YCBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIGNvZGVzcGFuKHsgdGV4dCB9OiBUb2tlbnMuQ29kZXNwYW4pOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuIGA8Y29kZT4ke2VzY2FwZUh0bWxFbnRpdGllcyh0ZXh0LCB0cnVlKX08L2NvZGU+YCBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIGJyKHRva2VuOiBUb2tlbnMuQnIpOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuICc8YnI+JyBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIGRlbCh7IHRva2VucyB9OiBUb2tlbnMuRGVsKTogUmVuZGVyZXJPdXRwdXQge1xuICAgIHJldHVybiBgPGRlbD4ke3RoaXMucGFyc2VyLnBhcnNlSW5saW5lKHRva2Vucyl9PC9kZWw+YCBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIGxpbmsoeyBocmVmLCB0aXRsZSwgdG9rZW5zIH06IFRva2Vucy5MaW5rKTogUmVuZGVyZXJPdXRwdXQge1xuICAgIGNvbnN0IHRleHQgPSB0aGlzLnBhcnNlci5wYXJzZUlubGluZSh0b2tlbnMpIGFzIHN0cmluZztcbiAgICBjb25zdCBjbGVhbkhyZWYgPSBjbGVhblVybChocmVmKTtcbiAgICBpZiAoY2xlYW5IcmVmID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gdGV4dCBhcyBSZW5kZXJlck91dHB1dDtcbiAgICB9XG4gICAgaHJlZiA9IGNsZWFuSHJlZjtcbiAgICBsZXQgb3V0ID0gJzxhIGhyZWY9XCInICsgaHJlZiArICdcIic7XG4gICAgaWYgKHRpdGxlKSB7XG4gICAgICBvdXQgKz0gJyB0aXRsZT1cIicgKyAoZXNjYXBlSHRtbEVudGl0aWVzKHRpdGxlKSkgKyAnXCInO1xuICAgIH1cbiAgICBvdXQgKz0gJz4nICsgdGV4dCArICc8L2E+JztcbiAgICByZXR1cm4gb3V0IGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgaW1hZ2UoeyBocmVmLCB0aXRsZSwgdGV4dCwgdG9rZW5zIH06IFRva2Vucy5JbWFnZSk6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICBpZiAodG9rZW5zKSB7XG4gICAgICB0ZXh0ID0gdGhpcy5wYXJzZXIucGFyc2VJbmxpbmUodG9rZW5zLCB0aGlzLnBhcnNlci50ZXh0UmVuZGVyZXIpIGFzIHN0cmluZztcbiAgICB9XG4gICAgY29uc3QgY2xlYW5IcmVmID0gY2xlYW5VcmwoaHJlZik7XG4gICAgaWYgKGNsZWFuSHJlZiA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGVzY2FwZUh0bWxFbnRpdGllcyh0ZXh0KSBhcyBSZW5kZXJlck91dHB1dDtcbiAgICB9XG4gICAgaHJlZiA9IGNsZWFuSHJlZjtcblxuICAgIGxldCBvdXQgPSBgPGltZyBzcmM9XCIke2hyZWZ9XCIgYWx0PVwiJHtlc2NhcGVIdG1sRW50aXRpZXModGV4dCl9XCJgO1xuICAgIGlmICh0aXRsZSkge1xuICAgICAgb3V0ICs9IGAgdGl0bGU9XCIke2VzY2FwZUh0bWxFbnRpdGllcyh0aXRsZSl9XCJgO1xuICAgIH1cbiAgICBvdXQgKz0gJz4nO1xuICAgIHJldHVybiBvdXQgYXMgUmVuZGVyZXJPdXRwdXQ7XG4gIH1cblxuICB0ZXh0KHRva2VuOiBUb2tlbnMuVGV4dCB8IFRva2Vucy5Fc2NhcGUpOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuICd0b2tlbnMnIGluIHRva2VuICYmIHRva2VuLnRva2Vuc1xuICAgICAgPyB0aGlzLnBhcnNlci5wYXJzZUlubGluZSh0b2tlbi50b2tlbnMpIGFzIHVua25vd24gYXMgUmVuZGVyZXJPdXRwdXRcbiAgICAgIDogKCdlc2NhcGVkJyBpbiB0b2tlbiAmJiB0b2tlbi5lc2NhcGVkID8gdG9rZW4udGV4dCBhcyBSZW5kZXJlck91dHB1dCA6IGVzY2FwZUh0bWxFbnRpdGllcyh0b2tlbi50ZXh0KSBhcyBSZW5kZXJlck91dHB1dCk7XG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IFRva2VucyB9IGZyb20gJy4vVG9rZW5zLnRzJztcblxuLyoqXG4gKiBUZXh0UmVuZGVyZXJcbiAqIHJldHVybnMgb25seSB0aGUgdGV4dHVhbCBwYXJ0IG9mIHRoZSB0b2tlblxuICovXG5leHBvcnQgY2xhc3MgX1RleHRSZW5kZXJlcjxSZW5kZXJlck91dHB1dCA9IHN0cmluZz4ge1xuICAvLyBubyBuZWVkIGZvciBibG9jayBsZXZlbCByZW5kZXJlcnNcbiAgc3Ryb25nKHsgdGV4dCB9OiBUb2tlbnMuU3Ryb25nKTogUmVuZGVyZXJPdXRwdXQge1xuICAgIHJldHVybiB0ZXh0IGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgZW0oeyB0ZXh0IH06IFRva2Vucy5FbSk6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICByZXR1cm4gdGV4dCBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIGNvZGVzcGFuKHsgdGV4dCB9OiBUb2tlbnMuQ29kZXNwYW4pOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuIHRleHQgYXMgUmVuZGVyZXJPdXRwdXQ7XG4gIH1cblxuICBkZWwoeyB0ZXh0IH06IFRva2Vucy5EZWwpOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuIHRleHQgYXMgUmVuZGVyZXJPdXRwdXQ7XG4gIH1cblxuICBodG1sKHsgdGV4dCB9OiBUb2tlbnMuSFRNTCB8IFRva2Vucy5UYWcpOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuIHRleHQgYXMgUmVuZGVyZXJPdXRwdXQ7XG4gIH1cblxuICB0ZXh0KHsgdGV4dCB9OiBUb2tlbnMuVGV4dCB8IFRva2Vucy5Fc2NhcGUgfCBUb2tlbnMuVGFnKTogUmVuZGVyZXJPdXRwdXQge1xuICAgIHJldHVybiB0ZXh0IGFzIFJlbmRlcmVyT3V0cHV0O1xuICB9XG5cbiAgbGluayh7IHRleHQgfTogVG9rZW5zLkxpbmspOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuICcnICsgdGV4dCBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIGltYWdlKHsgdGV4dCB9OiBUb2tlbnMuSW1hZ2UpOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuICcnICsgdGV4dCBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxuXG4gIGJyKCk6IFJlbmRlcmVyT3V0cHV0IHtcbiAgICByZXR1cm4gJycgYXMgUmVuZGVyZXJPdXRwdXQ7XG4gIH1cblxuICBjaGVja2JveCh7IHJhdyB9OiBUb2tlbnMuQ2hlY2tib3gpOiBSZW5kZXJlck91dHB1dCB7XG4gICAgcmV0dXJuIHJhdyBhcyBSZW5kZXJlck91dHB1dDtcbiAgfVxufVxuIiwgImltcG9ydCB7IF9SZW5kZXJlciB9IGZyb20gJy4vUmVuZGVyZXIudHMnO1xuaW1wb3J0IHsgX1RleHRSZW5kZXJlciB9IGZyb20gJy4vVGV4dFJlbmRlcmVyLnRzJztcbmltcG9ydCB7IF9kZWZhdWx0cyB9IGZyb20gJy4vZGVmYXVsdHMudHMnO1xuaW1wb3J0IHR5cGUgeyBNYXJrZWRUb2tlbiwgVG9rZW4sIFRva2VucyB9IGZyb20gJy4vVG9rZW5zLnRzJztcbmltcG9ydCB0eXBlIHsgTWFya2VkT3B0aW9ucyB9IGZyb20gJy4vTWFya2VkT3B0aW9ucy50cyc7XG5cbi8qKlxuICogUGFyc2luZyAmIENvbXBpbGluZ1xuICovXG5leHBvcnQgY2xhc3MgX1BhcnNlcjxQYXJzZXJPdXRwdXQgPSBzdHJpbmcsIFJlbmRlcmVyT3V0cHV0ID0gc3RyaW5nPiB7XG4gIG9wdGlvbnM6IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD47XG4gIHJlbmRlcmVyOiBfUmVuZGVyZXI8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD47XG4gIHRleHRSZW5kZXJlcjogX1RleHRSZW5kZXJlcjxSZW5kZXJlck91dHB1dD47XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBNYXJrZWRPcHRpb25zPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+KSB7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCBfZGVmYXVsdHM7XG4gICAgdGhpcy5vcHRpb25zLnJlbmRlcmVyID0gdGhpcy5vcHRpb25zLnJlbmRlcmVyIHx8IG5ldyBfUmVuZGVyZXI8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4oKTtcbiAgICB0aGlzLnJlbmRlcmVyID0gdGhpcy5vcHRpb25zLnJlbmRlcmVyO1xuICAgIHRoaXMucmVuZGVyZXIub3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICB0aGlzLnJlbmRlcmVyLnBhcnNlciA9IHRoaXM7XG4gICAgdGhpcy50ZXh0UmVuZGVyZXIgPSBuZXcgX1RleHRSZW5kZXJlcjxSZW5kZXJlck91dHB1dD4oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0aWMgUGFyc2UgTWV0aG9kXG4gICAqL1xuICBzdGF0aWMgcGFyc2U8UGFyc2VyT3V0cHV0ID0gc3RyaW5nLCBSZW5kZXJlck91dHB1dCA9IHN0cmluZz4odG9rZW5zOiBUb2tlbltdLCBvcHRpb25zPzogTWFya2VkT3B0aW9uczxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0Pikge1xuICAgIGNvbnN0IHBhcnNlciA9IG5ldyBfUGFyc2VyPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+KG9wdGlvbnMpO1xuICAgIHJldHVybiBwYXJzZXIucGFyc2UodG9rZW5zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0aWMgUGFyc2UgSW5saW5lIE1ldGhvZFxuICAgKi9cbiAgc3RhdGljIHBhcnNlSW5saW5lPFBhcnNlck91dHB1dCA9IHN0cmluZywgUmVuZGVyZXJPdXRwdXQgPSBzdHJpbmc+KHRva2VuczogVG9rZW5bXSwgb3B0aW9ucz86IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4pIHtcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgX1BhcnNlcjxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0PihvcHRpb25zKTtcbiAgICByZXR1cm4gcGFyc2VyLnBhcnNlSW5saW5lKHRva2Vucyk7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgTG9vcFxuICAgKi9cbiAgcGFyc2UodG9rZW5zOiBUb2tlbltdKTogUGFyc2VyT3V0cHV0IHtcbiAgICB0aGlzLnJlbmRlcmVyLnBhcnNlciA9IHRoaXM7XG4gICAgbGV0IG91dCA9ICcnO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGFueVRva2VuID0gdG9rZW5zW2ldO1xuXG4gICAgICAvLyBSdW4gYW55IHJlbmRlcmVyIGV4dGVuc2lvbnNcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucz8ucmVuZGVyZXJzPy5bYW55VG9rZW4udHlwZV0pIHtcbiAgICAgICAgY29uc3QgZ2VuZXJpY1Rva2VuID0gYW55VG9rZW4gYXMgVG9rZW5zLkdlbmVyaWM7XG4gICAgICAgIGNvbnN0IHJldCA9IHRoaXMub3B0aW9ucy5leHRlbnNpb25zLnJlbmRlcmVyc1tnZW5lcmljVG9rZW4udHlwZV0uY2FsbCh7IHBhcnNlcjogdGhpcyB9LCBnZW5lcmljVG9rZW4pO1xuICAgICAgICBpZiAocmV0ICE9PSBmYWxzZSB8fCAhWydzcGFjZScsICdocicsICdoZWFkaW5nJywgJ2NvZGUnLCAndGFibGUnLCAnYmxvY2txdW90ZScsICdsaXN0JywgJ2h0bWwnLCAnZGVmJywgJ3BhcmFncmFwaCcsICd0ZXh0J10uaW5jbHVkZXMoZ2VuZXJpY1Rva2VuLnR5cGUpKSB7XG4gICAgICAgICAgb3V0ICs9IHJldCB8fCAnJztcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCB0b2tlbiA9IGFueVRva2VuIGFzIE1hcmtlZFRva2VuO1xuXG4gICAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnc3BhY2UnOiB7XG4gICAgICAgICAgb3V0ICs9IHRoaXMucmVuZGVyZXIuc3BhY2UodG9rZW4pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2hyJzoge1xuICAgICAgICAgIG91dCArPSB0aGlzLnJlbmRlcmVyLmhyKHRva2VuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdoZWFkaW5nJzoge1xuICAgICAgICAgIG91dCArPSB0aGlzLnJlbmRlcmVyLmhlYWRpbmcodG9rZW4pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2NvZGUnOiB7XG4gICAgICAgICAgb3V0ICs9IHRoaXMucmVuZGVyZXIuY29kZSh0b2tlbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndGFibGUnOiB7XG4gICAgICAgICAgb3V0ICs9IHRoaXMucmVuZGVyZXIudGFibGUodG9rZW4pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2Jsb2NrcXVvdGUnOiB7XG4gICAgICAgICAgb3V0ICs9IHRoaXMucmVuZGVyZXIuYmxvY2txdW90ZSh0b2tlbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnbGlzdCc6IHtcbiAgICAgICAgICBvdXQgKz0gdGhpcy5yZW5kZXJlci5saXN0KHRva2VuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdjaGVja2JveCc6IHtcbiAgICAgICAgICBvdXQgKz0gdGhpcy5yZW5kZXJlci5jaGVja2JveCh0b2tlbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnaHRtbCc6IHtcbiAgICAgICAgICBvdXQgKz0gdGhpcy5yZW5kZXJlci5odG1sKHRva2VuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkZWYnOiB7XG4gICAgICAgICAgb3V0ICs9IHRoaXMucmVuZGVyZXIuZGVmKHRva2VuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdwYXJhZ3JhcGgnOiB7XG4gICAgICAgICAgb3V0ICs9IHRoaXMucmVuZGVyZXIucGFyYWdyYXBoKHRva2VuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0ZXh0Jzoge1xuICAgICAgICAgIG91dCArPSB0aGlzLnJlbmRlcmVyLnRleHQodG9rZW4pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIGNvbnN0IGVyck1zZyA9ICdUb2tlbiB3aXRoIFwiJyArIHRva2VuLnR5cGUgKyAnXCIgdHlwZSB3YXMgbm90IGZvdW5kLic7XG4gICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyTXNnKTtcbiAgICAgICAgICAgIHJldHVybiAnJyBhcyBQYXJzZXJPdXRwdXQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJNc2cpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvdXQgYXMgUGFyc2VyT3V0cHV0O1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIElubGluZSBUb2tlbnNcbiAgICovXG4gIHBhcnNlSW5saW5lKHRva2VuczogVG9rZW5bXSwgcmVuZGVyZXI6IF9SZW5kZXJlcjxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0PiB8IF9UZXh0UmVuZGVyZXI8UmVuZGVyZXJPdXRwdXQ+ID0gdGhpcy5yZW5kZXJlcik6IFBhcnNlck91dHB1dCB7XG4gICAgdGhpcy5yZW5kZXJlci5wYXJzZXIgPSB0aGlzO1xuICAgIGxldCBvdXQgPSAnJztcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBhbnlUb2tlbiA9IHRva2Vuc1tpXTtcblxuICAgICAgLy8gUnVuIGFueSByZW5kZXJlciBleHRlbnNpb25zXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmV4dGVuc2lvbnM/LnJlbmRlcmVycz8uW2FueVRva2VuLnR5cGVdKSB7XG4gICAgICAgIGNvbnN0IHJldCA9IHRoaXMub3B0aW9ucy5leHRlbnNpb25zLnJlbmRlcmVyc1thbnlUb2tlbi50eXBlXS5jYWxsKHsgcGFyc2VyOiB0aGlzIH0sIGFueVRva2VuKTtcbiAgICAgICAgaWYgKHJldCAhPT0gZmFsc2UgfHwgIVsnZXNjYXBlJywgJ2h0bWwnLCAnbGluaycsICdpbWFnZScsICdzdHJvbmcnLCAnZW0nLCAnY29kZXNwYW4nLCAnYnInLCAnZGVsJywgJ3RleHQnXS5pbmNsdWRlcyhhbnlUb2tlbi50eXBlKSkge1xuICAgICAgICAgIG91dCArPSByZXQgfHwgJyc7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgdG9rZW4gPSBhbnlUb2tlbiBhcyBNYXJrZWRUb2tlbjtcblxuICAgICAgc3dpdGNoICh0b2tlbi50eXBlKSB7XG4gICAgICAgIGNhc2UgJ2VzY2FwZSc6IHtcbiAgICAgICAgICBvdXQgKz0gcmVuZGVyZXIudGV4dCh0b2tlbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnaHRtbCc6IHtcbiAgICAgICAgICBvdXQgKz0gcmVuZGVyZXIuaHRtbCh0b2tlbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnbGluayc6IHtcbiAgICAgICAgICBvdXQgKz0gcmVuZGVyZXIubGluayh0b2tlbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnaW1hZ2UnOiB7XG4gICAgICAgICAgb3V0ICs9IHJlbmRlcmVyLmltYWdlKHRva2VuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdjaGVja2JveCc6IHtcbiAgICAgICAgICBvdXQgKz0gcmVuZGVyZXIuY2hlY2tib3godG9rZW4pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3N0cm9uZyc6IHtcbiAgICAgICAgICBvdXQgKz0gcmVuZGVyZXIuc3Ryb25nKHRva2VuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdlbSc6IHtcbiAgICAgICAgICBvdXQgKz0gcmVuZGVyZXIuZW0odG9rZW4pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2NvZGVzcGFuJzoge1xuICAgICAgICAgIG91dCArPSByZW5kZXJlci5jb2Rlc3Bhbih0b2tlbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnYnInOiB7XG4gICAgICAgICAgb3V0ICs9IHJlbmRlcmVyLmJyKHRva2VuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkZWwnOiB7XG4gICAgICAgICAgb3V0ICs9IHJlbmRlcmVyLmRlbCh0b2tlbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndGV4dCc6IHtcbiAgICAgICAgICBvdXQgKz0gcmVuZGVyZXIudGV4dCh0b2tlbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIGNvbnN0IGVyck1zZyA9ICdUb2tlbiB3aXRoIFwiJyArIHRva2VuLnR5cGUgKyAnXCIgdHlwZSB3YXMgbm90IGZvdW5kLic7XG4gICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyTXNnKTtcbiAgICAgICAgICAgIHJldHVybiAnJyBhcyBQYXJzZXJPdXRwdXQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJNc2cpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0IGFzIFBhcnNlck91dHB1dDtcbiAgfVxufVxuIiwgImltcG9ydCB7IF9kZWZhdWx0cyB9IGZyb20gJy4vZGVmYXVsdHMudHMnO1xuaW1wb3J0IHsgX0xleGVyIH0gZnJvbSAnLi9MZXhlci50cyc7XG5pbXBvcnQgeyBfUGFyc2VyIH0gZnJvbSAnLi9QYXJzZXIudHMnO1xuaW1wb3J0IHR5cGUgeyBNYXJrZWRPcHRpb25zIH0gZnJvbSAnLi9NYXJrZWRPcHRpb25zLnRzJztcbmltcG9ydCB0eXBlIHsgVG9rZW4sIFRva2Vuc0xpc3QgfSBmcm9tICcuL1Rva2Vucy50cyc7XG5cbmV4cG9ydCBjbGFzcyBfSG9va3M8UGFyc2VyT3V0cHV0ID0gc3RyaW5nLCBSZW5kZXJlck91dHB1dCA9IHN0cmluZz4ge1xuICBvcHRpb25zOiBNYXJrZWRPcHRpb25zPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+O1xuICBibG9jaz86IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3Iob3B0aW9ucz86IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4pIHtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IF9kZWZhdWx0cztcbiAgfVxuXG4gIHN0YXRpYyBwYXNzVGhyb3VnaEhvb2tzID0gbmV3IFNldChbXG4gICAgJ3ByZXByb2Nlc3MnLFxuICAgICdwb3N0cHJvY2VzcycsXG4gICAgJ3Byb2Nlc3NBbGxUb2tlbnMnLFxuICAgICdlbVN0cm9uZ01hc2snLFxuICBdKTtcblxuICBzdGF0aWMgcGFzc1Rocm91Z2hIb29rc1Jlc3BlY3RBc3luYyA9IG5ldyBTZXQoW1xuICAgICdwcmVwcm9jZXNzJyxcbiAgICAncG9zdHByb2Nlc3MnLFxuICAgICdwcm9jZXNzQWxsVG9rZW5zJyxcbiAgXSk7XG5cbiAgLyoqXG4gICAqIFByb2Nlc3MgbWFya2Rvd24gYmVmb3JlIG1hcmtlZFxuICAgKi9cbiAgcHJlcHJvY2VzcyhtYXJrZG93bjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIG1hcmtkb3duO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3MgSFRNTCBhZnRlciBtYXJrZWQgaXMgZmluaXNoZWRcbiAgICovXG4gIHBvc3Rwcm9jZXNzKGh0bWw6IFBhcnNlck91dHB1dCkge1xuICAgIHJldHVybiBodG1sO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3MgYWxsIHRva2VucyBiZWZvcmUgd2FsayB0b2tlbnNcbiAgICovXG4gIHByb2Nlc3NBbGxUb2tlbnModG9rZW5zOiBUb2tlbltdIHwgVG9rZW5zTGlzdCkge1xuICAgIHJldHVybiB0b2tlbnM7XG4gIH1cblxuICAvKipcbiAgICogTWFzayBjb250ZW50cyB0aGF0IHNob3VsZCBub3QgYmUgaW50ZXJwcmV0ZWQgYXMgZW0vc3Ryb25nIGRlbGltaXRlcnNcbiAgICovXG4gIGVtU3Ryb25nTWFzayhzcmM6IHN0cmluZykge1xuICAgIHJldHVybiBzcmM7XG4gIH1cblxuICAvKipcbiAgICogUHJvdmlkZSBmdW5jdGlvbiB0byB0b2tlbml6ZSBtYXJrZG93blxuICAgKi9cbiAgcHJvdmlkZUxleGVyKCkge1xuICAgIHJldHVybiB0aGlzLmJsb2NrID8gX0xleGVyLmxleCA6IF9MZXhlci5sZXhJbmxpbmU7XG4gIH1cblxuICAvKipcbiAgICogUHJvdmlkZSBmdW5jdGlvbiB0byBwYXJzZSB0b2tlbnNcbiAgICovXG4gIHByb3ZpZGVQYXJzZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuYmxvY2sgPyBfUGFyc2VyLnBhcnNlPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+IDogX1BhcnNlci5wYXJzZUlubGluZTxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0PjtcbiAgfVxufVxuIiwgImltcG9ydCB7IF9nZXREZWZhdWx0cyB9IGZyb20gJy4vZGVmYXVsdHMudHMnO1xuaW1wb3J0IHsgX0xleGVyIH0gZnJvbSAnLi9MZXhlci50cyc7XG5pbXBvcnQgeyBfUGFyc2VyIH0gZnJvbSAnLi9QYXJzZXIudHMnO1xuaW1wb3J0IHsgX0hvb2tzIH0gZnJvbSAnLi9Ib29rcy50cyc7XG5pbXBvcnQgeyBfUmVuZGVyZXIgfSBmcm9tICcuL1JlbmRlcmVyLnRzJztcbmltcG9ydCB7IF9Ub2tlbml6ZXIgfSBmcm9tICcuL1Rva2VuaXplci50cyc7XG5pbXBvcnQgeyBfVGV4dFJlbmRlcmVyIH0gZnJvbSAnLi9UZXh0UmVuZGVyZXIudHMnO1xuaW1wb3J0IHsgZXNjYXBlSHRtbEVudGl0aWVzIH0gZnJvbSAnLi9oZWxwZXJzLnRzJztcbmltcG9ydCB0eXBlIHsgTWFya2VkRXh0ZW5zaW9uLCBNYXJrZWRPcHRpb25zIH0gZnJvbSAnLi9NYXJrZWRPcHRpb25zLnRzJztcbmltcG9ydCB0eXBlIHsgVG9rZW4sIFRva2VucywgVG9rZW5zTGlzdCB9IGZyb20gJy4vVG9rZW5zLnRzJztcblxuZXhwb3J0IHR5cGUgTWF5YmVQcm9taXNlID0gdm9pZCB8IFByb21pc2U8dm9pZD47XG5cbnR5cGUgVW5rbm93bkZ1bmN0aW9uID0gKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdW5rbm93bjtcbnR5cGUgR2VuZXJpY1JlbmRlcmVyRnVuY3Rpb24gPSAoLi4uYXJnczogdW5rbm93bltdKSA9PiBzdHJpbmcgfCBmYWxzZTtcblxuZXhwb3J0IGNsYXNzIE1hcmtlZDxQYXJzZXJPdXRwdXQgPSBzdHJpbmcsIFJlbmRlcmVyT3V0cHV0ID0gc3RyaW5nPiB7XG4gIGRlZmF1bHRzID0gX2dldERlZmF1bHRzPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+KCk7XG4gIG9wdGlvbnMgPSB0aGlzLnNldE9wdGlvbnM7XG5cbiAgcGFyc2UgPSB0aGlzLnBhcnNlTWFya2Rvd24odHJ1ZSk7XG4gIHBhcnNlSW5saW5lID0gdGhpcy5wYXJzZU1hcmtkb3duKGZhbHNlKTtcblxuICBQYXJzZXIgPSBfUGFyc2VyPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+O1xuICBSZW5kZXJlciA9IF9SZW5kZXJlcjxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0PjtcbiAgVGV4dFJlbmRlcmVyID0gX1RleHRSZW5kZXJlcjxSZW5kZXJlck91dHB1dD47XG4gIExleGVyID0gX0xleGVyO1xuICBUb2tlbml6ZXIgPSBfVG9rZW5pemVyPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+O1xuICBIb29rcyA9IF9Ib29rczxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0PjtcblxuICBjb25zdHJ1Y3RvciguLi5hcmdzOiBNYXJrZWRFeHRlbnNpb248UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD5bXSkge1xuICAgIHRoaXMudXNlKC4uLmFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1biBjYWxsYmFjayBmb3IgZXZlcnkgdG9rZW5cbiAgICovXG4gIHdhbGtUb2tlbnModG9rZW5zOiBUb2tlbltdIHwgVG9rZW5zTGlzdCwgY2FsbGJhY2s6ICh0b2tlbjogVG9rZW4pID0+IE1heWJlUHJvbWlzZSB8IE1heWJlUHJvbWlzZVtdKSB7XG4gICAgbGV0IHZhbHVlczogTWF5YmVQcm9taXNlW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHRva2Vucykge1xuICAgICAgdmFsdWVzID0gdmFsdWVzLmNvbmNhdChjYWxsYmFjay5jYWxsKHRoaXMsIHRva2VuKSk7XG4gICAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcbiAgICAgICAgY2FzZSAndGFibGUnOiB7XG4gICAgICAgICAgY29uc3QgdGFibGVUb2tlbiA9IHRva2VuIGFzIFRva2Vucy5UYWJsZTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGNlbGwgb2YgdGFibGVUb2tlbi5oZWFkZXIpIHtcbiAgICAgICAgICAgIHZhbHVlcyA9IHZhbHVlcy5jb25jYXQodGhpcy53YWxrVG9rZW5zKGNlbGwudG9rZW5zLCBjYWxsYmFjaykpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKGNvbnN0IHJvdyBvZiB0YWJsZVRva2VuLnJvd3MpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2VsbCBvZiByb3cpIHtcbiAgICAgICAgICAgICAgdmFsdWVzID0gdmFsdWVzLmNvbmNhdCh0aGlzLndhbGtUb2tlbnMoY2VsbC50b2tlbnMsIGNhbGxiYWNrKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2xpc3QnOiB7XG4gICAgICAgICAgY29uc3QgbGlzdFRva2VuID0gdG9rZW4gYXMgVG9rZW5zLkxpc3Q7XG4gICAgICAgICAgdmFsdWVzID0gdmFsdWVzLmNvbmNhdCh0aGlzLndhbGtUb2tlbnMobGlzdFRva2VuLml0ZW1zLCBjYWxsYmFjaykpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBjb25zdCBnZW5lcmljVG9rZW4gPSB0b2tlbiBhcyBUb2tlbnMuR2VuZXJpYztcbiAgICAgICAgICBpZiAodGhpcy5kZWZhdWx0cy5leHRlbnNpb25zPy5jaGlsZFRva2Vucz8uW2dlbmVyaWNUb2tlbi50eXBlXSkge1xuICAgICAgICAgICAgdGhpcy5kZWZhdWx0cy5leHRlbnNpb25zLmNoaWxkVG9rZW5zW2dlbmVyaWNUb2tlbi50eXBlXS5mb3JFYWNoKChjaGlsZFRva2VucykgPT4ge1xuICAgICAgICAgICAgICBjb25zdCB0b2tlbnMgPSBnZW5lcmljVG9rZW5bY2hpbGRUb2tlbnNdLmZsYXQoSW5maW5pdHkpIGFzIFRva2VuW10gfCBUb2tlbnNMaXN0O1xuICAgICAgICAgICAgICB2YWx1ZXMgPSB2YWx1ZXMuY29uY2F0KHRoaXMud2Fsa1Rva2Vucyh0b2tlbnMsIGNhbGxiYWNrKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGdlbmVyaWNUb2tlbi50b2tlbnMpIHtcbiAgICAgICAgICAgIHZhbHVlcyA9IHZhbHVlcy5jb25jYXQodGhpcy53YWxrVG9rZW5zKGdlbmVyaWNUb2tlbi50b2tlbnMsIGNhbGxiYWNrKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZXM7XG4gIH1cblxuICB1c2UoLi4uYXJnczogTWFya2VkRXh0ZW5zaW9uPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+W10pIHtcbiAgICBjb25zdCBleHRlbnNpb25zOiBNYXJrZWRPcHRpb25zPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+WydleHRlbnNpb25zJ10gPSB0aGlzLmRlZmF1bHRzLmV4dGVuc2lvbnMgfHwgeyByZW5kZXJlcnM6IHt9LCBjaGlsZFRva2Vuczoge30gfTtcblxuICAgIGFyZ3MuZm9yRWFjaCgocGFjaykgPT4ge1xuICAgICAgLy8gY29weSBvcHRpb25zIHRvIG5ldyBvYmplY3RcbiAgICAgIGNvbnN0IG9wdHMgPSB7IC4uLnBhY2sgfSBhcyBNYXJrZWRPcHRpb25zPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+O1xuXG4gICAgICAvLyBzZXQgYXN5bmMgdG8gdHJ1ZSBpZiBpdCB3YXMgc2V0IHRvIHRydWUgYmVmb3JlXG4gICAgICBvcHRzLmFzeW5jID0gdGhpcy5kZWZhdWx0cy5hc3luYyB8fCBvcHRzLmFzeW5jIHx8IGZhbHNlO1xuXG4gICAgICAvLyA9PS0tIFBhcnNlIFwiYWRkb25cIiBleHRlbnNpb25zIC0tPT0gLy9cbiAgICAgIGlmIChwYWNrLmV4dGVuc2lvbnMpIHtcbiAgICAgICAgcGFjay5leHRlbnNpb25zLmZvckVhY2goKGV4dCkgPT4ge1xuICAgICAgICAgIGlmICghZXh0Lm5hbWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZXh0ZW5zaW9uIG5hbWUgcmVxdWlyZWQnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCdyZW5kZXJlcicgaW4gZXh0KSB7IC8vIFJlbmRlcmVyIGV4dGVuc2lvbnNcbiAgICAgICAgICAgIGNvbnN0IHByZXZSZW5kZXJlciA9IGV4dGVuc2lvbnMucmVuZGVyZXJzW2V4dC5uYW1lXTtcbiAgICAgICAgICAgIGlmIChwcmV2UmVuZGVyZXIpIHtcbiAgICAgICAgICAgICAgLy8gUmVwbGFjZSBleHRlbnNpb24gd2l0aCBmdW5jIHRvIHJ1biBuZXcgZXh0ZW5zaW9uIGJ1dCBmYWxsIGJhY2sgaWYgZmFsc2VcbiAgICAgICAgICAgICAgZXh0ZW5zaW9ucy5yZW5kZXJlcnNbZXh0Lm5hbWVdID0gZnVuY3Rpb24oLi4uYXJncykge1xuICAgICAgICAgICAgICAgIGxldCByZXQgPSBleHQucmVuZGVyZXIuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgICAgICAgICAgaWYgKHJldCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgIHJldCA9IHByZXZSZW5kZXJlci5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGV4dGVuc2lvbnMucmVuZGVyZXJzW2V4dC5uYW1lXSA9IGV4dC5yZW5kZXJlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCd0b2tlbml6ZXInIGluIGV4dCkgeyAvLyBUb2tlbml6ZXIgRXh0ZW5zaW9uc1xuICAgICAgICAgICAgaWYgKCFleHQubGV2ZWwgfHwgKGV4dC5sZXZlbCAhPT0gJ2Jsb2NrJyAmJiBleHQubGV2ZWwgIT09ICdpbmxpbmUnKSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJleHRlbnNpb24gbGV2ZWwgbXVzdCBiZSAnYmxvY2snIG9yICdpbmxpbmUnXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZXh0TGV2ZWwgPSBleHRlbnNpb25zW2V4dC5sZXZlbF07XG4gICAgICAgICAgICBpZiAoZXh0TGV2ZWwpIHtcbiAgICAgICAgICAgICAgZXh0TGV2ZWwudW5zaGlmdChleHQudG9rZW5pemVyKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGV4dGVuc2lvbnNbZXh0LmxldmVsXSA9IFtleHQudG9rZW5pemVyXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChleHQuc3RhcnQpIHsgLy8gRnVuY3Rpb24gdG8gY2hlY2sgZm9yIHN0YXJ0IG9mIHRva2VuXG4gICAgICAgICAgICAgIGlmIChleHQubGV2ZWwgPT09ICdibG9jaycpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXh0ZW5zaW9ucy5zdGFydEJsb2NrKSB7XG4gICAgICAgICAgICAgICAgICBleHRlbnNpb25zLnN0YXJ0QmxvY2sucHVzaChleHQuc3RhcnQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBleHRlbnNpb25zLnN0YXJ0QmxvY2sgPSBbZXh0LnN0YXJ0XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXh0LmxldmVsID09PSAnaW5saW5lJykge1xuICAgICAgICAgICAgICAgIGlmIChleHRlbnNpb25zLnN0YXJ0SW5saW5lKSB7XG4gICAgICAgICAgICAgICAgICBleHRlbnNpb25zLnN0YXJ0SW5saW5lLnB1c2goZXh0LnN0YXJ0KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9ucy5zdGFydElubGluZSA9IFtleHQuc3RhcnRdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoJ2NoaWxkVG9rZW5zJyBpbiBleHQgJiYgZXh0LmNoaWxkVG9rZW5zKSB7IC8vIENoaWxkIHRva2VucyB0byBiZSB2aXNpdGVkIGJ5IHdhbGtUb2tlbnNcbiAgICAgICAgICAgIGV4dGVuc2lvbnMuY2hpbGRUb2tlbnNbZXh0Lm5hbWVdID0gZXh0LmNoaWxkVG9rZW5zO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIG9wdHMuZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnM7XG4gICAgICB9XG5cbiAgICAgIC8vID09LS0gUGFyc2UgXCJvdmVyd3JpdGVcIiBleHRlbnNpb25zIC0tPT0gLy9cbiAgICAgIGlmIChwYWNrLnJlbmRlcmVyKSB7XG4gICAgICAgIGNvbnN0IHJlbmRlcmVyID0gdGhpcy5kZWZhdWx0cy5yZW5kZXJlciB8fCBuZXcgX1JlbmRlcmVyPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+KHRoaXMuZGVmYXVsdHMpO1xuICAgICAgICBmb3IgKGNvbnN0IHByb3AgaW4gcGFjay5yZW5kZXJlcikge1xuICAgICAgICAgIGlmICghKHByb3AgaW4gcmVuZGVyZXIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHJlbmRlcmVyICcke3Byb3B9JyBkb2VzIG5vdCBleGlzdGApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoWydvcHRpb25zJywgJ3BhcnNlciddLmluY2x1ZGVzKHByb3ApKSB7XG4gICAgICAgICAgICAvLyBpZ25vcmUgb3B0aW9ucyBwcm9wZXJ0eVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHJlbmRlcmVyUHJvcCA9IHByb3AgYXMgRXhjbHVkZTxrZXlvZiBfUmVuZGVyZXI8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4sICdvcHRpb25zJyB8ICdwYXJzZXInPjtcbiAgICAgICAgICBjb25zdCByZW5kZXJlckZ1bmMgPSBwYWNrLnJlbmRlcmVyW3JlbmRlcmVyUHJvcF0gYXMgR2VuZXJpY1JlbmRlcmVyRnVuY3Rpb247XG4gICAgICAgICAgY29uc3QgcHJldlJlbmRlcmVyID0gcmVuZGVyZXJbcmVuZGVyZXJQcm9wXSBhcyBHZW5lcmljUmVuZGVyZXJGdW5jdGlvbjtcbiAgICAgICAgICAvLyBSZXBsYWNlIHJlbmRlcmVyIHdpdGggZnVuYyB0byBydW4gZXh0ZW5zaW9uLCBidXQgZmFsbCBiYWNrIGlmIGZhbHNlXG4gICAgICAgICAgcmVuZGVyZXJbcmVuZGVyZXJQcm9wXSA9ICguLi5hcmdzOiB1bmtub3duW10pID0+IHtcbiAgICAgICAgICAgIGxldCByZXQgPSByZW5kZXJlckZ1bmMuYXBwbHkocmVuZGVyZXIsIGFyZ3MpO1xuICAgICAgICAgICAgaWYgKHJldCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgcmV0ID0gcHJldlJlbmRlcmVyLmFwcGx5KHJlbmRlcmVyLCBhcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAocmV0IHx8ICcnKSBhcyBSZW5kZXJlck91dHB1dDtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIG9wdHMucmVuZGVyZXIgPSByZW5kZXJlcjtcbiAgICAgIH1cbiAgICAgIGlmIChwYWNrLnRva2VuaXplcikge1xuICAgICAgICBjb25zdCB0b2tlbml6ZXIgPSB0aGlzLmRlZmF1bHRzLnRva2VuaXplciB8fCBuZXcgX1Rva2VuaXplcjxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0Pih0aGlzLmRlZmF1bHRzKTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wIGluIHBhY2sudG9rZW5pemVyKSB7XG4gICAgICAgICAgaWYgKCEocHJvcCBpbiB0b2tlbml6ZXIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHRva2VuaXplciAnJHtwcm9wfScgZG9lcyBub3QgZXhpc3RgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKFsnb3B0aW9ucycsICdydWxlcycsICdsZXhlciddLmluY2x1ZGVzKHByb3ApKSB7XG4gICAgICAgICAgICAvLyBpZ25vcmUgb3B0aW9ucywgcnVsZXMsIGFuZCBsZXhlciBwcm9wZXJ0aWVzXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgdG9rZW5pemVyUHJvcCA9IHByb3AgYXMgRXhjbHVkZTxrZXlvZiBfVG9rZW5pemVyPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+LCAnb3B0aW9ucycgfCAncnVsZXMnIHwgJ2xleGVyJz47XG4gICAgICAgICAgY29uc3QgdG9rZW5pemVyRnVuYyA9IHBhY2sudG9rZW5pemVyW3Rva2VuaXplclByb3BdIGFzIFVua25vd25GdW5jdGlvbjtcbiAgICAgICAgICBjb25zdCBwcmV2VG9rZW5pemVyID0gdG9rZW5pemVyW3Rva2VuaXplclByb3BdIGFzIFVua25vd25GdW5jdGlvbjtcbiAgICAgICAgICAvLyBSZXBsYWNlIHRva2VuaXplciB3aXRoIGZ1bmMgdG8gcnVuIGV4dGVuc2lvbiwgYnV0IGZhbGwgYmFjayBpZiBmYWxzZVxuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgY2Fubm90IHR5cGUgdG9rZW5pemVyIGZ1bmN0aW9uIGR5bmFtaWNhbGx5XG4gICAgICAgICAgdG9rZW5pemVyW3Rva2VuaXplclByb3BdID0gKC4uLmFyZ3M6IHVua25vd25bXSkgPT4ge1xuICAgICAgICAgICAgbGV0IHJldCA9IHRva2VuaXplckZ1bmMuYXBwbHkodG9rZW5pemVyLCBhcmdzKTtcbiAgICAgICAgICAgIGlmIChyZXQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgIHJldCA9IHByZXZUb2tlbml6ZXIuYXBwbHkodG9rZW5pemVyLCBhcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBvcHRzLnRva2VuaXplciA9IHRva2VuaXplcjtcbiAgICAgIH1cblxuICAgICAgLy8gPT0tLSBQYXJzZSBIb29rcyBleHRlbnNpb25zIC0tPT0gLy9cbiAgICAgIGlmIChwYWNrLmhvb2tzKSB7XG4gICAgICAgIGNvbnN0IGhvb2tzID0gdGhpcy5kZWZhdWx0cy5ob29rcyB8fCBuZXcgX0hvb2tzPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+KCk7XG4gICAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBwYWNrLmhvb2tzKSB7XG4gICAgICAgICAgaWYgKCEocHJvcCBpbiBob29rcykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgaG9vayAnJHtwcm9wfScgZG9lcyBub3QgZXhpc3RgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKFsnb3B0aW9ucycsICdibG9jayddLmluY2x1ZGVzKHByb3ApKSB7XG4gICAgICAgICAgICAvLyBpZ25vcmUgb3B0aW9ucyBhbmQgYmxvY2sgcHJvcGVydGllc1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGhvb2tzUHJvcCA9IHByb3AgYXMgRXhjbHVkZTxrZXlvZiBfSG9va3M8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4sICdvcHRpb25zJyB8ICdibG9jayc+O1xuICAgICAgICAgIGNvbnN0IGhvb2tzRnVuYyA9IHBhY2suaG9va3NbaG9va3NQcm9wXSBhcyBVbmtub3duRnVuY3Rpb247XG4gICAgICAgICAgY29uc3QgcHJldkhvb2sgPSBob29rc1tob29rc1Byb3BdIGFzIFVua25vd25GdW5jdGlvbjtcbiAgICAgICAgICBpZiAoX0hvb2tzLnBhc3NUaHJvdWdoSG9va3MuaGFzKHByb3ApKSB7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGNhbm5vdCB0eXBlIGhvb2sgZnVuY3Rpb24gZHluYW1pY2FsbHlcbiAgICAgICAgICAgIGhvb2tzW2hvb2tzUHJvcF0gPSAoYXJnOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLmRlZmF1bHRzLmFzeW5jICYmIF9Ib29rcy5wYXNzVGhyb3VnaEhvb2tzUmVzcGVjdEFzeW5jLmhhcyhwcm9wKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAoYXN5bmMoKSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCByZXQgPSBhd2FpdCBob29rc0Z1bmMuY2FsbChob29rcywgYXJnKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBwcmV2SG9vay5jYWxsKGhvb2tzLCByZXQpO1xuICAgICAgICAgICAgICAgIH0pKCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjb25zdCByZXQgPSBob29rc0Z1bmMuY2FsbChob29rcywgYXJnKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHByZXZIb29rLmNhbGwoaG9va3MsIHJldCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGNhbm5vdCB0eXBlIGhvb2sgZnVuY3Rpb24gZHluYW1pY2FsbHlcbiAgICAgICAgICAgIGhvb2tzW2hvb2tzUHJvcF0gPSAoLi4uYXJnczogdW5rbm93bltdKSA9PiB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLmRlZmF1bHRzLmFzeW5jKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChhc3luYygpID0+IHtcbiAgICAgICAgICAgICAgICAgIGxldCByZXQgPSBhd2FpdCBob29rc0Z1bmMuYXBwbHkoaG9va3MsIGFyZ3MpO1xuICAgICAgICAgICAgICAgICAgaWYgKHJldCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0ID0gYXdhaXQgcHJldkhvb2suYXBwbHkoaG9va3MsIGFyZ3MpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgICAgICAgICB9KSgpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgbGV0IHJldCA9IGhvb2tzRnVuYy5hcHBseShob29rcywgYXJncyk7XG4gICAgICAgICAgICAgIGlmIChyZXQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0ID0gcHJldkhvb2suYXBwbHkoaG9va3MsIGFyZ3MpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBvcHRzLmhvb2tzID0gaG9va3M7XG4gICAgICB9XG5cbiAgICAgIC8vID09LS0gUGFyc2UgV2Fsa1Rva2VucyBleHRlbnNpb25zIC0tPT0gLy9cbiAgICAgIGlmIChwYWNrLndhbGtUb2tlbnMpIHtcbiAgICAgICAgY29uc3Qgd2Fsa1Rva2VucyA9IHRoaXMuZGVmYXVsdHMud2Fsa1Rva2VucztcbiAgICAgICAgY29uc3QgcGFja1dhbGt0b2tlbnMgPSBwYWNrLndhbGtUb2tlbnM7XG4gICAgICAgIG9wdHMud2Fsa1Rva2VucyA9IGZ1bmN0aW9uKHRva2VuKSB7XG4gICAgICAgICAgbGV0IHZhbHVlczogTWF5YmVQcm9taXNlW10gPSBbXTtcbiAgICAgICAgICB2YWx1ZXMucHVzaChwYWNrV2Fsa3Rva2Vucy5jYWxsKHRoaXMsIHRva2VuKSk7XG4gICAgICAgICAgaWYgKHdhbGtUb2tlbnMpIHtcbiAgICAgICAgICAgIHZhbHVlcyA9IHZhbHVlcy5jb25jYXQod2Fsa1Rva2Vucy5jYWxsKHRoaXMsIHRva2VuKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB2YWx1ZXM7XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZGVmYXVsdHMgPSB7IC4uLnRoaXMuZGVmYXVsdHMsIC4uLm9wdHMgfTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0T3B0aW9ucyhvcHQ6IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4pIHtcbiAgICB0aGlzLmRlZmF1bHRzID0geyAuLi50aGlzLmRlZmF1bHRzLCAuLi5vcHQgfTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGxleGVyKHNyYzogc3RyaW5nLCBvcHRpb25zPzogTWFya2VkT3B0aW9uczxQYXJzZXJPdXRwdXQsIFJlbmRlcmVyT3V0cHV0Pikge1xuICAgIHJldHVybiBfTGV4ZXIubGV4KHNyYywgb3B0aW9ucyA/PyB0aGlzLmRlZmF1bHRzKTtcbiAgfVxuXG4gIHBhcnNlcih0b2tlbnM6IFRva2VuW10sIG9wdGlvbnM/OiBNYXJrZWRPcHRpb25zPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+KSB7XG4gICAgcmV0dXJuIF9QYXJzZXIucGFyc2U8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4odG9rZW5zLCBvcHRpb25zID8/IHRoaXMuZGVmYXVsdHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZU1hcmtkb3duKGJsb2NrVHlwZTogYm9vbGVhbikge1xuICAgIHR5cGUgb3ZlcmxvYWRlZFBhcnNlID0ge1xuICAgICAgKHNyYzogc3RyaW5nLCBvcHRpb25zOiBNYXJrZWRPcHRpb25zPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+ICYgeyBhc3luYzogdHJ1ZSB9KTogUHJvbWlzZTxQYXJzZXJPdXRwdXQ+O1xuICAgICAgKHNyYzogc3RyaW5nLCBvcHRpb25zOiBNYXJrZWRPcHRpb25zPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+ICYgeyBhc3luYzogZmFsc2UgfSk6IFBhcnNlck91dHB1dDtcbiAgICAgIChzcmM6IHN0cmluZywgb3B0aW9ucz86IE1hcmtlZE9wdGlvbnM8UGFyc2VyT3V0cHV0LCBSZW5kZXJlck91dHB1dD4gfCBudWxsKTogUGFyc2VyT3V0cHV0IHwgUHJvbWlzZTxQYXJzZXJPdXRwdXQ+O1xuICAgIH07XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IHBhcnNlOiBvdmVybG9hZGVkUGFyc2UgPSAoc3JjOiBzdHJpbmcsIG9wdGlvbnM/OiBNYXJrZWRPcHRpb25zPFBhcnNlck91dHB1dCwgUmVuZGVyZXJPdXRwdXQ+IHwgbnVsbCk6IGFueSA9PiB7XG4gICAgICBjb25zdCBvcmlnT3B0ID0geyAuLi5vcHRpb25zIH07XG4gICAgICBjb25zdCBvcHQgPSB7IC4uLnRoaXMuZGVmYXVsdHMsIC4uLm9yaWdPcHQgfTtcblxuICAgICAgY29uc3QgdGhyb3dFcnJvciA9IHRoaXMub25FcnJvcighIW9wdC5zaWxlbnQsICEhb3B0LmFzeW5jKTtcblxuICAgICAgLy8gdGhyb3cgZXJyb3IgaWYgYW4gZXh0ZW5zaW9uIHNldCBhc3luYyB0byB0cnVlIGJ1dCBwYXJzZSB3YXMgY2FsbGVkIHdpdGggYXN5bmM6IGZhbHNlXG4gICAgICBpZiAodGhpcy5kZWZhdWx0cy5hc3luYyA9PT0gdHJ1ZSAmJiBvcmlnT3B0LmFzeW5jID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihuZXcgRXJyb3IoJ21hcmtlZCgpOiBUaGUgYXN5bmMgb3B0aW9uIHdhcyBzZXQgdG8gdHJ1ZSBieSBhbiBleHRlbnNpb24uIFJlbW92ZSBhc3luYzogZmFsc2UgZnJvbSB0aGUgcGFyc2Ugb3B0aW9ucyBvYmplY3QgdG8gcmV0dXJuIGEgUHJvbWlzZS4nKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIHRocm93IGVycm9yIGluIGNhc2Ugb2Ygbm9uIHN0cmluZyBpbnB1dFxuICAgICAgaWYgKHR5cGVvZiBzcmMgPT09ICd1bmRlZmluZWQnIHx8IHNyYyA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihuZXcgRXJyb3IoJ21hcmtlZCgpOiBpbnB1dCBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkIG9yIG51bGwnKSk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHNyYyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IobmV3IEVycm9yKCdtYXJrZWQoKTogaW5wdXQgcGFyYW1ldGVyIGlzIG9mIHR5cGUgJ1xuICAgICAgICAgICsgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHNyYykgKyAnLCBzdHJpbmcgZXhwZWN0ZWQnKSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHQuaG9va3MpIHtcbiAgICAgICAgb3B0Lmhvb2tzLm9wdGlvbnMgPSBvcHQ7XG4gICAgICAgIG9wdC5ob29rcy5ibG9jayA9IGJsb2NrVHlwZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdC5hc3luYykge1xuICAgICAgICByZXR1cm4gKGFzeW5jKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHByb2Nlc3NlZFNyYyA9IG9wdC5ob29rcyA/IGF3YWl0IG9wdC5ob29rcy5wcmVwcm9jZXNzKHNyYykgOiBzcmM7XG4gICAgICAgICAgY29uc3QgbGV4ZXIgPSBvcHQuaG9va3MgPyBhd2FpdCBvcHQuaG9va3MucHJvdmlkZUxleGVyKCkgOiAoYmxvY2tUeXBlID8gX0xleGVyLmxleCA6IF9MZXhlci5sZXhJbmxpbmUpO1xuICAgICAgICAgIGNvbnN0IHRva2VucyA9IGF3YWl0IGxleGVyKHByb2Nlc3NlZFNyYywgb3B0KTtcbiAgICAgICAgICBjb25zdCBwcm9jZXNzZWRUb2tlbnMgPSBvcHQuaG9va3MgPyBhd2FpdCBvcHQuaG9va3MucHJvY2Vzc0FsbFRva2Vucyh0b2tlbnMpIDogdG9rZW5zO1xuICAgICAgICAgIGlmIChvcHQud2Fsa1Rva2Vucykge1xuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwodGhpcy53YWxrVG9rZW5zKHByb2Nlc3NlZFRva2Vucywgb3B0LndhbGtUb2tlbnMpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcGFyc2VyID0gb3B0Lmhvb2tzID8gYXdhaXQgb3B0Lmhvb2tzLnByb3ZpZGVQYXJzZXIoKSA6IChibG9ja1R5cGUgPyBfUGFyc2VyLnBhcnNlIDogX1BhcnNlci5wYXJzZUlubGluZSk7XG4gICAgICAgICAgY29uc3QgaHRtbCA9IGF3YWl0IHBhcnNlcihwcm9jZXNzZWRUb2tlbnMsIG9wdCk7XG4gICAgICAgICAgcmV0dXJuIG9wdC5ob29rcyA/IGF3YWl0IG9wdC5ob29rcy5wb3N0cHJvY2VzcyhodG1sKSA6IGh0bWw7XG4gICAgICAgIH0pKCkuY2F0Y2godGhyb3dFcnJvcik7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChvcHQuaG9va3MpIHtcbiAgICAgICAgICBzcmMgPSBvcHQuaG9va3MucHJlcHJvY2VzcyhzcmMpIGFzIHN0cmluZztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsZXhlciA9IG9wdC5ob29rcyA/IG9wdC5ob29rcy5wcm92aWRlTGV4ZXIoKSA6IChibG9ja1R5cGUgPyBfTGV4ZXIubGV4IDogX0xleGVyLmxleElubGluZSk7XG4gICAgICAgIGxldCB0b2tlbnMgPSBsZXhlcihzcmMsIG9wdCk7XG4gICAgICAgIGlmIChvcHQuaG9va3MpIHtcbiAgICAgICAgICB0b2tlbnMgPSBvcHQuaG9va3MucHJvY2Vzc0FsbFRva2Vucyh0b2tlbnMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHQud2Fsa1Rva2Vucykge1xuICAgICAgICAgIHRoaXMud2Fsa1Rva2Vucyh0b2tlbnMsIG9wdC53YWxrVG9rZW5zKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJzZXIgPSBvcHQuaG9va3MgPyBvcHQuaG9va3MucHJvdmlkZVBhcnNlcigpIDogKGJsb2NrVHlwZSA/IF9QYXJzZXIucGFyc2UgOiBfUGFyc2VyLnBhcnNlSW5saW5lKTtcbiAgICAgICAgbGV0IGh0bWwgPSBwYXJzZXIodG9rZW5zLCBvcHQpO1xuICAgICAgICBpZiAob3B0Lmhvb2tzKSB7XG4gICAgICAgICAgaHRtbCA9IG9wdC5ob29rcy5wb3N0cHJvY2VzcyhodG1sKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaHRtbDtcbiAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihlIGFzIEVycm9yKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIHBhcnNlO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkVycm9yKHNpbGVudDogYm9vbGVhbiwgYXN5bmM6IGJvb2xlYW4pIHtcbiAgICByZXR1cm4gKGU6IEVycm9yKTogc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgICAgIGUubWVzc2FnZSArPSAnXFxuUGxlYXNlIHJlcG9ydCB0aGlzIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJrZWRqcy9tYXJrZWQuJztcblxuICAgICAgaWYgKHNpbGVudCkge1xuICAgICAgICBjb25zdCBtc2cgPSAnPHA+QW4gZXJyb3Igb2NjdXJyZWQ6PC9wPjxwcmU+J1xuICAgICAgICAgICsgZXNjYXBlSHRtbEVudGl0aWVzKGUubWVzc2FnZSArICcnLCB0cnVlKVxuICAgICAgICAgICsgJzwvcHJlPic7XG4gICAgICAgIGlmIChhc3luYykge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobXNnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbXNnO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXN5bmMpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgX0xleGVyIH0gZnJvbSAnLi9MZXhlci50cyc7XG5pbXBvcnQgeyBfUGFyc2VyIH0gZnJvbSAnLi9QYXJzZXIudHMnO1xuaW1wb3J0IHsgX1Rva2VuaXplciB9IGZyb20gJy4vVG9rZW5pemVyLnRzJztcbmltcG9ydCB7IF9SZW5kZXJlciB9IGZyb20gJy4vUmVuZGVyZXIudHMnO1xuaW1wb3J0IHsgX1RleHRSZW5kZXJlciB9IGZyb20gJy4vVGV4dFJlbmRlcmVyLnRzJztcbmltcG9ydCB7IF9Ib29rcyB9IGZyb20gJy4vSG9va3MudHMnO1xuaW1wb3J0IHsgTWFya2VkIH0gZnJvbSAnLi9JbnN0YW5jZS50cyc7XG5pbXBvcnQge1xuICBfZ2V0RGVmYXVsdHMsXG4gIGNoYW5nZURlZmF1bHRzLFxuICBfZGVmYXVsdHMsXG59IGZyb20gJy4vZGVmYXVsdHMudHMnO1xuaW1wb3J0IHR5cGUgeyBNYXJrZWRFeHRlbnNpb24sIE1hcmtlZE9wdGlvbnMgfSBmcm9tICcuL01hcmtlZE9wdGlvbnMudHMnO1xuaW1wb3J0IHR5cGUgeyBUb2tlbiwgVG9rZW5zTGlzdCB9IGZyb20gJy4vVG9rZW5zLnRzJztcbmltcG9ydCB0eXBlIHsgTWF5YmVQcm9taXNlIH0gZnJvbSAnLi9JbnN0YW5jZS50cyc7XG5cbmNvbnN0IG1hcmtlZEluc3RhbmNlID0gbmV3IE1hcmtlZCgpO1xuXG4vKipcbiAqIENvbXBpbGVzIG1hcmtkb3duIHRvIEhUTUwgYXN5bmNocm9ub3VzbHkuXG4gKlxuICogQHBhcmFtIHNyYyBTdHJpbmcgb2YgbWFya2Rvd24gc291cmNlIHRvIGJlIGNvbXBpbGVkXG4gKiBAcGFyYW0gb3B0aW9ucyBIYXNoIG9mIG9wdGlvbnMsIGhhdmluZyBhc3luYzogdHJ1ZVxuICogQHJldHVybiBQcm9taXNlIG9mIHN0cmluZyBvZiBjb21waWxlZCBIVE1MXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXJrZWQoc3JjOiBzdHJpbmcsIG9wdGlvbnM6IE1hcmtlZE9wdGlvbnMgJiB7IGFzeW5jOiB0cnVlIH0pOiBQcm9taXNlPHN0cmluZz47XG5cbi8qKlxuICogQ29tcGlsZXMgbWFya2Rvd24gdG8gSFRNTC5cbiAqXG4gKiBAcGFyYW0gc3JjIFN0cmluZyBvZiBtYXJrZG93biBzb3VyY2UgdG8gYmUgY29tcGlsZWRcbiAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbmFsIGhhc2ggb2Ygb3B0aW9uc1xuICogQHJldHVybiBTdHJpbmcgb2YgY29tcGlsZWQgSFRNTC4gV2lsbCBiZSBhIFByb21pc2Ugb2Ygc3RyaW5nIGlmIGFzeW5jIGlzIHNldCB0byB0cnVlIGJ5IGFueSBleHRlbnNpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFya2VkKHNyYzogc3RyaW5nLCBvcHRpb25zOiBNYXJrZWRPcHRpb25zICYgeyBhc3luYzogZmFsc2UgfSk6IHN0cmluZztcbmV4cG9ydCBmdW5jdGlvbiBtYXJrZWQoc3JjOiBzdHJpbmcsIG9wdGlvbnM6IE1hcmtlZE9wdGlvbnMgJiB7IGFzeW5jOiB0cnVlIH0pOiBQcm9taXNlPHN0cmluZz47XG5leHBvcnQgZnVuY3Rpb24gbWFya2VkKHNyYzogc3RyaW5nLCBvcHRpb25zPzogTWFya2VkT3B0aW9ucyB8IG51bGwpOiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz47XG5leHBvcnQgZnVuY3Rpb24gbWFya2VkKHNyYzogc3RyaW5nLCBvcHQ/OiBNYXJrZWRPcHRpb25zIHwgbnVsbCk6IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPiB7XG4gIHJldHVybiBtYXJrZWRJbnN0YW5jZS5wYXJzZShzcmMsIG9wdCk7XG59XG5cbi8qKlxuICogU2V0cyB0aGUgZGVmYXVsdCBvcHRpb25zLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIEhhc2ggb2Ygb3B0aW9uc1xuICovXG5tYXJrZWQub3B0aW9ucyA9XG4gIG1hcmtlZC5zZXRPcHRpb25zID0gZnVuY3Rpb24ob3B0aW9uczogTWFya2VkT3B0aW9ucykge1xuICAgIG1hcmtlZEluc3RhbmNlLnNldE9wdGlvbnMob3B0aW9ucyk7XG4gICAgbWFya2VkLmRlZmF1bHRzID0gbWFya2VkSW5zdGFuY2UuZGVmYXVsdHM7XG4gICAgY2hhbmdlRGVmYXVsdHMobWFya2VkLmRlZmF1bHRzKTtcbiAgICByZXR1cm4gbWFya2VkO1xuICB9O1xuXG4vKipcbiAqIEdldHMgdGhlIG9yaWdpbmFsIG1hcmtlZCBkZWZhdWx0IG9wdGlvbnMuXG4gKi9cbm1hcmtlZC5nZXREZWZhdWx0cyA9IF9nZXREZWZhdWx0cztcblxubWFya2VkLmRlZmF1bHRzID0gX2RlZmF1bHRzO1xuXG4vKipcbiAqIFVzZSBFeHRlbnNpb25cbiAqL1xuXG5tYXJrZWQudXNlID0gZnVuY3Rpb24oLi4uYXJnczogTWFya2VkRXh0ZW5zaW9uW10pIHtcbiAgbWFya2VkSW5zdGFuY2UudXNlKC4uLmFyZ3MpO1xuICBtYXJrZWQuZGVmYXVsdHMgPSBtYXJrZWRJbnN0YW5jZS5kZWZhdWx0cztcbiAgY2hhbmdlRGVmYXVsdHMobWFya2VkLmRlZmF1bHRzKTtcbiAgcmV0dXJuIG1hcmtlZDtcbn07XG5cbi8qKlxuICogUnVuIGNhbGxiYWNrIGZvciBldmVyeSB0b2tlblxuICovXG5cbm1hcmtlZC53YWxrVG9rZW5zID0gZnVuY3Rpb24odG9rZW5zOiBUb2tlbltdIHwgVG9rZW5zTGlzdCwgY2FsbGJhY2s6ICh0b2tlbjogVG9rZW4pID0+IE1heWJlUHJvbWlzZSB8IE1heWJlUHJvbWlzZVtdKSB7XG4gIHJldHVybiBtYXJrZWRJbnN0YW5jZS53YWxrVG9rZW5zKHRva2VucywgY2FsbGJhY2spO1xufTtcblxuLyoqXG4gKiBDb21waWxlcyBtYXJrZG93biB0byBIVE1MIHdpdGhvdXQgZW5jbG9zaW5nIGBwYCB0YWcuXG4gKlxuICogQHBhcmFtIHNyYyBTdHJpbmcgb2YgbWFya2Rvd24gc291cmNlIHRvIGJlIGNvbXBpbGVkXG4gKiBAcGFyYW0gb3B0aW9ucyBIYXNoIG9mIG9wdGlvbnNcbiAqIEByZXR1cm4gU3RyaW5nIG9mIGNvbXBpbGVkIEhUTUxcbiAqL1xubWFya2VkLnBhcnNlSW5saW5lID0gbWFya2VkSW5zdGFuY2UucGFyc2VJbmxpbmU7XG5cbi8qKlxuICogRXhwb3NlXG4gKi9cbm1hcmtlZC5QYXJzZXIgPSBfUGFyc2VyO1xubWFya2VkLnBhcnNlciA9IF9QYXJzZXIucGFyc2U7XG5tYXJrZWQuUmVuZGVyZXIgPSBfUmVuZGVyZXI7XG5tYXJrZWQuVGV4dFJlbmRlcmVyID0gX1RleHRSZW5kZXJlcjtcbm1hcmtlZC5MZXhlciA9IF9MZXhlcjtcbm1hcmtlZC5sZXhlciA9IF9MZXhlci5sZXg7XG5tYXJrZWQuVG9rZW5pemVyID0gX1Rva2VuaXplcjtcbm1hcmtlZC5Ib29rcyA9IF9Ib29rcztcbm1hcmtlZC5wYXJzZSA9IG1hcmtlZDtcblxuZXhwb3J0IGNvbnN0IG9wdGlvbnMgPSBtYXJrZWQub3B0aW9ucztcbmV4cG9ydCBjb25zdCBzZXRPcHRpb25zID0gbWFya2VkLnNldE9wdGlvbnM7XG5leHBvcnQgY29uc3QgdXNlID0gbWFya2VkLnVzZTtcbmV4cG9ydCBjb25zdCB3YWxrVG9rZW5zID0gbWFya2VkLndhbGtUb2tlbnM7XG5leHBvcnQgY29uc3QgcGFyc2VJbmxpbmUgPSBtYXJrZWQucGFyc2VJbmxpbmU7XG5leHBvcnQgY29uc3QgcGFyc2UgPSBtYXJrZWQ7XG5leHBvcnQgY29uc3QgcGFyc2VyID0gX1BhcnNlci5wYXJzZTtcbmV4cG9ydCBjb25zdCBsZXhlciA9IF9MZXhlci5sZXg7XG5leHBvcnQgeyBfZGVmYXVsdHMgYXMgZGVmYXVsdHMsIF9nZXREZWZhdWx0cyBhcyBnZXREZWZhdWx0cyB9IGZyb20gJy4vZGVmYXVsdHMudHMnO1xuZXhwb3J0IHsgX0xleGVyIGFzIExleGVyIH0gZnJvbSAnLi9MZXhlci50cyc7XG5leHBvcnQgeyBfUGFyc2VyIGFzIFBhcnNlciB9IGZyb20gJy4vUGFyc2VyLnRzJztcbmV4cG9ydCB7IF9Ub2tlbml6ZXIgYXMgVG9rZW5pemVyIH0gZnJvbSAnLi9Ub2tlbml6ZXIudHMnO1xuZXhwb3J0IHsgX1JlbmRlcmVyIGFzIFJlbmRlcmVyIH0gZnJvbSAnLi9SZW5kZXJlci50cyc7XG5leHBvcnQgeyBfVGV4dFJlbmRlcmVyIGFzIFRleHRSZW5kZXJlciB9IGZyb20gJy4vVGV4dFJlbmRlcmVyLnRzJztcbmV4cG9ydCB7IF9Ib29rcyBhcyBIb29rcyB9IGZyb20gJy4vSG9va3MudHMnO1xuZXhwb3J0IHsgTWFya2VkIH0gZnJvbSAnLi9JbnN0YW5jZS50cyc7XG5leHBvcnQgdHlwZSAqIGZyb20gJy4vTWFya2VkT3B0aW9ucy50cyc7XG5leHBvcnQgdHlwZSAqIGZyb20gJy4vVG9rZW5zLnRzJztcbiIsICJjb25zdCB7XG4gIGVudHJpZXMsXG4gIHNldFByb3RvdHlwZU9mLFxuICBpc0Zyb3plbixcbiAgZ2V0UHJvdG90eXBlT2YsXG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcixcbn0gPSBPYmplY3Q7XG5cbmxldCB7IGZyZWV6ZSwgc2VhbCwgY3JlYXRlIH0gPSBPYmplY3Q7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgaW1wb3J0L25vLW11dGFibGUtZXhwb3J0c1xubGV0IHsgYXBwbHksIGNvbnN0cnVjdCB9ID0gdHlwZW9mIFJlZmxlY3QgIT09ICd1bmRlZmluZWQnICYmIFJlZmxlY3Q7XG5cbmlmICghZnJlZXplKSB7XG4gIGZyZWV6ZSA9IGZ1bmN0aW9uIDxUPih4OiBUKTogVCB7XG4gICAgcmV0dXJuIHg7XG4gIH07XG59XG5cbmlmICghc2VhbCkge1xuICBzZWFsID0gZnVuY3Rpb24gPFQ+KHg6IFQpOiBUIHtcbiAgICByZXR1cm4geDtcbiAgfTtcbn1cblxuaWYgKCFhcHBseSkge1xuICBhcHBseSA9IGZ1bmN0aW9uIDxUPihcbiAgICBmdW5jOiAodGhpc0FyZzogYW55LCAuLi5hcmdzOiBhbnlbXSkgPT4gVCxcbiAgICB0aGlzQXJnOiBhbnksXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogVCB7XG4gICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyk7XG4gIH07XG59XG5cbmlmICghY29uc3RydWN0KSB7XG4gIGNvbnN0cnVjdCA9IGZ1bmN0aW9uIDxUPihGdW5jOiBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBULCAuLi5hcmdzOiBhbnlbXSk6IFQge1xuICAgIHJldHVybiBuZXcgRnVuYyguLi5hcmdzKTtcbiAgfTtcbn1cblxuY29uc3QgYXJyYXlGb3JFYWNoID0gdW5hcHBseShBcnJheS5wcm90b3R5cGUuZm9yRWFjaCk7XG5jb25zdCBhcnJheUluZGV4T2YgPSB1bmFwcGx5KEFycmF5LnByb3RvdHlwZS5pbmRleE9mKTtcbmNvbnN0IGFycmF5TGFzdEluZGV4T2YgPSB1bmFwcGx5KEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZik7XG5jb25zdCBhcnJheVBvcCA9IHVuYXBwbHkoQXJyYXkucHJvdG90eXBlLnBvcCk7XG5jb25zdCBhcnJheVB1c2ggPSB1bmFwcGx5KEFycmF5LnByb3RvdHlwZS5wdXNoKTtcbmNvbnN0IGFycmF5U2xpY2UgPSB1bmFwcGx5KEFycmF5LnByb3RvdHlwZS5zbGljZSk7XG5jb25zdCBhcnJheVNwbGljZSA9IHVuYXBwbHkoQXJyYXkucHJvdG90eXBlLnNwbGljZSk7XG5cbmNvbnN0IHN0cmluZ1RvTG93ZXJDYXNlID0gdW5hcHBseShTdHJpbmcucHJvdG90eXBlLnRvTG93ZXJDYXNlKTtcbmNvbnN0IHN0cmluZ1RvU3RyaW5nID0gdW5hcHBseShTdHJpbmcucHJvdG90eXBlLnRvU3RyaW5nKTtcbmNvbnN0IHN0cmluZ01hdGNoID0gdW5hcHBseShTdHJpbmcucHJvdG90eXBlLm1hdGNoKTtcbmNvbnN0IHN0cmluZ1JlcGxhY2UgPSB1bmFwcGx5KFN0cmluZy5wcm90b3R5cGUucmVwbGFjZSk7XG5jb25zdCBzdHJpbmdJbmRleE9mID0gdW5hcHBseShTdHJpbmcucHJvdG90eXBlLmluZGV4T2YpO1xuY29uc3Qgc3RyaW5nVHJpbSA9IHVuYXBwbHkoU3RyaW5nLnByb3RvdHlwZS50cmltKTtcblxuY29uc3Qgb2JqZWN0SGFzT3duUHJvcGVydHkgPSB1bmFwcGx5KE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkpO1xuXG5jb25zdCByZWdFeHBUZXN0ID0gdW5hcHBseShSZWdFeHAucHJvdG90eXBlLnRlc3QpO1xuXG5jb25zdCB0eXBlRXJyb3JDcmVhdGUgPSB1bmNvbnN0cnVjdChUeXBlRXJyb3IpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgZnVuY3Rpb24gdGhhdCBjYWxscyB0aGUgZ2l2ZW4gZnVuY3Rpb24gd2l0aCBhIHNwZWNpZmllZCB0aGlzQXJnIGFuZCBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIGZ1bmMgLSBUaGUgZnVuY3Rpb24gdG8gYmUgd3JhcHBlZCBhbmQgY2FsbGVkLlxuICogQHJldHVybnMgQSBuZXcgZnVuY3Rpb24gdGhhdCBjYWxscyB0aGUgZ2l2ZW4gZnVuY3Rpb24gd2l0aCBhIHNwZWNpZmllZCB0aGlzQXJnIGFuZCBhcmd1bWVudHMuXG4gKi9cbmZ1bmN0aW9uIHVuYXBwbHk8VD4oXG4gIGZ1bmM6ICh0aGlzQXJnOiBhbnksIC4uLmFyZ3M6IGFueVtdKSA9PiBUXG4pOiAodGhpc0FyZzogYW55LCAuLi5hcmdzOiBhbnlbXSkgPT4gVCB7XG4gIHJldHVybiAodGhpc0FyZzogYW55LCAuLi5hcmdzOiBhbnlbXSk6IFQgPT4ge1xuICAgIGlmICh0aGlzQXJnIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICB0aGlzQXJnLmxhc3RJbmRleCA9IDA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFwcGx5KGZ1bmMsIHRoaXNBcmcsIGFyZ3MpO1xuICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgZnVuY3Rpb24gdGhhdCBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIG9mIHRoZSBnaXZlbiBjb25zdHJ1Y3RvciBmdW5jdGlvbiB3aXRoIHRoZSBwcm92aWRlZCBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIGZ1bmMgLSBUaGUgY29uc3RydWN0b3IgZnVuY3Rpb24gdG8gYmUgd3JhcHBlZCBhbmQgY2FsbGVkLlxuICogQHJldHVybnMgQSBuZXcgZnVuY3Rpb24gdGhhdCBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIG9mIHRoZSBnaXZlbiBjb25zdHJ1Y3RvciBmdW5jdGlvbiB3aXRoIHRoZSBwcm92aWRlZCBhcmd1bWVudHMuXG4gKi9cbmZ1bmN0aW9uIHVuY29uc3RydWN0PFQ+KFxuICBGdW5jOiBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUXG4pOiAoLi4uYXJnczogYW55W10pID0+IFQge1xuICByZXR1cm4gKC4uLmFyZ3M6IGFueVtdKTogVCA9PiBjb25zdHJ1Y3QoRnVuYywgYXJncyk7XG59XG5cbi8qKlxuICogQWRkIHByb3BlcnRpZXMgdG8gYSBsb29rdXAgdGFibGVcbiAqXG4gKiBAcGFyYW0gc2V0IC0gVGhlIHNldCB0byB3aGljaCBlbGVtZW50cyB3aWxsIGJlIGFkZGVkLlxuICogQHBhcmFtIGFycmF5IC0gVGhlIGFycmF5IGNvbnRhaW5pbmcgZWxlbWVudHMgdG8gYmUgYWRkZWQgdG8gdGhlIHNldC5cbiAqIEBwYXJhbSB0cmFuc2Zvcm1DYXNlRnVuYyAtIEFuIG9wdGlvbmFsIGZ1bmN0aW9uIHRvIHRyYW5zZm9ybSB0aGUgY2FzZSBvZiBlYWNoIGVsZW1lbnQgYmVmb3JlIGFkZGluZyB0byB0aGUgc2V0LlxuICogQHJldHVybnMgVGhlIG1vZGlmaWVkIHNldCB3aXRoIGFkZGVkIGVsZW1lbnRzLlxuICovXG5mdW5jdGlvbiBhZGRUb1NldChcbiAgc2V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBhcnJheTogcmVhZG9ubHkgYW55W10sXG4gIHRyYW5zZm9ybUNhc2VGdW5jOiBSZXR1cm5UeXBlPHR5cGVvZiB1bmFwcGx5PHN0cmluZz4+ID0gc3RyaW5nVG9Mb3dlckNhc2Vcbik6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICBpZiAoc2V0UHJvdG90eXBlT2YpIHtcbiAgICAvLyBNYWtlICdpbicgYW5kIHRydXRoeSBjaGVja3MgbGlrZSBCb29sZWFuKHNldC5jb25zdHJ1Y3RvcilcbiAgICAvLyBpbmRlcGVuZGVudCBvZiBhbnkgcHJvcGVydGllcyBkZWZpbmVkIG9uIE9iamVjdC5wcm90b3R5cGUuXG4gICAgLy8gUHJldmVudCBwcm90b3R5cGUgc2V0dGVycyBmcm9tIGludGVyY2VwdGluZyBzZXQgYXMgYSB0aGlzIHZhbHVlLlxuICAgIHNldFByb3RvdHlwZU9mKHNldCwgbnVsbCk7XG4gIH1cblxuICBsZXQgbCA9IGFycmF5Lmxlbmd0aDtcbiAgd2hpbGUgKGwtLSkge1xuICAgIGxldCBlbGVtZW50ID0gYXJyYXlbbF07XG4gICAgaWYgKHR5cGVvZiBlbGVtZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgbGNFbGVtZW50ID0gdHJhbnNmb3JtQ2FzZUZ1bmMoZWxlbWVudCk7XG4gICAgICBpZiAobGNFbGVtZW50ICE9PSBlbGVtZW50KSB7XG4gICAgICAgIC8vIENvbmZpZyBwcmVzZXRzIChlLmcuIHRhZ3MuanMsIGF0dHJzLmpzKSBhcmUgaW1tdXRhYmxlLlxuICAgICAgICBpZiAoIWlzRnJvemVuKGFycmF5KSkge1xuICAgICAgICAgIChhcnJheSBhcyBhbnlbXSlbbF0gPSBsY0VsZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBlbGVtZW50ID0gbGNFbGVtZW50O1xuICAgICAgfVxuICAgIH1cblxuICAgIHNldFtlbGVtZW50XSA9IHRydWU7XG4gIH1cblxuICByZXR1cm4gc2V0O1xufVxuXG4vKipcbiAqIENsZWFuIHVwIGFuIGFycmF5IHRvIGhhcmRlbiBhZ2FpbnN0IENTUFBcbiAqXG4gKiBAcGFyYW0gYXJyYXkgLSBUaGUgYXJyYXkgdG8gYmUgY2xlYW5lZC5cbiAqIEByZXR1cm5zIFRoZSBjbGVhbmVkIHZlcnNpb24gb2YgdGhlIGFycmF5XG4gKi9cbmZ1bmN0aW9uIGNsZWFuQXJyYXk8VD4oYXJyYXk6IFRbXSk6IEFycmF5PFQgfCBudWxsPiB7XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBhcnJheS5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBpc1Byb3BlcnR5RXhpc3QgPSBvYmplY3RIYXNPd25Qcm9wZXJ0eShhcnJheSwgaW5kZXgpO1xuXG4gICAgaWYgKCFpc1Byb3BlcnR5RXhpc3QpIHtcbiAgICAgIGFycmF5W2luZGV4XSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFycmF5O1xufVxuXG4vKipcbiAqIFNoYWxsb3cgY2xvbmUgYW4gb2JqZWN0XG4gKlxuICogQHBhcmFtIG9iamVjdCAtIFRoZSBvYmplY3QgdG8gYmUgY2xvbmVkLlxuICogQHJldHVybnMgQSBuZXcgb2JqZWN0IHRoYXQgY29waWVzIHRoZSBvcmlnaW5hbC5cbiAqL1xuZnVuY3Rpb24gY2xvbmU8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+KG9iamVjdDogVCk6IFQge1xuICBjb25zdCBuZXdPYmplY3QgPSBjcmVhdGUobnVsbCk7XG5cbiAgZm9yIChjb25zdCBbcHJvcGVydHksIHZhbHVlXSBvZiBlbnRyaWVzKG9iamVjdCkpIHtcbiAgICBjb25zdCBpc1Byb3BlcnR5RXhpc3QgPSBvYmplY3RIYXNPd25Qcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5KTtcblxuICAgIGlmIChpc1Byb3BlcnR5RXhpc3QpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBuZXdPYmplY3RbcHJvcGVydHldID0gY2xlYW5BcnJheSh2YWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICB2YWx1ZSAmJlxuICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgICAgIHZhbHVlLmNvbnN0cnVjdG9yID09PSBPYmplY3RcbiAgICAgICkge1xuICAgICAgICBuZXdPYmplY3RbcHJvcGVydHldID0gY2xvbmUodmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3T2JqZWN0W3Byb3BlcnR5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXdPYmplY3Q7XG59XG5cbi8qKlxuICogVGhpcyBtZXRob2QgYXV0b21hdGljYWxseSBjaGVja3MgaWYgdGhlIHByb3AgaXMgZnVuY3Rpb24gb3IgZ2V0dGVyIGFuZCBiZWhhdmVzIGFjY29yZGluZ2x5LlxuICpcbiAqIEBwYXJhbSBvYmplY3QgLSBUaGUgb2JqZWN0IHRvIGxvb2sgdXAgdGhlIGdldHRlciBmdW5jdGlvbiBpbiBpdHMgcHJvdG90eXBlIGNoYWluLlxuICogQHBhcmFtIHByb3AgLSBUaGUgcHJvcGVydHkgbmFtZSBmb3Igd2hpY2ggdG8gZmluZCB0aGUgZ2V0dGVyIGZ1bmN0aW9uLlxuICogQHJldHVybnMgVGhlIGdldHRlciBmdW5jdGlvbiBmb3VuZCBpbiB0aGUgcHJvdG90eXBlIGNoYWluIG9yIGEgZmFsbGJhY2sgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGxvb2t1cEdldHRlcjxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4oXG4gIG9iamVjdDogVCxcbiAgcHJvcDogc3RyaW5nXG4pOiBSZXR1cm5UeXBlPHR5cGVvZiB1bmFwcGx5PGFueT4+IHwgKCgpID0+IG51bGwpIHtcbiAgd2hpbGUgKG9iamVjdCAhPT0gbnVsbCkge1xuICAgIGNvbnN0IGRlc2MgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wKTtcblxuICAgIGlmIChkZXNjKSB7XG4gICAgICBpZiAoZGVzYy5nZXQpIHtcbiAgICAgICAgcmV0dXJuIHVuYXBwbHkoZGVzYy5nZXQpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGRlc2MudmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIHVuYXBwbHkoZGVzYy52YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgb2JqZWN0ID0gZ2V0UHJvdG90eXBlT2Yob2JqZWN0KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZhbGxiYWNrVmFsdWUoKTogbnVsbCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gZmFsbGJhY2tWYWx1ZTtcbn1cblxuZXhwb3J0IHtcbiAgLy8gQXJyYXlcbiAgYXJyYXlGb3JFYWNoLFxuICBhcnJheUluZGV4T2YsXG4gIGFycmF5TGFzdEluZGV4T2YsXG4gIGFycmF5UG9wLFxuICBhcnJheVB1c2gsXG4gIGFycmF5U2xpY2UsXG4gIGFycmF5U3BsaWNlLFxuICAvLyBPYmplY3RcbiAgZW50cmllcyxcbiAgZnJlZXplLFxuICBnZXRQcm90b3R5cGVPZixcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxuICBpc0Zyb3plbixcbiAgc2V0UHJvdG90eXBlT2YsXG4gIHNlYWwsXG4gIGNsb25lLFxuICBjcmVhdGUsXG4gIG9iamVjdEhhc093blByb3BlcnR5LFxuICAvLyBSZWdFeHBcbiAgcmVnRXhwVGVzdCxcbiAgLy8gU3RyaW5nXG4gIHN0cmluZ0luZGV4T2YsXG4gIHN0cmluZ01hdGNoLFxuICBzdHJpbmdSZXBsYWNlLFxuICBzdHJpbmdUb0xvd2VyQ2FzZSxcbiAgc3RyaW5nVG9TdHJpbmcsXG4gIHN0cmluZ1RyaW0sXG4gIC8vIEVycm9yc1xuICB0eXBlRXJyb3JDcmVhdGUsXG4gIC8vIE90aGVyXG4gIGxvb2t1cEdldHRlcixcbiAgYWRkVG9TZXQsXG4gIC8vIFJlZmxlY3RcbiAgdW5hcHBseSxcbiAgdW5jb25zdHJ1Y3QsXG59O1xuIiwgImltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4vdXRpbHMuanMnO1xuXG5leHBvcnQgY29uc3QgaHRtbCA9IGZyZWV6ZShbXG4gICdhJyxcbiAgJ2FiYnInLFxuICAnYWNyb255bScsXG4gICdhZGRyZXNzJyxcbiAgJ2FyZWEnLFxuICAnYXJ0aWNsZScsXG4gICdhc2lkZScsXG4gICdhdWRpbycsXG4gICdiJyxcbiAgJ2JkaScsXG4gICdiZG8nLFxuICAnYmlnJyxcbiAgJ2JsaW5rJyxcbiAgJ2Jsb2NrcXVvdGUnLFxuICAnYm9keScsXG4gICdicicsXG4gICdidXR0b24nLFxuICAnY2FudmFzJyxcbiAgJ2NhcHRpb24nLFxuICAnY2VudGVyJyxcbiAgJ2NpdGUnLFxuICAnY29kZScsXG4gICdjb2wnLFxuICAnY29sZ3JvdXAnLFxuICAnY29udGVudCcsXG4gICdkYXRhJyxcbiAgJ2RhdGFsaXN0JyxcbiAgJ2RkJyxcbiAgJ2RlY29yYXRvcicsXG4gICdkZWwnLFxuICAnZGV0YWlscycsXG4gICdkZm4nLFxuICAnZGlhbG9nJyxcbiAgJ2RpcicsXG4gICdkaXYnLFxuICAnZGwnLFxuICAnZHQnLFxuICAnZWxlbWVudCcsXG4gICdlbScsXG4gICdmaWVsZHNldCcsXG4gICdmaWdjYXB0aW9uJyxcbiAgJ2ZpZ3VyZScsXG4gICdmb250JyxcbiAgJ2Zvb3RlcicsXG4gICdmb3JtJyxcbiAgJ2gxJyxcbiAgJ2gyJyxcbiAgJ2gzJyxcbiAgJ2g0JyxcbiAgJ2g1JyxcbiAgJ2g2JyxcbiAgJ2hlYWQnLFxuICAnaGVhZGVyJyxcbiAgJ2hncm91cCcsXG4gICdocicsXG4gICdodG1sJyxcbiAgJ2knLFxuICAnaW1nJyxcbiAgJ2lucHV0JyxcbiAgJ2lucycsXG4gICdrYmQnLFxuICAnbGFiZWwnLFxuICAnbGVnZW5kJyxcbiAgJ2xpJyxcbiAgJ21haW4nLFxuICAnbWFwJyxcbiAgJ21hcmsnLFxuICAnbWFycXVlZScsXG4gICdtZW51JyxcbiAgJ21lbnVpdGVtJyxcbiAgJ21ldGVyJyxcbiAgJ25hdicsXG4gICdub2JyJyxcbiAgJ29sJyxcbiAgJ29wdGdyb3VwJyxcbiAgJ29wdGlvbicsXG4gICdvdXRwdXQnLFxuICAncCcsXG4gICdwaWN0dXJlJyxcbiAgJ3ByZScsXG4gICdwcm9ncmVzcycsXG4gICdxJyxcbiAgJ3JwJyxcbiAgJ3J0JyxcbiAgJ3J1YnknLFxuICAncycsXG4gICdzYW1wJyxcbiAgJ3NlYXJjaCcsXG4gICdzZWN0aW9uJyxcbiAgJ3NlbGVjdCcsXG4gICdzaGFkb3cnLFxuICAnc2xvdCcsXG4gICdzbWFsbCcsXG4gICdzb3VyY2UnLFxuICAnc3BhY2VyJyxcbiAgJ3NwYW4nLFxuICAnc3RyaWtlJyxcbiAgJ3N0cm9uZycsXG4gICdzdHlsZScsXG4gICdzdWInLFxuICAnc3VtbWFyeScsXG4gICdzdXAnLFxuICAndGFibGUnLFxuICAndGJvZHknLFxuICAndGQnLFxuICAndGVtcGxhdGUnLFxuICAndGV4dGFyZWEnLFxuICAndGZvb3QnLFxuICAndGgnLFxuICAndGhlYWQnLFxuICAndGltZScsXG4gICd0cicsXG4gICd0cmFjaycsXG4gICd0dCcsXG4gICd1JyxcbiAgJ3VsJyxcbiAgJ3ZhcicsXG4gICd2aWRlbycsXG4gICd3YnInLFxuXSBhcyBjb25zdCk7XG5cbmV4cG9ydCBjb25zdCBzdmcgPSBmcmVlemUoW1xuICAnc3ZnJyxcbiAgJ2EnLFxuICAnYWx0Z2x5cGgnLFxuICAnYWx0Z2x5cGhkZWYnLFxuICAnYWx0Z2x5cGhpdGVtJyxcbiAgJ2FuaW1hdGVjb2xvcicsXG4gICdhbmltYXRlbW90aW9uJyxcbiAgJ2FuaW1hdGV0cmFuc2Zvcm0nLFxuICAnY2lyY2xlJyxcbiAgJ2NsaXBwYXRoJyxcbiAgJ2RlZnMnLFxuICAnZGVzYycsXG4gICdlbGxpcHNlJyxcbiAgJ2VudGVya2V5aGludCcsXG4gICdleHBvcnRwYXJ0cycsXG4gICdmaWx0ZXInLFxuICAnZm9udCcsXG4gICdnJyxcbiAgJ2dseXBoJyxcbiAgJ2dseXBocmVmJyxcbiAgJ2hrZXJuJyxcbiAgJ2ltYWdlJyxcbiAgJ2lucHV0bW9kZScsXG4gICdsaW5lJyxcbiAgJ2xpbmVhcmdyYWRpZW50JyxcbiAgJ21hcmtlcicsXG4gICdtYXNrJyxcbiAgJ21ldGFkYXRhJyxcbiAgJ21wYXRoJyxcbiAgJ3BhcnQnLFxuICAncGF0aCcsXG4gICdwYXR0ZXJuJyxcbiAgJ3BvbHlnb24nLFxuICAncG9seWxpbmUnLFxuICAncmFkaWFsZ3JhZGllbnQnLFxuICAncmVjdCcsXG4gICdzdG9wJyxcbiAgJ3N0eWxlJyxcbiAgJ3N3aXRjaCcsXG4gICdzeW1ib2wnLFxuICAndGV4dCcsXG4gICd0ZXh0cGF0aCcsXG4gICd0aXRsZScsXG4gICd0cmVmJyxcbiAgJ3RzcGFuJyxcbiAgJ3ZpZXcnLFxuICAndmtlcm4nLFxuXSBhcyBjb25zdCk7XG5cbmV4cG9ydCBjb25zdCBzdmdGaWx0ZXJzID0gZnJlZXplKFtcbiAgJ2ZlQmxlbmQnLFxuICAnZmVDb2xvck1hdHJpeCcsXG4gICdmZUNvbXBvbmVudFRyYW5zZmVyJyxcbiAgJ2ZlQ29tcG9zaXRlJyxcbiAgJ2ZlQ29udm9sdmVNYXRyaXgnLFxuICAnZmVEaWZmdXNlTGlnaHRpbmcnLFxuICAnZmVEaXNwbGFjZW1lbnRNYXAnLFxuICAnZmVEaXN0YW50TGlnaHQnLFxuICAnZmVEcm9wU2hhZG93JyxcbiAgJ2ZlRmxvb2QnLFxuICAnZmVGdW5jQScsXG4gICdmZUZ1bmNCJyxcbiAgJ2ZlRnVuY0cnLFxuICAnZmVGdW5jUicsXG4gICdmZUdhdXNzaWFuQmx1cicsXG4gICdmZUltYWdlJyxcbiAgJ2ZlTWVyZ2UnLFxuICAnZmVNZXJnZU5vZGUnLFxuICAnZmVNb3JwaG9sb2d5JyxcbiAgJ2ZlT2Zmc2V0JyxcbiAgJ2ZlUG9pbnRMaWdodCcsXG4gICdmZVNwZWN1bGFyTGlnaHRpbmcnLFxuICAnZmVTcG90TGlnaHQnLFxuICAnZmVUaWxlJyxcbiAgJ2ZlVHVyYnVsZW5jZScsXG5dIGFzIGNvbnN0KTtcblxuLy8gTGlzdCBvZiBTVkcgZWxlbWVudHMgdGhhdCBhcmUgZGlzYWxsb3dlZCBieSBkZWZhdWx0LlxuLy8gV2Ugc3RpbGwgbmVlZCB0byBrbm93IHRoZW0gc28gdGhhdCB3ZSBjYW4gZG8gbmFtZXNwYWNlXG4vLyBjaGVja3MgcHJvcGVybHkgaW4gY2FzZSBvbmUgd2FudHMgdG8gYWRkIHRoZW0gdG9cbi8vIGFsbG93LWxpc3QuXG5leHBvcnQgY29uc3Qgc3ZnRGlzYWxsb3dlZCA9IGZyZWV6ZShbXG4gICdhbmltYXRlJyxcbiAgJ2NvbG9yLXByb2ZpbGUnLFxuICAnY3Vyc29yJyxcbiAgJ2Rpc2NhcmQnLFxuICAnZm9udC1mYWNlJyxcbiAgJ2ZvbnQtZmFjZS1mb3JtYXQnLFxuICAnZm9udC1mYWNlLW5hbWUnLFxuICAnZm9udC1mYWNlLXNyYycsXG4gICdmb250LWZhY2UtdXJpJyxcbiAgJ2ZvcmVpZ25vYmplY3QnLFxuICAnaGF0Y2gnLFxuICAnaGF0Y2hwYXRoJyxcbiAgJ21lc2gnLFxuICAnbWVzaGdyYWRpZW50JyxcbiAgJ21lc2hwYXRjaCcsXG4gICdtZXNocm93JyxcbiAgJ21pc3NpbmctZ2x5cGgnLFxuICAnc2NyaXB0JyxcbiAgJ3NldCcsXG4gICdzb2xpZGNvbG9yJyxcbiAgJ3Vua25vd24nLFxuICAndXNlJyxcbl0gYXMgY29uc3QpO1xuXG5leHBvcnQgY29uc3QgbWF0aE1sID0gZnJlZXplKFtcbiAgJ21hdGgnLFxuICAnbWVuY2xvc2UnLFxuICAnbWVycm9yJyxcbiAgJ21mZW5jZWQnLFxuICAnbWZyYWMnLFxuICAnbWdseXBoJyxcbiAgJ21pJyxcbiAgJ21sYWJlbGVkdHInLFxuICAnbW11bHRpc2NyaXB0cycsXG4gICdtbicsXG4gICdtbycsXG4gICdtb3ZlcicsXG4gICdtcGFkZGVkJyxcbiAgJ21waGFudG9tJyxcbiAgJ21yb290JyxcbiAgJ21yb3cnLFxuICAnbXMnLFxuICAnbXNwYWNlJyxcbiAgJ21zcXJ0JyxcbiAgJ21zdHlsZScsXG4gICdtc3ViJyxcbiAgJ21zdXAnLFxuICAnbXN1YnN1cCcsXG4gICdtdGFibGUnLFxuICAnbXRkJyxcbiAgJ210ZXh0JyxcbiAgJ210cicsXG4gICdtdW5kZXInLFxuICAnbXVuZGVyb3ZlcicsXG4gICdtcHJlc2NyaXB0cycsXG5dIGFzIGNvbnN0KTtcblxuLy8gU2ltaWxhcmx5IHRvIFNWRywgd2Ugd2FudCB0byBrbm93IGFsbCBNYXRoTUwgZWxlbWVudHMsXG4vLyBldmVuIHRob3NlIHRoYXQgd2UgZGlzYWxsb3cgYnkgZGVmYXVsdC5cbmV4cG9ydCBjb25zdCBtYXRoTWxEaXNhbGxvd2VkID0gZnJlZXplKFtcbiAgJ21hY3Rpb24nLFxuICAnbWFsaWduZ3JvdXAnLFxuICAnbWFsaWdubWFyaycsXG4gICdtbG9uZ2RpdicsXG4gICdtc2NhcnJpZXMnLFxuICAnbXNjYXJyeScsXG4gICdtc2dyb3VwJyxcbiAgJ21zdGFjaycsXG4gICdtc2xpbmUnLFxuICAnbXNyb3cnLFxuICAnc2VtYW50aWNzJyxcbiAgJ2Fubm90YXRpb24nLFxuICAnYW5ub3RhdGlvbi14bWwnLFxuICAnbXByZXNjcmlwdHMnLFxuICAnbm9uZScsXG5dIGFzIGNvbnN0KTtcblxuZXhwb3J0IGNvbnN0IHRleHQgPSBmcmVlemUoWycjdGV4dCddIGFzIGNvbnN0KTtcbiIsICJpbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuL3V0aWxzLmpzJztcblxuZXhwb3J0IGNvbnN0IGh0bWwgPSBmcmVlemUoW1xuICAnYWNjZXB0JyxcbiAgJ2FjdGlvbicsXG4gICdhbGlnbicsXG4gICdhbHQnLFxuICAnYXV0b2NhcGl0YWxpemUnLFxuICAnYXV0b2NvbXBsZXRlJyxcbiAgJ2F1dG9waWN0dXJlaW5waWN0dXJlJyxcbiAgJ2F1dG9wbGF5JyxcbiAgJ2JhY2tncm91bmQnLFxuICAnYmdjb2xvcicsXG4gICdib3JkZXInLFxuICAnY2FwdHVyZScsXG4gICdjZWxscGFkZGluZycsXG4gICdjZWxsc3BhY2luZycsXG4gICdjaGVja2VkJyxcbiAgJ2NpdGUnLFxuICAnY2xhc3MnLFxuICAnY2xlYXInLFxuICAnY29sb3InLFxuICAnY29scycsXG4gICdjb2xzcGFuJyxcbiAgJ2NvbnRyb2xzJyxcbiAgJ2NvbnRyb2xzbGlzdCcsXG4gICdjb29yZHMnLFxuICAnY3Jvc3NvcmlnaW4nLFxuICAnZGF0ZXRpbWUnLFxuICAnZGVjb2RpbmcnLFxuICAnZGVmYXVsdCcsXG4gICdkaXInLFxuICAnZGlzYWJsZWQnLFxuICAnZGlzYWJsZXBpY3R1cmVpbnBpY3R1cmUnLFxuICAnZGlzYWJsZXJlbW90ZXBsYXliYWNrJyxcbiAgJ2Rvd25sb2FkJyxcbiAgJ2RyYWdnYWJsZScsXG4gICdlbmN0eXBlJyxcbiAgJ2VudGVya2V5aGludCcsXG4gICdleHBvcnRwYXJ0cycsXG4gICdmYWNlJyxcbiAgJ2ZvcicsXG4gICdoZWFkZXJzJyxcbiAgJ2hlaWdodCcsXG4gICdoaWRkZW4nLFxuICAnaGlnaCcsXG4gICdocmVmJyxcbiAgJ2hyZWZsYW5nJyxcbiAgJ2lkJyxcbiAgJ2luZXJ0JyxcbiAgJ2lucHV0bW9kZScsXG4gICdpbnRlZ3JpdHknLFxuICAnaXNtYXAnLFxuICAna2luZCcsXG4gICdsYWJlbCcsXG4gICdsYW5nJyxcbiAgJ2xpc3QnLFxuICAnbG9hZGluZycsXG4gICdsb29wJyxcbiAgJ2xvdycsXG4gICdtYXgnLFxuICAnbWF4bGVuZ3RoJyxcbiAgJ21lZGlhJyxcbiAgJ21ldGhvZCcsXG4gICdtaW4nLFxuICAnbWlubGVuZ3RoJyxcbiAgJ211bHRpcGxlJyxcbiAgJ211dGVkJyxcbiAgJ25hbWUnLFxuICAnbm9uY2UnLFxuICAnbm9zaGFkZScsXG4gICdub3ZhbGlkYXRlJyxcbiAgJ25vd3JhcCcsXG4gICdvcGVuJyxcbiAgJ29wdGltdW0nLFxuICAncGFydCcsXG4gICdwYXR0ZXJuJyxcbiAgJ3BsYWNlaG9sZGVyJyxcbiAgJ3BsYXlzaW5saW5lJyxcbiAgJ3BvcG92ZXInLFxuICAncG9wb3ZlcnRhcmdldCcsXG4gICdwb3BvdmVydGFyZ2V0YWN0aW9uJyxcbiAgJ3Bvc3RlcicsXG4gICdwcmVsb2FkJyxcbiAgJ3B1YmRhdGUnLFxuICAncmFkaW9ncm91cCcsXG4gICdyZWFkb25seScsXG4gICdyZWwnLFxuICAncmVxdWlyZWQnLFxuICAncmV2JyxcbiAgJ3JldmVyc2VkJyxcbiAgJ3JvbGUnLFxuICAncm93cycsXG4gICdyb3dzcGFuJyxcbiAgJ3NwZWxsY2hlY2snLFxuICAnc2NvcGUnLFxuICAnc2VsZWN0ZWQnLFxuICAnc2hhcGUnLFxuICAnc2l6ZScsXG4gICdzaXplcycsXG4gICdzbG90JyxcbiAgJ3NwYW4nLFxuICAnc3JjbGFuZycsXG4gICdzdGFydCcsXG4gICdzcmMnLFxuICAnc3Jjc2V0JyxcbiAgJ3N0ZXAnLFxuICAnc3R5bGUnLFxuICAnc3VtbWFyeScsXG4gICd0YWJpbmRleCcsXG4gICd0aXRsZScsXG4gICd0cmFuc2xhdGUnLFxuICAndHlwZScsXG4gICd1c2VtYXAnLFxuICAndmFsaWduJyxcbiAgJ3ZhbHVlJyxcbiAgJ3dpZHRoJyxcbiAgJ3dyYXAnLFxuICAneG1sbnMnLFxuICAnc2xvdCcsXG5dIGFzIGNvbnN0KTtcblxuZXhwb3J0IGNvbnN0IHN2ZyA9IGZyZWV6ZShbXG4gICdhY2NlbnQtaGVpZ2h0JyxcbiAgJ2FjY3VtdWxhdGUnLFxuICAnYWRkaXRpdmUnLFxuICAnYWxpZ25tZW50LWJhc2VsaW5lJyxcbiAgJ2FtcGxpdHVkZScsXG4gICdhc2NlbnQnLFxuICAnYXR0cmlidXRlbmFtZScsXG4gICdhdHRyaWJ1dGV0eXBlJyxcbiAgJ2F6aW11dGgnLFxuICAnYmFzZWZyZXF1ZW5jeScsXG4gICdiYXNlbGluZS1zaGlmdCcsXG4gICdiZWdpbicsXG4gICdiaWFzJyxcbiAgJ2J5JyxcbiAgJ2NsYXNzJyxcbiAgJ2NsaXAnLFxuICAnY2xpcHBhdGh1bml0cycsXG4gICdjbGlwLXBhdGgnLFxuICAnY2xpcC1ydWxlJyxcbiAgJ2NvbG9yJyxcbiAgJ2NvbG9yLWludGVycG9sYXRpb24nLFxuICAnY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzJyxcbiAgJ2NvbG9yLXByb2ZpbGUnLFxuICAnY29sb3ItcmVuZGVyaW5nJyxcbiAgJ2N4JyxcbiAgJ2N5JyxcbiAgJ2QnLFxuICAnZHgnLFxuICAnZHknLFxuICAnZGlmZnVzZWNvbnN0YW50JyxcbiAgJ2RpcmVjdGlvbicsXG4gICdkaXNwbGF5JyxcbiAgJ2Rpdmlzb3InLFxuICAnZHVyJyxcbiAgJ2VkZ2Vtb2RlJyxcbiAgJ2VsZXZhdGlvbicsXG4gICdlbmQnLFxuICAnZXhwb25lbnQnLFxuICAnZmlsbCcsXG4gICdmaWxsLW9wYWNpdHknLFxuICAnZmlsbC1ydWxlJyxcbiAgJ2ZpbHRlcicsXG4gICdmaWx0ZXJ1bml0cycsXG4gICdmbG9vZC1jb2xvcicsXG4gICdmbG9vZC1vcGFjaXR5JyxcbiAgJ2ZvbnQtZmFtaWx5JyxcbiAgJ2ZvbnQtc2l6ZScsXG4gICdmb250LXNpemUtYWRqdXN0JyxcbiAgJ2ZvbnQtc3RyZXRjaCcsXG4gICdmb250LXN0eWxlJyxcbiAgJ2ZvbnQtdmFyaWFudCcsXG4gICdmb250LXdlaWdodCcsXG4gICdmeCcsXG4gICdmeScsXG4gICdnMScsXG4gICdnMicsXG4gICdnbHlwaC1uYW1lJyxcbiAgJ2dseXBocmVmJyxcbiAgJ2dyYWRpZW50dW5pdHMnLFxuICAnZ3JhZGllbnR0cmFuc2Zvcm0nLFxuICAnaGVpZ2h0JyxcbiAgJ2hyZWYnLFxuICAnaWQnLFxuICAnaW1hZ2UtcmVuZGVyaW5nJyxcbiAgJ2luJyxcbiAgJ2luMicsXG4gICdpbnRlcmNlcHQnLFxuICAnaycsXG4gICdrMScsXG4gICdrMicsXG4gICdrMycsXG4gICdrNCcsXG4gICdrZXJuaW5nJyxcbiAgJ2tleXBvaW50cycsXG4gICdrZXlzcGxpbmVzJyxcbiAgJ2tleXRpbWVzJyxcbiAgJ2xhbmcnLFxuICAnbGVuZ3RoYWRqdXN0JyxcbiAgJ2xldHRlci1zcGFjaW5nJyxcbiAgJ2tlcm5lbG1hdHJpeCcsXG4gICdrZXJuZWx1bml0bGVuZ3RoJyxcbiAgJ2xpZ2h0aW5nLWNvbG9yJyxcbiAgJ2xvY2FsJyxcbiAgJ21hcmtlci1lbmQnLFxuICAnbWFya2VyLW1pZCcsXG4gICdtYXJrZXItc3RhcnQnLFxuICAnbWFya2VyaGVpZ2h0JyxcbiAgJ21hcmtlcnVuaXRzJyxcbiAgJ21hcmtlcndpZHRoJyxcbiAgJ21hc2tjb250ZW50dW5pdHMnLFxuICAnbWFza3VuaXRzJyxcbiAgJ21heCcsXG4gICdtYXNrJyxcbiAgJ21hc2stdHlwZScsXG4gICdtZWRpYScsXG4gICdtZXRob2QnLFxuICAnbW9kZScsXG4gICdtaW4nLFxuICAnbmFtZScsXG4gICdudW1vY3RhdmVzJyxcbiAgJ29mZnNldCcsXG4gICdvcGVyYXRvcicsXG4gICdvcGFjaXR5JyxcbiAgJ29yZGVyJyxcbiAgJ29yaWVudCcsXG4gICdvcmllbnRhdGlvbicsXG4gICdvcmlnaW4nLFxuICAnb3ZlcmZsb3cnLFxuICAncGFpbnQtb3JkZXInLFxuICAncGF0aCcsXG4gICdwYXRobGVuZ3RoJyxcbiAgJ3BhdHRlcm5jb250ZW50dW5pdHMnLFxuICAncGF0dGVybnRyYW5zZm9ybScsXG4gICdwYXR0ZXJudW5pdHMnLFxuICAncG9pbnRzJyxcbiAgJ3ByZXNlcnZlYWxwaGEnLFxuICAncHJlc2VydmVhc3BlY3RyYXRpbycsXG4gICdwcmltaXRpdmV1bml0cycsXG4gICdyJyxcbiAgJ3J4JyxcbiAgJ3J5JyxcbiAgJ3JhZGl1cycsXG4gICdyZWZ4JyxcbiAgJ3JlZnknLFxuICAncmVwZWF0Y291bnQnLFxuICAncmVwZWF0ZHVyJyxcbiAgJ3Jlc3RhcnQnLFxuICAncmVzdWx0JyxcbiAgJ3JvdGF0ZScsXG4gICdzY2FsZScsXG4gICdzZWVkJyxcbiAgJ3NoYXBlLXJlbmRlcmluZycsXG4gICdzbG9wZScsXG4gICdzcGVjdWxhcmNvbnN0YW50JyxcbiAgJ3NwZWN1bGFyZXhwb25lbnQnLFxuICAnc3ByZWFkbWV0aG9kJyxcbiAgJ3N0YXJ0b2Zmc2V0JyxcbiAgJ3N0ZGRldmlhdGlvbicsXG4gICdzdGl0Y2h0aWxlcycsXG4gICdzdG9wLWNvbG9yJyxcbiAgJ3N0b3Atb3BhY2l0eScsXG4gICdzdHJva2UtZGFzaGFycmF5JyxcbiAgJ3N0cm9rZS1kYXNob2Zmc2V0JyxcbiAgJ3N0cm9rZS1saW5lY2FwJyxcbiAgJ3N0cm9rZS1saW5lam9pbicsXG4gICdzdHJva2UtbWl0ZXJsaW1pdCcsXG4gICdzdHJva2Utb3BhY2l0eScsXG4gICdzdHJva2UnLFxuICAnc3Ryb2tlLXdpZHRoJyxcbiAgJ3N0eWxlJyxcbiAgJ3N1cmZhY2VzY2FsZScsXG4gICdzeXN0ZW1sYW5ndWFnZScsXG4gICd0YWJpbmRleCcsXG4gICd0YWJsZXZhbHVlcycsXG4gICd0YXJnZXR4JyxcbiAgJ3RhcmdldHknLFxuICAndHJhbnNmb3JtJyxcbiAgJ3RyYW5zZm9ybS1vcmlnaW4nLFxuICAndGV4dC1hbmNob3InLFxuICAndGV4dC1kZWNvcmF0aW9uJyxcbiAgJ3RleHQtcmVuZGVyaW5nJyxcbiAgJ3RleHRsZW5ndGgnLFxuICAndHlwZScsXG4gICd1MScsXG4gICd1MicsXG4gICd1bmljb2RlJyxcbiAgJ3ZhbHVlcycsXG4gICd2aWV3Ym94JyxcbiAgJ3Zpc2liaWxpdHknLFxuICAndmVyc2lvbicsXG4gICd2ZXJ0LWFkdi15JyxcbiAgJ3ZlcnQtb3JpZ2luLXgnLFxuICAndmVydC1vcmlnaW4teScsXG4gICd3aWR0aCcsXG4gICd3b3JkLXNwYWNpbmcnLFxuICAnd3JhcCcsXG4gICd3cml0aW5nLW1vZGUnLFxuICAneGNoYW5uZWxzZWxlY3RvcicsXG4gICd5Y2hhbm5lbHNlbGVjdG9yJyxcbiAgJ3gnLFxuICAneDEnLFxuICAneDInLFxuICAneG1sbnMnLFxuICAneScsXG4gICd5MScsXG4gICd5MicsXG4gICd6JyxcbiAgJ3pvb21hbmRwYW4nLFxuXSBhcyBjb25zdCk7XG5cbmV4cG9ydCBjb25zdCBtYXRoTWwgPSBmcmVlemUoW1xuICAnYWNjZW50JyxcbiAgJ2FjY2VudHVuZGVyJyxcbiAgJ2FsaWduJyxcbiAgJ2JldmVsbGVkJyxcbiAgJ2Nsb3NlJyxcbiAgJ2NvbHVtbnNhbGlnbicsXG4gICdjb2x1bW5saW5lcycsXG4gICdjb2x1bW5zcGFuJyxcbiAgJ2Rlbm9tYWxpZ24nLFxuICAnZGVwdGgnLFxuICAnZGlyJyxcbiAgJ2Rpc3BsYXknLFxuICAnZGlzcGxheXN0eWxlJyxcbiAgJ2VuY29kaW5nJyxcbiAgJ2ZlbmNlJyxcbiAgJ2ZyYW1lJyxcbiAgJ2hlaWdodCcsXG4gICdocmVmJyxcbiAgJ2lkJyxcbiAgJ2xhcmdlb3AnLFxuICAnbGVuZ3RoJyxcbiAgJ2xpbmV0aGlja25lc3MnLFxuICAnbHNwYWNlJyxcbiAgJ2xxdW90ZScsXG4gICdtYXRoYmFja2dyb3VuZCcsXG4gICdtYXRoY29sb3InLFxuICAnbWF0aHNpemUnLFxuICAnbWF0aHZhcmlhbnQnLFxuICAnbWF4c2l6ZScsXG4gICdtaW5zaXplJyxcbiAgJ21vdmFibGVsaW1pdHMnLFxuICAnbm90YXRpb24nLFxuICAnbnVtYWxpZ24nLFxuICAnb3BlbicsXG4gICdyb3dhbGlnbicsXG4gICdyb3dsaW5lcycsXG4gICdyb3dzcGFjaW5nJyxcbiAgJ3Jvd3NwYW4nLFxuICAncnNwYWNlJyxcbiAgJ3JxdW90ZScsXG4gICdzY3JpcHRsZXZlbCcsXG4gICdzY3JpcHRtaW5zaXplJyxcbiAgJ3NjcmlwdHNpemVtdWx0aXBsaWVyJyxcbiAgJ3NlbGVjdGlvbicsXG4gICdzZXBhcmF0b3InLFxuICAnc2VwYXJhdG9ycycsXG4gICdzdHJldGNoeScsXG4gICdzdWJzY3JpcHRzaGlmdCcsXG4gICdzdXBzY3JpcHRzaGlmdCcsXG4gICdzeW1tZXRyaWMnLFxuICAndm9mZnNldCcsXG4gICd3aWR0aCcsXG4gICd4bWxucycsXG5dKTtcblxuZXhwb3J0IGNvbnN0IHhtbCA9IGZyZWV6ZShbXG4gICd4bGluazpocmVmJyxcbiAgJ3htbDppZCcsXG4gICd4bGluazp0aXRsZScsXG4gICd4bWw6c3BhY2UnLFxuICAneG1sbnM6eGxpbmsnLFxuXSBhcyBjb25zdCk7XG4iLCAiaW1wb3J0IHsgc2VhbCB9IGZyb20gJy4vdXRpbHMuanMnO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9iZXR0ZXItcmVnZXhcbmV4cG9ydCBjb25zdCBNVVNUQUNIRV9FWFBSID0gc2VhbCgvXFx7XFx7W1xcd1xcV10qfFtcXHdcXFddKlxcfVxcfS9nbSk7IC8vIFNwZWNpZnkgdGVtcGxhdGUgZGV0ZWN0aW9uIHJlZ2V4IGZvciBTQUZFX0ZPUl9URU1QTEFURVMgbW9kZVxuZXhwb3J0IGNvbnN0IEVSQl9FWFBSID0gc2VhbCgvPCVbXFx3XFxXXSp8W1xcd1xcV10qJT4vZ20pO1xuZXhwb3J0IGNvbnN0IFRNUExJVF9FWFBSID0gc2VhbCgvXFwkXFx7W1xcd1xcV10qL2dtKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSB1bmljb3JuL2JldHRlci1yZWdleFxuZXhwb3J0IGNvbnN0IERBVEFfQVRUUiA9IHNlYWwoL15kYXRhLVtcXC1cXHcuXFx1MDBCNy1cXHVGRkZGXSskLyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdXNlbGVzcy1lc2NhcGVcbmV4cG9ydCBjb25zdCBBUklBX0FUVFIgPSBzZWFsKC9eYXJpYS1bXFwtXFx3XSskLyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdXNlbGVzcy1lc2NhcGVcbmV4cG9ydCBjb25zdCBJU19BTExPV0VEX1VSSSA9IHNlYWwoXG4gIC9eKD86KD86KD86ZnxodCl0cHM/fG1haWx0b3x0ZWx8Y2FsbHRvfHNtc3xjaWR8eG1wcHxtYXRyaXgpOnxbXmEtel18W2EteisuXFwtXSsoPzpbXmEteisuXFwtOl18JCkpL2kgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2VsZXNzLWVzY2FwZVxuKTtcbmV4cG9ydCBjb25zdCBJU19TQ1JJUFRfT1JfREFUQSA9IHNlYWwoL14oPzpcXHcrc2NyaXB0fGRhdGEpOi9pKTtcbmV4cG9ydCBjb25zdCBBVFRSX1dISVRFU1BBQ0UgPSBzZWFsKFxuICAvW1xcdTAwMDAtXFx1MDAyMFxcdTAwQTBcXHUxNjgwXFx1MTgwRVxcdTIwMDAtXFx1MjAyOVxcdTIwNUZcXHUzMDAwXS9nIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29udHJvbC1yZWdleFxuKTtcbmV4cG9ydCBjb25zdCBET0NUWVBFX05BTUUgPSBzZWFsKC9eaHRtbCQvaSk7XG5leHBvcnQgY29uc3QgQ1VTVE9NX0VMRU1FTlQgPSBzZWFsKC9eW2Etel1bLlxcd10qKC1bLlxcd10rKSskL2kpO1xuIiwgIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9pbmRlbnQgKi9cblxuaW1wb3J0IHR5cGUge1xuICBUcnVzdGVkSFRNTCxcbiAgVHJ1c3RlZFR5cGVzV2luZG93LFxufSBmcm9tICd0cnVzdGVkLXR5cGVzL2xpYi9pbmRleC5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbmZpZywgVXNlUHJvZmlsZXNDb25maWcgfSBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQgKiBhcyBUQUdTIGZyb20gJy4vdGFncy5qcyc7XG5pbXBvcnQgKiBhcyBBVFRSUyBmcm9tICcuL2F0dHJzLmpzJztcbmltcG9ydCAqIGFzIEVYUFJFU1NJT05TIGZyb20gJy4vcmVnZXhwLmpzJztcbmltcG9ydCB7XG4gIGFkZFRvU2V0LFxuICBjbG9uZSxcbiAgZW50cmllcyxcbiAgZnJlZXplLFxuICBhcnJheUZvckVhY2gsXG4gIGFycmF5TGFzdEluZGV4T2YsXG4gIGFycmF5UG9wLFxuICBhcnJheVB1c2gsXG4gIGFycmF5U3BsaWNlLFxuICBzdHJpbmdNYXRjaCxcbiAgc3RyaW5nUmVwbGFjZSxcbiAgc3RyaW5nVG9Mb3dlckNhc2UsXG4gIHN0cmluZ1RvU3RyaW5nLFxuICBzdHJpbmdJbmRleE9mLFxuICBzdHJpbmdUcmltLFxuICByZWdFeHBUZXN0LFxuICB0eXBlRXJyb3JDcmVhdGUsXG4gIGxvb2t1cEdldHRlcixcbiAgY3JlYXRlLFxuICBvYmplY3RIYXNPd25Qcm9wZXJ0eSxcbn0gZnJvbSAnLi91dGlscy5qcyc7XG5cbmV4cG9ydCB0eXBlIHsgQ29uZmlnIH0gZnJvbSAnLi9jb25maWcnO1xuXG5kZWNsYXJlIGNvbnN0IFZFUlNJT046IHN0cmluZztcblxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL05vZGUvbm9kZVR5cGVcbmNvbnN0IE5PREVfVFlQRSA9IHtcbiAgZWxlbWVudDogMSxcbiAgYXR0cmlidXRlOiAyLFxuICB0ZXh0OiAzLFxuICBjZGF0YVNlY3Rpb246IDQsXG4gIGVudGl0eVJlZmVyZW5jZTogNSwgLy8gRGVwcmVjYXRlZFxuICBlbnRpdHlOb2RlOiA2LCAvLyBEZXByZWNhdGVkXG4gIHByb2dyZXNzaW5nSW5zdHJ1Y3Rpb246IDcsXG4gIGNvbW1lbnQ6IDgsXG4gIGRvY3VtZW50OiA5LFxuICBkb2N1bWVudFR5cGU6IDEwLFxuICBkb2N1bWVudEZyYWdtZW50OiAxMSxcbiAgbm90YXRpb246IDEyLCAvLyBEZXByZWNhdGVkXG59O1xuXG5jb25zdCBnZXRHbG9iYWwgPSBmdW5jdGlvbiAoKTogV2luZG93TGlrZSB7XG4gIHJldHVybiB0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyA/IG51bGwgOiB3aW5kb3c7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuby1vcCBwb2xpY3kgZm9yIGludGVybmFsIHVzZSBvbmx5LlxuICogRG9uJ3QgZXhwb3J0IHRoaXMgZnVuY3Rpb24gb3V0c2lkZSB0aGlzIG1vZHVsZSFcbiAqIEBwYXJhbSB0cnVzdGVkVHlwZXMgVGhlIHBvbGljeSBmYWN0b3J5LlxuICogQHBhcmFtIHB1cmlmeUhvc3RFbGVtZW50IFRoZSBTY3JpcHQgZWxlbWVudCB1c2VkIHRvIGxvYWQgRE9NUHVyaWZ5ICh0byBkZXRlcm1pbmUgcG9saWN5IG5hbWUgc3VmZml4KS5cbiAqIEByZXR1cm4gVGhlIHBvbGljeSBjcmVhdGVkIChvciBudWxsLCBpZiBUcnVzdGVkIFR5cGVzXG4gKiBhcmUgbm90IHN1cHBvcnRlZCBvciBjcmVhdGluZyB0aGUgcG9saWN5IGZhaWxlZCkuXG4gKi9cbmNvbnN0IF9jcmVhdGVUcnVzdGVkVHlwZXNQb2xpY3kgPSBmdW5jdGlvbiAoXG4gIHRydXN0ZWRUeXBlczogVHJ1c3RlZFR5cGVQb2xpY3lGYWN0b3J5LFxuICBwdXJpZnlIb3N0RWxlbWVudDogSFRNTFNjcmlwdEVsZW1lbnRcbikge1xuICBpZiAoXG4gICAgdHlwZW9mIHRydXN0ZWRUeXBlcyAhPT0gJ29iamVjdCcgfHxcbiAgICB0eXBlb2YgdHJ1c3RlZFR5cGVzLmNyZWF0ZVBvbGljeSAhPT0gJ2Z1bmN0aW9uJ1xuICApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIEFsbG93IHRoZSBjYWxsZXJzIHRvIGNvbnRyb2wgdGhlIHVuaXF1ZSBwb2xpY3kgbmFtZVxuICAvLyBieSBhZGRpbmcgYSBkYXRhLXR0LXBvbGljeS1zdWZmaXggdG8gdGhlIHNjcmlwdCBlbGVtZW50IHdpdGggdGhlIERPTVB1cmlmeS5cbiAgLy8gUG9saWN5IGNyZWF0aW9uIHdpdGggZHVwbGljYXRlIG5hbWVzIHRocm93cyBpbiBUcnVzdGVkIFR5cGVzLlxuICBsZXQgc3VmZml4ID0gbnVsbDtcbiAgY29uc3QgQVRUUl9OQU1FID0gJ2RhdGEtdHQtcG9saWN5LXN1ZmZpeCc7XG4gIGlmIChwdXJpZnlIb3N0RWxlbWVudCAmJiBwdXJpZnlIb3N0RWxlbWVudC5oYXNBdHRyaWJ1dGUoQVRUUl9OQU1FKSkge1xuICAgIHN1ZmZpeCA9IHB1cmlmeUhvc3RFbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSX05BTUUpO1xuICB9XG5cbiAgY29uc3QgcG9saWN5TmFtZSA9ICdkb21wdXJpZnknICsgKHN1ZmZpeCA/ICcjJyArIHN1ZmZpeCA6ICcnKTtcblxuICB0cnkge1xuICAgIHJldHVybiB0cnVzdGVkVHlwZXMuY3JlYXRlUG9saWN5KHBvbGljeU5hbWUsIHtcbiAgICAgIGNyZWF0ZUhUTUwoaHRtbCkge1xuICAgICAgICByZXR1cm4gaHRtbDtcbiAgICAgIH0sXG4gICAgICBjcmVhdGVTY3JpcHRVUkwoc2NyaXB0VXJsKSB7XG4gICAgICAgIHJldHVybiBzY3JpcHRVcmw7XG4gICAgICB9LFxuICAgIH0pO1xuICB9IGNhdGNoIChfKSB7XG4gICAgLy8gUG9saWN5IGNyZWF0aW9uIGZhaWxlZCAobW9zdCBsaWtlbHkgYW5vdGhlciBET01QdXJpZnkgc2NyaXB0IGhhc1xuICAgIC8vIGFscmVhZHkgcnVuKS4gU2tpcCBjcmVhdGluZyB0aGUgcG9saWN5LCBhcyB0aGlzIHdpbGwgb25seSBjYXVzZSBlcnJvcnNcbiAgICAvLyBpZiBUVCBhcmUgZW5mb3JjZWQuXG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ1RydXN0ZWRUeXBlcyBwb2xpY3kgJyArIHBvbGljeU5hbWUgKyAnIGNvdWxkIG5vdCBiZSBjcmVhdGVkLidcbiAgICApO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59O1xuXG5jb25zdCBfY3JlYXRlSG9va3NNYXAgPSBmdW5jdGlvbiAoKTogSG9va3NNYXAge1xuICByZXR1cm4ge1xuICAgIGFmdGVyU2FuaXRpemVBdHRyaWJ1dGVzOiBbXSxcbiAgICBhZnRlclNhbml0aXplRWxlbWVudHM6IFtdLFxuICAgIGFmdGVyU2FuaXRpemVTaGFkb3dET006IFtdLFxuICAgIGJlZm9yZVNhbml0aXplQXR0cmlidXRlczogW10sXG4gICAgYmVmb3JlU2FuaXRpemVFbGVtZW50czogW10sXG4gICAgYmVmb3JlU2FuaXRpemVTaGFkb3dET006IFtdLFxuICAgIHVwb25TYW5pdGl6ZUF0dHJpYnV0ZTogW10sXG4gICAgdXBvblNhbml0aXplRWxlbWVudDogW10sXG4gICAgdXBvblNhbml0aXplU2hhZG93Tm9kZTogW10sXG4gIH07XG59O1xuXG5mdW5jdGlvbiBjcmVhdGVET01QdXJpZnkod2luZG93OiBXaW5kb3dMaWtlID0gZ2V0R2xvYmFsKCkpOiBET01QdXJpZnkge1xuICBjb25zdCBET01QdXJpZnk6IERPTVB1cmlmeSA9IChyb290OiBXaW5kb3dMaWtlKSA9PiBjcmVhdGVET01QdXJpZnkocm9vdCk7XG5cbiAgRE9NUHVyaWZ5LnZlcnNpb24gPSBWRVJTSU9OO1xuXG4gIERPTVB1cmlmeS5yZW1vdmVkID0gW107XG5cbiAgaWYgKFxuICAgICF3aW5kb3cgfHxcbiAgICAhd2luZG93LmRvY3VtZW50IHx8XG4gICAgd2luZG93LmRvY3VtZW50Lm5vZGVUeXBlICE9PSBOT0RFX1RZUEUuZG9jdW1lbnQgfHxcbiAgICAhd2luZG93LkVsZW1lbnRcbiAgKSB7XG4gICAgLy8gTm90IHJ1bm5pbmcgaW4gYSBicm93c2VyLCBwcm92aWRlIGEgZmFjdG9yeSBmdW5jdGlvblxuICAgIC8vIHNvIHRoYXQgeW91IGNhbiBwYXNzIHlvdXIgb3duIFdpbmRvd1xuICAgIERPTVB1cmlmeS5pc1N1cHBvcnRlZCA9IGZhbHNlO1xuXG4gICAgcmV0dXJuIERPTVB1cmlmeTtcbiAgfVxuXG4gIGxldCB7IGRvY3VtZW50IH0gPSB3aW5kb3c7XG5cbiAgY29uc3Qgb3JpZ2luYWxEb2N1bWVudCA9IGRvY3VtZW50O1xuICBjb25zdCBjdXJyZW50U2NyaXB0OiBIVE1MU2NyaXB0RWxlbWVudCA9XG4gICAgb3JpZ2luYWxEb2N1bWVudC5jdXJyZW50U2NyaXB0IGFzIEhUTUxTY3JpcHRFbGVtZW50O1xuICBjb25zdCB7XG4gICAgRG9jdW1lbnRGcmFnbWVudCxcbiAgICBIVE1MVGVtcGxhdGVFbGVtZW50LFxuICAgIE5vZGUsXG4gICAgRWxlbWVudCxcbiAgICBOb2RlRmlsdGVyLFxuICAgIE5hbWVkTm9kZU1hcCA9IHdpbmRvdy5OYW1lZE5vZGVNYXAgfHwgKHdpbmRvdyBhcyBhbnkpLk1vek5hbWVkQXR0ck1hcCxcbiAgICBIVE1MRm9ybUVsZW1lbnQsXG4gICAgRE9NUGFyc2VyLFxuICAgIHRydXN0ZWRUeXBlcyxcbiAgfSA9IHdpbmRvdztcblxuICBjb25zdCBFbGVtZW50UHJvdG90eXBlID0gRWxlbWVudC5wcm90b3R5cGU7XG5cbiAgY29uc3QgY2xvbmVOb2RlID0gbG9va3VwR2V0dGVyKEVsZW1lbnRQcm90b3R5cGUsICdjbG9uZU5vZGUnKTtcbiAgY29uc3QgcmVtb3ZlID0gbG9va3VwR2V0dGVyKEVsZW1lbnRQcm90b3R5cGUsICdyZW1vdmUnKTtcbiAgY29uc3QgZ2V0TmV4dFNpYmxpbmcgPSBsb29rdXBHZXR0ZXIoRWxlbWVudFByb3RvdHlwZSwgJ25leHRTaWJsaW5nJyk7XG4gIGNvbnN0IGdldENoaWxkTm9kZXMgPSBsb29rdXBHZXR0ZXIoRWxlbWVudFByb3RvdHlwZSwgJ2NoaWxkTm9kZXMnKTtcbiAgY29uc3QgZ2V0UGFyZW50Tm9kZSA9IGxvb2t1cEdldHRlcihFbGVtZW50UHJvdG90eXBlLCAncGFyZW50Tm9kZScpO1xuXG4gIC8vIEFzIHBlciBpc3N1ZSAjNDcsIHRoZSB3ZWItY29tcG9uZW50cyByZWdpc3RyeSBpcyBpbmhlcml0ZWQgYnkgYVxuICAvLyBuZXcgZG9jdW1lbnQgY3JlYXRlZCB2aWEgY3JlYXRlSFRNTERvY3VtZW50LiBBcyBwZXIgdGhlIHNwZWNcbiAgLy8gKGh0dHA6Ly93M2MuZ2l0aHViLmlvL3dlYmNvbXBvbmVudHMvc3BlYy9jdXN0b20vI2NyZWF0aW5nLWFuZC1wYXNzaW5nLXJlZ2lzdHJpZXMpXG4gIC8vIGEgbmV3IGVtcHR5IHJlZ2lzdHJ5IGlzIHVzZWQgd2hlbiBjcmVhdGluZyBhIHRlbXBsYXRlIGNvbnRlbnRzIG93bmVyXG4gIC8vIGRvY3VtZW50LCBzbyB3ZSB1c2UgdGhhdCBhcyBvdXIgcGFyZW50IGRvY3VtZW50IHRvIGVuc3VyZSBub3RoaW5nXG4gIC8vIGlzIGluaGVyaXRlZC5cbiAgaWYgKHR5cGVvZiBIVE1MVGVtcGxhdGVFbGVtZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY29uc3QgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpO1xuICAgIGlmICh0ZW1wbGF0ZS5jb250ZW50ICYmIHRlbXBsYXRlLmNvbnRlbnQub3duZXJEb2N1bWVudCkge1xuICAgICAgZG9jdW1lbnQgPSB0ZW1wbGF0ZS5jb250ZW50Lm93bmVyRG9jdW1lbnQ7XG4gICAgfVxuICB9XG5cbiAgbGV0IHRydXN0ZWRUeXBlc1BvbGljeTtcbiAgbGV0IGVtcHR5SFRNTCA9ICcnO1xuXG4gIGNvbnN0IHtcbiAgICBpbXBsZW1lbnRhdGlvbixcbiAgICBjcmVhdGVOb2RlSXRlcmF0b3IsXG4gICAgY3JlYXRlRG9jdW1lbnRGcmFnbWVudCxcbiAgICBnZXRFbGVtZW50c0J5VGFnTmFtZSxcbiAgfSA9IGRvY3VtZW50O1xuICBjb25zdCB7IGltcG9ydE5vZGUgfSA9IG9yaWdpbmFsRG9jdW1lbnQ7XG5cbiAgbGV0IGhvb2tzID0gX2NyZWF0ZUhvb2tzTWFwKCk7XG5cbiAgLyoqXG4gICAqIEV4cG9zZSB3aGV0aGVyIHRoaXMgYnJvd3NlciBzdXBwb3J0cyBydW5uaW5nIHRoZSBmdWxsIERPTVB1cmlmeS5cbiAgICovXG4gIERPTVB1cmlmeS5pc1N1cHBvcnRlZCA9XG4gICAgdHlwZW9mIGVudHJpZXMgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2YgZ2V0UGFyZW50Tm9kZSA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIGltcGxlbWVudGF0aW9uICYmXG4gICAgaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50ICE9PSB1bmRlZmluZWQ7XG5cbiAgY29uc3Qge1xuICAgIE1VU1RBQ0hFX0VYUFIsXG4gICAgRVJCX0VYUFIsXG4gICAgVE1QTElUX0VYUFIsXG4gICAgREFUQV9BVFRSLFxuICAgIEFSSUFfQVRUUixcbiAgICBJU19TQ1JJUFRfT1JfREFUQSxcbiAgICBBVFRSX1dISVRFU1BBQ0UsXG4gICAgQ1VTVE9NX0VMRU1FTlQsXG4gIH0gPSBFWFBSRVNTSU9OUztcblxuICBsZXQgeyBJU19BTExPV0VEX1VSSSB9ID0gRVhQUkVTU0lPTlM7XG5cbiAgLyoqXG4gICAqIFdlIGNvbnNpZGVyIHRoZSBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBiZWxvdyB0byBiZSBzYWZlLiBJZGVhbGx5XG4gICAqIGRvbid0IGFkZCBhbnkgbmV3IG9uZXMgYnV0IGZlZWwgZnJlZSB0byByZW1vdmUgdW53YW50ZWQgb25lcy5cbiAgICovXG5cbiAgLyogYWxsb3dlZCBlbGVtZW50IG5hbWVzICovXG4gIGxldCBBTExPV0VEX1RBR1MgPSBudWxsO1xuICBjb25zdCBERUZBVUxUX0FMTE9XRURfVEFHUyA9IGFkZFRvU2V0KHt9LCBbXG4gICAgLi4uVEFHUy5odG1sLFxuICAgIC4uLlRBR1Muc3ZnLFxuICAgIC4uLlRBR1Muc3ZnRmlsdGVycyxcbiAgICAuLi5UQUdTLm1hdGhNbCxcbiAgICAuLi5UQUdTLnRleHQsXG4gIF0pO1xuXG4gIC8qIEFsbG93ZWQgYXR0cmlidXRlIG5hbWVzICovXG4gIGxldCBBTExPV0VEX0FUVFIgPSBudWxsO1xuICBjb25zdCBERUZBVUxUX0FMTE9XRURfQVRUUiA9IGFkZFRvU2V0KHt9LCBbXG4gICAgLi4uQVRUUlMuaHRtbCxcbiAgICAuLi5BVFRSUy5zdmcsXG4gICAgLi4uQVRUUlMubWF0aE1sLFxuICAgIC4uLkFUVFJTLnhtbCxcbiAgXSk7XG5cbiAgLypcbiAgICogQ29uZmlndXJlIGhvdyBET01QdXJpZnkgc2hvdWxkIGhhbmRsZSBjdXN0b20gZWxlbWVudHMgYW5kIHRoZWlyIGF0dHJpYnV0ZXMgYXMgd2VsbCBhcyBjdXN0b21pemVkIGJ1aWx0LWluIGVsZW1lbnRzLlxuICAgKiBAcHJvcGVydHkge1JlZ0V4cHxGdW5jdGlvbnxudWxsfSB0YWdOYW1lQ2hlY2sgb25lIG9mIFtudWxsLCByZWdleFBhdHRlcm4sIHByZWRpY2F0ZV0uIERlZmF1bHQ6IGBudWxsYCAoZGlzYWxsb3cgYW55IGN1c3RvbSBlbGVtZW50cylcbiAgICogQHByb3BlcnR5IHtSZWdFeHB8RnVuY3Rpb258bnVsbH0gYXR0cmlidXRlTmFtZUNoZWNrIG9uZSBvZiBbbnVsbCwgcmVnZXhQYXR0ZXJuLCBwcmVkaWNhdGVdLiBEZWZhdWx0OiBgbnVsbGAgKGRpc2FsbG93IGFueSBhdHRyaWJ1dGVzIG5vdCBvbiB0aGUgYWxsb3cgbGlzdClcbiAgICogQHByb3BlcnR5IHtib29sZWFufSBhbGxvd0N1c3RvbWl6ZWRCdWlsdEluRWxlbWVudHMgYWxsb3cgY3VzdG9tIGVsZW1lbnRzIGRlcml2ZWQgZnJvbSBidWlsdC1pbnMgaWYgdGhleSBwYXNzIENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVjay4gRGVmYXVsdDogYGZhbHNlYC5cbiAgICovXG4gIGxldCBDVVNUT01fRUxFTUVOVF9IQU5ETElORyA9IE9iamVjdC5zZWFsKFxuICAgIGNyZWF0ZShudWxsLCB7XG4gICAgICB0YWdOYW1lQ2hlY2s6IHtcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgfSxcbiAgICAgIGF0dHJpYnV0ZU5hbWVDaGVjazoge1xuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IG51bGwsXG4gICAgICB9LFxuICAgICAgYWxsb3dDdXN0b21pemVkQnVpbHRJbkVsZW1lbnRzOiB7XG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogZmFsc2UsXG4gICAgICB9LFxuICAgIH0pXG4gICk7XG5cbiAgLyogRXhwbGljaXRseSBmb3JiaWRkZW4gdGFncyAob3ZlcnJpZGVzIEFMTE9XRURfVEFHUy9BRERfVEFHUykgKi9cbiAgbGV0IEZPUkJJRF9UQUdTID0gbnVsbDtcblxuICAvKiBFeHBsaWNpdGx5IGZvcmJpZGRlbiBhdHRyaWJ1dGVzIChvdmVycmlkZXMgQUxMT1dFRF9BVFRSL0FERF9BVFRSKSAqL1xuICBsZXQgRk9SQklEX0FUVFIgPSBudWxsO1xuXG4gIC8qIENvbmZpZyBvYmplY3QgdG8gc3RvcmUgQUREX1RBR1MvQUREX0FUVFIgZnVuY3Rpb25zICh3aGVuIHVzZWQgYXMgZnVuY3Rpb25zKSAqL1xuICBjb25zdCBFWFRSQV9FTEVNRU5UX0hBTkRMSU5HID0gT2JqZWN0LnNlYWwoXG4gICAgY3JlYXRlKG51bGwsIHtcbiAgICAgIHRhZ0NoZWNrOiB7XG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogbnVsbCxcbiAgICAgIH0sXG4gICAgICBhdHRyaWJ1dGVDaGVjazoge1xuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IG51bGwsXG4gICAgICB9LFxuICAgIH0pXG4gICk7XG5cbiAgLyogRGVjaWRlIGlmIEFSSUEgYXR0cmlidXRlcyBhcmUgb2theSAqL1xuICBsZXQgQUxMT1dfQVJJQV9BVFRSID0gdHJ1ZTtcblxuICAvKiBEZWNpZGUgaWYgY3VzdG9tIGRhdGEgYXR0cmlidXRlcyBhcmUgb2theSAqL1xuICBsZXQgQUxMT1dfREFUQV9BVFRSID0gdHJ1ZTtcblxuICAvKiBEZWNpZGUgaWYgdW5rbm93biBwcm90b2NvbHMgYXJlIG9rYXkgKi9cbiAgbGV0IEFMTE9XX1VOS05PV05fUFJPVE9DT0xTID0gZmFsc2U7XG5cbiAgLyogRGVjaWRlIGlmIHNlbGYtY2xvc2luZyB0YWdzIGluIGF0dHJpYnV0ZXMgYXJlIGFsbG93ZWQuXG4gICAqIFVzdWFsbHkgcmVtb3ZlZCBkdWUgdG8gYSBtWFNTIGlzc3VlIGluIGpRdWVyeSAzLjAgKi9cbiAgbGV0IEFMTE9XX1NFTEZfQ0xPU0VfSU5fQVRUUiA9IHRydWU7XG5cbiAgLyogT3V0cHV0IHNob3VsZCBiZSBzYWZlIGZvciBjb21tb24gdGVtcGxhdGUgZW5naW5lcy5cbiAgICogVGhpcyBtZWFucywgRE9NUHVyaWZ5IHJlbW92ZXMgZGF0YSBhdHRyaWJ1dGVzLCBtdXN0YWNoZXMgYW5kIEVSQlxuICAgKi9cbiAgbGV0IFNBRkVfRk9SX1RFTVBMQVRFUyA9IGZhbHNlO1xuXG4gIC8qIE91dHB1dCBzaG91bGQgYmUgc2FmZSBldmVuIGZvciBYTUwgdXNlZCB3aXRoaW4gSFRNTCBhbmQgYWxpa2UuXG4gICAqIFRoaXMgbWVhbnMsIERPTVB1cmlmeSByZW1vdmVzIGNvbW1lbnRzIHdoZW4gY29udGFpbmluZyByaXNreSBjb250ZW50LlxuICAgKi9cbiAgbGV0IFNBRkVfRk9SX1hNTCA9IHRydWU7XG5cbiAgLyogRGVjaWRlIGlmIGRvY3VtZW50IHdpdGggPGh0bWw+Li4uIHNob3VsZCBiZSByZXR1cm5lZCAqL1xuICBsZXQgV0hPTEVfRE9DVU1FTlQgPSBmYWxzZTtcblxuICAvKiBUcmFjayB3aGV0aGVyIGNvbmZpZyBpcyBhbHJlYWR5IHNldCBvbiB0aGlzIGluc3RhbmNlIG9mIERPTVB1cmlmeS4gKi9cbiAgbGV0IFNFVF9DT05GSUcgPSBmYWxzZTtcblxuICAvKiBEZWNpZGUgaWYgYWxsIGVsZW1lbnRzIChlLmcuIHN0eWxlLCBzY3JpcHQpIG11c3QgYmUgY2hpbGRyZW4gb2ZcbiAgICogZG9jdW1lbnQuYm9keS4gQnkgZGVmYXVsdCwgYnJvd3NlcnMgbWlnaHQgbW92ZSB0aGVtIHRvIGRvY3VtZW50LmhlYWQgKi9cbiAgbGV0IEZPUkNFX0JPRFkgPSBmYWxzZTtcblxuICAvKiBEZWNpZGUgaWYgYSBET00gYEhUTUxCb2R5RWxlbWVudGAgc2hvdWxkIGJlIHJldHVybmVkLCBpbnN0ZWFkIG9mIGEgaHRtbFxuICAgKiBzdHJpbmcgKG9yIGEgVHJ1c3RlZEhUTUwgb2JqZWN0IGlmIFRydXN0ZWQgVHlwZXMgYXJlIHN1cHBvcnRlZCkuXG4gICAqIElmIGBXSE9MRV9ET0NVTUVOVGAgaXMgZW5hYmxlZCBhIGBIVE1MSHRtbEVsZW1lbnRgIHdpbGwgYmUgcmV0dXJuZWQgaW5zdGVhZFxuICAgKi9cbiAgbGV0IFJFVFVSTl9ET00gPSBmYWxzZTtcblxuICAvKiBEZWNpZGUgaWYgYSBET00gYERvY3VtZW50RnJhZ21lbnRgIHNob3VsZCBiZSByZXR1cm5lZCwgaW5zdGVhZCBvZiBhIGh0bWxcbiAgICogc3RyaW5nICAob3IgYSBUcnVzdGVkSFRNTCBvYmplY3QgaWYgVHJ1c3RlZCBUeXBlcyBhcmUgc3VwcG9ydGVkKSAqL1xuICBsZXQgUkVUVVJOX0RPTV9GUkFHTUVOVCA9IGZhbHNlO1xuXG4gIC8qIFRyeSB0byByZXR1cm4gYSBUcnVzdGVkIFR5cGUgb2JqZWN0IGluc3RlYWQgb2YgYSBzdHJpbmcsIHJldHVybiBhIHN0cmluZyBpblxuICAgKiBjYXNlIFRydXN0ZWQgVHlwZXMgYXJlIG5vdCBzdXBwb3J0ZWQgICovXG4gIGxldCBSRVRVUk5fVFJVU1RFRF9UWVBFID0gZmFsc2U7XG5cbiAgLyogT3V0cHV0IHNob3VsZCBiZSBmcmVlIGZyb20gRE9NIGNsb2JiZXJpbmcgYXR0YWNrcz9cbiAgICogVGhpcyBzYW5pdGl6ZXMgbWFya3VwcyBuYW1lZCB3aXRoIGNvbGxpZGluZywgY2xvYmJlcmFibGUgYnVpbHQtaW4gRE9NIEFQSXMuXG4gICAqL1xuICBsZXQgU0FOSVRJWkVfRE9NID0gdHJ1ZTtcblxuICAvKiBBY2hpZXZlIGZ1bGwgRE9NIENsb2JiZXJpbmcgcHJvdGVjdGlvbiBieSBpc29sYXRpbmcgdGhlIG5hbWVzcGFjZSBvZiBuYW1lZFxuICAgKiBwcm9wZXJ0aWVzIGFuZCBKUyB2YXJpYWJsZXMsIG1pdGlnYXRpbmcgYXR0YWNrcyB0aGF0IGFidXNlIHRoZSBIVE1ML0RPTSBzcGVjIHJ1bGVzLlxuICAgKlxuICAgKiBIVE1ML0RPTSBzcGVjIHJ1bGVzIHRoYXQgZW5hYmxlIERPTSBDbG9iYmVyaW5nOlxuICAgKiAgIC0gTmFtZWQgQWNjZXNzIG9uIFdpbmRvdyAowqc3LjMuMylcbiAgICogICAtIERPTSBUcmVlIEFjY2Vzc29ycyAowqczLjEuNSlcbiAgICogICAtIEZvcm0gRWxlbWVudCBQYXJlbnQtQ2hpbGQgUmVsYXRpb25zICjCpzQuMTAuMylcbiAgICogICAtIElmcmFtZSBzcmNkb2MgLyBOZXN0ZWQgV2luZG93UHJveGllcyAowqc0LjguNSlcbiAgICogICAtIEhUTUxDb2xsZWN0aW9uICjCpzQuMi4xMC4yKVxuICAgKlxuICAgKiBOYW1lc3BhY2UgaXNvbGF0aW9uIGlzIGltcGxlbWVudGVkIGJ5IHByZWZpeGluZyBgaWRgIGFuZCBgbmFtZWAgYXR0cmlidXRlc1xuICAgKiB3aXRoIGEgY29uc3RhbnQgc3RyaW5nLCBpLmUuLCBgdXNlci1jb250ZW50LWBcbiAgICovXG4gIGxldCBTQU5JVElaRV9OQU1FRF9QUk9QUyA9IGZhbHNlO1xuICBjb25zdCBTQU5JVElaRV9OQU1FRF9QUk9QU19QUkVGSVggPSAndXNlci1jb250ZW50LSc7XG5cbiAgLyogS2VlcCBlbGVtZW50IGNvbnRlbnQgd2hlbiByZW1vdmluZyBlbGVtZW50PyAqL1xuICBsZXQgS0VFUF9DT05URU5UID0gdHJ1ZTtcblxuICAvKiBJZiBhIGBOb2RlYCBpcyBwYXNzZWQgdG8gc2FuaXRpemUoKSwgdGhlbiBwZXJmb3JtcyBzYW5pdGl6YXRpb24gaW4tcGxhY2UgaW5zdGVhZFxuICAgKiBvZiBpbXBvcnRpbmcgaXQgaW50byBhIG5ldyBEb2N1bWVudCBhbmQgcmV0dXJuaW5nIGEgc2FuaXRpemVkIGNvcHkgKi9cbiAgbGV0IElOX1BMQUNFID0gZmFsc2U7XG5cbiAgLyogQWxsb3cgdXNhZ2Ugb2YgcHJvZmlsZXMgbGlrZSBodG1sLCBzdmcgYW5kIG1hdGhNbCAqL1xuICBsZXQgVVNFX1BST0ZJTEVTOiBVc2VQcm9maWxlc0NvbmZpZyB8IGZhbHNlID0ge307XG5cbiAgLyogVGFncyB0byBpZ25vcmUgY29udGVudCBvZiB3aGVuIEtFRVBfQ09OVEVOVCBpcyB0cnVlICovXG4gIGxldCBGT1JCSURfQ09OVEVOVFMgPSBudWxsO1xuICBjb25zdCBERUZBVUxUX0ZPUkJJRF9DT05URU5UUyA9IGFkZFRvU2V0KHt9LCBbXG4gICAgJ2Fubm90YXRpb24teG1sJyxcbiAgICAnYXVkaW8nLFxuICAgICdjb2xncm91cCcsXG4gICAgJ2Rlc2MnLFxuICAgICdmb3JlaWdub2JqZWN0JyxcbiAgICAnaGVhZCcsXG4gICAgJ2lmcmFtZScsXG4gICAgJ21hdGgnLFxuICAgICdtaScsXG4gICAgJ21uJyxcbiAgICAnbW8nLFxuICAgICdtcycsXG4gICAgJ210ZXh0JyxcbiAgICAnbm9lbWJlZCcsXG4gICAgJ25vZnJhbWVzJyxcbiAgICAnbm9zY3JpcHQnLFxuICAgICdwbGFpbnRleHQnLFxuICAgICdzY3JpcHQnLFxuICAgICdzdHlsZScsXG4gICAgJ3N2ZycsXG4gICAgJ3RlbXBsYXRlJyxcbiAgICAndGhlYWQnLFxuICAgICd0aXRsZScsXG4gICAgJ3ZpZGVvJyxcbiAgICAneG1wJyxcbiAgXSk7XG5cbiAgLyogVGFncyB0aGF0IGFyZSBzYWZlIGZvciBkYXRhOiBVUklzICovXG4gIGxldCBEQVRBX1VSSV9UQUdTID0gbnVsbDtcbiAgY29uc3QgREVGQVVMVF9EQVRBX1VSSV9UQUdTID0gYWRkVG9TZXQoe30sIFtcbiAgICAnYXVkaW8nLFxuICAgICd2aWRlbycsXG4gICAgJ2ltZycsXG4gICAgJ3NvdXJjZScsXG4gICAgJ2ltYWdlJyxcbiAgICAndHJhY2snLFxuICBdKTtcblxuICAvKiBBdHRyaWJ1dGVzIHNhZmUgZm9yIHZhbHVlcyBsaWtlIFwiamF2YXNjcmlwdDpcIiAqL1xuICBsZXQgVVJJX1NBRkVfQVRUUklCVVRFUyA9IG51bGw7XG4gIGNvbnN0IERFRkFVTFRfVVJJX1NBRkVfQVRUUklCVVRFUyA9IGFkZFRvU2V0KHt9LCBbXG4gICAgJ2FsdCcsXG4gICAgJ2NsYXNzJyxcbiAgICAnZm9yJyxcbiAgICAnaWQnLFxuICAgICdsYWJlbCcsXG4gICAgJ25hbWUnLFxuICAgICdwYXR0ZXJuJyxcbiAgICAncGxhY2Vob2xkZXInLFxuICAgICdyb2xlJyxcbiAgICAnc3VtbWFyeScsXG4gICAgJ3RpdGxlJyxcbiAgICAndmFsdWUnLFxuICAgICdzdHlsZScsXG4gICAgJ3htbG5zJyxcbiAgXSk7XG5cbiAgY29uc3QgTUFUSE1MX05BTUVTUEFDRSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MJztcbiAgY29uc3QgU1ZHX05BTUVTUEFDRSA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc7XG4gIGNvbnN0IEhUTUxfTkFNRVNQQUNFID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnO1xuICAvKiBEb2N1bWVudCBuYW1lc3BhY2UgKi9cbiAgbGV0IE5BTUVTUEFDRSA9IEhUTUxfTkFNRVNQQUNFO1xuICBsZXQgSVNfRU1QVFlfSU5QVVQgPSBmYWxzZTtcblxuICAvKiBBbGxvd2VkIFhIVE1MK1hNTCBuYW1lc3BhY2VzICovXG4gIGxldCBBTExPV0VEX05BTUVTUEFDRVMgPSBudWxsO1xuICBjb25zdCBERUZBVUxUX0FMTE9XRURfTkFNRVNQQUNFUyA9IGFkZFRvU2V0KFxuICAgIHt9LFxuICAgIFtNQVRITUxfTkFNRVNQQUNFLCBTVkdfTkFNRVNQQUNFLCBIVE1MX05BTUVTUEFDRV0sXG4gICAgc3RyaW5nVG9TdHJpbmdcbiAgKTtcblxuICBsZXQgTUFUSE1MX1RFWFRfSU5URUdSQVRJT05fUE9JTlRTID0gYWRkVG9TZXQoe30sIFtcbiAgICAnbWknLFxuICAgICdtbycsXG4gICAgJ21uJyxcbiAgICAnbXMnLFxuICAgICdtdGV4dCcsXG4gIF0pO1xuXG4gIGxldCBIVE1MX0lOVEVHUkFUSU9OX1BPSU5UUyA9IGFkZFRvU2V0KHt9LCBbJ2Fubm90YXRpb24teG1sJ10pO1xuXG4gIC8vIENlcnRhaW4gZWxlbWVudHMgYXJlIGFsbG93ZWQgaW4gYm90aCBTVkcgYW5kIEhUTUxcbiAgLy8gbmFtZXNwYWNlLiBXZSBuZWVkIHRvIHNwZWNpZnkgdGhlbSBleHBsaWNpdGx5XG4gIC8vIHNvIHRoYXQgdGhleSBkb24ndCBnZXQgZXJyb25lb3VzbHkgZGVsZXRlZCBmcm9tXG4gIC8vIEhUTUwgbmFtZXNwYWNlLlxuICBjb25zdCBDT01NT05fU1ZHX0FORF9IVE1MX0VMRU1FTlRTID0gYWRkVG9TZXQoe30sIFtcbiAgICAndGl0bGUnLFxuICAgICdzdHlsZScsXG4gICAgJ2ZvbnQnLFxuICAgICdhJyxcbiAgICAnc2NyaXB0JyxcbiAgXSk7XG5cbiAgLyogUGFyc2luZyBvZiBzdHJpY3QgWEhUTUwgZG9jdW1lbnRzICovXG4gIGxldCBQQVJTRVJfTUVESUFfVFlQRTogbnVsbCB8IERPTVBhcnNlclN1cHBvcnRlZFR5cGUgPSBudWxsO1xuICBjb25zdCBTVVBQT1JURURfUEFSU0VSX01FRElBX1RZUEVTID0gWydhcHBsaWNhdGlvbi94aHRtbCt4bWwnLCAndGV4dC9odG1sJ107XG4gIGNvbnN0IERFRkFVTFRfUEFSU0VSX01FRElBX1RZUEUgPSAndGV4dC9odG1sJztcbiAgbGV0IHRyYW5zZm9ybUNhc2VGdW5jOiBudWxsIHwgUGFyYW1ldGVyczx0eXBlb2YgYWRkVG9TZXQ+WzJdID0gbnVsbDtcblxuICAvKiBLZWVwIGEgcmVmZXJlbmNlIHRvIGNvbmZpZyB0byBwYXNzIHRvIGhvb2tzICovXG4gIGxldCBDT05GSUc6IENvbmZpZyB8IG51bGwgPSBudWxsO1xuXG4gIC8qIElkZWFsbHksIGRvIG5vdCB0b3VjaCBhbnl0aGluZyBiZWxvdyB0aGlzIGxpbmUgKi9cbiAgLyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqL1xuXG4gIGNvbnN0IGZvcm1FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZm9ybScpO1xuXG4gIGNvbnN0IGlzUmVnZXhPckZ1bmN0aW9uID0gZnVuY3Rpb24gKFxuICAgIHRlc3RWYWx1ZTogdW5rbm93blxuICApOiB0ZXN0VmFsdWUgaXMgRnVuY3Rpb24gfCBSZWdFeHAge1xuICAgIHJldHVybiB0ZXN0VmFsdWUgaW5zdGFuY2VvZiBSZWdFeHAgfHwgdGVzdFZhbHVlIGluc3RhbmNlb2YgRnVuY3Rpb247XG4gIH07XG5cbiAgLyoqXG4gICAqIF9wYXJzZUNvbmZpZ1xuICAgKlxuICAgKiBAcGFyYW0gY2ZnIG9wdGlvbmFsIGNvbmZpZyBsaXRlcmFsXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuICBjb25zdCBfcGFyc2VDb25maWcgPSBmdW5jdGlvbiAoY2ZnOiBDb25maWcgPSB7fSk6IHZvaWQge1xuICAgIGlmIChDT05GSUcgJiYgQ09ORklHID09PSBjZmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvKiBTaGllbGQgY29uZmlndXJhdGlvbiBvYmplY3QgZnJvbSB0YW1wZXJpbmcgKi9cbiAgICBpZiAoIWNmZyB8fCB0eXBlb2YgY2ZnICE9PSAnb2JqZWN0Jykge1xuICAgICAgY2ZnID0ge307XG4gICAgfVxuXG4gICAgLyogU2hpZWxkIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGZyb20gcHJvdG90eXBlIHBvbGx1dGlvbiAqL1xuICAgIGNmZyA9IGNsb25lKGNmZyk7XG5cbiAgICBQQVJTRVJfTUVESUFfVFlQRSA9XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9wcmVmZXItaW5jbHVkZXNcbiAgICAgIFNVUFBPUlRFRF9QQVJTRVJfTUVESUFfVFlQRVMuaW5kZXhPZihjZmcuUEFSU0VSX01FRElBX1RZUEUpID09PSAtMVxuICAgICAgICA/IERFRkFVTFRfUEFSU0VSX01FRElBX1RZUEVcbiAgICAgICAgOiBjZmcuUEFSU0VSX01FRElBX1RZUEU7XG5cbiAgICAvLyBIVE1MIHRhZ3MgYW5kIGF0dHJpYnV0ZXMgYXJlIG5vdCBjYXNlLXNlbnNpdGl2ZSwgY29udmVydGluZyB0byBsb3dlcmNhc2UuIEtlZXBpbmcgWEhUTUwgYXMgaXMuXG4gICAgdHJhbnNmb3JtQ2FzZUZ1bmMgPVxuICAgICAgUEFSU0VSX01FRElBX1RZUEUgPT09ICdhcHBsaWNhdGlvbi94aHRtbCt4bWwnXG4gICAgICAgID8gc3RyaW5nVG9TdHJpbmdcbiAgICAgICAgOiBzdHJpbmdUb0xvd2VyQ2FzZTtcblxuICAgIC8qIFNldCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgKi9cbiAgICBBTExPV0VEX1RBR1MgPSBvYmplY3RIYXNPd25Qcm9wZXJ0eShjZmcsICdBTExPV0VEX1RBR1MnKVxuICAgICAgPyBhZGRUb1NldCh7fSwgY2ZnLkFMTE9XRURfVEFHUywgdHJhbnNmb3JtQ2FzZUZ1bmMpXG4gICAgICA6IERFRkFVTFRfQUxMT1dFRF9UQUdTO1xuICAgIEFMTE9XRURfQVRUUiA9IG9iamVjdEhhc093blByb3BlcnR5KGNmZywgJ0FMTE9XRURfQVRUUicpXG4gICAgICA/IGFkZFRvU2V0KHt9LCBjZmcuQUxMT1dFRF9BVFRSLCB0cmFuc2Zvcm1DYXNlRnVuYylcbiAgICAgIDogREVGQVVMVF9BTExPV0VEX0FUVFI7XG4gICAgQUxMT1dFRF9OQU1FU1BBQ0VTID0gb2JqZWN0SGFzT3duUHJvcGVydHkoY2ZnLCAnQUxMT1dFRF9OQU1FU1BBQ0VTJylcbiAgICAgID8gYWRkVG9TZXQoe30sIGNmZy5BTExPV0VEX05BTUVTUEFDRVMsIHN0cmluZ1RvU3RyaW5nKVxuICAgICAgOiBERUZBVUxUX0FMTE9XRURfTkFNRVNQQUNFUztcbiAgICBVUklfU0FGRV9BVFRSSUJVVEVTID0gb2JqZWN0SGFzT3duUHJvcGVydHkoY2ZnLCAnQUREX1VSSV9TQUZFX0FUVFInKVxuICAgICAgPyBhZGRUb1NldChcbiAgICAgICAgICBjbG9uZShERUZBVUxUX1VSSV9TQUZFX0FUVFJJQlVURVMpLFxuICAgICAgICAgIGNmZy5BRERfVVJJX1NBRkVfQVRUUixcbiAgICAgICAgICB0cmFuc2Zvcm1DYXNlRnVuY1xuICAgICAgICApXG4gICAgICA6IERFRkFVTFRfVVJJX1NBRkVfQVRUUklCVVRFUztcbiAgICBEQVRBX1VSSV9UQUdTID0gb2JqZWN0SGFzT3duUHJvcGVydHkoY2ZnLCAnQUREX0RBVEFfVVJJX1RBR1MnKVxuICAgICAgPyBhZGRUb1NldChcbiAgICAgICAgICBjbG9uZShERUZBVUxUX0RBVEFfVVJJX1RBR1MpLFxuICAgICAgICAgIGNmZy5BRERfREFUQV9VUklfVEFHUyxcbiAgICAgICAgICB0cmFuc2Zvcm1DYXNlRnVuY1xuICAgICAgICApXG4gICAgICA6IERFRkFVTFRfREFUQV9VUklfVEFHUztcbiAgICBGT1JCSURfQ09OVEVOVFMgPSBvYmplY3RIYXNPd25Qcm9wZXJ0eShjZmcsICdGT1JCSURfQ09OVEVOVFMnKVxuICAgICAgPyBhZGRUb1NldCh7fSwgY2ZnLkZPUkJJRF9DT05URU5UUywgdHJhbnNmb3JtQ2FzZUZ1bmMpXG4gICAgICA6IERFRkFVTFRfRk9SQklEX0NPTlRFTlRTO1xuICAgIEZPUkJJRF9UQUdTID0gb2JqZWN0SGFzT3duUHJvcGVydHkoY2ZnLCAnRk9SQklEX1RBR1MnKVxuICAgICAgPyBhZGRUb1NldCh7fSwgY2ZnLkZPUkJJRF9UQUdTLCB0cmFuc2Zvcm1DYXNlRnVuYylcbiAgICAgIDogY2xvbmUoe30pO1xuICAgIEZPUkJJRF9BVFRSID0gb2JqZWN0SGFzT3duUHJvcGVydHkoY2ZnLCAnRk9SQklEX0FUVFInKVxuICAgICAgPyBhZGRUb1NldCh7fSwgY2ZnLkZPUkJJRF9BVFRSLCB0cmFuc2Zvcm1DYXNlRnVuYylcbiAgICAgIDogY2xvbmUoe30pO1xuICAgIFVTRV9QUk9GSUxFUyA9IG9iamVjdEhhc093blByb3BlcnR5KGNmZywgJ1VTRV9QUk9GSUxFUycpXG4gICAgICA/IGNmZy5VU0VfUFJPRklMRVNcbiAgICAgIDogZmFsc2U7XG4gICAgQUxMT1dfQVJJQV9BVFRSID0gY2ZnLkFMTE9XX0FSSUFfQVRUUiAhPT0gZmFsc2U7IC8vIERlZmF1bHQgdHJ1ZVxuICAgIEFMTE9XX0RBVEFfQVRUUiA9IGNmZy5BTExPV19EQVRBX0FUVFIgIT09IGZhbHNlOyAvLyBEZWZhdWx0IHRydWVcbiAgICBBTExPV19VTktOT1dOX1BST1RPQ09MUyA9IGNmZy5BTExPV19VTktOT1dOX1BST1RPQ09MUyB8fCBmYWxzZTsgLy8gRGVmYXVsdCBmYWxzZVxuICAgIEFMTE9XX1NFTEZfQ0xPU0VfSU5fQVRUUiA9IGNmZy5BTExPV19TRUxGX0NMT1NFX0lOX0FUVFIgIT09IGZhbHNlOyAvLyBEZWZhdWx0IHRydWVcbiAgICBTQUZFX0ZPUl9URU1QTEFURVMgPSBjZmcuU0FGRV9GT1JfVEVNUExBVEVTIHx8IGZhbHNlOyAvLyBEZWZhdWx0IGZhbHNlXG4gICAgU0FGRV9GT1JfWE1MID0gY2ZnLlNBRkVfRk9SX1hNTCAhPT0gZmFsc2U7IC8vIERlZmF1bHQgdHJ1ZVxuICAgIFdIT0xFX0RPQ1VNRU5UID0gY2ZnLldIT0xFX0RPQ1VNRU5UIHx8IGZhbHNlOyAvLyBEZWZhdWx0IGZhbHNlXG4gICAgUkVUVVJOX0RPTSA9IGNmZy5SRVRVUk5fRE9NIHx8IGZhbHNlOyAvLyBEZWZhdWx0IGZhbHNlXG4gICAgUkVUVVJOX0RPTV9GUkFHTUVOVCA9IGNmZy5SRVRVUk5fRE9NX0ZSQUdNRU5UIHx8IGZhbHNlOyAvLyBEZWZhdWx0IGZhbHNlXG4gICAgUkVUVVJOX1RSVVNURURfVFlQRSA9IGNmZy5SRVRVUk5fVFJVU1RFRF9UWVBFIHx8IGZhbHNlOyAvLyBEZWZhdWx0IGZhbHNlXG4gICAgRk9SQ0VfQk9EWSA9IGNmZy5GT1JDRV9CT0RZIHx8IGZhbHNlOyAvLyBEZWZhdWx0IGZhbHNlXG4gICAgU0FOSVRJWkVfRE9NID0gY2ZnLlNBTklUSVpFX0RPTSAhPT0gZmFsc2U7IC8vIERlZmF1bHQgdHJ1ZVxuICAgIFNBTklUSVpFX05BTUVEX1BST1BTID0gY2ZnLlNBTklUSVpFX05BTUVEX1BST1BTIHx8IGZhbHNlOyAvLyBEZWZhdWx0IGZhbHNlXG4gICAgS0VFUF9DT05URU5UID0gY2ZnLktFRVBfQ09OVEVOVCAhPT0gZmFsc2U7IC8vIERlZmF1bHQgdHJ1ZVxuICAgIElOX1BMQUNFID0gY2ZnLklOX1BMQUNFIHx8IGZhbHNlOyAvLyBEZWZhdWx0IGZhbHNlXG4gICAgSVNfQUxMT1dFRF9VUkkgPSBjZmcuQUxMT1dFRF9VUklfUkVHRVhQIHx8IEVYUFJFU1NJT05TLklTX0FMTE9XRURfVVJJO1xuICAgIE5BTUVTUEFDRSA9IGNmZy5OQU1FU1BBQ0UgfHwgSFRNTF9OQU1FU1BBQ0U7XG4gICAgTUFUSE1MX1RFWFRfSU5URUdSQVRJT05fUE9JTlRTID1cbiAgICAgIGNmZy5NQVRITUxfVEVYVF9JTlRFR1JBVElPTl9QT0lOVFMgfHwgTUFUSE1MX1RFWFRfSU5URUdSQVRJT05fUE9JTlRTO1xuICAgIEhUTUxfSU5URUdSQVRJT05fUE9JTlRTID1cbiAgICAgIGNmZy5IVE1MX0lOVEVHUkFUSU9OX1BPSU5UUyB8fCBIVE1MX0lOVEVHUkFUSU9OX1BPSU5UUztcblxuICAgIENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HID0gY2ZnLkNVU1RPTV9FTEVNRU5UX0hBTkRMSU5HIHx8IHt9O1xuICAgIGlmIChcbiAgICAgIGNmZy5DVVNUT01fRUxFTUVOVF9IQU5ETElORyAmJlxuICAgICAgaXNSZWdleE9yRnVuY3Rpb24oY2ZnLkNVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVjaylcbiAgICApIHtcbiAgICAgIENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVjayA9XG4gICAgICAgIGNmZy5DVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2s7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgY2ZnLkNVU1RPTV9FTEVNRU5UX0hBTkRMSU5HICYmXG4gICAgICBpc1JlZ2V4T3JGdW5jdGlvbihjZmcuQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcuYXR0cmlidXRlTmFtZUNoZWNrKVxuICAgICkge1xuICAgICAgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcuYXR0cmlidXRlTmFtZUNoZWNrID1cbiAgICAgICAgY2ZnLkNVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLmF0dHJpYnV0ZU5hbWVDaGVjaztcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBjZmcuQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcgJiZcbiAgICAgIHR5cGVvZiBjZmcuQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcuYWxsb3dDdXN0b21pemVkQnVpbHRJbkVsZW1lbnRzID09PVxuICAgICAgICAnYm9vbGVhbidcbiAgICApIHtcbiAgICAgIENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLmFsbG93Q3VzdG9taXplZEJ1aWx0SW5FbGVtZW50cyA9XG4gICAgICAgIGNmZy5DVVNUT01fRUxFTUVOVF9IQU5ETElORy5hbGxvd0N1c3RvbWl6ZWRCdWlsdEluRWxlbWVudHM7XG4gICAgfVxuXG4gICAgaWYgKFNBRkVfRk9SX1RFTVBMQVRFUykge1xuICAgICAgQUxMT1dfREFUQV9BVFRSID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKFJFVFVSTl9ET01fRlJBR01FTlQpIHtcbiAgICAgIFJFVFVSTl9ET00gPSB0cnVlO1xuICAgIH1cblxuICAgIC8qIFBhcnNlIHByb2ZpbGUgaW5mbyAqL1xuICAgIGlmIChVU0VfUFJPRklMRVMpIHtcbiAgICAgIEFMTE9XRURfVEFHUyA9IGFkZFRvU2V0KHt9LCBUQUdTLnRleHQpO1xuICAgICAgQUxMT1dFRF9BVFRSID0gY3JlYXRlKG51bGwpO1xuICAgICAgaWYgKFVTRV9QUk9GSUxFUy5odG1sID09PSB0cnVlKSB7XG4gICAgICAgIGFkZFRvU2V0KEFMTE9XRURfVEFHUywgVEFHUy5odG1sKTtcbiAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9BVFRSLCBBVFRSUy5odG1sKTtcbiAgICAgIH1cblxuICAgICAgaWYgKFVTRV9QUk9GSUxFUy5zdmcgPT09IHRydWUpIHtcbiAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9UQUdTLCBUQUdTLnN2Zyk7XG4gICAgICAgIGFkZFRvU2V0KEFMTE9XRURfQVRUUiwgQVRUUlMuc3ZnKTtcbiAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9BVFRSLCBBVFRSUy54bWwpO1xuICAgICAgfVxuXG4gICAgICBpZiAoVVNFX1BST0ZJTEVTLnN2Z0ZpbHRlcnMgPT09IHRydWUpIHtcbiAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9UQUdTLCBUQUdTLnN2Z0ZpbHRlcnMpO1xuICAgICAgICBhZGRUb1NldChBTExPV0VEX0FUVFIsIEFUVFJTLnN2Zyk7XG4gICAgICAgIGFkZFRvU2V0KEFMTE9XRURfQVRUUiwgQVRUUlMueG1sKTtcbiAgICAgIH1cblxuICAgICAgaWYgKFVTRV9QUk9GSUxFUy5tYXRoTWwgPT09IHRydWUpIHtcbiAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9UQUdTLCBUQUdTLm1hdGhNbCk7XG4gICAgICAgIGFkZFRvU2V0KEFMTE9XRURfQVRUUiwgQVRUUlMubWF0aE1sKTtcbiAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9BVFRSLCBBVFRSUy54bWwpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qIFByZXZlbnQgZnVuY3Rpb24tYmFzZWQgQUREX0FUVFIgLyBBRERfVEFHUyBmcm9tIGxlYWtpbmcgYWNyb3NzIGNhbGxzICovXG4gICAgaWYgKCFvYmplY3RIYXNPd25Qcm9wZXJ0eShjZmcsICdBRERfVEFHUycpKSB7XG4gICAgICBFWFRSQV9FTEVNRU5UX0hBTkRMSU5HLnRhZ0NoZWNrID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoIW9iamVjdEhhc093blByb3BlcnR5KGNmZywgJ0FERF9BVFRSJykpIHtcbiAgICAgIEVYVFJBX0VMRU1FTlRfSEFORExJTkcuYXR0cmlidXRlQ2hlY2sgPSBudWxsO1xuICAgIH1cblxuICAgIC8qIE1lcmdlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyAqL1xuICAgIGlmIChjZmcuQUREX1RBR1MpIHtcbiAgICAgIGlmICh0eXBlb2YgY2ZnLkFERF9UQUdTID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIEVYVFJBX0VMRU1FTlRfSEFORExJTkcudGFnQ2hlY2sgPSBjZmcuQUREX1RBR1M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoQUxMT1dFRF9UQUdTID09PSBERUZBVUxUX0FMTE9XRURfVEFHUykge1xuICAgICAgICAgIEFMTE9XRURfVEFHUyA9IGNsb25lKEFMTE9XRURfVEFHUyk7XG4gICAgICAgIH1cblxuICAgICAgICBhZGRUb1NldChBTExPV0VEX1RBR1MsIGNmZy5BRERfVEFHUywgdHJhbnNmb3JtQ2FzZUZ1bmMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjZmcuQUREX0FUVFIpIHtcbiAgICAgIGlmICh0eXBlb2YgY2ZnLkFERF9BVFRSID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIEVYVFJBX0VMRU1FTlRfSEFORExJTkcuYXR0cmlidXRlQ2hlY2sgPSBjZmcuQUREX0FUVFI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoQUxMT1dFRF9BVFRSID09PSBERUZBVUxUX0FMTE9XRURfQVRUUikge1xuICAgICAgICAgIEFMTE9XRURfQVRUUiA9IGNsb25lKEFMTE9XRURfQVRUUik7XG4gICAgICAgIH1cblxuICAgICAgICBhZGRUb1NldChBTExPV0VEX0FUVFIsIGNmZy5BRERfQVRUUiwgdHJhbnNmb3JtQ2FzZUZ1bmMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjZmcuQUREX1VSSV9TQUZFX0FUVFIpIHtcbiAgICAgIGFkZFRvU2V0KFVSSV9TQUZFX0FUVFJJQlVURVMsIGNmZy5BRERfVVJJX1NBRkVfQVRUUiwgdHJhbnNmb3JtQ2FzZUZ1bmMpO1xuICAgIH1cblxuICAgIGlmIChjZmcuRk9SQklEX0NPTlRFTlRTKSB7XG4gICAgICBpZiAoRk9SQklEX0NPTlRFTlRTID09PSBERUZBVUxUX0ZPUkJJRF9DT05URU5UUykge1xuICAgICAgICBGT1JCSURfQ09OVEVOVFMgPSBjbG9uZShGT1JCSURfQ09OVEVOVFMpO1xuICAgICAgfVxuXG4gICAgICBhZGRUb1NldChGT1JCSURfQ09OVEVOVFMsIGNmZy5GT1JCSURfQ09OVEVOVFMsIHRyYW5zZm9ybUNhc2VGdW5jKTtcbiAgICB9XG5cbiAgICBpZiAoY2ZnLkFERF9GT1JCSURfQ09OVEVOVFMpIHtcbiAgICAgIGlmIChGT1JCSURfQ09OVEVOVFMgPT09IERFRkFVTFRfRk9SQklEX0NPTlRFTlRTKSB7XG4gICAgICAgIEZPUkJJRF9DT05URU5UUyA9IGNsb25lKEZPUkJJRF9DT05URU5UUyk7XG4gICAgICB9XG5cbiAgICAgIGFkZFRvU2V0KEZPUkJJRF9DT05URU5UUywgY2ZnLkFERF9GT1JCSURfQ09OVEVOVFMsIHRyYW5zZm9ybUNhc2VGdW5jKTtcbiAgICB9XG5cbiAgICAvKiBBZGQgI3RleHQgaW4gY2FzZSBLRUVQX0NPTlRFTlQgaXMgc2V0IHRvIHRydWUgKi9cbiAgICBpZiAoS0VFUF9DT05URU5UKSB7XG4gICAgICBBTExPV0VEX1RBR1NbJyN0ZXh0J10gPSB0cnVlO1xuICAgIH1cblxuICAgIC8qIEFkZCBodG1sLCBoZWFkIGFuZCBib2R5IHRvIEFMTE9XRURfVEFHUyBpbiBjYXNlIFdIT0xFX0RPQ1VNRU5UIGlzIHRydWUgKi9cbiAgICBpZiAoV0hPTEVfRE9DVU1FTlQpIHtcbiAgICAgIGFkZFRvU2V0KEFMTE9XRURfVEFHUywgWydodG1sJywgJ2hlYWQnLCAnYm9keSddKTtcbiAgICB9XG5cbiAgICAvKiBBZGQgdGJvZHkgdG8gQUxMT1dFRF9UQUdTIGluIGNhc2UgdGFibGVzIGFyZSBwZXJtaXR0ZWQsIHNlZSAjMjg2LCAjMzY1ICovXG4gICAgaWYgKEFMTE9XRURfVEFHUy50YWJsZSkge1xuICAgICAgYWRkVG9TZXQoQUxMT1dFRF9UQUdTLCBbJ3Rib2R5J10pO1xuICAgICAgZGVsZXRlIEZPUkJJRF9UQUdTLnRib2R5O1xuICAgIH1cblxuICAgIGlmIChjZmcuVFJVU1RFRF9UWVBFU19QT0xJQ1kpIHtcbiAgICAgIGlmICh0eXBlb2YgY2ZnLlRSVVNURURfVFlQRVNfUE9MSUNZLmNyZWF0ZUhUTUwgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgdHlwZUVycm9yQ3JlYXRlKFxuICAgICAgICAgICdUUlVTVEVEX1RZUEVTX1BPTElDWSBjb25maWd1cmF0aW9uIG9wdGlvbiBtdXN0IHByb3ZpZGUgYSBcImNyZWF0ZUhUTUxcIiBob29rLidcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBjZmcuVFJVU1RFRF9UWVBFU19QT0xJQ1kuY3JlYXRlU2NyaXB0VVJMICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IHR5cGVFcnJvckNyZWF0ZShcbiAgICAgICAgICAnVFJVU1RFRF9UWVBFU19QT0xJQ1kgY29uZmlndXJhdGlvbiBvcHRpb24gbXVzdCBwcm92aWRlIGEgXCJjcmVhdGVTY3JpcHRVUkxcIiBob29rLidcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gT3ZlcndyaXRlIGV4aXN0aW5nIFRydXN0ZWRUeXBlcyBwb2xpY3kuXG4gICAgICB0cnVzdGVkVHlwZXNQb2xpY3kgPSBjZmcuVFJVU1RFRF9UWVBFU19QT0xJQ1k7XG5cbiAgICAgIC8vIFNpZ24gbG9jYWwgdmFyaWFibGVzIHJlcXVpcmVkIGJ5IGBzYW5pdGl6ZWAuXG4gICAgICBlbXB0eUhUTUwgPSB0cnVzdGVkVHlwZXNQb2xpY3kuY3JlYXRlSFRNTCgnJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFVuaW5pdGlhbGl6ZWQgcG9saWN5LCBhdHRlbXB0IHRvIGluaXRpYWxpemUgdGhlIGludGVybmFsIGRvbXB1cmlmeSBwb2xpY3kuXG4gICAgICBpZiAodHJ1c3RlZFR5cGVzUG9saWN5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdHJ1c3RlZFR5cGVzUG9saWN5ID0gX2NyZWF0ZVRydXN0ZWRUeXBlc1BvbGljeShcbiAgICAgICAgICB0cnVzdGVkVHlwZXMsXG4gICAgICAgICAgY3VycmVudFNjcmlwdFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiBjcmVhdGluZyB0aGUgaW50ZXJuYWwgcG9saWN5IHN1Y2NlZWRlZCBzaWduIGludGVybmFsIHZhcmlhYmxlcy5cbiAgICAgIGlmICh0cnVzdGVkVHlwZXNQb2xpY3kgIT09IG51bGwgJiYgdHlwZW9mIGVtcHR5SFRNTCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgZW1wdHlIVE1MID0gdHJ1c3RlZFR5cGVzUG9saWN5LmNyZWF0ZUhUTUwoJycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFByZXZlbnQgZnVydGhlciBtYW5pcHVsYXRpb24gb2YgY29uZmlndXJhdGlvbi5cbiAgICAvLyBOb3QgYXZhaWxhYmxlIGluIElFOCwgU2FmYXJpIDUsIGV0Yy5cbiAgICBpZiAoZnJlZXplKSB7XG4gICAgICBmcmVlemUoY2ZnKTtcbiAgICB9XG5cbiAgICBDT05GSUcgPSBjZmc7XG4gIH07XG5cbiAgLyogS2VlcCB0cmFjayBvZiBhbGwgcG9zc2libGUgU1ZHIGFuZCBNYXRoTUwgdGFnc1xuICAgKiBzbyB0aGF0IHdlIGNhbiBwZXJmb3JtIHRoZSBuYW1lc3BhY2UgY2hlY2tzXG4gICAqIGNvcnJlY3RseS4gKi9cbiAgY29uc3QgQUxMX1NWR19UQUdTID0gYWRkVG9TZXQoe30sIFtcbiAgICAuLi5UQUdTLnN2ZyxcbiAgICAuLi5UQUdTLnN2Z0ZpbHRlcnMsXG4gICAgLi4uVEFHUy5zdmdEaXNhbGxvd2VkLFxuICBdKTtcbiAgY29uc3QgQUxMX01BVEhNTF9UQUdTID0gYWRkVG9TZXQoe30sIFtcbiAgICAuLi5UQUdTLm1hdGhNbCxcbiAgICAuLi5UQUdTLm1hdGhNbERpc2FsbG93ZWQsXG4gIF0pO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gZWxlbWVudCBhIERPTSBlbGVtZW50IHdob3NlIG5hbWVzcGFjZSBpcyBiZWluZyBjaGVja2VkXG4gICAqIEByZXR1cm5zIFJldHVybiBmYWxzZSBpZiB0aGUgZWxlbWVudCBoYXMgYVxuICAgKiAgbmFtZXNwYWNlIHRoYXQgYSBzcGVjLWNvbXBsaWFudCBwYXJzZXIgd291bGQgbmV2ZXJcbiAgICogIHJldHVybi4gUmV0dXJuIHRydWUgb3RoZXJ3aXNlLlxuICAgKi9cbiAgY29uc3QgX2NoZWNrVmFsaWROYW1lc3BhY2UgPSBmdW5jdGlvbiAoZWxlbWVudDogRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgIGxldCBwYXJlbnQgPSBnZXRQYXJlbnROb2RlKGVsZW1lbnQpO1xuXG4gICAgLy8gSW4gSlNET00sIGlmIHdlJ3JlIGluc2lkZSBzaGFkb3cgRE9NLCB0aGVuIHBhcmVudE5vZGVcbiAgICAvLyBjYW4gYmUgbnVsbC4gV2UganVzdCBzaW11bGF0ZSBwYXJlbnQgaW4gdGhpcyBjYXNlLlxuICAgIGlmICghcGFyZW50IHx8ICFwYXJlbnQudGFnTmFtZSkge1xuICAgICAgcGFyZW50ID0ge1xuICAgICAgICBuYW1lc3BhY2VVUkk6IE5BTUVTUEFDRSxcbiAgICAgICAgdGFnTmFtZTogJ3RlbXBsYXRlJyxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgdGFnTmFtZSA9IHN0cmluZ1RvTG93ZXJDYXNlKGVsZW1lbnQudGFnTmFtZSk7XG4gICAgY29uc3QgcGFyZW50VGFnTmFtZSA9IHN0cmluZ1RvTG93ZXJDYXNlKHBhcmVudC50YWdOYW1lKTtcblxuICAgIGlmICghQUxMT1dFRF9OQU1FU1BBQ0VTW2VsZW1lbnQubmFtZXNwYWNlVVJJXSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChlbGVtZW50Lm5hbWVzcGFjZVVSSSA9PT0gU1ZHX05BTUVTUEFDRSkge1xuICAgICAgLy8gVGhlIG9ubHkgd2F5IHRvIHN3aXRjaCBmcm9tIEhUTUwgbmFtZXNwYWNlIHRvIFNWR1xuICAgICAgLy8gaXMgdmlhIDxzdmc+LiBJZiBpdCBoYXBwZW5zIHZpYSBhbnkgb3RoZXIgdGFnLCB0aGVuXG4gICAgICAvLyBpdCBzaG91bGQgYmUga2lsbGVkLlxuICAgICAgaWYgKHBhcmVudC5uYW1lc3BhY2VVUkkgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgICAgIHJldHVybiB0YWdOYW1lID09PSAnc3ZnJztcbiAgICAgIH1cblxuICAgICAgLy8gVGhlIG9ubHkgd2F5IHRvIHN3aXRjaCBmcm9tIE1hdGhNTCB0byBTVkcgaXMgdmlhYFxuICAgICAgLy8gc3ZnIGlmIHBhcmVudCBpcyBlaXRoZXIgPGFubm90YXRpb24teG1sPiBvciBNYXRoTUxcbiAgICAgIC8vIHRleHQgaW50ZWdyYXRpb24gcG9pbnRzLlxuICAgICAgaWYgKHBhcmVudC5uYW1lc3BhY2VVUkkgPT09IE1BVEhNTF9OQU1FU1BBQ0UpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICB0YWdOYW1lID09PSAnc3ZnJyAmJlxuICAgICAgICAgIChwYXJlbnRUYWdOYW1lID09PSAnYW5ub3RhdGlvbi14bWwnIHx8XG4gICAgICAgICAgICBNQVRITUxfVEVYVF9JTlRFR1JBVElPTl9QT0lOVFNbcGFyZW50VGFnTmFtZV0pXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFdlIG9ubHkgYWxsb3cgZWxlbWVudHMgdGhhdCBhcmUgZGVmaW5lZCBpbiBTVkdcbiAgICAgIC8vIHNwZWMuIEFsbCBvdGhlcnMgYXJlIGRpc2FsbG93ZWQgaW4gU1ZHIG5hbWVzcGFjZS5cbiAgICAgIHJldHVybiBCb29sZWFuKEFMTF9TVkdfVEFHU1t0YWdOYW1lXSk7XG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnQubmFtZXNwYWNlVVJJID09PSBNQVRITUxfTkFNRVNQQUNFKSB7XG4gICAgICAvLyBUaGUgb25seSB3YXkgdG8gc3dpdGNoIGZyb20gSFRNTCBuYW1lc3BhY2UgdG8gTWF0aE1MXG4gICAgICAvLyBpcyB2aWEgPG1hdGg+LiBJZiBpdCBoYXBwZW5zIHZpYSBhbnkgb3RoZXIgdGFnLCB0aGVuXG4gICAgICAvLyBpdCBzaG91bGQgYmUga2lsbGVkLlxuICAgICAgaWYgKHBhcmVudC5uYW1lc3BhY2VVUkkgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgICAgIHJldHVybiB0YWdOYW1lID09PSAnbWF0aCc7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBvbmx5IHdheSB0byBzd2l0Y2ggZnJvbSBTVkcgdG8gTWF0aE1MIGlzIHZpYVxuICAgICAgLy8gPG1hdGg+IGFuZCBIVE1MIGludGVncmF0aW9uIHBvaW50c1xuICAgICAgaWYgKHBhcmVudC5uYW1lc3BhY2VVUkkgPT09IFNWR19OQU1FU1BBQ0UpIHtcbiAgICAgICAgcmV0dXJuIHRhZ05hbWUgPT09ICdtYXRoJyAmJiBIVE1MX0lOVEVHUkFUSU9OX1BPSU5UU1twYXJlbnRUYWdOYW1lXTtcbiAgICAgIH1cblxuICAgICAgLy8gV2Ugb25seSBhbGxvdyBlbGVtZW50cyB0aGF0IGFyZSBkZWZpbmVkIGluIE1hdGhNTFxuICAgICAgLy8gc3BlYy4gQWxsIG90aGVycyBhcmUgZGlzYWxsb3dlZCBpbiBNYXRoTUwgbmFtZXNwYWNlLlxuICAgICAgcmV0dXJuIEJvb2xlYW4oQUxMX01BVEhNTF9UQUdTW3RhZ05hbWVdKTtcbiAgICB9XG5cbiAgICBpZiAoZWxlbWVudC5uYW1lc3BhY2VVUkkgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgICAvLyBUaGUgb25seSB3YXkgdG8gc3dpdGNoIGZyb20gU1ZHIHRvIEhUTUwgaXMgdmlhXG4gICAgICAvLyBIVE1MIGludGVncmF0aW9uIHBvaW50cywgYW5kIGZyb20gTWF0aE1MIHRvIEhUTUxcbiAgICAgIC8vIGlzIHZpYSBNYXRoTUwgdGV4dCBpbnRlZ3JhdGlvbiBwb2ludHNcbiAgICAgIGlmIChcbiAgICAgICAgcGFyZW50Lm5hbWVzcGFjZVVSSSA9PT0gU1ZHX05BTUVTUEFDRSAmJlxuICAgICAgICAhSFRNTF9JTlRFR1JBVElPTl9QT0lOVFNbcGFyZW50VGFnTmFtZV1cbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgcGFyZW50Lm5hbWVzcGFjZVVSSSA9PT0gTUFUSE1MX05BTUVTUEFDRSAmJlxuICAgICAgICAhTUFUSE1MX1RFWFRfSU5URUdSQVRJT05fUE9JTlRTW3BhcmVudFRhZ05hbWVdXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBXZSBkaXNhbGxvdyB0YWdzIHRoYXQgYXJlIHNwZWNpZmljIGZvciBNYXRoTUxcbiAgICAgIC8vIG9yIFNWRyBhbmQgc2hvdWxkIG5ldmVyIGFwcGVhciBpbiBIVE1MIG5hbWVzcGFjZVxuICAgICAgcmV0dXJuIChcbiAgICAgICAgIUFMTF9NQVRITUxfVEFHU1t0YWdOYW1lXSAmJlxuICAgICAgICAoQ09NTU9OX1NWR19BTkRfSFRNTF9FTEVNRU5UU1t0YWdOYW1lXSB8fCAhQUxMX1NWR19UQUdTW3RhZ05hbWVdKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBGb3IgWEhUTUwgYW5kIFhNTCBkb2N1bWVudHMgdGhhdCBzdXBwb3J0IGN1c3RvbSBuYW1lc3BhY2VzXG4gICAgaWYgKFxuICAgICAgUEFSU0VSX01FRElBX1RZUEUgPT09ICdhcHBsaWNhdGlvbi94aHRtbCt4bWwnICYmXG4gICAgICBBTExPV0VEX05BTUVTUEFDRVNbZWxlbWVudC5uYW1lc3BhY2VVUkldXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBUaGUgY29kZSBzaG91bGQgbmV2ZXIgcmVhY2ggdGhpcyBwbGFjZSAodGhpcyBtZWFuc1xuICAgIC8vIHRoYXQgdGhlIGVsZW1lbnQgc29tZWhvdyBnb3QgbmFtZXNwYWNlIHRoYXQgaXMgbm90XG4gICAgLy8gSFRNTCwgU1ZHLCBNYXRoTUwgb3IgYWxsb3dlZCB2aWEgQUxMT1dFRF9OQU1FU1BBQ0VTKS5cbiAgICAvLyBSZXR1cm4gZmFsc2UganVzdCBpbiBjYXNlLlxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICAvKipcbiAgICogX2ZvcmNlUmVtb3ZlXG4gICAqXG4gICAqIEBwYXJhbSBub2RlIGEgRE9NIG5vZGVcbiAgICovXG4gIGNvbnN0IF9mb3JjZVJlbW92ZSA9IGZ1bmN0aW9uIChub2RlOiBOb2RlKTogdm9pZCB7XG4gICAgYXJyYXlQdXNoKERPTVB1cmlmeS5yZW1vdmVkLCB7IGVsZW1lbnQ6IG5vZGUgfSk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vcHJlZmVyLWRvbS1ub2RlLXJlbW92ZVxuICAgICAgZ2V0UGFyZW50Tm9kZShub2RlKS5yZW1vdmVDaGlsZChub2RlKTtcbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICByZW1vdmUobm9kZSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBfcmVtb3ZlQXR0cmlidXRlXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIGFuIEF0dHJpYnV0ZSBuYW1lXG4gICAqIEBwYXJhbSBlbGVtZW50IGEgRE9NIG5vZGVcbiAgICovXG4gIGNvbnN0IF9yZW1vdmVBdHRyaWJ1dGUgPSBmdW5jdGlvbiAobmFtZTogc3RyaW5nLCBlbGVtZW50OiBFbGVtZW50KTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGFycmF5UHVzaChET01QdXJpZnkucmVtb3ZlZCwge1xuICAgICAgICBhdHRyaWJ1dGU6IGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShuYW1lKSxcbiAgICAgICAgZnJvbTogZWxlbWVudCxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIGFycmF5UHVzaChET01QdXJpZnkucmVtb3ZlZCwge1xuICAgICAgICBhdHRyaWJ1dGU6IG51bGwsXG4gICAgICAgIGZyb206IGVsZW1lbnQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcblxuICAgIC8vIFdlIHZvaWQgYXR0cmlidXRlIHZhbHVlcyBmb3IgdW5yZW1vdmFibGUgXCJpc1wiIGF0dHJpYnV0ZXNcbiAgICBpZiAobmFtZSA9PT0gJ2lzJykge1xuICAgICAgaWYgKFJFVFVSTl9ET00gfHwgUkVUVVJOX0RPTV9GUkFHTUVOVCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIF9mb3JjZVJlbW92ZShlbGVtZW50KTtcbiAgICAgICAgfSBjYXRjaCAoXykge31cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUobmFtZSwgJycpO1xuICAgICAgICB9IGNhdGNoIChfKSB7fVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogX2luaXREb2N1bWVudFxuICAgKlxuICAgKiBAcGFyYW0gZGlydHkgLSBhIHN0cmluZyBvZiBkaXJ0eSBtYXJrdXBcbiAgICogQHJldHVybiBhIERPTSwgZmlsbGVkIHdpdGggdGhlIGRpcnR5IG1hcmt1cFxuICAgKi9cbiAgY29uc3QgX2luaXREb2N1bWVudCA9IGZ1bmN0aW9uIChkaXJ0eTogc3RyaW5nKTogRG9jdW1lbnQge1xuICAgIC8qIENyZWF0ZSBhIEhUTUwgZG9jdW1lbnQgKi9cbiAgICBsZXQgZG9jID0gbnVsbDtcbiAgICBsZXQgbGVhZGluZ1doaXRlc3BhY2UgPSBudWxsO1xuXG4gICAgaWYgKEZPUkNFX0JPRFkpIHtcbiAgICAgIGRpcnR5ID0gJzxyZW1vdmU+PC9yZW1vdmU+JyArIGRpcnR5O1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBJZiBGT1JDRV9CT0RZIGlzbid0IHVzZWQsIGxlYWRpbmcgd2hpdGVzcGFjZSBuZWVkcyB0byBiZSBwcmVzZXJ2ZWQgbWFudWFsbHkgKi9cbiAgICAgIGNvbnN0IG1hdGNoZXMgPSBzdHJpbmdNYXRjaChkaXJ0eSwgL15bXFxyXFxuXFx0IF0rLyk7XG4gICAgICBsZWFkaW5nV2hpdGVzcGFjZSA9IG1hdGNoZXMgJiYgbWF0Y2hlc1swXTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBQQVJTRVJfTUVESUFfVFlQRSA9PT0gJ2FwcGxpY2F0aW9uL3hodG1sK3htbCcgJiZcbiAgICAgIE5BTUVTUEFDRSA9PT0gSFRNTF9OQU1FU1BBQ0VcbiAgICApIHtcbiAgICAgIC8vIFJvb3Qgb2YgWEhUTUwgZG9jIG11c3QgY29udGFpbiB4bWxucyBkZWNsYXJhdGlvbiAoc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvbm9ybWF0aXZlLmh0bWwjc3RyaWN0KVxuICAgICAgZGlydHkgPVxuICAgICAgICAnPGh0bWwgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCI+PGhlYWQ+PC9oZWFkPjxib2R5PicgK1xuICAgICAgICBkaXJ0eSArXG4gICAgICAgICc8L2JvZHk+PC9odG1sPic7XG4gICAgfVxuXG4gICAgY29uc3QgZGlydHlQYXlsb2FkID0gdHJ1c3RlZFR5cGVzUG9saWN5XG4gICAgICA/IHRydXN0ZWRUeXBlc1BvbGljeS5jcmVhdGVIVE1MKGRpcnR5KVxuICAgICAgOiBkaXJ0eTtcbiAgICAvKlxuICAgICAqIFVzZSB0aGUgRE9NUGFyc2VyIEFQSSBieSBkZWZhdWx0LCBmYWxsYmFjayBsYXRlciBpZiBuZWVkcyBiZVxuICAgICAqIERPTVBhcnNlciBub3Qgd29yayBmb3Igc3ZnIHdoZW4gaGFzIG11bHRpcGxlIHJvb3QgZWxlbWVudC5cbiAgICAgKi9cbiAgICBpZiAoTkFNRVNQQUNFID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZG9jID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhkaXJ0eVBheWxvYWQsIFBBUlNFUl9NRURJQV9UWVBFKTtcbiAgICAgIH0gY2F0Y2ggKF8pIHt9XG4gICAgfVxuXG4gICAgLyogVXNlIGNyZWF0ZUhUTUxEb2N1bWVudCBpbiBjYXNlIERPTVBhcnNlciBpcyBub3QgYXZhaWxhYmxlICovXG4gICAgaWYgKCFkb2MgfHwgIWRvYy5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgIGRvYyA9IGltcGxlbWVudGF0aW9uLmNyZWF0ZURvY3VtZW50KE5BTUVTUEFDRSwgJ3RlbXBsYXRlJywgbnVsbCk7XG4gICAgICB0cnkge1xuICAgICAgICBkb2MuZG9jdW1lbnRFbGVtZW50LmlubmVySFRNTCA9IElTX0VNUFRZX0lOUFVUXG4gICAgICAgICAgPyBlbXB0eUhUTUxcbiAgICAgICAgICA6IGRpcnR5UGF5bG9hZDtcbiAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgLy8gU3ludGF4IGVycm9yIGlmIGRpcnR5UGF5bG9hZCBpcyBpbnZhbGlkIHhtbFxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGJvZHkgPSBkb2MuYm9keSB8fCBkb2MuZG9jdW1lbnRFbGVtZW50O1xuXG4gICAgaWYgKGRpcnR5ICYmIGxlYWRpbmdXaGl0ZXNwYWNlKSB7XG4gICAgICBib2R5Lmluc2VydEJlZm9yZShcbiAgICAgICAgZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobGVhZGluZ1doaXRlc3BhY2UpLFxuICAgICAgICBib2R5LmNoaWxkTm9kZXNbMF0gfHwgbnVsbFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvKiBXb3JrIG9uIHdob2xlIGRvY3VtZW50IG9yIGp1c3QgaXRzIGJvZHkgKi9cbiAgICBpZiAoTkFNRVNQQUNFID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgICAgcmV0dXJuIGdldEVsZW1lbnRzQnlUYWdOYW1lLmNhbGwoXG4gICAgICAgIGRvYyxcbiAgICAgICAgV0hPTEVfRE9DVU1FTlQgPyAnaHRtbCcgOiAnYm9keSdcbiAgICAgIClbMF07XG4gICAgfVxuXG4gICAgcmV0dXJuIFdIT0xFX0RPQ1VNRU5UID8gZG9jLmRvY3VtZW50RWxlbWVudCA6IGJvZHk7XG4gIH07XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBOb2RlSXRlcmF0b3Igb2JqZWN0IHRoYXQgeW91IGNhbiB1c2UgdG8gdHJhdmVyc2UgZmlsdGVyZWQgbGlzdHMgb2Ygbm9kZXMgb3IgZWxlbWVudHMgaW4gYSBkb2N1bWVudC5cbiAgICpcbiAgICogQHBhcmFtIHJvb3QgVGhlIHJvb3QgZWxlbWVudCBvciBub2RlIHRvIHN0YXJ0IHRyYXZlcnNpbmcgb24uXG4gICAqIEByZXR1cm4gVGhlIGNyZWF0ZWQgTm9kZUl0ZXJhdG9yXG4gICAqL1xuICBjb25zdCBfY3JlYXRlTm9kZUl0ZXJhdG9yID0gZnVuY3Rpb24gKHJvb3Q6IE5vZGUpOiBOb2RlSXRlcmF0b3Ige1xuICAgIHJldHVybiBjcmVhdGVOb2RlSXRlcmF0b3IuY2FsbChcbiAgICAgIHJvb3Qub3duZXJEb2N1bWVudCB8fCByb290LFxuICAgICAgcm9vdCxcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1iaXR3aXNlXG4gICAgICBOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCB8XG4gICAgICAgIE5vZGVGaWx0ZXIuU0hPV19DT01NRU5UIHxcbiAgICAgICAgTm9kZUZpbHRlci5TSE9XX1RFWFQgfFxuICAgICAgICBOb2RlRmlsdGVyLlNIT1dfUFJPQ0VTU0lOR19JTlNUUlVDVElPTiB8XG4gICAgICAgIE5vZGVGaWx0ZXIuU0hPV19DREFUQV9TRUNUSU9OLFxuICAgICAgbnVsbFxuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIF9pc0Nsb2JiZXJlZFxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCBlbGVtZW50IHRvIGNoZWNrIGZvciBjbG9iYmVyaW5nIGF0dGFja3NcbiAgICogQHJldHVybiB0cnVlIGlmIGNsb2JiZXJlZCwgZmFsc2UgaWYgc2FmZVxuICAgKi9cbiAgY29uc3QgX2lzQ2xvYmJlcmVkID0gZnVuY3Rpb24gKGVsZW1lbnQ6IEVsZW1lbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxGb3JtRWxlbWVudCAmJlxuICAgICAgKHR5cGVvZiBlbGVtZW50Lm5vZGVOYW1lICE9PSAnc3RyaW5nJyB8fFxuICAgICAgICB0eXBlb2YgZWxlbWVudC50ZXh0Q29udGVudCAhPT0gJ3N0cmluZycgfHxcbiAgICAgICAgdHlwZW9mIGVsZW1lbnQucmVtb3ZlQ2hpbGQgIT09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgIShlbGVtZW50LmF0dHJpYnV0ZXMgaW5zdGFuY2VvZiBOYW1lZE5vZGVNYXApIHx8XG4gICAgICAgIHR5cGVvZiBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICB0eXBlb2YgZWxlbWVudC5zZXRBdHRyaWJ1dGUgIT09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgdHlwZW9mIGVsZW1lbnQubmFtZXNwYWNlVVJJICE9PSAnc3RyaW5nJyB8fFxuICAgICAgICB0eXBlb2YgZWxlbWVudC5pbnNlcnRCZWZvcmUgIT09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgdHlwZW9mIGVsZW1lbnQuaGFzQ2hpbGROb2RlcyAhPT0gJ2Z1bmN0aW9uJylcbiAgICApO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGEgRE9NIG5vZGUuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBvYmplY3QgdG8gY2hlY2sgd2hldGhlciBpdCdzIGEgRE9NIG5vZGVcbiAgICogQHJldHVybiB0cnVlIGlzIG9iamVjdCBpcyBhIERPTSBub2RlXG4gICAqL1xuICBjb25zdCBfaXNOb2RlID0gZnVuY3Rpb24gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgTm9kZSB7XG4gICAgcmV0dXJuIHR5cGVvZiBOb2RlID09PSAnZnVuY3Rpb24nICYmIHZhbHVlIGluc3RhbmNlb2YgTm9kZTtcbiAgfTtcblxuICBmdW5jdGlvbiBfZXhlY3V0ZUhvb2tzPFQgZXh0ZW5kcyBIb29rRnVuY3Rpb24+KFxuICAgIGhvb2tzOiBIb29rRnVuY3Rpb25bXSxcbiAgICBjdXJyZW50Tm9kZTogUGFyYW1ldGVyczxUPlswXSxcbiAgICBkYXRhOiBQYXJhbWV0ZXJzPFQ+WzFdXG4gICk6IHZvaWQge1xuICAgIGFycmF5Rm9yRWFjaChob29rcywgKGhvb2s6IFQpID0+IHtcbiAgICAgIGhvb2suY2FsbChET01QdXJpZnksIGN1cnJlbnROb2RlLCBkYXRhLCBDT05GSUcpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIF9zYW5pdGl6ZUVsZW1lbnRzXG4gICAqXG4gICAqIEBwcm90ZWN0IG5vZGVOYW1lXG4gICAqIEBwcm90ZWN0IHRleHRDb250ZW50XG4gICAqIEBwcm90ZWN0IHJlbW92ZUNoaWxkXG4gICAqIEBwYXJhbSBjdXJyZW50Tm9kZSB0byBjaGVjayBmb3IgcGVybWlzc2lvbiB0byBleGlzdFxuICAgKiBAcmV0dXJuIHRydWUgaWYgbm9kZSB3YXMga2lsbGVkLCBmYWxzZSBpZiBsZWZ0IGFsaXZlXG4gICAqL1xuICBjb25zdCBfc2FuaXRpemVFbGVtZW50cyA9IGZ1bmN0aW9uIChjdXJyZW50Tm9kZTogYW55KTogYm9vbGVhbiB7XG4gICAgbGV0IGNvbnRlbnQgPSBudWxsO1xuXG4gICAgLyogRXhlY3V0ZSBhIGhvb2sgaWYgcHJlc2VudCAqL1xuICAgIF9leGVjdXRlSG9va3MoaG9va3MuYmVmb3JlU2FuaXRpemVFbGVtZW50cywgY3VycmVudE5vZGUsIG51bGwpO1xuXG4gICAgLyogQ2hlY2sgaWYgZWxlbWVudCBpcyBjbG9iYmVyZWQgb3IgY2FuIGNsb2JiZXIgKi9cbiAgICBpZiAoX2lzQ2xvYmJlcmVkKGN1cnJlbnROb2RlKSkge1xuICAgICAgX2ZvcmNlUmVtb3ZlKGN1cnJlbnROb2RlKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qIE5vdyBsZXQncyBjaGVjayB0aGUgZWxlbWVudCdzIHR5cGUgYW5kIG5hbWUgKi9cbiAgICBjb25zdCB0YWdOYW1lID0gdHJhbnNmb3JtQ2FzZUZ1bmMoY3VycmVudE5vZGUubm9kZU5hbWUpO1xuXG4gICAgLyogRXhlY3V0ZSBhIGhvb2sgaWYgcHJlc2VudCAqL1xuICAgIF9leGVjdXRlSG9va3MoaG9va3MudXBvblNhbml0aXplRWxlbWVudCwgY3VycmVudE5vZGUsIHtcbiAgICAgIHRhZ05hbWUsXG4gICAgICBhbGxvd2VkVGFnczogQUxMT1dFRF9UQUdTLFxuICAgIH0pO1xuXG4gICAgLyogRGV0ZWN0IG1YU1MgYXR0ZW1wdHMgYWJ1c2luZyBuYW1lc3BhY2UgY29uZnVzaW9uICovXG4gICAgaWYgKFxuICAgICAgU0FGRV9GT1JfWE1MICYmXG4gICAgICBjdXJyZW50Tm9kZS5oYXNDaGlsZE5vZGVzKCkgJiZcbiAgICAgICFfaXNOb2RlKGN1cnJlbnROb2RlLmZpcnN0RWxlbWVudENoaWxkKSAmJlxuICAgICAgcmVnRXhwVGVzdCgvPFsvXFx3IV0vZywgY3VycmVudE5vZGUuaW5uZXJIVE1MKSAmJlxuICAgICAgcmVnRXhwVGVzdCgvPFsvXFx3IV0vZywgY3VycmVudE5vZGUudGV4dENvbnRlbnQpXG4gICAgKSB7XG4gICAgICBfZm9yY2VSZW1vdmUoY3VycmVudE5vZGUpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyogUmVtb3ZlIGFueSBvY2N1cnJlbmNlIG9mIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zICovXG4gICAgaWYgKGN1cnJlbnROb2RlLm5vZGVUeXBlID09PSBOT0RFX1RZUEUucHJvZ3Jlc3NpbmdJbnN0cnVjdGlvbikge1xuICAgICAgX2ZvcmNlUmVtb3ZlKGN1cnJlbnROb2RlKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qIFJlbW92ZSBhbnkga2luZCBvZiBwb3NzaWJseSBoYXJtZnVsIGNvbW1lbnRzICovXG4gICAgaWYgKFxuICAgICAgU0FGRV9GT1JfWE1MICYmXG4gICAgICBjdXJyZW50Tm9kZS5ub2RlVHlwZSA9PT0gTk9ERV9UWVBFLmNvbW1lbnQgJiZcbiAgICAgIHJlZ0V4cFRlc3QoLzxbL1xcd10vZywgY3VycmVudE5vZGUuZGF0YSlcbiAgICApIHtcbiAgICAgIF9mb3JjZVJlbW92ZShjdXJyZW50Tm9kZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKiBSZW1vdmUgZWxlbWVudCBpZiBhbnl0aGluZyBmb3JiaWRzIGl0cyBwcmVzZW5jZSAqL1xuICAgIGlmIChcbiAgICAgICEoXG4gICAgICAgIEVYVFJBX0VMRU1FTlRfSEFORExJTkcudGFnQ2hlY2sgaW5zdGFuY2VvZiBGdW5jdGlvbiAmJlxuICAgICAgICBFWFRSQV9FTEVNRU5UX0hBTkRMSU5HLnRhZ0NoZWNrKHRhZ05hbWUpXG4gICAgICApICYmXG4gICAgICAoIUFMTE9XRURfVEFHU1t0YWdOYW1lXSB8fCBGT1JCSURfVEFHU1t0YWdOYW1lXSlcbiAgICApIHtcbiAgICAgIC8qIENoZWNrIGlmIHdlIGhhdmUgYSBjdXN0b20gZWxlbWVudCB0byBoYW5kbGUgKi9cbiAgICAgIGlmICghRk9SQklEX1RBR1NbdGFnTmFtZV0gJiYgX2lzQmFzaWNDdXN0b21FbGVtZW50KHRhZ05hbWUpKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBDVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2sgaW5zdGFuY2VvZiBSZWdFeHAgJiZcbiAgICAgICAgICByZWdFeHBUZXN0KENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVjaywgdGFnTmFtZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVjayBpbnN0YW5jZW9mIEZ1bmN0aW9uICYmXG4gICAgICAgICAgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrKHRhZ05hbWUpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvKiBLZWVwIGNvbnRlbnQgZXhjZXB0IGZvciBiYWQtbGlzdGVkIGVsZW1lbnRzICovXG4gICAgICBpZiAoS0VFUF9DT05URU5UICYmICFGT1JCSURfQ09OVEVOVFNbdGFnTmFtZV0pIHtcbiAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IGdldFBhcmVudE5vZGUoY3VycmVudE5vZGUpIHx8IGN1cnJlbnROb2RlLnBhcmVudE5vZGU7XG4gICAgICAgIGNvbnN0IGNoaWxkTm9kZXMgPSBnZXRDaGlsZE5vZGVzKGN1cnJlbnROb2RlKSB8fCBjdXJyZW50Tm9kZS5jaGlsZE5vZGVzO1xuXG4gICAgICAgIGlmIChjaGlsZE5vZGVzICYmIHBhcmVudE5vZGUpIHtcbiAgICAgICAgICBjb25zdCBjaGlsZENvdW50ID0gY2hpbGROb2Rlcy5sZW5ndGg7XG5cbiAgICAgICAgICBmb3IgKGxldCBpID0gY2hpbGRDb3VudCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgICAgICBjb25zdCBjaGlsZENsb25lID0gY2xvbmVOb2RlKGNoaWxkTm9kZXNbaV0sIHRydWUpO1xuICAgICAgICAgICAgY2hpbGRDbG9uZS5fX3JlbW92YWxDb3VudCA9IChjdXJyZW50Tm9kZS5fX3JlbW92YWxDb3VudCB8fCAwKSArIDE7XG4gICAgICAgICAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShjaGlsZENsb25lLCBnZXROZXh0U2libGluZyhjdXJyZW50Tm9kZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBfZm9yY2VSZW1vdmUoY3VycmVudE5vZGUpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyogQ2hlY2sgd2hldGhlciBlbGVtZW50IGhhcyBhIHZhbGlkIG5hbWVzcGFjZSAqL1xuICAgIGlmIChjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgIV9jaGVja1ZhbGlkTmFtZXNwYWNlKGN1cnJlbnROb2RlKSkge1xuICAgICAgX2ZvcmNlUmVtb3ZlKGN1cnJlbnROb2RlKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qIE1ha2Ugc3VyZSB0aGF0IG9sZGVyIGJyb3dzZXJzIGRvbid0IGdldCBmYWxsYmFjay10YWcgbVhTUyAqL1xuICAgIGlmIChcbiAgICAgICh0YWdOYW1lID09PSAnbm9zY3JpcHQnIHx8XG4gICAgICAgIHRhZ05hbWUgPT09ICdub2VtYmVkJyB8fFxuICAgICAgICB0YWdOYW1lID09PSAnbm9mcmFtZXMnKSAmJlxuICAgICAgcmVnRXhwVGVzdCgvPFxcL25vKHNjcmlwdHxlbWJlZHxmcmFtZXMpL2ksIGN1cnJlbnROb2RlLmlubmVySFRNTClcbiAgICApIHtcbiAgICAgIF9mb3JjZVJlbW92ZShjdXJyZW50Tm9kZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKiBTYW5pdGl6ZSBlbGVtZW50IGNvbnRlbnQgdG8gYmUgdGVtcGxhdGUtc2FmZSAqL1xuICAgIGlmIChTQUZFX0ZPUl9URU1QTEFURVMgJiYgY3VycmVudE5vZGUubm9kZVR5cGUgPT09IE5PREVfVFlQRS50ZXh0KSB7XG4gICAgICAvKiBHZXQgdGhlIGVsZW1lbnQncyB0ZXh0IGNvbnRlbnQgKi9cbiAgICAgIGNvbnRlbnQgPSBjdXJyZW50Tm9kZS50ZXh0Q29udGVudDtcblxuICAgICAgYXJyYXlGb3JFYWNoKFtNVVNUQUNIRV9FWFBSLCBFUkJfRVhQUiwgVE1QTElUX0VYUFJdLCAoZXhwcjogUmVnRXhwKSA9PiB7XG4gICAgICAgIGNvbnRlbnQgPSBzdHJpbmdSZXBsYWNlKGNvbnRlbnQsIGV4cHIsICcgJyk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKGN1cnJlbnROb2RlLnRleHRDb250ZW50ICE9PSBjb250ZW50KSB7XG4gICAgICAgIGFycmF5UHVzaChET01QdXJpZnkucmVtb3ZlZCwgeyBlbGVtZW50OiBjdXJyZW50Tm9kZS5jbG9uZU5vZGUoKSB9KTtcbiAgICAgICAgY3VycmVudE5vZGUudGV4dENvbnRlbnQgPSBjb250ZW50O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qIEV4ZWN1dGUgYSBob29rIGlmIHByZXNlbnQgKi9cbiAgICBfZXhlY3V0ZUhvb2tzKGhvb2tzLmFmdGVyU2FuaXRpemVFbGVtZW50cywgY3VycmVudE5vZGUsIG51bGwpO1xuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBfaXNWYWxpZEF0dHJpYnV0ZVxuICAgKlxuICAgKiBAcGFyYW0gbGNUYWcgTG93ZXJjYXNlIHRhZyBuYW1lIG9mIGNvbnRhaW5pbmcgZWxlbWVudC5cbiAgICogQHBhcmFtIGxjTmFtZSBMb3dlcmNhc2UgYXR0cmlidXRlIG5hbWUuXG4gICAqIEBwYXJhbSB2YWx1ZSBBdHRyaWJ1dGUgdmFsdWUuXG4gICAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmIGB2YWx1ZWAgaXMgdmFsaWQsIG90aGVyd2lzZSBmYWxzZS5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG4gIGNvbnN0IF9pc1ZhbGlkQXR0cmlidXRlID0gZnVuY3Rpb24gKFxuICAgIGxjVGFnOiBzdHJpbmcsXG4gICAgbGNOYW1lOiBzdHJpbmcsXG4gICAgdmFsdWU6IHN0cmluZ1xuICApOiBib29sZWFuIHtcbiAgICAvKiBGT1JCSURfQVRUUiBtdXN0IGFsd2F5cyB3aW4sIGV2ZW4gaWYgQUREX0FUVFIgcHJlZGljYXRlIHdvdWxkIGFsbG93IGl0ICovXG4gICAgaWYgKEZPUkJJRF9BVFRSW2xjTmFtZV0pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKiBNYWtlIHN1cmUgYXR0cmlidXRlIGNhbm5vdCBjbG9iYmVyICovXG4gICAgaWYgKFxuICAgICAgU0FOSVRJWkVfRE9NICYmXG4gICAgICAobGNOYW1lID09PSAnaWQnIHx8IGxjTmFtZSA9PT0gJ25hbWUnKSAmJlxuICAgICAgKHZhbHVlIGluIGRvY3VtZW50IHx8IHZhbHVlIGluIGZvcm1FbGVtZW50KVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qIEFsbG93IHZhbGlkIGRhdGEtKiBhdHRyaWJ1dGVzOiBBdCBsZWFzdCBvbmUgY2hhcmFjdGVyIGFmdGVyIFwiLVwiXG4gICAgICAgIChodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9kb20uaHRtbCNlbWJlZGRpbmctY3VzdG9tLW5vbi12aXNpYmxlLWRhdGEtd2l0aC10aGUtZGF0YS0qLWF0dHJpYnV0ZXMpXG4gICAgICAgIFhNTC1jb21wYXRpYmxlIChodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9pbmZyYXN0cnVjdHVyZS5odG1sI3htbC1jb21wYXRpYmxlIGFuZCBodHRwOi8vd3d3LnczLm9yZy9UUi94bWwvI2QwZTgwNClcbiAgICAgICAgV2UgZG9uJ3QgbmVlZCB0byBjaGVjayB0aGUgdmFsdWU7IGl0J3MgYWx3YXlzIFVSSSBzYWZlLiAqL1xuICAgIGlmIChcbiAgICAgIEFMTE9XX0RBVEFfQVRUUiAmJlxuICAgICAgIUZPUkJJRF9BVFRSW2xjTmFtZV0gJiZcbiAgICAgIHJlZ0V4cFRlc3QoREFUQV9BVFRSLCBsY05hbWUpXG4gICAgKSB7XG4gICAgICAvLyBUaGlzIGF0dHJpYnV0ZSBpcyBzYWZlXG4gICAgfSBlbHNlIGlmIChBTExPV19BUklBX0FUVFIgJiYgcmVnRXhwVGVzdChBUklBX0FUVFIsIGxjTmFtZSkpIHtcbiAgICAgIC8vIFRoaXMgYXR0cmlidXRlIGlzIHNhZmVcbiAgICAgIC8qIENoZWNrIGlmIEFERF9BVFRSIGZ1bmN0aW9uIGFsbG93cyB0aGlzIGF0dHJpYnV0ZSAqL1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBFWFRSQV9FTEVNRU5UX0hBTkRMSU5HLmF0dHJpYnV0ZUNoZWNrIGluc3RhbmNlb2YgRnVuY3Rpb24gJiZcbiAgICAgIEVYVFJBX0VMRU1FTlRfSEFORExJTkcuYXR0cmlidXRlQ2hlY2sobGNOYW1lLCBsY1RhZylcbiAgICApIHtcbiAgICAgIC8vIFRoaXMgYXR0cmlidXRlIGlzIHNhZmVcbiAgICAgIC8qIE90aGVyd2lzZSwgY2hlY2sgdGhlIG5hbWUgaXMgcGVybWl0dGVkICovXG4gICAgfSBlbHNlIGlmICghQUxMT1dFRF9BVFRSW2xjTmFtZV0gfHwgRk9SQklEX0FUVFJbbGNOYW1lXSkge1xuICAgICAgaWYgKFxuICAgICAgICAvLyBGaXJzdCBjb25kaXRpb24gZG9lcyBhIHZlcnkgYmFzaWMgY2hlY2sgaWYgYSkgaXQncyBiYXNpY2FsbHkgYSB2YWxpZCBjdXN0b20gZWxlbWVudCB0YWduYW1lIEFORFxuICAgICAgICAvLyBiKSBpZiB0aGUgdGFnTmFtZSBwYXNzZXMgd2hhdGV2ZXIgdGhlIHVzZXIgaGFzIGNvbmZpZ3VyZWQgZm9yIENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVja1xuICAgICAgICAvLyBhbmQgYykgaWYgdGhlIGF0dHJpYnV0ZSBuYW1lIHBhc3NlcyB3aGF0ZXZlciB0aGUgdXNlciBoYXMgY29uZmlndXJlZCBmb3IgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcuYXR0cmlidXRlTmFtZUNoZWNrXG4gICAgICAgIChfaXNCYXNpY0N1c3RvbUVsZW1lbnQobGNUYWcpICYmXG4gICAgICAgICAgKChDVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2sgaW5zdGFuY2VvZiBSZWdFeHAgJiZcbiAgICAgICAgICAgIHJlZ0V4cFRlc3QoQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrLCBsY1RhZykpIHx8XG4gICAgICAgICAgICAoQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrIGluc3RhbmNlb2YgRnVuY3Rpb24gJiZcbiAgICAgICAgICAgICAgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrKGxjVGFnKSkpICYmXG4gICAgICAgICAgKChDVVNUT01fRUxFTUVOVF9IQU5ETElORy5hdHRyaWJ1dGVOYW1lQ2hlY2sgaW5zdGFuY2VvZiBSZWdFeHAgJiZcbiAgICAgICAgICAgIHJlZ0V4cFRlc3QoQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcuYXR0cmlidXRlTmFtZUNoZWNrLCBsY05hbWUpKSB8fFxuICAgICAgICAgICAgKENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLmF0dHJpYnV0ZU5hbWVDaGVjayBpbnN0YW5jZW9mIEZ1bmN0aW9uICYmXG4gICAgICAgICAgICAgIENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLmF0dHJpYnV0ZU5hbWVDaGVjayhsY05hbWUsIGxjVGFnKSkpKSB8fFxuICAgICAgICAvLyBBbHRlcm5hdGl2ZSwgc2Vjb25kIGNvbmRpdGlvbiBjaGVja3MgaWYgaXQncyBhbiBgaXNgLWF0dHJpYnV0ZSwgQU5EXG4gICAgICAgIC8vIHRoZSB2YWx1ZSBwYXNzZXMgd2hhdGV2ZXIgdGhlIHVzZXIgaGFzIGNvbmZpZ3VyZWQgZm9yIENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVja1xuICAgICAgICAobGNOYW1lID09PSAnaXMnICYmXG4gICAgICAgICAgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcuYWxsb3dDdXN0b21pemVkQnVpbHRJbkVsZW1lbnRzICYmXG4gICAgICAgICAgKChDVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2sgaW5zdGFuY2VvZiBSZWdFeHAgJiZcbiAgICAgICAgICAgIHJlZ0V4cFRlc3QoQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrLCB2YWx1ZSkpIHx8XG4gICAgICAgICAgICAoQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrIGluc3RhbmNlb2YgRnVuY3Rpb24gJiZcbiAgICAgICAgICAgICAgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrKHZhbHVlKSkpKVxuICAgICAgKSB7XG4gICAgICAgIC8vIElmIHVzZXIgaGFzIHN1cHBsaWVkIGEgcmVnZXhwIG9yIGZ1bmN0aW9uIGluIENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVjaywgd2UgbmVlZCB0byBhbHNvIGFsbG93IGRlcml2ZWQgY3VzdG9tIGVsZW1lbnRzIHVzaW5nIHRoZSBzYW1lIHRhZ05hbWUgdGVzdC5cbiAgICAgICAgLy8gQWRkaXRpb25hbGx5LCB3ZSBuZWVkIHRvIGFsbG93IGF0dHJpYnV0ZXMgcGFzc2luZyB0aGUgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcuYXR0cmlidXRlTmFtZUNoZWNrIHVzZXIgaGFzIGNvbmZpZ3VyZWQsIGFzIGN1c3RvbSBlbGVtZW50cyBjYW4gZGVmaW5lIHRoZXNlIGF0IHRoZWlyIG93biBkaXNjcmV0aW9uLlxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgLyogQ2hlY2sgdmFsdWUgaXMgc2FmZS4gRmlyc3QsIGlzIGF0dHIgaW5lcnQ/IElmIHNvLCBpcyBzYWZlICovXG4gICAgfSBlbHNlIGlmIChVUklfU0FGRV9BVFRSSUJVVEVTW2xjTmFtZV0pIHtcbiAgICAgIC8vIFRoaXMgYXR0cmlidXRlIGlzIHNhZmVcbiAgICAgIC8qIENoZWNrIG5vIHNjcmlwdCwgZGF0YSBvciB1bmtub3duIHBvc3NpYmx5IHVuc2FmZSBVUklcbiAgICAgICAgdW5sZXNzIHdlIGtub3cgVVJJIHZhbHVlcyBhcmUgc2FmZSBmb3IgdGhhdCBhdHRyaWJ1dGUgKi9cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgcmVnRXhwVGVzdChJU19BTExPV0VEX1VSSSwgc3RyaW5nUmVwbGFjZSh2YWx1ZSwgQVRUUl9XSElURVNQQUNFLCAnJykpXG4gICAgKSB7XG4gICAgICAvLyBUaGlzIGF0dHJpYnV0ZSBpcyBzYWZlXG4gICAgICAvKiBLZWVwIGltYWdlIGRhdGEgVVJJcyBhbGl2ZSBpZiBzcmMveGxpbms6aHJlZiBpcyBhbGxvd2VkICovXG4gICAgICAvKiBGdXJ0aGVyIHByZXZlbnQgZ2FkZ2V0IFhTUyBmb3IgZHluYW1pY2FsbHkgYnVpbHQgc2NyaXB0IHRhZ3MgKi9cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgKGxjTmFtZSA9PT0gJ3NyYycgfHwgbGNOYW1lID09PSAneGxpbms6aHJlZicgfHwgbGNOYW1lID09PSAnaHJlZicpICYmXG4gICAgICBsY1RhZyAhPT0gJ3NjcmlwdCcgJiZcbiAgICAgIHN0cmluZ0luZGV4T2YodmFsdWUsICdkYXRhOicpID09PSAwICYmXG4gICAgICBEQVRBX1VSSV9UQUdTW2xjVGFnXVxuICAgICkge1xuICAgICAgLy8gVGhpcyBhdHRyaWJ1dGUgaXMgc2FmZVxuICAgICAgLyogQWxsb3cgdW5rbm93biBwcm90b2NvbHM6IFRoaXMgcHJvdmlkZXMgc3VwcG9ydCBmb3IgbGlua3MgdGhhdFxuICAgICAgICBhcmUgaGFuZGxlZCBieSBwcm90b2NvbCBoYW5kbGVycyB3aGljaCBtYXkgYmUgdW5rbm93biBhaGVhZCBvZlxuICAgICAgICB0aW1lLCBlLmcuIGZiOiwgc3BvdGlmeTogKi9cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgQUxMT1dfVU5LTk9XTl9QUk9UT0NPTFMgJiZcbiAgICAgICFyZWdFeHBUZXN0KElTX1NDUklQVF9PUl9EQVRBLCBzdHJpbmdSZXBsYWNlKHZhbHVlLCBBVFRSX1dISVRFU1BBQ0UsICcnKSlcbiAgICApIHtcbiAgICAgIC8vIFRoaXMgYXR0cmlidXRlIGlzIHNhZmVcbiAgICAgIC8qIENoZWNrIGZvciBiaW5hcnkgYXR0cmlidXRlcyAqL1xuICAgIH0gZWxzZSBpZiAodmFsdWUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQmluYXJ5IGF0dHJpYnV0ZXMgYXJlIHNhZmUgYXQgdGhpcyBwb2ludFxuICAgICAgLyogQW55dGhpbmcgZWxzZSwgcHJlc3VtZSB1bnNhZmUsIGRvIG5vdCBhZGQgaXQgYmFjayAqL1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBfaXNCYXNpY0N1c3RvbUVsZW1lbnRcbiAgICogY2hlY2tzIGlmIGF0IGxlYXN0IG9uZSBkYXNoIGlzIGluY2x1ZGVkIGluIHRhZ05hbWUsIGFuZCBpdCdzIG5vdCB0aGUgZmlyc3QgY2hhclxuICAgKiBmb3IgbW9yZSBzb3BoaXN0aWNhdGVkIGNoZWNraW5nIHNlZSBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL3ZhbGlkYXRlLWVsZW1lbnQtbmFtZVxuICAgKlxuICAgKiBAcGFyYW0gdGFnTmFtZSBuYW1lIG9mIHRoZSB0YWcgb2YgdGhlIG5vZGUgdG8gc2FuaXRpemVcbiAgICogQHJldHVybnMgUmV0dXJucyB0cnVlIGlmIHRoZSB0YWcgbmFtZSBtZWV0cyB0aGUgYmFzaWMgY3JpdGVyaWEgZm9yIGEgY3VzdG9tIGVsZW1lbnQsIG90aGVyd2lzZSBmYWxzZS5cbiAgICovXG4gIGNvbnN0IF9pc0Jhc2ljQ3VzdG9tRWxlbWVudCA9IGZ1bmN0aW9uICh0YWdOYW1lOiBzdHJpbmcpOiBSZWdFeHBNYXRjaEFycmF5IHtcbiAgICByZXR1cm4gdGFnTmFtZSAhPT0gJ2Fubm90YXRpb24teG1sJyAmJiBzdHJpbmdNYXRjaCh0YWdOYW1lLCBDVVNUT01fRUxFTUVOVCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIF9zYW5pdGl6ZUF0dHJpYnV0ZXNcbiAgICpcbiAgICogQHByb3RlY3QgYXR0cmlidXRlc1xuICAgKiBAcHJvdGVjdCBub2RlTmFtZVxuICAgKiBAcHJvdGVjdCByZW1vdmVBdHRyaWJ1dGVcbiAgICogQHByb3RlY3Qgc2V0QXR0cmlidXRlXG4gICAqXG4gICAqIEBwYXJhbSBjdXJyZW50Tm9kZSB0byBzYW5pdGl6ZVxuICAgKi9cbiAgY29uc3QgX3Nhbml0aXplQXR0cmlidXRlcyA9IGZ1bmN0aW9uIChjdXJyZW50Tm9kZTogRWxlbWVudCk6IHZvaWQge1xuICAgIC8qIEV4ZWN1dGUgYSBob29rIGlmIHByZXNlbnQgKi9cbiAgICBfZXhlY3V0ZUhvb2tzKGhvb2tzLmJlZm9yZVNhbml0aXplQXR0cmlidXRlcywgY3VycmVudE5vZGUsIG51bGwpO1xuXG4gICAgY29uc3QgeyBhdHRyaWJ1dGVzIH0gPSBjdXJyZW50Tm9kZTtcblxuICAgIC8qIENoZWNrIGlmIHdlIGhhdmUgYXR0cmlidXRlczsgaWYgbm90IHdlIG1pZ2h0IGhhdmUgYSB0ZXh0IG5vZGUgKi9cbiAgICBpZiAoIWF0dHJpYnV0ZXMgfHwgX2lzQ2xvYmJlcmVkKGN1cnJlbnROb2RlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGhvb2tFdmVudCA9IHtcbiAgICAgIGF0dHJOYW1lOiAnJyxcbiAgICAgIGF0dHJWYWx1ZTogJycsXG4gICAgICBrZWVwQXR0cjogdHJ1ZSxcbiAgICAgIGFsbG93ZWRBdHRyaWJ1dGVzOiBBTExPV0VEX0FUVFIsXG4gICAgICBmb3JjZUtlZXBBdHRyOiB1bmRlZmluZWQsXG4gICAgfTtcbiAgICBsZXQgbCA9IGF0dHJpYnV0ZXMubGVuZ3RoO1xuXG4gICAgLyogR28gYmFja3dhcmRzIG92ZXIgYWxsIGF0dHJpYnV0ZXM7IHNhZmVseSByZW1vdmUgYmFkIG9uZXMgKi9cbiAgICB3aGlsZSAobC0tKSB7XG4gICAgICBjb25zdCBhdHRyID0gYXR0cmlidXRlc1tsXTtcbiAgICAgIGNvbnN0IHsgbmFtZSwgbmFtZXNwYWNlVVJJLCB2YWx1ZTogYXR0clZhbHVlIH0gPSBhdHRyO1xuICAgICAgY29uc3QgbGNOYW1lID0gdHJhbnNmb3JtQ2FzZUZ1bmMobmFtZSk7XG5cbiAgICAgIGNvbnN0IGluaXRWYWx1ZSA9IGF0dHJWYWx1ZTtcbiAgICAgIGxldCB2YWx1ZSA9IG5hbWUgPT09ICd2YWx1ZScgPyBpbml0VmFsdWUgOiBzdHJpbmdUcmltKGluaXRWYWx1ZSk7XG5cbiAgICAgIC8qIEV4ZWN1dGUgYSBob29rIGlmIHByZXNlbnQgKi9cbiAgICAgIGhvb2tFdmVudC5hdHRyTmFtZSA9IGxjTmFtZTtcbiAgICAgIGhvb2tFdmVudC5hdHRyVmFsdWUgPSB2YWx1ZTtcbiAgICAgIGhvb2tFdmVudC5rZWVwQXR0ciA9IHRydWU7XG4gICAgICBob29rRXZlbnQuZm9yY2VLZWVwQXR0ciA9IHVuZGVmaW5lZDsgLy8gQWxsb3dzIGRldmVsb3BlcnMgdG8gc2VlIHRoaXMgaXMgYSBwcm9wZXJ0eSB0aGV5IGNhbiBzZXRcbiAgICAgIF9leGVjdXRlSG9va3MoaG9va3MudXBvblNhbml0aXplQXR0cmlidXRlLCBjdXJyZW50Tm9kZSwgaG9va0V2ZW50KTtcbiAgICAgIHZhbHVlID0gaG9va0V2ZW50LmF0dHJWYWx1ZTtcblxuICAgICAgLyogRnVsbCBET00gQ2xvYmJlcmluZyBwcm90ZWN0aW9uIHZpYSBuYW1lc3BhY2UgaXNvbGF0aW9uLFxuICAgICAgICogUHJlZml4IGlkIGFuZCBuYW1lIGF0dHJpYnV0ZXMgd2l0aCBgdXNlci1jb250ZW50LWBcbiAgICAgICAqL1xuICAgICAgaWYgKFNBTklUSVpFX05BTUVEX1BST1BTICYmIChsY05hbWUgPT09ICdpZCcgfHwgbGNOYW1lID09PSAnbmFtZScpKSB7XG4gICAgICAgIC8vIFJlbW92ZSB0aGUgYXR0cmlidXRlIHdpdGggdGhpcyB2YWx1ZVxuICAgICAgICBfcmVtb3ZlQXR0cmlidXRlKG5hbWUsIGN1cnJlbnROb2RlKTtcblxuICAgICAgICAvLyBQcmVmaXggdGhlIHZhbHVlIGFuZCBsYXRlciByZS1jcmVhdGUgdGhlIGF0dHJpYnV0ZSB3aXRoIHRoZSBzYW5pdGl6ZWQgdmFsdWVcbiAgICAgICAgdmFsdWUgPSBTQU5JVElaRV9OQU1FRF9QUk9QU19QUkVGSVggKyB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgLyogV29yayBhcm91bmQgYSBzZWN1cml0eSBpc3N1ZSB3aXRoIGNvbW1lbnRzIGluc2lkZSBhdHRyaWJ1dGVzICovXG4gICAgICBpZiAoXG4gICAgICAgIFNBRkVfRk9SX1hNTCAmJlxuICAgICAgICByZWdFeHBUZXN0KFxuICAgICAgICAgIC8oKC0tIT98XSk+KXw8XFwvKHN0eWxlfHNjcmlwdHx0aXRsZXx4bXB8dGV4dGFyZWF8bm9zY3JpcHR8aWZyYW1lfG5vZW1iZWR8bm9mcmFtZXMpL2ksXG4gICAgICAgICAgdmFsdWVcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIF9yZW1vdmVBdHRyaWJ1dGUobmFtZSwgY3VycmVudE5vZGUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLyogTWFrZSBzdXJlIHdlIGNhbm5vdCBlYXNpbHkgdXNlIGFuaW1hdGVkIGhyZWZzLCBldmVuIGlmIGFuaW1hdGlvbnMgYXJlIGFsbG93ZWQgKi9cbiAgICAgIGlmIChsY05hbWUgPT09ICdhdHRyaWJ1dGVuYW1lJyAmJiBzdHJpbmdNYXRjaCh2YWx1ZSwgJ2hyZWYnKSkge1xuICAgICAgICBfcmVtb3ZlQXR0cmlidXRlKG5hbWUsIGN1cnJlbnROb2RlKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8qIERpZCB0aGUgaG9va3MgYXBwcm92ZSBvZiB0aGUgYXR0cmlidXRlPyAqL1xuICAgICAgaWYgKGhvb2tFdmVudC5mb3JjZUtlZXBBdHRyKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvKiBEaWQgdGhlIGhvb2tzIGFwcHJvdmUgb2YgdGhlIGF0dHJpYnV0ZT8gKi9cbiAgICAgIGlmICghaG9va0V2ZW50LmtlZXBBdHRyKSB7XG4gICAgICAgIF9yZW1vdmVBdHRyaWJ1dGUobmFtZSwgY3VycmVudE5vZGUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLyogV29yayBhcm91bmQgYSBzZWN1cml0eSBpc3N1ZSBpbiBqUXVlcnkgMy4wICovXG4gICAgICBpZiAoIUFMTE9XX1NFTEZfQ0xPU0VfSU5fQVRUUiAmJiByZWdFeHBUZXN0KC9cXC8+L2ksIHZhbHVlKSkge1xuICAgICAgICBfcmVtb3ZlQXR0cmlidXRlKG5hbWUsIGN1cnJlbnROb2RlKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8qIFNhbml0aXplIGF0dHJpYnV0ZSBjb250ZW50IHRvIGJlIHRlbXBsYXRlLXNhZmUgKi9cbiAgICAgIGlmIChTQUZFX0ZPUl9URU1QTEFURVMpIHtcbiAgICAgICAgYXJyYXlGb3JFYWNoKFtNVVNUQUNIRV9FWFBSLCBFUkJfRVhQUiwgVE1QTElUX0VYUFJdLCAoZXhwcjogUmVnRXhwKSA9PiB7XG4gICAgICAgICAgdmFsdWUgPSBzdHJpbmdSZXBsYWNlKHZhbHVlLCBleHByLCAnICcpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLyogSXMgYHZhbHVlYCB2YWxpZCBmb3IgdGhpcyBhdHRyaWJ1dGU/ICovXG4gICAgICBjb25zdCBsY1RhZyA9IHRyYW5zZm9ybUNhc2VGdW5jKGN1cnJlbnROb2RlLm5vZGVOYW1lKTtcbiAgICAgIGlmICghX2lzVmFsaWRBdHRyaWJ1dGUobGNUYWcsIGxjTmFtZSwgdmFsdWUpKSB7XG4gICAgICAgIF9yZW1vdmVBdHRyaWJ1dGUobmFtZSwgY3VycmVudE5vZGUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLyogSGFuZGxlIGF0dHJpYnV0ZXMgdGhhdCByZXF1aXJlIFRydXN0ZWQgVHlwZXMgKi9cbiAgICAgIGlmIChcbiAgICAgICAgdHJ1c3RlZFR5cGVzUG9saWN5ICYmXG4gICAgICAgIHR5cGVvZiB0cnVzdGVkVHlwZXMgPT09ICdvYmplY3QnICYmXG4gICAgICAgIHR5cGVvZiB0cnVzdGVkVHlwZXMuZ2V0QXR0cmlidXRlVHlwZSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgKSB7XG4gICAgICAgIGlmIChuYW1lc3BhY2VVUkkpIHtcbiAgICAgICAgICAvKiBOYW1lc3BhY2VzIGFyZSBub3QgeWV0IHN1cHBvcnRlZCwgc2VlIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTEzMDUyOTMgKi9cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzd2l0Y2ggKHRydXN0ZWRUeXBlcy5nZXRBdHRyaWJ1dGVUeXBlKGxjVGFnLCBsY05hbWUpKSB7XG4gICAgICAgICAgICBjYXNlICdUcnVzdGVkSFRNTCc6IHtcbiAgICAgICAgICAgICAgdmFsdWUgPSB0cnVzdGVkVHlwZXNQb2xpY3kuY3JlYXRlSFRNTCh2YWx1ZSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlICdUcnVzdGVkU2NyaXB0VVJMJzoge1xuICAgICAgICAgICAgICB2YWx1ZSA9IHRydXN0ZWRUeXBlc1BvbGljeS5jcmVhdGVTY3JpcHRVUkwodmFsdWUpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLyogSGFuZGxlIGludmFsaWQgZGF0YS0qIGF0dHJpYnV0ZSBzZXQgYnkgdHJ5LWNhdGNoaW5nIGl0ICovXG4gICAgICBpZiAodmFsdWUgIT09IGluaXRWYWx1ZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkpIHtcbiAgICAgICAgICAgIGN1cnJlbnROb2RlLnNldEF0dHJpYnV0ZU5TKG5hbWVzcGFjZVVSSSwgbmFtZSwgdmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvKiBGYWxsYmFjayB0byBzZXRBdHRyaWJ1dGUoKSBmb3IgYnJvd3Nlci11bnJlY29nbml6ZWQgbmFtZXNwYWNlcyBlLmcuIFwieC1zY2hlbWFcIi4gKi9cbiAgICAgICAgICAgIGN1cnJlbnROb2RlLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKF9pc0Nsb2JiZXJlZChjdXJyZW50Tm9kZSkpIHtcbiAgICAgICAgICAgIF9mb3JjZVJlbW92ZShjdXJyZW50Tm9kZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFycmF5UG9wKERPTVB1cmlmeS5yZW1vdmVkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgICBfcmVtb3ZlQXR0cmlidXRlKG5hbWUsIGN1cnJlbnROb2RlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qIEV4ZWN1dGUgYSBob29rIGlmIHByZXNlbnQgKi9cbiAgICBfZXhlY3V0ZUhvb2tzKGhvb2tzLmFmdGVyU2FuaXRpemVBdHRyaWJ1dGVzLCBjdXJyZW50Tm9kZSwgbnVsbCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIF9zYW5pdGl6ZVNoYWRvd0RPTVxuICAgKlxuICAgKiBAcGFyYW0gZnJhZ21lbnQgdG8gaXRlcmF0ZSBvdmVyIHJlY3Vyc2l2ZWx5XG4gICAqL1xuICBjb25zdCBfc2FuaXRpemVTaGFkb3dET00gPSBmdW5jdGlvbiAoZnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQpOiB2b2lkIHtcbiAgICBsZXQgc2hhZG93Tm9kZSA9IG51bGw7XG4gICAgY29uc3Qgc2hhZG93SXRlcmF0b3IgPSBfY3JlYXRlTm9kZUl0ZXJhdG9yKGZyYWdtZW50KTtcblxuICAgIC8qIEV4ZWN1dGUgYSBob29rIGlmIHByZXNlbnQgKi9cbiAgICBfZXhlY3V0ZUhvb2tzKGhvb2tzLmJlZm9yZVNhbml0aXplU2hhZG93RE9NLCBmcmFnbWVudCwgbnVsbCk7XG5cbiAgICB3aGlsZSAoKHNoYWRvd05vZGUgPSBzaGFkb3dJdGVyYXRvci5uZXh0Tm9kZSgpKSkge1xuICAgICAgLyogRXhlY3V0ZSBhIGhvb2sgaWYgcHJlc2VudCAqL1xuICAgICAgX2V4ZWN1dGVIb29rcyhob29rcy51cG9uU2FuaXRpemVTaGFkb3dOb2RlLCBzaGFkb3dOb2RlLCBudWxsKTtcblxuICAgICAgLyogU2FuaXRpemUgdGFncyBhbmQgZWxlbWVudHMgKi9cbiAgICAgIF9zYW5pdGl6ZUVsZW1lbnRzKHNoYWRvd05vZGUpO1xuXG4gICAgICAvKiBDaGVjayBhdHRyaWJ1dGVzIG5leHQgKi9cbiAgICAgIF9zYW5pdGl6ZUF0dHJpYnV0ZXMoc2hhZG93Tm9kZSk7XG5cbiAgICAgIC8qIERlZXAgc2hhZG93IERPTSBkZXRlY3RlZCAqL1xuICAgICAgaWYgKHNoYWRvd05vZGUuY29udGVudCBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpIHtcbiAgICAgICAgX3Nhbml0aXplU2hhZG93RE9NKHNoYWRvd05vZGUuY29udGVudCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogRXhlY3V0ZSBhIGhvb2sgaWYgcHJlc2VudCAqL1xuICAgIF9leGVjdXRlSG9va3MoaG9va3MuYWZ0ZXJTYW5pdGl6ZVNoYWRvd0RPTSwgZnJhZ21lbnQsIG51bGwpO1xuICB9O1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG4gIERPTVB1cmlmeS5zYW5pdGl6ZSA9IGZ1bmN0aW9uIChkaXJ0eSwgY2ZnID0ge30pIHtcbiAgICBsZXQgYm9keSA9IG51bGw7XG4gICAgbGV0IGltcG9ydGVkTm9kZSA9IG51bGw7XG4gICAgbGV0IGN1cnJlbnROb2RlID0gbnVsbDtcbiAgICBsZXQgcmV0dXJuTm9kZSA9IG51bGw7XG4gICAgLyogTWFrZSBzdXJlIHdlIGhhdmUgYSBzdHJpbmcgdG8gc2FuaXRpemUuXG4gICAgICBETyBOT1QgcmV0dXJuIGVhcmx5LCBhcyB0aGlzIHdpbGwgcmV0dXJuIHRoZSB3cm9uZyB0eXBlIGlmXG4gICAgICB0aGUgdXNlciBoYXMgcmVxdWVzdGVkIGEgRE9NIG9iamVjdCByYXRoZXIgdGhhbiBhIHN0cmluZyAqL1xuICAgIElTX0VNUFRZX0lOUFVUID0gIWRpcnR5O1xuICAgIGlmIChJU19FTVBUWV9JTlBVVCkge1xuICAgICAgZGlydHkgPSAnPCEtLT4nO1xuICAgIH1cblxuICAgIC8qIFN0cmluZ2lmeSwgaW4gY2FzZSBkaXJ0eSBpcyBhbiBvYmplY3QgKi9cbiAgICBpZiAodHlwZW9mIGRpcnR5ICE9PSAnc3RyaW5nJyAmJiAhX2lzTm9kZShkaXJ0eSkpIHtcbiAgICAgIGlmICh0eXBlb2YgZGlydHkudG9TdHJpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZGlydHkgPSBkaXJ0eS50b1N0cmluZygpO1xuICAgICAgICBpZiAodHlwZW9mIGRpcnR5ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IHR5cGVFcnJvckNyZWF0ZSgnZGlydHkgaXMgbm90IGEgc3RyaW5nLCBhYm9ydGluZycpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyB0eXBlRXJyb3JDcmVhdGUoJ3RvU3RyaW5nIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogUmV0dXJuIGRpcnR5IEhUTUwgaWYgRE9NUHVyaWZ5IGNhbm5vdCBydW4gKi9cbiAgICBpZiAoIURPTVB1cmlmeS5pc1N1cHBvcnRlZCkge1xuICAgICAgcmV0dXJuIGRpcnR5O1xuICAgIH1cblxuICAgIC8qIEFzc2lnbiBjb25maWcgdmFycyAqL1xuICAgIGlmICghU0VUX0NPTkZJRykge1xuICAgICAgX3BhcnNlQ29uZmlnKGNmZyk7XG4gICAgfVxuXG4gICAgLyogQ2xlYW4gdXAgcmVtb3ZlZCBlbGVtZW50cyAqL1xuICAgIERPTVB1cmlmeS5yZW1vdmVkID0gW107XG5cbiAgICAvKiBDaGVjayBpZiBkaXJ0eSBpcyBjb3JyZWN0bHkgdHlwZWQgZm9yIElOX1BMQUNFICovXG4gICAgaWYgKHR5cGVvZiBkaXJ0eSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIElOX1BMQUNFID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKElOX1BMQUNFKSB7XG4gICAgICAvKiBEbyBzb21lIGVhcmx5IHByZS1zYW5pdGl6YXRpb24gdG8gYXZvaWQgdW5zYWZlIHJvb3Qgbm9kZXMgKi9cbiAgICAgIGlmICgoZGlydHkgYXMgTm9kZSkubm9kZU5hbWUpIHtcbiAgICAgICAgY29uc3QgdGFnTmFtZSA9IHRyYW5zZm9ybUNhc2VGdW5jKChkaXJ0eSBhcyBOb2RlKS5ub2RlTmFtZSk7XG4gICAgICAgIGlmICghQUxMT1dFRF9UQUdTW3RhZ05hbWVdIHx8IEZPUkJJRF9UQUdTW3RhZ05hbWVdKSB7XG4gICAgICAgICAgdGhyb3cgdHlwZUVycm9yQ3JlYXRlKFxuICAgICAgICAgICAgJ3Jvb3Qgbm9kZSBpcyBmb3JiaWRkZW4gYW5kIGNhbm5vdCBiZSBzYW5pdGl6ZWQgaW4tcGxhY2UnXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZGlydHkgaW5zdGFuY2VvZiBOb2RlKSB7XG4gICAgICAvKiBJZiBkaXJ0eSBpcyBhIERPTSBlbGVtZW50LCBhcHBlbmQgdG8gYW4gZW1wdHkgZG9jdW1lbnQgdG8gYXZvaWRcbiAgICAgICAgIGVsZW1lbnRzIGJlaW5nIHN0cmlwcGVkIGJ5IHRoZSBwYXJzZXIgKi9cbiAgICAgIGJvZHkgPSBfaW5pdERvY3VtZW50KCc8IS0tLS0+Jyk7XG4gICAgICBpbXBvcnRlZE5vZGUgPSBib2R5Lm93bmVyRG9jdW1lbnQuaW1wb3J0Tm9kZShkaXJ0eSwgdHJ1ZSk7XG4gICAgICBpZiAoXG4gICAgICAgIGltcG9ydGVkTm9kZS5ub2RlVHlwZSA9PT0gTk9ERV9UWVBFLmVsZW1lbnQgJiZcbiAgICAgICAgaW1wb3J0ZWROb2RlLm5vZGVOYW1lID09PSAnQk9EWSdcbiAgICAgICkge1xuICAgICAgICAvKiBOb2RlIGlzIGFscmVhZHkgYSBib2R5LCB1c2UgYXMgaXMgKi9cbiAgICAgICAgYm9keSA9IGltcG9ydGVkTm9kZTtcbiAgICAgIH0gZWxzZSBpZiAoaW1wb3J0ZWROb2RlLm5vZGVOYW1lID09PSAnSFRNTCcpIHtcbiAgICAgICAgYm9keSA9IGltcG9ydGVkTm9kZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL3ByZWZlci1kb20tbm9kZS1hcHBlbmRcbiAgICAgICAgYm9keS5hcHBlbmRDaGlsZChpbXBvcnRlZE5vZGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvKiBFeGl0IGRpcmVjdGx5IGlmIHdlIGhhdmUgbm90aGluZyB0byBkbyAqL1xuICAgICAgaWYgKFxuICAgICAgICAhUkVUVVJOX0RPTSAmJlxuICAgICAgICAhU0FGRV9GT1JfVEVNUExBVEVTICYmXG4gICAgICAgICFXSE9MRV9ET0NVTUVOVCAmJlxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9wcmVmZXItaW5jbHVkZXNcbiAgICAgICAgZGlydHkuaW5kZXhPZignPCcpID09PSAtMVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0cnVzdGVkVHlwZXNQb2xpY3kgJiYgUkVUVVJOX1RSVVNURURfVFlQRVxuICAgICAgICAgID8gdHJ1c3RlZFR5cGVzUG9saWN5LmNyZWF0ZUhUTUwoZGlydHkpXG4gICAgICAgICAgOiBkaXJ0eTtcbiAgICAgIH1cblxuICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgZG9jdW1lbnQgdG8gd29yayBvbiAqL1xuICAgICAgYm9keSA9IF9pbml0RG9jdW1lbnQoZGlydHkpO1xuXG4gICAgICAvKiBDaGVjayB3ZSBoYXZlIGEgRE9NIG5vZGUgZnJvbSB0aGUgZGF0YSAqL1xuICAgICAgaWYgKCFib2R5KSB7XG4gICAgICAgIHJldHVybiBSRVRVUk5fRE9NID8gbnVsbCA6IFJFVFVSTl9UUlVTVEVEX1RZUEUgPyBlbXB0eUhUTUwgOiAnJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBSZW1vdmUgZmlyc3QgZWxlbWVudCBub2RlIChvdXJzKSBpZiBGT1JDRV9CT0RZIGlzIHNldCAqL1xuICAgIGlmIChib2R5ICYmIEZPUkNFX0JPRFkpIHtcbiAgICAgIF9mb3JjZVJlbW92ZShib2R5LmZpcnN0Q2hpbGQpO1xuICAgIH1cblxuICAgIC8qIEdldCBub2RlIGl0ZXJhdG9yICovXG4gICAgY29uc3Qgbm9kZUl0ZXJhdG9yID0gX2NyZWF0ZU5vZGVJdGVyYXRvcihJTl9QTEFDRSA/IGRpcnR5IDogYm9keSk7XG5cbiAgICAvKiBOb3cgc3RhcnQgaXRlcmF0aW5nIG92ZXIgdGhlIGNyZWF0ZWQgZG9jdW1lbnQgKi9cbiAgICB3aGlsZSAoKGN1cnJlbnROb2RlID0gbm9kZUl0ZXJhdG9yLm5leHROb2RlKCkpKSB7XG4gICAgICAvKiBTYW5pdGl6ZSB0YWdzIGFuZCBlbGVtZW50cyAqL1xuICAgICAgX3Nhbml0aXplRWxlbWVudHMoY3VycmVudE5vZGUpO1xuXG4gICAgICAvKiBDaGVjayBhdHRyaWJ1dGVzIG5leHQgKi9cbiAgICAgIF9zYW5pdGl6ZUF0dHJpYnV0ZXMoY3VycmVudE5vZGUpO1xuXG4gICAgICAvKiBTaGFkb3cgRE9NIGRldGVjdGVkLCBzYW5pdGl6ZSBpdCAqL1xuICAgICAgaWYgKGN1cnJlbnROb2RlLmNvbnRlbnQgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KSB7XG4gICAgICAgIF9zYW5pdGl6ZVNoYWRvd0RPTShjdXJyZW50Tm9kZS5jb250ZW50KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBJZiB3ZSBzYW5pdGl6ZWQgYGRpcnR5YCBpbi1wbGFjZSwgcmV0dXJuIGl0LiAqL1xuICAgIGlmIChJTl9QTEFDRSkge1xuICAgICAgcmV0dXJuIGRpcnR5O1xuICAgIH1cblxuICAgIC8qIFJldHVybiBzYW5pdGl6ZWQgc3RyaW5nIG9yIERPTSAqL1xuICAgIGlmIChSRVRVUk5fRE9NKSB7XG4gICAgICBpZiAoUkVUVVJOX0RPTV9GUkFHTUVOVCkge1xuICAgICAgICByZXR1cm5Ob2RlID0gY3JlYXRlRG9jdW1lbnRGcmFnbWVudC5jYWxsKGJvZHkub3duZXJEb2N1bWVudCk7XG5cbiAgICAgICAgd2hpbGUgKGJvZHkuZmlyc3RDaGlsZCkge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL3ByZWZlci1kb20tbm9kZS1hcHBlbmRcbiAgICAgICAgICByZXR1cm5Ob2RlLmFwcGVuZENoaWxkKGJvZHkuZmlyc3RDaGlsZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybk5vZGUgPSBib2R5O1xuICAgICAgfVxuXG4gICAgICBpZiAoQUxMT1dFRF9BVFRSLnNoYWRvd3Jvb3QgfHwgQUxMT1dFRF9BVFRSLnNoYWRvd3Jvb3Rtb2RlKSB7XG4gICAgICAgIC8qXG4gICAgICAgICAgQWRvcHROb2RlKCkgaXMgbm90IHVzZWQgYmVjYXVzZSBpbnRlcm5hbCBzdGF0ZSBpcyBub3QgcmVzZXRcbiAgICAgICAgICAoZS5nLiB0aGUgcGFzdCBuYW1lcyBtYXAgb2YgYSBIVE1MRm9ybUVsZW1lbnQpLCB0aGlzIGlzIHNhZmVcbiAgICAgICAgICBpbiB0aGVvcnkgYnV0IHdlIHdvdWxkIHJhdGhlciBub3QgcmlzayBhbm90aGVyIGF0dGFjayB2ZWN0b3IuXG4gICAgICAgICAgVGhlIHN0YXRlIHRoYXQgaXMgY2xvbmVkIGJ5IGltcG9ydE5vZGUoKSBpcyBleHBsaWNpdGx5IGRlZmluZWRcbiAgICAgICAgICBieSB0aGUgc3BlY3MuXG4gICAgICAgICovXG4gICAgICAgIHJldHVybk5vZGUgPSBpbXBvcnROb2RlLmNhbGwob3JpZ2luYWxEb2N1bWVudCwgcmV0dXJuTm9kZSwgdHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXR1cm5Ob2RlO1xuICAgIH1cblxuICAgIGxldCBzZXJpYWxpemVkSFRNTCA9IFdIT0xFX0RPQ1VNRU5UID8gYm9keS5vdXRlckhUTUwgOiBib2R5LmlubmVySFRNTDtcblxuICAgIC8qIFNlcmlhbGl6ZSBkb2N0eXBlIGlmIGFsbG93ZWQgKi9cbiAgICBpZiAoXG4gICAgICBXSE9MRV9ET0NVTUVOVCAmJlxuICAgICAgQUxMT1dFRF9UQUdTWychZG9jdHlwZSddICYmXG4gICAgICBib2R5Lm93bmVyRG9jdW1lbnQgJiZcbiAgICAgIGJvZHkub3duZXJEb2N1bWVudC5kb2N0eXBlICYmXG4gICAgICBib2R5Lm93bmVyRG9jdW1lbnQuZG9jdHlwZS5uYW1lICYmXG4gICAgICByZWdFeHBUZXN0KEVYUFJFU1NJT05TLkRPQ1RZUEVfTkFNRSwgYm9keS5vd25lckRvY3VtZW50LmRvY3R5cGUubmFtZSlcbiAgICApIHtcbiAgICAgIHNlcmlhbGl6ZWRIVE1MID1cbiAgICAgICAgJzwhRE9DVFlQRSAnICsgYm9keS5vd25lckRvY3VtZW50LmRvY3R5cGUubmFtZSArICc+XFxuJyArIHNlcmlhbGl6ZWRIVE1MO1xuICAgIH1cblxuICAgIC8qIFNhbml0aXplIGZpbmFsIHN0cmluZyB0ZW1wbGF0ZS1zYWZlICovXG4gICAgaWYgKFNBRkVfRk9SX1RFTVBMQVRFUykge1xuICAgICAgYXJyYXlGb3JFYWNoKFtNVVNUQUNIRV9FWFBSLCBFUkJfRVhQUiwgVE1QTElUX0VYUFJdLCAoZXhwcjogUmVnRXhwKSA9PiB7XG4gICAgICAgIHNlcmlhbGl6ZWRIVE1MID0gc3RyaW5nUmVwbGFjZShzZXJpYWxpemVkSFRNTCwgZXhwciwgJyAnKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVzdGVkVHlwZXNQb2xpY3kgJiYgUkVUVVJOX1RSVVNURURfVFlQRVxuICAgICAgPyB0cnVzdGVkVHlwZXNQb2xpY3kuY3JlYXRlSFRNTChzZXJpYWxpemVkSFRNTClcbiAgICAgIDogc2VyaWFsaXplZEhUTUw7XG4gIH07XG5cbiAgRE9NUHVyaWZ5LnNldENvbmZpZyA9IGZ1bmN0aW9uIChjZmcgPSB7fSkge1xuICAgIF9wYXJzZUNvbmZpZyhjZmcpO1xuICAgIFNFVF9DT05GSUcgPSB0cnVlO1xuICB9O1xuXG4gIERPTVB1cmlmeS5jbGVhckNvbmZpZyA9IGZ1bmN0aW9uICgpIHtcbiAgICBDT05GSUcgPSBudWxsO1xuICAgIFNFVF9DT05GSUcgPSBmYWxzZTtcbiAgfTtcblxuICBET01QdXJpZnkuaXNWYWxpZEF0dHJpYnV0ZSA9IGZ1bmN0aW9uICh0YWcsIGF0dHIsIHZhbHVlKSB7XG4gICAgLyogSW5pdGlhbGl6ZSBzaGFyZWQgY29uZmlnIHZhcnMgaWYgbmVjZXNzYXJ5LiAqL1xuICAgIGlmICghQ09ORklHKSB7XG4gICAgICBfcGFyc2VDb25maWcoe30pO1xuICAgIH1cblxuICAgIGNvbnN0IGxjVGFnID0gdHJhbnNmb3JtQ2FzZUZ1bmModGFnKTtcbiAgICBjb25zdCBsY05hbWUgPSB0cmFuc2Zvcm1DYXNlRnVuYyhhdHRyKTtcbiAgICByZXR1cm4gX2lzVmFsaWRBdHRyaWJ1dGUobGNUYWcsIGxjTmFtZSwgdmFsdWUpO1xuICB9O1xuXG4gIERPTVB1cmlmeS5hZGRIb29rID0gZnVuY3Rpb24gKFxuICAgIGVudHJ5UG9pbnQ6IGtleW9mIEhvb2tzTWFwLFxuICAgIGhvb2tGdW5jdGlvbjogSG9va0Z1bmN0aW9uXG4gICkge1xuICAgIGlmICh0eXBlb2YgaG9va0Z1bmN0aW9uICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXJyYXlQdXNoKGhvb2tzW2VudHJ5UG9pbnRdLCBob29rRnVuY3Rpb24pO1xuICB9O1xuXG4gIERPTVB1cmlmeS5yZW1vdmVIb29rID0gZnVuY3Rpb24gKFxuICAgIGVudHJ5UG9pbnQ6IGtleW9mIEhvb2tzTWFwLFxuICAgIGhvb2tGdW5jdGlvbjogSG9va0Z1bmN0aW9uXG4gICkge1xuICAgIGlmIChob29rRnVuY3Rpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgaW5kZXggPSBhcnJheUxhc3RJbmRleE9mKGhvb2tzW2VudHJ5UG9pbnRdLCBob29rRnVuY3Rpb24pO1xuXG4gICAgICByZXR1cm4gaW5kZXggPT09IC0xXG4gICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgIDogYXJyYXlTcGxpY2UoaG9va3NbZW50cnlQb2ludF0sIGluZGV4LCAxKVswXTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJyYXlQb3AoaG9va3NbZW50cnlQb2ludF0pO1xuICB9O1xuXG4gIERPTVB1cmlmeS5yZW1vdmVIb29rcyA9IGZ1bmN0aW9uIChlbnRyeVBvaW50OiBrZXlvZiBIb29rc01hcCkge1xuICAgIGhvb2tzW2VudHJ5UG9pbnRdID0gW107XG4gIH07XG5cbiAgRE9NUHVyaWZ5LnJlbW92ZUFsbEhvb2tzID0gZnVuY3Rpb24gKCkge1xuICAgIGhvb2tzID0gX2NyZWF0ZUhvb2tzTWFwKCk7XG4gIH07XG5cbiAgcmV0dXJuIERPTVB1cmlmeTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlRE9NUHVyaWZ5KCk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRE9NUHVyaWZ5IHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBET01QdXJpZnkgaW5zdGFuY2UgdXNpbmcgdGhlIGdpdmVuIHdpbmRvdy1saWtlIG9iamVjdC4gRGVmYXVsdHMgdG8gYHdpbmRvd2AuXG4gICAqL1xuICAocm9vdD86IFdpbmRvd0xpa2UpOiBET01QdXJpZnk7XG5cbiAgLyoqXG4gICAqIFZlcnNpb24gbGFiZWwsIGV4cG9zZWQgZm9yIGVhc2llciBjaGVja3NcbiAgICogaWYgRE9NUHVyaWZ5IGlzIHVwIHRvIGRhdGUgb3Igbm90XG4gICAqL1xuICB2ZXJzaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFycmF5IG9mIGVsZW1lbnRzIHRoYXQgRE9NUHVyaWZ5IHJlbW92ZWQgZHVyaW5nIHNhbml0YXRpb24uXG4gICAqIEVtcHR5IGlmIG5vdGhpbmcgd2FzIHJlbW92ZWQuXG4gICAqL1xuICByZW1vdmVkOiBBcnJheTxSZW1vdmVkRWxlbWVudCB8IFJlbW92ZWRBdHRyaWJ1dGU+O1xuXG4gIC8qKlxuICAgKiBFeHBvc2Ugd2hldGhlciB0aGlzIGJyb3dzZXIgc3VwcG9ydHMgcnVubmluZyB0aGUgZnVsbCBET01QdXJpZnkuXG4gICAqL1xuICBpc1N1cHBvcnRlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogU2V0IHRoZSBjb25maWd1cmF0aW9uIG9uY2UuXG4gICAqXG4gICAqIEBwYXJhbSBjZmcgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICovXG4gIHNldENvbmZpZyhjZmc/OiBDb25maWcpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHRoZSBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgY2xlYXJDb25maWcoKTogdm9pZDtcblxuICAvKipcbiAgICogUHJvdmlkZXMgY29yZSBzYW5pdGF0aW9uIGZ1bmN0aW9uYWxpdHkuXG4gICAqXG4gICAqIEBwYXJhbSBkaXJ0eSBzdHJpbmcgb3IgRE9NIG5vZGVcbiAgICogQHBhcmFtIGNmZyBvYmplY3RcbiAgICogQHJldHVybnMgU2FuaXRpemVkIFRydXN0ZWRIVE1MLlxuICAgKi9cbiAgc2FuaXRpemUoXG4gICAgZGlydHk6IHN0cmluZyB8IE5vZGUsXG4gICAgY2ZnOiBDb25maWcgJiB7IFJFVFVSTl9UUlVTVEVEX1RZUEU6IHRydWUgfVxuICApOiBUcnVzdGVkSFRNTDtcblxuICAvKipcbiAgICogUHJvdmlkZXMgY29yZSBzYW5pdGF0aW9uIGZ1bmN0aW9uYWxpdHkuXG4gICAqXG4gICAqIEBwYXJhbSBkaXJ0eSBET00gbm9kZVxuICAgKiBAcGFyYW0gY2ZnIG9iamVjdFxuICAgKiBAcmV0dXJucyBTYW5pdGl6ZWQgRE9NIG5vZGUuXG4gICAqL1xuICBzYW5pdGl6ZShkaXJ0eTogTm9kZSwgY2ZnOiBDb25maWcgJiB7IElOX1BMQUNFOiB0cnVlIH0pOiBOb2RlO1xuXG4gIC8qKlxuICAgKiBQcm92aWRlcyBjb3JlIHNhbml0YXRpb24gZnVuY3Rpb25hbGl0eS5cbiAgICpcbiAgICogQHBhcmFtIGRpcnR5IHN0cmluZyBvciBET00gbm9kZVxuICAgKiBAcGFyYW0gY2ZnIG9iamVjdFxuICAgKiBAcmV0dXJucyBTYW5pdGl6ZWQgRE9NIG5vZGUuXG4gICAqL1xuICBzYW5pdGl6ZShkaXJ0eTogc3RyaW5nIHwgTm9kZSwgY2ZnOiBDb25maWcgJiB7IFJFVFVSTl9ET006IHRydWUgfSk6IE5vZGU7XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVzIGNvcmUgc2FuaXRhdGlvbiBmdW5jdGlvbmFsaXR5LlxuICAgKlxuICAgKiBAcGFyYW0gZGlydHkgc3RyaW5nIG9yIERPTSBub2RlXG4gICAqIEBwYXJhbSBjZmcgb2JqZWN0XG4gICAqIEByZXR1cm5zIFNhbml0aXplZCBkb2N1bWVudCBmcmFnbWVudC5cbiAgICovXG4gIHNhbml0aXplKFxuICAgIGRpcnR5OiBzdHJpbmcgfCBOb2RlLFxuICAgIGNmZzogQ29uZmlnICYgeyBSRVRVUk5fRE9NX0ZSQUdNRU5UOiB0cnVlIH1cbiAgKTogRG9jdW1lbnRGcmFnbWVudDtcblxuICAvKipcbiAgICogUHJvdmlkZXMgY29yZSBzYW5pdGF0aW9uIGZ1bmN0aW9uYWxpdHkuXG4gICAqXG4gICAqIEBwYXJhbSBkaXJ0eSBzdHJpbmcgb3IgRE9NIG5vZGVcbiAgICogQHBhcmFtIGNmZyBvYmplY3RcbiAgICogQHJldHVybnMgU2FuaXRpemVkIHN0cmluZy5cbiAgICovXG4gIHNhbml0aXplKGRpcnR5OiBzdHJpbmcgfCBOb2RlLCBjZmc/OiBDb25maWcpOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhbiBhdHRyaWJ1dGUgdmFsdWUgaXMgdmFsaWQuXG4gICAqIFVzZXMgbGFzdCBzZXQgY29uZmlnLCBpZiBhbnkuIE90aGVyd2lzZSwgdXNlcyBjb25maWcgZGVmYXVsdHMuXG4gICAqXG4gICAqIEBwYXJhbSB0YWcgVGFnIG5hbWUgb2YgY29udGFpbmluZyBlbGVtZW50LlxuICAgKiBAcGFyYW0gYXR0ciBBdHRyaWJ1dGUgbmFtZS5cbiAgICogQHBhcmFtIHZhbHVlIEF0dHJpYnV0ZSB2YWx1ZS5cbiAgICogQHJldHVybnMgUmV0dXJucyB0cnVlIGlmIGB2YWx1ZWAgaXMgdmFsaWQuIE90aGVyd2lzZSwgcmV0dXJucyBmYWxzZS5cbiAgICovXG4gIGlzVmFsaWRBdHRyaWJ1dGUodGFnOiBzdHJpbmcsIGF0dHI6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBET01QdXJpZnkgaG9vay5cbiAgICpcbiAgICogQHBhcmFtIGVudHJ5UG9pbnQgZW50cnkgcG9pbnQgZm9yIHRoZSBob29rIHRvIGFkZFxuICAgKiBAcGFyYW0gaG9va0Z1bmN0aW9uIGZ1bmN0aW9uIHRvIGV4ZWN1dGVcbiAgICovXG4gIGFkZEhvb2soZW50cnlQb2ludDogQmFzaWNIb29rTmFtZSwgaG9va0Z1bmN0aW9uOiBOb2RlSG9vayk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBET01QdXJpZnkgaG9vay5cbiAgICpcbiAgICogQHBhcmFtIGVudHJ5UG9pbnQgZW50cnkgcG9pbnQgZm9yIHRoZSBob29rIHRvIGFkZFxuICAgKiBAcGFyYW0gaG9va0Z1bmN0aW9uIGZ1bmN0aW9uIHRvIGV4ZWN1dGVcbiAgICovXG4gIGFkZEhvb2soZW50cnlQb2ludDogRWxlbWVudEhvb2tOYW1lLCBob29rRnVuY3Rpb246IEVsZW1lbnRIb29rKTogdm9pZDtcblxuICAvKipcbiAgICogQWRkcyBhIERPTVB1cmlmeSBob29rLlxuICAgKlxuICAgKiBAcGFyYW0gZW50cnlQb2ludCBlbnRyeSBwb2ludCBmb3IgdGhlIGhvb2sgdG8gYWRkXG4gICAqIEBwYXJhbSBob29rRnVuY3Rpb24gZnVuY3Rpb24gdG8gZXhlY3V0ZVxuICAgKi9cbiAgYWRkSG9vayhcbiAgICBlbnRyeVBvaW50OiBEb2N1bWVudEZyYWdtZW50SG9va05hbWUsXG4gICAgaG9va0Z1bmN0aW9uOiBEb2N1bWVudEZyYWdtZW50SG9va1xuICApOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBBZGRzIGEgRE9NUHVyaWZ5IGhvb2suXG4gICAqXG4gICAqIEBwYXJhbSBlbnRyeVBvaW50IGVudHJ5IHBvaW50IGZvciB0aGUgaG9vayB0byBhZGRcbiAgICogQHBhcmFtIGhvb2tGdW5jdGlvbiBmdW5jdGlvbiB0byBleGVjdXRlXG4gICAqL1xuICBhZGRIb29rKFxuICAgIGVudHJ5UG9pbnQ6ICd1cG9uU2FuaXRpemVFbGVtZW50JyxcbiAgICBob29rRnVuY3Rpb246IFVwb25TYW5pdGl6ZUVsZW1lbnRIb29rXG4gICk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBET01QdXJpZnkgaG9vay5cbiAgICpcbiAgICogQHBhcmFtIGVudHJ5UG9pbnQgZW50cnkgcG9pbnQgZm9yIHRoZSBob29rIHRvIGFkZFxuICAgKiBAcGFyYW0gaG9va0Z1bmN0aW9uIGZ1bmN0aW9uIHRvIGV4ZWN1dGVcbiAgICovXG4gIGFkZEhvb2soXG4gICAgZW50cnlQb2ludDogJ3Vwb25TYW5pdGl6ZUF0dHJpYnV0ZScsXG4gICAgaG9va0Z1bmN0aW9uOiBVcG9uU2FuaXRpemVBdHRyaWJ1dGVIb29rXG4gICk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIERPTVB1cmlmeSBob29rIGF0IGEgZ2l2ZW4gZW50cnlQb2ludFxuICAgKiAocG9wcyBpdCBmcm9tIHRoZSBzdGFjayBvZiBob29rcyBpZiBob29rIG5vdCBzcGVjaWZpZWQpXG4gICAqXG4gICAqIEBwYXJhbSBlbnRyeVBvaW50IGVudHJ5IHBvaW50IGZvciB0aGUgaG9vayB0byByZW1vdmVcbiAgICogQHBhcmFtIGhvb2tGdW5jdGlvbiBvcHRpb25hbCBzcGVjaWZpYyBob29rIHRvIHJlbW92ZVxuICAgKiBAcmV0dXJucyByZW1vdmVkIGhvb2tcbiAgICovXG4gIHJlbW92ZUhvb2soXG4gICAgZW50cnlQb2ludDogQmFzaWNIb29rTmFtZSxcbiAgICBob29rRnVuY3Rpb24/OiBOb2RlSG9va1xuICApOiBOb2RlSG9vayB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogUmVtb3ZlIGEgRE9NUHVyaWZ5IGhvb2sgYXQgYSBnaXZlbiBlbnRyeVBvaW50XG4gICAqIChwb3BzIGl0IGZyb20gdGhlIHN0YWNrIG9mIGhvb2tzIGlmIGhvb2sgbm90IHNwZWNpZmllZClcbiAgICpcbiAgICogQHBhcmFtIGVudHJ5UG9pbnQgZW50cnkgcG9pbnQgZm9yIHRoZSBob29rIHRvIHJlbW92ZVxuICAgKiBAcGFyYW0gaG9va0Z1bmN0aW9uIG9wdGlvbmFsIHNwZWNpZmljIGhvb2sgdG8gcmVtb3ZlXG4gICAqIEByZXR1cm5zIHJlbW92ZWQgaG9va1xuICAgKi9cbiAgcmVtb3ZlSG9vayhcbiAgICBlbnRyeVBvaW50OiBFbGVtZW50SG9va05hbWUsXG4gICAgaG9va0Z1bmN0aW9uPzogRWxlbWVudEhvb2tcbiAgKTogRWxlbWVudEhvb2sgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIERPTVB1cmlmeSBob29rIGF0IGEgZ2l2ZW4gZW50cnlQb2ludFxuICAgKiAocG9wcyBpdCBmcm9tIHRoZSBzdGFjayBvZiBob29rcyBpZiBob29rIG5vdCBzcGVjaWZpZWQpXG4gICAqXG4gICAqIEBwYXJhbSBlbnRyeVBvaW50IGVudHJ5IHBvaW50IGZvciB0aGUgaG9vayB0byByZW1vdmVcbiAgICogQHBhcmFtIGhvb2tGdW5jdGlvbiBvcHRpb25hbCBzcGVjaWZpYyBob29rIHRvIHJlbW92ZVxuICAgKiBAcmV0dXJucyByZW1vdmVkIGhvb2tcbiAgICovXG4gIHJlbW92ZUhvb2soXG4gICAgZW50cnlQb2ludDogRG9jdW1lbnRGcmFnbWVudEhvb2tOYW1lLFxuICAgIGhvb2tGdW5jdGlvbj86IERvY3VtZW50RnJhZ21lbnRIb29rXG4gICk6IERvY3VtZW50RnJhZ21lbnRIb29rIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBET01QdXJpZnkgaG9vayBhdCBhIGdpdmVuIGVudHJ5UG9pbnRcbiAgICogKHBvcHMgaXQgZnJvbSB0aGUgc3RhY2sgb2YgaG9va3MgaWYgaG9vayBub3Qgc3BlY2lmaWVkKVxuICAgKlxuICAgKiBAcGFyYW0gZW50cnlQb2ludCBlbnRyeSBwb2ludCBmb3IgdGhlIGhvb2sgdG8gcmVtb3ZlXG4gICAqIEBwYXJhbSBob29rRnVuY3Rpb24gb3B0aW9uYWwgc3BlY2lmaWMgaG9vayB0byByZW1vdmVcbiAgICogQHJldHVybnMgcmVtb3ZlZCBob29rXG4gICAqL1xuICByZW1vdmVIb29rKFxuICAgIGVudHJ5UG9pbnQ6ICd1cG9uU2FuaXRpemVFbGVtZW50JyxcbiAgICBob29rRnVuY3Rpb24/OiBVcG9uU2FuaXRpemVFbGVtZW50SG9va1xuICApOiBVcG9uU2FuaXRpemVFbGVtZW50SG9vayB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogUmVtb3ZlIGEgRE9NUHVyaWZ5IGhvb2sgYXQgYSBnaXZlbiBlbnRyeVBvaW50XG4gICAqIChwb3BzIGl0IGZyb20gdGhlIHN0YWNrIG9mIGhvb2tzIGlmIGhvb2sgbm90IHNwZWNpZmllZClcbiAgICpcbiAgICogQHBhcmFtIGVudHJ5UG9pbnQgZW50cnkgcG9pbnQgZm9yIHRoZSBob29rIHRvIHJlbW92ZVxuICAgKiBAcGFyYW0gaG9va0Z1bmN0aW9uIG9wdGlvbmFsIHNwZWNpZmljIGhvb2sgdG8gcmVtb3ZlXG4gICAqIEByZXR1cm5zIHJlbW92ZWQgaG9va1xuICAgKi9cbiAgcmVtb3ZlSG9vayhcbiAgICBlbnRyeVBvaW50OiAndXBvblNhbml0aXplQXR0cmlidXRlJyxcbiAgICBob29rRnVuY3Rpb24/OiBVcG9uU2FuaXRpemVBdHRyaWJ1dGVIb29rXG4gICk6IFVwb25TYW5pdGl6ZUF0dHJpYnV0ZUhvb2sgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYWxsIERPTVB1cmlmeSBob29rcyBhdCBhIGdpdmVuIGVudHJ5UG9pbnRcbiAgICpcbiAgICogQHBhcmFtIGVudHJ5UG9pbnQgZW50cnkgcG9pbnQgZm9yIHRoZSBob29rcyB0byByZW1vdmVcbiAgICovXG4gIHJlbW92ZUhvb2tzKGVudHJ5UG9pbnQ6IEhvb2tOYW1lKTogdm9pZDtcblxuICAvKipcbiAgICogUmVtb3ZlcyBhbGwgRE9NUHVyaWZ5IGhvb2tzLlxuICAgKi9cbiAgcmVtb3ZlQWxsSG9va3MoKTogdm9pZDtcbn1cblxuLyoqXG4gKiBBbiBlbGVtZW50IHJlbW92ZWQgYnkgRE9NUHVyaWZ5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbW92ZWRFbGVtZW50IHtcbiAgLyoqXG4gICAqIFRoZSBlbGVtZW50IHRoYXQgd2FzIHJlbW92ZWQuXG4gICAqL1xuICBlbGVtZW50OiBOb2RlO1xufVxuXG4vKipcbiAqIEFuIGVsZW1lbnQgcmVtb3ZlZCBieSBET01QdXJpZnkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVtb3ZlZEF0dHJpYnV0ZSB7XG4gIC8qKlxuICAgKiBUaGUgYXR0cmlidXRlIHRoYXQgd2FzIHJlbW92ZWQuXG4gICAqL1xuICBhdHRyaWJ1dGU6IEF0dHIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgZWxlbWVudCB0aGF0IHRoZSBhdHRyaWJ1dGUgd2FzIHJlbW92ZWQuXG4gICAqL1xuICBmcm9tOiBOb2RlO1xufVxuXG50eXBlIEJhc2ljSG9va05hbWUgPVxuICB8ICdiZWZvcmVTYW5pdGl6ZUVsZW1lbnRzJ1xuICB8ICdhZnRlclNhbml0aXplRWxlbWVudHMnXG4gIHwgJ3Vwb25TYW5pdGl6ZVNoYWRvd05vZGUnO1xudHlwZSBFbGVtZW50SG9va05hbWUgPSAnYmVmb3JlU2FuaXRpemVBdHRyaWJ1dGVzJyB8ICdhZnRlclNhbml0aXplQXR0cmlidXRlcyc7XG50eXBlIERvY3VtZW50RnJhZ21lbnRIb29rTmFtZSA9XG4gIHwgJ2JlZm9yZVNhbml0aXplU2hhZG93RE9NJ1xuICB8ICdhZnRlclNhbml0aXplU2hhZG93RE9NJztcbnR5cGUgVXBvblNhbml0aXplRWxlbWVudEhvb2tOYW1lID0gJ3Vwb25TYW5pdGl6ZUVsZW1lbnQnO1xudHlwZSBVcG9uU2FuaXRpemVBdHRyaWJ1dGVIb29rTmFtZSA9ICd1cG9uU2FuaXRpemVBdHRyaWJ1dGUnO1xuXG5pbnRlcmZhY2UgSG9va3NNYXAge1xuICBiZWZvcmVTYW5pdGl6ZUVsZW1lbnRzOiBOb2RlSG9va1tdO1xuICBhZnRlclNhbml0aXplRWxlbWVudHM6IE5vZGVIb29rW107XG4gIGJlZm9yZVNhbml0aXplU2hhZG93RE9NOiBEb2N1bWVudEZyYWdtZW50SG9va1tdO1xuICB1cG9uU2FuaXRpemVTaGFkb3dOb2RlOiBOb2RlSG9va1tdO1xuICBhZnRlclNhbml0aXplU2hhZG93RE9NOiBEb2N1bWVudEZyYWdtZW50SG9va1tdO1xuICBiZWZvcmVTYW5pdGl6ZUF0dHJpYnV0ZXM6IEVsZW1lbnRIb29rW107XG4gIGFmdGVyU2FuaXRpemVBdHRyaWJ1dGVzOiBFbGVtZW50SG9va1tdO1xuICB1cG9uU2FuaXRpemVFbGVtZW50OiBVcG9uU2FuaXRpemVFbGVtZW50SG9va1tdO1xuICB1cG9uU2FuaXRpemVBdHRyaWJ1dGU6IFVwb25TYW5pdGl6ZUF0dHJpYnV0ZUhvb2tbXTtcbn1cblxudHlwZSBBcnJheUVsZW1lbnQ8VD4gPSBUIGV4dGVuZHMgQXJyYXk8aW5mZXIgVT4gPyBVIDogbmV2ZXI7XG5cbnR5cGUgSG9va0Z1bmN0aW9uID0gQXJyYXlFbGVtZW50PEhvb2tzTWFwW2tleW9mIEhvb2tzTWFwXT47XG5cbmV4cG9ydCB0eXBlIEhvb2tOYW1lID1cbiAgfCBCYXNpY0hvb2tOYW1lXG4gIHwgRWxlbWVudEhvb2tOYW1lXG4gIHwgRG9jdW1lbnRGcmFnbWVudEhvb2tOYW1lXG4gIHwgVXBvblNhbml0aXplRWxlbWVudEhvb2tOYW1lXG4gIHwgVXBvblNhbml0aXplQXR0cmlidXRlSG9va05hbWU7XG5cbmV4cG9ydCB0eXBlIE5vZGVIb29rID0gKFxuICB0aGlzOiBET01QdXJpZnksXG4gIGN1cnJlbnROb2RlOiBOb2RlLFxuICBob29rRXZlbnQ6IG51bGwsXG4gIGNvbmZpZzogQ29uZmlnXG4pID0+IHZvaWQ7XG5cbmV4cG9ydCB0eXBlIEVsZW1lbnRIb29rID0gKFxuICB0aGlzOiBET01QdXJpZnksXG4gIGN1cnJlbnROb2RlOiBFbGVtZW50LFxuICBob29rRXZlbnQ6IG51bGwsXG4gIGNvbmZpZzogQ29uZmlnXG4pID0+IHZvaWQ7XG5cbmV4cG9ydCB0eXBlIERvY3VtZW50RnJhZ21lbnRIb29rID0gKFxuICB0aGlzOiBET01QdXJpZnksXG4gIGN1cnJlbnROb2RlOiBEb2N1bWVudEZyYWdtZW50LFxuICBob29rRXZlbnQ6IG51bGwsXG4gIGNvbmZpZzogQ29uZmlnXG4pID0+IHZvaWQ7XG5cbmV4cG9ydCB0eXBlIFVwb25TYW5pdGl6ZUVsZW1lbnRIb29rID0gKFxuICB0aGlzOiBET01QdXJpZnksXG4gIGN1cnJlbnROb2RlOiBOb2RlLFxuICBob29rRXZlbnQ6IFVwb25TYW5pdGl6ZUVsZW1lbnRIb29rRXZlbnQsXG4gIGNvbmZpZzogQ29uZmlnXG4pID0+IHZvaWQ7XG5cbmV4cG9ydCB0eXBlIFVwb25TYW5pdGl6ZUF0dHJpYnV0ZUhvb2sgPSAoXG4gIHRoaXM6IERPTVB1cmlmeSxcbiAgY3VycmVudE5vZGU6IEVsZW1lbnQsXG4gIGhvb2tFdmVudDogVXBvblNhbml0aXplQXR0cmlidXRlSG9va0V2ZW50LFxuICBjb25maWc6IENvbmZpZ1xuKSA9PiB2b2lkO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVwb25TYW5pdGl6ZUVsZW1lbnRIb29rRXZlbnQge1xuICB0YWdOYW1lOiBzdHJpbmc7XG4gIGFsbG93ZWRUYWdzOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVcG9uU2FuaXRpemVBdHRyaWJ1dGVIb29rRXZlbnQge1xuICBhdHRyTmFtZTogc3RyaW5nO1xuICBhdHRyVmFsdWU6IHN0cmluZztcbiAga2VlcEF0dHI6IGJvb2xlYW47XG4gIGFsbG93ZWRBdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPjtcbiAgZm9yY2VLZWVwQXR0cjogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBBIGBXaW5kb3dgLWxpa2Ugb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHByb3BlcnRpZXMgYW5kIHR5cGVzIHRoYXQgRE9NUHVyaWZ5IHJlcXVpcmVzLlxuICovXG5leHBvcnQgdHlwZSBXaW5kb3dMaWtlID0gUGljazxcbiAgdHlwZW9mIGdsb2JhbFRoaXMsXG4gIHwgJ0RvY3VtZW50RnJhZ21lbnQnXG4gIHwgJ0hUTUxUZW1wbGF0ZUVsZW1lbnQnXG4gIHwgJ05vZGUnXG4gIHwgJ0VsZW1lbnQnXG4gIHwgJ05vZGVGaWx0ZXInXG4gIHwgJ05hbWVkTm9kZU1hcCdcbiAgfCAnSFRNTEZvcm1FbGVtZW50J1xuICB8ICdET01QYXJzZXInXG4+ICYge1xuICBkb2N1bWVudD86IERvY3VtZW50O1xuICBNb3pOYW1lZEF0dHJNYXA/OiB0eXBlb2Ygd2luZG93Lk5hbWVkTm9kZU1hcDtcbn0gJiBQaWNrPFRydXN0ZWRUeXBlc1dpbmRvdywgJ3RydXN0ZWRUeXBlcyc+O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvbWVzc2FnZS1kaXNwYXRjaC5qc1xuICogQ2hhdCBtZXNzYWdlIGRpc3BhdGNoOiBzZW5kTWVzc2FnZSwgaW50YWtlIGNvbmZpcm1hdGlvbiBjYXJkLFxuICogcHJpb3ItY2xhcmlmaWNhdGlvbiBwcmVsb2FkLlxuICpcbiAqIERFUEVOREVOQ0lFUyAoYWxsIG9uIGdsb2JhbFRoaXMgYXQgcnVudGltZSk6XG4gKiAgIC0gcGFyc2VNZXNzYWdlUmVzcG9uc2UgKHZhbGlkYXRvcnMuanMpXG4gKiAgIC0gc2V0TG9hZGluZywgbGxtRmV0Y2ggKGZldGNoLXV0aWxzLmpzKVxuICogICAtIGFwcGVuZE1lc3NhZ2UsIGFwcGVuZFJldHJ5TWVzc2FnZSwgYXBwZW5kUmF3SHRtbCAobWVzc2FnZS1xdWV1ZS5qcylcbiAqICAgLSBub3JtYWxpemVUZXh0LCBlc2NhcGVIdG1sICh1dGlscy5qcylcbiAqICAgLSBmZXRjaFN0YXR1cyAoYXBpLWNsaWVudC5qcylcbiAqICAgLSBhbmFseXplSm9iIChqb2ItYW5hbHlzaXMuanMpXG4gKiAgIC0gc2VuZEFjdGlvbiAoc2Vzc2lvbi1hY3Rpb25zLmpzKVxuICogICAtIHNob3dUYWJsZUJhc2VkUmV2aWV3IChyZXZpZXctdGFibGUtYmFzZS5qcywgVGllciA0KVxuICogICAtIGhhbmRsZUV4cGVyaWVuY2VSZXNwb25zZSAoZXhwZXJpZW5jZS1yZXZpZXcuanMsIFRpZXIgNSlcbiAqICAgLSBoYW5kbGVTa2lsbHNSZXNwb25zZSAoc2tpbGxzLXJldmlldy5qcywgVGllciA1KVxuICogICAtIGhhbmRsZVF1ZXN0aW9uUmVzcG9uc2UgKHF1ZXN0aW9ucy1wYW5lbC5qcylcbiAqICAgLSBleHRyYWN0Rmlyc3RKc29uT2JqZWN0LCBoYW5kbGVDdXN0b21pemF0aW9uUmVzcG9uc2UgKGFwcC5qcyBvcmNoZXN0cmF0b3IpXG4gKiAgIC0gc3RhdGVNYW5hZ2VyIChzdGF0ZS1tYW5hZ2VyLmpzIFx1MjAxNCBpc0xvYWRpbmcoKSlcbiAqICAgLSBxdWVzdGlvbkFuc3dlcnMsIHBlbmRpbmdSZWNvbW1lbmRhdGlvbnMgKHdpbmRvdyBnbG9iYWxzKVxuICovXG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmNvbnN0IGxvZyA9IGdldExvZ2dlcignbWVzc2FnZS1kaXNwYXRjaCcpO1xuXG5pbXBvcnQgeyBzdGF0ZU1hbmFnZXIgfSBmcm9tICcuL3N0YXRlLW1hbmFnZXIuanMnO1xuaW1wb3J0IHsgZ2V0U2Vzc2lvbklkRnJvbVVSTCB9IGZyb20gJy4vYXBpLWNsaWVudC5qcyc7XG5cbmxldCBfcGVuZGluZ1Bvc3RJbnRha2VDb250aW51YXRpb24gPSBudWxsO1xuY29uc3QgUkVUUllfUE9MSUNZX1NUT1JBR0VfS0VZID0gJ2N2LWJ1aWxkZXItcmV0cnktcG9saWN5JztcbmxldCBfcmV0cnlBdHRlbXB0Q291bnQgPSAwO1xubGV0IF9yZXRyeVRpbWVyID0gbnVsbDtcbmxldCBfcmV0cnlJbnRlcnZhbCA9IG51bGw7XG5cbmZ1bmN0aW9uIF9jbGVhclJldHJ5VGltZXJzKCkge1xuICBpZiAoX3JldHJ5VGltZXIpIHtcbiAgICBjbGVhclRpbWVvdXQoX3JldHJ5VGltZXIpO1xuICAgIF9yZXRyeVRpbWVyID0gbnVsbDtcbiAgfVxuICBpZiAoX3JldHJ5SW50ZXJ2YWwpIHtcbiAgICBjbGVhckludGVydmFsKF9yZXRyeUludGVydmFsKTtcbiAgICBfcmV0cnlJbnRlcnZhbCA9IG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2dldFJldHJ5UG9saWN5KCkge1xuICBjb25zdCBkZWZhdWx0cyA9IHtcbiAgICBiYXNlTXM6IDE1MDAsXG4gICAgY2FwTXM6IDYwMDAwLFxuICAgIG1heEF0dGVtcHRzOiA2LFxuICAgIGF1dG9SZXRyeTogdHJ1ZSxcbiAgfTtcbiAgdHJ5IHtcbiAgICBjb25zdCByYXcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShSRVRSWV9QT0xJQ1lfU1RPUkFHRV9LRVkpO1xuICAgIGlmICghcmF3KSByZXR1cm4gZGVmYXVsdHM7XG4gICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShyYXcpO1xuICAgIHJldHVybiB7XG4gICAgICBiYXNlTXM6IE1hdGgubWF4KDIwMCwgTnVtYmVyKHBhcnNlZC5iYXNlTXMgfHwgZGVmYXVsdHMuYmFzZU1zKSksXG4gICAgICBjYXBNczogTWF0aC5tYXgoMTAwMCwgTnVtYmVyKHBhcnNlZC5jYXBNcyB8fCBkZWZhdWx0cy5jYXBNcykpLFxuICAgICAgbWF4QXR0ZW1wdHM6IE1hdGgubWF4KDEsIE51bWJlcihwYXJzZWQubWF4QXR0ZW1wdHMgfHwgZGVmYXVsdHMubWF4QXR0ZW1wdHMpKSxcbiAgICAgIGF1dG9SZXRyeTogcGFyc2VkLmF1dG9SZXRyeSAhPT0gZmFsc2UsXG4gICAgfTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGRlZmF1bHRzO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9jYWxjdWxhdGVSZXRyeURlbGF5TXMoa2luZCwgZXJyb3IpIHtcbiAgY29uc3QgcG9saWN5ID0gX2dldFJldHJ5UG9saWN5KCk7XG4gIGNvbnN0IGV4cCA9IE1hdGgubWluKHBvbGljeS5jYXBNcywgcG9saWN5LmJhc2VNcyAqICgyICoqIF9yZXRyeUF0dGVtcHRDb3VudCkpO1xuICBjb25zdCBqaXR0ZXIgPSBNYXRoLnJvdW5kKGV4cCAqICgwLjEgKyBNYXRoLnJhbmRvbSgpICogMC4xNSkpO1xuICBsZXQgZGVsYXlNcyA9IE1hdGgubWluKHBvbGljeS5jYXBNcywgZXhwICsgaml0dGVyKTtcblxuICBpZiAoa2luZCA9PT0gJ3JhdGUtbGltaXRlZCcpIHtcbiAgICBjb25zdCByZXRyeUFmdGVyU2VjID0gTnVtYmVyKGVycm9yPy5yZXRyeUFmdGVyU2VjIHx8IDApO1xuICAgIGlmIChyZXRyeUFmdGVyU2VjID4gMCkge1xuICAgICAgZGVsYXlNcyA9IE1hdGgubWF4KGRlbGF5TXMsIHJldHJ5QWZ0ZXJTZWMgKiAxMDAwKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlbGF5TXM7XG59XG5cbmZ1bmN0aW9uIF9zY2hlZHVsZVJldHJ5KHRleHQsIGRlcml2ZWQsIGVycm9yKSB7XG4gIF9jbGVhclJldHJ5VGltZXJzKCk7XG4gIGNvbnN0IHBvbGljeSA9IF9nZXRSZXRyeVBvbGljeSgpO1xuXG4gIC8vIENsaWVudCBlcnJvcnMgKDR4eCkgYW5kIGF1dGggZmFpbHVyZXMgYXJlIG5vdCB0cmFuc2llbnQ7IGRvIG5vdCBhdXRvLXJldHJ5LlxuICBjb25zdCBOT05fUkVUUllBQkxFID0gbmV3IFNldChbJ2NsaWVudC1lcnJvcicsICdhdXRoLXJlcXVpcmVkJ10pO1xuICBjb25zdCBjYW5BdXRvUmV0cnkgPSBwb2xpY3kuYXV0b1JldHJ5XG4gICAgJiYgX3JldHJ5QXR0ZW1wdENvdW50IDwgcG9saWN5Lm1heEF0dGVtcHRzXG4gICAgJiYgIU5PTl9SRVRSWUFCTEUuaGFzKGRlcml2ZWQua2luZCk7XG5cbiAgY29uc3QgZGVsYXlNcyA9IF9jYWxjdWxhdGVSZXRyeURlbGF5TXMoZGVyaXZlZC5raW5kLCBlcnJvcik7XG4gIGNvbnN0IHRvdGFsU2Vjb25kcyA9IE1hdGgubWF4KDEsIE1hdGguY2VpbChkZWxheU1zIC8gMTAwMCkpO1xuXG4gIGNvbnN0IHJldHJ5QWN0aW9uID0gKCkgPT4ge1xuICAgIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21lc3NhZ2UtaW5wdXQnKTtcbiAgICBpZiAoaW5wdXQpIGlucHV0LnZhbHVlID0gdGV4dDtcbiAgICBzZW5kTWVzc2FnZSgpO1xuICB9O1xuXG4gIGxldCByZXRyeU1lc3NhZ2U7XG4gIGNvbnN0IGNhbmNlbEZuID0gY2FuQXV0b1JldHJ5ID8gKCkgPT4ge1xuICAgIF9jbGVhclJldHJ5VGltZXJzKCk7XG4gICAgaWYgKHJldHJ5TWVzc2FnZSkgcmV0cnlNZXNzYWdlLnJlbW92ZSgpO1xuICB9IDogbnVsbDtcblxuICByZXRyeU1lc3NhZ2UgPSBhcHBlbmRSZXRyeU1lc3NhZ2UoXG4gICAgYFx1MjZBMFx1RkUwRiAke2Vycm9yLm1lc3NhZ2V9YCxcbiAgICAoKSA9PiB7XG4gICAgICBfY2xlYXJSZXRyeVRpbWVycygpO1xuICAgICAgX3JldHJ5QXR0ZW1wdENvdW50ICs9IDE7XG4gICAgICByZXRyeUFjdGlvbigpO1xuICAgIH0sXG4gICAgY2FuQXV0b1JldHJ5ID8gYFJldHJ5IGluICR7dG90YWxTZWNvbmRzfXNgIDogJ1JldHJ5JyxcbiAgICBjYW5jZWxGbixcbiAgKTtcblxuICBpZiAoIWNhbkF1dG9SZXRyeSkgcmV0dXJuO1xuXG4gIGNvbnN0IHJldHJ5QnRuID0gcmV0cnlNZXNzYWdlPy5xdWVyeVNlbGVjdG9yKCdidXR0b24nKTtcbiAgbGV0IHJlbWFpbmluZyA9IHRvdGFsU2Vjb25kcztcbiAgaWYgKHJldHJ5QnRuKSB7XG4gICAgcmV0cnlCdG4udGV4dENvbnRlbnQgPSBgUmV0cnkgaW4gJHtyZW1haW5pbmd9c2A7XG4gICAgaWYgKGRlcml2ZWQua2luZCA9PT0gJ3JhdGUtbGltaXRlZCcpIHtcbiAgICAgIHJldHJ5QnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIHJldHJ5QnRuLnN0eWxlLm9wYWNpdHkgPSAnMC43JztcbiAgICAgIHJldHJ5QnRuLnN0eWxlLmN1cnNvciA9ICdub3QtYWxsb3dlZCc7XG4gICAgfVxuICB9XG5cbiAgX3JldHJ5SW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgcmVtYWluaW5nIC09IDE7XG4gICAgaWYgKHJldHJ5QnRuICYmIHJlbWFpbmluZyA+IDApIHtcbiAgICAgIHJldHJ5QnRuLnRleHRDb250ZW50ID0gYFJldHJ5IGluICR7cmVtYWluaW5nfXNgO1xuICAgIH1cbiAgICBpZiAocmVtYWluaW5nIDw9IDApIHtcbiAgICAgIGlmIChyZXRyeUJ0bikge1xuICAgICAgICByZXRyeUJ0bi50ZXh0Q29udGVudCA9ICdSZXRyeSBOb3cnO1xuICAgICAgICByZXRyeUJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICByZXRyeUJ0bi5zdHlsZS5vcGFjaXR5ID0gJyc7XG4gICAgICAgIHJldHJ5QnRuLnN0eWxlLmN1cnNvciA9ICcnO1xuICAgICAgfVxuICAgICAgY2xlYXJJbnRlcnZhbChfcmV0cnlJbnRlcnZhbCk7XG4gICAgICBfcmV0cnlJbnRlcnZhbCA9IG51bGw7XG4gICAgfVxuICB9LCAxMDAwKTtcblxuICBfcmV0cnlUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIF9yZXRyeVRpbWVyID0gbnVsbDtcbiAgICBfcmV0cnlBdHRlbXB0Q291bnQgKz0gMTtcbiAgICByZXRyeU1lc3NhZ2U/LnJlbW92ZSgpO1xuICAgIHJldHJ5QWN0aW9uKCk7XG4gIH0sIGRlbGF5TXMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBfcGFyc2VBcGlKc29uUmVzcG9uc2UocmVzcG9uc2UsIGVuZHBvaW50KSB7XG4gIGNvbnN0IHN0YXR1cyA9IE51bWJlcihyZXNwb25zZT8uc3RhdHVzIHx8IDApO1xuICBjb25zdCBzdGF0dXNUZXh0ID0gcmVzcG9uc2U/LnN0YXR1c1RleHQgfHwgJ1Vua25vd24gU3RhdHVzJztcbiAgY29uc3QgY29udGVudFR5cGUgPSAocmVzcG9uc2U/LmhlYWRlcnM/LmdldCgnY29udGVudC10eXBlJykgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IHJhdyA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcblxuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgbGV0IGRldGFpbCA9IHN0YXR1c1RleHQ7XG4gICAgaWYgKGNvbnRlbnRUeXBlLmluY2x1ZGVzKCdhcHBsaWNhdGlvbi9qc29uJykpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSBKU09OLnBhcnNlKHJhdyB8fCAne30nKTtcbiAgICAgICAgZGV0YWlsID0gcGF5bG9hZD8uZXJyb3IgfHwgcGF5bG9hZD8ubWVzc2FnZSB8fCBkZXRhaWw7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gS2VlcCBmYWxsYmFjayBkZXRhaWwgaWYgbWFsZm9ybWVkIEpTT04gZXJyb3IgcGF5bG9hZC5cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKChyYXcgfHwgJycpLnRyaW0oKS5zdGFydHNXaXRoKCc8JykpIHtcbiAgICAgIGRldGFpbCA9ICdzZXJ2ZXIgcmV0dXJuZWQgSFRNTCBpbnN0ZWFkIG9mIEpTT04gKHBvc3NpYmxlIHNlc3Npb24gcmVkaXJlY3Qgb3IgYmFja2VuZCBlcnJvciknO1xuICAgIH0gZWxzZSBpZiAoKHJhdyB8fCAnJykudHJpbSgpKSB7XG4gICAgICBkZXRhaWwgPSByYXcudHJpbSgpLnNsaWNlKDAsIDIyMCk7XG4gICAgfVxuICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKGAke3N0YXR1c306ICR7ZGV0YWlsfWApO1xuICAgIGVycm9yLnN0YXR1cyA9IHN0YXR1cztcbiAgICBlcnJvci5yZXRyeUFmdGVyU2VjID0gTnVtYmVyKHJlc3BvbnNlPy5oZWFkZXJzPy5nZXQoJ3JldHJ5LWFmdGVyJykgfHwgMCk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICBpZiAoIWNvbnRlbnRUeXBlLmluY2x1ZGVzKCdhcHBsaWNhdGlvbi9qc29uJykpIHtcbiAgICBjb25zdCBzbmlwcGV0ID0gKHJhdyB8fCAnJykudHJpbSgpLnNsaWNlKDAsIDgwKTtcbiAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoXG4gICAgICBgRXhwZWN0ZWQgSlNPTiBmcm9tICR7ZW5kcG9pbnR9LCBnb3QgJHtjb250ZW50VHlwZSB8fCAndW5rbm93biBjb250ZW50IHR5cGUnfSR7c25pcHBldCA/IGA6ICR7c25pcHBldH1gIDogJyd9YCxcbiAgICApO1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gcGFyc2VNZXNzYWdlUmVzcG9uc2UoSlNPTi5wYXJzZShyYXcgfHwgJ3t9JykpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgSW52YWxpZCBKU09OIGZyb20gJHtlbmRwb2ludH06ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfc2V0TGl2ZUxsbVN0YXRlKGtpbmQsIHRleHQsIGljb24gPSAnJywgdG9vbHRpcCA9ICcnKSB7XG4gIGlmICh0eXBlb2YgX3VwZGF0ZUxsbVN0YXR1c1BpbGwgPT09ICdmdW5jdGlvbicpIHtcbiAgICBfdXBkYXRlTGxtU3RhdHVzUGlsbChraW5kLCB0ZXh0LCBpY29uLCB0b29sdGlwKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfZGVyaXZlRXJyb3JTdGF0ZShlcnJvcikge1xuICBjb25zdCBtZXNzYWdlID0gU3RyaW5nKGVycm9yPy5tZXNzYWdlIHx8IGVycm9yIHx8ICdVbmtub3duIGVycm9yJyk7XG4gIGNvbnN0IGxvd2VyID0gbWVzc2FnZS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBzdGF0dXMgPSBOdW1iZXIoZXJyb3I/LnN0YXR1cyB8fCAwKTtcblxuICBpZiAoc3RhdHVzID09PSA0MDEgfHwgc3RhdHVzID09PSA0MDMgfHwgbWVzc2FnZS5zdGFydHNXaXRoKCc0MDE6JykgfHwgbWVzc2FnZS5zdGFydHNXaXRoKCc0MDM6JykgfHwgbG93ZXIuaW5jbHVkZXMoJ2F1dGgnKSkge1xuICAgIHJldHVybiB7XG4gICAgICBraW5kOiAnYXV0aC1yZXF1aXJlZCcsXG4gICAgICB0ZXh0OiAnQXV0aGVudGljYXRpb24gcmVxdWlyZWQnLFxuICAgICAgaWNvbjogJ1x1RDgzRFx1REQxMScsXG4gICAgICB0b29sdGlwOiAnQXV0aGVudGljYXRpb24gZmFpbGVkLiBDaGVjayBBUEkga2V5L3Rva2VuIG9yIHNpZ24gaW4gYWdhaW4uJyxcbiAgICB9O1xuICB9XG5cbiAgaWYgKHN0YXR1cyA9PT0gNDI5IHx8IG1lc3NhZ2Uuc3RhcnRzV2l0aCgnNDI5OicpIHx8IGxvd2VyLmluY2x1ZGVzKCdyYXRlIGxpbWl0JykpIHtcbiAgICByZXR1cm4ge1xuICAgICAga2luZDogJ3JhdGUtbGltaXRlZCcsXG4gICAgICB0ZXh0OiAnUmF0ZSBsaW1pdGVkJyxcbiAgICAgIGljb246ICdcdTIzRjMnLFxuICAgICAgdG9vbHRpcDogJ1Byb3ZpZGVyIHJhdGUgbGltaXQgcmVhY2hlZC4gV2FpdCBicmllZmx5IGFuZCByZXRyeS4nLFxuICAgIH07XG4gIH1cblxuICBpZiAoXG4gICAgc3RhdHVzID09PSA1MDIgfHxcbiAgICBzdGF0dXMgPT09IDUwMyB8fFxuICAgIHN0YXR1cyA9PT0gNTA0IHx8XG4gICAgbWVzc2FnZS5zdGFydHNXaXRoKCc1MDI6JykgfHxcbiAgICBtZXNzYWdlLnN0YXJ0c1dpdGgoJzUwMzonKSB8fFxuICAgIG1lc3NhZ2Uuc3RhcnRzV2l0aCgnNTA0OicpIHx8XG4gICAgbG93ZXIuaW5jbHVkZXMoJ3RpbWVvdXQnKSB8fFxuICAgIGxvd2VyLmluY2x1ZGVzKCd1bmF2YWlsYWJsZScpIHx8XG4gICAgbG93ZXIuaW5jbHVkZXMoJ2Nhbm5vdCByZWFjaCcpXG4gICkge1xuICAgIHJldHVybiB7XG4gICAgICBraW5kOiAndW5hdmFpbGFibGUnLFxuICAgICAgdGV4dDogJ1Byb3ZpZGVyIHVuYXZhaWxhYmxlJyxcbiAgICAgIGljb246ICdcdTI2MDEnLFxuICAgICAgdG9vbHRpcDogJ1Byb3ZpZGVyIGlzIGN1cnJlbnRseSB1bmF2YWlsYWJsZSBvciB1bnJlYWNoYWJsZS4gUmV0cnkgc29vbi4nLFxuICAgIH07XG4gIH1cblxuICAvLyA0eHggY2xpZW50IGVycm9ycyBhcmUgbm90IHRyYW5zaWVudCBcdTIwMTQgcmV0cnlpbmcgd2lsbCBub3QgZml4IHRoZW0uXG4gIGlmIChzdGF0dXMgPj0gNDAwICYmIHN0YXR1cyA8IDUwMCkge1xuICAgIHJldHVybiB7XG4gICAgICBraW5kOiAnY2xpZW50LWVycm9yJyxcbiAgICAgIHRleHQ6ICdSZXF1ZXN0IGVycm9yJyxcbiAgICAgIGljb246ICdcdTI2QTAnLFxuICAgICAgdG9vbHRpcDogbWVzc2FnZSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBraW5kOiAnZXJyb3InLFxuICAgIHRleHQ6ICdDb25uZWN0aW9uIGZhaWxlZCcsXG4gICAgaWNvbjogJ1x1MjZBMCcsXG4gICAgdG9vbHRpcDogbWVzc2FnZSxcbiAgfTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBEZWZhdWx0IExMTSBtZXNzYWdlIGhhbmRsZXJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5hc3luYyBmdW5jdGlvbiBfaGFuZGxlTExNTWVzc2FnZSh0ZXh0KSB7XG4gIF9jbGVhclJldHJ5VGltZXJzKCk7XG4gIHNldExvYWRpbmcodHJ1ZSwgJ1RoaW5raW5nXHUyMDI2Jyk7XG4gIF9zZXRMaXZlTGxtU3RhdGUoJ2Nvbm5lY3RpbmcnLCAnQ29ubmVjdGluZ1x1MjAyNicsICdcdTI5RDcnLCAnU2VuZGluZyByZXF1ZXN0IHRvIHByb3ZpZGVyLicpO1xuICBsZXQgdGVybWluYWxTdGF0ZSA9IG51bGw7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgbGxtRmV0Y2goJy9hcGkvbWVzc2FnZScsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IG1lc3NhZ2U6IHRleHQgfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IF9wYXJzZUFwaUpzb25SZXNwb25zZShyZXMsICcvYXBpL21lc3NhZ2UnKTtcblxuICAgIGlmIChkYXRhLmVycm9yKSB7XG4gICAgICBjb25zdCBlcnJvck1zZyA9IGRhdGEuZXJyb3IudG9TdHJpbmcoKTtcbiAgICAgIGNvbnN0IGRlcml2ZWQgPSBfZGVyaXZlRXJyb3JTdGF0ZShuZXcgRXJyb3IoZXJyb3JNc2cpKTtcbiAgICAgIF9zZXRMaXZlTGxtU3RhdGUoZGVyaXZlZC5raW5kLCBkZXJpdmVkLnRleHQsIGRlcml2ZWQuaWNvbiwgZGVyaXZlZC50b29sdGlwKTtcbiAgICAgIF9zY2hlZHVsZVJldHJ5KHRleHQsIGRlcml2ZWQsIG5ldyBFcnJvcihlcnJvck1zZykpO1xuICAgICAgdGVybWluYWxTdGF0ZSA9IGRlcml2ZWQ7XG4gICAgICBsb2cuZXJyb3IoJ1NlcnZlciBlcnJvcjonLCBkYXRhLmVycm9yKTtcbiAgICB9IGVsc2UgaWYgKGRhdGEucmVzcG9uc2UpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNsZWFuUmVzcG9uc2UgPSBkYXRhLnJlc3BvbnNlO1xuICAgICAgICBjb25zdCBwYXJzZWRDdXN0b21pemF0aW9uID0gZXh0cmFjdEZpcnN0SnNvbk9iamVjdChjbGVhblJlc3BvbnNlKTtcbiAgICAgICAgaWYgKHBhcnNlZEN1c3RvbWl6YXRpb24gJiYgKHBhcnNlZEN1c3RvbWl6YXRpb24ucmVjb21tZW5kZWRfZXhwZXJpZW5jZXMgfHwgcGFyc2VkQ3VzdG9taXphdGlvbi5yZWNvbW1lbmRlZF9za2lsbHMpKSB7XG4gICAgICAgICAgY29uc3QganNvblN0YXJ0ID0gY2xlYW5SZXNwb25zZS5pbmRleE9mKCd7Jyk7XG4gICAgICAgICAgY29uc3QgdGV4dEJlZm9yZUpzb24gPSBqc29uU3RhcnQgPiAwID8gY2xlYW5SZXNwb25zZS5zdWJzdHJpbmcoMCwganNvblN0YXJ0KS50cmltKCkgOiAnJztcbiAgICAgICAgICBpZiAodGV4dEJlZm9yZUpzb24gJiYgIXRleHRCZWZvcmVKc29uLmluY2x1ZGVzKCd7XCJhY3Rpb25cIjonKSkge1xuICAgICAgICAgICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgdGV4dEJlZm9yZUpzb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhd2FpdCBoYW5kbGVDdXN0b21pemF0aW9uUmVzcG9uc2UocGFyc2VkQ3VzdG9taXphdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGNsZWFuUmVzcG9uc2UudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIGNsZWFuUmVzcG9uc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZy5lcnJvcignRXJyb3IgcHJvY2Vzc2luZyBtZXNzYWdlIHJlc3BvbnNlOicsIGVyciwgZGF0YS5yZXNwb25zZSk7XG4gICAgICAgIGNvbnN0IGRlcml2ZWQgPSBfZGVyaXZlRXJyb3JTdGF0ZShlcnIpO1xuICAgICAgICBfc2V0TGl2ZUxsbVN0YXRlKGRlcml2ZWQua2luZCwgZGVyaXZlZC50ZXh0LCBkZXJpdmVkLmljb24sIGRlcml2ZWQudG9vbHRpcCk7XG4gICAgICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsIGBcdTI2QTBcdUZFMEYgSSBlbmNvdW50ZXJlZCBhbiBpc3N1ZSBwcm9jZXNzaW5nIHRoYXQgcmVzcG9uc2U6ICR7ZXJyLm1lc3NhZ2V9LiBUaGUgY29udmVyc2F0aW9uIGhhcyBiZWVuIHNhdmVkLmApO1xuICAgICAgICB0ZXJtaW5hbFN0YXRlID0gZGVyaXZlZDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbm5lY3RlZFN0YXRlID0geyBraW5kOiAnY29ubmVjdGVkJywgdGV4dDogJ0Nvbm5lY3RlZCcsIGljb246ICdcdTI3MTMnLCB0b29sdGlwOiAnUHJvdmlkZXIgcmVzcG9uZGVkIHN1Y2Nlc3NmdWxseSB0byBhIGxpdmUgcmVxdWVzdC4nIH07XG4gICAgICBfc2V0TGl2ZUxsbVN0YXRlKGNvbm5lY3RlZFN0YXRlLmtpbmQsIGNvbm5lY3RlZFN0YXRlLnRleHQsIGNvbm5lY3RlZFN0YXRlLmljb24sIGNvbm5lY3RlZFN0YXRlLnRvb2x0aXApO1xuICAgICAgdGVybWluYWxTdGF0ZSA9IGNvbm5lY3RlZFN0YXRlO1xuICAgICAgX3JldHJ5QXR0ZW1wdENvdW50ID0gMDtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nLmVycm9yKCc9PT0gTUVTU0FHRSBFUlJPUiA9PT0nLCBlcnJvci5uYW1lLCBlcnJvci5tZXNzYWdlLCBlcnJvci5zdGFjayk7XG4gICAgaWYgKGVycm9yLm5hbWUgPT09ICdBYm9ydEVycm9yJykge1xuICAgICAgLy8gVXNlciBjbGlja2VkIFN0b3AgXHUyMDE0IG1lc3NhZ2UgYWxyZWFkeSBzaG93biBieSBhYm9ydEN1cnJlbnRSZXF1ZXN0KCkuXG4gICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZGVyaXZlZCA9IF9kZXJpdmVFcnJvclN0YXRlKGVycm9yKTtcbiAgICBfc2V0TGl2ZUxsbVN0YXRlKGRlcml2ZWQua2luZCwgZGVyaXZlZC50ZXh0LCBkZXJpdmVkLmljb24sIGRlcml2ZWQudG9vbHRpcCk7XG4gICAgX3NjaGVkdWxlUmV0cnkodGV4dCwgZGVyaXZlZCwgZXJyb3IpO1xuICAgIHRlcm1pbmFsU3RhdGUgPSBkZXJpdmVkO1xuICB9XG4gIHNldExvYWRpbmcoZmFsc2UpO1xuICBhd2FpdCBmZXRjaFN0YXR1cygpO1xuICBpZiAodGVybWluYWxTdGF0ZSkge1xuICAgIF9zZXRMaXZlTGxtU3RhdGUodGVybWluYWxTdGF0ZS5raW5kLCB0ZXJtaW5hbFN0YXRlLnRleHQsIHRlcm1pbmFsU3RhdGUuaWNvbiwgdGVybWluYWxTdGF0ZS50b29sdGlwKTtcbiAgfVxuICBpZiAodHlwZW9mIGZldGNoQW5kRGlzcGxheUxsbUxvZyA9PT0gJ2Z1bmN0aW9uJykgZmV0Y2hBbmREaXNwbGF5TGxtTG9nKCk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gTWVzc2FnZSBkaXNwYXRjaCB0YWJsZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8vIEhhbmRsZXJzIGNoZWNrZWQgaW4gb3JkZXI7IGZpcnN0IG1hdGNoaW5nIHRlc3QoKSB3aW5zLlxuY29uc3QgX21lc3NhZ2VIYW5kbGVycyA9IFtcbiAge1xuICAgIHRlc3Q6IHQgPT4gdC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdyZXZpZXcgcmVjb21tZW5kYXRpb25zJykgfHwgdC50b0xvd2VyQ2FzZSgpID09PSAncmV2aWV3JyxcbiAgICBoYW5kbGU6IGFzeW5jICgpID0+IHNob3dUYWJsZUJhc2VkUmV2aWV3KCksXG4gIH0sXG4gIHtcbiAgICB0ZXN0OiAoKSA9PiB3aW5kb3cud2FpdGluZ0ZvckV4cGVyaWVuY2VSZXNwb25zZSxcbiAgICBoYW5kbGU6IGFzeW5jIHQgPT4gaGFuZGxlRXhwZXJpZW5jZVJlc3BvbnNlKHQpLFxuICB9LFxuICB7XG4gICAgdGVzdDogKCkgPT4gd2luZG93LndhaXRpbmdGb3JTa2lsbHNSZXNwb25zZSxcbiAgICBoYW5kbGU6IGFzeW5jIHQgPT4gaGFuZGxlU2tpbGxzUmVzcG9uc2UodCksXG4gIH0sXG4gIHtcbiAgICAvLyBQb3N0LWFuYWx5c2lzIHF1ZXN0aW9uIHJlc3BvbnNlIFx1MjAxNCBsb2NhbCBoYW5kbGVyICsgYmFja2VuZCBzYXZlLlxuICAgIHRlc3Q6ICgpID0+IHdpbmRvdy53YWl0aW5nRm9yUXVlc3Rpb25SZXNwb25zZSxcbiAgICBoYW5kbGU6IGFzeW5jIHQgPT4ge1xuICAgICAgY29uc3QgcXVlc3Rpb25IYW5kbGVkID0gaGFuZGxlUXVlc3Rpb25SZXNwb25zZSh0KTtcbiAgICAgIHNldExvYWRpbmcodHJ1ZSwgJ1RoaW5raW5nXHUyMDI2Jyk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBsbG1GZXRjaCgnL2FwaS9tZXNzYWdlJywge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgbWVzc2FnZTogdCB9KSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBfcGFyc2VBcGlKc29uUmVzcG9uc2UocmVzLCAnL2FwaS9tZXNzYWdlJyk7XG4gICAgICAgIGlmIChkYXRhLmVycm9yKSB7XG4gICAgICAgICAgbG9nLmVycm9yKCdCYWNrZW5kIGVycm9yIHNhdmluZyBxdWVzdGlvbiByZXNwb25zZTonLCBkYXRhLmVycm9yKTtcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLnJlc3BvbnNlICYmICFxdWVzdGlvbkhhbmRsZWQpIHtcbiAgICAgICAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCBkYXRhLnJlc3BvbnNlKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChlcnIubmFtZSAhPT0gJ0Fib3J0RXJyb3InKSBsb2cuZXJyb3IoJz09PSBRVUVTVElPTiBSRVNQT05TRSBTQVZFIEVSUk9SID09PScsIGVycik7XG4gICAgICB9XG4gICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICAgIGlmICghcXVlc3Rpb25IYW5kbGVkKSBhd2FpdCBfaGFuZGxlTExNTWVzc2FnZSh0KTtcbiAgICB9LFxuICB9LFxuICB7XG4gICAgdGVzdDogdCA9PiB0LnRvTG93ZXJDYXNlKCkgPT09ICdwcm9jZWVkJyxcbiAgICBoYW5kbGU6IGFzeW5jICgpID0+IHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zXG4gICAgICA/IHNob3dUYWJsZUJhc2VkUmV2aWV3KClcbiAgICAgIDogc2VuZEFjdGlvbigncmVjb21tZW5kX2N1c3RvbWl6YXRpb25zJyksXG4gIH0sXG4gIHtcbiAgICB0ZXN0OiAoKSA9PiB0cnVlLFxuICAgIGhhbmRsZTogX2hhbmRsZUxMTU1lc3NhZ2UsXG4gIH0sXG5dO1xuXG5hc3luYyBmdW5jdGlvbiBzZW5kTWVzc2FnZSgpIHtcbiAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWVzc2FnZS1pbnB1dCcpO1xuICBjb25zdCB0ZXh0ID0gbm9ybWFsaXplVGV4dChpbnB1dC52YWx1ZSk7XG4gIGlmICghdGV4dCB8fCBzdGF0ZU1hbmFnZXIuaXNMb2FkaW5nKCkpIHJldHVybjtcblxuICBpZiAoIWdldFNlc3Npb25JZEZyb21VUkwoKSkge1xuICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsICdcdTI2QTBcdUZFMEYgTm8gYWN0aXZlIHNlc3Npb24uIENyZWF0ZSBvciBsb2FkIGEgc2Vzc2lvbiBiZWZvcmUgc2VuZGluZyBtZXNzYWdlcy4nKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBhcHBlbmRNZXNzYWdlKCd1c2VyJywgdGV4dCk7XG4gIGlucHV0LnZhbHVlID0gJyc7XG5cbiAgZm9yIChjb25zdCBoYW5kbGVyIG9mIF9tZXNzYWdlSGFuZGxlcnMpIHtcbiAgICBpZiAoaGFuZGxlci50ZXN0KHRleHQpKSB7XG4gICAgICBhd2FpdCBoYW5kbGVyLmhhbmRsZSh0ZXh0KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBJbnRha2UgY29uZmlybWF0aW9uIGNhcmQgKEdBUC0yMylcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5hc3luYyBmdW5jdGlvbiBfc2hvd0ludGFrZUNvbmZpcm1DYXJkKGNvbnRpbnVhdGlvbiA9IG51bGwpIHtcbiAgaWYgKHR5cGVvZiBjb250aW51YXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICBfcGVuZGluZ1Bvc3RJbnRha2VDb250aW51YXRpb24gPSBjb250aW51YXRpb247XG4gIH1cblxuICBsZXQgZXh0cmFjdGVkID0ge3JvbGU6ICcnLCBjb21wYW55OiAnJywgZGF0ZV9hcHBsaWVkOiAnJ307XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGxsbUZldGNoKCcvYXBpL2ludGFrZS1tZXRhZGF0YScpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLmNvbmZpcm1lZCkge1xuICAgICAgYXdhaXQgX3Byb2NlZWRBZnRlckludGFrZShjb250aW51YXRpb24pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBleHRyYWN0ZWQgPSBkYXRhO1xuICB9IGNhdGNoIChfZSkgeyAvKiBmYWxsIHRocm91Z2ggd2l0aCBlbXB0eSBkZWZhdWx0cyAqLyB9XG5cbiAgY29uc3QgdG9kYXkgPSBleHRyYWN0ZWQuZGF0ZV9hcHBsaWVkIHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zbGljZSgwLCAxMCk7XG4gIGNvbnN0IGNhcmRIdG1sID0gYFxuICAgIDxkaXYgY2xhc3M9XCJpbnRha2UtY29uZmlybS1jYXJkXCIgaWQ9XCJpbnRha2UtY29uZmlybS1jYXJkXCIgcm9sZT1cImZvcm1cIiBhcmlhLWxhYmVsPVwiQ29uZmlybSBqb2IgZGV0YWlsc1wiPlxuICAgICAgPGgzPlx1RDgzRFx1RENDQiBDb25maXJtIGpvYiBkZXRhaWxzPC9oMz5cbiAgICAgIDxwPlJldmlldyB0aGUgZXh0cmFjdGVkIGRldGFpbHMgYmVmb3JlIGFuYWx5c2lzIGJlZ2lucy4gRWRpdCBhbnkgZmllbGQgaWYgbmVlZGVkLjwvcD5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbnRha2UtZmllbGQtcm93XCI+XG4gICAgICAgIDxsYWJlbCBmb3I9XCJpbnRha2Utcm9sZS1pbnB1dFwiPlJvbGUgLyBKb2IgVGl0bGU8L2xhYmVsPlxuICAgICAgICA8aW5wdXQgaWQ9XCJpbnRha2Utcm9sZS1pbnB1dFwiIHR5cGU9XCJ0ZXh0XCIgdmFsdWU9XCIke2VzY2FwZUh0bWwoZXh0cmFjdGVkLnJvbGUgfHwgJycpfVwiXG4gICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gU2VuaW9yIFNvZnR3YXJlIEVuZ2luZWVyXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbnRha2UtZmllbGQtcm93XCI+XG4gICAgICAgIDxsYWJlbCBmb3I9XCJpbnRha2UtY29tcGFueS1pbnB1dFwiPkNvbXBhbnk8L2xhYmVsPlxuICAgICAgICA8aW5wdXQgaWQ9XCJpbnRha2UtY29tcGFueS1pbnB1dFwiIHR5cGU9XCJ0ZXh0XCIgdmFsdWU9XCIke2VzY2FwZUh0bWwoZXh0cmFjdGVkLmNvbXBhbnkgfHwgJycpfVwiXG4gICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gQWNtZSBDb3JwXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbnRha2UtZmllbGQtcm93XCI+XG4gICAgICAgIDxsYWJlbCBmb3I9XCJpbnRha2UtZGF0ZS1pbnB1dFwiPkRhdGUgQXBwbGllZDwvbGFiZWw+XG4gICAgICAgIDxpbnB1dCBpZD1cImludGFrZS1kYXRlLWlucHV0XCIgdHlwZT1cImRhdGVcIiB2YWx1ZT1cIiR7ZXNjYXBlSHRtbCh0b2RheSl9XCI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbnRha2UtYWN0aW9uc1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLXNlY29uZGFyeVwiIG9uY2xpY2s9XCJfc2tpcEludGFrZUNhcmQoKVwiIHR5cGU9XCJidXR0b25cIj5Ta2lwPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4tcHJpbWFyeVwiICAgb25jbGljaz1cIl9zdWJtaXRJbnRha2VDYXJkKClcIiB0eXBlPVwiYnV0dG9uXCIgaWQ9XCJpbnRha2UtY29uZmlybS1idG5cIj5Db25maXJtICZhbXA7IENvbnRpbnVlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xuICBhcHBlbmRSYXdIdG1sKGNhcmRIdG1sKTtcblxuICBjb25zdCByb2xlSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW50YWtlLXJvbGUtaW5wdXQnKTtcbiAgaWYgKHJvbGVJbnB1dCAmJiAhcm9sZUlucHV0LnZhbHVlLnRyaW0oKSkgcm9sZUlucHV0LmZvY3VzKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9zdWJtaXRJbnRha2VDYXJkKGNvbnRpbnVhdGlvbiA9IG51bGwpIHtcbiAgY29uc3Qgcm9sZSAgICAgICAgID0gKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnRha2Utcm9sZS1pbnB1dCcpPy52YWx1ZSAgICB8fCAnJykudHJpbSgpO1xuICBjb25zdCBjb21wYW55ICAgICAgPSAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ludGFrZS1jb21wYW55LWlucHV0Jyk/LnZhbHVlIHx8ICcnKS50cmltKCk7XG4gIGNvbnN0IGRhdGVfYXBwbGllZCA9IChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW50YWtlLWRhdGUtaW5wdXQnKT8udmFsdWUgICAgfHwgJycpLnRyaW0oKTtcblxuICBjb25zdCBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW50YWtlLWNvbmZpcm0tYnRuJyk7XG4gIGlmIChidG4pIGJ0bi5kaXNhYmxlZCA9IHRydWU7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBsbG1GZXRjaCgnL2FwaS9jb25maXJtLWludGFrZScsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeydDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbid9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe3JvbGUsIGNvbXBhbnksIGRhdGVfYXBwbGllZH0pLFxuICAgIH0pO1xuICB9IGNhdGNoIChfZSkgeyAvKiBub24tZmF0YWwgKi8gfVxuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnRha2UtY29uZmlybS1jYXJkJyk/LnJlbW92ZSgpO1xuICBhd2FpdCBfcHJvY2VlZEFmdGVySW50YWtlKGNvbnRpbnVhdGlvbik7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9za2lwSW50YWtlQ2FyZChjb250aW51YXRpb24gPSBudWxsKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnRha2UtY29uZmlybS1jYXJkJyk/LnJlbW92ZSgpO1xuICBhd2FpdCBfcHJvY2VlZEFmdGVySW50YWtlKGNvbnRpbnVhdGlvbik7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9wcm9jZWVkQWZ0ZXJJbnRha2UoY29udGludWF0aW9uID0gbnVsbCkge1xuICBjb25zdCBlZmZlY3RpdmVDb250aW51YXRpb24gPVxuICAgICh0eXBlb2YgY29udGludWF0aW9uID09PSAnZnVuY3Rpb24nICYmIGNvbnRpbnVhdGlvbilcbiAgICB8fCBfcGVuZGluZ1Bvc3RJbnRha2VDb250aW51YXRpb25cbiAgICB8fCAoYXN5bmMgKCkgPT4gYW5hbHl6ZUpvYigpKTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBsbG1GZXRjaCgnL2FwaS9wcmlvci1jbGFyaWZpY2F0aW9ucycpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLmZvdW5kICYmIGRhdGEubWF0Y2hlcyAmJiBkYXRhLm1hdGNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgYmVzdCA9IGRhdGEubWF0Y2hlc1swXTtcbiAgICAgIF9wZW5kaW5nUG9zdEludGFrZUNvbnRpbnVhdGlvbiA9IGVmZmVjdGl2ZUNvbnRpbnVhdGlvbjtcbiAgICAgIGF3YWl0IF9vZmZlclByaW9yQ2xhcmlmaWNhdGlvbnMoYmVzdCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9IGNhdGNoIChfZSkgeyAvKiBmYWxsIHRocm91Z2ggKi8gfVxuXG4gIF9wZW5kaW5nUG9zdEludGFrZUNvbnRpbnVhdGlvbiA9IG51bGw7XG4gIGF3YWl0IGVmZmVjdGl2ZUNvbnRpbnVhdGlvbigpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBfb2ZmZXJQcmlvckNsYXJpZmljYXRpb25zKG1hdGNoKSB7XG4gIGNvbnN0IHJvbGVOYW1lID0gZXNjYXBlSHRtbChtYXRjaC5yb2xlIHx8IG1hdGNoLnBvc2l0aW9uX25hbWUgfHwgJ2Egc2ltaWxhciByb2xlJyk7XG4gIGNvbnN0IGJhbm5lckh0bWwgPSBgXG4gICAgPGRpdiBjbGFzcz1cInByaW9yLWNsYXJpZmljYXRpb25zLWJhbm5lclwiIGlkPVwicHJpb3ItY2xhci1iYW5uZXJcIiByb2xlPVwic3RhdHVzXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicGNiLXRleHRcIj5cbiAgICAgICAgXHVEODNEXHVEQ0ExIEZvdW5kIHByaW9yIGFuc3dlcnMgZnJvbSA8c3BhbiBjbGFzcz1cInBjYi1yb2xlXCI+JHtyb2xlTmFtZX08L3NwYW4+LlxuICAgICAgICBMb2FkIHRoZW0gYXMgZGVmYXVsdHMgZm9yIHRoZSBjbGFyaWZpY2F0aW9uIHF1ZXN0aW9ucz9cbiAgICAgIDwvZGl2PlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1zZWNvbmRhcnlcIiBvbmNsaWNrPVwiX2Rpc21pc3NQcmlvckNsYXJpZmljYXRpb25zKClcIiB0eXBlPVwiYnV0dG9uXCI+Tm8gdGhhbmtzPC9idXR0b24+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLXByaW1hcnlcIiAgIG9uY2xpY2s9XCJfbG9hZFByaW9yQ2xhcmlmaWNhdGlvbnMoKVwiIHR5cGU9XCJidXR0b25cIiBpZD1cInBjYi1sb2FkLWJ0blwiPkxvYWQgZGVmYXVsdHM8L2J1dHRvbj5cbiAgICA8L2Rpdj5gO1xuICBhcHBlbmRSYXdIdG1sKGJhbm5lckh0bWwpO1xuXG4gIHdpbmRvdy5fcGVuZGluZ1ByaW9yQW5zd2VycyA9IG1hdGNoLmFuc3dlcnMgfHwge307XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9kaXNtaXNzUHJpb3JDbGFyaWZpY2F0aW9ucygpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ByaW9yLWNsYXItYmFubmVyJyk/LnJlbW92ZSgpO1xuICBkZWxldGUgd2luZG93Ll9wZW5kaW5nUHJpb3JBbnN3ZXJzO1xuICBjb25zdCBjb250aW51YXRpb24gPSBfcGVuZGluZ1Bvc3RJbnRha2VDb250aW51YXRpb24gfHwgKGFzeW5jICgpID0+IGFuYWx5emVKb2IoKSk7XG4gIF9wZW5kaW5nUG9zdEludGFrZUNvbnRpbnVhdGlvbiA9IG51bGw7XG4gIGF3YWl0IGNvbnRpbnVhdGlvbigpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBfbG9hZFByaW9yQ2xhcmlmaWNhdGlvbnMoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcmlvci1jbGFyLWJhbm5lcicpPy5yZW1vdmUoKTtcbiAgY29uc3QgYW5zd2VycyA9IHdpbmRvdy5fcGVuZGluZ1ByaW9yQW5zd2VycyB8fCB7fTtcbiAgZGVsZXRlIHdpbmRvdy5fcGVuZGluZ1ByaW9yQW5zd2VycztcbiAgaWYgKHR5cGVvZiBxdWVzdGlvbkFuc3dlcnMgPT09ICdvYmplY3QnICYmIHF1ZXN0aW9uQW5zd2VycyAhPT0gbnVsbCkge1xuICAgIE9iamVjdC5hc3NpZ24ocXVlc3Rpb25BbnN3ZXJzLCBhbnN3ZXJzKTtcbiAgfSBlbHNlIHtcbiAgICB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgYW5zd2Vycyk7XG4gIH1cbiAgY29uc3QgY29udGludWF0aW9uID0gX3BlbmRpbmdQb3N0SW50YWtlQ29udGludWF0aW9uIHx8IChhc3luYyAoKSA9PiBhbmFseXplSm9iKCkpO1xuICBfcGVuZGluZ1Bvc3RJbnRha2VDb250aW51YXRpb24gPSBudWxsO1xuICBhd2FpdCBjb250aW51YXRpb24oKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEVTIG1vZHVsZSBleHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuZXhwb3J0IHtcbiAgX2hhbmRsZUxMTU1lc3NhZ2UsXG4gIF9tZXNzYWdlSGFuZGxlcnMsXG4gIHNlbmRNZXNzYWdlLFxuICBfc2hvd0ludGFrZUNvbmZpcm1DYXJkLFxuICBfc3VibWl0SW50YWtlQ2FyZCxcbiAgX3NraXBJbnRha2VDYXJkLFxuICBfcHJvY2VlZEFmdGVySW50YWtlLFxuICBfb2ZmZXJQcmlvckNsYXJpZmljYXRpb25zLFxuICBfZGlzbWlzc1ByaW9yQ2xhcmlmaWNhdGlvbnMsXG4gIF9sb2FkUHJpb3JDbGFyaWZpY2F0aW9ucyxcbn07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9xdWVzdGlvbnMtcGFuZWwuanNcbiAqIFBvc3QtYW5hbHlzaXMgY2xhcmlmeWluZyBxdWVzdGlvbnMgcGFuZWw6IHJlbmRlciwgZHJhZnQsIHN1Ym1pdC5cbiAqXG4gKiBERVBFTkRFTkNJRVMgKGFsbCBvbiBnbG9iYWxUaGlzIGF0IHJ1bnRpbWUpOlxuICogICAtIGNsZWFuSnNvblJlc3BvbnNlICh1dGlscy5qcylcbiAqICAgLSBtZXJnZVBvc3RBbmFseXNpc1F1ZXN0aW9ucywgbm9ybWFsaXplUG9zdEFuYWx5c2lzUXVlc3Rpb25zIChqb2ItYW5hbHlzaXMuanMpXG4gKiAgIC0gYnVpbGRGYWxsYmFja1Bvc3RBbmFseXNpc1F1ZXN0aW9ucyAocmVjb21tZW5kYXRpb24taGVscGVycy5qcylcbiAqICAgLSBhcHBlbmRNZXNzYWdlIChtZXNzYWdlLXF1ZXVlLmpzKVxuICogICAtIHNlbmRBY3Rpb24gKHNlc3Npb24tYWN0aW9ucy5qcylcbiAqICAgLSBlc2NhcGVIdG1sICh1dGlscy5qcylcbiAqICAgLSBzd2l0Y2hUYWIgKHJldmlldy10YWJsZS1iYXNlLmpzLCBUaWVyIDQpXG4gKiAgIC0gc3RhdGVNYW5hZ2VyIChzdGF0ZS1tYW5hZ2VyLmpzIFx1MjAxNCBnZXRUYWJEYXRhKCkpXG4gKiAgIC0gcG9zdEFuYWx5c2lzUXVlc3Rpb25zLCBxdWVzdGlvbkFuc3dlcnMgKHdpbmRvdyBnbG9iYWxzKVxuICovXG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmNvbnN0IGxvZyA9IGdldExvZ2dlcigncXVlc3Rpb25zLXBhbmVsJyk7XG5cbmltcG9ydCB7IHN0YXRlTWFuYWdlciB9IGZyb20gJy4vc3RhdGUtbWFuYWdlci5qcyc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU3RhdGUgcGVyc2lzdGVuY2UgaGVscGVyc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmFzeW5jIGZ1bmN0aW9uIHBlcnNpc3RQb3N0QW5hbHlzaXNTdGF0ZSgpIHtcbiAgdHJ5IHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkod2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucykpIHtcbiAgICAgIHdpbmRvdy5wb3N0QW5hbHlzaXNRdWVzdGlvbnMgPSBbXTtcbiAgICB9XG4gICAgaWYgKCF3aW5kb3cucXVlc3Rpb25BbnN3ZXJzIHx8IHR5cGVvZiB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzICE9PSAnb2JqZWN0Jykge1xuICAgICAgd2luZG93LnF1ZXN0aW9uQW5zd2VycyA9IHt9O1xuICAgIH1cblxuICAgIGF3YWl0IGZldGNoKCcvYXBpL3Bvc3QtYW5hbHlzaXMtcmVzcG9uc2VzJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgcXVlc3Rpb25zOiB3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zLFxuICAgICAgICBhbnN3ZXJzOiB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzXG4gICAgICB9KVxuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy53YXJuKCdGYWlsZWQgdG8gcGVyc2lzdCBwb3N0LWFuYWx5c2lzIHN0YXRlOicsIGVycm9yKTtcbiAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIE1hcmtkb3duIHJlbmRlcmVyIGZvciBxdWVzdGlvbiB0ZXh0XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gcmVuZGVyUXVlc3Rpb25NYXJrZG93bihtYXJrZG93blRleHQpIHtcbiAgY29uc3Qgc2FmZSA9IGVzY2FwZUh0bWwobWFya2Rvd25UZXh0IHx8ICcnKTtcbiAgcmV0dXJuIHNhZmVcbiAgICAucmVwbGFjZSgvXFwqXFwqKC4rPylcXCpcXCovZywgJzxzdHJvbmc+JDE8L3N0cm9uZz4nKVxuICAgIC5yZXBsYWNlKC9cXCooLis/KVxcKi9nLCAnPGVtPiQxPC9lbT4nKVxuICAgIC5yZXBsYWNlKC9gKFteYF0rKWAvZywgJzxjb2RlPiQxPC9jb2RlPicpXG4gICAgLnJlcGxhY2UoL1xcbi9nLCAnPGJyPicpO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEFQSSBmZXRjaCBmb3IgcXVlc3Rpb25zXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hQb3N0QW5hbHlzaXNRdWVzdGlvbnNGcm9tQXBpKGFuYWx5c2lzRGF0YSkge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3Bvc3QtYW5hbHlzaXMtcXVlc3Rpb25zJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgYW5hbHlzaXM6IGFuYWx5c2lzRGF0YSB9KVxuICAgIH0pO1xuICAgIGlmICghcmVzLm9rKSByZXR1cm4gW107XG4gICAgY29uc3QgcGF5bG9hZCA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZVBvc3RBbmFseXNpc1F1ZXN0aW9ucyhwYXlsb2FkLnF1ZXN0aW9ucyk7XG4gIH0gY2F0Y2ggKGFwaUVycm9yKSB7XG4gICAgbG9nLndhcm4oJ0ZhaWxlZCB0byBmZXRjaCBwb3N0LWFuYWx5c2lzIHF1ZXN0aW9uczonLCBhcGlFcnJvcik7XG4gICAgcmV0dXJuIFtdO1xuICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gTWFpbiBvcmNoZXN0cmF0b3I6IGNhbGxlZCBhZnRlciBhbmFseXplSm9iIGNvbXBsZXRlc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmFzeW5jIGZ1bmN0aW9uIGFza1Bvc3RBbmFseXNpc1F1ZXN0aW9ucyhhbmFseXNpc1Jlc3VsdCwgcHJlZmVycmVkUXVlc3Rpb25zID0gbnVsbCkge1xuICB0cnkge1xuICAgIGxldCBkYXRhO1xuICAgIGlmIChhbmFseXNpc1Jlc3VsdCAhPT0gbnVsbCAmJiB0eXBlb2YgYW5hbHlzaXNSZXN1bHQgPT09ICdvYmplY3QnKSB7XG4gICAgICBkYXRhID0gYW5hbHlzaXNSZXN1bHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNsZWFuUmVzdWx0ID0gY2xlYW5Kc29uUmVzcG9uc2UoYW5hbHlzaXNSZXN1bHQpO1xuICAgICAgZGF0YSA9IHR5cGVvZiBjbGVhblJlc3VsdCA9PT0gJ3N0cmluZycgPyBKU09OLnBhcnNlKGNsZWFuUmVzdWx0KSA6IGNsZWFuUmVzdWx0O1xuICAgIH1cblxuICAgIHdpbmRvdy5wb3N0QW5hbHlzaXNRdWVzdGlvbnMgPSBtZXJnZVBvc3RBbmFseXNpc1F1ZXN0aW9ucyhbXSwgcHJlZmVycmVkUXVlc3Rpb25zKTtcblxuICAgIGlmICh3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgd2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucyA9IGF3YWl0IGZldGNoUG9zdEFuYWx5c2lzUXVlc3Rpb25zRnJvbUFwaShkYXRhKTtcbiAgICB9XG5cbiAgICBpZiAod2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHdpbmRvdy5wb3N0QW5hbHlzaXNRdWVzdGlvbnMgPSBidWlsZEZhbGxiYWNrUG9zdEFuYWx5c2lzUXVlc3Rpb25zKGRhdGEpO1xuICAgIH1cblxuICAgIGlmICghd2luZG93LnF1ZXN0aW9uQW5zd2VycyB8fCB0eXBlb2Ygd2luZG93LnF1ZXN0aW9uQW5zd2VycyAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHdpbmRvdy5xdWVzdGlvbkFuc3dlcnMgPSB7fTtcbiAgICB9XG4gICAgYXdhaXQgcGVyc2lzdFBvc3RBbmFseXNpc1N0YXRlKCk7XG5cbiAgICBpZiAod2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICByZW5kZXJRdWVzdGlvbnNQYW5lbCgpO1xuICAgICAgc3dpdGNoVGFiKCdxdWVzdGlvbnMnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ0FuYWx5c2lzIGNvbXBsZXRlISBObyBjbGFyaWZ5aW5nIHF1ZXN0aW9ucyBuZWVkZWQuIEdlbmVyYXRpbmcgY3VzdG9taXphdGlvbiByZWNvbW1lbmRhdGlvbnNcdTIwMjYnKTtcbiAgICAgIGF3YWl0IHNlbmRBY3Rpb24oJ3JlY29tbWVuZF9jdXN0b21pemF0aW9ucycpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZy5lcnJvcignRXJyb3IgcGFyc2luZyBhbmFseXNpcyBmb3IgcXVlc3Rpb25zOicsIGUpO1xuICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsICdBbmFseXNpcyBjb21wbGV0ZSEgQ2xpY2sgXCJSZWNvbW1lbmQgQ3VzdG9taXphdGlvbnNcIiB3aGVuIHJlYWR5LicpO1xuICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVGFiIHBvcHVsYXRpb25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiBwb3B1bGF0ZVF1ZXN0aW9uc1RhYigpIHtcbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIGlmICghY29udGVudCkgcmV0dXJuO1xuXG4gIGlmICghc3RhdGVNYW5hZ2VyLmdldFRhYkRhdGEoJ2FuYWx5c2lzJykpIHtcbiAgICBjb250ZW50LmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwiZW1wdHktc3RhdGVcIj48ZGl2IGNsYXNzPVwiaWNvblwiPlx1RDgzRFx1RENBQzwvZGl2PjxoMz5ObyBRdWVzdGlvbnMgWWV0PC9oMz48cD5SdW4gXCJBbmFseXNlIEpvYlwiIGZpcnN0IHRvIGdlbmVyYXRlIGNsYXJpZnlpbmcgcXVlc3Rpb25zLjwvcD48L2Rpdj4nO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGhhc1F1ZXN0aW9ucyA9IEFycmF5LmlzQXJyYXkod2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucykgJiYgd2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9ucy5sZW5ndGggPiAwO1xuICBpZiAoIWhhc1F1ZXN0aW9ucykge1xuICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJlbXB0eS1zdGF0ZVwiPjxkaXYgY2xhc3M9XCJpY29uXCI+XHUyNzA1PC9kaXY+PGgzPlF1ZXN0aW9ucyBDb21wbGV0ZTwvaDM+PHA+Tm8gcGVuZGluZyBjbGFyaWZ5aW5nIHF1ZXN0aW9ucyBcdTIwMTQgY3VzdG9taXphdGlvbiByZWNvbW1lbmRhdGlvbnMgd2lsbCBiZSBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS48L3A+PC9kaXY+JztcbiAgICByZXR1cm47XG4gIH1cblxuICBfY3VycmVudEdyb3VwID0gMDtcbiAgY29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImFuYWx5c2lzLXBhZ2VcIj48ZGl2IGNsYXNzPVwiYW5hbHlzaXMtc2VjdGlvblwiPjxoMj5cdUQ4M0RcdURDQUMgQ2xhcmlmeWluZyBRdWVzdGlvbnM8L2gyPjxwIHN0eWxlPVwiY29sb3I6IzY0NzQ4YjsgbWFyZ2luOiAwO1wiPlBsZWFzZSBhbnN3ZXIgZWFjaCBxdWVzdGlvbiB0byBpbXByb3ZlIHJlY29tbWVuZGF0aW9uIHF1YWxpdHkuPC9wPjwvZGl2PjwvZGl2Pic7XG4gIHJlbmRlclF1ZXN0aW9uc1BhbmVsKCk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUGFuZWwgcmVuZGVyZXJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiByZW5kZXJRdWVzdGlvbnNQYW5lbCgpIHtcbiAgY29uc3QgcXMgPSB3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zIHx8IFtdO1xuICBpZiAocXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIGlmICghY29udGVudCkgcmV0dXJuO1xuXG4gIGNvbnN0IGV4aXN0aW5nID0gY29udGVudC5xdWVyeVNlbGVjdG9yKCcucXVlc3Rpb25zLXBhbmVsJyk7XG4gIGlmIChleGlzdGluZykgZXhpc3RpbmcucmVtb3ZlKCk7XG5cbiAgY29uc3QgdG90YWwgICAgICA9IHFzLmxlbmd0aDtcbiAgY29uc3QgbnVtR3JvdXBzICA9IE1hdGguY2VpbCh0b3RhbCAvIEdST1VQX1NJWkUpO1xuICAvLyBDbGFtcCBncm91cCBpbmRleCBpbiBjYXNlIHFzIHNocmFuayBzaW5jZSBsYXN0IHJlbmRlci5cbiAgX2N1cnJlbnRHcm91cCAgICA9IE1hdGgubWluKF9jdXJyZW50R3JvdXAsIG51bUdyb3VwcyAtIDEpO1xuICBjb25zdCBncm91cFN0YXJ0ID0gX2N1cnJlbnRHcm91cCAqIEdST1VQX1NJWkU7XG4gIGNvbnN0IGdyb3VwRW5kICAgPSBNYXRoLm1pbihncm91cFN0YXJ0ICsgR1JPVVBfU0laRSwgdG90YWwpO1xuICBjb25zdCBncm91cFFzICAgID0gcXMuc2xpY2UoZ3JvdXBTdGFydCwgZ3JvdXBFbmQpO1xuICBjb25zdCBpc0xhc3RHcm91cCA9IF9jdXJyZW50R3JvdXAgPT09IG51bUdyb3VwcyAtIDE7XG5cbiAgY29uc3QgZXhpc3RpbmdBbnN3ZXJzID0gKHdpbmRvdy5xdWVzdGlvbkFuc3dlcnMgJiYgdHlwZW9mIHdpbmRvdy5xdWVzdGlvbkFuc3dlcnMgPT09ICdvYmplY3QnKVxuICAgID8gd2luZG93LnF1ZXN0aW9uQW5zd2VycyA6IHt9O1xuXG4gIGNvbnN0IGdyb3VwTGFiZWwgPSBudW1Hcm91cHMgPiAxXG4gICAgPyBgR3JvdXAgJHtfY3VycmVudEdyb3VwICsgMX0gb2YgJHtudW1Hcm91cHN9YFxuICAgIDogYCR7dG90YWx9IHF1ZXN0aW9uJHt0b3RhbCA+IDEgPyAncycgOiAnJ31gO1xuXG4gIGNvbnN0IGdyb3VwTmF2SHRtbCA9IG51bUdyb3VwcyA+IDEgPyByZW5kZXJRR3JvdXBOYXYobnVtR3JvdXBzLCBxcywgZXhpc3RpbmdBbnN3ZXJzKSA6ICcnO1xuXG4gIGxldCBwYW5lbEh0bWwgPSBgPGRpdiBjbGFzcz1cInF1ZXN0aW9ucy1wYW5lbFwiIGlkPVwicXVlc3Rpb25zLXBhbmVsXCI+XG4gICAgPGgyPlx1RDgzRFx1RENBQyBBIGZldyBxdWljayBxdWVzdGlvbnM8L2gyPlxuICAgIDxwIGNsYXNzPVwicS1wcm9ncmVzc1wiIGlkPVwicS1wcm9ncmVzc1wiPiR7Z3JvdXBMYWJlbH0gXHUyMDE0IGFuc3dlciBlYWNoIHRvIGNvbnRpbnVlLjwvcD5cbiAgICAke2dyb3VwTmF2SHRtbH1gO1xuXG4gIGdyb3VwUXMuZm9yRWFjaCgocSwgbG9jYWxJZHgpID0+IHtcbiAgICBjb25zdCBpZHggPSBncm91cFN0YXJ0ICsgbG9jYWxJZHg7XG4gICAgY29uc3Qgc2F2ZWRBbnN3ZXIgPSAoZXhpc3RpbmdBbnN3ZXJzW3EudHlwZV0gfHwgJycpLnRvU3RyaW5nKCk7XG4gICAgY29uc3QgaXNBbnN3ZXJlZCAgPSBzYXZlZEFuc3dlci50cmltKCkubGVuZ3RoID4gMDtcbiAgICBjb25zdCByZW5kZXJlZFF1ZXN0aW9uID0gcmVuZGVyUXVlc3Rpb25NYXJrZG93bihxLnF1ZXN0aW9uKTtcbiAgICBjb25zdCBjaGlwcyA9IChxLmNob2ljZXMgfHwgW10pLm1hcCgoYywgY2kpID0+XG4gICAgICBgPGJ1dHRvbiBjbGFzcz1cInEtY2hpcFwiIGRhdGEtcWlkeD1cIiR7aWR4fVwiIGRhdGEtY2lkeD1cIiR7Y2l9XCIgb25jbGljaz1cInNlbGVjdFFDaGlwKHRoaXMsICR7aWR4fSlcIj4ke2VzY2FwZUh0bWwoYyl9PC9idXR0b24+YFxuICAgICkuam9pbignJyk7XG4gICAgcGFuZWxIdG1sICs9IGBcbiAgICAgIDxkaXYgY2xhc3M9XCJxdWVzdGlvbi1pdGVtJHtpc0Fuc3dlcmVkID8gJyBhbnN3ZXJlZCcgOiAnJ31cIiBpZD1cInEtaXRlbS0ke2lkeH1cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInEtaGVhZGVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInEtdGV4dFwiPiR7aWR4ICsgMX0uICR7cmVuZGVyZWRRdWVzdGlvbn08L2Rpdj5cbiAgICAgICAgICAke2lzQW5zd2VyZWQgPyAnPHNwYW4gY2xhc3M9XCJxLWFuc3dlcmVkLWJhZGdlXCI+XHUyNzEzIEFuc3dlcmVkPC9zcGFuPicgOiAnJ31cbiAgICAgICAgPC9kaXY+XG4gICAgICAgICR7Y2hpcHMgPyBgPGRpdiBjbGFzcz1cInEtY2hpcHNcIj4ke2NoaXBzfTwvZGl2PmAgOiAnJ31cbiAgICAgICAgPGRpdiBjbGFzcz1cInEtYW5zd2VyLXJvd1wiPlxuICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cInEtaW5wdXRcIiBpZD1cInEtaW5wdXQtJHtpZHh9XCIgcGxhY2Vob2xkZXI9XCJZb3VyIGFuc3dlclx1MjAyNlwiIG9uaW5wdXQ9XCJvblFJbnB1dENoYW5nZSgke2lkeH0pXCI+JHtlc2NhcGVIdG1sKHNhdmVkQW5zd2VyKX08L3RleHRhcmVhPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJxLWRyYWZ0LWJ0blwiIGlkPVwicS1kcmFmdC1idG4tJHtpZHh9XCIgb25jbGljaz1cImRyYWZ0UXVlc3Rpb25SZXNwb25zZSgke2lkeH0pXCIgdGl0bGU9XCJHZW5lcmF0ZSBhIGRyYWZ0IGFuc3dlciB1c2luZyBBSVwiPlx1MjcyOCBEcmFmdDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PmA7XG4gIH0pO1xuXG4gIGlmIChpc0xhc3RHcm91cCkge1xuICAgIHBhbmVsSHRtbCArPSBgPGJ1dHRvbiBjbGFzcz1cInF1ZXN0aW9ucy1zdWJtaXQtYnRuXCIgaWQ9XCJxLXN1Ym1pdC1idG5cIiBvbmNsaWNrPVwic3VibWl0QWxsQW5zd2VycygpXCIgZGlzYWJsZWQ+U3VibWl0IEFuc3dlcnM8L2J1dHRvbj5gO1xuICB9IGVsc2Uge1xuICAgIHBhbmVsSHRtbCArPSBgPGJ1dHRvbiBjbGFzcz1cInF1ZXN0aW9ucy1zdWJtaXQtYnRuXCIgaWQ9XCJxLXN1Ym1pdC1idG5cIiBvbmNsaWNrPVwiYWR2YW5jZVFHcm91cCgpXCIgZGlzYWJsZWQ+Q29udGludWUgXHUyMTkyIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjAuOGVtO2ZvbnQtd2VpZ2h0OjQwMDtcIj4oJHtncm91cEVuZH0gb2YgJHt0b3RhbH0gYW5zd2VyZWQpPC9zcGFuPjwvYnV0dG9uPmA7XG4gIH1cbiAgcGFuZWxIdG1sICs9ICc8L2Rpdj4nO1xuXG4gIGNvbnRlbnQuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCBwYW5lbEh0bWwpO1xuXG4gIC8vIFJlc3RvcmUgY2hpcCBzZWxlY3Rpb24gZm9yIGFueSBxdWVzdGlvbiB3aG9zZSBzYXZlZCBhbnN3ZXIgbWF0Y2hlcyBhIGNoaXAgbGFiZWwuXG4gIGdyb3VwUXMuZm9yRWFjaCgocSwgbG9jYWxJZHgpID0+IHtcbiAgICBjb25zdCBpZHggPSBncm91cFN0YXJ0ICsgbG9jYWxJZHg7XG4gICAgY29uc3Qgc2F2ZWQgPSAoZXhpc3RpbmdBbnN3ZXJzW3EudHlwZV0gfHwgJycpLnRvU3RyaW5nKCkudHJpbSgpO1xuICAgIGlmICghc2F2ZWQpIHJldHVybjtcbiAgICBjb25zdCBpdGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHEtaXRlbS0ke2lkeH1gKTtcbiAgICBpZiAoIWl0ZW0pIHJldHVybjtcbiAgICBpdGVtLnF1ZXJ5U2VsZWN0b3JBbGwoJy5xLWNoaXAnKS5mb3JFYWNoKGNoaXAgPT4ge1xuICAgICAgaWYgKChjaGlwLnRleHRDb250ZW50IHx8ICcnKS50cmltKCkgPT09IHNhdmVkKSBjaGlwLmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHVwZGF0ZVFQcm9ncmVzcygpO1xufVxuXG4vLyBHcm91cC1uYXZpZ2F0aW9uIHN0cmlwIChHQVAtMTYgUGFydCBEKTogbGV0cyB0aGUgdXNlciBqdW1wIGJhY2sgdG8gYW5cbi8vIGVhcmxpZXIgZ3JvdXAgdG8gcmV2aWV3L2VkaXQgaXQgd2l0aG91dCBsb3NpbmcgZm9yd2FyZCBwcm9ncmVzcy4gVGhlc2Vcbi8vIGFyZSBwbGFpbiBidXR0b25zLCBub3QgYW4gQVJJQSB0YWJsaXN0IFx1MjAxNCBubyBhcnJvdy1rZXkgcm92aW5nIGlzIGltcGxlbWVudGVkLFxuLy8gc28gYSB0YWIvdGFibGlzdCByb2xlIHdvdWxkIHNldCBhIGZhbHNlIGV4cGVjdGF0aW9uIGZvciBzY3JlZW4gcmVhZGVycy5cbmZ1bmN0aW9uIF9pc0dyb3VwRnVsbHlBbnN3ZXJlZChncm91cElkeCwgcXMsIGV4aXN0aW5nQW5zd2Vycykge1xuICBjb25zdCBncm91cFN0YXJ0ID0gZ3JvdXBJZHggKiBHUk9VUF9TSVpFO1xuICBjb25zdCBncm91cEVuZCAgICA9IE1hdGgubWluKGdyb3VwU3RhcnQgKyBHUk9VUF9TSVpFLCBxcy5sZW5ndGgpO1xuICBmb3IgKGxldCBpZHggPSBncm91cFN0YXJ0OyBpZHggPCBncm91cEVuZDsgaWR4KyspIHtcbiAgICBjb25zdCBxID0gcXNbaWR4XTtcbiAgICBpZiAoIXEpIGNvbnRpbnVlO1xuICAgIGlmICghKGV4aXN0aW5nQW5zd2Vyc1txLnR5cGVdIHx8ICcnKS50b1N0cmluZygpLnRyaW0oKSkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiByZW5kZXJRR3JvdXBOYXYobnVtR3JvdXBzLCBxcywgZXhpc3RpbmdBbnN3ZXJzKSB7XG4gIGNvbnN0IGRvdHMgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1Hcm91cHM7IGkrKykge1xuICAgIGNvbnN0IGlzQWN0aXZlID0gaSA9PT0gX2N1cnJlbnRHcm91cDtcbiAgICBjb25zdCBpc0RvbmUgICA9ICFpc0FjdGl2ZSAmJiBfaXNHcm91cEZ1bGx5QW5zd2VyZWQoaSwgcXMsIGV4aXN0aW5nQW5zd2Vycyk7XG4gICAgY29uc3QgY2xzID0gWydxLWdyb3VwLWRvdCddO1xuICAgIGlmIChpc0FjdGl2ZSkgY2xzLnB1c2goJ2FjdGl2ZScpO1xuICAgIGlmIChpc0RvbmUpIGNscy5wdXNoKCdkb25lJyk7XG4gICAgY29uc3Qgc3RhdGVMYWJlbCA9IGlzQWN0aXZlID8gJ2N1cnJlbnQnIDogaXNEb25lID8gJ2NvbXBsZXRlZCcgOiAnbm90IHlldCBhbnN3ZXJlZCc7XG4gICAgY29uc3QgYXJpYUxhYmVsID0gYFJldmlldyBhbnN3ZXJzIGZvciBHcm91cCAke2kgKyAxfSwgJHtzdGF0ZUxhYmVsfSBcdTIwMTQgbm8gcmVzdWJtaXNzaW9uYDtcbiAgICBkb3RzLnB1c2goXG4gICAgICBgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCIke2Nscy5qb2luKCcgJyl9XCIgZGF0YS1ncm91cD1cIiR7aX1cImAgK1xuICAgICAgYCR7aXNBY3RpdmUgPyAnIGFyaWEtY3VycmVudD1cInN0ZXBcIicgOiAnJ30gYXJpYS1sYWJlbD1cIiR7ZXNjYXBlSHRtbChhcmlhTGFiZWwpfVwiYCArXG4gICAgICBgIG9uY2xpY2s9XCJqdW1wVG9RR3JvdXAoJHtpfSlcIj4ke2lzRG9uZSA/ICdcdTI3MTMnIDogaSArIDF9PC9idXR0b24+YFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGA8ZGl2IGNsYXNzPVwicS1ncm91cC1uYXZcIiBhcmlhLWxhYmVsPVwiUXVlc3Rpb24gZ3JvdXBzXCI+JHtkb3RzLmpvaW4oJycpfTwvZGl2PmA7XG59XG5cbi8vIEZsdXNoIHRoZSBjdXJyZW50IGdyb3VwJ3MgdGV4dGFyZWEgdmFsdWVzIGludG8gd2luZG93LnF1ZXN0aW9uQW5zd2Vycy5cbi8vIFNoYXJlZCBieSBhZHZhbmNlUUdyb3VwKCkgKGZvcndhcmQgcHJvZ3Jlc3Npb24pIGFuZCBqdW1wVG9RR3JvdXAoKVxuLy8gKGJhY2t3YXJkIG5hdmlnYXRpb24pIHNvIGJvdGggcGVyc2lzdCBpbi1wcm9ncmVzcyBlZGl0cyB0aGUgc2FtZSB3YXkuXG5mdW5jdGlvbiBfZmx1c2hDdXJyZW50R3JvdXBBbnN3ZXJzKCkge1xuICBjb25zdCBxcyA9IHdpbmRvdy5wb3N0QW5hbHlzaXNRdWVzdGlvbnMgfHwgW107XG4gIGNvbnN0IGdyb3VwU3RhcnQgPSBfY3VycmVudEdyb3VwICogR1JPVVBfU0laRTtcbiAgY29uc3QgZ3JvdXBFbmQgICA9IE1hdGgubWluKGdyb3VwU3RhcnQgKyBHUk9VUF9TSVpFLCBxcy5sZW5ndGgpO1xuICBmb3IgKGxldCBpZHggPSBncm91cFN0YXJ0OyBpZHggPCBncm91cEVuZDsgaWR4KyspIHtcbiAgICBjb25zdCBxICA9IHFzW2lkeF07XG4gICAgY29uc3QgdGEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcS1pbnB1dC0ke2lkeH1gKTtcbiAgICBpZiAocSAmJiB0YSAmJiB0YS52YWx1ZS50cmltKCkpIHtcbiAgICAgIGlmICghd2luZG93LnF1ZXN0aW9uQW5zd2Vycykgd2luZG93LnF1ZXN0aW9uQW5zd2VycyA9IHt9O1xuICAgICAgd2luZG93LnF1ZXN0aW9uQW5zd2Vyc1txLnR5cGVdID0gdGEudmFsdWUudHJpbSgpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhZHZhbmNlUUdyb3VwKCkge1xuICBfZmx1c2hDdXJyZW50R3JvdXBBbnN3ZXJzKCk7XG4gIHBlcnNpc3RQb3N0QW5hbHlzaXNTdGF0ZSgpO1xuICBfY3VycmVudEdyb3VwKys7XG4gIHJlbmRlclF1ZXN0aW9uc1BhbmVsKCk7XG59XG5cbi8vIEp1bXAgYmFjayAob3IgZm9yd2FyZCkgdG8gYSBzcGVjaWZpYyBncm91cCB3aXRob3V0IHJlcXVpcmluZyB0aGUgY3VycmVudFxuLy8gZ3JvdXAgdG8gYmUgY29tcGxldGUuIEZsdXNoZXMgaW4tcHJvZ3Jlc3MgYW5zd2VycyBmaXJzdCBzbyBub3RoaW5nIHR5cGVkXG4vLyBzbyBmYXIgaXMgbG9zdCwgYnV0IFx1MjAxNCB1bmxpa2UgYWR2YW5jZVFHcm91cCgpIFx1MjAxNCBkb2VzIG5vdCBnYXRlIG9uIGNvbXBsZXRlbmVzc1xuLy8gYW5kIGRvZXMgbm90IHJlc3VibWl0IGFueXRoaW5nLlxuZnVuY3Rpb24ganVtcFRvUUdyb3VwKHRhcmdldEdyb3VwKSB7XG4gIF9mbHVzaEN1cnJlbnRHcm91cEFuc3dlcnMoKTtcbiAgcGVyc2lzdFBvc3RBbmFseXNpc1N0YXRlKCk7XG4gIF9jdXJyZW50R3JvdXAgPSB0YXJnZXRHcm91cDtcbiAgcmVuZGVyUXVlc3Rpb25zUGFuZWwoKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBJbnRlcmFjdGlvbiBoYW5kbGVyc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmFzeW5jIGZ1bmN0aW9uIGRyYWZ0UXVlc3Rpb25SZXNwb25zZShpZHgpIHtcbiAgY29uc3QgcXMgPSB3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zIHx8IFtdO1xuICBjb25zdCBxICA9IHFzW2lkeF07XG4gIGlmICghcSkgcmV0dXJuO1xuXG4gIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBxLWRyYWZ0LWJ0bi0ke2lkeH1gKTtcbiAgY29uc3QgdGEgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHEtaW5wdXQtJHtpZHh9YCk7XG4gIGlmICghYnRuIHx8ICF0YSkgcmV0dXJuO1xuXG4gIGJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gIGJ0bi5pbm5lckhUTUwgPSAnPHNwYW4gY2xhc3M9XCJzcGlubmVyXCIgc3R5bGU9XCJkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDoxMXB4O2hlaWdodDoxMXB4O2JvcmRlcjoycHggc29saWQgY3VycmVudENvbG9yO2JvcmRlci10b3AtY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyLXJhZGl1czo1MCU7YW5pbWF0aW9uOnNwaW4gMC43cyBsaW5lYXIgaW5maW5pdGU7dmVydGljYWwtYWxpZ246bWlkZGxlO1wiPjwvc3Bhbj4nO1xuXG4gIHRyeSB7XG4gICAgbGV0IGFuYWx5c2lzUGF5bG9hZCA9IG51bGw7XG4gICAgY29uc3QgYW5hbHlzaXNTdGF0ZSA9IHN0YXRlTWFuYWdlci5nZXRUYWJEYXRhKCdhbmFseXNpcycpO1xuICAgIGlmIChhbmFseXNpc1N0YXRlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjbGVhbmVkID0gY2xlYW5Kc29uUmVzcG9uc2UoYW5hbHlzaXNTdGF0ZSk7XG4gICAgICAgIGFuYWx5c2lzUGF5bG9hZCA9IHR5cGVvZiBjbGVhbmVkID09PSAnc3RyaW5nJyA/IEpTT04ucGFyc2UoY2xlYW5lZCkgOiBjbGVhbmVkO1xuICAgICAgfSBjYXRjaCAoXykgeyAvKiB1c2UgbnVsbCAqLyB9XG4gICAgfVxuXG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvcG9zdC1hbmFseXNpcy1kcmFmdC1yZXNwb25zZScsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHF1ZXN0aW9uOiBxLnF1ZXN0aW9uLCBxdWVzdGlvbl90eXBlOiBxLnR5cGUsIGFuYWx5c2lzOiBhbmFseXNpc1BheWxvYWQgfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEub2sgJiYgZGF0YS50ZXh0KSB7XG4gICAgICB0YS52YWx1ZSA9IGRhdGEudGV4dDtcbiAgICAgIHVwZGF0ZVFQcm9ncmVzcygpO1xuICAgICAgY29uc3QgaXRlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBxLWl0ZW0tJHtpZHh9YCk7XG4gICAgICBpZiAoaXRlbSkgaXRlbS5xdWVyeVNlbGVjdG9yQWxsKCcucS1jaGlwJykuZm9yRWFjaChjID0+IGMuY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKSk7XG4gICAgICBzaG93RHJhZnRFcnJvcihpZHgsIG51bGwpO1xuICAgICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgYFx1MjcyOCBEcmFmdCBhbnN3ZXIgZm9yIFEke2lkeCArIDF9OlxcblxcbiR7ZGF0YS50ZXh0fVxcblxcblJldmlldyBhbmQgZWRpdCBpbiB0aGUgZmllbGQgYmVsb3cgYmVmb3JlIHN1Ym1pdHRpbmcuYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZy53YXJuKCdEcmFmdCBnZW5lcmF0aW9uIGZhaWxlZDonLCBkYXRhLmVycm9yKTtcbiAgICAgIHNob3dEcmFmdEVycm9yKGlkeCwgZGF0YS5lcnJvciB8fCAnRHJhZnQgZmFpbGVkIFx1MjAxNCBwbGVhc2UgdHJ5IGFnYWluLicpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLmVycm9yKCdEcmFmdCBmZXRjaCBlcnJvcjonLCBlcnIpO1xuICAgIHNob3dEcmFmdEVycm9yKGlkeCwgJ05ldHdvcmsgZXJyb3IgXHUyMDE0IHBsZWFzZSB0cnkgYWdhaW4uJyk7XG4gIH0gZmluYWxseSB7XG4gICAgYnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgYnRuLmlubmVySFRNTCA9ICdcdTI3MjggRHJhZnQnO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNlbGVjdFFDaGlwKGJ0biwgcUlkeCkge1xuICBjb25zdCBwYW5lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBxLWl0ZW0tJHtxSWR4fWApO1xuICBpZiAocGFuZWwpIHtcbiAgICBwYW5lbC5xdWVyeVNlbGVjdG9yQWxsKCcucS1jaGlwJykuZm9yRWFjaChjID0+IGMuY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKSk7XG4gIH1cbiAgYnRuLmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7XG4gIGNvbnN0IHRleHRhcmVhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHEtaW5wdXQtJHtxSWR4fWApO1xuICBpZiAodGV4dGFyZWEpIHtcbiAgICB0ZXh0YXJlYS52YWx1ZSA9IGJ0bi50ZXh0Q29udGVudDtcbiAgICB1cGRhdGVRUHJvZ3Jlc3MoKTtcbiAgfVxuICAvLyBQZXJzaXN0IHRoZSBjaGlwIGFuc3dlciBpbW1lZGlhdGVseSBzbyBpdCBzdXJ2aXZlcyB0YWIgbmF2aWdhdGlvbi5cbiAgY29uc3QgcSA9ICh3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zIHx8IFtdKVtxSWR4XTtcbiAgaWYgKHEpIHtcbiAgICBpZiAoIXdpbmRvdy5xdWVzdGlvbkFuc3dlcnMgfHwgdHlwZW9mIHdpbmRvdy5xdWVzdGlvbkFuc3dlcnMgIT09ICdvYmplY3QnKSB7XG4gICAgICB3aW5kb3cucXVlc3Rpb25BbnN3ZXJzID0ge307XG4gICAgfVxuICAgIHdpbmRvdy5xdWVzdGlvbkFuc3dlcnNbcS50eXBlXSA9IGJ0bi50ZXh0Q29udGVudDtcbiAgICBwZXJzaXN0UG9zdEFuYWx5c2lzU3RhdGUoKTtcbiAgfVxufVxuXG4vLyBDdXJyZW50IHF1ZXN0aW9uLWdyb3VwIGluZGV4IChcdTIyNjQzLXBlci1ncm91cCBmbG93LCBHQVAtMjAxKS5cbmxldCBfY3VycmVudEdyb3VwID0gMDtcbmNvbnN0IEdST1VQX1NJWkUgPSAzO1xuXG4vLyBEZWJvdW5jZSB0aW1lciBmb3IgcGVyc2lzdGluZyBhbnN3ZXJzIHdoaWxlIHRoZSB1c2VyIHR5cGVzLlxubGV0IF9wZXJzaXN0RGVib3VuY2VUaW1lciA9IG51bGw7XG5cbmZ1bmN0aW9uIG9uUUlucHV0Q2hhbmdlKGlkeCkge1xuICB1cGRhdGVRUHJvZ3Jlc3MoKTtcbiAgY29uc3QgcSA9ICh3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zIHx8IFtdKVtpZHhdO1xuICBpZiAoIXEpIHJldHVybjtcbiAgY29uc3QgdGEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcS1pbnB1dC0ke2lkeH1gKTtcbiAgaWYgKCF0YSkgcmV0dXJuO1xuICBpZiAoIXdpbmRvdy5xdWVzdGlvbkFuc3dlcnMgfHwgdHlwZW9mIHdpbmRvdy5xdWVzdGlvbkFuc3dlcnMgIT09ICdvYmplY3QnKSB7XG4gICAgd2luZG93LnF1ZXN0aW9uQW5zd2VycyA9IHt9O1xuICB9XG4gIHdpbmRvdy5xdWVzdGlvbkFuc3dlcnNbcS50eXBlXSA9IHRhLnZhbHVlO1xuXG4gIC8vIERlYm91bmNlLXBlcnNpc3Qgc28gYW5zd2VycyBzdXJ2aXZlIHRhYiBuYXZpZ2F0aW9uIGFuZCBzdGF0dXMgcG9sbGluZy5cbiAgY2xlYXJUaW1lb3V0KF9wZXJzaXN0RGVib3VuY2VUaW1lcik7XG4gIF9wZXJzaXN0RGVib3VuY2VUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gcGVyc2lzdFBvc3RBbmFseXNpc1N0YXRlKCksIDUwMCk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVFQcm9ncmVzcygpIHtcbiAgY29uc3QgcXMgPSB3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zIHx8IFtdO1xuICBjb25zdCBzdG9yZWRBbnN3ZXJzID0gd2luZG93LnF1ZXN0aW9uQW5zd2VycyB8fCB7fTtcbiAgY29uc3QgZ3JvdXBTdGFydCA9IF9jdXJyZW50R3JvdXAgKiBHUk9VUF9TSVpFO1xuICBjb25zdCBncm91cEVuZCAgID0gTWF0aC5taW4oZ3JvdXBTdGFydCArIEdST1VQX1NJWkUsIHFzLmxlbmd0aCk7XG5cbiAgLy8gQ291bnQgYW5zd2VyczogdXNlIERPTSB2YWx1ZXMgZm9yIHRoZSBjdXJyZW50IGdyb3VwIChsaXZlKSwgc3RvcmVkIGZvciBvdGhlcnMuXG4gIGNvbnN0IGFuc3dlcmVkID0gcXMuZmlsdGVyKChxLCBpZHgpID0+IHtcbiAgICBpZiAoaWR4ID49IGdyb3VwU3RhcnQgJiYgaWR4IDwgZ3JvdXBFbmQpIHtcbiAgICAgIGNvbnN0IHRhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHEtaW5wdXQtJHtpZHh9YCk7XG4gICAgICByZXR1cm4gdGEgPyB0YS52YWx1ZS50cmltKCkubGVuZ3RoID4gMCA6ICEhKHN0b3JlZEFuc3dlcnNbcS50eXBlXSB8fCAnJykudHJpbSgpO1xuICAgIH1cbiAgICByZXR1cm4gISEoc3RvcmVkQW5zd2Vyc1txLnR5cGVdIHx8ICcnKS50cmltKCk7XG4gIH0pLmxlbmd0aDtcblxuICBjb25zdCBncm91cEFuc3dlcmVkID0gcXMuc2xpY2UoZ3JvdXBTdGFydCwgZ3JvdXBFbmQpLmZpbHRlcigocSwgbGkpID0+IHtcbiAgICBjb25zdCB0YSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBxLWlucHV0LSR7Z3JvdXBTdGFydCArIGxpfWApO1xuICAgIHJldHVybiB0YSA/IHRhLnZhbHVlLnRyaW0oKS5sZW5ndGggPiAwIDogISEoc3RvcmVkQW5zd2Vyc1txLnR5cGVdIHx8ICcnKS50cmltKCk7XG4gIH0pLmxlbmd0aDtcblxuICBjb25zdCBudW1Hcm91cHMgID0gTWF0aC5jZWlsKHFzLmxlbmd0aCAvIEdST1VQX1NJWkUpO1xuICBjb25zdCBncm91cExhYmVsID0gbnVtR3JvdXBzID4gMVxuICAgID8gYEdyb3VwICR7X2N1cnJlbnRHcm91cCArIDF9IG9mICR7bnVtR3JvdXBzfWBcbiAgICA6IGAke3FzLmxlbmd0aH0gcXVlc3Rpb24ke3FzLmxlbmd0aCA+IDEgPyAncycgOiAnJ31gO1xuXG4gIGNvbnN0IHByb2dyZXNzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncS1wcm9ncmVzcycpO1xuICBpZiAocHJvZ3Jlc3NFbCkge1xuICAgIHByb2dyZXNzRWwudGV4dENvbnRlbnQgPSBgJHtncm91cExhYmVsfSBcdTIwMTQgJHthbnN3ZXJlZH0gb2YgJHtxcy5sZW5ndGh9IGFuc3dlcmVkYDtcbiAgfVxuICBjb25zdCBzdWJtaXRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncS1zdWJtaXQtYnRuJyk7XG4gIGlmIChzdWJtaXRCdG4pIHtcbiAgICBjb25zdCBjdXJyZW50R3JvdXBTaXplID0gZ3JvdXBFbmQgLSBncm91cFN0YXJ0O1xuICAgIHN1Ym1pdEJ0bi5kaXNhYmxlZCA9IGdyb3VwQW5zd2VyZWQgPCBjdXJyZW50R3JvdXBTaXplO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN1Ym1pdEFsbEFuc3dlcnMoKSB7XG4gIC8qIGR1Y2tmbG93OlxuICAgKiAgIGlkOiBxdWVzdGlvbnNfdWlfc3VibWl0X2xpdmVcbiAgICogICBraW5kOiB1aVxuICAgKiAgIHRpbWVzdGFtcDogJzIwMjYtMDMtMjVUMjE6Mzk6NDhaJ1xuICAgKiAgIHN0YXR1czogbGl2ZVxuICAgKiAgIGhhbmRsZXM6XG4gICAqICAgLSB1aTpxdWVzdGlvbnMuc3VibWl0LWFsbFxuICAgKiAgIGNhbGxzOlxuICAgKiAgIC0gUE9TVCAvYXBpL3Bvc3QtYW5hbHlzaXMtcmVzcG9uc2VzXG4gICAqICAgLSBQT1NUIC9hcGkvYWN0aW9uXG4gICAqICAgcmVhZHM6XG4gICAqICAgLSB3aW5kb3c6cG9zdEFuYWx5c2lzUXVlc3Rpb25zXG4gICAqICAgLSBkb206cS1pbnB1dC0qLnZhbHVlXG4gICAqICAgd3JpdGVzOlxuICAgKiAgIC0gd2luZG93OnF1ZXN0aW9uQW5zd2Vyc1xuICAgKiAgIC0gcmVxdWVzdDpQT1NUIC9hcGkvcG9zdC1hbmFseXNpcy1yZXNwb25zZXMuYW5zd2Vyc1xuICAgKiAgIG5vdGVzOiBDb2xsZWN0cyB0aGUgY2xhcmlmeWluZy1xdWVzdGlvbiBhbnN3ZXJzIGZyb20gdGhlIFVJLCBwZXJzaXN0cyB0aGVtIHRvIHNlc3Npb24gc3RhdGUsIGFuZCB0aGVuIGFkdmFuY2VzIGludG8gY3VzdG9taXphdGlvbiByZWNvbW1lbmRhdGlvbiBnZW5lcmF0aW9uLlxuICAgKi9cbiAgY29uc3QgcXMgPSB3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zIHx8IFtdO1xuICBxcy5mb3JFYWNoKChxLCBpZHgpID0+IHtcbiAgICBjb25zdCB0YSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBxLWlucHV0LSR7aWR4fWApO1xuICAgIGlmICh0YSAmJiB0YS52YWx1ZS50cmltKCkpIHtcbiAgICAgIHdpbmRvdy5xdWVzdGlvbkFuc3dlcnNbcS50eXBlXSA9IHRhLnZhbHVlLnRyaW0oKTtcbiAgICB9XG4gIH0pO1xuICBhd2FpdCBwZXJzaXN0UG9zdEFuYWx5c2lzU3RhdGUoKTtcblxuICBjb25zdCBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncS1zdWJtaXQtYnRuJyk7XG4gIGlmIChidG4pIHtcbiAgICBidG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgIGJ0bi5pbm5lckhUTUwgPSAnPHNwYW4gY2xhc3M9XCJzcGlubmVyXCIgc3R5bGU9XCJkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDoxNHB4O2hlaWdodDoxNHB4O2JvcmRlcjoycHggc29saWQgI2ZmZjtib3JkZXItdG9wLWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlci1yYWRpdXM6NTAlO2FuaW1hdGlvbjpzcGluIDAuN3MgbGluZWFyIGluZmluaXRlO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTttYXJnaW4tcmlnaHQ6NnB4O1wiPjwvc3Bhbj5Qcm9jZXNzaW5nXHUyMDI2JztcbiAgfVxuXG4gIHRyeSB7XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgYFx1MjcxMyBUaGFuayB5b3UhICR7cXMubGVuZ3RofSBhbnN3ZXIke3FzLmxlbmd0aCA+IDEgPyAncycgOiAnJ30gc2F2ZWQuIEdlbmVyYXRpbmcgY3VzdG9taXphdGlvbiByZWNvbW1lbmRhdGlvbnNcdTIwMjZgKTtcbiAgICBhd2FpdCBzZW5kQWN0aW9uKCdyZWNvbW1lbmRfY3VzdG9taXphdGlvbnMnKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoYnRuKSB7XG4gICAgICBidG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIGJ0bi5pbm5lckhUTUwgPSAnU3VibWl0IEFuc3dlcnMnO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzaG93RHJhZnRFcnJvcihpZHgsIG1lc3NhZ2UpIHtcbiAgY29uc3Qgcm93ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgI3EtaXRlbS0ke2lkeH0gLnEtYW5zd2VyLXJvd2ApO1xuICBpZiAoIXJvdykgcmV0dXJuO1xuICBsZXQgZXJyRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcS1kcmFmdC1lcnItJHtpZHh9YCk7XG4gIGlmICghbWVzc2FnZSkge1xuICAgIGlmIChlcnJFbCkgZXJyRWwucmVtb3ZlKCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICghZXJyRWwpIHtcbiAgICBlcnJFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGVyckVsLmlkID0gYHEtZHJhZnQtZXJyLSR7aWR4fWA7XG4gICAgZXJyRWwuY2xhc3NOYW1lID0gJ3EtZHJhZnQtZXJyb3InO1xuICAgIHJvdy5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyZW5kJywgZXJyRWwpO1xuICB9XG4gIGVyckVsLnRleHRDb250ZW50ID0gYFx1MjZBMCAke21lc3NhZ2V9YDtcbn1cblxuLy8gTGVnYWN5IGNvbXBhdGliaWxpdHkgc2hpbVxuZnVuY3Rpb24gc2hvd05leHRRdWVzdGlvbigpIHsgcmVuZGVyUXVlc3Rpb25zUGFuZWwoKTsgfVxuXG5mdW5jdGlvbiBoYW5kbGVRdWVzdGlvblJlc3BvbnNlKG1lc3NhZ2UpIHtcbiAgaWYgKCF3aW5kb3cucG9zdEFuYWx5c2lzUXVlc3Rpb25zIHx8IHdpbmRvdy5wb3N0QW5hbHlzaXNRdWVzdGlvbnMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gIGlmICghd2luZG93LndhaXRpbmdGb3JRdWVzdGlvblJlc3BvbnNlKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGlkeCA9IHdpbmRvdy5jdXJyZW50UXVlc3Rpb25JbmRleCB8fCAwO1xuICBjb25zdCBxID0gd2luZG93LnBvc3RBbmFseXNpc1F1ZXN0aW9uc1tpZHhdO1xuICBpZiAoIXEpIHJldHVybiBmYWxzZTtcbiAgd2luZG93LnF1ZXN0aW9uQW5zd2Vyc1txLnR5cGVdID0gbWVzc2FnZTtcbiAgd2luZG93LndhaXRpbmdGb3JRdWVzdGlvblJlc3BvbnNlID0gZmFsc2U7XG4gIHdpbmRvdy5jdXJyZW50UXVlc3Rpb25JbmRleCA9IGlkeCArIDE7XG4gIHBlcnNpc3RQb3N0QW5hbHlzaXNTdGF0ZSgpO1xuICByZW5kZXJRdWVzdGlvbnNQYW5lbCgpO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gZmluaXNoUG9zdEFuYWx5c2lzUXVlc3Rpb25zKCkge1xuICB3aW5kb3cud2FpdGluZ0ZvclF1ZXN0aW9uUmVzcG9uc2UgPSBmYWxzZTtcbiAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ1RoYW5rIHlvdSBmb3IgdGhvc2UgaW5zaWdodHMhIENsaWNrIFwiUmVjb21tZW5kIEN1c3RvbWl6YXRpb25zXCIgd2hlbiB5b3VcXCdyZSByZWFkeS4nKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEVTIG1vZHVsZSBleHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuZXhwb3J0IHtcbiAgcGVyc2lzdFBvc3RBbmFseXNpc1N0YXRlLFxuICByZW5kZXJRdWVzdGlvbk1hcmtkb3duLFxuICBmZXRjaFBvc3RBbmFseXNpc1F1ZXN0aW9uc0Zyb21BcGksXG4gIGFza1Bvc3RBbmFseXNpc1F1ZXN0aW9ucyxcbiAgcG9wdWxhdGVRdWVzdGlvbnNUYWIsXG4gIHJlbmRlclF1ZXN0aW9uc1BhbmVsLFxuICBkcmFmdFF1ZXN0aW9uUmVzcG9uc2UsXG4gIHNlbGVjdFFDaGlwLFxuICBvblFJbnB1dENoYW5nZSxcbiAgdXBkYXRlUVByb2dyZXNzLFxuICBzdWJtaXRBbGxBbnN3ZXJzLFxuICBzaG93RHJhZnRFcnJvcixcbiAgc2hvd05leHRRdWVzdGlvbixcbiAgaGFuZGxlUXVlc3Rpb25SZXNwb25zZSxcbiAgZmluaXNoUG9zdEFuYWx5c2lzUXVlc3Rpb25zLFxuICBhZHZhbmNlUUdyb3VwLFxuICBqdW1wVG9RR3JvdXAsXG59O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuZnVuY3Rpb24gZXllU2xhc2hJY29uKCkge1xuICByZXR1cm4gYFxuICAgIDxzdmcgY2xhc3M9XCJpY29uLWdseXBoXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIGZvY3VzYWJsZT1cImZhbHNlXCI+XG4gICAgICA8cGF0aCBkPVwiTTMgM2wxOCAxOFwiPjwvcGF0aD5cbiAgICAgIDxwYXRoIGQ9XCJNMTAuNTggMTAuNThhMiAyIDAgMCAwIDIuODMgMi44M1wiPjwvcGF0aD5cbiAgICAgIDxwYXRoIGQ9XCJNOS44OCA1LjA5QTEwLjk0IDEwLjk0IDAgMCAxIDEyIDVjNSAwIDkuMjcgMy4xMSAxMSA3LTEuMDQgMi4zNS0yLjc4IDQuMzItNC45NiA1LjQ1XCI+PC9wYXRoPlxuICAgICAgPHBhdGggZD1cIk02LjYxIDYuNjFDNC42MiA3LjkgMy4wMyA5Ljc5IDIgMTJjMS43MyAzLjg5IDYgNyAxMCA3IDEuNTIgMCAyLjk4LS4zNiA0LjI5LTFcIj48L3BhdGg+XG4gICAgPC9zdmc+XG4gIGA7XG59XG5cbmV4cG9ydCB7IGV5ZVNsYXNoSWNvbiB9O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvZXhwZXJpZW5jZS1yZXZpZXcuanNcbiAqIEV4cGVyaWVuY2UtcmV2aWV3IHRhYmxlOiBmZXRjaCwgcmVuZGVyLCByb3ctcmVvcmRlciwgYW5kIHN1Ym1pdCBkZWNpc2lvbnMuXG4gKlxuICogRGVwZW5kZW5jaWVzIChyZXNvbHZlZCB0aHJvdWdoIGdsb2JhbFRoaXMgYXQgcnVudGltZSk6XG4gKiAgIHVzZXJTZWxlY3Rpb25zLCBwZW5kaW5nUmVjb21tZW5kYXRpb25zLCBfc2F2ZWREZWNpc2lvbnMsIF9leHBlcmllbmNlc09yZGVyZWQsXG4gKiAgIHBhcnNlU3RhdHVzUmVzcG9uc2UsIGdldEV4cGVyaWVuY2VSZWNvbW1lbmRhdGlvbiwgZ2V0Q29uZmlkZW5jZUxldmVsLFxuICogICBnZXRFeHBlcmllbmNlUmVhc29uaW5nLCBlc2NhcGVIdG1sLCBzaG93QnVsbGV0UmVvcmRlcixcbiAqICAgaGFuZGxlQWN0aW9uQ2xpY2ssIGJ1bGtBY3Rpb24sIF91cGRhdGVQYWdlRXN0aW1hdGUsXG4gKiAgIHVwZGF0ZUluY2x1c2lvbkNvdW50cywgc3dpdGNoVGFiLFxuICogICBzaG93QWxlcnRNb2RhbCwgc2hvd1RvYXN0LCBzY2hlZHVsZUF0c1JlZnJlc2gsXG4gKiAgICQsICQuZm4uRGF0YVRhYmxlIChqUXVlcnkgKyBEYXRhVGFibGVzKVxuICovXG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmNvbnN0IGxvZyA9IGdldExvZ2dlcignZXhwZXJpZW5jZS1yZXZpZXcnKTtcblxuaW1wb3J0IHsgc3RhdGVNYW5hZ2VyIH0gZnJvbSAnLi9zdGF0ZS1tYW5hZ2VyLmpzJztcbmltcG9ydCB7IGV5ZVNsYXNoSWNvbiB9IGZyb20gJy4vcmV2aWV3LWljb25zLmpzJztcblxuZnVuY3Rpb24gX2ZpbmRFeHBlcmllbmNlUmVjb21tZW5kYXRpb25SZWNvcmQoZXhwSWQsIGRhdGEpIHtcbiAgaWYgKCFkYXRhIHx8ICFBcnJheS5pc0FycmF5KGRhdGEuZXhwZXJpZW5jZV9yZWNvbW1lbmRhdGlvbnMpKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIGRhdGEuZXhwZXJpZW5jZV9yZWNvbW1lbmRhdGlvbnMuZmluZCgocmVjKSA9PiBTdHJpbmcocmVjPy5pZCB8fCByZWM/LmV4cGVyaWVuY2VfaWQgfHwgJycpID09PSBTdHJpbmcoZXhwSWQpKSB8fCBudWxsO1xufVxuXG5mdW5jdGlvbiBfZm9ybWF0U3VnZ2VzdGVkT3JkZXJTdW1tYXJ5KG9yZGVyKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShvcmRlcikgfHwgb3JkZXIubGVuZ3RoIDwgMikgcmV0dXJuICcnO1xuICByZXR1cm4gb3JkZXIubWFwKChpZHgpID0+IFN0cmluZyhOdW1iZXIoaWR4KSArIDEpKS5qb2luKCcgLT4gJyk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFeHBlcmllbmNlIGRldGFpbHMgZmV0Y2ggXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIGdldEV4cGVyaWVuY2VEZXRhaWxzKGV4cElkKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvZXhwZXJpZW5jZS1kZXRhaWxzJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgZXhwZXJpZW5jZV9pZDogZXhwSWQgfSlcbiAgICB9KTtcblxuICAgIGlmIChyZXMub2spIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgcmV0dXJuIGRhdGEuZXhwZXJpZW5jZSB8fCBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2cud2FybignQ291bGQgbm90IGZldGNoIGV4cGVyaWVuY2UgZGV0YWlscyBmb3InLCBleHBJZCk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nLndhcm4oJ0Vycm9yIGZldGNoaW5nIGV4cGVyaWVuY2UgZGV0YWlsczonLCBlcnJvcik7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIFJlcnVuIHNuYXBzaG90IChjaGFuZ2UgYmFkZ2UgZm9yIGV4cGVyaWVuY2VzKSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmZ1bmN0aW9uIF9leHBTbmFwc2hvdEtleSgpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzaWQgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpLmdldCgnc2Vzc2lvbicpO1xuICAgIHJldHVybiBzaWQgPyBgZXhwX3NuYXBfJHtzaWR9YCA6IG51bGw7XG4gIH0gY2F0Y2ggKF8pIHsgcmV0dXJuIG51bGw7IH1cbn1cbmZ1bmN0aW9uIF9zYXZlRXhwU25hcHNob3QocmVjb21tZW5kZWRJZHMpIHtcbiAgY29uc3Qga2V5ID0gX2V4cFNuYXBzaG90S2V5KCk7XG4gIGlmICgha2V5KSByZXR1cm47XG4gIHRyeSB7IGxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgSlNPTi5zdHJpbmdpZnkoWy4uLnJlY29tbWVuZGVkSWRzXSkpOyB9IGNhdGNoIChfKSB7fVxufVxuZnVuY3Rpb24gX2dldEV4cFNuYXBzaG90KCkge1xuICBjb25zdCBrZXkgPSBfZXhwU25hcHNob3RLZXkoKTtcbiAgaWYgKCFrZXkpIHJldHVybiBudWxsO1xuICB0cnkge1xuICAgIGNvbnN0IHJhdyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7XG4gICAgcmV0dXJuIHJhdyA/IG5ldyBTZXQoSlNPTi5wYXJzZShyYXcpKSA6IG51bGw7XG4gIH0gY2F0Y2ggKF8pIHsgcmV0dXJuIG51bGw7IH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIEJ1aWxkIHJldmlldyB0YWJsZSAoZmV0Y2ggKyBpbml0aWFsaXNlKSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gYnVpbGRFeHBlcmllbmNlUmV2aWV3VGFibGUoKSB7XG4gIGNvbnN0IGRhdGEgPSB3aW5kb3cucGVuZGluZ1JlY29tbWVuZGF0aW9ucztcbiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cGVyaWVuY2UtdGFibGUtY29udGFpbmVyJyk7XG4gIGlmICghY29udGFpbmVyKSByZXR1cm47XG5cbiAgY29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwiZW1wdHktc3RhdGVcIj48ZGl2IGNsYXNzPVwibG9hZGluZy1zcGlubmVyXCI+PC9kaXY+PHAgc3R5bGU9XCJtYXJnaW4tdG9wOjEycHg7Y29sb3I6IzY0NzQ4YjtcIj5Mb2FkaW5nIGV4cGVyaWVuY2UgcmVjb21tZW5kYXRpb25zXHUyMDI2PC9wPjwvZGl2Pic7XG5cbiAgbGV0IGFsbEV4cGVyaWVuY2VJZHMgPSBbXTtcbiAgbGV0IHNhdmVkUm93T3JkZXIgPSBbXTtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0dXNSZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9zdGF0dXMnKTtcbiAgICBjb25zdCBzdGF0dXNEYXRhID0gcGFyc2VTdGF0dXNSZXNwb25zZShhd2FpdCBzdGF0dXNSZXMuanNvbigpKTtcbiAgICBhbGxFeHBlcmllbmNlSWRzID0gc3RhdHVzRGF0YS5hbGxfZXhwZXJpZW5jZV9pZHMgfHwgZGF0YS5yZWNvbW1lbmRlZF9leHBlcmllbmNlcyB8fCBbXTtcbiAgICBzYXZlZFJvd09yZGVyICAgID0gQXJyYXkuaXNBcnJheShzdGF0dXNEYXRhLmV4cGVyaWVuY2Vfcm93X29yZGVyKSA/IHN0YXR1c0RhdGEuZXhwZXJpZW5jZV9yb3dfb3JkZXIgOiBbXTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBhbGxFeHBlcmllbmNlSWRzID0gZGF0YS5yZWNvbW1lbmRlZF9leHBlcmllbmNlcyB8fCBbXTtcbiAgfVxuXG4gIGNvbnN0IHJlY29tbWVuZGVkU2V0ID0gbmV3IFNldChkYXRhLnJlY29tbWVuZGVkX2V4cGVyaWVuY2VzIHx8IFtdKTtcblxuICAvLyBGZXRjaCBhbGwgZXhwZXJpZW5jZSBkZXRhaWxzXG4gIGNvbnN0IGV4cGVyaWVuY2VzV2l0aERldGFpbHMgPSBbXTtcbiAgZm9yIChjb25zdCBleHBJZCBvZiBhbGxFeHBlcmllbmNlSWRzKSB7XG4gICAgY29uc3QgZGV0YWlscyA9IGF3YWl0IGdldEV4cGVyaWVuY2VEZXRhaWxzKGV4cElkKTtcbiAgICBleHBlcmllbmNlc1dpdGhEZXRhaWxzLnB1c2goeyBpZDogZXhwSWQsIGRldGFpbHMgfSk7XG4gIH1cblxuICAvLyBPbiBmaXJzdCBsb2FkOiByZXN0b3JlIHVzZXIncyBzYXZlZCBvcmRlciBpZiBwcmVzZW50OyBvdGhlcndpc2UgZGVmYXVsdC1zb3J0XG4gIC8vIHdpdGggcHJlc2VudC9jdXJyZW50IHBvc2l0aW9ucyBmaXJzdCwgdGhlbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgYnkgZW5kIGRhdGUuXG4gIC8vIE9uIHJlLXJlbmRlciwgcHJlc2VydmUgdGhlIGluLW1lbW9yeSB1c2VyIG9yZGVyLlxuICBpZiAoIXdpbmRvdy5fZXhwZXJpZW5jZXNPcmRlcmVkKSB7XG4gICAgaWYgKHNhdmVkUm93T3JkZXIubGVuZ3RoID4gMCkge1xuICAgICAgLy8gUmVzdG9yZSB1c2VyJ3MgZXhwbGljaXRseSBzYXZlZCBvcmRlcmluZyBmcm9tIHRoZSBzZXNzaW9uXG4gICAgICBjb25zdCBvcmRlck1hcCA9IE9iamVjdC5mcm9tRW50cmllcyhzYXZlZFJvd09yZGVyLm1hcCgoaWQsIGkpID0+IFtpZCwgaV0pKTtcbiAgICAgIGV4cGVyaWVuY2VzV2l0aERldGFpbHMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICBjb25zdCBhaSA9IG9yZGVyTWFwW2EuaWRdID8/IHNhdmVkUm93T3JkZXIubGVuZ3RoO1xuICAgICAgICBjb25zdCBiaSA9IG9yZGVyTWFwW2IuaWRdID8/IHNhdmVkUm93T3JkZXIubGVuZ3RoO1xuICAgICAgICByZXR1cm4gYWkgLSBiaTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEZWZhdWx0OiBzb3J0IGJ5IExMTSByZWNvbW1lbmRhdGlvbiBzdHJlbmd0aCBmaXJzdCwgdGhlbiByZXZlcnNlLWNocm9ub2xvZ2ljYWxcbiAgICAgIGNvbnN0IF9BQ1RJT05fUkFOSyA9IHsgZW1waGFzaXplOiAwLCBpbmNsdWRlOiAxLCAnZGUtZW1waGFzaXplJzogMiwgZXhjbHVkZTogMyB9O1xuICAgICAgY29uc3QgX3BhcnNlRW5kS2V5ID0gKGV4cCkgPT4ge1xuICAgICAgICBjb25zdCByYXcgPSAoZXhwLmRldGFpbHM/LmVuZF9kYXRlIHx8IGV4cC5kZXRhaWxzPy5lbmQgfHwgJycpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoIXJhdyB8fCBbJ3ByZXNlbnQnLCAnY3VycmVudCcsICdub3cnLCAnb25nb2luZyddLmluY2x1ZGVzKHJhdykpIHJldHVybiAnOTk5OS0xMic7XG4gICAgICAgIGlmICgvXlxcZHs0fSQvLnRlc3QocmF3KSkgcmV0dXJuIHJhdyArICctMTInO1xuICAgICAgICByZXR1cm4gcmF3O1xuICAgICAgfTtcbiAgICAgIGNvbnN0IF9nZXRBY3Rpb25SYW5rID0gKGV4cCkgPT4ge1xuICAgICAgICBjb25zdCByZWMgPSBnZXRFeHBlcmllbmNlUmVjb21tZW5kYXRpb24oZXhwLmlkLCBkYXRhKTtcbiAgICAgICAgaWYgKCFyZWMpIHJldHVybiAxOyAvLyBkZWZhdWx0IHRvICdpbmNsdWRlJyByYW5rIHdoZW4gbm8gcmVjb21tZW5kYXRpb25cbiAgICAgICAgaWYgKHJlYyA9PT0gJ0VtcGhhc2l6ZScpICAgIHJldHVybiAwO1xuICAgICAgICBpZiAocmVjID09PSAnSW5jbHVkZScpICAgICAgcmV0dXJuIDE7XG4gICAgICAgIGlmIChyZWMgPT09ICdEZS1lbXBoYXNpemUnKSByZXR1cm4gMjtcbiAgICAgICAgaWYgKHJlYyA9PT0gJ09taXQnKSAgICAgICAgIHJldHVybiAzO1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH07XG4gICAgICBleHBlcmllbmNlc1dpdGhEZXRhaWxzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgY29uc3QgcmFua0RpZmYgPSBfZ2V0QWN0aW9uUmFuayhhKSAtIF9nZXRBY3Rpb25SYW5rKGIpO1xuICAgICAgICBpZiAocmFua0RpZmYgIT09IDApIHJldHVybiByYW5rRGlmZjtcbiAgICAgICAgcmV0dXJuIF9wYXJzZUVuZEtleShiKS5sb2NhbGVDb21wYXJlKF9wYXJzZUVuZEtleShhKSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgd2luZG93Ll9leHBlcmllbmNlc09yZGVyZWQgPSBleHBlcmllbmNlc1dpdGhEZXRhaWxzO1xuICB9IGVsc2Uge1xuICAgIC8vIE1lcmdlIGFueSBuZXdseSBkaXNjb3ZlcmVkIGV4cGVyaWVuY2VzIGludG8gdGhlIGNhY2hlZCBvcmRlclxuICAgIGNvbnN0IGtub3duSWRzID0gbmV3IFNldCh3aW5kb3cuX2V4cGVyaWVuY2VzT3JkZXJlZC5tYXAoZSA9PiBlLmlkKSk7XG4gICAgZm9yIChjb25zdCBleHAgb2YgZXhwZXJpZW5jZXNXaXRoRGV0YWlscykge1xuICAgICAgaWYgKCFrbm93bklkcy5oYXMoZXhwLmlkKSkgd2luZG93Ll9leHBlcmllbmNlc09yZGVyZWQucHVzaChleHApO1xuICAgIH1cbiAgfVxuXG4gIC8vIENvbXB1dGUgd2hpY2ggcmVjb21tZW5kYXRpb25zIGFyZSBuZXcgc2luY2UgbGFzdCByZW5kZXIgKHJlcnVuIGNoYW5nZSBiYWRnZXMpXG4gIGNvbnN0IHByZXZFeHBTbmFwID0gX2dldEV4cFNuYXBzaG90KCk7XG4gIGNvbnN0IG5ld1JlY29tbWVuZGVkRXhwcyA9IHByZXZFeHBTbmFwXG4gICAgPyBuZXcgU2V0KFsuLi5yZWNvbW1lbmRlZFNldF0uZmlsdGVyKGlkID0+ICFwcmV2RXhwU25hcC5oYXMoaWQpKSlcbiAgICA6IG5ldyBTZXQoKTtcbiAgX3NhdmVFeHBTbmFwc2hvdChyZWNvbW1lbmRlZFNldCk7XG5cbiAgLy8gSW5pdGlhbGlzZSBzYXZlZCBkZWNpc2lvbnNcbiAgY29uc3Qgc2F2ZWRFeHBEZWNzID0gd2luZG93Ll9zYXZlZERlY2lzaW9ucz8uZXhwZXJpZW5jZV9kZWNpc2lvbnMgfHwge307XG4gIGZvciAoY29uc3QgeyBpZDogZXhwSWQgfSBvZiB3aW5kb3cuX2V4cGVyaWVuY2VzT3JkZXJlZCkge1xuICAgIGNvbnN0IHJlY29tbWVuZGF0aW9uID0gZ2V0RXhwZXJpZW5jZVJlY29tbWVuZGF0aW9uKGV4cElkLCBkYXRhKTtcbiAgICBjb25zdCBpc1JlY29tbWVuZGVkICA9IHJlY29tbWVuZGVkU2V0LmhhcyhleHBJZCk7XG4gICAgbGV0IGRlZmF1bHRBY3Rpb24gPSAnZXhjbHVkZSc7XG4gICAgaWYgICAgICAocmVjb21tZW5kYXRpb24gPT09ICdFbXBoYXNpemUnKSAgICBkZWZhdWx0QWN0aW9uID0gJ2VtcGhhc2l6ZSc7XG4gICAgZWxzZSBpZiAocmVjb21tZW5kYXRpb24gPT09ICdJbmNsdWRlJykgICAgICBkZWZhdWx0QWN0aW9uID0gJ2luY2x1ZGUnO1xuICAgIGVsc2UgaWYgKHJlY29tbWVuZGF0aW9uID09PSAnRGUtZW1waGFzaXplJykgZGVmYXVsdEFjdGlvbiA9ICdkZS1lbXBoYXNpemUnO1xuICAgIGVsc2UgaWYgKHJlY29tbWVuZGF0aW9uID09PSAnT21pdCcpICAgICAgICAgZGVmYXVsdEFjdGlvbiA9ICdleGNsdWRlJztcbiAgICBlbHNlIGlmIChpc1JlY29tbWVuZGVkKSAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRBY3Rpb24gPSAnaW5jbHVkZSc7XG4gICAgdXNlclNlbGVjdGlvbnMuZXhwZXJpZW5jZXNbZXhwSWRdID0gc2F2ZWRFeHBEZWNzW2V4cElkXSB8fCBkZWZhdWx0QWN0aW9uO1xuICB9XG5cbiAgX3JlbmRlckV4cGVyaWVuY2VUYWJsZShjb250YWluZXIsIHJlY29tbWVuZGVkU2V0LCBkYXRhLCBuZXdSZWNvbW1lbmRlZEV4cHMpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgUmVuZGVyIHRhYmxlIEhUTUwgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIF9yZW5kZXJFeHBlcmllbmNlVGFibGUoY29udGFpbmVyLCByZWNvbW1lbmRlZFNldCwgZGF0YSwgbmV3UmVjb21tZW5kZWRFeHBzID0gbmV3IFNldCgpKSB7XG4gIGlmICghY29udGFpbmVyKSBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwZXJpZW5jZS10YWJsZS1jb250YWluZXInKTtcbiAgaWYgKCFjb250YWluZXIpIHJldHVybjtcbiAgaWYgKCFyZWNvbW1lbmRlZFNldCkgcmVjb21tZW5kZWRTZXQgPSBuZXcgU2V0KCh3aW5kb3cucGVuZGluZ1JlY29tbWVuZGF0aW9ucz8ucmVjb21tZW5kZWRfZXhwZXJpZW5jZXMpIHx8IFtdKTtcbiAgaWYgKCFkYXRhKSBkYXRhID0gd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnM7XG5cbiAgLy8gRGVzdHJveSBhbnkgZXhpc3RpbmcgRGF0YVRhYmxlIGJlZm9yZSByZWJ1aWxkaW5nXG4gIGlmICgkLmZuLkRhdGFUYWJsZS5pc0RhdGFUYWJsZSgnI2V4cGVyaWVuY2UtcmV2aWV3LXRhYmxlJykpIHtcbiAgICAkKCcjZXhwZXJpZW5jZS1yZXZpZXctdGFibGUnKS5EYXRhVGFibGUoKS5kZXN0cm95KCk7XG4gIH1cblxuICBjb25zdCBleHBzID0gd2luZG93Ll9leHBlcmllbmNlc09yZGVyZWQgfHwgW107XG4gIGxldCB0YWJsZUhUTUwgPSBgXG4gICAgPHRhYmxlIGlkPVwiZXhwZXJpZW5jZS1yZXZpZXctdGFibGVcIiBjbGFzcz1cInJldmlldy10YWJsZVwiPlxuICAgICAgPHRoZWFkPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRoPkV4cGVyaWVuY2U8L3RoPlxuICAgICAgICAgIDx0aD5EYXRlczwvdGg+XG4gICAgICAgICAgPHRoPlJlY29tbWVuZGF0aW9uPC90aD5cbiAgICAgICAgICA8dGg+Q29uZmlkZW5jZTwvdGg+XG4gICAgICAgICAgPHRoPlJlYXNvbmluZzwvdGg+XG4gICAgICAgICAgPHRoPllvdXIgU2VsZWN0aW9uPC90aD5cbiAgICAgICAgPC90cj5cbiAgICAgIDwvdGhlYWQ+XG4gICAgICA8dGJvZHk+XG4gIGA7XG5cbiAgZXhwcy5mb3JFYWNoKCh7IGlkOiBleHBJZCwgZGV0YWlscyB9LCByb3dJZHgpID0+IHtcbiAgICBjb25zdCByZWNvbW1lbmRhdGlvbiAgICA9IGdldEV4cGVyaWVuY2VSZWNvbW1lbmRhdGlvbihleHBJZCwgZGF0YSk7XG4gICAgY29uc3QgY29uZmlkZW5jZSAgICAgICAgPSBnZXRDb25maWRlbmNlTGV2ZWwoZXhwSWQsIGRhdGEpO1xuICAgIGNvbnN0IHJlYXNvbmluZyAgICAgICAgID0gZ2V0RXhwZXJpZW5jZVJlYXNvbmluZyhleHBJZCwgZGF0YSk7XG4gICAgY29uc3QgcmVjUmVjb3JkICAgICAgICAgPSBfZmluZEV4cGVyaWVuY2VSZWNvbW1lbmRhdGlvblJlY29yZChleHBJZCwgZGF0YSk7XG4gICAgY29uc3QgYnVsbGV0T3JkZXIgICAgICAgPSByZWNSZWNvcmQgJiYgdHlwZW9mIHJlY1JlY29yZC5idWxsZXRfb3JkZXIgPT09ICdvYmplY3QnID8gcmVjUmVjb3JkLmJ1bGxldF9vcmRlciA6IG51bGw7XG4gICAgY29uc3QgYnVsbGV0T3JkZXJTdW1tYXJ5ID0gX2Zvcm1hdFN1Z2dlc3RlZE9yZGVyU3VtbWFyeShidWxsZXRPcmRlcj8ub3JkZXIpO1xuICAgIGNvbnN0IHRpdGxlICAgICAgICAgICAgID0gZGV0YWlscyA/IGRldGFpbHMudGl0bGUgICA6IGV4cElkO1xuICAgIGNvbnN0IGNvbXBhbnkgICAgICAgICAgID0gZGV0YWlscyA/IGRldGFpbHMuY29tcGFueSA6ICcnO1xuICAgIGNvbnN0IHN0YXJ0RGF0ZSAgICAgICAgID0gZGV0YWlscz8uc3RhcnRfZGF0ZSB8fCAnJztcbiAgICBjb25zdCBlbmREYXRlICAgICAgICAgICA9IGRldGFpbHM/LmVuZF9kYXRlICAgfHwgJ3ByZXNlbnQnO1xuICAgIGNvbnN0IGR1cmF0aW9uICAgICAgICAgID0gc3RhcnREYXRlID8gYCR7c3RhcnREYXRlfSAtICR7ZW5kRGF0ZX1gIDogKGRldGFpbHM/LmR1cmF0aW9uIHx8ICcnKTtcbiAgICBjb25zdCBkZWZhdWx0QWN0aW9uICAgICA9IHVzZXJTZWxlY3Rpb25zLmV4cGVyaWVuY2VzW2V4cElkXSB8fCAnaW5jbHVkZSc7XG4gICAgY29uc3QgcmVjb21tZW5kYXRpb25UZXh0ID0gcmVjb21tZW5kYXRpb24gfHwgJ0luY2x1ZGUnO1xuICAgIGNvbnN0IGNvbmZpZGVuY2VCYWRnZSAgID0gYDxzcGFuIGNsYXNzPVwiY29uZmlkZW5jZS1iYWRnZSBjb25maWRlbmNlLSR7Y29uZmlkZW5jZS5sZXZlbH1cIj4ke2NvbmZpZGVuY2UudGV4dH08L3NwYW4+YDtcbiAgICBjb25zdCByZWFzb25pbmdTZWdtZW50cyA9IFtyZWFzb25pbmcgfHwgJ1RoaXMgZXhwZXJpZW5jZSB3YXMgc2VsZWN0ZWQgYmFzZWQgb24gaXRzIHJlbGV2YW5jZSB0byB0aGUgcG9zaXRpb24gcmVxdWlyZW1lbnRzLiddO1xuICAgIGlmIChidWxsZXRPcmRlclN1bW1hcnkpIHJlYXNvbmluZ1NlZ21lbnRzLnB1c2goYFN1Z2dlc3RlZCBidWxsZXQgb3JkZXI6ICR7YnVsbGV0T3JkZXJTdW1tYXJ5fS5gKTtcbiAgICBpZiAoYnVsbGV0T3JkZXI/LnJlYXNvbmluZykgcmVhc29uaW5nU2VnbWVudHMucHVzaChTdHJpbmcoYnVsbGV0T3JkZXIucmVhc29uaW5nKSk7XG4gICAgaWYgKGJ1bGxldE9yZGVyPy5hdHNfaW1wYWN0KSByZWFzb25pbmdTZWdtZW50cy5wdXNoKGBBVFMgaW1wYWN0OiAke2J1bGxldE9yZGVyLmF0c19pbXBhY3R9YCk7XG4gICAgaWYgKGJ1bGxldE9yZGVyPy5wYWdlX2xlbmd0aF9pbXBhY3QpIHJlYXNvbmluZ1NlZ21lbnRzLnB1c2goYFBhZ2UgbGVuZ3RoIGltcGFjdDogJHtidWxsZXRPcmRlci5wYWdlX2xlbmd0aF9pbXBhY3R9YCk7XG4gICAgY29uc3QgcmVhc29uaW5nVGV4dCAgICAgPSByZWFzb25pbmdTZWdtZW50cy5qb2luKCcgJyk7XG4gICAgY29uc3QgaXNGaXJzdCAgICAgICAgICAgPSByb3dJZHggPT09IDA7XG4gICAgY29uc3QgaXNMYXN0ICAgICAgICAgICAgPSByb3dJZHggPT09IGV4cHMubGVuZ3RoIC0gMTtcbiAgICBjb25zdCB0aXRsZUVzYyAgICAgICAgICA9IGVzY2FwZUh0bWwodGl0bGUpO1xuICAgIGNvbnN0IHJlcnVuTmV3QmFkZ2UgPSBuZXdSZWNvbW1lbmRlZEV4cHMuaGFzKGV4cElkKVxuICAgICAgPyAnPHNwYW4gY2xhc3M9XCJydy1jaGFuZ2UtYmFkZ2UgcnctY2hhbmdlLW5ld1wiIGFyaWEtbGFiZWw9XCJOZXcgcmVjb21tZW5kYXRpb24gc2luY2UgcHJldmlvdXMgcnVuXCI+XHVEODNDXHVERDk1IE5ldzwvc3Bhbj4nXG4gICAgICA6ICcnO1xuXG4gICAgdGFibGVIVE1MICs9IGBcbiAgICAgIDx0ciBkYXRhLWV4cC1pZD1cIiR7ZXhwSWR9XCIgZGF0YS1zdGFydC1kYXRlPVwiJHtzdGFydERhdGV9XCI+XG4gICAgICAgIDx0ZD5cbiAgICAgICAgICA8c3Ryb25nPiR7dGl0bGVFc2N9PC9zdHJvbmc+JHtyZXJ1bk5ld0JhZGdlfTxicj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiM2YjcyODA7XCI+JHtlc2NhcGVIdG1sKGNvbXBhbnkpfTwvc3Bhbj5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwid2hpdGUtc3BhY2U6bm93cmFwO1wiPiR7ZXNjYXBlSHRtbChkdXJhdGlvbil9PC90ZD5cbiAgICAgICAgPHRkPjxzdHJvbmc+JHtlc2NhcGVIdG1sKHJlY29tbWVuZGF0aW9uVGV4dCl9PC9zdHJvbmc+PC90ZD5cbiAgICAgICAgPHRkPiR7Y29uZmlkZW5jZUJhZGdlfTwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cIm1heC13aWR0aDozMDBweDtcIj48c21hbGw+JHtlc2NhcGVIdG1sKHJlYXNvbmluZ1RleHQpfTwvc21hbGw+PC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwiYWN0aW9uLWJ0bnNcIiBzdHlsZT1cIndoaXRlLXNwYWNlOm5vd3JhcDtcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG4gJHtkZWZhdWx0QWN0aW9uID09PSAnZW1waGFzaXplJyAgICA/ICdhY3RpdmUnIDogJyd9XCIgZGF0YS1hY3Rpb249XCJlbXBoYXNpemVcIiAgICBhcmlhLWxhYmVsPVwiRW1waGFzaXplICR7dGl0bGVFc2N9XCIgICAgICAgYXJpYS1wcmVzc2VkPVwiJHtkZWZhdWx0QWN0aW9uID09PSAnZW1waGFzaXplJ31cIiAgICB0aXRsZT1cIkVtcGhhc2l6ZSBcdTIwMTQgZmVhdHVyZSBwcm9taW5lbnRseVwiIHN0eWxlPVwiY29sb3I6IzEwYjk4MTtcIj5cdTI3OTU8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG4gJHtkZWZhdWx0QWN0aW9uID09PSAnaW5jbHVkZScgICAgICA/ICdhY3RpdmUnIDogJyd9XCIgZGF0YS1hY3Rpb249XCJpbmNsdWRlXCIgICAgICBhcmlhLWxhYmVsPVwiSW5jbHVkZSAke3RpdGxlRXNjfVwiICAgICAgICAgYXJpYS1wcmVzc2VkPVwiJHtkZWZhdWx0QWN0aW9uID09PSAnaW5jbHVkZSd9XCIgICAgICB0aXRsZT1cIkluY2x1ZGUgXHUyMDE0IHN0YW5kYXJkIHRyZWF0bWVudFwiPlx1MjcxMzwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0biAke2RlZmF1bHRBY3Rpb24gPT09ICdkZS1lbXBoYXNpemUnID8gJ2FjdGl2ZScgOiAnJ31cIiBkYXRhLWFjdGlvbj1cImRlLWVtcGhhc2l6ZVwiIGFyaWEtbGFiZWw9XCJEZS1lbXBoYXNpemUgJHt0aXRsZUVzY31cIiAgICBhcmlhLXByZXNzZWQ9XCIke2RlZmF1bHRBY3Rpb24gPT09ICdkZS1lbXBoYXNpemUnfVwiIHRpdGxlPVwiRGUtZW1waGFzaXplIFx1MjAxNCBicmllZiBtZW50aW9uXCIgICAgc3R5bGU9XCJjb2xvcjojZjU5ZTBiO1wiPlx1Mjc5NjwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0biAke2RlZmF1bHRBY3Rpb24gPT09ICdleGNsdWRlJyAgICAgID8gJ2FjdGl2ZScgOiAnJ31cIiBkYXRhLWFjdGlvbj1cImV4Y2x1ZGVcIiAgICAgIGFyaWEtbGFiZWw9XCJFeGNsdWRlICR7dGl0bGVFc2N9XCIgICAgICAgICBhcmlhLXByZXNzZWQ9XCIke2RlZmF1bHRBY3Rpb24gPT09ICdleGNsdWRlJ31cIiAgICAgIHRpdGxlPVwiRXhjbHVkZSBcdTIwMTQgb21pdCBmcm9tIENWXCIgICAgICAgICAgc3R5bGU9XCJjb2xvcjojZWY0NDQ0O1wiPiR7ZXllU2xhc2hJY29uKCl9PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgZGF0YS1hY3Rpb249XCJyZW9yZGVyXCIgYXJpYS1sYWJlbD1cIlJlb3JkZXIgYnVsbGV0cyBmb3IgJHt0aXRsZUVzY31cIiB0aXRsZT1cIiR7YnVsbGV0T3JkZXJTdW1tYXJ5ID8gYFJlb3JkZXIgYnVsbGV0IHBvaW50cyAoQUkgc3VnZ2VzdGVkIG9yZGVyICR7YnVsbGV0T3JkZXJTdW1tYXJ5fSlgIDogJ1Jlb3JkZXIgYnVsbGV0IHBvaW50cyd9XCIgc3R5bGU9XCJjb2xvcjojNjM2NmYxO1wiPlx1MjE5NTwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIGRhdGEtYWN0aW9uPVwicm93LXVwXCIgICBhcmlhLWxhYmVsPVwiTW92ZSAke3RpdGxlRXNjfSBlYXJsaWVyIGluIENWXCIgdGl0bGU9XCJNb3ZlIHVwIGluIENWXCIgICAke2lzRmlyc3QgPyAnZGlzYWJsZWQnIDogJyd9Plx1MjE5MTwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIGRhdGEtYWN0aW9uPVwicm93LWRvd25cIiBhcmlhLWxhYmVsPVwiTW92ZSAke3RpdGxlRXNjfSBsYXRlciBpbiBDVlwiICAgdGl0bGU9XCJNb3ZlIGRvd24gaW4gQ1ZcIiAke2lzTGFzdCAgPyAnZGlzYWJsZWQnIDogJyd9Plx1MjE5MzwvYnV0dG9uPlxuICAgICAgICA8L3RkPlxuICAgICAgPC90cj5cbiAgICBgO1xuICB9KTtcblxuICB0YWJsZUhUTUwgKz0gJzwvdGJvZHk+PC90YWJsZT4nO1xuICBjb250YWluZXIuaW5uZXJIVE1MID0gdGFibGVIVE1MO1xuXG4gIC8vIERlbGVnYXRlZCBjbGljayBoYW5kbGVyXG4gIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcjZXhwZXJpZW5jZS1yZXZpZXctdGFibGUgdGJvZHknKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBlID0+IHtcbiAgICBjb25zdCBidG4gPSBlLnRhcmdldC5jbG9zZXN0KCcuaWNvbi1idG4nKTtcbiAgICBpZiAoIWJ0bikgcmV0dXJuO1xuICAgIGNvbnN0IHRyID0gYnRuLmNsb3Nlc3QoJ3RyW2RhdGEtZXhwLWlkXScpO1xuICAgIGlmICghdHIpIHJldHVybjtcbiAgICBjb25zdCBleHBJZCAgPSB0ci5kYXRhc2V0LmV4cElkO1xuICAgIGNvbnN0IGFjdGlvbiA9IGJ0bi5kYXRhc2V0LmFjdGlvbjtcbiAgICBpZiAoYWN0aW9uID09PSAncmVvcmRlcicpIHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBjb25zdCB0aXRsZUVsID0gdHIucXVlcnlTZWxlY3Rvcignc3Ryb25nJyk7XG4gICAgICBzaG93QnVsbGV0UmVvcmRlcihleHBJZCwgdGl0bGVFbCA/IHRpdGxlRWwudGV4dENvbnRlbnQgOiAnJyk7XG4gICAgfSBlbHNlIGlmIChhY3Rpb24gPT09ICdyb3ctdXAnKSB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgbW92ZUV4cGVyaWVuY2VSb3coZXhwSWQsIC0xKTtcbiAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PT0gJ3Jvdy1kb3duJykge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIG1vdmVFeHBlcmllbmNlUm93KGV4cElkLCArMSk7XG4gICAgfSBlbHNlIGlmIChhY3Rpb24pIHtcbiAgICAgIGhhbmRsZUFjdGlvbkNsaWNrKGV4cElkLCBhY3Rpb24sICdleHBlcmllbmNlJyk7XG4gICAgfVxuICB9KTtcblxuICAvLyBCdWxrIHRvb2xiYXJcbiAgY29uc3QgZXhwVG9vbGJhciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBleHBUb29sYmFyLmNsYXNzTmFtZSA9ICdidWxrLXRvb2xiYXInO1xuICBleHBUb29sYmFyLmlubmVySFRNTCA9IGBcbiAgICA8c3Bhbj5CdWxrOjwvc3Bhbj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnVsay1idG4gYnVsay1yZWNvbW1lbmRlZFwiIG9uY2xpY2s9XCJidWxrQWN0aW9uKCdyZWNvbW1lbmRlZCcsJ2V4cGVyaWVuY2UnKVwiIHRpdGxlPVwiU2V0IGFsbCB0byB0aGUgTExNIHJlY29tbWVuZGF0aW9uXCI+XHUyNzI4IEFjY2VwdCBBbGwgUmVjb21tZW5kZWQ8L2J1dHRvbj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnVsay1idG4gYnVsay1lbXBoYXNpemVcIiAgIG9uY2xpY2s9XCJidWxrQWN0aW9uKCdlbXBoYXNpemUnLCdleHBlcmllbmNlJylcIj5cdTI3OTUgRW1waGFzaXplIEFsbDwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJidWxrLWJ0biBidWxrLWluY2x1ZGVcIiAgICAgb25jbGljaz1cImJ1bGtBY3Rpb24oJ2luY2x1ZGUnLCdleHBlcmllbmNlJylcIj5cdTI3MTMgSW5jbHVkZSBBbGw8L2J1dHRvbj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnVsay1idG4gYnVsay1leGNsdWRlXCIgICAgIG9uY2xpY2s9XCJidWxrQWN0aW9uKCdleGNsdWRlJywnZXhwZXJpZW5jZScpXCI+JHtleWVTbGFzaEljb24oKX0gRXhjbHVkZSBBbGw8L2J1dHRvbj5cbiAgYDtcbiAgY29udGFpbmVyLmluc2VydEJlZm9yZShleHBUb29sYmFyLCBjb250YWluZXIuZmlyc3RDaGlsZCk7XG5cbiAgLy8gSW5pdGlhbGl6ZSBEYXRhVGFibGUgd2l0aCBubyBhdXRvLXNvcnQgKHJvd3Mgc3RheSBpbiB1c2VyLXNwZWNpZmllZCBvcmRlcilcbiAgJCgnI2V4cGVyaWVuY2UtcmV2aWV3LXRhYmxlJykuRGF0YVRhYmxlKHtcbiAgICBwYWdpbmc6IGZhbHNlLFxuICAgIG9yZGVyOiBbXSxcbiAgICBsYW5ndWFnZTogeyBzZWFyY2g6ICdGaWx0ZXIgZXhwZXJpZW5jZXM6JyB9XG4gIH0pO1xuICBfdXBkYXRlUGFnZUVzdGltYXRlKCk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBSb3cgcmVvcmRlciBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gbW92ZUV4cGVyaWVuY2VSb3coZXhwSWQsIGRpcmVjdGlvbikge1xuICBjb25zdCBhcnIgPSB3aW5kb3cuX2V4cGVyaWVuY2VzT3JkZXJlZDtcbiAgaWYgKCFhcnIpIHJldHVybjtcbiAgY29uc3QgaWR4ID0gYXJyLmZpbmRJbmRleChlID0+IGUuaWQgPT09IGV4cElkKTtcbiAgaWYgKGlkeCA8IDApIHJldHVybjtcbiAgY29uc3QgbmV3SWR4ID0gaWR4ICsgZGlyZWN0aW9uO1xuICBpZiAobmV3SWR4IDwgMCB8fCBuZXdJZHggPj0gYXJyLmxlbmd0aCkgcmV0dXJuO1xuICBbYXJyW2lkeF0sIGFycltuZXdJZHhdXSA9IFthcnJbbmV3SWR4XSwgYXJyW2lkeF1dO1xuICB3aW5kb3cuX2V4cGVyaWVuY2VzT3JkZXJlZCA9IGFycjtcbiAgX3JlbmRlckV4cGVyaWVuY2VUYWJsZShudWxsLCBudWxsLCBudWxsKTtcbiAgLy8gUGVyc2lzdCB0aGUgbmV3IG9yZGVyIHRvIHRoZSBiYWNrZW5kIChmaXJlLWFuZC1mb3JnZXQ7IG5vIFVJIGJsb2NrKVxuICBmZXRjaCgnL2FwaS9yZW9yZGVyLXJvd3MnLCB7XG4gICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyB0eXBlOiAnZXhwZXJpZW5jZScsIG9yZGVyZWRfaWRzOiBhcnIubWFwKGUgPT4gZS5pZCkgfSlcbiAgfSkuY2F0Y2goKCkgPT4ge30pO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgTGVnYWN5IGludGVyYWN0aXZlLW1vZGUgcmVzcG9uc2UgaGFuZGxlciBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gaGFuZGxlRXhwZXJpZW5jZVJlc3BvbnNlKG1lc3NhZ2UpIHtcbiAgd2luZG93LndhaXRpbmdGb3JFeHBlcmllbmNlUmVzcG9uc2UgPSBmYWxzZTtcbiAgY29uc3QgcmVzcG9uc2UgPSBtZXNzYWdlLnRvTG93ZXJDYXNlKCk7XG5cbiAgaWYgKHJlc3BvbnNlLmluY2x1ZGVzKCd5ZXMnKSkge1xuICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsICdHcmVhdCEgSVxcJ2xsIGluY2x1ZGUgdGhpcyBleHBlcmllbmNlIHByb21pbmVudGx5LicpO1xuICB9IGVsc2UgaWYgKHJlc3BvbnNlLmluY2x1ZGVzKCdubycpKSB7XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ1VuZGVyc3Rvb2QuIElcXCdsbCBleGNsdWRlIHRoaXMgZXhwZXJpZW5jZSBmcm9tIHRoZSBmaW5hbCBDVi4nKTtcbiAgfSBlbHNlIGlmIChyZXNwb25zZS5pbmNsdWRlcygnbWF5YmUnKSkge1xuICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsICdJXFwnbGwgaW5jbHVkZSBpdCBidXQgd2l0aCBsZXNzIGVtcGhhc2lzLicpO1xuICB9IGVsc2Uge1xuICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsICdJXFwnbGwgbm90ZSB5b3VyIGZlZWRiYWNrIG9uIHRoaXMgZXhwZXJpZW5jZS4nKTtcbiAgfVxuXG4gIC8vIE1vdmUgdG8gbmV4dCBleHBlcmllbmNlIChjdXJyZW50SW5kZXggYWxyZWFkeSBpbmNyZW1lbnRlZCBpbiBzaG93TmV4dEV4cGVyaWVuY2UpXG4gIHNldFRpbWVvdXQoKCkgPT4gc2hvd05leHRFeHBlcmllbmNlKCksIDgwMCk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBTdWJtaXQgZGVjaXNpb25zIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBzdWJtaXRFeHBlcmllbmNlRGVjaXNpb25zKCkge1xuICAvKiBkdWNrZmxvdzpcbiAgICogICBpZDogZXhwZXJpZW5jZV91aV9zdWJtaXRfbGl2ZVxuICAgKiAgIGtpbmQ6IHVpXG4gICAqICAgdGltZXN0YW1wOiAnMjAyNi0wMy0yNVQyMTozOTo0OFonXG4gICAqICAgc3RhdHVzOiBsaXZlXG4gICAqICAgaGFuZGxlczpcbiAgICogICAtIHVpOmV4cGVyaWVuY2UtcmV2aWV3LnN1Ym1pdFxuICAgKiAgIGNhbGxzOlxuICAgKiAgIC0gUE9TVCAvYXBpL3Jldmlldy1kZWNpc2lvbnNcbiAgICogICAtIFBPU1QgL2FwaS9jdi9sYXlvdXQtZXN0aW1hdGVcbiAgICogICByZWFkczpcbiAgICogICAtIHdpbmRvdzp1c2VyU2VsZWN0aW9ucy5leHBlcmllbmNlc1xuICAgKiAgIHdyaXRlczpcbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL3Jldmlldy1kZWNpc2lvbnMuZGVjaXNpb25zXG4gICAqICAgLSB3aW5kb3c6X3NhdmVkRGVjaXNpb25zLmV4cGVyaWVuY2VfZGVjaXNpb25zXG4gICAqICAgbm90ZXM6IFBlcnNpc3RzIHBlci1leHBlcmllbmNlIGluY2x1c2lvbiBkZWNpc2lvbnMgYW5kIHRyaWdnZXJzIGRvd25zdHJlYW0gQVRTL2xheW91dCByZWZyZXNoZXMgdGhhdCBkZXBlbmQgb24gdGhlIHNhbWUgcmV2aWV3IGNob2ljZXMuXG4gICAqL1xuICBjb25zdCBkZWNpc2lvbnMgPSB1c2VyU2VsZWN0aW9ucy5leHBlcmllbmNlcztcbiAgY29uc3QgY291bnQgPSBPYmplY3Qua2V5cyhkZWNpc2lvbnMpLmxlbmd0aDtcblxuICBpZiAoY291bnQgPT09IDApIHtcbiAgICBzaG93QWxlcnRNb2RhbCgnTm8gU2VsZWN0aW9ucycsICdQbGVhc2Ugc2VsZWN0IGFjdGlvbnMgZm9yIGF0IGxlYXN0IG9uZSBleHBlcmllbmNlIGJlZm9yZSBzdWJtaXR0aW5nLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9yZXZpZXctZGVjaXNpb25zJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgdHlwZTogJ2V4cGVyaWVuY2VzJyxcbiAgICAgICAgZGVjaXNpb25zOiBkZWNpc2lvbnNcbiAgICAgIH0pXG4gICAgfSk7XG5cbiAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgIHN0YXRlTWFuYWdlci5tYXJrQ29udGVudENoYW5nZWQoKTtcbiAgICAgIHNob3dUb2FzdChgRXhwZXJpZW5jZSBkZWNpc2lvbnMgc2F2ZWQgKCR7Y291bnR9IGl0ZW1zKWApO1xuICAgICAgc2NoZWR1bGVBdHNSZWZyZXNoKCk7XG4gICAgICAvLyBQZXJzaXN0IHNhdmVkIGRlY2lzaW9ucyBsb2NhbGx5IHNvIHRoZSBVSSByZWZsZWN0cyB0aGVtIGltbWVkaWF0ZWx5XG4gICAgICB3aW5kb3cuX3NhdmVkRGVjaXNpb25zID0gd2luZG93Ll9zYXZlZERlY2lzaW9ucyB8fCB7fTtcbiAgICAgIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMuZXhwZXJpZW5jZV9kZWNpc2lvbnMgPSBkZWNpc2lvbnM7XG4gICAgICB1c2VyU2VsZWN0aW9ucy5leHBlcmllbmNlcyA9IHsgLi4uZGVjaXNpb25zIH07XG4gICAgICBpZiAodHlwZW9mIHVwZGF0ZUluY2x1c2lvbkNvdW50cyA9PT0gJ2Z1bmN0aW9uJykgdXBkYXRlSW5jbHVzaW9uQ291bnRzKCk7XG4gICAgICBzd2l0Y2hUYWIoJ2FjaC1lZGl0b3InKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZXJyb3IgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICBzaG93VG9hc3QoYEVycm9yOiAke2Vycm9yLmVycm9yIHx8ICdGYWlsZWQgdG8gc2F2ZSBkZWNpc2lvbnMnfWAsICdlcnJvcicpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cuZXJyb3IoJ0Vycm9yIHN1Ym1pdHRpbmcgZXhwZXJpZW5jZSBkZWNpc2lvbnM6JywgZXJyb3IpO1xuICAgIHNob3dUb2FzdCgnRmFpbGVkIHRvIHNhdmUgZGVjaXNpb25zLiBQbGVhc2UgdHJ5IGFnYWluLicsICdlcnJvcicpO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFeHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5leHBvcnQge1xuICBnZXRFeHBlcmllbmNlRGV0YWlscyxcbiAgYnVpbGRFeHBlcmllbmNlUmV2aWV3VGFibGUsXG4gIF9yZW5kZXJFeHBlcmllbmNlVGFibGUsXG4gIG1vdmVFeHBlcmllbmNlUm93LFxuICBoYW5kbGVFeHBlcmllbmNlUmVzcG9uc2UsXG4gIHN1Ym1pdEV4cGVyaWVuY2VEZWNpc2lvbnMsXG59O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvc2tpbGxzLXJldmlldy5qc1xuICogU2tpbGxzLXJldmlldyB0YWJsZTogZmV0Y2gsIHJlbmRlciwgcm93LXJlb3JkZXIsIGFuZCBzdWJtaXQgZGVjaXNpb25zLlxuICpcbiAqIERlcGVuZGVuY2llcyAocmVzb2x2ZWQgdGhyb3VnaCBnbG9iYWxUaGlzIGF0IHJ1bnRpbWUpOlxuICogICB1c2VyU2VsZWN0aW9ucywgcGVuZGluZ1JlY29tbWVuZGF0aW9ucywgX3NhdmVkRGVjaXNpb25zLCBfc2tpbGxzT3JkZXJlZCxcbiAqICAgX25ld1NraWxsc0Zyb21MTE0sIHRhYkRhdGEsIHBhcnNlU3RhdHVzUmVzcG9uc2UsXG4gKiAgIGdldFNraWxsUmVjb21tZW5kYXRpb24sIGdldFNraWxsQ29uZmlkZW5jZSwgZ2V0U2tpbGxSZWFzb25pbmcsXG4gKiAgIGVzY2FwZUh0bWwsIGhhbmRsZUFjdGlvbkNsaWNrLCBidWxrQWN0aW9uLCBfdXBkYXRlUGFnZUVzdGltYXRlLFxuICogICB1cGRhdGVJbmNsdXNpb25Db3VudHMsIHN3aXRjaFRhYixcbiAqICAgc2hvd0FsZXJ0TW9kYWwsIHNob3dUb2FzdCwgc2NoZWR1bGVBdHNSZWZyZXNoLFxuICogICAkLCAkLmZuLkRhdGFUYWJsZSAoalF1ZXJ5ICsgRGF0YVRhYmxlcylcbiAqL1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5jb25zdCBsb2cgPSBnZXRMb2dnZXIoJ3NraWxscy1yZXZpZXcnKTtcblxuaW1wb3J0IHsgc3RhdGVNYW5hZ2VyIH0gZnJvbSAnLi9zdGF0ZS1tYW5hZ2VyLmpzJztcbmltcG9ydCB7IGV5ZVNsYXNoSWNvbiB9IGZyb20gJy4vcmV2aWV3LWljb25zLmpzJztcblxuLy8gXHUyNTAwXHUyNTAwIFllYXJzLWZyb20tZXhwZXJpZW5jZSBoZWxwZXJzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBfcGFyc2VZZWFyRnJvbVN0cihzdHIpIHtcbiAgaWYgKCFzdHIpIHJldHVybiBudWxsO1xuICBjb25zdCBzID0gU3RyaW5nKHN0cikudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gIGlmIChbJ2N1cnJlbnQnLCAncHJlc2VudCcsICdub3cnLCAnb25nb2luZyddLmluY2x1ZGVzKHMpKSByZXR1cm4gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpO1xuICBjb25zdCBtID0gcy5tYXRjaCgvXFxiKDE5fDIwKVxcZHsyfVxcYi8pO1xuICByZXR1cm4gbSA/IHBhcnNlSW50KG1bMF0sIDEwKSA6IG51bGw7XG59XG5cbi8qKlxuICogR2l2ZW4gYSBsaXN0IG9mIGV4cGVyaWVuY2UgSURzIGFuZCB0aGUgZnVsbCBleHBlcmllbmNlcyBhcnJheSwgcmV0dXJuXG4gKiB0aGUgdG90YWwgeWVhcnMgb2YgZXhwZXJpZW5jZSAoc3VtIG9mIGR1cmF0aW9uIG9mIG1hdGNoZWQgZW50cmllcykuXG4gKiBSZXR1cm5zIG51bGwgaWYgbm8gbWF0Y2hpbmcgZW50cmllcyBmb3VuZC5cbiAqL1xuZnVuY3Rpb24gX2NvbXB1dGVZZWFyc0Zyb21JZHMoaWRzLCBhbGxFeHBlcmllbmNlcykge1xuICBjb25zdCBpZFNldCA9IG5ldyBTZXQoKGlkcyB8fCBbXSkubWFwKHggPT4gU3RyaW5nKHgpLnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pKTtcbiAgaWYgKGlkU2V0LnNpemUgPT09IDApIHJldHVybiBudWxsO1xuICBsZXQgdG90YWwgPSAwO1xuICBjb25zdCBjdXJyZW50WWVhciA9IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKTtcbiAgZm9yIChjb25zdCBleHAgb2YgKGFsbEV4cGVyaWVuY2VzIHx8IFtdKSkge1xuICAgIGlmICghZXhwIHx8IHR5cGVvZiBleHAgIT09ICdvYmplY3QnKSBjb250aW51ZTtcbiAgICBjb25zdCBleHBJZCA9IFN0cmluZyhleHAuaWQgfHwgJycpLnRyaW0oKTtcbiAgICBpZiAoIWlkU2V0LmhhcyhleHBJZCkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHN0YXJ0WWVhciA9IF9wYXJzZVllYXJGcm9tU3RyKGV4cC5zdGFydF9kYXRlIHx8IGV4cC5zdGFydCk7XG4gICAgY29uc3QgZW5kWWVhciAgID0gX3BhcnNlWWVhckZyb21TdHIoZXhwLmVuZF9kYXRlICAgfHwgZXhwLmVuZCkgPz8gY3VycmVudFllYXI7XG4gICAgdG90YWwgKz0gc3RhcnRZZWFyID09IG51bGwgPyAxIDogTWF0aC5tYXgoMSwgZW5kWWVhciAtIHN0YXJ0WWVhciArIDEpO1xuICB9XG4gIHJldHVybiB0b3RhbCA+IDAgPyB0b3RhbCA6IG51bGw7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNhdmVTa2lsbEdyb3VwT3ZlcnJpZGUoc2tpbGxOYW1lLCBncm91cE5hbWUpIHtcbiAgY29uc3Qgbm9ybWFsaXplZEdyb3VwID0gZ3JvdXBOYW1lID09IG51bGwgPyBudWxsIDogU3RyaW5nKGdyb3VwTmFtZSkudHJpbSgpIHx8IG51bGw7XG4gIGNvbnN0IHNrID0gKHdpbmRvdy5fc2tpbGxzT3JkZXJlZCB8fCBbXSkuZmluZChzID0+ICh0eXBlb2YgcyA9PT0gJ3N0cmluZycgPyBzIDogcy5uYW1lIHx8IHMpID09PSBza2lsbE5hbWUpO1xuICBpZiAoc2sgJiYgdHlwZW9mIHNrID09PSAnb2JqZWN0Jykgc2suZ3JvdXAgPSBub3JtYWxpemVkR3JvdXAgfHwgJyc7XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9yZXZpZXctc2tpbGwtZ3JvdXAnLCB7XG4gICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBza2lsbDogc2tpbGxOYW1lLCBncm91cDogbm9ybWFsaXplZEdyb3VwIH0pLFxuICB9KTtcblxuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgY29uc3QgZXJyb3IgPSBhd2FpdCByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGVycm9yLmVycm9yIHx8ICdGYWlsZWQgdG8gc2F2ZSBza2lsbCBncm91cCcpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3BvbnNlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzYXZlU2tpbGxDYXRlZ29yeU92ZXJyaWRlKHNraWxsTmFtZSwgY2F0ZWdvcnlOYW1lKSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRDYXRlZ29yeSA9IGNhdGVnb3J5TmFtZSA9PSBudWxsID8gbnVsbCA6IFN0cmluZyhjYXRlZ29yeU5hbWUpLnRyaW0oKSB8fCBudWxsO1xuICBjb25zdCBzayA9ICh3aW5kb3cuX3NraWxsc09yZGVyZWQgfHwgW10pLmZpbmQocyA9PiAodHlwZW9mIHMgPT09ICdzdHJpbmcnID8gcyA6IHMubmFtZSB8fCBzKSA9PT0gc2tpbGxOYW1lKTtcbiAgaWYgKHNrICYmIHR5cGVvZiBzayA9PT0gJ29iamVjdCcpIHtcbiAgICBpZiAobm9ybWFsaXplZENhdGVnb3J5KSBzay5jYXRlZ29yeSA9IG5vcm1hbGl6ZWRDYXRlZ29yeTtcbiAgICBlbHNlIGRlbGV0ZSBzay5jYXRlZ29yeTtcbiAgfVxuXG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvcmV2aWV3LXNraWxsLWNhdGVnb3J5Jywge1xuICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgc2tpbGw6IHNraWxsTmFtZSwgY2F0ZWdvcnk6IG5vcm1hbGl6ZWRDYXRlZ29yeSB9KSxcbiAgfSk7XG5cbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIGNvbnN0IGVycm9yID0gYXdhaXQgcmVzcG9uc2UuanNvbigpLmNhdGNoKCgpID0+ICh7fSkpO1xuICAgIHRocm93IG5ldyBFcnJvcihlcnJvci5lcnJvciB8fCAnRmFpbGVkIHRvIHNhdmUgc2tpbGwgY2F0ZWdvcnknKTtcbiAgfVxuXG4gIHJldHVybiByZXNwb25zZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVuYW1lU2tpbGxDYXRlZ29yeShvbGRDYXRlZ29yeSwgbmV3Q2F0ZWdvcnkpIHtcbiAgY29uc3Qgbm9ybWFsaXplZE9sZCA9IFN0cmluZyhvbGRDYXRlZ29yeSB8fCAnJykudHJpbSgpO1xuICBjb25zdCBub3JtYWxpemVkTmV3ID0gU3RyaW5nKG5ld0NhdGVnb3J5IHx8ICcnKS50cmltKCk7XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9yZXZpZXctc2tpbGwtY2F0ZWdvcmllcycsIHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBhY3Rpb246ICdyZW5hbWUnLFxuICAgICAgb2xkX2NhdGVnb3J5OiBub3JtYWxpemVkT2xkLFxuICAgICAgbmV3X2NhdGVnb3J5OiBub3JtYWxpemVkTmV3LFxuICAgIH0pLFxuICB9KTtcblxuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgY29uc3QgZXJyb3IgPSBhd2FpdCByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGVycm9yLmVycm9yIHx8ICdGYWlsZWQgdG8gcmVuYW1lIHNraWxsIGNhdGVnb3J5Jyk7XG4gIH1cblxuICByZXR1cm4gcmVzcG9uc2U7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNhdmVTa2lsbENhdGVnb3J5T3JkZXIob3JkZXJlZENhdGVnb3JpZXMpIHtcbiAgY29uc3Qgbm9ybWFsaXplZE9yZGVyID0gQXJyYXkuZnJvbShuZXcgU2V0KFxuICAgIChvcmRlcmVkQ2F0ZWdvcmllcyB8fCBbXSlcbiAgICAgIC5tYXAoY2F0ZWdvcnkgPT4gU3RyaW5nKGNhdGVnb3J5IHx8ICcnKS50cmltKCkpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pLFxuICApKTtcblxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3Jldmlldy1za2lsbC1jYXRlZ29yaWVzJywge1xuICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGFjdGlvbjogJ3Jlb3JkZXInLFxuICAgICAgb3JkZXJlZF9jYXRlZ29yaWVzOiBub3JtYWxpemVkT3JkZXIsXG4gICAgfSksXG4gIH0pO1xuXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICBjb25zdCBlcnJvciA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3IuZXJyb3IgfHwgJ0ZhaWxlZCB0byBzYXZlIHNraWxsIGNhdGVnb3J5IG9yZGVyJyk7XG4gIH1cblxuICByZXR1cm4gcmVzcG9uc2U7XG59XG5cbmZ1bmN0aW9uIF9ub3JtYWxpemVTa2lsbFN1YnNraWxscyh2YWx1ZSkge1xuICBjb25zdCByYXdWYWx1ZXMgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogU3RyaW5nKHZhbHVlIHx8ICcnKS5zcGxpdCgnLCcpO1xuICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KFxuICAgIHJhd1ZhbHVlc1xuICAgICAgLm1hcChpdGVtID0+IFN0cmluZyhpdGVtIHx8ICcnKS50cmltKCkpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pLFxuICApKTtcbn1cblxuZnVuY3Rpb24gX3NraWxsTmFtZShza2lsbCkge1xuICByZXR1cm4gdHlwZW9mIHNraWxsID09PSAnc3RyaW5nJyA/IHNraWxsIDogU3RyaW5nKHNraWxsPy5uYW1lIHx8IHNraWxsIHx8ICcnKS50cmltKCk7XG59XG5cbmZ1bmN0aW9uIF9ub3JtYWxpemVFeHRyYVNraWxsRW50cnkocmF3U2tpbGwsIHsgdXNlckNyZWF0ZWQgPSBmYWxzZSB9ID0ge30pIHtcbiAgaWYgKHR5cGVvZiByYXdTa2lsbCA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCBuYW1lID0gcmF3U2tpbGwudHJpbSgpO1xuICAgIHJldHVybiBuYW1lID8geyBuYW1lLCBfaXNOZXc6IHRydWUgfSA6IG51bGw7XG4gIH1cbiAgaWYgKCFyYXdTa2lsbCB8fCB0eXBlb2YgcmF3U2tpbGwgIT09ICdvYmplY3QnKSByZXR1cm4gbnVsbDtcblxuICBjb25zdCBuYW1lID0gU3RyaW5nKHJhd1NraWxsLm5hbWUgfHwgJycpLnRyaW0oKTtcbiAgaWYgKCFuYW1lKSByZXR1cm4gbnVsbDtcblxuICBjb25zdCBub3JtYWxpemVkID0ge1xuICAgIC4uLnJhd1NraWxsLFxuICAgIG5hbWUsXG4gICAgX2lzTmV3OiB0cnVlLFxuICB9O1xuICBjb25zdCBzdWJza2lsbHMgPSBfbm9ybWFsaXplU2tpbGxTdWJza2lsbHMocmF3U2tpbGwuc3Vic2tpbGxzIHx8IHJhd1NraWxsLnN1Yl9za2lsbHMgfHwgW10pO1xuICBpZiAoc3Vic2tpbGxzLmxlbmd0aCA+IDApIG5vcm1hbGl6ZWQuc3Vic2tpbGxzID0gc3Vic2tpbGxzO1xuICBlbHNlIGRlbGV0ZSBub3JtYWxpemVkLnN1YnNraWxscztcblxuICBpZiAodXNlckNyZWF0ZWQgfHwgcmF3U2tpbGwudXNlcl9jcmVhdGVkIHx8IHJhd1NraWxsLl9pc1VzZXJDcmVhdGVkKSB7XG4gICAgbm9ybWFsaXplZC51c2VyX2NyZWF0ZWQgPSB0cnVlO1xuICAgIG5vcm1hbGl6ZWQuX2lzVXNlckNyZWF0ZWQgPSB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG59XG5cbmZ1bmN0aW9uIF9za2lsbElubGluZUxhYmVsKHNraWxsKSB7XG4gIGlmICghc2tpbGwgfHwgdHlwZW9mIHNraWxsID09PSAnc3RyaW5nJykgcmV0dXJuIF9za2lsbE5hbWUoc2tpbGwpO1xuICBjb25zdCBuYW1lID0gX3NraWxsTmFtZShza2lsbCk7XG4gIGNvbnN0IHBhcmVudGhldGljYWwgPSBTdHJpbmcoc2tpbGwucGFyZW50aGV0aWNhbCB8fCAnJykudHJpbSgpO1xuICBpZiAocGFyZW50aGV0aWNhbCkgcmV0dXJuIGAke25hbWV9ICgke3BhcmVudGhldGljYWx9KWA7XG5cbiAgY29uc3QgcXVhbGlmaWVyUGFydHMgPSBbXTtcbiAgY29uc3QgcHJvZmljaWVuY3kgPSBTdHJpbmcoc2tpbGwucHJvZmljaWVuY3kgfHwgJycpLnRyaW0oKTtcbiAgaWYgKHByb2ZpY2llbmN5KSBxdWFsaWZpZXJQYXJ0cy5wdXNoKHByb2ZpY2llbmN5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcHJvZmljaWVuY3kuc2xpY2UoMSkpO1xuICBfbm9ybWFsaXplU2tpbGxTdWJza2lsbHMoc2tpbGwuc3Vic2tpbGxzIHx8IHNraWxsLnN1Yl9za2lsbHMgfHwgW10pLmZvckVhY2goaXRlbSA9PiBxdWFsaWZpZXJQYXJ0cy5wdXNoKGl0ZW0pKTtcbiAgaWYgKHF1YWxpZmllclBhcnRzLmxlbmd0aCA+IDApIHJldHVybiBgJHtuYW1lfSAoJHtxdWFsaWZpZXJQYXJ0cy5qb2luKCcsICcpfSlgO1xuICByZXR1cm4gbmFtZTtcbn1cblxuZnVuY3Rpb24gX2ZpbmRTa2lsbFJlY29tbWVuZGF0aW9uUmVjb3JkKHNraWxsTmFtZSwgZGF0YSkge1xuICBpZiAoIWRhdGEgfHwgIUFycmF5LmlzQXJyYXkoZGF0YS5za2lsbF9yZWNvbW1lbmRhdGlvbnMpKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIGRhdGEuc2tpbGxfcmVjb21tZW5kYXRpb25zLmZpbmQoKHJlYykgPT4ge1xuICAgIGNvbnN0IHJlY05hbWUgPSBTdHJpbmcocmVjPy5za2lsbCB8fCByZWM/Lm5hbWUgfHwgJycpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiByZWNOYW1lID09PSBTdHJpbmcoc2tpbGxOYW1lIHx8ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgfSkgfHwgbnVsbDtcbn1cblxuZnVuY3Rpb24gX2J1aWxkU2tpbGxHcm91cGluZ1N1Z2dlc3Rpb24ocmVjLCBza2lsbCkge1xuICBjb25zdCBncm91cGluZyA9IHJlYyAmJiB0eXBlb2YgcmVjLmdyb3VwaW5nID09PSAnb2JqZWN0JyA/IHJlYy5ncm91cGluZyA6IG51bGw7XG4gIGlmICghZ3JvdXBpbmcpIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IGN1cnJlbnRDYXRlZ29yeSA9IHR5cGVvZiBza2lsbCA9PT0gJ29iamVjdCcgPyBTdHJpbmcoc2tpbGwuY2F0ZWdvcnkgfHwgJycpLnRyaW0oKSA6ICcnO1xuICBjb25zdCBjdXJyZW50R3JvdXAgPSB0eXBlb2Ygc2tpbGwgPT09ICdvYmplY3QnID8gU3RyaW5nKHNraWxsLmdyb3VwIHx8ICcnKS50cmltKCkgOiAnJztcbiAgY29uc3Qgc3VnZ2VzdGVkQ2F0ZWdvcnkgPSBTdHJpbmcoZ3JvdXBpbmcuY2F0ZWdvcnkgfHwgJycpLnRyaW0oKTtcbiAgY29uc3Qgc3VnZ2VzdGVkR3JvdXAgPSBTdHJpbmcoZ3JvdXBpbmcuZ3JvdXAgfHwgJycpLnRyaW0oKTtcbiAgY29uc3QgY2F0ZWdvcnlDaGFuZ2VkID0gQm9vbGVhbihzdWdnZXN0ZWRDYXRlZ29yeSAmJiBzdWdnZXN0ZWRDYXRlZ29yeSAhPT0gY3VycmVudENhdGVnb3J5KTtcbiAgY29uc3QgZ3JvdXBDaGFuZ2VkID0gQm9vbGVhbihzdWdnZXN0ZWRHcm91cCAmJiBzdWdnZXN0ZWRHcm91cCAhPT0gY3VycmVudEdyb3VwKTtcblxuICBpZiAoIWNhdGVnb3J5Q2hhbmdlZCAmJiAhZ3JvdXBDaGFuZ2VkKSByZXR1cm4gbnVsbDtcblxuICBjb25zdCBjaGFuZ2VQYXJ0cyA9IFtdO1xuICBpZiAoY2F0ZWdvcnlDaGFuZ2VkKSB7XG4gICAgY2hhbmdlUGFydHMucHVzaChgQ2F0ZWdvcnk6ICR7Y3VycmVudENhdGVnb3J5IHx8ICdVbmNhdGVnb3JpemVkJ30gLT4gJHtzdWdnZXN0ZWRDYXRlZ29yeX1gKTtcbiAgfVxuICBpZiAoZ3JvdXBDaGFuZ2VkKSB7XG4gICAgY2hhbmdlUGFydHMucHVzaChgR3JvdXA6ICR7Y3VycmVudEdyb3VwIHx8ICdOb25lJ30gLT4gJHtzdWdnZXN0ZWRHcm91cH1gKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY2F0ZWdvcnk6IHN1Z2dlc3RlZENhdGVnb3J5LFxuICAgIGdyb3VwOiBzdWdnZXN0ZWRHcm91cCxcbiAgICBjYXRlZ29yeUNoYW5nZWQsXG4gICAgZ3JvdXBDaGFuZ2VkLFxuICAgIGNoYW5nZVRleHQ6IGNoYW5nZVBhcnRzLmpvaW4oJyB8ICcpLFxuICAgIHJlYXNvbmluZzogU3RyaW5nKGdyb3VwaW5nLnJlYXNvbmluZyB8fCAnJykudHJpbSgpLFxuICAgIGF0c0ltcGFjdDogU3RyaW5nKGdyb3VwaW5nLmF0c19pbXBhY3QgfHwgJycpLnRyaW0oKSxcbiAgICBwYWdlTGVuZ3RoSW1wYWN0OiBTdHJpbmcoZ3JvdXBpbmcucGFnZV9sZW5ndGhfaW1wYWN0IHx8ICcnKS50cmltKCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIF9jc3NFc2NhcGUodmFsdWUpIHtcbiAgaWYgKGdsb2JhbFRoaXMuQ1NTICYmIHR5cGVvZiBnbG9iYWxUaGlzLkNTUy5lc2NhcGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZ2xvYmFsVGhpcy5DU1MuZXNjYXBlKFN0cmluZyh2YWx1ZSkpO1xuICB9XG4gIHJldHVybiBTdHJpbmcodmFsdWUpLnJlcGxhY2UoL1xcXFwvZywgJ1xcXFxcXFxcJykucmVwbGFjZSgvXCIvZywgJ1xcXFxcIicpO1xufVxuXG5mdW5jdGlvbiBfYnVpbGRHcm91cFdhcm5pbmdzKHNraWxscykge1xuICBjb25zdCB3YXJuaW5nTWFwID0gbmV3IE1hcCgpO1xuICBjb25zdCBncm91cHMgPSBuZXcgTWFwKCk7XG4gIGZvciAoY29uc3Qgc2tpbGwgb2Ygc2tpbGxzIHx8IFtdKSB7XG4gICAgaWYgKCFza2lsbCB8fCB0eXBlb2Ygc2tpbGwgIT09ICdvYmplY3QnKSBjb250aW51ZTtcbiAgICBjb25zdCBza2lsbE5hbWUgPSBfc2tpbGxOYW1lKHNraWxsKTtcbiAgICBjb25zdCBncm91cE5hbWUgPSBTdHJpbmcoc2tpbGwuZ3JvdXAgfHwgJycpLnRyaW0oKTtcbiAgICBpZiAoIXNraWxsTmFtZSB8fCAhZ3JvdXBOYW1lKSBjb250aW51ZTtcbiAgICBpZiAoIWdyb3Vwcy5oYXMoZ3JvdXBOYW1lKSkgZ3JvdXBzLnNldChncm91cE5hbWUsIFtdKTtcbiAgICBncm91cHMuZ2V0KGdyb3VwTmFtZSkucHVzaChfc2tpbGxJbmxpbmVMYWJlbChza2lsbCkpO1xuICB9XG5cbiAgZ3JvdXBzLmZvckVhY2goKGxhYmVscywgZ3JvdXBOYW1lKSA9PiB7XG4gICAgY29uc3QgcHJldmlldyA9IGxhYmVscy5qb2luKCcsICcpO1xuICAgIGNvbnN0IGNyb3dkZWQgPSBwcmV2aWV3Lmxlbmd0aCA+PSA5MCB8fCBsYWJlbHMubGVuZ3RoID49IDU7XG4gICAgaWYgKCFjcm93ZGVkKSByZXR1cm47XG4gICAgd2FybmluZ01hcC5zZXQoZ3JvdXBOYW1lLCB7XG4gICAgICBwcmV2aWV3LFxuICAgICAgbWVtYmVyQ291bnQ6IGxhYmVscy5sZW5ndGgsXG4gICAgICBtZXNzYWdlOiBgSW5saW5lIGJ1bGxldCBtYXkgYmUgaGFyZCB0byBzY2FuICgke2xhYmVscy5sZW5ndGh9IHNraWxscywgJHtwcmV2aWV3Lmxlbmd0aH0gY2hhcnMpLmAsXG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiB3YXJuaW5nTWFwO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzYXZlU2tpbGxRdWFsaWZpZXJPdmVycmlkZShza2lsbE5hbWUsIHF1YWxpZmllcnMpIHtcbiAgY29uc3Qgbm9ybWFsaXplZFNraWxsID0gU3RyaW5nKHNraWxsTmFtZSB8fCAnJykudHJpbSgpO1xuICBpZiAoIW5vcm1hbGl6ZWRTa2lsbCkgdGhyb3cgbmV3IEVycm9yKCdTa2lsbCBuYW1lIGlzIHJlcXVpcmVkJyk7XG5cbiAgY29uc3Qgbm9ybWFsaXplZFByb2ZpY2llbmN5ID0gU3RyaW5nKHF1YWxpZmllcnM/LnByb2ZpY2llbmN5IHx8ICcnKS50cmltKCk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRTdWJza2lsbHMgPSBfbm9ybWFsaXplU2tpbGxTdWJza2lsbHMocXVhbGlmaWVycz8uc3Vic2tpbGxzKTtcbiAgY29uc3Qgbm9ybWFsaXplZFBhcmVudGhldGljYWwgPSBTdHJpbmcocXVhbGlmaWVycz8ucGFyZW50aGV0aWNhbCB8fCAnJykudHJpbSgpO1xuICBjb25zdCBub3JtYWxpemVkU2tpbGxUeXBlID0gU3RyaW5nKHF1YWxpZmllcnM/LnNraWxsX3R5cGUgfHwgJycpLnRyaW0oKS50b0xvd2VyQ2FzZSgpIHx8IG51bGw7XG5cbiAgY29uc3Qgc2sgPSAod2luZG93Ll9za2lsbHNPcmRlcmVkIHx8IFtdKS5maW5kKHMgPT4gKHR5cGVvZiBzID09PSAnc3RyaW5nJyA/IHMgOiBzLm5hbWUgfHwgcykgPT09IG5vcm1hbGl6ZWRTa2lsbCk7XG4gIGlmIChzayAmJiB0eXBlb2Ygc2sgPT09ICdvYmplY3QnKSB7XG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9maWNpZW5jeSkgc2sucHJvZmljaWVuY3kgPSBub3JtYWxpemVkUHJvZmljaWVuY3k7XG4gICAgZWxzZSBkZWxldGUgc2sucHJvZmljaWVuY3k7XG5cbiAgICBpZiAobm9ybWFsaXplZFN1YnNraWxscy5sZW5ndGggPiAwKSBzay5zdWJza2lsbHMgPSBub3JtYWxpemVkU3Vic2tpbGxzO1xuICAgIGVsc2UgZGVsZXRlIHNrLnN1YnNraWxscztcblxuICAgIGlmIChub3JtYWxpemVkUGFyZW50aGV0aWNhbCkgc2sucGFyZW50aGV0aWNhbCA9IG5vcm1hbGl6ZWRQYXJlbnRoZXRpY2FsO1xuICAgIGVsc2UgZGVsZXRlIHNrLnBhcmVudGhldGljYWw7XG4gIH1cblxuICBjb25zdCBwYXlsb2FkID0ge1xuICAgIHNraWxsOiBub3JtYWxpemVkU2tpbGwsXG4gICAgcHJvZmljaWVuY3k6IG5vcm1hbGl6ZWRQcm9maWNpZW5jeSxcbiAgICBzdWJza2lsbHM6IG5vcm1hbGl6ZWRTdWJza2lsbHMsXG4gICAgcGFyZW50aGV0aWNhbDogbm9ybWFsaXplZFBhcmVudGhldGljYWwsXG4gIH07XG4gIGlmICgnc2tpbGxfdHlwZScgaW4gKHF1YWxpZmllcnMgfHwge30pKSB7XG4gICAgcGF5bG9hZC5za2lsbF90eXBlID0gbm9ybWFsaXplZFNraWxsVHlwZTtcbiAgfVxuXG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvcmV2aWV3LXNraWxsLXF1YWxpZmllcnMnLCB7XG4gICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkocGF5bG9hZCksXG4gIH0pO1xuXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICBjb25zdCBlcnJvciA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3IuZXJyb3IgfHwgJ0ZhaWxlZCB0byBzYXZlIHNraWxsIHF1YWxpZmllcnMnKTtcbiAgfVxuXG4gIHJldHVybiByZXNwb25zZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZVVzZXJDcmVhdGVkU2tpbGwoc2tpbGwpIHtcbiAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICBuYW1lOiBTdHJpbmcoc2tpbGw/Lm5hbWUgfHwgJycpLnRyaW0oKSxcbiAgICBjYXRlZ29yeTogU3RyaW5nKHNraWxsPy5jYXRlZ29yeSB8fCAnJykudHJpbSgpLFxuICAgIGdyb3VwOiBTdHJpbmcoc2tpbGw/Lmdyb3VwIHx8ICcnKS50cmltKCksXG4gICAgcHJvZmljaWVuY3k6IFN0cmluZyhza2lsbD8ucHJvZmljaWVuY3kgfHwgJycpLnRyaW0oKSxcbiAgICBzdWJza2lsbHM6IF9ub3JtYWxpemVTa2lsbFN1YnNraWxscyhza2lsbD8uc3Vic2tpbGxzKSxcbiAgICBwYXJlbnRoZXRpY2FsOiBTdHJpbmcoc2tpbGw/LnBhcmVudGhldGljYWwgfHwgJycpLnRyaW0oKSxcbiAgfTtcbiAgaWYgKCFwYXlsb2FkLm5hbWUpIHRocm93IG5ldyBFcnJvcignU2tpbGwgbmFtZSBpcyByZXF1aXJlZCcpO1xuXG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvcmV2aWV3LXNraWxsLWFkZCcsIHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeShwYXlsb2FkKSxcbiAgfSk7XG5cbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIGNvbnN0IGVycm9yID0gYXdhaXQgcmVzcG9uc2UuanNvbigpLmNhdGNoKCgpID0+ICh7fSkpO1xuICAgIHRocm93IG5ldyBFcnJvcihlcnJvci5lcnJvciB8fCAnRmFpbGVkIHRvIGFkZCBza2lsbCcpO1xuICB9XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICBjb25zdCBub3JtYWxpemVkID0gX25vcm1hbGl6ZUV4dHJhU2tpbGxFbnRyeShyZXN1bHQuc2tpbGwsIHsgdXNlckNyZWF0ZWQ6IHRydWUgfSk7XG4gIGlmICghbm9ybWFsaXplZCkgdGhyb3cgbmV3IEVycm9yKCdTZXJ2ZXIgZGlkIG5vdCByZXR1cm4gYSBza2lsbCcpO1xuXG4gIGNvbnN0IGN1cnJlbnQgPSBBcnJheS5pc0FycmF5KHdpbmRvdy5fc2tpbGxzT3JkZXJlZCkgPyB3aW5kb3cuX3NraWxsc09yZGVyZWQgOiBbXTtcbiAgd2luZG93Ll9za2lsbHNPcmRlcmVkID0gW25vcm1hbGl6ZWQsIC4uLmN1cnJlbnQuZmlsdGVyKHNraWxsID0+IF9za2lsbE5hbWUoc2tpbGwpICE9PSBub3JtYWxpemVkLm5hbWUpXTtcblxuICB3aW5kb3cuX3NhdmVkRGVjaXNpb25zID0gd2luZG93Ll9zYXZlZERlY2lzaW9ucyB8fCB7fTtcbiAgY29uc3QgZXhpc3RpbmdFeHRyYXMgPSBBcnJheS5pc0FycmF5KHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMuZXh0cmFfc2tpbGxzKVxuICAgID8gd2luZG93Ll9zYXZlZERlY2lzaW9ucy5leHRyYV9za2lsbHNcbiAgICA6IFtdO1xuICB3aW5kb3cuX3NhdmVkRGVjaXNpb25zLmV4dHJhX3NraWxscyA9IFtcbiAgICBub3JtYWxpemVkLFxuICAgIC4uLmV4aXN0aW5nRXh0cmFzLmZpbHRlcihza2lsbCA9PiBfc2tpbGxOYW1lKHNraWxsKSAhPT0gbm9ybWFsaXplZC5uYW1lKSxcbiAgXTtcblxuICB1c2VyU2VsZWN0aW9ucy5za2lsbHNbbm9ybWFsaXplZC5uYW1lXSA9IHVzZXJTZWxlY3Rpb25zLnNraWxsc1tub3JtYWxpemVkLm5hbWVdIHx8ICdpbmNsdWRlJztcbiAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG59XG5cbmZ1bmN0aW9uIF9lZmZlY3RpdmVTa2lsbENhdGVnb3J5KHNraWxsKSB7XG4gIGlmICghc2tpbGwgfHwgdHlwZW9mIHNraWxsID09PSAnc3RyaW5nJykgcmV0dXJuICcnO1xuICByZXR1cm4gU3RyaW5nKHNraWxsLmNhdGVnb3J5IHx8ICcnKS50cmltKCkgfHwgJ0dlbmVyYWwnO1xufVxuXG5mdW5jdGlvbiBfc3luY1NraWxsQ2F0ZWdvcnlPcmRlcigpIHtcbiAgY29uc3Qgc2tpbGxzID0gQXJyYXkuaXNBcnJheSh3aW5kb3cuX3NraWxsc09yZGVyZWQpID8gd2luZG93Ll9za2lsbHNPcmRlcmVkIDogW107XG4gIGNvbnN0IG9yZGVyZWQgPSBbXTtcbiAgZm9yIChjb25zdCBza2lsbCBvZiBza2lsbHMpIHtcbiAgICBjb25zdCBjYXRlZ29yeSA9IF9lZmZlY3RpdmVTa2lsbENhdGVnb3J5KHNraWxsKTtcbiAgICBpZiAoY2F0ZWdvcnkgJiYgIW9yZGVyZWQuaW5jbHVkZXMoY2F0ZWdvcnkpKSBvcmRlcmVkLnB1c2goY2F0ZWdvcnkpO1xuICB9XG4gIHdpbmRvdy5fc2tpbGxDYXRlZ29yeU9yZGVyID0gb3JkZXJlZDtcbiAgcmV0dXJuIG9yZGVyZWQ7XG59XG5cbmZ1bmN0aW9uIF9yZW5hbWVTa2lsbENhdGVnb3J5TG9jYWxseShvbGRDYXRlZ29yeSwgbmV3Q2F0ZWdvcnkpIHtcbiAgY29uc3Qgbm9ybWFsaXplZE9sZCA9IFN0cmluZyhvbGRDYXRlZ29yeSB8fCAnJykudHJpbSgpO1xuICBjb25zdCBub3JtYWxpemVkTmV3ID0gU3RyaW5nKG5ld0NhdGVnb3J5IHx8ICcnKS50cmltKCk7XG4gIGlmICghbm9ybWFsaXplZE9sZCB8fCAhbm9ybWFsaXplZE5ldykgcmV0dXJuO1xuXG4gIGZvciAoY29uc3Qgc2tpbGwgb2YgKHdpbmRvdy5fc2tpbGxzT3JkZXJlZCB8fCBbXSkpIHtcbiAgICBpZiAoIXNraWxsIHx8IHR5cGVvZiBza2lsbCAhPT0gJ29iamVjdCcpIGNvbnRpbnVlO1xuICAgIGlmIChfZWZmZWN0aXZlU2tpbGxDYXRlZ29yeShza2lsbCkgPT09IG5vcm1hbGl6ZWRPbGQpIHtcbiAgICAgIHNraWxsLmNhdGVnb3J5ID0gbm9ybWFsaXplZE5ldztcbiAgICB9XG4gIH1cblxuICBjb25zdCBjdXJyZW50T3JkZXIgPSBBcnJheS5pc0FycmF5KHdpbmRvdy5fc2tpbGxDYXRlZ29yeU9yZGVyKVxuICAgID8gd2luZG93Ll9za2lsbENhdGVnb3J5T3JkZXJcbiAgICA6IF9zeW5jU2tpbGxDYXRlZ29yeU9yZGVyKCk7XG4gIHdpbmRvdy5fc2tpbGxDYXRlZ29yeU9yZGVyID0gY3VycmVudE9yZGVyLm1hcChjYXRlZ29yeSA9PiAoXG4gICAgY2F0ZWdvcnkgPT09IG5vcm1hbGl6ZWRPbGQgPyBub3JtYWxpemVkTmV3IDogY2F0ZWdvcnlcbiAgKSkuZmlsdGVyKChjYXRlZ29yeSwgaW5kZXgsIGFycikgPT4gY2F0ZWdvcnkgJiYgYXJyLmluZGV4T2YoY2F0ZWdvcnkpID09PSBpbmRleCk7XG59XG5cbmZ1bmN0aW9uIF9tb3ZlU2tpbGxDYXRlZ29yeUxvY2FsbHkoY2F0ZWdvcnlOYW1lLCBkaXJlY3Rpb24pIHtcbiAgY29uc3Qgbm9ybWFsaXplZENhdGVnb3J5ID0gU3RyaW5nKGNhdGVnb3J5TmFtZSB8fCAnJykudHJpbSgpO1xuICBjb25zdCBvcmRlciA9IEFycmF5LmlzQXJyYXkod2luZG93Ll9za2lsbENhdGVnb3J5T3JkZXIpXG4gICAgPyBbLi4ud2luZG93Ll9za2lsbENhdGVnb3J5T3JkZXJdXG4gICAgOiBfc3luY1NraWxsQ2F0ZWdvcnlPcmRlcigpO1xuICBjb25zdCBpbmRleCA9IG9yZGVyLmluZGV4T2Yobm9ybWFsaXplZENhdGVnb3J5KTtcbiAgaWYgKGluZGV4IDwgMCkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IG5leHRJbmRleCA9IGluZGV4ICsgZGlyZWN0aW9uO1xuICBpZiAobmV4dEluZGV4IDwgMCB8fCBuZXh0SW5kZXggPj0gb3JkZXIubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgW29yZGVyW2luZGV4XSwgb3JkZXJbbmV4dEluZGV4XV0gPSBbb3JkZXJbbmV4dEluZGV4XSwgb3JkZXJbaW5kZXhdXTtcbiAgd2luZG93Ll9za2lsbENhdGVnb3J5T3JkZXIgPSBvcmRlcjtcbiAgcmV0dXJuIG9yZGVyO1xufVxuXG5mdW5jdGlvbiBfYnVpbGRTa2lsbENhdGVnb3J5TWFuYWdlckh0bWwoKSB7XG4gIGNvbnN0IGNhdGVnb3JpZXMgPSBBcnJheS5pc0FycmF5KHdpbmRvdy5fc2tpbGxDYXRlZ29yeU9yZGVyKVxuICAgID8gd2luZG93Ll9za2lsbENhdGVnb3J5T3JkZXJcbiAgICA6IF9zeW5jU2tpbGxDYXRlZ29yeU9yZGVyKCk7XG4gIGlmIChjYXRlZ29yaWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuICcnO1xuXG4gIHJldHVybiBgXG4gICAgPGRpdiBjbGFzcz1cInNraWxsLWNhdGVnb3J5LW1hbmFnZXJcIiBzdHlsZT1cIm1hcmdpbjowIDAgMTJweDtwYWRkaW5nOjEycHg7Ym9yZGVyOjFweCBzb2xpZCAjZTVlN2ViO2JvcmRlci1yYWRpdXM6MTBweDtiYWNrZ3JvdW5kOiNmOGZhZmM7XCI+XG4gICAgICA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206OHB4O1wiPkNhdGVnb3J5IExheW91dDwvZGl2PlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Z2FwOjhweDtcIj5cbiAgICAgICAgJHtjYXRlZ29yaWVzLm1hcCgoY2F0ZWdvcnksIGluZGV4KSA9PiBgXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNraWxsLWNhdGVnb3J5LW1hbmFnZXItcm93XCIgZGF0YS1jYXRlZ29yeT1cIiR7ZXNjYXBlSHRtbChjYXRlZ29yeSl9XCIgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjhweDthbGlnbi1pdGVtczpjZW50ZXI7XCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICBjbGFzcz1cInNraWxsLWNhdGVnb3J5LW1hbmFnZXItaW5wdXRcIlxuICAgICAgICAgICAgICB2YWx1ZT1cIiR7ZXNjYXBlSHRtbChjYXRlZ29yeSl9XCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlJlbmFtZSBza2lsbCBjYXRlZ29yeSAke2VzY2FwZUh0bWwoY2F0ZWdvcnkpfVwiXG4gICAgICAgICAgICAgIHN0eWxlPVwiZmxleDoxO21pbi13aWR0aDowO3BhZGRpbmc6NnB4IDhweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo2cHg7XCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBkYXRhLWFjdGlvbj1cImNhdGVnb3J5LXVwXCIgZGF0YS1jYXRlZ29yeT1cIiR7ZXNjYXBlSHRtbChjYXRlZ29yeSl9XCIgYXJpYS1sYWJlbD1cIk1vdmUgJHtlc2NhcGVIdG1sKGNhdGVnb3J5KX0gY2F0ZWdvcnkgdXBcIiB0aXRsZT1cIk1vdmUgY2F0ZWdvcnkgdXBcIiAke2luZGV4ID09PSAwID8gJ2Rpc2FibGVkJyA6ICcnfT5cdTIxOTE8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIGRhdGEtYWN0aW9uPVwiY2F0ZWdvcnktZG93blwiIGRhdGEtY2F0ZWdvcnk9XCIke2VzY2FwZUh0bWwoY2F0ZWdvcnkpfVwiIGFyaWEtbGFiZWw9XCJNb3ZlICR7ZXNjYXBlSHRtbChjYXRlZ29yeSl9IGNhdGVnb3J5IGRvd25cIiB0aXRsZT1cIk1vdmUgY2F0ZWdvcnkgZG93blwiICR7aW5kZXggPT09IGNhdGVnb3JpZXMubGVuZ3RoIC0gMSA/ICdkaXNhYmxlZCcgOiAnJ30+XHUyMTkzPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIGApLmpvaW4oJycpfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGA7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBSZXJ1biBzbmFwc2hvdCAoY2hhbmdlIGJhZGdlIGZvciBza2lsbHMpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuZnVuY3Rpb24gX3NraWxsU25hcHNob3RLZXkoKSB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2lkID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKS5nZXQoJ3Nlc3Npb24nKTtcbiAgICByZXR1cm4gc2lkID8gYHNraWxsX3NuYXBfJHtzaWR9YCA6IG51bGw7XG4gIH0gY2F0Y2ggKF8pIHsgcmV0dXJuIG51bGw7IH1cbn1cbmZ1bmN0aW9uIF9zYXZlU2tpbGxTbmFwc2hvdChyZWNvbW1lbmRlZE5hbWVzKSB7XG4gIGNvbnN0IGtleSA9IF9za2lsbFNuYXBzaG90S2V5KCk7XG4gIGlmICgha2V5KSByZXR1cm47XG4gIHRyeSB7IGxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgSlNPTi5zdHJpbmdpZnkoWy4uLnJlY29tbWVuZGVkTmFtZXNdKSk7IH0gY2F0Y2ggKF8pIHt9XG59XG5mdW5jdGlvbiBfZ2V0U2tpbGxTbmFwc2hvdCgpIHtcbiAgY29uc3Qga2V5ID0gX3NraWxsU25hcHNob3RLZXkoKTtcbiAgaWYgKCFrZXkpIHJldHVybiBudWxsO1xuICB0cnkge1xuICAgIGNvbnN0IHJhdyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7XG4gICAgcmV0dXJuIHJhdyA/IG5ldyBTZXQoSlNPTi5wYXJzZShyYXcpKSA6IG51bGw7XG4gIH0gY2F0Y2ggKF8pIHsgcmV0dXJuIG51bGw7IH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIEJ1aWxkIHJldmlldyB0YWJsZSAoZmV0Y2ggKyBpbml0aWFsaXNlKSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gYnVpbGRTa2lsbHNSZXZpZXdUYWJsZSgpIHtcbiAgY29uc3QgZGF0YSA9IHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zO1xuICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGxzLXRhYmxlLWNvbnRhaW5lcicpO1xuXG4gIC8vIEJ1aWxkIHNraWxsLXR5cGUgbG9va3VwIGZyb20gam9iIGFuYWx5c2lzIChhdmFpbGFibGUgaW4gdGFiRGF0YS5hbmFseXNpcylcbiAgY29uc3Qgam9iQW5hbHlzaXMgPSBzdGF0ZU1hbmFnZXIuZ2V0VGFiRGF0YSgnYW5hbHlzaXMnKSB8fCB7fTtcbiAgY29uc3QgaGFyZFNraWxsU2V0ID0gbmV3IFNldCgoam9iQW5hbHlzaXMucmVxdWlyZWRfc2tpbGxzICAgIHx8IFtdKS5tYXAocyA9PiBzLnRvTG93ZXJDYXNlKCkpKTtcbiAgY29uc3Qgc29mdFNraWxsU2V0ID0gbmV3IFNldCgoam9iQW5hbHlzaXMubmljZV90b19oYXZlX3NraWxscyB8fCBbXSkubWFwKHMgPT4gcy50b0xvd2VyQ2FzZSgpKSk7XG5cbiAgLy8gR2V0IGFsbCBza2lsbHMgZnJvbSB0aGUgQVBJIHN0YXR1c1xuICBsZXQgYWxsU2tpbGxzID0gW107XG4gIGxldCBwZXJzaXN0ZWRFeHRyYVNraWxscyA9IFtdO1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXR1c1JlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3N0YXR1cycpO1xuICAgIGNvbnN0IHN0YXR1c0RhdGEgPSBwYXJzZVN0YXR1c1Jlc3BvbnNlKGF3YWl0IHN0YXR1c1Jlcy5qc29uKCkpO1xuICAgIGFsbFNraWxscyA9IHN0YXR1c0RhdGEuYWxsX3NraWxscyB8fCBbXTtcbiAgICBwZXJzaXN0ZWRFeHRyYVNraWxscyA9IHN0YXR1c0RhdGEuZXh0cmFfc2tpbGxzIHx8IFtdO1xuICAgIHdpbmRvdy5fYWxsRXhwZXJpZW5jZXMgPSBzdGF0dXNEYXRhLmFsbF9leHBlcmllbmNlcyB8fCBbXTtcbiAgICBjb25zdCBxdWFsT3ZlcnJpZGVzID0gc3RhdHVzRGF0YS5za2lsbF9xdWFsaWZpZXJfb3ZlcnJpZGVzIHx8IHt9O1xuICAgIHdpbmRvdy5fc2tpbGxUeXBlT3ZlcnJpZGVzID0gd2luZG93Ll9za2lsbFR5cGVPdmVycmlkZXMgfHwge307XG4gICAgZm9yIChjb25zdCBbc2tpbGxOYW1lLCBvdmVycmlkZXNdIG9mIE9iamVjdC5lbnRyaWVzKHF1YWxPdmVycmlkZXMpKSB7XG4gICAgICBpZiAob3ZlcnJpZGVzICYmIG92ZXJyaWRlcy5za2lsbF90eXBlKSB7XG4gICAgICAgIHdpbmRvdy5fc2tpbGxUeXBlT3ZlcnJpZGVzW3NraWxsTmFtZS50b0xvd2VyQ2FzZSgpXSA9IG92ZXJyaWRlcy5za2lsbF90eXBlO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cuZXJyb3IoJ0Vycm9yIGZldGNoaW5nIGFsbCBza2lsbHM6JywgZXJyb3IpO1xuICAgIC8vIEZhbGxiYWNrIHRvIGp1c3QgcmVjb21tZW5kZWQgc2tpbGxzXG4gICAgYWxsU2tpbGxzID0gZGF0YS5yZWNvbW1lbmRlZF9za2lsbHMgfHwgW107XG4gICAgd2luZG93Ll9hbGxFeHBlcmllbmNlcyA9IFtdO1xuICB9XG5cbiAgY29uc3Qgbm9ybWFsaXplZFBlcnNpc3RlZEV4dHJhU2tpbGxzID0gKHBlcnNpc3RlZEV4dHJhU2tpbGxzIHx8IFtdKVxuICAgIC5tYXAoc2tpbGwgPT4gX25vcm1hbGl6ZUV4dHJhU2tpbGxFbnRyeShza2lsbCwge1xuICAgICAgdXNlckNyZWF0ZWQ6IHR5cGVvZiBza2lsbCA9PT0gJ29iamVjdCcgJiYgISFza2lsbD8udXNlcl9jcmVhdGVkLFxuICAgIH0pKVxuICAgIC5maWx0ZXIoQm9vbGVhbik7XG4gIGlmIChub3JtYWxpemVkUGVyc2lzdGVkRXh0cmFTa2lsbHMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IG1lcmdlZFNraWxscyA9IFtdO1xuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0KCk7XG4gICAgbm9ybWFsaXplZFBlcnNpc3RlZEV4dHJhU2tpbGxzLmZvckVhY2goc2tpbGwgPT4ge1xuICAgICAgaWYgKHNlZW4uaGFzKHNraWxsLm5hbWUpKSByZXR1cm47XG4gICAgICBtZXJnZWRTa2lsbHMucHVzaChza2lsbCk7XG4gICAgICBzZWVuLmFkZChza2lsbC5uYW1lKTtcbiAgICB9KTtcbiAgICBhbGxTa2lsbHMuZm9yRWFjaChza2lsbCA9PiB7XG4gICAgICBjb25zdCBza2lsbE5hbWUgPSBfc2tpbGxOYW1lKHNraWxsKTtcbiAgICAgIGlmICghc2tpbGxOYW1lIHx8IHNlZW4uaGFzKHNraWxsTmFtZSkpIHJldHVybjtcbiAgICAgIG1lcmdlZFNraWxscy5wdXNoKHNraWxsKTtcbiAgICAgIHNlZW4uYWRkKHNraWxsTmFtZSk7XG4gICAgfSk7XG4gICAgYWxsU2tpbGxzID0gbWVyZ2VkU2tpbGxzO1xuICB9XG5cbiAgLy8gRGV0ZWN0IHNraWxscyByZWNvbW1lbmRlZCBieSBMTE0gdGhhdCBhcmVuJ3QgaW4gbWFzdGVyIENWIGFuZCBwcmVwZW5kIHRoZW1cbiAgY29uc3QgbWFzdGVyU2tpbGxOYW1lcyA9IG5ldyBTZXQoYWxsU2tpbGxzLm1hcChza2lsbCA9PiBfc2tpbGxOYW1lKHNraWxsKSkpO1xuICBjb25zdCBuZXdTa2lsbHMgPSAoZGF0YS5yZWNvbW1lbmRlZF9za2lsbHMgfHwgW10pLmZpbHRlcihzID0+ICFtYXN0ZXJTa2lsbE5hbWVzLmhhcyhzKSk7XG4gIHdpbmRvdy5fbmV3U2tpbGxzRnJvbUxMTSA9IG5ld1NraWxscztcbiAgaWYgKG5ld1NraWxscy5sZW5ndGggPiAwKSB7XG4gICAgYWxsU2tpbGxzID0gWy4uLm5ld1NraWxscy5tYXAocyA9PiAoeyBuYW1lOiBzLCBfaXNOZXc6IHRydWUgfSkpLCAuLi5hbGxTa2lsbHNdO1xuICB9XG5cbiAgaWYgKGFsbFNraWxscy5sZW5ndGggPT09IDApIHtcbiAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJzxwIHN0eWxlPVwicGFkZGluZzoyMHB4O3RleHQtYWxpZ246Y2VudGVyO2NvbG9yOiM2YjcyODA7XCI+Tm8gc2tpbGxzIGZvdW5kIGluIG1hc3RlciBDViBkYXRhLjwvcD4nO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIE9uIGZpcnN0IGxvYWQ6IHNvcnQgYnkgcmVjb21tZW5kYXRpb247IHByZXNlcnZlIHVzZXIgb3JkZXIgb24gcmUtcmVuZGVyXG4gIGlmICghd2luZG93Ll9za2lsbHNPcmRlcmVkKSB7XG4gICAgY29uc3QgcmVjb21tZW5kYXRpb25PcmRlciA9IHsgJ0VtcGhhc2l6ZSc6IDAsICdJbmNsdWRlJzogMSwgJ0RlLWVtcGhhc2l6ZSc6IDIsICdPbWl0JzogMyB9O1xuICAgIGNvbnN0IG1hc3RlclNraWxscyAgPSBhbGxTa2lsbHMuZmlsdGVyKHMgPT4gIXMuX2lzTmV3KTtcblxuICAgIC8vIFJvbGUtYXdhcmUgY2F0ZWdvcnkgc2NvcmluZzogY2F0ZWdvcmllcyB3aXRoIG1vcmUgcmVxdWlyZWQvbmljZS10by1oYXZlIGpvYiBza2lsbHMgcmFuayBoaWdoZXJcbiAgICBjb25zdCBjYXRlZ29yeVNjb3JlcyA9IHt9O1xuICAgIGZvciAoY29uc3Qgc2tpbGwgb2YgbWFzdGVyU2tpbGxzKSB7XG4gICAgICBjb25zdCBjYXQgID0gdHlwZW9mIHNraWxsID09PSAnb2JqZWN0JyA/IChza2lsbC5jYXRlZ29yeSB8fCAnJykgOiAnJztcbiAgICAgIGNvbnN0IG5hbWUgPSAodHlwZW9mIHNraWxsID09PSAnc3RyaW5nJyA/IHNraWxsIDogc2tpbGwubmFtZSB8fCBza2lsbCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmIChjYXQpIHtcbiAgICAgICAgY2F0ZWdvcnlTY29yZXNbY2F0XSA9IChjYXRlZ29yeVNjb3Jlc1tjYXRdIHx8IDApXG4gICAgICAgICAgKyAoaGFyZFNraWxsU2V0LmhhcyhuYW1lKSA/IDIgOiBzb2Z0U2tpbGxTZXQuaGFzKG5hbWUpID8gMSA6IDApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHNvcnRlZE1hc3RlciAgPSBtYXN0ZXJTa2lsbHMuc2xpY2UoKS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBjb25zdCBhTmFtZSAgPSB0eXBlb2YgYSA9PT0gJ3N0cmluZycgPyBhIDogYS5uYW1lIHx8IGE7XG4gICAgICBjb25zdCBiTmFtZSAgPSB0eXBlb2YgYiA9PT0gJ3N0cmluZycgPyBiIDogYi5uYW1lIHx8IGI7XG4gICAgICBjb25zdCBhUmVjICAgPSByZWNvbW1lbmRhdGlvbk9yZGVyW2dldFNraWxsUmVjb21tZW5kYXRpb24oYU5hbWUsIGRhdGEpXSA/PyAzO1xuICAgICAgY29uc3QgYlJlYyAgID0gcmVjb21tZW5kYXRpb25PcmRlcltnZXRTa2lsbFJlY29tbWVuZGF0aW9uKGJOYW1lLCBkYXRhKV0gPz8gMztcbiAgICAgIGlmIChhUmVjICE9PSBiUmVjKSByZXR1cm4gYVJlYyAtIGJSZWM7XG4gICAgICAvLyBXaXRoaW4gdGhlIHNhbWUgcmVjb21tZW5kYXRpb24gdGllciwgc3VyZmFjZSByb2xlLXJlbGV2YW50IGNhdGVnb3JpZXMgZmlyc3RcbiAgICAgIGNvbnN0IGFDYXQgICA9IHR5cGVvZiBhID09PSAnb2JqZWN0JyA/IChhLmNhdGVnb3J5IHx8ICcnKSA6ICcnO1xuICAgICAgY29uc3QgYkNhdCAgID0gdHlwZW9mIGIgPT09ICdvYmplY3QnID8gKGIuY2F0ZWdvcnkgfHwgJycpIDogJyc7XG4gICAgICByZXR1cm4gKGNhdGVnb3J5U2NvcmVzW2JDYXRdIHx8IDApIC0gKGNhdGVnb3J5U2NvcmVzW2FDYXRdIHx8IDApO1xuICAgIH0pO1xuICAgIHdpbmRvdy5fc2tpbGxzT3JkZXJlZCA9IFsuLi5hbGxTa2lsbHMuZmlsdGVyKHMgPT4gcy5faXNOZXcpLCAuLi5zb3J0ZWRNYXN0ZXJdO1xuXG4gICAgLy8gQXBwbHkgam9iLWFuYWx5c2lzLWRlcml2ZWQgY2F0ZWdvcnkgb3JkZXIgZnJvbSBiYWNrZW5kIChHQVAtODYpXG4gICAgY29uc3QgYmFja2VuZE9yZGVyID0gKHN0YXRlTWFuYWdlci5nZXRUYWJEYXRhKCdjdXN0b21pemF0aW9ucycpIHx8IHt9KS5za2lsbF9jYXRlZ29yeV9vcmRlcjtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShiYWNrZW5kT3JkZXIpICYmIGJhY2tlbmRPcmRlci5sZW5ndGggPiAwKSB7XG4gICAgICB3aW5kb3cuX3NraWxsQ2F0ZWdvcnlPcmRlciA9IGJhY2tlbmRPcmRlcjtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc3Qga25vd25OYW1lcyA9IG5ldyBTZXQod2luZG93Ll9za2lsbHNPcmRlcmVkLm1hcChzID0+ICh0eXBlb2YgcyA9PT0gJ3N0cmluZycgPyBzIDogcy5uYW1lIHx8IHMpKSk7XG4gICAgZm9yIChjb25zdCBzayBvZiBhbGxTa2lsbHMpIHtcbiAgICAgIGNvbnN0IG5tID0gdHlwZW9mIHNrID09PSAnc3RyaW5nJyA/IHNrIDogc2submFtZSB8fCBzaztcbiAgICAgIGlmICgha25vd25OYW1lcy5oYXMobm0pKSB3aW5kb3cuX3NraWxsc09yZGVyZWQucHVzaChzayk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcmVjb21tZW5kZWRTZXQgPSBuZXcgU2V0KGRhdGEucmVjb21tZW5kZWRfc2tpbGxzIHx8IFtdKTtcblxuICAvLyBDb21wdXRlIHdoaWNoIHJlY29tbWVuZGF0aW9ucyBhcmUgbmV3IHNpbmNlIGxhc3QgcmVuZGVyIChyZXJ1biBjaGFuZ2UgYmFkZ2VzKVxuICBjb25zdCBwcmV2U2tpbGxTbmFwID0gX2dldFNraWxsU25hcHNob3QoKTtcbiAgY29uc3QgbmV3UmVjb21tZW5kZWRTa2lsbHMgPSBwcmV2U2tpbGxTbmFwXG4gICAgPyBuZXcgU2V0KFsuLi5yZWNvbW1lbmRlZFNldF0uZmlsdGVyKG5hbWUgPT4gIXByZXZTa2lsbFNuYXAuaGFzKG5hbWUpKSlcbiAgICA6IG5ldyBTZXQoKTtcbiAgX3NhdmVTa2lsbFNuYXBzaG90KHJlY29tbWVuZGVkU2V0KTtcblxuICAvLyBJbml0aWFsaXNlIHNhdmVkIGRlY2lzaW9uc1xuICBjb25zdCBzYXZlZFNraWxsRGVjcyA9IHdpbmRvdy5fc2F2ZWREZWNpc2lvbnM/LnNraWxsX2RlY2lzaW9ucyB8fCB7fTtcbiAgZm9yIChjb25zdCBza2lsbCBvZiB3aW5kb3cuX3NraWxsc09yZGVyZWQpIHtcbiAgICBjb25zdCBza2lsbE5hbWUgICAgID0gdHlwZW9mIHNraWxsID09PSAnc3RyaW5nJyA/IHNraWxsIDogc2tpbGwubmFtZSB8fCBza2lsbDtcbiAgICBjb25zdCBpc05ldyAgICAgICAgID0gKHNraWxsLl9pc05ldyA9PT0gdHJ1ZSk7XG4gICAgY29uc3QgaXNSZWNvbW1lbmRlZCA9IHJlY29tbWVuZGVkU2V0Lmhhcyhza2lsbE5hbWUpO1xuICAgIGNvbnN0IHJlY29tbWVuZGF0aW9uID0gZ2V0U2tpbGxSZWNvbW1lbmRhdGlvbihza2lsbE5hbWUsIGRhdGEpO1xuICAgIGxldCBkZWZhdWx0QWN0aW9uID0gJ2V4Y2x1ZGUnO1xuICAgIGlmICAgICAgKHJlY29tbWVuZGF0aW9uID09PSAnRW1waGFzaXplJykgICAgZGVmYXVsdEFjdGlvbiA9ICdlbXBoYXNpemUnO1xuICAgIGVsc2UgaWYgKHJlY29tbWVuZGF0aW9uID09PSAnSW5jbHVkZScpICAgICAgZGVmYXVsdEFjdGlvbiA9ICdpbmNsdWRlJztcbiAgICBlbHNlIGlmIChyZWNvbW1lbmRhdGlvbiA9PT0gJ0RlLWVtcGhhc2l6ZScpIGRlZmF1bHRBY3Rpb24gPSAnZGUtZW1waGFzaXplJztcbiAgICBlbHNlIGlmIChyZWNvbW1lbmRhdGlvbiA9PT0gJ09taXQnKSAgICAgICAgIGRlZmF1bHRBY3Rpb24gPSAnZXhjbHVkZSc7XG4gICAgZWxzZSBpZiAoaXNSZWNvbW1lbmRlZCB8fCBpc05ldykgICAgICAgICAgICBkZWZhdWx0QWN0aW9uID0gJ2luY2x1ZGUnO1xuICAgIHVzZXJTZWxlY3Rpb25zLnNraWxsc1tza2lsbE5hbWVdID0gc2F2ZWRTa2lsbERlY3Nbc2tpbGxOYW1lXSB8fCBkZWZhdWx0QWN0aW9uO1xuICB9XG5cbiAgX3JlbmRlclNraWxsc1RhYmxlKGNvbnRhaW5lciwgcmVjb21tZW5kZWRTZXQsIGRhdGEsIGhhcmRTa2lsbFNldCwgc29mdFNraWxsU2V0LCBuZXdSZWNvbW1lbmRlZFNraWxscyk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBSZW5kZXIgdGFibGUgSFRNTCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gX3JlbmRlclNraWxsc1RhYmxlKGNvbnRhaW5lciwgcmVjb21tZW5kZWRTZXQsIGRhdGEsIGhhcmRTa2lsbFNldCwgc29mdFNraWxsU2V0LCBuZXdSZWNvbW1lbmRlZFNraWxscyA9IG5ldyBTZXQoKSkge1xuICBpZiAoIWNvbnRhaW5lcikgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NraWxscy10YWJsZS1jb250YWluZXInKTtcbiAgaWYgKCFjb250YWluZXIpIHJldHVybjtcbiAgaWYgKCFyZWNvbW1lbmRlZFNldCkgcmVjb21tZW5kZWRTZXQgPSBuZXcgU2V0KCh3aW5kb3cucGVuZGluZ1JlY29tbWVuZGF0aW9ucz8ucmVjb21tZW5kZWRfc2tpbGxzKSB8fCBbXSk7XG4gIGlmICghZGF0YSkgZGF0YSA9IHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zO1xuICBpZiAoIWhhcmRTa2lsbFNldCkge1xuICAgIGNvbnN0IGphID0gc3RhdGVNYW5hZ2VyLmdldFRhYkRhdGEoJ2FuYWx5c2lzJykgfHwge307XG4gICAgaGFyZFNraWxsU2V0ID0gbmV3IFNldCgoamEucmVxdWlyZWRfc2tpbGxzICAgICB8fCBbXSkubWFwKHMgPT4gcy50b0xvd2VyQ2FzZSgpKSk7XG4gICAgc29mdFNraWxsU2V0ID0gbmV3IFNldCgoamEubmljZV90b19oYXZlX3NraWxscyB8fCBbXSkubWFwKHMgPT4gcy50b0xvd2VyQ2FzZSgpKSk7XG4gIH1cblxuICBpZiAoJC5mbi5EYXRhVGFibGUuaXNEYXRhVGFibGUoJyNza2lsbHMtcmV2aWV3LXRhYmxlJykpIHtcbiAgICAkKCcjc2tpbGxzLXJldmlldy10YWJsZScpLkRhdGFUYWJsZSgpLmRlc3Ryb3koKTtcbiAgfVxuXG4gIGNvbnN0IHNraWxscyA9IHdpbmRvdy5fc2tpbGxzT3JkZXJlZCB8fCBbXTtcbiAgY29uc3QgZ3JvdXBXYXJuaW5ncyA9IF9idWlsZEdyb3VwV2FybmluZ3Moc2tpbGxzKTtcbiAgY29uc3QgY2F0ZWdvcnlTdWdnZXN0aW9ucyA9IEFycmF5LmZyb20obmV3IFNldChcbiAgICBza2lsbHNcbiAgICAgIC5tYXAoc2tpbGwgPT4gKHR5cGVvZiBza2lsbCA9PT0gJ29iamVjdCcgJiYgc2tpbGwuY2F0ZWdvcnkgPyBTdHJpbmcoc2tpbGwuY2F0ZWdvcnkpLnRyaW0oKSA6ICcnKSlcbiAgICAgIC5maWx0ZXIoQm9vbGVhbiksXG4gICkpLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiBsZWZ0LmxvY2FsZUNvbXBhcmUocmlnaHQpKTtcbiAgX3N5bmNTa2lsbENhdGVnb3J5T3JkZXIoKTtcbiAgY29uc3QgY2F0ZWdvcnlMaXN0SWQgPSAnc2tpbGwtY2F0ZWdvcnktc3VnZ2VzdGlvbnMnO1xuICBsZXQgdGFibGVIVE1MID0gYFxuICAgIDxkaXYgY2xhc3M9XCJza2lsbC1hZGQtcGFuZWxcIiBzdHlsZT1cIm1hcmdpbjowIDAgMTJweDtwYWRkaW5nOjEycHg7Ym9yZGVyOjFweCBzb2xpZCAjZGJlYWZlO2JvcmRlci1yYWRpdXM6MTBweDtiYWNrZ3JvdW5kOiNlZmY2ZmY7XCI+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTJweDtmbGV4LXdyYXA6d3JhcDtcIj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6NjAwO1wiPlNlc3Npb24tT25seSBTa2lsbHM8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtjb2xvcjojNDc1NTY5O1wiPkFkZCBhIHNraWxsIGZvciB0aGlzIENWIHdpdGhvdXQgY2hhbmdpbmcgdGhlIG1hc3RlciBwcm9maWxlLjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidWxrLWJ0blwiIGlkPVwidG9nZ2xlLWFkZC1za2lsbC1mb3JtXCI+KyBBZGQgU2tpbGw8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGZvcm0gaWQ9XCJhZGQtc2tpbGwtZm9ybVwiIHN0eWxlPVwiZGlzcGxheTpub25lO21hcmdpbi10b3A6MTJweDtcIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6cmVwZWF0KGF1dG8tZml0LG1pbm1heCgxODBweCwxZnIpKTtnYXA6OHB4O1wiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG5hbWU9XCJuYW1lXCIgcGxhY2Vob2xkZXI9XCJTa2lsbCBuYW1lXCIgYXJpYS1sYWJlbD1cIk5ldyBza2lsbCBuYW1lXCIgc3R5bGU9XCJwYWRkaW5nOjZweCA4cHg7Ym9yZGVyOjFweCBzb2xpZCAjYmZkYmZlO2JvcmRlci1yYWRpdXM6NnB4O1wiIC8+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cImNhdGVnb3J5XCIgcGxhY2Vob2xkZXI9XCJDYXRlZ29yeVwiIGFyaWEtbGFiZWw9XCJOZXcgc2tpbGwgY2F0ZWdvcnlcIiBsaXN0PVwiJHtjYXRlZ29yeUxpc3RJZH1cIiBzdHlsZT1cInBhZGRpbmc6NnB4IDhweDtib3JkZXI6MXB4IHNvbGlkICNiZmRiZmU7Ym9yZGVyLXJhZGl1czo2cHg7XCIgLz5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBuYW1lPVwiZ3JvdXBcIiBwbGFjZWhvbGRlcj1cIkdyb3VwIGtleVwiIGFyaWEtbGFiZWw9XCJOZXcgc2tpbGwgZ3JvdXBcIiBzdHlsZT1cInBhZGRpbmc6NnB4IDhweDtib3JkZXI6MXB4IHNvbGlkICNiZmRiZmU7Ym9yZGVyLXJhZGl1czo2cHg7XCIgLz5cbiAgICAgICAgICA8c2VsZWN0IG5hbWU9XCJwcm9maWNpZW5jeVwiIGFyaWEtbGFiZWw9XCJOZXcgc2tpbGwgcHJvZmljaWVuY3lcIiBzdHlsZT1cInBhZGRpbmc6NnB4IDhweDtib3JkZXI6MXB4IHNvbGlkICNiZmRiZmU7Ym9yZGVyLXJhZGl1czo2cHg7XCI+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+Tm8gcHJvZmljaWVuY3kgbGFiZWw8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJiZWdpbm5lclwiPkJlZ2lubmVyPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiZmFtaWxpYXJcIj5GYW1pbGlhcjwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImludGVybWVkaWF0ZVwiPkludGVybWVkaWF0ZTwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImFkdmFuY2VkXCI+QWR2YW5jZWQ8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJleHBlcnRcIj5FeHBlcnQ8L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBuYW1lPVwic3Vic2tpbGxzXCIgcGxhY2Vob2xkZXI9XCJTdWItc2tpbGxzXCIgYXJpYS1sYWJlbD1cIk5ldyBza2lsbCBzdWItc2tpbGxzXCIgc3R5bGU9XCJwYWRkaW5nOjZweCA4cHg7Ym9yZGVyOjFweCBzb2xpZCAjYmZkYmZlO2JvcmRlci1yYWRpdXM6NnB4O1wiIC8+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cInBhcmVudGhldGljYWxcIiBwbGFjZWhvbGRlcj1cIlBhcmVudGhldGljYWwgbm90ZVwiIGFyaWEtbGFiZWw9XCJOZXcgc2tpbGwgcGFyZW50aGV0aWNhbFwiIHN0eWxlPVwicGFkZGluZzo2cHggOHB4O2JvcmRlcjoxcHggc29saWQgI2JmZGJmZTtib3JkZXItcmFkaXVzOjZweDtcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6OHB4O2p1c3RpZnktY29udGVudDpmbGV4LWVuZDttYXJnaW4tdG9wOjEwcHg7XCI+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidWxrLWJ0biBidWxrLWV4Y2x1ZGVcIiBpZD1cImNhbmNlbC1hZGQtc2tpbGxcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBjbGFzcz1cImJ1bGstYnRuIGJ1bGstaW5jbHVkZVwiPlNhdmUgU2tpbGw8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Zvcm0+XG4gICAgPC9kaXY+XG4gICAgJHtfYnVpbGRTa2lsbENhdGVnb3J5TWFuYWdlckh0bWwoKX1cbiAgICA8ZGF0YWxpc3QgaWQ9XCIke2NhdGVnb3J5TGlzdElkfVwiPlxuICAgICAgJHtjYXRlZ29yeVN1Z2dlc3Rpb25zLm1hcChjYXRlZ29yeSA9PiBgPG9wdGlvbiB2YWx1ZT1cIiR7ZXNjYXBlSHRtbChjYXRlZ29yeSl9XCI+PC9vcHRpb24+YCkuam9pbignJyl9XG4gICAgPC9kYXRhbGlzdD5cbiAgICA8dGFibGUgaWQ9XCJza2lsbHMtcmV2aWV3LXRhYmxlXCIgY2xhc3M9XCJyZXZpZXctdGFibGVcIj5cbiAgICAgIDx0aGVhZD5cbiAgICAgICAgPHRyPlxuICAgICAgICAgIDx0aD5Ta2lsbDwvdGg+XG4gICAgICAgICAgPHRoPkNhdGVnb3J5PC90aD5cbiAgICAgICAgICA8dGg+R3JvdXA8L3RoPlxuICAgICAgICAgIDx0aD5Qcm9maWNpZW5jeTwvdGg+XG4gICAgICAgICAgPHRoPlN1Yi1za2lsbHM8L3RoPlxuICAgICAgICAgIDx0aD5QYXJlbnRoZXRpY2FsPC90aD5cbiAgICAgICAgICA8dGg+UmVjb21tZW5kYXRpb248L3RoPlxuICAgICAgICAgIDx0aD5Db25maWRlbmNlPC90aD5cbiAgICAgICAgICA8dGg+UmVhc29uaW5nPC90aD5cbiAgICAgICAgICA8dGg+TWF0Y2hlZCBFeHBlcmllbmNlczwvdGg+XG4gICAgICAgICAgPHRoPllvdXIgU2VsZWN0aW9uPC90aD5cbiAgICAgICAgPC90cj5cbiAgICAgIDwvdGhlYWQ+XG4gICAgICA8dGJvZHk+XG4gIGA7XG5cbiAgY29uc3QgYWxsRXhwZXJpZW5jZXMgPSBBcnJheS5pc0FycmF5KHdpbmRvdy5fYWxsRXhwZXJpZW5jZXMpID8gd2luZG93Ll9hbGxFeHBlcmllbmNlcyA6IFtdO1xuICBjb25zdCBzYXZlZE1hdGNoZXMgPSAod2luZG93Ll9zYXZlZERlY2lzaW9ucyAmJiB3aW5kb3cuX3NhdmVkRGVjaXNpb25zLmV4dHJhX3NraWxsX21hdGNoZXMpIHx8IHt9O1xuXG4gIGNvbnN0IGRlcml2ZU1hdGNoZXMgPSAoc2tpbGxOYW1lKSA9PiB7XG4gICAgY29uc3QgbmVlZGxlID0gc2tpbGxOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgaWRzID0gW107XG4gICAgYWxsRXhwZXJpZW5jZXMuZm9yRWFjaCgoZXhwKSA9PiB7XG4gICAgICBpZiAoIWV4cCB8fCB0eXBlb2YgZXhwICE9PSAnb2JqZWN0JykgcmV0dXJuO1xuICAgICAgY29uc3QgYWNoID0gQXJyYXkuaXNBcnJheShleHAuYWNoaWV2ZW1lbnRzKSA/IGV4cC5hY2hpZXZlbWVudHMuam9pbignICcpIDogJyc7XG4gICAgICBjb25zdCBoYXlzdGFjayA9IFtleHAudGl0bGUgfHwgJycsIGV4cC5jb21wYW55IHx8ICcnLCBhY2hdLmpvaW4oJyAnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKGhheXN0YWNrLmluY2x1ZGVzKG5lZWRsZSkgJiYgZXhwLmlkKSBpZHMucHVzaChleHAuaWQpO1xuICAgIH0pO1xuICAgIHJldHVybiBpZHM7XG4gIH07XG5cbiAgc2tpbGxzLmZvckVhY2goKHNraWxsLCByb3dJZHgpID0+IHtcbiAgICBjb25zdCBza2lsbE5hbWUgICAgICAgICAgICA9IHR5cGVvZiBza2lsbCA9PT0gJ3N0cmluZycgPyBza2lsbCA6IHNraWxsLm5hbWUgfHwgc2tpbGw7XG4gICAgY29uc3QgaXNOZXcgICAgICAgICAgICAgICAgPSAoc2tpbGwuX2lzTmV3ID09PSB0cnVlKTtcbiAgICBjb25zdCBpc0NhbmRpZGF0ZVRvQ29uZmlybSA9IHR5cGVvZiBza2lsbCA9PT0gJ29iamVjdCcgJiYgc2tpbGwuY2FuZGlkYXRlX3RvX2NvbmZpcm0gPT09IHRydWU7XG4gICAgY29uc3QgaXNSZWNvbW1lbmRlZCAgICAgICAgPSByZWNvbW1lbmRlZFNldC5oYXMoc2tpbGxOYW1lKTtcbiAgICBjb25zdCByZWNvbW1lbmRhdGlvbiA9IGdldFNraWxsUmVjb21tZW5kYXRpb24oc2tpbGxOYW1lLCBkYXRhKTtcbiAgICBjb25zdCBjb25maWRlbmNlICAgICA9IGdldFNraWxsQ29uZmlkZW5jZShza2lsbE5hbWUsIGRhdGEpO1xuICAgIGNvbnN0IHJlYXNvbmluZyAgICAgID0gZ2V0U2tpbGxSZWFzb25pbmcoc2tpbGxOYW1lLCBkYXRhKTtcbiAgICBjb25zdCBza2lsbFJlYyAgICAgICA9IF9maW5kU2tpbGxSZWNvbW1lbmRhdGlvblJlY29yZChza2lsbE5hbWUsIGRhdGEpO1xuICAgIGNvbnN0IGdyb3VwaW5nU3VnZ2VzdGlvbiA9IF9idWlsZFNraWxsR3JvdXBpbmdTdWdnZXN0aW9uKHNraWxsUmVjLCBza2lsbCk7XG4gICAgY29uc3QgZGVmYXVsdEFjdGlvbiAgPSB1c2VyU2VsZWN0aW9ucy5za2lsbHNbc2tpbGxOYW1lXSB8fCAnaW5jbHVkZSc7XG4gICAgY29uc3QgaXNGaXJzdCAgICAgICAgPSByb3dJZHggPT09IDA7XG4gICAgY29uc3QgaXNMYXN0ICAgICAgICAgPSByb3dJZHggPT09IHNraWxscy5sZW5ndGggLSAxO1xuICAgIGNvbnN0IHNraWxsTmFtZUVzYyAgID0gZXNjYXBlSHRtbChza2lsbE5hbWUpO1xuXG4gICAgY29uc3QgZ3JvdXBLZXkgPSB0eXBlb2Ygc2tpbGwgPT09ICdvYmplY3QnID8gKHNraWxsLmdyb3VwIHx8ICcnKSA6ICcnO1xuICAgIGNvbnN0IGdyb3VwV2FybmluZyA9IGdyb3VwV2FybmluZ3MuZ2V0KGdyb3VwS2V5KTtcbiAgICBjb25zdCBjYXRlZ29yeUtleSA9IHR5cGVvZiBza2lsbCA9PT0gJ29iamVjdCcgPyAoc2tpbGwuY2F0ZWdvcnkgfHwgJycpIDogJyc7XG4gICAgY29uc3QgcHJvZmljaWVuY3lLZXkgPSB0eXBlb2Ygc2tpbGwgPT09ICdvYmplY3QnID8gU3RyaW5nKHNraWxsLnByb2ZpY2llbmN5IHx8ICcnKS50cmltKCkgOiAnJztcbiAgICBjb25zdCBzdWJza2lsbHMgPSB0eXBlb2Ygc2tpbGwgPT09ICdvYmplY3QnXG4gICAgICA/IEFycmF5LmlzQXJyYXkoc2tpbGwuc3Vic2tpbGxzKVxuICAgICAgICA/IHNraWxsLnN1YnNraWxsc1xuICAgICAgICA6IEFycmF5LmlzQXJyYXkoc2tpbGwuc3ViX3NraWxscylcbiAgICAgICAgICA/IHNraWxsLnN1Yl9za2lsbHNcbiAgICAgICAgICA6IFtdXG4gICAgICA6IFtdO1xuICAgIGNvbnN0IHBhcmVudGhldGljYWxLZXkgPSB0eXBlb2Ygc2tpbGwgPT09ICdvYmplY3QnID8gU3RyaW5nKHNraWxsLnBhcmVudGhldGljYWwgfHwgJycpLnRyaW0oKSA6ICcnO1xuXG4gICAgY29uc3QgbmV3QmFkZ2UgPSBpc05ld1xuICAgICAgPyAoc2tpbGwuX2lzVXNlckNyZWF0ZWRcbiAgICAgICAgPyAnPHNwYW4gdGl0bGU9XCJBZGRlZCBmb3IgdGhpcyBzZXNzaW9uIG9ubHlcIiBzdHlsZT1cIm1hcmdpbi1sZWZ0OjZweDtmb250LXNpemU6MTBweDtjb2xvcjojMGY3NjZlO2JvcmRlcjoxcHggc29saWQgIzBmNzY2ZTtib3JkZXItcmFkaXVzOjNweDtwYWRkaW5nOjFweCA1cHg7Y3Vyc29yOmhlbHA7XCI+U2Vzc2lvbiBvbmx5PC9zcGFuPidcbiAgICAgICAgOiAnPHNwYW4gdGl0bGU9XCJBSSBzdWdnZXN0ZWQgXHUyMDE0IG5vdCB5ZXQgaW4gQ1YgcHJvZmlsZVwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6NnB4O2ZvbnQtc2l6ZToxMHB4O2NvbG9yOiNkYzc5MDA7Ym9yZGVyOjFweCBzb2xpZCAjZGM3OTAwO2JvcmRlci1yYWRpdXM6M3B4O3BhZGRpbmc6MXB4IDVweDtjdXJzb3I6aGVscDtcIj5cdTI2QTAgTm90IGluIENWIHByb2ZpbGU8L3NwYW4+JylcbiAgICAgIDogJyc7XG4gICAgY29uc3QgX2V2aWRlbmNlVGV4dCA9IGlzQ2FuZGlkYXRlVG9Db25maXJtICYmIHR5cGVvZiBza2lsbCA9PT0gJ29iamVjdCcgPyBTdHJpbmcoc2tpbGwuZXZpZGVuY2UgfHwgJycpLnRyaW0oKSA6ICcnO1xuICAgIGNvbnN0IF9ldmlkZW5jZUZhbGxiYWNrID0gJ0NvbmZpcm0gdGhpcyBza2lsbCBpcyBnZW51aW5lbHkgZGVtb25zdHJhdGVkIGluIHlvdXIgZXhwZXJpZW5jZSBiZWZvcmUgaW5jbHVkaW5nIGl0Lic7XG4gICAgY29uc3QgX2V2aWRlbmNlVGlwID0gX2V2aWRlbmNlVGV4dCA/IGBXZWFrIGV2aWRlbmNlIFx1MjAxNCAke19ldmlkZW5jZVRleHR9YCA6IGBXZWFrIGV2aWRlbmNlIFx1MjAxNCAke19ldmlkZW5jZUZhbGxiYWNrfWA7XG4gICAgY29uc3QgY2FuZGlkYXRlQmFkZ2UgPSBpc0NhbmRpZGF0ZVRvQ29uZmlybVxuICAgICAgPyBgPHNwYW4gdGl0bGU9XCIke2VzY2FwZUh0bWwoX2V2aWRlbmNlVGlwKX1cIiBhcmlhLWxhYmVsPVwiJHtlc2NhcGVIdG1sKF9ldmlkZW5jZVRpcCl9XCIgc3R5bGU9XCJtYXJnaW4tbGVmdDo2cHg7Zm9udC1zaXplOjEwcHg7Y29sb3I6IzlmMTIzOTtib3JkZXI6MXB4IHNvbGlkICM5ZjEyMzk7Ym9yZGVyLXJhZGl1czozcHg7cGFkZGluZzoxcHggNXB4O2N1cnNvcjpoZWxwO1wiPlx1MjZBMCAke19ldmlkZW5jZVRleHQgPyAnV2VhayBldmlkZW5jZScgOiAnVmVyaWZ5IGV2aWRlbmNlJ308L3NwYW4+YFxuICAgICAgOiAnJztcbiAgICBjb25zdCBldmlkZW5jZU5vdGUgPSBpc0NhbmRpZGF0ZVRvQ29uZmlybSAmJiBfZXZpZGVuY2VUZXh0XG4gICAgICA/IGA8c21hbGwgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO21hcmdpbi10b3A6M3B4O2ZvbnQtc2l6ZTowLjc4ZW07Y29sb3I6IzlmMTIzOTtcIj4ke2VzY2FwZUh0bWwoX2V2aWRlbmNlVGV4dCl9PC9zbWFsbD5gXG4gICAgICA6ICcnO1xuICAgIGNvbnN0IHJlcnVuTmV3QmFkZ2UgPSBuZXdSZWNvbW1lbmRlZFNraWxscy5oYXMoc2tpbGxOYW1lKVxuICAgICAgPyAnPHNwYW4gY2xhc3M9XCJydy1jaGFuZ2UtYmFkZ2UgcnctY2hhbmdlLW5ld1wiIGFyaWEtbGFiZWw9XCJOZXcgcmVjb21tZW5kYXRpb24gc2luY2UgcHJldmlvdXMgcnVuXCI+XHVEODNDXHVERDk1IE5ldzwvc3Bhbj4nXG4gICAgICA6ICcnO1xuICAgIGNvbnN0IHNraWxsTmFtZUxvd2VyICA9IHNraWxsTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IF90eXBlT3ZlcnJpZGUgICA9ICh3aW5kb3cuX3NraWxsVHlwZU92ZXJyaWRlcyB8fCB7fSlbc2tpbGxOYW1lTG93ZXJdO1xuICAgIGNvbnN0IF9iYXNlVHlwZSAgICAgICA9IGhhcmRTa2lsbFNldC5oYXMoc2tpbGxOYW1lTG93ZXIpID8gJ2hhcmQnXG4gICAgICA6IHNvZnRTa2lsbFNldD8uaGFzKHNraWxsTmFtZUxvd2VyKSA/ICdzb2Z0JyA6IG51bGw7XG4gICAgY29uc3QgX2VmZmVjdGl2ZVR5cGUgID0gX3R5cGVPdmVycmlkZSB8fCBfYmFzZVR5cGU7XG4gICAgY29uc3QgX2lzT3ZlcnJpZGRlbiAgID0gISFfdHlwZU92ZXJyaWRlICYmIF90eXBlT3ZlcnJpZGUgIT09IF9iYXNlVHlwZTtcbiAgICBjb25zdCBfdG9nZ2xlVGFyZ2V0ICAgPSBfZWZmZWN0aXZlVHlwZSA9PT0gJ2hhcmQnID8gJ3NvZnQnXG4gICAgICA6IF9lZmZlY3RpdmVUeXBlID09PSAnc29mdCcgPyBudWxsIDogJ2hhcmQnO1xuICAgIGNvbnN0IF9iYWRnZVRpdGxlICAgICA9IF9pc092ZXJyaWRkZW5cbiAgICAgID8gYFVzZXIgb3ZlcnJpZGU6ICR7X2VmZmVjdGl2ZVR5cGV9IChvcmlnaW5hbDogJHtfYmFzZVR5cGUgfHwgJ25vbmUnfSkgXHUyMDE0IGNsaWNrIHRvIGN5Y2xlYFxuICAgICAgOiBfZWZmZWN0aXZlVHlwZVxuICAgICAgICA/IGAke19lZmZlY3RpdmVUeXBlID09PSAnaGFyZCcgPyAnUmVxdWlyZWQnIDogJ05pY2UtdG8taGF2ZSd9IHBlciBqb2IgZGVzY3JpcHRpb24gXHUyMDE0IGNsaWNrIHRvIG92ZXJyaWRlYFxuICAgICAgICA6ICdOb3QgY2xhc3NpZmllZCBcdTIwMTQgY2xpY2sgdG8gbWFyayBhcyBIYXJkJztcbiAgICBjb25zdCBfYmFkZ2VTdHlsZSAgICAgPSBfZWZmZWN0aXZlVHlwZSA9PT0gJ2hhcmQnXG4gICAgICA/IGBtYXJnaW4tbGVmdDo1cHg7Zm9udC1zaXplOjEwcHg7Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOiMxZDRlZDg7YmFja2dyb3VuZDojZGJlYWZlO2JvcmRlci1yYWRpdXM6M3B4O3BhZGRpbmc6MXB4IDVweDtjdXJzb3I6cG9pbnRlcjske19pc092ZXJyaWRkZW4gPyAnb3V0bGluZToycHggc29saWQgIzFkNGVkODtvdXRsaW5lLW9mZnNldDoxcHg7JyA6ICcnfWBcbiAgICAgIDogX2VmZmVjdGl2ZVR5cGUgPT09ICdzb2Z0J1xuICAgICAgICA/IGBtYXJnaW4tbGVmdDo1cHg7Zm9udC1zaXplOjEwcHg7Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOiM2YjIxYTg7YmFja2dyb3VuZDojZjNlOGZmO2JvcmRlci1yYWRpdXM6M3B4O3BhZGRpbmc6MXB4IDVweDtjdXJzb3I6cG9pbnRlcjske19pc092ZXJyaWRkZW4gPyAnb3V0bGluZToycHggc29saWQgIzZiMjFhODtvdXRsaW5lLW9mZnNldDoxcHg7JyA6ICcnfWBcbiAgICAgICAgOiAnbWFyZ2luLWxlZnQ6NXB4O2ZvbnQtc2l6ZToxMHB4O2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjojNmI3MjgwO2JhY2tncm91bmQ6I2YzZjRmNjtib3JkZXItcmFkaXVzOjNweDtwYWRkaW5nOjFweCA1cHg7Y3Vyc29yOnBvaW50ZXI7Ym9yZGVyOjFweCBkYXNoZWQgIzljYTNhZjsnO1xuICAgIGNvbnN0IF9iYWRnZUxhYmVsICAgICA9IF9lZmZlY3RpdmVUeXBlID8gKF9lZmZlY3RpdmVUeXBlID09PSAnaGFyZCcgPyAnSGFyZCcgOiAnU29mdCcpIDogJysgVHlwZSc7XG4gICAgY29uc3Qgc2tpbGxUeXBlQmFkZ2UgID0gYDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2tpbGwtdHlwZS10b2dnbGVcIiBkYXRhLXNraWxsPVwiJHtza2lsbE5hbWVFc2N9XCIgZGF0YS10b2dnbGUtdG89XCIke190b2dnbGVUYXJnZXQgfHwgJyd9XCIgdGl0bGU9XCIke19iYWRnZVRpdGxlfVwiIHN0eWxlPVwiJHtfYmFkZ2VTdHlsZX1cIiBhcmlhLWxhYmVsPVwiU2tpbGwgdHlwZTogJHtfZWZmZWN0aXZlVHlwZSB8fCAndW5jbGFzc2lmaWVkJ30sIGNsaWNrIHRvIHRvZ2dsZVwiPiR7X2JhZGdlTGFiZWx9PC9idXR0b24+YDtcbiAgICBjb25zdCByZWNvbW1lbmRhdGlvblRleHQgPSByZWNvbW1lbmRhdGlvbiB8fCAoc2tpbGwuX2lzVXNlckNyZWF0ZWQgPyAnSW5jbHVkZSAoc2Vzc2lvbi1hZGRlZCknIDogKGlzTmV3ID8gJ0luY2x1ZGUgKEFJIHN1Z2dlc3RlZCknIDogJ09taXQnKSk7XG4gICAgY29uc3QgY29uZmlkZW5jZUJhZGdlICAgID0gYDxzcGFuIGNsYXNzPVwiY29uZmlkZW5jZS1iYWRnZSBjb25maWRlbmNlLSR7Y29uZmlkZW5jZS5sZXZlbH1cIj4ke2NvbmZpZGVuY2UudGV4dH08L3NwYW4+YDtcbiAgICBjb25zdCByZWFzb25pbmdUZXh0ICAgICAgPSByZWFzb25pbmcgfHwgKHNraWxsLl9pc1VzZXJDcmVhdGVkXG4gICAgICA/ICdZb3UgYWRkZWQgdGhpcyBza2lsbCBmb3IgdGhlIGN1cnJlbnQgQ1Ygc2Vzc2lvbiBvbmx5LidcbiAgICAgIDogKGlzTmV3XG4gICAgICAgID8gJ1JlY29tbWVuZGVkIGJ5IEFJIGJhc2VkIG9uIGpvYiByZXF1aXJlbWVudHMgYnV0IG5vdCBjdXJyZW50bHkgaW4geW91ciBtYXN0ZXIgQ1YuJ1xuICAgICAgICA6ICdUaGlzIHNraWxsIHdhcyBub3Qgc3BlY2lmaWNhbGx5IG1lbnRpb25lZCBpbiB0aGUgam9iIHJlcXVpcmVtZW50cy4nKSk7XG4gICAgY29uc3QgZ3JvdXBpbmdDaGFuZ2VUZXh0ID0gZ3JvdXBpbmdTdWdnZXN0aW9uPy5jaGFuZ2VUZXh0IHx8ICcnO1xuICAgIGNvbnN0IGdyb3VwaW5nUmVhc29uVGV4dCA9IGdyb3VwaW5nU3VnZ2VzdGlvbj8ucmVhc29uaW5nIHx8ICcnO1xuICAgIGNvbnN0IGdyb3VwaW5nQXRzSW1wYWN0ID0gZ3JvdXBpbmdTdWdnZXN0aW9uPy5hdHNJbXBhY3QgfHwgJyc7XG4gICAgY29uc3QgZ3JvdXBpbmdQYWdlSW1wYWN0ID0gZ3JvdXBpbmdTdWdnZXN0aW9uPy5wYWdlTGVuZ3RoSW1wYWN0IHx8ICcnO1xuICAgIGNvbnN0IHJlYXNvbmluZ1NlZ21lbnRzID0gW3JlYXNvbmluZ1RleHRdO1xuICAgIGlmIChncm91cGluZ0NoYW5nZVRleHQpIHJlYXNvbmluZ1NlZ21lbnRzLnB1c2goYENoYW5nZTogJHtncm91cGluZ0NoYW5nZVRleHR9YCk7XG4gICAgaWYgKGdyb3VwaW5nUmVhc29uVGV4dCkgcmVhc29uaW5nU2VnbWVudHMucHVzaChncm91cGluZ1JlYXNvblRleHQpO1xuICAgIGlmIChncm91cGluZ0F0c0ltcGFjdCkgcmVhc29uaW5nU2VnbWVudHMucHVzaChgQVRTIGltcGFjdDogJHtncm91cGluZ0F0c0ltcGFjdH1gKTtcbiAgICBpZiAoZ3JvdXBpbmdQYWdlSW1wYWN0KSByZWFzb25pbmdTZWdtZW50cy5wdXNoKGBQYWdlIGxlbmd0aCBpbXBhY3Q6ICR7Z3JvdXBpbmdQYWdlSW1wYWN0fWApO1xuICAgIGNvbnN0IGZ1bGxSZWFzb25pbmdUZXh0ID0gcmVhc29uaW5nU2VnbWVudHMuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgICBjb25zdCByb3dTdHlsZSAgICAgICAgICAgPSBpc05ldyA/ICdiYWNrZ3JvdW5kOiNmZmZiZWI7JyA6ICcnO1xuICAgIGNvbnN0IGRlZmF1bHRNYXRjaGVzID0gaXNOZXcgPyAoc2F2ZWRNYXRjaGVzW3NraWxsTmFtZV0gfHwgZGVyaXZlTWF0Y2hlcyhza2lsbE5hbWUpKSA6IFtdO1xuICAgIGNvbnN0IG1hdGNoVmFsdWUgPSBkZWZhdWx0TWF0Y2hlcy5qb2luKCcsICcpO1xuICAgIGNvbnN0IG1hdGNoSGVscCA9IGlzTmV3XG4gICAgICA/ICdDb21tYS1zZXBhcmF0ZWQgZXhwZXJpZW5jZSBJRHMuIEF1dG8tZGVyaXZlZDsgeW91IGNhbiBlZGl0IGJlZm9yZSBzdWJtaXQuJ1xuICAgICAgOiAnT25seSB1c2VkIGZvciBBSS1zdWdnZXN0ZWQgc2tpbGxzLic7XG4gICAgY29uc3QgZGVyaXZlZFllYXJzID0gaXNOZXcgPyBfY29tcHV0ZVllYXJzRnJvbUlkcyhkZWZhdWx0TWF0Y2hlcywgYWxsRXhwZXJpZW5jZXMpIDogbnVsbDtcbiAgICBjb25zdCB5ZWFyc0hpbnQgPSBkZXJpdmVkWWVhcnMgIT0gbnVsbFxuICAgICAgPyBgfiR7ZGVyaXZlZFllYXJzfSB5ciR7ZGVyaXZlZFllYXJzID09PSAxID8gJycgOiAncyd9YFxuICAgICAgOiAoaXNOZXcgPyAnbm8gbWF0Y2gnIDogJycpO1xuXG4gICAgdGFibGVIVE1MICs9IGBcbiAgICAgIDx0ciBkYXRhLXNraWxsPVwiJHtza2lsbE5hbWVFc2N9XCIgc3R5bGU9XCIke3Jvd1N0eWxlfVwiPlxuICAgICAgICA8dGQ+PHN0cm9uZz4ke3NraWxsTmFtZUVzY308L3N0cm9uZz4ke3NraWxsVHlwZUJhZGdlfSR7cmVydW5OZXdCYWRnZX0ke25ld0JhZGdlfSR7Y2FuZGlkYXRlQmFkZ2V9JHtldmlkZW5jZU5vdGV9PC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwibWluLXdpZHRoOjE0MHB4O1wiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwic2tpbGwtY2F0ZWdvcnktaW5wdXRcIiBkYXRhLXNraWxsPVwiJHtza2lsbE5hbWVFc2N9XCJcbiAgICAgICAgICAgIHZhbHVlPVwiJHtlc2NhcGVIdG1sKGNhdGVnb3J5S2V5KX1cIlxuICAgICAgICAgICAgbGlzdD1cIiR7Y2F0ZWdvcnlMaXN0SWR9XCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBQcm9ncmFtbWluZ1wiXG4gICAgICAgICAgICB0aXRsZT1cIlNlc3Npb24tb25seSBjYXRlZ29yeSBsYWJlbCB1c2VkIHdoZW4gZ3JvdXBpbmcgc2tpbGxzIGluIHRoZSBnZW5lcmF0ZWQgQ1ZcIlxuICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDoxMDAlO2ZvbnQtc2l6ZTowLjhlbTtwYWRkaW5nOjRweCA2cHg7Ym9yZGVyOjFweCBzb2xpZCAjZDFkNWRiO2JvcmRlci1yYWRpdXM6NHB4O1wiLz5cbiAgICAgICAgICAke2dyb3VwaW5nU3VnZ2VzdGlvbj8uY2F0ZWdvcnlDaGFuZ2VkID8gYDxkaXYgY2xhc3M9XCJza2lsbC1haS1oaW50XCIgc3R5bGU9XCJtYXJnaW4tdG9wOjRweDtmb250LXNpemU6MC43NWVtO2NvbG9yOiM0MzM4Y2E7XCI+XG4gICAgICAgICAgICBBSSBzdWdnZXN0aW9uOiAke2VzY2FwZUh0bWwoZ3JvdXBpbmdTdWdnZXN0aW9uLmNhdGVnb3J5KX1cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJza2lsbC1hcHBseS1haVwiIGRhdGEtc2tpbGw9XCIke3NraWxsTmFtZUVzY31cIiBkYXRhLWFpLWZpZWxkPVwiY2F0ZWdvcnlcIiBkYXRhLWFpLXZhbHVlPVwiJHtlc2NhcGVIdG1sKGdyb3VwaW5nU3VnZ2VzdGlvbi5jYXRlZ29yeSl9XCIgc3R5bGU9XCJtYXJnaW4tbGVmdDo2cHg7Ym9yZGVyOjFweCBzb2xpZCAjYzdkMmZlO2JhY2tncm91bmQ6I2VlZjJmZjtjb2xvcjojNDMzOGNhO2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6MXB4IDZweDtjdXJzb3I6cG9pbnRlcjtcIj5BcHBseTwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PmAgOiAnJ31cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwibWluLXdpZHRoOjEwMHB4O1wiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwic2tpbGwtZ3JvdXAtaW5wdXRcIiBkYXRhLXNraWxsPVwiJHtza2lsbE5hbWVFc2N9XCJcbiAgICAgICAgICAgIHZhbHVlPVwiJHtlc2NhcGVIdG1sKGdyb3VwS2V5KX1cIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIGNfZmFtaWx5XCJcbiAgICAgICAgICAgIHRpdGxlPVwiU2tpbGxzIHdpdGggdGhlIHNhbWUgZ3JvdXAga2V5IHJlbmRlciBhcyBvbmUgY29tbWEtc2VwYXJhdGVkIGJ1bGxldFwiXG4gICAgICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Zm9udC1zaXplOjAuOGVtO3BhZGRpbmc6NHB4IDZweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo0cHg7XCIvPlxuICAgICAgICAgICR7Z3JvdXBpbmdTdWdnZXN0aW9uPy5ncm91cENoYW5nZWQgPyBgPGRpdiBjbGFzcz1cInNraWxsLWFpLWhpbnRcIiBzdHlsZT1cIm1hcmdpbi10b3A6NHB4O2ZvbnQtc2l6ZTowLjc1ZW07Y29sb3I6IzQzMzhjYTtcIj5cbiAgICAgICAgICAgIEFJIHN1Z2dlc3Rpb246ICR7ZXNjYXBlSHRtbChncm91cGluZ1N1Z2dlc3Rpb24uZ3JvdXApfVxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNraWxsLWFwcGx5LWFpXCIgZGF0YS1za2lsbD1cIiR7c2tpbGxOYW1lRXNjfVwiIGRhdGEtYWktZmllbGQ9XCJncm91cFwiIGRhdGEtYWktdmFsdWU9XCIke2VzY2FwZUh0bWwoZ3JvdXBpbmdTdWdnZXN0aW9uLmdyb3VwKX1cIiBzdHlsZT1cIm1hcmdpbi1sZWZ0OjZweDtib3JkZXI6MXB4IHNvbGlkICNjN2QyZmU7YmFja2dyb3VuZDojZWVmMmZmO2NvbG9yOiM0MzM4Y2E7Ym9yZGVyLXJhZGl1czo0cHg7cGFkZGluZzoxcHggNnB4O2N1cnNvcjpwb2ludGVyO1wiPkFwcGx5PC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+YCA6ICcnfVxuICAgICAgICAgICR7Z3JvdXBXYXJuaW5nID8gYDxkaXYgY2xhc3M9XCJza2lsbC1ncm91cC13YXJuaW5nXCIgdGl0bGU9XCIke2VzY2FwZUh0bWwoZ3JvdXBXYXJuaW5nLnByZXZpZXcpfVwiIHN0eWxlPVwibWFyZ2luLXRvcDo0cHg7Zm9udC1zaXplOjAuNzVlbTtjb2xvcjojYjQ1MzA5O1wiPlx1MjZBMCAke2VzY2FwZUh0bWwoZ3JvdXBXYXJuaW5nLm1lc3NhZ2UpfTwvZGl2PmAgOiAnJ31cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwibWluLXdpZHRoOjEyMHB4O1wiPlxuICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJza2lsbC1wcm9maWNpZW5jeS1pbnB1dFwiIGRhdGEtc2tpbGw9XCIke3NraWxsTmFtZUVzY31cIlxuICAgICAgICAgICAgdGl0bGU9XCJTZXNzaW9uLW9ubHkgcHJvZmljaWVuY3kgbGFiZWwgdXNlZCB3aGVuIHJlbmRlcmluZyBpbmxpbmUgc2tpbGwgYnVsbGV0c1wiXG4gICAgICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Zm9udC1zaXplOjAuOGVtO3BhZGRpbmc6NHB4IDZweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo0cHg7XCI+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCIgJHshcHJvZmljaWVuY3lLZXkgPyAnc2VsZWN0ZWQnIDogJyd9Pk5vbmU8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJiZWdpbm5lclwiICR7cHJvZmljaWVuY3lLZXkgPT09ICdiZWdpbm5lcicgPyAnc2VsZWN0ZWQnIDogJyd9PkJlZ2lubmVyPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiZmFtaWxpYXJcIiAke3Byb2ZpY2llbmN5S2V5ID09PSAnZmFtaWxpYXInID8gJ3NlbGVjdGVkJyA6ICcnfT5GYW1pbGlhcjwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImludGVybWVkaWF0ZVwiICR7cHJvZmljaWVuY3lLZXkgPT09ICdpbnRlcm1lZGlhdGUnID8gJ3NlbGVjdGVkJyA6ICcnfT5JbnRlcm1lZGlhdGU8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJhZHZhbmNlZFwiICR7cHJvZmljaWVuY3lLZXkgPT09ICdhZHZhbmNlZCcgPyAnc2VsZWN0ZWQnIDogJyd9PkFkdmFuY2VkPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiZXhwZXJ0XCIgJHtwcm9maWNpZW5jeUtleSA9PT0gJ2V4cGVydCcgPyAnc2VsZWN0ZWQnIDogJyd9PkV4cGVydDwvb3B0aW9uPlxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJtaW4td2lkdGg6MTgwcHg7XCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJza2lsbC1zdWJza2lsbHMtaW5wdXRcIiBkYXRhLXNraWxsPVwiJHtza2lsbE5hbWVFc2N9XCJcbiAgICAgICAgICAgIHZhbHVlPVwiJHtlc2NhcGVIdG1sKHN1YnNraWxscy5qb2luKCcsICcpKX1cIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIFBhbmRhcywgTnVtUHlcIlxuICAgICAgICAgICAgdGl0bGU9XCJDb21tYS1zZXBhcmF0ZWQgc3ViLXNraWxscyB1c2VkIGluIGlubGluZSBza2lsbCBidWxsZXRzXCJcbiAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTtmb250LXNpemU6MC44ZW07cGFkZGluZzo0cHggNnB4O2JvcmRlcjoxcHggc29saWQgI2QxZDVkYjtib3JkZXItcmFkaXVzOjRweDtcIi8+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cIm1pbi13aWR0aDoxODBweDtcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cInNraWxsLXBhcmVudGhldGljYWwtaW5wdXRcIiBkYXRhLXNraWxsPVwiJHtza2lsbE5hbWVFc2N9XCJcbiAgICAgICAgICAgIHZhbHVlPVwiJHtlc2NhcGVIdG1sKHBhcmVudGhldGljYWxLZXkpfVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIk9wdGlvbmFsIGlubGluZSBub3RlXCJcbiAgICAgICAgICAgIHRpdGxlPVwiRnJlZS1mb3JtIHBhcmVudGhldGljYWwgb3ZlcnJpZGUgZm9yIHRoZSByZW5kZXJlZCBpbmxpbmUgc2tpbGwgbGFiZWxcIlxuICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDoxMDAlO2ZvbnQtc2l6ZTowLjhlbTtwYWRkaW5nOjRweCA2cHg7Ym9yZGVyOjFweCBzb2xpZCAjZDFkNWRiO2JvcmRlci1yYWRpdXM6NHB4O1wiLz5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkPjxzdHJvbmc+JHtlc2NhcGVIdG1sKHJlY29tbWVuZGF0aW9uVGV4dCl9PC9zdHJvbmc+PC90ZD5cbiAgICAgICAgPHRkPiR7Y29uZmlkZW5jZUJhZGdlfTwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cIm1heC13aWR0aDozMDBweDtcIj48c21hbGw+JHtlc2NhcGVIdG1sKGZ1bGxSZWFzb25pbmdUZXh0KX08L3NtYWxsPjwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cIm1pbi13aWR0aDoyNjBweDtcIj5cbiAgICAgICAgICAke2lzTmV3ID8gYDxpbnB1dFxuICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgY2xhc3M9XCJza2lsbC1tYXRjaC1pbnB1dFwiXG4gICAgICAgICAgICBkYXRhLXNraWxsPVwiJHtza2lsbE5hbWVFc2N9XCJcbiAgICAgICAgICAgIHZhbHVlPVwiJHtlc2NhcGVIdG1sKG1hdGNoVmFsdWUpfVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cImV4cF8xLCBleHBfMlwiXG4gICAgICAgICAgICB0aXRsZT1cIiR7ZXNjYXBlSHRtbChtYXRjaEhlbHApfVwiXG4gICAgICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Zm9udC1zaXplOjAuODVlbTtwYWRkaW5nOjZweCA4cHg7Ym9yZGVyOjFweCBzb2xpZCAjZDFkNWRiO2JvcmRlci1yYWRpdXM6NnB4O1wiXG4gICAgICAgICAgLz48c3BhbiBjbGFzcz1cImRlcml2ZWQteWVhcnMtaGludFwiIGRhdGEtc2tpbGw9XCIke3NraWxsTmFtZUVzY31cIiB0aXRsZT1cIkVzdGltYXRlZCB5ZWFycyBkZXJpdmVkIGZyb20gbWF0Y2hlZCBleHBlcmllbmNlIGVudHJpZXNcIiBzdHlsZT1cImRpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbi10b3A6NHB4O2ZvbnQtc2l6ZTowLjhlbTtjb2xvcjojNmI3MjgwO1wiPiR7ZXNjYXBlSHRtbCh5ZWFyc0hpbnQpfTwvc3Bhbj5gIDogJzxzcGFuIHN0eWxlPVwiY29sb3I6IzljYTNhZjtcIj5cdTIwMTQ8L3NwYW4+J31cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwiYWN0aW9uLWJ0bnNcIiBzdHlsZT1cIndoaXRlLXNwYWNlOm5vd3JhcDtcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG4gJHtkZWZhdWx0QWN0aW9uID09PSAnZW1waGFzaXplJyAgICA/ICdhY3RpdmUnIDogJyd9XCIgZGF0YS1hY3Rpb249XCJlbXBoYXNpemVcIiAgICBhcmlhLWxhYmVsPVwiRW1waGFzaXplICR7c2tpbGxOYW1lRXNjfVwiICAgIGFyaWEtcHJlc3NlZD1cIiR7ZGVmYXVsdEFjdGlvbiA9PT0gJ2VtcGhhc2l6ZSd9XCIgICAgdGl0bGU9XCJFbXBoYXNpemUgXHUyMDE0IGZlYXR1cmUgcHJvbWluZW50bHlcIiBzdHlsZT1cImNvbG9yOiMxMGI5ODE7XCI+XHUyNzk1PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuICR7ZGVmYXVsdEFjdGlvbiA9PT0gJ2luY2x1ZGUnICAgICAgPyAnYWN0aXZlJyA6ICcnfVwiIGRhdGEtYWN0aW9uPVwiaW5jbHVkZVwiICAgICAgYXJpYS1sYWJlbD1cIkluY2x1ZGUgJHtza2lsbE5hbWVFc2N9XCIgICAgICBhcmlhLXByZXNzZWQ9XCIke2RlZmF1bHRBY3Rpb24gPT09ICdpbmNsdWRlJ31cIiAgICAgIHRpdGxlPVwiSW5jbHVkZSBcdTIwMTQgc3RhbmRhcmQgbGlzdGluZ1wiPlx1MjcxMzwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0biAke2RlZmF1bHRBY3Rpb24gPT09ICdkZS1lbXBoYXNpemUnID8gJ2FjdGl2ZScgOiAnJ31cIiBkYXRhLWFjdGlvbj1cImRlLWVtcGhhc2l6ZVwiIGFyaWEtbGFiZWw9XCJEZS1lbXBoYXNpemUgJHtza2lsbE5hbWVFc2N9XCIgYXJpYS1wcmVzc2VkPVwiJHtkZWZhdWx0QWN0aW9uID09PSAnZGUtZW1waGFzaXplJ31cIiB0aXRsZT1cIkRlLWVtcGhhc2l6ZSBcdTIwMTQgYnJpZWYgbWVudGlvblwiICAgIHN0eWxlPVwiY29sb3I6I2Y1OWUwYjtcIj5cdTI3OTY8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG4gJHtkZWZhdWx0QWN0aW9uID09PSAnZXhjbHVkZScgICAgICA/ICdhY3RpdmUnIDogJyd9XCIgZGF0YS1hY3Rpb249XCJleGNsdWRlXCIgICAgICBhcmlhLWxhYmVsPVwiRXhjbHVkZSAke3NraWxsTmFtZUVzY31cIiAgICAgIGFyaWEtcHJlc3NlZD1cIiR7ZGVmYXVsdEFjdGlvbiA9PT0gJ2V4Y2x1ZGUnfVwiICAgICAgdGl0bGU9XCJFeGNsdWRlIFx1MjAxNCBvbWl0IGZyb20gQ1ZcIiAgICAgICAgICBzdHlsZT1cImNvbG9yOiNlZjQ0NDQ7XCI+JHtleWVTbGFzaEljb24oKX08L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBkYXRhLWFjdGlvbj1cInJvdy11cFwiICAgYXJpYS1sYWJlbD1cIk1vdmUgJHtza2lsbE5hbWVFc2N9IGVhcmxpZXJcIiB0aXRsZT1cIk1vdmUgdXBcIiAgICR7aXNGaXJzdCA/ICdkaXNhYmxlZCcgOiAnJ30+XHUyMTkxPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgZGF0YS1hY3Rpb249XCJyb3ctZG93blwiIGFyaWEtbGFiZWw9XCJNb3ZlICR7c2tpbGxOYW1lRXNjfSBsYXRlclwiICAgdGl0bGU9XCJNb3ZlIGRvd25cIiAke2lzTGFzdCAgPyAnZGlzYWJsZWQnIDogJyd9Plx1MjE5MzwvYnV0dG9uPlxuICAgICAgICA8L3RkPlxuICAgICAgPC90cj5cbiAgICBgO1xuICB9KTtcblxuICB0YWJsZUhUTUwgKz0gJzwvdGJvZHk+PC90YWJsZT4nO1xuICBjb250YWluZXIuaW5uZXJIVE1MID0gdGFibGVIVE1MO1xuXG4gIC8vIFNhdmUgZ3JvdXAga2V5IGZvciB0aGlzIHNlc3Npb24gd2hlbiB1c2VyIGZpbmlzaGVzIGVkaXRpbmdcbiAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5za2lsbC1jYXRlZ29yeS1tYW5hZ2VyJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGUgPT4ge1xuICAgIGNvbnN0IGNhdGVnb3J5TWFuYWdlcklucHV0ID0gZS50YXJnZXQuY2xvc2VzdCgnLnNraWxsLWNhdGVnb3J5LW1hbmFnZXItaW5wdXQnKTtcbiAgICBpZiAoY2F0ZWdvcnlNYW5hZ2VySW5wdXQpIHtcbiAgICAgIGNvbnN0IG1hbmFnZXJSb3cgPSBjYXRlZ29yeU1hbmFnZXJJbnB1dC5jbG9zZXN0KCcuc2tpbGwtY2F0ZWdvcnktbWFuYWdlci1yb3cnKTtcbiAgICAgIGNvbnN0IG9sZENhdGVnb3J5ID0gbWFuYWdlclJvdz8uZGF0YXNldC5jYXRlZ29yeSB8fCAnJztcbiAgICAgIGNvbnN0IG5ld0NhdGVnb3J5ID0gY2F0ZWdvcnlNYW5hZ2VySW5wdXQudmFsdWUudHJpbSgpO1xuICAgICAgaWYgKCFvbGRDYXRlZ29yeSB8fCAhbmV3Q2F0ZWdvcnkgfHwgb2xkQ2F0ZWdvcnkgPT09IG5ld0NhdGVnb3J5KSB7XG4gICAgICAgIGlmIChtYW5hZ2VyUm93KSBjYXRlZ29yeU1hbmFnZXJJbnB1dC52YWx1ZSA9IG9sZENhdGVnb3J5O1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBfcmVuYW1lU2tpbGxDYXRlZ29yeUxvY2FsbHkob2xkQ2F0ZWdvcnksIG5ld0NhdGVnb3J5KTtcbiAgICAgIHJlbmFtZVNraWxsQ2F0ZWdvcnkob2xkQ2F0ZWdvcnksIG5ld0NhdGVnb3J5KVxuICAgICAgICAudGhlbigoKSA9PiBfcmVuZGVyU2tpbGxzVGFibGUoY29udGFpbmVyLCByZWNvbW1lbmRlZFNldCwgZGF0YSwgaGFyZFNraWxsU2V0LCBzb2Z0U2tpbGxTZXQpKVxuICAgICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgIF9yZW5hbWVTa2lsbENhdGVnb3J5TG9jYWxseShuZXdDYXRlZ29yeSwgb2xkQ2F0ZWdvcnkpO1xuICAgICAgICAgIGlmIChtYW5hZ2VyUm93KSBjYXRlZ29yeU1hbmFnZXJJbnB1dC52YWx1ZSA9IG9sZENhdGVnb3J5O1xuICAgICAgICAgIHNob3dUb2FzdCgnRmFpbGVkIHRvIHJlbmFtZSBza2lsbCBjYXRlZ29yeS4nLCAnZXJyb3InKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9KTtcblxuICBjb250YWluZXIucXVlcnlTZWxlY3RvcignI3NraWxscy1yZXZpZXctdGFibGUgdGJvZHknKT8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZSA9PiB7XG4gICAgY29uc3QgY2F0ZWdvcnlJbnB1dCA9IGUudGFyZ2V0LmNsb3Nlc3QoJy5za2lsbC1jYXRlZ29yeS1pbnB1dCcpO1xuXG4gIGNvbnN0IGFkZFNraWxsRm9ybSA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcjYWRkLXNraWxsLWZvcm0nKTtcbiAgY29uc3QgdG9nZ2xlQWRkU2tpbGxGb3JtID0gKCkgPT4ge1xuICAgIGlmICghYWRkU2tpbGxGb3JtKSByZXR1cm47XG4gICAgYWRkU2tpbGxGb3JtLnN0eWxlLmRpc3BsYXkgPSBhZGRTa2lsbEZvcm0uc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnID8gJ2Jsb2NrJyA6ICdub25lJztcbiAgfTtcbiAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJyN0b2dnbGUtYWRkLXNraWxsLWZvcm0nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0b2dnbGVBZGRTa2lsbEZvcm0pO1xuICBjb250YWluZXIucXVlcnlTZWxlY3RvcignI2NhbmNlbC1hZGQtc2tpbGwnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgaWYgKCFhZGRTa2lsbEZvcm0pIHJldHVybjtcbiAgICBhZGRTa2lsbEZvcm0ucmVzZXQoKTtcbiAgICBhZGRTa2lsbEZvcm0uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgfSk7XG4gIGFkZFNraWxsRm9ybT8uYWRkRXZlbnRMaXN0ZW5lcignc3VibWl0JywgYXN5bmMgZSA9PiB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKGFkZFNraWxsRm9ybSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHNhdmVVc2VyQ3JlYXRlZFNraWxsKHtcbiAgICAgICAgbmFtZTogZm9ybURhdGEuZ2V0KCduYW1lJyksXG4gICAgICAgIGNhdGVnb3J5OiBmb3JtRGF0YS5nZXQoJ2NhdGVnb3J5JyksXG4gICAgICAgIGdyb3VwOiBmb3JtRGF0YS5nZXQoJ2dyb3VwJyksXG4gICAgICAgIHByb2ZpY2llbmN5OiBmb3JtRGF0YS5nZXQoJ3Byb2ZpY2llbmN5JyksXG4gICAgICAgIHN1YnNraWxsczogZm9ybURhdGEuZ2V0KCdzdWJza2lsbHMnKSxcbiAgICAgICAgcGFyZW50aGV0aWNhbDogZm9ybURhdGEuZ2V0KCdwYXJlbnRoZXRpY2FsJyksXG4gICAgICB9KTtcbiAgICAgIHNob3dUb2FzdCgnU2Vzc2lvbi1vbmx5IHNraWxsIGFkZGVkLicpO1xuICAgICAgYWRkU2tpbGxGb3JtLnJlc2V0KCk7XG4gICAgICBhZGRTa2lsbEZvcm0uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIF9yZW5kZXJTa2lsbHNUYWJsZShjb250YWluZXIsIHJlY29tbWVuZGVkU2V0LCBkYXRhLCBoYXJkU2tpbGxTZXQsIHNvZnRTa2lsbFNldCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHNob3dUb2FzdChlcnJvci5tZXNzYWdlIHx8ICdGYWlsZWQgdG8gYWRkIHNraWxsLicsICdlcnJvcicpO1xuICAgIH1cbiAgfSk7XG4gICAgaWYgKGNhdGVnb3J5SW5wdXQpIHtcbiAgICAgIGNvbnN0IHNraWxsTmFtZSA9IGNhdGVnb3J5SW5wdXQuZGF0YXNldC5za2lsbDtcbiAgICAgIGNvbnN0IG5ld0NhdGVnb3J5ID0gY2F0ZWdvcnlJbnB1dC52YWx1ZS50cmltKCk7XG4gICAgICBzYXZlU2tpbGxDYXRlZ29yeU92ZXJyaWRlKHNraWxsTmFtZSwgbmV3Q2F0ZWdvcnkpLmNhdGNoKCgpID0+IHtcbiAgICAgICAgc2hvd1RvYXN0KCdGYWlsZWQgdG8gc2F2ZSBza2lsbCBjYXRlZ29yeS4nLCAnZXJyb3InKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGlucHV0ID0gZS50YXJnZXQuY2xvc2VzdCgnLnNraWxsLWdyb3VwLWlucHV0Jyk7XG4gICAgaWYgKGlucHV0KSB7XG4gICAgICBjb25zdCBza2lsbE5hbWUgPSBpbnB1dC5kYXRhc2V0LnNraWxsO1xuICAgICAgY29uc3QgbmV3R3JvdXAgPSBpbnB1dC52YWx1ZS50cmltKCk7XG4gICAgICBzYXZlU2tpbGxHcm91cE92ZXJyaWRlKHNraWxsTmFtZSwgbmV3R3JvdXApLmNhdGNoKCgpID0+IHtcbiAgICAgICAgc2hvd1RvYXN0KCdGYWlsZWQgdG8gc2F2ZSBza2lsbCBncm91cC4nLCAnZXJyb3InKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHF1YWxpZmllcklucHV0ID0gZS50YXJnZXQuY2xvc2VzdCgnLnNraWxsLXByb2ZpY2llbmN5LWlucHV0LCAuc2tpbGwtc3Vic2tpbGxzLWlucHV0LCAuc2tpbGwtcGFyZW50aGV0aWNhbC1pbnB1dCcpO1xuICAgIGlmICghcXVhbGlmaWVySW5wdXQpIHJldHVybjtcbiAgICBjb25zdCBza2lsbE5hbWUgPSBxdWFsaWZpZXJJbnB1dC5kYXRhc2V0LnNraWxsO1xuICAgIGNvbnN0IHJvdyA9IHF1YWxpZmllcklucHV0LmNsb3Nlc3QoJ3RyW2RhdGEtc2tpbGxdJyk7XG4gICAgaWYgKCFza2lsbE5hbWUgfHwgIXJvdykgcmV0dXJuO1xuICAgIGNvbnN0IHByb2ZpY2llbmN5ID0gcm93LnF1ZXJ5U2VsZWN0b3IoJy5za2lsbC1wcm9maWNpZW5jeS1pbnB1dCcpPy52YWx1ZSB8fCAnJztcbiAgICBjb25zdCBzdWJza2lsbHNWYWx1ZSA9IHJvdy5xdWVyeVNlbGVjdG9yKCcuc2tpbGwtc3Vic2tpbGxzLWlucHV0Jyk/LnZhbHVlIHx8ICcnO1xuICAgIGNvbnN0IHBhcmVudGhldGljYWwgPSByb3cucXVlcnlTZWxlY3RvcignLnNraWxsLXBhcmVudGhldGljYWwtaW5wdXQnKT8udmFsdWUgfHwgJyc7XG4gICAgc2F2ZVNraWxsUXVhbGlmaWVyT3ZlcnJpZGUoc2tpbGxOYW1lLCB7XG4gICAgICBwcm9maWNpZW5jeSxcbiAgICAgIHN1YnNraWxsczogc3Vic2tpbGxzVmFsdWUsXG4gICAgICBwYXJlbnRoZXRpY2FsLFxuICAgIH0pLmNhdGNoKCgpID0+IHtcbiAgICAgIHNob3dUb2FzdCgnRmFpbGVkIHRvIHNhdmUgc2tpbGwgcXVhbGlmaWVycy4nLCAnZXJyb3InKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gVXBkYXRlIGRlcml2ZWQteWVhcnMgaGludCBsaXZlIGFzIHVzZXIgZWRpdHMgdGhlIGV4cGVyaWVuY2UgbWF0Y2ggaW5wdXRcbiAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJyNza2lsbHMtcmV2aWV3LXRhYmxlIHRib2R5Jyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgZSA9PiB7XG4gICAgY29uc3QgaW5wdXQgPSBlLnRhcmdldC5jbG9zZXN0KCcuc2tpbGwtbWF0Y2gtaW5wdXQnKTtcbiAgICBpZiAoIWlucHV0KSByZXR1cm47XG4gICAgY29uc3Qgc2tpbGxOYW1lID0gaW5wdXQuZGF0YXNldC5za2lsbDtcbiAgICBjb25zdCBpZHMgPSBpbnB1dC52YWx1ZS5zcGxpdCgnLCcpLm1hcCh4ID0+IHgudHJpbSgpKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgY29uc3QgeWVhcnMgPSBfY29tcHV0ZVllYXJzRnJvbUlkcyhpZHMsIGFsbEV4cGVyaWVuY2VzKTtcbiAgICBjb25zdCBoaW50ID0geWVhcnMgIT0gbnVsbCA/IGB+JHt5ZWFyc30geXIke3llYXJzID09PSAxID8gJycgOiAncyd9YCA6ICdubyBtYXRjaCc7XG4gICAgY29uc3Qgc3BhbiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKGAuZGVyaXZlZC15ZWFycy1oaW50W2RhdGEtc2tpbGw9XCIke0NTUy5lc2NhcGUoc2tpbGxOYW1lKX1cIl1gKTtcbiAgICBpZiAoc3Bhbikgc3Bhbi50ZXh0Q29udGVudCA9IGhpbnQ7XG4gIH0pO1xuXG4gIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcjc2tpbGxzLXJldmlldy10YWJsZSB0Ym9keScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGUgPT4ge1xuICAgIGNvbnN0IHR5cGVUb2dnbGUgPSBlLnRhcmdldC5jbG9zZXN0KCcuc2tpbGwtdHlwZS10b2dnbGUnKTtcbiAgICBpZiAodHlwZVRvZ2dsZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGNvbnN0IHNraWxsTmFtZSA9IHR5cGVUb2dnbGUuZGF0YXNldC5za2lsbDtcbiAgICAgIGNvbnN0IHRvZ2dsZVRvID0gdHlwZVRvZ2dsZS5kYXRhc2V0LnRvZ2dsZVRvIHx8IG51bGw7XG4gICAgICB3aW5kb3cuX3NraWxsVHlwZU92ZXJyaWRlcyA9IHdpbmRvdy5fc2tpbGxUeXBlT3ZlcnJpZGVzIHx8IHt9O1xuICAgICAgaWYgKHRvZ2dsZVRvKSB7XG4gICAgICAgIHdpbmRvdy5fc2tpbGxUeXBlT3ZlcnJpZGVzW3NraWxsTmFtZS50b0xvd2VyQ2FzZSgpXSA9IHRvZ2dsZVRvO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHdpbmRvdy5fc2tpbGxUeXBlT3ZlcnJpZGVzW3NraWxsTmFtZS50b0xvd2VyQ2FzZSgpXTtcbiAgICAgIH1cbiAgICAgIHNhdmVTa2lsbFF1YWxpZmllck92ZXJyaWRlKHNraWxsTmFtZSwge1xuICAgICAgICBwcm9maWNpZW5jeTogY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoYC5za2lsbC1wcm9maWNpZW5jeS1pbnB1dFtkYXRhLXNraWxsPVwiJHtfY3NzRXNjYXBlKHNraWxsTmFtZSl9XCJdYCk/LnZhbHVlIHx8ICcnLFxuICAgICAgICBzdWJza2lsbHM6IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKGAuc2tpbGwtc3Vic2tpbGxzLWlucHV0W2RhdGEtc2tpbGw9XCIke19jc3NFc2NhcGUoc2tpbGxOYW1lKX1cIl1gKT8udmFsdWUgfHwgJycsXG4gICAgICAgIHBhcmVudGhldGljYWw6IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKGAuc2tpbGwtcGFyZW50aGV0aWNhbC1pbnB1dFtkYXRhLXNraWxsPVwiJHtfY3NzRXNjYXBlKHNraWxsTmFtZSl9XCJdYCk/LnZhbHVlIHx8ICcnLFxuICAgICAgICBza2lsbF90eXBlOiB0b2dnbGVUbyB8fCAnJyxcbiAgICAgIH0pLnRoZW4oKCkgPT4gX3JlbmRlclNraWxsc1RhYmxlKGNvbnRhaW5lciwgcmVjb21tZW5kZWRTZXQsIGRhdGEsIGhhcmRTa2lsbFNldCwgc29mdFNraWxsU2V0KSlcbiAgICAgICAgLmNhdGNoKCgpID0+IHNob3dUb2FzdCgnRmFpbGVkIHRvIHNhdmUgc2tpbGwgdHlwZSBvdmVycmlkZS4nLCAnZXJyb3InKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYWlCdG4gPSBlLnRhcmdldC5jbG9zZXN0KCcuc2tpbGwtYXBwbHktYWknKTtcbiAgICBpZiAoYWlCdG4pIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBjb25zdCBza2lsbE5hbWUgPSBhaUJ0bi5kYXRhc2V0LnNraWxsO1xuICAgICAgY29uc3QgZmllbGQgPSBhaUJ0bi5kYXRhc2V0LmFpRmllbGQ7XG4gICAgICBjb25zdCB2YWx1ZSA9IGFpQnRuLmRhdGFzZXQuYWlWYWx1ZSB8fCAnJztcbiAgICAgIGlmIChmaWVsZCA9PT0gJ2NhdGVnb3J5Jykge1xuICAgICAgICBjb25zdCBpbnB1dCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKGAuc2tpbGwtY2F0ZWdvcnktaW5wdXRbZGF0YS1za2lsbD1cIiR7X2Nzc0VzY2FwZShza2lsbE5hbWUpfVwiXWApO1xuICAgICAgICBpZiAoaW5wdXQpIGlucHV0LnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHNhdmVTa2lsbENhdGVnb3J5T3ZlcnJpZGUoc2tpbGxOYW1lLCB2YWx1ZSlcbiAgICAgICAgICAudGhlbigoKSA9PiBfcmVuZGVyU2tpbGxzVGFibGUoY29udGFpbmVyLCByZWNvbW1lbmRlZFNldCwgZGF0YSwgaGFyZFNraWxsU2V0LCBzb2Z0U2tpbGxTZXQpKVxuICAgICAgICAgIC5jYXRjaCgoKSA9PiBzaG93VG9hc3QoJ0ZhaWxlZCB0byBhcHBseSBBSSBjYXRlZ29yeSBzdWdnZXN0aW9uLicsICdlcnJvcicpKTtcbiAgICAgIH0gZWxzZSBpZiAoZmllbGQgPT09ICdncm91cCcpIHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcihgLnNraWxsLWdyb3VwLWlucHV0W2RhdGEtc2tpbGw9XCIke19jc3NFc2NhcGUoc2tpbGxOYW1lKX1cIl1gKTtcbiAgICAgICAgaWYgKGlucHV0KSBpbnB1dC52YWx1ZSA9IHZhbHVlO1xuICAgICAgICBzYXZlU2tpbGxHcm91cE92ZXJyaWRlKHNraWxsTmFtZSwgdmFsdWUpXG4gICAgICAgICAgLnRoZW4oKCkgPT4gX3JlbmRlclNraWxsc1RhYmxlKGNvbnRhaW5lciwgcmVjb21tZW5kZWRTZXQsIGRhdGEsIGhhcmRTa2lsbFNldCwgc29mdFNraWxsU2V0KSlcbiAgICAgICAgICAuY2F0Y2goKCkgPT4gc2hvd1RvYXN0KCdGYWlsZWQgdG8gYXBwbHkgQUkgZ3JvdXAgc3VnZ2VzdGlvbi4nLCAnZXJyb3InKSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGJ0biA9IGUudGFyZ2V0LmNsb3Nlc3QoJy5pY29uLWJ0bicpO1xuICAgIGlmICghYnRuKSByZXR1cm47XG4gICAgY29uc3QgdHIgPSBidG4uY2xvc2VzdCgndHJbZGF0YS1za2lsbF0nKTtcbiAgICBpZiAoIXRyKSByZXR1cm47XG4gICAgY29uc3Qgc2tpbGxOYW1lID0gdHIuZGF0YXNldC5za2lsbDtcbiAgICBjb25zdCBhY3Rpb24gICAgPSBidG4uZGF0YXNldC5hY3Rpb247XG4gICAgaWYgKGFjdGlvbiA9PT0gJ3Jvdy11cCcpIHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBtb3ZlU2tpbGxSb3coc2tpbGxOYW1lLCAtMSk7XG4gICAgfSBlbHNlIGlmIChhY3Rpb24gPT09ICdyb3ctZG93bicpIHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBtb3ZlU2tpbGxSb3coc2tpbGxOYW1lLCArMSk7XG4gICAgfSBlbHNlIGlmIChhY3Rpb24pIHtcbiAgICAgIGhhbmRsZUFjdGlvbkNsaWNrKHNraWxsTmFtZSwgYWN0aW9uLCAnc2tpbGwnKTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcuc2tpbGwtY2F0ZWdvcnktbWFuYWdlcicpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGUgPT4ge1xuICAgIGNvbnN0IGJ0biA9IGUudGFyZ2V0LmNsb3Nlc3QoJy5pY29uLWJ0bltkYXRhLWFjdGlvbl49XCJjYXRlZ29yeS1cIl0nKTtcbiAgICBpZiAoIWJ0bikgcmV0dXJuO1xuICAgIGNvbnN0IGNhdGVnb3J5TmFtZSA9IGJ0bi5kYXRhc2V0LmNhdGVnb3J5IHx8ICcnO1xuICAgIGNvbnN0IGRpcmVjdGlvbiA9IGJ0bi5kYXRhc2V0LmFjdGlvbiA9PT0gJ2NhdGVnb3J5LXVwJyA/IC0xIDogMTtcbiAgICBjb25zdCB1cGRhdGVkT3JkZXIgPSBfbW92ZVNraWxsQ2F0ZWdvcnlMb2NhbGx5KGNhdGVnb3J5TmFtZSwgZGlyZWN0aW9uKTtcbiAgICBpZiAoIXVwZGF0ZWRPcmRlcikgcmV0dXJuO1xuICAgIHNhdmVTa2lsbENhdGVnb3J5T3JkZXIodXBkYXRlZE9yZGVyKVxuICAgICAgLnRoZW4oKCkgPT4gX3JlbmRlclNraWxsc1RhYmxlKGNvbnRhaW5lciwgcmVjb21tZW5kZWRTZXQsIGRhdGEsIGhhcmRTa2lsbFNldCwgc29mdFNraWxsU2V0KSlcbiAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgIF9tb3ZlU2tpbGxDYXRlZ29yeUxvY2FsbHkoY2F0ZWdvcnlOYW1lLCAtZGlyZWN0aW9uKTtcbiAgICAgICAgc2hvd1RvYXN0KCdGYWlsZWQgdG8gc2F2ZSBza2lsbCBjYXRlZ29yeSBvcmRlci4nLCAnZXJyb3InKTtcbiAgICAgIH0pO1xuICB9KTtcblxuICBjb25zdCBza2lsbFRvb2xiYXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgc2tpbGxUb29sYmFyLmNsYXNzTmFtZSA9ICdidWxrLXRvb2xiYXInO1xuICBza2lsbFRvb2xiYXIuaW5uZXJIVE1MID0gYFxuICAgIDxzcGFuPkJ1bGs6PC9zcGFuPlxuICAgIDxidXR0b24gY2xhc3M9XCJidWxrLWJ0biBidWxrLXJlY29tbWVuZGVkXCIgb25jbGljaz1cImJ1bGtBY3Rpb24oJ3JlY29tbWVuZGVkJywnc2tpbGwnKVwiIHRpdGxlPVwiU2V0IGFsbCB0byB0aGUgTExNIHJlY29tbWVuZGF0aW9uXCI+XHUyNzI4IEFjY2VwdCBBbGwgUmVjb21tZW5kZWQ8L2J1dHRvbj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnVsay1idG4gYnVsay1lbXBoYXNpemVcIiAgIG9uY2xpY2s9XCJidWxrQWN0aW9uKCdlbXBoYXNpemUnLCdza2lsbCcpXCI+XHUyNzk1IEVtcGhhc2l6ZSBBbGw8L2J1dHRvbj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnVsay1idG4gYnVsay1pbmNsdWRlXCIgICAgIG9uY2xpY2s9XCJidWxrQWN0aW9uKCdpbmNsdWRlJywnc2tpbGwnKVwiPlx1MjcxMyBJbmNsdWRlIEFsbDwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJidWxrLWJ0biBidWxrLWV4Y2x1ZGVcIiAgICAgb25jbGljaz1cImJ1bGtBY3Rpb24oJ2V4Y2x1ZGUnLCdza2lsbCcpXCI+JHtleWVTbGFzaEljb24oKX0gRXhjbHVkZSBBbGw8L2J1dHRvbj5cbiAgYDtcbiAgY29udGFpbmVyLmluc2VydEJlZm9yZShza2lsbFRvb2xiYXIsIGNvbnRhaW5lci5maXJzdENoaWxkKTtcblxuICAkKCcjc2tpbGxzLXJldmlldy10YWJsZScpLkRhdGFUYWJsZSh7XG4gICAgcGFnaW5nOiBmYWxzZSxcbiAgICBvcmRlcjogW10sXG4gICAgbGFuZ3VhZ2U6IHsgc2VhcmNoOiAnRmlsdGVyIHNraWxsczonIH1cbiAgfSk7XG4gIF91cGRhdGVQYWdlRXN0aW1hdGUoKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFJvdyByZW9yZGVyIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBtb3ZlU2tpbGxSb3coc2tpbGxOYW1lLCBkaXJlY3Rpb24pIHtcbiAgY29uc3QgYXJyID0gd2luZG93Ll9za2lsbHNPcmRlcmVkO1xuICBpZiAoIWFycikgcmV0dXJuO1xuICBjb25zdCBpZHggPSBhcnIuZmluZEluZGV4KHMgPT4gKHR5cGVvZiBzID09PSAnc3RyaW5nJyA/IHMgOiBzLm5hbWUgfHwgcykgPT09IHNraWxsTmFtZSk7XG4gIGlmIChpZHggPCAwKSByZXR1cm47XG4gIGNvbnN0IG5ld0lkeCA9IGlkeCArIGRpcmVjdGlvbjtcbiAgaWYgKG5ld0lkeCA8IDAgfHwgbmV3SWR4ID49IGFyci5sZW5ndGgpIHJldHVybjtcbiAgW2FycltpZHhdLCBhcnJbbmV3SWR4XV0gPSBbYXJyW25ld0lkeF0sIGFycltpZHhdXTtcbiAgd2luZG93Ll9za2lsbHNPcmRlcmVkID0gYXJyO1xuICBfcmVuZGVyU2tpbGxzVGFibGUobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7XG4gIGZldGNoKCcvYXBpL3Jlb3JkZXItcm93cycsIHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHR5cGU6ICdza2lsbCcsIG9yZGVyZWRfaWRzOiBhcnIubWFwKHMgPT4gKHR5cGVvZiBzID09PSAnc3RyaW5nJyA/IHMgOiBzLm5hbWUgfHwgcykpIH0pXG4gIH0pLmNhdGNoKCgpID0+IHt9KTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIExlZ2FjeSBpbnRlcmFjdGl2ZS1tb2RlIHJlc3BvbnNlIGhhbmRsZXIgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZVNraWxsc1Jlc3BvbnNlKG1lc3NhZ2UpIHtcbiAgd2luZG93LndhaXRpbmdGb3JTa2lsbHNSZXNwb25zZSA9IGZhbHNlO1xuICBjb25zdCByZXNwb25zZSA9IG1lc3NhZ2UudG9Mb3dlckNhc2UoKTtcblxuICBpZiAocmVzcG9uc2UuaW5jbHVkZXMoJ3llcycpKSB7XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ0V4Y2VsbGVudCEgSVxcJ2xsIHVzZSB0aGlzIHNraWxscyBzdHJhdGVneSBpbiB5b3VyIENWLicpO1xuICB9IGVsc2UgaWYgKHJlc3BvbnNlLmluY2x1ZGVzKCdubycpIHx8IHJlc3BvbnNlLmluY2x1ZGVzKCdtb2RpZnknKSkge1xuICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsICdJIHVuZGVyc3RhbmQuIFdoYXQgY2hhbmdlcyB3b3VsZCB5b3UgbGlrZSBtZSB0byBtYWtlIHRvIHRoZSBza2lsbHMgZW1waGFzaXM/Jyk7XG4gIH0gZWxzZSB7XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ0lcXCdsbCBub3RlIHlvdXIgZmVlZGJhY2sgb24gdGhlIHNraWxscyBzdHJhdGVneS4nKTtcbiAgfVxuXG4gIGZpbmlzaEludGVyYWN0aXZlUmV2aWV3KCk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBTdWJtaXQgZGVjaXNpb25zIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBzdWJtaXRTa2lsbERlY2lzaW9ucygpIHtcbiAgLyogZHVja2Zsb3c6XG4gICAqICAgaWQ6IHNraWxsc191aV9zdWJtaXRfbGl2ZVxuICAgKiAgIGtpbmQ6IHVpXG4gICAqICAgdGltZXN0YW1wOiAnMjAyNi0wMy0yNVQyMTozOTo0OFonXG4gICAqICAgc3RhdHVzOiBsaXZlXG4gICAqICAgaGFuZGxlczpcbiAgICogICAtIHVpOnNraWxscy1yZXZpZXcuc3VibWl0XG4gICAqICAgY2FsbHM6XG4gICAqICAgLSBQT1NUIC9hcGkvcmV2aWV3LWRlY2lzaW9uc1xuICAgKiAgIC0gUE9TVCAvYXBpL2N2L2xheW91dC1lc3RpbWF0ZVxuICAgKiAgIHJlYWRzOlxuICAgKiAgIC0gd2luZG93OnVzZXJTZWxlY3Rpb25zLnNraWxsc1xuICAgKiAgIC0gd2luZG93Ol9za2lsbHNPcmRlcmVkXG4gICAqICAgLSBkb206LnNraWxsLW1hdGNoLWlucHV0LnZhbHVlXG4gICAqICAgd3JpdGVzOlxuICAgKiAgIC0gcmVxdWVzdDpQT1NUIC9hcGkvcmV2aWV3LWRlY2lzaW9ucy5kZWNpc2lvbnNcbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL3Jldmlldy1kZWNpc2lvbnMuZXh0cmFfc2tpbGxzXG4gICAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9yZXZpZXctZGVjaXNpb25zLmV4dHJhX3NraWxsX21hdGNoZXNcbiAgICogICAtIHdpbmRvdzpfc2F2ZWREZWNpc2lvbnMuc2tpbGxfZGVjaXNpb25zXG4gICAqICAgLSB3aW5kb3c6X3NhdmVkRGVjaXNpb25zLmV4dHJhX3NraWxsc1xuICAgKiAgIC0gd2luZG93Ol9zYXZlZERlY2lzaW9ucy5leHRyYV9za2lsbF9tYXRjaGVzXG4gICAqICAgbm90ZXM6IFN1Ym1pdHMgc2tpbGwgaW5jbHVzaW9uIGRlY2lzaW9ucyB0b2dldGhlciB3aXRoIHNlc3Npb24tb25seSBleHRyYSBza2lsbHMgYW5kIGV4cGVyaWVuY2UtbWF0Y2ggZXZpZGVuY2Ugc28gYmFja2VuZCBnZW5lcmF0aW9uIGNhbiBtYXRlcmlhbGl6ZSB0aGUgc2FtZSBvdmVybGF5IHN0YXRlLlxuICAgKi9cbiAgY29uc3QgZGVjaXNpb25zID0gdXNlclNlbGVjdGlvbnMuc2tpbGxzO1xuICBjb25zdCBjb3VudCA9IE9iamVjdC5rZXlzKGRlY2lzaW9ucykubGVuZ3RoO1xuXG4gIGlmIChjb3VudCA9PT0gMCkge1xuICAgIHNob3dBbGVydE1vZGFsKCdObyBTZWxlY3Rpb25zJywgJ1BsZWFzZSBzZWxlY3QgYWN0aW9ucyBmb3IgYXQgbGVhc3Qgb25lIHNraWxsIGJlZm9yZSBzdWJtaXR0aW5nLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgZXh0cmFTa2lsbHMgPSAod2luZG93Ll9za2lsbHNPcmRlcmVkIHx8IFtdKVxuICAgICAgLmZpbHRlcihza2lsbCA9PiBza2lsbCAmJiB0eXBlb2Ygc2tpbGwgPT09ICdvYmplY3QnICYmIHNraWxsLl9pc05ldylcbiAgICAgIC5maWx0ZXIoc2tpbGwgPT4ge1xuICAgICAgICBjb25zdCBhY3Rpb24gPSBkZWNpc2lvbnNbX3NraWxsTmFtZShza2lsbCldO1xuICAgICAgICByZXR1cm4gYWN0aW9uID09PSAnaW5jbHVkZScgfHwgYWN0aW9uID09PSAnZW1waGFzaXplJyB8fCBhY3Rpb24gPT09ICdkZS1lbXBoYXNpemUnO1xuICAgICAgfSlcbiAgICAgIC5tYXAoc2tpbGwgPT4ge1xuICAgICAgICBpZiAoc2tpbGwuX2lzVXNlckNyZWF0ZWQpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogX3NraWxsTmFtZShza2lsbCksXG4gICAgICAgICAgICBjYXRlZ29yeTogU3RyaW5nKHNraWxsLmNhdGVnb3J5IHx8ICcnKS50cmltKCksXG4gICAgICAgICAgICBncm91cDogU3RyaW5nKHNraWxsLmdyb3VwIHx8ICcnKS50cmltKCksXG4gICAgICAgICAgICBwcm9maWNpZW5jeTogU3RyaW5nKHNraWxsLnByb2ZpY2llbmN5IHx8ICcnKS50cmltKCksXG4gICAgICAgICAgICBzdWJza2lsbHM6IF9ub3JtYWxpemVTa2lsbFN1YnNraWxscyhza2lsbC5zdWJza2lsbHMgfHwgc2tpbGwuc3ViX3NraWxscyB8fCBbXSksXG4gICAgICAgICAgICBwYXJlbnRoZXRpY2FsOiBTdHJpbmcoc2tpbGwucGFyZW50aGV0aWNhbCB8fCAnJykudHJpbSgpLFxuICAgICAgICAgICAgdXNlcl9jcmVhdGVkOiB0cnVlLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9za2lsbE5hbWUoc2tpbGwpO1xuICAgICAgfSk7XG4gICAgY29uc3QgZXh0cmFTa2lsbE5hbWVzID0gZXh0cmFTa2lsbHMubWFwKHNraWxsID0+IHR5cGVvZiBza2lsbCA9PT0gJ3N0cmluZycgPyBza2lsbCA6IHNraWxsLm5hbWUpO1xuXG4gICAgY29uc3QgbWF0Y2hJbnB1dHMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5za2lsbC1tYXRjaC1pbnB1dCcpKTtcbiAgICBjb25zdCBhbGxvd2VkID0gbmV3IFNldCgod2luZG93Ll9hbGxFeHBlcmllbmNlcyB8fCBbXSkubWFwKGUgPT4gZS5pZCkuZmlsdGVyKEJvb2xlYW4pKTtcbiAgICBjb25zdCBleHRyYVNraWxsTWF0Y2hlcyA9IHt9O1xuICAgIGZvciAoY29uc3QgaW5wdXQgb2YgbWF0Y2hJbnB1dHMpIHtcbiAgICAgIGNvbnN0IHNraWxsTmFtZSA9IGlucHV0LmRhdGFzZXQuc2tpbGw7XG4gICAgICBpZiAoIXNraWxsTmFtZSB8fCAhZXh0cmFTa2lsbE5hbWVzLmluY2x1ZGVzKHNraWxsTmFtZSkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgaWRzID0gU3RyaW5nKGlucHV0LnZhbHVlIHx8ICcnKVxuICAgICAgICAuc3BsaXQoJywnKVxuICAgICAgICAubWFwKCh4KSA9PiB4LnRyaW0oKSlcbiAgICAgICAgLmZpbHRlcigoeCkgPT4geCAmJiBhbGxvd2VkLmhhcyh4KSk7XG4gICAgICBpZiAoaWRzLmxlbmd0aCA+IDApIGV4dHJhU2tpbGxNYXRjaGVzW3NraWxsTmFtZV0gPSBpZHM7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9yZXZpZXctZGVjaXNpb25zJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgdHlwZTogJ3NraWxscycsXG4gICAgICAgIGRlY2lzaW9uczogZGVjaXNpb25zLFxuICAgICAgICBleHRyYV9za2lsbHM6IGV4dHJhU2tpbGxzLFxuICAgICAgICBleHRyYV9za2lsbF9tYXRjaGVzOiBleHRyYVNraWxsTWF0Y2hlcyxcbiAgICAgIH0pXG4gICAgfSk7XG5cbiAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgIHN0YXRlTWFuYWdlci5tYXJrQ29udGVudENoYW5nZWQoKTtcbiAgICAgIGNvbnN0IGV4dHJhTm90ZSA9IGV4dHJhU2tpbGxzLmxlbmd0aCA+IDBcbiAgICAgICAgPyBgICgke2V4dHJhU2tpbGxzLmxlbmd0aH0gbmV3IHNraWxsKHMpIGFkZGVkIFx1MjAxNCBhdmFpbGFibGUgZm9yIHdyaXRlLWJhY2sgdG8gbWFzdGVyIENWIGluIHRoZSBIYXJ2ZXN0IHRhYilgXG4gICAgICAgIDogJyc7XG4gICAgICBzaG93VG9hc3QoYFNraWxsIGRlY2lzaW9ucyBzYXZlZCAoJHtjb3VudH0gaXRlbXMpJHtleHRyYU5vdGV9YCk7XG4gICAgICBzY2hlZHVsZUF0c1JlZnJlc2goKTtcbiAgICAgIC8vIFBlcnNpc3Qgc2F2ZWQgZGVjaXNpb25zIGxvY2FsbHkgc28gdGhlIFVJIHJlZmxlY3RzIHRoZW0gaW1tZWRpYXRlbHlcbiAgICAgIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMgPSB3aW5kb3cuX3NhdmVkRGVjaXNpb25zIHx8IHt9O1xuICAgICAgd2luZG93Ll9zYXZlZERlY2lzaW9ucy5za2lsbF9kZWNpc2lvbnMgPSBkZWNpc2lvbnM7XG4gICAgICBpZiAoIXdpbmRvdy5fc2F2ZWREZWNpc2lvbnMuZXh0cmFfc2tpbGxzKSB3aW5kb3cuX3NhdmVkRGVjaXNpb25zLmV4dHJhX3NraWxscyA9IFtdO1xuICAgICAgaWYgKGV4dHJhU2tpbGxzLmxlbmd0aCA+IDApIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMuZXh0cmFfc2tpbGxzID0gZXh0cmFTa2lsbHM7XG4gICAgICB3aW5kb3cuX3NhdmVkRGVjaXNpb25zLmV4dHJhX3NraWxsX21hdGNoZXMgPSBleHRyYVNraWxsTWF0Y2hlcztcbiAgICAgIHVzZXJTZWxlY3Rpb25zLnNraWxscyA9IHsgLi4uZGVjaXNpb25zIH07XG4gICAgICBpZiAodHlwZW9mIHVwZGF0ZUluY2x1c2lvbkNvdW50cyA9PT0gJ2Z1bmN0aW9uJykgdXBkYXRlSW5jbHVzaW9uQ291bnRzKCk7XG4gICAgICBzd2l0Y2hUYWIoJ2FjaGlldmVtZW50cy1yZXZpZXcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZXJyb3IgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICBzaG93VG9hc3QoYEVycm9yOiAke2Vycm9yLmVycm9yIHx8ICdGYWlsZWQgdG8gc2F2ZSBkZWNpc2lvbnMnfWAsICdlcnJvcicpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cuZXJyb3IoJ0Vycm9yIHN1Ym1pdHRpbmcgc2tpbGwgZGVjaXNpb25zOicsIGVycm9yKTtcbiAgICBzaG93VG9hc3QoJ0ZhaWxlZCB0byBzYXZlIGRlY2lzaW9ucy4gUGxlYXNlIHRyeSBhZ2Fpbi4nLCAnZXJyb3InKTtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgRXhwb3J0cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZXhwb3J0IHtcbiAgX3BhcnNlWWVhckZyb21TdHIsXG4gIF9jb21wdXRlWWVhcnNGcm9tSWRzLFxuICBzYXZlU2tpbGxHcm91cE92ZXJyaWRlLFxuICBzYXZlU2tpbGxDYXRlZ29yeU92ZXJyaWRlLFxuICByZW5hbWVTa2lsbENhdGVnb3J5LFxuICBzYXZlU2tpbGxDYXRlZ29yeU9yZGVyLFxuICBzYXZlU2tpbGxRdWFsaWZpZXJPdmVycmlkZSxcbiAgc2F2ZVVzZXJDcmVhdGVkU2tpbGwsXG4gIGJ1aWxkU2tpbGxzUmV2aWV3VGFibGUsXG4gIF9yZW5kZXJTa2lsbHNUYWJsZSxcbiAgbW92ZVNraWxsUm93LFxuICBoYW5kbGVTa2lsbHNSZXNwb25zZSxcbiAgc3VibWl0U2tpbGxEZWNpc2lvbnMsXG59O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiBhY2hpZXZlbWVudHMtcmV2aWV3LmpzXG4gKiBFUyBtb2R1bGUgXHUyMDE0IEFjaGlldmVtZW50cyByZXZpZXcgdGFibGUsIGFjaGlldmVtZW50cyBlZGl0b3IsIGFuZCBBSSByZXdyaXRlIG1vZGFsLlxuICpcbiAqIERlcGVuZGVuY2llcyByZXNvbHZlZCB0aHJvdWdoIGdsb2JhbFRoaXMgYXQgcnVudGltZTpcbiAqICAgLSBwZW5kaW5nUmVjb21tZW5kYXRpb25zICAgICAgICAod2luZG93KVxuICogICAtIGFjaGlldmVtZW50RGVjaXNpb25zICAgICAgICAgICh3aW5kb3cgXHUyMDE0IGFsc28gaW5pdGlhbGlzZWQgaGVyZSlcbiAqICAgLSBfYWNoaWV2ZW1lbnRzT3JkZXJlZCAgICAgICAgICAod2luZG93IFx1MjAxNCBhbHNvIGluaXRpYWxpc2VkIGhlcmUpXG4gKiAgIC0gX3N1Z2dlc3RlZEFjaHNPcmRlcmVkICAgICAgICAgKHdpbmRvdylcbiAqICAgLSBfc2F2ZWREZWNpc2lvbnMgICAgICAgICAgICAgICAod2luZG93KVxuICogICAtIGFjaGlldmVtZW50RWRpdHMgICAgICAgICAgICAgICh3aW5kb3cpXG4gKiAgIC0gdXNlclNlbGVjdGlvbnMgICAgICAgICAgICAgICAgKHdpbmRvdylcbiAqICAgLSBnZXRBY2hpZXZlbWVudFJlY29tbWVuZGF0aW9uICAoZ2xvYmFsVGhpcyBmdW5jdGlvbilcbiAqICAgLSBnZXRBY2hpZXZlbWVudENvbmZpZGVuY2UgICAgICAoZ2xvYmFsVGhpcyBmdW5jdGlvbilcbiAqICAgLSBnZXRBY2hpZXZlbWVudFJlYXNvbmluZyAgICAgICAoZ2xvYmFsVGhpcyBmdW5jdGlvbilcbiAqICAgLSBlc2NhcGVIdG1sICAgICAgICAgICAgICAgICAgICAoZ2xvYmFsVGhpcyBmdW5jdGlvbilcbiAqICAgLSBoYW5kbGVBY2hpZXZlbWVudEFjdGlvbiAgICAgICAoZ2xvYmFsVGhpcyAvIHRoaXMgbW9kdWxlKVxuICogICAtIGJ1bGtBY2hpZXZlbWVudEFjdGlvbiAgICAgICAgIChnbG9iYWxUaGlzIC8gdGhpcyBtb2R1bGUpXG4gKiAgIC0gbW92ZUFjaGlldmVtZW50Um93ICAgICAgICAgICAgKGdsb2JhbFRoaXMgLyB0aGlzIG1vZHVsZSlcbiAqICAgLSBtb3ZlU3VnZ2VzdGVkQWNoaWV2ZW1lbnRSb3cgICAoZ2xvYmFsVGhpcyAvIHRoaXMgbW9kdWxlKVxuICogICAtIHNhdmVUb3BMZXZlbEFjaGlldmVtZW50RmllbGQgIChnbG9iYWxUaGlzIC8gdGhpcyBtb2R1bGUpXG4gKiAgIC0gc2F2ZVN1Z2dlc3RlZEFjaGlldmVtZW50RmllbGQgKGdsb2JhbFRoaXMgLyB0aGlzIG1vZHVsZSlcbiAqICAgLSBhaVJld3JpdGVUb3BMZXZlbEFjaGlldmVtZW50ICAoZ2xvYmFsVGhpcyAvIHRoaXMgbW9kdWxlKVxuICogICAtIGFpUmV3cml0ZVN1Z2dlc3RlZEFjaGlldmVtZW50IChnbG9iYWxUaGlzIC8gdGhpcyBtb2R1bGUpXG4gKiAgIC0gZGVsZXRlVG9wTGV2ZWxBY2hpZXZlbWVudCAgICAgKGdsb2JhbFRoaXMgLyB0aGlzIG1vZHVsZSlcbiAqICAgLSBkZWxldGVTdWdnZXN0ZWRBY2hpZXZlbWVudCAgICAoZ2xvYmFsVGhpcyAvIHRoaXMgbW9kdWxlKVxuICogICAtIHNob3dUb2FzdCAgICAgICAgICAgICAgICAgICAgIChnbG9iYWxUaGlzIGZ1bmN0aW9uKVxuICogICAtIHNjaGVkdWxlQXRzUmVmcmVzaCAgICAgICAgICAgIChnbG9iYWxUaGlzIGZ1bmN0aW9uKVxuICogICAtIHVwZGF0ZUluY2x1c2lvbkNvdW50cyAgICAgICAgIChnbG9iYWxUaGlzIGZ1bmN0aW9uKVxuICogICAtIHN3aXRjaFRhYiAgICAgICAgICAgICAgICAgICAgIChnbG9iYWxUaGlzIGZ1bmN0aW9uKVxuICogICAtIGNvbmZpcm1EaWFsb2cgICAgICAgICAgICAgICAgIChnbG9iYWxUaGlzIGZ1bmN0aW9uKVxuICogICAtIGNsb3NlQWxlcnRNb2RhbCAgICAgICAgICAgICAgIChnbG9iYWxUaGlzIGZ1bmN0aW9uKVxuICogICAtIHNldEluaXRpYWxGb2N1cyAgICAgICAgICAgICAgIChnbG9iYWxUaGlzIGZ1bmN0aW9uKVxuICogICAtIHRyYXBGb2N1cyAgICAgICAgICAgICAgICAgICAgIChnbG9iYWxUaGlzIGZ1bmN0aW9uKVxuICogICAtIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsICAgIChnbG9iYWxUaGlzKVxuICogICAtIENTUy5lc2NhcGUgICAgICAgICAgICAgICAgICAgIChicm93c2VyIGJ1aWx0LWluKVxuICovXG5cbmltcG9ydCB7IHN0YXRlTWFuYWdlciB9IGZyb20gJy4vc3RhdGUtbWFuYWdlci5qcyc7XG5pbXBvcnQgeyBleWVTbGFzaEljb24gfSBmcm9tICcuL3Jldmlldy1pY29ucy5qcyc7XG5cbi8vIE1vZHVsZS1sZXZlbCBzdGF0ZVxubGV0IF9yZXdyaXRlU3VnZ2VzdGlvbkhpc3RvcnkgPSBbXTtcbmxldCBfbGFzdFJld3JpdGVMb2dJZCA9IG51bGw7XG4vLyBDYWxsYmFja3MgZm9yIHRoZSBhY3RpdmUgcmV3cml0ZSBtb2RhbDogeyBleHBlcmllbmNlSW5kZXgsIG9uQWNjZXB0IH1cbmxldCBfcmV3cml0ZUNhbGxiYWNrcyA9IG51bGw7XG4vLyBUcmFja3MgYWNoaWV2ZW1lbnRzIHRoYXQgYXJlIG5ld2x5IHJlY29tbWVuZGVkIHNpbmNlIHRoZSBwcmV2aW91cyByZW5kZXIgKGZvciBcdUQ4M0NcdUREOTUgYmFkZ2VzKVxubGV0IF9uZXdSZWNvbW1lbmRlZEFjaHMgPSBuZXcgU2V0KCk7XG5cbmZ1bmN0aW9uIF9ub3JtYWxpemVBY2hpZXZlbWVudEVkaXRFbnRyeShlbnRyeSkge1xuICBpZiAoZW50cnkgJiYgdHlwZW9mIGVudHJ5ID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShlbnRyeSkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdGV4dDogU3RyaW5nKGVudHJ5LnRleHQgPz8gZW50cnkuZGVzY3JpcHRpb24gPz8gZW50cnkuY29udGVudCA/PyAnJyksXG4gICAgICBoaWRkZW46IEJvb2xlYW4oZW50cnkuaGlkZGVuKSxcbiAgICB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgdGV4dDogU3RyaW5nKGVudHJ5ID8/ICcnKSxcbiAgICBoaWRkZW46IGZhbHNlLFxuICB9O1xufVxuXG5mdW5jdGlvbiBfbm9ybWFsaXplQWNoaWV2ZW1lbnRFZGl0TGlzdChlbnRyaWVzKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShlbnRyaWVzKSkgcmV0dXJuIFtdO1xuICByZXR1cm4gZW50cmllcy5tYXAoX25vcm1hbGl6ZUFjaGlldmVtZW50RWRpdEVudHJ5KTtcbn1cblxuZnVuY3Rpb24gX2FjaGlldmVtZW50RW50cnlUZXh0KGVudHJ5KSB7XG4gIHJldHVybiBfbm9ybWFsaXplQWNoaWV2ZW1lbnRFZGl0RW50cnkoZW50cnkpLnRleHQ7XG59XG5cbmZ1bmN0aW9uIF9hY2hpZXZlbWVudEVudHJ5SGlkZGVuKGVudHJ5KSB7XG4gIHJldHVybiBfbm9ybWFsaXplQWNoaWV2ZW1lbnRFZGl0RW50cnkoZW50cnkpLmhpZGRlbjtcbn1cblxud2luZG93LmFjaGlldmVtZW50RGVjaXNpb25zID0ge307XG53aW5kb3cuX2FjaGlldmVtZW50c09yZGVyZWQgPSBudWxsO1xuXG4vLyBTbWFsbCBmZXRjaCBoZWxwZXIgd2l0aCB0aW1lb3V0IHRvIGF2b2lkIGxlYXZpbmcgbG9hZGVycyB2aXNpYmxlIG9uIGhhbmdpbmcgcmVxdWVzdHNcbmFzeW5jIGZ1bmN0aW9uIGZldGNoSnNvbldpdGhUaW1lb3V0KHVybCwgb3B0cyA9IHt9LCB0aW1lb3V0ID0gNzAwMCkge1xuICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICBjb25zdCBzaWduYWwgPSBjb250cm9sbGVyLnNpZ25hbDtcbiAgY29uc3QgaWQgPSBzZXRUaW1lb3V0KCgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKSwgdGltZW91dCk7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2godXJsLCBPYmplY3QuYXNzaWduKHt9LCBvcHRzLCB7IHNpZ25hbCB9KSk7XG4gICAgY2xlYXJUaW1lb3V0KGlkKTtcbiAgICByZXR1cm4gcmVzO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjbGVhclRpbWVvdXQoaWQpO1xuICAgIHRocm93IGVycjtcbiAgfVxufVxuXG5mdW5jdGlvbiBfYWNoU25hcHNob3RLZXkoKSB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2lkID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKS5nZXQoJ3Nlc3Npb24nKTtcbiAgICByZXR1cm4gc2lkID8gYGFjaF9zbmFwXyR7c2lkfWAgOiBudWxsO1xuICB9IGNhdGNoIChfKSB7IHJldHVybiBudWxsOyB9XG59XG5mdW5jdGlvbiBfc2F2ZUFjaFNuYXBzaG90KHJlY29tbWVuZGVkSWRzKSB7XG4gIGNvbnN0IGtleSA9IF9hY2hTbmFwc2hvdEtleSgpO1xuICBpZiAoIWtleSkgcmV0dXJuO1xuICB0cnkgeyBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIEpTT04uc3RyaW5naWZ5KFsuLi5yZWNvbW1lbmRlZElkc10pKTsgfSBjYXRjaCAoXykge31cbn1cbmZ1bmN0aW9uIF9nZXRBY2hTbmFwc2hvdCgpIHtcbiAgY29uc3Qga2V5ID0gX2FjaFNuYXBzaG90S2V5KCk7XG4gIGlmICgha2V5KSByZXR1cm4gbnVsbDtcbiAgdHJ5IHtcbiAgICBjb25zdCByYXcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuICAgIHJldHVybiByYXcgPyBuZXcgU2V0KEpTT04ucGFyc2UocmF3KSkgOiBudWxsO1xuICB9IGNhdGNoIChfKSB7IHJldHVybiBudWxsOyB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkQWNoaWV2ZW1lbnRzUmV2aWV3VGFibGUoKSB7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhY2hpZXZlbWVudHMtdGFibGUtY29udGFpbmVyJyk7XG4gIGlmICghY29udGFpbmVyKSByZXR1cm47XG5cbiAgY29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTJweDtwYWRkaW5nOjIwcHg7Y29sb3I6IzZiNzI4MDtcIj48ZGl2IGNsYXNzPVwibG9hZGluZy1zcGlubmVyXCIgc3R5bGU9XCJ3aWR0aDoyMHB4O2hlaWdodDoyMHB4O2JvcmRlci13aWR0aDoycHg7ZmxleC1zaHJpbms6MDtcIj48L2Rpdj48c3Bhbj5Mb2FkaW5nIGFjaGlldmVtZW50c1x1MjAyNjwvc3Bhbj48L2Rpdj4nO1xuXG4gIC8vIFByZWZlciBzZXNzaW9uLWF3YXJlIHN0YXR1cyBkYXRhIHNvIHJldmlldy10aW1lIG92ZXJsYXlzIGFyZSByZWZsZWN0ZWQuXG4gIGxldCBhbGxBY2hpZXZlbWVudHMgPSBbXTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaEpzb25XaXRoVGltZW91dCgnL2FwaS9zdGF0dXMnLCB7fSwgNzAwMCk7XG4gICAgaWYgKCFyZXMub2spIHRocm93IG5ldyBFcnJvcignc3RhdHVzIG5vdCBvaycpO1xuICAgIGNvbnN0IHN0YXR1c0RhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGFsbEFjaGlldmVtZW50cyA9IHN0YXR1c0RhdGEuYWxsX2FjaGlldmVtZW50cyB8fCBbXTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gU2Vjb25kYXJ5IGZhbGxiYWNrOiByYXcgbWFzdGVyIGZpZWxkcy5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzMiA9IGF3YWl0IGZldGNoSnNvbldpdGhUaW1lb3V0KCcvYXBpL21hc3Rlci1maWVsZHMnLCB7fSwgNzAwMCk7XG4gICAgICBpZiAoIXJlczIub2spIHRocm93IG5ldyBFcnJvcignbWFzdGVyLWZpZWxkcyBub3Qgb2snKTtcbiAgICAgIGNvbnN0IG1hc3RlckRhdGEgPSBhd2FpdCByZXMyLmpzb24oKTtcbiAgICAgIGFsbEFjaGlldmVtZW50cyA9IG1hc3RlckRhdGEuc2VsZWN0ZWRfYWNoaWV2ZW1lbnRzIHx8IFtdO1xuICAgIH0gY2F0Y2ggKGVycjIpIHtcbiAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnPHAgc3R5bGU9XCJjb2xvcjojZWY0NDQ0O3BhZGRpbmc6MjBweDtcIj5GYWlsZWQgdG8gbG9hZCBhY2hpZXZlbWVudHMuPC9wPic7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaWYgKGFsbEFjaGlldmVtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJzxwIHN0eWxlPVwicGFkZGluZzoyMHB4O2NvbG9yOiM2YjcyODA7XCI+Tm8ga2V5IGFjaGlldmVtZW50cyBmb3VuZCBpbiBtYXN0ZXIgQ1YgZGF0YS48L3A+JztcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBXcmFwIGluaXRpYWxpc2F0aW9uICsgcmVuZGVyIHNvIGFuIHVuZXhwZWN0ZWQgZXhjZXB0aW9uIHJlcGxhY2VzIHRoZVxuICAvLyBzcGlubmVyIGluc3RlYWQgb2YgbGVhdmluZyBpdCBmcm96ZW4gaW5kZWZpbml0ZWx5LlxuICB0cnkge1xuICAgIGNvbnN0IGRhdGEgPSB3aW5kb3cucGVuZGluZ1JlY29tbWVuZGF0aW9ucyB8fCB7fTtcbiAgICBjb25zdCByZWNvbW1lbmRlZFNldCA9IG5ldyBTZXQoZGF0YS5yZWNvbW1lbmRlZF9hY2hpZXZlbWVudHMgfHwgW10pO1xuXG4gICAgLy8gU29ydDogcmVjb21tZW5kZWQgZmlyc3QsIHRoZW4gYnkgaW1wb3J0YW5jZSBkZXNjZW5kaW5nIChvbmx5IG9uIGZpcnN0IGxvYWQpXG4gICAgaWYgKCF3aW5kb3cuX2FjaGlldmVtZW50c09yZGVyZWQpIHtcbiAgICAgIGFsbEFjaGlldmVtZW50cyA9IFsuLi5hbGxBY2hpZXZlbWVudHNdLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgY29uc3QgYVJlYyA9IHJlY29tbWVuZGVkU2V0LmhhcyhhLmlkKSA/IDEgOiAwO1xuICAgICAgICBjb25zdCBiUmVjID0gcmVjb21tZW5kZWRTZXQuaGFzKGIuaWQpID8gMSA6IDA7XG4gICAgICAgIGlmIChiUmVjICE9PSBhUmVjKSByZXR1cm4gYlJlYyAtIGFSZWM7XG4gICAgICAgIHJldHVybiAoYi5pbXBvcnRhbmNlIHx8IDApIC0gKGEuaW1wb3J0YW5jZSB8fCAwKTtcbiAgICAgIH0pO1xuICAgICAgd2luZG93Ll9hY2hpZXZlbWVudHNPcmRlcmVkID0gYWxsQWNoaWV2ZW1lbnRzO1xuICAgIH1cblxuICAgIC8vIEluaXRpYWxpc2UgZGVjaXNpb25zXG4gICAgd2luZG93LmFjaGlldmVtZW50RGVjaXNpb25zID0ge307XG4gICAgd2luZG93Ll9hY2hpZXZlbWVudHNPcmRlcmVkLmZvckVhY2goYWNoID0+IHtcbiAgICAgIGNvbnN0IHJlYyA9IGdldEFjaGlldmVtZW50UmVjb21tZW5kYXRpb24oYWNoLmlkLCBkYXRhKTtcbiAgICAgIGxldCBkZWZhdWx0QWN0aW9uID0gJ2luY2x1ZGUnO1xuICAgICAgaWYgKHJlYyA9PT0gJ0VtcGhhc2l6ZScpICAgICAgICAgZGVmYXVsdEFjdGlvbiA9ICdlbXBoYXNpemUnO1xuICAgICAgZWxzZSBpZiAocmVjID09PSAnSW5jbHVkZScpICAgICAgZGVmYXVsdEFjdGlvbiA9ICdpbmNsdWRlJztcbiAgICAgIGVsc2UgaWYgKHJlYyA9PT0gJ0RlLWVtcGhhc2l6ZScpIGRlZmF1bHRBY3Rpb24gPSAnZGUtZW1waGFzaXplJztcbiAgICAgIGVsc2UgaWYgKHJlYyA9PT0gJ09taXQnKSAgICAgICAgIGRlZmF1bHRBY3Rpb24gPSAnZXhjbHVkZSc7XG4gICAgICB3aW5kb3cuYWNoaWV2ZW1lbnREZWNpc2lvbnNbYWNoLmlkXSA9IGRlZmF1bHRBY3Rpb247XG4gICAgfSk7XG4gICAgLy8gQXBwbHkgYW55IHByZXZpb3VzbHkgc2F2ZWQgdXNlciBkZWNpc2lvbnMgb3ZlciB0aGUgTExNIGRlZmF1bHRzXG4gICAgY29uc3Qgc2F2ZWRBY2hEZWNzID0gd2luZG93Ll9zYXZlZERlY2lzaW9ucz8uYWNoaWV2ZW1lbnRfZGVjaXNpb25zIHx8IHt9O1xuICAgIGlmIChPYmplY3Qua2V5cyhzYXZlZEFjaERlY3MpLmxlbmd0aCA+IDApIE9iamVjdC5hc3NpZ24od2luZG93LmFjaGlldmVtZW50RGVjaXNpb25zLCBzYXZlZEFjaERlY3MpO1xuXG4gICAgLy8gQWxzbyBoYW5kbGUgQUktc3VnZ2VzdGVkIGFjaGlldmVtZW50cyBcdTIwMTQgYXNzaWduIHN0YWJsZSBJRHMgb25jZSBvbiBmaXJzdCBsb2FkXG4gICAgLy8gc28gdGhhdCByZW9yZGVyIC8gZGVsZXRlIG9wZXJhdGlvbnMgbmV2ZXIgbmVlZCB0byByZW1hcCBkZWNpc2lvbiBrZXlzLlxuICAgIGlmICghd2luZG93Ll9zdWdnZXN0ZWRBY2hzT3JkZXJlZCkge1xuICAgICAgbGV0IGNvdW50ZXIgPSAwO1xuICAgICAgd2luZG93Ll9zdWdnZXN0ZWRBY2hzT3JkZXJlZCA9IChkYXRhLnN1Z2dlc3RlZF9hY2hpZXZlbWVudHMgfHwgW10pLm1hcChzID0+IHtcbiAgICAgICAgY29uc3QgaXRlbSA9IE9iamVjdC5hc3NpZ24oe30sIHMpO1xuICAgICAgICBpdGVtLl9zdWdnSWQgPSBgc3VnZzo6JHtjb3VudGVyKyt9YDtcbiAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICB9KTtcbiAgICB9XG4gICAgd2luZG93Ll9zdWdnZXN0ZWRBY2hzT3JkZXJlZC5mb3JFYWNoKHMgPT4ge1xuICAgICAgaWYgKCEocy5fc3VnZ0lkIGluIHdpbmRvdy5hY2hpZXZlbWVudERlY2lzaW9ucykpIHdpbmRvdy5hY2hpZXZlbWVudERlY2lzaW9uc1tzLl9zdWdnSWRdID0gJ2luY2x1ZGUnO1xuICAgIH0pO1xuXG4gICAgY29uc3QgcHJldkFjaFNuYXAgPSBfZ2V0QWNoU25hcHNob3QoKTtcbiAgICBfbmV3UmVjb21tZW5kZWRBY2hzID0gcHJldkFjaFNuYXBcbiAgICAgID8gbmV3IFNldChbLi4ucmVjb21tZW5kZWRTZXRdLmZpbHRlcihpZCA9PiAhcHJldkFjaFNuYXAuaGFzKGlkKSkpXG4gICAgICA6IG5ldyBTZXQoKTtcbiAgICBfc2F2ZUFjaFNuYXBzaG90KHJlY29tbWVuZGVkU2V0KTtcblxuICAgIF9yZW5kZXJBY2hpZXZlbWVudHNSZXZpZXdUYWJsZShjb250YWluZXIpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZSAqL1xuICAgIGNvbnNvbGUuZXJyb3IoJ2J1aWxkQWNoaWV2ZW1lbnRzUmV2aWV3VGFibGU6IHJlbmRlciBlcnJvcjonLCBlcnIpO1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnPHAgc3R5bGU9XCJjb2xvcjojZWY0NDQ0O3BhZGRpbmc6MjBweDtcIj5FcnJvciByZW5kZXJpbmcgYWNoaWV2ZW1lbnRzIHRhYmxlLiBQbGVhc2UgcmVsb2FkIGFuZCB0cnkgYWdhaW4uPC9wPic7XG4gIH1cbn1cblxuZnVuY3Rpb24gX3JlbmRlckFjaGlldmVtZW50c1Jldmlld1RhYmxlKGNvbnRhaW5lcikge1xuICBpZiAoIWNvbnRhaW5lcikgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaGlldmVtZW50cy10YWJsZS1jb250YWluZXInKTtcbiAgaWYgKCFjb250YWluZXIpIHJldHVybjtcblxuICBjb25zdCBkYXRhID0gd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnMgfHwge307XG4gIGNvbnN0IG9yZGVyZWRBY2hzICA9IHdpbmRvdy5fYWNoaWV2ZW1lbnRzT3JkZXJlZCB8fCBbXTtcbiAgY29uc3Qgc3VnZ2VzdGVkQWNocyA9IHdpbmRvdy5fc3VnZ2VzdGVkQWNoc09yZGVyZWQgfHwgW107XG5cbiAgLy8gQnVpbGQgZmlsdGVyICsgdGFibGUgSFRNTFxuICBsZXQgaHRtbCA9IGBcbiAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDoxMnB4O2FsaWduLWl0ZW1zOmNlbnRlcjttYXJnaW4tYm90dG9tOjEycHg7XCI+XG4gICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImFjaC1yZXZpZXctZmlsdGVyXCJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCJGaWx0ZXIgYWNoaWV2ZW1lbnRzXHUyMDI2XCJcbiAgICAgICAgb25pbnB1dD1cIl9maWx0ZXJBY2hpZXZlbWVudHNUYWJsZSh0aGlzLnZhbHVlKVwiXG4gICAgICAgIHN0eWxlPVwiZmxleDoxO3BhZGRpbmc6NnB4IDEwcHg7Ym9yZGVyOjFweCBzb2xpZCAjZDFkNWRiO2JvcmRlci1yYWRpdXM6NnB4O2ZvbnQtc2l6ZTowLjllbTtcIj5cbiAgICAgIDxzcGFuIGlkPVwiYWNoLXJldmlldy1jb3VudFwiIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtjb2xvcjojNmI3MjgwO3doaXRlLXNwYWNlOm5vd3JhcDtcIj4ke29yZGVyZWRBY2hzLmxlbmd0aCArIHN1Z2dlc3RlZEFjaHMubGVuZ3RofSBhY2hpZXZlbWVudHM8L3NwYW4+XG4gICAgPC9kaXY+XG4gICAgPHRhYmxlIGlkPVwiYWNoaWV2ZW1lbnRzLXJldmlldy10YWJsZVwiIGNsYXNzPVwicmV2aWV3LXRhYmxlXCIgc3R5bGU9XCJ3aWR0aDoxMDAlO2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTtcIj5cbiAgICAgIDx0aGVhZD5cbiAgICAgICAgPHRyPlxuICAgICAgICAgIDx0aD5BY2hpZXZlbWVudDwvdGg+XG4gICAgICAgICAgPHRoPlJlY29tbWVuZGF0aW9uPC90aD5cbiAgICAgICAgICA8dGg+Q29uZmlkZW5jZTwvdGg+XG4gICAgICAgICAgPHRoPlJlYXNvbmluZzwvdGg+XG4gICAgICAgICAgPHRoPlNlbGVjdGlvbjwvdGg+XG4gICAgICAgIDwvdHI+XG4gICAgICA8L3RoZWFkPlxuICAgICAgPHRib2R5PlxuICBgO1xuXG4gIG9yZGVyZWRBY2hzLmZvckVhY2goKGFjaCwgcm93SWR4KSA9PiB7XG4gICAgY29uc3QgaWQgICAgICAgICAgICAgPSBhY2guaWQgfHwgYWNoLnRpdGxlIHx8ICcnO1xuICAgIGNvbnN0IHRpdGxlICAgICAgICAgID0gYWNoLnRpdGxlIHx8IGlkO1xuICAgIGNvbnN0IGRlc2MgICAgICAgICAgID0gYWNoLmRlc2NyaXB0aW9uIHx8ICcnO1xuICAgIGNvbnN0IHJlY29tbWVuZGF0aW9uID0gZ2V0QWNoaWV2ZW1lbnRSZWNvbW1lbmRhdGlvbihpZCwgZGF0YSk7XG4gICAgY29uc3QgY29uZmlkZW5jZSAgICAgPSBnZXRBY2hpZXZlbWVudENvbmZpZGVuY2UoaWQsIGRhdGEsIGFjaC5pbXBvcnRhbmNlKTtcbiAgICBjb25zdCByZWFzb25pbmcgICAgICA9IGdldEFjaGlldmVtZW50UmVhc29uaW5nKGlkLCBkYXRhLCBhY2gpO1xuICAgIGNvbnN0IGRlZmF1bHRBY3Rpb24gID0gd2luZG93LmFjaGlldmVtZW50RGVjaXNpb25zW2lkXSB8fCAnaW5jbHVkZSc7XG4gICAgY29uc3QgY29uZmlkZW5jZUJhZGdlID0gYDxzcGFuIGNsYXNzPVwiY29uZmlkZW5jZS1iYWRnZSBjb25maWRlbmNlLSR7Y29uZmlkZW5jZS5sZXZlbH1cIj4ke2NvbmZpZGVuY2UudGV4dH08L3NwYW4+YDtcbiAgICBjb25zdCByZXJ1bk5ld0JhZGdlID0gX25ld1JlY29tbWVuZGVkQWNocy5oYXMoaWQpXG4gICAgICA/ICc8c3BhbiBjbGFzcz1cInJ3LWNoYW5nZS1iYWRnZSBydy1jaGFuZ2UtbmV3XCIgYXJpYS1sYWJlbD1cIk5ldyByZWNvbW1lbmRhdGlvbiBzaW5jZSBwcmV2aW91cyBydW5cIj5cdUQ4M0NcdUREOTUgTmV3PC9zcGFuPidcbiAgICAgIDogJyc7XG4gICAgY29uc3QgaXNGaXJzdCA9IHJvd0lkeCA9PT0gMDtcbiAgICBjb25zdCBpc0xhc3QgID0gcm93SWR4ID09PSBvcmRlcmVkQWNocy5sZW5ndGggLSAxO1xuXG4gICAgaHRtbCArPSBgXG4gICAgICA8dHIgZGF0YS1hY2gtaWQ9XCIke2VzY2FwZUh0bWwoaWQpfVwiPlxuICAgICAgICA8dGQgc3R5bGU9XCJtaW4td2lkdGg6MjIwcHg7XCI+XG4gICAgICAgICAgPGlucHV0IGlkPVwiYWNoLXRpdGxlLSR7ZXNjYXBlSHRtbChpZCl9XCJcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCIgdmFsdWU9XCIke2VzY2FwZUh0bWwodGl0bGUpfVwiXG4gICAgICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Zm9udC13ZWlnaHQ6NjAwO3BhZGRpbmc6M3B4IDZweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo0cHg7Zm9udC1zaXplOjAuOWVtO2JveC1zaXppbmc6Ym9yZGVyLWJveDtcIlxuICAgICAgICAgICAgb25ibHVyPVwic2F2ZVRvcExldmVsQWNoaWV2ZW1lbnRGaWVsZCgnJHtlc2NhcGVIdG1sKGlkKX0nLCAndGl0bGUnLCB0aGlzLnZhbHVlKVwiXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiQWNoaWV2ZW1lbnQgdGl0bGVcIj4ke3JlcnVuTmV3QmFkZ2V9XG4gICAgICAgICAgPHRleHRhcmVhIGlkPVwiYWNoLWRlc2MtJHtlc2NhcGVIdG1sKGlkKX1cIlxuICAgICAgICAgICAgcm93cz1cIjJcIlxuICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDoxMDAlO21hcmdpbi10b3A6NHB4O3BhZGRpbmc6M3B4IDZweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo0cHg7Zm9udC1zaXplOjAuODVlbTtyZXNpemU6dmVydGljYWw7Ym94LXNpemluZzpib3JkZXItYm94O1wiXG4gICAgICAgICAgICBvbmJsdXI9XCJzYXZlVG9wTGV2ZWxBY2hpZXZlbWVudEZpZWxkKCcke2VzY2FwZUh0bWwoaWQpfScsICdkZXNjcmlwdGlvbicsIHRoaXMudmFsdWUpXCJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJBY2hpZXZlbWVudCBkZXNjcmlwdGlvblwiXG4gICAgICAgICAgPiR7ZXNjYXBlSHRtbChkZXNjKX08L3RleHRhcmVhPlxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQ+PHN0cm9uZz4ke2VzY2FwZUh0bWwocmVjb21tZW5kYXRpb24pfTwvc3Ryb25nPjwvdGQ+XG4gICAgICAgIDx0ZD4ke2NvbmZpZGVuY2VCYWRnZX08L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJtYXgtd2lkdGg6MjAwcHg7XCI+PHNtYWxsPiR7ZXNjYXBlSHRtbChyZWFzb25pbmcpfTwvc21hbGw+PC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwiYWN0aW9uLWJ0bnNcIiBzdHlsZT1cIndoaXRlLXNwYWNlOm5vd3JhcDtcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG4gJHtkZWZhdWx0QWN0aW9uID09PSAnZW1waGFzaXplJyAgICA/ICdhY3RpdmUnIDogJyd9XCIgZGF0YS1hY3Rpb249XCJlbXBoYXNpemVcIiAgICBhcmlhLWxhYmVsPVwiRW1waGFzaXplICR7ZXNjYXBlSHRtbCh0aXRsZSl9XCIgICAgdGl0bGU9XCJFbXBoYXNpemUgXHUyMDE0IGZlYXR1cmUgcHJvbWluZW50bHlcIiAgc3R5bGU9XCJjb2xvcjojMTBiOTgxO1wiPlx1Mjc5NTwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0biAke2RlZmF1bHRBY3Rpb24gPT09ICdpbmNsdWRlJyAgICAgID8gJ2FjdGl2ZScgOiAnJ31cIiBkYXRhLWFjdGlvbj1cImluY2x1ZGVcIiAgICAgIGFyaWEtbGFiZWw9XCJJbmNsdWRlICR7ZXNjYXBlSHRtbCh0aXRsZSl9XCIgICAgICB0aXRsZT1cIkluY2x1ZGUgXHUyMDE0IHN0YW5kYXJkIHRyZWF0bWVudFwiPlx1MjcxMzwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0biAke2RlZmF1bHRBY3Rpb24gPT09ICdkZS1lbXBoYXNpemUnID8gJ2FjdGl2ZScgOiAnJ31cIiBkYXRhLWFjdGlvbj1cImRlLWVtcGhhc2l6ZVwiIGFyaWEtbGFiZWw9XCJEZS1lbXBoYXNpemUgJHtlc2NhcGVIdG1sKHRpdGxlKX1cIiB0aXRsZT1cIkRlLWVtcGhhc2l6ZSBcdTIwMTQgYnJpZWYgbWVudGlvbiBvbmx5XCIgIHN0eWxlPVwiY29sb3I6I2Y1OWUwYjtcIj5cdTI3OTY8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG4gJHtkZWZhdWx0QWN0aW9uID09PSAnZXhjbHVkZScgICAgICA/ICdhY3RpdmUnIDogJyd9XCIgZGF0YS1hY3Rpb249XCJleGNsdWRlXCIgICAgICBhcmlhLWxhYmVsPVwiRXhjbHVkZSAke2VzY2FwZUh0bWwodGl0bGUpfVwiICAgICAgdGl0bGU9XCJFeGNsdWRlIFx1MjAxNCBvbWl0IGZyb20gQ1ZcIiAgICAgICAgICAgIHN0eWxlPVwiY29sb3I6I2VmNDQ0NDtcIj4ke2V5ZVNsYXNoSWNvbigpfTwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIGFyaWEtbGFiZWw9XCJBSSByZXdyaXRlICR7ZXNjYXBlSHRtbCh0aXRsZSl9XCIgdGl0bGU9XCJBSSByZXdyaXRlIGRlc2NyaXB0aW9uXCIgb25jbGljaz1cImFpUmV3cml0ZVRvcExldmVsQWNoaWV2ZW1lbnQoJyR7ZXNjYXBlSHRtbChpZCl9JylcIj5cdTI3Mjg8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBhcmlhLWxhYmVsPVwiTW92ZSAke2VzY2FwZUh0bWwodGl0bGUpfSBlYXJsaWVyXCIgdGl0bGU9XCJNb3ZlIHVwXCIgICAke2lzRmlyc3QgPyAnZGlzYWJsZWQnIDogJyd9IG9uY2xpY2s9XCJtb3ZlQWNoaWV2ZW1lbnRSb3coJyR7ZXNjYXBlSHRtbChpZCl9JywtMSlcIj5cdTIxOTE8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBhcmlhLWxhYmVsPVwiTW92ZSAke2VzY2FwZUh0bWwodGl0bGUpfSBsYXRlclwiICAgdGl0bGU9XCJNb3ZlIGRvd25cIiAke2lzTGFzdCAgPyAnZGlzYWJsZWQnIDogJyd9IG9uY2xpY2s9XCJtb3ZlQWNoaWV2ZW1lbnRSb3coJyR7ZXNjYXBlSHRtbChpZCl9JywrMSlcIj5cdTIxOTM8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBhcmlhLWxhYmVsPVwiRGVsZXRlICR7ZXNjYXBlSHRtbCh0aXRsZSl9XCIgdGl0bGU9XCJEZWxldGUgYWNoaWV2ZW1lbnRcIiBvbmNsaWNrPVwiZGVsZXRlVG9wTGV2ZWxBY2hpZXZlbWVudCgnJHtlc2NhcGVIdG1sKGlkKX0nKVwiIHN0eWxlPVwiY29sb3I6I2VmNDQ0NDtcIj5cdUQ4M0RcdURERDE8L2J1dHRvbj5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvdHI+XG4gICAgYDtcbiAgfSk7XG5cbiAgLy8gQUktc3VnZ2VzdGVkIGFjaGlldmVtZW50cyBcdTIwMTQgZnVsbCBlZGl0aW5nL2NvbnRyb2wgcGFyaXR5IHdpdGggdXNlciBhY2hpZXZlbWVudHNcbiAgc3VnZ2VzdGVkQWNocy5mb3JFYWNoKChzdWdnLCByb3dJZHgpID0+IHtcbiAgICBjb25zdCBzdWdnSWQgICAgICA9IHN1Z2cuX3N1Z2dJZDtcbiAgICBjb25zdCBjb25mUmF3ICAgICA9IChzdWdnLmNvbmZpZGVuY2UgfHwgJ01lZGl1bScpLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgY29uZkxldmVsICAgPSBjb25mUmF3LmluY2x1ZGVzKCdoaWdoJykgPyAnaGlnaCcgOiBjb25mUmF3LmluY2x1ZGVzKCdsb3cnKSA/ICdsb3cnIDogJ21lZGl1bSc7XG4gICAgY29uc3QgY29uZlRleHQgICAgPSBzdWdnLmNvbmZpZGVuY2UgfHwgJ01lZGl1bSc7XG4gICAgY29uc3QgZGVmYXVsdEFjdGlvbiA9IHdpbmRvdy5hY2hpZXZlbWVudERlY2lzaW9uc1tzdWdnSWRdIHx8ICdpbmNsdWRlJztcbiAgICBjb25zdCBpc0ZpcnN0ICAgICA9IHJvd0lkeCA9PT0gMDtcbiAgICBjb25zdCBpc0xhc3QgICAgICA9IHJvd0lkeCA9PT0gc3VnZ2VzdGVkQWNocy5sZW5ndGggLSAxO1xuXG4gICAgaHRtbCArPSBgXG4gICAgICA8dHIgZGF0YS1hY2gtaWQ9XCIke2VzY2FwZUh0bWwoc3VnZ0lkKX1cIiBzdHlsZT1cImJhY2tncm91bmQ6I2ZlZmNlODtcIj5cbiAgICAgICAgPHRkIHN0eWxlPVwibWluLXdpZHRoOjIyMHB4O1wiPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZGlzcGxheTppbmxpbmUtYmxvY2s7YmFja2dyb3VuZDojZjU5ZTBiO2NvbG9yOiNmZmY7Zm9udC1zaXplOjAuN2VtO2ZvbnQtd2VpZ2h0OjcwMDtwYWRkaW5nOjFweCA2cHg7Ym9yZGVyLXJhZGl1czoxMHB4O21hcmdpbi1ib3R0b206NHB4O3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtcIj5cdTJCNTAgQUkgU3VnZ2VzdGVkPC9zcGFuPlxuICAgICAgICAgIDxpbnB1dCBpZD1cImFjaC10aXRsZS0ke2VzY2FwZUh0bWwoc3VnZ0lkKX1cIlxuICAgICAgICAgICAgdHlwZT1cInRleHRcIiB2YWx1ZT1cIiR7ZXNjYXBlSHRtbChzdWdnLnRpdGxlIHx8ICcnKX1cIlxuICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDoxMDAlO2ZvbnQtd2VpZ2h0OjYwMDtwYWRkaW5nOjNweCA2cHg7Ym9yZGVyOjFweCBzb2xpZCAjZDFkNWRiO2JvcmRlci1yYWRpdXM6NHB4O2ZvbnQtc2l6ZTowLjllbTtib3gtc2l6aW5nOmJvcmRlci1ib3g7XCJcbiAgICAgICAgICAgIG9uYmx1cj1cInNhdmVTdWdnZXN0ZWRBY2hpZXZlbWVudEZpZWxkKCcke2VzY2FwZUh0bWwoc3VnZ0lkKX0nLCAndGl0bGUnLCB0aGlzLnZhbHVlKVwiXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiQWNoaWV2ZW1lbnQgdGl0bGVcIj5cbiAgICAgICAgICA8dGV4dGFyZWEgaWQ9XCJhY2gtZGVzYy0ke2VzY2FwZUh0bWwoc3VnZ0lkKX1cIlxuICAgICAgICAgICAgcm93cz1cIjJcIlxuICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDoxMDAlO21hcmdpbi10b3A6NHB4O3BhZGRpbmc6M3B4IDZweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo0cHg7Zm9udC1zaXplOjAuODVlbTtyZXNpemU6dmVydGljYWw7Ym94LXNpemluZzpib3JkZXItYm94O1wiXG4gICAgICAgICAgICBvbmJsdXI9XCJzYXZlU3VnZ2VzdGVkQWNoaWV2ZW1lbnRGaWVsZCgnJHtlc2NhcGVIdG1sKHN1Z2dJZCl9JywgJ2Rlc2NyaXB0aW9uJywgdGhpcy52YWx1ZSlcIlxuICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkFjaGlldmVtZW50IGRlc2NyaXB0aW9uXCJcbiAgICAgICAgICA+JHtlc2NhcGVIdG1sKHN1Z2cuZGVzY3JpcHRpb24gfHwgJycpfTwvdGV4dGFyZWE+XG4gICAgICAgICAgJHtzdWdnLmV4cGVyaWVuY2VfaWQgPyBgPHNtYWxsIHN0eWxlPVwiY29sb3I6IzljYTNhZjtcIj5FeHBlcmllbmNlOiAke2VzY2FwZUh0bWwoc3VnZy5leHBlcmllbmNlX2lkKX08L3NtYWxsPmAgOiAnJ31cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkPjxzdHJvbmc+QWRkIE5ldzwvc3Ryb25nPjwvdGQ+XG4gICAgICAgIDx0ZD48c3BhbiBjbGFzcz1cImNvbmZpZGVuY2UtYmFkZ2UgY29uZmlkZW5jZS0ke2NvbmZMZXZlbH1cIj4ke2VzY2FwZUh0bWwoY29uZlRleHQpfTwvc3Bhbj48L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJtYXgtd2lkdGg6MjAwcHg7XCI+PHNtYWxsPiR7ZXNjYXBlSHRtbChzdWdnLnJhdGlvbmFsZSB8fCAnJyl9PC9zbWFsbD48L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJhY3Rpb24tYnRuc1wiIHN0eWxlPVwid2hpdGUtc3BhY2U6bm93cmFwO1wiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0biAke2RlZmF1bHRBY3Rpb24gPT09ICdlbXBoYXNpemUnICAgID8gJ2FjdGl2ZScgOiAnJ31cIiBkYXRhLWFjdGlvbj1cImVtcGhhc2l6ZVwiICAgIGFyaWEtbGFiZWw9XCJFbXBoYXNpemVcIiAgICB0aXRsZT1cIkVtcGhhc2l6ZSBcdTIwMTQgZmVhdHVyZSBwcm9taW5lbnRseVwiICBzdHlsZT1cImNvbG9yOiMxMGI5ODE7XCI+XHUyNzk1PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuICR7ZGVmYXVsdEFjdGlvbiA9PT0gJ2luY2x1ZGUnICAgICAgPyAnYWN0aXZlJyA6ICcnfVwiIGRhdGEtYWN0aW9uPVwiaW5jbHVkZVwiICAgICAgYXJpYS1sYWJlbD1cIkluY2x1ZGVcIiAgICAgIHRpdGxlPVwiSW5jbHVkZSBcdTIwMTQgYWRkIHRvIENWXCI+XHUyNzEzPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuICR7ZGVmYXVsdEFjdGlvbiA9PT0gJ2RlLWVtcGhhc2l6ZScgPyAnYWN0aXZlJyA6ICcnfVwiIGRhdGEtYWN0aW9uPVwiZGUtZW1waGFzaXplXCIgYXJpYS1sYWJlbD1cIkRlLWVtcGhhc2l6ZVwiIHRpdGxlPVwiRGUtZW1waGFzaXplIFx1MjAxNCBicmllZiBtZW50aW9uIG9ubHlcIiAgc3R5bGU9XCJjb2xvcjojZjU5ZTBiO1wiPlx1Mjc5NjwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0biAke2RlZmF1bHRBY3Rpb24gPT09ICdleGNsdWRlJyAgICAgID8gJ2FjdGl2ZScgOiAnJ31cIiBkYXRhLWFjdGlvbj1cImV4Y2x1ZGVcIiAgICAgIGFyaWEtbGFiZWw9XCJFeGNsdWRlXCIgICAgICB0aXRsZT1cIlNraXAgXHUyMDE0IGRvIG5vdCBhZGRcIiAgICAgICAgICAgICAgICAgc3R5bGU9XCJjb2xvcjojZWY0NDQ0O1wiPiR7ZXllU2xhc2hJY29uKCl9PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgYXJpYS1sYWJlbD1cIkFJIHJld3JpdGVcIiB0aXRsZT1cIkFJIHJld3JpdGUgZGVzY3JpcHRpb25cIiBvbmNsaWNrPVwiYWlSZXdyaXRlU3VnZ2VzdGVkQWNoaWV2ZW1lbnQoJyR7ZXNjYXBlSHRtbChzdWdnSWQpfScpXCI+XHUyNzI4PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgYXJpYS1sYWJlbD1cIk1vdmUgZWFybGllclwiIHRpdGxlPVwiTW92ZSB1cFwiICAgJHtpc0ZpcnN0ID8gJ2Rpc2FibGVkJyA6ICcnfSBvbmNsaWNrPVwibW92ZVN1Z2dlc3RlZEFjaGlldmVtZW50Um93KCcke2VzY2FwZUh0bWwoc3VnZ0lkKX0nLC0xKVwiPlx1MjE5MTwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIGFyaWEtbGFiZWw9XCJNb3ZlIGxhdGVyXCIgICB0aXRsZT1cIk1vdmUgZG93blwiICR7aXNMYXN0ICA/ICdkaXNhYmxlZCcgOiAnJ30gb25jbGljaz1cIm1vdmVTdWdnZXN0ZWRBY2hpZXZlbWVudFJvdygnJHtlc2NhcGVIdG1sKHN1Z2dJZCl9JywrMSlcIj5cdTIxOTM8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBhcmlhLWxhYmVsPVwiUmVtb3ZlIHN1Z2dlc3Rpb25cIiB0aXRsZT1cIlJlbW92ZSBzdWdnZXN0aW9uXCIgb25jbGljaz1cImRlbGV0ZVN1Z2dlc3RlZEFjaGlldmVtZW50KCcke2VzY2FwZUh0bWwoc3VnZ0lkKX0nKVwiIHN0eWxlPVwiY29sb3I6I2VmNDQ0NDtcIj5cdUQ4M0RcdURERDE8L2J1dHRvbj5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvdHI+XG4gICAgYDtcbiAgfSk7XG5cbiAgaHRtbCArPSAnPC90Ym9keT48L3RhYmxlPic7XG4gIGNvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sO1xuXG4gIC8vIEJ1bGsgdG9vbGJhciBhYm92ZSB0aGUgZmlsdGVyIHJvd1xuICBjb25zdCBhY2hUb29sYmFyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGFjaFRvb2xiYXIuY2xhc3NOYW1lID0gJ2J1bGstdG9vbGJhcic7XG4gIGFjaFRvb2xiYXIuaW5uZXJIVE1MID0gYFxuICAgIDxzcGFuPkJ1bGs6PC9zcGFuPlxuICAgIDxidXR0b24gY2xhc3M9XCJidWxrLWJ0biBidWxrLXJlY29tbWVuZGVkXCIgb25jbGljaz1cImJ1bGtBY2hpZXZlbWVudEFjdGlvbigncmVjb21tZW5kZWQnKVwiIHRpdGxlPVwiU2V0IGFsbCB0byB0aGUgTExNIHJlY29tbWVuZGF0aW9uXCI+XHUyNzI4IEFjY2VwdCBBbGwgUmVjb21tZW5kZWQ8L2J1dHRvbj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnVsay1idG4gYnVsay1lbXBoYXNpemVcIiAgIG9uY2xpY2s9XCJidWxrQWNoaWV2ZW1lbnRBY3Rpb24oJ2VtcGhhc2l6ZScpXCI+XHUyNzk1IEVtcGhhc2l6ZSBBbGw8L2J1dHRvbj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnVsay1idG4gYnVsay1pbmNsdWRlXCIgICAgIG9uY2xpY2s9XCJidWxrQWNoaWV2ZW1lbnRBY3Rpb24oJ2luY2x1ZGUnKVwiPlx1MjcxMyBJbmNsdWRlIEFsbDwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJidWxrLWJ0biBidWxrLWV4Y2x1ZGVcIiAgICAgb25jbGljaz1cImJ1bGtBY2hpZXZlbWVudEFjdGlvbignZXhjbHVkZScpXCI+JHtleWVTbGFzaEljb24oKX0gRXhjbHVkZSBBbGw8L2J1dHRvbj5cbiAgYDtcbiAgY29udGFpbmVyLmluc2VydEJlZm9yZShhY2hUb29sYmFyLCBjb250YWluZXIuZmlyc3RDaGlsZCk7XG5cbiAgLy8gRGVsZWdhdGVkIGNsaWNrIGhhbmRsZXIgZm9yIGRlY2lzaW9uIGJ1dHRvbnNcbiAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ3Rib2R5Jyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZSA9PiB7XG4gICAgY29uc3QgYnRuID0gZS50YXJnZXQuY2xvc2VzdCgnLmljb24tYnRuW2RhdGEtYWN0aW9uXScpO1xuICAgIGlmICghYnRuKSByZXR1cm47XG4gICAgY29uc3QgdHIgPSBidG4uY2xvc2VzdCgndHJbZGF0YS1hY2gtaWRdJyk7XG4gICAgaWYgKCF0cikgcmV0dXJuO1xuICAgIGNvbnN0IGFjdGlvbiA9IGJ0bi5kYXRhc2V0LmFjdGlvbjtcbiAgICBpZiAoYWN0aW9uKSBoYW5kbGVBY2hpZXZlbWVudEFjdGlvbih0ci5kYXRhc2V0LmFjaElkLCBhY3Rpb24pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gYnVsa0FjaGlldmVtZW50QWN0aW9uKGFjdGlvbikge1xuICBjb25zdCBkYXRhID0gd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnMgfHwge307XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNhY2hpZXZlbWVudHMtcmV2aWV3LXRhYmxlIHRib2R5IHRyW2RhdGEtYWNoLWlkXScpLmZvckVhY2gocm93ID0+IHtcbiAgICBpZiAocm93LnN0eWxlLmRpc3BsYXkgPT09ICdub25lJykgcmV0dXJuOyAgIC8vIHJlc3BlY3QgZmlsdGVyXG4gICAgY29uc3QgYWNoSWQgPSByb3cuZGF0YXNldC5hY2hJZDtcbiAgICBpZiAoIWFjaElkKSByZXR1cm47XG4gICAgbGV0IHJlc29sdmVkQWN0aW9uID0gYWN0aW9uO1xuICAgIGlmIChhY3Rpb24gPT09ICdyZWNvbW1lbmRlZCcpIHtcbiAgICAgIGlmIChhY2hJZC5zdGFydHNXaXRoKCdzdWdnOjonKSkge1xuICAgICAgICByZXNvbHZlZEFjdGlvbiA9ICdpbmNsdWRlJzsgLy8gQUktc3VnZ2VzdGVkIGl0ZW1zIGRlZmF1bHQgdG8gaW5jbHVkZSB3aGVuIGFjY2VwdGluZyBhbGxcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlYyA9IGdldEFjaGlldmVtZW50UmVjb21tZW5kYXRpb24oYWNoSWQsIGRhdGEpO1xuICAgICAgICBpZiAocmVjID09PSAnRW1waGFzaXplJykgICAgICAgICByZXNvbHZlZEFjdGlvbiA9ICdlbXBoYXNpemUnO1xuICAgICAgICBlbHNlIGlmIChyZWMgPT09ICdJbmNsdWRlJykgICAgICByZXNvbHZlZEFjdGlvbiA9ICdpbmNsdWRlJztcbiAgICAgICAgZWxzZSBpZiAocmVjID09PSAnRGUtZW1waGFzaXplJykgcmVzb2x2ZWRBY3Rpb24gPSAnZGUtZW1waGFzaXplJztcbiAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRBY3Rpb24gPSAnZXhjbHVkZSc7XG4gICAgICB9XG4gICAgfVxuICAgIGhhbmRsZUFjaGlldmVtZW50QWN0aW9uKGFjaElkLCByZXNvbHZlZEFjdGlvbik7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBoYW5kbGVBY2hpZXZlbWVudEFjdGlvbihhY2hJZCwgYWN0aW9uKSB7XG4gIHdpbmRvdy5hY2hpZXZlbWVudERlY2lzaW9uc1thY2hJZF0gPSBhY3Rpb247XG4gIGNvbnN0IHJvdyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYHRyW2RhdGEtYWNoLWlkPVwiJHtDU1MuZXNjYXBlKGFjaElkKX1cIl1gKTtcbiAgaWYgKCFyb3cpIHJldHVybjtcbiAgcm93LnF1ZXJ5U2VsZWN0b3JBbGwoJy5pY29uLWJ0bicpLmZvckVhY2goYnRuID0+IGJ0bi5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKSk7XG4gIGNvbnN0IGFjdGl2ZUJ0biA9IHJvdy5xdWVyeVNlbGVjdG9yKGBbZGF0YS1hY3Rpb249XCIke2FjdGlvbn1cIl1gKTtcbiAgaWYgKGFjdGl2ZUJ0bikgYWN0aXZlQnRuLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzdWJtaXRBY2hpZXZlbWVudERlY2lzaW9ucygpIHtcbiAgLyogZHVja2Zsb3c6XG4gICAqICAgaWQ6IGFjaGlldmVtZW50c191aV9zdWJtaXRfbGl2ZVxuICAgKiAgIGtpbmQ6IHVpXG4gICAqICAgdGltZXN0YW1wOiAnMjAyNi0wMy0yNVQyMTozOTo0OFonXG4gICAqICAgc3RhdHVzOiBsaXZlXG4gICAqICAgaGFuZGxlczpcbiAgICogICAtIHVpOmFjaGlldmVtZW50cy1yZXZpZXcuc3VibWl0XG4gICAqICAgY2FsbHM6XG4gICAqICAgLSBQT1NUIC9hcGkvcmV2aWV3LWRlY2lzaW9uc1xuICAgKiAgIC0gUE9TVCAvYXBpL2N2L2xheW91dC1lc3RpbWF0ZVxuICAgKiAgIHJlYWRzOlxuICAgKiAgIC0gd2luZG93OmFjaGlldmVtZW50RGVjaXNpb25zXG4gICAqICAgLSB3aW5kb3c6X3N1Z2dlc3RlZEFjaHNPcmRlcmVkXG4gICAqICAgd3JpdGVzOlxuICAgKiAgIC0gcmVxdWVzdDpQT1NUIC9hcGkvcmV2aWV3LWRlY2lzaW9ucy5kZWNpc2lvbnNcbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL3Jldmlldy1kZWNpc2lvbnMuYWNjZXB0ZWRfc3VnZ2VzdGlvbnNcbiAgICogICAtIHdpbmRvdzpfc2F2ZWREZWNpc2lvbnMuYWNoaWV2ZW1lbnRfZGVjaXNpb25zXG4gICAqICAgLSB3aW5kb3c6X3NhdmVkRGVjaXNpb25zLmFjY2VwdGVkX3N1Z2dlc3RlZF9hY2hpZXZlbWVudHNcbiAgICogICBub3RlczogUGVyc2lzdHMgYWNoaWV2ZW1lbnQgaW5jbHVzaW9uIGRlY2lzaW9ucyBhbmQgdGhlIGFjY2VwdGVkIEFJLXN1Z2dlc3RlZCBhY2hpZXZlbWVudHMgdGhhdCBzaG91bGQgcmVtYWluIHNlc3Npb24tb25seSB1bnRpbCBhbiBleHBsaWNpdCBoYXJ2ZXN0IHN0ZXAuXG4gICAqL1xuICBjb25zdCBhbGxEZWNpc2lvbnMgPSB3aW5kb3cuYWNoaWV2ZW1lbnREZWNpc2lvbnMgfHwge307XG4gIC8vIFNlcGFyYXRlIGV4aXN0aW5nIGFjaGlldmVtZW50cyBmcm9tIEFJLXN1Z2dlc3RlZCBvbmVzXG4gIGNvbnN0IGRlY2lzaW9ucyA9IHt9O1xuICBjb25zdCBzdWdnZXN0ZWREZWNpc2lvbnMgPSB7fTtcbiAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMoYWxsRGVjaXNpb25zKSkge1xuICAgIGlmIChrLnN0YXJ0c1dpdGgoJ3N1Z2c6OicpKSBzdWdnZXN0ZWREZWNpc2lvbnNba10gPSB2O1xuICAgIGVsc2UgZGVjaXNpb25zW2tdID0gdjtcbiAgfVxuICBjb25zdCBjb3VudCA9IE9iamVjdC5rZXlzKGFsbERlY2lzaW9ucykubGVuZ3RoO1xuICBpZiAoY291bnQgPT09IDApIHJldHVybjtcbiAgLy8gUmVzb2x2ZSBzdWdnZXN0ZWQgYWNoaWV2ZW1lbnQgb2JqZWN0cyB0aGF0IHdlcmUgYWNjZXB0ZWRcbiAgY29uc3Qgc3VnZ2VzdGVkQWNocyA9IHdpbmRvdy5fc3VnZ2VzdGVkQWNoc09yZGVyZWQgfHwgW107XG4gIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbnMgPSBzdWdnZXN0ZWRBY2hzXG4gICAgLmZpbHRlcihzID0+IHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IHN1Z2dlc3RlZERlY2lzaW9uc1tzLl9zdWdnSWRdO1xuICAgICAgcmV0dXJuIGFjdGlvbiA9PT0gJ2luY2x1ZGUnIHx8IGFjdGlvbiA9PT0gJ2VtcGhhc2l6ZSc7XG4gICAgfSlcbiAgICAubWFwKHMgPT4gKHsgdGl0bGU6IHMudGl0bGUsIGRlc2NyaXB0aW9uOiBzLmRlc2NyaXB0aW9uLCBleHBlcmllbmNlX2lkOiBzLmV4cGVyaWVuY2VfaWQsIHJhdGlvbmFsZTogcy5yYXRpb25hbGUgfSkpO1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvcmV2aWV3LWRlY2lzaW9ucycsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHR5cGU6ICdhY2hpZXZlbWVudHMnLCBkZWNpc2lvbnMsIGFjY2VwdGVkX3N1Z2dlc3Rpb25zOiBhY2NlcHRlZFN1Z2dlc3Rpb25zIH0pXG4gICAgfSk7XG4gICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICBzdGF0ZU1hbmFnZXIubWFya0NvbnRlbnRDaGFuZ2VkKCk7XG4gICAgICBzaG93VG9hc3QoYEFjaGlldmVtZW50IHNlbGVjdGlvbnMgc2F2ZWQgKCR7Y291bnR9IGl0ZW1zKWApO1xuICAgICAgc2NoZWR1bGVBdHNSZWZyZXNoKCk7XG4gICAgICAvLyBQZXJzaXN0IGxvY2FsbHkgc28gdGhlIHJldmlldyBVSSBpbW1lZGlhdGVseSByZWZsZWN0cyBzYXZlZCBjaG9pY2VzXG4gICAgICB3aW5kb3cuX3NhdmVkRGVjaXNpb25zID0gd2luZG93Ll9zYXZlZERlY2lzaW9ucyB8fCB7fTtcbiAgICAgIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMuYWNoaWV2ZW1lbnRfZGVjaXNpb25zID0gZGVjaXNpb25zO1xuICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbnMgJiYgYWNjZXB0ZWRTdWdnZXN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHdpbmRvdy5fc2F2ZWREZWNpc2lvbnMuYWNjZXB0ZWRfc3VnZ2VzdGVkX2FjaGlldmVtZW50cyA9IGFjY2VwdGVkU3VnZ2VzdGlvbnM7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHVwZGF0ZUluY2x1c2lvbkNvdW50cyA9PT0gJ2Z1bmN0aW9uJykgdXBkYXRlSW5jbHVzaW9uQ291bnRzKCk7XG4gICAgICBzd2l0Y2hUYWIoJ3RhZ2xpbmUtcmV2aWV3Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGVyciA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIHNob3dUb2FzdChgRXJyb3I6ICR7ZXJyLmVycm9yIHx8ICdGYWlsZWQgdG8gc2F2ZSBzZWxlY3Rpb25zJ31gLCAnZXJyb3InKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBzaG93VG9hc3QoJ0ZhaWxlZCB0byBzYXZlIGFjaGlldmVtZW50IHNlbGVjdGlvbnMuIFBsZWFzZSB0cnkgYWdhaW4uJywgJ2Vycm9yJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbW92ZUFjaGlldmVtZW50Um93KGFjaElkLCBkaXJlY3Rpb24pIHtcbiAgY29uc3QgYXJyID0gd2luZG93Ll9hY2hpZXZlbWVudHNPcmRlcmVkO1xuICBpZiAoIWFycikgcmV0dXJuO1xuICBjb25zdCBpZHggPSBhcnIuZmluZEluZGV4KGEgPT4gYS5pZCA9PT0gYWNoSWQpO1xuICBpZiAoaWR4IDwgMCkgcmV0dXJuO1xuICBjb25zdCBuZXdJZHggPSBpZHggKyBkaXJlY3Rpb247XG4gIGlmIChuZXdJZHggPCAwIHx8IG5ld0lkeCA+PSBhcnIubGVuZ3RoKSByZXR1cm47XG4gIFthcnJbaWR4XSwgYXJyW25ld0lkeF1dID0gW2FycltuZXdJZHhdLCBhcnJbaWR4XV07XG4gIHdpbmRvdy5fYWNoaWV2ZW1lbnRzT3JkZXJlZCA9IGFycjtcbiAgX3JlbmRlckFjaGlldmVtZW50c1Jldmlld1RhYmxlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhY2hpZXZlbWVudHMtdGFibGUtY29udGFpbmVyJykpO1xufVxuXG4vLyA9PT09IEFjaGlldmVtZW50cyBFZGl0b3IgVGFiID09PT1cblxuLyoqXG4gKiBCdWlsZCB0aGUgcGVyLWV4cGVyaWVuY2UgYWNoaWV2ZW1lbnRzIGVkaXRvciB0YWIuXG4gKiBFYWNoIGV4cGVyaWVuY2UgZ2V0cyBhIGNvbGxhcHNpYmxlIGNhcmQgd2l0aCBpdHMgYWNoaWV2ZW1lbnRzIGxpc3RlZC5cbiAqIEVhY2ggYWNoaWV2ZW1lbnQgc3VwcG9ydHM6IGlubGluZSBlZGl0LCByZW9yZGVyIChcdTIxOTFcdTIxOTMpLCBkZWxldGUsIGFuZCBMTE0gcmV3cml0ZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYnVpbGRBY2hpZXZlbWVudHNFZGl0b3IoKSB7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIGlmICghY29udGFpbmVyKSByZXR1cm47XG5cbiAgY29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTJweDtwYWRkaW5nOjIwcHg7Y29sb3I6IzZiNzI4MDtcIj48ZGl2IGNsYXNzPVwibG9hZGluZy1zcGlubmVyXCIgc3R5bGU9XCJ3aWR0aDoyMHB4O2hlaWdodDoyMHB4O2JvcmRlci13aWR0aDoycHg7ZmxleC1zaHJpbms6MDtcIj48L2Rpdj48c3Bhbj5Mb2FkaW5nIGV4cGVyaWVuY2UgYnVsbGV0cyBlZGl0b3JcdTIwMjY8L3NwYW4+PC9kaXY+JztcblxuICAvLyBGZXRjaCBleHBlcmllbmNlcyArIHRoZWlyIGFjaGlldmVtZW50cyBmcm9tIG1hc3RlciBmaWVsZHNcbiAgbGV0IGV4cGVyaWVuY2VzID0gW107XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWZpZWxkcycpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGV4cGVyaWVuY2VzID0gZGF0YS5leHBlcmllbmNlcyB8fCBbXTtcbiAgfSBjYXRjaCAoXykge31cblxuICBpZiAoZXhwZXJpZW5jZXMubGVuZ3RoID09PSAwKSB7XG4gICAgY29udGFpbmVyLmlubmVySFRNTCA9ICc8cCBzdHlsZT1cInBhZGRpbmc6MjBweDtjb2xvcjojNmI3MjgwO1wiPk5vIGV4cGVyaWVuY2VzIGZvdW5kIGluIG1hc3RlciBDVi48L3A+JztcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBJbml0aWFsaXNlIGVkaXRzIHN0b3JlIFx1MjAxNCBrZXllZCBieSBleHBlcmllbmNlIGluZGV4LCB2YWx1ZSBpcyBhcnJheSBvZiB7IHRleHQsIGhpZGRlbiB9XG4gIHdpbmRvdy5hY2hpZXZlbWVudEVkaXRzID0gd2luZG93LmFjaGlldmVtZW50RWRpdHMgfHwge307XG4gIGV4cGVyaWVuY2VzLmZvckVhY2goKGV4cCwgZXhwSWR4KSA9PiB7XG4gICAgaWYgKCF3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0c1tleHBJZHhdKSB7XG4gICAgICB3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0c1tleHBJZHhdID0gKGV4cC5rZXlfYWNoaWV2ZW1lbnRzIHx8IGV4cC5hY2hpZXZlbWVudHMgfHwgW10pLm1hcChhID0+XG4gICAgICAgIF9ub3JtYWxpemVBY2hpZXZlbWVudEVkaXRFbnRyeShcbiAgICAgICAgICB0eXBlb2YgYSA9PT0gJ3N0cmluZycgPyBhIDogKGEgJiYgKGEudGV4dCB8fCBhLmRlc2NyaXB0aW9uIHx8IGEuY29udGVudCB8fCAnJykpIHx8ICcnXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdpbmRvdy5hY2hpZXZlbWVudEVkaXRzW2V4cElkeF0gPSBfbm9ybWFsaXplQWNoaWV2ZW1lbnRFZGl0TGlzdCh3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0c1tleHBJZHhdKTtcbiAgICB9XG4gIH0pO1xuXG4gIGxldCBodG1sID0gYFxuICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nOjE2cHg7XCI+XG4gICAgICA8aDIgc3R5bGU9XCJtYXJnaW46MCAwIDRweDtcIj5cdTI3MEZcdUZFMEYgRXhwZXJpZW5jZSBCdWxsZXRzPC9oMj5cbiAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDttYXJnaW46MCAwIDE2cHg7Zm9udC1zaXplOjAuOWVtO1wiPlxuICAgICAgICBFZGl0LCByZW9yZGVyLCBkZWxldGUsIG9yIEFJLXJld3JpdGUgaW5kaXZpZHVhbCBleHBlcmllbmNlIGJ1bGxldHMgcGVyIHJvbGUuXG4gICAgICAgIENoYW5nZXMgYXJlIHNhdmVkIGF1dG9tYXRpY2FsbHkgYW5kIHVzZWQgZHVyaW5nIENWIGdlbmVyYXRpb24uXG4gICAgICA8L3A+XG4gIGA7XG5cbiAgLy8gRmlsdGVyIG91dCBleHBlcmllbmNlcyB0aGF0IHVzZXIgbWFya2VkIGFzIGV4Y2x1ZGVkIChwZXJzaXN0ZWQgZGVjaXNpb25zKVxuICBjb25zdCBleHBEZWNpc2lvbnMgPSAod2luZG93Ll9zYXZlZERlY2lzaW9ucyAmJiB3aW5kb3cuX3NhdmVkRGVjaXNpb25zLmV4cGVyaWVuY2VfZGVjaXNpb25zKSB8fCB1c2VyU2VsZWN0aW9ucy5leHBlcmllbmNlcyB8fCB7fTtcbiAgZXhwZXJpZW5jZXMuZm9yRWFjaCgoZXhwLCBleHBJZHgpID0+IHtcbiAgICBjb25zdCBleHBJZCA9IGV4cC5pZCB8fCBleHAuZXhwZXJpZW5jZV9pZCB8fCBgZXhwOjoke2V4cElkeH1gO1xuICAgIGNvbnN0IGRlY2lzaW9uID0gZXhwRGVjaXNpb25zW2V4cElkXTtcbiAgICBpZiAoZGVjaXNpb24gPT09ICdleGNsdWRlJykgcmV0dXJuOyAvLyBvbWl0IGV4Y2x1ZGVkIGV4cGVyaWVuY2VzIGZyb20gZWRpdG9yXG4gICAgY29uc3QgdGl0bGUgICAgPSBlc2NhcGVIdG1sKGV4cC50aXRsZSB8fCBleHAucG9zaXRpb24gfHwgYEV4cGVyaWVuY2UgJHtleHBJZHggKyAxfWApO1xuICAgIGNvbnN0IGNvbXBhbnkgID0gZXNjYXBlSHRtbChleHAuY29tcGFueSB8fCBleHAub3JnYW5pemF0aW9uIHx8ICcnKTtcbiAgICBjb25zdCBhY2hDb3VudCA9IHdpbmRvdy5hY2hpZXZlbWVudEVkaXRzW2V4cElkeF0ubGVuZ3RoO1xuXG4gICAgaHRtbCArPSBgXG4gICAgICA8ZGV0YWlscyBvcGVuIHN0eWxlPVwibWFyZ2luLWJvdHRvbToxMnB4O2JvcmRlcjoxcHggc29saWQgI2U1ZTdlYjtib3JkZXItcmFkaXVzOjhweDtvdmVyZmxvdzpoaWRkZW47XCI+XG4gICAgICAgIDxzdW1tYXJ5IHN0eWxlPVwicGFkZGluZzoxMnB4IDE2cHg7YmFja2dyb3VuZDojZjlmYWZiO2N1cnNvcjpwb2ludGVyO2ZvbnQtd2VpZ2h0OjYwMDtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDo4cHg7XCI+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJmbGV4OjE7XCI+JHt0aXRsZX0ke2NvbXBhbnkgPyBgIDxzcGFuIHN0eWxlPVwiZm9udC13ZWlnaHQ6NDAwO2NvbG9yOiM2YjcyODA7XCI+QCAke2NvbXBhbnl9PC9zcGFuPmAgOiAnJ308L3NwYW4+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC44ZW07Y29sb3I6IzljYTNhZjtcIj4ke2FjaENvdW50fSBidWxsZXQke2FjaENvdW50ICE9PSAxID8gJ3MnIDogJyd9PC9zcGFuPlxuICAgICAgICA8L3N1bW1hcnk+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nOjEycHggMTZweDtcIiBpZD1cImFjaC1lZGl0b3ItZXhwLSR7ZXhwSWR4fVwiPlxuICAgICAgICAgIDxkaXYgaWQ9XCJhY2gtbGlzdC0ke2V4cElkeH1cIj48L2Rpdj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLXNlY29uZGFyeVwiIHN0eWxlPVwibWFyZ2luLXRvcDo4cHg7Zm9udC1zaXplOjAuODVlbTtcIlxuICAgICAgICAgICAgb25jbGljaz1cImFkZEFjaGlldmVtZW50Um93KCR7ZXhwSWR4fSlcIj4rIEFkZCBCdWxsZXQ8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2RldGFpbHM+XG4gICAgYDtcbiAgfSk7XG5cbiAgaHRtbCArPSBgXG4gICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6MjBweDtkaXNwbGF5OmZsZXg7Z2FwOjEycHg7YWxpZ24taXRlbXM6Y2VudGVyO1wiPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImJhY2stYnRuXCIgb25jbGljaz1cInN3aXRjaFRhYignZXhwLXJldmlldycpXCI+XHUyMTkwIEJhY2sgdG8gRXhwZXJpZW5jZXM8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJjb250aW51ZS1idG5cIiBvbmNsaWNrPVwic2F2ZUFjaGlldmVtZW50RWRpdHNBbmRDb250aW51ZSgpXCI+U2F2ZSAmYW1wOyBDb250aW51ZSB0byBTa2lsbHMgXHUyMTkyPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGA7XG5cbiAgY29udGFpbmVyLmlubmVySFRNTCA9IGh0bWw7XG5cbiAgLy8gUmVuZGVyIGFjaGlldmVtZW50IHJvd3MgZm9yIGVhY2ggZXhwZXJpZW5jZVxuICBleHBlcmllbmNlcy5mb3JFYWNoKChfLCBleHBJZHgpID0+IHJlbmRlckFjaGlldmVtZW50RWRpdG9yUm93cyhleHBJZHgpKTtcbn1cblxuLy8gVmVyYnMgdGhhdCBnZW5lcmF0ZSBhIHdlYWstdmVyYiB3YXJuaW5nIGJhZGdlIGluIHRoZSBidWxsZXQgZWRpdG9yLlxuY29uc3QgX0FDSF9QQVNTSVZFX1NUQVJUUyA9IG5ldyBTZXQoWyd3YXMnLCd3ZXJlJywnaXMnLCdhcmUnLCdiZWVuJ10pO1xuY29uc3QgX0FDSF9XRUFLX1ZFUkJTID0gbmV3IFNldChbXG4gICdhc3Npc3RlZCcsJ2NvbnRyaWJ1dGVkJywnaGVscGVkJywncGFydGljaXBhdGVkJywnc3VwcG9ydGVkJyxcbiAgJ3N1cGVydmlzZWQnLCd3b3JrZWQnLCdjb2xsYWJvcmF0ZWQnLCdjb29wZXJhdGVkJyxcbl0pO1xuY29uc3QgX0FDSF9TVFJPTkdfVkVSQlMgPSBuZXcgU2V0KFtcbiAgJ2FjY2VsZXJhdGVkJywnYWNoaWV2ZWQnLCdhcmNoaXRlY3RlZCcsJ2F1dG9tYXRlZCcsJ2J1aWx0JyxcbiAgJ2NoYW1waW9uZWQnLCdjb2luZWQnLCdjb25jZWl2ZWQnLCdjb25kdWN0ZWQnLCdjb25zb2xpZGF0ZWQnLFxuICAnY3JlYXRlZCcsJ2N1dCcsJ2RlbGl2ZXJlZCcsJ2RlbW9uc3RyYXRlZCcsJ2RlcGxveWVkJyxcbiAgJ2Rlc2lnbmVkJywnZGV2ZWxvcGVkJywnZGlyZWN0ZWQnLCdkb3VibGVkJywnZHJvdmUnLFxuICAnZW5hYmxlZCcsJ2VzdGFibGlzaGVkJywnZXhwYW5kZWQnLCdmb3VuZGVkJywnZ2VuZXJhdGVkJyxcbiAgJ2dyZXcnLCdpbXBsZW1lbnRlZCcsJ2ltcHJvdmVkJywnaW5jcmVhc2VkJywnaW50ZWdyYXRlZCcsXG4gICdpbnZlbnRlZCcsJ2xhdW5jaGVkJywnbGVkJywnbWFuYWdlZCcsJ29wdGltaXplZCcsJ3Bpb25lZXJlZCcsXG4gICdwcm92aWRlZCcsJ3B1Ymxpc2hlZCcsJ3JhaXNlZCcsJ3JlZHVjZWQnLCdyZWZhY3RvcmVkJywnc2NhbGVkJyxcbiAgJ3NlY3VyZWQnLCdzaGlwcGVkJywnc3BlYXJoZWFkZWQnLCdzdHJlYW1saW5lZCcsJ3RhdWdodCcsXG4gICd0cmFuc2Zvcm1lZCcsJ3RyYW5zbGF0ZWQnLCd0cmlwbGVkJyxcbl0pO1xuXG5mdW5jdGlvbiBfYWNoVmVyYldhcm5pbmcodGV4dCkge1xuICBjb25zdCBmaXJzdFdvcmQgPSAodGV4dCB8fCAnJykudHJpbSgpLnNwbGl0KC9bXFxzLC46O10vKVswXS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1teYS16XS9nLCAnJyk7XG4gIGlmICghZmlyc3RXb3JkKSByZXR1cm4gbnVsbDtcbiAgaWYgKF9BQ0hfUEFTU0lWRV9TVEFSVFMuaGFzKGZpcnN0V29yZCkpIHJldHVybiB7IGxldmVsOiAncGFzc2l2ZScsIHdvcmQ6IGZpcnN0V29yZCB9O1xuICBpZiAoX0FDSF9XRUFLX1ZFUkJTLmhhcyhmaXJzdFdvcmQpKSByZXR1cm4geyBsZXZlbDogJ3dlYWsnLCAgICB3b3JkOiBmaXJzdFdvcmQgfTtcbiAgaWYgKCFfQUNIX1NUUk9OR19WRVJCUy5oYXMoZmlyc3RXb3JkKSkgcmV0dXJuIHsgbGV2ZWw6ICduZXV0cmFsJywgd29yZDogZmlyc3RXb3JkIH07XG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIFJlbmRlciB0aGUgZWRpdGFibGUgYWNoaWV2ZW1lbnQgcm93cyBmb3Igb25lIGV4cGVyaWVuY2UuXG4gKi9cbmZ1bmN0aW9uIHJlbmRlckFjaGlldmVtZW50RWRpdG9yUm93cyhleHBJZHgpIHtcbiAgY29uc3QgbGlzdEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYGFjaC1saXN0LSR7ZXhwSWR4fWApO1xuICBpZiAoIWxpc3RFbCkgcmV0dXJuO1xuICBjb25zdCBhY2hzID0gX25vcm1hbGl6ZUFjaGlldmVtZW50RWRpdExpc3Qod2luZG93LmFjaGlldmVtZW50RWRpdHNbZXhwSWR4XSB8fCBbXSk7XG4gIHdpbmRvdy5hY2hpZXZlbWVudEVkaXRzW2V4cElkeF0gPSBhY2hzO1xuXG4gIGlmIChhY2hzLmxlbmd0aCA9PT0gMCkge1xuICAgIGxpc3RFbC5pbm5lckhUTUwgPSAnPHAgc3R5bGU9XCJjb2xvcjojOWNhM2FmO2ZvbnQtc2l6ZTowLjg1ZW07cGFkZGluZzo0cHggMDtcIj5ObyBleHBlcmllbmNlIGJ1bGxldHMgeWV0LjwvcD4nO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxpc3RFbC5pbm5lckhUTUwgPSBhY2hzLm1hcCgoZW50cnksIGFjaElkeCkgPT4ge1xuICAgIGNvbnN0IHRleHQgPSBfYWNoaWV2ZW1lbnRFbnRyeVRleHQoZW50cnkpO1xuICAgIGNvbnN0IGhpZGRlbiA9IF9hY2hpZXZlbWVudEVudHJ5SGlkZGVuKGVudHJ5KTtcbiAgICBjb25zdCB2ZXJiV2FybiA9IF9hY2hWZXJiV2FybmluZyh0ZXh0KTtcbiAgICBjb25zdCB2ZXJiQmFkZ2UgPSB2ZXJiV2FyblxuICAgICAgPyAodmVyYldhcm4ubGV2ZWwgPT09ICdwYXNzaXZlJ1xuICAgICAgICAgID8gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC43OGVtO2NvbG9yOiM5ZjEyMzk7YmFja2dyb3VuZDojZmZmMWYyO2JvcmRlcjoxcHggc29saWQgI2ZlY2RkMztib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjJweCA2cHg7bWFyZ2luLXRvcDozcHg7XCIgdGl0bGU9XCJCdWxsZXQgb3BlbnMgd2l0aCBwYXNzaXZlIHZvaWNlICgnJHt2ZXJiV2Fybi53b3JkfScpIFx1MjAxNCByZXdyaXRlIHdpdGggYW4gYWN0aXZlIG9wZW5pbmcgdmVyYlwiPlx1MjZBMCBQYXNzaXZlIHZvaWNlIFx1MjAxNCByZXdyaXRlIHdpdGggYW4gYWN0aXZlIG9wZW5pbmcgdmVyYjwvZGl2PmBcbiAgICAgICAgICA6IHZlcmJXYXJuLmxldmVsID09PSAnd2VhaydcbiAgICAgICAgICA/IGA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuNzhlbTtjb2xvcjojYjQ1MzA5O2JhY2tncm91bmQ6I2ZmZmJlYjtib3JkZXI6MXB4IHNvbGlkICNmZGU2OGE7Ym9yZGVyLXJhZGl1czo0cHg7cGFkZGluZzoycHggNnB4O21hcmdpbi10b3A6M3B4O1wiIHRpdGxlPVwiT3BlbmluZyB2ZXJiICcke3ZlcmJXYXJuLndvcmR9JyBpcyB3ZWFrIFx1MjAxNCBjb25zaWRlciBMZWQsIEJ1aWx0LCBEcm92ZSwgZXRjLlwiPlx1MjZBMCBXZWFrIG9wZW5pbmcgdmVyYiBcdTIwMTQgdXNlIGEgc3Ryb25nZXIgYWN0aW9uIHZlcmI8L2Rpdj5gXG4gICAgICAgICAgOiBgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjc4ZW07Y29sb3I6IzZiNzI4MDtiYWNrZ3JvdW5kOiNmOWZhZmI7Ym9yZGVyOjFweCBzb2xpZCAjZTVlN2ViO2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6MnB4IDZweDttYXJnaW4tdG9wOjNweDtcIiB0aXRsZT1cIicke3ZlcmJXYXJuLndvcmR9JyBpcyBub3QgaW4gdGhlIHN0cm9uZy12ZXJiIGxpc3QgXHUyMDE0IHZlcmlmeSBpdCBtYWtlcyBhbiBpbXBhY3Qgc3RhdGVtZW50XCI+XHUyMTM5IE9wZW5pbmcgdmVyYiBub3QgaW4gc3Ryb25nLXZlcmIgbGlzdDwvZGl2PmBcbiAgICAgICAgKVxuICAgICAgOiAnJztcbiAgICByZXR1cm4gYFxuICAgIDxkaXYgaWQ9XCJhY2gtcm93LSR7ZXhwSWR4fS0ke2FjaElkeH1cIiBjbGFzcz1cIiR7aGlkZGVuID8gJ2FjaGlldmVtZW50LXJvdy1oaWRkZW4nIDogJyd9XCIgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjhweDthbGlnbi1pdGVtczpmbGV4LXN0YXJ0O21hcmdpbi1ib3R0b206OHB4O1wiPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Z2FwOjJweDtwYWRkaW5nLXRvcDo0cHg7XCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIHRpdGxlPVwiTW92ZSB1cFwiICAgYXJpYS1sYWJlbD1cIk1vdmUgYnVsbGV0IHVwXCIgICBvbmNsaWNrPVwibW92ZUFjaGlldmVtZW50KCR7ZXhwSWR4fSwke2FjaElkeH0sLTEpXCI+XHUyNUIyPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIHRpdGxlPVwiTW92ZSBkb3duXCIgYXJpYS1sYWJlbD1cIk1vdmUgYnVsbGV0IGRvd25cIiBvbmNsaWNrPVwibW92ZUFjaGlldmVtZW50KCR7ZXhwSWR4fSwke2FjaElkeH0sKzEpXCI+XHUyNUJDPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgc3R5bGU9XCJmbGV4OjE7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtcIj5cbiAgICAgIDx0ZXh0YXJlYSBpZD1cImFjaC10ZXh0LSR7ZXhwSWR4fS0ke2FjaElkeH1cIlxuICAgICAgICByb3dzPVwiMlwiXG4gICAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTtwYWRkaW5nOjZweCA4cHg7Ym9yZGVyOjFweCBzb2xpZCAke2hpZGRlbiA/ICcjZjU5ZTBiJyA6IHZlcmJXYXJuPy5sZXZlbCA9PT0gJ3Bhc3NpdmUnID8gJyNmZWNkZDMnIDogdmVyYldhcm4/LmxldmVsID09PSAnd2VhaycgPyAnI2ZkZTY4YScgOiAnI2QxZDVkYid9O2JvcmRlci1yYWRpdXM6NnB4O2ZvbnQtc2l6ZTowLjllbTtyZXNpemU6dmVydGljYWw7Ym94LXNpemluZzpib3JkZXItYm94OyR7aGlkZGVuID8gJ2JhY2tncm91bmQ6I2ZmZmJlYjtjb2xvcjojOTI0MDBlOycgOiAnJ31cIlxuICAgICAgICBvbmNoYW5nZT1cInVwZGF0ZUFjaGlldmVtZW50VGV4dCgke2V4cElkeH0sJHthY2hJZHh9LHRoaXMudmFsdWUpXCJcbiAgICAgICAgb25ibHVyPVwidXBkYXRlQWNoaWV2ZW1lbnRUZXh0KCR7ZXhwSWR4fSwke2FjaElkeH0sdGhpcy52YWx1ZSlcIlxuICAgICAgPiR7ZXNjYXBlSHRtbCh0ZXh0KX08L3RleHRhcmVhPlxuICAgICAgJHt2ZXJiQmFkZ2V9XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2dhcDo0cHg7cGFkZGluZy10b3A6MnB4O1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG4gJHtoaWRkZW4gPyAnYWN0aXZlJyA6ICcnfVwiIHRpdGxlPVwiJHtoaWRkZW4gPyAnU2hvdyBidWxsZXQgaW4gZ2VuZXJhdGVkIENWJyA6ICdIaWRlIGJ1bGxldCBmcm9tIGdlbmVyYXRlZCBDVid9XCJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiJHtoaWRkZW4gPyAnU2hvdyBidWxsZXQgaW4gZ2VuZXJhdGVkIENWJyA6ICdIaWRlIGJ1bGxldCBmcm9tIGdlbmVyYXRlZCBDVid9XCIgYXJpYS1wcmVzc2VkPVwiJHtoaWRkZW59XCJcbiAgICAgICAgICBvbmNsaWNrPVwidG9nZ2xlQWNoaWV2ZW1lbnRIaWRkZW4oJHtleHBJZHh9LCR7YWNoSWR4fSlcIlxuICAgICAgICAgIHN0eWxlPVwiY29sb3I6JHtoaWRkZW4gPyAnI2I0NTMwOScgOiAnIzY0NzQ4Yid9O1wiPiR7ZXllU2xhc2hJY29uKCl9PC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIHRpdGxlPVwiQXNrIEFJIHRvIHJld3JpdGVcIlxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJBc2sgQUkgdG8gcmV3cml0ZSB0aGlzIGJ1bGxldFwiXG4gICAgICAgICAgb25jbGljaz1cInJld3JpdGVBY2hpZXZlbWVudFdpdGhMTE0oJHtleHBJZHh9LCR7YWNoSWR4fSlcIlxuICAgICAgICAgID5cdTI3Mjg8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgdGl0bGU9XCJEZWxldGVcIlxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJEZWxldGUgdGhpcyBidWxsZXRcIlxuICAgICAgICAgIG9uY2xpY2s9XCJkZWxldGVBY2hpZXZlbWVudCgke2V4cElkeH0sJHthY2hJZHh9KVwiXG4gICAgICAgICAgc3R5bGU9XCJjb2xvcjojZWY0NDQ0O1wiPlx1RDgzRFx1REREMTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGA7XG4gIH0pLmpvaW4oJycpO1xufVxuXG4vLyBEZWJvdW5jZSB0aW1lciBmb3IgYXV0by1wZXJzaXN0aW5nIGFjaGlldmVtZW50IHRleHQgZWRpdHMuXG5sZXQgX2FjaFBlcnNpc3RUaW1lciA9IG51bGw7XG5cbmZ1bmN0aW9uIHVwZGF0ZUFjaGlldmVtZW50VGV4dChleHBJZHgsIGFjaElkeCwgdmFsdWUpIHtcbiAgaWYgKCF3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0c1tleHBJZHhdKSByZXR1cm47XG4gIGNvbnN0IGV4aXN0aW5nID0gX25vcm1hbGl6ZUFjaGlldmVtZW50RWRpdEVudHJ5KHdpbmRvdy5hY2hpZXZlbWVudEVkaXRzW2V4cElkeF1bYWNoSWR4XSk7XG4gIGV4aXN0aW5nLnRleHQgPSB2YWx1ZTtcbiAgd2luZG93LmFjaGlldmVtZW50RWRpdHNbZXhwSWR4XVthY2hJZHhdID0gZXhpc3Rpbmc7XG5cbiAgLy8gRGVib3VuY2UtcGVyc2lzdCBzbyBlZGl0cyBzdXJ2aXZlIHRhYiBuYXZpZ2F0aW9uIGFuZCBzdGF0dXMgcG9sbGluZy5cbiAgY2xlYXJUaW1lb3V0KF9hY2hQZXJzaXN0VGltZXIpO1xuICBfYWNoUGVyc2lzdFRpbWVyID0gc2V0VGltZW91dChhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZldGNoKCcvYXBpL3NhdmUtYWNoaWV2ZW1lbnQtZWRpdHMnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBlZGl0czogd2luZG93LmFjaGlldmVtZW50RWRpdHMgfSksXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChfZSkgeyAvKiBzaWxlbnQgXHUyMDE0IHVzZXIgc3RpbGwgaGFzIGluLW1lbW9yeSBzdGF0ZSAqLyB9XG4gIH0sIDUwMCk7XG59XG5cbmZ1bmN0aW9uIHRvZ2dsZUFjaGlldmVtZW50SGlkZGVuKGV4cElkeCwgYWNoSWR4KSB7XG4gIGlmICghd2luZG93LmFjaGlldmVtZW50RWRpdHNbZXhwSWR4XSkgcmV0dXJuO1xuICBjb25zdCBleGlzdGluZyA9IF9ub3JtYWxpemVBY2hpZXZlbWVudEVkaXRFbnRyeSh3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0c1tleHBJZHhdW2FjaElkeF0pO1xuICBleGlzdGluZy5oaWRkZW4gPSAhZXhpc3RpbmcuaGlkZGVuO1xuICB3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0c1tleHBJZHhdW2FjaElkeF0gPSBleGlzdGluZztcbiAgcmVuZGVyQWNoaWV2ZW1lbnRFZGl0b3JSb3dzKGV4cElkeCk7XG59XG5cbmZ1bmN0aW9uIG1vdmVBY2hpZXZlbWVudChleHBJZHgsIGFjaElkeCwgZGlyKSB7XG4gIGNvbnN0IGFjaHMgPSB3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0c1tleHBJZHhdO1xuICBpZiAoIWFjaHMpIHJldHVybjtcbiAgY29uc3QgbmV3SWR4ID0gYWNoSWR4ICsgZGlyO1xuICBpZiAobmV3SWR4IDwgMCB8fCBuZXdJZHggPj0gYWNocy5sZW5ndGgpIHJldHVybjtcbiAgLy8gRmx1c2ggY3VycmVudCB0ZXh0YXJlYSB2YWx1ZSBiZWZvcmUgbW92aW5nXG4gIGNvbnN0IHRhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYGFjaC10ZXh0LSR7ZXhwSWR4fS0ke2FjaElkeH1gKTtcbiAgaWYgKHRhKSB1cGRhdGVBY2hpZXZlbWVudFRleHQoZXhwSWR4LCBhY2hJZHgsIHRhLnZhbHVlKTtcbiAgW2FjaHNbYWNoSWR4XSwgYWNoc1tuZXdJZHhdXSA9IFthY2hzW25ld0lkeF0sIGFjaHNbYWNoSWR4XV07XG4gIHJlbmRlckFjaGlldmVtZW50RWRpdG9yUm93cyhleHBJZHgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVBY2hpZXZlbWVudChleHBJZHgsIGFjaElkeCkge1xuICBjb25zdCBhY2hzID0gd2luZG93LmFjaGlldmVtZW50RWRpdHNbZXhwSWR4XTtcbiAgaWYgKCFhY2hzKSByZXR1cm47XG4gIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IGNvbmZpcm1EaWFsb2coXG4gICAgJ0RlbGV0ZSB0aGlzIGJ1bGxldCBmcm9tIHRoaXMgc2Vzc2lvbj8gSGlkZGVuIGJ1bGxldHMgcmVtYWluIGF2YWlsYWJsZSBmb3IgbGF0ZXIgaGFydmVzdCwgYnV0IGRlbGV0ZSByZW1vdmVzIHRoZSBlZGl0ZWQgcm93IGVudGlyZWx5LicsXG4gICAgeyBjb25maXJtTGFiZWw6ICdEZWxldGUnLCBjYW5jZWxMYWJlbDogJ0NhbmNlbCcsIGRhbmdlcjogdHJ1ZSB9LFxuICApO1xuICBpZiAoIWNvbmZpcm1lZCkgcmV0dXJuO1xuICBhY2hzLnNwbGljZShhY2hJZHgsIDEpO1xuICByZW5kZXJBY2hpZXZlbWVudEVkaXRvclJvd3MoZXhwSWR4KTtcbn1cblxuZnVuY3Rpb24gYWRkQWNoaWV2ZW1lbnRSb3coZXhwSWR4KSB7XG4gIGlmICghd2luZG93LmFjaGlldmVtZW50RWRpdHNbZXhwSWR4XSkgd2luZG93LmFjaGlldmVtZW50RWRpdHNbZXhwSWR4XSA9IFtdO1xuICB3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0c1tleHBJZHhdLnB1c2goeyB0ZXh0OiAnJywgaGlkZGVuOiBmYWxzZSB9KTtcbiAgcmVuZGVyQWNoaWV2ZW1lbnRFZGl0b3JSb3dzKGV4cElkeCk7XG4gIC8vIEZvY3VzIHRoZSBuZXcgdGV4dGFyZWFcbiAgY29uc3QgbmV3SWR4ID0gd2luZG93LmFjaGlldmVtZW50RWRpdHNbZXhwSWR4XS5sZW5ndGggLSAxO1xuICBjb25zdCB0YSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBhY2gtdGV4dC0ke2V4cElkeH0tJHtuZXdJZHh9YCk7XG4gIGlmICh0YSkgdGEuZm9jdXMoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmV3cml0ZUFjaGlldmVtZW50V2l0aExMTShleHBJZHgsIGFjaElkeCkge1xuICBjb25zdCB0YSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBhY2gtdGV4dC0ke2V4cElkeH0tJHthY2hJZHh9YCk7XG4gIGlmICghdGEpIHJldHVybjtcbiAgY29uc3Qgb3JpZ2luYWxUZXh0ID0gdGEudmFsdWUudHJpbSgpO1xuICBpZiAoIW9yaWdpbmFsVGV4dCkgeyBzaG93VG9hc3QoJ1BsZWFzZSBlbnRlciBhIGJ1bGxldCBmaXJzdC4nLCAnZXJyb3InKTsgcmV0dXJuOyB9XG5cbiAgX3Jld3JpdGVTdWdnZXN0aW9uSGlzdG9yeSA9IFtdO1xuICBfbGFzdFJld3JpdGVMb2dJZCA9IG51bGw7XG4gIF9vcGVuUmV3cml0ZU1vZGFsKG9yaWdpbmFsVGV4dCwgJycsIG51bGwsIHtcbiAgICBleHBlcmllbmNlSW5kZXg6IGV4cElkeCxcbiAgICBhY2hpZXZlbWVudEluZGV4OiBhY2hJZHgsXG4gICAgb25BY2NlcHQ6IGFzeW5jIChzdWdnZXN0aW9uKSA9PiB7XG4gICAgICB1cGRhdGVBY2hpZXZlbWVudFRleHQoZXhwSWR4LCBhY2hJZHgsIHN1Z2dlc3Rpb24pO1xuICAgICAgaWYgKHRhKSB0YS52YWx1ZSA9IHN1Z2dlc3Rpb247XG4gICAgICBfcmVjb3JkUmV3cml0ZU91dGNvbWUoJ2FjY2VwdGVkJywgc3VnZ2VzdGlvbik7XG4gICAgICBzaG93VG9hc3QoJ0J1bGxldCB1cGRhdGVkLicpO1xuICAgIH0sXG4gIH0pO1xuICBhd2FpdCBfcnVuUmV3cml0ZShvcmlnaW5hbFRleHQpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBhaVJld3JpdGVUb3BMZXZlbEFjaGlldmVtZW50KGFjaElkKSB7XG4gIGNvbnN0IGFjaCA9ICh3aW5kb3cuX2FjaGlldmVtZW50c09yZGVyZWQgfHwgW10pLmZpbmQoYSA9PiBhLmlkID09PSBhY2hJZCk7XG4gIGlmICghYWNoKSByZXR1cm47XG4gIGNvbnN0IG9yaWdpbmFsVGV4dCA9IGFjaC5kZXNjcmlwdGlvbiB8fCAnJztcbiAgaWYgKCFvcmlnaW5hbFRleHQpIHsgc2hvd1RvYXN0KCdQbGVhc2UgZW50ZXIgYSBkZXNjcmlwdGlvbiBmaXJzdC4nLCAnZXJyb3InKTsgcmV0dXJuOyB9XG5cbiAgX3Jld3JpdGVTdWdnZXN0aW9uSGlzdG9yeSA9IFtdO1xuICBfbGFzdFJld3JpdGVMb2dJZCA9IG51bGw7XG4gIF9vcGVuUmV3cml0ZU1vZGFsKG9yaWdpbmFsVGV4dCwgJycsIG51bGwsIHtcbiAgICBleHBlcmllbmNlSW5kZXg6IG51bGwsXG4gICAgb25BY2NlcHQ6IGFzeW5jIChzdWdnZXN0aW9uKSA9PiB7XG4gICAgICBhd2FpdCBzYXZlVG9wTGV2ZWxBY2hpZXZlbWVudEZpZWxkKGFjaElkLCAnZGVzY3JpcHRpb24nLCBzdWdnZXN0aW9uKTtcbiAgICAgIGNvbnN0IGRlc2NFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBhY2gtZGVzYy0ke0NTUy5lc2NhcGUoYWNoSWQpfWApO1xuICAgICAgaWYgKGRlc2NFbCkgZGVzY0VsLnZhbHVlID0gc3VnZ2VzdGlvbjtcbiAgICAgIF9yZWNvcmRSZXdyaXRlT3V0Y29tZSgnYWNjZXB0ZWQnLCBzdWdnZXN0aW9uKTtcbiAgICAgIHNob3dUb2FzdCgnQWNoaWV2ZW1lbnQgdXBkYXRlZC4nKTtcbiAgICB9LFxuICB9KTtcbiAgYXdhaXQgX3J1blJld3JpdGUob3JpZ2luYWxUZXh0KTtcbn1cblxuZnVuY3Rpb24gX29wZW5SZXdyaXRlTW9kYWwob3JpZ2luYWxUZXh0LCBjdXJyZW50SW5zdHJ1Y3Rpb25zLCBjdXJyZW50U3VnZ2VzdGlvbiwgY2FsbGJhY2tzKSB7XG4gIF9yZXdyaXRlQ2FsbGJhY2tzID0gY2FsbGJhY2tzO1xuXG4gIGNvbnN0IHN1Z2dlc3RlZEh0bWwgPSBjdXJyZW50U3VnZ2VzdGlvbiAhPSBudWxsXG4gICAgPyBgPHAgaWQ9XCJhY2gtcmV3cml0ZS1zdWdnZXN0aW9uXCIgc3R5bGU9XCJtYXJnaW46NHB4IDAgMDttaW4taGVpZ2h0OjIuNGVtO1wiPiR7ZXNjYXBlSHRtbChjdXJyZW50U3VnZ2VzdGlvbil9PC9wPmBcbiAgICA6IGA8cCBpZD1cImFjaC1yZXdyaXRlLXN1Z2dlc3Rpb25cIiBzdHlsZT1cIm1hcmdpbjo0cHggMCAwO21pbi1oZWlnaHQ6Mi40ZW07Y29sb3I6IzljYTNhZjtmb250LXN0eWxlOml0YWxpYztcIj5cdTIzRjMgR2VuZXJhdGluZ1x1MjAyNjwvcD5gO1xuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhbGVydC1tb2RhbC10aXRsZScpLnRleHRDb250ZW50ID0gJ1x1MjcyOCBBSSBSZXdyaXRlJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FsZXJ0LW1vZGFsLW1lc3NhZ2UnKS5pbm5lckhUTUwgPSBgXG4gICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTBweDtcIj5cbiAgICAgIDxzdHJvbmc+T3JpZ2luYWw6PC9zdHJvbmc+XG4gICAgICA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7bWFyZ2luOjRweCAwIDA7Zm9udC1zdHlsZTppdGFsaWM7Zm9udC1zaXplOjAuOTJlbTtcIj4ke2VzY2FwZUh0bWwob3JpZ2luYWxUZXh0KX08L3A+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTJweDtcIj5cbiAgICAgIDxzdHJvbmc+U3VnZ2VzdGVkOjwvc3Ryb25nPlxuICAgICAgJHtzdWdnZXN0ZWRIdG1sfVxuICAgIDwvZGl2PlxuICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE2cHg7XCI+XG4gICAgICA8bGFiZWwgZm9yPVwiYWNoLXJld3JpdGUtaW5zdHJ1Y3Rpb25zXCIgc3R5bGU9XCJmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjAuOTJlbTtkaXNwbGF5OmJsb2NrO21hcmdpbi1ib3R0b206NHB4O1wiPkluc3RydWN0aW9ucyA8c3BhbiBzdHlsZT1cImZvbnQtd2VpZ2h0OjQwMDtjb2xvcjojNmI3MjgwO1wiPihvcHRpb25hbCk8L3NwYW4+PC9sYWJlbD5cbiAgICAgIDx0ZXh0YXJlYSBpZD1cImFjaC1yZXdyaXRlLWluc3RydWN0aW9uc1wiXG4gICAgICAgIHJvd3M9XCIyXCJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIG1ha2UgaXQgbW9yZSBjb25jaXNlLCBlbXBoYXNpc2UgbGVhZGVyc2hpcCwgYWRkIGEgbWV0cmljXCJcbiAgICAgICAgc3R5bGU9XCJ3aWR0aDoxMDAlO2JveC1zaXppbmc6Ym9yZGVyLWJveDtwYWRkaW5nOjZweCA4cHg7Ym9yZGVyOjFweCBzb2xpZCAjZDFkNWRiO2JvcmRlci1yYWRpdXM6NnB4O2ZvbnQtc2l6ZTowLjllbTtyZXNpemU6dmVydGljYWw7XCJcbiAgICAgID4ke2VzY2FwZUh0bWwoY3VycmVudEluc3RydWN0aW9ucyl9PC90ZXh0YXJlYT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDo4cHg7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kO1wiPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1zZWNvbmRhcnlcIiBpZD1cImFjaC1yZXdyaXRlLXJlamVjdC1idG5cIiBvbmNsaWNrPVwiX3JlY29yZFJld3JpdGVPdXRjb21lKCdyZWplY3RlZCcpOyBjbG9zZUFsZXJ0TW9kYWwoKVwiPlJlamVjdDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1zZWNvbmRhcnlcIiBpZD1cImFjaC1yZXdyaXRlLWdlbmVyYXRlLWJ0blwiPkdlbmVyYXRlPC9idXR0b24+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiY29udGludWUtYnRuXCIgIGlkPVwiYWNoLXJld3JpdGUtYWNjZXB0LWJ0blwiPkFjY2VwdDwvYnV0dG9uPlxuICAgIDwvZGl2PmA7XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FsZXJ0LW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBzZXRJbml0aWFsRm9jdXMoJ2FsZXJ0LW1vZGFsLW92ZXJsYXknKTtcbiAgdHJhcEZvY3VzKCdhbGVydC1tb2RhbC1vdmVybGF5Jyk7XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaC1yZXdyaXRlLWdlbmVyYXRlLWJ0bicpLm9uY2xpY2sgPSAoKSA9PiBfcnVuUmV3cml0ZShvcmlnaW5hbFRleHQpO1xuXG4gIF91cGRhdGVSZXdyaXRlQWNjZXB0QnRuKGN1cnJlbnRTdWdnZXN0aW9uKTtcbn1cblxuZnVuY3Rpb24gX3VwZGF0ZVJld3JpdGVBY2NlcHRCdG4oc3VnZ2VzdGlvbikge1xuICBjb25zdCBhY2NlcHRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLXJld3JpdGUtYWNjZXB0LWJ0bicpO1xuICBpZiAoIWFjY2VwdEJ0bikgcmV0dXJuO1xuICBhY2NlcHRCdG4uZGlzYWJsZWQgPSBzdWdnZXN0aW9uID09IG51bGw7XG4gIGFjY2VwdEJ0bi5vbmNsaWNrID0gc3VnZ2VzdGlvbiA9PSBudWxsID8gbnVsbCA6IGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBfcmV3cml0ZUNhbGxiYWNrcy5vbkFjY2VwdChzdWdnZXN0aW9uKTtcbiAgICBjbG9zZUFsZXJ0TW9kYWwoKTtcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gX3JlY29yZFJld3JpdGVPdXRjb21lKG91dGNvbWUsIGFjY2VwdGVkVGV4dCkge1xuICBpZiAoIV9sYXN0UmV3cml0ZUxvZ0lkKSByZXR1cm47XG4gIGNvbnN0IGxvZ0lkID0gX2xhc3RSZXdyaXRlTG9nSWQ7XG4gIF9sYXN0UmV3cml0ZUxvZ0lkID0gbnVsbDtcbiAgY29uc3QgYm9keSA9IHsgbG9nX2lkOiBsb2dJZCwgb3V0Y29tZSB9O1xuICBpZiAoYWNjZXB0ZWRUZXh0ICE9IG51bGwpIGJvZHkuYWNjZXB0ZWRfdGV4dCA9IGFjY2VwdGVkVGV4dDtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmZXRjaCgnL2FwaS9yZXdyaXRlLWFjaGlldmVtZW50LW91dGNvbWUnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgfSk7XG4gIH0gY2F0Y2ggKF8pIHsgLyogZmlyZS1hbmQtZm9yZ2V0IFx1MjAxNCBkb24ndCBkaXNydXB0IHRoZSBVSSAqLyB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9ydW5SZXdyaXRlKG9yaWdpbmFsVGV4dCkge1xuICBjb25zdCBpbnN0cnVjdGlvbnNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhY2gtcmV3cml0ZS1pbnN0cnVjdGlvbnMnKTtcbiAgY29uc3QgdXNlckluc3RydWN0aW9ucyA9IGluc3RydWN0aW9uc0VsID8gaW5zdHJ1Y3Rpb25zRWwudmFsdWUudHJpbSgpIDogJyc7XG5cbiAgY29uc3QgZ2VuZXJhdGVCdG4gID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaC1yZXdyaXRlLWdlbmVyYXRlLWJ0bicpO1xuICBjb25zdCBhY2NlcHRCdG4gICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLXJld3JpdGUtYWNjZXB0LWJ0bicpO1xuICBjb25zdCByZWplY3RCdG4gICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLXJld3JpdGUtcmVqZWN0LWJ0bicpO1xuICBjb25zdCBzdWdnZXN0aW9uRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLXJld3JpdGUtc3VnZ2VzdGlvbicpO1xuXG4gIC8vIENhcHR1cmUgdGhlIGN1cnJlbnQgc3VnZ2VzdGlvbiBhcyBhIHByaW9yIGF0dGVtcHQgYmVmb3JlIG92ZXJ3cml0aW5nXG4gIGlmIChzdWdnZXN0aW9uRWwpIHtcbiAgICBjb25zdCBwcmV2ID0gc3VnZ2VzdGlvbkVsLnRleHRDb250ZW50LnRyaW0oKTtcbiAgICBpZiAocHJldiAmJiBwcmV2ICE9PSAnR2VuZXJhdGluZ1x1MjAyNicgJiYgIXByZXYuc3RhcnRzV2l0aCgnRXJyb3I6JykgJiYgIV9yZXdyaXRlU3VnZ2VzdGlvbkhpc3RvcnkuaW5jbHVkZXMocHJldikpIHtcbiAgICAgIF9yZXdyaXRlU3VnZ2VzdGlvbkhpc3RvcnkucHVzaChwcmV2KTtcbiAgICB9XG4gIH1cblxuICBpZiAoZ2VuZXJhdGVCdG4pIHsgZ2VuZXJhdGVCdG4uZGlzYWJsZWQgPSB0cnVlOyBnZW5lcmF0ZUJ0bi5pbm5lckhUTUwgPSAnPHNwYW4gY2xhc3M9XCJidG4tc3Bpbm5lclwiPjwvc3Bhbj5HZW5lcmF0aW5nXFx1MjAyNic7IH1cbiAgaWYgKGFjY2VwdEJ0bikgICB7IGFjY2VwdEJ0bi5kaXNhYmxlZCA9IHRydWU7IH1cbiAgaWYgKHN1Z2dlc3Rpb25FbCkgeyBzdWdnZXN0aW9uRWwuc3R5bGUuY29sb3IgPSAnIzljYTNhZic7IHN1Z2dlc3Rpb25FbC5zdHlsZS5mb250U3R5bGUgPSAnaXRhbGljJzsgc3VnZ2VzdGlvbkVsLnRleHRDb250ZW50ID0gJ0dlbmVyYXRpbmdcdTIwMjYnOyB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9yZXdyaXRlLWFjaGlldmVtZW50Jywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgYWNoaWV2ZW1lbnRfdGV4dDogICAgIG9yaWdpbmFsVGV4dCxcbiAgICAgICAgZXhwZXJpZW5jZV9pbmRleDogICAgIF9yZXdyaXRlQ2FsbGJhY2tzPy5leHBlcmllbmNlSW5kZXggPz8gbnVsbCxcbiAgICAgICAgYWNoaWV2ZW1lbnRfaW5kZXg6ICAgIF9yZXdyaXRlQ2FsbGJhY2tzPy5hY2hpZXZlbWVudEluZGV4ID8/IG51bGwsXG4gICAgICAgIHVzZXJfaW5zdHJ1Y3Rpb25zOiAgICB1c2VySW5zdHJ1Y3Rpb25zLFxuICAgICAgICBwcmV2aW91c19zdWdnZXN0aW9uczogX3Jld3JpdGVTdWdnZXN0aW9uSGlzdG9yeSxcbiAgICAgIH0pXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKCFyZXMub2spIHRocm93IG5ldyBFcnJvcihkYXRhLmVycm9yIHx8ICdSZXdyaXRlIGZhaWxlZCcpO1xuXG4gICAgY29uc3QgcmV3cml0dGVuID0gZGF0YS5yZXdyaXR0ZW4gfHwgJyc7XG4gICAgX2xhc3RSZXdyaXRlTG9nSWQgPSBkYXRhLmxvZ19pZCB8fCBudWxsO1xuICAgIGlmIChzdWdnZXN0aW9uRWwpIHtcbiAgICAgIHN1Z2dlc3Rpb25FbC5zdHlsZS5jb2xvciA9ICcnO1xuICAgICAgc3VnZ2VzdGlvbkVsLnN0eWxlLmZvbnRTdHlsZSA9ICcnO1xuICAgICAgc3VnZ2VzdGlvbkVsLnRleHRDb250ZW50ID0gcmV3cml0dGVuO1xuICAgIH1cbiAgICBfdXBkYXRlUmV3cml0ZUFjY2VwdEJ0bihyZXdyaXR0ZW4pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoc3VnZ2VzdGlvbkVsKSB7IHN1Z2dlc3Rpb25FbC5zdHlsZS5jb2xvciA9ICcjZWY0NDQ0Jzsgc3VnZ2VzdGlvbkVsLnN0eWxlLmZvbnRTdHlsZSA9ICcnOyBzdWdnZXN0aW9uRWwudGV4dENvbnRlbnQgPSBgRXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YDsgfVxuICAgIHNob3dUb2FzdChgQUkgcmV3cml0ZSBmYWlsZWQ6ICR7ZXJyLm1lc3NhZ2V9YCwgJ2Vycm9yJyk7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKGdlbmVyYXRlQnRuKSB7IGdlbmVyYXRlQnRuLmRpc2FibGVkID0gZmFsc2U7IGdlbmVyYXRlQnRuLnRleHRDb250ZW50ID0gJ0dlbmVyYXRlJzsgfVxuICAgIGlmIChyZWplY3RCdG4pICAgeyByZWplY3RCdG4uZGlzYWJsZWQgPSBmYWxzZTsgfVxuICB9XG59XG5cbi8qKlxuICogU2F2ZSBhIHNpbmdsZSBmaWVsZCBvZiBhIHRvcC1sZXZlbCBhY2hpZXZlbWVudCBpbiBzZXNzaW9uIHN0YXRlIGFuZCB1cGRhdGUgdGhlIGxvY2FsIGNhY2hlLlxuICovXG5hc3luYyBmdW5jdGlvbiBzYXZlVG9wTGV2ZWxBY2hpZXZlbWVudEZpZWxkKGFjaElkLCBmaWVsZCwgdmFsdWUpIHtcbiAgY29uc3QgYWNoID0gKHdpbmRvdy5fYWNoaWV2ZW1lbnRzT3JkZXJlZCB8fCBbXSkuZmluZChhID0+IGEuaWQgPT09IGFjaElkKTtcbiAgY29uc3QgcHJldmlvdXMgPSBhY2ggPyBhY2hbZmllbGRdIDogdW5kZWZpbmVkO1xuICBpZiAoYWNoKSBhY2hbZmllbGRdID0gdmFsdWU7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvcmV2aWV3LWFjaGlldmVtZW50Jywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgaWQ6IGFjaElkLCBmaWVsZCwgdmFsdWUgfSksXG4gICAgfSk7XG4gICAgaWYgKCFyZXMub2spIHRocm93IG5ldyBFcnJvcigoYXdhaXQgcmVzLmpzb24oKSkuZXJyb3IgfHwgJ1NhdmUgZmFpbGVkJyk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIFJvbGwgYmFjayB0aGUgb3B0aW1pc3RpYyB1cGRhdGVcbiAgICBpZiAoYWNoICYmIHByZXZpb3VzICE9PSB1bmRlZmluZWQpIGFjaFtmaWVsZF0gPSBwcmV2aW91cztcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGZpZWxkID09PSAndGl0bGUnID8gYGFjaC10aXRsZS0ke0NTUy5lc2NhcGUoYWNoSWQpfWAgOiBgYWNoLWRlc2MtJHtDU1MuZXNjYXBlKGFjaElkKX1gKTtcbiAgICBpZiAoZWwpIGVsLnZhbHVlID0gcHJldmlvdXMgPz8gJyc7XG4gICAgc2hvd1RvYXN0KGBGYWlsZWQgdG8gc2F2ZSBhY2hpZXZlbWVudDogJHtlcnIubWVzc2FnZX1gLCAnZXJyb3InKTtcbiAgfVxufVxuXG4vKipcbiAqIEhpZGUgYSB0b3AtbGV2ZWwgYWNoaWV2ZW1lbnQgZm9yIHRoaXMgc2Vzc2lvbiBhZnRlciBjb25maXJtYXRpb24uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZVRvcExldmVsQWNoaWV2ZW1lbnQoYWNoSWQpIHtcbiAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgY29uZmlybURpYWxvZyhcbiAgICAnSGlkZSB0aGlzIGFjaGlldmVtZW50IGZvciB0aGlzIENWIG9ubHk/IFlvdSBjYW4gcmVzdG9yZSBpdCBieSBzdGFydGluZyBvdmVyIG9yIGNoYW5naW5nIHRoZSBzZXNzaW9uIHNlbGVjdGlvbnMuJyxcbiAgICB7IGNvbmZpcm1MYWJlbDogJ0hpZGUnLCBjYW5jZWxMYWJlbDogJ0NhbmNlbCcsIGRhbmdlcjogdHJ1ZSB9LFxuICApO1xuICBpZiAoIWNvbmZpcm1lZCkgcmV0dXJuO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3Jldmlldy1hY2hpZXZlbWVudCcsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGlkOiBhY2hJZCwgYWN0aW9uOiAnZGVsZXRlJyB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgd2luZG93Ll9hY2hpZXZlbWVudHNPcmRlcmVkID0gKHdpbmRvdy5fYWNoaWV2ZW1lbnRzT3JkZXJlZCB8fCBbXSkuZmlsdGVyKGEgPT4gYS5pZCAhPT0gYWNoSWQpO1xuICAgICAgZGVsZXRlIHdpbmRvdy5hY2hpZXZlbWVudERlY2lzaW9uc1thY2hJZF07XG4gICAgICBfcmVuZGVyQWNoaWV2ZW1lbnRzUmV2aWV3VGFibGUoKTtcbiAgICAgIHNob3dUb2FzdCgnQWNoaWV2ZW1lbnQgaGlkZGVuIGZvciB0aGlzIHNlc3Npb24uJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3dUb2FzdChkYXRhLmVycm9yIHx8ICdEZWxldGUgZmFpbGVkLicsICdlcnJvcicpO1xuICAgIH1cbiAgfSBjYXRjaCAoXykge1xuICAgIHNob3dUb2FzdCgnRmFpbGVkIHRvIGRlbGV0ZSBhY2hpZXZlbWVudC4nLCAnZXJyb3InKTtcbiAgfVxufVxuXG4vKipcbiAqIFNhdmUgYW4gZWRpdGVkIGZpZWxkIG9uIGFuIEFJLXN1Z2dlc3RlZCBhY2hpZXZlbWVudCAoaW4tbWVtb3J5IG9ubHk7XG4gKiBzdWdnZXN0aW9ucyBhcmUgbm90IHBlcnNpc3RlZCB0byB0aGUgc2VydmVyIHVudGlsIGFjY2VwdGVkKS5cbiAqL1xuZnVuY3Rpb24gc2F2ZVN1Z2dlc3RlZEFjaGlldmVtZW50RmllbGQoc3VnZ0lkLCBmaWVsZCwgdmFsdWUpIHtcbiAgY29uc3Qgc3VnZyA9ICh3aW5kb3cuX3N1Z2dlc3RlZEFjaHNPcmRlcmVkIHx8IFtdKS5maW5kKHMgPT4gcy5fc3VnZ0lkID09PSBzdWdnSWQpO1xuICBpZiAoc3VnZykgc3VnZ1tmaWVsZF0gPSB2YWx1ZTtcbn1cblxuLyoqXG4gKiBPcGVuIHRoZSBBSSByZXdyaXRlIG1vZGFsIGZvciBhIHN1Z2dlc3RlZCBhY2hpZXZlbWVudCBkZXNjcmlwdGlvbi5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYWlSZXdyaXRlU3VnZ2VzdGVkQWNoaWV2ZW1lbnQoc3VnZ0lkKSB7XG4gIGNvbnN0IHN1Z2cgPSAod2luZG93Ll9zdWdnZXN0ZWRBY2hzT3JkZXJlZCB8fCBbXSkuZmluZChzID0+IHMuX3N1Z2dJZCA9PT0gc3VnZ0lkKTtcbiAgaWYgKCFzdWdnKSByZXR1cm47XG4gIGNvbnN0IG9yaWdpbmFsVGV4dCA9IHN1Z2cuZGVzY3JpcHRpb24gfHwgJyc7XG4gIGlmICghb3JpZ2luYWxUZXh0KSB7IHNob3dUb2FzdCgnUGxlYXNlIGVudGVyIGEgZGVzY3JpcHRpb24gZmlyc3QuJywgJ2Vycm9yJyk7IHJldHVybjsgfVxuXG4gIF9yZXdyaXRlU3VnZ2VzdGlvbkhpc3RvcnkgPSBbXTtcbiAgX2xhc3RSZXdyaXRlTG9nSWQgPSBudWxsO1xuICBfb3BlblJld3JpdGVNb2RhbChvcmlnaW5hbFRleHQsICcnLCBudWxsLCB7XG4gICAgZXhwZXJpZW5jZUluZGV4OiBudWxsLFxuICAgIG9uQWNjZXB0OiBhc3luYyAoc3VnZ2VzdGlvbikgPT4ge1xuICAgICAgc2F2ZVN1Z2dlc3RlZEFjaGlldmVtZW50RmllbGQoc3VnZ0lkLCAnZGVzY3JpcHRpb24nLCBzdWdnZXN0aW9uKTtcbiAgICAgIGNvbnN0IGRlc2NFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBhY2gtZGVzYy0ke3N1Z2dJZH1gKTtcbiAgICAgIGlmIChkZXNjRWwpIGRlc2NFbC52YWx1ZSA9IHN1Z2dlc3Rpb247XG4gICAgICBfcmVjb3JkUmV3cml0ZU91dGNvbWUoJ2FjY2VwdGVkJywgc3VnZ2VzdGlvbik7XG4gICAgICBzaG93VG9hc3QoJ0FjaGlldmVtZW50IHVwZGF0ZWQuJyk7XG4gICAgfSxcbiAgfSk7XG4gIGF3YWl0IF9ydW5SZXdyaXRlKG9yaWdpbmFsVGV4dCk7XG59XG5cbi8qKlxuICogTW92ZSBhIHN1Z2dlc3RlZCBhY2hpZXZlbWVudCB1cCBvciBkb3duIHdpdGhpbiB0aGUgZGlzcGxheSBvcmRlci5cbiAqIFN0YWJsZSBJRHMgbWVhbiBubyBkZWNpc2lvbiByZW1hcHBpbmcgaXMgbmVlZGVkLlxuICovXG5mdW5jdGlvbiBtb3ZlU3VnZ2VzdGVkQWNoaWV2ZW1lbnRSb3coc3VnZ0lkLCBkaXJlY3Rpb24pIHtcbiAgY29uc3QgYXJyID0gd2luZG93Ll9zdWdnZXN0ZWRBY2hzT3JkZXJlZDtcbiAgaWYgKCFhcnIpIHJldHVybjtcbiAgY29uc3QgaWR4ID0gYXJyLmZpbmRJbmRleChzID0+IHMuX3N1Z2dJZCA9PT0gc3VnZ0lkKTtcbiAgaWYgKGlkeCA8IDApIHJldHVybjtcbiAgY29uc3QgbmV3SWR4ID0gaWR4ICsgZGlyZWN0aW9uO1xuICBpZiAobmV3SWR4IDwgMCB8fCBuZXdJZHggPj0gYXJyLmxlbmd0aCkgcmV0dXJuO1xuICBbYXJyW2lkeF0sIGFycltuZXdJZHhdXSA9IFthcnJbbmV3SWR4XSwgYXJyW2lkeF1dO1xuICBfcmVuZGVyQWNoaWV2ZW1lbnRzUmV2aWV3VGFibGUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaGlldmVtZW50cy10YWJsZS1jb250YWluZXInKSk7XG59XG5cbi8qKlxuICogUmVtb3ZlIGEgc3VnZ2VzdGVkIGFjaGlldmVtZW50IGZyb20gdGhlIGxpc3QgYWZ0ZXIgY29uZmlybWF0aW9uLlxuICogU3RhYmxlIElEcyBtZWFuIG5vIG90aGVyIGRlY2lzaW9uIGtleXMgbmVlZCByZW1hcHBpbmcuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZVN1Z2dlc3RlZEFjaGlldmVtZW50KHN1Z2dJZCkge1xuICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCBjb25maXJtRGlhbG9nKCdSZW1vdmUgdGhpcyBBSSBzdWdnZXN0aW9uPycsIHsgY29uZmlybUxhYmVsOiAnUmVtb3ZlJywgZGFuZ2VyOiB0cnVlIH0pO1xuICBpZiAoIWNvbmZpcm1lZCkgcmV0dXJuO1xuICB3aW5kb3cuX3N1Z2dlc3RlZEFjaHNPcmRlcmVkID0gKHdpbmRvdy5fc3VnZ2VzdGVkQWNoc09yZGVyZWQgfHwgW10pLmZpbHRlcihzID0+IHMuX3N1Z2dJZCAhPT0gc3VnZ0lkKTtcbiAgZGVsZXRlIHdpbmRvdy5hY2hpZXZlbWVudERlY2lzaW9uc1tzdWdnSWRdO1xuICBfcmVuZGVyQWNoaWV2ZW1lbnRzUmV2aWV3VGFibGUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaGlldmVtZW50cy10YWJsZS1jb250YWluZXInKSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNhdmVBY2hpZXZlbWVudEVkaXRzQW5kQ29udGludWUoKSB7XG4gIHRyeSB7XG4gICAgLy8gRmx1c2ggYW55IGN1cnJlbnRseS1mb2N1c2VkIHRleHRhcmVhc1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tpZF49XCJhY2gtdGV4dC1cIl0nKS5mb3JFYWNoKHRhID0+IHtcbiAgICAgIGNvbnN0IHBhcnRzID0gdGEuaWQuc3BsaXQoJy0nKTtcbiAgICAgIGlmIChwYXJ0cy5sZW5ndGggPj0gNCkge1xuICAgICAgICBjb25zdCBleHBJZHggPSBwYXJzZUludChwYXJ0c1syXSk7XG4gICAgICAgIGNvbnN0IGFjaElkeCA9IHBhcnNlSW50KHBhcnRzWzNdKTtcbiAgICAgICAgaWYgKCFpc05hTihleHBJZHgpICYmICFpc05hTihhY2hJZHgpICYmIHdpbmRvdy5hY2hpZXZlbWVudEVkaXRzW2V4cElkeF0pIHtcbiAgICAgICAgICB1cGRhdGVBY2hpZXZlbWVudFRleHQoZXhwSWR4LCBhY2hJZHgsIHRhLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvc2F2ZS1hY2hpZXZlbWVudC1lZGl0cycsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGVkaXRzOiB3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0cyB9KVxuICAgIH0pO1xuICAgIGlmICghcmVzLm9rKSB7XG4gICAgICBjb25zdCBlcnIgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgc2hvd1RvYXN0KGBFcnJvciBzYXZpbmc6ICR7ZXJyLmVycm9yIHx8ICdVbmtub3duIGVycm9yJ31gLCAnZXJyb3InKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3RhdGVNYW5hZ2VyLm1hcmtDb250ZW50Q2hhbmdlZCgpO1xuICAgIHNob3dUb2FzdCgnQWNoaWV2ZW1lbnQgZWRpdHMgc2F2ZWQuJyk7XG4gICAgc3dpdGNoVGFiKCdza2lsbHMtcmV2aWV3Jyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBzaG93VG9hc3QoJ0ZhaWxlZCB0byBzYXZlIGFjaGlldmVtZW50IGVkaXRzLicsICdlcnJvcicpO1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIGZldGNoSnNvbldpdGhUaW1lb3V0LFxuICBfYWNoVmVyYldhcm5pbmcsXG4gIF9hY2hTbmFwc2hvdEtleSxcbiAgX3NhdmVBY2hTbmFwc2hvdCxcbiAgX2dldEFjaFNuYXBzaG90LFxuICBidWlsZEFjaGlldmVtZW50c1Jldmlld1RhYmxlLFxuICBfcmVuZGVyQWNoaWV2ZW1lbnRzUmV2aWV3VGFibGUsXG4gIGJ1bGtBY2hpZXZlbWVudEFjdGlvbixcbiAgaGFuZGxlQWNoaWV2ZW1lbnRBY3Rpb24sXG4gIHN1Ym1pdEFjaGlldmVtZW50RGVjaXNpb25zLFxuICBtb3ZlQWNoaWV2ZW1lbnRSb3csXG4gIGJ1aWxkQWNoaWV2ZW1lbnRzRWRpdG9yLFxuICByZW5kZXJBY2hpZXZlbWVudEVkaXRvclJvd3MsXG4gIHVwZGF0ZUFjaGlldmVtZW50VGV4dCxcbiAgdG9nZ2xlQWNoaWV2ZW1lbnRIaWRkZW4sXG4gIG1vdmVBY2hpZXZlbWVudCxcbiAgZGVsZXRlQWNoaWV2ZW1lbnQsXG4gIGFkZEFjaGlldmVtZW50Um93LFxuICByZXdyaXRlQWNoaWV2ZW1lbnRXaXRoTExNLFxuICBhaVJld3JpdGVUb3BMZXZlbEFjaGlldmVtZW50LFxuICBfb3BlblJld3JpdGVNb2RhbCxcbiAgX3VwZGF0ZVJld3JpdGVBY2NlcHRCdG4sXG4gIF9yZWNvcmRSZXdyaXRlT3V0Y29tZSxcbiAgX3J1blJld3JpdGUsXG4gIHNhdmVUb3BMZXZlbEFjaGlldmVtZW50RmllbGQsXG4gIGRlbGV0ZVRvcExldmVsQWNoaWV2ZW1lbnQsXG4gIHNhdmVTdWdnZXN0ZWRBY2hpZXZlbWVudEZpZWxkLFxuICBhaVJld3JpdGVTdWdnZXN0ZWRBY2hpZXZlbWVudCxcbiAgbW92ZVN1Z2dlc3RlZEFjaGlldmVtZW50Um93LFxuICBkZWxldGVTdWdnZXN0ZWRBY2hpZXZlbWVudCxcbiAgc2F2ZUFjaGlldmVtZW50RWRpdHNBbmRDb250aW51ZSxcbn07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi90YWdsaW5lLXJldmlldy5qc1xuICogQXBwbGljYW50IHRhZ2xpbmUgKGhlYWRsaW5lKSByZXZpZXc6IGRpc3BsYXkgQUktcHJvcG9zZWQgdGFnbGluZSxcbiAqIGFsbG93IGVkaXRpbmcsIHJlcXVpcmUgZXhwbGljaXQgdXNlciBjb25maXJtYXRpb24gYmVmb3JlIGNvbnRpbnVpbmcuXG4gKlxuICogVGhlIHRhZ2xpbmUgaXMgdGhlIG9uZS1saW5lIHByb2Zlc3Npb25hbCBpZGVudGl0eSBzaG93biB1bmRlciB0aGVcbiAqIGFwcGxpY2FudCdzIG5hbWUgb24gdGhlIENWLiAgSXQgaXMgTk9UIHRoZSBzYW1lIGFzIHRoZSBqb2IgdGl0bGUgXHUyMDE0XG4gKiBpdCBkZXNjcmliZXMgdGhlIGFwcGxpY2FudCAoZS5nLiBcIlNlbmlvciBEYXRhIFNjaWVudGlzdCBzcGVjaWFsaXNpbmdcbiAqIGluIGJpb3N0YXRpc3RpY3MgYW5kIE1MXCIpLCBub3QgdGhlIHJvbGUgYmVpbmcgYXBwbGllZCBmb3IuXG4gKlxuICogVXNlciBNVVNUIGNsaWNrIFwiQ29uZmlybSBUYWdsaW5lXCIgYmVmb3JlIGdlbmVyYXRpb24gaXMgYWxsb3dlZC5cbiAqIFRoZSBjb25maXJtZWQgdGV4dCBpcyBzdG9yZWQgdmlhIFBPU1QgL2FwaS9yZXZpZXctZGVjaXNpb25zICh0eXBlOiAndGFnbGluZScpLlxuICpcbiAqIERlcGVuZGVuY2llcyAocmVzb2x2ZWQgdGhyb3VnaCBnbG9iYWxUaGlzIGF0IHJ1bnRpbWUpOlxuICogICBlc2NhcGVIdG1sLCBzaG93VG9hc3QsIHN3aXRjaFRhYiwgc3RhdGVNYW5hZ2VyXG4gKi9cblxuaW1wb3J0IHsgc3RhdGVNYW5hZ2VyIH0gZnJvbSAnLi9zdGF0ZS1tYW5hZ2VyLmpzJztcblxuLy8gXHUyNTAwXHUyNTAwIEJ1aWxkIHRhZ2xpbmUtcmV2aWV3IHNlY3Rpb24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8qKlxuICogZHVja2Zsb3c6XG4gKiAgIGlkOiB0YWdsaW5lX3VpX2J1aWxkXG4gKiAgIGtpbmQ6IHVpXG4gKiAgIHRpbWVzdGFtcDogXCIyMDI2LTA1LTI4VDAwOjAwOjAwWlwiXG4gKiAgIHN0YXR1czogbGl2ZVxuICogICBoYW5kbGVzOiBbXCJ1aTp0YWdsaW5lLXJldmlldy5idWlsZFwiXVxuICogICByZWFkczpcbiAqICAgICAtIFwid2luZG93OnBlbmRpbmdSZWNvbW1lbmRhdGlvbnNcIlxuICogICAgIC0gXCJyZXNwb25zZTpHRVQgL2FwaS9zdGF0dXMudGFnbGluZV9vdmVycmlkZVwiXG4gKiAgICAgLSBcInJlc3BvbnNlOkdFVCAvYXBpL3N0YXR1cy5kZWNpc2lvbnNfY29uZmlybWVkXCJcbiAqICAgd3JpdGVzOiBbXCJkb206I3RhZ2xpbmUtcmV2aWV3LWNvbnRhaW5lclwiXVxuICogICBub3RlczogXCJSZW5kZXJzIHByb3Bvc2VkIHRhZ2xpbmUgKGZyb20gTExNIGN1c3RvbWl6YXRpb25zKSB3aXRoIGFuIGVkaXRhYmxlIGlucHV0IGFuZCBjb25maXJtIGJ1dHRvbi5cIlxuICovXG5hc3luYyBmdW5jdGlvbiBidWlsZFRhZ2xpbmVSZXZpZXdTZWN0aW9uKCkge1xuICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFnbGluZS1yZXZpZXctY29udGFpbmVyJyk7XG4gIGlmICghY29udGFpbmVyKSByZXR1cm47XG5cbiAgLy8gRmV0Y2ggY3VycmVudCBzdGF0dXMgdG8gZ2V0IHRhZ2xpbmVfb3ZlcnJpZGUgKyBwcm9wb3NlZCB0YWdsaW5lXG4gIGxldCBwcm9wb3NlZFRhZ2xpbmUgID0gJyc7XG4gIGxldCBjb25maXJtZWRUYWdsaW5lID0gJyc7XG4gIGxldCBhbHJlYWR5Q29uZmlybWVkID0gZmFsc2U7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgICAgPSBhd2FpdCBmZXRjaCgnL2FwaS9zdGF0dXMnKTtcbiAgICBjb25zdCBzdGF0dXMgPSByZXMub2sgPyBhd2FpdCByZXMuanNvbigpIDoge307XG5cbiAgICAvLyB0YWdsaW5lX292ZXJyaWRlIGlzIHRoZSB1c2VyLWNvbmZpcm1lZCB2YWx1ZSAobWF5IGJlIG51bGwpXG4gICAgY29uZmlybWVkVGFnbGluZSA9IHN0YXR1cy50YWdsaW5lX292ZXJyaWRlIHx8ICcnO1xuICAgIGFscmVhZHlDb25maXJtZWQgPSAhIShzdGF0dXMuZGVjaXNpb25zX2NvbmZpcm1lZCAmJiBzdGF0dXMuZGVjaXNpb25zX2NvbmZpcm1lZC50YWdsaW5lKTtcblxuICAgIC8vIFByb3Bvc2VkIHRhZ2xpbmUgZnJvbSB0aGUgTExNIHJlY29tbWVuZGF0aW9uc1xuICAgIGNvbnN0IGN1c3RvbWl6YXRpb25zID0gc3RhdHVzLmN1c3RvbWl6YXRpb25zIHx8IHt9O1xuICAgIHByb3Bvc2VkVGFnbGluZSA9IGN1c3RvbWl6YXRpb25zLmFwcGxpY2FudF90YWdsaW5lIHx8ICcnO1xuICB9IGNhdGNoIChfZSkge1xuICAgIC8vIE5ldHdvcmsgZmFpbHVyZSBcdTIwMTQgbGVhdmUgZmllbGRzIGVtcHR5LCB1c2VyIGNhbiBzdGlsbCB0eXBlIG1hbnVhbGx5XG4gIH1cblxuICBjb25zdCBpbml0aWFsICAgPSBjb25maXJtZWRUYWdsaW5lIHx8IHByb3Bvc2VkVGFnbGluZTtcbiAgY29uc3Qgc3RhdHVzTXNnID0gYWxyZWFkeUNvbmZpcm1lZFxuICAgID8gJzxzcGFuIHN0eWxlPVwiY29sb3I6IzA2NWY0Njtmb250LXdlaWdodDo2MDA7XCI+XHUyNzEzIENvbmZpcm1lZDwvc3Bhbj4nXG4gICAgOiAnPHNwYW4gc3R5bGU9XCJjb2xvcjojOTI0MDBlO1wiPlJlcXVpcmVzIHlvdXIgY29uZmlybWF0aW9uIGJlZm9yZSBnZW5lcmF0aW5nPC9zcGFuPic7XG5cbiAgY29udGFpbmVyLmlubmVySFRNTCA9IGBcbiAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNnB4O1wiPlxuICAgICAgPHAgc3R5bGU9XCJjb2xvcjojMzc0MTUxO2ZvbnQtc2l6ZTowLjk1ZW07bGluZS1oZWlnaHQ6MS42O21hcmdpbjowIDAgOHB4O1wiPlxuICAgICAgICBUaGUgPHN0cm9uZz50YWdsaW5lPC9zdHJvbmc+IGFwcGVhcnMgZGlyZWN0bHkgdW5kZXIgeW91ciBuYW1lIG9uIHRoZSBDVi5cbiAgICAgICAgSXQgc2hvdWxkIGRlc2NyaWJlIDxlbT53aG8geW91IGFyZTwvZW0+IGFzIGEgcHJvZmVzc2lvbmFsIFx1MjAxNCBub3QgdGhlIGpvYiB0aXRsZSB5b3UgYXJlIGFwcGx5aW5nIGZvci5cbiAgICAgIDwvcD5cbiAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtmb250LXNpemU6MC44NWVtO21hcmdpbjowO1wiPlxuICAgICAgICBFeGFtcGxlOiA8ZW0+XCJTZW5pb3IgRGF0YSBTY2llbnRpc3Qgc3BlY2lhbGlzaW5nIGluIGJpb3N0YXRpc3RpY3MgYW5kIG1hY2hpbmUgbGVhcm5pbmdcIjwvZW0+XG4gICAgICA8L3A+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IHN0eWxlPVwiYm9yZGVyOjFweCBzb2xpZCAjZDFmYWU1O2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MTZweDttYXJnaW4tYm90dG9tOjIwcHg7YmFja2dyb3VuZDojZjBmZGY0O1wiPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDttYXJnaW4tYm90dG9tOjEwcHg7XCI+XG4gICAgICAgIDxzdHJvbmcgc3R5bGU9XCJjb2xvcjojMDY1ZjQ2O1wiPkFwcGxpY2FudCBUYWdsaW5lPC9zdHJvbmc+XG4gICAgICAgIDxzcGFuIGlkPVwidGFnbGluZS1jb25maXJtLXN0YXR1c1wiIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtcIj4ke3N0YXR1c01zZ308L3NwYW4+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGxhYmVsIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtmb250LXdlaWdodDo2MDA7Y29sb3I6IzM3NDE1MTtkaXNwbGF5OmJsb2NrO21hcmdpbi1ib3R0b206NHB4O1wiXG4gICAgICAgICAgICAgZm9yPVwidGFnbGluZS1pbnB1dFwiPlxuICAgICAgICBFZGl0IHRhZ2xpbmUgKHJlcXVpcmVkKTpcbiAgICAgIDwvbGFiZWw+XG4gICAgICA8aW5wdXQgaWQ9XCJ0YWdsaW5lLWlucHV0XCIgdHlwZT1cInRleHRcIlxuICAgICAgICB2YWx1ZT1cIiR7ZXNjYXBlSHRtbChpbml0aWFsKX1cIlxuICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gU2VuaW9yIERhdGEgU2NpZW50aXN0IHNwZWNpYWxpc2luZyBpbiBiaW9zdGF0aXN0aWNzIGFuZCBNTFwiXG4gICAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTtib3gtc2l6aW5nOmJvcmRlci1ib3g7cGFkZGluZzo4cHggMTBweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo0cHg7Zm9udC1zaXplOjAuOTVlbTtcIlxuICAgICAgICBvbmlucHV0PVwib25UYWdsaW5lSW5wdXRDaGFuZ2UoKVwiIC8+XG5cbiAgICAgICR7cHJvcG9zZWRUYWdsaW5lICYmIHByb3Bvc2VkVGFnbGluZSAhPT0gY29uZmlybWVkVGFnbGluZSA/IGBcbiAgICAgIDxwIHN0eWxlPVwibWFyZ2luOjZweCAwIDA7Zm9udC1zaXplOjAuOGVtO2NvbG9yOiM2YjcyODA7XCI+XG4gICAgICAgIEFJIHByb3Bvc2VkOiA8ZW0+JHtlc2NhcGVIdG1sKHByb3Bvc2VkVGFnbGluZSl9PC9lbT5cbiAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPVwicmVzZXRUYWdsaW5lVG9Qcm9wb3NlZCgpXCIgc3R5bGU9XCJiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOm5vbmU7Y3Vyc29yOnBvaW50ZXI7Y29sb3I6IzI1NjNlYjtmb250LXNpemU6MC44ZW07cGFkZGluZzowIDRweDt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO1wiPlVzZSB0aGlzPC9idXR0b24+XG4gICAgICA8L3A+YCA6ICcnfVxuXG4gICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDoxMnB4O1wiPlxuICAgICAgICA8YnV0dG9uIGlkPVwidGFnbGluZS1jb25maXJtLWJ0blwiIGNsYXNzPVwic3VibWl0LWJ0blwiIHN0eWxlPVwiZm9udC1zaXplOjAuOWVtO3BhZGRpbmc6OHB4IDIwcHg7YmFja2dyb3VuZDojMTBiOTgxO1wiXG4gICAgICAgICAgb25jbGljaz1cImNvbmZpcm1UYWdsaW5lKClcIj5cbiAgICAgICAgICBcdTI3MTMgQ29uZmlybSBUYWdsaW5lXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAke2FscmVhZHlDb25maXJtZWQgPyAnPHNwYW4gaWQ9XCJ0YWdsaW5lLWNvbmZpcm1lZC1iYWRnZVwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6MTBweDtmb250LXNpemU6MC44NWVtO2NvbG9yOiMwNjVmNDY7XCI+U2F2ZWQgXHUyNzEzPC9zcGFuPicgOiAnPHNwYW4gaWQ9XCJ0YWdsaW5lLWNvbmZpcm1lZC1iYWRnZVwiIHN0eWxlPVwiZGlzcGxheTpub25lO21hcmdpbi1sZWZ0OjEwcHg7Zm9udC1zaXplOjAuODVlbTtjb2xvcjojMDY1ZjQ2O1wiPlNhdmVkIFx1MjcxMzwvc3Bhbj4nfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwibmF2LWJ1dHRvbnNcIiBzdHlsZT1cIm1hcmdpbi10b3A6MTZweDtcIj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJiYWNrLWJ0blwiIG9uY2xpY2s9XCJzd2l0Y2hUYWIoJ2FjaGlldmVtZW50cy1yZXZpZXcnKVwiPlx1MjE5MCBCYWNrIHRvIEFjaGlldmVtZW50czwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiBpZD1cInRhZ2xpbmUtY29udGludWUtYnRuXCIgY2xhc3M9XCJjb250aW51ZS1idG5cIlxuICAgICAgICBzdHlsZT1cIiR7YWxyZWFkeUNvbmZpcm1lZCA/ICcnIDogJ29wYWNpdHk6MC41O2N1cnNvcjpub3QtYWxsb3dlZDsnfVwiXG4gICAgICAgIG9uY2xpY2s9XCJ0YWdsaW5lQ29udGludWUoKVwiXG4gICAgICAgICR7YWxyZWFkeUNvbmZpcm1lZCA/ICcnIDogJ3RpdGxlPVwiUGxlYXNlIGNvbmZpcm0gdGhlIHRhZ2xpbmUgYmVmb3JlIGNvbnRpbnVpbmdcIid9PlxuICAgICAgICBDb250aW51ZSB0byBTdW1tYXJ5IFx1MjE5MlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+YDtcblxuICAvLyBFeHBvc2UgcHJvcG9zZWQgdGFnbGluZSBmb3IgdGhlIHJlc2V0IGJ1dHRvblxuICB3aW5kb3cuX3Byb3Bvc2VkVGFnbGluZSA9IHByb3Bvc2VkVGFnbGluZTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIElucHV0IGNoYW5nZSBoYW5kbGVyIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBvblRhZ2xpbmVJbnB1dENoYW5nZSgpIHtcbiAgLy8gV2hlbiB1c2VyIGVkaXRzIHRoZSB0ZXh0LCB1bi1jb25maXJtIHRoZSBwcmV2aW91cyBzYXZlIHNvIHRoZXkgbXVzdCByZS1jb25maXJtXG4gIGNvbnN0IGJhZGdlICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFnbGluZS1jb25maXJtZWQtYmFkZ2UnKTtcbiAgY29uc3Qgc3RhdHVzU3BhbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWdsaW5lLWNvbmZpcm0tc3RhdHVzJyk7XG4gIGlmIChiYWRnZSkgICAgICBiYWRnZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBpZiAoc3RhdHVzU3Bhbikgc3RhdHVzU3Bhbi5pbm5lckhUTUwgPSAnPHNwYW4gc3R5bGU9XCJjb2xvcjojOTI0MDBlO1wiPlJlcXVpcmVzIHlvdXIgY29uZmlybWF0aW9uIGJlZm9yZSBnZW5lcmF0aW5nPC9zcGFuPic7XG4gIGNvbnN0IGNvbnRpbnVlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhZ2xpbmUtY29udGludWUtYnRuJyk7XG4gIGlmIChjb250aW51ZUJ0bikge1xuICAgIGNvbnRpbnVlQnRuLnN0eWxlLm9wYWNpdHkgICAgICAgPSAnMC41JztcbiAgICBjb250aW51ZUJ0bi5zdHlsZS5jdXJzb3IgICAgICAgID0gJ25vdC1hbGxvd2VkJztcbiAgICBjb250aW51ZUJ0bi50aXRsZSAgICAgICAgICAgICAgID0gJ1BsZWFzZSBjb25maXJtIHRoZSB0YWdsaW5lIGJlZm9yZSBjb250aW51aW5nJztcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgUmVzZXQgdG8gQUktcHJvcG9zZWQgdGFnbGluZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gcmVzZXRUYWdsaW5lVG9Qcm9wb3NlZCgpIHtcbiAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFnbGluZS1pbnB1dCcpO1xuICBpZiAoaW5wdXQgJiYgd2luZG93Ll9wcm9wb3NlZFRhZ2xpbmUpIHtcbiAgICBpbnB1dC52YWx1ZSA9IHdpbmRvdy5fcHJvcG9zZWRUYWdsaW5lO1xuICAgIG9uVGFnbGluZUlucHV0Q2hhbmdlKCk7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIENvbmZpcm0gYW5kIHBlcnNpc3QgdGFnbGluZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLyoqXG4gKiBkdWNrZmxvdzpcbiAqICAgaWQ6IHRhZ2xpbmVfdWlfY29uZmlybVxuICogICBraW5kOiB1aVxuICogICB0aW1lc3RhbXA6IFwiMjAyNi0wNS0yOFQwMDowMDowMFpcIlxuICogICBzdGF0dXM6IGxpdmVcbiAqICAgaGFuZGxlczogW1widWk6dGFnbGluZS1yZXZpZXcuY29uZmlybVwiXVxuICogICBjYWxsczogW1wiUE9TVCAvYXBpL3Jldmlldy1kZWNpc2lvbnNcIl1cbiAqICAgcmVhZHM6IFtcImRvbTojdGFnbGluZS1pbnB1dFwiXVxuICogICB3cml0ZXM6XG4gKiAgICAgLSBcInJlcXVlc3Q6UE9TVCAvYXBpL3Jldmlldy1kZWNpc2lvbnMudHlwZT10YWdsaW5lXCJcbiAqICAgICAtIFwicmVxdWVzdDpQT1NUIC9hcGkvcmV2aWV3LWRlY2lzaW9ucy5kZWNpc2lvbnNcIlxuICogICBub3RlczogXCJQT1NUcyB0aGUgY29uZmlybWVkIHRhZ2xpbmUgdGV4dDsgZW5hYmxlcyB0aGUgY29udGludWUgYnV0dG9uIG9uIHN1Y2Nlc3MuXCJcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY29uZmlybVRhZ2xpbmUoKSB7XG4gIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhZ2xpbmUtaW5wdXQnKTtcbiAgaWYgKCFpbnB1dCkgcmV0dXJuO1xuXG4gIGNvbnN0IHRhZ2xpbmVUZXh0ID0gaW5wdXQudmFsdWUudHJpbSgpO1xuICBpZiAoIXRhZ2xpbmVUZXh0KSB7XG4gICAgc2hvd1RvYXN0KCdQbGVhc2UgZW50ZXIgYSB0YWdsaW5lIGJlZm9yZSBjb25maXJtaW5nLicsICdlcnJvcicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWdsaW5lLWNvbmZpcm0tYnRuJyk7XG4gIGlmIChidG4pIGJ0bi5kaXNhYmxlZCA9IHRydWU7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3Jldmlldy1kZWNpc2lvbnMnLCB7XG4gICAgICBtZXRob2Q6ICAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6ICAgIEpTT04uc3RyaW5naWZ5KHsgdHlwZTogJ3RhZ2xpbmUnLCBkZWNpc2lvbnM6IHRhZ2xpbmVUZXh0IH0pLFxuICAgIH0pO1xuXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgY29uc3QgZXJyID0gYXdhaXQgcmVzcG9uc2UuanNvbigpLmNhdGNoKCgpID0+ICh7fSkpO1xuICAgICAgc2hvd1RvYXN0KGBGYWlsZWQgdG8gc2F2ZSB0YWdsaW5lOiAke2Vyci5lcnJvciB8fCByZXNwb25zZS5zdGF0dXNUZXh0fWAsICdlcnJvcicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBVSSB0byBzaG93IGNvbmZpcm1lZCBzdGF0ZVxuICAgIGNvbnN0IGJhZGdlICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFnbGluZS1jb25maXJtZWQtYmFkZ2UnKTtcbiAgICBjb25zdCBzdGF0dXNTcGFuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhZ2xpbmUtY29uZmlybS1zdGF0dXMnKTtcbiAgICBpZiAoYmFkZ2UpICAgICAgeyBiYWRnZS5zdHlsZS5kaXNwbGF5ID0gJyc7IH1cbiAgICBpZiAoc3RhdHVzU3BhbikgeyBzdGF0dXNTcGFuLmlubmVySFRNTCA9ICc8c3BhbiBzdHlsZT1cImNvbG9yOiMwNjVmNDY7Zm9udC13ZWlnaHQ6NjAwO1wiPlx1MjcxMyBDb25maXJtZWQ8L3NwYW4+JzsgfVxuXG4gICAgY29uc3QgY29udGludWVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFnbGluZS1jb250aW51ZS1idG4nKTtcbiAgICBpZiAoY29udGludWVCdG4pIHtcbiAgICAgIGNvbnRpbnVlQnRuLnN0eWxlLm9wYWNpdHkgPSAnJztcbiAgICAgIGNvbnRpbnVlQnRuLnN0eWxlLmN1cnNvciAgPSAnJztcbiAgICAgIGNvbnRpbnVlQnRuLnRpdGxlICAgICAgICAgPSAnJztcbiAgICB9XG5cbiAgICBzdGF0ZU1hbmFnZXIubWFya0NvbnRlbnRDaGFuZ2VkKCk7XG4gICAgc2hvd1RvYXN0KCdUYWdsaW5lIGNvbmZpcm1lZC4nKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dUb2FzdCgnTmV0d29yayBlcnJvciBzYXZpbmcgdGFnbGluZS4nLCAnZXJyb3InKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoYnRuKSBidG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgQ29udGludWUgbmF2aWdhdGlvbiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gdGFnbGluZUNvbnRpbnVlKCkge1xuICAvLyBHdWFyZDogbXVzdCBiZSBjb25maXJtZWQgYmVmb3JlIHByb2NlZWRpbmdcbiAgY29uc3QgY29udGludWVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFnbGluZS1jb250aW51ZS1idG4nKTtcbiAgaWYgKGNvbnRpbnVlQnRuICYmIGNvbnRpbnVlQnRuLnN0eWxlLmN1cnNvciA9PT0gJ25vdC1hbGxvd2VkJykge1xuICAgIHNob3dUb2FzdCgnUGxlYXNlIGNvbmZpcm0gdGhlIHRhZ2xpbmUgYmVmb3JlIGNvbnRpbnVpbmcuJywgJ2Vycm9yJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHN3aXRjaFRhYignc3VtbWFyeS1yZXZpZXcnKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEV4cG9ydHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmV4cG9ydCB7XG4gIGJ1aWxkVGFnbGluZVJldmlld1NlY3Rpb24sXG4gIG9uVGFnbGluZUlucHV0Q2hhbmdlLFxuICByZXNldFRhZ2xpbmVUb1Byb3Bvc2VkLFxuICBjb25maXJtVGFnbGluZSxcbiAgdGFnbGluZUNvbnRpbnVlLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL3N1bW1hcnktcmV2aWV3LmpzXG4gKiBTdW1tYXJ5LWZvY3VzIHNlbGVjdGlvbjogQUkgZ2VuZXJhdGlvbiwgc3RvcmVkIHZhcmlhbnRzLCBzdWJtaXQgZGVjaXNpb24uXG4gKlxuICogRGVwZW5kZW5jaWVzIChyZXNvbHZlZCB0aHJvdWdoIGdsb2JhbFRoaXMgYXQgcnVudGltZSk6XG4gKiAgIHBlbmRpbmdSZWNvbW1lbmRhdGlvbnMsIHNlbGVjdGVkU3VtbWFyeUtleSwgX2FpR2VuZXJhdGVkU3VtbWFyeSxcbiAqICAgZXNjYXBlSHRtbCwgc2hvd1RvYXN0LCBzd2l0Y2hUYWIsIHNldExvYWRpbmcsIHNjaGVkdWxlQXRzUmVmcmVzaFxuICovXG5cbmltcG9ydCB7IHN0YXRlTWFuYWdlciB9IGZyb20gJy4vc3RhdGUtbWFuYWdlci5qcyc7XG5cbi8vIFx1MjUwMFx1MjUwMCBCdWlsZCBzdW1tYXJ5LWZvY3VzIHNlY3Rpb24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8qKlxuICogZHVja2Zsb3c6XG4gKiAgIGlkOiBzdW1tYXJ5X3VpX2J1aWxkXG4gKiAgIGtpbmQ6IHVpXG4gKiAgIHRpbWVzdGFtcDogXCIyMDI2LTAzLTI3VDAxOjIzOjI4WlwiXG4gKiAgIHN0YXR1czogc2hhcmVkXG4gKiAgIGhhbmRsZXM6IFtcInVpOnN1bW1hcnktcmV2aWV3LmJ1aWxkXCJdXG4gKiAgIGNhbGxzOiBbXCJHRVQgL2FwaS9tYXN0ZXItZmllbGRzXCIsIFwiR0VUIC9hcGkvc3RhdHVzXCIsIFwidWk6c3VtbWFyeS1yZXZpZXcuZ2VuZXJhdGVcIl1cbiAqICAgcmVhZHM6XG4gKiAgICAgLSBcIndpbmRvdzpwZW5kaW5nUmVjb21tZW5kYXRpb25zXCJcbiAqICAgICAtIFwicmVzcG9uc2U6R0VUIC9hcGkvbWFzdGVyLWZpZWxkcy5wcm9mZXNzaW9uYWxfc3VtbWFyaWVzXCJcbiAqICAgICAtIFwicmVzcG9uc2U6R0VUIC9hcGkvc3RhdHVzLnByb2Zlc3Npb25hbF9zdW1tYXJpZXNcIlxuICogICAgIC0gXCJzdGF0ZTpzZXNzaW9uX3N1bW1hcmllcy5haV9nZW5lcmF0ZWRcIlxuICogICB3cml0ZXM6IFtcImRvbTojc3VtbWFyeS1mb2N1cy1jb250YWluZXJcIiwgXCJ3aW5kb3c6c2VsZWN0ZWRTdW1tYXJ5S2V5XCJdXG4gKiAgIG5vdGVzOiBcIkJ1aWxkcyB0aGUgc3VtbWFyeSByZXZpZXcgVUkgZnJvbSBtYXN0ZXIgdmFyaWFudHMgcGx1cyBzZXNzaW9uIG92ZXJyaWRlcyBhbmQgc2VlZHMgdGhlIHNlbGVjdGVkIGtleS5cIlxuICovXG5cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkU3VtbWFyeUZvY3VzU2VjdGlvbigpIHtcbiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1bW1hcnktZm9jdXMtY29udGFpbmVyJyk7XG4gIGlmICghY29udGFpbmVyKSByZXR1cm47XG5cbiAgY29uc3QgZGF0YSA9IHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zO1xuXG4gIC8vIFx1MjUwMFx1MjUwMCBMb2FkIGFsbCBrbm93biBzdW1tYXJpZXMgKG1hc3RlciBiYXNlICsgc2Vzc2lvbiBvdmVycmlkZXMpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAvLyBGZXRjaCBtYXN0ZXIgZmllbGRzIGFuZCBzdGF0dXMgaW4gcGFyYWxsZWw7IHNlc3Npb24gc3VtbWFyaWVzIG92ZXJ3cml0ZSBtYXN0ZXIgdmFyaWFudHMuXG4gIGxldCBwcm9mZXNzaW9uYWxTdW1tYXJpZXMgPSB7fTtcbiAgY29uc3QgW21mUmVzdWx0LCBzdGF0dXNSZXN1bHRdID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFtcbiAgICBmZXRjaCgnL2FwaS9tYXN0ZXItZmllbGRzJykudGhlbihyID0+IHIuanNvbigpKSxcbiAgICBmZXRjaCgnL2FwaS9zdGF0dXMnKS50aGVuKHIgPT4gci5qc29uKCkpLFxuICBdKTtcbiAgaWYgKG1mUmVzdWx0LnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcgJiYgbWZSZXN1bHQudmFsdWUgJiYgbWZSZXN1bHQudmFsdWUub2spIHtcbiAgICBPYmplY3QuYXNzaWduKHByb2Zlc3Npb25hbFN1bW1hcmllcywgbWZSZXN1bHQudmFsdWUucHJvZmVzc2lvbmFsX3N1bW1hcmllcyB8fCB7fSk7XG4gIH1cbiAgaWYgKHN0YXR1c1Jlc3VsdC5zdGF0dXMgPT09ICdmdWxmaWxsZWQnICYmIHN0YXR1c1Jlc3VsdC52YWx1ZSkge1xuICAgIC8vIFNlc3Npb24gc3VtbWFyaWVzIChlLmcuIGFpX2dlbmVyYXRlZCkgb3ZlcndyaXRlIG1hc3RlciB2YXJpYW50c1xuICAgIE9iamVjdC5hc3NpZ24ocHJvZmVzc2lvbmFsU3VtbWFyaWVzLCBzdGF0dXNSZXN1bHQudmFsdWUucHJvZmVzc2lvbmFsX3N1bW1hcmllcyB8fCB7fSk7XG4gIH1cblxuICAvLyBcdTI1MDBcdTI1MDAgU3VnZ2VzdGVkIGNvbnRlbnQgcmVvcmRlcmluZyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgY29uc3QgcmVvcmRlcmluZ1RleHQgPSAoZGF0YSAmJiBkYXRhLnN1Z2dlc3RlZF9jb250ZW50X3Jlb3JkZXJpbmcpIHx8ICcnO1xuICBjb25zdCByZW9yZGVyaW5nSFRNTCA9IHJlb3JkZXJpbmdUZXh0XG4gICAgPyBgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2VmZjZmZjtib3JkZXI6MXB4IHNvbGlkICNiZmRiZmU7Ym9yZGVyLXJhZGl1czo2cHg7cGFkZGluZzoxMnB4O21hcmdpbi1ib3R0b206MTZweDtcIj5cbiAgICAgICAgPHN0cm9uZyBzdHlsZT1cImNvbG9yOiMxZTQwYWY7XCI+XHVEODNEXHVEQ0NCIFN1Z2dlc3RlZCBDb250ZW50IE9yZGVyOjwvc3Ryb25nPlxuICAgICAgICA8cCBzdHlsZT1cIm1hcmdpbjo2cHggMCAwO2NvbG9yOiMxZTNhOGE7Zm9udC1zaXplOjAuOWVtO3doaXRlLXNwYWNlOnByZS1saW5lO1wiPiR7ZXNjYXBlSHRtbChyZW9yZGVyaW5nVGV4dCl9PC9wPlxuICAgICAgIDwvZGl2PmBcbiAgICA6ICcnO1xuXG4gIC8vIFx1MjUwMFx1MjUwMCBSZW5kZXIgc2tlbGV0b24gd2hpbGUgd2UgZ2VuZXJhdGUgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIGNvbnRhaW5lci5pbm5lckhUTUwgPSBgXG4gICAgJHtyZW9yZGVyaW5nSFRNTH1cbiAgICA8ZGl2IGlkPVwiYWktc3VtbWFyeS1wYW5lbFwiIHN0eWxlPVwiYm9yZGVyOjFweCBzb2xpZCAjZDFmYWU1O2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MTZweDttYXJnaW4tYm90dG9tOjIwcHg7YmFja2dyb3VuZDojZjBmZGY0O1wiPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDttYXJnaW4tYm90dG9tOjEwcHg7XCI+XG4gICAgICAgIDxzdHJvbmcgc3R5bGU9XCJjb2xvcjojMDY1ZjQ2O1wiPlx1RDgzRVx1REQxNiBBSS1Qcm9wb3NlZCBTdW1tYXJ5PC9zdHJvbmc+XG4gICAgICAgIDxzcGFuIGlkPVwiYWktc3VtbWFyeS1zdGF0dXNcIiBzdHlsZT1cImZvbnQtc2l6ZTowLjhlbTtjb2xvcjojNmI3MjgwO1wiPkdlbmVyYXRpbmdcdTIwMjY8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgaWQ9XCJhaS1zdW1tYXJ5LWxvYWRpbmdcIiBzdHlsZT1cImZvbnQtc2l6ZTowLjllbTtjb2xvcjojOWNhM2FmO21pbi1oZWlnaHQ6NDBweDtcIj48ZW0+R2VuZXJhdGluZyBhIHRhaWxvcmVkIHN1bW1hcnkgZm9yIHRoaXMgYXBwbGljYXRpb25cdTIwMjY8L2VtPjwvZGl2PlxuICAgICAgPHRleHRhcmVhIGlkPVwiYWktc3VtbWFyeS10ZXh0XCIgcm93cz1cIjdcIiBvbmlucHV0PVwib25TdW1tYXJ5VGV4dENoYW5nZSgpXCJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCJHZW5lcmF0aW5nXHUyMDI2XCJcbiAgICAgICAgc3R5bGU9XCJ3aWR0aDoxMDAlO2JveC1zaXppbmc6Ym9yZGVyLWJveDtwYWRkaW5nOjhweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo0cHg7Zm9udC1zaXplOjAuOWVtO2xpbmUtaGVpZ2h0OjEuNjtyZXNpemU6dmVydGljYWw7ZGlzcGxheTpub25lO1wiPjwvdGV4dGFyZWE+XG4gICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDoxMnB4O1wiPlxuICAgICAgICA8bGFiZWwgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjojMzc0MTUxO2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWJvdHRvbTo0cHg7XCI+UmVxdWVzdCBjaGFuZ2VzIChvcHRpb25hbCk6PC9sYWJlbD5cbiAgICAgICAgPHRleHRhcmVhIGlkPVwic3VtbWFyeS1yZWZpbmVtZW50LWlucHV0XCIgcm93cz1cIjJcIlxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiAnTWFrZSBpdCBtb3JlIGNvbmNpc2UnLCAnRW1waGFzaXNlIG15IGxlYWRlcnNoaXAgZXhwZXJpZW5jZScsICdVc2UgYSBtb3JlIGZvcm1hbCB0b25lJ1x1MjAyNlwiXG4gICAgICAgICAgc3R5bGU9XCJ3aWR0aDoxMDAlO2JveC1zaXppbmc6Ym9yZGVyLWJveDtwYWRkaW5nOjhweDtib3JkZXI6MXB4IHNvbGlkICNkMWQ1ZGI7Ym9yZGVyLXJhZGl1czo0cHg7Zm9udC1zaXplOjAuODVlbTtyZXNpemU6dmVydGljYWw7XCI+PC90ZXh0YXJlYT5cbiAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6OHB4O2Rpc3BsYXk6ZmxleDtnYXA6OHB4O2ZsZXgtd3JhcDp3cmFwO1wiPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJhaS1yZWdlbmVyYXRlLWJ0blwiIGNsYXNzPVwic3VibWl0LWJ0blwiIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtwYWRkaW5nOjZweCAxNHB4O1wiXG4gICAgICAgICAgICBvbmNsaWNrPVwicmVnZW5lcmF0ZUFJU3VtbWFyeSgpXCI+UmVnZW5lcmF0ZTwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzdWJtaXQtYnRuXCIgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO3BhZGRpbmc6NnB4IDE0cHg7YmFja2dyb3VuZDojMTBiOTgxO1wiXG4gICAgICAgICAgICBvbmNsaWNrPVwidXNlQUlTdW1tYXJ5KClcIj5Vc2UgVGhpcyBTdW1tYXJ5PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBpZD1cInN1bW1hcnktc3RvcmVkLXNlY3Rpb25cIj5cbiAgICAgIDxkZXRhaWxzIHN0eWxlPVwibWFyZ2luLWJvdHRvbTo4cHg7XCI+XG4gICAgICAgIDxzdW1tYXJ5IHN0eWxlPVwiY3Vyc29yOnBvaW50ZXI7Zm9udC1zaXplOjAuODVlbTtjb2xvcjojNmI3MjgwO3VzZXItc2VsZWN0Om5vbmU7XCI+XG4gICAgICAgICAgVXNlIGEgc3RvcmVkIHN1bW1hcnkgdmFyaWFudCBpbnN0ZWFkXG4gICAgICAgIDwvc3VtbWFyeT5cbiAgICAgICAgPGRpdiBpZD1cInN1bW1hcnktcmFkaW9zXCIgc3R5bGU9XCJtYXJnaW4tdG9wOjEwcHg7XCI+PC9kaXY+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOjhweDtcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic3VibWl0LWJ0blwiIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtwYWRkaW5nOjZweCAxNHB4O1wiXG4gICAgICAgICAgICBvbmNsaWNrPVwic3VibWl0U3VtbWFyeUZvY3VzRGVjaXNpb24oKVwiPlVzZSBTZWxlY3RlZCBTdG9yZWQgU3VtbWFyeTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGV0YWlscz5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibmF2LWJ1dHRvbnNcIiBzdHlsZT1cIm1hcmdpbi10b3A6MTZweDtcIj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJiYWNrLWJ0blwiIG9uY2xpY2s9XCJzd2l0Y2hUYWIoJ3RhZ2xpbmUtcmV2aWV3JylcIj5cdTIxOTAgQmFjayB0byBUYWdsaW5lPC9idXR0b24+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiY29udGludWUtYnRuXCIgb25jbGljaz1cInN1Ym1pdFN1bW1hcnlGb2N1c0RlY2lzaW9uKClcIj5Db250aW51ZSB0byBQdWJsaWNhdGlvbnMgXHUyMTkyPC9idXR0b24+XG4gICAgPC9kaXY+YDtcblxuICAvLyBSZW5kZXIgc3RvcmVkIHN1bW1hcmllcyBpbiB0aGUgY29sbGFwc2libGUgc2VjdGlvblxuICBfcmVuZGVyU3RvcmVkU3VtbWFyeVJhZGlvcyhwcm9mZXNzaW9uYWxTdW1tYXJpZXMpO1xuXG4gIC8vIFx1MjUwMFx1MjUwMCBBdXRvLWdlbmVyYXRlIG9yIGxvYWQgY2FjaGVkIEFJIHN1bW1hcnkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIGNvbnN0IGNhY2hlZFN1bW1hcnkgPSBwcm9mZXNzaW9uYWxTdW1tYXJpZXNbJ2FpX2dlbmVyYXRlZCddIHx8ICcnO1xuICBpZiAoY2FjaGVkU3VtbWFyeSkge1xuICAgIF9zaG93QUlTdW1tYXJ5KGNhY2hlZFN1bW1hcnksICcoY2FjaGVkIFx1MjAxNCBjbGljayBSZWdlbmVyYXRlIHRvIHJlZnJlc2gpJyk7XG4gICAgd2luZG93LnNlbGVjdGVkU3VtbWFyeUtleSA9ICdhaV9nZW5lcmF0ZWQnO1xuICAgIGF3YWl0IHNhdmVTdW1tYXJ5Rm9jdXNUb0JhY2tlbmQoJ2FpX2dlbmVyYXRlZCcpO1xuICB9IGVsc2Uge1xuICAgIGF3YWl0IF9jYWxsR2VuZXJhdGVTdW1tYXJ5KG51bGwsIG51bGwpO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBSZW5kZXIgc3RvcmVkIHN1bW1hcnkgcmFkaW8gYnV0dG9ucyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gX3JlbmRlclN0b3JlZFN1bW1hcnlSYWRpb3MocHJvZmVzc2lvbmFsU3VtbWFyaWVzKSB7XG4gIGNvbnN0IHJhZGlvc0NvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdW1tYXJ5LXJhZGlvcycpO1xuICBpZiAoIXJhZGlvc0NvbnRhaW5lcikgcmV0dXJuO1xuICBjb25zdCBtYXN0ZXJLZXlzID0gT2JqZWN0LmtleXMocHJvZmVzc2lvbmFsU3VtbWFyaWVzKS5maWx0ZXIoayA9PiBrICE9PSAnYWlfZ2VuZXJhdGVkJyk7XG4gIGlmIChtYXN0ZXJLZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJhZGlvc0NvbnRhaW5lci5pbm5lckhUTUwgPSAnPHAgc3R5bGU9XCJjb2xvcjojOWNhM2FmO2ZvbnQtc2l6ZTowLjg1ZW07XCI+Tm8gc3RvcmVkIHN1bW1hcmllcyBhdmFpbGFibGUuPC9wPic7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGN1cnJlbnRLZXkgPSB3aW5kb3cuc2VsZWN0ZWRTdW1tYXJ5S2V5IHx8ICcnO1xuICByYWRpb3NDb250YWluZXIuaW5uZXJIVE1MID0gbWFzdGVyS2V5cy5tYXAoa2V5ID0+IHtcbiAgICBjb25zdCBwcmV2aWV3ID0gKHByb2Zlc3Npb25hbFN1bW1hcmllc1trZXldIHx8ICcnKS5zbGljZSgwLCAyMDApO1xuICAgIGNvbnN0IGxhYmVsID0ga2V5LnJlcGxhY2UoL18vZywgJyAnKS5yZXBsYWNlKC9cXGJcXHcvZywgYyA9PiBjLnRvVXBwZXJDYXNlKCkpO1xuICAgIGNvbnN0IGNoZWNrZWQgPSBrZXkgPT09IGN1cnJlbnRLZXkgPyAnY2hlY2tlZCcgOiAnJztcbiAgICByZXR1cm4gYFxuICAgICAgPGxhYmVsIHN0eWxlPVwiZGlzcGxheTpibG9jaztib3JkZXI6MXB4IHNvbGlkICNlNWU3ZWI7Ym9yZGVyLXJhZGl1czo2cHg7cGFkZGluZzoxMnB4O21hcmdpbi1ib3R0b206OHB4O2N1cnNvcjpwb2ludGVyOyR7Y2hlY2tlZCA/ICdib3JkZXItY29sb3I6IzEwYjk4MTtiYWNrZ3JvdW5kOiNmMGZkZjQ7JyA6ICcnfVwiPlxuICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cInN1bW1hcnlfa2V5XCIgdmFsdWU9XCIke2VzY2FwZUh0bWwoa2V5KX1cIiAke2NoZWNrZWR9XG4gICAgICAgICAgb25jaGFuZ2U9XCJzZWxlY3RTdW1tYXJ5S2V5KCcke2VzY2FwZUh0bWwoa2V5KX0nKVwiIHN0eWxlPVwibWFyZ2luLXJpZ2h0OjhweDtcIj5cbiAgICAgICAgPHN0cm9uZz4ke2VzY2FwZUh0bWwobGFiZWwpfTwvc3Ryb25nPiA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjc1ZW07cGFkZGluZzoxcHggNnB4O2JvcmRlci1yYWRpdXM6OTk5cHg7YmFja2dyb3VuZDojZWZmNmZmO2NvbG9yOiMxZDRlZDg7Ym9yZGVyOjFweCBzb2xpZCAjYmZkYmZlO2ZvbnQtd2VpZ2h0OjYwMDtcIj5cdUQ4M0RcdURDQzQgRnJvbSB5b3VyIE1hc3RlciBDVjwvc3Bhbj5cbiAgICAgICAgPHAgc3R5bGU9XCJtYXJnaW46NnB4IDAgMDtmb250LXNpemU6MC44NWVtO2NvbG9yOiM2YjcyODA7XCI+JHtlc2NhcGVIdG1sKHByZXZpZXcpfSR7cHJldmlldy5sZW5ndGggPT09IDIwMCA/ICdcdTIwMjYnIDogJyd9PC9wPlxuICAgICAgPC9sYWJlbD5gO1xuICB9KS5qb2luKCcnKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFNob3cgQUktZ2VuZXJhdGVkIHN1bW1hcnkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIF9zaG93QUlTdW1tYXJ5KHRleHQsIHN0YXR1c0xhYmVsKSB7XG4gIGNvbnN0IHRleHRFbCAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhaS1zdW1tYXJ5LXRleHQnKTtcbiAgY29uc3QgbG9hZGluZ0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FpLXN1bW1hcnktbG9hZGluZycpO1xuICBjb25zdCBzdGF0dXNFbCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWktc3VtbWFyeS1zdGF0dXMnKTtcbiAgaWYgKHRleHRFbCkge1xuICAgIHRleHRFbC52YWx1ZSA9IHRleHQ7XG4gICAgdGV4dEVsLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgfVxuICBpZiAobG9hZGluZ0VsKSBsb2FkaW5nRWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgaWYgKHN0YXR1c0VsKSAgc3RhdHVzRWwudGV4dENvbnRlbnQgPSBzdGF0dXNMYWJlbCB8fCAnJztcbiAgd2luZG93Ll9haUdlbmVyYXRlZFN1bW1hcnkgPSB0ZXh0O1xuICBfdXBkYXRlU3VtbWFyeVNwZWNpZmljaXR5QmFkZ2UodGV4dCk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBTdW1tYXJ5IHNwZWNpZmljaXR5IHZhbGlkYXRvciBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gX2NoZWNrU3VtbWFyeVNwZWNpZmljaXR5KHRleHQpIHtcbiAgaWYgKCF0ZXh0IHx8ICF0ZXh0LnRyaW0oKSkgcmV0dXJuIFtdO1xuICBjb25zdCB3YXJuaW5ncyA9IFtdO1xuICAvLyBDaGVjayAxOiBxdWFudGlmaWVkIGNsYWltIChudW1iZXIsIHBlcmNlbnRhZ2UsIG9yIHllYXIgcmFuZ2UpXG4gIGNvbnN0IGhhc1F1YW50aWZpZWQgPSAvXFxiXFxkW1xcZCxdKlxccyooJXxwZXJjZW50fHlycz98eWVhcnM/fG1vbnRocz98eFxcYnxcXCt8a1xcYnxtXFxifFxcLlxcZCkvaS50ZXN0KHRleHQpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAvXFxiXFxkK1xcK1xccyooeWVhcnM/fHlycz98bW9udGhzPykvaS50ZXN0KHRleHQpO1xuICBpZiAoIWhhc1F1YW50aWZpZWQpIHtcbiAgICB3YXJuaW5ncy5wdXNoKCdObyBxdWFudGlmaWVkIGNsYWltIGRldGVjdGVkIChlLmcuIFwiNSsgeWVhcnNcIiwgXCIzMCUgcmVkdWN0aW9uXCIsIFwiJDJNXCIpLiBBZGRpbmcgYSBudW1iZXIgc3RyZW5ndGhlbnMgY3JlZGliaWxpdHkuJyk7XG4gIH1cbiAgLy8gQ2hlY2sgMjogdGFyZ2V0IHJvbGUga2V5d29yZCBwcmVzZW50XG4gIGNvbnN0IGFuYWx5c2lzID0gd2luZG93Ll9sYXN0QW5hbHlzaXNEYXRhIHx8XG4gICAgKHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zICYmIHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zLmpvYl9hbmFseXNpcykgfHwge307XG4gIGNvbnN0IHJvbGVUaXRsZSA9IChhbmFseXNpcy50aXRsZSB8fCBhbmFseXNpcy5qb2JfdGl0bGUgfHwgJycpLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICBpZiAocm9sZVRpdGxlICYmIHJvbGVUaXRsZS5sZW5ndGggPiAzKSB7XG4gICAgY29uc3Qgcm9sZVBhcnRzID0gcm9sZVRpdGxlLnNwbGl0KC9bXFxzLyxdKy8pLmZpbHRlcih3ID0+IHcubGVuZ3RoID4gMyk7XG4gICAgY29uc3QgaW5UZXh0ID0gcm9sZVBhcnRzLnNvbWUocGFydCA9PiB0ZXh0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocGFydCkpO1xuICAgIGlmICghaW5UZXh0KSB7XG4gICAgICB3YXJuaW5ncy5wdXNoKGBUYXJnZXQgcm9sZSAoXCIke2VzY2FwZUh0bWwocm9sZVRpdGxlKX1cIikgbm90IG1lbnRpb25lZCBcdTIwMTQgY29uc2lkZXIgZWNob2luZyB0aGUgcm9sZSBvciBhIHN5bm9ueW0uYCk7XG4gICAgfVxuICB9XG4gIC8vIENoZWNrIDM6IGZhbGxiYWNrIGdlbmVyaWMgcGxhY2Vob2xkZXJcbiAgY29uc3QgZ2VuZXJpY1BocmFzZXMgPSBbJ2V4cGVyaWVuY2VkIHByb2Zlc3Npb25hbCcsICd0cmFjayByZWNvcmQgb2Ygc3VjY2VzcycsICdzZWVraW5nIGEgY2hhbGxlbmdpbmcnXTtcbiAgZm9yIChjb25zdCBwaHJhc2Ugb2YgZ2VuZXJpY1BocmFzZXMpIHtcbiAgICBpZiAodGV4dC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHBocmFzZSkpIHtcbiAgICAgIHdhcm5pbmdzLnB1c2goYEdlbmVyaWMgcGxhY2Vob2xkZXIgcGhyYXNlIGRldGVjdGVkIChcIiR7cGhyYXNlfVwiKSBcdTIwMTQgcmVwbGFjZSB3aXRoIHNwZWNpZmljIGFjaGlldmVtZW50cy5gKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHdhcm5pbmdzO1xufVxuXG5mdW5jdGlvbiBfdXBkYXRlU3VtbWFyeVNwZWNpZmljaXR5QmFkZ2UodGV4dCkge1xuICBsZXQgYmFkZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3VtbWFyeS1zcGVjaWZpY2l0eS1iYWRnZScpO1xuICBpZiAoIWJhZGdlKSB7XG4gICAgY29uc3QgdGV4dEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FpLXN1bW1hcnktdGV4dCcpO1xuICAgIGlmICghdGV4dEVsIHx8ICF0ZXh0RWwucGFyZW50Tm9kZSkgcmV0dXJuO1xuICAgIGJhZGdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgYmFkZ2UuaWQgPSAnc3VtbWFyeS1zcGVjaWZpY2l0eS1iYWRnZSc7XG4gICAgYmFkZ2Uuc3R5bGUuY3NzVGV4dCA9ICdtYXJnaW4tdG9wOjZweDtmb250LXNpemU6MC44MmVtOyc7XG4gICAgdGV4dEVsLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGJhZGdlLCB0ZXh0RWwubmV4dFNpYmxpbmcpO1xuICB9XG4gIGNvbnN0IHdhcm5pbmdzID0gX2NoZWNrU3VtbWFyeVNwZWNpZmljaXR5KHRleHQpO1xuICBpZiAod2FybmluZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgYmFkZ2UuaW5uZXJIVE1MID0gJzxzcGFuIHN0eWxlPVwiY29sb3I6IzEwYjk4MTtcIj5cdTI3MTMgU3VtbWFyeSBoYXMgc3BlY2lmaWMsIHF1YW50aWZpZWQgY29udGVudC48L3NwYW4+JztcbiAgfSBlbHNlIHtcbiAgICBiYWRnZS5pbm5lckhUTUwgPSB3YXJuaW5ncy5tYXAodyA9PlxuICAgICAgYDxkaXYgc3R5bGU9XCJjb2xvcjojYjQ1MzA5O21hcmdpbi10b3A6MnB4O1wiPlx1MjZBMCAke3d9PC9kaXY+YFxuICAgICkuam9pbignJyk7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIENhbGwgZ2VuZXJhdGUtc3VtbWFyeSBBUEkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8qKlxuICogZHVja2Zsb3c6XG4gKiAgIGlkOiBzdW1tYXJ5X3VpX2dlbmVyYXRlXG4gKiAgIGtpbmQ6IHVpXG4gKiAgIHRpbWVzdGFtcDogXCIyMDI2LTAzLTI3VDAxOjIzOjI4WlwiXG4gKiAgIHN0YXR1czogc2hhcmVkXG4gKiAgIGhhbmRsZXM6IFtcInVpOnN1bW1hcnktcmV2aWV3LmdlbmVyYXRlXCJdXG4gKiAgIGNhbGxzOiBbXCJQT1NUIC9hcGkvZ2VuZXJhdGUtc3VtbWFyeVwiLCBcInVpOnN1bW1hcnktcmV2aWV3LnBlcnNpc3RcIl1cbiAqICAgcmVhZHM6IFtcInJlc3BvbnNlOlBPU1QgL2FwaS9nZW5lcmF0ZS1zdW1tYXJ5LnN1bW1hcnlcIiwgXCJ3aW5kb3c6X2FpR2VuZXJhdGVkU3VtbWFyeVwiXVxuICogICB3cml0ZXM6IFtcImRvbTojYWktc3VtbWFyeS10ZXh0XCIsIFwiZG9tOiNhaS1zdW1tYXJ5LXN0YXR1c1wiLCBcIndpbmRvdzpfYWlHZW5lcmF0ZWRTdW1tYXJ5XCIsIFwid2luZG93OnNlbGVjdGVkU3VtbWFyeUtleVwiXVxuICogICBub3RlczogXCJSZXF1ZXN0cyBhIGdlbmVyYXRlZCBvciByZWZpbmVkIHN1bW1hcnksIHVwZGF0ZXMgdGhlIGxvY2FsIFVJLCBhbmQgcGVyc2lzdHMgdGhlIHNlbGVjdGVkIHN1bW1hcnkga2V5LlwiXG4gKi9cblxuYXN5bmMgZnVuY3Rpb24gX2NhbGxHZW5lcmF0ZVN1bW1hcnkocmVmaW5lbWVudFByb21wdCwgcHJldmlvdXNTdW1tYXJ5KSB7XG4gIGNvbnN0IGJ0biAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FpLXJlZ2VuZXJhdGUtYnRuJyk7XG4gIGNvbnN0IHN0YXR1c0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FpLXN1bW1hcnktc3RhdHVzJyk7XG4gIGNvbnN0IHRleHRFbCAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FpLXN1bW1hcnktdGV4dCcpO1xuICBjb25zdCBsb2FkaW5nRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWktc3VtbWFyeS1sb2FkaW5nJyk7XG4gIGlmIChidG4pICAgICAgYnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgaWYgKHN0YXR1c0VsKSBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICdHZW5lcmF0aW5nXHUyMDI2JztcbiAgLy8gU2hvdyBsb2FkaW5nIGluZGljYXRvcjsgaGlkZSB0aGUgdGV4dGFyZWEgd2hpbGUgZ2VuZXJhdGluZy5cbiAgaWYgKGxvYWRpbmdFbCkgeyBsb2FkaW5nRWwuaW5uZXJIVE1MID0gJzxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDoxMHB4O2NvbG9yOiM2YjcyODA7cGFkZGluZzo4cHggMDtcIj48ZGl2IGNsYXNzPVwibG9hZGluZy1zcGlubmVyXCIgc3R5bGU9XCJ3aWR0aDoyMHB4O2hlaWdodDoyMHB4O2JvcmRlci13aWR0aDoycHg7XCI+PC9kaXY+PGVtPkdlbmVyYXRpbmcgYSB0YWlsb3JlZCBzdW1tYXJ5XHUyMDI2PC9lbT48L2Rpdj4nOyBsb2FkaW5nRWwuc3R5bGUuZGlzcGxheSA9ICcnOyB9XG4gIGlmICh0ZXh0RWwpICAgdGV4dEVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgLy8gVXNlIHRoZSBnbG9iYWwgTExNIHN0YXR1cyBiYXIgZm9yIHZpc2liaWxpdHlcbiAgc2V0TG9hZGluZyh0cnVlLCAnR2VuZXJhdGluZyBzdW1tYXJ5XHUyMDI2Jyk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBib2R5ID0ge307XG4gICAgaWYgKHJlZmluZW1lbnRQcm9tcHQpIGJvZHkucmVmaW5lbWVudF9wcm9tcHQgPSByZWZpbmVtZW50UHJvbXB0O1xuICAgIGlmIChwcmV2aW91c1N1bW1hcnkpICBib2R5LnByZXZpb3VzX3N1bW1hcnkgID0gcHJldmlvdXNTdW1tYXJ5O1xuXG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL2dlbmVyYXRlLXN1bW1hcnknLCB7XG4gICAgICBtZXRob2Q6ICAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6ICAgIEpTT04uc3RyaW5naWZ5KGJvZHkpLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuXG4gICAgaWYgKGRhdGEub2spIHtcbiAgICAgIF9zaG93QUlTdW1tYXJ5KGRhdGEuc3VtbWFyeSwgJ1x1MjcxMyBnZW5lcmF0ZWQnKTtcbiAgICAgIHdpbmRvdy5zZWxlY3RlZFN1bW1hcnlLZXkgPSAnYWlfZ2VuZXJhdGVkJztcbiAgICAgIGF3YWl0IHNhdmVTdW1tYXJ5Rm9jdXNUb0JhY2tlbmQoJ2FpX2dlbmVyYXRlZCcpO1xuICAgICAgc2NoZWR1bGVBdHNSZWZyZXNoKCdyZXZpZXdfY2hlY2twb2ludCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJ1x1MjZBMCBlcnJvcic7XG4gICAgICBpZiAodGV4dEVsKSAgIHRleHRFbC5pbm5lckhUTUwgPSBgPHNwYW4gc3R5bGU9XCJjb2xvcjojZWY0NDQ0O1wiPiR7ZXNjYXBlSHRtbChkYXRhLmVycm9yIHx8ICdHZW5lcmF0aW9uIGZhaWxlZC4nKX08L3NwYW4+YDtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnXHUyNkEwIG5ldHdvcmsgZXJyb3InO1xuICAgIGlmICh0ZXh0RWwpICAgdGV4dEVsLmlubmVySFRNTCA9ICc8c3BhbiBzdHlsZT1cImNvbG9yOiNlZjQ0NDQ7XCI+TmV0d29yayBlcnJvciBcdTIwMTQgcGxlYXNlIHRyeSBhZ2Fpbi48L3NwYW4+JztcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoYnRuKSBidG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgUmVnZW5lcmF0ZSAvIHVzZSBBSSBzdW1tYXJ5IFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiByZWdlbmVyYXRlQUlTdW1tYXJ5KCkge1xuICBjb25zdCBpbnB1dCAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1bW1hcnktcmVmaW5lbWVudC1pbnB1dCcpO1xuICBjb25zdCBwcm9tcHQgID0gaW5wdXQgPyBpbnB1dC52YWx1ZS50cmltKCkgOiAnJztcbiAgY29uc3QgY3VycmVudCA9IHdpbmRvdy5fYWlHZW5lcmF0ZWRTdW1tYXJ5IHx8ICcnO1xuICBhd2FpdCBfY2FsbEdlbmVyYXRlU3VtbWFyeShwcm9tcHQgfHwgbnVsbCwgY3VycmVudCB8fCBudWxsKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdXNlQUlTdW1tYXJ5KCkge1xuICB3aW5kb3cuc2VsZWN0ZWRTdW1tYXJ5S2V5ID0gJ2FpX2dlbmVyYXRlZCc7XG4gIGNvbnN0IHRleHRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhaS1zdW1tYXJ5LXRleHQnKTtcbiAgY29uc3QgY3VycmVudFRleHQgPSB0ZXh0RWwgPyB0ZXh0RWwudmFsdWUudHJpbSgpIDogKHdpbmRvdy5fYWlHZW5lcmF0ZWRTdW1tYXJ5IHx8ICcnKTtcbiAgYXdhaXQgc2F2ZVN1bW1hcnlGb2N1c1RvQmFja2VuZCgnYWlfZ2VuZXJhdGVkJywgY3VycmVudFRleHQpO1xuICBzY2hlZHVsZUF0c1JlZnJlc2goJ3Jldmlld19jaGVja3BvaW50Jyk7XG4gIHNob3dUb2FzdCgnQUktZ2VuZXJhdGVkIHN1bW1hcnkgc2VsZWN0ZWQgZm9yIHlvdXIgQ1YnKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFNlbGVjdCBzdG9yZWQgc3VtbWFyeSBrZXkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIHNlbGVjdFN1bW1hcnlLZXkoa2V5KSB7XG4gIHdpbmRvdy5zZWxlY3RlZFN1bW1hcnlLZXkgPSBrZXk7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNzdW1tYXJ5LXJhZGlvcyBsYWJlbCcpLmZvckVhY2gobGFiZWwgPT4ge1xuICAgIGNvbnN0IHJhZGlvID0gbGFiZWwucXVlcnlTZWxlY3RvcignaW5wdXRbdHlwZT1yYWRpb10nKTtcbiAgICBjb25zdCBpc1NlbGVjdGVkID0gcmFkaW8gJiYgcmFkaW8udmFsdWUgPT09IGtleTtcbiAgICBsYWJlbC5zdHlsZS5ib3JkZXJDb2xvciA9IGlzU2VsZWN0ZWQgPyAnIzEwYjk4MScgOiAnI2U1ZTdlYic7XG4gICAgbGFiZWwuc3R5bGUuYmFja2dyb3VuZCAgPSBpc1NlbGVjdGVkID8gJyNmMGZkZjQnIDogJyc7XG4gIH0pO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgU2F2ZSAvIHN1Ym1pdCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLyoqXG4gKiBkdWNrZmxvdzpcbiAqICAgaWQ6IHN1bW1hcnlfdWlfcGVyc2lzdFxuICogICBraW5kOiB1aVxuICogICB0aW1lc3RhbXA6IFwiMjAyNi0wMy0yN1QwMToyMzoyOFpcIlxuICogICBzdGF0dXM6IHNoYXJlZFxuICogICBoYW5kbGVzOiBbXCJ1aTpzdW1tYXJ5LXJldmlldy5wZXJzaXN0XCJdXG4gKiAgIGNhbGxzOiBbXCJQT1NUIC9hcGkvcmV2aWV3LWRlY2lzaW9uc1wiXVxuICogICByZWFkczogW1wid2luZG93OnNlbGVjdGVkU3VtbWFyeUtleVwiXVxuICogICB3cml0ZXM6IFtcInJlcXVlc3Q6UE9TVCAvYXBpL3Jldmlldy1kZWNpc2lvbnMuc3VtbWFyeV9mb2N1c1wiXVxuICogICBub3RlczogXCJQZXJzaXN0cyBvbmx5IHRoZSBzZWxlY3RlZCBzdW1tYXJ5IGtleSBzbyBiYWNrZW5kIHN0YXRlIGNhbiByZXNvbHZlIHRoZSBhY3RpdmUgc3VtbWFyeSB2YXJpYW50IGxhdGVyLlwiXG4gKi9cblxuLy8gRGVib3VuY2UgdGltZXIgZm9yIGF1dG8tcGVyc2lzdGluZyBlZGl0cyB0byB0aGUgc3VtbWFyeSB0ZXh0LlxubGV0IF9zdW1tYXJ5UGVyc2lzdFRpbWVyID0gbnVsbDtcblxuZnVuY3Rpb24gb25TdW1tYXJ5VGV4dENoYW5nZSgpIHtcbiAgY29uc3QgdGV4dEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FpLXN1bW1hcnktdGV4dCcpO1xuICBpZiAoIXRleHRFbCkgcmV0dXJuO1xuICB3aW5kb3cuX2FpR2VuZXJhdGVkU3VtbWFyeSA9IHRleHRFbC52YWx1ZTtcbiAgX3VwZGF0ZVN1bW1hcnlTcGVjaWZpY2l0eUJhZGdlKHRleHRFbC52YWx1ZSk7XG4gIGNsZWFyVGltZW91dChfc3VtbWFyeVBlcnNpc3RUaW1lcik7XG4gIF9zdW1tYXJ5UGVyc2lzdFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgc2F2ZVN1bW1hcnlGb2N1c1RvQmFja2VuZCgnYWlfZ2VuZXJhdGVkJywgdGV4dEVsLnZhbHVlLnRyaW0oKSk7XG4gIH0sIDUwMCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNhdmVTdW1tYXJ5Rm9jdXNUb0JhY2tlbmQoa2V5LCB0ZXh0KSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGF5bG9hZCA9IHsgdHlwZTogJ3N1bW1hcnlfZm9jdXMnLCBkZWNpc2lvbnM6IGtleSB9O1xuICAgIGlmICh0ZXh0ICE9PSB1bmRlZmluZWQgJiYgdGV4dCAhPT0gbnVsbCkgcGF5bG9hZC5zdW1tYXJ5X3RleHQgPSB0ZXh0O1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvcmV2aWV3LWRlY2lzaW9ucycsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShwYXlsb2FkKVxuICAgIH0pO1xuICAgIHJldHVybiByZXNwb25zZS5vaztcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBzdWJtaXRTdW1tYXJ5Rm9jdXNEZWNpc2lvbigpIHtcbiAgY29uc3Qga2V5ID0gd2luZG93LnNlbGVjdGVkU3VtbWFyeUtleTtcbiAgaWYgKCFrZXkpIHJldHVybjtcbiAgY29uc3Qgc2F2ZWQgPSBhd2FpdCBzYXZlU3VtbWFyeUZvY3VzVG9CYWNrZW5kKGtleSk7XG4gIGlmICghc2F2ZWQpIHtcbiAgICBzaG93VG9hc3QoJ0ZhaWxlZCB0byBzYXZlIHN1bW1hcnkgc2VsZWN0aW9uLicsICdlcnJvcicpO1xuICAgIHJldHVybjtcbiAgfVxuICBzdGF0ZU1hbmFnZXIubWFya0NvbnRlbnRDaGFuZ2VkKCk7XG4gIHNjaGVkdWxlQXRzUmVmcmVzaCgncmV2aWV3X2NoZWNrcG9pbnQnKTtcbiAgc2hvd1RvYXN0KGBTdW1tYXJ5IHNlbGVjdGlvbiBzYXZlZDogXCIke2tleS5yZXBsYWNlKC9fL2csICcgJyl9XCJgKTtcbiAgc3dpdGNoVGFiKCdwdWJsaWNhdGlvbnMtcmV2aWV3Jyk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFeHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5leHBvcnQge1xuICBidWlsZFN1bW1hcnlGb2N1c1NlY3Rpb24sXG4gIF9yZW5kZXJTdG9yZWRTdW1tYXJ5UmFkaW9zLFxuICBfc2hvd0FJU3VtbWFyeSxcbiAgX2NhbGxHZW5lcmF0ZVN1bW1hcnksXG4gIHJlZ2VuZXJhdGVBSVN1bW1hcnksXG4gIHVzZUFJU3VtbWFyeSxcbiAgb25TdW1tYXJ5VGV4dENoYW5nZSxcbiAgc2VsZWN0U3VtbWFyeUtleSxcbiAgc2F2ZVN1bW1hcnlGb2N1c1RvQmFja2VuZCxcbiAgX2NoZWNrU3VtbWFyeVNwZWNpZmljaXR5LFxuICBfdXBkYXRlU3VtbWFyeVNwZWNpZmljaXR5QmFkZ2UsXG4gIHN1Ym1pdFN1bW1hcnlGb2N1c0RlY2lzaW9uLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL3B1YmxpY2F0aW9ucy1yZXZpZXcuanNcbiAqIFB1YmxpY2F0aW9ucyByZXZpZXcgdGFibGU6IGZldGNoLCByZW5kZXIsIHRvZ2dsZSBhY2NlcHQvcmVqZWN0LCBzdWJtaXQgZGVjaXNpb25zLlxuICpcbiAqIERlcGVuZGVuY2llcyAocmVzb2x2ZWQgdGhyb3VnaCBnbG9iYWxUaGlzIGF0IHJ1bnRpbWUpOlxuICogICBwdWJsaWNhdGlvbkRlY2lzaW9ucywgX3NhdmVkRGVjaXNpb25zLFxuICogICBlc2NhcGVIdG1sLCBzaG93VG9hc3QsIGZldGNoQW5kUmV2aWV3UmV3cml0ZXMsIENTU1xuICovXG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmNvbnN0IGxvZyA9IGdldExvZ2dlcigncHVibGljYXRpb25zLXJldmlldycpO1xuXG5pbXBvcnQgeyBzdGF0ZU1hbmFnZXIgfSBmcm9tICcuL3N0YXRlLW1hbmFnZXIuanMnO1xuaW1wb3J0IHsgZXllU2xhc2hJY29uIH0gZnJvbSAnLi9yZXZpZXctaWNvbnMuanMnO1xuXG4vLyBUcmFjayBwdWJsaWNhdGlvbiBhY2NlcHQvcmVqZWN0IGRlY2lzaW9uczogY2l0ZV9rZXkgXHUyMTkyIHRydWUgKGFjY2VwdCkgfCBmYWxzZSAocmVqZWN0KVxud2luZG93LnB1YmxpY2F0aW9uRGVjaXNpb25zID0ge307XG4vLyBPcmRlcmVkIGxpc3Qgb2YgcHVibGljYXRpb24gb2JqZWN0czsgbXV0YXRlZCBieSBtb3ZlUHViUm93KClcbndpbmRvdy5fcHVibGljYXRpb25zT3JkZXJlZCA9IFtdO1xuXG4vLyBcdTI1MDBcdTI1MDAgQnVpbGQgcHVibGljYXRpb25zIHJldmlldyB0YWJsZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gYnVpbGRQdWJsaWNhdGlvbnNSZXZpZXdUYWJsZSgpIHtcbiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1YmxpY2F0aW9ucy10YWJsZS1jb250YWluZXInKTtcbiAgLy8gSW4gdGhlIG5ldyBzdWItdGFiIGxheW91dCwgd2UgdXNlIHRoZSBwYW5lIHdyYXBwZXIgaW5zdGVhZCBvZiB0aGUgb2xkIHNlY3Rpb25cbiAgY29uc3Qgc2VjdGlvbiAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1YmxpY2F0aW9ucy1yZXZpZXctc2VjdGlvbicpIHx8XG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXZpZXctcGFuZS1wdWJsaWNhdGlvbnMnKTtcbiAgY29uc3QgcHViVGFiQnRuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnJldmlldy1zdWJ0YWJbZGF0YS1wYW5lPVwicHVibGljYXRpb25zXCJdJyk7XG4gIGlmICghY29udGFpbmVyKSByZXR1cm47XG5cbiAgY29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTJweDtwYWRkaW5nOjIwcHg7Y29sb3I6IzZiNzI4MDtcIj48ZGl2IGNsYXNzPVwibG9hZGluZy1zcGlubmVyXCIgc3R5bGU9XCJ3aWR0aDoyMHB4O2hlaWdodDoyMHB4O2JvcmRlci13aWR0aDoycHg7ZmxleC1zaHJpbms6MDtcIj48L2Rpdj48c3Bhbj5Mb2FkaW5nIHB1YmxpY2F0aW9uIHJlY29tbWVuZGF0aW9uc1xcdTIwMjY8L3NwYW4+PC9kaXY+JztcblxuICBsZXQgcmVjb21tZW5kYXRpb25zID0gW107XG4gIGxldCB0b3RhbENvdW50ID0gMDtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvcHVibGljYXRpb24tcmVjb21tZW5kYXRpb25zJyk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKCFkYXRhLm9rKSB7IGNvbnRhaW5lci5pbm5lckhUTUwgPSBgPHAgY2xhc3M9XCJlcnJvci1tZXNzYWdlXCI+JHtlc2NhcGVIdG1sKGRhdGEuZXJyb3IgfHwgJ0ZhaWxlZCB0byBsb2FkIHB1YmxpY2F0aW9ucy4nKX08L3A+YDsgcmV0dXJuOyB9XG4gICAgcmVjb21tZW5kYXRpb25zID0gZGF0YS5yZWNvbW1lbmRhdGlvbnMgfHwgW107XG4gICAgdG90YWxDb3VudCA9IGRhdGEudG90YWxfY291bnQgfHwgcmVjb21tZW5kYXRpb25zLmxlbmd0aDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLmVycm9yKCdFcnJvciBmZXRjaGluZyBwdWJsaWNhdGlvbiByZWNvbW1lbmRhdGlvbnM6JywgZXJyKTtcbiAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJzxwIHN0eWxlPVwiY29sb3I6ICNlZjQ0NDQ7IHBhZGRpbmc6IDIwcHg7XCI+RmFpbGVkIHRvIGxvYWQgcHVibGljYXRpb24gcmVjb21tZW5kYXRpb25zLjwvcD4nO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChyZWNvbW1lbmRhdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgLy8gTm8gcHVibGljYXRpb25zIFx1MjAxNCBoaWRlIHRoZSBwYW5lIGFuZCBkaXNhYmxlIHRoZSB0YWIgYnV0dG9uXG4gICAgaWYgKHNlY3Rpb24pIHNlY3Rpb24uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBpZiAocHViVGFiQnRuKSBwdWJUYWJCdG4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJzxwIHN0eWxlPVwicGFkZGluZzoyMHB4O2NvbG9yOiM2YjcyODA7XCI+Tm8gcHVibGljYXRpb25zIGZvdW5kLjwvcD4nO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFNob3cgc2VjdGlvbiBhbmQgdGFiIGJ1dHRvblxuICBpZiAocHViVGFiQnRuKSBwdWJUYWJCdG4uc3R5bGUuZGlzcGxheSA9ICcnO1xuXG4gIC8vIFVwZGF0ZSBoZWFkaW5nIGNvdW50IChoYW5kbGUgYm90aCBwYW5lIGFwcHJvYWNoIGFuZCBsZWdhY3kgc2VjdGlvbiBhcHByb2FjaClcbiAgY29uc3QgaGVhZGluZyA9IHNlY3Rpb24gPyBzZWN0aW9uLnF1ZXJ5U2VsZWN0b3IoJ2gyJykgOiBudWxsO1xuICBpZiAoaGVhZGluZykge1xuICAgIGhlYWRpbmcudGV4dENvbnRlbnQgPSBgXHVEODNEXHVEQ0M0IFNlbGVjdGVkIFB1YmxpY2F0aW9uc2A7XG4gIH1cblxuICAvLyBDb3VudCByZWNvbW1lbmRlZCB2cyB0b3RhbFxuICBjb25zdCByZWNvbW1lbmRlZENvdW50ID0gcmVjb21tZW5kYXRpb25zLmZpbHRlcihwID0+IHAuaXNfcmVjb21tZW5kZWQgIT09IGZhbHNlKS5sZW5ndGg7XG4gIGNvbnN0IGNvbnRleHROb3RlID0gYDxzdHJvbmc+JHtyZWNvbW1lbmRlZENvdW50fTwvc3Ryb25nPiBvZiA8c3Ryb25nPiR7dG90YWxDb3VudH08L3N0cm9uZz4gcHVibGljYXRpb25zIHJlY29tbWVuZGVkIGZvciB0aGlzIHJvbGUuIGAgK1xuICAgIGBSZWNvbW1lbmRlZCBwdWJsaWNhdGlvbnMgKHRvcCkgYXJlIHByZS1zZWxlY3RlZCBmb3IgaW5jbHVzaW9uOyBvdGhlcnMgKGJlbG93IHRoZSBkaXZpZGVyKSBhcmUgcHJlLWV4Y2x1ZGVkLiBBZGp1c3QgdXNpbmcgdGhlIHRvZ2dsZXMuYDtcblxuICAvLyBJbml0aWFsaXNlIGRlY2lzaW9ucyBcdTIwMTQgcmVjb21tZW5kZWQ9YWNjZXB0LCBub3QtcmVjb21tZW5kZWQ9cmVqZWN0IGJ5IGRlZmF1bHRcbiAgd2luZG93LnB1YmxpY2F0aW9uRGVjaXNpb25zID0ge307XG4gIHJlY29tbWVuZGF0aW9ucy5mb3JFYWNoKHB1YiA9PiB7XG4gICAgd2luZG93LnB1YmxpY2F0aW9uRGVjaXNpb25zW3B1Yi5jaXRlX2tleV0gPSBwdWIuaXNfcmVjb21tZW5kZWQgIT09IGZhbHNlO1xuICB9KTtcbiAgLy8gQXBwbHkgYW55IHByZXZpb3VzbHkgc2F2ZWQgdXNlciBkZWNpc2lvbnMgb3ZlciB0aGUgQVBJIGRlZmF1bHRzXG4gIGNvbnN0IHNhdmVkUHViRGVjcyA9IHdpbmRvdy5fc2F2ZWREZWNpc2lvbnM/LnB1YmxpY2F0aW9uX2RlY2lzaW9ucyB8fCB7fTtcbiAgaWYgKE9iamVjdC5rZXlzKHNhdmVkUHViRGVjcykubGVuZ3RoID4gMCkgT2JqZWN0LmFzc2lnbih3aW5kb3cucHVibGljYXRpb25EZWNpc2lvbnMsIHNhdmVkUHViRGVjcyk7XG5cbiAgLy8gU2VlZCB0aGUgb3JkZXJlZCBsaXN0IGZvciByZW9yZGVyIGNvbnRyb2xzXG4gIHdpbmRvdy5fcHVibGljYXRpb25zT3JkZXJlZCA9IFsuLi5yZWNvbW1lbmRhdGlvbnNdO1xuXG4gIGxldCB0YWJsZUhUTUwgPSBgXG4gICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO2ZvbnQtc2l6ZTowLjllbTttYXJnaW4tYm90dG9tOjEycHg7XCI+JHtjb250ZXh0Tm90ZX08L3A+XG4gICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjEycHg7ZmxleC13cmFwOndyYXA7bWFyZ2luLWJvdHRvbToxMHB4O1wiPlxuICAgICAgPGxhYmVsIHN0eWxlPVwiZm9udC1zaXplOjAuOWVtO2NvbG9yOiMzNzQxNTE7XCI+RmlsdGVyIHB1YmxpY2F0aW9uczpcbiAgICAgICAgPGlucHV0IHR5cGU9XCJzZWFyY2hcIiBpZD1cInB1Yi1maWx0ZXItaW5wdXRcIiBwbGFjZWhvbGRlcj1cIlR5cGUgdG8gZmlsdGVyXHUyMDI2XCJcbiAgICAgICAgICBzdHlsZT1cIm1hcmdpbi1sZWZ0OjhweDtwYWRkaW5nOjRweCA4cHg7Ym9yZGVyOjFweCBzb2xpZCAjZDFkNWRiO2JvcmRlci1yYWRpdXM6NHB4O2ZvbnQtc2l6ZTowLjllbTtcIlxuICAgICAgICAgIG9uaW5wdXQ9XCJmaWx0ZXJQdWJsaWNhdGlvbnNUYWJsZSh0aGlzLnZhbHVlKVwiPlxuICAgICAgPC9sYWJlbD5cbiAgICAgIDxzcGFuIHN0eWxlPVwibWFyZ2luLWxlZnQ6YXV0bztkaXNwbGF5OmZsZXg7Z2FwOjhweDthbGlnbi1pdGVtczpjZW50ZXI7XCI+XG4gICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjAuODJlbTtjb2xvcjojNmI3MjgwO1wiPkJ1bGs6PC9zcGFuPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBzZWNvbmRhcnlcIiBzdHlsZT1cImZvbnQtc2l6ZTowLjhlbTtwYWRkaW5nOjRweCAxMHB4O1wiXG4gICAgICAgICAgb25jbGljaz1cImJ1bGtQdWJBY3Rpb24oJ3JlY29tbWVuZGVkJylcIiB0aXRsZT1cIkFjY2VwdCBhbGwgcmVjb21tZW5kZWQgYW5kIHJlamVjdCB0aGUgcmVzdFwiPkFjY2VwdCBSZWNvbW1lbmRlZDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBzZWNvbmRhcnlcIiBzdHlsZT1cImZvbnQtc2l6ZTowLjhlbTtwYWRkaW5nOjRweCAxMHB4O1wiXG4gICAgICAgICAgb25jbGljaz1cImJ1bGtQdWJBY3Rpb24oJ2FjY2VwdC1hbGwnKVwiIHRpdGxlPVwiQWNjZXB0IGFsbCBwdWJsaWNhdGlvbnNcIj5BY2NlcHQgQWxsPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHNlY29uZGFyeVwiIHN0eWxlPVwiZm9udC1zaXplOjAuOGVtO3BhZGRpbmc6NHB4IDEwcHg7XCJcbiAgICAgICAgICBvbmNsaWNrPVwiYnVsa1B1YkFjdGlvbigncmVqZWN0LWFsbCcpXCIgdGl0bGU9XCJSZWplY3QgYWxsIHB1YmxpY2F0aW9uc1wiPlJlamVjdCBBbGw8L2J1dHRvbj5cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8dGFibGUgaWQ9XCJwdWJsaWNhdGlvbnMtcmV2aWV3LXRhYmxlXCIgY2xhc3M9XCJyZXZpZXctdGFibGVcIj5cbiAgICAgIDx0aGVhZD5cbiAgICAgICAgPHRyPlxuICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOjQwcHg7XCI+UmFuazwvdGg+XG4gICAgICAgICAgPHRoPkNpdGF0aW9uPC90aD5cbiAgICAgICAgICA8dGg+WWVhcjwvdGg+XG4gICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6MzZweDt0ZXh0LWFsaWduOmNlbnRlcjtcIiB0aXRsZT1cIkZpcnN0IGF1dGhvclwiPjFzdFx1MjYwNTwvdGg+XG4gICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6NTBweDtcIj5TY29yZTwvdGg+XG4gICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6ODBweDtcIj5Db25maWRlbmNlPC90aD5cbiAgICAgICAgICA8dGg+UmVhc29uaW5nPC90aD5cbiAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDo4MHB4O1wiPkluY2x1ZGU/PC90aD5cbiAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDo1NnB4O3RleHQtYWxpZ246Y2VudGVyO1wiPk9yZGVyPC90aD5cbiAgICAgICAgPC90cj5cbiAgICAgIDwvdGhlYWQ+XG4gICAgICA8dGJvZHk+XG4gIGA7XG5cbiAgbGV0IGRpdmlkZXJJbnNlcnRlZCA9IGZhbHNlO1xuICByZWNvbW1lbmRhdGlvbnMuZm9yRWFjaCgocHViLCBpZHgpID0+IHtcbiAgICAvLyBJbnNlcnQgYSBzZWN0aW9uIGRpdmlkZXIgYmVmb3JlIHRoZSBmaXJzdCBub24tcmVjb21tZW5kZWQgcHVibGljYXRpb25cbiAgICBpZiAoIWRpdmlkZXJJbnNlcnRlZCAmJiBwdWIuaXNfcmVjb21tZW5kZWQgPT09IGZhbHNlKSB7XG4gICAgICBkaXZpZGVySW5zZXJ0ZWQgPSB0cnVlO1xuICAgICAgY29uc3QgZGl2aWRlclN0eWxlID0gJ2JhY2tncm91bmQ6I2YzZjRmNjtib3JkZXItdG9wOjJweCBzb2xpZCAjZDFkNWRiO3BhZGRpbmc6MDsnO1xuICAgICAgdGFibGVIVE1MICs9IGBcbiAgICAgICAgPHRyIGNsYXNzPVwicHViLWRpdmlkZXItcm93XCI+XG4gICAgICAgICAgPHRkIHN0eWxlPVwiJHtkaXZpZGVyU3R5bGV9XCI+PC90ZD5cbiAgICAgICAgICA8dGQgc3R5bGU9XCIke2RpdmlkZXJTdHlsZX1jb2xvcjojNmI3MjgwO2ZvbnQtc2l6ZTowLjgyZW07Zm9udC1zdHlsZTppdGFsaWM7cGFkZGluZzo2cHggMTJweDt0ZXh0LWFsaWduOmNlbnRlcjtcIj5cbiAgICAgICAgICAgIFx1MjAxNCBQdWJsaWNhdGlvbnMgYmVsb3cgd2VyZSBub3QgcmVjb21tZW5kZWQgZm9yIHRoaXMgcm9sZSAocHJlLWV4Y2x1ZGVkKSBcdTIwMTRcbiAgICAgICAgICA8L3RkPlxuICAgICAgICAgIDx0ZCBzdHlsZT1cIiR7ZGl2aWRlclN0eWxlfVwiPjwvdGQ+XG4gICAgICAgICAgPHRkIHN0eWxlPVwiJHtkaXZpZGVyU3R5bGV9XCI+PC90ZD5cbiAgICAgICAgICA8dGQgc3R5bGU9XCIke2RpdmlkZXJTdHlsZX1cIj48L3RkPlxuICAgICAgICAgIDx0ZCBzdHlsZT1cIiR7ZGl2aWRlclN0eWxlfVwiPjwvdGQ+XG4gICAgICAgICAgPHRkIHN0eWxlPVwiJHtkaXZpZGVyU3R5bGV9XCI+PC90ZD5cbiAgICAgICAgICA8dGQgc3R5bGU9XCIke2RpdmlkZXJTdHlsZX1cIj48L3RkPlxuICAgICAgICAgIDx0ZCBzdHlsZT1cIiR7ZGl2aWRlclN0eWxlfVwiPjwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgICBgO1xuICAgIH1cblxuICAgIGNvbnN0IHJhbmsgICAgICAgPSBpZHggKyAxO1xuICAgIGNvbnN0IGNpdGF0aW9uICAgPSBwdWIuZm9ybWF0dGVkX2NpdGF0aW9uIHx8IFtwdWIudGl0bGUsIHB1Yi52ZW51ZSwgcHViLnllYXJdLmZpbHRlcihCb29sZWFuKS5qb2luKCcuICcpO1xuICAgIGNvbnN0IHllYXIgICAgICAgPSBwdWIueWVhciB8fCAnXHUyMDE0JztcbiAgICBjb25zdCBmaXJzdEF1dGggID0gcHViLmlzX2ZpcnN0X2F1dGhvciA/ICc8c3BhbiBzdHlsZT1cImNvbG9yOiMxMGI5ODE7Zm9udC13ZWlnaHQ6NzAwO1wiIHRpdGxlPVwiRmlyc3QgYXV0aG9yXCI+XHUyNjA1PC9zcGFuPicgOiAnPHNwYW4gc3R5bGU9XCJjb2xvcjojZDFkNWRiO1wiPlx1MjYwNjwvc3Bhbj4nO1xuICAgIGNvbnN0IHNjb3JlICAgICAgPSBwdWIucmVsZXZhbmNlX3Njb3JlID8gcHViLnJlbGV2YW5jZV9zY29yZSA6ICdcdTIwMTQnO1xuICAgIGNvbnN0IGNvbmZpZGVuY2UgPSBwdWIuY29uZmlkZW5jZSB8fCAnJztcbiAgICBjb25zdCBjb25mQ29sb3IgID0gY29uZmlkZW5jZSA9PT0gJ0hpZ2gnID8gJyMxMGI5ODEnIDogY29uZmlkZW5jZSA9PT0gJ0xvdycgPyAnI2VmNDQ0NCcgOiAnI2Y1OWUwYic7XG4gICAgY29uc3QgY29uZkJhZGdlICA9IGNvbmZpZGVuY2UgPyBgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MTFweDtjb2xvcjoke2NvbmZDb2xvcn07Zm9udC13ZWlnaHQ6NjAwO1wiPiR7ZXNjYXBlSHRtbChjb25maWRlbmNlKX08L3NwYW4+YCA6ICcnO1xuICAgIGNvbnN0IHJlYXNvbmluZyAgPSBwdWIucmF0aW9uYWxlID8gYDxzbWFsbD4ke2VzY2FwZUh0bWwocHViLnJhdGlvbmFsZSl9PC9zbWFsbD5gIDogJyc7XG4gICAgY29uc3QgdmVudWVXYXJuICA9IHB1Yi52ZW51ZV93YXJuaW5nID8gYCA8c3BhbiB0aXRsZT1cIiR7ZXNjYXBlSHRtbChwdWIudmVudWVfd2FybmluZyl9XCIgc3R5bGU9XCJjb2xvcjojZGM3OTAwO2N1cnNvcjpoZWxwO1wiPlx1MjZBMDwvc3Bhbj5gIDogJyc7XG4gICAgY29uc3QgY2l0ZUtleSAgICA9IHB1Yi5jaXRlX2tleSB8fCAnJztcbiAgICBjb25zdCBpc0FjY2VwdGVkID0gd2luZG93LnB1YmxpY2F0aW9uRGVjaXNpb25zW2NpdGVLZXldICE9PSBmYWxzZTtcbiAgICBjb25zdCByb3dTdHlsZSAgID0gcHViLmlzX3JlY29tbWVuZGVkID09PSBmYWxzZSA/ICdvcGFjaXR5OjAuNzsnIDogJyc7XG5cbiAgICBjb25zdCBpc0ZpcnN0ID0gaWR4ID09PSAwO1xuICAgIGNvbnN0IGlzTGFzdCAgPSBpZHggPT09IHJlY29tbWVuZGF0aW9ucy5sZW5ndGggLSAxO1xuICAgIHRhYmxlSFRNTCArPSBgXG4gICAgICA8dHIgZGF0YS1jaXRlLWtleT1cIiR7ZXNjYXBlSHRtbChjaXRlS2V5KX1cIiBzdHlsZT1cIiR7cm93U3R5bGV9XCI+XG4gICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO2ZvbnQtd2VpZ2h0OjcwMDtcIj4ke3Jhbmt9PC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwiZm9udC1zaXplOjAuODdlbTtcIj4ke2VzY2FwZUh0bWwoY2l0YXRpb24pfSR7dmVudWVXYXJufTwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO1wiPiR7eWVhcn08L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjtcIj4ke2ZpcnN0QXV0aH08L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjtcIj4ke3Njb3JlICE9PSAnXHUyMDE0JyA/IGA8c3Ryb25nPiR7c2NvcmV9PC9zdHJvbmc+LzEwYCA6ICdcdTIwMTQnfTwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO1wiPiR7Y29uZkJhZGdlfTwvdGQ+XG4gICAgICAgIDx0ZD4ke3JlYXNvbmluZ308L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJhY3Rpb24tYnRuc1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuJHtpc0FjY2VwdGVkID8gJyBhY3RpdmUnIDogJyd9XCIgZGF0YS1hY3Rpb249XCJhY2NlcHRcIiBhcmlhLWxhYmVsPVwiSW5jbHVkZSBwdWJsaWNhdGlvbiAke2VzY2FwZUh0bWwoY2l0ZUtleSl9XCIgdGl0bGU9XCJJbmNsdWRlIGluIENWXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJjb2xvcjojMTBiOTgxO1wiIGlkPVwicHViLWFjY2VwdC0ke3Jhbmt9XCI+XHUyNzEzPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG4keyFpc0FjY2VwdGVkID8gJyBhY3RpdmUnIDogJyd9XCIgZGF0YS1hY3Rpb249XCJyZWplY3RcIiBhcmlhLWxhYmVsPVwiRXhjbHVkZSBwdWJsaWNhdGlvbiAke2VzY2FwZUh0bWwoY2l0ZUtleSl9XCIgdGl0bGU9XCJFeGNsdWRlIGZyb20gQ1ZcIlxuICAgICAgICAgICAgICBzdHlsZT1cImNvbG9yOiNlZjQ0NDQ7XCIgaWQ9XCJwdWItcmVqZWN0LSR7cmFua31cIj4ke2V5ZVNsYXNoSWNvbigpfTwvYnV0dG9uPlxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjt3aGl0ZS1zcGFjZTpub3dyYXA7XCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgZGF0YS1hY3Rpb249XCJwdWItdXBcIiBkYXRhLWNpdGUta2V5PVwiJHtlc2NhcGVIdG1sKGNpdGVLZXkpfVwiXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiTW92ZSBwdWJsaWNhdGlvbiB1cFwiIHRpdGxlPVwiTW92ZSB1cFwiICR7aXNGaXJzdCA/ICdkaXNhYmxlZCBzdHlsZT1cIm9wYWNpdHk6MC4zO1wiJyA6ICcnfT5cdTIxOTE8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBkYXRhLWFjdGlvbj1cInB1Yi1kb3duXCIgZGF0YS1jaXRlLWtleT1cIiR7ZXNjYXBlSHRtbChjaXRlS2V5KX1cIlxuICAgICAgICAgICAgYXJpYS1sYWJlbD1cIk1vdmUgcHVibGljYXRpb24gZG93blwiIHRpdGxlPVwiTW92ZSBkb3duXCIgJHtpc0xhc3QgPyAnZGlzYWJsZWQgc3R5bGU9XCJvcGFjaXR5OjAuMztcIicgOiAnJ30+XHUyMTkzPC9idXR0b24+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L3RyPlxuICAgIGA7XG4gIH0pO1xuXG4gIHRhYmxlSFRNTCArPSAnPC90Ym9keT48L3RhYmxlPic7XG4gIGNvbnRhaW5lci5pbm5lckhUTUwgPSB0YWJsZUhUTUw7XG4gIC8vIERlbGVnYXRlZCBjbGljayBoYW5kbGVyIGZvciBwdWJsaWNhdGlvbiBhY3Rpb24gYnV0dG9ucyAoZGF0YS1jaXRlLWtleSBvbiA8dHI+IGF2b2lkcyBvbmNsaWNrIGluamVjdGlvbilcbiAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJyNwdWJsaWNhdGlvbnMtcmV2aWV3LXRhYmxlIHRib2R5Jyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZSA9PiB7XG4gICAgY29uc3QgYnRuID0gZS50YXJnZXQuY2xvc2VzdCgnLmljb24tYnRuJyk7XG4gICAgaWYgKCFidG4gfHwgYnRuLmRpc2FibGVkKSByZXR1cm47XG4gICAgY29uc3QgdHIgPSBidG4uY2xvc2VzdCgndHJbZGF0YS1jaXRlLWtleV0nKTtcbiAgICBpZiAoIXRyKSByZXR1cm47XG4gICAgY29uc3QgYWN0aW9uID0gYnRuLmRhdGFzZXQuYWN0aW9uO1xuICAgIGlmICAgICAgKGFjdGlvbiA9PT0gJ2FjY2VwdCcpICAgaGFuZGxlUHViQWN0aW9uKHRyLmRhdGFzZXQuY2l0ZUtleSwgdHJ1ZSk7XG4gICAgZWxzZSBpZiAoYWN0aW9uID09PSAncmVqZWN0JykgICBoYW5kbGVQdWJBY3Rpb24odHIuZGF0YXNldC5jaXRlS2V5LCBmYWxzZSk7XG4gICAgZWxzZSBpZiAoYWN0aW9uID09PSAncHViLXVwJykgICBtb3ZlUHViUm93KGJ0bi5kYXRhc2V0LmNpdGVLZXksIC0xKTtcbiAgICBlbHNlIGlmIChhY3Rpb24gPT09ICdwdWItZG93bicpIG1vdmVQdWJSb3coYnRuLmRhdGFzZXQuY2l0ZUtleSwgKzEpO1xuICB9KTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEZpbHRlciB0YWJsZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gZmlsdGVyUHVibGljYXRpb25zVGFibGUocXVlcnkpIHtcbiAgY29uc3QgcSA9IHF1ZXJ5LnRvTG93ZXJDYXNlKCk7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNwdWJsaWNhdGlvbnMtcmV2aWV3LXRhYmxlIHRib2R5IHRyOm5vdCgucHViLWRpdmlkZXItcm93KScpLmZvckVhY2gocm93ID0+IHtcbiAgICByb3cuc3R5bGUuZGlzcGxheSA9IHEgPT09ICcnIHx8IHJvdy50ZXh0Q29udGVudC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpID8gJycgOiAnbm9uZSc7XG4gIH0pO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgUmVvcmRlciByb3dzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBtb3ZlUHViUm93KGNpdGVLZXksIGRpcmVjdGlvbikge1xuICBjb25zdCBhcnIgPSB3aW5kb3cuX3B1YmxpY2F0aW9uc09yZGVyZWQ7XG4gIGlmICghYXJyIHx8ICFhcnIubGVuZ3RoKSByZXR1cm47XG4gIGNvbnN0IGlkeCA9IGFyci5maW5kSW5kZXgocCA9PiBwLmNpdGVfa2V5ID09PSBjaXRlS2V5KTtcbiAgaWYgKGlkeCA8IDApIHJldHVybjtcbiAgY29uc3QgbmV3SWR4ID0gaWR4ICsgZGlyZWN0aW9uO1xuICBpZiAobmV3SWR4IDwgMCB8fCBuZXdJZHggPj0gYXJyLmxlbmd0aCkgcmV0dXJuO1xuICBbYXJyW2lkeF0sIGFycltuZXdJZHhdXSA9IFthcnJbbmV3SWR4XSwgYXJyW2lkeF1dO1xuICBfcmVidWlsZFB1YlRhYmxlQm9keShhcnIpO1xuICAvLyBQZXJzaXN0IG9yZGVyIHRvIGJhY2tlbmQgKGZpcmUtYW5kLWZvcmdldClcbiAgZmV0Y2goJy9hcGkvcmVvcmRlci1yb3dzJywge1xuICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgdHlwZTogJ3B1YmxpY2F0aW9uJywgb3JkZXJlZF9pZHM6IGFyci5tYXAocCA9PiBwLmNpdGVfa2V5KSB9KSxcbiAgfSkuY2F0Y2goKCkgPT4ge30pO1xufVxuXG5mdW5jdGlvbiBfcmVidWlsZFB1YlRhYmxlQm9keShyZWNvbW1lbmRhdGlvbnMpIHtcbiAgY29uc3QgdGJvZHkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcHVibGljYXRpb25zLXJldmlldy10YWJsZSB0Ym9keScpO1xuICBpZiAoIXRib2R5KSByZXR1cm47XG4gIGxldCBodG1sID0gJyc7XG4gIGxldCBkaXZpZGVySW5zZXJ0ZWQgPSBmYWxzZTtcbiAgcmVjb21tZW5kYXRpb25zLmZvckVhY2goKHB1YiwgaWR4KSA9PiB7XG4gICAgaWYgKCFkaXZpZGVySW5zZXJ0ZWQgJiYgcHViLmlzX3JlY29tbWVuZGVkID09PSBmYWxzZSkge1xuICAgICAgZGl2aWRlckluc2VydGVkID0gdHJ1ZTtcbiAgICAgIGNvbnN0IGRzID0gJ2JhY2tncm91bmQ6I2YzZjRmNjtib3JkZXItdG9wOjJweCBzb2xpZCAjZDFkNWRiO3BhZGRpbmc6MDsnO1xuICAgICAgaHRtbCArPSBgPHRyIGNsYXNzPVwicHViLWRpdmlkZXItcm93XCI+PHRkIHN0eWxlPVwiJHtkc31cIj48L3RkPjx0ZCBzdHlsZT1cIiR7ZHN9Y29sb3I6IzZiNzI4MDtmb250LXNpemU6MC44MmVtO2ZvbnQtc3R5bGU6aXRhbGljO3BhZGRpbmc6NnB4IDEycHg7dGV4dC1hbGlnbjpjZW50ZXI7XCI+XHUyMDE0IFB1YmxpY2F0aW9ucyBiZWxvdyB3ZXJlIG5vdCByZWNvbW1lbmRlZCBmb3IgdGhpcyByb2xlIChwcmUtZXhjbHVkZWQpIFx1MjAxNDwvdGQ+PHRkIHN0eWxlPVwiJHtkc31cIj48L3RkPjx0ZCBzdHlsZT1cIiR7ZHN9XCI+PC90ZD48dGQgc3R5bGU9XCIke2RzfVwiPjwvdGQ+PHRkIHN0eWxlPVwiJHtkc31cIj48L3RkPjx0ZCBzdHlsZT1cIiR7ZHN9XCI+PC90ZD48dGQgc3R5bGU9XCIke2RzfVwiPjwvdGQ+PHRkIHN0eWxlPVwiJHtkc31cIj48L3RkPjwvdHI+YDtcbiAgICB9XG4gICAgY29uc3QgcmFuayAgICAgICA9IGlkeCArIDE7XG4gICAgY29uc3QgY2l0ZUtleSAgICA9IHB1Yi5jaXRlX2tleSB8fCAnJztcbiAgICBjb25zdCBjaXRhdGlvbiAgID0gcHViLmZvcm1hdHRlZF9jaXRhdGlvbiB8fCBbcHViLnRpdGxlLCBwdWIudmVudWUsIHB1Yi55ZWFyXS5maWx0ZXIoQm9vbGVhbikuam9pbignLiAnKTtcbiAgICBjb25zdCB5ZWFyICAgICAgID0gcHViLnllYXIgfHwgJ1x1MjAxNCc7XG4gICAgY29uc3QgZmlyc3RBdXRoICA9IHB1Yi5pc19maXJzdF9hdXRob3IgPyAnPHNwYW4gc3R5bGU9XCJjb2xvcjojMTBiOTgxO2ZvbnQtd2VpZ2h0OjcwMDtcIiB0aXRsZT1cIkZpcnN0IGF1dGhvclwiPlx1MjYwNTwvc3Bhbj4nIDogJzxzcGFuIHN0eWxlPVwiY29sb3I6I2QxZDVkYjtcIj5cdTI2MDY8L3NwYW4+JztcbiAgICBjb25zdCBzY29yZSAgICAgID0gcHViLnJlbGV2YW5jZV9zY29yZSA/IHB1Yi5yZWxldmFuY2Vfc2NvcmUgOiAnXHUyMDE0JztcbiAgICBjb25zdCBjb25maWRlbmNlID0gcHViLmNvbmZpZGVuY2UgfHwgJyc7XG4gICAgY29uc3QgY29uZkNvbG9yICA9IGNvbmZpZGVuY2UgPT09ICdIaWdoJyA/ICcjMTBiOTgxJyA6IGNvbmZpZGVuY2UgPT09ICdMb3cnID8gJyNlZjQ0NDQnIDogJyNmNTllMGInO1xuICAgIGNvbnN0IGNvbmZCYWRnZSAgPSBjb25maWRlbmNlID8gYDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjExcHg7Y29sb3I6JHtjb25mQ29sb3J9O2ZvbnQtd2VpZ2h0OjYwMDtcIj4ke2VzY2FwZUh0bWwoY29uZmlkZW5jZSl9PC9zcGFuPmAgOiAnJztcbiAgICBjb25zdCByZWFzb25pbmcgID0gcHViLnJhdGlvbmFsZSA/IGA8c21hbGw+JHtlc2NhcGVIdG1sKHB1Yi5yYXRpb25hbGUpfTwvc21hbGw+YCA6ICcnO1xuICAgIGNvbnN0IHZlbnVlV2FybiAgPSBwdWIudmVudWVfd2FybmluZyA/IGAgPHNwYW4gdGl0bGU9XCIke2VzY2FwZUh0bWwocHViLnZlbnVlX3dhcm5pbmcpfVwiIHN0eWxlPVwiY29sb3I6I2RjNzkwMDtjdXJzb3I6aGVscDtcIj5cdTI2QTA8L3NwYW4+YCA6ICcnO1xuICAgIGNvbnN0IGlzQWNjZXB0ZWQgPSB3aW5kb3cucHVibGljYXRpb25EZWNpc2lvbnNbY2l0ZUtleV0gIT09IGZhbHNlO1xuICAgIGNvbnN0IHJvd1N0eWxlICAgPSBwdWIuaXNfcmVjb21tZW5kZWQgPT09IGZhbHNlID8gJ29wYWNpdHk6MC43OycgOiAnJztcbiAgICBjb25zdCBpc0ZpcnN0ICAgID0gaWR4ID09PSAwO1xuICAgIGNvbnN0IGlzTGFzdCAgICAgPSBpZHggPT09IHJlY29tbWVuZGF0aW9ucy5sZW5ndGggLSAxO1xuICAgIGh0bWwgKz0gYDx0ciBkYXRhLWNpdGUta2V5PVwiJHtlc2NhcGVIdG1sKGNpdGVLZXkpfVwiIHN0eWxlPVwiJHtyb3dTdHlsZX1cIj5cbiAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO2ZvbnQtd2VpZ2h0OjcwMDtcIj4ke3Jhbmt9PC90ZD5cbiAgICAgIDx0ZCBzdHlsZT1cImZvbnQtc2l6ZTowLjg3ZW07XCI+JHtlc2NhcGVIdG1sKGNpdGF0aW9uKX0ke3ZlbnVlV2Fybn08L3RkPlxuICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7XCI+JHt5ZWFyfTwvdGQ+XG4gICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjtcIj4ke2ZpcnN0QXV0aH08L3RkPlxuICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7XCI+JHtzY29yZSAhPT0gJ1x1MjAxNCcgPyBgPHN0cm9uZz4ke3Njb3JlfTwvc3Ryb25nPi8xMGAgOiAnXHUyMDE0J308L3RkPlxuICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7XCI+JHtjb25mQmFkZ2V9PC90ZD5cbiAgICAgIDx0ZD4ke3JlYXNvbmluZ308L3RkPlxuICAgICAgPHRkIGNsYXNzPVwiYWN0aW9uLWJ0bnNcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuJHtpc0FjY2VwdGVkID8gJyBhY3RpdmUnIDogJyd9XCIgZGF0YS1hY3Rpb249XCJhY2NlcHRcIiBhcmlhLWxhYmVsPVwiSW5jbHVkZSBwdWJsaWNhdGlvbiAke2VzY2FwZUh0bWwoY2l0ZUtleSl9XCIgdGl0bGU9XCJJbmNsdWRlIGluIENWXCIgc3R5bGU9XCJjb2xvcjojMTBiOTgxO1wiIGlkPVwicHViLWFjY2VwdC0ke3Jhbmt9XCI+XHUyNzEzPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0biR7IWlzQWNjZXB0ZWQgPyAnIGFjdGl2ZScgOiAnJ31cIiBkYXRhLWFjdGlvbj1cInJlamVjdFwiIGFyaWEtbGFiZWw9XCJFeGNsdWRlIHB1YmxpY2F0aW9uICR7ZXNjYXBlSHRtbChjaXRlS2V5KX1cIiB0aXRsZT1cIkV4Y2x1ZGUgZnJvbSBDVlwiIHN0eWxlPVwiY29sb3I6I2VmNDQ0NDtcIiBpZD1cInB1Yi1yZWplY3QtJHtyYW5rfVwiPiR7ZXllU2xhc2hJY29uKCl9PC9idXR0b24+XG4gICAgICA8L3RkPlxuICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7d2hpdGUtc3BhY2U6bm93cmFwO1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBkYXRhLWFjdGlvbj1cInB1Yi11cFwiIGRhdGEtY2l0ZS1rZXk9XCIke2VzY2FwZUh0bWwoY2l0ZUtleSl9XCIgYXJpYS1sYWJlbD1cIk1vdmUgcHVibGljYXRpb24gdXBcIiB0aXRsZT1cIk1vdmUgdXBcIiAke2lzRmlyc3QgPyAnZGlzYWJsZWQgc3R5bGU9XCJvcGFjaXR5OjAuMztcIicgOiAnJ30+XHUyMTkxPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIGRhdGEtYWN0aW9uPVwicHViLWRvd25cIiBkYXRhLWNpdGUta2V5PVwiJHtlc2NhcGVIdG1sKGNpdGVLZXkpfVwiIGFyaWEtbGFiZWw9XCJNb3ZlIHB1YmxpY2F0aW9uIGRvd25cIiB0aXRsZT1cIk1vdmUgZG93blwiICR7aXNMYXN0ID8gJ2Rpc2FibGVkIHN0eWxlPVwib3BhY2l0eTowLjM7XCInIDogJyd9Plx1MjE5MzwvYnV0dG9uPlxuICAgICAgPC90ZD5cbiAgICA8L3RyPmA7XG4gIH0pO1xuICB0Ym9keS5pbm5lckhUTUwgPSBodG1sO1xuICAvLyBSZS1hcHBseSBhbnkgYWN0aXZlIGZpbHRlclxuICBjb25zdCBmaWx0ZXJWYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLWZpbHRlci1pbnB1dCcpPy52YWx1ZSB8fCAnJztcbiAgaWYgKGZpbHRlclZhbCkgZmlsdGVyUHVibGljYXRpb25zVGFibGUoZmlsdGVyVmFsKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFRvZ2dsZSBhY2NlcHQgLyByZWplY3QgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIGhhbmRsZVB1YkFjdGlvbihjaXRlS2V5LCBhY2NlcHQpIHtcbiAgd2luZG93LnB1YmxpY2F0aW9uRGVjaXNpb25zW2NpdGVLZXldID0gYWNjZXB0O1xuICAvLyB1cGRhdGUgYnV0dG9uIGFjdGl2ZSBzdGF0ZXMgaW4gdGhlIHJvd1xuICBjb25zdCByb3cgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGB0cltkYXRhLWNpdGUta2V5PVwiJHtDU1MuZXNjYXBlKGNpdGVLZXkpfVwiXWApO1xuICBpZiAoIXJvdykgcmV0dXJuO1xuICByb3cucXVlcnlTZWxlY3RvckFsbCgnLmljb24tYnRuJykuZm9yRWFjaChidG4gPT4gYnRuLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpKTtcbiAgY29uc3QgYWN0aW9uID0gYWNjZXB0ID8gJ2FjY2VwdCcgOiAncmVqZWN0JztcbiAgY29uc3QgYnRuID0gcm93LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWFjdGlvbj1cIiR7YWN0aW9ufVwiXWApO1xuICBpZiAoYnRuKSBidG4uY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBCdWxrIGFjdGlvbnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIGJ1bGtQdWJBY3Rpb24obW9kZSkge1xuICBjb25zdCBwdWJzID0gd2luZG93Ll9wdWJsaWNhdGlvbnNPcmRlcmVkIHx8IFtdO1xuICBpZiAoIXB1YnMubGVuZ3RoKSByZXR1cm47XG5cbiAgcHVicy5mb3JFYWNoKHB1YiA9PiB7XG4gICAgY29uc3QgY2l0ZUtleSA9IHB1Yi5jaXRlX2tleTtcbiAgICBsZXQgYWNjZXB0O1xuICAgIGlmIChtb2RlID09PSAncmVjb21tZW5kZWQnKSB7XG4gICAgICBhY2NlcHQgPSBwdWIuaXNfcmVjb21tZW5kZWQgIT09IGZhbHNlO1xuICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gJ2FjY2VwdC1hbGwnKSB7XG4gICAgICBhY2NlcHQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBhY2NlcHQgPSBmYWxzZTtcbiAgICB9XG4gICAgd2luZG93LnB1YmxpY2F0aW9uRGVjaXNpb25zW2NpdGVLZXldID0gYWNjZXB0O1xuICAgIC8vIFVwZGF0ZSBidXR0b24gc3RhdGVzIGluIHRoZSBET01cbiAgICBjb25zdCByb3cgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGB0cltkYXRhLWNpdGUta2V5PVwiJHtDU1MuZXNjYXBlKGNpdGVLZXkpfVwiXWApO1xuICAgIGlmICghcm93KSByZXR1cm47XG4gICAgcm93LnF1ZXJ5U2VsZWN0b3JBbGwoJy5pY29uLWJ0bltkYXRhLWFjdGlvbj1cImFjY2VwdFwiXSxbZGF0YS1hY3Rpb249XCJyZWplY3RcIl0nKS5mb3JFYWNoKGJ0biA9PiBidG4uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJykpO1xuICAgIGNvbnN0IHRhcmdldCA9IHJvdy5xdWVyeVNlbGVjdG9yKGBbZGF0YS1hY3Rpb249XCIke2FjY2VwdCA/ICdhY2NlcHQnIDogJ3JlamVjdCd9XCJdYCk7XG4gICAgaWYgKHRhcmdldCkgdGFyZ2V0LmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICB9KTtcblxuICBjb25zdCBhY2NlcHRlZCA9IE9iamVjdC52YWx1ZXMod2luZG93LnB1YmxpY2F0aW9uRGVjaXNpb25zKS5maWx0ZXIoQm9vbGVhbikubGVuZ3RoO1xuICBzaG93VG9hc3QoYEJ1bGsgYWN0aW9uIGFwcGxpZWQ6ICR7YWNjZXB0ZWR9IGFjY2VwdGVkLCAke3B1YnMubGVuZ3RoIC0gYWNjZXB0ZWR9IGV4Y2x1ZGVkYCk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBTdWJtaXQgZGVjaXNpb25zIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBzdWJtaXRQdWJsaWNhdGlvbkRlY2lzaW9ucygpIHtcbiAgLyogZHVja2Zsb3c6XG4gICAqICAgaWQ6IHB1YmxpY2F0aW9uc191aV9zdWJtaXRfbGl2ZVxuICAgKiAgIGtpbmQ6IHVpXG4gICAqICAgdGltZXN0YW1wOiAnMjAyNi0wMy0yNVQyMTozOTo0OFonXG4gICAqICAgc3RhdHVzOiBsaXZlXG4gICAqICAgaGFuZGxlczpcbiAgICogICAtIHVpOnB1YmxpY2F0aW9ucy1yZXZpZXcuc3VibWl0XG4gICAqICAgY2FsbHM6XG4gICAqICAgLSBQT1NUIC9hcGkvcmV2aWV3LWRlY2lzaW9uc1xuICAgKiAgIC0gR0VUIC9hcGkvcmV3cml0ZXNcbiAgICogICByZWFkczpcbiAgICogICAtIHdpbmRvdzpwdWJsaWNhdGlvbkRlY2lzaW9uc1xuICAgKiAgIHdyaXRlczpcbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL3Jldmlldy1kZWNpc2lvbnMuZGVjaXNpb25zXG4gICAqICAgbm90ZXM6IFBlcnNpc3RzIHB1YmxpY2F0aW9uIGluY2x1ZGUvZXhjbHVkZSBkZWNpc2lvbnMgYmVmb3JlIHRoZSByZXdyaXRlIHN0YWdlIGRlcml2ZXMgZG93bnN0cmVhbSBjb250ZW50IHByb3Bvc2FscyBmcm9tIHRoZSBhY2NlcHRlZCBwdWJsaWNhdGlvbiBzZXQuXG4gICAqL1xuICBjb25zdCBkZWNpc2lvbnMgPSB3aW5kb3cucHVibGljYXRpb25EZWNpc2lvbnMgfHwge307XG4gIGNvbnN0IGNvdW50ID0gT2JqZWN0LmtleXMoZGVjaXNpb25zKS5sZW5ndGg7XG4gIGlmIChjb3VudCA9PT0gMCkge1xuICAgIHNob3dUb2FzdCgnTm8gcHVibGljYXRpb24gZGVjaXNpb25zIHRvIHNhdmUuJywgJ2Vycm9yJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gUGVyc2lzdCBhcyBhIHN0cnVjdHVyZWQgYW5zd2VyIGluIHNlc3Npb24gc3RhdGVcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3Jldmlldy1kZWNpc2lvbnMnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyB0eXBlOiAncHVibGljYXRpb25zJywgZGVjaXNpb25zOiB3aW5kb3cucHVibGljYXRpb25EZWNpc2lvbnMgfSlcbiAgICB9KTtcblxuICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgc3RhdGVNYW5hZ2VyLm1hcmtDb250ZW50Q2hhbmdlZCgpO1xuICAgICAgY29uc3QgYWNjZXB0ZWQgPSBPYmplY3QudmFsdWVzKHdpbmRvdy5wdWJsaWNhdGlvbkRlY2lzaW9ucykuZmlsdGVyKEJvb2xlYW4pLmxlbmd0aDtcbiAgICAgIGNvbnN0IHJlamVjdGVkID0gY291bnQgLSBhY2NlcHRlZDtcbiAgICAgIHNob3dUb2FzdChgUHVibGljYXRpb24gc2VsZWN0aW9ucyBzYXZlZDogJHthY2NlcHRlZH0ga2VwdCwgJHtyZWplY3RlZH0gZXhjbHVkZWRgKTtcbiAgICAgIGF3YWl0IGZldGNoQW5kUmV2aWV3UmV3cml0ZXMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZXJyID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgc2hvd1RvYXN0KGBFcnJvcjogJHtlcnIuZXJyb3IgfHwgJ0ZhaWxlZCB0byBzYXZlIHB1YmxpY2F0aW9uIHNlbGVjdGlvbnMnfWAsICdlcnJvcicpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLmVycm9yKCdFcnJvciBzYXZpbmcgcHVibGljYXRpb24gZGVjaXNpb25zOicsIGVycik7XG4gICAgc2hvd1RvYXN0KCdGYWlsZWQgdG8gc2F2ZSBwdWJsaWNhdGlvbiBzZWxlY3Rpb25zLiBQbGVhc2UgdHJ5IGFnYWluLicsICdlcnJvcicpO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFeHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5leHBvcnQge1xuICBidWlsZFB1YmxpY2F0aW9uc1Jldmlld1RhYmxlLFxuICBidWxrUHViQWN0aW9uLFxuICBmaWx0ZXJQdWJsaWNhdGlvbnNUYWJsZSxcbiAgaGFuZGxlUHViQWN0aW9uLFxuICBzdWJtaXRQdWJsaWNhdGlvbkRlY2lzaW9ucyxcbn07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9yZXdyaXRlLXJldmlldy5qc1xuICogUmV3cml0ZSByZXZpZXcgcGFuZWw6IGZldGNoIHJld3JpdGVzLCByZW5kZXIgY2FyZHMgd2l0aCB3b3JkLWRpZmYsXG4gKiBhY2NlcHQvZWRpdC9yZWplY3QgZGVjaXNpb25zLCBzdWJtaXQuXG4gKlxuICogRGVwZW5kZW5jaWVzIChyZXNvbHZlZCB0aHJvdWdoIGdsb2JhbFRoaXMgYXQgcnVudGltZSk6XG4gKiAgIGFwcGVuZExvYWRpbmdNZXNzYWdlLCByZW1vdmVMb2FkaW5nTWVzc2FnZSwgYXBwZW5kUmV0cnlNZXNzYWdlLCBhcHBlbmRNZXNzYWdlLFxuICogICBzZXRMb2FkaW5nLCBzZW5kQWN0aW9uLCBzd2l0Y2hUYWIsIHNjaGVkdWxlQXRzUmVmcmVzaCxcbiAqICAgZXNjYXBlSHRtbCwgcGFyc2VSZXdyaXRlc1Jlc3BvbnNlLCBQSEFTRVNcbiAqL1xuXG5pbXBvcnQgeyBzdGF0ZU1hbmFnZXIgfSBmcm9tICcuL3N0YXRlLW1hbmFnZXIuanMnO1xuXG4vLyBNb2R1bGUtbGV2ZWwgc3RhdGVcbmxldCByZXdyaXRlRGVjaXNpb25zID0ge307XG5sZXQgX3Jld3JpdGVQYW5lbENhY2hlID0gbnVsbDtcbmxldCBwZXJzdWFzaW9uV2FybmluZ3NBY2tub3dsZWRnZWQgPSBmYWxzZTtcbmxldCBfd2FybmluZ3NCeVJld3JpdGVJZCA9IHt9OyAgLy8gTWFwIGZyb20gcmV3cml0ZSBpZCBcdTIxOTIgd2FybmluZyBsaXN0IChQYXRoIDEpXG5sZXQgX3Jlc3RvcmVUb2FzdFNob3duID0gZmFsc2U7XG5cbmZ1bmN0aW9uIHN5bmNSZXdyaXRlR2xvYmFscygpIHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHdpbmRvdy5yZXdyaXRlRGVjaXNpb25zID0gcmV3cml0ZURlY2lzaW9ucztcbiAgd2luZG93Ll9yZXdyaXRlUGFuZWxDYWNoZSA9IF9yZXdyaXRlUGFuZWxDYWNoZTtcbiAgd2luZG93LmFjY2VwdEFsbFJld3JpdGVzID0gYWNjZXB0QWxsUmV3cml0ZXM7XG4gIHdpbmRvdy5yZWplY3RBbGxSZXdyaXRlcyA9IHJlamVjdEFsbFJld3JpdGVzO1xuICB3aW5kb3cudG9nZ2xlUmV3cml0ZUNvbXBhY3RNb2RlID0gdG9nZ2xlUmV3cml0ZUNvbXBhY3RNb2RlO1xufVxuXG5mdW5jdGlvbiBfZGVjaXNpb25zS2V5KCkge1xuICB0cnkge1xuICAgIGNvbnN0IHNpZCA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCkuZ2V0KCdzZXNzaW9uJyk7XG4gICAgcmV0dXJuIHNpZCA/IGByd19kZWNpc2lvbnNfJHtzaWR9YCA6IG51bGw7XG4gIH0gY2F0Y2ggKF8pIHsgcmV0dXJuIG51bGw7IH1cbn1cblxuZnVuY3Rpb24gX3BlcnNpc3REZWNpc2lvbnMoKSB7XG4gIGNvbnN0IGtleSA9IF9kZWNpc2lvbnNLZXkoKTtcbiAgaWYgKCFrZXkpIHJldHVybjtcbiAgdHJ5IHsgbG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCBKU09OLnN0cmluZ2lmeShyZXdyaXRlRGVjaXNpb25zKSk7IH0gY2F0Y2ggKF8pIHt9XG59XG5cbi8vIEZhbGxiYWNrIGF1ZGl0IGZyb20gdGhlIGxhc3QgL2FwaS9yZXdyaXRlcyByZXNwb25zZSBcdTIwMTQgdXNlZCBmb3IgY29sZC1yZXN0b3JlIChHQVAtMTg2KS5cbmxldCBfYmFja2VuZFJld3JpdGVBdWRpdCA9IFtdO1xuXG5mdW5jdGlvbiBfcmVzdG9yZURlY2lzaW9ucygpIHtcbiAgY29uc3Qga2V5ID0gX2RlY2lzaW9uc0tleSgpO1xuICBpZiAoIWtleSkgcmV0dXJuO1xuICBjb25zdCBoYWREZWNpc2lvbnMgPSBPYmplY3Qua2V5cyhyZXdyaXRlRGVjaXNpb25zKS5sZW5ndGggPiAwO1xuICB0cnkge1xuICAgIGNvbnN0IHNhdmVkID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpIHx8ICdudWxsJyk7XG4gICAgaWYgKHNhdmVkICYmIHR5cGVvZiBzYXZlZCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoc2F2ZWQpKSB7XG4gICAgICBPYmplY3QuYXNzaWduKHJld3JpdGVEZWNpc2lvbnMsIHNhdmVkKTtcbiAgICAgIHN5bmNSZXdyaXRlR2xvYmFscygpO1xuICAgICAgaWYgKCFoYWREZWNpc2lvbnMgJiYgIV9yZXN0b3JlVG9hc3RTaG93biAmJiBPYmplY3Qua2V5cyhyZXdyaXRlRGVjaXNpb25zKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIF9yZXN0b3JlVG9hc3RTaG93biA9IHRydWU7XG4gICAgICAgIGlmICh0eXBlb2Ygc2hvd1RvYXN0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgc2hvd1RvYXN0KCdZb3VyIHByZXZpb3VzIHJld3JpdGUgZGVjaXNpb25zIGhhdmUgYmVlbiByZXN0b3JlZCBcdTIwMTQgeW91IGNhbiBzdGlsbCBjaGFuZ2UgdGhlbS4nLCAnd2FybmluZycsIDYwMDApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9IGNhdGNoIChfKSB7fVxuXG4gIC8vIENvbGQtcmVzdG9yZSBmYWxsYmFjazogc2VlZCBkZWNpc2lvbnMgZnJvbSBiYWNrZW5kIHJld3JpdGVfYXVkaXQgd2hlblxuICAvLyBsb2NhbFN0b3JhZ2UgaGFzIG5vdGhpbmcgKGRpZmZlcmVudCBkZXZpY2UsIGluY29nbml0bywgY2xlYXJlZCBzdG9yYWdlKS5cbiAgaWYgKF9iYWNrZW5kUmV3cml0ZUF1ZGl0Lmxlbmd0aCA+IDApIHtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIF9iYWNrZW5kUmV3cml0ZUF1ZGl0KSB7XG4gICAgICBjb25zdCBpZCA9IGVudHJ5LmlkO1xuICAgICAgaWYgKCFpZCB8fCAhZW50cnkub3V0Y29tZSkgY29udGludWU7XG4gICAgICByZXdyaXRlRGVjaXNpb25zW2lkXSA9IHtcbiAgICAgICAgb3V0Y29tZTogZW50cnkub3V0Y29tZSxcbiAgICAgICAgZmluYWxfdGV4dDogZW50cnkub3V0Y29tZSA9PT0gJ2VkaXQnID8gKGVudHJ5LmZpbmFsID8/IG51bGwpIDogbnVsbCxcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChPYmplY3Qua2V5cyhyZXdyaXRlRGVjaXNpb25zKS5sZW5ndGggPiAwKSB7XG4gICAgICBzeW5jUmV3cml0ZUdsb2JhbHMoKTtcbiAgICAgIF9wZXJzaXN0RGVjaXNpb25zKCk7XG4gICAgICBpZiAoIWhhZERlY2lzaW9ucyAmJiAhX3Jlc3RvcmVUb2FzdFNob3duKSB7XG4gICAgICAgIF9yZXN0b3JlVG9hc3RTaG93biA9IHRydWU7XG4gICAgICAgIGlmICh0eXBlb2Ygc2hvd1RvYXN0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgc2hvd1RvYXN0KCdZb3VyIHByZXZpb3VzIHJld3JpdGUgZGVjaXNpb25zIGhhdmUgYmVlbiByZXN0b3JlZCBcdTIwMTQgeW91IGNhbiBzdGlsbCBjaGFuZ2UgdGhlbS4nLCAnd2FybmluZycsIDYwMDApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIF9jbGVhclBlcnNpc3RlZERlY2lzaW9ucygpIHtcbiAgY29uc3Qga2V5ID0gX2RlY2lzaW9uc0tleSgpO1xuICBpZiAoIWtleSkgcmV0dXJuO1xuICB0cnkgeyBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpOyB9IGNhdGNoIChfKSB7fVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgUmV3cml0ZSBzbmFwc2hvdCAoY2hhbmdlZC1pdGVtIGhpZ2hsaWdodGluZykgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5mdW5jdGlvbiBfc25hcHNob3RLZXkoKSB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2lkID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKS5nZXQoJ3Nlc3Npb24nKTtcbiAgICByZXR1cm4gc2lkID8gYHJ3X3NuYXBzaG90XyR7c2lkfWAgOiBudWxsO1xuICB9IGNhdGNoIChfKSB7IHJldHVybiBudWxsOyB9XG59XG5cbmZ1bmN0aW9uIF9zYXZlUmV3cml0ZVNuYXBzaG90KHJld3JpdGVzKSB7XG4gIGNvbnN0IGtleSA9IF9zbmFwc2hvdEtleSgpO1xuICBpZiAoIWtleSkgcmV0dXJuO1xuICBjb25zdCBtYXAgPSB7fTtcbiAgZm9yIChjb25zdCByIG9mIHJld3JpdGVzKSB7XG4gICAgY29uc3QgY2FyZElkID0gU3RyaW5nKHIuaWQpLnJlcGxhY2UoL1teYS16QS1aMC05Xy1dL2csICdfJyk7XG4gICAgbWFwW2NhcmRJZF0gPSByLnByb3Bvc2VkIHx8ICcnO1xuICB9XG4gIHRyeSB7IGxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgSlNPTi5zdHJpbmdpZnkobWFwKSk7IH0gY2F0Y2ggKF8pIHt9XG59XG5cbmZ1bmN0aW9uIF9nZXRSZXdyaXRlU25hcHNob3QoKSB7XG4gIGNvbnN0IGtleSA9IF9zbmFwc2hvdEtleSgpO1xuICBpZiAoIWtleSkgcmV0dXJuIG51bGw7XG4gIHRyeSB7IHJldHVybiBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSkgfHwgJ251bGwnKTsgfSBjYXRjaCAoXykgeyByZXR1cm4gbnVsbDsgfVxufVxuXG5mdW5jdGlvbiBfY2xlYXJSZXdyaXRlU25hcHNob3QoKSB7XG4gIGNvbnN0IGtleSA9IF9zbmFwc2hvdEtleSgpO1xuICBpZiAoIWtleSkgcmV0dXJuO1xuICB0cnkgeyBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpOyB9IGNhdGNoIChfKSB7fVxufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaEFuZFJldmlld1Jld3JpdGVzKCkge1xuICBjb25zdCBsb2FkaW5nTXNnID0gYXBwZW5kTG9hZGluZ01lc3NhZ2UoJ0NoZWNraW5nIGZvciB0ZXh0IGltcHJvdmVtZW50cy4uLicpO1xuICBzZXRMb2FkaW5nKHRydWUsICdSZXZpZXdpbmcgcmV3cml0ZXNcdTIwMjYnKTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9yZXdyaXRlcycpO1xuICAgIGNvbnN0IGRhdGEgPSBwYXJzZVJld3JpdGVzUmVzcG9uc2UoYXdhaXQgcmVzLmpzb24oKSk7XG4gICAgcmVtb3ZlTG9hZGluZ01lc3NhZ2UobG9hZGluZ01zZyk7XG4gICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgaWYgKCFyZXMub2spIHtcbiAgICAgIGFwcGVuZFJldHJ5TWVzc2FnZSgnXHUyNzRDIEVycm9yIGNoZWNraW5nIHJld3JpdGVzOiAnICsgKGRhdGEuZXJyb3IgfHwgJ1Vua25vd24gZXJyb3InKSwgZmV0Y2hBbmRSZXZpZXdSZXdyaXRlcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJld3JpdGVzID0gZGF0YS5yZXdyaXRlcyB8fCBbXTtcbiAgICBjb25zdCB3YXJuaW5ncyA9IGRhdGEucGVyc3Vhc2lvbl93YXJuaW5ncyB8fCBbXTsgIC8vIFBoYXNlIDEwXG4gICAgX2JhY2tlbmRSZXdyaXRlQXVkaXQgPSBkYXRhLnJld3JpdGVfYXVkaXQgfHwgW107XG5cbiAgICAvLyBTaG93IHBlcnN1YXNpb24gd2FybmluZ3MgZmlyc3QgKFBoYXNlIDEwKVxuICAgIHBlcnN1YXNpb25XYXJuaW5nc0Fja25vd2xlZGdlZCA9IHdhcm5pbmdzLmxlbmd0aCA9PT0gMDsgIC8vIE1hcmsgYWNrbm93bGVkZ2VkIGlmIG5vIHdhcm5pbmdzXG4gICAgaWYgKHdhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG1zZyA9IGBcdTI2QTBcdUZFMEYgKioke3dhcm5pbmdzLmxlbmd0aH0qKiBwZXJzdWFzaW9uIGNoZWNrJHt3YXJuaW5ncy5sZW5ndGggPiAxID8gJ3MnIDogJyd9IGZsYWdnZWQuIFJldmlldyB0aGVzZSBiZWZvcmUgc3VibWl0dGluZy5gO1xuICAgICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgbXNnKTtcbiAgICB9XG5cbiAgICAvLyBTaG93IHJld3JpdGUgcmV2aWV3IHBhbmVsXG4gICAgcmV3cml0ZURlY2lzaW9ucyA9IHt9O1xuICAgIHN5bmNSZXdyaXRlR2xvYmFscygpO1xuICAgIHJlbmRlclJld3JpdGVQYW5lbChyZXdyaXRlcywgd2FybmluZ3MpOyAgLy8gUGFzcyB3YXJuaW5ncyB0byBwYW5lbFxuICAgIHN3aXRjaFRhYigncmV3cml0ZScpO1xuICAgIGNvbnN0IG4gPSByZXdyaXRlcy5sZW5ndGg7XG4gICAgaWYgKG4gPT09IDApIHtcbiAgICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsICdcdTI3MEZcdUZFMEYgTm8gcmV3cml0ZSBzdWdnZXN0aW9ucyB3ZXJlIG5lZWRlZCBcdTIwMTQgeW91ciBzZWxlY3RlZCBjb250ZW50IGFscmVhZHkgdXNlcyB0aGUgam9iXFwncyB0ZXJtaW5vbG9neSB3ZWxsLiBUaGUgKipSZXdyaXRlcyoqIHRhYiBpcyBzdGlsbCBhdmFpbGFibGUgc28geW91IGNhbiBjb25maXJtIGFuZCBjb250aW51ZSB0byAqKlNwZWxsIENoZWNrKiogd2hlbiByZWFkeS4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgYFx1MjcwRlx1RkUwRiBZb3UndmUgY29uZmlybWVkIHlvdXIgZXhwZXJpZW5jZSwgc2tpbGwsIGFuZCBhY2hpZXZlbWVudCBzZWxlY3Rpb25zLiBIZXJlIGFyZSB0aGUgQUkncyAqKiR7bn0qKiB0ZXh0IGltcHJvdmVtZW50IHN1Z2dlc3Rpb24ke24gPiAxID8gJ3MnIDogJyd9IGZvciB0aGUgaW5jbHVkZWQgYnVsbGV0cyBcdTIwMTQgZWFjaCBvbmUgaW50cm9kdWNlcyBqb2ItcmVsZXZhbnQga2V5d29yZHMgd2hpbGUgcHJlc2VydmluZyB5b3VyIGZhY3RzLiBSZXZpZXcgZWFjaCBzdWdnZXN0aW9uIGluIHRoZSAqKlJld3JpdGVzKiogdGFiLCB0aGVuIGFjY2VwdCwgZWRpdCwgb3IgcmVqZWN0IGJlZm9yZSBjb250aW51aW5nIHRvIHNwZWxsIGNoZWNrLmApO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmVtb3ZlTG9hZGluZ01lc3NhZ2UobG9hZGluZ01zZyk7XG4gICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgYXBwZW5kUmV0cnlNZXNzYWdlKCdcdTI3NEMgRXJyb3I6ICcgKyBlcnIubWVzc2FnZSwgZmV0Y2hBbmRSZXZpZXdSZXdyaXRlcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX3JlbmRlclJld3JpdGVBdWRpdExvZygpIHtcbiAgaWYgKCFfYmFja2VuZFJld3JpdGVBdWRpdCB8fCBfYmFja2VuZFJld3JpdGVBdWRpdC5sZW5ndGggPT09IDApIHJldHVybiAnJztcblxuICBjb25zdCBPVVRDT01FX0lDT04gPSB7IGFjY2VwdDogJ1x1MjcwNScsIHJlamVjdDogJ1x1Mjc0QycsIGVkaXQ6ICdcdTI3MEZcdUZFMEYnIH07XG4gIGNvbnN0IE9VVENPTUVfTEFCRUwgPSB7IGFjY2VwdDogJ0FjY2VwdGVkJywgcmVqZWN0OiAnUmVqZWN0ZWQnLCBlZGl0OiAnRWRpdGVkJyB9O1xuXG4gIGNvbnN0IHJvd3MgPSBfYmFja2VuZFJld3JpdGVBdWRpdC5tYXAoZW50cnkgPT4ge1xuICAgIGNvbnN0IGljb24gID0gT1VUQ09NRV9JQ09OW2VudHJ5Lm91dGNvbWVdIHx8ICdcdTI3NTMnO1xuICAgIGNvbnN0IGxhYmVsID0gT1VUQ09NRV9MQUJFTFtlbnRyeS5vdXRjb21lXSB8fCBlbnRyeS5vdXRjb21lO1xuICAgIGNvbnN0IGxvYyAgID0gZXNjYXBlSHRtbChlbnRyeS5sb2NhdGlvbiB8fCBlbnRyeS5maWVsZCB8fCAnJyk7XG4gICAgY29uc3Qgb3JpZyAgPSBlc2NhcGVIdG1sKGVudHJ5Lm9yaWdpbmFsIHx8ICcnKTtcbiAgICBjb25zdCBwcm9wICA9IGVzY2FwZUh0bWwoZW50cnkucHJvcG9zZWQgfHwgJycpO1xuICAgIGNvbnN0IGZpbiAgID0gZW50cnkub3V0Y29tZSA9PT0gJ2VkaXQnICYmIGVudHJ5LmZpbmFsXG4gICAgICA/IGA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDo0cHg7Y29sb3I6IzFkNGVkODtmb250LXNpemU6MC44NWVtO1wiPkZpbmFsOiAke2VzY2FwZUh0bWwoZW50cnkuZmluYWwpfTwvZGl2PmBcbiAgICAgIDogJyc7XG4gICAgcmV0dXJuIGBcbiAgICAgIDxkaXYgc3R5bGU9XCJib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZTJlOGYwO3BhZGRpbmc6OHB4IDA7Zm9udC1zaXplOjAuODhlbTtcIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjZweDttYXJnaW4tYm90dG9tOjRweDtcIj5cbiAgICAgICAgICA8c3BhbiB0aXRsZT1cIiR7bGFiZWx9XCI+JHtpY29ufTwvc3Bhbj5cbiAgICAgICAgICA8c3Ryb25nIHN0eWxlPVwiY29sb3I6IzM3NDE1MTtcIj4ke2xhYmVsfTwvc3Ryb25nPlxuICAgICAgICAgICR7bG9jID8gYDxzcGFuIHN0eWxlPVwiY29sb3I6IzljYTNhZjtmb250LXNpemU6MC44NWVtO1wiPlx1MjAxNCAke2xvY308L3NwYW4+YCA6ICcnfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImNvbG9yOiM2YjcyODA7dGV4dC1kZWNvcmF0aW9uOmxpbmUtdGhyb3VnaDtmb250LXNpemU6MC44NWVtO1wiPiR7b3JpZ308L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImNvbG9yOiMzNzQxNTE7Zm9udC1zaXplOjAuODVlbTtcIj4ke3Byb3B9PC9kaXY+XG4gICAgICAgICR7ZmlufVxuICAgICAgPC9kaXY+YDtcbiAgfSkuam9pbignJyk7XG5cbiAgcmV0dXJuIGBcbiAgICA8ZGV0YWlscyBzdHlsZT1cIm1hcmdpbi10b3A6MjRweDtib3JkZXI6MXB4IHNvbGlkICNlMmU4ZjA7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzoxMnB4IDE2cHg7XCI+XG4gICAgICA8c3VtbWFyeSBzdHlsZT1cImN1cnNvcjpwb2ludGVyO2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjojMzc0MTUxO2xpc3Qtc3R5bGU6bm9uZTtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDo4cHg7XCI+XG4gICAgICAgIDxzcGFuPlx1RDgzRFx1RENDQjwvc3Bhbj5cbiAgICAgICAgPHNwYW4+UmV3cml0ZSBBdWRpdCBMb2cgKCR7X2JhY2tlbmRSZXdyaXRlQXVkaXQubGVuZ3RofSBkZWNpc2lvbiR7X2JhY2tlbmRSZXdyaXRlQXVkaXQubGVuZ3RoID09PSAxID8gJycgOiAncyd9KTwvc3Bhbj5cbiAgICAgICAgPHNwYW4gc3R5bGU9XCJtYXJnaW4tbGVmdDphdXRvO2NvbG9yOiM5Y2EzYWY7Zm9udC1zaXplOjAuODVlbTtcIj5cdTI1QkMgc2hvdzwvc3Bhbj5cbiAgICAgIDwvc3VtbWFyeT5cbiAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOjEycHg7XCI+JHtyb3dzfTwvZGl2PlxuICAgIDwvZGV0YWlscz5gO1xufVxuXG5mdW5jdGlvbiByZW5kZXJSZXdyaXRlUGFuZWwocmV3cml0ZXMsIHdhcm5pbmdzID0gW10pIHtcbiAgX3Jld3JpdGVQYW5lbENhY2hlID0geyByZXdyaXRlcywgd2FybmluZ3MgfTtcbiAgLy8gQnVpbGQgcGVyLWNhcmQgd2FybmluZyBpbmRleCBmb3IgUGF0aCAxIGJhZGdlc1xuICBfd2FybmluZ3NCeVJld3JpdGVJZCA9IHt9O1xuICBmb3IgKGNvbnN0IHcgb2Ygd2FybmluZ3MpIHtcbiAgICBpZiAoIV93YXJuaW5nc0J5UmV3cml0ZUlkW3cuaWRdKSBfd2FybmluZ3NCeVJld3JpdGVJZFt3LmlkXSA9IFtdO1xuICAgIF93YXJuaW5nc0J5UmV3cml0ZUlkW3cuaWRdLnB1c2godyk7XG4gIH1cbiAgc3luY1Jld3JpdGVHbG9iYWxzKCk7XG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9jdW1lbnQtY29udGVudCcpO1xuICBjb25zdCBoYXNSZXdyaXRlcyA9IHJld3JpdGVzLmxlbmd0aCA+IDA7XG5cbiAgLy8gQnVpbGQgcGVyc3Vhc2lvbiB3YXJuaW5ncyBzZWN0aW9uIChQaGFzZSAxMClcbiAgbGV0IHdhcm5pbmdzSHRtbCA9ICcnO1xuICBpZiAod2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IHdhcm5pbmdzQnlUeXBlID0ge307XG4gICAgd2FybmluZ3MuZm9yRWFjaCh3ID0+IHtcbiAgICAgIGlmICghd2FybmluZ3NCeVR5cGVbdy5mbGFnX3R5cGVdKSB3YXJuaW5nc0J5VHlwZVt3LmZsYWdfdHlwZV0gPSAwO1xuICAgICAgd2FybmluZ3NCeVR5cGVbdy5mbGFnX3R5cGVdKys7XG4gICAgfSk7XG4gICAgY29uc3Qgd2FybmluZ0NvdW50cyA9IE9iamVjdC5lbnRyaWVzKHdhcm5pbmdzQnlUeXBlKVxuICAgICAgLm1hcCgoW3R5cGUsIGNvdW50XSkgPT4gYCR7Y291bnR9ICR7dHlwZS5yZXBsYWNlKC9fL2csICcgJyl9YClcbiAgICAgIC5qb2luKCcsICcpO1xuXG4gICAgd2FybmluZ3NIdG1sID0gYFxuICAgICAgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2ZlZjJmMjtib3JkZXI6MXB4IHNvbGlkICNmZWNhY2E7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzoxNHB4O21hcmdpbi1ib3R0b206MjBweDtcIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjEwcHg7bWFyZ2luLWJvdHRvbToxMHB4O2N1cnNvcjpwb2ludGVyO1wiIG9uY2xpY2s9XCJ0aGlzLnBhcmVudEVsZW1lbnQucXVlcnlTZWxlY3RvcignI3dhcm5pbmdzLWRldGFpbCcpLnN0eWxlLmRpc3BsYXkgPSB0aGlzLnBhcmVudEVsZW1lbnQucXVlcnlTZWxlY3RvcignI3dhcm5pbmdzLWRldGFpbCcpLnN0eWxlLmRpc3BsYXkgPT09ICdub25lJyA/ICdibG9jaycgOiAnbm9uZSc7XCI+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MjBweDtcIj5cdTI2QTBcdUZFMEY8L3NwYW4+XG4gICAgICAgICAgPHN0cm9uZyBzdHlsZT1cImNvbG9yOiM5OTFiMWI7XCI+UGVyc3Vhc2lvbiBjaGVja3M6ICR7d2FybmluZ0NvdW50c308L3N0cm9uZz5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cIm1hcmdpbi1sZWZ0OmF1dG87Y29sb3I6IzdmMWQxZDtcIj5cdTI1QkM8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwid2FybmluZ3MtZGV0YWlsXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7bWFyZ2luLXRvcDoxMHB4O3BhZGRpbmctdG9wOjEwcHg7Ym9yZGVyLXRvcDoxcHggc29saWQgI2ZlY2FjYTtcIj5cbiAgICAgICAgICAke3dhcm5pbmdzLm1hcCh3ID0+IGBcbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nOjhweDttYXJnaW4tYm90dG9tOjhweDtiYWNrZ3JvdW5kOiNmZmY3ZWQ7Ym9yZGVyLWxlZnQ6M3B4IHNvbGlkICNmOTczMTY7Ym9yZGVyLXJhZGl1czo0cHg7Zm9udC1zaXplOjAuOWVtO1wiPlxuICAgICAgICAgICAgICA8c3Ryb25nPiR7dy5mbGFnX3R5cGUucmVwbGFjZSgvXy9nLCAnICcpfTwvc3Ryb25nPiBhdCAke3cubG9jYXRpb259PGJyPlxuICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiM3YzJkMTI7XCI+JHt3LmRldGFpbHN9PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgYCkuam9pbignJyl9XG4gICAgICAgICAgPGJ1dHRvbiBzdHlsZT1cIm1hcmdpbi10b3A6MTBweDtwYWRkaW5nOjhweCAxMnB4O2JhY2tncm91bmQ6Izk5MWIxYjtjb2xvcjp3aGl0ZTtib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjRweDtjdXJzb3I6cG9pbnRlcjtcIiBvbmNsaWNrPVwic2V0UGVyc3Vhc2lvbldhcm5pbmdzQWNrbm93bGVkZ2VkKHRydWUpOyB0aGlzLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAuNic7IHVwZGF0ZVJld3JpdGVUYWxseSgpO1wiPlxuICAgICAgICAgICAgXHUyNzEzIEFja25vd2xlZGdlZFxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIGA7XG4gIH1cblxuICAvLyBDb21wdXRlIHBlci1jYXJkIGNoYW5nZSBzdGF0dXMgcmVsYXRpdmUgdG8gcHJldmlvdXMgcmVuZGVyJ3Mgc25hcHNob3QuXG4gIGNvbnN0IHByZXZTbmFwc2hvdCA9IF9nZXRSZXdyaXRlU25hcHNob3QoKTtcbiAgY29uc3QgY2hhbmdlU3RhdHVzTWFwID0ge307XG4gIGlmIChwcmV2U25hcHNob3QpIHtcbiAgICBmb3IgKGNvbnN0IHIgb2YgcmV3cml0ZXMpIHtcbiAgICAgIGNvbnN0IGNhcmRJZCA9IFN0cmluZyhyLmlkKS5yZXBsYWNlKC9bXmEtekEtWjAtOV8tXS9nLCAnXycpO1xuICAgICAgaWYgKCEoY2FyZElkIGluIHByZXZTbmFwc2hvdCkpIHtcbiAgICAgICAgY2hhbmdlU3RhdHVzTWFwW2NhcmRJZF0gPSAnbmV3JztcbiAgICAgIH0gZWxzZSBpZiAocHJldlNuYXBzaG90W2NhcmRJZF0gIT09IChyLnByb3Bvc2VkIHx8ICcnKSkge1xuICAgICAgICBjaGFuZ2VTdGF0dXNNYXBbY2FyZElkXSA9ICd1cGRhdGVkJztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLy8gU2F2ZSBjdXJyZW50IHJld3JpdGVzIGFzIHNuYXBzaG90IGZvciBuZXh0IHJlbmRlciBjb21wYXJpc29uLlxuICBfc2F2ZVJld3JpdGVTbmFwc2hvdChyZXdyaXRlcyk7XG5cbiAgY29udGVudC5pbm5lckhUTUwgPSB3YXJuaW5nc0h0bWwgKyBgXG4gICAgPGRpdiBpZD1cInJld3JpdGUtcGFuZWxcIj5cbiAgICAgIDxoMT5cdTI3MEZcdUZFMEYgUmV2aWV3IFRleHQgSW1wcm92ZW1lbnRzPC9oMT5cbiAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDttYXJnaW4tYm90dG9tOjIwcHg7XCI+XG4gICAgICAgICR7aGFzUmV3cml0ZXNcbiAgICA/ICdSZXZpZXcgZWFjaCBzdWdnZXN0ZWQgdGV4dCBpbXByb3ZlbWVudC4gQWNjZXB0LCBlZGl0LCBvciByZWplY3QgYWxsIHN1Z2dlc3Rpb25zIGJlZm9yZSBwcm9jZWVkaW5nIHRvIHNwZWxsIGNoZWNrLidcbiAgICA6ICdObyB0ZXh0IGltcHJvdmVtZW50cyB3ZXJlIHN1Z2dlc3RlZCBmb3IgdGhpcyBDVi4gQ29udGludWUgd2hlbiB5b3UgYXJlIHJlYWR5IHRvIG1vdmUgdG8gc3BlbGwgY2hlY2suJ31cbiAgICAgIDwvcD5cbiAgICAgIDxkaXYgY2xhc3M9XCJyZXdyaXRlLXRhbGx5LWJhclwiIGlkPVwicmV3cml0ZS10YWxseVwiICR7aGFzUmV3cml0ZXMgPyAnJyA6ICdzdHlsZT1cImRpc3BsYXk6bm9uZVwiJ30+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidGFsbHktYWNjZXB0ZWRcIj5cdTI3MTMgQWNjZXB0ZWQ6IDxzdHJvbmcgaWQ9XCJ0YWxseS1hY2NlcHRlZFwiPjA8L3N0cm9uZz48L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidGFsbHktcmVqZWN0ZWRcIj5cdTI3MTcgUmVqZWN0ZWQ6IDxzdHJvbmcgaWQ9XCJ0YWxseS1yZWplY3RlZFwiPjA8L3N0cm9uZz48L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidGFsbHktcGVuZGluZ1wiPlx1MjNGMyBQZW5kaW5nOiA8c3Ryb25nIGlkPVwidGFsbHktcGVuZGluZ1wiPiR7cmV3cml0ZXMubGVuZ3RofTwvc3Ryb25nPjwvc3Bhbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInJ3LWJ1bGstYnRuXCIgb25jbGljaz1cImFjY2VwdEFsbFJld3JpdGVzKClcIiB0aXRsZT1cIkFjY2VwdCBhbGwgcGVuZGluZyBzdWdnZXN0aW9uc1wiPlx1MjcxMyBBY2NlcHQgQWxsPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJydy1idWxrLWJ0biBydy1idWxrLXJlamVjdFwiIG9uY2xpY2s9XCJyZWplY3RBbGxSZXdyaXRlcygpXCIgdGl0bGU9XCJSZWplY3QgYWxsIHBlbmRpbmcgc3VnZ2VzdGlvbnNcIj5cdTI3MTcgUmVqZWN0IEFsbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwicnctY29tcGFjdC10b2dnbGVcIiBpZD1cInJ3LWNvbXBhY3QtYnRuXCIgb25jbGljaz1cInRvZ2dsZVJld3JpdGVDb21wYWN0TW9kZSgpXCIgdGl0bGU9XCJTd2l0Y2ggdG8gY29tcGFjdCBzaW5nbGUtbGluZSB2aWV3IGZvciByYXBpZCByZXZpZXdcIj5cdTIyOUUgQ29tcGFjdDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwic3VibWl0LXJld3JpdGVzLWJ0blwiIGlkPVwic3VibWl0LXJld3JpdGVzLWJ0blwiIGRpc2FibGVkXG4gICAgICAgICAgICAgICAgb25jbGljaz1cInN1Ym1pdFJld3JpdGVEZWNpc2lvbnMoKVwiPlN1Ym1pdCBBbGwgRGVjaXNpb25zPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgaWQ9XCJyZXdyaXRlLWNhcmRzXCI+XG4gICAgICAgICR7aGFzUmV3cml0ZXNcbiAgICA/IHJld3JpdGVzLm1hcChyID0+IHtcbiAgICAgICAgY29uc3QgY2FyZElkID0gU3RyaW5nKHIuaWQpLnJlcGxhY2UoL1teYS16QS1aMC05Xy1dL2csICdfJyk7XG4gICAgICAgIHJldHVybiByZW5kZXJSZXdyaXRlQ2FyZChyLCBfd2FybmluZ3NCeVJld3JpdGVJZFtyLmlkXSB8fCBbXSwgY2hhbmdlU3RhdHVzTWFwW2NhcmRJZF0gfHwgbnVsbCk7XG4gICAgICB9KS5qb2luKCcnKVxuICAgIDogYFxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJlbXB0eS1zdGF0ZVwiIHN0eWxlPVwibWFyZ2luLXRvcDoyNHB4O1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImljb25cIj5cdTI3MEZcdUZFMEY8L2Rpdj5cbiAgICAgICAgICAgIDxoMz5ObyBSZXdyaXRlIFN1Z2dlc3Rpb25zPC9oMz5cbiAgICAgICAgICAgIDxwPlRoaXMgZHJhZnQgYWxyZWFkeSBwYXNzZXMgdGhlIHJld3JpdGUgc3RhZ2Ugd2l0aG91dCBzdWdnZXN0ZWQgd29yZGluZyBjaGFuZ2VzLjwvcD5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzdWJtaXQtYnRuXCIgaWQ9XCJzdWJtaXQtcmV3cml0ZXMtYnRuXCIgb25jbGljaz1cInN1Ym1pdFJld3JpdGVEZWNpc2lvbnMoKVwiPkNvbnRpbnVlIHRvIFNwZWxsIENoZWNrPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIGB9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICAke19yZW5kZXJSZXdyaXRlQXVkaXRMb2coKX1cbiAgYDtcblxuICAvLyBSZXN0b3JlIGRlY2lzaW9ucyBwZXJzaXN0ZWQgZnJvbSBhIHByZXZpb3VzIHBhZ2UgbG9hZCAoR0FQLTE2NikuXG4gIF9yZXN0b3JlRGVjaXNpb25zKCk7XG4gIC8vIFJlLWFwcGx5IGFueSBkZWNpc2lvbnMgbWFkZSBiZWZvcmUgdGhlIGxhc3QgdGFiIG5hdmlnYXRpb24uXG4gIGlmIChPYmplY3Qua2V5cyhyZXdyaXRlRGVjaXNpb25zKS5sZW5ndGggPiAwKSB7XG4gICAgZm9yIChjb25zdCBbaWQsIGRlY10gb2YgT2JqZWN0LmVudHJpZXMocmV3cml0ZURlY2lzaW9ucykpIHtcbiAgICAgIGlmICghZGVjIHx8ICFkZWMub3V0Y29tZSkgY29udGludWU7XG4gICAgICBpZiAoZGVjLm91dGNvbWUgPT09ICdlZGl0JyAmJiBkZWMuZmluYWxfdGV4dCAhPSBudWxsKSB7XG4gICAgICAgIC8vIEVudGVyIGVkaXQgbW9kZSwgaW5qZWN0IHRoZSBzYXZlZCB0ZXh0LCB0aGVuIHNhdmUgc28gdGhlIGNhcmRcbiAgICAgICAgLy8gc2hvd3MgYXMgYWNjZXB0ZWQgd2l0aCB0aGUgY29ycmVjdCBkaWZmIHJlbmRlcmVkLlxuICAgICAgICBhcHBseVJld3JpdGVBY3Rpb24oaWQsICdlZGl0Jyk7XG4gICAgICAgIGNvbnN0IHRhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHJ3LXRleHRhcmVhLSR7aWR9YCk7XG4gICAgICAgIGlmICh0YSkge1xuICAgICAgICAgIHRhLnZhbHVlID0gZGVjLmZpbmFsX3RleHQ7XG4gICAgICAgICAgc2F2ZVJld3JpdGVFZGl0KGlkKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXBwbHlSZXdyaXRlQWN0aW9uKGlkLCBkZWMub3V0Y29tZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHVwZGF0ZVJld3JpdGVUYWxseSgpO1xuICB9XG59XG5cbi8qKlxuICogY29tcHV0ZVdvcmREaWZmKG9yaWdpbmFsLCBwcm9wb3NlZCkgXHUyMDE0IExDUyB3b3JkLWxldmVsIGRpZmYuXG4gKlxuICogVG9rZW5pc2VzIGJvdGggc3RyaW5ncyBieSBzcGxpdHRpbmcgb24gd2hpdGVzcGFjZSBib3VuZGFyaWVzIHdoaWxlXG4gKiBwcmVzZXJ2aW5nIHRoZSB3aGl0ZXNwYWNlIHRva2VucyBzbyB0aGUgcmVuZGVyZWQgZGlmZiBoYXMgdGhlIHNhbWVcbiAqIHNwYWNpbmcgYXMgdGhlIHNvdXJjZSB0ZXh0LiAgUmV0dXJucyBhbiBhcnJheSBvZlxuICoge3Rva2VuOiBzdHJpbmcsIHR5cGU6ICd1bmNoYW5nZWQnfCdyZW1vdmVkJ3wnYWRkZWQnfS5cbiAqL1xuZnVuY3Rpb24gY29tcHV0ZVdvcmREaWZmKG9yaWdpbmFsLCBwcm9wb3NlZCkge1xuICAvLyBTcGxpdCBvbiB3aGl0ZXNwYWNlIGJ1dCBrZWVwIHRoZSBzZXBhcmF0b3JzIGFzIHRva2Vucy5cbiAgZnVuY3Rpb24gdG9rZW5pemUoc3RyKSB7IHJldHVybiAoc3RyIHx8ICcnKS5zcGxpdCgvKFxccyspLyk7IH1cblxuICBjb25zdCBhID0gdG9rZW5pemUob3JpZ2luYWwpO1xuICBjb25zdCBiID0gdG9rZW5pemUocHJvcG9zZWQpO1xuICBjb25zdCBtID0gYS5sZW5ndGg7XG4gIGNvbnN0IG4gPSBiLmxlbmd0aDtcblxuICAvLyBCdWlsZCBMQ1MgRFAgdGFibGUgKE8obSpuKSBcdTIwMTQgYWNjZXB0YWJsZSBmb3IgQ1YgYnVsbGV0IGxlbmd0aHMpLlxuICBjb25zdCBkcCA9IEFycmF5LmZyb20oe2xlbmd0aDogbSArIDF9LCAoKSA9PiBuZXcgQXJyYXkobiArIDEpLmZpbGwoMCkpO1xuICBmb3IgKGxldCBpID0gMTsgaSA8PSBtOyBpKyspIHtcbiAgICBmb3IgKGxldCBqID0gMTsgaiA8PSBuOyBqKyspIHtcbiAgICAgIGRwW2ldW2pdID0gYVtpIC0gMV0gPT09IGJbaiAtIDFdXG4gICAgICAgID8gZHBbaSAtIDFdW2ogLSAxXSArIDFcbiAgICAgICAgOiBNYXRoLm1heChkcFtpIC0gMV1bal0sIGRwW2ldW2ogLSAxXSk7XG4gICAgfVxuICB9XG5cbiAgLy8gQmFja3RyYWNrIHRvIHByb2R1Y2UgdGhlIGRpZmYgc2VxdWVuY2UuXG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBsZXQgaSA9IG0sIGogPSBuO1xuICB3aGlsZSAoaSA+IDAgfHwgaiA+IDApIHtcbiAgICBpZiAoaSA+IDAgJiYgaiA+IDAgJiYgYVtpIC0gMV0gPT09IGJbaiAtIDFdKSB7XG4gICAgICByZXN1bHQudW5zaGlmdCh7dG9rZW46IGFbaSAtIDFdLCB0eXBlOiAndW5jaGFuZ2VkJ30pO1xuICAgICAgaS0tOyBqLS07XG4gICAgfSBlbHNlIGlmIChqID4gMCAmJiAoaSA9PT0gMCB8fCBkcFtpXVtqIC0gMV0gPj0gZHBbaSAtIDFdW2pdKSkge1xuICAgICAgcmVzdWx0LnVuc2hpZnQoe3Rva2VuOiBiW2ogLSAxXSwgdHlwZTogJ2FkZGVkJ30pO1xuICAgICAgai0tO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQudW5zaGlmdCh7dG9rZW46IGFbaSAtIDFdLCB0eXBlOiAncmVtb3ZlZCd9KTtcbiAgICAgIGktLTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqIFJlbmRlciBhIHt0b2tlbiwgdHlwZX0gZGlmZiBhcnJheSBpbnRvIGFuIEhUTUwgc3RyaW5nLiAqL1xuZnVuY3Rpb24gcmVuZGVyRGlmZkh0bWwodG9rZW5zKSB7XG4gIHJldHVybiB0b2tlbnMubWFwKHQgPT4ge1xuICAgIGlmICh0LnR5cGUgPT09ICdyZW1vdmVkJykgcmV0dXJuIGA8ZGVsIGNsYXNzPVwiZGlmZi1yZW1vdmVkXCI+JHtlc2NhcGVIdG1sKHQudG9rZW4pfTwvZGVsPmA7XG4gICAgaWYgKHQudHlwZSA9PT0gJ2FkZGVkJykgICByZXR1cm4gYDxpbnMgY2xhc3M9XCJkaWZmLWFkZGVkXCI+JHtlc2NhcGVIdG1sKHQudG9rZW4pfTwvaW5zPmA7XG4gICAgcmV0dXJuIGVzY2FwZUh0bWwodC50b2tlbik7XG4gIH0pLmpvaW4oJycpO1xufVxuXG5mdW5jdGlvbiByZW5kZXJSZXdyaXRlQ2FyZChyLCBjYXJkV2FybmluZ3MgPSBbXSwgY2hhbmdlU3RhdHVzID0gbnVsbCkge1xuICBjb25zdCBpc1dlYWtTa2lsbEFkZCA9IHIudHlwZSA9PT0gJ3NraWxsX2FkZCcgJiYgci5ldmlkZW5jZV9zdHJlbmd0aCA9PT0gJ3dlYWsnO1xuICBjb25zdCB3ZWFrQmFkZ2UgICAgID0gaXNXZWFrU2tpbGxBZGRcbiAgICA/IGA8c3BhbiBjbGFzcz1cIndlYWstYmFkZ2VcIj5cdTI2QTAgQ2FuZGlkYXRlIHRvIGNvbmZpcm08L3NwYW4+YFxuICAgIDogJyc7XG4gIGNvbnN0IGNoYW5nZUJhZGdlICAgPSBjaGFuZ2VTdGF0dXMgPT09ICduZXcnXG4gICAgPyBgPHNwYW4gY2xhc3M9XCJydy1jaGFuZ2UtYmFkZ2UgcnctY2hhbmdlLW5ld1wiIGFyaWEtbGFiZWw9XCJOZXcgc3VnZ2VzdGlvbiBub3QgaW4gcHJldmlvdXMgcnVuXCI+XHVEODNDXHVERDk1IE5ldzwvc3Bhbj5gXG4gICAgOiBjaGFuZ2VTdGF0dXMgPT09ICd1cGRhdGVkJ1xuICAgICAgPyBgPHNwYW4gY2xhc3M9XCJydy1jaGFuZ2UtYmFkZ2UgcnctY2hhbmdlLXVwZGF0ZWRcIiBhcmlhLWxhYmVsPVwiU3VnZ2VzdGlvbiBjaGFuZ2VkIHNpbmNlIHByZXZpb3VzIHJ1blwiPlx1MjFCQiBVcGRhdGVkPC9zcGFuPmBcbiAgICAgIDogJyc7XG4gIC8vIEtleXdvcmQgcGlsbHMgd2l0aCBwb3NpdGlvbi1iYXNlZCByYW5rIGJhZGdlICgjMSwgIzIsIFx1MjAyNilcbiAgY29uc3Qga2V5d29yZFBpbGxzICA9IChyLmtleXdvcmRzX2ludHJvZHVjZWQgfHwgW10pXG4gICAgLm1hcCgoaywgaWR4KSA9PiBgPHNwYW4gY2xhc3M9XCJyZXdyaXRlLWtleXdvcmRcIj48c3BhbiBjbGFzcz1cImt3LXJhbmtcIj4jJHtpZHggKyAxfTwvc3Bhbj4ke2VzY2FwZUh0bWwoayl9PC9zcGFuPmApXG4gICAgLmpvaW4oJycpO1xuICBjb25zdCB0eXBlTGFiZWwgPSAoci50eXBlIHx8ICdyZXdyaXRlJykucmVwbGFjZSgvXy9nLCAnICcpO1xuICAvLyBTYW5pdGl6ZSBJRDoga2VlcCBvbmx5IGFscGhhbnVtZXJpYywgdW5kZXJzY29yZSwgYW5kIGh5cGhlbiBzbyBpdCBpc1xuICAvLyBzYWZlIGFzIGJvdGggYW4gSFRNTCBhdHRyaWJ1dGUgdmFsdWUgYW5kIGEgSlMgc3RyaW5nIGxpdGVyYWwgaW4gb25jbGljay5cbiAgY29uc3QgY2FyZElkICAgID0gU3RyaW5nKHIuaWQpLnJlcGxhY2UoL1teYS16QS1aMC05Xy1dL2csICdfJyk7XG5cbiAgLy8gQ29tcHV0ZSB3b3JkLWxldmVsIGRpZmYgZm9yIHRoZSBpbmxpbmUgZGlzcGxheS5cbiAgY29uc3QgZGlmZlRva2VucyA9IGNvbXB1dGVXb3JkRGlmZihyLm9yaWdpbmFsIHx8ICcnLCByLnByb3Bvc2VkIHx8ICcnKTtcbiAgY29uc3QgZGlmZkh0bWwgICA9IHJlbmRlckRpZmZIdG1sKGRpZmZUb2tlbnMpO1xuXG4gIHJldHVybiBgXG4gICAgPGRpdiBjbGFzcz1cInJld3JpdGUtY2FyZFwiIGlkPVwicnctY2FyZC0ke2NhcmRJZH1cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJyZXdyaXRlLWNhcmQtaGVhZGVyXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwicmV3cml0ZS1jYXJkLXR5cGVcIj4ke2VzY2FwZUh0bWwodHlwZUxhYmVsKX08L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwicmV3cml0ZS1jYXJkLXRpdGxlXCI+JHtlc2NhcGVIdG1sKHIubG9jYXRpb24gfHwgci5pZCl9PC9zcGFuPlxuICAgICAgICAke3dlYWtCYWRnZX0ke2NoYW5nZUJhZGdlfVxuICAgICAgICA8c3BhbiBpZD1cInJ3LWRlY2lzaW9uLWJhZGdlLSR7Y2FyZElkfVwiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiIHN0eWxlPVwiZGlzcGxheTpub25lO2ZvbnQtc2l6ZTowLjc4ZW07Zm9udC13ZWlnaHQ6NjAwO3BhZGRpbmc6MXB4IDdweDtib3JkZXItcmFkaXVzOjlweDttYXJnaW4tbGVmdDphdXRvO1wiPjwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInJld3JpdGUtY2FyZC1ib2R5XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyZXdyaXRlLWlubGluZS1kaWZmXCIgaWQ9XCJydy1kaWZmLSR7Y2FyZElkfVwiXG4gICAgICAgICAgICAgZGF0YS1vcmlnaW5hbD1cIiR7ZXNjYXBlSHRtbChyLm9yaWdpbmFsIHx8ICcnKX1cIj4ke2RpZmZIdG1sfTwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicmV3cml0ZS1hZnRlclwiIGlkPVwicnctYWZ0ZXItJHtjYXJkSWR9XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmVcIj5cbiAgICAgICAgICA8c3BhbiBpZD1cInJ3LWFmdGVyLXRleHQtJHtjYXJkSWR9XCI+JHtlc2NhcGVIdG1sKHIucHJvcG9zZWQgfHwgJycpfTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgICR7a2V5d29yZFBpbGxzID8gYDxkaXYgY2xhc3M9XCJyZXdyaXRlLWtleXdvcmRzXCI+JHtrZXl3b3JkUGlsbHN9PC9kaXY+YCA6ICcnfVxuICAgICAgICAke3IucmF0aW9uYWxlID8gYFxuICAgICAgICA8ZGV0YWlscyBjbGFzcz1cInJld3JpdGUtcmF0aW9uYWxlXCI+XG4gICAgICAgICAgPHN1bW1hcnk+UmF0aW9uYWxlICZhbXA7IEV2aWRlbmNlPC9zdW1tYXJ5PlxuICAgICAgICAgIDxwIHN0eWxlPVwibWFyZ2luOjZweCAwIDA7XCI+JHtlc2NhcGVIdG1sKHIucmF0aW9uYWxlKX08L3A+XG4gICAgICAgICAgJHtyLmV2aWRlbmNlID8gYDxwIHN0eWxlPVwiY29sb3I6IzljYTNhZjtmb250LXNpemU6MC44NWVtO21hcmdpbjo0cHggMCAwO1wiPiR7ZXNjYXBlSHRtbChyLmV2aWRlbmNlKX08L3A+YCA6ICcnfVxuICAgICAgICA8L2RldGFpbHM+YCA6ICcnfVxuICAgICAgICAke2NhcmRXYXJuaW5ncy5sZW5ndGggPiAwID8gYFxuICAgICAgICA8ZGl2IGNsYXNzPVwicmV3cml0ZS1wZXJzdWFzaW9uLWJhZGdlc1wiPlxuICAgICAgICAgICR7Y2FyZFdhcm5pbmdzLm1hcCh3ID0+IGA8c3BhbiBjbGFzcz1cInBlcnN1YXNpb24tYmFkZ2UgcGVyc3Vhc2lvbi1iYWRnZS0tJHt3LnNldmVyaXR5fVwiIHRpdGxlPVwiJHtlc2NhcGVIdG1sKHcuZGV0YWlscyl9XCI+XHUyNkEwICR7ZXNjYXBlSHRtbCh3LmZsYWdfdHlwZS5yZXBsYWNlKC9fL2csICcgJykpfTwvc3Bhbj5gKS5qb2luKCcnKX1cbiAgICAgICAgPC9kaXY+YCA6ICcnfVxuICAgICAgICA8ZGl2IGNsYXNzPVwicmV3cml0ZS1hY3Rpb25zXCI+XG4gICAgICAgICAgPGEgY2xhc3M9XCJydy1iYWNrLWxpbmtcIiBocmVmPVwiI1wiIG9uY2xpY2s9XCJldmVudC5wcmV2ZW50RGVmYXVsdCgpOyBzd2l0Y2hUYWIoJ2N1c3RvbWl6YXRpb25zJylcIiB0aXRsZT1cIkdvIGJhY2sgdG8gQ3VzdG9taXNlIHRvIHJlY29uc2lkZXIgd2hldGhlciB0byBpbmNsdWRlIHRoaXMgY29udGVudFwiPlx1MjFBOSBSZWNvbnNpZGVyIGluY2x1c2lvbjwvYT5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicnctYnRuIGFjY2VwdFwiIGlkPVwicnctYWNjZXB0LSR7Y2FyZElkfVwiIGFyaWEtcHJlc3NlZD1cImZhbHNlXCIgb25jbGljaz1cImFwcGx5UmV3cml0ZUFjdGlvbignJHtjYXJkSWR9JywgJ2FjY2VwdCcpXCI+XHUyNzEzIEFjY2VwdDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJydy1idG4gZWRpdFwiICAgaWQ9XCJydy1lZGl0LSR7Y2FyZElkfVwiICAgYXJpYS1wcmVzc2VkPVwiZmFsc2VcIiBvbmNsaWNrPVwiYXBwbHlSZXdyaXRlQWN0aW9uKCcke2NhcmRJZH0nLCAnZWRpdCcpXCI+XHUyNzBFIEVkaXQ8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicnctYnRuIHJlamVjdFwiIGlkPVwicnctcmVqZWN0LSR7Y2FyZElkfVwiIGFyaWEtcHJlc3NlZD1cImZhbHNlXCIgb25jbGljaz1cImFwcGx5UmV3cml0ZUFjdGlvbignJHtjYXJkSWR9JywgJ3JlamVjdCcpXCI+XHUyNzE3IFJlamVjdDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PmA7XG59XG5cbmZ1bmN0aW9uIGFwcGx5UmV3cml0ZUFjdGlvbihpZCwgb3V0Y29tZSkge1xuICBjb25zdCBjYXJkICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHJ3LWNhcmQtJHtpZH1gKTtcbiAgY29uc3QgYWZ0ZXJFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBydy1hZnRlci0ke2lkfWApO1xuICBjb25zdCBkaWZmRWwgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHJ3LWRpZmYtJHtpZH1gKTtcbiAgaWYgKCFjYXJkIHx8ICFhZnRlckVsKSByZXR1cm47XG5cbiAgLy8gQ2xlYXIgYW55IHByZXZpb3VzIG91dGNvbWUgc3R5bGluZ1xuICBjYXJkLmNsYXNzTGlzdC5yZW1vdmUoJ2FjY2VwdGVkJywgJ3JlamVjdGVkJyk7XG4gIFsnYWNjZXB0JywgJ2VkaXQnLCAncmVqZWN0J10uZm9yRWFjaChhID0+IHtcbiAgICBjb25zdCBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcnctJHthfS0ke2lkfWApO1xuICAgIGJ0bj8uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gICAgaWYgKGJ0bikgYnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJywgJ2ZhbHNlJyk7XG4gIH0pO1xuICBjb25zdCBfZGVjaXNpb25CYWRnZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBydy1kZWNpc2lvbi1iYWRnZS0ke2lkfWApO1xuICBpZiAoX2RlY2lzaW9uQmFkZ2UpIF9kZWNpc2lvbkJhZGdlLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgaWYgKG91dGNvbWUgPT09ICdlZGl0Jykge1xuICAgIC8vIEtlZXAgdGhlIGlubGluZSBkaWZmIHZpc2libGUgYXMgYSByZWZlcmVuY2U7IHNob3cgdGhlIGVkaXRhYmxlIHRleHRhcmVhIGJlbG93IGl0LlxuICAgIGNvbnN0IGN1cnJlbnRUZXh0ID0gYWZ0ZXJFbC5xdWVyeVNlbGVjdG9yKGAjcnctYWZ0ZXItdGV4dC0ke2lkfWApPy50ZXh0Q29udGVudFxuICAgICAgICAgICAgICAgICAgICAgPz8gcmV3cml0ZURlY2lzaW9uc1tpZF0/LmZpbmFsX3RleHRcbiAgICAgICAgICAgICAgICAgICAgID8/ICcnO1xuICAgIGlmIChkaWZmRWwpIHtcbiAgICAgIGRpZmZFbC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICBkaWZmRWwuc3R5bGUub3BhY2l0eSA9ICcwLjU1JztcbiAgICAgIGRpZmZFbC5zdHlsZS5ib3JkZXJMZWZ0ID0gJzNweCBzb2xpZCAjOTNjNWZkJztcbiAgICB9XG4gICAgYWZ0ZXJFbC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICBhZnRlckVsLmlubmVySFRNTCA9IGBcbiAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC43OGVtO2NvbG9yOiM2YjcyODA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+XHUyNzBFIFlvdXIgZWRpdCAoQUkgc3VnZ2VzdGlvbiBzaG93biBhYm92ZSBmb3IgcmVmZXJlbmNlKTo8L2Rpdj5cbiAgICAgIDx0ZXh0YXJlYSBpZD1cInJ3LXRleHRhcmVhLSR7aWR9XCI+JHtlc2NhcGVIdG1sKGN1cnJlbnRUZXh0KX08L3RleHRhcmVhPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cInJ3LXNhdmUtZWRpdC1idG5cIiBzdHlsZT1cIm1hcmdpbi10b3A6NnB4XCJcbiAgICAgICAgICAgICAgb25jbGljaz1cInNhdmVSZXdyaXRlRWRpdCgnJHtpZH0nKVwiPlNhdmU8L2J1dHRvbj5cbiAgICBgO1xuICAgIGNvbnN0IGVkaXRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcnctZWRpdC0ke2lkfWApO1xuICAgIGVkaXRCdG4/LmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgIGlmIChlZGl0QnRuKSBlZGl0QnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJywgJ3RydWUnKTtcbiAgICAvLyBEZWNpc2lvbiBpcyByZWNvcmRlZCBvbmx5IHdoZW4gdGhlIHVzZXIgY2xpY2tzIFNhdmVcbiAgfSBlbHNlIHtcbiAgICAvLyBSZXN0b3JlIHRoZSBhZnRlci10ZXh0IHNwYW4gaWYgd2UgcHJldmlvdXNseSBlbnRlcmVkIGVkaXQgbW9kZVxuICAgIGNvbnN0IHRleHRhcmVhID0gYWZ0ZXJFbC5xdWVyeVNlbGVjdG9yKCd0ZXh0YXJlYScpO1xuICAgIGlmICh0ZXh0YXJlYSkge1xuICAgICAgY29uc3QgdHh0ID0gdGV4dGFyZWEudmFsdWU7XG4gICAgICBhZnRlckVsLmlubmVySFRNTCA9IGA8c3BhbiBpZD1cInJ3LWFmdGVyLXRleHQtJHtpZH1cIj4ke2VzY2FwZUh0bWwodHh0KX08L3NwYW4+YDtcbiAgICB9XG4gICAgLy8gUmUtc2hvdyB0aGUgaW5saW5lIGRpZmYgcGFuZWwgYXQgZnVsbCBvcGFjaXR5OyBoaWRlIHRoZSBlZGl0IGFyZWEuXG4gICAgaWYgKGRpZmZFbCkgeyBkaWZmRWwuc3R5bGUuZGlzcGxheSA9ICcnOyBkaWZmRWwuc3R5bGUub3BhY2l0eSA9ICcnOyBkaWZmRWwuc3R5bGUuYm9yZGVyTGVmdCA9ICcnOyB9XG4gICAgYWZ0ZXJFbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgcmV3cml0ZURlY2lzaW9uc1tpZF0gPSB7IG91dGNvbWUsIGZpbmFsX3RleHQ6IG51bGwgfTtcbiAgICBfcGVyc2lzdERlY2lzaW9ucygpO1xuICAgIGNhcmQuY2xhc3NMaXN0LmFkZChvdXRjb21lID09PSAnYWNjZXB0JyA/ICdhY2NlcHRlZCcgOiAncmVqZWN0ZWQnKTtcbiAgICBjb25zdCBhY3RpdmVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcnctJHtvdXRjb21lfS0ke2lkfWApO1xuICAgIGFjdGl2ZUJ0bj8uY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgaWYgKGFjdGl2ZUJ0bikgYWN0aXZlQnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJywgJ3RydWUnKTtcbiAgICBjb25zdCBkZWNCYWRnZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBydy1kZWNpc2lvbi1iYWRnZS0ke2lkfWApO1xuICAgIGlmIChkZWNCYWRnZSkge1xuICAgICAgZGVjQmFkZ2UudGV4dENvbnRlbnQgPSBvdXRjb21lID09PSAnYWNjZXB0JyA/ICdcdTI3MTMgQWNjZXB0ZWQnIDogJ1x1MjcxNyBSZWplY3RlZCc7XG4gICAgICBkZWNCYWRnZS5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICBkZWNCYWRnZS5zdHlsZS5iYWNrZ3JvdW5kID0gb3V0Y29tZSA9PT0gJ2FjY2VwdCcgPyAnI2JiZjdkMCcgOiAnI2ZlY2FjYSc7XG4gICAgICBkZWNCYWRnZS5zdHlsZS5jb2xvciAgICAgID0gb3V0Y29tZSA9PT0gJ2FjY2VwdCcgPyAnIzA2NWY0NicgOiAnIzk5MWIxYic7XG4gICAgfVxuICAgIHN5bmNSZXdyaXRlR2xvYmFscygpO1xuICAgIHVwZGF0ZVJld3JpdGVUYWxseSgpO1xuICAgIF9zY3JvbGxUb05leHRQZW5kaW5nUmV3cml0ZShpZCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX3Njcm9sbFRvTmV4dFBlbmRpbmdSZXdyaXRlKGFmdGVySWQpIHtcbiAgY29uc3QgYWxsQ2FyZHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbaWRePVwicnctY2FyZC1cIl0nKTtcbiAgbGV0IGZvdW5kID0gZmFsc2U7XG4gIGZvciAoY29uc3QgY2FyZCBvZiBhbGxDYXJkcykge1xuICAgIGNvbnN0IGlkID0gY2FyZC5pZC5yZXBsYWNlKCdydy1jYXJkLScsICcnKTtcbiAgICBpZiAoaWQgPT09IGFmdGVySWQpIHsgZm91bmQgPSB0cnVlOyBjb250aW51ZTsgfVxuICAgIGlmICghZm91bmQpIGNvbnRpbnVlO1xuICAgIGlmICghcmV3cml0ZURlY2lzaW9uc1tpZF0pIHtcbiAgICAgIGNhcmQuc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnY2VudGVyJyB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2F2ZVJld3JpdGVFZGl0KGlkKSB7XG4gIGNvbnN0IHRleHRhcmVhICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcnctdGV4dGFyZWEtJHtpZH1gKTtcbiAgY29uc3QgZWRpdGVkVGV4dCA9IHRleHRhcmVhID8gdGV4dGFyZWEudmFsdWUgOiAnJztcbiAgY29uc3QgYWZ0ZXJFbCAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBydy1hZnRlci0ke2lkfWApO1xuICBjb25zdCBkaWZmRWwgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHJ3LWRpZmYtJHtpZH1gKTtcbiAgY29uc3QgY2FyZCAgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBydy1jYXJkLSR7aWR9YCk7XG4gIGlmICghYWZ0ZXJFbCB8fCAhY2FyZCkgcmV0dXJuO1xuXG4gIC8vIFJlcGxhY2UgdGV4dGFyZWEgd2l0aCBmaW5hbCBzcGFuIChoaWRkZW4gXHUyMDE0IHByZXNlcnZlcyB0ZXh0IGZvciBmdXR1cmUgZWRpdHMpLlxuICBhZnRlckVsLmlubmVySFRNTCA9IGA8c3BhbiBpZD1cInJ3LWFmdGVyLXRleHQtJHtpZH1cIj4ke2VzY2FwZUh0bWwoZWRpdGVkVGV4dCl9PC9zcGFuPmA7XG4gIGFmdGVyRWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAvLyBSZWdlbmVyYXRlIHRoZSBpbmxpbmUgZGlmZiBhZ2FpbnN0IHRoZSBvcmlnaW5hbCB0ZXh0IGFuZCByZS1zaG93IGl0IChmdWxsIG9wYWNpdHkpLlxuICBpZiAoZGlmZkVsKSB7XG4gICAgY29uc3Qgb3JpZ2luYWwgPSBkaWZmRWwuZGF0YXNldC5vcmlnaW5hbCB8fCAnJztcbiAgICBkaWZmRWwuaW5uZXJIVE1MID0gcmVuZGVyRGlmZkh0bWwoY29tcHV0ZVdvcmREaWZmKG9yaWdpbmFsLCBlZGl0ZWRUZXh0KSk7XG4gICAgZGlmZkVsLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICBkaWZmRWwuc3R5bGUub3BhY2l0eSA9ICcnO1xuICAgIGRpZmZFbC5zdHlsZS5ib3JkZXJMZWZ0ID0gJyc7XG4gIH1cblxuICByZXdyaXRlRGVjaXNpb25zW2lkXSA9IHsgb3V0Y29tZTogJ2VkaXQnLCBmaW5hbF90ZXh0OiBlZGl0ZWRUZXh0IH07XG4gIF9wZXJzaXN0RGVjaXNpb25zKCk7XG4gIGNhcmQuY2xhc3NMaXN0LnJlbW92ZSgncmVqZWN0ZWQnKTtcbiAgY2FyZC5jbGFzc0xpc3QuYWRkKCdhY2NlcHRlZCcpO1xuICBbJ2FjY2VwdCcsICdyZWplY3QnXS5mb3JFYWNoKGEgPT4ge1xuICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBydy0ke2F9LSR7aWR9YCk7XG4gICAgYnRuPy5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICBpZiAoYnRuKSBidG4uc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCAnZmFsc2UnKTtcbiAgfSk7XG4gIGNvbnN0IHNhdmVFZGl0QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHJ3LWVkaXQtJHtpZH1gKTtcbiAgc2F2ZUVkaXRCdG4/LmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICBpZiAoc2F2ZUVkaXRCdG4pIHNhdmVFZGl0QnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJywgJ3RydWUnKTtcbiAgY29uc3QgZWRpdERlY0JhZGdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHJ3LWRlY2lzaW9uLWJhZGdlLSR7aWR9YCk7XG4gIGlmIChlZGl0RGVjQmFkZ2UpIHtcbiAgICBlZGl0RGVjQmFkZ2UudGV4dENvbnRlbnQgPSAnXHUyNzEzIEFjY2VwdGVkIChlZGl0ZWQpJztcbiAgICBlZGl0RGVjQmFkZ2Uuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgIGVkaXREZWNCYWRnZS5zdHlsZS5iYWNrZ3JvdW5kID0gJyNiYmY3ZDAnO1xuICAgIGVkaXREZWNCYWRnZS5zdHlsZS5jb2xvciAgICAgID0gJyMwNjVmNDYnO1xuICB9XG4gIHN5bmNSZXdyaXRlR2xvYmFscygpO1xuICB1cGRhdGVSZXdyaXRlVGFsbHkoKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlUmV3cml0ZVRhbGx5KCkge1xuICBjb25zdCBjYXJkcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5yZXdyaXRlLWNhcmQnKTtcbiAgbGV0IGFjY2VwdGVkID0gMCwgcmVqZWN0ZWQgPSAwLCBwZW5kaW5nID0gMDtcbiAgY2FyZHMuZm9yRWFjaChjYXJkID0+IHtcbiAgICBjb25zdCBpZCAgPSBjYXJkLmlkLnJlcGxhY2UoJ3J3LWNhcmQtJywgJycpO1xuICAgIGNvbnN0IGRlYyA9IHJld3JpdGVEZWNpc2lvbnNbaWRdO1xuICAgIGlmICAgICAgKCFkZWMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmcrKztcbiAgICBlbHNlIGlmIChkZWMub3V0Y29tZSA9PT0gJ2FjY2VwdCcgfHwgZGVjLm91dGNvbWUgPT09ICdlZGl0JykgYWNjZXB0ZWQrKztcbiAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3RlZCsrO1xuICB9KTtcblxuICBjb25zdCBhY2NlcHRlZEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhbGx5LWFjY2VwdGVkJyk7XG4gIGNvbnN0IHJlamVjdGVkRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFsbHktcmVqZWN0ZWQnKTtcbiAgY29uc3QgcGVuZGluZ0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhbGx5LXBlbmRpbmcnKTtcblxuICBpZiAoYWNjZXB0ZWRFbCkgYWNjZXB0ZWRFbC50ZXh0Q29udGVudCA9IGFjY2VwdGVkO1xuICBpZiAocmVqZWN0ZWRFbCkgcmVqZWN0ZWRFbC50ZXh0Q29udGVudCA9IHJlamVjdGVkO1xuICBpZiAocGVuZGluZ0VsKSBwZW5kaW5nRWwudGV4dENvbnRlbnQgID0gcGVuZGluZztcblxuICBjb25zdCBzdWJtaXRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3VibWl0LXJld3JpdGVzLWJ0bicpO1xuICBpZiAoc3VibWl0QnRuKSB7XG4gICAgY29uc3QgbmVlZHNBY2sgPSAhcGVyc3Vhc2lvbldhcm5pbmdzQWNrbm93bGVkZ2VkO1xuICAgIHN1Ym1pdEJ0bi5kaXNhYmxlZCA9IChwZW5kaW5nID4gMCkgfHwgbmVlZHNBY2s7XG4gICAgc3VibWl0QnRuLnRpdGxlID0gbmVlZHNBY2tcbiAgICAgID8gJ0Fja25vd2xlZGdlIHRoZSBwZXJzdWFzaW9uIHdhcm5pbmdzIGFib3ZlIGJlZm9yZSBzdWJtaXR0aW5nJ1xuICAgICAgOiAnJztcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBzdWJtaXRSZXdyaXRlRGVjaXNpb25zKCkge1xuICBpZiAoIXBlcnN1YXNpb25XYXJuaW5nc0Fja25vd2xlZGdlZCkge1xuICAgIGNvbnN0IHByb2NlZWQgPSBhd2FpdCBzaG93Q29uZmlybU1vZGFsKFxuICAgICAgJ1x1MjZBMFx1RkUwRiBQZXJzdWFzaW9uIENoZWNrcycsXG4gICAgICAnVGhlcmUgYXJlIHVuYWNrbm93bGVkZ2VkIHBlcnN1YXNpb24gd2FybmluZ3MuIEl0IGlzIHJlY29tbWVuZGVkIHlvdSByZXZpZXcgYW5kIGFja25vd2xlZGdlIHRoZW0gZmlyc3QuXFxuXFxuUHJvY2VlZCBhbnl3YXk/JyxcbiAgICAgICdTdWJtaXQgQW55d2F5J1xuICAgICk7XG4gICAgaWYgKCFwcm9jZWVkKSByZXR1cm47XG4gIH1cbiAgLyogZHVja2Zsb3c6XG4gICAqICAgaWQ6IHJld3JpdGVfdWlfc3VibWl0X2xpdmVcbiAgICogICBraW5kOiB1aVxuICAgKiAgIHRpbWVzdGFtcDogJzIwMjYtMDMtMjVUMjE6Mzk6NDhaJ1xuICAgKiAgIHN0YXR1czogbGl2ZVxuICAgKiAgIGhhbmRsZXM6XG4gICAqICAgLSB1aTpyZXdyaXRlLXJldmlldy5zdWJtaXRcbiAgICogICBjYWxsczpcbiAgICogICAtIFBPU1QgL2FwaS9yZXdyaXRlcy9hcHByb3ZlXG4gICAqICAgLSBQT1NUIC9hcGkvY3YvbGF5b3V0LWVzdGltYXRlXG4gICAqICAgcmVhZHM6XG4gICAqICAgLSB3aW5kb3c6cmV3cml0ZURlY2lzaW9uc1xuICAgKiAgIHdyaXRlczpcbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL3Jld3JpdGVzL2FwcHJvdmUuZGVjaXNpb25zXG4gICAqICAgbm90ZXM6IFN1Ym1pdHMgdGhlIGZpbmFsIHBlci1yZXdyaXRlIG91dGNvbWVzIGFuZCBlZGl0ZWQgdGV4dCBzbyBiYWNrZW5kIHN0YXRlIGNhbiBwZXJzaXN0IGFwcHJvdmVkIHJld3JpdGVzIGFuZCB0aGUgZnVsbCByZXdyaXRlIGF1ZGl0IGJlZm9yZSBzcGVsbC1jaGVjay5cbiAgICovXG4gIGNvbnN0IGRlY2lzaW9ucyA9IE9iamVjdC5lbnRyaWVzKHJld3JpdGVEZWNpc2lvbnMpLm1hcCgoW2lkLCBkZWNdKSA9PiAoe1xuICAgIGlkLFxuICAgIG91dGNvbWU6ICAgIGRlYy5vdXRjb21lLFxuICAgIGZpbmFsX3RleHQ6IGRlYy5maW5hbF90ZXh0ID8/IG51bGxcbiAgfSkpO1xuXG4gIGNvbnN0IGxvYWRpbmdNc2cgPSBhcHBlbmRMb2FkaW5nTWVzc2FnZSgnU3VibWl0dGluZyByZXdyaXRlIGRlY2lzaW9ucy4uLicpO1xuICBzZXRMb2FkaW5nKHRydWUsICdTdWJtaXR0aW5nIHJld3JpdGUgZGVjaXNpb25zXHUyMDI2Jyk7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvcmV3cml0ZXMvYXBwcm92ZScsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGRlY2lzaW9ucyB9KVxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIHJlbW92ZUxvYWRpbmdNZXNzYWdlKGxvYWRpbmdNc2cpO1xuICAgIHNldExvYWRpbmcoZmFsc2UpO1xuXG4gICAgaWYgKCFyZXMub2spIHtcbiAgICAgIGFwcGVuZFJldHJ5TWVzc2FnZSgnXHUyNzRDIEVycm9yOiAnICsgKGRhdGEuZXJyb3IgfHwgJ0ZhaWxlZCB0byBzdWJtaXQgcmV3cml0ZSBkZWNpc2lvbnMnKSwgc3VibWl0UmV3cml0ZURlY2lzaW9ucyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYWNjZXB0ZWQgPSBkYXRhLmFwcHJvdmVkX2NvdW50IHx8IDA7XG4gICAgY29uc3QgcmVqZWN0ZWQgPSBkYXRhLnJlamVjdGVkX2NvdW50IHx8IDA7XG4gICAgc3RhdGVNYW5hZ2VyLm1hcmtDb250ZW50Q2hhbmdlZCgpO1xuICAgIF9jbGVhclBlcnNpc3RlZERlY2lzaW9ucygpO1xuICAgIF9jbGVhclJld3JpdGVTbmFwc2hvdCgpO1xuICAgIGFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIGBcdTI3MDUgUmV3cml0ZSBkZWNpc2lvbnMgcmVjb3JkZWQ6ICR7YWNjZXB0ZWR9IGFjY2VwdGVkLCAke3JlamVjdGVkfSByZWplY3RlZC4gU3RhcnRpbmcgc3BlbGwgY2hlY2tcdTIwMjZgKTtcbiAgICBzY2hlZHVsZUF0c1JlZnJlc2goJ3Jldmlld19jaGVja3BvaW50Jyk7XG4gICAgc3dpdGNoVGFiKCdzcGVsbCcpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZW1vdmVMb2FkaW5nTWVzc2FnZShsb2FkaW5nTXNnKTtcbiAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICBhcHBlbmRSZXRyeU1lc3NhZ2UoJ1x1Mjc0QyBFcnJvcjogJyArIGVyci5tZXNzYWdlLCBzdWJtaXRSZXdyaXRlRGVjaXNpb25zKTtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgRXhwb3J0cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmZ1bmN0aW9uIHNldFBlcnN1YXNpb25XYXJuaW5nc0Fja25vd2xlZGdlZCh2YWx1ZSkge1xuICBwZXJzdWFzaW9uV2FybmluZ3NBY2tub3dsZWRnZWQgPSB2YWx1ZTtcbn1cblxuLyoqIEJ1bGstYWNjZXB0IGFsbCBwZW5kaW5nIHJld3JpdGUgY2FyZHMuICovXG5mdW5jdGlvbiBhY2NlcHRBbGxSZXdyaXRlcygpIHtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnJld3JpdGUtY2FyZCcpLmZvckVhY2goY2FyZCA9PiB7XG4gICAgY29uc3QgaWQgPSBjYXJkLmlkLnJlcGxhY2UoJ3J3LWNhcmQtJywgJycpO1xuICAgIGlmICghcmV3cml0ZURlY2lzaW9uc1tpZF0pIGFwcGx5UmV3cml0ZUFjdGlvbihpZCwgJ2FjY2VwdCcpO1xuICB9KTtcbiAgdXBkYXRlUmV3cml0ZVRhbGx5KCk7XG59XG5cbi8qKiBCdWxrLXJlamVjdCBhbGwgcGVuZGluZyByZXdyaXRlIGNhcmRzLiAqL1xuZnVuY3Rpb24gcmVqZWN0QWxsUmV3cml0ZXMoKSB7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5yZXdyaXRlLWNhcmQnKS5mb3JFYWNoKGNhcmQgPT4ge1xuICAgIGNvbnN0IGlkID0gY2FyZC5pZC5yZXBsYWNlKCdydy1jYXJkLScsICcnKTtcbiAgICBpZiAoIXJld3JpdGVEZWNpc2lvbnNbaWRdKSBhcHBseVJld3JpdGVBY3Rpb24oaWQsICdyZWplY3QnKTtcbiAgfSk7XG4gIHVwZGF0ZVJld3JpdGVUYWxseSgpO1xufVxuXG4vKiogVG9nZ2xlIGNvbXBhY3QgKHNpbmdsZS1saW5lKSBjYXJkIGRpc3BsYXkgZm9yIHJhcGlkIHJldmlldy4gKi9cbmZ1bmN0aW9uIHRvZ2dsZVJld3JpdGVDb21wYWN0TW9kZSgpIHtcbiAgY29uc3QgY2FyZHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmV3cml0ZS1jYXJkcycpO1xuICBjb25zdCBidG4gICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdydy1jb21wYWN0LWJ0bicpO1xuICBpZiAoIWNhcmRzKSByZXR1cm47XG4gIGNvbnN0IGlzQ29tcGFjdCA9IGNhcmRzLmNsYXNzTGlzdC50b2dnbGUoJ2NvbXBhY3QtbW9kZScpO1xuICBpZiAoYnRuKSB7XG4gICAgYnRuLmNsYXNzTGlzdC50b2dnbGUoJ2FjdGl2ZScsIGlzQ29tcGFjdCk7XG4gICAgYnRuLnRleHRDb250ZW50ID0gaXNDb21wYWN0ID8gJ1x1MjI5RiBGdWxsIFZpZXcnIDogJ1x1MjI5RSBDb21wYWN0JztcbiAgICBidG4udGl0bGUgPSBpc0NvbXBhY3QgPyAnU3dpdGNoIHRvIGZ1bGwgY2FyZCB2aWV3JyA6ICdTd2l0Y2ggdG8gY29tcGFjdCBzaW5nbGUtbGluZSB2aWV3IGZvciByYXBpZCByZXZpZXcnO1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIHJld3JpdGVEZWNpc2lvbnMsXG4gIF9yZXdyaXRlUGFuZWxDYWNoZSxcbiAgcGVyc3Vhc2lvbldhcm5pbmdzQWNrbm93bGVkZ2VkLFxuICBzZXRQZXJzdWFzaW9uV2FybmluZ3NBY2tub3dsZWRnZWQsXG4gIGZldGNoQW5kUmV2aWV3UmV3cml0ZXMsXG4gIHJlbmRlclJld3JpdGVQYW5lbCxcbiAgY29tcHV0ZVdvcmREaWZmLFxuICByZW5kZXJEaWZmSHRtbCxcbiAgcmVuZGVyUmV3cml0ZUNhcmQsXG4gIGFwcGx5UmV3cml0ZUFjdGlvbixcbiAgc2F2ZVJld3JpdGVFZGl0LFxuICB1cGRhdGVSZXdyaXRlVGFsbHksXG4gIHN1Ym1pdFJld3JpdGVEZWNpc2lvbnMsXG4gIGFjY2VwdEFsbFJld3JpdGVzLFxuICByZWplY3RBbGxSZXdyaXRlcyxcbiAgdG9nZ2xlUmV3cml0ZUNvbXBhY3RNb2RlLFxufTtcblxuc3luY1Jld3JpdGVHbG9iYWxzKCk7XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9zcGVsbC1jaGVjay5qc1xuICogU3BlbGwgJiBncmFtbWFyIGNoZWNrIHRhYjogZmV0Y2ggc2VjdGlvbnMsIHJlbmRlciBzdWdnZXN0aW9ucyxcbiAqIGFwcGx5L2Rpc21pc3MgY29ycmVjdGlvbnMsIHN1Ym1pdCBhdWRpdC5cbiAqXG4gKiBEZXBlbmRlbmNpZXMgKHJlc29sdmVkIHRocm91Z2ggZ2xvYmFsVGhpcyBhdCBydW50aW1lKTpcbiAqICAgZXNjYXBlSHRtbCwgYXBwZW5kTG9hZGluZ01lc3NhZ2UsIHJlbW92ZUxvYWRpbmdNZXNzYWdlLCBhcHBlbmRNZXNzYWdlLFxuICogICBzaG93QWxlcnRNb2RhbCwgc2hvd0NvbmZpcm1Nb2RhbCwgc2V0TG9hZGluZywgZmV0Y2hTdGF0dXMsIHNlbmRBY3Rpb24sXG4gKiAgIHNjaGVkdWxlQXRzUmVmcmVzaCwgQ1NTXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdzcGVsbC1jaGVjaycpO1xuXG5pbXBvcnQgeyBzdGF0ZU1hbmFnZXIgfSBmcm9tICcuL3N0YXRlLW1hbmFnZXIuanMnO1xuXG4vLyBNb2R1bGUtbGV2ZWwgc3RhdGVcbmxldCBzcGVsbEF1ZGl0ID0gW107XG5sZXQgX3NwZWxsQ2hlY2tDYWNoZSA9IG51bGw7XG5cbi8vIFx1MjUwMFx1MjUwMCBQb3B1bGF0ZSBzcGVsbC1jaGVjayB0YWIgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIHBvcHVsYXRlU3BlbGxDaGVja1RhYigpIHtcbiAgLy8gSWYgd2UgaGF2ZSBjYWNoZWQgcmVzdWx0cyBmcm9tIGEgcHJldmlvdXMgcnVuLCByZS1yZW5kZXIgZnJvbSBjYWNoZVxuICAvLyBpbnN0ZWFkIG9mIHJlLXJ1bm5pbmcgTGFuZ3VhZ2VUb29sIG9uIGV2ZXJ5IGJhY2stbmF2aWdhdGlvbi5cbiAgaWYgKHdpbmRvdy5fc3BlbGxDaGVja0NhY2hlKSB7XG4gICAgY29uc3QgYyA9IHdpbmRvdy5fc3BlbGxDaGVja0NhY2hlO1xuICAgIGlmIChjLnR5cGUgPT09ICd6ZXJvJykge1xuICAgICAgcmVuZGVyU3BlbGxDaGVja1plcm9TdGF0ZShjLm1lc3NhZ2UsIGMuc3RhdHNMaW5lLCBjLmN1c3RvbURpY3RTaXplKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gICAgICBjb250ZW50LmlubmVySFRNTCA9IGBcbiAgICAgICAgPGgxPlx1RDgzRFx1REQyNCBTcGVsbCAmYW1wOyBHcmFtbWFyIENoZWNrPC9oMT5cbiAgICAgICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO21hcmdpbi1ib3R0b206MjRweDtcIj5SZXZpZXcgc3BlbGxpbmcgYW5kIGdyYW1tYXIgc3VnZ2VzdGlvbnMuPC9wPlxuICAgICAgICA8ZGl2IGlkPVwic3BlbGwtcmVzdWx0c1wiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPjwvZGl2PlxuICAgICAgYDtcbiAgICAgIHJlbmRlclNwZWxsU3VnZ2VzdGlvbnMoYy5mbGFnZ2VkU2VjdGlvbnMsIGMudG90YWxTZWN0aW9ucywgYy5zdGF0cywgYy5jdXN0b21EaWN0U2l6ZSk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9jdW1lbnQtY29udGVudCcpO1xuICBjb250ZW50LmlubmVySFRNTCA9IGBcbiAgICA8aDE+XHVEODNEXHVERDI0IFNwZWxsICZhbXA7IEdyYW1tYXIgQ2hlY2s8L2gxPlxuICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDttYXJnaW4tYm90dG9tOjI0cHg7XCI+Q2hlY2tpbmcgQ1Ygc2VjdGlvbnMgZm9yIHNwZWxsaW5nIGFuZCBncmFtbWFyIGlzc3Vlc1x1MjAyNjwvcD5cbiAgICA8ZGl2IGlkPVwic3BlbGwtbG9hZGluZ1wiIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7cGFkZGluZzo0MHB4O1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImxvYWRpbmctc3Bpbm5lclwiPjwvZGl2PlxuICAgICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO21hcmdpbi10b3A6MTJweDtcIj5SdW5uaW5nIExhbmd1YWdlVG9vbCBjaGVja3NcdTIwMjY8L3A+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBpZD1cInNwZWxsLXJlc3VsdHNcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj48L2Rpdj5cbiAgYDtcbiAgc3BlbGxBdWRpdCA9IFtdO1xuICB3aW5kb3cuX3NwZWxsU3VnTWFwID0ge307XG5cbiAgdHJ5IHtcbiAgICAvLyBGZXRjaCBzZWN0aW9ucyB0byBjaGVja1xuICAgIGNvbnN0IHNlY3Rpb25zUmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvc3BlbGwtY2hlY2stc2VjdGlvbnMnKTtcbiAgICBjb25zdCBzZWN0aW9uc0RhdGEgPSBhd2FpdCBzZWN0aW9uc1Jlcy5qc29uKCk7XG4gICAgaWYgKCFzZWN0aW9uc0RhdGEub2spIHtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzcGVsbC1sb2FkaW5nJykuaW5uZXJIVE1MID0gYDxwIGNsYXNzPVwiZXJyb3ItbWVzc2FnZVwiPkZhaWxlZCB0byBsb2FkIHNlY3Rpb25zOiAke3NlY3Rpb25zRGF0YS5lcnJvciB8fCAnVW5rbm93biBlcnJvcid9PC9wPmA7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2VjdGlvbnMgPSBzZWN0aW9uc0RhdGEuc2VjdGlvbnMgfHwgW107XG4gICAgaWYgKHNlY3Rpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmVuZGVyU3BlbGxDaGVja1plcm9TdGF0ZSgnTm8gQ1Ygc2VjdGlvbnMgYXJlIGF2YWlsYWJsZSB0byBjaGVjay4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBlYWNoIHNlY3Rpb25cbiAgICBjb25zdCBmbGFnZ2VkU2VjdGlvbnMgPSBbXTtcbiAgICBjb25zdCBhZ2dyZWdhdGVTdGF0cyA9IHNlY3Rpb25zRGF0YS5hZ2dyZWdhdGVfc3RhdHMgfHwge307XG4gICAgbGV0IGluY29ycmVjdFdvcmRzID0gMDtcbiAgICBsZXQgZ3JhbW1hcklzc3VlcyA9IDA7XG4gICAgbGV0IGN1c3RvbURpY3RTaXplID0gc2VjdGlvbnNEYXRhLmN1c3RvbV9kaWN0X3NpemUgfHwgMDtcbiAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2Ygc2VjdGlvbnMpIHtcbiAgICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9zcGVsbC1jaGVjaycsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHRleHQ6IHNlY3Rpb24udGV4dCwgY29udGV4dDogc2VjdGlvbi5jb250ZXh0IH0pXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3RhdHMpIHtcbiAgICAgICAgaWYgKGRhdGEuY3VzdG9tX2RpY3Rfc2l6ZSkgY3VzdG9tRGljdFNpemUgPSBkYXRhLmN1c3RvbV9kaWN0X3NpemU7XG4gICAgICAgIGluY29ycmVjdFdvcmRzICs9IGRhdGEuc3RhdHMudW5rbm93bl93b3JkX2NvdW50IHx8IDA7XG4gICAgICAgIGdyYW1tYXJJc3N1ZXMgKz0gZGF0YS5zdGF0cy5ncmFtbWFyX2lzc3VlX2NvdW50IHx8IDA7XG4gICAgICB9XG4gICAgICBpZiAoZGF0YS5vayAmJiBkYXRhLnN1Z2dlc3Rpb25zICYmIGRhdGEuc3VnZ2VzdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICBmbGFnZ2VkU2VjdGlvbnMucHVzaCh7IHNlY3Rpb24sIHN1Z2dlc3Rpb25zOiBkYXRhLnN1Z2dlc3Rpb25zIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzcGVsbC1sb2FkaW5nJykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgIGlmIChmbGFnZ2VkU2VjdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZW5kZXJTcGVsbENoZWNrWmVyb1N0YXRlKFxuICAgICAgICAnU3BlbGwgY2hlY2sgcGFzc2VkIFx1MjAxNCBubyBpc3N1ZXMgZm91bmQuJyxcbiAgICAgICAgYnVpbGRTcGVsbFN0YXRzU3VtbWFyeSh7XG4gICAgICAgICAgdG90YWxfc2VjdGlvbnM6IHNlY3Rpb25zLmxlbmd0aCxcbiAgICAgICAgICB0b3RhbF93b3JkczogYWdncmVnYXRlU3RhdHMud29yZF9jb3VudCB8fCAwLFxuICAgICAgICAgIHVuaXF1ZV93b3JkczogYWdncmVnYXRlU3RhdHMudW5pcXVlX3dvcmRzIHx8IDAsXG4gICAgICAgICAgY3VzdG9tX2RpY3Rfd29yZHM6IGFnZ3JlZ2F0ZVN0YXRzLmN1c3RvbV9kaWN0X3dvcmRzIHx8IDAsXG4gICAgICAgICAgaW5jb3JyZWN0X3dvcmRzOiBpbmNvcnJlY3RXb3JkcyxcbiAgICAgICAgICBncmFtbWFyX2lzc3VlczogZ3JhbW1hcklzc3VlcyxcbiAgICAgICAgfSksXG4gICAgICAgIGN1c3RvbURpY3RTaXplLFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBSZW5kZXIgc3VnZ2VzdGlvbnMgcGFuZWxcbiAgICByZW5kZXJTcGVsbFN1Z2dlc3Rpb25zKGZsYWdnZWRTZWN0aW9ucywgc2VjdGlvbnMubGVuZ3RoLCB7XG4gICAgICB0b3RhbF9zZWN0aW9uczogc2VjdGlvbnMubGVuZ3RoLFxuICAgICAgdG90YWxfd29yZHM6IGFnZ3JlZ2F0ZVN0YXRzLndvcmRfY291bnQgfHwgMCxcbiAgICAgIHVuaXF1ZV93b3JkczogYWdncmVnYXRlU3RhdHMudW5pcXVlX3dvcmRzIHx8IDAsXG4gICAgICBjdXN0b21fZGljdF93b3JkczogYWdncmVnYXRlU3RhdHMuY3VzdG9tX2RpY3Rfd29yZHMgfHwgMCxcbiAgICAgIGluY29ycmVjdF93b3JkczogaW5jb3JyZWN0V29yZHMsXG4gICAgICBncmFtbWFyX2lzc3VlczogZ3JhbW1hcklzc3VlcyxcbiAgICB9LCBjdXN0b21EaWN0U2l6ZSk7XG5cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLmVycm9yKCdTcGVsbCBjaGVjayBlcnJvcjonLCBlcnIpO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzcGVsbC1sb2FkaW5nJykuaW5uZXJIVE1MID0gYDxwIHN0eWxlPVwiY29sb3I6I2VmNDQ0NDtwYWRkaW5nOjIwcHg7XCI+U3BlbGwgY2hlY2sgZmFpbGVkOiAke2Vyci5tZXNzYWdlfTwvcD5gO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBaZXJvLXN0YXRlIHNwZWxsIHN0YWdlIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiByZW5kZXJTcGVsbENoZWNrWmVyb1N0YXRlKG1lc3NhZ2UsIHN0YXRzTGluZSA9ICcnLCBjdXN0b21EaWN0U2l6ZSA9IDApIHtcbiAgd2luZG93Ll9zcGVsbENoZWNrQ2FjaGUgPSB7IHR5cGU6ICd6ZXJvJywgbWVzc2FnZSwgc3RhdHNMaW5lLCBjdXN0b21EaWN0U2l6ZSB9O1xuICBfc3BlbGxDaGVja0NhY2hlID0gd2luZG93Ll9zcGVsbENoZWNrQ2FjaGU7XG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9jdW1lbnQtY29udGVudCcpO1xuICBjb25zdCBzdGF0c1BhcnRzID0gW107XG4gIGlmIChzdGF0c0xpbmUpIHN0YXRzUGFydHMucHVzaChgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO2ZvbnQtc2l6ZTowLjk1ZW07bWFyZ2luOjhweCAwIDA7XCI+JHtlc2NhcGVIdG1sKHN0YXRzTGluZSl9PC9wPmApO1xuICBpZiAoY3VzdG9tRGljdFNpemUgPiAwKSBzdGF0c1BhcnRzLnB1c2goYDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtmb250LXNpemU6MC45ZW07bWFyZ2luOjRweCAwIDA7XCI+Q3VzdG9tIGRpY3Rpb25hcnk6ICR7Y3VzdG9tRGljdFNpemUudG9Mb2NhbGVTdHJpbmcoKX0gd29yZCR7Y3VzdG9tRGljdFNpemUgIT09IDEgPyAncycgOiAnJ308L3A+YCk7XG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjtwYWRkaW5nOjYwcHggMjBweDtcIj5cbiAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6M2VtO21hcmdpbi1ib3R0b206MTZweDtcIj5cdTI3MDU8L2Rpdj5cbiAgICAgIDxoMiBzdHlsZT1cImNvbG9yOiMxNjY1MzQ7XCI+JHtlc2NhcGVIdG1sKG1lc3NhZ2UpfTwvaDI+XG4gICAgICAke3N0YXRzUGFydHMuam9pbignXFxuJyl9XG4gICAgICA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7bWFyZ2luOjE2cHggMCAyNHB4O1wiPkNvbnRpbnVlIHdoZW4geW91IGFyZSByZWFkeSB0byBnZW5lcmF0ZSB5b3VyIENWLjwvcD5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJzdWJtaXQtYnRuXCIgb25jbGljaz1cInN1Ym1pdEVtcHR5U3BlbGxDaGVjaygpXCIgdGl0bGU9XCJHZW5lcmF0ZSBhbiBIVE1MIHByZXZpZXcgb2YgeW91ciBDViBcdTIwMTQgeW91IHdpbGwgcmV2aWV3IHRoZSBsYXlvdXQgYmVmb3JlIGZpbmFsIERPQ1gvUERGIGZpbGVzIGFyZSBwcm9kdWNlZFwiPkdlbmVyYXRlIFByZXZpZXcgXHUyMTkyPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIGA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN1Ym1pdEVtcHR5U3BlbGxDaGVjaygpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvc3BlbGwtY2hlY2stY29tcGxldGUnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBzcGVsbF9hdWRpdDogW10gfSlcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoIXJlcy5vaykge1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsIGBGYWlsZWQgdG8gc2F2ZSBzcGVsbCBjaGVjazogJHtkYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yJ31gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcHJvY2VlZCA9IGF3YWl0IF9jb25maXJtUHJvY2VlZFRvR2VuZXJhdGUoKTtcbiAgICBpZiAoIXByb2NlZWQpIHJldHVybjtcbiAgICBzdGF0ZU1hbmFnZXIubWFya0NvbnRlbnRDaGFuZ2VkKCk7XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ1x1MjcwNSBTcGVsbCBjaGVjayBjb21wbGV0ZSBcdTIwMTQgbm8gaXNzdWVzIHJlcXVpcmVkIGNoYW5nZXMuIEdlbmVyYXRpbmcgeW91ciBDVlx1MjAyNicpO1xuICAgIHNjaGVkdWxlQXRzUmVmcmVzaCgncmV2aWV3X2NoZWNrcG9pbnQnKTtcbiAgICBhd2FpdCBmZXRjaFN0YXR1cygpO1xuICAgIGF3YWl0IHNlbmRBY3Rpb24oJ2dlbmVyYXRlX2N2Jyk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCBgU3BlbGwgY2hlY2sgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIFN0YXRzIHN1bW1hcnkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIGJ1aWxkU3BlbGxTdGF0c1N1bW1hcnkoc3RhdHMgPSB7fSkge1xuICByZXR1cm4gW1xuICAgIGAkeyhzdGF0cy50b3RhbF9zZWN0aW9ucyB8fCAwKS50b0xvY2FsZVN0cmluZygpfSBzZWN0aW9uJHtzdGF0cy50b3RhbF9zZWN0aW9ucyA9PT0gMSA/ICcnIDogJ3MnfSBjaGVja2VkYCxcbiAgICBgJHsoc3RhdHMudG90YWxfd29yZHMgfHwgMCkudG9Mb2NhbGVTdHJpbmcoKX0gd29yZHNgLFxuICAgIGAkeyhzdGF0cy51bmlxdWVfd29yZHMgfHwgMCkudG9Mb2NhbGVTdHJpbmcoKX0gdW5pcXVlYCxcbiAgICBgJHsoc3RhdHMuY3VzdG9tX2RpY3Rfd29yZHMgfHwgMCkudG9Mb2NhbGVTdHJpbmcoKX0gY3VzdG9tIGRpY3Rpb25hcnkgbWF0Y2gke3N0YXRzLmN1c3RvbV9kaWN0X3dvcmRzID09PSAxID8gJycgOiAnZXMnfWAsXG4gICAgYCR7KHN0YXRzLmluY29ycmVjdF93b3JkcyB8fCAwKS50b0xvY2FsZVN0cmluZygpfSB1bmtub3duL2luY29ycmVjdGAsXG4gICAgYCR7KHN0YXRzLmdyYW1tYXJfaXNzdWVzIHx8IDApLnRvTG9jYWxlU3RyaW5nKCl9IGdyYW1tYXIgaXNzdWUke3N0YXRzLmdyYW1tYXJfaXNzdWVzID09PSAxID8gJycgOiAncyd9YCxcbiAgXS5qb2luKCcgXHUwMEI3ICcpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgUmVuZGVyIHN1Z2dlc3Rpb25zIHBhbmVsIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiByZW5kZXJTcGVsbFN1Z2dlc3Rpb25zKGZsYWdnZWRTZWN0aW9ucywgdG90YWxTZWN0aW9ucywgc3RhdHMgPSB7fSwgY3VzdG9tRGljdFNpemUgPSAwKSB7XG4gIHdpbmRvdy5fc3BlbGxDaGVja0NhY2hlID0geyB0eXBlOiAnc3VnZ2VzdGlvbnMnLCBmbGFnZ2VkU2VjdGlvbnMsIHRvdGFsU2VjdGlvbnMsIHN0YXRzLCBjdXN0b21EaWN0U2l6ZSB9O1xuICBfc3BlbGxDaGVja0NhY2hlID0gd2luZG93Ll9zcGVsbENoZWNrQ2FjaGU7XG4gIGNvbnN0IHJlc3VsdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3BlbGwtcmVzdWx0cycpO1xuICByZXN1bHRzLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgY29uc3Qgc3RhdHNMaW5lID0gYnVpbGRTcGVsbFN0YXRzU3VtbWFyeShzdGF0cyk7XG5cbiAgbGV0IGh0bWwgPSBgXG4gICAgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2ZlZjljMztib3JkZXI6MXB4IHNvbGlkICNmZGUwNDc7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzoxMnB4IDE2cHg7bWFyZ2luLWJvdHRvbToyNHB4O1wiPlxuICAgICAgPHN0cm9uZz5cdTI2QTAgJHtmbGFnZ2VkU2VjdGlvbnMucmVkdWNlKCh0LCBmKSA9PiB0ICsgZi5zdWdnZXN0aW9ucy5sZW5ndGgsIDApfSBpc3N1ZSR7ZmxhZ2dlZFNlY3Rpb25zLnJlZHVjZSgodCwgZikgPT4gdCArIGYuc3VnZ2VzdGlvbnMubGVuZ3RoLCAwKSAhPT0gMSA/ICdzJyA6ICcnfTwvc3Ryb25nPiBmb3VuZFxuICAgICAgYWNyb3NzICR7ZmxhZ2dlZFNlY3Rpb25zLmxlbmd0aH0gb2YgJHt0b3RhbFNlY3Rpb25zfSBzZWN0aW9uJHt0b3RhbFNlY3Rpb25zICE9PSAxID8gJ3MnIDogJyd9LlxuICAgICAgUmV2aWV3IGVhY2ggc3VnZ2VzdGlvbiBiZWxvdywgdGhlbiBjbGljayA8c3Ryb25nPkRvbmU8L3N0cm9uZz4uXG4gICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDo4cHg7Zm9udC1zaXplOjAuOTJlbTtjb2xvcjojNmI3MjgwO1wiPiR7ZXNjYXBlSHRtbChzdGF0c0xpbmUpfTwvZGl2PlxuICAgICAgJHtjdXN0b21EaWN0U2l6ZSA+IDAgPyBgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6NHB4O2ZvbnQtc2l6ZTowLjg4ZW07Y29sb3I6IzZiNzI4MDtcIj5DdXN0b20gZGljdGlvbmFyeSBzaXplOiAke2N1c3RvbURpY3RTaXplLnRvTG9jYWxlU3RyaW5nKCl9IHdvcmQke2N1c3RvbURpY3RTaXplICE9PSAxID8gJ3MnIDogJyd9PC9kaXY+YCA6ICcnfVxuICAgIDwvZGl2PlxuICBgO1xuXG4gIGNvbnN0IF9zdWdTZXZlcml0eSA9IChzdWcpID0+IHtcbiAgICBjb25zdCByaWQgPSAoc3VnLnJ1bGVfaWQgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgY2F0ID0gKHN1Zy5jYXRlZ29yeSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoL3NwZWxsfHR5cG98bWlzc3BlbGwvLnRlc3QocmlkKSB8fCAvdHlwby8udGVzdChjYXQpKSByZXR1cm4gMDtcbiAgICBpZiAoL2dyYW1tYXJ8YWdyZWVtZW50fHZlcmJ8dGVuc2V8YXJ0aWNsZS8udGVzdChyaWQpIHx8IC9ncmFtbWFyLy50ZXN0KGNhdCkpIHJldHVybiAxO1xuICAgIGlmICgvc3R5bGV8cmVkdW5kYW58d29yZHkvLnRlc3QocmlkKSB8fCAvc3R5bGUvLnRlc3QoY2F0KSkgcmV0dXJuIDI7XG4gICAgcmV0dXJuIDM7XG4gIH07XG5cbiAgZmxhZ2dlZFNlY3Rpb25zLmZvckVhY2goKHsgc2VjdGlvbiwgc3VnZ2VzdGlvbnM6IHJhd1N1Z2dlc3Rpb25zIH0pID0+IHtcbiAgICBjb25zdCBzdWdnZXN0aW9ucyA9IFsuLi5yYXdTdWdnZXN0aW9uc10uc29ydCgoYSwgYikgPT4gX3N1Z1NldmVyaXR5KGEpIC0gX3N1Z1NldmVyaXR5KGIpKTtcbiAgICBodG1sICs9IGA8ZGl2IGNsYXNzPVwicmV2aWV3LXNlY3Rpb25cIiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MjRweDtcIj5cbiAgICAgIDxoMyBzdHlsZT1cImZvbnQtc2l6ZToxZW07Zm9udC13ZWlnaHQ6NzAwO2NvbG9yOiMzNzQxNTE7bWFyZ2luLWJvdHRvbToxMnB4O1wiPiR7ZXNjYXBlSHRtbChzZWN0aW9uLmxhYmVsKX08L2gzPlxuICAgICAgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2Y4ZmFmYztib3JkZXI6MXB4IHNvbGlkICNlMmU4ZjA7Ym9yZGVyLXJhZGl1czo2cHg7cGFkZGluZzoxMHB4IDE0cHg7bWFyZ2luLWJvdHRvbToxMHB4O2ZvbnQtc2l6ZTowLjllbTt3aGl0ZS1zcGFjZTpwcmUtd3JhcDtcIj4ke2VzY2FwZUh0bWwoc2VjdGlvbi50ZXh0KX08L2Rpdj5cbiAgICBgO1xuICAgIHN1Z2dlc3Rpb25zLmZvckVhY2goKHN1ZywgaWR4KSA9PiB7XG4gICAgICBjb25zdCBzdWdJZCA9IGBzdWdfJHtzZWN0aW9uLmlkfV8ke2lkeH1gO1xuICAgICAgY29uc3QgcmVwcyA9IHN1Zy5yZXBsYWNlbWVudHMgfHwgW107XG4gICAgICBodG1sICs9IGBcbiAgICAgICAgPGRpdiBjbGFzcz1cInNwZWxsLXN1Z2dlc3Rpb25cIiBpZD1cIiR7c3VnSWR9XCIgZGF0YS1zZWN0aW9uLWlkPVwiJHtlc2NhcGVIdG1sKHNlY3Rpb24uaWQpfVwiIGRhdGEtaWR4PVwiJHtpZHh9XCJcbiAgICAgICAgICAgICBzdHlsZT1cImJvcmRlcjoxcHggc29saWQgI2UyZThmMDtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjEwcHggMTRweDttYXJnaW4tYm90dG9tOjhweDtiYWNrZ3JvdW5kOiNmZmY7XCI+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpmbGV4LXN0YXJ0O2dhcDoxMHB4O1wiPlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZsZXg6MTtcIj5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjg4ZW07Y29sb3I6IzZiNzI4MDttYXJnaW4tYm90dG9tOjRweDtcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cImJhY2tncm91bmQ6I2ZlZTJlMjtjb2xvcjojZGMyNjI2O2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6MXB4IDZweDtmb250LXdlaWdodDo2MDA7XCI+JHtlc2NhcGVIdG1sKHN1Zy5mbGFnZ2VkKX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJtYXJnaW4tbGVmdDo4cHg7XCI+JHtlc2NhcGVIdG1sKHN1Zy5tZXNzYWdlKX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zdHlsZTppdGFsaWM7Zm9udC1zaXplOjAuODVlbTtjb2xvcjojMzc0MTUxO21hcmdpbi1ib3R0b206OHB4O1wiPiR7ZXNjYXBlSHRtbChzdWcuc25pcHBldCl9PC9kaXY+XG4gICAgICAgICAgICAgICR7cmVwcy5sZW5ndGggPiAwID8gYFxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2ZsZXgtd3JhcDp3cmFwO2dhcDo2cHg7bWFyZ2luLWJvdHRvbTo4cHg7XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC44MmVtO2NvbG9yOiM2YjcyODA7YWxpZ24tc2VsZjpjZW50ZXI7XCI+U3VnZ2VzdGlvbnM6PC9zcGFuPlxuICAgICAgICAgICAgICAgICR7cmVwcy5tYXAoKHIsIHJpKSA9PiBgPGJ1dHRvbiBjbGFzcz1cInJld3JpdGUta2V5d29yZFwiIG9uY2xpY2s9XCJhcHBseVNwZWxsUmVwbGFjZW1lbnQoJyR7ZXNjYXBlSHRtbChzZWN0aW9uLmlkKX0nLCAke2lkeH0sICR7cml9KVwiXG4gICAgICAgICAgICAgICAgICBzdHlsZT1cImN1cnNvcjpwb2ludGVyO2JvcmRlcjoxcHggc29saWQgIzNiODJmNjtiYWNrZ3JvdW5kOiNkYmVhZmU7XCI+JHtlc2NhcGVIdG1sKHIpfTwvYnV0dG9uPmApLmpvaW4oJycpfVxuICAgICAgICAgICAgICA8L2Rpdj5gIDogJyd9XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDo2cHg7bWFyZ2luLWJvdHRvbTo4cHg7XCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJlZGl0XyR7c3VnSWR9XCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiVHlwZSBjdXN0b20gY29ycmVjdGlvblx1MjAyNlwiXG4gICAgICAgICAgICAgICAgICB2YWx1ZT1cIiR7ZXNjYXBlSHRtbChyZXBzWzBdIHx8ICcnKX1cIlxuICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmbGV4OjE7Zm9udC1zaXplOjAuODhlbTtwYWRkaW5nOjRweCA4cHg7Ym9yZGVyOjFweCBzb2xpZCAjZDFkNWRiO2JvcmRlci1yYWRpdXM6NHB4O1wiXG4gICAgICAgICAgICAgICAgICBvbmtleWRvd249XCJpZihldmVudC5rZXk9PT0nRW50ZXInKXtldmVudC5wcmV2ZW50RGVmYXVsdCgpO2FwcGx5Q3VzdG9tU3BlbGxDb3JyZWN0aW9uKCcke2VzY2FwZUh0bWwoc2VjdGlvbi5pZCl9Jywke2lkeH0pO31cIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBvbmNsaWNrPVwiYXBwbHlDdXN0b21TcGVsbENvcnJlY3Rpb24oJyR7ZXNjYXBlSHRtbChzZWN0aW9uLmlkKX0nLCR7aWR4fSlcIiB0aXRsZT1cIkFwcGx5IGN1c3RvbSBjb3JyZWN0aW9uXCIgYXJpYS1sYWJlbD1cIkFwcGx5IGN1c3RvbSBjb3JyZWN0aW9uXCI+QXBwbHk8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjhweDtmbGV4LXdyYXA6d3JhcDtcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBvbmNsaWNrPVwiZGlzbWlzc1NwZWxsU3VnZ2VzdGlvbignJHtlc2NhcGVIdG1sKHN1Z0lkKX0nLCAnJHtlc2NhcGVIdG1sKHNlY3Rpb24uaWQpfScsICR7aWR4fSwgJyR7ZXNjYXBlSHRtbChzdWcuZmxhZ2dlZCl9JylcIlxuICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIklnbm9yZSB0aGlzIHN1Z2dlc3Rpb25cIiBhcmlhLWxhYmVsPVwiSWdub3JlIHRoaXMgc3VnZ2VzdGlvblwiPklnbm9yZTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIG9uY2xpY2s9XCJhZGRTcGVsbFdvcmQoJyR7ZXNjYXBlSHRtbChzdWcuZmxhZ2dlZCl9JywgJyR7ZXNjYXBlSHRtbChzdWdJZCl9JylcIlxuICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIkFkZCB0byBjdXN0b20gZGljdGlvbmFyeVwiIGFyaWEtbGFiZWw9XCJBZGQgdG8gY3VzdG9tIGRpY3Rpb25hcnlcIj5BZGQgdG8gRGljdGlvbmFyeTwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIGA7XG4gICAgICAvLyBSZWdpc3RlciBpbiBhdWRpdCBhcyBwZW5kaW5nXG4gICAgICBpZiAoIXdpbmRvdy5fc3BlbGxTdWdNYXApIHdpbmRvdy5fc3BlbGxTdWdNYXAgPSB7fTtcbiAgICAgIHdpbmRvdy5fc3BlbGxTdWdNYXBbYCR7c2VjdGlvbi5pZH1fJHtpZHh9YF0gPSB7XG4gICAgICAgIHNlY3Rpb25faWQ6ICAgIHNlY3Rpb24uaWQsXG4gICAgICAgIGNvbnRleHRfdHlwZTogc2VjdGlvbi5jb250ZXh0LFxuICAgICAgICBsb2NhdGlvbjogICAgIHNlY3Rpb24ubGFiZWwsXG4gICAgICAgIG9yaWdpbmFsOiAgICAgc3VnLmZsYWdnZWQsXG4gICAgICAgIHN1Z2dlc3Rpb246ICAgKHJlcHNbMF0gfHwgJycpLFxuICAgICAgICBvZmZzZXQ6ICAgICAgIHN1Zy5vZmZzZXQsXG4gICAgICAgIGxlbmd0aDogICAgICAgc3VnLmxlbmd0aCxcbiAgICAgICAgcnVsZTogICAgICAgICBzdWcucnVsZV9pZCB8fCAnJyxcbiAgICAgICAgb3V0Y29tZTogICAgICAncGVuZGluZycsXG4gICAgICAgIGZpbmFsOiAgICAgICAgc3VnLmZsYWdnZWQsXG4gICAgICB9O1xuICAgIH0pO1xuICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gIH0pO1xuXG4gIGh0bWwgKz0gYFxuICAgIDxkaXYgY2xhc3M9XCJuYXYtYnV0dG9uc1wiIHN0eWxlPVwibWFyZ2luOjI0cHggMDtcIj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJzdWJtaXQtYnRuXCIgb25jbGljaz1cInN1Ym1pdFNwZWxsQ2hlY2tEZWNpc2lvbnMoKVwiPkdlbmVyYXRlIFByZXZpZXcgXHUyMTkyPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIGA7XG4gIHJlc3VsdHMuaW5uZXJIVE1MID0gaHRtbDtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEFwcGx5IC8gZGlzbWlzcyBjb3JyZWN0aW9ucyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gYXBwbHlDdXN0b21TcGVsbENvcnJlY3Rpb24oc2VjdGlvbklkLCBpZHgpIHtcbiAgY29uc3Qga2V5ICAgID0gYCR7c2VjdGlvbklkfV8ke2lkeH1gO1xuICBjb25zdCBlbnRyeSAgPSAod2luZG93Ll9zcGVsbFN1Z01hcCB8fCB7fSlba2V5XTtcbiAgaWYgKCFlbnRyeSkgcmV0dXJuO1xuICBjb25zdCBpbnB1dCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgZWRpdF9zdWdfJHtzZWN0aW9uSWR9XyR7aWR4fWApO1xuICBjb25zdCBjdXN0b20gPSBpbnB1dCA/IGlucHV0LnZhbHVlLnRyaW0oKSA6ICcnO1xuICBpZiAoIWN1c3RvbSkgcmV0dXJuO1xuICBlbnRyeS5vdXRjb21lID0gJ2FjY2VwdCc7XG4gIGVudHJ5LmZpbmFsICAgPSBjdXN0b207XG4gIGNvbnN0IHN1Z0VsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgLnNwZWxsLXN1Z2dlc3Rpb25bZGF0YS1zZWN0aW9uLWlkPVwiJHtDU1MuZXNjYXBlKHNlY3Rpb25JZCl9XCJdW2RhdGEtaWR4PVwiJHtpZHh9XCJdYCk7XG4gIGlmICghc3VnRWwpIHJldHVybjtcbiAgY29uc3QgZmxhZ2dlZFNwYW4gPSBzdWdFbC5xdWVyeVNlbGVjdG9yKCdzcGFuW3N0eWxlKj1cImJhY2tncm91bmQ6I2ZlZTJlMlwiXScpO1xuICBpZiAoZmxhZ2dlZFNwYW4pIHtcbiAgICBmbGFnZ2VkU3Bhbi5vdXRlckhUTUwgPSBgPGRlbCBzdHlsZT1cImNvbG9yOiNkYzI2MjY7XCI+JHtlc2NhcGVIdG1sKGVudHJ5Lm9yaWdpbmFsKX08L2RlbD4gXHUyMTkyIDxpbnMgc3R5bGU9XCJjb2xvcjojMTY2NTM0O3RleHQtZGVjb3JhdGlvbjpub25lO1wiPiR7ZXNjYXBlSHRtbChjdXN0b20pfTwvaW5zPmA7XG4gIH1cbiAgc3VnRWwuc3R5bGUub3BhY2l0eSA9ICcwLjUnO1xufVxuXG5mdW5jdGlvbiBhcHBseVNwZWxsUmVwbGFjZW1lbnQoc2VjdGlvbklkLCBpZHgsIHJlcElkeCkge1xuICBjb25zdCBrZXkgID0gYCR7c2VjdGlvbklkfV8ke2lkeH1gO1xuICBjb25zdCBlbnRyeSA9ICh3aW5kb3cuX3NwZWxsU3VnTWFwIHx8IHt9KVtrZXldO1xuICBpZiAoIWVudHJ5KSByZXR1cm47XG4gIC8vIFRoZSByZXBsYWNlbWVudHMgbGlzdCBpcyBub3QgZGlyZWN0bHkgYWNjZXNzaWJsZSBoZXJlIFx1MjAxNCByZWFkIGZyb20gRE9NIHN1Z2dlc3Rpb25cbiAgY29uc3Qgc3VnRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuc3BlbGwtc3VnZ2VzdGlvbltkYXRhLXNlY3Rpb24taWQ9XCIke0NTUy5lc2NhcGUoc2VjdGlvbklkKX1cIl1bZGF0YS1pZHg9XCIke2lkeH1cIl1gKTtcbiAgaWYgKCFzdWdFbCkgcmV0dXJuO1xuICBjb25zdCBidXR0b25zID0gc3VnRWwucXVlcnlTZWxlY3RvckFsbCgnLnJld3JpdGUta2V5d29yZCcpO1xuICBjb25zdCByZXAgPSBidXR0b25zW3JlcElkeF0gPyBidXR0b25zW3JlcElkeF0udGV4dENvbnRlbnQudHJpbSgpIDogJyc7XG4gIGVudHJ5Lm91dGNvbWUgPSAnYWNjZXB0JztcbiAgZW50cnkuZmluYWwgICA9IHJlcDtcbiAgLy8gVmlzdWFsIGZlZWRiYWNrOiBzdHJpa2UgdGhlIGZsYWdnZWQgd29yZCwgc2hvdyByZXBsYWNlbWVudFxuICBjb25zdCBmbGFnZ2VkU3BhbiA9IHN1Z0VsLnF1ZXJ5U2VsZWN0b3IoJ3NwYW5bc3R5bGUqPVwiYmFja2dyb3VuZDojZmVlMmUyXCJdJyk7XG4gIGlmIChmbGFnZ2VkU3Bhbikge1xuICAgIGZsYWdnZWRTcGFuLm91dGVySFRNTCA9IGA8ZGVsIHN0eWxlPVwiY29sb3I6I2RjMjYyNjtcIj4ke2VzY2FwZUh0bWwoZW50cnkub3JpZ2luYWwpfTwvZGVsPiBcdTIxOTIgPGlucyBzdHlsZT1cImNvbG9yOiMxNjY1MzQ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7XCI+JHtlc2NhcGVIdG1sKHJlcCl9PC9pbnM+YDtcbiAgfVxuICBzdWdFbC5zdHlsZS5vcGFjaXR5ID0gJzAuNSc7XG59XG5cbmZ1bmN0aW9uIGRpc21pc3NTcGVsbFN1Z2dlc3Rpb24oc3VnSWQsIHNlY3Rpb25JZCwgaWR4LCB3b3JkKSB7XG4gIGNvbnN0IGtleSAgID0gYCR7c2VjdGlvbklkfV8ke2lkeH1gO1xuICBjb25zdCBlbnRyeSA9ICh3aW5kb3cuX3NwZWxsU3VnTWFwIHx8IHt9KVtrZXldO1xuICBpZiAoZW50cnkpIHsgZW50cnkub3V0Y29tZSA9ICdyZWplY3QnOyBlbnRyeS5maW5hbCA9IHdvcmQ7IH1cbiAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzdWdJZCk7XG4gIGlmIChlbCkgZWwuc3R5bGUub3BhY2l0eSA9ICcwLjQnO1xufVxuXG5hc3luYyBmdW5jdGlvbiBhZGRTcGVsbFdvcmQod29yZCwgc3VnSWQpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9jdXN0b20tZGljdGlvbmFyeScsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHdvcmQgfSlcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzdWdJZCk7XG4gICAgICBpZiAoZWwpIHtcbiAgICAgICAgZWwuc3R5bGUub3BhY2l0eSA9ICcwLjQnO1xuICAgICAgICBjb25zdCBtc2cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgbXNnLnN0eWxlLmNzc1RleHQgPSAnY29sb3I6IzE2NjUzNDtmb250LXNpemU6MC44NWVtO21hcmdpbi10b3A6NHB4Oyc7XG4gICAgICAgIG1zZy50ZXh0Q29udGVudCA9IGBcIiR7d29yZH1cIiBhZGRlZCB0byBkaWN0aW9uYXJ5LmA7XG4gICAgICAgIGVsLmFwcGVuZENoaWxkKG1zZyk7XG4gICAgICB9XG4gICAgICAvLyBBbHNvIHJlY29yZCBpbiBhdWRpdFxuICAgICAgY29uc3QgcGFydHMgPSBzdWdJZC5yZXBsYWNlKC9ec3VnXy8sICcnKS5zcGxpdCgnXycpO1xuICAgICAgY29uc3QgaWR4ID0gcGFyc2VJbnQocGFydHMucG9wKCksIDEwKTtcbiAgICAgIGNvbnN0IHNlY3Rpb25JZCA9IHBhcnRzLmpvaW4oJ18nKTtcbiAgICAgIGNvbnN0IGtleSA9IGAke3NlY3Rpb25JZH1fJHtpZHh9YDtcbiAgICAgIGNvbnN0IGVudHJ5ID0gKHdpbmRvdy5fc3BlbGxTdWdNYXAgfHwge30pW2tleV07XG4gICAgICBpZiAoZW50cnkpIHsgZW50cnkub3V0Y29tZSA9ICdhZGRfZGljdCc7IGVudHJ5LmZpbmFsID0gd29yZDsgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLmVycm9yKCdFcnJvciBhZGRpbmcgdG8gZGljdGlvbmFyeTonLCBlcnIpO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBQcmUtZ2VuZXJhdGlvbiBjb25maXJtYXRpb24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIF9jb25maXJtUHJvY2VlZFRvR2VuZXJhdGUoKSB7XG4gIC8vIEdhdGU6IHRhZ2xpbmUgbXVzdCBiZSBleHBsaWNpdGx5IGNvbmZpcm1lZCBiZWZvcmUgZ2VuZXJhdGluZ1xuICBjb25zdCBzdGF0dXMgPSBhd2FpdCBmZXRjaFN0YXR1cygpLmNhdGNoKCgpID0+ICh7fSkpO1xuICBpZiAoIXN0YXR1cz8uZGVjaXNpb25zX2NvbmZpcm1lZD8udGFnbGluZSkge1xuICAgIGF3YWl0IHNob3dBbGVydE1vZGFsKFxuICAgICAgJ1x1MjZBMCBUYWdsaW5lIE5vdCBDb25maXJtZWQnLFxuICAgICAgJ1lvdSBtdXN0IGNvbmZpcm0geW91ciBhcHBsaWNhbnQgdGFnbGluZSBiZWZvcmUgZ2VuZXJhdGluZy5cXG5cXG5HbyB0byB0aGUgXHVEODNDXHVERkY3XHVGRTBGIFRhZ2xpbmUgdGFiIGluIEN1c3RvbWl6YXRpb25zIHRvIGNvbmZpcm0gaXQuJ1xuICAgICk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IGF0c1Njb3JlID0gc3RhdGVNYW5hZ2VyLmdldEF0c1Njb3JlKCk7XG4gIGNvbnN0IGZyZXNobmVzcyA9IHN0YXRlTWFuYWdlci5nZXRMYXlvdXRGcmVzaG5lc3MoKTtcbiAgY29uc3QgZ2VuU3RhdGUgPSBzdGF0ZU1hbmFnZXIuZ2V0R2VuZXJhdGlvblN0YXRlKCk7XG4gIGNvbnN0IGRlY2lzaW9uc0NvbmZpcm1lZCA9IHN0YXR1cz8uZGVjaXNpb25zX2NvbmZpcm1lZCB8fCB7fTtcbiAgY29uc3QgbGluZXMgPSBbJ1lvdXIgQ1YgaXMgcmVhZHkgdG8gZ2VuZXJhdGUuJ107XG4gIGlmIChhdHNTY29yZSAhPT0gbnVsbCAmJiBhdHNTY29yZSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBhdHNTY29yZS5vdmVyYWxsID09PSAnbnVtYmVyJykge1xuICAgIGxpbmVzLnB1c2goYEN1cnJlbnQgQVRTIHNjb3JlOiAke01hdGgucm91bmQoYXRzU2NvcmUub3ZlcmFsbCl9JWApO1xuICB9XG4gIGlmIChnZW5TdGF0ZS5wYWdlV2FybmluZykge1xuICAgIGNvbnN0IHBjID0gZ2VuU3RhdGUucGFnZUNvdW50RXhhY3QgPz8gZ2VuU3RhdGUucGFnZUNvdW50RXN0aW1hdGU7XG4gICAgY29uc3QgcGNMYWJlbCA9IHBjICE9PSBudWxsID8gKGdlblN0YXRlLnBhZ2VDb3VudEV4YWN0ICE9PSBudWxsID8gYCR7cGN9YCA6IGB+JHtwY31gKSA6IG51bGw7XG4gICAgY29uc3Qgb2tQYWdlID0gYXdhaXQgc2hvd0NvbmZpcm1Nb2RhbChcbiAgICAgICdcdTI2QTAgUGFnZSBDb3VudCBPdXQgb2YgUmFuZ2UnLFxuICAgICAgYFRoZSBDViBpcyBlc3RpbWF0ZWQgYXQgJHtwY0xhYmVsID8gYCR7cGNMYWJlbH0gcGFnZSR7cGMgIT09IDEgPyAncycgOiAnJ31gIDogJ2FuIHVudXN1YWwgcGFnZSBjb3VudCd9LCB3aGljaCBpcyBvdXRzaWRlIHRoZSByZWNvbW1lbmRlZCByYW5nZSBmb3IgYSBzZW5pb3IgY2FuZGlkYXRlICgyXHUyMDEzMyBwYWdlcykuXFxuXFxuQ29uc2lkZXIgYWRqdXN0aW5nIHlvdXIgbGF5b3V0IGluc3RydWN0aW9ucyBiZWZvcmUgZ2VuZXJhdGluZy5cXG5cXG5Qcm9jZWVkIGFueXdheT9gLFxuICAgICAgJ0dlbmVyYXRlIEFueXdheSdcbiAgICApO1xuICAgIGlmICghb2tQYWdlKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGZyZXNobmVzcy5pc1N0YWxlKSB7XG4gICAgbGluZXMucHVzaChgXHUyNkEwICR7ZnJlc2huZXNzLmFyaWFMYWJlbH1gKTtcbiAgfVxuICBjb25zdCByZXZpZXdlZFNlY3Rpb25zID0gWydleHBlcmllbmNlcycsICdza2lsbHMnLCAnYWNoaWV2ZW1lbnRzJ10uZmlsdGVyKGsgPT4gZGVjaXNpb25zQ29uZmlybWVkW2tdKTtcbiAgaWYgKHJldmlld2VkU2VjdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgbGluZXMucHVzaCgnXHUyNkEwIE5vIGN1c3RvbWlzYXRpb24gc2VjdGlvbnMgcmV2aWV3ZWQgXHUyMDE0IGV4cGVyaWVuY2UsIHNraWxsLCBhbmQgYWNoaWV2ZW1lbnQgc2VsZWN0aW9ucyBhcmUgYWxsIExMTSBkZWZhdWx0cy4nKTtcbiAgfVxuICBsZXQgd2Vha0J1bGxldENvdW50ID0gMCwgcGFzc2l2ZUJ1bGxldENvdW50ID0gMDtcbiAgT2JqZWN0LnZhbHVlcyh3aW5kb3cuYWNoaWV2ZW1lbnRFZGl0cyB8fCB7fSkuZm9yRWFjaChsaXN0ID0+IHtcbiAgICAobGlzdCB8fCBbXSkuZm9yRWFjaChlID0+IHtcbiAgICAgIGNvbnN0IHR4dCA9IHR5cGVvZiBlID09PSAnc3RyaW5nJyA/IGUgOiAoKGUgJiYgZS50ZXh0KSB8fCAnJyk7XG4gICAgICBpZiAoIXR4dC50cmltKCkgfHwgKGUgJiYgZS5oaWRkZW4pKSByZXR1cm47XG4gICAgICBjb25zdCB3YXJuID0gdHlwZW9mIF9hY2hWZXJiV2FybmluZyA9PT0gJ2Z1bmN0aW9uJyA/IF9hY2hWZXJiV2FybmluZyh0eHQpIDogbnVsbDtcbiAgICAgIGlmICh3YXJuPy5sZXZlbCA9PT0gJ3Bhc3NpdmUnKSBwYXNzaXZlQnVsbGV0Q291bnQrKztcbiAgICAgIGVsc2UgaWYgKHdhcm4/LmxldmVsID09PSAnd2VhaycpIHdlYWtCdWxsZXRDb3VudCsrO1xuICAgIH0pO1xuICB9KTtcbiAgaWYgKHdlYWtCdWxsZXRDb3VudCA+IDAgfHwgcGFzc2l2ZUJ1bGxldENvdW50ID4gMCkge1xuICAgIGNvbnN0IHBhcnRzID0gW107XG4gICAgaWYgKHBhc3NpdmVCdWxsZXRDb3VudCA+IDApIHBhcnRzLnB1c2goYCR7cGFzc2l2ZUJ1bGxldENvdW50fSB3aXRoIHBhc3NpdmUgdm9pY2VgKTtcbiAgICBpZiAod2Vha0J1bGxldENvdW50ID4gMCkgcGFydHMucHVzaChgJHt3ZWFrQnVsbGV0Q291bnR9IHdpdGggd2VhayBvcGVuaW5nIHZlcmIke3dlYWtCdWxsZXRDb3VudCAhPT0gMSA/ICdzJyA6ICcnfWApO1xuICAgIGxpbmVzLnB1c2goYFx1MjZBMCAke3BhcnRzLmpvaW4oJywgJyl9IGluIGV4cGVyaWVuY2UgYnVsbGV0cyBcdTIwMTQgY29uc2lkZXIgQUkgcmV3cml0ZXMgaW4gdGhlIEV4cGVyaWVuY2UgQnVsbGV0cyBlZGl0b3IuYCk7XG4gIH1cbiAgbGluZXMucHVzaCgnXFxuUHJvY2VlZD8nKTtcbiAgcmV0dXJuIHNob3dDb25maXJtTW9kYWwoJ1x1RDgzRFx1RENDNCBQcm9jZWVkIHRvIEdlbmVyYXRlPycsIGxpbmVzLmpvaW4oJ1xcbicpLCAnR2VuZXJhdGUgTm93Jyk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBTdWJtaXQgYXVkaXQgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIHN1Ym1pdFNwZWxsQ2hlY2tEZWNpc2lvbnMoKSB7XG4gIC8qIGR1Y2tmbG93OlxuICAgKiAgIGlkOiBzcGVsbF91aV9zdWJtaXRfbGl2ZVxuICAgKiAgIGtpbmQ6IHVpXG4gICAqICAgdGltZXN0YW1wOiAnMjAyNi0wNC0yMVQxODowMDowMFonXG4gICAqICAgc3RhdHVzOiBsaXZlXG4gICAqICAgaGFuZGxlczpcbiAgICogICAtIHVpOnNwZWxsLWNoZWNrLnN1Ym1pdFxuICAgKiAgIGNhbGxzOlxuICAgKiAgIC0gUE9TVCAvYXBpL3NwZWxsLWNoZWNrLWNvbXBsZXRlXG4gICAqICAgLSBQT1NUIC9hcGkvYWN0aW9uXG4gICAqICAgcmVhZHM6XG4gICAqICAgLSB3aW5kb3c6X3NwZWxsU3VnTWFwXG4gICAqICAgd3JpdGVzOlxuICAgKiAgIC0gcmVxdWVzdDpQT1NUIC9hcGkvc3BlbGwtY2hlY2stY29tcGxldGUuc3BlbGxfYXVkaXRcbiAgICogICAtIHdpbmRvdzpzcGVsbEF1ZGl0XG4gICAqICAgbm90ZXM6IENvbGxhcHNlcyByZXZpZXdlZCBzcGVsbCBzdWdnZXN0aW9ucyBpbnRvIHRoZSBjYW5vbmljYWwgc3BlbGwgYXVkaXQsIHBlcnNpc3RzIHRoYXQgYXVkaXQgaW4gc2Vzc2lvbiBzdGF0ZSwgc2hvd3MgYSBwcmUtZ2VuZXJhdGlvbiBjb25maXJtYXRpb24gbW9kYWwsIGFuZCB0aGVuIHRyaWdnZXJzIGdlbmVyYXRpb24gdXNpbmcgdGhlIGNvcnJlY3RlZCBjb250ZW50LlxuICAgKi9cbiAgLy8gQ291bnQgaXRlbXMgc3RpbGwgbWFya2VkICdwZW5kaW5nJyAobm90IGV4cGxpY2l0bHkgcmV2aWV3ZWQpXG4gIGNvbnN0IHBlbmRpbmdFbnRyaWVzID0gT2JqZWN0LnZhbHVlcyh3aW5kb3cuX3NwZWxsU3VnTWFwIHx8IHt9KS5maWx0ZXIoZSA9PiBlLm91dGNvbWUgPT09ICdwZW5kaW5nJyk7XG4gIGlmIChwZW5kaW5nRW50cmllcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgbiA9IHBlbmRpbmdFbnRyaWVzLmxlbmd0aDtcbiAgICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCBzaG93Q29uZmlybU1vZGFsKFxuICAgICAgJ1x1MjZBMCBVbnJldmlld2VkIElzc3VlcycsXG4gICAgICBgJHtufSBpc3N1ZSR7biAhPT0gMSA/ICdzIGhhdmUnIDogJyBoYXMnfSBub3QgYmVlbiByZXZpZXdlZCBhbmQgd2lsbCBiZSBpZ25vcmVkLlxcblByb2NlZWQgYW55d2F5P2AsXG4gICAgICAnUHJvY2VlZCdcbiAgICApO1xuICAgIGlmICghY29uZmlybWVkKSByZXR1cm47XG4gIH1cblxuICAvLyBDb2xsZWN0IGF1ZGl0IGZyb20gX3NwZWxsU3VnTWFwXG4gIGNvbnN0IGF1ZGl0ID0gT2JqZWN0LnZhbHVlcyh3aW5kb3cuX3NwZWxsU3VnTWFwIHx8IHt9KS5maWx0ZXIoZSA9PiBlLm91dGNvbWUgIT09ICdwZW5kaW5nJyk7XG4gIC8vIFJlbWFpbmluZyAncGVuZGluZycgaXRlbXMgYXJlIGV4cGxpY2l0bHkgYXV0by1pZ25vcmVkIGFmdGVyIGNvbmZpcm1hdGlvbiBhYm92ZVxuICBPYmplY3QudmFsdWVzKHdpbmRvdy5fc3BlbGxTdWdNYXAgfHwge30pLmZvckVhY2goZSA9PiB7XG4gICAgaWYgKGUub3V0Y29tZSA9PT0gJ3BlbmRpbmcnKSB7IGUub3V0Y29tZSA9ICdpZ25vcmUnOyBhdWRpdC5wdXNoKGUpOyB9XG4gIH0pO1xuICBzcGVsbEF1ZGl0ID0gYXVkaXQ7XG5cbiAgY29uc3QgbG9hZGluZ01zZyA9IGFwcGVuZExvYWRpbmdNZXNzYWdlKCdTYXZpbmcgc3BlbGwgY2hlY2sgZGVjaXNpb25zXHUyMDI2Jyk7XG4gIHNldExvYWRpbmcodHJ1ZSwgJ1NhdmluZyBzcGVsbC1jaGVjayBkZWNpc2lvbnNcdTIwMjYnKTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvc3BlbGwtY2hlY2stY29tcGxldGUnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBzcGVsbF9hdWRpdDogc3BlbGxBdWRpdCB9KVxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIHJlbW92ZUxvYWRpbmdNZXNzYWdlKGxvYWRpbmdNc2cpO1xuICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgIGlmICghcmVzLm9rKSB7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgYEZhaWxlZCB0byBzYXZlIHNwZWxsIGNoZWNrOiAke2RhdGEuZXJyb3IgfHwgJ1Vua25vd24gZXJyb3InfWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzdGF0ZU1hbmFnZXIubWFya0NvbnRlbnRDaGFuZ2VkKCk7XG4gICAgY29uc3QgcHJvY2VlZCA9IGF3YWl0IF9jb25maXJtUHJvY2VlZFRvR2VuZXJhdGUoKTtcbiAgICBpZiAoIXByb2NlZWQpIHJldHVybjtcbiAgICBhcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCBgXHUyNzA1IFNwZWxsIGNoZWNrIGNvbXBsZXRlIFx1MjAxNCAke3NwZWxsQXVkaXQubGVuZ3RofSBpdGVtJHtzcGVsbEF1ZGl0Lmxlbmd0aCAhPT0gMSA/ICdzJyA6ICcnfSByZXZpZXdlZC4gR2VuZXJhdGluZyB5b3VyIENWXHUyMDI2YCk7XG4gICAgc2NoZWR1bGVBdHNSZWZyZXNoKCdyZXZpZXdfY2hlY2twb2ludCcpO1xuICAgIGF3YWl0IGZldGNoU3RhdHVzKCk7XG4gICAgYXdhaXQgc2VuZEFjdGlvbignZ2VuZXJhdGVfY3YnKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmVtb3ZlTG9hZGluZ01lc3NhZ2UobG9hZGluZ01zZyk7XG4gICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsIGBTcGVsbCBjaGVjayBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgRXhwb3J0cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZXhwb3J0IHtcbiAgc3BlbGxBdWRpdCxcbiAgcG9wdWxhdGVTcGVsbENoZWNrVGFiLFxuICByZW5kZXJTcGVsbENoZWNrWmVyb1N0YXRlLFxuICBzdWJtaXRFbXB0eVNwZWxsQ2hlY2ssXG4gIGJ1aWxkU3BlbGxTdGF0c1N1bW1hcnksXG4gIHJlbmRlclNwZWxsU3VnZ2VzdGlvbnMsXG4gIGFwcGx5Q3VzdG9tU3BlbGxDb3JyZWN0aW9uLFxuICBhcHBseVNwZWxsUmVwbGFjZW1lbnQsXG4gIGRpc21pc3NTcGVsbFN1Z2dlc3Rpb24sXG4gIGFkZFNwZWxsV29yZCxcbiAgc3VibWl0U3BlbGxDaGVja0RlY2lzaW9ucyxcbn07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9kb3dubG9hZC10YWIuanNcbiAqIEZpbGUgUmV2aWV3IHRhYjogQVRTIHZhbGlkYXRpb24sIGdlbmVyYXRlZC1maWxlIGRvd25sb2FkcywgcGVyc3Vhc2lvbiBjaGVjayxcbiAqIGFuZCByZWZpbmVtZW50IHNob3J0Y3V0cy5cbiAqXG4gKiBEZXBlbmRlbmNpZXMgKHJlc29sdmVkIHRocm91Z2ggZ2xvYmFsVGhpcyBhdCBydW50aW1lKTpcbiAqICAgZXNjYXBlSHRtbCwgYmFja1RvUGhhc2VcbiAqL1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5jb25zdCBsb2cgPSBnZXRMb2dnZXIoJ2Rvd25sb2FkLXRhYicpO1xuXG5pbXBvcnQgeyBzdGF0ZU1hbmFnZXIgfSBmcm9tICcuL3N0YXRlLW1hbmFnZXIuanMnO1xuXG5mdW5jdGlvbiBfY29sbGVjdERvd25sb2FkYWJsZUZpbGVzKGN2RGF0YSA9IHt9KSB7XG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0KCk7XG4gIGNvbnN0IGZpbGVzID0gW107XG4gIGNvbnN0IHJhd0ZpbGVzID0gQXJyYXkuaXNBcnJheShjdkRhdGEuZmlsZXMpID8gY3ZEYXRhLmZpbGVzIDogW107XG4gIGNvbnN0IGNhbmRpZGF0ZUZpbGVzID0gW1xuICAgIC4uLnJhd0ZpbGVzLFxuICAgIGN2RGF0YS5maW5hbF9odG1sLFxuICAgIGN2RGF0YS5maW5hbF9wZGYsXG4gICAgY3ZEYXRhLmh0bWwsXG4gICAgY3ZEYXRhLnBkZixcbiAgICBjdkRhdGEuZG9jeCxcbiAgICBjdkRhdGEuYXRzX2RvY3gsXG4gIF0uZmlsdGVyKEJvb2xlYW4pO1xuXG4gIGZvciAoY29uc3QgZmlsZW5hbWUgb2YgY2FuZGlkYXRlRmlsZXMpIHtcbiAgICBpZiAoc2Vlbi5oYXMoZmlsZW5hbWUpKSBjb250aW51ZTtcbiAgICBzZWVuLmFkZChmaWxlbmFtZSk7XG5cbiAgICBsZXQgaWNvbiA9ICdcdUQ4M0RcdURDQzEnO1xuICAgIGxldCBkZXNjcmlwdGlvbiA9ICdHZW5lcmF0ZWQgZmlsZSc7XG4gICAgbGV0IGZvcm1hdCA9ICdvdGhlcic7XG5cbiAgICBpZiAoZmlsZW5hbWUuZW5kc1dpdGgoJy5wZGYnKSkge1xuICAgICAgaWNvbiA9IGZpbGVuYW1lLmluY2x1ZGVzKCdBVFMnKSA/ICdcdUQ4M0VcdUREMTYnIDogJ1x1RDgzRFx1RENDNCc7XG4gICAgICBkZXNjcmlwdGlvbiA9IGZpbGVuYW1lLmluY2x1ZGVzKCdBVFMnKVxuICAgICAgICA/ICdBVFMtb3B0aW1pc2VkIFBERiBcdTIwMTQgbWFjaGluZS1yZWFkYWJsZSBmb3IgYXV0b21hdGVkIHNjcmVlbmluZydcbiAgICAgICAgOiAnSHVtYW4tcmVhZGFibGUgUERGIFx1MjAxNCBmb3IgaHVtYW4gcmV2aWV3ZXJzIGFuZCBwcmludGluZyc7XG4gICAgICBmb3JtYXQgPSAncGRmJztcbiAgICB9IGVsc2UgaWYgKGZpbGVuYW1lLmVuZHNXaXRoKCcuZG9jeCcpKSB7XG4gICAgICBpY29uID0gJ1x1RDgzRFx1RENERCc7XG4gICAgICBpZiAoZmlsZW5hbWUuc3RhcnRzV2l0aCgnQ292ZXJMZXR0ZXJfJykpIHtcbiAgICAgICAgZGVzY3JpcHRpb24gPSAnQ292ZXIgbGV0dGVyIFx1MjAxNCBXb3JkIGRvY3VtZW50IGZvciB0aGUgYXBwbGljYXRpb24nO1xuICAgICAgfSBlbHNlIGlmIChmaWxlbmFtZS5zdGFydHNXaXRoKCdTY3JlZW5pbmdfJykpIHtcbiAgICAgICAgZGVzY3JpcHRpb24gPSAnU2NyZWVuaW5nIHF1ZXN0aW9uIHJlc3BvbnNlcyBcdTIwMTQgV29yZCBkb2N1bWVudCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZXNjcmlwdGlvbiA9IGZpbGVuYW1lLmluY2x1ZGVzKCdBVFMnKVxuICAgICAgICAgID8gJ0FUUy1vcHRpbWlzZWQgV29yZCBkb2N1bWVudCBcdTIwMTQga2V5d29yZC1vcHRpbWlzZWQgZm9yIGpvYiBhcHBsaWNhdGlvbnMnXG4gICAgICAgICAgOiAnSHVtYW4tcmVhZGFibGUgV29yZCBkb2N1bWVudCBcdTIwMTQgZWRpdGFibGUgZm9ybWF0JztcbiAgICAgIH1cbiAgICAgIGZvcm1hdCA9ICdkb2N4JztcbiAgICB9IGVsc2UgaWYgKGZpbGVuYW1lLmVuZHNXaXRoKCcuaHRtbCcpKSB7XG4gICAgICBpY29uID0gJ1x1RDgzQ1x1REYxMCc7XG4gICAgICBjb25zdCBpc1ByZXZpZXcgPSAvcHJldmlldy9pLnRlc3QoZmlsZW5hbWUpO1xuICAgICAgZGVzY3JpcHRpb24gPSBpc1ByZXZpZXdcbiAgICAgICAgPyAnTGF5b3V0IHByZXZpZXcgXHUyMDE0IGludGVybWVkaWF0ZSB3b3JraW5nIGZpbGUsIG5vdCBmb3Igc3VibWlzc2lvbidcbiAgICAgICAgOiAnSFRNTCBmb3JtYXQgd2l0aCBlbWJlZGRlZCBKU09OLUxEIHN0cnVjdHVyZWQgZGF0YSc7XG4gICAgICBmb3JtYXQgPSBpc1ByZXZpZXcgPyAncHJldmlldycgOiAnaHRtbCc7XG4gICAgfSBlbHNlIGlmIChmaWxlbmFtZSA9PT0gJ2pvYl9kZXNjcmlwdGlvbi50eHQnKSB7XG4gICAgICBpY29uID0gJ1x1RDgzRFx1RENDQic7XG4gICAgICBkZXNjcmlwdGlvbiA9ICdPcmlnaW5hbCBqb2IgZGVzY3JpcHRpb24gcmVmZXJlbmNlJztcbiAgICB9XG5cbiAgICBmaWxlcy5wdXNoKHsgZmlsZW5hbWUsIGRlc2NyaXB0aW9uLCBpY29uLCBmb3JtYXQgfSk7XG4gIH1cblxuICByZXR1cm4gZmlsZXM7XG59XG5cbmZ1bmN0aW9uIF9yZW5kZXJWYWxpZGF0aW9uU3VtbWFyeShjaGVja3MsIHN1bW1hcnksIHBhZ2VDb3VudCwgYXRzRXJyb3IpIHtcbiAgbGV0IGh0bWwgPSAnJztcblxuICBpZiAocGFnZUNvdW50ICE9PSBudWxsKSB7XG4gICAgY29uc3QgcGFnZVdhcm5pbmcgPSBwYWdlQ291bnQgPCAxLjUgfHwgcGFnZUNvdW50ID4gMztcbiAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwiZGlzcGxheTppbmxpbmUtZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDtcbiAgICAgICAgICAgICAgYmFja2dyb3VuZDoke3BhZ2VXYXJuaW5nID8gJyNmZWY5YzMnIDogJyNmMGZkZjQnfTtcbiAgICAgICAgICAgICAgYm9yZGVyOjFweCBzb2xpZCAke3BhZ2VXYXJuaW5nID8gJyNmZGUwNDcnIDogJyNiYmY3ZDAnfTtcbiAgICAgICAgICAgICAgYm9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzo4cHggMTRweDttYXJnaW4tYm90dG9tOjE2cHg7XCI+XG4gICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZToxLjNlbTtcIj5cdUQ4M0RcdURDQzQ8L3NwYW4+XG4gICAgICA8c3Ryb25nPiR7cGFnZUNvdW50fSBwYWdlJHtwYWdlQ291bnQgIT09IDEgPyAncycgOiAnJ308L3N0cm9uZz5cbiAgICAgICR7cGFnZVdhcm5pbmdcbiAgICAgICAgPyAnPHNwYW4gc3R5bGU9XCJjb2xvcjojZDk3NzA2O2ZvbnQtc2l6ZTowLjg4ZW07XCI+XHUyNkEwIFNlbmlvciBjYW5kaWRhdGUgdGFyZ2V0IGlzIDJcdTIwMTMzIHBhZ2VzPC9zcGFuPidcbiAgICAgICAgOiAnPHNwYW4gc3R5bGU9XCJjb2xvcjojMTY2NTM0O2ZvbnQtc2l6ZTowLjg4ZW07XCI+XHUyNzEzIEdvb2QgbGVuZ3RoPC9zcGFuPid9XG4gICAgPC9kaXY+YDtcbiAgfVxuXG4gIGlmIChhdHNFcnJvcikge1xuICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZWUyZTI7Ym9yZGVyOjFweCBzb2xpZCAjZmNhNWE1O2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MTJweCAxNnB4O21hcmdpbi1ib3R0b206MjBweDtcIj5cbiAgICAgIDxzdHJvbmc+XHUyNkEwIEFUUyB2YWxpZGF0aW9uIGVycm9yOjwvc3Ryb25nPiAke2VzY2FwZUh0bWwoYXRzRXJyb3IpfVxuICAgIDwvZGl2PmA7XG4gICAgcmV0dXJuIGh0bWw7XG4gIH1cblxuICBpZiAoIWNoZWNrcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gaHRtbDtcbiAgfVxuXG4gIGNvbnN0IGtleXdvcmRGYWlsID0gY2hlY2tzLnNvbWUoKGNoZWNrKSA9PiBjaGVjay5uYW1lID09PSAnYXRzX2tleXdvcmRfcHJlc2VuY2UnICYmIGNoZWNrLnN0YXR1cyA9PT0gJ2ZhaWwnKTtcbiAgY29uc3Qgc3RhdHVzQ29sb3VyID0gc3VtbWFyeS5mYWlsID4gMCA/ICcjZGMyNjI2JyA6IHN1bW1hcnkud2FybiA+IDAgPyAnI2Q5NzcwNicgOiAnIzE2NjUzNCc7XG4gIGNvbnN0IHN0YXR1c0ljb24gPSBzdW1tYXJ5LmZhaWwgPiAwID8gJ1x1Mjc0QycgOiBzdW1tYXJ5Lndhcm4gPiAwID8gJ1x1MjZBMCcgOiAnXHUyNzA1JztcblxuICBodG1sICs9IGBcbiAgICA8ZGV0YWlscyBvcGVuIHN0eWxlPVwibWFyZ2luLWJvdHRvbToyMHB4O1wiPlxuICAgICAgPHN1bW1hcnkgc3R5bGU9XCJjdXJzb3I6cG9pbnRlcjtmb250LXdlaWdodDo3MDA7Zm9udC1zaXplOjFlbTtwYWRkaW5nOjhweCAwO2NvbG9yOiR7c3RhdHVzQ29sb3VyfTtcIj5cbiAgICAgICAgJHtzdGF0dXNJY29ufSBBVFMgUmVwb3J0IFx1MjAxNCAke3N1bW1hcnkucGFzc30gcGFzcywgJHtzdW1tYXJ5Lndhcm59IHdhcm4sICR7c3VtbWFyeS5mYWlsfSBmYWlsXG4gICAgICA8L3N1bW1hcnk+XG4gICAgICA8dGFibGUgY2xhc3M9XCJyZXZpZXctdGFibGVcIiBzdHlsZT1cIm1hcmdpbi10b3A6MTBweDtmb250LXNpemU6MC44N2VtO1wiPlxuICAgICAgICA8dGhlYWQ+PHRyPjx0aD5DaGVjazwvdGg+PHRoPkZvcm1hdDwvdGg+PHRoPlN0YXR1czwvdGg+PHRoPkRldGFpbDwvdGg+PC90cj48L3RoZWFkPlxuICAgICAgICA8dGJvZHk+YDtcblxuICBmb3IgKGNvbnN0IGNoZWNrIG9mIGNoZWNrcykge1xuICAgIGNvbnN0IGJhY2tncm91bmQgPSBjaGVjay5zdGF0dXMgPT09ICdwYXNzJyA/ICcjZjBmZGY0JyA6IGNoZWNrLnN0YXR1cyA9PT0gJ3dhcm4nID8gJyNmZWY5YzMnIDogJyNmZWUyZTInO1xuICAgIGNvbnN0IGljb24gPSBjaGVjay5zdGF0dXMgPT09ICdwYXNzJyA/ICdcdTI3MDUnIDogY2hlY2suc3RhdHVzID09PSAnd2FybicgPyAnXHUyNkEwJyA6ICdcdTI3NEMnO1xuICAgIGNvbnN0IGZvcm1hdEJhZGdlID0gYDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjExcHg7YmFja2dyb3VuZDojZTBlN2ZmO2NvbG9yOiMzNzMwYTM7Ym9yZGVyLXJhZGl1czo2cHg7cGFkZGluZzoxcHggNXB4O1wiPiR7ZXNjYXBlSHRtbChjaGVjay5mb3JtYXQpfTwvc3Bhbj5gO1xuXG4gICAgaHRtbCArPSBgPHRyIHN0eWxlPVwiYmFja2dyb3VuZDoke2JhY2tncm91bmR9O1wiPlxuICAgICAgPHRkIHN0eWxlPVwiZm9udC13ZWlnaHQ6NjAwO1wiPiR7ZXNjYXBlSHRtbChjaGVjay5sYWJlbCl9PC90ZD5cbiAgICAgIDx0ZD4ke2Zvcm1hdEJhZGdlfTwvdGQ+XG4gICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjtcIj4ke2ljb259PC90ZD5cbiAgICAgIDx0ZD48c21hbGw+JHtlc2NhcGVIdG1sKGNoZWNrLmRldGFpbCl9PC9zbWFsbD48L3RkPlxuICAgIDwvdHI+YDtcbiAgfVxuXG4gIGh0bWwgKz0gJzwvdGJvZHk+PC90YWJsZT48L2RldGFpbHM+JztcblxuICBpZiAoc3VtbWFyeS5mYWlsID4gMCkge1xuICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZWUyZTI7Ym9yZGVyOjFweCBzb2xpZCAjZmNhNWE1O2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MTBweCAxNnB4O21hcmdpbi1ib3R0b206MjBweDtcIj5cbiAgICAgIDxzdHJvbmc+XHUyNzRDIEZpeCByZXF1aXJlZDo8L3N0cm9uZz4gU29tZSBjaGVja3MgZmFpbGVkLiBCbG9ja2VkIGZvcm1hdHMgYXJlIGdyZXllZCBvdXQgYmVsb3cuXG4gICAgICAke2tleXdvcmRGYWlsXG4gICAgICAgID8gJzxicj48c3Ryb25nPkFUUyBrZXl3b3JkIGZhaWx1cmUgYmxvY2tzIGFsbCBkb3dubG9hZHM8L3N0cm9uZz4gXHUyMDE0IHJlLXJ1biBjdXN0b21pc2F0aW9ucyB0byBpbXByb3ZlIGtleXdvcmQgY292ZXJhZ2UuJ1xuICAgICAgICA6ICcnfVxuICAgIDwvZGl2PmA7XG4gIH1cblxuICByZXR1cm4gaHRtbDtcbn1cblxuLy8gQ2hlY2tzIHRoYXQgYXJlIGFkdmlzb3J5IG9ubHkgXHUyMDE0IHRoZXkgd2FybiBidXQgbmV2ZXIgYmxvY2sgdGhlIGRvd25sb2FkIGJ1dHRvbi5cbi8vIE9ubHkgZ2VudWluZWx5IGNyaXRpY2FsIGZhaWx1cmVzIChmaWxlIG5vdCBmb3VuZCwgUERGIHVucmVhZGFibGUsIGJyb2tlbiBvdXRwdXQpXG4vLyBzaG91bGQgcHJldmVudCBhIHVzZXIgZnJvbSBkb3dubG9hZGluZy5cbmNvbnN0IF9OT05fQkxPQ0tJTkdfQ0hFQ0tTID0gbmV3IFNldChbXG4gICdjdl9wYWdlX2NvdW50JywgICAgICAgICAgICAgICAvLyBhZHZpc29yeTogcGFnZSBsZW5ndGggb3V0c2lkZSBpZGVhbCByYW5nZVxuICAncGRmX3VzX2xldHRlcicsICAgICAgICAgICAgICAgLy8gYWR2aXNvcnk6IHBhZ2Ugc2l6ZVxuICAnZG9jeF96ZXJvX3NoYXBlcycsICAgICAgICAgICAgLy8gYWR2aXNvcnk6IEFUUyBmb3JtYXR0aW5nIGhpbnRcbiAgJ2RvY3hfc3RhbmRhcmRfaGVhZGluZ3MnLCAgICAgIC8vIGFkdmlzb3J5OiBBVFMgaGVhZGluZyB0ZXh0XG4gICdkb2N4X2hlYWRpbmcxX3ByZXNlbnQnLCAgICAgICAvLyBhZHZpc29yeTogQVRTIGhlYWRpbmcgc3R5bGVcbiAgJ2RvY3hfZGF0ZV9mb3JtYXRfY29uc2lzdGVudCcsIC8vIGFkdmlzb3J5OiBkYXRlIGZvcm1hdCBjb25zaXN0ZW5jeVxuICAnZG9jeF9wdWJsaWNhdGlvbnNfaGVhZGluZycsICAgLy8gYWR2aXNvcnk6IHB1YmxpY2F0aW9ucyBoZWFkaW5nIHRleHRcbiAgJ2h0bWxfanNvbmxkX3ZhbGlkX3BlcnNvbicsICAgIC8vIGFkdmlzb3J5OiBKU09OLUxEIHNjaGVtYSB0eXBlXG4gICdodG1sX2pzb25sZF9rbm93c19hYm91dCcsICAgICAvLyBhZHZpc29yeTogSlNPTi1MRCBza2lsbHMgcG9wdWxhdGlvblxuXSk7XG5cbmZ1bmN0aW9uIF9yZW5kZXJEb3dubG9hZEdyaWQoZmlsZXMsIGNoZWNrcywgc3VtbWFyeSwgZ2VuZXJhdGVkQXQgPSBudWxsLCBnZW5lcmF0aW9uUnVuID0gbnVsbCkge1xuICBjb25zdCBrZXl3b3JkRmFpbCA9IGNoZWNrcy5zb21lKChjaGVjaykgPT4gY2hlY2submFtZSA9PT0gJ2F0c19rZXl3b3JkX3ByZXNlbmNlJyAmJiBjaGVjay5zdGF0dXMgPT09ICdmYWlsJyk7XG4gIGNvbnN0IGlzQ3JpdGljYWxGYWlsID0gKGNoZWNrKSA9PiBjaGVjay5zdGF0dXMgPT09ICdmYWlsJyAmJiAhX05PTl9CTE9DS0lOR19DSEVDS1MuaGFzKGNoZWNrLm5hbWUpO1xuICBjb25zdCBibG9ja0RvY3ggPSBrZXl3b3JkRmFpbCB8fCBjaGVja3Muc29tZSgoY2hlY2spID0+IGNoZWNrLmZvcm1hdCA9PT0gJ2RvY3gnICYmIGlzQ3JpdGljYWxGYWlsKGNoZWNrKSk7XG4gIGNvbnN0IGJsb2NrSHRtbCA9IGtleXdvcmRGYWlsIHx8IGNoZWNrcy5zb21lKChjaGVjaykgPT4gY2hlY2suZm9ybWF0ID09PSAnaHRtbCcgJiYgaXNDcml0aWNhbEZhaWwoY2hlY2spKTtcbiAgY29uc3QgYmxvY2tQZGYgID0ga2V5d29yZEZhaWwgfHwgY2hlY2tzLnNvbWUoKGNoZWNrKSA9PiBjaGVjay5mb3JtYXQgPT09ICdwZGYnICAmJiBpc0NyaXRpY2FsRmFpbChjaGVjaykpO1xuXG4gIGxldCBnZW5lcmF0ZWRMYWJlbCA9ICcnO1xuICBpZiAoZ2VuZXJhdGVkQXQpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZCA9IG5ldyBEYXRlKGdlbmVyYXRlZEF0KTtcbiAgICAgIGNvbnN0IGRhdGVTdHIgPSBkLnRvTG9jYWxlU3RyaW5nKCdlbi1VUycsIHtcbiAgICAgICAgbW9udGg6ICdzaG9ydCcsIGRheTogJ251bWVyaWMnLCB5ZWFyOiAnbnVtZXJpYycsXG4gICAgICAgIGhvdXI6ICdudW1lcmljJywgbWludXRlOiAnMi1kaWdpdCcsXG4gICAgICB9KTtcbiAgICAgIGdlbmVyYXRlZExhYmVsID0gKGdlbmVyYXRpb25SdW4gJiYgZ2VuZXJhdGlvblJ1biA+IDEpXG4gICAgICAgID8gYFJ1biAjJHtnZW5lcmF0aW9uUnVufSBcdTIwMTQgJHtkYXRlU3RyfWBcbiAgICAgICAgOiBkYXRlU3RyO1xuICAgIH0gY2F0Y2ggKF8pIHsgLyogaWdub3JlICovIH1cbiAgfVxuXG4gIGxldCBodG1sID0gJzxkaXYgY2xhc3M9XCJkb3dubG9hZC1zZWN0aW9uXCI+PGRpdiBjbGFzcz1cImRvd25sb2FkLWdyaWRcIj4nO1xuICBpZiAoIWZpbGVzLmxlbmd0aCkge1xuICAgIGh0bWwgKz0gJzxwPk5vIGRvd25sb2FkYWJsZSBmaWxlcyBmb3VuZC4gUGxlYXNlIHRyeSBnZW5lcmF0aW5nIHlvdXIgQ1YgYWdhaW4uPC9wPic7XG4gICAgaHRtbCArPSAnPC9kaXY+PC9kaXY+JztcbiAgICByZXR1cm4gaHRtbDtcbiAgfVxuXG4gIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgIGNvbnN0IGJsb2NrZWQgPSAoZmlsZS5mb3JtYXQgPT09ICdkb2N4JyAmJiBibG9ja0RvY3gpXG4gICAgICB8fCAoZmlsZS5mb3JtYXQgPT09ICdodG1sJyAmJiBibG9ja0h0bWwpXG4gICAgICB8fCAoZmlsZS5mb3JtYXQgPT09ICdwZGYnICYmIGJsb2NrUGRmKTtcbiAgICBjb25zdCBibG9ja2VkU3R5bGUgPSBibG9ja2VkXG4gICAgICA/ICdjdXJzb3I6bm90LWFsbG93ZWQ7b3BhY2l0eTowLjQ7YmFja2dyb3VuZDojOWNhM2FmO2JvcmRlci1jb2xvcjojOWNhM2FmOydcbiAgICAgIDogJyc7XG4gICAgY29uc3QgYmxvY2tlZE1lc3NhZ2UgPSBibG9ja2VkXG4gICAgICA/ICc8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuNzhlbTtjb2xvcjojZGMyNjI2O21hcmdpbi10b3A6NHB4O1wiPlx1MjZENCBCbG9ja2VkIFx1MjAxNCBvdXRwdXQgZmlsZSBjb3VsZCBub3QgYmUgZ2VuZXJhdGVkPC9kaXY+J1xuICAgICAgOiAnJztcbiAgICBjb25zdCB0aW1lc3RhbXBMaW5lID0gZ2VuZXJhdGVkTGFiZWxcbiAgICAgID8gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC43NWVtO2NvbG9yOiM5Y2EzYWY7bWFyZ2luLXRvcDozcHg7XCI+R2VuZXJhdGVkICR7Z2VuZXJhdGVkTGFiZWx9PC9kaXY+YFxuICAgICAgOiAnPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjc1ZW07Y29sb3I6I2MwYzRjYzttYXJnaW4tdG9wOjNweDtcIj5Ob3QgeWV0IGdlbmVyYXRlZDwvZGl2Pic7XG5cbiAgICBjb25zdCBwcmV2aWV3QmFkZ2UgPSBmaWxlLmZvcm1hdCA9PT0gJ3ByZXZpZXcnXG4gICAgICA/ICc8c3BhbiBzdHlsZT1cImRpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbi1sZWZ0OjZweDtmb250LXNpemU6MC43NWVtO2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjojOTI0MDBlO2JhY2tncm91bmQ6I2ZlZjNjNztib3JkZXI6MXB4IHNvbGlkICNmY2QzNGQ7Ym9yZGVyLXJhZGl1czo0cHg7cGFkZGluZzoxcHggNXB4O3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtcIj5Xb3JraW5nIGZpbGUgXHUyMDE0IG5vdCBmb3Igc3VibWlzc2lvbjwvc3Bhbj4nXG4gICAgICA6ICcnO1xuXG4gICAgaHRtbCArPSBgXG4gICAgICA8ZGl2IGNsYXNzPVwiZG93bmxvYWQtaXRlbVwiIHN0eWxlPVwiJHtibG9ja2VkID8gJ29wYWNpdHk6MC43NTsnIDogJyd9JHtmaWxlLmZvcm1hdCA9PT0gJ3ByZXZpZXcnID8gJ2JvcmRlci1zdHlsZTpkYXNoZWQ7JyA6ICcnfVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZG93bmxvYWQtaWNvblwiPiR7ZmlsZS5pY29ufTwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZG93bmxvYWQtaW5mb1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkb3dubG9hZC1uYW1lXCI+JHtlc2NhcGVIdG1sKGZpbGUuZmlsZW5hbWUpfSR7cHJldmlld0JhZGdlfTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkb3dubG9hZC1kZXNjcmlwdGlvblwiPiR7ZXNjYXBlSHRtbChmaWxlLmRlc2NyaXB0aW9uKX08L2Rpdj5cbiAgICAgICAgICAke3RpbWVzdGFtcExpbmV9XG4gICAgICAgICAgJHtibG9ja2VkTWVzc2FnZX1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgICR7YmxvY2tlZFxuICAgICAgICAgID8gYDxidXR0b24gY2xhc3M9XCJidG4tZG93bmxvYWRcIiBkaXNhYmxlZCBzdHlsZT1cIiR7YmxvY2tlZFN0eWxlfVwiPkJsb2NrZWQ8L2J1dHRvbj5gXG4gICAgICAgICAgOiAoKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBfc2lkID0gdHlwZW9mIGdldFNlc3Npb25JZEZyb21VUkwgPT09ICdmdW5jdGlvbicgPyBnZXRTZXNzaW9uSWRGcm9tVVJMKCkgOiBudWxsO1xuICAgICAgICAgICAgICBjb25zdCBfc3AgID0gX3NpZCA/IGA/c2Vzc2lvbl9pZD0ke2VuY29kZVVSSUNvbXBvbmVudChfc2lkKX1gIDogJyc7XG4gICAgICAgICAgICAgIHJldHVybiBgPGEgaHJlZj1cIi9hcGkvZG93bmxvYWQvJHtlbmNvZGVVUklDb21wb25lbnQoZmlsZS5maWxlbmFtZSl9JHtfc3B9XCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1kb3dubG9hZCBkb3dubG9hZC1saW5rXCIgZG93bmxvYWQ9XCIke2VzY2FwZUh0bWwoZmlsZS5maWxlbmFtZSl9XCJcbiAgICAgICAgICAgICAgICBzdHlsZT1cInRleHQtZGVjb3JhdGlvbjpub25lO2Rpc3BsYXk6aW5saW5lLWZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7XCI+RG93bmxvYWQ8L2E+YDtcbiAgICAgICAgICAgIH0pKCl9XG4gICAgICA8L2Rpdj5gO1xuICB9XG5cbiAgaHRtbCArPSAnPC9kaXY+PC9kaXY+JztcbiAgaWYgKHN1bW1hcnkuZmFpbCA+IDAgJiYgZmlsZXMubGVuZ3RoKSB7XG4gICAgaHRtbCArPSAnPHAgc3R5bGU9XCJtYXJnaW4tdG9wOjEycHg7Y29sb3I6IzZiNzI4MDtmb250LXNpemU6MC44OGVtO1wiPkJsb2NrZWQgZm9ybWF0cyByZWZsZWN0IEFUUyB2YWxpZGF0aW9uIGZhaWx1cmVzIGZvciB0aGUgY29ycmVzcG9uZGluZyBvdXRwdXQgdHlwZXMuPC9wPic7XG4gIH1cbiAgcmV0dXJuIGh0bWw7XG59XG5cbmZ1bmN0aW9uIF9yZW5kZXJSZWZpbmVtZW50UGFuZWwoKSB7XG4gIHJldHVybiBgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6MjRweDtwYWRkaW5nOjE2cHg7YmFja2dyb3VuZDojZjhmYWZjO2JvcmRlcjoxcHggc29saWQgI2UyZThmMDtcbiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6OHB4O1wiPlxuICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbToxMHB4O2NvbG9yOiMzNzQxNTE7XCI+XHUyMUJCIEl0ZXJhdGl2ZSBSZWZpbmVtZW50PC9kaXY+XG4gICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjllbTtjb2xvcjojNmI3MjgwO21hcmdpbi1ib3R0b206MTJweDtcIj5cbiAgICAgIEdvIGJhY2sgdG8gcmVmaW5lIGFuIGVhcmxpZXIgc3RlcCBcdTIwMTQgYWxsIHByaW9yIGRlY2lzaW9ucyBhbmQgYXBwcm92YWxzIGFyZSBwcmVzZXJ2ZWQuXG4gICAgPC9kaXY+XG4gICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6MTBweDtmbGV4LXdyYXA6d3JhcDtcIj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJidG4tc2Vjb25kYXJ5XCIgb25jbGljaz1cImJhY2tUb1BoYXNlKCdjdXN0b21pemF0aW9ucycpXCIgdGl0bGU9XCJSZXR1cm4gdG8gQ3VzdG9taXNlIHN0ZXBcIj5cbiAgICAgICAgXHUyMUJCIFJlZmluZSBDdXN0b21pc2VcbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1zZWNvbmRhcnlcIiBvbmNsaWNrPVwiYmFja1RvUGhhc2UoJ3Jld3JpdGUnKVwiIHRpdGxlPVwiUmV0dXJuIHRvIFJld3JpdGUgUmV2aWV3IHN0ZXBcIj5cbiAgICAgICAgXHUyMUJCIFJlZmluZSBSZXdyaXRlc1xuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLXNlY29uZGFyeVwiIG9uY2xpY2s9XCJiYWNrVG9QaGFzZSgnYW5hbHlzaXMnKVwiIHRpdGxlPVwiUmV0dXJuIHRvIEFuYWx5c2lzIHN0ZXBcIj5cbiAgICAgICAgXHUyMUJCIFJlLWFuYWx5c2UgSm9iXG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gX2ZldGNoUGVyc3Vhc2lvbkh0bWwoKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9wZXJzdWFzaW9uLWNoZWNrJyk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICBpZiAoIXJlc3BvbnNlLm9rIHx8ICFkYXRhLm9rKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgY29uc3Qgc3VtbWFyeSA9IGRhdGEuc3VtbWFyeSB8fCB7IGZsYWdnZWQ6IDAsIHN0cm9uZ19jb3VudDogMCwgdG90YWxfYnVsbGV0czogMCB9O1xuICAgIGNvbnN0IGZpbmRpbmdzID0gQXJyYXkuaXNBcnJheShkYXRhLmZpbmRpbmdzKSA/IGRhdGEuZmluZGluZ3MgOiBbXTtcbiAgICBjb25zdCBzY29yZUNvbG9yID0gc3VtbWFyeS5mbGFnZ2VkID09PSAwID8gJyMxMGI5ODEnIDogc3VtbWFyeS5mbGFnZ2VkIDw9IDMgPyAnI2Y1OWUwYicgOiAnI2VmNDQ0NCc7XG4gICAgY29uc3Qgc2NvcmVMYWJlbCA9IHN1bW1hcnkuZmxhZ2dlZCA9PT0gMFxuICAgICAgPyAnRXhjZWxsZW50J1xuICAgICAgOiBzdW1tYXJ5LmZsYWdnZWQgPD0gM1xuICAgICAgICA/ICdHb29kIFx1MjAxNCBtaW5vciBpbXByb3ZlbWVudHMgcG9zc2libGUnXG4gICAgICAgIDogJ05lZWRzIGF0dGVudGlvbic7XG5cbiAgICBsZXQgaHRtbCA9IGA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDoyMHB4O2JvcmRlcjoxcHggc29saWQgI2UyZThmMDtib3JkZXItcmFkaXVzOjhweDtvdmVyZmxvdzpoaWRkZW47XCI+XG4gICAgICA8ZGl2IHN0eWxlPVwicGFkZGluZzoxNHB4IDE2cHg7YmFja2dyb3VuZDojZjhmYWZjO2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjthbGlnbi1pdGVtczpjZW50ZXI7Y3Vyc29yOnBvaW50ZXI7XCJcbiAgICAgICAgICAgb25jbGljaz1cInRoaXMubmV4dEVsZW1lbnRTaWJsaW5nLnN0eWxlLmRpc3BsYXk9dGhpcy5uZXh0RWxlbWVudFNpYmxpbmcuc3R5bGUuZGlzcGxheT09PSdub25lJz8nYmxvY2snOidub25lJ1wiPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC13ZWlnaHQ6NjAwO2NvbG9yOiMxZjI5Mzc7XCI+XHVEODNEXHVEQ0FBIEJ1bGxldCBQZXJzdWFzaXZlbmVzczwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cIm1hcmdpbi1sZWZ0OjEycHg7YmFja2dyb3VuZDoke3Njb3JlQ29sb3J9O2NvbG9yOiNmZmY7Ym9yZGVyLXJhZGl1czo0cHg7cGFkZGluZzoycHggOHB4O2ZvbnQtc2l6ZTowLjhlbTtcIj4ke3Njb3JlTGFiZWx9PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07Y29sb3I6IzZiNzI4MDtcIj5cbiAgICAgICAgICAke3N1bW1hcnkuc3Ryb25nX2NvdW50fS8ke3N1bW1hcnkudG90YWxfYnVsbGV0c30gc3Ryb25nIFx1MDBCNyAke3N1bW1hcnkuZmxhZ2dlZH0gZmxhZ2dlZCBcdTAwQjcgY2xpY2sgdG8gJHtzdW1tYXJ5LmZsYWdnZWQgPiAwID8gJ2V4cGFuZCcgOiAnY29sbGFwc2UnfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PmA7XG5cbiAgICBpZiAoZmluZGluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cInBhZGRpbmc6MTJweCAxNnB4O2Rpc3BsYXk6JHtzdW1tYXJ5LmZsYWdnZWQgPD0gMyA/ICdibG9jaycgOiAnbm9uZSd9O1wiPmA7XG4gICAgICBmb3IgKGNvbnN0IGZpbmRpbmcgb2YgZmluZGluZ3MpIHtcbiAgICAgICAgY29uc3Qgc2V2ZXJpdHkgPSBmaW5kaW5nLnNldmVyaXR5ID09PSAnd2FybmluZydcbiAgICAgICAgICA/IHsgYmFja2dyb3VuZDogJyNmZmY3ZWQnLCBib3JkZXI6ICcjZjU5ZTBiJywgbGFiZWw6ICdcdTI2QTAgV2FybmluZycgfVxuICAgICAgICAgIDogeyBiYWNrZ3JvdW5kOiAnI2YwZjlmZicsIGJvcmRlcjogJyMzYjgyZjYnLCBsYWJlbDogJ1x1MjEzOSBJbmZvJyB9O1xuICAgICAgICBjb25zdCB0cnVuY2F0ZWRUZXh0ID0gZmluZGluZy50ZXh0ICYmIGZpbmRpbmcudGV4dC5sZW5ndGggPiAxMjBcbiAgICAgICAgICA/IGAke2ZpbmRpbmcudGV4dC5zbGljZSgwLCAxMjApfVx1MjAyNmBcbiAgICAgICAgICA6IGZpbmRpbmcudGV4dCB8fCAnJztcbiAgICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTJweDtwYWRkaW5nOjEwcHggMTJweDtiYWNrZ3JvdW5kOiR7c2V2ZXJpdHkuYmFja2dyb3VuZH07Ym9yZGVyLWxlZnQ6M3B4IHNvbGlkICR7c2V2ZXJpdHkuYm9yZGVyfTtib3JkZXItcmFkaXVzOjAgNnB4IDZweCAwO1wiPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC44ZW07Y29sb3I6IzZiNzI4MDttYXJnaW4tYm90dG9tOjRweDtcIj5cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiYmFja2dyb3VuZDoke3NldmVyaXR5LmJvcmRlcn07Y29sb3I6I2ZmZjtib3JkZXItcmFkaXVzOjNweDtwYWRkaW5nOjFweCA2cHg7Zm9udC1zaXplOjAuOWVtO1wiPiR7c2V2ZXJpdHkubGFiZWx9PC9zcGFuPlxuICAgICAgICAgICAgQnVsbGV0ICR7KGZpbmRpbmcuYnVsbGV0X2luZGV4ID8/IDApICsgMX0ke2ZpbmRpbmcuZXhwX2lkID8gYCBcdTAwQjcgJHtlc2NhcGVIdG1sKGZpbmRpbmcuZXhwX2lkKX1gIDogJyd9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjllbTtjb2xvcjojMzc0MTUxO21hcmdpbi1ib3R0b206NnB4O1wiPlwiJHtlc2NhcGVIdG1sKHRydW5jYXRlZFRleHQpfVwiPC9kaXY+XG4gICAgICAgICAgPHVsIHN0eWxlPVwibWFyZ2luOjA7cGFkZGluZy1sZWZ0OjE4cHg7XCI+YDtcbiAgICAgICAgZm9yIChjb25zdCBpc3N1ZSBvZiBmaW5kaW5nLmlzc3VlcyB8fCBbXSkge1xuICAgICAgICAgIGh0bWwgKz0gYDxsaSBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07Y29sb3I6IzZiNzI4MDttYXJnaW4tYm90dG9tOjJweDtcIj4ke2VzY2FwZUh0bWwoaXNzdWUuc3VnZ2VzdGlvbil9PC9saT5gO1xuICAgICAgICB9XG4gICAgICAgIGh0bWwgKz0gJzwvdWw+PC9kaXY+JztcbiAgICAgIH1cbiAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgfSBlbHNlIHtcbiAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJwYWRkaW5nOjEycHggMTZweDtjb2xvcjojMTBiOTgxO2ZvbnQtc2l6ZTowLjllbTtcIj5BbGwgYnVsbGV0cyBtZWV0IHBlcnN1YXNpdmVuZXNzIGNyaXRlcmlhLjwvZGl2Pic7XG4gICAgfVxuXG4gICAgLy8gTmFycmF0aXZlLXRocmVhZCBhZHZpc29yeSAoR0FQLTI4MSlcbiAgICBjb25zdCBudGEgPSBzdW1tYXJ5Lm5hcnJhdGl2ZV90aHJlYWRfYWR2aXNvcnk7XG4gICAgaWYgKG50YSkge1xuICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cInBhZGRpbmc6MTBweCAxNnB4O2JhY2tncm91bmQ6I2ZlZjljMztib3JkZXItdG9wOjFweCBzb2xpZCAjZmRlNjhhO1wiPlxuICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtd2VpZ2h0OjYwMDtjb2xvcjojOTI0MDBlO1wiPlx1RDgzRVx1RERGNSBOYXJyYXRpdmUgZm9jdXMgYWR2aXNvcnk6PC9zcGFuPlxuICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjllbTtjb2xvcjojNzgzNTBmO21hcmdpbi1sZWZ0OjZweDtcIj4ke2VzY2FwZUh0bWwobnRhLmRldGFpbCl9PC9zcGFuPlxuICAgICAgPC9kaXY+YDtcbiAgICB9XG5cbiAgICAvLyBOYXJyYXRpdmUtYXJjIGFkdmlzb3J5IChHQVAtMTcpOiByZWNlbnQgcm9sZSBzaG91bGQgc2hvdyBzdHJvbmdlc3QgdmVyYnNcbiAgICBjb25zdCBuYWEgPSBzdW1tYXJ5Lm5hcnJhdGl2ZV9hcmNfYWR2aXNvcnk7XG4gICAgaWYgKG5hYSkge1xuICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cInBhZGRpbmc6MTBweCAxNnB4O2JhY2tncm91bmQ6I2ZmZjdlZDtib3JkZXItdG9wOjFweCBzb2xpZCAjZmVkN2FhO1wiPlxuICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtd2VpZ2h0OjYwMDtjb2xvcjojOWEzNDEyO1wiPlx1RDgzRFx1RENDOCBOYXJyYXRpdmUgYXJjIGFkdmlzb3J5Ojwvc3Bhbj5cbiAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC45ZW07Y29sb3I6IzdjMmQxMjttYXJnaW4tbGVmdDo2cHg7XCI+JHtlc2NhcGVIdG1sKG5hYS5kZXRhaWwpfTwvc3Bhbj5cbiAgICAgIDwvZGl2PmA7XG4gICAgfVxuXG4gICAgaHRtbCArPSAnPC9kaXY+JztcbiAgICByZXR1cm4gaHRtbDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cud2FybignUGVyc3Vhc2lvbiBjaGVjayBmYWlsZWQ6JywgZXJyb3IpO1xuICAgIHJldHVybiAnJztcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBwb3B1bGF0ZURvd25sb2FkVGFiKGN2RGF0YSkge1xuICBzdGF0ZU1hbmFnZXIuc2V0VGFiRGF0YSgnY3YnLCBjdkRhdGEpO1xuXG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9jdW1lbnQtY29udGVudCcpO1xuICBpZiAoIWNvbnRlbnQpIHJldHVybjtcblxuICBpZiAoIWN2RGF0YSB8fCAodHlwZW9mIGN2RGF0YSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMoY3ZEYXRhKS5sZW5ndGggPT09IDApKSB7XG4gICAgY29udGVudC5pbm5lckhUTUwgPSAnPGgxPlx1MkIwN1x1RkUwRiBEb3dubG9hZCBHZW5lcmF0ZWQgRmlsZXM8L2gxPjxkaXYgY2xhc3M9XCJlbXB0eS1zdGF0ZVwiPjxkaXYgY2xhc3M9XCJpY29uXCI+XHUyQjA3XHVGRTBGPC9kaXY+PGgzPk5vIEZpbGVzIEF2YWlsYWJsZTwvaDM+PHA+R2VuZXJhdGUgYSBDViBmaXJzdCB0byBzZWUgZG93bmxvYWQgb3B0aW9ucy48L3A+PC9kaXY+JztcbiAgICByZXR1cm47XG4gIH1cblxuICBjb250ZW50LmlubmVySFRNTCA9ICc8aDE+XHUyQjA3XHVGRTBGIERvd25sb2FkIEdlbmVyYXRlZCBGaWxlczwvaDE+PHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO21hcmdpbi1ib3R0b206MTZweDtcIj5SdW5uaW5nIEFUUyB2YWxpZGF0aW9uXHUyMDI2PC9wPic7XG5cbiAgbGV0IGNoZWNrcyA9IFtdO1xuICBsZXQgcGFnZUNvdW50ID0gbnVsbDtcbiAgbGV0IHN1bW1hcnkgPSB7IHBhc3M6IDAsIHdhcm46IDAsIGZhaWw6IDAgfTtcbiAgbGV0IGF0c0Vycm9yID0gbnVsbDtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL2F0cy12YWxpZGF0ZScpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgaWYgKGRhdGEub2spIHtcbiAgICAgIGNoZWNrcyA9IGRhdGEuY2hlY2tzIHx8IFtdO1xuICAgICAgcGFnZUNvdW50ID0gZGF0YS5wYWdlX2NvdW50ID8/IG51bGw7XG4gICAgICBzdW1tYXJ5ID0gZGF0YS5zdW1tYXJ5IHx8IHN1bW1hcnk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF0c0Vycm9yID0gZGF0YS5lcnJvciB8fCAnVmFsaWRhdGlvbiBmYWlsZWQnO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBhdHNFcnJvciA9IGBOZXR3b3JrIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YDtcbiAgfVxuXG4gIGNvbnN0IGZpbGVzID0gX2NvbGxlY3REb3dubG9hZGFibGVGaWxlcyhjdkRhdGEpO1xuICBsZXQgaHRtbCA9ICc8aDE+XHUyQjA3XHVGRTBGIEZpbGUgUmV2aWV3PC9oMT4nO1xuICBodG1sICs9ICc8cCBzdHlsZT1cImZvbnQtc2l6ZTowLjgzZW07Y29sb3I6Izk0YTNiODttYXJnaW4tYm90dG9tOjE2cHg7cGFkZGluZzo4cHggMTJweDtiYWNrZ3JvdW5kOiNmOGZhZmM7Ym9yZGVyLXJhZGl1czo2cHg7Ym9yZGVyLWxlZnQ6M3B4IHNvbGlkICNlMmU4ZjA7XCI+XHUyNzA1IDxlbT5UaGlzIGlzIHRoZSA8c3Ryb25nPmNvbXBsZXRlbmVzcyBjaGVjazwvc3Ryb25nPiBzdGVwIFx1MjAxNCBBVFMgdmFsaWRhdGlvbiBydW5zIGhlcmUgYW5kIHlvdSBjYW4gYXJjaGl2ZSB0aGUgYXBwbGljYXRpb24uIFRvIGRvd25sb2FkIGZpbGVzIGltbWVkaWF0ZWx5IGFmdGVyIGdlbmVyYXRpb24sIHVzZSB0aGUgPHN0cm9uZz5HZW5lcmF0ZWQgRmlsZXM8L3N0cm9uZz4gdGFiLjwvZW0+PC9wPic7XG4gIGh0bWwgKz0gX3JlbmRlclZhbGlkYXRpb25TdW1tYXJ5KGNoZWNrcywgc3VtbWFyeSwgcGFnZUNvdW50LCBhdHNFcnJvcik7XG5cbiAgY29uc3Qgc3VtbWFyeVdhcm5pbmdzID0gKGN2RGF0YS5tZXRhZGF0YT8uc3VtbWFyeV93YXJuaW5ncyB8fCBbXSk7XG4gIGlmIChzdW1tYXJ5V2FybmluZ3MubGVuZ3RoKSB7XG4gICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2ZlZjljMztib3JkZXI6MXB4IHNvbGlkICNmY2QzNGQ7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzoxMnB4IDE2cHg7bWFyZ2luLWJvdHRvbToxNnB4O1wiPlxuICAgICAgPHN0cm9uZz5cdTI2QTAgUHJvZmVzc2lvbmFsIFN1bW1hcnkgcXVhbGl0eSBub3RpY2VzICgke3N1bW1hcnlXYXJuaW5ncy5sZW5ndGh9KTo8L3N0cm9uZz5cbiAgICAgIDx1bCBzdHlsZT1cIm1hcmdpbjo4cHggMCAwIDA7cGFkZGluZy1sZWZ0OjE4cHg7XCI+XG4gICAgICAgICR7c3VtbWFyeVdhcm5pbmdzLm1hcCh3ID0+IGA8bGkgc3R5bGU9XCJmb250LXNpemU6MC45ZW07XCI+JHtlc2NhcGVIdG1sKHcpfTwvbGk+YCkuam9pbignJyl9XG4gICAgICA8L3VsPlxuICAgICAgPHAgc3R5bGU9XCJtYXJnaW46OHB4IDAgMDtmb250LXNpemU6MC44N2VtO2NvbG9yOiM3ODM1MGY7XCI+VGhlc2UgYXJlIGFkdmlzb3J5IHdhcm5pbmdzIFx1MjAxNCByZXZpZXcgdGhlIFN1bW1hcnkgdGFiIGlmIHlvdSB3aXNoIHRvIHVwZGF0ZSB0aGUgc3VtbWFyeSBiZWZvcmUgc3VibWl0dGluZy48L3A+XG4gICAgPC9kaXY+YDtcbiAgfVxuXG4gIGNvbnN0IHB1YmxpY2F0aW9uV2FybmluZ3MgPSAoY3ZEYXRhLm1ldGFkYXRhPy5wdWJsaWNhdGlvbl93YXJuaW5ncyB8fCBbXSk7XG4gIGlmIChwdWJsaWNhdGlvbldhcm5pbmdzLmxlbmd0aCkge1xuICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZWY5YzM7Ym9yZGVyOjFweCBzb2xpZCAjZmNkMzRkO2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MTJweCAxNnB4O21hcmdpbi1ib3R0b206MTZweDtcIj5cbiAgICAgIDxzdHJvbmc+XHUyNkEwIFB1YmxpY2F0aW9uIHZlbnVlIGluZm9ybWF0aW9uIGluY29tcGxldGUgKCR7cHVibGljYXRpb25XYXJuaW5ncy5sZW5ndGh9KTo8L3N0cm9uZz5cbiAgICAgIDx1bCBzdHlsZT1cIm1hcmdpbjo4cHggMCAwIDA7cGFkZGluZy1sZWZ0OjE4cHg7XCI+XG4gICAgICAgICR7cHVibGljYXRpb25XYXJuaW5ncy5tYXAodyA9PiBgPGxpIHN0eWxlPVwiZm9udC1zaXplOjAuOWVtO1wiPiR7ZXNjYXBlSHRtbCh3KX08L2xpPmApLmpvaW4oJycpfVxuICAgICAgPC91bD5cbiAgICAgIDxwIHN0eWxlPVwibWFyZ2luOjhweCAwIDA7Zm9udC1zaXplOjAuODdlbTtjb2xvcjojNzgzNTBmO1wiPkFkZCBtaXNzaW5nIGpvdXJuYWwgb3IgY29uZmVyZW5jZSBuYW1lcyB0byB5b3VyIE1hc3RlciBDViBiZWZvcmUgc3VibWl0dGluZyBcdTIwMTQgaW5jb21wbGV0ZSB2ZW51ZSBkZXRhaWxzIHdlYWtlbiBjcmVkaWJpbGl0eS48L3A+XG4gICAgPC9kaXY+YDtcbiAgfVxuXG4gIGNvbnN0IGxvbmdCdWxsZXRXYXJuaW5ncyA9IChjdkRhdGEubWV0YWRhdGE/LmxvbmdfYnVsbGV0X3dhcm5pbmdzIHx8IFtdKTtcbiAgaWYgKGxvbmdCdWxsZXRXYXJuaW5ncy5sZW5ndGgpIHtcbiAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZmVmOWMzO2JvcmRlcjoxcHggc29saWQgI2ZjZDM0ZDtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjEycHggMTZweDttYXJnaW4tYm90dG9tOjE2cHg7XCI+XG4gICAgICA8c3Ryb25nPlx1MjZBMCBMb25nIGJ1bGxldCBwb2ludHMgZGV0ZWN0ZWQgKCR7bG9uZ0J1bGxldFdhcm5pbmdzLmxlbmd0aH0pIFx1MjAxNCBtYXkgZXhjZWVkIDIgbGluZXM6PC9zdHJvbmc+XG4gICAgICA8dWwgc3R5bGU9XCJtYXJnaW46OHB4IDAgMCAwO3BhZGRpbmctbGVmdDoxOHB4O2xpc3Qtc3R5bGU6bm9uZTtcIj5cbiAgICAgICAgJHtsb25nQnVsbGV0V2FybmluZ3MubWFwKHcgPT4gYDxsaSBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07bWFyZ2luLWJvdHRvbTo0cHg7XCI+PHN0cm9uZz4ke2VzY2FwZUh0bWwody5jb21wYW55KX0gXHUwMEI3ICR7ZXNjYXBlSHRtbCh3LnRpdGxlKX08L3N0cm9uZz4gKCR7dy5jaGFyX2NvdW50fSBjaGFycyk8YnI+PHNwYW4gc3R5bGU9XCJjb2xvcjojNmI3MjgwO1wiPlwiJHtlc2NhcGVIdG1sKHcuYnVsbGV0X3RleHQpfVwiPC9zcGFuPjwvbGk+YCkuam9pbignJyl9XG4gICAgICA8L3VsPlxuICAgICAgPHAgc3R5bGU9XCJtYXJnaW46OHB4IDAgMDtmb250LXNpemU6MC44N2VtO2NvbG9yOiM3ODM1MGY7XCI+Q29uc2lkZXIgc2hvcnRlbmluZyB0aGVzZSBidWxsZXRzIFx1MjAxNCBhaW0gZm9yIFx1MjI2NDIwMCBjaGFyYWN0ZXJzIGVhY2ggZm9yIGNsZWFuIDItbGluZSByZW5kZXJpbmcgaW4gdGhlIERPQ1guPC9wPlxuICAgIDwvZGl2PmA7XG4gIH1cblxuICBjb25zdCBzcGFyc2VFeHBXYXJuaW5ncyA9IChjdkRhdGEubWV0YWRhdGE/LnNwYXJzZV9leHBlcmllbmNlX3dhcm5pbmdzIHx8IFtdKTtcbiAgaWYgKHNwYXJzZUV4cFdhcm5pbmdzLmxlbmd0aCkge1xuICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZWY5YzM7Ym9yZGVyOjFweCBzb2xpZCAjZmNkMzRkO2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MTJweCAxNnB4O21hcmdpbi1ib3R0b206MTZweDtcIj5cbiAgICAgIDxzdHJvbmc+XHUyNkEwIFNwYXJzZSBleHBlcmllbmNlIGVudHJpZXMgKCR7c3BhcnNlRXhwV2FybmluZ3MubGVuZ3RofSkgXHUyMDE0IGZld2VyIHRoYW4gMiBidWxsZXRzOjwvc3Ryb25nPlxuICAgICAgPHVsIHN0eWxlPVwibWFyZ2luOjhweCAwIDAgMDtwYWRkaW5nLWxlZnQ6MThweDtsaXN0LXN0eWxlOm5vbmU7XCI+XG4gICAgICAgICR7c3BhcnNlRXhwV2FybmluZ3MubWFwKHcgPT4gYDxsaSBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07bWFyZ2luLWJvdHRvbToycHg7XCI+PHN0cm9uZz4ke2VzY2FwZUh0bWwody5jb21wYW55KX0gXHUwMEI3ICR7ZXNjYXBlSHRtbCh3LnRpdGxlKX08L3N0cm9uZz4gXHUyMDE0ICR7dy5idWxsZXRfY291bnQgPT09IDAgPyAnbm8gYnVsbGV0cyBzZWxlY3RlZCcgOiAnMSBidWxsZXQgc2VsZWN0ZWQnfTwvbGk+YCkuam9pbignJyl9XG4gICAgICA8L3VsPlxuICAgICAgPHAgc3R5bGU9XCJtYXJnaW46OHB4IDAgMDtmb250LXNpemU6MC44N2VtO2NvbG9yOiM3ODM1MGY7XCI+SW5jbHVkZSBhdCBsZWFzdCAyIGJ1bGxldHMgcGVyIHJvbGUgdG8gZGVtb25zdHJhdGUgaW1wYWN0LiBSZXR1cm4gdG8gdGhlIEV4cGVyaWVuY2UgdGFiIHRvIGFkZCBtb3JlLjwvcD5cbiAgICA8L2Rpdj5gO1xuICB9XG5cbiAgY29uc3QgeWVhck9ubHlEYXRlV2FybmluZ3MgPSAoY3ZEYXRhLm1ldGFkYXRhPy55ZWFyX29ubHlfZGF0ZV93YXJuaW5ncyB8fCBbXSk7XG4gIGlmICh5ZWFyT25seURhdGVXYXJuaW5ncy5sZW5ndGgpIHtcbiAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZmVmOWMzO2JvcmRlcjoxcHggc29saWQgI2ZjZDM0ZDtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjEycHggMTZweDttYXJnaW4tYm90dG9tOjE2cHg7XCI+XG4gICAgICA8c3Ryb25nPlx1MjZBMCBZZWFyLW9ubHkgZGF0ZXMgZGV0ZWN0ZWQgKCR7eWVhck9ubHlEYXRlV2FybmluZ3MubGVuZ3RofSkgXHUyMDE0IG1vbnRoL3llYXIgZm9ybWF0IHJlY29tbWVuZGVkOjwvc3Ryb25nPlxuICAgICAgPHVsIHN0eWxlPVwibWFyZ2luOjhweCAwIDAgMDtwYWRkaW5nLWxlZnQ6MThweDtsaXN0LXN0eWxlOm5vbmU7XCI+XG4gICAgICAgICR7eWVhck9ubHlEYXRlV2FybmluZ3MubWFwKHcgPT4gYDxsaSBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07bWFyZ2luLWJvdHRvbToycHg7XCI+PHN0cm9uZz4ke2VzY2FwZUh0bWwody5jb21wYW55KX0gXHUwMEI3ICR7ZXNjYXBlSHRtbCh3LnRpdGxlKX08L3N0cm9uZz4gXHUyMDE0ICR7dy5maWVsZCA9PT0gJ3N0YXJ0X2RhdGUnID8gJ3N0YXJ0JyA6ICdlbmQnfSBkYXRlIGlzIFwiJHtlc2NhcGVIdG1sKHcuZGF0ZV92YWx1ZSl9XCI8L2xpPmApLmpvaW4oJycpfVxuICAgICAgPC91bD5cbiAgICAgIDxwIHN0eWxlPVwibWFyZ2luOjhweCAwIDA7Zm9udC1zaXplOjAuODdlbTtjb2xvcjojNzgzNTBmO1wiPlllYXItb25seSBkYXRlcyByZWR1Y2UgY2hyb25vbG9naWNhbCBwcmVjaXNpb24uIFVwZGF0ZSB0byBNb250aCBZWVlZIGZvcm1hdCAoZS5nLiBcIkphbiAyMDIwXCIpIGluIHRoZSBNYXN0ZXIgQ1YgZm9yIGJlc3QgQVRTIGNvbXBhdGliaWxpdHkuPC9wPlxuICAgIDwvZGl2PmA7XG4gIH1cblxuICBjb25zdCByZXdyaXRlQXVkaXRNaXNtYXRjaGVzID0gKGN2RGF0YS5tZXRhZGF0YT8ucmV3cml0ZV9hdWRpdF9taXNtYXRjaGVzIHx8IFtdKTtcbiAgaWYgKHJld3JpdGVBdWRpdE1pc21hdGNoZXMubGVuZ3RoKSB7XG4gICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2ZlZjJmMjtib3JkZXI6MXB4IHNvbGlkICNmY2E1YTU7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzoxMnB4IDE2cHg7bWFyZ2luLWJvdHRvbToxNnB4O1wiPlxuICAgICAgPHN0cm9uZz5cdTI2QTAgUmV3cml0ZSBjb250ZW50IG1pc21hdGNoICgke3Jld3JpdGVBdWRpdE1pc21hdGNoZXMubGVuZ3RofSkgXHUyMDE0IGFjY2VwdGVkIHJld3JpdGVzIG5vdCBmb3VuZCBpbiBnZW5lcmF0ZWQgdGV4dDo8L3N0cm9uZz5cbiAgICAgIDx1bCBzdHlsZT1cIm1hcmdpbjo4cHggMCAwIDA7cGFkZGluZy1sZWZ0OjE4cHg7bGlzdC1zdHlsZTpub25lO1wiPlxuICAgICAgICAke3Jld3JpdGVBdWRpdE1pc21hdGNoZXMubWFwKG0gPT4gYDxsaSBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07bWFyZ2luLWJvdHRvbTo2cHg7XCI+PHN0cm9uZz4ke2VzY2FwZUh0bWwobS5sb2NhdGlvbiB8fCBtLnR5cGUpfTwvc3Ryb25nPjxicj48c3BhbiBzdHlsZT1cImNvbG9yOiMzNzQxNTE7XCI+RXhwZWN0ZWQ6IDxlbT5cIiR7ZXNjYXBlSHRtbCgobS5leHBlY3RlZCB8fCAnJykuc2xpY2UoMCwgMTIwKSl9JHsobS5leHBlY3RlZCB8fCAnJykubGVuZ3RoID4gMTIwID8gJ1x1MjAyNicgOiAnJ31cIjwvZW0+PC9zcGFuPjxicj48c3BhbiBzdHlsZT1cImNvbG9yOiM5Y2EzYWY7XCI+QWN0dWFsOiA8ZW0+XCIke2VzY2FwZUh0bWwoKG0uYWN0dWFsIHx8ICcnKS5zbGljZSgwLCAxMjApKX0keyhtLmFjdHVhbCB8fCAnJykubGVuZ3RoID4gMTIwID8gJ1x1MjAyNicgOiAnJ31cIjwvZW0+PC9zcGFuPjwvbGk+YCkuam9pbignJyl9XG4gICAgICA8L3VsPlxuICAgICAgPHAgc3R5bGU9XCJtYXJnaW46OHB4IDAgMDtmb250LXNpemU6MC44N2VtO2NvbG9yOiM3ZjFkMWQ7XCI+VGhlc2UgYWNjZXB0ZWQgcmV3cml0ZXMgbWF5IG5vdCBoYXZlIGJlZW4gYXBwbGllZC4gUmUtZ2VuZXJhdGUgdGhlIENWIG9yIGNoZWNrIHRoZSByZXdyaXRlIHJldmlldyBzdGVwLjwvcD5cbiAgICA8L2Rpdj5gO1xuICB9XG5cbiAgY29uc3Qgb3ZlcmxhcFdhcm5pbmdzID0gKGN2RGF0YS5kYXRlX292ZXJsYXBfd2FybmluZ3MgfHwgW10pO1xuICBpZiAob3ZlcmxhcFdhcm5pbmdzLmxlbmd0aCkge1xuICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZWY5YzM7Ym9yZGVyOjFweCBzb2xpZCAjZmRlMDQ3O2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MTJweCAxNnB4O21hcmdpbi1ib3R0b206MTZweDtcIj5cbiAgICAgIDxzdHJvbmc+XHUyNkEwIEVtcGxveW1lbnQgZGF0ZSBvdmVybGFwcyBkZXRlY3RlZCAoJHtvdmVybGFwV2FybmluZ3MubGVuZ3RofSk6PC9zdHJvbmc+XG4gICAgICA8dWwgc3R5bGU9XCJtYXJnaW46OHB4IDAgMCAwO3BhZGRpbmctbGVmdDoxOHB4O1wiPlxuICAgICAgICAke292ZXJsYXBXYXJuaW5ncy5tYXAodyA9PiBgPGxpPjxzdHJvbmc+JHtlc2NhcGVIdG1sKHcuZW50cnlfYSl9PC9zdHJvbmc+IG92ZXJsYXBzIHdpdGggPHN0cm9uZz4ke2VzY2FwZUh0bWwody5lbnRyeV9iKX08L3N0cm9uZz48YnI+PHNtYWxsIHN0eWxlPVwiY29sb3I6IzkyNDAwZTtcIj4ke2VzY2FwZUh0bWwody5vdmVybGFwX2Rlc2NyaXB0aW9uKX08L3NtYWxsPjwvbGk+YCkuam9pbignJyl9XG4gICAgICA8L3VsPlxuICAgICAgPHAgc3R5bGU9XCJtYXJnaW46OHB4IDAgMDtmb250LXNpemU6MC44N2VtO2NvbG9yOiM3ODM1MGY7XCI+UmV2aWV3IHRoZXNlIGVudHJpZXMgaW4gdGhlIEV4cGVyaWVuY2UgdGFiIGJlZm9yZSBzdWJtaXR0aW5nIHlvdXIgYXBwbGljYXRpb24uPC9wPlxuICAgIDwvZGl2PmA7XG4gIH1cblxuICBjb25zdCBnZW5lcmF0ZWRBdCA9IGN2RGF0YS5tZXRhZGF0YT8uZ2VuZXJhdGlvbl9kYXRlID8/IG51bGw7XG4gIGNvbnN0IGdlbmVyYXRpb25SdW4gPSBjdkRhdGEubWV0YWRhdGE/LmdlbmVyYXRpb25fcnVuID8/IG51bGw7XG4gIGh0bWwgKz0gX3JlbmRlckRvd25sb2FkR3JpZChmaWxlcywgY2hlY2tzLCBzdW1tYXJ5LCBnZW5lcmF0ZWRBdCwgZ2VuZXJhdGlvblJ1bik7XG5cbiAgaWYgKGN2RGF0YS5vdXRwdXRfZGlyKSB7XG4gICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6MjBweDtwYWRkaW5nOjEycHg7YmFja2dyb3VuZDojZjFmNWY5O2JvcmRlci1yYWRpdXM6NnB4O2ZvbnQtc2l6ZToxNHB4O2NvbG9yOiM2NDc0OGI7XCI+XG4gICAgICA8c3Ryb25nPk91dHB1dCBEaXJlY3Rvcnk6PC9zdHJvbmc+ICR7ZXNjYXBlSHRtbChjdkRhdGEub3V0cHV0X2Rpcil9XG4gICAgPC9kaXY+YDtcbiAgfVxuXG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gYCR7aHRtbH08cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7bWFyZ2luLXRvcDoxNnB4O2ZvbnQtc2l6ZTowLjllbTtcIj5BbmFseXNpbmcgYnVsbGV0IHBlcnN1YXNpdmVuZXNzXHUyMDI2PC9wPmA7XG4gIGh0bWwgKz0gYXdhaXQgX2ZldGNoUGVyc3Vhc2lvbkh0bWwoKTtcbiAgaHRtbCArPSBfcmVuZGVyUmVmaW5lbWVudFBhbmVsKCk7XG4gIGh0bWwgKz0gYDxkaXYgY2xhc3M9XCJuYXYtYnV0dG9ucyBuYXYtZW5kXCIgc3R5bGU9XCJtYXJnaW4tdG9wOjE2cHg7XCI+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImNvbnRpbnVlLWJ0blwiIG9uY2xpY2s9XCJoYW5kbGVTdGVwQ2xpY2soJ2NvdmVyX2xldHRlcicpXCI+XG4gICAgICBcdUQ4M0RcdURDRTkgUHJvY2VlZCB0byBDb3ZlciBMZXR0ZXIgXHUyMTkyXG4gICAgPC9idXR0b24+XG4gIDwvZGl2PmA7XG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gaHRtbDtcbn1cblxuZXhwb3J0IHsgcG9wdWxhdGVEb3dubG9hZFRhYiB9OyIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL2ZpbmFsLWdlbmVyYXRlLmpzXG4gKiBGaW5hbCBnZW5lcmF0aW9uIHN0ZXA6IHNob3dzIGRvd25sb2FkIGxpbmtzIGZvciB0aGUgZ2VuZXJhdGVkIGZpbGVzXG4gKiAoUERGLCBBVFMgRE9DWCwgaHVtYW4gRE9DWCkgYW5kIGEgXCJQcm9jZWVkIHRvIERvd25sb2FkIFJldmlldyBcdTIxOTJcIiBidXR0b25cbiAqIHRoYXQgYWR2YW5jZXMgdGhlIHdvcmtmbG93IHRvIHRoZSBkb3dubG9hZCBzdGVwLlxuICpcbiAqIERlcGVuZGVuY2llcyAocmVzb2x2ZWQgdGhyb3VnaCBnbG9iYWxUaGlzIGF0IHJ1bnRpbWUpOlxuICogICBhcGlDYWxsLCBhcHBlbmRNZXNzYWdlLCBlc2NhcGVIdG1sLCBzdGF0ZU1hbmFnZXIsIHN3aXRjaFRhYlxuICovXG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmNvbnN0IGxvZyA9IGdldExvZ2dlcignZmluYWwtZ2VuZXJhdGUnKTtcblxuaW1wb3J0IHsgc3RhdGVNYW5hZ2VyIH0gZnJvbSAnLi9zdGF0ZS1tYW5hZ2VyLmpzJztcblxuLy8gXHUyNTAwXHUyNTAwIFByZXZpZXcgc3RhdGUgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmxldCBfcHJldmlld09wZW4gPSB0cnVlO1xuXG4vLyBcdTI1MDBcdTI1MDAgRmlsZSB0eXBlIGhlbHBlcnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIF9maWxlTGFiZWwoZmlsZW5hbWUpIHtcbiAgaWYgKCFmaWxlbmFtZSkgcmV0dXJuICcnO1xuICBjb25zdCBiYXNlID0gZmlsZW5hbWUuc3BsaXQoJy8nKS5wb3AoKTtcbiAgaWYgKGJhc2UuZW5kc1dpdGgoJy5wZGYnKSAmJiBiYXNlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2F0cycpKVxuICAgIHJldHVybiAnQVRTIFBERic7XG4gIGlmIChiYXNlLmVuZHNXaXRoKCcucGRmJykpXG4gICAgcmV0dXJuICdIdW1hbiBQREYnO1xuICBpZiAoYmFzZS5lbmRzV2l0aCgnLmRvY3gnKSAmJiBiYXNlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2F0cycpKVxuICAgIHJldHVybiAnQVRTIFdvcmQnO1xuICBpZiAoYmFzZS5lbmRzV2l0aCgnLmRvY3gnKSlcbiAgICByZXR1cm4gJ0h1bWFuIFdvcmQnO1xuICBpZiAoYmFzZS5lbmRzV2l0aCgnLmh0bWwnKSlcbiAgICByZXR1cm4gJ0hUTUwnO1xuICByZXR1cm4gYmFzZTtcbn1cblxuZnVuY3Rpb24gX2ZpbGVJY29uKGZpbGVuYW1lKSB7XG4gIGlmICghZmlsZW5hbWUpIHJldHVybiAnXHVEODNEXHVEQ0MxJztcbiAgY29uc3QgZiA9IGZpbGVuYW1lLnRvTG93ZXJDYXNlKCk7XG4gIGlmIChmLmVuZHNXaXRoKCcucGRmJykpICByZXR1cm4gZi5pbmNsdWRlcygnYXRzJykgPyAnXHVEODNFXHVERDE2JyA6ICdcdUQ4M0RcdURDQzQnO1xuICBpZiAoZi5lbmRzV2l0aCgnLmRvY3gnKSkgcmV0dXJuICdcdUQ4M0RcdURDREQnO1xuICBpZiAoZi5lbmRzV2l0aCgnLmh0bWwnKSkgcmV0dXJuICdcdUQ4M0NcdURGMTAnO1xuICByZXR1cm4gJ1x1RDgzRFx1RENDMSc7XG59XG5cbmZ1bmN0aW9uIF9maWxlRGVzY3JpcHRpb24oZmlsZW5hbWUpIHtcbiAgaWYgKCFmaWxlbmFtZSkgcmV0dXJuICcnO1xuICBjb25zdCBmID0gZmlsZW5hbWUudG9Mb3dlckNhc2UoKTtcbiAgaWYgKGYuZW5kc1dpdGgoJy5wZGYnKSAmJiBmLmluY2x1ZGVzKCdhdHMnKSlcbiAgICByZXR1cm4gJ0FUUy1vcHRpbWlzZWQgUERGIFx1MjAxNCBtYWNoaW5lLXJlYWRhYmxlIGZvciBhdXRvbWF0ZWQgc2NyZWVuaW5nJztcbiAgaWYgKGYuZW5kc1dpdGgoJy5wZGYnKSlcbiAgICByZXR1cm4gJ0h1bWFuLXJlYWRhYmxlIFBERiBcdTIwMTQgZm9yIGh1bWFuIHJldmlld2VycyBhbmQgcHJpbnRpbmcnO1xuICBpZiAoZi5lbmRzV2l0aCgnLmRvY3gnKSAmJiBmLmluY2x1ZGVzKCdhdHMnKSlcbiAgICByZXR1cm4gJ0FUUyBXb3JkIGRvY3VtZW50IFx1MjAxNCBrZXl3b3JkLW9wdGltaXNlZCBmb3Igam9iIGFwcGxpY2F0aW9ucyc7XG4gIGlmIChmLmVuZHNXaXRoKCcuZG9jeCcpKVxuICAgIHJldHVybiAnSHVtYW4tcmVhZGFibGUgV29yZCBkb2N1bWVudCBcdTIwMTQgZWRpdGFibGUgZm9ybWF0JztcbiAgaWYgKGYuZW5kc1dpdGgoJy5odG1sJykpXG4gICAgcmV0dXJuICdIVE1MIGZvcm1hdCB3aXRoIGVtYmVkZGVkIEpTT04tTEQgc3RydWN0dXJlZCBkYXRhJztcbiAgcmV0dXJuICdHZW5lcmF0ZWQgZmlsZSc7XG59XG5cbmZ1bmN0aW9uIF9odG1sUHJldmlld0ZpbGUoZmlsZXMpIHtcbiAgLy8gUHJlZmVyIGh1bWFuLXJlYWRhYmxlIEhUTUwgKENWXyouaHRtbCwgbm90IEFUUylcbiAgY29uc3QgaHVtYW4gPSBmaWxlcy5maW5kKGYgPT4gZi5lbmRzV2l0aCgnLmh0bWwnKSAmJiAhZi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdhdHMnKSk7XG4gIHJldHVybiBodW1hbiB8fCBmaWxlcy5maW5kKGYgPT4gZi5lbmRzV2l0aCgnLmh0bWwnKSkgfHwgbnVsbDtcbn1cblxuZnVuY3Rpb24gX3JlbmRlclByZXZpZXdQYW5lKGh0bWxGaWxlKSB7XG4gIGlmICghaHRtbEZpbGUpIHJldHVybiAnJztcbiAgY29uc3QgYmFzZSA9IGh0bWxGaWxlLnNwbGl0KCcvJykucG9wKCk7XG4gIGNvbnN0IHNyYyA9IGAvYXBpL2Rvd25sb2FkLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGJhc2UpfWA7XG4gIHJldHVybiBgXG4gICAgPGRpdiBpZD1cImZpbmFsLXByZXZpZXctcGFuZVwiIHN0eWxlPVwibWFyZ2luLWJvdHRvbToyNHB4O2JvcmRlcjoxcHggc29saWQgI2UyZThmMDtib3JkZXItcmFkaXVzOjEwcHg7b3ZlcmZsb3c6aGlkZGVuOyR7X3ByZXZpZXdPcGVuID8gJycgOiAnZGlzcGxheTpub25lOyd9XCI+XG4gICAgICA8ZGl2IHN0eWxlPVwicGFkZGluZzoxMHB4IDE2cHg7YmFja2dyb3VuZDojZjFmNWY5O2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjEwcHg7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2UyZThmMDtcIj5cbiAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC45ZW07Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOiMxZTI5M2I7XCI+XHVEODNDXHVERjEwIEhUTUwgUHJldmlldzwvc3Bhbj5cbiAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC44ZW07Y29sb3I6IzY0NzQ4YjtmbGV4OjE7XCI+JHtlc2NhcGVIdG1sKGJhc2UpfTwvc3Bhbj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWQ9XCJmaW5hbC1wcmV2aWV3LWNsb3NlLWJ0blwiXG4gICAgICAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6MC44ZW07cGFkZGluZzozcHggMTBweDtib3JkZXI6MXB4IHNvbGlkICNjYmQ1ZTE7Ym9yZGVyLXJhZGl1czo1cHg7YmFja2dyb3VuZDojZmZmO2N1cnNvcjpwb2ludGVyO2NvbG9yOiM0NzU1Njk7XCJcbiAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiSGlkZSBwcmV2aWV3XCI+SGlkZTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IHN0eWxlPVwicG9zaXRpb246cmVsYXRpdmU7d2lkdGg6MTAwJTtwYWRkaW5nLXRvcDo1Ni4yNSU7YmFja2dyb3VuZDojZjhmYWZjO1wiPlxuICAgICAgICA8aWZyYW1lIGlkPVwiZmluYWwtY3YtcHJldmlld1wiXG4gICAgICAgICAgICAgICAgc3JjPVwiJHtzcmN9XCJcbiAgICAgICAgICAgICAgICB0aXRsZT1cIkZpbmFsIENWIEhUTUwgUHJldmlld1wiXG4gICAgICAgICAgICAgICAgc2FuZGJveD1cImFsbG93LXNhbWUtb3JpZ2luXCJcbiAgICAgICAgICAgICAgICByZWZlcnJlcnBvbGljeT1cIm5vLXJlZmVycmVyXCJcbiAgICAgICAgICAgICAgICBzdHlsZT1cInBvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JvcmRlcjpub25lO1wiXG4gICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkZpbmFsIGdlbmVyYXRlZCBDViBwcmV2aWV3XCI+PC9pZnJhbWU+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgVGFiIHJlbmRlcmVyIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4vKipcbiAqIFBvcHVsYXRlIHRoZSBcIkdlbmVyYXRlXCIgKGZpbmFsX2dlbmVyYXRlKSB0YWIgY29udGVudC5cbiAqIFNob3dzIGRvd25sb2FkIGxpbmtzIGZvciBhbGwgZmluYWwtZ2VuZXJhdGVkIGZpbGVzIGFuZCBhIFwiUHJvY2VlZCB0byBGaW5hbGlzZVwiIGJ1dHRvbi5cbiAqIEBwYXJhbSB7T2JqZWN0fSBjdkRhdGEgLSBDViBkYXRhIG9iamVjdCBmcm9tIHN0YXRlTWFuYWdlci5nZXRUYWJEYXRhKCdjdicpXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBvcHVsYXRlRmluYWxHZW5lcmF0ZVRhYihjdkRhdGEgPSB7fSkge1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgaWYgKCFjb250ZW50KSByZXR1cm47XG5cbiAgLy8gQ29sbGVjdCBjYW5kaWRhdGUgZmlsZXMsIGRlZHVwbGljYXRlXG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0KCk7XG4gIGNvbnN0IGNhbmRpZGF0ZXMgPSBbXG4gICAgY3ZEYXRhLmZpbmFsX2h0bWwsXG4gICAgY3ZEYXRhLmZpbmFsX3BkZixcbiAgICBjdkRhdGEuaHRtbCxcbiAgICBjdkRhdGEucGRmLFxuICAgIGN2RGF0YS5kb2N4LFxuICAgIGN2RGF0YS5hdHNfZG9jeCxcbiAgICBjdkRhdGEuaHVtYW5fZG9jeCxcbiAgICAuLi4oQXJyYXkuaXNBcnJheShjdkRhdGEuZmlsZXMpID8gY3ZEYXRhLmZpbGVzIDogW10pLFxuICBdLmZpbHRlcihCb29sZWFuKTtcblxuICBjb25zdCBmaWxlcyA9IFtdO1xuICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICBpZiAoc2Vlbi5oYXMoZmlsZW5hbWUpKSBjb250aW51ZTtcbiAgICBzZWVuLmFkZChmaWxlbmFtZSk7XG4gICAgaWYgKGZpbGVuYW1lLmVuZHNXaXRoKCcudHh0JykgfHwgZmlsZW5hbWUgPT09ICdqb2JfZGVzY3JpcHRpb24udHh0JykgY29udGludWU7XG4gICAgZmlsZXMucHVzaChmaWxlbmFtZSk7XG4gIH1cblxuICBjb25zdCBodG1sUHJldmlld0ZpbGUgPSBfaHRtbFByZXZpZXdGaWxlKGZpbGVzKTtcblxuICBsZXQgaHRtbCA9ICc8aDE+XHVEODNEXHVEQ0M0IEdlbmVyYXRlZCBGaWxlczwvaDE+JztcbiAgaHRtbCArPSAnPHAgc3R5bGU9XCJjb2xvcjojNDc1NTY5O21hcmdpbi1ib3R0b206OHB4O1wiPllvdXIgQ1YgZmlsZXMgYXJlIHJlYWR5IHRvIGRvd25sb2FkLiBQcmV2aWV3IHRoZSBIVE1MIHZlcnNpb24gYmVsb3csIHRoZW4gY2xpY2sgPHN0cm9uZz5Qcm9jZWVkIHRvIERvd25sb2FkIFJldmlldzwvc3Ryb25nPiB0byBydW4gQVRTIHZhbGlkYXRpb24gYW5kIGFyY2hpdmUgeW91ciBhcHBsaWNhdGlvbi48L3A+JztcbiAgaHRtbCArPSAnPHAgc3R5bGU9XCJmb250LXNpemU6MC44M2VtO2NvbG9yOiM5NGEzYjg7bWFyZ2luLWJvdHRvbToyMHB4O3BhZGRpbmc6OHB4IDEycHg7YmFja2dyb3VuZDojZjhmYWZjO2JvcmRlci1yYWRpdXM6NnB4O2JvcmRlci1sZWZ0OjNweCBzb2xpZCAjZTJlOGYwO1wiPlx1RDgzRFx1RENBMSA8ZW0+VGhpcyB0YWIgbGV0cyB5b3UgZG93bmxvYWQgZmlsZXMgaW1tZWRpYXRlbHkuIFRoZSA8c3Ryb25nPkZpbGUgUmV2aWV3PC9zdHJvbmc+IHN1Yi10YWIgaW4gRmluYWxpc2UgcnVucyBBVFMgY2hlY2tzLCBjb25maXJtcyB0aGUgcGFja2FnZSBpcyBjb21wbGV0ZSwgYW5kIGxldHMgeW91IGFyY2hpdmUgdGhlIGFwcGxpY2F0aW9uLjwvZW0+PC9wPic7XG5cbiAgaWYgKGh0bWxQcmV2aWV3RmlsZSkge1xuICAgIGNvbnN0IHNob3dIaWRlID0gX3ByZXZpZXdPcGVuID8gJ0hpZGUgcHJldmlldycgOiAnU2hvdyBwcmV2aWV3JztcbiAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxMnB4O2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDtcIj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlkPVwiZmluYWwtcHJldmlldy10b2dnbGUtYnRuXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO3BhZGRpbmc6NXB4IDE0cHg7Ym9yZGVyOjFweCBzb2xpZCAjM2I4MmY2O2JvcmRlci1yYWRpdXM6NnB4O2JhY2tncm91bmQ6JHtfcHJldmlld09wZW4gPyAnI2VmZjZmZicgOiAnI2ZmZid9O2NvbG9yOiMzYjgyZjY7Y3Vyc29yOnBvaW50ZXI7Zm9udC13ZWlnaHQ6NjAwO1wiXG4gICAgICAgICAgICAgIGFyaWEtZXhwYW5kZWQ9XCIke19wcmV2aWV3T3Blbn1cIlxuICAgICAgICAgICAgICBhcmlhLWNvbnRyb2xzPVwiZmluYWwtcHJldmlldy1wYW5lXCI+XG4gICAgICAgIFx1RDgzQ1x1REYxMCAke3Nob3dIaWRlfVxuICAgICAgPC9idXR0b24+XG4gICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjhlbTtjb2xvcjojOTRhM2I4O1wiPkluLWJyb3dzZXIgSFRNTCBwcmV2aWV3PC9zcGFuPlxuICAgIDwvZGl2PmA7XG4gICAgaHRtbCArPSBfcmVuZGVyUHJldmlld1BhbmUoaHRtbFByZXZpZXdGaWxlKTtcbiAgfVxuXG4gIGlmIChmaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICBodG1sICs9ICc8cCBzdHlsZT1cImNvbG9yOiM5Y2EzYWY7cGFkZGluZzoxNnB4O1wiPk5vIGZpbGVzIGdlbmVyYXRlZCB5ZXQuPC9wPic7XG4gIH0gZWxzZSB7XG4gICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cImRpc3BsYXk6Z3JpZDtnYXA6MTJweDttYXJnaW4tYm90dG9tOjI4cHg7XCI+JztcbiAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIGZpbGVzKSB7XG4gICAgICBjb25zdCBiYXNlICAgPSBmaWxlbmFtZS5zcGxpdCgnLycpLnBvcCgpO1xuICAgICAgY29uc3QgaWNvbiAgID0gX2ZpbGVJY29uKGZpbGVuYW1lKTtcbiAgICAgIGNvbnN0IGxhYmVsICA9IF9maWxlTGFiZWwoZmlsZW5hbWUpO1xuICAgICAgY29uc3QgZGVzYyAgID0gX2ZpbGVEZXNjcmlwdGlvbihmaWxlbmFtZSk7XG4gICAgICBodG1sICs9IGBcbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjE0cHg7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6I2Y4ZmFmYztib3JkZXI6MXB4IHNvbGlkICNlMmU4ZjA7XG4gICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MTRweCAxOHB4O1wiPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjEuOGVtO1wiPiR7aWNvbn08L3NwYW4+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImZsZXg6MTttaW4td2lkdGg6MDtcIj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjAuOTVlbTtjb2xvcjojMWUyOTNiO1wiPiR7ZXNjYXBlSHRtbChsYWJlbCl9PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuODNlbTtjb2xvcjojNjQ3NDhiO21hcmdpbi10b3A6MnB4O1wiPiR7ZXNjYXBlSHRtbChkZXNjKX08L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8YSBocmVmPVwiL2FwaS9kb3dubG9hZC8ke2VuY29kZVVSSUNvbXBvbmVudChiYXNlKX1cIlxuICAgICAgICAgICAgIGRvd25sb2FkPVwiJHtlc2NhcGVIdG1sKGJhc2UpfVwiXG4gICAgICAgICAgICAgc3R5bGU9XCJkaXNwbGF5OmlubGluZS1mbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6NnB4O1xuICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiMzYjgyZjY7Y29sb3I6I2ZmZjtcbiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzo3cHggMTZweDtib3JkZXItcmFkaXVzOjZweDtcbiAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOjAuODhlbTtmb250LXdlaWdodDo2MDA7dGV4dC1kZWNvcmF0aW9uOm5vbmU7XG4gICAgICAgICAgICAgICAgICAgIHdoaXRlLXNwYWNlOm5vd3JhcDtcIj5cbiAgICAgICAgICAgIFx1MkIwN1x1RkUwRiBEb3dubG9hZFxuICAgICAgICAgIDwvYT5cbiAgICAgICAgPC9kaXY+YDtcbiAgICB9XG4gICAgaHRtbCArPSAnPC9kaXY+JztcbiAgfVxuXG4gIGlmIChjdkRhdGEub3V0cHV0X2Rpcikge1xuICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjI0cHg7cGFkZGluZzoxMHB4IDE0cHg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6I2YxZjVmOTtib3JkZXItcmFkaXVzOjZweDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOjEzcHg7Y29sb3I6IzY0NzQ4YjtcIj5cbiAgICAgIDxzdHJvbmc+T3V0cHV0IGRpcmVjdG9yeTo8L3N0cm9uZz4gJHtlc2NhcGVIdG1sKGN2RGF0YS5vdXRwdXRfZGlyKX1cbiAgICA8L2Rpdj5gO1xuICB9XG5cbiAgaHRtbCArPSBgXG4gICAgPGRpdiBjbGFzcz1cIm5hdi1idXR0b25zIG5hdi1lbmRcIiBzdHlsZT1cIm1hcmdpbi10b3A6MjRweDtcIj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJjb250aW51ZS1idG5cIiBpZD1cImZpbmFsLWdlbmVyYXRlLWNvbnRpbnVlLWJ0blwiXG4gICAgICAgICAgICAgIG9uY2xpY2s9XCJmaW5hbEdlbmVyYXRpb25Db21wbGV0ZSgpXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6MWVtO3BhZGRpbmc6MTBweCAyNHB4O1wiPlxuICAgICAgICBcdTI3MDUgUHJvY2VlZCB0byBEb3dubG9hZCBSZXZpZXcgXHUyMTkyXG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5gO1xuXG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gaHRtbDtcblxuICAvLyBXaXJlIHVwIHByZXZpZXcgdG9nZ2xlXG4gIGlmIChodG1sUHJldmlld0ZpbGUpIHtcbiAgICBjb25zdCB0b2dnbGVCdG4gID0gY29udGVudC5xdWVyeVNlbGVjdG9yKCcjZmluYWwtcHJldmlldy10b2dnbGUtYnRuJyk7XG4gICAgY29uc3QgY2xvc2VCdG4gICA9IGNvbnRlbnQucXVlcnlTZWxlY3RvcignI2ZpbmFsLXByZXZpZXctY2xvc2UtYnRuJyk7XG4gICAgY29uc3QgcHJldmlld1BhbmUgPSBjb250ZW50LnF1ZXJ5U2VsZWN0b3IoJyNmaW5hbC1wcmV2aWV3LXBhbmUnKTtcblxuICAgIGNvbnN0IHNldFByZXZpZXdPcGVuID0gKG9wZW4pID0+IHtcbiAgICAgIF9wcmV2aWV3T3BlbiA9IG9wZW47XG4gICAgICBpZiAocHJldmlld1BhbmUpIHByZXZpZXdQYW5lLnN0eWxlLmRpc3BsYXkgPSBvcGVuID8gJycgOiAnbm9uZSc7XG4gICAgICBpZiAodG9nZ2xlQnRuKSB7XG4gICAgICAgIHRvZ2dsZUJ0bi50ZXh0Q29udGVudCA9IG9wZW4gPyAnXHVEODNDXHVERjEwIEhpZGUgcHJldmlldycgOiAnXHVEODNDXHVERjEwIFNob3cgcHJldmlldyc7XG4gICAgICAgIHRvZ2dsZUJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCBTdHJpbmcob3BlbikpO1xuICAgICAgICB0b2dnbGVCdG4uc3R5bGUuYmFja2dyb3VuZCA9IG9wZW4gPyAnI2VmZjZmZicgOiAnI2ZmZic7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRvZ2dsZUJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBzZXRQcmV2aWV3T3BlbighX3ByZXZpZXdPcGVuKSk7XG4gICAgY2xvc2VCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgICgpID0+IHNldFByZXZpZXdPcGVuKGZhbHNlKSk7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIFBoYXNlIHRyYW5zaXRpb24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8qKlxuICogQWR2YW5jZSB3b3JrZmxvdyBmcm9tIGZpbmFsX2dlbmVyYXRpb24gXHUyMTkyIHJlZmluZW1lbnQuXG4gKiBDYWxscyBQT1NUIC9hcGkvZmluYWwtZ2VuZXJhdGlvbi1jb21wbGV0ZSwgdXBkYXRlcyBmcm9udGVuZCBwaGFzZSwgYW5kXG4gKiBzd2l0Y2hlcyB0byB0aGUgZG93bmxvYWQgdGFiLlxuICovXG5hc3luYyBmdW5jdGlvbiBmaW5hbEdlbmVyYXRpb25Db21wbGV0ZSgpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGlDYWxsKCdQT1NUJywgJy9hcGkvZmluYWwtZ2VuZXJhdGlvbi1jb21wbGV0ZScsIHt9KTtcbiAgICBpZiAoIXJlcz8ub2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihyZXM/LmVycm9yIHx8ICdGYWlsZWQgdG8gYWR2YW5jZSB0byBGaWxlIFJldmlldyBzdGVwLicpO1xuICAgIH1cbiAgICBzdGF0ZU1hbmFnZXIuc2V0UGhhc2UoJ3JlZmluZW1lbnQnKTtcbiAgICBzd2l0Y2hUYWIoJ2Rvd25sb2FkJyk7XG4gICAgYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ1x1MjcwNSBGaWxlcyBnZW5lcmF0ZWQuIFlvdSBjYW4gbm93IGZpbmFsaXNlIHlvdXIgYXBwbGljYXRpb24uJyk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy5lcnJvcignZmluYWxHZW5lcmF0aW9uQ29tcGxldGUgZXJyb3I6JywgZXJyKTtcbiAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCBgXHUyNzRDICR7ZXJyLm1lc3NhZ2V9YCk7XG4gIH1cbn1cblxuZXhwb3J0IHsgcG9wdWxhdGVGaW5hbEdlbmVyYXRlVGFiLCBmaW5hbEdlbmVyYXRpb25Db21wbGV0ZSB9O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiBcIlVwZGF0ZSB2aWEgQUlcIiBwYW5lbCAoR0FQLTAxKTogbmF0dXJhbC1sYW5ndWFnZSBpbnN0cnVjdGlvbiBvclxuICogZG9jdW1lbnQtaW5nZXN0aW9uIHVwZGF0ZXMgdG8gTWFzdGVyX0NWX0RhdGEuanNvbiwgcHJvcG9zZWQgYnkgYW4gTExNLFxuICogcmV2aWV3ZWQgYXMgYSBkaWZmLCBhbmQgd3JpdHRlbiBvbmx5IG9uIGV4cGxpY2l0IGNvbmZpcm1hdGlvbi5cbiAqXG4gKiBSZW5kZXJlZCBpbnNpZGUgdGhlIE1hc3RlciBDViB0YWIgKHNlZSB3ZWIvbWFzdGVyLWN2LmpzKSwgY29sbGFwc2VkIGJ5XG4gKiBkZWZhdWx0LiBSZXVzZXMgd2ViL3Byb3Bvc2FsLXJldmlldy5qcydzIHJvdyByZW5kZXJlciBmb3IgdGhlIGRpZmYgcmV2aWV3XG4gKiBsaXN0IHJhdGhlciB0aGFuIGZvcmtpbmcgYSB0aGlyZCBjb3B5IG9mIHRoYXQgVUkgKGhhcnZlc3QuanMgYW5kXG4gKiBsYXlvdXQtaW5zdHJ1Y3Rpb24uanMncyByZW5kZXJDb250ZW50UHJvcG9zYWxzIGFscmVhZHkgZXhpc3QpLlxuICpcbiAqIFB1YmxpYyBleHBvcnRzIChhc3NpZ25lZCB0byB3aW5kb3cgYnkgd2ViL3NyYy9tYWluLmpzJ3MgYnVuZGxlKTpcbiAqICAgcmVuZGVyTWFzdGVyRGF0YUFpVXBkYXRlUGFuZWwoKVxuICogICB0b2dnbGVNYXN0ZXJEYXRhQWlQYW5lbCgpXG4gKiAgIHNldE1hc3RlckRhdGFBaU1vZGUobW9kZSlcbiAqICAgaGFuZGxlTWFzdGVyRGF0YUFpRmlsZVVwbG9hZChldmVudClcbiAqICAgc3VibWl0TWFzdGVyRGF0YUFpUHJvcG9zZSgpXG4gKiAgIGRpc2NhcmRNYXN0ZXJEYXRhQWlQcm9wb3NhbCgpXG4gKiAgIGNvbmZpcm1NYXN0ZXJEYXRhQWlVcGRhdGUoKVxuICpcbiAqIEtleWJvYXJkOiBDdHJsL0NtZCtFbnRlciBvbiBlaXRoZXIgaW5wdXQgdGV4dGFyZWEgc3VibWl0cyBcIlByb3Bvc2UgVXBkYXRlXCJcbiAqICh3aXJlZCBsb2NhbGx5IHZpYSBvbmtleWRvd24sIG5vdCBrZXlib2FyZC1zaG9ydGN1dHMuanMncyBnbG9iYWxcbiAqIF9UQUJfQUNUSU9OX0JUTiBtYXAgXHUyMDE0IHRoZSBNYXN0ZXIgQ1YgdGFiIGhhcyBzZXZlcmFsIGluZGVwZW5kZW50IGZvcm1zIHdpdGhcbiAqIG5vIHNpbmdsZSBwcmltYXJ5IGFjdGlvbiwgc28gY2xhaW1pbmcgdGhpcyBwYW5lbCBhcyAqdGhlKiB0YWItd2lkZVxuICogQ3RybCtFbnRlciB0YXJnZXQgd291bGQgYmUgbWlzbGVhZGluZy9yZWdyZXNzIHRoZSB0YWIncyBvdGhlciBzYXZlXG4gKiBhY3Rpb25zOyBhIGxvY2FsLCBzY29wZWQgc2hvcnRjdXQgaXMgdGhlIGNvcnJlY3QgZml0IGhlcmUgaW5zdGVhZCkuXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZXNjLCByZW5kZXJQcm9wb3NhbFJvdywgYXR0YWNoUHJvcG9zYWxSb3dMaXN0ZW5lcnMgfSBmcm9tICcuL3Byb3Bvc2FsLXJldmlldy5qcyc7XG5cbmNvbnN0IGxvZyA9IGdldExvZ2dlcignbWFzdGVyLWRhdGEtYWktdXBkYXRlJyk7XG5cbi8vIFx1MjUwMFx1MjUwMCBTdGF0ZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbi8vIENsb3N1cmUtc2NvcGVkLCBjb25zaXN0ZW50IHdpdGggaG93IGhhcnZlc3QuanMgbWFuYWdlcyBpdHMgb3duIGxvY2FsIHN0YXRlIFx1MjAxNFxuLy8gdGhpcyBwYW5lbCBkb2Vzbid0IG5lZWQgdG8gcGFydGljaXBhdGUgaW4gc3RhdGUtbWFuYWdlci5qcydzIGdsb2JhbHMuXG5cbmxldCBfbWR1TW9kZSA9ICdubF9pbnN0cnVjdGlvbic7ICAgICAgICAgICAvLyAnbmxfaW5zdHJ1Y3Rpb24nIHwgJ2RvY3VtZW50X2luZ2VzdGlvbidcbmxldCBfbWR1UGVuZGluZ1Byb3Bvc2FsID0gbnVsbDsgICAgICAgICAgICAvLyB7IHByb3Bvc2FsSWQsIHNvdXJjZSwgY2hhbmdlcyB9XG5sZXQgX21kdVByaW9yQ2xhcmlmaWNhdGlvbnMgPSBbXTsgICAgICAgICAgLy8gW3txdWVzdGlvbiwgYW5zd2VyfSwgLi4uXVxuXG5mdW5jdGlvbiBfbWR1UmVzZXRTdGF0ZSgpIHtcbiAgX21kdU1vZGUgPSAnbmxfaW5zdHJ1Y3Rpb24nO1xuICBfbWR1UGVuZGluZ1Byb3Bvc2FsID0gbnVsbDtcbiAgX21kdVByaW9yQ2xhcmlmaWNhdGlvbnMgPSBbXTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFBhbmVsIHNoZWxsIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiByZW5kZXJNYXN0ZXJEYXRhQWlVcGRhdGVQYW5lbCgpIHtcbiAgLy8gUmVzZXQgbW9kdWxlIHN0YXRlIG9uIGV2ZXJ5IGZyZXNoIHJlbmRlciAobm90IGp1c3QgcGFnZSBsb2FkKSBcdTIwMTQgdGhlIERPTVxuICAvLyB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYWx3YXlzIGRlcGljdHMgdGhlIG5sX2luc3RydWN0aW9uL25vLXByb3Bvc2FsXG4gIC8vIGRlZmF1bHQsIHNvIGFueSBjYXJyaWVkLW92ZXIgc3RhdGUgZnJvbSBhIHByaW9yIHJlbmRlciAoZS5nLiB0aGUgdXNlclxuICAvLyBzd2l0Y2hlZCB0YWJzIG1pZC1wcm9wb3NhbCBhbmQgcG9wdWxhdGVNYXN0ZXJUYWIoKSByZS1yZW5kZXJlZCB0aGlzXG4gIC8vIHBhbmVsKSBtdXN0IGJlIGRpc2NhcmRlZCB0byBhdm9pZCB0aGUgdHdvIGdvaW5nIG91dCBvZiBzeW5jLlxuICBfbWR1UmVzZXRTdGF0ZSgpO1xuICByZXR1cm4gYFxuICAgIDxkaXYgaWQ9XCJtZHUtcGFuZWxcIiBzdHlsZT1cIm1hcmdpbjoxNnB4IDA7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1jdi1ib3JkZXIpO2JvcmRlci1yYWRpdXM6OHB4O292ZXJmbG93OmhpZGRlbjtcIj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlkPVwibWR1LXRvZ2dsZS1idG5cIiBvbmNsaWNrPVwidG9nZ2xlTWFzdGVyRGF0YUFpUGFuZWwoKVwiXG4gICAgICAgIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiIGFyaWEtY29udHJvbHM9XCJtZHUtcGFuZWwtYm9keVwiXG4gICAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTt0ZXh0LWFsaWduOmxlZnQ7YmFja2dyb3VuZDp2YXIoLS1jdi1iZy1saWdodCk7Ym9yZGVyOm5vbmU7cGFkZGluZzoxMnB4IDE2cHg7Zm9udC1zaXplOjAuOTVlbTtmb250LXdlaWdodDo3MDA7Y29sb3I6dmFyKC0tY3YtdGV4dC1wcmltYXJ5KTtjdXJzb3I6cG9pbnRlcjtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDo4cHg7XCI+XG4gICAgICAgIDxzcGFuIGlkPVwibWR1LXRvZ2dsZS1pY29uXCI+XHUyNUI4PC9zcGFuPiBcdUQ4M0VcdUREMTYgVXBkYXRlIHZpYSBBSVxuICAgICAgPC9idXR0b24+XG4gICAgICA8ZGl2IGlkPVwibWR1LXBhbmVsLWJvZHlcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtwYWRkaW5nOjE2cHg7XCI+XG4gICAgICAgIDxwIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtjb2xvcjp2YXIoLS1jdi10ZXh0LXNlY29uZGFyeSk7bWFyZ2luOjAgMCAxNHB4O1wiPlxuICAgICAgICAgIFByZWZlciBwbGFpbiBFbmdsaXNoLCBvciBoYXZlIGFuIG9sZCBDViBvciBMaW5rZWRJbiBleHBvcnQ/IERlc2NyaWJlIGEgY2hhbmdlIG9yIHBhc3RlL3VwbG9hZCBhXG4gICAgICAgICAgZG9jdW1lbnQgYW5kIEFJIHdpbGwgZHJhZnQgaXQgZm9yIHlvdSB0byByZXZpZXcgXHUyMDE0IG5vdGhpbmcgaXMgc2F2ZWQgdW50aWwgeW91IGNvbmZpcm0uXG4gICAgICAgIDwvcD5cblxuICAgICAgICA8ZGl2IHJvbGU9XCJ0YWJsaXN0XCIgYXJpYS1sYWJlbD1cIlVwZGF0ZSBtZXRob2RcIiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6NnB4O21hcmdpbi1ib3R0b206MTJweDtcIj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBpZD1cIm1kdS1tb2RlLW5sX2luc3RydWN0aW9uLWJ0blwiIHJvbGU9XCJ0YWJcIiBhcmlhLXNlbGVjdGVkPVwidHJ1ZVwiXG4gICAgICAgICAgICBvbmNsaWNrPVwic2V0TWFzdGVyRGF0YUFpTW9kZSgnbmxfaW5zdHJ1Y3Rpb24nKVwiXG4gICAgICAgICAgICBzdHlsZT1cInBhZGRpbmc6NnB4IDE0cHg7Zm9udC1zaXplOjAuODVlbTtib3JkZXItcmFkaXVzOjZweCA2cHggMCAwO2JvcmRlcjoxcHggc29saWQgdmFyKC0tY3YtYm9yZGVyKTtib3JkZXItYm90dG9tOm5vbmU7YmFja2dyb3VuZDp2YXIoLS1jdi13aGl0ZSk7Y29sb3I6dmFyKC0tY3YtdGV4dC1wcmltYXJ5KTtmb250LXdlaWdodDo2MDA7Y3Vyc29yOnBvaW50ZXI7XCI+XG4gICAgICAgICAgICBEZXNjcmliZSBhIGNoYW5nZVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlkPVwibWR1LW1vZGUtZG9jdW1lbnRfaW5nZXN0aW9uLWJ0blwiIHJvbGU9XCJ0YWJcIiBhcmlhLXNlbGVjdGVkPVwiZmFsc2VcIlxuICAgICAgICAgICAgb25jbGljaz1cInNldE1hc3RlckRhdGFBaU1vZGUoJ2RvY3VtZW50X2luZ2VzdGlvbicpXCJcbiAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZzo2cHggMTRweDtmb250LXNpemU6MC44NWVtO2JvcmRlci1yYWRpdXM6NnB4IDZweCAwIDA7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1jdi1ib3JkZXIpO2JvcmRlci1ib3R0b206bm9uZTtiYWNrZ3JvdW5kOnZhcigtLWN2LWJnLXN1YnRsZSk7Y29sb3I6dmFyKC0tY3YtdGV4dC1zZWNvbmRhcnkpO2N1cnNvcjpwb2ludGVyO1wiPlxuICAgICAgICAgICAgUGFzdGUgb3IgdXBsb2FkIGEgZG9jdW1lbnRcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBpZD1cIm1kdS1ubF9pbnN0cnVjdGlvbi1pbnB1dC1hcmVhXCI+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cIm1kdS1ubC10ZXh0YXJlYVwiIHN0eWxlPVwiZm9udC1zaXplOjAuODJlbTtmb250LXdlaWdodDo2MDA7Y29sb3I6dmFyKC0tY3YtdGV4dC1tdXRlZCk7ZGlzcGxheTpibG9jazttYXJnaW4tYm90dG9tOjRweDtcIj5cbiAgICAgICAgICAgIERlc2NyaWJlIHRoZSBjaGFuZ2VcbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDx0ZXh0YXJlYSBpZD1cIm1kdS1ubC10ZXh0YXJlYVwiIHJvd3M9XCIzXCIgbWF4bGVuZ3RoPVwiNDAwMFwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gJnF1b3Q7SSBqdXN0IGZpbmlzaGVkIGEgcHJvamVjdCBhdCBBY21lIHVzaW5nIEt1YmVybmV0ZXMgXHUyMDE0IGFkZCBpdCB0byB0aGF0IHJvbGUncyBhY2hpZXZlbWVudHMuJnF1b3Q7XCJcbiAgICAgICAgICAgIG9ua2V5ZG93bj1cImlmKChldmVudC5jdHJsS2V5fHxldmVudC5tZXRhS2V5KSYmZXZlbnQua2V5PT09J0VudGVyJyl7ZXZlbnQucHJldmVudERlZmF1bHQoKTtzdWJtaXRNYXN0ZXJEYXRhQWlQcm9wb3NlKCk7fVwiXG4gICAgICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Ym94LXNpemluZzpib3JkZXItYm94O3BhZGRpbmc6OHB4O2JvcmRlcjoxcHggc29saWQgdmFyKC0tY3YtYm9yZGVyKTtib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6MC44OGVtO3Jlc2l6ZTp2ZXJ0aWNhbDtcIj48L3RleHRhcmVhPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGlkPVwibWR1LWRvY3VtZW50X2luZ2VzdGlvbi1pbnB1dC1hcmVhXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cIm1kdS1kb2MtdGV4dGFyZWFcIiBzdHlsZT1cImZvbnQtc2l6ZTowLjgyZW07Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOnZhcigtLWN2LXRleHQtbXV0ZWQpO2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWJvdHRvbTo0cHg7XCI+XG4gICAgICAgICAgICBQYXN0ZSBkb2N1bWVudCB0ZXh0LCBvciB1cGxvYWQgYSBmaWxlXG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8dGV4dGFyZWEgaWQ9XCJtZHUtZG9jLXRleHRhcmVhXCIgcm93cz1cIjRcIiBtYXhsZW5ndGg9XCI2MDAwMFwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlBhc3RlIGFuIG9sZCBDViBvciBMaW5rZWRJbiBleHBvcnQuLi5cIlxuICAgICAgICAgICAgb25rZXlkb3duPVwiaWYoKGV2ZW50LmN0cmxLZXl8fGV2ZW50Lm1ldGFLZXkpJiZldmVudC5rZXk9PT0nRW50ZXInKXtldmVudC5wcmV2ZW50RGVmYXVsdCgpO3N1Ym1pdE1hc3RlckRhdGFBaVByb3Bvc2UoKTt9XCJcbiAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTtib3gtc2l6aW5nOmJvcmRlci1ib3g7cGFkZGluZzo4cHg7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1jdi1ib3JkZXIpO2JvcmRlci1yYWRpdXM6NHB4O2ZvbnQtc2l6ZTowLjg4ZW07cmVzaXplOnZlcnRpY2FsO21hcmdpbi1ib3R0b206OHB4O1wiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgaWQ9XCJtZHUtZG9jLWZpbGUtaW5wdXRcIiBhY2NlcHQ9XCIudHh0LC5tZCwucnN0LC5odG1sLC5odG0sLnBkZiwuZG9jeCwucnRmXCJcbiAgICAgICAgICAgIG9uY2hhbmdlPVwiaGFuZGxlTWFzdGVyRGF0YUFpRmlsZVVwbG9hZChldmVudClcIiBhcmlhLWRlc2NyaWJlZGJ5PVwibWR1LXVwbG9hZC1kaXNjbG9zdXJlXCJcbiAgICAgICAgICAgIHN0eWxlPVwiZm9udC1zaXplOjAuODJlbTtcIj5cbiAgICAgICAgICA8cCBpZD1cIm1kdS11cGxvYWQtZGlzY2xvc3VyZVwiIHN0eWxlPVwiZm9udC1zaXplOjAuNzhlbTtjb2xvcjp2YXIoLS1jdi10ZXh0LXNlY29uZGFyeSk7bWFyZ2luOjZweCAwIDA7XCI+XG4gICAgICAgICAgICBUaGlzIGRvY3VtZW50IHdpbGwgYmUgc2VudCB0byB5b3VyIGNvbmZpZ3VyZWQgQUkgcHJvdmlkZXIgXHUyMDE0IHNlZSB0aGUgZGF0YSBoYW5kbGluZyBiYWRnZSBhYm92ZS5cbiAgICAgICAgICAgIEFuIG9sZCBDViBvciBMaW5rZWRJbiBleHBvcnQgY2FuIGNhcnJ5IG1vcmUgcGVyc29uYWwgaW5mb3JtYXRpb24gdGhhbiBhIGpvYiBkZXNjcmlwdGlvbi5cbiAgICAgICAgICA8L3A+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjhweDthbGlnbi1pdGVtczpjZW50ZXI7bWFyZ2luLXRvcDoxMnB4O1wiPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlkPVwibWR1LXByb3Bvc2UtYnRuXCIgb25jbGljaz1cInN1Ym1pdE1hc3RlckRhdGFBaVByb3Bvc2UoKVwiXG4gICAgICAgICAgICBzdHlsZT1cInBhZGRpbmc6OHB4IDE4cHg7Zm9udC1zaXplOjAuODhlbTtmb250LXdlaWdodDo2MDA7Y3Vyc29yOnBvaW50ZXI7YmFja2dyb3VuZDp2YXIoLS1jdi1hY2NlbnQpO2NvbG9yOnZhcigtLWN2LXdoaXRlKTtib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjZweDtcIj5cbiAgICAgICAgICAgIFByb3Bvc2UgVXBkYXRlXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWQ9XCJtZHUtZGlzY2FyZC1idG5cIiBvbmNsaWNrPVwiZGlzY2FyZE1hc3RlckRhdGFBaVByb3Bvc2FsKClcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtwYWRkaW5nOjhweCAxNHB4O2ZvbnQtc2l6ZTowLjg1ZW07Y3Vyc29yOnBvaW50ZXI7YmFja2dyb3VuZDp2YXIoLS1jdi13aGl0ZSk7Y29sb3I6dmFyKC0tY3YtdGV4dC1zZWNvbmRhcnkpO2JvcmRlcjoxcHggc29saWQgdmFyKC0tY3YtYm9yZGVyKTtib3JkZXItcmFkaXVzOjZweDtcIj5cbiAgICAgICAgICAgIERpc2NhcmRcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBpZD1cIm1kdS1zdGF0dXNcIiByb2xlPVwic3RhdHVzXCIgYXJpYS1saXZlPVwicG9saXRlXCIgc3R5bGU9XCJtYXJnaW4tdG9wOjEwcHg7Zm9udC1zaXplOjAuODVlbTtjb2xvcjp2YXIoLS1jdi10ZXh0LXNlY29uZGFyeSk7XCI+PC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJtZHUtY2xhcmlmaWNhdGlvbi1jb250YWluZXJcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cIm1kdS1yZXZpZXctYXJlYVwiIHN0eWxlPVwibWFyZ2luLXRvcDoxMnB4O1wiPjwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwibWR1LXJlc3VsdFwiIHN0eWxlPVwibWFyZ2luLXRvcDoxMnB4O1wiPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+YDtcbn1cblxuZnVuY3Rpb24gcmVuZGVyTWFzdGVyRGF0YUFpVXBkYXRlRGlzYWJsZWROb3RlKCkge1xuICByZXR1cm4gYFxuICAgIDxkaXYgc3R5bGU9XCJtYXJnaW46MTZweCAwO3BhZGRpbmc6MTBweCAxNHB4O2JhY2tncm91bmQ6dmFyKC0tY3YtYmctc3VidGxlKTtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWN2LWJvcmRlcik7Ym9yZGVyLXJhZGl1czo2cHg7Zm9udC1zaXplOjAuODVlbTtjb2xvcjp2YXIoLS1jdi10ZXh0LXNlY29uZGFyeSk7XCI+XG4gICAgICBcdUQ4M0VcdUREMTYgVXBkYXRlIHZpYSBBSSBpcyBhdmFpbGFibGUgYmVmb3JlIGFuYWx5c2lzIHN0YXJ0cyBvciBkdXJpbmcgcmVmaW5lbWVudC5cbiAgICA8L2Rpdj5gO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgUGFuZWwgZXhwYW5kL2NvbGxhcHNlICsgbW9kZSB0b2dnbGUgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIHRvZ2dsZU1hc3RlckRhdGFBaVBhbmVsKCkge1xuICBjb25zdCBib2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1wYW5lbC1ib2R5Jyk7XG4gIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtdG9nZ2xlLWJ0bicpO1xuICBjb25zdCBpY29uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS10b2dnbGUtaWNvbicpO1xuICBpZiAoIWJvZHkgfHwgIWJ0bikgcmV0dXJuO1xuICBjb25zdCBleHBhbmRlZCA9IGJvZHkuc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnO1xuICBib2R5LnN0eWxlLmRpc3BsYXkgPSBleHBhbmRlZCA/ICdub25lJyA6ICdibG9jayc7XG4gIGJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCBTdHJpbmcoIWV4cGFuZGVkKSk7XG4gIGlmIChpY29uKSBpY29uLnRleHRDb250ZW50ID0gZXhwYW5kZWQgPyAnXHUyNUI4JyA6ICdcdTI1QkUnO1xufVxuXG5mdW5jdGlvbiBzZXRNYXN0ZXJEYXRhQWlNb2RlKG1vZGUpIHtcbiAgX21kdU1vZGUgPSBtb2RlO1xuICBmb3IgKGNvbnN0IG0gb2YgWydubF9pbnN0cnVjdGlvbicsICdkb2N1bWVudF9pbmdlc3Rpb24nXSkge1xuICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBtZHUtbW9kZS0ke219LWJ0bmApO1xuICAgIGNvbnN0IGFyZWEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgbWR1LSR7bX0taW5wdXQtYXJlYWApO1xuICAgIGNvbnN0IGFjdGl2ZSA9IG0gPT09IG1vZGU7XG4gICAgaWYgKGJ0bikge1xuICAgICAgYnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1zZWxlY3RlZCcsIFN0cmluZyhhY3RpdmUpKTtcbiAgICAgIGJ0bi5zdHlsZS5iYWNrZ3JvdW5kID0gYWN0aXZlID8gJ3ZhcigtLWN2LXdoaXRlKScgOiAndmFyKC0tY3YtYmctc3VidGxlKSc7XG4gICAgICBidG4uc3R5bGUuY29sb3IgPSBhY3RpdmUgPyAndmFyKC0tY3YtdGV4dC1wcmltYXJ5KScgOiAndmFyKC0tY3YtdGV4dC1zZWNvbmRhcnkpJztcbiAgICAgIGJ0bi5zdHlsZS5mb250V2VpZ2h0ID0gYWN0aXZlID8gJzYwMCcgOiAnNDAwJztcbiAgICB9XG4gICAgaWYgKGFyZWEpIGFyZWEuc3R5bGUuZGlzcGxheSA9IGFjdGl2ZSA/ICdibG9jaycgOiAnbm9uZSc7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIERvY3VtZW50IHVwbG9hZCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gaGFuZGxlTWFzdGVyRGF0YUFpRmlsZVVwbG9hZChldmVudCkge1xuICBjb25zdCBmaWxlID0gZXZlbnQudGFyZ2V0LmZpbGVzICYmIGV2ZW50LnRhcmdldC5maWxlc1swXTtcbiAgaWYgKCFmaWxlKSByZXR1cm47XG4gIGNvbnN0IHN0YXR1c0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1zdGF0dXMnKTtcbiAgaWYgKHN0YXR1c0VsKSBzdGF0dXNFbC50ZXh0Q29udGVudCA9IGBSZWFkaW5nICR7ZmlsZS5uYW1lfVx1MjAyNmA7XG4gIHRyeSB7XG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ2ZpbGUnLCBmaWxlKTtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2goJy9hcGkvdXBsb2FkLWZpbGUnLCB7IG1ldGhvZDogJ1BPU1QnLCBib2R5OiBmb3JtRGF0YSB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcC5qc29uKCk7XG4gICAgaWYgKCFyZXNwLm9rIHx8IGRhdGEuZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihkYXRhLm1lc3NhZ2UgfHwgZGF0YS5lcnJvciB8fCBgU2VydmVyIGVycm9yICR7cmVzcC5zdGF0dXN9YCk7XG4gICAgfVxuICAgIGNvbnN0IHRleHRhcmVhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1kb2MtdGV4dGFyZWEnKTtcbiAgICBpZiAodGV4dGFyZWEpIHRleHRhcmVhLnZhbHVlID0gZGF0YS50ZXh0O1xuICAgIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSBgTG9hZGVkICR7ZGF0YS5jb250ZW50X2xlbmd0aC50b0xvY2FsZVN0cmluZygpfSBjaGFyYWN0ZXJzIGZyb20gXCIke2RhdGEuZmlsZW5hbWV9XCIuYDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLmVycm9yKCdoYW5kbGVNYXN0ZXJEYXRhQWlGaWxlVXBsb2FkOiBmYWlsZWQnLCBlcnIpO1xuICAgIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSBgRXJyb3IgcmVhZGluZyBmaWxlOiAke2Vyci5tZXNzYWdlfWA7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIFByb3Bvc2UgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIF9tZHVFbmRwb2ludEZvck1vZGUobW9kZSkge1xuICByZXR1cm4gbW9kZSA9PT0gJ25sX2luc3RydWN0aW9uJyA/ICcvYXBpL21hc3Rlci1kYXRhL25sLXVwZGF0ZS9wcm9wb3NlJyA6ICcvYXBpL21hc3Rlci1kYXRhL2luZ2VzdC1kb2N1bWVudC9wcm9wb3NlJztcbn1cblxuZnVuY3Rpb24gX21kdUlucHV0Rm9yTW9kZShtb2RlKSB7XG4gIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobW9kZSA9PT0gJ25sX2luc3RydWN0aW9uJyA/ICdtZHUtbmwtdGV4dGFyZWEnIDogJ21kdS1kb2MtdGV4dGFyZWEnKTtcbiAgcmV0dXJuIGVsID8gZWwudmFsdWUudHJpbSgpIDogJyc7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN1Ym1pdE1hc3RlckRhdGFBaVByb3Bvc2UoKSB7XG4gIGNvbnN0IGlucHV0ID0gX21kdUlucHV0Rm9yTW9kZShfbWR1TW9kZSk7XG4gIGNvbnN0IHN0YXR1c0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1zdGF0dXMnKTtcbiAgY29uc3QgcmV2aWV3QXJlYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtcmV2aWV3LWFyZWEnKTtcbiAgY29uc3QgcmVzdWx0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWR1LXJlc3VsdCcpO1xuICBjb25zdCBwcm9wb3NlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1wcm9wb3NlLWJ0bicpO1xuXG4gIGlmICghaW5wdXQpIHtcbiAgICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gX21kdU1vZGUgPT09ICdubF9pbnN0cnVjdGlvbidcbiAgICAgID8gJ1BsZWFzZSBkZXNjcmliZSB0aGUgY2hhbmdlIGZpcnN0LidcbiAgICAgIDogJ1BsZWFzZSBwYXN0ZSBvciB1cGxvYWQgZG9jdW1lbnQgdGV4dCBmaXJzdC4nO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChyZXZpZXdBcmVhKSByZXZpZXdBcmVhLmlubmVySFRNTCA9ICcnO1xuICBpZiAocmVzdWx0RWwpIHJlc3VsdEVsLmlubmVySFRNTCA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWR1LWNsYXJpZmljYXRpb24tY29udGFpbmVyJykuaW5uZXJIVE1MID0gJyc7XG4gIGlmIChwcm9wb3NlQnRuKSB7IHByb3Bvc2VCdG4uZGlzYWJsZWQgPSB0cnVlOyBwcm9wb3NlQnRuLnRleHRDb250ZW50ID0gJ0FuYWx5emluZ1x1MjAyNic7IH1cbiAgaWYgKHN0YXR1c0VsKSBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICdBbmFseXppbmdcdTIwMjYnO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgYm9keSA9IHsgcHJpb3JfY2xhcmlmaWNhdGlvbnM6IF9tZHVQcmlvckNsYXJpZmljYXRpb25zIH07XG4gICAgYm9keVtfbWR1TW9kZSA9PT0gJ25sX2luc3RydWN0aW9uJyA/ICdpbnN0cnVjdGlvbicgOiAndGV4dCddID0gaW5wdXQ7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKF9tZHVFbmRwb2ludEZvck1vZGUoX21kdU1vZGUpLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3AuanNvbigpO1xuXG4gICAgaWYgKCFyZXNwLm9rIHx8IGRhdGEub2sgPT09IGZhbHNlKSB7XG4gICAgICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gYEVycm9yOiAke2VzYyhkYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yJyl9YDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZGF0YS5yZXF1aXJlc19jbGFyaWZpY2F0aW9uKSB7XG4gICAgICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJyc7XG4gICAgICBfbWR1U2hvd0NsYXJpZmljYXRpb25EaWFsb2coZGF0YS5jbGFyaWZpY2F0aW9uX3F1ZXN0aW9uLCBpbnB1dCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgX21kdVByaW9yQ2xhcmlmaWNhdGlvbnMgPSBbXTtcbiAgICBjb25zdCBjaGFuZ2VzID0gZGF0YS5jaGFuZ2VzIHx8IFtdO1xuICAgIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnJztcblxuICAgIGlmIChjaGFuZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaWYgKHJldmlld0FyZWEpIHJldmlld0FyZWEuaW5uZXJIVE1MID0gYDxwIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtjb2xvcjp2YXIoLS1jdi10ZXh0LXNlY29uZGFyeSk7XCI+Tm8gY2hhbmdlcyBjb3VsZCBiZSBwcm9wb3NlZCBmcm9tIHRoYXQgXHUyMDE0IHRyeSBhZGRpbmcgbW9yZSBkZXRhaWwuPC9wPmA7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgX21kdVBlbmRpbmdQcm9wb3NhbCA9IHsgcHJvcG9zYWxJZDogZGF0YS5wcm9wb3NhbF9pZCwgc291cmNlOiBfbWR1TW9kZSwgY2hhbmdlcyB9O1xuICAgIF9tZHVSZW5kZXJSZXZpZXdBcmVhKCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy5lcnJvcignc3VibWl0TWFzdGVyRGF0YUFpUHJvcG9zZTogZmFpbGVkJywgZXJyKTtcbiAgICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gYE5ldHdvcmsgZXJyb3I6ICR7ZXNjKGVyci5tZXNzYWdlKX1gO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChwcm9wb3NlQnRuKSB7IHByb3Bvc2VCdG4uZGlzYWJsZWQgPSBmYWxzZTsgcHJvcG9zZUJ0bi50ZXh0Q29udGVudCA9ICdQcm9wb3NlIFVwZGF0ZSc7IH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkaXNjYXJkTWFzdGVyRGF0YUFpUHJvcG9zYWwoKSB7XG4gIF9tZHVQZW5kaW5nUHJvcG9zYWwgPSBudWxsO1xuICBfbWR1UHJpb3JDbGFyaWZpY2F0aW9ucyA9IFtdO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWR1LXJldmlldy1hcmVhJykuaW5uZXJIVE1MID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtcmVzdWx0JykuaW5uZXJIVE1MID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtZGlzY2FyZC1idG4nKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBjb25zdCBzdGF0dXNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtc3RhdHVzJyk7XG4gIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnRGlzY2FyZGVkLic7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBDbGFyaWZpY2F0aW9uIGRpYWxvZyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbi8vIE1vZGVsZWQgb24gc2hvd0NsYXJpZmljYXRpb25EaWFsb2coKSBpbiB3ZWIvbGF5b3V0LWluc3RydWN0aW9uLmpzLCBub3QgYVxuLy8gbGl0ZXJhbCBjb3B5LXBhc3RlIHBvcnQ6IHRoYXQgdmVyc2lvbiBoYXJkLWNvZGVzIGl0cyBtb3VudCBwb2ludCBhbmQgdXNlc1xuLy8gbm9uLW5hbWVzcGFjZWQgZWxlbWVudCBpZHMgKGxheW91dC1jbGFyaWZpY2F0aW9uLSopLCB3aGljaCB3b3VsZCBjb2xsaWRlXG4vLyB3aXRoIHRoaXMgcGFuZWwncyBvd24gaWRzIGlmIGJvdGggdGFicyBhcmUgcHJlc2VudCBpbiB0aGUgRE9NIGF0IG9uY2Vcbi8vIChDU1MtaGlkZGVuIHRhYnMgYXJlbid0IHVubW91bnRlZCkuIFRoaXMgdmVyc2lvbiBtb3VudHMgaW50byB0aGUgcGFuZWwnc1xuLy8gb3duICNtZHUtY2xhcmlmaWNhdGlvbi1jb250YWluZXIgYW5kIHVzZXMgYW4gbWR1LSogaWQgbmFtZXNwYWNlIHRocm91Z2hvdXQuXG5cbmZ1bmN0aW9uIF9tZHVTaG93Q2xhcmlmaWNhdGlvbkRpYWxvZyhxdWVzdGlvbiwgb3JpZ2luYWxJbnN0cnVjdGlvbikge1xuICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWR1LWNsYXJpZmljYXRpb24tY29udGFpbmVyJyk7XG4gIGlmICghY29udGFpbmVyKSB7XG4gICAgbG9nLndhcm4oJ19tZHVTaG93Q2xhcmlmaWNhdGlvbkRpYWxvZzogI21kdS1jbGFyaWZpY2F0aW9uLWNvbnRhaW5lciBub3QgZm91bmQnKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBvcmlnaW5hdGluZ0J0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtcHJvcG9zZS1idG4nKTtcblxuICBjb25zdCBwYW5lbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBwYW5lbC5pZCA9ICdtZHUtY2xhcmlmaWNhdGlvbi1wYW5lbCc7XG4gIHBhbmVsLnNldEF0dHJpYnV0ZSgncm9sZScsICdhbGVydCcpO1xuICBwYW5lbC5zdHlsZS5jc3NUZXh0ID0gJ2JhY2tncm91bmQ6dmFyKC0tY3Ytd2Fybi1iZyk7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1jdi13YXJuLWxpZ2h0KTtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjE0cHg7bWFyZ2luLXRvcDoxMHB4Oyc7XG4gIHBhbmVsLmlubmVySFRNTCA9IGBcbiAgICA8cCBzdHlsZT1cIm1hcmdpbjowIDAgNnB4O2ZvbnQtc2l6ZTowLjg1ZW07Y29sb3I6dmFyKC0tY3Ytd2Fybi10ZXh0KTtmb250LXdlaWdodDo2MDA7XCI+XG4gICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj5cdTI3NTM8L3NwYW4+IEFsbW9zdCB0aGVyZSBcdTIwMTQgYSBiaXQgbW9yZSBkZXRhaWwgd291bGQgaGVscDpcbiAgICA8L3A+XG4gICAgPHAgc3R5bGU9XCJtYXJnaW46MCAwIDEwcHg7Zm9udC1zaXplOjAuODhlbTtjb2xvcjp2YXIoLS1jdi13YXJuLXRleHQpO1wiPiR7ZXNjKHF1ZXN0aW9uKX08L3A+XG4gICAgPGxhYmVsIGZvcj1cIm1kdS1jbGFyaWZpY2F0aW9uLWlucHV0XCIgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjp2YXIoLS1jdi10ZXh0LW11dGVkKTtkaXNwbGF5OmJsb2NrO21hcmdpbi1ib3R0b206NHB4O1wiPlxuICAgICAgWW91ciBjbGFyaWZpY2F0aW9uOlxuICAgIDwvbGFiZWw+XG4gICAgPHRleHRhcmVhIGlkPVwibWR1LWNsYXJpZmljYXRpb24taW5wdXRcIiByb3dzPVwiMlwiXG4gICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Ym94LXNpemluZzpib3JkZXItYm94O3BhZGRpbmc6OHB4O2JvcmRlcjoxcHggc29saWQgdmFyKC0tY3Ytd2Fybi1saWdodCk7Ym9yZGVyLXJhZGl1czo0cHg7Zm9udC1zaXplOjAuODhlbTtyZXNpemU6dmVydGljYWw7XCJcbiAgICAgIGFyaWEtbGFiZWw9XCJDbGFyaWZpY2F0aW9uIGZvciBtYXN0ZXIgZGF0YSB1cGRhdGVcIj4ke2VzYyhvcmlnaW5hbEluc3RydWN0aW9uKX08L3RleHRhcmVhPlxuICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjhweDttYXJnaW4tdG9wOjhweDtcIj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlkPVwibWR1LWNsYXJpZmljYXRpb24tc3VibWl0XCJcbiAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOnZhcigtLWN2LXdhcm4pO2NvbG9yOnZhcigtLWN2LXdoaXRlKTtib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjZweCAxNHB4O2ZvbnQtc2l6ZTowLjg1ZW07Y3Vyc29yOnBvaW50ZXI7Zm9udC13ZWlnaHQ6NjAwO1wiPlxuICAgICAgICBTdWJtaXQgY2xhcmlmaWNhdGlvblxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBpZD1cIm1kdS1jbGFyaWZpY2F0aW9uLWNhbmNlbFwiXG4gICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDpub25lO2JvcmRlcjoxcHggc29saWQgdmFyKC0tY3Ytd2Fybik7Y29sb3I6dmFyKC0tY3Ytd2Fybi10ZXh0KTtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjZweCAxNHB4O2ZvbnQtc2l6ZTowLjg1ZW07Y3Vyc29yOnBvaW50ZXI7XCI+XG4gICAgICAgIENhbmNlbFxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+YDtcblxuICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG4gIGNvbnRhaW5lci5hcHBlbmRDaGlsZChwYW5lbCk7XG5cbiAgY29uc3QgY2xhcklucHV0ID0gcGFuZWwucXVlcnlTZWxlY3RvcignI21kdS1jbGFyaWZpY2F0aW9uLWlucHV0Jyk7XG4gIGNvbnN0IHN1Ym1pdEJ0biA9IHBhbmVsLnF1ZXJ5U2VsZWN0b3IoJyNtZHUtY2xhcmlmaWNhdGlvbi1zdWJtaXQnKTtcbiAgY29uc3QgY2FuY2VsQnRuID0gcGFuZWwucXVlcnlTZWxlY3RvcignI21kdS1jbGFyaWZpY2F0aW9uLWNhbmNlbCcpO1xuXG4gIGNsYXJJbnB1dC5mb2N1cygpO1xuICBjbGFySW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2UoY2xhcklucHV0LnZhbHVlLmxlbmd0aCwgY2xhcklucHV0LnZhbHVlLmxlbmd0aCk7XG5cbiAgY29uc3QgY2xvc2VBbmRSZXN0b3JlRm9jdXMgPSAoKSA9PiB7XG4gICAgcGFuZWwucmVtb3ZlKCk7XG4gICAgaWYgKG9yaWdpbmF0aW5nQnRuKSBvcmlnaW5hdGluZ0J0bi5mb2N1cygpO1xuICB9O1xuXG4gIHN1Ym1pdEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBjb25zdCByZWZpbmVkID0gY2xhcklucHV0LnZhbHVlLnRyaW0oKTtcbiAgICBpZiAocmVmaW5lZCkge1xuICAgICAgX21kdVByaW9yQ2xhcmlmaWNhdGlvbnMgPSBbLi4uX21kdVByaW9yQ2xhcmlmaWNhdGlvbnMsIHsgcXVlc3Rpb24sIGFuc3dlcjogcmVmaW5lZCB9XTtcbiAgICAgIGNvbnN0IGlucHV0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChfbWR1TW9kZSA9PT0gJ25sX2luc3RydWN0aW9uJyA/ICdtZHUtbmwtdGV4dGFyZWEnIDogJ21kdS1kb2MtdGV4dGFyZWEnKTtcbiAgICAgIGlmIChpbnB1dEVsKSBpbnB1dEVsLnZhbHVlID0gcmVmaW5lZDtcbiAgICB9XG4gICAgY2xvc2VBbmRSZXN0b3JlRm9jdXMoKTtcbiAgICBpZiAocmVmaW5lZCkgc3VibWl0TWFzdGVyRGF0YUFpUHJvcG9zZSgpO1xuICB9KTtcbiAgY2FuY2VsQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xvc2VBbmRSZXN0b3JlRm9jdXMpO1xuICBjbGFySW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChlKSA9PiB7XG4gICAgaWYgKGUua2V5ID09PSAnRW50ZXInICYmICFlLnNoaWZ0S2V5KSB7IGUucHJldmVudERlZmF1bHQoKTsgc3VibWl0QnRuLmNsaWNrKCk7IH1cbiAgICBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSBjYW5jZWxCdG4uY2xpY2soKTtcbiAgfSk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBSZXZpZXcgYXJlYSAocHJvcG9zYWwgcm93cykgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIF9tZHVDaGFuZ2VEaXNwbGF5VGV4dChjaGFuZ2UpIHtcbiAgY29uc3QgcHJvcG9zZWQgPSBjaGFuZ2UucHJvcG9zZWQ7XG4gIGlmICh0eXBlb2YgcHJvcG9zZWQgPT09ICdzdHJpbmcnKSByZXR1cm4gcHJvcG9zZWQ7XG4gIGlmIChwcm9wb3NlZCAmJiB0eXBlb2YgcHJvcG9zZWQgPT09ICdvYmplY3QnKSB7XG4gICAgaWYgKCd0ZXh0JyBpbiBwcm9wb3NlZCkgcmV0dXJuIHByb3Bvc2VkLnRleHQ7XG4gICAgaWYgKCduYW1lJyBpbiBwcm9wb3NlZCkgcmV0dXJuIHByb3Bvc2VkLm5hbWU7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHByb3Bvc2VkKTtcbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIF9tZHVGbGFnSHRtbChjaGFuZ2UpIHtcbiAgaWYgKGNoYW5nZS5wb3NzaWJsZV9kdXBsaWNhdGVfb2YpIHtcbiAgICByZXR1cm4gYDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjZweDtwYWRkaW5nOjZweCA4cHg7YmFja2dyb3VuZDp2YXIoLS1jdi13YXJuLWJnKTtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWN2LXdhcm4tYm9yZGVyKTtib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6MC44ZW07Y29sb3I6dmFyKC0tY3Ytd2Fybi10ZXh0KTtcIj5cbiAgICAgIFx1MjZBMCBwb3NzaWJsZSBkdXBsaWNhdGUgb2YgJHtlc2MoY2hhbmdlLnBvc3NpYmxlX2R1cGxpY2F0ZV9vZil9XG4gICAgPC9kaXY+YDtcbiAgfVxuICBpZiAoY2hhbmdlLnBlcnN1YXNpb25fZmxhZ3MgJiYgY2hhbmdlLnBlcnN1YXNpb25fZmxhZ3MubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTo2cHg7cGFkZGluZzo2cHggOHB4O2JhY2tncm91bmQ6dmFyKC0tY3Ytd2Fybi1iZyk7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1jdi13YXJuLWJvcmRlcik7Ym9yZGVyLXJhZGl1czo0cHg7Zm9udC1zaXplOjAuOGVtO2NvbG9yOnZhcigtLWN2LXdhcm4tdGV4dCk7XCI+XG4gICAgICBcdTI2QTAgcXVhbGl0eSBhZHZpc29yeTogJHtlc2MoY2hhbmdlLnBlcnN1YXNpb25fZmxhZ3Muam9pbignLCAnKSl9XG4gICAgPC9kaXY+YDtcbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIF9tZHVBcmlhU3VmZml4KGNoYW5nZSkge1xuICBjb25zdCBwYXJ0cyA9IFtdO1xuICBpZiAoY2hhbmdlLnBvc3NpYmxlX2R1cGxpY2F0ZV9vZikgcGFydHMucHVzaChgcG9zc2libGUgZHVwbGljYXRlIG9mICR7Y2hhbmdlLnBvc3NpYmxlX2R1cGxpY2F0ZV9vZn1gKTtcbiAgaWYgKGNoYW5nZS5wZXJzdWFzaW9uX2ZsYWdzICYmIGNoYW5nZS5wZXJzdWFzaW9uX2ZsYWdzLmxlbmd0aCkgcGFydHMucHVzaChgcXVhbGl0eSBhZHZpc29yeTogJHtjaGFuZ2UucGVyc3Vhc2lvbl9mbGFncy5qb2luKCcsICcpfWApO1xuICByZXR1cm4gcGFydHMubGVuZ3RoID8gYCwgJHtwYXJ0cy5qb2luKCcsICcpfWAgOiAnJztcbn1cblxuZnVuY3Rpb24gX21kdVJlbmRlclJldmlld0FyZWEoKSB7XG4gIGNvbnN0IHJldmlld0FyZWEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWR1LXJldmlldy1hcmVhJyk7XG4gIGNvbnN0IGRpc2NhcmRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWR1LWRpc2NhcmQtYnRuJyk7XG4gIGlmICghcmV2aWV3QXJlYSB8fCAhX21kdVBlbmRpbmdQcm9wb3NhbCkgcmV0dXJuO1xuXG4gIGNvbnN0IGNoYW5nZXMgPSBfbWR1UGVuZGluZ1Byb3Bvc2FsLmNoYW5nZXM7XG4gIGNvbnN0IHJvd3NIdG1sID0gY2hhbmdlcy5tYXAoKGMpID0+IHJlbmRlclByb3Bvc2FsUm93KHtcbiAgICBpZDogYy5pZCxcbiAgICB0eXBlTGFiZWw6IGMuc2VjdGlvbixcbiAgICBsYWJlbDogYy5sYWJlbCxcbiAgICBwcm9wb3NlZDogX21kdUNoYW5nZURpc3BsYXlUZXh0KGMpLFxuICAgIGRldGFpbFRleHQ6IGMucmF0aW9uYWxlLFxuICAgIGZsYWdIdG1sOiBfbWR1RmxhZ0h0bWwoYyksXG4gICAgY2hlY2tlZDogZmFsc2UsXG4gIH0sIHtcbiAgICBpZFByZWZpeDogJ21kdScsXG4gICAgY2hlY2tib3hEYXRhQXR0cjogJ21kdS1pZCcsXG4gICAgYXJpYUxhYmVsU3VmZml4OiBfbWR1QXJpYVN1ZmZpeChjKSxcbiAgfSkpLmpvaW4oJycpO1xuXG4gIGNvbnN0IGZsYWdnZWRDb3VudCA9IGNoYW5nZXMuZmlsdGVyKGMgPT4gYy5wb3NzaWJsZV9kdXBsaWNhdGVfb2YgfHwgKGMucGVyc3Vhc2lvbl9mbGFncyAmJiBjLnBlcnN1YXNpb25fZmxhZ3MubGVuZ3RoKSkubGVuZ3RoO1xuXG4gIHJldmlld0FyZWEuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgcm9sZT1cImdyb3VwXCIgYXJpYS1sYWJlbD1cIlByb3Bvc2VkIGNoYW5nZXMsICR7Y2hhbmdlcy5sZW5ndGh9IGl0ZW1zLCAwIHNlbGVjdGVkXCIgaWQ9XCJtZHUtcm93LWdyb3VwXCI+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2FsaWduLWl0ZW1zOmNlbnRlcjttYXJnaW4tYm90dG9tOjhweDtcIj5cbiAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2NvbG9yOnZhcigtLWN2LXRleHQtc2Vjb25kYXJ5KTtcIj4ke2NoYW5nZXMubGVuZ3RofSBwcm9wb3NlZCBjaGFuZ2Uke2NoYW5nZXMubGVuZ3RoID09PSAxID8gJycgOiAncyd9PC9zcGFuPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBvbmNsaWNrPVwic2VsZWN0TWFzdGVyRGF0YUFpTm9uRmxhZ2dlZCgpXCIgc3R5bGU9XCJmb250LXNpemU6MC44ZW07cGFkZGluZzo0cHggMTBweDtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWN2LWJvcmRlcik7Ym9yZGVyLXJhZGl1czo0cHg7YmFja2dyb3VuZDp2YXIoLS1jdi13aGl0ZSk7Y29sb3I6dmFyKC0tY3YtdGV4dC1wcmltYXJ5KTtjdXJzb3I6cG9pbnRlcjtcIj5cbiAgICAgICAgICBTZWxlY3QgYWxsIG5vbi1mbGFnZ2VkXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8dGFibGUgc3R5bGU9XCJ3aWR0aDoxMDAlO2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTtcIj4ke3Jvd3NIdG1sfTwvdGFibGU+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBpZD1cIm1kdS1zZWxlY3Rpb24tbGl2ZVwiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiIGNsYXNzPVwic3Itb25seVwiIHN0eWxlPVwicG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O2hlaWdodDoxcHg7b3ZlcmZsb3c6aGlkZGVuO1wiPjwvZGl2PlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlkPVwibWR1LWNvbmZpcm0tYnRuXCIgb25jbGljaz1cImNvbmZpcm1NYXN0ZXJEYXRhQWlVcGRhdGUoKVwiIGRpc2FibGVkXG4gICAgICBzdHlsZT1cIm1hcmdpbi10b3A6MTBweDtwYWRkaW5nOjlweCAyMHB4O2ZvbnQtc2l6ZTowLjllbTtmb250LXdlaWdodDo2MDA7Y3Vyc29yOm5vdC1hbGxvd2VkO2JhY2tncm91bmQ6dmFyKC0tY3Ytc2xhdGUtMzAwKTtjb2xvcjp2YXIoLS1jdi13aGl0ZSk7Ym9yZGVyOm5vbmU7Ym9yZGVyLXJhZGl1czo2cHg7XCI+XG4gICAgICBDb25maXJtIGFuZCBXcml0ZVxuICAgIDwvYnV0dG9uPlxuICAgICR7ZmxhZ2dlZENvdW50ID8gYDxwIHN0eWxlPVwiZm9udC1zaXplOjAuNzhlbTtjb2xvcjp2YXIoLS1jdi13YXJuLXRleHQpO21hcmdpbi10b3A6NnB4O1wiPiR7ZmxhZ2dlZENvdW50fSBpdGVtJHtmbGFnZ2VkQ291bnQgPT09IDEgPyAnJyA6ICdzJ30gZmxhZ2dlZCBmb3IgcmV2aWV3IGFib3ZlLjwvcD5gIDogJyd9YDtcblxuICBpZiAoZGlzY2FyZEJ0bikgZGlzY2FyZEJ0bi5zdHlsZS5kaXNwbGF5ID0gJ2lubGluZS1ibG9jayc7XG5cbiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1yZXZpZXctYXJlYScpO1xuICBhdHRhY2hQcm9wb3NhbFJvd0xpc3RlbmVycyhjb250YWluZXIsICdtZHUnKTtcbiAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W2RhdGEtbWR1LWlkXScpLmZvckVhY2goKGNiKSA9PiB7XG4gICAgY2IuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgX21kdVVwZGF0ZUNvbmZpcm1CdXR0b25TdGF0ZSk7XG4gIH0pO1xuICBfbWR1VXBkYXRlQ29uZmlybUJ1dHRvblN0YXRlKCk7XG59XG5cbmZ1bmN0aW9uIF9tZHVVcGRhdGVDb25maXJtQnV0dG9uU3RhdGUoKSB7XG4gIGNvbnN0IGNoZWNrZWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtkYXRhLW1kdS1pZF06Y2hlY2tlZCcpO1xuICBjb25zdCBjb25maXJtQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1jb25maXJtLWJ0bicpO1xuICBjb25zdCBncm91cCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtcm93LWdyb3VwJyk7XG4gIGNvbnN0IGxpdmVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtc2VsZWN0aW9uLWxpdmUnKTtcbiAgY29uc3QgdG90YWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtkYXRhLW1kdS1pZF0nKS5sZW5ndGg7XG4gIGlmIChjb25maXJtQnRuKSB7XG4gICAgY29uZmlybUJ0bi5kaXNhYmxlZCA9IGNoZWNrZWQubGVuZ3RoID09PSAwO1xuICAgIGNvbmZpcm1CdG4uc3R5bGUuY3Vyc29yID0gY2hlY2tlZC5sZW5ndGggPT09IDAgPyAnbm90LWFsbG93ZWQnIDogJ3BvaW50ZXInO1xuICAgIGNvbmZpcm1CdG4uc3R5bGUuYmFja2dyb3VuZCA9IGNoZWNrZWQubGVuZ3RoID09PSAwID8gJ3ZhcigtLWN2LXNsYXRlLTMwMCknIDogJ3ZhcigtLWN2LXN1Y2Nlc3MtbWQpJztcbiAgfVxuICBpZiAoZ3JvdXApIGdyb3VwLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIGBQcm9wb3NlZCBjaGFuZ2VzLCAke3RvdGFsfSBpdGVtcywgJHtjaGVja2VkLmxlbmd0aH0gc2VsZWN0ZWRgKTtcbiAgaWYgKGxpdmVFbCkgbGl2ZUVsLnRleHRDb250ZW50ID0gYCR7Y2hlY2tlZC5sZW5ndGh9IG9mICR7dG90YWx9IHNlbGVjdGVkYDtcbn1cblxuZnVuY3Rpb24gc2VsZWN0TWFzdGVyRGF0YUFpTm9uRmxhZ2dlZCgpIHtcbiAgaWYgKCFfbWR1UGVuZGluZ1Byb3Bvc2FsKSByZXR1cm47XG4gIGNvbnN0IGZsYWdnZWRJZHMgPSBuZXcgU2V0KFxuICAgIF9tZHVQZW5kaW5nUHJvcG9zYWwuY2hhbmdlc1xuICAgICAgLmZpbHRlcihjID0+IGMucG9zc2libGVfZHVwbGljYXRlX29mIHx8IChjLnBlcnN1YXNpb25fZmxhZ3MgJiYgYy5wZXJzdWFzaW9uX2ZsYWdzLmxlbmd0aCkpXG4gICAgICAubWFwKGMgPT4gYy5pZCksXG4gICk7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W2RhdGEtbWR1LWlkXScpLmZvckVhY2goKGNiKSA9PiB7XG4gICAgaWYgKCFmbGFnZ2VkSWRzLmhhcyhjYi5kYXRhc2V0Lm1kdUlkKSkgY2IuY2hlY2tlZCA9IHRydWU7XG4gIH0pO1xuICBfbWR1VXBkYXRlQ29uZmlybUJ1dHRvblN0YXRlKCk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBDb25maXJtIGFuZCB3cml0ZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gY29uZmlybU1hc3RlckRhdGFBaVVwZGF0ZSgpIHtcbiAgaWYgKCFfbWR1UGVuZGluZ1Byb3Bvc2FsKSByZXR1cm47XG4gIGNvbnN0IHNlbGVjdGVkSWRzID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtkYXRhLW1kdS1pZF06Y2hlY2tlZCcpKS5tYXAoY2IgPT4gY2IuZGF0YXNldC5tZHVJZCk7XG4gIGlmIChzZWxlY3RlZElkcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBjb25zdCBzb3VyY2VMYWJlbCA9IF9tZHVQZW5kaW5nUHJvcG9zYWwuc291cmNlID09PSAnbmxfaW5zdHJ1Y3Rpb24nID8gJ3lvdXIgaW5zdHJ1Y3Rpb24nIDogJ3RoZSB1cGxvYWRlZCBkb2N1bWVudCc7XG4gIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0ICh0eXBlb2Ygc2hvd0NvbmZpcm1Nb2RhbCA9PT0gJ2Z1bmN0aW9uJ1xuICAgID8gc2hvd0NvbmZpcm1Nb2RhbChcbiAgICAgICAgYFdyaXRlICR7c2VsZWN0ZWRJZHMubGVuZ3RofSBjaGFuZ2Uke3NlbGVjdGVkSWRzLmxlbmd0aCA9PT0gMSA/ICcnIDogJ3MnfSB0byBNYXN0ZXIgQ1Y/YCxcbiAgICAgICAgYFRoZXNlICR7c2VsZWN0ZWRJZHMubGVuZ3RofSBjaGFuZ2Uke3NlbGVjdGVkSWRzLmxlbmd0aCA9PT0gMSA/ICcnIDogJ3MnfSB3ZXJlIHByb3Bvc2VkIGJ5IEFJIGZyb20gJHtzb3VyY2VMYWJlbH0gYW5kIGhhdmUgbm90IGJlZW4gcHJldmlvdXNseSByZXZpZXdlZC4gYCArXG4gICAgICAgIGBDb25maXJtaW5nIHdpbGwgcGVybWFuZW50bHkgd3JpdGUgdGhlbSB0byBNYXN0ZXJfQ1ZfRGF0YS5qc29uLiBBIGJhY2t1cCB3aWxsIGJlIGNyZWF0ZWQgZmlyc3QgXHUyMDE0IHNlZSBcdUQ4M0RcdURENTAgQmFja3VwcyBhYm92ZSB0byByZXN0b3JlIGl0IGlmIG5lZWRlZC5gLFxuICAgICAgKVxuICAgIDogUHJvbWlzZS5yZXNvbHZlKHdpbmRvdy5jb25maXJtKGBXcml0ZSAke3NlbGVjdGVkSWRzLmxlbmd0aH0gY2hhbmdlKHMpIHRvIE1hc3RlciBDVj8gVGhpcyB3aWxsIHBlcm1hbmVudGx5IHdyaXRlIGNoYW5nZXMgdG8gTWFzdGVyX0NWX0RhdGEuanNvbi5gKSkpO1xuXG4gIGlmICghY29uZmlybWVkKSByZXR1cm47XG5cbiAgY29uc3QgY29uZmlybUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtY29uZmlybS1idG4nKTtcbiAgY29uc3QgcmVzdWx0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWR1LXJlc3VsdCcpO1xuICBpZiAoY29uZmlybUJ0bikgeyBjb25maXJtQnRuLmRpc2FibGVkID0gdHJ1ZTsgY29uZmlybUJ0bi50ZXh0Q29udGVudCA9ICdXcml0aW5nXHUyMDI2JzsgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL2NvbmZpcm0tdXBkYXRlJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcHJvcG9zYWxfaWQ6IF9tZHVQZW5kaW5nUHJvcG9zYWwucHJvcG9zYWxJZCwgc2VsZWN0ZWRfaWRzOiBzZWxlY3RlZElkcyB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcC5qc29uKCk7XG5cbiAgICBpZiAoZGF0YS5vayA9PT0gZmFsc2UgJiYgZGF0YS5zdGFsZV9jaGFuZ2VzKSB7XG4gICAgICBfbWR1SGFuZGxlU3RhbGVDaGFuZ2VzKGRhdGEuc3RhbGVfY2hhbmdlcywgZGF0YS5hcHBsaWNhYmxlX2NoYW5nZXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWRhdGEub2spIHtcbiAgICAgIGlmIChyZXN1bHRFbCkgcmVzdWx0RWwuaW5uZXJIVE1MID0gYDxwIGNsYXNzPVwiZXJyb3ItbWVzc2FnZVwiPkNvbmZpcm0gZmFpbGVkOiAke2VzYyhkYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yJyl9PC9wPmA7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY2hhbmdlc0J5SWQgPSBPYmplY3QuZnJvbUVudHJpZXMoX21kdVBlbmRpbmdQcm9wb3NhbC5jaGFuZ2VzLm1hcChjID0+IFtjLmlkLCBjXSkpO1xuICAgIGNvbnN0IHdyaXR0ZW5MaW5lcyA9IChkYXRhLmRpZmZfc3VtbWFyeSB8fCBbXSlcbiAgICAgIC5maWx0ZXIoZCA9PiBkLmFwcGxpZWQpXG4gICAgICAubWFwKGQgPT4gYDxsaT4ke2VzYyhkLmxhYmVsIHx8IGQuaWQpfSR7Y2hhbmdlc0J5SWRbZC5pZF0/LnJhdGlvbmFsZSA/IGAgXHUyMDE0ICR7ZXNjKGNoYW5nZXNCeUlkW2QuaWRdLnJhdGlvbmFsZSl9YCA6ICcnfTwvbGk+YClcbiAgICAgIC5qb2luKCcnKTtcblxuICAgIGNvbnN0IGNvbW1pdEluZm8gPSBkYXRhLmNvbW1pdF9oYXNoID8gYCAoY29tbWl0ICR7ZXNjKGRhdGEuY29tbWl0X2hhc2gpfSlgIDogJyc7XG4gICAgY29uc3QgZ2l0V2FybmluZyA9IGRhdGEuZ2l0X2Vycm9yXG4gICAgICA/IGA8cCBzdHlsZT1cImNvbG9yOnZhcigtLWN2LXdhcm4tdGV4dCk7Zm9udC1zaXplOjAuODdlbTtcIj5cdTI2QTBcdUZFMEYgR2l0IGNvbW1pdCBza2lwcGVkOiAke2VzYyhkYXRhLmdpdF9lcnJvcj8ubWVzc2FnZSB8fCBkYXRhLmdpdF9lcnJvcil9PC9wPmBcbiAgICAgIDogJyc7XG4gICAgY29uc3QgcHVzaFdhcm5pbmcgPSBkYXRhLnB1c2hfZXJyb3JcbiAgICAgID8gYDxwIHN0eWxlPVwiY29sb3I6dmFyKC0tY3Ytd2Fybi10ZXh0KTtmb250LXNpemU6MC44N2VtO1wiPlx1MjZBMFx1RkUwRiBHaXQgcHVzaCBza2lwcGVkOiAke2VzYyhkYXRhLnB1c2hfZXJyb3IpfTwvcD5gXG4gICAgICA6ICcnO1xuXG4gICAgaWYgKHJlc3VsdEVsKSB7XG4gICAgICByZXN1bHRFbC5pbm5lckhUTUwgPSBgXG4gICAgICAgIDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOnZhcigtLWN2LXN1Y2Nlc3MtYmcpO2JvcmRlcjoxcHggc29saWQgdmFyKC0tY3Ytc3VjY2Vzcy1ib3JkZXIpO2JvcmRlci1yYWRpdXM6NnB4O3BhZGRpbmc6MTJweCAxNnB4O1wiPlxuICAgICAgICAgIDxwIHN0eWxlPVwiY29sb3I6dmFyKC0tY3Ytc3VjY2Vzcy10ZXh0KTtmb250LXdlaWdodDo2MDA7bWFyZ2luOjAgMCA2cHg7XCI+XG4gICAgICAgICAgICBcdTI3MDUgJHtkYXRhLndyaXR0ZW5fY291bnR9IGl0ZW0ke2RhdGEud3JpdHRlbl9jb3VudCA9PT0gMSA/ICcnIDogJ3MnfSB3cml0dGVuIHRvIG1hc3RlciBDViR7Y29tbWl0SW5mb30uXG4gICAgICAgICAgPC9wPlxuICAgICAgICAgICR7d3JpdHRlbkxpbmVzID8gYDx1bCBzdHlsZT1cImZvbnQtc2l6ZTowLjgyZW07Y29sb3I6dmFyKC0tY3YtdGV4dC1tdXRlZCk7bWFyZ2luOjRweCAwIDA7cGFkZGluZy1sZWZ0OjE4cHg7XCI+JHt3cml0dGVuTGluZXN9PC91bD5gIDogJyd9XG4gICAgICAgICAgJHtnaXRXYXJuaW5nfSR7cHVzaFdhcm5pbmd9XG4gICAgICAgIDwvZGl2PmA7XG4gICAgfVxuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1yZXZpZXctYXJlYScpLmlubmVySFRNTCA9ICcnO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtZGlzY2FyZC1idG4nKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIF9tZHVQZW5kaW5nUHJvcG9zYWwgPSBudWxsO1xuICAgIF9tZHVQcmlvckNsYXJpZmljYXRpb25zID0gW107XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy5lcnJvcignY29uZmlybU1hc3RlckRhdGFBaVVwZGF0ZTogZmFpbGVkJywgZXJyKTtcbiAgICBpZiAocmVzdWx0RWwpIHJlc3VsdEVsLmlubmVySFRNTCA9IGA8cCBjbGFzcz1cImVycm9yLW1lc3NhZ2VcIj5OZXR3b3JrIGVycm9yOiAke2VzYyhlcnIubWVzc2FnZSl9PC9wPmA7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKGNvbmZpcm1CdG4pIHsgY29uZmlybUJ0bi5kaXNhYmxlZCA9IGZhbHNlOyBjb25maXJtQnRuLnRleHRDb250ZW50ID0gJ0NvbmZpcm0gYW5kIFdyaXRlJzsgfVxuICB9XG59XG5cbmZ1bmN0aW9uIF9tZHVIYW5kbGVTdGFsZUNoYW5nZXMoc3RhbGVDaGFuZ2VzLCBhcHBsaWNhYmxlQ2hhbmdlcykge1xuICBjb25zdCByZXN1bHRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZHUtcmVzdWx0Jyk7XG4gIGNvbnN0IHN0YWxlSWRzID0gbmV3IFNldChzdGFsZUNoYW5nZXMubWFwKHMgPT4gcy5pZCkpO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W2RhdGEtbWR1LWlkXScpLmZvckVhY2goKGNiKSA9PiB7XG4gICAgaWYgKHN0YWxlSWRzLmhhcyhjYi5kYXRhc2V0Lm1kdUlkKSkge1xuICAgICAgY2IuY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgY2IuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgY29uc3Qgcm93ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYG1kdS1yb3ctJHtjYi5kYXRhc2V0Lm1kdUlkfWApO1xuICAgICAgaWYgKHJvdykgcm93LnN0eWxlLm9wYWNpdHkgPSAnMC41JztcbiAgICB9XG4gIH0pO1xuICBfbWR1VXBkYXRlQ29uZmlybUJ1dHRvblN0YXRlKCk7XG5cbiAgY29uc3QgbGl2ZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21kdS1zZWxlY3Rpb24tbGl2ZScpO1xuICBjb25zdCBzdW1tYXJ5ID0gYCR7c3RhbGVDaGFuZ2VzLmxlbmd0aH0gaXRlbSR7c3RhbGVDaGFuZ2VzLmxlbmd0aCA9PT0gMSA/ICcgaXMnIDogJ3MgYXJlJ30gbm8gbG9uZ2VyIHZhbGlkIGFuZCAke3N0YWxlQ2hhbmdlcy5sZW5ndGggPT09IDEgPyAnd2FzJyA6ICd3ZXJlJ30gZGVzZWxlY3RlZDsgcmV2aWV3IGFuZCBjb25maXJtIGFnYWluLmA7XG4gIGlmIChsaXZlRWwpIGxpdmVFbC50ZXh0Q29udGVudCA9IHN1bW1hcnk7XG5cbiAgY29uc3Qgc3RhbGVMaXN0ID0gc3RhbGVDaGFuZ2VzLm1hcChzID0+IGA8bGk+JHtlc2Mocy5sYWJlbCB8fCBzLmlkKX0gXHUyMDE0ICR7ZXNjKHMucmVhc29uKX08L2xpPmApLmpvaW4oJycpO1xuICBpZiAocmVzdWx0RWwpIHtcbiAgICByZXN1bHRFbC5pbm5lckhUTUwgPSBgXG4gICAgICA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDp2YXIoLS1jdi1iZy1zdWJ0bGUpO2JvcmRlcjoxcHggc29saWQgdmFyKC0tY3Ytc2xhdGUtMzAwKTtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjEycHggMTZweDtcIj5cbiAgICAgICAgPHAgc3R5bGU9XCJjb2xvcjp2YXIoLS1jdi10ZXh0LW11dGVkKTtmb250LXdlaWdodDo2MDA7bWFyZ2luOjAgMCA2cHg7XCI+Tm90aGluZyB3YXMgd3JpdHRlbiBcdTIwMTQgJHtzdW1tYXJ5fTwvcD5cbiAgICAgICAgPHVsIHN0eWxlPVwiZm9udC1zaXplOjAuODJlbTtjb2xvcjp2YXIoLS1jdi10ZXh0LW11dGVkKTttYXJnaW46NHB4IDAgMDtwYWRkaW5nLWxlZnQ6MThweDtcIj4ke3N0YWxlTGlzdH08L3VsPlxuICAgICAgICA8cCBzdHlsZT1cImZvbnQtc2l6ZTowLjgyZW07Y29sb3I6dmFyKC0tY3YtdGV4dC1zZWNvbmRhcnkpO21hcmdpbi10b3A6OHB4O1wiPiR7YXBwbGljYWJsZUNoYW5nZXMubGVuZ3RofSBpdGVtJHthcHBsaWNhYmxlQ2hhbmdlcy5sZW5ndGggPT09IDEgPyAnJyA6ICdzJ30gJHthcHBsaWNhYmxlQ2hhbmdlcy5sZW5ndGggPT09IDEgPyAnaXMnIDogJ2FyZSd9IHN0aWxsIHZhbGlkIFx1MjAxNCBjbGljayBcIkNvbmZpcm0gYW5kIFdyaXRlXCIgYWdhaW4gdG8gYXBwbHkganVzdCB0aG9zZS48L3A+XG4gICAgICA8L2Rpdj5gO1xuICB9XG59XG5cbi8vIE5vdGU6IG5vIGNsaWVudC1zaWRlIFwicmVzdW1lIGFuIGluLXByb2dyZXNzIHByb3Bvc2FsXCIgYWZmb3JkYW5jZSBcdTIwMTQgdGhlXG4vLyBwYW5lbCByZXNldHMgaXRzIHN0YXRlIG9uIGV2ZXJ5IHJlbmRlciAoc2VlIF9tZHVSZXNldFN0YXRlLCBjYWxsZWQgZnJvbVxuLy8gcmVuZGVyTWFzdGVyRGF0YUFpVXBkYXRlUGFuZWwpLCBhbmQgcGVuZGluZyBwcm9wb3NhbHMgbGl2ZSBzZXJ2ZXItc2lkZVxuLy8ga2V5ZWQgYnkgcHJvcG9zYWxfaWQgd2l0aCB0aGVpciBvd24gVFRMIChzZWUgbWFzdGVyX2RhdGFfcm91dGVzLnB5KS5cbi8vIFJlc3VtaW5nIHdvdWxkIHJlcXVpcmUgYSBzZXNzaW9uLXN0YXR1cy1kcml2ZW4gY2hlY2sgZm9yIGFuIGV4aXN0aW5nXG4vLyBwZW5kaW5nIHByb3Bvc2FsIGJlZm9yZSB0aGUgcGFuZWwgZmlyc3QgcmVuZGVyczsgdHJhY2tlZCBhcyBhIGtub3duIHYxXG4vLyBsaW1pdGF0aW9uLCBub3Qgc2lsZW50bHkgYWJzZW50LlxuXG5leHBvcnQge1xuICByZW5kZXJNYXN0ZXJEYXRhQWlVcGRhdGVQYW5lbCxcbiAgcmVuZGVyTWFzdGVyRGF0YUFpVXBkYXRlRGlzYWJsZWROb3RlLFxuICB0b2dnbGVNYXN0ZXJEYXRhQWlQYW5lbCxcbiAgc2V0TWFzdGVyRGF0YUFpTW9kZSxcbiAgaGFuZGxlTWFzdGVyRGF0YUFpRmlsZVVwbG9hZCxcbiAgc3VibWl0TWFzdGVyRGF0YUFpUHJvcG9zZSxcbiAgZGlzY2FyZE1hc3RlckRhdGFBaVByb3Bvc2FsLFxuICBzZWxlY3RNYXN0ZXJEYXRhQWlOb25GbGFnZ2VkLFxuICBjb25maXJtTWFzdGVyRGF0YUFpVXBkYXRlLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL21hc3Rlci1jdi5qc1xuICogTWFzdGVyIENWIG1hbmFnZW1lbnQgdGFiOiBmZXRjaCwgcmVuZGVyLCBhbmQgQ1JVRCBmb3IgcGVyc29uYWwgaW5mbyxcbiAqIGV4cGVyaWVuY2VzLCBza2lsbHMsIGVkdWNhdGlvbiwgYXdhcmRzLCBhY2hpZXZlbWVudHMsIHN1bW1hcmllcy5cbiAqXG4gKiBEZXBlbmRlbmNpZXMgKHJlc29sdmVkIHRocm91Z2ggZ2xvYmFsVGhpcyBhdCBydW50aW1lKTpcbiAqICAgZXNjYXBlSHRtbCwgc2hvd1RvYXN0LCBzaG93QWxlcnRNb2RhbCwgY29uZmlybURpYWxvZyxcbiAqICAgYXBwZW5kTG9hZGluZ01lc3NhZ2UsIHJlbW92ZUxvYWRpbmdNZXNzYWdlLFxuICogICBzZXRMb2FkaW5nLCBzd2l0Y2hUYWIsIGFwcGVuZE1lc3NhZ2UsXG4gKiAgIHJlbmRlck1hc3RlckRhdGFBaVVwZGF0ZVBhbmVsLCByZW5kZXJNYXN0ZXJEYXRhQWlVcGRhdGVEaXNhYmxlZE5vdGVcbiAqICAgICAoZnJvbSB3ZWIvbWFzdGVyLWRhdGEtYWktdXBkYXRlLmpzLCBHQVAtMDEpXG4gKi9cblxubGV0IF9tYXN0ZXJDaGFuZ2VOb3RpY2UgPSAnJztcblxuLy8gVHJhY2tzIHRoZSBhY3RpdmUgcmVuZGVyIHRhcmdldDogbW9kYWwgYm9keSBkaXYgd2hlbiBvcGVuZWQgZnJvbSBoZWFkZXIsXG4vLyBudWxsIHdoZW4gcmVuZGVyZWQgaW50byB0aGUgbm9ybWFsIHRhYiB2aWV3ZXIuXG5sZXQgX21hc3RlckN2QWN0aXZlQ29udGFpbmVyID0gbnVsbDtcblxuLy8gRmlsZW5hbWUgb2YgdGhlIHNhZmV0eSBiYWNrdXAgY3JlYXRlZCBieSB0aGUgbW9zdCByZWNlbnQgdW5kbywgcmVzdG9yYWJsZVxuLy8gdmlhIHJlZG8uIFNpbmdsZS1sZXZlbCBieSBkZXNpZ24gKEdBUC0xOSAxNi43IHYxIHNjb3BlKSBcdTIwMTQgZnVydGhlci1iYWNrXG4vLyByZWNvdmVyeSByZW1haW5zIGF2YWlsYWJsZSB2aWEgdGhlIGZ1bGwgXCJcdUQ4M0RcdURENTAgQmFja3Vwc1wiIGhpc3RvcnkgbW9kYWwuXG4vLyBSZXNldCB0byBudWxsIGF0IHRoZSB0b3Agb2YgZXZlcnkgcG9wdWxhdGVNYXN0ZXJUYWIoKSByZS1yZW5kZXIgc28gYW55XG4vLyBvdGhlciBzYXZlIGFjdGlvbiAoc3RydWN0dXJlZCBlZGl0LCBBSS11cGRhdGUgY29uZmlybSwgaGFydmVzdCBhcHBseSlcbi8vIGludmFsaWRhdGVzIGEgc3RhbGUgcmVkbyB0YXJnZXQuIHVuZG9NYXN0ZXJEYXRhQ2hhbmdlKCkgc2V0c1xuLy8gX21hc3RlckN2U3VwcHJlc3NSZWRvUmVzZXQgYmVmb3JlIGl0cyBvd24gcG9wdWxhdGVNYXN0ZXJUYWIoKSBjYWxsIHNvIGl0c1xuLy8gZnJlc2hseS1zZXQgcmVkbyB0YXJnZXQgc3Vydml2ZXMgdGhhdCBvbmUgcmVuZGVyLlxubGV0IF9tYXN0ZXJDdlJlZG9CYWNrdXAgPSBudWxsO1xubGV0IF9tYXN0ZXJDdlN1cHByZXNzUmVkb1Jlc2V0ID0gZmFsc2U7XG5cbmZ1bmN0aW9uIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2Uoc2VjdGlvbiwgYWN0aW9uKSB7XG4gIGNvbnN0IGNsZWFuU2VjdGlvbiA9IFN0cmluZyhzZWN0aW9uIHx8ICdNYXN0ZXIgQ1YnKS50cmltKCk7XG4gIGNvbnN0IGNsZWFuQWN0aW9uID0gU3RyaW5nKGFjdGlvbiB8fCAndXBkYXRlZCcpLnRyaW0oKTtcbiAgX21hc3RlckNoYW5nZU5vdGljZSA9IGAke2NsZWFuU2VjdGlvbn0gJHtjbGVhbkFjdGlvbn0uYDtcbn1cblxuZnVuY3Rpb24gX3JlbmRlck1hc3RlckNoYW5nZU5vdGljZSgpIHtcbiAgaWYgKCFfbWFzdGVyQ2hhbmdlTm90aWNlKSByZXR1cm4gJyc7XG4gIHJldHVybiBgXG4gICAgPGRpdiBzdHlsZT1cIm1hcmdpbjoxMnB4IDAgMThweDtwYWRkaW5nOjEwcHggMTJweDtib3JkZXI6MXB4IHNvbGlkICNiYmY3ZDA7YmFja2dyb3VuZDojZjBmZGY0O2JvcmRlci1yYWRpdXM6OHB4O2NvbG9yOiMxNDUzMmQ7XCI+XG4gICAgICA8c3Ryb25nPkxhc3Qgc2F2ZWQgY2hhbmdlOjwvc3Ryb25nPiAke2VzY2FwZUh0bWwoX21hc3RlckNoYW5nZU5vdGljZSl9XG4gICAgPC9kaXY+XG4gIGA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHBvcHVsYXRlTWFzdGVyVGFiKGNvbnRhaW5lciA9IG51bGwpIHtcbiAgaWYgKGNvbnRhaW5lciAhPT0gbnVsbCkgX21hc3RlckN2QWN0aXZlQ29udGFpbmVyID0gY29udGFpbmVyO1xuICBpZiAoX21hc3RlckN2U3VwcHJlc3NSZWRvUmVzZXQpIHtcbiAgICBfbWFzdGVyQ3ZTdXBwcmVzc1JlZG9SZXNldCA9IGZhbHNlO1xuICB9IGVsc2Uge1xuICAgIF9tYXN0ZXJDdlJlZG9CYWNrdXAgPSBudWxsO1xuICB9XG4gIGNvbnN0IGNvbnRlbnQgPSBfbWFzdGVyQ3ZBY3RpdmVDb250YWluZXIgfHwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgY29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImVtcHR5LXN0YXRlXCI+PGRpdiBjbGFzcz1cImxvYWRpbmctc3Bpbm5lclwiPjwvZGl2PjxwIHN0eWxlPVwibWFyZ2luLXRvcDoxMnB4O2NvbG9yOiM2NDc0OGI7XCI+TG9hZGluZyBtYXN0ZXIgQ1YgZGF0YVx1MjAyNjwvcD48L2Rpdj4nO1xuXG4gIGxldCBvdmVydmlldyA9IHt9O1xuICBsZXQgZnVsbERhdGEgID0ge307XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBbb3ZSZXMsIGZkUmVzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL292ZXJ2aWV3JyksXG4gICAgICBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS9mdWxsJyksXG4gICAgXSk7XG4gICAgb3ZlcnZpZXcgPSAoYXdhaXQgb3ZSZXMuanNvbigpKSB8fCB7fTtcbiAgICBmdWxsRGF0YSAgPSAoYXdhaXQgZmRSZXMuanNvbigpKSB8fCB7fTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY29udGVudC5pbm5lckhUTUwgPSAnPHAgc3R5bGU9XCJjb2xvcjojZWY0NDQ0O3BhZGRpbmc6MjBweDtcIj5GYWlsZWQgdG8gbG9hZCBtYXN0ZXIgQ1YgZGF0YS48L3A+JztcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwZXJzb25hbEluZm8gPSBmdWxsRGF0YS5wZXJzb25hbF9pbmZvIHx8IHt9O1xuICBjb25zdCBleHBlcmllbmNlcyAgICAgPSBmdWxsRGF0YS5leHBlcmllbmNlIHx8IFtdO1xuICB3aW5kb3cuX21hc3RlckV4cGVyaWVuY2VPcHRpb25zID0gZXhwZXJpZW5jZXNcbiAgICAubWFwKChleHApID0+ICh7XG4gICAgICBpZDogZXhwLmlkIHx8ICcnLFxuICAgICAgbGFiZWw6IGAke2V4cC50aXRsZSB8fCAnUm9sZSd9IEAgJHtleHAuY29tcGFueSB8fCAnQ29tcGFueSd9YCxcbiAgICB9KSlcbiAgICAuZmlsdGVyKCh4KSA9PiB4LmlkKTtcbiAgLy8gRnVsbCBleHBlcmllbmNlIG9iamVjdHMgKGluY2x1ZGluZyBhY2hpZXZlbWVudHMpLCBrZXllZCBieSBpZCwgc29cbiAgLy8gZWRpdE1hc3RlckV4cGVyaWVuY2UoKSBjYW4gbG9vayB1cCBuZXN0ZWQgYWNoaWV2ZW1lbnRzIHdpdGhvdXRcbiAgLy8gZW1iZWRkaW5nIGFyYml0cmFyeSBhY2hpZXZlbWVudCB0ZXh0IGluc2lkZSBhbiBpbmxpbmUgb25jbGljayBhdHRyaWJ1dGUuXG4gIHdpbmRvdy5fbWFzdGVyRXhwZXJpZW5jZUZ1bGxEYXRhID0gZXhwZXJpZW5jZXM7XG4gIGNvbnN0IHNraWxscyAgICAgICAgICA9IGZ1bGxEYXRhLnNraWxscyB8fCBbXTtcbiAgY29uc3QgZWR1Y2F0aW9uICAgICAgID0gZnVsbERhdGEuZWR1Y2F0aW9uIHx8IFtdO1xuICBjb25zdCBhd2FyZHMgICAgICAgICAgPSBmdWxsRGF0YS5hd2FyZHMgfHwgW107XG4gIGNvbnN0IGNlcnRpZmljYXRpb25zICA9IGZ1bGxEYXRhLmNlcnRpZmljYXRpb25zIHx8IFtdO1xuICBjb25zdCBhY2hpZXZlbWVudHMgICAgPSBmdWxsRGF0YS5zZWxlY3RlZF9hY2hpZXZlbWVudHMgfHwgW107XG4gIGNvbnN0IHN1bW1hcmllcyAgICAgICA9IGZ1bGxEYXRhLnByb2Zlc3Npb25hbF9zdW1tYXJpZXMgfHwge307XG5cbiAgY29uc3QgY3VycmVudFBoYXNlID0gKHR5cGVvZiBzdGF0ZU1hbmFnZXIgIT09ICd1bmRlZmluZWQnICYmIHN0YXRlTWFuYWdlci5nZXRQaGFzZSlcbiAgICA/IHN0YXRlTWFuYWdlci5nZXRQaGFzZSgpXG4gICAgOiBudWxsO1xuICBjb25zdCBFRElUQUJMRV9QSEFTRVMgPSBuZXcgU2V0KFsnaW5pdCcsICdyZWZpbmVtZW50JywgbnVsbCwgdW5kZWZpbmVkLCAnJ10pO1xuICBjb25zdCBpc0VkaXRhYmxlID0gRURJVEFCTEVfUEhBU0VTLmhhcyhjdXJyZW50UGhhc2UpO1xuXG4gIGNvbnN0IHBoYXNlTG9ja0Jhbm5lciA9IGlzRWRpdGFibGUgPyAnJyA6IGBcbiAgICA8ZGl2IHJvbGU9XCJzdGF0dXNcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIlxuICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZWYyZjI7Ym9yZGVyOjFweCBzb2xpZCAjZmNhNWE1O2JvcmRlci1yYWRpdXM6NnB4O1xuICAgICAgICAgICAgICAgIHBhZGRpbmc6MTBweCAxNHB4O21hcmdpbi1ib3R0b206MTZweDtmb250LXNpemU6MC44OGVtO2NvbG9yOiM5OTFiMWI7XCI+XG4gICAgICA8c3Ryb25nPlx1RDgzRFx1REQxMiBSZWFkLW9ubHkgXHUyMDE0IGVkaXRpbmcgbG9ja2VkPC9zdHJvbmc+PGJyPlxuICAgICAgTWFzdGVyIENWIGVkaXRpbmcgaXMgb25seSBhdmFpbGFibGUgYmVmb3JlIGpvYiBhbmFseXNpcyBiZWdpbnMgb3IgZHVyaW5nIHRoZVxuICAgICAgUmVmaW5lbWVudCBzdGFnZS4gVGhlIGN1cnJlbnQgc3RhZ2UgaXMgPHN0cm9uZz4ke2VzY2FwZUh0bWwoY3VycmVudFBoYXNlIHx8ICd1bmtub3duJyl9PC9zdHJvbmc+LlxuICAgICAgU2F2ZSBvciBjb21wbGV0ZSB0aGUgY3VycmVudCBzdGFnZSB0byByZS1lbmFibGUgZWRpdGluZy5cbiAgICA8L2Rpdj5gO1xuXG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2ZsZXgtd3JhcDp3cmFwO2dhcDo4cHg7bWFyZ2luLWJvdHRvbTo0cHg7XCI+XG4gICAgICA8aDEgc3R5bGU9XCJtYXJnaW46MDtcIj5cdUQ4M0RcdURDREEgTWFzdGVyIENWIFByb2ZpbGU8L2gxPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6OHB4O2ZsZXgtd3JhcDp3cmFwO1wiPlxuICAgICAgICA8YnV0dG9uIGlkPVwibWFzdGVyLWN2LXVuZG8tYnRuXCIgY2xhc3M9XCJhY3Rpb24tYnRuIHNlY29uZGFyeVwiIG9uY2xpY2s9XCJ1bmRvTWFzdGVyRGF0YUNoYW5nZSgpXCJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJVbmRvIHRoZSBtb3N0IHJlY2VudCBNYXN0ZXIgQ1YgY2hhbmdlXCIgdGl0bGU9XCJVbmRvIChDdHJsK1opXCI+XG4gICAgICAgICAgXHUyMUE5IFVuZG9cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gaWQ9XCJtYXN0ZXItY3YtcmVkby1idG5cIiBjbGFzcz1cImFjdGlvbi1idG4gc2Vjb25kYXJ5XCIgb25jbGljaz1cInJlZG9NYXN0ZXJEYXRhQ2hhbmdlKClcIlxuICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlJlZG8gdGhlIHByZXZpb3VzbHkgdW5kb25lIE1hc3RlciBDViBjaGFuZ2VcIiB0aXRsZT1cIlJlZG8gKEN0cmwrU2hpZnQrWilcIiR7IV9tYXN0ZXJDdlJlZG9CYWNrdXAgPyAnIGRpc2FibGVkJyA6ICcnfT5cbiAgICAgICAgICBcdTIxQUEgUmVkb1xuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG4gc2Vjb25kYXJ5XCIgb25jbGljaz1cIm9wZW5CYWNrdXBIaXN0b3J5TW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJWaWV3IGJhY2t1cCBoaXN0b3J5XCI+XG4gICAgICAgICAgXHVEODNEXHVERDUwIEJhY2t1cHNcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHNlY29uZGFyeVwiIG9uY2xpY2s9XCJvcGVuRnVsbERhdGFQcmV2aWV3TW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJQcmV2aWV3IGZ1bGwgbWFzdGVyIENWIGRhdGFcIj5cbiAgICAgICAgICBcdUQ4M0RcdURDNDEgUHJldmlldyBGdWxsIERhdGFcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHNlY29uZGFyeVwiIG9uY2xpY2s9XCJleHBvcnRNYXN0ZXJDVigpXCIgYXJpYS1sYWJlbD1cIkRvd25sb2FkIE1hc3Rlcl9DVl9EYXRhLmpzb25cIj5cbiAgICAgICAgICBcdTJCMDdcdUZFMEYgRXhwb3J0IEpTT05cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHNlY29uZGFyeVwiIG9uY2xpY2s9XCJ0cmlnZ2VyTWFzdGVyQ3ZJbXBvcnQoKVwiIGFyaWEtbGFiZWw9XCJJbXBvcnQgYSBmdWxsIE1hc3Rlcl9DVl9EYXRhLmpzb24gZmlsZVwiJHtpc0VkaXRhYmxlID8gJycgOiAnIGRpc2FibGVkJ30+XG4gICAgICAgICAgXHUyQjA2XHVGRTBGIEltcG9ydCBKU09OXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiBpZD1cIm1hc3Rlci1jdi1pbXBvcnQtZmlsZS1pbnB1dFwiIGFjY2VwdD1cImFwcGxpY2F0aW9uL2pzb24sLmpzb25cIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIlxuICAgICAgICAgICAgb25jaGFuZ2U9XCJoYW5kbGVNYXN0ZXJDdkltcG9ydEZpbGUoZXZlbnQpXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDttYXJnaW4tYm90dG9tOjEycHg7XCI+XG4gICAgICBUaGlzIGlzIHlvdXIgcGVyc2lzdGVudCBtYXN0ZXIgQ1YgcHJvZmlsZS4gQ2hhbmdlcyBoZXJlIHVwZGF0ZVxuICAgICAgPGNvZGU+TWFzdGVyX0NWX0RhdGEuanNvbjwvY29kZT4gZGlyZWN0bHkgYW5kIHBlcnNpc3QgYWNyb3NzIGFsbCBzZXNzaW9ucy5cbiAgICA8L3A+XG5cbiAgICAke3BoYXNlTG9ja0Jhbm5lcn1cblxuICAgIDwhLS0gR292ZXJuYW5jZSBiYW5uZXIgLS0+XG4gICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1nb3Zlcm5hbmNlLW5vdGVcIiBzdHlsZT1cImJhY2tncm91bmQ6I2ZmZmJlYjtib3JkZXI6MXB4IHNvbGlkICNmY2QzNGQ7Ym9yZGVyLXJhZGl1czo2cHg7cGFkZGluZzoxMHB4IDE0cHg7bWFyZ2luLWJvdHRvbToxNnB4O2ZvbnQtc2l6ZTowLjg4ZW07Y29sb3I6Izc4MzUwZjtcIj5cbiAgICAgIDxzdHJvbmc+XHUyNkEwXHVGRTBGIFBlcnNpc3RlbnQgc3RvcmFnZSBcdTIwMTQgdGhpcyB0YWIgb25seTo8L3N0cm9uZz4gRWRpdHMgbWFkZSBoZXJlICh0aGUgc3RydWN0dXJlZFxuICAgICAgZWRpdG9ycyBiZWxvdywgYW5kIFwiVXBkYXRlIHZpYSBBSVwiKSB3cml0ZSBkaXJlY3RseSB0byA8Y29kZT5NYXN0ZXJfQ1ZfRGF0YS5qc29uPC9jb2RlPlxuICAgICAgaW1tZWRpYXRlbHkgYW5kIHBlcnNpc3QgYWNyb3NzIGV2ZXJ5IGZ1dHVyZSBqb2IgYXBwbGljYXRpb24uXG4gICAgICBKb2Itc3BlY2lmaWMgY2hvaWNlcyB5b3UgbWFrZSBlbHNld2hlcmUgaW4gdGhlIGFwcCBcdTIwMTQgd2hpY2ggc2tpbGxzL2V4cGVyaWVuY2VzIHRvIGZlYXR1cmUsXG4gICAgICByZXdyaXR0ZW4gYnVsbGV0IHRleHQsIGNvdmVyLWxldHRlciB0b25lIFx1MjAxNCBsaXZlIG9ubHkgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbiBhbmQgYXJlXG4gICAgICA8ZW0+bmV2ZXI8L2VtPiB3cml0dGVuIGhlcmUgYXV0b21hdGljYWxseS4gVG8gY2FycnkgYSBzZXNzaW9uJ3MgaW1wcm92ZW1lbnRzIGludG8geW91clxuICAgICAgcGVybWFuZW50IHByb2ZpbGUsIHVzZSBcIlx1RDgzRFx1RENFNSBVcGRhdGUgTWFzdGVyIENWIERhdGFcIiBvbiB0aGUgRmluYWxpc2Ugc3RlcC5cbiAgICA8L2Rpdj5cblxuICAgICR7aXNFZGl0YWJsZSA/IHJlbmRlck1hc3RlckRhdGFBaVVwZGF0ZVBhbmVsKCkgOiByZW5kZXJNYXN0ZXJEYXRhQWlVcGRhdGVEaXNhYmxlZE5vdGUoKX1cblxuICAgICR7X3JlbmRlck1hc3RlckNoYW5nZU5vdGljZSgpfVxuXG4gICAgPCEtLSBQcm9maWxlIG92ZXJ2aWV3IGNhcmQgLS0+XG4gICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1wcm9maWxlLWNhcmRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItcHJvZmlsZS1uYW1lXCI+JHtlc2NhcGVIdG1sKG92ZXJ2aWV3Lm5hbWUgfHwgJ1lvdXIgUHJvZmlsZScpfTwvZGl2PlxuICAgICAgJHtvdmVydmlldy5oZWFkbGluZSA/IGA8ZGl2IGNsYXNzPVwibWFzdGVyLXByb2ZpbGUtaGVhZGxpbmVcIj4ke2VzY2FwZUh0bWwob3ZlcnZpZXcuaGVhZGxpbmUpfTwvZGl2PmAgOiAnJ31cbiAgICAgICR7b3ZlcnZpZXcuZW1haWwgICAgPyBgPGRpdiBjbGFzcz1cIm1hc3Rlci1wcm9maWxlLWVtYWlsXCI+XHUyNzA5XHVGRTBGICR7ZXNjYXBlSHRtbChvdmVydmlldy5lbWFpbCl9PC9kaXY+YCA6ICcnfVxuICAgICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1zdGF0c1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXN0YXRcIj48c3BhbiBjbGFzcz1cIm1hc3Rlci1zdGF0LXZhbHVlXCI+JHtvdmVydmlldy5leHBlcmllbmNlX2NvdW50ID8/ICdcdTIwMTQnfTwvc3Bhbj48c3BhbiBjbGFzcz1cIm1hc3Rlci1zdGF0LWxhYmVsXCI+RXhwZXJpZW5jZXM8L3NwYW4+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc3RhdFwiPjxzcGFuIGNsYXNzPVwibWFzdGVyLXN0YXQtdmFsdWVcIj4ke292ZXJ2aWV3LnNraWxsX2NvdW50ID8/ICdcdTIwMTQnfTwvc3Bhbj48c3BhbiBjbGFzcz1cIm1hc3Rlci1zdGF0LWxhYmVsXCI+U2tpbGxzPC9zcGFuPjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXN0YXRcIj48c3BhbiBjbGFzcz1cIm1hc3Rlci1zdGF0LXZhbHVlXCI+JHtvdmVydmlldy5hY2hpZXZlbWVudF9jb3VudCA/PyAnXHUyMDE0J308L3NwYW4+PHNwYW4gY2xhc3M9XCJtYXN0ZXItc3RhdC1sYWJlbFwiPkFjaGlldmVtZW50czwvc3Bhbj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1zdGF0XCI+PHNwYW4gY2xhc3M9XCJtYXN0ZXItc3RhdC12YWx1ZVwiPiR7b3ZlcnZpZXcuc3VtbWFyeV9jb3VudCA/PyAnXHUyMDE0J308L3NwYW4+PHNwYW4gY2xhc3M9XCJtYXN0ZXItc3RhdC1sYWJlbFwiPlN1bW1hcmllczwvc3Bhbj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1zdGF0XCI+PHNwYW4gY2xhc3M9XCJtYXN0ZXItc3RhdC12YWx1ZVwiPiR7b3ZlcnZpZXcuZWR1Y2F0aW9uX2NvdW50ID8/ICdcdTIwMTQnfTwvc3Bhbj48c3BhbiBjbGFzcz1cIm1hc3Rlci1zdGF0LWxhYmVsXCI+RWR1Y2F0aW9uPC9zcGFuPjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXN0YXRcIj48c3BhbiBjbGFzcz1cIm1hc3Rlci1zdGF0LXZhbHVlXCI+JHtvdmVydmlldy5wdWJsaWNhdGlvbl9jb3VudCA/PyAnXHUyMDE0J308L3NwYW4+PHNwYW4gY2xhc3M9XCJtYXN0ZXItc3RhdC1sYWJlbFwiPlB1YmxpY2F0aW9uczwvc3Bhbj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBQZXJzb25hbCBJbmZvIHNlY3Rpb24gLS0+XG4gICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1zZWN0aW9uXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXNlY3Rpb24taGVhZGVyXCI+XG4gICAgICAgIDxoMj5cdUQ4M0RcdURDNjQgUGVyc29uYWwgSW5mb3JtYXRpb248L2gyPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0blwiIG9uY2xpY2s9XCJzaG93RWRpdFBlcnNvbmFsSW5mb01vZGFsKClcIiBhcmlhLWxhYmVsPVwiRWRpdCBwZXJzb25hbCBpbmZvcm1hdGlvblwiPlxuICAgICAgICAgIFx1MjcwRlx1RkUwRiBFZGl0XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGlkPVwibWFzdGVyLXBlcnNvbmFsLWluZm8tY29udGFpbmVyXCI+XG4gICAgICAgICR7X3JlbmRlclBlcnNvbmFsSW5mb0NhcmQocGVyc29uYWxJbmZvKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBFeHBlcmllbmNlcyBzZWN0aW9uIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc2VjdGlvblwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1zZWN0aW9uLWhlYWRlclwiPlxuICAgICAgICA8aDI+XHVEODNEXHVEQ0JDIFdvcmsgRXhwZXJpZW5jZTwvaDI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgb25jbGljaz1cInNob3dBZGRFeHBlcmllbmNlTW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJBZGQgbmV3IHdvcmsgZXhwZXJpZW5jZVwiPlxuICAgICAgICAgICsgQWRkIEV4cGVyaWVuY2VcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgaWQ9XCJtYXN0ZXItZXhwZXJpZW5jZXMtY29udGFpbmVyXCI+XG4gICAgICAgICR7X3JlbmRlckV4cGVyaWVuY2VzTGlzdChleHBlcmllbmNlcyl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gU2tpbGxzIHNlY3Rpb24gLS0+XG4gICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1zZWN0aW9uXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXNlY3Rpb24taGVhZGVyXCI+XG4gICAgICAgIDxoMj5cdUQ4M0RcdURFRTBcdUZFMEYgU2tpbGxzPC9oMj5cbiAgICAgICAgJHtBcnJheS5pc0FycmF5KHNraWxscykgPyBgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwic2hvd0FkZFNraWxsTW9kYWwoJycsIHRydWUpXCIgYXJpYS1sYWJlbD1cIkFkZCBuZXcgc2tpbGxcIj4rIEFkZCBTa2lsbDwvYnV0dG9uPmAgOiAnJ31cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBpZD1cIm1hc3Rlci1za2lsbHMtY29udGFpbmVyXCI+XG4gICAgICAgICR7X3JlbmRlclNraWxsc1NlY3Rpb24oc2tpbGxzKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBFZHVjYXRpb24gc2VjdGlvbiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXNlY3Rpb25cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc2VjdGlvbi1oZWFkZXJcIj5cbiAgICAgICAgPGgyPlx1RDgzQ1x1REY5MyBFZHVjYXRpb248L2gyPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0blwiIG9uY2xpY2s9XCJzaG93QWRkRWR1Y2F0aW9uTW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJBZGQgZWR1Y2F0aW9uIGVudHJ5XCI+XG4gICAgICAgICAgKyBBZGQgRWR1Y2F0aW9uXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGlkPVwibWFzdGVyLWVkdWNhdGlvbi1jb250YWluZXJcIj5cbiAgICAgICAgJHtfcmVuZGVyRWR1Y2F0aW9uTGlzdChlZHVjYXRpb24pfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFB1YmxpY2F0aW9ucyBzZWN0aW9uIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc2VjdGlvblwiIGlkPVwibWFzdGVyLXB1YmxpY2F0aW9ucy1zZWN0aW9uXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXNlY3Rpb24taGVhZGVyXCI+XG4gICAgICAgIDxoMj5cdUQ4M0RcdURDRDYgUHVibGljYXRpb25zPC9oMj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDtcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBzZWNvbmRhcnlcIiBpZD1cIm1hc3Rlci1wdWItaW1wb3J0LWJ0blwiXG4gICAgICAgICAgICAgIG9uY2xpY2s9XCJzaG93SW1wb3J0UHVibGljYXRpb25zTW9kYWwoKVwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJJbXBvcnQgQmliVGVYIHB1YmxpY2F0aW9uc1wiPlxuICAgICAgICAgICAgXHUyQjA2XHVGRTBGIEltcG9ydCBCaWJUZVhcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBzZWNvbmRhcnlcIiBpZD1cIm1hc3Rlci1wdWItY29udmVydC1idG5cIlxuICAgICAgICAgICAgICBvbmNsaWNrPVwic2hvd0NvbnZlcnRQdWJsaWNhdGlvbnNNb2RhbCgpXCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkNvbnZlcnQgY2l0YXRpb24gdGV4dCB0byBCaWJUZVhcIj5cbiAgICAgICAgICAgIFx1RDgzRVx1REU4NCBDb252ZXJ0IFRleHRcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBzZWNvbmRhcnlcIiBpZD1cIm1hc3Rlci1wdWItdG9nZ2xlLWJ0blwiXG4gICAgICAgICAgICAgIG9uY2xpY2s9XCJ0b2dnbGVQdWJsaWNhdGlvbnNWaWV3KClcIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiVG9nZ2xlIGJldHdlZW4gc3RydWN0dXJlZCBDUlVEIHZpZXcgYW5kIHJhdyBCaWJUZVggZWRpdG9yXCI+XG4gICAgICAgICAgICBcdTI3MEZcdUZFMEYgUmF3IEJpYlRlWFxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgaWQ9XCJtYXN0ZXItcHViLWFkZC1idG5cIlxuICAgICAgICAgICAgICBvbmNsaWNrPVwic2hvd0FkZFB1YmxpY2F0aW9uTW9kYWwoKVwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJBZGQgcHVibGljYXRpb25cIj5cbiAgICAgICAgICAgICsgQWRkIFB1YmxpY2F0aW9uXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8IS0tIENSVUQgc3RydWN0dXJlZCB2aWV3IChkZWZhdWx0KSAtLT5cbiAgICAgIDxkaXYgaWQ9XCJtYXN0ZXItcHViLWNydWQtdmlld1wiPlxuICAgICAgICA8ZGl2IGlkPVwibWFzdGVyLXB1Yi1jcnVkLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtwYWRkaW5nOjEycHggMDtcIj5Mb2FkaW5nIHB1YmxpY2F0aW9uc1x1MjAyNjwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDwhLS0gUmF3IEJpYlRlWCBlZGl0b3IgKGhpZGRlbiBieSBkZWZhdWx0KSAtLT5cbiAgICAgIDxkaXYgaWQ9XCJtYXN0ZXItcHViLXJhdy12aWV3XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+XG4gICAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtmb250LXNpemU6MC45ZW07bWFyZ2luLWJvdHRvbToxMHB4O1wiPlxuICAgICAgICAgIEVkaXQgeW91ciBCaWJUZVggYmlibGlvZ3JhcGh5IGZpbGUgZGlyZWN0bHkuIENoYW5nZXMgYXJlIHNhdmVkIHRvXG4gICAgICAgICAgPGNvZGU+cHVibGljYXRpb25zLmJpYjwvY29kZT4gYW5kIGEgdGltZXN0YW1wZWQgYmFja3VwIGlzIGNyZWF0ZWRcbiAgICAgICAgICBhdXRvbWF0aWNhbGx5LiBDb250ZW50IGlzIHZhbGlkYXRlZCBiZWZvcmUgd3JpdGluZy5cbiAgICAgICAgPC9wPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6OHB4O21hcmdpbi1ib3R0b206OHB4O1wiPlxuICAgICAgICAgIDxzcGFuIGlkPVwibWFzdGVyLXB1Yi1jb3VudFwiIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtmb250LXNpemU6MC45ZW07XCI+PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZmxleDoxO1wiPjwvc3Bhbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBzZWNvbmRhcnlcIiBvbmNsaWNrPVwidmFsaWRhdGVQdWJsaWNhdGlvbnNCaWIoKVwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJWYWxpZGF0ZSBCaWJUZVggd2l0aG91dCBzYXZpbmdcIj5cdUQ4M0RcdUREMEQgVmFsaWRhdGU8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBzZWNvbmRhcnlcIiBvbmNsaWNrPVwibG9hZFB1YmxpY2F0aW9uc0JpYigpXCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlJlbG9hZCBwdWJsaWNhdGlvbnMuYmliIGZyb20gZGlza1wiPlx1RDgzRFx1REQwNCBSZWxvYWQ8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBwcmltYXJ5XCIgaWQ9XCJtYXN0ZXItcHViLXNhdmUtYnRuXCJcbiAgICAgICAgICAgICAgb25jbGljaz1cInNhdmVQdWJsaWNhdGlvbnNCaWIoKVwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJTYXZlIEJpYlRlWCB0byBkaXNrXCI+XHVEODNEXHVEQ0JFIFNhdmU8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDx0ZXh0YXJlYSBpZD1cIm1hc3Rlci1wdWItdGV4dGFyZWFcIlxuICAgICAgICAgIGNsYXNzPVwiZWRpdC1pbnB1dFwiXG4gICAgICAgICAgcm93cz1cIjIwXCJcbiAgICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Zm9udC1mYW1pbHk6bW9ub3NwYWNlO2ZvbnQtc2l6ZTowLjg1ZW07cmVzaXplOnZlcnRpY2FsO1wiXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJMb2FkaW5nXHUyMDI2XCJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiQmliVGVYIGJpYmxpb2dyYXBoeSBjb250ZW50XCJcbiAgICAgICAgICBzcGVsbGNoZWNrPVwiZmFsc2VcIlxuICAgICAgICA+PC90ZXh0YXJlYT5cbiAgICAgICAgPGRpdiBpZD1cIm1hc3Rlci1wdWItc3RhdHVzXCJcbiAgICAgICAgICAgIHN0eWxlPVwibWFyZ2luLXRvcDo2cHg7Zm9udC1zaXplOjAuODVlbTtjb2xvcjojNmI3MjgwO1wiXG4gICAgICAgICAgICBhcmlhLWxpdmU9XCJwb2xpdGVcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBBd2FyZHMgc2VjdGlvbiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXNlY3Rpb25cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc2VjdGlvbi1oZWFkZXJcIj5cbiAgICAgICAgPGgyPlx1RDgzQ1x1REZDNSBBd2FyZHMgJmFtcDsgSG9ub3VyczwvaDI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgb25jbGljaz1cInNob3dBZGRBd2FyZE1vZGFsKClcIiBhcmlhLWxhYmVsPVwiQWRkIGF3YXJkXCI+XG4gICAgICAgICAgKyBBZGQgQXdhcmRcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgaWQ9XCJtYXN0ZXItYXdhcmRzLWNvbnRhaW5lclwiPlxuICAgICAgICAke19yZW5kZXJBd2FyZHNMaXN0KGF3YXJkcyl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gQ2VydGlmaWNhdGlvbnMgc2VjdGlvbiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXNlY3Rpb25cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc2VjdGlvbi1oZWFkZXJcIj5cbiAgICAgICAgPGgyPlx1RDgzQ1x1REY5MyBDZXJ0aWZpY2F0aW9uczwvaDI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgb25jbGljaz1cInNob3dBZGRDZXJ0aWZpY2F0aW9uTW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJBZGQgY2VydGlmaWNhdGlvblwiPlxuICAgICAgICAgICsgQWRkIENlcnRpZmljYXRpb25cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgaWQ9XCJtYXN0ZXItY2VydGlmaWNhdGlvbnMtY29udGFpbmVyXCI+XG4gICAgICAgICR7X3JlbmRlckNlcnRpZmljYXRpb25zTGlzdChjZXJ0aWZpY2F0aW9ucyl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gU2VsZWN0ZWQgQWNoaWV2ZW1lbnRzIHNlY3Rpb24gLS0+XG4gICAgPGRpdiBjbGFzcz1cIm1hc3Rlci1zZWN0aW9uXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXNlY3Rpb24taGVhZGVyXCI+XG4gICAgICAgIDxoMj5cdUQ4M0NcdURGQzYgU2VsZWN0ZWQgQWNoaWV2ZW1lbnRzPC9oMj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwic2hvd0FkZEFjaGlldmVtZW50TW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJBZGQgbmV3IGFjaGlldmVtZW50IHRvIG1hc3RlciBDVlwiPlxuICAgICAgICAgICsgQWRkIEFjaGlldmVtZW50XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7Zm9udC1zaXplOjAuOWVtO21hcmdpbi1ib3R0b206MTJweDtcIj5cbiAgICAgICAgVGhlc2UgYXJlIGNyb3NzLXJvbGUgaGlnaGxpZ2h0cyBzaG93biBpbiB0aGUgQWNoaWV2ZW1lbnRzIHJldmlldyBkdXJpbmcgY3VzdG9taXNhdGlvbi5cbiAgICAgICAgVGhlIEhhcnZlc3QgZmVhdHVyZSAoSGFydmVzdCB0YWIpIGNhbiBhZGQgbmV3IG9uZXMgZnJvbSB5b3VyIGN1cnJlbnQgc2Vzc2lvbi5cbiAgICAgIDwvcD5cbiAgICAgIDxkaXYgaWQ9XCJtYXN0ZXItYWNoaWV2ZW1lbnRzLWNvbnRhaW5lclwiPlxuICAgICAgICAke19yZW5kZXJNYXN0ZXJBY2hpZXZlbWVudHNUYWJsZShhY2hpZXZlbWVudHMpfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFByb2Zlc3Npb25hbCBTdW1tYXJpZXMgc2VjdGlvbiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXNlY3Rpb25cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc2VjdGlvbi1oZWFkZXJcIj5cbiAgICAgICAgPGgyPlx1RDgzRFx1RENERCBQcm9mZXNzaW9uYWwgU3VtbWFyaWVzPC9oMj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwic2hvd0FkZFN1bW1hcnlNb2RhbCgpXCIgYXJpYS1sYWJlbD1cIkFkZCBuZXcgcHJvZmVzc2lvbmFsIHN1bW1hcnkgdmFyaWFudFwiPlxuICAgICAgICAgICsgQWRkIFN1bW1hcnlcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtmb250LXNpemU6MC45ZW07bWFyZ2luLWJvdHRvbToxMnB4O1wiPlxuICAgICAgICBOYW1lZCBzdW1tYXJ5IHZhcmlhbnRzIGxldCB5b3UgdGFpbG9yIHlvdXIgcHJvZmVzc2lvbmFsIHN0YXRlbWVudCBmb3IgZGlmZmVyZW50IHJvbGUgdHlwZXNcbiAgICAgICAgd2l0aG91dCByZWdlbmVyYXRpbmcgZnJvbSBzY3JhdGNoLiBUaGUgQUkgd2lsbCByZWNvbW1lbmQgdGhlIG1vc3QgcmVsZXZhbnQgdmFyaWFudFxuICAgICAgICBkdXJpbmcgdGhlIFN1bW1hcnkgRm9jdXMgc3RlcC5cbiAgICAgIDwvcD5cbiAgICAgIDxkaXYgaWQ9XCJtYXN0ZXItc3VtbWFyaWVzLWNvbnRhaW5lclwiPlxuICAgICAgICAke19yZW5kZXJTdW1tYXJpZXNMaXN0KHN1bW1hcmllcyl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gUHVibGljYXRpb24gYWRkL2VkaXQgbW9kYWwgLS0+XG4gICAgPGRpdiBpZD1cIm1hc3Rlci1wdWItbW9kYWwtb3ZlcmxheVwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLW1vZGFsPVwidHJ1ZVwiXG4gICAgICAgIGFyaWEtbGFiZWxsZWRieT1cIm1hc3Rlci1wdWItbW9kYWwtdGl0bGVcIiBjbGFzcz1cIm1vZGFsLW92ZXJsYXlcIlxuICAgICAgICBvbmNsaWNrPVwiaWYoZXZlbnQudGFyZ2V0PT09dGhpcyljbG9zZVB1YmxpY2F0aW9uTW9kYWwoKVwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsXCIgc3R5bGU9XCJtYXgtd2lkdGg6NTgwcHg7XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cbiAgICAgICAgICA8aDIgaWQ9XCJtYXN0ZXItcHViLW1vZGFsLXRpdGxlLWhlYWRpbmdcIiBpZD1cInB1Yi1tb2RhbC10aXRsZS1oZWFkaW5nXCI+QWRkIFB1YmxpY2F0aW9uPC9oMj5cbiAgICAgICAgICA8YnV0dG9uIG9uY2xpY2s9XCJjbG9zZVB1YmxpY2F0aW9uTW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJDbG9zZSBwdWJsaWNhdGlvbiBlZGl0b3JcIlxuICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6bm9uZTtib3JkZXI6bm9uZTtmb250LXNpemU6MS40ZW07Y3Vyc29yOnBvaW50ZXI7Y29sb3I6IzY0NzQ4YjtcIj4mdGltZXM7PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiIHN0eWxlPVwicGFkZGluZzoyMHB4O1wiPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjEycHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwicHViLW1vZGFsLWtleVwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+Q2l0ZSBLZXkgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+Kjwvc3Bhbj48L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJwdWItbW9kYWwta2V5XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiIGFyaWEtcmVxdWlyZWQ9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gc21pdGgyMDI0bWxcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjEycHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwicHViLW1vZGFsLXR5cGVcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkVudHJ5IFR5cGUgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+Kjwvc3Bhbj48L2xhYmVsPlxuICAgICAgICAgICAgPHNlbGVjdCBpZD1cInB1Yi1tb2RhbC10eXBlXCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiYXJ0aWNsZVwiPmFydGljbGU8L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImlucHJvY2VlZGluZ3NcIj5pbnByb2NlZWRpbmdzPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJib29rXCI+Ym9vazwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiaW5jb2xsZWN0aW9uXCI+aW5jb2xsZWN0aW9uPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ0ZWNocmVwb3J0XCI+dGVjaHJlcG9ydDwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicGhkdGhlc2lzXCI+cGhkdGhlc2lzPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJtYXN0ZXJzdGhlc2lzXCI+bWFzdGVyc3RoZXNpczwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwibWlzY1wiPm1pc2M8L29wdGlvbj5cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjEycHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgaWQ9XCJwdWItbW9kYWwtYXV0aG9yLWxhYmVsXCIgZm9yPVwicHViLW1vZGFsLWF1dGhvclwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+QXV0aG9yKHMpIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPio8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwicHViLW1vZGFsLWF1dGhvclwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiTGFzdCwgRmlyc3QgYW5kIExhc3QyLCBGaXJzdDJcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjEycHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwicHViLW1vZGFsLXRpdGxlXCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5UaXRsZSA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4qPC9zcGFuPjwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInB1Yi1tb2RhbC10aXRsZVwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIiBhcmlhLXJlcXVpcmVkPVwidHJ1ZVwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6MTJweDttYXJnaW4tYm90dG9tOjEycHg7XCI+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDowIDAgMTAwcHg7XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwdWItbW9kYWwteWVhclwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+WWVhciA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4qPC9zcGFuPjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJwdWItbW9kYWwteWVhclwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwcHg7XCJcbiAgICAgICAgICAgICAgICAgIG1pbj1cIjE5MDBcIiBtYXg9XCIyMTAwXCIgYXJpYS1yZXF1aXJlZD1cInRydWVcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDoxO1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicHViLW1vZGFsLWpvdXJuYWxcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkpvdXJuYWwgLyBCb29rdGl0bGU8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInB1Yi1tb2RhbC1qb3VybmFsXCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxMnB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cInB1Yi1tb2RhbC1kb2lcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkRPSSAvIFVSTDwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInB1Yi1tb2RhbC1kb2lcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIjEwLnh4eHgveHh4eHhcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjRweDtcIj5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwdWItbW9kYWwtZXh0cmFcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkV4dHJhIGZpZWxkcyA8c3BhbiBzdHlsZT1cImZvbnQtd2VpZ2h0OjQwMDtjb2xvcjojNmI3MjgwO1wiPihrZXk9dmFsdWUsIG9uZSBwZXIgbGluZSk8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD1cInB1Yi1tb2RhbC1leHRyYVwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHJvd3M9XCIzXCIgc3R5bGU9XCJ3aWR0aDoxMDAlO3Jlc2l6ZTp2ZXJ0aWNhbDtmb250LWZhbWlseTptb25vc3BhY2U7Zm9udC1zaXplOjAuODVlbTtcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwidm9sdW1lPTEyJiMxMDtwYWdlcz0xLS0yMFwiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCIgc3R5bGU9XCJkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kO2dhcDo4cHg7cGFkZGluZzoxNnB4IDIwcHg7XCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwiY2xvc2VQdWJsaWNhdGlvbk1vZGFsKClcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBwcmltYXJ5XCIgb25jbGljaz1cInNhdmVNYXN0ZXJQdWJsaWNhdGlvbigpXCI+U2F2ZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBpZD1cIm1hc3Rlci1wdWItaW1wb3J0LW1vZGFsLW92ZXJsYXlcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1tb2RhbD1cInRydWVcIlxuICAgICAgICBhcmlhLWxhYmVsbGVkYnk9XCJtYXN0ZXItcHViLWltcG9ydC1tb2RhbC10aXRsZVwiIGNsYXNzPVwibW9kYWwtb3ZlcmxheVwiXG4gICAgICAgIG9uY2xpY2s9XCJpZihldmVudC50YXJnZXQ9PT10aGlzKWNsb3NlSW1wb3J0UHVibGljYXRpb25zTW9kYWwoKVwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsXCIgc3R5bGU9XCJtYXgtd2lkdGg6NjgwcHg7XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cbiAgICAgICAgICA8aDIgaWQ9XCJtYXN0ZXItcHViLWltcG9ydC1tb2RhbC10aXRsZVwiPkltcG9ydCBCaWJUZVggUHVibGljYXRpb25zPC9oMj5cbiAgICAgICAgICA8YnV0dG9uIG9uY2xpY2s9XCJjbG9zZUltcG9ydFB1YmxpY2F0aW9uc01vZGFsKClcIiBhcmlhLWxhYmVsPVwiQ2xvc2UgQmliVGVYIGltcG9ydCBkaWFsb2dcIlxuICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6bm9uZTtib3JkZXI6bm9uZTtmb250LXNpemU6MS40ZW07Y3Vyc29yOnBvaW50ZXI7Y29sb3I6IzY0NzQ4YjtcIj4mdGltZXM7PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiIHN0eWxlPVwicGFkZGluZzoyMHB4O1wiPlxuICAgICAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtmb250LXNpemU6MC45ZW07bWFyZ2luOjAgMCAxMnB4O1wiPlxuICAgICAgICAgICAgUGFzdGUgb25lIG9yIG1vcmUgQmliVGVYIGVudHJpZXMgdG8gbWVyZ2UgdGhlbSBpbnRvIDxjb2RlPnB1YmxpY2F0aW9ucy5iaWI8L2NvZGU+LlxuICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8dGV4dGFyZWEgaWQ9XCJtYXN0ZXItcHViLWltcG9ydC10ZXh0YXJlYVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZWRpdC1pbnB1dFwiXG4gICAgICAgICAgICAgIHJvd3M9XCIxMlwiXG4gICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTtmb250LWZhbWlseTptb25vc3BhY2U7Zm9udC1zaXplOjAuODVlbTtyZXNpemU6dmVydGljYWw7XCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJAYXJ0aWNsZXtzbWl0aDIwMjUsLi4ufVwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJCaWJUZVggaW1wb3J0IGNvbnRlbnRcIlxuICAgICAgICAgICAgICBzcGVsbGNoZWNrPVwiZmFsc2VcIj48L3RleHRhcmVhPlxuICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDttYXJnaW4tdG9wOjEycHg7Y29sb3I6IzMzNDE1NTtcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cIm1hc3Rlci1wdWItaW1wb3J0LW92ZXJ3cml0ZVwiIC8+XG4gICAgICAgICAgICBPdmVyd3JpdGUgZXhpc3RpbmcgZW50cmllcyB3aGVuIGNpdGUga2V5cyBhbHJlYWR5IGV4aXN0XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8ZGl2IGlkPVwibWFzdGVyLXB1Yi1pbXBvcnQtc3RhdHVzXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJtYXJnaW4tdG9wOjEwcHg7Zm9udC1zaXplOjAuODVlbTtjb2xvcjojNmI3MjgwO1wiXG4gICAgICAgICAgICAgIGFyaWEtbGl2ZT1cInBvbGl0ZVwiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiIHN0eWxlPVwiZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpmbGV4LWVuZDtnYXA6OHB4O3BhZGRpbmc6MTZweCAyMHB4O1wiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgb25jbGljaz1cImNsb3NlSW1wb3J0UHVibGljYXRpb25zTW9kYWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHByaW1hcnlcIiBpZD1cIm1hc3Rlci1wdWItaW1wb3J0LXN1Ym1pdC1idG5cIlxuICAgICAgICAgICAgICBvbmNsaWNrPVwiaW1wb3J0UHVibGljYXRpb25zQmliKClcIj5JbXBvcnQ8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgaWQ9XCJtYXN0ZXItcHViLWNvbnZlcnQtbW9kYWwtb3ZlcmxheVwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLW1vZGFsPVwidHJ1ZVwiXG4gICAgICAgIGFyaWEtbGFiZWxsZWRieT1cIm1hc3Rlci1wdWItY29udmVydC1tb2RhbC10aXRsZVwiIGNsYXNzPVwibW9kYWwtb3ZlcmxheVwiXG4gICAgICAgIG9uY2xpY2s9XCJpZihldmVudC50YXJnZXQ9PT10aGlzKWNsb3NlQ29udmVydFB1YmxpY2F0aW9uc01vZGFsKClcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbFwiIHN0eWxlPVwibWF4LXdpZHRoOjc2MHB4O1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XG4gICAgICAgICAgPGgyIGlkPVwibWFzdGVyLXB1Yi1jb252ZXJ0LW1vZGFsLXRpdGxlXCI+Q29udmVydCBDaXRhdGlvbiBUZXh0IHRvIEJpYlRlWDwvaDI+XG4gICAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPVwiY2xvc2VDb252ZXJ0UHVibGljYXRpb25zTW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJDbG9zZSBjaXRhdGlvbiBjb252ZXJzaW9uIGRpYWxvZ1wiXG4gICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDpub25lO2JvcmRlcjpub25lO2ZvbnQtc2l6ZToxLjRlbTtjdXJzb3I6cG9pbnRlcjtjb2xvcjojNjQ3NDhiO1wiPiZ0aW1lczs8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCIgc3R5bGU9XCJwYWRkaW5nOjIwcHg7XCI+XG4gICAgICAgICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO2ZvbnQtc2l6ZTowLjllbTttYXJnaW46MCAwIDEycHg7XCI+XG4gICAgICAgICAgICBQYXN0ZSBmcmVlLWZvcm0gY2l0YXRpb24gdGV4dCwgcmV2aWV3IHRoZSBnZW5lcmF0ZWQgQmliVGVYLCB0aGVuIGltcG9ydCBpdCB3aGVuIGl0IGxvb2tzIGNvcnJlY3QuXG4gICAgICAgICAgPC9wPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmdyaWQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmcjtnYXA6MTRweDtcIj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJtYXN0ZXItcHViLWNvbnZlcnQtaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkNpdGF0aW9uIFRleHQ8L2xhYmVsPlxuICAgICAgICAgICAgICA8dGV4dGFyZWEgaWQ9XCJtYXN0ZXItcHViLWNvbnZlcnQtaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJlZGl0LWlucHV0XCJcbiAgICAgICAgICAgICAgICAgIHJvd3M9XCI3XCJcbiAgICAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTtyZXNpemU6dmVydGljYWw7XCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRG9lLCBKLiAoMjAyNSkuIEFydGljbGUgdGl0bGUuIEpvdXJuYWwgTmFtZSwgMTIoMyksIDEtMTAuXCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJDaXRhdGlvbiB0ZXh0IHRvIGNvbnZlcnRcIj48L3RleHRhcmVhPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwibWFzdGVyLXB1Yi1jb252ZXJ0LW91dHB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+R2VuZXJhdGVkIEJpYlRlWCBQcmV2aWV3PC9sYWJlbD5cbiAgICAgICAgICAgICAgPHRleHRhcmVhIGlkPVwibWFzdGVyLXB1Yi1jb252ZXJ0LW91dHB1dFwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImVkaXQtaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgcm93cz1cIjEwXCJcbiAgICAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6MTAwJTtmb250LWZhbWlseTptb25vc3BhY2U7Zm9udC1zaXplOjAuODVlbTtyZXNpemU6dmVydGljYWw7XCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQ29udmVydGVkIEJpYlRlWCB3aWxsIGFwcGVhciBoZXJlXCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJHZW5lcmF0ZWQgQmliVGVYIHByZXZpZXdcIlxuICAgICAgICAgICAgICAgICAgc3BlbGxjaGVjaz1cImZhbHNlXCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDttYXJnaW4tdG9wOjEycHg7Y29sb3I6IzMzNDE1NTtcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cIm1hc3Rlci1wdWItY29udmVydC1vdmVyd3JpdGVcIiAvPlxuICAgICAgICAgICAgT3ZlcndyaXRlIGV4aXN0aW5nIGVudHJpZXMgd2hlbiBpbXBvcnRpbmcgdGhlIGdlbmVyYXRlZCBCaWJUZVhcbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxkaXYgaWQ9XCJtYXN0ZXItcHViLWNvbnZlcnQtc3RhdHVzXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJtYXJnaW4tdG9wOjEwcHg7Zm9udC1zaXplOjAuODVlbTtjb2xvcjojNmI3MjgwO1wiXG4gICAgICAgICAgICAgIGFyaWEtbGl2ZT1cInBvbGl0ZVwiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiIHN0eWxlPVwiZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpmbGV4LWVuZDtnYXA6OHB4O3BhZGRpbmc6MTZweCAyMHB4O1wiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgb25jbGljaz1cImNsb3NlQ29udmVydFB1YmxpY2F0aW9uc01vZGFsKClcIj5DbG9zZTwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHNlY29uZGFyeVwiIGlkPVwibWFzdGVyLXB1Yi1jb252ZXJ0LXN1Ym1pdC1idG5cIlxuICAgICAgICAgICAgICBvbmNsaWNrPVwiY29udmVydFB1YmxpY2F0aW9uVGV4dCgpXCI+R2VuZXJhdGUgQmliVGVYPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG4gcHJpbWFyeVwiIGlkPVwibWFzdGVyLXB1Yi1jb252ZXJ0LWltcG9ydC1idG5cIlxuICAgICAgICAgICAgICBvbmNsaWNrPVwiaW1wb3J0Q29udmVydGVkUHVibGljYXRpb25UZXh0KClcIj5JbXBvcnQgUHJldmlldzwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBQZXJzb25hbCBJbmZvIG1vZGFsIC0tPlxuICAgIDxkaXYgaWQ9XCJtYXN0ZXItcGktbW9kYWwtb3ZlcmxheVwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLW1vZGFsPVwidHJ1ZVwiXG4gICAgICAgIGFyaWEtbGFiZWxsZWRieT1cIm1hc3Rlci1waS1tb2RhbC10aXRsZVwiIGNsYXNzPVwibW9kYWwtb3ZlcmxheVwiXG4gICAgICAgIG9uY2xpY2s9XCJpZihldmVudC50YXJnZXQ9PT10aGlzKWNsb3NlUGVyc29uYWxJbmZvTW9kYWwoKVwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsXCIgc3R5bGU9XCJtYXgtd2lkdGg6NjIwcHg7XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cbiAgICAgICAgICA8aDIgaWQ9XCJtYXN0ZXItcGktbW9kYWwtdGl0bGVcIj5FZGl0IFBlcnNvbmFsIEluZm9ybWF0aW9uPC9oMj5cbiAgICAgICAgICA8YnV0dG9uIG9uY2xpY2s9XCJjbG9zZVBlcnNvbmFsSW5mb01vZGFsKClcIiBhcmlhLWxhYmVsPVwiQ2xvc2UgcGVyc29uYWwgaW5mbyBlZGl0b3JcIlxuICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6bm9uZTtib3JkZXI6bm9uZTtmb250LXNpemU6MS40ZW07Y3Vyc29yOnBvaW50ZXI7Y29sb3I6IzY0NzQ4YjtcIj4mdGltZXM7PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiIHN0eWxlPVwicGFkZGluZzoyMHB4O1wiPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmdyaWQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmciAxZnI7Z2FwOjE0cHg7XCI+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZ3JpZC1jb2x1bW46MS8tMTtcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBpLW5hbWUtaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkZ1bGwgTmFtZTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwicGktbmFtZS1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIiBwbGFjZWhvbGRlcj1cImUuZy4gSmFuZSBTbWl0aCwgUGguRC5cIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZ3JpZC1jb2x1bW46MS8tMTtcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBpLXRpdGxlLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5Qcm9mZXNzaW9uYWwgVGl0bGUgLyBIZWFkbGluZTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwicGktdGl0bGUtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgcGxhY2Vob2xkZXI9XCJlLmcuIFNlbmlvciBEYXRhIFNjaWVudGlzdFwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwaS1lbWFpbC1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+RW1haWw8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImVtYWlsXCIgaWQ9XCJwaS1lbWFpbC1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIiBwbGFjZWhvbGRlcj1cInlvdUBleGFtcGxlLmNvbVwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwaS1waG9uZS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+UGhvbmU8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRlbFwiIGlkPVwicGktcGhvbmUtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgcGxhY2Vob2xkZXI9XCI1NTUtMTIzLTQ1NjdcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicGktbGlua2VkaW4taW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkxpbmtlZEluIFVSTDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidXJsXCIgaWQ9XCJwaS1saW5rZWRpbi1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIiBwbGFjZWhvbGRlcj1cImh0dHBzOi8vbGlua2VkaW4uY29tL2luL3lvdVwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwaS13ZWJzaXRlLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5XZWJzaXRlPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ1cmxcIiBpZD1cInBpLXdlYnNpdGUtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgcGxhY2Vob2xkZXI9XCJodHRwczovL3lvdXJzaXRlLmNvbVwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwaS1jaXR5LWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5DaXR5PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJwaS1jaXR5LWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiIHBsYWNlaG9sZGVyPVwiUm9jaGVzdGVyXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBpLXN0YXRlLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5TdGF0ZSAvIFJlZ2lvbjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwicGktc3RhdGUtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgcGxhY2Vob2xkZXI9XCJOWVwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0blwiIG9uY2xpY2s9XCJjbG9zZVBlcnNvbmFsSW5mb01vZGFsKClcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBwcmltYXJ5XCIgb25jbGljaz1cInNhdmVQZXJzb25hbEluZm8oKVwiPlNhdmU8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gRXhwZXJpZW5jZSBtb2RhbCAtLT5cbiAgICA8ZGl2IGlkPVwibWFzdGVyLWV4cC1tb2RhbC1vdmVybGF5XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCIgcm9sZT1cImRpYWxvZ1wiIGFyaWEtbW9kYWw9XCJ0cnVlXCJcbiAgICAgICAgYXJpYS1sYWJlbGxlZGJ5PVwibWFzdGVyLWV4cC1tb2RhbC10aXRsZVwiIGNsYXNzPVwibW9kYWwtb3ZlcmxheVwiXG4gICAgICAgIG9uY2xpY2s9XCJpZihldmVudC50YXJnZXQ9PT10aGlzKWNsb3NlRXhwZXJpZW5jZU1vZGFsKClcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbFwiIHN0eWxlPVwibWF4LXdpZHRoOjY0MHB4O1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XG4gICAgICAgICAgPGgyIGlkPVwibWFzdGVyLWV4cC1tb2RhbC10aXRsZVwiPldvcmsgRXhwZXJpZW5jZTwvaDI+XG4gICAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPVwiY2xvc2VFeHBlcmllbmNlTW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJDbG9zZSBleHBlcmllbmNlIGVkaXRvclwiXG4gICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDpub25lO2JvcmRlcjpub25lO2ZvbnQtc2l6ZToxLjRlbTtjdXJzb3I6cG9pbnRlcjtjb2xvcjojNjQ3NDhiO1wiPiZ0aW1lczs8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCIgc3R5bGU9XCJwYWRkaW5nOjIwcHg7XCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBpZD1cImV4cC1tb2RhbC1pZFwiIC8+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6MWZyIDFmcjtnYXA6MTRweDtcIj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJncmlkLWNvbHVtbjoxLy0xO1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZXhwLXRpdGxlLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5Kb2IgVGl0bGUgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+Kjwvc3Bhbj48L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImV4cC10aXRsZS1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIiBhcmlhLXJlcXVpcmVkPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gU2VuaW9yIERhdGEgU2NpZW50aXN0XCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImdyaWQtY29sdW1uOjEvLTE7XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJleHAtY29tcGFueS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+Q29tcGFueSA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4qPC9zcGFuPjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZXhwLWNvbXBhbnktaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgYXJpYS1yZXF1aXJlZD1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIEFjbWUgQ29ycFwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJleHAtY2l0eS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+Q2l0eTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZXhwLWNpdHktaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgcGxhY2Vob2xkZXI9XCJCb3N0b25cIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZXhwLXN0YXRlLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5TdGF0ZSAvIFJlZ2lvbjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZXhwLXN0YXRlLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiIHBsYWNlaG9sZGVyPVwiTUFcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZXhwLXN0YXJ0LWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5TdGFydCBEYXRlPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJleHAtc3RhcnQtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgcGxhY2Vob2xkZXI9XCIyMDIwLTAxXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImV4cC1lbmQtaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkVuZCBEYXRlIChibGFuayA9IHByZXNlbnQpPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJleHAtZW5kLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiIHBsYWNlaG9sZGVyPVwiMjAyNC0wNiBvciBsZWF2ZSBibGFua1wiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJleHAtdHlwZS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+RW1wbG95bWVudCBUeXBlPC9sYWJlbD5cbiAgICAgICAgICAgICAgPHNlbGVjdCBpZD1cImV4cC10eXBlLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiPlxuICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJmdWxsX3RpbWVcIj5GdWxsLXRpbWU8L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicGFydF90aW1lXCI+UGFydC10aW1lPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImNvbnRyYWN0XCI+Q29udHJhY3Q8L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiY29uc3VsdGluZ1wiPkNvbnN1bHRpbmc8L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiaW50ZXJuc2hpcFwiPkludGVybnNoaXA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwic2VsZl9lbXBsb3llZFwiPlNlbGYtZW1wbG95ZWQ8L29wdGlvbj5cbiAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJleHAtaW1wb3J0YW5jZS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+SW1wb3J0YW5jZSAoMVx1MjAxMzEwKTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJleHAtaW1wb3J0YW5jZS1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6ODBweDtcIlxuICAgICAgICAgICAgICAgICAgbWluPVwiMVwiIG1heD1cIjEwXCIgdmFsdWU9XCI1XCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImdyaWQtY29sdW1uOjEvLTE7XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJleHAtdGFncy1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+VGFncyAoY29tbWEtc2VwYXJhdGVkKTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZXhwLXRhZ3MtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBtbCwgbGVhZGVyc2hpcCwgcHl0aG9uXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImdyaWQtY29sdW1uOjEvLTE7Ym9yZGVyLXRvcDoxcHggc29saWQgdmFyKC0tY3YtYm9yZGVyKTtwYWRkaW5nLXRvcDoxNHB4O21hcmdpbi10b3A6NHB4O1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjZweDtcIj5BY2hpZXZlbWVudHM8L2xhYmVsPlxuICAgICAgICAgICAgICA8ZGl2IGlkPVwiZXhwLWFjaGlldmVtZW50cy1lZGl0b3ItbGlzdFwiPjwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDo2cHg7bWFyZ2luLXRvcDo2cHg7XCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJleHAtYWNoLW5ldy1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwiZmxleDoxO1wiXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQWRkIGFuIGFjaGlldmVtZW50IG9yIGJ1bGxldFx1MjAyNlwiXG4gICAgICAgICAgICAgICAgICAgIG9ua2V5ZG93bj1cImlmKGV2ZW50LmtleT09PSdFbnRlcicpe2V2ZW50LnByZXZlbnREZWZhdWx0KCk7X2FkZEV4cEFjaGlldmVtZW50KCk7fVwiIC8+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhY3Rpb24tYnRuIHNlY29uZGFyeVwiIG9uY2xpY2s9XCJfYWRkRXhwQWNoaWV2ZW1lbnQoKVwiPisgQWRkPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwiY2xvc2VFeHBlcmllbmNlTW9kYWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHByaW1hcnlcIiBvbmNsaWNrPVwic2F2ZU1hc3RlckV4cGVyaWVuY2UoKVwiPlNhdmU8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gU2tpbGwgYWRkIG1vZGFsIC0tPlxuICAgIDxkaXYgaWQ9XCJtYXN0ZXItc2tpbGwtbW9kYWwtb3ZlcmxheVwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLW1vZGFsPVwidHJ1ZVwiXG4gICAgICAgIGFyaWEtbGFiZWxsZWRieT1cIm1hc3Rlci1za2lsbC1tb2RhbC10aXRsZVwiIGNsYXNzPVwibW9kYWwtb3ZlcmxheVwiXG4gICAgICAgIG9uY2xpY2s9XCJpZihldmVudC50YXJnZXQ9PT10aGlzKWNsb3NlU2tpbGxNb2RhbCgpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWxcIiBzdHlsZT1cIm1heC13aWR0aDo0ODBweDtcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuICAgICAgICAgIDxoMiBpZD1cIm1hc3Rlci1za2lsbC1tb2RhbC10aXRsZVwiPkFkZCBTa2lsbDwvaDI+XG4gICAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPVwiY2xvc2VTa2lsbE1vZGFsKClcIiBhcmlhLWxhYmVsPVwiQ2xvc2Ugc2tpbGwgZWRpdG9yXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOm5vbmU7Zm9udC1zaXplOjEuNGVtO2N1cnNvcjpwb2ludGVyO2NvbG9yOiM2NDc0OGI7XCI+JnRpbWVzOzwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIiBzdHlsZT1cInBhZGRpbmc6MjBweDtcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImhpZGRlblwiIGlkPVwic2tpbGwtbW9kYWwtY2F0ZWdvcnlcIiAvPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJza2lsbC1tb2RhbC1pcy1mbGF0XCIgLz5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImhpZGRlblwiIGlkPVwic2tpbGwtbW9kYWwtb3JpZ2luYWwtbmFtZVwiIC8+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTRweDtcIiBpZD1cInNraWxsLWNhdGVnb3J5LXJvd1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cInNraWxsLWNhdGVnb3J5LWRpc3BsYXlcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkNhdGVnb3J5PC9sYWJlbD5cbiAgICAgICAgICAgIDxzcGFuIGlkPVwic2tpbGwtY2F0ZWdvcnktZGlzcGxheVwiIHN0eWxlPVwiZm9udC13ZWlnaHQ6NTAwO2NvbG9yOiMzMzQxNTU7XCI+PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwic2tpbGwtbmFtZS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+U2tpbGwgTmFtZSA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4qPC9zcGFuPjwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInNraWxsLW5hbWUtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgYXJpYS1yZXF1aXJlZD1cInRydWVcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBQeXRob25cIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwic2tpbGwtZXhwZXJpZW5jZXMtaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkFzc29jaWF0ZWQgRXhwZXJpZW5jZSBJRHMgKG9wdGlvbmFsKTwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInNraWxsLWV4cGVyaWVuY2VzLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIGV4cF8xMjMsIGV4cF80NTZcIiAvPlxuICAgICAgICAgICAgPHNtYWxsIHN0eWxlPVwiZGlzcGxheTpibG9jazttYXJnaW4tdG9wOjRweDtjb2xvcjojNjQ3NDhiO1wiPkNvbW1hLXNlcGFyYXRlZCBJRHMuIEEgc2tpbGwgY2FuIGJlIGxpbmtlZCB0byBtdWx0aXBsZSBleHBlcmllbmNlcy48L3NtYWxsPlxuICAgICAgICAgICAgPGRpdiBpZD1cInNraWxsLWV4cGVyaWVuY2UtaGludHNcIiBzdHlsZT1cIm1hcmdpbi10b3A6NnB4O2ZvbnQtc2l6ZTowLjhlbTtjb2xvcjojOTRhM2I4O1wiPjwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwic2tpbGwtYWxpYXNlcy1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+QWxpYXNlcyAoY29tbWEtc2VwYXJhdGVkLCBvcHRpb25hbCk8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJza2lsbC1hbGlhc2VzLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIEpTLCBFQ01BU2NyaXB0XCIgLz5cbiAgICAgICAgICAgIDxzbWFsbCBzdHlsZT1cImRpc3BsYXk6YmxvY2s7bWFyZ2luLXRvcDo0cHg7Y29sb3I6IzY0NzQ4YjtcIj5BbHRlcm5hdGUgbmFtZXMgYW4gQVRTIG9yIHJldmlld2VyIG1pZ2h0IHNlYXJjaCBmb3IuPC9zbWFsbD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cInNraWxsLXllYXJzLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5ZZWFycyBvZiBFeHBlcmllbmNlIChvcHRpb25hbCk8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cInNraWxsLXllYXJzLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMjBweDtcIiBtaW49XCIwXCIgc3RlcD1cIjAuNVwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwiY2xvc2VTa2lsbE1vZGFsKClcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBwcmltYXJ5XCIgaWQ9XCJtYXN0ZXItc2tpbGwtc2F2ZS1idG5cIiBvbmNsaWNrPVwic2F2ZU1hc3RlclNraWxsKClcIj5BZGQgU2tpbGw8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gRWR1Y2F0aW9uIG1vZGFsIC0tPlxuICAgIDxkaXYgaWQ9XCJtYXN0ZXItZWR1LW1vZGFsLW92ZXJsYXlcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1tb2RhbD1cInRydWVcIlxuICAgICAgICBhcmlhLWxhYmVsbGVkYnk9XCJtYXN0ZXItZWR1LW1vZGFsLXRpdGxlXCIgY2xhc3M9XCJtb2RhbC1vdmVybGF5XCJcbiAgICAgICAgb25jbGljaz1cImlmKGV2ZW50LnRhcmdldD09PXRoaXMpY2xvc2VFZHVjYXRpb25Nb2RhbCgpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWxcIiBzdHlsZT1cIm1heC13aWR0aDo1ODBweDtcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuICAgICAgICAgIDxoMiBpZD1cIm1hc3Rlci1lZHUtbW9kYWwtdGl0bGVcIj5FZHVjYXRpb248L2gyPlxuICAgICAgICAgIDxidXR0b24gb25jbGljaz1cImNsb3NlRWR1Y2F0aW9uTW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJDbG9zZSBlZHVjYXRpb24gZWRpdG9yXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOm5vbmU7Zm9udC1zaXplOjEuNGVtO2N1cnNvcjpwb2ludGVyO2NvbG9yOiM2NDc0OGI7XCI+JnRpbWVzOzwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIiBzdHlsZT1cInBhZGRpbmc6MjBweDtcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImhpZGRlblwiIGlkPVwiZWR1LW1vZGFsLWlkeFwiIHZhbHVlPVwiLTFcIiAvPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmdyaWQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmciAxZnI7Z2FwOjE0cHg7XCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZWR1LWRlZ3JlZS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+RGVncmVlIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPio8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJlZHUtZGVncmVlLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiIGFyaWEtcmVxdWlyZWQ9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBQaC5ELlwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJlZHUtZmllbGQtaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkZpZWxkIG9mIFN0dWR5PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJlZHUtZmllbGQtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBCaW9zdGF0aXN0aWNzXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImdyaWQtY29sdW1uOjEvLTE7XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJlZHUtaW5zdGl0dXRpb24taW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkluc3RpdHV0aW9uIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPio8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJlZHUtaW5zdGl0dXRpb24taW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgYXJpYS1yZXF1aXJlZD1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIFVuaXZlcnNpdHkgb2YgV2FzaGluZ3RvblwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJlZHUtY2l0eS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+Q2l0eTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZWR1LWNpdHktaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgcGxhY2Vob2xkZXI9XCJTZWF0dGxlXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImVkdS1zdGF0ZS1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+U3RhdGU8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImVkdS1zdGF0ZS1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIiBwbGFjZWhvbGRlcj1cIldBXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImVkdS1zdGFydC15ZWFyLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5TdGFydCBZZWFyPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cImVkdS1zdGFydC15ZWFyLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiXG4gICAgICAgICAgICAgICAgICBtaW49XCIxOTUwXCIgbWF4PVwiMjA5OVwiIHBsYWNlaG9sZGVyPVwiMTk5NVwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJlZHUtZW5kLXllYXItaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPkVuZCBZZWFyPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cImVkdS1lbmQteWVhci1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIlxuICAgICAgICAgICAgICAgICAgbWluPVwiMTk1MFwiIG1heD1cIjIwOTlcIiBwbGFjZWhvbGRlcj1cIjIwMDBcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwiY2xvc2VFZHVjYXRpb25Nb2RhbCgpXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG4gcHJpbWFyeVwiIG9uY2xpY2s9XCJzYXZlTWFzdGVyRWR1Y2F0aW9uKClcIj5TYXZlPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEF3YXJkIG1vZGFsIC0tPlxuICAgIDxkaXYgaWQ9XCJtYXN0ZXItYXdhcmQtbW9kYWwtb3ZlcmxheVwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLW1vZGFsPVwidHJ1ZVwiXG4gICAgICAgIGFyaWEtbGFiZWxsZWRieT1cIm1hc3Rlci1hd2FyZC1tb2RhbC10aXRsZVwiIGNsYXNzPVwibW9kYWwtb3ZlcmxheVwiXG4gICAgICAgIG9uY2xpY2s9XCJpZihldmVudC50YXJnZXQ9PT10aGlzKWNsb3NlQXdhcmRNb2RhbCgpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWxcIiBzdHlsZT1cIm1heC13aWR0aDo1ODBweDtcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuICAgICAgICAgIDxoMiBpZD1cIm1hc3Rlci1hd2FyZC1tb2RhbC10aXRsZVwiPkF3YXJkIC8gSG9ub3VyPC9oMj5cbiAgICAgICAgICA8YnV0dG9uIG9uY2xpY2s9XCJjbG9zZUF3YXJkTW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJDbG9zZSBhd2FyZCBlZGl0b3JcIlxuICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6bm9uZTtib3JkZXI6bm9uZTtmb250LXNpemU6MS40ZW07Y3Vyc29yOnBvaW50ZXI7Y29sb3I6IzY0NzQ4YjtcIj4mdGltZXM7PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiIHN0eWxlPVwicGFkZGluZzoyMHB4O1wiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJhd2FyZC1tb2RhbC1pZHhcIiB2YWx1ZT1cIi0xXCIgLz5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cImF3YXJkLXRpdGxlLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5UaXRsZSA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4qPC9zcGFuPjwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImF3YXJkLXRpdGxlLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiIGFyaWEtcmVxdWlyZWQ9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gRW1wbG95ZWUgb2YgdGhlIFllYXJcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwiYXdhcmQteWVhci1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+WWVhcjwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiYXdhcmQteWVhci1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwcHg7XCJcbiAgICAgICAgICAgICAgICBtaW49XCIxOTUwXCIgbWF4PVwiMjA5OVwiIHBsYWNlaG9sZGVyPVwiMjAyMlwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTRweDtcIj5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJhd2FyZC1kZXNjLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5EZXNjcmlwdGlvbjwvbGFiZWw+XG4gICAgICAgICAgICA8dGV4dGFyZWEgaWQ9XCJhd2FyZC1kZXNjLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgcm93cz1cIjNcIiBzdHlsZT1cIndpZHRoOjEwMCU7cmVzaXplOnZlcnRpY2FsO1wiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJCcmllZiBjb250ZXh0IG9yIGFjaGlldmVtZW50IGRlc2NyaXB0aW9uXCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cImF3YXJkLXJlbGV2YW50LWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5SZWxldmFudCBmb3IgKGNvbW1hLXNlcGFyYXRlZCk8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJhd2FyZC1yZWxldmFudC1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBsZWFkZXJzaGlwLCBwaGFybWFcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgb25jbGljaz1cImNsb3NlQXdhcmRNb2RhbCgpXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG4gcHJpbWFyeVwiIG9uY2xpY2s9XCJzYXZlTWFzdGVyQXdhcmQoKVwiPlNhdmU8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gQ2VydGlmaWNhdGlvbiBtb2RhbCAtLT5cbiAgICA8ZGl2IGlkPVwibWFzdGVyLWNlcnQtbW9kYWwtb3ZlcmxheVwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLW1vZGFsPVwidHJ1ZVwiXG4gICAgICAgIGFyaWEtbGFiZWxsZWRieT1cIm1hc3Rlci1jZXJ0LW1vZGFsLXRpdGxlXCIgY2xhc3M9XCJtb2RhbC1vdmVybGF5XCJcbiAgICAgICAgb25jbGljaz1cImlmKGV2ZW50LnRhcmdldD09PXRoaXMpY2xvc2VDZXJ0aWZpY2F0aW9uTW9kYWwoKVwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsXCIgc3R5bGU9XCJtYXgtd2lkdGg6NTAwcHg7XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cbiAgICAgICAgICA8aDIgaWQ9XCJtYXN0ZXItY2VydC1tb2RhbC10aXRsZVwiPkNlcnRpZmljYXRpb248L2gyPlxuICAgICAgICAgIDxidXR0b24gb25jbGljaz1cImNsb3NlQ2VydGlmaWNhdGlvbk1vZGFsKClcIiBhcmlhLWxhYmVsPVwiQ2xvc2UgY2VydGlmaWNhdGlvbiBlZGl0b3JcIlxuICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6bm9uZTtib3JkZXI6bm9uZTtmb250LXNpemU6MS40ZW07Y3Vyc29yOnBvaW50ZXI7Y29sb3I6IzY0NzQ4YjtcIj4mdGltZXM7PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiIHN0eWxlPVwicGFkZGluZzoyMHB4O1wiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJjZXJ0LW1vZGFsLWlkeFwiIHZhbHVlPVwiLTFcIiAvPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwiY2VydC1uYW1lLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5OYW1lIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPio8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiY2VydC1uYW1lLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiIGFyaWEtcmVxdWlyZWQ9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gQVdTIENlcnRpZmllZCBTb2x1dGlvbnMgQXJjaGl0ZWN0XCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNlcnQtaXNzdWVyLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5Jc3N1ZXI8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJjZXJ0LWlzc3Vlci1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBBbWF6b24gV2ViIFNlcnZpY2VzXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNlcnQteWVhci1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+WWVhcjwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiY2VydC15ZWFyLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDBweDtcIlxuICAgICAgICAgICAgICAgIG1pbj1cIjE5NTBcIiBtYXg9XCIyMDk5XCIgcGxhY2Vob2xkZXI9XCIyMDIzXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0blwiIG9uY2xpY2s9XCJjbG9zZUNlcnRpZmljYXRpb25Nb2RhbCgpXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG4gcHJpbWFyeVwiIG9uY2xpY2s9XCJzYXZlTWFzdGVyQ2VydGlmaWNhdGlvbigpXCI+U2F2ZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBBY2hpZXZlbWVudCBlZGl0IG1vZGFsIC0tPlxuICAgIDxkaXYgaWQ9XCJtYXN0ZXItYWNoLW1vZGFsLW92ZXJsYXlcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1tb2RhbD1cInRydWVcIlxuICAgICAgICBhcmlhLWxhYmVsbGVkYnk9XCJtYXN0ZXItYWNoLW1vZGFsLXRpdGxlXCIgY2xhc3M9XCJtb2RhbC1vdmVybGF5XCJcbiAgICAgICAgb25jbGljaz1cImlmKGV2ZW50LnRhcmdldD09PXRoaXMpY2xvc2VNYXN0ZXJBY2hNb2RhbCgpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWxcIiBzdHlsZT1cIm1heC13aWR0aDo2MDBweDtcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuICAgICAgICAgIDxoMiBpZD1cIm1hc3Rlci1hY2gtbW9kYWwtdGl0bGVcIj5BY2hpZXZlbWVudDwvaDI+XG4gICAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPVwiY2xvc2VNYXN0ZXJBY2hNb2RhbCgpXCIgYXJpYS1sYWJlbD1cIkNsb3NlIGFjaGlldmVtZW50IGVkaXRvclwiXG4gICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDpub25lO2JvcmRlcjpub25lO2ZvbnQtc2l6ZToxLjRlbTtjdXJzb3I6cG9pbnRlcjtjb2xvcjojNjQ3NDhiO1wiPiZ0aW1lczs8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCIgc3R5bGU9XCJwYWRkaW5nOjIwcHg7XCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBpZD1cImFjaC1tb2RhbC1pZFwiIC8+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTRweDtcIj5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJhY2gtbW9kYWwtdGl0bGUtaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPlRpdGxlIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPio8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiYWNoLW1vZGFsLXRpdGxlLWlucHV0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiIGFyaWEtcmVxdWlyZWQ9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gTGVkIDNcdTAwRDcgcmV2ZW51ZSBncm93dGggaW5pdGlhdGl2ZVwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTRweDtcIj5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJhY2gtbW9kYWwtZGVzYy1pbnB1dFwiIHN0eWxlPVwiZGlzcGxheTpibG9jaztmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo0cHg7XCI+RGVzY3JpcHRpb248L2xhYmVsPlxuICAgICAgICAgICAgPHRleHRhcmVhIGlkPVwiYWNoLW1vZGFsLWRlc2MtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiByb3dzPVwiM1wiIHN0eWxlPVwid2lkdGg6MTAwJTtyZXNpemU6dmVydGljYWw7XCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIk9wdGlvbmFsIGRldGFpbCBvciBtZXRyaWNcIj48L3RleHRhcmVhPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE0cHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwiYWNoLW1vZGFsLXJlbGV2YW50LWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5SZWxldmFudCBmb3IgKGNvbW1hLXNlcGFyYXRlZCByb2xlcy9kb21haW5zKTwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImFjaC1tb2RhbC1yZWxldmFudC1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBsZWFkZXJzaGlwLCBNTCBlbmdpbmVlcmluZywgZGF0YSBzY2llbmNlXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cImFjaC1tb2RhbC1pbXBvcnRhbmNlLWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5JbXBvcnRhbmNlICgxXHUyMDEzMTApPC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJhY2gtbW9kYWwtaW1wb3J0YW5jZS1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6ODBweDtcIlxuICAgICAgICAgICAgICAgIG1pbj1cIjFcIiBtYXg9XCIxMFwiIHZhbHVlPVwiN1wiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwiY2xvc2VNYXN0ZXJBY2hNb2RhbCgpXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG4gcHJpbWFyeVwiIG9uY2xpY2s9XCJzYXZlTWFzdGVyQWNoaWV2ZW1lbnQoKVwiPlNhdmU8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gU3VtbWFyeSBlZGl0IG1vZGFsIC0tPlxuICAgIDxkaXYgaWQ9XCJtYXN0ZXItc3VtLW1vZGFsLW92ZXJsYXlcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1tb2RhbD1cInRydWVcIlxuICAgICAgICBhcmlhLWxhYmVsbGVkYnk9XCJtYXN0ZXItc3VtLW1vZGFsLXRpdGxlXCIgY2xhc3M9XCJtb2RhbC1vdmVybGF5XCJcbiAgICAgICAgb25jbGljaz1cImlmKGV2ZW50LnRhcmdldD09PXRoaXMpY2xvc2VNYXN0ZXJTdW1Nb2RhbCgpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWxcIiBzdHlsZT1cIm1heC13aWR0aDo2MDBweDtcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuICAgICAgICAgIDxoMiBpZD1cIm1hc3Rlci1zdW0tbW9kYWwtdGl0bGVcIj5Qcm9mZXNzaW9uYWwgU3VtbWFyeTwvaDI+XG4gICAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPVwiY2xvc2VNYXN0ZXJTdW1Nb2RhbCgpXCIgYXJpYS1sYWJlbD1cIkNsb3NlIHN1bW1hcnkgZWRpdG9yXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOm5vbmU7Zm9udC1zaXplOjEuNGVtO2N1cnNvcjpwb2ludGVyO2NvbG9yOiM2NDc0OGI7XCI+JnRpbWVzOzwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIiBzdHlsZT1cInBhZGRpbmc6MjBweDtcIj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cInN1bS1tb2RhbC1rZXktaW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NHB4O1wiPktleS9uYW1lIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPio8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwic3VtLW1vZGFsLWtleS1pbnB1dFwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIiBhcmlhLXJlcXVpcmVkPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIG1sX2VuZ2luZWVyaW5nIG9yIGxlYWRlcnNoaXBcIiAvPlxuICAgICAgICAgICAgPHAgc3R5bGU9XCJmb250LXNpemU6MC44MmVtO2NvbG9yOiM2YjcyODA7bWFyZ2luOjRweCAwIDA7XCI+VXNlIGxvd2VyY2FzZV91bmRlcnNjb3JlIFx1MjAxNCB0aGlzIGlzIHRoZSBrZXkgdXNlZCBpbnRlcm5hbGx5IGFuZCBzaG93biBpbiB0aGUgU3VtbWFyeSBGb2N1cyBzdGVwLjwvcD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNHB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cInN1bS1tb2RhbC10ZXh0LWlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweDtcIj5TdW1tYXJ5IHRleHQgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+Kjwvc3Bhbj48L2xhYmVsPlxuICAgICAgICAgICAgPHRleHRhcmVhIGlkPVwic3VtLW1vZGFsLXRleHQtaW5wdXRcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiByb3dzPVwiNVwiIHN0eWxlPVwid2lkdGg6MTAwJTtyZXNpemU6dmVydGljYWw7XCIgYXJpYS1yZXF1aXJlZD1cInRydWVcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiV3JpdGUgeW91ciBwcm9mZXNzaW9uYWwgc3VtbWFyeSB2YXJpYW50IGhlcmVcdTIwMjZcIj48L3RleHRhcmVhPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgb25jbGljaz1cImNsb3NlTWFzdGVyU3VtTW9kYWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHByaW1hcnlcIiBvbmNsaWNrPVwic2F2ZU1hc3RlclN1bW1hcnkoKVwiPlNhdmU8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYDtcbiAgLy8gRGlzYWJsZSB3cml0ZSBjb250cm9scyB3aGVuIHRoZSB3b3JrZmxvdyBwaGFzZSBkb2VzIG5vdCBwZXJtaXQgTWFzdGVyIENWIGVkaXRzLlxuICBpZiAoIWlzRWRpdGFibGUpIHtcbiAgICBjb25zdCBTQUZFX09OQ0xJQ0sgPSAvXihleHBvcnRNYXN0ZXJDVnx2YWxpZGF0ZVB1YmxpY2F0aW9uc0JpYnxvcGVuQmFja3VwSGlzdG9yeU1vZGFsfHJlc3RvcmVCYWNrdXB8b3BlbkZ1bGxEYXRhUHJldmlld01vZGFsKVxcKC87XG4gICAgY29udGVudC5xdWVyeVNlbGVjdG9yQWxsKCdidXR0b24nKS5mb3JFYWNoKGJ0biA9PiB7XG4gICAgICBjb25zdCBvbmNsaWNrID0gKGJ0bi5nZXRBdHRyaWJ1dGUoJ29uY2xpY2snKSB8fCAnJykudHJpbSgpO1xuICAgICAgaWYgKFNBRkVfT05DTElDSy50ZXN0KG9uY2xpY2spKSByZXR1cm47XG4gICAgICBidG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgYnRuLnN0eWxlLm9wYWNpdHkgPSAnMC40NSc7XG4gICAgICBidG4uc3R5bGUuY3Vyc29yID0gJ25vdC1hbGxvd2VkJztcbiAgICAgIGJ0bi5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgJ0VkaXRpbmcgbG9ja2VkIFx1MjAxNCBjb21wbGV0ZSB0aGUgY3VycmVudCBzdGFnZSB0byByZS1lbmFibGUnKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIExvYWQgcHVibGljYXRpb25zIGFzeW5jaHJvbm91c2x5IGFmdGVyIHRoZSBET00gaXMgcmVhZHkuXG4gIGxvYWRQdWJsaWNhdGlvbnMoKTtcbn1cblxuZnVuY3Rpb24gX3JlbmRlclBlcnNvbmFsSW5mb0NhcmQocGkpIHtcbiAgY29uc3QgY29udGFjdCA9IHBpLmNvbnRhY3QgfHwge307XG4gIGNvbnN0IGFkZHJlc3MgPSBjb250YWN0LmFkZHJlc3MgfHwge307XG4gIGNvbnN0IHJvd3MgPSBbXG4gICAgWydOYW1lJywgICAgICBwaS5uYW1lIHx8ICcnXSxcbiAgICBbJ1RpdGxlJywgICAgIHBpLnRpdGxlIHx8IHBpLmhlYWRsaW5lIHx8ICcnXSxcbiAgICBbJ0VtYWlsJywgICAgIGNvbnRhY3QuZW1haWwgfHwgcGkuZW1haWwgfHwgJyddLFxuICAgIFsnUGhvbmUnLCAgICAgY29udGFjdC5waG9uZSB8fCAnJ10sXG4gICAgWydMaW5rZWRJbicsICBjb250YWN0LmxpbmtlZGluIHx8ICcnXSxcbiAgICBbJ1dlYnNpdGUnLCAgIGNvbnRhY3Qud2Vic2l0ZSB8fCAnJ10sXG4gICAgWydMb2NhdGlvbicsICBbYWRkcmVzcy5jaXR5LCBhZGRyZXNzLnN0YXRlXS5maWx0ZXIoQm9vbGVhbikuam9pbignLCAnKV0sXG4gIF0uZmlsdGVyKChbLCB2XSkgPT4gdik7XG4gIGlmICghcm93cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gJzxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtwYWRkaW5nOjEycHggMDtcIj5ObyBwZXJzb25hbCBpbmZvcm1hdGlvbiBvbiBmaWxlLiBDbGljayBcIlx1MjcwRlx1RkUwRiBFZGl0XCIgYWJvdmUgdG8gYWRkIHlvdXIgZGV0YWlscy48L3A+JztcbiAgfVxuICByZXR1cm4gYDxkbCBjbGFzcz1cIm1hc3Rlci1pbmZvLWdyaWRcIj4ke3Jvd3MubWFwKChbbGFiZWwsIHZhbHVlXSkgPT5cbiAgICBgPGRpdiBjbGFzcz1cIm1hc3Rlci1pbmZvLXJvd1wiPjxkdD4ke2VzY2FwZUh0bWwobGFiZWwpfTwvZHQ+PGRkPiR7ZXNjYXBlSHRtbCh2YWx1ZSl9PC9kZD48L2Rpdj5gXG4gICkuam9pbignJyl9PC9kbD5gO1xufVxuXG5mdW5jdGlvbiBfcmVuZGVyRXhwZXJpZW5jZXNMaXN0KGV4cGVyaWVuY2VzKSB7XG4gIGlmICghZXhwZXJpZW5jZXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuICc8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7cGFkZGluZzoxMnB4IDA7XCI+Tm8gZXhwZXJpZW5jZSBlbnRyaWVzIHlldC4gQ2xpY2sgXCIrIEFkZCBFeHBlcmllbmNlXCIgYWJvdmUuPC9wPic7XG4gIH1cbiAgY29uc3Qgcm93cyA9IGV4cGVyaWVuY2VzLm1hcCgoZXhwLCBpZHgpID0+IHtcbiAgICBjb25zdCB0aXRsZSAgID0gZXNjYXBlSHRtbChleHAudGl0bGUgfHwgJycpO1xuICAgIGNvbnN0IGNvbXBhbnkgPSBlc2NhcGVIdG1sKGV4cC5jb21wYW55IHx8ICcnKTtcbiAgICBjb25zdCBsb2MgICAgID0gZXhwLmxvY2F0aW9uIHx8IHt9O1xuICAgIGNvbnN0IGxvY2F0aW9uID0gZXNjYXBlSHRtbChbbG9jLmNpdHksIGxvYy5zdGF0ZV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJywgJykpO1xuICAgIGNvbnN0IGRhdGVzICAgPSBlc2NhcGVIdG1sKFtleHAuc3RhcnRfZGF0ZSwgZXhwLmVuZF9kYXRlIHx8ICdQcmVzZW50J10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyBcdTIwMTMgJykpO1xuICAgIGNvbnN0IGFjaENvdW50ID0gKGV4cC5hY2hpZXZlbWVudHMgfHwgW10pLmxlbmd0aDtcbiAgICBjb25zdCBleHBJZCA9IGVzY2FwZUh0bWwoZXhwLmlkIHx8ICcnKTtcbiAgICByZXR1cm4gYFxuICAgICAgPHRyPlxuICAgICAgICA8dGQ+XG4gICAgICAgICAgPHN0cm9uZz4ke3RpdGxlfTwvc3Ryb25nPjxicj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiM0NzU1Njk7XCI+JHtjb21wYW55fTwvc3Bhbj5cbiAgICAgICAgICAke2xvY2F0aW9uID8gYDxzcGFuIHN0eWxlPVwiY29sb3I6Izk0YTNiODtmb250LXNpemU6MC44NWVtO1wiPiBcdTAwQjcgJHtsb2NhdGlvbn08L3NwYW4+YCA6ICcnfVxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2NvbG9yOiM0NzU1Njk7d2hpdGUtc3BhY2U6bm93cmFwO1wiPiR7ZGF0ZXN9PC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7Y29sb3I6Izk0YTNiODtmb250LXNpemU6MC44NWVtO1wiPiR7YWNoQ291bnR9PC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwiYWN0aW9uLWJ0bnNcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBvbmNsaWNrPVwiZWRpdE1hc3RlckV4cGVyaWVuY2UoJyR7ZXhwSWR9JylcIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiRWRpdCBleHBlcmllbmNlOiAke3RpdGxlfVwiIHRpdGxlPVwiRWRpdFwiPlx1MjcwRlx1RkUwRjwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIG9uY2xpY2s9XCJkZWxldGVNYXN0ZXJFeHBlcmllbmNlKCcke2VzY2FwZUh0bWwoZXhwLmlkIHx8ICcnKX0nLCAnJHt0aXRsZX0nKVwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJEZWxldGUgZXhwZXJpZW5jZTogJHt0aXRsZX1cIiB0aXRsZT1cIkRlbGV0ZVwiPlx1RDgzRFx1REREMVx1RkUwRjwvYnV0dG9uPlxuICAgICAgICA8L3RkPlxuICAgICAgPC90cj5gO1xuICB9KS5qb2luKCcnKTtcbiAgcmV0dXJuIGBcbiAgICA8dGFibGUgY2xhc3M9XCJyZXZpZXctdGFibGVcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCI+XG4gICAgICA8dGhlYWQ+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8dGg+Um9sZSAvIENvbXBhbnk8L3RoPlxuICAgICAgICAgIDx0aD5EYXRlczwvdGg+XG4gICAgICAgICAgPHRoIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7d2lkdGg6NjBweDtcIj5CdWxsZXRzPC90aD5cbiAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDo4MHB4O1wiPkFjdGlvbnM8L3RoPlxuICAgICAgICA8L3RyPlxuICAgICAgPC90aGVhZD5cbiAgICAgIDx0Ym9keT4ke3Jvd3N9PC90Ym9keT5cbiAgICA8L3RhYmxlPmA7XG59XG5cbmZ1bmN0aW9uIF9yZW5kZXJTa2lsbHNTZWN0aW9uKHNraWxscykge1xuICBjb25zdCBub3JtYWxpemVTa2lsbCA9IChzKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBzID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHsgbmFtZTogcywgZXhwZXJpZW5jZXM6IFtdIH07XG4gICAgfVxuICAgIGlmIChzICYmIHR5cGVvZiBzID09PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogcy5uYW1lIHx8ICcnLFxuICAgICAgICBleHBlcmllbmNlczogQXJyYXkuaXNBcnJheShzLmV4cGVyaWVuY2VzKSA/IHMuZXhwZXJpZW5jZXMgOiBbXSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7IG5hbWU6IFN0cmluZyhzIHx8ICcnKSwgZXhwZXJpZW5jZXM6IFtdIH07XG4gIH07XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoc2tpbGxzKSkge1xuICAgIGlmICghc2tpbGxzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuICc8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7cGFkZGluZzoxMnB4IDA7XCI+Tm8gc2tpbGxzIG9uIGZpbGUuIENsaWNrIFwiKyBBZGQgU2tpbGxcIiBhYm92ZS48L3A+JztcbiAgICB9XG4gICAgY29uc3QgY2hpcHMgPSBza2lsbHMubWFwKHMgPT4ge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZVNraWxsKHMpO1xuICAgICAgY29uc3QgbmFtZSA9IGVzY2FwZUh0bWwobm9ybWFsaXplZC5uYW1lKTtcbiAgICAgIGNvbnN0IHJhdyA9IGVzY2FwZUh0bWwobm9ybWFsaXplZC5uYW1lKTtcbiAgICAgIGNvbnN0IGJhZGdlID0gbm9ybWFsaXplZC5leHBlcmllbmNlcy5sZW5ndGhcbiAgICAgICAgPyBgPHNtYWxsIHN0eWxlPVwiY29sb3I6IzY0NzQ4YjttYXJnaW4tbGVmdDo2cHg7XCI+KCR7bm9ybWFsaXplZC5leHBlcmllbmNlcy5sZW5ndGh9IGV4cCk8L3NtYWxsPmBcbiAgICAgICAgOiAnJztcbiAgICAgIGNvbnN0IHNraWxsSnNvbiA9IGVzY2FwZUh0bWwoSlNPTi5zdHJpbmdpZnkoeyBuYW1lOiBub3JtYWxpemVkLm5hbWUsIGV4cGVyaWVuY2VzOiBub3JtYWxpemVkLmV4cGVyaWVuY2VzIH0pKTtcbiAgICAgIHJldHVybiBgPHNwYW4gY2xhc3M9XCJza2lsbC1jaGlwXCI+JHtuYW1lfSR7YmFkZ2V9PGJ1dHRvbiBjbGFzcz1cInNraWxsLWNoaXAtZGVsXCIgb25jbGljaz1cImVkaXRNYXN0ZXJTa2lsbCgke3NraWxsSnNvbn0sICcnLCB0cnVlKVwiIGFyaWEtbGFiZWw9XCJFZGl0IHNraWxsICR7bmFtZX1cIiB0aXRsZT1cIkVkaXRcIj5cdTI3MEZcdUZFMEY8L2J1dHRvbj48YnV0dG9uIGNsYXNzPVwic2tpbGwtY2hpcC1kZWxcIiBvbmNsaWNrPVwiZGVsZXRlTWFzdGVyU2tpbGwoJyR7cmF3fScsICcnLCB0cnVlKVwiIGFyaWEtbGFiZWw9XCJSZW1vdmUgc2tpbGwgJHtuYW1lfVwiIHRpdGxlPVwiUmVtb3ZlXCI+XHUwMEQ3PC9idXR0b24+PC9zcGFuPmA7XG4gICAgfSkuam9pbignJyk7XG4gICAgcmV0dXJuIGA8ZGl2IGNsYXNzPVwic2tpbGwtY2hpcHMtY29udGFpbmVyXCI+JHtjaGlwc308L2Rpdj5gO1xuICB9XG4gIGlmICh0eXBlb2Ygc2tpbGxzID09PSAnb2JqZWN0JyAmJiBza2lsbHMgIT09IG51bGwpIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoc2tpbGxzKTtcbiAgICBpZiAoIWtleXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gJzxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtwYWRkaW5nOjEycHggMDtcIj5ObyBza2lsbCBjYXRlZ29yaWVzIG9uIGZpbGUuPC9wPic7XG4gICAgfVxuICAgIHJldHVybiBrZXlzLm1hcChjYXRLZXkgPT4ge1xuICAgICAgY29uc3QgY2F0VmFsICA9IHNraWxsc1tjYXRLZXldO1xuICAgICAgY29uc3QgY2F0TmFtZSAgPSB0eXBlb2YgY2F0VmFsID09PSAnb2JqZWN0JyAmJiBjYXRWYWwuY2F0ZWdvcnkgPyBjYXRWYWwuY2F0ZWdvcnkgOiBjYXRLZXk7XG4gICAgICBjb25zdCBjYXRMaXN0ICA9IEFycmF5LmlzQXJyYXkoY2F0VmFsKSA/IGNhdFZhbFxuICAgICAgICAgICAgICAgICAgICAgOiBBcnJheS5pc0FycmF5KGNhdFZhbD8uc2tpbGxzKSA/IGNhdFZhbC5za2lsbHMgOiBbXTtcbiAgICAgIGNvbnN0IGNoaXBzICAgPSBjYXRMaXN0Lm1hcChzID0+IHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZVNraWxsKHMpO1xuICAgICAgICBjb25zdCBuYW1lID0gZXNjYXBlSHRtbChub3JtYWxpemVkLm5hbWUpO1xuICAgICAgICBjb25zdCBiYWRnZSA9IG5vcm1hbGl6ZWQuZXhwZXJpZW5jZXMubGVuZ3RoXG4gICAgICAgICAgPyBgPHNtYWxsIHN0eWxlPVwiY29sb3I6IzY0NzQ4YjttYXJnaW4tbGVmdDo2cHg7XCI+KCR7bm9ybWFsaXplZC5leHBlcmllbmNlcy5sZW5ndGh9IGV4cCk8L3NtYWxsPmBcbiAgICAgICAgICA6ICcnO1xuICAgICAgICBjb25zdCBza2lsbEpzb24gPSBlc2NhcGVIdG1sKEpTT04uc3RyaW5naWZ5KHsgbmFtZTogbm9ybWFsaXplZC5uYW1lLCBleHBlcmllbmNlczogbm9ybWFsaXplZC5leHBlcmllbmNlcyB9KSk7XG4gICAgICAgIHJldHVybiBgPHNwYW4gY2xhc3M9XCJza2lsbC1jaGlwXCI+JHtuYW1lfSR7YmFkZ2V9PGJ1dHRvbiBjbGFzcz1cInNraWxsLWNoaXAtZGVsXCIgb25jbGljaz1cImVkaXRNYXN0ZXJTa2lsbCgke3NraWxsSnNvbn0sICcke2VzY2FwZUh0bWwoY2F0S2V5KX0nLCBmYWxzZSlcIiBhcmlhLWxhYmVsPVwiRWRpdCAke25hbWV9XCIgdGl0bGU9XCJFZGl0XCI+XHUyNzBGXHVGRTBGPC9idXR0b24+PGJ1dHRvbiBjbGFzcz1cInNraWxsLWNoaXAtZGVsXCIgb25jbGljaz1cImRlbGV0ZU1hc3RlclNraWxsKCcke25hbWV9JywgJyR7ZXNjYXBlSHRtbChjYXRLZXkpfScsIGZhbHNlKVwiIGFyaWEtbGFiZWw9XCJSZW1vdmUgJHtuYW1lfVwiIHRpdGxlPVwiUmVtb3ZlXCI+XHUwMEQ3PC9idXR0b24+PC9zcGFuPmA7XG4gICAgICB9KS5qb2luKCcnKTtcbiAgICAgIGNvbnN0IGNhdEtleUVzYyAgPSBlc2NhcGVIdG1sKGNhdEtleSk7XG4gICAgICBjb25zdCBjYXROYW1lRXNjID0gZXNjYXBlSHRtbChjYXROYW1lKTtcbiAgICAgIHJldHVybiBgXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc2tpbGwtY2F0ZWdvcnlcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWFzdGVyLXNraWxsLWNhdC1oZWFkZXJcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWFzdGVyLXNraWxsLWNhdC1uYW1lXCI+JHtjYXROYW1lRXNjfTwvc3Bhbj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuLXNtXCIgb25jbGljaz1cInNob3dBZGRTa2lsbE1vZGFsKCcke2NhdEtleUVzY30nLCBmYWxzZSlcIlxuICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJBZGQgc2tpbGwgdG8gJHtjYXROYW1lRXNjfVwiPisgQWRkPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNraWxsLWNoaXBzLWNvbnRhaW5lclwiPiR7Y2hpcHMgfHwgJzxzcGFuIHN0eWxlPVwiY29sb3I6Izk0YTNiODtmb250LXNpemU6MC44NWVtO1wiPk5vIHNraWxscyBpbiB0aGlzIGNhdGVnb3J5PC9zcGFuPid9PC9kaXY+XG4gICAgICAgIDwvZGl2PmA7XG4gICAgfSkuam9pbignJyk7XG4gIH1cbiAgcmV0dXJuICc8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7XCI+U2tpbGxzIGRhdGEgZm9ybWF0IG5vdCByZWNvZ25pc2VkLjwvcD4nO1xufVxuXG5mdW5jdGlvbiBfcmVuZGVyRWR1Y2F0aW9uTGlzdChlZHVjYXRpb24pIHtcbiAgaWYgKCFlZHVjYXRpb24ubGVuZ3RoKSB7XG4gICAgcmV0dXJuICc8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7cGFkZGluZzoxMnB4IDA7XCI+Tm8gZWR1Y2F0aW9uIGVudHJpZXMgeWV0LiBDbGljayBcIisgQWRkIEVkdWNhdGlvblwiIGFib3ZlLjwvcD4nO1xuICB9XG4gIGNvbnN0IHJvd3MgPSBlZHVjYXRpb24ubWFwKChlZHUsIGlkeCkgPT4ge1xuICAgIGNvbnN0IGRlZ3JlZSAgICAgID0gZXNjYXBlSHRtbChlZHUuZGVncmVlIHx8ICcnKTtcbiAgICBjb25zdCBmaWVsZCAgICAgICA9IGVzY2FwZUh0bWwoZWR1LmZpZWxkIHx8ICcnKTtcbiAgICBjb25zdCBpbnN0aXR1dGlvbiA9IGVzY2FwZUh0bWwoZWR1Lmluc3RpdHV0aW9uIHx8ICcnKTtcbiAgICBjb25zdCBsb2MgICAgICAgICA9IGVkdS5sb2NhdGlvbiB8fCB7fTtcbiAgICBjb25zdCBsb2NhdGlvbiAgICA9IGVzY2FwZUh0bWwoW2xvYy5jaXR5LCBsb2Muc3RhdGVdLmZpbHRlcihCb29sZWFuKS5qb2luKCcsICcpKTtcbiAgICBjb25zdCB5ZWFycyAgICAgICA9IFtlZHUuc3RhcnRfeWVhciwgZWR1LmVuZF95ZWFyXS5maWx0ZXIoQm9vbGVhbikuam9pbignXHUyMDEzJyk7XG4gICAgY29uc3QgZWR1SnNvbiA9IGVzY2FwZUh0bWwoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZGVncmVlOiBlZHUuZGVncmVlIHx8ICcnLCBmaWVsZDogZWR1LmZpZWxkIHx8ICcnLCBpbnN0aXR1dGlvbjogZWR1Lmluc3RpdHV0aW9uIHx8ICcnLFxuICAgICAgY2l0eTogbG9jLmNpdHkgfHwgJycsIHN0YXRlOiBsb2Muc3RhdGUgfHwgJycsXG4gICAgICBzdGFydF95ZWFyOiBlZHUuc3RhcnRfeWVhciB8fCAnJywgZW5kX3llYXI6IGVkdS5lbmRfeWVhciB8fCAnJyxcbiAgICB9KSk7XG4gICAgcmV0dXJuIGBcbiAgICAgIDx0cj5cbiAgICAgICAgPHRkPlxuICAgICAgICAgIDxzdHJvbmc+JHtkZWdyZWV9JHtmaWVsZCA/IGAsICR7ZmllbGR9YCA6ICcnfTwvc3Ryb25nPjxicj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiM0NzU1Njk7XCI+JHtpbnN0aXR1dGlvbn08L3NwYW4+XG4gICAgICAgICAgJHtsb2NhdGlvbiA/IGA8c3BhbiBzdHlsZT1cImNvbG9yOiM5NGEzYjg7Zm9udC1zaXplOjAuODVlbTtcIj4gXHUwMEI3ICR7bG9jYXRpb259PC9zcGFuPmAgOiAnJ31cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtjb2xvcjojNDc1NTY5O3doaXRlLXNwYWNlOm5vd3JhcDtcIj4ke3llYXJzIHx8ICdcdTIwMTQnfTwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cImFjdGlvbi1idG5zXCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgb25jbGljaz1cImVkaXRNYXN0ZXJFZHVjYXRpb24oJHtlZHVKc29ufSwgJHtpZHh9KVwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJFZGl0IGVkdWNhdGlvbjogJHtpbnN0aXR1dGlvbn1cIiB0aXRsZT1cIkVkaXRcIj5cdTI3MEZcdUZFMEY8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBvbmNsaWNrPVwiZGVsZXRlTWFzdGVyRWR1Y2F0aW9uKCR7aWR4fSwgJyR7aW5zdGl0dXRpb259JylcIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiRGVsZXRlIGVkdWNhdGlvbjogJHtpbnN0aXR1dGlvbn1cIiB0aXRsZT1cIkRlbGV0ZVwiPlx1RDgzRFx1REREMVx1RkUwRjwvYnV0dG9uPlxuICAgICAgICA8L3RkPlxuICAgICAgPC90cj5gO1xuICB9KS5qb2luKCcnKTtcbiAgcmV0dXJuIGBcbiAgICA8dGFibGUgY2xhc3M9XCJyZXZpZXctdGFibGVcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCI+XG4gICAgICA8dGhlYWQ+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8dGg+RGVncmVlIC8gSW5zdGl0dXRpb248L3RoPlxuICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOjEwMHB4O1wiPlllYXJzPC90aD5cbiAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDo4MHB4O1wiPkFjdGlvbnM8L3RoPlxuICAgICAgICA8L3RyPlxuICAgICAgPC90aGVhZD5cbiAgICAgIDx0Ym9keT4ke3Jvd3N9PC90Ym9keT5cbiAgICA8L3RhYmxlPmA7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUHVibGljYXRpb25zIFx1MjAxNCBDUlVEICsgcmF3IEJpYlRlWCB0b2dnbGVcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogQ3VycmVudCB2aWV3IG1vZGU6ICdjcnVkJyB8ICdyYXcnICovXG5sZXQgX3B1YlZpZXdNb2RlID0gJ2NydWQnO1xubGV0IF9wdWJTb3J0TW9kZSA9ICd5ZWFyX2Rlc2MnO1xubGV0IF9wdWJHcm91cE1vZGUgPSAnbm9uZSc7XG4vKiogVHJ1ZSB3aGVuIHRoZSBlbnRyeSBiZWluZyBlZGl0ZWQgaGFkIGFuIGBlZGl0b3JgIGZpZWxkIGJ1dCBubyBgYXV0aG9yYC4gKi9cbmxldCBfcHViTW9kYWxVc2VzRWRpdG9yRmllbGQgPSBmYWxzZTtcblxuZnVuY3Rpb24gdG9nZ2xlUHVibGljYXRpb25zVmlldygpIHtcbiAgX3B1YlZpZXdNb2RlID0gX3B1YlZpZXdNb2RlID09PSAnY3J1ZCcgPyAncmF3JyA6ICdjcnVkJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItY3J1ZC12aWV3Jykuc3R5bGUuZGlzcGxheSA9IF9wdWJWaWV3TW9kZSA9PT0gJ2NydWQnID8gJycgOiAnbm9uZSc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLXJhdy12aWV3Jykuc3R5bGUuZGlzcGxheSAgPSBfcHViVmlld01vZGUgPT09ICdyYXcnICA/ICcnIDogJ25vbmUnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1hZGQtYnRuJykuc3R5bGUuZGlzcGxheSAgID0gX3B1YlZpZXdNb2RlID09PSAnY3J1ZCcgPyAnJyA6ICdub25lJztcbiAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItdG9nZ2xlLWJ0bicpO1xuICBpZiAoYnRuKSBidG4udGV4dENvbnRlbnQgPSBfcHViVmlld01vZGUgPT09ICdjcnVkJyA/ICdcdTI3MEZcdUZFMEYgUmF3IEJpYlRlWCcgOiAnXHVEODNEXHVEQ0NCIFN0cnVjdHVyZWQgVmlldyc7XG4gIGlmIChfcHViVmlld01vZGUgPT09ICdyYXcnKSBsb2FkUHVibGljYXRpb25zQmliKCk7XG59XG5cbi8qKiBMb2FkIGJvdGggc3RydWN0dXJlZCBsaXN0IGFuZCByYXcgY29udGVudCBmcm9tIGEgc2luZ2xlIEFQSSBjYWxsLiAqL1xuYXN5bmMgZnVuY3Rpb24gbG9hZFB1YmxpY2F0aW9ucygpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvcHVibGljYXRpb25zJyk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEub2spIHtcbiAgICAgIF9yZW5kZXJQdWJsaWNhdGlvbnNDcnVkTGlzdChkYXRhLnB1YmxpY2F0aW9ucyB8fCBbXSk7XG4gICAgICBjb25zdCB0YSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLXRleHRhcmVhJyk7XG4gICAgICBpZiAodGEpIHRhLnZhbHVlID0gZGF0YS5jb250ZW50IHx8ICcnO1xuICAgICAgX3VwZGF0ZVB1YkNvdW50KGRhdGEuY291bnQgPz8gMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNydWQtY29udGFpbmVyJykuaW5uZXJIVE1MID1cbiAgICAgICAgYDxwIHN0eWxlPVwiY29sb3I6I2VmNDQ0NDtwYWRkaW5nOjEycHggMDtcIj5cdTI2QTBcdUZFMEYgJHtlc2NhcGVIdG1sKGRhdGEuZXJyb3IgfHwgJ0ZhaWxlZCB0byBsb2FkJyl9PC9wPmA7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1jcnVkLWNvbnRhaW5lcicpLmlubmVySFRNTCA9XG4gICAgICBgPHAgc3R5bGU9XCJjb2xvcjojZWY0NDQ0O3BhZGRpbmc6MTJweCAwO1wiPlx1MjZBMFx1RkUwRiBGYWlsZWQgdG8gbG9hZDogJHtlc2NhcGVIdG1sKGVyci5tZXNzYWdlKX08L3A+YDtcbiAgfVxufVxuXG4vKiogUmVsb2FkIG9ubHkgdGhlIHJhdyB0ZXh0YXJlYSBjb250ZW50IChjYWxsZWQgd2hlbiBzd2l0Y2hpbmcgdG8gcmF3IHZpZXcpLiAqL1xuYXN5bmMgZnVuY3Rpb24gbG9hZFB1YmxpY2F0aW9uc0JpYigpIHtcbiAgY29uc3QgdGEgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItdGV4dGFyZWEnKTtcbiAgY29uc3Qgc3RhdHVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItc3RhdHVzJyk7XG4gIGlmICghdGEpIHJldHVybjtcbiAgdGEuZGlzYWJsZWQgICAgPSB0cnVlO1xuICB0YS5wbGFjZWhvbGRlciA9ICdMb2FkaW5nXHUyMDI2JztcbiAgaWYgKHN0YXR1cykgc3RhdHVzLnRleHRDb250ZW50ID0gJyc7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL3B1YmxpY2F0aW9ucycpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICB0YS52YWx1ZSA9IGRhdGEuY29udGVudCB8fCAnJztcbiAgICAgIF91cGRhdGVQdWJDb3VudChkYXRhLmNvdW50ID8/IDApO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc3RhdHVzKSBzdGF0dXMudGV4dENvbnRlbnQgPSAnXHUyNkEwXHVGRTBGICcgKyAoZGF0YS5lcnJvciB8fCAnRmFpbGVkIHRvIGxvYWQnKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChzdGF0dXMpIHN0YXR1cy50ZXh0Q29udGVudCA9ICdcdTI2QTBcdUZFMEYgRmFpbGVkIHRvIGxvYWQ6ICcgKyBlcnIubWVzc2FnZTtcbiAgfSBmaW5hbGx5IHtcbiAgICB0YS5kaXNhYmxlZCAgICA9IGZhbHNlO1xuICAgIHRhLnBsYWNlaG9sZGVyID0gJyc7XG4gIH1cbn1cblxuZnVuY3Rpb24gX3VwZGF0ZVB1YkNvdW50KG4pIHtcbiAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1jb3VudCcpO1xuICBpZiAoZWwpIGVsLnRleHRDb250ZW50ID0gYCR7bn0gcHVibGljYXRpb24ke24gIT09IDEgPyAncycgOiAnJ30gb24gZmlsZWA7XG59XG5cbmZ1bmN0aW9uIF9zZXRQdWJsaWNhdGlvblN0YXR1cyhlbGVtZW50SWQsIHRleHQsIGNvbG9yID0gJyM2YjcyODAnKSB7XG4gIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbWVudElkKTtcbiAgaWYgKCFlbCkgcmV0dXJuO1xuICBlbC50ZXh0Q29udGVudCA9IHRleHQ7XG4gIGVsLnN0eWxlLmNvbG9yID0gY29sb3I7XG59XG5cbmZ1bmN0aW9uIHNldFB1YmxpY2F0aW9uU29ydE1vZGUobW9kZSkge1xuICBfcHViU29ydE1vZGUgPSBtb2RlIHx8ICd5ZWFyX2Rlc2MnO1xuICB2b2lkIGxvYWRQdWJsaWNhdGlvbnMoKTtcbn1cblxuZnVuY3Rpb24gc2V0UHVibGljYXRpb25Hcm91cE1vZGUobW9kZSkge1xuICBfcHViR3JvdXBNb2RlID0gbW9kZSB8fCAnbm9uZSc7XG4gIHZvaWQgbG9hZFB1YmxpY2F0aW9ucygpO1xufVxuXG5mdW5jdGlvbiBfZ2V0UHVibGljYXRpb25ZZWFyKHB1Yikge1xuICBjb25zdCByYXdZZWFyID0gcHViPy5maWVsZHM/LnllYXIgPz8gcHViPy55ZWFyID8/ICcnO1xuICBjb25zdCBtYXRjaCA9IFN0cmluZyhyYXdZZWFyKS5tYXRjaCgvXFxkezR9Lyk7XG4gIHJldHVybiBtYXRjaCA/IE51bWJlcihtYXRjaFswXSkgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBfY29tcGFyZVB1YmxpY2F0aW9ucyhsZWZ0LCByaWdodCkge1xuICBjb25zdCBsZWZ0WWVhciA9IF9nZXRQdWJsaWNhdGlvblllYXIobGVmdCkgPz8gLUluZmluaXR5O1xuICBjb25zdCByaWdodFllYXIgPSBfZ2V0UHVibGljYXRpb25ZZWFyKHJpZ2h0KSA/PyAtSW5maW5pdHk7XG4gIGNvbnN0IGxlZnRUeXBlID0gU3RyaW5nKGxlZnQ/LnR5cGUgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IHJpZ2h0VHlwZSA9IFN0cmluZyhyaWdodD8udHlwZSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgbGVmdEtleSA9IFN0cmluZyhsZWZ0Py5rZXkgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IHJpZ2h0S2V5ID0gU3RyaW5nKHJpZ2h0Py5rZXkgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG5cbiAgc3dpdGNoIChfcHViU29ydE1vZGUpIHtcbiAgICBjYXNlICd5ZWFyX2FzYyc6XG4gICAgICByZXR1cm4gKGxlZnRZZWFyIC0gcmlnaHRZZWFyKSB8fCBsZWZ0VHlwZS5sb2NhbGVDb21wYXJlKHJpZ2h0VHlwZSkgfHwgbGVmdEtleS5sb2NhbGVDb21wYXJlKHJpZ2h0S2V5KTtcbiAgICBjYXNlICd0eXBlX2FzYyc6XG4gICAgICByZXR1cm4gbGVmdFR5cGUubG9jYWxlQ29tcGFyZShyaWdodFR5cGUpIHx8IChyaWdodFllYXIgLSBsZWZ0WWVhcikgfHwgbGVmdEtleS5sb2NhbGVDb21wYXJlKHJpZ2h0S2V5KTtcbiAgICBjYXNlICd0eXBlX2Rlc2MnOlxuICAgICAgcmV0dXJuIHJpZ2h0VHlwZS5sb2NhbGVDb21wYXJlKGxlZnRUeXBlKSB8fCAocmlnaHRZZWFyIC0gbGVmdFllYXIpIHx8IGxlZnRLZXkubG9jYWxlQ29tcGFyZShyaWdodEtleSk7XG4gICAgY2FzZSAneWVhcl9kZXNjJzpcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIChyaWdodFllYXIgLSBsZWZ0WWVhcikgfHwgbGVmdFR5cGUubG9jYWxlQ29tcGFyZShyaWdodFR5cGUpIHx8IGxlZnRLZXkubG9jYWxlQ29tcGFyZShyaWdodEtleSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2dyb3VwUHVibGljYXRpb25MYWJlbChwdWIpIHtcbiAgaWYgKF9wdWJHcm91cE1vZGUgPT09ICd5ZWFyJykge1xuICAgIHJldHVybiBTdHJpbmcoX2dldFB1YmxpY2F0aW9uWWVhcihwdWIpID8/ICdVbmtub3duIHllYXInKTtcbiAgfVxuICBpZiAoX3B1Ykdyb3VwTW9kZSA9PT0gJ3R5cGUnKSB7XG4gICAgcmV0dXJuIHB1Yj8udHlwZSA/IFN0cmluZyhwdWIudHlwZSkgOiAnVW5rbm93biB0eXBlJztcbiAgfVxuICByZXR1cm4gJ1B1YmxpY2F0aW9ucyc7XG59XG5cbmZ1bmN0aW9uIF9yZW5kZXJQdWJsaWNhdGlvbnNDcnVkTGlzdChwdWJzKSB7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNydWQtY29udGFpbmVyJyk7XG4gIGlmICghY29udGFpbmVyKSByZXR1cm47XG4gIGNvbnN0IGNvbnRyb2xzSHRtbCA9IGBcbiAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2ZsZXgtd3JhcDp3cmFwO2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTJweDttYXJnaW4tYm90dG9tOjEycHg7XCI+XG4gICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDo2cHg7Y29sb3I6IzQ3NTU2OTtmb250LXNpemU6MC45ZW07XCI+XG4gICAgICAgIFNvcnRcbiAgICAgICAgPHNlbGVjdCBpZD1cIm1hc3Rlci1wdWItc29ydC1zZWxlY3RcIiBjbGFzcz1cImVkaXQtaW5wdXRcIiBzdHlsZT1cIndpZHRoOmF1dG87bWluLXdpZHRoOjE1MHB4O1wiIG9uY2hhbmdlPVwic2V0UHVibGljYXRpb25Tb3J0TW9kZSh0aGlzLnZhbHVlKVwiPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ5ZWFyX2Rlc2NcIiAke19wdWJTb3J0TW9kZSA9PT0gJ3llYXJfZGVzYycgPyAnc2VsZWN0ZWQnIDogJyd9PlllYXIgbmV3ZXN0IGZpcnN0PC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInllYXJfYXNjXCIgJHtfcHViU29ydE1vZGUgPT09ICd5ZWFyX2FzYycgPyAnc2VsZWN0ZWQnIDogJyd9PlllYXIgb2xkZXN0IGZpcnN0PC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInR5cGVfYXNjXCIgJHtfcHViU29ydE1vZGUgPT09ICd0eXBlX2FzYycgPyAnc2VsZWN0ZWQnIDogJyd9PlR5cGUgQVx1MjAxM1o8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwidHlwZV9kZXNjXCIgJHtfcHViU29ydE1vZGUgPT09ICd0eXBlX2Rlc2MnID8gJ3NlbGVjdGVkJyA6ICcnfT5UeXBlIFpcdTIwMTNBPC9vcHRpb24+XG4gICAgICAgIDwvc2VsZWN0PlxuICAgICAgPC9sYWJlbD5cbiAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjZweDtjb2xvcjojNDc1NTY5O2ZvbnQtc2l6ZTowLjllbTtcIj5cbiAgICAgICAgR3JvdXBcbiAgICAgICAgPHNlbGVjdCBpZD1cIm1hc3Rlci1wdWItZ3JvdXAtc2VsZWN0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgc3R5bGU9XCJ3aWR0aDphdXRvO21pbi13aWR0aDoxNDBweDtcIiBvbmNoYW5nZT1cInNldFB1YmxpY2F0aW9uR3JvdXBNb2RlKHRoaXMudmFsdWUpXCI+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIm5vbmVcIiAke19wdWJHcm91cE1vZGUgPT09ICdub25lJyA/ICdzZWxlY3RlZCcgOiAnJ30+Tm8gZ3JvdXBpbmc8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwieWVhclwiICR7X3B1Ykdyb3VwTW9kZSA9PT0gJ3llYXInID8gJ3NlbGVjdGVkJyA6ICcnfT5CeSB5ZWFyPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInR5cGVcIiAke19wdWJHcm91cE1vZGUgPT09ICd0eXBlJyA/ICdzZWxlY3RlZCcgOiAnJ30+QnkgdHlwZTwvb3B0aW9uPlxuICAgICAgICA8L3NlbGVjdD5cbiAgICAgIDwvbGFiZWw+XG4gICAgPC9kaXY+YDtcbiAgaWYgKCFwdWJzLmxlbmd0aCkge1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBgJHtjb250cm9sc0h0bWx9PHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO3BhZGRpbmc6MTJweCAwO1wiPk5vIHB1YmxpY2F0aW9ucyBvbiBmaWxlLiBDbGljayBcIisgQWRkIFB1YmxpY2F0aW9uXCIgYWJvdmUsIG9yIHN3aXRjaCB0byBSYXcgQmliVGVYIHRvIHBhc3RlL2ltcG9ydCBlbnRyaWVzLjwvcD5gO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBzb3J0ZWQgPSBbLi4ucHVic10uc29ydChfY29tcGFyZVB1YmxpY2F0aW9ucyk7XG4gIGNvbnN0IGdyb3VwcyA9IFtdO1xuICBmb3IgKGNvbnN0IHB1YiBvZiBzb3J0ZWQpIHtcbiAgICBjb25zdCBsYWJlbCA9IF9ncm91cFB1YmxpY2F0aW9uTGFiZWwocHViKTtcbiAgICBsZXQgZ3JvdXAgPSBncm91cHMuZmluZCgoZW50cnkpID0+IGVudHJ5LmxhYmVsID09PSBsYWJlbCk7XG4gICAgaWYgKCFncm91cCkge1xuICAgICAgZ3JvdXAgPSB7IGxhYmVsLCBpdGVtczogW10gfTtcbiAgICAgIGdyb3Vwcy5wdXNoKGdyb3VwKTtcbiAgICB9XG4gICAgZ3JvdXAuaXRlbXMucHVzaChwdWIpO1xuICB9XG4gIGNvbnN0IHNlY3Rpb25IdG1sID0gZ3JvdXBzLm1hcCgoeyBsYWJlbCwgaXRlbXMgfSkgPT4ge1xuICAgIGNvbnN0IGhlYWRpbmdIdG1sID0gX3B1Ykdyb3VwTW9kZSA9PT0gJ25vbmUnXG4gICAgICA/ICcnXG4gICAgICA6IGA8ZGl2IHN0eWxlPVwibWFyZ2luOjE2cHggMCA4cHg7Zm9udC1zaXplOjAuOWVtO2ZvbnQtd2VpZ2h0OjcwMDtjb2xvcjojMzM0MTU1O1wiPiR7ZXNjYXBlSHRtbChsYWJlbCl9PC9kaXY+YDtcbiAgICBjb25zdCByb3dzID0gaXRlbXMubWFwKHB1YiA9PiB7XG4gICAgY29uc3Qga2V5ICAgICAgPSBlc2NhcGVIdG1sKHB1Yi5rZXkgfHwgJycpO1xuICAgIGNvbnN0IHR5cGUgICAgID0gZXNjYXBlSHRtbChwdWIudHlwZSB8fCAnJyk7XG4gICAgY29uc3QgY2l0YXRpb24gPSBlc2NhcGVIdG1sKChwdWIuZm9ybWF0dGVkX2NpdGF0aW9uIHx8ICcnKS5zbGljZSgwLCAxNjApKTtcbiAgICBjb25zdCBmdWxsICAgICA9IHB1Yi5mb3JtYXR0ZWRfY2l0YXRpb24gfHwgJyc7XG4gICAgY29uc3QgcHViSnNvbiAgPSBlc2NhcGVIdG1sKEpTT04uc3RyaW5naWZ5KHB1YikpO1xuICAgIHJldHVybiBgXG4gICAgICA8dHI+XG4gICAgICAgIDx0ZD5cbiAgICAgICAgICA8Y29kZSBzdHlsZT1cImZvbnQtc2l6ZTowLjhlbTtjb2xvcjojNDc1NTY5O1wiPiR7a2V5fTwvY29kZT5cbiAgICAgICAgICAke2NpdGF0aW9uID8gYDxicj48c21hbGwgc3R5bGU9XCJjb2xvcjojNmI3MjgwO1wiPiR7Y2l0YXRpb259JHtmdWxsLmxlbmd0aCA+IDE2MCA/ICdcdTIwMjYnIDogJyd9PC9zbWFsbD5gIDogJyd9XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO2NvbG9yOiM0NzU1Njk7Zm9udC1zaXplOjAuODVlbTtcIj4ke3R5cGV9PC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwiYWN0aW9uLWJ0bnNcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBvbmNsaWNrPVwiZWRpdE1hc3RlclB1YmxpY2F0aW9uKCR7cHViSnNvbn0pXCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkVkaXQgcHVibGljYXRpb246ICR7a2V5fVwiIHRpdGxlPVwiRWRpdFwiPlx1MjcwRlx1RkUwRjwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIG9uY2xpY2s9XCJkZWxldGVNYXN0ZXJQdWJsaWNhdGlvbignJHtrZXl9JylcIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiRGVsZXRlIHB1YmxpY2F0aW9uOiAke2tleX1cIiB0aXRsZT1cIkRlbGV0ZVwiPlx1RDgzRFx1REREMVx1RkUwRjwvYnV0dG9uPlxuICAgICAgICA8L3RkPlxuICAgICAgPC90cj5gO1xuICAgIH0pLmpvaW4oJycpO1xuICAgIHJldHVybiBgJHtoZWFkaW5nSHRtbH1cbiAgICA8dGFibGUgY2xhc3M9XCJyZXZpZXctdGFibGVcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCI+XG4gICAgICA8dGhlYWQ+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8dGg+UHVibGljYXRpb248L3RoPlxuICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOjExMHB4O3RleHQtYWxpZ246Y2VudGVyO1wiPlR5cGU8L3RoPlxuICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOjgwcHg7XCI+QWN0aW9uczwvdGg+XG4gICAgICAgIDwvdHI+XG4gICAgICA8L3RoZWFkPlxuICAgICAgPHRib2R5PiR7cm93c308L3Rib2R5PlxuICAgIDwvdGFibGU+YDtcbiAgfSkuam9pbignJyk7XG4gIGNvbnRhaW5lci5pbm5lckhUTUwgPSBgJHtjb250cm9sc0h0bWx9JHtzZWN0aW9uSHRtbH1gO1xufVxuXG4vKiogVmFsaWRhdGUgQmliVGVYIGluIHRoZSB0ZXh0YXJlYSB3aXRob3V0IHNhdmluZy4gKi9cbmFzeW5jIGZ1bmN0aW9uIHZhbGlkYXRlUHVibGljYXRpb25zQmliKCkge1xuICBjb25zdCB0YSAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi10ZXh0YXJlYScpO1xuICBjb25zdCBzdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1zdGF0dXMnKTtcbiAgaWYgKCF0YSB8fCAhc3RhdHVzKSByZXR1cm47XG4gIGNvbnN0IHRleHQgPSB0YS52YWx1ZTtcbiAgaWYgKCF0ZXh0LnRyaW0oKSkge1xuICAgIHN0YXR1cy50ZXh0Q29udGVudCA9ICdcdTIxMzlcdUZFMEYgRW1wdHkgXHUyMDE0IG5vdGhpbmcgdG8gdmFsaWRhdGUuJztcbiAgICBzdGF0dXMuc3R5bGUuY29sb3IgPSAnIzZiNzI4MCc7XG4gICAgcmV0dXJuO1xuICB9XG4gIHN0YXR1cy50ZXh0Q29udGVudCA9ICdcdUQ4M0RcdUREMEQgVmFsaWRhdGluZ1x1MjAyNic7XG4gIHN0YXR1cy5zdHlsZS5jb2xvciA9ICcjNmI3MjgwJztcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvcHVibGljYXRpb25zL3ZhbGlkYXRlJywge1xuICAgICAgbWV0aG9kOiAgJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiAgICBKU09OLnN0cmluZ2lmeSh7IGJpYnRleF90ZXh0OiB0ZXh0IH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBjb25zdCBuID0gZGF0YS5jb3VudCA/PyAwO1xuICAgICAgc3RhdHVzLnRleHRDb250ZW50ID0gYFx1MjcwNSBWYWxpZCBcdTIwMTQgJHtufSBlbnRyJHtuICE9PSAxID8gJ2llcycgOiAneSd9IGZvdW5kLmA7XG4gICAgICBzdGF0dXMuc3R5bGUuY29sb3IgPSAnIzE1ODAzZCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXR1cy50ZXh0Q29udGVudCA9ICdcdTI3NEMgJyArIChkYXRhLmVycm9yIHx8ICdWYWxpZGF0aW9uIGZhaWxlZCcpO1xuICAgICAgc3RhdHVzLnN0eWxlLmNvbG9yID0gJyNkYzI2MjYnO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgc3RhdHVzLnRleHRDb250ZW50ID0gJ1x1Mjc0QyAnICsgZXJyLm1lc3NhZ2U7XG4gICAgc3RhdHVzLnN0eWxlLmNvbG9yID0gJyNkYzI2MjYnO1xuICB9XG59XG5cbi8qKiBTYXZlIHJhdyBCaWJUZVggKHZhbGlkYXRlcyBzZXJ2ZXItc2lkZSBiZWZvcmUgd3JpdGluZykuICovXG5hc3luYyBmdW5jdGlvbiBzYXZlUHVibGljYXRpb25zQmliKCkge1xuICBjb25zdCB0YSAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi10ZXh0YXJlYScpO1xuICBjb25zdCBzdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1zdGF0dXMnKTtcbiAgY29uc3QgYnRuICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItc2F2ZS1idG4nKTtcbiAgaWYgKCF0YSkgcmV0dXJuO1xuICBjb25zdCBjb250ZW50ID0gdGEudmFsdWU7XG4gIGlmIChidG4pIHsgYnRuLmRpc2FibGVkID0gdHJ1ZTsgYnRuLnRleHRDb250ZW50ID0gJ1x1MjNGMyBTYXZpbmdcdTIwMjYnOyB9XG4gIGlmIChzdGF0dXMpIHsgc3RhdHVzLnRleHRDb250ZW50ID0gJyc7IHN0YXR1cy5zdHlsZS5jb2xvciA9ICcjNmI3MjgwJzsgfVxuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS9wdWJsaWNhdGlvbnMnLCB7XG4gICAgICBtZXRob2Q6ICAnUFVUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogICAgSlNPTi5zdHJpbmdpZnkoeyBjb250ZW50IH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBjb25zdCBuID0gZGF0YS5jb3VudCA/PyAwO1xuICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICBzdGF0dXMudGV4dENvbnRlbnQgPSBgXHUyNzA1IFNhdmVkIFx1MjAxNCAke259IGVudHIke24gIT09IDEgPyAnaWVzJyA6ICd5J30gcGFyc2VkLmA7XG4gICAgICAgIHN0YXR1cy5zdHlsZS5jb2xvciA9ICcjMTU4MDNkJztcbiAgICAgIH1cbiAgICAgIF91cGRhdGVQdWJDb3VudChuKTtcbiAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ1B1YmxpY2F0aW9ucycsICd1cGRhdGVkJyk7XG4gICAgICAvLyBSZWZyZXNoIENSVUQgbGlzdCB0byBzdGF5IGluIHN5bmNcbiAgICAgIGF3YWl0IGxvYWRQdWJsaWNhdGlvbnMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICBzdGF0dXMudGV4dENvbnRlbnQgPSAnXHUyNzRDICcgKyAoZGF0YS5lcnJvciB8fCAnU2F2ZSBmYWlsZWQnKTtcbiAgICAgICAgc3RhdHVzLnN0eWxlLmNvbG9yID0gJyNkYzI2MjYnO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKHN0YXR1cykge1xuICAgICAgc3RhdHVzLnRleHRDb250ZW50ID0gJ1x1Mjc0QyAnICsgZXJyLm1lc3NhZ2U7XG4gICAgICBzdGF0dXMuc3R5bGUuY29sb3IgPSAnI2RjMjYyNic7XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIGlmIChidG4pIHsgYnRuLmRpc2FibGVkID0gZmFsc2U7IGJ0bi50ZXh0Q29udGVudCA9ICdcdUQ4M0RcdURDQkUgU2F2ZSc7IH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzaG93SW1wb3J0UHVibGljYXRpb25zTW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWltcG9ydC10ZXh0YXJlYScpLnZhbHVlID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWltcG9ydC1vdmVyd3JpdGUnKS5jaGVja2VkID0gZmFsc2U7XG4gIF9zZXRQdWJsaWNhdGlvblN0YXR1cygnbWFzdGVyLXB1Yi1pbXBvcnQtc3RhdHVzJywgJycpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1pbXBvcnQtbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgc2V0SW5pdGlhbEZvY3VzKCdtYXN0ZXItcHViLWltcG9ydC1tb2RhbC1vdmVybGF5Jyk7XG4gIHRyYXBGb2N1cygnbWFzdGVyLXB1Yi1pbXBvcnQtbW9kYWwtb3ZlcmxheScpO1xufVxuXG5mdW5jdGlvbiBjbG9zZUltcG9ydFB1YmxpY2F0aW9uc01vZGFsKCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1pbXBvcnQtbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHJlc3RvcmVGb2N1cygpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBpbXBvcnRQdWJsaWNhdGlvbnNCaWIoKSB7XG4gIGNvbnN0IHRleHRhcmVhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItaW1wb3J0LXRleHRhcmVhJyk7XG4gIGNvbnN0IG92ZXJ3cml0ZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWltcG9ydC1vdmVyd3JpdGUnKTtcbiAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItaW1wb3J0LXN1Ym1pdC1idG4nKTtcbiAgaWYgKCF0ZXh0YXJlYSkgcmV0dXJuO1xuICBjb25zdCBiaWJ0ZXhUZXh0ID0gdGV4dGFyZWEudmFsdWUudHJpbSgpO1xuICBpZiAoIWJpYnRleFRleHQpIHtcbiAgICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItaW1wb3J0LXN0YXR1cycsICdcdTI2QTBcdUZFMEYgUGFzdGUgQmliVGVYIGVudHJpZXMgdG8gaW1wb3J0LicsICcjZGMyNjI2Jyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChidXR0b24pIHtcbiAgICBidXR0b24uZGlzYWJsZWQgPSB0cnVlO1xuICAgIGJ1dHRvbi50ZXh0Q29udGVudCA9ICdcdTIzRjMgSW1wb3J0aW5nXHUyMDI2JztcbiAgfVxuICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItaW1wb3J0LXN0YXR1cycsICdJbXBvcnRpbmcgQmliVGVYXHUyMDI2Jyk7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvcHVibGljYXRpb25zL2ltcG9ydCcsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGJpYnRleF90ZXh0OiBiaWJ0ZXhUZXh0LFxuICAgICAgICBvdmVyd3JpdGU6IEJvb2xlYW4ob3ZlcndyaXRlPy5jaGVja2VkKSxcbiAgICAgIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBjb25zdCBwYXJ0cyA9IFtcbiAgICAgICAgYCR7ZGF0YS5hZGRlZCB8fCAwfSBhZGRlZGAsXG4gICAgICAgIGAke2RhdGEudXBkYXRlZCB8fCAwfSB1cGRhdGVkYCxcbiAgICAgICAgYCR7ZGF0YS5za2lwcGVkIHx8IDB9IHNraXBwZWRgLFxuICAgICAgXTtcbiAgICAgIGlmIChkYXRhLmludmFsaWQpIHBhcnRzLnB1c2goYCR7ZGF0YS5pbnZhbGlkfSByZWplY3RlZCAobWlzc2luZyByZXF1aXJlZCBmaWVsZHMpYCk7XG4gICAgICBjb25zdCBza2lwcGVkRGV0YWlsID0gKGRhdGEuc2tpcHBlZF9rZXlzPy5sZW5ndGgpXG4gICAgICAgID8gYFxcblxcblNraXBwZWQgKGFscmVhZHkgZXhpc3QgXHUyMDE0IGVuYWJsZSBcIk92ZXJ3cml0ZVwiIHRvIHVwZGF0ZSk6XFxuXHUyMDIyICR7ZGF0YS5za2lwcGVkX2tleXMuam9pbignXFxuXHUyMDIyICcpfWBcbiAgICAgICAgOiAnJztcbiAgICAgIGNvbnN0IGludmFsaWREZXRhaWwgPSAoZGF0YS5pbnZhbGlkX2tleXM/Lmxlbmd0aClcbiAgICAgICAgPyBgXFxuXFxuUmVqZWN0ZWQgKG1pc3NpbmcgdGl0bGUsIHllYXIsIG9yIGF1dGhvcik6XFxuXHUyMDIyICR7ZGF0YS5pbnZhbGlkX2tleXMuam9pbignXFxuXHUyMDIyICcpfWBcbiAgICAgICAgOiAnJztcbiAgICAgIF9zZXRQdWJsaWNhdGlvblN0YXR1cygnbWFzdGVyLXB1Yi1pbXBvcnQtc3RhdHVzJywgYFx1MjcwNSBJbXBvcnRlZDogJHtwYXJ0cy5qb2luKCcsICcpfS5gLCAnIzE1ODAzZCcpO1xuICAgICAgX3NldE1hc3RlckNoYW5nZU5vdGljZSgnUHVibGljYXRpb25zJywgJ2ltcG9ydGVkJyk7XG4gICAgICBhd2FpdCBsb2FkUHVibGljYXRpb25zKCk7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzA1IEltcG9ydGVkJywgYEltcG9ydGVkIEJpYlRlWCBlbnRyaWVzOiAke3BhcnRzLmpvaW4oJywgJyl9LiR7c2tpcHBlZERldGFpbH0ke2ludmFsaWREZXRhaWx9YCk7XG4gICAgICBjbG9zZUltcG9ydFB1YmxpY2F0aW9uc01vZGFsKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIF9zZXRQdWJsaWNhdGlvblN0YXR1cygnbWFzdGVyLXB1Yi1pbXBvcnQtc3RhdHVzJywgYFx1Mjc0QyAke2RhdGEuZXJyb3IgfHwgJ0ltcG9ydCBmYWlsZWQnfWAsICcjZGMyNjI2Jyk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItaW1wb3J0LXN0YXR1cycsIGBcdTI3NEMgJHtlcnIubWVzc2FnZX1gLCAnI2RjMjYyNicpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChidXR0b24pIHtcbiAgICAgIGJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgYnV0dG9uLnRleHRDb250ZW50ID0gJ0ltcG9ydCc7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNob3dDb252ZXJ0UHVibGljYXRpb25zTW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNvbnZlcnQtaW5wdXQnKS52YWx1ZSA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1jb252ZXJ0LW91dHB1dCcpLnZhbHVlID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNvbnZlcnQtb3ZlcndyaXRlJykuY2hlY2tlZCA9IGZhbHNlO1xuICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItY29udmVydC1zdGF0dXMnLCAnJyk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNvbnZlcnQtbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgc2V0SW5pdGlhbEZvY3VzKCdtYXN0ZXItcHViLWNvbnZlcnQtbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ21hc3Rlci1wdWItY29udmVydC1tb2RhbC1vdmVybGF5Jyk7XG59XG5cbmZ1bmN0aW9uIGNsb3NlQ29udmVydFB1YmxpY2F0aW9uc01vZGFsKCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1jb252ZXJ0LW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICByZXN0b3JlRm9jdXMoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29udmVydFB1YmxpY2F0aW9uVGV4dCgpIHtcbiAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1jb252ZXJ0LWlucHV0Jyk7XG4gIGNvbnN0IG91dHB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNvbnZlcnQtb3V0cHV0Jyk7XG4gIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNvbnZlcnQtc3VibWl0LWJ0bicpO1xuICBpZiAoIWlucHV0IHx8ICFvdXRwdXQpIHJldHVybjtcbiAgY29uc3QgdGV4dCA9IGlucHV0LnZhbHVlLnRyaW0oKTtcbiAgaWYgKCF0ZXh0KSB7XG4gICAgX3NldFB1YmxpY2F0aW9uU3RhdHVzKCdtYXN0ZXItcHViLWNvbnZlcnQtc3RhdHVzJywgJ1x1MjZBMFx1RkUwRiBQYXN0ZSBjaXRhdGlvbiB0ZXh0IHRvIGNvbnZlcnQuJywgJyNkYzI2MjYnKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGJ1dHRvbikge1xuICAgIGJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7XG4gICAgYnV0dG9uLnRleHRDb250ZW50ID0gJ1x1MjNGMyBHZW5lcmF0aW5nXHUyMDI2JztcbiAgfVxuICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItY29udmVydC1zdGF0dXMnLCAnR2VuZXJhdGluZyBCaWJUZVggcHJldmlld1x1MjAyNicpO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL3B1YmxpY2F0aW9ucy9jb252ZXJ0Jywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgdGV4dCB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgb3V0cHV0LnZhbHVlID0gZGF0YS5iaWJ0ZXggfHwgJyc7XG4gICAgICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItY29udmVydC1zdGF0dXMnLCAnXHUyNzA1IFJldmlldyB0aGUgZ2VuZXJhdGVkIEJpYlRlWCwgdGhlbiBpbXBvcnQgaXQgaWYgaXQgbG9va3MgY29ycmVjdC4nLCAnIzE1ODAzZCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItY29udmVydC1zdGF0dXMnLCBgXHUyNzRDICR7ZGF0YS5lcnJvciB8fCAnQ29udmVyc2lvbiBmYWlsZWQnfWAsICcjZGMyNjI2Jyk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItY29udmVydC1zdGF0dXMnLCBgXHUyNzRDICR7ZXJyLm1lc3NhZ2V9YCwgJyNkYzI2MjYnKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoYnV0dG9uKSB7XG4gICAgICBidXR0b24uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIGJ1dHRvbi50ZXh0Q29udGVudCA9ICdHZW5lcmF0ZSBCaWJUZVgnO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBpbXBvcnRDb252ZXJ0ZWRQdWJsaWNhdGlvblRleHQoKSB7XG4gIGNvbnN0IG91dHB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNvbnZlcnQtb3V0cHV0Jyk7XG4gIGNvbnN0IG92ZXJ3cml0ZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNvbnZlcnQtb3ZlcndyaXRlJyk7XG4gIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLWNvbnZlcnQtaW1wb3J0LWJ0bicpO1xuICBpZiAoIW91dHB1dCkgcmV0dXJuO1xuICBjb25zdCBiaWJ0ZXhUZXh0ID0gb3V0cHV0LnZhbHVlLnRyaW0oKTtcbiAgaWYgKCFiaWJ0ZXhUZXh0KSB7XG4gICAgX3NldFB1YmxpY2F0aW9uU3RhdHVzKCdtYXN0ZXItcHViLWNvbnZlcnQtc3RhdHVzJywgJ1x1MjZBMFx1RkUwRiBHZW5lcmF0ZSBvciBlZGl0IEJpYlRlWCBiZWZvcmUgaW1wb3J0aW5nLicsICcjZGMyNjI2Jyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChidXR0b24pIHtcbiAgICBidXR0b24uZGlzYWJsZWQgPSB0cnVlO1xuICAgIGJ1dHRvbi50ZXh0Q29udGVudCA9ICdcdTIzRjMgSW1wb3J0aW5nXHUyMDI2JztcbiAgfVxuICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItY29udmVydC1zdGF0dXMnLCAnSW1wb3J0aW5nIHJldmlld2VkIEJpYlRlWFx1MjAyNicpO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL3B1YmxpY2F0aW9ucy9pbXBvcnQnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBiaWJ0ZXhfdGV4dDogYmlidGV4VGV4dCxcbiAgICAgICAgb3ZlcndyaXRlOiBCb29sZWFuKG92ZXJ3cml0ZT8uY2hlY2tlZCksXG4gICAgICB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgY29uc3QgcGFydHMgPSBbXG4gICAgICAgIGAke2RhdGEuYWRkZWQgfHwgMH0gYWRkZWRgLFxuICAgICAgICBgJHtkYXRhLnVwZGF0ZWQgfHwgMH0gdXBkYXRlZGAsXG4gICAgICAgIGAke2RhdGEuc2tpcHBlZCB8fCAwfSBza2lwcGVkYCxcbiAgICAgIF07XG4gICAgICBpZiAoZGF0YS5pbnZhbGlkKSBwYXJ0cy5wdXNoKGAke2RhdGEuaW52YWxpZH0gcmVqZWN0ZWQgKG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzKWApO1xuICAgICAgY29uc3Qgc2tpcHBlZERldGFpbCA9IChkYXRhLnNraXBwZWRfa2V5cz8ubGVuZ3RoKVxuICAgICAgICA/IGBcXG5cXG5Ta2lwcGVkIChhbHJlYWR5IGV4aXN0IFx1MjAxNCBlbmFibGUgXCJPdmVyd3JpdGVcIiB0byB1cGRhdGUpOlxcblx1MjAyMiAke2RhdGEuc2tpcHBlZF9rZXlzLmpvaW4oJ1xcblx1MjAyMiAnKX1gXG4gICAgICAgIDogJyc7XG4gICAgICBjb25zdCBpbnZhbGlkRGV0YWlsID0gKGRhdGEuaW52YWxpZF9rZXlzPy5sZW5ndGgpXG4gICAgICAgID8gYFxcblxcblJlamVjdGVkIChtaXNzaW5nIHRpdGxlLCB5ZWFyLCBvciBhdXRob3IpOlxcblx1MjAyMiAke2RhdGEuaW52YWxpZF9rZXlzLmpvaW4oJ1xcblx1MjAyMiAnKX1gXG4gICAgICAgIDogJyc7XG4gICAgICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItY29udmVydC1zdGF0dXMnLCBgXHUyNzA1IEltcG9ydGVkIHByZXZpZXc6ICR7cGFydHMuam9pbignLCAnKX0uYCwgJyMxNTgwM2QnKTtcbiAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ1B1YmxpY2F0aW9ucycsICdpbXBvcnRlZCcpO1xuICAgICAgYXdhaXQgbG9hZFB1YmxpY2F0aW9ucygpO1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjcwNSBJbXBvcnRlZCcsIGBJbXBvcnRlZCBnZW5lcmF0ZWQgQmliVGVYOiAke3BhcnRzLmpvaW4oJywgJyl9LiR7c2tpcHBlZERldGFpbH0ke2ludmFsaWREZXRhaWx9YCk7XG4gICAgICBjbG9zZUNvbnZlcnRQdWJsaWNhdGlvbnNNb2RhbCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBfc2V0UHVibGljYXRpb25TdGF0dXMoJ21hc3Rlci1wdWItY29udmVydC1zdGF0dXMnLCBgXHUyNzRDICR7ZGF0YS5lcnJvciB8fCAnSW1wb3J0IGZhaWxlZCd9YCwgJyNkYzI2MjYnKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIF9zZXRQdWJsaWNhdGlvblN0YXR1cygnbWFzdGVyLXB1Yi1jb252ZXJ0LXN0YXR1cycsIGBcdTI3NEMgJHtlcnIubWVzc2FnZX1gLCAnI2RjMjYyNicpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChidXR0b24pIHtcbiAgICAgIGJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgYnV0dG9uLnRleHRDb250ZW50ID0gJ0ltcG9ydCBQcmV2aWV3JztcbiAgICB9XG4gIH1cbn1cblxuLy8gLS0tLSBQdWJsaWNhdGlvbiBhZGQvZWRpdCBtb2RhbCAtLS0tXG5cbmZ1bmN0aW9uIHNob3dBZGRQdWJsaWNhdGlvbk1vZGFsKCkge1xuICBfcHViTW9kYWxVc2VzRWRpdG9yRmllbGQgPSBmYWxzZTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1rZXknKS52YWx1ZSAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLW1vZGFsLXR5cGUnKS52YWx1ZSAgID0gJ2FydGljbGUnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLW1vZGFsLWF1dGhvcicpLnZhbHVlID0gJyc7XG4gIGNvbnN0IGF1dGhvckxhYmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1hdXRob3ItbGFiZWwnKTtcbiAgaWYgKGF1dGhvckxhYmVsKSBhdXRob3JMYWJlbC50ZXh0Q29udGVudCA9ICdBdXRob3IocyknO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLW1vZGFsLXRpdGxlJykudmFsdWUgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWItbW9kYWwteWVhcicpLnZhbHVlICAgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1qb3VybmFsJykudmFsdWUgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1kb2knKS52YWx1ZSAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLW1vZGFsLWV4dHJhJykudmFsdWUgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWItbW9kYWwta2V5JykuZGlzYWJsZWQgPSBmYWxzZTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC10aXRsZS1oZWFkaW5nJykudGV4dENvbnRlbnQgPSAnQWRkIFB1YmxpY2F0aW9uJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1wdWItbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgc2V0SW5pdGlhbEZvY3VzKCdtYXN0ZXItcHViLW1vZGFsLW92ZXJsYXknKTtcbiAgdHJhcEZvY3VzKCdtYXN0ZXItcHViLW1vZGFsLW92ZXJsYXknKTtcbn1cblxuZnVuY3Rpb24gZWRpdE1hc3RlclB1YmxpY2F0aW9uKHB1Yikge1xuICBjb25zdCBmaWVsZHMgPSBwdWIuZmllbGRzIHx8IHt9O1xuICAvLyBUcmFjayB3aGV0aGVyIHRoaXMgZW50cnkgdXNlcyBgZWRpdG9yYCBzbyB3ZSBwcmVzZXJ2ZSBpdCBvbiBzYXZlXG4gIF9wdWJNb2RhbFVzZXNFZGl0b3JGaWVsZCA9ICFmaWVsZHMuYXV0aG9yICYmICEhZmllbGRzLmVkaXRvcjtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1rZXknKS52YWx1ZSAgICAgPSBwdWIua2V5IHx8ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLW1vZGFsLXR5cGUnKS52YWx1ZSAgICA9IHB1Yi50eXBlIHx8ICdhcnRpY2xlJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1hdXRob3InKS52YWx1ZSAgPSBmaWVsZHMuYXV0aG9yIHx8IGZpZWxkcy5lZGl0b3IgfHwgJyc7XG4gIC8vIFVwZGF0ZSB0aGUgQXV0aG9yL0VkaXRvciBsYWJlbCBzbyB0aGUgdXNlciBrbm93cyB3aGljaCBmaWVsZCBpcyBiZWluZyBlZGl0ZWRcbiAgY29uc3QgYXV0aG9yTGFiZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLW1vZGFsLWF1dGhvci1sYWJlbCcpO1xuICBpZiAoYXV0aG9yTGFiZWwpIGF1dGhvckxhYmVsLnRleHRDb250ZW50ID0gX3B1Yk1vZGFsVXNlc0VkaXRvckZpZWxkID8gJ0VkaXRvcihzKScgOiAnQXV0aG9yKHMpJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC10aXRsZScpLnZhbHVlICAgPSBmaWVsZHMudGl0bGUgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWItbW9kYWwteWVhcicpLnZhbHVlICAgID0gZmllbGRzLnllYXIgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWItbW9kYWwtam91cm5hbCcpLnZhbHVlID0gZmllbGRzLmpvdXJuYWwgfHwgZmllbGRzLmJvb2t0aXRsZSB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1kb2knKS52YWx1ZSAgICAgPSBmaWVsZHMuZG9pIHx8ICcnO1xuICAvLyBFeHRyYTogcmVtYWluaW5nIG5vbi1zdGFuZGFyZCBmaWVsZHMgYXMga2V5PXZhbHVlIGxpbmVzXG4gIGNvbnN0IGtub3duID0gbmV3IFNldChbJ2F1dGhvcicsJ2VkaXRvcicsJ3RpdGxlJywneWVhcicsJ2pvdXJuYWwnLCdib29rdGl0bGUnLCdkb2knXSk7XG4gIGNvbnN0IGV4dHJhID0gT2JqZWN0LmVudHJpZXMoZmllbGRzKVxuICAgIC5maWx0ZXIoKFtrXSkgPT4gIWtub3duLmhhcyhrKSlcbiAgICAubWFwKChbaywgdl0pID0+IGAke2t9PSR7dn1gKVxuICAgIC5qb2luKCdcXG4nKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1leHRyYScpLnZhbHVlICAgPSBleHRyYTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1rZXknKS5kaXNhYmxlZCAgPSB0cnVlOyAgLy8ga2V5IGlzIGltbXV0YWJsZSBvbiBlZGl0XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWItbW9kYWwtdGl0bGUtaGVhZGluZycpLnRleHRDb250ZW50ID0gJ0VkaXQgUHVibGljYXRpb24nO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXB1Yi1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBzZXRJbml0aWFsRm9jdXMoJ21hc3Rlci1wdWItbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ21hc3Rlci1wdWItbW9kYWwtb3ZlcmxheScpO1xufVxuXG5mdW5jdGlvbiBjbG9zZVB1YmxpY2F0aW9uTW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcHViLW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICByZXN0b3JlRm9jdXMoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZU1hc3RlclB1YmxpY2F0aW9uKCkge1xuICBjb25zdCBrZXlFbCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLW1vZGFsLWtleScpO1xuICBjb25zdCBrZXkgICAgPSBrZXlFbC52YWx1ZS50cmltKCk7XG4gIGNvbnN0IGFjdGlvbiA9IGtleUVsLmRpc2FibGVkID8gJ3VwZGF0ZScgOiAnYWRkJztcbiAgaWYgKCFrZXkpIHsgc2hvd0FsZXJ0TW9kYWwoJ1x1MjZBMFx1RkUwRiBWYWxpZGF0aW9uJywgJ0NpdGUga2V5IGlzIHJlcXVpcmVkLicpOyByZXR1cm47IH1cbiAgY29uc3QgdHlwZSAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC10eXBlJykudmFsdWUudHJpbSgpIHx8ICdhcnRpY2xlJztcbiAgY29uc3QgYXV0aG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1hdXRob3InKS52YWx1ZS50cmltKCk7XG4gIGNvbnN0IHRpdGxlICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWItbW9kYWwtdGl0bGUnKS52YWx1ZS50cmltKCk7XG4gIGNvbnN0IHllYXIgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWItbW9kYWwteWVhcicpLnZhbHVlLnRyaW0oKTtcbiAgaWYgKCF0aXRsZSkgIHsgc2hvd0FsZXJ0TW9kYWwoJ1x1MjZBMFx1RkUwRiBWYWxpZGF0aW9uJywgJ1RpdGxlIGlzIHJlcXVpcmVkLicpOyByZXR1cm47IH1cbiAgaWYgKCF5ZWFyKSAgIHsgc2hvd0FsZXJ0TW9kYWwoJ1x1MjZBMFx1RkUwRiBWYWxpZGF0aW9uJywgJ1llYXIgaXMgcmVxdWlyZWQuJyk7IHJldHVybjsgfVxuICBpZiAoIWF1dGhvcikgeyBzaG93QWxlcnRNb2RhbCgnXHUyNkEwXHVGRTBGIFZhbGlkYXRpb24nLCAnQXV0aG9yIG9yIGVkaXRvciBpcyByZXF1aXJlZC4nKTsgcmV0dXJuOyB9XG4gIC8vIFByZXNlcnZlIHRoZSBvcmlnaW5hbCBmaWVsZCBuYW1lOiBlZGl0b3IgZW50cmllcyBtdXN0IG5vdCBiZSBzYXZlZCBhcyBhdXRob3JcbiAgY29uc3QgZmllbGRzID0gX3B1Yk1vZGFsVXNlc0VkaXRvckZpZWxkID8geyBlZGl0b3I6IGF1dGhvciwgdGl0bGUsIHllYXIgfSA6IHsgYXV0aG9yLCB0aXRsZSwgeWVhciB9O1xuICBjb25zdCBqb3VybmFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1Yi1tb2RhbC1qb3VybmFsJykudmFsdWUudHJpbSgpO1xuICBpZiAoam91cm5hbCkge1xuICAgIGZpZWxkc1t0eXBlID09PSAnaW5wcm9jZWVkaW5ncycgPyAnYm9va3RpdGxlJyA6ICdqb3VybmFsJ10gPSBqb3VybmFsO1xuICB9XG4gIGNvbnN0IGRvaSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdWItbW9kYWwtZG9pJykudmFsdWUudHJpbSgpO1xuICBpZiAoZG9pKSBmaWVsZHMuZG9pID0gZG9pO1xuICAvLyBQYXJzZSBleHRyYSBmaWVsZHMgKGtleT12YWx1ZSBwZXIgbGluZSlcbiAgY29uc3QgZXh0cmEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHViLW1vZGFsLWV4dHJhJykudmFsdWU7XG4gIGZvciAoY29uc3QgbGluZSBvZiBleHRyYS5zcGxpdCgnXFxuJykpIHtcbiAgICBjb25zdCBlcSA9IGxpbmUuaW5kZXhPZignPScpO1xuICAgIGlmIChlcSA+IDApIHtcbiAgICAgIGNvbnN0IGsgPSBsaW5lLnNsaWNlKDAsIGVxKS50cmltKCk7XG4gICAgICBjb25zdCB2ID0gbGluZS5zbGljZShlcSArIDEpLnRyaW0oKTtcbiAgICAgIGlmIChrICYmIHYpIGZpZWxkc1trXSA9IHY7XG4gICAgfVxuICB9XG4gIGNvbnN0IGJvZHkgPSB7IGFjdGlvbiwga2V5LCB0eXBlLCBmaWVsZHMgfTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvcHVibGljYXRpb24nLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBjbG9zZVB1YmxpY2F0aW9uTW9kYWwoKTtcbiAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ1B1YmxpY2F0aW9ucycsIGRhdGEuYWN0aW9uIHx8ICd1cGRhdGVkJyk7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzA1IFNhdmVkJywgYFB1YmxpY2F0aW9uIFwiJHtrZXl9XCIgJHtkYXRhLmFjdGlvbn0uYCk7XG4gICAgICBhd2FpdCBsb2FkUHVibGljYXRpb25zKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCBkYXRhLmVycm9yIHx8ICdTYXZlIGZhaWxlZCcpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIHNhdmUgcHVibGljYXRpb24nKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVNYXN0ZXJQdWJsaWNhdGlvbihrZXkpIHtcbiAgc2hvd0NvbmZpcm1Nb2RhbChcbiAgICAnXHVEODNEXHVEREQxXHVGRTBGIERlbGV0ZSBQdWJsaWNhdGlvbicsXG4gICAgYERlbGV0ZSBcIiR7a2V5fVwiPyBUaGlzIGNhbm5vdCBiZSB1bmRvbmUuYCxcbiAgICBhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvcHVibGljYXRpb24nLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgYWN0aW9uOiAnZGVsZXRlJywga2V5IH0pLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICAgICAgX3NldE1hc3RlckNoYW5nZU5vdGljZSgnUHVibGljYXRpb25zJywgJ2RlbGV0ZWQnKTtcbiAgICAgICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzA1IERlbGV0ZWQnLCBgUHVibGljYXRpb24gXCIke2tleX1cIiByZW1vdmVkLmApO1xuICAgICAgICAgIGF3YWl0IGxvYWRQdWJsaWNhdGlvbnMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgZGF0YS5lcnJvciB8fCAnRGVsZXRlIGZhaWxlZCcpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIGRlbGV0ZSBwdWJsaWNhdGlvbicpO1xuICAgICAgfVxuICAgIH1cbiAgKTtcbn1cblxuZnVuY3Rpb24gX3JlbmRlckF3YXJkc0xpc3QoYXdhcmRzKSB7XG4gIGlmICghYXdhcmRzLmxlbmd0aCkge1xuICAgIHJldHVybiAnPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO3BhZGRpbmc6MTJweCAwO1wiPk5vIGF3YXJkcyBvbiBmaWxlLiBDbGljayBcIisgQWRkIEF3YXJkXCIgYWJvdmUuPC9wPic7XG4gIH1cbiAgY29uc3Qgcm93cyA9IGF3YXJkcy5tYXAoKGF3YXJkLCBpZHgpID0+IHtcbiAgICBjb25zdCB0aXRsZSA9IGVzY2FwZUh0bWwoYXdhcmQudGl0bGUgfHwgJycpO1xuICAgIGNvbnN0IHllYXIgID0gYXdhcmQueWVhciA/IFN0cmluZyhhd2FyZC55ZWFyKSA6ICdcdTIwMTQnO1xuICAgIGNvbnN0IGRlc2MgID0gZXNjYXBlSHRtbCgoYXdhcmQuZGVzY3JpcHRpb24gfHwgJycpLnNsaWNlKDAsIDEwMCkpO1xuICAgIGNvbnN0IGF3YXJkSnNvbiA9IGVzY2FwZUh0bWwoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgdGl0bGU6IGF3YXJkLnRpdGxlIHx8ICcnLCB5ZWFyOiBhd2FyZC55ZWFyIHx8ICcnLFxuICAgICAgZGVzY3JpcHRpb246IGF3YXJkLmRlc2NyaXB0aW9uIHx8ICcnLFxuICAgICAgcmVsZXZhbnRfZm9yOiAoYXdhcmQucmVsZXZhbnRfZm9yIHx8IFtdKS5qb2luKCcsICcpLFxuICAgIH0pKTtcbiAgICByZXR1cm4gYFxuICAgICAgPHRyPlxuICAgICAgICA8dGQ+XG4gICAgICAgICAgPHN0cm9uZz4ke3RpdGxlfTwvc3Ryb25nPlxuICAgICAgICAgICR7ZGVzYyA/IGA8YnI+PHNtYWxsIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtcIj4ke2Rlc2N9JHsoYXdhcmQuZGVzY3JpcHRpb258fCcnKS5sZW5ndGggPiAxMDAgPyAnXHUyMDI2JyA6ICcnfTwvc21hbGw+YCA6ICcnfVxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjtjb2xvcjojNDc1NTY5O1wiPiR7eWVhcn08L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJhY3Rpb24tYnRuc1wiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIG9uY2xpY2s9XCJlZGl0TWFzdGVyQXdhcmQoJHthd2FyZEpzb259LCAke2lkeH0pXCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkVkaXQgYXdhcmQ6ICR7dGl0bGV9XCIgdGl0bGU9XCJFZGl0XCI+XHUyNzBGXHVGRTBGPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgb25jbGljaz1cImRlbGV0ZU1hc3RlckF3YXJkKCR7aWR4fSwgJyR7dGl0bGV9JylcIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiRGVsZXRlIGF3YXJkOiAke3RpdGxlfVwiIHRpdGxlPVwiRGVsZXRlXCI+XHVEODNEXHVEREQxXHVGRTBGPC9idXR0b24+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L3RyPmA7XG4gIH0pLmpvaW4oJycpO1xuICByZXR1cm4gYFxuICAgIDx0YWJsZSBjbGFzcz1cInJldmlldy10YWJsZVwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIj5cbiAgICAgIDx0aGVhZD5cbiAgICAgICAgPHRyPlxuICAgICAgICAgIDx0aD5Bd2FyZDwvdGg+XG4gICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6NzBweDt0ZXh0LWFsaWduOmNlbnRlcjtcIj5ZZWFyPC90aD5cbiAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDo4MHB4O1wiPkFjdGlvbnM8L3RoPlxuICAgICAgICA8L3RyPlxuICAgICAgPC90aGVhZD5cbiAgICAgIDx0Ym9keT4ke3Jvd3N9PC90Ym9keT5cbiAgICA8L3RhYmxlPmA7XG59XG5cblxuZnVuY3Rpb24gX3JlbmRlckNlcnRpZmljYXRpb25zTGlzdChjZXJ0cykge1xuICBpZiAoIWNlcnRzLmxlbmd0aCkge1xuICAgIHJldHVybiAnPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO3BhZGRpbmc6MTJweCAwO1wiPk5vIGNlcnRpZmljYXRpb25zIG9uIGZpbGUuIENsaWNrIFwiKyBBZGQgQ2VydGlmaWNhdGlvblwiIGFib3ZlLjwvcD4nO1xuICB9XG4gIGNvbnN0IHJvd3MgPSBjZXJ0cy5tYXAoKGNlcnQsIGlkeCkgPT4ge1xuICAgIGNvbnN0IG5hbWUgICA9IGVzY2FwZUh0bWwoY2VydC5uYW1lIHx8ICcnKTtcbiAgICBjb25zdCBpc3N1ZXIgPSBlc2NhcGVIdG1sKGNlcnQuaXNzdWVyIHx8ICdcdTIwMTQnKTtcbiAgICBjb25zdCB5ZWFyICAgPSBjZXJ0LnllYXIgPyBTdHJpbmcoY2VydC55ZWFyKSA6ICdcdTIwMTQnO1xuICAgIGNvbnN0IGNlcnRKc29uID0gZXNjYXBlSHRtbChKU09OLnN0cmluZ2lmeSh7XG4gICAgICBuYW1lOiBjZXJ0Lm5hbWUgfHwgJycsIGlzc3VlcjogY2VydC5pc3N1ZXIgfHwgJycsIHllYXI6IGNlcnQueWVhciB8fCAnJyxcbiAgICB9KSk7XG4gICAgcmV0dXJuIGBcbiAgICAgIDx0cj5cbiAgICAgICAgPHRkPjxzdHJvbmc+JHtuYW1lfTwvc3Ryb25nPjwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cImNvbG9yOiM0NzU1Njk7XCI+JHtpc3N1ZXJ9PC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7Y29sb3I6IzQ3NTU2OTtcIj4ke3llYXJ9PC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwiYWN0aW9uLWJ0bnNcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBvbmNsaWNrPVwiZWRpdE1hc3RlckNlcnRpZmljYXRpb24oJHtjZXJ0SnNvbn0sICR7aWR4fSlcIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiRWRpdCBjZXJ0aWZpY2F0aW9uOiAke25hbWV9XCIgdGl0bGU9XCJFZGl0XCI+XHUyNzBGXHVGRTBGPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgb25jbGljaz1cImRlbGV0ZU1hc3RlckNlcnRpZmljYXRpb24oJHtpZHh9LCAnJHtuYW1lfScpXCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkRlbGV0ZSBjZXJ0aWZpY2F0aW9uOiAke25hbWV9XCIgdGl0bGU9XCJEZWxldGVcIj5cdUQ4M0RcdURERDFcdUZFMEY8L2J1dHRvbj5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvdHI+YDtcbiAgfSkuam9pbignJyk7XG4gIHJldHVybiBgXG4gICAgPHRhYmxlIGNsYXNzPVwicmV2aWV3LXRhYmxlXCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiPlxuICAgICAgPHRoZWFkPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRoPk5hbWU8L3RoPlxuICAgICAgICAgIDx0aD5Jc3N1ZXI8L3RoPlxuICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOjcwcHg7dGV4dC1hbGlnbjpjZW50ZXI7XCI+WWVhcjwvdGg+XG4gICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6ODBweDtcIj5BY3Rpb25zPC90aD5cbiAgICAgICAgPC90cj5cbiAgICAgIDwvdGhlYWQ+XG4gICAgICA8dGJvZHk+JHtyb3dzfTwvdGJvZHk+XG4gICAgPC90YWJsZT5gO1xufVxuXG5cbmZ1bmN0aW9uIF9yZW5kZXJNYXN0ZXJBY2hpZXZlbWVudHNUYWJsZShhY2hpZXZlbWVudHMpIHtcbiAgaWYgKCFhY2hpZXZlbWVudHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuICc8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7cGFkZGluZzoxMnB4IDA7XCI+Tm8gc2VsZWN0ZWQgYWNoaWV2ZW1lbnRzIHlldC4gVXNlIHRoZSBIYXJ2ZXN0IGZlYXR1cmUgdG8gYWRkIGFjaGlldmVtZW50cyBmcm9tIGEgY29tcGxldGVkIHNlc3Npb24sIG9yIGNsaWNrIFwiKyBBZGQgQWNoaWV2ZW1lbnRcIiBhYm92ZS48L3A+JztcbiAgfVxuICBsZXQgcm93cyA9IGFjaGlldmVtZW50cy5tYXAoYWNoID0+IHtcbiAgICBjb25zdCBpZCAgICAgID0gZXNjYXBlSHRtbChhY2guaWQgfHwgJycpO1xuICAgIGNvbnN0IHRpdGxlICAgPSBlc2NhcGVIdG1sKGFjaC50aXRsZSB8fCAnJyk7XG4gICAgY29uc3QgZGVzYyAgICA9IGVzY2FwZUh0bWwoKGFjaC5kZXNjcmlwdGlvbiB8fCAnJykuc2xpY2UoMCwgMTAwKSk7XG4gICAgY29uc3QgaW1wICAgICA9IGFjaC5pbXBvcnRhbmNlID8/ICdcdTIwMTQnO1xuICAgIGNvbnN0IHJlbEZvciAgPSBlc2NhcGVIdG1sKChhY2gucmVsZXZhbnRfZm9yIHx8IFtdKS5qb2luKCcsICcpKTtcbiAgICByZXR1cm4gYFxuICAgICAgPHRyPlxuICAgICAgICA8dGQ+PHN0cm9uZz4ke3RpdGxlfTwvc3Ryb25nPiR7ZGVzYyA/IGA8YnI+PHNtYWxsIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtcIj4ke2Rlc2N9JHsoYWNoLmRlc2NyaXB0aW9ufHwnJykubGVuZ3RoID4gMTAwID8gJ1x1MjAyNicgOiAnJ308L3NtYWxsPmAgOiAnJ308L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjtcIj4ke2ltcH08L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2NvbG9yOiM0NzU1Njk7XCI+JHtyZWxGb3IgfHwgJ1x1MjAxNCd9PC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwiYWN0aW9uLWJ0bnNcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBvbmNsaWNrPVwiZWRpdE1hc3RlckFjaGlldmVtZW50KCR7ZXNjYXBlSHRtbChKU09OLnN0cmluZ2lmeSh7aWQ6IGFjaC5pZHx8JycsIHRpdGxlOiBhY2gudGl0bGV8fCcnLCBkZXNjcmlwdGlvbjogYWNoLmRlc2NyaXB0aW9ufHwnJywgcmVsZXZhbnRfZm9yOiBhY2gucmVsZXZhbnRfZm9yfHxbXSwgaW1wb3J0YW5jZTogYWNoLmltcG9ydGFuY2V8fDd9KSl9KVwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJFZGl0IGFjaGlldmVtZW50OiAke3RpdGxlfVwiIHRpdGxlPVwiRWRpdFwiPlx1MjcwRlx1RkUwRjwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIG9uY2xpY2s9XCJkZWxldGVNYXN0ZXJBY2hpZXZlbWVudCgnJHtpZH0nLCAnJHt0aXRsZX0nKVwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJEZWxldGUgYWNoaWV2ZW1lbnQ6ICR7dGl0bGV9XCIgdGl0bGU9XCJEZWxldGVcIj5cdUQ4M0RcdURERDFcdUZFMEY8L2J1dHRvbj5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvdHI+YDtcbiAgfSkuam9pbignJyk7XG4gIHJldHVybiBgXG4gICAgPHRhYmxlIGNsYXNzPVwicmV2aWV3LXRhYmxlXCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiPlxuICAgICAgPHRoZWFkPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRoPkFjaGlldmVtZW50PC90aD5cbiAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDo2MHB4O3RleHQtYWxpZ246Y2VudGVyO1wiPkltcG9ydGFuY2U8L3RoPlxuICAgICAgICAgIDx0aD5SZWxldmFudCBmb3I8L3RoPlxuICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOjgwcHg7XCI+QWN0aW9uczwvdGg+XG4gICAgICAgIDwvdHI+XG4gICAgICA8L3RoZWFkPlxuICAgICAgPHRib2R5PiR7cm93c308L3Rib2R5PlxuICAgIDwvdGFibGU+YDtcbn1cblxuZnVuY3Rpb24gX3JlbmRlclN1bW1hcmllc0xpc3Qoc3VtbWFyaWVzKSB7XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhzdW1tYXJpZXMpO1xuICBpZiAoIWtleXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuICc8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7cGFkZGluZzoxMnB4IDA7XCI+Tm8gcHJvZmVzc2lvbmFsIHN1bW1hcnkgdmFyaWFudHMgeWV0LiBDbGljayBcIisgQWRkIFN1bW1hcnlcIiBhYm92ZSB0byBjcmVhdGUgeW91ciBmaXJzdCBvbmUuPC9wPic7XG4gIH1cbiAgcmV0dXJuIGtleXMubWFwKGtleSA9PiB7XG4gICAgY29uc3QgdGV4dCAgICA9IHR5cGVvZiBzdW1tYXJpZXNba2V5XSA9PT0gJ3N0cmluZycgPyBzdW1tYXJpZXNba2V5XSA6IEpTT04uc3RyaW5naWZ5KHN1bW1hcmllc1trZXldKTtcbiAgICBjb25zdCBwcmV2aWV3ID0gZXNjYXBlSHRtbCh0ZXh0LnNsaWNlKDAsIDIwMCkpO1xuICAgIGNvbnN0IGtleUVzYyAgPSBlc2NhcGVIdG1sKGtleSk7XG4gICAgcmV0dXJuIGBcbiAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc3VtbWFyeS1jYXJkXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc3VtbWFyeS1oZWFkZXJcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hc3Rlci1zdW1tYXJ5LWtleVwiPiR7a2V5RXNjfTwvc3Bhbj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWJ0bnNcIiBzdHlsZT1cImdhcDo0cHg7XCI+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBvbmNsaWNrPVwiZWRpdE1hc3RlclN1bW1hcnkoJHtlc2NhcGVIdG1sKEpTT04uc3RyaW5naWZ5KHtrZXksIHRleHR9KSl9KVwiXG4gICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkVkaXQgc3VtbWFyeTogJHtrZXlFc2N9XCIgdGl0bGU9XCJFZGl0XCI+XHUyNzBGXHVGRTBGPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBvbmNsaWNrPVwiZGVsZXRlTWFzdGVyU3VtbWFyeSgnJHtrZXlFc2N9JylcIlxuICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJEZWxldGUgc3VtbWFyeTogJHtrZXlFc2N9XCIgdGl0bGU9XCJEZWxldGVcIj5cdUQ4M0RcdURERDFcdUZFMEY8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYXN0ZXItc3VtbWFyeS1wcmV2aWV3XCI+JHtwcmV2aWV3fSR7dGV4dC5sZW5ndGggPiAyMDAgPyAnXHUyMDI2JyA6ICcnfTwvZGl2PlxuICAgICAgPC9kaXY+YDtcbiAgfSkuam9pbignJyk7XG59XG5cbmZ1bmN0aW9uIHNob3dBZGRBY2hpZXZlbWVudE1vZGFsKCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLW1vZGFsLWlkJykudmFsdWUgICAgICAgICAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLW1vZGFsLXRpdGxlLWlucHV0JykudmFsdWUgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLW1vZGFsLWRlc2MtaW5wdXQnKS52YWx1ZSAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLW1vZGFsLXJlbGV2YW50LWlucHV0JykudmFsdWUgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaC1tb2RhbC1pbXBvcnRhbmNlLWlucHV0JykudmFsdWUgPSAnNyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItYWNoLW1vZGFsLXRpdGxlJykudGV4dENvbnRlbnQgPSAnQWRkIEFjaGlldmVtZW50JztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1hY2gtbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgc2V0SW5pdGlhbEZvY3VzKCdtYXN0ZXItYWNoLW1vZGFsLW92ZXJsYXknKTtcbiAgdHJhcEZvY3VzKCdtYXN0ZXItYWNoLW1vZGFsLW92ZXJsYXknKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaC1tb2RhbC10aXRsZS1pbnB1dCcpLmZvY3VzKCk7XG59XG5cbmZ1bmN0aW9uIGVkaXRNYXN0ZXJBY2hpZXZlbWVudChhY2gpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaC1tb2RhbC1pZCcpLnZhbHVlICAgICAgICAgICAgICA9IGFjaC5pZCB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaC1tb2RhbC10aXRsZS1pbnB1dCcpLnZhbHVlICAgICA9IGFjaC50aXRsZSB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaC1tb2RhbC1kZXNjLWlucHV0JykudmFsdWUgICAgICA9IGFjaC5kZXNjcmlwdGlvbiB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaC1tb2RhbC1yZWxldmFudC1pbnB1dCcpLnZhbHVlICA9IChhY2gucmVsZXZhbnRfZm9yIHx8IFtdKS5qb2luKCcsICcpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLW1vZGFsLWltcG9ydGFuY2UtaW5wdXQnKS52YWx1ZSA9IGFjaC5pbXBvcnRhbmNlIHx8IDc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItYWNoLW1vZGFsLXRpdGxlJykudGV4dENvbnRlbnQgPSAnRWRpdCBBY2hpZXZlbWVudCc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItYWNoLW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICBfZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIHNldEluaXRpYWxGb2N1cygnbWFzdGVyLWFjaC1tb2RhbC1vdmVybGF5Jyk7XG4gIHRyYXBGb2N1cygnbWFzdGVyLWFjaC1tb2RhbC1vdmVybGF5Jyk7XG59XG5cbmZ1bmN0aW9uIGNsb3NlTWFzdGVyQWNoTW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItYWNoLW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICByZXN0b3JlRm9jdXMoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZU1hc3RlckFjaGlldmVtZW50KCkge1xuICBjb25zdCBpZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhY2gtbW9kYWwtaWQnKS52YWx1ZS50cmltKCkgfHxcbiAgICAgICAgICAgICAnc2FfJyArIERhdGUubm93KCk7XG4gIGNvbnN0IHRpdGxlICAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaC1tb2RhbC10aXRsZS1pbnB1dCcpLnZhbHVlLnRyaW0oKTtcbiAgY29uc3QgZGVzY3JpcHRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNoLW1vZGFsLWRlc2MtaW5wdXQnKS52YWx1ZS50cmltKCk7XG4gIGNvbnN0IHJlbGV2YW50UmF3ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjaC1tb2RhbC1yZWxldmFudC1pbnB1dCcpLnZhbHVlO1xuICBjb25zdCBpbXBvcnRhbmNlICA9IHBhcnNlSW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhY2gtbW9kYWwtaW1wb3J0YW5jZS1pbnB1dCcpLnZhbHVlLCAxMCkgfHwgNztcblxuICBpZiAoIXRpdGxlKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjZBMFx1RkUwRiBWYWxpZGF0aW9uJywgJ1RpdGxlIGlzIHJlcXVpcmVkLicpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCByZWxldmFudF9mb3IgPSByZWxldmFudFJhdy5zcGxpdCgnLCcpLm1hcChzID0+IHMudHJpbSgpKS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS91cGRhdGUtYWNoaWV2ZW1lbnQnLCB7XG4gICAgICBtZXRob2Q6ICAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6ICAgIEpTT04uc3RyaW5naWZ5KHsgaWQsIHRpdGxlLCBkZXNjcmlwdGlvbiwgcmVsZXZhbnRfZm9yLCBpbXBvcnRhbmNlIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBjbG9zZU1hc3RlckFjaE1vZGFsKCk7XG4gICAgICBfc2V0TWFzdGVyQ2hhbmdlTm90aWNlKCdTZWxlY3RlZCBBY2hpZXZlbWVudHMnLCBkYXRhLmFjdGlvbiB8fCAndXBkYXRlZCcpO1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjcwNSBTYXZlZCcsIGBBY2hpZXZlbWVudCBcIiR7dGl0bGV9XCIgJHtkYXRhLmFjdGlvbn0uYCk7XG4gICAgICBhd2FpdCBwb3B1bGF0ZU1hc3RlclRhYigpOyAgLy8gcmVmcmVzaFxuICAgIH0gZWxzZSB7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgZGF0YS5lcnJvciB8fCAnU2F2ZSBmYWlsZWQnKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgJ0ZhaWxlZCB0byBzYXZlIGFjaGlldmVtZW50Jyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvd0FkZFN1bW1hcnlNb2RhbCgpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1bS1tb2RhbC1rZXktaW5wdXQnKS52YWx1ZSAgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1bS1tb2RhbC10ZXh0LWlucHV0JykudmFsdWUgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1zdW0tbW9kYWwtdGl0bGUnKS50ZXh0Q29udGVudCA9ICdBZGQgUHJvZmVzc2lvbmFsIFN1bW1hcnknO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXN1bS1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBzZXRJbml0aWFsRm9jdXMoJ21hc3Rlci1zdW0tbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ21hc3Rlci1zdW0tbW9kYWwtb3ZlcmxheScpO1xufVxuXG5mdW5jdGlvbiBlZGl0TWFzdGVyU3VtbWFyeShvYmopIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1bS1tb2RhbC1rZXktaW5wdXQnKS52YWx1ZSAgPSBvYmoua2V5ICB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1bS1tb2RhbC10ZXh0LWlucHV0JykudmFsdWUgPSBvYmoudGV4dCB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1zdW0tbW9kYWwtdGl0bGUnKS50ZXh0Q29udGVudCA9ICdFZGl0IFByb2Zlc3Npb25hbCBTdW1tYXJ5JztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1zdW0tbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgc2V0SW5pdGlhbEZvY3VzKCdtYXN0ZXItc3VtLW1vZGFsLW92ZXJsYXknKTtcbiAgdHJhcEZvY3VzKCdtYXN0ZXItc3VtLW1vZGFsLW92ZXJsYXknKTtcbn1cblxuZnVuY3Rpb24gY2xvc2VNYXN0ZXJTdW1Nb2RhbCgpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1zdW0tbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHJlc3RvcmVGb2N1cygpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzYXZlTWFzdGVyU3VtbWFyeSgpIHtcbiAgY29uc3Qga2V5ICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdW0tbW9kYWwta2V5LWlucHV0JykudmFsdWUudHJpbSgpO1xuICBjb25zdCB0ZXh0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1bS1tb2RhbC10ZXh0LWlucHV0JykudmFsdWUudHJpbSgpO1xuICBpZiAoIWtleSB8fCAhdGV4dCkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI2QTBcdUZFMEYgVmFsaWRhdGlvbicsICdCb3RoIEtleSBhbmQgU3VtbWFyeSB0ZXh0IGFyZSByZXF1aXJlZC4nKTtcbiAgICByZXR1cm47XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS91cGRhdGUtc3VtbWFyeScsIHtcbiAgICAgIG1ldGhvZDogICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogICAgSlNPTi5zdHJpbmdpZnkoeyBrZXksIHRleHQgfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEub2spIHtcbiAgICAgIGNsb3NlTWFzdGVyU3VtTW9kYWwoKTtcbiAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ1Byb2Zlc3Npb25hbCBTdW1tYXJpZXMnLCBkYXRhLmFjdGlvbiB8fCAndXBkYXRlZCcpO1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjcwNSBTYXZlZCcsIGBTdW1tYXJ5IFwiJHtrZXl9XCIgJHtkYXRhLmFjdGlvbn0uYCk7XG4gICAgICBhd2FpdCBwb3B1bGF0ZU1hc3RlclRhYigpOyAgLy8gcmVmcmVzaFxuICAgIH0gZWxzZSB7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgZGF0YS5lcnJvciB8fCAnU2F2ZSBmYWlsZWQnKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgJ0ZhaWxlZCB0byBzYXZlIHN1bW1hcnknKTtcbiAgfVxufVxuXG4vLyAtLS0tIFBlcnNvbmFsIEluZm8gbW9kYWwgaGFuZGxlcnMgLS0tLVxuXG5mdW5jdGlvbiBzaG93RWRpdFBlcnNvbmFsSW5mb01vZGFsKCkge1xuICBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS9mdWxsJylcbiAgICAudGhlbihyID0+IHIuanNvbigpKVxuICAgIC50aGVuKGRhdGEgPT4ge1xuICAgICAgY29uc3QgcGkgICAgICA9IGRhdGEucGVyc29uYWxfaW5mbyB8fCB7fTtcbiAgICAgIGNvbnN0IGNvbnRhY3QgPSBwaS5jb250YWN0IHx8IHt9O1xuICAgICAgY29uc3QgYWRkcmVzcyA9IGNvbnRhY3QuYWRkcmVzcyB8fCB7fTtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwaS1uYW1lLWlucHV0JykudmFsdWUgICAgPSBwaS5uYW1lIHx8ICcnO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BpLXRpdGxlLWlucHV0JykudmFsdWUgICA9IHBpLnRpdGxlIHx8IHBpLmhlYWRsaW5lIHx8ICcnO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BpLWVtYWlsLWlucHV0JykudmFsdWUgICA9IGNvbnRhY3QuZW1haWwgfHwgcGkuZW1haWwgfHwgJyc7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGktcGhvbmUtaW5wdXQnKS52YWx1ZSAgID0gY29udGFjdC5waG9uZSB8fCAnJztcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwaS1saW5rZWRpbi1pbnB1dCcpLnZhbHVlID0gY29udGFjdC5saW5rZWRpbiB8fCAnJztcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwaS13ZWJzaXRlLWlucHV0JykudmFsdWUgID0gY29udGFjdC53ZWJzaXRlIHx8ICcnO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BpLWNpdHktaW5wdXQnKS52YWx1ZSAgICA9IGFkZHJlc3MuY2l0eSB8fCAnJztcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwaS1zdGF0ZS1pbnB1dCcpLnZhbHVlICAgPSBhZGRyZXNzLnN0YXRlIHx8ICcnO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1waS1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICAgIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICAgIHNldEluaXRpYWxGb2N1cygnbWFzdGVyLXBpLW1vZGFsLW92ZXJsYXknKTtcbiAgICAgIHRyYXBGb2N1cygnbWFzdGVyLXBpLW1vZGFsLW92ZXJsYXknKTtcbiAgICB9KVxuICAgIC5jYXRjaCgoKSA9PiBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgJ0NvdWxkIG5vdCBsb2FkIHBlcnNvbmFsIGluZm8nKSk7XG59XG5cbmZ1bmN0aW9uIGNsb3NlUGVyc29uYWxJbmZvTW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItcGktbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHJlc3RvcmVGb2N1cygpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzYXZlUGVyc29uYWxJbmZvKCkge1xuICBjb25zdCBib2R5ID0ge1xuICAgIG5hbWU6ICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGktbmFtZS1pbnB1dCcpLnZhbHVlLnRyaW0oKSxcbiAgICB0aXRsZTogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BpLXRpdGxlLWlucHV0JykudmFsdWUudHJpbSgpLFxuICAgIGVtYWlsOiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGktZW1haWwtaW5wdXQnKS52YWx1ZS50cmltKCksXG4gICAgcGhvbmU6ICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwaS1waG9uZS1pbnB1dCcpLnZhbHVlLnRyaW0oKSxcbiAgICBsaW5rZWRpbjogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BpLWxpbmtlZGluLWlucHV0JykudmFsdWUudHJpbSgpLFxuICAgIHdlYnNpdGU6ICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGktd2Vic2l0ZS1pbnB1dCcpLnZhbHVlLnRyaW0oKSxcbiAgICBjaXR5OiAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BpLWNpdHktaW5wdXQnKS52YWx1ZS50cmltKCksXG4gICAgc3RhdGU6ICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwaS1zdGF0ZS1pbnB1dCcpLnZhbHVlLnRyaW0oKSxcbiAgfTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvcGVyc29uYWwtaW5mbycsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSwgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEub2spIHtcbiAgICAgIGNsb3NlUGVyc29uYWxJbmZvTW9kYWwoKTtcbiAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ1BlcnNvbmFsIEluZm9ybWF0aW9uJywgJ3VwZGF0ZWQnKTtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3MDUgU2F2ZWQnLCAnUGVyc29uYWwgaW5mb3JtYXRpb24gdXBkYXRlZC4nKTtcbiAgICAgIGF3YWl0IHBvcHVsYXRlTWFzdGVyVGFiKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCBkYXRhLmVycm9yIHx8ICdTYXZlIGZhaWxlZCcpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIHNhdmUgcGVyc29uYWwgaW5mbycpO1xuICB9XG59XG5cbi8vIC0tLS0gRXhwZXJpZW5jZSBtb2RhbCBoYW5kbGVycyAtLS0tXG5cbmZ1bmN0aW9uIHNob3dBZGRFeHBlcmllbmNlTW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtbW9kYWwtaWQnKS52YWx1ZSAgICAgICAgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC10aXRsZS1pbnB1dCcpLnZhbHVlICAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLWNvbXBhbnktaW5wdXQnKS52YWx1ZSAgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtY2l0eS1pbnB1dCcpLnZhbHVlICAgICAgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC1zdGF0ZS1pbnB1dCcpLnZhbHVlICAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLXN0YXJ0LWlucHV0JykudmFsdWUgICAgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtZW5kLWlucHV0JykudmFsdWUgICAgICAgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC10eXBlLWlucHV0JykudmFsdWUgICAgICA9ICdmdWxsX3RpbWUnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLWltcG9ydGFuY2UtaW5wdXQnKS52YWx1ZSA9ICc1JztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC10YWdzLWlucHV0JykudmFsdWUgICAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWV4cC1tb2RhbC10aXRsZScpLnRleHRDb250ZW50ID0gJ0FkZCBXb3JrIEV4cGVyaWVuY2UnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWV4cC1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgX21hc3RlckV4cE1vZGFsQWNoaWV2ZW1lbnRzID0gW107XG4gIF9yZW5kZXJFeHBBY2hpZXZlbWVudHNFZGl0b3IoKTtcbiAgX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBzZXRJbml0aWFsRm9jdXMoJ21hc3Rlci1leHAtbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ21hc3Rlci1leHAtbW9kYWwtb3ZlcmxheScpO1xufVxuXG4vLyBXb3JraW5nIGNvcHkgb2YgdGhlIGN1cnJlbnRseS1lZGl0ZWQgZXhwZXJpZW5jZSdzIGFjaGlldmVtZW50cyB3aGlsZSB0aGVcbi8vIG1vZGFsIGlzIG9wZW4gKEdBUC0xOSAxNi4xMSkuIGVkaXRNYXN0ZXJFeHBlcmllbmNlKCkgdGFrZXMgYW4gaWQgKG5vdCB0aGVcbi8vIGZ1bGwgb2JqZWN0KSBhbmQgbG9va3MgaXQgdXAgZnJvbSB3aW5kb3cuX21hc3RlckV4cGVyaWVuY2VGdWxsRGF0YSBcdTIwMTRcbi8vIGFjaGlldmVtZW50IHRleHQgY2FuIGNvbnRhaW4gcXVvdGVzL3VuaWNvZGUgdGhhdCB3b3VsZCBiZSBmcmFnaWxlIHRvXG4vLyBlbWJlZCBkaXJlY3RseSBpbnNpZGUgYW4gaW5saW5lIG9uY2xpY2sgYXR0cmlidXRlLlxubGV0IF9tYXN0ZXJFeHBNb2RhbEFjaGlldmVtZW50cyA9IFtdO1xuXG5mdW5jdGlvbiBfYWNoaWV2ZW1lbnRUZXh0KGEpIHtcbiAgcmV0dXJuIHR5cGVvZiBhID09PSAnc3RyaW5nJyA/IGEgOiAoYSAmJiBhLnRleHQpIHx8ICcnO1xufVxuXG5mdW5jdGlvbiBfcmVuZGVyRXhwQWNoaWV2ZW1lbnRzRWRpdG9yKCkge1xuICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLWFjaGlldmVtZW50cy1lZGl0b3ItbGlzdCcpO1xuICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuO1xuICBjb25zdCBsYXN0SWR4ID0gX21hc3RlckV4cE1vZGFsQWNoaWV2ZW1lbnRzLmxlbmd0aCAtIDE7XG4gIGNvbnRhaW5lci5pbm5lckhUTUwgPSBfbWFzdGVyRXhwTW9kYWxBY2hpZXZlbWVudHMubWFwKChhY2gsIGlkeCkgPT4gYFxuICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjZweDthbGlnbi1pdGVtczpjZW50ZXI7bWFyZ2luLWJvdHRvbTo2cHg7XCI+XG4gICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImVkaXQtaW5wdXQgZXhwLWFjaC10ZXh0LWlucHV0XCIgZGF0YS1pZHg9XCIke2lkeH1cIiBzdHlsZT1cImZsZXg6MTtcIlxuICAgICAgICAgIHZhbHVlPVwiJHtlc2NhcGVIdG1sKF9hY2hpZXZlbWVudFRleHQoYWNoKSl9XCIgYXJpYS1sYWJlbD1cIkFjaGlldmVtZW50ICR7aWR4ICsgMX0gdGV4dFwiIC8+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImljb24tYnRuXCIgb25jbGljaz1cIl9tb3ZlRXhwQWNoaWV2ZW1lbnQoJHtpZHh9LCAtMSlcIlxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJNb3ZlIGFjaGlldmVtZW50ICR7aWR4ICsgMX0gdXBcIiB0aXRsZT1cIk1vdmUgdXBcIiAke2lkeCA9PT0gMCA/ICdkaXNhYmxlZCcgOiAnJ30+XHUyMTkxPC9idXR0b24+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImljb24tYnRuXCIgb25jbGljaz1cIl9tb3ZlRXhwQWNoaWV2ZW1lbnQoJHtpZHh9LCAxKVwiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIk1vdmUgYWNoaWV2ZW1lbnQgJHtpZHggKyAxfSBkb3duXCIgdGl0bGU9XCJNb3ZlIGRvd25cIiAke2lkeCA9PT0gbGFzdElkeCA/ICdkaXNhYmxlZCcgOiAnJ30+XHUyMTkzPC9idXR0b24+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImljb24tYnRuXCIgb25jbGljaz1cIl9kZWxldGVFeHBBY2hpZXZlbWVudCgke2lkeH0pXCJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiRGVsZXRlIGFjaGlldmVtZW50ICR7aWR4ICsgMX1cIiB0aXRsZT1cIkRlbGV0ZVwiPlx1RDgzRFx1REREMVx1RkUwRjwvYnV0dG9uPlxuICAgIDwvZGl2PmApLmpvaW4oJycpIHx8ICc8cCBzdHlsZT1cImNvbG9yOiM5NGEzYjg7Zm9udC1zaXplOjAuODVlbTttYXJnaW46MCAwIDZweDtcIj5ObyBhY2hpZXZlbWVudHMgeWV0LjwvcD4nO1xufVxuXG4vLyBSZWFkIGFueSBpbi1wcm9ncmVzcyBlZGl0cyBvdXQgb2YgdGhlIGFjaGlldmVtZW50IHRleHQgaW5wdXRzIGJlZm9yZSBhXG4vLyByZW9yZGVyL2RlbGV0ZS9zYXZlIHJlYnVpbGRzIHRoZSBsaXN0IGZyb20gX21hc3RlckV4cE1vZGFsQWNoaWV2ZW1lbnRzIFx1MjAxNFxuLy8gb3RoZXJ3aXNlIGFuIHVuLXN1Ym1pdHRlZCB0ZXh0IGVkaXQgd291bGQgYmUgc2lsZW50bHkgbG9zdCBvbiByZS1yZW5kZXIuXG5mdW5jdGlvbiBfc3luY0V4cEFjaGlldmVtZW50c0Zyb21JbnB1dHMoKSB7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5leHAtYWNoLXRleHQtaW5wdXQnKS5mb3JFYWNoKChpbnB1dCkgPT4ge1xuICAgIGNvbnN0IGlkeCA9IHBhcnNlSW50KGlucHV0LmRhdGFzZXQuaWR4LCAxMCk7XG4gICAgY29uc3QgYWNoID0gX21hc3RlckV4cE1vZGFsQWNoaWV2ZW1lbnRzW2lkeF07XG4gICAgaWYgKHR5cGVvZiBhY2ggPT09ICdzdHJpbmcnIHx8IGFjaCA9PSBudWxsKSB7XG4gICAgICBfbWFzdGVyRXhwTW9kYWxBY2hpZXZlbWVudHNbaWR4XSA9IGlucHV0LnZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBhY2gudGV4dCA9IGlucHV0LnZhbHVlO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIF9hZGRFeHBBY2hpZXZlbWVudCgpIHtcbiAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLWFjaC1uZXctaW5wdXQnKTtcbiAgY29uc3QgdGV4dCA9IChpbnB1dC52YWx1ZSB8fCAnJykudHJpbSgpO1xuICBpZiAoIXRleHQpIHJldHVybjtcbiAgX3N5bmNFeHBBY2hpZXZlbWVudHNGcm9tSW5wdXRzKCk7XG4gIF9tYXN0ZXJFeHBNb2RhbEFjaGlldmVtZW50cy5wdXNoKHRleHQpO1xuICBpbnB1dC52YWx1ZSA9ICcnO1xuICBfcmVuZGVyRXhwQWNoaWV2ZW1lbnRzRWRpdG9yKCk7XG59XG5cbmZ1bmN0aW9uIF9tb3ZlRXhwQWNoaWV2ZW1lbnQoaWR4LCBkZWx0YSkge1xuICBfc3luY0V4cEFjaGlldmVtZW50c0Zyb21JbnB1dHMoKTtcbiAgY29uc3QgdGFyZ2V0ID0gaWR4ICsgZGVsdGE7XG4gIGlmICh0YXJnZXQgPCAwIHx8IHRhcmdldCA+PSBfbWFzdGVyRXhwTW9kYWxBY2hpZXZlbWVudHMubGVuZ3RoKSByZXR1cm47XG4gIGNvbnN0IFtpdGVtXSA9IF9tYXN0ZXJFeHBNb2RhbEFjaGlldmVtZW50cy5zcGxpY2UoaWR4LCAxKTtcbiAgX21hc3RlckV4cE1vZGFsQWNoaWV2ZW1lbnRzLnNwbGljZSh0YXJnZXQsIDAsIGl0ZW0pO1xuICBfcmVuZGVyRXhwQWNoaWV2ZW1lbnRzRWRpdG9yKCk7XG59XG5cbmZ1bmN0aW9uIF9kZWxldGVFeHBBY2hpZXZlbWVudChpZHgpIHtcbiAgX3N5bmNFeHBBY2hpZXZlbWVudHNGcm9tSW5wdXRzKCk7XG4gIF9tYXN0ZXJFeHBNb2RhbEFjaGlldmVtZW50cy5zcGxpY2UoaWR4LCAxKTtcbiAgX3JlbmRlckV4cEFjaGlldmVtZW50c0VkaXRvcigpO1xufVxuXG5mdW5jdGlvbiBlZGl0TWFzdGVyRXhwZXJpZW5jZShpZCkge1xuICBjb25zdCBleHAgPSAod2luZG93Ll9tYXN0ZXJFeHBlcmllbmNlRnVsbERhdGEgfHwgW10pLmZpbmQoKGUpID0+IGUuaWQgPT09IGlkKTtcbiAgaWYgKCFleHApIHtcbiAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgJ0NvdWxkIG5vdCBmaW5kIHRoYXQgZXhwZXJpZW5jZSBlbnRyeSBcdTIwMTQgdHJ5IHJlZnJlc2hpbmcgdGhlIHRhYi4nKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgbG9jID0gZXhwLmxvY2F0aW9uIHx8IHt9O1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLW1vZGFsLWlkJykudmFsdWUgICAgICAgICA9IGV4cC5pZCB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC10aXRsZS1pbnB1dCcpLnZhbHVlICAgICAgPSBleHAudGl0bGUgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtY29tcGFueS1pbnB1dCcpLnZhbHVlICAgID0gZXhwLmNvbXBhbnkgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtY2l0eS1pbnB1dCcpLnZhbHVlICAgICAgID0gbG9jLmNpdHkgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtc3RhdGUtaW5wdXQnKS52YWx1ZSAgICAgID0gbG9jLnN0YXRlIHx8ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLXN0YXJ0LWlucHV0JykudmFsdWUgICAgICA9IGV4cC5zdGFydF9kYXRlIHx8ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLWVuZC1pbnB1dCcpLnZhbHVlICAgICAgICA9IGV4cC5lbmRfZGF0ZSB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC10eXBlLWlucHV0JykudmFsdWUgICAgICAgPSBleHAuZW1wbG95bWVudF90eXBlIHx8ICdmdWxsX3RpbWUnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLWltcG9ydGFuY2UtaW5wdXQnKS52YWx1ZSAgPSBleHAuaW1wb3J0YW5jZSB8fCA1O1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLXRhZ3MtaW5wdXQnKS52YWx1ZSAgICAgICA9IHR5cGVvZiBleHAudGFncyA9PT0gJ3N0cmluZycgPyBleHAudGFnc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoZXhwLnRhZ3MgfHwgW10pLmpvaW4oJywgJyk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItZXhwLW1vZGFsLXRpdGxlJykudGV4dENvbnRlbnQgPSAnRWRpdCBXb3JrIEV4cGVyaWVuY2UnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWV4cC1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgX21hc3RlckV4cE1vZGFsQWNoaWV2ZW1lbnRzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShleHAuYWNoaWV2ZW1lbnRzIHx8IFtdKSk7XG4gIF9yZW5kZXJFeHBBY2hpZXZlbWVudHNFZGl0b3IoKTtcbiAgX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBzZXRJbml0aWFsRm9jdXMoJ21hc3Rlci1leHAtbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ21hc3Rlci1leHAtbW9kYWwtb3ZlcmxheScpO1xufVxuXG5mdW5jdGlvbiBjbG9zZUV4cGVyaWVuY2VNb2RhbCgpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1leHAtbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHJlc3RvcmVGb2N1cygpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzYXZlTWFzdGVyRXhwZXJpZW5jZSgpIHtcbiAgY29uc3QgaWQgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC1tb2RhbC1pZCcpLnZhbHVlLnRyaW0oKTtcbiAgY29uc3QgdGl0bGUgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC10aXRsZS1pbnB1dCcpLnZhbHVlLnRyaW0oKTtcbiAgY29uc3QgY29tcGFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtY29tcGFueS1pbnB1dCcpLnZhbHVlLnRyaW0oKTtcbiAgaWYgKCF0aXRsZSB8fCAhY29tcGFueSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI2QTBcdUZFMEYgVmFsaWRhdGlvbicsICdKb2IgdGl0bGUgYW5kIGNvbXBhbnkgYXJlIHJlcXVpcmVkLicpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB0YWdzUmF3ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC10YWdzLWlucHV0JykudmFsdWU7XG4gIF9zeW5jRXhwQWNoaWV2ZW1lbnRzRnJvbUlucHV0cygpO1xuICBjb25zdCBleHBEYXRhID0ge1xuICAgIHRpdGxlLCBjb21wYW55LFxuICAgIGNpdHk6ICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC1jaXR5LWlucHV0JykudmFsdWUudHJpbSgpLFxuICAgIHN0YXRlOiAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC1zdGF0ZS1pbnB1dCcpLnZhbHVlLnRyaW0oKSxcbiAgICBzdGFydF9kYXRlOiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtc3RhcnQtaW5wdXQnKS52YWx1ZS50cmltKCksXG4gICAgZW5kX2RhdGU6ICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwLWVuZC1pbnB1dCcpLnZhbHVlLnRyaW0oKSxcbiAgICBlbXBsb3ltZW50X3R5cGU6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAtdHlwZS1pbnB1dCcpLnZhbHVlLFxuICAgIGltcG9ydGFuY2U6ICAgICAgcGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cC1pbXBvcnRhbmNlLWlucHV0JykudmFsdWUsIDEwKSB8fCA1LFxuICAgIHRhZ3M6ICAgICAgICAgICAgdGFnc1Jhdy5zcGxpdCgnLCcpLm1hcChzID0+IHMudHJpbSgpKS5maWx0ZXIoQm9vbGVhbiksXG4gICAgYWNoaWV2ZW1lbnRzOiAgICBfbWFzdGVyRXhwTW9kYWxBY2hpZXZlbWVudHMsXG4gIH07XG4gIGNvbnN0IGFjdGlvbiA9IGlkID8gJ3VwZGF0ZScgOiAnYWRkJztcbiAgY29uc3QgYm9keSAgID0gYWN0aW9uID09PSAndXBkYXRlJyA/IHsgYWN0aW9uLCBpZCwgZXhwZXJpZW5jZTogZXhwRGF0YSB9IDogeyBhY3Rpb24sIGV4cGVyaWVuY2U6IGV4cERhdGEgfTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvZXhwZXJpZW5jZScsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSwgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEub2spIHtcbiAgICAgIGNsb3NlRXhwZXJpZW5jZU1vZGFsKCk7XG4gICAgICBfc2V0TWFzdGVyQ2hhbmdlTm90aWNlKCdXb3JrIEV4cGVyaWVuY2UnLCBkYXRhLmFjdGlvbiB8fCAndXBkYXRlZCcpO1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjcwNSBTYXZlZCcsIGBFeHBlcmllbmNlIFwiJHt0aXRsZX1cIiAke2RhdGEuYWN0aW9ufS5gKTtcbiAgICAgIGF3YWl0IHBvcHVsYXRlTWFzdGVyVGFiKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCBkYXRhLmVycm9yIHx8ICdTYXZlIGZhaWxlZCcpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIHNhdmUgZXhwZXJpZW5jZScpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZU1hc3RlckV4cGVyaWVuY2UoaWQsIHRpdGxlKSB7XG4gIHNob3dDb25maXJtTW9kYWwoXG4gICAgJ1x1RDgzRFx1REREMVx1RkUwRiBEZWxldGUgRXhwZXJpZW5jZScsXG4gICAgYERlbGV0ZSBcIiR7dGl0bGV9XCI/IFRoaXMgY2Fubm90IGJlIHVuZG9uZS5gLFxuICAgIGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS9leHBlcmllbmNlJywge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGFjdGlvbjogJ2RlbGV0ZScsIGlkIH0pLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICAgICAgX3NldE1hc3RlckNoYW5nZU5vdGljZSgnV29yayBFeHBlcmllbmNlJywgZGF0YS5hY3Rpb24gfHwgJ2RlbGV0ZWQnKTtcbiAgICAgICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzA1IERlbGV0ZWQnLCBgRXhwZXJpZW5jZSBcIiR7dGl0bGV9XCIgcmVtb3ZlZC5gKTtcbiAgICAgICAgICBhd2FpdCBwb3B1bGF0ZU1hc3RlclRhYigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCBkYXRhLmVycm9yIHx8ICdEZWxldGUgZmFpbGVkJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsICdGYWlsZWQgdG8gZGVsZXRlIGV4cGVyaWVuY2UnKTtcbiAgICAgIH1cbiAgICB9XG4gICk7XG59XG5cbi8vIC0tLS0gU2tpbGwgbW9kYWwgaGFuZGxlcnMgLS0tLVxuXG5mdW5jdGlvbiBzaG93QWRkU2tpbGxNb2RhbChjYXRlZ29yeUtleSwgaXNGbGF0KSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1tb2RhbC1jYXRlZ29yeScpLnZhbHVlID0gY2F0ZWdvcnlLZXkgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1tb2RhbC1pcy1mbGF0JykudmFsdWUgID0gaXNGbGF0ID8gJzEnIDogJzAnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtbW9kYWwtb3JpZ2luYWwtbmFtZScpLnZhbHVlID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1uYW1lLWlucHV0JykudmFsdWUgICAgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1leHBlcmllbmNlcy1pbnB1dCcpLnZhbHVlID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1hbGlhc2VzLWlucHV0JykudmFsdWUgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC15ZWFycy1pbnB1dCcpLnZhbHVlICAgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItc2tpbGwtbW9kYWwtdGl0bGUnKS50ZXh0Q29udGVudCA9ICdBZGQgU2tpbGwnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXNraWxsLXNhdmUtYnRuJykudGV4dENvbnRlbnQgPSAnQWRkIFNraWxsJztcbiAgY29uc3QgaGludHMgPSAod2luZG93Ll9tYXN0ZXJFeHBlcmllbmNlT3B0aW9ucyB8fCBbXSlcbiAgICAuc2xpY2UoMCwgOClcbiAgICAubWFwKCh4KSA9PiBgJHt4LmlkfSAoJHt4LmxhYmVsfSlgKVxuICAgIC5qb2luKCcgXHUwMEI3ICcpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtZXhwZXJpZW5jZS1oaW50cycpLnRleHRDb250ZW50ID0gaGludHMgPyBgQXZhaWxhYmxlOiAke2hpbnRzfWAgOiAnJztcbiAgY29uc3QgY2F0Um93ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NraWxsLWNhdGVnb3J5LXJvdycpO1xuICBpZiAoY2F0ZWdvcnlLZXkpIHtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtY2F0ZWdvcnktZGlzcGxheScpLnRleHRDb250ZW50ID0gY2F0ZWdvcnlLZXk7XG4gICAgY2F0Um93LnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgfSBlbHNlIHtcbiAgICBjYXRSb3cuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgfVxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXNraWxsLW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICBfZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIHNldEluaXRpYWxGb2N1cygnbWFzdGVyLXNraWxsLW1vZGFsLW92ZXJsYXknKTtcbiAgdHJhcEZvY3VzKCdtYXN0ZXItc2tpbGwtbW9kYWwtb3ZlcmxheScpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtbmFtZS1pbnB1dCcpLmZvY3VzKCk7XG59XG5cbmZ1bmN0aW9uIGVkaXRNYXN0ZXJTa2lsbChza2lsbE9iaiwgY2F0ZWdvcnlLZXksIGlzRmxhdCkge1xuICBjb25zdCBuYW1lID0gdHlwZW9mIHNraWxsT2JqID09PSAnc3RyaW5nJyA/IHNraWxsT2JqIDogKHNraWxsT2JqPy5uYW1lIHx8ICcnKTtcbiAgY29uc3QgZXhwZXJpZW5jZXMgPSBBcnJheS5pc0FycmF5KHNraWxsT2JqPy5leHBlcmllbmNlcykgPyBza2lsbE9iai5leHBlcmllbmNlcyA6IFtdO1xuICBjb25zdCBhbGlhc2VzID0gQXJyYXkuaXNBcnJheShza2lsbE9iaj8uYWxpYXNlcykgPyBza2lsbE9iai5hbGlhc2VzIDogW107XG4gIGNvbnN0IHllYXJzID0gKHR5cGVvZiBza2lsbE9iaiA9PT0gJ29iamVjdCcgJiYgc2tpbGxPYmo/LnllYXJzICE9IG51bGwpID8gc2tpbGxPYmoueWVhcnMgOiAnJztcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtbW9kYWwtY2F0ZWdvcnknKS52YWx1ZSA9IGNhdGVnb3J5S2V5IHx8ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtbW9kYWwtaXMtZmxhdCcpLnZhbHVlICA9IGlzRmxhdCA/ICcxJyA6ICcwJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NraWxsLW1vZGFsLW9yaWdpbmFsLW5hbWUnKS52YWx1ZSA9IG5hbWU7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1uYW1lLWlucHV0JykudmFsdWUgPSBuYW1lO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtZXhwZXJpZW5jZXMtaW5wdXQnKS52YWx1ZSA9IGV4cGVyaWVuY2VzLmpvaW4oJywgJyk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1hbGlhc2VzLWlucHV0JykudmFsdWUgPSBhbGlhc2VzLmpvaW4oJywgJyk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC15ZWFycy1pbnB1dCcpLnZhbHVlID0geWVhcnM7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItc2tpbGwtbW9kYWwtdGl0bGUnKS50ZXh0Q29udGVudCA9ICdFZGl0IFNraWxsJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1za2lsbC1zYXZlLWJ0bicpLnRleHRDb250ZW50ID0gJ1NhdmUgU2tpbGwnO1xuXG4gIGNvbnN0IGhpbnRzID0gKHdpbmRvdy5fbWFzdGVyRXhwZXJpZW5jZU9wdGlvbnMgfHwgW10pXG4gICAgLnNsaWNlKDAsIDgpXG4gICAgLm1hcCgoeCkgPT4gYCR7eC5pZH0gKCR7eC5sYWJlbH0pYClcbiAgICAuam9pbignIFx1MDBCNyAnKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NraWxsLWV4cGVyaWVuY2UtaGludHMnKS50ZXh0Q29udGVudCA9IGhpbnRzID8gYEF2YWlsYWJsZTogJHtoaW50c31gIDogJyc7XG5cbiAgY29uc3QgY2F0Um93ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NraWxsLWNhdGVnb3J5LXJvdycpO1xuICBpZiAoY2F0ZWdvcnlLZXkpIHtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtY2F0ZWdvcnktZGlzcGxheScpLnRleHRDb250ZW50ID0gY2F0ZWdvcnlLZXk7XG4gICAgY2F0Um93LnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgfSBlbHNlIHtcbiAgICBjYXRSb3cuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgfVxuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItc2tpbGwtbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgc2V0SW5pdGlhbEZvY3VzKCdtYXN0ZXItc2tpbGwtbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ21hc3Rlci1za2lsbC1tb2RhbC1vdmVybGF5Jyk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1uYW1lLWlucHV0JykuZm9jdXMoKTtcbn1cblxuZnVuY3Rpb24gY2xvc2VTa2lsbE1vZGFsKCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLXNraWxsLW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICByZXN0b3JlRm9jdXMoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZU1hc3RlclNraWxsKCkge1xuICBjb25zdCBza2lsbCAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1uYW1lLWlucHV0JykudmFsdWUudHJpbSgpO1xuICBjb25zdCBjYXRlZ29yeSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC1tb2RhbC1jYXRlZ29yeScpLnZhbHVlLnRyaW0oKTtcbiAgY29uc3QgaXNGbGF0ICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtbW9kYWwtaXMtZmxhdCcpLnZhbHVlID09PSAnMSc7XG4gIGNvbnN0IG9yaWdpbmFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NraWxsLW1vZGFsLW9yaWdpbmFsLW5hbWUnKS52YWx1ZS50cmltKCk7XG4gIGNvbnN0IGV4cGVyaWVuY2VzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NraWxsLWV4cGVyaWVuY2VzLWlucHV0JykudmFsdWVcbiAgICAuc3BsaXQoJywnKVxuICAgIC5tYXAoKHMpID0+IHMudHJpbSgpKVxuICAgIC5maWx0ZXIoQm9vbGVhbik7XG4gIGNvbnN0IGFsaWFzZXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2tpbGwtYWxpYXNlcy1pbnB1dCcpLnZhbHVlXG4gICAgLnNwbGl0KCcsJylcbiAgICAubWFwKChzKSA9PiBzLnRyaW0oKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pO1xuICBjb25zdCB5ZWFyc1JhdyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdza2lsbC15ZWFycy1pbnB1dCcpLnZhbHVlLnRyaW0oKTtcbiAgY29uc3QgeWVhcnMgPSB5ZWFyc1JhdyA9PT0gJycgPyBudWxsIDogcGFyc2VGbG9hdCh5ZWFyc1Jhdyk7XG4gIGlmICghc2tpbGwpIHtcbiAgICBzaG93QWxlcnRNb2RhbCgnXHUyNkEwXHVGRTBGIFZhbGlkYXRpb24nLCAnU2tpbGwgbmFtZSBpcyByZXF1aXJlZC4nKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHllYXJzICE9PSBudWxsICYmICFOdW1iZXIuaXNGaW5pdGUoeWVhcnMpKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjZBMFx1RkUwRiBWYWxpZGF0aW9uJywgJ1llYXJzIG9mIGV4cGVyaWVuY2UgbXVzdCBiZSBhIGZpbml0ZSBudW1iZXIuJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGlzVXBkYXRlID0gQm9vbGVhbihvcmlnaW5hbCk7XG4gIGNvbnN0IGJhc2VCb2R5ID0ge1xuICAgIGFjdGlvbjogaXNVcGRhdGUgPyAndXBkYXRlJyA6ICdhZGQnLFxuICAgIHNraWxsOiBpc1VwZGF0ZSA/IG9yaWdpbmFsIDogc2tpbGwsXG4gICAgLi4uKGlzVXBkYXRlID8geyBza2lsbF9uZXc6IHNraWxsIH0gOiB7fSksXG4gICAgZXhwZXJpZW5jZXMsXG4gICAgYWxpYXNlcyxcbiAgICB5ZWFycyxcbiAgfTtcbiAgY29uc3QgYm9keSA9IGlzRmxhdCA/IGJhc2VCb2R5IDogeyAuLi5iYXNlQm9keSwgY2F0ZWdvcnkgfTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvc2tpbGwnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBjbG9zZVNraWxsTW9kYWwoKTtcbiAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ1NraWxscycsIGRhdGEuYWN0aW9uIHx8ICd1cGRhdGVkJyk7XG4gICAgICBhd2FpdCBwb3B1bGF0ZU1hc3RlclRhYigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgZGF0YS5lcnJvciB8fCAnQ291bGQgbm90IGFkZCBza2lsbCcpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIGFkZCBza2lsbCcpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZU1hc3RlclNraWxsKHNraWxsLCBjYXRlZ29yeSwgaXNGbGF0KSB7XG4gIGNvbnN0IGJvZHkgPSBpc0ZsYXQgPyB7IGFjdGlvbjogJ2RlbGV0ZScsIHNraWxsIH0gOiB7IGFjdGlvbjogJ2RlbGV0ZScsIHNraWxsLCBjYXRlZ29yeSB9O1xuICBjb25zdCBzY29wZSA9IGlzRmxhdCA/ICdTa2lsbHMnIDogYFNraWxscyBcdTIxOTIgJHtjYXRlZ29yeX1gO1xuICBzaG93Q29uZmlybU1vZGFsKFxuICAgICdcdUQ4M0RcdURERDFcdUZFMEYgRGVsZXRlIFNraWxsJyxcbiAgICBgRGVsZXRlIHNraWxsIFwiJHtza2lsbH1cIiBmcm9tICR7c2NvcGV9PyBUaGlzIGNhbm5vdCBiZSB1bmRvbmUuYCxcbiAgICBhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvc2tpbGwnLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LCBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICBpZiAoZGF0YS5vaykge1xuICAgICAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ1NraWxscycsIGRhdGEuYWN0aW9uIHx8ICd1cGRhdGVkJyk7XG4gICAgICAgICAgYXdhaXQgcG9wdWxhdGVNYXN0ZXJUYWIoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgZGF0YS5lcnJvciB8fCAnQ291bGQgbm90IHJlbW92ZSBza2lsbCcpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIHJlbW92ZSBza2lsbCcpO1xuICAgICAgfVxuICAgIH1cbiAgKTtcbn1cblxuLy8gLS0tLSBFZHVjYXRpb24gbW9kYWwgaGFuZGxlcnMgLS0tLVxuXG5mdW5jdGlvbiBzaG93QWRkRWR1Y2F0aW9uTW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtbW9kYWwtaWR4JykudmFsdWUgICAgICAgICAgICA9ICctMSc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtZGVncmVlLWlucHV0JykudmFsdWUgICAgICAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LWZpZWxkLWlucHV0JykudmFsdWUgICAgICAgICAgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkdS1pbnN0aXR1dGlvbi1pbnB1dCcpLnZhbHVlICAgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtY2l0eS1pbnB1dCcpLnZhbHVlICAgICAgICAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LXN0YXRlLWlucHV0JykudmFsdWUgICAgICAgICAgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkdS1zdGFydC15ZWFyLWlucHV0JykudmFsdWUgICAgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtZW5kLXllYXItaW5wdXQnKS52YWx1ZSAgICAgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWVkdS1tb2RhbC10aXRsZScpLnRleHRDb250ZW50ID0gJ0FkZCBFZHVjYXRpb24nO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWVkdS1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBzZXRJbml0aWFsRm9jdXMoJ21hc3Rlci1lZHUtbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ21hc3Rlci1lZHUtbW9kYWwtb3ZlcmxheScpO1xufVxuXG5mdW5jdGlvbiBlZGl0TWFzdGVyRWR1Y2F0aW9uKGVkdSwgaWR4KSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtbW9kYWwtaWR4JykudmFsdWUgICAgICAgICA9IGlkeDtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkdS1kZWdyZWUtaW5wdXQnKS52YWx1ZSAgICAgID0gZWR1LmRlZ3JlZSB8fCAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkdS1maWVsZC1pbnB1dCcpLnZhbHVlICAgICAgID0gZWR1LmZpZWxkIHx8ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LWluc3RpdHV0aW9uLWlucHV0JykudmFsdWUgPSBlZHUuaW5zdGl0dXRpb24gfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtY2l0eS1pbnB1dCcpLnZhbHVlICAgICAgICA9IGVkdS5jaXR5IHx8ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LXN0YXRlLWlucHV0JykudmFsdWUgICAgICAgPSBlZHUuc3RhdGUgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtc3RhcnQteWVhci1pbnB1dCcpLnZhbHVlICA9IGVkdS5zdGFydF95ZWFyIHx8ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LWVuZC15ZWFyLWlucHV0JykudmFsdWUgICAgPSBlZHUuZW5kX3llYXIgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItZWR1LW1vZGFsLXRpdGxlJykudGV4dENvbnRlbnQgPSAnRWRpdCBFZHVjYXRpb24nO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWVkdS1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBzZXRJbml0aWFsRm9jdXMoJ21hc3Rlci1lZHUtbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ21hc3Rlci1lZHUtbW9kYWwtb3ZlcmxheScpO1xufVxuXG5mdW5jdGlvbiBjbG9zZUVkdWNhdGlvbk1vZGFsKCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWVkdS1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgcmVzdG9yZUZvY3VzKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNhdmVNYXN0ZXJFZHVjYXRpb24oKSB7XG4gIGNvbnN0IGlkeCAgICAgPSBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LW1vZGFsLWlkeCcpLnZhbHVlLCAxMCk7XG4gIGNvbnN0IGRlZ3JlZSAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LWRlZ3JlZS1pbnB1dCcpLnZhbHVlLnRyaW0oKTtcbiAgY29uc3QgaW5zdGl0dXRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LWluc3RpdHV0aW9uLWlucHV0JykudmFsdWUudHJpbSgpO1xuICBpZiAoIWRlZ3JlZSB8fCAhaW5zdGl0dXRpb24pIHtcbiAgICBzaG93QWxlcnRNb2RhbCgnXHUyNkEwXHVGRTBGIFZhbGlkYXRpb24nLCAnRGVncmVlIGFuZCBpbnN0aXR1dGlvbiBhcmUgcmVxdWlyZWQuJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGFjdGlvbiA9IGlkeCA+PSAwID8gJ3VwZGF0ZScgOiAnYWRkJztcbiAgY29uc3QgYm9keSA9IHtcbiAgICBhY3Rpb24sXG4gICAgZGVncmVlLFxuICAgIGZpZWxkOiAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LWZpZWxkLWlucHV0JykudmFsdWUudHJpbSgpLFxuICAgIGluc3RpdHV0aW9uLFxuICAgIGNpdHk6ICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWR1LWNpdHktaW5wdXQnKS52YWx1ZS50cmltKCksXG4gICAgc3RhdGU6ICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtc3RhdGUtaW5wdXQnKS52YWx1ZS50cmltKCksXG4gICAgc3RhcnRfeWVhcjogIHBhcnNlSW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZHUtc3RhcnQteWVhci1pbnB1dCcpLnZhbHVlLCAxMCkgfHwgbnVsbCxcbiAgICBlbmRfeWVhcjogICAgcGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkdS1lbmQteWVhci1pbnB1dCcpLnZhbHVlLCAxMCkgfHwgbnVsbCxcbiAgICAuLi4oYWN0aW9uID09PSAndXBkYXRlJyA/IHsgaWR4IH0gOiB7fSksXG4gIH07XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL2VkdWNhdGlvbicsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSwgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEub2spIHtcbiAgICAgIGNsb3NlRWR1Y2F0aW9uTW9kYWwoKTtcbiAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ0VkdWNhdGlvbicsIGRhdGEuYWN0aW9uIHx8ICd1cGRhdGVkJyk7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzA1IFNhdmVkJywgYEVkdWNhdGlvbiBcIiR7ZGVncmVlfSBcdTIwMTMgJHtpbnN0aXR1dGlvbn1cIiAke2RhdGEuYWN0aW9ufS5gKTtcbiAgICAgIGF3YWl0IHBvcHVsYXRlTWFzdGVyVGFiKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCBkYXRhLmVycm9yIHx8ICdTYXZlIGZhaWxlZCcpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIHNhdmUgZWR1Y2F0aW9uJyk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlTWFzdGVyRWR1Y2F0aW9uKGlkeCwgaW5zdGl0dXRpb24pIHtcbiAgc2hvd0NvbmZpcm1Nb2RhbChcbiAgICAnXHVEODNEXHVEREQxXHVGRTBGIERlbGV0ZSBFZHVjYXRpb24nLFxuICAgIGBEZWxldGUgXCIke2luc3RpdHV0aW9ufVwiPyBUaGlzIGNhbm5vdCBiZSB1bmRvbmUuYCxcbiAgICBhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvZWR1Y2F0aW9uJywge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGFjdGlvbjogJ2RlbGV0ZScsIGlkeCB9KSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICBpZiAoZGF0YS5vaykge1xuICAgICAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ0VkdWNhdGlvbicsIGRhdGEuYWN0aW9uIHx8ICdkZWxldGVkJyk7XG4gICAgICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjcwNSBEZWxldGVkJywgYEVkdWNhdGlvbiBlbnRyeSByZW1vdmVkLmApO1xuICAgICAgICAgIGF3YWl0IHBvcHVsYXRlTWFzdGVyVGFiKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsIGRhdGEuZXJyb3IgfHwgJ0RlbGV0ZSBmYWlsZWQnKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgJ0ZhaWxlZCB0byBkZWxldGUgZWR1Y2F0aW9uIGVudHJ5Jyk7XG4gICAgICB9XG4gICAgfVxuICApO1xufVxuXG4vLyAtLS0tIEF3YXJkIG1vZGFsIGhhbmRsZXJzIC0tLS1cblxuZnVuY3Rpb24gc2hvd0FkZEF3YXJkTW9kYWwoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhd2FyZC1tb2RhbC1pZHgnKS52YWx1ZSAgICA9ICctMSc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhd2FyZC10aXRsZS1pbnB1dCcpLnZhbHVlICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXdhcmQteWVhci1pbnB1dCcpLnZhbHVlICAgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F3YXJkLWRlc2MtaW5wdXQnKS52YWx1ZSAgID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhd2FyZC1yZWxldmFudC1pbnB1dCcpLnZhbHVlID0gJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItYXdhcmQtbW9kYWwtdGl0bGUnKS50ZXh0Q29udGVudCA9ICdBZGQgQXdhcmQgLyBIb25vdXInO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWF3YXJkLW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICBfZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIHNldEluaXRpYWxGb2N1cygnbWFzdGVyLWF3YXJkLW1vZGFsLW92ZXJsYXknKTtcbiAgdHJhcEZvY3VzKCdtYXN0ZXItYXdhcmQtbW9kYWwtb3ZlcmxheScpO1xufVxuXG5mdW5jdGlvbiBlZGl0TWFzdGVyQXdhcmQoYXdhcmQsIGlkeCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXdhcmQtbW9kYWwtaWR4JykudmFsdWUgICAgID0gaWR4O1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXdhcmQtdGl0bGUtaW5wdXQnKS52YWx1ZSAgID0gYXdhcmQudGl0bGUgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhd2FyZC15ZWFyLWlucHV0JykudmFsdWUgICAgPSBhd2FyZC55ZWFyIHx8ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXdhcmQtZGVzYy1pbnB1dCcpLnZhbHVlICAgID0gYXdhcmQuZGVzY3JpcHRpb24gfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhd2FyZC1yZWxldmFudC1pbnB1dCcpLnZhbHVlID0gdHlwZW9mIGF3YXJkLnJlbGV2YW50X2ZvciA9PT0gJ3N0cmluZydcbiAgICA/IGF3YXJkLnJlbGV2YW50X2ZvciA6IChhd2FyZC5yZWxldmFudF9mb3IgfHwgW10pLmpvaW4oJywgJyk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItYXdhcmQtbW9kYWwtdGl0bGUnKS50ZXh0Q29udGVudCA9ICdFZGl0IEF3YXJkIC8gSG9ub3VyJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1hd2FyZC1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBzZXRJbml0aWFsRm9jdXMoJ21hc3Rlci1hd2FyZC1tb2RhbC1vdmVybGF5Jyk7XG4gIHRyYXBGb2N1cygnbWFzdGVyLWF3YXJkLW1vZGFsLW92ZXJsYXknKTtcbn1cblxuZnVuY3Rpb24gY2xvc2VBd2FyZE1vZGFsKCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWF3YXJkLW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICByZXN0b3JlRm9jdXMoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZU1hc3RlckF3YXJkKCkge1xuICBjb25zdCBpZHggICA9IHBhcnNlSW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhd2FyZC1tb2RhbC1pZHgnKS52YWx1ZSwgMTApO1xuICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhd2FyZC10aXRsZS1pbnB1dCcpLnZhbHVlLnRyaW0oKTtcbiAgaWYgKCF0aXRsZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI2QTBcdUZFMEYgVmFsaWRhdGlvbicsICdBd2FyZCB0aXRsZSBpcyByZXF1aXJlZC4nKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgYWN0aW9uID0gaWR4ID49IDAgPyAndXBkYXRlJyA6ICdhZGQnO1xuICBjb25zdCByZWxldmFudFJhdyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhd2FyZC1yZWxldmFudC1pbnB1dCcpLnZhbHVlO1xuICBjb25zdCBib2R5ID0ge1xuICAgIGFjdGlvbiwgdGl0bGUsXG4gICAgeWVhcjogICAgICAgICBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXdhcmQteWVhci1pbnB1dCcpLnZhbHVlLCAxMCkgfHwgbnVsbCxcbiAgICBkZXNjcmlwdGlvbjogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhd2FyZC1kZXNjLWlucHV0JykudmFsdWUudHJpbSgpLFxuICAgIHJlbGV2YW50X2ZvcjogcmVsZXZhbnRSYXcuc3BsaXQoJywnKS5tYXAocyA9PiBzLnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pLFxuICAgIC4uLihhY3Rpb24gPT09ICd1cGRhdGUnID8geyBpZHggfSA6IHt9KSxcbiAgfTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvYXdhcmQnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBjbG9zZUF3YXJkTW9kYWwoKTtcbiAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ0F3YXJkcyAmIEhvbm91cnMnLCBkYXRhLmFjdGlvbiB8fCAndXBkYXRlZCcpO1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjcwNSBTYXZlZCcsIGBBd2FyZCBcIiR7dGl0bGV9XCIgJHtkYXRhLmFjdGlvbn0uYCk7XG4gICAgICBhd2FpdCBwb3B1bGF0ZU1hc3RlclRhYigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgZGF0YS5lcnJvciB8fCAnU2F2ZSBmYWlsZWQnKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgJ0ZhaWxlZCB0byBzYXZlIGF3YXJkJyk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlTWFzdGVyQXdhcmQoaWR4LCB0aXRsZSkge1xuICBzaG93Q29uZmlybU1vZGFsKFxuICAgICdcdUQ4M0RcdURERDFcdUZFMEYgRGVsZXRlIEF3YXJkJyxcbiAgICBgRGVsZXRlIFwiJHt0aXRsZX1cIj8gVGhpcyBjYW5ub3QgYmUgdW5kb25lLmAsXG4gICAgYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL2F3YXJkJywge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGFjdGlvbjogJ2RlbGV0ZScsIGlkeCB9KSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICBpZiAoZGF0YS5vaykge1xuICAgICAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ0F3YXJkcyAmIEhvbm91cnMnLCBkYXRhLmFjdGlvbiB8fCAnZGVsZXRlZCcpO1xuICAgICAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3MDUgRGVsZXRlZCcsIGBBd2FyZCByZW1vdmVkLmApO1xuICAgICAgICAgIGF3YWl0IHBvcHVsYXRlTWFzdGVyVGFiKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsIGRhdGEuZXJyb3IgfHwgJ0RlbGV0ZSBmYWlsZWQnKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgJ0ZhaWxlZCB0byBkZWxldGUgYXdhcmQnKTtcbiAgICAgIH1cbiAgICB9XG4gICk7XG59XG5cbi8vIC0tLS0gQ2VydGlmaWNhdGlvbiBDUlVEIGhhbmRsZXJzIC0tLS1cblxuZnVuY3Rpb24gc2hvd0FkZENlcnRpZmljYXRpb25Nb2RhbCgpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NlcnQtbW9kYWwtaWR4JykudmFsdWUgICAgPSAnLTEnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2VydC1uYW1lLWlucHV0JykudmFsdWUgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2VydC1pc3N1ZXItaW5wdXQnKS52YWx1ZSA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2VydC15ZWFyLWlucHV0JykudmFsdWUgICA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWNlcnQtbW9kYWwtdGl0bGUnKS50ZXh0Q29udGVudCA9ICdBZGQgQ2VydGlmaWNhdGlvbic7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItY2VydC1tb2RhbC1vdmVybGF5Jykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgX2ZvY3VzZWRFbGVtZW50QmVmb3JlTW9kYWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBzZXRJbml0aWFsRm9jdXMoJ21hc3Rlci1jZXJ0LW1vZGFsLW92ZXJsYXknKTtcbiAgdHJhcEZvY3VzKCdtYXN0ZXItY2VydC1tb2RhbC1vdmVybGF5Jyk7XG59XG5cbmZ1bmN0aW9uIGVkaXRNYXN0ZXJDZXJ0aWZpY2F0aW9uKGNlcnQsIGlkeCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2VydC1tb2RhbC1pZHgnKS52YWx1ZSAgICA9IGlkeDtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NlcnQtbmFtZS1pbnB1dCcpLnZhbHVlICAgPSBjZXJ0Lm5hbWUgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjZXJ0LWlzc3Vlci1pbnB1dCcpLnZhbHVlID0gY2VydC5pc3N1ZXIgfHwgJyc7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjZXJ0LXllYXItaW5wdXQnKS52YWx1ZSAgID0gY2VydC55ZWFyIHx8ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWNlcnQtbW9kYWwtdGl0bGUnKS50ZXh0Q29udGVudCA9ICdFZGl0IENlcnRpZmljYXRpb24nO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWNlcnQtbW9kYWwtb3ZlcmxheScpLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIF9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgc2V0SW5pdGlhbEZvY3VzKCdtYXN0ZXItY2VydC1tb2RhbC1vdmVybGF5Jyk7XG4gIHRyYXBGb2N1cygnbWFzdGVyLWNlcnQtbW9kYWwtb3ZlcmxheScpO1xufVxuXG5mdW5jdGlvbiBjbG9zZUNlcnRpZmljYXRpb25Nb2RhbCgpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1jZXJ0LW1vZGFsLW92ZXJsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICByZXN0b3JlRm9jdXMoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZU1hc3RlckNlcnRpZmljYXRpb24oKSB7XG4gIGNvbnN0IGlkeCAgPSBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2VydC1tb2RhbC1pZHgnKS52YWx1ZSwgMTApO1xuICBjb25zdCBuYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NlcnQtbmFtZS1pbnB1dCcpLnZhbHVlLnRyaW0oKTtcbiAgaWYgKCFuYW1lKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjZBMFx1RkUwRiBWYWxpZGF0aW9uJywgJ0NlcnRpZmljYXRpb24gbmFtZSBpcyByZXF1aXJlZC4nKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgYWN0aW9uID0gaWR4ID49IDAgPyAndXBkYXRlJyA6ICdhZGQnO1xuICBjb25zdCBib2R5ID0ge1xuICAgIGFjdGlvbiwgbmFtZSxcbiAgICBpc3N1ZXI6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjZXJ0LWlzc3Vlci1pbnB1dCcpLnZhbHVlLnRyaW0oKSxcbiAgICB5ZWFyOiAgIHBhcnNlSW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjZXJ0LXllYXItaW5wdXQnKS52YWx1ZSwgMTApIHx8IG51bGwsXG4gICAgLi4uKGFjdGlvbiA9PT0gJ3VwZGF0ZScgPyB7IGlkeCB9IDoge30pLFxuICB9O1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS9jZXJ0aWZpY2F0aW9uJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LCBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgY2xvc2VDZXJ0aWZpY2F0aW9uTW9kYWwoKTtcbiAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ0NlcnRpZmljYXRpb25zJywgZGF0YS5hY3Rpb24gfHwgJ3VwZGF0ZWQnKTtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3MDUgU2F2ZWQnLCBgQ2VydGlmaWNhdGlvbiBcIiR7bmFtZX1cIiAke2RhdGEuYWN0aW9ufS5gKTtcbiAgICAgIGF3YWl0IHBvcHVsYXRlTWFzdGVyVGFiKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCBkYXRhLmVycm9yIHx8ICdTYXZlIGZhaWxlZCcpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIHNhdmUgY2VydGlmaWNhdGlvbicpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZU1hc3RlckNlcnRpZmljYXRpb24oaWR4LCBuYW1lKSB7XG4gIHNob3dDb25maXJtTW9kYWwoXG4gICAgJ1x1RDgzRFx1REREMVx1RkUwRiBEZWxldGUgQ2VydGlmaWNhdGlvbicsXG4gICAgYERlbGV0ZSBcIiR7bmFtZX1cIj8gVGhpcyBjYW5ub3QgYmUgdW5kb25lLmAsXG4gICAgYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL2NlcnRpZmljYXRpb24nLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgYWN0aW9uOiAnZGVsZXRlJywgaWR4IH0pLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICAgICAgX3NldE1hc3RlckNoYW5nZU5vdGljZSgnQ2VydGlmaWNhdGlvbnMnLCBkYXRhLmFjdGlvbiB8fCAnZGVsZXRlZCcpO1xuICAgICAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3MDUgRGVsZXRlZCcsIGBDZXJ0aWZpY2F0aW9uIHJlbW92ZWQuYCk7XG4gICAgICAgICAgYXdhaXQgcG9wdWxhdGVNYXN0ZXJUYWIoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgZGF0YS5lcnJvciB8fCAnRGVsZXRlIGZhaWxlZCcpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIGRlbGV0ZSBjZXJ0aWZpY2F0aW9uJyk7XG4gICAgICB9XG4gICAgfVxuICApO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgQmFja3VwIEhpc3RvcnkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIG9wZW5CYWNrdXBIaXN0b3J5TW9kYWwoKSB7XG4gIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgb3ZlcmxheS5pZCA9ICdiYWNrdXAtaGlzdG9yeS1vdmVybGF5JztcbiAgb3ZlcmxheS5zdHlsZS5jc3NUZXh0ID0gJ3Bvc2l0aW9uOmZpeGVkO2luc2V0OjA7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLDAuNSk7ei1pbmRleDoxMDAwMDtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7JztcbiAgb3ZlcmxheS5pbm5lckhUTUwgPSBgXG4gICAgPGRpdiByb2xlPVwiZGlhbG9nXCIgYXJpYS1tb2RhbD1cInRydWVcIiBhcmlhLWxhYmVsbGVkYnk9XCJiYWNrdXAtbW9kYWwtdGl0bGVcIlxuICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZmY7Ym9yZGVyLXJhZGl1czoxMHB4O3BhZGRpbmc6MjRweCAyOHB4O21heC13aWR0aDo1NjBweDt3aWR0aDo5NCU7XG4gICAgICAgICAgICAgICAgbWF4LWhlaWdodDo4MHZoO292ZXJmbG93LXk6YXV0bztib3gtc2hhZG93OjAgMjBweCA2MHB4IHJnYmEoMCwwLDAsMC4zKTtcIj5cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO21hcmdpbi1ib3R0b206MTZweDtcIj5cbiAgICAgICAgPGgzIGlkPVwiYmFja3VwLW1vZGFsLXRpdGxlXCIgc3R5bGU9XCJtYXJnaW46MDtmb250LXNpemU6MS4xZW07Y29sb3I6IzFlMjkzYjtcIj5cdUQ4M0RcdURENTAgQmFja3VwIEhpc3Rvcnk8L2gzPlxuICAgICAgICA8YnV0dG9uIGlkPVwiYmFja3VwLW1vZGFsLWNsb3NlXCIgc3R5bGU9XCJiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOm5vbmU7Zm9udC1zaXplOjEuM2VtO2N1cnNvcjpwb2ludGVyO2NvbG9yOiM2NDc0OGI7XCIgYXJpYS1sYWJlbD1cIkNsb3NlXCI+XHUyNzE1PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxwIHN0eWxlPVwiZm9udC1zaXplOjAuODhlbTtjb2xvcjojNjQ3NDhiO21hcmdpbi1ib3R0b206MTZweDtcIj5cbiAgICAgICAgQSBiYWNrdXAgaXMgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IGJlZm9yZSBldmVyeSBzYXZlLiBSZXN0b3Jpbmcgd2lsbCBwcmVzZXJ2ZSB0aGUgY3VycmVudCB2ZXJzaW9uIGFzIGEgbmV3IGJhY2t1cCBmaXJzdC5cbiAgICAgIDwvcD5cbiAgICAgIDxkaXYgaWQ9XCJiYWNrdXAtbGlzdC1ib2R5XCIgc3R5bGU9XCJmb250LXNpemU6MC45ZW07XCI+TG9hZGluZ1x1MjAyNjwvZGl2PlxuICAgIDwvZGl2PmA7XG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQob3ZlcmxheSk7XG4gIGlmICh0eXBlb2YgdHJhcEZvY3VzID09PSAnZnVuY3Rpb24nKSB0cmFwRm9jdXMoJ2JhY2t1cC1oaXN0b3J5LW92ZXJsYXknKTtcbiAgY29uc3QgY2xvc2UgPSAoKSA9PiB7IG92ZXJsYXkucmVtb3ZlKCk7IGlmICh0eXBlb2YgcmVzdG9yZUZvY3VzID09PSAnZnVuY3Rpb24nKSByZXN0b3JlRm9jdXMoKTsgfTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhY2t1cC1tb2RhbC1jbG9zZScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xvc2UpO1xuICBvdmVybGF5LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZSA9PiB7IGlmIChlLnRhcmdldCA9PT0gb3ZlcmxheSkgY2xvc2UoKTsgfSk7XG4gIG92ZXJsYXkuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGUgPT4geyBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSBjbG9zZSgpOyB9KTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL2hpc3RvcnknKTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBjb25zdCBib2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhY2t1cC1saXN0LWJvZHknKTtcbiAgICBpZiAoIWJvZHkpIHJldHVybjtcbiAgICBpZiAoIWRhdGEub2sgfHwgIWRhdGEuc25hcHNob3RzPy5sZW5ndGgpIHtcbiAgICAgIGJvZHkudGV4dENvbnRlbnQgPSAnTm8gYmFja3VwcyBmb3VuZC4nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByb3dzID0gZGF0YS5zbmFwc2hvdHMubWFwKHMgPT4ge1xuICAgICAgY29uc3QgZHQgPSBuZXcgRGF0ZShzLm10aW1lICogMTAwMCkudG9Mb2NhbGVTdHJpbmcoKTtcbiAgICAgIGNvbnN0IGtiID0gKHMuc2l6ZSAvIDEwMjQpLnRvRml4ZWQoMSk7XG4gICAgICByZXR1cm4gYDx0cj5cbiAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzo2cHggOHB4O2NvbG9yOiMxZTI5M2I7XCI+JHtlc2NhcGVIdG1sKGR0KX08L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOjZweCA4cHg7Y29sb3I6IzY0NzQ4Yjt3aGl0ZS1zcGFjZTpub3dyYXA7XCI+JHtrYn0gS0I8L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOjZweCA4cHg7XCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG4gc2Vjb25kYXJ5XCIgc3R5bGU9XCJwYWRkaW5nOjNweCAxMHB4O2ZvbnQtc2l6ZTowLjgyZW07XCJcbiAgICAgICAgICAgIG9uY2xpY2s9XCJyZXN0b3JlQmFja3VwKCR7SlNPTi5zdHJpbmdpZnkocy5maWxlbmFtZSl9KVwiPlJlc3RvcmU8L2J1dHRvbj5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvdHI+YDtcbiAgICB9KS5qb2luKCcnKTtcbiAgICBib2R5LmlubmVySFRNTCA9IGA8dGFibGUgc3R5bGU9XCJ3aWR0aDoxMDAlO2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTtcIj5cbiAgICAgIDx0aGVhZD48dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZTJlOGYwO1wiPlxuICAgICAgICA8dGggc3R5bGU9XCJwYWRkaW5nOjRweCA4cHg7dGV4dC1hbGlnbjpsZWZ0O2NvbG9yOiM0NzU1Njk7Zm9udC13ZWlnaHQ6NjAwO1wiPlNhdmVkPC90aD5cbiAgICAgICAgPHRoIHN0eWxlPVwicGFkZGluZzo0cHggOHB4O3RleHQtYWxpZ246bGVmdDtjb2xvcjojNDc1NTY5O2ZvbnQtd2VpZ2h0OjYwMDtcIj5TaXplPC90aD5cbiAgICAgICAgPHRoPjwvdGg+XG4gICAgICA8L3RyPjwvdGhlYWQ+XG4gICAgICA8dGJvZHk+JHtyb3dzfTwvdGJvZHk+XG4gICAgPC90YWJsZT5gO1xuICB9IGNhdGNoIChfKSB7XG4gICAgY29uc3QgYm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYWNrdXAtbGlzdC1ib2R5Jyk7XG4gICAgaWYgKGJvZHkpIGJvZHkudGV4dENvbnRlbnQgPSAnRmFpbGVkIHRvIGxvYWQgYmFja3VwIGhpc3RvcnkuJztcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZXN0b3JlQmFja3VwKGZpbGVuYW1lKSB7XG4gIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0ICh0eXBlb2YgY29uZmlybURpYWxvZyA9PT0gJ2Z1bmN0aW9uJ1xuICAgID8gY29uZmlybURpYWxvZygnUmVzdG9yZSB0aGlzIGJhY2t1cD8gVGhlIGN1cnJlbnQgdmVyc2lvbiB3aWxsIGJlIHNhdmVkIGFzIGEgbmV3IGJhY2t1cCBmaXJzdC4nKVxuICAgIDogUHJvbWlzZS5yZXNvbHZlKHdpbmRvdy5jb25maXJtKCdSZXN0b3JlIHRoaXMgYmFja3VwPyBUaGUgY3VycmVudCB2ZXJzaW9uIHdpbGwgYmUgc2F2ZWQgYXMgYSBuZXcgYmFja3VwIGZpcnN0LicpKSk7XG4gIGlmICghY29uZmlybWVkKSByZXR1cm47XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvcmVzdG9yZScsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGZpbGVuYW1lIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja3VwLWhpc3Rvcnktb3ZlcmxheScpPy5yZW1vdmUoKTtcbiAgICAgIGlmICh0eXBlb2YgcmVzdG9yZUZvY3VzID09PSAnZnVuY3Rpb24nKSByZXN0b3JlRm9jdXMoKTtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3MDUgUmVzdG9yZWQnLCAnTWFzdGVyIENWIHJlc3RvcmVkIGZyb20gYmFja3VwLiBSZWxvYWQgdGhlIHRhYiB0byBzZWUgdGhlIHVwZGF0ZWQgZGF0YS4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsIGRhdGEuZXJyb3IgfHwgJ1Jlc3RvcmUgZmFpbGVkLicpO1xuICAgIH1cbiAgfSBjYXRjaCAoXykge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIHJlc3RvcmUgYmFja3VwLicpO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBVbmRvIC8gUmVkbyAoR0FQLTE5IDE2LjcpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuLy8gU2luZ2xlLWxldmVsOiBVbmRvIHJlc3RvcmVzIHRoZSBtb3N0IHJlY2VudCBiYWNrdXAgc25hcHNob3QgKGkuZS4gdGhlXG4vLyBzdGF0ZSBiZWZvcmUgdGhlIGxhc3Qgc2F2ZSk7IFJlZG8gcmVzdG9yZXMgdGhlIHNhZmV0eSBiYWNrdXAgdGhlIHJlc3RvcmVcbi8vIGVuZHBvaW50IHRvb2sgb2YgdGhlIHByZS11bmRvIHN0YXRlLiBCb3RoIHJldXNlIHRoZSBleGlzdGluZ1xuLy8gL2FwaS9tYXN0ZXItZGF0YS9oaXN0b3J5ICsgL2FwaS9tYXN0ZXItZGF0YS9yZXN0b3JlIGVuZHBvaW50cyByYXRoZXIgdGhhblxuLy8gYWRkaW5nIG5ldyBiYWNrZW5kIHN1cmZhY2UgXHUyMDE0IHNlZSBfbWFzdGVyQ3ZSZWRvQmFja3VwIGFib3ZlIGZvciB0aGUgcmVzZXRcbi8vIGNvbnRyYWN0IHdpdGggcG9wdWxhdGVNYXN0ZXJUYWIoKS5cblxuYXN5bmMgZnVuY3Rpb24gdW5kb01hc3RlckRhdGFDaGFuZ2UoKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFzdGVyLWRhdGEvaGlzdG9yeScpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmICghZGF0YS5vayB8fCAhZGF0YS5zbmFwc2hvdHM/Lmxlbmd0aCkge1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjEzOVx1RkUwRiBOb3RoaW5nIHRvIHVuZG8nLCAnTm8gYmFja3VwIHNuYXBzaG90cyBhcmUgYXZhaWxhYmxlIHlldC4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbW9zdFJlY2VudCA9IGRhdGEuc25hcHNob3RzWzBdOyAvLyBoaXN0b3J5IHJvdXRlIHJldHVybnMgbmV3ZXN0LWZpcnN0XG4gICAgY29uc3Qgd2hlbiA9IG5ldyBEYXRlKG1vc3RSZWNlbnQubXRpbWUgKiAxMDAwKS50b0xvY2FsZVN0cmluZygpO1xuICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0ICh0eXBlb2YgY29uZmlybURpYWxvZyA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgPyBjb25maXJtRGlhbG9nKGBVbmRvIHRoZSBtb3N0IHJlY2VudCBjaGFuZ2U/IFRoaXMgcmVzdG9yZXMgdGhlIHZlcnNpb24gc2F2ZWQgJHt3aGVufS4gVGhlIGN1cnJlbnQgdmVyc2lvbiB3aWxsIGJlIHNhdmVkIGFzIGEgbmV3IGJhY2t1cCBmaXJzdC5gKVxuICAgICAgOiBQcm9taXNlLnJlc29sdmUod2luZG93LmNvbmZpcm0oYFVuZG8gdGhlIG1vc3QgcmVjZW50IGNoYW5nZT8gVGhpcyByZXN0b3JlcyB0aGUgdmVyc2lvbiBzYXZlZCAke3doZW59LmApKSk7XG4gICAgaWYgKCFjb25maXJtZWQpIHJldHVybjtcblxuICAgIGNvbnN0IHJlc3RvcmVSZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS9yZXN0b3JlJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgZmlsZW5hbWU6IG1vc3RSZWNlbnQuZmlsZW5hbWUgfSksXG4gICAgfSk7XG4gICAgY29uc3QgcmVzdG9yZURhdGEgPSBhd2FpdCByZXN0b3JlUmVzLmpzb24oKTtcbiAgICBpZiAocmVzdG9yZURhdGEub2spIHtcbiAgICAgIC8vIE11c3QgYmUgc2V0ICpiZWZvcmUqIHBvcHVsYXRlTWFzdGVyVGFiKCkgcmVuZGVycyB0aGUgUmVkbyBidXR0b24sXG4gICAgICAvLyBub3QgYWZ0ZXIgXHUyMDE0IHRoZSBidXR0b24ncyBkaXNhYmxlZCBzdGF0ZSBpcyBiYWtlZCBpbnRvIHRoYXQgcmVuZGVyLlxuICAgICAgX21hc3RlckN2UmVkb0JhY2t1cCA9IHJlc3RvcmVEYXRhLnNhZmV0eV9iYWNrdXAgfHwgbnVsbDtcbiAgICAgIF9tYXN0ZXJDdlN1cHByZXNzUmVkb1Jlc2V0ID0gdHJ1ZTtcbiAgICAgIGF3YWl0IHBvcHVsYXRlTWFzdGVyVGFiKCk7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzA1IFVuZG9uZScsICdNYXN0ZXIgQ1YgcmV2ZXJ0ZWQgdG8gdGhlIHByZXZpb3VzIHNhdmVkIHZlcnNpb24uJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCByZXN0b3JlRGF0YS5lcnJvciB8fCAnVW5kbyBmYWlsZWQuJyk7XG4gICAgfVxuICB9IGNhdGNoIChfKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsICdGYWlsZWQgdG8gdW5kby4nKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZWRvTWFzdGVyRGF0YUNoYW5nZSgpIHtcbiAgaWYgKCFfbWFzdGVyQ3ZSZWRvQmFja3VwKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjEzOVx1RkUwRiBOb3RoaW5nIHRvIHJlZG8nLCAnVGhlcmUgaXMgbm8gdW5kb25lIGNoYW5nZSB0byByZXN0b3JlLicpO1xuICAgIHJldHVybjtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL3Jlc3RvcmUnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBmaWxlbmFtZTogX21hc3RlckN2UmVkb0JhY2t1cCB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgLy8gRGVsaWJlcmF0ZWx5IGRvIG5vdCByZS1hcm0gcmVkbyBcdTIwMTQgdGhpcyByZXN0b3JlIGNvbnN1bWVzIHRoZSByZWRvXG4gICAgICAvLyB0YXJnZXQsIGFuZCBwb3B1bGF0ZU1hc3RlclRhYigpJ3MgZGVmYXVsdCByZXNldCBjbGVhcnMgaXQuXG4gICAgICBhd2FpdCBwb3B1bGF0ZU1hc3RlclRhYigpO1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjcwNSBSZWRvbmUnLCAnTWFzdGVyIENWIHJlc3RvcmVkIHRvIHRoZSB2ZXJzaW9uIGJlZm9yZSB0aGUgdW5kby4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsIGRhdGEuZXJyb3IgfHwgJ1JlZG8gZmFpbGVkLicpO1xuICAgIH1cbiAgfSBjYXRjaCAoXykge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIHJlZG8uJyk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZXhwb3J0TWFzdGVyQ1YoKSB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2Vzc2lvbklkID0gd2luZG93Ll9jdXJyZW50U2Vzc2lvbklkO1xuICAgIGNvbnN0IHVybCA9IGAvYXBpL21hc3Rlci1kYXRhL2V4cG9ydCR7c2Vzc2lvbklkID8gYD9zZXNzaW9uX2lkPSR7c2Vzc2lvbklkfWAgOiAnJ31gO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgaWYgKCFyZXMub2spIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRXhwb3J0IGZhaWxlZCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBibG9iID0gYXdhaXQgcmVzLmJsb2IoKTtcbiAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgIGEuaHJlZiA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgYS5kb3dubG9hZCA9ICdNYXN0ZXJfQ1ZfRGF0YS5qc29uJztcbiAgICBhLmNsaWNrKCk7XG4gICAgVVJMLnJldm9rZU9iamVjdFVSTChhLmhyZWYpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsICdGYWlsZWQgdG8gZXhwb3J0IG1hc3RlciBDVicpO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBGdWxsIGRhdGEgcHJldmlldyAoR0FQLTE5IDE2LjE1KSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gb3BlbkZ1bGxEYXRhUHJldmlld01vZGFsKCkge1xuICBjb25zdCBvdmVybGF5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIG92ZXJsYXkuaWQgPSAnbWFzdGVyLWN2LXByZXZpZXctb3ZlcmxheSc7XG4gIG92ZXJsYXkuc3R5bGUuY3NzVGV4dCA9ICdwb3NpdGlvbjpmaXhlZDtpbnNldDowO2JhY2tncm91bmQ6cmdiYSgwLDAsMCwwLjUpO3otaW5kZXg6MTAwMDA7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyOyc7XG4gIG92ZXJsYXkuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgcm9sZT1cImRpYWxvZ1wiIGFyaWEtbW9kYWw9XCJ0cnVlXCIgYXJpYS1sYWJlbGxlZGJ5PVwibWFzdGVyLWN2LXByZXZpZXctdGl0bGVcIlxuICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZmY7Ym9yZGVyLXJhZGl1czoxMHB4O3BhZGRpbmc6MjRweCAyOHB4O21heC13aWR0aDo3NjBweDt3aWR0aDo5NCU7XG4gICAgICAgICAgICAgICAgbWF4LWhlaWdodDo4NXZoO292ZXJmbG93LXk6YXV0bztib3gtc2hhZG93OjAgMjBweCA2MHB4IHJnYmEoMCwwLDAsMC4zKTtcIj5cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO21hcmdpbi1ib3R0b206MTZweDtcIj5cbiAgICAgICAgPGgzIGlkPVwibWFzdGVyLWN2LXByZXZpZXctdGl0bGVcIiBzdHlsZT1cIm1hcmdpbjowO2ZvbnQtc2l6ZToxLjFlbTtjb2xvcjojMWUyOTNiO1wiPlx1RDgzRFx1REM0MSBGdWxsIE1hc3RlciBDViBEYXRhIChyZWFkLW9ubHkpPC9oMz5cbiAgICAgICAgPGJ1dHRvbiBpZD1cIm1hc3Rlci1jdi1wcmV2aWV3LWNsb3NlXCIgc3R5bGU9XCJiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOm5vbmU7Zm9udC1zaXplOjEuM2VtO2N1cnNvcjpwb2ludGVyO2NvbG9yOiM2NDc0OGI7XCIgYXJpYS1sYWJlbD1cIkNsb3NlXCI+XHUyNzE1PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxwIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtjb2xvcjojNjQ3NDhiO21hcmdpbi1ib3R0b206MTJweDtcIj5cbiAgICAgICAgVGhlIGNvbXBsZXRlLCB1bmZpbHRlcmVkIGNvbnRlbnRzIG9mIDxjb2RlPk1hc3Rlcl9DVl9EYXRhLmpzb248L2NvZGU+IFx1MjAxNCBpbmNsdWRpbmcgYW55IGZpZWxkcyB0aGUgc3RydWN0dXJlZCBlZGl0b3JzIGFib3ZlIGRvbid0IHN1cmZhY2UuXG4gICAgICA8L3A+XG4gICAgICA8cHJlIGlkPVwibWFzdGVyLWN2LXByZXZpZXctYm9keVwiIHN0eWxlPVwiYmFja2dyb3VuZDojZjhmYWZjO2JvcmRlcjoxcHggc29saWQgI2UyZThmMDtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjEycHg7Zm9udC1zaXplOjAuOGVtO2xpbmUtaGVpZ2h0OjEuNTt3aGl0ZS1zcGFjZTpwcmUtd3JhcDt3b3JkLWJyZWFrOmJyZWFrLXdvcmQ7XCI+TG9hZGluZ1x1MjAyNjwvcHJlPlxuICAgIDwvZGl2PmA7XG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQob3ZlcmxheSk7XG4gIGlmICh0eXBlb2YgdHJhcEZvY3VzID09PSAnZnVuY3Rpb24nKSB0cmFwRm9jdXMoJ21hc3Rlci1jdi1wcmV2aWV3LW92ZXJsYXknKTtcbiAgY29uc3QgY2xvc2UgPSAoKSA9PiB7IG92ZXJsYXkucmVtb3ZlKCk7IGlmICh0eXBlb2YgcmVzdG9yZUZvY3VzID09PSAnZnVuY3Rpb24nKSByZXN0b3JlRm9jdXMoKTsgfTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1jdi1wcmV2aWV3LWNsb3NlJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjbG9zZSk7XG4gIG92ZXJsYXkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4geyBpZiAoZS50YXJnZXQgPT09IG92ZXJsYXkpIGNsb3NlKCk7IH0pO1xuICBvdmVybGF5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4geyBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSBjbG9zZSgpOyB9KTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL2Z1bGwnKTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBjb25zdCBib2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1jdi1wcmV2aWV3LWJvZHknKTtcbiAgICBpZiAoYm9keSkgYm9keS50ZXh0Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsIDIpO1xuICB9IGNhdGNoIChfKSB7XG4gICAgY29uc3QgYm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItY3YtcHJldmlldy1ib2R5Jyk7XG4gICAgaWYgKGJvZHkpIGJvZHkudGV4dENvbnRlbnQgPSAnRmFpbGVkIHRvIGxvYWQgbWFzdGVyIENWIGRhdGEuJztcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgRnVsbC1maWxlIEpTT04gaW1wb3J0IHdpdGggZGlmZiByZXZpZXcgKEdBUC0xOSAxNi4xNikgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4vL1xuLy8gTm90IGEgbWVyZ2U6IGltcG9ydC1jb25maXJtIHJlcGxhY2VzIHRoZSBlbnRpcmUgZmlsZS4gVGhlIGltcG9ydC1wcmV2aWV3XG4vLyBzdGVwJ3Mgc2VjdGlvbi1sZXZlbCBjaGFuZ2VkL2NvdW50IHN1bW1hcnkgaXMgdGhlIHVzZXIncyBjaGFuY2UgdG8gY2F0Y2hcbi8vIGFuIHVuaW50ZW5kZWQgb3ZlcndyaXRlIGJlZm9yZSBjb25maXJtaW5nIFx1MjAxNCBmdWxsIGZpZWxkLWxldmVsIGRpZmZpbmdcbi8vIHdpdGhpbiBhIGNoYW5nZWQgc2VjdGlvbiBpcyBhIGtub3duIHYxIGxpbWl0YXRpb24gKHRoZSBzYW1lIHBvc3R1cmVcbi8vIGFscmVhZHkgYWNjZXB0ZWQgZm9yIG90aGVyIGFkdmlzb3J5LW9ubHkgcmV2aWV3IHN1cmZhY2VzIGluIHRoaXMgdGFiKS5cblxubGV0IF9tYXN0ZXJDdkltcG9ydERhdGEgPSBudWxsO1xuXG5mdW5jdGlvbiB0cmlnZ2VyTWFzdGVyQ3ZJbXBvcnQoKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItY3YtaW1wb3J0LWZpbGUtaW5wdXQnKT8uY2xpY2soKTtcbn1cblxuZnVuY3Rpb24gaGFuZGxlTWFzdGVyQ3ZJbXBvcnRGaWxlKGV2ZW50KSB7XG4gIGNvbnN0IGZpbGUgPSBldmVudC50YXJnZXQ/LmZpbGVzPy5bMF07XG4gIGV2ZW50LnRhcmdldC52YWx1ZSA9ICcnOyAvLyBhbGxvdyByZS1zZWxlY3RpbmcgdGhlIHNhbWUgZmlsZW5hbWUgbGF0ZXJcbiAgaWYgKCFmaWxlKSByZXR1cm47XG4gIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gIHJlYWRlci5vbmxvYWQgPSBhc3luYyAoKSA9PiB7XG4gICAgbGV0IHBhcnNlZDtcbiAgICB0cnkge1xuICAgICAgcGFyc2VkID0gSlNPTi5wYXJzZShTdHJpbmcocmVhZGVyLnJlc3VsdCkpO1xuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnVGhhdCBmaWxlIGlzIG5vdCB2YWxpZCBKU09OLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXBhcnNlZCB8fCB0eXBlb2YgcGFyc2VkICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHBhcnNlZCkpIHtcbiAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRXhwZWN0ZWQgYSBKU09OIG9iamVjdCAoTWFzdGVyX0NWX0RhdGEuanNvbiBzaGFwZSksIG5vdCBhbiBhcnJheSBvciBzY2FsYXIuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IF9zdWJtaXRNYXN0ZXJDdkltcG9ydFByZXZpZXcocGFyc2VkKTtcbiAgfTtcbiAgcmVhZGVyLm9uZXJyb3IgPSAoKSA9PiBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgJ0ZhaWxlZCB0byByZWFkIHRoZSBzZWxlY3RlZCBmaWxlLicpO1xuICByZWFkZXIucmVhZEFzVGV4dChmaWxlKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gX3N1Ym1pdE1hc3RlckN2SW1wb3J0UHJldmlldyhwYXJzZWQpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS9pbXBvcnQtcHJldmlldycsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgZGF0YTogcGFyc2VkIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmICghZGF0YS5vaykge1xuICAgICAgY29uc3QgZGV0YWlsID0gKGRhdGEudmFsaWRhdGlvbl9lcnJvcnMgfHwgW10pLmpvaW4oJzsgJyk7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgZGV0YWlsID8gYCR7ZGF0YS5lcnJvcn06ICR7ZGV0YWlsfWAgOiAoZGF0YS5lcnJvciB8fCAnSW1wb3J0IHByZXZpZXcgZmFpbGVkLicpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgX21hc3RlckN2SW1wb3J0RGF0YSA9IHBhcnNlZDtcbiAgICBfc2hvd01hc3RlckN2SW1wb3J0UHJldmlld01vZGFsKGRhdGEuc2VjdGlvbnMgfHwgW10pO1xuICB9IGNhdGNoIChfKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsICdGYWlsZWQgdG8gcHJldmlldyB0aGUgaW1wb3J0LicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9zaG93TWFzdGVyQ3ZJbXBvcnRQcmV2aWV3TW9kYWwoc2VjdGlvbnMpIHtcbiAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBvdmVybGF5LmlkID0gJ21hc3Rlci1jdi1pbXBvcnQtb3ZlcmxheSc7XG4gIG92ZXJsYXkuc3R5bGUuY3NzVGV4dCA9ICdwb3NpdGlvbjpmaXhlZDtpbnNldDowO2JhY2tncm91bmQ6cmdiYSgwLDAsMCwwLjUpO3otaW5kZXg6MTAwMDA7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyOyc7XG4gIGNvbnN0IGNoYW5nZWRTZWN0aW9ucyA9IHNlY3Rpb25zLmZpbHRlcigocykgPT4gcy5jaGFuZ2VkKTtcbiAgY29uc3Qgcm93cyA9IHNlY3Rpb25zLm1hcCgocykgPT4gYFxuICAgIDx0ciBzdHlsZT1cIiR7cy5jaGFuZ2VkID8gJ2JhY2tncm91bmQ6dmFyKC0tY3Ytd2Fybi1iZywgI2ZmZmJlYik7JyA6ICcnfVwiPlxuICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzo2cHggOHB4O2NvbG9yOiMxZTI5M2I7XCI+JHtlc2NhcGVIdG1sKHMuc2VjdGlvbil9PC90ZD5cbiAgICAgIDx0ZCBzdHlsZT1cInBhZGRpbmc6NnB4IDhweDt0ZXh0LWFsaWduOmNlbnRlcjtjb2xvcjojNjQ3NDhiO1wiPiR7cy5jdXJyZW50X2NvdW50fTwvdGQ+XG4gICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOjZweCA4cHg7dGV4dC1hbGlnbjpjZW50ZXI7Y29sb3I6IzY0NzQ4YjtcIj4ke3MubmV3X2NvdW50fTwvdGQ+XG4gICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOjZweCA4cHg7XCI+JHtzLmNoYW5nZWQgPyAnXHUyNkEwIGNoYW5nZWQnIDogJ1x1MjAxNCd9PC90ZD5cbiAgICA8L3RyPmApLmpvaW4oJycpO1xuICBvdmVybGF5LmlubmVySFRNTCA9IGBcbiAgICA8ZGl2IHJvbGU9XCJkaWFsb2dcIiBhcmlhLW1vZGFsPVwidHJ1ZVwiIGFyaWEtbGFiZWxsZWRieT1cIm1hc3Rlci1jdi1pbXBvcnQtdGl0bGVcIlxuICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZmY7Ym9yZGVyLXJhZGl1czoxMHB4O3BhZGRpbmc6MjRweCAyOHB4O21heC13aWR0aDo2NDBweDt3aWR0aDo5NCU7XG4gICAgICAgICAgICAgICAgbWF4LWhlaWdodDo4NXZoO292ZXJmbG93LXk6YXV0bztib3gtc2hhZG93OjAgMjBweCA2MHB4IHJnYmEoMCwwLDAsMC4zKTtcIj5cbiAgICAgIDxoMyBpZD1cIm1hc3Rlci1jdi1pbXBvcnQtdGl0bGVcIiBzdHlsZT1cIm1hcmdpbjowIDAgMTJweDtmb250LXNpemU6MS4xZW07Y29sb3I6IzFlMjkzYjtcIj5cdTJCMDZcdUZFMEYgSW1wb3J0IE1hc3RlciBDViBEYXRhIFx1MjAxNCBSZXZpZXc8L2gzPlxuICAgICAgPGRpdiByb2xlPVwiYWxlcnRcIiBzdHlsZT1cImJhY2tncm91bmQ6I2ZlZjJmMjtib3JkZXI6MXB4IHNvbGlkICNmY2E1YTU7Ym9yZGVyLXJhZGl1czo2cHg7cGFkZGluZzoxMHB4IDE0cHg7bWFyZ2luLWJvdHRvbToxNHB4O2ZvbnQtc2l6ZTowLjg2ZW07Y29sb3I6Izk5MWIxYjtcIj5cbiAgICAgICAgPHN0cm9uZz5UaGlzIHJlcGxhY2VzIHRoZSBlbnRpcmUgZmlsZTwvc3Ryb25nPiwgbm90IGp1c3QgdGhlIGNoYW5nZWQgc2VjdGlvbnMuIEEgYmFja3VwIGlzIGNyZWF0ZWRcbiAgICAgICAgYXV0b21hdGljYWxseSBiZWZvcmUgdGhlIHdyaXRlIFx1MjAxNCBzZWUgXHVEODNEXHVERDUwIEJhY2t1cHMgYWJvdmUgdG8gcmVzdG9yZSBpdCBpZiBuZWVkZWQuXG4gICAgICA8L2Rpdj5cbiAgICAgIDxwIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtjb2xvcjojNjQ3NDhiO21hcmdpbi1ib3R0b206OHB4O1wiPlxuICAgICAgICAke2NoYW5nZWRTZWN0aW9ucy5sZW5ndGggPyBgJHtjaGFuZ2VkU2VjdGlvbnMubGVuZ3RofSBzZWN0aW9uKHMpIHdvdWxkIGNoYW5nZTpgIDogJ05vIHNlY3Rpb25zIHdvdWxkIGNoYW5nZSBcdTIwMTQgdGhlIHVwbG9hZGVkIGZpbGUgbWF0Y2hlcyB0aGUgY3VycmVudCBkYXRhLid9XG4gICAgICA8L3A+XG4gICAgICA8dGFibGUgc3R5bGU9XCJ3aWR0aDoxMDAlO2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTtmb250LXNpemU6MC44NWVtO21hcmdpbi1ib3R0b206MTZweDtcIj5cbiAgICAgICAgPHRoZWFkPjx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206MXB4IHNvbGlkICNlMmU4ZjA7XCI+XG4gICAgICAgICAgPHRoIHN0eWxlPVwicGFkZGluZzo0cHggOHB4O3RleHQtYWxpZ246bGVmdDtjb2xvcjojNDc1NTY5O1wiPlNlY3Rpb248L3RoPlxuICAgICAgICAgIDx0aCBzdHlsZT1cInBhZGRpbmc6NHB4IDhweDtjb2xvcjojNDc1NTY5O1wiPkN1cnJlbnQ8L3RoPlxuICAgICAgICAgIDx0aCBzdHlsZT1cInBhZGRpbmc6NHB4IDhweDtjb2xvcjojNDc1NTY5O1wiPk5ldzwvdGg+XG4gICAgICAgICAgPHRoIHN0eWxlPVwicGFkZGluZzo0cHggOHB4O3RleHQtYWxpZ246bGVmdDtjb2xvcjojNDc1NTY5O1wiPjwvdGg+XG4gICAgICAgIDwvdHI+PC90aGVhZD5cbiAgICAgICAgPHRib2R5PiR7cm93c308L3Rib2R5PlxuICAgICAgPC90YWJsZT5cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kO2dhcDo4cHg7XCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgaWQ9XCJtYXN0ZXItY3YtaW1wb3J0LWNhbmNlbFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBwcmltYXJ5XCIgaWQ9XCJtYXN0ZXItY3YtaW1wb3J0LWNvbmZpcm1cIiR7Y2hhbmdlZFNlY3Rpb25zLmxlbmd0aCA/ICcnIDogJyBkaXNhYmxlZCd9PkNvbmZpcm0gSW1wb3J0PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG92ZXJsYXkpO1xuICBpZiAodHlwZW9mIHRyYXBGb2N1cyA9PT0gJ2Z1bmN0aW9uJykgdHJhcEZvY3VzKCdtYXN0ZXItY3YtaW1wb3J0LW92ZXJsYXknKTtcbiAgY29uc3QgY2xvc2UgPSAoKSA9PiB7IG92ZXJsYXkucmVtb3ZlKCk7IF9tYXN0ZXJDdkltcG9ydERhdGEgPSBudWxsOyBpZiAodHlwZW9mIHJlc3RvcmVGb2N1cyA9PT0gJ2Z1bmN0aW9uJykgcmVzdG9yZUZvY3VzKCk7IH07XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItY3YtaW1wb3J0LWNhbmNlbCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xvc2UpO1xuICBvdmVybGF5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4geyBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSBjbG9zZSgpOyB9KTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1jdi1pbXBvcnQtY29uZmlybScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gY29uZmlybU1hc3RlckN2SW1wb3J0KCkpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb25maXJtTWFzdGVyQ3ZJbXBvcnQoKSB7XG4gIGlmICghX21hc3RlckN2SW1wb3J0RGF0YSkgcmV0dXJuO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL2ltcG9ydC1jb25maXJtJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBkYXRhOiBfbWFzdGVyQ3ZJbXBvcnREYXRhIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItY3YtaW1wb3J0LW92ZXJsYXknKT8ucmVtb3ZlKCk7XG4gICAgX21hc3RlckN2SW1wb3J0RGF0YSA9IG51bGw7XG4gICAgaWYgKHR5cGVvZiByZXN0b3JlRm9jdXMgPT09ICdmdW5jdGlvbicpIHJlc3RvcmVGb2N1cygpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBfc2V0TWFzdGVyQ2hhbmdlTm90aWNlKCdNYXN0ZXIgQ1YgRGF0YScsICdpbXBvcnRlZCcpO1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoXG4gICAgICAgICdcdTI3MDUgSW1wb3J0ZWQnLFxuICAgICAgICBgTWFzdGVyIENWIGRhdGEgcmVwbGFjZWQuJHtkYXRhLmNvbW1pdF9oYXNoID8gYCBDb21taXQ6ICR7ZGF0YS5jb21taXRfaGFzaC5zbGljZSgwLCAxMCl9LmAgOiAnJ30ke2RhdGEuZ2l0X2Vycm9yID8gYCAoZ2l0IHdhcm5pbmc6ICR7ZGF0YS5naXRfZXJyb3J9KWAgOiAnJ31gXG4gICAgICApO1xuICAgICAgYXdhaXQgcG9wdWxhdGVNYXN0ZXJUYWIoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZGV0YWlsID0gKGRhdGEudmFsaWRhdGlvbl9lcnJvcnMgfHwgW10pLmpvaW4oJzsgJyk7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgZGV0YWlsID8gYCR7ZGF0YS5lcnJvcn06ICR7ZGV0YWlsfWAgOiAoZGF0YS5lcnJvciB8fCAnSW1wb3J0IGZhaWxlZC4nKSk7XG4gICAgfVxuICB9IGNhdGNoIChfKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsICdGYWlsZWQgdG8gaW1wb3J0IG1hc3RlciBDViBkYXRhLicpO1xuICB9XG59XG5cbi8vIC0tLS0gQWNoaWV2ZW1lbnQvU3VtbWFyeSBkZWxldGUgaGFuZGxlcnMgLS0tLVxuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVNYXN0ZXJBY2hpZXZlbWVudChpZCwgdGl0bGUpIHtcbiAgc2hvd0NvbmZpcm1Nb2RhbChcbiAgICAnXHVEODNEXHVEREQxXHVGRTBGIERlbGV0ZSBBY2hpZXZlbWVudCcsXG4gICAgYERlbGV0ZSBcIiR7dGl0bGV9XCI/IFRoaXMgY2Fubm90IGJlIHVuZG9uZS5gLFxuICAgIGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYXN0ZXItZGF0YS91cGRhdGUtYWNoaWV2ZW1lbnQnLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgYWN0aW9uOiAnZGVsZXRlJywgaWQgfSksXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgaWYgKGRhdGEub2spIHtcbiAgICAgICAgICBfc2V0TWFzdGVyQ2hhbmdlTm90aWNlKCdTZWxlY3RlZCBBY2hpZXZlbWVudHMnLCBkYXRhLmFjdGlvbiB8fCAnZGVsZXRlZCcpO1xuICAgICAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3MDUgRGVsZXRlZCcsIGBBY2hpZXZlbWVudCByZW1vdmVkLmApO1xuICAgICAgICAgIGF3YWl0IHBvcHVsYXRlTWFzdGVyVGFiKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsIGRhdGEuZXJyb3IgfHwgJ0RlbGV0ZSBmYWlsZWQnKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEVycm9yJywgJ0ZhaWxlZCB0byBkZWxldGUgYWNoaWV2ZW1lbnQnKTtcbiAgICAgIH1cbiAgICB9XG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZU1hc3RlclN1bW1hcnkoa2V5KSB7XG4gIHNob3dDb25maXJtTW9kYWwoXG4gICAgJ1x1RDgzRFx1REREMVx1RkUwRiBEZWxldGUgU3VtbWFyeScsXG4gICAgYERlbGV0ZSBzdW1tYXJ5IHZhcmlhbnQgXCIke2tleX1cIj8gVGhpcyBjYW5ub3QgYmUgdW5kb25lLmAsXG4gICAgYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL21hc3Rlci1kYXRhL3VwZGF0ZS1zdW1tYXJ5Jywge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGFjdGlvbjogJ2RlbGV0ZScsIGtleSB9KSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICBpZiAoZGF0YS5vaykge1xuICAgICAgICAgIF9zZXRNYXN0ZXJDaGFuZ2VOb3RpY2UoJ1Byb2Zlc3Npb25hbCBTdW1tYXJpZXMnLCBkYXRhLmFjdGlvbiB8fCAnZGVsZXRlZCcpO1xuICAgICAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3MDUgRGVsZXRlZCcsIGBTdW1tYXJ5IFwiJHtrZXl9XCIgcmVtb3ZlZC5gKTtcbiAgICAgICAgICBhd2FpdCBwb3B1bGF0ZU1hc3RlclRhYigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCBkYXRhLmVycm9yIHx8ICdEZWxldGUgZmFpbGVkJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsICdGYWlsZWQgdG8gZGVsZXRlIHN1bW1hcnknKTtcbiAgICAgIH1cbiAgICB9XG4gICk7XG59XG5cbmZ1bmN0aW9uIG9wZW5NYXN0ZXJDdk1vZGFsKCkge1xuICBjb25zdCBvdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Rlci1jdi1tb2RhbC1vdmVybGF5Jyk7XG4gIGlmICghb3ZlcmxheSkgcmV0dXJuO1xuICBfZm9jdXNlZEVsZW1lbnRCZWZvcmVNb2RhbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWN2LW1vZGFsLWJvZHknKTtcbiAgcG9wdWxhdGVNYXN0ZXJUYWIoY29udGFpbmVyKTtcbiAgc2V0SW5pdGlhbEZvY3VzKCdtYXN0ZXItY3YtbW9kYWwtb3ZlcmxheScpO1xuICB0cmFwRm9jdXMoJ21hc3Rlci1jdi1tb2RhbC1vdmVybGF5Jyk7XG59XG5cbmZ1bmN0aW9uIGNsb3NlTWFzdGVyQ3ZNb2RhbCgpIHtcbiAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXItY3YtbW9kYWwtb3ZlcmxheScpO1xuICBpZiAob3ZlcmxheSkgb3ZlcmxheS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBfbWFzdGVyQ3ZBY3RpdmVDb250YWluZXIgPSBudWxsO1xuICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJyc7XG4gIHJlc3RvcmVGb2N1cygpO1xufVxuXG5leHBvcnQge1xuICBwb3B1bGF0ZU1hc3RlclRhYixcbiAgb3Blbk1hc3RlckN2TW9kYWwsXG4gIGNsb3NlTWFzdGVyQ3ZNb2RhbCxcbiAgX3JlbmRlclBlcnNvbmFsSW5mb0NhcmQsXG4gIF9yZW5kZXJFeHBlcmllbmNlc0xpc3QsXG4gIF9yZW5kZXJTa2lsbHNTZWN0aW9uLFxuICBfcmVuZGVyRWR1Y2F0aW9uTGlzdCxcbiAgX3JlbmRlckF3YXJkc0xpc3QsXG4gIF9yZW5kZXJDZXJ0aWZpY2F0aW9uc0xpc3QsXG4gIF9yZW5kZXJNYXN0ZXJBY2hpZXZlbWVudHNUYWJsZSxcbiAgX3JlbmRlclN1bW1hcmllc0xpc3QsXG4gIHNob3dBZGRBY2hpZXZlbWVudE1vZGFsLFxuICBlZGl0TWFzdGVyQWNoaWV2ZW1lbnQsXG4gIGNsb3NlTWFzdGVyQWNoTW9kYWwsXG4gIHNhdmVNYXN0ZXJBY2hpZXZlbWVudCxcbiAgc2hvd0FkZFN1bW1hcnlNb2RhbCxcbiAgZWRpdE1hc3RlclN1bW1hcnksXG4gIGNsb3NlTWFzdGVyU3VtTW9kYWwsXG4gIHNhdmVNYXN0ZXJTdW1tYXJ5LFxuICBzaG93RWRpdFBlcnNvbmFsSW5mb01vZGFsLFxuICBjbG9zZVBlcnNvbmFsSW5mb01vZGFsLFxuICBzYXZlUGVyc29uYWxJbmZvLFxuICBzaG93QWRkRXhwZXJpZW5jZU1vZGFsLFxuICBlZGl0TWFzdGVyRXhwZXJpZW5jZSxcbiAgY2xvc2VFeHBlcmllbmNlTW9kYWwsXG4gIHNhdmVNYXN0ZXJFeHBlcmllbmNlLFxuICBkZWxldGVNYXN0ZXJFeHBlcmllbmNlLFxuICBfYWRkRXhwQWNoaWV2ZW1lbnQsXG4gIF9tb3ZlRXhwQWNoaWV2ZW1lbnQsXG4gIF9kZWxldGVFeHBBY2hpZXZlbWVudCxcbiAgc2hvd0FkZFNraWxsTW9kYWwsXG4gIGVkaXRNYXN0ZXJTa2lsbCxcbiAgY2xvc2VTa2lsbE1vZGFsLFxuICBzYXZlTWFzdGVyU2tpbGwsXG4gIGRlbGV0ZU1hc3RlclNraWxsLFxuICBzaG93QWRkRWR1Y2F0aW9uTW9kYWwsXG4gIGVkaXRNYXN0ZXJFZHVjYXRpb24sXG4gIGNsb3NlRWR1Y2F0aW9uTW9kYWwsXG4gIHNhdmVNYXN0ZXJFZHVjYXRpb24sXG4gIGRlbGV0ZU1hc3RlckVkdWNhdGlvbixcbiAgc2hvd0FkZEF3YXJkTW9kYWwsXG4gIGVkaXRNYXN0ZXJBd2FyZCxcbiAgY2xvc2VBd2FyZE1vZGFsLFxuICBzYXZlTWFzdGVyQXdhcmQsXG4gIGRlbGV0ZU1hc3RlckF3YXJkLFxuICBzaG93QWRkQ2VydGlmaWNhdGlvbk1vZGFsLFxuICBlZGl0TWFzdGVyQ2VydGlmaWNhdGlvbixcbiAgY2xvc2VDZXJ0aWZpY2F0aW9uTW9kYWwsXG4gIHNhdmVNYXN0ZXJDZXJ0aWZpY2F0aW9uLFxuICBkZWxldGVNYXN0ZXJDZXJ0aWZpY2F0aW9uLFxuICBleHBvcnRNYXN0ZXJDVixcbiAgb3BlbkJhY2t1cEhpc3RvcnlNb2RhbCxcbiAgcmVzdG9yZUJhY2t1cCxcbiAgdW5kb01hc3RlckRhdGFDaGFuZ2UsXG4gIHJlZG9NYXN0ZXJEYXRhQ2hhbmdlLFxuICBvcGVuRnVsbERhdGFQcmV2aWV3TW9kYWwsXG4gIHRyaWdnZXJNYXN0ZXJDdkltcG9ydCxcbiAgaGFuZGxlTWFzdGVyQ3ZJbXBvcnRGaWxlLFxuICBjb25maXJtTWFzdGVyQ3ZJbXBvcnQsXG4gIGRlbGV0ZU1hc3RlckFjaGlldmVtZW50LFxuICBkZWxldGVNYXN0ZXJTdW1tYXJ5LFxuICBsb2FkUHVibGljYXRpb25zLFxuICBsb2FkUHVibGljYXRpb25zQmliLFxuICB0b2dnbGVQdWJsaWNhdGlvbnNWaWV3LFxuICBzZXRQdWJsaWNhdGlvblNvcnRNb2RlLFxuICBzZXRQdWJsaWNhdGlvbkdyb3VwTW9kZSxcbiAgdmFsaWRhdGVQdWJsaWNhdGlvbnNCaWIsXG4gIHNhdmVQdWJsaWNhdGlvbnNCaWIsXG4gIHNob3dJbXBvcnRQdWJsaWNhdGlvbnNNb2RhbCxcbiAgY2xvc2VJbXBvcnRQdWJsaWNhdGlvbnNNb2RhbCxcbiAgaW1wb3J0UHVibGljYXRpb25zQmliLFxuICBzaG93Q29udmVydFB1YmxpY2F0aW9uc01vZGFsLFxuICBjbG9zZUNvbnZlcnRQdWJsaWNhdGlvbnNNb2RhbCxcbiAgY29udmVydFB1YmxpY2F0aW9uVGV4dCxcbiAgaW1wb3J0Q29udmVydGVkUHVibGljYXRpb25UZXh0LFxuICBzaG93QWRkUHVibGljYXRpb25Nb2RhbCxcbiAgZWRpdE1hc3RlclB1YmxpY2F0aW9uLFxuICBjbG9zZVB1YmxpY2F0aW9uTW9kYWwsXG4gIHNhdmVNYXN0ZXJQdWJsaWNhdGlvbixcbiAgZGVsZXRlTWFzdGVyUHVibGljYXRpb24sXG59O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvY292ZXItbGV0dGVyLmpzXG4gKiBDb3ZlciBsZXR0ZXIgdGFiOiBnZW5lcmF0ZSwgc2F2ZSwgdmFsaWRhdGUsIGNvbnNpc3RlbmN5IHJlcG9ydC5cbiAqXG4gKiBEZXBlbmRlbmNpZXMgKHJlc29sdmVkIHRocm91Z2ggZ2xvYmFsVGhpcyBhdCBydW50aW1lKTpcbiAqICAgZXNjYXBlSHRtbCwgc2hvd0FsZXJ0TW9kYWwsIHRhYkRhdGEsIHBlbmRpbmdSZWNvbW1lbmRhdGlvbnMsIENTU1xuICovXG5cbmltcG9ydCB7IHN0YXRlTWFuYWdlciB9IGZyb20gJy4vc3RhdGUtbWFuYWdlci5qcyc7XG5cbi8vIFx1MjUwMFx1MjUwMCBNb2R1bGUtbGV2ZWwgc3RhdGUgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmNvbnN0IENPVkVSX0xFVFRFUl9UT05FUyA9IFtcbiAgeyB2YWx1ZTogJ3N0YXJ0dXAvdGVjaCcsICAgbGFiZWw6ICdTdGFydHVwIC8gVGVjaCcgICAgfSxcbiAgeyB2YWx1ZTogJ3BoYXJtYS9iaW90ZWNoJywgbGFiZWw6ICdQaGFybWEgLyBCaW90ZWNoJyAgfSxcbiAgeyB2YWx1ZTogJ2FjYWRlbWlhJywgICAgICAgbGFiZWw6ICdBY2FkZW1pYScgICAgICAgICAgIH0sXG4gIHsgdmFsdWU6ICdmaW5hbmNpYWwnLCAgICAgIGxhYmVsOiAnRmluYW5jaWFsIFNlcnZpY2VzJyB9LFxuICB7IHZhbHVlOiAnbGVhZGVyc2hpcCcsICAgICBsYWJlbDogJ0xlYWRlcnNoaXAgLyBFeGVjJyAgfSxcbl07XG5cbmNvbnN0IENPVkVSX0xFVFRFUl9PUEVOSU5HUyA9IFtcbiAgeyB2YWx1ZTogJ2Zvcm1hbCcsICAgIGxhYmVsOiAnRm9ybWFsIHNhbHV0YXRpb24gXHUyMDE0IFx1MjAxQ0RlYXIgW25hbWVdLFx1MjAxRCcgfSxcbiAgeyB2YWx1ZTogJ2hvb2snLCAgICAgIGxhYmVsOiAnQXR0ZW50aW9uIGhvb2sgXHUyMDE0IGJvbGQgY2xhaW0gb3IgYWNoaWV2ZW1lbnQnIH0sXG4gIHsgdmFsdWU6ICduYXJyYXRpdmUnLCBsYWJlbDogJ05hcnJhdGl2ZSBvcGVuZXIgXHUyMDE0IHZpdmlkIHNjZW5lIG9yIHN0b3J5JyB9LFxuXTtcblxubGV0IF9jb3ZlckxldHRlclByaW9yU2Vzc2lvbnMgPSBbXTtcblxuLyoqIFN1cnZpdmVzIHRhYiBuYXZpZ2F0aW9uOiBmb3JtIGlucHV0cyBhbmQgdGhlIGdlbmVyYXRlZCBsZXR0ZXIgYm9keS4gKi9cbmxldCBfY292ZXJMZXR0ZXJGb3JtU3RhdGUgPSB7XG4gIHRvbmU6ICAgICAgICAgICAnJyxcbiAgb3BlbmluZ1N0eWxlOiAgICcnLFxuICBoaXJpbmdNYW5hZ2VyOiAgJycsXG4gIGNvbXBhbnlBZGRyZXNzOiAnJyxcbiAgaGlnaGxpZ2h0OiAgICAgICcnLFxuICBjb21wYW55Q29udGV4dDogJycsXG4gIGxldHRlclRleHQ6ICAgICAnJyxcbiAgbGV0dGVyVmlzaWJsZTogIGZhbHNlLFxufTtcblxuLy8gXHUyNTAwXHUyNTAwIFBvcHVsYXRlIGNvdmVyIGxldHRlciB0YWIgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIHBvcHVsYXRlQ292ZXJMZXR0ZXJUYWIoKSB7XG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9jdW1lbnQtY29udGVudCcpO1xuICBjb250ZW50LmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwiZW1wdHktc3RhdGVcIj48ZGl2IGNsYXNzPVwibG9hZGluZy1zcGlubmVyXCI+PC9kaXY+PHAgc3R5bGU9XCJtYXJnaW4tdG9wOjEycHg7Y29sb3I6IzY0NzQ4YjtcIj5Mb2FkaW5nIGNvdmVyIGxldHRlclx1MjAyNjwvcD48L2Rpdj4nO1xuXG4gIC8vIEZldGNoIHByaW9yIHNlc3Npb25zIHdpdGggY292ZXIgbGV0dGVyc1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9jb3Zlci1sZXR0ZXIvcHJpb3InKTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBfY292ZXJMZXR0ZXJQcmlvclNlc3Npb25zID0gKGRhdGEuc2Vzc2lvbnMgfHwgW10pO1xuICB9IGNhdGNoIChfKSB7XG4gICAgX2NvdmVyTGV0dGVyUHJpb3JTZXNzaW9ucyA9IFtdO1xuICB9XG5cbiAgY29uc3QgdG9uZU9wdGlvbnMgPSBDT1ZFUl9MRVRURVJfVE9ORVMubWFwKHQgPT5cbiAgICBgPG9wdGlvbiB2YWx1ZT1cIiR7dC52YWx1ZX1cIj4ke2VzY2FwZUh0bWwodC5sYWJlbCl9PC9vcHRpb24+YFxuICApLmpvaW4oJycpO1xuXG4gIGNvbnN0IG9wZW5pbmdPcHRpb25zID0gQ09WRVJfTEVUVEVSX09QRU5JTkdTLm1hcChvID0+XG4gICAgYDxvcHRpb24gdmFsdWU9XCIke28udmFsdWV9XCI+JHtlc2NhcGVIdG1sKG8ubGFiZWwpfTwvb3B0aW9uPmBcbiAgKS5qb2luKCcnKTtcblxuICBjb25zdCBwcmlvclNlY3Rpb24gPSBfY292ZXJMZXR0ZXJQcmlvclNlc3Npb25zLmxlbmd0aCA/IGBcbiAgICA8ZGl2IGNsYXNzPVwiY2wtcHJpb3Itc2VjdGlvblwiPlxuICAgICAgPGgzPlx1RDgzRFx1RENDQiBQcmlvciBDb3ZlciBMZXR0ZXJzPC9oMz5cbiAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtmb250LXNpemU6MC44NWVtO21hcmdpbi1ib3R0b206MTBweDtcIj5cbiAgICAgICAgU2VsZWN0IGEgcHJpb3IgbGV0dGVyIHRvIHVzZSBhcyBhIHN0YXJ0aW5nIHBvaW50LlxuICAgICAgPC9wPlxuICAgICAgPGRpdiBpZD1cImNsLXByaW9yLWxpc3RcIj5cbiAgICAgICAgJHtfY292ZXJMZXR0ZXJQcmlvclNlc3Npb25zLm1hcCgocywgaSkgPT4gYFxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbC1wcmlvci1jYXJkXCIgaWQ9XCJjbC1wcmlvci0ke2l9XCI+XG4gICAgICAgICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjEwcHg7YWxpZ24taXRlbXM6ZmxleC1zdGFydDtjdXJzb3I6cG9pbnRlcjtcIj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJjbC1wcmlvclwiIHZhbHVlPVwiJHtpfVwiIHN0eWxlPVwibWFyZ2luLXRvcDozcHg7XCIgLz5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8c3Ryb25nPiR7ZXNjYXBlSHRtbChzLnJvbGUgfHwgJ1JvbGUnKX0gYXQgJHtlc2NhcGVIdG1sKHMuY29tcGFueSB8fCAnQ29tcGFueScpfTwvc3Ryb25nPlxuICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6Izk0YTNiODtmb250LXNpemU6MC44MmVtO21hcmdpbi1sZWZ0OjZweDtcIj4ke2VzY2FwZUh0bWwocy5kYXRlIHx8ICcnKX08L3NwYW4+XG4gICAgICAgICAgICAgICAgJHtzLnRvbmUgPyBgPHNwYW4gY2xhc3M9XCJjbC10b25lLWJhZGdlXCI+JHtlc2NhcGVIdG1sKHMudG9uZSl9PC9zcGFuPmAgOiAnJ31cbiAgICAgICAgICAgICAgICA8cCBzdHlsZT1cImNvbG9yOiM2NDc0OGI7Zm9udC1zaXplOjAuODVlbTttYXJnaW46NHB4IDAgMDtcIj4ke2VzY2FwZUh0bWwoKHMucHJldmlldyB8fCAnJykuc2xpY2UoMCwgMTIwKSl9XHUyMDI2PC9wPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPC9kaXY+YCkuam9pbignJyl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gIDogJyc7XG5cbiAgY29udGVudC5pbm5lckhUTUwgPSBgXG4gICAgPGgxPlx1RDgzRFx1RENFOSBDb3ZlciBMZXR0ZXI8L2gxPlxuICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDttYXJnaW4tYm90dG9tOjIwcHg7XCI+XG4gICAgICBHZW5lcmF0ZSBhIHRhaWxvcmVkIGNvdmVyIGxldHRlciBmb3IgdGhpcyBhcHBsaWNhdGlvbiB1c2luZyB5b3VyIENWIGNvbnRlbnRcbiAgICAgIGFuZCBqb2IgYW5hbHlzaXMgYXMgY29udGV4dC5cbiAgICA8L3A+XG5cbiAgICAke3ByaW9yU2VjdGlvbn1cblxuICAgIDxkaXYgY2xhc3M9XCJjbC1mb3JtLXNlY3Rpb25cIj5cbiAgICAgIDxoMz5HZW5lcmF0aW9uIE9wdGlvbnM8L2gzPlxuICAgICAgPGRpdiBjbGFzcz1cImNsLWZvcm0tZ3JpZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2wtZm9ybS1maWVsZFwiPlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJjbC10b25lLXNlbGVjdFwiPlRvbmUgLyBJbmR1c3RyeTwvbGFiZWw+XG4gICAgICAgICAgPHNlbGVjdCBpZD1cImNsLXRvbmUtc2VsZWN0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCI+JHt0b25lT3B0aW9uc308L3NlbGVjdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjbC1mb3JtLWZpZWxkXCI+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cImNsLW9wZW5pbmctc3R5bGVcIj5PcGVuaW5nIFN0eWxlPC9sYWJlbD5cbiAgICAgICAgICA8c2VsZWN0IGlkPVwiY2wtb3BlbmluZy1zdHlsZVwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiPiR7b3BlbmluZ09wdGlvbnN9PC9zZWxlY3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2wtZm9ybS1maWVsZFwiPlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJjbC1oaXJpbmctbWFuYWdlclwiPkhpcmluZyBNYW5hZ2VyIE5hbWUvVGl0bGUgPHNwYW4gc3R5bGU9XCJjb2xvcjojOTRhM2I4O2ZvbnQtd2VpZ2h0OjQwMDtcIj4ob3B0aW9uYWwpPC9zcGFuPjwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJjbC1oaXJpbmctbWFuYWdlclwiIGNsYXNzPVwiZWRpdC1pbnB1dFwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBEci4gSmFuZSBTbWl0aCwgSGVhZCBvZiBEYXRhIFNjaWVuY2VcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNsLWZvcm0tZmllbGRcIiBzdHlsZT1cIm1hcmdpbi10b3A6MTJweDtcIj5cbiAgICAgICAgPGxhYmVsIGZvcj1cImNsLWNvbXBhbnktYWRkcmVzc1wiPkNvbXBhbnkgQWRkcmVzcyA8c3BhbiBzdHlsZT1cImNvbG9yOiM5NGEzYjg7Zm9udC13ZWlnaHQ6NDAwO1wiPihvcHRpb25hbCk8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgPHRleHRhcmVhIGlkPVwiY2wtY29tcGFueS1hZGRyZXNzXCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgcm93cz1cIjJcIlxuICAgICAgICAgICAgc3R5bGU9XCJyZXNpemU6dmVydGljYWw7XCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBBY21lIENvcnAsIDEyMyBNYWluIFN0LCBCb3N0b24gTUEgMDIxMzRcIj48L3RleHRhcmVhPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2wtZm9ybS1maWVsZFwiIHN0eWxlPVwibWFyZ2luLXRvcDoxMnB4O1wiPlxuICAgICAgICA8bGFiZWwgZm9yPVwiY2wtaGlnaGxpZ2h0XCI+U3BlY2lmaWMgYWNoaWV2ZW1lbnQgb3IgcHJvamVjdCB0byBoaWdobGlnaHQgPHNwYW4gc3R5bGU9XCJjb2xvcjojOTRhM2I4O2ZvbnQtd2VpZ2h0OjQwMDtcIj4ob3B0aW9uYWwpPC9zcGFuPjwvbGFiZWw+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiY2wtaGlnaGxpZ2h0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBMZWQgdGhlIG1pZ3JhdGlvbiB0byBLdWJlcm5ldGVzIHNhdmluZyAzMCUgaW5mcmEgY29zdFwiIC8+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjbC1mb3JtLWZpZWxkXCIgc3R5bGU9XCJtYXJnaW4tdG9wOjEycHg7XCI+XG4gICAgICAgIDxsYWJlbCBmb3I9XCJjbC1jb21wYW55LWNvbnRleHRcIj5Db21wYW55IGNvbnRleHQgPHNwYW4gc3R5bGU9XCJjb2xvcjojOTRhM2I4O2ZvbnQtd2VpZ2h0OjQwMDtcIj4ob3B0aW9uYWwgXHUyMDE0IHBhc3RlIHNwZWNpZmljIGluaXRpYXRpdmVzLCBwcm9kdWN0cywgdmFsdWVzLCBvciByZWNlbnQgbmV3cyk8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgPHRleHRhcmVhIGlkPVwiY2wtY29tcGFueS1jb250ZXh0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgcm93cz1cIjNcIlxuICAgICAgICAgICAgc3R5bGU9XCJyZXNpemU6dmVydGljYWw7XCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBUaGV5IGp1c3QgbGF1bmNoZWQgYSBuZXcgQUkgcGxhdGZvcm0gZm9yIGhlYWx0aGNhcmU7IHRoZWlyIENUTyB3cm90ZSBhYm91dCBwcmlvcml0aXNpbmcgcmVsaWFiaWxpdHkgb3ZlciBzcGVlZFx1MjAyNlwiPjwvdGV4dGFyZWE+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOjE2cHg7XCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHByaW1hcnlcIiBpZD1cImNsLWdlbmVyYXRlLWJ0blwiIG9uY2xpY2s9XCJnZW5lcmF0ZUNvdmVyTGV0dGVyKClcIj5cbiAgICAgICAgICBcdTI3MjggR2VuZXJhdGUgQ292ZXIgTGV0dGVyXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGlkPVwiY2wtcmVzdWx0LXNlY3Rpb25cIiBzdHlsZT1cImRpc3BsYXk6bm9uZTttYXJnaW4tdG9wOjI0cHg7XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2wtcmVzdWx0LWhlYWRlclwiPlxuICAgICAgICA8aDM+R2VuZXJhdGVkIENvdmVyIExldHRlcjwvaDM+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjhweDtmbGV4LXdyYXA6d3JhcDtcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0blwiIG9uY2xpY2s9XCJnZW5lcmF0ZUNvdmVyTGV0dGVyKClcIiB0aXRsZT1cIlJlZ2VuZXJhdGVcIj5cdUQ4M0RcdUREMDQgUmVnZW5lcmF0ZTwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuIHByaW1hcnlcIiBvbmNsaWNrPVwic2F2ZUNvdmVyTGV0dGVyKClcIiBpZD1cImNsLXNhdmUtYnRuXCI+XHVEODNEXHVEQ0JFIFNhdmUgQ292ZXIgTGV0dGVyPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7Zm9udC1zaXplOjAuODVlbTttYXJnaW4tYm90dG9tOjhweDtcIj5cbiAgICAgICAgRWRpdCB0aGUgdGV4dCBiZWxvdyBiZWZvcmUgc2F2aW5nLlxuICAgICAgPC9wPlxuICAgICAgPHRleHRhcmVhIGlkPVwiY2wtbGV0dGVyLXRleHRhcmVhXCIgY2xhc3M9XCJjbC1sZXR0ZXItdGV4dGFyZWFcIiByb3dzPVwiMjJcIlxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJDb3ZlciBsZXR0ZXIgdGV4dCBcdTIwMTQgZWRpdCBhcyBuZWVkZWRcIlxuICAgICAgICAgIG9uaW5wdXQ9XCJfZGVib3VuY2VkVmFsaWRhdGVDTCgpOyBfY292ZXJMZXR0ZXJGb3JtU3RhdGUubGV0dGVyVGV4dCA9IHRoaXMudmFsdWU7XCI+PC90ZXh0YXJlYT5cbiAgICAgIDxkaXYgaWQ9XCJjbC12YWxpZGF0aW9uLXBhbmVsXCIgY2xhc3M9XCJjbC12YWxpZGF0aW9uLXBhbmVsXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+XG4gICAgICAgIDxoND5cdUQ4M0RcdURDQ0EgUXVhbGl0eSBDaGVja3M8L2g0PlxuICAgICAgICA8ZGl2IGlkPVwiY2wtY2hlY2tzLWNvbnRhaW5lclwiPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwibmF2LWJ1dHRvbnMgbmF2LWVuZFwiIHN0eWxlPVwibWFyZ2luLXRvcDoyNHB4O1wiPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbnRpbnVlLWJ0blwiIG9uY2xpY2s9XCJoYW5kbGVTdGVwQ2xpY2soJ3NjcmVlbmluZycpXCI+XHVEODNEXHVEQ0NCIFByb2NlZWQgdG8gU2NyZWVuaW5nIFx1MjE5MjwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICBgO1xuXG4gIC8vIFJlc3RvcmUgc2F2ZWQgZm9ybSBzdGF0ZSBhbmQgd2lyZSB1cCBzYXZlLW9uLWNoYW5nZSBsaXN0ZW5lcnMuXG4gIF9yZXN0b3JlQ292ZXJMZXR0ZXJGb3JtU3RhdGUoKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIENvdmVyIGxldHRlciBmb3JtIHN0YXRlIGhlbHBlcnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIF9yZXN0b3JlQ292ZXJMZXR0ZXJGb3JtU3RhdGUoKSB7XG4gIGNvbnN0IHRvbmVFbCAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC10b25lLXNlbGVjdCcpO1xuICBjb25zdCBvcGVuaW5nRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtb3BlbmluZy1zdHlsZScpO1xuICBjb25zdCBobUVsICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtaGlyaW5nLW1hbmFnZXInKTtcbiAgY29uc3QgYWRkckVsICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWNvbXBhbnktYWRkcmVzcycpO1xuICBjb25zdCBobEVsICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtaGlnaGxpZ2h0Jyk7XG4gIGNvbnN0IGN0eEVsICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1jb21wYW55LWNvbnRleHQnKTtcbiAgY29uc3QgcmVzdWx0RWwgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLXJlc3VsdC1zZWN0aW9uJyk7XG4gIGNvbnN0IGxldHRlckVsICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1sZXR0ZXItdGV4dGFyZWEnKTtcblxuICBpZiAodG9uZUVsICYmIF9jb3ZlckxldHRlckZvcm1TdGF0ZS50b25lKVxuICAgIHRvbmVFbC52YWx1ZSA9IF9jb3ZlckxldHRlckZvcm1TdGF0ZS50b25lO1xuICBpZiAob3BlbmluZ0VsICYmIF9jb3ZlckxldHRlckZvcm1TdGF0ZS5vcGVuaW5nU3R5bGUpXG4gICAgb3BlbmluZ0VsLnZhbHVlID0gX2NvdmVyTGV0dGVyRm9ybVN0YXRlLm9wZW5pbmdTdHlsZTtcbiAgaWYgKGhtRWwgJiYgX2NvdmVyTGV0dGVyRm9ybVN0YXRlLmhpcmluZ01hbmFnZXIpXG4gICAgaG1FbC52YWx1ZSA9IF9jb3ZlckxldHRlckZvcm1TdGF0ZS5oaXJpbmdNYW5hZ2VyO1xuICBpZiAoYWRkckVsICYmIF9jb3ZlckxldHRlckZvcm1TdGF0ZS5jb21wYW55QWRkcmVzcylcbiAgICBhZGRyRWwudmFsdWUgPSBfY292ZXJMZXR0ZXJGb3JtU3RhdGUuY29tcGFueUFkZHJlc3M7XG4gIGlmIChobEVsICYmIF9jb3ZlckxldHRlckZvcm1TdGF0ZS5oaWdobGlnaHQpXG4gICAgaGxFbC52YWx1ZSA9IF9jb3ZlckxldHRlckZvcm1TdGF0ZS5oaWdobGlnaHQ7XG4gIGlmIChjdHhFbCAmJiBfY292ZXJMZXR0ZXJGb3JtU3RhdGUuY29tcGFueUNvbnRleHQpXG4gICAgY3R4RWwudmFsdWUgPSBfY292ZXJMZXR0ZXJGb3JtU3RhdGUuY29tcGFueUNvbnRleHQ7XG5cbiAgaWYgKF9jb3ZlckxldHRlckZvcm1TdGF0ZS5sZXR0ZXJWaXNpYmxlICYmIF9jb3ZlckxldHRlckZvcm1TdGF0ZS5sZXR0ZXJUZXh0KSB7XG4gICAgaWYgKHJlc3VsdEVsKSByZXN1bHRFbC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICBpZiAobGV0dGVyRWwpIHtcbiAgICAgIGxldHRlckVsLnZhbHVlID0gX2NvdmVyTGV0dGVyRm9ybVN0YXRlLmxldHRlclRleHQ7XG4gICAgICBfdmFsaWRhdGVDb3ZlckxldHRlcihsZXR0ZXJFbC52YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gV2lyZSB1cCBzYXZlLW9uLWNoYW5nZSBsaXN0ZW5lcnMgKGlubGluZSBvbmlucHV0IGFscmVhZHkgaGFuZGxlcyBsZXR0ZXJUZXh0KS5cbiAgaWYgKHRvbmVFbCkgICAgdG9uZUVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICAgKCkgPT4geyBfY292ZXJMZXR0ZXJGb3JtU3RhdGUudG9uZSA9IHRvbmVFbC52YWx1ZTsgfSk7XG4gIGlmIChvcGVuaW5nRWwpIG9wZW5pbmdFbC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7IF9jb3ZlckxldHRlckZvcm1TdGF0ZS5vcGVuaW5nU3R5bGUgPSBvcGVuaW5nRWwudmFsdWU7IH0pO1xuICBpZiAoaG1FbCkgICAgICBobUVsLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgICAgICAoKSA9PiB7IF9jb3ZlckxldHRlckZvcm1TdGF0ZS5oaXJpbmdNYW5hZ2VyID0gaG1FbC52YWx1ZTsgfSk7XG4gIGlmIChhZGRyRWwpICAgIGFkZHJFbC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICAgICgpID0+IHsgX2NvdmVyTGV0dGVyRm9ybVN0YXRlLmNvbXBhbnlBZGRyZXNzID0gYWRkckVsLnZhbHVlOyB9KTtcbiAgaWYgKGhsRWwpICAgICAgaGxFbC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICAgICAgKCkgPT4geyBfY292ZXJMZXR0ZXJGb3JtU3RhdGUuaGlnaGxpZ2h0ID0gaGxFbC52YWx1ZTsgfSk7XG4gIGlmIChjdHhFbCkgICAgIGN0eEVsLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgICAgICgpID0+IHsgX2NvdmVyTGV0dGVyRm9ybVN0YXRlLmNvbXBhbnlDb250ZXh0ID0gY3R4RWwudmFsdWU7IH0pO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgR2VuZXJhdGUgY292ZXIgbGV0dGVyIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUNvdmVyTGV0dGVyKCkge1xuICAvKiBkdWNrZmxvdzpcbiAgICogICBpZDogY292ZXJfbGV0dGVyX3VpX2dlbmVyYXRlX2xpdmVcbiAgICogICBraW5kOiB1aVxuICAgKiAgIHRpbWVzdGFtcDogJzIwMjYtMDQtMjFUMTg6MDA6MDBaJ1xuICAgKiAgIHN0YXR1czogbGl2ZVxuICAgKiAgIGhhbmRsZXM6XG4gICAqICAgLSB1aTpjb3Zlci1sZXR0ZXIuZ2VuZXJhdGVcbiAgICogICBjYWxsczpcbiAgICogICAtIFBPU1QgL2FwaS9jb3Zlci1sZXR0ZXIvZ2VuZXJhdGVcbiAgICogICByZWFkczpcbiAgICogICAtIGRvbTojY2wtdG9uZS1zZWxlY3QudmFsdWVcbiAgICogICAtIGRvbTojY2wtb3BlbmluZy1zdHlsZS52YWx1ZVxuICAgKiAgIC0gZG9tOiNjbC1oaXJpbmctbWFuYWdlci52YWx1ZVxuICAgKiAgIC0gZG9tOiNjbC1jb21wYW55LWFkZHJlc3MudmFsdWVcbiAgICogICAtIGRvbTojY2wtaGlnaGxpZ2h0LnZhbHVlXG4gICAqICAgLSBkb206aW5wdXRbbmFtZT1jbC1wcmlvcl0uY2hlY2tlZFxuICAgKiAgIHdyaXRlczpcbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL2NvdmVyLWxldHRlci9nZW5lcmF0ZS50b25lXG4gICAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9jb3Zlci1sZXR0ZXIvZ2VuZXJhdGUub3BlbmluZ19zdHlsZVxuICAgKiAgIC0gcmVxdWVzdDpQT1NUIC9hcGkvY292ZXItbGV0dGVyL2dlbmVyYXRlLmhpcmluZ19tYW5hZ2VyXG4gICAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9jb3Zlci1sZXR0ZXIvZ2VuZXJhdGUuY29tcGFueV9hZGRyZXNzXG4gICAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9jb3Zlci1sZXR0ZXIvZ2VuZXJhdGUuaGlnaGxpZ2h0XG4gICAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9jb3Zlci1sZXR0ZXIvZ2VuZXJhdGUucmV1c2VfYm9keVxuICAgKiAgIC0gZG9tOiNjbC1sZXR0ZXItdGV4dGFyZWEudmFsdWVcbiAgICogICBub3RlczogU3VibWl0cyBjb3Zlci1sZXR0ZXIgcHJvbXB0IGlucHV0cyAoaW5jbHVkaW5nIGNvbmZpZ3VyYWJsZSBvcGVuaW5nIHN0eWxlKSBhbmQgb3B0aW9uYWwgcmV1c2UgdGV4dCwgdGhlbiB3cml0ZXMgdGhlIGdlbmVyYXRlZCBib2R5IGludG8gdGhlIGVkaXRhYmxlIGNvdmVyLWxldHRlciB0ZXh0YXJlYS5cbiAgICovXG4gIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1nZW5lcmF0ZS1idG4nKTtcbiAgYnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgYnRuLnRleHRDb250ZW50ID0gJ1x1MjNGMyBHZW5lcmF0aW5nXHUyMDI2JztcblxuICBjb25zdCB0b25lICAgICAgICAgICAgPSAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLXRvbmUtc2VsZWN0JykgICAgICB8fCB7fSkudmFsdWUgfHwgJ3N0YXJ0dXAvdGVjaCc7XG4gIGNvbnN0IG9wZW5pbmdfc3R5bGUgICA9IChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtb3BlbmluZy1zdHlsZScpICAgIHx8IHt9KS52YWx1ZSB8fCAnZm9ybWFsJztcbiAgY29uc3QgaGlyaW5nX21hbmFnZXIgID0gKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1oaXJpbmctbWFuYWdlcicpICAgfHwge30pLnZhbHVlIHx8ICcnO1xuICBjb25zdCBjb21wYW55X2FkZHJlc3MgPSAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWNvbXBhbnktYWRkcmVzcycpICB8fCB7fSkudmFsdWUgfHwgJyc7XG4gIGNvbnN0IGhpZ2hsaWdodCAgICAgICA9IChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtaGlnaGxpZ2h0JykgICAgICAgICB8fCB7fSkudmFsdWUgfHwgJyc7XG4gIGNvbnN0IGNvbXBhbnlfY29udGV4dCA9IChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtY29tcGFueS1jb250ZXh0JykgIHx8IHt9KS52YWx1ZSB8fCAnJztcblxuICAvLyBDaGVjayBmb3IgcHJpb3IgbGV0dGVyIHNlbGVjdGlvblxuICBsZXQgcmV1c2VfYm9keSA9ICcnO1xuICBjb25zdCBjaGVja2VkUHJpb3IgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFtuYW1lPVwiY2wtcHJpb3JcIl06Y2hlY2tlZCcpO1xuICBpZiAoY2hlY2tlZFByaW9yKSB7XG4gICAgY29uc3QgaWR4ID0gcGFyc2VJbnQoY2hlY2tlZFByaW9yLnZhbHVlLCAxMCk7XG4gICAgcmV1c2VfYm9keSA9IChfY292ZXJMZXR0ZXJQcmlvclNlc3Npb25zW2lkeF0gfHwge30pLmZ1bGxfdGV4dCB8fCAnJztcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL2NvdmVyLWxldHRlci9nZW5lcmF0ZScsIHtcbiAgICAgIG1ldGhvZDogICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogICAgSlNPTi5zdHJpbmdpZnkoeyB0b25lLCBvcGVuaW5nX3N0eWxlLCBoaXJpbmdfbWFuYWdlciwgY29tcGFueV9hZGRyZXNzLCBoaWdobGlnaHQsIGNvbXBhbnlfY29udGV4dCwgcmV1c2VfYm9keSB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcblxuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBjb25zdCByZXN1bHRTZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLXJlc3VsdC1zZWN0aW9uJyk7XG4gICAgICBjb25zdCB0ZXh0YXJlYSAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWxldHRlci10ZXh0YXJlYScpO1xuICAgICAgaWYgKHJlc3VsdFNlY3Rpb24pIHJlc3VsdFNlY3Rpb24uc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICBpZiAodGV4dGFyZWEpIHtcbiAgICAgICAgdGV4dGFyZWEudmFsdWUgPSBkYXRhLnRleHQ7XG4gICAgICAgIF92YWxpZGF0ZUNvdmVyTGV0dGVyKHRleHRhcmVhLnZhbHVlKTtcbiAgICAgIH1cbiAgICAgIF9jb3ZlckxldHRlckZvcm1TdGF0ZS5sZXR0ZXJUZXh0ICAgID0gZGF0YS50ZXh0O1xuICAgICAgX2NvdmVyTGV0dGVyRm9ybVN0YXRlLmxldHRlclZpc2libGUgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIEdlbmVyYXRpb24gRmFpbGVkJywgZGF0YS5lcnJvciB8fCAnTExNIGRpZCBub3QgcmV0dXJuIGEgY292ZXIgbGV0dGVyLicpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIGNvbnRhY3Qgc2VydmVyLicpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChidG4pIHtcbiAgICAgIGJ0bi5kaXNhYmxlZCAgICA9IGZhbHNlO1xuICAgICAgYnRuLnRleHRDb250ZW50ID0gJ1x1MjcyOCBHZW5lcmF0ZSBDb3ZlciBMZXR0ZXInO1xuICAgIH1cbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgU2F2ZSBjb3ZlciBsZXR0ZXIgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIHNhdmVDb3ZlckxldHRlcigpIHtcbiAgLyogZHVja2Zsb3c6XG4gICAqICAgaWQ6IGNvdmVyX2xldHRlcl91aV9zYXZlX2xpdmVcbiAgICogICBraW5kOiB1aVxuICAgKiAgIHRpbWVzdGFtcDogJzIwMjYtMDMtMjVUMjE6Mzk6NDhaJ1xuICAgKiAgIHN0YXR1czogbGl2ZVxuICAgKiAgIGhhbmRsZXM6XG4gICAqICAgLSB1aTpjb3Zlci1sZXR0ZXIuc2F2ZVxuICAgKiAgIGNhbGxzOlxuICAgKiAgIC0gUE9TVCAvYXBpL2NvdmVyLWxldHRlci9zYXZlXG4gICAqICAgcmVhZHM6XG4gICAqICAgLSBkb206I2NsLWxldHRlci10ZXh0YXJlYS52YWx1ZVxuICAgKiAgIHdyaXRlczpcbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL2NvdmVyLWxldHRlci9zYXZlLnRleHRcbiAgICogICBub3RlczogU3VibWl0cyB0aGUgdXNlci1lZGl0ZWQgY292ZXItbGV0dGVyIGJvZHkgZm9yIHNlc3Npb24gcGVyc2lzdGVuY2UsIG1ldGFkYXRhIHdyaXRlLXRocm91Z2gsIGFuZCBhcmNoaXZlIGFydGlmYWN0IGdlbmVyYXRpb24uXG4gICAqL1xuICBjb25zdCB0ZXh0YXJlYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1sZXR0ZXItdGV4dGFyZWEnKTtcbiAgaWYgKCF0ZXh0YXJlYSkgcmV0dXJuO1xuICBjb25zdCB0ZXh0ID0gdGV4dGFyZWEudmFsdWUudHJpbSgpO1xuICBpZiAoIXRleHQpIHtcbiAgICBzaG93QWxlcnRNb2RhbCgnXHUyNkEwXHVGRTBGIEVtcHR5IExldHRlcicsICdQbGVhc2UgZ2VuZXJhdGUgb3IgdHlwZSBhIGNvdmVyIGxldHRlciBiZWZvcmUgc2F2aW5nLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1zYXZlLWJ0bicpO1xuICBpZiAoYnRuKSB7IGJ0bi5kaXNhYmxlZCA9IHRydWU7IGJ0bi50ZXh0Q29udGVudCA9ICdcdTIzRjMgU2F2aW5nXHUyMDI2JzsgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL2NvdmVyLWxldHRlci9zYXZlJywge1xuICAgICAgbWV0aG9kOiAgJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiAgICBKU09OLnN0cmluZ2lmeSh7IHRleHQgfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG5cbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjcwNSBTYXZlZCcsIGBDb3ZlciBsZXR0ZXIgc2F2ZWQgYXMgPHN0cm9uZz4ke2VzY2FwZUh0bWwoZGF0YS5maWxlbmFtZSl9PC9zdHJvbmc+IGluIHlvdXIgYXBwbGljYXRpb24gZm9sZGVyLmApO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIFNhdmUgRmFpbGVkJywgZGF0YS5lcnJvciB8fCAnQ291bGQgbm90IHNhdmUgY292ZXIgbGV0dGVyLicpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIGNvbnRhY3Qgc2VydmVyLicpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChidG4pIHsgYnRuLmRpc2FibGVkID0gZmFsc2U7IGJ0bi50ZXh0Q29udGVudCA9ICdcdUQ4M0RcdURDQkUgU2F2ZSBDb3ZlciBMZXR0ZXInOyB9XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIENyb3NzLWRvY3VtZW50IGNvbnNpc3RlbmN5IHJlcG9ydCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLyoqXG4gKiBCdWlsZCBhbmQgcmVuZGVyIHRoZSBjcm9zcy1kb2N1bWVudCBjb25zaXN0ZW5jeSByZXBvcnQgaW4gdGhlIEZpbmFsaXNlIHRhYi5cbiAqIENoZWNrcyBjb21wYW55IG5hbWUsIGpvYiB0aXRsZSwgQVRTIGtleXdvcmRzLCBhbmQgZGF0ZSBmb3JtYXR0aW5nIGFjcm9zc1xuICogdGhlIENWICh0YWJEYXRhLmN2KSBhbmQgY292ZXIgbGV0dGVyICgjY2wtbGV0dGVyLXRleHRhcmVhKS5cbiAqL1xuZnVuY3Rpb24gX3JlbmRlckNvbnNpc3RlbmN5UmVwb3J0KHN0YXR1c0RhdGEpIHtcbiAgY29uc3QgcGFuZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29uc2lzdGVuY3ktcmVwb3J0Jyk7XG4gIGlmICghcGFuZWwpIHJldHVybjtcblxuICBjb25zdCBhbmFseXNpcyAgICA9IHN0YXR1c0RhdGEuam9iX2FuYWx5c2lzIHx8IHt9O1xuICBjb25zdCBjb21wYW55ICAgICA9IChhbmFseXNpcy5jb21wYW55ICB8fCAnJykudHJpbSgpO1xuICBjb25zdCBqb2JUaXRsZSAgICA9IChhbmFseXNpcy50aXRsZSAgICB8fCAnJykudHJpbSgpO1xuICBjb25zdCBhdHNLZXl3b3JkcyA9IChhbmFseXNpcy5hdHNfa2V5d29yZHMgfHwgW10pLmZpbHRlcihCb29sZWFuKS5zbGljZSgwLCA4KTtcblxuICAvLyBTdHJpcCBIVE1MIHRhZ3MgZnJvbSBDViBjb250ZW50IGZvciB0ZXh0IHNlYXJjaFxuICBjb25zdCBjdlN0YXRlID0gc3RhdGVNYW5hZ2VyLmdldFRhYkRhdGEoJ2N2JykgfHwgJyc7XG4gIGNvbnN0IGN2SHRtbCA9IHR5cGVvZiBjdlN0YXRlID09PSAnc3RyaW5nJyA/IGN2U3RhdGUgOiAoY3ZTdGF0ZT8uWycqLmh0bWwnXSB8fCAnJyk7XG4gIGNvbnN0IGN2VGV4dCA9IGN2SHRtbC5yZXBsYWNlKC88W14+XSs+L2csICcgJykucmVwbGFjZSgvXFxzKy9nLCAnICcpLnRvTG93ZXJDYXNlKCk7XG5cbiAgLy8gR2V0IGNvdmVyIGxldHRlciB0ZXh0IGlmIHByZXNlbnRcbiAgY29uc3QgY2xFbCAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWxldHRlci10ZXh0YXJlYScpO1xuICBjb25zdCBjbFJhdyAgPSBjbEVsID8gY2xFbC52YWx1ZSA6ICcnO1xuICBjb25zdCBjbFRleHQgPSBjbFJhdy50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBoYXNDTCAgPSBjbFJhdy50cmltKCkubGVuZ3RoID4gNTA7XG5cbiAgaWYgKCFjb21wYW55ICYmICFqb2JUaXRsZSAmJiAhYXRzS2V5d29yZHMubGVuZ3RoKSB7XG4gICAgcGFuZWwuaW5uZXJIVE1MID0gJyc7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY2hlY2tzID0gW107XG5cbiAgLy8gXHUyNTAwXHUyNTAwIDEuIENvbXBhbnkgbmFtZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgaWYgKGNvbXBhbnkpIHtcbiAgICBjb25zdCBjb21wTGMgPSBjb21wYW55LnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgaW5DViAgID0gY3ZUZXh0LmluY2x1ZGVzKGNvbXBMYyk7XG4gICAgY29uc3QgaW5DTCAgID0gaGFzQ0wgJiYgY2xUZXh0LmluY2x1ZGVzKGNvbXBMYyk7XG4gICAgY29uc3QgbWlzc2luZyA9IFtdO1xuICAgIGlmICghaW5DVikgICAgICAgICAgbWlzc2luZy5wdXNoKCdDVicpO1xuICAgIGlmIChoYXNDTCAmJiAhaW5DTCkgbWlzc2luZy5wdXNoKCdjb3ZlciBsZXR0ZXInKTtcbiAgICBjb25zdCBzdGF0dXMgPSBtaXNzaW5nLmxlbmd0aCA9PT0gMCA/ICdwYXNzJyA6IG1pc3NpbmcubGVuZ3RoIDwgMiAmJiBoYXNDTCA/ICd3YXJuJyA6ICdmYWlsJztcbiAgICBjaGVja3MucHVzaCh7XG4gICAgICBzdGF0dXMsXG4gICAgICBsYWJlbDogICdDb21wYW55IG5hbWUnLFxuICAgICAgZGV0YWlsOiBzdGF0dXMgPT09ICdwYXNzJ1xuICAgICAgICA/IGBcXHUyMDFjJHtlc2NhcGVIdG1sKGNvbXBhbnkpfVxcdTIwMWQgZm91bmQgaW4gYWxsIGRvY3VtZW50cy5gXG4gICAgICAgIDogYFxcdTIwMWMke2VzY2FwZUh0bWwoY29tcGFueSl9XFx1MjAxZCBtaXNzaW5nIGZyb206ICR7bWlzc2luZy5qb2luKCcsICcpfS5gLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gXHUyNTAwXHUyNTAwIDIuIEpvYiB0aXRsZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgaWYgKGpvYlRpdGxlKSB7XG4gICAgY29uc3QgdGl0bGVMYyAgID0gam9iVGl0bGUudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCB0aXRsZUNvcmUgPSB0aXRsZUxjLnJlcGxhY2UoL14oc2VuaW9yfGp1bmlvcnxsZWFkfHByaW5jaXBhbHxzdGFmZnxhc3NvY2lhdGUpXFxzKy8sICcnKTtcbiAgICBjb25zdCBpbkNWICAgICAgPSBjdlRleHQuaW5jbHVkZXModGl0bGVMYykgfHwgY3ZUZXh0LmluY2x1ZGVzKHRpdGxlQ29yZSk7XG4gICAgY29uc3QgaW5DTCAgICAgID0gaGFzQ0wgJiYgKGNsVGV4dC5pbmNsdWRlcyh0aXRsZUxjKSB8fCBjbFRleHQuaW5jbHVkZXModGl0bGVDb3JlKSk7XG4gICAgY29uc3QgbWlzc2luZyAgID0gW107XG4gICAgaWYgKCFpbkNWKSAgICAgICAgICBtaXNzaW5nLnB1c2goJ0NWJyk7XG4gICAgaWYgKGhhc0NMICYmICFpbkNMKSBtaXNzaW5nLnB1c2goJ2NvdmVyIGxldHRlcicpO1xuICAgIGNvbnN0IHN0YXR1cyA9IG1pc3NpbmcubGVuZ3RoID09PSAwID8gJ3Bhc3MnIDogbWlzc2luZy5sZW5ndGggPCAyICYmIGhhc0NMID8gJ3dhcm4nIDogJ2ZhaWwnO1xuICAgIGNoZWNrcy5wdXNoKHtcbiAgICAgIHN0YXR1cyxcbiAgICAgIGxhYmVsOiAgJ0pvYiB0aXRsZScsXG4gICAgICBkZXRhaWw6IHN0YXR1cyA9PT0gJ3Bhc3MnXG4gICAgICAgID8gYFxcdTIwMWMke2VzY2FwZUh0bWwoam9iVGl0bGUpfVxcdTIwMWQgZm91bmQgaW4gYWxsIGRvY3VtZW50cy5gXG4gICAgICAgIDogYFxcdTIwMWMke2VzY2FwZUh0bWwoam9iVGl0bGUpfVxcdTIwMWQgbWlzc2luZyBmcm9tOiAke21pc3Npbmcuam9pbignLCAnKX0uYCxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFx1MjUwMFx1MjUwMCAzLiBBVFMga2V5d29yZHMgKHRvcCA4KSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgaWYgKGF0c0tleXdvcmRzLmxlbmd0aCkge1xuICAgIGNvbnN0IG1pc3NpbmdDViA9IGF0c0tleXdvcmRzLmZpbHRlcihrdyA9PiAhY3ZUZXh0LmluY2x1ZGVzKGt3LnRvTG93ZXJDYXNlKCkpKTtcbiAgICBjb25zdCBtaXNzaW5nQ0wgPSBoYXNDTCA/IGF0c0tleXdvcmRzLmZpbHRlcihrdyA9PiAhY2xUZXh0LmluY2x1ZGVzKGt3LnRvTG93ZXJDYXNlKCkpKSA6IFtdO1xuICAgIGNvbnN0IHRvdGFsTWlzc2luZyA9IG5ldyBTZXQoWy4uLm1pc3NpbmdDViwgLi4ubWlzc2luZ0NMXSkuc2l6ZTtcbiAgICBjb25zdCBzdGF0dXMgPSB0b3RhbE1pc3NpbmcgPT09IDAgPyAncGFzcycgOiB0b3RhbE1pc3NpbmcgPD0gMyA/ICd3YXJuJyA6ICdmYWlsJztcbiAgICBjb25zdCBwYXJ0cyAgPSBbXTtcbiAgICBpZiAobWlzc2luZ0NWLmxlbmd0aCkgcGFydHMucHVzaChgTWlzc2luZyBmcm9tIENWOiAke21pc3NpbmdDVi5tYXAoayA9PiBgPGVtPiR7ZXNjYXBlSHRtbChrKX08L2VtPmApLmpvaW4oJywgJyl9YCk7XG4gICAgaWYgKG1pc3NpbmdDTC5sZW5ndGgpIHBhcnRzLnB1c2goYE1pc3NpbmcgZnJvbSBjb3ZlciBsZXR0ZXI6ICR7bWlzc2luZ0NMLm1hcChrID0+IGA8ZW0+JHtlc2NhcGVIdG1sKGspfTwvZW0+YCkuam9pbignLCAnKX1gKTtcbiAgICBjaGVja3MucHVzaCh7XG4gICAgICBzdGF0dXMsXG4gICAgICBsYWJlbDogIGBBVFMga2V5d29yZHMgKCR7YXRzS2V5d29yZHMubGVuZ3RofSBjaGVja2VkKWAsXG4gICAgICBkZXRhaWw6IHBhcnRzLmxlbmd0aCA/IHBhcnRzLmpvaW4oJy4gJykgKyAnLicgOiBgQWxsICR7YXRzS2V5d29yZHMubGVuZ3RofSBrZXl3b3JkcyBwcmVzZW50IGluIGRvY3VtZW50cy5gLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gXHUyNTAwXHUyNTAwIDQuIERhdGUgZm9ybWF0IGNvbnNpc3RlbmN5IChDVikgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIGlmIChjdlRleHQpIHtcbiAgICBjb25zdCBoYXNXcml0dGVuID0gL1xcYihqYW58ZmVifG1hcnxhcHJ8bWF5fGp1bnxqdWx8YXVnfHNlcHxvY3R8bm92fGRlYylcXHcqXFxzK1xcZHs0fVxcYi9pLnRlc3QoY3ZUZXh0KTtcbiAgICBjb25zdCBoYXNJU08gICAgID0gL1xcYlxcZHs0fS1cXGR7Mn1cXGIvLnRlc3QoY3ZUZXh0KTtcbiAgICBjb25zdCBoYXNTbGFzaCAgID0gL1xcYlxcZHsxLDJ9XFwvXFxkezR9XFxiLy50ZXN0KGN2VGV4dCk7XG4gICAgY29uc3QgZm9ybWF0Q291bnQgPSBbaGFzV3JpdHRlbiwgaGFzSVNPLCBoYXNTbGFzaF0uZmlsdGVyKEJvb2xlYW4pLmxlbmd0aDtcbiAgICBjaGVja3MucHVzaCh7XG4gICAgICBzdGF0dXM6IGZvcm1hdENvdW50IDw9IDEgPyAncGFzcycgOiAnd2FybicsXG4gICAgICBsYWJlbDogICdEYXRlIGZvcm1hdHMgKENWKScsXG4gICAgICBkZXRhaWw6IGZvcm1hdENvdW50IDw9IDFcbiAgICAgICAgPyAnQ29uc2lzdGVudCBkYXRlIGZvcm1hdCB0aHJvdWdob3V0IENWLidcbiAgICAgICAgOiAnTWl4ZWQgZGF0ZSBmb3JtYXRzIGRldGVjdGVkIChlLmcuIFxcdTIwMWNKYW4gMjAyMFxcdTIwMWQgYW5kIFxcdTIwMWMyMDIwLTAxXFx1MjAxZCkgXFx1MjAxNCBzdGFuZGFyZGlzZSBmb3IgYSBwb2xpc2hlZCBsb29rLicsXG4gICAgfSk7XG4gIH1cblxuICAvLyBcXHUyNTAwXFx1MjUwMCA1LiBDcm9zcy1kb2N1bWVudCB0ZXJtaW5vbG9neSBjb25zaXN0ZW5jeSBcXHUyNTAwXFx1MjUwMFxcdTI1MDBcXHUyNTAwXFx1MjUwMFxcdTI1MDBcXHUyNTAwXFx1MjUwMFxcdTI1MDBcXHUyNTAwXFx1MjUwMFxcdTI1MDBcXHUyNTAwXFx1MjUwMFxcdTI1MDBcXHUyNTAwXFx1MjUwMFxcdTI1MDBcXHUyNTAwXFx1MjUwMFxcdTI1MDBcbiAgY29uc3Qgc3FUZXh0cyA9IFsuLi5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCd0ZXh0YXJlYVtpZF49XCJzYy10ZXh0LVwiXScpXVxuICAgIC5tYXAoZWwgPT4gZWwudmFsdWUudG9Mb3dlckNhc2UoKSkuZmlsdGVyKEJvb2xlYW4pO1xuICBjb25zdCBhbGxEb2NUZXh0ID0gW2N2VGV4dCwgY2xUZXh0LCAuLi5zcVRleHRzXTtcblxuICBjb25zdCBfVEVSTV9QQUlSUyA9IFtcbiAgICBbJ21hY2hpbmUgbGVhcm5pbmcnLCAnbWwnXSwgWydhcnRpZmljaWFsIGludGVsbGlnZW5jZScsICdhaSddLFxuICAgIFsnbmF0dXJhbCBsYW5ndWFnZSBwcm9jZXNzaW5nJywgJ25scCddLCBbJ2RlZXAgbGVhcm5pbmcnLCAnZGwnXSxcbiAgICBbJ2xhcmdlIGxhbmd1YWdlIG1vZGVsJywgJ2xsbSddLCBbJ3VzZXIgaW50ZXJmYWNlJywgJ3VpJ10sXG4gICAgWyd1c2VyIGV4cGVyaWVuY2UnLCAndXgnXSwgWydhcHBsaWNhdGlvbiBwcm9ncmFtbWluZyBpbnRlcmZhY2UnLCAnYXBpJ10sXG4gICAgWydrdWJlcm5ldGVzJywgJ2s4cyddLCBbJ2NvbnRpbnVvdXMgaW50ZWdyYXRpb24nLCAnY2kvY2QnXSxcbiAgXTtcbiAgY29uc3QgdGVybU1pc21hdGNoZXMgPSBbXTtcbiAgZm9yIChjb25zdCBbbG9uZywgc2hvcnRdIG9mIF9URVJNX1BBSVJTKSB7XG4gICAgY29uc3QgcmUgPSBuZXcgUmVnRXhwKGBcXFxcYiR7c2hvcnQucmVwbGFjZSgnLycsICdcXFxcLycpfVxcXFxiYCk7XG4gICAgaWYgKGFsbERvY1RleHQuc29tZSh0ID0+IHQuaW5jbHVkZXMobG9uZykpICYmIGFsbERvY1RleHQuc29tZSh0ID0+IHJlLnRlc3QodCkpKSB7XG4gICAgICB0ZXJtTWlzbWF0Y2hlcy5wdXNoKGBcXHUyMDFjJHtsb25nfVxcdTIwMWQgLyBcXHUyMDFjJHtzaG9ydC50b1VwcGVyQ2FzZSgpfVxcdTIwMWRgKTtcbiAgICB9XG4gIH1cbiAgaWYgKHRlcm1NaXNtYXRjaGVzLmxlbmd0aCA+IDApIHtcbiAgICBjaGVja3MucHVzaCh7XG4gICAgICBzdGF0dXM6ICd3YXJuJyxcbiAgICAgIGxhYmVsOiAgJ1Rlcm1pbm9sb2d5IGNvbnNpc3RlbmN5JyxcbiAgICAgIGRldGFpbDogYE1peGVkIGZvcm1zIGRldGVjdGVkIGFjcm9zcyBkb2N1bWVudHM6ICR7dGVybU1pc21hdGNoZXMuam9pbignOyAnKX0uIFN0YW5kYXJkaXNlIHRvIG9uZSBmb3JtIHBlciBjb25jZXB0LmAsXG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoYWxsRG9jVGV4dC5zb21lKHQgPT4gdC5sZW5ndGggPiA1MCkpIHtcbiAgICBjaGVja3MucHVzaCh7XG4gICAgICBzdGF0dXM6ICdwYXNzJyxcbiAgICAgIGxhYmVsOiAgJ1Rlcm1pbm9sb2d5IGNvbnNpc3RlbmN5JyxcbiAgICAgIGRldGFpbDogJ05vIG1peGVkIGFiYnJldmlhdGlvbi9leHBhbnNpb24gcGFpcnMgZGV0ZWN0ZWQgYWNyb3NzIENWLCBjb3ZlciBsZXR0ZXIsIGFuZCBzY3JlZW5pbmcgYW5zd2Vycy4nLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gXHUyNTAwXHUyNTAwIFJlbmRlciBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgY29uc3QgaWNvbnMgPSB7IHBhc3M6ICdcXHUyNzA1Jywgd2FybjogJ1xcdTI2YTBcXHVmZTBmJywgZmFpbDogJ1xcdTI3NGMnIH07XG4gIGNvbnN0IG92ZXJhbGxGYWlsICAgPSBjaGVja3Muc29tZShjID0+IGMuc3RhdHVzID09PSAnZmFpbCcpO1xuICBjb25zdCBvdmVyYWxsV2FybiAgID0gY2hlY2tzLnNvbWUoYyA9PiBjLnN0YXR1cyA9PT0gJ3dhcm4nKTtcbiAgY29uc3Qgb3ZlcmFsbFN0YXR1cyA9IG92ZXJhbGxGYWlsID8gJ2ZhaWwnIDogb3ZlcmFsbFdhcm4gPyAnd2FybicgOiAncGFzcyc7XG4gIGNvbnN0IG92ZXJhbGxNc2cgICAgPSBvdmVyYWxsRmFpbFxuICAgID8gJ0lzc3VlcyBmb3VuZCBcXHUyMDE0IHJldmlldyBiZWZvcmUgc2VuZGluZydcbiAgICA6IG92ZXJhbGxXYXJuID8gJ01pbm9yIGluY29uc2lzdGVuY2llcyBkZXRlY3RlZCcgOiAnQWxsIGNoZWNrcyBwYXNzZWQnO1xuXG4gIHBhbmVsLmlubmVySFRNTCA9IGBcbiAgICA8ZGl2IGNsYXNzPVwiY29uc2lzdGVuY3ktcmVwb3J0XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3ItaGVhZGVyXCI+XG4gICAgICAgIDxoMyBzdHlsZT1cIm1hcmdpbjowO2ZvbnQtc2l6ZToxZW07XCI+JHtpY29uc1tvdmVyYWxsU3RhdHVzXX0gQ3Jvc3MtRG9jdW1lbnQgQ29uc2lzdGVuY3k8L2gzPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImNyLWJhZGdlIGNyLSR7b3ZlcmFsbFN0YXR1c31cIj4ke2VzY2FwZUh0bWwob3ZlcmFsbE1zZyl9PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7Zm9udC1zaXplOjAuODNlbTttYXJnaW46MCAwIDEycHg7XCI+XG4gICAgICAgIENoZWNrcyBjb21wYW55IG5hbWUsIGpvYiB0aXRsZSwgQVRTIGtleXdvcmRzLCBkYXRlIGZvcm1hdHRpbmcsIGFuZCB0ZXJtaW5vbG9neSBjb25zaXN0ZW5jeSBhY3Jvc3MgQ1YsIGNvdmVyIGxldHRlciwgYW5kIHNjcmVlbmluZyBhbnN3ZXJzLlxuICAgICAgPC9wPlxuICAgICAgPGRpdiBjbGFzcz1cImNyLWNoZWNrc1wiPlxuICAgICAgICAke2NoZWNrcy5tYXAoYyA9PiBgXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNyLWNoZWNrIGNyLSR7Yy5zdGF0dXN9XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNyLWljb25cIj4ke2ljb25zW2Muc3RhdHVzXX08L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNyLWxhYmVsXCI+JHtlc2NhcGVIdG1sKGMubGFiZWwpfTwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3ItZGV0YWlsXCI+JHtjLmRldGFpbH08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+YCkuam9pbignJyl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgRGVib3VuY2VkIHZhbGlkYXRpb24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmxldCBfY2xWYWxpZGF0ZVRpbWVyID0gbnVsbDtcbmZ1bmN0aW9uIF9kZWJvdW5jZWRWYWxpZGF0ZUNMKCkge1xuICBjbGVhclRpbWVvdXQoX2NsVmFsaWRhdGVUaW1lcik7XG4gIF9jbFZhbGlkYXRlVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICBjb25zdCB0YSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1sZXR0ZXItdGV4dGFyZWEnKTtcbiAgICBpZiAodGEpIF92YWxpZGF0ZUNvdmVyTGV0dGVyKHRhLnZhbHVlKTtcbiAgfSwgNjAwKTtcbn1cblxuLyoqXG4gKiBDbGllbnQtc2lkZSBjb3ZlciBsZXR0ZXIgcXVhbGl0eSBjaGVja3MuXG4gKiA1IHJ1bGVzOiBvcGVuaW5nLCBJLWZpcnN0IGdhdGUsIGNvbXBhbnkgbmFtZSwgd29yZCBjb3VudCAocm9sZS1kaWZmZXJlbnRpYXRlZCksIGNhbGwtdG8tYWN0aW9uLlxuICovXG5mdW5jdGlvbiBfdmFsaWRhdGVDb3ZlckxldHRlcih0ZXh0KSB7XG4gIGNvbnN0IHBhbmVsICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC12YWxpZGF0aW9uLXBhbmVsJyk7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1jaGVja3MtY29udGFpbmVyJyk7XG4gIGlmICghcGFuZWwgfHwgIWNvbnRhaW5lciB8fCAhdGV4dC50cmltKCkpIHJldHVybjtcblxuICAvLyBcdTI1MDBcdTI1MDAgUnVsZSAxOiBPcGVuaW5nIHBhdHRlcm4gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIGNvbnN0IGZpcnN0TGluZSA9ICh0ZXh0LnNwbGl0KCdcXG4nKS5maW5kKGwgPT4gbC50cmltKCkpIHx8ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgZ2VuZXJpY09wZW5pbmdzID0gW1xuICAgIC9eZGVhciBoaXJpbmcgbWFuYWdlci8sXG4gICAgL15kZWFyIHNpciBvciBtYWRhbS8sXG4gICAgL150byB3aG9tIGl0IG1heSBjb25jZXJuLyxcbiAgICAvXmRlYXIgcmVjcnVpdGVyLyxcbiAgICAvXmRlYXIgaHVtYW4gcmVzb3VyY2VzLyxcbiAgICAvXmRlYXIgaHIvLFxuICBdO1xuICBjb25zdCBnZW5lcmljT3BlbmluZyA9IGdlbmVyaWNPcGVuaW5ncy5zb21lKHJlID0+IHJlLnRlc3QoZmlyc3RMaW5lKSk7XG4gIGNvbnN0IG9wZW5pbmdDaGVjayA9IHtcbiAgICBwYXNzOiAhZ2VuZXJpY09wZW5pbmcsXG4gICAgbGFiZWw6ICdPcGVuaW5nIHNhbHV0YXRpb24nLFxuICAgIGRldGFpbDogZ2VuZXJpY09wZW5pbmdcbiAgICAgID8gJ1VzZXMgYSBnZW5lcmljIG9wZW5lciAoXCJEZWFyIEhpcmluZyBNYW5hZ2VyXCIgZXRjLikgXHUyMDE0IHBlcnNvbmFsaXNlIHdpdGggYSBuYW1lIG9yIHJvbGUuJ1xuICAgICAgOiAnUGVyc29uYWxpc2VkIG9wZW5lciBcdTIwMTQgZ29vZC4nLFxuICB9O1xuXG4gIC8vIFx1MjUwMFx1MjUwMCBSdWxlIDFiOiBCb2R5IG11c3Qgbm90IG9wZW4gd2l0aCBcIklcIiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgY29uc3QgYWxsTGluZXMgPSB0ZXh0LnNwbGl0KCdcXG4nKS5tYXAobCA9PiBsLnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pO1xuICBjb25zdCBzYWx1dGF0aW9uSWR4ID0gYWxsTGluZXMuZmluZEluZGV4KFxuICAgIGwgPT4gbC50b0xvd2VyQ2FzZSgpID09PSBmaXJzdExpbmUudG9Mb3dlckNhc2UoKVxuICApO1xuICBjb25zdCBib2R5TGluZXMgPSBhbGxMaW5lcy5zbGljZShNYXRoLm1heCgwLCBzYWx1dGF0aW9uSWR4ICsgMSkpO1xuICBjb25zdCBmaXJzdEJvZHlXb3JkID0gKGJvZHlMaW5lcy5maW5kKGwgPT4gbC50cmltKCkpIHx8ICcnKS5zcGxpdCgvXFxzKy8pWzBdIHx8ICcnO1xuICAvLyBTcGxpdCBvbiBub24tYWxwaGEgc28gXCJJJ21cIiBcdTIxOTIgdG9rZW4gXCJJXCIsIFwiSW5cIiBcdTIxOTIgdG9rZW4gXCJJblwiXG4gIGNvbnN0IGZpcnN0Qm9keVRva2VuID0gZmlyc3RCb2R5V29yZC5zcGxpdCgvW15hLXpBLVpdLylbMF0gfHwgJyc7XG4gIGNvbnN0IGJvZHlTdGFydHNXaXRoSSA9IGZpcnN0Qm9keVRva2VuLnRvTG93ZXJDYXNlKCkgPT09ICdpJztcbiAgY29uc3QgaUZpcnN0Q2hlY2sgPSB7XG4gICAgcGFzczogIWJvZHlTdGFydHNXaXRoSSxcbiAgICBsYWJlbDogJ09wZW5pbmcgd29yZCcsXG4gICAgZGV0YWlsOiBib2R5U3RhcnRzV2l0aElcbiAgICAgID8gJ0JvZHkgb3BlbnMgd2l0aCBcIklcIiBcdTIwMTQgbGVhZCB3aXRoIHlvdXIgdmFsdWUsIHRoZSByb2xlLCBvciB0aGUgY29tcGFueSBpbnN0ZWFkLidcbiAgICAgIDogJ0JvZHkgZG9lcyBub3Qgb3BlbiB3aXRoIFwiSVwiIFx1MjAxNCBnb29kLicsXG4gIH07XG5cbiAgLy8gXHUyNTAwXHUyNTAwIFJ1bGUgMjogQ29tcGFueS1zcGVjaWZpYyByZWZlcmVuY2UgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIGNvbnN0IGNvbXBhbnlOYW1lID0gX2dldENvbXBhbnlOYW1lRm9yQ0woKTtcbiAgbGV0IGNvbXBhbnlDaGVjaztcbiAgaWYgKCFjb21wYW55TmFtZSkge1xuICAgIGNvbXBhbnlDaGVjayA9IHsgd2FybjogdHJ1ZSwgbGFiZWw6ICdDb21wYW55IHJlZmVyZW5jZScsIGRldGFpbDogJ0NvbXBhbnkgbmFtZSBub3QgZGV0ZWN0ZWQgZnJvbSBqb2IgZGVzY3JpcHRpb24gXHUyMDE0IHZlcmlmeSBtYW51YWxseS4nIH07XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgbWVudGlvbnMgPSAodGV4dC50b0xvd2VyQ2FzZSgpLm1hdGNoKG5ldyBSZWdFeHAoY29tcGFueU5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgJ1xcXFwkJicpLCAnZycpKSB8fCBbXSkubGVuZ3RoO1xuICAgIGNvbXBhbnlDaGVjayA9IHtcbiAgICAgIHBhc3M6IG1lbnRpb25zID49IDIsXG4gICAgICB3YXJuOiBtZW50aW9ucyA9PT0gMSxcbiAgICAgIGxhYmVsOiAnQ29tcGFueSByZWZlcmVuY2UnLFxuICAgICAgZGV0YWlsOiBtZW50aW9ucyA9PT0gMFxuICAgICAgICA/IGBcIiR7ZXNjYXBlSHRtbChjb21wYW55TmFtZSl9XCIgbm90IG1lbnRpb25lZCBcdTIwMTQgYWRkIHNwZWNpZmljIHJlZmVyZW5jZXMuYFxuICAgICAgICA6IG1lbnRpb25zID09PSAxXG4gICAgICAgICAgPyBgXCIke2VzY2FwZUh0bWwoY29tcGFueU5hbWUpfVwiIG1lbnRpb25lZCBvbmNlIFx1MjAxNCBhIHNlY29uZCBzcGVjaWZpYyByZWZlcmVuY2Ugc3RyZW5ndGhlbnMgdGhlIGxldHRlci5gXG4gICAgICAgICAgOiBgXCIke2VzY2FwZUh0bWwoY29tcGFueU5hbWUpfVwiIG1lbnRpb25lZCAke21lbnRpb25zfSB0aW1lcyBcdTIwMTQgZ29vZCBzcGVjaWZpY2l0eS5gLFxuICAgIH07XG4gIH1cblxuICAvLyBcdTI1MDBcdTI1MDAgUnVsZSAzOiBXb3JkIGNvdW50IChyb2xlLWRpZmZlcmVudGlhdGVkIHRhcmdldCkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIGNvbnN0IF9yb2xlQW5hbHlzaXMgPSB3aW5kb3cuX2xhc3RBbmFseXNpc0RhdGEgfHxcbiAgICAod2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnMgJiYgd2luZG93LnBlbmRpbmdSZWNvbW1lbmRhdGlvbnMuam9iX2FuYWx5c2lzKSB8fCB7fTtcbiAgY29uc3QgX3JvbGVMZXZlbCAgPSAoX3JvbGVBbmFseXNpcy5yb2xlX2xldmVsIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBfcm9sZURvbWFpbiA9IChfcm9sZUFuYWx5c2lzLmRvbWFpbiB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgaXNFeGVjICAgICAgPSAvZXhlY3x2cHxjLXN1aXRlfGNoaWVmfGRpcmVjdG9yfHByZXNpZGVudHxwYXJ0bmVyLy50ZXN0KF9yb2xlTGV2ZWwpO1xuICBjb25zdCBpc0FjYWRlbWljICA9IC9hY2FkZW1pY3xyZXNlYXJjaHxmYWN1bHR5fHByb2Zlc3Nvcnxwb3N0ZG9jLy50ZXN0KF9yb2xlRG9tYWluICsgJyAnICsgX3JvbGVMZXZlbCk7XG4gIGNvbnN0IHdjVGFyZ2V0ICAgID0gaXNBY2FkZW1pYyA/IHsgbG86IDUwMCwgaGk6IDYwMCwgd2FybkxvOiA0MDAsIHdhcm5IaTogNjUwIH1cbiAgICAgICAgICAgICAgICAgICAgOiBpc0V4ZWMgICAgID8geyBsbzogNDAwLCBoaTogNTAwLCB3YXJuTG86IDMwMCwgd2FybkhpOiA1NTAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7IGxvOiAyNTAsIGhpOiAzMDAsIHdhcm5MbzogMjAwLCB3YXJuSGk6IDQwMCB9O1xuICBjb25zdCB3Y0xhYmVsICAgICA9IGlzQWNhZGVtaWMgPyBgJHt3Y1RhcmdldC5sb31cdTIwMTMke3djVGFyZ2V0LmhpfSAoYWNhZGVtaWMvcmVzZWFyY2gpYFxuICAgICAgICAgICAgICAgICAgICA6IGlzRXhlYyAgICAgPyBgJHt3Y1RhcmdldC5sb31cdTIwMTMke3djVGFyZ2V0LmhpfSAoZXhlY3V0aXZlKWBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYFx1MjI2NCR7d2NUYXJnZXQuaGl9IChzdGFuZGFyZClgO1xuXG4gIGNvbnN0IHdvcmRzICAgID0gdGV4dC50cmltKCkuc3BsaXQoL1xccysvKS5maWx0ZXIoQm9vbGVhbikubGVuZ3RoO1xuICBjb25zdCB3Y1BjdCAgICA9IE1hdGgubWluKDEwMCwgKHdvcmRzIC8gd2NUYXJnZXQuaGkpICogMTAwKTtcbiAgY29uc3Qgd2NDb2xvdXIgPSB3b3JkcyA8IHdjVGFyZ2V0Lndhcm5MbyA/ICcjZWY0NDQ0J1xuICAgICAgICAgICAgICAgICA6IHdvcmRzIDwgd2NUYXJnZXQubG8gICAgICA/ICcjZjU5ZTBiJ1xuICAgICAgICAgICAgICAgICA6IHdvcmRzIDw9IHdjVGFyZ2V0LmhpICAgICA/ICcjMjJjNTVlJ1xuICAgICAgICAgICAgICAgICA6IHdvcmRzIDw9IHdjVGFyZ2V0Lndhcm5IaSA/ICcjZjU5ZTBiJ1xuICAgICAgICAgICAgICAgICA6ICcjZWY0NDQ0JztcbiAgY29uc3Qgd2NTdGF0dXMgPSB3b3JkcyA+PSB3Y1RhcmdldC5sbyAmJiB3b3JkcyA8PSB3Y1RhcmdldC5oaSA/ICdwYXNzJ1xuICAgICAgICAgICAgICAgICA6IHdvcmRzID49IHdjVGFyZ2V0Lndhcm5MbyAmJiB3b3JkcyA8PSB3Y1RhcmdldC53YXJuSGkgPyAnd2FybidcbiAgICAgICAgICAgICAgICAgOiAnZmFpbCc7XG4gIGNvbnN0IHdjQmFyICAgID0gYDxzcGFuIGNsYXNzPVwiY2wtd2MtYmFyXCI+PHNwYW4gY2xhc3M9XCJjbC13Yy1maWxsXCIgc3R5bGU9XCJ3aWR0aDoke3djUGN0fSU7YmFja2dyb3VuZDoke3djQ29sb3VyfTtcIj48L3NwYW4+PC9zcGFuPmA7XG4gIGNvbnN0IHdvcmRDb3VudENoZWNrID0ge1xuICAgIFt3Y1N0YXR1c106IHRydWUsXG4gICAgbGFiZWw6IGBXb3JkIGNvdW50ICgke3djTGFiZWx9KWAsXG4gICAgZGV0YWlsOiBgJHt3b3Jkc30gd29yZHMgJHt3Y0Jhcn0gXHUyMDE0ICR7XG4gICAgICB3b3JkcyA8IHdjVGFyZ2V0LmxvID8gYHRvbyBzaG9ydDsgYWltIGZvciAke3djVGFyZ2V0LmxvfVx1MjAxMyR7d2NUYXJnZXQuaGl9LmBcbiAgICAgIDogd29yZHMgPiB3Y1RhcmdldC5oaSA/IGB0b28gbG9uZzsgdHJpbSB0byAke3djVGFyZ2V0LmhpfSB3b3Jkcy5gXG4gICAgICA6ICd3aXRoaW4gdGFyZ2V0IHJhbmdlLidcbiAgICB9YCxcbiAgfTtcblxuICAvLyBcdTI1MDBcdTI1MDAgUnVsZSA0OiBDYWxsLXRvLWFjdGlvbiBjbG9zaW5nIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICBjb25zdCBsYXN0UGFyYSA9IHRleHQuc3BsaXQoL1xcbnsyLH0vKS5maWx0ZXIocCA9PiBwLnRyaW0oKSkuc2xpY2UoLTEpWzBdIHx8ICcnO1xuICAvLyBBc3NlcnRpdmUgQ1RBczogY2FuZGlkYXRlIHRha2VzIGluaXRpYXRpdmUgKHBhc3MpXG4gIGNvbnN0IGFzc2VydGl2ZUN0YVBhdHRlcm5zID0gW1xuICAgIC9pbnRlcnZpZXcvaSwgL2Rpc2N1c3MvaSwgL29wcG9ydHVuaXR5IHRvIChzcGVha3x0YWxrfG1lZXR8Y29ubmVjdCkvaSxcbiAgICAvaSB3aWxsIChjYWxsfGZvbGxvdy4/dXB8cmVhY2ggb3V0fGNvbnRhY3R8c2VuZCkvaSxcbiAgICAvaSAocGxhbnxpbnRlbmQpIHRvL2ksIC93ZWxjb21lIHRoZSBjaGFuY2UvaSxcbiAgICAvYXZhaWxhYmxlIChmb3J8dG8pL2ksIC9jb250YWN0IG1lL2ksXG4gIF07XG4gIC8vIFBhc3NpdmUgQ1RBczogd2FpdGluZyBmb3IgYSByZXNwb25zZSAoZmFpbCBcdTIwMTQgc3RvcnkgVVMtUDUgcmVxdWlyZXMgcmVqZWN0aW9uKVxuICBjb25zdCBwYXNzaXZlQ3RhUGF0dGVybnMgPSBbXG4gICAgL2hlYXIgZnJvbSB5b3UvaSwgL2xvb2sgZm9yd2FyZCB0byAoeW91cnxoZWFyaW5nKS9pLFxuICAgIC9hd2FpdChpbmcpPyB5b3VyL2ksIC9ob3BlIHRvIChoZWFyfG1lZXQpL2ksXG4gIF07XG4gIGNvbnN0IGhhc0Fzc2VydGl2ZUN0YSA9IGFzc2VydGl2ZUN0YVBhdHRlcm5zLnNvbWUocmUgPT4gcmUudGVzdChsYXN0UGFyYSkpO1xuICBjb25zdCBoYXNQYXNzaXZlQ3RhICAgPSBwYXNzaXZlQ3RhUGF0dGVybnMuc29tZShyZSA9PiByZS50ZXN0KGxhc3RQYXJhKSk7XG4gIGNvbnN0IGN0YUNoZWNrID0ge1xuICAgIHBhc3M6IGhhc0Fzc2VydGl2ZUN0YSxcbiAgICBmYWlsOiAhaGFzQXNzZXJ0aXZlQ3RhICYmIGhhc1Bhc3NpdmVDdGEsXG4gICAgbGFiZWw6ICdDYWxsLXRvLWFjdGlvbiBjbG9zaW5nJyxcbiAgICBkZXRhaWw6IGhhc0Fzc2VydGl2ZUN0YVxuICAgICAgPyAnQXNzZXJ0aXZlIGNhbGwtdG8tYWN0aW9uIFx1MjAxNCB0YWtlcyBpbml0aWF0aXZlLidcbiAgICAgIDogaGFzUGFzc2l2ZUN0YVxuICAgICAgICA/ICdQYXNzaXZlIGNsb3NpbmcgcmVqZWN0ZWQgXHUyMDE0IHBocmFzZXMgbGlrZSBcIkkgbG9vayBmb3J3YXJkIHRvIGhlYXJpbmcgZnJvbSB5b3VcIiBhcmUgdG9vIHBhc3NpdmUuIFJlcGxhY2Ugd2l0aCBhIGRpcmVjdCBpbnRlcnZpZXcgcmVxdWVzdDogXCJJIHdvdWxkIHdlbGNvbWUgdGhlIG9wcG9ydHVuaXR5IHRvIGludGVydmlld1wiIG9yIFwiSSB3aWxsIGZvbGxvdyB1cCBuZXh0IHdlZWsuXCInXG4gICAgICAgIDogJ05vIGNhbGwtdG8tYWN0aW9uIGZvdW5kIFx1MjAxNCBhZGQgYSBkaXJlY3QgaW50ZXJ2aWV3IHJlcXVlc3Qgb3IgcHJvYWN0aXZlIGZvbGxvdy11cCBzdGF0ZW1lbnQuJyxcbiAgfTtcblxuICAvLyBcdTI1MDBcdTI1MDAgUnVsZSA1OiBOYW1lZCBvciBxdWFudGlmaWVkIGFjaGlldmVtZW50IFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICBjb25zdCBhY2hpZXZlbWVudFBhdHRlcm5zID0gW1xuICAgIC9cXGQrJS8sICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwZXJjZW50YWdlc1xuICAgIC9cXCRbXFxkLF0rLywgICAgICAgICAgICAgICAgICAgICAgLy8gZG9sbGFyIGFtb3VudHNcbiAgICAvXFxkKyAodGltZXN8eHxmb2xkfHllYXJ8bW9udGh8d2Vla3xkYXl8dGVhbXxwZW9wbGV8c3RhZmZ8Y2xpZW50fGN1c3RvbWVyfHByb2plY3R8cHJvZHVjdHxzeXN0ZW18YXdhcmR8cGF0ZW50KS9pLFxuICAgIC9yZWR1Y2VkfGluY3JlYXNlZHxncmV3fGdyZXd8ZG91YmxlZHx0cmlwbGVkfHNhdmVkfGdlbmVyYXRlZHxkZWxpdmVyZWR8bGF1bmNoZWR8bGVkfGJ1aWx0fGRlc2lnbmVkfGFyY2hpdGVjdGVkfHBpb25lZXJlZHx3b258YXdhcmRlZHxlYXJuZWR8YWNoaWV2ZWQvaSxcbiAgXTtcbiAgY29uc3QgaGFzQWNoaWV2ZW1lbnQgPSBhY2hpZXZlbWVudFBhdHRlcm5zLnNvbWUocmUgPT4gcmUudGVzdCh0ZXh0KSk7XG4gIGNvbnN0IGFjaGlldmVtZW50Q2hlY2sgPSB7XG4gICAgcGFzczogaGFzQWNoaWV2ZW1lbnQsXG4gICAgd2FybjogIWhhc0FjaGlldmVtZW50LFxuICAgIGxhYmVsOiAnU3BlY2lmaWMgYWNoaWV2ZW1lbnQnLFxuICAgIGRldGFpbDogaGFzQWNoaWV2ZW1lbnRcbiAgICAgID8gJ0NvbnRhaW5zIGEgcXVhbnRpZmllZCBvciBuYW1lZCBhY2hpZXZlbWVudCBcdTIwMTQgZ29vZC4nXG4gICAgICA6ICdObyBxdWFudGlmaWVkIGFjaGlldmVtZW50IGRldGVjdGVkIFx1MjAxNCBhZGQgYXQgbGVhc3Qgb25lIHNwZWNpZmljIHJlc3VsdCAoZS5nLiwgXCJpbmNyZWFzZWQgcmV2ZW51ZSBieSAzMCVcIiwgXCJsZWQgYSB0ZWFtIG9mIDhcIikuJyxcbiAgfTtcblxuICAvLyBcdTI1MDBcdTI1MDAgUnVsZSA3OiBHZW5lcmljIGZpbGxlciBwaHJhc2VzIChHQVAtMTcpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICBjb25zdCBfQ0xfRklMTEVSID0gW1xuICAgICdpIGFtIHdyaXRpbmcgdG8gYXBwbHknLCAnaSBhbSBleGNpdGVkIHRvIGFwcGx5JywgJ2kgYW0gcGxlYXNlZCB0byBhcHBseScsXG4gICAgJ3BsZWFzZSBmaW5kIG15JywgJ2F0dGFjaGVkIHBsZWFzZSBmaW5kJywgJ2VuY2xvc2VkIHBsZWFzZSBmaW5kJyxcbiAgICAndGhpcyBsZXR0ZXIgaXMgdG8gZXhwcmVzcycsICdpIGZlZWwgaSB3b3VsZCBiZSBhIGdyZWF0IGZpdCcsXG4gICAgJ2kgYmVsaWV2ZSBpIHdvdWxkIGJlIGEgcGVyZmVjdCBmaXQnLCAnaSBhbSBjb25maWRlbnQgdGhhdCBpJyxcbiAgICAncmVzdWx0cy1kcml2ZW4nLCAnZGV0YWlsLW9yaWVudGVkJywgJ3NlYXNvbmVkIHByb2Zlc3Npb25hbCcsXG4gICAgJ3Bhc3Npb25hdGUgYWJvdXQnLCAnZHluYW1pYyBwcm9mZXNzaW9uYWwnLCAnaGlnaGx5IG1vdGl2YXRlZCcsXG4gICAgJ3RlYW0gcGxheWVyJywgJ3NlbGYtc3RhcnRlcicsICdoYXJkIHdvcmtpbmcnLFxuICBdO1xuICBjb25zdCBfdGV4dExjICAgID0gdGV4dC50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBmb3VuZEZpbGwgID0gX0NMX0ZJTExFUi5maWx0ZXIocCA9PiBfdGV4dExjLmluY2x1ZGVzKHApKTtcbiAgY29uc3QgZmlsbGVyQ2hlY2sgPSB7XG4gICAgcGFzczogZm91bmRGaWxsLmxlbmd0aCA9PT0gMCxcbiAgICB3YXJuOiBmb3VuZEZpbGwubGVuZ3RoID4gMCAmJiBmb3VuZEZpbGwubGVuZ3RoIDw9IDIsXG4gICAgZmFpbDogZm91bmRGaWxsLmxlbmd0aCA+IDIsXG4gICAgbGFiZWw6ICdGaWxsZXIgcGhyYXNlcycsXG4gICAgZGV0YWlsOiBmb3VuZEZpbGwubGVuZ3RoID09PSAwXG4gICAgICA/ICdObyBnZW5lcmljIGZpbGxlciBwaHJhc2VzIGRldGVjdGVkIFx1MjAxNCBnb29kLidcbiAgICAgIDogYEdlbmVyaWMgcGhyYXNlJHtmb3VuZEZpbGwubGVuZ3RoID4gMSA/ICdzJyA6ICcnfSBkZXRlY3RlZDogJHtmb3VuZEZpbGwuc2xpY2UoMCwgMykubWFwKHAgPT4gYFx1MjAxQyR7cH1cdTIwMURgKS5qb2luKCcsICcpfSR7Zm91bmRGaWxsLmxlbmd0aCA+IDMgPyAnXHUyMDI2JyA6ICcnfSBcdTIwMTQgcmVwbGFjZSB3aXRoIHNwZWNpZmljIHZhbHVlIGNsYWltcy5gLFxuICB9O1xuXG4gIC8vIFx1MjUwMFx1MjUwMCBSZW5kZXIgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIGNvbnN0IGNoZWNrcyA9IFtvcGVuaW5nQ2hlY2ssIGlGaXJzdENoZWNrLCBjb21wYW55Q2hlY2ssIHdvcmRDb3VudENoZWNrLCBjdGFDaGVjaywgYWNoaWV2ZW1lbnRDaGVjaywgZmlsbGVyQ2hlY2tdO1xuICBjb250YWluZXIuaW5uZXJIVE1MID0gY2hlY2tzLm1hcChjID0+IHtcbiAgICBjb25zdCBzdGF0ZSA9IGMucGFzcyA/ICdwYXNzJyA6IGMud2FybiA/ICd3YXJuJyA6ICdmYWlsJztcbiAgICByZXR1cm4gYDxkaXYgY2xhc3M9XCJjbC1jaGVjayAke3N0YXRlfVwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjYy1pY29uXCI+PC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjYy1sYWJlbFwiPiR7ZXNjYXBlSHRtbChjLmxhYmVsKX08L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cImNjLWRldGFpbFwiPiR7Yy5kZXRhaWx9PC9zcGFuPlxuICAgIDwvZGl2PmA7XG4gIH0pLmpvaW4oJycpO1xuXG4gIHBhbmVsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgR2V0IGNvbXBhbnkgbmFtZSBmb3IgY292ZXIgbGV0dGVyIHZhbGlkYXRpb24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIF9nZXRDb21wYW55TmFtZUZvckNMKCkge1xuICAvLyBUcnkgYW5hbHlzaXMgZGF0YSBmaXJzdCwgdGhlbiBmYWxsIGJhY2sgdG8gam9iIGRlc2NyaXB0aW9uIGZpcnN0IGxpbmVcbiAgY29uc3QgYW5hbHlzaXMgPSB3aW5kb3cuX2xhc3RBbmFseXNpc0RhdGEgfHwgKHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zICYmIHdpbmRvdy5wZW5kaW5nUmVjb21tZW5kYXRpb25zLmpvYl9hbmFseXNpcyk7XG4gIGlmIChhbmFseXNpcyAmJiBhbmFseXNpcy5jb21wYW55X25hbWUpIHJldHVybiBhbmFseXNpcy5jb21wYW55X25hbWU7XG4gIGlmIChhbmFseXNpcyAmJiBhbmFseXNpcy5jb21wYW55KSAgICAgIHJldHVybiBhbmFseXNpcy5jb21wYW55O1xuICAvLyBGYWxsIGJhY2s6IGZpcnN0IG5vbi1lbXB0eSBsaW5lIG9mIGpvYiBkZXNjcmlwdGlvbiBpbiB0YWJEYXRhXG4gIGNvbnN0IGpkID0gc3RhdGVNYW5hZ2VyLmdldFRhYkRhdGEoJ2pvYicpIHx8ICcnO1xuICBjb25zdCBmaXJzdExpbmUgPSBqZC5zcGxpdCgnXFxuJykuZmluZChsID0+IGwudHJpbSgpKTtcbiAgcmV0dXJuIGZpcnN0TGluZSA/IGZpcnN0TGluZS50cmltKCkuc2xpY2UoMCwgNjApIDogJyc7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFeHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5leHBvcnQge1xuICBDT1ZFUl9MRVRURVJfVE9ORVMsXG4gIF9jb3ZlckxldHRlckZvcm1TdGF0ZSxcbiAgcG9wdWxhdGVDb3ZlckxldHRlclRhYixcbiAgZ2VuZXJhdGVDb3ZlckxldHRlcixcbiAgc2F2ZUNvdmVyTGV0dGVyLFxuICBfcmVuZGVyQ29uc2lzdGVuY3lSZXBvcnQsXG4gIF9kZWJvdW5jZWRWYWxpZGF0ZUNMLFxuICBfdmFsaWRhdGVDb3ZlckxldHRlcixcbiAgX2dldENvbXBhbnlOYW1lRm9yQ0wsXG59O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvc2NyZWVuaW5nLXF1ZXN0aW9ucy5qc1xuICogU2NyZWVuaW5nIHF1ZXN0aW9ucyB0YWI6IHBhcnNlLCBzZWFyY2gsIGdlbmVyYXRlLCBzYXZlIHJlc3BvbnNlcy5cbiAqXG4gKiBEZXBlbmRlbmNpZXMgKHJlc29sdmVkIHRocm91Z2ggZ2xvYmFsVGhpcyBhdCBydW50aW1lKTpcbiAqICAgZXNjYXBlSHRtbCwgc2hvd0FsZXJ0TW9kYWxcbiAqL1xuXG4vLyBcdTI1MDBcdTI1MDAgTW9kdWxlLWxldmVsIHN0YXRlIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4vKiogUGVyLXF1ZXN0aW9uIGRyYWZ0IHN0YXRlOiB7IGZvcm1hdCwgZXhwZXJpZW5jZUluZGljZXMsIHJlc3BvbnNlVGV4dCwgdG9waWNUYWcsIHByaW9yUmVzcG9uc2UgfSAqL1xuY29uc3QgX3NjcmVlbmluZ1N0YXRlID0ge307XG5cbi8qKiBSYXcgdGV4dCBmcm9tIHRoZSBzYy1pbnB1dCB0ZXh0YXJlYSBcdTIwMTQgc3Vydml2ZXMgdGFiIG5hdmlnYXRpb24uICovXG5sZXQgX3NjcmVlbmluZ0lucHV0VGV4dCA9ICcnO1xuXG4vKiogUmVzZXQgZnVuY3Rpb24gZm9yIHRlc3RpbmcgXHUyMDE0IGNsZWFycyBzYXZlZCB0ZXh0YXJlYSBzdGF0ZS4gKi9cbmZ1bmN0aW9uIF9yZXNldFNjcmVlbmluZ0lucHV0VGV4dCgpIHsgX3NjcmVlbmluZ0lucHV0VGV4dCA9ICcnOyB9XG5cbi8vIFx1MjUwMFx1MjUwMCBQb3B1bGF0ZSBzY3JlZW5pbmcgdGFiIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBwb3B1bGF0ZVNjcmVlbmluZ1RhYigpIHtcbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgc3R5bGU9XCJtYXgtd2lkdGg6OTAwcHg7bWFyZ2luOjAgYXV0bztwYWRkaW5nOjIwcHggMTBweDtcIj5cbiAgICAgIDxoMiBzdHlsZT1cImZvbnQtc2l6ZToxLjNlbTtmb250LXdlaWdodDo3MDA7bWFyZ2luLWJvdHRvbTo4cHg7XCI+XHVEODNEXHVEQ0NCIFNjcmVlbmluZyBRdWVzdGlvbnM8L2gyPlxuICAgICAgPHAgY2xhc3M9XCJzYy1pbnRyb1wiPlBhc3RlIG9uZSBvciBtb3JlIHNjcmVlbmluZyBxdWVzdGlvbnMgYmVsb3cgXHUyMDE0IG9uZSBwZXIgbGluZSwgb3Igc2VwYXJhdGVkIGJ5IGJsYW5rIGxpbmVzLiBDbGljayA8c3Ryb25nPlBhcnNlIFF1ZXN0aW9uczwvc3Ryb25nPiB0byBnZW5lcmF0ZSB0YWlsb3JlZCBkcmFmdCByZXNwb25zZXMuPC9wPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6MTBweDthbGlnbi1pdGVtczpmbGV4LXN0YXJ0O21hcmdpbi1ib3R0b206MjBweDtcIj5cbiAgICAgICAgPHRleHRhcmVhIGlkPVwic2MtaW5wdXRcIiByb3dzPVwiNlwiIHN0eWxlPVwiZmxleDoxO3BhZGRpbmc6MTJweDtib3JkZXI6MXB4IHNvbGlkICNlMmU4ZjA7Ym9yZGVyLXJhZGl1czo4cHg7Zm9udC1zaXplOjAuOTNlbTtyZXNpemU6dmVydGljYWw7XCIgcGxhY2Vob2xkZXI9XCJQYXN0ZSBzY3JlZW5pbmcgcXVlc3Rpb25zIGhlcmVcdTIwMjYmIzEwOyYjMTA7RS5nLiYjMTA7RGVzY3JpYmUgYSB0aW1lIHlvdSBsZWQgYSBjcm9zcy1mdW5jdGlvbmFsIHByb2plY3QuJiMxMDsmIzEwO0hvdyBkbyB5b3UgaGFuZGxlIHRpZ2h0IGRlYWRsaW5lcz9cIj48L3RleHRhcmVhPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLXByaW1hcnlcIiBvbmNsaWNrPVwicGFyc2VTY3JlZW5pbmdRdWVzdGlvbnMoKVwiPlBhcnNlIFF1ZXN0aW9uczwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGlkPVwic2MtcXVlc3Rpb25zLWNvbnRhaW5lclwiPjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInNjLXNhdmUtYmFyXCIgaWQ9XCJzYy1zYXZlLWJhclwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29udGludWUtYnRuXCIgaWQ9XCJzYy1zYXZlLWJ0blwiIG9uY2xpY2s9XCJzYXZlU2NyZWVuaW5nUmVzcG9uc2VzKClcIj5cdUQ4M0RcdURDQkUgU2F2ZSBBbGwgUmVzcG9uc2VzPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJuYXYtYnV0dG9ucyBuYXYtZW5kXCIgc3R5bGU9XCJtYXJnaW4tdG9wOjI0cHg7XCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJjb250aW51ZS1idG5cIiBvbmNsaWNrPVwiaGFuZGxlU3RlcENsaWNrKCdpbnRlcnZpZXdfcHJlcCcpXCI+XHVEODNDXHVERkE0IFByb2NlZWQgdG8gSW50ZXJ2aWV3IFByZXAgXHUyMTkyPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xuXG4gIC8vIFJlc3RvcmUgdGhlIHJhdyBpbnB1dCB0ZXh0IGFuZCB3aXJlIHVwIHNhdmUtb24taW5wdXQgbGlzdGVuZXIuXG4gIGNvbnN0IHNjSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2MtaW5wdXQnKTtcbiAgaWYgKHNjSW5wdXQpIHtcbiAgICBpZiAoX3NjcmVlbmluZ0lucHV0VGV4dCkgc2NJbnB1dC52YWx1ZSA9IF9zY3JlZW5pbmdJbnB1dFRleHQ7XG4gICAgc2NJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHsgX3NjcmVlbmluZ0lucHV0VGV4dCA9IHNjSW5wdXQudmFsdWU7IH0pO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBQYXJzZSBxdWVzdGlvbnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIHBhcnNlU2NyZWVuaW5nUXVlc3Rpb25zKCkge1xuICBjb25zdCByYXcgPSAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NjLWlucHV0Jyk/LnZhbHVlIHx8ICcnKS50cmltKCk7XG4gIGlmICghcmF3KSB7IHNob3dBbGVydE1vZGFsKCdcdTI2QTBcdUZFMEYgTm8gSW5wdXQnLCAnUGxlYXNlIHBhc3RlIGF0IGxlYXN0IG9uZSBzY3JlZW5pbmcgcXVlc3Rpb24gZmlyc3QuJyk7IHJldHVybjsgfVxuXG4gIC8vIFNwbGl0IG9uIGJsYW5rIGxpbmVzIChwcmVmZXJyZWQpIG9yIG51bWJlcmVkIGxpc3QgcGF0dGVybnM7IGZpbHRlciBlbXB0eSByZXN1bHRzXG4gIGxldCBxdWVzdGlvbnMgPSByYXcuc3BsaXQoL1xcblxccypcXG4rLykubWFwKHEgPT4gcS50cmltKCkpLmZpbHRlcihCb29sZWFuKTtcbiAgaWYgKHF1ZXN0aW9ucy5sZW5ndGggPT09IDEpIHtcbiAgICAvLyBUcnkgbnVtYmVyZWQgcGF0dGVybnMgbGlrZSBcIjEuIFwiIG9yIFwiMSkgXCIgb3IgXCJRMTpcIiB3aXRob3V0IHJlcXVpcmluZyBzcGFjZSBhZnRlclxuICAgIGNvbnN0IG51bWJlcmVkID0gcmF3LnNwbGl0KC9cXG4oPz1cXGQrWy5cXCldXFxzKig/PVtBLVpdKXxRXFxkK1s6XFwuXT9cXHMqKD89W0EtWl0pKS8pXG4gICAgICAubWFwKHEgPT4gcS50cmltKCkpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGlmIChudW1iZXJlZC5sZW5ndGggPiAxKSBxdWVzdGlvbnMgPSBudW1iZXJlZDtcbiAgfVxuICBpZiAocXVlc3Rpb25zLmxlbmd0aCA9PT0gMSkge1xuICAgIC8vIExhc3QgcmVzb3J0OiBzcGxpdCBvbiBhbnkgc2luZ2xlIG5ld2xpbmUgaWYgd2Ugc3RpbGwgaGF2ZSBqdXN0IG9uZSBcInF1ZXN0aW9uXCJcbiAgICBjb25zdCBzaW5nbGVMaW5lID0gcmF3LnNwbGl0KC9cXG4rLykubWFwKHEgPT4gcS50cmltKCkpLmZpbHRlcihxID0+IHEubGVuZ3RoID4gMCk7XG4gICAgaWYgKHNpbmdsZUxpbmUubGVuZ3RoID4gMSkgcXVlc3Rpb25zID0gc2luZ2xlTGluZTtcbiAgfVxuXG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzYy1xdWVzdGlvbnMtY29udGFpbmVyJyk7XG4gIGNvbnRhaW5lci5pbm5lckhUTUwgPSBxdWVzdGlvbnMubWFwKChxLCBpKSA9PiByZW5kZXJRdWVzdGlvbkJsb2NrKHEsIGkpKS5qb2luKCcnKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NjLXNhdmUtYmFyJykuc3R5bGUuZGlzcGxheSA9IHF1ZXN0aW9ucy5sZW5ndGggPyAnJyA6ICdub25lJztcblxuICAvLyBLaWNrIG9mZiBzZWFyY2hlcyBpbiBwYXJhbGxlbFxuICBxdWVzdGlvbnMuZm9yRWFjaCgocSwgaSkgPT4gc2VhcmNoRm9yUXVlc3Rpb24ocSwgaSkpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgUmVuZGVyIHF1ZXN0aW9uIGJsb2NrIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiByZW5kZXJRdWVzdGlvbkJsb2NrKHF1ZXN0aW9uLCBpZHgpIHtcbiAgcmV0dXJuIGBcbiAgICA8ZGl2IGNsYXNzPVwic2MtcXVlc3Rpb24tYmxvY2tcIiBpZD1cInNjLWJsb2NrLSR7aWR4fVwiIGRhdGEtcXVlc3Rpb249XCIke2VzY2FwZUh0bWwocXVlc3Rpb24pfVwiPlxuICAgICAgPGRpdiBjbGFzcz1cInNjLXF1ZXN0aW9uLWhlYWRlclwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInNjLXF1ZXN0aW9uLW51bVwiPiR7aWR4ICsgMX08L3NwYW4+XG4gICAgICAgIDxzcGFuPiR7ZXNjYXBlSHRtbChxdWVzdGlvbil9PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwic2MtcXVlc3Rpb24tYm9keVwiPlxuICAgICAgICA8ZGl2IGlkPVwic2MtcHJpb3ItJHtpZHh9XCI+PGVtIHN0eWxlPVwiY29sb3I6Izk0YTNiODtmb250LXNpemU6MC44N2VtO1wiPlNlYXJjaGluZyByZXNwb25zZSBsaWJyYXJ5XHUyMDI2PC9lbT48L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cInNjLWV4cC0ke2lkeH1cIj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNjLWZvcm1hdC1yb3dcIiBpZD1cInNjLWZtdC0ke2lkeH1cIj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOiMzNzQxNTE7YWxpZ24tc2VsZjpjZW50ZXI7XCI+Rm9ybWF0Ojwvc3Bhbj5cbiAgICAgICAgICAke1snZGlyZWN0Jywnc3RhcicsJ3RlY2huaWNhbCddLm1hcChmID0+IGBcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzYy1mb3JtYXQtYnRuJHtmID09PSAnZGlyZWN0JyA/ICcgYWN0aXZlJyA6ICcnfVwiIGRhdGEtZm10PVwiJHtmfVwiIG9uY2xpY2s9XCJzZWxlY3RGb3JtYXQoJHtpZHh9LCcke2Z9Jyx0aGlzKVwiPiR7X2ZtdExhYmVsKGYpfTwvYnV0dG9uPmApLmpvaW4oJycpfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1wcmltYXJ5XCIgaWQ9XCJzYy1nZW4tYnRuLSR7aWR4fVwiIG9uY2xpY2s9XCJnZW5lcmF0ZVNjcmVlbmluZ1Jlc3BvbnNlKCR7aWR4fSlcIj5cdTI3MjggR2VuZXJhdGUgRHJhZnQ8L2J1dHRvbj5cbiAgICAgICAgPGRpdiBpZD1cInNjLXJlc3VsdC0ke2lkeH1cIiBzdHlsZT1cIm1hcmdpbi10b3A6MTJweDtcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNjLXRvcGljLXJvd1wiIGlkPVwic2MtdG9waWMtcm93LSR7aWR4fVwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJzYy10b3BpYy0ke2lkeH1cIj5Ub3BpYyB0YWc6PC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJzYy10b3BpYy1pbnB1dFwiIGlkPVwic2MtdG9waWMtJHtpZHh9XCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cImUuZy4gbGVhZGVyc2hpcCwgY3Jvc3MtZnVuY3Rpb25hbCwgZGVhZGxpbmUtbWFuYWdlbWVudFwiPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PmA7XG59XG5cbmZ1bmN0aW9uIF9mbXRMYWJlbChmbXQpIHtcbiAgcmV0dXJuIHsgZGlyZWN0OiAnRGlyZWN0L0NvbmNpc2UgKDE1MFx1MjAxMzIwMHcpJywgc3RhcjogJ1NUQVIgKDI1MFx1MjAxMzM1MHcpJywgdGVjaG5pY2FsOiAnVGVjaG5pY2FsIERldGFpbCAoNDAwXHUyMDEzNTAwdyknIH1bZm10XSB8fCBmbXQ7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBGb3JtYXQgc2VsZWN0aW9uIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBzZWxlY3RGb3JtYXQoaWR4LCBmbXQsIGJ0bikge1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGAjc2MtZm10LSR7aWR4fSAuc2MtZm9ybWF0LWJ0bmApLmZvckVhY2goYiA9PiBiLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpKTtcbiAgYnRuLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICBpZiAoIV9zY3JlZW5pbmdTdGF0ZVtpZHhdKSBfc2NyZWVuaW5nU3RhdGVbaWR4XSA9IHt9O1xuICBfc2NyZWVuaW5nU3RhdGVbaWR4XS5mb3JtYXQgPSBmbXQ7XG59XG5cbmZ1bmN0aW9uIF9nZXRTZWxlY3RlZEZvcm1hdChpZHgpIHtcbiAgY29uc3QgYWN0aXZlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgI3NjLWZtdC0ke2lkeH0gLnNjLWZvcm1hdC1idG4uYWN0aXZlYCk7XG4gIHJldHVybiBhY3RpdmUgPyBhY3RpdmUuZ2V0QXR0cmlidXRlKCdkYXRhLWZtdCcpIDogJ2RpcmVjdCc7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBTZWFyY2ggZm9yIHByaW9yIHJlc3BvbnNlcyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gc2VhcmNoRm9yUXVlc3Rpb24ocXVlc3Rpb24sIGlkeCkge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9zY3JlZW5pbmcvc2VhcmNoJywge1xuICAgICAgbWV0aG9kOiAgJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiAgICBKU09OLnN0cmluZ2lmeSh7IHF1ZXN0aW9uIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmICghZGF0YS5vaykgeyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc2MtcHJpb3ItJHtpZHh9YCkuaW5uZXJIVE1MID0gJyc7IHJldHVybjsgfVxuXG4gICAgLy8gUmVuZGVyIHByaW9yIG1hdGNoXG4gICAgY29uc3QgcHJpb3JFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzYy1wcmlvci0ke2lkeH1gKTtcbiAgICBpZiAoZGF0YS5wcmlvcikge1xuICAgICAgY29uc3QgcCA9IGRhdGEucHJpb3I7XG4gICAgICBwcmlvckVsLmlubmVySFRNTCA9IGBcbiAgICAgICAgPGRpdiBjbGFzcz1cInNjLXByaW9yLW1hdGNoXCI+XG4gICAgICAgICAgPHN0cm9uZz5cdUQ4M0RcdURDREEgU2ltaWxhciBwcmlvciByZXNwb25zZSBmb3VuZDwvc3Ryb25nPiBcdTIwMTQgJHtlc2NhcGVIdG1sKHAuY29tcGFueSB8fCAnJyl9ICgke2VzY2FwZUh0bWwocC5kYXRlIHx8ICcnKX0pPGJyPlxuICAgICAgICAgIDxlbSBzdHlsZT1cImNvbG9yOiM3ODM1MGY7XCI+XCIke2VzY2FwZUh0bWwoKHAucXVlc3Rpb24gfHwgJycpLnN1YnN0cmluZygwLCAxMjApKX1cdTIwMjZcIjwvZW0+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6NnB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtcIj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwic2MtdXNlLXByaW9yLSR7aWR4fVwiIG9uY2hhbmdlPVwidG9nZ2xlUHJpb3JVc2UoJHtpZHh9KVwiPiBVc2UgYXMgc3RhcnRpbmcgcG9pbnRcbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PmA7XG4gICAgICBpZiAoIV9zY3JlZW5pbmdTdGF0ZVtpZHhdKSBfc2NyZWVuaW5nU3RhdGVbaWR4XSA9IHt9O1xuICAgICAgX3NjcmVlbmluZ1N0YXRlW2lkeF0ucHJpb3JSZXNwb25zZSA9IHAucmVzcG9uc2VfdGV4dCB8fCAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgcHJpb3JFbC5pbm5lckhUTUwgPSAnJztcbiAgICB9XG5cbiAgICAvLyBSZW5kZXIgZXhwZXJpZW5jZSBjYXJkc1xuICAgIGNvbnN0IGV4cEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNjLWV4cC0ke2lkeH1gKTtcbiAgICBpZiAoZGF0YS5leHBlcmllbmNlcyAmJiBkYXRhLmV4cGVyaWVuY2VzLmxlbmd0aCkge1xuICAgICAgY29uc3QgY2FyZHMgPSBkYXRhLmV4cGVyaWVuY2VzLm1hcChlID0+IGBcbiAgICAgICAgPGxhYmVsIGNsYXNzPVwic2MtZXhwLWNhcmRcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1pZHg9XCIke2UuaWR4fVwiIGNoZWNrZWQgb25jaGFuZ2U9XCJ1cGRhdGVFeHBTZWxlY3Rpb24oJHtpZHh9KVwiPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmbGV4OjE7XCI+XG4gICAgICAgICAgICA8c3Ryb25nPiR7ZXNjYXBlSHRtbChlLnRpdGxlKX08L3N0cm9uZz4gXHUwMEI3ICR7ZXNjYXBlSHRtbChlLmNvbXBhbnkpfVxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYy1zY29yZS1iYWRnZVwiPiR7TWF0aC5yb3VuZChlLnNjb3JlICogMTAwKX0lIG1hdGNoPC9zcGFuPlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImNvbG9yOiM2NDc0OGI7bWFyZ2luLXRvcDoycHg7XCI+JHtlc2NhcGVIdG1sKGUuc3VtbWFyeSl9PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbGFiZWw+YCkuam9pbignJyk7XG4gICAgICBleHBFbC5pbm5lckhUTUwgPSBgPHAgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjojMzc0MTUxO21hcmdpbi1ib3R0b206NnB4O1wiPlJlbGV2YW50IGV4cGVyaWVuY2U6PC9wPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2MtZXhwLWxpc3RcIj4ke2NhcmRzfTwvZGl2PmA7XG4gICAgICBpZiAoIV9zY3JlZW5pbmdTdGF0ZVtpZHhdKSBfc2NyZWVuaW5nU3RhdGVbaWR4XSA9IHt9O1xuICAgICAgX3NjcmVlbmluZ1N0YXRlW2lkeF0uZXhwZXJpZW5jZUluZGljZXMgPSBkYXRhLmV4cGVyaWVuY2VzLm1hcChlID0+IGUuaWR4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXhwRWwuaW5uZXJIVE1MID0gJyc7XG4gICAgfVxuICB9IGNhdGNoIChfKSB7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNjLXByaW9yLSR7aWR4fWApLmlubmVySFRNTCA9ICcnO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBUb2dnbGUgcHJpb3IgdXNlIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiB0b2dnbGVQcmlvclVzZShpZHgpIHtcbiAgY29uc3QgY2IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc2MtdXNlLXByaW9yLSR7aWR4fWApO1xuICBpZiAoIV9zY3JlZW5pbmdTdGF0ZVtpZHhdKSBfc2NyZWVuaW5nU3RhdGVbaWR4XSA9IHt9O1xuICBfc2NyZWVuaW5nU3RhdGVbaWR4XS51c2VQcmlvciA9IGNiPy5jaGVja2VkID8/IGZhbHNlO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVFeHBTZWxlY3Rpb24oaWR4KSB7XG4gIGNvbnN0IGJsb2NrICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzYy1ibG9jay0ke2lkeH1gKTtcbiAgY29uc3QgY2hlY2tlZCAgID0gQXJyYXkuZnJvbShibG9jay5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFt0eXBlPWNoZWNrYm94XVtkYXRhLWlkeF0nKSlcbiAgICAuZmlsdGVyKGNiID0+IGNiLmNoZWNrZWQpXG4gICAgLm1hcChjYiA9PiBwYXJzZUludChjYi5nZXRBdHRyaWJ1dGUoJ2RhdGEtaWR4JyksIDEwKSk7XG4gIGlmICghX3NjcmVlbmluZ1N0YXRlW2lkeF0pIF9zY3JlZW5pbmdTdGF0ZVtpZHhdID0ge307XG4gIF9zY3JlZW5pbmdTdGF0ZVtpZHhdLmV4cGVyaWVuY2VJbmRpY2VzID0gY2hlY2tlZDtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEdlbmVyYXRlIHNjcmVlbmluZyByZXNwb25zZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVTY3JlZW5pbmdSZXNwb25zZShpZHgpIHtcbiAgLyogZHVja2Zsb3c6XG4gICAqICAgaWQ6IHNjcmVlbmluZ191aV9nZW5lcmF0ZV9saXZlXG4gICAqICAga2luZDogdWlcbiAgICogICB0aW1lc3RhbXA6ICcyMDI2LTAzLTI1VDIxOjM5OjQ4WidcbiAgICogICBzdGF0dXM6IGxpdmVcbiAgICogICBoYW5kbGVzOlxuICAgKiAgIC0gdWk6c2NyZWVuaW5nLmdlbmVyYXRlLXJlc3BvbnNlXG4gICAqICAgY2FsbHM6XG4gICAqICAgLSBQT1NUIC9hcGkvc2NyZWVuaW5nL2dlbmVyYXRlXG4gICAqICAgcmVhZHM6XG4gICAqICAgLSBkb206c2MtcXVlc3Rpb24tYmxvY2sucXVlc3Rpb25cbiAgICogICAtIHdpbmRvdzpfc2NyZWVuaW5nU3RhdGUuZm9ybWF0XG4gICAqICAgLSB3aW5kb3c6X3NjcmVlbmluZ1N0YXRlLnByaW9yUmVzcG9uc2VcbiAgICogICAtIHdpbmRvdzpfc2NyZWVuaW5nU3RhdGUuZXhwZXJpZW5jZUluZGljZXNcbiAgICogICB3cml0ZXM6XG4gICAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9zY3JlZW5pbmcvZ2VuZXJhdGUucXVlc3Rpb25cbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL3NjcmVlbmluZy9nZW5lcmF0ZS5mb3JtYXRcbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL3NjcmVlbmluZy9nZW5lcmF0ZS5leHBlcmllbmNlX2luZGljZXNcbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL3NjcmVlbmluZy9nZW5lcmF0ZS5wcmlvcl9yZXNwb25zZVxuICAgKiAgIC0gd2luZG93Ol9zY3JlZW5pbmdTdGF0ZS5yZXNwb25zZVRleHRcbiAgICogICAtIHdpbmRvdzpfc2NyZWVuaW5nU3RhdGUuZm9ybWF0XG4gICAqICAgbm90ZXM6IEdlbmVyYXRlcyBhIHNpbmdsZSBzY3JlZW5pbmcgcmVzcG9uc2UgZnJvbSB0aGUgc2VsZWN0ZWQgZm9ybWF0LCBwcmlvci1yZXNwb25zZSBzZWVkLCBhbmQgY2hvc2VuIGV4cGVyaWVuY2UgZXZpZGVuY2UsIHRoZW4gc3RvcmVzIHRoZSBkcmFmdCBiYWNrIGludG8gVUkgc3RhdGUgZm9yIGVkaXRpbmcuXG4gICAqL1xuICBjb25zdCBidG4gICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzYy1nZW4tYnRuLSR7aWR4fWApO1xuICBpZiAoYnRuKSB7IGJ0bi5kaXNhYmxlZCA9IHRydWU7IGJ0bi50ZXh0Q29udGVudCA9ICdcdTIzRjMgR2VuZXJhdGluZ1x1MjAyNic7IH1cblxuICBjb25zdCBxdWVzdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzYy1ibG9jay0ke2lkeH1gKT8uZGF0YXNldC5xdWVzdGlvbiB8fCAnJztcbiAgY29uc3Qgc3RhdGUgICAgPSBfc2NyZWVuaW5nU3RhdGVbaWR4XSB8fCB7fTtcbiAgY29uc3QgZm10ICAgICAgPSBfZ2V0U2VsZWN0ZWRGb3JtYXQoaWR4KTtcbiAgY29uc3QgcHJpb3IgICAgPSAoc3RhdGUudXNlUHJpb3IgJiYgc3RhdGUucHJpb3JSZXNwb25zZSkgPyBzdGF0ZS5wcmlvclJlc3BvbnNlIDogJyc7XG4gIGNvbnN0IGV4cElkeCAgID0gc3RhdGUuZXhwZXJpZW5jZUluZGljZXMgPz8gW107XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvc2NyZWVuaW5nL2dlbmVyYXRlJywge1xuICAgICAgbWV0aG9kOiAgJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIHF1ZXN0aW9uLFxuICAgICAgICBmb3JtYXQ6ICAgICAgICAgICAgICBmbXQsXG4gICAgICAgIGV4cGVyaWVuY2VfaW5kaWNlczogIGV4cElkeCxcbiAgICAgICAgcHJpb3JfcmVzcG9uc2U6ICAgICAgcHJpb3IsXG4gICAgICB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoIWRhdGEub2spIHsgc2hvd0FsZXJ0TW9kYWwoJ1x1Mjc0QyBFcnJvcicsIGRhdGEuZXJyb3IgfHwgJ0dlbmVyYXRpb24gZmFpbGVkLicpOyByZXR1cm47IH1cblxuICAgIGlmICghX3NjcmVlbmluZ1N0YXRlW2lkeF0pIF9zY3JlZW5pbmdTdGF0ZVtpZHhdID0ge307XG4gICAgX3NjcmVlbmluZ1N0YXRlW2lkeF0ucmVzcG9uc2VUZXh0ID0gZGF0YS50ZXh0O1xuICAgIF9zY3JlZW5pbmdTdGF0ZVtpZHhdLmZvcm1hdCAgICAgICA9IGZtdDtcblxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzYy1yZXN1bHQtJHtpZHh9YCkuaW5uZXJIVE1MID0gYFxuICAgICAgPHRleHRhcmVhIGNsYXNzPVwic2MtcmVzcG9uc2UtdGV4dGFyZWFcIiBpZD1cInNjLXRleHQtJHtpZHh9XCIgcm93cz1cIjdcIlxuICAgICAgICBvbmlucHV0PVwiX3NjcmVlbmluZ1N0YXRlWyR7aWR4fV0gPSBfc2NyZWVuaW5nU3RhdGVbJHtpZHh9XSB8fCB7fTsgX3NjcmVlbmluZ1N0YXRlWyR7aWR4fV0ucmVzcG9uc2VUZXh0ID0gdGhpcy52YWx1ZTtcIlxuICAgICAgPiR7ZXNjYXBlSHRtbChkYXRhLnRleHQpfTwvdGV4dGFyZWE+YDtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc2MtdG9waWMtcm93LSR7aWR4fWApLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIGNvbnRhY3Qgc2VydmVyLicpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChidG4pIHsgYnRuLmRpc2FibGVkID0gZmFsc2U7IGJ0bi50ZXh0Q29udGVudCA9ICdcdTI3MjggR2VuZXJhdGUgRHJhZnQnOyB9XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIFNhdmUgcmVzcG9uc2VzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBzYXZlU2NyZWVuaW5nUmVzcG9uc2VzKCkge1xuICAvKiBkdWNrZmxvdzpcbiAgICogICBpZDogc2NyZWVuaW5nX3VpX3NhdmVfbGl2ZVxuICAgKiAgIGtpbmQ6IHVpXG4gICAqICAgdGltZXN0YW1wOiAnMjAyNi0wMy0yNVQyMTozOTo0OFonXG4gICAqICAgc3RhdHVzOiBsaXZlXG4gICAqICAgaGFuZGxlczpcbiAgICogICAtIHVpOnNjcmVlbmluZy5zYXZlLWFsbFxuICAgKiAgIGNhbGxzOlxuICAgKiAgIC0gUE9TVCAvYXBpL3NjcmVlbmluZy9zYXZlXG4gICAqICAgcmVhZHM6XG4gICAqICAgLSB3aW5kb3c6X3NjcmVlbmluZ1N0YXRlXG4gICAqICAgLSBkb206LnNjLXF1ZXN0aW9uLWJsb2NrXG4gICAqICAgLSBkb206I3NjLXRleHQtKi52YWx1ZVxuICAgKiAgIC0gZG9tOiNzYy10b3BpYy0qLnZhbHVlXG4gICAqICAgd3JpdGVzOlxuICAgKiAgIC0gcmVxdWVzdDpQT1NUIC9hcGkvc2NyZWVuaW5nL3NhdmUucmVzcG9uc2VzXG4gICAqICAgbm90ZXM6IEFnZ3JlZ2F0ZXMgdGhlIGVkaXRlZCBzY3JlZW5pbmcgcmVzcG9uc2VzIGFuZCB0b3BpYyB0YWdzIGZyb20gdGhlIFVJIGludG8gdGhlIHN0cnVjdHVyZWQgcGF5bG9hZCB0aGF0IGJhY2tlbmQgc3RhdGUsIG1ldGFkYXRhLCBhcmNoaXZlIERPQ1gsIGFuZCB0aGUgcmVzcG9uc2UgbGlicmFyeSBhbGwgcGVyc2lzdC5cbiAgICovXG4gIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzYy1zYXZlLWJ0bicpO1xuICBpZiAoYnRuKSB7IGJ0bi5kaXNhYmxlZCA9IHRydWU7IGJ0bi50ZXh0Q29udGVudCA9ICdcdTIzRjMgU2F2aW5nXHUyMDI2JzsgfVxuXG4gIGNvbnN0IHJlc3BvbnNlcyA9IFtdO1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2MtcXVlc3Rpb24tYmxvY2snKS5mb3JFYWNoKChibG9jaywgaSkgPT4ge1xuICAgIGNvbnN0IHFFbCAgICA9IGJsb2NrLnF1ZXJ5U2VsZWN0b3IoJy5zYy1xdWVzdGlvbi1oZWFkZXIgc3BhbjpsYXN0LWNoaWxkJyk7XG4gICAgY29uc3QgdGV4dEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNjLXRleHQtJHtpfWApO1xuICAgIGNvbnN0IHRvcGljRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc2MtdG9waWMtJHtpfWApO1xuICAgIGlmICghdGV4dEVsKSByZXR1cm47IC8vIG5vdCB5ZXQgZ2VuZXJhdGVkIFx1MjAxNCBza2lwXG5cbiAgICBjb25zdCBxdWVzdGlvbiAgICAgPSBxRWwgPyBxRWwudGV4dENvbnRlbnQudHJpbSgpIDogJyc7XG4gICAgY29uc3QgcmVzcG9uc2VUZXh0ID0gKF9zY3JlZW5pbmdTdGF0ZVtpXT8ucmVzcG9uc2VUZXh0KSB8fCB0ZXh0RWwudmFsdWUgfHwgJyc7XG4gICAgY29uc3QgZm10ICAgICAgICAgID0gX2dldFNlbGVjdGVkRm9ybWF0KGkpO1xuICAgIGNvbnN0IHRvcGljVGFnICAgICA9IHRvcGljRWwgPyB0b3BpY0VsLnZhbHVlLnRyaW0oKSA6ICcnO1xuXG4gICAgcmVzcG9uc2VzLnB1c2goeyBxdWVzdGlvbiwgdG9waWNfdGFnOiB0b3BpY1RhZywgZm9ybWF0OiBmbXQsIHJlc3BvbnNlX3RleHQ6IHJlc3BvbnNlVGV4dCB9KTtcbiAgfSk7XG5cbiAgaWYgKCFyZXNwb25zZXMubGVuZ3RoKSB7XG4gICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjZBMFx1RkUwRiBOb3RoaW5nIHRvIFNhdmUnLCAnUGxlYXNlIGdlbmVyYXRlIGF0IGxlYXN0IG9uZSByZXNwb25zZSBiZWZvcmUgc2F2aW5nLicpO1xuICAgIGlmIChidG4pIHsgYnRuLmRpc2FibGVkID0gZmFsc2U7IGJ0bi50ZXh0Q29udGVudCA9ICdcdUQ4M0RcdURDQkUgU2F2ZSBBbGwgUmVzcG9uc2VzJzsgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL3NjcmVlbmluZy9zYXZlJywge1xuICAgICAgbWV0aG9kOiAgJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiAgICBKU09OLnN0cmluZ2lmeSh7IHJlc3BvbnNlcyB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgc2hvd0FsZXJ0TW9kYWwoJ1x1MjcwNSBTYXZlZCcsIGAke2RhdGEuY291bnR9IHJlc3BvbnNlJHtkYXRhLmNvdW50ICE9PSAxID8gJ3MnIDogJyd9IHNhdmVkIGFzIDxzdHJvbmc+JHtlc2NhcGVIdG1sKGRhdGEuZmlsZW5hbWUpfTwvc3Ryb25nPiBhbmQgYWRkZWQgdG8geW91ciByZXNwb25zZSBsaWJyYXJ5LmApO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaG93QWxlcnRNb2RhbCgnXHUyNzRDIFNhdmUgRmFpbGVkJywgZGF0YS5lcnJvciB8fCAnQ291bGQgbm90IHNhdmUgcmVzcG9uc2VzLicpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHNob3dBbGVydE1vZGFsKCdcdTI3NEMgRXJyb3InLCAnRmFpbGVkIHRvIGNvbnRhY3Qgc2VydmVyLicpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChidG4pIHsgYnRuLmRpc2FibGVkID0gZmFsc2U7IGJ0bi50ZXh0Q29udGVudCA9ICdcdUQ4M0RcdURDQkUgU2F2ZSBBbGwgUmVzcG9uc2VzJzsgfVxuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFeHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5leHBvcnQge1xuICBfc2NyZWVuaW5nU3RhdGUsXG4gIF9zY3JlZW5pbmdJbnB1dFRleHQsXG4gIF9yZXNldFNjcmVlbmluZ0lucHV0VGV4dCxcbiAgcG9wdWxhdGVTY3JlZW5pbmdUYWIsXG4gIHBhcnNlU2NyZWVuaW5nUXVlc3Rpb25zLFxuICByZW5kZXJRdWVzdGlvbkJsb2NrLFxuICBfZm10TGFiZWwsXG4gIHNlbGVjdEZvcm1hdCxcbiAgX2dldFNlbGVjdGVkRm9ybWF0LFxuICBzZWFyY2hGb3JRdWVzdGlvbixcbiAgdG9nZ2xlUHJpb3JVc2UsXG4gIHVwZGF0ZUV4cFNlbGVjdGlvbixcbiAgZ2VuZXJhdGVTY3JlZW5pbmdSZXNwb25zZSxcbiAgc2F2ZVNjcmVlbmluZ1Jlc3BvbnNlcyxcbn07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9maW5hbGlzZS5qc1xuICogRmluYWxpc2UgJiBhcmNoaXZlIHRhYjogZmluYWxpc2UgYXBwbGljYXRpb24sIGhhcnZlc3QgY2FuZGlkYXRlcyxcbiAqIGFwcGx5IHNlbGVjdGVkIHVwZGF0ZXMgdG8gbWFzdGVyIENWIGRhdGEuXG4gKlxuICogRGVwZW5kZW5jaWVzIChyZXNvbHZlZCB0aHJvdWdoIGdsb2JhbFRoaXMgYXQgcnVudGltZSk6XG4gKiAgIGVzY2FwZUh0bWwsIF9yZW5kZXJDb25zaXN0ZW5jeVJlcG9ydFxuICovXG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IGZvcm1hdEF0c1Njb3JlU3VtbWFyeSB9IGZyb20gJy4vYXRzLXJlZmluZW1lbnQuanMnO1xuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCdmaW5hbGlzZScpO1xuXG5mdW5jdGlvbiBfZm9ybWF0RHVyYXRpb24oc2Vjcykge1xuICBpZiAoc2VjcyA9PSBudWxsIHx8IHNlY3MgPCAwKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgaCA9IE1hdGguZmxvb3Ioc2VjcyAvIDM2MDApO1xuICBjb25zdCBtID0gTWF0aC5mbG9vcigoc2VjcyAlIDM2MDApIC8gNjApO1xuICBjb25zdCBzID0gc2VjcyAlIDYwO1xuICBpZiAoaCA+IDApIHJldHVybiBgJHtofWggJHttfW1gO1xuICBpZiAobSA+IDApIHJldHVybiBgJHttfW0gJHtzfXNgO1xuICByZXR1cm4gYCR7c31zYDtcbn1cblxuZnVuY3Rpb24gX3JlbmRlckZpbmFsaXNlQXRzSXRlbXMoc2NvcmUsIGF0c0tleXdvcmRzKSB7XG4gIGlmICghc2NvcmUgfHwgdHlwZW9mIHNjb3JlLm92ZXJhbGwgIT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGA8bGk+QVRTIGtleXdvcmRzIHRyYWNrZWQ6ICR7YXRzS2V5d29yZHMubGVuZ3RofTwvbGk+YDtcbiAgfVxuXG4gIGNvbnN0IHN1bW1hcnkgPSBmb3JtYXRBdHNTY29yZVN1bW1hcnkoc2NvcmUpO1xuICBjb25zdCBoYXJkU2NvcmUgPSB0eXBlb2Ygc2NvcmUuaGFyZF9yZXF1aXJlbWVudF9zY29yZSA9PT0gJ251bWJlcidcbiAgICA/IGAke01hdGgucm91bmQoc2NvcmUuaGFyZF9yZXF1aXJlbWVudF9zY29yZSl9JWBcbiAgICA6ICduL2EnO1xuICBjb25zdCBzb2Z0U2NvcmUgPSB0eXBlb2Ygc2NvcmUuc29mdF9yZXF1aXJlbWVudF9zY29yZSA9PT0gJ251bWJlcidcbiAgICA/IGAke01hdGgucm91bmQoc2NvcmUuc29mdF9yZXF1aXJlbWVudF9zY29yZSl9JWBcbiAgICA6ICduL2EnO1xuXG4gIHJldHVybiBbXG4gICAgYDxsaT5BVFMgc2NvcmU6IDxzdHJvbmc+JHtzdW1tYXJ5Lm92ZXJhbGx9JTwvc3Ryb25nPiA8c3BhbiBzdHlsZT1cImNvbG9yOiM0NzU1Njk7XCI+KGhhcmQgJHtoYXJkU2NvcmV9IFx1MjAyMiBzb2Z0ICR7c29mdFNjb3JlfSk8L3NwYW4+PC9saT5gLFxuICAgIGA8bGk+QVRTIGNvdmVyYWdlOiAke2VzY2FwZUh0bWwoc3VtbWFyeS5saW5lKX08L2xpPmAsXG4gICAgYDxsaT5BVFMgZGV0YWlsOiAke2VzY2FwZUh0bWwoc3VtbWFyeS5kZXRhaWwpfTwvbGk+YCxcbiAgXS5qb2luKCcnKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFBvcHVsYXRlIGZpbmFsaXNlIHRhYiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gcG9wdWxhdGVGaW5hbGlzZVRhYigpIHtcbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG5cbiAgLy8gRmV0Y2ggY3VycmVudCBzdGF0dXMgdG8gZ2V0IGdlbmVyYXRlZCBmaWxlcyBhbmQgam9iIGFuYWx5c2lzIGZvciBjb25zaXN0ZW5jeSBjaGVja1xuICBsZXQgZ2VuZXJhdGVkICA9IG51bGw7XG4gIGxldCBzdGF0dXNEYXRhID0gbnVsbDtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvc3RhdHVzJyk7XG4gICAgc3RhdHVzRGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgZ2VuZXJhdGVkICA9IHN0YXR1c0RhdGEuZ2VuZXJhdGVkX2ZpbGVzIHx8IG51bGw7XG4gIH0gY2F0Y2ggKGVycikgeyBsb2cud2FybignRmFpbGVkIHRvIGZldGNoIHN0YXR1cyBmb3IgZmluYWxpc2UgdGFiOicsIGVycik7IH1cblxuICBpZiAoIWdlbmVyYXRlZCB8fCAhZ2VuZXJhdGVkLm91dHB1dF9kaXIpIHtcbiAgICBjb250ZW50LmlubmVySFRNTCA9IGBcbiAgICAgIDxoMT5cdTI3MDUgRmluYWxpc2UgQXBwbGljYXRpb248L2gxPlxuICAgICAgPGRpdiBjbGFzcz1cImVtcHR5LXN0YXRlXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpY29uXCI+XHVEODNEXHVEQ0MyPC9kaXY+XG4gICAgICAgIDxoMz5ObyBDViBHZW5lcmF0ZWQgWWV0PC9oMz5cbiAgICAgICAgPHA+UGxlYXNlIGdlbmVyYXRlIGEgQ1YgZmlyc3QgYmVmb3JlIGZpbmFsaXNpbmcuPC9wPlxuICAgICAgPC9kaXY+YDtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBmaWxlcyA9IGdlbmVyYXRlZC5maWxlcyB8fCBbXTtcblxuICBsZXQgaHRtbCA9IGBcbiAgICA8aDE+XHUyNzA1IEZpbmFsaXNlIEFwcGxpY2F0aW9uPC9oMT5cbiAgICA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7bWFyZ2luLWJvdHRvbToyNHB4O1wiPlxuICAgICAgQXJjaGl2ZSB0aGlzIGFwcGxpY2F0aW9uIHRvIHlvdXIgQ1YgaGlzdG9yeSwgdXBkYXRlIHRoZSByZXNwb25zZSBsaWJyYXJ5LCBhbmQgb3B0aW9uYWxseVxuICAgICAgd3JpdGUgYW55IGltcHJvdmVtZW50cyBiYWNrIHRvIE1hc3RlciBDViBEYXRhLlxuICAgIDwvcD5cblxuICAgIDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmMGZkZjQ7Ym9yZGVyOjFweCBzb2xpZCAjYmJmN2QwO2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MTZweDttYXJnaW4tYm90dG9tOjI0cHg7XCI+XG4gICAgICA8aDMgc3R5bGU9XCJtYXJnaW46MCAwIDEwcHg7XCI+XHVEODNEXHVEQ0MyIEdlbmVyYXRlZCBGaWxlczwvaDM+XG4gICAgICA8dWwgc3R5bGU9XCJtYXJnaW46MDtwYWRkaW5nLWxlZnQ6MjBweDtsaW5lLWhlaWdodDoxLjg7XCI+XG4gICAgICAgICR7ZmlsZXMubWFwKGYgPT4gYDxsaT48Y29kZSBzdHlsZT1cImZvbnQtc2l6ZTowLjllbTtcIj4ke2VzY2FwZUh0bWwoZil9PC9jb2RlPjwvbGk+YCkuam9pbignJykgfHwgJzxsaT4obm9uZSk8L2xpPid9XG4gICAgICA8L3VsPlxuICAgICAgPHAgc3R5bGU9XCJtYXJnaW46OHB4IDAgMDtmb250LXNpemU6MC44NWVtO2NvbG9yOiMxNjY1MzQ7XCI+T3V0cHV0IGRpcjogPGNvZGU+JHtlc2NhcGVIdG1sKGdlbmVyYXRlZC5vdXRwdXRfZGlyKX08L2NvZGU+PC9wPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBpZD1cInJlYWRpbmVzcy1jaGVja2xpc3RcIj48L2Rpdj5cbiAgICA8ZGl2IGlkPVwiY29uc2lzdGVuY3ktcmVwb3J0XCI+PC9kaXY+XG4gICAgPGRpdiBpZD1cInJld3JpdGUtYXVkaXQtbG9nXCI+PC9kaXY+XG5cbiAgICA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZmZmO2JvcmRlcjoxcHggc29saWQgI2UyZThmMDtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjIwcHg7bWFyZ2luLWJvdHRvbToyNHB4O1wiPlxuICAgICAgPGgzIHN0eWxlPVwibWFyZ2luOjAgMCAxNnB4O1wiPlx1RDgzRFx1RENDQiBBcHBsaWNhdGlvbiBTdGF0dXM8L2gzPlxuXG4gICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNnB4O1wiPlxuICAgICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjZweDtcIiBmb3I9XCJmaW5hbGlzZS1zdGF0dXNcIj5TdGF0dXM8L2xhYmVsPlxuICAgICAgICA8c2VsZWN0IGlkPVwiZmluYWxpc2Utc3RhdHVzXCIgc3R5bGU9XCJ3aWR0aDoyMjBweDtwYWRkaW5nOjhweCAxMHB4O2JvcmRlcjoxcHggc29saWQgI2NiZDVlMTtib3JkZXItcmFkaXVzOjZweDtmb250LXNpemU6MC45NWVtO1wiPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJkcmFmdFwiPkRyYWZ0IFx1MjAxNCBub3QgeWV0IHNlbnQ8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicmVhZHlcIiBzZWxlY3RlZD5SZWFkeSB0byBzZW5kPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInNlbnRcIj5TZW50PC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImludGVydmlld1wiPkludGVydmlldyBzY2hlZHVsZWQ8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicmVqZWN0ZWRcIj5SZWplY3RlZDwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJhY2NlcHRlZFwiPkFjY2VwdGVkPC9vcHRpb24+XG4gICAgICAgIDwvc2VsZWN0PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjIwcHg7XCI+XG4gICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206NnB4O1wiIGZvcj1cImZpbmFsaXNlLW5vdGVzXCI+Tm90ZXM8L2xhYmVsPlxuICAgICAgICA8dGV4dGFyZWEgaWQ9XCJmaW5hbGlzZS1ub3Rlc1wiIHJvd3M9XCI0XCIgbWF4bGVuZ3RoPVwiMjAwMFwiXG4gICAgICAgICAgb25pbnB1dD1cImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaW5hbGlzZS1ub3Rlcy1jb3VudGVyJykudGV4dENvbnRlbnQ9dGhpcy52YWx1ZS5sZW5ndGgrJyAvIDIwMDAnO2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaW5hbGlzZS1ub3Rlcy1jb3VudGVyJykuc3R5bGUuY29sb3I9dGhpcy52YWx1ZS5sZW5ndGg+MTgwMD8nI2RjMjYyNic6dGhpcy52YWx1ZS5sZW5ndGg+MTYwMD8nI2Q5NzcwNic6JyM2YjcyODAnXCJcbiAgICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCU7cGFkZGluZzoxMHB4O2JvcmRlcjoxcHggc29saWQgI2NiZDVlMTtib3JkZXItcmFkaXVzOjZweDtcbiAgICAgICAgICAgICAgICAgZm9udC1zaXplOjAuOTJlbTtyZXNpemU6dmVydGljYWw7Ym94LXNpemluZzpib3JkZXItYm94O1wiXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJSZWNydWl0ZXIgbmFtZSwgc2FsYXJ5IGluZm8sIGZvbGxvdy11cCBkYXRlLCBpbnRlcnZpZXcgbm90ZXNcdTIwMjZcIj48L3RleHRhcmVhPlxuICAgICAgICA8ZGl2IGlkPVwiZmluYWxpc2Utbm90ZXMtY291bnRlclwiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiIHN0eWxlPVwidGV4dC1hbGlnbjpyaWdodDtmb250LXNpemU6MC44ZW07Y29sb3I6IzZiNzI4MDttYXJnaW4tdG9wOjJweDtcIj4wIC8gMjAwMDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxidXR0b24gaWQ9XCJmaW5hbGlzZS1idG5cIiBvbmNsaWNrPVwiZmluYWxpc2VBcHBsaWNhdGlvbigpXCJcbiAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiMwNTk2Njk7Y29sb3I6I2ZmZjtib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjZweDtcbiAgICAgICAgICAgICAgIHBhZGRpbmc6MTBweCAyNHB4O2ZvbnQtc2l6ZToxZW07Zm9udC13ZWlnaHQ6NjAwO2N1cnNvcjpwb2ludGVyO1wiPlxuICAgICAgICBcdTI3MDUgRmluYWxpc2UgJmFtcDsgQXJjaGl2ZVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGlkPVwiZmluYWxpc2UtcmVzdWx0XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+PC9kaXY+XG4gICAgPGRpdiBpZD1cImhhcnZlc3Qtc2VjdGlvblwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPjwvZGl2PlxuICBgO1xuXG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gaHRtbDtcbiAgX3JlbmRlclJlYWRpbmVzc0NoZWNrbGlzdChmaWxlcywgc3RhdHVzRGF0YSk7XG4gIGlmIChzdGF0dXNEYXRhKSBfcmVuZGVyQ29uc2lzdGVuY3lSZXBvcnQoc3RhdHVzRGF0YSk7XG4gIF9yZW5kZXJSZXdyaXRlQXVkaXRMb2coKTtcbiAgX3Jlc3RvcmVGaW5hbGlzZU1ldGEoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gX3Jlc3RvcmVGaW5hbGlzZU1ldGEoKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvZmluYWxpc2UtbWV0YScpO1xuICAgIGlmICghcmVzLm9rKSByZXR1cm47XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgY29uc3Qgc3RhdHVzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmluYWxpc2Utc3RhdHVzJyk7XG4gICAgY29uc3Qgbm90ZXNFbCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmluYWxpc2Utbm90ZXMnKTtcbiAgICBpZiAoc3RhdHVzRWwgJiYgZGF0YS5hcHBsaWNhdGlvbl9zdGF0dXMpIHN0YXR1c0VsLnZhbHVlID0gZGF0YS5hcHBsaWNhdGlvbl9zdGF0dXM7XG4gICAgaWYgKG5vdGVzRWwgICYmIGRhdGEubm90ZXMpIHtcbiAgICAgIG5vdGVzRWwudmFsdWUgPSBkYXRhLm5vdGVzO1xuICAgICAgY29uc3QgY291bnRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaW5hbGlzZS1ub3Rlcy1jb3VudGVyJyk7XG4gICAgICBpZiAoY291bnRlcikge1xuICAgICAgICBjb25zdCBsZW4gPSBkYXRhLm5vdGVzLmxlbmd0aDtcbiAgICAgICAgY291bnRlci50ZXh0Q29udGVudCA9IGAke2xlbn0gLyAyMDAwYDtcbiAgICAgICAgY291bnRlci5zdHlsZS5jb2xvciA9IGxlbiA+IDE4MDAgPyAnI2RjMjYyNicgOiBsZW4gPiAxNjAwID8gJyNkOTc3MDYnIDogJyM2YjcyODAnO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoXykge31cbn1cblxuLy8gXHUyNTAwXHUyNTAwIFN1Ym1pc3Npb24gcmVhZGluZXNzIGNoZWNrbGlzdCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gX3JlbmRlclJlYWRpbmVzc0NoZWNrbGlzdChmaWxlcywgc3RhdHVzRGF0YSkge1xuICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWFkaW5lc3MtY2hlY2tsaXN0Jyk7XG4gIGlmICghZWwpIHJldHVybjtcblxuICBjb25zdCBmaWxlU2V0ID0gbmV3IFNldCgoZmlsZXMgfHwgW10pLm1hcChmID0+IChmIHx8ICcnKS50b0xvd2VyQ2FzZSgpKSk7XG4gIGNvbnN0IGhhc1BkZiAgPSBbLi4uZmlsZVNldF0uc29tZShmID0+IGYuZW5kc1dpdGgoJy5wZGYnKSAmJiAhZi5pbmNsdWRlcygnY292ZXJsZXR0ZXInKSAmJiAhZi5pbmNsdWRlcygnY292ZXJfbGV0dGVyJykpO1xuICBjb25zdCBoYXNEb2N4ID0gWy4uLmZpbGVTZXRdLnNvbWUoZiA9PiBmLmVuZHNXaXRoKCcuZG9jeCcpICYmICFmLmluY2x1ZGVzKCdjb3ZlcmxldHRlcicpICYmICFmLmluY2x1ZGVzKCdjb3Zlcl9sZXR0ZXInKSAmJiAhZi5pbmNsdWRlcygnc2NyZWVuaW5nJykpO1xuICBjb25zdCBoYXNIdG1sID0gWy4uLmZpbGVTZXRdLnNvbWUoZiA9PiBmLmVuZHNXaXRoKCcuaHRtbCcpKTtcbiAgY29uc3QgaGFzQ2wgICA9IFsuLi5maWxlU2V0XS5zb21lKGYgPT4gZi5pbmNsdWRlcygnY292ZXJsZXR0ZXInKSB8fCBmLmluY2x1ZGVzKCdjb3Zlcl9sZXR0ZXInKSk7XG4gIGNvbnN0IGhhc1NjciAgPSBbLi4uZmlsZVNldF0uc29tZShmID0+IGYuaW5jbHVkZXMoJ3NjcmVlbmluZycpKTtcblxuICBjb25zdCBhdHNDaGVja3MgID0gc3RhdHVzRGF0YT8uYXRzX2NoZWNrcyB8fCBbXTtcbiAgY29uc3QgYXRzRmFpbHMgICA9IChhdHNDaGVja3MpLmZpbHRlcihjID0+IGMuc3RhdHVzID09PSAnZmFpbCcgfHwgYy5zdGF0dXMgPT09ICdlcnJvcicpLmxlbmd0aDtcbiAgY29uc3QgYXRzU2Nhbm5lZCA9IGF0c0NoZWNrcy5sZW5ndGggPiAwO1xuXG4gIGNvbnN0IGxheW91dEZyZXNoID0gc3RhdHVzRGF0YT8ubGF5b3V0X2ZyZXNobmVzcyAhPT0gJ3N0YWxlJztcblxuICBjb25zdCBpdGVtcyA9IFtcbiAgICB7IG9rOiBoYXNQZGYsICAgbGFiZWw6ICdDViBQREYgZ2VuZXJhdGVkJywgICAgICAgIHdhcm46IGZhbHNlIH0sXG4gICAgeyBvazogaGFzRG9jeCwgIGxhYmVsOiAnQ1YgRE9DWCBnZW5lcmF0ZWQnLCAgICAgICB3YXJuOiBmYWxzZSB9LFxuICAgIHsgb2s6IGhhc0h0bWwsICBsYWJlbDogJ0NWIEhUTUwgZ2VuZXJhdGVkJywgICAgICAgd2FybjogZmFsc2UgfSxcbiAgICB7IG9rOiBoYXNDbCwgICAgbGFiZWw6ICdDb3ZlciBsZXR0ZXIgZ2VuZXJhdGVkJywgIHdhcm46IHRydWUgIH0sXG4gICAgeyBvazogaGFzU2NyLCAgIGxhYmVsOiAnU2NyZWVuaW5nIFEmQSBnZW5lcmF0ZWQnLCB3YXJuOiB0cnVlICB9LFxuICAgIHsgb2s6IGF0c1NjYW5uZWQgJiYgYXRzRmFpbHMgPT09IDAsIHdhcm46IHRydWUsXG4gICAgICBsYWJlbDogYXRzU2Nhbm5lZFxuICAgICAgICA/IChhdHNGYWlscyA+IDAgPyBgQVRTIHZhbGlkYXRpb24gXHUyMDE0ICR7YXRzRmFpbHN9IGlzc3VlJHthdHNGYWlscyAhPT0gMSA/ICdzJyA6ICcnfSBmb3VuZGAgOiAnQVRTIHZhbGlkYXRpb24gcGFzc2VkJylcbiAgICAgICAgOiAnQVRTIHZhbGlkYXRpb24gbm90IHlldCBydW4nIH0sXG4gICAgeyBvazogbGF5b3V0RnJlc2gsIHdhcm46IHRydWUsIGxhYmVsOiAnTGF5b3V0IGlzIGN1cnJlbnQgKG5vdCBzdGFsZSknIH0sXG4gIF07XG5cbiAgY29uc3Qgcm93cyA9IGl0ZW1zLm1hcCgoeyBvaywgbGFiZWwsIHdhcm4gfSkgPT4ge1xuICAgIGNvbnN0IGljb24gID0gb2sgPyAnXHUyNzA1JyA6ICh3YXJuID8gJ1x1MjZBMCcgOiAnXHUyNzRDJyk7XG4gICAgY29uc3QgY29sb3IgPSBvayA/ICcjMDY1ZjQ2JyA6ICh3YXJuID8gJyM5MjQwMGUnIDogJyM5OTFiMWInKTtcbiAgICBjb25zdCBiZyAgICA9IG9rID8gJyNmMGZkZjQnIDogKHdhcm4gPyAnI2ZmZmJlYicgOiAnI2ZlZjJmMicpO1xuICAgIHJldHVybiBgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjEwcHg7cGFkZGluZzo4cHggMTJweDtiYWNrZ3JvdW5kOiR7Ymd9O2JvcmRlci1yYWRpdXM6NnB4O21hcmdpbi1ib3R0b206NnB4O1wiPlxuICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCIgc3R5bGU9XCJmb250LXNpemU6MS4xZW07XCI+JHtpY29ufTwvc3Bhbj5cbiAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6JHtjb2xvcn07Zm9udC1zaXplOjAuOTJlbTtcIj4ke2VzY2FwZUh0bWwobGFiZWwpfTwvc3Bhbj5cbiAgICA8L2Rpdj5gO1xuICB9KS5qb2luKCcnKTtcblxuICBjb25zdCBhbGxSZXF1aXJlZCA9IGhhc1BkZiAmJiBoYXNEb2N4ICYmIGhhc0h0bWw7XG4gIGNvbnN0IGhlYWRlckNvbG9yID0gYWxsUmVxdWlyZWQgPyAnIzA2NWY0NicgOiAnIzkyNDAwZSc7XG4gIGVsLmlubmVySFRNTCA9IGBcbiAgICA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZmZmO2JvcmRlcjoxcHggc29saWQgI2UyZThmMDtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjE2cHggMjBweDttYXJnaW4tYm90dG9tOjI0cHg7XCI+XG4gICAgICA8aDMgc3R5bGU9XCJtYXJnaW46MCAwIDEycHg7Y29sb3I6JHtoZWFkZXJDb2xvcn07XCI+XHVEODNEXHVEQ0NCIFN1Ym1pc3Npb24gUmVhZGluZXNzPC9oMz5cbiAgICAgICR7cm93c31cbiAgICAgIDxwIHN0eWxlPVwibWFyZ2luOjEwcHggMCAwO2ZvbnQtc2l6ZTowLjgyZW07Y29sb3I6IzY0NzQ4YjtcIj5cbiAgICAgICAgXHUyNkEwIGl0ZW1zIGFyZSBvcHRpb25hbCBcdTIwMTQgdGhleSB3YXJuIGJ1dCBkbyBub3QgYmxvY2sgYXJjaGl2aW5nLlxuICAgICAgICBcdTI3NEMgaXRlbXMgbXVzdCBiZSByZXNvbHZlZCBiZWZvcmUgc3VibWl0dGluZy5cbiAgICAgIDwvcD5cbiAgICA8L2Rpdj5gO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgUmV3cml0ZSBhdWRpdCBsb2cgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIF9yZW5kZXJSZXdyaXRlQXVkaXRMb2coKSB7XG4gIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jld3JpdGUtYXVkaXQtbG9nJyk7XG4gIGlmICghZWwpIHJldHVybjtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvcmV3cml0ZXMnKTtcbiAgICBpZiAoIXJlcy5vaykgcmV0dXJuO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGNvbnN0IGF1ZGl0ID0gZGF0YS5yZXdyaXRlX2F1ZGl0IHx8IFtdO1xuICAgIGlmIChhdWRpdC5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICBjb25zdCByb3dzID0gYXVkaXQubWFwKGVudHJ5ID0+IHtcbiAgICAgIGNvbnN0IG91dGNvbWUgPSBlbnRyeS5vdXRjb21lIHx8IGVudHJ5LmRlY2lzaW9uIHx8ICdcdTIwMTQnO1xuICAgICAgY29uc3QgaWNvbiA9IG91dGNvbWUgPT09ICdhY2NlcHRlZCcgPyAnXHUyNzA1JyA6IG91dGNvbWUgPT09ICdlZGl0ZWQnID8gJ1x1MjcwRlx1RkUwRicgOiBvdXRjb21lID09PSAncmVqZWN0ZWQnID8gJ1x1Mjc0QycgOiAnXHUyMDE0JztcbiAgICAgIGNvbnN0IG9yaWdpbmFsICA9IGVzY2FwZUh0bWwoKGVudHJ5Lm9yaWdpbmFsX3RleHQgfHwgZW50cnkub3JpZ2luYWwgfHwgJycpLnNsaWNlKDAsIDEyMCkpO1xuICAgICAgY29uc3QgZmluYWwgICAgID0gZXNjYXBlSHRtbCgoZW50cnkuZmluYWxfdGV4dCB8fCBlbnRyeS5yZXdyaXR0ZW4gfHwgZW50cnkuc3VnZ2VzdGVkIHx8ICcnKS5zbGljZSgwLCAxMjApKTtcbiAgICAgIGNvbnN0IGZpZWxkICAgICA9IGVzY2FwZUh0bWwoZW50cnkuZmllbGQgfHwgZW50cnkudHlwZSB8fCAnXHUyMDE0Jyk7XG4gICAgICByZXR1cm4gYDx0cj5cbiAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzo2cHggOHB4O2ZvbnQtc2l6ZTowLjhlbTtjb2xvcjojNmI3MjgwO1wiPiR7ZmllbGR9PC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzo2cHggOHB4O2ZvbnQtc2l6ZTowLjhlbTtjb2xvcjojMzc0MTUxO1wiPiR7b3JpZ2luYWx9JHtvcmlnaW5hbC5sZW5ndGggPT09IDEyMCA/ICdcdTIwMjYnIDogJyd9PC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzo2cHggOHB4O2ZvbnQtc2l6ZTowLjhlbTtjb2xvcjojMzc0MTUxO1wiPiR7ZmluYWx9JHtmaW5hbC5sZW5ndGggPT09IDEyMCA/ICdcdTIwMjYnIDogJyd9PC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzo2cHggOHB4O2ZvbnQtc2l6ZTowLjhlbTt0ZXh0LWFsaWduOmNlbnRlcjtcIj4ke2ljb259ICR7ZXNjYXBlSHRtbChvdXRjb21lKX08L3RkPlxuICAgICAgPC90cj5gO1xuICAgIH0pLmpvaW4oJycpO1xuICAgIGVsLmlubmVySFRNTCA9IGBcbiAgICAgIDxkZXRhaWxzIHN0eWxlPVwibWFyZ2luLWJvdHRvbToyNHB4O1wiPlxuICAgICAgICA8c3VtbWFyeSBzdHlsZT1cImN1cnNvcjpwb2ludGVyO2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MC45NWVtO3BhZGRpbmc6MTBweCAwO2NvbG9yOiMzNzQxNTE7dXNlci1zZWxlY3Q6bm9uZTtcIj5cbiAgICAgICAgICBcdUQ4M0RcdURDQ0IgUmV3cml0ZSBhdWRpdCBsb2cgKCR7YXVkaXQubGVuZ3RofSBkZWNpc2lvbiR7YXVkaXQubGVuZ3RoICE9PSAxID8gJ3MnIDogJyd9KVxuICAgICAgICA8L3N1bW1hcnk+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJvdmVyZmxvdy14OmF1dG87bWFyZ2luLXRvcDoxMHB4O1wiPlxuICAgICAgICAgIDx0YWJsZSBzdHlsZT1cIndpZHRoOjEwMCU7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlO2ZvbnQtc2l6ZTowLjg1ZW07XCI+XG4gICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgIDx0ciBzdHlsZT1cImJhY2tncm91bmQ6I2Y4ZmFmYztib3JkZXItYm90dG9tOjJweCBzb2xpZCAjZTJlOGYwO1wiPlxuICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cInBhZGRpbmc6OHB4O3RleHQtYWxpZ246bGVmdDtjb2xvcjojMzc0MTUxO2ZvbnQtd2VpZ2h0OjYwMDtcIj5GaWVsZDwvdGg+XG4gICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwicGFkZGluZzo4cHg7dGV4dC1hbGlnbjpsZWZ0O2NvbG9yOiMzNzQxNTE7Zm9udC13ZWlnaHQ6NjAwO1wiPk9yaWdpbmFsPC90aD5cbiAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJwYWRkaW5nOjhweDt0ZXh0LWFsaWduOmxlZnQ7Y29sb3I6IzM3NDE1MTtmb250LXdlaWdodDo2MDA7XCI+RmluYWw8L3RoPlxuICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cInBhZGRpbmc6OHB4O3RleHQtYWxpZ246Y2VudGVyO2NvbG9yOiMzNzQxNTE7Zm9udC13ZWlnaHQ6NjAwO1wiPk91dGNvbWU8L3RoPlxuICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICAgIDx0Ym9keT4ke3Jvd3N9PC90Ym9keT5cbiAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGV0YWlscz5gO1xuICB9IGNhdGNoIHsgLyogbm9uLWZhdGFsICovIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIEZpbmFsaXNlIGFwcGxpY2F0aW9uIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBmaW5hbGlzZUFwcGxpY2F0aW9uKCkge1xuICAvKiBkdWNrZmxvdzpcbiAgICogICBpZDogZmluYWxpc2VfdWlfc3VibWl0X2xpdmVcbiAgICogICBraW5kOiB1aVxuICAgKiAgIHRpbWVzdGFtcDogJzIwMjYtMDMtMjVUMjE6Mzk6NDhaJ1xuICAgKiAgIHN0YXR1czogbGl2ZVxuICAgKiAgIGhhbmRsZXM6XG4gICAqICAgLSB1aTpmaW5hbGlzZS5zdWJtaXRcbiAgICogICBjYWxsczpcbiAgICogICAtIFBPU1QgL2FwaS9maW5hbGlzZVxuICAgKiAgIHJlYWRzOlxuICAgKiAgIC0gZG9tOiNmaW5hbGlzZS1zdGF0dXMudmFsdWVcbiAgICogICAtIGRvbTojZmluYWxpc2Utbm90ZXMudmFsdWVcbiAgICogICB3cml0ZXM6XG4gICAqICAgLSByZXF1ZXN0OlBPU1QgL2FwaS9maW5hbGlzZS5zdGF0dXNcbiAgICogICAtIHJlcXVlc3Q6UE9TVCAvYXBpL2ZpbmFsaXNlLm5vdGVzXG4gICAqICAgLSBkb206I2ZpbmFsaXNlLXJlc3VsdFxuICAgKiAgIG5vdGVzOiBTdWJtaXRzIGZpbmFsIGFwcGxpY2F0aW9uIHN0YXR1cyBhbmQgbm90ZXMgc28gYmFja2VuZCBtZXRhZGF0YSwgYXJjaGl2ZSBzdGF0ZSwgYW5kIG9wdGlvbmFsIGdpdCBmaW5hbGl6YXRpb24gY2FuIGJlIHdyaXR0ZW4gZnJvbSB0aGUgY3VycmVudCBzZXNzaW9uLlxuICAgKi9cbiAgY29uc3QgYnRuICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbmFsaXNlLWJ0bicpO1xuICBjb25zdCByZXN1bHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmluYWxpc2UtcmVzdWx0Jyk7XG4gIGNvbnN0IHN0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaW5hbGlzZS1zdGF0dXMnKS52YWx1ZTtcbiAgY29uc3Qgbm90ZXMgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbmFsaXNlLW5vdGVzJykudmFsdWU7XG5cbiAgYnRuLmRpc2FibGVkICAgID0gdHJ1ZTtcbiAgYnRuLnRleHRDb250ZW50ID0gJ1x1MjNGMyBGaW5hbGlzaW5nXHUyMDI2JztcbiAgcmVzdWx0LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHJlc3VsdC5pbm5lckhUTUwgICAgID0gJyc7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvZmluYWxpc2UnLCB7XG4gICAgICBtZXRob2Q6ICAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6ICAgIEpTT04uc3RyaW5naWZ5KHsgc3RhdHVzLCBub3RlcyB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcblxuICAgIGlmICghcmVzLm9rIHx8ICFkYXRhLm9rKSB7XG4gICAgICByZXN1bHQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICByZXN1bHQuaW5uZXJIVE1MID0gYDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZWUyZTI7Ym9yZGVyOjFweCBzb2xpZCAjZmNhNWE1O2JvcmRlci1yYWRpdXM6OHB4O1xuICAgICAgICBwYWRkaW5nOjE0cHggMThweDtjb2xvcjojOTkxYjFiO1wiPlxuICAgICAgICA8c3Ryb25nPlx1Mjc0QyBFcnJvcjo8L3N0cm9uZz4gJHtlc2NhcGVIdG1sKGRhdGEuZXJyb3IgfHwgJ0ZpbmFsaXNlIGZhaWxlZCcpfVxuICAgICAgPC9kaXY+YDtcbiAgICAgIGJ0bi5kaXNhYmxlZCAgICA9IGZhbHNlO1xuICAgICAgYnRuLnRleHRDb250ZW50ID0gJ1x1MjcwNSBGaW5hbGlzZSAmIEFyY2hpdmUnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN1bW1hcnkgPSBkYXRhLnN1bW1hcnkgfHwge307XG4gICAgY29uc3QgaGFzaCAgICA9IGRhdGEuY29tbWl0X2hhc2ggPyBgPGNvZGUgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO1wiPiR7ZXNjYXBlSHRtbChkYXRhLmNvbW1pdF9oYXNoKX08L2NvZGU+YCA6ICcobm8gY29tbWl0KSc7XG4gICAgY29uc3QgZ2l0V2FybiA9IGRhdGEuZ2l0X2Vycm9yXG4gICAgICA/IGA8cCBzdHlsZT1cImNvbG9yOiNkOTc3MDY7Zm9udC1zaXplOjAuODdlbTttYXJnaW4tdG9wOjhweDtcIj5cdTI2QTAgR2l0OiAke2VzY2FwZUh0bWwoZGF0YS5naXRfZXJyb3IpfTwvcD5gXG4gICAgICA6ICcnO1xuICAgIGNvbnN0IGFwcHJvdmVkQ291bnQgPSBzdW1tYXJ5LmFwcHJvdmVkX3Jld3JpdGVzID8/IDA7XG4gICAgY29uc3QgYXRzS2V5d29yZHMgICA9IHN1bW1hcnkuYXRzX2tleXdvcmRzIHx8IFtdO1xuICAgIGNvbnN0IGF0c1Njb3JlICAgICAgPSBzdW1tYXJ5LmF0c19zY29yZSB8fCBudWxsO1xuICAgIGNvbnN0IGR1cmF0aW9uU2VjcyAgPSBzdW1tYXJ5LnNlc3Npb25fZHVyYXRpb25fc2VjcztcbiAgICBjb25zdCBkdXJhdGlvblN0ciAgID0gZHVyYXRpb25TZWNzICE9IG51bGwgPyBfZm9ybWF0RHVyYXRpb24oZHVyYXRpb25TZWNzKSA6IG51bGw7XG5cbiAgICByZXN1bHQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgcmVzdWx0LmlubmVySFRNTCA9IGBcbiAgICAgIDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmMGZkZjQ7Ym9yZGVyOjFweCBzb2xpZCAjODZlZmFjO2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MTZweCAyMHB4O21hcmdpbi1ib3R0b206MjBweDtcIj5cbiAgICAgICAgPHN0cm9uZz5cdTI3MDUgQXBwbGljYXRpb24gYXJjaGl2ZWQhPC9zdHJvbmc+XG4gICAgICAgIDx1bCBzdHlsZT1cIm1hcmdpbjo4cHggMCAwO3BhZGRpbmctbGVmdDoyMHB4O2xpbmUtaGVpZ2h0OjEuODtmb250LXNpemU6MC45MmVtO1wiPlxuICAgICAgICAgIDxsaT5TdGF0dXM6IDxzdHJvbmc+JHtlc2NhcGVIdG1sKHN0YXR1cyl9PC9zdHJvbmc+PC9saT5cbiAgICAgICAgICA8bGk+QXBwcm92ZWQgcmV3cml0ZXM6ICR7YXBwcm92ZWRDb3VudH08L2xpPlxuICAgICAgICAgICR7X3JlbmRlckZpbmFsaXNlQXRzSXRlbXMoYXRzU2NvcmUsIGF0c0tleXdvcmRzKX1cbiAgICAgICAgICAke2R1cmF0aW9uU3RyID8gYDxsaT5TZXNzaW9uIGR1cmF0aW9uOiAke2VzY2FwZUh0bWwoZHVyYXRpb25TdHIpfTwvbGk+YCA6ICcnfVxuICAgICAgICAgIDxsaT5HaXQgY29tbWl0OiAke2hhc2h9PC9saT5cbiAgICAgICAgPC91bD5cbiAgICAgICAgJHtnaXRXYXJufVxuICAgICAgPC9kaXY+YDtcblxuICAgIGJ0bi50ZXh0Q29udGVudCA9ICdcdTI3MDUgQXJjaGl2ZWQnO1xuXG4gICAgLy8gU2hvdyBoYXJ2ZXN0IHNlY3Rpb25cbiAgICBhd2FpdCBzaG93SGFydmVzdFNlY3Rpb24oKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmVzdWx0LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgIHJlc3VsdC5pbm5lckhUTUwgPSBgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2ZlZTJlMjtib3JkZXI6MXB4IHNvbGlkICNmY2E1YTU7Ym9yZGVyLXJhZGl1czo4cHg7XG4gICAgICBwYWRkaW5nOjE0cHggMThweDtjb2xvcjojOTkxYjFiO1wiPlxuICAgICAgPHN0cm9uZz5cdTI3NEMgTmV0d29yayBlcnJvcjo8L3N0cm9uZz4gJHtlc2NhcGVIdG1sKGVyci5tZXNzYWdlKX1cbiAgICA8L2Rpdj5gO1xuICAgIGJ0bi5kaXNhYmxlZCAgICA9IGZhbHNlO1xuICAgIGJ0bi50ZXh0Q29udGVudCA9ICdcdTI3MDUgRmluYWxpc2UgJiBBcmNoaXZlJztcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgU2hvdyBoYXJ2ZXN0IHNlY3Rpb24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIHNob3dIYXJ2ZXN0U2VjdGlvbigpIHtcbiAgY29uc3Qgc2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoYXJ2ZXN0LXNlY3Rpb24nKTtcbiAgc2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgc2VjdGlvbi5pbm5lckhUTUwgPSBgXG4gICAgPGgyIHN0eWxlPVwibWFyZ2luLXRvcDowO1wiPlx1RDgzRFx1RENFNSBVcGRhdGUgTWFzdGVyIENWIERhdGE8L2gyPlxuICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDttYXJnaW4tYm90dG9tOjE2cHg7XCI+TG9hZGluZyBpbXByb3ZlbWVudCBjYW5kaWRhdGVzIGZyb20gdGhpcyBzZXNzaW9uXHUyMDI2PC9wPlxuICAgIDxkaXYgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjtwYWRkaW5nOjI0cHg7XCI+PGRpdiBjbGFzcz1cImxvYWRpbmctc3Bpbm5lclwiPjwvZGl2PjwvZGl2PmA7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvaGFydmVzdC9jYW5kaWRhdGVzJyk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG5cbiAgICBpZiAoIWRhdGEub2spIHtcbiAgICAgIHNlY3Rpb24uaW5uZXJIVE1MID0gYFxuICAgICAgICA8aDIgc3R5bGU9XCJtYXJnaW4tdG9wOjA7XCI+XHVEODNEXHVEQ0U1IFVwZGF0ZSBNYXN0ZXIgQ1YgRGF0YTwvaDI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZWUyZTI7Ym9yZGVyOjFweCBzb2xpZCAjZmNhNWE1O2JvcmRlci1yYWRpdXM6OHB4O1xuICAgICAgICAgIHBhZGRpbmc6MTJweCAxNnB4O2NvbG9yOiM5OTFiMWI7XCI+XG4gICAgICAgICAgXHUyNzRDICR7ZXNjYXBlSHRtbChkYXRhLmVycm9yIHx8ICdGYWlsZWQgdG8gbG9hZCBjYW5kaWRhdGVzJyl9XG4gICAgICAgIDwvZGl2PmA7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY2FuZGlkYXRlcyA9IGRhdGEuY2FuZGlkYXRlcyB8fCBbXTtcblxuICAgIGlmIChjYW5kaWRhdGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgc2VjdGlvbi5pbm5lckhUTUwgPSBgXG4gICAgICAgIDxoMiBzdHlsZT1cIm1hcmdpbi10b3A6MDtcIj5cdUQ4M0RcdURDRTUgVXBkYXRlIE1hc3RlciBDViBEYXRhPC9oMj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImVtcHR5LXN0YXRlXCIgc3R5bGU9XCJwYWRkaW5nOjI0cHggMDtcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWNvblwiPlx1RDgzRFx1RENDQjwvZGl2PlxuICAgICAgICAgIDxoMz5ObyBVcGRhdGUgQ2FuZGlkYXRlczwvaDM+XG4gICAgICAgICAgPHA+Tm90aGluZyBmcm9tIHRoaXMgc2Vzc2lvbiB3YXJyYW50cyB3cml0aW5nIGJhY2sgdG8gdGhlIG1hc3RlciBDVi48L3A+XG4gICAgICAgIDwvZGl2PmA7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdHlwZUljb25zID0ge1xuICAgICAgaW1wcm92ZWRfYnVsbGV0OiAgICAnXHUyNzBGXHVGRTBGJyxcbiAgICAgIG5ld19za2lsbDogICAgICAgICAgJ1x1RDgzRFx1REVFMCcsXG4gICAgICBzdW1tYXJ5X3ZhcmlhbnQ6ICAgICdcdUQ4M0RcdURDREQnLFxuICAgICAgc2tpbGxfZ2FwX2NvbmZpcm1lZDonXHUyNzA1JyxcbiAgICB9O1xuXG4gICAgbGV0IGh0bWwgPSBgXG4gICAgICA8aDIgc3R5bGU9XCJtYXJnaW4tdG9wOjA7XCI+XHVEODNEXHVEQ0U1IFVwZGF0ZSBNYXN0ZXIgQ1YgRGF0YTwvaDI+XG4gICAgICA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7bWFyZ2luLWJvdHRvbToxNnB4O1wiPlxuICAgICAgICBTZWxlY3QgaW1wcm92ZW1lbnRzIGZyb20gdGhpcyBzZXNzaW9uIHRvIHdyaXRlIGJhY2sgdG8gPGNvZGU+TWFzdGVyX0NWX0RhdGEuanNvbjwvY29kZT4uXG4gICAgICAgIE5vIGl0ZW1zIGFyZSBwcmUtc2VsZWN0ZWQgXHUyMDE0IGNob29zZSBvbmx5IHdoYXQgeW91IHdhbnQgdG8ga2VlcC5cbiAgICAgIDwvcD5cbiAgICAgIDx0YWJsZSBjbGFzcz1cInJldmlldy10YWJsZVwiIHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNnB4O1wiPlxuICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgPHRyPlxuICAgICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6MzZweDt0ZXh0LWFsaWduOmNlbnRlcjtcIj5JbmNsdWRlPC90aD5cbiAgICAgICAgICAgIDx0aD5UeXBlPC90aD5cbiAgICAgICAgICAgIDx0aD5DaGFuZ2U8L3RoPlxuICAgICAgICAgICAgPHRoPlJhdGlvbmFsZTwvdGg+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgPC90aGVhZD5cbiAgICAgICAgPHRib2R5PmA7XG5cbiAgICBmb3IgKGNvbnN0IGMgb2YgY2FuZGlkYXRlcykge1xuICAgICAgY29uc3QgaWNvbiAgICAgPSB0eXBlSWNvbnNbYy50eXBlXSB8fCAnXHVEODNEXHVEQ0NDJztcbiAgICAgIGNvbnN0IG9yaWdpbmFsID0gYy5vcmlnaW5hbCAmJiBjLm9yaWdpbmFsICE9PSAnKG5vdCBpbiBtYXN0ZXIgZGF0YSknXG4gICAgICAgID8gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC44MmVtO2NvbG9yOiM2YjcyODA7bWFyZ2luLXRvcDo0cHg7bWFyZ2luLWJvdHRvbToycHg7XG4gICAgICAgICAgICAgICB0ZXh0LWRlY29yYXRpb246bGluZS10aHJvdWdoO1wiPiR7ZXNjYXBlSHRtbChjLm9yaWdpbmFsKX08L2Rpdj5gXG4gICAgICAgIDogJyc7XG4gICAgICBodG1sICs9IGBcbiAgICAgICAgPHRyIGlkPVwiaGFydmVzdC1yb3ctJHtlc2NhcGVIdG1sKGMuaWQpfVwiPlxuICAgICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO1wiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiaGFydmVzdC1jaGstJHtlc2NhcGVIdG1sKGMuaWQpfVwiXG4gICAgICAgICAgICAgIGRhdGEtaGFydmVzdC1pZD1cIiR7ZXNjYXBlSHRtbChjLmlkKX1cIiBzdHlsZT1cIndpZHRoOjE2cHg7aGVpZ2h0OjE2cHg7Y3Vyc29yOnBvaW50ZXI7XCI+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICA8c3BhbiB0aXRsZT1cIiR7ZXNjYXBlSHRtbChjLnR5cGUpfVwiPiR7aWNvbn08L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07Y29sb3I6IzQ3NTU2OTttYXJnaW4tbGVmdDo0cHg7XCI+JHtlc2NhcGVIdG1sKGMudHlwZS5yZXBsYWNlKC9fL2csJyAnKSl9PC9zcGFuPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPHRkPlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtd2VpZ2h0OjUwMDtcIj4ke2VzY2FwZUh0bWwoYy5sYWJlbCl9PC9kaXY+XG4gICAgICAgICAgICAke29yaWdpbmFsfVxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjg4ZW07Y29sb3I6IzFlMjkzYjttYXJnaW4tdG9wOjJweDtcIj4ke2VzY2FwZUh0bWwoYy5wcm9wb3NlZCl9PC9kaXY+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8dGQgc3R5bGU9XCJmb250LXNpemU6MC44NWVtO2NvbG9yOiM2NDc0OGI7XCI+JHtlc2NhcGVIdG1sKGMucmF0aW9uYWxlKX08L3RkPlxuICAgICAgICA8L3RyPmA7XG4gICAgfVxuXG4gICAgaHRtbCArPSBgXG4gICAgICAgIDwvdGJvZHk+XG4gICAgICA8L3RhYmxlPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6MTJweDthbGlnbi1pdGVtczpjZW50ZXI7XCI+XG4gICAgICAgIDxidXR0b24gb25jbGljaz1cImFwcGx5SGFydmVzdFNlbGVjdGlvbnMoKVwiXG4gICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiMwZWE1ZTk7Y29sb3I6I2ZmZjtib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjZweDtcbiAgICAgICAgICAgICAgICAgcGFkZGluZzoxMHB4IDI0cHg7Zm9udC1zaXplOjFlbTtmb250LXdlaWdodDo2MDA7Y3Vyc29yOnBvaW50ZXI7XCIgaWQ9XCJoYXJ2ZXN0LWFwcGx5LWJ0blwiPlxuICAgICAgICAgIFx1RDgzRFx1RENFNSBBcHBseSBTZWxlY3RlZCBVcGRhdGVzXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIG9uY2xpY2s9XCJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGFydmVzdC1zZWN0aW9uJykuc3R5bGUuZGlzcGxheT0nbm9uZSdcIlxuICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDojZjFmNWY5O2NvbG9yOiM0NzU1Njk7Ym9yZGVyOjFweCBzb2xpZCAjY2JkNWUxO2JvcmRlci1yYWRpdXM6NnB4O1xuICAgICAgICAgICAgICAgICBwYWRkaW5nOjEwcHggMjBweDtmb250LXNpemU6MC45NWVtO2N1cnNvcjpwb2ludGVyO1wiPlxuICAgICAgICAgIFNraXBcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgaWQ9XCJoYXJ2ZXN0LXJlc3VsdFwiIHN0eWxlPVwibWFyZ2luLXRvcDoxNnB4O1wiPjwvZGl2PmA7XG5cbiAgICBzZWN0aW9uLmlubmVySFRNTCA9IGh0bWw7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHNlY3Rpb24uaW5uZXJIVE1MID0gYFxuICAgICAgPGgyIHN0eWxlPVwibWFyZ2luLXRvcDowO1wiPlx1RDgzRFx1RENFNSBVcGRhdGUgTWFzdGVyIENWIERhdGE8L2gyPlxuICAgICAgPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6I2ZlZTJlMjtib3JkZXI6MXB4IHNvbGlkICNmY2E1YTU7Ym9yZGVyLXJhZGl1czo4cHg7XG4gICAgICAgIHBhZGRpbmc6MTJweCAxNnB4O2NvbG9yOiM5OTFiMWI7XCI+XG4gICAgICAgIFx1Mjc0QyBOZXR3b3JrIGVycm9yOiAke2VzY2FwZUh0bWwoZXJyLm1lc3NhZ2UpfVxuICAgICAgPC9kaXY+YDtcbiAgfVxufVxuXG4vLyBhcHBseUhhcnZlc3RTZWxlY3Rpb25zKCkgKGJvdW5kIHZpYSB0aGUgYnV0dG9uJ3Mgb25jbGljayBhYm92ZSkgbGl2ZXMgaW5cbi8vIHdlYi9oYXJ2ZXN0LmpzLCBub3QgaGVyZSBcdTIwMTQgdGhpcyBmaWxlIHVzZWQgdG8gY2FycnkgaXRzIG93biBkaXZlcmdlbnRcbi8vIGR1cGxpY2F0ZSAoZGlmZmVyZW50IGNvbmZpcm0vbWVzc2FnZSBjb3B5LCBubyBjb25maXJtLW1vZGFsIHN0ZXApLCBidXRcbi8vIHNpbmNlIGJvdGggZmlsZXMgcmVuZGVyIGEgYnV0dG9uIHdpdGggdGhlIHNhbWUgb25jbGljayBhbmQgd2luZG93IHJlc29sdmVzXG4vLyBiYXJlIGlkZW50aWZpZXJzIGF0IGNsaWNrIHRpbWUsIGhhcnZlc3QuanMncyB2ZXJzaW9uIHdhcyBhbHdheXMgdGhlIG9uZVxuLy8gYWN0dWFsbHkgaW52b2tlZCBpbiBwcm9kdWN0aW9uIHJlZ2FyZGxlc3M7IHRoaXMgY29weSB3YXMgdW5yZWFjaGFibGUgZGVhZFxuLy8gY29kZS4gUmVtb3ZlZDsgc2VlIHdlYi9oYXJ2ZXN0LmpzLlxuXG4vLyBcdTI1MDBcdTI1MDAgRXhwb3J0cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZXhwb3J0IHtcbiAgcG9wdWxhdGVGaW5hbGlzZVRhYixcbiAgZmluYWxpc2VBcHBsaWNhdGlvbixcbiAgc2hvd0hhcnZlc3RTZWN0aW9uLFxuICBfcmVuZGVyUmVhZGluZXNzQ2hlY2tsaXN0LFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL2ludGVydmlldy1wcmVwLmpzXG4gKiBJbnRlcnZpZXcgUHJlcGFyYXRpb24gcGhhc2UgXHUyMDE0IHBsYWNlaG9sZGVyIGNvbnRlbnQgd2l0aCBuYXZpZ2F0aW9uLlxuICpcbiAqIERlcGVuZGVuY2llcyAocmVzb2x2ZWQgdGhyb3VnaCBnbG9iYWxUaGlzIGF0IHJ1bnRpbWUpOlxuICogICBoYW5kbGVTdGVwQ2xpY2tcbiAqL1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5jb25zdCBsb2cgPSBnZXRMb2dnZXIoJ2ludGVydmlldy1wcmVwJyk7XG5cbmFzeW5jIGZ1bmN0aW9uIHBvcHVsYXRlSW50ZXJ2aWV3UHJlcFRhYigpIHtcbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIGlmICghY29udGVudCkgcmV0dXJuO1xuXG4gIGNvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgc3R5bGU9XCJtYXgtd2lkdGg6NzAwcHg7bWFyZ2luOjAgYXV0bztwYWRkaW5nOjQwcHggMjBweDt0ZXh0LWFsaWduOmNlbnRlcjtcIj5cbiAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6M2VtO21hcmdpbi1ib3R0b206MTZweDtcIj5cdUQ4M0NcdURGQTQ8L2Rpdj5cbiAgICAgIDxoMiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTJweDtcIj5JbnRlcnZpZXcgUHJlcGFyYXRpb248L2gyPlxuICAgICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO21hcmdpbi1ib3R0b206OHB4O1wiPlxuICAgICAgICBBSS1nZW5lcmF0ZWQgaW50ZXJ2aWV3IHByZXBhcmF0aW9uIGJhc2VkIG9uIHRoaXMgam9iIGFuZCB5b3VyIENWIGlzIGNvbWluZyBzb29uLlxuICAgICAgPC9wPlxuICAgICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO2ZvbnQtc2l6ZTowLjllbTtcIj5cbiAgICAgICAgVGhpcyB3aWxsIGluY2x1ZGUgbGlrZWx5IGludGVydmlldyBxdWVzdGlvbnMsIHN1Z2dlc3RlZCB0YWxraW5nIHBvaW50cywgYW5kXG4gICAgICAgIFNUQVItZm9ybWF0IGFuc3dlcnMgZHJhd24gZnJvbSB5b3VyIGV4cGVyaWVuY2UuXG4gICAgICA8L3A+XG4gICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDo0MHB4O1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLXByaW1hcnlcIiBvbmNsaWNrPVwiaGFuZGxlU3RlcENsaWNrKCd0aGFua195b3UnKVwiXG4gICAgICAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6MWVtO3BhZGRpbmc6MTBweCAyNHB4O1wiPlxuICAgICAgICAgIFByb2NlZWQgdG8gVGhhbmsgWW91IExldHRlciBcdTIxOTJcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xuXG4gIGxvZy5kZWJ1ZygnSW50ZXJ2aWV3IHByZXAgcGxhY2Vob2xkZXIgcmVuZGVyZWQnKTtcbn1cblxuZXhwb3J0IHsgcG9wdWxhdGVJbnRlcnZpZXdQcmVwVGFiIH07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi90aGFuay15b3UuanNcbiAqIFRoYW5rIFlvdSBMZXR0ZXIgcGhhc2UgXHUyMDE0IHBsYWNlaG9sZGVyIGNvbnRlbnQgd2l0aCBuYXZpZ2F0aW9uLlxuICpcbiAqIERlcGVuZGVuY2llcyAocmVzb2x2ZWQgdGhyb3VnaCBnbG9iYWxUaGlzIGF0IHJ1bnRpbWUpOlxuICogICBoYW5kbGVTdGVwQ2xpY2tcbiAqL1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5jb25zdCBsb2cgPSBnZXRMb2dnZXIoJ3RoYW5rLXlvdScpO1xuXG5hc3luYyBmdW5jdGlvbiBwb3B1bGF0ZVRoYW5rWW91VGFiKCkge1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgaWYgKCFjb250ZW50KSByZXR1cm47XG5cbiAgY29udGVudC5pbm5lckhUTUwgPSBgXG4gICAgPGRpdiBzdHlsZT1cIm1heC13aWR0aDo3MDBweDttYXJnaW46MCBhdXRvO3BhZGRpbmc6NDBweCAyMHB4O3RleHQtYWxpZ246Y2VudGVyO1wiPlxuICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTozZW07bWFyZ2luLWJvdHRvbToxNnB4O1wiPlx1RDgzRFx1REU0RjwvZGl2PlxuICAgICAgPGgyIHN0eWxlPVwibWFyZ2luLWJvdHRvbToxMnB4O1wiPlRoYW5rIFlvdSBMZXR0ZXI8L2gyPlxuICAgICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO21hcmdpbi1ib3R0b206OHB4O1wiPlxuICAgICAgICBBSS1nZW5lcmF0ZWQgdGhhbmsgeW91IGxldHRlciB0ZW1wbGF0ZXMgYXJlIGNvbWluZyBzb29uLlxuICAgICAgPC9wPlxuICAgICAgPHAgc3R5bGU9XCJjb2xvcjojNmI3MjgwO2ZvbnQtc2l6ZTowLjllbTtcIj5cbiAgICAgICAgQWZ0ZXIgeW91ciBpbnRlcnZpZXcsIHVzZSB0aGlzIHRvIGdlbmVyYXRlIGEgcGVyc29uYWxpc2VkIHRoYW5rIHlvdSBub3RlXG4gICAgICAgIHRoYXQgcmVpbmZvcmNlcyB5b3VyIGZpdCBmb3IgdGhlIHJvbGUuXG4gICAgICA8L3A+XG4gICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDo0MHB4O1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLXByaW1hcnlcIiBvbmNsaWNrPVwiaGFuZGxlU3RlcENsaWNrKCdoYXJ2ZXN0JylcIlxuICAgICAgICAgICAgICAgIHN0eWxlPVwiZm9udC1zaXplOjFlbTtwYWRkaW5nOjEwcHggMjRweDtcIj5cbiAgICAgICAgICBQcm9jZWVkIHRvIEhhcnZlc3QgSW1wcm92ZW1lbnRzIFx1MjE5MlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PmA7XG5cbiAgbG9nLmRlYnVnKCdUaGFuayB5b3UgbGV0dGVyIHBsYWNlaG9sZGVyIHJlbmRlcmVkJyk7XG59XG5cbmV4cG9ydCB7IHBvcHVsYXRlVGhhbmtZb3VUYWIgfTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogSGFydmVzdCB0YWI6IExMTS1zY29yZWQgZ3JvdXBlZCB2aWV3IG9mIG1hc3Rlci1DViBpbXByb3ZlbWVudCBjYW5kaWRhdGVzLlxuICpcbiAqIFB1YmxpYyBleHBvcnRzOlxuICogICBwb3B1bGF0ZUhhcnZlc3RUYWIoKSAgICAgICAgXHUyMDE0IGNhbGxlZCBieSByZXZpZXctdGFibGUtYmFzZS5qcyBvbiB0YWIgc3dpdGNoXG4gKiAgIGFwcGx5SGFydmVzdFNlbGVjdGlvbnMoKSAgICBcdTIwMTQgY2FsbGVkIGJ5IGlubGluZSBvbmNsaWNrIG9uIHRoZSBBcHBseSBidXR0b25cbiAqICAgcmVmcmVzaEhhcnZlc3RBbmFseXNpcygpICAgIFx1MjAxNCBjYWxsZWQgYnkgaW5saW5lIG9uY2xpY2sgb24gdGhlIFJlZnJlc2ggYnV0dG9uXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZXNjLCByZW5kZXJQcm9wb3NhbFJvdywgYXR0YWNoUHJvcG9zYWxSb3dMaXN0ZW5lcnMgfSBmcm9tICcuL3Byb3Bvc2FsLXJldmlldy5qcyc7XG5cbmNvbnN0IGxvZyA9IGdldExvZ2dlcignaGFydmVzdCcpO1xuXG4vLyBcdTI1MDBcdTI1MDAgRGlzcGxheSBjb25maWcgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8qKlxuICogTWVyZ2VkIGRpc3BsYXkgdHlwZSBjb25maWcuXG4gKiBuZXdfc2tpbGwgYW5kIHNraWxsX2dhcF9jb25maXJtZWQgYm90aCBtYXAgdG8gdGhlICdza2lsbCcgZGlzcGxheSBncm91cC5cbiAqL1xuY29uc3QgSEFSVkVTVF9UWVBFX0NPTkZJRyA9IHtcbiAgaW1wcm92ZWRfYnVsbGV0OiAgICAgeyBsYWJlbDogJ0V4cGVyaWVuY2UgQnVsbGV0cycsICAgICBpY29uOiAnXHUyNzBGXHVGRTBGJywgIHNvcnQ6IDEsIGRpc3BsYXlUeXBlOiAnaW1wcm92ZWRfYnVsbGV0JyAgICAgfSxcbiAgbmV3X3NraWxsOiAgICAgICAgICAgeyBsYWJlbDogJ1NraWxscycsICAgICAgICAgICAgICAgICBpY29uOiAnXHVEODNEXHVERUUwXHVGRTBGJywgIHNvcnQ6IDIsIGRpc3BsYXlUeXBlOiAnc2tpbGwnICAgICAgICAgICAgICAgfSxcbiAgc2tpbGxfZ2FwX2NvbmZpcm1lZDogeyBsYWJlbDogJ1NraWxscycsICAgICAgICAgICAgICAgICBpY29uOiAnXHVEODNEXHVERUUwXHVGRTBGJywgIHNvcnQ6IDIsIGRpc3BsYXlUeXBlOiAnc2tpbGwnICAgICAgICAgICAgICAgfSxcbiAgc3VtbWFyeV92YXJpYW50OiAgICAgeyBsYWJlbDogJ1Byb2Zlc3Npb25hbCBTdW1tYXJ5JywgICBpY29uOiAnXHVEODNEXHVEQ0REJywgIHNvcnQ6IDMsIGRpc3BsYXlUeXBlOiAnc3VtbWFyeV92YXJpYW50JyAgICAgfSxcbiAgc2tpbGxfdHlwZV91cGRhdGU6ICAgeyBsYWJlbDogJ1NraWxsIENsYXNzaWZpY2F0aW9uJywgICBpY29uOiAnXHVEODNDXHVERkY3XHVGRTBGJywgIHNvcnQ6IDQsIGRpc3BsYXlUeXBlOiAnc2tpbGxfdHlwZV91cGRhdGUnICB9LFxufTtcblxuY29uc3QgSEFSVkVTVF9UWVBFX0RFU0NSSVBUSU9OUyA9IHtcbiAgaW1wcm92ZWRfYnVsbGV0OiAgICAgICdSZXdyaXR0ZW4gYWNoaWV2ZW1lbnQgYnVsbGV0cyB5b3UgYXBwcm92ZWQgaW4gdGhlIFJld3JpdGVzIHN0ZXAuIFByb21vdGluZyB1cGRhdGVzIHRoZSBidWxsZXQgdGV4dCBpbiB5b3VyIG1hc3RlciBDVi4nLFxuICBza2lsbDogICAgICAgICAgICAgICAgJ1NraWxscyBhYnNlbnQgZnJvbSB5b3VyIG1hc3RlciBDViBcdTIwMTQgZWl0aGVyIGFkZGVkIChcdUQ4M0NcdUREOTUgQWRkZWQpIGR1cmluZyB0aGUgU2tpbGxzIFJldmlldyBvciBjb25maXJtZWQgd2hlbiBhc2tlZCAoXHUyNzA1IENvbmZpcm1lZCkuIFByb21vdGluZyBhZGRzIHRoZW0gdG8geW91ciBza2lsbHMgc2VjdGlvbi4nLFxuICBzdW1tYXJ5X3ZhcmlhbnQ6ICAgICAgJ0EgcmV3cml0dGVuIHZlcnNpb24gb2YgeW91ciBwcm9mZXNzaW9uYWwgc3VtbWFyeS4gUHJvbW90aW5nIHN0b3JlcyBpdCBhcyBhIG5hbWVkIHZhcmlhbnQgaW4geW91ciBtYXN0ZXIgQ1YuJyxcbiAgc2tpbGxfdHlwZV91cGRhdGU6ICAgICdIYXJkL3NvZnQgc2tpbGwgY2xhc3NpZmljYXRpb25zIHlvdSBjaGFuZ2VkIGR1cmluZyB0aGlzIHNlc3Npb24uIFByb21vdGluZyBwZXJzaXN0cyB0aGUgbmV3IHR5cGUgc28gaXQgaXMgbm90IHJlLWNsYXNzaWZpZWQgb24gZXZlcnkgYXBwbGljYXRpb24uJyxcbn07XG5cbmNvbnN0IEhBUlZFU1RfU09VUkNFX0JBREdFID0ge1xuICBuZXdfc2tpbGw6ICAgICAgICAgICAnPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC43NWVtO2JhY2tncm91bmQ6I2RiZWFmZTtjb2xvcjojMWQ0ZWQ4O2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6MXB4IDZweDttYXJnaW4tbGVmdDo2cHg7d2hpdGUtc3BhY2U6bm93cmFwO1wiPlx1RDgzQ1x1REQ5NSBBZGRlZDwvc3Bhbj4nLFxuICBza2lsbF9nYXBfY29uZmlybWVkOiAnPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC43NWVtO2JhY2tncm91bmQ6I2RjZmNlNztjb2xvcjojMTY2NTM0O2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6MXB4IDZweDttYXJnaW4tbGVmdDo2cHg7d2hpdGUtc3BhY2U6bm93cmFwO1wiPlx1MjcwNSBDb25maXJtZWQ8L3NwYW4+JyxcbiAgc2tpbGxfdHlwZV91cGRhdGU6ICAgJzxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjAuNzVlbTtiYWNrZ3JvdW5kOiNmZWY5YzM7Y29sb3I6Izg1NGQwZTtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjFweCA2cHg7bWFyZ2luLWxlZnQ6NnB4O3doaXRlLXNwYWNlOm5vd3JhcDtcIj5cdUQ4M0NcdURGRjdcdUZFMEYgUmVjbGFzc2lmaWVkPC9zcGFuPicsXG59O1xuXG5jb25zdCBSRUNfQ09ORklHID0ge1xuICBwcm9tb3RlOiB7IGxhYmVsOiAnUHJvbW90ZScsICAgICAgaWNvbjogJ1x1MkIwNlx1RkUwRicsICBjb2xvcjogJyMxNjY1MzQnLCBiZzogJyNmMGZkZjQnLCBzb3J0OiAwIH0sXG4gIHNraXA6ICAgIHsgbGFiZWw6ICdTa2lwJywgICAgICAgICBpY29uOiAnXHUyM0VEXHVGRTBGJywgIGNvbG9yOiAnIzlhMzQxMicsIGJnOiAnI2ZmZjdlZCcsIHNvcnQ6IDEgfSxcbiAgbnVsbDogICAgeyBsYWJlbDogJ1VuYW5hbHl6ZWQnLCAgIGljb246ICdcdTI3NTMnLCAgY29sb3I6ICcjNGI1NTYzJywgYmc6ICcjZjlmYWZiJywgc29ydDogMiB9LFxufTtcblxuY29uc3QgQ09ORl9DT05GSUcgPSB7XG4gIGhpZ2g6ICAgeyBsYWJlbDogJ0hpZ2gnLCAgIGNvbG9yOiAnIzE1ODAzZCcsIGJnOiAnI2YwZmRmNCcsIHNvcnQ6IDAgfSxcbiAgbWVkaXVtOiB7IGxhYmVsOiAnTWVkaXVtJywgY29sb3I6ICcjYjQ1MzA5JywgYmc6ICcjZmZmYmViJywgc29ydDogMSB9LFxuICBsb3c6ICAgIHsgbGFiZWw6ICdMb3cnLCAgICBjb2xvcjogJyNiOTFjMWMnLCBiZzogJyNmZWYyZjInLCBzb3J0OiAyIH0sXG4gIG51bGw6ICAgeyBsYWJlbDogJycsICAgICAgIGNvbG9yOiAnIzZiNzI4MCcsIGJnOiAnI2Y5ZmFmYicsIHNvcnQ6IDMgfSxcbn07XG5cbi8vIFx1MjUwMFx1MjUwMCBHcm91cGluZyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gZ2V0RGlzcGxheVR5cGUoY2FuZGlkYXRlKSB7XG4gIHJldHVybiBIQVJWRVNUX1RZUEVfQ09ORklHW2NhbmRpZGF0ZS50eXBlXT8uZGlzcGxheVR5cGUgPz8gY2FuZGlkYXRlLnR5cGU7XG59XG5cbi8qKlxuICogR3JvdXAgZW5yaWNoZWQgY2FuZGlkYXRlcyBpbnRvIGEgbmVzdGVkIHN0cnVjdHVyZTpcbiAqICAgeyBkaXNwbGF5VHlwZSBcdTIxOTIgeyByZWMgXHUyMTkyIHsgY29uZmlkZW5jZSBcdTIxOTIgW2NhbmRpZGF0ZSwgXHUyMDI2XSB9IH0gfVxuICovXG5mdW5jdGlvbiBncm91cENhbmRpZGF0ZXMoZW5yaWNoZWQpIHtcbiAgY29uc3QgZ3JvdXBzID0ge307XG4gIGZvciAoY29uc3QgYyBvZiBlbnJpY2hlZCkge1xuICAgIGNvbnN0IGR0ICAgPSBnZXREaXNwbGF5VHlwZShjKTtcbiAgICBjb25zdCByZWMgID0gYy5yZWNvbW1lbmRhdGlvbiA/PyAnbnVsbCc7XG4gICAgY29uc3QgY29uZiA9IGMuY29uZmlkZW5jZSAgICAgPz8gJ251bGwnO1xuICAgIGlmICghZ3JvdXBzW2R0XSkgICAgICAgICAgICAgICAgZ3JvdXBzW2R0XSAgICAgICA9IHt9O1xuICAgIGlmICghZ3JvdXBzW2R0XVtyZWNdKSAgICAgICAgICAgZ3JvdXBzW2R0XVtyZWNdICA9IHt9O1xuICAgIGlmICghZ3JvdXBzW2R0XVtyZWNdW2NvbmZdKSAgICAgZ3JvdXBzW2R0XVtyZWNdW2NvbmZdID0gW107XG4gICAgZ3JvdXBzW2R0XVtyZWNdW2NvbmZdLnB1c2goYyk7XG4gIH1cbiAgcmV0dXJuIGdyb3Vwcztcbn1cblxuZnVuY3Rpb24gc29ydGVkS2V5cyhvYmosIGNvbmZpZ01hcCkge1xuICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5zb3J0KChhLCBiKSA9PiB7XG4gICAgY29uc3Qgc2EgPSBjb25maWdNYXBbYV0/LnNvcnQgPz8gOTk7XG4gICAgY29uc3Qgc2IgPSBjb25maWdNYXBbYl0/LnNvcnQgPz8gOTk7XG4gICAgcmV0dXJuIHNhIC0gc2I7XG4gIH0pO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgUHJlLWNoZWNrIGxvZ2ljIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuLy8gQWxsIGhhcnZlc3QgaXRlbXMgc3RhcnQgdW5jaGVja2VkIFx1MjAxNCBtYXN0ZXIgQ1YgdXBkYXRlcyBhcmUgb3B0LWluIG9ubHkgKFVTLUExMSkuXG4vLyBHcm91cHMgd2l0aCBoaWdoL21lZGl1bSBjb25maWRlbmNlIHByb21vdGlvbnMgYXJlIGV4cGFuZGVkIHNvIGNhbmRpZGF0ZXMgYXJlXG4vLyBwcm9taW5lbnQsIGJ1dCBubyBjaGVja2JveCBpcyBwcmUtc2VsZWN0ZWQuXG5cbmZ1bmN0aW9uIHNob3VsZFByZUNoZWNrKF9jYW5kaWRhdGUpIHtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgQ29sbGFwc2UgZGVmYXVsdCBsb2dpYyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gdHlwZUdyb3VwRXhwYW5kZWQoZHRDYW5kaWRhdGVzKSB7XG4gIHJldHVybiBkdENhbmRpZGF0ZXMuc29tZShjID0+IGMucmVjb21tZW5kYXRpb24gPT09ICdwcm9tb3RlJyAmJlxuICAgIChjLmNvbmZpZGVuY2UgPT09ICdoaWdoJyB8fCBjLmNvbmZpZGVuY2UgPT09ICdtZWRpdW0nKSk7XG59XG5cbmZ1bmN0aW9uIHJlY0dyb3VwRXhwYW5kZWQocmVjLCBjb25mQ2FuZGlkYXRlcykge1xuICBpZiAocmVjICE9PSAncHJvbW90ZScpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGNvbmZDYW5kaWRhdGVzLnNvbWUoYyA9PiBjLmNvbmZpZGVuY2UgPT09ICdoaWdoJyB8fCBjLmNvbmZpZGVuY2UgPT09ICdtZWRpdW0nKTtcbn1cblxuZnVuY3Rpb24gY29uZlRpZXJFeHBhbmRlZChyZWMsIGNvbmYpIHtcbiAgcmV0dXJuIHJlYyA9PT0gJ3Byb21vdGUnICYmIChjb25mID09PSAnaGlnaCcgfHwgY29uZiA9PT0gJ21lZGl1bScpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgUmVuZGVyaW5nIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiByZW5kZXJDb25maWRlbmNlQmFkZ2UoY29uZikge1xuICBjb25zdCBjZmcgPSBDT05GX0NPTkZJR1tjb25mXSA/PyBDT05GX0NPTkZJR1snbnVsbCddO1xuICBpZiAoIWNmZy5sYWJlbCkgcmV0dXJuICcnO1xuICByZXR1cm4gYDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjAuN2VtO2ZvbnQtd2VpZ2h0OjYwMDtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjFweCA2cHg7YmFja2dyb3VuZDoke2NmZy5iZ307Y29sb3I6JHtjZmcuY29sb3J9O2JvcmRlcjoxcHggc29saWQgJHtjZmcuY29sb3J9MzA7d2hpdGUtc3BhY2U6bm93cmFwO1wiPiR7ZXNjKGNmZy5sYWJlbCl9PC9zcGFuPmA7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclJlY29tbWVuZGF0aW9uQmFkZ2UocmVjKSB7XG4gIGNvbnN0IGNmZyA9IFJFQ19DT05GSUdbcmVjXSA/PyBSRUNfQ09ORklHWydudWxsJ107XG4gIHJldHVybiBgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC43NWVtO2ZvbnQtd2VpZ2h0OjYwMDtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjJweCA4cHg7YmFja2dyb3VuZDoke2NmZy5iZ307Y29sb3I6JHtjZmcuY29sb3J9O3doaXRlLXNwYWNlOm5vd3JhcDtcIj4ke2NmZy5pY29ufSAke2VzYyhjZmcubGFiZWwpfTwvc3Bhbj5gO1xufVxuXG5mdW5jdGlvbiByZW5kZXJDYW5kaWRhdGVSb3coYywgaWR4KSB7XG4gIGNvbnN0IHR5cGVDZmcgICA9IEhBUlZFU1RfVFlQRV9DT05GSUdbYy50eXBlXSA/PyB7fTtcbiAgY29uc3QgcmVjQmFkZ2UgID0gYy5yZWNvbW1lbmRhdGlvbiA/IHJlbmRlclJlY29tbWVuZGF0aW9uQmFkZ2UoYy5yZWNvbW1lbmRhdGlvbikgOiAnJztcbiAgY29uc3QgY29uZkJhZGdlID0gYy5jb25maWRlbmNlID8gcmVuZGVyQ29uZmlkZW5jZUJhZGdlKGMuY29uZmlkZW5jZSkgOiAnJztcbiAgY29uc3QgaGFzUmVhc29uaW5nID0gYy5hbmFseXNpc0F2YWlsYWJsZSAmJiBjLnJlYXNvbmluZztcblxuICByZXR1cm4gcmVuZGVyUHJvcG9zYWxSb3coe1xuICAgIGlkOiAgICAgICAgICAgICAgYy5pZCxcbiAgICB0eXBlTGFiZWw6ICAgICAgIHR5cGVDZmcubGFiZWwgPz8gYy50eXBlLFxuICAgIHNvdXJjZUJhZGdlSHRtbDogSEFSVkVTVF9TT1VSQ0VfQkFER0VbYy50eXBlXSA/PyAnJyxcbiAgICBsYWJlbDogICAgICAgICAgIGMubGFiZWwsXG4gICAgb3JpZ2luYWw6ICAgICAgICBjLm9yaWdpbmFsLFxuICAgIHByb3Bvc2VkOiAgICAgICAgYy5wcm9wb3NlZCxcbiAgICBkZXRhaWxUZXh0OiAgICAgIGhhc1JlYXNvbmluZyA/IGMucmVhc29uaW5nIDogbnVsbCxcbiAgICBiYWRnZXNIdG1sOiAgICAgICBgJHtyZWNCYWRnZX0ke2NvbmZCYWRnZX1gLFxuICAgIGNoZWNrZWQ6ICAgICAgICAgc2hvdWxkUHJlQ2hlY2soYyksXG4gIH0sIHtcbiAgICBpZFByZWZpeDogICAgICAgICAnaGFydmVzdCcsXG4gICAgY2hlY2tib3hEYXRhQXR0cjogJ2hhcnZlc3QtaWQnLFxuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVuZGVyQ29uZmlkZW5jZVRpZXIocmVjLCBjb25mLCBjYW5kaWRhdGVzKSB7XG4gIGNvbnN0IGNmZyAgICAgID0gQ09ORl9DT05GSUdbY29uZl0gPz8gQ09ORl9DT05GSUdbJ251bGwnXTtcbiAgY29uc3QgZXhwYW5kZWQgPSBjb25mVGllckV4cGFuZGVkKHJlYywgY29uZik7XG4gIGNvbnN0IHRpZXJJZCAgID0gYGhhcnZlc3QtY29uZi0ke3JlY30tJHtjb25mfS0ke0RhdGUubm93KCl9YDtcbiAgY29uc3QgY291bnQgICAgPSBjYW5kaWRhdGVzLmxlbmd0aDtcblxuICBpZiAoIWNmZy5sYWJlbCkge1xuICAgIC8vIE5vLWFuYWx5c2lzIHRpZXIgXHUyMDE0IHJlbmRlciByb3dzIGRpcmVjdGx5IHdpdGhvdXQgYSBzdWItaGVhZGVyXG4gICAgcmV0dXJuIGNhbmRpZGF0ZXMubWFwKChjLCBpKSA9PiByZW5kZXJDYW5kaWRhdGVSb3coYywgaSkpLmpvaW4oJycpO1xuICB9XG5cbiAgY29uc3QgdG9nZ2xlSWNvbiA9IGV4cGFuZGVkID8gJ1x1MjVCRScgOiAnXHUyNUI4JztcbiAgY29uc3QgaGVhZGVySHRtbCA9IGBcbiAgICA8dHIgY2xhc3M9XCJoYXJ2ZXN0LWNvbmYtaGVhZGVyXCIgc3R5bGU9XCJjdXJzb3I6cG9pbnRlcjtiYWNrZ3JvdW5kOiNmYWZhZmE7XCIgb25jbGljaz1cInRvZ2dsZUhhcnZlc3RTZWN0aW9uKCcke3RpZXJJZH0nKVwiPlxuICAgICAgPHRkIGNvbHNwYW49XCIyXCIgc3R5bGU9XCJwYWRkaW5nOjZweCAxMnB4IDZweCAzNnB4O2ZvbnQtc2l6ZTowLjhlbTtjb2xvcjoke2NmZy5jb2xvcn07Zm9udC13ZWlnaHQ6NjAwO1wiPlxuICAgICAgICA8c3BhbiBpZD1cIiR7dGllcklkfS1pY29uXCI+JHt0b2dnbGVJY29ufTwvc3Bhbj5cbiAgICAgICAgJHtlc2MoY2ZnLmxhYmVsKX0gY29uZmlkZW5jZVxuICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjg1ZW07Zm9udC13ZWlnaHQ6NDAwO2NvbG9yOiM5Y2EzYWY7bWFyZ2luLWxlZnQ6NnB4O1wiPigke2NvdW50fSk8L3NwYW4+XG4gICAgICA8L3RkPlxuICAgIDwvdHI+XG4gICAgPHRib2R5IGlkPVwiJHt0aWVySWR9XCIgc3R5bGU9XCIke2V4cGFuZGVkID8gJycgOiAnZGlzcGxheTpub25lOyd9XCI+XG4gICAgICAke2NhbmRpZGF0ZXMubWFwKChjLCBpKSA9PiByZW5kZXJDYW5kaWRhdGVSb3coYywgaSkpLmpvaW4oJycpfVxuICAgIDwvdGJvZHk+YDtcbiAgcmV0dXJuIGhlYWRlckh0bWw7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclJlY0dyb3VwKGR0LCByZWMsIGNvbmZNYXApIHtcbiAgY29uc3QgY2ZnID0gUkVDX0NPTkZJR1tyZWNdID8/IFJFQ19DT05GSUdbJ251bGwnXTtcbiAgY29uc3QgYWxsQ2FuZHMgPSBPYmplY3QudmFsdWVzKGNvbmZNYXApLmZsYXQoKTtcbiAgY29uc3QgZXhwYW5kZWQgPSByZWNHcm91cEV4cGFuZGVkKHJlYywgYWxsQ2FuZHMpO1xuICBjb25zdCBncm91cElkICA9IGBoYXJ2ZXN0LXJlYy0ke2R0fS0ke3JlY30tJHtEYXRlLm5vdygpfWA7XG4gIGNvbnN0IGNvdW50ICAgID0gYWxsQ2FuZHMubGVuZ3RoO1xuXG4gIGNvbnN0IGNvbmZzICAgID0gc29ydGVkS2V5cyhjb25mTWFwLCBDT05GX0NPTkZJRyk7XG4gIGNvbnN0IGhhc011bHRpcGxlQ29uZnMgPSBjb25mcy5sZW5ndGggPiAxIHx8IChjb25mcy5sZW5ndGggPT09IDEgJiYgQ09ORl9DT05GSUdbY29uZnNbMF1dPy5sYWJlbCk7XG5cbiAgY29uc3QgaW5uZXJSb3dzID0gY29uZnMubWFwKGNvbmYgPT4gcmVuZGVyQ29uZmlkZW5jZVRpZXIocmVjLCBjb25mLCBjb25mTWFwW2NvbmZdKSkuam9pbignJyk7XG5cbiAgY29uc3QgdG9nZ2xlSWNvbiA9IGV4cGFuZGVkID8gJ1x1MjVCRScgOiAnXHUyNUI4JztcbiAgcmV0dXJuIGBcbiAgICA8dHIgY2xhc3M9XCJoYXJ2ZXN0LXJlYy1oZWFkZXJcIiBzdHlsZT1cImN1cnNvcjpwb2ludGVyO2JhY2tncm91bmQ6JHtjZmcuYmd9O1wiIG9uY2xpY2s9XCJ0b2dnbGVIYXJ2ZXN0U2VjdGlvbignJHtncm91cElkfScpXCI+XG4gICAgICA8dGQgY29sc3Bhbj1cIjJcIiBzdHlsZT1cInBhZGRpbmc6OHB4IDEycHggOHB4IDI0cHg7Zm9udC1zaXplOjAuODVlbTtjb2xvcjoke2NmZy5jb2xvcn07Zm9udC13ZWlnaHQ6NzAwO1wiPlxuICAgICAgICA8c3BhbiBpZD1cIiR7Z3JvdXBJZH0taWNvblwiPiR7dG9nZ2xlSWNvbn08L3NwYW4+XG4gICAgICAgICR7Y2ZnLmljb259ICR7ZXNjKGNmZy5sYWJlbCl9XG4gICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtmb250LXdlaWdodDo0MDA7Y29sb3I6IzljYTNhZjttYXJnaW4tbGVmdDo2cHg7XCI+KCR7Y291bnR9KTwvc3Bhbj5cbiAgICAgIDwvdGQ+XG4gICAgPC90cj5cbiAgICA8dGJvZHkgaWQ9XCIke2dyb3VwSWR9XCIgc3R5bGU9XCIke2V4cGFuZGVkID8gJycgOiAnZGlzcGxheTpub25lOyd9XCI+XG4gICAgICAke2hhc011bHRpcGxlQ29uZnMgPyBpbm5lclJvd3MgOiBhbGxDYW5kcy5tYXAoKGMsIGkpID0+IHJlbmRlckNhbmRpZGF0ZVJvdyhjLCBpKSkuam9pbignJyl9XG4gICAgPC90Ym9keT5gO1xufVxuXG5mdW5jdGlvbiByZW5kZXJUeXBlR3JvdXAoZHQsIHJlY01hcCwgYWxsRHRDYW5kaWRhdGVzKSB7XG4gIGNvbnN0IGNmZyAgICAgID0gSEFSVkVTVF9UWVBFX0NPTkZJR1tkdF0gPz8geyBsYWJlbDogZHQsIGljb246ICdcdUQ4M0RcdURDQ0InLCBzb3J0OiA5OSB9O1xuICBjb25zdCBleHBhbmRlZCA9IHR5cGVHcm91cEV4cGFuZGVkKGFsbER0Q2FuZGlkYXRlcyk7XG4gIGNvbnN0IGdyb3VwSWQgID0gYGhhcnZlc3QtdHlwZS0ke2R0fS0ke0RhdGUubm93KCl9YDtcbiAgY29uc3QgY291bnQgICAgPSBhbGxEdENhbmRpZGF0ZXMubGVuZ3RoO1xuICBjb25zdCBkZXNjICAgICA9IEhBUlZFU1RfVFlQRV9ERVNDUklQVElPTlNbZHRdID8/ICcnO1xuXG4gIGNvbnN0IHJlY3MgICAgICAgID0gc29ydGVkS2V5cyhyZWNNYXAsIFJFQ19DT05GSUcpO1xuICBjb25zdCBoYXNNdWx0aXBsZVJlY3MgPSByZWNzLmxlbmd0aCA+IDE7XG5cbiAgY29uc3QgaW5uZXJIdG1sID0gcmVjcy5tYXAocmVjID0+IHtcbiAgICBpZiAoIWhhc011bHRpcGxlUmVjcykge1xuICAgICAgLy8gU3VwcHJlc3MgdGhlIHJlYy1sZXZlbCBoZWFkZXI7IHJlbmRlciBjb25maWRlbmNlIHRpZXJzIGRpcmVjdGx5XG4gICAgICBjb25zdCBjb25mTWFwICA9IHJlY01hcFtyZWNdO1xuICAgICAgY29uc3QgY29uZnMgICAgPSBzb3J0ZWRLZXlzKGNvbmZNYXAsIENPTkZfQ09ORklHKTtcbiAgICAgIGNvbnN0IGhhc0NvbmZzID0gY29uZnMubGVuZ3RoID4gMSB8fCAoY29uZnMubGVuZ3RoID09PSAxICYmIENPTkZfQ09ORklHW2NvbmZzWzBdXT8ubGFiZWwpO1xuICAgICAgcmV0dXJuIGhhc0NvbmZzXG4gICAgICAgID8gY29uZnMubWFwKGNvbmYgPT4gcmVuZGVyQ29uZmlkZW5jZVRpZXIocmVjLCBjb25mLCBjb25mTWFwW2NvbmZdKSkuam9pbignJylcbiAgICAgICAgOiBjb25mTWFwW2NvbmZzWzBdXS5tYXAoKGMsIGkpID0+IHJlbmRlckNhbmRpZGF0ZVJvdyhjLCBpKSkuam9pbignJyk7XG4gICAgfVxuICAgIHJldHVybiByZW5kZXJSZWNHcm91cChkdCwgcmVjLCByZWNNYXBbcmVjXSk7XG4gIH0pLmpvaW4oJycpO1xuXG4gIGNvbnN0IHRvZ2dsZUljb24gPSBleHBhbmRlZCA/ICdcdTI1QkUnIDogJ1x1MjVCOCc7XG4gIHJldHVybiBgXG4gICAgPGRpdiBjbGFzcz1cImhhcnZlc3QtdHlwZS1zZWN0aW9uXCIgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjI0cHg7Ym9yZGVyOjFweCBzb2xpZCAjZTJlOGYwO2JvcmRlci1yYWRpdXM6OHB4O292ZXJmbG93OmhpZGRlbjtcIj5cbiAgICAgIDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmOGZhZmM7cGFkZGluZzoxMnB4IDE2cHg7Y3Vyc29yOnBvaW50ZXI7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTBweDtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZTJlOGYwO1wiXG4gICAgICAgICAgIG9uY2xpY2s9XCJ0b2dnbGVIYXJ2ZXN0U2VjdGlvbignJHtncm91cElkfScpXCI+XG4gICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjEuMjVlbTtcIj4ke2NmZy5pY29ufTwvc3Bhbj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImZsZXg6MTtcIj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6NzAwO2NvbG9yOiMwZjE3MmE7Zm9udC1zaXplOjAuOTVlbTtcIj5cbiAgICAgICAgICAgIDxzcGFuIGlkPVwiJHtncm91cElkfS1pY29uXCI+JHt0b2dnbGVJY29ufTwvc3Bhbj5cbiAgICAgICAgICAgICR7ZXNjKGNmZy5sYWJlbCl9XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjgyZW07Zm9udC13ZWlnaHQ6NDAwO2NvbG9yOiM5NGEzYjg7bWFyZ2luLWxlZnQ6NnB4O1wiPigke2NvdW50fSk8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgJHtkZXNjID8gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC43OGVtO2NvbG9yOiM2NDc0OGI7bWFyZ2luLXRvcDoycHg7XCI+JHtlc2MoZGVzYyl9PC9kaXY+YCA6ICcnfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBpZD1cIiR7Z3JvdXBJZH1cIiBzdHlsZT1cIiR7ZXhwYW5kZWQgPyAnJyA6ICdkaXNwbGF5Om5vbmU7J31cIj5cbiAgICAgICAgPHRhYmxlIHN0eWxlPVwid2lkdGg6MTAwJTtib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7XCI+XG4gICAgICAgICAgJHtpbm5lckh0bWx9XG4gICAgICAgIDwvdGFibGU+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xufVxuXG5mdW5jdGlvbiByZW5kZXJIYXJ2ZXN0VGFiSHRtbChlbnJpY2hlZCwgYW5hbHlzaXNPaywgYW5hbHlzaXNFcnJvcikge1xuICBjb25zdCBncm91cHMgPSBncm91cENhbmRpZGF0ZXMoZW5yaWNoZWQpO1xuICBjb25zdCBkdEtleXMgPSBzb3J0ZWRLZXlzKGdyb3VwcywgT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKEhBUlZFU1RfVFlQRV9DT05GSUcpLm1hcCgoW2ssIHZdKSA9PiBbdi5kaXNwbGF5VHlwZSwgdl0pXG4gICkpO1xuXG4gIGNvbnN0IHRvdGFsQ291bnQgPSBlbnJpY2hlZC5sZW5ndGg7XG5cbiAgY29uc3QgYW5hbHlzaXNXYXJuaW5nID0gIWFuYWx5c2lzT2tcbiAgICA/IGA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojZmZmYmViO2JvcmRlcjoxcHggc29saWQgI2ZjZDM0ZDtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjEwcHggMTRweDttYXJnaW4tYm90dG9tOjE2cHg7Zm9udC1zaXplOjAuODdlbTtjb2xvcjojOTI0MDBlO1wiPlxuICAgICAgICBcdTI2QTBcdUZFMEYgTExNIGFuYWx5c2lzIHVuYXZhaWxhYmxlJHthbmFseXNpc0Vycm9yID8gYDogJHtlc2MoYW5hbHlzaXNFcnJvcil9YCA6ICcnfS4gQ2hlY2tib3hlcyBhcmUgdW5jaGVja2VkIFx1MjAxNCByZXZpZXcgbWFudWFsbHkuXG4gICAgICAgIDxidXR0b24gb25jbGljaz1cInJlZnJlc2hIYXJ2ZXN0QW5hbHlzaXMoKVwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6MTBweDtmb250LXNpemU6MC44NWVtO3BhZGRpbmc6MnB4IDEwcHg7Ym9yZGVyOjFweCBzb2xpZCAjZDk3NzA2O2JvcmRlci1yYWRpdXM6NHB4O2JhY2tncm91bmQ6d2hpdGU7Y29sb3I6I2I0NTMwOTtjdXJzb3I6cG9pbnRlcjtcIj5SZXRyeSBhbmFseXNpczwvYnV0dG9uPlxuICAgICAgPC9kaXY+YFxuICAgIDogJyc7XG5cbiAgY29uc3Qgc2VjdGlvbnNIdG1sID0gZHRLZXlzLm1hcChkdCA9PiB7XG4gICAgY29uc3QgcmVjTWFwICAgICAgPSBncm91cHNbZHRdO1xuICAgIGNvbnN0IGFsbER0Q2FuZHMgID0gT2JqZWN0LnZhbHVlcyhyZWNNYXApLmZsYXRNYXAoY29uZk1hcCA9PiBPYmplY3QudmFsdWVzKGNvbmZNYXApLmZsYXQoKSk7XG4gICAgcmV0dXJuIHJlbmRlclR5cGVHcm91cChkdCwgcmVjTWFwLCBhbGxEdENhbmRzKTtcbiAgfSkuam9pbignJyk7XG5cbiAgcmV0dXJuIGBcbiAgICA8aDE+XHVEODNDXHVERjNFIEhhcnZlc3QgSW1wcm92ZW1lbnRzPC9oMT5cbiAgICA8cCBzdHlsZT1cImNvbG9yOiM2YjcyODA7bWFyZ2luLWJvdHRvbTo4cHg7XCI+XG4gICAgICBSZXZpZXcgTExNLXNjb3JlZCBjYW5kaWRhdGVzIGZvciBwcm9tb3Rpb24gdG8geW91ciBtYXN0ZXIgQ1YuXG4gICAgICBDaGVjayB0aGUgaXRlbXMgeW91IHdhbnQgdG8gYXBwbHkgKCR7dG90YWxDb3VudH0gY2FuZGlkYXRlJHt0b3RhbENvdW50ID09PSAxID8gJycgOiAncyd9IGZvdW5kKS5cbiAgICA8L3A+XG4gICAgJHthbmFseXNpc1dhcm5pbmd9XG4gICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6MTBweDthbGlnbi1pdGVtczpjZW50ZXI7bWFyZ2luLWJvdHRvbToyMHB4O2ZsZXgtd3JhcDp3cmFwO1wiPlxuICAgICAgPGJ1dHRvbiBpZD1cImhhcnZlc3QtYXBwbHktYnRuXCIgb25jbGljaz1cImFwcGx5SGFydmVzdFNlbGVjdGlvbnMoKVwiXG4gICAgICAgIHN0eWxlPVwicGFkZGluZzoxMHB4IDI0cHg7Zm9udC1zaXplOjFlbTtmb250LXdlaWdodDo2MDA7Y3Vyc29yOnBvaW50ZXI7YmFja2dyb3VuZDojMTZhMzRhO2NvbG9yOndoaXRlO2JvcmRlcjpub25lO2JvcmRlci1yYWRpdXM6NnB4O1wiPlxuICAgICAgICBcdTI3MDUgQXBwbHkgU2VsZWN0ZWQgdG8gTWFzdGVyIENWXG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gb25jbGljaz1cInJlZnJlc2hIYXJ2ZXN0QW5hbHlzaXMoKVwiXG4gICAgICAgIHN0eWxlPVwicGFkZGluZzoxMHB4IDE4cHg7Zm9udC1zaXplOjAuOWVtO2N1cnNvcjpwb2ludGVyO2JhY2tncm91bmQ6d2hpdGU7Y29sb3I6IzQ3NTU2OTtib3JkZXI6MXB4IHNvbGlkICNjYmQ1ZTE7Ym9yZGVyLXJhZGl1czo2cHg7XCI+XG4gICAgICAgIFx1RDgzRFx1REQwNCBSZS1hbmFseXNlXG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjAuODVlbTtjb2xvcjojOTRhM2I4O1wiPlxuICAgICAgICAke3RvdGFsQ291bnR9IGNhbmRpZGF0ZSR7dG90YWxDb3VudCAhPT0gMSA/ICdzJyA6ICcnfVxuICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuICAgICR7c2VjdGlvbnNIdG1sfVxuICAgIDxkaXYgaWQ9XCJoYXJ2ZXN0LXJlc3VsdFwiIHN0eWxlPVwibWFyZ2luLXRvcDoyMHB4O1wiPjwvZGl2PmA7XG59XG5cbmZ1bmN0aW9uIHJlbmRlckVtcHR5U3RhdGVIdG1sKCkge1xuICByZXR1cm4gYFxuICAgIDxoMT5cdUQ4M0NcdURGM0UgSGFydmVzdCBJbXByb3ZlbWVudHM8L2gxPlxuICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDtcIj5ObyBoYXJ2ZXN0IGNhbmRpZGF0ZXMgZm91bmQgZm9yIHRoaXMgc2Vzc2lvbi48L3A+XG4gICAgPHAgc3R5bGU9XCJjb2xvcjojOTRhM2I4O2ZvbnQtc2l6ZTowLjllbTtcIj5cbiAgICAgIENhbmRpZGF0ZXMgYXJlIGdlbmVyYXRlZCBmcm9tIGFwcHJvdmVkIHJld3JpdGVzLCBza2lsbHMgYWRkZWQgZHVyaW5nIHJldmlldyxcbiAgICAgIGFuZCBzdW1tYXJ5IHZhcmlhbnRzIGNyZWF0ZWQgZHVyaW5nIHRoZSBzZXNzaW9uLlxuICAgIDwvcD5gO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgQVBJIGNhbGxzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaENhbmRpZGF0ZXMoKSB7XG4gIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9oYXJ2ZXN0L2NhbmRpZGF0ZXMnKTtcbiAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gIHJldHVybiBkYXRhO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaEFuYWx5c2lzKGZvcmNlUmVmcmVzaCA9IGZhbHNlKSB7XG4gIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9oYXJ2ZXN0L2FuYWx5emUnLCB7XG4gICAgbWV0aG9kOiAgJ1BPU1QnLFxuICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgIGJvZHk6ICAgIEpTT04uc3RyaW5naWZ5KHsgZm9yY2VfcmVmcmVzaDogZm9yY2VSZWZyZXNoIH0pLFxuICB9KTtcbiAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gIHJldHVybiBkYXRhO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgVG9nZ2xlIGhlbHBlcnMgKGNhbGxlZCBieSBpbmxpbmUgb25jbGljaykgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIHRvZ2dsZUhhcnZlc3RTZWN0aW9uKGlkKSB7XG4gIGNvbnN0IGVsICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gIGNvbnN0IGljb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtpZH0taWNvbmApO1xuICBpZiAoIWVsKSByZXR1cm47XG4gIGNvbnN0IGhpZGRlbiA9IGVsLnN0eWxlLmRpc3BsYXkgPT09ICdub25lJztcbiAgZWwuc3R5bGUuZGlzcGxheSA9IGhpZGRlbiA/ICcnIDogJ25vbmUnO1xuICBpZiAoaWNvbikgaWNvbi50ZXh0Q29udGVudCA9IGhpZGRlbiA/ICdcdTI1QkUnIDogJ1x1MjVCOCc7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBNYWluIGVudHJ5IHBvaW50cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gcG9wdWxhdGVIYXJ2ZXN0VGFiKCkge1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50LWNvbnRlbnQnKTtcbiAgaWYgKCFjb250ZW50KSByZXR1cm47XG5cbiAgY29udGVudC5pbm5lckhUTUwgPSBgXG4gICAgPGgxPlx1RDgzQ1x1REYzRSBIYXJ2ZXN0IEltcHJvdmVtZW50czwvaDE+XG4gICAgPGRpdiBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO3BhZGRpbmc6NDBweDtcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJsb2FkaW5nLXNwaW5uZXJcIj48L2Rpdj5cbiAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzZiNzI4MDttYXJnaW4tdG9wOjEycHg7XCI+TG9hZGluZyBjYW5kaWRhdGVzIGFuZCBydW5uaW5nIExMTSBhbmFseXNpc1x1MjAyNjwvcD5cbiAgICA8L2Rpdj5gO1xuXG4gIGxldCBjYW5kaWRhdGVzID0gW107XG4gIGxldCBhbmFseXNpc09rID0gZmFsc2U7XG4gIGxldCBhbmFseXNlcyAgID0gW107XG4gIGxldCBhbmFseXNpc0Vycm9yID0gbnVsbDtcblxuICB0cnkge1xuICAgIGNvbnN0IGNhbmREYXRhID0gYXdhaXQgZmV0Y2hDYW5kaWRhdGVzKCk7XG4gICAgaWYgKCFjYW5kRGF0YS5vaykge1xuICAgICAgY29udGVudC5pbm5lckhUTUwgPSBgPGgxPlx1RDgzQ1x1REYzRSBIYXJ2ZXN0IEltcHJvdmVtZW50czwvaDE+PHAgY2xhc3M9XCJlcnJvci1tZXNzYWdlXCI+RmFpbGVkIHRvIGxvYWQgY2FuZGlkYXRlczogJHtlc2MoY2FuZERhdGEuZXJyb3IgfHwgJ1Vua25vd24gZXJyb3InKX08L3A+YDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY2FuZGlkYXRlcyA9IGNhbmREYXRhLmNhbmRpZGF0ZXMgfHwgW107XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy5lcnJvcigncG9wdWxhdGVIYXJ2ZXN0VGFiOiBjYW5kaWRhdGVzIGZldGNoIGZhaWxlZCcsIGVycik7XG4gICAgY29udGVudC5pbm5lckhUTUwgPSBgPGgxPlx1RDgzQ1x1REYzRSBIYXJ2ZXN0IEltcHJvdmVtZW50czwvaDE+PHAgY2xhc3M9XCJlcnJvci1tZXNzYWdlXCI+TmV0d29yayBlcnJvciBsb2FkaW5nIGNhbmRpZGF0ZXMuPC9wPmA7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGNhbmRpZGF0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgY29udGVudC5pbm5lckhUTUwgPSByZW5kZXJFbXB0eVN0YXRlSHRtbCgpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgYW5hbHlzaXNEYXRhID0gYXdhaXQgZmV0Y2hBbmFseXNpcyhmYWxzZSk7XG4gICAgaWYgKGFuYWx5c2lzRGF0YS5vaykge1xuICAgICAgYW5hbHlzaXNPayA9IHRydWU7XG4gICAgICBhbmFseXNlcyAgID0gYW5hbHlzaXNEYXRhLmFuYWx5c2VzIHx8IFtdO1xuICAgIH0gZWxzZSB7XG4gICAgICBhbmFseXNpc0Vycm9yID0gYW5hbHlzaXNEYXRhLmVycm9yIHx8ICdBbmFseXNpcyBmYWlsZWQnO1xuICAgICAgbG9nLndhcm4oJ3BvcHVsYXRlSGFydmVzdFRhYjogYW5hbHlzaXMgbm90IG9rJywgYW5hbHlzaXNFcnJvcik7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cuZXJyb3IoJ3BvcHVsYXRlSGFydmVzdFRhYjogYW5hbHlzaXMgZmV0Y2ggZmFpbGVkJywgZXJyKTtcbiAgICBhbmFseXNpc0Vycm9yID0gZXJyLm1lc3NhZ2U7XG4gIH1cblxuICBjb25zdCBhbmFseXNlc0J5SWQgPSBPYmplY3QuZnJvbUVudHJpZXMoYW5hbHlzZXMubWFwKGEgPT4gW2EuaWQsIGFdKSk7XG4gIGNvbnN0IGVucmljaGVkID0gY2FuZGlkYXRlcy5tYXAoYyA9PiAoe1xuICAgIC4uLmMsXG4gICAgcmVjb21tZW5kYXRpb246ICAgIGFuYWx5c2VzQnlJZFtjLmlkXT8ucmVjb21tZW5kYXRpb24gPz8gbnVsbCxcbiAgICBjb25maWRlbmNlOiAgICAgICAgYW5hbHlzZXNCeUlkW2MuaWRdPy5jb25maWRlbmNlICAgICA/PyBudWxsLFxuICAgIHJlYXNvbmluZzogICAgICAgICBhbmFseXNlc0J5SWRbYy5pZF0/LnJlYXNvbmluZyAgICAgID8/IG51bGwsXG4gICAgYW5hbHlzaXNBdmFpbGFibGU6IGFuYWx5c2lzT2ssXG4gIH0pKTtcblxuICBjb250ZW50LmlubmVySFRNTCA9IHJlbmRlckhhcnZlc3RUYWJIdG1sKGVucmljaGVkLCBhbmFseXNpc09rLCBhbmFseXNpc0Vycm9yKTtcbiAgYXR0YWNoUHJvcG9zYWxSb3dMaXN0ZW5lcnMoY29udGVudCwgJ2hhcnZlc3QnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVmcmVzaEhhcnZlc3RBbmFseXNpcygpIHtcbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudC1jb250ZW50Jyk7XG4gIGlmICghY29udGVudCkgcmV0dXJuO1xuXG4gIC8vIFNob3cgc3Bpbm5lciBpbmxpbmUgd2hpbGUgcmUtZmV0Y2hpbmdcbiAgY29uc3QgYXBwbHlCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGFydmVzdC1hcHBseS1idG4nKTtcbiAgaWYgKGFwcGx5QnRuKSBhcHBseUJ0bi5kaXNhYmxlZCA9IHRydWU7XG5cbiAgLy8gUmUtcnVuIGZ1bGwgcG9wdWxhdGUgd2l0aCBmb3JjZSByZWZyZXNoXG4gIHRyeSB7XG4gICAgY29uc3QgY2FuZERhdGEgPSBhd2FpdCBmZXRjaENhbmRpZGF0ZXMoKTtcbiAgICBjb25zdCBjYW5kaWRhdGVzID0gKGNhbmREYXRhLm9rICYmIGNhbmREYXRhLmNhbmRpZGF0ZXMpID8gY2FuZERhdGEuY2FuZGlkYXRlcyA6IFtdO1xuXG4gICAgaWYgKGNhbmRpZGF0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb250ZW50LmlubmVySFRNTCA9IHJlbmRlckVtcHR5U3RhdGVIdG1sKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGFuYWx5c2lzT2sgPSBmYWxzZTtcbiAgICBsZXQgYW5hbHlzZXMgICA9IFtdO1xuICAgIGxldCBhbmFseXNpc0Vycm9yID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYW5hbHlzaXNEYXRhID0gYXdhaXQgZmV0Y2hBbmFseXNpcyh0cnVlKTtcbiAgICAgIGlmIChhbmFseXNpc0RhdGEub2spIHtcbiAgICAgICAgYW5hbHlzaXNPayA9IHRydWU7XG4gICAgICAgIGFuYWx5c2VzICAgPSBhbmFseXNpc0RhdGEuYW5hbHlzZXMgfHwgW107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhbmFseXNpc0Vycm9yID0gYW5hbHlzaXNEYXRhLmVycm9yIHx8ICdBbmFseXNpcyBmYWlsZWQnO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgYW5hbHlzaXNFcnJvciA9IGVyci5tZXNzYWdlO1xuICAgIH1cblxuICAgIGNvbnN0IGFuYWx5c2VzQnlJZCA9IE9iamVjdC5mcm9tRW50cmllcyhhbmFseXNlcy5tYXAoYSA9PiBbYS5pZCwgYV0pKTtcbiAgICBjb25zdCBlbnJpY2hlZCA9IGNhbmRpZGF0ZXMubWFwKGMgPT4gKHtcbiAgICAgIC4uLmMsXG4gICAgICByZWNvbW1lbmRhdGlvbjogICAgYW5hbHlzZXNCeUlkW2MuaWRdPy5yZWNvbW1lbmRhdGlvbiA/PyBudWxsLFxuICAgICAgY29uZmlkZW5jZTogICAgICAgIGFuYWx5c2VzQnlJZFtjLmlkXT8uY29uZmlkZW5jZSAgICAgPz8gbnVsbCxcbiAgICAgIHJlYXNvbmluZzogICAgICAgICBhbmFseXNlc0J5SWRbYy5pZF0/LnJlYXNvbmluZyAgICAgID8/IG51bGwsXG4gICAgICBhbmFseXNpc0F2YWlsYWJsZTogYW5hbHlzaXNPayxcbiAgICB9KSk7XG5cbiAgICBjb250ZW50LmlubmVySFRNTCA9IHJlbmRlckhhcnZlc3RUYWJIdG1sKGVucmljaGVkLCBhbmFseXNpc09rLCBhbmFseXNpc0Vycm9yKTtcbiAgICBhdHRhY2hQcm9wb3NhbFJvd0xpc3RlbmVycyhjb250ZW50LCAnaGFydmVzdCcpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cuZXJyb3IoJ3JlZnJlc2hIYXJ2ZXN0QW5hbHlzaXM6IGZhaWxlZCcsIGVycik7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gYXBwbHlIYXJ2ZXN0U2VsZWN0aW9ucygpIHtcbiAgY29uc3QgY2hlY2tib3hlcyAgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtkYXRhLWhhcnZlc3QtaWRdOmNoZWNrZWQnKTtcbiAgY29uc3Qgc2VsZWN0ZWRJZHMgPSBBcnJheS5mcm9tKGNoZWNrYm94ZXMpLm1hcChjYiA9PiBjYi5kYXRhc2V0LmhhcnZlc3RJZCk7XG4gIGNvbnN0IHJlc3VsdERpdiAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hhcnZlc3QtcmVzdWx0Jyk7XG4gIGNvbnN0IGFwcGx5QnRuICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hhcnZlc3QtYXBwbHktYnRuJyk7XG5cbiAgaWYgKHNlbGVjdGVkSWRzLmxlbmd0aCA9PT0gMCkge1xuICAgIGlmIChyZXN1bHREaXYpIHJlc3VsdERpdi5pbm5lckhUTUwgPSAnPHAgc3R5bGU9XCJjb2xvcjojYjQ1MzA5O1wiPk5vIGl0ZW1zIHNlbGVjdGVkLjwvcD4nO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0ICh0eXBlb2Ygc2hvd0NvbmZpcm1Nb2RhbCA9PT0gJ2Z1bmN0aW9uJ1xuICAgID8gc2hvd0NvbmZpcm1Nb2RhbChcbiAgICAgICAgYFByb21vdGUgJHtzZWxlY3RlZElkcy5sZW5ndGh9IGl0ZW0ke3NlbGVjdGVkSWRzLmxlbmd0aCAhPT0gMSA/ICdzJyA6ICcnfSB0byBtYXN0ZXIgQ1Y/YCxcbiAgICAgICAgJ1RoaXMgd2lsbCBwZXJtYW5lbnRseSB3cml0ZSBjaGFuZ2VzIHRvIHlvdXIgTWFzdGVyX0NWX0RhdGEuanNvbi4gQSBiYWNrdXAgd2lsbCBiZSBjcmVhdGVkIGZpcnN0LicsXG4gICAgICApXG4gICAgOiBQcm9taXNlLnJlc29sdmUod2luZG93LmNvbmZpcm0oYFByb21vdGUgJHtzZWxlY3RlZElkcy5sZW5ndGh9IGl0ZW0ocykgdG8gbWFzdGVyIENWP1xcblxcblRoaXMgd2lsbCBwZXJtYW5lbnRseSB3cml0ZSBjaGFuZ2VzIHRvIHlvdXIgTWFzdGVyX0NWX0RhdGEuanNvbi5gKSkpO1xuXG4gIGlmICghY29uZmlybWVkKSByZXR1cm47XG5cbiAgaWYgKGFwcGx5QnRuKSB7IGFwcGx5QnRuLmRpc2FibGVkID0gdHJ1ZTsgYXBwbHlCdG4udGV4dENvbnRlbnQgPSAnQXBwbHlpbmdcdTIwMjYnOyB9XG4gIGlmIChyZXN1bHREaXYpIHJlc3VsdERpdi5pbm5lckhUTUwgPSAnJztcblxuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9oYXJ2ZXN0L2FwcGx5Jywge1xuICAgICAgbWV0aG9kOiAgJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiAgICBKU09OLnN0cmluZ2lmeSh7IHNlbGVjdGVkX2lkczogc2VsZWN0ZWRJZHMgfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG5cbiAgICBpZiAoIWRhdGEub2spIHtcbiAgICAgIGlmIChyZXN1bHREaXYpIHJlc3VsdERpdi5pbm5lckhUTUwgPSBgPHAgY2xhc3M9XCJlcnJvci1tZXNzYWdlXCI+QXBwbHkgZmFpbGVkOiAke2VzYyhkYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yJyl9PC9wPmA7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgd3JpdHRlbkNvdW50ID0gZGF0YS53cml0dGVuX2NvdW50ID8/IDA7XG4gICAgY29uc3QgY29tbWl0SGFzaCAgID0gZGF0YS5jb21taXRfaGFzaCAgID8gYCAoY29tbWl0ICR7ZXNjKGRhdGEuY29tbWl0X2hhc2gpfSlgIDogJyc7XG4gICAgY29uc3QgYmFja3VwTm90ZSAgID0gZGF0YS5iYWNrdXBfcGF0aCAgID8gYCBCYWNrdXAgc2F2ZWQgdG8gPGNvZGU+JHtlc2MoZGF0YS5iYWNrdXBfcGF0aCl9PC9jb2RlPi5gIDogJyc7XG4gICAgY29uc3QgZ2l0V2FybmluZyAgID0gZGF0YS5naXRfZXJyb3JcbiAgICAgID8gYDxwIHN0eWxlPVwiY29sb3I6I2I0NTMwOTtmb250LXNpemU6MC44N2VtO1wiPlx1MjZBMFx1RkUwRiBHaXQgY29tbWl0IHNraXBwZWQ6ICR7ZXNjKGRhdGEuZ2l0X2Vycm9yPy5tZXNzYWdlIHx8IGRhdGEuZ2l0X2Vycm9yKX08L3A+YFxuICAgICAgOiAnJztcblxuICAgIGlmIChyZXN1bHREaXYpIHtcbiAgICAgIHJlc3VsdERpdi5pbm5lckhUTUwgPSBgXG4gICAgICAgIDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmMGZkZjQ7Ym9yZGVyOjFweCBzb2xpZCAjODZlZmFjO2JvcmRlci1yYWRpdXM6NnB4O3BhZGRpbmc6MTJweCAxNnB4O1wiPlxuICAgICAgICAgIDxwIHN0eWxlPVwiY29sb3I6IzE2NjUzNDtmb250LXdlaWdodDo2MDA7bWFyZ2luOjAgMCA0cHg7XCI+XG4gICAgICAgICAgICBcdTI3MDUgJHt3cml0dGVuQ291bnR9IGl0ZW0ke3dyaXR0ZW5Db3VudCAhPT0gMSA/ICdzJyA6ICcnfSB3cml0dGVuIHRvIG1hc3RlciBDViR7Y29tbWl0SGFzaH0uXG4gICAgICAgICAgPC9wPlxuICAgICAgICAgICR7YmFja3VwTm90ZSA/IGA8cCBzdHlsZT1cImZvbnQtc2l6ZTowLjgyZW07Y29sb3I6IzZiNzI4MDttYXJnaW46NHB4IDAgMDtcIj4ke2JhY2t1cE5vdGV9PC9wPmAgOiAnJ31cbiAgICAgICAgICAke2dpdFdhcm5pbmd9XG4gICAgICAgIDwvZGl2PmA7XG4gICAgfVxuXG4gICAgLy8gRGlzYWJsZSBjaGVja2JveGVzIGZvciBhcHBsaWVkIGl0ZW1zXG4gICAgZm9yIChjb25zdCBpZCBvZiBzZWxlY3RlZElkcykge1xuICAgICAgY29uc3QgY2IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgaGFydmVzdC1jaGstJHtpZH1gKTtcbiAgICAgIGlmIChjYikgeyBjYi5kaXNhYmxlZCA9IHRydWU7IGNiLmNoZWNrZWQgPSBmYWxzZTsgfVxuICAgICAgY29uc3Qgcm93ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYGhhcnZlc3Qtcm93LSR7aWR9YCk7XG4gICAgICBpZiAocm93KSByb3cuc3R5bGUub3BhY2l0eSA9ICcwLjQ1JztcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy5lcnJvcignYXBwbHlIYXJ2ZXN0U2VsZWN0aW9uczogZmFpbGVkJywgZXJyKTtcbiAgICBpZiAocmVzdWx0RGl2KSByZXN1bHREaXYuaW5uZXJIVE1MID0gYDxwIGNsYXNzPVwiZXJyb3ItbWVzc2FnZVwiPk5ldHdvcmsgZXJyb3I6ICR7ZXNjKGVyci5tZXNzYWdlKX08L3A+YDtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoYXBwbHlCdG4pIHsgYXBwbHlCdG4uZGlzYWJsZWQgPSBmYWxzZTsgYXBwbHlCdG4udGV4dENvbnRlbnQgPSAnXHUyNzA1IEFwcGx5IFNlbGVjdGVkIHRvIE1hc3RlciBDVic7IH1cbiAgfVxufVxuXG5leHBvcnQgeyBwb3B1bGF0ZUhhcnZlc3RUYWIsIGFwcGx5SGFydmVzdFNlbGVjdGlvbnMsIHJlZnJlc2hIYXJ2ZXN0QW5hbHlzaXMsIHRvZ2dsZUhhcnZlc3RTZWN0aW9uIH07XG4iLCAiLy8gQ29weXJpZ2h0IChDKSAyMDI2IEdyZWdvcnkgUi4gV2FybmVzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vXG4vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBDVi1CdWlsZGVyLlxuLy8gRm9yIGNvbW1lcmNpYWwgbGljZW5zaW5nLCBjb250YWN0IGdyZWdAd2FybmVzLWlubm92YXRpb25zLmNvbVxuXG4vKipcbiAqIHdlYi9lYXJseS1wcmV2aWV3LXBhbmVsLmpzXG4gKiBHQVAtMTYgUGFydCBCOiBhIHBlcnNpc3RlbnQsIGNvbGxhcHNpYmxlIENWIHByZXZpZXcgc2hvd24gZHVyaW5nIHRoZVxuICogY3VzdG9taXphdGlvbi9yZXdyaXRlL3NwZWxsLWNoZWNrIHBpcGVsaW5lLCBzbyB0aGUgdXNlciBzZWVzIGEgcmVuZGVyZWRcbiAqIENWIHdlbGwgYmVmb3JlIExheW91dCBSZXZpZXcuXG4gKlxuICogU0FGRVRZIEJPVU5EQVJZIChkbyBub3Qgd2Vha2VuIHdpdGhvdXQgcmUtcmVhZGluZyB0aGUgR0FQLTE2IHBsYW4nc1xuICogY29tbWl0dGVlLXJldmlldyBzZWN0aW9uIG9uIHRoaXMgbW9kdWxlKTogdGhpcyBmaWxlIG11c3Qgb25seSBldmVyIGNhbGxcbiAqIHRoZSByZWFkLW9ubHkgR0VUIC9hcGkvbGF5b3V0LWh0bWwgZW5kcG9pbnQuIEl0IG11c3QgbmV2ZXIgY2FsbFxuICogUE9TVCAvYXBpL2N2L2dlbmVyYXRlLXByZXZpZXcgb3IgUE9TVCAvYXBpL2N2L3NtYXJ0LWluc3RydWN0aW9uIFx1MjAxNCBib3RoXG4gKiBtdXRhdGUgZ2VuZXJhdGlvbl9zdGF0ZSAoc3RhdGVNYW5hZ2VyLm1hcmtQcmV2aWV3R2VuZXJhdGVkKCkgZm9yY2libHlcbiAqIGFkdmFuY2VzIHRoZSB3b3JrZmxvdyBwaGFzZSB0byBMQVlPVVRfUkVWSUVXKSwgd2hpY2ggd291bGQgc2lsZW50bHlcbiAqIGZhc3QtZm9yd2FyZCB0aGUgdXNlcidzIHN0YWdlIHdoaWxlIHRoZXkncmUgc3RpbGwgb24gYW4gZWFybGllciB0YWIuXG4gKiBUaGUgcmVuZGVyaW5nIHN0ZXAgaXMgZGVsZWdhdGVkIHRvIHByZXZpZXctcmVuZGVyLmpzLCBhIHNoYXJlZCB1dGlsIHdpdGhcbiAqIG5vIHJlZmVyZW5jZSB0byBhcGlDYWxsL3N0YXRlTWFuYWdlciBhdCBhbGwsIHNwZWNpZmljYWxseSBzbyBhIGZ1dHVyZVxuICogZWRpdCB0byB0aGUgbXV0YXRpbmcgbGF5b3V0LXJldmlldyBmbG93IGNhbm5vdCBwdWxsIHRoZSBtdXRhdGluZyBwYXRoIGluXG4gKiBoZXJlIHZpYSBhIHNoYXJlZCBpbXBvcnQuXG4gKi9cblxuaW1wb3J0IHsgYXBpQ2FsbCwgU3RvcmFnZUtleXMgfSBmcm9tICcuL2FwaS1jbGllbnQuanMnO1xuaW1wb3J0IHsgc3RhdGVNYW5hZ2VyIH0gZnJvbSAnLi9zdGF0ZS1tYW5hZ2VyLmpzJztcbmltcG9ydCB7IHJlbmRlckh0bWxJbnRvSWZyYW1lIH0gZnJvbSAnLi9wcmV2aWV3LXJlbmRlci5qcyc7XG5cbmNvbnN0IEVBUkxZX1BSRVZJRVdfVEFCUyA9IG5ldyBTZXQoW1xuICAnZXhwLXJldmlldycsICdhY2gtZWRpdG9yJywgJ3NraWxscy1yZXZpZXcnLCAnYWNoaWV2ZW1lbnRzLXJldmlldycsXG4gICd0YWdsaW5lLXJldmlldycsICdzdW1tYXJ5LXJldmlldycsICdwdWJsaWNhdGlvbnMtcmV2aWV3JywgLy8gY3VzdG9taXphdGlvbnNcbiAgJ3Jld3JpdGUnLCAnc3BlbGwnLFxuXSk7XG5cbmxldCBfY29sbGFwc2VkID0gZmFsc2U7XG50cnkge1xuICBfY29sbGFwc2VkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oU3RvcmFnZUtleXMuRUFSTFlfUFJFVklFV19DT0xMQVBTRUQpID09PSAndHJ1ZSc7XG59IGNhdGNoIChfZSkge1xuICAvLyBsb2NhbFN0b3JhZ2UgdW5hdmFpbGFibGUgXHUyMDE0IGRlZmF1bHQgdG8gZXhwYW5kZWQuXG59XG5cbmZ1bmN0aW9uIF9zZXRDb2xsYXBzZWQoY29sbGFwc2VkKSB7XG4gIF9jb2xsYXBzZWQgPSBjb2xsYXBzZWQ7XG4gIHRyeSB7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oU3RvcmFnZUtleXMuRUFSTFlfUFJFVklFV19DT0xMQVBTRUQsIFN0cmluZyhjb2xsYXBzZWQpKTtcbiAgfSBjYXRjaCAoX2UpIHtcbiAgICAvLyBOb24tZmF0YWwgXHUyMDE0IGNvbGxhcHNlIHN0YXRlIGp1c3Qgd29uJ3QgcGVyc2lzdCBhY3Jvc3MgcmVsb2Fkcy5cbiAgfVxuICBjb25zdCBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWFybHktcHJldmlldy10b2dnbGUtYnRuJyk7XG4gIGlmIChidG4pIHtcbiAgICBidG4udGV4dENvbnRlbnQgPSBjb2xsYXBzZWQgPyAnU2hvdycgOiAnSGlkZSc7XG4gICAgYnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsIFN0cmluZyghY29sbGFwc2VkKSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gX3JlbmRlckVhcmx5UHJldmlld0JvZHkoKSB7XG4gIGNvbnN0IGJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWFybHktcHJldmlldy1ib2R5Jyk7XG4gIGNvbnN0IG5vdGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWFybHktcHJldmlldy1zdGF0dXMtbm90ZScpO1xuICBpZiAoIWJvZHkpIHJldHVybjtcblxuICBpZiAoX2NvbGxhcHNlZCkge1xuICAgIGJvZHkuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICByZXR1cm47XG4gIH1cbiAgYm9keS5zdHlsZS5kaXNwbGF5ID0gJyc7XG5cbiAgbGV0IGRhdGE7XG4gIHRyeSB7XG4gICAgLy8gUmVhZC1vbmx5IGZldGNoIG9ubHkgXHUyMDE0IHNlZSB0aGUgbW9kdWxlLWhlYWRlciBzYWZldHkgYm91bmRhcnkuXG4gICAgZGF0YSA9IGF3YWl0IGFwaUNhbGwoJ0dFVCcsICcvYXBpL2xheW91dC1odG1sJyk7XG4gIH0gY2F0Y2ggKF9lKSB7XG4gICAgLy8gNDA0L2Vycm9yIChubyBwcmV2aWV3IGdlbmVyYXRlZCB5ZXQgdGhpcyBzZXNzaW9uKSBcdTIwMTQgZW1wdHkgc3RhdGUgYmVsb3cuXG4gICAgZGF0YSA9IG51bGw7XG4gIH1cblxuICBpZiAoZGF0YSAmJiBkYXRhLm9rICYmIGRhdGEuaHRtbCkge1xuICAgIGNvbnN0IGZyZXNobmVzcyA9ICh0eXBlb2Ygc3RhdGVNYW5hZ2VyPy5nZXRMYXlvdXRGcmVzaG5lc3MgPT09ICdmdW5jdGlvbicpXG4gICAgICA/IHN0YXRlTWFuYWdlci5nZXRMYXlvdXRGcmVzaG5lc3MoKSA6IHsgaXNTdGFsZTogZmFsc2UgfTtcblxuICAgIGJvZHkuaW5uZXJIVE1MID0gJzxpZnJhbWUgaWQ9XCJlYXJseS1wcmV2aWV3LWlmcmFtZVwiIHNhbmRib3g9XCJhbGxvdy1zYW1lLW9yaWdpblwiICcgK1xuICAgICAgJ3JlZmVycmVycG9saWN5PVwibm8tcmVmZXJyZXJcIiBzdHlsZT1cIndpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7Ym9yZGVyOm5vbmU7XCI+PC9pZnJhbWU+JztcbiAgICBjb25zdCBpZnJhbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWFybHktcHJldmlldy1pZnJhbWUnKTtcbiAgICBjb25zdCBzdGF0ZUxhYmVsID0gZnJlc2huZXNzLmlzU3RhbGUgPyAnc3RhbGUnIDogJ2ZyZXNoJztcbiAgICBpZnJhbWUudGl0bGUgPSBgQ1YgcHJldmlldyBcdTIwMTQgJHtzdGF0ZUxhYmVsfWA7XG4gICAgaWZyYW1lLmNsYXNzTGlzdC50b2dnbGUoJ2Vhcmx5LXByZXZpZXctaWZyYW1lLXN0YWxlJywgQm9vbGVhbihmcmVzaG5lc3MuaXNTdGFsZSkpO1xuICAgIHJlbmRlckh0bWxJbnRvSWZyYW1lKGlmcmFtZSwgZGF0YS5odG1sKTtcblxuICAgIGlmIChub3RlKSB7XG4gICAgICBub3RlLnRleHRDb250ZW50ID0gZnJlc2huZXNzLmlzU3RhbGVcbiAgICAgICAgPyAnUHJldmlldyByZWZsZWN0cyBhbiBlYXJsaWVyIHZlcnNpb24gXHUyMDE0IHZpc2l0IExheW91dCBSZXZpZXcgdG8gcmVmcmVzaC4nXG4gICAgICAgIDogJyc7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIGJvZHkuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJlYXJseS1wcmV2aWV3LWVtcHR5XCI+Tm8gQ1YgcHJldmlldyB5ZXQgXHUyMDE0IGF2YWlsYWJsZSBhZnRlciB5b3UgcmVhY2ggTGF5b3V0IFJldmlldy48L2Rpdj4nO1xuICBpZiAobm90ZSkgbm90ZS50ZXh0Q29udGVudCA9ICcnO1xufVxuXG4vKipcbiAqIFNob3cgb3IgaGlkZSB0aGUgcGFuZWwgZm9yIHRoZSBnaXZlbiB0YWIsIGFuZCAocmUpcmVuZGVyIGl0cyBib2R5IHdoZW5cbiAqIHNob3duLiBDYWxsZWQgZnJvbSBzd2l0Y2hUYWIoKSBcdTIwMTQgdGhpcyBmdW5jdGlvbidzIG93biBpbi1zY29wZSBjaGVja1xuICogZGVjaWRlcyB2aXNpYmlsaXR5LCBzbyB0aGUgY2FsbGVyIGRvZXNuJ3QgbmVlZCB0byBrbm93IHRoZSB0YWIgbGlzdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWJcbiAqL1xuYXN5bmMgZnVuY3Rpb24gdG9nZ2xlRWFybHlQcmV2aWV3UGFuZWwodGFiKSB7XG4gIGNvbnN0IHBhbmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Vhcmx5LXByZXZpZXctcGFuZWwnKTtcbiAgaWYgKCFwYW5lbCkgcmV0dXJuO1xuICBpZiAoIUVBUkxZX1BSRVZJRVdfVEFCUy5oYXModGFiKSkge1xuICAgIHBhbmVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgcmV0dXJuO1xuICB9XG4gIHBhbmVsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICBhd2FpdCBfcmVuZGVyRWFybHlQcmV2aWV3Qm9keSgpO1xufVxuXG5mdW5jdGlvbiBpbml0RWFybHlQcmV2aWV3UGFuZWwoKSB7XG4gIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlYXJseS1wcmV2aWV3LXRvZ2dsZS1idG4nKTtcbiAgaWYgKCFidG4pIHJldHVybjtcbiAgYnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsIFN0cmluZyghX2NvbGxhcHNlZCkpO1xuICBidG4udGV4dENvbnRlbnQgPSBfY29sbGFwc2VkID8gJ1Nob3cnIDogJ0hpZGUnO1xuICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgX3NldENvbGxhcHNlZCghX2NvbGxhcHNlZCk7XG4gICAgX3JlbmRlckVhcmx5UHJldmlld0JvZHkoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCB7IGluaXRFYXJseVByZXZpZXdQYW5lbCwgdG9nZ2xlRWFybHlQcmV2aWV3UGFuZWwgfTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL3Nlc3Npb24tc3dpdGNoZXItdWkuanNcbiAqIFNlc3Npb24gbWFuYWdlbWVudCBtb2RhbCwgdHJhc2ggdmlldywgYW5kIG93bmVyc2hpcCBjb25mbGljdCBkaWFsb2cuXG4gKlxuICogVGhlIHNlc3Npb24tY29uZmxpY3QgcmV0cnkgYmFubmVyIChzaG93U2Vzc2lvbkNvbmZsaWN0QmFubmVyL1xuICogY29uZmxpY3RSZXRyeU5vdy9jb25mbGljdERpc21pc3MpIGxpdmVzIGluIHdlYi9mZXRjaC11dGlscy5qcywgd2hpY2ggb3duc1xuICogaGFuZGxlNDA5Q29uZmxpY3QgKHRoZSBhY3R1YWwgdHJpZ2dlcikgXHUyMDE0IHRoaXMgZmlsZSB1c2VkIHRvIGNhcnJ5IGl0cyBvd25cbiAqIGJ5dGUtZm9yLWJ5dGUgZHVwbGljYXRlIHdpdGggYSBzZXBhcmF0ZSByZXRyeSBxdWV1ZS90aW1lciwgd2hpY2ggbWVhbnRcbiAqIGNsaWNraW5nIFwiUmV0cnkgTm93XCIgY291bGQgc2lsZW50bHkgZHJhaW4gdGhlIHdyb25nIChhbHdheXMtZW1wdHkpIHF1ZXVlXG4gKiBkZXBlbmRpbmcgb24gd2ViL3NyYy9tYWluLmpzJ3MgbW9kdWxlIGxvYWQgb3JkZXIsIG5ldmVyIGFjdHVhbGx5XG4gKiByZXNvbHZpbmcgdGhlIHBlbmRpbmcgcmV0cmllZCByZXF1ZXN0LiBSZW1vdmVkOyBzZWUgd2ViL2ZldGNoLXV0aWxzLmpzLlxuICpcbiAqIERlcGVuZGVuY2llcyAocmVzb2x2ZWQgdGhyb3VnaCBnbG9iYWxUaGlzIGF0IHJ1bnRpbWUpOlxuICogICBlc2NhcGVIdG1sLCBwYXJzZVNlc3Npb25MaXN0UmVzcG9uc2UsIGZvcm1hdFNlc3Npb25QaGFzZUxhYmVsLFxuICogICBmb3JtYXRTZXNzaW9uVGltZXN0YW1wLCBidWlsZFNlc3Npb25Td2l0Y2hlckxhYmVsLFxuICogICBnZXRBY3RpdmVTZXNzaW9uT3duZXJzaGlwTWV0YSwgX2dldEN1cnJlbnRTZXNzaW9uSWRWYWx1ZSxcbiAqICAgbG9hZFNlc3Npb25GaWxlLCBjcmVhdGVOZXdTZXNzaW9uQW5kTmF2aWdhdGUsIGZldGNoU3RhdHVzLFxuICogICBzZXRJbml0aWFsRm9jdXMsIHRyYXBGb2N1cywgcmVzdG9yZUZvY3VzLCBjb25maXJtRGlhbG9nXG4gKi9cblxuLy8gXHUyNTAwXHUyNTAwIFNvcnQgc3RhdGUgJiBzZXNzaW9uIGNhY2hlIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuY29uc3QgX1NNX1NUT1JBR0VfS0VZID0gJ2N2X3NtX3NvcnRfa2V5JztcbmNvbnN0IF9TTV9TVE9SQUdFX0RJUiA9ICdjdl9zbV9zb3J0X2Rpcic7XG5cbmxldCBfc21Tb3J0S2V5ID0gKCgpID0+IHsgdHJ5IHsgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKF9TTV9TVE9SQUdFX0tFWSkgfHwgJ2xhc3RNb2RpZmllZCc7IH0gY2F0Y2ggKF8pIHsgcmV0dXJuICdsYXN0TW9kaWZpZWQnOyB9IH0pKCk7XG5sZXQgX3NtU29ydERpciA9ICgoKSA9PiB7IHRyeSB7IHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShfU01fU1RPUkFHRV9ESVIpIHx8ICdkZXNjJzsgICAgICAgICB9IGNhdGNoIChfKSB7IHJldHVybiAnZGVzYyc7ICAgICAgICAgfSB9KSgpO1xuXG5sZXQgX3NtQWN0aXZlQ2FjaGUgPSBbXTtcbmxldCBfc21TYXZlZENhY2hlICA9IFtdO1xuXG4vLyBcdTI1MDBcdTI1MDAgUmVuZGVyIGhlbHBlcnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIF9yZW5kZXJBY3RpdmVTZXNzaW9uUm93cyhhY3RpdmVTZXNzaW9ucykge1xuICBpZiAoIWFjdGl2ZVNlc3Npb25zLmxlbmd0aCkge1xuICAgIHJldHVybiAnPHAgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLWVtcHR5XCI+Tm8gYWN0aXZlIGluLW1lbW9yeSBzZXNzaW9ucy48L3A+JztcbiAgfVxuXG4gIGNvbnN0IGN1cnJlbnRTZXNzaW9uSWQgPSBfZ2V0Q3VycmVudFNlc3Npb25JZFZhbHVlKCk7XG5cbiAgcmV0dXJuIGA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1saXN0XCI+JHthY3RpdmVTZXNzaW9ucy5tYXAoc2Vzc2lvbiA9PiB7XG4gICAgY29uc3Qgb3duZXJzaGlwID0gZ2V0QWN0aXZlU2Vzc2lvbk93bmVyc2hpcE1ldGEoc2Vzc2lvbiwgeyBjdXJyZW50U2Vzc2lvbklkIH0pO1xuICAgIGNvbnN0IG9wZW5IcmVmID0gYC8/c2Vzc2lvbj0ke2VuY29kZVVSSUNvbXBvbmVudChzZXNzaW9uLnNlc3Npb25faWQgfHwgJycpfWA7XG4gICAgY29uc3QgYWN0aW9uSHRtbCA9IG93bmVyc2hpcC5pc0N1cnJlbnRcbiAgICAgID8gJzxzcGFuIGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1idG5cIiBhcmlhLWRpc2FibGVkPVwidHJ1ZVwiPkN1cnJlbnQ8L3NwYW4+J1xuICAgICAgOiBgPGEgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLWxpbmtcIiBocmVmPVwiJHtvcGVuSHJlZn1cIj5PcGVuPC9hPmA7XG4gICAgcmV0dXJuIGBcbiAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLXJvd1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1yb3ctbWFpblwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLXJvdy10aXRsZVwiPlxuICAgICAgICAgICAgPHN0cm9uZz4ke2VzY2FwZUh0bWwoc2Vzc2lvbi5wb3NpdGlvbl9uYW1lIHx8ICdVbnRpdGxlZCcpfTwvc3Ryb25nPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZXNzaW9uLXN0YXR1cy1waWxsICR7b3duZXJzaGlwLmNsYXNzTmFtZX1cIj48c3BhbiBjbGFzcz1cInNlc3Npb24tc3RhdHVzLWRvdFwiPjwvc3Bhbj4ke2VzY2FwZUh0bWwob3duZXJzaGlwLmxhYmVsKX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNlc3Npb24tc3dpdGNoZXItcm93LW1ldGFcIj5cbiAgICAgICAgICAgICR7ZXNjYXBlSHRtbChmb3JtYXRTZXNzaW9uUGhhc2VMYWJlbChzZXNzaW9uLnBoYXNlKSl9IFx1MDBCNyBDcmVhdGVkICR7ZXNjYXBlSHRtbChmb3JtYXRTZXNzaW9uVGltZXN0YW1wKHNlc3Npb24uY3JlYXRlZCkpfSBcdTAwQjcgTGFzdCBtb2RpZmllZCAke2VzY2FwZUh0bWwoZm9ybWF0U2Vzc2lvblRpbWVzdGFtcChzZXNzaW9uLmxhc3RfbW9kaWZpZWQpKX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLWFjdGlvbnNcIj4ke2FjdGlvbkh0bWx9PC9kaXY+XG4gICAgICA8L2Rpdj5gO1xuICB9KS5qb2luKCcnKX08L2Rpdj5gO1xufVxuXG5mdW5jdGlvbiBfcmVuZGVyU2F2ZWRTZXNzaW9uUm93cyhzYXZlZFNlc3Npb25zLCB7IGluY2x1ZGVNYW5hZ2VtZW50ID0gZmFsc2UgfSA9IHt9KSB7XG4gIGlmICghc2F2ZWRTZXNzaW9ucy5sZW5ndGgpIHtcbiAgICByZXR1cm4gJzxwIGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1lbXB0eVwiPk5vIHNhdmVkIHNlc3Npb25zIGZvdW5kLjwvcD4nO1xuICB9XG5cbiAgZnVuY3Rpb24gX2NyZWF0ZWRJc29Gcm9tU2Vzc2lvblBhdGgoc2Vzc2lvblBhdGgpIHtcbiAgICBpZiAoIXNlc3Npb25QYXRoKSByZXR1cm4gJyc7XG4gICAgY29uc3QgcGF0aFRleHQgPSBTdHJpbmcoc2Vzc2lvblBhdGgpO1xuICAgIGNvbnN0IHBhcnRzID0gcGF0aFRleHQuc3BsaXQoL1tcXFxcL10vKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCA8IDIpIHJldHVybiAnJztcblxuICAgIGNvbnN0IGRpck5hbWUgPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAyXTtcbiAgICBjb25zdCBtYXRjaCA9IGRpck5hbWUubWF0Y2goLyhcXGR7NH0pKFxcZHsyfSkoXFxkezJ9KVtfLV0/KFxcZHsyfSkoXFxkezJ9KShcXGR7Mn0pLyk7XG4gICAgaWYgKCFtYXRjaCkgcmV0dXJuICcnO1xuXG4gICAgY29uc3QgWywgeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmRdID0gbWF0Y2g7XG4gICAgcmV0dXJuIGAke3llYXJ9LSR7bW9udGh9LSR7ZGF5fVQke2hvdXJ9OiR7bWludXRlfToke3NlY29uZH1aYDtcbiAgfVxuXG4gIHJldHVybiBgPGRpdiBjbGFzcz1cInNlc3Npb24tc3dpdGNoZXItbGlzdFwiPiR7c2F2ZWRTZXNzaW9ucy5tYXAoKHNlc3Npb24sIGluZGV4KSA9PiB7XG4gICAgY29uc3QgZXNjYXBlZFBhdGggPSBlc2NhcGVIdG1sKHNlc3Npb24ucGF0aCB8fCAnJyk7XG4gICAgY29uc3QgY3JlYXRlZElzbyA9IF9jcmVhdGVkSXNvRnJvbVNlc3Npb25QYXRoKHNlc3Npb24ucGF0aCk7XG4gICAgY29uc3QgY3JlYXRlZExhYmVsID0gY3JlYXRlZElzbyA/IGZvcm1hdFNlc3Npb25UaW1lc3RhbXAoY3JlYXRlZElzbykgOiAnXHUyMDE0JztcbiAgICBjb25zdCBzYXZlZExhYmVsID0gZm9ybWF0U2Vzc2lvblRpbWVzdGFtcChzZXNzaW9uLnRpbWVzdGFtcCk7XG4gICAgY29uc3Qgc2F2ZWRNZXRhID0gc2F2ZWRMYWJlbCA9PT0gJ1x1MjAxNCcgPyAnJyA6IGAgXHUwMEI3IFNhdmVkICR7ZXNjYXBlSHRtbChzYXZlZExhYmVsKX1gO1xuICAgIGNvbnN0IG1hbmFnZW1lbnRIdG1sID0gaW5jbHVkZU1hbmFnZW1lbnRcbiAgICAgID8gYFxuICAgICAgICA8YnV0dG9uIGRhdGEtc20tYWN0aW9uPVwicmVuYW1lXCIgZGF0YS1zbS1wYXRoPVwiJHtlc2NhcGVkUGF0aH1cIiBkYXRhLXNtLWlkeD1cIiR7aW5kZXh9XCIgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLWJ0blwiIHRpdGxlPVwiUmVuYW1lIHNlc3Npb25cIj5SZW5hbWU8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBkYXRhLXNtLWFjdGlvbj1cImRlbGV0ZVwiIGRhdGEtc20tcGF0aD1cIiR7ZXNjYXBlZFBhdGh9XCIgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLWJ0biBkYW5nZXJcIiB0aXRsZT1cIk1vdmUgc2Vzc2lvbiB0byBUcmFzaFwiPk1vdmUgdG8gVHJhc2g8L2J1dHRvbj5gXG4gICAgICA6ICcnO1xuXG4gICAgcmV0dXJuIGBcbiAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLXJvd1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1yb3ctbWFpblwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLXJvdy10aXRsZVwiPlxuICAgICAgICAgICAgPHN0cm9uZyBpZD1cInNtLW5hbWUtJHtpbmRleH1cIj4ke2VzY2FwZUh0bWwoc2Vzc2lvbi5wb3NpdGlvbl9uYW1lIHx8ICdVbnRpdGxlZCcpfTwvc3Ryb25nPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZXNzaW9uLXN0YXR1cy1waWxsIHNlc3Npb24tc3RhdHVzLXNhdmVkXCI+PHNwYW4gY2xhc3M9XCJzZXNzaW9uLXN0YXR1cy1kb3RcIj48L3NwYW4+U2F2ZWQ8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBpZD1cInNtLXJlbmFtZS0ke2luZGV4fVwiIHN0eWxlPVwiZGlzcGxheTpub25lO2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6NnB4O21hcmdpbjo4cHggMCA0cHg7XCI+XG4gICAgICAgICAgICA8aW5wdXQgaWQ9XCJzbS1pbnB1dC0ke2luZGV4fVwiIHR5cGU9XCJ0ZXh0XCIgdmFsdWU9XCIke2VzY2FwZUh0bWwoc2Vzc2lvbi5wb3NpdGlvbl9uYW1lIHx8ICcnKX1cIiBjbGFzcz1cInNtLWtleS1pbnB1dFwiIGRhdGEtc20tcGF0aD1cIiR7ZXNjYXBlZFBhdGh9XCIgZGF0YS1zbS1pZHg9XCIke2luZGV4fVwiIHN0eWxlPVwiYm9yZGVyOjFweCBzb2xpZCAjM2I4MmY2O2JvcmRlci1yYWRpdXM6NnB4O3BhZGRpbmc6NnB4IDEwcHg7Zm9udC1zaXplOjEzcHg7ZmxleDoxO21pbi13aWR0aDowO1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLXNtLWFjdGlvbj1cInN1Ym1pdC1yZW5hbWVcIiBkYXRhLXNtLXBhdGg9XCIke2VzY2FwZWRQYXRofVwiIGRhdGEtc20taWR4PVwiJHtpbmRleH1cIiBjbGFzcz1cInNlc3Npb24tc3dpdGNoZXItYnRuXCI+U2F2ZTwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLXNtLWFjdGlvbj1cImNhbmNlbC1yZW5hbWVcIiBkYXRhLXNtLWlkeD1cIiR7aW5kZXh9XCIgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLWJ0blwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLXJvdy1tZXRhXCI+XG4gICAgICAgICAgICAke2VzY2FwZUh0bWwoZm9ybWF0U2Vzc2lvblBoYXNlTGFiZWwoc2Vzc2lvbi5waGFzZSkpfSBcdTAwQjcgQ3JlYXRlZCAke2VzY2FwZUh0bWwoY3JlYXRlZExhYmVsKX0ke3NhdmVkTWV0YX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLWFjdGlvbnNcIj5cbiAgICAgICAgICA8YnV0dG9uIGRhdGEtc20tYWN0aW9uPVwibG9hZFwiIGRhdGEtc20tcGF0aD1cIiR7ZXNjYXBlZFBhdGh9XCIgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLWxpbmtcIj5Mb2FkPC9idXR0b24+XG4gICAgICAgICAgJHttYW5hZ2VtZW50SHRtbH1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5gO1xuICB9KS5qb2luKCcnKX08L2Rpdj5gO1xufVxuXG5mdW5jdGlvbiBfcmVuZGVyU2Vzc2lvblN3aXRjaGVyU2VjdGlvbnMoYWN0aXZlU2Vzc2lvbnMsIHNhdmVkU2Vzc2lvbnMsIHsgaW5jbHVkZVNhdmVkTWFuYWdlbWVudCA9IGZhbHNlIH0gPSB7fSkge1xuICBjb25zdCBzYXZlZFNlY3Rpb25Ob3RlID0gaW5jbHVkZVNhdmVkTWFuYWdlbWVudFxuICAgID8gJ0xvYWQgZnJvbSBkaXNrLCByZW5hbWUsIG9yIG1vdmUgc2F2ZWQgd29yayB0byBUcmFzaC4nXG4gICAgOiAnTG9hZCBzYXZlZCB3b3JrIGZyb20gZGlzay4nO1xuXG4gIHJldHVybiBgXG4gICAgPGRpdiBjbGFzcz1cInNlc3Npb24tc3dpdGNoZXItc2VjdGlvbnNcIj5cbiAgICAgIDxzZWN0aW9uIGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1zZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLXNlY3Rpb24taGVhZGVyXCI+XG4gICAgICAgICAgPGgzPkFjdGl2ZSBTZXNzaW9uczwvaDM+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLXNlY3Rpb24tbm90ZVwiPkluLW1lbW9yeSBzZXNzaW9ucyB0aGF0IGNhbiBiZSBvcGVuZWQgZGlyZWN0bHkuPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgJHtfcmVuZGVyQWN0aXZlU2Vzc2lvblJvd3MoYWN0aXZlU2Vzc2lvbnMpfVxuICAgICAgPC9zZWN0aW9uPlxuICAgICAgPHNlY3Rpb24gY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLXNlY3Rpb25cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNlc3Npb24tc3dpdGNoZXItc2VjdGlvbi1oZWFkZXJcIj5cbiAgICAgICAgICA8aDM+U2F2ZWQgU2Vzc2lvbnM8L2gzPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2Vzc2lvbi1zd2l0Y2hlci1zZWN0aW9uLW5vdGVcIj4ke3NhdmVkU2VjdGlvbk5vdGV9PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgJHtfcmVuZGVyU2F2ZWRTZXNzaW9uUm93cyhzYXZlZFNlc3Npb25zLCB7IGluY2x1ZGVNYW5hZ2VtZW50OiBpbmNsdWRlU2F2ZWRNYW5hZ2VtZW50IH0pfVxuICAgICAgPC9zZWN0aW9uPlxuICAgIDwvZGl2PmA7XG59XG5cbmZ1bmN0aW9uIF91cGRhdGVTZXNzaW9uU3dpdGNoZXJIZWFkZXIoc3RhdHVzID0ge30pIHtcbiAgY29uc3QgbGFiZWwgPSBidWlsZFNlc3Npb25Td2l0Y2hlckxhYmVsKHN0YXR1cyk7XG4gIGNvbnN0IHN3aXRjaGVyTGFiZWxFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXNzaW9uLXN3aXRjaGVyLWxhYmVsJyk7XG4gIGNvbnN0IHN3aXRjaGVyQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Nlc3Npb24tc3dpdGNoZXItYnRuJyk7XG4gIGNvbnN0IHN1YnRpdGxlRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhZGVyLXNlc3Npb24tbmFtZScpO1xuICBjb25zdCBoYXNTZXNzaW9uID0gQm9vbGVhbihfZ2V0Q3VycmVudFNlc3Npb25JZFZhbHVlKCkpO1xuXG4gIGlmIChzd2l0Y2hlckxhYmVsRWwpIHN3aXRjaGVyTGFiZWxFbC50ZXh0Q29udGVudCA9IGxhYmVsO1xuICBpZiAoc3dpdGNoZXJCdG4pIHN3aXRjaGVyQnRuLmNsYXNzTGlzdC50b2dnbGUoJ2lzLXNlc3Npb24tYWN0aXZlJywgaGFzU2Vzc2lvbik7XG4gIGlmIChzdWJ0aXRsZUVsKSB7XG4gICAgc3VidGl0bGVFbC50ZXh0Q29udGVudCA9IGhhc1Nlc3Npb24gPyBgQ3VycmVudCBzZXNzaW9uOiAke2xhYmVsfWAgOiAnU2VsZWN0IG9yIGNyZWF0ZSBhIHNlc3Npb24nO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBPd25lcnNoaXAgY29uZmxpY3QgZGlhbG9nIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBzaG93T3duZXJzaGlwQ29uZmxpY3REaWFsb2cobWVzc2FnZSA9ICdUaGlzIHNlc3Npb24gaXMgY3VycmVudGx5IGNsYWltZWQgYnkgYW5vdGhlciBicm93c2VyIHRhYi4nKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICBjb25zdCBvdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ293bmVyc2hpcC1jb25mbGljdC1vdmVybGF5Jyk7XG4gICAgY29uc3QgbWVzc2FnZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ293bmVyc2hpcC1jb25mbGljdC1tZXNzYWdlJyk7XG4gICAgY29uc3QgbG9hZERpZmZlcmVudEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvd25lcnNoaXAtbG9hZC1kaWZmZXJlbnQtYnRuJyk7XG4gICAgY29uc3QgbmV3U2Vzc2lvbkJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvd25lcnNoaXAtbmV3LXNlc3Npb24tYnRuJyk7XG4gICAgY29uc3QgdGFrZW92ZXJCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3duZXJzaGlwLXRha2VvdmVyLWJ0bicpO1xuICAgIGlmICghb3ZlcmxheSB8fCAhbWVzc2FnZUVsIHx8ICFsb2FkRGlmZmVyZW50QnRuIHx8ICFuZXdTZXNzaW9uQnRuIHx8ICF0YWtlb3ZlckJ0bikge1xuICAgICAgcmVzb2x2ZSgnZGlmZmVyZW50Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY2xlYW51cCA9IChjaG9pY2UpID0+IHtcbiAgICAgIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIHJlc3RvcmVGb2N1cygpO1xuICAgICAgbG9hZERpZmZlcmVudEJ0bi5vbmNsaWNrID0gbnVsbDtcbiAgICAgIG5ld1Nlc3Npb25CdG4ub25jbGljayA9IG51bGw7XG4gICAgICB0YWtlb3ZlckJ0bi5vbmNsaWNrID0gbnVsbDtcbiAgICAgIHJlc29sdmUoY2hvaWNlKTtcbiAgICB9O1xuXG4gICAgbWVzc2FnZUVsLnRleHRDb250ZW50ID0gbWVzc2FnZTtcbiAgICBvdmVybGF5LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgd2luZG93Ll9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICBzZXRJbml0aWFsRm9jdXMoJ293bmVyc2hpcC1jb25mbGljdC1vdmVybGF5Jyk7XG4gICAgdHJhcEZvY3VzKCdvd25lcnNoaXAtY29uZmxpY3Qtb3ZlcmxheScpO1xuXG4gICAgbG9hZERpZmZlcmVudEJ0bi5vbmNsaWNrID0gKCkgPT4gY2xlYW51cCgnZGlmZmVyZW50Jyk7XG4gICAgbmV3U2Vzc2lvbkJ0bi5vbmNsaWNrID0gKCkgPT4gY2xlYW51cCgnbmV3Jyk7XG4gICAgdGFrZW92ZXJCdG4ub25jbGljayA9ICgpID0+IGNsZWFudXAoJ3Rha2VvdmVyJyk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjbG9zZU93bmVyc2hpcENvbmZsaWN0RGlhbG9nKGNob2ljZSA9ICdkaWZmZXJlbnQnKSB7XG4gIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3duZXJzaGlwLWNvbmZsaWN0LW92ZXJsYXknKTtcbiAgaWYgKG92ZXJsYXkpIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgcmVzdG9yZUZvY3VzKCk7XG4gIGNvbnN0IGxvYWREaWZmZXJlbnRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3duZXJzaGlwLWxvYWQtZGlmZmVyZW50LWJ0bicpO1xuICBpZiAobG9hZERpZmZlcmVudEJ0biAmJiB0eXBlb2YgbG9hZERpZmZlcmVudEJ0bi5vbmNsaWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgbG9hZERpZmZlcmVudEJ0bi5vbmNsaWNrKCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHJldHVybiBjaG9pY2U7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBTZXNzaW9uIGZpbGUtYnJvd3NlciB0YWJsZSBoZWxwZXJzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBfc2V0U21Tb3J0KGtleSkge1xuICBpZiAoX3NtU29ydEtleSA9PT0ga2V5KSB7XG4gICAgX3NtU29ydERpciA9IF9zbVNvcnREaXIgPT09ICdhc2MnID8gJ2Rlc2MnIDogJ2FzYyc7XG4gIH0gZWxzZSB7XG4gICAgX3NtU29ydEtleSA9IGtleTtcbiAgICBfc21Tb3J0RGlyID0ga2V5ID09PSAnbGFzdE1vZGlmaWVkJyA/ICdkZXNjJyA6ICdhc2MnO1xuICB9XG4gIHRyeSB7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oX1NNX1NUT1JBR0VfS0VZLCBfc21Tb3J0S2V5KTtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShfU01fU1RPUkFHRV9ESVIsIF9zbVNvcnREaXIpO1xuICB9IGNhdGNoIChfKSB7IC8qIHN0b3JhZ2UgdW5hdmFpbGFibGUgKi8gfVxuICBfcmVuZGVyU2Vzc2lvblRhYmxlRnJvbUNhY2hlKCk7XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVkSXNvRnJvbVNlc3Npb25QYXRoKHNlc3Npb25QYXRoKSB7XG4gIGlmICghc2Vzc2lvblBhdGgpIHJldHVybiAnJztcbiAgY29uc3QgcGF0aFRleHQgPSBTdHJpbmcoc2Vzc2lvblBhdGgpO1xuICBjb25zdCBwYXJ0cyAgICA9IHBhdGhUZXh0LnNwbGl0KC9bXFxcXC9dLykuZmlsdGVyKEJvb2xlYW4pO1xuICBpZiAocGFydHMubGVuZ3RoIDwgMikgcmV0dXJuICcnO1xuICBjb25zdCBkaXJOYW1lICA9IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDJdO1xuICBjb25zdCBtYXRjaCAgICA9IGRpck5hbWUubWF0Y2goLyhcXGR7NH0pKFxcZHsyfSkoXFxkezJ9KVtfLV0/KFxcZHsyfSkoXFxkezJ9KShcXGR7Mn0pLyk7XG4gIGlmICghbWF0Y2gpIHJldHVybiAnJztcbiAgY29uc3QgWywgeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmRdID0gbWF0Y2g7XG4gIHJldHVybiBgJHt5ZWFyfS0ke21vbnRofS0ke2RheX1UJHtob3VyfToke21pbnV0ZX06JHtzZWNvbmR9WmA7XG59XG5cbmZ1bmN0aW9uIF9ub3JtYWxpemVTZXNzaW9uc0ZvclRhYmxlKGFjdGl2ZVNlc3Npb25zLCBzYXZlZFNlc3Npb25zKSB7XG4gIGNvbnN0IGN1cnJlbnRTZXNzaW9uSWQgPSBfZ2V0Q3VycmVudFNlc3Npb25JZFZhbHVlKCk7XG4gIGNvbnN0IHJvd3MgPSBbXTtcblxuICBmb3IgKGNvbnN0IHMgb2YgYWN0aXZlU2Vzc2lvbnMpIHtcbiAgICBjb25zdCBvd25lcnNoaXAgPSBnZXRBY3RpdmVTZXNzaW9uT3duZXJzaGlwTWV0YShzLCB7IGN1cnJlbnRTZXNzaW9uSWQgfSk7XG4gICAgcm93cy5wdXNoKHtcbiAgICAgIHR5cGU6ICAgICAgICAgICAgICAnYWN0aXZlJyxcbiAgICAgIG5hbWU6ICAgICAgICAgICAgICAgcy5wb3NpdGlvbl9uYW1lIHx8ICdVbnRpdGxlZCcsXG4gICAgICBjb21wYW55OiAgICAgICAgICAgIHMuY29tcGFueSB8fCAnJyxcbiAgICAgIHBoYXNlOiAgICAgICAgICAgICAgcy5waGFzZSAgICAgICAgIHx8ICcnLFxuICAgICAgYXBwbGljYXRpb25TdGF0dXM6ICBzLmFwcGxpY2F0aW9uX3N0YXR1cyB8fCAnJyxcbiAgICAgIGF0c1Njb3JlOiAgICAgICAgICAgcy5hdHNfc2NvcmUgPz8gbnVsbCxcbiAgICAgIGxhc3RNb2RpZmllZDogICAgICAgcy5sYXN0X21vZGlmaWVkICA/IG5ldyBEYXRlKHMubGFzdF9tb2RpZmllZCkgOiBudWxsLFxuICAgICAgY3JlYXRlZDogICAgICAgICAgICBzLmNyZWF0ZWQgICAgICAgID8gbmV3IERhdGUocy5jcmVhdGVkKSAgICAgICA6IG51bGwsXG4gICAgICBvd25lcnNoaXAsXG4gICAgICBzZXNzaW9uSWQ6ICAgICAgICAgIHMuc2Vzc2lvbl9pZCxcbiAgICAgIHBhdGg6ICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgIGlkeDogICAgICAgICAgICAgICAgbnVsbCxcbiAgICB9KTtcbiAgfVxuXG4gIHNhdmVkU2Vzc2lvbnMuZm9yRWFjaCgocywgaWR4KSA9PiB7XG4gICAgY29uc3QgY3JlYXRlZElzbyA9IF9jcmVhdGVkSXNvRnJvbVNlc3Npb25QYXRoKHMucGF0aCk7XG4gICAgcm93cy5wdXNoKHtcbiAgICAgIHR5cGU6ICAgICAgICAgICAgICAnc2F2ZWQnLFxuICAgICAgbmFtZTogICAgICAgICAgICAgICBzLnBvc2l0aW9uX25hbWUgfHwgJ1VudGl0bGVkJyxcbiAgICAgIGNvbXBhbnk6ICAgICAgICAgICAgcy5jb21wYW55IHx8ICcnLFxuICAgICAgcGhhc2U6ICAgICAgICAgICAgICBzLnBoYXNlICAgICAgICAgfHwgJycsXG4gICAgICBhcHBsaWNhdGlvblN0YXR1czogIHMuYXBwbGljYXRpb25fc3RhdHVzIHx8ICcnLFxuICAgICAgbm90ZXM6ICAgICAgICAgICAgICBzLm5vdGVzIHx8ICcnLFxuICAgICAgYXRzU2NvcmU6ICAgICAgICAgICBzLmF0c19zY29yZSA/PyBudWxsLFxuICAgICAgbGFzdE1vZGlmaWVkOiAgICAgICBzLnRpbWVzdGFtcCAgPyBuZXcgRGF0ZShzLnRpbWVzdGFtcCkgIDogbnVsbCxcbiAgICAgIGNyZWF0ZWQ6ICAgICAgICAgICAgY3JlYXRlZElzbyAgID8gbmV3IERhdGUoY3JlYXRlZElzbykgICA6IG51bGwsXG4gICAgICBvd25lcnNoaXA6ICAgICAgICAgIG51bGwsXG4gICAgICBzZXNzaW9uSWQ6ICAgICAgICAgIG51bGwsXG4gICAgICBwYXRoOiAgICAgICAgICAgICAgIHMucGF0aCxcbiAgICAgIGlkeCxcbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHJvd3M7XG59XG5cbmZ1bmN0aW9uIF9zb3J0U2Vzc2lvblJvd3Mocm93cywga2V5LCBkaXIpIHtcbiAgcmV0dXJuIFsuLi5yb3dzXS5zb3J0KChhLCBiKSA9PiB7XG4gICAgbGV0IGF2LCBidjtcbiAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgY2FzZSAnbmFtZSc6XG4gICAgICAgIGF2ID0gKGEubmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgYnYgPSAoYi5uYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICByZXR1cm4gZGlyID09PSAnYXNjJyA/IGF2LmxvY2FsZUNvbXBhcmUoYnYpIDogYnYubG9jYWxlQ29tcGFyZShhdik7XG4gICAgICBjYXNlICdzdGF0dXMnOiB7XG4gICAgICAgIGNvbnN0IHJhbmsgPSByID0+IHIudHlwZSA9PT0gJ2FjdGl2ZScgPyAoci5vd25lcnNoaXA/LmlzQ3VycmVudCA/IDAgOiAxKSA6IDI7XG4gICAgICAgIGF2ID0gcmFuayhhKTsgYnYgPSByYW5rKGIpO1xuICAgICAgICByZXR1cm4gZGlyID09PSAnYXNjJyA/IGF2IC0gYnYgOiBidiAtIGF2O1xuICAgICAgfVxuICAgICAgY2FzZSAncGhhc2UnOlxuICAgICAgICBhdiA9IChhLnBoYXNlIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBidiA9IChiLnBoYXNlIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICByZXR1cm4gZGlyID09PSAnYXNjJyA/IGF2LmxvY2FsZUNvbXBhcmUoYnYpIDogYnYubG9jYWxlQ29tcGFyZShhdik7XG4gICAgICBjYXNlICdsYXN0TW9kaWZpZWQnOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYXYgPSBhLmxhc3RNb2RpZmllZCA/IGEubGFzdE1vZGlmaWVkLmdldFRpbWUoKSA6IDA7XG4gICAgICAgIGJ2ID0gYi5sYXN0TW9kaWZpZWQgPyBiLmxhc3RNb2RpZmllZC5nZXRUaW1lKCkgOiAwO1xuICAgICAgICByZXR1cm4gZGlyID09PSAnYXNjJyA/IGF2IC0gYnYgOiBidiAtIGF2O1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIF9yZW5kZXJTZXNzaW9uVGFibGVIZWFkZXIoKSB7XG4gIGNvbnN0IGNvbHMgPSBbXG4gICAgeyBrZXk6ICduYW1lJywgICAgICAgICBsYWJlbDogJ05hbWUnICAgICB9LFxuICAgIHsga2V5OiAnc3RhdHVzJywgICAgICAgbGFiZWw6ICdTdGF0dXMnICAgfSxcbiAgICB7IGtleTogJ3BoYXNlJywgICAgICAgIGxhYmVsOiAnUGhhc2UnICAgIH0sXG4gICAgeyBrZXk6ICdsYXN0TW9kaWZpZWQnLCBsYWJlbDogJ01vZGlmaWVkJyB9LFxuICBdO1xuICBjb25zdCBjZWxscyA9IGNvbHMubWFwKCh7IGtleSwgbGFiZWwgfSkgPT4ge1xuICAgIGNvbnN0IGFjdGl2ZSA9IF9zbVNvcnRLZXkgPT09IGtleTtcbiAgICBjb25zdCBpY29uICAgPSBhY3RpdmUgPyAoX3NtU29ydERpciA9PT0gJ2FzYycgPyAnXFx1MjViMicgOiAnXFx1MjViYycpIDogJ1xcdTIxYzUnO1xuICAgIHJldHVybiBgPHNwYW4gY2xhc3M9XCJzbS10aCR7YWN0aXZlID8gJyBzbS10aC1zb3J0ZWQnIDogJyd9XCIgZGF0YS1zbS1zb3J0PVwiJHtrZXl9XCIgcm9sZT1cImJ1dHRvblwiIHRhYmluZGV4PVwiMFwiIHRpdGxlPVwiU29ydCBieSAke2xhYmVsfVwiPiR7ZXNjYXBlSHRtbChsYWJlbCl9IDxzcGFuIGNsYXNzPVwic20tc29ydC1pY29uJHthY3RpdmUgPyAnIHNtLXNvcnQtYWN0aXZlJyA6ICcnfVwiPiR7aWNvbn08L3NwYW4+PC9zcGFuPmA7XG4gIH0pO1xuICByZXR1cm4gYDxkaXYgY2xhc3M9XCJzbS10aGVhZFwiPiR7Y2VsbHMuam9pbignJyl9PHNwYW4gY2xhc3M9XCJzbS10aCBzbS10aC1hY3Rpb25zXCI+QWN0aW9uczwvc3Bhbj48L2Rpdj5gO1xufVxuXG5mdW5jdGlvbiBfZm10RGF0ZUNvbXBhY3QoZCkge1xuICBpZiAoIWQpIHJldHVybiAnXFx1MjAxNCc7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGQudG9Mb2NhbGVTdHJpbmcoJ2VuLVVTJywge1xuICAgICAgbW9udGg6ICdudW1lcmljJywgZGF5OiAnbnVtZXJpYycsIHllYXI6ICcyLWRpZ2l0JyxcbiAgICAgIGhvdXI6ICdudW1lcmljJywgbWludXRlOiAnMi1kaWdpdCcsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKF8pIHsgcmV0dXJuICdcXHUyMDE0JzsgfVxufVxuXG5mdW5jdGlvbiBfcmVuZGVyU2Vzc2lvblRhYmxlUm93KHJvdykge1xuICBjb25zdCBwaGFzZUxhYmVsID0gZXNjYXBlSHRtbChmb3JtYXRTZXNzaW9uUGhhc2VMYWJlbChyb3cucGhhc2UpKTtcbiAgY29uc3QgbW9kTGFiZWwgICA9IGVzY2FwZUh0bWwoX2ZtdERhdGVDb21wYWN0KHJvdy5sYXN0TW9kaWZpZWQpKTtcblxuICBjb25zdCBzdGF0dXNQaWxsID0gcm93LnR5cGUgPT09ICdhY3RpdmUnXG4gICAgPyBgPHNwYW4gY2xhc3M9XCJzZXNzaW9uLXN0YXR1cy1waWxsICR7cm93Lm93bmVyc2hpcC5jbGFzc05hbWV9XCI+PHNwYW4gY2xhc3M9XCJzZXNzaW9uLXN0YXR1cy1kb3RcIj48L3NwYW4+JHtlc2NhcGVIdG1sKHJvdy5vd25lcnNoaXAubGFiZWwpfTwvc3Bhbj5gXG4gICAgOiBgPHNwYW4gY2xhc3M9XCJzZXNzaW9uLXN0YXR1cy1waWxsIHNlc3Npb24tc3RhdHVzLXNhdmVkXCI+PHNwYW4gY2xhc3M9XCJzZXNzaW9uLXN0YXR1cy1kb3RcIj48L3NwYW4+U2F2ZWQ8L3NwYW4+YDtcblxuICBsZXQgYWN0aW9uSHRtbDtcbiAgaWYgKHJvdy50eXBlID09PSAnYWN0aXZlJykge1xuICAgIGNvbnN0IGhyZWYgPSBgLz9zZXNzaW9uPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHJvdy5zZXNzaW9uSWQgfHwgJycpfWA7XG4gICAgYWN0aW9uSHRtbCA9IHJvdy5vd25lcnNoaXAuaXNDdXJyZW50XG4gICAgICA/ICc8c3BhbiBjbGFzcz1cInNtLWJ0biBzbS1idG4tZGlzYWJsZWRcIiBhcmlhLWRpc2FibGVkPVwidHJ1ZVwiPkN1cnJlbnQ8L3NwYW4+J1xuICAgICAgOiBgPGEgY2xhc3M9XCJzbS1idG4gc20tYnRuLW9wZW5cIiBocmVmPVwiJHtocmVmfVwiPk9wZW48L2E+YDtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBlcCAgPSBlc2NhcGVIdG1sKHJvdy5wYXRoIHx8ICcnKTtcbiAgICBjb25zdCBpZHggPSByb3cuaWR4O1xuICAgIGFjdGlvbkh0bWwgPVxuICAgICAgYDxidXR0b24gZGF0YS1zbS1hY3Rpb249XCJsb2FkXCIgICBkYXRhLXNtLXBhdGg9XCIke2VwfVwiIGNsYXNzPVwic20tYnRuIHNtLWJ0bi1vcGVuIHNtLWJ0bi1pY29uXCIgdGl0bGU9XCJMb2FkIHNlc3Npb25cIiBhcmlhLWxhYmVsPVwiTG9hZCBzZXNzaW9uXCI+PGkgY2xhc3M9XCJmYS1zb2xpZCBmYS1mb2xkZXItb3BlblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT48L2J1dHRvbj5gICtcbiAgICAgIGA8YnV0dG9uIGRhdGEtc20tYWN0aW9uPVwicmVuYW1lXCIgZGF0YS1zbS1wYXRoPVwiJHtlcH1cIiBkYXRhLXNtLWlkeD1cIiR7aWR4fVwiIGNsYXNzPVwic20tYnRuIHNtLWJ0bi1pY29uXCIgdGl0bGU9XCJSZW5hbWUgc2Vzc2lvblwiIGFyaWEtbGFiZWw9XCJSZW5hbWUgc2Vzc2lvblwiPjxpIGNsYXNzPVwiZmEtc29saWQgZmEtcGVuY2lsXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPjwvYnV0dG9uPmAgK1xuICAgICAgYDxidXR0b24gZGF0YS1zbS1hY3Rpb249XCJkdXBsaWNhdGVcIiBkYXRhLXNtLXBhdGg9XCIke2VwfVwiIGNsYXNzPVwic20tYnRuIHNtLWJ0bi1pY29uXCIgdGl0bGU9XCJEdXBsaWNhdGUgc2Vzc2lvblwiIGFyaWEtbGFiZWw9XCJEdXBsaWNhdGUgc2Vzc2lvblwiPjxpIGNsYXNzPVwiZmEtc29saWQgZmEtY29weVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT48L2J1dHRvbj5gICtcbiAgICAgIGA8YnV0dG9uIGRhdGEtc20tYWN0aW9uPVwiZGVsZXRlXCIgZGF0YS1zbS1wYXRoPVwiJHtlcH1cIiBjbGFzcz1cInNtLWJ0biBzbS1idG4tZGFuZ2VyIHNtLWJ0bi1pY29uXCIgdGl0bGU9XCJNb3ZlIHRvIFRyYXNoXCIgYXJpYS1sYWJlbD1cIk1vdmUgc2Vzc2lvbiB0byBUcmFzaFwiPjxpIGNsYXNzPVwiZmEtc29saWQgZmEtdHJhc2hcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+PC9idXR0b24+YDtcbiAgfVxuXG4gIGNvbnN0IHJvd0NsYXNzID0gKHJvdy50eXBlID09PSAnYWN0aXZlJyAmJiByb3cub3duZXJzaGlwLmlzQ3VycmVudCkgPyAnc20tdHIgc20tdHItY3VycmVudCcgOiAnc20tdHInO1xuXG4gIGNvbnN0IGNvbXBhbnlTdWIgPSByb3cuY29tcGFueVxuICAgID8gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC44ZW07Y29sb3I6Izk0YTNiODttYXJnaW4tdG9wOjFweDtcIj4ke2VzY2FwZUh0bWwocm93LmNvbXBhbnkpfTwvZGl2PmBcbiAgICA6ICcnO1xuICBjb25zdCBuYW1lQ2VsbCA9IHJvdy50eXBlID09PSAnc2F2ZWQnXG4gICAgPyBgPHNwYW4gaWQ9XCJzbS1uYW1lLSR7cm93LmlkeH1cIj4ke2VzY2FwZUh0bWwocm93Lm5hbWUpfTwvc3Bhbj5gICtcbiAgICAgIGAke2NvbXBhbnlTdWJ9YCArXG4gICAgICBgPHNwYW4gaWQ9XCJzbS1yZW5hbWUtJHtyb3cuaWR4fVwiIHN0eWxlPVwiZGlzcGxheTpub25lO2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6NHB4O21hcmdpbi10b3A6M3B4O1wiPmAgK1xuICAgICAgICBgPGlucHV0IGlkPVwic20taW5wdXQtJHtyb3cuaWR4fVwiIHR5cGU9XCJ0ZXh0XCIgdmFsdWU9XCIke2VzY2FwZUh0bWwocm93Lm5hbWUpfVwiIGNsYXNzPVwic20ta2V5LWlucHV0XCJgICtcbiAgICAgICAgICBgIGRhdGEtc20tcGF0aD1cIiR7ZXNjYXBlSHRtbChyb3cucGF0aCB8fCAnJyl9XCIgZGF0YS1zbS1pZHg9XCIke3Jvdy5pZHh9XCJgICtcbiAgICAgICAgICBgIHN0eWxlPVwiYm9yZGVyOjFweCBzb2xpZCAjM2I4MmY2O2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6M3B4IDhweDtmb250LXNpemU6MTJweDtmbGV4OjE7bWluLXdpZHRoOjYwcHg7XCI+YCArXG4gICAgICAgIGA8YnV0dG9uIGRhdGEtc20tYWN0aW9uPVwic3VibWl0LXJlbmFtZVwiIGRhdGEtc20tcGF0aD1cIiR7ZXNjYXBlSHRtbChyb3cucGF0aCB8fCAnJyl9XCIgZGF0YS1zbS1pZHg9XCIke3Jvdy5pZHh9XCIgY2xhc3M9XCJzbS1idG5cIiB0aXRsZT1cIlNhdmUgcmVuYW1lXCIgYXJpYS1sYWJlbD1cIlNhdmUgcmVuYW1lXCI+XFx1MjcxMzwvYnV0dG9uPmAgK1xuICAgICAgICBgPGJ1dHRvbiBkYXRhLXNtLWFjdGlvbj1cImNhbmNlbC1yZW5hbWVcIiBkYXRhLXNtLWlkeD1cIiR7cm93LmlkeH1cIiBjbGFzcz1cInNtLWJ0blwiIHRpdGxlPVwiQ2FuY2VsIHJlbmFtZVwiIGFyaWEtbGFiZWw9XCJDYW5jZWwgcmVuYW1lXCI+XFx1MjcxNTwvYnV0dG9uPmAgK1xuICAgICAgYDwvc3Bhbj5gXG4gICAgOiBgPHNwYW4+JHtlc2NhcGVIdG1sKHJvdy5uYW1lKX08L3NwYW4+JHtjb21wYW55U3VifWA7XG5cbiAgY29uc3QgYXBwU3RhdHVzTGFiZWxzID0ge1xuICAgIGRyYWZ0OiAnRHJhZnQnLCByZWFkeTogJ1JlYWR5Jywgc2VudDogJ1NlbnQnLCBxdWV1ZWQ6ICdRdWV1ZWQnLFxuICAgIGludGVydmlldzogJ0ludGVydmlldycsIHJlamVjdGVkOiAnUmVqZWN0ZWQnLCBhY2NlcHRlZDogJ0FjY2VwdGVkJyxcbiAgICBwYXJrZWQ6ICdQYXJrZWQnLFxuICB9O1xuICBjb25zdCBhcHBTdGF0dXNDb2xvcnMgPSB7XG4gICAgZHJhZnQ6ICcjOTRhM2I4JywgcmVhZHk6ICcjM2I4MmY2Jywgc2VudDogJyMyMmM1NWUnLCBxdWV1ZWQ6ICcjZWFiMzA4JyxcbiAgICBpbnRlcnZpZXc6ICcjYTg1NWY3JywgcmVqZWN0ZWQ6ICcjZWY0NDQ0JywgYWNjZXB0ZWQ6ICcjMDU5NjY5JyxcbiAgICBwYXJrZWQ6ICcjZjk3MzE2JyxcbiAgfTtcbiAgY29uc3QgYXBwU3RhdHVzID0gcm93LmFwcGxpY2F0aW9uU3RhdHVzIHx8ICcnO1xuICBjb25zdCBhcHBTdGF0dXNCYWRnZSA9IGFwcFN0YXR1cyAmJiBhcHBTdGF0dXNMYWJlbHNbYXBwU3RhdHVzXVxuICAgID8gYCA8c3BhbiBpZD1cInNtLXN0YXR1cy1iYWRnZS0ke3Jvdy5pZHh9XCIgc3R5bGU9XCJmb250LXNpemU6MC43NWVtO3BhZGRpbmc6MXB4IDZweDtib3JkZXItcmFkaXVzOjlweDtiYWNrZ3JvdW5kOiR7YXBwU3RhdHVzQ29sb3JzW2FwcFN0YXR1c119O2NvbG9yOiNmZmY7dmVydGljYWwtYWxpZ246bWlkZGxlO1wiPiR7YXBwU3RhdHVzTGFiZWxzW2FwcFN0YXR1c119PC9zcGFuPmBcbiAgICA6IGA8c3BhbiBpZD1cInNtLXN0YXR1cy1iYWRnZS0ke3Jvdy5pZHh9XCI+PC9zcGFuPmA7XG5cbiAgLy8gU3RhdHVzLWVkaXQgaW5saW5lIHdpZGdldCAoc2F2ZWQgcm93cyBvbmx5KVxuICBjb25zdCBzdGF0dXNFZGl0V2lkZ2V0ID0gcm93LnR5cGUgPT09ICdzYXZlZCdcbiAgICA/IGA8c3BhbiBpZD1cInNtLXN0YXR1cy1lZGl0LSR7cm93LmlkeH1cIiBzdHlsZT1cImRpc3BsYXk6bm9uZTthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjRweDttYXJnaW4tdG9wOjJweDtcIj5gICtcbiAgICAgICAgYDxzZWxlY3QgaWQ9XCJzbS1zdGF0dXMtc2VsLSR7cm93LmlkeH1cIiBjbGFzcz1cInNtLWtleS1pbnB1dFwiIHN0eWxlPVwiYm9yZGVyOjFweCBzb2xpZCAjM2I4MmY2O2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6MnB4IDRweDtmb250LXNpemU6MTJweDtcIiBhcmlhLWxhYmVsPVwiU2VsZWN0IGFwcGxpY2F0aW9uIHN0YXR1c1wiPmAgK1xuICAgICAgICAgIGA8b3B0aW9uIHZhbHVlPVwiXCI+LS0gY2xlYXIgLS08L29wdGlvbj5gICtcbiAgICAgICAgICBPYmplY3QuZW50cmllcyhhcHBTdGF0dXNMYWJlbHMpLm1hcCgoW3YsIGxdKSA9PlxuICAgICAgICAgICAgYDxvcHRpb24gdmFsdWU9XCIke3Z9XCIke2FwcFN0YXR1cyA9PT0gdiA/ICcgc2VsZWN0ZWQnIDogJyd9PiR7bH08L29wdGlvbj5gXG4gICAgICAgICAgKS5qb2luKCcnKSArXG4gICAgICAgIGA8L3NlbGVjdD5gICtcbiAgICAgICAgYDxidXR0b24gZGF0YS1zbS1hY3Rpb249XCJzdWJtaXQtc3RhdHVzXCIgZGF0YS1zbS1wYXRoPVwiJHtlc2NhcGVIdG1sKHJvdy5wYXRoIHx8ICcnKX1cIiBkYXRhLXNtLWlkeD1cIiR7cm93LmlkeH1cIiBjbGFzcz1cInNtLWJ0blwiIHRpdGxlPVwiU2F2ZSBzdGF0dXNcIiBhcmlhLWxhYmVsPVwiU2F2ZSBzdGF0dXNcIj4mIzEwMDAzOzwvYnV0dG9uPmAgK1xuICAgICAgICBgPGJ1dHRvbiBkYXRhLXNtLWFjdGlvbj1cImNhbmNlbC1zdGF0dXNcIiBkYXRhLXNtLWlkeD1cIiR7cm93LmlkeH1cIiBjbGFzcz1cInNtLWJ0blwiIHRpdGxlPVwiQ2FuY2VsXCIgYXJpYS1sYWJlbD1cIkNhbmNlbCBzdGF0dXMgZWRpdFwiPiYjMTAwMDU7PC9idXR0b24+YCArXG4gICAgICBgPC9zcGFuPmBcbiAgICA6ICcnO1xuXG4gIC8vIE5vdGVzLWVkaXQgaW5saW5lIHdpZGdldCAoc2F2ZWQgcm93cyBvbmx5KVxuICBjb25zdCBub3Rlc1ByZXZpZXcgPSByb3cubm90ZXNcbiAgICA/IGA8ZGl2IGlkPVwic20tbm90ZXMtcHJldmlldy0ke3Jvdy5pZHh9XCIgc3R5bGU9XCJmb250LXNpemU6MC43OGVtO2NvbG9yOiM5NGEzYjg7bWFyZ2luLXRvcDoycHg7bWF4LXdpZHRoOjI2MHB4O292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3doaXRlLXNwYWNlOm5vd3JhcDtcIiB0aXRsZT1cIiR7ZXNjYXBlSHRtbChyb3cubm90ZXMpfVwiPiR7ZXNjYXBlSHRtbChyb3cubm90ZXMpfTwvZGl2PmBcbiAgICA6IGA8ZGl2IGlkPVwic20tbm90ZXMtcHJldmlldy0ke3Jvdy5pZHh9XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7Zm9udC1zaXplOjAuNzhlbTtjb2xvcjojOTRhM2I4O21hcmdpbi10b3A6MnB4O1wiPjwvZGl2PmA7XG4gIGNvbnN0IG5vdGVzRWRpdFdpZGdldCA9IHJvdy50eXBlID09PSAnc2F2ZWQnXG4gICAgPyBgPHNwYW4gaWQ9XCJzbS1ub3Rlcy1lZGl0LSR7cm93LmlkeH1cIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Z2FwOjRweDttYXJnaW4tdG9wOjRweDt3aWR0aDoxMDAlO1wiPmAgK1xuICAgICAgICBgPHRleHRhcmVhIGlkPVwic20tbm90ZXMtdGEtJHtyb3cuaWR4fVwiIHJvd3M9XCIyXCIgbWF4bGVuZ3RoPVwiMjAwMFwiYCArXG4gICAgICAgICAgYCBzdHlsZT1cIndpZHRoOjEwMCU7Zm9udC1zaXplOjEycHg7cGFkZGluZzo0cHg7Ym9yZGVyOjFweCBzb2xpZCAjM2I4MmY2O2JvcmRlci1yYWRpdXM6NHB4O3Jlc2l6ZTp2ZXJ0aWNhbDtcImAgK1xuICAgICAgICAgIGAgYXJpYS1sYWJlbD1cIlNlc3Npb24gbm90ZXNcIiBwbGFjZWhvbGRlcj1cImUuZy4sIEludGVydmlld2VkIDIwMjUtMDMtMTAsIGF3YWl0aW5nIGNhbGxiYWNrXCI+JHtlc2NhcGVIdG1sKHJvdy5ub3RlcyB8fCAnJyl9PC90ZXh0YXJlYT5gICtcbiAgICAgICAgYDxzcGFuIHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDo0cHg7XCI+YCArXG4gICAgICAgICAgYDxidXR0b24gZGF0YS1zbS1hY3Rpb249XCJzdWJtaXQtbm90ZXNcIiBkYXRhLXNtLXBhdGg9XCIke2VzY2FwZUh0bWwocm93LnBhdGggfHwgJycpfVwiIGRhdGEtc20taWR4PVwiJHtyb3cuaWR4fVwiIGNsYXNzPVwic20tYnRuXCIgdGl0bGU9XCJTYXZlIG5vdGVzXCIgYXJpYS1sYWJlbD1cIlNhdmUgbm90ZXNcIj4mIzEwMDAzOzwvYnV0dG9uPmAgK1xuICAgICAgICAgIGA8YnV0dG9uIGRhdGEtc20tYWN0aW9uPVwiY2FuY2VsLW5vdGVzXCIgZGF0YS1zbS1pZHg9XCIke3Jvdy5pZHh9XCIgY2xhc3M9XCJzbS1idG5cIiB0aXRsZT1cIkNhbmNlbFwiIGFyaWEtbGFiZWw9XCJDYW5jZWwgbm90ZXMgZWRpdFwiPiYjMTAwMDU7PC9idXR0b24+YCArXG4gICAgICAgIGA8L3NwYW4+YCArXG4gICAgICBgPC9zcGFuPmBcbiAgICA6ICcnO1xuXG4gIGlmIChyb3cudHlwZSA9PT0gJ3NhdmVkJykge1xuICAgIGFjdGlvbkh0bWwgKz1cbiAgICAgIGA8YnV0dG9uIGRhdGEtc20tYWN0aW9uPVwiZWRpdC1zdGF0dXNcIiBkYXRhLXNtLXBhdGg9XCIke2VzY2FwZUh0bWwocm93LnBhdGggfHwgJycpfVwiIGRhdGEtc20taWR4PVwiJHtyb3cuaWR4fVwiIGNsYXNzPVwic20tYnRuIHNtLWJ0bi1pY29uXCIgdGl0bGU9XCJVcGRhdGUgYXBwbGljYXRpb24gc3RhdHVzXCIgYXJpYS1sYWJlbD1cIlVwZGF0ZSBhcHBsaWNhdGlvbiBzdGF0dXNcIj48aSBjbGFzcz1cImZhLXNvbGlkIGZhLXRhZ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT48L2J1dHRvbj5gO1xuICAgIGFjdGlvbkh0bWwgKz1cbiAgICAgIGA8YnV0dG9uIGRhdGEtc20tYWN0aW9uPVwiZWRpdC1ub3Rlc1wiIGRhdGEtc20tcGF0aD1cIiR7ZXNjYXBlSHRtbChyb3cucGF0aCB8fCAnJyl9XCIgZGF0YS1zbS1pZHg9XCIke3Jvdy5pZHh9XCIgY2xhc3M9XCJzbS1idG4gc20tYnRuLWljb25cIiB0aXRsZT1cIkVkaXQgbm90ZXNcIiBhcmlhLWxhYmVsPVwiRWRpdCBub3Rlc1wiPjxpIGNsYXNzPVwiZmEtc29saWQgZmEtbm90ZS1zdGlja3lcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+PC9idXR0b24+YDtcbiAgfVxuXG4gIGNvbnN0IGF0c1Njb3JlTGFiZWwgPSByb3cuYXRzU2NvcmUgIT0gbnVsbFxuICAgID8gKCgpID0+IHtcbiAgICAgICAgY29uc3QgcyA9IE51bWJlcihyb3cuYXRzU2NvcmUpO1xuICAgICAgICBjb25zdCBjb2xvciA9IHMgPj0gNzUgPyAnIzA1OTY2OScgOiBzID49IDUwID8gJyNkOTc3MDYnIDogJyNkYzI2MjYnO1xuICAgICAgICByZXR1cm4gYCA8c3BhbiB0aXRsZT1cIkFUUyBtYXRjaCBzY29yZVwiIHN0eWxlPVwiZm9udC1zaXplOjAuNzhlbTtwYWRkaW5nOjFweCA1cHg7Ym9yZGVyLXJhZGl1czo5cHg7YmFja2dyb3VuZDoke2NvbG9yfTtjb2xvcjojZmZmO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtmb250LXdlaWdodDo2MDA7XCI+JHtzfSU8L3NwYW4+YDtcbiAgICAgIH0pKClcbiAgICA6ICcnO1xuXG4gIHJldHVybiBgPGRpdiBjbGFzcz1cIiR7cm93Q2xhc3N9XCI+YCArXG4gICAgYDxzcGFuIGNsYXNzPVwic20tdGQgc20tdGQtbmFtZVwiPiR7bmFtZUNlbGx9PC9zcGFuPmAgK1xuICAgIGA8c3BhbiBjbGFzcz1cInNtLXRkIHNtLXRkLXN0YXR1c1wiPiR7c3RhdHVzUGlsbH08L3NwYW4+YCArXG4gICAgYDxzcGFuIGNsYXNzPVwic20tdGQgc20tdGQtcGhhc2VcIj48c3BhbiBpZD1cInNtLXBoYXNlLSR7cm93LmlkeH1cIj4ke3BoYXNlTGFiZWx9JHthdHNTY29yZUxhYmVsfSR7YXBwU3RhdHVzQmFkZ2V9PC9zcGFuPiR7c3RhdHVzRWRpdFdpZGdldH0ke25vdGVzUHJldmlld30ke25vdGVzRWRpdFdpZGdldH08L3NwYW4+YCArXG4gICAgYDxzcGFuIGNsYXNzPVwic20tdGQgc20tdGQtZGF0ZVwiPiR7bW9kTGFiZWx9PC9zcGFuPmAgK1xuICAgIGA8c3BhbiBjbGFzcz1cInNtLXRkIHNtLXRkLWFjdGlvbnNcIj4ke2FjdGlvbkh0bWx9PC9zcGFuPmAgK1xuICAgIGA8L2Rpdj5gO1xufVxuXG5mdW5jdGlvbiBfcmVuZGVyUmVjZW50c1N0cmlwKHJlY2VudFJvd3MpIHtcbiAgaWYgKCFyZWNlbnRSb3dzLmxlbmd0aCkgcmV0dXJuICcnO1xuICBjb25zdCBpdGVtcyA9IHJlY2VudFJvd3MubWFwKHJvdyA9PiB7XG4gICAgY29uc3QgbGFiZWwgICAgPSBlc2NhcGVIdG1sKHJvdy5uYW1lKTtcbiAgICBjb25zdCBkb3RDbGFzcyA9IHJvdy50eXBlID09PSAnYWN0aXZlJ1xuICAgICAgPyAocm93Lm93bmVyc2hpcC5pc0N1cnJlbnQgPyAnc20tcmVjZW50LWRvdC1jdXJyZW50JyA6ICdzbS1yZWNlbnQtZG90LW90aGVyJylcbiAgICAgIDogJ3NtLXJlY2VudC1kb3Qtc2F2ZWQnO1xuICAgIGNvbnN0IGRvdCA9IGA8c3BhbiBjbGFzcz1cInNtLXJlY2VudC1kb3QgJHtkb3RDbGFzc31cIj48L3NwYW4+YDtcbiAgICBpZiAocm93LnR5cGUgPT09ICdhY3RpdmUnKSB7XG4gICAgICBjb25zdCBocmVmICA9IGAvP3Nlc3Npb249JHtlbmNvZGVVUklDb21wb25lbnQocm93LnNlc3Npb25JZCB8fCAnJyl9YDtcbiAgICAgIGNvbnN0IGV4dHJhID0gcm93Lm93bmVyc2hpcC5pc0N1cnJlbnQgPyAnIHNtLXJlY2VudC1jdXJyZW50JyA6ICcnO1xuICAgICAgcmV0dXJuIGA8YSBjbGFzcz1cInNtLXJlY2VudC1pdGVtJHtleHRyYX1cIiBocmVmPVwiJHtocmVmfVwiPiR7ZG90fSR7bGFiZWx9PC9hPmA7XG4gICAgfVxuICAgIHJldHVybiBgPGJ1dHRvbiBjbGFzcz1cInNtLXJlY2VudC1pdGVtXCIgZGF0YS1zbS1hY3Rpb249XCJsb2FkXCIgZGF0YS1zbS1wYXRoPVwiJHtlc2NhcGVIdG1sKHJvdy5wYXRoIHx8ICcnKX1cIj4ke2RvdH0ke2xhYmVsfTwvYnV0dG9uPmA7XG4gIH0pLmpvaW4oJycpO1xuICByZXR1cm4gYDxkaXYgY2xhc3M9XCJzbS1yZWNlbnRzXCI+PGRpdiBjbGFzcz1cInNtLXJlY2VudHMtbGFiZWxcIj5SZWNlbnQ8L2Rpdj48ZGl2IGNsYXNzPVwic20tcmVjZW50cy1saXN0XCI+JHtpdGVtc308L2Rpdj48L2Rpdj5gO1xufVxuXG5mdW5jdGlvbiBfcmVuZGVyU2Vzc2lvblRhYmxlRnJvbUNhY2hlKCkge1xuICBjb25zdCBib2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Nlc3Npb25zLW1vZGFsLWJvZHknKTtcbiAgaWYgKCFib2R5KSByZXR1cm47XG5cbiAgY29uc3Qgcm93cyAgID0gX25vcm1hbGl6ZVNlc3Npb25zRm9yVGFibGUoX3NtQWN0aXZlQ2FjaGUsIF9zbVNhdmVkQ2FjaGUpO1xuICBjb25zdCBieURhdGUgPSBfc29ydFNlc3Npb25Sb3dzKHJvd3MsICdsYXN0TW9kaWZpZWQnLCAnZGVzYycpO1xuICBjb25zdCBzb3J0ZWQgPSBfc29ydFNlc3Npb25Sb3dzKHJvd3MsIF9zbVNvcnRLZXksIF9zbVNvcnREaXIpO1xuXG4gIGlmIChzb3J0ZWQubGVuZ3RoID09PSAwKSB7XG4gICAgYm9keS5pbm5lckhUTUwgPSAnPHAgY2xhc3M9XCJzZXNzaW9uLXN3aXRjaGVyLWVtcHR5XCIgc3R5bGU9XCJwYWRkaW5nOjI0cHggMTZweDtcIj5ObyBzZXNzaW9ucyBmb3VuZC4gQ3JlYXRlIG9uZSB0byBnZXQgc3RhcnRlZC48L3A+JztcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwYXJ0cyA9IFtcbiAgICBfc21BY3RpdmVDYWNoZS5sZW5ndGggPyBgJHtfc21BY3RpdmVDYWNoZS5sZW5ndGh9IGFjdGl2ZWAgOiAnJyxcbiAgICBfc21TYXZlZENhY2hlLmxlbmd0aCAgPyBgJHtfc21TYXZlZENhY2hlLmxlbmd0aH0gc2F2ZWRgICAgOiAnJyxcbiAgXS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgYm9keS5pbm5lckhUTUwgPVxuICAgIF9yZW5kZXJSZWNlbnRzU3RyaXAoYnlEYXRlLnNsaWNlKDAsIDUpKSArXG4gICAgYDxkaXYgY2xhc3M9XCJzbS10YWJsZS13cmFwXCI+YCArXG4gICAgICBgPGRpdiBjbGFzcz1cInNtLXRhYmxlLWluZm9cIj4ke3BhcnRzLmpvaW4oJyBcXHUwMGI3ICcpfTwvZGl2PmAgK1xuICAgICAgX3JlbmRlclNlc3Npb25UYWJsZUhlYWRlcigpICtcbiAgICAgIGA8ZGl2IGNsYXNzPVwic20tdGJvZHlcIj4ke3NvcnRlZC5tYXAoX3JlbmRlclNlc3Npb25UYWJsZVJvdykuam9pbignJyl9PC9kaXY+YCArXG4gICAgYDwvZGl2PmA7XG59XG5cbmZ1bmN0aW9uIF9oYW5kbGVTZXNzaW9uTW9kYWxDbGljayhlKSB7XG4gIGNvbnN0IHNvcnRCdG4gPSBlLnRhcmdldC5jbG9zZXN0KCdbZGF0YS1zbS1zb3J0XScpO1xuICBpZiAoc29ydEJ0bikgeyBfc2V0U21Tb3J0KHNvcnRCdG4uZGF0YXNldC5zbVNvcnQpOyByZXR1cm47IH1cblxuICBjb25zdCBidG4gPSBlLnRhcmdldC5jbG9zZXN0KCdbZGF0YS1zbS1hY3Rpb25dJyk7XG4gIGlmICghYnRuKSByZXR1cm47XG4gIGNvbnN0IHBhdGggICA9IGJ0bi5kYXRhc2V0LnNtUGF0aDtcbiAgY29uc3QgaWR4ICAgID0gcGFyc2VJbnQoYnRuLmRhdGFzZXQuc21JZHggPz8gJy0xJywgMTApO1xuICBjb25zdCBhY3Rpb24gPSBidG4uZGF0YXNldC5zbUFjdGlvbjtcbiAgaWYgICAgICAoYWN0aW9uID09PSAncmVuYW1lJykgICAgICAgIHN0YXJ0U2Vzc2lvbk1vZGFsUmVuYW1lKHBhdGgsIGlkeCk7XG4gIGVsc2UgaWYgKGFjdGlvbiA9PT0gJ3N1Ym1pdC1yZW5hbWUnKSBzdWJtaXRTZXNzaW9uTW9kYWxSZW5hbWUocGF0aCwgaWR4KTtcbiAgZWxzZSBpZiAoYWN0aW9uID09PSAnY2FuY2VsLXJlbmFtZScpIGNhbmNlbFNlc3Npb25Nb2RhbFJlbmFtZShpZHgpO1xuICBlbHNlIGlmIChhY3Rpb24gPT09ICdlZGl0LXN0YXR1cycpICAgc3RhcnRTZXNzaW9uU3RhdHVzRWRpdChpZHgpO1xuICBlbHNlIGlmIChhY3Rpb24gPT09ICdzdWJtaXQtc3RhdHVzJykgc3VibWl0U2Vzc2lvblN0YXR1c0VkaXQocGF0aCwgaWR4KTtcbiAgZWxzZSBpZiAoYWN0aW9uID09PSAnY2FuY2VsLXN0YXR1cycpIGNhbmNlbFNlc3Npb25TdGF0dXNFZGl0KGlkeCk7XG4gIGVsc2UgaWYgKGFjdGlvbiA9PT0gJ2VkaXQtbm90ZXMnKSAgICBzdGFydFNlc3Npb25Ob3Rlc0VkaXQoaWR4KTtcbiAgZWxzZSBpZiAoYWN0aW9uID09PSAnc3VibWl0LW5vdGVzJykgIHN1Ym1pdFNlc3Npb25Ob3Rlc0VkaXQocGF0aCwgaWR4KTtcbiAgZWxzZSBpZiAoYWN0aW9uID09PSAnY2FuY2VsLW5vdGVzJykgIGNhbmNlbFNlc3Npb25Ob3Rlc0VkaXQoaWR4KTtcbiAgZWxzZSBpZiAoYWN0aW9uID09PSAnbG9hZCcpICAgICAgICAgIGxvYWRTZXNzaW9uQW5kQ2xvc2VNb2RhbChwYXRoKTtcbiAgZWxzZSBpZiAoYWN0aW9uID09PSAnZHVwbGljYXRlJykgICAgIF9kdXBsaWNhdGVTZXNzaW9uRnJvbU1vZGFsKHBhdGgpO1xuICBlbHNlIGlmIChhY3Rpb24gPT09ICdkZWxldGUnKSAgICAgICAgX2RlbGV0ZVNlc3Npb25Gcm9tTW9kYWwocGF0aCwgZSk7XG59XG5cbmZ1bmN0aW9uIF9oYW5kbGVTZXNzaW9uTW9kYWxLZXlkb3duKGUpIHtcbiAgaWYgKChlLmtleSA9PT0gJ0VudGVyJyB8fCBlLmtleSA9PT0gJyAnKSAmJiBlLnRhcmdldC5jbG9zZXN0KCdbZGF0YS1zbS1zb3J0XScpKSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIF9zZXRTbVNvcnQoZS50YXJnZXQuY2xvc2VzdCgnW2RhdGEtc20tc29ydF0nKS5kYXRhc2V0LnNtU29ydCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGlucHV0ID0gZS50YXJnZXQuY2xvc2VzdCgnLnNtLWtleS1pbnB1dCcpO1xuICBpZiAoIWlucHV0KSByZXR1cm47XG4gIGNvbnN0IHBhdGggPSBpbnB1dC5kYXRhc2V0LnNtUGF0aDtcbiAgY29uc3QgaWR4ICA9IHBhcnNlSW50KGlucHV0LmRhdGFzZXQuc21JZHgsIDEwKTtcbiAgaWYgICAgICAoZS5rZXkgPT09ICdFbnRlcicpICBzdWJtaXRTZXNzaW9uTW9kYWxSZW5hbWUocGF0aCwgaWR4KTtcbiAgZWxzZSBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSBjYW5jZWxTZXNzaW9uTW9kYWxSZW5hbWUoaWR4KTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFNlc3Npb25zIG1vZGFsIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5hc3luYyBmdW5jdGlvbiBvcGVuU2Vzc2lvbnNNb2RhbCh7IHJlcXVpcmVkID0gZmFsc2UgfSA9IHt9KSB7XG4gIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2Vzc2lvbnMtbW9kYWwtb3ZlcmxheScpO1xuICBpZiAoIW92ZXJsYXkpIHJldHVybjtcbiAgb3ZlcmxheS5kYXRhc2V0LmRpc21pc3NEaXNhYmxlZCA9IHJlcXVpcmVkID8gJzEnIDogJyc7XG4gIGNvbnN0IGNsb3NlWCAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Nlc3Npb25zLW1vZGFsLWNsb3NlLXgnKTtcbiAgY29uc3QgY2xvc2VGb290ZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2Vzc2lvbnMtbW9kYWwtY2xvc2UtZm9vdGVyJyk7XG4gIGlmIChjbG9zZVgpICAgICAgY2xvc2VYLnN0eWxlLmRpc3BsYXkgICAgICA9IHJlcXVpcmVkID8gJ25vbmUnIDogJyc7XG4gIGlmIChjbG9zZUZvb3RlcikgY2xvc2VGb290ZXIuc3R5bGUuZGlzcGxheSA9IHJlcXVpcmVkID8gJ25vbmUnIDogJyc7XG4gIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgd2luZG93Ll9mb2N1c2VkRWxlbWVudEJlZm9yZU1vZGFsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgYXdhaXQgX3JlbmRlclNlc3Npb25zTW9kYWxCb2R5KCk7XG4gIF9yZWZyZXNoVHJhc2hCYWRnZSgpO1xuICB0cmFwRm9jdXMoJ3Nlc3Npb25zLW1vZGFsLW92ZXJsYXknKTtcbiAgc2V0SW5pdGlhbEZvY3VzKCdzZXNzaW9ucy1tb2RhbC1vdmVybGF5Jyk7XG59XG5cbmZ1bmN0aW9uIGNsb3NlU2Vzc2lvbnNNb2RhbCgpIHtcbiAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXNzaW9ucy1tb2RhbC1vdmVybGF5Jyk7XG4gIGlmICghb3ZlcmxheSkgcmV0dXJuO1xuICBpZiAob3ZlcmxheS5kYXRhc2V0LmRpc21pc3NEaXNhYmxlZCA9PT0gJzEnKSByZXR1cm47XG4gIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgcmVzdG9yZUZvY3VzKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9yZW5kZXJTZXNzaW9uc01vZGFsQm9keSgpIHtcbiAgY29uc3QgYm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXNzaW9ucy1tb2RhbC1ib2R5Jyk7XG4gIGlmICghYm9keSkgcmV0dXJuO1xuICBib2R5LmlubmVySFRNTCA9ICc8ZGl2IHN0eWxlPVwicGFkZGluZzoyNHB4O2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjtnYXA6MTBweDtjb2xvcjojNmI3MjgwO1wiPjxzcGFuIGNsYXNzPVwibG9hZGluZy1zcGlubmVyXCI+PC9zcGFuPiBMb2FkaW5nIHNlc3Npb25zXFx1MjAyNjwvZGl2Pic7XG4gIHRyeSB7XG4gICAgY29uc3QgW2FjdGl2ZVJlcywgc2F2ZWRSZXNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgZmV0Y2goJy9hcGkvc2Vzc2lvbnMvYWN0aXZlJyksXG4gICAgICBmZXRjaCgnL2FwaS9zZXNzaW9ucycpLFxuICAgIF0pO1xuICAgIF9zbUFjdGl2ZUNhY2hlID0gYWN0aXZlUmVzLm9rID8gKChhd2FpdCBhY3RpdmVSZXMuanNvbigpKS5zZXNzaW9ucyB8fCBbXSkgOiBbXTtcbiAgICBjb25zdCBzYXZlZERhdGEgPSBzYXZlZFJlcy5vayA/IHBhcnNlU2Vzc2lvbkxpc3RSZXNwb25zZShhd2FpdCBzYXZlZFJlcy5qc29uKCkpIDogeyBzZXNzaW9uczogW10gfTtcbiAgICBfc21TYXZlZENhY2hlICAgPSBzYXZlZERhdGEuc2Vzc2lvbnMgfHwgW107XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBib2R5LmlubmVySFRNTCA9IGA8cCBzdHlsZT1cInBhZGRpbmc6MjBweDtjb2xvcjojZWY0NDQ0O1wiPkNvdWxkIG5vdCBsb2FkIHNlc3Npb25zOiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX08L3A+YDtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gV2lyZSBldmVudCBkZWxlZ2F0aW9uIG9uY2U7IHBlcnNpc3RzIGFjcm9zcyByZS1yZW5kZXJzIHNpbmNlIGJvZHkgZWxlbWVudCBpcyBzdGFibGVcbiAgaWYgKCFib2R5Ll9zbUxpc3RlbmVyQXR0YWNoZWQpIHtcbiAgICBib2R5Ll9zbUxpc3RlbmVyQXR0YWNoZWQgPSB0cnVlO1xuICAgIGJvZHkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAgIF9oYW5kbGVTZXNzaW9uTW9kYWxDbGljayk7XG4gICAgYm9keS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgX2hhbmRsZVNlc3Npb25Nb2RhbEtleWRvd24pO1xuICB9XG4gIF9yZW5kZXJTZXNzaW9uVGFibGVGcm9tQ2FjaGUoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9hZFNlc3Npb25BbmRDbG9zZU1vZGFsKHBhdGgpIHtcbiAgLy8gQ2xlYXIgZGlzbWlzc0Rpc2FibGVkIHNvIGxvYWRpbmcgYSBzZXNzaW9uIGFsd2F5cyBjbG9zZXMgdGhlIG1vZGFsLFxuICAvLyBldmVuIHdoZW4gaXQgd2FzIG9wZW5lZCBpbiByZXF1aXJlZCAoc3RhcnR1cCkgbW9kZS5cbiAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXNzaW9ucy1tb2RhbC1vdmVybGF5Jyk7XG4gIGlmIChvdmVybGF5KSBvdmVybGF5LmRhdGFzZXQuZGlzbWlzc0Rpc2FibGVkID0gJyc7XG4gIGNsb3NlU2Vzc2lvbnNNb2RhbCgpO1xuICBhd2FpdCBsb2FkU2Vzc2lvbkZpbGUocGF0aCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG5ld1Nlc3Npb25Gcm9tTW9kYWwoKSB7XG4gIGNsb3NlU2Vzc2lvbnNNb2RhbCgpO1xuICBhd2FpdCBjcmVhdGVOZXdTZXNzaW9uQW5kTmF2aWdhdGUoKTtcbn1cblxuZnVuY3Rpb24gc3RhcnRTZXNzaW9uTW9kYWxSZW5hbWUocGF0aCwgaWR4KSB7XG4gIGNvbnN0IG5hbWVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzbS1uYW1lLSR7aWR4fWApO1xuICBjb25zdCBmb3JtICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc20tcmVuYW1lLSR7aWR4fWApO1xuICBpZiAobmFtZUVsKSBuYW1lRWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgaWYgKGZvcm0pICAgZm9ybS5zdHlsZS5kaXNwbGF5ICAgPSAnZmxleCc7XG4gIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNtLWlucHV0LSR7aWR4fWApO1xuICBpZiAoaW5wdXQpIHsgaW5wdXQuZm9jdXMoKTsgaW5wdXQuc2VsZWN0KCk7IH1cbn1cblxuZnVuY3Rpb24gY2FuY2VsU2Vzc2lvbk1vZGFsUmVuYW1lKGlkeCkge1xuICBjb25zdCBuYW1lRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc20tbmFtZS0ke2lkeH1gKTtcbiAgY29uc3QgZm9ybSAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNtLXJlbmFtZS0ke2lkeH1gKTtcbiAgaWYgKGZvcm0pICAgZm9ybS5zdHlsZS5kaXNwbGF5ICAgPSAnbm9uZSc7XG4gIGlmIChuYW1lRWwpIG5hbWVFbC5zdHlsZS5kaXNwbGF5ID0gJyc7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN1Ym1pdFNlc3Npb25Nb2RhbFJlbmFtZShwYXRoLCBpZHgpIHtcbiAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc20taW5wdXQtJHtpZHh9YCk7XG4gIGlmICghaW5wdXQpIHJldHVybjtcbiAgY29uc3QgbmV3TmFtZSA9IGlucHV0LnZhbHVlLnRyaW0oKTtcbiAgaWYgKCFuZXdOYW1lKSByZXR1cm47XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL3JlbmFtZS1zZXNzaW9uJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBwYXRoLCBuZXdfbmFtZTogbmV3TmFtZSB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgY29uc3QgbmFtZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNtLW5hbWUtJHtpZHh9YCk7XG4gICAgICBpZiAobmFtZUVsKSBuYW1lRWwudGV4dENvbnRlbnQgPSBuZXdOYW1lO1xuICAgICAgY2FuY2VsU2Vzc2lvbk1vZGFsUmVuYW1lKGlkeCk7XG4gICAgICBhd2FpdCBmZXRjaFN0YXR1cygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHlwZW9mIHNob3dUb2FzdCA9PT0gJ2Z1bmN0aW9uJykgc2hvd1RvYXN0KGBSZW5hbWUgZmFpbGVkOiAke2RhdGEuZXJyb3J9YCwgJ2Vycm9yJyk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7IGlmICh0eXBlb2Ygc2hvd1RvYXN0ID09PSAnZnVuY3Rpb24nKSBzaG93VG9hc3QoYFJlbmFtZSBlcnJvcjogJHtlLm1lc3NhZ2V9YCwgJ2Vycm9yJyk7IH1cbn1cblxuZnVuY3Rpb24gc3RhcnRTZXNzaW9uU3RhdHVzRWRpdChpZHgpIHtcbiAgY29uc3QgcGhhc2VFbCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc20tcGhhc2UtJHtpZHh9YCk7XG4gIGNvbnN0IGVkaXRXaWRnZXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc20tc3RhdHVzLWVkaXQtJHtpZHh9YCk7XG4gIGlmIChwaGFzZUVsKSAgICBwaGFzZUVsLnN0eWxlLmRpc3BsYXkgICAgPSAnbm9uZSc7XG4gIGlmIChlZGl0V2lkZ2V0KSBlZGl0V2lkZ2V0LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIGNvbnN0IHNlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzbS1zdGF0dXMtc2VsLSR7aWR4fWApO1xuICBpZiAoc2VsKSBzZWwuZm9jdXMoKTtcbn1cblxuZnVuY3Rpb24gY2FuY2VsU2Vzc2lvblN0YXR1c0VkaXQoaWR4KSB7XG4gIGNvbnN0IHBoYXNlRWwgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc20tcGhhc2UtJHtpZHh9YCk7XG4gIGNvbnN0IGVkaXRXaWRnZXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc20tc3RhdHVzLWVkaXQtJHtpZHh9YCk7XG4gIGlmIChlZGl0V2lkZ2V0KSBlZGl0V2lkZ2V0LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIGlmIChwaGFzZUVsKSAgICBwaGFzZUVsLnN0eWxlLmRpc3BsYXkgICAgPSAnJztcbn1cblxuYXN5bmMgZnVuY3Rpb24gc3VibWl0U2Vzc2lvblN0YXR1c0VkaXQocGF0aCwgaWR4KSB7XG4gIGNvbnN0IHNlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzbS1zdGF0dXMtc2VsLSR7aWR4fWApO1xuICBpZiAoIXNlbCkgcmV0dXJuO1xuICBjb25zdCBuZXdTdGF0dXMgPSBzZWwudmFsdWU7XG4gIGNvbnN0IF9hcHBTdGF0dXNMYWJlbHMgPSB7XG4gICAgZHJhZnQ6ICdEcmFmdCcsIHJlYWR5OiAnUmVhZHknLCBzZW50OiAnU2VudCcsIHF1ZXVlZDogJ1F1ZXVlZCcsXG4gICAgaW50ZXJ2aWV3OiAnSW50ZXJ2aWV3JywgcmVqZWN0ZWQ6ICdSZWplY3RlZCcsIGFjY2VwdGVkOiAnQWNjZXB0ZWQnLFxuICAgIHBhcmtlZDogJ1BhcmtlZCcsXG4gIH07XG4gIGNvbnN0IF9hcHBTdGF0dXNDb2xvcnMgPSB7XG4gICAgZHJhZnQ6ICcjOTRhM2I4JywgcmVhZHk6ICcjM2I4MmY2Jywgc2VudDogJyMyMmM1NWUnLCBxdWV1ZWQ6ICcjZWFiMzA4JyxcbiAgICBpbnRlcnZpZXc6ICcjYTg1NWY3JywgcmVqZWN0ZWQ6ICcjZWY0NDQ0JywgYWNjZXB0ZWQ6ICcjMDU5NjY5JyxcbiAgICBwYXJrZWQ6ICcjZjk3MzE2JyxcbiAgfTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvc2Vzc2lvbnMvbWV0YWRhdGEnLCB7XG4gICAgICBtZXRob2Q6ICdQQVRDSCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBwYXRoLCBhcHBsaWNhdGlvbl9zdGF0dXM6IG5ld1N0YXR1cyB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoZGF0YS5vaykge1xuICAgICAgY29uc3QgYmFkZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc20tc3RhdHVzLWJhZGdlLSR7aWR4fWApO1xuICAgICAgaWYgKGJhZGdlKSB7XG4gICAgICAgIGlmIChuZXdTdGF0dXMgJiYgX2FwcFN0YXR1c0xhYmVsc1tuZXdTdGF0dXNdKSB7XG4gICAgICAgICAgYmFkZ2UudGV4dENvbnRlbnQgPSBfYXBwU3RhdHVzTGFiZWxzW25ld1N0YXR1c107XG4gICAgICAgICAgYmFkZ2Uuc3R5bGUuY3NzVGV4dCA9IGBmb250LXNpemU6MC43NWVtO3BhZGRpbmc6MXB4IDZweDtib3JkZXItcmFkaXVzOjlweDtiYWNrZ3JvdW5kOiR7X2FwcFN0YXR1c0NvbG9yc1tuZXdTdGF0dXNdfTtjb2xvcjojZmZmO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtgO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJhZGdlLnRleHRDb250ZW50ID0gJyc7XG4gICAgICAgICAgYmFkZ2Uuc3R5bGUuY3NzVGV4dCA9ICcnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjYW5jZWxTZXNzaW9uU3RhdHVzRWRpdChpZHgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHlwZW9mIHNob3dUb2FzdCA9PT0gJ2Z1bmN0aW9uJykgc2hvd1RvYXN0KGBTdGF0dXMgdXBkYXRlIGZhaWxlZDogJHtkYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yJ31gLCAnZXJyb3InKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAodHlwZW9mIHNob3dUb2FzdCA9PT0gJ2Z1bmN0aW9uJykgc2hvd1RvYXN0KGBTdGF0dXMgdXBkYXRlIGVycm9yOiAke2UubWVzc2FnZX1gLCAnZXJyb3InKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzdGFydFNlc3Npb25Ob3Rlc0VkaXQoaWR4KSB7XG4gIGNvbnN0IGVkaXRXaWRnZXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc20tbm90ZXMtZWRpdC0ke2lkeH1gKTtcbiAgY29uc3QgcHJldmlldyAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzbS1ub3Rlcy1wcmV2aWV3LSR7aWR4fWApO1xuICBpZiAocHJldmlldykgICAgcHJldmlldy5zdHlsZS5kaXNwbGF5ICAgID0gJ25vbmUnO1xuICBpZiAoZWRpdFdpZGdldCkgZWRpdFdpZGdldC5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICBjb25zdCB0YSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzbS1ub3Rlcy10YS0ke2lkeH1gKTtcbiAgaWYgKHRhKSB7IHRhLmZvY3VzKCk7IHRhLnNlbGVjdGlvblN0YXJ0ID0gdGEuc2VsZWN0aW9uRW5kID0gdGEudmFsdWUubGVuZ3RoOyB9XG59XG5cbmZ1bmN0aW9uIGNhbmNlbFNlc3Npb25Ob3Rlc0VkaXQoaWR4KSB7XG4gIGNvbnN0IGVkaXRXaWRnZXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc20tbm90ZXMtZWRpdC0ke2lkeH1gKTtcbiAgY29uc3QgcHJldmlldyAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzbS1ub3Rlcy1wcmV2aWV3LSR7aWR4fWApO1xuICBpZiAoZWRpdFdpZGdldCkgZWRpdFdpZGdldC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBpZiAocHJldmlldykgICAgcHJldmlldy5zdHlsZS5kaXNwbGF5ICAgID0gJyc7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN1Ym1pdFNlc3Npb25Ob3Rlc0VkaXQocGF0aCwgaWR4KSB7XG4gIGNvbnN0IHRhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNtLW5vdGVzLXRhLSR7aWR4fWApO1xuICBpZiAoIXRhKSByZXR1cm47XG4gIGNvbnN0IG5ld05vdGVzID0gdGEudmFsdWU7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL3Nlc3Npb25zL21ldGFkYXRhJywge1xuICAgICAgbWV0aG9kOiAnUEFUQ0gnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcGF0aCwgbm90ZXM6IG5ld05vdGVzIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLm9rKSB7XG4gICAgICBjb25zdCBwcmV2aWV3ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNtLW5vdGVzLXByZXZpZXctJHtpZHh9YCk7XG4gICAgICBpZiAocHJldmlldykge1xuICAgICAgICBwcmV2aWV3LnRleHRDb250ZW50ID0gbmV3Tm90ZXM7XG4gICAgICAgIHByZXZpZXcudGl0bGUgICAgICAgPSBuZXdOb3RlcztcbiAgICAgICAgcHJldmlldy5zdHlsZS5kaXNwbGF5ID0gbmV3Tm90ZXMgPyAnJyA6ICdub25lJztcbiAgICAgIH1cbiAgICAgIGNhbmNlbFNlc3Npb25Ob3Rlc0VkaXQoaWR4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHNob3dUb2FzdChgTm90ZXMgdXBkYXRlIGZhaWxlZDogJHtkYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yJ31gLCAnZXJyb3InKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAodHlwZW9mIHNob3dUb2FzdCA9PT0gJ2Z1bmN0aW9uJykgc2hvd1RvYXN0KGBOb3RlcyB1cGRhdGUgZXJyb3I6ICR7ZS5tZXNzYWdlfWAsICdlcnJvcicpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9kZWxldGVTZXNzaW9uRnJvbU1vZGFsKHBhdGgsIGV2ZW50KSB7XG4gIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICBpZiAodHlwZW9mIGNvbmZpcm1EaWFsb2cgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25zdCBvayA9IGF3YWl0IGNvbmZpcm1EaWFsb2coJ01vdmUgdGhpcyBzZXNzaW9uIHRvIFRyYXNoPyBZb3UgY2FuIHJlc3RvcmUgaXQgZnJvbSB0aGUgVHJhc2ggdmlldy4nKTtcbiAgICBpZiAoIW9rKSByZXR1cm47XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goJy9hcGkvZGVsZXRlLXNlc3Npb24nLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHBhdGggfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgYXdhaXQgX3JlbmRlclNlc3Npb25zTW9kYWxCb2R5KCk7XG4gICAgICBhd2FpdCBfcmVmcmVzaFRyYXNoQmFkZ2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHNob3dUb2FzdChgRmFpbGVkIHRvIG1vdmUgc2Vzc2lvbiB0byBUcmFzaDogJHtkYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yJ31gLCAnZXJyb3InKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHsgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHNob3dUb2FzdChgRXJyb3I6ICR7ZS5tZXNzYWdlfWAsICdlcnJvcicpOyB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBEdXBsaWNhdGUgc2Vzc2lvbiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuYXN5bmMgZnVuY3Rpb24gX2R1cGxpY2F0ZVNlc3Npb25Gcm9tTW9kYWwocGF0aCkge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS9zZXNzaW9ucy9kdXBsaWNhdGUnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHBhdGggfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEub2spIHtcbiAgICAgIGF3YWl0IF9yZW5kZXJTZXNzaW9uc01vZGFsQm9keSgpO1xuICAgICAgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHNob3dUb2FzdChgU2Vzc2lvbiBkdXBsaWNhdGVkOiBcIiR7ZGF0YS5uZXdfbmFtZX1cImApO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHlwZW9mIHNob3dUb2FzdCA9PT0gJ2Z1bmN0aW9uJykgc2hvd1RvYXN0KGBGYWlsZWQgdG8gZHVwbGljYXRlIHNlc3Npb246ICR7ZGF0YS5lcnJvciB8fCAnVW5rbm93biBlcnJvcid9YCwgJ2Vycm9yJyk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7IGlmICh0eXBlb2Ygc2hvd1RvYXN0ID09PSAnZnVuY3Rpb24nKSBzaG93VG9hc3QoYEVycm9yOiAke2UubWVzc2FnZX1gLCAnZXJyb3InKTsgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgVHJhc2ggYmFkZ2UgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIF9yZWZyZXNoVHJhc2hCYWRnZSgpIHtcbiAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Nlc3Npb25zLXRyYXNoLWJ0bicpO1xuICBpZiAoIWJ0bikgcmV0dXJuO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS90cmFzaCcpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGNvbnN0IG4gPSAoZGF0YS5pdGVtcyB8fCBbXSkubGVuZ3RoO1xuICAgIGJ0bi50ZXh0Q29udGVudCA9IG4gPiAwID8gYFx1RDgzRFx1REREMSBUcmFzaCAoJHtufSlgIDogJ1x1RDgzRFx1REREMSBUcmFzaCc7XG4gIH0gY2F0Y2ggKF8pIHsgLyogaWdub3JlICovIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIFRyYXNoIHZpZXcgKGlubGluZSBpbiBzZXNzaW9ucyBtb2RhbCkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmFzeW5jIGZ1bmN0aW9uIG9wZW5UcmFzaFZpZXcoKSB7XG4gIGNvbnN0IGJvZHkgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXNzaW9ucy1tb2RhbC1ib2R5Jyk7XG4gIGNvbnN0IGZvb3RlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzZXNzaW9ucy1tb2RhbC1vdmVybGF5IC5tb2RhbC1mb290ZXInKTtcbiAgaWYgKCFib2R5KSByZXR1cm47XG5cbiAgYm9keS5pbm5lckhUTUwgPSAnPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjEycHg7cGFkZGluZzoyNHB4O2NvbG9yOiM2YjcyODA7XCI+PGRpdiBjbGFzcz1cImxvYWRpbmctc3Bpbm5lclwiIHN0eWxlPVwid2lkdGg6MjBweDtoZWlnaHQ6MjBweDtib3JkZXItd2lkdGg6MnB4O2ZsZXgtc2hyaW5rOjA7XCI+PC9kaXY+PHNwYW4+TG9hZGluZyB0cmFzaFx1MjAyNjwvc3Bhbj48L2Rpdj4nO1xuXG4gIGlmIChmb290ZXIpIHtcbiAgICBmb290ZXIuaW5uZXJIVE1MID0gYFxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwiZW1wdHlUcmFzaCgpXCJcbiAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZWUyZTI7Y29sb3I6I2RjMjYyNjtib3JkZXItY29sb3I6I2ZlY2FjYTtcIj5FbXB0eSBUcmFzaDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwiY2xvc2VUcmFzaFZpZXcoKVwiPlx1MjE5MCBCYWNrPC9idXR0b24+YDtcbiAgfVxuXG4gIGF3YWl0IF9yZW5kZXJUcmFzaFZpZXcoKTtcbn1cblxuZnVuY3Rpb24gY2xvc2VUcmFzaFZpZXcoKSB7XG4gIGNvbnN0IGZvb3RlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzZXNzaW9ucy1tb2RhbC1vdmVybGF5IC5tb2RhbC1mb290ZXInKTtcbiAgaWYgKGZvb3Rlcikge1xuICAgIGZvb3Rlci5pbm5lckhUTUwgPSBgXG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0blwiIG9uY2xpY2s9XCJuZXdTZXNzaW9uRnJvbU1vZGFsKClcIlxuICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6IzEwYjk4MTtjb2xvcjojZmZmO2JvcmRlci1jb2xvcjojMTBiOTgxO1wiPlx1RkYwQiBOZXcgU2Vzc2lvbjwvYnV0dG9uPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6OHB4O2FsaWduLWl0ZW1zOmNlbnRlcjtcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInNlc3Npb25zLXRyYXNoLWJ0blwiIGNsYXNzPVwiYWN0aW9uLWJ0blwiXG4gICAgICAgICAgb25jbGljaz1cIm9wZW5UcmFzaFZpZXcoKVwiXG4gICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmMWY1Zjk7Y29sb3I6IzY0NzQ4Yjtib3JkZXItY29sb3I6I2UyZThmMDtcIj5cdUQ4M0RcdURERDEgVHJhc2g8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiBvbmNsaWNrPVwiY2xvc2VTZXNzaW9uc01vZGFsKClcIj5DbG9zZTwvYnV0dG9uPlxuICAgICAgPC9kaXY+YDtcbiAgfVxuICBfcmVuZGVyU2Vzc2lvbnNNb2RhbEJvZHkoKTtcbiAgX3JlZnJlc2hUcmFzaEJhZGdlKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9yZW5kZXJUcmFzaFZpZXcoKSB7XG4gIGNvbnN0IGJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2Vzc2lvbnMtbW9kYWwtYm9keScpO1xuICBpZiAoIWJvZHkpIHJldHVybjtcbiAgbGV0IGl0ZW1zID0gW107XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKCcvYXBpL3RyYXNoJyk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaXRlbXMgPSBkYXRhLml0ZW1zIHx8IFtdO1xuICB9IGNhdGNoIChlKSB7XG4gICAgYm9keS5pbm5lckhUTUwgPSBgPHAgc3R5bGU9XCJwYWRkaW5nOjIwcHg7Y29sb3I6I2VmNDQ0NDtcIj5Db3VsZCBub3QgbG9hZCB0cmFzaDogJHtlc2NhcGVIdG1sKGUubWVzc2FnZSl9PC9wPmA7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChpdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICBib2R5LmlubmVySFRNTCA9ICc8cCBzdHlsZT1cInBhZGRpbmc6MjRweDt0ZXh0LWFsaWduOmNlbnRlcjtjb2xvcjojNmI3MjgwO1wiPlRyYXNoIGlzIGVtcHR5LjwvcD4nO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZtdERhdGUodHMpIHtcbiAgICBpZiAoIXRzKSByZXR1cm4gJyc7XG4gICAgdHJ5IHsgcmV0dXJuIG5ldyBEYXRlKHRzKS50b0xvY2FsZURhdGVTdHJpbmcoJ2VuLVVTJywgeyBtb250aDogJ3Nob3J0JywgZGF5OiAnbnVtZXJpYycsIHllYXI6ICdudW1lcmljJyB9KTsgfVxuICAgIGNhdGNoIHsgcmV0dXJuIHRzLnNsaWNlKDAsIDEwKTsgfVxuICB9XG5cbiAgbGV0IGh0bWwgPSAnPHRhYmxlIHN0eWxlPVwid2lkdGg6MTAwJTtib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7XCI+JztcbiAgaXRlbXMuZm9yRWFjaChzID0+IHtcbiAgICBjb25zdCBlcCA9IGVzY2FwZUh0bWwocy5wYXRoKTtcbiAgICBodG1sICs9IGBcbiAgICAgIDx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206MXB4IHNvbGlkICNmMWY1Zjk7dmVydGljYWwtYWxpZ246dG9wO1wiPlxuICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOjEycHggMTZweDtcIj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6NjAwO2NvbG9yOiMxZTI5M2I7XCI+JHtlc2NhcGVIdG1sKHMucG9zaXRpb25fbmFtZSB8fCAnVW50aXRsZWQnKX08L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjEycHg7Y29sb3I6Izk0YTNiODttYXJnaW4tdG9wOjJweDtcIj4ke2ZtdERhdGUocy50aW1lc3RhbXApfSR7cy5waGFzZSA/ICcgXHUwMEI3ICcgKyBlc2NhcGVIdG1sKHMucGhhc2UpIDogJyd9PC9kaXY+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cInBhZGRpbmc6MTJweCAxNnB4O3doaXRlLXNwYWNlOm5vd3JhcDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7XCI+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6NnB4O1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLXRyYXNoLWFjdGlvbj1cInJlc3RvcmVcIiBkYXRhLXRyYXNoLXBhdGg9XCIke2VwfVwiXG4gICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDojZGJlYWZlO2NvbG9yOiMxZDRlZDg7Ym9yZGVyOjFweCBzb2xpZCAjYmZkYmZlO2JvcmRlci1yYWRpdXM6NnB4O3BhZGRpbmc6NnB4IDEycHg7Zm9udC1zaXplOjEzcHg7Zm9udC13ZWlnaHQ6NjAwO2N1cnNvcjpwb2ludGVyO1wiPlJlc3RvcmU8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gZGF0YS10cmFzaC1hY3Rpb249XCJkZWxldGUtZm9yZXZlclwiIGRhdGEtdHJhc2gtcGF0aD1cIiR7ZXB9XCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmZWUyZTI7Y29sb3I6I2RjMjYyNjtib3JkZXI6MXB4IHNvbGlkICNmZWNhY2E7Ym9yZGVyLXJhZGl1czo2cHg7cGFkZGluZzo2cHggOHB4O2ZvbnQtc2l6ZToxM3B4O2N1cnNvcjpwb2ludGVyO1wiIHRpdGxlPVwiRGVsZXRlIHBlcm1hbmVudGx5XCIgYXJpYS1sYWJlbD1cIkRlbGV0ZSBwZXJtYW5lbnRseVwiPlx1MjcxNTwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3RkPlxuICAgICAgPC90cj5gO1xuICB9KTtcbiAgaHRtbCArPSAnPC90YWJsZT4nO1xuICBjb25zdCB0cmFzaFdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgdHJhc2hXcmFwcGVyLmlubmVySFRNTCA9IGh0bWw7XG4gIGJvZHkuaW5uZXJIVE1MID0gJyc7XG4gIGJvZHkuYXBwZW5kQ2hpbGQodHJhc2hXcmFwcGVyKTtcbiAgLy8gV2lyZSB1cCB0cmFzaCBhY3Rpb24gYnV0dG9ucyB2aWEgZXZlbnQgZGVsZWdhdGlvblxuICB0cmFzaFdyYXBwZXIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBlID0+IHtcbiAgICBjb25zdCBidG4gPSBlLnRhcmdldC5jbG9zZXN0KCdbZGF0YS10cmFzaC1hY3Rpb25dJyk7XG4gICAgaWYgKCFidG4pIHJldHVybjtcbiAgICBjb25zdCBwYXRoICAgPSBidG4uZGF0YXNldC50cmFzaFBhdGg7XG4gICAgY29uc3QgYWN0aW9uID0gYnRuLmRhdGFzZXQudHJhc2hBY3Rpb247XG4gICAgaWYgICAgICAoYWN0aW9uID09PSAncmVzdG9yZScpICAgICAgICByZXN0b3JlRnJvbVRyYXNoKHBhdGgpO1xuICAgIGVsc2UgaWYgKGFjdGlvbiA9PT0gJ2RlbGV0ZS1mb3JldmVyJykgZGVsZXRlRm9yZXZlcihwYXRoKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc3RvcmVGcm9tVHJhc2gocGF0aCkge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS90cmFzaC9yZXN0b3JlJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBwYXRoIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHsgYXdhaXQgX3JlbmRlclRyYXNoVmlldygpOyBhd2FpdCBfcmVmcmVzaFRyYXNoQmFkZ2UoKTsgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHNob3dUb2FzdChgUmVzdG9yZSBmYWlsZWQ6ICR7ZGF0YS5lcnJvciB8fCAnVW5rbm93biBlcnJvcid9YCwgJ2Vycm9yJyk7XG4gIH0gY2F0Y2ggKGUpIHsgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHNob3dUb2FzdChgRXJyb3I6ICR7ZS5tZXNzYWdlfWAsICdlcnJvcicpOyB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUZvcmV2ZXIocGF0aCkge1xuICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCBjb25maXJtRGlhbG9nKFxuICAgICdQZXJtYW5lbnRseSBkZWxldGUgdGhpcyBzZXNzaW9uPyBUaGlzIGNhbm5vdCBiZSB1bmRvbmUuJyxcbiAgICB7IGNvbmZpcm1MYWJlbDogJ0RlbGV0ZSBGb3JldmVyJywgY2FuY2VsTGFiZWw6ICdDYW5jZWwnLCBkYW5nZXI6IHRydWUgfVxuICApO1xuICBpZiAoIWNvbmZpcm1lZCkgcmV0dXJuO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS90cmFzaC9kZWxldGUnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHBhdGggfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEuc3VjY2VzcykgeyBhd2FpdCBfcmVuZGVyVHJhc2hWaWV3KCk7IGF3YWl0IF9yZWZyZXNoVHJhc2hCYWRnZSgpOyB9XG4gICAgZWxzZSBpZiAodHlwZW9mIHNob3dUb2FzdCA9PT0gJ2Z1bmN0aW9uJykgc2hvd1RvYXN0KGBEZWxldGUgZmFpbGVkOiAke2RhdGEuZXJyb3IgfHwgJ1Vua25vd24gZXJyb3InfWAsICdlcnJvcicpO1xuICB9IGNhdGNoIChlKSB7IGlmICh0eXBlb2Ygc2hvd1RvYXN0ID09PSAnZnVuY3Rpb24nKSBzaG93VG9hc3QoYEVycm9yOiAke2UubWVzc2FnZX1gLCAnZXJyb3InKTsgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBlbXB0eVRyYXNoKCkge1xuICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCBjb25maXJtRGlhbG9nKFxuICAgICdQZXJtYW5lbnRseSBkZWxldGUgYWxsIGl0ZW1zIGluIFRyYXNoPyBUaGlzIGNhbm5vdCBiZSB1bmRvbmUuJyxcbiAgICB7IGNvbmZpcm1MYWJlbDogJ0VtcHR5IFRyYXNoJywgY2FuY2VsTGFiZWw6ICdDYW5jZWwnLCBkYW5nZXI6IHRydWUgfVxuICApO1xuICBpZiAoIWNvbmZpcm1lZCkgcmV0dXJuO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyAgPSBhd2FpdCBmZXRjaCgnL2FwaS90cmFzaC9lbXB0eScsIHsgbWV0aG9kOiAnUE9TVCcgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKGRhdGEuc3VjY2VzcykgeyBhd2FpdCBfcmVuZGVyVHJhc2hWaWV3KCk7IGF3YWl0IF9yZWZyZXNoVHJhc2hCYWRnZSgpOyB9XG4gICAgZWxzZSBpZiAodHlwZW9mIHNob3dUb2FzdCA9PT0gJ2Z1bmN0aW9uJykgc2hvd1RvYXN0KGBGYWlsZWQgdG8gZW1wdHkgdHJhc2g6ICR7ZGF0YS5lcnJvciB8fCAnVW5rbm93biBlcnJvcid9YCwgJ2Vycm9yJyk7XG4gIH0gY2F0Y2ggKGUpIHsgaWYgKHR5cGVvZiBzaG93VG9hc3QgPT09ICdmdW5jdGlvbicpIHNob3dUb2FzdChgRXJyb3I6ICR7ZS5tZXNzYWdlfWAsICdlcnJvcicpOyB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFeHBvcnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5leHBvcnQge1xuICBfcmVuZGVyQWN0aXZlU2Vzc2lvblJvd3MsXG4gIF9yZW5kZXJTYXZlZFNlc3Npb25Sb3dzLFxuICBfcmVuZGVyU2Vzc2lvblN3aXRjaGVyU2VjdGlvbnMsXG4gIF91cGRhdGVTZXNzaW9uU3dpdGNoZXJIZWFkZXIsXG4gIHNob3dPd25lcnNoaXBDb25mbGljdERpYWxvZyxcbiAgY2xvc2VPd25lcnNoaXBDb25mbGljdERpYWxvZyxcbiAgb3BlblNlc3Npb25zTW9kYWwsXG4gIGNsb3NlU2Vzc2lvbnNNb2RhbCxcbiAgX3JlbmRlclNlc3Npb25zTW9kYWxCb2R5LFxuICBsb2FkU2Vzc2lvbkFuZENsb3NlTW9kYWwsXG4gIG5ld1Nlc3Npb25Gcm9tTW9kYWwsXG4gIHN0YXJ0U2Vzc2lvbk1vZGFsUmVuYW1lLFxuICBjYW5jZWxTZXNzaW9uTW9kYWxSZW5hbWUsXG4gIHN1Ym1pdFNlc3Npb25Nb2RhbFJlbmFtZSxcbiAgX2RlbGV0ZVNlc3Npb25Gcm9tTW9kYWwsXG4gIF9kdXBsaWNhdGVTZXNzaW9uRnJvbU1vZGFsLFxuICBfcmVmcmVzaFRyYXNoQmFkZ2UsXG4gIG9wZW5UcmFzaFZpZXcsXG4gIGNsb3NlVHJhc2hWaWV3LFxuICBfcmVuZGVyVHJhc2hWaWV3LFxuICByZXN0b3JlRnJvbVRyYXNoLFxuICBkZWxldGVGb3JldmVyLFxuICBlbXB0eVRyYXNoLFxufTtcbiIsICIvLyBDb3B5cmlnaHQgKEMpIDIwMjYgR3JlZ29yeSBSLiBXYXJuZXNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vci1sYXRlclxuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENWLUJ1aWxkZXIuXG4vLyBGb3IgY29tbWVyY2lhbCBsaWNlbnNpbmcsIGNvbnRhY3QgZ3JlZ0B3YXJuZXMtaW5ub3ZhdGlvbnMuY29tXG5cbi8qKlxuICogd2ViL2tleWJvYXJkLXNob3J0Y3V0cy5qcyBcdTIwMTQgR2xvYmFsIGtleWJvYXJkIHNob3J0Y3V0cyBmb3Igd29ya2Zsb3cgbmF2aWdhdGlvbi5cbiAqXG4gKiBTaG9ydGN1dHMgaW1wbGVtZW50ZWQ6XG4gKiAgIEN0cmwrRW50ZXIgICAgICAgVHJpZ2dlciB0aGUgcHJpbWFyeSBhY3Rpb24gYnV0dG9uIG9uIHRoZSBjdXJyZW50IHRhYlxuICogICBDdHJsK1NoaWZ0K1IgICAgIFJlLXJ1biB0aGUgY3VycmVudCB3b3JrZmxvdyBwaGFzZSAoY2FsbHMgY29uZmlybVJlUnVuUGhhc2UpXG4gKiAgIEEgICAgICAgICAgICAgICAgQWNjZXB0IHRoZSBmb2N1c2VkIHJldmlldyBjYXJkIChyZXdyaXRlIC8gc3BlbGwtY2hlY2sgdGFicylcbiAqICAgUiAgICAgICAgICAgICAgICBSZWplY3QgdGhlIGZvY3VzZWQgcmV2aWV3IGNhcmQgKHJld3JpdGUgLyBzcGVsbC1jaGVjayB0YWJzKVxuICogICBcdTIxOTEgLyBcdTIxOTMgICAgICAgICAgICBOYXZpZ2F0ZSBiZXR3ZWVuIHJldmlldyBjYXJkcyBvbiByZXZpZXcgdGFic1xuICogICBDdHJsK1ogICAgICAgICAgIFVuZG8gdGhlIG1vc3QgcmVjZW50IE1hc3RlciBDViBkYXRhIGNoYW5nZSAoTWFzdGVyIENWIG1vZGFsIG9ubHkpXG4gKiAgIEN0cmwrU2hpZnQrWiAgICAgUmVkbyB0aGUgcHJldmlvdXNseSB1bmRvbmUgTWFzdGVyIENWIGRhdGEgY2hhbmdlIChNYXN0ZXIgQ1YgbW9kYWwgb25seSlcbiAqICAgPyAgICAgICAgICAgICAgICBUb2dnbGUga2V5Ym9hcmQgc2hvcnRjdXQgaGVscCBwYW5lbFxuICovXG5cbi8qKiBUcmFjayB3aGljaCBjYXJkIGlzIGtleWJvYXJkLWZvY3VzZWQgb24gdGhlIGN1cnJlbnQgcmV2aWV3IHRhYi4gKi9cbmxldCBfZm9jdXNlZENhcmRJbmRleCA9IC0xO1xuXG4vKiogUmV0dXJucyB0cnVlIGlmIGZvY3VzIGlzIGluc2lkZSBhIHRleHQgaW5wdXQsIHNvIEEvUi9cdTIxOTEvXHUyMTkzIHNob3VsZCBub3QgZmlyZS4gKi9cbmZ1bmN0aW9uIF9pblRleHRJbnB1dCgpIHtcbiAgY29uc3QgZWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBpZiAoIWVsKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHRhZyA9IGVsLnRhZ05hbWU7XG4gIHJldHVybiB0YWcgPT09ICdJTlBVVCcgfHwgdGFnID09PSAnVEVYVEFSRUEnIHx8IHRhZyA9PT0gJ1NFTEVDVCcgfHwgZWwuaXNDb250ZW50RWRpdGFibGU7XG59XG5cbi8qKiBSZXR1cm5zIHRydWUgaWYgYW55IG1vZGFsIG92ZXJsYXkgaXMgY3VycmVudGx5IHZpc2libGUuICovXG5mdW5jdGlvbiBfbW9kYWxPcGVuKCkge1xuICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW3JvbGU9XCJkaWFsb2dcIl06bm90KFtzdHlsZSo9XCJkaXNwbGF5OiBub25lXCJdKTpub3QoW3N0eWxlKj1cImRpc3BsYXk6bm9uZVwiXSknKSAhPT0gbnVsbDtcbn1cblxuLyoqIFJldHVybnMgdHJ1ZSBpZiB0aGUgTWFzdGVyIENWIG1vZGFsICh3ZWIvaW5kZXguaHRtbCNtYXN0ZXItY3YtbW9kYWwtb3ZlcmxheSkgaXMgb3Blbi4gKi9cbmZ1bmN0aW9uIF9tYXN0ZXJDdk1vZGFsT3BlbigpIHtcbiAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyLWN2LW1vZGFsLW92ZXJsYXknKTtcbiAgcmV0dXJuICEhZWwgJiYgZWwuc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnO1xufVxuXG4vKipcbiAqIE1hcCB0YWIgSURzIHRvIHRoZWlyIHByaW1hcnkgYWN0aW9uIGJ1dHRvbiBJRHMuXG4gKiBCdXR0b25zIHRoYXQgbWlnaHQgYmUgZGlzYWJsZWQgYXQgcnVudGltZSBhcmUgc3RpbGwgY2xpY2tlZCBcdTIwMTQgdGhlIGJ1dHRvbidzXG4gKiBvd24gZGlzYWJsZWQgY2hlY2sgcHJldmVudHMgYWNjaWRlbnRhbCBzdWJtaXNzaW9uLlxuICovXG5jb25zdCBfVEFCX0FDVElPTl9CVE4gPSB7XG4gICdqb2InOiAgICAgICAgICAgICAgICAgICAnc2VuZC1idG4nLFxuICAnYW5hbHlzaXMnOiAgICAgICAgICAgICAgJ2FuYWx5emUtYnRuJyxcbiAgJ2dvYWxzJzogICAgICAgICAgICAgICAgICdyZWNvbW1lbmQtYnRuJyxcbiAgJ3Jld3JpdGUnOiAgICAgICAgICAgICAgICdyZXdyaXRlLWJ0bicsXG4gICdzcGVsbCc6ICAgICAgICAgICAgICAgICAnc3BlbGwtYnRuJyxcbiAgJ2ZpbmFsX2dlbmVyYXRlJzogICAgICAgICdnZW5lcmF0ZS1idG4nLFxuICAnbGF5b3V0JzogICAgICAgICAgICAgICAgJ2xheW91dC1idG4nLFxuICAnZG93bmxvYWQnOiAgICAgICAgICAgICAgJ2ZpbmFsLWdlbmVyYXRlLXByb2NlZWQtYnRuJyxcbiAgJ2ZpbmFsaXNlJzogICAgICAgICAgICAgICdmaW5hbGlzZS1hY3Rpb24tYnRuJyxcbn07XG5cbi8qKiBDbGljayB0aGUgcHJpbWFyeSBhY3Rpb24gYnV0dG9uIGZvciB0aGUgY3VycmVudCB0YWIgKEN0cmwrRW50ZXIpLiAqL1xuZnVuY3Rpb24gX3RyaWdnZXJQcmltYXJ5QWN0aW9uKCkge1xuICBjb25zdCB0YWIgPSB0eXBlb2Ygc3RhdGVNYW5hZ2VyICE9PSAndW5kZWZpbmVkJyA/IHN0YXRlTWFuYWdlci5nZXRDdXJyZW50VGFiKCkgOiBudWxsO1xuICBpZiAoIXRhYikgcmV0dXJuO1xuICBjb25zdCBidG5JZCA9IF9UQUJfQUNUSU9OX0JUTlt0YWJdO1xuICBpZiAoIWJ0bklkKSByZXR1cm47XG4gIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJ0bklkKTtcbiAgaWYgKGJ0biAmJiAhYnRuLmRpc2FibGVkKSBidG4uY2xpY2soKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIENhcmQgbmF2aWdhdGlvbiBoZWxwZXJzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4vKiogUmV0dXJuIHZpc2libGUgcmV2aWV3IGNhcmRzIGZvciB0aGUgY3VycmVudCB0YWIuICovXG5mdW5jdGlvbiBfZ2V0Q2FyZHMoKSB7XG4gIGNvbnN0IHRhYiA9IHR5cGVvZiBzdGF0ZU1hbmFnZXIgIT09ICd1bmRlZmluZWQnID8gc3RhdGVNYW5hZ2VyLmdldEN1cnJlbnRUYWIoKSA6IG51bGw7XG4gIGlmICh0YWIgPT09ICdyZXdyaXRlJykgcmV0dXJuIFsuLi5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucmV3cml0ZS1jYXJkJyldO1xuICBpZiAodGFiID09PSAnc3BlbGwnKSAgIHJldHVybiBbLi4uZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnNwZWxsLWNhcmQnKV07XG4gIHJldHVybiBbXTtcbn1cblxuLyoqIFZpc3VhbGx5IGhpZ2hsaWdodCBhIGNhcmQgYXMga2V5Ym9hcmQtZm9jdXNlZC4gKi9cbmZ1bmN0aW9uIF9oaWdobGlnaHRDYXJkKGNhcmRzLCBpZHgpIHtcbiAgY2FyZHMuZm9yRWFjaCgoYywgaSkgPT4ge1xuICAgIGlmIChpID09PSBpZHgpIHtcbiAgICAgIGMuY2xhc3NMaXN0LmFkZCgna2ItZm9jdXNlZCcpO1xuICAgICAgYy5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnbmVhcmVzdCcsIGJlaGF2aW9yOiAnc21vb3RoJyB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYy5jbGFzc0xpc3QucmVtb3ZlKCdrYi1mb2N1c2VkJyk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqIE1vdmUgdGhlIGtleWJvYXJkIGZvY3VzIHRvIGNhcmQgYXQgZGVsdGEgb2Zmc2V0IGZyb20gY3VycmVudC4gKi9cbmZ1bmN0aW9uIF9tb3ZlQ2FyZEZvY3VzKGRlbHRhKSB7XG4gIGNvbnN0IGNhcmRzID0gX2dldENhcmRzKCk7XG4gIGlmICghY2FyZHMubGVuZ3RoKSByZXR1cm47XG4gIF9mb2N1c2VkQ2FyZEluZGV4ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oY2FyZHMubGVuZ3RoIC0gMSwgX2ZvY3VzZWRDYXJkSW5kZXggKyBkZWx0YSkpO1xuICBfaGlnaGxpZ2h0Q2FyZChjYXJkcywgX2ZvY3VzZWRDYXJkSW5kZXgpO1xufVxuXG4vKiogQWNjZXB0IHRoZSBjdXJyZW50bHkga2V5Ym9hcmQtZm9jdXNlZCByZXdyaXRlIGNhcmQuICovXG5mdW5jdGlvbiBfYWNjZXB0Rm9jdXNlZENhcmQoKSB7XG4gIGNvbnN0IHRhYiA9IHR5cGVvZiBzdGF0ZU1hbmFnZXIgIT09ICd1bmRlZmluZWQnID8gc3RhdGVNYW5hZ2VyLmdldEN1cnJlbnRUYWIoKSA6IG51bGw7XG4gIGlmICh0YWIgPT09ICdyZXdyaXRlJykge1xuICAgIGNvbnN0IGNhcmRzID0gX2dldENhcmRzKCk7XG4gICAgaWYgKF9mb2N1c2VkQ2FyZEluZGV4IDwgMCB8fCBfZm9jdXNlZENhcmRJbmRleCA+PSBjYXJkcy5sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCBjYXJkID0gY2FyZHNbX2ZvY3VzZWRDYXJkSW5kZXhdO1xuICAgIGNvbnN0IGlkID0gY2FyZC5pZC5yZXBsYWNlKCdydy1jYXJkLScsICcnKTtcbiAgICBpZiAodHlwZW9mIGFwcGx5UmV3cml0ZUFjdGlvbiA9PT0gJ2Z1bmN0aW9uJykgYXBwbHlSZXdyaXRlQWN0aW9uKGlkLCAnYWNjZXB0Jyk7XG4gIH0gZWxzZSBpZiAodGFiID09PSAnc3BlbGwnKSB7XG4gICAgY29uc3QgY2FyZHMgPSBfZ2V0Q2FyZHMoKTtcbiAgICBpZiAoX2ZvY3VzZWRDYXJkSW5kZXggPCAwIHx8IF9mb2N1c2VkQ2FyZEluZGV4ID49IGNhcmRzLmxlbmd0aCkgcmV0dXJuO1xuICAgIC8vIHNwZWxsIGNhcmRzOiBmaW5kIHRoZSBhY2NlcHQgYnV0dG9uIHdpdGhpbiB0aGUgZm9jdXNlZCBjYXJkXG4gICAgY29uc3QgYnRuID0gY2FyZHNbX2ZvY3VzZWRDYXJkSW5kZXhdLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWFjdGlvbj1cImtlZXBcIl0sIC5zcGVsbC1rZWVwLWJ0bicpO1xuICAgIGlmIChidG4pIGJ0bi5jbGljaygpO1xuICB9XG59XG5cbi8qKiBSZWplY3QgdGhlIGN1cnJlbnRseSBrZXlib2FyZC1mb2N1c2VkIHJldmlldyBjYXJkLiAqL1xuZnVuY3Rpb24gX3JlamVjdEZvY3VzZWRDYXJkKCkge1xuICBjb25zdCB0YWIgPSB0eXBlb2Ygc3RhdGVNYW5hZ2VyICE9PSAndW5kZWZpbmVkJyA/IHN0YXRlTWFuYWdlci5nZXRDdXJyZW50VGFiKCkgOiBudWxsO1xuICBpZiAodGFiID09PSAncmV3cml0ZScpIHtcbiAgICBjb25zdCBjYXJkcyA9IF9nZXRDYXJkcygpO1xuICAgIGlmIChfZm9jdXNlZENhcmRJbmRleCA8IDAgfHwgX2ZvY3VzZWRDYXJkSW5kZXggPj0gY2FyZHMubGVuZ3RoKSByZXR1cm47XG4gICAgY29uc3QgY2FyZCA9IGNhcmRzW19mb2N1c2VkQ2FyZEluZGV4XTtcbiAgICBjb25zdCBpZCA9IGNhcmQuaWQucmVwbGFjZSgncnctY2FyZC0nLCAnJyk7XG4gICAgaWYgKHR5cGVvZiBhcHBseVJld3JpdGVBY3Rpb24gPT09ICdmdW5jdGlvbicpIGFwcGx5UmV3cml0ZUFjdGlvbihpZCwgJ3JlamVjdCcpO1xuICB9IGVsc2UgaWYgKHRhYiA9PT0gJ3NwZWxsJykge1xuICAgIGNvbnN0IGNhcmRzID0gX2dldENhcmRzKCk7XG4gICAgaWYgKF9mb2N1c2VkQ2FyZEluZGV4IDwgMCB8fCBfZm9jdXNlZENhcmRJbmRleCA+PSBjYXJkcy5sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCBidG4gPSBjYXJkc1tfZm9jdXNlZENhcmRJbmRleF0ucXVlcnlTZWxlY3RvcignW2RhdGEtYWN0aW9uPVwiYXBwbHlcIl0sIC5zcGVsbC1hcHBseS1idG4nKTtcbiAgICBpZiAoYnRuKSBidG4uY2xpY2soKTtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgU2hvcnRjdXQgaGVscCBwYW5lbCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuY29uc3QgX1BBTkVMX0lEID0gJ2tiLXNob3J0Y3V0cy1wYW5lbCc7XG5cbi8qKiBUb2dnbGUgdGhlIGtleWJvYXJkIHNob3J0Y3V0IGhlbHAgcGFuZWwuICovXG5leHBvcnQgZnVuY3Rpb24gc2hvd0tleWJvYXJkU2hvcnRjdXRzUGFuZWwoKSB7XG4gIGNvbnN0IGV4aXN0aW5nID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoX1BBTkVMX0lEKTtcbiAgaWYgKGV4aXN0aW5nKSB7IGV4aXN0aW5nLnJlbW92ZSgpOyByZXR1cm47IH1cblxuICBjb25zdCBwYW5lbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBwYW5lbC5pZCA9IF9QQU5FTF9JRDtcbiAgcGFuZWwuc2V0QXR0cmlidXRlKCdyb2xlJywgJ2RpYWxvZycpO1xuICBwYW5lbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbW9kYWwnLCAndHJ1ZScpO1xuICBwYW5lbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnS2V5Ym9hcmQgc2hvcnRjdXRzJyk7XG4gIHBhbmVsLmlubmVySFRNTCA9IGBcbiAgICA8ZGl2IGlkPVwia2Itc2hvcnRjdXRzLWlubmVyXCI+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2FsaWduLWl0ZW1zOmNlbnRlcjttYXJnaW4tYm90dG9tOjEycHhcIj5cbiAgICAgICAgPHN0cm9uZz5LZXlib2FyZCBTaG9ydGN1dHM8L3N0cm9uZz5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImtiLXNob3J0Y3V0cy1jbG9zZVwiIGFyaWEtbGFiZWw9XCJDbG9zZSBrZXlib2FyZCBzaG9ydGN1dHNcIiBzdHlsZT1cImJhY2tncm91bmQ6bm9uZTtib3JkZXI6bm9uZTtmb250LXNpemU6MS4yZW07Y3Vyc29yOnBvaW50ZXI7cGFkZGluZzoycHggNnB4XCI+XHUyNzE1PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDx0YWJsZSBzdHlsZT1cImJvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTt3aWR0aDoxMDAlXCI+XG4gICAgICAgIDx0Ym9keT5cbiAgICAgICAgICA8dHI+PHRkIHN0eWxlPVwicGFkZGluZzo0cHggMTJweCA0cHggMFwiPjxrYmQ+Q3RybDwva2JkPis8a2JkPkVudGVyPC9rYmQ+PC90ZD48dGQ+VHJpZ2dlciBwcmltYXJ5IGFjdGlvbiBvbiBjdXJyZW50IHN0ZXA8L3RkPjwvdHI+XG4gICAgICAgICAgPHRyPjx0ZCBzdHlsZT1cInBhZGRpbmc6NHB4IDEycHggNHB4IDBcIj48a2JkPkN0cmw8L2tiZD4rPGtiZD5TaGlmdDwva2JkPis8a2JkPlI8L2tiZD48L3RkPjx0ZD5SZS1ydW4gY3VycmVudCB3b3JrZmxvdyBwaGFzZTwvdGQ+PC90cj5cbiAgICAgICAgICA8dHI+PHRkIHN0eWxlPVwicGFkZGluZzo0cHggMTJweCA0cHggMFwiPjxrYmQ+XHUyMTkxPC9rYmQ+IC8gPGtiZD5cdTIxOTM8L2tiZD48L3RkPjx0ZD5OYXZpZ2F0ZSBiZXR3ZWVuIHJldmlldyBjYXJkczwvdGQ+PC90cj5cbiAgICAgICAgICA8dHI+PHRkIHN0eWxlPVwicGFkZGluZzo0cHggMTJweCA0cHggMFwiPjxrYmQ+QTwva2JkPjwvdGQ+PHRkPkFjY2VwdCBmb2N1c2VkIGNhcmQgKHJld3JpdGUgLyBzcGVsbCk8L3RkPjwvdHI+XG4gICAgICAgICAgPHRyPjx0ZCBzdHlsZT1cInBhZGRpbmc6NHB4IDEycHggNHB4IDBcIj48a2JkPlI8L2tiZD48L3RkPjx0ZD5SZWplY3QgZm9jdXNlZCBjYXJkIChyZXdyaXRlIC8gc3BlbGwpPC90ZD48L3RyPlxuICAgICAgICAgIDx0cj48dGQgc3R5bGU9XCJwYWRkaW5nOjRweCAxMnB4IDRweCAwXCI+PGtiZD5DdHJsPC9rYmQ+KzxrYmQ+Wjwva2JkPjwvdGQ+PHRkPlVuZG8gTWFzdGVyIENWIGNoYW5nZSAoTWFzdGVyIENWIG1vZGFsKTwvdGQ+PC90cj5cbiAgICAgICAgICA8dHI+PHRkIHN0eWxlPVwicGFkZGluZzo0cHggMTJweCA0cHggMFwiPjxrYmQ+Q3RybDwva2JkPis8a2JkPlNoaWZ0PC9rYmQ+KzxrYmQ+Wjwva2JkPjwvdGQ+PHRkPlJlZG8gTWFzdGVyIENWIGNoYW5nZSAoTWFzdGVyIENWIG1vZGFsKTwvdGQ+PC90cj5cbiAgICAgICAgICA8dHI+PHRkIHN0eWxlPVwicGFkZGluZzo0cHggMTJweCA0cHggMFwiPjxrYmQ+Pzwva2JkPjwvdGQ+PHRkPlRvZ2dsZSB0aGlzIGhlbHAgcGFuZWw8L3RkPjwvdHI+XG4gICAgICAgICAgPHRyPjx0ZCBzdHlsZT1cInBhZGRpbmc6NHB4IDEycHggNHB4IDBcIj48a2JkPkVzYzwva2JkPjwvdGQ+PHRkPkNsb3NlIG1vZGFscyAvIHRoaXMgcGFuZWw8L3RkPjwvdHI+XG4gICAgICAgIDwvdGJvZHk+XG4gICAgICA8L3RhYmxlPlxuICAgIDwvZGl2PmA7XG4gIE9iamVjdC5hc3NpZ24ocGFuZWwuc3R5bGUsIHtcbiAgICBwb3NpdGlvbjogICAnZml4ZWQnLFxuICAgIGJvdHRvbTogICAgICc4MHB4JyxcbiAgICByaWdodDogICAgICAnMjRweCcsXG4gICAgYmFja2dyb3VuZDogJyMxZjI5MzcnLFxuICAgIGNvbG9yOiAgICAgICcjZjlmYWZiJyxcbiAgICBib3JkZXI6ICAgICAnMXB4IHNvbGlkICMzNzQxNTEnLFxuICAgIGJvcmRlclJhZGl1czogJzhweCcsXG4gICAgcGFkZGluZzogICAgJzE2cHggMjBweCcsXG4gICAgekluZGV4OiAgICAgJzEwMDAwJyxcbiAgICBmb250U2l6ZTogICAnMC44NWVtJyxcbiAgICBtaW5XaWR0aDogICAnMzQwcHgnLFxuICAgIGJveFNoYWRvdzogICcwIDRweCAyMHB4IHJnYmEoMCwwLDAsMC41KScsXG4gIH0pO1xuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHBhbmVsKTtcbiAgcGFuZWwucXVlcnlTZWxlY3RvcignI2tiLXNob3J0Y3V0cy1jbG9zZScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gcGFuZWwucmVtb3ZlKCkpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgUmVzZXQgY2FyZCBmb2N1cyB3aGVuIHRhYiBjaGFuZ2VzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4vKiogQ2FsbGVkIHdoZW5ldmVyIHRoZSBhY3RpdmUgdGFiIGNoYW5nZXMgc28gY2FyZCBmb2N1cyByZXNldHMuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzZXRDYXJkRm9jdXMoKSB7XG4gIF9mb2N1c2VkQ2FyZEluZGV4ID0gLTE7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5rYi1mb2N1c2VkJykuZm9yRWFjaChlbCA9PiBlbC5jbGFzc0xpc3QucmVtb3ZlKCdrYi1mb2N1c2VkJykpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgR2xvYmFsIGtleWRvd24gaGFuZGxlciBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gX29uS2V5RG93bihlKSB7XG4gIC8vIEN0cmwrRW50ZXIgXHUyMTkyIHByaW1hcnkgYWN0aW9uIChhbHdheXMsIGV2ZW4gaW4gdGV4dCBpbnB1dHMgd2hlbiB0aGUgbWFpblxuICAvLyBzZW5kLWJveCBpcyBmb2N1c2VkLCB0byBtYXRjaCB0aGUgZXhpc3RpbmcgRW50ZXIgYmVoYXZpb3VyIHRoZXJlKS5cbiAgaWYgKGUuY3RybEtleSAmJiBlLmtleSA9PT0gJ0VudGVyJykge1xuICAgIF90cmlnZ2VyUHJpbWFyeUFjdGlvbigpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEN0cmwrU2hpZnQrUiBcdTIxOTIgcmUtcnVuIGN1cnJlbnQgcGhhc2VcbiAgaWYgKGUuY3RybEtleSAmJiBlLnNoaWZ0S2V5ICYmIGUua2V5ID09PSAnUicpIHtcbiAgICBjb25zdCBhY3RpdmVFbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tpZF49XCJzdGVwLVwiXS5hY3RpdmUnKTtcbiAgICBjb25zdCBzdGVwID0gYWN0aXZlRWwgPyBhY3RpdmVFbC5pZC5yZXBsYWNlKCdzdGVwLScsICcnKSA6IG51bGw7XG4gICAgaWYgKHN0ZXAgJiYgdHlwZW9mIGNvbmZpcm1SZVJ1blBoYXNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBjb25maXJtUmVSdW5QaGFzZShzdGVwKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gQ3RybCtaIC8gQ3RybCtTaGlmdCtaIFx1MjE5MiB1bmRvL3JlZG8gdGhlIG1vc3QgcmVjZW50IE1hc3RlciBDViBkYXRhIGNoYW5nZS5cbiAgLy8gU2NvcGVkIHRvIHdoZW4gdGhlIE1hc3RlciBDViBtb2RhbCBpcyBvcGVuIFx1MjAxNCBhbmQgbm8gbmVzdGVkIHN1Yi1tb2RhbFxuICAvLyAoZS5nLiB0aGUgYmFja3VwLWhpc3RvcnkgYnJvd3NlcikgaXMgc3RhY2tlZCBvbiB0b3Agb2YgaXQgXHUyMDE0IGFuZCBmb2N1c1xuICAvLyBpc24ndCBpbiBhIHRleHQgZmllbGQsIHNpbmNlIEN0cmwrWiBpbnNpZGUgYSB0ZXh0YXJlYSBtdXN0IHN0aWxsIHBlcmZvcm1cbiAgLy8gbmF0aXZlIHRleHQtdW5kbyByYXRoZXIgdGhhbiBiZWluZyBoaWphY2tlZCBieSB0aGlzIHNob3J0Y3V0LlxuICBpZiAoZS5jdHJsS2V5ICYmICFlLmFsdEtleSAmJiAoZS5rZXkgPT09ICd6JyB8fCBlLmtleSA9PT0gJ1onKVxuICAgICAgJiYgX21hc3RlckN2TW9kYWxPcGVuKCkgJiYgIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYWNrdXAtaGlzdG9yeS1vdmVybGF5JylcbiAgICAgICYmICFfaW5UZXh0SW5wdXQoKSkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBpZiAoZS5zaGlmdEtleSkge1xuICAgICAgaWYgKHR5cGVvZiByZWRvTWFzdGVyRGF0YUNoYW5nZSA9PT0gJ2Z1bmN0aW9uJykgcmVkb01hc3RlckRhdGFDaGFuZ2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR5cGVvZiB1bmRvTWFzdGVyRGF0YUNoYW5nZSA9PT0gJ2Z1bmN0aW9uJykgdW5kb01hc3RlckRhdGFDaGFuZ2UoKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gQWxsIHNpbmdsZS1rZXkgc2hvcnRjdXRzIGFyZSBzdXBwcmVzc2VkIHdoZW4gdHlwaW5nIGludG8gYW4gaW5wdXQuXG4gIGlmIChfaW5UZXh0SW5wdXQoKSkgcmV0dXJuO1xuICAvLyBBbGwgc2luZ2xlLWtleSBzaG9ydGN1dHMgYXJlIHN1cHByZXNzZWQgd2hlbiBhIG1vZGFsIGRpYWxvZyBpcyBvcGVuLFxuICAvLyBleGNlcHQgRXNjYXBlIChoYW5kbGVkIGJ5IHVpLWNvcmUuanMpLlxuICBpZiAoX21vZGFsT3BlbigpKSByZXR1cm47XG5cbiAgc3dpdGNoIChlLmtleSkge1xuICAgIGNhc2UgJz8nOlxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgc2hvd0tleWJvYXJkU2hvcnRjdXRzUGFuZWwoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgX21vdmVDYXJkRm9jdXMoLTEpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIF9tb3ZlQ2FyZEZvY3VzKDEpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYSc6XG4gICAgY2FzZSAnQSc6XG4gICAgICBfYWNjZXB0Rm9jdXNlZENhcmQoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3InOlxuICAgIGNhc2UgJ1InOlxuICAgICAgX3JlamVjdEZvY3VzZWRDYXJkKCk7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgYnJlYWs7XG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIEluaXRpYWxpc2F0aW9uIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4vKipcbiAqIEF0dGFjaCB0aGUgZ2xvYmFsIGtleWJvYXJkLXNob3J0Y3V0IGxpc3RlbmVyLlxuICogQ2FsbGVkIG9uY2UgZnJvbSBhcHAuanMgYWZ0ZXIgRE9NQ29udGVudExvYWRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRLZXlib2FyZFNob3J0Y3V0cygpIHtcbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIF9vbktleURvd24pO1xufVxuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLy8gT3JjaGVzdHJhdG9yIGVudHJ5LXBvaW50IFx1MjAxNCBhbGwgbW9kdWxlIGZ1bmN0aW9ucyBhcmUgZXhwb3NlZCBhcyBnbG9iYWxzIGJ5IGJ1bmRsZS5qcy5cbi8vIE5vdGU6IGFwcC5qcyBpcyBhIHBsYWluIGxlZ2FjeSBzY3JpcHQgKG5vdCBidW5kbGVkKS4gbG9nbGV2ZWwgaXMgYXZhaWxhYmxlXG4vLyB2aWEgZ2xvYmFsVGhpcy5sb2dsZXZlbCAoc2V0IGJ5IGJ1bmRsZS5qcyB3aGljaCBpbmNsdWRlcyB3ZWIvbG9nZ2VyLmpzKS5cbmNvbnN0IF9hcHBMb2cgPSAodHlwZW9mIGxvZ2xldmVsICE9PSAndW5kZWZpbmVkJykgPyBsb2dsZXZlbC5nZXRMb2dnZXIoJ2FwcCcpIDogY29uc29sZTtcbi8vIFRoaXMgZmlsZSBjb250YWlucyBvbmx5IGluaXQoKSBhbmQgdG9wLWxldmVsIGV2ZW50LXdpcmluZyAoXHUyMjY0IDMwMCBsaW5lcykuXG5cbmxldCBfbGlzdGVuZXJzUmVnaXN0ZXJlZCA9IGZhbHNlO1xuXG5mdW5jdGlvbiBfc2V0Q29ubmVjdGlvbk1lc3NhZ2UobWVzc2FnZU5vZGUsIHRleHQsIGtpbmQgPSAnaW5mbycpIHtcbiAgaWYgKCFtZXNzYWdlTm9kZSkgcmV0dXJuO1xuICBjb25zdCBjb250ZW50ID0gbWVzc2FnZU5vZGUucXVlcnlTZWxlY3RvcignLmNvbnRlbnQnKTtcbiAgaWYgKCFjb250ZW50KSByZXR1cm47XG4gIGNvbnRlbnQudGV4dENvbnRlbnQgPSB0ZXh0O1xuICBjb250ZW50LnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lLWJsb2NrJztcbiAgY29udGVudC5zdHlsZS5wYWRkaW5nID0gJzZweCAxMHB4JztcbiAgY29udGVudC5zdHlsZS5ib3JkZXJSYWRpdXMgPSAnOTk5cHgnO1xuICBjb250ZW50LnN0eWxlLmZvbnRXZWlnaHQgPSAnNjAwJztcbiAgY29udGVudC5zdHlsZS5mb250U2l6ZSA9ICcwLjg4ZW0nO1xuICBjb250ZW50LnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgI2NiZDVlMSc7XG4gIGlmIChraW5kID09PSAnc3VjY2VzcycpIHtcbiAgICBjb250ZW50LnN0eWxlLmNvbG9yID0gJyMxNjY1MzQnO1xuICAgIGNvbnRlbnQuc3R5bGUuYmFja2dyb3VuZCA9ICcjZWNmZGY1JztcbiAgICBjb250ZW50LnN0eWxlLmJvcmRlckNvbG9yID0gJyM4NmVmYWMnO1xuICB9IGVsc2UgaWYgKGtpbmQgPT09ICdlcnJvcicpIHtcbiAgICBjb250ZW50LnN0eWxlLmNvbG9yID0gJyNiOTFjMWMnO1xuICAgIGNvbnRlbnQuc3R5bGUuYmFja2dyb3VuZCA9ICcjZmVmMmYyJztcbiAgICBjb250ZW50LnN0eWxlLmJvcmRlckNvbG9yID0gJyNmZWNhY2EnO1xuICB9IGVsc2Uge1xuICAgIGNvbnRlbnQuc3R5bGUuY29sb3IgPSAnIzFlNDBhZic7XG4gICAgY29udGVudC5zdHlsZS5iYWNrZ3JvdW5kID0gJyNlZmY2ZmYnO1xuICAgIGNvbnRlbnQuc3R5bGUuYm9yZGVyQ29sb3IgPSAnI2JmZGJmZSc7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gaW5pdCgpIHtcbiAgLy8gSW5pdGlhbGl6ZSBhYm9ydCBjb250cm9sbGVyIHRvIG51bGwgKHNldCB0byBuZXcgQWJvcnRDb250cm9sbGVyIGJ5IHNldExvYWRpbmcodHJ1ZSkpXG4gIHdpbmRvdy5fY3VycmVudEFib3J0Q29udHJvbGxlciA9IG51bGw7XG5cbiAgLy8gRmx1c2ggYW55IG1lc3NhZ2VzIHRoYXQgd2VyZSBxdWV1ZWQgYmVmb3JlIERPTUNvbnRlbnRMb2FkZWQgKGRlZmVuc2l2ZSBcdTIwMTQgc2hvdWxkIGJlIGVtcHR5IGluIHByYWN0aWNlKS5cbiAgX2ZsdXNoTWVzc2FnZVF1ZXVlKCk7XG5cbiAgY29uc3QgaGFzQWN0aXZlU2Vzc2lvbiA9IGF3YWl0IGVuc3VyZVNlc3Npb25Db250ZXh0KCk7XG4gIGlmICghaGFzQWN0aXZlU2Vzc2lvbikge1xuICAgIGNvbnN0IGZhaWxlZE1lc3NhZ2UgPSBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnXHUyNkEwXHVGRTBGIENvdWxkIG5vdCBlc3RhYmxpc2ggYSBzZXNzaW9uLiBDcmVhdGUgb3IgbG9hZCBhIHNlc3Npb24gdG8gY29udGludWUuJyk7XG4gICAgX3NldENvbm5lY3Rpb25NZXNzYWdlKGZhaWxlZE1lc3NhZ2UsICdcdTI2QTBcdUZFMEYgQ291bGQgbm90IGVzdGFibGlzaCBhIHNlc3Npb24uIENyZWF0ZSBvciBsb2FkIGEgc2Vzc2lvbiB0byBjb250aW51ZS4nLCAnZXJyb3InKTtcbiAgICBzZXR1cEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gU2hvdyB3ZWxjb21lL29uYm9hcmRpbmcgbW9kYWwgb24gZXZlcnkgc3RhcnR1cCB1bnRpbCB1c2VyIGRpc21pc3NlcyBpdC5cbiAgYXdhaXQgbWF5YmVTaG93V2VsY29tZU1vZGFsKCk7XG5cbiAgLy8gUmVzdG9yZSBzZXNzaW9uIHN0YXRlIGZpcnN0XG4gIGF3YWl0IHJlc3RvcmVTZXNzaW9uKCk7XG5cbiAgLy8gU2hvdyBjb25uZWN0aW9uIHN0YXR1cyBhZnRlciByZXN0b3JlU2Vzc2lvbiBzbyBpdCBpcyBub3QgcmVtb3ZlZCBieSBoaXN0b3J5IHJlc3RvcmUuXG4gIGNvbnN0IGNvbm5lY3Rpb25NZXNzYWdlID0gYXBwZW5kTWVzc2FnZSgnc3lzdGVtJywgJ1x1RDgzRFx1REQwNCBDb25uZWN0aW5nIHRvIENWIEJ1aWxkZXIuLi4nKTtcbiAgX3NldENvbm5lY3Rpb25NZXNzYWdlKGNvbm5lY3Rpb25NZXNzYWdlLCAnXHVEODNEXHVERDA0IENvbm5lY3RpbmcgdG8gQ1YgQnVpbGRlci4uLicsICdpbmZvJyk7XG5cbiAgLy8gUmVzdG9yZSBBVFMgYmFkZ2UgZnJvbSBjYWNoZWQgc2NvcmUgKGlmIGFueSlcbiAgdXBkYXRlQXRzQmFkZ2Uoc3RhdGVNYW5hZ2VyLmdldEF0c1Njb3JlKCkpO1xuXG4gIC8vIEluaXRpYWxpemUgdGhlIHJlc3RcbiAgYXdhaXQgZmV0Y2hTdGF0dXMoKTtcbiAgY29uc3QgY29ubmVjdGVkTWVzc2FnZSA9IGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsICdcdTI3MDUgQ29ubmVjdGlvbiBzdWNjZXNzZnVsLicpO1xuICBfc2V0Q29ubmVjdGlvbk1lc3NhZ2UoY29ubmVjdGVkTWVzc2FnZSwgJ1x1MjcwNSBDb25uZWN0aW9uIHN1Y2Nlc3NmdWwuJywgJ3N1Y2Nlc3MnKTtcbiAgaWYgKHN0YXRlTWFuYWdlci5nZXRDdXJyZW50VGFiKCkgPT09ICdqb2InKSBhd2FpdCBwb3B1bGF0ZUpvYlRhYigpO1xuICBzZXR1cEV2ZW50TGlzdGVuZXJzKCk7XG5cbiAgLy8gU2V0IHVwIHBlcmlvZGljIHN0YXRlIHNhdmluZ1xuICBzZXRJbnRlcnZhbChzYXZlVGFiRGF0YSwgNTAwMCk7IC8vIFNhdmUgZXZlcnkgNSBzZWNvbmRzXG5cbiAgLy8gU2F2ZSBzdGF0ZSBiZWZvcmUgcGFnZSB1bmxvYWRcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsICgpID0+IHtcbiAgICBzYXZlVGFiRGF0YSgpO1xuICAgIGNvbnN0IGFjdGl2ZVNlc3Npb25JZCA9IHN0YXRlTWFuYWdlci5nZXRTZXNzaW9uSWQoKTtcbiAgICBpZiAoYWN0aXZlU2Vzc2lvbklkKSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShTdG9yYWdlS2V5cy5TRVNTSU9OX0lELCBhY3RpdmVTZXNzaW9uSWQpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gUHJvbXB0IHVzZXIgdG8gYW5hbHl6ZSBpZiBhIGpvYiBkZXNjcmlwdGlvbiBpcyBsb2FkZWQgYnV0IG5vdCB5ZXQgYW5hbHl6ZWQuXG4gIC8vIERvIE5PVCBhdXRvLWZpcmUgXHUyMDE0IGEgcmV0dXJuaW5nIHVzZXIgbWF5IGhhdmUgaW50ZW50aW9uYWxseSBsZWZ0IGl0IHVuYW5hbHl6ZWRcbiAgLy8gKGUuZy4gbWlkLWVkaXQpLiBMZXQgdGhlbSBjbGljayBBbmFseXNlIEpvYiBleHBsaWNpdGx5IChHQVAtMjQ4KS5cbiAgaWYgKCFzdGF0ZU1hbmFnZXIuaXNSZWNvbm5lY3RpbmcoKSkge1xuICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IGZldGNoU3RhdHVzKCk7XG4gICAgaWYgKCFzdGF0dXMuX2Vycm9yICYmIHN0YXR1cy5qb2JfZGVzY3JpcHRpb24gJiYgIXN0YXR1cy5qb2JfYW5hbHlzaXMpIHtcbiAgICAgIGFwcGVuZE1lc3NhZ2UoJ3N5c3RlbScsICdcdUQ4M0RcdURDQ0IgSm9iIGRlc2NyaXB0aW9uIGRldGVjdGVkIFx1MjAxNCBjbGljayA8c3Ryb25nPkFuYWx5c2UgSm9iPC9zdHJvbmc+IHdoZW4gcmVhZHkgdG8gYmVnaW4uJyk7XG4gICAgICBjb25zdCBhbmFseXplQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FuYWx5emUtYnRuJyk7XG4gICAgICBpZiAoYW5hbHl6ZUJ0bikge1xuICAgICAgICBhbmFseXplQnRuLnN0eWxlLm91dGxpbmUgPSAnMnB4IHNvbGlkICMzYjgyZjYnO1xuICAgICAgICBhbmFseXplQnRuLnN0eWxlLm91dGxpbmVPZmZzZXQgPSAnMnB4JztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHN0YXR1cy5qb2JfYW5hbHlzaXMpIHtcbiAgICAgIF9hcHBMb2cuaW5mbygnSm9iIGFuYWx5c2lzIGFscmVhZHkgY29tcGxldGUsIHNraXBwaW5nIGF1dG8tYW5hbHlzaXMnKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgX2FwcExvZy5pbmZvKCdSZWNvbm5lY3RpbmcgdG8gZXhpc3Rpbmcgc2Vzc2lvbiwgc2tpcHBpbmcgYXV0by1hbmFseXNpcycpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNldHVwRXZlbnRMaXN0ZW5lcnMoKSB7XG4gIGlmIChfbGlzdGVuZXJzUmVnaXN0ZXJlZCkgcmV0dXJuO1xuICBfbGlzdGVuZXJzUmVnaXN0ZXJlZCA9IHRydWU7XG5cbiAgLy8gVGFiIHN3aXRjaGluZ1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudGFiJykuZm9yRWFjaCh0YWIgPT4ge1xuICAgIHRhYi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHN3aXRjaFRhYih0YWIuZGF0YXNldC50YWIpKTtcbiAgfSk7XG5cbiAgLy8gTWVzc2FnZSBzZW5kaW5nXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZW5kLWJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc2VuZE1lc3NhZ2UpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWVzc2FnZS1pbnB1dCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2tleXByZXNzJywgKGUpID0+IHtcbiAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicpIHNlbmRNZXNzYWdlKCk7XG4gIH0pO1xuXG4gIC8vIEFjdGlvbiBidXR0b25zIFx1MjAxNCBvbmUgcGVyIHdvcmtmbG93IHN0YWdlXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhbmFseXplLWJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYW5hbHl6ZUpvYik7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWNvbW1lbmQtYnRuJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBzZW5kQWN0aW9uKCdyZWNvbW1lbmRfY3VzdG9taXphdGlvbnMnKSk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnZW5lcmF0ZS1idG4nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICAvLyBTb2Z0IGdhdGU6IHdhcm4gaWYgY3VzdG9taXNhdGlvbiBpdGVtcyBoYXZlIG5ldmVyIGJlZW4gaW5kaXZpZHVhbGx5IHJldmlld2VkIChHQVAtMTE2KVxuICAgIGNvbnN0IHJldmlld2VkID0gd2luZG93Ll9leHBsaWNpdGx5UmV2aWV3ZWQgfHwgeyBleHBlcmllbmNlczogbmV3IFNldCgpLCBza2lsbHM6IG5ldyBTZXQoKSB9O1xuICAgIGNvbnN0IHRvdGFsRXhwID0gKHdpbmRvdy5fZXhwZXJpZW5jZXNPcmRlcmVkIHx8IFtdKS5sZW5ndGg7XG4gICAgY29uc3QgdG90YWxTa2lsbCA9IE9iamVjdC5rZXlzKHVzZXJTZWxlY3Rpb25zPy5za2lsbHMgfHwge30pLmxlbmd0aDtcbiAgICBjb25zdCB1bnJldmlld2VkRXhwID0gdG90YWxFeHAgLSByZXZpZXdlZC5leHBlcmllbmNlcy5zaXplO1xuICAgIGNvbnN0IHVucmV2aWV3ZWRTa2lsbCA9IHRvdGFsU2tpbGwgLSByZXZpZXdlZC5za2lsbHMuc2l6ZTtcbiAgICBjb25zdCB1bnJldmlld2VkVG90YWwgPSBNYXRoLm1heCgwLCB1bnJldmlld2VkRXhwKSArIE1hdGgubWF4KDAsIHVucmV2aWV3ZWRTa2lsbCk7XG4gICAgaWYgKHVucmV2aWV3ZWRUb3RhbCA+IDApIHtcbiAgICAgIGNvbnN0IHBhcnRzID0gW107XG4gICAgICBpZiAodW5yZXZpZXdlZEV4cCA+IDApIHBhcnRzLnB1c2goYCR7dW5yZXZpZXdlZEV4cH0gZXhwZXJpZW5jZSBlbnRyJHt1bnJldmlld2VkRXhwID09PSAxID8gJ3knIDogJ2llcyd9YCk7XG4gICAgICBpZiAodW5yZXZpZXdlZFNraWxsID4gMCkgcGFydHMucHVzaChgJHt1bnJldmlld2VkU2tpbGx9IHNraWxsJHt1bnJldmlld2VkU2tpbGwgPT09IDEgPyAnJyA6ICdzJ31gKTtcbiAgICAgIGNvbnN0IG9rID0gd2luZG93LmNvbmZpcm0oXG4gICAgICAgIGAke3BhcnRzLmpvaW4oJyBhbmQgJyl9IG5vdCBpbmRpdmlkdWFsbHkgcmV2aWV3ZWQgXHUyMDE0IHRoZSBBSSdzIHJlY29tbWVuZGF0aW9uIHdpbGwgYmUgdXNlZCBmb3IgdGhlc2UuXFxuXFxuUHJvY2VlZCBhbnl3YXk/YFxuICAgICAgKTtcbiAgICAgIGlmICghb2spIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHVzZXJTZWxlY3Rpb25zICYmIChPYmplY3Qua2V5cyh1c2VyU2VsZWN0aW9ucy5leHBlcmllbmNlcykubGVuZ3RoID4gMCB8fCBPYmplY3Qua2V5cyh1c2VyU2VsZWN0aW9ucy5za2lsbHMpLmxlbmd0aCA+IDApKSB7XG4gICAgICBhcHBlbmRNZXNzYWdlKCdzeXN0ZW0nLCAnQXBwbHlpbmcgeW91ciByZXZpZXcgZGVjaXNpb25zLi4uJyk7XG4gICAgICAvLyBEZWNpc2lvbnMgd2VyZSBhbHJlYWR5IHN1Ym1pdHRlZCB2aWEgc3VibWl0RXhwZXJpZW5jZURlY2lzaW9ucy9zdWJtaXRTa2lsbERlY2lzaW9uc1xuICAgICAgLy8gQmFja2VuZCBoYXMgdGhlbSBpbiBjb252ZXJzYXRpb24uc3RhdGVbJ2V4cGVyaWVuY2VfZGVjaXNpb25zJ10gYW5kIFsnc2tpbGxfZGVjaXNpb25zJ11cbiAgICB9XG4gICAgYXdhaXQgZmV0Y2hBbmRSZXZpZXdSZXdyaXRlcygpO1xuICB9KTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jld3JpdGUtYnRuJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzdWJtaXRSZXdyaXRlRGVjaXNpb25zKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NwZWxsLWJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc3VibWl0U3BlbGxDaGVja0RlY2lzaW9ucyk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnZW5lcmF0ZS1wcm9jZWVkLWJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gc3dpdGNoVGFiKCdsYXlvdXQnKSk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYXlvdXQtYnRuJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVMYXlvdXRQcmltYXJ5QWN0aW9uKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbmFsLWdlbmVyYXRlLXByb2NlZWQtYnRuJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmaW5hbEdlbmVyYXRpb25Db21wbGV0ZSk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaW5hbGlzZS1hY3Rpb24tYnRuJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBzd2l0Y2hUYWIoJ2ZpbmFsaXNlJykpO1xuXG4gIGlmICh0eXBlb2YgaW5pdEtleWJvYXJkU2hvcnRjdXRzID09PSAnZnVuY3Rpb24nKSBpbml0S2V5Ym9hcmRTaG9ydGN1dHMoKTtcbiAgaWYgKHR5cGVvZiBpbml0RWFybHlQcmV2aWV3UGFuZWwgPT09ICdmdW5jdGlvbicpIGluaXRFYXJseVByZXZpZXdQYW5lbCgpO1xufVxuXG4vLyBUZXN0cyBub3cgaW1wb3J0IGhlbHBlciBmdW5jdGlvbnMgZnJvbSB0aGVpciBjYW5vbmljYWwgRVMgbW9kdWxlcyBkaXJlY3RseS5cblxuZXhwb3J0IHsgaW5pdCwgc2V0dXBFdmVudExpc3RlbmVycyB9O1xuIiwgIi8vIENvcHlyaWdodCAoQykgMjAyNiBHcmVnb3J5IFIuIFdhcm5lc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vL1xuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ1YtQnVpbGRlci5cbi8vIEZvciBjb21tZXJjaWFsIGxpY2Vuc2luZywgY29udGFjdCBncmVnQHdhcm5lcy1pbm5vdmF0aW9ucy5jb21cblxuLyoqXG4gKiB3ZWIvc3JjL21haW4uanMgXHUyMDE0IGVzYnVpbGQgZW50cnkgcG9pbnQgZm9yIHRoZSBmdWxsIGJyb3dzZXIgYnVuZGxlLlxuICpcbiAqIFBoYXNlIDIgbW9kdWxlczogdXRpbHMsIGFwaS1jbGllbnQsIHN0YXRlLW1hbmFnZXIsIHVpLWNvcmUsIGxheW91dC1pbnN0cnVjdGlvblxuICogUGhhc2UgMyBtb2R1bGVzOiBhbGwgZG9tYWluIHNwbGl0IG1vZHVsZXMgKFRpZXIgMFx1MjAxMzcpIGZyb20gdGhlIGFwcC5qcyBtb2R1bGFyaXNhdGlvbi5cbiAqXG4gKiBFdmVyeSBleHBvcnQgaXMgYXNzaWduZWQgdG8gYHdpbmRvd2Agc28gdGhhdCBsZWdhY3kgaW5saW5lIG9uY2xpY2s9XCJmbigpXCJcbiAqIGhhbmRsZXJzIGFuZCBhcHAuanMgY29udGludWUgdG8gd29yayB1bmNoYW5nZWQuXG4gKlxuICogQnVpbGQ6ICBucG0gcnVuIGJ1aWxkICAgICAgICAgIFx1MjE5MiB3ZWIvYnVuZGxlLmpzIChkZXZlbG9wbWVudCwgdW5taW5pZmllZClcbiAqICAgICAgICAgbnBtIHJ1biBidWlsZDpwcm9kICAgICBcdTIxOTIgd2ViL2J1bmRsZS5qcyAobWluaWZpZWQpXG4gKiAgICAgICAgIG5wbSBydW4gYnVpbGQ6d2F0Y2ggICAgXHUyMTkyIHJlYnVpbGQgb24gZXZlcnkgc291cmNlIGNoYW5nZVxuICovXG5cbi8vIFx1MjUwMFx1MjUwMCBMb2dnZXIgKG11c3QgYmUgZmlyc3Qgc28gbmFtZWQgbG9nZ2VycyBhcmUgYXZhaWxhYmxlIHRvIGFsbCBtb2R1bGVzKSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmltcG9ydCAqIGFzIExvZ2dlciBmcm9tICcuLi9sb2dnZXIuanMnO1xuXG4vLyBcdTI1MDBcdTI1MDAgUGhhc2UgMiAob3JpZ2luYWwgYnVuZGxlKSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmltcG9ydCAqIGFzIFV0aWxzICAgICAgICAgICAgIGZyb20gJy4uL3V0aWxzLmpzJztcbmltcG9ydCAqIGFzIEFwaUNsaWVudCAgICAgICAgIGZyb20gJy4uL2FwaS1jbGllbnQuanMnO1xuaW1wb3J0ICogYXMgU3RhdGUgICAgICAgICAgICAgZnJvbSAnLi4vc3RhdGUtbWFuYWdlci5qcyc7XG5pbXBvcnQgKiBhcyBQcm92aWRlckluZm8gICAgICBmcm9tICcuLi9wcm92aWRlci1pbmZvLmpzJztcbmltcG9ydCAqIGFzIFVpQ29yZSAgICAgICAgICAgIGZyb20gJy4uL3VpLWNvcmUuanMnO1xuaW1wb3J0ICogYXMgTGF5b3V0SW5zdHJ1Y3Rpb24gZnJvbSAnLi4vbGF5b3V0LWluc3RydWN0aW9uLmpzJztcblxuLy8gXHUyNTAwXHUyNTAwIFRpZXIgMCBcdTIwMTQgbm8gZGVwZW5kZW5jaWVzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuaW1wb3J0ICogYXMgVmFsaWRhdG9ycyAgICAgICAgICAgIGZyb20gJy4uL3ZhbGlkYXRvcnMuanMnO1xuaW1wb3J0ICogYXMgUmVjb21tZW5kYXRpb25IZWxwZXJzIGZyb20gJy4uL3JlY29tbWVuZGF0aW9uLWhlbHBlcnMuanMnO1xuaW1wb3J0ICogYXMgVWlIZWxwZXJzICAgICAgICAgICAgIGZyb20gJy4uL3VpLWhlbHBlcnMuanMnO1xuaW1wb3J0ICogYXMgUHJvcG9zYWxSZXZpZXcgICAgICAgIGZyb20gJy4uL3Byb3Bvc2FsLXJldmlldy5qcyc7XG5cbi8vIFx1MjUwMFx1MjUwMCBUaWVyIDEgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5pbXBvcnQgKiBhcyBGZXRjaFV0aWxzICAgZnJvbSAnLi4vZmV0Y2gtdXRpbHMuanMnO1xuaW1wb3J0ICogYXMgTWVzc2FnZVF1ZXVlIGZyb20gJy4uL21lc3NhZ2UtcXVldWUuanMnO1xuaW1wb3J0ICogYXMgTGxtTG9nICAgICAgIGZyb20gJy4uL2xsbS1sb2cuanMnO1xuXG4vLyBcdTI1MDBcdTI1MDAgVGllciAyIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuaW1wb3J0ICogYXMgQXV0aFByb3ZpZGVyICAgZnJvbSAnLi4vYXV0aC1wcm92aWRlci5qcyc7XG5pbXBvcnQgKiBhcyBBdHNSZWZpbmVtZW50ICBmcm9tICcuLi9hdHMtcmVmaW5lbWVudC5qcyc7XG5pbXBvcnQgKiBhcyBBdHNNb2RhbHMgICAgICBmcm9tICcuLi9hdHMtbW9kYWxzLmpzJztcbmltcG9ydCAqIGFzIFNlc3Npb25BY3Rpb25zIGZyb20gJy4uL3Nlc3Npb24tYWN0aW9ucy5qcyc7XG5pbXBvcnQgKiBhcyBKb2JBbmFseXNpcyAgICBmcm9tICcuLi9qb2ItYW5hbHlzaXMuanMnO1xuXG4vLyBcdTI1MDBcdTI1MDAgVGllciAzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuaW1wb3J0ICogYXMgR29hbHMgICAgICAgICAgIGZyb20gJy4uL2dvYWxzLmpzJztcbmltcG9ydCAqIGFzIFNlc3Npb25NYW5hZ2VyICBmcm9tICcuLi9zZXNzaW9uLW1hbmFnZXIuanMnO1xuaW1wb3J0ICogYXMgSm9iSW5wdXQgICAgICAgIGZyb20gJy4uL2pvYi1pbnB1dC5qcyc7XG5pbXBvcnQgKiBhcyBNZXNzYWdlRGlzcGF0Y2ggZnJvbSAnLi4vbWVzc2FnZS1kaXNwYXRjaC5qcyc7XG5pbXBvcnQgKiBhcyBRdWVzdGlvbnNQYW5lbCAgZnJvbSAnLi4vcXVlc3Rpb25zLXBhbmVsLmpzJztcblxuLy8gXHUyNTAwXHUyNTAwIFRpZXIgNCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmltcG9ydCAqIGFzIFJldmlld0ljb25zICAgIGZyb20gJy4uL3Jldmlldy1pY29ucy5qcyc7XG5pbXBvcnQgKiBhcyBSZXZpZXdUYWJsZUJhc2UgZnJvbSAnLi4vcmV2aWV3LXRhYmxlLWJhc2UuanMnO1xuXG4vLyBcdTI1MDBcdTI1MDAgVGllciA1IFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuaW1wb3J0ICogYXMgRXhwZXJpZW5jZVJldmlldyAgIGZyb20gJy4uL2V4cGVyaWVuY2UtcmV2aWV3LmpzJztcbmltcG9ydCAqIGFzIFNraWxsc1JldmlldyAgICAgICBmcm9tICcuLi9za2lsbHMtcmV2aWV3LmpzJztcbmltcG9ydCAqIGFzIEFjaGlldmVtZW50c1JldmlldyBmcm9tICcuLi9hY2hpZXZlbWVudHMtcmV2aWV3LmpzJztcbmltcG9ydCAqIGFzIFRhZ2xpbmVSZXZpZXcgICAgICBmcm9tICcuLi90YWdsaW5lLXJldmlldy5qcyc7XG5pbXBvcnQgKiBhcyBTdW1tYXJ5UmV2aWV3ICAgICAgZnJvbSAnLi4vc3VtbWFyeS1yZXZpZXcuanMnO1xuaW1wb3J0ICogYXMgUHVibGljYXRpb25zUmV2aWV3IGZyb20gJy4uL3B1YmxpY2F0aW9ucy1yZXZpZXcuanMnO1xuXG4vLyBcdTI1MDBcdTI1MDAgVGllciA2IFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuaW1wb3J0ICogYXMgUmV3cml0ZVJldmlldyAgICAgIGZyb20gJy4uL3Jld3JpdGUtcmV2aWV3LmpzJztcbmltcG9ydCAqIGFzIFNwZWxsQ2hlY2sgICAgICAgICBmcm9tICcuLi9zcGVsbC1jaGVjay5qcyc7XG5pbXBvcnQgKiBhcyBEb3dubG9hZFRhYiAgICAgICAgZnJvbSAnLi4vZG93bmxvYWQtdGFiLmpzJztcbmltcG9ydCAqIGFzIEZpbmFsR2VuZXJhdGUgICAgICBmcm9tICcuLi9maW5hbC1nZW5lcmF0ZS5qcyc7XG5pbXBvcnQgKiBhcyBXb3JrZmxvd1N0ZXBzICAgICAgZnJvbSAnLi4vd29ya2Zsb3ctc3RlcHMuanMnO1xuaW1wb3J0ICogYXMgTWFzdGVyRGF0YUFpVXBkYXRlIGZyb20gJy4uL21hc3Rlci1kYXRhLWFpLXVwZGF0ZS5qcyc7XG5pbXBvcnQgKiBhcyBNYXN0ZXJDdiAgICAgICAgICAgZnJvbSAnLi4vbWFzdGVyLWN2LmpzJztcbmltcG9ydCAqIGFzIENvdmVyTGV0dGVyICAgICAgICBmcm9tICcuLi9jb3Zlci1sZXR0ZXIuanMnO1xuaW1wb3J0ICogYXMgU2NyZWVuaW5nUXVlc3Rpb25zIGZyb20gJy4uL3NjcmVlbmluZy1xdWVzdGlvbnMuanMnO1xuaW1wb3J0ICogYXMgRmluYWxpc2UgICAgICAgICAgIGZyb20gJy4uL2ZpbmFsaXNlLmpzJztcbmltcG9ydCAqIGFzIEludGVydmlld1ByZXAgICAgICBmcm9tICcuLi9pbnRlcnZpZXctcHJlcC5qcyc7XG5pbXBvcnQgKiBhcyBUaGFua1lvdSAgICAgICAgICAgZnJvbSAnLi4vdGhhbmsteW91LmpzJztcbmltcG9ydCAqIGFzIEhhcnZlc3QgICAgICAgICAgICBmcm9tICcuLi9oYXJ2ZXN0LmpzJztcbmltcG9ydCAqIGFzIEVhcmx5UHJldmlld1BhbmVsICBmcm9tICcuLi9lYXJseS1wcmV2aWV3LXBhbmVsLmpzJztcblxuLy8gXHUyNTAwXHUyNTAwIFRpZXIgNyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmltcG9ydCAqIGFzIFNlc3Npb25Td2l0Y2hlclVpICBmcm9tICcuLi9zZXNzaW9uLXN3aXRjaGVyLXVpLmpzJztcbmltcG9ydCAqIGFzIEtleWJvYXJkU2hvcnRjdXRzICBmcm9tICcuLi9rZXlib2FyZC1zaG9ydGN1dHMuanMnO1xuXG4vLyBcdTI1MDBcdTI1MDAgQXBwIG9yY2hlc3RyYXRvciAoZm9sZGVkIGludG8gYnVuZGxlIFx1MjAxNCBHQVAtNjQpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuaW1wb3J0ICogYXMgQXBwIGZyb20gJy4uL2FwcC5qcyc7XG5cbi8vIFx1MjUwMFx1MjUwMCBBc3NpZ24gYWxsIGV4cG9ydHMgdG8gZ2xvYmFsVGhpcyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbi8vIFBoYXNlIDIgbW9kdWxlcyBmaXJzdDsgcGhhc2UgMyBkb21haW4gbW9kdWxlcyBmb2xsb3cgc28gZnVsbHktZmVhdHVyZWRcbi8vIGltcGxlbWVudGF0aW9ucyBvdmVycmlkZSBhbnkgcGxhY2Vob2xkZXIgc3R1YnMgKGUuZy4gc2hvd1Nlc3Npb25Db25mbGljdEJhbm5lclxuLy8gaW4gc2Vzc2lvbi1zd2l0Y2hlci11aSBvdmVycmlkZXMgdGhlIHNpbXBsZSBzdHViIGluIHVpLWNvcmUpLlxuT2JqZWN0LmFzc2lnbihnbG9iYWxUaGlzLFxuICBMb2dnZXIsIFV0aWxzLCBBcGlDbGllbnQsIFN0YXRlLCBQcm92aWRlckluZm8sIFVpQ29yZSwgTGF5b3V0SW5zdHJ1Y3Rpb24sXG4gIFZhbGlkYXRvcnMsIFJlY29tbWVuZGF0aW9uSGVscGVycywgVWlIZWxwZXJzLCBQcm9wb3NhbFJldmlldyxcbiAgRmV0Y2hVdGlscywgTWVzc2FnZVF1ZXVlLCBMbG1Mb2csXG4gIEF1dGhQcm92aWRlciwgQXRzUmVmaW5lbWVudCwgQXRzTW9kYWxzLCBTZXNzaW9uQWN0aW9ucywgSm9iQW5hbHlzaXMsXG4gIEdvYWxzLFxuICBTZXNzaW9uTWFuYWdlciwgSm9iSW5wdXQsIE1lc3NhZ2VEaXNwYXRjaCwgUXVlc3Rpb25zUGFuZWwsXG4gIFJldmlld1RhYmxlQmFzZSxcbiAgRXhwZXJpZW5jZVJldmlldywgU2tpbGxzUmV2aWV3LCBBY2hpZXZlbWVudHNSZXZpZXcsIFRhZ2xpbmVSZXZpZXcsIFN1bW1hcnlSZXZpZXcsIFB1YmxpY2F0aW9uc1JldmlldywgUmV2aWV3SWNvbnMsXG4gIFJld3JpdGVSZXZpZXcsIFNwZWxsQ2hlY2ssIERvd25sb2FkVGFiLCBGaW5hbEdlbmVyYXRlLCBXb3JrZmxvd1N0ZXBzLCBNYXN0ZXJEYXRhQWlVcGRhdGUsIE1hc3RlckN2LFxuICBDb3ZlckxldHRlciwgU2NyZWVuaW5nUXVlc3Rpb25zLCBGaW5hbGlzZSwgSW50ZXJ2aWV3UHJlcCwgVGhhbmtZb3UsIEhhcnZlc3QsIEVhcmx5UHJldmlld1BhbmVsLFxuICBTZXNzaW9uU3dpdGNoZXJVaSwgS2V5Ym9hcmRTaG9ydGN1dHMsXG4gIEFwcCxcbik7XG5cbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBBcHAuaW5pdCk7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFNQSxPQUFDLFNBQVUsTUFBTSxZQUFZO0FBQ3pCO0FBQ0EsWUFBSSxPQUFPLFdBQVcsY0FBYyxPQUFPLEtBQUs7QUFDNUMsaUJBQU8sVUFBVTtBQUFBLFFBQ3JCLFdBQVcsT0FBTyxXQUFXLFlBQVksT0FBTyxTQUFTO0FBQ3JELGlCQUFPLFVBQVUsV0FBVztBQUFBLFFBQ2hDLE9BQU87QUFDSCxlQUFLLE1BQU0sV0FBVztBQUFBLFFBQzFCO0FBQUEsTUFDSixHQUFFLFNBQU0sV0FBWTtBQUNoQjtBQUdBLFlBQUksT0FBTyxXQUFXO0FBQUEsUUFBQztBQUN2QixZQUFJLGdCQUFnQjtBQUNwQixZQUFJLE9BQVEsT0FBTyxXQUFXLGlCQUFtQixPQUFPLE9BQU8sY0FBYyxpQkFDekUsa0JBQWtCLEtBQUssT0FBTyxVQUFVLFNBQVM7QUFHckQsWUFBSSxhQUFhO0FBQUEsVUFDYjtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxRQUNKO0FBRUEsWUFBSSxpQkFBaUIsQ0FBQztBQUN0QixZQUFJLGdCQUFnQjtBQUdwQixpQkFBUyxXQUFXLEtBQUssWUFBWTtBQUNqQyxjQUFJLFNBQVMsSUFBSSxVQUFVO0FBQzNCLGNBQUksT0FBTyxPQUFPLFNBQVMsWUFBWTtBQUNuQyxtQkFBTyxPQUFPLEtBQUssR0FBRztBQUFBLFVBQzFCLE9BQU87QUFDSCxnQkFBSTtBQUNBLHFCQUFPLFNBQVMsVUFBVSxLQUFLLEtBQUssUUFBUSxHQUFHO0FBQUEsWUFDbkQsU0FBUyxHQUFHO0FBRVIscUJBQU8sV0FBVztBQUNkLHVCQUFPLFNBQVMsVUFBVSxNQUFNLE1BQU0sUUFBUSxDQUFDLEtBQUssU0FBUyxDQUFD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QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsVUE4RS9CLGtCQUFrQixNQUFNLENBQUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxVQWF6QiwwQkFBMEIsY0FBYyxDQUFDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxVQWlCekMsK0JBQStCLFlBQVksQ0FBQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxVQWtCNUMscUJBQXFCLFNBQVMsQ0FBQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBNGhCdkMsUUFBSSxDQUFDLFlBQVk7QUFDZixZQUFNLGVBQWU7QUFDckIsY0FBUSxpQkFBaUIsUUFBUSxFQUFFLFFBQVEsU0FBTztBQUNoRCxjQUFNLFdBQVcsSUFBSSxhQUFhLFNBQVMsS0FBSyxJQUFJLEtBQUs7QUFDekQsWUFBSSxhQUFhLEtBQUssT0FBTyxFQUFHO0FBQ2hDLFlBQUksV0FBVztBQUNmLFlBQUksTUFBTSxVQUFVO0FBQ3BCLFlBQUksTUFBTSxTQUFTO0FBQ25CLFlBQUksYUFBYSxTQUFTLCtEQUEwRDtBQUFBLE1BQ3RGLENBQUM7QUFBQSxJQUNIO0FBR0EscUJBQWlCO0FBQUEsRUFDbkI7QUFFQSxXQUFTLHdCQUF3QixJQUFJO0FBQ25DLFVBQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQztBQUMvQixVQUFNLFVBQVUsUUFBUSxXQUFXLENBQUM7QUFDcEMsVUFBTSxPQUFPO0FBQUEsTUFDWCxDQUFDLFFBQWEsR0FBRyxRQUFRLEVBQUU7QUFBQSxNQUMzQixDQUFDLFNBQWEsR0FBRyxTQUFTLEdBQUcsWUFBWSxFQUFFO0FBQUEsTUFDM0MsQ0FBQyxTQUFhLFFBQVEsU0FBUyxHQUFHLFNBQVMsRUFBRTtBQUFBLE1BQzdDLENBQUMsU0FBYSxRQUFRLFNBQVMsRUFBRTtBQUFBLE1BQ2pDLENBQUMsWUFBYSxRQUFRLFlBQVksRUFBRTtBQUFBLE1BQ3BDLENBQUMsV0FBYSxRQUFRLFdBQVcsRUFBRTtBQUFBLE1BQ25DLENBQUMsWUFBYSxDQUFDLFFBQVEsTUFBTSxRQUFRLEtBQUssRUFBRSxPQUFPLE9BQU8sRUFBRSxLQUFLLElBQUksQ0FBQztBQUFBLElBQ3hFLEVBQUUsT0FBTyxDQUFDLENBQUMsRUFBRUMsRUFBQyxNQUFNQSxFQUFDO0FBQ3JCLFFBQUksQ0FBQyxLQUFLLFFBQVE7QUFDaEIsYUFBTztBQUFBLElBQ1Q7QUFDQSxXQUFPLGdDQUFnQyxLQUFLO0FBQUEsTUFBSSxDQUFDLENBQUMsT0FBTyxLQUFLLE1BQzVELG9DQUFvQyxXQUFXLEtBQUssQ0FBQyxZQUFZLFdBQVcsS0FBSyxDQUFDO0FBQUEsSUFDcEYsRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUFBLEVBQ1o7QUFFQSxXQUFTLHVCQUF1QixhQUFhO0FBQzNDLFFBQUksQ0FBQyxZQUFZLFFBQVE7QUFDdkIsYUFBTztBQUFBLElBQ1Q7QUFDQSxVQUFNLE9BQU8sWUFBWSxJQUFJLENBQUMsS0FBSyxRQUFRO0FBQ3pDLFlBQU0sUUFBVSxXQUFXLElBQUksU0FBUyxFQUFFO0FBQzFDLFlBQU0sVUFBVSxXQUFXLElBQUksV0FBVyxFQUFFO0FBQzVDLFlBQU0sTUFBVSxJQUFJLFlBQVksQ0FBQztBQUNqQyxZQUFNLFdBQVcsV0FBVyxDQUFDLElBQUksTUFBTSxJQUFJLEtBQUssRUFBRSxPQUFPLE9BQU8sRUFBRSxLQUFLLElBQUksQ0FBQztBQUM1RSxZQUFNLFFBQVUsV0FBVyxDQUFDLElBQUksWUFBWSxJQUFJLFlBQVksU0FBUyxFQUFFLE9BQU8sT0FBTyxFQUFFLEtBQUssVUFBSyxDQUFDO0FBQ2xHLFlBQU0sWUFBWSxJQUFJLGdCQUFnQixDQUFDLEdBQUc7QUFDMUMsWUFBTSxRQUFRLFdBQVcsSUFBSSxNQUFNLEVBQUU7QUFDckMsYUFBTztBQUFBO0FBQUE7QUFBQSxvQkFHUyxLQUFLO0FBQUEseUNBQ2dCLE9BQU87QUFBQSxZQUNwQyxXQUFXLHVEQUFvRCxRQUFRLFlBQVksRUFBRTtBQUFBO0FBQUEseUVBRXhCLEtBQUs7QUFBQSx3RUFDTixRQUFRO0FBQUE7QUFBQSxvRUFFWixLQUFLO0FBQUEsNkNBQzVCLEtBQUs7QUFBQSxzRUFDb0IsV0FBVyxJQUFJLE1BQU0sRUFBRSxDQUFDLE9BQU8sS0FBSztBQUFBLCtDQUMzRCxLQUFLO0FBQUE7QUFBQTtBQUFBLElBR2xELENBQUMsRUFBRSxLQUFLLEVBQUU7QUFDVixXQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsZUFVTSxJQUFJO0FBQUE7QUFBQSxFQUVuQjtBQUVBLFdBQVMscUJBQXFCLFFBQVE7QUFDcEMsVUFBTSxpQkFBaUIsQ0FBQyxNQUFNO0FBQzVCLFVBQUksT0FBTyxNQUFNLFVBQVU7QUFDekIsZUFBTyxFQUFFLE1BQU0sR0FBRyxhQUFhLENBQUMsRUFBRTtBQUFBLE1BQ3BDO0FBQ0EsVUFBSSxLQUFLLE9BQU8sTUFBTSxVQUFVO0FBQzlCLGVBQU87QUFBQSxVQUNMLE1BQU0sRUFBRSxRQUFRO0FBQUEsVUFDaEIsYUFBYSxNQUFNLFFBQVEsRUFBRSxXQUFXLElBQUksRUFBRSxjQUFjLENBQUM7QUFBQSxRQUMvRDtBQUFBLE1BQ0Y7QUFDQSxhQUFPLEVBQUUsTUFBTSxPQUFPLEtBQUssRUFBRSxHQUFHLGFBQWEsQ0FBQyxFQUFFO0FBQUEsSUFDbEQ7QUFFQSxRQUFJLE1BQU0sUUFBUSxNQUFNLEdBQUc7QUFDekIsVUFBSSxDQUFDLE9BQU8sUUFBUTtBQUNsQixlQUFPO0FBQUEsTUFDVDtBQUNBLFlBQU0sUUFBUSxPQUFPLElBQUksT0FBSztBQUM1QixjQUFNLGFBQWEsZUFBZSxDQUFDO0FBQ25DLGNBQU0sT0FBTyxXQUFXLFdBQVcsSUFBSTtBQUN2QyxjQUFNLE1BQU0sV0FBVyxXQUFXLElBQUk7QUFDdEMsY0FBTSxRQUFRLFdBQVcsWUFBWSxTQUNqQyxrREFBa0QsV0FBVyxZQUFZLE1BQU0sa0JBQy9FO0FBQ0osY0FBTSxZQUFZLFdBQVcsS0FBSyxVQUFVLEVBQUUsTUFBTSxXQUFXLE1BQU0sYUFBYSxXQUFXLFlBQVksQ0FBQyxDQUFDO0FBQzNHLGVBQU8sNEJBQTRCLElBQUksR0FBRyxLQUFLLDJEQUEyRCxTQUFTLHVDQUF1QyxJQUFJLGtHQUF3RixHQUFHLDBDQUEwQyxJQUFJO0FBQUEsTUFDelMsQ0FBQyxFQUFFLEtBQUssRUFBRTtBQUNWLGFBQU8sc0NBQXNDLEtBQUs7QUFBQSxJQUNwRDtBQUNBLFFBQUksT0FBTyxXQUFXLFlBQVksV0FBVyxNQUFNO0FBQ2pELFlBQU0sT0FBTyxPQUFPLEtBQUssTUFBTTtBQUMvQixVQUFJLENBQUMsS0FBSyxRQUFRO0FBQ2hCLGVBQU87QUFBQSxNQUNUO0FBQ0EsYUFBTyxLQUFLLElBQUksWUFBVTtBQUN4QixjQUFNLFNBQVUsT0FBTyxNQUFNO0FBQzdCLGNBQU0sVUFBVyxPQUFPLFdBQVcsWUFBWSxPQUFPLFdBQVcsT0FBTyxXQUFXO0FBQ25GLGNBQU0sVUFBVyxNQUFNLFFBQVEsTUFBTSxJQUFJLFNBQ3hCLE1BQU0sUUFBUSxRQUFRLE1BQU0sSUFBSSxPQUFPLFNBQVMsQ0FBQztBQUNsRSxjQUFNLFFBQVUsUUFBUSxJQUFJLE9BQUs7QUFDL0IsZ0JBQU0sYUFBYSxlQUFlLENBQUM7QUFDbkMsZ0JBQU0sT0FBTyxXQUFXLFdBQVcsSUFBSTtBQUN2QyxnQkFBTSxRQUFRLFdBQVcsWUFBWSxTQUNqQyxrREFBa0QsV0FBVyxZQUFZLE1BQU0sa0JBQy9FO0FBQ0osZ0JBQU0sWUFBWSxXQUFXLEtBQUssVUFBVSxFQUFFLE1BQU0sV0FBVyxNQUFNLGFBQWEsV0FBVyxZQUFZLENBQUMsQ0FBQztBQUMzRyxpQkFBTyw0QkFBNEIsSUFBSSxHQUFHLEtBQUssMkRBQTJELFNBQVMsTUFBTSxXQUFXLE1BQU0sQ0FBQywrQkFBK0IsSUFBSSxrR0FBd0YsSUFBSSxPQUFPLFdBQVcsTUFBTSxDQUFDLGlDQUFpQyxJQUFJO0FBQUEsUUFDMVUsQ0FBQyxFQUFFLEtBQUssRUFBRTtBQUNWLGNBQU0sWUFBYSxXQUFXLE1BQU07QUFDcEMsY0FBTSxhQUFhLFdBQVcsT0FBTztBQUNyQyxlQUFPO0FBQUE7QUFBQTtBQUFBLGtEQUdxQyxVQUFVO0FBQUEsd0VBQ1ksU0FBUztBQUFBLDJDQUN0QyxVQUFVO0FBQUE7QUFBQSwrQ0FFTixTQUFTLGlGQUFpRjtBQUFBO0FBQUEsTUFFckksQ0FBQyxFQUFFLEtBQUssRUFBRTtBQUFBLElBQ1o7QUFDQSxXQUFPO0FBQUEsRUFDVDtBQUVBLFdBQVMscUJBQXFCLFdBQVc7QUFDdkMsUUFBSSxDQUFDLFVBQVUsUUFBUTtBQUNyQixhQUFPO0FBQUEsSUFDVDtBQUNBLFVBQU0sT0FBTyxVQUFVLElBQUksQ0FBQyxLQUFLLFFBQVE7QUFDdkMsWUFBTSxTQUFjLFdBQVcsSUFBSSxVQUFVLEVBQUU7QUFDL0MsWUFBTSxRQUFjLFdBQVcsSUFBSSxTQUFTLEVBQUU7QUFDOUMsWUFBTSxjQUFjLFdBQVcsSUFBSSxlQUFlLEVBQUU7QUFDcEQsWUFBTSxNQUFjLElBQUksWUFBWSxDQUFDO0FBQ3JDLFlBQU0sV0FBYyxXQUFXLENBQUMsSUFBSSxNQUFNLElBQUksS0FBSyxFQUFFLE9BQU8sT0FBTyxFQUFFLEtBQUssSUFBSSxDQUFDO0FBQy9FLFlBQU0sUUFBYyxDQUFDLElBQUksWUFBWSxJQUFJLFFBQVEsRUFBRSxPQUFPLE9BQU8sRUFBRSxLQUFLLFFBQUc7QUFDM0UsWUFBTSxVQUFVLFdBQVcsS0FBSyxVQUFVO0FBQUEsUUFDeEMsUUFBUSxJQUFJLFVBQVU7QUFBQSxRQUFJLE9BQU8sSUFBSSxTQUFTO0FBQUEsUUFBSSxhQUFhLElBQUksZUFBZTtBQUFBLFFBQ2xGLE1BQU0sSUFBSSxRQUFRO0FBQUEsUUFBSSxPQUFPLElBQUksU0FBUztBQUFBLFFBQzFDLFlBQVksSUFBSSxjQUFjO0FBQUEsUUFBSSxVQUFVLElBQUksWUFBWTtBQUFBLE1BQzlELENBQUMsQ0FBQztBQUNGLGFBQU87QUFBQTtBQUFBO0FBQUEsb0JBR1MsTUFBTSxHQUFHLFFBQVEsS0FBSyxLQUFLLEtBQUssRUFBRTtBQUFBLHlDQUNiLFdBQVc7QUFBQSxZQUN4QyxXQUFXLHVEQUFvRCxRQUFRLFlBQVksRUFBRTtBQUFBO0FBQUEseUVBRXhCLFNBQVMsUUFBRztBQUFBO0FBQUEsa0VBRW5CLE9BQU8sS0FBSyxHQUFHO0FBQUEsNENBQ3JDLFdBQVc7QUFBQSxvRUFDYSxHQUFHLE1BQU0sV0FBVztBQUFBLDhDQUMxQyxXQUFXO0FBQUE7QUFBQTtBQUFBLElBR3ZELENBQUMsRUFBRSxLQUFLLEVBQUU7QUFDVixXQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGVBU00sSUFBSTtBQUFBO0FBQUEsRUFFbkI7QUFPQSxNQUFJLGVBQWU7QUFDbkIsTUFBSSxlQUFlO0FBQ25CLE1BQUksZ0JBQWdCO0FBRXBCLE1BQUksMkJBQTJCO0FBRS9CLFdBQVMseUJBQXlCO0FBQ2hDLG1CQUFlLGlCQUFpQixTQUFTLFFBQVE7QUFDakQsYUFBUyxlQUFlLHNCQUFzQixFQUFFLE1BQU0sVUFBVSxpQkFBaUIsU0FBUyxLQUFLO0FBQy9GLGFBQVMsZUFBZSxxQkFBcUIsRUFBRSxNQUFNLFVBQVcsaUJBQWlCLFFBQVMsS0FBSztBQUMvRixhQUFTLGVBQWUsb0JBQW9CLEVBQUUsTUFBTSxVQUFZLGlCQUFpQixTQUFTLEtBQUs7QUFDL0YsVUFBTSxNQUFNLFNBQVMsZUFBZSx1QkFBdUI7QUFDM0QsUUFBSSxJQUFLLEtBQUksY0FBYyxpQkFBaUIsU0FBUyw0QkFBa0I7QUFDdkUsUUFBSSxpQkFBaUIsTUFBTyxxQkFBb0I7QUFBQSxFQUNsRDtBQUdBLGlCQUFlLG1CQUFtQjtBQUNoQyxRQUFJO0FBQ0YsWUFBTSxNQUFPLE1BQU0sTUFBTSwrQkFBK0I7QUFDeEQsWUFBTSxPQUFPLE1BQU0sSUFBSSxLQUFLO0FBQzVCLFVBQUksS0FBSyxJQUFJO0FBQ1gsb0NBQTRCLEtBQUssZ0JBQWdCLENBQUMsQ0FBQztBQUNuRCxjQUFNLEtBQUssU0FBUyxlQUFlLHFCQUFxQjtBQUN4RCxZQUFJLEdBQUksSUFBRyxRQUFRLEtBQUssV0FBVztBQUNuQyx3QkFBZ0IsS0FBSyxTQUFTLENBQUM7QUFBQSxNQUNqQyxPQUFPO0FBQ0wsaUJBQVMsZUFBZSwyQkFBMkIsRUFBRSxZQUNuRCx5REFBK0MsV0FBVyxLQUFLLFNBQVMsZ0JBQWdCLENBQUM7QUFBQSxNQUM3RjtBQUFBLElBQ0YsU0FBUyxLQUFLO0FBQ1osZUFBUyxlQUFlLDJCQUEyQixFQUFFLFlBQ25ELHlFQUErRCxXQUFXLElBQUksT0FBTyxDQUFDO0FBQUEsSUFDMUY7QUFBQSxFQUNGO0FBR0EsaUJBQWUsc0JBQXNCO0FBQ25DLFVBQU0sS0FBUyxTQUFTLGVBQWUscUJBQXFCO0FBQzVELFVBQU0sU0FBUyxTQUFTLGVBQWUsbUJBQW1CO0FBQzFELFFBQUksQ0FBQyxHQUFJO0FBQ1QsT0FBRyxXQUFjO0FBQ2pCLE9BQUcsY0FBYztBQUNqQixRQUFJLE9BQVEsUUFBTyxjQUFjO0FBQ2pDLFFBQUk7QUFDRixZQUFNLE1BQU8sTUFBTSxNQUFNLCtCQUErQjtBQUN4RCxZQUFNLE9BQU8sTUFBTSxJQUFJLEtBQUs7QUFDNUIsVUFBSSxLQUFLLElBQUk7QUFDWCxXQUFHLFFBQVEsS0FBSyxXQUFXO0FBQzNCLHdCQUFnQixLQUFLLFNBQVMsQ0FBQztBQUFBLE1BQ2pDLE9BQU87QUFDTCxZQUFJLE9BQVEsUUFBTyxjQUFjLG1CQUFTLEtBQUssU0FBUztBQUFBLE1BQzFEO0FBQUEsSUFDRixTQUFTLEtBQUs7QUFDWixVQUFJLE9BQVEsUUFBTyxjQUFjLGtDQUF3QixJQUFJO0FBQUEsSUFDL0QsVUFBRTtBQUNBLFNBQUcsV0FBYztBQUNqQixTQUFHLGNBQWM7QUFBQSxJQUNuQjtBQUFBLEVBQ0Y7QUFFQSxXQUFTLGdCQUFnQixHQUFHO0FBQzFCLFVBQU0sS0FBSyxTQUFTLGVBQWUsa0JBQWtCO0FBQ3JELFFBQUksR0FBSSxJQUFHLGNBQWMsR0FBRyxDQUFDLGVBQWUsTUFBTSxJQUFJLE1BQU0sRUFBRTtBQUFBLEVBQ2hFO0FBRUEsV0FBUyxzQkFBc0IsV0FBV0MsT0FBTSxRQUFRLFdBQVc7QUFDakUsVUFBTSxLQUFLLFNBQVMsZUFBZSxTQUFTO0FBQzVDLFFBQUksQ0FBQyxHQUFJO0FBQ1QsT0FBRyxjQUFjQTtBQUNqQixPQUFHLE1BQU0sUUFBUTtBQUFBLEVBQ25CO0FBRUEsV0FBUyx1QkFBdUIsTUFBTTtBQUNwQyxtQkFBZSxRQUFRO0FBQ3ZCLFNBQUssaUJBQWlCO0FBQUEsRUFDeEI7QUFFQSxXQUFTLHdCQUF3QixNQUFNO0FBQ3JDLG9CQUFnQixRQUFRO0FBQ3hCLFNBQUssaUJBQWlCO0FBQUEsRUFDeEI7QUFFQSxXQUFTLG9CQUFvQixLQUFLO0FBQ2hDLFVBQU0sVUFBVSxLQUFLLFFBQVEsUUFBUSxLQUFLLFFBQVE7QUFDbEQsVUFBTSxRQUFRLE9BQU8sT0FBTyxFQUFFLE1BQU0sT0FBTztBQUMzQyxXQUFPLFFBQVEsT0FBTyxNQUFNLENBQUMsQ0FBQyxJQUFJO0FBQUEsRUFDcEM7QUFFQSxXQUFTLHFCQUFxQixNQUFNLE9BQU87QUFDekMsVUFBTSxXQUFXLG9CQUFvQixJQUFJLEtBQUs7QUFDOUMsVUFBTSxZQUFZLG9CQUFvQixLQUFLLEtBQUs7QUFDaEQsVUFBTSxXQUFXLE9BQU8sTUFBTSxRQUFRLEVBQUUsRUFBRSxZQUFZO0FBQ3RELFVBQU0sWUFBWSxPQUFPLE9BQU8sUUFBUSxFQUFFLEVBQUUsWUFBWTtBQUN4RCxVQUFNLFVBQVUsT0FBTyxNQUFNLE9BQU8sRUFBRSxFQUFFLFlBQVk7QUFDcEQsVUFBTSxXQUFXLE9BQU8sT0FBTyxPQUFPLEVBQUUsRUFBRSxZQUFZO0FBRXRELFlBQVEsY0FBYztBQUFBLE1BQ3BCLEtBQUs7QUFDSCxlQUFRLFdBQVcsYUFBYyxTQUFTLGNBQWMsU0FBUyxLQUFLLFFBQVEsY0FBYyxRQUFRO0FBQUEsTUFDdEcsS0FBSztBQUNILGVBQU8sU0FBUyxjQUFjLFNBQVMsS0FBTSxZQUFZLFlBQWEsUUFBUSxjQUFjLFFBQVE7QUFBQSxNQUN0RyxLQUFLO0FBQ0gsZUFBTyxVQUFVLGNBQWMsUUFBUSxLQUFNLFlBQVksWUFBYSxRQUFRLGNBQWMsUUFBUTtBQUFBLE1BQ3RHLEtBQUs7QUFBQSxNQUNMO0FBQ0UsZUFBUSxZQUFZLFlBQWEsU0FBUyxjQUFjLFNBQVMsS0FBSyxRQUFRLGNBQWMsUUFBUTtBQUFBLElBQ3hHO0FBQUEsRUFDRjtBQUVBLFdBQVMsdUJBQXVCLEtBQUs7QUFDbkMsUUFBSSxrQkFBa0IsUUFBUTtBQUM1QixhQUFPLE9BQU8sb0JBQW9CLEdBQUcsS0FBSyxjQUFjO0FBQUEsSUFDMUQ7QUFDQSxRQUFJLGtCQUFrQixRQUFRO0FBQzVCLGFBQU8sS0FBSyxPQUFPLE9BQU8sSUFBSSxJQUFJLElBQUk7QUFBQSxJQUN4QztBQUNBLFdBQU87QUFBQSxFQUNUO0FBRUEsV0FBUyw0QkFBNEIsTUFBTTtBQUN6QyxVQUFNLFlBQVksU0FBUyxlQUFlLDJCQUEyQjtBQUNyRSxRQUFJLENBQUMsVUFBVztBQUNoQixVQUFNLGVBQWU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLHNDQUtlLGlCQUFpQixjQUFjLGFBQWEsRUFBRTtBQUFBLHFDQUMvQyxpQkFBaUIsYUFBYSxhQUFhLEVBQUU7QUFBQSxxQ0FDN0MsaUJBQWlCLGFBQWEsYUFBYSxFQUFFO0FBQUEsc0NBQzVDLGlCQUFpQixjQUFjLGFBQWEsRUFBRTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxpQ0FNbkQsa0JBQWtCLFNBQVMsYUFBYSxFQUFFO0FBQUEsaUNBQzFDLGtCQUFrQixTQUFTLGFBQWEsRUFBRTtBQUFBLGlDQUMxQyxrQkFBa0IsU0FBUyxhQUFhLEVBQUU7QUFBQTtBQUFBO0FBQUE7QUFJekUsUUFBSSxDQUFDLEtBQUssUUFBUTtBQUNoQixnQkFBVSxZQUFZLEdBQUcsWUFBWTtBQUNyQztBQUFBLElBQ0Y7QUFDQSxVQUFNLFNBQVMsQ0FBQyxHQUFHLElBQUksRUFBRSxLQUFLLG9CQUFvQjtBQUNsRCxVQUFNLFNBQVMsQ0FBQztBQUNoQixlQUFXLE9BQU8sUUFBUTtBQUN4QixZQUFNLFFBQVEsdUJBQXVCLEdBQUc7QUFDeEMsVUFBSSxRQUFRLE9BQU8sS0FBSyxDQUFDLFVBQVUsTUFBTSxVQUFVLEtBQUs7QUFDeEQsVUFBSSxDQUFDLE9BQU87QUFDVixnQkFBUSxFQUFFLE9BQU8sT0FBTyxDQUFDLEVBQUU7QUFDM0IsZUFBTyxLQUFLLEtBQUs7QUFBQSxNQUNuQjtBQUNBLFlBQU0sTUFBTSxLQUFLLEdBQUc7QUFBQSxJQUN0QjtBQUNBLFVBQU0sY0FBYyxPQUFPLElBQUksQ0FBQyxFQUFFLE9BQU8sTUFBTSxNQUFNO0FBQ25ELFlBQU0sY0FBYyxrQkFBa0IsU0FDbEMsS0FDQSxpRkFBaUYsV0FBVyxLQUFLLENBQUM7QUFDdEcsWUFBTSxPQUFPLE1BQU0sSUFBSSxTQUFPO0FBQzlCLGNBQU0sTUFBVyxXQUFXLElBQUksT0FBTyxFQUFFO0FBQ3pDLGNBQU0sT0FBVyxXQUFXLElBQUksUUFBUSxFQUFFO0FBQzFDLGNBQU0sV0FBVyxZQUFZLElBQUksc0JBQXNCLElBQUksTUFBTSxHQUFHLEdBQUcsQ0FBQztBQUN4RSxjQUFNLE9BQVcsSUFBSSxzQkFBc0I7QUFDM0MsY0FBTSxVQUFXLFdBQVcsS0FBSyxVQUFVLEdBQUcsQ0FBQztBQUMvQyxlQUFPO0FBQUE7QUFBQTtBQUFBLHlEQUc4QyxHQUFHO0FBQUEsWUFDaEQsV0FBVyxxQ0FBcUMsUUFBUSxHQUFHLEtBQUssU0FBUyxNQUFNLFdBQU0sRUFBRSxhQUFhLEVBQUU7QUFBQTtBQUFBLHdFQUUxQyxJQUFJO0FBQUE7QUFBQSxvRUFFUixPQUFPO0FBQUEsOENBQzdCLEdBQUc7QUFBQSx1RUFDc0IsR0FBRztBQUFBLGdEQUMxQixHQUFHO0FBQUE7QUFBQTtBQUFBLE1BRy9DLENBQUMsRUFBRSxLQUFLLEVBQUU7QUFDVixhQUFPLEdBQUcsV0FBVztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxlQVNWLElBQUk7QUFBQTtBQUFBLElBRWpCLENBQUMsRUFBRSxLQUFLLEVBQUU7QUFDVixjQUFVLFlBQVksR0FBRyxZQUFZLEdBQUcsV0FBVztBQUFBLEVBQ3JEO0FBR0EsaUJBQWUsMEJBQTBCO0FBQ3ZDLFVBQU0sS0FBUyxTQUFTLGVBQWUscUJBQXFCO0FBQzVELFVBQU0sU0FBUyxTQUFTLGVBQWUsbUJBQW1CO0FBQzFELFFBQUksQ0FBQyxNQUFNLENBQUMsT0FBUTtBQUNwQixVQUFNQSxRQUFPLEdBQUc7QUFDaEIsUUFBSSxDQUFDQSxNQUFLLEtBQUssR0FBRztBQUNoQixhQUFPLGNBQWM7QUFDckIsYUFBTyxNQUFNLFFBQVE7QUFDckI7QUFBQSxJQUNGO0FBQ0EsV0FBTyxjQUFjO0FBQ3JCLFdBQU8sTUFBTSxRQUFRO0FBQ3JCLFFBQUk7QUFDRixZQUFNLE1BQU8sTUFBTSxNQUFNLDBDQUEwQztBQUFBLFFBQ2pFLFFBQVM7QUFBQSxRQUNULFNBQVMsRUFBRSxnQkFBZ0IsbUJBQW1CO0FBQUEsUUFDOUMsTUFBUyxLQUFLLFVBQVUsRUFBRSxhQUFhQSxNQUFLLENBQUM7QUFBQSxNQUMvQyxDQUFDO0FBQ0QsWUFBTSxPQUFPLE1BQU0sSUFBSSxLQUFLO0FBQzVCLFVBQUksS0FBSyxJQUFJO0FBQ1gsY0FBTSxJQUFJLEtBQUssU0FBUztBQUN4QixlQUFPLGNBQWMsdUJBQWEsQ0FBQyxRQUFRLE1BQU0sSUFBSSxRQUFRLEdBQUc7QUFDaEUsZUFBTyxNQUFNLFFBQVE7QUFBQSxNQUN2QixPQUFPO0FBQ0wsZUFBTyxjQUFjLGFBQVEsS0FBSyxTQUFTO0FBQzNDLGVBQU8sTUFBTSxRQUFRO0FBQUEsTUFDdkI7QUFBQSxJQUNGLFNBQVMsS0FBSztBQUNaLGFBQU8sY0FBYyxZQUFPLElBQUk7QUFDaEMsYUFBTyxNQUFNLFFBQVE7QUFBQSxJQUN2QjtBQUFBLEVBQ0Y7QUFHQSxpQkFBZSxzQkFBc0I7QUFDbkMsVUFBTSxLQUFTLFNBQVMsZUFBZSxxQkFBcUI7QUFDNUQsVUFBTSxTQUFTLFNBQVMsZUFBZSxtQkFBbUI7QUFDMUQsVUFBTSxNQUFTLFNBQVMsZUFBZSxxQkFBcUI7QUFDNUQsUUFBSSxDQUFDLEdBQUk7QUFDVCxVQUFNLFVBQVUsR0FBRztBQUNuQixRQUFJLEtBQUs7QUFBRSxVQUFJLFdBQVc7QUFBTSxVQUFJLGNBQWM7QUFBQSxJQUFhO0FBQy9ELFFBQUksUUFBUTtBQUFFLGFBQU8sY0FBYztBQUFJLGFBQU8sTUFBTSxRQUFRO0FBQUEsSUFBVztBQUN2RSxRQUFJO0FBQ0YsWUFBTSxNQUFPLE1BQU0sTUFBTSxpQ0FBaUM7QUFBQSxRQUN4RCxRQUFTO0FBQUEsUUFDVCxTQUFTLEVBQUUsZ0JBQWdCLG1CQUFtQjtBQUFBLFFBQzlDLE1BQVMsS0FBSyxVQUFVLEVBQUUsUUFBUSxDQUFDO0FBQUEsTUFDckMsQ0FBQztBQUNELFlBQU0sT0FBTyxNQUFNLElBQUksS0FBSztBQUM1QixVQUFJLEtBQUssSUFBSTtBQUNYLGNBQU0sSUFBSSxLQUFLLFNBQVM7QUFDeEIsWUFBSSxRQUFRO0FBQ1YsaUJBQU8sY0FBYyx1QkFBYSxDQUFDLFFBQVEsTUFBTSxJQUFJLFFBQVEsR0FBRztBQUNoRSxpQkFBTyxNQUFNLFFBQVE7QUFBQSxRQUN2QjtBQUNBLHdCQUFnQixDQUFDO0FBQ2pCLCtCQUF1QixnQkFBZ0IsU0FBUztBQUVoRCxjQUFNLGlCQUFpQjtBQUFBLE1BQ3pCLE9BQU87QUFDTCxZQUFJLFFBQVE7QUFDVixpQkFBTyxjQUFjLGFBQVEsS0FBSyxTQUFTO0FBQzNDLGlCQUFPLE1BQU0sUUFBUTtBQUFBLFFBQ3ZCO0FBQUEsTUFDRjtBQUFBLElBQ0YsU0FBUyxLQUFLO0FBQ1osVUFBSSxRQUFRO0FBQ1YsZUFBTyxjQUFjLFlBQU8sSUFBSTtBQUNoQyxlQUFPLE1BQU0sUUFBUTtBQUFBLE1BQ3ZCO0FBQUEsSUFDRixVQUFFO0FBQ0EsVUFBSSxLQUFLO0FBQUUsWUFBSSxXQUFXO0FBQU8sWUFBSSxjQUFjO0FBQUEsTUFBVztBQUFBLElBQ2hFO0FBQUEsRUFDRjtBQUVBLFdBQVMsOEJBQThCO0FBQ3JDLGFBQVMsZUFBZSw0QkFBNEIsRUFBRSxRQUFRO0FBQzlELGFBQVMsZUFBZSw2QkFBNkIsRUFBRSxVQUFVO0FBQ2pFLDBCQUFzQiw0QkFBNEIsRUFBRTtBQUNwRCxhQUFTLGVBQWUsaUNBQWlDLEVBQUUsTUFBTSxVQUFVO0FBQzNFLGlDQUE2QixTQUFTO0FBQ3RDLG9CQUFnQixpQ0FBaUM7QUFDakQsY0FBVSxpQ0FBaUM7QUFBQSxFQUM3QztBQUVBLFdBQVMsK0JBQStCO0FBQ3RDLGFBQVMsZUFBZSxpQ0FBaUMsRUFBRSxNQUFNLFVBQVU7QUFDM0UsaUJBQWE7QUFBQSxFQUNmO0FBRUEsaUJBQWUsd0JBQXdCO0FBQ3JDLFVBQU0sV0FBVyxTQUFTLGVBQWUsNEJBQTRCO0FBQ3JFLFVBQU0sWUFBWSxTQUFTLGVBQWUsNkJBQTZCO0FBQ3ZFLFVBQU0sU0FBUyxTQUFTLGVBQWUsOEJBQThCO0FBQ3JFLFFBQUksQ0FBQyxTQUFVO0FBQ2YsVUFBTSxhQUFhLFNBQVMsTUFBTSxLQUFLO0FBQ3ZDLFFBQUksQ0FBQyxZQUFZO0FBQ2YsNEJBQXNCLDRCQUE0QixnREFBc0MsU0FBUztBQUNqRztBQUFBLElBQ0Y7QUFDQSxRQUFJLFFBQVE7QUFDVixhQUFPLFdBQVc7QUFDbEIsYUFBTyxjQUFjO0FBQUEsSUFDdkI7QUFDQSwwQkFBc0IsNEJBQTRCLHdCQUFtQjtBQUNyRSxRQUFJO0FBQ0YsWUFBTSxNQUFNLE1BQU0sTUFBTSx3Q0FBd0M7QUFBQSxRQUM5RCxRQUFRO0FBQUEsUUFDUixTQUFTLEVBQUUsZ0JBQWdCLG1CQUFtQjtBQUFBLFFBQzlDLE1BQU0sS0FBSyxVQUFVO0FBQUEsVUFDbkIsYUFBYTtBQUFBLFVBQ2IsV0FBVyxRQUFRLFdBQVcsT0FBTztBQUFBLFFBQ3ZDLENBQUM7QUFBQSxNQUNILENBQUM7QUFDRCxZQUFNLE9BQU8sTUFBTSxJQUFJLEtBQUs7QUFDNUIsVUFBSSxLQUFLLElBQUk7QUFDWCxjQUFNLFFBQVE7QUFBQSxVQUNaLEdBQUcsS0FBSyxTQUFTLENBQUM7QUFBQSxVQUNsQixHQUFHLEtBQUssV0FBVyxDQUFDO0FBQUEsVUFDcEIsR0FBRyxLQUFLLFdBQVcsQ0FBQztBQUFBLFFBQ3RCO0FBQ0EsWUFBSSxLQUFLLFFBQVMsT0FBTSxLQUFLLEdBQUcsS0FBSyxPQUFPLHFDQUFxQztBQUNqRixjQUFNLGdCQUFpQixLQUFLLGNBQWMsU0FDdEM7QUFBQTtBQUFBO0FBQUEsU0FBa0UsS0FBSyxhQUFhLEtBQUssV0FBTSxDQUFDLEtBQ2hHO0FBQ0osY0FBTSxnQkFBaUIsS0FBSyxjQUFjLFNBQ3RDO0FBQUE7QUFBQTtBQUFBLFNBQXFELEtBQUssYUFBYSxLQUFLLFdBQU0sQ0FBQyxLQUNuRjtBQUNKLDhCQUFzQiw0QkFBNEIsb0JBQWUsTUFBTSxLQUFLLElBQUksQ0FBQyxLQUFLLFNBQVM7QUFDL0YsK0JBQXVCLGdCQUFnQixVQUFVO0FBQ2pELGNBQU0saUJBQWlCO0FBQ3ZCLHVCQUFlLG1CQUFjLDRCQUE0QixNQUFNLEtBQUssSUFBSSxDQUFDLElBQUksYUFBYSxHQUFHLGFBQWEsRUFBRTtBQUM1RyxxQ0FBNkI7QUFBQSxNQUMvQixPQUFPO0FBQ0wsOEJBQXNCLDRCQUE0QixVQUFLLEtBQUssU0FBUyxlQUFlLElBQUksU0FBUztBQUFBLE1BQ25HO0FBQUEsSUFDRixTQUFTLEtBQUs7QUFDWiw0QkFBc0IsNEJBQTRCLFVBQUssSUFBSSxPQUFPLElBQUksU0FBUztBQUFBLElBQ2pGLFVBQUU7QUFDQSxVQUFJLFFBQVE7QUFDVixlQUFPLFdBQVc7QUFDbEIsZUFBTyxjQUFjO0FBQUEsTUFDdkI7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUVBLFdBQVMsK0JBQStCO0FBQ3RDLGFBQVMsZUFBZSwwQkFBMEIsRUFBRSxRQUFRO0FBQzVELGFBQVMsZUFBZSwyQkFBMkIsRUFBRSxRQUFRO0FBQzdELGFBQVMsZUFBZSw4QkFBOEIsRUFBRSxVQUFVO0FBQ2xFLDBCQUFzQiw2QkFBNkIsRUFBRTtBQUNyRCxhQUFTLGVBQWUsa0NBQWtDLEVBQUUsTUFBTSxVQUFVO0FBQzVFLGlDQUE2QixTQUFTO0FBQ3RDLG9CQUFnQixrQ0FBa0M7QUFDbEQsY0FBVSxrQ0FBa0M7QUFBQSxFQUM5QztBQUVBLFdBQVMsZ0NBQWdDO0FBQ3ZDLGFBQVMsZUFBZSxrQ0FBa0MsRUFBRSxNQUFNLFVBQVU7QUFDNUUsaUJBQWE7QUFBQSxFQUNmO0FBRUEsaUJBQWUseUJBQXlCO0FBQ3RDLFVBQU0sUUFBUSxTQUFTLGVBQWUsMEJBQTBCO0FBQ2hFLFVBQU0sU0FBUyxTQUFTLGVBQWUsMkJBQTJCO0FBQ2xFLFVBQU0sU0FBUyxTQUFTLGVBQWUsK0JBQStCO0FBQ3RFLFFBQUksQ0FBQyxTQUFTLENBQUMsT0FBUTtBQUN2QixVQUFNQSxRQUFPLE1BQU0sTUFBTSxLQUFLO0FBQzlCLFFBQUksQ0FBQ0EsT0FBTTtBQUNULDRCQUFzQiw2QkFBNkIsZ0RBQXNDLFNBQVM7QUFDbEc7QUFBQSxJQUNGO0FBQ0EsUUFBSSxRQUFRO0FBQ1YsYUFBTyxXQUFXO0FBQ2xCLGFBQU8sY0FBYztBQUFBLElBQ3ZCO0FBQ0EsMEJBQXNCLDZCQUE2QixpQ0FBNEI7QUFDL0UsUUFBSTtBQUNGLFlBQU0sTUFBTSxNQUFNLE1BQU0seUNBQXlDO0FBQUEsUUFDL0QsUUFBUTtBQUFBLFFBQ1IsU0FBUyxFQUFFLGdCQUFnQixtQkFBbUI7QUFBQSxRQUM5QyxNQUFNLEtBQUssVUFBVSxFQUFFLE1BQUFBLE1BQUssQ0FBQztBQUFBLE1BQy9CLENBQUM7QUFDRCxZQUFNLE9BQU8sTUFBTSxJQUFJLEtBQUs7QUFDNUIsVUFBSSxLQUFLLElBQUk7QUFDWCxlQUFPLFFBQVEsS0FBSyxVQUFVO0FBQzlCLDhCQUFzQiw2QkFBNkIsMkVBQXNFLFNBQVM7QUFBQSxNQUNwSSxPQUFPO0FBQ0wsOEJBQXNCLDZCQUE2QixVQUFLLEtBQUssU0FBUyxtQkFBbUIsSUFBSSxTQUFTO0FBQUEsTUFDeEc7QUFBQSxJQUNGLFNBQVMsS0FBSztBQUNaLDRCQUFzQiw2QkFBNkIsVUFBSyxJQUFJLE9BQU8sSUFBSSxTQUFTO0FBQUEsSUFDbEYsVUFBRTtBQUNBLFVBQUksUUFBUTtBQUNWLGVBQU8sV0FBVztBQUNsQixlQUFPLGNBQWM7QUFBQSxNQUN2QjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsaUJBQWUsaUNBQWlDO0FBQzlDLFVBQU0sU0FBUyxTQUFTLGVBQWUsMkJBQTJCO0FBQ2xFLFVBQU0sWUFBWSxTQUFTLGVBQWUsOEJBQThCO0FBQ3hFLFVBQU0sU0FBUyxTQUFTLGVBQWUsK0JBQStCO0FBQ3RFLFFBQUksQ0FBQyxPQUFRO0FBQ2IsVUFBTSxhQUFhLE9BQU8sTUFBTSxLQUFLO0FBQ3JDLFFBQUksQ0FBQyxZQUFZO0FBQ2YsNEJBQXNCLDZCQUE2QiwwREFBZ0QsU0FBUztBQUM1RztBQUFBLElBQ0Y7QUFDQSxRQUFJLFFBQVE7QUFDVixhQUFPLFdBQVc7QUFDbEIsYUFBTyxjQUFjO0FBQUEsSUFDdkI7QUFDQSwwQkFBc0IsNkJBQTZCLGlDQUE0QjtBQUMvRSxRQUFJO0FBQ0YsWUFBTSxNQUFNLE1BQU0sTUFBTSx3Q0FBd0M7QUFBQSxRQUM5RCxRQUFRO0FBQUEsUUFDUixTQUFTLEVBQUUsZ0JBQWdCLG1CQUFtQjtBQUFBLFFBQzlDLE1BQU0sS0FBSyxVQUFVO0FBQUEsVUFDbkIsYUFBYTtBQUFBLFVBQ2IsV0FBVyxRQUFRLFdBQVcsT0FBTztBQUFBLFFBQ3ZDLENBQUM7QUFBQSxNQUNILENBQUM7QUFDRCxZQUFNLE9BQU8sTUFBTSxJQUFJLEtBQUs7QUFDNUIsVUFBSSxLQUFLLElBQUk7QUFDWCxjQUFNLFFBQVE7QUFBQSxVQUNaLEdBQUcsS0FBSyxTQUFTLENBQUM7QUFBQSxVQUNsQixHQUFHLEtBQUssV0FBVyxDQUFDO0FBQUEsVUFDcEIsR0FBRyxLQUFLLFdBQVcsQ0FBQztBQUFBLFFBQ3RCO0FBQ0EsWUFBSSxLQUFLLFFBQVMsT0FBTSxLQUFLLEdBQUcsS0FBSyxPQUFPLHFDQUFxQztBQUNqRixjQUFNLGdCQUFpQixLQUFLLGNBQWMsU0FDdEM7QUFBQTtBQUFBO0FBQUEsU0FBa0UsS0FBSyxhQUFhLEtBQUssV0FBTSxDQUFDLEtBQ2hHO0FBQ0osY0FBTSxnQkFBaUIsS0FBSyxjQUFjLFNBQ3RDO0FBQUE7QUFBQTtBQUFBLFNBQXFELEtBQUssYUFBYSxLQUFLLFdBQU0sQ0FBQyxLQUNuRjtBQUNKLDhCQUFzQiw2QkFBNkIsNEJBQXVCLE1BQU0sS0FBSyxJQUFJLENBQUMsS0FBSyxTQUFTO0FBQ3hHLCtCQUF1QixnQkFBZ0IsVUFBVTtBQUNqRCxjQUFNLGlCQUFpQjtBQUN2Qix1QkFBZSxtQkFBYyw4QkFBOEIsTUFBTSxLQUFLLElBQUksQ0FBQyxJQUFJLGFBQWEsR0FBRyxhQUFhLEVBQUU7QUFDOUcsc0NBQThCO0FBQUEsTUFDaEMsT0FBTztBQUNMLDhCQUFzQiw2QkFBNkIsVUFBSyxLQUFLLFNBQVMsZUFBZSxJQUFJLFNBQVM7QUFBQSxNQUNwRztBQUFBLElBQ0YsU0FBUyxLQUFLO0FBQ1osNEJBQXNCLDZCQUE2QixVQUFLLElBQUksT0FBTyxJQUFJLFNBQVM7QUFBQSxJQUNsRixVQUFFO0FBQ0EsVUFBSSxRQUFRO0FBQ1YsZUFBTyxXQUFXO0FBQ2xCLGVBQU8sY0FBYztBQUFBLE1BQ3ZCO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFJQSxXQUFTLDBCQUEwQjtBQUNqQywrQkFBMkI7QUFDM0IsYUFBUyxlQUFlLGVBQWUsRUFBRSxRQUFXO0FBQ3BELGFBQVMsZUFBZSxnQkFBZ0IsRUFBRSxRQUFVO0FBQ3BELGFBQVMsZUFBZSxrQkFBa0IsRUFBRSxRQUFRO0FBQ3BELFVBQU0sY0FBYyxTQUFTLGVBQWUsd0JBQXdCO0FBQ3BFLFFBQUksWUFBYSxhQUFZLGNBQWM7QUFDM0MsYUFBUyxlQUFlLGlCQUFpQixFQUFFLFFBQVM7QUFDcEQsYUFBUyxlQUFlLGdCQUFnQixFQUFFLFFBQVU7QUFDcEQsYUFBUyxlQUFlLG1CQUFtQixFQUFFLFFBQVE7QUFDckQsYUFBUyxlQUFlLGVBQWUsRUFBRSxRQUFXO0FBQ3BELGFBQVMsZUFBZSxpQkFBaUIsRUFBRSxRQUFTO0FBQ3BELGFBQVMsZUFBZSxlQUFlLEVBQUUsV0FBVztBQUNwRCxhQUFTLGVBQWUseUJBQXlCLEVBQUUsY0FBYztBQUNqRSxhQUFTLGVBQWUsMEJBQTBCLEVBQUUsTUFBTSxVQUFVO0FBQ3BFLGlDQUE2QixTQUFTO0FBQ3RDLG9CQUFnQiwwQkFBMEI7QUFDMUMsY0FBVSwwQkFBMEI7QUFBQSxFQUN0QztBQUVBLFdBQVMsc0JBQXNCLEtBQUs7QUFDbEMsVUFBTSxTQUFTLElBQUksVUFBVSxDQUFDO0FBRTlCLCtCQUEyQixDQUFDLE9BQU8sVUFBVSxDQUFDLENBQUMsT0FBTztBQUN0RCxhQUFTLGVBQWUsZUFBZSxFQUFFLFFBQVksSUFBSSxPQUFPO0FBQ2hFLGFBQVMsZUFBZSxnQkFBZ0IsRUFBRSxRQUFXLElBQUksUUFBUTtBQUNqRSxhQUFTLGVBQWUsa0JBQWtCLEVBQUUsUUFBUyxPQUFPLFVBQVUsT0FBTyxVQUFVO0FBRXZGLFVBQU0sY0FBYyxTQUFTLGVBQWUsd0JBQXdCO0FBQ3BFLFFBQUksWUFBYSxhQUFZLGNBQWMsMkJBQTJCLGNBQWM7QUFDcEYsYUFBUyxlQUFlLGlCQUFpQixFQUFFLFFBQVUsT0FBTyxTQUFTO0FBQ3JFLGFBQVMsZUFBZSxnQkFBZ0IsRUFBRSxRQUFXLE9BQU8sUUFBUTtBQUNwRSxhQUFTLGVBQWUsbUJBQW1CLEVBQUUsUUFBUSxPQUFPLFdBQVcsT0FBTyxhQUFhO0FBQzNGLGFBQVMsZUFBZSxlQUFlLEVBQUUsUUFBWSxPQUFPLE9BQU87QUFFbkUsVUFBTSxRQUFRLG9CQUFJLElBQUksQ0FBQyxVQUFTLFVBQVMsU0FBUSxRQUFPLFdBQVUsYUFBWSxLQUFLLENBQUM7QUFDcEYsVUFBTSxRQUFRLE9BQU8sUUFBUSxNQUFNLEVBQ2hDLE9BQU8sQ0FBQyxDQUFDQyxFQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUlBLEVBQUMsQ0FBQyxFQUM3QixJQUFJLENBQUMsQ0FBQ0EsSUFBR0YsRUFBQyxNQUFNLEdBQUdFLEVBQUMsSUFBSUYsRUFBQyxFQUFFLEVBQzNCLEtBQUssSUFBSTtBQUNaLGFBQVMsZUFBZSxpQkFBaUIsRUFBRSxRQUFVO0FBQ3JELGFBQVMsZUFBZSxlQUFlLEVBQUUsV0FBWTtBQUNyRCxhQUFTLGVBQWUseUJBQXlCLEVBQUUsY0FBYztBQUNqRSxhQUFTLGVBQWUsMEJBQTBCLEVBQUUsTUFBTSxVQUFVO0FBQ3BFLGlDQUE2QixTQUFTO0FBQ3RDLG9CQUFnQiwwQkFBMEI7QUFDMUMsY0FBVSwwQkFBMEI7QUFBQSxFQUN0QztBQUVBLFdBQVMsd0JBQXdCO0FBQy9CLGFBQVMsZUFBZSwwQkFBMEIsRUFBRSxNQUFNLFVBQVU7QUFDcEUsaUJBQWE7QUFBQSxFQUNmO0FBRUEsaUJBQWUsd0JBQXdCO0FBQ3JDLFVBQU0sUUFBUyxTQUFTLGVBQWUsZUFBZTtBQUN0RCxVQUFNLE1BQVMsTUFBTSxNQUFNLEtBQUs7QUFDaEMsVUFBTSxTQUFTLE1BQU0sV0FBVyxXQUFXO0FBQzNDLFFBQUksQ0FBQyxLQUFLO0FBQUUscUJBQWUsMkJBQWlCLHVCQUF1QjtBQUFHO0FBQUEsSUFBUTtBQUM5RSxVQUFNLE9BQVMsU0FBUyxlQUFlLGdCQUFnQixFQUFFLE1BQU0sS0FBSyxLQUFLO0FBQ3pFLFVBQU0sU0FBUyxTQUFTLGVBQWUsa0JBQWtCLEVBQUUsTUFBTSxLQUFLO0FBQ3RFLFVBQU0sUUFBUyxTQUFTLGVBQWUsaUJBQWlCLEVBQUUsTUFBTSxLQUFLO0FBQ3JFLFVBQU0sT0FBUyxTQUFTLGVBQWUsZ0JBQWdCLEVBQUUsTUFBTSxLQUFLO0FBQ3BFLFFBQUksQ0FBQyxPQUFRO0FBQUUscUJBQWUsMkJBQWlCLG9CQUFvQjtBQUFHO0FBQUEsSUFBUTtBQUM5RSxRQUFJLENBQUMsTUFBUTtBQUFFLHFCQUFlLDJCQUFpQixtQkFBbUI7QUFBRztBQUFBLElBQVE7QUFDN0UsUUFBSSxDQUFDLFFBQVE7QUFBRSxxQkFBZSwyQkFBaUIsK0JBQStCO0FBQUc7QUFBQSxJQUFRO0FBRXpGLFVBQU0sU0FBUywyQkFBMkIsRUFBRSxRQUFRLFFBQVEsT0FBTyxLQUFLLElBQUksRUFBRSxRQUFRLE9BQU8sS0FBSztBQUNsRyxVQUFNLFVBQVUsU0FBUyxlQUFlLG1CQUFtQixFQUFFLE1BQU0sS0FBSztBQUN4RSxRQUFJLFNBQVM7QUFDWCxhQUFPLFNBQVMsa0JBQWtCLGNBQWMsU0FBUyxJQUFJO0FBQUEsSUFDL0Q7QUFDQSxVQUFNLE1BQU0sU0FBUyxlQUFlLGVBQWUsRUFBRSxNQUFNLEtBQUs7QUFDaEUsUUFBSSxJQUFLLFFBQU8sTUFBTTtBQUV0QixVQUFNLFFBQVEsU0FBUyxlQUFlLGlCQUFpQixFQUFFO0FBQ3pELGVBQVcsUUFBUSxNQUFNLE1BQU0sSUFBSSxHQUFHO0FBQ3BDLFlBQU0sS0FBSyxLQUFLLFFBQVEsR0FBRztBQUMzQixVQUFJLEtBQUssR0FBRztBQUNWLGNBQU1FLEtBQUksS0FBSyxNQUFNLEdBQUcsRUFBRSxFQUFFLEtBQUs7QUFDakMsY0FBTUYsS0FBSSxLQUFLLE1BQU0sS0FBSyxDQUFDLEVBQUUsS0FBSztBQUNsQyxZQUFJRSxNQUFLRixHQUFHLFFBQU9FLEVBQUMsSUFBSUY7QUFBQSxNQUMxQjtBQUFBLElBQ0Y7QUFDQSxVQUFNLE9BQU8sRUFBRSxRQUFRLEtBQUssTUFBTSxPQUFPO0FBQ3pDLFFBQUk7QUFDRixZQUFNLE1BQU8sTUFBTSxNQUFNLGdDQUFnQztBQUFBLFFBQ3ZELFFBQVE7QUFBQSxRQUFRLFNBQVMsRUFBRSxnQkFBZ0IsbUJBQW1CO0FBQUEsUUFBRyxNQUFNLEtBQUssVUFBVSxJQUFJO0FBQUEsTUFDNUYsQ0FBQztBQUNELFlBQU0sT0FBTyxNQUFNLElBQUksS0FBSztBQUM1QixVQUFJLEtBQUssSUFBSTtBQUNYLDhCQUFzQjtBQUN0QiwrQkFBdUIsZ0JBQWdCLEtBQUssVUFBVSxTQUFTO0FBQy9ELHVCQUFlLGdCQUFXLGdCQUFnQixHQUFHLEtBQUssS0FBSyxNQUFNLEdBQUc7QUFDaEUsY0FBTSxpQkFBaUI7QUFBQSxNQUN6QixPQUFPO0FBQ0wsdUJBQWUsZ0JBQVcsS0FBSyxTQUFTLGFBQWE7QUFBQSxNQUN2RDtBQUFBLElBQ0YsU0FBUyxHQUFHO0FBQ1YscUJBQWUsZ0JBQVcsNEJBQTRCO0FBQUEsSUFDeEQ7QUFBQSxFQUNGO0FBRUEsaUJBQWUsd0JBQXdCLEtBQUs7QUFDMUM7QUFBQSxNQUNFO0FBQUEsTUFDQSxXQUFXLEdBQUc7QUFBQSxNQUNkLFlBQVk7QUFDVixZQUFJO0FBQ0YsZ0JBQU0sTUFBTyxNQUFNLE1BQU0sZ0NBQWdDO0FBQUEsWUFDdkQsUUFBUTtBQUFBLFlBQVEsU0FBUyxFQUFFLGdCQUFnQixtQkFBbUI7QUFBQSxZQUM5RCxNQUFNLEtBQUssVUFBVSxFQUFFLFFBQVEsVUFBVSxJQUFJLENBQUM7QUFBQSxVQUNoRCxDQUFDO0FBQ0QsZ0JBQU0sT0FBTyxNQUFNLElBQUksS0FBSztBQUM1QixjQUFJLEtBQUssSUFBSTtBQUNYLG1DQUF1QixnQkFBZ0IsU0FBUztBQUNoRCwyQkFBZSxrQkFBYSxnQkFBZ0IsR0FBRyxZQUFZO0FBQzNELGtCQUFNLGlCQUFpQjtBQUFBLFVBQ3pCLE9BQU87QUFDTCwyQkFBZSxnQkFBVyxLQUFLLFNBQVMsZUFBZTtBQUFBLFVBQ3pEO0FBQUEsUUFDRixTQUFTLEdBQUc7QUFDVix5QkFBZSxnQkFBVyw4QkFBOEI7QUFBQSxRQUMxRDtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUVBLFdBQVMsa0JBQWtCLFFBQVE7QUFDakMsUUFBSSxDQUFDLE9BQU8sUUFBUTtBQUNsQixhQUFPO0FBQUEsSUFDVDtBQUNBLFVBQU0sT0FBTyxPQUFPLElBQUksQ0FBQyxPQUFPLFFBQVE7QUFDdEMsWUFBTSxRQUFRLFdBQVcsTUFBTSxTQUFTLEVBQUU7QUFDMUMsWUFBTSxPQUFRLE1BQU0sT0FBTyxPQUFPLE1BQU0sSUFBSSxJQUFJO0FBQ2hELFlBQU0sT0FBUSxZQUFZLE1BQU0sZUFBZSxJQUFJLE1BQU0sR0FBRyxHQUFHLENBQUM7QUFDaEUsWUFBTSxZQUFZLFdBQVcsS0FBSyxVQUFVO0FBQUEsUUFDMUMsT0FBTyxNQUFNLFNBQVM7QUFBQSxRQUFJLE1BQU0sTUFBTSxRQUFRO0FBQUEsUUFDOUMsYUFBYSxNQUFNLGVBQWU7QUFBQSxRQUNsQyxlQUFlLE1BQU0sZ0JBQWdCLENBQUMsR0FBRyxLQUFLLElBQUk7QUFBQSxNQUNwRCxDQUFDLENBQUM7QUFDRixhQUFPO0FBQUE7QUFBQTtBQUFBLG9CQUdTLEtBQUs7QUFBQSxZQUNiLE9BQU8scUNBQXFDLElBQUksSUFBSSxNQUFNLGVBQWEsSUFBSSxTQUFTLE1BQU0sV0FBTSxFQUFFLGFBQWEsRUFBRTtBQUFBO0FBQUEsdURBRXRFLElBQUk7QUFBQTtBQUFBLDhEQUVHLFNBQVMsS0FBSyxHQUFHO0FBQUEsd0NBQ3ZDLEtBQUs7QUFBQSxnRUFDbUIsR0FBRyxNQUFNLEtBQUs7QUFBQSwwQ0FDcEMsS0FBSztBQUFBO0FBQUE7QUFBQSxJQUc3QyxDQUFDLEVBQUUsS0FBSyxFQUFFO0FBQ1YsV0FBTztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxlQVNNLElBQUk7QUFBQTtBQUFBLEVBRW5CO0FBR0EsV0FBUywwQkFBMEIsT0FBTztBQUN4QyxRQUFJLENBQUMsTUFBTSxRQUFRO0FBQ2pCLGFBQU87QUFBQSxJQUNUO0FBQ0EsVUFBTSxPQUFPLE1BQU0sSUFBSSxDQUFDLE1BQU0sUUFBUTtBQUNwQyxZQUFNLE9BQVMsV0FBVyxLQUFLLFFBQVEsRUFBRTtBQUN6QyxZQUFNLFNBQVMsV0FBVyxLQUFLLFVBQVUsUUFBRztBQUM1QyxZQUFNLE9BQVMsS0FBSyxPQUFPLE9BQU8sS0FBSyxJQUFJLElBQUk7QUFDL0MsWUFBTSxXQUFXLFdBQVcsS0FBSyxVQUFVO0FBQUEsUUFDekMsTUFBTSxLQUFLLFFBQVE7QUFBQSxRQUFJLFFBQVEsS0FBSyxVQUFVO0FBQUEsUUFBSSxNQUFNLEtBQUssUUFBUTtBQUFBLE1BQ3ZFLENBQUMsQ0FBQztBQUNGLGFBQU87QUFBQTtBQUFBLHNCQUVXLElBQUk7QUFBQSxxQ0FDVyxNQUFNO0FBQUEsdURBQ1ksSUFBSTtBQUFBO0FBQUEsc0VBRVcsUUFBUSxLQUFLLEdBQUc7QUFBQSxnREFDdEMsSUFBSTtBQUFBLHdFQUNvQixHQUFHLE1BQU0sSUFBSTtBQUFBLGtEQUNuQyxJQUFJO0FBQUE7QUFBQTtBQUFBLElBR3BELENBQUMsRUFBRSxLQUFLLEVBQUU7QUFDVixXQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsZUFVTSxJQUFJO0FBQUE7QUFBQSxFQUVuQjtBQUdBLFdBQVMsK0JBQStCLGNBQWM7QUFDcEQsUUFBSSxDQUFDLGFBQWEsUUFBUTtBQUN4QixhQUFPO0FBQUEsSUFDVDtBQUNBLFFBQUksT0FBTyxhQUFhLElBQUksU0FBTztBQUNqQyxZQUFNLEtBQVUsV0FBVyxJQUFJLE1BQU0sRUFBRTtBQUN2QyxZQUFNLFFBQVUsV0FBVyxJQUFJLFNBQVMsRUFBRTtBQUMxQyxZQUFNLE9BQVUsWUFBWSxJQUFJLGVBQWUsSUFBSSxNQUFNLEdBQUcsR0FBRyxDQUFDO0FBQ2hFLFlBQU0sTUFBVSxJQUFJLGNBQWM7QUFDbEMsWUFBTSxTQUFVLFlBQVksSUFBSSxnQkFBZ0IsQ0FBQyxHQUFHLEtBQUssSUFBSSxDQUFDO0FBQzlELGFBQU87QUFBQTtBQUFBLHNCQUVXLEtBQUssWUFBWSxPQUFPLHFDQUFxQyxJQUFJLElBQUksSUFBSSxlQUFhLElBQUksU0FBUyxNQUFNLFdBQU0sRUFBRSxhQUFhLEVBQUU7QUFBQSx5Q0FDN0csR0FBRztBQUFBLHNEQUNVLFVBQVUsUUFBRztBQUFBO0FBQUEsb0VBRUMsV0FBVyxLQUFLLFVBQVUsRUFBQyxJQUFJLElBQUksTUFBSSxJQUFJLE9BQU8sSUFBSSxTQUFPLElBQUksYUFBYSxJQUFJLGVBQWEsSUFBSSxjQUFjLElBQUksZ0JBQWMsQ0FBQyxHQUFHLFlBQVksSUFBSSxjQUFZLEVBQUMsQ0FBQyxDQUFDLENBQUM7QUFBQSw4Q0FDN0wsS0FBSztBQUFBLHVFQUNvQixFQUFFLE9BQU8sS0FBSztBQUFBLGdEQUNyQyxLQUFLO0FBQUE7QUFBQTtBQUFBLElBR25ELENBQUMsRUFBRSxLQUFLLEVBQUU7QUFDVixXQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsZUFVTSxJQUFJO0FBQUE7QUFBQSxFQUVuQjtBQUVBLFdBQVMscUJBQXFCLFdBQVc7QUFDdkMsVUFBTSxPQUFPLE9BQU8sS0FBSyxTQUFTO0FBQ2xDLFFBQUksQ0FBQyxLQUFLLFFBQVE7QUFDaEIsYUFBTztBQUFBLElBQ1Q7QUFDQSxXQUFPLEtBQUssSUFBSSxTQUFPO0FBQ3JCLFlBQU1DLFFBQVUsT0FBTyxVQUFVLEdBQUcsTUFBTSxXQUFXLFVBQVUsR0FBRyxJQUFJLEtBQUssVUFBVSxVQUFVLEdBQUcsQ0FBQztBQUNuRyxZQUFNLFVBQVUsV0FBV0EsTUFBSyxNQUFNLEdBQUcsR0FBRyxDQUFDO0FBQzdDLFlBQU0sU0FBVSxXQUFXLEdBQUc7QUFDOUIsYUFBTztBQUFBO0FBQUE7QUFBQSw2Q0FHa0MsTUFBTTtBQUFBO0FBQUEsa0VBRWUsV0FBVyxLQUFLLFVBQVUsRUFBQyxLQUFLLE1BQUFBLE1BQUksQ0FBQyxDQUFDLENBQUM7QUFBQSw0Q0FDN0QsTUFBTTtBQUFBLHFFQUNtQixNQUFNO0FBQUEsOENBQzdCLE1BQU07QUFBQTtBQUFBO0FBQUEsOENBR04sT0FBTyxHQUFHQSxNQUFLLFNBQVMsTUFBTSxXQUFNLEVBQUU7QUFBQTtBQUFBLElBRWxGLENBQUMsRUFBRSxLQUFLLEVBQUU7QUFBQSxFQUNaO0FBRUEsV0FBUywwQkFBMEI7QUFDakMsYUFBUyxlQUFlLGNBQWMsRUFBRSxRQUFtQjtBQUMzRCxhQUFTLGVBQWUsdUJBQXVCLEVBQUUsUUFBVTtBQUMzRCxhQUFTLGVBQWUsc0JBQXNCLEVBQUUsUUFBVztBQUMzRCxhQUFTLGVBQWUsMEJBQTBCLEVBQUUsUUFBUTtBQUM1RCxhQUFTLGVBQWUsNEJBQTRCLEVBQUUsUUFBUTtBQUM5RCxhQUFTLGVBQWUsd0JBQXdCLEVBQUUsY0FBYztBQUNoRSxhQUFTLGVBQWUsMEJBQTBCLEVBQUUsTUFBTSxVQUFVO0FBQ3BFLGlDQUE2QixTQUFTO0FBQ3RDLG9CQUFnQiwwQkFBMEI7QUFDMUMsY0FBVSwwQkFBMEI7QUFDcEMsYUFBUyxlQUFlLHVCQUF1QixFQUFFLE1BQU07QUFBQSxFQUN6RDtBQUVBLFdBQVMsc0JBQXNCLEtBQUs7QUFDbEMsYUFBUyxlQUFlLGNBQWMsRUFBRSxRQUFxQixJQUFJLE1BQU07QUFDdkUsYUFBUyxlQUFlLHVCQUF1QixFQUFFLFFBQVksSUFBSSxTQUFTO0FBQzFFLGFBQVMsZUFBZSxzQkFBc0IsRUFBRSxRQUFhLElBQUksZUFBZTtBQUNoRixhQUFTLGVBQWUsMEJBQTBCLEVBQUUsU0FBVSxJQUFJLGdCQUFnQixDQUFDLEdBQUcsS0FBSyxJQUFJO0FBQy9GLGFBQVMsZUFBZSw0QkFBNEIsRUFBRSxRQUFRLElBQUksY0FBYztBQUNoRixhQUFTLGVBQWUsd0JBQXdCLEVBQUUsY0FBYztBQUNoRSxhQUFTLGVBQWUsMEJBQTBCLEVBQUUsTUFBTSxVQUFVO0FBQ3BFLGlDQUE2QixTQUFTO0FBQ3RDLG9CQUFnQiwwQkFBMEI7QUFDMUMsY0FBVSwwQkFBMEI7QUFBQSxFQUN0QztBQUVBLFdBQVMsc0JBQXNCO0FBQzdCLGFBQVMsZUFBZSwwQkFBMEIsRUFBRSxNQUFNLFVBQVU7QUFDcEUsaUJBQWE7QUFBQSxFQUNmO0FBRUEsaUJBQWUsd0JBQXdCO0FBQ3JDLFVBQU0sS0FBSyxTQUFTLGVBQWUsY0FBYyxFQUFFLE1BQU0sS0FBSyxLQUNuRCxRQUFRLEtBQUssSUFBSTtBQUM1QixVQUFNLFFBQWMsU0FBUyxlQUFlLHVCQUF1QixFQUFFLE1BQU0sS0FBSztBQUNoRixVQUFNLGNBQWMsU0FBUyxlQUFlLHNCQUFzQixFQUFFLE1BQU0sS0FBSztBQUMvRSxVQUFNLGNBQWMsU0FBUyxlQUFlLDBCQUEwQixFQUFFO0FBQ3hFLFVBQU0sYUFBYyxTQUFTLFNBQVMsZUFBZSw0QkFBNEIsRUFBRSxPQUFPLEVBQUUsS0FBSztBQUVqRyxRQUFJLENBQUMsT0FBTztBQUNWLHFCQUFlLDJCQUFpQixvQkFBb0I7QUFDcEQ7QUFBQSxJQUNGO0FBQ0EsVUFBTSxlQUFlLFlBQVksTUFBTSxHQUFHLEVBQUUsSUFBSSxPQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTyxPQUFPO0FBRTdFLFFBQUk7QUFDRixZQUFNLE1BQU0sTUFBTSxNQUFNLHVDQUF1QztBQUFBLFFBQzdELFFBQVM7QUFBQSxRQUNULFNBQVMsRUFBRSxnQkFBZ0IsbUJBQW1CO0FBQUEsUUFDOUMsTUFBUyxLQUFLLFVBQVUsRUFBRSxJQUFJLE9BQU8sYUFBYSxjQUFjLFdBQVcsQ0FBQztBQUFBLE1BQzlFLENBQUM7QUFDRCxZQUFNLE9BQU8sTUFBTSxJQUFJLEtBQUs7QUFDNUIsVUFBSSxLQUFLLElBQUk7QUFDWCw0QkFBb0I7QUFDcEIsK0JBQXVCLHlCQUF5QixLQUFLLFVBQVUsU0FBUztBQUN4RSx1QkFBZSxnQkFBVyxnQkFBZ0IsS0FBSyxLQUFLLEtBQUssTUFBTSxHQUFHO0FBQ2xFLGNBQU1MLG1CQUFrQjtBQUFBLE1BQzFCLE9BQU87QUFDTCx1QkFBZSxnQkFBVyxLQUFLLFNBQVMsYUFBYTtBQUFBLE1BQ3ZEO0FBQUEsSUFDRixTQUFTLEdBQUc7QUFDVixxQkFBZSxnQkFBVyw0QkFBNEI7QUFBQSxJQUN4RDtBQUFBLEVBQ0Y7QUFFQSxXQUFTLHNCQUFzQjtBQUM3QixhQUFTLGVBQWUscUJBQXFCLEVBQUUsUUFBUztBQUN4RCxhQUFTLGVBQWUsc0JBQXNCLEVBQUUsUUFBUTtBQUN4RCxhQUFTLGVBQWUsd0JBQXdCLEVBQUUsY0FBYztBQUNoRSxhQUFTLGVBQWUsMEJBQTBCLEVBQUUsTUFBTSxVQUFVO0FBQ3BFLGlDQUE2QixTQUFTO0FBQ3RDLG9CQUFnQiwwQkFBMEI7QUFDMUMsY0FBVSwwQkFBMEI7QUFBQSxFQUN0QztBQUVBLFdBQVMsa0JBQWtCLEtBQUs7QUFDOUIsYUFBUyxlQUFlLHFCQUFxQixFQUFFLFFBQVMsSUFBSSxPQUFRO0FBQ3BFLGFBQVMsZUFBZSxzQkFBc0IsRUFBRSxRQUFRLElBQUksUUFBUTtBQUNwRSxhQUFTLGVBQWUsd0JBQXdCLEVBQUUsY0FBYztBQUNoRSxhQUFTLGVBQWUsMEJBQTBCLEVBQUUsTUFBTSxVQUFVO0FBQ3BFLGlDQUE2QixTQUFTO0FBQ3RDLG9CQUFnQiwwQkFBMEI7QUFDMUMsY0FBVSwwQkFBMEI7QUFBQSxFQUN0QztBQUVBLFdBQVMsc0JBQXNCO0FBQzdCLGFBQVMsZUFBZSwwQkFBMEIsRUFBRSxNQUFNLFVBQVU7QUFDcEUsaUJBQWE7QUFBQSxFQUNmO0FBRUEsaUJBQWUsb0JBQW9CO0FBQ2pDLFVBQU0sTUFBTyxTQUFTLGVBQWUscUJBQXFCLEVBQUUsTUFBTSxLQUFLO0FBQ3ZFLFVBQU1LLFFBQU8sU0FBUyxlQUFlLHNCQUFzQixFQUFFLE1BQU0sS0FBSztBQUN4RSxRQUFJLENBQUMsT0FBTyxDQUFDQSxPQUFNO0FBQ2pCLHFCQUFlLDJCQUFpQix5Q0FBeUM7QUFDekU7QUFBQSxJQUNGO0FBQ0EsUUFBSTtBQUNGLFlBQU0sTUFBTSxNQUFNLE1BQU0sbUNBQW1DO0FBQUEsUUFDekQsUUFBUztBQUFBLFFBQ1QsU0FBUyxFQUFFLGdCQUFnQixtQkFBbUI7QUFBQSxRQUM5QyxNQUFTLEtBQUssVUFBVSxFQUFFLEtBQUssTUFBQUEsTUFBSyxDQUFDO0FBQUEsTUFDdkMsQ0FBQztBQUNELFlBQU0sT0FBTyxNQUFNLElBQUksS0FBSztBQUM1QixVQUFJLEtBQUssSUFBSTtBQUNYLDRCQUFvQjtBQUNwQiwrQkFBdUIsMEJBQTBCLEtBQUssVUFBVSxTQUFTO0FBQ3pFLHVCQUFlLGdCQUFXLFlBQVksR0FBRyxLQUFLLEtBQUssTUFBTSxHQUFHO0FBQzVELGNBQU1MLG1CQUFrQjtBQUFBLE1BQzFCLE9BQU87QUFDTCx1QkFBZSxnQkFBVyxLQUFLLFNBQVMsYUFBYTtBQUFBLE1BQ3ZEO0FBQUEsSUFDRixTQUFTLEdBQUc7QUFDVixxQkFBZSxnQkFBVyx3QkFBd0I7QUFBQSxJQUNwRDtBQUFBLEVBQ0Y7QUFJQSxXQUFTLDRCQUE0QjtBQUNuQyxVQUFNLHVCQUF1QixFQUMxQixLQUFLLE9BQUssRUFBRSxLQUFLLENBQUMsRUFDbEIsS0FBSyxVQUFRO0FBQ1osWUFBTSxLQUFVLEtBQUssaUJBQWlCLENBQUM7QUFDdkMsWUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDO0FBQy9CLFlBQU0sVUFBVSxRQUFRLFdBQVcsQ0FBQztBQUNwQyxlQUFTLGVBQWUsZUFBZSxFQUFFLFFBQVcsR0FBRyxRQUFRO0FBQy9ELGVBQVMsZUFBZSxnQkFBZ0IsRUFBRSxRQUFVLEdBQUcsU0FBUyxHQUFHLFlBQVk7QUFDL0UsZUFBUyxlQUFlLGdCQUFnQixFQUFFLFFBQVUsUUFBUSxTQUFTLEdBQUcsU0FBUztBQUNqRixlQUFTLGVBQWUsZ0JBQWdCLEVBQUUsUUFBVSxRQUFRLFNBQVM7QUFDckUsZUFBUyxlQUFlLG1CQUFtQixFQUFFLFFBQVEsUUFBUSxZQUFZO0FBQ3pFLGVBQVMsZUFBZSxrQkFBa0IsRUFBRSxRQUFTLFFBQVEsV0FBVztBQUN4RSxlQUFTLGVBQWUsZUFBZSxFQUFFLFFBQVcsUUFBUSxRQUFRO0FBQ3BFLGVBQVMsZUFBZSxnQkFBZ0IsRUFBRSxRQUFVLFFBQVEsU0FBUztBQUNyRSxlQUFTLGVBQWUseUJBQXlCLEVBQUUsTUFBTSxVQUFVO0FBQ25FLG1DQUE2QixTQUFTO0FBQ3RDLHNCQUFnQix5QkFBeUI7QUFDekMsZ0JBQVUseUJBQXlCO0FBQUEsSUFDckMsQ0FBQyxFQUNBLE1BQU0sTUFBTSxlQUFlLGdCQUFXLDhCQUE4QixDQUFDO0FBQUEsRUFDMUU7QUFFQSxXQUFTLHlCQUF5QjtBQUNoQyxhQUFTLGVBQWUseUJBQXlCLEVBQUUsTUFBTSxVQUFVO0FBQ25FLGlCQUFhO0FBQUEsRUFDZjtBQUVBLGlCQUFlLG1CQUFtQjtBQUNoQyxVQUFNLE9BQU87QUFBQSxNQUNYLE1BQVUsU0FBUyxlQUFlLGVBQWUsRUFBRSxNQUFNLEtBQUs7QUFBQSxNQUM5RCxPQUFVLFNBQVMsZUFBZSxnQkFBZ0IsRUFBRSxNQUFNLEtBQUs7QUFBQSxNQUMvRCxPQUFVLFNBQVMsZUFBZSxnQkFBZ0IsRUFBRSxNQUFNLEtBQUs7QUFBQSxNQUMvRCxPQUFVLFNBQVMsZUFBZSxnQkFBZ0IsRUFBRSxNQUFNLEtBQUs7QUFBQSxNQUMvRCxVQUFVLFNBQVMsZUFBZSxtQkFBbUIsRUFBRSxNQUFNLEtBQUs7QUFBQSxNQUNsRSxTQUFVLFNBQVMsZUFBZSxrQkFBa0IsRUFBRSxNQUFNLEtBQUs7QUFBQSxNQUNqRSxNQUFVLFNBQVMsZUFBZSxlQUFlLEVBQUUsTUFBTSxLQUFLO0FBQUEsTUFDOUQsT0FBVSxTQUFTLGVBQWUsZ0JBQWdCLEVBQUUsTUFBTSxLQUFLO0FBQUEsSUFDakU7QUFDQSxRQUFJO0FBQ0YsWUFBTSxNQUFPLE1BQU0sTUFBTSxrQ0FBa0M7QUFBQSxRQUN6RCxRQUFRO0FBQUEsUUFBUSxTQUFTLEVBQUUsZ0JBQWdCLG1CQUFtQjtBQUFBLFFBQUcsTUFBTSxLQUFLLFVBQVUsSUFBSTtBQUFBLE1BQzVGLENBQUM7QUFDRCxZQUFNLE9BQU8sTUFBTSxJQUFJLEtBQUs7QUFDNUIsVUFBSSxLQUFLLElBQUk7QUFDWCwrQkFBdUI7QUFDdkIsK0JBQXVCLHdCQUF3QixTQUFTO0FBQ3hELHVCQUFlLGdCQUFXLCtCQUErQjtBQUN6RCxjQUFNQSxtQkFBa0I7QUFBQSxNQUMxQixPQUFPO0FBQ0wsdUJBQWUsZ0JBQVcsS0FBSyxTQUFTLGFBQWE7QUFBQSxNQUN2RDtBQUFBLElBQ0YsU0FBUyxHQUFHO0FBQ1YscUJBQWUsZ0JBQVcsOEJBQThCO0FBQUEsSUFDMUQ7QUFBQSxFQUNGO0FBSUEsV0FBUyx5QkFBeUI7QUFDaEMsYUFBUyxlQUFlLGNBQWMsRUFBRSxRQUFlO0FBQ3ZELGFBQVMsZUFBZSxpQkFBaUIsRUFBRSxRQUFZO0FBQ3ZELGFBQVMsZUFBZSxtQkFBbUIsRUFBRSxRQUFVO0FBQ3ZELGFBQVMsZUFBZSxnQkFBZ0IsRUFBRSxRQUFhO0FBQ3ZELGFBQVMsZUFBZSxpQkFBaUIsRUFBRSxRQUFZO0FBQ3ZELGFBQVMsZUFBZSxpQkFBaUIsRUFBRSxRQUFZO0FBQ3ZELGFBQVMsZUFBZSxlQUFlLEVBQUUsUUFBYztBQUN2RCxhQUFTLGVBQWUsZ0JBQWdCLEVBQUUsUUFBYTtBQUN2RCxhQUFTLGVBQWUsc0JBQXNCLEVBQUUsUUFBUTtBQUN4RCxhQUFTLGVBQWUsZ0JBQWdCLEVBQUUsUUFBYTtBQUN2RCxhQUFTLGVBQWUsd0JBQXdCLEVBQUUsY0FBYztBQUNoRSxhQUFTLGVBQWUsMEJBQTBCLEVBQUUsTUFBTSxVQUFVO0FBQ3BFLGtDQUE4QixDQUFDO0FBQy9CLGlDQUE2QjtBQUM3QixpQ0FBNkIsU0FBUztBQUN0QyxvQkFBZ0IsMEJBQTBCO0FBQzFDLGNBQVUsMEJBQTBCO0FBQUEsRUFDdEM7QUFPQSxNQUFJLDhCQUE4QixDQUFDO0FBRW5DLFdBQVMsaUJBQWlCLEdBQUc7QUFDM0IsV0FBTyxPQUFPLE1BQU0sV0FBVyxJQUFLLEtBQUssRUFBRSxRQUFTO0FBQUEsRUFDdEQ7QUFFQSxXQUFTLCtCQUErQjtBQUN0QyxVQUFNLFlBQVksU0FBUyxlQUFlLDhCQUE4QjtBQUN4RSxRQUFJLENBQUMsVUFBVztBQUNoQixVQUFNLFVBQVUsNEJBQTRCLFNBQVM7QUFDckQsY0FBVSxZQUFZLDRCQUE0QixJQUFJLENBQUMsS0FBSyxRQUFRO0FBQUE7QUFBQSwyRUFFSyxHQUFHO0FBQUEsbUJBQzNELFdBQVcsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDLDZCQUE2QixNQUFNLENBQUM7QUFBQSw0RUFDWixHQUFHO0FBQUEseUNBQ3RDLE1BQU0sQ0FBQyx3QkFBd0IsUUFBUSxJQUFJLGFBQWEsRUFBRTtBQUFBLDRFQUN2QixHQUFHO0FBQUEseUNBQ3RDLE1BQU0sQ0FBQyw0QkFBNEIsUUFBUSxVQUFVLGFBQWEsRUFBRTtBQUFBLDhFQUMvQixHQUFHO0FBQUEsMkNBQ3RDLE1BQU0sQ0FBQztBQUFBLFdBQ3ZDLEVBQUUsS0FBSyxFQUFFLEtBQUs7QUFBQSxFQUN6QjtBQUtBLFdBQVMsaUNBQWlDO0FBQ3hDLGFBQVMsaUJBQWlCLHFCQUFxQixFQUFFLFFBQVEsQ0FBQyxVQUFVO0FBQ2xFLFlBQU0sTUFBTSxTQUFTLE1BQU0sUUFBUSxLQUFLLEVBQUU7QUFDMUMsWUFBTSxNQUFNLDRCQUE0QixHQUFHO0FBQzNDLFVBQUksT0FBTyxRQUFRLFlBQVksT0FBTyxNQUFNO0FBQzFDLG9DQUE0QixHQUFHLElBQUksTUFBTTtBQUFBLE1BQzNDLE9BQU87QUFDTCxZQUFJLE9BQU8sTUFBTTtBQUFBLE1BQ25CO0FBQUEsSUFDRixDQUFDO0FBQUEsRUFDSDtBQUVBLFdBQVMscUJBQXFCO0FBQzVCLFVBQU0sUUFBUSxTQUFTLGVBQWUsbUJBQW1CO0FBQ3pELFVBQU1LLFNBQVEsTUFBTSxTQUFTLElBQUksS0FBSztBQUN0QyxRQUFJLENBQUNBLE1BQU07QUFDWCxtQ0FBK0I7QUFDL0IsZ0NBQTRCLEtBQUtBLEtBQUk7QUFDckMsVUFBTSxRQUFRO0FBQ2QsaUNBQTZCO0FBQUEsRUFDL0I7QUFFQSxXQUFTLG9CQUFvQixLQUFLLE9BQU87QUFDdkMsbUNBQStCO0FBQy9CLFVBQU0sU0FBUyxNQUFNO0FBQ3JCLFFBQUksU0FBUyxLQUFLLFVBQVUsNEJBQTRCLE9BQVE7QUFDaEUsVUFBTSxDQUFDLElBQUksSUFBSSw0QkFBNEIsT0FBTyxLQUFLLENBQUM7QUFDeEQsZ0NBQTRCLE9BQU8sUUFBUSxHQUFHLElBQUk7QUFDbEQsaUNBQTZCO0FBQUEsRUFDL0I7QUFFQSxXQUFTLHNCQUFzQixLQUFLO0FBQ2xDLG1DQUErQjtBQUMvQixnQ0FBNEIsT0FBTyxLQUFLLENBQUM7QUFDekMsaUNBQTZCO0FBQUEsRUFDL0I7QUFFQSxXQUFTLHFCQUFxQixJQUFJO0FBQ2hDLFVBQU0sT0FBTyxPQUFPLDZCQUE2QixDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUU7QUFDNUUsUUFBSSxDQUFDLEtBQUs7QUFDUixxQkFBZSxnQkFBVyxxRUFBZ0U7QUFDMUY7QUFBQSxJQUNGO0FBQ0EsVUFBTSxNQUFNLElBQUksWUFBWSxDQUFDO0FBQzdCLGFBQVMsZUFBZSxjQUFjLEVBQUUsUUFBZ0IsSUFBSSxNQUFNO0FBQ2xFLGFBQVMsZUFBZSxpQkFBaUIsRUFBRSxRQUFhLElBQUksU0FBUztBQUNyRSxhQUFTLGVBQWUsbUJBQW1CLEVBQUUsUUFBVyxJQUFJLFdBQVc7QUFDdkUsYUFBUyxlQUFlLGdCQUFnQixFQUFFLFFBQWMsSUFBSSxRQUFRO0FBQ3BFLGFBQVMsZUFBZSxpQkFBaUIsRUFBRSxRQUFhLElBQUksU0FBUztBQUNyRSxhQUFTLGVBQWUsaUJBQWlCLEVBQUUsUUFBYSxJQUFJLGNBQWM7QUFDMUUsYUFBUyxlQUFlLGVBQWUsRUFBRSxRQUFlLElBQUksWUFBWTtBQUN4RSxhQUFTLGVBQWUsZ0JBQWdCLEVBQUUsUUFBYyxJQUFJLG1CQUFtQjtBQUMvRSxhQUFTLGVBQWUsc0JBQXNCLEVBQUUsUUFBUyxJQUFJLGNBQWM7QUFDM0UsYUFBUyxlQUFlLGdCQUFnQixFQUFFLFFBQWMsT0FBTyxJQUFJLFNBQVMsV0FBVyxJQUFJLFFBQ2pDLElBQUksUUFBUSxDQUFDLEdBQUcsS0FBSyxJQUFJO0FBQ25GLGFBQVMsZUFBZSx3QkFBd0IsRUFBRSxjQUFjO0FBQ2hFLGFBQVMsZUFBZSwwQkFBMEIsRUFBRSxNQUFNLFVBQVU7QUFDcEUsa0NBQThCLEtBQUssTUFBTSxLQUFLLFVBQVUsSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7QUFDL0UsaUNBQTZCO0FBQzdCLGlDQUE2QixTQUFTO0FBQ3RDLG9CQUFnQiwwQkFBMEI7QUFDMUMsY0FBVSwwQkFBMEI7QUFBQSxFQUN0QztBQUVBLFdBQVMsdUJBQXVCO0FBQzlCLGFBQVMsZUFBZSwwQkFBMEIsRUFBRSxNQUFNLFVBQVU7QUFDcEUsaUJBQWE7QUFBQSxFQUNmO0FBRUEsaUJBQWUsdUJBQXVCO0FBQ3BDLFVBQU0sS0FBUyxTQUFTLGVBQWUsY0FBYyxFQUFFLE1BQU0sS0FBSztBQUNsRSxVQUFNLFFBQVMsU0FBUyxlQUFlLGlCQUFpQixFQUFFLE1BQU0sS0FBSztBQUNyRSxVQUFNLFVBQVUsU0FBUyxlQUFlLG1CQUFtQixFQUFFLE1BQU0sS0FBSztBQUN4RSxRQUFJLENBQUMsU0FBUyxDQUFDLFNBQVM7QUFDdEIscUJBQWUsMkJBQWlCLHFDQUFxQztBQUNyRTtBQUFBLElBQ0Y7QUFDQSxVQUFNLFVBQVUsU0FBUyxlQUFlLGdCQUFnQixFQUFFO0FBQzFELG1DQUErQjtBQUMvQixVQUFNLFVBQVU7QUFBQSxNQUNkO0FBQUEsTUFBTztBQUFBLE1BQ1AsTUFBaUIsU0FBUyxlQUFlLGdCQUFnQixFQUFFLE1BQU0sS0FBSztBQUFBLE1BQ3RFLE9BQWlCLFNBQVMsZUFBZSxpQkFBaUIsRUFBRSxNQUFNLEtBQUs7QUFBQSxNQUN2RSxZQUFpQixTQUFTLGVBQWUsaUJBQWlCLEVBQUUsTUFBTSxLQUFLO0FBQUEsTUFDdkUsVUFBaUIsU0FBUyxlQUFlLGVBQWUsRUFBRSxNQUFNLEtBQUs7QUFBQSxNQUNyRSxpQkFBaUIsU0FBUyxlQUFlLGdCQUFnQixFQUFFO0FBQUEsTUFDM0QsWUFBaUIsU0FBUyxTQUFTLGVBQWUsc0JBQXNCLEVBQUUsT0FBTyxFQUFFLEtBQUs7QUFBQSxNQUN4RixNQUFpQixRQUFRLE1BQU0sR0FBRyxFQUFFLElBQUksT0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFLE9BQU8sT0FBTztBQUFBLE1BQ3JFLGNBQWlCO0FBQUEsSUFDbkI7QUFDQSxVQUFNLFNBQVMsS0FBSyxXQUFXO0FBQy9CLFVBQU0sT0FBUyxXQUFXLFdBQVcsRUFBRSxRQUFRLElBQUksWUFBWSxRQUFRLElBQUksRUFBRSxRQUFRLFlBQVksUUFBUTtBQUN6RyxRQUFJO0FBQ0YsWUFBTSxNQUFPLE1BQU0sTUFBTSwrQkFBK0I7QUFBQSxRQUN0RCxRQUFRO0FBQUEsUUFBUSxTQUFTLEVBQUUsZ0JBQWdCLG1CQUFtQjtBQUFBLFFBQUcsTUFBTSxLQUFLLFVBQVUsSUFBSTtBQUFBLE1BQzVGLENBQUM7QUFDRCxZQUFNLE9BQU8sTUFBTSxJQUFJLEtBQUs7QUFDNUIsVUFBSSxLQUFLLElBQUk7QUFDWCw2QkFBcUI7QUFDckIsK0JBQXVCLG1CQUFtQixLQUFLLFVBQVUsU0FBUztBQUNsRSx1QkFBZSxnQkFBVyxlQUFlLEtBQUssS0FBSyxLQUFLLE1BQU0sR0FBRztBQUNqRSxjQUFNTCxtQkFBa0I7QUFBQSxNQUMxQixPQUFPO0FBQ0wsdUJBQWUsZ0JBQVcsS0FBSyxTQUFTLGFBQWE7QUFBQSxNQUN2RDtBQUFBLElBQ0YsU0FBUyxHQUFHO0FBQ1YscUJBQWUsZ0JBQVcsMkJBQTJCO0FBQUEsSUFDdkQ7QUFBQSxFQUNGO0FBRUEsaUJBQWUsdUJBQXVCLElBQUksT0FBTztBQUMvQztBQUFBLE1BQ0U7QUFBQSxNQUNBLFdBQVcsS0FBSztBQUFBLE1BQ2hCLFlBQVk7QUFDVixZQUFJO0FBQ0YsZ0JBQU0sTUFBTyxNQUFNLE1BQU0sK0JBQStCO0FBQUEsWUFDdEQsUUFBUTtBQUFBLFlBQVEsU0FBUyxFQUFFLGdCQUFnQixtQkFBbUI7QUFBQSxZQUM5RCxNQUFNLEtBQUssVUFBVSxFQUFFLFFBQVEsVUFBVSxHQUFHLENBQUM7QUFBQSxVQUMvQyxDQUFDO0FBQ0QsZ0JBQU0sT0FBTyxNQUFNLElBQUksS0FBSztBQUM1QixjQUFJLEtBQUssSUFBSTtBQUNYLG1DQUF1QixtQkFBbUIsS0FBSyxVQUFVLFNBQVM7QUFDbEUsMkJBQWUsa0JBQWEsZUFBZSxLQUFLLFlBQVk7QUFDNUQsa0JBQU1BLG1CQUFrQjtBQUFBLFVBQzFCLE9BQU87QUFDTCwyQkFBZSxnQkFBVyxLQUFLLFNBQVMsZUFBZTtBQUFBLFVBQ3pEO0FBQUEsUUFDRixTQUFTLEdBQUc7QUFDVix5QkFBZSxnQkFBVyw2QkFBNkI7QUFBQSxRQUN6RDtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUlBLFdBQVMsa0JBQWtCLGFBQWEsUUFBUTtBQUM5QyxhQUFTLGVBQWUsc0JBQXNCLEVBQUUsUUFBUSxlQUFlO0FBQ3ZFLGFBQVMsZUFBZSxxQkFBcUIsRUFBRSxRQUFTLFNBQVMsTUFBTTtBQUN2RSxhQUFTLGVBQWUsMkJBQTJCLEVBQUUsUUFBUTtBQUM3RCxhQUFTLGVBQWUsa0JBQWtCLEVBQUUsUUFBWTtBQUN4RCxhQUFTLGVBQWUseUJBQXlCLEVBQUUsUUFBUTtBQUMzRCxhQUFTLGVBQWUscUJBQXFCLEVBQUUsUUFBUztBQUN4RCxhQUFTLGVBQWUsbUJBQW1CLEVBQUUsUUFBVztBQUN4RCxhQUFTLGVBQWUsMEJBQTBCLEVBQUUsY0FBYztBQUNsRSxhQUFTLGVBQWUsdUJBQXVCLEVBQUUsY0FBYztBQUMvRCxVQUFNLFNBQVMsT0FBTyw0QkFBNEIsQ0FBQyxHQUNoRCxNQUFNLEdBQUcsQ0FBQyxFQUNWLElBQUksQ0FBQ0csT0FBTSxHQUFHQSxHQUFFLEVBQUUsS0FBS0EsR0FBRSxLQUFLLEdBQUcsRUFDakMsS0FBSyxRQUFLO0FBQ2IsYUFBUyxlQUFlLHdCQUF3QixFQUFFLGNBQWMsUUFBUSxjQUFjLEtBQUssS0FBSztBQUNoRyxVQUFNLFNBQVMsU0FBUyxlQUFlLG9CQUFvQjtBQUMzRCxRQUFJLGFBQWE7QUFDZixlQUFTLGVBQWUsd0JBQXdCLEVBQUUsY0FBYztBQUNoRSxhQUFPLE1BQU0sVUFBVTtBQUFBLElBQ3pCLE9BQU87QUFDTCxhQUFPLE1BQU0sVUFBVTtBQUFBLElBQ3pCO0FBQ0EsYUFBUyxlQUFlLDRCQUE0QixFQUFFLE1BQU0sVUFBVTtBQUN0RSxpQ0FBNkIsU0FBUztBQUN0QyxvQkFBZ0IsNEJBQTRCO0FBQzVDLGNBQVUsNEJBQTRCO0FBQ3RDLGFBQVMsZUFBZSxrQkFBa0IsRUFBRSxNQUFNO0FBQUEsRUFDcEQ7QUFFQSxXQUFTLGdCQUFnQixVQUFVLGFBQWEsUUFBUTtBQUN0RCxVQUFNLE9BQU8sT0FBTyxhQUFhLFdBQVcsV0FBWSxVQUFVLFFBQVE7QUFDMUUsVUFBTSxjQUFjLE1BQU0sUUFBUSxVQUFVLFdBQVcsSUFBSSxTQUFTLGNBQWMsQ0FBQztBQUNuRixVQUFNLFVBQVUsTUFBTSxRQUFRLFVBQVUsT0FBTyxJQUFJLFNBQVMsVUFBVSxDQUFDO0FBQ3ZFLFVBQU0sUUFBUyxPQUFPLGFBQWEsWUFBWSxVQUFVLFNBQVMsT0FBUSxTQUFTLFFBQVE7QUFFM0YsYUFBUyxlQUFlLHNCQUFzQixFQUFFLFFBQVEsZUFBZTtBQUN2RSxhQUFTLGVBQWUscUJBQXFCLEVBQUUsUUFBUyxTQUFTLE1BQU07QUFDdkUsYUFBUyxlQUFlLDJCQUEyQixFQUFFLFFBQVE7QUFDN0QsYUFBUyxlQUFlLGtCQUFrQixFQUFFLFFBQVE7QUFDcEQsYUFBUyxlQUFlLHlCQUF5QixFQUFFLFFBQVEsWUFBWSxLQUFLLElBQUk7QUFDaEYsYUFBUyxlQUFlLHFCQUFxQixFQUFFLFFBQVEsUUFBUSxLQUFLLElBQUk7QUFDeEUsYUFBUyxlQUFlLG1CQUFtQixFQUFFLFFBQVE7QUFDckQsYUFBUyxlQUFlLDBCQUEwQixFQUFFLGNBQWM7QUFDbEUsYUFBUyxlQUFlLHVCQUF1QixFQUFFLGNBQWM7QUFFL0QsVUFBTSxTQUFTLE9BQU8sNEJBQTRCLENBQUMsR0FDaEQsTUFBTSxHQUFHLENBQUMsRUFDVixJQUFJLENBQUNBLE9BQU0sR0FBR0EsR0FBRSxFQUFFLEtBQUtBLEdBQUUsS0FBSyxHQUFHLEVBQ2pDLEtBQUssUUFBSztBQUNiLGFBQVMsZUFBZSx3QkFBd0IsRUFBRSxjQUFjLFFBQVEsY0FBYyxLQUFLLEtBQUs7QUFFaEcsVUFBTSxTQUFTLFNBQVMsZUFBZSxvQkFBb0I7QUFDM0QsUUFBSSxhQUFhO0FBQ2YsZUFBUyxlQUFlLHdCQUF3QixFQUFFLGNBQWM7QUFDaEUsYUFBTyxNQUFNLFVBQVU7QUFBQSxJQUN6QixPQUFPO0FBQ0wsYUFBTyxNQUFNLFVBQVU7QUFBQSxJQUN6QjtBQUVBLGFBQVMsZUFBZSw0QkFBNEIsRUFBRSxNQUFNLFVBQVU7QUFDdEUsaUNBQTZCLFNBQVM7QUFDdEMsb0JBQWdCLDRCQUE0QjtBQUM1QyxjQUFVLDRCQUE0QjtBQUN0QyxhQUFTLGVBQWUsa0JBQWtCLEVBQUUsTUFBTTtBQUFBLEVBQ3BEO0FBRUEsV0FBUyxrQkFBa0I7QUFDekIsYUFBUyxlQUFlLDRCQUE0QixFQUFFLE1BQU0sVUFBVTtBQUN0RSxpQkFBYTtBQUFBLEVBQ2Y7QUFFQSxpQkFBZSxrQkFBa0I7QUFDL0IsVUFBTSxRQUFXLFNBQVMsZUFBZSxrQkFBa0IsRUFBRSxNQUFNLEtBQUs7QUFDeEUsVUFBTSxXQUFXLFNBQVMsZUFBZSxzQkFBc0IsRUFBRSxNQUFNLEtBQUs7QUFDNUUsVUFBTSxTQUFXLFNBQVMsZUFBZSxxQkFBcUIsRUFBRSxVQUFVO0FBQzFFLFVBQU0sV0FBVyxTQUFTLGVBQWUsMkJBQTJCLEVBQUUsTUFBTSxLQUFLO0FBQ2pGLFVBQU0sY0FBYyxTQUFTLGVBQWUseUJBQXlCLEVBQUUsTUFDcEUsTUFBTSxHQUFHLEVBQ1QsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFDbkIsT0FBTyxPQUFPO0FBQ2pCLFVBQU0sVUFBVSxTQUFTLGVBQWUscUJBQXFCLEVBQUUsTUFDNUQsTUFBTSxHQUFHLEVBQ1QsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFDbkIsT0FBTyxPQUFPO0FBQ2pCLFVBQU0sV0FBVyxTQUFTLGVBQWUsbUJBQW1CLEVBQUUsTUFBTSxLQUFLO0FBQ3pFLFVBQU0sUUFBUSxhQUFhLEtBQUssT0FBTyxXQUFXLFFBQVE7QUFDMUQsUUFBSSxDQUFDLE9BQU87QUFDVixxQkFBZSwyQkFBaUIseUJBQXlCO0FBQ3pEO0FBQUEsSUFDRjtBQUNBLFFBQUksVUFBVSxRQUFRLENBQUMsT0FBTyxTQUFTLEtBQUssR0FBRztBQUM3QyxxQkFBZSwyQkFBaUIsOENBQThDO0FBQzlFO0FBQUEsSUFDRjtBQUNBLFVBQU0sV0FBVyxRQUFRLFFBQVE7QUFDakMsVUFBTSxXQUFXO0FBQUEsTUFDZixRQUFRLFdBQVcsV0FBVztBQUFBLE1BQzlCLE9BQU8sV0FBVyxXQUFXO0FBQUEsTUFDN0IsR0FBSSxXQUFXLEVBQUUsV0FBVyxNQUFNLElBQUksQ0FBQztBQUFBLE1BQ3ZDO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNGO0FBQ0EsVUFBTSxPQUFPLFNBQVMsV0FBVyxFQUFFLEdBQUcsVUFBVSxTQUFTO0FBQ3pELFFBQUk7QUFDRixZQUFNLE1BQU8sTUFBTSxNQUFNLDBCQUEwQjtBQUFBLFFBQ2pELFFBQVE7QUFBQSxRQUFRLFNBQVMsRUFBRSxnQkFBZ0IsbUJBQW1CO0FBQUEsUUFBRyxNQUFNLEtBQUssVUFBVSxJQUFJO0FBQUEsTUFDNUYsQ0FBQztBQUNELFlBQU0sT0FBTyxNQUFNLElBQUksS0FBSztBQUM1QixVQUFJLEtBQUssSUFBSTtBQUNYLHdCQUFnQjtBQUNoQiwrQkFBdUIsVUFBVSxLQUFLLFVBQVUsU0FBUztBQUN6RCxjQUFNSCxtQkFBa0I7QUFBQSxNQUMxQixPQUFPO0FBQ0wsdUJBQWUsZ0JBQVcsS0FBSyxTQUFTLHFCQUFxQjtBQUFBLE1BQy9EO0FBQUEsSUFDRixTQUFTLEdBQUc7QUFDVixxQkFBZSxnQkFBVyxxQkFBcUI7QUFBQSxJQUNqRDtBQUFBLEVBQ0Y7QUFFQSxpQkFBZSxrQkFBa0IsT0FBTyxVQUFVLFFBQVE7QUFDeEQsVUFBTSxPQUFPLFNBQVMsRUFBRSxRQUFRLFVBQVUsTUFBTSxJQUFJLEVBQUUsUUFBUSxVQUFVLE9BQU8sU0FBUztBQUN4RixVQUFNLFFBQVEsU0FBUyxXQUFXLGlCQUFZLFFBQVE7QUFDdEQ7QUFBQSxNQUNFO0FBQUEsTUFDQSxpQkFBaUIsS0FBSyxVQUFVLEtBQUs7QUFBQSxNQUNyQyxZQUFZO0FBQ1YsWUFBSTtBQUNGLGdCQUFNLE1BQU8sTUFBTSxNQUFNLDBCQUEwQjtBQUFBLFlBQ2pELFFBQVE7QUFBQSxZQUFRLFNBQVMsRUFBRSxnQkFBZ0IsbUJBQW1CO0FBQUEsWUFBRyxNQUFNLEtBQUssVUFBVSxJQUFJO0FBQUEsVUFDNUYsQ0FBQztBQUNELGdCQUFNLE9BQU8sTUFBTSxJQUFJLEtBQUs7QUFDNUIsY0FBSSxLQUFLLElBQUk7QUFDWCxtQ0FBdUIsVUFBVSxLQUFLLFVBQVUsU0FBUztBQUN6RCxrQkFBTUEsbUJBQWtCO0FBQUEsVUFDMUIsT0FBTztBQUNMLDJCQUFlLGdCQUFXLEtBQUssU0FBUyx3QkFBd0I7QUFBQSxVQUNsRTtBQUFBLFFBQ0YsU0FBUyxHQUFHO0FBQ1YseUJBQWUsZ0JBQVcsd0JBQXdCO0FBQUEsUUFDcEQ7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFJQSxXQUFTLHdCQUF3QjtBQUMvQixhQUFTLGVBQWUsZUFBZSxFQUFFLFFBQW1CO0FBQzVELGFBQVMsZUFBZSxrQkFBa0IsRUFBRSxRQUFnQjtBQUM1RCxhQUFTLGVBQWUsaUJBQWlCLEVBQUUsUUFBaUI7QUFDNUQsYUFBUyxlQUFlLHVCQUF1QixFQUFFLFFBQVc7QUFDNUQsYUFBUyxlQUFlLGdCQUFnQixFQUFFLFFBQWtCO0FBQzVELGFBQVMsZUFBZSxpQkFBaUIsRUFBRSxRQUFpQjtBQUM1RCxhQUFTLGVBQWUsc0JBQXNCLEVBQUUsUUFBWTtBQUM1RCxhQUFTLGVBQWUsb0JBQW9CLEVBQUUsUUFBYztBQUM1RCxhQUFTLGVBQWUsd0JBQXdCLEVBQUUsY0FBYztBQUNoRSxhQUFTLGVBQWUsMEJBQTBCLEVBQUUsTUFBTSxVQUFVO0FBQ3BFLGlDQUE2QixTQUFTO0FBQ3RDLG9CQUFnQiwwQkFBMEI7QUFDMUMsY0FBVSwwQkFBMEI7QUFBQSxFQUN0QztBQUVBLFdBQVMsb0JBQW9CLEtBQUssS0FBSztBQUNyQyxhQUFTLGVBQWUsZUFBZSxFQUFFLFFBQWdCO0FBQ3pELGFBQVMsZUFBZSxrQkFBa0IsRUFBRSxRQUFhLElBQUksVUFBVTtBQUN2RSxhQUFTLGVBQWUsaUJBQWlCLEVBQUUsUUFBYyxJQUFJLFNBQVM7QUFDdEUsYUFBUyxlQUFlLHVCQUF1QixFQUFFLFFBQVEsSUFBSSxlQUFlO0FBQzVFLGFBQVMsZUFBZSxnQkFBZ0IsRUFBRSxRQUFlLElBQUksUUFBUTtBQUNyRSxhQUFTLGVBQWUsaUJBQWlCLEVBQUUsUUFBYyxJQUFJLFNBQVM7QUFDdEUsYUFBUyxlQUFlLHNCQUFzQixFQUFFLFFBQVMsSUFBSSxjQUFjO0FBQzNFLGFBQVMsZUFBZSxvQkFBb0IsRUFBRSxRQUFXLElBQUksWUFBWTtBQUN6RSxhQUFTLGVBQWUsd0JBQXdCLEVBQUUsY0FBYztBQUNoRSxhQUFTLGVBQWUsMEJBQTBCLEVBQUUsTUFBTSxVQUFVO0FBQ3BFLGlDQUE2QixTQUFTO0FBQ3RDLG9CQUFnQiwwQkFBMEI7QUFDMUMsY0FBVSwwQkFBMEI7QUFBQSxFQUN0QztBQUVBLFdBQVMsc0JBQXNCO0FBQzdCLGFBQVMsZUFBZSwwQkFBMEIsRUFBRSxNQUFNLFVBQVU7QUFDcEUsaUJBQWE7QUFBQSxFQUNmO0FBRUEsaUJBQWUsc0JBQXNCO0FBQ25DLFVBQU0sTUFBVSxTQUFTLFNBQVMsZUFBZSxlQUFlLEVBQUUsT0FBTyxFQUFFO0FBQzNFLFVBQU0sU0FBVSxTQUFTLGVBQWUsa0JBQWtCLEVBQUUsTUFBTSxLQUFLO0FBQ3ZFLFVBQU0sY0FBYyxTQUFTLGVBQWUsdUJBQXVCLEVBQUUsTUFBTSxLQUFLO0FBQ2hGLFFBQUksQ0FBQyxVQUFVLENBQUMsYUFBYTtBQUMzQixxQkFBZSwyQkFBaUIsc0NBQXNDO0FBQ3RFO0FBQUEsSUFDRjtBQUNBLFVBQU0sU0FBUyxPQUFPLElBQUksV0FBVztBQUNyQyxVQUFNLE9BQU87QUFBQSxNQUNYO0FBQUEsTUFDQTtBQUFBLE1BQ0EsT0FBYSxTQUFTLGVBQWUsaUJBQWlCLEVBQUUsTUFBTSxLQUFLO0FBQUEsTUFDbkU7QUFBQSxNQUNBLE1BQWEsU0FBUyxlQUFlLGdCQUFnQixFQUFFLE1BQU0sS0FBSztBQUFBLE1BQ2xFLE9BQWEsU0FBUyxlQUFlLGlCQUFpQixFQUFFLE1BQU0sS0FBSztBQUFBLE1BQ25FLFlBQWEsU0FBUyxTQUFTLGVBQWUsc0JBQXNCLEVBQUUsT0FBTyxFQUFFLEtBQUs7QUFBQSxNQUNwRixVQUFhLFNBQVMsU0FBUyxlQUFlLG9CQUFvQixFQUFFLE9BQU8sRUFBRSxLQUFLO0FBQUEsTUFDbEYsR0FBSSxXQUFXLFdBQVcsRUFBRSxJQUFJLElBQUksQ0FBQztBQUFBLElBQ3ZDO0FBQ0EsUUFBSTtBQUNGLFlBQU0sTUFBTyxNQUFNLE1BQU0sOEJBQThCO0FBQUEsUUFDckQsUUFBUTtBQUFBLFFBQVEsU0FBUyxFQUFFLGdCQUFnQixtQkFBbUI7QUFBQSxRQUFHLE1BQU0sS0FBSyxVQUFVLElBQUk7QUFBQSxNQUM1RixDQUFDO0FBQ0QsWUFBTSxPQUFPLE1BQU0sSUFBSSxLQUFLO0FBQzVCLFVBQUksS0FBSyxJQUFJO0FBQ1gsNEJBQW9CO0FBQ3BCLCtCQUF1QixhQUFhLEtBQUssVUFBVSxTQUFTO0FBQzVELHVCQUFlLGdCQUFXLGNBQWMsTUFBTSxXQUFNLFdBQVcsS0FBSyxLQUFLLE1BQU0sR0FBRztBQUNsRixjQUFNQSxtQkFBa0I7QUFBQSxNQUMxQixPQUFPO0FBQ0wsdUJBQWUsZ0JBQVcsS0FBSyxTQUFTLGFBQWE7QUFBQSxNQUN2RDtBQUFBLElBQ0YsU0FBUyxHQUFHO0FBQ1YscUJBQWUsZ0JBQVcsMEJBQTBCO0FBQUEsSUFDdEQ7QUFBQSxFQUNGO0FBRUEsaUJBQWUsc0JBQXNCLEtBQUssYUFBYTtBQUNyRDtBQUFBLE1BQ0U7QUFBQSxNQUNBLFdBQVcsV0FBVztBQUFBLE1BQ3RCLFlBQVk7QUFDVixZQUFJO0FBQ0YsZ0JBQU0sTUFBTyxNQUFNLE1BQU0sOEJBQThCO0FBQUEsWUFDckQsUUFBUTtBQUFBLFlBQVEsU0FBUyxFQUFFLGdCQUFnQixtQkFBbUI7QUFBQSxZQUM5RCxNQUFNLEtBQUssVUFBVSxFQUFFLFFBQVEsVUFBVSxJQUFJLENBQUM7QUFBQSxVQUNoRCxDQUFDO0FBQ0QsZ0JBQU0sT0FBTyxNQUFNLElBQUksS0FBSztBQUM1QixjQUFJLEtBQUssSUFBSTtBQUNYLG1DQUF1QixhQUFhLEtBQUssVUFBVSxTQUFTO0FBQzVELDJCQUFlLGtCQUFhLDBCQUEwQjtBQUN0RCxrQkFBTUEsbUJBQWtCO0FBQUEsVUFDMUIsT0FBTztBQUNMLDJCQUFlLGdCQUFXLEtBQUssU0FBUyxlQUFlO0FBQUEsVUFDekQ7QUFBQSxRQUNGLFNBQVMsR0FBRztBQUNWLHlCQUFlLGdCQUFXLGtDQUFrQztBQUFBLFFBQzlEO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBSUEsV0FBUyxvQkFBb0I7QUFDM0IsYUFBUyxlQUFlLGlCQUFpQixFQUFFLFFBQVc7QUFDdEQsYUFBUyxlQUFlLG1CQUFtQixFQUFFLFFBQVM7QUFDdEQsYUFBUyxlQUFlLGtCQUFrQixFQUFFLFFBQVU7QUFDdEQsYUFBUyxlQUFlLGtCQUFrQixFQUFFLFFBQVU7QUFDdEQsYUFBUyxlQUFlLHNCQUFzQixFQUFFLFFBQVE7QUFDeEQsYUFBUyxlQUFlLDBCQUEwQixFQUFFLGNBQWM7QUFDbEUsYUFBUyxlQUFlLDRCQUE0QixFQUFFLE1BQU0sVUFBVTtBQUN0RSxpQ0FBNkIsU0FBUztBQUN0QyxvQkFBZ0IsNEJBQTRCO0FBQzVDLGNBQVUsNEJBQTRCO0FBQUEsRUFDeEM7QUFFQSxXQUFTLGdCQUFnQixPQUFPLEtBQUs7QUFDbkMsYUFBUyxlQUFlLGlCQUFpQixFQUFFLFFBQVk7QUFDdkQsYUFBUyxlQUFlLG1CQUFtQixFQUFFLFFBQVUsTUFBTSxTQUFTO0FBQ3RFLGFBQVMsZUFBZSxrQkFBa0IsRUFBRSxRQUFXLE1BQU0sUUFBUTtBQUNyRSxhQUFTLGVBQWUsa0JBQWtCLEVBQUUsUUFBVyxNQUFNLGVBQWU7QUFDNUUsYUFBUyxlQUFlLHNCQUFzQixFQUFFLFFBQVEsT0FBTyxNQUFNLGlCQUFpQixXQUNsRixNQUFNLGdCQUFnQixNQUFNLGdCQUFnQixDQUFDLEdBQUcsS0FBSyxJQUFJO0FBQzdELGFBQVMsZUFBZSwwQkFBMEIsRUFBRSxjQUFjO0FBQ2xFLGFBQVMsZUFBZSw0QkFBNEIsRUFBRSxNQUFNLFVBQVU7QUFDdEUsaUNBQTZCLFNBQVM7QUFDdEMsb0JBQWdCLDRCQUE0QjtBQUM1QyxjQUFVLDRCQUE0QjtBQUFBLEVBQ3hDO0FBRUEsV0FBUyxrQkFBa0I7QUFDekIsYUFBUyxlQUFlLDRCQUE0QixFQUFFLE1BQU0sVUFBVTtBQUN0RSxpQkFBYTtBQUFBLEVBQ2Y7QUFFQSxpQkFBZSxrQkFBa0I7QUFDL0IsVUFBTSxNQUFRLFNBQVMsU0FBUyxlQUFlLGlCQUFpQixFQUFFLE9BQU8sRUFBRTtBQUMzRSxVQUFNLFFBQVEsU0FBUyxlQUFlLG1CQUFtQixFQUFFLE1BQU0sS0FBSztBQUN0RSxRQUFJLENBQUMsT0FBTztBQUNWLHFCQUFlLDJCQUFpQiwwQkFBMEI7QUFDMUQ7QUFBQSxJQUNGO0FBQ0EsVUFBTSxTQUFTLE9BQU8sSUFBSSxXQUFXO0FBQ3JDLFVBQU0sY0FBYyxTQUFTLGVBQWUsc0JBQXNCLEVBQUU7QUFDcEUsVUFBTSxPQUFPO0FBQUEsTUFDWDtBQUFBLE1BQVE7QUFBQSxNQUNSLE1BQWMsU0FBUyxTQUFTLGVBQWUsa0JBQWtCLEVBQUUsT0FBTyxFQUFFLEtBQUs7QUFBQSxNQUNqRixhQUFjLFNBQVMsZUFBZSxrQkFBa0IsRUFBRSxNQUFNLEtBQUs7QUFBQSxNQUNyRSxjQUFjLFlBQVksTUFBTSxHQUFHLEVBQUUsSUFBSSxPQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTyxPQUFPO0FBQUEsTUFDdEUsR0FBSSxXQUFXLFdBQVcsRUFBRSxJQUFJLElBQUksQ0FBQztBQUFBLElBQ3ZDO0FBQ0EsUUFBSTtBQUNGLFlBQU0sTUFBTyxNQUFNLE1BQU0sMEJBQTBCO0FBQUEsUUFDakQsUUFBUTtBQUFBLFFBQVEsU0FBUyxFQUFFLGdCQUFnQixtQkFBbUI7QUFBQSxRQUFHLE1BQU0sS0FBSyxVQUFVLElBQUk7QUFBQSxNQUM1RixDQUFDO0FBQ0QsWUFBTSxPQUFPLE1BQU0sSUFBSSxLQUFLO0FBQzVCLFVBQUksS0FBSyxJQUFJO0FBQ1gsd0JBQWdCO0FBQ2hCLCtCQUF1QixvQkFBb0IsS0FBSyxVQUFVLFNBQVM7QUFDbkUsdUJBQWUsZ0JBQVcsVUFBVSxLQUFLLEtBQUssS0FBSyxNQUFNLEdBQUc7QUFDNUQsY0FBTUEsbUJBQWtCO0FBQUEsTUFDMUIsT0FBTztBQUNMLHVCQUFlLGdCQUFXLEtBQUssU0FBUyxhQUFhO0FBQUEsTUFDdkQ7QUFBQSxJQUNGLFNBQVMsR0FBRztBQUNWLHFCQUFlLGdCQUFXLHNCQUFzQjtBQUFBLElBQ2xEO0FBQUEsRUFDRjtBQUVBLGlCQUFlLGtCQUFrQixLQUFLLE9BQU87QUFDM0M7QUFBQSxNQUNFO0FBQUEsTUFDQSxXQUFXLEtBQUs7QUFBQSxNQUNoQixZQUFZO0FBQ1YsWUFBSTtBQUNGLGdCQUFNLE1BQU8sTUFBTSxNQUFNLDBCQUEwQjtBQUFBLFlBQ2pELFFBQVE7QUFBQSxZQUFRLFNBQVMsRUFBRSxnQkFBZ0IsbUJBQW1CO0FBQUEsWUFDOUQsTUFBTSxLQUFLLFVBQVUsRUFBRSxRQUFRLFVBQVUsSUFBSSxDQUFDO0FBQUEsVUFDaEQsQ0FBQztBQUNELGdCQUFNLE9BQU8sTUFBTSxJQUFJLEtBQUs7QUFDNUIsY0FBSSxLQUFLLElBQUk7QUFDWCxtQ0FBdUIsb0JBQW9CLEtBQUssVUFBVSxTQUFTO0FBQ25FLDJCQUFlLGtCQUFhLGdCQUFnQjtBQUM1QyxrQkFBTUEsbUJBQWtCO0FBQUEsVUFDMUIsT0FBTztBQUNMLDJCQUFlLGdCQUFXLEtBQUssU0FBUyxlQUFlO0FBQUEsVUFDekQ7QUFBQSxRQUNGLFNBQVMsR0FBRztBQUNWLHlCQUFlLGdCQUFXLHdCQUF3QjtBQUFBLFFBQ3BEO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBSUEsV0FBUyw0QkFBNEI7QUFDbkMsYUFBUyxlQUFlLGdCQUFnQixFQUFFLFFBQVc7QUFDckQsYUFBUyxlQUFlLGlCQUFpQixFQUFFLFFBQVU7QUFDckQsYUFBUyxlQUFlLG1CQUFtQixFQUFFLFFBQVE7QUFDckQsYUFBUyxlQUFlLGlCQUFpQixFQUFFLFFBQVU7QUFDckQsYUFBUyxlQUFlLHlCQUF5QixFQUFFLGNBQWM7QUFDakUsYUFBUyxlQUFlLDJCQUEyQixFQUFFLE1BQU0sVUFBVTtBQUNyRSxpQ0FBNkIsU0FBUztBQUN0QyxvQkFBZ0IsMkJBQTJCO0FBQzNDLGNBQVUsMkJBQTJCO0FBQUEsRUFDdkM7QUFFQSxXQUFTLHdCQUF3QixNQUFNLEtBQUs7QUFDMUMsYUFBUyxlQUFlLGdCQUFnQixFQUFFLFFBQVc7QUFDckQsYUFBUyxlQUFlLGlCQUFpQixFQUFFLFFBQVUsS0FBSyxRQUFRO0FBQ2xFLGFBQVMsZUFBZSxtQkFBbUIsRUFBRSxRQUFRLEtBQUssVUFBVTtBQUNwRSxhQUFTLGVBQWUsaUJBQWlCLEVBQUUsUUFBVSxLQUFLLFFBQVE7QUFDbEUsYUFBUyxlQUFlLHlCQUF5QixFQUFFLGNBQWM7QUFDakUsYUFBUyxlQUFlLDJCQUEyQixFQUFFLE1BQU0sVUFBVTtBQUNyRSxpQ0FBNkIsU0FBUztBQUN0QyxvQkFBZ0IsMkJBQTJCO0FBQzNDLGNBQVUsMkJBQTJCO0FBQUEsRUFDdkM7QUFFQSxXQUFTLDBCQUEwQjtBQUNqQyxhQUFTLGVBQWUsMkJBQTJCLEVBQUUsTUFBTSxVQUFVO0FBQ3JFLGlCQUFhO0FBQUEsRUFDZjtBQUVBLGlCQUFlLDBCQUEwQjtBQUN2QyxVQUFNLE1BQU8sU0FBUyxTQUFTLGVBQWUsZ0JBQWdCLEVBQUUsT0FBTyxFQUFFO0FBQ3pFLFVBQU0sT0FBTyxTQUFTLGVBQWUsaUJBQWlCLEVBQUUsTUFBTSxLQUFLO0FBQ25FLFFBQUksQ0FBQyxNQUFNO0FBQ1QscUJBQWUsMkJBQWlCLGlDQUFpQztBQUNqRTtBQUFBLElBQ0Y7QUFDQSxVQUFNLFNBQVMsT0FBTyxJQUFJLFdBQVc7QUFDckMsVUFBTSxPQUFPO0FBQUEsTUFDWDtBQUFBLE1BQVE7QUFBQSxNQUNSLFFBQVEsU0FBUyxlQUFlLG1CQUFtQixFQUFFLE1BQU0sS0FBSztBQUFBLE1BQ2hFLE1BQVEsU0FBUyxTQUFTLGVBQWUsaUJBQWlCLEVBQUUsT0FBTyxFQUFFLEtBQUs7QUFBQSxNQUMxRSxHQUFJLFdBQVcsV0FBVyxFQUFFLElBQUksSUFBSSxDQUFDO0FBQUEsSUFDdkM7QUFDQSxRQUFJO0FBQ0YsWUFBTSxNQUFPLE1BQU0sTUFBTSxrQ0FBa0M7QUFBQSxRQUN6RCxRQUFRO0FBQUEsUUFBUSxTQUFTLEVBQUUsZ0JBQWdCLG1CQUFtQjtBQUFBLFFBQUcsTUFBTSxLQUFLLFVBQVUsSUFBSTtBQUFBLE1BQzVGLENBQUM7QUFDRCxZQUFNLE9BQU8sTUFBTSxJQUFJLEtBQUs7QUFDNUIsVUFBSSxLQUFLLElBQUk7QUFDWCxnQ0FBd0I7QUFDeEIsK0JBQXVCLGtCQUFrQixLQUFLLFVBQVUsU0FBUztBQUNqRSx1QkFBZSxnQkFBVyxrQkFBa0IsSUFBSSxLQUFLLEtBQUssTUFBTSxHQUFHO0FBQ25FLGNBQU1BLG1CQUFrQjtBQUFBLE1BQzFCLE9BQU87QUFDTCx1QkFBZSxnQkFBVyxLQUFLLFNBQVMsYUFBYTtBQUFBLE1BQ3ZEO0FBQUEsSUFDRixTQUFTLEdBQUc7QUFDVixxQkFBZSxnQkFBVyw4QkFBOEI7QUFBQSxJQUMxRDtBQUFBLEVBQ0Y7QUFFQSxpQkFBZSwwQkFBMEIsS0FBSyxNQUFNO0FBQ2xEO0FBQUEsTUFDRTtBQUFBLE1BQ0EsV0FBVyxJQUFJO0FBQUEsTUFDZixZQUFZO0FBQ1YsWUFBSTtBQUNGLGdCQUFNLE1BQU8sTUFBTSxNQUFNLGtDQUFrQztBQUFBLFlBQ3pELFFBQVE7QUFBQSxZQUFRLFNBQVMsRUFBRSxnQkFBZ0IsbUJBQW1CO0FBQUEsWUFDOUQsTUFBTSxLQUFLLFVBQVUsRUFBRSxRQUFRLFVBQVUsSUFBSSxDQUFDO0FBQUEsVUFDaEQsQ0FBQztBQUNELGdCQUFNLE9BQU8sTUFBTSxJQUFJLEtBQUs7QUFDNUIsY0FBSSxLQUFLLElBQUk7QUFDWCxtQ0FBdUIsa0JBQWtCLEtBQUssVUFBVSxTQUFTO0FBQ2pFLDJCQUFlLGtCQUFhLHdCQUF3QjtBQUNwRCxrQkFBTUEsbUJBQWtCO0FBQUEsVUFDMUIsT0FBTztBQUNMLDJCQUFlLGdCQUFXLEtBQUssU0FBUyxlQUFlO0FBQUEsVUFDekQ7QUFBQSxRQUNGLFNBQVMsR0FBRztBQUNWLHlCQUFlLGdCQUFXLGdDQUFnQztBQUFBLFFBQzVEO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBSUEsaUJBQWUseUJBQXlCO0FBQ3RDLFVBQU0sVUFBVSxTQUFTLGNBQWMsS0FBSztBQUM1QyxZQUFRLEtBQUs7QUFDYixZQUFRLE1BQU0sVUFBVTtBQUN4QixZQUFRLFlBQVk7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFhcEIsYUFBUyxLQUFLLFlBQVksT0FBTztBQUNqQyxRQUFJLE9BQU8sY0FBYyxXQUFZLFdBQVUsd0JBQXdCO0FBQ3ZFLFVBQU0sUUFBUSxNQUFNO0FBQUUsY0FBUSxPQUFPO0FBQUcsVUFBSSxPQUFPLGlCQUFpQixXQUFZLGNBQWE7QUFBQSxJQUFHO0FBQ2hHLGFBQVMsZUFBZSxvQkFBb0IsRUFBRSxpQkFBaUIsU0FBUyxLQUFLO0FBQzdFLFlBQVEsaUJBQWlCLFNBQVMsT0FBSztBQUFFLFVBQUksRUFBRSxXQUFXLFFBQVMsT0FBTTtBQUFBLElBQUcsQ0FBQztBQUM3RSxZQUFRLGlCQUFpQixXQUFXLE9BQUs7QUFBRSxVQUFJLEVBQUUsUUFBUSxTQUFVLE9BQU07QUFBQSxJQUFHLENBQUM7QUFFN0UsUUFBSTtBQUNGLFlBQU0sTUFBTSxNQUFNLE1BQU0sMEJBQTBCO0FBQ2xELFlBQU0sT0FBTyxNQUFNLElBQUksS0FBSztBQUM1QixZQUFNLE9BQU8sU0FBUyxlQUFlLGtCQUFrQjtBQUN2RCxVQUFJLENBQUMsS0FBTTtBQUNYLFVBQUksQ0FBQyxLQUFLLE1BQU0sQ0FBQyxLQUFLLFdBQVcsUUFBUTtBQUN2QyxhQUFLLGNBQWM7QUFDbkI7QUFBQSxNQUNGO0FBQ0EsWUFBTSxPQUFPLEtBQUssVUFBVSxJQUFJLE9BQUs7QUFDbkMsY0FBTSxLQUFLLElBQUksS0FBSyxFQUFFLFFBQVEsR0FBSSxFQUFFLGVBQWU7QUFDbkQsY0FBTSxNQUFNLEVBQUUsT0FBTyxNQUFNLFFBQVEsQ0FBQztBQUNwQyxlQUFPO0FBQUEscURBQ3dDLFdBQVcsRUFBRSxDQUFDO0FBQUEsd0VBQ0ssRUFBRTtBQUFBO0FBQUE7QUFBQSxxQ0FHckMsS0FBSyxVQUFVLEVBQUUsUUFBUSxDQUFDO0FBQUE7QUFBQTtBQUFBLE1BRzNELENBQUMsRUFBRSxLQUFLLEVBQUU7QUFDVixXQUFLLFlBQVk7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsZUFNTixJQUFJO0FBQUE7QUFBQSxJQUVqQixTQUFTTyxJQUFHO0FBQ1YsWUFBTSxPQUFPLFNBQVMsZUFBZSxrQkFBa0I7QUFDdkQsVUFBSSxLQUFNLE1BQUssY0FBYztBQUFBLElBQy9CO0FBQUEsRUFDRjtBQUVBLGlCQUFlLGNBQWMsVUFBVTtBQUNyQyxVQUFNLFlBQVksT0FBTyxPQUFPLGtCQUFrQixhQUM5QyxjQUFjLCtFQUErRSxJQUM3RixRQUFRLFFBQVEsT0FBTyxRQUFRLCtFQUErRSxDQUFDO0FBQ25ILFFBQUksQ0FBQyxVQUFXO0FBQ2hCLFFBQUk7QUFDRixZQUFNLE1BQU0sTUFBTSxNQUFNLDRCQUE0QjtBQUFBLFFBQ2xELFFBQVE7QUFBQSxRQUNSLFNBQVMsRUFBRSxnQkFBZ0IsbUJBQW1CO0FBQUEsUUFDOUMsTUFBTSxLQUFLLFVBQVUsRUFBRSxTQUFTLENBQUM7QUFBQSxNQUNuQyxDQUFDO0FBQ0QsWUFBTSxPQUFPLE1BQU0sSUFBSSxLQUFLO0FBQzVCLFVBQUksS0FBSyxJQUFJO0FBQ1gsaUJBQVMsZUFBZSx3QkFBd0IsR0FBRyxPQUFPO0FBQzFELFlBQUksT0FBTyxpQkFBaUIsV0FBWSxjQUFhO0FBQ3JELHVCQUFlLG1CQUFjLHlFQUF5RTtBQUFBLE1BQ3hHLE9BQU87QUFDTCx1QkFBZSxnQkFBVyxLQUFLLFNBQVMsaUJBQWlCO0FBQUEsTUFDM0Q7QUFBQSxJQUNGLFNBQVNBLElBQUc7QUFDVixxQkFBZSxnQkFBVywyQkFBMkI7QUFBQSxJQUN2RDtBQUFBLEVBQ0Y7QUFVQSxpQkFBZUwsd0JBQXVCO0FBQ3BDLFFBQUk7QUFDRixZQUFNLE1BQU0sTUFBTSxNQUFNLDBCQUEwQjtBQUNsRCxZQUFNLE9BQU8sTUFBTSxJQUFJLEtBQUs7QUFDNUIsVUFBSSxDQUFDLEtBQUssTUFBTSxDQUFDLEtBQUssV0FBVyxRQUFRO0FBQ3ZDLHVCQUFlLGdDQUFzQix3Q0FBd0M7QUFDN0U7QUFBQSxNQUNGO0FBQ0EsWUFBTSxhQUFhLEtBQUssVUFBVSxDQUFDO0FBQ25DLFlBQU0sT0FBTyxJQUFJLEtBQUssV0FBVyxRQUFRLEdBQUksRUFBRSxlQUFlO0FBQzlELFlBQU0sWUFBWSxPQUFPLE9BQU8sa0JBQWtCLGFBQzlDLGNBQWMsZ0VBQWdFLElBQUksNERBQTRELElBQzlJLFFBQVEsUUFBUSxPQUFPLFFBQVEsZ0VBQWdFLElBQUksR0FBRyxDQUFDO0FBQzNHLFVBQUksQ0FBQyxVQUFXO0FBRWhCLFlBQU0sYUFBYSxNQUFNLE1BQU0sNEJBQTRCO0FBQUEsUUFDekQsUUFBUTtBQUFBLFFBQ1IsU0FBUyxFQUFFLGdCQUFnQixtQkFBbUI7QUFBQSxRQUM5QyxNQUFNLEtBQUssVUFBVSxFQUFFLFVBQVUsV0FBVyxTQUFTLENBQUM7QUFBQSxNQUN4RCxDQUFDO0FBQ0QsWUFBTSxjQUFjLE1BQU0sV0FBVyxLQUFLO0FBQzFDLFVBQUksWUFBWSxJQUFJO0FBR2xCLDhCQUFzQixZQUFZLGlCQUFpQjtBQUNuRCxxQ0FBNkI7QUFDN0IsY0FBTUYsbUJBQWtCO0FBQ3hCLHVCQUFlLGlCQUFZLG1EQUFtRDtBQUFBLE1BQ2hGLE9BQU87QUFDTCx1QkFBZSxnQkFBVyxZQUFZLFNBQVMsY0FBYztBQUFBLE1BQy9EO0FBQUEsSUFDRixTQUFTTyxJQUFHO0FBQ1YscUJBQWUsZ0JBQVcsaUJBQWlCO0FBQUEsSUFDN0M7QUFBQSxFQUNGO0FBRUEsaUJBQWVOLHdCQUF1QjtBQUNwQyxRQUFJLENBQUMscUJBQXFCO0FBQ3hCLHFCQUFlLGdDQUFzQix1Q0FBdUM7QUFDNUU7QUFBQSxJQUNGO0FBQ0EsUUFBSTtBQUNGLFlBQU0sTUFBTSxNQUFNLE1BQU0sNEJBQTRCO0FBQUEsUUFDbEQsUUFBUTtBQUFBLFFBQ1IsU0FBUyxFQUFFLGdCQUFnQixtQkFBbUI7QUFBQSxRQUM5QyxNQUFNLEtBQUssVUFBVSxFQUFFLFVBQVUsb0JBQW9CLENBQUM7QUFBQSxNQUN4RCxDQUFDO0FBQ0QsWUFBTSxPQUFPLE1BQU0sSUFBSSxLQUFLO0FBQzVCLFVBQUksS0FBSyxJQUFJO0FBR1gsY0FBTUQsbUJBQWtCO0FBQ3hCLHVCQUFlLGlCQUFZLG9EQUFvRDtBQUFBLE1BQ2pGLE9BQU87QUFDTCx1QkFBZSxnQkFBVyxLQUFLLFNBQVMsY0FBYztBQUFBLE1BQ3hEO0FBQUEsSUFDRixTQUFTTyxJQUFHO0FBQ1YscUJBQWUsZ0JBQVcsaUJBQWlCO0FBQUEsSUFDN0M7QUFBQSxFQUNGO0FBRUEsaUJBQWUsaUJBQWlCO0FBQzlCLFFBQUk7QUFDRixZQUFNQyxhQUFZLE9BQU87QUFDekIsWUFBTSxNQUFNLDBCQUEwQkEsYUFBWSxlQUFlQSxVQUFTLEtBQUssRUFBRTtBQUNqRixZQUFNLE1BQU0sTUFBTSxNQUFNLEdBQUc7QUFDM0IsVUFBSSxDQUFDLElBQUksSUFBSTtBQUNYLHVCQUFlLGdCQUFXLGVBQWU7QUFDekM7QUFBQSxNQUNGO0FBQ0EsWUFBTSxPQUFPLE1BQU0sSUFBSSxLQUFLO0FBQzVCLFlBQU0sSUFBSSxTQUFTLGNBQWMsR0FBRztBQUNwQyxRQUFFLE9BQU8sSUFBSSxnQkFBZ0IsSUFBSTtBQUNqQyxRQUFFLFdBQVc7QUFDYixRQUFFLE1BQU07QUFDUixVQUFJLGdCQUFnQixFQUFFLElBQUk7QUFBQSxJQUM1QixTQUFTLEdBQUc7QUFDVixxQkFBZSxnQkFBVyw0QkFBNEI7QUFBQSxJQUN4RDtBQUFBLEVBQ0Y7QUFJQSxpQkFBZSwyQkFBMkI7QUFDeEMsVUFBTSxVQUFVLFNBQVMsY0FBYyxLQUFLO0FBQzVDLFlBQVEsS0FBSztBQUNiLFlBQVEsTUFBTSxVQUFVO0FBQ3hCLFlBQVEsWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWFwQixhQUFTLEtBQUssWUFBWSxPQUFPO0FBQ2pDLFFBQUksT0FBTyxjQUFjLFdBQVksV0FBVSwyQkFBMkI7QUFDMUUsVUFBTSxRQUFRLE1BQU07QUFBRSxjQUFRLE9BQU87QUFBRyxVQUFJLE9BQU8saUJBQWlCLFdBQVksY0FBYTtBQUFBLElBQUc7QUFDaEcsYUFBUyxlQUFlLHlCQUF5QixFQUFFLGlCQUFpQixTQUFTLEtBQUs7QUFDbEYsWUFBUSxpQkFBaUIsU0FBUyxDQUFDLE1BQU07QUFBRSxVQUFJLEVBQUUsV0FBVyxRQUFTLE9BQU07QUFBQSxJQUFHLENBQUM7QUFDL0UsWUFBUSxpQkFBaUIsV0FBVyxDQUFDLE1BQU07QUFBRSxVQUFJLEVBQUUsUUFBUSxTQUFVLE9BQU07QUFBQSxJQUFHLENBQUM7QUFFL0UsUUFBSTtBQUNGLFlBQU0sTUFBTSxNQUFNLE1BQU0sdUJBQXVCO0FBQy9DLFlBQU0sT0FBTyxNQUFNLElBQUksS0FBSztBQUM1QixZQUFNLE9BQU8sU0FBUyxlQUFlLHdCQUF3QjtBQUM3RCxVQUFJLEtBQU0sTUFBSyxjQUFjLEtBQUssVUFBVSxNQUFNLE1BQU0sQ0FBQztBQUFBLElBQzNELFNBQVNELElBQUc7QUFDVixZQUFNLE9BQU8sU0FBUyxlQUFlLHdCQUF3QjtBQUM3RCxVQUFJLEtBQU0sTUFBSyxjQUFjO0FBQUEsSUFDL0I7QUFBQSxFQUNGO0FBVUEsTUFBSSxzQkFBc0I7QUFFMUIsV0FBUyx3QkFBd0I7QUFDL0IsYUFBUyxlQUFlLDZCQUE2QixHQUFHLE1BQU07QUFBQSxFQUNoRTtBQUVBLFdBQVMseUJBQXlCRSxRQUFPO0FBQ3ZDLFVBQU0sT0FBT0EsT0FBTSxRQUFRLFFBQVEsQ0FBQztBQUNwQyxJQUFBQSxPQUFNLE9BQU8sUUFBUTtBQUNyQixRQUFJLENBQUMsS0FBTTtBQUNYLFVBQU0sU0FBUyxJQUFJLFdBQVc7QUFDOUIsV0FBTyxTQUFTLFlBQVk7QUFDMUIsVUFBSTtBQUNKLFVBQUk7QUFDRixpQkFBUyxLQUFLLE1BQU0sT0FBTyxPQUFPLE1BQU0sQ0FBQztBQUFBLE1BQzNDLFNBQVNGLElBQUc7QUFDVix1QkFBZSxnQkFBVyw4QkFBOEI7QUFDeEQ7QUFBQSxNQUNGO0FBQ0EsVUFBSSxDQUFDLFVBQVUsT0FBTyxXQUFXLFlBQVksTUFBTSxRQUFRLE1BQU0sR0FBRztBQUNsRSx1QkFBZSxnQkFBVyw2RUFBNkU7QUFDdkc7QUFBQSxNQUNGO0FBQ0EsWUFBTSw2QkFBNkIsTUFBTTtBQUFBLElBQzNDO0FBQ0EsV0FBTyxVQUFVLE1BQU0sZUFBZSxnQkFBVyxtQ0FBbUM7QUFDcEYsV0FBTyxXQUFXLElBQUk7QUFBQSxFQUN4QjtBQUVBLGlCQUFlLDZCQUE2QixRQUFRO0FBQ2xELFFBQUk7QUFDRixZQUFNLE1BQU0sTUFBTSxNQUFNLG1DQUFtQztBQUFBLFFBQ3pELFFBQVE7QUFBQSxRQUFRLFNBQVMsRUFBRSxnQkFBZ0IsbUJBQW1CO0FBQUEsUUFDOUQsTUFBTSxLQUFLLFVBQVUsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUFBLE1BQ3ZDLENBQUM7QUFDRCxZQUFNLE9BQU8sTUFBTSxJQUFJLEtBQUs7QUFDNUIsVUFBSSxDQUFDLEtBQUssSUFBSTtBQUNaLGNBQU0sVUFBVSxLQUFLLHFCQUFxQixDQUFDLEdBQUcsS0FBSyxJQUFJO0FBQ3ZELHVCQUFlLGdCQUFXLFNBQVMsR0FBRyxLQUFLLEtBQUssS0FBSyxNQUFNLEtBQU0sS0FBSyxTQUFTLHdCQUF5QjtBQUN4RztBQUFBLE1BQ0Y7QUFDQSw0QkFBc0I7QUFDdEIsc0NBQWdDLEtBQUssWUFBWSxDQUFDLENBQUM7QUFBQSxJQUNyRCxTQUFTQSxJQUFHO0FBQ1YscUJBQWUsZ0JBQVcsK0JBQStCO0FBQUEsSUFDM0Q7QUFBQSxFQUNGO0FBRUEsV0FBUyxnQ0FBZ0MsVUFBVTtBQUNqRCxVQUFNLFVBQVUsU0FBUyxjQUFjLEtBQUs7QUFDNUMsWUFBUSxLQUFLO0FBQ2IsWUFBUSxNQUFNLFVBQVU7QUFDeEIsVUFBTSxrQkFBa0IsU0FBUyxPQUFPLENBQUMsTUFBTSxFQUFFLE9BQU87QUFDeEQsVUFBTSxPQUFPLFNBQVMsSUFBSSxDQUFDLE1BQU07QUFBQSxpQkFDbEIsRUFBRSxVQUFVLDJDQUEyQyxFQUFFO0FBQUEsbURBQ3ZCLFdBQVcsRUFBRSxPQUFPLENBQUM7QUFBQSxxRUFDSCxFQUFFLGFBQWE7QUFBQSxxRUFDZixFQUFFLFNBQVM7QUFBQSxxQ0FDM0MsRUFBRSxVQUFVLG1CQUFjLFFBQUc7QUFBQSxVQUN4RCxFQUFFLEtBQUssRUFBRTtBQUNqQixZQUFRLFlBQVk7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxVQVVaLGdCQUFnQixTQUFTLEdBQUcsZ0JBQWdCLE1BQU0sOEJBQThCLDZFQUF3RTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxpQkFTakosSUFBSTtBQUFBO0FBQUE7QUFBQTtBQUFBLDBFQUlxRCxnQkFBZ0IsU0FBUyxLQUFLLFdBQVc7QUFBQTtBQUFBO0FBR2pILGFBQVMsS0FBSyxZQUFZLE9BQU87QUFDakMsUUFBSSxPQUFPLGNBQWMsV0FBWSxXQUFVLDBCQUEwQjtBQUN6RSxVQUFNLFFBQVEsTUFBTTtBQUFFLGNBQVEsT0FBTztBQUFHLDRCQUFzQjtBQUFNLFVBQUksT0FBTyxpQkFBaUIsV0FBWSxjQUFhO0FBQUEsSUFBRztBQUM1SCxhQUFTLGVBQWUseUJBQXlCLEVBQUUsaUJBQWlCLFNBQVMsS0FBSztBQUNsRixZQUFRLGlCQUFpQixXQUFXLENBQUMsTUFBTTtBQUFFLFVBQUksRUFBRSxRQUFRLFNBQVUsT0FBTTtBQUFBLElBQUcsQ0FBQztBQUMvRSxhQUFTLGVBQWUsMEJBQTBCLEVBQUUsaUJBQWlCLFNBQVMsTUFBTSxzQkFBc0IsQ0FBQztBQUFBLEVBQzdHO0FBRUEsaUJBQWUsd0JBQXdCO0FBQ3JDLFFBQUksQ0FBQyxvQkFBcUI7QUFDMUIsUUFBSTtBQUNGLFlBQU0sTUFBTSxNQUFNLE1BQU0sbUNBQW1DO0FBQUEsUUFDekQsUUFBUTtBQUFBLFFBQVEsU0FBUyxFQUFFLGdCQUFnQixtQkFBbUI7QUFBQSxRQUM5RCxNQUFNLEtBQUssVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFBQSxNQUNwRCxDQUFDO0FBQ0QsWUFBTSxPQUFPLE1BQU0sSUFBSSxLQUFLO0FBQzVCLGVBQVMsZUFBZSwwQkFBMEIsR0FBRyxPQUFPO0FBQzVELDRCQUFzQjtBQUN0QixVQUFJLE9BQU8saUJBQWlCLFdBQVksY0FBYTtBQUNyRCxVQUFJLEtBQUssSUFBSTtBQUNYLCtCQUF1QixrQkFBa0IsVUFBVTtBQUNuRDtBQUFBLFVBQ0U7QUFBQSxVQUNBLDJCQUEyQixLQUFLLGNBQWMsWUFBWSxLQUFLLFlBQVksTUFBTSxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsR0FBRyxLQUFLLFlBQVksa0JBQWtCLEtBQUssU0FBUyxNQUFNLEVBQUU7QUFBQSxRQUM3SjtBQUNBLGNBQU1QLG1CQUFrQjtBQUFBLE1BQzFCLE9BQU87QUFDTCxjQUFNLFVBQVUsS0FBSyxxQkFBcUIsQ0FBQyxHQUFHLEtBQUssSUFBSTtBQUN2RCx1QkFBZSxnQkFBVyxTQUFTLEdBQUcsS0FBSyxLQUFLLEtBQUssTUFBTSxLQUFNLEtBQUssU0FBUyxnQkFBaUI7QUFBQSxNQUNsRztBQUFBLElBQ0YsU0FBU08sSUFBRztBQUNWLHFCQUFlLGdCQUFXLGtDQUFrQztBQUFBLElBQzlEO0FBQUEsRUFDRjtBQUlBLGlCQUFlLHdCQUF3QixJQUFJLE9BQU87QUFDaEQ7QUFBQSxNQUNFO0FBQUEsTUFDQSxXQUFXLEtBQUs7QUFBQSxNQUNoQixZQUFZO0FBQ1YsWUFBSTtBQUNGLGdCQUFNLE1BQU8sTUFBTSxNQUFNLHVDQUF1QztBQUFBLFlBQzlELFFBQVE7QUFBQSxZQUFRLFNBQVMsRUFBRSxnQkFBZ0IsbUJBQW1CO0FBQUEsWUFDOUQsTUFBTSxLQUFLLFVBQVUsRUFBRSxRQUFRLFVBQVUsR0FBRyxDQUFDO0FBQUEsVUFDL0MsQ0FBQztBQUNELGdCQUFNLE9BQU8sTUFBTSxJQUFJLEtBQUs7QUFDNUIsY0FBSSxLQUFLLElBQUk7QUFDWCxtQ0FBdUIseUJBQXlCLEtBQUssVUFBVSxTQUFTO0FBQ3hFLDJCQUFlLGtCQUFhLHNCQUFzQjtBQUNsRCxrQkFBTVAsbUJBQWtCO0FBQUEsVUFDMUIsT0FBTztBQUNMLDJCQUFlLGdCQUFXLEtBQUssU0FBUyxlQUFlO0FBQUEsVUFDekQ7QUFBQSxRQUNGLFNBQVMsR0FBRztBQUNWLHlCQUFlLGdCQUFXLDhCQUE4QjtBQUFBLFFBQzFEO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsaUJBQWUsb0JBQW9CLEtBQUs7QUFDdEM7QUFBQSxNQUNFO0FBQUEsTUFDQSwyQkFBMkIsR0FBRztBQUFBLE1BQzlCLFlBQVk7QUFDVixZQUFJO0FBQ0YsZ0JBQU0sTUFBTyxNQUFNLE1BQU0sbUNBQW1DO0FBQUEsWUFDMUQsUUFBUTtBQUFBLFlBQVEsU0FBUyxFQUFFLGdCQUFnQixtQkFBbUI7QUFBQSxZQUM5RCxNQUFNLEtBQUssVUFBVSxFQUFFLFFBQVEsVUFBVSxJQUFJLENBQUM7QUFBQSxVQUNoRCxDQUFDO0FBQ0QsZ0JBQU0sT0FBTyxNQUFNLElBQUksS0FBSztBQUM1QixjQUFJLEtBQUssSUFBSTtBQUNYLG1DQUF1QiwwQkFBMEIsS0FBSyxVQUFVLFNBQVM7QUFDekUsMkJBQWUsa0JBQWEsWUFBWSxHQUFHLFlBQVk7QUFDdkQsa0JBQU1BLG1CQUFrQjtBQUFBLFVBQzFCLE9BQU87QUFDTCwyQkFBZSxnQkFBVyxLQUFLLFNBQVMsZUFBZTtBQUFBLFVBQ3pEO0FBQUEsUUFDRixTQUFTLEdBQUc7QUFDVix5QkFBZSxnQkFBVywwQkFBMEI7QUFBQSxRQUN0RDtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUVBLFdBQVNELHFCQUFvQjtBQUMzQixVQUFNLFVBQVUsU0FBUyxlQUFlLHlCQUF5QjtBQUNqRSxRQUFJLENBQUMsUUFBUztBQUNkLGlDQUE2QixTQUFTO0FBQ3RDLFlBQVEsTUFBTSxVQUFVO0FBQ3hCLGFBQVMsS0FBSyxNQUFNLFdBQVc7QUFDL0IsVUFBTSxZQUFZLFNBQVMsZUFBZSxzQkFBc0I7QUFDaEUsSUFBQUMsbUJBQWtCLFNBQVM7QUFDM0Isb0JBQWdCLHlCQUF5QjtBQUN6QyxjQUFVLHlCQUF5QjtBQUFBLEVBQ3JDO0FBRUEsV0FBUyxxQkFBcUI7QUFDNUIsVUFBTSxVQUFVLFNBQVMsZUFBZSx5QkFBeUI7QUFDakUsUUFBSSxRQUFTLFNBQVEsTUFBTSxVQUFVO0FBQ3JDLCtCQUEyQjtBQUMzQixhQUFTLEtBQUssTUFBTSxXQUFXO0FBQy9CLGlCQUFhO0FBQUEsRUFDZjs7O0FDeDhGQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxvQ0FBQVU7QUFBQSxJQUFBO0FBQUE7QUFBQSxrQ0FBQUM7QUFBQSxJQUFBO0FBQUE7QUFrQkEsTUFBTSxxQkFBcUI7QUFBQSxJQUN6QixFQUFFLE9BQU8sZ0JBQWtCLE9BQU8saUJBQW9CO0FBQUEsSUFDdEQsRUFBRSxPQUFPLGtCQUFrQixPQUFPLG1CQUFvQjtBQUFBLElBQ3RELEVBQUUsT0FBTyxZQUFrQixPQUFPLFdBQXFCO0FBQUEsSUFDdkQsRUFBRSxPQUFPLGFBQWtCLE9BQU8scUJBQXFCO0FBQUEsSUFDdkQsRUFBRSxPQUFPLGNBQWtCLE9BQU8sb0JBQXFCO0FBQUEsRUFDekQ7QUFFQSxNQUFNLHdCQUF3QjtBQUFBLElBQzVCLEVBQUUsT0FBTyxVQUFhLE9BQU8sb0RBQXFDO0FBQUEsSUFDbEUsRUFBRSxPQUFPLFFBQWEsT0FBTyxrREFBNkM7QUFBQSxJQUMxRSxFQUFFLE9BQU8sYUFBYSxPQUFPLCtDQUEwQztBQUFBLEVBQ3pFO0FBRUEsTUFBSSw0QkFBNEIsQ0FBQztBQUdqQyxNQUFJLHdCQUF3QjtBQUFBLElBQzFCLE1BQWdCO0FBQUEsSUFDaEIsY0FBZ0I7QUFBQSxJQUNoQixlQUFnQjtBQUFBLElBQ2hCLGdCQUFnQjtBQUFBLElBQ2hCLFdBQWdCO0FBQUEsSUFDaEIsZ0JBQWdCO0FBQUEsSUFDaEIsWUFBZ0I7QUFBQSxJQUNoQixlQUFnQjtBQUFBLEVBQ2xCO0FBSUEsaUJBQWVDLDBCQUF5QjtBQUN0QyxVQUFNLFVBQVUsU0FBUyxlQUFlLGtCQUFrQjtBQUMxRCxZQUFRLFlBQVk7QUFHcEIsUUFBSTtBQUNGLFlBQU0sTUFBTyxNQUFNLE1BQU0seUJBQXlCO0FBQ2xELFlBQU0sT0FBTyxNQUFNLElBQUksS0FBSztBQUM1QixrQ0FBNkIsS0FBSyxZQUFZLENBQUM7QUFBQSxJQUNqRCxTQUFTQyxJQUFHO0FBQ1Ysa0NBQTRCLENBQUM7QUFBQSxJQUMvQjtBQUVBLFVBQU0sY0FBYyxtQkFBbUI7QUFBQSxNQUFJLE9BQ3pDLGtCQUFrQixFQUFFLEtBQUssS0FBSyxXQUFXLEVBQUUsS0FBSyxDQUFDO0FBQUEsSUFDbkQsRUFBRSxLQUFLLEVBQUU7QUFFVCxVQUFNLGlCQUFpQixzQkFBc0I7QUFBQSxNQUFJLE9BQy9DLGtCQUFrQixFQUFFLEtBQUssS0FBSyxXQUFXLEVBQUUsS0FBSyxDQUFDO0FBQUEsSUFDbkQsRUFBRSxLQUFLLEVBQUU7QUFFVCxVQUFNLGVBQWUsMEJBQTBCLFNBQVM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxVQU9oRCwwQkFBMEIsSUFBSSxDQUFDLEdBQUcsTUFBTTtBQUFBLG9EQUNFLENBQUM7QUFBQTtBQUFBLDJEQUVNLENBQUM7QUFBQTtBQUFBLDBCQUVsQyxXQUFXLEVBQUUsUUFBUSxNQUFNLENBQUMsT0FBTyxXQUFXLEVBQUUsV0FBVyxTQUFTLENBQUM7QUFBQSxnRkFDZixXQUFXLEVBQUUsUUFBUSxFQUFFLENBQUM7QUFBQSxrQkFDdEYsRUFBRSxPQUFPLCtCQUErQixXQUFXLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRTtBQUFBLDRFQUNkLFlBQVksRUFBRSxXQUFXLElBQUksTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQUE7QUFBQTtBQUFBLGlCQUd0RyxFQUFFLEtBQUssRUFBRSxDQUFDO0FBQUE7QUFBQSxjQUViO0FBRVosWUFBUSxZQUFZO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFPaEIsWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLDJEQU95QyxXQUFXO0FBQUE7QUFBQTtBQUFBO0FBQUEsNkRBSVQsY0FBYztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBMER6RSxpQ0FBNkI7QUFBQSxFQUMvQjtBQUlBLFdBQVMsK0JBQStCO0FBQ3RDLFVBQU0sU0FBWSxTQUFTLGVBQWUsZ0JBQWdCO0FBQzFELFVBQU0sWUFBWSxTQUFTLGVBQWUsa0JBQWtCO0FBQzVELFVBQU0sT0FBWSxTQUFTLGVBQWUsbUJBQW1CO0FBQzdELFVBQU0sU0FBWSxTQUFTLGVBQWUsb0JBQW9CO0FBQzlELFVBQU0sT0FBWSxTQUFTLGVBQWUsY0FBYztBQUN4RCxVQUFNLFFBQVksU0FBUyxlQUFlLG9CQUFvQjtBQUM5RCxVQUFNLFdBQVksU0FBUyxlQUFlLG1CQUFtQjtBQUM3RCxVQUFNLFdBQVksU0FBUyxlQUFlLG9CQUFvQjtBQUU5RCxRQUFJLFVBQVUsc0JBQXNCO0FBQ2xDLGFBQU8sUUFBUSxzQkFBc0I7QUFDdkMsUUFBSSxhQUFhLHNCQUFzQjtBQUNyQyxnQkFBVSxRQUFRLHNCQUFzQjtBQUMxQyxRQUFJLFFBQVEsc0JBQXNCO0FBQ2hDLFdBQUssUUFBUSxzQkFBc0I7QUFDckMsUUFBSSxVQUFVLHNCQUFzQjtBQUNsQyxhQUFPLFFBQVEsc0JBQXNCO0FBQ3ZDLFFBQUksUUFBUSxzQkFBc0I7QUFDaEMsV0FBSyxRQUFRLHNCQUFzQjtBQUNyQyxRQUFJLFNBQVMsc0JBQXNCO0FBQ2pDLFlBQU0sUUFBUSxzQkFBc0I7QUFFdEMsUUFBSSxzQkFBc0IsaUJBQWlCLHNCQUFzQixZQUFZO0FBQzNFLFVBQUksU0FBVSxVQUFTLE1BQU0sVUFBVTtBQUN2QyxVQUFJLFVBQVU7QUFDWixpQkFBUyxRQUFRLHNCQUFzQjtBQUN2Qyw2QkFBcUIsU0FBUyxLQUFLO0FBQUEsTUFDckM7QUFBQSxJQUNGO0FBR0EsUUFBSSxPQUFXLFFBQU8saUJBQWlCLFVBQVksTUFBTTtBQUFFLDRCQUFzQixPQUFPLE9BQU87QUFBQSxJQUFPLENBQUM7QUFDdkcsUUFBSSxVQUFXLFdBQVUsaUJBQWlCLFVBQVUsTUFBTTtBQUFFLDRCQUFzQixlQUFlLFVBQVU7QUFBQSxJQUFPLENBQUM7QUFDbkgsUUFBSSxLQUFXLE1BQUssaUJBQWlCLFNBQWMsTUFBTTtBQUFFLDRCQUFzQixnQkFBZ0IsS0FBSztBQUFBLElBQU8sQ0FBQztBQUM5RyxRQUFJLE9BQVcsUUFBTyxpQkFBaUIsU0FBWSxNQUFNO0FBQUUsNEJBQXNCLGlCQUFpQixPQUFPO0FBQUEsSUFBTyxDQUFDO0FBQ2pILFFBQUksS0FBVyxNQUFLLGlCQUFpQixTQUFjLE1BQU07QUFBRSw0QkFBc0IsWUFBWSxLQUFLO0FBQUEsSUFBTyxDQUFDO0FBQzFHLFFBQUksTUFBVyxPQUFNLGlCQUFpQixTQUFhLE1BQU07QUFBRSw0QkFBc0IsaUJBQWlCLE1BQU07QUFBQSxJQUFPLENBQUM7QUFBQSxFQUNsSDtBQUlBLGlCQUFlLHNCQUFzQjtBQTJCbkMsVUFBTSxNQUFNLFNBQVMsZUFBZSxpQkFBaUI7QUFDckQsUUFBSSxXQUFXO0FBQ2YsUUFBSSxjQUFjO0FBRWxCLFVBQU0sUUFBbUIsU0FBUyxlQUFlLGdCQUFnQixLQUFVLENBQUMsR0FBRyxTQUFTO0FBQ3hGLFVBQU0saUJBQW1CLFNBQVMsZUFBZSxrQkFBa0IsS0FBUSxDQUFDLEdBQUcsU0FBUztBQUN4RixVQUFNLGtCQUFtQixTQUFTLGVBQWUsbUJBQW1CLEtBQU8sQ0FBQyxHQUFHLFNBQVM7QUFDeEYsVUFBTSxtQkFBbUIsU0FBUyxlQUFlLG9CQUFvQixLQUFNLENBQUMsR0FBRyxTQUFTO0FBQ3hGLFVBQU0sYUFBbUIsU0FBUyxlQUFlLGNBQWMsS0FBYSxDQUFDLEdBQUcsU0FBUztBQUN6RixVQUFNLG1CQUFtQixTQUFTLGVBQWUsb0JBQW9CLEtBQU0sQ0FBQyxHQUFHLFNBQVM7QUFHeEYsUUFBSSxhQUFhO0FBQ2pCLFVBQU0sZUFBZSxTQUFTLGNBQWMsZ0NBQWdDO0FBQzVFLFFBQUksY0FBYztBQUNoQixZQUFNLE1BQU0sU0FBUyxhQUFhLE9BQU8sRUFBRTtBQUMzQyxvQkFBYywwQkFBMEIsR0FBRyxLQUFLLENBQUMsR0FBRyxhQUFhO0FBQUEsSUFDbkU7QUFFQSxRQUFJO0FBQ0YsWUFBTSxNQUFPLE1BQU0sTUFBTSw4QkFBOEI7QUFBQSxRQUNyRCxRQUFTO0FBQUEsUUFDVCxTQUFTLEVBQUUsZ0JBQWdCLG1CQUFtQjtBQUFBLFFBQzlDLE1BQVMsS0FBSyxVQUFVLEVBQUUsTUFBTSxlQUFlLGdCQUFnQixpQkFBaUIsV0FBVyxpQkFBaUIsV0FBVyxDQUFDO0FBQUEsTUFDMUgsQ0FBQztBQUNELFlBQU0sT0FBTyxNQUFNLElBQUksS0FBSztBQUU1QixVQUFJLEtBQUssSUFBSTtBQUNYLGNBQU0sZ0JBQWdCLFNBQVMsZUFBZSxtQkFBbUI7QUFDakUsY0FBTSxXQUFnQixTQUFTLGVBQWUsb0JBQW9CO0FBQ2xFLFlBQUksY0FBZSxlQUFjLE1BQU0sVUFBVTtBQUNqRCxZQUFJLFVBQVU7QUFDWixtQkFBUyxRQUFRLEtBQUs7QUFDdEIsK0JBQXFCLFNBQVMsS0FBSztBQUFBLFFBQ3JDO0FBQ0EsOEJBQXNCLGFBQWdCLEtBQUs7QUFDM0MsOEJBQXNCLGdCQUFnQjtBQUFBLE1BQ3hDLE9BQU87QUFDTCx1QkFBZSw0QkFBdUIsS0FBSyxTQUFTLG9DQUFvQztBQUFBLE1BQzFGO0FBQUEsSUFDRixTQUFTLEdBQUc7QUFDVixxQkFBZSxnQkFBVywyQkFBMkI7QUFBQSxJQUN2RCxVQUFFO0FBQ0EsVUFBSSxLQUFLO0FBQ1AsWUFBSSxXQUFjO0FBQ2xCLFlBQUksY0FBYztBQUFBLE1BQ3BCO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFJQSxpQkFBZSxrQkFBa0I7QUFnQi9CLFVBQU0sV0FBVyxTQUFTLGVBQWUsb0JBQW9CO0FBQzdELFFBQUksQ0FBQyxTQUFVO0FBQ2YsVUFBTUMsUUFBTyxTQUFTLE1BQU0sS0FBSztBQUNqQyxRQUFJLENBQUNBLE9BQU07QUFDVCxxQkFBZSw2QkFBbUIsdURBQXVEO0FBQ3pGO0FBQUEsSUFDRjtBQUVBLFVBQU0sTUFBTSxTQUFTLGVBQWUsYUFBYTtBQUNqRCxRQUFJLEtBQUs7QUFBRSxVQUFJLFdBQVc7QUFBTSxVQUFJLGNBQWM7QUFBQSxJQUFhO0FBRS9ELFFBQUk7QUFDRixZQUFNLE1BQU8sTUFBTSxNQUFNLDBCQUEwQjtBQUFBLFFBQ2pELFFBQVM7QUFBQSxRQUNULFNBQVMsRUFBRSxnQkFBZ0IsbUJBQW1CO0FBQUEsUUFDOUMsTUFBUyxLQUFLLFVBQVUsRUFBRSxNQUFBQSxNQUFLLENBQUM7QUFBQSxNQUNsQyxDQUFDO0FBQ0QsWUFBTSxPQUFPLE1BQU0sSUFBSSxLQUFLO0FBRTVCLFVBQUksS0FBSyxJQUFJO0FBQ1gsdUJBQWUsZ0JBQVcsaUNBQWlDLFdBQVcsS0FBSyxRQUFRLENBQUMsdUNBQXVDO0FBQUEsTUFDN0gsT0FBTztBQUNMLHVCQUFlLHNCQUFpQixLQUFLLFNBQVMsOEJBQThCO0FBQUEsTUFDOUU7QUFBQSxJQUNGLFNBQVMsR0FBRztBQUNWLHFCQUFlLGdCQUFXLDJCQUEyQjtBQUFBLElBQ3ZELFVBQUU7QUFDQSxVQUFJLEtBQUs7QUFBRSxZQUFJLFdBQVc7QUFBTyxZQUFJLGNBQWM7QUFBQSxNQUF3QjtBQUFBLElBQzdFO0FBQUEsRUFDRjtBQVNBLFdBQVNDLDBCQUF5QixZQUFZO0FBQzVDLFVBQU0sUUFBUSxTQUFTLGVBQWUsb0JBQW9CO0FBQzFELFFBQUksQ0FBQyxNQUFPO0FBRVosVUFBTSxXQUFjLFdBQVcsZ0JBQWdCLENBQUM7QUFDaEQsVUFBTSxXQUFlLFNBQVMsV0FBWSxJQUFJLEtBQUs7QUFDbkQsVUFBTSxZQUFlLFNBQVMsU0FBWSxJQUFJLEtBQUs7QUFDbkQsVUFBTSxlQUFlLFNBQVMsZ0JBQWdCLENBQUMsR0FBRyxPQUFPLE9BQU8sRUFBRSxNQUFNLEdBQUcsQ0FBQztBQUc1RSxVQUFNLFVBQVVDLGNBQWEsV0FBVyxJQUFJLEtBQUs7QUFDakQsVUFBTSxTQUFTLE9BQU8sWUFBWSxXQUFXLFVBQVcsVUFBVSxRQUFRLEtBQUs7QUFDL0UsVUFBTSxTQUFTLE9BQU8sUUFBUSxZQUFZLEdBQUcsRUFBRSxRQUFRLFFBQVEsR0FBRyxFQUFFLFlBQVk7QUFHaEYsVUFBTSxPQUFTLFNBQVMsZUFBZSxvQkFBb0I7QUFDM0QsVUFBTSxRQUFTLE9BQU8sS0FBSyxRQUFRO0FBQ25DLFVBQU0sU0FBUyxNQUFNLFlBQVk7QUFDakMsVUFBTSxRQUFTLE1BQU0sS0FBSyxFQUFFLFNBQVM7QUFFckMsUUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsWUFBWSxRQUFRO0FBQ2hELFlBQU0sWUFBWTtBQUNsQjtBQUFBLElBQ0Y7QUFFQSxVQUFNLFNBQVMsQ0FBQztBQUdoQixRQUFJLFNBQVM7QUFDWCxZQUFNLFNBQVMsUUFBUSxZQUFZO0FBQ25DLFlBQU0sT0FBUyxPQUFPLFNBQVMsTUFBTTtBQUNyQyxZQUFNLE9BQVMsU0FBUyxPQUFPLFNBQVMsTUFBTTtBQUM5QyxZQUFNLFVBQVUsQ0FBQztBQUNqQixVQUFJLENBQUMsS0FBZSxTQUFRLEtBQUssSUFBSTtBQUNyQyxVQUFJLFNBQVMsQ0FBQyxLQUFNLFNBQVEsS0FBSyxjQUFjO0FBQy9DLFlBQU0sU0FBUyxRQUFRLFdBQVcsSUFBSSxTQUFTLFFBQVEsU0FBUyxLQUFLLFFBQVEsU0FBUztBQUN0RixhQUFPLEtBQUs7QUFBQSxRQUNWO0FBQUEsUUFDQSxPQUFRO0FBQUEsUUFDUixRQUFRLFdBQVcsU0FDZixTQUFTLFdBQVcsT0FBTyxDQUFDLG1DQUM1QixTQUFTLFdBQVcsT0FBTyxDQUFDLHdCQUF3QixRQUFRLEtBQUssSUFBSSxDQUFDO0FBQUEsTUFDNUUsQ0FBQztBQUFBLElBQ0g7QUFHQSxRQUFJLFVBQVU7QUFDWixZQUFNLFVBQVksU0FBUyxZQUFZO0FBQ3ZDLFlBQU0sWUFBWSxRQUFRLFFBQVEsc0RBQXNELEVBQUU7QUFDMUYsWUFBTSxPQUFZLE9BQU8sU0FBUyxPQUFPLEtBQUssT0FBTyxTQUFTLFNBQVM7QUFDdkUsWUFBTSxPQUFZLFVBQVUsT0FBTyxTQUFTLE9BQU8sS0FBSyxPQUFPLFNBQVMsU0FBUztBQUNqRixZQUFNLFVBQVksQ0FBQztBQUNuQixVQUFJLENBQUMsS0FBZSxTQUFRLEtBQUssSUFBSTtBQUNyQyxVQUFJLFNBQVMsQ0FBQyxLQUFNLFNBQVEsS0FBSyxjQUFjO0FBQy9DLFlBQU0sU0FBUyxRQUFRLFdBQVcsSUFBSSxTQUFTLFFBQVEsU0FBUyxLQUFLLFFBQVEsU0FBUztBQUN0RixhQUFPLEtBQUs7QUFBQSxRQUNWO0FBQUEsUUFDQSxPQUFRO0FBQUEsUUFDUixRQUFRLFdBQVcsU0FDZixTQUFTLFdBQVcsUUFBUSxDQUFDLG1DQUM3QixTQUFTLFdBQVcsUUFBUSxDQUFDLHdCQUF3QixRQUFRLEtBQUssSUFBSSxDQUFDO0FBQUEsTUFDN0UsQ0FBQztBQUFBLElBQ0g7QUFHQSxRQUFJLFlBQVksUUFBUTtBQUN0QixZQUFNLFlBQVksWUFBWSxPQUFPLFFBQU0sQ0FBQyxPQUFPLFNBQVMsR0FBRyxZQUFZLENBQUMsQ0FBQztBQUM3RSxZQUFNLFlBQVksUUFBUSxZQUFZLE9BQU8sUUFBTSxDQUFDLE9BQU8sU0FBUyxHQUFHLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQztBQUMxRixZQUFNLGdCQUFlLG9CQUFJLElBQUksQ0FBQyxHQUFHLFdBQVcsR0FBRyxTQUFTLENBQUMsR0FBRTtBQUMzRCxZQUFNLFNBQVMsaUJBQWlCLElBQUksU0FBUyxnQkFBZ0IsSUFBSSxTQUFTO0FBQzFFLFlBQU0sUUFBUyxDQUFDO0FBQ2hCLFVBQUksVUFBVSxPQUFRLE9BQU0sS0FBSyxvQkFBb0IsVUFBVSxJQUFJLENBQUFDLE9BQUssT0FBTyxXQUFXQSxFQUFDLENBQUMsT0FBTyxFQUFFLEtBQUssSUFBSSxDQUFDLEVBQUU7QUFDakgsVUFBSSxVQUFVLE9BQVEsT0FBTSxLQUFLLDhCQUE4QixVQUFVLElBQUksQ0FBQUEsT0FBSyxPQUFPLFdBQVdBLEVBQUMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRTtBQUMzSCxhQUFPLEtBQUs7QUFBQSxRQUNWO0FBQUEsUUFDQSxPQUFRLGlCQUFpQixZQUFZLE1BQU07QUFBQSxRQUMzQyxRQUFRLE1BQU0sU0FBUyxNQUFNLEtBQUssSUFBSSxJQUFJLE1BQU0sT0FBTyxZQUFZLE1BQU07QUFBQSxNQUMzRSxDQUFDO0FBQUEsSUFDSDtBQUdBLFFBQUksUUFBUTtBQUNWLFlBQU0sYUFBYSxvRUFBb0UsS0FBSyxNQUFNO0FBQ2xHLFlBQU0sU0FBYSxrQkFBa0IsS0FBSyxNQUFNO0FBQ2hELFlBQU0sV0FBYSxxQkFBcUIsS0FBSyxNQUFNO0FBQ25ELFlBQU0sY0FBYyxDQUFDLFlBQVksUUFBUSxRQUFRLEVBQUUsT0FBTyxPQUFPLEVBQUU7QUFDbkUsYUFBTyxLQUFLO0FBQUEsUUFDVixRQUFRLGVBQWUsSUFBSSxTQUFTO0FBQUEsUUFDcEMsT0FBUTtBQUFBLFFBQ1IsUUFBUSxlQUFlLElBQ25CLDBDQUNBO0FBQUEsTUFDTixDQUFDO0FBQUEsSUFDSDtBQUdBLFVBQU0sVUFBVSxDQUFDLEdBQUcsU0FBUyxpQkFBaUIsMEJBQTBCLENBQUMsRUFDdEUsSUFBSSxRQUFNLEdBQUcsTUFBTSxZQUFZLENBQUMsRUFBRSxPQUFPLE9BQU87QUFDbkQsVUFBTSxhQUFhLENBQUMsUUFBUSxRQUFRLEdBQUcsT0FBTztBQUU5QyxVQUFNLGNBQWM7QUFBQSxNQUNsQixDQUFDLG9CQUFvQixJQUFJO0FBQUEsTUFBRyxDQUFDLDJCQUEyQixJQUFJO0FBQUEsTUFDNUQsQ0FBQywrQkFBK0IsS0FBSztBQUFBLE1BQUcsQ0FBQyxpQkFBaUIsSUFBSTtBQUFBLE1BQzlELENBQUMsd0JBQXdCLEtBQUs7QUFBQSxNQUFHLENBQUMsa0JBQWtCLElBQUk7QUFBQSxNQUN4RCxDQUFDLG1CQUFtQixJQUFJO0FBQUEsTUFBRyxDQUFDLHFDQUFxQyxLQUFLO0FBQUEsTUFDdEUsQ0FBQyxjQUFjLEtBQUs7QUFBQSxNQUFHLENBQUMsMEJBQTBCLE9BQU87QUFBQSxJQUMzRDtBQUNBLFVBQU0saUJBQWlCLENBQUM7QUFDeEIsZUFBVyxDQUFDLE1BQU0sS0FBSyxLQUFLLGFBQWE7QUFDdkMsWUFBTUMsTUFBSyxJQUFJLE9BQU8sTUFBTSxNQUFNLFFBQVEsS0FBSyxLQUFLLENBQUMsS0FBSztBQUMxRCxVQUFJLFdBQVcsS0FBSyxPQUFLLEVBQUUsU0FBUyxJQUFJLENBQUMsS0FBSyxXQUFXLEtBQUssT0FBS0EsSUFBRyxLQUFLLENBQUMsQ0FBQyxHQUFHO0FBQzlFLHVCQUFlLEtBQUssU0FBUyxJQUFJLGtCQUFrQixNQUFNLFlBQVksQ0FBQyxRQUFRO0FBQUEsTUFDaEY7QUFBQSxJQUNGO0FBQ0EsUUFBSSxlQUFlLFNBQVMsR0FBRztBQUM3QixhQUFPLEtBQUs7QUFBQSxRQUNWLFFBQVE7QUFBQSxRQUNSLE9BQVE7QUFBQSxRQUNSLFFBQVEsMENBQTBDLGVBQWUsS0FBSyxJQUFJLENBQUM7QUFBQSxNQUM3RSxDQUFDO0FBQUEsSUFDSCxXQUFXLFdBQVcsS0FBSyxPQUFLLEVBQUUsU0FBUyxFQUFFLEdBQUc7QUFDOUMsYUFBTyxLQUFLO0FBQUEsUUFDVixRQUFRO0FBQUEsUUFDUixPQUFRO0FBQUEsUUFDUixRQUFRO0FBQUEsTUFDVixDQUFDO0FBQUEsSUFDSDtBQUdBLFVBQU0sUUFBUSxFQUFFLE1BQU0sVUFBVSxNQUFNLGdCQUFnQixNQUFNLFNBQVM7QUFDckUsVUFBTSxjQUFnQixPQUFPLEtBQUssT0FBSyxFQUFFLFdBQVcsTUFBTTtBQUMxRCxVQUFNLGNBQWdCLE9BQU8sS0FBSyxPQUFLLEVBQUUsV0FBVyxNQUFNO0FBQzFELFVBQU0sZ0JBQWdCLGNBQWMsU0FBUyxjQUFjLFNBQVM7QUFDcEUsVUFBTSxhQUFnQixjQUNsQiw4Q0FDQSxjQUFjLG1DQUFtQztBQUVyRCxVQUFNLFlBQVk7QUFBQTtBQUFBO0FBQUEsOENBRzBCLE1BQU0sYUFBYSxDQUFDO0FBQUEsbUNBQy9CLGFBQWEsS0FBSyxXQUFXLFVBQVUsQ0FBQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxVQU1qRSxPQUFPLElBQUksT0FBSztBQUFBLG9DQUNVLEVBQUUsTUFBTTtBQUFBLG9DQUNSLE1BQU0sRUFBRSxNQUFNLENBQUM7QUFBQSxxQ0FDZCxXQUFXLEVBQUUsS0FBSyxDQUFDO0FBQUEsc0NBQ2xCLEVBQUUsTUFBTTtBQUFBLGlCQUM3QixFQUFFLEtBQUssRUFBRSxDQUFDO0FBQUE7QUFBQTtBQUFBLEVBRzNCO0FBSUEsTUFBSSxtQkFBbUI7QUFDdkIsV0FBUyx1QkFBdUI7QUFDOUIsaUJBQWEsZ0JBQWdCO0FBQzdCLHVCQUFtQixXQUFXLE1BQU07QUFDbEMsWUFBTSxLQUFLLFNBQVMsZUFBZSxvQkFBb0I7QUFDdkQsVUFBSSxHQUFJLHNCQUFxQixHQUFHLEtBQUs7QUFBQSxJQUN2QyxHQUFHLEdBQUc7QUFBQSxFQUNSO0FBTUEsV0FBUyxxQkFBcUJKLE9BQU07QUFDbEMsVUFBTSxRQUFZLFNBQVMsZUFBZSxxQkFBcUI7QUFDL0QsVUFBTSxZQUFZLFNBQVMsZUFBZSxxQkFBcUI7QUFDL0QsUUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUNBLE1BQUssS0FBSyxFQUFHO0FBRzFDLFVBQU0sYUFBYUEsTUFBSyxNQUFNLElBQUksRUFBRSxLQUFLLE9BQUssRUFBRSxLQUFLLENBQUMsS0FBSyxJQUFJLEtBQUssRUFBRSxZQUFZO0FBQ2xGLFVBQU0sa0JBQWtCO0FBQUEsTUFDdEI7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0Y7QUFDQSxVQUFNLGlCQUFpQixnQkFBZ0IsS0FBSyxDQUFBSSxRQUFNQSxJQUFHLEtBQUssU0FBUyxDQUFDO0FBQ3BFLFVBQU0sZUFBZTtBQUFBLE1BQ25CLE1BQU0sQ0FBQztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsUUFBUSxpQkFDSiwrRkFDQTtBQUFBLElBQ047QUFHQSxVQUFNLFdBQVdKLE1BQUssTUFBTSxJQUFJLEVBQUUsSUFBSSxPQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTyxPQUFPO0FBQ25FLFVBQU0sZ0JBQWdCLFNBQVM7QUFBQSxNQUM3QixPQUFLLEVBQUUsWUFBWSxNQUFNLFVBQVUsWUFBWTtBQUFBLElBQ2pEO0FBQ0EsVUFBTSxZQUFZLFNBQVMsTUFBTSxLQUFLLElBQUksR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDO0FBQy9ELFVBQU0saUJBQWlCLFVBQVUsS0FBSyxPQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssSUFBSSxNQUFNLEtBQUssRUFBRSxDQUFDLEtBQUs7QUFFL0UsVUFBTSxpQkFBaUIsY0FBYyxNQUFNLFdBQVcsRUFBRSxDQUFDLEtBQUs7QUFDOUQsVUFBTSxrQkFBa0IsZUFBZSxZQUFZLE1BQU07QUFDekQsVUFBTSxjQUFjO0FBQUEsTUFDbEIsTUFBTSxDQUFDO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxRQUFRLGtCQUNKLHVGQUNBO0FBQUEsSUFDTjtBQUdBLFVBQU0sY0FBYyxxQkFBcUI7QUFDekMsUUFBSTtBQUNKLFFBQUksQ0FBQyxhQUFhO0FBQ2hCLHFCQUFlLEVBQUUsTUFBTSxNQUFNLE9BQU8scUJBQXFCLFFBQVEseUVBQW9FO0FBQUEsSUFDdkksT0FBTztBQUNMLFlBQU0sWUFBWUEsTUFBSyxZQUFZLEVBQUUsTUFBTSxJQUFJLE9BQU8sWUFBWSxZQUFZLEVBQUUsUUFBUSx1QkFBdUIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRztBQUNySSxxQkFBZTtBQUFBLFFBQ2IsTUFBTSxZQUFZO0FBQUEsUUFDbEIsTUFBTSxhQUFhO0FBQUEsUUFDbkIsT0FBTztBQUFBLFFBQ1AsUUFBUSxhQUFhLElBQ2pCLElBQUksV0FBVyxXQUFXLENBQUMsb0RBQzNCLGFBQWEsSUFDWCxJQUFJLFdBQVcsV0FBVyxDQUFDLGdGQUMzQixJQUFJLFdBQVcsV0FBVyxDQUFDLGVBQWUsUUFBUTtBQUFBLE1BQzFEO0FBQUEsSUFDRjtBQUdBLFVBQU0sZ0JBQWdCLE9BQU8scUJBQzFCLE9BQU8sMEJBQTBCLE9BQU8sdUJBQXVCLGdCQUFpQixDQUFDO0FBQ3BGLFVBQU0sY0FBZSxjQUFjLGNBQWMsSUFBSSxZQUFZO0FBQ2pFLFVBQU0sZUFBZSxjQUFjLFVBQVUsSUFBSSxZQUFZO0FBQzdELFVBQU0sU0FBYyxtREFBbUQsS0FBSyxVQUFVO0FBQ3RGLFVBQU0sYUFBYyw4Q0FBOEMsS0FBSyxjQUFjLE1BQU0sVUFBVTtBQUNyRyxVQUFNLFdBQWMsYUFBYSxFQUFFLElBQUksS0FBSyxJQUFJLEtBQUssUUFBUSxLQUFLLFFBQVEsSUFBSSxJQUMxRCxTQUFhLEVBQUUsSUFBSSxLQUFLLElBQUksS0FBSyxRQUFRLEtBQUssUUFBUSxJQUFJLElBQzdDLEVBQUUsSUFBSSxLQUFLLElBQUksS0FBSyxRQUFRLEtBQUssUUFBUSxJQUFJO0FBQzlFLFVBQU0sVUFBYyxhQUFhLEdBQUcsU0FBUyxFQUFFLFNBQUksU0FBUyxFQUFFLHlCQUMxQyxTQUFhLEdBQUcsU0FBUyxFQUFFLFNBQUksU0FBUyxFQUFFLGlCQUM3QixTQUFJLFNBQVMsRUFBRTtBQUVoRCxVQUFNLFFBQVdBLE1BQUssS0FBSyxFQUFFLE1BQU0sS0FBSyxFQUFFLE9BQU8sT0FBTyxFQUFFO0FBQzFELFVBQU0sUUFBVyxLQUFLLElBQUksS0FBTSxRQUFRLFNBQVMsS0FBTSxHQUFHO0FBQzFELFVBQU0sV0FBVyxRQUFRLFNBQVMsU0FBUyxZQUMxQixRQUFRLFNBQVMsS0FBVSxZQUMzQixTQUFTLFNBQVMsS0FBUyxZQUMzQixTQUFTLFNBQVMsU0FBUyxZQUMzQjtBQUNqQixVQUFNLFdBQVcsU0FBUyxTQUFTLE1BQU0sU0FBUyxTQUFTLEtBQUssU0FDL0MsU0FBUyxTQUFTLFVBQVUsU0FBUyxTQUFTLFNBQVMsU0FDdkQ7QUFDakIsVUFBTSxRQUFXLGlFQUFpRSxLQUFLLGdCQUFnQixRQUFRO0FBQy9HLFVBQU0saUJBQWlCO0FBQUEsTUFDckIsQ0FBQyxRQUFRLEdBQUc7QUFBQSxNQUNaLE9BQU8sZUFBZSxPQUFPO0FBQUEsTUFDN0IsUUFBUSxHQUFHLEtBQUssVUFBVSxLQUFLLFdBQzdCLFFBQVEsU0FBUyxLQUFLLHNCQUFzQixTQUFTLEVBQUUsU0FBSSxTQUFTLEVBQUUsTUFDcEUsUUFBUSxTQUFTLEtBQUsscUJBQXFCLFNBQVMsRUFBRSxZQUN0RCxzQkFDSjtBQUFBLElBQ0Y7QUFHQSxVQUFNLFdBQVdBLE1BQUssTUFBTSxRQUFRLEVBQUUsT0FBTyxPQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxLQUFLO0FBRTVFLFVBQU0sdUJBQXVCO0FBQUEsTUFDM0I7QUFBQSxNQUFjO0FBQUEsTUFBWTtBQUFBLE1BQzFCO0FBQUEsTUFDQTtBQUFBLE1BQXVCO0FBQUEsTUFDdkI7QUFBQSxNQUF1QjtBQUFBLElBQ3pCO0FBRUEsVUFBTSxxQkFBcUI7QUFBQSxNQUN6QjtBQUFBLE1BQWtCO0FBQUEsTUFDbEI7QUFBQSxNQUFxQjtBQUFBLElBQ3ZCO0FBQ0EsVUFBTSxrQkFBa0IscUJBQXFCLEtBQUssQ0FBQUksUUFBTUEsSUFBRyxLQUFLLFFBQVEsQ0FBQztBQUN6RSxVQUFNLGdCQUFrQixtQkFBbUIsS0FBSyxDQUFBQSxRQUFNQSxJQUFHLEtBQUssUUFBUSxDQUFDO0FBQ3ZFLFVBQU0sV0FBVztBQUFBLE1BQ2YsTUFBTTtBQUFBLE1BQ04sTUFBTSxDQUFDLG1CQUFtQjtBQUFBLE1BQzFCLE9BQU87QUFBQSxNQUNQLFFBQVEsa0JBQ0osc0RBQ0EsZ0JBQ0UsZ09BQ0E7QUFBQSxJQUNSO0FBR0EsVUFBTSxzQkFBc0I7QUFBQSxNQUMxQjtBQUFBO0FBQUEsTUFDQTtBQUFBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNGO0FBQ0EsVUFBTSxpQkFBaUIsb0JBQW9CLEtBQUssQ0FBQUEsUUFBTUEsSUFBRyxLQUFLSixLQUFJLENBQUM7QUFDbkUsVUFBTSxtQkFBbUI7QUFBQSxNQUN2QixNQUFNO0FBQUEsTUFDTixNQUFNLENBQUM7QUFBQSxNQUNQLE9BQU87QUFBQSxNQUNQLFFBQVEsaUJBQ0osNERBQ0E7QUFBQSxJQUNOO0FBR0EsVUFBTSxhQUFhO0FBQUEsTUFDakI7QUFBQSxNQUF5QjtBQUFBLE1BQXlCO0FBQUEsTUFDbEQ7QUFBQSxNQUFrQjtBQUFBLE1BQXdCO0FBQUEsTUFDMUM7QUFBQSxNQUE2QjtBQUFBLE1BQzdCO0FBQUEsTUFBc0M7QUFBQSxNQUN0QztBQUFBLE1BQWtCO0FBQUEsTUFBbUI7QUFBQSxNQUNyQztBQUFBLE1BQW9CO0FBQUEsTUFBd0I7QUFBQSxNQUM1QztBQUFBLE1BQWU7QUFBQSxNQUFnQjtBQUFBLElBQ2pDO0FBQ0EsVUFBTSxVQUFhQSxNQUFLLFlBQVk7QUFDcEMsVUFBTSxZQUFhLFdBQVcsT0FBTyxPQUFLLFFBQVEsU0FBUyxDQUFDLENBQUM7QUFDN0QsVUFBTSxjQUFjO0FBQUEsTUFDbEIsTUFBTSxVQUFVLFdBQVc7QUFBQSxNQUMzQixNQUFNLFVBQVUsU0FBUyxLQUFLLFVBQVUsVUFBVTtBQUFBLE1BQ2xELE1BQU0sVUFBVSxTQUFTO0FBQUEsTUFDekIsT0FBTztBQUFBLE1BQ1AsUUFBUSxVQUFVLFdBQVcsSUFDekIsb0RBQ0EsaUJBQWlCLFVBQVUsU0FBUyxJQUFJLE1BQU0sRUFBRSxjQUFjLFVBQVUsTUFBTSxHQUFHLENBQUMsRUFBRSxJQUFJLE9BQUssU0FBSSxDQUFDLFFBQUcsRUFBRSxLQUFLLElBQUksQ0FBQyxHQUFHLFVBQVUsU0FBUyxJQUFJLFdBQU0sRUFBRTtBQUFBLElBQ3pKO0FBR0EsVUFBTSxTQUFTLENBQUMsY0FBYyxhQUFhLGNBQWMsZ0JBQWdCLFVBQVUsa0JBQWtCLFdBQVc7QUFDaEgsY0FBVSxZQUFZLE9BQU8sSUFBSSxPQUFLO0FBQ3BDLFlBQU0sUUFBUSxFQUFFLE9BQU8sU0FBUyxFQUFFLE9BQU8sU0FBUztBQUNsRCxhQUFPLHdCQUF3QixLQUFLO0FBQUE7QUFBQSwrQkFFVCxXQUFXLEVBQUUsS0FBSyxDQUFDO0FBQUEsZ0NBQ2xCLEVBQUUsTUFBTTtBQUFBO0FBQUEsSUFFdEMsQ0FBQyxFQUFFLEtBQUssRUFBRTtBQUVWLFVBQU0sTUFBTSxVQUFVO0FBQUEsRUFDeEI7QUFJQSxXQUFTLHVCQUF1QjtBQUU5QixVQUFNLFdBQVcsT0FBTyxxQkFBc0IsT0FBTywwQkFBMEIsT0FBTyx1QkFBdUI7QUFDN0csUUFBSSxZQUFZLFNBQVMsYUFBYyxRQUFPLFNBQVM7QUFDdkQsUUFBSSxZQUFZLFNBQVMsUUFBYyxRQUFPLFNBQVM7QUFFdkQsVUFBTSxLQUFLRSxjQUFhLFdBQVcsS0FBSyxLQUFLO0FBQzdDLFVBQU0sWUFBWSxHQUFHLE1BQU0sSUFBSSxFQUFFLEtBQUssT0FBSyxFQUFFLEtBQUssQ0FBQztBQUNuRCxXQUFPLFlBQVksVUFBVSxLQUFLLEVBQUUsTUFBTSxHQUFHLEVBQUUsSUFBSTtBQUFBLEVBQ3JEOzs7QUNsc0JBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGdDQUFBRztBQUFBLElBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFpQkEsTUFBTSxrQkFBa0IsQ0FBQztBQUd6QixNQUFJLHNCQUFzQjtBQUcxQixXQUFTLDJCQUEyQjtBQUFFLDBCQUFzQjtBQUFBLEVBQUk7QUFJaEUsaUJBQWVBLHdCQUF1QjtBQUNwQyxVQUFNLFVBQVUsU0FBUyxlQUFlLGtCQUFrQjtBQUMxRCxZQUFRLFlBQVk7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFrQnBCLFVBQU0sVUFBVSxTQUFTLGVBQWUsVUFBVTtBQUNsRCxRQUFJLFNBQVM7QUFDWCxVQUFJLG9CQUFxQixTQUFRLFFBQVE7QUFDekMsY0FBUSxpQkFBaUIsU0FBUyxNQUFNO0FBQUUsOEJBQXNCLFFBQVE7QUFBQSxNQUFPLENBQUM7QUFBQSxJQUNsRjtBQUFBLEVBQ0Y7QUFJQSxXQUFTLDBCQUEwQjtBQUNqQyxVQUFNLE9BQU8sU0FBUyxlQUFlLFVBQVUsR0FBRyxTQUFTLElBQUksS0FBSztBQUNwRSxRQUFJLENBQUMsS0FBSztBQUFFLHFCQUFlLHlCQUFlLHFEQUFxRDtBQUFHO0FBQUEsSUFBUTtBQUcxRyxRQUFJLFlBQVksSUFBSSxNQUFNLFVBQVUsRUFBRSxJQUFJLENBQUFDLE9BQUtBLEdBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTyxPQUFPO0FBQ3ZFLFFBQUksVUFBVSxXQUFXLEdBQUc7QUFFMUIsWUFBTSxXQUFXLElBQUksTUFBTSxtREFBbUQsRUFDM0UsSUFBSSxDQUFBQSxPQUFLQSxHQUFFLEtBQUssQ0FBQyxFQUNqQixPQUFPLE9BQU87QUFDakIsVUFBSSxTQUFTLFNBQVMsRUFBRyxhQUFZO0FBQUEsSUFDdkM7QUFDQSxRQUFJLFVBQVUsV0FBVyxHQUFHO0FBRTFCLFlBQU0sYUFBYSxJQUFJLE1BQU0sS0FBSyxFQUFFLElBQUksQ0FBQUEsT0FBS0EsR0FBRSxLQUFLLENBQUMsRUFBRSxPQUFPLENBQUFBLE9BQUtBLEdBQUUsU0FBUyxDQUFDO0FBQy9FLFVBQUksV0FBVyxTQUFTLEVBQUcsYUFBWTtBQUFBLElBQ3pDO0FBRUEsVUFBTSxZQUFZLFNBQVMsZUFBZSx3QkFBd0I7QUFDbEUsY0FBVSxZQUFZLFVBQVUsSUFBSSxDQUFDQSxJQUFHLE1BQU0sb0JBQW9CQSxJQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRTtBQUNoRixhQUFTLGVBQWUsYUFBYSxFQUFFLE1BQU0sVUFBVSxVQUFVLFNBQVMsS0FBSztBQUcvRSxjQUFVLFFBQVEsQ0FBQ0EsSUFBRyxNQUFNLGtCQUFrQkEsSUFBRyxDQUFDLENBQUM7QUFBQSxFQUNyRDtBQUlBLFdBQVMsb0JBQW9CLFVBQVUsS0FBSztBQUMxQyxXQUFPO0FBQUEsa0RBQ3lDLEdBQUcsb0JBQW9CLFdBQVcsUUFBUSxDQUFDO0FBQUE7QUFBQSx3Q0FFckQsTUFBTSxDQUFDO0FBQUEsZ0JBQy9CLFdBQVcsUUFBUSxDQUFDO0FBQUE7QUFBQTtBQUFBLDRCQUdSLEdBQUc7QUFBQSwwQkFDTCxHQUFHO0FBQUEsZ0RBQ21CLEdBQUc7QUFBQTtBQUFBLFlBRXZDLENBQUMsVUFBUyxRQUFPLFdBQVcsRUFBRSxJQUFJLE9BQUs7QUFBQSwwQ0FDVCxNQUFNLFdBQVcsWUFBWSxFQUFFLGVBQWUsQ0FBQywyQkFBMkIsR0FBRyxLQUFLLENBQUMsWUFBWSxVQUFVLENBQUMsQ0FBQyxXQUFXLEVBQUUsS0FBSyxFQUFFLENBQUM7QUFBQTtBQUFBLHFEQUVySCxHQUFHLHdDQUF3QyxHQUFHO0FBQUEsNkJBQ3RFLEdBQUc7QUFBQSxxREFDcUIsR0FBRztBQUFBLGlDQUN2QixHQUFHO0FBQUEsdURBQ21CLEdBQUc7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUkxRDtBQUVBLFdBQVMsVUFBVSxLQUFLO0FBQ3RCLFdBQU8sRUFBRSxRQUFRLGtDQUE2QixNQUFNLHdCQUFtQixXQUFXLG1DQUE4QixFQUFFLEdBQUcsS0FBSztBQUFBLEVBQzVIO0FBSUEsV0FBUyxhQUFhLEtBQUssS0FBSyxLQUFLO0FBQ25DLGFBQVMsaUJBQWlCLFdBQVcsR0FBRyxpQkFBaUIsRUFBRSxRQUFRLENBQUFDLE9BQUtBLEdBQUUsVUFBVSxPQUFPLFFBQVEsQ0FBQztBQUNwRyxRQUFJLFVBQVUsSUFBSSxRQUFRO0FBQzFCLFFBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFHLGlCQUFnQixHQUFHLElBQUksQ0FBQztBQUNuRCxvQkFBZ0IsR0FBRyxFQUFFLFNBQVM7QUFBQSxFQUNoQztBQUVBLFdBQVMsbUJBQW1CLEtBQUs7QUFDL0IsVUFBTSxTQUFTLFNBQVMsY0FBYyxXQUFXLEdBQUcsd0JBQXdCO0FBQzVFLFdBQU8sU0FBUyxPQUFPLGFBQWEsVUFBVSxJQUFJO0FBQUEsRUFDcEQ7QUFJQSxpQkFBZSxrQkFBa0IsVUFBVSxLQUFLO0FBQzlDLFFBQUk7QUFDRixZQUFNLE1BQU8sTUFBTSxNQUFNLHlCQUF5QjtBQUFBLFFBQ2hELFFBQVM7QUFBQSxRQUNULFNBQVMsRUFBRSxnQkFBZ0IsbUJBQW1CO0FBQUEsUUFDOUMsTUFBUyxLQUFLLFVBQVUsRUFBRSxTQUFTLENBQUM7QUFBQSxNQUN0QyxDQUFDO0FBQ0QsWUFBTSxPQUFPLE1BQU0sSUFBSSxLQUFLO0FBQzVCLFVBQUksQ0FBQyxLQUFLLElBQUk7QUFBRSxpQkFBUyxlQUFlLFlBQVksR0FBRyxFQUFFLEVBQUUsWUFBWTtBQUFJO0FBQUEsTUFBUTtBQUduRixZQUFNLFVBQVUsU0FBUyxlQUFlLFlBQVksR0FBRyxFQUFFO0FBQ3pELFVBQUksS0FBSyxPQUFPO0FBQ2QsY0FBTSxJQUFJLEtBQUs7QUFDZixnQkFBUSxZQUFZO0FBQUE7QUFBQSwyRUFFcUMsV0FBVyxFQUFFLFdBQVcsRUFBRSxDQUFDLEtBQUssV0FBVyxFQUFFLFFBQVEsRUFBRSxDQUFDO0FBQUEsd0NBQy9FLFlBQVksRUFBRSxZQUFZLElBQUksVUFBVSxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQUE7QUFBQTtBQUFBLHdEQUdoQyxHQUFHLDhCQUE4QixHQUFHO0FBQUE7QUFBQTtBQUFBO0FBSXRGLFlBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFHLGlCQUFnQixHQUFHLElBQUksQ0FBQztBQUNuRCx3QkFBZ0IsR0FBRyxFQUFFLGdCQUFnQixFQUFFLGlCQUFpQjtBQUFBLE1BQzFELE9BQU87QUFDTCxnQkFBUSxZQUFZO0FBQUEsTUFDdEI7QUFHQSxZQUFNLFFBQVEsU0FBUyxlQUFlLFVBQVUsR0FBRyxFQUFFO0FBQ3JELFVBQUksS0FBSyxlQUFlLEtBQUssWUFBWSxRQUFRO0FBQy9DLGNBQU0sUUFBUSxLQUFLLFlBQVksSUFBSSxPQUFLO0FBQUE7QUFBQSw2Q0FFRCxFQUFFLEdBQUcsMENBQTBDLEdBQUc7QUFBQTtBQUFBLHNCQUV6RSxXQUFXLEVBQUUsS0FBSyxDQUFDLGtCQUFlLFdBQVcsRUFBRSxPQUFPLENBQUM7QUFBQSwyQ0FDbEMsS0FBSyxNQUFNLEVBQUUsUUFBUSxHQUFHLENBQUM7QUFBQSx5REFDWCxXQUFXLEVBQUUsT0FBTyxDQUFDO0FBQUE7QUFBQSxpQkFFN0QsRUFBRSxLQUFLLEVBQUU7QUFDcEIsY0FBTSxZQUFZO0FBQUEsbUNBQ1csS0FBSztBQUNsQyxZQUFJLENBQUMsZ0JBQWdCLEdBQUcsRUFBRyxpQkFBZ0IsR0FBRyxJQUFJLENBQUM7QUFDbkQsd0JBQWdCLEdBQUcsRUFBRSxvQkFBb0IsS0FBSyxZQUFZLElBQUksT0FBSyxFQUFFLEdBQUc7QUFBQSxNQUMxRSxPQUFPO0FBQ0wsY0FBTSxZQUFZO0FBQUEsTUFDcEI7QUFBQSxJQUNGLFNBQVNDLElBQUc7QUFDVixlQUFTLGVBQWUsWUFBWSxHQUFHLEVBQUUsRUFBRSxZQUFZO0FBQUEsSUFDekQ7QUFBQSxFQUNGO0FBSUEsV0FBUyxlQUFlLEtBQUs7QUFDM0IsVUFBTSxLQUFLLFNBQVMsZUFBZSxnQkFBZ0IsR0FBRyxFQUFFO0FBQ3hELFFBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFHLGlCQUFnQixHQUFHLElBQUksQ0FBQztBQUNuRCxvQkFBZ0IsR0FBRyxFQUFFLFdBQVcsSUFBSSxXQUFXO0FBQUEsRUFDakQ7QUFFQSxXQUFTLG1CQUFtQixLQUFLO0FBQy9CLFVBQU0sUUFBWSxTQUFTLGVBQWUsWUFBWSxHQUFHLEVBQUU7QUFDM0QsVUFBTSxVQUFZLE1BQU0sS0FBSyxNQUFNLGlCQUFpQixnQ0FBZ0MsQ0FBQyxFQUNsRixPQUFPLFFBQU0sR0FBRyxPQUFPLEVBQ3ZCLElBQUksUUFBTSxTQUFTLEdBQUcsYUFBYSxVQUFVLEdBQUcsRUFBRSxDQUFDO0FBQ3RELFFBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFHLGlCQUFnQixHQUFHLElBQUksQ0FBQztBQUNuRCxvQkFBZ0IsR0FBRyxFQUFFLG9CQUFvQjtBQUFBLEVBQzNDO0FBSUEsaUJBQWUsMEJBQTBCLEtBQUs7QUF3QjVDLFVBQU0sTUFBVyxTQUFTLGVBQWUsY0FBYyxHQUFHLEVBQUU7QUFDNUQsUUFBSSxLQUFLO0FBQUUsVUFBSSxXQUFXO0FBQU0sVUFBSSxjQUFjO0FBQUEsSUFBaUI7QUFFbkUsVUFBTSxXQUFXLFNBQVMsZUFBZSxZQUFZLEdBQUcsRUFBRSxHQUFHLFFBQVEsWUFBWTtBQUNqRixVQUFNLFFBQVcsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0FBQzFDLFVBQU0sTUFBVyxtQkFBbUIsR0FBRztBQUN2QyxVQUFNLFFBQVksTUFBTSxZQUFZLE1BQU0sZ0JBQWlCLE1BQU0sZ0JBQWdCO0FBQ2pGLFVBQU0sU0FBVyxNQUFNLHFCQUFxQixDQUFDO0FBRTdDLFFBQUk7QUFDRixZQUFNLE1BQU8sTUFBTSxNQUFNLDJCQUEyQjtBQUFBLFFBQ2xELFFBQVM7QUFBQSxRQUNULFNBQVMsRUFBRSxnQkFBZ0IsbUJBQW1CO0FBQUEsUUFDOUMsTUFBUyxLQUFLLFVBQVU7QUFBQSxVQUN0QjtBQUFBLFVBQ0EsUUFBcUI7QUFBQSxVQUNyQixvQkFBcUI7QUFBQSxVQUNyQixnQkFBcUI7QUFBQSxRQUN2QixDQUFDO0FBQUEsTUFDSCxDQUFDO0FBQ0QsWUFBTSxPQUFPLE1BQU0sSUFBSSxLQUFLO0FBQzVCLFVBQUksQ0FBQyxLQUFLLElBQUk7QUFBRSx1QkFBZSxnQkFBVyxLQUFLLFNBQVMsb0JBQW9CO0FBQUc7QUFBQSxNQUFRO0FBRXZGLFVBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFHLGlCQUFnQixHQUFHLElBQUksQ0FBQztBQUNuRCxzQkFBZ0IsR0FBRyxFQUFFLGVBQWUsS0FBSztBQUN6QyxzQkFBZ0IsR0FBRyxFQUFFLFNBQWU7QUFFcEMsZUFBUyxlQUFlLGFBQWEsR0FBRyxFQUFFLEVBQUUsWUFBWTtBQUFBLDJEQUNELEdBQUc7QUFBQSxtQ0FDM0IsR0FBRyx1QkFBdUIsR0FBRyw0QkFBNEIsR0FBRztBQUFBLFNBQ3RGLFdBQVcsS0FBSyxJQUFJLENBQUM7QUFDMUIsZUFBUyxlQUFlLGdCQUFnQixHQUFHLEVBQUUsRUFBRSxNQUFNLFVBQVU7QUFBQSxJQUNqRSxTQUFTLEdBQUc7QUFDVixxQkFBZSxnQkFBVywyQkFBMkI7QUFBQSxJQUN2RCxVQUFFO0FBQ0EsVUFBSSxLQUFLO0FBQUUsWUFBSSxXQUFXO0FBQU8sWUFBSSxjQUFjO0FBQUEsTUFBb0I7QUFBQSxJQUN6RTtBQUFBLEVBQ0Y7QUFJQSxpQkFBZSx5QkFBeUI7QUFtQnRDLFVBQU0sTUFBTSxTQUFTLGVBQWUsYUFBYTtBQUNqRCxRQUFJLEtBQUs7QUFBRSxVQUFJLFdBQVc7QUFBTSxVQUFJLGNBQWM7QUFBQSxJQUFhO0FBRS9ELFVBQU0sWUFBWSxDQUFDO0FBQ25CLGFBQVMsaUJBQWlCLG9CQUFvQixFQUFFLFFBQVEsQ0FBQyxPQUFPLE1BQU07QUFDcEUsWUFBTSxNQUFTLE1BQU0sY0FBYyxxQ0FBcUM7QUFDeEUsWUFBTSxTQUFTLFNBQVMsZUFBZSxXQUFXLENBQUMsRUFBRTtBQUNyRCxZQUFNLFVBQVUsU0FBUyxlQUFlLFlBQVksQ0FBQyxFQUFFO0FBQ3ZELFVBQUksQ0FBQyxPQUFRO0FBRWIsWUFBTSxXQUFlLE1BQU0sSUFBSSxZQUFZLEtBQUssSUFBSTtBQUNwRCxZQUFNLGVBQWdCLGdCQUFnQixDQUFDLEdBQUcsZ0JBQWlCLE9BQU8sU0FBUztBQUMzRSxZQUFNLE1BQWUsbUJBQW1CLENBQUM7QUFDekMsWUFBTSxXQUFlLFVBQVUsUUFBUSxNQUFNLEtBQUssSUFBSTtBQUV0RCxnQkFBVSxLQUFLLEVBQUUsVUFBVSxXQUFXLFVBQVUsUUFBUSxLQUFLLGVBQWUsYUFBYSxDQUFDO0FBQUEsSUFDNUYsQ0FBQztBQUVELFFBQUksQ0FBQyxVQUFVLFFBQVE7QUFDckIscUJBQWUsZ0NBQXNCLHNEQUFzRDtBQUMzRixVQUFJLEtBQUs7QUFBRSxZQUFJLFdBQVc7QUFBTyxZQUFJLGNBQWM7QUFBQSxNQUF5QjtBQUM1RTtBQUFBLElBQ0Y7QUFFQSxRQUFJO0FBQ0YsWUFBTSxNQUFPLE1BQU0sTUFBTSx1QkFBdUI7QUFBQSxRQUM5QyxRQUFTO0FBQUEsUUFDVCxTQUFTLEVBQUUsZ0JBQWdCLG1CQUFtQjtBQUFBLFFBQzlDLE1BQVMsS0FBSyxVQUFVLEVBQUUsVUFBVSxDQUFDO0FBQUEsTUFDdkMsQ0FBQztBQUNELFlBQU0sT0FBTyxNQUFNLElBQUksS0FBSztBQUM1QixVQUFJLEtBQUssSUFBSTtBQUNYLHVCQUFlLGdCQUFXLEdBQUcsS0FBSyxLQUFLLFlBQVksS0FBSyxVQUFVLElBQUksTUFBTSxFQUFFLHFCQUFxQixXQUFXLEtBQUssUUFBUSxDQUFDLCtDQUErQztBQUFBLE1BQzdLLE9BQU87QUFDTCx1QkFBZSxzQkFBaUIsS0FBSyxTQUFTLDJCQUEyQjtBQUFBLE1BQzNFO0FBQUEsSUFDRixTQUFTLEdBQUc7QUFDVixxQkFBZSxnQkFBVywyQkFBMkI7QUFBQSxJQUN2RCxVQUFFO0FBQ0EsVUFBSSxLQUFLO0FBQUUsWUFBSSxXQUFXO0FBQU8sWUFBSSxjQUFjO0FBQUEsTUFBeUI7QUFBQSxJQUM5RTtBQUFBLEVBQ0Y7OztBQ3hVQTtBQUFBO0FBQUE7QUFBQTtBQUFBLCtCQUFBQztBQUFBLElBQUE7QUFBQTtBQWlCQSxNQUFNQyxRQUFNLFVBQVUsVUFBVTtBQUVoQyxXQUFTLGdCQUFnQixNQUFNO0FBQzdCLFFBQUksUUFBUSxRQUFRLE9BQU8sRUFBRyxRQUFPO0FBQ3JDLFVBQU0sSUFBSSxLQUFLLE1BQU0sT0FBTyxJQUFJO0FBQ2hDLFVBQU1DLEtBQUksS0FBSyxNQUFPLE9BQU8sT0FBUSxFQUFFO0FBQ3ZDLFVBQU0sSUFBSSxPQUFPO0FBQ2pCLFFBQUksSUFBSSxFQUFHLFFBQU8sR0FBRyxDQUFDLEtBQUtBLEVBQUM7QUFDNUIsUUFBSUEsS0FBSSxFQUFHLFFBQU8sR0FBR0EsRUFBQyxLQUFLLENBQUM7QUFDNUIsV0FBTyxHQUFHLENBQUM7QUFBQSxFQUNiO0FBRUEsV0FBUyx3QkFBd0IsT0FBTyxhQUFhO0FBQ25ELFFBQUksQ0FBQyxTQUFTLE9BQU8sTUFBTSxZQUFZLFVBQVU7QUFDL0MsYUFBTyw2QkFBNkIsWUFBWSxNQUFNO0FBQUEsSUFDeEQ7QUFFQSxVQUFNLFVBQVUsc0JBQXNCLEtBQUs7QUFDM0MsVUFBTSxZQUFZLE9BQU8sTUFBTSwyQkFBMkIsV0FDdEQsR0FBRyxLQUFLLE1BQU0sTUFBTSxzQkFBc0IsQ0FBQyxNQUMzQztBQUNKLFVBQU0sWUFBWSxPQUFPLE1BQU0sMkJBQTJCLFdBQ3RELEdBQUcsS0FBSyxNQUFNLE1BQU0sc0JBQXNCLENBQUMsTUFDM0M7QUFFSixXQUFPO0FBQUEsTUFDTCwwQkFBMEIsUUFBUSxPQUFPLGlEQUFpRCxTQUFTLGdCQUFXLFNBQVM7QUFBQSxNQUN2SCxxQkFBcUIsV0FBVyxRQUFRLElBQUksQ0FBQztBQUFBLE1BQzdDLG1CQUFtQixXQUFXLFFBQVEsTUFBTSxDQUFDO0FBQUEsSUFDL0MsRUFBRSxLQUFLLEVBQUU7QUFBQSxFQUNYO0FBSUEsaUJBQWVDLHVCQUFzQjtBQUNuQyxVQUFNLFVBQVUsU0FBUyxlQUFlLGtCQUFrQjtBQUcxRCxRQUFJLFlBQWE7QUFDakIsUUFBSSxhQUFhO0FBQ2pCLFFBQUk7QUFDRixZQUFNLE1BQU8sTUFBTSxNQUFNLGFBQWE7QUFDdEMsbUJBQWEsTUFBTSxJQUFJLEtBQUs7QUFDNUIsa0JBQWEsV0FBVyxtQkFBbUI7QUFBQSxJQUM3QyxTQUFTLEtBQUs7QUFBRSxNQUFBRixNQUFJLEtBQUssNENBQTRDLEdBQUc7QUFBQSxJQUFHO0FBRTNFLFFBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxZQUFZO0FBQ3ZDLGNBQVEsWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU9wQjtBQUFBLElBQ0Y7QUFFQSxVQUFNLFFBQVEsVUFBVSxTQUFTLENBQUM7QUFFbEMsUUFBSUcsUUFBTztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFVBVUgsTUFBTSxJQUFJLE9BQUssc0NBQXNDLFdBQVcsQ0FBQyxDQUFDLGNBQWMsRUFBRSxLQUFLLEVBQUUsS0FBSyxpQkFBaUI7QUFBQTtBQUFBLG9GQUVyQyxXQUFXLFVBQVUsVUFBVSxDQUFDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQTJDbEgsWUFBUSxZQUFZQTtBQUNwQiw4QkFBMEIsT0FBTyxVQUFVO0FBQzNDLFFBQUksV0FBWSwwQkFBeUIsVUFBVTtBQUNuRCxJQUFBQyx3QkFBdUI7QUFDdkIseUJBQXFCO0FBQUEsRUFDdkI7QUFFQSxpQkFBZSx1QkFBdUI7QUFDcEMsUUFBSTtBQUNGLFlBQU0sTUFBTSxNQUFNLE1BQU0sb0JBQW9CO0FBQzVDLFVBQUksQ0FBQyxJQUFJLEdBQUk7QUFDYixZQUFNLE9BQU8sTUFBTSxJQUFJLEtBQUs7QUFDNUIsWUFBTSxXQUFXLFNBQVMsZUFBZSxpQkFBaUI7QUFDMUQsWUFBTSxVQUFXLFNBQVMsZUFBZSxnQkFBZ0I7QUFDekQsVUFBSSxZQUFZLEtBQUssbUJBQW9CLFVBQVMsUUFBUSxLQUFLO0FBQy9ELFVBQUksV0FBWSxLQUFLLE9BQU87QUFDMUIsZ0JBQVEsUUFBUSxLQUFLO0FBQ3JCLGNBQU0sVUFBVSxTQUFTLGVBQWUsd0JBQXdCO0FBQ2hFLFlBQUksU0FBUztBQUNYLGdCQUFNLE1BQU0sS0FBSyxNQUFNO0FBQ3ZCLGtCQUFRLGNBQWMsR0FBRyxHQUFHO0FBQzVCLGtCQUFRLE1BQU0sUUFBUSxNQUFNLE9BQU8sWUFBWSxNQUFNLE9BQU8sWUFBWTtBQUFBLFFBQzFFO0FBQUEsTUFDRjtBQUFBLElBQ0YsU0FBU0MsSUFBRztBQUFBLElBQUM7QUFBQSxFQUNmO0FBSUEsV0FBUywwQkFBMEIsT0FBTyxZQUFZO0FBQ3BELFVBQU0sS0FBSyxTQUFTLGVBQWUscUJBQXFCO0FBQ3hELFFBQUksQ0FBQyxHQUFJO0FBRVQsVUFBTSxVQUFVLElBQUksS0FBSyxTQUFTLENBQUMsR0FBRyxJQUFJLFFBQU0sS0FBSyxJQUFJLFlBQVksQ0FBQyxDQUFDO0FBQ3ZFLFVBQU0sU0FBVSxDQUFDLEdBQUcsT0FBTyxFQUFFLEtBQUssT0FBSyxFQUFFLFNBQVMsTUFBTSxLQUFLLENBQUMsRUFBRSxTQUFTLGFBQWEsS0FBSyxDQUFDLEVBQUUsU0FBUyxjQUFjLENBQUM7QUFDdEgsVUFBTSxVQUFVLENBQUMsR0FBRyxPQUFPLEVBQUUsS0FBSyxPQUFLLEVBQUUsU0FBUyxPQUFPLEtBQUssQ0FBQyxFQUFFLFNBQVMsYUFBYSxLQUFLLENBQUMsRUFBRSxTQUFTLGNBQWMsS0FBSyxDQUFDLEVBQUUsU0FBUyxXQUFXLENBQUM7QUFDbkosVUFBTSxVQUFVLENBQUMsR0FBRyxPQUFPLEVBQUUsS0FBSyxPQUFLLEVBQUUsU0FBUyxPQUFPLENBQUM7QUFDMUQsVUFBTSxRQUFVLENBQUMsR0FBRyxPQUFPLEVBQUUsS0FBSyxPQUFLLEVBQUUsU0FBUyxhQUFhLEtBQUssRUFBRSxTQUFTLGNBQWMsQ0FBQztBQUM5RixVQUFNLFNBQVUsQ0FBQyxHQUFHLE9BQU8sRUFBRSxLQUFLLE9BQUssRUFBRSxTQUFTLFdBQVcsQ0FBQztBQUU5RCxVQUFNLFlBQWEsWUFBWSxjQUFjLENBQUM7QUFDOUMsVUFBTSxXQUFjLFVBQVcsT0FBTyxPQUFLLEVBQUUsV0FBVyxVQUFVLEVBQUUsV0FBVyxPQUFPLEVBQUU7QUFDeEYsVUFBTSxhQUFhLFVBQVUsU0FBUztBQUV0QyxVQUFNLGNBQWMsWUFBWSxxQkFBcUI7QUFFckQsVUFBTSxRQUFRO0FBQUEsTUFDWixFQUFFLElBQUksUUFBVSxPQUFPLG9CQUEyQixNQUFNLE1BQU07QUFBQSxNQUM5RCxFQUFFLElBQUksU0FBVSxPQUFPLHFCQUEyQixNQUFNLE1BQU07QUFBQSxNQUM5RCxFQUFFLElBQUksU0FBVSxPQUFPLHFCQUEyQixNQUFNLE1BQU07QUFBQSxNQUM5RCxFQUFFLElBQUksT0FBVSxPQUFPLDBCQUEyQixNQUFNLEtBQU07QUFBQSxNQUM5RCxFQUFFLElBQUksUUFBVSxPQUFPLDJCQUEyQixNQUFNLEtBQU07QUFBQSxNQUM5RDtBQUFBLFFBQUUsSUFBSSxjQUFjLGFBQWE7QUFBQSxRQUFHLE1BQU07QUFBQSxRQUN4QyxPQUFPLGFBQ0YsV0FBVyxJQUFJLHlCQUFvQixRQUFRLFNBQVMsYUFBYSxJQUFJLE1BQU0sRUFBRSxXQUFXLDBCQUN6RjtBQUFBLE1BQTZCO0FBQUEsTUFDbkMsRUFBRSxJQUFJLGFBQWEsTUFBTSxNQUFNLE9BQU8sZ0NBQWdDO0FBQUEsSUFDeEU7QUFFQSxVQUFNLE9BQU8sTUFBTSxJQUFJLENBQUMsRUFBRSxJQUFJLE9BQU8sS0FBSyxNQUFNO0FBQzlDLFlBQU0sT0FBUSxLQUFLLFdBQU8sT0FBTyxXQUFNO0FBQ3ZDLFlBQU0sUUFBUSxLQUFLLFlBQWEsT0FBTyxZQUFZO0FBQ25ELFlBQU0sS0FBUSxLQUFLLFlBQWEsT0FBTyxZQUFZO0FBQ25ELGFBQU8sb0ZBQW9GLEVBQUU7QUFBQSwwREFDdkMsSUFBSTtBQUFBLDJCQUNuQyxLQUFLLHVCQUF1QixXQUFXLEtBQUssQ0FBQztBQUFBO0FBQUEsSUFFdEUsQ0FBQyxFQUFFLEtBQUssRUFBRTtBQUVWLFVBQU0sY0FBYyxVQUFVLFdBQVc7QUFDekMsVUFBTSxjQUFjLGNBQWMsWUFBWTtBQUM5QyxPQUFHLFlBQVk7QUFBQTtBQUFBLHlDQUV3QixXQUFXO0FBQUEsUUFDNUMsSUFBSTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1aO0FBSUEsaUJBQWVELDBCQUF5QjtBQUN0QyxVQUFNLEtBQUssU0FBUyxlQUFlLG1CQUFtQjtBQUN0RCxRQUFJLENBQUMsR0FBSTtBQUNULFFBQUk7QUFDRixZQUFNLE1BQU8sTUFBTSxNQUFNLGVBQWU7QUFDeEMsVUFBSSxDQUFDLElBQUksR0FBSTtBQUNiLFlBQU0sT0FBTyxNQUFNLElBQUksS0FBSztBQUM1QixZQUFNLFFBQVEsS0FBSyxpQkFBaUIsQ0FBQztBQUNyQyxVQUFJLE1BQU0sV0FBVyxFQUFHO0FBQ3hCLFlBQU0sT0FBTyxNQUFNLElBQUksV0FBUztBQUM5QixjQUFNLFVBQVUsTUFBTSxXQUFXLE1BQU0sWUFBWTtBQUNuRCxjQUFNLE9BQU8sWUFBWSxhQUFhLFdBQU0sWUFBWSxXQUFXLGlCQUFPLFlBQVksYUFBYSxXQUFNO0FBQ3pHLGNBQU0sV0FBWSxZQUFZLE1BQU0saUJBQWlCLE1BQU0sWUFBWSxJQUFJLE1BQU0sR0FBRyxHQUFHLENBQUM7QUFDeEYsY0FBTSxRQUFZLFlBQVksTUFBTSxjQUFjLE1BQU0sYUFBYSxNQUFNLGFBQWEsSUFBSSxNQUFNLEdBQUcsR0FBRyxDQUFDO0FBQ3pHLGNBQU0sUUFBWSxXQUFXLE1BQU0sU0FBUyxNQUFNLFFBQVEsUUFBRztBQUM3RCxlQUFPO0FBQUEscUVBQ3dELEtBQUs7QUFBQSxxRUFDTCxRQUFRLEdBQUcsU0FBUyxXQUFXLE1BQU0sV0FBTSxFQUFFO0FBQUEscUVBQzdDLEtBQUssR0FBRyxNQUFNLFdBQVcsTUFBTSxXQUFNLEVBQUU7QUFBQSx5RUFDbkMsSUFBSSxJQUFJLFdBQVcsT0FBTyxDQUFDO0FBQUE7QUFBQSxNQUVoRyxDQUFDLEVBQUUsS0FBSyxFQUFFO0FBQ1YsU0FBRyxZQUFZO0FBQUE7QUFBQTtBQUFBLHlDQUdlLE1BQU0sTUFBTSxZQUFZLE1BQU0sV0FBVyxJQUFJLE1BQU0sRUFBRTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxxQkFZbEUsSUFBSTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBSXZCLFFBQVE7QUFBQSxJQUFrQjtBQUFBLEVBQzVCO0FBSUEsaUJBQWUsc0JBQXNCO0FBbUJuQyxVQUFNLE1BQVMsU0FBUyxlQUFlLGNBQWM7QUFDckQsVUFBTSxTQUFTLFNBQVMsZUFBZSxpQkFBaUI7QUFDeEQsVUFBTSxTQUFTLFNBQVMsZUFBZSxpQkFBaUIsRUFBRTtBQUMxRCxVQUFNLFFBQVMsU0FBUyxlQUFlLGdCQUFnQixFQUFFO0FBRXpELFFBQUksV0FBYztBQUNsQixRQUFJLGNBQWM7QUFDbEIsV0FBTyxNQUFNLFVBQVU7QUFDdkIsV0FBTyxZQUFnQjtBQUV2QixRQUFJO0FBQ0YsWUFBTSxNQUFPLE1BQU0sTUFBTSxpQkFBaUI7QUFBQSxRQUN4QyxRQUFTO0FBQUEsUUFDVCxTQUFTLEVBQUUsZ0JBQWdCLG1CQUFtQjtBQUFBLFFBQzlDLE1BQVMsS0FBSyxVQUFVLEVBQUUsUUFBUSxNQUFNLENBQUM7QUFBQSxNQUMzQyxDQUFDO0FBQ0QsWUFBTSxPQUFPLE1BQU0sSUFBSSxLQUFLO0FBRTVCLFVBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxLQUFLLElBQUk7QUFDdkIsZUFBTyxNQUFNLFVBQVU7QUFDdkIsZUFBTyxZQUFZO0FBQUE7QUFBQSx5Q0FFVyxXQUFXLEtBQUssU0FBUyxpQkFBaUIsQ0FBQztBQUFBO0FBRXpFLFlBQUksV0FBYztBQUNsQixZQUFJLGNBQWM7QUFDbEI7QUFBQSxNQUNGO0FBRUEsWUFBTSxVQUFVLEtBQUssV0FBVyxDQUFDO0FBQ2pDLFlBQU0sT0FBVSxLQUFLLGNBQWMsbUNBQW1DLFdBQVcsS0FBSyxXQUFXLENBQUMsWUFBWTtBQUM5RyxZQUFNLFVBQVUsS0FBSyxZQUNqQix5RUFBb0UsV0FBVyxLQUFLLFNBQVMsQ0FBQyxTQUM5RjtBQUNKLFlBQU0sZ0JBQWdCLFFBQVEscUJBQXFCO0FBQ25ELFlBQU0sY0FBZ0IsUUFBUSxnQkFBZ0IsQ0FBQztBQUMvQyxZQUFNRSxZQUFnQixRQUFRLGFBQWE7QUFDM0MsWUFBTSxlQUFnQixRQUFRO0FBQzlCLFlBQU0sY0FBZ0IsZ0JBQWdCLE9BQU8sZ0JBQWdCLFlBQVksSUFBSTtBQUU3RSxhQUFPLE1BQU0sVUFBVTtBQUN2QixhQUFPLFlBQVk7QUFBQTtBQUFBO0FBQUE7QUFBQSxnQ0FJUyxXQUFXLE1BQU0sQ0FBQztBQUFBLG1DQUNmLGFBQWE7QUFBQSxZQUNwQyx3QkFBd0JBLFdBQVUsV0FBVyxDQUFDO0FBQUEsWUFDOUMsY0FBYyx5QkFBeUIsV0FBVyxXQUFXLENBQUMsVUFBVSxFQUFFO0FBQUEsNEJBQzFELElBQUk7QUFBQTtBQUFBLFVBRXRCLE9BQU87QUFBQTtBQUdiLFVBQUksY0FBYztBQUdsQixZQUFNLG1CQUFtQjtBQUFBLElBQzNCLFNBQVMsS0FBSztBQUNaLGFBQU8sTUFBTSxVQUFVO0FBQ3ZCLGFBQU8sWUFBWTtBQUFBO0FBQUEsK0NBRW1CLFdBQVcsSUFBSSxPQUFPLENBQUM7QUFBQTtBQUU3RCxVQUFJLFdBQWM7QUFDbEIsVUFBSSxjQUFjO0FBQUEsSUFDcEI7QUFBQSxFQUNGO0FBSUEsaUJBQWUscUJBQXFCO0FBQ2xDLFVBQU0sVUFBVSxTQUFTLGVBQWUsaUJBQWlCO0FBQ3pELFlBQVEsTUFBTSxVQUFVO0FBQ3hCLFlBQVEsWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUtwQixRQUFJO0FBQ0YsWUFBTSxNQUFPLE1BQU0sTUFBTSx5QkFBeUI7QUFDbEQsWUFBTSxPQUFPLE1BQU0sSUFBSSxLQUFLO0FBRTVCLFVBQUksQ0FBQyxLQUFLLElBQUk7QUFDWixnQkFBUSxZQUFZO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUJBSVosV0FBVyxLQUFLLFNBQVMsMkJBQTJCLENBQUM7QUFBQTtBQUU3RDtBQUFBLE1BQ0Y7QUFFQSxZQUFNLGFBQWEsS0FBSyxjQUFjLENBQUM7QUFFdkMsVUFBSSxXQUFXLFdBQVcsR0FBRztBQUMzQixnQkFBUSxZQUFZO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBT3BCO0FBQUEsTUFDRjtBQUVBLFlBQU0sWUFBWTtBQUFBLFFBQ2hCLGlCQUFvQjtBQUFBLFFBQ3BCLFdBQW9CO0FBQUEsUUFDcEIsaUJBQW9CO0FBQUEsUUFDcEIscUJBQW9CO0FBQUEsTUFDdEI7QUFFQSxVQUFJSCxRQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBaUJYLGlCQUFXLEtBQUssWUFBWTtBQUMxQixjQUFNLE9BQVcsVUFBVSxFQUFFLElBQUksS0FBSztBQUN0QyxjQUFNLFdBQVcsRUFBRSxZQUFZLEVBQUUsYUFBYSx5QkFDMUM7QUFBQSxnREFDc0MsV0FBVyxFQUFFLFFBQVEsQ0FBQyxXQUM1RDtBQUNKLFFBQUFBLFNBQVE7QUFBQSw4QkFDZ0IsV0FBVyxFQUFFLEVBQUUsQ0FBQztBQUFBO0FBQUEscURBRU8sV0FBVyxFQUFFLEVBQUUsQ0FBQztBQUFBLGlDQUNwQyxXQUFXLEVBQUUsRUFBRSxDQUFDO0FBQUE7QUFBQTtBQUFBLDJCQUd0QixXQUFXLEVBQUUsSUFBSSxDQUFDLEtBQUssSUFBSTtBQUFBLDRFQUNzQixXQUFXLEVBQUUsS0FBSyxRQUFRLE1BQUssR0FBRyxDQUFDLENBQUM7QUFBQTtBQUFBO0FBQUEsNENBR3BFLFdBQVcsRUFBRSxLQUFLLENBQUM7QUFBQSxjQUNqRCxRQUFRO0FBQUEsMEVBQ29ELFdBQVcsRUFBRSxRQUFRLENBQUM7QUFBQTtBQUFBLHdEQUV4QyxXQUFXLEVBQUUsU0FBUyxDQUFDO0FBQUE7QUFBQSxNQUUzRTtBQUVBLE1BQUFBLFNBQVE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFpQlIsY0FBUSxZQUFZQTtBQUFBLElBQ3RCLFNBQVMsS0FBSztBQUNaLGNBQVEsWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBLGdDQUlHLFdBQVcsSUFBSSxPQUFPLENBQUM7QUFBQTtBQUFBLElBRWhEO0FBQUEsRUFDRjs7O0FDN2NBO0FBQUE7QUFBQSxvQ0FBQUk7QUFBQTtBQWVBLE1BQU1DLFFBQU0sVUFBVSxnQkFBZ0I7QUFFdEMsaUJBQWVDLDRCQUEyQjtBQUN4QyxVQUFNLFVBQVUsU0FBUyxlQUFlLGtCQUFrQjtBQUMxRCxRQUFJLENBQUMsUUFBUztBQUVkLFlBQVEsWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFtQnBCLElBQUFELE1BQUksTUFBTSxxQ0FBcUM7QUFBQSxFQUNqRDs7O0FDekNBO0FBQUE7QUFBQSwrQkFBQUU7QUFBQTtBQWVBLE1BQU1DLFFBQU0sVUFBVSxXQUFXO0FBRWpDLGlCQUFlQyx1QkFBc0I7QUFDbkMsVUFBTSxVQUFVLFNBQVMsZUFBZSxrQkFBa0I7QUFDMUQsUUFBSSxDQUFDLFFBQVM7QUFFZCxZQUFRLFlBQVk7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBbUJwQixJQUFBRCxNQUFJLE1BQU0sdUNBQXVDO0FBQUEsRUFDbkQ7OztBQ3pDQTtBQUFBO0FBQUE7QUFBQSw4QkFBQUU7QUFBQSxJQUFBO0FBQUE7QUFBQTtBQWtCQSxNQUFNQyxRQUFNLFVBQVUsU0FBUztBQVEvQixNQUFNLHNCQUFzQjtBQUFBLElBQzFCLGlCQUFxQixFQUFFLE9BQU8sc0JBQTBCLE1BQU0sZ0JBQU8sTUFBTSxHQUFHLGFBQWEsa0JBQXNCO0FBQUEsSUFDakgsV0FBcUIsRUFBRSxPQUFPLFVBQTBCLE1BQU0sbUJBQVEsTUFBTSxHQUFHLGFBQWEsUUFBc0I7QUFBQSxJQUNsSCxxQkFBcUIsRUFBRSxPQUFPLFVBQTBCLE1BQU0sbUJBQVEsTUFBTSxHQUFHLGFBQWEsUUFBc0I7QUFBQSxJQUNsSCxpQkFBcUIsRUFBRSxPQUFPLHdCQUEwQixNQUFNLGFBQU8sTUFBTSxHQUFHLGFBQWEsa0JBQXNCO0FBQUEsSUFDakgsbUJBQXFCLEVBQUUsT0FBTyx3QkFBMEIsTUFBTSxtQkFBUSxNQUFNLEdBQUcsYUFBYSxvQkFBcUI7QUFBQSxFQUNuSDtBQUVBLE1BQU0sNEJBQTRCO0FBQUEsSUFDaEMsaUJBQXNCO0FBQUEsSUFDdEIsT0FBc0I7QUFBQSxJQUN0QixpQkFBc0I7QUFBQSxJQUN0QixtQkFBc0I7QUFBQSxFQUN4QjtBQUVBLE1BQU0sdUJBQXVCO0FBQUEsSUFDM0IsV0FBcUI7QUFBQSxJQUNyQixxQkFBcUI7QUFBQSxJQUNyQixtQkFBcUI7QUFBQSxFQUN2QjtBQUVBLE1BQU0sYUFBYTtBQUFBLElBQ2pCLFNBQVMsRUFBRSxPQUFPLFdBQWdCLE1BQU0sZ0JBQU8sT0FBTyxXQUFXLElBQUksV0FBVyxNQUFNLEVBQUU7QUFBQSxJQUN4RixNQUFTLEVBQUUsT0FBTyxRQUFnQixNQUFNLGdCQUFPLE9BQU8sV0FBVyxJQUFJLFdBQVcsTUFBTSxFQUFFO0FBQUEsSUFDeEYsTUFBUyxFQUFFLE9BQU8sY0FBZ0IsTUFBTSxVQUFNLE9BQU8sV0FBVyxJQUFJLFdBQVcsTUFBTSxFQUFFO0FBQUEsRUFDekY7QUFFQSxNQUFNLGNBQWM7QUFBQSxJQUNsQixNQUFRLEVBQUUsT0FBTyxRQUFVLE9BQU8sV0FBVyxJQUFJLFdBQVcsTUFBTSxFQUFFO0FBQUEsSUFDcEUsUUFBUSxFQUFFLE9BQU8sVUFBVSxPQUFPLFdBQVcsSUFBSSxXQUFXLE1BQU0sRUFBRTtBQUFBLElBQ3BFLEtBQVEsRUFBRSxPQUFPLE9BQVUsT0FBTyxXQUFXLElBQUksV0FBVyxNQUFNLEVBQUU7QUFBQSxJQUNwRSxNQUFRLEVBQUUsT0FBTyxJQUFVLE9BQU8sV0FBVyxJQUFJLFdBQVcsTUFBTSxFQUFFO0FBQUEsRUFDdEU7QUFJQSxXQUFTLGVBQWUsV0FBVztBQUNqQyxXQUFPLG9CQUFvQixVQUFVLElBQUksR0FBRyxlQUFlLFVBQVU7QUFBQSxFQUN2RTtBQU1BLFdBQVMsZ0JBQWdCLFVBQVU7QUFDakMsVUFBTSxTQUFTLENBQUM7QUFDaEIsZUFBVyxLQUFLLFVBQVU7QUFDeEIsWUFBTSxLQUFPLGVBQWUsQ0FBQztBQUM3QixZQUFNLE1BQU8sRUFBRSxrQkFBa0I7QUFDakMsWUFBTSxPQUFPLEVBQUUsY0FBa0I7QUFDakMsVUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFrQixRQUFPLEVBQUUsSUFBVSxDQUFDO0FBQ3BELFVBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxHQUFHLEVBQWEsUUFBTyxFQUFFLEVBQUUsR0FBRyxJQUFLLENBQUM7QUFDcEQsVUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQU8sUUFBTyxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksSUFBSSxDQUFDO0FBQ3pELGFBQU8sRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDO0FBQUEsSUFDOUI7QUFDQSxXQUFPO0FBQUEsRUFDVDtBQUVBLFdBQVMsV0FBVyxLQUFLLFdBQVc7QUFDbEMsV0FBTyxPQUFPLEtBQUssR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHQyxPQUFNO0FBQ3JDLFlBQU0sS0FBSyxVQUFVLENBQUMsR0FBRyxRQUFRO0FBQ2pDLFlBQU0sS0FBSyxVQUFVQSxFQUFDLEdBQUcsUUFBUTtBQUNqQyxhQUFPLEtBQUs7QUFBQSxJQUNkLENBQUM7QUFBQSxFQUNIO0FBT0EsV0FBUyxlQUFlLFlBQVk7QUFDbEMsV0FBTztBQUFBLEVBQ1Q7QUFJQSxXQUFTLGtCQUFrQixjQUFjO0FBQ3ZDLFdBQU8sYUFBYSxLQUFLLE9BQUssRUFBRSxtQkFBbUIsY0FDaEQsRUFBRSxlQUFlLFVBQVUsRUFBRSxlQUFlLFNBQVM7QUFBQSxFQUMxRDtBQUVBLFdBQVMsaUJBQWlCLEtBQUssZ0JBQWdCO0FBQzdDLFFBQUksUUFBUSxVQUFXLFFBQU87QUFDOUIsV0FBTyxlQUFlLEtBQUssT0FBSyxFQUFFLGVBQWUsVUFBVSxFQUFFLGVBQWUsUUFBUTtBQUFBLEVBQ3RGO0FBRUEsV0FBUyxpQkFBaUIsS0FBSyxNQUFNO0FBQ25DLFdBQU8sUUFBUSxjQUFjLFNBQVMsVUFBVSxTQUFTO0FBQUEsRUFDM0Q7QUFJQSxXQUFTLHNCQUFzQixNQUFNO0FBQ25DLFVBQU0sTUFBTSxZQUFZLElBQUksS0FBSyxZQUFZLE1BQU07QUFDbkQsUUFBSSxDQUFDLElBQUksTUFBTyxRQUFPO0FBQ3ZCLFdBQU8sNkZBQTZGLElBQUksRUFBRSxVQUFVLElBQUksS0FBSyxxQkFBcUIsSUFBSSxLQUFLLDJCQUEyQixJQUFJLElBQUksS0FBSyxDQUFDO0FBQUEsRUFDdE07QUFFQSxXQUFTLDBCQUEwQixLQUFLO0FBQ3RDLFVBQU0sTUFBTSxXQUFXLEdBQUcsS0FBSyxXQUFXLE1BQU07QUFDaEQsV0FBTyw4RkFBOEYsSUFBSSxFQUFFLFVBQVUsSUFBSSxLQUFLLHlCQUF5QixJQUFJLElBQUksSUFBSSxJQUFJLElBQUksS0FBSyxDQUFDO0FBQUEsRUFDbkw7QUFFQSxXQUFTLG1CQUFtQixHQUFHLEtBQUs7QUFDbEMsVUFBTSxVQUFZLG9CQUFvQixFQUFFLElBQUksS0FBSyxDQUFDO0FBQ2xELFVBQU0sV0FBWSxFQUFFLGlCQUFpQiwwQkFBMEIsRUFBRSxjQUFjLElBQUk7QUFDbkYsVUFBTSxZQUFZLEVBQUUsYUFBYSxzQkFBc0IsRUFBRSxVQUFVLElBQUk7QUFDdkUsVUFBTSxlQUFlLEVBQUUscUJBQXFCLEVBQUU7QUFFOUMsV0FBTyxrQkFBa0I7QUFBQSxNQUN2QixJQUFpQixFQUFFO0FBQUEsTUFDbkIsV0FBaUIsUUFBUSxTQUFTLEVBQUU7QUFBQSxNQUNwQyxpQkFBaUIscUJBQXFCLEVBQUUsSUFBSSxLQUFLO0FBQUEsTUFDakQsT0FBaUIsRUFBRTtBQUFBLE1BQ25CLFVBQWlCLEVBQUU7QUFBQSxNQUNuQixVQUFpQixFQUFFO0FBQUEsTUFDbkIsWUFBaUIsZUFBZSxFQUFFLFlBQVk7QUFBQSxNQUM5QyxZQUFrQixHQUFHLFFBQVEsR0FBRyxTQUFTO0FBQUEsTUFDekMsU0FBaUIsZUFBZSxDQUFDO0FBQUEsSUFDbkMsR0FBRztBQUFBLE1BQ0QsVUFBa0I7QUFBQSxNQUNsQixrQkFBa0I7QUFBQSxJQUNwQixDQUFDO0FBQUEsRUFDSDtBQUVBLFdBQVMscUJBQXFCLEtBQUssTUFBTSxZQUFZO0FBQ25ELFVBQU0sTUFBVyxZQUFZLElBQUksS0FBSyxZQUFZLE1BQU07QUFDeEQsVUFBTSxXQUFXLGlCQUFpQixLQUFLLElBQUk7QUFDM0MsVUFBTSxTQUFXLGdCQUFnQixHQUFHLElBQUksSUFBSSxJQUFJLEtBQUssSUFBSSxDQUFDO0FBQzFELFVBQU0sUUFBVyxXQUFXO0FBRTVCLFFBQUksQ0FBQyxJQUFJLE9BQU87QUFFZCxhQUFPLFdBQVcsSUFBSSxDQUFDLEdBQUcsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUU7QUFBQSxJQUNuRTtBQUVBLFVBQU0sYUFBYSxXQUFXLFdBQU07QUFDcEMsVUFBTSxhQUFhO0FBQUEsZ0hBQzJGLE1BQU07QUFBQSwrRUFDdkMsSUFBSSxLQUFLO0FBQUEsb0JBQ3BFLE1BQU0sVUFBVSxVQUFVO0FBQUEsVUFDcEMsSUFBSSxJQUFJLEtBQUssQ0FBQztBQUFBLHlGQUNpRSxLQUFLO0FBQUE7QUFBQTtBQUFBLGlCQUc3RSxNQUFNLFlBQVksV0FBVyxLQUFLLGVBQWU7QUFBQSxRQUMxRCxXQUFXLElBQUksQ0FBQyxHQUFHLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUM7QUFBQTtBQUVqRSxXQUFPO0FBQUEsRUFDVDtBQUVBLFdBQVMsZUFBZSxJQUFJLEtBQUssU0FBUztBQUN4QyxVQUFNLE1BQU0sV0FBVyxHQUFHLEtBQUssV0FBVyxNQUFNO0FBQ2hELFVBQU0sV0FBVyxPQUFPLE9BQU8sT0FBTyxFQUFFLEtBQUs7QUFDN0MsVUFBTSxXQUFXLGlCQUFpQixLQUFLLFFBQVE7QUFDL0MsVUFBTSxVQUFXLGVBQWUsRUFBRSxJQUFJLEdBQUcsSUFBSSxLQUFLLElBQUksQ0FBQztBQUN2RCxVQUFNLFFBQVcsU0FBUztBQUUxQixVQUFNLFFBQVcsV0FBVyxTQUFTLFdBQVc7QUFDaEQsVUFBTSxtQkFBbUIsTUFBTSxTQUFTLEtBQU0sTUFBTSxXQUFXLEtBQUssWUFBWSxNQUFNLENBQUMsQ0FBQyxHQUFHO0FBRTNGLFVBQU0sWUFBWSxNQUFNLElBQUksVUFBUSxxQkFBcUIsS0FBSyxNQUFNLFFBQVEsSUFBSSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUU7QUFFM0YsVUFBTSxhQUFhLFdBQVcsV0FBTTtBQUNwQyxXQUFPO0FBQUEsc0VBQzZELElBQUksRUFBRSxxQ0FBcUMsT0FBTztBQUFBLGdGQUN4QyxJQUFJLEtBQUs7QUFBQSxvQkFDckUsT0FBTyxVQUFVLFVBQVU7QUFBQSxVQUNyQyxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksS0FBSyxDQUFDO0FBQUEseUZBQ3FELEtBQUs7QUFBQTtBQUFBO0FBQUEsaUJBRzdFLE9BQU8sWUFBWSxXQUFXLEtBQUssZUFBZTtBQUFBLFFBQzNELG1CQUFtQixZQUFZLFNBQVMsSUFBSSxDQUFDLEdBQUcsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUFBO0FBQUEsRUFFaEc7QUFFQSxXQUFTLGdCQUFnQixJQUFJLFFBQVEsaUJBQWlCO0FBQ3BELFVBQU0sTUFBVyxvQkFBb0IsRUFBRSxLQUFLLEVBQUUsT0FBTyxJQUFJLE1BQU0sYUFBTSxNQUFNLEdBQUc7QUFDOUUsVUFBTSxXQUFXLGtCQUFrQixlQUFlO0FBQ2xELFVBQU0sVUFBVyxnQkFBZ0IsRUFBRSxJQUFJLEtBQUssSUFBSSxDQUFDO0FBQ2pELFVBQU0sUUFBVyxnQkFBZ0I7QUFDakMsVUFBTSxPQUFXLDBCQUEwQixFQUFFLEtBQUs7QUFFbEQsVUFBTSxPQUFjLFdBQVcsUUFBUSxVQUFVO0FBQ2pELFVBQU0sa0JBQWtCLEtBQUssU0FBUztBQUV0QyxVQUFNLFlBQVksS0FBSyxJQUFJLFNBQU87QUFDaEMsVUFBSSxDQUFDLGlCQUFpQjtBQUVwQixjQUFNLFVBQVcsT0FBTyxHQUFHO0FBQzNCLGNBQU0sUUFBVyxXQUFXLFNBQVMsV0FBVztBQUNoRCxjQUFNLFdBQVcsTUFBTSxTQUFTLEtBQU0sTUFBTSxXQUFXLEtBQUssWUFBWSxNQUFNLENBQUMsQ0FBQyxHQUFHO0FBQ25GLGVBQU8sV0FDSCxNQUFNLElBQUksVUFBUSxxQkFBcUIsS0FBSyxNQUFNLFFBQVEsSUFBSSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFDekUsUUFBUSxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFO0FBQUEsTUFDdkU7QUFDQSxhQUFPLGVBQWUsSUFBSSxLQUFLLE9BQU8sR0FBRyxDQUFDO0FBQUEsSUFDNUMsQ0FBQyxFQUFFLEtBQUssRUFBRTtBQUVWLFVBQU0sYUFBYSxXQUFXLFdBQU07QUFDcEMsV0FBTztBQUFBO0FBQUE7QUFBQSw0Q0FHbUMsT0FBTztBQUFBLDBDQUNULElBQUksSUFBSTtBQUFBO0FBQUE7QUFBQSx3QkFHMUIsT0FBTyxVQUFVLFVBQVU7QUFBQSxjQUNyQyxJQUFJLElBQUksS0FBSyxDQUFDO0FBQUEsNkZBQ2lFLEtBQUs7QUFBQTtBQUFBLFlBRXRGLE9BQU8sK0RBQStELElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtBQUFBO0FBQUE7QUFBQSxpQkFHdkYsT0FBTyxZQUFZLFdBQVcsS0FBSyxlQUFlO0FBQUE7QUFBQSxZQUV2RCxTQUFTO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJckI7QUFFQSxXQUFTLHFCQUFxQixVQUFVLFlBQVksZUFBZTtBQUNqRSxVQUFNLFNBQVMsZ0JBQWdCLFFBQVE7QUFDdkMsVUFBTSxTQUFTLFdBQVcsUUFBUSxPQUFPO0FBQUEsTUFDdkMsT0FBTyxRQUFRLG1CQUFtQixFQUFFLElBQUksQ0FBQyxDQUFDQyxJQUFHQyxFQUFDLE1BQU0sQ0FBQ0EsR0FBRSxhQUFhQSxFQUFDLENBQUM7QUFBQSxJQUN4RSxDQUFDO0FBRUQsVUFBTSxhQUFhLFNBQVM7QUFFNUIsVUFBTSxrQkFBa0IsQ0FBQyxhQUNyQjtBQUFBLCtDQUMrQixnQkFBZ0IsS0FBSyxJQUFJLGFBQWEsQ0FBQyxLQUFLLEVBQUU7QUFBQTtBQUFBLGdCQUc3RTtBQUVKLFVBQU0sZUFBZSxPQUFPLElBQUksUUFBTTtBQUNwQyxZQUFNLFNBQWMsT0FBTyxFQUFFO0FBQzdCLFlBQU0sYUFBYyxPQUFPLE9BQU8sTUFBTSxFQUFFLFFBQVEsYUFBVyxPQUFPLE9BQU8sT0FBTyxFQUFFLEtBQUssQ0FBQztBQUMxRixhQUFPLGdCQUFnQixJQUFJLFFBQVEsVUFBVTtBQUFBLElBQy9DLENBQUMsRUFBRSxLQUFLLEVBQUU7QUFFVixXQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUEsMkNBSWtDLFVBQVUsYUFBYSxlQUFlLElBQUksS0FBSyxHQUFHO0FBQUE7QUFBQSxNQUV2RixlQUFlO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxVQVdYLFVBQVUsYUFBYSxlQUFlLElBQUksTUFBTSxFQUFFO0FBQUE7QUFBQTtBQUFBLE1BR3RELFlBQVk7QUFBQTtBQUFBLEVBRWxCO0FBRUEsV0FBUyx1QkFBdUI7QUFDOUIsV0FBTztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT1Q7QUFJQSxpQkFBZSxrQkFBa0I7QUFDL0IsVUFBTSxNQUFPLE1BQU0sTUFBTSx5QkFBeUI7QUFDbEQsVUFBTSxPQUFPLE1BQU0sSUFBSSxLQUFLO0FBQzVCLFdBQU87QUFBQSxFQUNUO0FBRUEsaUJBQWUsY0FBYyxlQUFlLE9BQU87QUFDakQsVUFBTSxNQUFPLE1BQU0sTUFBTSx3QkFBd0I7QUFBQSxNQUMvQyxRQUFTO0FBQUEsTUFDVCxTQUFTLEVBQUUsZ0JBQWdCLG1CQUFtQjtBQUFBLE1BQzlDLE1BQVMsS0FBSyxVQUFVLEVBQUUsZUFBZSxhQUFhLENBQUM7QUFBQSxJQUN6RCxDQUFDO0FBQ0QsVUFBTSxPQUFPLE1BQU0sSUFBSSxLQUFLO0FBQzVCLFdBQU87QUFBQSxFQUNUO0FBSUEsV0FBUyxxQkFBcUIsSUFBSTtBQUNoQyxVQUFNLEtBQU8sU0FBUyxlQUFlLEVBQUU7QUFDdkMsVUFBTSxPQUFPLFNBQVMsZUFBZSxHQUFHLEVBQUUsT0FBTztBQUNqRCxRQUFJLENBQUMsR0FBSTtBQUNULFVBQU0sU0FBUyxHQUFHLE1BQU0sWUFBWTtBQUNwQyxPQUFHLE1BQU0sVUFBVSxTQUFTLEtBQUs7QUFDakMsUUFBSSxLQUFNLE1BQUssY0FBYyxTQUFTLFdBQU07QUFBQSxFQUM5QztBQUlBLGlCQUFlQyxzQkFBcUI7QUFDbEMsVUFBTSxVQUFVLFNBQVMsZUFBZSxrQkFBa0I7QUFDMUQsUUFBSSxDQUFDLFFBQVM7QUFFZCxZQUFRLFlBQVk7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBT3BCLFFBQUksYUFBYSxDQUFDO0FBQ2xCLFFBQUksYUFBYTtBQUNqQixRQUFJLFdBQWEsQ0FBQztBQUNsQixRQUFJLGdCQUFnQjtBQUVwQixRQUFJO0FBQ0YsWUFBTSxXQUFXLE1BQU0sZ0JBQWdCO0FBQ3ZDLFVBQUksQ0FBQyxTQUFTLElBQUk7QUFDaEIsZ0JBQVEsWUFBWSw4RkFBdUYsSUFBSSxTQUFTLFNBQVMsZUFBZSxDQUFDO0FBQ2pKO0FBQUEsTUFDRjtBQUNBLG1CQUFhLFNBQVMsY0FBYyxDQUFDO0FBQUEsSUFDdkMsU0FBUyxLQUFLO0FBQ1osTUFBQUosTUFBSSxNQUFNLCtDQUErQyxHQUFHO0FBQzVELGNBQVEsWUFBWTtBQUNwQjtBQUFBLElBQ0Y7QUFFQSxRQUFJLFdBQVcsV0FBVyxHQUFHO0FBQzNCLGNBQVEsWUFBWSxxQkFBcUI7QUFDekM7QUFBQSxJQUNGO0FBRUEsUUFBSTtBQUNGLFlBQU0sZUFBZSxNQUFNLGNBQWMsS0FBSztBQUM5QyxVQUFJLGFBQWEsSUFBSTtBQUNuQixxQkFBYTtBQUNiLG1CQUFhLGFBQWEsWUFBWSxDQUFDO0FBQUEsTUFDekMsT0FBTztBQUNMLHdCQUFnQixhQUFhLFNBQVM7QUFDdEMsUUFBQUEsTUFBSSxLQUFLLHVDQUF1QyxhQUFhO0FBQUEsTUFDL0Q7QUFBQSxJQUNGLFNBQVMsS0FBSztBQUNaLE1BQUFBLE1BQUksTUFBTSw2Q0FBNkMsR0FBRztBQUMxRCxzQkFBZ0IsSUFBSTtBQUFBLElBQ3RCO0FBRUEsVUFBTSxlQUFlLE9BQU8sWUFBWSxTQUFTLElBQUksT0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNwRSxVQUFNLFdBQVcsV0FBVyxJQUFJLFFBQU07QUFBQSxNQUNwQyxHQUFHO0FBQUEsTUFDSCxnQkFBbUIsYUFBYSxFQUFFLEVBQUUsR0FBRyxrQkFBa0I7QUFBQSxNQUN6RCxZQUFtQixhQUFhLEVBQUUsRUFBRSxHQUFHLGNBQWtCO0FBQUEsTUFDekQsV0FBbUIsYUFBYSxFQUFFLEVBQUUsR0FBRyxhQUFrQjtBQUFBLE1BQ3pELG1CQUFtQjtBQUFBLElBQ3JCLEVBQUU7QUFFRixZQUFRLFlBQVkscUJBQXFCLFVBQVUsWUFBWSxhQUFhO0FBQzVFLCtCQUEyQixTQUFTLFNBQVM7QUFBQSxFQUMvQztBQUVBLGlCQUFlLHlCQUF5QjtBQUN0QyxVQUFNLFVBQVUsU0FBUyxlQUFlLGtCQUFrQjtBQUMxRCxRQUFJLENBQUMsUUFBUztBQUdkLFVBQU0sV0FBVyxTQUFTLGVBQWUsbUJBQW1CO0FBQzVELFFBQUksU0FBVSxVQUFTLFdBQVc7QUFHbEMsUUFBSTtBQUNGLFlBQU0sV0FBVyxNQUFNLGdCQUFnQjtBQUN2QyxZQUFNLGFBQWMsU0FBUyxNQUFNLFNBQVMsYUFBYyxTQUFTLGFBQWEsQ0FBQztBQUVqRixVQUFJLFdBQVcsV0FBVyxHQUFHO0FBQzNCLGdCQUFRLFlBQVkscUJBQXFCO0FBQ3pDO0FBQUEsTUFDRjtBQUVBLFVBQUksYUFBYTtBQUNqQixVQUFJLFdBQWEsQ0FBQztBQUNsQixVQUFJLGdCQUFnQjtBQUNwQixVQUFJO0FBQ0YsY0FBTSxlQUFlLE1BQU0sY0FBYyxJQUFJO0FBQzdDLFlBQUksYUFBYSxJQUFJO0FBQ25CLHVCQUFhO0FBQ2IscUJBQWEsYUFBYSxZQUFZLENBQUM7QUFBQSxRQUN6QyxPQUFPO0FBQ0wsMEJBQWdCLGFBQWEsU0FBUztBQUFBLFFBQ3hDO0FBQUEsTUFDRixTQUFTLEtBQUs7QUFDWix3QkFBZ0IsSUFBSTtBQUFBLE1BQ3RCO0FBRUEsWUFBTSxlQUFlLE9BQU8sWUFBWSxTQUFTLElBQUksT0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNwRSxZQUFNLFdBQVcsV0FBVyxJQUFJLFFBQU07QUFBQSxRQUNwQyxHQUFHO0FBQUEsUUFDSCxnQkFBbUIsYUFBYSxFQUFFLEVBQUUsR0FBRyxrQkFBa0I7QUFBQSxRQUN6RCxZQUFtQixhQUFhLEVBQUUsRUFBRSxHQUFHLGNBQWtCO0FBQUEsUUFDekQsV0FBbUIsYUFBYSxFQUFFLEVBQUUsR0FBRyxhQUFrQjtBQUFBLFFBQ3pELG1CQUFtQjtBQUFBLE1BQ3JCLEVBQUU7QUFFRixjQUFRLFlBQVkscUJBQXFCLFVBQVUsWUFBWSxhQUFhO0FBQzVFLGlDQUEyQixTQUFTLFNBQVM7QUFBQSxJQUMvQyxTQUFTLEtBQUs7QUFDWixNQUFBQSxNQUFJLE1BQU0sa0NBQWtDLEdBQUc7QUFBQSxJQUNqRDtBQUFBLEVBQ0Y7QUFFQSxpQkFBZSx5QkFBeUI7QUFDdEMsVUFBTSxhQUFjLFNBQVMsaUJBQWlCLGdDQUFnQztBQUM5RSxVQUFNLGNBQWMsTUFBTSxLQUFLLFVBQVUsRUFBRSxJQUFJLFFBQU0sR0FBRyxRQUFRLFNBQVM7QUFDekUsVUFBTSxZQUFjLFNBQVMsZUFBZSxnQkFBZ0I7QUFDNUQsVUFBTSxXQUFjLFNBQVMsZUFBZSxtQkFBbUI7QUFFL0QsUUFBSSxZQUFZLFdBQVcsR0FBRztBQUM1QixVQUFJLFVBQVcsV0FBVSxZQUFZO0FBQ3JDO0FBQUEsSUFDRjtBQUVBLFVBQU0sWUFBWSxPQUFPLE9BQU8scUJBQXFCLGFBQ2pEO0FBQUEsTUFDRSxXQUFXLFlBQVksTUFBTSxRQUFRLFlBQVksV0FBVyxJQUFJLE1BQU0sRUFBRTtBQUFBLE1BQ3hFO0FBQUEsSUFDRixJQUNBLFFBQVEsUUFBUSxPQUFPLFFBQVEsV0FBVyxZQUFZLE1BQU07QUFBQTtBQUFBLGlFQUE0RixDQUFDO0FBRTdKLFFBQUksQ0FBQyxVQUFXO0FBRWhCLFFBQUksVUFBVTtBQUFFLGVBQVMsV0FBVztBQUFNLGVBQVMsY0FBYztBQUFBLElBQWE7QUFDOUUsUUFBSSxVQUFXLFdBQVUsWUFBWTtBQUVyQyxRQUFJO0FBQ0YsWUFBTSxNQUFPLE1BQU0sTUFBTSxzQkFBc0I7QUFBQSxRQUM3QyxRQUFTO0FBQUEsUUFDVCxTQUFTLEVBQUUsZ0JBQWdCLG1CQUFtQjtBQUFBLFFBQzlDLE1BQVMsS0FBSyxVQUFVLEVBQUUsY0FBYyxZQUFZLENBQUM7QUFBQSxNQUN2RCxDQUFDO0FBQ0QsWUFBTSxPQUFPLE1BQU0sSUFBSSxLQUFLO0FBRTVCLFVBQUksQ0FBQyxLQUFLLElBQUk7QUFDWixZQUFJLFVBQVcsV0FBVSxZQUFZLDBDQUEwQyxJQUFJLEtBQUssU0FBUyxlQUFlLENBQUM7QUFDakg7QUFBQSxNQUNGO0FBRUEsWUFBTSxlQUFlLEtBQUssaUJBQWlCO0FBQzNDLFlBQU0sYUFBZSxLQUFLLGNBQWdCLFlBQVksSUFBSSxLQUFLLFdBQVcsQ0FBQyxNQUFNO0FBQ2pGLFlBQU0sYUFBZSxLQUFLLGNBQWdCLDBCQUEwQixJQUFJLEtBQUssV0FBVyxDQUFDLGFBQWE7QUFDdEcsWUFBTSxhQUFlLEtBQUssWUFDdEIsK0VBQXFFLElBQUksS0FBSyxXQUFXLFdBQVcsS0FBSyxTQUFTLENBQUMsU0FDbkg7QUFFSixVQUFJLFdBQVc7QUFDYixrQkFBVSxZQUFZO0FBQUE7QUFBQTtBQUFBLHFCQUdaLFlBQVksUUFBUSxpQkFBaUIsSUFBSSxNQUFNLEVBQUUsd0JBQXdCLFVBQVU7QUFBQTtBQUFBLFlBRXZGLGFBQWEsNkRBQTZELFVBQVUsU0FBUyxFQUFFO0FBQUEsWUFDL0YsVUFBVTtBQUFBO0FBQUEsTUFFbEI7QUFHQSxpQkFBVyxNQUFNLGFBQWE7QUFDNUIsY0FBTSxLQUFLLFNBQVMsZUFBZSxlQUFlLEVBQUUsRUFBRTtBQUN0RCxZQUFJLElBQUk7QUFBRSxhQUFHLFdBQVc7QUFBTSxhQUFHLFVBQVU7QUFBQSxRQUFPO0FBQ2xELGNBQU0sTUFBTSxTQUFTLGVBQWUsZUFBZSxFQUFFLEVBQUU7QUFDdkQsWUFBSSxJQUFLLEtBQUksTUFBTSxVQUFVO0FBQUEsTUFDL0I7QUFBQSxJQUNGLFNBQVMsS0FBSztBQUNaLE1BQUFBLE1BQUksTUFBTSxrQ0FBa0MsR0FBRztBQUMvQyxVQUFJLFVBQVcsV0FBVSxZQUFZLDJDQUEyQyxJQUFJLElBQUksT0FBTyxDQUFDO0FBQUEsSUFDbEcsVUFBRTtBQUNBLFVBQUksVUFBVTtBQUFFLGlCQUFTLFdBQVc7QUFBTyxpQkFBUyxjQUFjO0FBQUEsTUFBaUM7QUFBQSxJQUNyRztBQUFBLEVBQ0Y7OztBQ2pnQkE7QUFBQTtBQUFBLGlDQUFBSztBQUFBLElBQUEsK0JBQUFDO0FBQUE7QUE2QkEsTUFBTSxxQkFBcUIsb0JBQUksSUFBSTtBQUFBLElBQ2pDO0FBQUEsSUFBYztBQUFBLElBQWM7QUFBQSxJQUFpQjtBQUFBLElBQzdDO0FBQUEsSUFBa0I7QUFBQSxJQUFrQjtBQUFBO0FBQUEsSUFDcEM7QUFBQSxJQUFXO0FBQUEsRUFDYixDQUFDO0FBRUQsTUFBSSxhQUFhO0FBQ2pCLE1BQUk7QUFDRixpQkFBYSxhQUFhLFFBQVFDLGFBQVksdUJBQXVCLE1BQU07QUFBQSxFQUM3RSxTQUFTQyxLQUFJO0FBQUEsRUFFYjtBQUVBLFdBQVMsY0FBYyxXQUFXO0FBQ2hDLGlCQUFhO0FBQ2IsUUFBSTtBQUNGLG1CQUFhLFFBQVFELGFBQVkseUJBQXlCLE9BQU8sU0FBUyxDQUFDO0FBQUEsSUFDN0UsU0FBU0MsS0FBSTtBQUFBLElBRWI7QUFDQSxVQUFNLE1BQU0sU0FBUyxlQUFlLDBCQUEwQjtBQUM5RCxRQUFJLEtBQUs7QUFDUCxVQUFJLGNBQWMsWUFBWSxTQUFTO0FBQ3ZDLFVBQUksYUFBYSxpQkFBaUIsT0FBTyxDQUFDLFNBQVMsQ0FBQztBQUFBLElBQ3REO0FBQUEsRUFDRjtBQUVBLGlCQUFlLDBCQUEwQjtBQUN2QyxVQUFNLE9BQU8sU0FBUyxlQUFlLG9CQUFvQjtBQUN6RCxVQUFNLE9BQU8sU0FBUyxlQUFlLDJCQUEyQjtBQUNoRSxRQUFJLENBQUMsS0FBTTtBQUVYLFFBQUksWUFBWTtBQUNkLFdBQUssTUFBTSxVQUFVO0FBQ3JCO0FBQUEsSUFDRjtBQUNBLFNBQUssTUFBTSxVQUFVO0FBRXJCLFFBQUk7QUFDSixRQUFJO0FBRUYsYUFBTyxNQUFNQyxTQUFRLE9BQU8sa0JBQWtCO0FBQUEsSUFDaEQsU0FBU0QsS0FBSTtBQUVYLGFBQU87QUFBQSxJQUNUO0FBRUEsUUFBSSxRQUFRLEtBQUssTUFBTSxLQUFLLE1BQU07QUFDaEMsWUFBTSxZQUFhLE9BQU9FLGVBQWMsdUJBQXVCLGFBQzNEQSxjQUFhLG1CQUFtQixJQUFJLEVBQUUsU0FBUyxNQUFNO0FBRXpELFdBQUssWUFBWTtBQUVqQixZQUFNLFNBQVMsU0FBUyxlQUFlLHNCQUFzQjtBQUM3RCxZQUFNLGFBQWEsVUFBVSxVQUFVLFVBQVU7QUFDakQsYUFBTyxRQUFRLHFCQUFnQixVQUFVO0FBQ3pDLGFBQU8sVUFBVSxPQUFPLDhCQUE4QixRQUFRLFVBQVUsT0FBTyxDQUFDO0FBQ2hGLDJCQUFxQixRQUFRLEtBQUssSUFBSTtBQUV0QyxVQUFJLE1BQU07QUFDUixhQUFLLGNBQWMsVUFBVSxVQUN6QiwrRUFDQTtBQUFBLE1BQ047QUFDQTtBQUFBLElBQ0Y7QUFFQSxTQUFLLFlBQVk7QUFDakIsUUFBSSxLQUFNLE1BQUssY0FBYztBQUFBLEVBQy9CO0FBUUEsaUJBQWVDLHlCQUF3QixLQUFLO0FBQzFDLFVBQU0sUUFBUSxTQUFTLGVBQWUscUJBQXFCO0FBQzNELFFBQUksQ0FBQyxNQUFPO0FBQ1osUUFBSSxDQUFDLG1CQUFtQixJQUFJLEdBQUcsR0FBRztBQUNoQyxZQUFNLE1BQU0sVUFBVTtBQUN0QjtBQUFBLElBQ0Y7QUFDQSxVQUFNLE1BQU0sVUFBVTtBQUN0QixVQUFNLHdCQUF3QjtBQUFBLEVBQ2hDO0FBRUEsV0FBU0MseUJBQXdCO0FBQy9CLFVBQU0sTUFBTSxTQUFTLGVBQWUsMEJBQTBCO0FBQzlELFFBQUksQ0FBQyxJQUFLO0FBQ1YsUUFBSSxhQUFhLGlCQUFpQixPQUFPLENBQUMsVUFBVSxDQUFDO0FBQ3JELFFBQUksY0FBYyxhQUFhLFNBQVM7QUFDeEMsUUFBSSxpQkFBaUIsU0FBUyxNQUFNO0FBQ2xDLG9CQUFjLENBQUMsVUFBVTtBQUN6Qiw4QkFBd0I7QUFBQSxJQUMxQixDQUFDO0FBQUEsRUFDSDs7O0FDOUhBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsd0NBQUFDO0FBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsNkJBQUFDO0FBQUEsSUFBQTtBQUFBO0FBQUEsdUNBQUFDO0FBQUEsSUFBQTtBQUFBO0FBQUE7QUEyQkEsTUFBTSxrQkFBa0I7QUFDeEIsTUFBTSxrQkFBa0I7QUFFeEIsTUFBSSxjQUFjLE1BQU07QUFBRSxRQUFJO0FBQUUsYUFBTyxhQUFhLFFBQVEsZUFBZSxLQUFLO0FBQUEsSUFBZ0IsU0FBU0MsSUFBRztBQUFFLGFBQU87QUFBQSxJQUFnQjtBQUFBLEVBQUUsR0FBRztBQUMxSSxNQUFJLGNBQWMsTUFBTTtBQUFFLFFBQUk7QUFBRSxhQUFPLGFBQWEsUUFBUSxlQUFlLEtBQUs7QUFBQSxJQUFnQixTQUFTQSxJQUFHO0FBQUUsYUFBTztBQUFBLElBQWdCO0FBQUEsRUFBRSxHQUFHO0FBRTFJLE1BQUksaUJBQWlCLENBQUM7QUFDdEIsTUFBSSxnQkFBaUIsQ0FBQztBQUl0QixXQUFTLHlCQUF5QixnQkFBZ0I7QUFDaEQsUUFBSSxDQUFDLGVBQWUsUUFBUTtBQUMxQixhQUFPO0FBQUEsSUFDVDtBQUVBLFVBQU0sbUJBQW1CLDBCQUEwQjtBQUVuRCxXQUFPLHNDQUFzQyxlQUFlLElBQUksYUFBVztBQUN6RSxZQUFNLFlBQVksOEJBQThCLFNBQVMsRUFBRSxpQkFBaUIsQ0FBQztBQUM3RSxZQUFNLFdBQVcsYUFBYSxtQkFBbUIsUUFBUSxjQUFjLEVBQUUsQ0FBQztBQUMxRSxZQUFNLGFBQWEsVUFBVSxZQUN6QiwyRUFDQSwwQ0FBMEMsUUFBUTtBQUN0RCxhQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUEsc0JBSVcsV0FBVyxRQUFRLGlCQUFpQixVQUFVLENBQUM7QUFBQSwrQ0FDdEIsVUFBVSxTQUFTLDZDQUE2QyxXQUFXLFVBQVUsS0FBSyxDQUFDO0FBQUE7QUFBQTtBQUFBLGNBRzVILFdBQVcsd0JBQXdCLFFBQVEsS0FBSyxDQUFDLENBQUMsaUJBQWMsV0FBVyx1QkFBdUIsUUFBUSxPQUFPLENBQUMsQ0FBQyx1QkFBb0IsV0FBVyx1QkFBdUIsUUFBUSxhQUFhLENBQUMsQ0FBQztBQUFBO0FBQUE7QUFBQSxnREFHOUosVUFBVTtBQUFBO0FBQUEsSUFFeEQsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDO0FBQUEsRUFDYjtBQUVBLFdBQVMsd0JBQXdCLGVBQWUsRUFBRSxvQkFBb0IsTUFBTSxJQUFJLENBQUMsR0FBRztBQUNsRixRQUFJLENBQUMsY0FBYyxRQUFRO0FBQ3pCLGFBQU87QUFBQSxJQUNUO0FBRUEsYUFBU0MsNEJBQTJCLGFBQWE7QUFDL0MsVUFBSSxDQUFDLFlBQWEsUUFBTztBQUN6QixZQUFNLFdBQVcsT0FBTyxXQUFXO0FBQ25DLFlBQU0sUUFBUSxTQUFTLE1BQU0sT0FBTyxFQUFFLE9BQU8sT0FBTztBQUNwRCxVQUFJLE1BQU0sU0FBUyxFQUFHLFFBQU87QUFFN0IsWUFBTSxVQUFVLE1BQU0sTUFBTSxTQUFTLENBQUM7QUFDdEMsWUFBTSxRQUFRLFFBQVEsTUFBTSxpREFBaUQ7QUFDN0UsVUFBSSxDQUFDLE1BQU8sUUFBTztBQUVuQixZQUFNLENBQUMsRUFBRSxNQUFNLE9BQU8sS0FBSyxNQUFNLFFBQVEsTUFBTSxJQUFJO0FBQ25ELGFBQU8sR0FBRyxJQUFJLElBQUksS0FBSyxJQUFJLEdBQUcsSUFBSSxJQUFJLElBQUksTUFBTSxJQUFJLE1BQU07QUFBQSxJQUM1RDtBQUVBLFdBQU8sc0NBQXNDLGNBQWMsSUFBSSxDQUFDLFNBQVMsVUFBVTtBQUNqRixZQUFNLGNBQWMsV0FBVyxRQUFRLFFBQVEsRUFBRTtBQUNqRCxZQUFNLGFBQWFBLDRCQUEyQixRQUFRLElBQUk7QUFDMUQsWUFBTSxlQUFlLGFBQWEsdUJBQXVCLFVBQVUsSUFBSTtBQUN2RSxZQUFNLGFBQWEsdUJBQXVCLFFBQVEsU0FBUztBQUMzRCxZQUFNLFlBQVksZUFBZSxXQUFNLEtBQUssZUFBWSxXQUFXLFVBQVUsQ0FBQztBQUM5RSxZQUFNLGlCQUFpQixvQkFDbkI7QUFBQSx3REFDZ0QsV0FBVyxrQkFBa0IsS0FBSztBQUFBLHdEQUNsQyxXQUFXLCtGQUMzRDtBQUVKLGFBQU87QUFBQTtBQUFBO0FBQUE7QUFBQSxrQ0FJdUIsS0FBSyxLQUFLLFdBQVcsUUFBUSxpQkFBaUIsVUFBVSxDQUFDO0FBQUE7QUFBQTtBQUFBLCtCQUc1RCxLQUFLO0FBQUEsa0NBQ0YsS0FBSyx3QkFBd0IsV0FBVyxRQUFRLGlCQUFpQixFQUFFLENBQUMsd0NBQXdDLFdBQVcsa0JBQWtCLEtBQUs7QUFBQSxtRUFDN0csV0FBVyxrQkFBa0IsS0FBSztBQUFBLGtFQUNuQyxLQUFLO0FBQUE7QUFBQTtBQUFBLGNBR3pELFdBQVcsd0JBQXdCLFFBQVEsS0FBSyxDQUFDLENBQUMsaUJBQWMsV0FBVyxZQUFZLENBQUMsR0FBRyxTQUFTO0FBQUE7QUFBQTtBQUFBO0FBQUEsd0RBSTFELFdBQVc7QUFBQSxZQUN2RCxjQUFjO0FBQUE7QUFBQTtBQUFBLElBR3hCLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUFBLEVBQ2I7QUFFQSxXQUFTLCtCQUErQixnQkFBZ0IsZUFBZSxFQUFFLHlCQUF5QixNQUFNLElBQUksQ0FBQyxHQUFHO0FBQzlHLFVBQU0sbUJBQW1CLHlCQUNyQix5REFDQTtBQUVKLFdBQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxVQU9DLHlCQUF5QixjQUFjLENBQUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLHdEQUtNLGdCQUFnQjtBQUFBO0FBQUEsVUFFOUQsd0JBQXdCLGVBQWUsRUFBRSxtQkFBbUIsdUJBQXVCLENBQUMsQ0FBQztBQUFBO0FBQUE7QUFBQSxFQUcvRjtBQUVBLFdBQVNKLDhCQUE2QixTQUFTLENBQUMsR0FBRztBQUNqRCxVQUFNLFFBQVEsMEJBQTBCLE1BQU07QUFDOUMsVUFBTSxrQkFBa0IsU0FBUyxlQUFlLHdCQUF3QjtBQUN4RSxVQUFNLGNBQWMsU0FBUyxlQUFlLHNCQUFzQjtBQUNsRSxVQUFNLGFBQWEsU0FBUyxlQUFlLHFCQUFxQjtBQUNoRSxVQUFNLGFBQWEsUUFBUSwwQkFBMEIsQ0FBQztBQUV0RCxRQUFJLGdCQUFpQixpQkFBZ0IsY0FBYztBQUNuRCxRQUFJLFlBQWEsYUFBWSxVQUFVLE9BQU8scUJBQXFCLFVBQVU7QUFDN0UsUUFBSSxZQUFZO0FBQ2QsaUJBQVcsY0FBYyxhQUFhLG9CQUFvQixLQUFLLEtBQUs7QUFBQSxJQUN0RTtBQUFBLEVBQ0Y7QUFJQSxXQUFTRSw2QkFBNEIsVUFBVSw2REFBNkQ7QUFDMUcsV0FBTyxJQUFJLFFBQVEsYUFBVztBQUM1QixZQUFNLFVBQVUsU0FBUyxlQUFlLDRCQUE0QjtBQUNwRSxZQUFNLFlBQVksU0FBUyxlQUFlLDRCQUE0QjtBQUN0RSxZQUFNLG1CQUFtQixTQUFTLGVBQWUsOEJBQThCO0FBQy9FLFlBQU0sZ0JBQWdCLFNBQVMsZUFBZSwyQkFBMkI7QUFDekUsWUFBTSxjQUFjLFNBQVMsZUFBZSx3QkFBd0I7QUFDcEUsVUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsaUJBQWlCLENBQUMsYUFBYTtBQUNqRixnQkFBUSxXQUFXO0FBQ25CO0FBQUEsTUFDRjtBQUVBLFlBQU0sVUFBVSxDQUFDLFdBQVc7QUFDMUIsZ0JBQVEsTUFBTSxVQUFVO0FBQ3hCLHFCQUFhO0FBQ2IseUJBQWlCLFVBQVU7QUFDM0Isc0JBQWMsVUFBVTtBQUN4QixvQkFBWSxVQUFVO0FBQ3RCLGdCQUFRLE1BQU07QUFBQSxNQUNoQjtBQUVBLGdCQUFVLGNBQWM7QUFDeEIsY0FBUSxNQUFNLFVBQVU7QUFDeEIsYUFBTyw2QkFBNkIsU0FBUztBQUM3QyxzQkFBZ0IsNEJBQTRCO0FBQzVDLGdCQUFVLDRCQUE0QjtBQUV0Qyx1QkFBaUIsVUFBVSxNQUFNLFFBQVEsV0FBVztBQUNwRCxvQkFBYyxVQUFVLE1BQU0sUUFBUSxLQUFLO0FBQzNDLGtCQUFZLFVBQVUsTUFBTSxRQUFRLFVBQVU7QUFBQSxJQUNoRCxDQUFDO0FBQUEsRUFDSDtBQUVBLFdBQVMsNkJBQTZCLFNBQVMsYUFBYTtBQUMxRCxVQUFNLFVBQVUsU0FBUyxlQUFlLDRCQUE0QjtBQUNwRSxRQUFJLFFBQVMsU0FBUSxNQUFNLFVBQVU7QUFDckMsaUJBQWE7QUFDYixVQUFNLG1CQUFtQixTQUFTLGVBQWUsOEJBQThCO0FBQy9FLFFBQUksb0JBQW9CLE9BQU8saUJBQWlCLFlBQVksWUFBWTtBQUN0RSx1QkFBaUIsUUFBUTtBQUN6QjtBQUFBLElBQ0Y7QUFDQSxXQUFPO0FBQUEsRUFDVDtBQUlBLFdBQVMsV0FBVyxLQUFLO0FBQ3ZCLFFBQUksZUFBZSxLQUFLO0FBQ3RCLG1CQUFhLGVBQWUsUUFBUSxTQUFTO0FBQUEsSUFDL0MsT0FBTztBQUNMLG1CQUFhO0FBQ2IsbUJBQWEsUUFBUSxpQkFBaUIsU0FBUztBQUFBLElBQ2pEO0FBQ0EsUUFBSTtBQUNGLG1CQUFhLFFBQVEsaUJBQWlCLFVBQVU7QUFDaEQsbUJBQWEsUUFBUSxpQkFBaUIsVUFBVTtBQUFBLElBQ2xELFNBQVNDLElBQUc7QUFBQSxJQUE0QjtBQUN4QyxpQ0FBNkI7QUFBQSxFQUMvQjtBQUVBLFdBQVMsMkJBQTJCLGFBQWE7QUFDL0MsUUFBSSxDQUFDLFlBQWEsUUFBTztBQUN6QixVQUFNLFdBQVcsT0FBTyxXQUFXO0FBQ25DLFVBQU0sUUFBVyxTQUFTLE1BQU0sT0FBTyxFQUFFLE9BQU8sT0FBTztBQUN2RCxRQUFJLE1BQU0sU0FBUyxFQUFHLFFBQU87QUFDN0IsVUFBTSxVQUFXLE1BQU0sTUFBTSxTQUFTLENBQUM7QUFDdkMsVUFBTSxRQUFXLFFBQVEsTUFBTSxpREFBaUQ7QUFDaEYsUUFBSSxDQUFDLE1BQU8sUUFBTztBQUNuQixVQUFNLENBQUMsRUFBRSxNQUFNLE9BQU8sS0FBSyxNQUFNLFFBQVEsTUFBTSxJQUFJO0FBQ25ELFdBQU8sR0FBRyxJQUFJLElBQUksS0FBSyxJQUFJLEdBQUcsSUFBSSxJQUFJLElBQUksTUFBTSxJQUFJLE1BQU07QUFBQSxFQUM1RDtBQUVBLFdBQVMsMkJBQTJCLGdCQUFnQixlQUFlO0FBQ2pFLFVBQU0sbUJBQW1CLDBCQUEwQjtBQUNuRCxVQUFNLE9BQU8sQ0FBQztBQUVkLGVBQVcsS0FBSyxnQkFBZ0I7QUFDOUIsWUFBTSxZQUFZLDhCQUE4QixHQUFHLEVBQUUsaUJBQWlCLENBQUM7QUFDdkUsV0FBSyxLQUFLO0FBQUEsUUFDUixNQUFtQjtBQUFBLFFBQ25CLE1BQW9CLEVBQUUsaUJBQWlCO0FBQUEsUUFDdkMsU0FBb0IsRUFBRSxXQUFXO0FBQUEsUUFDakMsT0FBb0IsRUFBRSxTQUFpQjtBQUFBLFFBQ3ZDLG1CQUFvQixFQUFFLHNCQUFzQjtBQUFBLFFBQzVDLFVBQW9CLEVBQUUsYUFBYTtBQUFBLFFBQ25DLGNBQW9CLEVBQUUsZ0JBQWlCLElBQUksS0FBSyxFQUFFLGFBQWEsSUFBSTtBQUFBLFFBQ25FLFNBQW9CLEVBQUUsVUFBaUIsSUFBSSxLQUFLLEVBQUUsT0FBTyxJQUFVO0FBQUEsUUFDbkU7QUFBQSxRQUNBLFdBQW9CLEVBQUU7QUFBQSxRQUN0QixNQUFvQjtBQUFBLFFBQ3BCLEtBQW9CO0FBQUEsTUFDdEIsQ0FBQztBQUFBLElBQ0g7QUFFQSxrQkFBYyxRQUFRLENBQUMsR0FBRyxRQUFRO0FBQ2hDLFlBQU0sYUFBYSwyQkFBMkIsRUFBRSxJQUFJO0FBQ3BELFdBQUssS0FBSztBQUFBLFFBQ1IsTUFBbUI7QUFBQSxRQUNuQixNQUFvQixFQUFFLGlCQUFpQjtBQUFBLFFBQ3ZDLFNBQW9CLEVBQUUsV0FBVztBQUFBLFFBQ2pDLE9BQW9CLEVBQUUsU0FBaUI7QUFBQSxRQUN2QyxtQkFBb0IsRUFBRSxzQkFBc0I7QUFBQSxRQUM1QyxPQUFvQixFQUFFLFNBQVM7QUFBQSxRQUMvQixVQUFvQixFQUFFLGFBQWE7QUFBQSxRQUNuQyxjQUFvQixFQUFFLFlBQWEsSUFBSSxLQUFLLEVBQUUsU0FBUyxJQUFLO0FBQUEsUUFDNUQsU0FBb0IsYUFBZSxJQUFJLEtBQUssVUFBVSxJQUFNO0FBQUEsUUFDNUQsV0FBb0I7QUFBQSxRQUNwQixXQUFvQjtBQUFBLFFBQ3BCLE1BQW9CLEVBQUU7QUFBQSxRQUN0QjtBQUFBLE1BQ0YsQ0FBQztBQUFBLElBQ0gsQ0FBQztBQUVELFdBQU87QUFBQSxFQUNUO0FBRUEsV0FBUyxpQkFBaUIsTUFBTSxLQUFLLEtBQUs7QUFDeEMsV0FBTyxDQUFDLEdBQUcsSUFBSSxFQUFFLEtBQUssQ0FBQyxHQUFHRSxPQUFNO0FBQzlCLFVBQUksSUFBSTtBQUNSLGNBQVEsS0FBSztBQUFBLFFBQ1gsS0FBSztBQUNILGdCQUFNLEVBQUUsUUFBUSxJQUFJLFlBQVk7QUFDaEMsZ0JBQU1BLEdBQUUsUUFBUSxJQUFJLFlBQVk7QUFDaEMsaUJBQU8sUUFBUSxRQUFRLEdBQUcsY0FBYyxFQUFFLElBQUksR0FBRyxjQUFjLEVBQUU7QUFBQSxRQUNuRSxLQUFLLFVBQVU7QUFDYixnQkFBTSxPQUFPLE9BQUssRUFBRSxTQUFTLFdBQVksRUFBRSxXQUFXLFlBQVksSUFBSSxJQUFLO0FBQzNFLGVBQUssS0FBSyxDQUFDO0FBQUcsZUFBSyxLQUFLQSxFQUFDO0FBQ3pCLGlCQUFPLFFBQVEsUUFBUSxLQUFLLEtBQUssS0FBSztBQUFBLFFBQ3hDO0FBQUEsUUFDQSxLQUFLO0FBQ0gsZ0JBQU0sRUFBRSxTQUFTLElBQUksWUFBWTtBQUNqQyxnQkFBTUEsR0FBRSxTQUFTLElBQUksWUFBWTtBQUNqQyxpQkFBTyxRQUFRLFFBQVEsR0FBRyxjQUFjLEVBQUUsSUFBSSxHQUFHLGNBQWMsRUFBRTtBQUFBLFFBQ25FLEtBQUs7QUFBQSxRQUNMO0FBQ0UsZUFBSyxFQUFFLGVBQWUsRUFBRSxhQUFhLFFBQVEsSUFBSTtBQUNqRCxlQUFLQSxHQUFFLGVBQWVBLEdBQUUsYUFBYSxRQUFRLElBQUk7QUFDakQsaUJBQU8sUUFBUSxRQUFRLEtBQUssS0FBSyxLQUFLO0FBQUEsTUFDMUM7QUFBQSxJQUNGLENBQUM7QUFBQSxFQUNIO0FBRUEsV0FBUyw0QkFBNEI7QUFDbkMsVUFBTSxPQUFPO0FBQUEsTUFDWCxFQUFFLEtBQUssUUFBZ0IsT0FBTyxPQUFXO0FBQUEsTUFDekMsRUFBRSxLQUFLLFVBQWdCLE9BQU8sU0FBVztBQUFBLE1BQ3pDLEVBQUUsS0FBSyxTQUFnQixPQUFPLFFBQVc7QUFBQSxNQUN6QyxFQUFFLEtBQUssZ0JBQWdCLE9BQU8sV0FBVztBQUFBLElBQzNDO0FBQ0EsVUFBTSxRQUFRLEtBQUssSUFBSSxDQUFDLEVBQUUsS0FBSyxNQUFNLE1BQU07QUFDekMsWUFBTSxTQUFTLGVBQWU7QUFDOUIsWUFBTSxPQUFTLFNBQVUsZUFBZSxRQUFRLFdBQVcsV0FBWTtBQUN2RSxhQUFPLHFCQUFxQixTQUFTLGtCQUFrQixFQUFFLG1CQUFtQixHQUFHLCtDQUErQyxLQUFLLEtBQUssV0FBVyxLQUFLLENBQUMsNkJBQTZCLFNBQVMsb0JBQW9CLEVBQUUsS0FBSyxJQUFJO0FBQUEsSUFDaE8sQ0FBQztBQUNELFdBQU8seUJBQXlCLE1BQU0sS0FBSyxFQUFFLENBQUM7QUFBQSxFQUNoRDtBQUVBLFdBQVMsZ0JBQWdCLEdBQUc7QUFDMUIsUUFBSSxDQUFDLEVBQUcsUUFBTztBQUNmLFFBQUk7QUFDRixhQUFPLEVBQUUsZUFBZSxTQUFTO0FBQUEsUUFDL0IsT0FBTztBQUFBLFFBQVcsS0FBSztBQUFBLFFBQVcsTUFBTTtBQUFBLFFBQ3hDLE1BQU07QUFBQSxRQUFXLFFBQVE7QUFBQSxNQUMzQixDQUFDO0FBQUEsSUFDSCxTQUFTRixJQUFHO0FBQUUsYUFBTztBQUFBLElBQVU7QUFBQSxFQUNqQztBQUVBLFdBQVMsdUJBQXVCLEtBQUs7QUFDbkMsVUFBTSxhQUFhLFdBQVcsd0JBQXdCLElBQUksS0FBSyxDQUFDO0FBQ2hFLFVBQU0sV0FBYSxXQUFXLGdCQUFnQixJQUFJLFlBQVksQ0FBQztBQUUvRCxVQUFNLGFBQWEsSUFBSSxTQUFTLFdBQzVCLG9DQUFvQyxJQUFJLFVBQVUsU0FBUyw2Q0FBNkMsV0FBVyxJQUFJLFVBQVUsS0FBSyxDQUFDLFlBQ3ZJO0FBRUosUUFBSTtBQUNKLFFBQUksSUFBSSxTQUFTLFVBQVU7QUFDekIsWUFBTSxPQUFPLGFBQWEsbUJBQW1CLElBQUksYUFBYSxFQUFFLENBQUM7QUFDakUsbUJBQWEsSUFBSSxVQUFVLFlBQ3ZCLDZFQUNBLHVDQUF1QyxJQUFJO0FBQUEsSUFDakQsT0FBTztBQUNMLFlBQU0sS0FBTSxXQUFXLElBQUksUUFBUSxFQUFFO0FBQ3JDLFlBQU0sTUFBTSxJQUFJO0FBQ2hCLG1CQUNFLGlEQUFpRCxFQUFFLDRNQUNGLEVBQUUsa0JBQWtCLEdBQUcsa01BQ3BCLEVBQUUsbU1BQ0wsRUFBRTtBQUFBLElBQ3ZEO0FBRUEsVUFBTSxXQUFZLElBQUksU0FBUyxZQUFZLElBQUksVUFBVSxZQUFhLHdCQUF3QjtBQUU5RixVQUFNLGFBQWEsSUFBSSxVQUNuQiw4REFBOEQsV0FBVyxJQUFJLE9BQU8sQ0FBQyxXQUNyRjtBQUNKLFVBQU0sV0FBVyxJQUFJLFNBQVMsVUFDMUIscUJBQXFCLElBQUksR0FBRyxLQUFLLFdBQVcsSUFBSSxJQUFJLENBQUMsVUFDbEQsVUFBVSx1QkFDVSxJQUFJLEdBQUcseUZBQ0wsSUFBSSxHQUFHLHdCQUF3QixXQUFXLElBQUksSUFBSSxDQUFDLHdDQUN0RCxXQUFXLElBQUksUUFBUSxFQUFFLENBQUMsa0JBQWtCLElBQUksR0FBRyxtS0FFZixXQUFXLElBQUksUUFBUSxFQUFFLENBQUMsa0JBQWtCLElBQUksR0FBRyxvSUFDcEQsSUFBSSxHQUFHLDZGQUVoRSxTQUFTLFdBQVcsSUFBSSxJQUFJLENBQUMsVUFBVSxVQUFVO0FBRXJELFVBQU0sa0JBQWtCO0FBQUEsTUFDdEIsT0FBTztBQUFBLE1BQVMsT0FBTztBQUFBLE1BQVMsTUFBTTtBQUFBLE1BQVEsUUFBUTtBQUFBLE1BQ3RELFdBQVc7QUFBQSxNQUFhLFVBQVU7QUFBQSxNQUFZLFVBQVU7QUFBQSxNQUN4RCxRQUFRO0FBQUEsSUFDVjtBQUNBLFVBQU0sa0JBQWtCO0FBQUEsTUFDdEIsT0FBTztBQUFBLE1BQVcsT0FBTztBQUFBLE1BQVcsTUFBTTtBQUFBLE1BQVcsUUFBUTtBQUFBLE1BQzdELFdBQVc7QUFBQSxNQUFXLFVBQVU7QUFBQSxNQUFXLFVBQVU7QUFBQSxNQUNyRCxRQUFRO0FBQUEsSUFDVjtBQUNBLFVBQU0sWUFBWSxJQUFJLHFCQUFxQjtBQUMzQyxVQUFNLGlCQUFpQixhQUFhLGdCQUFnQixTQUFTLElBQ3pELDhCQUE4QixJQUFJLEdBQUcsMEVBQTBFLGdCQUFnQixTQUFTLENBQUMsdUNBQXVDLGdCQUFnQixTQUFTLENBQUMsWUFDMU0sNkJBQTZCLElBQUksR0FBRztBQUd4QyxVQUFNLG1CQUFtQixJQUFJLFNBQVMsVUFDbEMsNEJBQTRCLElBQUksR0FBRywrRkFDSixJQUFJLEdBQUcsMkxBRWxDLE9BQU8sUUFBUSxlQUFlLEVBQUU7QUFBQSxNQUFJLENBQUMsQ0FBQ0csSUFBRyxDQUFDLE1BQ3hDLGtCQUFrQkEsRUFBQyxJQUFJLGNBQWNBLEtBQUksY0FBYyxFQUFFLElBQUksQ0FBQztBQUFBLElBQ2hFLEVBQUUsS0FBSyxFQUFFLElBQ1gsaUVBQ3dELFdBQVcsSUFBSSxRQUFRLEVBQUUsQ0FBQyxrQkFBa0IsSUFBSSxHQUFHLHNJQUNwRCxJQUFJLEdBQUcsNkZBRWhFO0FBR0osVUFBTSxlQUFlLElBQUksUUFDckIsNkJBQTZCLElBQUksR0FBRyw2SUFBNkksV0FBVyxJQUFJLEtBQUssQ0FBQyxLQUFLLFdBQVcsSUFBSSxLQUFLLENBQUMsV0FDaE8sNkJBQTZCLElBQUksR0FBRztBQUN4QyxVQUFNLGtCQUFrQixJQUFJLFNBQVMsVUFDakMsMkJBQTJCLElBQUksR0FBRyw2R0FDSCxJQUFJLEdBQUcsa09BRTJELFdBQVcsSUFBSSxTQUFTLEVBQUUsQ0FBQyxzR0FFakUsV0FBVyxJQUFJLFFBQVEsRUFBRSxDQUFDLGtCQUFrQixJQUFJLEdBQUcsbUlBQ3BELElBQUksR0FBRyxtR0FHakU7QUFFSixRQUFJLElBQUksU0FBUyxTQUFTO0FBQ3hCLG9CQUNFLHNEQUFzRCxXQUFXLElBQUksUUFBUSxFQUFFLENBQUMsa0JBQWtCLElBQUksR0FBRztBQUMzRyxvQkFDRSxxREFBcUQsV0FBVyxJQUFJLFFBQVEsRUFBRSxDQUFDLGtCQUFrQixJQUFJLEdBQUc7QUFBQSxJQUM1RztBQUVBLFVBQU0sZ0JBQWdCLElBQUksWUFBWSxRQUNqQyxNQUFNO0FBQ0wsWUFBTSxJQUFJLE9BQU8sSUFBSSxRQUFRO0FBQzdCLFlBQU0sUUFBUSxLQUFLLEtBQUssWUFBWSxLQUFLLEtBQUssWUFBWTtBQUMxRCxhQUFPLHVHQUF1RyxLQUFLLHVEQUF1RCxDQUFDO0FBQUEsSUFDN0ssR0FBRyxJQUNIO0FBRUosV0FBTyxlQUFlLFFBQVEsb0NBQ00sUUFBUSwyQ0FDTixVQUFVLDZEQUNRLElBQUksR0FBRyxLQUFLLFVBQVUsR0FBRyxhQUFhLEdBQUcsY0FBYyxVQUFVLGdCQUFnQixHQUFHLFlBQVksR0FBRyxlQUFlLHlDQUN0SSxRQUFRLDRDQUNMLFVBQVU7QUFBQSxFQUVuRDtBQUVBLFdBQVMsb0JBQW9CLFlBQVk7QUFDdkMsUUFBSSxDQUFDLFdBQVcsT0FBUSxRQUFPO0FBQy9CLFVBQU0sUUFBUSxXQUFXLElBQUksU0FBTztBQUNsQyxZQUFNLFFBQVcsV0FBVyxJQUFJLElBQUk7QUFDcEMsWUFBTSxXQUFXLElBQUksU0FBUyxXQUN6QixJQUFJLFVBQVUsWUFBWSwwQkFBMEIsd0JBQ3JEO0FBQ0osWUFBTSxNQUFNLDhCQUE4QixRQUFRO0FBQ2xELFVBQUksSUFBSSxTQUFTLFVBQVU7QUFDekIsY0FBTSxPQUFRLGFBQWEsbUJBQW1CLElBQUksYUFBYSxFQUFFLENBQUM7QUFDbEUsY0FBTSxRQUFRLElBQUksVUFBVSxZQUFZLHVCQUF1QjtBQUMvRCxlQUFPLDJCQUEyQixLQUFLLFdBQVcsSUFBSSxLQUFLLEdBQUcsR0FBRyxLQUFLO0FBQUEsTUFDeEU7QUFDQSxhQUFPLHNFQUFzRSxXQUFXLElBQUksUUFBUSxFQUFFLENBQUMsS0FBSyxHQUFHLEdBQUcsS0FBSztBQUFBLElBQ3pILENBQUMsRUFBRSxLQUFLLEVBQUU7QUFDVixXQUFPLGtHQUFrRyxLQUFLO0FBQUEsRUFDaEg7QUFFQSxXQUFTLCtCQUErQjtBQUN0QyxVQUFNLE9BQU8sU0FBUyxlQUFlLHFCQUFxQjtBQUMxRCxRQUFJLENBQUMsS0FBTTtBQUVYLFVBQU0sT0FBUywyQkFBMkIsZ0JBQWdCLGFBQWE7QUFDdkUsVUFBTSxTQUFTLGlCQUFpQixNQUFNLGdCQUFnQixNQUFNO0FBQzVELFVBQU0sU0FBUyxpQkFBaUIsTUFBTSxZQUFZLFVBQVU7QUFFNUQsUUFBSSxPQUFPLFdBQVcsR0FBRztBQUN2QixXQUFLLFlBQVk7QUFDakI7QUFBQSxJQUNGO0FBRUEsVUFBTSxRQUFRO0FBQUEsTUFDWixlQUFlLFNBQVMsR0FBRyxlQUFlLE1BQU0sWUFBWTtBQUFBLE1BQzVELGNBQWMsU0FBVSxHQUFHLGNBQWMsTUFBTSxXQUFhO0FBQUEsSUFDOUQsRUFBRSxPQUFPLE9BQU87QUFFaEIsU0FBSyxZQUNILG9CQUFvQixPQUFPLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFDdEMseURBQ2dDLE1BQU0sS0FBSyxRQUFVLENBQUMsV0FDcEQsMEJBQTBCLElBQzFCLHlCQUF5QixPQUFPLElBQUksc0JBQXNCLEVBQUUsS0FBSyxFQUFFLENBQUM7QUFBQSxFQUUxRTtBQUVBLFdBQVMseUJBQXlCLEdBQUc7QUFDbkMsVUFBTSxVQUFVLEVBQUUsT0FBTyxRQUFRLGdCQUFnQjtBQUNqRCxRQUFJLFNBQVM7QUFBRSxpQkFBVyxRQUFRLFFBQVEsTUFBTTtBQUFHO0FBQUEsSUFBUTtBQUUzRCxVQUFNLE1BQU0sRUFBRSxPQUFPLFFBQVEsa0JBQWtCO0FBQy9DLFFBQUksQ0FBQyxJQUFLO0FBQ1YsVUFBTSxPQUFTLElBQUksUUFBUTtBQUMzQixVQUFNLE1BQVMsU0FBUyxJQUFJLFFBQVEsU0FBUyxNQUFNLEVBQUU7QUFDckQsVUFBTSxTQUFTLElBQUksUUFBUTtBQUMzQixRQUFTLFdBQVcsU0FBaUIseUJBQXdCLE1BQU0sR0FBRztBQUFBLGFBQzdELFdBQVcsZ0JBQWlCLDBCQUF5QixNQUFNLEdBQUc7QUFBQSxhQUM5RCxXQUFXLGdCQUFpQiwwQkFBeUIsR0FBRztBQUFBLGFBQ3hELFdBQVcsY0FBaUIsd0JBQXVCLEdBQUc7QUFBQSxhQUN0RCxXQUFXLGdCQUFpQix5QkFBd0IsTUFBTSxHQUFHO0FBQUEsYUFDN0QsV0FBVyxnQkFBaUIseUJBQXdCLEdBQUc7QUFBQSxhQUN2RCxXQUFXLGFBQWlCLHVCQUFzQixHQUFHO0FBQUEsYUFDckQsV0FBVyxlQUFpQix3QkFBdUIsTUFBTSxHQUFHO0FBQUEsYUFDNUQsV0FBVyxlQUFpQix3QkFBdUIsR0FBRztBQUFBLGFBQ3RELFdBQVcsT0FBaUIsMEJBQXlCLElBQUk7QUFBQSxhQUN6RCxXQUFXLFlBQWlCLDRCQUEyQixJQUFJO0FBQUEsYUFDM0QsV0FBVyxTQUFpQix5QkFBd0IsTUFBTSxDQUFDO0FBQUEsRUFDdEU7QUFFQSxXQUFTLDJCQUEyQixHQUFHO0FBQ3JDLFNBQUssRUFBRSxRQUFRLFdBQVcsRUFBRSxRQUFRLFFBQVEsRUFBRSxPQUFPLFFBQVEsZ0JBQWdCLEdBQUc7QUFDOUUsUUFBRSxlQUFlO0FBQ2pCLGlCQUFXLEVBQUUsT0FBTyxRQUFRLGdCQUFnQixFQUFFLFFBQVEsTUFBTTtBQUM1RDtBQUFBLElBQ0Y7QUFDQSxVQUFNLFFBQVEsRUFBRSxPQUFPLFFBQVEsZUFBZTtBQUM5QyxRQUFJLENBQUMsTUFBTztBQUNaLFVBQU0sT0FBTyxNQUFNLFFBQVE7QUFDM0IsVUFBTSxNQUFPLFNBQVMsTUFBTSxRQUFRLE9BQU8sRUFBRTtBQUM3QyxRQUFTLEVBQUUsUUFBUSxRQUFVLDBCQUF5QixNQUFNLEdBQUc7QUFBQSxhQUN0RCxFQUFFLFFBQVEsU0FBVSwwQkFBeUIsR0FBRztBQUFBLEVBQzNEO0FBSUEsaUJBQWVMLG1CQUFrQixFQUFFLFdBQVcsTUFBTSxJQUFJLENBQUMsR0FBRztBQUMxRCxVQUFNLFVBQVUsU0FBUyxlQUFlLHdCQUF3QjtBQUNoRSxRQUFJLENBQUMsUUFBUztBQUNkLFlBQVEsUUFBUSxrQkFBa0IsV0FBVyxNQUFNO0FBQ25ELFVBQU0sU0FBYyxTQUFTLGVBQWUsd0JBQXdCO0FBQ3BFLFVBQU0sY0FBYyxTQUFTLGVBQWUsNkJBQTZCO0FBQ3pFLFFBQUksT0FBYSxRQUFPLE1BQU0sVUFBZSxXQUFXLFNBQVM7QUFDakUsUUFBSSxZQUFhLGFBQVksTUFBTSxVQUFVLFdBQVcsU0FBUztBQUNqRSxZQUFRLE1BQU0sVUFBVTtBQUN4QixXQUFPLDZCQUE2QixTQUFTO0FBQzdDLFVBQU0seUJBQXlCO0FBQy9CLHVCQUFtQjtBQUNuQixjQUFVLHdCQUF3QjtBQUNsQyxvQkFBZ0Isd0JBQXdCO0FBQUEsRUFDMUM7QUFFQSxXQUFTLHFCQUFxQjtBQUM1QixVQUFNLFVBQVUsU0FBUyxlQUFlLHdCQUF3QjtBQUNoRSxRQUFJLENBQUMsUUFBUztBQUNkLFFBQUksUUFBUSxRQUFRLG9CQUFvQixJQUFLO0FBQzdDLFlBQVEsTUFBTSxVQUFVO0FBQ3hCLGlCQUFhO0FBQUEsRUFDZjtBQUVBLGlCQUFlLDJCQUEyQjtBQUN4QyxVQUFNLE9BQU8sU0FBUyxlQUFlLHFCQUFxQjtBQUMxRCxRQUFJLENBQUMsS0FBTTtBQUNYLFNBQUssWUFBWTtBQUNqQixRQUFJO0FBQ0YsWUFBTSxDQUFDLFdBQVcsUUFBUSxJQUFJLE1BQU0sUUFBUSxJQUFJO0FBQUEsUUFDOUMsTUFBTSxzQkFBc0I7QUFBQSxRQUM1QixNQUFNLGVBQWU7QUFBQSxNQUN2QixDQUFDO0FBQ0QsdUJBQWlCLFVBQVUsTUFBTyxNQUFNLFVBQVUsS0FBSyxHQUFHLFlBQVksQ0FBQyxJQUFLLENBQUM7QUFDN0UsWUFBTSxZQUFZLFNBQVMsS0FBSyx5QkFBeUIsTUFBTSxTQUFTLEtBQUssQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLEVBQUU7QUFDakcsc0JBQWtCLFVBQVUsWUFBWSxDQUFDO0FBQUEsSUFDM0MsU0FBUyxHQUFHO0FBQ1YsV0FBSyxZQUFZLG1FQUFtRSxXQUFXLEVBQUUsT0FBTyxDQUFDO0FBQ3pHO0FBQUEsSUFDRjtBQUVBLFFBQUksQ0FBQyxLQUFLLHFCQUFxQjtBQUM3QixXQUFLLHNCQUFzQjtBQUMzQixXQUFLLGlCQUFpQixTQUFXLHdCQUF3QjtBQUN6RCxXQUFLLGlCQUFpQixXQUFXLDBCQUEwQjtBQUFBLElBQzdEO0FBQ0EsaUNBQTZCO0FBQUEsRUFDL0I7QUFFQSxpQkFBZSx5QkFBeUIsTUFBTTtBQUc1QyxVQUFNLFVBQVUsU0FBUyxlQUFlLHdCQUF3QjtBQUNoRSxRQUFJLFFBQVMsU0FBUSxRQUFRLGtCQUFrQjtBQUMvQyx1QkFBbUI7QUFDbkIsVUFBTSxnQkFBZ0IsSUFBSTtBQUFBLEVBQzVCO0FBRUEsaUJBQWUsc0JBQXNCO0FBQ25DLHVCQUFtQjtBQUNuQixVQUFNLDRCQUE0QjtBQUFBLEVBQ3BDO0FBRUEsV0FBUyx3QkFBd0IsTUFBTSxLQUFLO0FBQzFDLFVBQU0sU0FBUyxTQUFTLGVBQWUsV0FBVyxHQUFHLEVBQUU7QUFDdkQsVUFBTSxPQUFTLFNBQVMsZUFBZSxhQUFhLEdBQUcsRUFBRTtBQUN6RCxRQUFJLE9BQVEsUUFBTyxNQUFNLFVBQVU7QUFDbkMsUUFBSSxLQUFRLE1BQUssTUFBTSxVQUFZO0FBQ25DLFVBQU0sUUFBUSxTQUFTLGVBQWUsWUFBWSxHQUFHLEVBQUU7QUFDdkQsUUFBSSxPQUFPO0FBQUUsWUFBTSxNQUFNO0FBQUcsWUFBTSxPQUFPO0FBQUEsSUFBRztBQUFBLEVBQzlDO0FBRUEsV0FBUyx5QkFBeUIsS0FBSztBQUNyQyxVQUFNLFNBQVMsU0FBUyxlQUFlLFdBQVcsR0FBRyxFQUFFO0FBQ3ZELFVBQU0sT0FBUyxTQUFTLGVBQWUsYUFBYSxHQUFHLEVBQUU7QUFDekQsUUFBSSxLQUFRLE1BQUssTUFBTSxVQUFZO0FBQ25DLFFBQUksT0FBUSxRQUFPLE1BQU0sVUFBVTtBQUFBLEVBQ3JDO0FBRUEsaUJBQWUseUJBQXlCLE1BQU0sS0FBSztBQUNqRCxVQUFNLFFBQVEsU0FBUyxlQUFlLFlBQVksR0FBRyxFQUFFO0FBQ3ZELFFBQUksQ0FBQyxNQUFPO0FBQ1osVUFBTSxVQUFVLE1BQU0sTUFBTSxLQUFLO0FBQ2pDLFFBQUksQ0FBQyxRQUFTO0FBQ2QsUUFBSTtBQUNGLFlBQU0sTUFBTyxNQUFNLE1BQU0sdUJBQXVCO0FBQUEsUUFDOUMsUUFBUTtBQUFBLFFBQVEsU0FBUyxFQUFFLGdCQUFnQixtQkFBbUI7QUFBQSxRQUM5RCxNQUFNLEtBQUssVUFBVSxFQUFFLE1BQU0sVUFBVSxRQUFRLENBQUM7QUFBQSxNQUNsRCxDQUFDO0FBQ0QsWUFBTSxPQUFPLE1BQU0sSUFBSSxLQUFLO0FBQzVCLFVBQUksS0FBSyxJQUFJO0FBQ1gsY0FBTSxTQUFTLFNBQVMsZUFBZSxXQUFXLEdBQUcsRUFBRTtBQUN2RCxZQUFJLE9BQVEsUUFBTyxjQUFjO0FBQ2pDLGlDQUF5QixHQUFHO0FBQzVCLGNBQU0sWUFBWTtBQUFBLE1BQ3BCLE9BQU87QUFDTCxZQUFJLE9BQU8sY0FBYyxXQUFZLFdBQVUsa0JBQWtCLEtBQUssS0FBSyxJQUFJLE9BQU87QUFBQSxNQUN4RjtBQUFBLElBQ0YsU0FBUyxHQUFHO0FBQUUsVUFBSSxPQUFPLGNBQWMsV0FBWSxXQUFVLGlCQUFpQixFQUFFLE9BQU8sSUFBSSxPQUFPO0FBQUEsSUFBRztBQUFBLEVBQ3ZHO0FBRUEsV0FBUyx1QkFBdUIsS0FBSztBQUNuQyxVQUFNLFVBQVcsU0FBUyxlQUFlLFlBQVksR0FBRyxFQUFFO0FBQzFELFVBQU0sYUFBYSxTQUFTLGVBQWUsa0JBQWtCLEdBQUcsRUFBRTtBQUNsRSxRQUFJLFFBQVksU0FBUSxNQUFNLFVBQWE7QUFDM0MsUUFBSSxXQUFZLFlBQVcsTUFBTSxVQUFVO0FBQzNDLFVBQU0sTUFBTSxTQUFTLGVBQWUsaUJBQWlCLEdBQUcsRUFBRTtBQUMxRCxRQUFJLElBQUssS0FBSSxNQUFNO0FBQUEsRUFDckI7QUFFQSxXQUFTLHdCQUF3QixLQUFLO0FBQ3BDLFVBQU0sVUFBYSxTQUFTLGVBQWUsWUFBWSxHQUFHLEVBQUU7QUFDNUQsVUFBTSxhQUFhLFNBQVMsZUFBZSxrQkFBa0IsR0FBRyxFQUFFO0FBQ2xFLFFBQUksV0FBWSxZQUFXLE1BQU0sVUFBVTtBQUMzQyxRQUFJLFFBQVksU0FBUSxNQUFNLFVBQWE7QUFBQSxFQUM3QztBQUVBLGlCQUFlLHdCQUF3QixNQUFNLEtBQUs7QUFDaEQsVUFBTSxNQUFNLFNBQVMsZUFBZSxpQkFBaUIsR0FBRyxFQUFFO0FBQzFELFFBQUksQ0FBQyxJQUFLO0FBQ1YsVUFBTSxZQUFZLElBQUk7QUFDdEIsVUFBTSxtQkFBbUI7QUFBQSxNQUN2QixPQUFPO0FBQUEsTUFBUyxPQUFPO0FBQUEsTUFBUyxNQUFNO0FBQUEsTUFBUSxRQUFRO0FBQUEsTUFDdEQsV0FBVztBQUFBLE1BQWEsVUFBVTtBQUFBLE1BQVksVUFBVTtBQUFBLE1BQ3hELFFBQVE7QUFBQSxJQUNWO0FBQ0EsVUFBTSxtQkFBbUI7QUFBQSxNQUN2QixPQUFPO0FBQUEsTUFBVyxPQUFPO0FBQUEsTUFBVyxNQUFNO0FBQUEsTUFBVyxRQUFRO0FBQUEsTUFDN0QsV0FBVztBQUFBLE1BQVcsVUFBVTtBQUFBLE1BQVcsVUFBVTtBQUFBLE1BQ3JELFFBQVE7QUFBQSxJQUNWO0FBQ0EsUUFBSTtBQUNGLFlBQU0sTUFBTyxNQUFNLE1BQU0sMEJBQTBCO0FBQUEsUUFDakQsUUFBUTtBQUFBLFFBQVMsU0FBUyxFQUFFLGdCQUFnQixtQkFBbUI7QUFBQSxRQUMvRCxNQUFNLEtBQUssVUFBVSxFQUFFLE1BQU0sb0JBQW9CLFVBQVUsQ0FBQztBQUFBLE1BQzlELENBQUM7QUFDRCxZQUFNLE9BQU8sTUFBTSxJQUFJLEtBQUs7QUFDNUIsVUFBSSxLQUFLLElBQUk7QUFDWCxjQUFNLFFBQVEsU0FBUyxlQUFlLG1CQUFtQixHQUFHLEVBQUU7QUFDOUQsWUFBSSxPQUFPO0FBQ1QsY0FBSSxhQUFhLGlCQUFpQixTQUFTLEdBQUc7QUFDNUMsa0JBQU0sY0FBYyxpQkFBaUIsU0FBUztBQUM5QyxrQkFBTSxNQUFNLFVBQVUsaUVBQWlFLGlCQUFpQixTQUFTLENBQUM7QUFBQSxVQUNwSCxPQUFPO0FBQ0wsa0JBQU0sY0FBYztBQUNwQixrQkFBTSxNQUFNLFVBQVU7QUFBQSxVQUN4QjtBQUFBLFFBQ0Y7QUFDQSxnQ0FBd0IsR0FBRztBQUFBLE1BQzdCLE9BQU87QUFDTCxZQUFJLE9BQU8sY0FBYyxXQUFZLFdBQVUseUJBQXlCLEtBQUssU0FBUyxlQUFlLElBQUksT0FBTztBQUFBLE1BQ2xIO0FBQUEsSUFDRixTQUFTLEdBQUc7QUFDVixVQUFJLE9BQU8sY0FBYyxXQUFZLFdBQVUsd0JBQXdCLEVBQUUsT0FBTyxJQUFJLE9BQU87QUFBQSxJQUM3RjtBQUFBLEVBQ0Y7QUFFQSxXQUFTLHNCQUFzQixLQUFLO0FBQ2xDLFVBQU0sYUFBYSxTQUFTLGVBQWUsaUJBQWlCLEdBQUcsRUFBRTtBQUNqRSxVQUFNLFVBQWEsU0FBUyxlQUFlLG9CQUFvQixHQUFHLEVBQUU7QUFDcEUsUUFBSSxRQUFZLFNBQVEsTUFBTSxVQUFhO0FBQzNDLFFBQUksV0FBWSxZQUFXLE1BQU0sVUFBVTtBQUMzQyxVQUFNLEtBQUssU0FBUyxlQUFlLGVBQWUsR0FBRyxFQUFFO0FBQ3ZELFFBQUksSUFBSTtBQUFFLFNBQUcsTUFBTTtBQUFHLFNBQUcsaUJBQWlCLEdBQUcsZUFBZSxHQUFHLE1BQU07QUFBQSxJQUFRO0FBQUEsRUFDL0U7QUFFQSxXQUFTLHVCQUF1QixLQUFLO0FBQ25DLFVBQU0sYUFBYSxTQUFTLGVBQWUsaUJBQWlCLEdBQUcsRUFBRTtBQUNqRSxVQUFNLFVBQWEsU0FBUyxlQUFlLG9CQUFvQixHQUFHLEVBQUU7QUFDcEUsUUFBSSxXQUFZLFlBQVcsTUFBTSxVQUFVO0FBQzNDLFFBQUksUUFBWSxTQUFRLE1BQU0sVUFBYTtBQUFBLEVBQzdDO0FBRUEsaUJBQWUsdUJBQXVCLE1BQU0sS0FBSztBQUMvQyxVQUFNLEtBQUssU0FBUyxlQUFlLGVBQWUsR0FBRyxFQUFFO0FBQ3ZELFFBQUksQ0FBQyxHQUFJO0FBQ1QsVUFBTSxXQUFXLEdBQUc7QUFDcEIsUUFBSTtBQUNGLFlBQU0sTUFBTyxNQUFNLE1BQU0sMEJBQTBCO0FBQUEsUUFDakQsUUFBUTtBQUFBLFFBQVMsU0FBUyxFQUFFLGdCQUFnQixtQkFBbUI7QUFBQSxRQUMvRCxNQUFNLEtBQUssVUFBVSxFQUFFLE1BQU0sT0FBTyxTQUFTLENBQUM7QUFBQSxNQUNoRCxDQUFDO0FBQ0QsWUFBTSxPQUFPLE1BQU0sSUFBSSxLQUFLO0FBQzVCLFVBQUksS0FBSyxJQUFJO0FBQ1gsY0FBTSxVQUFVLFNBQVMsZUFBZSxvQkFBb0IsR0FBRyxFQUFFO0FBQ2pFLFlBQUksU0FBUztBQUNYLGtCQUFRLGNBQWM7QUFDdEIsa0JBQVEsUUFBYztBQUN0QixrQkFBUSxNQUFNLFVBQVUsV0FBVyxLQUFLO0FBQUEsUUFDMUM7QUFDQSwrQkFBdUIsR0FBRztBQUFBLE1BQzVCLE9BQU87QUFDTCxZQUFJLE9BQU8sY0FBYyxXQUFZLFdBQVUsd0JBQXdCLEtBQUssU0FBUyxlQUFlLElBQUksT0FBTztBQUFBLE1BQ2pIO0FBQUEsSUFDRixTQUFTLEdBQUc7QUFDVixVQUFJLE9BQU8sY0FBYyxXQUFZLFdBQVUsdUJBQXVCLEVBQUUsT0FBTyxJQUFJLE9BQU87QUFBQSxJQUM1RjtBQUFBLEVBQ0Y7QUFFQSxpQkFBZSx3QkFBd0IsTUFBTU0sUUFBTztBQUNsRCxJQUFBQSxPQUFNLGdCQUFnQjtBQUN0QixRQUFJLE9BQU8sa0JBQWtCLFlBQVk7QUFDdkMsWUFBTSxLQUFLLE1BQU0sY0FBYyxxRUFBcUU7QUFDcEcsVUFBSSxDQUFDLEdBQUk7QUFBQSxJQUNYO0FBQ0EsUUFBSTtBQUNGLFlBQU0sTUFBTyxNQUFNLE1BQU0sdUJBQXVCO0FBQUEsUUFDOUMsUUFBUTtBQUFBLFFBQVEsU0FBUyxFQUFFLGdCQUFnQixtQkFBbUI7QUFBQSxRQUM5RCxNQUFNLEtBQUssVUFBVSxFQUFFLEtBQUssQ0FBQztBQUFBLE1BQy9CLENBQUM7QUFDRCxZQUFNLE9BQU8sTUFBTSxJQUFJLEtBQUs7QUFDNUIsVUFBSSxLQUFLLFNBQVM7QUFDaEIsY0FBTSx5QkFBeUI7QUFDL0IsY0FBTSxtQkFBbUI7QUFBQSxNQUMzQixPQUFPO0FBQ0wsWUFBSSxPQUFPLGNBQWMsV0FBWSxXQUFVLG9DQUFvQyxLQUFLLFNBQVMsZUFBZSxJQUFJLE9BQU87QUFBQSxNQUM3SDtBQUFBLElBQ0YsU0FBUyxHQUFHO0FBQUUsVUFBSSxPQUFPLGNBQWMsV0FBWSxXQUFVLFVBQVUsRUFBRSxPQUFPLElBQUksT0FBTztBQUFBLElBQUc7QUFBQSxFQUNoRztBQUlBLGlCQUFlLDJCQUEyQixNQUFNO0FBQzlDLFFBQUk7QUFDRixZQUFNLE1BQU8sTUFBTSxNQUFNLDJCQUEyQjtBQUFBLFFBQ2xELFFBQVE7QUFBQSxRQUFRLFNBQVMsRUFBRSxnQkFBZ0IsbUJBQW1CO0FBQUEsUUFDOUQsTUFBTSxLQUFLLFVBQVUsRUFBRSxLQUFLLENBQUM7QUFBQSxNQUMvQixDQUFDO0FBQ0QsWUFBTSxPQUFPLE1BQU0sSUFBSSxLQUFLO0FBQzVCLFVBQUksS0FBSyxJQUFJO0FBQ1gsY0FBTSx5QkFBeUI7QUFDL0IsWUFBSSxPQUFPLGNBQWMsV0FBWSxXQUFVLHdCQUF3QixLQUFLLFFBQVEsR0FBRztBQUFBLE1BQ3pGLE9BQU87QUFDTCxZQUFJLE9BQU8sY0FBYyxXQUFZLFdBQVUsZ0NBQWdDLEtBQUssU0FBUyxlQUFlLElBQUksT0FBTztBQUFBLE1BQ3pIO0FBQUEsSUFDRixTQUFTLEdBQUc7QUFBRSxVQUFJLE9BQU8sY0FBYyxXQUFZLFdBQVUsVUFBVSxFQUFFLE9BQU8sSUFBSSxPQUFPO0FBQUEsSUFBRztBQUFBLEVBQ2hHO0FBSUEsaUJBQWUscUJBQXFCO0FBQ2xDLFVBQU0sTUFBTSxTQUFTLGVBQWUsb0JBQW9CO0FBQ3hELFFBQUksQ0FBQyxJQUFLO0FBQ1YsUUFBSTtBQUNGLFlBQU0sTUFBTyxNQUFNLE1BQU0sWUFBWTtBQUNyQyxZQUFNLE9BQU8sTUFBTSxJQUFJLEtBQUs7QUFDNUIsWUFBTSxLQUFLLEtBQUssU0FBUyxDQUFDLEdBQUc7QUFDN0IsVUFBSSxjQUFjLElBQUksSUFBSSxvQkFBYSxDQUFDLE1BQU07QUFBQSxJQUNoRCxTQUFTSixJQUFHO0FBQUEsSUFBZTtBQUFBLEVBQzdCO0FBSUEsaUJBQWUsZ0JBQWdCO0FBQzdCLFVBQU0sT0FBUyxTQUFTLGVBQWUscUJBQXFCO0FBQzVELFVBQU0sU0FBUyxTQUFTLGNBQWMsdUNBQXVDO0FBQzdFLFFBQUksQ0FBQyxLQUFNO0FBRVgsU0FBSyxZQUFZO0FBRWpCLFFBQUksUUFBUTtBQUNWLGFBQU8sWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBSXJCO0FBRUEsVUFBTSxpQkFBaUI7QUFBQSxFQUN6QjtBQUVBLFdBQVMsaUJBQWlCO0FBQ3hCLFVBQU0sU0FBUyxTQUFTLGNBQWMsdUNBQXVDO0FBQzdFLFFBQUksUUFBUTtBQUNWLGFBQU8sWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQVNyQjtBQUNBLDZCQUF5QjtBQUN6Qix1QkFBbUI7QUFBQSxFQUNyQjtBQUVBLGlCQUFlLG1CQUFtQjtBQUNoQyxVQUFNLE9BQU8sU0FBUyxlQUFlLHFCQUFxQjtBQUMxRCxRQUFJLENBQUMsS0FBTTtBQUNYLFFBQUksUUFBUSxDQUFDO0FBQ2IsUUFBSTtBQUNGLFlBQU0sTUFBTyxNQUFNLE1BQU0sWUFBWTtBQUNyQyxZQUFNLE9BQU8sTUFBTSxJQUFJLEtBQUs7QUFDNUIsY0FBUSxLQUFLLFNBQVMsQ0FBQztBQUFBLElBQ3pCLFNBQVMsR0FBRztBQUNWLFdBQUssWUFBWSxnRUFBZ0UsV0FBVyxFQUFFLE9BQU8sQ0FBQztBQUN0RztBQUFBLElBQ0Y7QUFDQSxRQUFJLE1BQU0sV0FBVyxHQUFHO0FBQ3RCLFdBQUssWUFBWTtBQUNqQjtBQUFBLElBQ0Y7QUFFQSxhQUFTSyxTQUFRLElBQUk7QUFDbkIsVUFBSSxDQUFDLEdBQUksUUFBTztBQUNoQixVQUFJO0FBQUUsZUFBTyxJQUFJLEtBQUssRUFBRSxFQUFFLG1CQUFtQixTQUFTLEVBQUUsT0FBTyxTQUFTLEtBQUssV0FBVyxNQUFNLFVBQVUsQ0FBQztBQUFBLE1BQUcsUUFDdEc7QUFBRSxlQUFPLEdBQUcsTUFBTSxHQUFHLEVBQUU7QUFBQSxNQUFHO0FBQUEsSUFDbEM7QUFFQSxRQUFJQyxRQUFPO0FBQ1gsVUFBTSxRQUFRLE9BQUs7QUFDakIsWUFBTSxLQUFLLFdBQVcsRUFBRSxJQUFJO0FBQzVCLE1BQUFBLFNBQVE7QUFBQTtBQUFBO0FBQUEsd0RBRzRDLFdBQVcsRUFBRSxpQkFBaUIsVUFBVSxDQUFDO0FBQUEsc0VBQzNCRCxTQUFRLEVBQUUsU0FBUyxDQUFDLEdBQUcsRUFBRSxRQUFRLFdBQVEsV0FBVyxFQUFFLEtBQUssSUFBSSxFQUFFO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUVBSXBFLEVBQUU7QUFBQTtBQUFBLDBFQUVLLEVBQUU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBSzFFLENBQUM7QUFDRCxJQUFBQyxTQUFRO0FBQ1IsVUFBTSxlQUFlLFNBQVMsY0FBYyxLQUFLO0FBQ2pELGlCQUFhLFlBQVlBO0FBQ3pCLFNBQUssWUFBWTtBQUNqQixTQUFLLFlBQVksWUFBWTtBQUU3QixpQkFBYSxpQkFBaUIsU0FBUyxPQUFLO0FBQzFDLFlBQU0sTUFBTSxFQUFFLE9BQU8sUUFBUSxxQkFBcUI7QUFDbEQsVUFBSSxDQUFDLElBQUs7QUFDVixZQUFNLE9BQVMsSUFBSSxRQUFRO0FBQzNCLFlBQU0sU0FBUyxJQUFJLFFBQVE7QUFDM0IsVUFBUyxXQUFXLFVBQWtCLGtCQUFpQixJQUFJO0FBQUEsZUFDbEQsV0FBVyxpQkFBa0IsZUFBYyxJQUFJO0FBQUEsSUFDMUQsQ0FBQztBQUFBLEVBQ0g7QUFFQSxpQkFBZSxpQkFBaUIsTUFBTTtBQUNwQyxRQUFJO0FBQ0YsWUFBTSxNQUFPLE1BQU0sTUFBTSxzQkFBc0I7QUFBQSxRQUM3QyxRQUFRO0FBQUEsUUFBUSxTQUFTLEVBQUUsZ0JBQWdCLG1CQUFtQjtBQUFBLFFBQzlELE1BQU0sS0FBSyxVQUFVLEVBQUUsS0FBSyxDQUFDO0FBQUEsTUFDL0IsQ0FBQztBQUNELFlBQU0sT0FBTyxNQUFNLElBQUksS0FBSztBQUM1QixVQUFJLEtBQUssU0FBUztBQUFFLGNBQU0saUJBQWlCO0FBQUcsY0FBTSxtQkFBbUI7QUFBQSxNQUFHLFdBQ2pFLE9BQU8sY0FBYyxXQUFZLFdBQVUsbUJBQW1CLEtBQUssU0FBUyxlQUFlLElBQUksT0FBTztBQUFBLElBQ2pILFNBQVMsR0FBRztBQUFFLFVBQUksT0FBTyxjQUFjLFdBQVksV0FBVSxVQUFVLEVBQUUsT0FBTyxJQUFJLE9BQU87QUFBQSxJQUFHO0FBQUEsRUFDaEc7QUFFQSxpQkFBZSxjQUFjLE1BQU07QUFDakMsVUFBTSxZQUFZLE1BQU07QUFBQSxNQUN0QjtBQUFBLE1BQ0EsRUFBRSxjQUFjLGtCQUFrQixhQUFhLFVBQVUsUUFBUSxLQUFLO0FBQUEsSUFDeEU7QUFDQSxRQUFJLENBQUMsVUFBVztBQUNoQixRQUFJO0FBQ0YsWUFBTSxNQUFPLE1BQU0sTUFBTSxxQkFBcUI7QUFBQSxRQUM1QyxRQUFRO0FBQUEsUUFBUSxTQUFTLEVBQUUsZ0JBQWdCLG1CQUFtQjtBQUFBLFFBQzlELE1BQU0sS0FBSyxVQUFVLEVBQUUsS0FBSyxDQUFDO0FBQUEsTUFDL0IsQ0FBQztBQUNELFlBQU0sT0FBTyxNQUFNLElBQUksS0FBSztBQUM1QixVQUFJLEtBQUssU0FBUztBQUFFLGNBQU0saUJBQWlCO0FBQUcsY0FBTSxtQkFBbUI7QUFBQSxNQUFHLFdBQ2pFLE9BQU8sY0FBYyxXQUFZLFdBQVUsa0JBQWtCLEtBQUssU0FBUyxlQUFlLElBQUksT0FBTztBQUFBLElBQ2hILFNBQVMsR0FBRztBQUFFLFVBQUksT0FBTyxjQUFjLFdBQVksV0FBVSxVQUFVLEVBQUUsT0FBTyxJQUFJLE9BQU87QUFBQSxJQUFHO0FBQUEsRUFDaEc7QUFFQSxpQkFBZSxhQUFhO0FBQzFCLFVBQU0sWUFBWSxNQUFNO0FBQUEsTUFDdEI7QUFBQSxNQUNBLEVBQUUsY0FBYyxlQUFlLGFBQWEsVUFBVSxRQUFRLEtBQUs7QUFBQSxJQUNyRTtBQUNBLFFBQUksQ0FBQyxVQUFXO0FBQ2hCLFFBQUk7QUFDRixZQUFNLE1BQU8sTUFBTSxNQUFNLG9CQUFvQixFQUFFLFFBQVEsT0FBTyxDQUFDO0FBQy9ELFlBQU0sT0FBTyxNQUFNLElBQUksS0FBSztBQUM1QixVQUFJLEtBQUssU0FBUztBQUFFLGNBQU0saUJBQWlCO0FBQUcsY0FBTSxtQkFBbUI7QUFBQSxNQUFHLFdBQ2pFLE9BQU8sY0FBYyxXQUFZLFdBQVUsMEJBQTBCLEtBQUssU0FBUyxlQUFlLElBQUksT0FBTztBQUFBLElBQ3hILFNBQVMsR0FBRztBQUFFLFVBQUksT0FBTyxjQUFjLFdBQVksV0FBVSxVQUFVLEVBQUUsT0FBTyxJQUFJLE9BQU87QUFBQSxJQUFHO0FBQUEsRUFDaEc7OztBQzk0QkE7QUFBQTtBQUFBLGlDQUFBQztBQUFBLElBQUEsc0JBQUFDO0FBQUEsSUFBQTtBQUFBO0FBcUJBLE1BQUksb0JBQW9CO0FBR3hCLFdBQVMsZUFBZTtBQUN0QixVQUFNLEtBQUssU0FBUztBQUNwQixRQUFJLENBQUMsR0FBSSxRQUFPO0FBQ2hCLFVBQU0sTUFBTSxHQUFHO0FBQ2YsV0FBTyxRQUFRLFdBQVcsUUFBUSxjQUFjLFFBQVEsWUFBWSxHQUFHO0FBQUEsRUFDekU7QUFHQSxXQUFTLGFBQWE7QUFDcEIsV0FBTyxTQUFTLGNBQWMsNEVBQTRFLE1BQU07QUFBQSxFQUNsSDtBQUdBLFdBQVMscUJBQXFCO0FBQzVCLFVBQU0sS0FBSyxTQUFTLGVBQWUseUJBQXlCO0FBQzVELFdBQU8sQ0FBQyxDQUFDLE1BQU0sR0FBRyxNQUFNLFlBQVk7QUFBQSxFQUN0QztBQU9BLE1BQU0sa0JBQWtCO0FBQUEsSUFDdEIsT0FBeUI7QUFBQSxJQUN6QixZQUF5QjtBQUFBLElBQ3pCLFNBQXlCO0FBQUEsSUFDekIsV0FBeUI7QUFBQSxJQUN6QixTQUF5QjtBQUFBLElBQ3pCLGtCQUF5QjtBQUFBLElBQ3pCLFVBQXlCO0FBQUEsSUFDekIsWUFBeUI7QUFBQSxJQUN6QixZQUF5QjtBQUFBLEVBQzNCO0FBR0EsV0FBUyx3QkFBd0I7QUFDL0IsVUFBTSxNQUFNLE9BQU8saUJBQWlCLGNBQWMsYUFBYSxjQUFjLElBQUk7QUFDakYsUUFBSSxDQUFDLElBQUs7QUFDVixVQUFNLFFBQVEsZ0JBQWdCLEdBQUc7QUFDakMsUUFBSSxDQUFDLE1BQU87QUFDWixVQUFNLE1BQU0sU0FBUyxlQUFlLEtBQUs7QUFDekMsUUFBSSxPQUFPLENBQUMsSUFBSSxTQUFVLEtBQUksTUFBTTtBQUFBLEVBQ3RDO0FBS0EsV0FBUyxZQUFZO0FBQ25CLFVBQU0sTUFBTSxPQUFPLGlCQUFpQixjQUFjLGFBQWEsY0FBYyxJQUFJO0FBQ2pGLFFBQUksUUFBUSxVQUFXLFFBQU8sQ0FBQyxHQUFHLFNBQVMsaUJBQWlCLGVBQWUsQ0FBQztBQUM1RSxRQUFJLFFBQVEsUUFBVyxRQUFPLENBQUMsR0FBRyxTQUFTLGlCQUFpQixhQUFhLENBQUM7QUFDMUUsV0FBTyxDQUFDO0FBQUEsRUFDVjtBQUdBLFdBQVMsZUFBZSxPQUFPLEtBQUs7QUFDbEMsVUFBTSxRQUFRLENBQUMsR0FBRyxNQUFNO0FBQ3RCLFVBQUksTUFBTSxLQUFLO0FBQ2IsVUFBRSxVQUFVLElBQUksWUFBWTtBQUM1QixVQUFFLGVBQWUsRUFBRSxPQUFPLFdBQVcsVUFBVSxTQUFTLENBQUM7QUFBQSxNQUMzRCxPQUFPO0FBQ0wsVUFBRSxVQUFVLE9BQU8sWUFBWTtBQUFBLE1BQ2pDO0FBQUEsSUFDRixDQUFDO0FBQUEsRUFDSDtBQUdBLFdBQVMsZUFBZSxPQUFPO0FBQzdCLFVBQU0sUUFBUSxVQUFVO0FBQ3hCLFFBQUksQ0FBQyxNQUFNLE9BQVE7QUFDbkIsd0JBQW9CLEtBQUssSUFBSSxHQUFHLEtBQUssSUFBSSxNQUFNLFNBQVMsR0FBRyxvQkFBb0IsS0FBSyxDQUFDO0FBQ3JGLG1CQUFlLE9BQU8saUJBQWlCO0FBQUEsRUFDekM7QUFHQSxXQUFTLHFCQUFxQjtBQUM1QixVQUFNLE1BQU0sT0FBTyxpQkFBaUIsY0FBYyxhQUFhLGNBQWMsSUFBSTtBQUNqRixRQUFJLFFBQVEsV0FBVztBQUNyQixZQUFNLFFBQVEsVUFBVTtBQUN4QixVQUFJLG9CQUFvQixLQUFLLHFCQUFxQixNQUFNLE9BQVE7QUFDaEUsWUFBTSxPQUFPLE1BQU0saUJBQWlCO0FBQ3BDLFlBQU0sS0FBSyxLQUFLLEdBQUcsUUFBUSxZQUFZLEVBQUU7QUFDekMsVUFBSSxPQUFPLHVCQUF1QixXQUFZLG9CQUFtQixJQUFJLFFBQVE7QUFBQSxJQUMvRSxXQUFXLFFBQVEsU0FBUztBQUMxQixZQUFNLFFBQVEsVUFBVTtBQUN4QixVQUFJLG9CQUFvQixLQUFLLHFCQUFxQixNQUFNLE9BQVE7QUFFaEUsWUFBTSxNQUFNLE1BQU0saUJBQWlCLEVBQUUsY0FBYyx1Q0FBdUM7QUFDMUYsVUFBSSxJQUFLLEtBQUksTUFBTTtBQUFBLElBQ3JCO0FBQUEsRUFDRjtBQUdBLFdBQVMscUJBQXFCO0FBQzVCLFVBQU0sTUFBTSxPQUFPLGlCQUFpQixjQUFjLGFBQWEsY0FBYyxJQUFJO0FBQ2pGLFFBQUksUUFBUSxXQUFXO0FBQ3JCLFlBQU0sUUFBUSxVQUFVO0FBQ3hCLFVBQUksb0JBQW9CLEtBQUsscUJBQXFCLE1BQU0sT0FBUTtBQUNoRSxZQUFNLE9BQU8sTUFBTSxpQkFBaUI7QUFDcEMsWUFBTSxLQUFLLEtBQUssR0FBRyxRQUFRLFlBQVksRUFBRTtBQUN6QyxVQUFJLE9BQU8sdUJBQXVCLFdBQVksb0JBQW1CLElBQUksUUFBUTtBQUFBLElBQy9FLFdBQVcsUUFBUSxTQUFTO0FBQzFCLFlBQU0sUUFBUSxVQUFVO0FBQ3hCLFVBQUksb0JBQW9CLEtBQUsscUJBQXFCLE1BQU0sT0FBUTtBQUNoRSxZQUFNLE1BQU0sTUFBTSxpQkFBaUIsRUFBRSxjQUFjLHlDQUF5QztBQUM1RixVQUFJLElBQUssS0FBSSxNQUFNO0FBQUEsSUFDckI7QUFBQSxFQUNGO0FBSUEsTUFBTSxZQUFZO0FBR1gsV0FBUyw2QkFBNkI7QUFDM0MsVUFBTSxXQUFXLFNBQVMsZUFBZSxTQUFTO0FBQ2xELFFBQUksVUFBVTtBQUFFLGVBQVMsT0FBTztBQUFHO0FBQUEsSUFBUTtBQUUzQyxVQUFNLFFBQVEsU0FBUyxjQUFjLEtBQUs7QUFDMUMsVUFBTSxLQUFLO0FBQ1gsVUFBTSxhQUFhLFFBQVEsUUFBUTtBQUNuQyxVQUFNLGFBQWEsY0FBYyxNQUFNO0FBQ3ZDLFVBQU0sYUFBYSxjQUFjLG9CQUFvQjtBQUNyRCxVQUFNLFlBQVk7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQW9CbEIsV0FBTyxPQUFPLE1BQU0sT0FBTztBQUFBLE1BQ3pCLFVBQVk7QUFBQSxNQUNaLFFBQVk7QUFBQSxNQUNaLE9BQVk7QUFBQSxNQUNaLFlBQVk7QUFBQSxNQUNaLE9BQVk7QUFBQSxNQUNaLFFBQVk7QUFBQSxNQUNaLGNBQWM7QUFBQSxNQUNkLFNBQVk7QUFBQSxNQUNaLFFBQVk7QUFBQSxNQUNaLFVBQVk7QUFBQSxNQUNaLFVBQVk7QUFBQSxNQUNaLFdBQVk7QUFBQSxJQUNkLENBQUM7QUFDRCxhQUFTLEtBQUssWUFBWSxLQUFLO0FBQy9CLFVBQU0sY0FBYyxxQkFBcUIsRUFBRSxpQkFBaUIsU0FBUyxNQUFNLE1BQU0sT0FBTyxDQUFDO0FBQUEsRUFDM0Y7QUFLTyxXQUFTQSxrQkFBaUI7QUFDL0Isd0JBQW9CO0FBQ3BCLGFBQVMsaUJBQWlCLGFBQWEsRUFBRSxRQUFRLFFBQU0sR0FBRyxVQUFVLE9BQU8sWUFBWSxDQUFDO0FBQUEsRUFDMUY7QUFJQSxXQUFTLFdBQVcsR0FBRztBQUdyQixRQUFJLEVBQUUsV0FBVyxFQUFFLFFBQVEsU0FBUztBQUNsQyw0QkFBc0I7QUFDdEI7QUFBQSxJQUNGO0FBR0EsUUFBSSxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsUUFBUSxLQUFLO0FBQzVDLFlBQU0sV0FBVyxTQUFTLGNBQWMsc0JBQXNCO0FBQzlELFlBQU0sT0FBTyxXQUFXLFNBQVMsR0FBRyxRQUFRLFNBQVMsRUFBRSxJQUFJO0FBQzNELFVBQUksUUFBUSxPQUFPLHNCQUFzQixZQUFZO0FBQ25ELFVBQUUsZUFBZTtBQUNqQiwwQkFBa0IsSUFBSTtBQUFBLE1BQ3hCO0FBQ0E7QUFBQSxJQUNGO0FBT0EsUUFBSSxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsRUFBRSxRQUFRLE9BQU8sRUFBRSxRQUFRLFFBQ25ELG1CQUFtQixLQUFLLENBQUMsU0FBUyxlQUFlLHdCQUF3QixLQUN6RSxDQUFDLGFBQWEsR0FBRztBQUN0QixRQUFFLGVBQWU7QUFDakIsVUFBSSxFQUFFLFVBQVU7QUFDZCxZQUFJLE9BQU8seUJBQXlCLFdBQVksc0JBQXFCO0FBQUEsTUFDdkUsT0FBTztBQUNMLFlBQUksT0FBTyx5QkFBeUIsV0FBWSxzQkFBcUI7QUFBQSxNQUN2RTtBQUNBO0FBQUEsSUFDRjtBQUdBLFFBQUksYUFBYSxFQUFHO0FBR3BCLFFBQUksV0FBVyxFQUFHO0FBRWxCLFlBQVEsRUFBRSxLQUFLO0FBQUEsTUFDYixLQUFLO0FBQ0gsVUFBRSxlQUFlO0FBQ2pCLG1DQUEyQjtBQUMzQjtBQUFBLE1BQ0YsS0FBSztBQUNILFVBQUUsZUFBZTtBQUNqQix1QkFBZSxFQUFFO0FBQ2pCO0FBQUEsTUFDRixLQUFLO0FBQ0gsVUFBRSxlQUFlO0FBQ2pCLHVCQUFlLENBQUM7QUFDaEI7QUFBQSxNQUNGLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFDSCwyQkFBbUI7QUFDbkI7QUFBQSxNQUNGLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFDSCwyQkFBbUI7QUFDbkI7QUFBQSxNQUNGO0FBQ0U7QUFBQSxJQUNKO0FBQUEsRUFDRjtBQVFPLFdBQVNELHlCQUF3QjtBQUN0QyxhQUFTLGlCQUFpQixXQUFXLFVBQVU7QUFBQSxFQUNqRDs7O0FDaFJBO0FBQUE7QUFBQTtBQUFBLCtCQUFBRTtBQUFBO0FBU0EsTUFBTSxVQUFXLE9BQU8sYUFBYSxjQUFlLFNBQVMsVUFBVSxLQUFLLElBQUk7QUFHaEYsTUFBSSx1QkFBdUI7QUFFM0IsV0FBUyxzQkFBc0IsYUFBYUMsT0FBTSxPQUFPLFFBQVE7QUFDL0QsUUFBSSxDQUFDLFlBQWE7QUFDbEIsVUFBTSxVQUFVLFlBQVksY0FBYyxVQUFVO0FBQ3BELFFBQUksQ0FBQyxRQUFTO0FBQ2QsWUFBUSxjQUFjQTtBQUN0QixZQUFRLE1BQU0sVUFBVTtBQUN4QixZQUFRLE1BQU0sVUFBVTtBQUN4QixZQUFRLE1BQU0sZUFBZTtBQUM3QixZQUFRLE1BQU0sYUFBYTtBQUMzQixZQUFRLE1BQU0sV0FBVztBQUN6QixZQUFRLE1BQU0sU0FBUztBQUN2QixRQUFJLFNBQVMsV0FBVztBQUN0QixjQUFRLE1BQU0sUUFBUTtBQUN0QixjQUFRLE1BQU0sYUFBYTtBQUMzQixjQUFRLE1BQU0sY0FBYztBQUFBLElBQzlCLFdBQVcsU0FBUyxTQUFTO0FBQzNCLGNBQVEsTUFBTSxRQUFRO0FBQ3RCLGNBQVEsTUFBTSxhQUFhO0FBQzNCLGNBQVEsTUFBTSxjQUFjO0FBQUEsSUFDOUIsT0FBTztBQUNMLGNBQVEsTUFBTSxRQUFRO0FBQ3RCLGNBQVEsTUFBTSxhQUFhO0FBQzNCLGNBQVEsTUFBTSxjQUFjO0FBQUEsSUFDOUI7QUFBQSxFQUNGO0FBRUEsaUJBQWUsT0FBTztBQUVwQixXQUFPLDBCQUEwQjtBQUdqQyx1QkFBbUI7QUFFbkIsVUFBTSxtQkFBbUIsTUFBTSxxQkFBcUI7QUFDcEQsUUFBSSxDQUFDLGtCQUFrQjtBQUNyQixZQUFNLGdCQUFnQixjQUFjLFVBQVUsbUZBQXlFO0FBQ3ZILDRCQUFzQixlQUFlLHFGQUEyRSxPQUFPO0FBQ3ZILE1BQUFELHFCQUFvQjtBQUNwQjtBQUFBLElBQ0Y7QUFHQSxVQUFNLHNCQUFzQjtBQUc1QixVQUFNLGVBQWU7QUFHckIsVUFBTSxvQkFBb0IsY0FBYyxVQUFVLHVDQUFnQztBQUNsRiwwQkFBc0IsbUJBQW1CLHlDQUFrQyxNQUFNO0FBR2pGLG1CQUFlLGFBQWEsWUFBWSxDQUFDO0FBR3pDLFVBQU0sWUFBWTtBQUNsQixVQUFNLG1CQUFtQixjQUFjLFVBQVUsK0JBQTBCO0FBQzNFLDBCQUFzQixrQkFBa0IsaUNBQTRCLFNBQVM7QUFDN0UsUUFBSSxhQUFhLGNBQWMsTUFBTSxNQUFPLE9BQU0sZUFBZTtBQUNqRSxJQUFBQSxxQkFBb0I7QUFHcEIsZ0JBQVksYUFBYSxHQUFJO0FBRzdCLFdBQU8saUJBQWlCLGdCQUFnQixNQUFNO0FBQzVDLGtCQUFZO0FBQ1osWUFBTSxrQkFBa0IsYUFBYSxhQUFhO0FBQ2xELFVBQUksaUJBQWlCO0FBQ25CLHFCQUFhLFFBQVEsWUFBWSxZQUFZLGVBQWU7QUFBQSxNQUM5RDtBQUFBLElBQ0YsQ0FBQztBQUtELFFBQUksQ0FBQyxhQUFhLGVBQWUsR0FBRztBQUNsQyxZQUFNLFNBQVMsTUFBTSxZQUFZO0FBQ2pDLFVBQUksQ0FBQyxPQUFPLFVBQVUsT0FBTyxtQkFBbUIsQ0FBQyxPQUFPLGNBQWM7QUFDcEUsc0JBQWMsVUFBVSxtR0FBdUY7QUFDL0csY0FBTSxhQUFhLFNBQVMsZUFBZSxhQUFhO0FBQ3hELFlBQUksWUFBWTtBQUNkLHFCQUFXLE1BQU0sVUFBVTtBQUMzQixxQkFBVyxNQUFNLGdCQUFnQjtBQUFBLFFBQ25DO0FBQUEsTUFDRixXQUFXLE9BQU8sY0FBYztBQUM5QixnQkFBUSxLQUFLLHVEQUF1RDtBQUFBLE1BQ3RFO0FBQUEsSUFDRixPQUFPO0FBQ0wsY0FBUSxLQUFLLDBEQUEwRDtBQUFBLElBQ3pFO0FBQUEsRUFDRjtBQUVBLFdBQVNBLHVCQUFzQjtBQUM3QixRQUFJLHFCQUFzQjtBQUMxQiwyQkFBdUI7QUFHdkIsYUFBUyxpQkFBaUIsTUFBTSxFQUFFLFFBQVEsU0FBTztBQUMvQyxVQUFJLGlCQUFpQixTQUFTLE1BQU0sVUFBVSxJQUFJLFFBQVEsR0FBRyxDQUFDO0FBQUEsSUFDaEUsQ0FBQztBQUdELGFBQVMsZUFBZSxVQUFVLEVBQUUsaUJBQWlCLFNBQVMsV0FBVztBQUN6RSxhQUFTLGVBQWUsZUFBZSxFQUFFLGlCQUFpQixZQUFZLENBQUMsTUFBTTtBQUMzRSxVQUFJLEVBQUUsUUFBUSxRQUFTLGFBQVk7QUFBQSxJQUNyQyxDQUFDO0FBR0QsYUFBUyxlQUFlLGFBQWEsRUFBRSxpQkFBaUIsU0FBUyxVQUFVO0FBQzNFLGFBQVMsZUFBZSxlQUFlLEVBQUUsaUJBQWlCLFNBQVMsTUFBTSxXQUFXLDBCQUEwQixDQUFDO0FBQy9HLGFBQVMsZUFBZSxjQUFjLEVBQUUsaUJBQWlCLFNBQVMsWUFBWTtBQUU1RSxZQUFNLFdBQVcsT0FBTyx1QkFBdUIsRUFBRSxhQUFhLG9CQUFJLElBQUksR0FBRyxRQUFRLG9CQUFJLElBQUksRUFBRTtBQUMzRixZQUFNLFlBQVksT0FBTyx1QkFBdUIsQ0FBQyxHQUFHO0FBQ3BELFlBQU0sYUFBYSxPQUFPLEtBQUssZ0JBQWdCLFVBQVUsQ0FBQyxDQUFDLEVBQUU7QUFDN0QsWUFBTSxnQkFBZ0IsV0FBVyxTQUFTLFlBQVk7QUFDdEQsWUFBTSxrQkFBa0IsYUFBYSxTQUFTLE9BQU87QUFDckQsWUFBTSxrQkFBa0IsS0FBSyxJQUFJLEdBQUcsYUFBYSxJQUFJLEtBQUssSUFBSSxHQUFHLGVBQWU7QUFDaEYsVUFBSSxrQkFBa0IsR0FBRztBQUN2QixjQUFNLFFBQVEsQ0FBQztBQUNmLFlBQUksZ0JBQWdCLEVBQUcsT0FBTSxLQUFLLEdBQUcsYUFBYSxtQkFBbUIsa0JBQWtCLElBQUksTUFBTSxLQUFLLEVBQUU7QUFDeEcsWUFBSSxrQkFBa0IsRUFBRyxPQUFNLEtBQUssR0FBRyxlQUFlLFNBQVMsb0JBQW9CLElBQUksS0FBSyxHQUFHLEVBQUU7QUFDakcsY0FBTSxLQUFLLE9BQU87QUFBQSxVQUNoQixHQUFHLE1BQU0sS0FBSyxPQUFPLENBQUM7QUFBQTtBQUFBO0FBQUEsUUFDeEI7QUFDQSxZQUFJLENBQUMsR0FBSTtBQUFBLE1BQ1g7QUFDQSxVQUFJLG1CQUFtQixPQUFPLEtBQUssZUFBZSxXQUFXLEVBQUUsU0FBUyxLQUFLLE9BQU8sS0FBSyxlQUFlLE1BQU0sRUFBRSxTQUFTLElBQUk7QUFDM0gsc0JBQWMsVUFBVSxtQ0FBbUM7QUFBQSxNQUc3RDtBQUNBLFlBQU0sdUJBQXVCO0FBQUEsSUFDL0IsQ0FBQztBQUNELGFBQVMsZUFBZSxhQUFhLEVBQUUsaUJBQWlCLFNBQVMsc0JBQXNCO0FBQ3ZGLGFBQVMsZUFBZSxXQUFXLEVBQUUsaUJBQWlCLFNBQVMseUJBQXlCO0FBQ3hGLGFBQVMsZUFBZSxzQkFBc0IsRUFBRSxpQkFBaUIsU0FBUyxNQUFNLFVBQVUsUUFBUSxDQUFDO0FBQ25HLGFBQVMsZUFBZSxZQUFZLEVBQUUsaUJBQWlCLFNBQVMseUJBQXlCO0FBQ3pGLGFBQVMsZUFBZSw0QkFBNEIsRUFBRSxpQkFBaUIsU0FBUyx1QkFBdUI7QUFDdkcsYUFBUyxlQUFlLHFCQUFxQixFQUFFLGlCQUFpQixTQUFTLE1BQU0sVUFBVSxVQUFVLENBQUM7QUFFcEcsUUFBSSxPQUFPLDBCQUEwQixXQUFZLHVCQUFzQjtBQUN2RSxRQUFJLE9BQU8sMEJBQTBCLFdBQVksdUJBQXNCO0FBQUEsRUFDekU7OztBQy9EQSxTQUFPO0FBQUEsSUFBTztBQUFBLElBQ1o7QUFBQSxJQUFRO0FBQUEsSUFBTztBQUFBLElBQVc7QUFBQSxJQUFPO0FBQUEsSUFBYztBQUFBLElBQVE7QUFBQSxJQUN2RDtBQUFBLElBQVk7QUFBQSxJQUF1QjtBQUFBLElBQVc7QUFBQSxJQUM5QztBQUFBLElBQVk7QUFBQSxJQUFjO0FBQUEsSUFDMUI7QUFBQSxJQUFjO0FBQUEsSUFBZTtBQUFBLElBQVc7QUFBQSxJQUFnQjtBQUFBLElBQ3hEO0FBQUEsSUFDQTtBQUFBLElBQWdCO0FBQUEsSUFBVTtBQUFBLElBQWlCO0FBQUEsSUFDM0M7QUFBQSxJQUNBO0FBQUEsSUFBa0I7QUFBQSxJQUFjO0FBQUEsSUFBb0I7QUFBQSxJQUFlO0FBQUEsSUFBZTtBQUFBLElBQW9CO0FBQUEsSUFDdEc7QUFBQSxJQUFlO0FBQUEsSUFBWTtBQUFBLElBQWE7QUFBQSxJQUFlO0FBQUEsSUFBZTtBQUFBLElBQW9CO0FBQUEsSUFDMUY7QUFBQSxJQUFhO0FBQUEsSUFBb0I7QUFBQSxJQUFVO0FBQUEsSUFBZTtBQUFBLElBQVU7QUFBQSxJQUFTO0FBQUEsSUFDN0U7QUFBQSxJQUFtQjtBQUFBLElBQ25CO0FBQUEsRUFDRjtBQUVBLFdBQVMsaUJBQWlCLG9CQUF3QixJQUFJOyIsCiAgIm5hbWVzIjogWyJnZXRMb2dnZXIiLCAibG9nZ2VyIiwgImxvZ2xldmVsIiwgImNsZWFuSnNvblJlc3BvbnNlIiwgImVzY2FwZUh0bWwiLCAiZXh0cmFjdEZpcnN0SnNvbk9iamVjdCIsICJleHRyYWN0VGl0bGVBbmRDb21wYW55RnJvbUpvYlRleHQiLCAiZm9ybWF0U2Vzc2lvblBoYXNlTGFiZWwiLCAibm9ybWFsaXplUG9zaXRpb25MYWJlbCIsICJub3JtYWxpemVUZXh0IiwgInRleHQiLCAibSIsICJodG1sIiwgInYiLCAiU3RvcmFnZUtleXMiLCAiYXBpQ2FsbCIsICJjcmVhdGVTZXNzaW9uIiwgImZldGNoU3RhdHVzIiwgImdldE93bmVyVG9rZW4iLCAiZ2V0U2NvcGVkVGFiRGF0YVN0b3JhZ2VLZXkiLCAiZ2V0U2Vzc2lvbklkRnJvbVVSTCIsICJfdXBkYXRlTExNU3RhdHVzQmFyIiwgImxsbUZldGNoIiwgInNldExvYWRpbmciLCAiXyIsICJpbml0IiwgImNoYXRBcmVhIiwgIlN0b3JhZ2VLZXlzIiwgImdldFNlc3Npb25JZEZyb21VUkwiLCAiZ2V0T3duZXJUb2tlbiIsICJnZXRTY29wZWRUYWJEYXRhU3RvcmFnZUtleSIsICJzZXNzaW9uSWQiLCAiaW5pdCIsICJfIiwgImFwaUNhbGwiLCAiY3JlYXRlU2Vzc2lvbiIsICJmZXRjaFN0YXR1cyIsICJQSEFTRVMiLCAic3RhdGVNYW5hZ2VyIiwgImxvZyIsICJQSEFTRVMiLCAic3RhdGVNYW5hZ2VyIiwgIlN0b3JhZ2VLZXlzIiwgImdldFByb3ZpZGVySW5mbyIsICJsb2FkUHJvdmlkZXJJbmZvIiwgInByb3ZpZGVySW5mb1BvcG92ZXJDb250ZW50IiwgImxvYWRQcm92aWRlckluZm8iLCAiZ2V0UHJvdmlkZXJJbmZvIiwgInByb3ZpZGVySW5mb1BvcG92ZXJDb250ZW50IiwgImVzY2FwZUh0bWwiLCAiX3VwZGF0ZUxsbVN0YXR1c1BpbGwiLCAiY2xvc2VNb2RlbE1vZGFsIiwgImNvbmZpcm1EaWFsb2ciLCAiZ2V0U3RhZ2VGb3JUYWIiLCAicHVzaEZvY3VzU3RhY2siLCAicmVzdG9yZUZvY3VzIiwgInNldEluaXRpYWxGb2N1cyIsICJ0cmFwRm9jdXMiLCAidXBkYXRlVGFiQmFyRm9yU3RhZ2UiLCAiX3VwZGF0ZVZpZXdpbmdJbmRpY2F0b3IiLCAiY29uZmlybVJlUnVuUGhhc2UiLCAic2hvd0J1bGxldFJlb3JkZXIiLCAibG9nIiwgInN0YXRlTWFuYWdlciIsICJnZW5lcmF0aW9uU3RhdGUiLCAiY29uZmlybVJlUnVuUGhhc2UiLCAiX3VwZGF0ZVZpZXdpbmdJbmRpY2F0b3IiLCAicSIsICJjbG9zZU1vZGFsIiwgIl9lIiwgInNob3dCdWxsZXRSZW9yZGVyIiwgIl8iLCAidGV4dCIsICJsb2ciLCAiZmV0Y2hTdGF0dXMiLCAiYXBpQ2FsbCIsICJfIiwgInNldEluaXRpYWxGb2N1cyIsICJ0cmFwRm9jdXMiLCAicmVzdG9yZUZvY3VzIiwgInB1c2hGb2N1c1N0YWNrIiwgImNvbmZpcm1EaWFsb2ciLCAiZ2V0U3RhZ2VGb3JUYWIiLCAic3RhdGVNYW5hZ2VyIiwgInVwZGF0ZVRhYkJhckZvclN0YWdlIiwgIlN0b3JhZ2VLZXlzIiwgIl91cGRhdGVMbG1TdGF0dXNQaWxsIiwgInRleHQiLCAiYiIsICJlc2NhcGVIdG1sIiwgImNsb3NlTW9kZWxNb2RhbCIsICJ2IiwgIm0iLCAiZXZlbnQiLCAidXBkYXRlV29ya2Zsb3dTdGVwc0NsaWNrYWJsZSIsICJoYW5kbGVMYXlvdXRQcmltYXJ5QWN0aW9uIiwgImluaXRpYXRlTGF5b3V0SW5zdHJ1Y3Rpb25zIiwgInJlZnJlc2hBdHNTY29yZSIsICJzY2hlZHVsZUF0c1JlZnJlc2giLCAidXBkYXRlQXRzQmFkZ2UiLCAidGV4dCIsICJnZW5lcmF0aW9uU3RhdGUiLCAic2Vzc2lvbklkIiwgIl9lIiwgIl9mbHVzaE1lc3NhZ2VRdWV1ZSIsICJhcHBlbmRGb3JtYXR0ZWRBbmFseXNpcyIsICJhcHBlbmRMb2FkaW5nTWVzc2FnZSIsICJhcHBlbmRNZXNzYWdlIiwgImFwcGVuZFJhd0h0bWwiLCAiYXBwZW5kUmV0cnlNZXNzYWdlIiwgInJlbW92ZUxvYWRpbmdNZXNzYWdlIiwgImxvZyIsICJfZmx1c2hNZXNzYWdlUXVldWUiLCAidGV4dCIsICJhcHBlbmRNZXNzYWdlIiwgImFwcGVuZExvYWRpbmdNZXNzYWdlIiwgInJlbW92ZUxvYWRpbmdNZXNzYWdlIiwgImh0bWwiLCAiZXNjYXBlSHRtbCIsICJhcHBlbmRSZXRyeU1lc3NhZ2UiLCAiYXBwZW5kRm9ybWF0dGVkQW5hbHlzaXMiLCAiY2xlYW5Kc29uUmVzcG9uc2UiLCAiYXBwZW5kUmF3SHRtbCIsICJfdXBkYXRlUGFnZUVzdGltYXRlIiwgImhhbmRsZUFjdGlvbkNsaWNrIiwgImhhbmRsZUN1c3RvbWl6YXRpb25SZXNwb25zZSIsICJzaG93VGFibGVCYXNlZFJldmlldyIsICJzd2l0Y2hUYWIiLCAidXBkYXRlSW5jbHVzaW9uQ291bnRzIiwgInVzZXJTZWxlY3Rpb25zIiwgImxvZyIsICJ1c2VyU2VsZWN0aW9ucyIsICJzdGF0ZU1hbmFnZXIiLCAidXBkYXRlSW5jbHVzaW9uQ291bnRzIiwgInYiLCAic3dpdGNoVGFiIiwgInRhYkRhdGEiLCAic2hvd1RhYmxlQmFzZWRSZXZpZXciLCAic2Vzc2lvbklkIiwgIl8iLCAiaHRtbCIsICJoYW5kbGVDdXN0b21pemF0aW9uUmVzcG9uc2UiLCAic3RhdGVNYW5hZ2VyIiwgIl91cGRhdGVQYWdlRXN0aW1hdGUiLCAidXNlclNlbGVjdGlvbnMiLCAiaGFuZGxlQWN0aW9uQ2xpY2siLCAiaHRtbCIsICJsb2ciLCAic3RhdGVNYW5hZ2VyIiwgImh0bWwiLCAic2Vzc2lvbklkIiwgImVzY2FwZUh0bWwiLCAidGV4dCIsICJnZW5lcmF0aW9uU3RhdGUiLCAiaW5pdGlhdGVMYXlvdXRJbnN0cnVjdGlvbnMiLCAiXyIsICJhcHBlbmRNZXNzYWdlIiwgImNvbmZpcm1SZVJ1blBoYXNlIiwgImFwaUNhbGwiLCAidyIsICJfZSIsICJzY2hlZHVsZUF0c1JlZnJlc2giLCAic3dpdGNoVGFiIiwgImhhbmRsZUxheW91dFByaW1hcnlBY3Rpb24iLCAicGFyc2VNZXNzYWdlUmVzcG9uc2UiLCAicGFyc2VSZXdyaXRlc1Jlc3BvbnNlIiwgInBhcnNlU2Vzc2lvbkxpc3RSZXNwb25zZSIsICJwYXJzZVN0YXR1c1Jlc3BvbnNlIiwgImxvZyIsICJwYXJzZVN0YXR1c1Jlc3BvbnNlIiwgImsiLCAicGFyc2VTZXNzaW9uTGlzdFJlc3BvbnNlIiwgInBhcnNlUmV3cml0ZXNSZXNwb25zZSIsICJwYXJzZU1lc3NhZ2VSZXNwb25zZSIsICJidWlsZEZhbGxiYWNrUG9zdEFuYWx5c2lzUXVlc3Rpb25zIiwgImdldEFjaGlldmVtZW50Q29uZmlkZW5jZSIsICJnZXRBY2hpZXZlbWVudFJlYXNvbmluZyIsICJnZXRBY2hpZXZlbWVudFJlY29tbWVuZGF0aW9uIiwgImdldENvbmZpZGVuY2VMZXZlbCIsICJnZXRFeHBlcmllbmNlUmVhc29uaW5nIiwgImdldEV4cGVyaWVuY2VSZWNvbW1lbmRhdGlvbiIsICJnZXRTa2lsbENvbmZpZGVuY2UiLCAiZ2V0U2tpbGxSZWFzb25pbmciLCAiZ2V0U2tpbGxSZWNvbW1lbmRhdGlvbiIsICJsb2ciLCAiZ2V0RXhwZXJpZW5jZVJlY29tbWVuZGF0aW9uIiwgImdldENvbmZpZGVuY2VMZXZlbCIsICJnZXRFeHBlcmllbmNlUmVhc29uaW5nIiwgImdldFNraWxsUmVjb21tZW5kYXRpb24iLCAiZ2V0U2tpbGxDb25maWRlbmNlIiwgImdldFNraWxsUmVhc29uaW5nIiwgImdldEFjaGlldmVtZW50UmVjb21tZW5kYXRpb24iLCAiZ2V0QWNoaWV2ZW1lbnRDb25maWRlbmNlIiwgImdldEFjaGlldmVtZW50UmVhc29uaW5nIiwgImJ1aWxkRmFsbGJhY2tQb3N0QW5hbHlzaXNRdWVzdGlvbnMiLCAiY2xvc2VBbGVydE1vZGFsIiwgInNob3dBbGVydE1vZGFsIiwgInNob3dDb25maXJtTW9kYWwiLCAic2hvd1RvYXN0IiwgInVwZGF0ZUFjdGlvbkJ1dHRvbnMiLCAic2hvd0FsZXJ0TW9kYWwiLCAiY2xvc2VBbGVydE1vZGFsIiwgInNob3dDb25maXJtTW9kYWwiLCAic2hvd1RvYXN0IiwgInN0YXRlTWFuYWdlciIsICJnZW5lcmF0aW9uU3RhdGUiLCAidXBkYXRlQWN0aW9uQnV0dG9ucyIsICJldmVudCIsICJmZXRjaEFuZERpc3BsYXlMbG1Mb2ciLCAibG9nIiwgInRleHQiLCAiZXNjYXBlSHRtbCIsICJtIiwgImh0bWwiLCAiZmV0Y2hBbmREaXNwbGF5TGxtTG9nIiwgInNlc3Npb25JZCIsICJnZXRTZXNzaW9uSWRGcm9tVVJMIiwgInVwZGF0ZUF1dGhCYWRnZSIsICJ1cGRhdGVBdXRoQmFkZ2UiLCAidGV4dCIsICJnZXRQcm92aWRlckluZm8iLCAicG9wdWxhdGVBdHNTY29yZVRhYiIsICJzZXNzaW9uSWQiLCAic3RhdGVNYW5hZ2VyIiwgIl8iLCAiZXNjYXBlSHRtbCIsICJwdXNoRm9jdXNTdGFjayIsICJ0cmFwRm9jdXMiLCAidXBkYXRlQXRzQmFkZ2UiLCAicmVzdG9yZUZvY3VzIiwgImsiLCAicG9wdWxhdGVBdHNTY29yZVRhYiIsICJfQUNUSU9OX0xBQkVMUyIsICJzZW5kQWN0aW9uIiwgInVwZGF0ZVBvc2l0aW9uVGl0bGUiLCAibG9nIiwgIl9BQ1RJT05fTEFCRUxTIiwgInNlbmRBY3Rpb24iLCAic3RhdGVNYW5hZ2VyIiwgIl9lIiwgIlN0b3JhZ2VLZXlzIiwgInRleHQiLCAidXBkYXRlUG9zaXRpb25UaXRsZSIsICJhbmFseXplSm9iIiwgIm1lcmdlUG9zdEFuYWx5c2lzUXVlc3Rpb25zIiwgIm5vcm1hbGl6ZVBvc3RBbmFseXNpc1F1ZXN0aW9ucyIsICJsb2ciLCAibm9ybWFsaXplUG9zdEFuYWx5c2lzUXVlc3Rpb25zIiwgInEiLCAidGV4dCIsICJtZXJnZVBvc3RBbmFseXNpc1F1ZXN0aW9ucyIsICJhbmFseXplSm9iIiwgInN0YXRlTWFuYWdlciIsICJTdG9yYWdlS2V5cyIsICJfZSIsICJwb3B1bGF0ZUdvYWxzVGFiIiwgImxvZyIsICJwb3B1bGF0ZUdvYWxzVGFiIiwgIl9nZXRDdXJyZW50U2Vzc2lvbklkVmFsdWUiLCAiYnVpbGRTZXNzaW9uU3dpdGNoZXJMYWJlbCIsICJjcmVhdGVOZXdTZXNzaW9uQW5kTmF2aWdhdGUiLCAiZW5zdXJlU2Vzc2lvbkNvbnRleHQiLCAiZm9ybWF0U2Vzc2lvblBoYXNlTGFiZWwiLCAiZm9ybWF0U2Vzc2lvblRpbWVzdGFtcCIsICJnZXRBY3RpdmVTZXNzaW9uT3duZXJzaGlwTWV0YSIsICJsb2FkU2Vzc2lvbkZpbGUiLCAibWF5YmVTaG93V2VsY29tZU1vZGFsIiwgInJlc3RvcmVTZXNzaW9uIiwgInNhdmVUYWJEYXRhIiwgImxvZyIsICJmb3JtYXRTZXNzaW9uUGhhc2VMYWJlbCIsICJfZ2V0Q3VycmVudFNlc3Npb25JZFZhbHVlIiwgIl8iLCAiYnVpbGRTZXNzaW9uU3dpdGNoZXJMYWJlbCIsICJnZXRBY3RpdmVTZXNzaW9uT3duZXJzaGlwTWV0YSIsICJmb3JtYXRTZXNzaW9uVGltZXN0YW1wIiwgIm1heWJlU2hvd1dlbGNvbWVNb2RhbCIsICJjcmVhdGVOZXdTZXNzaW9uQW5kTmF2aWdhdGUiLCAic3RhdGVNYW5hZ2VyIiwgIlBIQVNFUyIsICJlbnN1cmVTZXNzaW9uQ29udGV4dCIsICJyZXN0b3JlU2Vzc2lvbiIsICJrIiwgInYiLCAiX2UiLCAibG9hZFNlc3Npb25GaWxlIiwgInNhdmVUYWJEYXRhIiwgInBvcHVsYXRlSm9iVGFiIiwgInNob3dMb2FkSm9iUGFuZWwiLCAiX2dldERlZmF1bHRzIiwgIl9kZWZhdWx0cyIsICJjaGFuZ2VEZWZhdWx0cyIsICJuZXdEZWZhdWx0cyIsICJub29wVGVzdCIsICJlZGl0IiwgInJlZ2V4IiwgIm9wdCIsICJzb3VyY2UiLCAib2JqIiwgIm5hbWUiLCAidmFsIiwgInZhbFNvdXJjZSIsICJvdGhlciIsICJzdXBwb3J0c0xvb2tiZWhpbmQiLCAiYnVsbCIsICJpbmRlbnQiLCAibmV3bGluZSIsICJibG9ja0NvZGUiLCAiZmVuY2VzIiwgImhyIiwgImhlYWRpbmciLCAiYnVsbGV0IiwgImxoZWFkaW5nQ29yZSIsICJsaGVhZGluZyIsICJsaGVhZGluZ0dmbSIsICJfcGFyYWdyYXBoIiwgImJsb2NrVGV4dCIsICJfYmxvY2tMYWJlbCIsICJkZWYiLCAibGlzdCIsICJfdGFnIiwgIl9jb21tZW50IiwgImh0bWwiLCAicGFyYWdyYXBoIiwgImJsb2NrcXVvdGUiLCAiYmxvY2tOb3JtYWwiLCAiZ2ZtVGFibGUiLCAiYmxvY2tHZm0iLCAiYmxvY2tQZWRhbnRpYyIsICJlc2NhcGUiLCAiaW5saW5lQ29kZSIsICJiciIsICJpbmxpbmVUZXh0IiwgIl9wdW5jdHVhdGlvbiIsICJfcHVuY3R1YXRpb25PclNwYWNlIiwgIl9ub3RQdW5jdHVhdGlvbk9yU3BhY2UiLCAicHVuY3R1YXRpb24iLCAiX3B1bmN0dWF0aW9uR2ZtU3Ryb25nRW0iLCAiX3B1bmN0dWF0aW9uT3JTcGFjZUdmbVN0cm9uZ0VtIiwgIl9ub3RQdW5jdHVhdGlvbk9yU3BhY2VHZm1TdHJvbmdFbSIsICJibG9ja1NraXAiLCAiZW1TdHJvbmdMRGVsaW1Db3JlIiwgImVtU3Ryb25nTERlbGltIiwgImVtU3Ryb25nTERlbGltR2ZtIiwgImVtU3Ryb25nUkRlbGltQXN0Q29yZSIsICJlbVN0cm9uZ1JEZWxpbUFzdCIsICJlbVN0cm9uZ1JEZWxpbUFzdEdmbSIsICJlbVN0cm9uZ1JEZWxpbVVuZCIsICJkZWxMRGVsaW0iLCAiZGVsUkRlbGltQ29yZSIsICJkZWxSRGVsaW0iLCAiYW55UHVuY3R1YXRpb24iLCAiYXV0b2xpbmsiLCAiX2lubGluZUNvbW1lbnQiLCAidGFnIiwgIl9pbmxpbmVMYWJlbCIsICJsaW5rIiwgInJlZmxpbmsiLCAibm9saW5rIiwgInJlZmxpbmtTZWFyY2giLCAiX2Nhc2VJbnNlbnNpdGl2ZVByb3RvY29sIiwgImlubGluZU5vcm1hbCIsICJpbmxpbmVQZWRhbnRpYyIsICJpbmxpbmVHZm0iLCAiaW5saW5lQnJlYWtzIiwgImJsb2NrIiwgImlubGluZSIsICJlc2NhcGVSZXBsYWNlbWVudHMiLCAiZ2V0RXNjYXBlUmVwbGFjZW1lbnQiLCAiY2giLCAiZXNjYXBlSHRtbEVudGl0aWVzIiwgImVuY29kZSIsICJjbGVhblVybCIsICJocmVmIiwgInNwbGl0Q2VsbHMiLCAidGFibGVSb3ciLCAiY291bnQiLCAicm93IiwgIm1hdGNoIiwgIm9mZnNldCIsICJzdHIiLCAiZXNjYXBlZCIsICJjdXJyIiwgImNlbGxzIiwgImkiLCAicnRyaW0iLCAiYyIsICJpbnZlcnQiLCAibCIsICJzdWZmTGVuIiwgImN1cnJDaGFyIiwgImZpbmRDbG9zaW5nQnJhY2tldCIsICJiIiwgImxldmVsIiwgImV4cGFuZFRhYnMiLCAibGluZSIsICJjb2wiLCAiZXhwYW5kZWQiLCAiY2hhciIsICJhZGRlZCIsICJvdXRwdXRMaW5rIiwgImNhcCIsICJyYXciLCAibGV4ZXIiLCAicnVsZXMiLCAidGl0bGUiLCAidGV4dCIsICJ0b2tlbiIsICJpbmRlbnRDb2RlQ29tcGVuc2F0aW9uIiwgIm1hdGNoSW5kZW50VG9Db2RlIiwgImluZGVudFRvQ29kZSIsICJub2RlIiwgIm1hdGNoSW5kZW50SW5Ob2RlIiwgImluZGVudEluTm9kZSIsICJfVG9rZW5pemVyIiwgIm9wdGlvbnMiLCAic3JjIiwgInRyaW1tZWQiLCAibGluZXMiLCAidG9rZW5zIiwgImluQmxvY2txdW90ZSIsICJjdXJyZW50TGluZXMiLCAiY3VycmVudFJhdyIsICJjdXJyZW50VGV4dCIsICJ0b3AiLCAibGFzdFRva2VuIiwgIm9sZFRva2VuIiwgIm5ld1RleHQiLCAibmV3VG9rZW4iLCAiaXNvcmRlcmVkIiwgIml0ZW1SZWdleCIsICJlbmRzV2l0aEJsYW5rTGluZSIsICJlbmRFYXJseSIsICJpdGVtQ29udGVudHMiLCAibmV4dExpbmUiLCAiYmxhbmtMaW5lIiwgIm5leHRCdWxsZXRSZWdleCIsICJoclJlZ2V4IiwgImZlbmNlc0JlZ2luUmVnZXgiLCAiaGVhZGluZ0JlZ2luUmVnZXgiLCAiaHRtbEJlZ2luUmVnZXgiLCAiYmxvY2txdW90ZUJlZ2luUmVnZXgiLCAicmF3TGluZSIsICJuZXh0TGluZVdpdGhvdXRUYWJzIiwgImxhc3RJdGVtIiwgIml0ZW0iLCAidGFza1JhdyIsICJjaGVja2JveFRva2VuIiwgInNwYWNlcnMiLCAidCIsICJoYXNNdWx0aXBsZUxpbmVCcmVha3MiLCAiaGVhZGVycyIsICJhbGlnbnMiLCAicm93cyIsICJhbGlnbiIsICJjZWxsIiwgInRyaW1tZWRVcmwiLCAicnRyaW1TbGFzaCIsICJsYXN0UGFyZW5JbmRleCIsICJsaW5rTGVuIiwgImxpbmtzIiwgImxpbmtTdHJpbmciLCAibWFza2VkU3JjIiwgInByZXZDaGFyIiwgImxMZW5ndGgiLCAickRlbGltIiwgInJMZW5ndGgiLCAiZGVsaW1Ub3RhbCIsICJtaWREZWxpbVRvdGFsIiwgImVuZFJlZyIsICJsYXN0Q2hhckxlbmd0aCIsICJoYXNOb25TcGFjZUNoYXJzIiwgImhhc1NwYWNlQ2hhcnNPbkJvdGhFbmRzIiwgInByZXZDYXBaZXJvIiwgIl9MZXhlciIsICJfX0xleGVyIiwgIm5leHQiLCAibGFzdFBhcmFncmFwaENsaXBwZWQiLCAiZXh0VG9rZW5pemVyIiwgImN1dFNyYyIsICJzdGFydEluZGV4IiwgInRlbXBTcmMiLCAidGVtcFN0YXJ0IiwgImdldFN0YXJ0SW5kZXgiLCAiZXJyTXNnIiwgImtlZXBQcmV2Q2hhciIsICJfUmVuZGVyZXIiLCAibGFuZyIsICJsYW5nU3RyaW5nIiwgImNvZGUiLCAiZGVwdGgiLCAib3JkZXJlZCIsICJzdGFydCIsICJib2R5IiwgImoiLCAidHlwZSIsICJzdGFydEF0dHIiLCAiY2hlY2tlZCIsICJoZWFkZXIiLCAiayIsICJjb250ZW50IiwgImNsZWFuSHJlZiIsICJvdXQiLCAiX1RleHRSZW5kZXJlciIsICJfUGFyc2VyIiwgIl9fUGFyc2VyIiwgImFueVRva2VuIiwgImdlbmVyaWNUb2tlbiIsICJyZXQiLCAicmVuZGVyZXIiLCAiX0hvb2tzIiwgIm1hcmtkb3duIiwgIk1hcmtlZCIsICJhcmdzIiwgImNhbGxiYWNrIiwgInZhbHVlcyIsICJ0YWJsZVRva2VuIiwgImxpc3RUb2tlbiIsICJjaGlsZFRva2VucyIsICJleHRlbnNpb25zIiwgInBhY2siLCAib3B0cyIsICJleHQiLCAicHJldlJlbmRlcmVyIiwgImV4dExldmVsIiwgInByb3AiLCAicmVuZGVyZXJQcm9wIiwgInJlbmRlcmVyRnVuYyIsICJ0b2tlbml6ZXIiLCAidG9rZW5pemVyUHJvcCIsICJ0b2tlbml6ZXJGdW5jIiwgInByZXZUb2tlbml6ZXIiLCAiaG9va3MiLCAiaG9va3NQcm9wIiwgImhvb2tzRnVuYyIsICJwcmV2SG9vayIsICJhcmciLCAid2Fsa1Rva2VucyIsICJwYWNrV2Fsa3Rva2VucyIsICJibG9ja1R5cGUiLCAib3JpZ09wdCIsICJ0aHJvd0Vycm9yIiwgInByb2Nlc3NlZFNyYyIsICJwcm9jZXNzZWRUb2tlbnMiLCAiZSIsICJzaWxlbnQiLCAiYXN5bmMiLCAibXNnIiwgIm1hcmtlZEluc3RhbmNlIiwgIm1hcmtlZCIsICJzZXRPcHRpb25zIiwgInVzZSIsICJwYXJzZUlubGluZSIsICJwYXJzZXIiLCAiX1BhcnNlciIsICJsZXhlciIsICJfTGV4ZXIiLCAiZW50cmllcyIsICJzZXRQcm90b3R5cGVPZiIsICJpc0Zyb3plbiIsICJnZXRQcm90b3R5cGVPZiIsICJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCAiT2JqZWN0IiwgImZyZWV6ZSIsICJzZWFsIiwgImNyZWF0ZSIsICJhcHBseSIsICJjb25zdHJ1Y3QiLCAiUmVmbGVjdCIsICJ4IiwgImZ1bmMiLCAidGhpc0FyZyIsICJfbGVuIiwgImFyZ3VtZW50cyIsICJsZW5ndGgiLCAiYXJncyIsICJBcnJheSIsICJfa2V5IiwgIkZ1bmMiLCAiX2xlbjIiLCAiX2tleTIiLCAiYXJyYXlGb3JFYWNoIiwgInVuYXBwbHkiLCAicHJvdG90eXBlIiwgImZvckVhY2giLCAiYXJyYXlMYXN0SW5kZXhPZiIsICJsYXN0SW5kZXhPZiIsICJhcnJheVBvcCIsICJwb3AiLCAiYXJyYXlQdXNoIiwgInB1c2giLCAiYXJyYXlTcGxpY2UiLCAic3BsaWNlIiwgInN0cmluZ1RvTG93ZXJDYXNlIiwgIlN0cmluZyIsICJ0b0xvd2VyQ2FzZSIsICJzdHJpbmdUb1N0cmluZyIsICJ0b1N0cmluZyIsICJzdHJpbmdNYXRjaCIsICJtYXRjaCIsICJzdHJpbmdSZXBsYWNlIiwgInJlcGxhY2UiLCAic3RyaW5nSW5kZXhPZiIsICJpbmRleE9mIiwgInN0cmluZ1RyaW0iLCAidHJpbSIsICJvYmplY3RIYXNPd25Qcm9wZXJ0eSIsICJoYXNPd25Qcm9wZXJ0eSIsICJyZWdFeHBUZXN0IiwgIlJlZ0V4cCIsICJ0ZXN0IiwgInR5cGVFcnJvckNyZWF0ZSIsICJ1bmNvbnN0cnVjdCIsICJUeXBlRXJyb3IiLCAibGFzdEluZGV4IiwgIl9sZW4zIiwgIl9rZXkzIiwgIl9sZW40IiwgIl9rZXk0IiwgImFkZFRvU2V0IiwgInNldCIsICJhcnJheSIsICJ0cmFuc2Zvcm1DYXNlRnVuYyIsICJsIiwgImVsZW1lbnQiLCAibGNFbGVtZW50IiwgImNsZWFuQXJyYXkiLCAiaW5kZXgiLCAiaXNQcm9wZXJ0eUV4aXN0IiwgImNsb25lIiwgIm9iamVjdCIsICJuZXdPYmplY3QiLCAicHJvcGVydHkiLCAidmFsdWUiLCAiaXNBcnJheSIsICJjb25zdHJ1Y3RvciIsICJsb29rdXBHZXR0ZXIiLCAicHJvcCIsICJkZXNjIiwgImdldCIsICJmYWxsYmFja1ZhbHVlIiwgImh0bWwiLCAic3ZnIiwgInN2Z0ZpbHRlcnMiLCAic3ZnRGlzYWxsb3dlZCIsICJtYXRoTWwiLCAibWF0aE1sRGlzYWxsb3dlZCIsICJ0ZXh0IiwgInhtbCIsICJNVVNUQUNIRV9FWFBSIiwgIkVSQl9FWFBSIiwgIlRNUExJVF9FWFBSIiwgIkRBVEFfQVRUUiIsICJBUklBX0FUVFIiLCAiSVNfQUxMT1dFRF9VUkkiLCAiSVNfU0NSSVBUX09SX0RBVEEiLCAiQVRUUl9XSElURVNQQUNFIiwgIkRPQ1RZUEVfTkFNRSIsICJDVVNUT01fRUxFTUVOVCIsICJOT0RFX1RZUEUiLCAiYXR0cmlidXRlIiwgImNkYXRhU2VjdGlvbiIsICJlbnRpdHlSZWZlcmVuY2UiLCAiZW50aXR5Tm9kZSIsICJwcm9ncmVzc2luZ0luc3RydWN0aW9uIiwgImNvbW1lbnQiLCAiZG9jdW1lbnQiLCAiZG9jdW1lbnRUeXBlIiwgImRvY3VtZW50RnJhZ21lbnQiLCAibm90YXRpb24iLCAiZ2V0R2xvYmFsIiwgIndpbmRvdyIsICJfY3JlYXRlVHJ1c3RlZFR5cGVzUG9saWN5IiwgInRydXN0ZWRUeXBlcyIsICJwdXJpZnlIb3N0RWxlbWVudCIsICJjcmVhdGVQb2xpY3kiLCAic3VmZml4IiwgIkFUVFJfTkFNRSIsICJoYXNBdHRyaWJ1dGUiLCAiZ2V0QXR0cmlidXRlIiwgInBvbGljeU5hbWUiLCAiY3JlYXRlSFRNTCIsICJjcmVhdGVTY3JpcHRVUkwiLCAic2NyaXB0VXJsIiwgIl8iLCAiY29uc29sZSIsICJ3YXJuIiwgIl9jcmVhdGVIb29rc01hcCIsICJhZnRlclNhbml0aXplQXR0cmlidXRlcyIsICJhZnRlclNhbml0aXplRWxlbWVudHMiLCAiYWZ0ZXJTYW5pdGl6ZVNoYWRvd0RPTSIsICJiZWZvcmVTYW5pdGl6ZUF0dHJpYnV0ZXMiLCAiYmVmb3JlU2FuaXRpemVFbGVtZW50cyIsICJiZWZvcmVTYW5pdGl6ZVNoYWRvd0RPTSIsICJ1cG9uU2FuaXRpemVBdHRyaWJ1dGUiLCAidXBvblNhbml0aXplRWxlbWVudCIsICJ1cG9uU2FuaXRpemVTaGFkb3dOb2RlIiwgImNyZWF0ZURPTVB1cmlmeSIsICJ1bmRlZmluZWQiLCAiRE9NUHVyaWZ5IiwgInJvb3QiLCAidmVyc2lvbiIsICJWRVJTSU9OIiwgInJlbW92ZWQiLCAibm9kZVR5cGUiLCAiRWxlbWVudCIsICJpc1N1cHBvcnRlZCIsICJvcmlnaW5hbERvY3VtZW50IiwgImN1cnJlbnRTY3JpcHQiLCAiRG9jdW1lbnRGcmFnbWVudCIsICJIVE1MVGVtcGxhdGVFbGVtZW50IiwgIk5vZGUiLCAiTm9kZUZpbHRlciIsICJOYW1lZE5vZGVNYXAiLCAiTW96TmFtZWRBdHRyTWFwIiwgIkhUTUxGb3JtRWxlbWVudCIsICJET01QYXJzZXIiLCAiRWxlbWVudFByb3RvdHlwZSIsICJjbG9uZU5vZGUiLCAicmVtb3ZlIiwgImdldE5leHRTaWJsaW5nIiwgImdldENoaWxkTm9kZXMiLCAiZ2V0UGFyZW50Tm9kZSIsICJ0ZW1wbGF0ZSIsICJjcmVhdGVFbGVtZW50IiwgImNvbnRlbnQiLCAib3duZXJEb2N1bWVudCIsICJ0cnVzdGVkVHlwZXNQb2xpY3kiLCAiZW1wdHlIVE1MIiwgImltcGxlbWVudGF0aW9uIiwgImNyZWF0ZU5vZGVJdGVyYXRvciIsICJjcmVhdGVEb2N1bWVudEZyYWdtZW50IiwgImdldEVsZW1lbnRzQnlUYWdOYW1lIiwgImltcG9ydE5vZGUiLCAiaG9va3MiLCAiY3JlYXRlSFRNTERvY3VtZW50IiwgIkVYUFJFU1NJT05TIiwgIkFMTE9XRURfVEFHUyIsICJERUZBVUxUX0FMTE9XRURfVEFHUyIsICJUQUdTIiwgIkFMTE9XRURfQVRUUiIsICJERUZBVUxUX0FMTE9XRURfQVRUUiIsICJBVFRSUyIsICJDVVNUT01fRUxFTUVOVF9IQU5ETElORyIsICJ0YWdOYW1lQ2hlY2siLCAid3JpdGFibGUiLCAiY29uZmlndXJhYmxlIiwgImVudW1lcmFibGUiLCAiYXR0cmlidXRlTmFtZUNoZWNrIiwgImFsbG93Q3VzdG9taXplZEJ1aWx0SW5FbGVtZW50cyIsICJGT1JCSURfVEFHUyIsICJGT1JCSURfQVRUUiIsICJFWFRSQV9FTEVNRU5UX0hBTkRMSU5HIiwgInRhZ0NoZWNrIiwgImF0dHJpYnV0ZUNoZWNrIiwgIkFMTE9XX0FSSUFfQVRUUiIsICJBTExPV19EQVRBX0FUVFIiLCAiQUxMT1dfVU5LTk9XTl9QUk9UT0NPTFMiLCAiQUxMT1dfU0VMRl9DTE9TRV9JTl9BVFRSIiwgIlNBRkVfRk9SX1RFTVBMQVRFUyIsICJTQUZFX0ZPUl9YTUwiLCAiV0hPTEVfRE9DVU1FTlQiLCAiU0VUX0NPTkZJRyIsICJGT1JDRV9CT0RZIiwgIlJFVFVSTl9ET00iLCAiUkVUVVJOX0RPTV9GUkFHTUVOVCIsICJSRVRVUk5fVFJVU1RFRF9UWVBFIiwgIlNBTklUSVpFX0RPTSIsICJTQU5JVElaRV9OQU1FRF9QUk9QUyIsICJTQU5JVElaRV9OQU1FRF9QUk9QU19QUkVGSVgiLCAiS0VFUF9DT05URU5UIiwgIklOX1BMQUNFIiwgIlVTRV9QUk9GSUxFUyIsICJGT1JCSURfQ09OVEVOVFMiLCAiREVGQVVMVF9GT1JCSURfQ09OVEVOVFMiLCAiREFUQV9VUklfVEFHUyIsICJERUZBVUxUX0RBVEFfVVJJX1RBR1MiLCAiVVJJX1NBRkVfQVRUUklCVVRFUyIsICJERUZBVUxUX1VSSV9TQUZFX0FUVFJJQlVURVMiLCAiTUFUSE1MX05BTUVTUEFDRSIsICJTVkdfTkFNRVNQQUNFIiwgIkhUTUxfTkFNRVNQQUNFIiwgIk5BTUVTUEFDRSIsICJJU19FTVBUWV9JTlBVVCIsICJBTExPV0VEX05BTUVTUEFDRVMiLCAiREVGQVVMVF9BTExPV0VEX05BTUVTUEFDRVMiLCAiTUFUSE1MX1RFWFRfSU5URUdSQVRJT05fUE9JTlRTIiwgIkhUTUxfSU5URUdSQVRJT05fUE9JTlRTIiwgIkNPTU1PTl9TVkdfQU5EX0hUTUxfRUxFTUVOVFMiLCAiUEFSU0VSX01FRElBX1RZUEUiLCAiU1VQUE9SVEVEX1BBUlNFUl9NRURJQV9UWVBFUyIsICJERUZBVUxUX1BBUlNFUl9NRURJQV9UWVBFIiwgIkNPTkZJRyIsICJmb3JtRWxlbWVudCIsICJpc1JlZ2V4T3JGdW5jdGlvbiIsICJ0ZXN0VmFsdWUiLCAiRnVuY3Rpb24iLCAiX3BhcnNlQ29uZmlnIiwgImNmZyIsICJBRERfVVJJX1NBRkVfQVRUUiIsICJBRERfREFUQV9VUklfVEFHUyIsICJBTExPV0VEX1VSSV9SRUdFWFAiLCAiQUREX1RBR1MiLCAiQUREX0FUVFIiLCAiQUREX0ZPUkJJRF9DT05URU5UUyIsICJ0YWJsZSIsICJ0Ym9keSIsICJUUlVTVEVEX1RZUEVTX1BPTElDWSIsICJBTExfU1ZHX1RBR1MiLCAiQUxMX01BVEhNTF9UQUdTIiwgIl9jaGVja1ZhbGlkTmFtZXNwYWNlIiwgInBhcmVudCIsICJ0YWdOYW1lIiwgIm5hbWVzcGFjZVVSSSIsICJwYXJlbnRUYWdOYW1lIiwgIkJvb2xlYW4iLCAiX2ZvcmNlUmVtb3ZlIiwgIm5vZGUiLCAicmVtb3ZlQ2hpbGQiLCAiX3JlbW92ZUF0dHJpYnV0ZSIsICJuYW1lIiwgImdldEF0dHJpYnV0ZU5vZGUiLCAiZnJvbSIsICJyZW1vdmVBdHRyaWJ1dGUiLCAic2V0QXR0cmlidXRlIiwgIl9pbml0RG9jdW1lbnQiLCAiZGlydHkiLCAiZG9jIiwgImxlYWRpbmdXaGl0ZXNwYWNlIiwgIm1hdGNoZXMiLCAiZGlydHlQYXlsb2FkIiwgInBhcnNlRnJvbVN0cmluZyIsICJkb2N1bWVudEVsZW1lbnQiLCAiY3JlYXRlRG9jdW1lbnQiLCAiaW5uZXJIVE1MIiwgImJvZHkiLCAiaW5zZXJ0QmVmb3JlIiwgImNyZWF0ZVRleHROb2RlIiwgImNoaWxkTm9kZXMiLCAiY2FsbCIsICJfY3JlYXRlTm9kZUl0ZXJhdG9yIiwgIlNIT1dfRUxFTUVOVCIsICJTSE9XX0NPTU1FTlQiLCAiU0hPV19URVhUIiwgIlNIT1dfUFJPQ0VTU0lOR19JTlNUUlVDVElPTiIsICJTSE9XX0NEQVRBX1NFQ1RJT04iLCAiX2lzQ2xvYmJlcmVkIiwgIm5vZGVOYW1lIiwgInRleHRDb250ZW50IiwgImF0dHJpYnV0ZXMiLCAiaGFzQ2hpbGROb2RlcyIsICJfaXNOb2RlIiwgIl9leGVjdXRlSG9va3MiLCAiY3VycmVudE5vZGUiLCAiZGF0YSIsICJob29rIiwgIl9zYW5pdGl6ZUVsZW1lbnRzIiwgImFsbG93ZWRUYWdzIiwgImZpcnN0RWxlbWVudENoaWxkIiwgIl9pc0Jhc2ljQ3VzdG9tRWxlbWVudCIsICJwYXJlbnROb2RlIiwgImNoaWxkQ291bnQiLCAiaSIsICJjaGlsZENsb25lIiwgIl9fcmVtb3ZhbENvdW50IiwgImV4cHIiLCAiX2lzVmFsaWRBdHRyaWJ1dGUiLCAibGNUYWciLCAibGNOYW1lIiwgIl9zYW5pdGl6ZUF0dHJpYnV0ZXMiLCAiaG9va0V2ZW50IiwgImF0dHJOYW1lIiwgImF0dHJWYWx1ZSIsICJrZWVwQXR0ciIsICJhbGxvd2VkQXR0cmlidXRlcyIsICJmb3JjZUtlZXBBdHRyIiwgImF0dHIiLCAiaW5pdFZhbHVlIiwgImdldEF0dHJpYnV0ZVR5cGUiLCAic2V0QXR0cmlidXRlTlMiLCAiX3Nhbml0aXplU2hhZG93RE9NIiwgImZyYWdtZW50IiwgInNoYWRvd05vZGUiLCAic2hhZG93SXRlcmF0b3IiLCAibmV4dE5vZGUiLCAic2FuaXRpemUiLCAiaW1wb3J0ZWROb2RlIiwgInJldHVybk5vZGUiLCAiYXBwZW5kQ2hpbGQiLCAiZmlyc3RDaGlsZCIsICJub2RlSXRlcmF0b3IiLCAic2hhZG93cm9vdCIsICJzaGFkb3dyb290bW9kZSIsICJzZXJpYWxpemVkSFRNTCIsICJvdXRlckhUTUwiLCAiZG9jdHlwZSIsICJzZXRDb25maWciLCAiY2xlYXJDb25maWciLCAiaXNWYWxpZEF0dHJpYnV0ZSIsICJ0YWciLCAiYWRkSG9vayIsICJlbnRyeVBvaW50IiwgImhvb2tGdW5jdGlvbiIsICJyZW1vdmVIb29rIiwgInJlbW92ZUhvb2tzIiwgInJlbW92ZUFsbEhvb2tzIiwgImxvZyIsICJ0ZXh0IiwgInBvcHVsYXRlSm9iVGFiIiwgImh0bWwiLCAiUEhBU0VTIiwgInNob3dMb2FkSm9iUGFuZWwiLCAic3RhdGVNYW5hZ2VyIiwgImV2ZW50IiwgIm0iLCAidSIsICJfcHJvY2VlZEFmdGVySW50YWtlIiwgIl9zaG93SW50YWtlQ29uZmlybUNhcmQiLCAic2VuZE1lc3NhZ2UiLCAibG9nIiwgIlJFVFJZX1BPTElDWV9TVE9SQUdFX0tFWSIsICJ0ZXh0IiwgInNlbmRNZXNzYWdlIiwgInN0YXRlTWFuYWdlciIsICJnZXRTZXNzaW9uSWRGcm9tVVJMIiwgIl9zaG93SW50YWtlQ29uZmlybUNhcmQiLCAiX3Byb2NlZWRBZnRlckludGFrZSIsICJfZSIsICJhc2tQb3N0QW5hbHlzaXNRdWVzdGlvbnMiLCAiaGFuZGxlUXVlc3Rpb25SZXNwb25zZSIsICJwb3B1bGF0ZVF1ZXN0aW9uc1RhYiIsICJsb2ciLCAiYXNrUG9zdEFuYWx5c2lzUXVlc3Rpb25zIiwgInBvcHVsYXRlUXVlc3Rpb25zVGFiIiwgInN0YXRlTWFuYWdlciIsICJxIiwgIl8iLCAiaGFuZGxlUXVlc3Rpb25SZXNwb25zZSIsICJidWlsZEV4cGVyaWVuY2VSZXZpZXdUYWJsZSIsICJoYW5kbGVFeHBlcmllbmNlUmVzcG9uc2UiLCAibG9nIiwgIl9maW5kRXhwZXJpZW5jZVJlY29tbWVuZGF0aW9uUmVjb3JkIiwgIl8iLCAiYnVpbGRFeHBlcmllbmNlUmV2aWV3VGFibGUiLCAiYiIsICJoYW5kbGVFeHBlcmllbmNlUmVzcG9uc2UiLCAic3RhdGVNYW5hZ2VyIiwgImJ1aWxkU2tpbGxzUmV2aWV3VGFibGUiLCAiaGFuZGxlU2tpbGxzUmVzcG9uc2UiLCAibG9nIiwgIm0iLCAieCIsICJuYW1lIiwgInNraWxsIiwgIl8iLCAiYnVpbGRTa2lsbHNSZXZpZXdUYWJsZSIsICJzdGF0ZU1hbmFnZXIiLCAiYiIsICJlIiwgInNraWxsTmFtZSIsICJoYW5kbGVTa2lsbHNSZXNwb25zZSIsICJfYWNoVmVyYldhcm5pbmciLCAiYnVpbGRBY2hpZXZlbWVudHNFZGl0b3IiLCAiYnVpbGRBY2hpZXZlbWVudHNSZXZpZXdUYWJsZSIsICJlbnRyaWVzIiwgIl8iLCAiYnVpbGRBY2hpZXZlbWVudHNSZXZpZXdUYWJsZSIsICJiIiwgImh0bWwiLCAiayIsICJ2IiwgInN0YXRlTWFuYWdlciIsICJidWlsZEFjaGlldmVtZW50c0VkaXRvciIsICJfYWNoVmVyYldhcm5pbmciLCAidGV4dCIsICJfZSIsICJidWlsZFRhZ2xpbmVSZXZpZXdTZWN0aW9uIiwgImJ1aWxkVGFnbGluZVJldmlld1NlY3Rpb24iLCAiX2UiLCAic3RhdGVNYW5hZ2VyIiwgImJ1aWxkU3VtbWFyeUZvY3VzU2VjdGlvbiIsICJidWlsZFN1bW1hcnlGb2N1c1NlY3Rpb24iLCAiayIsICJ0ZXh0IiwgInciLCAic3RhdGVNYW5hZ2VyIiwgImJ1aWxkUHVibGljYXRpb25zUmV2aWV3VGFibGUiLCAibG9nIiwgImJ1aWxkUHVibGljYXRpb25zUmV2aWV3VGFibGUiLCAicSIsICJodG1sIiwgImJ0biIsICJzdGF0ZU1hbmFnZXIiLCAiYXBwbHlSZXdyaXRlQWN0aW9uIiwgImZldGNoQW5kUmV2aWV3UmV3cml0ZXMiLCAicmVuZGVyUmV3cml0ZVBhbmVsIiwgInJld3JpdGVEZWNpc2lvbnMiLCAic3VibWl0UmV3cml0ZURlY2lzaW9ucyIsICJyZXdyaXRlRGVjaXNpb25zIiwgIl8iLCAiZmV0Y2hBbmRSZXZpZXdSZXdyaXRlcyIsICJyZW5kZXJSZXdyaXRlUGFuZWwiLCAidyIsICJhcHBseVJld3JpdGVBY3Rpb24iLCAiYiIsICJtIiwgImkiLCAiaiIsICJrIiwgInN1Ym1pdFJld3JpdGVEZWNpc2lvbnMiLCAic3RhdGVNYW5hZ2VyIiwgInBvcHVsYXRlU3BlbGxDaGVja1RhYiIsICJzdWJtaXRTcGVsbENoZWNrRGVjaXNpb25zIiwgImxvZyIsICJwb3B1bGF0ZVNwZWxsQ2hlY2tUYWIiLCAiY29udGVudCIsICJzdGF0ZU1hbmFnZXIiLCAiaHRtbCIsICJiIiwgImF0c1Njb3JlIiwgImsiLCAic3VibWl0U3BlbGxDaGVja0RlY2lzaW9ucyIsICJwb3B1bGF0ZURvd25sb2FkVGFiIiwgImxvZyIsICJodG1sIiwgIl8iLCAicG9wdWxhdGVEb3dubG9hZFRhYiIsICJzdGF0ZU1hbmFnZXIiLCAidyIsICJtIiwgImZpbmFsR2VuZXJhdGlvbkNvbXBsZXRlIiwgImxvZyIsICJodG1sIiwgImZpbmFsR2VuZXJhdGlvbkNvbXBsZXRlIiwgInN0YXRlTWFuYWdlciIsICJyZW5kZXJNYXN0ZXJEYXRhQWlVcGRhdGVEaXNhYmxlZE5vdGUiLCAicmVuZGVyTWFzdGVyRGF0YUFpVXBkYXRlUGFuZWwiLCAibG9nIiwgInJlbmRlck1hc3RlckRhdGFBaVVwZGF0ZVBhbmVsIiwgInJlbmRlck1hc3RlckRhdGFBaVVwZGF0ZURpc2FibGVkTm90ZSIsICJtIiwgImV2ZW50IiwgIm9wZW5NYXN0ZXJDdk1vZGFsIiwgInBvcHVsYXRlTWFzdGVyVGFiIiwgInJlZG9NYXN0ZXJEYXRhQ2hhbmdlIiwgInVuZG9NYXN0ZXJEYXRhQ2hhbmdlIiwgIngiLCAidiIsICJ0ZXh0IiwgImsiLCAiXyIsICJzZXNzaW9uSWQiLCAiZXZlbnQiLCAiX3JlbmRlckNvbnNpc3RlbmN5UmVwb3J0IiwgInBvcHVsYXRlQ292ZXJMZXR0ZXJUYWIiLCAicG9wdWxhdGVDb3ZlckxldHRlclRhYiIsICJfIiwgInRleHQiLCAiX3JlbmRlckNvbnNpc3RlbmN5UmVwb3J0IiwgInN0YXRlTWFuYWdlciIsICJrIiwgInJlIiwgInBvcHVsYXRlU2NyZWVuaW5nVGFiIiwgInEiLCAiYiIsICJfIiwgInBvcHVsYXRlRmluYWxpc2VUYWIiLCAibG9nIiwgIm0iLCAicG9wdWxhdGVGaW5hbGlzZVRhYiIsICJodG1sIiwgIl9yZW5kZXJSZXdyaXRlQXVkaXRMb2ciLCAiXyIsICJhdHNTY29yZSIsICJwb3B1bGF0ZUludGVydmlld1ByZXBUYWIiLCAibG9nIiwgInBvcHVsYXRlSW50ZXJ2aWV3UHJlcFRhYiIsICJwb3B1bGF0ZVRoYW5rWW91VGFiIiwgImxvZyIsICJwb3B1bGF0ZVRoYW5rWW91VGFiIiwgInBvcHVsYXRlSGFydmVzdFRhYiIsICJsb2ciLCAiYiIsICJrIiwgInYiLCAicG9wdWxhdGVIYXJ2ZXN0VGFiIiwgImluaXRFYXJseVByZXZpZXdQYW5lbCIsICJ0b2dnbGVFYXJseVByZXZpZXdQYW5lbCIsICJTdG9yYWdlS2V5cyIsICJfZSIsICJhcGlDYWxsIiwgInN0YXRlTWFuYWdlciIsICJ0b2dnbGVFYXJseVByZXZpZXdQYW5lbCIsICJpbml0RWFybHlQcmV2aWV3UGFuZWwiLCAiX3VwZGF0ZVNlc3Npb25Td2l0Y2hlckhlYWRlciIsICJvcGVuU2Vzc2lvbnNNb2RhbCIsICJzaG93T3duZXJzaGlwQ29uZmxpY3REaWFsb2ciLCAiXyIsICJfY3JlYXRlZElzb0Zyb21TZXNzaW9uUGF0aCIsICJiIiwgInYiLCAiZXZlbnQiLCAiZm10RGF0ZSIsICJodG1sIiwgImluaXRLZXlib2FyZFNob3J0Y3V0cyIsICJyZXNldENhcmRGb2N1cyIsICJzZXR1cEV2ZW50TGlzdGVuZXJzIiwgInRleHQiXQp9Cg== diff --git a/web/master-cv.js b/web/master-cv.js index 7b3ce3c2..c402eefd 100644 --- a/web/master-cv.js +++ b/web/master-cv.js @@ -2877,7 +2877,7 @@ function _showMasterCvImportPreviewModal(sections) { overlay.style.cssText = 'position:fixed;inset:0;background:rgba(0,0,0,0.5);z-index:10000;display:flex;align-items:center;justify-content:center;'; const changedSections = sections.filter((s) => s.changed); const rows = sections.map((s) => ` - + ${escapeHtml(s.section)} ${s.current_count} ${s.new_count} diff --git a/web/styles.css b/web/styles.css index b54e055e..095a43bc 100644 --- a/web/styles.css +++ b/web/styles.css @@ -61,6 +61,19 @@ --cv-error-text: #991b1b; /* red-800 — error text */ --cv-error-light: #ef4444; /* red-400 — light error accent */ --cv-black: #000; /* black — deep overlay / shadow */ + --cv-error-dark: #b91c1c; /* red-700 — dark error text/icon */ + --cv-success-text-dark: #14532d; /* green-900 — darkest success text */ + --cv-text-darkest: #0f172a; /* slate-900 — darkest headings/text */ + --cv-gray-100: #f3f4f6; /* gray-100 — subtle hover background */ + --cv-gray-200: #e5e7eb; /* gray-200 — light border/hover */ + --cv-warn-dark: #d97706; /* amber-600 — dark warning text/accent */ + --cv-sky-bg-md: #e0f2fe; /* sky-100 — medium sky background */ + --cv-sky-border: #bae6fd; /* sky-200 — sky border */ + --cv-emerald-bg: #ecfdf5; /* emerald-50 — emerald hover/badge background */ + --cv-orange-text: #7c2d12; /* orange-900 — dirty-phases callout text */ + --cv-warn-text-dark: #78350f; /* amber-900 — darkest warning text */ + --cv-green-700: #15803d; /* green-700 — medium-dark success text */ + --cv-bg-input: #fafafa; /* neutral-50 — textarea/input background */ } /* ===== RESET & BASE ===== */ @@ -151,7 +164,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sa .ats-score-summary-detail { font-size: 11px; color: var(--cv-text-secondary); max-width: 320px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } /* Colour thresholds applied via JS */ .ats-score-badge.score-high .ats-score-value { color: var(--cv-success-md); } -.ats-score-badge.score-medium .ats-score-value { color: #d97706; } +.ats-score-badge.score-medium .ats-score-value { color: var(--cv-warn-dark); } .ats-score-badge.score-low .ats-score-value { color: var(--cv-error); } .layout-freshness-chip { display: inline-flex; @@ -167,9 +180,9 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sa transition: transform 0.15s ease, box-shadow 0.15s ease, background 0.15s ease; } .layout-freshness-chip:hover { transform: translateY(-1px); box-shadow: 0 4px 10px rgba(15, 23, 42, 0.08); } -.layout-freshness-chip.fresh { background: #ecfdf5; border-color: var(--cv-success-border); color: var(--cv-success-text); } +.layout-freshness-chip.fresh { background: var(--cv-emerald-bg); border-color: var(--cv-success-border); color: var(--cv-success-text); } .layout-freshness-chip.stale { background: var(--cv-warn-bg); border-color: var(--cv-warn-light); color: var(--cv-warn-text); animation: stale-chip-pulse 1.2s ease-out 1; } -.layout-freshness-chip.critical { background: var(--cv-error-bg); border-color: var(--cv-error-border); color: #b91c1c; animation: stale-chip-pulse 1.2s ease-out 1; } +.layout-freshness-chip.critical { background: var(--cv-error-bg); border-color: var(--cv-error-border); color: var(--cv-error-dark); animation: stale-chip-pulse 1.2s ease-out 1; } .layout-freshness-icon { font-size: 13px; line-height: 1; } @keyframes stale-chip-pulse { 0% { box-shadow: 0 0 0 0 rgba(245, 158, 11, 0.25); } @@ -206,7 +219,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sa .step.completed:hover { filter: brightness(0.93); } .step.upcoming { background: var(--cv-bg-light); color: var(--cv-slate-300); } .step.stale { background: var(--cv-warn-bg); color: var(--cv-warn-text); cursor: pointer; } -.step.stale-critical { background: var(--cv-error-bg); color: #b91c1c; cursor: pointer; } +.step.stale-critical { background: var(--cv-error-bg); color: var(--cv-error-dark); cursor: pointer; } .step.forward-skip { background: var(--cv-info-bg); color: var(--cv-info-dark); cursor: pointer; border: 1px dashed var(--cv-info-light); } .step.forward-skip:hover { filter: brightness(0.93); } @@ -250,7 +263,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sa .session-switcher-row:last-child { border-bottom: none; } .session-switcher-row-main { min-width: 0; flex: 1; } .session-switcher-row-title { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 4px; } -.session-switcher-row-title strong { color: #0f172a; font-size: 14px; } +.session-switcher-row-title strong { color: var(--cv-text-darkest); font-size: 14px; } .session-switcher-row-meta { font-size: 12px; color: var(--cv-text-secondary); line-height: 1.5; } .session-switcher-actions { display: flex; align-items: center; gap: 8px; flex-shrink: 0; } .session-switcher-link, @@ -269,7 +282,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sa .session-status-saved { color: var(--cv-text-muted); background: var(--cv-border); } .session-switcher-landing-shell { max-width: 1040px; margin: 32px auto; padding: 0 12px; } .session-switcher-landing-header { display: flex; align-items: center; justify-content: space-between; gap: 16px; margin-bottom: 20px; flex-wrap: wrap; } -.session-switcher-landing-copy h2 { margin: 0 0 8px; color: #0f172a; } +.session-switcher-landing-copy h2 { margin: 0 0 8px; color: var(--cv-text-darkest); } .session-switcher-landing-copy p { margin: 0; color: var(--cv-text-secondary); } .session-switcher-landing-actions { display: flex; gap: 10px; flex-wrap: wrap; } @@ -368,7 +381,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sa } .sm-recent-item:hover { background: var(--cv-info-bg); border-color: var(--cv-info-border); color: var(--cv-accent-hover); } .sm-recent-current { background: var(--cv-success-bg); border-color: var(--cv-success-bg-lt); color: var(--cv-success-text); } -.sm-recent-current:hover { background: var(--cv-success-bg-md); border-color: var(--cv-success-border); color: #14532d; } +.sm-recent-current:hover { background: var(--cv-success-bg-md); border-color: var(--cv-success-border); color: var(--cv-success-text-dark); } .sm-recent-dot { width: 7px; height: 7px; border-radius: 50%; display: inline-block; flex-shrink: 0; } .sm-recent-dot-current { background: #22c55e; } .sm-recent-dot-other { background: var(--cv-slate-400); } @@ -432,7 +445,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sa flex: 1; overflow-y: auto; padding: 16px; - background: #fafafa; + background: var(--cv-bg-input); min-height: 0; /* Allow flex item to shrink below content size */ } .message { margin-bottom: 16px; } @@ -465,7 +478,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sa /* ===== LLM RAW INTERACTION LOG ===== */ .message.llm-raw .content { - background: #0f172a; + background: var(--cv-text-darkest); color: var(--cv-slate-400); padding: 10px 14px; border-radius: 8px; @@ -538,7 +551,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sa .kw-badge { position: relative; background: var(--cv-info-bg-md); color: var(--cv-info-dark); border: 1px solid var(--cv-info-border); border-radius: 16px; padding: 4px 12px 4px 24px; font-size: 13px; font-weight: 500; } .kw-badge .kw-rank { position: absolute; left: 7px; top: 3px; font-size: 9px; font-weight: 700; color: var(--cv-text-secondary); line-height: 1.4; } .mismatch-callout { background: var(--cv-warn-bg); border: 1px solid var(--cv-warn-light); border-left: 4px solid var(--cv-warn); border-radius: 8px; padding: 12px 16px; margin-bottom: 16px; font-size: 14px; color: var(--cv-warn-text); } -.mismatch-callout strong { color: #78350f; } +.mismatch-callout strong { color: var(--cv-warn-text-dark); } /* ===== QUESTIONS PANEL ===== */ .questions-panel { background: var(--cv-white); border: 1px solid var(--cv-border); border-radius: 10px; padding: 20px; margin-top: 20px; } @@ -711,7 +724,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sa .tab.active { color: var(--cv-accent); border-bottom-color: var(--cv-accent); background: var(--cv-white); } .tab--visited:not(.active)::after { content: ''; display: inline-block; width: 6px; height: 6px; border-radius: 50%; background: var(--cv-success); margin-left: 5px; vertical-align: middle; opacity: 0.8; } .tab-stale { color: var(--cv-warn-text); } -.tab-stale-critical { color: #b91c1c; } +.tab-stale-critical { color: var(--cv-error-dark); } .tab-stale-badge { display: inline-flex; align-items: center; @@ -792,12 +805,12 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sa } .confidence-high { background: var(--cv-success-bg-md); - color: #15803d; + color: var(--cv-green-700); border: 1px solid var(--cv-success-bg-lt); } .confidence-medium { background: var(--cv-warn-bg-md); - color: #d97706; + color: var(--cv-warn-dark); border: 1px solid var(--cv-warn-border); } .confidence-low { @@ -807,7 +820,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sa } .confidence-very-high { background: var(--cv-success-bg-lt); - color: #14532d; + color: var(--cv-success-text-dark); border: 1px solid var(--cv-success-border); font-weight: 600; } @@ -852,23 +865,23 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sa } .experience-card { - background: #fafafa; - border: 1px solid #e5e7eb; + background: var(--cv-bg-input); + border: 1px solid var(--cv-gray-200); border-radius: 6px; margin-bottom: 16px; overflow: hidden; } .experience-card-header { - background: #f3f4f6; + background: var(--cv-gray-100); padding: 12px 16px; font-weight: 600; cursor: pointer; display: flex; justify-content: space-between; align-items: center; - border-bottom: 1px solid #e5e7eb; + border-bottom: 1px solid var(--cv-gray-200); } -.experience-card-header:hover { background: #e5e7eb; } +.experience-card-header:hover { background: var(--cv-gray-200); } .experience-card-content { padding: 16px; } .experience-card.collapsed .experience-card-content { display: none; } @@ -1159,7 +1172,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sa box-shadow: 0 10px 24px rgba(22, 163, 74, 0.24); } .model-wizard-success h3 { - color: #14532d; + color: var(--cv-success-text-dark); font-size: 24px; } .model-wizard-success p { @@ -1181,7 +1194,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sa box-shadow: 0 6px 16px rgba(22, 163, 74, 0.24); } .model-wizard-primary-close:hover { - background: #15803d; + background: var(--cv-green-700); } .wizard-busy-overlay { position: absolute; @@ -1211,7 +1224,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sa border-width: 3px; } .wizard-busy-message { - color: #0f172a; + color: var(--cv-text-darkest); font-size: 14px; font-weight: 600; } @@ -1247,7 +1260,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sa .review-table th { background: var(--cv-bg-light) !important; font-weight: 600; color: var(--cv-text-muted); text-align: left; padding: 8px 12px; } .review-table td { vertical-align: middle; padding: 8px 12px; } .review-table tbody tr:nth-child(even) { background: #f9fafb; } -.review-table tbody tr:hover { background: #f3f4f6; } +.review-table tbody tr:hover { background: var(--cv-gray-100); } /* Column width adjustments */ .review-table th:nth-child(2) { width: 100px; } @@ -1337,13 +1350,13 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sa .rewrite-card.accepted { border-color: var(--cv-success); background: var(--cv-success-bg); } .rewrite-card.rejected { border-color: #f87171; background: var(--cv-error-bg); opacity: 0.7; } .rewrite-card.kb-focused, .spell-card.kb-focused { outline: 2px solid var(--cv-accent); outline-offset: 2px; box-shadow: 0 0 0 4px rgba(59,130,246,0.15); } -kbd { display: inline-block; padding: 1px 5px; border: 1px solid var(--cv-gray-300); border-radius: 4px; background: #f3f4f6; color: var(--cv-gray-700); font-family: inherit; font-size: 0.85em; line-height: 1.4; } +kbd { display: inline-block; padding: 1px 5px; border: 1px solid var(--cv-gray-300); border-radius: 4px; background: var(--cv-gray-100); color: var(--cv-gray-700); font-family: inherit; font-size: 0.85em; line-height: 1.4; } .rewrite-card-header { padding: 12px 16px; display: flex; gap: 10px; align-items: flex-start; flex-wrap: wrap; } .rewrite-card-type { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.05em; color: var(--cv-text-secondary); background: var(--cv-border); padding: 2px 8px; border-radius: 12px; } .rewrite-card-title { font-weight: 600; font-size: 0.95em; color: var(--cv-text-primary); } .weak-badge { background: var(--cv-warn-bg-md); color: var(--cv-warn-text); font-size: 11px; font-weight: 700; padding: 2px 8px; border-radius: 12px; } .rw-change-badge { font-size: 11px; font-weight: 700; padding: 2px 8px; border-radius: 12px; } -.rw-change-new { background: var(--cv-success-bg-md); color: #15803d; } +.rw-change-new { background: var(--cv-success-bg-md); color: var(--cv-green-700); } .rw-change-updated { background: var(--cv-info-bg-md); color: var(--cv-accent-hover); } .rewrite-card-body { padding: 0 16px 14px; } .rewrite-inline-diff { background: var(--cv-bg-light); border: 1px solid var(--cv-border); border-radius: 6px; padding: 10px 12px; font-size: 0.9em; line-height: 1.6; margin-bottom: 10px; word-wrap: break-word; } @@ -1422,7 +1435,7 @@ details.rewrite-rationale summary { cursor: pointer; color: var(--cv-gray-700); .btn-secondary { background: var(--cv-bg-light); color: var(--cv-text-muted); border: 1px solid var(--cv-slate-300); padding: 10px 16px; border-radius: 6px; cursor: pointer; font-size: 14px; font-weight: 600; transition: all 0.2s; } .btn-secondary:hover:not(:disabled) { background: var(--cv-bg-subtle); } .btn-warning { background: var(--cv-warn); color: var(--cv-white); border: 1px solid var(--cv-warn); padding: 10px 16px; border-radius: 6px; cursor: pointer; font-size: 14px; font-weight: 600; transition: background 0.2s; } -.btn-warning:hover:not(:disabled) { background: #d97706; } +.btn-warning:hover:not(:disabled) { background: var(--cv-warn-dark); } .btn-primary:disabled, .btn-secondary:disabled, .btn-warning:disabled { opacity: 0.6; cursor: not-allowed; } .btn-primary:focus-visible, .btn-secondary:focus-visible, .btn-warning:focus-visible { outline: 2px solid var(--cv-accent); outline-offset: 2px; } .url-help p { margin: 4px 0; } @@ -1440,7 +1453,7 @@ details.rewrite-rationale summary { cursor: pointer; color: var(--cv-gray-700); .bulk-btn svg.icon-glyph { width: 14px; height: 14px; } .bulk-btn:hover { background: var(--cv-bg-subtle); border-color: var(--cv-slate-400); } .bulk-btn.bulk-emphasize { border-color: var(--cv-success); color: var(--cv-success-dark); } -.bulk-btn.bulk-emphasize:hover { background: #ecfdf5; } +.bulk-btn.bulk-emphasize:hover { background: var(--cv-emerald-bg); } .bulk-btn.bulk-include { border-color: var(--cv-accent); color: var(--cv-info); } .bulk-btn.bulk-include:hover { background: var(--cv-info-bg); } .bulk-btn.bulk-exclude { border-color: var(--cv-error-light); color: var(--cv-error); } @@ -1509,16 +1522,16 @@ details.rewrite-rationale summary { cursor: pointer; color: var(--cv-gray-700); .preview-output-title-row { display: flex; align-items: center; gap: 8px; margin-bottom: 4px; } .preview-output-detail { font-size: 12px; color: var(--cv-text-secondary); line-height: 1.4; word-break: break-word; } .preview-output-badge { display: inline-flex; align-items: center; border-radius: 999px; padding: 4px 10px; font-size: 11px; font-weight: 700; } -.preview-output-badge.is-ready { background: #ecfdf5; color: var(--cv-success-text); } -.preview-output-badge.is-failed { background: var(--cv-error-bg); color: #b91c1c; } +.preview-output-badge.is-ready { background: var(--cv-emerald-bg); color: var(--cv-success-text); } +.preview-output-badge.is-failed { background: var(--cv-error-bg); color: var(--cv-error-dark); } .preview-output-badge-link { text-decoration: none; } -.preview-output-badge-link:hover { background: var(--cv-success-bg-md); color: #14532d; } +.preview-output-badge-link:hover { background: var(--cv-success-bg-md); color: var(--cv-success-text-dark); } .preview-output-badge-link:focus-visible { outline: 2px solid #0f766e; outline-offset: 2px; } .preview-output-empty { font-size: 12px; color: var(--cv-text-secondary); line-height: 1.5; } -.layout-scope-label { font-size: 12px; color: var(--cv-text-secondary); background: var(--cv-sky-bg); border: 1px solid #bae6fd; border-radius: 6px; padding: 6px 10px; margin: 0; } -.layout-stale-callout { background: var(--cv-warn-bg); border-left: 4px solid var(--cv-warn); border-radius: 8px; padding: 14px 16px; color: #78350f; } +.layout-scope-label { font-size: 12px; color: var(--cv-text-secondary); background: var(--cv-sky-bg); border: 1px solid var(--cv-sky-border); border-radius: 6px; padding: 6px 10px; margin: 0; } +.layout-stale-callout { background: var(--cv-warn-bg); border-left: 4px solid var(--cv-warn); border-radius: 8px; padding: 14px 16px; color: var(--cv-warn-text-dark); } .layout-stale-callout h4 { margin: 0 0 6px; font-size: 14px; color: var(--cv-warn-text); } -.layout-stale-callout p { margin: 0; font-size: 13px; line-height: 1.5; color: #78350f; } +.layout-stale-callout p { margin: 0; font-size: 13px; line-height: 1.5; color: var(--cv-warn-text-dark); } .layout-stale-callout-actions { display: flex; flex-direction: column; gap: 8px; margin-top: 12px; } /* ── Content proposal / dirty-phase styles ────────────────────────────────── */ @@ -1529,7 +1542,7 @@ details.rewrite-rationale summary { cursor: pointer; color: var(--cv-gray-700); .content-proposals-heading { font-size: 12px; font-weight: 600; color: var(--cv-gray-700); margin: 0 0 6px; } .content-proposal-card { background: var(--cv-white); border: 1px solid var(--cv-border); border-radius: 6px; padding: 10px 12px; font-size: 13px; display: flex; flex-direction: column; gap: 6px; } .proposal-meta { display: flex; gap: 8px; align-items: center; } -.proposal-type-badge { font-size: 10px; font-weight: 700; text-transform: uppercase; background: #e0f2fe; color: var(--cv-info-text); border-radius: 4px; padding: 1px 6px; } +.proposal-type-badge { font-size: 10px; font-weight: 700; text-transform: uppercase; background: var(--cv-sky-bg-md); color: var(--cv-info-text); border-radius: 4px; padding: 1px 6px; } .proposal-location { font-size: 11px; color: var(--cv-gray-500); font-family: monospace; } .proposal-diff { display: flex; flex-direction: column; gap: 4px; } .proposal-original { color: var(--cv-error-text); font-size: 12px; line-height: 1.5; } @@ -1537,10 +1550,10 @@ details.rewrite-rationale summary { cursor: pointer; color: var(--cv-gray-700); .proposal-reason { font-size: 11px; color: var(--cv-gray-500); font-style: italic; } .proposal-actions { display: flex; align-items: center; gap: 8px; padding-top: 4px; border-top: 1px solid var(--cv-bg-subtle); } .proposal-approve-label { display: flex; align-items: center; gap: 6px; cursor: pointer; font-size: 12px; color: var(--cv-gray-700); } -.dirty-phases-callout { background: #fff7ed; border-left: 4px solid #f97316; border-radius: 8px; padding: 14px 16px; color: #7c2d12; margin-top: 12px; } +.dirty-phases-callout { background: #fff7ed; border-left: 4px solid #f97316; border-radius: 8px; padding: 14px 16px; color: var(--cv-orange-text); margin-top: 12px; } .dirty-phases-callout h4 { margin: 0 0 6px; font-size: 14px; color: #9a3412; } -.dirty-phases-callout p { margin: 0 0 10px; font-size: 13px; line-height: 1.5; color: #7c2d12; } -.step-stale-badge { background: #fed7aa; color: #7c2d12; border-radius: 4px; padding: 1px 5px; font-size: 10px; font-weight: 600; vertical-align: middle; } +.dirty-phases-callout p { margin: 0 0 10px; font-size: 13px; line-height: 1.5; color: var(--cv-orange-text); } +.step-stale-badge { background: #fed7aa; color: var(--cv-orange-text); border-radius: 4px; padding: 1px 5px; font-size: 10px; font-weight: 600; vertical-align: middle; } .step-fwd-badge { background: var(--cv-info-bg-md); color: var(--cv-info-dark); border-radius: 4px; padding: 1px 4px; font-size: 10px; font-weight: 600; vertical-align: middle; } .layout-preview-status { margin-bottom: 8px; } .layout-preview-status-card { padding: 10px 12px; border-radius: 8px; border: 1px solid var(--cv-border); background: var(--cv-bg-light); } @@ -1549,7 +1562,7 @@ details.rewrite-rationale summary { cursor: pointer; color: var(--cv-gray-700); .layout-preview-status-card.critical { background: var(--cv-error-bg); border-color: var(--cv-error-bg-md); } .layout-preview-status-header { display: flex; align-items: center; gap: 8px; margin-bottom: 4px; } .layout-preview-status-stage { font-size: 12px; font-weight: 600; color: var(--cv-gray-700); } -.layout-page-count-badge { font-size: 11px; font-weight: 600; padding: 2px 7px; border-radius: 10px; background: #e0f2fe; color: var(--cv-info-text); border: 1px solid #bae6fd; margin-left: auto; } +.layout-page-count-badge { font-size: 11px; font-weight: 600; padding: 2px 7px; border-radius: 10px; background: var(--cv-sky-bg-md); color: var(--cv-info-text); border: 1px solid var(--cv-sky-border); margin-left: auto; } .layout-page-count-badge.warn { background: #fff7ed; color: #c2410c; border-color: #fed7aa; } .layout-preview-status-details { font-size: 11px; color: var(--cv-gray-500); line-height: 1.5; } .layout-pane-freshness-chip { font-size: 11px; } @@ -1636,15 +1649,15 @@ details.rewrite-rationale summary { cursor: pointer; color: var(--cv-gray-700); .skill-chips-container { display: flex; flex-wrap: wrap; gap: 8px; } .skill-chip-del { background: none; border: none; color: var(--cv-accent-hover); cursor: pointer; font-size: 14px; padding: 0; margin-left: 2px; line-height: 1; } .skill-chip-del:hover { color: var(--cv-info-dark); } -.action-btn-sm { font-size: 0.8em; padding: 3px 8px; background: var(--cv-sky-bg); border: 1px solid #bae6fd; color: var(--cv-info-text); border-radius: 4px; cursor: pointer; white-space: nowrap; } -.action-btn-sm:hover { background: #e0f2fe; } +.action-btn-sm { font-size: 0.8em; padding: 3px 8px; background: var(--cv-sky-bg); border: 1px solid var(--cv-sky-border); color: var(--cv-info-text); border-radius: 4px; cursor: pointer; white-space: nowrap; } +.action-btn-sm:hover { background: var(--cv-sky-bg-md); } /* ==== Cover Letter Tab ==== */ .cl-prior-section { background: var(--cv-bg-light); border: 1px solid var(--cv-border); border-radius: 10px; padding: 16px 20px; margin-bottom: 24px; } .cl-prior-section h3 { font-size: 1em; font-weight: 600; margin-bottom: 8px; } .cl-prior-card { border: 1px solid var(--cv-border); border-radius: 8px; padding: 10px 14px; margin-bottom: 8px; background: var(--cv-white); transition: border-color 0.15s; } .cl-prior-card:has(input:checked) { border-color: var(--cv-accent); background: var(--cv-info-bg); } -.cl-tone-badge { display: inline-block; font-size: 0.75em; background: #e0f2fe; color: var(--cv-info-text); border-radius: 4px; padding: 1px 6px; margin-left: 6px; } +.cl-tone-badge { display: inline-block; font-size: 0.75em; background: var(--cv-sky-bg-md); color: var(--cv-info-text); border-radius: 4px; padding: 1px 6px; margin-left: 6px; } .cl-form-section { background: var(--cv-white); border: 1px solid var(--cv-border); border-radius: 10px; padding: 20px; } .cl-form-section h3 { font-size: 1em; font-weight: 600; margin-bottom: 14px; } .cl-form-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; } @@ -1652,7 +1665,7 @@ details.rewrite-rationale summary { cursor: pointer; color: var(--cv-gray-700); .cl-form-field label { display: block; font-size: 0.88em; font-weight: 600; color: var(--cv-gray-700); margin-bottom: 5px; } .cl-result-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 10px; flex-wrap: wrap; gap: 10px; } .cl-result-header h3 { font-size: 1em; font-weight: 600; margin: 0; } -.cl-letter-textarea { width: 100%; font-family: 'Georgia', 'Times New Roman', serif; font-size: 0.95em; line-height: 1.7; padding: 16px; border: 1px solid var(--cv-border); border-radius: 8px; resize: vertical; color: var(--cv-text-primary); background: #fafafa; } +.cl-letter-textarea { width: 100%; font-family: 'Georgia', 'Times New Roman', serif; font-size: 0.95em; line-height: 1.7; padding: 16px; border: 1px solid var(--cv-border); border-radius: 8px; resize: vertical; color: var(--cv-text-primary); background: var(--cv-bg-input); } /* ==== Screening Tab ==== */ .sc-intro { color: var(--cv-text-secondary); font-size: 0.92em; margin-bottom: 14px; } @@ -1669,7 +1682,7 @@ details.rewrite-rationale summary { cursor: pointer; color: var(--cv-gray-700); .sc-format-row { display: flex; gap: 8px; flex-wrap: wrap; margin-bottom: 12px; } .sc-format-btn { border: 1px solid var(--cv-border); border-radius: 6px; padding: 5px 12px; font-size: 0.85em; cursor: pointer; background: var(--cv-bg-light); transition: all 0.15s; } .sc-format-btn.active, .sc-format-btn:hover { border-color: var(--cv-accent); background: var(--cv-info-bg); color: var(--cv-info-dark); } -.sc-response-textarea { width: 100%; font-size: 0.92em; line-height: 1.6; padding: 12px 14px; border: 1px solid var(--cv-border); border-radius: 8px; resize: vertical; min-height: 120px; background: #fafafa; color: var(--cv-text-primary); } +.sc-response-textarea { width: 100%; font-size: 0.92em; line-height: 1.6; padding: 12px 14px; border: 1px solid var(--cv-border); border-radius: 8px; resize: vertical; min-height: 120px; background: var(--cv-bg-input); color: var(--cv-text-primary); } .sc-topic-row { display: flex; align-items: center; gap: 8px; margin-top: 8px; font-size: 0.85em; } .sc-topic-row label { color: var(--cv-gray-700); font-weight: 600; white-space: nowrap; } .sc-topic-input { flex: 1; padding: 4px 8px; border: 1px solid var(--cv-gray-300); border-radius: 5px; font-size: 0.9em; } From db789112a054cd89dfd5ddc0bbc1033edd01742e Mon Sep 17 00:00:00 2001 From: "Gregory R. Warnes" Date: Mon, 6 Jul 2026 14:04:55 -0400 Subject: [PATCH 6/9] feat(css): extract modal-header and settings-modal inline styles to classes (GAP-133) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Batch 2 of the inline-style cleanup: 4 modal close buttons duplicated the existing .modal-close-btn class byte-for-byte (missing its :hover state) — now use the class directly. 6 modal-header divs repeated the same flex-split layout inline — extracted to .modal-header-split. 6 modal title

    s repeated style="margin:0;" — folded into the existing .modal-header h2 rule instead. The entire Settings modal's field/card markup (LLM Defaults, Generation Defaults, Retry Policy) repeated 7 distinct inline-style patterns per field — extracted to .settings-card/.settings-card-title/.settings-card-grid/.field-group/ .field-label-sm/.field-hint-xs/.settings-input. Inline style="" count: 228 -> 157. Verified pixel-identical computed styles via Playwright. Co-Authored-By: Claude Sonnet 5 --- web/index.html | 144 ++++++++++++++++++++++++------------------------- web/styles.css | 14 ++++- 2 files changed, 85 insertions(+), 73 deletions(-) diff --git a/web/index.html b/web/index.html index 0b8dd2c7..d8fb937e 100644 --- a/web/index.html +++ b/web/index.html @@ -267,9 +267,9 @@

    Select a tab to view content